From 46208923446651a58c49115d17b4de6da4934c71 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Wed, 16 Feb 2022 23:15:08 +0200 Subject: [PATCH 001/772] Fix bogus log message when starting from a cleanly shut down state. In commit 70e81861fa to split xlog.c, I moved the startup code that updates the state in the control file and prints out the "database system was not properly shut down" message to the log, but I accidentally removed the "if (InRecovery)" check around it. As a result, that message was printed even if the system was cleanly shut down, also during 'initdb'. Discussion: https://www.postgresql.org/message-id/3357075.1645031062@sss.pgh.pa.us --- src/backend/access/transam/xlogrecovery.c | 118 ++++++++++++---------- 1 file changed, 62 insertions(+), 56 deletions(-) diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index d5269ede80..f9f212680b 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -840,69 +840,75 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, } /* - * Update pg_control to show that we are recovering and to show the - * selected checkpoint as the place we are starting from. We also mark - * pg_control with any minimum recovery stop point obtained from a backup - * history file. + * If recovery is needed, update our in-memory copy of pg_control to show + * that we are recovering and to show the selected checkpoint as the place + * we are starting from. We also mark pg_control with any minimum recovery + * stop point obtained from a backup history file. + * + * We don't write the changes to disk yet, though. Only do that after + * initializing various subsystems. */ - if (InArchiveRecovery) - { - ControlFile->state = DB_IN_ARCHIVE_RECOVERY; - } - else + if (InRecovery) { - ereport(LOG, - (errmsg("database system was not properly shut down; " - "automatic recovery in progress"))); - if (recoveryTargetTLI > ControlFile->checkPointCopy.ThisTimeLineID) + if (InArchiveRecovery) + { + ControlFile->state = DB_IN_ARCHIVE_RECOVERY; + } + else + { ereport(LOG, - (errmsg("crash recovery starts in timeline %u " - "and has target timeline %u", - ControlFile->checkPointCopy.ThisTimeLineID, - recoveryTargetTLI))); - ControlFile->state = DB_IN_CRASH_RECOVERY; - } - ControlFile->checkPoint = CheckPointLoc; - ControlFile->checkPointCopy = checkPoint; - if (InArchiveRecovery) - { - /* initialize minRecoveryPoint if not set yet */ - if (ControlFile->minRecoveryPoint < checkPoint.redo) + (errmsg("database system was not properly shut down; " + "automatic recovery in progress"))); + if (recoveryTargetTLI > ControlFile->checkPointCopy.ThisTimeLineID) + ereport(LOG, + (errmsg("crash recovery starts in timeline %u " + "and has target timeline %u", + ControlFile->checkPointCopy.ThisTimeLineID, + recoveryTargetTLI))); + ControlFile->state = DB_IN_CRASH_RECOVERY; + } + ControlFile->checkPoint = CheckPointLoc; + ControlFile->checkPointCopy = checkPoint; + if (InArchiveRecovery) { - ControlFile->minRecoveryPoint = checkPoint.redo; - ControlFile->minRecoveryPointTLI = checkPoint.ThisTimeLineID; + /* initialize minRecoveryPoint if not set yet */ + if (ControlFile->minRecoveryPoint < checkPoint.redo) + { + ControlFile->minRecoveryPoint = checkPoint.redo; + ControlFile->minRecoveryPointTLI = checkPoint.ThisTimeLineID; + } } - } - - /* - * Set backupStartPoint if we're starting recovery from a base backup. - * - * Also set backupEndPoint and use minRecoveryPoint as the backup end - * location if we're starting recovery from a base backup which was taken - * from a standby. In this case, the database system status in pg_control - * must indicate that the database was already in recovery. Usually that - * will be DB_IN_ARCHIVE_RECOVERY but also can be - * DB_SHUTDOWNED_IN_RECOVERY if recovery previously was interrupted before - * reaching this point; e.g. because restore_command or primary_conninfo - * were faulty. - * - * Any other state indicates that the backup somehow became corrupted and - * we can't sensibly continue with recovery. - */ - if (haveBackupLabel) - { - ControlFile->backupStartPoint = checkPoint.redo; - ControlFile->backupEndRequired = backupEndRequired; - if (backupFromStandby) + /* + * Set backupStartPoint if we're starting recovery from a base backup. + * + * Also set backupEndPoint and use minRecoveryPoint as the backup end + * location if we're starting recovery from a base backup which was + * taken from a standby. In this case, the database system status in + * pg_control must indicate that the database was already in recovery. + * Usually that will be DB_IN_ARCHIVE_RECOVERY but also can be + * DB_SHUTDOWNED_IN_RECOVERY if recovery previously was interrupted + * before reaching this point; e.g. because restore_command or + * primary_conninfo were faulty. + * + * Any other state indicates that the backup somehow became corrupted + * and we can't sensibly continue with recovery. + */ + if (haveBackupLabel) { - if (dbstate_at_startup != DB_IN_ARCHIVE_RECOVERY && - dbstate_at_startup != DB_SHUTDOWNED_IN_RECOVERY) - ereport(FATAL, - (errmsg("backup_label contains data inconsistent with control file"), - errhint("This means that the backup is corrupted and you will " - "have to use another backup for recovery."))); - ControlFile->backupEndPoint = ControlFile->minRecoveryPoint; + ControlFile->backupStartPoint = checkPoint.redo; + ControlFile->backupEndRequired = backupEndRequired; + + if (backupFromStandby) + { + if (dbstate_at_startup != DB_IN_ARCHIVE_RECOVERY && + dbstate_at_startup != DB_SHUTDOWNED_IN_RECOVERY) + ereport(FATAL, + (errmsg("backup_label contains data inconsistent with control file"), + errhint("This means that the backup is corrupted and you will " + "have to use another backup for recovery."))); + ControlFile->backupEndPoint = ControlFile->minRecoveryPoint; + } } } From d61a361d1aef1231db61162d99b635b89c73169d Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 17 Feb 2022 09:52:02 +0900 Subject: [PATCH 002/772] Remove all traces of tuplestore_donestoring() in the C code This routine is a no-op since dd04e95 from 2003, with a macro kept around for compatibility purposes. This has led to the same code patterns being copy-pasted around for no effect, sometimes in confusing ways like in pg_logical_slot_get_changes_guts() from logical.c where the code was actually incorrect. This issue has been discussed on two different threads recently, so rather than living with this legacy, remove any uses of this routine in the C code to simplify things. The compatibility macro is kept to avoid breaking any out-of-core modules that depend on it. Reported-by: Tatsuhito Kasahara, Justin Pryzby Author: Tatsuhito Kasahara Discussion: https://postgr.es/m/20211217200419.GQ17618@telsasoft.com Discussion: https://postgr.es/m/CAP0=ZVJeeYfAeRfmzqAF2Lumdiv4S4FewyBnZd4DPTrsSQKJKw@mail.gmail.com --- contrib/dblink/dblink.c | 5 ----- contrib/pageinspect/brinfuncs.c | 2 -- contrib/pg_stat_statements/pg_stat_statements.c | 2 -- contrib/postgres_fdw/connection.c | 7 ------- contrib/tablefunc/tablefunc.c | 2 -- contrib/xml2/xpath.c | 2 -- src/backend/access/transam/xlogfuncs.c | 1 - src/backend/commands/event_trigger.c | 6 ------ src/backend/commands/extension.c | 9 --------- src/backend/commands/prepare.c | 3 --- src/backend/foreign/foreign.c | 3 --- src/backend/replication/logical/launcher.c | 3 --- src/backend/replication/logical/logicalfuncs.c | 2 -- src/backend/replication/logical/origin.c | 2 -- src/backend/replication/slotfuncs.c | 2 -- src/backend/replication/walsender.c | 3 --- src/backend/storage/ipc/shmem.c | 2 -- src/backend/utils/adt/mcxtfuncs.c | 3 --- src/backend/utils/adt/pgstatfuncs.c | 9 --------- src/backend/utils/adt/varlena.c | 2 -- src/backend/utils/misc/guc.c | 2 -- src/backend/utils/misc/pg_config.c | 1 - src/backend/utils/mmgr/portalmem.c | 3 --- src/include/utils/tuplestore.h | 2 +- 24 files changed, 1 insertion(+), 77 deletions(-) diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index 5a37508c4b..efc4c94301 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -1005,8 +1005,6 @@ materializeResult(FunctionCallInfo fcinfo, PGconn *conn, PGresult *res) /* clean up GUC settings, if we changed any */ restoreLocalGucs(nestlevel); - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); } } PG_FINALLY(); @@ -1988,9 +1986,6 @@ dblink_get_notify(PG_FUNCTION_ARGS) PQconsumeInput(conn); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c index f1e64a39ef..50892b5cc2 100644 --- a/contrib/pageinspect/brinfuncs.c +++ b/contrib/pageinspect/brinfuncs.c @@ -325,9 +325,7 @@ brin_page_items(PG_FUNCTION_ARGS) break; } - /* clean up and return the tuplestore */ brin_free_desc(bdesc); - tuplestore_donestoring(tupstore); index_close(indexRel, AccessShareLock); return (Datum) 0; diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 082bfa8f77..9d7d0812ac 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -1803,13 +1803,11 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, tuplestore_putvalues(tupstore, tupdesc, values, nulls); } - /* clean up and return the tuplestore */ LWLockRelease(pgss->lock); if (qbuffer) free(qbuffer); - tuplestore_donestoring(tupstore); } /* Number of output arguments (columns) for pg_stat_statements_info */ diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c index 29fcb6a76e..f753c6e232 100644 --- a/contrib/postgres_fdw/connection.c +++ b/contrib/postgres_fdw/connection.c @@ -1508,12 +1508,7 @@ postgres_fdw_get_connections(PG_FUNCTION_ARGS) /* If cache doesn't exist, we return no records */ if (!ConnectionHash) - { - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - PG_RETURN_VOID(); - } hash_seq_init(&scan, ConnectionHash); while ((entry = (ConnCacheEntry *) hash_seq_search(&scan))) @@ -1578,8 +1573,6 @@ postgres_fdw_get_connections(PG_FUNCTION_ARGS) tuplestore_putvalues(tupstore, tupdesc, values, nulls); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); PG_RETURN_VOID(); } diff --git a/contrib/tablefunc/tablefunc.c b/contrib/tablefunc/tablefunc.c index afbbdfcf86..e308228bde 100644 --- a/contrib/tablefunc/tablefunc.c +++ b/contrib/tablefunc/tablefunc.c @@ -943,8 +943,6 @@ get_crosstab_tuplestore(char *sql, /* internal error */ elog(ERROR, "get_crosstab_tuplestore: SPI_finish() failed"); - tuplestore_donestoring(tupstore); - return tupstore; } diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c index 7fdde8eb51..a2e5fb54e2 100644 --- a/contrib/xml2/xpath.c +++ b/contrib/xml2/xpath.c @@ -783,8 +783,6 @@ xpath_table(PG_FUNCTION_ARGS) pg_xml_done(xmlerrcxt, false); - tuplestore_donestoring(tupstore); - SPI_finish(); rsinfo->setResult = tupstore; diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c index 2f900533cd..12e2bf4135 100644 --- a/src/backend/access/transam/xlogfuncs.c +++ b/src/backend/access/transam/xlogfuncs.c @@ -252,7 +252,6 @@ pg_stop_backup_v2(PG_FUNCTION_ARGS) values[0] = LSNGetDatum(stoppoint); tuplestore_putvalues(tupstore, tupdesc, values, nulls); - tuplestore_donestoring(tupstore); return (Datum) 0; } diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c index 93c2099735..1e8587502e 100644 --- a/src/backend/commands/event_trigger.c +++ b/src/backend/commands/event_trigger.c @@ -1401,9 +1401,6 @@ pg_event_trigger_dropped_objects(PG_FUNCTION_ARGS) tuplestore_putvalues(tupstore, tupdesc, values, nulls); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } @@ -2061,9 +2058,6 @@ pg_event_trigger_ddl_commands(PG_FUNCTION_ARGS) tuplestore_putvalues(tupstore, tupdesc, values, nulls); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - PG_RETURN_VOID(); } diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index a2e77c418a..0e04304cb0 100644 --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c @@ -2021,9 +2021,6 @@ pg_available_extensions(PG_FUNCTION_ARGS) FreeDir(dir); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } @@ -2112,9 +2109,6 @@ pg_available_extension_versions(PG_FUNCTION_ARGS) FreeDir(dir); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } @@ -2417,9 +2411,6 @@ pg_extension_update_paths(PG_FUNCTION_ARGS) } } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index 206d2bbbf9..e0c985ef8b 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -778,9 +778,6 @@ pg_prepared_statement(PG_FUNCTION_ARGS) } } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - rsinfo->returnMode = SFRM_Materialize; rsinfo->setResult = tupstore; rsinfo->setDesc = tupdesc; diff --git a/src/backend/foreign/foreign.c b/src/backend/foreign/foreign.c index 294e22c78c..d910bc2fbe 100644 --- a/src/backend/foreign/foreign.c +++ b/src/backend/foreign/foreign.c @@ -555,9 +555,6 @@ deflist_to_tuplestore(ReturnSetInfo *rsinfo, List *options) tuplestore_putvalues(tupstore, tupdesc, values, nulls); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - MemoryContextSwitchTo(oldcontext); } diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c index 7b473903a6..5a68d6dead 100644 --- a/src/backend/replication/logical/launcher.c +++ b/src/backend/replication/logical/launcher.c @@ -1022,8 +1022,5 @@ pg_stat_get_subscription(PG_FUNCTION_ARGS) LWLockRelease(LogicalRepWorkerLock); - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } diff --git a/src/backend/replication/logical/logicalfuncs.c b/src/backend/replication/logical/logicalfuncs.c index c29e82307f..3609fa7d5b 100644 --- a/src/backend/replication/logical/logicalfuncs.c +++ b/src/backend/replication/logical/logicalfuncs.c @@ -296,8 +296,6 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin CHECK_FOR_INTERRUPTS(); } - tuplestore_donestoring(tupstore); - /* * Logical decoding could have clobbered CurrentResourceOwner during * transaction management, so restore the executor's value. (This is diff --git a/src/backend/replication/logical/origin.c b/src/backend/replication/logical/origin.c index e91fa93d03..76055a8a03 100644 --- a/src/backend/replication/logical/origin.c +++ b/src/backend/replication/logical/origin.c @@ -1568,8 +1568,6 @@ pg_show_replication_origin_status(PG_FUNCTION_ARGS) tuplestore_putvalues(tupstore, tupdesc, values, nulls); } - tuplestore_donestoring(tupstore); - LWLockRelease(ReplicationOriginLock); #undef REPLICATION_ORIGIN_PROGRESS_COLS diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c index 5149ebccb0..886899afd2 100644 --- a/src/backend/replication/slotfuncs.c +++ b/src/backend/replication/slotfuncs.c @@ -436,8 +436,6 @@ pg_get_replication_slots(PG_FUNCTION_ARGS) LWLockRelease(ReplicationSlotControlLock); - tuplestore_donestoring(tupstore); - return (Datum) 0; } diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index a1dadd4c6a..5a718b1fe9 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -3580,9 +3580,6 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS) tuplestore_putvalues(tupstore, tupdesc, values, nulls); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c index c682775db4..1f023a3460 100644 --- a/src/backend/storage/ipc/shmem.c +++ b/src/backend/storage/ipc/shmem.c @@ -605,7 +605,5 @@ pg_get_shmem_allocations(PG_FUNCTION_ARGS) LWLockRelease(ShmemIndexLock); - tuplestore_donestoring(tupstore); - return (Datum) 0; } diff --git a/src/backend/utils/adt/mcxtfuncs.c b/src/backend/utils/adt/mcxtfuncs.c index 28cb9d3ff1..c7c95adf97 100644 --- a/src/backend/utils/adt/mcxtfuncs.c +++ b/src/backend/utils/adt/mcxtfuncs.c @@ -152,9 +152,6 @@ pg_get_backend_memory_contexts(PG_FUNCTION_ARGS) PutMemoryContextsStatsTupleStore(tupstore, tupdesc, TopMemoryContext, NULL, 0); - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 15cb17ace4..30e8dfa7c1 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -555,9 +555,6 @@ pg_stat_get_progress_info(PG_FUNCTION_ARGS) tuplestore_putvalues(tupstore, tupdesc, values, nulls); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } @@ -953,9 +950,6 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) break; } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } @@ -1936,9 +1930,6 @@ pg_stat_get_slru(PG_FUNCTION_ARGS) tuplestore_putvalues(tupstore, tupdesc, values, nulls); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index b73cebfdb5..eda9c1e42c 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -4855,8 +4855,6 @@ text_to_table(PG_FUNCTION_ARGS) (void) split_text(fcinfo, &tstate); - tuplestore_donestoring(tstate.tupstore); - rsi->returnMode = SFRM_Materialize; rsi->setResult = tstate.tupstore; rsi->setDesc = tstate.tupdesc; diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 568ac62c2a..9d0208ec98 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10206,8 +10206,6 @@ show_all_file_settings(PG_FUNCTION_ARGS) tuplestore_putvalues(tupstore, tupdesc, values, nulls); } - tuplestore_donestoring(tupstore); - return (Datum) 0; } diff --git a/src/backend/utils/misc/pg_config.c b/src/backend/utils/misc/pg_config.c index 7a13212f99..d916d7b2c4 100644 --- a/src/backend/utils/misc/pg_config.c +++ b/src/backend/utils/misc/pg_config.c @@ -85,7 +85,6 @@ pg_config(PG_FUNCTION_ARGS) */ ReleaseTupleDesc(tupdesc); - tuplestore_donestoring(tupstore); rsinfo->setResult = tupstore; /* diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c index 236f450a2b..7885344164 100644 --- a/src/backend/utils/mmgr/portalmem.c +++ b/src/backend/utils/mmgr/portalmem.c @@ -1204,9 +1204,6 @@ pg_cursor(PG_FUNCTION_ARGS) tuplestore_putvalues(tupstore, tupdesc, values, nulls); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - rsinfo->returnMode = SFRM_Materialize; rsinfo->setResult = tupstore; rsinfo->setDesc = tupdesc; diff --git a/src/include/utils/tuplestore.h b/src/include/utils/tuplestore.h index 399a8493cf..01716fb44e 100644 --- a/src/include/utils/tuplestore.h +++ b/src/include/utils/tuplestore.h @@ -56,7 +56,7 @@ extern void tuplestore_puttuple(Tuplestorestate *state, HeapTuple tuple); extern void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, Datum *values, bool *isnull); -/* tuplestore_donestoring() used to be required, but is no longer used */ +/* Backwards compatibility macro */ #define tuplestore_donestoring(state) ((void) 0) extern int tuplestore_alloc_read_pointer(Tuplestorestate *state, int eflags); From 74388a1ac36d2f0206c5477eeddc636d7947a5a4 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Wed, 16 Feb 2022 17:15:50 -0800 Subject: [PATCH 003/772] Avoid VACUUM reltuples distortion. Add a heuristic that avoids distortion in the pg_class.reltuples estimates used by VACUUM. Without the heuristic, successive manually run VACUUM commands (run against a table that is never modified after initial bulk loading) will scan the same page in each VACUUM operation. Eventually pg_class.reltuples may reach the point where one single heap page is accidentally considered highly representative of the entire table. This is likely to be completely wrong, since the last heap page typically has fewer tuples than average for the table. It's not obvious that this was a problem prior to commit 44fa8488, which made vacuumlazy.c consistently scan the last heap page (even when it is all-visible in the visibility map). It seems possible that there were more subtle variants of the same problem that went unnoticed for quite some time, though. Commit 44fa8488 simplified certain aspects of when and how relation truncation was considered, but it did not introduce the "scan the last page" behavior. Essentially the same behavior was introduced much earlier, in commit e8429082. It was conditioned on whether or not truncation looked promising towards the end of the initial heap pass by VACUUM until recently, which was at least somewhat protective. That doesn't seem like something that we should be relying on, though. Author: Peter Geoghegan Discussion: https://postgr.es/m/CAH2-WzkNKORurux459M64mR63Aw4Jq7MBRVcX=CvALqN3A88WA@mail.gmail.com --- src/backend/commands/vacuum.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index b6767a5ff8..50a4a612e5 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -1238,6 +1238,25 @@ vac_estimate_reltuples(Relation relation, if (scanned_pages == 0) return old_rel_tuples; + /* + * When successive VACUUM commands scan the same few pages again and + * again, without anything from the table really changing, there is a risk + * that our beliefs about tuple density will gradually become distorted. + * It's particularly important to avoid becoming confused in this way due + * to vacuumlazy.c implementation details. For example, the tendency for + * our caller to always scan the last heap page should not ever cause us + * to believe that every page in the table must be just like the last + * page. + * + * We apply a heuristic to avoid these problems: if the relation is + * exactly the same size as it was at the end of the last VACUUM, and only + * a few of its pages (less than a quasi-arbitrary threshold of 2%) were + * scanned by this VACUUM, assume that reltuples has not changed at all. + */ + if (old_rel_pages == total_pages && + scanned_pages < (double) total_pages * 0.02) + return old_rel_tuples; + /* * If old density is unknown, we can't do much except scale up * scanned_tuples to match total_pages. From 8f388f6f554b113f25a53fe3237238d2c58ed1eb Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Wed, 16 Feb 2022 18:41:52 -0800 Subject: [PATCH 004/772] Increase hash_mem_multiplier default to 2.0. Double the default setting for hash_mem_multiplier, from 1.0 to 2.0. This setting makes hash-based executor nodes use twice the usual work_mem limit. The PostgreSQL 15 release notes should have a compatibility note about this change. Author: Peter Geoghegan Discussion: https://postgr.es/m/CAH2-Wzndc_ROk6CY-bC6p9O53q974Y0Ey4WX8jcPbuTZYM4Q3A@mail.gmail.com --- doc/src/sgml/config.sgml | 7 +++---- src/backend/utils/init/globals.c | 2 +- src/backend/utils/misc/guc.c | 2 +- src/backend/utils/misc/postgresql.conf.sample | 2 +- src/test/regress/expected/groupingsets.out | 2 ++ src/test/regress/expected/join_hash.out | 18 ++++++++++++++++++ src/test/regress/expected/memoize.out | 4 +++- src/test/regress/sql/groupingsets.sql | 2 ++ src/test/regress/sql/join_hash.sql | 18 ++++++++++++++++++ src/test/regress/sql/memoize.sql | 4 +++- 10 files changed, 52 insertions(+), 9 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 53b361e7a9..d99bf38e67 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -1849,9 +1849,8 @@ include_dir 'conf.d' operations can use. The final limit is determined by multiplying work_mem by hash_mem_multiplier. The default value is - 1.0, which makes hash-based operations subject to the same - simple work_mem maximum as sort-based - operations. + 2.0, which makes hash-based operations use twice the usual + work_mem base amount. Consider increasing hash_mem_multiplier in @@ -1859,7 +1858,7 @@ include_dir 'conf.d' occurrence, especially when simply increasing work_mem results in memory pressure (memory pressure typically takes the form of intermittent out of - memory errors). A setting of 1.5 or 2.0 may be effective with + memory errors). The default setting of 2.0 is often effective with mixed workloads. Higher settings in the range of 2.0 - 8.0 or more may be effective in environments where work_mem has already been increased to 40MB diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c index c26a1a73df..3419c099b2 100644 --- a/src/backend/utils/init/globals.c +++ b/src/backend/utils/init/globals.c @@ -122,7 +122,7 @@ int IntervalStyle = INTSTYLE_POSTGRES; bool enableFsync = true; bool allowSystemTableMods = false; int work_mem = 4096; -double hash_mem_multiplier = 1.0; +double hash_mem_multiplier = 2.0; int maintenance_work_mem = 65536; int max_parallel_maintenance_workers = 2; diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 9d0208ec98..01f373815e 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -3762,7 +3762,7 @@ static struct config_real ConfigureNamesReal[] = GUC_EXPLAIN }, &hash_mem_multiplier, - 1.0, 1.0, 1000.0, + 2.0, 1.0, 1000.0, NULL, NULL, NULL }, diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 56d0bee6d9..4a094bb38b 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -136,7 +136,7 @@ # Caution: it is not advisable to set max_prepared_transactions nonzero unless # you actively intend to use prepared transactions. #work_mem = 4MB # min 64kB -#hash_mem_multiplier = 1.0 # 1-1000.0 multiplier on hash table work_mem +#hash_mem_multiplier = 2.0 # 1-1000.0 multiplier on hash table work_mem #maintenance_work_mem = 64MB # min 1MB #autovacuum_work_mem = -1 # min 1MB, or -1 to use maintenance_work_mem #logical_decoding_work_mem = 64MB # min 64kB diff --git a/src/test/regress/expected/groupingsets.out b/src/test/regress/expected/groupingsets.out index 4c467c1b15..58a25b691a 100644 --- a/src/test/regress/expected/groupingsets.out +++ b/src/test/regress/expected/groupingsets.out @@ -1574,6 +1574,7 @@ select array(select row(v.a,s1.*) from (select two,four, count(*) from onek grou -- test the knapsack set enable_indexscan = false; +set hash_mem_multiplier = 1.0; set work_mem = '64kB'; explain (costs off) select unique1, @@ -1919,6 +1920,7 @@ select g100, g10, sum(g::numeric), count(*), max(g::text) from gs_data_1 group by cube (g1000, g100,g10); set enable_sort = true; set work_mem to default; +set hash_mem_multiplier to default; -- Compare results (select * from gs_hash_1 except select * from gs_group_1) union all diff --git a/src/test/regress/expected/join_hash.out b/src/test/regress/expected/join_hash.out index 3a91c144a2..3ec07bc1af 100644 --- a/src/test/regress/expected/join_hash.out +++ b/src/test/regress/expected/join_hash.out @@ -86,6 +86,7 @@ alter table wide set (parallel_workers = 2); savepoint settings; set local max_parallel_workers_per_gather = 0; set local work_mem = '4MB'; +set local hash_mem_multiplier = 1.0; explain (costs off) select count(*) from simple r join simple s using (id); QUERY PLAN @@ -119,6 +120,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 2; set local work_mem = '4MB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = off; explain (costs off) select count(*) from simple r join simple s using (id); @@ -156,6 +158,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 2; set local work_mem = '4MB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = on; explain (costs off) select count(*) from simple r join simple s using (id); @@ -196,6 +199,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 0; set local work_mem = '128kB'; +set local hash_mem_multiplier = 1.0; explain (costs off) select count(*) from simple r join simple s using (id); QUERY PLAN @@ -229,6 +233,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 2; set local work_mem = '128kB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = off; explain (costs off) select count(*) from simple r join simple s using (id); @@ -266,6 +271,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 2; set local work_mem = '192kB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = on; explain (costs off) select count(*) from simple r join simple s using (id); @@ -307,6 +313,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 0; set local work_mem = '128kB'; +set local hash_mem_multiplier = 1.0; explain (costs off) select count(*) FROM simple r JOIN bigger_than_it_looks s USING (id); QUERY PLAN @@ -340,6 +347,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 2; set local work_mem = '128kB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = off; explain (costs off) select count(*) from simple r join bigger_than_it_looks s using (id); @@ -377,6 +385,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 1; set local work_mem = '192kB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = on; explain (costs off) select count(*) from simple r join bigger_than_it_looks s using (id); @@ -419,6 +428,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 0; set local work_mem = '128kB'; +set local hash_mem_multiplier = 1.0; explain (costs off) select count(*) from simple r join extremely_skewed s using (id); QUERY PLAN @@ -451,6 +461,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 2; set local work_mem = '128kB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = off; explain (costs off) select count(*) from simple r join extremely_skewed s using (id); @@ -486,6 +497,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 1; set local work_mem = '128kB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = on; explain (costs off) select count(*) from simple r join extremely_skewed s using (id); @@ -523,6 +535,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 2; set local work_mem = '4MB'; +set local hash_mem_multiplier = 1.0; set local parallel_leader_participation = off; select * from hash_join_batches( $$ @@ -551,6 +564,7 @@ set max_parallel_workers_per_gather = 2; set enable_material = off; set enable_mergejoin = off; set work_mem = '64kB'; +set hash_mem_multiplier = 1.0; explain (costs off) select count(*) from join_foo left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss @@ -602,6 +616,7 @@ set max_parallel_workers_per_gather = 2; set enable_material = off; set enable_mergejoin = off; set work_mem = '4MB'; +set hash_mem_multiplier = 1.0; explain (costs off) select count(*) from join_foo left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss @@ -653,6 +668,7 @@ set max_parallel_workers_per_gather = 2; set enable_material = off; set enable_mergejoin = off; set work_mem = '64kB'; +set hash_mem_multiplier = 1.0; explain (costs off) select count(*) from join_foo left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss @@ -704,6 +720,7 @@ set max_parallel_workers_per_gather = 2; set enable_material = off; set enable_mergejoin = off; set work_mem = '4MB'; +set hash_mem_multiplier = 1.0; explain (costs off) select count(*) from join_foo left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss @@ -843,6 +860,7 @@ savepoint settings; set max_parallel_workers_per_gather = 2; set enable_parallel_hash = on; set work_mem = '128kB'; +set hash_mem_multiplier = 1.0; explain (costs off) select length(max(s.t)) from wide left join (select id, coalesce(t, '') || '' as t from wide) s using (id); diff --git a/src/test/regress/expected/memoize.out b/src/test/regress/expected/memoize.out index 4ca0bd1f1e..00438eb1ea 100644 --- a/src/test/regress/expected/memoize.out +++ b/src/test/regress/expected/memoize.out @@ -90,8 +90,9 @@ WHERE t1.unique1 < 1000; 1000 | 9.5000000000000000 (1 row) --- Reduce work_mem so that we see some cache evictions +-- Reduce work_mem and hash_mem_multiplier so that we see some cache evictions SET work_mem TO '64kB'; +SET hash_mem_multiplier TO 1.0; SET enable_mergejoin TO off; -- Ensure we get some evictions. We're unable to validate the hits and misses -- here as the number of entries that fit in the cache at once will vary @@ -238,6 +239,7 @@ WHERE unique1 < 3 RESET enable_seqscan; RESET enable_mergejoin; RESET work_mem; +RESET hash_mem_multiplier; RESET enable_bitmapscan; RESET enable_hashjoin; -- Test parallel plans with Memoize diff --git a/src/test/regress/sql/groupingsets.sql b/src/test/regress/sql/groupingsets.sql index 3944944704..473d21f6b9 100644 --- a/src/test/regress/sql/groupingsets.sql +++ b/src/test/regress/sql/groupingsets.sql @@ -424,6 +424,7 @@ select array(select row(v.a,s1.*) from (select two,four, count(*) from onek grou -- test the knapsack set enable_indexscan = false; +set hash_mem_multiplier = 1.0; set work_mem = '64kB'; explain (costs off) select unique1, @@ -519,6 +520,7 @@ from gs_data_1 group by cube (g1000, g100,g10); set enable_sort = true; set work_mem to default; +set hash_mem_multiplier to default; -- Compare results diff --git a/src/test/regress/sql/join_hash.sql b/src/test/regress/sql/join_hash.sql index 68c1a8c7b6..77dbc182d5 100644 --- a/src/test/regress/sql/join_hash.sql +++ b/src/test/regress/sql/join_hash.sql @@ -95,6 +95,7 @@ alter table wide set (parallel_workers = 2); savepoint settings; set local max_parallel_workers_per_gather = 0; set local work_mem = '4MB'; +set local hash_mem_multiplier = 1.0; explain (costs off) select count(*) from simple r join simple s using (id); select count(*) from simple r join simple s using (id); @@ -109,6 +110,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 2; set local work_mem = '4MB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = off; explain (costs off) select count(*) from simple r join simple s using (id); @@ -124,6 +126,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 2; set local work_mem = '4MB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = on; explain (costs off) select count(*) from simple r join simple s using (id); @@ -143,6 +146,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 0; set local work_mem = '128kB'; +set local hash_mem_multiplier = 1.0; explain (costs off) select count(*) from simple r join simple s using (id); select count(*) from simple r join simple s using (id); @@ -157,6 +161,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 2; set local work_mem = '128kB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = off; explain (costs off) select count(*) from simple r join simple s using (id); @@ -172,6 +177,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 2; set local work_mem = '192kB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = on; explain (costs off) select count(*) from simple r join simple s using (id); @@ -192,6 +198,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 0; set local work_mem = '128kB'; +set local hash_mem_multiplier = 1.0; explain (costs off) select count(*) FROM simple r JOIN bigger_than_it_looks s USING (id); select count(*) FROM simple r JOIN bigger_than_it_looks s USING (id); @@ -206,6 +213,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 2; set local work_mem = '128kB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = off; explain (costs off) select count(*) from simple r join bigger_than_it_looks s using (id); @@ -221,6 +229,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 1; set local work_mem = '192kB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = on; explain (costs off) select count(*) from simple r join bigger_than_it_looks s using (id); @@ -242,6 +251,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 0; set local work_mem = '128kB'; +set local hash_mem_multiplier = 1.0; explain (costs off) select count(*) from simple r join extremely_skewed s using (id); select count(*) from simple r join extremely_skewed s using (id); @@ -255,6 +265,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 2; set local work_mem = '128kB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = off; explain (costs off) select count(*) from simple r join extremely_skewed s using (id); @@ -269,6 +280,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 1; set local work_mem = '128kB'; +set local hash_mem_multiplier = 1.0; set local enable_parallel_hash = on; explain (costs off) select count(*) from simple r join extremely_skewed s using (id); @@ -285,6 +297,7 @@ rollback to settings; savepoint settings; set local max_parallel_workers_per_gather = 2; set local work_mem = '4MB'; +set local hash_mem_multiplier = 1.0; set local parallel_leader_participation = off; select * from hash_join_batches( $$ @@ -311,6 +324,7 @@ set max_parallel_workers_per_gather = 2; set enable_material = off; set enable_mergejoin = off; set work_mem = '64kB'; +set hash_mem_multiplier = 1.0; explain (costs off) select count(*) from join_foo left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss @@ -338,6 +352,7 @@ set max_parallel_workers_per_gather = 2; set enable_material = off; set enable_mergejoin = off; set work_mem = '4MB'; +set hash_mem_multiplier = 1.0; explain (costs off) select count(*) from join_foo left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss @@ -365,6 +380,7 @@ set max_parallel_workers_per_gather = 2; set enable_material = off; set enable_mergejoin = off; set work_mem = '64kB'; +set hash_mem_multiplier = 1.0; explain (costs off) select count(*) from join_foo left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss @@ -392,6 +408,7 @@ set max_parallel_workers_per_gather = 2; set enable_material = off; set enable_mergejoin = off; set work_mem = '4MB'; +set hash_mem_multiplier = 1.0; explain (costs off) select count(*) from join_foo left join (select b1.id, b1.t from join_bar b1 join join_bar b2 using (id)) ss @@ -454,6 +471,7 @@ savepoint settings; set max_parallel_workers_per_gather = 2; set enable_parallel_hash = on; set work_mem = '128kB'; +set hash_mem_multiplier = 1.0; explain (costs off) select length(max(s.t)) from wide left join (select id, coalesce(t, '') || '' as t from wide) s using (id); diff --git a/src/test/regress/sql/memoize.sql b/src/test/regress/sql/memoize.sql index c6ed5a2aa6..0979bcdf76 100644 --- a/src/test/regress/sql/memoize.sql +++ b/src/test/regress/sql/memoize.sql @@ -55,8 +55,9 @@ SELECT COUNT(*),AVG(t2.unique1) FROM tenk1 t1, LATERAL (SELECT t2.unique1 FROM tenk1 t2 WHERE t1.twenty = t2.unique1) t2 WHERE t1.unique1 < 1000; --- Reduce work_mem so that we see some cache evictions +-- Reduce work_mem and hash_mem_multiplier so that we see some cache evictions SET work_mem TO '64kB'; +SET hash_mem_multiplier TO 1.0; SET enable_mergejoin TO off; -- Ensure we get some evictions. We're unable to validate the hits and misses -- here as the number of entries that fit in the cache at once will vary @@ -126,6 +127,7 @@ WHERE unique1 < 3 RESET enable_seqscan; RESET enable_mergejoin; RESET work_mem; +RESET hash_mem_multiplier; RESET enable_bitmapscan; RESET enable_hashjoin; From 19252e8ec938bf07897c1519f367d0467a39242c Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 16 Feb 2022 22:47:35 -0800 Subject: [PATCH 005/772] plpython: Reject Python 2 during build configuration. Python 2.7 went EOL 2020-01-01 and the support for Python 2 requires a fair bit of infrastructure. Therefore we are removing Python 2 support in plpython. This patch just rejects Python 2 during configure / mkvcbuild.pl. Future commits will remove the code and infrastructure for Python 2 support and adjust more of the documentation. This way we can see the buildfarm state after the removal sooner and we can be sure that failures are due to desupporting Python 2, rather than caused by infrastructure cleanup. Reviewed-By: Peter Eisentraut Discussion: https://postgr.es/m/20211031184548.g4sxfe47n2kyi55r@alap3.anarazel.de --- config/python.m4 | 9 ++++++--- configure | 6 +++--- doc/src/sgml/install-windows.sgml | 2 +- doc/src/sgml/installation.sgml | 18 +++++------------- src/tools/msvc/Mkvcbuild.pm | 4 ++++ 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/config/python.m4 b/config/python.m4 index c7310ee37d..52f34070dd 100644 --- a/config/python.m4 +++ b/config/python.m4 @@ -9,6 +9,9 @@ # Look for Python and set the output variable 'PYTHON' if found, # fail otherwise. # +# Since we are supporting only Python 3.x, prefer python3 to plain python. If +# the latter exists at all, it very possibly points to python2. + # As the Python 3 transition happens and PEP 394 isn't updated, we # need to cater to systems that don't have unversioned "python" by # default. Some systems ship with "python3" by default and perhaps @@ -16,7 +19,7 @@ # "python2" and "python3", in which case it's reasonable to prefer the # newer version. AC_DEFUN([PGAC_PATH_PYTHON], -[PGAC_PATH_PROGS(PYTHON, [python python3 python2]) +[PGAC_PATH_PROGS(PYTHON, [python3 python]) AC_ARG_VAR(PYTHON, [Python program])dnl if test x"$PYTHON" = x""; then AC_MSG_ERROR([Python not found]) @@ -37,8 +40,8 @@ python_majorversion=`echo "$python_fullversion" | sed '[s/^\([0-9]*\).*/\1/]'` python_minorversion=`echo "$python_fullversion" | sed '[s/^[0-9]*\.\([0-9]*\).*/\1/]'` python_version=`echo "$python_fullversion" | sed '[s/^\([0-9]*\.[0-9]*\).*/\1/]'` # Reject unsupported Python versions as soon as practical. -if test "$python_majorversion" -lt 3 -a "$python_minorversion" -lt 7; then - AC_MSG_ERROR([Python version $python_version is too old (version 2.7 or later is required)]) +if test "$python_majorversion" -lt 3; then + AC_MSG_ERROR([Python version $python_version is too old (version 3 or later is required)]) fi AC_MSG_CHECKING([for Python sysconfig module]) diff --git a/configure b/configure index 9305555658..ba635a0062 100755 --- a/configure +++ b/configure @@ -10280,7 +10280,7 @@ fi if test "$with_python" = yes; then if test -z "$PYTHON"; then - for ac_prog in python python3 python2 + for ac_prog in python3 python do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 @@ -10346,8 +10346,8 @@ python_majorversion=`echo "$python_fullversion" | sed 's/^\([0-9]*\).*/\1/'` python_minorversion=`echo "$python_fullversion" | sed 's/^[0-9]*\.\([0-9]*\).*/\1/'` python_version=`echo "$python_fullversion" | sed 's/^\([0-9]*\.[0-9]*\).*/\1/'` # Reject unsupported Python versions as soon as practical. -if test "$python_majorversion" -lt 3 -a "$python_minorversion" -lt 7; then - as_fn_error $? "Python version $python_version is too old (version 2.7 or later is required)" "$LINENO" 5 +if test "$python_majorversion" -lt 3; then + as_fn_error $? "Python version $python_version is too old (version 3 or later is required)" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python sysconfig module" >&5 diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index 30dd0c7f75..b3435eabc4 100644 --- a/doc/src/sgml/install-windows.sgml +++ b/doc/src/sgml/install-windows.sgml @@ -136,7 +136,7 @@ to specify the location of your Python installation, put the following in config.pl: -$config->{python} = 'c:\python26'; +$config->{python} = 'c:\python310'; You only need to specify those parameters that are different from what's in config_default.pl. diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index 655095f3b1..094d23c292 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -196,11 +196,7 @@ su - postgres language, you need a Python installation with the header files and the sysconfig module. The minimum - required version is Python 2.7. - Python 3 is supported if it's - version 3.2 or later; but see - - when using Python 3. + required version is Python 3.2. @@ -1868,14 +1864,10 @@ build-postgresql: PYTHON - Python interpreter program. This will be used to - determine the dependencies for building PL/Python. Also, - whether Python 2 or 3 is specified here (or otherwise - implicitly chosen) determines which variant of the PL/Python - language becomes available. See - - for more information. If this is not set, the following are probed - in this order: python python3 python2. + Python interpreter program. This will be used to determine the + dependencies for building PL/Python. If this is not set, the + following are probed in this order: + python3 python. diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm index bab81bd459..105f5c72a2 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -490,6 +490,10 @@ sub mkvcbuild if (!(defined($pyprefix) && defined($pyver))); my $pymajorver = substr($pyver, 0, 1); + + die "Python version $pyver is too old (version 3 or later is required)" + if int($pymajorver) < 3; + my $plpython = $solution->AddProject('plpython' . $pymajorver, 'dll', 'PLs', 'src/pl/plpython'); $plpython->AddIncludeDir($pyprefix . '/include'); From f1ac4a74dee5ac0c89612fe2ac6e48082edbec23 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 17 Feb 2022 09:59:59 -0500 Subject: [PATCH 006/772] Disable perl2host() processing in TAP tests This is a preliminary step towards removing it altogether, but this lets us double check that nothing breaks in the buildfarm before we do. Discussion: https://postgr.es/m/0ba775a2-8aa0-0d56-d780-69427cf6f33d@dunslane.net --- src/test/perl/PostgreSQL/Test/Utils.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm index 57fcb24089..31e2b0315e 100644 --- a/src/test/perl/PostgreSQL/Test/Utils.pm +++ b/src/test/perl/PostgreSQL/Test/Utils.pm @@ -311,7 +311,7 @@ The returned path uses forward slashes but has no trailing slash. sub perl2host { my ($subject) = @_; - return $subject unless $Config{osname} eq 'msys'; + return $subject; if ($is_msys2) { # get absolute, windows type path From 138c51b72168e7b57c9edb4e9935274d3abf6bed Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Thu, 17 Feb 2022 10:53:51 -0500 Subject: [PATCH 007/772] Add missing binary-upgrade guard. Commit 9a974cbcba005256a19991203583a94b4f9a21a9 arranged for pg_dumpall to preserve tablespace OIDs, but it should only do that in binary upgrade mode, not all the time. Reported by Christoph Berg. Discussion: http://postgr.es/m/YgjwrkEvNEqoz4Vm@msg.df7cb.de --- src/bin/pg_dump/pg_dumpall.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 10383c713f..9c9f7c6d63 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -1066,8 +1066,11 @@ dumpTablespaces(PGconn *conn) /* needed for buildACLCommands() */ fspcname = pg_strdup(fmtId(spcname)); - appendPQExpBufferStr(buf, "\n-- For binary upgrade, must preserve pg_tablespace oid\n"); - appendPQExpBuffer(buf, "SELECT pg_catalog.binary_upgrade_set_next_pg_tablespace_oid('%u'::pg_catalog.oid);\n", spcoid); + if (binary_upgrade) + { + appendPQExpBufferStr(buf, "\n-- For binary upgrade, must preserve pg_tablespace oid\n"); + appendPQExpBuffer(buf, "SELECT pg_catalog.binary_upgrade_set_next_pg_tablespace_oid('%u'::pg_catalog.oid);\n", spcoid); + } appendPQExpBuffer(buf, "CREATE TABLESPACE %s", fspcname); appendPQExpBuffer(buf, " OWNER %s", fmtId(spcowner)); From 62cb7427d1e491faf8612a82c2e3711a8cd65422 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 17 Feb 2022 15:03:40 -0500 Subject: [PATCH 008/772] Avoid dangling-pointer usage in pg_basebackup progress reports. Ill-considered refactoring in 23a1c6578 led to progress_filename sometimes pointing to data that had gone out of scope. The most bulletproof fix is to hang onto a copy of whatever's passed in. Compared to the work spent elsewhere per file, that's not very expensive, plus we can skip it except in verbose logging mode. Per buildfarm. Discussion: https://postgr.es/m/20220212211316.GK31460@telsasoft.com --- src/bin/pg_basebackup/pg_basebackup.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index 0003b59615..08b07d5a06 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -164,7 +164,7 @@ static bool found_tablespace_dirs = false; static uint64 totalsize_kb; static uint64 totaldone; static int tablespacecount; -static const char *progress_filename; +static char *progress_filename = NULL; /* Pipe to communicate with background wal receiver process */ #ifndef WIN32 @@ -775,11 +775,22 @@ verify_dir_is_empty_or_create(char *dirname, bool *created, bool *found) /* * Callback to update our notion of the current filename. + * + * No other code should modify progress_filename! */ static void progress_update_filename(const char *filename) { - progress_filename = filename; + /* We needn't maintain this variable if not doing verbose reports. */ + if (showprogress && verbose) + { + if (progress_filename) + free(progress_filename); + if (filename) + progress_filename = pg_strdup(filename); + else + progress_filename = NULL; + } } /* @@ -1258,7 +1269,7 @@ CreateBackupStreamer(char *archive_name, char *spclocation, */ if (must_parse_archive) streamer = bbstreamer_tar_archiver_new(streamer); - progress_filename = archive_filename; + progress_update_filename(archive_filename); } /* @@ -1662,7 +1673,7 @@ ReceiveTarFile(PGconn *conn, char *archive_name, char *spclocation, expect_unterminated_tarfile); state.tablespacenum = tablespacenum; ReceiveCopyData(conn, ReceiveTarCopyChunk, &state); - progress_filename = NULL; + progress_update_filename(NULL); /* * The decision as to whether we need to inject the backup manifest into @@ -2161,7 +2172,7 @@ BaseBackup(void) if (showprogress) { - progress_filename = NULL; + progress_update_filename(NULL); progress_report(PQntuples(res), true, true); } From c476f380e296bab57fecada1ea96c86d575bf160 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Fri, 18 Feb 2022 07:44:24 +0530 Subject: [PATCH 009/772] Fix a comment in worker.c. The comment incorrectly states that worker gets killed during ALTER SUBSCRIPTION ... DISABLE. Remove that part of the comment. Author: Masahiko Sawada Discussion: https://postgr.es/m/CAD21AoCbEN==oH7BhP3U6WPHg3zgH6sDOeKhJjy4W2dx-qoVCw@mail.gmail.com --- src/backend/replication/logical/worker.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index d77bb32bb9..5d9acc6173 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -2933,10 +2933,7 @@ maybe_reread_subscription(void) proc_exit(0); } - /* - * Exit if the subscription was disabled. This normally should not happen - * as the worker gets killed during ALTER SUBSCRIPTION ... DISABLE. - */ + /* Exit if the subscription was disabled. */ if (!newsub->enabled) { ereport(LOG, From 94c49d53402240ad7ddbcae9049ff2840a54b9c6 Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Fri, 18 Feb 2022 11:38:12 +0900 Subject: [PATCH 010/772] postgres_fdw: Make postgres_fdw.application_name support more escape sequences. Commit 6e0cb3dec1 allowed postgres_fdw.application_name to include escape sequences %a (application name), %d (database name), %u (user name) and %p (pid). In addition to them, this commit makes it support the escape sequences for session ID (%c) and cluster name (%C). These are helpful to investigate where each remote transactions came from. Author: Fujii Masao Reviewed-by: Ryohei Takahashi, Kyotaro Horiguchi Discussion: https://postgr.es/m/1041dc9a-c976-049f-9f14-e7d94c29c4b2@oss.nttdata.com --- .../postgres_fdw/expected/postgres_fdw.out | 20 +++++++++++++++++++ contrib/postgres_fdw/option.c | 6 ++++++ contrib/postgres_fdw/sql/postgres_fdw.sql | 11 ++++++++++ doc/src/sgml/postgres-fdw.sgml | 14 +++++++++++++ src/include/utils/guc.h | 2 +- 5 files changed, 52 insertions(+), 1 deletion(-) diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index b2e02caefe..057342083c 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -10910,6 +10910,26 @@ SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity t (1 row) +-- Test %c (session ID) and %C (cluster name) escape sequences. +SET postgres_fdw.application_name TO 'fdw_%C%c'; +SELECT 1 FROM ft6 LIMIT 1; + ?column? +---------- + 1 +(1 row) + +SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity + WHERE application_name = + substring('fdw_' || current_setting('cluster_name') || + to_hex(trunc(EXTRACT(EPOCH FROM (SELECT backend_start FROM + pg_stat_get_activity(pg_backend_pid()))))::integer) || '.' || + to_hex(pg_backend_pid()) + for current_setting('max_identifier_length')::int); + pg_terminate_backend +---------------------- + t +(1 row) + --Clean up RESET postgres_fdw.application_name; RESET debug_discard_caches; diff --git a/contrib/postgres_fdw/option.c b/contrib/postgres_fdw/option.c index fc3ce6a53a..af38e956e7 100644 --- a/contrib/postgres_fdw/option.c +++ b/contrib/postgres_fdw/option.c @@ -489,6 +489,12 @@ process_pgfdw_appname(const char *appname) case 'a': appendStringInfoString(&buf, application_name); break; + case 'c': + appendStringInfo(&buf, "%lx.%x", (long) (MyStartTime), MyProcPid); + break; + case 'C': + appendStringInfoString(&buf, cluster_name); + break; case 'd': appendStringInfoString(&buf, MyProcPort->database_name); break; diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index e050639b57..6c9f579c41 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -3501,6 +3501,17 @@ SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity substring('fdw_' || current_setting('application_name') || CURRENT_USER || '%' for current_setting('max_identifier_length')::int); +-- Test %c (session ID) and %C (cluster name) escape sequences. +SET postgres_fdw.application_name TO 'fdw_%C%c'; +SELECT 1 FROM ft6 LIMIT 1; +SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity + WHERE application_name = + substring('fdw_' || current_setting('cluster_name') || + to_hex(trunc(EXTRACT(EPOCH FROM (SELECT backend_start FROM + pg_stat_get_activity(pg_backend_pid()))))::integer) || '.' || + to_hex(pg_backend_pid()) + for current_setting('max_identifier_length')::int); + --Clean up RESET postgres_fdw.application_name; RESET debug_discard_caches; diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml index 7bb6e525a4..dc57fe4b0d 100644 --- a/doc/src/sgml/postgres-fdw.sgml +++ b/doc/src/sgml/postgres-fdw.sgml @@ -984,6 +984,20 @@ postgres=# SELECT postgres_fdw_disconnect_all(); %a Application name on local server + + %c + + Session ID on local server + (see for details) + + + + %C + + Cluster name in local server + (see for details) + + %u User name on local server diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index 6bb81707b0..f1bfe79feb 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -271,7 +271,7 @@ extern int temp_file_limit; extern int num_temp_buffers; -extern char *cluster_name; +extern PGDLLIMPORT char *cluster_name; extern PGDLLIMPORT char *ConfigFileName; extern char *HbaFileName; extern char *IdentFileName; From f927a6ec3ef710ad2bd7d9c63f524b7a22d7e664 Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Fri, 18 Feb 2022 12:19:10 +0900 Subject: [PATCH 011/772] Fix comment in CheckIndexCompatible(). Commit 5f173040 removed the parameter "heapRelation" from CheckIndexCompatible(), but forgot to remove the mention of it from the comment. This commit removes that unnecessary mention. Also this commit adds the missing mention of the parameter "oldId" in the comment. Author: Yugo Nagata Reviewed-by: Nathan Bossart, Fujii Masao Discussion: https://postgr.es/m/20220204014634.b39314f278ff4ae3de96e201@sraoss.co.jp --- src/backend/commands/indexcmds.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 560dcc87a2..cd30f15eba 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -129,7 +129,7 @@ typedef struct ReindexErrorInfo * prospective index definition, such that the existing index storage * could become the storage of the new index, avoiding a rebuild. * - * 'heapRelation': the relation the index would apply to. + * 'oldId': the OID of the existing index * 'accessMethodName': name of the AM to use. * 'attributeList': a list of IndexElem specifying columns and expressions * to index on. From de447bb8e6fbbad19f964a2d7f04c9ccc1d06903 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 17 Feb 2022 22:45:34 -0500 Subject: [PATCH 012/772] Suppress warning about stack_base_ptr with late-model GCC. GCC 12 complains that set_stack_base is storing the address of a local variable in a long-lived pointer. This is an entirely reasonable warning (indeed, it just helped us find a bug); but that behavior is intentional here. We can work around it by using __builtin_frame_address(0) instead of a specific local variable; that produces an address a dozen or so bytes different, in my testing, but we don't care about such a small difference. Maybe someday a compiler lacking that function will start to issue a similar warning, but we'll worry about that when it happens. Patch by me, per a suggestion from Andres Freund. Back-patch to v12, which is as far back as the patch will go without some pain. (Recently-established project policy would permit a back-patch as far as 9.2, but I'm disinclined to expend the work until GCC 12 is much more widespread.) Discussion: https://postgr.es/m/3773792.1645141467@sss.pgh.pa.us --- config/c-compiler.m4 | 22 ++++++++++++++++ configure | 40 +++++++++++++++++++++++++++++ configure.ac | 3 +++ src/backend/postmaster/postmaster.c | 2 +- src/backend/tcop/postgres.c | 20 ++++++++++----- src/backend/utils/init/miscinit.c | 11 ++++---- src/include/pg_config.h.in | 3 +++ src/tools/msvc/Solution.pm | 1 + 8 files changed, 89 insertions(+), 13 deletions(-) diff --git a/config/c-compiler.m4 b/config/c-compiler.m4 index 780e906ecc..d3562d6fee 100644 --- a/config/c-compiler.m4 +++ b/config/c-compiler.m4 @@ -381,6 +381,28 @@ fi])# PGAC_CHECK_BUILTIN_FUNC +# PGAC_CHECK_BUILTIN_FUNC_PTR +# ----------------------- +# Like PGAC_CHECK_BUILTIN_FUNC, except that the function is assumed to +# return a pointer type, and the argument(s) should be given literally. +# This handles some cases that PGAC_CHECK_BUILTIN_FUNC doesn't. +AC_DEFUN([PGAC_CHECK_BUILTIN_FUNC_PTR], +[AC_CACHE_CHECK(for $1, pgac_cv$1, +[AC_LINK_IFELSE([AC_LANG_PROGRAM([ +void * +call$1(void) +{ + return $1($2); +}], [])], +[pgac_cv$1=yes], +[pgac_cv$1=no])]) +if test x"${pgac_cv$1}" = xyes ; then +AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE$1]), 1, + [Define to 1 if your compiler understands $1.]) +fi])# PGAC_CHECK_BUILTIN_FUNC_PTR + + + # PGAC_PROG_VARCC_VARFLAGS_OPT # ---------------------------- # Given a compiler, variable name and a string, check if the compiler diff --git a/configure b/configure index ba635a0062..df72560277 100755 --- a/configure +++ b/configure @@ -15944,6 +15944,46 @@ cat >>confdefs.h <<_ACEOF #define HAVE__BUILTIN_POPCOUNT 1 _ACEOF +fi +# __builtin_frame_address may draw a diagnostic for non-constant argument, +# so it needs a different test function. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_frame_address" >&5 +$as_echo_n "checking for __builtin_frame_address... " >&6; } +if ${pgac_cv__builtin_frame_address+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +void * +call__builtin_frame_address(void) +{ + return __builtin_frame_address(0); +} +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pgac_cv__builtin_frame_address=yes +else + pgac_cv__builtin_frame_address=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv__builtin_frame_address" >&5 +$as_echo "$pgac_cv__builtin_frame_address" >&6; } +if test x"${pgac_cv__builtin_frame_address}" = xyes ; then + +cat >>confdefs.h <<_ACEOF +#define HAVE__BUILTIN_FRAME_ADDRESS 1 +_ACEOF + fi # We require 64-bit fseeko() to be available, but run this check anyway diff --git a/configure.ac b/configure.ac index 16167329fc..91a28cb50b 100644 --- a/configure.ac +++ b/configure.ac @@ -1776,6 +1776,9 @@ PGAC_CHECK_BUILTIN_FUNC([__builtin_bswap64], [long int x]) PGAC_CHECK_BUILTIN_FUNC([__builtin_clz], [unsigned int x]) PGAC_CHECK_BUILTIN_FUNC([__builtin_ctz], [unsigned int x]) PGAC_CHECK_BUILTIN_FUNC([__builtin_popcount], [unsigned int x]) +# __builtin_frame_address may draw a diagnostic for non-constant argument, +# so it needs a different test function. +PGAC_CHECK_BUILTIN_FUNC_PTR([__builtin_frame_address], [0]) # We require 64-bit fseeko() to be available, but run this check anyway # in case it finds that _LARGEFILE_SOURCE has to be #define'd for that. diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 735fed490b..80bb269599 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -1083,7 +1083,7 @@ PostmasterMain(int argc, char *argv[]) /* * Set reference point for stack-depth checking. */ - set_stack_base(); + (void) set_stack_base(); /* * Initialize pipe (or process handle on Windows) that allows children to diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 38d8b97894..3c7d08209f 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -129,17 +129,15 @@ static long max_stack_depth_bytes = 100 * 1024L; /* * Stack base pointer -- initialized by PostmasterMain and inherited by - * subprocesses. This is not static because old versions of PL/Java modify - * it directly. Newer versions use set_stack_base(), but we want to stay - * binary-compatible for the time being. + * subprocesses (but see also InitPostmasterChild). */ -char *stack_base_ptr = NULL; +static char *stack_base_ptr = NULL; /* * On IA64 we also have to remember the register stack base. */ #if defined(__ia64__) || defined(__ia64) -char *register_stack_base_ptr = NULL; +static char *register_stack_base_ptr = NULL; #endif /* @@ -3416,7 +3414,9 @@ ia64_get_bsp(void) pg_stack_base_t set_stack_base(void) { +#ifndef HAVE__BUILTIN_FRAME_ADDRESS char stack_base; +#endif pg_stack_base_t old; #if defined(__ia64__) || defined(__ia64) @@ -3426,8 +3426,16 @@ set_stack_base(void) old = stack_base_ptr; #endif - /* Set up reference point for stack depth checking */ + /* + * Set up reference point for stack depth checking. On recent gcc we use + * __builtin_frame_address() to avoid a warning about storing a local + * variable's address in a long-lived variable. + */ +#ifdef HAVE__BUILTIN_FRAME_ADDRESS + stack_base_ptr = __builtin_frame_address(0); +#else stack_base_ptr = &stack_base; +#endif #if defined(__ia64__) || defined(__ia64) register_stack_base_ptr = ia64_get_bsp(); #endif diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 0868e5a24f..bdc77af719 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -106,13 +106,12 @@ InitPostmasterChild(void) #endif /* - * Set reference point for stack-depth checking. We re-do that even in the - * !EXEC_BACKEND case, because there are some edge cases where processes - * are started with an alternative stack (e.g. starting bgworkers when - * running postgres using the rr debugger, as bgworkers are launched from - * signal handlers). + * Set reference point for stack-depth checking. This might seem + * redundant in !EXEC_BACKEND builds; but it's not because the postmaster + * launches its children from signal handlers, so we might be running on + * an alternative stack. */ - set_stack_base(); + (void) set_stack_base(); InitProcessGlobals(); diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 28a1f0e9f0..12aac8616e 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -739,6 +739,9 @@ /* Define to 1 if your compiler understands __builtin_ctz. */ #undef HAVE__BUILTIN_CTZ +/* Define to 1 if your compiler understands __builtin_frame_address. */ +#undef HAVE__BUILTIN_FRAME_ADDRESS + /* Define to 1 if your compiler understands __builtin_$op_overflow. */ #undef HAVE__BUILTIN_OP_OVERFLOW diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index e6f20679dc..439809fcd0 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -439,6 +439,7 @@ sub GenerateFiles HAVE__BUILTIN_CLZ => undef, HAVE__BUILTIN_CONSTANT_P => undef, HAVE__BUILTIN_CTZ => undef, + HAVE__BUILTIN_FRAME_ADDRESS => undef, HAVE__BUILTIN_OP_OVERFLOW => undef, HAVE__BUILTIN_POPCOUNT => undef, HAVE__BUILTIN_TYPES_COMPATIBLE_P => undef, From ce1e7a2f716919652c280937087b24937677f8b3 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 18 Feb 2022 11:37:27 -0500 Subject: [PATCH 013/772] Don't let libpq "event" procs break the state of PGresult objects. As currently implemented, failure of a PGEVT_RESULTCREATE callback causes the PGresult to be converted to an error result. This is intellectually inconsistent (shouldn't a failing callback likewise prevent creation of the error result? what about side-effects on the behavior seen by other event procs? why does PQfireResultCreateEvents act differently from PQgetResult?), but more importantly it destroys any promises we might wish to make about the behavior of libpq in nontrivial operating modes, such as pipeline mode. For example, it's not possible to promise that PGRES_PIPELINE_SYNC results will be returned if an event callback fails on those. With this definition, expecting applications to behave sanely in the face of possibly-failing callbacks seems like a very big lift. Hence, redefine the result of a callback failure as being simply that that event procedure won't be called any more for this PGresult (which was true already). Event procedures can still signal failure back to the application through out-of-band mechanisms, for example via their passthrough arguments. Similarly, don't let failure of a PGEVT_RESULTCOPY callback prevent PQcopyResult from succeeding. That definition allowed a misbehaving event proc to break single-row mode (our sole internal use of PQcopyResult), and it probably had equally deleterious effects for outside uses. Discussion: https://postgr.es/m/3185105.1644960083@sss.pgh.pa.us --- doc/src/sgml/libpq.sgml | 31 ++++++++++++------------ src/interfaces/libpq/fe-exec.c | 37 ++++++----------------------- src/interfaces/libpq/libpq-events.c | 14 ++++++----- 3 files changed, 31 insertions(+), 51 deletions(-) diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index e0ab7cd555..40c39feb7d 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -6831,6 +6831,7 @@ PGresult *PQcopyResult(const PGresult *src, int flags); PG_COPYRES_EVENTS specifies copying the source result's events. (But any instance data associated with the source is not copied.) + The event procedures receive PGEVT_RESULTCOPY events. @@ -7126,7 +7127,7 @@ defaultNoticeProcessor(void *arg, const char *message) , , and - PQsetResultInstanceData functions. Note that + functions. Note that unlike the pass-through pointer, instance data of a PGconn is not automatically inherited by PGresults created from it. libpq does not know what pass-through @@ -7154,7 +7155,7 @@ defaultNoticeProcessor(void *arg, const char *message) is called. It is the ideal time to initialize any instanceData an event procedure may need. Only one register event will be fired per event handler per connection. If the - event procedure fails, the registration is aborted. + event procedure fails (returns zero), the registration is cancelled. typedef struct @@ -7261,11 +7262,11 @@ typedef struct conn is the connection used to generate the result. This is the ideal place to initialize any instanceData that needs to be associated with the - result. If the event procedure fails, the result will be cleared and - the failure will be propagated. The event procedure must not try to - the result object for itself. When returning a - failure code, all cleanup must be performed as no - PGEVT_RESULTDESTROY event will be sent. + result. If an event procedure fails (returns zero), that event + procedure will be ignored for the remaining lifetime of the result; + that is, it will not receive PGEVT_RESULTCOPY + or PGEVT_RESULTDESTROY events for this result or + results copied from it. @@ -7295,12 +7296,12 @@ typedef struct src result is what was copied while the dest result is the copy destination. This event can be used to provide a deep copy of instanceData, - since PQcopyResult cannot do that. If the event - procedure fails, the entire copy operation will fail and the - dest result will be cleared. When returning a - failure code, all cleanup must be performed as no - PGEVT_RESULTDESTROY event will be sent for the - destination result. + since PQcopyResult cannot do that. If an event + procedure fails (returns zero), that event procedure will be + ignored for the remaining lifetime of the new result; that is, it + will not receive PGEVT_RESULTCOPY + or PGEVT_RESULTDESTROY events for that result or + results copied from it. @@ -7618,7 +7619,7 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough) mydata *res_data = dup_mydata(conn_data); /* associate app specific data with result (copy it from conn) */ - PQsetResultInstanceData(e->result, myEventProc, res_data); + PQresultSetInstanceData(e->result, myEventProc, res_data); break; } @@ -7629,7 +7630,7 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough) mydata *dest_data = dup_mydata(src_data); /* associate app specific data with result (copy it from a result) */ - PQsetResultInstanceData(e->dest, myEventProc, dest_data); + PQresultSetInstanceData(e->dest, myEventProc, dest_data); break; } diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index 9afd4d88b4..c7c48d07dc 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -363,19 +363,16 @@ PQcopyResult(const PGresult *src, int flags) /* Okay, trigger PGEVT_RESULTCOPY event */ for (i = 0; i < dest->nEvents; i++) { + /* We don't fire events that had some previous failure */ if (src->events[i].resultInitialized) { PGEventResultCopy evt; evt.src = src; evt.dest = dest; - if (!dest->events[i].proc(PGEVT_RESULTCOPY, &evt, - dest->events[i].passThrough)) - { - PQclear(dest); - return NULL; - } - dest->events[i].resultInitialized = true; + if (dest->events[i].proc(PGEVT_RESULTCOPY, &evt, + dest->events[i].passThrough)) + dest->events[i].resultInitialized = true; } } @@ -2124,29 +2121,9 @@ PQgetResult(PGconn *conn) break; } - if (res) - { - int i; - - for (i = 0; i < res->nEvents; i++) - { - PGEventResultCreate evt; - - evt.conn = conn; - evt.result = res; - if (!res->events[i].proc(PGEVT_RESULTCREATE, &evt, - res->events[i].passThrough)) - { - appendPQExpBuffer(&conn->errorMessage, - libpq_gettext("PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n"), - res->events[i].name); - pqSetResultError(res, &conn->errorMessage); - res->resultStatus = PGRES_FATAL_ERROR; - break; - } - res->events[i].resultInitialized = true; - } - } + /* Time to fire PGEVT_RESULTCREATE events, if there are any */ + if (res && res->nEvents > 0) + (void) PQfireResultCreateEvents(conn, res); return res; } diff --git a/src/interfaces/libpq/libpq-events.c b/src/interfaces/libpq/libpq-events.c index 7754c37748..1ec86b1d64 100644 --- a/src/interfaces/libpq/libpq-events.c +++ b/src/interfaces/libpq/libpq-events.c @@ -184,6 +184,7 @@ PQresultInstanceData(const PGresult *result, PGEventProc proc) int PQfireResultCreateEvents(PGconn *conn, PGresult *res) { + int result = true; int i; if (!res) @@ -191,19 +192,20 @@ PQfireResultCreateEvents(PGconn *conn, PGresult *res) for (i = 0; i < res->nEvents; i++) { + /* It's possible event was already fired, if so don't repeat it */ if (!res->events[i].resultInitialized) { PGEventResultCreate evt; evt.conn = conn; evt.result = res; - if (!res->events[i].proc(PGEVT_RESULTCREATE, &evt, - res->events[i].passThrough)) - return false; - - res->events[i].resultInitialized = true; + if (res->events[i].proc(PGEVT_RESULTCREATE, &evt, + res->events[i].passThrough)) + res->events[i].resultInitialized = true; + else + result = false; } } - return true; + return result; } From 2e372869aa38a9d6e4552c192da4454b17e01e38 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 18 Feb 2022 11:43:04 -0500 Subject: [PATCH 014/772] Don't let libpq PGEVT_CONNRESET callbacks break a PGconn. As currently implemented, failure of a PGEVT_CONNRESET callback forces the PGconn into the CONNECTION_BAD state (without closing the socket, which is inconsistent with other failure paths), and prevents later callbacks from being called. This seems highly questionable, and indeed is questioned by comments in the source. Instead, let's just ignore the result value of PGEVT_CONNRESET calls. Like the preceding commit, this converts event callbacks into "pure observers" that cannot affect libpq's processing logic. Discussion: https://postgr.es/m/3185105.1644960083@sss.pgh.pa.us --- doc/src/sgml/libpq.sgml | 11 +++++------ src/interfaces/libpq/fe-connect.c | 28 ++++++---------------------- 2 files changed, 11 insertions(+), 28 deletions(-) diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index 40c39feb7d..64e17401cd 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -7183,12 +7183,11 @@ typedef struct The connection reset event is fired on completion of or PQresetPoll. In - both cases, the event is only fired if the reset was successful. If - the event procedure fails, the entire connection reset will fail; the - PGconn is put into - CONNECTION_BAD status and - PQresetPoll will return - PGRES_POLLING_FAILED. + both cases, the event is only fired if the reset was successful. + The return value of the event procedure is ignored + in PostgreSQL v15 and later. + With earlier versions, however, it's important to return success + (nonzero) or the connection will be aborted. typedef struct diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 30d6b7b377..9c9416e8ff 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -4276,8 +4276,7 @@ PQreset(PGconn *conn) if (connectDBStart(conn) && connectDBComplete(conn)) { /* - * Notify event procs of successful reset. We treat an event proc - * failure as disabling the connection ... good idea? + * Notify event procs of successful reset. */ int i; @@ -4286,15 +4285,8 @@ PQreset(PGconn *conn) PGEventConnReset evt; evt.conn = conn; - if (!conn->events[i].proc(PGEVT_CONNRESET, &evt, - conn->events[i].passThrough)) - { - conn->status = CONNECTION_BAD; - appendPQExpBuffer(&conn->errorMessage, - libpq_gettext("PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n"), - conn->events[i].name); - break; - } + (void) conn->events[i].proc(PGEVT_CONNRESET, &evt, + conn->events[i].passThrough); } } } @@ -4336,8 +4328,7 @@ PQresetPoll(PGconn *conn) if (status == PGRES_POLLING_OK) { /* - * Notify event procs of successful reset. We treat an event proc - * failure as disabling the connection ... good idea? + * Notify event procs of successful reset. */ int i; @@ -4346,15 +4337,8 @@ PQresetPoll(PGconn *conn) PGEventConnReset evt; evt.conn = conn; - if (!conn->events[i].proc(PGEVT_CONNRESET, &evt, - conn->events[i].passThrough)) - { - conn->status = CONNECTION_BAD; - appendPQExpBuffer(&conn->errorMessage, - libpq_gettext("PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n"), - conn->events[i].name); - return PGRES_POLLING_FAILED; - } + (void) conn->events[i].proc(PGEVT_CONNRESET, &evt, + conn->events[i].passThrough); } } From 6c417bbcc8ff98875234ca269979fc7defde58e5 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 18 Feb 2022 13:40:31 -0500 Subject: [PATCH 015/772] Add support for building with ZSTD. This commit doesn't actually add anything that uses ZSTD; that will be done separately. It just puts the basic infrastructure into place. Jeevan Ladhe, Robert Haas, and Michael Paquier. Reviewed by Justin Pryzby and Andres Freund. Discussion: http://postgr.es/m/CA+TgmoatQKGd+8SjcV+bzvw4XaoEwminHjU83yG12+NXtQzTTQ@mail.gmail.com --- configure | 265 ++++++++++++++++++++++++++++++ configure.ac | 33 ++++ doc/src/sgml/install-windows.sgml | 9 + doc/src/sgml/installation.sgml | 9 + src/Makefile.global.in | 1 + src/include/pg_config.h.in | 6 + src/tools/msvc/Solution.pm | 13 ++ src/tools/msvc/config_default.pl | 1 + src/tools/msvc/vcregress.pl | 1 + 9 files changed, 338 insertions(+) diff --git a/configure b/configure index df72560277..ca890b8b07 100755 --- a/configure +++ b/configure @@ -650,6 +650,7 @@ CFLAGS_ARMV8_CRC32C CFLAGS_SSE42 have_win32_dbghelp LIBOBJS +ZSTD LZ4 UUID_LIBS LDAP_LIBS_BE @@ -700,6 +701,9 @@ with_gnu_ld LD LDFLAGS_SL LDFLAGS_EX +ZSTD_LIBS +ZSTD_CFLAGS +with_zstd LZ4_LIBS LZ4_CFLAGS with_lz4 @@ -869,6 +873,7 @@ with_libxslt with_system_tzdata with_zlib with_lz4 +with_zstd with_gnu_ld with_ssl with_openssl @@ -898,6 +903,8 @@ XML2_CFLAGS XML2_LIBS LZ4_CFLAGS LZ4_LIBS +ZSTD_CFLAGS +ZSTD_LIBS LDFLAGS_EX LDFLAGS_SL PERL @@ -1577,6 +1584,7 @@ Optional Packages: use system time zone data in DIR --without-zlib do not use Zlib --with-lz4 build with LZ4 support + --with-zstd build with ZSTD support --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-ssl=LIB use LIB for SSL/TLS support (openssl) --with-openssl obsolete spelling of --with-ssl=openssl @@ -1606,6 +1614,8 @@ Some influential environment variables: XML2_LIBS linker flags for XML2, overriding pkg-config LZ4_CFLAGS C compiler flags for LZ4, overriding pkg-config LZ4_LIBS linker flags for LZ4, overriding pkg-config + ZSTD_CFLAGS C compiler flags for ZSTD, overriding pkg-config + ZSTD_LIBS linker flags for ZSTD, overriding pkg-config LDFLAGS_EX extra linker flags for linking executables only LDFLAGS_SL extra linker flags for linking shared libraries only PERL Perl program @@ -9034,6 +9044,146 @@ fi done fi +# +# ZSTD +# +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with ZSTD support" >&5 +$as_echo_n "checking whether to build with ZSTD support... " >&6; } + + + +# Check whether --with-zstd was given. +if test "${with_zstd+set}" = set; then : + withval=$with_zstd; + case $withval in + yes) + +$as_echo "#define USE_ZSTD 1" >>confdefs.h + + ;; + no) + : + ;; + *) + as_fn_error $? "no argument expected for --with-zstd option" "$LINENO" 5 + ;; + esac + +else + with_zstd=no + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_zstd" >&5 +$as_echo "$with_zstd" >&6; } + + +if test "$with_zstd" = yes; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libzstd" >&5 +$as_echo_n "checking for libzstd... " >&6; } + +if test -n "$ZSTD_CFLAGS"; then + pkg_cv_ZSTD_CFLAGS="$ZSTD_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzstd") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_ZSTD_CFLAGS=`$PKG_CONFIG --cflags "libzstd" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$ZSTD_LIBS"; then + pkg_cv_ZSTD_LIBS="$ZSTD_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzstd") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_ZSTD_LIBS=`$PKG_CONFIG --libs "libzstd" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + ZSTD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libzstd" 2>&1` + else + ZSTD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libzstd" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$ZSTD_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (libzstd) were not met: + +$ZSTD_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables ZSTD_CFLAGS +and ZSTD_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables ZSTD_CFLAGS +and ZSTD_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +else + ZSTD_CFLAGS=$pkg_cv_ZSTD_CFLAGS + ZSTD_LIBS=$pkg_cv_ZSTD_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + # We only care about -I, -D, and -L switches; + # note that -lzstd will be added by AC_CHECK_LIB below. + for pgac_option in $ZSTD_CFLAGS; do + case $pgac_option in + -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + esac + done + for pgac_option in $ZSTD_LIBS; do + case $pgac_option in + -L*) LDFLAGS="$LDFLAGS $pgac_option";; + esac + done +fi # # Assignments # @@ -13130,6 +13280,56 @@ fi fi +if test "$with_zstd" = yes ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZSTD_compress in -lzstd" >&5 +$as_echo_n "checking for ZSTD_compress in -lzstd... " >&6; } +if ${ac_cv_lib_zstd_ZSTD_compress+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lzstd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ZSTD_compress (); +int +main () +{ +return ZSTD_compress (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_zstd_ZSTD_compress=yes +else + ac_cv_lib_zstd_ZSTD_compress=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zstd_ZSTD_compress" >&5 +$as_echo "$ac_cv_lib_zstd_ZSTD_compress" >&6; } +if test "x$ac_cv_lib_zstd_ZSTD_compress" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBZSTD 1 +_ACEOF + + LIBS="-lzstd $LIBS" + +else + as_fn_error $? "library 'zstd' is required for ZSTD support" "$LINENO" 5 +fi + +fi + # Note: We can test for libldap_r only after we know PTHREAD_LIBS; # also, on AIX, we may need to have openssl in LIBS for this step. if test "$with_ldap" = yes ; then @@ -13902,6 +14102,71 @@ fi done +fi + +if test -z "$ZSTD"; then + for ac_prog in zstd +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ZSTD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ZSTD in + [\\/]* | ?:[\\/]*) + ac_cv_path_ZSTD="$ZSTD" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ZSTD="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ZSTD=$ac_cv_path_ZSTD +if test -n "$ZSTD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZSTD" >&5 +$as_echo "$ZSTD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ZSTD" && break +done + +else + # Report the value of ZSTD in configure's output in all cases. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZSTD" >&5 +$as_echo_n "checking for ZSTD... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZSTD" >&5 +$as_echo "$ZSTD" >&6; } +fi + +if test "$with_zstd" = yes; then + ac_fn_c_check_header_mongrel "$LINENO" "zstd.h" "ac_cv_header_zstd_h" "$ac_includes_default" +if test "x$ac_cv_header_zstd_h" = xyes; then : + +else + as_fn_error $? "zstd.h header file is required for ZSTD" "$LINENO" 5 +fi + + fi if test "$with_gssapi" = yes ; then diff --git a/configure.ac b/configure.ac index 91a28cb50b..331683b336 100644 --- a/configure.ac +++ b/configure.ac @@ -1056,6 +1056,30 @@ if test "$with_lz4" = yes; then done fi +# +# ZSTD +# +AC_MSG_CHECKING([whether to build with ZSTD support]) +PGAC_ARG_BOOL(with, zstd, no, [build with ZSTD support], + [AC_DEFINE([USE_ZSTD], 1, [Define to 1 to build with ZSTD support. (--with-zstd)])]) +AC_MSG_RESULT([$with_zstd]) +AC_SUBST(with_zstd) + +if test "$with_zstd" = yes; then + PKG_CHECK_MODULES(ZSTD, libzstd) + # We only care about -I, -D, and -L switches; + # note that -lzstd will be added by AC_CHECK_LIB below. + for pgac_option in $ZSTD_CFLAGS; do + case $pgac_option in + -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + esac + done + for pgac_option in $ZSTD_LIBS; do + case $pgac_option in + -L*) LDFLAGS="$LDFLAGS $pgac_option";; + esac + done +fi # # Assignments # @@ -1325,6 +1349,10 @@ if test "$with_lz4" = yes ; then AC_CHECK_LIB(lz4, LZ4_compress_default, [], [AC_MSG_ERROR([library 'lz4' is required for LZ4 support])]) fi +if test "$with_zstd" = yes ; then + AC_CHECK_LIB(zstd, ZSTD_compress, [], [AC_MSG_ERROR([library 'zstd' is required for ZSTD support])]) +fi + # Note: We can test for libldap_r only after we know PTHREAD_LIBS; # also, on AIX, we may need to have openssl in LIBS for this step. if test "$with_ldap" = yes ; then @@ -1490,6 +1518,11 @@ if test "$with_lz4" = yes; then AC_CHECK_HEADERS(lz4.h, [], [AC_MSG_ERROR([lz4.h header file is required for LZ4])]) fi +PGAC_PATH_PROGS(ZSTD, zstd) +if test "$with_zstd" = yes; then + AC_CHECK_HEADER(zstd.h, [], [AC_MSG_ERROR([zstd.h header file is required for ZSTD])]) +fi + if test "$with_gssapi" = yes ; then AC_CHECK_HEADERS(gssapi/gssapi.h, [], [AC_CHECK_HEADERS(gssapi.h, [], [AC_MSG_ERROR([gssapi.h header file is required for GSSAPI])])]) diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index b3435eabc4..e08c9514d4 100644 --- a/doc/src/sgml/install-windows.sgml +++ b/doc/src/sgml/install-windows.sgml @@ -307,6 +307,15 @@ $ENV{MSBFLAGS}="/m"; + + ZSTD + + Required for supporting ZSTD compression + method. Binaries and source can be downloaded from + . + + + OpenSSL diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index 094d23c292..311f7f261d 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -985,6 +985,15 @@ build-postgresql: + + + + + Build with ZSTD compression support. + + + + diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 9dcd54fcbd..c980444233 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -351,6 +351,7 @@ XGETTEXT = @XGETTEXT@ GZIP = gzip BZIP2 = bzip2 LZ4 = @LZ4@ +ZSTD = @ZSTD@ DOWNLOAD = wget -O $@ --no-use-server-timestamps #DOWNLOAD = curl -o $@ diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 12aac8616e..635fbb2181 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -352,6 +352,9 @@ /* Define to 1 if you have the `z' library (-lz). */ #undef HAVE_LIBZ +/* Define to 1 if you have the `zstd' library (-lzstd). */ +#undef HAVE_LIBZSTD + /* Define to 1 if you have the `link' function. */ #undef HAVE_LINK @@ -952,6 +955,9 @@ /* Define to select Win32-style shared memory. */ #undef USE_WIN32_SHARED_MEMORY +/* Define to 1 to build with ZSTD support. (--with-zstd) */ +#undef USE_ZSTD + /* Define to 1 if `wcstombs_l' requires . */ #undef WCSTOMBS_L_IN_XLOCALE diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index 439809fcd0..a21ea9bef9 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -311,6 +311,7 @@ sub GenerateFiles HAVE_LIBXML2 => undef, HAVE_LIBXSLT => undef, HAVE_LIBZ => $self->{options}->{zlib} ? 1 : undef, + HAVE_LIBZSTD => undef, HAVE_LINK => undef, HAVE_LOCALE_T => 1, HAVE_LONG_INT_64 => undef, @@ -507,6 +508,7 @@ sub GenerateFiles USE_UNNAMED_POSIX_SEMAPHORES => undef, USE_WIN32_SEMAPHORES => 1, USE_WIN32_SHARED_MEMORY => 1, + USE_ZSTD => undef, WCSTOMBS_L_IN_XLOCALE => undef, WORDS_BIGENDIAN => undef, XLOG_BLCKSZ => 1024 * $self->{options}->{wal_blocksize}, @@ -540,6 +542,11 @@ sub GenerateFiles $define{HAVE_LZ4_H} = 1; $define{USE_LZ4} = 1; } + if ($self->{options}->{zstd}) + { + $define{HAVE_LIBZSTD} = 1; + $define{USE_ZSTD} = 1; + } if ($self->{options}->{openssl}) { $define{USE_OPENSSL} = 1; @@ -1082,6 +1089,11 @@ sub AddProject $proj->AddIncludeDir($self->{options}->{lz4} . '\include'); $proj->AddLibrary($self->{options}->{lz4} . '\lib\liblz4.lib'); } + if ($self->{options}->{zstd}) + { + $proj->AddIncludeDir($self->{options}->{zstd} . '\include'); + $proj->AddLibrary($self->{options}->{zstd} . '\lib\libzstd.lib'); + } if ($self->{options}->{uuid}) { $proj->AddIncludeDir($self->{options}->{uuid} . '\include'); @@ -1194,6 +1206,7 @@ sub GetFakeConfigure $cfg .= ' --with-libxml' if ($self->{options}->{xml}); $cfg .= ' --with-libxslt' if ($self->{options}->{xslt}); $cfg .= ' --with-lz4' if ($self->{options}->{lz4}); + $cfg .= ' --with-zstd' if ($self->{options}->{zstd}); $cfg .= ' --with-gssapi' if ($self->{options}->{gss}); $cfg .= ' --with-icu' if ($self->{options}->{icu}); $cfg .= ' --with-tcl' if ($self->{options}->{tcl}); diff --git a/src/tools/msvc/config_default.pl b/src/tools/msvc/config_default.pl index 7a9b00be72..186849a09a 100644 --- a/src/tools/msvc/config_default.pl +++ b/src/tools/msvc/config_default.pl @@ -15,6 +15,7 @@ gss => undef, # --with-gssapi= icu => undef, # --with-icu= lz4 => undef, # --with-lz4= + zstd => undef, # --with-zstd= nls => undef, # --enable-nls= tap_tests => undef, # --enable-tap-tests tcl => undef, # --with-tcl= diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl index a994626239..e2b0db0879 100644 --- a/src/tools/msvc/vcregress.pl +++ b/src/tools/msvc/vcregress.pl @@ -36,6 +36,7 @@ $ENV{GZIP_PROGRAM} ||= 'gzip'; $ENV{LZ4} ||= 'lz4'; $ENV{TAR} ||= 'tar'; +$ENV{ZSTD} ||= 'zstd'; # buildenv.pl is for specifying the build environment settings # it should contain lines like: From 618c16707a6d6e8f5c83ede2092975e4670201ad Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 18 Feb 2022 15:35:15 -0500 Subject: [PATCH 016/772] Rearrange libpq's error reporting to avoid duplicated error text. Since commit ffa2e4670, libpq accumulates text in conn->errorMessage across a whole query cycle. In some situations, we may report more than one error event within a cycle: the easiest case to reach is where we report a FATAL error message from the server, and then a bit later we detect loss of connection. Since, historically, each error PGresult bears the entire content of conn->errorMessage, this results in duplication of the FATAL message in any output that concatenates the contents of the PGresults. Accumulation in errorMessage still seems like a good idea, especially in view of the number of places that did ad-hoc error concatenation before ffa2e4670. So to fix this, let's track how much of conn->errorMessage has been read out into error PGresults, and only include new text in later PGresults. The tricky part of that is to be sure that we never discard an error PGresult once made (else we'd risk dropping some text, a problem much worse than duplication). While libpq formerly did that in some code paths, a little bit of rearrangement lets us postpone making an error PGresult at all until we are about to return it. A side benefit of that postponement is that it now becomes practical to return a dummy static PGresult in cases where we hit out-of-memory while trying to manufacture an error PGresult. This eliminates the admittedly-very-rare case where we'd return NULL from PQgetResult, indicating successful query completion, even though what actually happened was an OOM failure. Discussion: https://postgr.es/m/ab4288f8-be5c-57fb-2400-e3e857f53e46@enterprisedb.com --- .../expected/slot_creation_error.out | 1 - src/interfaces/libpq/fe-auth.c | 2 +- src/interfaces/libpq/fe-connect.c | 8 +- src/interfaces/libpq/fe-exec.c | 180 ++++++++++++++---- src/interfaces/libpq/fe-lobj.c | 17 +- src/interfaces/libpq/fe-protocol3.c | 55 ++++-- src/interfaces/libpq/libpq-int.h | 26 ++- 7 files changed, 224 insertions(+), 65 deletions(-) diff --git a/contrib/test_decoding/expected/slot_creation_error.out b/contrib/test_decoding/expected/slot_creation_error.out index 321648c339..043bdae0a2 100644 --- a/contrib/test_decoding/expected/slot_creation_error.out +++ b/contrib/test_decoding/expected/slot_creation_error.out @@ -98,7 +98,6 @@ t step s2_init: <... completed> FATAL: terminating connection due to administrator command -FATAL: terminating connection due to administrator command server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. diff --git a/src/interfaces/libpq/fe-auth.c b/src/interfaces/libpq/fe-auth.c index f8f4111fef..6fceff561b 100644 --- a/src/interfaces/libpq/fe-auth.c +++ b/src/interfaces/libpq/fe-auth.c @@ -1237,7 +1237,7 @@ PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user, if (!conn) return NULL; - resetPQExpBuffer(&conn->errorMessage); + pqClearConnErrorState(conn); /* If no algorithm was given, ask the server. */ if (algorithm == NULL) diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 9c9416e8ff..2a3d68b4d1 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -3685,7 +3685,7 @@ PQconnectPoll(PGconn *conn) * (and it seems some clients expect it to be empty after a * successful connection). */ - resetPQExpBuffer(&conn->errorMessage); + pqClearConnErrorState(conn); /* We are open for business! */ conn->status = CONNECTION_OK; @@ -4231,7 +4231,7 @@ closePGconn(PGconn *conn) /* * Close the connection, reset all transient state, flush I/O buffers. - * Note that this includes clearing conn->errorMessage; we're no longer + * Note that this includes clearing conn's error state; we're no longer * interested in any failures associated with the old connection, and we * want a clean slate for any new connection attempt. */ @@ -4241,7 +4241,7 @@ closePGconn(PGconn *conn) conn->xactStatus = PQTRANS_IDLE; conn->pipelineStatus = PQ_PIPELINE_OFF; pqClearAsyncResult(conn); /* deallocate result */ - resetPQExpBuffer(&conn->errorMessage); + pqClearConnErrorState(conn); release_conn_addrinfo(conn); /* Reset all state obtained from server, too */ @@ -5236,7 +5236,7 @@ ldapServiceLookup(const char *purl, PQconninfoOption *options, * Returns 0 on success, nonzero on failure. On failure, if errorMessage * isn't null, also store an error message there. (Note: the only reason * this function and related ones don't dump core on errorMessage == NULL - * is the undocumented fact that printfPQExpBuffer does nothing when passed + * is the undocumented fact that appendPQExpBuffer does nothing when passed * a null PQExpBuffer pointer.) */ static int diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index c7c48d07dc..45dddaf556 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -44,6 +44,13 @@ char *const pgresStatus[] = { "PGRES_PIPELINE_ABORTED" }; +/* We return this if we're unable to make a PGresult at all */ +static const PGresult OOM_result = { + .resultStatus = PGRES_FATAL_ERROR, + .client_encoding = PG_SQL_ASCII, + .errMsg = "out of memory\n", +}; + /* * static state needed by PQescapeString and PQescapeBytea; initialize to * values that result in backward-compatible behavior @@ -141,6 +148,10 @@ static int pqPipelineFlush(PGconn *conn); * returns a newly allocated, initialized PGresult with given status. * If conn is not NULL and status indicates an error, the conn's * errorMessage is copied. Also, any PGEvents are copied from the conn. + * + * Note: the logic to copy the conn's errorMessage is now vestigial; + * no internal caller uses it. However, that behavior is documented for + * outside callers, so we'd better keep it. */ PGresult * PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status) @@ -191,7 +202,8 @@ PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status) /* non-error cases */ break; default: - pqSetResultError(result, &conn->errorMessage); + /* we intentionally do not use or modify errorReported here */ + pqSetResultError(result, &conn->errorMessage, 0); break; } @@ -235,8 +247,12 @@ PQsetResultAttrs(PGresult *res, int numAttributes, PGresAttDesc *attDescs) { int i; + /* Fail if argument is NULL or OOM_result */ + if (!res || (const PGresult *) res == &OOM_result) + return false; + /* If attrs already exist, they cannot be overwritten. */ - if (!res || res->numAttributes > 0) + if (res->numAttributes > 0) return false; /* ignore no-op request */ @@ -435,7 +451,11 @@ PQsetvalue(PGresult *res, int tup_num, int field_num, char *value, int len) PGresAttValue *attval; const char *errmsg = NULL; - /* Note that this check also protects us against null "res" */ + /* Fail if argument is NULL or OOM_result */ + if (!res || (const PGresult *) res == &OOM_result) + return false; + + /* Invalid field_num? */ if (!check_field_number(res, field_num)) return false; @@ -519,6 +539,10 @@ PQsetvalue(PGresult *res, int tup_num, int field_num, char *value, int len) void * PQresultAlloc(PGresult *res, size_t nBytes) { + /* Fail if argument is NULL or OOM_result */ + if (!res || (const PGresult *) res == &OOM_result) + return NULL; + return pqResultAlloc(res, nBytes, true); } @@ -657,9 +681,12 @@ pqResultStrdup(PGresult *res, const char *str) /* * pqSetResultError - * assign a new error message to a PGresult + * + * Copy text from errorMessage buffer beginning at given offset + * (it's caller's responsibility that offset is valid) */ void -pqSetResultError(PGresult *res, PQExpBuffer errorMessage) +pqSetResultError(PGresult *res, PQExpBuffer errorMessage, int offset) { char *msg; @@ -674,7 +701,7 @@ pqSetResultError(PGresult *res, PQExpBuffer errorMessage) * at a constant "out of memory" string. */ if (!PQExpBufferBroken(errorMessage)) - msg = pqResultStrdup(res, errorMessage->data); + msg = pqResultStrdup(res, errorMessage->data + offset); else msg = NULL; if (msg) @@ -693,9 +720,14 @@ PQclear(PGresult *res) PGresult_data *block; int i; + /* As a convenience, do nothing for a NULL pointer */ if (!res) return; + /* Also, do nothing if the argument is OOM_result */ + if ((const PGresult *) res == &OOM_result) + return; + /* Close down any events we may have */ for (i = 0; i < res->nEvents; i++) { /* only send DESTROY to successfully-initialized event procs */ @@ -748,24 +780,39 @@ pqClearAsyncResult(PGconn *conn) if (conn->result) PQclear(conn->result); conn->result = NULL; + conn->error_result = false; if (conn->next_result) PQclear(conn->next_result); conn->next_result = NULL; } /* - * This subroutine deletes any existing async result, sets conn->result - * to a PGresult with status PGRES_FATAL_ERROR, and stores the current - * contents of conn->errorMessage into that result. + * pqSaveErrorResult - + * remember that we have an error condition + * + * In much of libpq, reporting an error just requires appending text to + * conn->errorMessage and returning a failure code to one's caller. + * Where returning a failure code is impractical, instead call this + * function to remember that an error needs to be reported. + * + * (It might seem that appending text to conn->errorMessage should be + * sufficient, but we can't rely on that working under out-of-memory + * conditions. The OOM hazard is also why we don't try to make a new + * PGresult right here.) */ void pqSaveErrorResult(PGconn *conn) { + /* Drop any pending result ... */ pqClearAsyncResult(conn); - conn->result = PQmakeEmptyPGresult(conn, PGRES_FATAL_ERROR); + /* ... and set flag to remember to make an error result later */ + conn->error_result = true; } /* + * pqSaveWriteError - + * report a write failure + * * As above, after appending conn->write_err_msg to whatever other error we * have. This is used when we've detected a write failure and have exhausted * our chances of reporting something else instead. @@ -792,24 +839,79 @@ pqSaveWriteError(PGconn *conn) } /* - * This subroutine prepares an async result object for return to the caller. + * pqPrepareAsyncResult - + * prepare the current async result object for return to the caller + * * If there is not already an async result object, build an error object * using whatever is in conn->errorMessage. In any case, clear the async - * result storage. + * result storage, and update our notion of how much error text has been + * returned to the application. */ PGresult * pqPrepareAsyncResult(PGconn *conn) { PGresult *res; - /* - * conn->result is the PGresult to return. If it is NULL (which probably - * shouldn't happen) we assume there is an appropriate error message in - * conn->errorMessage. - */ res = conn->result; - if (!res) - res = PQmakeEmptyPGresult(conn, PGRES_FATAL_ERROR); + if (res) + { + /* + * If the pre-existing result is an ERROR (presumably something + * received from the server), assume that it represents whatever is in + * conn->errorMessage, and advance errorReported. + */ + if (res->resultStatus == PGRES_FATAL_ERROR) + conn->errorReported = conn->errorMessage.len; + } + else + { + /* + * We get here after internal-to-libpq errors. We should probably + * always have error_result = true, but if we don't, gin up some error + * text. + */ + if (!conn->error_result) + appendPQExpBufferStr(&conn->errorMessage, + libpq_gettext("no error text available\n")); + + /* Paranoia: be sure errorReported offset is sane */ + if (conn->errorReported < 0 || + conn->errorReported >= conn->errorMessage.len) + conn->errorReported = 0; + + /* + * Make a PGresult struct for the error. We temporarily lie about the + * result status, so that PQmakeEmptyPGresult doesn't uselessly copy + * all of conn->errorMessage. + */ + res = PQmakeEmptyPGresult(conn, PGRES_EMPTY_QUERY); + if (res) + { + /* + * Report whatever new error text we have, and advance + * errorReported. + */ + res->resultStatus = PGRES_FATAL_ERROR; + pqSetResultError(res, &conn->errorMessage, conn->errorReported); + conn->errorReported = conn->errorMessage.len; + } + else + { + /* + * Ouch, not enough memory for a PGresult. Fortunately, we have a + * card up our sleeve: we can use the static OOM_result. Casting + * away const here is a bit ugly, but it seems best to declare + * OOM_result as const, in hopes it will be allocated in read-only + * storage. + */ + res = unconstify(PGresult *, &OOM_result); + + /* + * Don't advance errorReported. Perhaps we'll be able to report + * the text later. + */ + } + } /* * Replace conn->result with next_result, if any. In the normal case @@ -818,6 +920,7 @@ pqPrepareAsyncResult(PGconn *conn) * it was before we created the current single-row result. */ conn->result = conn->next_result; + conn->error_result = false; /* next_result is never an error */ conn->next_result = NULL; return res; @@ -1278,7 +1381,7 @@ pqAppendCmdQueueEntry(PGconn *conn, PGcmdQueueEntry *entry) */ if (conn->asyncStatus == PGASYNC_IDLE) { - resetPQExpBuffer(&conn->errorMessage); + pqClearConnErrorState(conn); pqPipelineProcessQueue(conn); } break; @@ -1626,10 +1729,10 @@ PQsendQueryStart(PGconn *conn, bool newQuery) return false; /* - * If this is the beginning of a query cycle, reset the error buffer. + * If this is the beginning of a query cycle, reset the error state. */ if (newQuery) - resetPQExpBuffer(&conn->errorMessage); + pqClearConnErrorState(conn); /* Don't try to send if we know there's no live connection. */ if (conn->status != CONNECTION_OK) @@ -1687,8 +1790,8 @@ PQsendQueryStart(PGconn *conn, bool newQuery) /* reset single-row processing mode */ conn->singleRowMode = false; - } + /* ready to send command message */ return true; } @@ -1884,7 +1987,7 @@ PQsetSingleRowMode(PGconn *conn) (conn->cmd_queue_head->queryclass != PGQUERY_SIMPLE && conn->cmd_queue_head->queryclass != PGQUERY_EXTENDED)) return 0; - if (conn->result) + if (conn->result || conn->error_result) return 0; /* OK, set flag */ @@ -2015,10 +2118,7 @@ PQgetResult(PGconn *conn) pqWait(true, false, conn) || pqReadData(conn) < 0) { - /* - * conn->errorMessage has been set by pqWait or pqReadData. We - * want to append it to any already-received error message. - */ + /* Report the error saved by pqWait or pqReadData */ pqSaveErrorResult(conn); conn->asyncStatus = PGASYNC_IDLE; return pqPrepareAsyncResult(conn); @@ -2053,7 +2153,7 @@ PQgetResult(PGconn *conn) * is the start of the results of the next query, clear any * prior error message. */ - resetPQExpBuffer(&conn->errorMessage); + pqClearConnErrorState(conn); pqPipelineProcessQueue(conn); } break; @@ -2117,7 +2217,9 @@ PQgetResult(PGconn *conn) appendPQExpBuffer(&conn->errorMessage, libpq_gettext("unexpected asyncStatus: %d\n"), (int) conn->asyncStatus); - res = PQmakeEmptyPGresult(conn, PGRES_FATAL_ERROR); + pqSaveErrorResult(conn); + conn->asyncStatus = PGASYNC_IDLE; /* try to restore valid state */ + res = pqPrepareAsyncResult(conn); break; } @@ -2268,9 +2370,9 @@ PQexecStart(PGconn *conn) } /* - * Since this is the beginning of a query cycle, reset the error buffer. + * Since this is the beginning of a query cycle, reset the error state. */ - resetPQExpBuffer(&conn->errorMessage); + pqClearConnErrorState(conn); /* * Silently discard any prior query result that application didn't eat. @@ -2825,9 +2927,9 @@ PQfn(PGconn *conn, return NULL; /* - * Since this is the beginning of a query cycle, reset the error buffer. + * Since this is the beginning of a query cycle, reset the error state. */ - resetPQExpBuffer(&conn->errorMessage); + pqClearConnErrorState(conn); if (conn->pipelineStatus != PQ_PIPELINE_OFF) { @@ -2837,7 +2939,7 @@ PQfn(PGconn *conn, } if (conn->sock == PGINVALID_SOCKET || conn->asyncStatus != PGASYNC_IDLE || - conn->result != NULL) + conn->result || conn->error_result) { appendPQExpBufferStr(&conn->errorMessage, libpq_gettext("connection in wrong state\n")); @@ -3707,9 +3809,9 @@ PQsetnonblocking(PGconn *conn, int arg) * behavior. this is ok because either they are making a transition _from_ * or _to_ blocking mode, either way we can block them. * - * Clear errorMessage in case pqFlush adds to it. + * Clear error state in case pqFlush adds to it. */ - resetPQExpBuffer(&conn->errorMessage); + pqClearConnErrorState(conn); /* if we are going from blocking to non-blocking flush here */ if (pqFlush(conn)) @@ -3901,7 +4003,7 @@ PQescapeStringConn(PGconn *conn, return 0; } - resetPQExpBuffer(&conn->errorMessage); + pqClearConnErrorState(conn); return PQescapeStringInternal(conn, to, from, length, error, conn->client_encoding, @@ -3939,7 +4041,7 @@ PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident) if (!conn) return NULL; - resetPQExpBuffer(&conn->errorMessage); + pqClearConnErrorState(conn); /* Scan the string for characters that must be escaped. */ for (s = str; (s - str) < len && *s != '\0'; ++s) @@ -4204,7 +4306,7 @@ PQescapeByteaConn(PGconn *conn, if (!conn) return NULL; - resetPQExpBuffer(&conn->errorMessage); + pqClearConnErrorState(conn); return PQescapeByteaInternal(conn, from, from_length, to_length, conn->std_strings, diff --git a/src/interfaces/libpq/fe-lobj.c b/src/interfaces/libpq/fe-lobj.c index 48399a90cb..075a5ed85b 100644 --- a/src/interfaces/libpq/fe-lobj.c +++ b/src/interfaces/libpq/fe-lobj.c @@ -665,8 +665,8 @@ lo_import_internal(PGconn *conn, const char *filename, Oid oid) if (conn == NULL) return InvalidOid; - /* Since this is the beginning of a query cycle, reset the error buffer */ - resetPQExpBuffer(&conn->errorMessage); + /* Since this is the beginning of a query cycle, reset the error state */ + pqClearConnErrorState(conn); /* * open the file to be read in @@ -730,7 +730,8 @@ lo_import_internal(PGconn *conn, const char *filename, Oid oid) (void) lo_close(conn, lobj); (void) close(fd); /* deliberately overwrite any error from lo_close */ - printfPQExpBuffer(&conn->errorMessage, + pqClearConnErrorState(conn); + appendPQExpBuffer(&conn->errorMessage, libpq_gettext("could not read from file \"%s\": %s\n"), filename, strerror_r(save_errno, sebuf, sizeof(sebuf))); @@ -785,7 +786,8 @@ lo_export(PGconn *conn, Oid lobjId, const char *filename) (void) lo_close(conn, lobj); /* deliberately overwrite any error from lo_close */ - printfPQExpBuffer(&conn->errorMessage, + pqClearConnErrorState(conn); + appendPQExpBuffer(&conn->errorMessage, libpq_gettext("could not open file \"%s\": %s\n"), filename, strerror_r(save_errno, sebuf, sizeof(sebuf))); @@ -806,7 +808,8 @@ lo_export(PGconn *conn, Oid lobjId, const char *filename) (void) lo_close(conn, lobj); (void) close(fd); /* deliberately overwrite any error from lo_close */ - printfPQExpBuffer(&conn->errorMessage, + pqClearConnErrorState(conn); + appendPQExpBuffer(&conn->errorMessage, libpq_gettext("could not write to file \"%s\": %s\n"), filename, strerror_r(save_errno, sebuf, sizeof(sebuf))); @@ -863,8 +866,8 @@ lo_initialize(PGconn *conn) if (conn == NULL) return -1; - /* Since this is the beginning of a query cycle, reset the error buffer */ - resetPQExpBuffer(&conn->errorMessage); + /* Since this is the beginning of a query cycle, reset the error state */ + pqClearConnErrorState(conn); /* Nothing else to do if we already collected info */ if (conn->lobjfuncs != NULL) diff --git a/src/interfaces/libpq/fe-protocol3.c b/src/interfaces/libpq/fe-protocol3.c index 26dbeaed97..94b4a448b9 100644 --- a/src/interfaces/libpq/fe-protocol3.c +++ b/src/interfaces/libpq/fe-protocol3.c @@ -316,8 +316,9 @@ pqParseInput3(PGconn *conn) return; break; case 'T': /* Row Description */ - if (conn->result != NULL && - conn->result->resultStatus == PGRES_FATAL_ERROR) + if (conn->error_result || + (conn->result != NULL && + conn->result->resultStatus == PGRES_FATAL_ERROR)) { /* * We've already choked for some reason. Just discard @@ -387,8 +388,9 @@ pqParseInput3(PGconn *conn) if (getAnotherTuple(conn, msgLength)) return; } - else if (conn->result != NULL && - conn->result->resultStatus == PGRES_FATAL_ERROR) + else if (conn->error_result || + (conn->result != NULL && + conn->result->resultStatus == PGRES_FATAL_ERROR)) { /* * We've already choked for some reason. Just discard @@ -966,10 +968,18 @@ pqGetErrorNotice3(PGconn *conn, bool isError) */ if (isError) { - if (res) - pqSetResultError(res, &workBuf); pqClearAsyncResult(conn); /* redundant, but be safe */ - conn->result = res; + if (res) + { + pqSetResultError(res, &workBuf, 0); + conn->result = res; + } + else + { + /* Fall back to using the internal-error processing paths */ + conn->error_result = true; + } + if (PQExpBufferDataBroken(workBuf)) appendPQExpBufferStr(&conn->errorMessage, libpq_gettext("out of memory\n")); @@ -2116,10 +2126,33 @@ pqFunctionCall3(PGconn *conn, Oid fnid, continue; /* consume the message and exit */ conn->inStart += 5 + msgLength; - /* if we saved a result object (probably an error), use it */ - if (conn->result) - return pqPrepareAsyncResult(conn); - return PQmakeEmptyPGresult(conn, status); + + /* + * If we already have a result object (probably an error), use + * that. Otherwise, if we saw a function result message, + * report COMMAND_OK. Otherwise, the backend violated the + * protocol, so complain. + */ + if (!(conn->result || conn->error_result)) + { + if (status == PGRES_COMMAND_OK) + { + conn->result = PQmakeEmptyPGresult(conn, status); + if (!conn->result) + { + appendPQExpBufferStr(&conn->errorMessage, + libpq_gettext("out of memory\n")); + pqSaveErrorResult(conn); + } + } + else + { + appendPQExpBufferStr(&conn->errorMessage, + libpq_gettext("protocol error: no function result\n")); + pqSaveErrorResult(conn); + } + } + return pqPrepareAsyncResult(conn); case 'S': /* parameter status */ if (getParameterStatus(conn)) continue; diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index 4290553482..e0cee4b142 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -496,8 +496,17 @@ struct pg_conn PGdataValue *rowBuf; /* array for passing values to rowProcessor */ int rowBufLen; /* number of entries allocated in rowBuf */ - /* Status for asynchronous result construction */ + /* + * Status for asynchronous result construction. If result isn't NULL, it + * is a result being constructed or ready to return. If result is NULL + * and error_result is true, then we need to return a PGRES_FATAL_ERROR + * result, but haven't yet constructed it; text for the error has been + * appended to conn->errorMessage. (Delaying construction simplifies + * dealing with out-of-memory cases.) If next_result isn't NULL, it is a + * PGresult that will replace "result" after we return that one. + */ PGresult *result; /* result being constructed */ + bool error_result; /* do we need to make an ERROR result? */ PGresult *next_result; /* next result (used in single-row mode) */ /* Assorted state for SASL, SSL, GSS, etc */ @@ -567,8 +576,14 @@ struct pg_conn * Buffer for current error message. This is cleared at the start of any * connection attempt or query cycle; after that, all code should append * messages to it, never overwrite. + * + * In some situations we might report an error more than once in a query + * cycle. If so, errorMessage accumulates text from all the errors, and + * errorReported tracks how much we've already reported, so that the + * individual error PGresult objects don't contain duplicative text. */ PQExpBufferData errorMessage; /* expansible string */ + int errorReported; /* # bytes of string already reported */ /* Buffer for receiving various parts of messages */ PQExpBufferData workBuffer; /* expansible string */ @@ -644,7 +659,7 @@ extern pgthreadlock_t pg_g_threadlock; /* === in fe-exec.c === */ -extern void pqSetResultError(PGresult *res, PQExpBuffer errorMessage); +extern void pqSetResultError(PGresult *res, PQExpBuffer errorMessage, int offset); extern void *pqResultAlloc(PGresult *res, size_t nBytes, bool isBinary); extern char *pqResultStrdup(PGresult *res, const char *str); extern void pqClearAsyncResult(PGconn *conn); @@ -830,6 +845,13 @@ extern void pqTraceOutputNoTypeByteMessage(PGconn *conn, const char *message); /* === miscellaneous macros === */ +/* + * Reset the conn's error-reporting state. + */ +#define pqClearConnErrorState(conn) \ + (resetPQExpBuffer(&(conn)->errorMessage), \ + (conn)->errorReported = 0) + /* * this is so that we can check if a connection is non-blocking internally * without the overhead of a function call From 07daca53bfcad59618a9c6fad304e380cc9d2bc1 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 19 Feb 2022 14:58:51 +0900 Subject: [PATCH 017/772] Fix inconsistencies in SRF checks of pg_config() and string_to_table() The execution paths of those functions have been using a set of checks inconsistent with any other SRF function: - string_to_table() missed a check on expectedDesc, the tuple descriptor expected by the caller, that should never be NULL. Introduced in 66f1630. - pg_config() should check for a ReturnSetInfo, and expectedDesc cannot be NULL. Its error messages were also inconsistent. Introduced in a5c43b8. Extracted from a larger patch by the same author, in preparation for a larger patch set aimed at refactoring the way tuplestores are created and checked in SRF functions. Author: Melanie Plageman Reviewed-by: Justin Pryzby Discussion: https://postgr.es/m/CAAKRu_azyd1Z3W_r7Ou4sorTjRCs+PxeHw1CWJeXKofkE6TuZg@mail.gmail.com --- src/backend/utils/adt/varlena.c | 3 ++- src/backend/utils/misc/pg_config.c | 12 ++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index eda9c1e42c..b2003f5672 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -4839,7 +4839,8 @@ text_to_table(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsi->allowedModes & SFRM_Materialize)) + if (!(rsi->allowedModes & SFRM_Materialize) || + rsi->expectedDesc == NULL) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("materialize mode required, but it is not allowed in this context"))); diff --git a/src/backend/utils/misc/pg_config.c b/src/backend/utils/misc/pg_config.c index d916d7b2c4..2dc875ebfb 100644 --- a/src/backend/utils/misc/pg_config.c +++ b/src/backend/utils/misc/pg_config.c @@ -37,11 +37,15 @@ pg_config(PG_FUNCTION_ARGS) int i = 0; /* check to see if caller supports us returning a tuplestore */ - if (!rsinfo || !(rsinfo->allowedModes & SFRM_Materialize)) + if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("materialize mode required, but it is not " - "allowed in this context"))); + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("set-valued function called in context that cannot accept a set"))); + if (!(rsinfo->allowedModes & SFRM_Materialize) || + rsinfo->expectedDesc == NULL) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("materialize mode required, but it is not allowed in this context"))); per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; oldcontext = MemoryContextSwitchTo(per_query_ctx); From d7a978601d4e469f1a8f19122c049bb25fd7f096 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 19 Feb 2022 15:06:53 +0900 Subject: [PATCH 018/772] doc: Simplify description of --with-lz4 LZ4 is used in much more areas of the system now than just WAL and table data. This commit simplifies the installation documentation of Windows and *nix by removing any details of the areas extended when building with LZ4. Author: Jeevan Ladhe Discussion: https://postgr.es/m/CANm22Cgny8AF76pitomXp603NagwKXbA4dyN2Fac4yHPebqdqg@mail.gmail.com --- doc/src/sgml/install-windows.sgml | 5 ++--- doc/src/sgml/installation.sgml | 2 -- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index e08c9514d4..98fa6962f6 100644 --- a/doc/src/sgml/install-windows.sgml +++ b/doc/src/sgml/install-windows.sgml @@ -300,9 +300,8 @@ $ENV{MSBFLAGS}="/m"; LZ4 - Required for supporting LZ4 compression - method for compressing table or WAL data. Binaries and source can be - downloaded from + Required for supporting LZ4 compression. + Binaries and source can be downloaded from . diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index 311f7f261d..0f74252590 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -979,8 +979,6 @@ build-postgresql: Build with LZ4 compression support. - This allows the use of LZ4 for - compression of table and WAL data. From 4b35408f1ed59dd590f683ae0f015bbaf3b84d3d Mon Sep 17 00:00:00 2001 From: John Naylor Date: Sun, 20 Feb 2022 13:22:08 +0700 Subject: [PATCH 019/772] Use bitwise rotate functions in more places There were a number of places in the code that used bespoke bit-twiddling expressions to do bitwise rotation. While we've had pg_rotate_right32() for a while now, we hadn't gotten around to standardizing on that. Do so now. Since many potential call sites look more natural with the "left" equivalent, add that function too. Reviewed by Tom Lane and Yugo Nagata Discussion: https://www.postgresql.org/message-id/CAFBsxsH7c1LC0CGZ0ADCBXLHU5-%3DKNXx-r7tHYPAW51b2HK4Qw%40mail.gmail.com --- src/backend/executor/execGrouping.c | 4 ++-- src/backend/executor/nodeHash.c | 4 ++-- src/backend/executor/nodeMemoize.c | 8 ++++---- src/backend/utils/adt/jsonb_util.c | 3 ++- src/backend/utils/adt/multirangetypes.c | 3 ++- src/backend/utils/adt/rangetypes.c | 3 ++- src/backend/utils/cache/catcache.c | 14 ++++---------- src/common/hashfn.c | 4 ++-- src/include/port/pg_bitutils.h | 10 ++++++++-- 9 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/backend/executor/execGrouping.c b/src/backend/executor/execGrouping.c index af6e9c42d8..5da4b37530 100644 --- a/src/backend/executor/execGrouping.c +++ b/src/backend/executor/execGrouping.c @@ -459,8 +459,8 @@ TupleHashTableHash_internal(struct tuplehash_hash *tb, Datum attr; bool isNull; - /* rotate hashkey left 1 bit at each step */ - hashkey = (hashkey << 1) | ((hashkey & 0x80000000) ? 1 : 0); + /* combine successive hashkeys by rotating */ + hashkey = pg_rotate_left32(hashkey, 1); attr = slot_getattr(slot, att, &isNull); diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c index 4d68a8b97b..3510a4247c 100644 --- a/src/backend/executor/nodeHash.c +++ b/src/backend/executor/nodeHash.c @@ -1840,8 +1840,8 @@ ExecHashGetHashValue(HashJoinTable hashtable, Datum keyval; bool isNull; - /* rotate hashkey left 1 bit at each step */ - hashkey = (hashkey << 1) | ((hashkey & 0x80000000) ? 1 : 0); + /* combine successive hashkeys by rotating */ + hashkey = pg_rotate_left32(hashkey, 1); /* * Get the join attribute value of the tuple diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c index 55cdd5c4d9..23441e33ca 100644 --- a/src/backend/executor/nodeMemoize.c +++ b/src/backend/executor/nodeMemoize.c @@ -166,8 +166,8 @@ MemoizeHash_hash(struct memoize_hash *tb, const MemoizeKey *key) { for (int i = 0; i < numkeys; i++) { - /* rotate hashkey left 1 bit at each step */ - hashkey = (hashkey << 1) | ((hashkey & 0x80000000) ? 1 : 0); + /* combine successive hashkeys by rotating */ + hashkey = pg_rotate_left32(hashkey, 1); if (!pslot->tts_isnull[i]) /* treat nulls as having hash key 0 */ { @@ -189,8 +189,8 @@ MemoizeHash_hash(struct memoize_hash *tb, const MemoizeKey *key) for (int i = 0; i < numkeys; i++) { - /* rotate hashkey left 1 bit at each step */ - hashkey = (hashkey << 1) | ((hashkey & 0x80000000) ? 1 : 0); + /* combine successive hashkeys by rotating */ + hashkey = pg_rotate_left32(hashkey, 1); if (!pslot->tts_isnull[i]) /* treat nulls as having hash key 0 */ { diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c index 291fb722e2..60442758b3 100644 --- a/src/backend/utils/adt/jsonb_util.c +++ b/src/backend/utils/adt/jsonb_util.c @@ -18,6 +18,7 @@ #include "common/hashfn.h" #include "common/jsonapi.h" #include "miscadmin.h" +#include "port/pg_bitutils.h" #include "utils/builtins.h" #include "utils/datetime.h" #include "utils/json.h" @@ -1342,7 +1343,7 @@ JsonbHashScalarValue(const JsonbValue *scalarVal, uint32 *hash) * the previous value left 1 bit, then XOR'ing in the new * key/value/element's hash value. */ - *hash = (*hash << 1) | (*hash >> 31); + *hash = pg_rotate_left32(*hash, 1); *hash ^= tmp; } diff --git a/src/backend/utils/adt/multirangetypes.c b/src/backend/utils/adt/multirangetypes.c index 7b86421465..c474b24431 100644 --- a/src/backend/utils/adt/multirangetypes.c +++ b/src/backend/utils/adt/multirangetypes.c @@ -38,6 +38,7 @@ #include "lib/stringinfo.h" #include "libpq/pqformat.h" #include "miscadmin.h" +#include "port/pg_bitutils.h" #include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/rangetypes.h" @@ -2772,7 +2773,7 @@ hash_multirange(PG_FUNCTION_ARGS) /* Merge hashes of flags and bounds */ range_hash = hash_uint32((uint32) flags); range_hash ^= lower_hash; - range_hash = (range_hash << 1) | (range_hash >> 31); + range_hash = pg_rotate_left32(range_hash, 1); range_hash ^= upper_hash; /* diff --git a/src/backend/utils/adt/rangetypes.c b/src/backend/utils/adt/rangetypes.c index c3e6c721e6..cbff4e93d5 100644 --- a/src/backend/utils/adt/rangetypes.c +++ b/src/backend/utils/adt/rangetypes.c @@ -35,6 +35,7 @@ #include "lib/stringinfo.h" #include "libpq/pqformat.h" #include "miscadmin.h" +#include "port/pg_bitutils.h" #include "utils/builtins.h" #include "utils/date.h" #include "utils/lsyscache.h" @@ -1363,7 +1364,7 @@ hash_range(PG_FUNCTION_ARGS) /* Merge hashes of flags and bounds */ result = hash_uint32((uint32) flags); result ^= lower_hash; - result = (result << 1) | (result >> 31); + result = pg_rotate_left32(result, 1); result ^= upper_hash; PG_RETURN_INT32(result); diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c index eb83088089..ec073e1ed0 100644 --- a/src/backend/utils/cache/catcache.c +++ b/src/backend/utils/cache/catcache.c @@ -26,6 +26,7 @@ #include "catalog/pg_type.h" #include "common/hashfn.h" #include "miscadmin.h" +#include "port/pg_bitutils.h" #ifdef CATCACHE_STATS #include "storage/ipc.h" /* for on_proc_exit */ #endif @@ -281,25 +282,18 @@ CatalogCacheComputeHashValue(CatCache *cache, int nkeys, { case 4: oneHash = (cc_hashfunc[3]) (v4); - - hashValue ^= oneHash << 24; - hashValue ^= oneHash >> 8; + hashValue ^= pg_rotate_left32(oneHash, 24); /* FALLTHROUGH */ case 3: oneHash = (cc_hashfunc[2]) (v3); - - hashValue ^= oneHash << 16; - hashValue ^= oneHash >> 16; + hashValue ^= pg_rotate_left32(oneHash, 16); /* FALLTHROUGH */ case 2: oneHash = (cc_hashfunc[1]) (v2); - - hashValue ^= oneHash << 8; - hashValue ^= oneHash >> 24; + hashValue ^= pg_rotate_left32(oneHash, 8); /* FALLTHROUGH */ case 1: oneHash = (cc_hashfunc[0]) (v1); - hashValue ^= oneHash; break; default: diff --git a/src/common/hashfn.c b/src/common/hashfn.c index b7a322073d..8779575b99 100644 --- a/src/common/hashfn.c +++ b/src/common/hashfn.c @@ -24,6 +24,7 @@ #include "postgres.h" #include "common/hashfn.h" +#include "port/pg_bitutils.h" /* @@ -44,8 +45,7 @@ /* Get a bit mask of the bits set in non-uint32 aligned addresses */ #define UINT32_ALIGN_MASK (sizeof(uint32) - 1) -/* Rotate a uint32 value left by k bits - note multiple evaluation! */ -#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) +#define rot(x,k) pg_rotate_left32(x, k) /*---------- * mix -- mix 3 32-bit values reversibly. diff --git a/src/include/port/pg_bitutils.h b/src/include/port/pg_bitutils.h index 44c74fb974..04e58cd1c4 100644 --- a/src/include/port/pg_bitutils.h +++ b/src/include/port/pg_bitutils.h @@ -285,12 +285,18 @@ extern int pg_popcount64(uint64 word); extern uint64 pg_popcount(const char *buf, int bytes); /* - * Rotate the bits of "word" to the right by n bits. + * Rotate the bits of "word" to the right/left by n bits. */ static inline uint32 pg_rotate_right32(uint32 word, int n) { - return (word >> n) | (word << (sizeof(word) * BITS_PER_BYTE - n)); + return (word >> n) | (word << (32 - n)); +} + +static inline uint32 +pg_rotate_left32(uint32 word, int n) +{ + return (word << n) | (word >> (32 - n)); } #endif /* PG_BITUTILS_H */ From 69639e2b5c12c6f1eafa9db1a6b7d16e6471ac61 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Sun, 20 Feb 2022 18:33:09 +0200 Subject: [PATCH 020/772] Fix uninitialized variable. I'm very surprised the compiler didn't warn about it. But Coverity and Valgrind did. --- src/backend/access/transam/xlog.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index ce78ac413e..0d2bd7a357 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -5286,6 +5286,8 @@ StartupXLOG(void) PerformWalRecovery(); performedWalRecovery = true; } + else + performedWalRecovery = false; /* * Finish WAL recovery. From cf12541f2bd5fd34425ecbb99f056a30ca5b7cae Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Fri, 18 Feb 2022 16:59:30 -0500 Subject: [PATCH 021/772] Ensure the right perl is used for TAP tests on msys In particular, perl with $Config{osname} = msys should only be used if the build target is msys (which is currently buildable but not usable). For builds targeted at native Windows, perl from the ucrt64 toolchain is suitable. Discussion: https://postgr.es/m/20220216210141.5glt5isg5qtwty4c@alap3.anarazel.de --- config/check_modules.pl | 5 +++++ configure | 1 + configure.ac | 1 + 3 files changed, 7 insertions(+) diff --git a/config/check_modules.pl b/config/check_modules.pl index cc0a7ab0e7..470c3e9c14 100644 --- a/config/check_modules.pl +++ b/config/check_modules.pl @@ -6,6 +6,7 @@ # use strict; use warnings; +use Config; use IPC::Run 0.79; @@ -19,5 +20,9 @@ diag("Test::More::VERSION: $Test::More::VERSION"); diag("Time::HiRes::VERSION: $Time::HiRes::VERSION"); +# Check that if prove is using msys perl it is for an msys target +ok(($ENV{__CONFIG_HOST_OS__} || "") eq 'msys', + "Msys perl used for correct target") + if $Config{osname} eq 'msys'; ok(1); done_testing(); diff --git a/configure b/configure index ca890b8b07..f3cb5c2b51 100755 --- a/configure +++ b/configure @@ -19758,6 +19758,7 @@ fi # installation than perl, eg on MSys, so we have to check using prove. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl modules required for TAP tests" >&5 $as_echo_n "checking for Perl modules required for TAP tests... " >&6; } + __CONFIG_HOST_OS__=$host_os; export __CONFIG_HOST_OS__ modulestderr=`"$PROVE" "$srcdir/config/check_modules.pl" 2>&1 >/dev/null` if test $? -eq 0; then # log the module version details, but don't show them interactively diff --git a/configure.ac b/configure.ac index 331683b336..19d1a80367 100644 --- a/configure.ac +++ b/configure.ac @@ -2432,6 +2432,7 @@ if test "$enable_tap_tests" = yes; then # AX_PROG_PERL_MODULES here, but prove might be part of a different Perl # installation than perl, eg on MSys, so we have to check using prove. AC_MSG_CHECKING(for Perl modules required for TAP tests) + __CONFIG_HOST_OS__=$host_os; export __CONFIG_HOST_OS__ [modulestderr=`"$PROVE" "$srcdir/config/check_modules.pl" 2>&1 >/dev/null`] if test $? -eq 0; then # log the module version details, but don't show them interactively From 95d981338b241ce1d1b2346cfe2df509bb7243ca Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Fri, 18 Feb 2022 17:00:03 -0500 Subject: [PATCH 022/772] Remove PostgreSQL::Test::Utils::perl2host completely Commit f1ac4a74de disabled this processing, and as nothing has broken (as expected) here we proceed to remove the routine and adjust all the call sites. Backpatch to release 10 Discussion: https://postgr.es/m/0ba775a2-8aa0-0d56-d780-69427cf6f33d@dunslane.net Discussion: https://postgr.es/m/20220125023609.5ohu3nslxgoygihl@alap3.anarazel.de --- src/bin/pg_basebackup/t/010_pg_basebackup.pl | 18 +++--- src/bin/pg_checksums/t/002_actions.pl | 1 - src/bin/pg_verifybackup/t/003_corruption.pl | 4 +- src/bin/pg_verifybackup/t/008_untar.pl | 3 +- src/bin/pgbench/t/001_pgbench_with_server.pl | 4 +- src/bin/scripts/t/090_reindexdb.pl | 1 - .../modules/test_misc/t/002_tablespace.pl | 4 +- src/test/perl/PostgreSQL/Test/Cluster.pm | 4 +- src/test/perl/PostgreSQL/Test/Utils.pm | 58 ------------------- src/test/recovery/t/014_unlogged_reinit.pl | 4 +- src/test/recovery/t/017_shm.pl | 2 +- src/test/recovery/t/018_wal_optimize.pl | 2 - .../recovery/t/025_stuck_on_old_timeline.pl | 2 +- src/test/recovery/t/027_stream_regress.pl | 4 +- src/test/ssl/t/001_ssltests.pl | 4 +- src/test/ssl/t/002_scram.pl | 2 +- src/test/ssl/t/003_sslinfo.pl | 2 +- 17 files changed, 25 insertions(+), 94 deletions(-) diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 8c70e5b32b..75d6810d3e 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -261,13 +261,11 @@ # for the tablespace directories, which hopefully won't run afoul of # the 99 character length limit. my $sys_tempdir = PostgreSQL::Test::Utils::tempdir_short; -my $real_sys_tempdir = PostgreSQL::Test::Utils::perl2host($sys_tempdir) . "/tempdir"; -my $shorter_tempdir = $sys_tempdir . "/tempdir"; -dir_symlink "$tempdir", $shorter_tempdir; +my $real_sys_tempdir = "$sys_tempdir/tempdir"; +dir_symlink "$tempdir", $real_sys_tempdir; mkdir "$tempdir/tblspc1"; my $realTsDir = "$real_sys_tempdir/tblspc1"; -my $real_tempdir = PostgreSQL::Test::Utils::perl2host($tempdir); $node->safe_psql('postgres', "CREATE TABLESPACE tblspc1 LOCATION '$realTsDir';"); $node->safe_psql('postgres', @@ -346,7 +344,7 @@ foreach my $filename (@tempRelationFiles) { append_to_file( - "$shorter_tempdir/tblspc1/$tblSpc1Id/$postgresOid/$filename", + "$real_sys_tempdir/tblspc1/$tblSpc1Id/$postgresOid/$filename", 'TEMP_RELATION'); } @@ -358,7 +356,7 @@ [ @pg_basebackup_defs, '-D', "$tempdir/backup1", '-Fp', - "-T$realTsDir=$real_tempdir/tbackup/tblspc1", + "-T$realTsDir=$tempdir/tbackup/tblspc1", ], 'plain format with tablespaces succeeds with tablespace mapping'); ok(-d "$tempdir/tbackup/tblspc1", 'tablespace was relocated'); @@ -406,7 +404,7 @@ # Also remove temp relation files or tablespace drop will fail. my $filepath = - "$shorter_tempdir/tblspc1/$tblSpc1Id/$postgresOid/$filename"; + "$real_sys_tempdir/tblspc1/$tblSpc1Id/$postgresOid/$filename"; unlink($filepath) or BAIL_OUT("unable to unlink $filepath"); @@ -428,7 +426,7 @@ [ @pg_basebackup_defs, '-D', "$tempdir/backup3", '-Fp', - "-T$realTsDir=$real_tempdir/tbackup/tbl\\=spc2", + "-T$realTsDir=$tempdir/tbackup/tbl\\=spc2", ], 'mapping tablespace with = sign in path'); ok(-d "$tempdir/tbackup/tbl=spc2", 'tablespace with = sign was relocated'); @@ -517,7 +515,7 @@ [ @pg_basebackup_defs, '--target', 'blackhole', '-X', 'none' ], 'backup target blackhole'); $node->command_ok( - [ @pg_basebackup_defs, '--target', "server:$real_tempdir/backuponserver", '-X', 'none' ], + [ @pg_basebackup_defs, '--target', "server:$tempdir/backuponserver", '-X', 'none' ], 'backup target server'); ok(-f "$tempdir/backuponserver/base.tar", 'backup tar was created'); rmtree("$tempdir/backuponserver"); @@ -526,7 +524,7 @@ [qw(createuser --replication --role=pg_write_server_files backupuser)], 'create backup user'); $node->command_ok( - [ @pg_basebackup_defs, '-U', 'backupuser', '--target', "server:$real_tempdir/backuponserver", '-X', 'none' ], + [ @pg_basebackup_defs, '-U', 'backupuser', '--target', "server:$tempdir/backuponserver", '-X', 'none' ], 'backup target server'); ok(-f "$tempdir/backuponserver/base.tar", 'backup tar was created as non-superuser'); rmtree("$tempdir/backuponserver"); diff --git a/src/bin/pg_checksums/t/002_actions.pl b/src/bin/pg_checksums/t/002_actions.pl index 5563244f11..751f732451 100644 --- a/src/bin/pg_checksums/t/002_actions.pl +++ b/src/bin/pg_checksums/t/002_actions.pl @@ -207,7 +207,6 @@ sub check_relation_corruption my $basedir = $node->basedir; my $tablespace_dir = "$basedir/ts_corrupt_dir"; mkdir($tablespace_dir); -$tablespace_dir = PostgreSQL::Test::Utils::perl2host($tablespace_dir); $node->safe_psql('postgres', "CREATE TABLESPACE ts_corrupt LOCATION '$tablespace_dir';"); check_relation_corruption($node, 'corrupt2', 'ts_corrupt'); diff --git a/src/bin/pg_verifybackup/t/003_corruption.pl b/src/bin/pg_verifybackup/t/003_corruption.pl index f402d301ac..406c0c9877 100644 --- a/src/bin/pg_verifybackup/t/003_corruption.pl +++ b/src/bin/pg_verifybackup/t/003_corruption.pl @@ -18,7 +18,7 @@ # Include a user-defined tablespace in the hopes of detecting problems in that # area. -my $source_ts_path = PostgreSQL::Test::Utils::perl2host(PostgreSQL::Test::Utils::tempdir_short()); +my $source_ts_path =PostgreSQL::Test::Utils::tempdir_short(); my $source_ts_prefix = $source_ts_path; $source_ts_prefix =~ s!(^[A-Z]:/[^/]*)/.*!$1!; @@ -107,7 +107,7 @@ # Take a backup and check that it verifies OK. my $backup_path = $primary->backup_dir . '/' . $name; - my $backup_ts_path = PostgreSQL::Test::Utils::perl2host(PostgreSQL::Test::Utils::tempdir_short()); + my $backup_ts_path = PostgreSQL::Test::Utils::tempdir_short(); # The tablespace map parameter confuses Msys2, which tries to mangle # it. Tell it not to. # See https://www.msys2.org/wiki/Porting/#filesystem-namespaces diff --git a/src/bin/pg_verifybackup/t/008_untar.pl b/src/bin/pg_verifybackup/t/008_untar.pl index 6927ca4c74..383203d0b8 100644 --- a/src/bin/pg_verifybackup/t/008_untar.pl +++ b/src/bin/pg_verifybackup/t/008_untar.pl @@ -18,7 +18,6 @@ $primary->start; my $backup_path = $primary->backup_dir . '/server-backup'; -my $real_backup_path = PostgreSQL::Test::Utils::perl2host($backup_path); my $extract_path = $primary->backup_dir . '/extracted-backup'; my @test_configuration = ( @@ -61,7 +60,7 @@ # Take a server-side backup. my @backup = ( 'pg_basebackup', '--no-sync', '-cfast', '--target', - "server:$real_backup_path", '-Xfetch' + "server:$backup_path", '-Xfetch' ); push @backup, @{$tc->{'backup_flags'}}; $primary->command_ok(\@backup, diff --git a/src/bin/pgbench/t/001_pgbench_with_server.pl b/src/bin/pgbench/t/001_pgbench_with_server.pl index 8b03900f32..f1341092fe 100644 --- a/src/bin/pgbench/t/001_pgbench_with_server.pl +++ b/src/bin/pgbench/t/001_pgbench_with_server.pl @@ -19,12 +19,10 @@ # for partitioned tables. my $ts = $node->basedir . '/regress_pgbench_tap_1_ts_dir'; mkdir $ts or die "cannot create directory $ts"; -# this takes care of WIN-specific path issues -my $ets = PostgreSQL::Test::Utils::perl2host($ts); # the next commands will issue a syntax error if the path contains a "'" $node->safe_psql('postgres', - "CREATE TABLESPACE regress_pgbench_tap_1_ts LOCATION '$ets';"); + "CREATE TABLESPACE regress_pgbench_tap_1_ts LOCATION '$ts';"); # Test concurrent OID generation via pg_enum_oid_index. This indirectly # exercises LWLock and spinlock concurrency. diff --git a/src/bin/scripts/t/090_reindexdb.pl b/src/bin/scripts/t/090_reindexdb.pl index 70cd7606dd..398fc4e6bb 100644 --- a/src/bin/scripts/t/090_reindexdb.pl +++ b/src/bin/scripts/t/090_reindexdb.pl @@ -21,7 +21,6 @@ # Create a tablespace for testing. my $tbspace_path = $node->basedir . '/regress_reindex_tbspace'; mkdir $tbspace_path or die "cannot create directory $tbspace_path"; -$tbspace_path = PostgreSQL::Test::Utils::perl2host($tbspace_path); my $tbspace_name = 'reindex_tbspace'; $node->safe_psql('postgres', "CREATE TABLESPACE $tbspace_name LOCATION '$tbspace_path';"); diff --git a/src/test/modules/test_misc/t/002_tablespace.pl b/src/test/modules/test_misc/t/002_tablespace.pl index 6fea419bb8..04e54394c1 100644 --- a/src/test/modules/test_misc/t/002_tablespace.pl +++ b/src/test/modules/test_misc/t/002_tablespace.pl @@ -14,10 +14,10 @@ # Create a couple of directories to use as tablespaces. my $basedir = $node->basedir(); -my $TS1_LOCATION = PostgreSQL::Test::Utils::perl2host("$basedir/ts1"); +my $TS1_LOCATION = "$basedir/ts1"; $TS1_LOCATION =~ s/\/\.\//\//g; # collapse foo/./bar to foo/bar mkdir($TS1_LOCATION); -my $TS2_LOCATION = PostgreSQL::Test::Utils::perl2host("$basedir/ts2"); +my $TS2_LOCATION = "$basedir/ts2"; $TS2_LOCATION =~ s/\/\.\//\//g; mkdir($TS2_LOCATION); diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index ed70eff374..702b4c2b1c 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -1076,7 +1076,7 @@ primary_conninfo='$root_connstr' sub enable_restoring { my ($self, $root_node, $standby) = @_; - my $path = PostgreSQL::Test::Utils::perl2host($root_node->archive_dir); + my $path = $root_node->archive_dir; my $name = $self->name; print "### Enabling WAL restore for node \"$name\"\n"; @@ -1144,7 +1144,7 @@ sub set_standby_mode sub enable_archiving { my ($self) = @_; - my $path = PostgreSQL::Test::Utils::perl2host($self->archive_dir); + my $path = $self->archive_dir; my $name = $self->name; print "### Enabling WAL archiving for node \"$name\"\n"; diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm index 31e2b0315e..fc8ca74194 100644 --- a/src/test/perl/PostgreSQL/Test/Utils.pm +++ b/src/test/perl/PostgreSQL/Test/Utils.pm @@ -24,7 +24,6 @@ PostgreSQL::Test::Utils - helper module for writing PostgreSQL's C tests. # Miscellanea print "on Windows" if $PostgreSQL::Test::Utils::windows_os; - my $path = PostgreSQL::Test::Utils::perl2host($backup_dir); ok(check_mode_recursive($stream_dir, 0700, 0600), "check stream dir permissions"); PostgreSQL::Test::Utils::system_log('pg_ctl', 'kill', 'QUIT', $slow_pid); @@ -297,61 +296,6 @@ sub tempdir_short =pod -=item perl2host() - -Translate a virtual file name to a host file name. Currently, this is a no-op -except for the case of Perl=msys and host=mingw32. The subject need not -exist, but its parent or grandparent directory must exist unless cygpath is -available. - -The returned path uses forward slashes but has no trailing slash. - -=cut - -sub perl2host -{ - my ($subject) = @_; - return $subject; - if ($is_msys2) - { - # get absolute, windows type path - my $path = qx{cygpath -a -m "$subject"}; - if (!$?) - { - chomp $path; - $path =~ s!/$!!; - return $path if $path; - } - # fall through if this didn't work. - } - my $here = cwd; - my $leaf; - if (chdir $subject) - { - $leaf = ''; - } - else - { - $leaf = '/' . basename $subject; - my $parent = dirname $subject; - if (!chdir $parent) - { - $leaf = '/' . basename($parent) . $leaf; - $parent = dirname $parent; - chdir $parent or die "could not chdir \"$parent\": $!"; - } - } - - # this odd way of calling 'pwd -W' is the only way that seems to work. - my $dir = qx{sh -c "pwd -W"}; - chomp $dir; - $dir =~ s!/$!!; - chdir $here; - return $dir . $leaf; -} - -=pod - =item has_wal_read_bug() Returns true if $tmp_check is subject to a sparc64+ext4 bug that causes WAL @@ -727,8 +671,6 @@ sub dir_symlink my $newname = shift; if ($windows_os) { - $oldname = perl2host($oldname); - $newname = perl2host($newname); $oldname =~ s,/,\\,g; $newname =~ s,/,\\,g; my $cmd = qq{mklink /j "$newname" "$oldname"}; diff --git a/src/test/recovery/t/014_unlogged_reinit.pl b/src/test/recovery/t/014_unlogged_reinit.pl index da77c1211f..f3199fbd2e 100644 --- a/src/test/recovery/t/014_unlogged_reinit.pl +++ b/src/test/recovery/t/014_unlogged_reinit.pl @@ -33,9 +33,7 @@ my $tablespaceDir = PostgreSQL::Test::Utils::tempdir; -my $realTSDir = PostgreSQL::Test::Utils::perl2host($tablespaceDir); - -$node->safe_psql('postgres', "CREATE TABLESPACE ts1 LOCATION '$realTSDir'"); +$node->safe_psql('postgres', "CREATE TABLESPACE ts1 LOCATION '$tablespaceDir'"); $node->safe_psql('postgres', 'CREATE UNLOGGED TABLE ts1_unlogged (id int) TABLESPACE ts1'); diff --git a/src/test/recovery/t/017_shm.pl b/src/test/recovery/t/017_shm.pl index 678a252165..88f9e2b9cd 100644 --- a/src/test/recovery/t/017_shm.pl +++ b/src/test/recovery/t/017_shm.pl @@ -112,7 +112,7 @@ sub log_ipcs $gnat->start; log_ipcs(); -my $regress_shlib = PostgreSQL::Test::Utils::perl2host($ENV{REGRESS_SHLIB}); +my $regress_shlib = $ENV{REGRESS_SHLIB}; $gnat->safe_psql('postgres', <basedir . '/tablespace_other'; mkdir($tablespace_dir); - $tablespace_dir = PostgreSQL::Test::Utils::perl2host($tablespace_dir); my $result; # Test redo of CREATE TABLESPACE. @@ -152,7 +151,6 @@ sub run_wal_optimize $copy_file, qq(20000,30000 20001,30001 20002,30002)); - $copy_file = PostgreSQL::Test::Utils::perl2host($copy_file); # Test truncation with inserted tuples using both INSERT and COPY. Tuples # inserted after the truncation should be seen. diff --git a/src/test/recovery/t/025_stuck_on_old_timeline.pl b/src/test/recovery/t/025_stuck_on_old_timeline.pl index d113c8cc9c..fd821242e8 100644 --- a/src/test/recovery/t/025_stuck_on_old_timeline.pl +++ b/src/test/recovery/t/025_stuck_on_old_timeline.pl @@ -28,7 +28,7 @@ # Note: consistent use of forward slashes here avoids any escaping problems # that arise from use of backslashes. That means we need to double-quote all # the paths in the archive_command -my $perlbin = PostgreSQL::Test::Utils::perl2host($^X); +my $perlbin = $^X; $perlbin =~ s!\\!/!g if $PostgreSQL::Test::Utils::windows_os; my $archivedir_primary = $node_primary->archive_dir; $archivedir_primary =~ s!\\!/!g if $PostgreSQL::Test::Utils::windows_os; diff --git a/src/test/recovery/t/027_stream_regress.pl b/src/test/recovery/t/027_stream_regress.pl index 4f82a54f93..c40951b7ba 100644 --- a/src/test/recovery/t/027_stream_regress.pl +++ b/src/test/recovery/t/027_stream_regress.pl @@ -48,8 +48,8 @@ 'max_standby_streaming_delay = 600s'); $node_standby_1->start; -my $dlpath = PostgreSQL::Test::Utils::perl2host(dirname($ENV{REGRESS_SHLIB})); -my $outputdir = PostgreSQL::Test::Utils::perl2host($PostgreSQL::Test::Utils::tmp_check); +my $dlpath = dirname($ENV{REGRESS_SHLIB}); +my $outputdir = $PostgreSQL::Test::Utils::tmp_check; # Run the regression tests against the primary. my $extra_opts = $ENV{EXTRA_REGRESS_OPTS} || ""; diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl index b8f8b65a8f..5c5b16fbe7 100644 --- a/src/test/ssl/t/001_ssltests.pl +++ b/src/test/ssl/t/001_ssltests.pl @@ -51,7 +51,7 @@ "couldn't copy ssl/$keyfile to $cert_tempdir/$keyfile for permissions change: $!"; chmod 0600, "$cert_tempdir/$keyfile" or die "failed to change permissions on $cert_tempdir/$keyfile: $!"; - $key{$keyfile} = PostgreSQL::Test::Utils::perl2host("$cert_tempdir/$keyfile"); + $key{$keyfile} = "$cert_tempdir/$keyfile"; $key{$keyfile} =~ s!\\!/!g if $PostgreSQL::Test::Utils::windows_os; } @@ -63,7 +63,7 @@ "couldn't copy ssl/client_key to $cert_tempdir/client_wrongperms.key for permission change: $!"; chmod 0644, "$cert_tempdir/client_wrongperms.key" or die "failed to change permissions on $cert_tempdir/client_wrongperms.key: $!"; -$key{'client_wrongperms.key'} = PostgreSQL::Test::Utils::perl2host("$cert_tempdir/client_wrongperms.key"); +$key{'client_wrongperms.key'} = "$cert_tempdir/client_wrongperms.key"; $key{'client_wrongperms.key'} =~ s!\\!/!g if $PostgreSQL::Test::Utils::windows_os; #### Set up the server. diff --git a/src/test/ssl/t/002_scram.pl b/src/test/ssl/t/002_scram.pl index 41d231c55d..4decd7a506 100644 --- a/src/test/ssl/t/002_scram.pl +++ b/src/test/ssl/t/002_scram.pl @@ -94,7 +94,7 @@ # be used in a different test, so the name of this temporary client key # is chosen here to be unique. my $cert_tempdir = PostgreSQL::Test::Utils::tempdir(); -my $client_tmp_key = PostgreSQL::Test::Utils::perl2host("$cert_tempdir/client_scram.key"); +my $client_tmp_key = "$cert_tempdir/client_scram.key"; copy("ssl/client.key", "$cert_tempdir/client_scram.key") or die "couldn't copy ssl/client_key to $cert_tempdir/client_scram.key for permission change: $!"; diff --git a/src/test/ssl/t/003_sslinfo.pl b/src/test/ssl/t/003_sslinfo.pl index f008ea6594..95742081f3 100644 --- a/src/test/ssl/t/003_sslinfo.pl +++ b/src/test/ssl/t/003_sslinfo.pl @@ -34,7 +34,7 @@ # The client's private key must not be world-readable, so take a copy # of the key stored in the code tree and update its permissions. my $cert_tempdir = PostgreSQL::Test::Utils::tempdir(); -my $client_tmp_key = PostgreSQL::Test::Utils::perl2host("$cert_tempdir/client_ext.key"); +my $client_tmp_key = "$cert_tempdir/client_ext.key"; copy("ssl/client_ext.key", "$cert_tempdir/client_ext.key") or die "couldn't copy ssl/client_ext.key to $cert_tempdir/client_ext.key for permissions change: $!"; From 1c6d4629394d1b696b4e47ab4c501752e8c974e7 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Sun, 20 Feb 2022 11:47:56 -0500 Subject: [PATCH 023/772] Remove most msys special processing in TAP tests Following migration of Windows buildfarm members running TAP tests to use of ucrt64 perl for those tests, special processing for msys perl is no longer necessary and so is removed. Backpatch to release 10 Discussion: https://postgr.es/m/c65a8781-77ac-ea95-d185-6db291e1baeb@dunslane.net --- src/bin/pg_ctl/t/001_start_stop.pl | 11 +---------- src/bin/pg_rewind/t/RewindTest.pm | 1 - src/test/perl/PostgreSQL/Test/Cluster.pm | 15 +-------------- src/test/perl/PostgreSQL/Test/Utils.pm | 6 ------ src/test/recovery/t/021_row_visibility.pl | 3 --- src/test/recovery/t/cp_history_files | 7 ------- 6 files changed, 2 insertions(+), 41 deletions(-) diff --git a/src/bin/pg_ctl/t/001_start_stop.pl b/src/bin/pg_ctl/t/001_start_stop.pl index 7d3fbc3f6a..3b45390ced 100644 --- a/src/bin/pg_ctl/t/001_start_stop.pl +++ b/src/bin/pg_ctl/t/001_start_stop.pl @@ -47,16 +47,7 @@ 'pg_ctl', 'start', '-D', "$tempdir/data", '-l', "$PostgreSQL::Test::Utils::log_path/001_start_stop_server.log" ]; -if ($Config{osname} ne 'msys') -{ - command_like($ctlcmd, qr/done.*server started/s, 'pg_ctl start'); -} -else -{ - - # use the version of command_like that doesn't hang on Msys here - command_like_safe($ctlcmd, qr/done.*server started/s, 'pg_ctl start'); -} +command_like($ctlcmd, qr/done.*server started/s, 'pg_ctl start'); # sleep here is because Windows builds can't check postmaster.pid exactly, # so they may mistake a pre-existing postmaster.pid for one created by the diff --git a/src/bin/pg_rewind/t/RewindTest.pm b/src/bin/pg_rewind/t/RewindTest.pm index 60e3234788..2fedc626cc 100644 --- a/src/bin/pg_rewind/t/RewindTest.pm +++ b/src/bin/pg_rewind/t/RewindTest.pm @@ -115,7 +115,6 @@ sub check_query } else { - $stdout =~ s/\r\n/\n/g if $Config{osname} eq 'msys'; is($stdout, $expected_stdout, "$test_name: query result matches"); } return; diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index 702b4c2b1c..be05845248 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -904,9 +904,7 @@ sub kill9 local %ENV = $self->_get_env(); print "### Killing node \"$name\" using signal 9\n"; - # kill(9, ...) fails under msys Perl 5.8.8, so fall back on pg_ctl. - kill(9, $self->{_pid}) - or PostgreSQL::Test::Utils::system_or_bail('pg_ctl', 'kill', 'KILL', $self->{_pid}); + kill(9, $self->{_pid}); $self->{_pid} = undef; return; } @@ -1845,19 +1843,13 @@ sub psql } }; - # Note: on Windows, IPC::Run seems to convert \r\n to \n in program output - # if we're using native Perl, but not if we're using MSys Perl. So do it - # by hand in the latter case, here and elsewhere. - if (defined $$stdout) { - $$stdout =~ s/\r\n/\n/g if $Config{osname} eq 'msys'; chomp $$stdout; } if (defined $$stderr) { - $$stderr =~ s/\r\n/\n/g if $Config{osname} eq 'msys'; chomp $$stderr; } @@ -2337,9 +2329,7 @@ sub poll_query_until my $result = IPC::Run::run $cmd, '<', \$query, '>', \$stdout, '2>', \$stderr; - $stdout =~ s/\r\n/\n/g if $Config{osname} eq 'msys'; chomp($stdout); - $stderr =~ s/\r\n/\n/g if $Config{osname} eq 'msys'; chomp($stderr); if ($stdout eq $expected && $stderr eq '') @@ -2849,9 +2839,6 @@ sub pg_recvlogical_upto } }; - $stdout =~ s/\r\n/\n/g if $Config{osname} eq 'msys'; - $stderr =~ s/\r\n/\n/g if $Config{osname} eq 'msys'; - if (wantarray) { return ($ret, $stdout, $stderr, $timeout); diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm index fc8ca74194..2c0c72f57a 100644 --- a/src/test/perl/PostgreSQL/Test/Utils.pm +++ b/src/test/perl/PostgreSQL/Test/Utils.pm @@ -401,7 +401,6 @@ sub run_command my ($cmd) = @_; my ($stdout, $stderr); my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr; - foreach ($stderr, $stdout) { s/\r\n/\n/g if $Config{osname} eq 'msys'; } chomp($stdout); chomp($stderr); return ($stdout, $stderr); @@ -486,7 +485,6 @@ sub slurp_file $contents = <$fh>; close $fh; - $contents =~ s/\r\n/\n/g if $Config{osname} eq 'msys'; return $contents; } @@ -844,7 +842,6 @@ sub command_like my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr; ok($result, "$test_name: exit code 0"); is($stderr, '', "$test_name: no stderr"); - $stdout =~ s/\r\n/\n/g if $Config{osname} eq 'msys'; like($stdout, $expected_stdout, "$test_name: matches"); return; } @@ -897,7 +894,6 @@ sub command_fails_like print("# Running: " . join(" ", @{$cmd}) . "\n"); my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr; ok(!$result, "$test_name: exit code not 0"); - $stderr =~ s/\r\n/\n/g if $Config{osname} eq 'msys'; like($stderr, $expected_stderr, "$test_name: matches"); return; } @@ -942,8 +938,6 @@ sub command_checks_all if $ret & 127; $ret = $ret >> 8; - foreach ($stderr, $stdout) { s/\r\n/\n/g if $Config{osname} eq 'msys'; } - # check status ok($ret == $expected_ret, "$test_name status (got $ret vs expected $expected_ret)"); diff --git a/src/test/recovery/t/021_row_visibility.pl b/src/test/recovery/t/021_row_visibility.pl index e2743518de..75cd487451 100644 --- a/src/test/recovery/t/021_row_visibility.pl +++ b/src/test/recovery/t/021_row_visibility.pl @@ -182,9 +182,6 @@ sub send_query_and_wait $$psql{run}->pump_nb(); while (1) { - # See PostgreSQL::Test::Cluster.pm's psql() - $$psql{stdout} =~ s/\r\n/\n/g if $Config{osname} eq 'msys'; - last if $$psql{stdout} =~ /$untl/; if ($psql_timeout->is_expired) diff --git a/src/test/recovery/t/cp_history_files b/src/test/recovery/t/cp_history_files index 66f1b598fe..cfeea41e5b 100644 --- a/src/test/recovery/t/cp_history_files +++ b/src/test/recovery/t/cp_history_files @@ -7,11 +7,4 @@ use warnings; die "wrong number of arguments" if @ARGV != 2; my ($source, $target) = @ARGV; exit if $source !~ /history/; -if ($^O eq 'msys') -{ - # make a windows path look like an msys path if necessary - $source =~ s!^([A-Za-z]):!'/' . lc($1)!e; - $source =~ s!\\!/!g; -} - copy($source, $target) or die "couldn't copy $source to $target: $!"; From 83a7637e2c5be27a0788b920501dde284b3fca33 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 20 Feb 2022 15:02:41 -0500 Subject: [PATCH 024/772] Reset conn->errorReported when PQrequestCancel sets errorMessage. Oversight in commit 618c16707. This is mainly neatnik-ism, since if PQrequestCancel is used per its API contract, we should perform pqClearConnErrorState before reaching any place that would consult errorReported. But still, it seems like a bad idea to potentially leave errorReported pointing past errorMessage.len. --- src/interfaces/libpq/fe-connect.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 2a3d68b4d1..1c5a2b43e9 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -4687,6 +4687,7 @@ PQrequestCancel(PGconn *conn) "PQrequestCancel() -- connection is not open\n", conn->errorMessage.maxlen); conn->errorMessage.len = strlen(conn->errorMessage.data); + conn->errorReported = 0; return false; } @@ -4706,7 +4707,10 @@ PQrequestCancel(PGconn *conn) } if (!r) + { conn->errorMessage.len = strlen(conn->errorMessage.data); + conn->errorReported = 0; + } return r; } From fbabdf8f9a55894f7cd8f0fa86c9a4ef55576296 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sun, 20 Feb 2022 13:51:36 -0800 Subject: [PATCH 025/772] Fix meaning-changing typo introduced in fa0e03c15a9f. --- src/backend/utils/init/postinit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index e2208151e4..8a332a72b1 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -710,7 +710,7 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username, } /* - * If this is either a bootstrap process nor a standalone backend, start + * If this is either a bootstrap process or a standalone backend, start * up the XLOG machinery, and register to have it closed down at exit. * In other cases, the startup process is responsible for starting up * the XLOG machinery, and the checkpointer for closing it down. From bf4ed12b58205d8527053d53c8f473074e191b8d Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 21 Feb 2022 09:55:55 +0900 Subject: [PATCH 026/772] doc: Mention environment variable ZSTD in the TAP tests for MSVC 6c417bb has added the build infrastructure to support ZSTD, but forgot to update this section of the docs to mention the variable ZSTD, as per the change done in vcregress.pl. While on it, reword this section of the docs to describe what happens in the default case, as per a suggestion from Robert Haas. Discussion: https://postgr.es/m/YhCL0fKnDv/Zvtuo@paquier.xyz --- doc/src/sgml/install-windows.sgml | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index 98fa6962f6..43d05bde4e 100644 --- a/doc/src/sgml/install-windows.sgml +++ b/doc/src/sgml/install-windows.sgml @@ -534,9 +534,9 @@ $ENV{PROVE_TESTS}='t/020*.pl t/010*.pl' GZIP_PROGRAM - Path to a gzip command. The default is - gzip, that would be the command found in - PATH. + Path to a gzip command. The default is + gzip, which will search for a command by that + name in the configured PATH. @@ -544,8 +544,8 @@ $ENV{PROVE_TESTS}='t/020*.pl t/010*.pl' LZ4 Path to a lz4 command. The default is - lz4, that would be the command found in - PATH. + lz4, which will search for a command by that + name in the configured PATH. @@ -553,8 +553,17 @@ $ENV{PROVE_TESTS}='t/020*.pl t/010*.pl' TAR Path to a tar command. The default is - tar, that would be the command found in - PATH. + tar, which will search for a command by that + name in the configured PATH. + + + + + ZSTD + + Path to a zstd command. The default is + zstd, which will search for a command by that + name in the configured PATH. From 5c868c92caa864d223006c095d623b8086754c6f Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 21 Feb 2022 09:42:46 +0100 Subject: [PATCH 027/772] Fix possible null pointer reference Per Coverity. Introduced in 37851a8b83d3d57ca48736093b10aa5f3bc0c177. --- src/backend/utils/init/postinit.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 8a332a72b1..a29fa0b3e6 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -439,8 +439,7 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect ereport(WARNING, (errmsg("database \"%s\" has no actual collation version, but a version was recorded", name))); - - if (strcmp(actual_versionstr, collversionstr) != 0) + else if (strcmp(actual_versionstr, collversionstr) != 0) ereport(WARNING, (errmsg("database \"%s\" has a collation version mismatch", name), From abe81ee08468e63f94b91e484f47c867bcc706d3 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 21 Feb 2022 10:28:43 +0100 Subject: [PATCH 028/772] pgcrypto: Remove unused error code PXE_MCRYPT_INTERNAL was apparently never used even when it was added. --- contrib/pgcrypto/px.c | 1 - contrib/pgcrypto/px.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/contrib/pgcrypto/px.c b/contrib/pgcrypto/px.c index 4205e9c3ef..360acbd593 100644 --- a/contrib/pgcrypto/px.c +++ b/contrib/pgcrypto/px.c @@ -55,7 +55,6 @@ static const struct error_desc px_err_list[] = { {PXE_ARGUMENT_ERROR, "Illegal argument to function"}, {PXE_UNKNOWN_SALT_ALGO, "Unknown salt algorithm"}, {PXE_BAD_SALT_ROUNDS, "Incorrect number of rounds"}, - {PXE_MCRYPT_INTERNAL, "mcrypt internal error"}, {PXE_NO_RANDOM, "Failed to generate strong random bits"}, {PXE_DECRYPT_FAILED, "Decryption failed"}, {PXE_ENCRYPT_FAILED, "Encryption failed"}, diff --git a/contrib/pgcrypto/px.h b/contrib/pgcrypto/px.h index 17d6f22498..3ed9f711c8 100644 --- a/contrib/pgcrypto/px.h +++ b/contrib/pgcrypto/px.h @@ -58,7 +58,7 @@ #define PXE_ARGUMENT_ERROR -13 #define PXE_UNKNOWN_SALT_ALGO -14 #define PXE_BAD_SALT_ROUNDS -15 -#define PXE_MCRYPT_INTERNAL -16 +/* -16 is unused */ #define PXE_NO_RANDOM -17 #define PXE_DECRYPT_FAILED -18 #define PXE_ENCRYPT_FAILED -19 From 3f649663a49d5bb815858d90a271bb532c58fd0e Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 21 Feb 2022 10:55:03 +0100 Subject: [PATCH 029/772] pgcrypto: Remove unused error code PXE_DEV_READ_ERROR hasn't been used since random device support was removed from pgcrypto (fe0a0b5993dfe24e4b3bcf52fa64ff41a444b8f1). --- contrib/pgcrypto/px.c | 1 - contrib/pgcrypto/px.h | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/pgcrypto/px.c b/contrib/pgcrypto/px.c index 360acbd593..75e2426e9f 100644 --- a/contrib/pgcrypto/px.c +++ b/contrib/pgcrypto/px.c @@ -50,7 +50,6 @@ static const struct error_desc px_err_list[] = { {PXE_KEY_TOO_BIG, "Key was too big"}, {PXE_CIPHER_INIT, "Cipher cannot be initialized ?"}, {PXE_HASH_UNUSABLE_FOR_HMAC, "This hash algorithm is unusable for HMAC"}, - {PXE_DEV_READ_ERROR, "Error reading from random device"}, {PXE_BUG, "pgcrypto bug"}, {PXE_ARGUMENT_ERROR, "Illegal argument to function"}, {PXE_UNKNOWN_SALT_ALGO, "Unknown salt algorithm"}, diff --git a/contrib/pgcrypto/px.h b/contrib/pgcrypto/px.h index 3ed9f711c8..eef49a8b76 100644 --- a/contrib/pgcrypto/px.h +++ b/contrib/pgcrypto/px.h @@ -53,7 +53,8 @@ #define PXE_KEY_TOO_BIG -7 #define PXE_CIPHER_INIT -8 #define PXE_HASH_UNUSABLE_FOR_HMAC -9 -#define PXE_DEV_READ_ERROR -10 +/* -10 is unused */ +/* -11 is unused */ #define PXE_BUG -12 #define PXE_ARGUMENT_ERROR -13 #define PXE_UNKNOWN_SALT_ALGO -14 From 27b02e070fd1b6622b10937d9346b65ffacbc351 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 21 Feb 2022 08:34:59 -0800 Subject: [PATCH 030/772] pg_upgrade: Don't print progress status when output is not a tty. Until this change pg_upgrade with output redirected to a file / pipe would end up printing all files in the cluster. This has made check-world output exceedingly verbose. Author: Andres Freund Reviewed-By: Justin Pryzby Reviewed-By: Daniel Gustafsson Discussion: https://postgr.es/m/CA+hUKGKjrV61ZVJ8OSag+3rKRmCZXPc03bDyWMqhXg3rdZ=fOw@mail.gmail.com --- src/bin/pg_upgrade/dump.c | 2 +- src/bin/pg_upgrade/option.c | 2 ++ src/bin/pg_upgrade/pg_upgrade.c | 2 +- src/bin/pg_upgrade/pg_upgrade.h | 2 ++ src/bin/pg_upgrade/relfilenode.c | 6 ++-- src/bin/pg_upgrade/util.c | 61 ++++++++++++++++++++++++++------ 6 files changed, 59 insertions(+), 16 deletions(-) diff --git a/src/bin/pg_upgrade/dump.c b/src/bin/pg_upgrade/dump.c index b69b4f9569..29b9e44f78 100644 --- a/src/bin/pg_upgrade/dump.c +++ b/src/bin/pg_upgrade/dump.c @@ -29,7 +29,7 @@ generate_old_dump(void) GLOBALS_DUMP_FILE); check_ok(); - prep_status("Creating dump of database schemas\n"); + prep_status_progress("Creating dump of database schemas"); /* create per-db dump files */ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++) diff --git a/src/bin/pg_upgrade/option.c b/src/bin/pg_upgrade/option.c index d2c82cc2bb..e75be2c423 100644 --- a/src/bin/pg_upgrade/option.c +++ b/src/bin/pg_upgrade/option.c @@ -207,6 +207,8 @@ parseCommandLine(int argc, char *argv[]) if (log_opts.verbose) pg_log(PG_REPORT, "Running in verbose mode\n"); + log_opts.isatty = isatty(fileno(stdout)); + /* Turn off read-only mode; add prefix to PGOPTIONS? */ if (getenv("PGOPTIONS")) { diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c index f66bbd5307..ecb3e1f647 100644 --- a/src/bin/pg_upgrade/pg_upgrade.c +++ b/src/bin/pg_upgrade/pg_upgrade.c @@ -381,7 +381,7 @@ create_new_objects(void) { int dbnum; - prep_status("Restoring database schemas in the new cluster\n"); + prep_status_progress("Restoring database schemas in the new cluster"); /* * We cannot process the template1 database concurrently with others, diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h index 0aca0a77aa..ca86c11292 100644 --- a/src/bin/pg_upgrade/pg_upgrade.h +++ b/src/bin/pg_upgrade/pg_upgrade.h @@ -274,6 +274,7 @@ typedef struct char *basedir; /* Base output directory */ char *dumpdir; /* Dumps */ char *logdir; /* Log files */ + bool isatty; /* is stdout a tty */ } LogOpts; @@ -427,6 +428,7 @@ void pg_log(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3); void pg_fatal(const char *fmt,...) pg_attribute_printf(1, 2) pg_attribute_noreturn(); void end_progress_output(void); void prep_status(const char *fmt,...) pg_attribute_printf(1, 2); +void prep_status_progress(const char *fmt,...) pg_attribute_printf(1, 2); void check_ok(void); unsigned int str2uint(const char *str); diff --git a/src/bin/pg_upgrade/relfilenode.c b/src/bin/pg_upgrade/relfilenode.c index 2f4deb3416..d23ac884bd 100644 --- a/src/bin/pg_upgrade/relfilenode.c +++ b/src/bin/pg_upgrade/relfilenode.c @@ -32,13 +32,13 @@ transfer_all_new_tablespaces(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr, switch (user_opts.transfer_mode) { case TRANSFER_MODE_CLONE: - pg_log(PG_REPORT, "Cloning user relation files\n"); + prep_status_progress("Cloning user relation files"); break; case TRANSFER_MODE_COPY: - pg_log(PG_REPORT, "Copying user relation files\n"); + prep_status_progress("Copying user relation files"); break; case TRANSFER_MODE_LINK: - pg_log(PG_REPORT, "Linking user relation files\n"); + prep_status_progress("Linking user relation files"); break; } diff --git a/src/bin/pg_upgrade/util.c b/src/bin/pg_upgrade/util.c index d98deb7f24..414de06349 100644 --- a/src/bin/pg_upgrade/util.c +++ b/src/bin/pg_upgrade/util.c @@ -38,15 +38,18 @@ report_status(eLogType type, const char *fmt,...) } -/* force blank output for progress display */ void end_progress_output(void) { /* - * In case nothing printed; pass a space so gcc doesn't complain about - * empty format string. + * For output to a tty, erase prior contents of progress line. When either + * tty or verbose, indent so that report_status() output will align + * nicely. */ - prep_status(" "); + if (log_opts.isatty) + pg_log(PG_REPORT, "\r%-*s", MESSAGE_WIDTH, ""); + else if (log_opts.verbose) + pg_log(PG_REPORT, "%-*s", MESSAGE_WIDTH, ""); } @@ -75,14 +78,43 @@ prep_status(const char *fmt,...) vsnprintf(message, sizeof(message), fmt, args); va_end(args); - if (strlen(message) > 0 && message[strlen(message) - 1] == '\n') - pg_log(PG_REPORT, "%s", message); + /* trim strings */ + pg_log(PG_REPORT, "%-*s", MESSAGE_WIDTH, message); +} + +/* + * prep_status_progress + * + * Like prep_status(), but for potentially longer running operations. + * Details about what item is currently being processed can be displayed + * with pg_log(PG_STATUS, ...). A typical sequence would look like this: + * + * prep_status_progress("copying files"); + * for (...) + * pg_log(PG_STATUS, "%s", filename); + * end_progress_output(); + * report_status(PG_REPORT, "ok"); + */ +void +prep_status_progress(const char *fmt,...) +{ + va_list args; + char message[MAX_STRING]; + + va_start(args, fmt); + vsnprintf(message, sizeof(message), fmt, args); + va_end(args); + + /* + * If outputting to a tty or in verbose, append newline. pg_log_v() will + * put the individual progress items onto the next line. + */ + if (log_opts.isatty || log_opts.verbose) + pg_log(PG_REPORT, "%-*s\n", MESSAGE_WIDTH, message); else - /* trim strings that don't end in a newline */ pg_log(PG_REPORT, "%-*s", MESSAGE_WIDTH, message); } - static void pg_log_v(eLogType type, const char *fmt, va_list ap) { @@ -111,8 +143,15 @@ pg_log_v(eLogType type, const char *fmt, va_list ap) break; case PG_STATUS: - /* for output to a display, do leading truncation and append \r */ - if (isatty(fileno(stdout))) + /* + * For output to a display, do leading truncation. Append \r so + * that the next message is output at the start of the line. + * + * If going to non-interactive output, only display progress if + * verbose is enabled. Otherwise the output gets unreasonably + * large by default. + */ + if (log_opts.isatty) /* -2 because we use a 2-space indent */ printf(" %s%-*.*s\r", /* prefix with "..." if we do leading truncation */ @@ -121,7 +160,7 @@ pg_log_v(eLogType type, const char *fmt, va_list ap) /* optional leading truncation */ strlen(message) <= MESSAGE_WIDTH - 2 ? message : message + strlen(message) - MESSAGE_WIDTH + 3 + 2); - else + else if (log_opts.verbose) printf(" %s\n", message); break; From 7c38ef2a5d6cf6d8dc3834399d7a1c364d64ce64 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 21 Feb 2022 08:57:34 -0800 Subject: [PATCH 031/772] Fix temporary object cleanup failing due to toast access without snapshot. When cleaning up temporary objects during process exit the cleanup could fail with: FATAL: cannot fetch toast data without an active snapshot The bug is caused by RemoveTempRelationsCallback() not setting up a snapshot. If an object with toasted catalog data needs to be cleaned up, init_toast_snapshot() could fail with the above error. Most of the time however the the problem is masked due to cached catalog snapshots being returned by GetOldestSnapshot(). But dropping an object can cause catalog invalidations to be emitted. If no further catalog accesses are necessary between the invalidation processing and the next toast datum deletion, the bug becomes visible. It's easy to miss this bug because it typically happens after clients disconnect and the FATAL error just ends up in the log. Luckily temporary table cleanup at the next use of the same temporary schema or during DISCARD ALL does not have the same problem. Fix the bug by pushing a snapshot in RemoveTempRelationsCallback(). Also add isolation tests for temporary object cleanup, including objects with toasted catalog data. A future HEAD only commit will add an assertion trying to make this more visible. Reported-By: Miles Delahunty Author: Andres Freund Discussion: https://postgr.es/m/CAOFAq3BU5Mf2TTvu8D9n_ZOoFAeQswuzk7yziAb7xuw_qyw5gw@mail.gmail.com Backpatch: 10- --- src/backend/catalog/namespace.c | 3 + .../expected/temp-schema-cleanup.out | 115 ++++++++++++++++++ src/test/isolation/isolation_schedule | 1 + .../isolation/specs/temp-schema-cleanup.spec | 85 +++++++++++++ 4 files changed, 204 insertions(+) create mode 100644 src/test/isolation/expected/temp-schema-cleanup.out create mode 100644 src/test/isolation/specs/temp-schema-cleanup.spec diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index 5dbac9c437..fafb9349cc 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -55,6 +55,7 @@ #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/memutils.h" +#include "utils/snapmgr.h" #include "utils/syscache.h" #include "utils/varlena.h" @@ -4292,9 +4293,11 @@ RemoveTempRelationsCallback(int code, Datum arg) /* Need to ensure we have a usable transaction. */ AbortOutOfAnyTransaction(); StartTransactionCommand(); + PushActiveSnapshot(GetTransactionSnapshot()); RemoveTempRelations(myTempNamespace); + PopActiveSnapshot(); CommitTransactionCommand(); } } diff --git a/src/test/isolation/expected/temp-schema-cleanup.out b/src/test/isolation/expected/temp-schema-cleanup.out new file mode 100644 index 0000000000..35b91d9e45 --- /dev/null +++ b/src/test/isolation/expected/temp-schema-cleanup.out @@ -0,0 +1,115 @@ +Parsed test spec with 2 sessions + +starting permutation: s1_create_temp_objects s1_discard_temp s2_check_schema +step s1_create_temp_objects: + + -- create function large enough to be toasted, to ensure we correctly clean those up, a prior bug + -- https://postgr.es/m/CAOFAq3BU5Mf2TTvu8D9n_ZOoFAeQswuzk7yziAb7xuw_qyw5gw%40mail.gmail.com + SELECT exec(format($outer$ + CREATE OR REPLACE FUNCTION pg_temp.long() RETURNS text LANGUAGE sql AS $body$ SELECT %L; $body$$outer$, + (SELECT string_agg(g.i::text||':'||random()::text, '|') FROM generate_series(1, 100) g(i)))); + + -- The above bug requirs function removal to happen after a catalog + -- invalidation. dependency.c sorts objects in descending oid order so + -- that newer objects are deleted before older objects, so create a + -- table after. + CREATE TEMPORARY TABLE invalidate_catalog_cache(); + + -- test non-temp function is dropped when depending on temp table + CREATE TEMPORARY TABLE just_give_me_a_type(id serial primary key); + + CREATE FUNCTION uses_a_temp_type(just_give_me_a_type) RETURNS int LANGUAGE sql AS $$SELECT 1;$$; + +exec +---- + +(1 row) + +step s1_discard_temp: + DISCARD TEMP; + +step s2_check_schema: + SELECT oid::regclass FROM pg_class WHERE relnamespace = (SELECT oid FROM s1_temp_schema); + SELECT oid::regproc FROM pg_proc WHERE pronamespace = (SELECT oid FROM s1_temp_schema); + SELECT oid::regproc FROM pg_type WHERE typnamespace = (SELECT oid FROM s1_temp_schema); + +oid +--- +(0 rows) + +oid +--- +(0 rows) + +oid +--- +(0 rows) + + +starting permutation: s1_advisory s2_advisory s1_create_temp_objects s1_exit s2_check_schema +step s1_advisory: + SELECT pg_advisory_lock('pg_namespace'::regclass::int8); + +pg_advisory_lock +---------------- + +(1 row) + +step s2_advisory: + SELECT pg_advisory_lock('pg_namespace'::regclass::int8); + +step s1_create_temp_objects: + + -- create function large enough to be toasted, to ensure we correctly clean those up, a prior bug + -- https://postgr.es/m/CAOFAq3BU5Mf2TTvu8D9n_ZOoFAeQswuzk7yziAb7xuw_qyw5gw%40mail.gmail.com + SELECT exec(format($outer$ + CREATE OR REPLACE FUNCTION pg_temp.long() RETURNS text LANGUAGE sql AS $body$ SELECT %L; $body$$outer$, + (SELECT string_agg(g.i::text||':'||random()::text, '|') FROM generate_series(1, 100) g(i)))); + + -- The above bug requirs function removal to happen after a catalog + -- invalidation. dependency.c sorts objects in descending oid order so + -- that newer objects are deleted before older objects, so create a + -- table after. + CREATE TEMPORARY TABLE invalidate_catalog_cache(); + + -- test non-temp function is dropped when depending on temp table + CREATE TEMPORARY TABLE just_give_me_a_type(id serial primary key); + + CREATE FUNCTION uses_a_temp_type(just_give_me_a_type) RETURNS int LANGUAGE sql AS $$SELECT 1;$$; + +exec +---- + +(1 row) + +step s1_exit: + SELECT pg_terminate_backend(pg_backend_pid()); + +FATAL: terminating connection due to administrator command +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +step s2_advisory: <... completed> +pg_advisory_lock +---------------- + +(1 row) + +step s2_check_schema: + SELECT oid::regclass FROM pg_class WHERE relnamespace = (SELECT oid FROM s1_temp_schema); + SELECT oid::regproc FROM pg_proc WHERE pronamespace = (SELECT oid FROM s1_temp_schema); + SELECT oid::regproc FROM pg_type WHERE typnamespace = (SELECT oid FROM s1_temp_schema); + +oid +--- +(0 rows) + +oid +--- +(0 rows) + +oid +--- +(0 rows) + diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule index 99c23b16ff..0dae483e82 100644 --- a/src/test/isolation/isolation_schedule +++ b/src/test/isolation/isolation_schedule @@ -38,6 +38,7 @@ test: eval-plan-qual-trigger test: lock-update-delete test: lock-update-traversal test: inherit-temp +test: temp-schema-cleanup test: insert-conflict-do-nothing test: insert-conflict-do-nothing-2 test: insert-conflict-do-update diff --git a/src/test/isolation/specs/temp-schema-cleanup.spec b/src/test/isolation/specs/temp-schema-cleanup.spec new file mode 100644 index 0000000000..a9417b7e90 --- /dev/null +++ b/src/test/isolation/specs/temp-schema-cleanup.spec @@ -0,0 +1,85 @@ +# Test cleanup of objects in temporary schema. + +setup { + CREATE TABLE s1_temp_schema(oid oid); + -- to help create a long function + CREATE FUNCTION exec(p_foo text) RETURNS void LANGUAGE plpgsql AS $$BEGIN EXECUTE p_foo; END;$$; +} + +teardown { + DROP TABLE s1_temp_schema; + DROP FUNCTION exec(text); +} + +session "s1" +setup { + CREATE TEMPORARY TABLE just_to_create_temp_schema(); + DROP TABLE just_to_create_temp_schema; + INSERT INTO s1_temp_schema SELECT pg_my_temp_schema(); +} + +step s1_advisory { + SELECT pg_advisory_lock('pg_namespace'::regclass::int8); +} + +step s1_create_temp_objects { + + -- create function large enough to be toasted, to ensure we correctly clean those up, a prior bug + -- https://postgr.es/m/CAOFAq3BU5Mf2TTvu8D9n_ZOoFAeQswuzk7yziAb7xuw_qyw5gw%40mail.gmail.com + SELECT exec(format($outer$ + CREATE OR REPLACE FUNCTION pg_temp.long() RETURNS text LANGUAGE sql AS $body$ SELECT %L; $body$$outer$, + (SELECT string_agg(g.i::text||':'||random()::text, '|') FROM generate_series(1, 100) g(i)))); + + -- The above bug requirs function removal to happen after a catalog + -- invalidation. dependency.c sorts objects in descending oid order so + -- that newer objects are deleted before older objects, so create a + -- table after. + CREATE TEMPORARY TABLE invalidate_catalog_cache(); + + -- test non-temp function is dropped when depending on temp table + CREATE TEMPORARY TABLE just_give_me_a_type(id serial primary key); + + CREATE FUNCTION uses_a_temp_type(just_give_me_a_type) RETURNS int LANGUAGE sql AS $$SELECT 1;$$; +} + +step s1_discard_temp { + DISCARD TEMP; +} + +step s1_exit { + SELECT pg_terminate_backend(pg_backend_pid()); +} + + +session "s2" + +step s2_advisory { + SELECT pg_advisory_lock('pg_namespace'::regclass::int8); +} + +step s2_check_schema { + SELECT oid::regclass FROM pg_class WHERE relnamespace = (SELECT oid FROM s1_temp_schema); + SELECT oid::regproc FROM pg_proc WHERE pronamespace = (SELECT oid FROM s1_temp_schema); + SELECT oid::regproc FROM pg_type WHERE typnamespace = (SELECT oid FROM s1_temp_schema); +} + + +# Test temporary object cleanup during DISCARD. +permutation + s1_create_temp_objects + s1_discard_temp + s2_check_schema + +# Test temporary object cleanup during process exit. +# +# To check (in s2) if temporary objects (in s1) have properly been removed we +# need to wait for s1 to finish cleaning up. Luckily session level advisory +# locks are released only after temp table cleanup. +permutation + s1_advisory + s2_advisory + s1_create_temp_objects + s1_exit + s2_check_schema + +# Can't run further tests here, because s1's connection is dead From 2776922201f751e3202a713b61d97fe4e44a8440 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 19 Feb 2022 12:42:37 -0800 Subject: [PATCH 032/772] Assert in init_toast_snapshot() that some snapshot registered or active. Commit fixed the bug that RemoveTempRelationsCallback() did not push/register a snapshot. That only went unnoticed because often a valid catalog snapshot exists and is returned by GetOldestSnapshot(). But due to invalidation processing that is not reliable. Thus assert in init_toast_snapshot() that there is a registered or active snapshot, using the new HaveRegisteredOrActiveSnapshot(). Author: Andres Freund Discussion: https://postgr.es/m/20220219180002.6tubjq7iw7m52bgd@alap3.anarazel.de --- src/backend/access/common/toast_internals.c | 9 +++++++ src/backend/utils/time/snapmgr.c | 26 +++++++++++++++++++++ src/include/utils/snapmgr.h | 1 + 3 files changed, 36 insertions(+) diff --git a/src/backend/access/common/toast_internals.c b/src/backend/access/common/toast_internals.c index de37f561ca..7052ac9978 100644 --- a/src/backend/access/common/toast_internals.c +++ b/src/backend/access/common/toast_internals.c @@ -660,5 +660,14 @@ init_toast_snapshot(Snapshot toast_snapshot) if (snapshot == NULL) elog(ERROR, "cannot fetch toast data without an active snapshot"); + /* + * Catalog snapshots can be returned by GetOldestSnapshot() even if not + * registered or active. That easily hides bugs around not having a + * snapshot set up - most of the time there is a valid catalog + * snapshot. So additionally insist that the current snapshot is + * registered or active. + */ + Assert(HaveRegisteredOrActiveSnapshot()); + InitToastSnapshot(*toast_snapshot, snapshot->lsn, snapshot->whenTaken); } diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c index a0b703a519..a0b81bf154 100644 --- a/src/backend/utils/time/snapmgr.c +++ b/src/backend/utils/time/snapmgr.c @@ -1625,6 +1625,32 @@ ThereAreNoPriorRegisteredSnapshots(void) return false; } +/* + * HaveRegisteredOrActiveSnapshots + * Is there any registered or active snapshot? + * + * NB: Unless pushed or active, the cached catalog snapshot will not cause + * this function to return true. That allows this function to be used in + * checks enforcing a longer-lived snapshot. + */ +bool +HaveRegisteredOrActiveSnapshot(void) +{ + if (ActiveSnapshot != NULL) + return true; + + /* + * The catalog snapshot is in RegisteredSnapshots when valid, but can be + * removed at any time due to invalidation processing. If explicitly + * registered more than one snapshot has to be in RegisteredSnapshots. + */ + if (pairingheap_is_empty(&RegisteredSnapshots) || + !pairingheap_is_singular(&RegisteredSnapshots)) + return false; + + return CatalogSnapshot == NULL; +} + /* * Return a timestamp that is exactly on a minute boundary. diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 293c753034..e04018c034 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -135,6 +135,7 @@ extern bool XactHasExportedSnapshots(void); extern void DeleteAllExportedSnapshotFiles(void); extern void WaitForOlderSnapshots(TransactionId limitXmin, bool progress); extern bool ThereAreNoPriorRegisteredSnapshots(void); +extern bool HaveRegisteredOrActiveSnapshot(void); extern bool TransactionIdLimitedForOldSnapshots(TransactionId recentXmin, Relation relation, TransactionId *limit_xid, From 88103567cb8fa5be46dc9fac3e3b8774951a2be7 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 21 Feb 2022 14:10:15 -0500 Subject: [PATCH 033/772] Disallow setting bogus GUCs within an extension's reserved namespace. Commit 75d22069e tried to throw a warning for setting a custom GUC whose prefix belongs to a previously-loaded extension, if there is no such GUC defined by the extension. But that caused unstable behavior with parallel workers, because workers don't necessarily load extensions and GUCs in the same order their leader did. To make that work safely, we have to completely disallow the case. We now actually remove any such GUCs at the time of initial extension load, and then throw an error not just a warning if you try to add one later. While this might create a compatibility issue for a few people, the improvement in error-detection capability seems worth it; it's hard to believe that there's any good use-case for choosing such GUC names. This also un-reverts 5609cc01c (Rename EmitWarningsOnPlaceholders() to MarkGUCPrefixReserved()), since that function's old name is now even more of a misnomer. Florin Irion and Tom Lane Discussion: https://postgr.es/m/1902182.1640711215@sss.pgh.pa.us --- contrib/auth_delay/auth_delay.c | 2 +- contrib/auto_explain/auto_explain.c | 2 +- contrib/basic_archive/basic_archive.c | 2 +- contrib/pg_prewarm/autoprewarm.c | 2 +- .../pg_stat_statements/pg_stat_statements.c | 2 +- contrib/pg_trgm/trgm_op.c | 2 +- contrib/postgres_fdw/option.c | 2 +- contrib/sepgsql/hooks.c | 2 +- src/backend/utils/misc/guc.c | 79 +++++++++++++++---- src/include/utils/guc.h | 5 +- src/pl/plperl/plperl.c | 2 +- src/pl/plpgsql/src/pl_handler.c | 2 +- src/pl/tcl/pltcl.c | 4 +- .../modules/delay_execution/delay_execution.c | 2 +- .../ssl_passphrase_func.c | 2 +- src/test/modules/worker_spi/worker_spi.c | 2 +- src/test/regress/expected/guc.out | 11 +++ src/test/regress/sql/guc.sql | 7 ++ 18 files changed, 101 insertions(+), 31 deletions(-) diff --git a/contrib/auth_delay/auth_delay.c b/contrib/auth_delay/auth_delay.c index 38f4276db3..6b94d653ea 100644 --- a/contrib/auth_delay/auth_delay.c +++ b/contrib/auth_delay/auth_delay.c @@ -68,7 +68,7 @@ _PG_init(void) NULL, NULL); - EmitWarningsOnPlaceholders("auth_delay"); + MarkGUCPrefixReserved("auth_delay"); /* Install Hooks */ original_client_auth_hook = ClientAuthentication_hook; diff --git a/contrib/auto_explain/auto_explain.c b/contrib/auto_explain/auto_explain.c index 3e09abaeca..d3029f85ef 100644 --- a/contrib/auto_explain/auto_explain.c +++ b/contrib/auto_explain/auto_explain.c @@ -231,7 +231,7 @@ _PG_init(void) NULL, NULL); - EmitWarningsOnPlaceholders("auto_explain"); + MarkGUCPrefixReserved("auto_explain"); /* Install hooks. */ prev_ExecutorStart = ExecutorStart_hook; diff --git a/contrib/basic_archive/basic_archive.c b/contrib/basic_archive/basic_archive.c index 16ddddccbb..e7efbfb9c3 100644 --- a/contrib/basic_archive/basic_archive.c +++ b/contrib/basic_archive/basic_archive.c @@ -69,7 +69,7 @@ _PG_init(void) 0, check_archive_directory, NULL, NULL); - EmitWarningsOnPlaceholders("basic_archive"); + MarkGUCPrefixReserved("basic_archive"); basic_archive_context = AllocSetContextCreate(TopMemoryContext, "basic_archive", diff --git a/contrib/pg_prewarm/autoprewarm.c b/contrib/pg_prewarm/autoprewarm.c index 1d4d74b171..45e012a63a 100644 --- a/contrib/pg_prewarm/autoprewarm.c +++ b/contrib/pg_prewarm/autoprewarm.c @@ -137,7 +137,7 @@ _PG_init(void) NULL, NULL); - EmitWarningsOnPlaceholders("pg_prewarm"); + MarkGUCPrefixReserved("pg_prewarm"); RequestAddinShmemSpace(MAXALIGN(sizeof(AutoPrewarmSharedState))); diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 9d7d0812ac..38d92a89cc 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -437,7 +437,7 @@ _PG_init(void) NULL, NULL); - EmitWarningsOnPlaceholders("pg_stat_statements"); + MarkGUCPrefixReserved("pg_stat_statements"); /* * Request additional shared resources. (These are no-ops if we're not in diff --git a/contrib/pg_trgm/trgm_op.c b/contrib/pg_trgm/trgm_op.c index 0407c7dd64..e9b7981619 100644 --- a/contrib/pg_trgm/trgm_op.c +++ b/contrib/pg_trgm/trgm_op.c @@ -101,7 +101,7 @@ _PG_init(void) NULL, NULL); - EmitWarningsOnPlaceholders("pg_trgm"); + MarkGUCPrefixReserved("pg_trgm"); } /* diff --git a/contrib/postgres_fdw/option.c b/contrib/postgres_fdw/option.c index af38e956e7..2c6b2894b9 100644 --- a/contrib/postgres_fdw/option.c +++ b/contrib/postgres_fdw/option.c @@ -538,5 +538,5 @@ _PG_init(void) NULL, NULL); - EmitWarningsOnPlaceholders("postgres_fdw"); + MarkGUCPrefixReserved("postgres_fdw"); } diff --git a/contrib/sepgsql/hooks.c b/contrib/sepgsql/hooks.c index d71c802106..97e61b8043 100644 --- a/contrib/sepgsql/hooks.c +++ b/contrib/sepgsql/hooks.c @@ -455,7 +455,7 @@ _PG_init(void) NULL, NULL); - EmitWarningsOnPlaceholders("sepgsql"); + MarkGUCPrefixReserved("sepgsql"); /* Initialize userspace access vector cache */ sepgsql_avc_init(); diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 01f373815e..eaa4bf2c30 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -150,6 +150,8 @@ extern bool optimize_bounded_sort; static int GUC_check_errcode_value; +static List *reserved_class_prefix = NIL; + /* global variables for check hook support */ char *GUC_check_errmsg_string; char *GUC_check_errdetail_string; @@ -5590,18 +5592,44 @@ find_option(const char *name, bool create_placeholders, bool skip_errors, * doesn't contain a separator, don't assume that it was meant to be a * placeholder. */ - if (strchr(name, GUC_QUALIFIER_SEPARATOR) != NULL) + const char *sep = strchr(name, GUC_QUALIFIER_SEPARATOR); + + if (sep != NULL) { - if (valid_custom_variable_name(name)) - return add_placeholder_variable(name, elevel); - /* A special error message seems desirable here */ - if (!skip_errors) - ereport(elevel, - (errcode(ERRCODE_INVALID_NAME), - errmsg("invalid configuration parameter name \"%s\"", - name), - errdetail("Custom parameter names must be two or more simple identifiers separated by dots."))); - return NULL; + size_t classLen = sep - name; + ListCell *lc; + + /* The name must be syntactically acceptable ... */ + if (!valid_custom_variable_name(name)) + { + if (!skip_errors) + ereport(elevel, + (errcode(ERRCODE_INVALID_NAME), + errmsg("invalid configuration parameter name \"%s\"", + name), + errdetail("Custom parameter names must be two or more simple identifiers separated by dots."))); + return NULL; + } + /* ... and it must not match any previously-reserved prefix */ + foreach(lc, reserved_class_prefix) + { + const char *rcprefix = lfirst(lc); + + if (strlen(rcprefix) == classLen && + strncmp(name, rcprefix, classLen) == 0) + { + if (!skip_errors) + ereport(elevel, + (errcode(ERRCODE_INVALID_NAME), + errmsg("invalid configuration parameter name \"%s\"", + name), + errdetail("\"%s\" is a reserved prefix.", + rcprefix))); + return NULL; + } + } + /* OK, create it */ + return add_placeholder_variable(name, elevel); } } @@ -9355,15 +9383,26 @@ DefineCustomEnumVariable(const char *name, } /* + * Mark the given GUC prefix as "reserved". + * + * This deletes any existing placeholders matching the prefix, + * and then prevents new ones from being created. * Extensions should call this after they've defined all of their custom * GUCs, to help catch misspelled config-file entries. */ void -EmitWarningsOnPlaceholders(const char *className) +MarkGUCPrefixReserved(const char *className) { int classLen = strlen(className); int i; + MemoryContext oldcontext; + /* + * Check for existing placeholders. We must actually remove invalid + * placeholders, else future parallel worker startups will fail. (We + * don't bother trying to free associated memory, since this shouldn't + * happen often.) + */ for (i = 0; i < num_guc_variables; i++) { struct config_generic *var = guc_variables[i]; @@ -9373,11 +9412,21 @@ EmitWarningsOnPlaceholders(const char *className) var->name[classLen] == GUC_QUALIFIER_SEPARATOR) { ereport(WARNING, - (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("unrecognized configuration parameter \"%s\"", - var->name))); + (errcode(ERRCODE_INVALID_NAME), + errmsg("invalid configuration parameter name \"%s\", removing it", + var->name), + errdetail("\"%s\" is now a reserved prefix.", + className))); + num_guc_variables--; + memmove(&guc_variables[i], &guc_variables[i + 1], + (num_guc_variables - i) * sizeof(struct config_generic *)); } } + + /* And remember the name so we can prevent future mistakes. */ + oldcontext = MemoryContextSwitchTo(TopMemoryContext); + reserved_class_prefix = lappend(reserved_class_prefix, pstrdup(className)); + MemoryContextSwitchTo(oldcontext); } diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index f1bfe79feb..ea774968f0 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -354,7 +354,10 @@ extern void DefineCustomEnumVariable(const char *name, GucEnumAssignHook assign_hook, GucShowHook show_hook); -extern void EmitWarningsOnPlaceholders(const char *className); +extern void MarkGUCPrefixReserved(const char *className); + +/* old name for MarkGUCPrefixReserved, for backwards compatibility: */ +#define EmitWarningsOnPlaceholders(className) MarkGUCPrefixReserved(className) extern const char *GetConfigOption(const char *name, bool missing_ok, bool restrict_privileged); diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 3f785b1e8d..b5879c2947 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -455,7 +455,7 @@ _PG_init(void) PGC_SUSET, 0, NULL, NULL, NULL); - EmitWarningsOnPlaceholders("plperl"); + MarkGUCPrefixReserved("plperl"); /* * Create hash tables. diff --git a/src/pl/plpgsql/src/pl_handler.c b/src/pl/plpgsql/src/pl_handler.c index b4b8509280..190d286f1c 100644 --- a/src/pl/plpgsql/src/pl_handler.c +++ b/src/pl/plpgsql/src/pl_handler.c @@ -197,7 +197,7 @@ _PG_init(void) plpgsql_extra_errors_assign_hook, NULL); - EmitWarningsOnPlaceholders("plpgsql"); + MarkGUCPrefixReserved("plpgsql"); plpgsql_HashTableInit(); RegisterXactCallback(plpgsql_xact_cb, NULL); diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c index 7c045f4560..ab759833db 100644 --- a/src/pl/tcl/pltcl.c +++ b/src/pl/tcl/pltcl.c @@ -474,8 +474,8 @@ _PG_init(void) PGC_SUSET, 0, NULL, NULL, NULL); - EmitWarningsOnPlaceholders("pltcl"); - EmitWarningsOnPlaceholders("pltclu"); + MarkGUCPrefixReserved("pltcl"); + MarkGUCPrefixReserved("pltclu"); pltcl_pm_init_done = true; } diff --git a/src/test/modules/delay_execution/delay_execution.c b/src/test/modules/delay_execution/delay_execution.c index ad50383bf8..cf34e8c2d7 100644 --- a/src/test/modules/delay_execution/delay_execution.c +++ b/src/test/modules/delay_execution/delay_execution.c @@ -91,7 +91,7 @@ _PG_init(void) NULL, NULL); - EmitWarningsOnPlaceholders("delay_execution"); + MarkGUCPrefixReserved("delay_execution"); /* Install our hook */ prev_planner_hook = planner_hook; diff --git a/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c b/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c index 3ba33e501c..7c469fd57e 100644 --- a/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c +++ b/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c @@ -49,7 +49,7 @@ _PG_init(void) NULL, NULL); - EmitWarningsOnPlaceholders("ssl_passphrase"); + MarkGUCPrefixReserved("ssl_passphrase"); if (ssl_passphrase) openssl_tls_init_hook = set_rot13; diff --git a/src/test/modules/worker_spi/worker_spi.c b/src/test/modules/worker_spi/worker_spi.c index 05ced63780..48829df29c 100644 --- a/src/test/modules/worker_spi/worker_spi.c +++ b/src/test/modules/worker_spi/worker_spi.c @@ -322,7 +322,7 @@ _PG_init(void) 0, NULL, NULL, NULL); - EmitWarningsOnPlaceholders("worker_spi"); + MarkGUCPrefixReserved("worker_spi"); /* set up common data for all our workers */ memset(&worker, 0, sizeof(worker)); diff --git a/src/test/regress/expected/guc.out b/src/test/regress/expected/guc.out index 75b6bfbf11..3de6404ba5 100644 --- a/src/test/regress/expected/guc.out +++ b/src/test/regress/expected/guc.out @@ -548,6 +548,17 @@ ERROR: invalid configuration parameter name "special.weird name" DETAIL: Custom parameter names must be two or more simple identifiers separated by dots. SHOW special."weird name"; ERROR: unrecognized configuration parameter "special.weird name" +-- Check what happens when you try to set a "custom" GUC within the +-- namespace of an extension. +SET plpgsql.extra_foo_warnings = true; -- allowed if plpgsql is not loaded yet +LOAD 'plpgsql'; -- this will throw a warning and delete the variable +WARNING: invalid configuration parameter name "plpgsql.extra_foo_warnings", removing it +DETAIL: "plpgsql" is now a reserved prefix. +SET plpgsql.extra_foo_warnings = true; -- now, it's an error +ERROR: invalid configuration parameter name "plpgsql.extra_foo_warnings" +DETAIL: "plpgsql" is a reserved prefix. +SHOW plpgsql.extra_foo_warnings; +ERROR: unrecognized configuration parameter "plpgsql.extra_foo_warnings" -- -- Test DISCARD TEMP -- diff --git a/src/test/regress/sql/guc.sql b/src/test/regress/sql/guc.sql index 3e2819449c..d5db101e48 100644 --- a/src/test/regress/sql/guc.sql +++ b/src/test/regress/sql/guc.sql @@ -163,6 +163,13 @@ SHOW custom."bad-guc"; SET special."weird name" = 'foo'; -- could be allowed, but we choose not to SHOW special."weird name"; +-- Check what happens when you try to set a "custom" GUC within the +-- namespace of an extension. +SET plpgsql.extra_foo_warnings = true; -- allowed if plpgsql is not loaded yet +LOAD 'plpgsql'; -- this will throw a warning and delete the variable +SET plpgsql.extra_foo_warnings = true; -- now, it's an error +SHOW plpgsql.extra_foo_warnings; + -- -- Test DISCARD TEMP -- From ebf6c5249b7db525e59563fb149642665c88f747 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 22 Feb 2022 10:22:15 +0900 Subject: [PATCH 034/772] Add compute_query_id = regress "regress" is a new mode added to compute_query_id aimed at facilitating regression testing when a module computing query IDs is loaded into the backend, like pg_stat_statements. It works the same way as "auto", meaning that query IDs are computed if a module enables it, except that query IDs are hidden in EXPLAIN outputs to ensure regression output stability. Like any GUCs of the kind (force_parallel_mode, etc.), this new configuration can be added to an instance's postgresql.conf, or just passed down with PGOPTIONS at command level. compute_query_id uses an enum for its set of option values, meaning that this addition ensures ABI compatibility. Using this new configuration mode allows installcheck-world to pass when running the tests on an instance with pg_stat_statements enabled, stabilizing the test output while checking the paths doing query ID computations. Reported-by: Anton Melnikov Reviewed-by: Julien Rouhaud Discussion: https://postgr.es/m/1634283396.372373993@f75.i.mail.ru Discussion: https://postgr.es/m/YgHlxgc/OimuPYhH@paquier.xyz Backpatch-through: 14 --- doc/src/sgml/config.sgml | 7 +++++-- src/backend/commands/explain.c | 8 +++++++- src/backend/utils/misc/guc.c | 1 + src/include/utils/queryjumble.h | 3 ++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index d99bf38e67..7ed8c82a9d 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -7934,9 +7934,12 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; method is not acceptable. In this case, in-core computation must be always disabled. Valid values are off (always disabled), - on (always enabled) and auto, + on (always enabled), auto, which lets modules such as - automatically enable it. + automatically enable it, and regress which + has the same effect as auto, except that the + query identifier is hidden in the EXPLAIN output + to facilitate automated regression testing. The default is auto. diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index b970997c34..de81379da3 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -604,7 +604,13 @@ ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es, /* Create textual dump of plan tree */ ExplainPrintPlan(es, queryDesc); - if (es->verbose && plannedstmt->queryId != UINT64CONST(0)) + /* + * COMPUTE_QUERY_ID_REGRESS means COMPUTE_QUERY_ID_AUTO, but we don't show + * the queryid in any of the EXPLAIN plans to keep stable the results + * generated by regression test suites. + */ + if (es->verbose && plannedstmt->queryId != UINT64CONST(0) && + compute_query_id != COMPUTE_QUERY_ID_REGRESS) { /* * Output the queryid as an int64 rather than a uint64 so we match diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index eaa4bf2c30..e4afd07bfe 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -414,6 +414,7 @@ static const struct config_enum_entry backslash_quote_options[] = { */ static const struct config_enum_entry compute_query_id_options[] = { {"auto", COMPUTE_QUERY_ID_AUTO, false}, + {"regress", COMPUTE_QUERY_ID_REGRESS, false}, {"on", COMPUTE_QUERY_ID_ON, false}, {"off", COMPUTE_QUERY_ID_OFF, false}, {"true", COMPUTE_QUERY_ID_ON, true}, diff --git a/src/include/utils/queryjumble.h b/src/include/utils/queryjumble.h index a4c277269e..c670662db2 100644 --- a/src/include/utils/queryjumble.h +++ b/src/include/utils/queryjumble.h @@ -57,7 +57,8 @@ enum ComputeQueryIdType { COMPUTE_QUERY_ID_OFF, COMPUTE_QUERY_ID_ON, - COMPUTE_QUERY_ID_AUTO + COMPUTE_QUERY_ID_AUTO, + COMPUTE_QUERY_ID_REGRESS }; /* GUC parameters */ From 52e4f0cd472d39d07732b99559989ea3b615be78 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Tue, 22 Feb 2022 07:54:12 +0530 Subject: [PATCH 035/772] Allow specifying row filters for logical replication of tables. This feature adds row filtering for publication tables. When a publication is defined or modified, an optional WHERE clause can be specified. Rows that don't satisfy this WHERE clause will be filtered out. This allows a set of tables to be partially replicated. The row filter is per table. A new row filter can be added simply by specifying a WHERE clause after the table name. The WHERE clause must be enclosed by parentheses. The row filter WHERE clause for a table added to a publication that publishes UPDATE and/or DELETE operations must contain only columns that are covered by REPLICA IDENTITY. The row filter WHERE clause for a table added to a publication that publishes INSERT can use any column. If the row filter evaluates to NULL, it is regarded as "false". The WHERE clause only allows simple expressions that don't have user-defined functions, user-defined operators, user-defined types, user-defined collations, non-immutable built-in functions, or references to system columns. These restrictions could be addressed in the future. If you choose to do the initial table synchronization, only data that satisfies the row filters is copied to the subscriber. If the subscription has several publications in which a table has been published with different WHERE clauses, rows that satisfy ANY of the expressions will be copied. If a subscriber is a pre-15 version, the initial table synchronization won't use row filters even if they are defined in the publisher. The row filters are applied before publishing the changes. If the subscription has several publications in which the same table has been published with different filters (for the same publish operation), those expressions get OR'ed together so that rows satisfying any of the expressions will be replicated. This means all the other filters become redundant if (a) one of the publications have no filter at all, (b) one of the publications was created using FOR ALL TABLES, (c) one of the publications was created using FOR ALL TABLES IN SCHEMA and the table belongs to that same schema. If your publication contains a partitioned table, the publication parameter publish_via_partition_root determines if it uses the partition's row filter (if the parameter is false, the default) or the root partitioned table's row filter. Psql commands \dRp+ and \d will display any row filters. Author: Hou Zhijie, Euler Taveira, Peter Smith, Ajin Cherian Reviewed-by: Greg Nancarrow, Haiying Tang, Amit Kapila, Tomas Vondra, Dilip Kumar, Vignesh C, Alvaro Herrera, Andres Freund, Wei Wang Discussion: https://www.postgresql.org/message-id/flat/CAHE3wggb715X%2BmK_DitLXF25B%3DjE6xyNCH4YOwM860JR7HarGQ%40mail.gmail.com --- doc/src/sgml/catalogs.sgml | 9 + doc/src/sgml/ref/alter_publication.sgml | 12 +- doc/src/sgml/ref/alter_subscription.sgml | 7 +- doc/src/sgml/ref/create_publication.sgml | 38 +- doc/src/sgml/ref/create_subscription.sgml | 27 +- src/backend/catalog/pg_publication.c | 59 +- src/backend/commands/publicationcmds.c | 583 +++++++++++++- src/backend/executor/execReplication.c | 39 +- src/backend/nodes/copyfuncs.c | 1 + src/backend/nodes/equalfuncs.c | 1 + src/backend/parser/gram.y | 38 +- src/backend/replication/logical/proto.c | 36 +- src/backend/replication/logical/tablesync.c | 142 +++- src/backend/replication/pgoutput/pgoutput.c | 833 +++++++++++++++++--- src/backend/utils/cache/relcache.c | 98 ++- src/bin/pg_dump/pg_dump.c | 30 +- src/bin/pg_dump/pg_dump.h | 1 + src/bin/psql/describe.c | 26 +- src/bin/psql/tab-complete.c | 29 +- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_publication.h | 18 +- src/include/catalog/pg_publication_rel.h | 6 + src/include/commands/publicationcmds.h | 2 + src/include/nodes/parsenodes.h | 1 + src/include/replication/logicalproto.h | 11 +- src/include/replication/pgoutput.h | 1 + src/include/replication/reorderbuffer.h | 6 +- src/include/utils/rel.h | 2 +- src/include/utils/relcache.h | 5 +- src/test/regress/expected/publication.out | 352 +++++++++ src/test/regress/sql/publication.sql | 236 ++++++ src/test/subscription/t/028_row_filter.pl | 695 ++++++++++++++++ src/tools/pgindent/typedefs.list | 3 + 33 files changed, 3113 insertions(+), 236 deletions(-) create mode 100644 src/test/subscription/t/028_row_filter.pl diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 5a1627a394..83987a9904 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -6325,6 +6325,15 @@ SCRAM-SHA-256$<iteration count>:&l Reference to relation + + + + prqual pg_node_tree + + Expression tree (in nodeToString() + representation) for the relation's publication qualifying condition. Null + if there is no publication qualifying condition. + diff --git a/doc/src/sgml/ref/alter_publication.sgml b/doc/src/sgml/ref/alter_publication.sgml index 7c7c27bf7c..32b75f6c78 100644 --- a/doc/src/sgml/ref/alter_publication.sgml +++ b/doc/src/sgml/ref/alter_publication.sgml @@ -30,7 +30,7 @@ ALTER PUBLICATION name RENAME TO where publication_object is one of: - TABLE [ ONLY ] table_name [ * ] [, ... ] + TABLE [ ONLY ] table_name [ * ] [ WHERE ( expression ) ] [, ... ] ALL TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] @@ -52,7 +52,9 @@ ALTER PUBLICATION name RENAME TO ALTER SUBSCRIPTION ... REFRESH PUBLICATION action on the - subscribing side in order to become effective. + subscribing side in order to become effective. Note also that the combination + of DROP with a WHERE clause is not + allowed. @@ -110,6 +112,12 @@ ALTER PUBLICATION name RENAME TO * can be specified after the table name to explicitly indicate that descendant tables are included. + If the optional WHERE clause is specified, rows for + which the expression + evaluates to false or null will not be published. Note that parentheses + are required around the expression. The + expression is evaluated with + the role used for the replication connection. diff --git a/doc/src/sgml/ref/alter_subscription.sgml b/doc/src/sgml/ref/alter_subscription.sgml index 0b027cc346..0d6f064f58 100644 --- a/doc/src/sgml/ref/alter_subscription.sgml +++ b/doc/src/sgml/ref/alter_subscription.sgml @@ -163,8 +163,11 @@ ALTER SUBSCRIPTION name RENAME TO < Specifies whether to copy pre-existing data in the publications that are being subscribed to when the replication starts. - The default is true. (Previously-subscribed - tables are not copied.) + The default is true. + + + Previously subscribed tables are not copied, even if a table's row + filter WHERE clause has since been modified. diff --git a/doc/src/sgml/ref/create_publication.sgml b/doc/src/sgml/ref/create_publication.sgml index 385975bfad..4979b9b646 100644 --- a/doc/src/sgml/ref/create_publication.sgml +++ b/doc/src/sgml/ref/create_publication.sgml @@ -28,7 +28,7 @@ CREATE PUBLICATION name where publication_object is one of: - TABLE [ ONLY ] table_name [ * ] [, ... ] + TABLE [ ONLY ] table_name [ * ] [ WHERE ( expression ) ] [, ... ] ALL TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] @@ -78,6 +78,14 @@ CREATE PUBLICATION name publication, so they are never explicitly added to the publication. + + If the optional WHERE clause is specified, rows for + which the expression + evaluates to false or null will not be published. Note that parentheses + are required around the expression. It has no effect on + TRUNCATE commands. + + Only persistent base tables and partitioned tables can be part of a publication. Temporary tables, unlogged tables, foreign tables, @@ -225,6 +233,22 @@ CREATE PUBLICATION name disallowed on those tables. + + A WHERE (i.e. row filter) expression must contain only + columns that are covered by the REPLICA IDENTITY, in + order for UPDATE and DELETE operations + to be published. For publication of INSERT operations, + any column may be used in the WHERE expression. The + WHERE clause allows simple expressions that don't have + user-defined functions, user-defined operators, user-defined types, + user-defined collations, non-immutable built-in functions, or references to + system columns. + If your publication contains a partitioned table, the publication parameter + publish_via_partition_root determines if it uses the + partition's row filter (if the parameter is false, the default) or the root + partitioned table's row filter. + + For an INSERT ... ON CONFLICT command, the publication will publish the operation that actually results from the command. So depending @@ -247,6 +271,11 @@ CREATE PUBLICATION name DDL operations are not published. + + + The WHERE clause expression is executed with the role used + for the replication connection. + @@ -259,6 +288,13 @@ CREATE PUBLICATION mypublication FOR TABLE users, departments; + + Create a publication that publishes all changes from active departments: + +CREATE PUBLICATION active_departments FOR TABLE departments WHERE (active IS TRUE); + + + Create a publication that publishes all changes in all tables: diff --git a/doc/src/sgml/ref/create_subscription.sgml b/doc/src/sgml/ref/create_subscription.sgml index 990a41f1a1..e80a2617a3 100644 --- a/doc/src/sgml/ref/create_subscription.sgml +++ b/doc/src/sgml/ref/create_subscription.sgml @@ -208,6 +208,11 @@ CREATE SUBSCRIPTION subscription_nametrue. + + If the publications contain WHERE clauses, it + will affect what data is copied. Refer to the + for details. + @@ -293,7 +298,7 @@ CREATE SUBSCRIPTION subscription_name - + Notes @@ -319,6 +324,26 @@ CREATE SUBSCRIPTION subscription_namecreate_slot = false. This is an implementation restriction that might be lifted in a future release. + + + If any table in the publication has a WHERE clause, rows + for which the expression + evaluates to false or null will not be published. If the subscription has + several publications in which the same table has been published with + different WHERE clauses, a row will be published if any + of the expressions (referring to that publish operation) are satisfied. In + the case of different WHERE clauses, if one of the + publications has no WHERE clause (referring to that + publish operation) or the publication is declared as + FOR ALL TABLES or + FOR ALL TABLES IN SCHEMA, rows are always published + regardless of the definition of the other expressions. + If the subscriber is a PostgreSQL version before + 15 then any row filtering is ignored during the initial data synchronization + phase. For this case, the user might want to consider deleting any initially + copied data that would be incompatible with subsequent filtering. + + diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index e14ca2f563..25998fbb39 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -275,18 +275,57 @@ GetPubPartitionOptionRelations(List *result, PublicationPartOpt pub_partopt, return result; } +/* + * Returns the relid of the topmost ancestor that is published via this + * publication if any, otherwise returns InvalidOid. + * + * Note that the list of ancestors should be ordered such that the topmost + * ancestor is at the end of the list. + */ +Oid +GetTopMostAncestorInPublication(Oid puboid, List *ancestors) +{ + ListCell *lc; + Oid topmost_relid = InvalidOid; + + /* + * Find the "topmost" ancestor that is in this publication. + */ + foreach(lc, ancestors) + { + Oid ancestor = lfirst_oid(lc); + List *apubids = GetRelationPublications(ancestor); + List *aschemaPubids = NIL; + + if (list_member_oid(apubids, puboid)) + topmost_relid = ancestor; + else + { + aschemaPubids = GetSchemaPublications(get_rel_namespace(ancestor)); + if (list_member_oid(aschemaPubids, puboid)) + topmost_relid = ancestor; + } + + list_free(apubids); + list_free(aschemaPubids); + } + + return topmost_relid; +} + /* * Insert new publication / relation mapping. */ ObjectAddress -publication_add_relation(Oid pubid, PublicationRelInfo *targetrel, +publication_add_relation(Oid pubid, PublicationRelInfo *pri, bool if_not_exists) { Relation rel; HeapTuple tup; Datum values[Natts_pg_publication_rel]; bool nulls[Natts_pg_publication_rel]; - Oid relid = RelationGetRelid(targetrel->relation); + Relation targetrel = pri->relation; + Oid relid = RelationGetRelid(targetrel); Oid pubreloid; Publication *pub = GetPublication(pubid); ObjectAddress myself, @@ -311,10 +350,10 @@ publication_add_relation(Oid pubid, PublicationRelInfo *targetrel, ereport(ERROR, (errcode(ERRCODE_DUPLICATE_OBJECT), errmsg("relation \"%s\" is already member of publication \"%s\"", - RelationGetRelationName(targetrel->relation), pub->name))); + RelationGetRelationName(targetrel), pub->name))); } - check_publication_add_relation(targetrel->relation); + check_publication_add_relation(targetrel); /* Form a tuple. */ memset(values, 0, sizeof(values)); @@ -328,6 +367,12 @@ publication_add_relation(Oid pubid, PublicationRelInfo *targetrel, values[Anum_pg_publication_rel_prrelid - 1] = ObjectIdGetDatum(relid); + /* Add qualifications, if available */ + if (pri->whereClause != NULL) + values[Anum_pg_publication_rel_prqual - 1] = CStringGetTextDatum(nodeToString(pri->whereClause)); + else + nulls[Anum_pg_publication_rel_prqual - 1] = true; + tup = heap_form_tuple(RelationGetDescr(rel), values, nulls); /* Insert tuple into catalog. */ @@ -345,6 +390,12 @@ publication_add_relation(Oid pubid, PublicationRelInfo *targetrel, ObjectAddressSet(referenced, RelationRelationId, relid); recordDependencyOn(&myself, &referenced, DEPENDENCY_AUTO); + /* Add dependency on the objects mentioned in the qualifications */ + if (pri->whereClause) + recordDependencyOnSingleRelExpr(&myself, pri->whereClause, relid, + DEPENDENCY_NORMAL, DEPENDENCY_NORMAL, + false); + /* Close the table. */ table_close(rel, RowExclusiveLock); diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index 0e4bb97fb7..16b8661a1b 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -26,6 +26,7 @@ #include "catalog/partition.h" #include "catalog/pg_inherits.h" #include "catalog/pg_namespace.h" +#include "catalog/pg_proc.h" #include "catalog/pg_publication.h" #include "catalog/pg_publication_namespace.h" #include "catalog/pg_publication_rel.h" @@ -36,6 +37,10 @@ #include "commands/publicationcmds.h" #include "funcapi.h" #include "miscadmin.h" +#include "nodes/nodeFuncs.h" +#include "parser/parse_clause.h" +#include "parser/parse_collate.h" +#include "parser/parse_relation.h" #include "storage/lmgr.h" #include "utils/acl.h" #include "utils/array.h" @@ -48,6 +53,19 @@ #include "utils/syscache.h" #include "utils/varlena.h" +/* + * Information used to validate the columns in the row filter expression. See + * contain_invalid_rfcolumn_walker for details. + */ +typedef struct rf_context +{ + Bitmapset *bms_replident; /* bitset of replica identity columns */ + bool pubviaroot; /* true if we are validating the parent + * relation's row filter */ + Oid relid; /* relid of the relation */ + Oid parentid; /* relid of the parent relation */ +} rf_context; + static List *OpenRelIdList(List *relids); static List *OpenTableList(List *tables); static void CloseTableList(List *rels); @@ -234,6 +252,362 @@ CheckObjSchemaNotAlreadyInPublication(List *rels, List *schemaidlist, } } +/* + * Returns true if any of the columns used in the row filter WHERE expression is + * not part of REPLICA IDENTITY, false otherwise. + */ +static bool +contain_invalid_rfcolumn_walker(Node *node, rf_context *context) +{ + if (node == NULL) + return false; + + if (IsA(node, Var)) + { + Var *var = (Var *) node; + AttrNumber attnum = var->varattno; + + /* + * If pubviaroot is true, we are validating the row filter of the + * parent table, but the bitmap contains the replica identity + * information of the child table. So, get the column number of the + * child table as parent and child column order could be different. + */ + if (context->pubviaroot) + { + char *colname = get_attname(context->parentid, attnum, false); + + attnum = get_attnum(context->relid, colname); + } + + if (!bms_is_member(attnum - FirstLowInvalidHeapAttributeNumber, + context->bms_replident)) + return true; + } + + return expression_tree_walker(node, contain_invalid_rfcolumn_walker, + (void *) context); +} + +/* + * Check if all columns referenced in the filter expression are part of the + * REPLICA IDENTITY index or not. + * + * Returns true if any invalid column is found. + */ +bool +contain_invalid_rfcolumn(Oid pubid, Relation relation, List *ancestors, + bool pubviaroot) +{ + HeapTuple rftuple; + Oid relid = RelationGetRelid(relation); + Oid publish_as_relid = RelationGetRelid(relation); + bool result = false; + Datum rfdatum; + bool rfisnull; + + /* + * FULL means all columns are in the REPLICA IDENTITY, so all columns are + * allowed in the row filter and we can skip the validation. + */ + if (relation->rd_rel->relreplident == REPLICA_IDENTITY_FULL) + return false; + + /* + * For a partition, if pubviaroot is true, find the topmost ancestor that + * is published via this publication as we need to use its row filter + * expression to filter the partition's changes. + * + * Note that even though the row filter used is for an ancestor, the + * REPLICA IDENTITY used will be for the actual child table. + */ + if (pubviaroot && relation->rd_rel->relispartition) + { + publish_as_relid = GetTopMostAncestorInPublication(pubid, ancestors); + + if (!OidIsValid(publish_as_relid)) + publish_as_relid = relid; + } + + rftuple = SearchSysCache2(PUBLICATIONRELMAP, + ObjectIdGetDatum(publish_as_relid), + ObjectIdGetDatum(pubid)); + + if (!HeapTupleIsValid(rftuple)) + return false; + + rfdatum = SysCacheGetAttr(PUBLICATIONRELMAP, rftuple, + Anum_pg_publication_rel_prqual, + &rfisnull); + + if (!rfisnull) + { + rf_context context = {0}; + Node *rfnode; + Bitmapset *bms = NULL; + + context.pubviaroot = pubviaroot; + context.parentid = publish_as_relid; + context.relid = relid; + + /* Remember columns that are part of the REPLICA IDENTITY */ + bms = RelationGetIndexAttrBitmap(relation, + INDEX_ATTR_BITMAP_IDENTITY_KEY); + + context.bms_replident = bms; + rfnode = stringToNode(TextDatumGetCString(rfdatum)); + result = contain_invalid_rfcolumn_walker(rfnode, &context); + + bms_free(bms); + pfree(rfnode); + } + + ReleaseSysCache(rftuple); + + return result; +} + +/* check_functions_in_node callback */ +static bool +contain_mutable_or_user_functions_checker(Oid func_id, void *context) +{ + return (func_volatile(func_id) != PROVOLATILE_IMMUTABLE || + func_id >= FirstNormalObjectId); +} + +/* + * Check if the node contains any unallowed object. See + * check_simple_rowfilter_expr_walker. + * + * Returns the error detail message in errdetail_msg for unallowed expressions. + */ +static void +expr_allowed_in_node(Node *node, ParseState *pstate, char **errdetail_msg) +{ + if (IsA(node, List)) + { + /* + * OK, we don't need to perform other expr checks for List nodes + * because those are undefined for List. + */ + return; + } + + if (exprType(node) >= FirstNormalObjectId) + *errdetail_msg = _("User-defined types are not allowed."); + else if (check_functions_in_node(node, contain_mutable_or_user_functions_checker, + (void *) pstate)) + *errdetail_msg = _("User-defined or built-in mutable functions are not allowed."); + else if (exprCollation(node) >= FirstNormalObjectId || + exprInputCollation(node) >= FirstNormalObjectId) + *errdetail_msg = _("User-defined collations are not allowed."); +} + +/* + * The row filter walker checks if the row filter expression is a "simple + * expression". + * + * It allows only simple or compound expressions such as: + * - (Var Op Const) + * - (Var Op Var) + * - (Var Op Const) AND/OR (Var Op Const) + * - etc + * (where Var is a column of the table this filter belongs to) + * + * The simple expression has the following restrictions: + * - User-defined operators are not allowed; + * - User-defined functions are not allowed; + * - User-defined types are not allowed; + * - User-defined collations are not allowed; + * - Non-immutable built-in functions are not allowed; + * - System columns are not allowed. + * + * NOTES + * + * We don't allow user-defined functions/operators/types/collations because + * (a) if a user drops a user-defined object used in a row filter expression or + * if there is any other error while using it, the logical decoding + * infrastructure won't be able to recover from such an error even if the + * object is recreated again because a historic snapshot is used to evaluate + * the row filter; + * (b) a user-defined function can be used to access tables that could have + * unpleasant results because a historic snapshot is used. That's why only + * immutable built-in functions are allowed in row filter expressions. + * + * We don't allow system columns because currently, we don't have that + * information in the tuple passed to downstream. Also, as we don't replicate + * those to subscribers, there doesn't seem to be a need for a filter on those + * columns. + * + * We can allow other node types after more analysis and testing. + */ +static bool +check_simple_rowfilter_expr_walker(Node *node, ParseState *pstate) +{ + char *errdetail_msg = NULL; + + if (node == NULL) + return false; + + switch (nodeTag(node)) + { + case T_Var: + /* System columns are not allowed. */ + if (((Var *) node)->varattno < InvalidAttrNumber) + errdetail_msg = _("System columns are not allowed."); + break; + case T_OpExpr: + case T_DistinctExpr: + case T_NullIfExpr: + /* OK, except user-defined operators are not allowed. */ + if (((OpExpr *) node)->opno >= FirstNormalObjectId) + errdetail_msg = _("User-defined operators are not allowed."); + break; + case T_ScalarArrayOpExpr: + /* OK, except user-defined operators are not allowed. */ + if (((ScalarArrayOpExpr *) node)->opno >= FirstNormalObjectId) + errdetail_msg = _("User-defined operators are not allowed."); + + /* + * We don't need to check the hashfuncid and negfuncid of + * ScalarArrayOpExpr as those functions are only built for a + * subquery. + */ + break; + case T_RowCompareExpr: + { + ListCell *opid; + + /* OK, except user-defined operators are not allowed. */ + foreach(opid, ((RowCompareExpr *) node)->opnos) + { + if (lfirst_oid(opid) >= FirstNormalObjectId) + { + errdetail_msg = _("User-defined operators are not allowed."); + break; + } + } + } + break; + case T_Const: + case T_FuncExpr: + case T_BoolExpr: + case T_RelabelType: + case T_CollateExpr: + case T_CaseExpr: + case T_CaseTestExpr: + case T_ArrayExpr: + case T_RowExpr: + case T_CoalesceExpr: + case T_MinMaxExpr: + case T_XmlExpr: + case T_NullTest: + case T_BooleanTest: + case T_List: + /* OK, supported */ + break; + default: + errdetail_msg = _("Expressions only allow columns, constants, built-in operators, built-in data types, built-in collations and immutable built-in functions."); + break; + } + + /* + * For all the supported nodes, check the types, functions, and collations + * used in the nodes. + */ + if (!errdetail_msg) + expr_allowed_in_node(node, pstate, &errdetail_msg); + + if (errdetail_msg) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("invalid publication WHERE expression"), + errdetail("%s", errdetail_msg), + parser_errposition(pstate, exprLocation(node)))); + + return expression_tree_walker(node, check_simple_rowfilter_expr_walker, + (void *) pstate); +} + +/* + * Check if the row filter expression is a "simple expression". + * + * See check_simple_rowfilter_expr_walker for details. + */ +static bool +check_simple_rowfilter_expr(Node *node, ParseState *pstate) +{ + return check_simple_rowfilter_expr_walker(node, pstate); +} + +/* + * Transform the publication WHERE expression for all the relations in the list, + * ensuring it is coerced to boolean and necessary collation information is + * added if required, and add a new nsitem/RTE for the associated relation to + * the ParseState's namespace list. + * + * Also check the publication row filter expression and throw an error if + * anything not permitted or unexpected is encountered. + */ +static void +TransformPubWhereClauses(List *tables, const char *queryString, + bool pubviaroot) +{ + ListCell *lc; + + foreach(lc, tables) + { + ParseNamespaceItem *nsitem; + Node *whereclause = NULL; + ParseState *pstate; + PublicationRelInfo *pri = (PublicationRelInfo *) lfirst(lc); + + if (pri->whereClause == NULL) + continue; + + /* + * If the publication doesn't publish changes via the root partitioned + * table, the partition's row filter will be used. So disallow using + * WHERE clause on partitioned table in this case. + */ + if (!pubviaroot && + pri->relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot use publication WHERE clause for relation \"%s\"", + RelationGetRelationName(pri->relation)), + errdetail("WHERE clause cannot be used for a partitioned table when %s is false.", + "publish_via_partition_root"))); + + pstate = make_parsestate(NULL); + pstate->p_sourcetext = queryString; + + nsitem = addRangeTableEntryForRelation(pstate, pri->relation, + AccessShareLock, NULL, + false, false); + + addNSItemToQuery(pstate, nsitem, false, true, true); + + whereclause = transformWhereClause(pstate, + copyObject(pri->whereClause), + EXPR_KIND_WHERE, + "PUBLICATION WHERE"); + + /* Fix up collation information */ + assign_expr_collations(pstate, whereclause); + + /* + * We allow only simple expressions in row filters. See + * check_simple_rowfilter_expr_walker. + */ + check_simple_rowfilter_expr(whereclause, pstate); + + free_parsestate(pstate); + + pri->whereClause = whereclause; + } +} + /* * Create new publication. */ @@ -346,6 +720,10 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) rels = OpenTableList(relations); CheckObjSchemaNotAlreadyInPublication(rels, schemaidlist, PUBLICATIONOBJ_TABLE); + + TransformPubWhereClauses(rels, pstate->p_sourcetext, + publish_via_partition_root); + PublicationAddTables(puboid, rels, true, NULL); CloseTableList(rels); } @@ -392,6 +770,8 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, bool publish_via_partition_root; ObjectAddress obj; Form_pg_publication pubform; + List *root_relids = NIL; + ListCell *lc; parse_publication_options(pstate, stmt->options, @@ -399,6 +779,65 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, &publish_via_partition_root_given, &publish_via_partition_root); + pubform = (Form_pg_publication) GETSTRUCT(tup); + + /* + * If the publication doesn't publish changes via the root partitioned + * table, the partition's row filter will be used. So disallow using WHERE + * clause on partitioned table in this case. + */ + if (!pubform->puballtables && publish_via_partition_root_given && + !publish_via_partition_root) + { + /* + * Lock the publication so nobody else can do anything with it. This + * prevents concurrent alter to add partitioned table(s) with WHERE + * clause(s) which we don't allow when not publishing via root. + */ + LockDatabaseObject(PublicationRelationId, pubform->oid, 0, + AccessShareLock); + + root_relids = GetPublicationRelations(pubform->oid, + PUBLICATION_PART_ROOT); + + foreach(lc, root_relids) + { + HeapTuple rftuple; + Oid relid = lfirst_oid(lc); + + rftuple = SearchSysCache2(PUBLICATIONRELMAP, + ObjectIdGetDatum(relid), + ObjectIdGetDatum(pubform->oid)); + + if (HeapTupleIsValid(rftuple) && + !heap_attisnull(rftuple, Anum_pg_publication_rel_prqual, NULL)) + { + HeapTuple tuple; + + tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid)); + if (HeapTupleIsValid(tuple)) + { + Form_pg_class relform = (Form_pg_class) GETSTRUCT(tuple); + + if (relform->relkind == RELKIND_PARTITIONED_TABLE) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot set %s for publication \"%s\"", + "publish_via_partition_root = false", + stmt->pubname), + errdetail("The publication contains a WHERE clause for a partitioned table \"%s\" " + "which is not allowed when %s is false.", + NameStr(relform->relname), + "publish_via_partition_root"))); + + ReleaseSysCache(tuple); + } + + ReleaseSysCache(rftuple); + } + } + } + /* Everything ok, form a new tuple. */ memset(values, 0, sizeof(values)); memset(nulls, false, sizeof(nulls)); @@ -450,8 +889,21 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, * invalidate all partitions contained in the respective partition * trees, not just those explicitly mentioned in the publication. */ - relids = GetPublicationRelations(pubform->oid, - PUBLICATION_PART_ALL); + if (root_relids == NIL) + relids = GetPublicationRelations(pubform->oid, + PUBLICATION_PART_ALL); + else + { + /* + * We already got tables explicitly mentioned in the publication. + * Now get all partitions for the partitioned table in the list. + */ + foreach(lc, root_relids) + relids = GetPubPartitionOptionRelations(relids, + PUBLICATION_PART_ALL, + lfirst_oid(lc)); + } + schemarelids = GetAllSchemaPublicationRelations(pubform->oid, PUBLICATION_PART_ALL); relids = list_concat_unique_oid(relids, schemarelids); @@ -492,7 +944,8 @@ InvalidatePublicationRels(List *relids) */ static void AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, - List *tables, List *schemaidlist) + List *tables, List *schemaidlist, + const char *queryString) { List *rels = NIL; Form_pg_publication pubform = (Form_pg_publication) GETSTRUCT(tup); @@ -519,6 +972,9 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, schemas = list_concat_copy(schemaidlist, GetPublicationSchemas(pubid)); CheckObjSchemaNotAlreadyInPublication(rels, schemas, PUBLICATIONOBJ_TABLE); + + TransformPubWhereClauses(rels, queryString, pubform->pubviaroot); + PublicationAddTables(pubid, rels, false, stmt); } else if (stmt->action == AP_DropObjects) @@ -533,37 +989,76 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, CheckObjSchemaNotAlreadyInPublication(rels, schemaidlist, PUBLICATIONOBJ_TABLE); - /* Calculate which relations to drop. */ + TransformPubWhereClauses(rels, queryString, pubform->pubviaroot); + + /* + * To recreate the relation list for the publication, look for + * existing relations that do not need to be dropped. + */ foreach(oldlc, oldrelids) { Oid oldrelid = lfirst_oid(oldlc); ListCell *newlc; + PublicationRelInfo *oldrel; bool found = false; + HeapTuple rftuple; + bool rfisnull = true; + Node *oldrelwhereclause = NULL; + + /* look up the cache for the old relmap */ + rftuple = SearchSysCache2(PUBLICATIONRELMAP, + ObjectIdGetDatum(oldrelid), + ObjectIdGetDatum(pubid)); + + if (HeapTupleIsValid(rftuple)) + { + Datum whereClauseDatum; + + whereClauseDatum = SysCacheGetAttr(PUBLICATIONRELMAP, rftuple, + Anum_pg_publication_rel_prqual, + &rfisnull); + if (!rfisnull) + oldrelwhereclause = stringToNode(TextDatumGetCString(whereClauseDatum)); + + ReleaseSysCache(rftuple); + } foreach(newlc, rels) { PublicationRelInfo *newpubrel; newpubrel = (PublicationRelInfo *) lfirst(newlc); + + /* + * Check if any of the new set of relations matches with the + * existing relations in the publication. Additionally, if the + * relation has an associated WHERE clause, check the WHERE + * expressions also match. Drop the rest. + */ if (RelationGetRelid(newpubrel->relation) == oldrelid) { - found = true; - break; + if (equal(oldrelwhereclause, newpubrel->whereClause)) + { + found = true; + break; + } } } - /* Not yet in the list, open it and add to the list */ - if (!found) - { - Relation oldrel; - PublicationRelInfo *pubrel; - /* Wrap relation into PublicationRelInfo */ - oldrel = table_open(oldrelid, ShareUpdateExclusiveLock); + if (oldrelwhereclause) + pfree(oldrelwhereclause); - pubrel = palloc(sizeof(PublicationRelInfo)); - pubrel->relation = oldrel; - - delrels = lappend(delrels, pubrel); + /* + * Add the non-matched relations to a list so that they can be + * dropped. + */ + if (!found) + { + oldrel = palloc(sizeof(PublicationRelInfo)); + oldrel->whereClause = NULL; + oldrel->relation = table_open(oldrelid, + ShareUpdateExclusiveLock); + delrels = lappend(delrels, oldrel); } } @@ -720,12 +1215,15 @@ AlterPublication(ParseState *pstate, AlterPublicationStmt *stmt) { List *relations = NIL; List *schemaidlist = NIL; + Oid pubid = pubform->oid; ObjectsInPublicationToOids(stmt->pubobjects, pstate, &relations, &schemaidlist); CheckAlterPublication(stmt, tup, relations, schemaidlist); + heap_freetuple(tup); + /* * Lock the publication so nobody else can do anything with it. This * prevents concurrent alter to add table(s) that were already going @@ -734,22 +1232,24 @@ AlterPublication(ParseState *pstate, AlterPublicationStmt *stmt) * addition of schema(s) for which there is any corresponding table * being added by this command. */ - LockDatabaseObject(PublicationRelationId, pubform->oid, 0, + LockDatabaseObject(PublicationRelationId, pubid, 0, AccessExclusiveLock); /* * It is possible that by the time we acquire the lock on publication, * concurrent DDL has removed it. We can test this by checking the - * existence of publication. + * existence of publication. We get the tuple again to avoid the risk + * of any publication option getting changed. */ - if (!SearchSysCacheExists1(PUBLICATIONOID, - ObjectIdGetDatum(pubform->oid))) + tup = SearchSysCacheCopy1(PUBLICATIONOID, ObjectIdGetDatum(pubid)); + if (!HeapTupleIsValid(tup)) ereport(ERROR, errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("publication \"%s\" does not exist", stmt->pubname)); - AlterPublicationTables(stmt, tup, relations, schemaidlist); + AlterPublicationTables(stmt, tup, relations, schemaidlist, + pstate->p_sourcetext); AlterPublicationSchemas(stmt, tup, schemaidlist); } @@ -901,6 +1401,7 @@ OpenTableList(List *tables) List *relids = NIL; List *rels = NIL; ListCell *lc; + List *relids_with_rf = NIL; /* * Open, share-lock, and check all the explicitly-specified relations @@ -928,15 +1429,26 @@ OpenTableList(List *tables) */ if (list_member_oid(relids, myrelid)) { + /* Disallow duplicate tables if there are any with row filters. */ + if (t->whereClause || list_member_oid(relids_with_rf, myrelid)) + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("conflicting or redundant WHERE clauses for table \"%s\"", + RelationGetRelationName(rel)))); + table_close(rel, ShareUpdateExclusiveLock); continue; } pub_rel = palloc(sizeof(PublicationRelInfo)); pub_rel->relation = rel; + pub_rel->whereClause = t->whereClause; rels = lappend(rels, pub_rel); relids = lappend_oid(relids, myrelid); + if (t->whereClause) + relids_with_rf = lappend_oid(relids_with_rf, myrelid); + /* * Add children of this rel, if requested, so that they too are added * to the publication. A partitioned table can't have any inheritance @@ -963,19 +1475,39 @@ OpenTableList(List *tables) * tables. */ if (list_member_oid(relids, childrelid)) + { + /* + * We don't allow to specify row filter for both parent + * and child table at the same time as it is not very + * clear which one should be given preference. + */ + if (childrelid != myrelid && + (t->whereClause || list_member_oid(relids_with_rf, childrelid))) + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("conflicting or redundant WHERE clauses for table \"%s\"", + RelationGetRelationName(rel)))); + continue; + } /* find_all_inheritors already got lock */ rel = table_open(childrelid, NoLock); pub_rel = palloc(sizeof(PublicationRelInfo)); pub_rel->relation = rel; + /* child inherits WHERE clause from parent */ + pub_rel->whereClause = t->whereClause; rels = lappend(rels, pub_rel); relids = lappend_oid(relids, childrelid); + + if (t->whereClause) + relids_with_rf = lappend_oid(relids_with_rf, childrelid); } } } list_free(relids); + list_free(relids_with_rf); return rels; } @@ -995,6 +1527,8 @@ CloseTableList(List *rels) pub_rel = (PublicationRelInfo *) lfirst(lc); table_close(pub_rel->relation, NoLock); } + + list_free_deep(rels); } /* @@ -1090,6 +1624,11 @@ PublicationDropTables(Oid pubid, List *rels, bool missing_ok) RelationGetRelationName(rel)))); } + if (pubrel->whereClause) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("cannot use a WHERE clause when removing a table from a publication"))); + ObjectAddressSet(obj, PublicationRelRelationId, prid); performDeletion(&obj, DROP_CASCADE, 0); } diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c index 313c87398b..de106d767d 100644 --- a/src/backend/executor/execReplication.c +++ b/src/backend/executor/execReplication.c @@ -567,15 +567,43 @@ ExecSimpleRelationDelete(ResultRelInfo *resultRelInfo, void CheckCmdReplicaIdentity(Relation rel, CmdType cmd) { - PublicationActions *pubactions; + PublicationDesc pubdesc; /* We only need to do checks for UPDATE and DELETE. */ if (cmd != CMD_UPDATE && cmd != CMD_DELETE) return; + if (rel->rd_rel->relreplident == REPLICA_IDENTITY_FULL) + return; + + /* + * It is only safe to execute UPDATE/DELETE when all columns, referenced + * in the row filters from publications which the relation is in, are + * valid - i.e. when all referenced columns are part of REPLICA IDENTITY + * or the table does not publish UPDATEs or DELETEs. + * + * XXX We could optimize it by first checking whether any of the + * publications have a row filter for this relation. If not and relation + * has replica identity then we can avoid building the descriptor but as + * this happens only one time it doesn't seem worth the additional + * complexity. + */ + RelationBuildPublicationDesc(rel, &pubdesc); + if (cmd == CMD_UPDATE && !pubdesc.rf_valid_for_update) + ereport(ERROR, + (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), + errmsg("cannot update table \"%s\"", + RelationGetRelationName(rel)), + errdetail("Column used in the publication WHERE expression is not part of the replica identity."))); + else if (cmd == CMD_DELETE && !pubdesc.rf_valid_for_delete) + ereport(ERROR, + (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), + errmsg("cannot delete from table \"%s\"", + RelationGetRelationName(rel)), + errdetail("Column used in the publication WHERE expression is not part of the replica identity."))); + /* If relation has replica identity we are always good. */ - if (rel->rd_rel->relreplident == REPLICA_IDENTITY_FULL || - OidIsValid(RelationGetReplicaIndex(rel))) + if (OidIsValid(RelationGetReplicaIndex(rel))) return; /* @@ -583,14 +611,13 @@ CheckCmdReplicaIdentity(Relation rel, CmdType cmd) * * Check if the table publishes UPDATES or DELETES. */ - pubactions = GetRelationPublicationActions(rel); - if (cmd == CMD_UPDATE && pubactions->pubupdate) + if (cmd == CMD_UPDATE && pubdesc.pubactions.pubupdate) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("cannot update table \"%s\" because it does not have a replica identity and publishes updates", RelationGetRelationName(rel)), errhint("To enable updating the table, set REPLICA IDENTITY using ALTER TABLE."))); - else if (cmd == CMD_DELETE && pubactions->pubdelete) + else if (cmd == CMD_DELETE && pubdesc.pubactions.pubdelete) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes", diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index bc0d90b4b1..d4f8455a2b 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -4849,6 +4849,7 @@ _copyPublicationTable(const PublicationTable *from) PublicationTable *newnode = makeNode(PublicationTable); COPY_NODE_FIELD(relation); + COPY_NODE_FIELD(whereClause); return newnode; } diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 2e7122ad2f..f1002afe7a 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -2321,6 +2321,7 @@ static bool _equalPublicationTable(const PublicationTable *a, const PublicationTable *b) { COMPARE_NODE_FIELD(relation); + COMPARE_NODE_FIELD(whereClause); return true; } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 92f93cfc72..a03b33b53b 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -9751,12 +9751,13 @@ CreatePublicationStmt: * relation_expr here. */ PublicationObjSpec: - TABLE relation_expr + TABLE relation_expr OptWhereClause { $$ = makeNode(PublicationObjSpec); $$->pubobjtype = PUBLICATIONOBJ_TABLE; $$->pubtable = makeNode(PublicationTable); $$->pubtable->relation = $2; + $$->pubtable->whereClause = $3; } | ALL TABLES IN_P SCHEMA ColId { @@ -9771,28 +9772,45 @@ PublicationObjSpec: $$->pubobjtype = PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA; $$->location = @5; } - | ColId + | ColId OptWhereClause { $$ = makeNode(PublicationObjSpec); $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; - $$->name = $1; + if ($2) + { + /* + * The OptWhereClause must be stored here but it is + * valid only for tables. For non-table objects, an + * error will be thrown later via + * preprocess_pubobj_list(). + */ + $$->pubtable = makeNode(PublicationTable); + $$->pubtable->relation = makeRangeVar(NULL, $1, @1); + $$->pubtable->whereClause = $2; + } + else + { + $$->name = $1; + } $$->location = @1; } - | ColId indirection + | ColId indirection OptWhereClause { $$ = makeNode(PublicationObjSpec); $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; $$->pubtable = makeNode(PublicationTable); $$->pubtable->relation = makeRangeVarFromQualifiedName($1, $2, @1, yyscanner); + $$->pubtable->whereClause = $3; $$->location = @1; } /* grammar like tablename * , ONLY tablename, ONLY ( tablename ) */ - | extended_relation_expr + | extended_relation_expr OptWhereClause { $$ = makeNode(PublicationObjSpec); $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; $$->pubtable = makeNode(PublicationTable); $$->pubtable->relation = $1; + $$->pubtable->whereClause = $2; } | CURRENT_SCHEMA { @@ -17448,7 +17466,8 @@ preprocess_pubobj_list(List *pubobjspec_list, core_yyscan_t yyscanner) errcode(ERRCODE_SYNTAX_ERROR), errmsg("invalid table name at or near"), parser_errposition(pubobj->location)); - else if (pubobj->name) + + if (pubobj->name) { /* convert it to PublicationTable */ PublicationTable *pubtable = makeNode(PublicationTable); @@ -17462,6 +17481,13 @@ preprocess_pubobj_list(List *pubobjspec_list, core_yyscan_t yyscanner) else if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLES_IN_SCHEMA || pubobj->pubobjtype == PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA) { + /* WHERE clause is not allowed on a schema object */ + if (pubobj->pubtable && pubobj->pubtable->whereClause) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("WHERE clause not allowed for schema"), + parser_errposition(pubobj->location)); + /* * We can distinguish between the different type of schema * objects based on whether name and pubtable is set. diff --git a/src/backend/replication/logical/proto.c b/src/backend/replication/logical/proto.c index 953942692c..c9b0eeefd7 100644 --- a/src/backend/replication/logical/proto.c +++ b/src/backend/replication/logical/proto.c @@ -31,8 +31,8 @@ static void logicalrep_write_attrs(StringInfo out, Relation rel); static void logicalrep_write_tuple(StringInfo out, Relation rel, - HeapTuple tuple, bool binary); - + TupleTableSlot *slot, + bool binary); static void logicalrep_read_attrs(StringInfo in, LogicalRepRelation *rel); static void logicalrep_read_tuple(StringInfo in, LogicalRepTupleData *tuple); @@ -398,7 +398,7 @@ logicalrep_read_origin(StringInfo in, XLogRecPtr *origin_lsn) */ void logicalrep_write_insert(StringInfo out, TransactionId xid, Relation rel, - HeapTuple newtuple, bool binary) + TupleTableSlot *newslot, bool binary) { pq_sendbyte(out, LOGICAL_REP_MSG_INSERT); @@ -410,7 +410,7 @@ logicalrep_write_insert(StringInfo out, TransactionId xid, Relation rel, pq_sendint32(out, RelationGetRelid(rel)); pq_sendbyte(out, 'N'); /* new tuple follows */ - logicalrep_write_tuple(out, rel, newtuple, binary); + logicalrep_write_tuple(out, rel, newslot, binary); } /* @@ -442,7 +442,8 @@ logicalrep_read_insert(StringInfo in, LogicalRepTupleData *newtup) */ void logicalrep_write_update(StringInfo out, TransactionId xid, Relation rel, - HeapTuple oldtuple, HeapTuple newtuple, bool binary) + TupleTableSlot *oldslot, TupleTableSlot *newslot, + bool binary) { pq_sendbyte(out, LOGICAL_REP_MSG_UPDATE); @@ -457,17 +458,17 @@ logicalrep_write_update(StringInfo out, TransactionId xid, Relation rel, /* use Oid as relation identifier */ pq_sendint32(out, RelationGetRelid(rel)); - if (oldtuple != NULL) + if (oldslot != NULL) { if (rel->rd_rel->relreplident == REPLICA_IDENTITY_FULL) pq_sendbyte(out, 'O'); /* old tuple follows */ else pq_sendbyte(out, 'K'); /* old key follows */ - logicalrep_write_tuple(out, rel, oldtuple, binary); + logicalrep_write_tuple(out, rel, oldslot, binary); } pq_sendbyte(out, 'N'); /* new tuple follows */ - logicalrep_write_tuple(out, rel, newtuple, binary); + logicalrep_write_tuple(out, rel, newslot, binary); } /* @@ -516,7 +517,7 @@ logicalrep_read_update(StringInfo in, bool *has_oldtuple, */ void logicalrep_write_delete(StringInfo out, TransactionId xid, Relation rel, - HeapTuple oldtuple, bool binary) + TupleTableSlot *oldslot, bool binary) { Assert(rel->rd_rel->relreplident == REPLICA_IDENTITY_DEFAULT || rel->rd_rel->relreplident == REPLICA_IDENTITY_FULL || @@ -536,7 +537,7 @@ logicalrep_write_delete(StringInfo out, TransactionId xid, Relation rel, else pq_sendbyte(out, 'K'); /* old key follows */ - logicalrep_write_tuple(out, rel, oldtuple, binary); + logicalrep_write_tuple(out, rel, oldslot, binary); } /* @@ -749,11 +750,12 @@ logicalrep_read_typ(StringInfo in, LogicalRepTyp *ltyp) * Write a tuple to the outputstream, in the most efficient format possible. */ static void -logicalrep_write_tuple(StringInfo out, Relation rel, HeapTuple tuple, bool binary) +logicalrep_write_tuple(StringInfo out, Relation rel, TupleTableSlot *slot, + bool binary) { TupleDesc desc; - Datum values[MaxTupleAttributeNumber]; - bool isnull[MaxTupleAttributeNumber]; + Datum *values; + bool *isnull; int i; uint16 nliveatts = 0; @@ -767,11 +769,9 @@ logicalrep_write_tuple(StringInfo out, Relation rel, HeapTuple tuple, bool binar } pq_sendint16(out, nliveatts); - /* try to allocate enough memory from the get-go */ - enlargeStringInfo(out, tuple->t_len + - nliveatts * (1 + 4)); - - heap_deform_tuple(tuple, desc, values, isnull); + slot_getallattrs(slot); + values = slot->tts_values; + isnull = slot->tts_isnull; /* Write the values */ for (i = 0; i < desc->natts; i++) diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index e596b69d46..1659964571 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -690,19 +690,23 @@ copy_read_data(void *outbuf, int minread, int maxread) /* * Get information about remote relation in similar fashion the RELATION - * message provides during replication. + * message provides during replication. This function also returns the relation + * qualifications to be used in the COPY command. */ static void fetch_remote_table_info(char *nspname, char *relname, - LogicalRepRelation *lrel) + LogicalRepRelation *lrel, List **qual) { WalRcvExecResult *res; StringInfoData cmd; TupleTableSlot *slot; Oid tableRow[] = {OIDOID, CHAROID, CHAROID}; Oid attrRow[] = {TEXTOID, OIDOID, BOOLOID}; + Oid qualRow[] = {TEXTOID}; bool isnull; int natt; + ListCell *lc; + bool first; lrel->nspname = nspname; lrel->relname = relname; @@ -798,6 +802,98 @@ fetch_remote_table_info(char *nspname, char *relname, lrel->natts = natt; walrcv_clear_result(res); + + /* + * Get relation's row filter expressions. DISTINCT avoids the same + * expression of a table in multiple publications from being included + * multiple times in the final expression. + * + * We need to copy the row even if it matches just one of the + * publications, so we later combine all the quals with OR. + * + * For initial synchronization, row filtering can be ignored in following + * cases: + * + * 1) one of the subscribed publications for the table hasn't specified + * any row filter + * + * 2) one of the subscribed publications has puballtables set to true + * + * 3) one of the subscribed publications is declared as ALL TABLES IN + * SCHEMA that includes this relation + */ + if (walrcv_server_version(LogRepWorkerWalRcvConn) >= 150000) + { + StringInfoData pub_names; + + /* Build the pubname list. */ + initStringInfo(&pub_names); + first = true; + foreach(lc, MySubscription->publications) + { + char *pubname = strVal(lfirst(lc)); + + if (first) + first = false; + else + appendStringInfoString(&pub_names, ", "); + + appendStringInfoString(&pub_names, quote_literal_cstr(pubname)); + } + + /* Check for row filters. */ + resetStringInfo(&cmd); + appendStringInfo(&cmd, + "SELECT DISTINCT pg_get_expr(pr.prqual, pr.prrelid)" + " FROM pg_publication p" + " LEFT OUTER JOIN pg_publication_rel pr" + " ON (p.oid = pr.prpubid AND pr.prrelid = %u)," + " LATERAL pg_get_publication_tables(p.pubname) gpt" + " WHERE gpt.relid = %u" + " AND p.pubname IN ( %s )", + lrel->remoteid, + lrel->remoteid, + pub_names.data); + + res = walrcv_exec(LogRepWorkerWalRcvConn, cmd.data, 1, qualRow); + + if (res->status != WALRCV_OK_TUPLES) + ereport(ERROR, + (errmsg("could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s", + nspname, relname, res->err))); + + /* + * Multiple row filter expressions for the same table will be combined + * by COPY using OR. If any of the filter expressions for this table + * are null, it means the whole table will be copied. In this case it + * is not necessary to construct a unified row filter expression at + * all. + */ + slot = MakeSingleTupleTableSlot(res->tupledesc, &TTSOpsMinimalTuple); + while (tuplestore_gettupleslot(res->tuplestore, true, false, slot)) + { + Datum rf = slot_getattr(slot, 1, &isnull); + + if (!isnull) + *qual = lappend(*qual, makeString(TextDatumGetCString(rf))); + else + { + /* Ignore filters and cleanup as necessary. */ + if (*qual) + { + list_free_deep(*qual); + *qual = NIL; + } + break; + } + + ExecClearTuple(slot); + } + ExecDropSingleTupleTableSlot(slot); + + walrcv_clear_result(res); + } + pfree(cmd.data); } @@ -811,6 +907,7 @@ copy_table(Relation rel) { LogicalRepRelMapEntry *relmapentry; LogicalRepRelation lrel; + List *qual = NIL; WalRcvExecResult *res; StringInfoData cmd; CopyFromState cstate; @@ -819,7 +916,7 @@ copy_table(Relation rel) /* Get the publisher relation info. */ fetch_remote_table_info(get_namespace_name(RelationGetNamespace(rel)), - RelationGetRelationName(rel), &lrel); + RelationGetRelationName(rel), &lrel, &qual); /* Put the relation into relmap. */ logicalrep_relmap_update(&lrel); @@ -830,14 +927,18 @@ copy_table(Relation rel) /* Start copy on the publisher. */ initStringInfo(&cmd); - if (lrel.relkind == RELKIND_RELATION) + + /* Regular table with no row filter */ + if (lrel.relkind == RELKIND_RELATION && qual == NIL) appendStringInfo(&cmd, "COPY %s TO STDOUT", quote_qualified_identifier(lrel.nspname, lrel.relname)); else { /* - * For non-tables, we need to do COPY (SELECT ...), but we can't just - * do SELECT * because we need to not copy generated columns. + * For non-tables and tables with row filters, we need to do COPY + * (SELECT ...), but we can't just do SELECT * because we need to not + * copy generated columns. For tables with any row filters, build a + * SELECT query with OR'ed row filters for COPY. */ appendStringInfoString(&cmd, "COPY (SELECT "); for (int i = 0; i < lrel.natts; i++) @@ -846,8 +947,33 @@ copy_table(Relation rel) if (i < lrel.natts - 1) appendStringInfoString(&cmd, ", "); } - appendStringInfo(&cmd, " FROM %s) TO STDOUT", - quote_qualified_identifier(lrel.nspname, lrel.relname)); + + appendStringInfoString(&cmd, " FROM "); + + /* + * For regular tables, make sure we don't copy data from a child that + * inherits the named table as those will be copied separately. + */ + if (lrel.relkind == RELKIND_RELATION) + appendStringInfoString(&cmd, "ONLY "); + + appendStringInfoString(&cmd, quote_qualified_identifier(lrel.nspname, lrel.relname)); + /* list of OR'ed filters */ + if (qual != NIL) + { + ListCell *lc; + char *q = strVal(linitial(qual)); + + appendStringInfo(&cmd, " WHERE %s", q); + for_each_from(lc, qual, 1) + { + q = strVal(lfirst(lc)); + appendStringInfo(&cmd, " OR %s", q); + } + list_free_deep(qual); + } + + appendStringInfoString(&cmd, ") TO STDOUT"); } res = walrcv_exec(LogRepWorkerWalRcvConn, cmd.data, 0, NULL); pfree(cmd.data); diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 4162bb8de7..ea57a0477f 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -15,12 +15,17 @@ #include "access/tupconvert.h" #include "catalog/partition.h" #include "catalog/pg_publication.h" +#include "catalog/pg_publication_rel.h" #include "commands/defrem.h" +#include "executor/executor.h" #include "fmgr.h" +#include "nodes/makefuncs.h" +#include "optimizer/optimizer.h" #include "replication/logical.h" #include "replication/logicalproto.h" #include "replication/origin.h" #include "replication/pgoutput.h" +#include "utils/builtins.h" #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/memutils.h" @@ -85,6 +90,19 @@ static void send_repl_origin(LogicalDecodingContext *ctx, RepOriginId origin_id, XLogRecPtr origin_lsn, bool send_origin); +/* + * Only 3 publication actions are used for row filtering ("insert", "update", + * "delete"). See RelationSyncEntry.exprstate[]. + */ +enum RowFilterPubAction +{ + PUBACTION_INSERT, + PUBACTION_UPDATE, + PUBACTION_DELETE +}; + +#define NUM_ROWFILTER_PUBACTIONS (PUBACTION_DELETE+1) + /* * Entry in the map used to remember which relation schemas we sent. * @@ -116,6 +134,21 @@ typedef struct RelationSyncEntry /* are we publishing this rel? */ PublicationActions pubactions; + /* + * ExprState array for row filter. Different publication actions don't + * allow multiple expressions to always be combined into one, because + * updates or deletes restrict the column in expression to be part of the + * replica identity index whereas inserts do not have this restriction, so + * there is one ExprState per publication action. + */ + ExprState *exprstate[NUM_ROWFILTER_PUBACTIONS]; + EState *estate; /* executor state used for row filter */ + MemoryContext cache_expr_cxt; /* private context for exprstate and + * estate, if any */ + + TupleTableSlot *new_slot; /* slot for storing new tuple */ + TupleTableSlot *old_slot; /* slot for storing old tuple */ + /* * OID of the relation to publish changes as. For a partition, this may * be set to one of its ancestors whose schema will be used when @@ -130,7 +163,7 @@ typedef struct RelationSyncEntry * same as 'relid' or if unnecessary due to partition and the ancestor * having identical TupleDesc. */ - TupleConversionMap *map; + AttrMap *attrmap; } RelationSyncEntry; /* Map used to remember which relation schemas we sent. */ @@ -138,7 +171,8 @@ static HTAB *RelationSyncCache = NULL; static void init_rel_sync_cache(MemoryContext decoding_context); static void cleanup_rel_sync_cache(TransactionId xid, bool is_commit); -static RelationSyncEntry *get_rel_sync_entry(PGOutputData *data, Oid relid); +static RelationSyncEntry *get_rel_sync_entry(PGOutputData *data, + Relation relation); static void rel_sync_cache_relation_cb(Datum arg, Oid relid); static void rel_sync_cache_publication_cb(Datum arg, int cacheid, uint32 hashvalue); @@ -146,6 +180,20 @@ static void set_schema_sent_in_streamed_txn(RelationSyncEntry *entry, TransactionId xid); static bool get_schema_sent_in_streamed_txn(RelationSyncEntry *entry, TransactionId xid); +static void init_tuple_slot(PGOutputData *data, Relation relation, + RelationSyncEntry *entry); + +/* row filter routines */ +static EState *create_estate_for_relation(Relation rel); +static void pgoutput_row_filter_init(PGOutputData *data, + List *publications, + RelationSyncEntry *entry); +static bool pgoutput_row_filter_exec_expr(ExprState *state, + ExprContext *econtext); +static bool pgoutput_row_filter(Relation relation, TupleTableSlot *old_slot, + TupleTableSlot **new_slot_ptr, + RelationSyncEntry *entry, + ReorderBufferChangeType *action); /* * Specify output plugin callbacks @@ -303,6 +351,10 @@ pgoutput_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt, "logical replication output context", ALLOCSET_DEFAULT_SIZES); + data->cachectx = AllocSetContextCreate(ctx->context, + "logical replication cache context", + ALLOCSET_DEFAULT_SIZES); + ctx->output_plugin_private = data; /* This plugin uses binary protocol. */ @@ -543,37 +595,14 @@ maybe_send_schema(LogicalDecodingContext *ctx, return; /* - * Nope, so send the schema. If the changes will be published using an - * ancestor's schema, not the relation's own, send that ancestor's schema - * before sending relation's own (XXX - maybe sending only the former - * suffices?). This is also a good place to set the map that will be used - * to convert the relation's tuples into the ancestor's format, if needed. + * Send the schema. If the changes will be published using an ancestor's + * schema, not the relation's own, send that ancestor's schema before + * sending relation's own (XXX - maybe sending only the former suffices?). */ if (relentry->publish_as_relid != RelationGetRelid(relation)) { Relation ancestor = RelationIdGetRelation(relentry->publish_as_relid); - TupleDesc indesc = RelationGetDescr(relation); - TupleDesc outdesc = RelationGetDescr(ancestor); - MemoryContext oldctx; - - /* Map must live as long as the session does. */ - oldctx = MemoryContextSwitchTo(CacheMemoryContext); - /* - * Make copies of the TupleDescs that will live as long as the map - * does before putting into the map. - */ - indesc = CreateTupleDescCopy(indesc); - outdesc = CreateTupleDescCopy(outdesc); - relentry->map = convert_tuples_by_name(indesc, outdesc); - if (relentry->map == NULL) - { - /* Map not necessary, so free the TupleDescs too. */ - FreeTupleDesc(indesc); - FreeTupleDesc(outdesc); - } - - MemoryContextSwitchTo(oldctx); send_relation_and_attrs(ancestor, xid, ctx); RelationClose(ancestor); } @@ -624,6 +653,484 @@ send_relation_and_attrs(Relation relation, TransactionId xid, OutputPluginWrite(ctx, false); } +/* + * Executor state preparation for evaluation of row filter expressions for the + * specified relation. + */ +static EState * +create_estate_for_relation(Relation rel) +{ + EState *estate; + RangeTblEntry *rte; + + estate = CreateExecutorState(); + + rte = makeNode(RangeTblEntry); + rte->rtekind = RTE_RELATION; + rte->relid = RelationGetRelid(rel); + rte->relkind = rel->rd_rel->relkind; + rte->rellockmode = AccessShareLock; + ExecInitRangeTable(estate, list_make1(rte)); + + estate->es_output_cid = GetCurrentCommandId(false); + + return estate; +} + +/* + * Evaluates row filter. + * + * If the row filter evaluates to NULL, it is taken as false i.e. the change + * isn't replicated. + */ +static bool +pgoutput_row_filter_exec_expr(ExprState *state, ExprContext *econtext) +{ + Datum ret; + bool isnull; + + Assert(state != NULL); + + ret = ExecEvalExprSwitchContext(state, econtext, &isnull); + + elog(DEBUG3, "row filter evaluates to %s (isnull: %s)", + isnull ? "false" : DatumGetBool(ret) ? "true" : "false", + isnull ? "true" : "false"); + + if (isnull) + return false; + + return DatumGetBool(ret); +} + +/* + * Initialize the row filter. + */ +static void +pgoutput_row_filter_init(PGOutputData *data, List *publications, + RelationSyncEntry *entry) +{ + ListCell *lc; + List *rfnodes[] = {NIL, NIL, NIL}; /* One per pubaction */ + bool no_filter[] = {false, false, false}; /* One per pubaction */ + MemoryContext oldctx; + int idx; + bool has_filter = true; + + /* + * Find if there are any row filters for this relation. If there are, then + * prepare the necessary ExprState and cache it in entry->exprstate. To + * build an expression state, we need to ensure the following: + * + * All the given publication-table mappings must be checked. + * + * Multiple publications might have multiple row filters for this + * relation. Since row filter usage depends on the DML operation, there + * are multiple lists (one for each operation) to which row filters will + * be appended. + * + * FOR ALL TABLES implies "don't use row filter expression" so it takes + * precedence. + */ + foreach(lc, publications) + { + Publication *pub = lfirst(lc); + HeapTuple rftuple = NULL; + Datum rfdatum = 0; + bool pub_no_filter = false; + + if (pub->alltables) + { + /* + * If the publication is FOR ALL TABLES then it is treated the + * same as if this table has no row filters (even if for other + * publications it does). + */ + pub_no_filter = true; + } + else + { + /* + * Check for the presence of a row filter in this publication. + */ + rftuple = SearchSysCache2(PUBLICATIONRELMAP, + ObjectIdGetDatum(entry->publish_as_relid), + ObjectIdGetDatum(pub->oid)); + + if (HeapTupleIsValid(rftuple)) + { + /* Null indicates no filter. */ + rfdatum = SysCacheGetAttr(PUBLICATIONRELMAP, rftuple, + Anum_pg_publication_rel_prqual, + &pub_no_filter); + } + else + { + pub_no_filter = true; + } + } + + if (pub_no_filter) + { + if (rftuple) + ReleaseSysCache(rftuple); + + no_filter[PUBACTION_INSERT] |= pub->pubactions.pubinsert; + no_filter[PUBACTION_UPDATE] |= pub->pubactions.pubupdate; + no_filter[PUBACTION_DELETE] |= pub->pubactions.pubdelete; + + /* + * Quick exit if all the DML actions are publicized via this + * publication. + */ + if (no_filter[PUBACTION_INSERT] && + no_filter[PUBACTION_UPDATE] && + no_filter[PUBACTION_DELETE]) + { + has_filter = false; + break; + } + + /* No additional work for this publication. Next one. */ + continue; + } + + /* Form the per pubaction row filter lists. */ + if (pub->pubactions.pubinsert && !no_filter[PUBACTION_INSERT]) + rfnodes[PUBACTION_INSERT] = lappend(rfnodes[PUBACTION_INSERT], + TextDatumGetCString(rfdatum)); + if (pub->pubactions.pubupdate && !no_filter[PUBACTION_UPDATE]) + rfnodes[PUBACTION_UPDATE] = lappend(rfnodes[PUBACTION_UPDATE], + TextDatumGetCString(rfdatum)); + if (pub->pubactions.pubdelete && !no_filter[PUBACTION_DELETE]) + rfnodes[PUBACTION_DELETE] = lappend(rfnodes[PUBACTION_DELETE], + TextDatumGetCString(rfdatum)); + + ReleaseSysCache(rftuple); + } /* loop all subscribed publications */ + + /* Clean the row filter */ + for (idx = 0; idx < NUM_ROWFILTER_PUBACTIONS; idx++) + { + if (no_filter[idx]) + { + list_free_deep(rfnodes[idx]); + rfnodes[idx] = NIL; + } + } + + if (has_filter) + { + Relation relation = RelationIdGetRelation(entry->publish_as_relid); + + Assert(entry->cache_expr_cxt == NULL); + + /* Create the memory context for row filters */ + entry->cache_expr_cxt = AllocSetContextCreate(data->cachectx, + "Row filter expressions", + ALLOCSET_DEFAULT_SIZES); + + MemoryContextCopyAndSetIdentifier(entry->cache_expr_cxt, + RelationGetRelationName(relation)); + + /* + * Now all the filters for all pubactions are known. Combine them when + * their pubactions are the same. + */ + oldctx = MemoryContextSwitchTo(entry->cache_expr_cxt); + entry->estate = create_estate_for_relation(relation); + for (idx = 0; idx < NUM_ROWFILTER_PUBACTIONS; idx++) + { + List *filters = NIL; + Expr *rfnode; + + if (rfnodes[idx] == NIL) + continue; + + foreach(lc, rfnodes[idx]) + filters = lappend(filters, stringToNode((char *) lfirst(lc))); + + /* combine the row filter and cache the ExprState */ + rfnode = make_orclause(filters); + entry->exprstate[idx] = ExecPrepareExpr(rfnode, entry->estate); + } /* for each pubaction */ + MemoryContextSwitchTo(oldctx); + + RelationClose(relation); + } +} + +/* + * Initialize the slot for storing new and old tuples, and build the map that + * will be used to convert the relation's tuples into the ancestor's format. + */ +static void +init_tuple_slot(PGOutputData *data, Relation relation, + RelationSyncEntry *entry) +{ + MemoryContext oldctx; + TupleDesc oldtupdesc; + TupleDesc newtupdesc; + + oldctx = MemoryContextSwitchTo(data->cachectx); + + /* + * Create tuple table slots. Create a copy of the TupleDesc as it needs to + * live as long as the cache remains. + */ + oldtupdesc = CreateTupleDescCopy(RelationGetDescr(relation)); + newtupdesc = CreateTupleDescCopy(RelationGetDescr(relation)); + + entry->old_slot = MakeSingleTupleTableSlot(oldtupdesc, &TTSOpsHeapTuple); + entry->new_slot = MakeSingleTupleTableSlot(newtupdesc, &TTSOpsHeapTuple); + + MemoryContextSwitchTo(oldctx); + + /* + * Cache the map that will be used to convert the relation's tuples into + * the ancestor's format, if needed. + */ + if (entry->publish_as_relid != RelationGetRelid(relation)) + { + Relation ancestor = RelationIdGetRelation(entry->publish_as_relid); + TupleDesc indesc = RelationGetDescr(relation); + TupleDesc outdesc = RelationGetDescr(ancestor); + + /* Map must live as long as the session does. */ + oldctx = MemoryContextSwitchTo(CacheMemoryContext); + + entry->attrmap = build_attrmap_by_name_if_req(indesc, outdesc); + + MemoryContextSwitchTo(oldctx); + RelationClose(ancestor); + } +} + +/* + * Change is checked against the row filter if any. + * + * Returns true if the change is to be replicated, else false. + * + * For inserts, evaluate the row filter for new tuple. + * For deletes, evaluate the row filter for old tuple. + * For updates, evaluate the row filter for old and new tuple. + * + * For updates, if both evaluations are true, we allow sending the UPDATE and + * if both the evaluations are false, it doesn't replicate the UPDATE. Now, if + * only one of the tuples matches the row filter expression, we transform + * UPDATE to DELETE or INSERT to avoid any data inconsistency based on the + * following rules: + * + * Case 1: old-row (no match) new-row (no match) -> (drop change) + * Case 2: old-row (no match) new row (match) -> INSERT + * Case 3: old-row (match) new-row (no match) -> DELETE + * Case 4: old-row (match) new row (match) -> UPDATE + * + * The new action is updated in the action parameter. + * + * The new slot could be updated when transforming the UPDATE into INSERT, + * because the original new tuple might not have column values from the replica + * identity. + * + * Examples: + * Let's say the old tuple satisfies the row filter but the new tuple doesn't. + * Since the old tuple satisfies, the initial table synchronization copied this + * row (or another method was used to guarantee that there is data + * consistency). However, after the UPDATE the new tuple doesn't satisfy the + * row filter, so from a data consistency perspective, that row should be + * removed on the subscriber. The UPDATE should be transformed into a DELETE + * statement and be sent to the subscriber. Keeping this row on the subscriber + * is undesirable because it doesn't reflect what was defined in the row filter + * expression on the publisher. This row on the subscriber would likely not be + * modified by replication again. If someone inserted a new row with the same + * old identifier, replication could stop due to a constraint violation. + * + * Let's say the old tuple doesn't match the row filter but the new tuple does. + * Since the old tuple doesn't satisfy, the initial table synchronization + * probably didn't copy this row. However, after the UPDATE the new tuple does + * satisfy the row filter, so from a data consistency perspective, that row + * should be inserted on the subscriber. Otherwise, subsequent UPDATE or DELETE + * statements have no effect (it matches no row -- see + * apply_handle_update_internal()). So, the UPDATE should be transformed into a + * INSERT statement and be sent to the subscriber. However, this might surprise + * someone who expects the data set to satisfy the row filter expression on the + * provider. + */ +static bool +pgoutput_row_filter(Relation relation, TupleTableSlot *old_slot, + TupleTableSlot **new_slot_ptr, RelationSyncEntry *entry, + ReorderBufferChangeType *action) +{ + TupleDesc desc; + int i; + bool old_matched, + new_matched, + result; + TupleTableSlot *tmp_new_slot; + TupleTableSlot *new_slot = *new_slot_ptr; + ExprContext *ecxt; + ExprState *filter_exprstate; + + /* + * We need this map to avoid relying on ReorderBufferChangeType enums + * having specific values. + */ + static const int map_changetype_pubaction[] = { + [REORDER_BUFFER_CHANGE_INSERT] = PUBACTION_INSERT, + [REORDER_BUFFER_CHANGE_UPDATE] = PUBACTION_UPDATE, + [REORDER_BUFFER_CHANGE_DELETE] = PUBACTION_DELETE + }; + + Assert(*action == REORDER_BUFFER_CHANGE_INSERT || + *action == REORDER_BUFFER_CHANGE_UPDATE || + *action == REORDER_BUFFER_CHANGE_DELETE); + + Assert(new_slot || old_slot); + + /* Get the corresponding row filter */ + filter_exprstate = entry->exprstate[map_changetype_pubaction[*action]]; + + /* Bail out if there is no row filter */ + if (!filter_exprstate) + return true; + + elog(DEBUG3, "table \"%s.%s\" has row filter", + get_namespace_name(RelationGetNamespace(relation)), + RelationGetRelationName(relation)); + + ResetPerTupleExprContext(entry->estate); + + ecxt = GetPerTupleExprContext(entry->estate); + + /* + * For the following occasions where there is only one tuple, we can + * evaluate the row filter for that tuple and return. + * + * For inserts, we only have the new tuple. + * + * For updates, we can have only a new tuple when none of the replica + * identity columns changed but we still need to evaluate the row filter + * for new tuple as the existing values of those columns might not match + * the filter. Also, users can use constant expressions in the row filter, + * so we anyway need to evaluate it for the new tuple. + * + * For deletes, we only have the old tuple. + */ + if (!new_slot || !old_slot) + { + ecxt->ecxt_scantuple = new_slot ? new_slot : old_slot; + result = pgoutput_row_filter_exec_expr(filter_exprstate, ecxt); + + return result; + } + + /* + * Both the old and new tuples must be valid only for updates and need to + * be checked against the row filter. + */ + Assert(map_changetype_pubaction[*action] == PUBACTION_UPDATE); + + slot_getallattrs(new_slot); + slot_getallattrs(old_slot); + + tmp_new_slot = NULL; + desc = RelationGetDescr(relation); + + /* + * The new tuple might not have all the replica identity columns, in which + * case it needs to be copied over from the old tuple. + */ + for (i = 0; i < desc->natts; i++) + { + Form_pg_attribute att = TupleDescAttr(desc, i); + + /* + * if the column in the new tuple or old tuple is null, nothing to do + */ + if (new_slot->tts_isnull[i] || old_slot->tts_isnull[i]) + continue; + + /* + * Unchanged toasted replica identity columns are only logged in the + * old tuple. Copy this over to the new tuple. The changed (or WAL + * Logged) toast values are always assembled in memory and set as + * VARTAG_INDIRECT. See ReorderBufferToastReplace. + */ + if (att->attlen == -1 && + VARATT_IS_EXTERNAL_ONDISK(new_slot->tts_values[i]) && + !VARATT_IS_EXTERNAL_ONDISK(old_slot->tts_values[i])) + { + if (!tmp_new_slot) + { + tmp_new_slot = MakeSingleTupleTableSlot(desc, &TTSOpsVirtual); + ExecClearTuple(tmp_new_slot); + + memcpy(tmp_new_slot->tts_values, new_slot->tts_values, + desc->natts * sizeof(Datum)); + memcpy(tmp_new_slot->tts_isnull, new_slot->tts_isnull, + desc->natts * sizeof(bool)); + } + + tmp_new_slot->tts_values[i] = old_slot->tts_values[i]; + tmp_new_slot->tts_isnull[i] = old_slot->tts_isnull[i]; + } + } + + ecxt->ecxt_scantuple = old_slot; + old_matched = pgoutput_row_filter_exec_expr(filter_exprstate, ecxt); + + if (tmp_new_slot) + { + ExecStoreVirtualTuple(tmp_new_slot); + ecxt->ecxt_scantuple = tmp_new_slot; + } + else + ecxt->ecxt_scantuple = new_slot; + + new_matched = pgoutput_row_filter_exec_expr(filter_exprstate, ecxt); + + /* + * Case 1: if both tuples don't match the row filter, bailout. Send + * nothing. + */ + if (!old_matched && !new_matched) + return false; + + /* + * Case 2: if the old tuple doesn't satisfy the row filter but the new + * tuple does, transform the UPDATE into INSERT. + * + * Use the newly transformed tuple that must contain the column values for + * all the replica identity columns. This is required to ensure that the + * while inserting the tuple in the downstream node, we have all the + * required column values. + */ + if (!old_matched && new_matched) + { + *action = REORDER_BUFFER_CHANGE_INSERT; + + if (tmp_new_slot) + *new_slot_ptr = tmp_new_slot; + } + + /* + * Case 3: if the old tuple satisfies the row filter but the new tuple + * doesn't, transform the UPDATE into DELETE. + * + * This transformation does not require another tuple. The Old tuple will + * be used for DELETE. + */ + else if (old_matched && !new_matched) + *action = REORDER_BUFFER_CHANGE_DELETE; + + /* + * Case 4: if both tuples match the row filter, transformation isn't + * required. (*action is default UPDATE). + */ + + return true; +} + /* * Sends the decoded DML over wire. * @@ -638,6 +1145,10 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, RelationSyncEntry *relentry; TransactionId xid = InvalidTransactionId; Relation ancestor = NULL; + Relation targetrel = relation; + ReorderBufferChangeType action = change->action; + TupleTableSlot *old_slot = NULL; + TupleTableSlot *new_slot = NULL; if (!is_publishable_relation(relation)) return; @@ -651,10 +1162,10 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, if (in_streaming) xid = change->txn->xid; - relentry = get_rel_sync_entry(data, RelationGetRelid(relation)); + relentry = get_rel_sync_entry(data, relation); /* First check the table filter */ - switch (change->action) + switch (action) { case REORDER_BUFFER_CHANGE_INSERT: if (!relentry->pubactions.pubinsert) @@ -675,80 +1186,149 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, /* Avoid leaking memory by using and resetting our own context */ old = MemoryContextSwitchTo(data->context); - maybe_send_schema(ctx, change, relation, relentry); - /* Send the data */ - switch (change->action) + switch (action) { case REORDER_BUFFER_CHANGE_INSERT: - { - HeapTuple tuple = &change->data.tp.newtuple->tuple; + new_slot = relentry->new_slot; + ExecStoreHeapTuple(&change->data.tp.newtuple->tuple, + new_slot, false); - /* Switch relation if publishing via root. */ - if (relentry->publish_as_relid != RelationGetRelid(relation)) + /* Switch relation if publishing via root. */ + if (relentry->publish_as_relid != RelationGetRelid(relation)) + { + Assert(relation->rd_rel->relispartition); + ancestor = RelationIdGetRelation(relentry->publish_as_relid); + targetrel = ancestor; + /* Convert tuple if needed. */ + if (relentry->attrmap) { - Assert(relation->rd_rel->relispartition); - ancestor = RelationIdGetRelation(relentry->publish_as_relid); - relation = ancestor; - /* Convert tuple if needed. */ - if (relentry->map) - tuple = execute_attr_map_tuple(tuple, relentry->map); + TupleDesc tupdesc = RelationGetDescr(targetrel); + + new_slot = execute_attr_map_slot(relentry->attrmap, + new_slot, + MakeTupleTableSlot(tupdesc, &TTSOpsVirtual)); } + } - OutputPluginPrepareWrite(ctx, true); - logicalrep_write_insert(ctx->out, xid, relation, tuple, - data->binary); - OutputPluginWrite(ctx, true); + /* Check row filter */ + if (!pgoutput_row_filter(targetrel, NULL, &new_slot, relentry, + &action)) break; - } + + /* + * Schema should be sent using the original relation because it + * also sends the ancestor's relation. + */ + maybe_send_schema(ctx, change, relation, relentry); + + OutputPluginPrepareWrite(ctx, true); + logicalrep_write_insert(ctx->out, xid, targetrel, new_slot, + data->binary); + OutputPluginWrite(ctx, true); + break; case REORDER_BUFFER_CHANGE_UPDATE: + if (change->data.tp.oldtuple) { - HeapTuple oldtuple = change->data.tp.oldtuple ? - &change->data.tp.oldtuple->tuple : NULL; - HeapTuple newtuple = &change->data.tp.newtuple->tuple; + old_slot = relentry->old_slot; + ExecStoreHeapTuple(&change->data.tp.oldtuple->tuple, + old_slot, false); + } - /* Switch relation if publishing via root. */ - if (relentry->publish_as_relid != RelationGetRelid(relation)) + new_slot = relentry->new_slot; + ExecStoreHeapTuple(&change->data.tp.newtuple->tuple, + new_slot, false); + + /* Switch relation if publishing via root. */ + if (relentry->publish_as_relid != RelationGetRelid(relation)) + { + Assert(relation->rd_rel->relispartition); + ancestor = RelationIdGetRelation(relentry->publish_as_relid); + targetrel = ancestor; + /* Convert tuples if needed. */ + if (relentry->attrmap) { - Assert(relation->rd_rel->relispartition); - ancestor = RelationIdGetRelation(relentry->publish_as_relid); - relation = ancestor; - /* Convert tuples if needed. */ - if (relentry->map) - { - if (oldtuple) - oldtuple = execute_attr_map_tuple(oldtuple, - relentry->map); - newtuple = execute_attr_map_tuple(newtuple, - relentry->map); - } + TupleDesc tupdesc = RelationGetDescr(targetrel); + + if (old_slot) + old_slot = execute_attr_map_slot(relentry->attrmap, + old_slot, + MakeTupleTableSlot(tupdesc, &TTSOpsVirtual)); + + new_slot = execute_attr_map_slot(relentry->attrmap, + new_slot, + MakeTupleTableSlot(tupdesc, &TTSOpsVirtual)); } + } - OutputPluginPrepareWrite(ctx, true); - logicalrep_write_update(ctx->out, xid, relation, oldtuple, - newtuple, data->binary); - OutputPluginWrite(ctx, true); + /* Check row filter */ + if (!pgoutput_row_filter(targetrel, old_slot, &new_slot, + relentry, &action)) break; + + maybe_send_schema(ctx, change, relation, relentry); + + OutputPluginPrepareWrite(ctx, true); + + /* + * Updates could be transformed to inserts or deletes based on the + * results of the row filter for old and new tuple. + */ + switch (action) + { + case REORDER_BUFFER_CHANGE_INSERT: + logicalrep_write_insert(ctx->out, xid, targetrel, + new_slot, data->binary); + break; + case REORDER_BUFFER_CHANGE_UPDATE: + logicalrep_write_update(ctx->out, xid, targetrel, + old_slot, new_slot, data->binary); + break; + case REORDER_BUFFER_CHANGE_DELETE: + logicalrep_write_delete(ctx->out, xid, targetrel, + old_slot, data->binary); + break; + default: + Assert(false); } + + OutputPluginWrite(ctx, true); + break; case REORDER_BUFFER_CHANGE_DELETE: if (change->data.tp.oldtuple) { - HeapTuple oldtuple = &change->data.tp.oldtuple->tuple; + old_slot = relentry->old_slot; + + ExecStoreHeapTuple(&change->data.tp.oldtuple->tuple, + old_slot, false); /* Switch relation if publishing via root. */ if (relentry->publish_as_relid != RelationGetRelid(relation)) { Assert(relation->rd_rel->relispartition); ancestor = RelationIdGetRelation(relentry->publish_as_relid); - relation = ancestor; + targetrel = ancestor; /* Convert tuple if needed. */ - if (relentry->map) - oldtuple = execute_attr_map_tuple(oldtuple, relentry->map); + if (relentry->attrmap) + { + TupleDesc tupdesc = RelationGetDescr(targetrel); + + old_slot = execute_attr_map_slot(relentry->attrmap, + old_slot, + MakeTupleTableSlot(tupdesc, &TTSOpsVirtual)); + } } + /* Check row filter */ + if (!pgoutput_row_filter(targetrel, old_slot, &new_slot, + relentry, &action)) + break; + + maybe_send_schema(ctx, change, relation, relentry); + OutputPluginPrepareWrite(ctx, true); - logicalrep_write_delete(ctx->out, xid, relation, oldtuple, - data->binary); + logicalrep_write_delete(ctx->out, xid, targetrel, + old_slot, data->binary); OutputPluginWrite(ctx, true); } else @@ -798,7 +1378,7 @@ pgoutput_truncate(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, if (!is_publishable_relation(relation)) continue; - relentry = get_rel_sync_entry(data, relid); + relentry = get_rel_sync_entry(data, relation); if (!relentry->pubactions.pubtruncate) continue; @@ -873,8 +1453,9 @@ pgoutput_origin_filter(LogicalDecodingContext *ctx, /* * Shutdown the output plugin. * - * Note, we don't need to clean the data->context as it's child context - * of the ctx->context so it will be cleaned up by logical decoding machinery. + * Note, we don't need to clean the data->context and data->cachectx as + * they are child context of the ctx->context so it will be cleaned up by + * logical decoding machinery. */ static void pgoutput_shutdown(LogicalDecodingContext *ctx) @@ -1122,11 +1703,12 @@ set_schema_sent_in_streamed_txn(RelationSyncEntry *entry, TransactionId xid) * when publishing. */ static RelationSyncEntry * -get_rel_sync_entry(PGOutputData *data, Oid relid) +get_rel_sync_entry(PGOutputData *data, Relation relation) { RelationSyncEntry *entry; bool found; MemoryContext oldctx; + Oid relid = RelationGetRelid(relation); Assert(RelationSyncCache != NULL); @@ -1144,9 +1726,12 @@ get_rel_sync_entry(PGOutputData *data, Oid relid) entry->streamed_txns = NIL; entry->pubactions.pubinsert = entry->pubactions.pubupdate = entry->pubactions.pubdelete = entry->pubactions.pubtruncate = false; + entry->new_slot = NULL; + entry->old_slot = NULL; + memset(entry->exprstate, 0, sizeof(entry->exprstate)); + entry->cache_expr_cxt = NULL; entry->publish_as_relid = InvalidOid; - entry->map = NULL; /* will be set by maybe_send_schema() if - * needed */ + entry->attrmap = NULL; } /* Validate the entry */ @@ -1165,6 +1750,7 @@ get_rel_sync_entry(PGOutputData *data, Oid relid) Oid publish_as_relid = relid; bool am_partition = get_rel_relispartition(relid); char relkind = get_rel_relkind(relid); + List *rel_publications = NIL; /* Reload publications if needed before use. */ if (!publications_valid) @@ -1193,17 +1779,31 @@ get_rel_sync_entry(PGOutputData *data, Oid relid) entry->pubactions.pubupdate = false; entry->pubactions.pubdelete = false; entry->pubactions.pubtruncate = false; - if (entry->map) - { - /* - * Must free the TupleDescs contained in the map explicitly, - * because free_conversion_map() doesn't. - */ - FreeTupleDesc(entry->map->indesc); - FreeTupleDesc(entry->map->outdesc); - free_conversion_map(entry->map); - } - entry->map = NULL; + + /* + * Tuple slots cleanups. (Will be rebuilt later if needed). + */ + if (entry->old_slot) + ExecDropSingleTupleTableSlot(entry->old_slot); + if (entry->new_slot) + ExecDropSingleTupleTableSlot(entry->new_slot); + + entry->old_slot = NULL; + entry->new_slot = NULL; + + if (entry->attrmap) + free_attrmap(entry->attrmap); + entry->attrmap = NULL; + + /* + * Row filter cache cleanups. + */ + if (entry->cache_expr_cxt) + MemoryContextDelete(entry->cache_expr_cxt); + + entry->cache_expr_cxt = NULL; + entry->estate = NULL; + memset(entry->exprstate, 0, sizeof(entry->exprstate)); /* * Build publication cache. We can't use one provided by relcache as @@ -1234,28 +1834,17 @@ get_rel_sync_entry(PGOutputData *data, Oid relid) */ if (am_partition) { + Oid ancestor; List *ancestors = get_partition_ancestors(relid); - ListCell *lc2; - /* - * Find the "topmost" ancestor that is in this - * publication. - */ - foreach(lc2, ancestors) + ancestor = GetTopMostAncestorInPublication(pub->oid, + ancestors); + + if (ancestor != InvalidOid) { - Oid ancestor = lfirst_oid(lc2); - List *apubids = GetRelationPublications(ancestor); - List *aschemaPubids = GetSchemaPublications(get_rel_namespace(ancestor)); - - if (list_member_oid(apubids, pub->oid) || - list_member_oid(aschemaPubids, pub->oid)) - { - ancestor_published = true; - if (pub->pubviaroot) - publish_as_relid = ancestor; - } - list_free(apubids); - list_free(aschemaPubids); + ancestor_published = true; + if (pub->pubviaroot) + publish_as_relid = ancestor; } } @@ -1277,17 +1866,31 @@ get_rel_sync_entry(PGOutputData *data, Oid relid) entry->pubactions.pubupdate |= pub->pubactions.pubupdate; entry->pubactions.pubdelete |= pub->pubactions.pubdelete; entry->pubactions.pubtruncate |= pub->pubactions.pubtruncate; + + rel_publications = lappend(rel_publications, pub); } + } - if (entry->pubactions.pubinsert && entry->pubactions.pubupdate && - entry->pubactions.pubdelete && entry->pubactions.pubtruncate) - break; + entry->publish_as_relid = publish_as_relid; + + /* + * Initialize the tuple slot, map, and row filter. These are only used + * when publishing inserts, updates, or deletes. + */ + if (entry->pubactions.pubinsert || entry->pubactions.pubupdate || + entry->pubactions.pubdelete) + { + /* Initialize the tuple slot and map */ + init_tuple_slot(data, relation, entry); + + /* Initialize the row filter */ + pgoutput_row_filter_init(data, rel_publications, entry); } list_free(pubids); list_free(schemaPubids); + list_free(rel_publications); - entry->publish_as_relid = publish_as_relid; entry->replicate_valid = true; } diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 2707fed12f..fccffce572 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -66,6 +66,7 @@ #include "catalog/schemapg.h" #include "catalog/storage.h" #include "commands/policy.h" +#include "commands/publicationcmds.h" #include "commands/trigger.h" #include "miscadmin.h" #include "nodes/makefuncs.h" @@ -2419,8 +2420,8 @@ RelationDestroyRelation(Relation relation, bool remember_tupdesc) bms_free(relation->rd_pkattr); bms_free(relation->rd_idattr); bms_free(relation->rd_hotblockingattr); - if (relation->rd_pubactions) - pfree(relation->rd_pubactions); + if (relation->rd_pubdesc) + pfree(relation->rd_pubdesc); if (relation->rd_options) pfree(relation->rd_options); if (relation->rd_indextuple) @@ -5523,38 +5524,57 @@ RelationGetExclusionInfo(Relation indexRelation, } /* - * Get publication actions for the given relation. + * Get the publication information for the given relation. + * + * Traverse all the publications which the relation is in to get the + * publication actions and validate the row filter expressions for such + * publications if any. We consider the row filter expression as invalid if it + * references any column which is not part of REPLICA IDENTITY. + * + * To avoid fetching the publication information repeatedly, we cache the + * publication actions and row filter validation information. */ -struct PublicationActions * -GetRelationPublicationActions(Relation relation) +void +RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) { List *puboids; ListCell *lc; MemoryContext oldcxt; Oid schemaid; - PublicationActions *pubactions = palloc0(sizeof(PublicationActions)); + List *ancestors = NIL; + Oid relid = RelationGetRelid(relation); /* * If not publishable, it publishes no actions. (pgoutput_change() will * ignore it.) */ if (!is_publishable_relation(relation)) - return pubactions; + { + memset(pubdesc, 0, sizeof(PublicationDesc)); + pubdesc->rf_valid_for_update = true; + pubdesc->rf_valid_for_delete = true; + return; + } + + if (relation->rd_pubdesc) + { + memcpy(pubdesc, relation->rd_pubdesc, sizeof(PublicationDesc)); + return; + } - if (relation->rd_pubactions) - return memcpy(pubactions, relation->rd_pubactions, - sizeof(PublicationActions)); + memset(pubdesc, 0, sizeof(PublicationDesc)); + pubdesc->rf_valid_for_update = true; + pubdesc->rf_valid_for_delete = true; /* Fetch the publication membership info. */ - puboids = GetRelationPublications(RelationGetRelid(relation)); + puboids = GetRelationPublications(relid); schemaid = RelationGetNamespace(relation); puboids = list_concat_unique_oid(puboids, GetSchemaPublications(schemaid)); if (relation->rd_rel->relispartition) { /* Add publications that the ancestors are in too. */ - List *ancestors = get_partition_ancestors(RelationGetRelid(relation)); - ListCell *lc; + ancestors = get_partition_ancestors(relid); foreach(lc, ancestors) { @@ -5582,35 +5602,53 @@ GetRelationPublicationActions(Relation relation) pubform = (Form_pg_publication) GETSTRUCT(tup); - pubactions->pubinsert |= pubform->pubinsert; - pubactions->pubupdate |= pubform->pubupdate; - pubactions->pubdelete |= pubform->pubdelete; - pubactions->pubtruncate |= pubform->pubtruncate; + pubdesc->pubactions.pubinsert |= pubform->pubinsert; + pubdesc->pubactions.pubupdate |= pubform->pubupdate; + pubdesc->pubactions.pubdelete |= pubform->pubdelete; + pubdesc->pubactions.pubtruncate |= pubform->pubtruncate; + + /* + * Check if all columns referenced in the filter expression are part of + * the REPLICA IDENTITY index or not. + * + * If the publication is FOR ALL TABLES then it means the table has no + * row filters and we can skip the validation. + */ + if (!pubform->puballtables && + (pubform->pubupdate || pubform->pubdelete) && + contain_invalid_rfcolumn(pubid, relation, ancestors, + pubform->pubviaroot)) + { + if (pubform->pubupdate) + pubdesc->rf_valid_for_update = false; + if (pubform->pubdelete) + pubdesc->rf_valid_for_delete = false; + } ReleaseSysCache(tup); /* - * If we know everything is replicated, there is no point to check for - * other publications. + * If we know everything is replicated and the row filter is invalid + * for update and delete, there is no point to check for other + * publications. */ - if (pubactions->pubinsert && pubactions->pubupdate && - pubactions->pubdelete && pubactions->pubtruncate) + if (pubdesc->pubactions.pubinsert && pubdesc->pubactions.pubupdate && + pubdesc->pubactions.pubdelete && pubdesc->pubactions.pubtruncate && + !pubdesc->rf_valid_for_update && !pubdesc->rf_valid_for_delete) break; } - if (relation->rd_pubactions) + if (relation->rd_pubdesc) { - pfree(relation->rd_pubactions); - relation->rd_pubactions = NULL; + pfree(relation->rd_pubdesc); + relation->rd_pubdesc = NULL; } - /* Now save copy of the actions in the relcache entry. */ + /* Now save copy of the descriptor in the relcache entry. */ oldcxt = MemoryContextSwitchTo(CacheMemoryContext); - relation->rd_pubactions = palloc(sizeof(PublicationActions)); - memcpy(relation->rd_pubactions, pubactions, sizeof(PublicationActions)); + relation->rd_pubdesc = palloc(sizeof(PublicationDesc)); + memcpy(relation->rd_pubdesc, pubdesc, sizeof(PublicationDesc)); MemoryContextSwitchTo(oldcxt); - - return pubactions; } /* @@ -6163,7 +6201,7 @@ load_relcache_init_file(bool shared) rel->rd_pkattr = NULL; rel->rd_idattr = NULL; rel->rd_hotblockingattr = NULL; - rel->rd_pubactions = NULL; + rel->rd_pubdesc = NULL; rel->rd_statvalid = false; rel->rd_statlist = NIL; rel->rd_fkeyvalid = false; diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 4485ea83b1..e69dcf8a48 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -4074,6 +4074,7 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables) int i_oid; int i_prpubid; int i_prrelid; + int i_prrelqual; int i, j, ntups; @@ -4084,9 +4085,16 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables) query = createPQExpBuffer(); /* Collect all publication membership info. */ - appendPQExpBufferStr(query, - "SELECT tableoid, oid, prpubid, prrelid " - "FROM pg_catalog.pg_publication_rel"); + if (fout->remoteVersion >= 150000) + appendPQExpBufferStr(query, + "SELECT tableoid, oid, prpubid, prrelid, " + "pg_catalog.pg_get_expr(prqual, prrelid) AS prrelqual " + "FROM pg_catalog.pg_publication_rel"); + else + appendPQExpBufferStr(query, + "SELECT tableoid, oid, prpubid, prrelid, " + "NULL AS prrelqual " + "FROM pg_catalog.pg_publication_rel"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); ntups = PQntuples(res); @@ -4095,6 +4103,7 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables) i_oid = PQfnumber(res, "oid"); i_prpubid = PQfnumber(res, "prpubid"); i_prrelid = PQfnumber(res, "prrelid"); + i_prrelqual = PQfnumber(res, "prrelqual"); /* this allocation may be more than we need */ pubrinfo = pg_malloc(ntups * sizeof(PublicationRelInfo)); @@ -4135,6 +4144,10 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables) pubrinfo[j].dobj.name = tbinfo->dobj.name; pubrinfo[j].publication = pubinfo; pubrinfo[j].pubtable = tbinfo; + if (PQgetisnull(res, i, i_prrelqual)) + pubrinfo[j].pubrelqual = NULL; + else + pubrinfo[j].pubrelqual = pg_strdup(PQgetvalue(res, i, i_prrelqual)); /* Decide whether we want to dump it */ selectDumpablePublicationObject(&(pubrinfo[j].dobj), fout); @@ -4212,8 +4225,17 @@ dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo) appendPQExpBuffer(query, "ALTER PUBLICATION %s ADD TABLE ONLY", fmtId(pubinfo->dobj.name)); - appendPQExpBuffer(query, " %s;\n", + appendPQExpBuffer(query, " %s", fmtQualifiedDumpable(tbinfo)); + if (pubrinfo->pubrelqual) + { + /* + * It's necessary to add parentheses around the expression because + * pg_get_expr won't supply the parentheses for things like WHERE TRUE. + */ + appendPQExpBuffer(query, " WHERE (%s)", pubrinfo->pubrelqual); + } + appendPQExpBufferStr(query, ";\n"); /* * There is no point in creating a drop query as the drop is done by table diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 9965ac2518..997a3b6071 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -631,6 +631,7 @@ typedef struct _PublicationRelInfo DumpableObject dobj; PublicationInfo *publication; TableInfo *pubtable; + char *pubrelqual; } PublicationRelInfo; /* diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 654ef2d7c3..e3382933d9 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -2879,17 +2879,21 @@ describeOneTableDetails(const char *schemaname, { printfPQExpBuffer(&buf, "SELECT pubname\n" + " , NULL\n" "FROM pg_catalog.pg_publication p\n" " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" " JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid\n" "WHERE pc.oid ='%s' and pg_catalog.pg_relation_is_publishable('%s')\n" "UNION\n" "SELECT pubname\n" + " , pg_get_expr(pr.prqual, c.oid)\n" "FROM pg_catalog.pg_publication p\n" " JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n" + " JOIN pg_catalog.pg_class c ON c.oid = pr.prrelid\n" "WHERE pr.prrelid = '%s'\n" "UNION\n" "SELECT pubname\n" + " , NULL\n" "FROM pg_catalog.pg_publication p\n" "WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n" "ORDER BY 1;", @@ -2899,11 +2903,13 @@ describeOneTableDetails(const char *schemaname, { printfPQExpBuffer(&buf, "SELECT pubname\n" + " , NULL\n" "FROM pg_catalog.pg_publication p\n" "JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n" "WHERE pr.prrelid = '%s'\n" "UNION ALL\n" "SELECT pubname\n" + " , NULL\n" "FROM pg_catalog.pg_publication p\n" "WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n" "ORDER BY 1;", @@ -2925,6 +2931,11 @@ describeOneTableDetails(const char *schemaname, printfPQExpBuffer(&buf, " \"%s\"", PQgetvalue(result, i, 0)); + /* row filter (if any) */ + if (!PQgetisnull(result, i, 1)) + appendPQExpBuffer(&buf, " WHERE %s", + PQgetvalue(result, i, 1)); + printTableAddFooter(&cont, buf.data); } PQclear(result); @@ -5874,8 +5885,12 @@ addFooterToPublicationDesc(PQExpBuffer buf, char *footermsg, for (i = 0; i < count; i++) { if (!singlecol) + { printfPQExpBuffer(buf, " \"%s.%s\"", PQgetvalue(res, i, 0), PQgetvalue(res, i, 1)); + if (!PQgetisnull(res, i, 2)) + appendPQExpBuffer(buf, " WHERE %s", PQgetvalue(res, i, 2)); + } else printfPQExpBuffer(buf, " \"%s\"", PQgetvalue(res, i, 0)); @@ -6004,8 +6019,15 @@ describePublications(const char *pattern) { /* Get the tables for the specified publication */ printfPQExpBuffer(&buf, - "SELECT n.nspname, c.relname\n" - "FROM pg_catalog.pg_class c,\n" + "SELECT n.nspname, c.relname"); + if (pset.sversion >= 150000) + appendPQExpBufferStr(&buf, + ", pg_get_expr(pr.prqual, c.oid)"); + else + appendPQExpBufferStr(&buf, + ", NULL"); + appendPQExpBuffer(&buf, + "\nFROM pg_catalog.pg_class c,\n" " pg_catalog.pg_namespace n,\n" " pg_catalog.pg_publication_rel pr\n" "WHERE c.relnamespace = n.oid\n" diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 010edb685f..6957567264 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1787,6 +1787,20 @@ psql_completion(const char *text, int start, int end) (HeadMatches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE") && ends_with(prev_wd, ','))) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); + /* + * "ALTER PUBLICATION SET TABLE WHERE (" - complete with + * table attributes + * + * "ALTER PUBLICATION ADD TABLE WHERE (" - complete with + * table attributes + */ + else if (HeadMatches("ALTER", "PUBLICATION", MatchAny) && TailMatches("WHERE")) + COMPLETE_WITH("("); + else if (HeadMatches("ALTER", "PUBLICATION", MatchAny) && TailMatches("WHERE", "(")) + COMPLETE_WITH_ATTR(prev3_wd); + else if (HeadMatches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE") && + !TailMatches("WHERE", "(*)")) + COMPLETE_WITH(",", "WHERE ("); else if (HeadMatches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE")) COMPLETE_WITH(","); /* ALTER PUBLICATION DROP */ @@ -2919,12 +2933,23 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("TABLES", "TABLES IN SCHEMA"); else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES")) COMPLETE_WITH("IN SCHEMA", "WITH ("); - else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE", MatchAny)) - COMPLETE_WITH("WITH ("); + else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE", MatchAny) && !ends_with(prev_wd, ',')) + COMPLETE_WITH("WHERE (", "WITH ("); /* Complete "CREATE PUBLICATION FOR TABLE" with ", ..." */ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); + /* + * "CREATE PUBLICATION FOR TABLE WHERE (" - complete with + * table attributes + */ + else if (HeadMatches("CREATE", "PUBLICATION", MatchAny) && TailMatches("WHERE")) + COMPLETE_WITH("("); + else if (HeadMatches("CREATE", "PUBLICATION", MatchAny) && TailMatches("WHERE", "(")) + COMPLETE_WITH_ATTR(prev3_wd); + else if (HeadMatches("CREATE", "PUBLICATION", MatchAny) && TailMatches("WHERE", "(*)")) + COMPLETE_WITH(" WITH ("); + /* * Complete "CREATE PUBLICATION FOR ALL TABLES IN SCHEMA , * ..." diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index b940a0cf0c..1addb568ef 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202202141 +#define CATALOG_VERSION_NO 202202221 #endif diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h index 841b9b6c25..ba72e62e61 100644 --- a/src/include/catalog/pg_publication.h +++ b/src/include/catalog/pg_publication.h @@ -74,6 +74,19 @@ typedef struct PublicationActions bool pubtruncate; } PublicationActions; +typedef struct PublicationDesc +{ + PublicationActions pubactions; + + /* + * true if the columns referenced in row filters which are used for UPDATE + * or DELETE are part of the replica identity or the publication actions + * do not include UPDATE or DELETE. + */ + bool rf_valid_for_update; + bool rf_valid_for_delete; +} PublicationDesc; + typedef struct Publication { Oid oid; @@ -86,6 +99,7 @@ typedef struct Publication typedef struct PublicationRelInfo { Relation relation; + Node *whereClause; } PublicationRelInfo; extern Publication *GetPublication(Oid pubid); @@ -120,10 +134,11 @@ extern List *GetAllSchemaPublicationRelations(Oid puboid, extern List *GetPubPartitionOptionRelations(List *result, PublicationPartOpt pub_partopt, Oid relid); +extern Oid GetTopMostAncestorInPublication(Oid puboid, List *ancestors); extern bool is_publishable_relation(Relation rel); extern bool is_schema_publication(Oid pubid); -extern ObjectAddress publication_add_relation(Oid pubid, PublicationRelInfo *targetrel, +extern ObjectAddress publication_add_relation(Oid pubid, PublicationRelInfo *pri, bool if_not_exists); extern ObjectAddress publication_add_schema(Oid pubid, Oid schemaid, bool if_not_exists); @@ -131,5 +146,4 @@ extern ObjectAddress publication_add_schema(Oid pubid, Oid schemaid, extern Oid get_publication_oid(const char *pubname, bool missing_ok); extern char *get_publication_name(Oid pubid, bool missing_ok); - #endif /* PG_PUBLICATION_H */ diff --git a/src/include/catalog/pg_publication_rel.h b/src/include/catalog/pg_publication_rel.h index 117a1d67e5..0dd0f425db 100644 --- a/src/include/catalog/pg_publication_rel.h +++ b/src/include/catalog/pg_publication_rel.h @@ -31,6 +31,10 @@ CATALOG(pg_publication_rel,6106,PublicationRelRelationId) Oid oid; /* oid */ Oid prpubid BKI_LOOKUP(pg_publication); /* Oid of the publication */ Oid prrelid BKI_LOOKUP(pg_class); /* Oid of the relation */ + +#ifdef CATALOG_VARLEN /* variable-length fields start here */ + pg_node_tree prqual; /* qualifications */ +#endif } FormData_pg_publication_rel; /* ---------------- @@ -40,6 +44,8 @@ CATALOG(pg_publication_rel,6106,PublicationRelRelationId) */ typedef FormData_pg_publication_rel *Form_pg_publication_rel; +DECLARE_TOAST(pg_publication_rel, 8287, 8288); + DECLARE_UNIQUE_INDEX_PKEY(pg_publication_rel_oid_index, 6112, PublicationRelObjectIndexId, on pg_publication_rel using btree(oid oid_ops)); DECLARE_UNIQUE_INDEX(pg_publication_rel_prrelid_prpubid_index, 6113, PublicationRelPrrelidPrpubidIndexId, on pg_publication_rel using btree(prrelid oid_ops, prpubid oid_ops)); DECLARE_INDEX(pg_publication_rel_prpubid_index, 6116, PublicationRelPrpubidIndexId, on pg_publication_rel using btree(prpubid oid_ops)); diff --git a/src/include/commands/publicationcmds.h b/src/include/commands/publicationcmds.h index cec7525826..7813cbcb6b 100644 --- a/src/include/commands/publicationcmds.h +++ b/src/include/commands/publicationcmds.h @@ -31,5 +31,7 @@ extern void RemovePublicationSchemaById(Oid psoid); extern ObjectAddress AlterPublicationOwner(const char *name, Oid newOwnerId); extern void AlterPublicationOwner_oid(Oid pubid, Oid newOwnerId); extern void InvalidatePublicationRels(List *relids); +extern bool contain_invalid_rfcolumn(Oid pubid, Relation relation, + List *ancestors, bool pubviaroot); #endif /* PUBLICATIONCMDS_H */ diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 34218b718c..1617702d9d 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3651,6 +3651,7 @@ typedef struct PublicationTable { NodeTag type; RangeVar *relation; /* relation to be published */ + Node *whereClause; /* qualifications */ } PublicationTable; /* diff --git a/src/include/replication/logicalproto.h b/src/include/replication/logicalproto.h index 22fffaca62..4d2c881644 100644 --- a/src/include/replication/logicalproto.h +++ b/src/include/replication/logicalproto.h @@ -14,6 +14,7 @@ #define LOGICAL_PROTO_H #include "access/xact.h" +#include "executor/tuptable.h" #include "replication/reorderbuffer.h" #include "utils/rel.h" @@ -206,17 +207,19 @@ extern void logicalrep_write_origin(StringInfo out, const char *origin, XLogRecPtr origin_lsn); extern char *logicalrep_read_origin(StringInfo in, XLogRecPtr *origin_lsn); extern void logicalrep_write_insert(StringInfo out, TransactionId xid, - Relation rel, HeapTuple newtuple, + Relation rel, + TupleTableSlot *newslot, bool binary); extern LogicalRepRelId logicalrep_read_insert(StringInfo in, LogicalRepTupleData *newtup); extern void logicalrep_write_update(StringInfo out, TransactionId xid, - Relation rel, HeapTuple oldtuple, - HeapTuple newtuple, bool binary); + Relation rel, + TupleTableSlot *oldslot, + TupleTableSlot *newslot, bool binary); extern LogicalRepRelId logicalrep_read_update(StringInfo in, bool *has_oldtuple, LogicalRepTupleData *oldtup, LogicalRepTupleData *newtup); extern void logicalrep_write_delete(StringInfo out, TransactionId xid, - Relation rel, HeapTuple oldtuple, + Relation rel, TupleTableSlot *oldtuple, bool binary); extern LogicalRepRelId logicalrep_read_delete(StringInfo in, LogicalRepTupleData *oldtup); diff --git a/src/include/replication/pgoutput.h b/src/include/replication/pgoutput.h index 78aa9151ef..eafedd610a 100644 --- a/src/include/replication/pgoutput.h +++ b/src/include/replication/pgoutput.h @@ -19,6 +19,7 @@ typedef struct PGOutputData { MemoryContext context; /* private memory context for transient * allocations */ + MemoryContext cachectx; /* private memory context for cache data */ /* client-supplied info: */ uint32 protocol_version; diff --git a/src/include/replication/reorderbuffer.h b/src/include/replication/reorderbuffer.h index 859424bbd9..0bcc150b33 100644 --- a/src/include/replication/reorderbuffer.h +++ b/src/include/replication/reorderbuffer.h @@ -51,7 +51,7 @@ typedef struct ReorderBufferTupleBuf * respectively. They're used by INSERT .. ON CONFLICT .. UPDATE. Users of * logical decoding don't have to care about these. */ -enum ReorderBufferChangeType +typedef enum ReorderBufferChangeType { REORDER_BUFFER_CHANGE_INSERT, REORDER_BUFFER_CHANGE_UPDATE, @@ -66,7 +66,7 @@ enum ReorderBufferChangeType REORDER_BUFFER_CHANGE_INTERNAL_SPEC_ABORT, REORDER_BUFFER_CHANGE_TRUNCATE, REORDER_BUFFER_CHANGE_SEQUENCE -}; +} ReorderBufferChangeType; /* forward declaration */ struct ReorderBufferTXN; @@ -83,7 +83,7 @@ typedef struct ReorderBufferChange XLogRecPtr lsn; /* The type of change. */ - enum ReorderBufferChangeType action; + ReorderBufferChangeType action; /* Transaction this change belongs to. */ struct ReorderBufferTXN *txn; diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 6da1b220cd..3b4ab65ae2 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -161,7 +161,7 @@ typedef struct RelationData Bitmapset *rd_idattr; /* included in replica identity index */ Bitmapset *rd_hotblockingattr; /* cols blocking HOT update */ - PublicationActions *rd_pubactions; /* publication actions */ + PublicationDesc *rd_pubdesc; /* publication descriptor, or NULL */ /* * rd_options is set whenever rd_rel is loaded into the relcache entry. diff --git a/src/include/utils/relcache.h b/src/include/utils/relcache.h index 84d6afef19..2281a7dc53 100644 --- a/src/include/utils/relcache.h +++ b/src/include/utils/relcache.h @@ -74,8 +74,9 @@ extern void RelationGetExclusionInfo(Relation indexRelation, extern void RelationInitIndexAccessInfo(Relation relation); /* caller must include pg_publication.h */ -struct PublicationActions; -extern struct PublicationActions *GetRelationPublicationActions(Relation relation); +struct PublicationDesc; +extern void RelationBuildPublicationDesc(Relation relation, + struct PublicationDesc *pubdesc); extern void RelationInitTableAccessMethod(Relation relation); diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index b97f98cda7..3c382e520e 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -239,6 +239,358 @@ ALTER PUBLICATION testpub_forparted DROP TABLE testpub_parted; UPDATE testpub_parted2 SET a = 2; DROP TABLE testpub_parted1, testpub_parted2; DROP PUBLICATION testpub_forparted, testpub_forparted1; +-- Tests for row filters +CREATE TABLE testpub_rf_tbl1 (a integer, b text); +CREATE TABLE testpub_rf_tbl2 (c text, d integer); +CREATE TABLE testpub_rf_tbl3 (e integer); +CREATE TABLE testpub_rf_tbl4 (g text); +CREATE TABLE testpub_rf_tbl5 (a xml); +CREATE SCHEMA testpub_rf_schema1; +CREATE TABLE testpub_rf_schema1.testpub_rf_tbl5 (h integer); +CREATE SCHEMA testpub_rf_schema2; +CREATE TABLE testpub_rf_schema2.testpub_rf_tbl6 (i integer); +SET client_min_messages = 'ERROR'; +-- Firstly, test using the option publish='insert' because the row filter +-- validation of referenced columns is less strict than for delete/update. +CREATE PUBLICATION testpub5 FOR TABLE testpub_rf_tbl1, testpub_rf_tbl2 WHERE (c <> 'test' AND d < 5) WITH (publish = 'insert'); +RESET client_min_messages; +\dRp+ testpub5 + Publication testpub5 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | f | f | f | f +Tables: + "public.testpub_rf_tbl1" + "public.testpub_rf_tbl2" WHERE ((c <> 'test'::text) AND (d < 5)) + +ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl3 WHERE (e > 1000 AND e < 2000); +\dRp+ testpub5 + Publication testpub5 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | f | f | f | f +Tables: + "public.testpub_rf_tbl1" + "public.testpub_rf_tbl2" WHERE ((c <> 'test'::text) AND (d < 5)) + "public.testpub_rf_tbl3" WHERE ((e > 1000) AND (e < 2000)) + +ALTER PUBLICATION testpub5 DROP TABLE testpub_rf_tbl2; +\dRp+ testpub5 + Publication testpub5 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | f | f | f | f +Tables: + "public.testpub_rf_tbl1" + "public.testpub_rf_tbl3" WHERE ((e > 1000) AND (e < 2000)) + +-- remove testpub_rf_tbl1 and add testpub_rf_tbl3 again (another WHERE expression) +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl3 WHERE (e > 300 AND e < 500); +\dRp+ testpub5 + Publication testpub5 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | f | f | f | f +Tables: + "public.testpub_rf_tbl3" WHERE ((e > 300) AND (e < 500)) + +-- test \d (now it displays filter information) +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_rf_yes FOR TABLE testpub_rf_tbl1 WHERE (a > 1) WITH (publish = 'insert'); +CREATE PUBLICATION testpub_rf_no FOR TABLE testpub_rf_tbl1; +RESET client_min_messages; +\d testpub_rf_tbl1 + Table "public.testpub_rf_tbl1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | text | | | +Publications: + "testpub_rf_no" + "testpub_rf_yes" WHERE (a > 1) + +DROP PUBLICATION testpub_rf_yes, testpub_rf_no; +-- some more syntax tests to exercise other parser pathways +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_syntax1 FOR TABLE testpub_rf_tbl1, ONLY testpub_rf_tbl3 WHERE (e < 999) WITH (publish = 'insert'); +RESET client_min_messages; +\dRp+ testpub_syntax1 + Publication testpub_syntax1 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | f | f | f | f +Tables: + "public.testpub_rf_tbl1" + "public.testpub_rf_tbl3" WHERE (e < 999) + +DROP PUBLICATION testpub_syntax1; +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_syntax2 FOR TABLE testpub_rf_tbl1, testpub_rf_schema1.testpub_rf_tbl5 WHERE (h < 999) WITH (publish = 'insert'); +RESET client_min_messages; +\dRp+ testpub_syntax2 + Publication testpub_syntax2 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | f | f | f | f +Tables: + "public.testpub_rf_tbl1" + "testpub_rf_schema1.testpub_rf_tbl5" WHERE (h < 999) + +DROP PUBLICATION testpub_syntax2; +-- fail - schemas don't allow WHERE clause +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_syntax3 FOR ALL TABLES IN SCHEMA testpub_rf_schema1 WHERE (a = 123); +ERROR: syntax error at or near "WHERE" +LINE 1: ...ntax3 FOR ALL TABLES IN SCHEMA testpub_rf_schema1 WHERE (a =... + ^ +CREATE PUBLICATION testpub_syntax3 FOR ALL TABLES IN SCHEMA testpub_rf_schema1, testpub_rf_schema1 WHERE (a = 123); +ERROR: WHERE clause not allowed for schema +LINE 1: ...tax3 FOR ALL TABLES IN SCHEMA testpub_rf_schema1, testpub_rf... + ^ +RESET client_min_messages; +-- fail - duplicate tables are not allowed if that table has any WHERE clause +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_dups FOR TABLE testpub_rf_tbl1 WHERE (a = 1), testpub_rf_tbl1 WITH (publish = 'insert'); +ERROR: conflicting or redundant WHERE clauses for table "testpub_rf_tbl1" +CREATE PUBLICATION testpub_dups FOR TABLE testpub_rf_tbl1, testpub_rf_tbl1 WHERE (a = 2) WITH (publish = 'insert'); +ERROR: conflicting or redundant WHERE clauses for table "testpub_rf_tbl1" +RESET client_min_messages; +-- fail - publication WHERE clause must be boolean +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl3 WHERE (1234); +ERROR: argument of PUBLICATION WHERE must be type boolean, not type integer +LINE 1: ...PUBLICATION testpub5 SET TABLE testpub_rf_tbl3 WHERE (1234); + ^ +-- fail - aggregate functions not allowed in WHERE clause +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl3 WHERE (e < AVG(e)); +ERROR: aggregate functions are not allowed in WHERE +LINE 1: ...ATION testpub5 SET TABLE testpub_rf_tbl3 WHERE (e < AVG(e)); + ^ +-- fail - user-defined operators are not allowed +CREATE FUNCTION testpub_rf_func1(integer, integer) RETURNS boolean AS $$ SELECT hashint4($1) > $2 $$ LANGUAGE SQL; +CREATE OPERATOR =#> (PROCEDURE = testpub_rf_func1, LEFTARG = integer, RIGHTARG = integer); +CREATE PUBLICATION testpub6 FOR TABLE testpub_rf_tbl3 WHERE (e =#> 27); +ERROR: invalid publication WHERE expression +LINE 1: ...ICATION testpub6 FOR TABLE testpub_rf_tbl3 WHERE (e =#> 27); + ^ +DETAIL: User-defined operators are not allowed. +-- fail - user-defined functions are not allowed +CREATE FUNCTION testpub_rf_func2() RETURNS integer AS $$ BEGIN RETURN 123; END; $$ LANGUAGE plpgsql; +ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl1 WHERE (a >= testpub_rf_func2()); +ERROR: invalid publication WHERE expression +LINE 1: ...ON testpub5 ADD TABLE testpub_rf_tbl1 WHERE (a >= testpub_rf... + ^ +DETAIL: User-defined or built-in mutable functions are not allowed. +-- fail - non-immutable functions are not allowed. random() is volatile. +ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl1 WHERE (a < random()); +ERROR: invalid publication WHERE expression +LINE 1: ...ION testpub5 ADD TABLE testpub_rf_tbl1 WHERE (a < random()); + ^ +DETAIL: User-defined or built-in mutable functions are not allowed. +-- fail - user-defined collations are not allowed +CREATE COLLATION user_collation FROM "C"; +ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl1 WHERE (b < '2' COLLATE user_collation); +ERROR: invalid publication WHERE expression +LINE 1: ...ICATION testpub5 ADD TABLE testpub_rf_tbl1 WHERE (b < '2' CO... + ^ +DETAIL: User-defined collations are not allowed. +-- ok - NULLIF is allowed +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (NULLIF(1,2) = a); +-- ok - built-in operators are allowed +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (a IS NULL); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE ((a > 5) IS FALSE); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (a IS DISTINCT FROM 5); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE ((a, a + 1) < (2, 3)); +-- ok - built-in type coercions between two binary compatible datatypes are allowed +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (b::varchar < '2'); +-- ok - immutable built-in functions are allowed +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl4 WHERE (length(g) < 6); +-- fail - user-defined types are not allowed +CREATE TYPE rf_bug_status AS ENUM ('new', 'open', 'closed'); +CREATE TABLE rf_bug (id serial, description text, status rf_bug_status); +CREATE PUBLICATION testpub6 FOR TABLE rf_bug WHERE (status = 'open') WITH (publish = 'insert'); +ERROR: invalid publication WHERE expression +LINE 1: ...EATE PUBLICATION testpub6 FOR TABLE rf_bug WHERE (status = '... + ^ +DETAIL: User-defined types are not allowed. +DROP TABLE rf_bug; +DROP TYPE rf_bug_status; +-- fail - row filter expression is not simple +CREATE PUBLICATION testpub6 FOR TABLE testpub_rf_tbl1 WHERE (a IN (SELECT generate_series(1,5))); +ERROR: invalid publication WHERE expression +LINE 1: ...ICATION testpub6 FOR TABLE testpub_rf_tbl1 WHERE (a IN (SELE... + ^ +DETAIL: Expressions only allow columns, constants, built-in operators, built-in data types, built-in collations and immutable built-in functions. +-- fail - system columns are not allowed +CREATE PUBLICATION testpub6 FOR TABLE testpub_rf_tbl1 WHERE ('(0,1)'::tid = ctid); +ERROR: invalid publication WHERE expression +LINE 1: ...tpub6 FOR TABLE testpub_rf_tbl1 WHERE ('(0,1)'::tid = ctid); + ^ +DETAIL: System columns are not allowed. +-- ok - conditional expressions are allowed +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl5 WHERE (a IS DOCUMENT); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl5 WHERE (xmlexists('//foo[text() = ''bar'']' PASSING BY VALUE a)); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (NULLIF(1, 2) = a); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (CASE a WHEN 5 THEN true ELSE false END); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (COALESCE(b, 'foo') = 'foo'); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (GREATEST(a, 10) > 10); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (a IN (2, 4, 6)); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (ARRAY[a] <@ ARRAY[2, 4, 6]); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (ROW(a, 2) IS NULL); +-- fail - WHERE not allowed in DROP +ALTER PUBLICATION testpub5 DROP TABLE testpub_rf_tbl1 WHERE (e < 27); +ERROR: cannot use a WHERE clause when removing a table from a publication +-- fail - cannot ALTER SET table which is a member of a pre-existing schema +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub6 FOR ALL TABLES IN SCHEMA testpub_rf_schema2; +ALTER PUBLICATION testpub6 SET ALL TABLES IN SCHEMA testpub_rf_schema2, TABLE testpub_rf_schema2.testpub_rf_tbl6 WHERE (i < 99); +ERROR: cannot add relation "testpub_rf_schema2.testpub_rf_tbl6" to publication +DETAIL: Table's schema "testpub_rf_schema2" is already part of the publication or part of the specified schema list. +RESET client_min_messages; +DROP TABLE testpub_rf_tbl1; +DROP TABLE testpub_rf_tbl2; +DROP TABLE testpub_rf_tbl3; +DROP TABLE testpub_rf_tbl4; +DROP TABLE testpub_rf_tbl5; +DROP TABLE testpub_rf_schema1.testpub_rf_tbl5; +DROP TABLE testpub_rf_schema2.testpub_rf_tbl6; +DROP SCHEMA testpub_rf_schema1; +DROP SCHEMA testpub_rf_schema2; +DROP PUBLICATION testpub5; +DROP PUBLICATION testpub6; +DROP OPERATOR =#>(integer, integer); +DROP FUNCTION testpub_rf_func1(integer, integer); +DROP FUNCTION testpub_rf_func2(); +DROP COLLATION user_collation; +-- ====================================================== +-- More row filter tests for validating column references +CREATE TABLE rf_tbl_abcd_nopk(a int, b int, c int, d int); +CREATE TABLE rf_tbl_abcd_pk(a int, b int, c int, d int, PRIMARY KEY(a,b)); +CREATE TABLE rf_tbl_abcd_part_pk (a int PRIMARY KEY, b int) PARTITION by RANGE (a); +CREATE TABLE rf_tbl_abcd_part_pk_1 (b int, a int PRIMARY KEY); +ALTER TABLE rf_tbl_abcd_part_pk ATTACH PARTITION rf_tbl_abcd_part_pk_1 FOR VALUES FROM (1) TO (10); +-- Case 1. REPLICA IDENTITY DEFAULT (means use primary key or nothing) +-- 1a. REPLICA IDENTITY is DEFAULT and table has a PK. +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub6 FOR TABLE rf_tbl_abcd_pk WHERE (a > 99); +RESET client_min_messages; +-- ok - "a" is a PK col +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (b > 99); +-- ok - "b" is a PK col +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (c > 99); +-- fail - "c" is not part of the PK +UPDATE rf_tbl_abcd_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_pk" +DETAIL: Column used in the publication WHERE expression is not part of the replica identity. +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (d > 99); +-- fail - "d" is not part of the PK +UPDATE rf_tbl_abcd_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_pk" +DETAIL: Column used in the publication WHERE expression is not part of the replica identity. +-- 1b. REPLICA IDENTITY is DEFAULT and table has no PK +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk WHERE (a > 99); +-- fail - "a" is not part of REPLICA IDENTITY +UPDATE rf_tbl_abcd_nopk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_nopk" +DETAIL: Column used in the publication WHERE expression is not part of the replica identity. +-- Case 2. REPLICA IDENTITY FULL +ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY FULL; +ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY FULL; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (c > 99); +-- ok - "c" is in REPLICA IDENTITY now even though not in PK +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk WHERE (a > 99); +-- ok - "a" is in REPLICA IDENTITY now +UPDATE rf_tbl_abcd_nopk SET a = 1; +-- Case 3. REPLICA IDENTITY NOTHING +ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY NOTHING; +ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY NOTHING; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (a > 99); +-- fail - "a" is in PK but it is not part of REPLICA IDENTITY NOTHING +UPDATE rf_tbl_abcd_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_pk" +DETAIL: Column used in the publication WHERE expression is not part of the replica identity. +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (c > 99); +-- fail - "c" is not in PK and not in REPLICA IDENTITY NOTHING +UPDATE rf_tbl_abcd_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_pk" +DETAIL: Column used in the publication WHERE expression is not part of the replica identity. +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk WHERE (a > 99); +-- fail - "a" is not in REPLICA IDENTITY NOTHING +UPDATE rf_tbl_abcd_nopk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_nopk" +DETAIL: Column used in the publication WHERE expression is not part of the replica identity. +-- Case 4. REPLICA IDENTITY INDEX +ALTER TABLE rf_tbl_abcd_pk ALTER COLUMN c SET NOT NULL; +CREATE UNIQUE INDEX idx_abcd_pk_c ON rf_tbl_abcd_pk(c); +ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY USING INDEX idx_abcd_pk_c; +ALTER TABLE rf_tbl_abcd_nopk ALTER COLUMN c SET NOT NULL; +CREATE UNIQUE INDEX idx_abcd_nopk_c ON rf_tbl_abcd_nopk(c); +ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY USING INDEX idx_abcd_nopk_c; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (a > 99); +-- fail - "a" is in PK but it is not part of REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_pk" +DETAIL: Column used in the publication WHERE expression is not part of the replica identity. +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (c > 99); +-- ok - "c" is not in PK but it is part of REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk WHERE (a > 99); +-- fail - "a" is not in REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_nopk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_nopk" +DETAIL: Column used in the publication WHERE expression is not part of the replica identity. +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk WHERE (c > 99); +-- ok - "c" is part of REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_nopk SET a = 1; +-- Tests for partitioned table +-- set PUBLISH_VIA_PARTITION_ROOT to false and test row filter for partitioned +-- table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +-- fail - cannot use row filter for partitioned table +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk WHERE (a > 99); +ERROR: cannot use publication WHERE clause for relation "rf_tbl_abcd_part_pk" +DETAIL: WHERE clause cannot be used for a partitioned table when publish_via_partition_root is false. +-- ok - can use row filter for partition +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 WHERE (a > 99); +-- ok - "a" is a PK col +UPDATE rf_tbl_abcd_part_pk SET a = 1; +-- set PUBLISH_VIA_PARTITION_ROOT to true and test row filter for partitioned +-- table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=1); +-- ok - can use row filter for partitioned table +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk WHERE (a > 99); +-- ok - "a" is a PK col +UPDATE rf_tbl_abcd_part_pk SET a = 1; +-- fail - cannot set PUBLISH_VIA_PARTITION_ROOT to false if any row filter is +-- used for partitioned table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +ERROR: cannot set publish_via_partition_root = false for publication "testpub6" +DETAIL: The publication contains a WHERE clause for a partitioned table "rf_tbl_abcd_part_pk" which is not allowed when publish_via_partition_root is false. +-- Now change the root filter to use a column "b" +-- (which is not in the replica identity) +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 WHERE (b > 99); +-- ok - we don't have row filter for partitioned table. +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +-- fail - "b" is not in REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_part_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_part_pk_1" +DETAIL: Column used in the publication WHERE expression is not part of the replica identity. +-- set PUBLISH_VIA_PARTITION_ROOT to true +-- can use row filter for partitioned table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=1); +-- ok - can use row filter for partitioned table +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk WHERE (b > 99); +-- fail - "b" is not in REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_part_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_part_pk_1" +DETAIL: Column used in the publication WHERE expression is not part of the replica identity. +DROP PUBLICATION testpub6; +DROP TABLE rf_tbl_abcd_pk; +DROP TABLE rf_tbl_abcd_nopk; +DROP TABLE rf_tbl_abcd_part_pk; +-- ====================================================== -- Test cache invalidation FOR ALL TABLES publication SET client_min_messages = 'ERROR'; CREATE TABLE testpub_tbl4(a int); diff --git a/src/test/regress/sql/publication.sql b/src/test/regress/sql/publication.sql index 86c019bddb..3f04d34264 100644 --- a/src/test/regress/sql/publication.sql +++ b/src/test/regress/sql/publication.sql @@ -134,6 +134,242 @@ UPDATE testpub_parted2 SET a = 2; DROP TABLE testpub_parted1, testpub_parted2; DROP PUBLICATION testpub_forparted, testpub_forparted1; +-- Tests for row filters +CREATE TABLE testpub_rf_tbl1 (a integer, b text); +CREATE TABLE testpub_rf_tbl2 (c text, d integer); +CREATE TABLE testpub_rf_tbl3 (e integer); +CREATE TABLE testpub_rf_tbl4 (g text); +CREATE TABLE testpub_rf_tbl5 (a xml); +CREATE SCHEMA testpub_rf_schema1; +CREATE TABLE testpub_rf_schema1.testpub_rf_tbl5 (h integer); +CREATE SCHEMA testpub_rf_schema2; +CREATE TABLE testpub_rf_schema2.testpub_rf_tbl6 (i integer); +SET client_min_messages = 'ERROR'; +-- Firstly, test using the option publish='insert' because the row filter +-- validation of referenced columns is less strict than for delete/update. +CREATE PUBLICATION testpub5 FOR TABLE testpub_rf_tbl1, testpub_rf_tbl2 WHERE (c <> 'test' AND d < 5) WITH (publish = 'insert'); +RESET client_min_messages; +\dRp+ testpub5 +ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl3 WHERE (e > 1000 AND e < 2000); +\dRp+ testpub5 +ALTER PUBLICATION testpub5 DROP TABLE testpub_rf_tbl2; +\dRp+ testpub5 +-- remove testpub_rf_tbl1 and add testpub_rf_tbl3 again (another WHERE expression) +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl3 WHERE (e > 300 AND e < 500); +\dRp+ testpub5 +-- test \d (now it displays filter information) +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_rf_yes FOR TABLE testpub_rf_tbl1 WHERE (a > 1) WITH (publish = 'insert'); +CREATE PUBLICATION testpub_rf_no FOR TABLE testpub_rf_tbl1; +RESET client_min_messages; +\d testpub_rf_tbl1 +DROP PUBLICATION testpub_rf_yes, testpub_rf_no; +-- some more syntax tests to exercise other parser pathways +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_syntax1 FOR TABLE testpub_rf_tbl1, ONLY testpub_rf_tbl3 WHERE (e < 999) WITH (publish = 'insert'); +RESET client_min_messages; +\dRp+ testpub_syntax1 +DROP PUBLICATION testpub_syntax1; +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_syntax2 FOR TABLE testpub_rf_tbl1, testpub_rf_schema1.testpub_rf_tbl5 WHERE (h < 999) WITH (publish = 'insert'); +RESET client_min_messages; +\dRp+ testpub_syntax2 +DROP PUBLICATION testpub_syntax2; +-- fail - schemas don't allow WHERE clause +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_syntax3 FOR ALL TABLES IN SCHEMA testpub_rf_schema1 WHERE (a = 123); +CREATE PUBLICATION testpub_syntax3 FOR ALL TABLES IN SCHEMA testpub_rf_schema1, testpub_rf_schema1 WHERE (a = 123); +RESET client_min_messages; +-- fail - duplicate tables are not allowed if that table has any WHERE clause +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_dups FOR TABLE testpub_rf_tbl1 WHERE (a = 1), testpub_rf_tbl1 WITH (publish = 'insert'); +CREATE PUBLICATION testpub_dups FOR TABLE testpub_rf_tbl1, testpub_rf_tbl1 WHERE (a = 2) WITH (publish = 'insert'); +RESET client_min_messages; +-- fail - publication WHERE clause must be boolean +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl3 WHERE (1234); +-- fail - aggregate functions not allowed in WHERE clause +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl3 WHERE (e < AVG(e)); +-- fail - user-defined operators are not allowed +CREATE FUNCTION testpub_rf_func1(integer, integer) RETURNS boolean AS $$ SELECT hashint4($1) > $2 $$ LANGUAGE SQL; +CREATE OPERATOR =#> (PROCEDURE = testpub_rf_func1, LEFTARG = integer, RIGHTARG = integer); +CREATE PUBLICATION testpub6 FOR TABLE testpub_rf_tbl3 WHERE (e =#> 27); +-- fail - user-defined functions are not allowed +CREATE FUNCTION testpub_rf_func2() RETURNS integer AS $$ BEGIN RETURN 123; END; $$ LANGUAGE plpgsql; +ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl1 WHERE (a >= testpub_rf_func2()); +-- fail - non-immutable functions are not allowed. random() is volatile. +ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl1 WHERE (a < random()); +-- fail - user-defined collations are not allowed +CREATE COLLATION user_collation FROM "C"; +ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl1 WHERE (b < '2' COLLATE user_collation); +-- ok - NULLIF is allowed +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (NULLIF(1,2) = a); +-- ok - built-in operators are allowed +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (a IS NULL); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE ((a > 5) IS FALSE); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (a IS DISTINCT FROM 5); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE ((a, a + 1) < (2, 3)); +-- ok - built-in type coercions between two binary compatible datatypes are allowed +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (b::varchar < '2'); +-- ok - immutable built-in functions are allowed +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl4 WHERE (length(g) < 6); +-- fail - user-defined types are not allowed +CREATE TYPE rf_bug_status AS ENUM ('new', 'open', 'closed'); +CREATE TABLE rf_bug (id serial, description text, status rf_bug_status); +CREATE PUBLICATION testpub6 FOR TABLE rf_bug WHERE (status = 'open') WITH (publish = 'insert'); +DROP TABLE rf_bug; +DROP TYPE rf_bug_status; +-- fail - row filter expression is not simple +CREATE PUBLICATION testpub6 FOR TABLE testpub_rf_tbl1 WHERE (a IN (SELECT generate_series(1,5))); +-- fail - system columns are not allowed +CREATE PUBLICATION testpub6 FOR TABLE testpub_rf_tbl1 WHERE ('(0,1)'::tid = ctid); +-- ok - conditional expressions are allowed +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl5 WHERE (a IS DOCUMENT); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl5 WHERE (xmlexists('//foo[text() = ''bar'']' PASSING BY VALUE a)); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (NULLIF(1, 2) = a); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (CASE a WHEN 5 THEN true ELSE false END); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (COALESCE(b, 'foo') = 'foo'); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (GREATEST(a, 10) > 10); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (a IN (2, 4, 6)); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (ARRAY[a] <@ ARRAY[2, 4, 6]); +ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (ROW(a, 2) IS NULL); +-- fail - WHERE not allowed in DROP +ALTER PUBLICATION testpub5 DROP TABLE testpub_rf_tbl1 WHERE (e < 27); +-- fail - cannot ALTER SET table which is a member of a pre-existing schema +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub6 FOR ALL TABLES IN SCHEMA testpub_rf_schema2; +ALTER PUBLICATION testpub6 SET ALL TABLES IN SCHEMA testpub_rf_schema2, TABLE testpub_rf_schema2.testpub_rf_tbl6 WHERE (i < 99); +RESET client_min_messages; + +DROP TABLE testpub_rf_tbl1; +DROP TABLE testpub_rf_tbl2; +DROP TABLE testpub_rf_tbl3; +DROP TABLE testpub_rf_tbl4; +DROP TABLE testpub_rf_tbl5; +DROP TABLE testpub_rf_schema1.testpub_rf_tbl5; +DROP TABLE testpub_rf_schema2.testpub_rf_tbl6; +DROP SCHEMA testpub_rf_schema1; +DROP SCHEMA testpub_rf_schema2; +DROP PUBLICATION testpub5; +DROP PUBLICATION testpub6; +DROP OPERATOR =#>(integer, integer); +DROP FUNCTION testpub_rf_func1(integer, integer); +DROP FUNCTION testpub_rf_func2(); +DROP COLLATION user_collation; + +-- ====================================================== +-- More row filter tests for validating column references +CREATE TABLE rf_tbl_abcd_nopk(a int, b int, c int, d int); +CREATE TABLE rf_tbl_abcd_pk(a int, b int, c int, d int, PRIMARY KEY(a,b)); +CREATE TABLE rf_tbl_abcd_part_pk (a int PRIMARY KEY, b int) PARTITION by RANGE (a); +CREATE TABLE rf_tbl_abcd_part_pk_1 (b int, a int PRIMARY KEY); +ALTER TABLE rf_tbl_abcd_part_pk ATTACH PARTITION rf_tbl_abcd_part_pk_1 FOR VALUES FROM (1) TO (10); + +-- Case 1. REPLICA IDENTITY DEFAULT (means use primary key or nothing) +-- 1a. REPLICA IDENTITY is DEFAULT and table has a PK. +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub6 FOR TABLE rf_tbl_abcd_pk WHERE (a > 99); +RESET client_min_messages; +-- ok - "a" is a PK col +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (b > 99); +-- ok - "b" is a PK col +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (c > 99); +-- fail - "c" is not part of the PK +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (d > 99); +-- fail - "d" is not part of the PK +UPDATE rf_tbl_abcd_pk SET a = 1; +-- 1b. REPLICA IDENTITY is DEFAULT and table has no PK +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk WHERE (a > 99); +-- fail - "a" is not part of REPLICA IDENTITY +UPDATE rf_tbl_abcd_nopk SET a = 1; + +-- Case 2. REPLICA IDENTITY FULL +ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY FULL; +ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY FULL; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (c > 99); +-- ok - "c" is in REPLICA IDENTITY now even though not in PK +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk WHERE (a > 99); +-- ok - "a" is in REPLICA IDENTITY now +UPDATE rf_tbl_abcd_nopk SET a = 1; + +-- Case 3. REPLICA IDENTITY NOTHING +ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY NOTHING; +ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY NOTHING; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (a > 99); +-- fail - "a" is in PK but it is not part of REPLICA IDENTITY NOTHING +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (c > 99); +-- fail - "c" is not in PK and not in REPLICA IDENTITY NOTHING +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk WHERE (a > 99); +-- fail - "a" is not in REPLICA IDENTITY NOTHING +UPDATE rf_tbl_abcd_nopk SET a = 1; + +-- Case 4. REPLICA IDENTITY INDEX +ALTER TABLE rf_tbl_abcd_pk ALTER COLUMN c SET NOT NULL; +CREATE UNIQUE INDEX idx_abcd_pk_c ON rf_tbl_abcd_pk(c); +ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY USING INDEX idx_abcd_pk_c; +ALTER TABLE rf_tbl_abcd_nopk ALTER COLUMN c SET NOT NULL; +CREATE UNIQUE INDEX idx_abcd_nopk_c ON rf_tbl_abcd_nopk(c); +ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY USING INDEX idx_abcd_nopk_c; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (a > 99); +-- fail - "a" is in PK but it is not part of REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk WHERE (c > 99); +-- ok - "c" is not in PK but it is part of REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk WHERE (a > 99); +-- fail - "a" is not in REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_nopk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk WHERE (c > 99); +-- ok - "c" is part of REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_nopk SET a = 1; + +-- Tests for partitioned table + +-- set PUBLISH_VIA_PARTITION_ROOT to false and test row filter for partitioned +-- table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +-- fail - cannot use row filter for partitioned table +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk WHERE (a > 99); +-- ok - can use row filter for partition +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 WHERE (a > 99); +-- ok - "a" is a PK col +UPDATE rf_tbl_abcd_part_pk SET a = 1; +-- set PUBLISH_VIA_PARTITION_ROOT to true and test row filter for partitioned +-- table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=1); +-- ok - can use row filter for partitioned table +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk WHERE (a > 99); +-- ok - "a" is a PK col +UPDATE rf_tbl_abcd_part_pk SET a = 1; +-- fail - cannot set PUBLISH_VIA_PARTITION_ROOT to false if any row filter is +-- used for partitioned table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +-- Now change the root filter to use a column "b" +-- (which is not in the replica identity) +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 WHERE (b > 99); +-- ok - we don't have row filter for partitioned table. +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +-- fail - "b" is not in REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_part_pk SET a = 1; +-- set PUBLISH_VIA_PARTITION_ROOT to true +-- can use row filter for partitioned table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=1); +-- ok - can use row filter for partitioned table +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk WHERE (b > 99); +-- fail - "b" is not in REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_part_pk SET a = 1; + +DROP PUBLICATION testpub6; +DROP TABLE rf_tbl_abcd_pk; +DROP TABLE rf_tbl_abcd_nopk; +DROP TABLE rf_tbl_abcd_part_pk; +-- ====================================================== + -- Test cache invalidation FOR ALL TABLES publication SET client_min_messages = 'ERROR'; CREATE TABLE testpub_tbl4(a int); diff --git a/src/test/subscription/t/028_row_filter.pl b/src/test/subscription/t/028_row_filter.pl new file mode 100644 index 0000000000..88dc865829 --- /dev/null +++ b/src/test/subscription/t/028_row_filter.pl @@ -0,0 +1,695 @@ +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +# Test logical replication behavior with row filtering +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# create publisher node +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); +$node_publisher->init(allows_streaming => 'logical'); +$node_publisher->start; + +# create subscriber node +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); +$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->start; + +my $synced_query = + "SELECT count(1) = 0 FROM pg_subscription_rel WHERE srsubstate NOT IN ('r', 's');"; + +my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; +my $appname = 'tap_sub'; + +# ==================================================================== +# Testcase start: FOR ALL TABLES +# +# The FOR ALL TABLES test must come first so that it is not affected by +# all the other test tables that are later created. + +# create tables pub and sub +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rf_x (x int primary key)"); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rf_x (x int primary key)"); + +# insert some initial data +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rf_x (x) VALUES (0), (5), (10), (15), (20)"); + +# create pub/sub +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_x FOR TABLE tab_rf_x WHERE (x > 10)"); +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_forall FOR ALL TABLES"); +$node_subscriber->safe_psql('postgres', + "CREATE SUBSCRIPTION tap_sub CONNECTION '$publisher_connstr application_name=$appname' PUBLICATION tap_pub_x, tap_pub_forall" +); + +$node_publisher->wait_for_catchup($appname); +# wait for initial table synchronization to finish +$node_subscriber->poll_query_until('postgres', $synced_query) + or die "Timed out while waiting for subscriber to synchronize data"; + +# The subscription of the FOR ALL TABLES publication means there should be no +# filtering on the tablesync COPY, so all expect all 5 will be present. +my $result = + $node_subscriber->safe_psql('postgres', "SELECT count(x) FROM tab_rf_x"); +is($result, qq(5), + 'check initial data copy from table tab_rf_x should not be filtered'); + +# Similarly, the table filter for tab_rf_x (after the initial phase) has no +# effect when combined with the ALL TABLES. +# Expected: 5 initial rows + 2 new rows = 7 rows +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rf_x (x) VALUES (-99), (99)"); +$node_publisher->wait_for_catchup($appname); +$result = + $node_subscriber->safe_psql('postgres', "SELECT count(x) FROM tab_rf_x"); +is($result, qq(7), 'check table tab_rf_x should not be filtered'); + +# cleanup pub +$node_publisher->safe_psql('postgres', "DROP PUBLICATION tap_pub_forall"); +$node_publisher->safe_psql('postgres', "DROP PUBLICATION tap_pub_x"); +$node_publisher->safe_psql('postgres', "DROP TABLE tab_rf_x"); +# cleanup sub +$node_subscriber->safe_psql('postgres', "DROP SUBSCRIPTION tap_sub"); +$node_subscriber->safe_psql('postgres', "DROP TABLE tab_rf_x"); + +# Testcase end: FOR ALL TABLES +# ==================================================================== + +# ==================================================================== +# Testcase start: ALL TABLES IN SCHEMA +# +# The ALL TABLES IN SCHEMA test is independent of all other test cases so it +# cleans up after itself. + +# create tables pub and sub +$node_publisher->safe_psql('postgres', "CREATE SCHEMA schema_rf_x"); +$node_publisher->safe_psql('postgres', + "CREATE TABLE schema_rf_x.tab_rf_x (x int primary key)"); +$node_publisher->safe_psql('postgres', + "CREATE TABLE schema_rf_x.tab_rf_partitioned (x int primary key) PARTITION BY RANGE(x)" +); +$node_publisher->safe_psql('postgres', + "CREATE TABLE public.tab_rf_partition (LIKE schema_rf_x.tab_rf_partitioned)" +); +$node_publisher->safe_psql('postgres', + "ALTER TABLE schema_rf_x.tab_rf_partitioned ATTACH PARTITION public.tab_rf_partition DEFAULT" +); +$node_subscriber->safe_psql('postgres', "CREATE SCHEMA schema_rf_x"); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE schema_rf_x.tab_rf_x (x int primary key)"); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE schema_rf_x.tab_rf_partitioned (x int primary key) PARTITION BY RANGE(x)" +); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE public.tab_rf_partition (LIKE schema_rf_x.tab_rf_partitioned)" +); +$node_subscriber->safe_psql('postgres', + "ALTER TABLE schema_rf_x.tab_rf_partitioned ATTACH PARTITION public.tab_rf_partition DEFAULT" +); + +# insert some initial data +$node_publisher->safe_psql('postgres', + "INSERT INTO schema_rf_x.tab_rf_x (x) VALUES (0), (5), (10), (15), (20)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO schema_rf_x.tab_rf_partitioned (x) VALUES (1), (20)"); + +# create pub/sub +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_x FOR TABLE schema_rf_x.tab_rf_x WHERE (x > 10)" +); +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_allinschema FOR ALL TABLES IN SCHEMA schema_rf_x" +); +$node_publisher->safe_psql('postgres', + "ALTER PUBLICATION tap_pub_allinschema ADD TABLE public.tab_rf_partition WHERE (x > 10)" +); +$node_subscriber->safe_psql('postgres', + "CREATE SUBSCRIPTION tap_sub CONNECTION '$publisher_connstr application_name=$appname' PUBLICATION tap_pub_x, tap_pub_allinschema" +); + +$node_publisher->wait_for_catchup($appname); +# wait for initial table synchronization to finish +$node_subscriber->poll_query_until('postgres', $synced_query) + or die "Timed out while waiting for subscriber to synchronize data"; + +# The subscription of the ALL TABLES IN SCHEMA publication means there should be +# no filtering on the tablesync COPY, so expect all 5 will be present. +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(x) FROM schema_rf_x.tab_rf_x"); +is($result, qq(5), + 'check initial data copy from table tab_rf_x should not be filtered'); + +# Similarly, the table filter for tab_rf_x (after the initial phase) has no +# effect when combined with the ALL TABLES IN SCHEMA. Meanwhile, the filter for +# the tab_rf_partition does work because that partition belongs to a different +# schema (and publish_via_partition_root = false). +# Expected: +# tab_rf_x : 5 initial rows + 2 new rows = 7 rows +# tab_rf_partition : 1 initial row + 1 new row = 2 rows +$node_publisher->safe_psql('postgres', + "INSERT INTO schema_rf_x.tab_rf_x (x) VALUES (-99), (99)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO schema_rf_x.tab_rf_partitioned (x) VALUES (5), (25)"); +$node_publisher->wait_for_catchup($appname); +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(x) FROM schema_rf_x.tab_rf_x"); +is($result, qq(7), 'check table tab_rf_x should not be filtered'); +$result = $node_subscriber->safe_psql('postgres', + "SELECT * FROM public.tab_rf_partition"); +is( $result, qq(20 +25), 'check table tab_rf_partition should be filtered'); + +# cleanup pub +$node_publisher->safe_psql('postgres', + "DROP PUBLICATION tap_pub_allinschema"); +$node_publisher->safe_psql('postgres', "DROP PUBLICATION tap_pub_x"); +$node_publisher->safe_psql('postgres', "DROP TABLE public.tab_rf_partition"); +$node_publisher->safe_psql('postgres', + "DROP TABLE schema_rf_x.tab_rf_partitioned"); +$node_publisher->safe_psql('postgres', "DROP TABLE schema_rf_x.tab_rf_x"); +$node_publisher->safe_psql('postgres', "DROP SCHEMA schema_rf_x"); +# cleanup sub +$node_subscriber->safe_psql('postgres', "DROP SUBSCRIPTION tap_sub"); +$node_subscriber->safe_psql('postgres', "DROP TABLE public.tab_rf_partition"); +$node_subscriber->safe_psql('postgres', + "DROP TABLE schema_rf_x.tab_rf_partitioned"); +$node_subscriber->safe_psql('postgres', "DROP TABLE schema_rf_x.tab_rf_x"); +$node_subscriber->safe_psql('postgres', "DROP SCHEMA schema_rf_x"); + +# Testcase end: ALL TABLES IN SCHEMA +# ==================================================================== + +# ====================================================== +# Testcase start: FOR TABLE with row filter publications + +# setup structure on publisher +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_1 (a int primary key, b text)"); +$node_publisher->safe_psql('postgres', + "ALTER TABLE tab_rowfilter_1 REPLICA IDENTITY FULL;"); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_2 (c int primary key)"); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_3 (a int primary key, b boolean)"); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_4 (c int primary key)"); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_partitioned (a int primary key, b integer) PARTITION BY RANGE(a)" +); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_less_10k (LIKE tab_rowfilter_partitioned)"); +$node_publisher->safe_psql('postgres', + "ALTER TABLE tab_rowfilter_partitioned ATTACH PARTITION tab_rowfilter_less_10k FOR VALUES FROM (MINVALUE) TO (10000)" +); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_greater_10k (LIKE tab_rowfilter_partitioned)" +); +$node_publisher->safe_psql('postgres', + "ALTER TABLE tab_rowfilter_partitioned ATTACH PARTITION tab_rowfilter_greater_10k FOR VALUES FROM (10000) TO (MAXVALUE)" +); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_partitioned_2 (a int primary key, b integer) PARTITION BY RANGE(a)" +); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_partition (LIKE tab_rowfilter_partitioned_2)" +); +$node_publisher->safe_psql('postgres', + "ALTER TABLE tab_rowfilter_partitioned_2 ATTACH PARTITION tab_rowfilter_partition DEFAULT" +); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_toast (a text NOT NULL, b text NOT NULL)"); +$node_publisher->safe_psql('postgres', + "ALTER TABLE tab_rowfilter_toast ALTER COLUMN a SET STORAGE EXTERNAL"); +$node_publisher->safe_psql('postgres', + "CREATE UNIQUE INDEX tab_rowfilter_toast_ri_index on tab_rowfilter_toast (a, b)" +); +$node_publisher->safe_psql('postgres', + "ALTER TABLE tab_rowfilter_toast REPLICA IDENTITY USING INDEX tab_rowfilter_toast_ri_index" +); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_inherited (a int)"); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_child (b text) INHERITS (tab_rowfilter_inherited)" +); + +# setup structure on subscriber +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_1 (a int primary key, b text)"); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_2 (c int primary key)"); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_3 (a int primary key, b boolean)"); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_4 (c int primary key)"); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_partitioned (a int primary key, b integer) PARTITION BY RANGE(a)" +); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_less_10k (LIKE tab_rowfilter_partitioned)"); +$node_subscriber->safe_psql('postgres', + "ALTER TABLE tab_rowfilter_partitioned ATTACH PARTITION tab_rowfilter_less_10k FOR VALUES FROM (MINVALUE) TO (10000)" +); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_greater_10k (LIKE tab_rowfilter_partitioned)" +); +$node_subscriber->safe_psql('postgres', + "ALTER TABLE tab_rowfilter_partitioned ATTACH PARTITION tab_rowfilter_greater_10k FOR VALUES FROM (10000) TO (MAXVALUE)" +); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_partitioned_2 (a int primary key, b integer) PARTITION BY RANGE(a)" +); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_partition (LIKE tab_rowfilter_partitioned_2)" +); +$node_subscriber->safe_psql('postgres', + "ALTER TABLE tab_rowfilter_partitioned_2 ATTACH PARTITION tab_rowfilter_partition DEFAULT" +); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_toast (a text NOT NULL, b text NOT NULL)"); +$node_subscriber->safe_psql('postgres', + "CREATE UNIQUE INDEX tab_rowfilter_toast_ri_index on tab_rowfilter_toast (a, b)" +); +$node_subscriber->safe_psql('postgres', + "ALTER TABLE tab_rowfilter_toast REPLICA IDENTITY USING INDEX tab_rowfilter_toast_ri_index" +); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_inherited (a int)"); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_child (b text) INHERITS (tab_rowfilter_inherited)" +); + +# setup logical replication +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_1 FOR TABLE tab_rowfilter_1 WHERE (a > 1000 AND b <> 'filtered')" +); + +$node_publisher->safe_psql('postgres', + "ALTER PUBLICATION tap_pub_1 ADD TABLE tab_rowfilter_2 WHERE (c % 7 = 0)" +); + +$node_publisher->safe_psql('postgres', + "ALTER PUBLICATION tap_pub_1 SET TABLE tab_rowfilter_1 WHERE (a > 1000 AND b <> 'filtered'), tab_rowfilter_2 WHERE (c % 2 = 0), tab_rowfilter_3" +); + +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_2 FOR TABLE tab_rowfilter_2 WHERE (c % 3 = 0)" +); + +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_3 FOR TABLE tab_rowfilter_partitioned"); +$node_publisher->safe_psql('postgres', + "ALTER PUBLICATION tap_pub_3 ADD TABLE tab_rowfilter_less_10k WHERE (a < 6000)" +); +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_not_used FOR TABLE tab_rowfilter_1 WHERE (a < 0)" +); + +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_4a FOR TABLE tab_rowfilter_4 WHERE (c % 2 = 0)" +); +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_4b FOR TABLE tab_rowfilter_4"); + +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_5a FOR TABLE tab_rowfilter_partitioned_2"); +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_5b FOR TABLE tab_rowfilter_partition WHERE (a > 10)" +); + +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_toast FOR TABLE tab_rowfilter_toast WHERE (a = repeat('1234567890', 200) AND b < '10')" +); + +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_inherits FOR TABLE tab_rowfilter_inherited WHERE (a > 15)" +); + +# +# The following INSERTs are executed before the CREATE SUBSCRIPTION, so these +# SQL commands are for testing the initial data copy using logical replication. +# +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_1 (a, b) VALUES (1, 'not replicated')"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_1 (a, b) VALUES (1500, 'filtered')"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_1 (a, b) VALUES (1980, 'not filtered')"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_1 (a, b) SELECT x, 'test ' || x FROM generate_series(990,1002) x" +); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_2 (c) SELECT generate_series(1, 20)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_3 (a, b) SELECT x, (x % 3 = 0) FROM generate_series(1, 10) x" +); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_4 (c) SELECT generate_series(1, 10)"); + +# insert data into partitioned table and directly on the partition +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_partitioned (a, b) VALUES(1, 100),(7000, 101),(15000, 102),(5500, 300)" +); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_less_10k (a, b) VALUES(2, 200),(6005, 201)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_greater_10k (a, b) VALUES(16000, 103)"); + +# insert data into partitioned table. +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_partitioned_2 (a, b) VALUES(1, 1),(20, 20)"); + +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_toast(a, b) VALUES(repeat('1234567890', 200), '1234567890')" +); + +# insert data into parent and child table. +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_inherited(a) VALUES(10),(20)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_child(a, b) VALUES(0,'0'),(30,'30'),(40,'40')" +); + +$node_subscriber->safe_psql('postgres', + "CREATE SUBSCRIPTION tap_sub CONNECTION '$publisher_connstr application_name=$appname' PUBLICATION tap_pub_1, tap_pub_2, tap_pub_3, tap_pub_4a, tap_pub_4b, tap_pub_5a, tap_pub_5b, tap_pub_toast, tap_pub_inherits" +); + +$node_publisher->wait_for_catchup($appname); + +# wait for initial table synchronization to finish +$node_subscriber->poll_query_until('postgres', $synced_query) + or die "Timed out while waiting for subscriber to synchronize data"; + +# Check expected replicated rows for tab_rowfilter_1 +# tap_pub_1 filter is: (a > 1000 AND b <> 'filtered') +# - INSERT (1, 'not replicated') NO, because a is not > 1000 +# - INSERT (1500, 'filtered') NO, because b == 'filtered' +# - INSERT (1980, 'not filtered') YES +# - generate_series(990,1002) YES, only for 1001,1002 because a > 1000 +# +$result = + $node_subscriber->safe_psql('postgres', + "SELECT a, b FROM tab_rowfilter_1 ORDER BY 1, 2"); +is( $result, qq(1001|test 1001 +1002|test 1002 +1980|not filtered), 'check initial data copy from table tab_rowfilter_1'); + +# Check expected replicated rows for tab_rowfilter_2 +# tap_pub_1 filter is: (c % 2 = 0) +# tap_pub_2 filter is: (c % 3 = 0) +# When there are multiple publications for the same table, the filters +# expressions are OR'ed together. In this case, rows are replicated if +# c value is divided by 2 OR 3 (2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20) +# +$result = + $node_subscriber->safe_psql('postgres', + "SELECT count(c), min(c), max(c) FROM tab_rowfilter_2"); +is($result, qq(13|2|20), + 'check initial data copy from table tab_rowfilter_2'); + +# Check expected replicated rows for tab_rowfilter_4 +# (same table in two publications but only one has a filter). +# tap_pub_4a filter is: (c % 2 = 0) +# tap_pub_4b filter is: +# Expressions are OR'ed together but when there is no filter it just means +# OR everything - e.g. same as no filter at all. +# Expect all rows: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) +$result = + $node_subscriber->safe_psql('postgres', + "SELECT count(c), min(c), max(c) FROM tab_rowfilter_4"); +is($result, qq(10|1|10), + 'check initial data copy from table tab_rowfilter_4'); + +# Check expected replicated rows for tab_rowfilter_3 +# There is no filter. 10 rows are inserted, so 10 rows are replicated. +$result = + $node_subscriber->safe_psql('postgres', + "SELECT count(a) FROM tab_rowfilter_3"); +is($result, qq(10), 'check initial data copy from table tab_rowfilter_3'); + +# Check expected replicated rows for partitions +# publication option publish_via_partition_root is false so use the row filter +# from a partition +# tab_rowfilter_partitioned filter: (a < 5000) +# tab_rowfilter_less_10k filter: (a < 6000) +# tab_rowfilter_greater_10k filter: no filter +# +# INSERT into tab_rowfilter_partitioned: +# - INSERT (1,100) YES, because 1 < 6000 +# - INSERT (7000, 101) NO, because 7000 is not < 6000 +# - INSERT (15000, 102) YES, because tab_rowfilter_greater_10k has no filter +# - INSERT (5500, 300) YES, because 5500 < 6000 +# +# INSERT directly into tab_rowfilter_less_10k: +# - INSERT (2, 200) YES, because 2 < 6000 +# - INSERT (6005, 201) NO, because 6005 is not < 6000 +# +# INSERT directly into tab_rowfilter_greater_10k: +# - INSERT (16000, 103) YES, because tab_rowfilter_greater_10k has no filter +# +$result = + $node_subscriber->safe_psql('postgres', + "SELECT a, b FROM tab_rowfilter_less_10k ORDER BY 1, 2"); +is( $result, qq(1|100 +2|200 +5500|300), 'check initial data copy from partition tab_rowfilter_less_10k'); + +$result = + $node_subscriber->safe_psql('postgres', + "SELECT a, b FROM tab_rowfilter_greater_10k ORDER BY 1, 2"); +is( $result, qq(15000|102 +16000|103), 'check initial data copy from partition tab_rowfilter_greater_10k' +); + +# Check expected replicated rows for partitions +# publication option publish_via_partition_root is false so use the row filter +# from a partition +# tap_pub_5a filter: +# tap_pub_5b filter: (a > 10) +# The parent table for this partition is published via tap_pub_5a, so there is +# no filter for the partition. And expressions are OR'ed together so it means +# OR everything - e.g. same as no filter at all. +# Expect all rows: (1, 1) and (20, 20) +# +$result = + $node_subscriber->safe_psql('postgres', + "SELECT a, b FROM tab_rowfilter_partition ORDER BY 1, 2"); +is( $result, qq(1|1 +20|20), 'check initial data copy from partition tab_rowfilter_partition'); + +# Check expected replicated rows for tab_rowfilter_toast +# tab_rowfilter_toast filter: (a = repeat('1234567890', 200) AND b < '10') +# INSERT (repeat('1234567890', 200) ,'1234567890') NO +$result = + $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM tab_rowfilter_toast"); +is($result, qq(0), 'check initial data copy from table tab_rowfilter_toast'); + +# Check expected replicated rows for tab_rowfilter_inherited +# tab_rowfilter_inherited filter is: (a > 15) +# - INSERT (10) NO, 10 < 15 +# - INSERT (20) YES, 20 > 15 +# - INSERT (0, '0') NO, 0 < 15 +# - INSERT (30, '30') YES, 30 > 15 +# - INSERT (40, '40') YES, 40 > 15 +$result = + $node_subscriber->safe_psql('postgres', + "SELECT a FROM tab_rowfilter_inherited ORDER BY a"); +is( $result, qq(20 +30 +40), 'check initial data copy from table tab_rowfilter_inherited'); + +# The following commands are executed after CREATE SUBSCRIPTION, so these SQL +# commands are for testing normal logical replication behavior. +# +# test row filter (INSERT, UPDATE, DELETE) +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_1 (a, b) VALUES (800, 'test 800')"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_1 (a, b) VALUES (1600, 'test 1600')"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_1 (a, b) VALUES (1601, 'test 1601')"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_1 (a, b) VALUES (1602, 'filtered')"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_1 (a, b) VALUES (1700, 'test 1700')"); +$node_publisher->safe_psql('postgres', + "UPDATE tab_rowfilter_1 SET b = NULL WHERE a = 1600"); +$node_publisher->safe_psql('postgres', + "UPDATE tab_rowfilter_1 SET b = 'test 1601 updated' WHERE a = 1601"); +$node_publisher->safe_psql('postgres', + "UPDATE tab_rowfilter_1 SET b = 'test 1602 updated' WHERE a = 1602"); +$node_publisher->safe_psql('postgres', + "DELETE FROM tab_rowfilter_1 WHERE a = 1700"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_2 (c) VALUES (21), (22), (23), (24), (25)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_4 (c) VALUES (0), (11), (12)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_inherited (a) VALUES (14), (16)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_child (a, b) VALUES (13, '13'), (17, '17')"); + +$node_publisher->wait_for_catchup($appname); + +# Check expected replicated rows for tab_rowfilter_2 +# tap_pub_1 filter is: (c % 2 = 0) +# tap_pub_2 filter is: (c % 3 = 0) +# When there are multiple publications for the same table, the filters +# expressions are OR'ed together. In this case, rows are replicated if +# c value is divided by 2 OR 3. +# +# Expect original rows (2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20) +# Plus (21, 22, 24) +# +$result = + $node_subscriber->safe_psql('postgres', + "SELECT count(c), min(c), max(c) FROM tab_rowfilter_2"); +is($result, qq(16|2|24), 'check replicated rows to tab_rowfilter_2'); + +# Check expected replicated rows for tab_rowfilter_4 +# (same table in two publications but only one has a filter). +# tap_pub_4a filter is: (c % 2 = 0) +# tap_pub_4b filter is: +# Expressions are OR'ed together but when there is no filter it just means +# OR everything - e.g. same as no filter at all. +# Expect all rows from initial copy: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) +# And also (0, 11, 12) +$result = + $node_subscriber->safe_psql('postgres', + "SELECT count(c), min(c), max(c) FROM tab_rowfilter_4"); +is($result, qq(13|0|12), 'check replicated rows to tab_rowfilter_4'); + +# Check expected replicated rows for tab_rowfilter_1 +# tap_pub_1 filter is: (a > 1000 AND b <> 'filtered') +# +# - 1001, 1002, 1980 already exist from initial data copy +# - INSERT (800, 'test 800') NO, because 800 is not > 1000 +# - INSERT (1600, 'test 1600') YES, because 1600 > 1000 and 'test 1600' <> 'filtered', +# but row deleted after the update below. +# - INSERT (1601, 'test 1601') YES, because 1601 > 1000 and 'test 1601' <> 'filtered' +# - INSERT (1602, 'filtered') NO, because b == 'filtered' +# - INSERT (1700, 'test 1700') YES, because 1700 > 1000 and 'test 1700' <> 'filtered' +# - UPDATE (1600, NULL) NO, row filter evaluates to false because NULL is not <> 'filtered' +# - UPDATE (1601, 'test 1601 updated') YES, because 1601 > 1000 and 'test 1601 updated' <> 'filtered' +# - UPDATE (1602, 'test 1602 updated') YES, because 1602 > 1000 and 'test 1602 updated' <> 'filtered' +# - DELETE (1700) YES, because 1700 > 1000 and 'test 1700' <> 'filtered' +# +$result = + $node_subscriber->safe_psql('postgres', + "SELECT a, b FROM tab_rowfilter_1 ORDER BY 1, 2"); +is( $result, qq(1001|test 1001 +1002|test 1002 +1601|test 1601 updated +1602|test 1602 updated +1980|not filtered), 'check replicated rows to table tab_rowfilter_1'); + +# Publish using root partitioned table +# Use a different partitioned table layout (exercise publish_via_partition_root) +$node_publisher->safe_psql('postgres', + "ALTER PUBLICATION tap_pub_3 SET (publish_via_partition_root = true)"); +$node_publisher->safe_psql('postgres', + "ALTER PUBLICATION tap_pub_3 SET TABLE tab_rowfilter_partitioned WHERE (a < 5000), tab_rowfilter_less_10k WHERE (a < 6000)" +); +$node_subscriber->safe_psql('postgres', + "TRUNCATE TABLE tab_rowfilter_partitioned"); +$node_subscriber->safe_psql('postgres', + "ALTER SUBSCRIPTION tap_sub REFRESH PUBLICATION WITH (copy_data = true)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_partitioned (a, b) VALUES(4000, 400),(4001, 401),(4002, 402)" +); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_less_10k (a, b) VALUES(4500, 450)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_less_10k (a, b) VALUES(5600, 123)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_greater_10k (a, b) VALUES(14000, 1950)"); +$node_publisher->safe_psql('postgres', + "UPDATE tab_rowfilter_less_10k SET b = 30 WHERE a = 4001"); +$node_publisher->safe_psql('postgres', + "DELETE FROM tab_rowfilter_less_10k WHERE a = 4002"); + +$node_publisher->wait_for_catchup($appname); + +# Check expected replicated rows for partitions +# publication option publish_via_partition_root is true so use the row filter +# from the root partitioned table +# tab_rowfilter_partitioned filter: (a < 5000) +# tab_rowfilter_less_10k filter: (a < 6000) +# tab_rowfilter_greater_10k filter: no filter +# +# After TRUNCATE, REFRESH PUBLICATION, the initial data copy will apply the +# partitioned table row filter. +# - INSERT (1, 100) YES, 1 < 5000 +# - INSERT (7000, 101) NO, 7000 is not < 5000 +# - INSERT (15000, 102) NO, 15000 is not < 5000 +# - INSERT (5500, 300) NO, 5500 is not < 5000 +# - INSERT (2, 200) YES, 2 < 5000 +# - INSERT (6005, 201) NO, 6005 is not < 5000 +# - INSERT (16000, 103) NO, 16000 is not < 5000 +# +# Execute SQL commands after initial data copy for testing the logical +# replication behavior. +# - INSERT (4000, 400) YES, 4000 < 5000 +# - INSERT (4001, 401) YES, 4001 < 5000 +# - INSERT (4002, 402) YES, 4002 < 5000 +# - INSERT (4500, 450) YES, 4500 < 5000 +# - INSERT (5600, 123) NO, 5600 is not < 5000 +# - INSERT (14000, 1950) NO, 16000 is not < 5000 +# - UPDATE (4001) YES, 4001 < 5000 +# - DELETE (4002) YES, 4002 < 5000 +$result = + $node_subscriber->safe_psql('postgres', + "SELECT a, b FROM tab_rowfilter_partitioned ORDER BY 1, 2"); +is( $result, qq(1|100 +2|200 +4000|400 +4001|30 +4500|450), 'check publish_via_partition_root behavior'); + +# Check expected replicated rows for tab_rowfilter_inherited and +# tab_rowfilter_child. +# tab_rowfilter_inherited filter is: (a > 15) +# - INSERT (14) NO, 14 < 15 +# - INSERT (16) YES, 16 > 15 +# +# tab_rowfilter_child filter is: (a > 15) +# - INSERT (13, '13') NO, 13 < 15 +# - INSERT (17, '17') YES, 17 > 15 + +$result = + $node_subscriber->safe_psql('postgres', + "SELECT a FROM tab_rowfilter_inherited ORDER BY a"); +is( $result, qq(16 +17 +20 +30 +40), + 'check replicated rows to tab_rowfilter_inherited and tab_rowfilter_child' +); + +# UPDATE the non-toasted column for table tab_rowfilter_toast +$node_publisher->safe_psql('postgres', + "UPDATE tab_rowfilter_toast SET b = '1'"); + +# Check expected replicated rows for tab_rowfilter_toast +# tab_rowfilter_toast filter: (a = repeat('1234567890', 200) AND b < '10') +# UPDATE old (repeat('1234567890', 200) ,'1234567890') NO +# new: (repeat('1234567890', 200) ,'1') YES +$result = + $node_subscriber->safe_psql('postgres', + "SELECT a = repeat('1234567890', 200), b FROM tab_rowfilter_toast"); +is($result, qq(t|1), 'check replicated rows to tab_rowfilter_toast'); + +# Testcase end: FOR TABLE with row filter publications +# ====================================================== + +$node_subscriber->stop('fast'); +$node_publisher->stop('fast'); + +done_testing(); diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 15684f53ba..c6b302c7b2 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -2053,6 +2053,7 @@ PsqlScanStateData PsqlSettings Publication PublicationActions +PublicationDesc PublicationInfo PublicationObjSpec PublicationObjSpecType @@ -2199,6 +2200,7 @@ ReorderBufferApplyChangeCB ReorderBufferApplyTruncateCB ReorderBufferBeginCB ReorderBufferChange +ReorderBufferChangeType ReorderBufferCommitCB ReorderBufferCommitPreparedCB ReorderBufferDiskChange @@ -3506,6 +3508,7 @@ replace_rte_variables_context ret_type rewind_source rewrite_event +rf_context rijndael_ctx rm_detail_t role_auth_extra From 9467321649efc1fec28603d4ba35d03202c4ead1 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 22 Feb 2022 10:08:11 +0100 Subject: [PATCH 036/772] Put typtype letters back into consistent order --- src/test/regress/expected/type_sanity.out | 2 +- src/test/regress/sql/type_sanity.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/regress/expected/type_sanity.out b/src/test/regress/expected/type_sanity.out index 81c39a0112..d3ac08c9ee 100644 --- a/src/test/regress/expected/type_sanity.out +++ b/src/test/regress/expected/type_sanity.out @@ -17,7 +17,7 @@ SELECT t1.oid, t1.typname FROM pg_type as t1 WHERE t1.typnamespace = 0 OR (t1.typlen <= 0 AND t1.typlen != -1 AND t1.typlen != -2) OR - (t1.typtype not in ('b', 'c', 'd', 'e', 'p', 'r', 'm')) OR + (t1.typtype not in ('b', 'c', 'd', 'e', 'm', 'p', 'r')) OR NOT t1.typisdefined OR (t1.typalign not in ('c', 's', 'i', 'd')) OR (t1.typstorage not in ('p', 'x', 'e', 'm')); diff --git a/src/test/regress/sql/type_sanity.sql b/src/test/regress/sql/type_sanity.sql index 50a885eb44..5edc1f1f6e 100644 --- a/src/test/regress/sql/type_sanity.sql +++ b/src/test/regress/sql/type_sanity.sql @@ -20,7 +20,7 @@ SELECT t1.oid, t1.typname FROM pg_type as t1 WHERE t1.typnamespace = 0 OR (t1.typlen <= 0 AND t1.typlen != -1 AND t1.typlen != -2) OR - (t1.typtype not in ('b', 'c', 'd', 'e', 'p', 'r', 'm')) OR + (t1.typtype not in ('b', 'c', 'd', 'e', 'm', 'p', 'r')) OR NOT t1.typisdefined OR (t1.typalign not in ('c', 's', 'i', 'd')) OR (t1.typstorage not in ('p', 'x', 'e', 'm')); From afdeff10526e29e3fc63b18c08100458780489d9 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 22 Feb 2022 18:02:34 -0800 Subject: [PATCH 037/772] Add temporary debug info to help debug 019_replslot_limit.pl failures. I have not been able to reproduce the occasional failures of 019_replslot_limit.pl we are seeing in the buildfarm and not for lack of trying. The additional logging and increased log level will hopefully help. Will be reverted once the cause is identified. Discussion: https://postgr.es/m/20220218231415.c4plkp4i3reqcwip@alap3.anarazel.de --- src/backend/replication/slot.c | 21 +++++++++++++++++++++ src/bin/pg_basebackup/pg_basebackup.c | 10 +++++++++- src/test/recovery/t/019_replslot_limit.pl | 5 ++++- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index 5da5fa825a..3d39fddaae 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -177,6 +177,10 @@ ReplicationSlotInitialize(void) static void ReplicationSlotShmemExit(int code, Datum arg) { + /* temp debugging aid to analyze 019_replslot_limit failures */ + elog(DEBUG3, "replication slot exit hook, %s active slot", + MyReplicationSlot != NULL ? "with" : "without"); + /* Make sure active replication slots are released */ if (MyReplicationSlot != NULL) ReplicationSlotRelease(); @@ -554,6 +558,9 @@ ReplicationSlotCleanup(void) Assert(MyReplicationSlot == NULL); restart: + /* temp debugging aid to analyze 019_replslot_limit failures */ + elog(DEBUG3, "temporary replication slot cleanup: begin"); + LWLockAcquire(ReplicationSlotControlLock, LW_SHARED); for (i = 0; i < max_replication_slots; i++) { @@ -579,6 +586,8 @@ ReplicationSlotCleanup(void) } LWLockRelease(ReplicationSlotControlLock); + + elog(DEBUG3, "temporary replication slot cleanup: done"); } /* @@ -1284,6 +1293,12 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlot *s, XLogRecPtr oldestLSN, (void) kill(active_pid, SIGTERM); last_signaled_pid = active_pid; } + else + { + /* temp debugging aid to analyze 019_replslot_limit failures */ + elog(DEBUG3, "not signalling process %d during invalidation of slot \"%s\"", + active_pid, NameStr(slotname)); + } /* Wait until the slot is released. */ ConditionVariableSleep(&s->active_cv, @@ -1347,6 +1362,10 @@ InvalidateObsoleteReplicationSlots(XLogSegNo oldestSegno) XLogSegNoOffsetToRecPtr(oldestSegno, 0, wal_segment_size, oldestLSN); restart: + /* temp debugging aid to analyze 019_replslot_limit failures */ + elog(DEBUG3, "begin invalidating obsolete replication slots older than %X/%X", + LSN_FORMAT_ARGS(oldestLSN)); + LWLockAcquire(ReplicationSlotControlLock, LW_SHARED); for (int i = 0; i < max_replication_slots; i++) { @@ -1372,6 +1391,8 @@ InvalidateObsoleteReplicationSlots(XLogSegNo oldestSegno) ReplicationSlotsComputeRequiredLSN(); } + elog(DEBUG3, "done invalidating obsolete replication slots"); + return invalidated; } diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index 08b07d5a06..8c77c533e6 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -700,8 +700,16 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier) bgchild = fork(); if (bgchild == 0) { + int ret; + /* in child process */ - exit(LogStreamerMain(param)); + ret = LogStreamerMain(param); + + /* temp debugging aid to analyze 019_replslot_limit failures */ + if (verbose) + pg_log_info("log streamer with pid %d exiting", getpid()); + + exit(ret); } else if (bgchild < 0) { diff --git a/src/test/recovery/t/019_replslot_limit.pl b/src/test/recovery/t/019_replslot_limit.pl index 4257bd4d35..0c9da9bf27 100644 --- a/src/test/recovery/t/019_replslot_limit.pl +++ b/src/test/recovery/t/019_replslot_limit.pl @@ -316,13 +316,16 @@ max_wal_size = 2MB log_checkpoints = yes max_slot_wal_keep_size = 1MB + + # temp debugging aid to analyze 019_replslot_limit failures + log_min_messages=debug3 )); $node_primary3->start; $node_primary3->safe_psql('postgres', "SELECT pg_create_physical_replication_slot('rep3')"); # Take backup $backup_name = 'my_backup'; -$node_primary3->backup($backup_name); +$node_primary3->backup($backup_name, backup_options => ['--verbose']); # Create standby my $node_standby3 = PostgreSQL::Test::Cluster->new('standby_3'); $node_standby3->init_from_backup($node_primary3, $backup_name, From 2313a3ee22eb3c63a987b496df64c67443763a5a Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Wed, 23 Feb 2022 10:54:03 +0100 Subject: [PATCH 038/772] Fix statenames in mergejoin comments The names in the comments were on a few states not consistent with the documented state. Author: Zhihong Yu Discussion: https://postgr.es/m/CALNJ-vQVthfQXVqmrHR8BKHtC4fMGbhM1xbvJNJAPexTq_dH=w@mail.gmail.com --- src/backend/executor/nodeMergejoin.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/executor/nodeMergejoin.c b/src/backend/executor/nodeMergejoin.c index a049bc4ae0..edb8972c5b 100644 --- a/src/backend/executor/nodeMergejoin.c +++ b/src/backend/executor/nodeMergejoin.c @@ -1143,7 +1143,7 @@ ExecMergeJoin(PlanState *pstate) break; /*---------------------------------------------------------- - * EXEC_MJ_SKIP means compare tuples and if they do not + * EXEC_MJ_SKIP_TEST means compare tuples and if they do not * match, skip whichever is lesser. * * For example: @@ -1199,8 +1199,8 @@ ExecMergeJoin(PlanState *pstate) break; /* - * SKIPOUTER_ADVANCE: advance over an outer tuple that is - * known not to join to any inner tuple. + * EXEC_MJ_SKIPOUTER_ADVANCE: advance over an outer tuple that + * is known not to join to any inner tuple. * * Before advancing, we check to see if we must emit an * outer-join fill tuple for this outer tuple. @@ -1261,8 +1261,8 @@ ExecMergeJoin(PlanState *pstate) break; /* - * SKIPINNER_ADVANCE: advance over an inner tuple that is - * known not to join to any outer tuple. + * EXEC_MJ_SKIPINNER_ADVANCE: advance over an inner tuple that + * is known not to join to any outer tuple. * * Before advancing, we check to see if we must emit an * outer-join fill tuple for this inner tuple. From 91d3580535238abf93c67a6d3dce64f0e8c3cc6d Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Wed, 23 Feb 2022 11:22:46 +0100 Subject: [PATCH 039/772] Use test functions in pg_rewind test module Commit 61081e75c introduced pg_rewind along with the test suite, which ensured that subroutines didn't incur more than one test to plan. Now that we no longer explicitly plan tests (since 549ec201d), we can use the usual Test::More functions. Reviewed-by: Andrew Dunstan Discussion: https://postgr.es/m/AA527525-F0CC-4AA2-AF98-543CABFDAF59@yesql.se --- src/bin/pg_rewind/t/RewindTest.pm | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/bin/pg_rewind/t/RewindTest.pm b/src/bin/pg_rewind/t/RewindTest.pm index 2fedc626cc..5651602858 100644 --- a/src/bin/pg_rewind/t/RewindTest.pm +++ b/src/bin/pg_rewind/t/RewindTest.pm @@ -102,21 +102,10 @@ sub check_query ], '>', \$stdout, '2>', \$stderr; - # We don't use ok() for the exit code and stderr, because we want this - # check to be just a single test. - if (!$result) - { - fail("$test_name: psql exit code"); - } - elsif ($stderr ne '') - { - diag $stderr; - fail("$test_name: psql no stderr"); - } - else - { - is($stdout, $expected_stdout, "$test_name: query result matches"); - } + is($result, 1, "$test_name: psql exit code"); + is($stderr, '', "$test_name: psql no stderr"); + is($stdout, $expected_stdout, "$test_name: query result matches"); + return; } From 6da65a3f9a9deae4fdcc768c612b0c8f52759f75 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Wed, 23 Feb 2022 14:22:16 +0100 Subject: [PATCH 040/772] Add function to pump IPC process until string match Refactor the recovery tests to not carry a local duplicated copy of the pump_until function which pumps a process until a defined string is seen on a stream. This reduces duplication, and is in preparation for another patch which will also use this functionality. Reviewed-by: Michael Paquier Discussion https://postgr.es/m/YgynUafCyIu3jIhC@paquier.xyz --- src/test/perl/PostgreSQL/Test/Utils.pm | 23 +++++++++++ src/test/recovery/t/013_crash_restart.pl | 46 +++++---------------- src/test/recovery/t/022_crash_temp_files.pl | 45 ++++---------------- 3 files changed, 41 insertions(+), 73 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm index 2c0c72f57a..46cd746796 100644 --- a/src/test/perl/PostgreSQL/Test/Utils.pm +++ b/src/test/perl/PostgreSQL/Test/Utils.pm @@ -73,6 +73,7 @@ our @EXPORT = qw( system_log run_log run_command + pump_until command_ok command_fails @@ -408,6 +409,28 @@ sub run_command =pod +=item pump_until(proc, timeout, stream, until) + +Pump until string is matched on the specified stream, or timeout occurs. + +=cut + +sub pump_until +{ + my ($proc, $timeout, $stream, $until) = @_; + $proc->pump_nb(); + while (1) + { + last if $$stream =~ /$until/; + return 0 if ($timeout->is_expired); + return 0 if (not $proc->pumpable()); + $proc->pump(); + } + return 1; +} + +=pod + =item generate_ascii_string(from_char, to_char) Generate a string made of the given range of ASCII characters. diff --git a/src/test/recovery/t/013_crash_restart.pl b/src/test/recovery/t/013_crash_restart.pl index 3b740eb6f3..be31de37c5 100644 --- a/src/test/recovery/t/013_crash_restart.pl +++ b/src/test/recovery/t/013_crash_restart.pl @@ -71,7 +71,7 @@ INSERT INTO alive VALUES($$committed-before-sigquit$$); SELECT pg_backend_pid(); ]; -ok(pump_until($killme, \$killme_stdout, qr/[[:digit:]]+[\r\n]$/m), +ok(pump_until($killme, $psql_timeout, \$killme_stdout, qr/[[:digit:]]+[\r\n]$/m), 'acquired pid for SIGQUIT'); my $pid = $killme_stdout; chomp($pid); @@ -83,7 +83,7 @@ BEGIN; INSERT INTO alive VALUES($$in-progress-before-sigquit$$) RETURNING status; ]; -ok(pump_until($killme, \$killme_stdout, qr/in-progress-before-sigquit/m), +ok(pump_until($killme, $psql_timeout, \$killme_stdout, qr/in-progress-before-sigquit/m), 'inserted in-progress-before-sigquit'); $killme_stdout = ''; $killme_stderr = ''; @@ -96,7 +96,7 @@ SELECT $$psql-connected$$; SELECT pg_sleep(3600); ]; -ok(pump_until($monitor, \$monitor_stdout, qr/psql-connected/m), +ok(pump_until($monitor, $psql_timeout, \$monitor_stdout, qr/psql-connected/m), 'monitor connected'); $monitor_stdout = ''; $monitor_stderr = ''; @@ -113,6 +113,7 @@ ]; ok( pump_until( $killme, + $psql_timeout, \$killme_stderr, qr/WARNING: terminating connection because of crash of another server process|server closed the connection unexpectedly|connection to server was lost/m ), @@ -126,6 +127,7 @@ # sending. ok( pump_until( $monitor, + $psql_timeout, \$monitor_stderr, qr/WARNING: terminating connection because of crash of another server process|server closed the connection unexpectedly|connection to server was lost/m ), @@ -148,7 +150,7 @@ $killme_stdin .= q[ SELECT pg_backend_pid(); ]; -ok(pump_until($killme, \$killme_stdout, qr/[[:digit:]]+[\r\n]$/m), +ok(pump_until($killme, $psql_timeout, \$killme_stdout, qr/[[:digit:]]+[\r\n]$/m), "acquired pid for SIGKILL"); $pid = $killme_stdout; chomp($pid); @@ -161,7 +163,7 @@ BEGIN; INSERT INTO alive VALUES($$in-progress-before-sigkill$$) RETURNING status; ]; -ok(pump_until($killme, \$killme_stdout, qr/in-progress-before-sigkill/m), +ok(pump_until($killme, $psql_timeout, \$killme_stdout, qr/in-progress-before-sigkill/m), 'inserted in-progress-before-sigkill'); $killme_stdout = ''; $killme_stderr = ''; @@ -173,7 +175,7 @@ SELECT $$psql-connected$$; SELECT pg_sleep(3600); ]; -ok(pump_until($monitor, \$monitor_stdout, qr/psql-connected/m), +ok(pump_until($monitor, $psql_timeout, \$monitor_stdout, qr/psql-connected/m), 'monitor connected'); $monitor_stdout = ''; $monitor_stderr = ''; @@ -191,6 +193,7 @@ ]; ok( pump_until( $killme, + $psql_timeout, \$killme_stderr, qr/server closed the connection unexpectedly|connection to server was lost/m ), @@ -202,6 +205,7 @@ # sending. ok( pump_until( $monitor, + $psql_timeout, \$monitor_stderr, qr/WARNING: terminating connection because of crash of another server process|server closed the connection unexpectedly|connection to server was lost/m ), @@ -240,34 +244,4 @@ $node->stop(); -# Pump until string is matched, or timeout occurs -sub pump_until -{ - my ($proc, $stream, $untl) = @_; - $proc->pump_nb(); - while (1) - { - last if $$stream =~ /$untl/; - if ($psql_timeout->is_expired) - { - diag("aborting wait: program timed out"); - diag("stream contents: >>", $$stream, "<<"); - diag("pattern searched for: ", $untl); - - return 0; - } - if (not $proc->pumpable()) - { - diag("aborting wait: program died"); - diag("stream contents: >>", $$stream, "<<"); - diag("pattern searched for: ", $untl); - - return 0; - } - $proc->pump(); - } - return 1; - -} - done_testing(); diff --git a/src/test/recovery/t/022_crash_temp_files.pl b/src/test/recovery/t/022_crash_temp_files.pl index 6ab3092874..49dd86e848 100644 --- a/src/test/recovery/t/022_crash_temp_files.pl +++ b/src/test/recovery/t/022_crash_temp_files.pl @@ -57,7 +57,7 @@ $killme_stdin .= q[ SELECT pg_backend_pid(); ]; -ok(pump_until($killme, \$killme_stdout, qr/[[:digit:]]+[\r\n]$/m), +ok(pump_until($killme, $psql_timeout, \$killme_stdout, qr/[[:digit:]]+[\r\n]$/m), 'acquired pid for SIGKILL'); my $pid = $killme_stdout; chomp($pid); @@ -86,7 +86,7 @@ INSERT INTO tab_crash (a) VALUES(1); SELECT $$insert-tuple-to-lock-next-insert$$; ]; -pump_until($killme2, \$killme_stdout2, qr/insert-tuple-to-lock-next-insert/m); +pump_until($killme2, $psql_timeout, \$killme_stdout2, qr/insert-tuple-to-lock-next-insert/m); $killme_stdout2 = ''; $killme_stderr2 = ''; @@ -99,7 +99,7 @@ SELECT $$in-progress-before-sigkill$$; INSERT INTO tab_crash (a) SELECT i FROM generate_series(1, 5000) s(i); ]; -ok(pump_until($killme, \$killme_stdout, qr/in-progress-before-sigkill/m), +ok(pump_until($killme, $psql_timeout, \$killme_stdout, qr/in-progress-before-sigkill/m), 'insert in-progress-before-sigkill'); $killme_stdout = ''; $killme_stderr = ''; @@ -121,7 +121,7 @@ BEGIN SELECT $$insert-tuple-lock-waiting$$; ]; -pump_until($killme2, \$killme_stdout2, qr/insert-tuple-lock-waiting/m); +pump_until($killme2, $psql_timeout, \$killme_stdout2, qr/insert-tuple-lock-waiting/m); $killme_stdout2 = ''; $killme_stderr2 = ''; @@ -158,7 +158,7 @@ BEGIN $killme_stdin .= q[ SELECT pg_backend_pid(); ]; -ok(pump_until($killme, \$killme_stdout, qr/[[:digit:]]+[\r\n]$/m), +ok(pump_until($killme, $psql_timeout, \$killme_stdout, qr/[[:digit:]]+[\r\n]$/m), 'acquired pid for SIGKILL'); $pid = $killme_stdout; chomp($pid); @@ -175,7 +175,7 @@ BEGIN INSERT INTO tab_crash (a) VALUES(1); SELECT $$insert-tuple-to-lock-next-insert$$; ]; -pump_until($killme2, \$killme_stdout2, qr/insert-tuple-to-lock-next-insert/m); +pump_until($killme2, $psql_timeout, \$killme_stdout2, qr/insert-tuple-to-lock-next-insert/m); $killme_stdout2 = ''; $killme_stderr2 = ''; @@ -188,7 +188,7 @@ BEGIN SELECT $$in-progress-before-sigkill$$; INSERT INTO tab_crash (a) SELECT i FROM generate_series(1, 5000) s(i); ]; -ok(pump_until($killme, \$killme_stdout, qr/in-progress-before-sigkill/m), +ok(pump_until($killme, $psql_timeout, \$killme_stdout, qr/in-progress-before-sigkill/m), 'insert in-progress-before-sigkill'); $killme_stdout = ''; $killme_stderr = ''; @@ -210,7 +210,7 @@ BEGIN SELECT $$insert-tuple-lock-waiting$$; ]; -pump_until($killme2, \$killme_stdout2, qr/insert-tuple-lock-waiting/m); +pump_until($killme2, $psql_timeout, \$killme_stdout2, qr/insert-tuple-lock-waiting/m); $killme_stdout2 = ''; $killme_stderr2 = ''; @@ -242,33 +242,4 @@ BEGIN $node->stop(); -# Pump until string is matched, or timeout occurs -sub pump_until -{ - my ($proc, $stream, $untl) = @_; - $proc->pump_nb(); - while (1) - { - last if $$stream =~ /$untl/; - if ($psql_timeout->is_expired) - { - diag("aborting wait: program timed out"); - diag("stream contents: >>", $$stream, "<<"); - diag("pattern searched for: ", $untl); - - return 0; - } - if (not $proc->pumpable()) - { - diag("aborting wait: program died"); - diag("stream contents: >>", $$stream, "<<"); - diag("pattern searched for: ", $untl); - - return 0; - } - $proc->pump(); - } - return 1; -} - done_testing(); From c7d7e1203958952e0ef67d336c58f1e7094e7634 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Wed, 23 Feb 2022 14:23:50 +0100 Subject: [PATCH 041/772] Remove duplicated word in comment Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/B7C15416-BD61-4926-9843-5C557BCD7007@yesql.se --- src/test/recovery/t/013_crash_restart.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/recovery/t/013_crash_restart.pl b/src/test/recovery/t/013_crash_restart.pl index be31de37c5..3976e339c0 100644 --- a/src/test/recovery/t/013_crash_restart.pl +++ b/src/test/recovery/t/013_crash_restart.pl @@ -28,7 +28,7 @@ $node->init(allows_streaming => 1); $node->start(); -# by default PostgreSQL::Test::Cluster doesn't doesn't restart after a crash +# by default PostgreSQL::Test::Cluster doesn't restart after a crash $node->safe_psql( 'postgres', q[ALTER SYSTEM SET restart_after_crash = 1; From 0475a97f744d2fea3676b2e69405d20358eac07a Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Wed, 23 Feb 2022 14:24:43 +0100 Subject: [PATCH 042/772] Quick exit on log stream child exit in pg_basebackup If the log streaming child process (thread on Windows) dies during backup then the whole backup will be aborted at the end of the backup. Instead, trap ungraceful termination of the log streaming child and exit early. This also adds a TAP test for simulating this by terminating the responsible backend. Reviewed-by: Michael Paquier Reviewed-by: Bharath Rupireddy Reviewed-by: Magnus Hagander Discussion: https://postgr.es/m/0F69E282-97F9-4DB7-8D6D-F927AA6340C8@yesql.se Discussion: https://postgr.es/m/VI1PR83MB0189818B82C19059CB62E26199A89@VI1PR83MB0189.EURPRD83.prod.outlook.com --- src/bin/pg_basebackup/pg_basebackup.c | 47 +++++++++++++++++++- src/bin/pg_basebackup/t/010_pg_basebackup.pl | 34 ++++++++++++++ 2 files changed, 79 insertions(+), 2 deletions(-) diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index 8c77c533e6..c1ed7aeeee 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -174,6 +174,8 @@ static int bgpipe[2] = {-1, -1}; /* Handle to child process */ static pid_t bgchild = -1; static bool in_log_streamer = false; +/* Flag to indicate if child process exited unexpectedly */ +static volatile sig_atomic_t bgchild_exited = false; /* End position for xlog streaming, empty string if unknown yet */ static XLogRecPtr xlogendptr; @@ -277,6 +279,18 @@ disconnect_atexit(void) } #ifndef WIN32 +/* + * If the bgchild exits prematurely and raises a SIGCHLD signal, we can abort + * processing rather than wait until the backup has finished and error out at + * that time. On Windows, we use a background thread which can communicate + * without the need for a signal handler. + */ +static void +sigchld_handler(SIGNAL_ARGS) +{ + bgchild_exited = true; +} + /* * On windows, our background thread dies along with the process. But on * Unix, if we have started a subprocess, we want to kill it off so it @@ -285,7 +299,7 @@ disconnect_atexit(void) static void kill_bgchild_atexit(void) { - if (bgchild > 0) + if (bgchild > 0 && !bgchild_exited) kill(bgchild, SIGTERM); } #endif @@ -572,17 +586,28 @@ LogStreamerMain(logstreamer_param *param) stream.do_sync); if (!ReceiveXlogStream(param->bgconn, &stream)) - + { /* * Any errors will already have been reported in the function process, * but we need to tell the parent that we didn't shutdown in a nice * way. */ +#ifdef WIN32 + /* + * In order to signal the main thread of an ungraceful exit we + * set the same flag that we use on Unix to signal SIGCHLD. + */ + bgchild_exited = true; +#endif return 1; + } if (!stream.walmethod->finish()) { pg_log_error("could not finish writing WAL files: %m"); +#ifdef WIN32 + bgchild_exited = true; +#endif return 1; } @@ -1134,6 +1159,12 @@ ReceiveCopyData(PGconn *conn, WriteDataCallback callback, exit(1); } + if (bgchild_exited) + { + pg_log_error("background process terminated unexpectedly"); + exit(1); + } + (*callback) (r, copybuf, callback_data); PQfreemem(copybuf); @@ -2882,6 +2913,18 @@ main(int argc, char **argv) } atexit(disconnect_atexit); +#ifndef WIN32 + /* + * Trap SIGCHLD to be able to handle the WAL stream process exiting. There + * is no SIGCHLD on Windows, there we rely on the background thread setting + * the signal variable on unexpected but graceful exit. If the WAL stream + * thread crashes on Windows it will bring down the entire process as it's + * a thread, so there is nothing to catch should that happen. A crash on + * UNIX will be caught by the signal handler. + */ + pqsignal(SIGCHLD, sigchld_handler); +#endif + /* * Set umask so that directories/files are created with the same * permissions as directories/files in the source data directory. diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 75d6810d3e..8cb8cfe045 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -776,4 +776,38 @@ rmtree("$tempdir/backup_gzip3"); } +# Test background stream process terminating before the basebackup has +# finished, the main process should exit gracefully with an error message on +# stderr. To reduce the risk of timing related issues we invoke the base +# backup with rate throttling enabled. +$node->safe_psql('postgres', + q{CREATE TABLE t AS SELECT a FROM generate_series(1,10000) AS a;}); + +my $sigchld_bb_timeout = IPC::Run::timer(60); +my ($sigchld_bb_stdin, $sigchld_bb_stdout, $sigchld_bb_stderr) = ('', '', ''); +my $sigchld_bb = IPC::Run::start( + [ + @pg_basebackup_defs, '--wal-method=stream', '-D', "$tempdir/sigchld", + '--max-rate=32', '-d', $node->connstr('postgres') + ], + '<', + \$sigchld_bb_stdin, + '>', + \$sigchld_bb_stdout, + '2>', + \$sigchld_bb_stderr, + $sigchld_bb_timeout); + +is($node->poll_query_until('postgres', + "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE " . + "application_name = '010_pg_basebackup.pl' AND wait_event = 'WalSenderMain' " . + "AND backend_type = 'walsender' AND query ~ 'START_REPLICATION'"), + "1", + "Walsender killed"); + +ok(pump_until($sigchld_bb, $sigchld_bb_timeout, \$sigchld_bb_stderr, + qr/background process terminated unexpectedly/), + 'background process exit message'); +$sigchld_bb->finish(); + done_testing(); From bd74c4037c4ee268db46e983bcc0f1e0a9f7ab72 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 23 Feb 2022 11:10:46 -0500 Subject: [PATCH 043/772] Re-allow underscore as first character of custom GUC names. Commit 3db826bd5 intended that valid_custom_variable_name's rules for valid identifiers match those of scan.l. However, I (tgl) had some kind of brain fade and put "_" in the wrong list. Fix by Japin Li, per bug #17415 from Daniel Polski. Discussion: https://postgr.es/m/17415-ebdb683d7e09a51c@postgresql.org --- src/backend/utils/misc/guc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index e4afd07bfe..bf7ec0d466 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -5474,13 +5474,13 @@ valid_custom_variable_name(const char *name) name_start = true; } else if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz", *p) != NULL || + "abcdefghijklmnopqrstuvwxyz_", *p) != NULL || IS_HIGHBIT_SET(*p)) { /* okay as first or non-first character */ name_start = false; } - else if (!name_start && strchr("0123456789_$", *p) != NULL) + else if (!name_start && strchr("0123456789$", *p) != NULL) /* okay as non-first character */ ; else return false; From cfb4e209ec15d4a0c44efa98b2788be806a43a92 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Thu, 24 Feb 2022 08:54:39 +0530 Subject: [PATCH 044/772] Fix one of the tests introduced in commit 52e4f0cd47. In the Publisher-Subscriber setup, after performing a DML operation on the publisher, we need to wait for it to be replayed on the subscriber before querying the same data on the subscriber. One of the tests missed the wait step. As per buildfarm. Author: Peter Smith Discussion: https://postgr.es/m/CAHut+Pv=e9Qd1TSYo8Og6x6Abfz3b9_htwinLp4ENPgV45DACQ@mail.gmail.com --- src/test/subscription/t/028_row_filter.pl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/subscription/t/028_row_filter.pl b/src/test/subscription/t/028_row_filter.pl index 88dc865829..89bb364e9d 100644 --- a/src/test/subscription/t/028_row_filter.pl +++ b/src/test/subscription/t/028_row_filter.pl @@ -677,6 +677,8 @@ $node_publisher->safe_psql('postgres', "UPDATE tab_rowfilter_toast SET b = '1'"); +$node_publisher->wait_for_catchup($appname); + # Check expected replicated rows for tab_rowfilter_toast # tab_rowfilter_toast filter: (a = repeat('1234567890', 200) AND b < '10') # UPDATE old (repeat('1234567890', 200) ,'1234567890') NO From 04e706d4238f98a98e1c0b1a02db9d4280b96f04 Mon Sep 17 00:00:00 2001 From: Etsuro Fujita Date: Thu, 24 Feb 2022 14:30:00 +0900 Subject: [PATCH 045/772] postgres_fdw: Add support for parallel commit. postgres_fdw commits remote (sub)transactions opened on remote server(s) in a local (sub)transaction one by one when the local (sub)transaction commits. This patch allows it to commit the remote (sub)transactions in parallel to improve performance. This is enabled by the server option "parallel_commit". The default is false. Etsuro Fujita, reviewed by Fujii Masao and David Zhang. Discussion: http://postgr.es/m/CAPmGK17dAZCXvwnfpr1eTfknTGdt%3DhYTV9405Gt5SqPOX8K84w%40mail.gmail.com --- contrib/postgres_fdw/connection.c | 223 ++++++++++++++++-- .../postgres_fdw/expected/postgres_fdw.out | 78 +++++- contrib/postgres_fdw/option.c | 2 + contrib/postgres_fdw/sql/postgres_fdw.sql | 46 ++++ doc/src/sgml/postgres-fdw.sgml | 46 ++++ 5 files changed, 376 insertions(+), 19 deletions(-) diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c index f753c6e232..8c64d42dda 100644 --- a/contrib/postgres_fdw/connection.c +++ b/contrib/postgres_fdw/connection.c @@ -58,6 +58,7 @@ typedef struct ConnCacheEntry bool have_prep_stmt; /* have we prepared any stmts in this xact? */ bool have_error; /* have any subxacts aborted in this xact? */ bool changing_xact_state; /* xact state change in process */ + bool parallel_commit; /* do we commit (sub)xacts in parallel? */ bool invalidated; /* true if reconnect is pending */ bool keep_connections; /* setting value of keep_connections * server option */ @@ -92,6 +93,9 @@ static PGconn *connect_pg_server(ForeignServer *server, UserMapping *user); static void disconnect_pg_server(ConnCacheEntry *entry); static void check_conn_params(const char **keywords, const char **values, UserMapping *user); static void configure_remote_session(PGconn *conn); +static void do_sql_command_begin(PGconn *conn, const char *sql); +static void do_sql_command_end(PGconn *conn, const char *sql, + bool consume_input); static void begin_remote_xact(ConnCacheEntry *entry); static void pgfdw_xact_callback(XactEvent event, void *arg); static void pgfdw_subxact_callback(SubXactEvent event, @@ -100,6 +104,7 @@ static void pgfdw_subxact_callback(SubXactEvent event, void *arg); static void pgfdw_inval_callback(Datum arg, int cacheid, uint32 hashvalue); static void pgfdw_reject_incomplete_xact_state_change(ConnCacheEntry *entry); +static void pgfdw_reset_xact_state(ConnCacheEntry *entry, bool toplevel); static bool pgfdw_cancel_query(PGconn *conn); static bool pgfdw_exec_cleanup_query(PGconn *conn, const char *query, bool ignore_errors); @@ -107,6 +112,9 @@ static bool pgfdw_get_cleanup_result(PGconn *conn, TimestampTz endtime, PGresult **result, bool *timed_out); static void pgfdw_abort_cleanup(ConnCacheEntry *entry, const char *sql, bool toplevel); +static void pgfdw_finish_pre_commit_cleanup(List *pending_entries); +static void pgfdw_finish_pre_subcommit_cleanup(List *pending_entries, + int curlevel); static bool UserMappingPasswordRequired(UserMapping *user); static bool disconnect_cached_connections(Oid serverid); @@ -316,14 +324,20 @@ make_new_connection(ConnCacheEntry *entry, UserMapping *user) * is changed will be closed and re-made later. * * By default, all the connections to any foreign servers are kept open. + * + * Also determine whether to commit (sub)transactions opened on the remote + * server in parallel at (sub)transaction end. */ entry->keep_connections = true; + entry->parallel_commit = false; foreach(lc, server->options) { DefElem *def = (DefElem *) lfirst(lc); if (strcmp(def->defname, "keep_connections") == 0) entry->keep_connections = defGetBoolean(def); + else if (strcmp(def->defname, "parallel_commit") == 0) + entry->parallel_commit = defGetBoolean(def); } /* Now try to make the connection */ @@ -623,10 +637,30 @@ configure_remote_session(PGconn *conn) void do_sql_command(PGconn *conn, const char *sql) { - PGresult *res; + do_sql_command_begin(conn, sql); + do_sql_command_end(conn, sql, false); +} +static void +do_sql_command_begin(PGconn *conn, const char *sql) +{ if (!PQsendQuery(conn, sql)) pgfdw_report_error(ERROR, NULL, conn, false, sql); +} + +static void +do_sql_command_end(PGconn *conn, const char *sql, bool consume_input) +{ + PGresult *res; + + /* + * If requested, consume whatever data is available from the socket. + * (Note that if all data is available, this allows pgfdw_get_result to + * call PQgetResult without forcing the overhead of WaitLatchOrSocket, + * which would be large compared to the overhead of PQconsumeInput.) + */ + if (consume_input && !PQconsumeInput(conn)) + pgfdw_report_error(ERROR, NULL, conn, false, sql); res = pgfdw_get_result(conn, sql); if (PQresultStatus(res) != PGRES_COMMAND_OK) pgfdw_report_error(ERROR, res, conn, true, sql); @@ -888,6 +922,7 @@ pgfdw_xact_callback(XactEvent event, void *arg) { HASH_SEQ_STATUS scan; ConnCacheEntry *entry; + List *pending_entries = NIL; /* Quick exit if no connections were touched in this transaction. */ if (!xact_got_connection) @@ -925,6 +960,12 @@ pgfdw_xact_callback(XactEvent event, void *arg) /* Commit all remote transactions during pre-commit */ entry->changing_xact_state = true; + if (entry->parallel_commit) + { + do_sql_command_begin(entry->conn, "COMMIT TRANSACTION"); + pending_entries = lappend(pending_entries, entry); + continue; + } do_sql_command(entry->conn, "COMMIT TRANSACTION"); entry->changing_xact_state = false; @@ -981,23 +1022,15 @@ pgfdw_xact_callback(XactEvent event, void *arg) } /* Reset state to show we're out of a transaction */ - entry->xact_depth = 0; + pgfdw_reset_xact_state(entry, true); + } - /* - * If the connection isn't in a good idle state, it is marked as - * invalid or keep_connections option of its server is disabled, then - * discard it to recover. Next GetConnection will open a new - * connection. - */ - if (PQstatus(entry->conn) != CONNECTION_OK || - PQtransactionStatus(entry->conn) != PQTRANS_IDLE || - entry->changing_xact_state || - entry->invalidated || - !entry->keep_connections) - { - elog(DEBUG3, "discarding connection %p", entry->conn); - disconnect_pg_server(entry); - } + /* If there are any pending connections, finish cleaning them up */ + if (pending_entries) + { + Assert(event == XACT_EVENT_PARALLEL_PRE_COMMIT || + event == XACT_EVENT_PRE_COMMIT); + pgfdw_finish_pre_commit_cleanup(pending_entries); } /* @@ -1021,6 +1054,7 @@ pgfdw_subxact_callback(SubXactEvent event, SubTransactionId mySubid, HASH_SEQ_STATUS scan; ConnCacheEntry *entry; int curlevel; + List *pending_entries = NIL; /* Nothing to do at subxact start, nor after commit. */ if (!(event == SUBXACT_EVENT_PRE_COMMIT_SUB || @@ -1063,6 +1097,12 @@ pgfdw_subxact_callback(SubXactEvent event, SubTransactionId mySubid, /* Commit all remote subtransactions during pre-commit */ snprintf(sql, sizeof(sql), "RELEASE SAVEPOINT s%d", curlevel); entry->changing_xact_state = true; + if (entry->parallel_commit) + { + do_sql_command_begin(entry->conn, sql); + pending_entries = lappend(pending_entries, entry); + continue; + } do_sql_command(entry->conn, sql); entry->changing_xact_state = false; } @@ -1076,7 +1116,14 @@ pgfdw_subxact_callback(SubXactEvent event, SubTransactionId mySubid, } /* OK, we're outta that level of subtransaction */ - entry->xact_depth--; + pgfdw_reset_xact_state(entry, false); + } + + /* If there are any pending connections, finish cleaning them up */ + if (pending_entries) + { + Assert(event == SUBXACT_EVENT_PRE_COMMIT_SUB); + pgfdw_finish_pre_subcommit_cleanup(pending_entries, curlevel); } } @@ -1169,6 +1216,40 @@ pgfdw_reject_incomplete_xact_state_change(ConnCacheEntry *entry) server->servername))); } +/* + * Reset state to show we're out of a (sub)transaction. + */ +static void +pgfdw_reset_xact_state(ConnCacheEntry *entry, bool toplevel) +{ + if (toplevel) + { + /* Reset state to show we're out of a transaction */ + entry->xact_depth = 0; + + /* + * If the connection isn't in a good idle state, it is marked as + * invalid or keep_connections option of its server is disabled, then + * discard it to recover. Next GetConnection will open a new + * connection. + */ + if (PQstatus(entry->conn) != CONNECTION_OK || + PQtransactionStatus(entry->conn) != PQTRANS_IDLE || + entry->changing_xact_state || + entry->invalidated || + !entry->keep_connections) + { + elog(DEBUG3, "discarding connection %p", entry->conn); + disconnect_pg_server(entry); + } + } + else + { + /* Reset state to show we're out of a subtransaction */ + entry->xact_depth--; + } +} + /* * Cancel the currently-in-progress query (whose query text we do not have) * and ignore the result. Returns true if we successfully cancel the query @@ -1456,6 +1537,112 @@ pgfdw_abort_cleanup(ConnCacheEntry *entry, const char *sql, bool toplevel) entry->changing_xact_state = false; } +/* + * Finish pre-commit cleanup of connections on each of which we've sent a + * COMMIT command to the remote server. + */ +static void +pgfdw_finish_pre_commit_cleanup(List *pending_entries) +{ + ConnCacheEntry *entry; + List *pending_deallocs = NIL; + ListCell *lc; + + Assert(pending_entries); + + /* + * Get the result of the COMMIT command for each of the pending entries + */ + foreach(lc, pending_entries) + { + entry = (ConnCacheEntry *) lfirst(lc); + + Assert(entry->changing_xact_state); + /* + * We might already have received the result on the socket, so pass + * consume_input=true to try to consume it first + */ + do_sql_command_end(entry->conn, "COMMIT TRANSACTION", true); + entry->changing_xact_state = false; + + /* Do a DEALLOCATE ALL in parallel if needed */ + if (entry->have_prep_stmt && entry->have_error) + { + /* Ignore errors (see notes in pgfdw_xact_callback) */ + if (PQsendQuery(entry->conn, "DEALLOCATE ALL")) + { + pending_deallocs = lappend(pending_deallocs, entry); + continue; + } + } + entry->have_prep_stmt = false; + entry->have_error = false; + + pgfdw_reset_xact_state(entry, true); + } + + /* No further work if no pending entries */ + if (!pending_deallocs) + return; + + /* + * Get the result of the DEALLOCATE command for each of the pending + * entries + */ + foreach(lc, pending_deallocs) + { + PGresult *res; + + entry = (ConnCacheEntry *) lfirst(lc); + + /* Ignore errors (see notes in pgfdw_xact_callback) */ + while ((res = PQgetResult(entry->conn)) != NULL) + { + PQclear(res); + /* Stop if the connection is lost (else we'll loop infinitely) */ + if (PQstatus(entry->conn) == CONNECTION_BAD) + break; + } + entry->have_prep_stmt = false; + entry->have_error = false; + + pgfdw_reset_xact_state(entry, true); + } +} + +/* + * Finish pre-subcommit cleanup of connections on each of which we've sent a + * RELEASE command to the remote server. + */ +static void +pgfdw_finish_pre_subcommit_cleanup(List *pending_entries, int curlevel) +{ + ConnCacheEntry *entry; + char sql[100]; + ListCell *lc; + + Assert(pending_entries); + + /* + * Get the result of the RELEASE command for each of the pending entries + */ + snprintf(sql, sizeof(sql), "RELEASE SAVEPOINT s%d", curlevel); + foreach(lc, pending_entries) + { + entry = (ConnCacheEntry *) lfirst(lc); + + Assert(entry->changing_xact_state); + /* + * We might already have received the result on the socket, so pass + * consume_input=true to try to consume it first + */ + do_sql_command_end(entry->conn, sql, true); + entry->changing_xact_state = false; + + pgfdw_reset_xact_state(entry, false); + } +} + /* * List active foreign server connections. * diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index 057342083c..f210f91188 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -9509,7 +9509,7 @@ DO $d$ END; $d$; ERROR: invalid option "password" -HINT: Valid options in this context are: service, passfile, channel_binding, connect_timeout, dbname, host, hostaddr, port, options, application_name, keepalives, keepalives_idle, keepalives_interval, keepalives_count, tcp_user_timeout, sslmode, sslcompression, sslcert, sslkey, sslrootcert, sslcrl, sslcrldir, sslsni, requirepeer, ssl_min_protocol_version, ssl_max_protocol_version, gssencmode, krbsrvname, gsslib, target_session_attrs, use_remote_estimate, fdw_startup_cost, fdw_tuple_cost, extensions, updatable, truncatable, fetch_size, batch_size, async_capable, keep_connections +HINT: Valid options in this context are: service, passfile, channel_binding, connect_timeout, dbname, host, hostaddr, port, options, application_name, keepalives, keepalives_idle, keepalives_interval, keepalives_count, tcp_user_timeout, sslmode, sslcompression, sslcert, sslkey, sslrootcert, sslcrl, sslcrldir, sslsni, requirepeer, ssl_min_protocol_version, ssl_max_protocol_version, gssencmode, krbsrvname, gsslib, target_session_attrs, use_remote_estimate, fdw_startup_cost, fdw_tuple_cost, extensions, updatable, truncatable, fetch_size, batch_size, async_capable, parallel_commit, keep_connections CONTEXT: SQL statement "ALTER SERVER loopback_nopw OPTIONS (ADD password 'dummypw')" PL/pgSQL function inline_code_block line 3 at EXECUTE -- If we add a password for our user mapping instead, we should get a different @@ -10933,3 +10933,79 @@ SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity --Clean up RESET postgres_fdw.application_name; RESET debug_discard_caches; +-- =================================================================== +-- test parallel commit +-- =================================================================== +ALTER SERVER loopback OPTIONS (ADD parallel_commit 'true'); +ALTER SERVER loopback2 OPTIONS (ADD parallel_commit 'true'); +CREATE TABLE ploc1 (f1 int, f2 text); +CREATE FOREIGN TABLE prem1 (f1 int, f2 text) + SERVER loopback OPTIONS (table_name 'ploc1'); +CREATE TABLE ploc2 (f1 int, f2 text); +CREATE FOREIGN TABLE prem2 (f1 int, f2 text) + SERVER loopback2 OPTIONS (table_name 'ploc2'); +BEGIN; +INSERT INTO prem1 VALUES (101, 'foo'); +INSERT INTO prem2 VALUES (201, 'bar'); +COMMIT; +SELECT * FROM prem1; + f1 | f2 +-----+----- + 101 | foo +(1 row) + +SELECT * FROM prem2; + f1 | f2 +-----+----- + 201 | bar +(1 row) + +BEGIN; +SAVEPOINT s; +INSERT INTO prem1 VALUES (102, 'foofoo'); +INSERT INTO prem2 VALUES (202, 'barbar'); +RELEASE SAVEPOINT s; +COMMIT; +SELECT * FROM prem1; + f1 | f2 +-----+-------- + 101 | foo + 102 | foofoo +(2 rows) + +SELECT * FROM prem2; + f1 | f2 +-----+-------- + 201 | bar + 202 | barbar +(2 rows) + +-- This tests executing DEALLOCATE ALL against foreign servers in parallel +-- during pre-commit +BEGIN; +SAVEPOINT s; +INSERT INTO prem1 VALUES (103, 'baz'); +INSERT INTO prem2 VALUES (203, 'qux'); +ROLLBACK TO SAVEPOINT s; +RELEASE SAVEPOINT s; +INSERT INTO prem1 VALUES (104, 'bazbaz'); +INSERT INTO prem2 VALUES (204, 'quxqux'); +COMMIT; +SELECT * FROM prem1; + f1 | f2 +-----+-------- + 101 | foo + 102 | foofoo + 104 | bazbaz +(3 rows) + +SELECT * FROM prem2; + f1 | f2 +-----+-------- + 201 | bar + 202 | barbar + 204 | quxqux +(3 rows) + +ALTER SERVER loopback OPTIONS (DROP parallel_commit); +ALTER SERVER loopback2 OPTIONS (DROP parallel_commit); diff --git a/contrib/postgres_fdw/option.c b/contrib/postgres_fdw/option.c index 2c6b2894b9..572591a558 100644 --- a/contrib/postgres_fdw/option.c +++ b/contrib/postgres_fdw/option.c @@ -121,6 +121,7 @@ postgres_fdw_validator(PG_FUNCTION_ARGS) strcmp(def->defname, "updatable") == 0 || strcmp(def->defname, "truncatable") == 0 || strcmp(def->defname, "async_capable") == 0 || + strcmp(def->defname, "parallel_commit") == 0 || strcmp(def->defname, "keep_connections") == 0) { /* these accept only boolean values */ @@ -249,6 +250,7 @@ InitPgFdwOptions(void) /* async_capable is available on both server and table */ {"async_capable", ForeignServerRelationId, false}, {"async_capable", ForeignTableRelationId, false}, + {"parallel_commit", ForeignServerRelationId, false}, {"keep_connections", ForeignServerRelationId, false}, {"password_required", UserMappingRelationId, false}, diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index 6c9f579c41..95b6b7192e 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -3515,3 +3515,49 @@ SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity --Clean up RESET postgres_fdw.application_name; RESET debug_discard_caches; + +-- =================================================================== +-- test parallel commit +-- =================================================================== +ALTER SERVER loopback OPTIONS (ADD parallel_commit 'true'); +ALTER SERVER loopback2 OPTIONS (ADD parallel_commit 'true'); + +CREATE TABLE ploc1 (f1 int, f2 text); +CREATE FOREIGN TABLE prem1 (f1 int, f2 text) + SERVER loopback OPTIONS (table_name 'ploc1'); +CREATE TABLE ploc2 (f1 int, f2 text); +CREATE FOREIGN TABLE prem2 (f1 int, f2 text) + SERVER loopback2 OPTIONS (table_name 'ploc2'); + +BEGIN; +INSERT INTO prem1 VALUES (101, 'foo'); +INSERT INTO prem2 VALUES (201, 'bar'); +COMMIT; +SELECT * FROM prem1; +SELECT * FROM prem2; + +BEGIN; +SAVEPOINT s; +INSERT INTO prem1 VALUES (102, 'foofoo'); +INSERT INTO prem2 VALUES (202, 'barbar'); +RELEASE SAVEPOINT s; +COMMIT; +SELECT * FROM prem1; +SELECT * FROM prem2; + +-- This tests executing DEALLOCATE ALL against foreign servers in parallel +-- during pre-commit +BEGIN; +SAVEPOINT s; +INSERT INTO prem1 VALUES (103, 'baz'); +INSERT INTO prem2 VALUES (203, 'qux'); +ROLLBACK TO SAVEPOINT s; +RELEASE SAVEPOINT s; +INSERT INTO prem1 VALUES (104, 'bazbaz'); +INSERT INTO prem2 VALUES (204, 'quxqux'); +COMMIT; +SELECT * FROM prem1; +SELECT * FROM prem2; + +ALTER SERVER loopback OPTIONS (DROP parallel_commit); +ALTER SERVER loopback2 OPTIONS (DROP parallel_commit); diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml index dc57fe4b0d..8ebf0dc3a0 100644 --- a/doc/src/sgml/postgres-fdw.sgml +++ b/doc/src/sgml/postgres-fdw.sgml @@ -456,6 +456,52 @@ OPTIONS (ADD password_required 'false'); + + Transaction Management Options + + + When multiple remote (sub)transactions are involved in a local + (sub)transaction, by default postgres_fdw commits + those remote (sub)transactions one by one when the local (sub)transaction + commits. + Performance can be improved with the following option: + + + + + + parallel_commit (boolean) + + + This option controls whether postgres_fdw commits + remote (sub)transactions opened on a foreign server in a local + (sub)transaction in parallel when the local (sub)transaction commits. + This option can only be specified for foreign servers, not per-table. + The default is false. + + + + If multiple foreign servers with this option enabled are involved in + a local (sub)transaction, multiple remote (sub)transactions opened on + those foreign servers in the local (sub)transaction are committed in + parallel across those foreign servers when the local (sub)transaction + commits. + + + + For a foreign server with this option enabled, if many remote + (sub)transactions are opened on the foreign server in a local + (sub)transaction, this option might increase the remote server’s load + when the local (sub)transaction commits, so be careful when using this + option. + + + + + + + + Updatability Options From fcc28178c6943d7df72b484a87fdb7e06d0c1079 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 24 Feb 2022 16:11:34 +0900 Subject: [PATCH 046/772] Clean up and simplify code in a couple of set-returning functions The following set-returning functions have their logic simplified, to be more consistent with other in-core areas: - pg_prepared_statement()'s tuple descriptor is now created with get_call_result_type() instead of being created from scratch, saving from some duplication with pg_proc.dat. - show_all_file_settings(), similarly, now uses get_call_result_type() to build its tuple descriptor instead of creating it from scratch. - pg_options_to_table() made use of a static routine called only once. This commit removes this internal routine to make the function easier to follow. - pg_config() was using a unique logic style, doing checks on the tuple descriptor passed down in expectedDesc, but it has no need to do so. This switches the function to use a tuplestore with a tuple descriptor retrieved from get_call_result_type(), instead. This simplifies an upcoming patch aimed at refactoring the way tuplestores are created and checked in set-returning functions, this change making sense as its own independent cleanup by shaving some code. Author: Melanie Plageman, Michael Paquier Reviewed-by: Justin Pryzby Discussion: https://postgr.es/m/CAAKRu_azyd1Z3W_r7Ou4sorTjRCs+PxeHw1CWJeXKofkE6TuZg@mail.gmail.com --- src/backend/commands/prepare.c | 31 ++++---------- src/backend/foreign/foreign.c | 37 +++++++---------- src/backend/utils/misc/guc.c | 20 ++------- src/backend/utils/misc/pg_config.c | 65 ++++++++---------------------- src/backend/utils/mmgr/portalmem.c | 23 +++-------- 5 files changed, 48 insertions(+), 128 deletions(-) diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index e0c985ef8b..dce30aed6c 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -22,6 +22,7 @@ #include "catalog/pg_type.h" #include "commands/createas.h" #include "commands/prepare.h" +#include "funcapi.h" #include "miscadmin.h" #include "nodes/nodeFuncs.h" #include "parser/analyze.h" @@ -716,30 +717,13 @@ pg_prepared_statement(PG_FUNCTION_ARGS) (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("materialize mode required, but it is not allowed in this context"))); + if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) + elog(ERROR, "return type must be a row type"); + /* need to build tuplestore in query context */ per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; oldcontext = MemoryContextSwitchTo(per_query_ctx); - /* - * build tupdesc for result tuples. This must match the definition of the - * pg_prepared_statements view in system_views.sql - */ - tupdesc = CreateTemplateTupleDesc(7); - TupleDescInitEntry(tupdesc, (AttrNumber) 1, "name", - TEXTOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 2, "statement", - TEXTOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 3, "prepare_time", - TIMESTAMPTZOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 4, "parameter_types", - REGTYPEARRAYOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 5, "from_sql", - BOOLOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 6, "generic_plans", - INT8OID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 7, "custom_plans", - INT8OID, -1, 0); - /* * We put all the tuples into a tuplestore in one scan of the hashtable. * This avoids any issue of the hashtable possibly changing between calls. @@ -747,6 +731,9 @@ pg_prepared_statement(PG_FUNCTION_ARGS) tupstore = tuplestore_begin_heap(rsinfo->allowedModes & SFRM_Materialize_Random, false, work_mem); + rsinfo->returnMode = SFRM_Materialize; + rsinfo->setResult = tupstore; + rsinfo->setDesc = tupdesc; /* generate junk in short-term context */ MemoryContextSwitchTo(oldcontext); @@ -778,10 +765,6 @@ pg_prepared_statement(PG_FUNCTION_ARGS) } } - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - return (Datum) 0; } diff --git a/src/backend/foreign/foreign.c b/src/backend/foreign/foreign.c index d910bc2fbe..c3406c3b9d 100644 --- a/src/backend/foreign/foreign.c +++ b/src/backend/foreign/foreign.c @@ -499,17 +499,19 @@ IsImportableForeignTable(const char *tablename, /* - * deflist_to_tuplestore - Helper function to convert DefElem list to - * tuplestore usable in SRF. + * pg_options_to_table - Convert options array to name/value table + * + * This is useful to provide details for information_schema and pg_dump. */ -static void -deflist_to_tuplestore(ReturnSetInfo *rsinfo, List *options) +Datum +pg_options_to_table(PG_FUNCTION_ARGS) { + Datum array = PG_GETARG_DATUM(0); ListCell *cell; + List *options; + ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; TupleDesc tupdesc; Tuplestorestate *tupstore; - Datum values[2]; - bool nulls[2]; MemoryContext per_query_ctx; MemoryContext oldcontext; @@ -524,6 +526,9 @@ deflist_to_tuplestore(ReturnSetInfo *rsinfo, List *options) (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("materialize mode required, but it is not allowed in this context"))); + options = untransformRelOptions(array); + rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; + per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; oldcontext = MemoryContextSwitchTo(per_query_ctx); @@ -536,9 +541,13 @@ deflist_to_tuplestore(ReturnSetInfo *rsinfo, List *options) rsinfo->setResult = tupstore; rsinfo->setDesc = tupdesc; + MemoryContextSwitchTo(oldcontext); + foreach(cell, options) { DefElem *def = lfirst(cell); + Datum values[2]; + bool nulls[2]; values[0] = CStringGetTextDatum(def->defname); nulls[0] = false; @@ -555,22 +564,6 @@ deflist_to_tuplestore(ReturnSetInfo *rsinfo, List *options) tuplestore_putvalues(tupstore, tupdesc, values, nulls); } - MemoryContextSwitchTo(oldcontext); -} - - -/* - * Convert options array to name/value table. Useful for information - * schema and pg_dump. - */ -Datum -pg_options_to_table(PG_FUNCTION_ARGS) -{ - Datum array = PG_GETARG_DATUM(0); - - deflist_to_tuplestore((ReturnSetInfo *) fcinfo->resultinfo, - untransformRelOptions(array)); - return (Datum) 0; } diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index bf7ec0d466..1e3650184b 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10174,6 +10174,9 @@ show_all_file_settings(PG_FUNCTION_ARGS) (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("materialize mode required, but it is not allowed in this context"))); + if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) + elog(ERROR, "return type must be a row type"); + /* Scan the config files using current context as workspace */ conf = ProcessConfigFileInternal(PGC_SIGHUP, false, DEBUG3); @@ -10181,23 +10184,6 @@ show_all_file_settings(PG_FUNCTION_ARGS) per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; oldcontext = MemoryContextSwitchTo(per_query_ctx); - /* Build a tuple descriptor for our result type */ - tupdesc = CreateTemplateTupleDesc(NUM_PG_FILE_SETTINGS_ATTS); - TupleDescInitEntry(tupdesc, (AttrNumber) 1, "sourcefile", - TEXTOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 2, "sourceline", - INT4OID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 3, "seqno", - INT4OID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 4, "name", - TEXTOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 5, "setting", - TEXTOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 6, "applied", - BOOLOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 7, "error", - TEXTOID, -1, 0); - /* Build a tuplestore to return our results in */ tupstore = tuplestore_begin_heap(true, false, work_mem); rsinfo->returnMode = SFRM_Materialize; diff --git a/src/backend/utils/misc/pg_config.c b/src/backend/utils/misc/pg_config.c index 2dc875ebfb..e646a41910 100644 --- a/src/backend/utils/misc/pg_config.c +++ b/src/backend/utils/misc/pg_config.c @@ -26,14 +26,10 @@ pg_config(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; Tuplestorestate *tupstore; - HeapTuple tuple; TupleDesc tupdesc; - AttInMetadata *attinmeta; - MemoryContext per_query_ctx; MemoryContext oldcontext; ConfigData *configdata; size_t configdata_len; - char *values[2]; int i = 0; /* check to see if caller supports us returning a tuplestore */ @@ -41,65 +37,38 @@ pg_config(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize) || - rsinfo->expectedDesc == NULL) + if (!(rsinfo->allowedModes & SFRM_Materialize)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("materialize mode required, but it is not allowed in this context"))); - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); + if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) + elog(ERROR, "return type must be a row type"); - /* get the requested return tuple description */ - tupdesc = CreateTupleDescCopy(rsinfo->expectedDesc); + /* Build tuplestore to hold the result rows */ + oldcontext = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory); - /* - * Check to make sure we have a reasonable tuple descriptor - */ - if (tupdesc->natts != 2 || - TupleDescAttr(tupdesc, 0)->atttypid != TEXTOID || - TupleDescAttr(tupdesc, 1)->atttypid != TEXTOID) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("query-specified return tuple and " - "function return type are not compatible"))); - - /* OK to use it */ - attinmeta = TupleDescGetAttInMetadata(tupdesc); - - /* let the caller know we're sending back a tuplestore */ + tupstore = tuplestore_begin_heap(true, false, work_mem); rsinfo->returnMode = SFRM_Materialize; + rsinfo->setResult = tupstore; + rsinfo->setDesc = tupdesc; - /* initialize our tuplestore */ - tupstore = tuplestore_begin_heap(true, false, work_mem); + MemoryContextSwitchTo(oldcontext); configdata = get_configdata(my_exec_path, &configdata_len); for (i = 0; i < configdata_len; i++) { - values[0] = configdata[i].name; - values[1] = configdata[i].setting; - - tuple = BuildTupleFromCStrings(attinmeta, values); - tuplestore_puttuple(tupstore, tuple); - } + Datum values[2]; + bool nulls[2]; - /* - * no longer need the tuple descriptor reference created by - * TupleDescGetAttInMetadata() - */ - ReleaseTupleDesc(tupdesc); + memset(values, 0, sizeof(values)); + memset(nulls, 0, sizeof(nulls)); - rsinfo->setResult = tupstore; + values[0] = CStringGetTextDatum(configdata[i].name); + values[1] = CStringGetTextDatum(configdata[i].setting); - /* - * SFRM_Materialize mode expects us to return a NULL Datum. The actual - * tuples are in our tuplestore and passed back through rsinfo->setResult. - * rsinfo->setDesc is set to the tuple description that we actually used - * to build our tuples with, so the caller can verify we did what it was - * expecting. - */ - rsinfo->setDesc = tupdesc; - MemoryContextSwitchTo(oldcontext); + tuplestore_putvalues(tupstore, tupdesc, values, nulls); + } return (Datum) 0; } diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c index 7885344164..21ad87c024 100644 --- a/src/backend/utils/mmgr/portalmem.c +++ b/src/backend/utils/mmgr/portalmem.c @@ -21,6 +21,7 @@ #include "access/xact.h" #include "catalog/pg_type.h" #include "commands/portalcmds.h" +#include "funcapi.h" #include "miscadmin.h" #include "storage/ipc.h" #include "utils/builtins.h" @@ -1152,23 +1153,8 @@ pg_cursor(PG_FUNCTION_ARGS) per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; oldcontext = MemoryContextSwitchTo(per_query_ctx); - /* - * build tupdesc for result tuples. This must match the definition of the - * pg_cursors view in system_views.sql - */ - tupdesc = CreateTemplateTupleDesc(6); - TupleDescInitEntry(tupdesc, (AttrNumber) 1, "name", - TEXTOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 2, "statement", - TEXTOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 3, "is_holdable", - BOOLOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 4, "is_binary", - BOOLOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 5, "is_scrollable", - BOOLOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 6, "creation_time", - TIMESTAMPTZOID, -1, 0); + if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) + elog(ERROR, "return type must be a row type"); /* * We put all the tuples into a tuplestore in one scan of the hashtable. @@ -1177,6 +1163,9 @@ pg_cursor(PG_FUNCTION_ARGS) tupstore = tuplestore_begin_heap(rsinfo->allowedModes & SFRM_Materialize_Random, false, work_mem); + rsinfo->returnMode = SFRM_Materialize; + rsinfo->setResult = tupstore; + rsinfo->setDesc = tupdesc; /* generate junk in short-term context */ MemoryContextSwitchTo(oldcontext); From e77216fcb021bb19d83b348db084adfe8d918118 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 24 Feb 2022 16:54:59 +0900 Subject: [PATCH 047/772] Simplify more checks related to set-returning functions This makes more consistent the SRF-related checks in the area of PL/pgSQL, PL/Perl, PL/Tcl, pageinspect and some of the JSON worker functions, making it easier to grep for the same error patterns through the code, reducing a bit the translation work. It is worth noting that each_worker_jsonb()/each_worker() in jsonfuncs.c and pageinspect's brin_page_items() were doing a check on expectedDesc that is not required as they fetch their tuple descriptor directly from get_call_result_type(). This looks like a set of copy-paste errors that have spread over the years. This commit is a continuation of the changes begun in 07daca5, for any remaining code paths on sight. Like fcc2817, this makes the code more consistent, easing the integration of a larger patch that will refactor the way tuplestores are created and checked in a good portion of the set-returning functions present in core. I have worked my way through the changes of this patch by myself, and Ranier has proposed the same changes in a different thread in parallel, though there were some inconsistencies related in expectedDesc in what was proposed by him. Author: Michael Paquier, Ranier Vilela Discussion: https://postgr.es/m/CAAKRu_azyd1Z3W_r7Ou4sorTjRCs+PxeHw1CWJeXKofkE6TuZg@mail.gmail.com Discussion: https://postgr.es/m/CAEudQApm=AFuJjEHLBjBcJbxcw4pBMwg2sHwXyCXYcbBOj3hpg@mail.gmail.com --- contrib/pageinspect/brinfuncs.c | 3 +- src/backend/utils/adt/jsonfuncs.c | 61 ++++++++++++++++++------------- src/pl/plperl/plperl.c | 11 ++++-- src/pl/plpgsql/src/pl_exec.c | 19 +++++++--- src/pl/tcl/pltcl.c | 8 +++- 5 files changed, 63 insertions(+), 39 deletions(-) diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c index 50892b5cc2..683749a150 100644 --- a/contrib/pageinspect/brinfuncs.c +++ b/contrib/pageinspect/brinfuncs.c @@ -148,8 +148,7 @@ brin_page_items(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize) || - rsinfo->expectedDesc == NULL) + if (!(rsinfo->allowedModes & SFRM_Materialize)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("materialize mode required, but it is not allowed in this context"))); diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index 0273f883d4..2457061f97 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -1927,21 +1927,19 @@ each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text) rsi = (ReturnSetInfo *) fcinfo->resultinfo; - if (!rsi || !IsA(rsi, ReturnSetInfo) || - (rsi->allowedModes & SFRM_Materialize) == 0 || - rsi->expectedDesc == NULL) + if (!rsi || !IsA(rsi, ReturnSetInfo)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("set-valued function called in context that cannot accept a set"))); + if (!(rsi->allowedModes & SFRM_Materialize)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that " - "cannot accept a set"))); + errmsg("materialize mode required, but it is not allowed in this context"))); rsi->returnMode = SFRM_Materialize; if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("function returning record called in context " - "that cannot accept type record"))); + elog(ERROR, "return type must be a row type"); old_cxt = MemoryContextSwitchTo(rsi->econtext->ecxt_per_query_memory); @@ -2039,13 +2037,15 @@ each_worker(FunctionCallInfo fcinfo, bool as_text) rsi = (ReturnSetInfo *) fcinfo->resultinfo; - if (!rsi || !IsA(rsi, ReturnSetInfo) || - (rsi->allowedModes & SFRM_Materialize) == 0 || - rsi->expectedDesc == NULL) + if (!rsi || !IsA(rsi, ReturnSetInfo)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("set-valued function called in context that cannot accept a set"))); + + if (!(rsi->allowedModes & SFRM_Materialize)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that " - "cannot accept a set"))); + errmsg("materialize mode required, but it is not allowed in this context"))); rsi->returnMode = SFRM_Materialize; @@ -2227,13 +2227,16 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, rsi = (ReturnSetInfo *) fcinfo->resultinfo; - if (!rsi || !IsA(rsi, ReturnSetInfo) || - (rsi->allowedModes & SFRM_Materialize) == 0 || + if (!rsi || !IsA(rsi, ReturnSetInfo)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("set-valued function called in context that cannot accept a set"))); + + if (!(rsi->allowedModes & SFRM_Materialize) || rsi->expectedDesc == NULL) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that " - "cannot accept a set"))); + errmsg("materialize mode required, but it is not allowed in this context"))); rsi->returnMode = SFRM_Materialize; @@ -2336,13 +2339,16 @@ elements_worker(FunctionCallInfo fcinfo, const char *funcname, bool as_text) rsi = (ReturnSetInfo *) fcinfo->resultinfo; - if (!rsi || !IsA(rsi, ReturnSetInfo) || - (rsi->allowedModes & SFRM_Materialize) == 0 || + if (!rsi || !IsA(rsi, ReturnSetInfo)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("set-valued function called in context that cannot accept a set"))); + + if (!(rsi->allowedModes & SFRM_Materialize) || rsi->expectedDesc == NULL) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that " - "cannot accept a set"))); + errmsg("materialize mode required, but it is not allowed in this context"))); rsi->returnMode = SFRM_Materialize; @@ -3798,12 +3804,15 @@ populate_recordset_worker(FunctionCallInfo fcinfo, const char *funcname, rsi = (ReturnSetInfo *) fcinfo->resultinfo; - if (!rsi || !IsA(rsi, ReturnSetInfo) || - (rsi->allowedModes & SFRM_Materialize) == 0) + if (!rsi || !IsA(rsi, ReturnSetInfo)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("set-valued function called in context that cannot accept a set"))); + + if (!(rsi->allowedModes & SFRM_Materialize)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that " - "cannot accept a set"))); + errmsg("materialize mode required, but it is not allowed in this context"))); rsi->returnMode = SFRM_Materialize; diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index b5879c2947..81d9c46e00 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -2414,12 +2414,15 @@ plperl_func_handler(PG_FUNCTION_ARGS) if (prodesc->fn_retisset) { /* Check context before allowing the call to go through */ - if (!rsi || !IsA(rsi, ReturnSetInfo) || - (rsi->allowedModes & SFRM_Materialize) == 0) + if (!rsi || !IsA(rsi, ReturnSetInfo)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that " - "cannot accept a set"))); + errmsg("set-valued function called in context that cannot accept a set"))); + + if (!(rsi->allowedModes & SFRM_Materialize)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("materialize mode required, but it is not allowed in this context"))); } activate_interpreter(prodesc->interp); diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 70c4a75295..9674c29250 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -629,11 +629,16 @@ plpgsql_exec_function(PLpgSQL_function *func, FunctionCallInfo fcinfo, ReturnSetInfo *rsi = estate.rsi; /* Check caller can handle a set result */ - if (!rsi || !IsA(rsi, ReturnSetInfo) || - (rsi->allowedModes & SFRM_Materialize) == 0) + if (!rsi || !IsA(rsi, ReturnSetInfo)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("set-valued function called in context that cannot accept a set"))); + + if (!(rsi->allowedModes & SFRM_Materialize)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("materialize mode required, but it is not allowed in this context"))); + rsi->returnMode = SFRM_Materialize; /* If we produced any tuples, send back the result */ @@ -3645,13 +3650,17 @@ exec_init_tuple_store(PLpgSQL_execstate *estate) /* * Check caller can handle a set result in the way we want */ - if (!rsi || !IsA(rsi, ReturnSetInfo) || - (rsi->allowedModes & SFRM_Materialize) == 0 || - rsi->expectedDesc == NULL) + if (!rsi || !IsA(rsi, ReturnSetInfo)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("set-valued function called in context that cannot accept a set"))); + if (!(rsi->allowedModes & SFRM_Materialize) || + rsi->expectedDesc == NULL) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("materialize mode required, but it is not allowed in this context"))); + /* * Switch to the right memory context and resource owner for storing the * tuplestore for return set. If we're within a subtransaction opened for diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c index ab759833db..c5fad05e12 100644 --- a/src/pl/tcl/pltcl.c +++ b/src/pl/tcl/pltcl.c @@ -829,12 +829,16 @@ pltcl_func_handler(PG_FUNCTION_ARGS, pltcl_call_state *call_state, { ReturnSetInfo *rsi = (ReturnSetInfo *) fcinfo->resultinfo; - if (!rsi || !IsA(rsi, ReturnSetInfo) || - (rsi->allowedModes & SFRM_Materialize) == 0) + if (!rsi || !IsA(rsi, ReturnSetInfo)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("set-valued function called in context that cannot accept a set"))); + if (!(rsi->allowedModes & SFRM_Materialize)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("materialize mode required, but it is not allowed in this context"))); + call_state->rsi = rsi; call_state->tuple_store_cxt = rsi->econtext->ecxt_per_query_memory; call_state->tuple_store_owner = CurrentResourceOwner; From 6c46e8a5dfc9f49e673d76fc6ae097b81d7740ef Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Thu, 24 Feb 2022 16:15:12 +0200 Subject: [PATCH 048/772] Fix data loss on crash after sorted GiST index build. If a checkpoint happens during sorted GiST index build, and the system crashes after the checkpoint and after the index build has finished, the data written to the index before the checkpoint started could be lost. The checkpoint won't fsync it, and it won't be replayed at crash recovery either. Fix by calling smgrimmedsync() after the index build, just like in B-tree index build. Backpatch to v14 where the sorted GiST index build was introduced. Reported-by: Melanie Plageman Discussion: https://www.postgresql.org/message-id/CAAKRu_ZJJynimxKj5xYBSziL62-iEtPE+fx-B=JzR=jUtP92mw@mail.gmail.com --- src/backend/access/gist/gistbuild.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/backend/access/gist/gistbuild.c b/src/backend/access/gist/gistbuild.c index 4db896a533..e081e6571a 100644 --- a/src/backend/access/gist/gistbuild.c +++ b/src/backend/access/gist/gistbuild.c @@ -467,6 +467,18 @@ gist_indexsortbuild(GISTBuildState *state) pfree(levelstate->pages[0]); pfree(levelstate); + + /* + * When we WAL-logged index pages, we must nonetheless fsync index files. + * Since we're building outside shared buffers, a CHECKPOINT occurring + * during the build has no way to flush the previously written data to + * disk (indeed it won't know the index even exists). A crash later on + * would replay WAL from the checkpoint, therefore it wouldn't replay our + * earlier WAL entries. If we do not fsync those pages here, they might + * still not be on disk when the crash occurs. + */ + if (RelationNeedsWAL(state->indexrel)) + smgrimmedsync(RelationGetSmgr(state->indexrel), MAIN_FORKNUM); } /* From 31d8d4740ffb21c9898a21b5018c31e92af6935d Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Thu, 24 Feb 2022 20:58:18 +0100 Subject: [PATCH 049/772] Guard against reallocation failure in pg_regress realloc() will return NULL on a failed reallocation, so the destination pointer must be inspected to avoid null pointer dereference. Further, assigning the return value to the source pointer leak the allocation in the case of reallocation failure. Fix by using pg_realloc instead which has full error handling. Reviewed-by: Tom Lane Discussion: https://postgr.es/m/9FC7E603-9246-4C62-B466-A39CFAF454AE@yesql.se --- src/test/regress/pg_regress.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c index e6f71c7582..db8427dd9b 100644 --- a/src/test/regress/pg_regress.c +++ b/src/test/regress/pg_regress.c @@ -774,7 +774,7 @@ fmtHba(const char *raw) const char *rp; char *wp; - wp = ret = realloc(ret, 3 + strlen(raw) * 2); + wp = ret = pg_realloc(ret, 3 + strlen(raw) * 2); *wp++ = '"'; for (rp = raw; *rp; rp++) From cf879d3069a3f025824b4a3fa3086137b34bad48 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Thu, 24 Feb 2022 18:31:07 -0800 Subject: [PATCH 050/772] Remove unnecessary heap_tuple_needs_freeze argument. The buffer argument hasn't been used since the function was first added by commit bbb6e559c4. The sibling heap_prepare_freeze_tuple function doesn't have such an argument either. Remove it. --- src/backend/access/heap/heapam.c | 2 +- src/backend/access/heap/vacuumlazy.c | 2 +- src/include/access/heapam.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 2240cfd936..59d43e2ba9 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -7141,7 +7141,7 @@ heap_tuple_needs_eventual_freeze(HeapTupleHeader tuple) */ bool heap_tuple_needs_freeze(HeapTupleHeader tuple, TransactionId cutoff_xid, - MultiXactId cutoff_multi, Buffer buf) + MultiXactId cutoff_multi) { TransactionId xid; diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 242511a235..f48e699b91 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -2015,7 +2015,7 @@ lazy_scan_noprune(LVRelState *vacrel, tupleheader = (HeapTupleHeader) PageGetItem(page, itemid); if (heap_tuple_needs_freeze(tupleheader, vacrel->FreezeLimit, - vacrel->MultiXactCutoff, buf)) + vacrel->MultiXactCutoff)) { if (vacrel->aggressive) { diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index 0ad87730e1..b46ab7d739 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -168,7 +168,7 @@ extern bool heap_freeze_tuple(HeapTupleHeader tuple, TransactionId relfrozenxid, TransactionId relminmxid, TransactionId cutoff_xid, TransactionId cutoff_multi); extern bool heap_tuple_needs_freeze(HeapTupleHeader tuple, TransactionId cutoff_xid, - MultiXactId cutoff_multi, Buffer buf); + MultiXactId cutoff_multi); extern bool heap_tuple_needs_eventual_freeze(HeapTupleHeader tuple); extern void simple_heap_insert(Relation relation, HeapTuple tup); From 22eb12cfff3e842bb35427e1ec819d64daabd5a1 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Fri, 25 Feb 2022 07:51:21 +0530 Subject: [PATCH 051/772] Fix few values in pg_proc for pg_stat_get_replication_slot. The function pg_stat_get_replication_slot() is not a SRF but marked incorrectly in the pg_proc. Reported-by: Michael Paquier Discussion: https://postgr.es/m/YhMk4RjoMK3CCXy2@paquier.xyz --- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.dat | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 1addb568ef..14194afe1c 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202202221 +#define CATALOG_VERSION_NO 202202251 #endif diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 7f1ee97f55..7de8cfc7e9 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -5370,9 +5370,8 @@ proargnames => '{pid,status,receive_start_lsn,receive_start_tli,written_lsn,flushed_lsn,received_tli,last_msg_send_time,last_msg_receipt_time,latest_end_lsn,latest_end_time,slot_name,sender_host,sender_port,conninfo}', prosrc => 'pg_stat_get_wal_receiver' }, { oid => '6169', descr => 'statistics: information about replication slot', - proname => 'pg_stat_get_replication_slot', prorows => '1', proisstrict => 'f', - proretset => 't', provolatile => 's', proparallel => 'r', - prorettype => 'record', proargtypes => 'text', + proname => 'pg_stat_get_replication_slot', proisstrict => 'f', provolatile => 's', + proparallel => 'r', prorettype => 'record', proargtypes => 'text', proallargtypes => '{text,text,int8,int8,int8,int8,int8,int8,int8,int8,timestamptz}', proargmodes => '{i,o,o,o,o,o,o,o,o,o,o}', proargnames => '{slot_name,slot_name,spill_txns,spill_count,spill_bytes,stream_txns,stream_count,stream_bytes,total_txns,total_bytes,stats_reset}', From 73c61a50a1555007001d29844dcdb10b4f982a73 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Thu, 24 Feb 2022 19:01:54 -0800 Subject: [PATCH 052/772] vacuumlazy.c: Remove obsolete num_tuples field. Commit 49c9d9fc unified VACUUM VERBOSE and autovacuum logging. It neglected to remove an old vacrel field that was only used by the old VACUUM VERBOSE, so remove it now. The previous num_tuples approach doesn't seem to have any real advantage over the approach VACUUM VERBOSE takes now (also the approach used by the autovacuum logging code), which is to show new_rel_tuples. new_rel_tuples is the possibly-estimated total number of tuples left in the table, whereas num_tuples meant the number of tuples encountered during the VACUUM operation, after pruning, without regard for tuples from pages skipped via the visibility map. In passing, reorder a related vacrel field for consistency. --- src/backend/access/heap/vacuumlazy.c | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index f48e699b91..40101e0cb8 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -213,10 +213,9 @@ typedef struct LVRelState /* Counters that follow are only for scanned_pages */ int64 tuples_deleted; /* # deleted from table */ int64 lpdead_items; /* # deleted from indexes */ + int64 live_tuples; /* # live tuples remaining */ int64 recently_dead_tuples; /* # dead, but not yet removable */ int64 missed_dead_tuples; /* # removable, but not removed */ - int64 num_tuples; /* total number of nonremovable tuples */ - int64 live_tuples; /* live tuples (reltuples estimate) */ } LVRelState; /* @@ -816,10 +815,9 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) vacrel->num_index_scans = 0; vacrel->tuples_deleted = 0; vacrel->lpdead_items = 0; + vacrel->live_tuples = 0; vacrel->recently_dead_tuples = 0; vacrel->missed_dead_tuples = 0; - vacrel->num_tuples = 0; - vacrel->live_tuples = 0; vistest = GlobalVisTestFor(vacrel->rel); @@ -1572,9 +1570,8 @@ lazy_scan_prune(LVRelState *vacrel, HTSV_Result res; int tuples_deleted, lpdead_items, - recently_dead_tuples, - num_tuples, - live_tuples; + live_tuples, + recently_dead_tuples; int nnewlpdead; int nfrozen; OffsetNumber deadoffsets[MaxHeapTuplesPerPage]; @@ -1589,9 +1586,8 @@ lazy_scan_prune(LVRelState *vacrel, /* Initialize (or reset) page-level counters */ tuples_deleted = 0; lpdead_items = 0; - recently_dead_tuples = 0; - num_tuples = 0; live_tuples = 0; + recently_dead_tuples = 0; /* * Prune all HOT-update chains in this page. @@ -1788,8 +1784,7 @@ lazy_scan_prune(LVRelState *vacrel, * Check tuple left behind after pruning to see if needs to be frozen * now. */ - num_tuples++; - prunestate->hastup = true; + prunestate->hastup = true; /* page won't be truncatable */ if (heap_prepare_freeze_tuple(tuple.t_data, vacrel->relfrozenxid, vacrel->relminmxid, @@ -1928,9 +1923,8 @@ lazy_scan_prune(LVRelState *vacrel, /* Finally, add page-local counts to whole-VACUUM counts */ vacrel->tuples_deleted += tuples_deleted; vacrel->lpdead_items += lpdead_items; - vacrel->recently_dead_tuples += recently_dead_tuples; - vacrel->num_tuples += num_tuples; vacrel->live_tuples += live_tuples; + vacrel->recently_dead_tuples += recently_dead_tuples; } /* @@ -1963,7 +1957,6 @@ lazy_scan_noprune(LVRelState *vacrel, OffsetNumber offnum, maxoff; int lpdead_items, - num_tuples, live_tuples, recently_dead_tuples, missed_dead_tuples; @@ -1976,7 +1969,6 @@ lazy_scan_noprune(LVRelState *vacrel, *recordfreespace = false; /* for now */ lpdead_items = 0; - num_tuples = 0; live_tuples = 0; recently_dead_tuples = 0; missed_dead_tuples = 0; @@ -2031,7 +2023,6 @@ lazy_scan_noprune(LVRelState *vacrel, vacrel->freeze_cutoffs_valid = false; } - num_tuples++; ItemPointerSet(&(tuple.t_self), blkno, offnum); tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid); tuple.t_len = ItemIdGetLength(itemid); @@ -2096,7 +2087,6 @@ lazy_scan_noprune(LVRelState *vacrel, * forever, for vanishingly little benefit.) */ *hastup = true; - num_tuples += lpdead_items; missed_dead_tuples += lpdead_items; } @@ -2146,10 +2136,9 @@ lazy_scan_noprune(LVRelState *vacrel, /* * Finally, add relevant page-local counts to whole-VACUUM counts */ + vacrel->live_tuples += live_tuples; vacrel->recently_dead_tuples += recently_dead_tuples; vacrel->missed_dead_tuples += missed_dead_tuples; - vacrel->num_tuples += num_tuples; - vacrel->live_tuples += live_tuples; if (missed_dead_tuples > 0) vacrel->missed_dead_pages++; From cd83cb953606b94966981056e79dbb6c48751055 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Fri, 25 Feb 2022 10:30:05 -0800 Subject: [PATCH 053/772] pg_waldump: Fix error message for WAL files smaller than XLOG_BLCKSZ. When opening a WAL file smaller than XLOG_BLCKSZ (e.g. 0 bytes long) while determining the wal_segment_size, pg_waldump checked errno, despite errno not being set by the short read. Resulting in a bogus error message. Author: Kyotaro Horiguchi Discussion: https://postgr.es/m/20220214.181847.775024684568733277.horikyota.ntt@gmail.com Backpatch: 11-, the bug was introducedin fc49e24fa --- src/bin/pg_waldump/pg_waldump.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index a6251e1a96..2340dc247b 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -222,15 +222,12 @@ search_directory(const char *directory, const char *fname) WalSegSz), fname, WalSegSz); } + else if (r < 0) + fatal_error("could not read file \"%s\": %m", + fname); else - { - if (errno != 0) - fatal_error("could not read file \"%s\": %m", - fname); - else - fatal_error("could not read file \"%s\": read %d of %d", - fname, r, XLOG_BLCKSZ); - } + fatal_error("could not read file \"%s\": read %d of %d", + fname, r, XLOG_BLCKSZ); close(fd); return true; } From 638300fef541fb9393caa1ee8821a639816301d1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 25 Feb 2022 17:40:21 -0500 Subject: [PATCH 054/772] Disallow execution of SPI functions during plperl function compilation. Perl can be convinced to execute user-defined code during compilation of a plperl function (or at least a plperlu function). That's not such a big problem as long as the activity is confined within the Perl interpreter, and it's not clear we could do anything about that anyway. However, if such code tries to use plperl's SPI functions, we have a bigger problem. In the first place, those functions are likely to crash because current_call_data->prodesc isn't set up yet. In the second place, because it isn't set up, we lack critical info such as whether the function is supposed to be read-only. And in the third place, this path allows code execution during function validation, which is strongly discouraged because of the potential for security exploits. Hence, reject execution of the SPI functions until compilation is finished. While here, add check_spi_usage_allowed() calls to various functions that hadn't gotten the memo about checking that. I think that perhaps plperl_sv_to_literal may have been intentionally omitted on the grounds that it was safe at the time; but if so, the addition of transforms functionality changed that. The others are more recently added and seem to be flat-out oversights. Per report from Mark Murawski. Back-patch to all supported branches. Discussion: https://postgr.es/m/9acdf918-7fff-4f40-f750-2ffa84f083d2@intellasoft.net --- src/pl/plperl/plperl.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 81d9c46e00..81bb480bc2 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -264,6 +264,7 @@ static plperl_proc_desc *compile_plperl_function(Oid fn_oid, static SV *plperl_hash_from_tuple(HeapTuple tuple, TupleDesc tupdesc, bool include_generated); static SV *plperl_hash_from_datum(Datum attr); +static void check_spi_usage_allowed(void); static SV *plperl_ref_from_pg_array(Datum arg, Oid typid); static SV *split_array(plperl_array_info *info, int first, int last, int nest); static SV *make_array_ref(plperl_array_info *info, int first, int last); @@ -1429,13 +1430,15 @@ plperl_sv_to_datum(SV *sv, Oid typid, int32 typmod, char * plperl_sv_to_literal(SV *sv, char *fqtypename) { - Datum str = CStringGetDatum(fqtypename); - Oid typid = DirectFunctionCall1(regtypein, str); + Oid typid; Oid typoutput; Datum datum; bool typisvarlena, isnull; + check_spi_usage_allowed(); + + typid = DirectFunctionCall1(regtypein, CStringGetDatum(fqtypename)); if (!OidIsValid(typid)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), @@ -3097,6 +3100,21 @@ check_spi_usage_allowed(void) /* simple croak as we don't want to involve PostgreSQL code */ croak("SPI functions can not be used in END blocks"); } + + /* + * Disallow SPI usage if we're not executing a fully-compiled plperl + * function. It might seem impossible to get here in that case, but there + * are cases where Perl will try to execute code during compilation. If + * we proceed we are likely to crash trying to dereference the prodesc + * pointer. Working around that might be possible, but it seems unwise + * because it'd allow code execution to happen while validating a + * function, which is undesirable. + */ + if (current_call_data == NULL || current_call_data->prodesc == NULL) + { + /* simple croak as we don't want to involve PostgreSQL code */ + croak("SPI functions can not be used during function compilation"); + } } @@ -3217,6 +3235,8 @@ plperl_return_next(SV *sv) { MemoryContext oldcontext = CurrentMemoryContext; + check_spi_usage_allowed(); + PG_TRY(); { plperl_return_next_internal(sv); @@ -3961,6 +3981,8 @@ plperl_spi_commit(void) { MemoryContext oldcontext = CurrentMemoryContext; + check_spi_usage_allowed(); + PG_TRY(); { SPI_commit(); @@ -3986,6 +4008,8 @@ plperl_spi_rollback(void) { MemoryContext oldcontext = CurrentMemoryContext; + check_spi_usage_allowed(); + PG_TRY(); { SPI_rollback(); @@ -4023,6 +4047,11 @@ plperl_util_elog(int level, SV *msg) MemoryContext oldcontext = CurrentMemoryContext; char *volatile cmsg = NULL; + /* + * We intentionally omit check_spi_usage_allowed() here, as this seems + * safe to allow even in the contexts that that function rejects. + */ + PG_TRY(); { cmsg = sv2cstr(msg); From fe0972ee5e6f8a663c5cf3f24ef98987c503da95 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Fri, 25 Feb 2022 16:58:48 -0800 Subject: [PATCH 055/772] Add further debug info to help debug 019_replslot_limit.pl failures. See also afdeff10526. Failures after that commit provided a few more hints, but not yet enough to understand what's going on. In 019_replslot_limit.pl shut down nodes with fast instead of immediate mode if we observe the failure mode. That should tell us whether the failures we're observing are just a timing issue under high load. PGCTLTIMEOUT should prevent buildfarm animals from hanging endlessly. Also adds a bit more logging to replication slot drop and ShutdownPostgres(). Discussion: https://postgr.es/m/20220225192941.hqnvefgdzaro6gzg@alap3.anarazel.de --- src/backend/replication/slot.c | 13 +++++++++++++ src/backend/storage/lmgr/lwlock.c | 7 +++++++ src/backend/utils/init/postinit.c | 17 +++++++++++++++++ src/include/storage/lwlock.h | 1 + src/test/recovery/t/019_replslot_limit.pl | 18 +++++++++++++++++- 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index 3d39fddaae..f238a392ae 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -569,6 +569,10 @@ ReplicationSlotCleanup(void) if (!s->in_use) continue; + /* unlocked read of active_pid is ok for debugging purposes */ + elog(DEBUG3, "temporary replication slot cleanup: %d in use, active_pid: %d", + i, s->active_pid); + SpinLockAcquire(&s->mutex); if (s->active_pid == MyProcPid) { @@ -629,6 +633,9 @@ ReplicationSlotDropPtr(ReplicationSlot *slot) char path[MAXPGPATH]; char tmppath[MAXPGPATH]; + /* temp debugging aid to analyze 019_replslot_limit failures */ + elog(DEBUG3, "replication slot drop: %s: begin", NameStr(slot->data.name)); + /* * If some other backend ran this code concurrently with us, we might try * to delete a slot with a certain name while someone else was trying to @@ -679,6 +686,9 @@ ReplicationSlotDropPtr(ReplicationSlot *slot) path, tmppath))); } + elog(DEBUG3, "replication slot drop: %s: removed on-disk", + NameStr(slot->data.name)); + /* * The slot is definitely gone. Lock out concurrent scans of the array * long enough to kill it. It's OK to clear the active PID here without @@ -734,6 +744,9 @@ ReplicationSlotDropPtr(ReplicationSlot *slot) * a slot while we're still cleaning up the detritus of the old one. */ LWLockRelease(ReplicationSlotAllocationLock); + + elog(DEBUG3, "replication slot drop: %s: done", + NameStr(slot->data.name)); } /* diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index 7b0dea4abe..8f7f1b2f7c 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -1945,3 +1945,10 @@ LWLockHeldByMeInMode(LWLock *l, LWLockMode mode) } return false; } + +/* temp debugging aid to analyze 019_replslot_limit failures */ +int +LWLockHeldCount(void) +{ + return num_held_lwlocks; +} diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index a29fa0b3e6..86d193c89f 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -1262,6 +1262,23 @@ ShutdownPostgres(int code, Datum arg) * them explicitly. */ LockReleaseAll(USER_LOCKMETHOD, true); + + /* + * temp debugging aid to analyze 019_replslot_limit failures + * + * If an error were thrown outside of a transaction nothing up to now + * would have released lwlocks. We probably will add an + * LWLockReleaseAll(). But for now make it easier to understand such cases + * by warning if any lwlocks are held. + */ +#ifdef USE_ASSERT_CHECKING + { + int held_lwlocks = LWLockHeldCount(); + if (held_lwlocks) + elog(WARNING, "holding %d lwlocks at the end of ShutdownPostgres()", + held_lwlocks); + } +#endif } diff --git a/src/include/storage/lwlock.h b/src/include/storage/lwlock.h index 124977cf7e..c3d5889d7b 100644 --- a/src/include/storage/lwlock.h +++ b/src/include/storage/lwlock.h @@ -121,6 +121,7 @@ extern void LWLockReleaseClearVar(LWLock *lock, uint64 *valptr, uint64 val); extern void LWLockReleaseAll(void); extern bool LWLockHeldByMe(LWLock *lock); extern bool LWLockHeldByMeInMode(LWLock *lock, LWLockMode mode); +extern int LWLockHeldCount(void); extern bool LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval); extern void LWLockUpdateVar(LWLock *lock, uint64 *valptr, uint64 value); diff --git a/src/test/recovery/t/019_replslot_limit.pl b/src/test/recovery/t/019_replslot_limit.pl index 0c9da9bf27..9bb71b62c0 100644 --- a/src/test/recovery/t/019_replslot_limit.pl +++ b/src/test/recovery/t/019_replslot_limit.pl @@ -335,7 +335,23 @@ $node_primary3->wait_for_catchup($node_standby3); my $senderpid = $node_primary3->safe_psql('postgres', "SELECT pid FROM pg_stat_activity WHERE backend_type = 'walsender'"); -like($senderpid, qr/^[0-9]+$/, "have walsender pid $senderpid"); + +# We've seen occasional cases where multiple walsender pids are active. An +# immediate shutdown may hide evidence of a locking bug. So if multiple +# walsenders are observed, shut down in fast mode, and collect some more +# information. +if (not like($senderpid, qr/^[0-9]+$/, "have walsender pid $senderpid")) +{ + my ($stdout, $stderr); + $node_primary3->psql('postgres', + "\\a\\t\nSELECT * FROM pg_stat_activity", + stdout => \$stdout, stderr => \$stderr); + diag $stdout, $stderr; + $node_primary3->stop('fast'); + $node_standby3->stop('fast'); + die "could not determine walsender pid, can't continue"; +} + my $receiverpid = $node_standby3->safe_psql('postgres', "SELECT pid FROM pg_stat_activity WHERE backend_type = 'walreceiver'"); like($receiverpid, qr/^[0-9]+$/, "have walreceiver pid $receiverpid"); From a89850a57e0557bd3faab32398eb2d9536f6e2a4 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Sat, 26 Feb 2022 10:38:37 +0530 Subject: [PATCH 056/772] Fix typo in logicalfuncs.c. Author: Bharath Rupireddy Discussion: https://postgr.es/m/CALj2ACX1mVtw8LWEnZgnpPdk2bPFR1xX2ZN+8GfXCffyip_9=Q@mail.gmail.com --- src/backend/replication/logical/logicalfuncs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/replication/logical/logicalfuncs.c b/src/backend/replication/logical/logicalfuncs.c index 3609fa7d5b..3bd770a3ba 100644 --- a/src/backend/replication/logical/logicalfuncs.c +++ b/src/backend/replication/logical/logicalfuncs.c @@ -40,7 +40,7 @@ #include "utils/regproc.h" #include "utils/resowner.h" -/* private date for writing out data */ +/* Private data for writing out data */ typedef struct DecodingOutputState { Tuplestorestate *tupstore; From d33aeefd9b7c8c76f584432717dc944505565e52 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 26 Feb 2022 16:06:24 -0800 Subject: [PATCH 057/772] Fix warning on mingw due to pid_t width, introduced in fe0972ee5e6. --- src/backend/replication/slot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index f238a392ae..caa6b29756 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -571,7 +571,7 @@ ReplicationSlotCleanup(void) /* unlocked read of active_pid is ok for debugging purposes */ elog(DEBUG3, "temporary replication slot cleanup: %d in use, active_pid: %d", - i, s->active_pid); + i, (int) s->active_pid); SpinLockAcquire(&s->mutex); if (s->active_pid == MyProcPid) From 1155d8b8d52ed8705fd8386eaa64fb05c04170c6 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 26 Feb 2022 16:43:54 -0800 Subject: [PATCH 058/772] Fix use of wrong variable in pg_receivewal's get_destination_dir(). The global variable wrongly used is always the one passed to get_destination_dir(), so there currently are no negative consequences. Author: Bharath Rupireddy Discussion: https://postgr.es/m/CALj2ACUT0C2LQwhyLXTQdj8T9SxZa5j7cmu-UOz0cZ8_D5edjg@mail.gmail.com --- src/bin/pg_basebackup/pg_receivewal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c index ccb215c398..ce661a9ce4 100644 --- a/src/bin/pg_basebackup/pg_receivewal.c +++ b/src/bin/pg_basebackup/pg_receivewal.c @@ -240,7 +240,7 @@ get_destination_dir(char *dest_folder) dir = opendir(dest_folder); if (dir == NULL) { - pg_log_error("could not open directory \"%s\": %m", basedir); + pg_log_error("could not open directory \"%s\": %m", dest_folder); exit(1); } From ac25173cdbc40b310a7e72d9557c45a699f1f7b3 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 26 Feb 2022 16:51:47 -0800 Subject: [PATCH 059/772] Convert src/interfaces/libpq/test to a tap test. The old form of the test needed a bunch of custom infrastructure. These days tap tests provide the necessary infrastructure to do better. We discussed whether to move this test to src/test/modules, alongside libpq_pipeline, but concluded that the opposite direction would be better. libpq_pipeline will be moved at a later date, once the buildfarm and msvc build infrastructure is ready for it. The invocation of the tap test will be added in the next commit. It involves just enough buildsystem changes to be worth commiting separately. Can't happen the other way round because prove errors out when invoked without tests. Discussion: https://postgr.es/m/20220223203031.ezrd73ohvjgfksow@alap3.anarazel.de --- src/interfaces/libpq/t/001_uri.pl | 244 +++++++++++++++++++++++++ src/interfaces/libpq/test/.gitignore | 2 - src/interfaces/libpq/test/Makefile | 7 +- src/interfaces/libpq/test/README | 7 - src/interfaces/libpq/test/expected.out | 171 ----------------- src/interfaces/libpq/test/regress.in | 57 ------ src/interfaces/libpq/test/regress.pl | 65 ------- 7 files changed, 246 insertions(+), 307 deletions(-) create mode 100644 src/interfaces/libpq/t/001_uri.pl delete mode 100644 src/interfaces/libpq/test/README delete mode 100644 src/interfaces/libpq/test/expected.out delete mode 100644 src/interfaces/libpq/test/regress.in delete mode 100644 src/interfaces/libpq/test/regress.pl diff --git a/src/interfaces/libpq/t/001_uri.pl b/src/interfaces/libpq/t/001_uri.pl new file mode 100644 index 0000000000..90f370f8fd --- /dev/null +++ b/src/interfaces/libpq/t/001_uri.pl @@ -0,0 +1,244 @@ +# Copyright (c) 2021-2022, PostgreSQL Global Development Group +use strict; +use warnings; + +use PostgreSQL::Test::Utils; +use Test::More; +use IPC::Run; + + +# List of URIs tests. For each test the first element is the input string, the +# second the expected stdout and the third the expected stderr. +my @tests = ( + [ + q{postgresql://uri-user:secret@host:12345/db}, + q{user='uri-user' password='secret' dbname='db' host='host' port='12345' (inet)}, + q{}, + ], + [ + q{postgresql://uri-user@host:12345/db}, + q{user='uri-user' dbname='db' host='host' port='12345' (inet)}, q{}, + ], + [ + q{postgresql://uri-user@host/db}, + q{user='uri-user' dbname='db' host='host' (inet)}, q{}, + ], + [ + q{postgresql://host:12345/db}, + q{dbname='db' host='host' port='12345' (inet)}, q{}, + ], + [ q{postgresql://host/db}, q{dbname='db' host='host' (inet)}, q{}, ], + [ + q{postgresql://uri-user@host:12345/}, + q{user='uri-user' host='host' port='12345' (inet)}, + q{}, + ], + [ + q{postgresql://uri-user@host/}, + q{user='uri-user' host='host' (inet)}, + q{}, + ], + [ q{postgresql://uri-user@}, q{user='uri-user' (local)}, q{}, ], + [ q{postgresql://host:12345/}, q{host='host' port='12345' (inet)}, q{}, ], + [ q{postgresql://host:12345}, q{host='host' port='12345' (inet)}, q{}, ], + [ q{postgresql://host/db}, q{dbname='db' host='host' (inet)}, q{}, ], + [ q{postgresql://host/}, q{host='host' (inet)}, q{}, ], + [ q{postgresql://host}, q{host='host' (inet)}, q{}, ], + [ q{postgresql://}, q{(local)}, q{}, ], + [ + q{postgresql://?hostaddr=127.0.0.1}, q{hostaddr='127.0.0.1' (inet)}, + q{}, + ], + [ + q{postgresql://example.com?hostaddr=63.1.2.4}, + q{host='example.com' hostaddr='63.1.2.4' (inet)}, + q{}, + ], + [ q{postgresql://%68ost/}, q{host='host' (inet)}, q{}, ], + [ + q{postgresql://host/db?user=uri-user}, + q{user='uri-user' dbname='db' host='host' (inet)}, + q{}, + ], + [ + q{postgresql://host/db?user=uri-user&port=12345}, + q{user='uri-user' dbname='db' host='host' port='12345' (inet)}, + q{}, + ], + [ + q{postgresql://host/db?u%73er=someotheruser&port=12345}, + q{user='someotheruser' dbname='db' host='host' port='12345' (inet)}, + q{}, + ], + [ + q{postgresql://host/db?u%7aer=someotheruser&port=12345}, q{}, + q{uri-regress: invalid URI query parameter: "uzer"}, + ], + [ + q{postgresql://host:12345?user=uri-user}, + q{user='uri-user' host='host' port='12345' (inet)}, + q{}, + ], + [ + q{postgresql://host?user=uri-user}, + q{user='uri-user' host='host' (inet)}, + q{}, + ], + [ q{postgresql://host?}, q{host='host' (inet)}, q{}, ], + [ + q{postgresql://[::1]:12345/db}, + q{dbname='db' host='::1' port='12345' (inet)}, + q{}, + ], + [ q{postgresql://[::1]/db}, q{dbname='db' host='::1' (inet)}, q{}, ], + [ + q{postgresql://[2001:db8::1234]/}, q{host='2001:db8::1234' (inet)}, + q{}, + ], + [ + q{postgresql://[200z:db8::1234]/}, q{host='200z:db8::1234' (inet)}, + q{}, + ], + [ q{postgresql://[::1]}, q{host='::1' (inet)}, q{}, ], + [ q{postgres://}, q{(local)}, q{}, ], + [ q{postgres:///}, q{(local)}, q{}, ], + [ q{postgres:///db}, q{dbname='db' (local)}, q{}, ], + [ + q{postgres://uri-user@/db}, q{user='uri-user' dbname='db' (local)}, + q{}, + ], + [ + q{postgres://?host=/path/to/socket/dir}, + q{host='/path/to/socket/dir' (local)}, + q{}, + ], + [ + q{postgresql://host?uzer=}, q{}, + q{uri-regress: invalid URI query parameter: "uzer"}, + ], + [ + q{postgre://}, + q{}, + q{uri-regress: missing "=" after "postgre://" in connection info string}, + ], + [ + q{postgres://[::1}, + q{}, + q{uri-regress: end of string reached when looking for matching "]" in IPv6 host address in URI: "postgres://[::1"}, + ], + [ + q{postgres://[]}, + q{}, + q{uri-regress: IPv6 host address may not be empty in URI: "postgres://[]"}, + ], + [ + q{postgres://[::1]z}, + q{}, + q{uri-regress: unexpected character "z" at position 17 in URI (expected ":" or "/"): "postgres://[::1]z"}, + ], + [ + q{postgresql://host?zzz}, + q{}, + q{uri-regress: missing key/value separator "=" in URI query parameter: "zzz"}, + ], + [ + q{postgresql://host?value1&value2}, + q{}, + q{uri-regress: missing key/value separator "=" in URI query parameter: "value1"}, + ], + [ + q{postgresql://host?key=key=value}, + q{}, + q{uri-regress: extra key/value separator "=" in URI query parameter: "key"}, + ], + [ + q{postgres://host?dbname=%XXfoo}, q{}, + q{uri-regress: invalid percent-encoded token: "%XXfoo"}, + ], + [ + q{postgresql://a%00b}, + q{}, + q{uri-regress: forbidden value %00 in percent-encoded value: "a%00b"}, + ], + [ + q{postgresql://%zz}, q{}, + q{uri-regress: invalid percent-encoded token: "%zz"}, + ], + [ + q{postgresql://%1}, q{}, + q{uri-regress: invalid percent-encoded token: "%1"}, + ], + [ + q{postgresql://%}, q{}, + q{uri-regress: invalid percent-encoded token: "%"}, + ], + [ q{postgres://@host}, q{host='host' (inet)}, q{}, ], + [ q{postgres://host:/}, q{host='host' (inet)}, q{}, ], + [ q{postgres://:12345/}, q{port='12345' (local)}, q{}, ], + [ + q{postgres://otheruser@?host=/no/such/directory}, + q{user='otheruser' host='/no/such/directory' (local)}, + q{}, + ], + [ + q{postgres://otheruser@/?host=/no/such/directory}, + q{user='otheruser' host='/no/such/directory' (local)}, + q{}, + ], + [ + q{postgres://otheruser@:12345?host=/no/such/socket/path}, + q{user='otheruser' host='/no/such/socket/path' port='12345' (local)}, + q{}, + ], + [ + q{postgres://otheruser@:12345/db?host=/path/to/socket}, + q{user='otheruser' dbname='db' host='/path/to/socket' port='12345' (local)}, + q{}, + ], + [ + q{postgres://:12345/db?host=/path/to/socket}, + q{dbname='db' host='/path/to/socket' port='12345' (local)}, + q{}, + ], + [ + q{postgres://:12345?host=/path/to/socket}, + q{host='/path/to/socket' port='12345' (local)}, + q{}, + ], + [ + q{postgres://%2Fvar%2Flib%2Fpostgresql/dbname}, + q{dbname='dbname' host='/var/lib/postgresql' (local)}, + q{}, + ]); + +# test to run for each of the above test definitions +sub test_uri +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my $uri; + my %expect; + my %result; + + ($uri, $expect{stdout}, $expect{stderr}) = @$_; + + $expect{'exit'} = $expect{stderr} eq ''; + + my $cmd = [ 'uri-regress', $uri ]; + $result{exit} = IPC::Run::run $cmd, '>', \$result{stdout}, '2>', + \$result{stderr}; + + chomp($result{stdout}); + chomp($result{stderr}); + + # use is_deeply so there's one test result for each test above, without + # loosing the information whether stdout/stderr mismatched. + is_deeply(\%result, \%expect, $uri); +} + +foreach (@tests) +{ + test_uri($_); +} + +done_testing(); diff --git a/src/interfaces/libpq/test/.gitignore b/src/interfaces/libpq/test/.gitignore index 5387b3b6d9..5e803d8816 100644 --- a/src/interfaces/libpq/test/.gitignore +++ b/src/interfaces/libpq/test/.gitignore @@ -1,3 +1 @@ /uri-regress -/regress.diff -/regress.out diff --git a/src/interfaces/libpq/test/Makefile b/src/interfaces/libpq/test/Makefile index 4832fab9d2..5421215906 100644 --- a/src/interfaces/libpq/test/Makefile +++ b/src/interfaces/libpq/test/Makefile @@ -1,3 +1,5 @@ +# src/interfaces/libpq/test/Makefile + subdir = src/interfaces/libpq/test top_builddir = ../../../.. include $(top_builddir)/src/Makefile.global @@ -13,10 +15,5 @@ PROGS = uri-regress all: $(PROGS) -installcheck: all - SRCDIR='$(top_srcdir)' SUBDIR='$(subdir)' \ - $(PERL) $(top_srcdir)/$(subdir)/regress.pl - clean distclean maintainer-clean: rm -f $(PROGS) *.o - rm -f regress.out regress.diff diff --git a/src/interfaces/libpq/test/README b/src/interfaces/libpq/test/README deleted file mode 100644 index a05eb6bb3b..0000000000 --- a/src/interfaces/libpq/test/README +++ /dev/null @@ -1,7 +0,0 @@ -This is a testsuite for testing libpq URI connection string syntax. - -To run the suite, use 'make installcheck' command. It works by -running 'regress.pl' from this directory with appropriate environment -set up, which in turn feeds up lines from 'regress.in' to -'uri-regress' test program and compares the output against the correct -one in 'expected.out' file. diff --git a/src/interfaces/libpq/test/expected.out b/src/interfaces/libpq/test/expected.out deleted file mode 100644 index d375e82b4a..0000000000 --- a/src/interfaces/libpq/test/expected.out +++ /dev/null @@ -1,171 +0,0 @@ -trying postgresql://uri-user:secret@host:12345/db -user='uri-user' password='secret' dbname='db' host='host' port='12345' (inet) - -trying postgresql://uri-user@host:12345/db -user='uri-user' dbname='db' host='host' port='12345' (inet) - -trying postgresql://uri-user@host/db -user='uri-user' dbname='db' host='host' (inet) - -trying postgresql://host:12345/db -dbname='db' host='host' port='12345' (inet) - -trying postgresql://host/db -dbname='db' host='host' (inet) - -trying postgresql://uri-user@host:12345/ -user='uri-user' host='host' port='12345' (inet) - -trying postgresql://uri-user@host/ -user='uri-user' host='host' (inet) - -trying postgresql://uri-user@ -user='uri-user' (local) - -trying postgresql://host:12345/ -host='host' port='12345' (inet) - -trying postgresql://host:12345 -host='host' port='12345' (inet) - -trying postgresql://host/db -dbname='db' host='host' (inet) - -trying postgresql://host/ -host='host' (inet) - -trying postgresql://host -host='host' (inet) - -trying postgresql:// -(local) - -trying postgresql://?hostaddr=127.0.0.1 -hostaddr='127.0.0.1' (inet) - -trying postgresql://example.com?hostaddr=63.1.2.4 -host='example.com' hostaddr='63.1.2.4' (inet) - -trying postgresql://%68ost/ -host='host' (inet) - -trying postgresql://host/db?user=uri-user -user='uri-user' dbname='db' host='host' (inet) - -trying postgresql://host/db?user=uri-user&port=12345 -user='uri-user' dbname='db' host='host' port='12345' (inet) - -trying postgresql://host/db?u%73er=someotheruser&port=12345 -user='someotheruser' dbname='db' host='host' port='12345' (inet) - -trying postgresql://host/db?u%7aer=someotheruser&port=12345 -uri-regress: invalid URI query parameter: "uzer" - -trying postgresql://host:12345?user=uri-user -user='uri-user' host='host' port='12345' (inet) - -trying postgresql://host?user=uri-user -user='uri-user' host='host' (inet) - -trying postgresql://host? -host='host' (inet) - -trying postgresql://[::1]:12345/db -dbname='db' host='::1' port='12345' (inet) - -trying postgresql://[::1]/db -dbname='db' host='::1' (inet) - -trying postgresql://[2001:db8::1234]/ -host='2001:db8::1234' (inet) - -trying postgresql://[200z:db8::1234]/ -host='200z:db8::1234' (inet) - -trying postgresql://[::1] -host='::1' (inet) - -trying postgres:// -(local) - -trying postgres:/// -(local) - -trying postgres:///db -dbname='db' (local) - -trying postgres://uri-user@/db -user='uri-user' dbname='db' (local) - -trying postgres://?host=/path/to/socket/dir -host='/path/to/socket/dir' (local) - -trying postgresql://host?uzer= -uri-regress: invalid URI query parameter: "uzer" - -trying postgre:// -uri-regress: missing "=" after "postgre://" in connection info string - -trying postgres://[::1 -uri-regress: end of string reached when looking for matching "]" in IPv6 host address in URI: "postgres://[::1" - -trying postgres://[] -uri-regress: IPv6 host address may not be empty in URI: "postgres://[]" - -trying postgres://[::1]z -uri-regress: unexpected character "z" at position 17 in URI (expected ":" or "/"): "postgres://[::1]z" - -trying postgresql://host?zzz -uri-regress: missing key/value separator "=" in URI query parameter: "zzz" - -trying postgresql://host?value1&value2 -uri-regress: missing key/value separator "=" in URI query parameter: "value1" - -trying postgresql://host?key=key=value -uri-regress: extra key/value separator "=" in URI query parameter: "key" - -trying postgres://host?dbname=%XXfoo -uri-regress: invalid percent-encoded token: "%XXfoo" - -trying postgresql://a%00b -uri-regress: forbidden value %00 in percent-encoded value: "a%00b" - -trying postgresql://%zz -uri-regress: invalid percent-encoded token: "%zz" - -trying postgresql://%1 -uri-regress: invalid percent-encoded token: "%1" - -trying postgresql://% -uri-regress: invalid percent-encoded token: "%" - -trying postgres://@host -host='host' (inet) - -trying postgres://host:/ -host='host' (inet) - -trying postgres://:12345/ -port='12345' (local) - -trying postgres://otheruser@?host=/no/such/directory -user='otheruser' host='/no/such/directory' (local) - -trying postgres://otheruser@/?host=/no/such/directory -user='otheruser' host='/no/such/directory' (local) - -trying postgres://otheruser@:12345?host=/no/such/socket/path -user='otheruser' host='/no/such/socket/path' port='12345' (local) - -trying postgres://otheruser@:12345/db?host=/path/to/socket -user='otheruser' dbname='db' host='/path/to/socket' port='12345' (local) - -trying postgres://:12345/db?host=/path/to/socket -dbname='db' host='/path/to/socket' port='12345' (local) - -trying postgres://:12345?host=/path/to/socket -host='/path/to/socket' port='12345' (local) - -trying postgres://%2Fvar%2Flib%2Fpostgresql/dbname -dbname='dbname' host='/var/lib/postgresql' (local) - diff --git a/src/interfaces/libpq/test/regress.in b/src/interfaces/libpq/test/regress.in deleted file mode 100644 index de034f3914..0000000000 --- a/src/interfaces/libpq/test/regress.in +++ /dev/null @@ -1,57 +0,0 @@ -postgresql://uri-user:secret@host:12345/db -postgresql://uri-user@host:12345/db -postgresql://uri-user@host/db -postgresql://host:12345/db -postgresql://host/db -postgresql://uri-user@host:12345/ -postgresql://uri-user@host/ -postgresql://uri-user@ -postgresql://host:12345/ -postgresql://host:12345 -postgresql://host/db -postgresql://host/ -postgresql://host -postgresql:// -postgresql://?hostaddr=127.0.0.1 -postgresql://example.com?hostaddr=63.1.2.4 -postgresql://%68ost/ -postgresql://host/db?user=uri-user -postgresql://host/db?user=uri-user&port=12345 -postgresql://host/db?u%73er=someotheruser&port=12345 -postgresql://host/db?u%7aer=someotheruser&port=12345 -postgresql://host:12345?user=uri-user -postgresql://host?user=uri-user -postgresql://host? -postgresql://[::1]:12345/db -postgresql://[::1]/db -postgresql://[2001:db8::1234]/ -postgresql://[200z:db8::1234]/ -postgresql://[::1] -postgres:// -postgres:/// -postgres:///db -postgres://uri-user@/db -postgres://?host=/path/to/socket/dir -postgresql://host?uzer= -postgre:// -postgres://[::1 -postgres://[] -postgres://[::1]z -postgresql://host?zzz -postgresql://host?value1&value2 -postgresql://host?key=key=value -postgres://host?dbname=%XXfoo -postgresql://a%00b -postgresql://%zz -postgresql://%1 -postgresql://% -postgres://@host -postgres://host:/ -postgres://:12345/ -postgres://otheruser@?host=/no/such/directory -postgres://otheruser@/?host=/no/such/directory -postgres://otheruser@:12345?host=/no/such/socket/path -postgres://otheruser@:12345/db?host=/path/to/socket -postgres://:12345/db?host=/path/to/socket -postgres://:12345?host=/path/to/socket -postgres://%2Fvar%2Flib%2Fpostgresql/dbname diff --git a/src/interfaces/libpq/test/regress.pl b/src/interfaces/libpq/test/regress.pl deleted file mode 100644 index 70691dabe6..0000000000 --- a/src/interfaces/libpq/test/regress.pl +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/perl - -# Copyright (c) 2021-2022, PostgreSQL Global Development Group - -use strict; -use warnings; - -# use of SRCDIR/SUBDIR is required for supporting VPath builds -my $srcdir = $ENV{'SRCDIR'} or die 'SRCDIR environment variable is not set'; -my $subdir = $ENV{'SUBDIR'} or die 'SUBDIR environment variable is not set'; - -my $regress_in = "$srcdir/$subdir/regress.in"; -my $expected_out = "$srcdir/$subdir/expected.out"; - -# the output file should land in the build_dir of VPath, or just in -# the current dir, if VPath isn't used -my $regress_out = "regress.out"; - -# open input file first, so possible error isn't sent to redirected STDERR -open(my $regress_in_fh, "<", $regress_in) - or die "can't open $regress_in for reading: $!"; - -# save STDOUT/ERR and redirect both to regress.out -open(my $oldout_fh, ">&", \*STDOUT) or die "can't dup STDOUT: $!"; -open(my $olderr_fh, ">&", \*STDERR) or die "can't dup STDERR: $!"; - -open(STDOUT, ">", $regress_out) - or die "can't open $regress_out for writing: $!"; -open(STDERR, ">&", \*STDOUT) or die "can't dup STDOUT: $!"; - -# read lines from regress.in and run uri-regress on them -while (<$regress_in_fh>) -{ - chomp; - print "trying $_\n"; - system("./uri-regress \"$_\""); - print "\n"; -} - -# restore STDOUT/ERR so we can print the outcome to the user -open(STDERR, ">&", $olderr_fh) - or die; # can't complain as STDERR is still duped -open(STDOUT, ">&", $oldout_fh) or die "can't restore STDOUT: $!"; - -# just in case -close $regress_in_fh; - -my $diff_status = system( - "diff -c \"$srcdir/$subdir/expected.out\" regress.out >regress.diff"); - -print "=" x 70, "\n"; -if ($diff_status == 0) -{ - print "All tests passed\n"; - exit 0; -} -else -{ - print < Date: Sat, 26 Feb 2022 16:51:47 -0800 Subject: [PATCH 060/772] Run tap tests in src/interfaces/libpq. To be able to run binaries in the test/ directory, prove_[install]check need to be executable in a single shell invocation, so that test/ can be added to PATH. Discussion: https://postgr.es/m/20220223203031.ezrd73ohvjgfksow@alap3.anarazel.de --- src/Makefile.global.in | 12 ++++++------ src/interfaces/libpq/.gitignore | 1 + src/interfaces/libpq/Makefile | 11 +++++++++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/Makefile.global.in b/src/Makefile.global.in index c980444233..bbdc1c4bda 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -448,8 +448,8 @@ ifeq ($(enable_tap_tests),yes) ifndef PGXS define prove_installcheck -rm -rf '$(CURDIR)'/tmp_check -$(MKDIR_P) '$(CURDIR)'/tmp_check +rm -rf '$(CURDIR)'/tmp_check && \ +$(MKDIR_P) '$(CURDIR)'/tmp_check && \ cd $(srcdir) && \ TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \ PGPORT='6$(DEF_PGPORT)' top_builddir='$(CURDIR)/$(top_builddir)' \ @@ -458,8 +458,8 @@ cd $(srcdir) && \ endef else # PGXS case define prove_installcheck -rm -rf '$(CURDIR)'/tmp_check -$(MKDIR_P) '$(CURDIR)'/tmp_check +rm -rf '$(CURDIR)'/tmp_check && \ +$(MKDIR_P) '$(CURDIR)'/tmp_check && \ cd $(srcdir) && \ TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \ PGPORT='6$(DEF_PGPORT)' top_builddir='$(top_builddir)' \ @@ -469,8 +469,8 @@ endef endif # PGXS define prove_check -rm -rf '$(CURDIR)'/tmp_check -$(MKDIR_P) '$(CURDIR)'/tmp_check +rm -rf '$(CURDIR)'/tmp_check && \ +$(MKDIR_P) '$(CURDIR)'/tmp_check && \ cd $(srcdir) && \ TESTDIR='$(CURDIR)' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' \ PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \ diff --git a/src/interfaces/libpq/.gitignore b/src/interfaces/libpq/.gitignore index 7478dc344a..829d683ed2 100644 --- a/src/interfaces/libpq/.gitignore +++ b/src/interfaces/libpq/.gitignore @@ -1,2 +1,3 @@ /exports.list /libpq-refs-stamp +/tmp_check/ diff --git a/src/interfaces/libpq/Makefile b/src/interfaces/libpq/Makefile index 844c95d47d..3c53393fa4 100644 --- a/src/interfaces/libpq/Makefile +++ b/src/interfaces/libpq/Makefile @@ -137,8 +137,14 @@ install: all installdirs install-lib $(INSTALL_DATA) $(srcdir)/pqexpbuffer.h '$(DESTDIR)$(includedir_internal)' $(INSTALL_DATA) $(srcdir)/pg_service.conf.sample '$(DESTDIR)$(datadir)/pg_service.conf.sample' -installcheck: - $(MAKE) -C test $@ +test-build: + $(MAKE) -C test all + +check: test-build all + PATH="$(CURDIR)/test:$$PATH" && $(prove_check) + +installcheck: test-build all + PATH="$(CURDIR)/test:$$PATH" && $(prove_installcheck) installdirs: installdirs-lib $(MKDIR_P) '$(DESTDIR)$(includedir)' '$(DESTDIR)$(includedir_internal)' '$(DESTDIR)$(datadir)' @@ -153,6 +159,7 @@ uninstall: uninstall-lib clean distclean: clean-lib $(MAKE) -C test $@ + rm -rf tmp_check rm -f $(OBJS) pthread.h libpq-refs-stamp # Might be left over from a Win32 client-only build rm -f pg_config_paths.h From e3d41d08a17549fdc60a8b9450c0511c11d666d7 Mon Sep 17 00:00:00 2001 From: Dean Rasheed Date: Sun, 27 Feb 2022 10:15:46 +0000 Subject: [PATCH 061/772] Apply auto-vectorization to the inner loop of div_var_fast(). This loop is basically the same as the inner loop of mul_var(), which was auto-vectorized in commit 8870917623, but the compiler will only consider auto-vectorizing the div_var_fast() loop if the assignment target div[qi + i] is replaced by div_qi[i], where div_qi = &div[qi]. Additionally, since the compiler doesn't know that qdigit is guaranteed to fit in a 16-bit NumericDigit, cast it to NumericDigit before multiplying to make the resulting auto-vectorized code more efficient (avoiding unnecessary multiplication of the high 16 bits). While at it, per suggestion from Tom Lane, change var1digit in mul_var() to be a NumericDigit rather than an int for the same reason. This actually makes no difference with modern gcc, but it might help other compilers generate more efficient assembly. Dean Rasheed, reviewed by Tom Lane. Discussion: https://postgr.es/m/CAEZATCVwsBi-ND-t82Cuuh1=8ee6jdOpzsmGN+CUZB6yjLg9jw@mail.gmail.com --- src/backend/utils/adt/numeric.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index 3208789f75..effc4b886c 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -8323,7 +8323,7 @@ mul_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result, */ for (i1 = Min(var1ndigits - 1, res_ndigits - 3); i1 >= 0; i1--) { - int var1digit = var1digits[i1]; + NumericDigit var1digit = var1digits[i1]; if (var1digit == 0) continue; @@ -8908,13 +8908,22 @@ div_var_fast(const NumericVar *var1, const NumericVar *var2, * which would make the new value simply div[qi] mod vardigits[0]. * The lower-order terms in qdigit can change this result by not * more than about twice INT_MAX/NBASE, so overflow is impossible. + * + * This inner loop is the performance bottleneck for division, so + * code it in the same way as the inner loop of mul_var() so that + * it can be auto-vectorized. We cast qdigit to NumericDigit + * before multiplying to allow the compiler to generate more + * efficient code (using 16-bit multiplication), which is safe + * since we know that the quotient digit is off by at most one, so + * there is no overflow risk. */ if (qdigit != 0) { int istop = Min(var2ndigits, div_ndigits - qi + 1); + int *div_qi = &div[qi]; for (i = 0; i < istop; i++) - div[qi + i] -= qdigit * var2digits[i]; + div_qi[i] -= ((NumericDigit) qdigit) * var2digits[i]; } } From d996d648f333b04ae3da3c5853120f6f37601fb2 Mon Sep 17 00:00:00 2001 From: Dean Rasheed Date: Sun, 27 Feb 2022 10:41:12 +0000 Subject: [PATCH 062/772] Simplify the inner loop of numeric division in div_var(). In the standard numeric division algorithm, the inner loop multiplies the divisor by the next quotient digit and subtracts that from the working dividend. As suggested by the original code comment, the separate "carry" and "borrow" variables (from the multiplication and subtraction steps respectively) can be folded together into a single variable. Doing so significantly improves performance, as well as simplifying the code. Dean Rasheed, reviewed by Tom Lane. Discussion: https://postgr.es/m/CAEZATCVwsBi-ND-t82Cuuh1=8ee6jdOpzsmGN+CUZB6yjLg9jw@mail.gmail.com --- src/backend/utils/adt/numeric.c | 36 ++++++++++++++------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index effc4b886c..47475bf695 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -8605,31 +8605,25 @@ div_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result, /* As above, need do nothing more when quotient digit is 0 */ if (qhat > 0) { + NumericDigit *dividend_j = ÷nd[j]; + /* * Multiply the divisor by qhat, and subtract that from the - * working dividend. "carry" tracks the multiplication, - * "borrow" the subtraction (could we fold these together?) + * working dividend. The multiplication and subtraction are + * folded together here, noting that qhat <= NBASE (since it + * might be one too large), and so the intermediate result + * "tmp_result" is in the range [-NBASE^2, NBASE - 1], and + * "borrow" is in the range [0, NBASE]. */ - carry = 0; borrow = 0; for (i = var2ndigits; i >= 0; i--) { - carry += divisor[i] * qhat; - borrow -= carry % NBASE; - carry = carry / NBASE; - borrow += dividend[j + i]; - if (borrow < 0) - { - dividend[j + i] = borrow + NBASE; - borrow = -1; - } - else - { - dividend[j + i] = borrow; - borrow = 0; - } + int tmp_result; + + tmp_result = dividend_j[i] - borrow - divisor[i] * qhat; + borrow = (NBASE - 1 - tmp_result) / NBASE; + dividend_j[i] = tmp_result + borrow * NBASE; } - Assert(carry == 0); /* * If we got a borrow out of the top dividend digit, then @@ -8645,15 +8639,15 @@ div_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result, carry = 0; for (i = var2ndigits; i >= 0; i--) { - carry += dividend[j + i] + divisor[i]; + carry += dividend_j[i] + divisor[i]; if (carry >= NBASE) { - dividend[j + i] = carry - NBASE; + dividend_j[i] = carry - NBASE; carry = 1; } else { - dividend[j + i] = carry; + dividend_j[i] = carry; carry = 0; } } From d1b307eef2818fe24760cc2c168d7d65d59775a8 Mon Sep 17 00:00:00 2001 From: Dean Rasheed Date: Sun, 27 Feb 2022 11:12:30 +0000 Subject: [PATCH 063/772] Optimise numeric division for one and two base-NBASE digit divisors. Formerly div_var() had "fast path" short division code that was significantly faster when the divisor was just one base-NBASE digit, but otherwise used long division. This commit adds a new function div_var_int() that divides by an arbitrary 32-bit integer, using the fast short division algorithm, and updates both div_var() and div_var_fast() to use it for one and two digit divisors. In the case of div_var(), this is slightly faster in the one-digit case, because it avoids some digit array copying, and is much faster in the two-digit case where it replaces long division. For div_var_fast(), it is much faster in both cases because the main div_var_fast() algorithm is optimised for larger inputs. Additionally, optimise exp() and ln() by using div_var_int(), allowing a NumericVar to be replaced by an int in a couple of places, most notably in the Taylor series code. This produces a significant speedup of exp(), ln() and the numeric_big regression test. Dean Rasheed, reviewed by Tom Lane. Discussion: https://postgr.es/m/CAEZATCVwsBi-ND-t82Cuuh1=8ee6jdOpzsmGN+CUZB6yjLg9jw@mail.gmail.com --- src/backend/utils/adt/numeric.c | 223 ++++++++++++++++++++++++++------ 1 file changed, 180 insertions(+), 43 deletions(-) diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index 47475bf695..975d7dcf47 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -551,6 +551,8 @@ static void div_var(const NumericVar *var1, const NumericVar *var2, int rscale, bool round); static void div_var_fast(const NumericVar *var1, const NumericVar *var2, NumericVar *result, int rscale, bool round); +static void div_var_int(const NumericVar *var, int ival, int ival_weight, + NumericVar *result, int rscale, bool round); static int select_div_scale(const NumericVar *var1, const NumericVar *var2); static void mod_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result); @@ -8451,8 +8453,33 @@ div_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result, errmsg("division by zero"))); /* - * Now result zero check + * If the divisor has just one or two digits, delegate to div_var_int(), + * which uses fast short division. */ + if (var2ndigits <= 2) + { + int idivisor; + int idivisor_weight; + + idivisor = var2->digits[0]; + idivisor_weight = var2->weight; + if (var2ndigits == 2) + { + idivisor = idivisor * NBASE + var2->digits[1]; + idivisor_weight--; + } + if (var2->sign == NUMERIC_NEG) + idivisor = -idivisor; + + div_var_int(var1, idivisor, idivisor_weight, result, rscale, round); + return; + } + + /* + * Otherwise, perform full long division. + */ + + /* Result zero check */ if (var1ndigits == 0) { zero_var(result); @@ -8510,23 +8537,6 @@ div_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result, alloc_var(result, res_ndigits); res_digits = result->digits; - if (var2ndigits == 1) - { - /* - * If there's only a single divisor digit, we can use a fast path (cf. - * Knuth section 4.3.1 exercise 16). - */ - divisor1 = divisor[1]; - carry = 0; - for (i = 0; i < res_ndigits; i++) - { - carry = carry * NBASE + dividend[i + 1]; - res_digits[i] = carry / divisor1; - carry = carry % divisor1; - } - } - else - { /* * The full multiple-place algorithm is taken from Knuth volume 2, * Algorithm 4.3.1D. @@ -8659,7 +8669,6 @@ div_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result, /* And we're done with this quotient digit */ res_digits[j] = qhat; } - } pfree(dividend); @@ -8735,8 +8744,33 @@ div_var_fast(const NumericVar *var1, const NumericVar *var2, errmsg("division by zero"))); /* - * Now result zero check + * If the divisor has just one or two digits, delegate to div_var_int(), + * which uses fast short division. */ + if (var2ndigits <= 2) + { + int idivisor; + int idivisor_weight; + + idivisor = var2->digits[0]; + idivisor_weight = var2->weight; + if (var2ndigits == 2) + { + idivisor = idivisor * NBASE + var2->digits[1]; + idivisor_weight--; + } + if (var2->sign == NUMERIC_NEG) + idivisor = -idivisor; + + div_var_int(var1, idivisor, idivisor_weight, result, rscale, round); + return; + } + + /* + * Otherwise, perform full long division. + */ + + /* Result zero check */ if (var1ndigits == 0) { zero_var(result); @@ -9008,6 +9042,118 @@ div_var_fast(const NumericVar *var1, const NumericVar *var2, } +/* + * div_var_int() - + * + * Divide a numeric variable by a 32-bit integer with the specified weight. + * The quotient var / (ival * NBASE^ival_weight) is stored in result. + */ +static void +div_var_int(const NumericVar *var, int ival, int ival_weight, + NumericVar *result, int rscale, bool round) +{ + NumericDigit *var_digits = var->digits; + int var_ndigits = var->ndigits; + int res_sign; + int res_weight; + int res_ndigits; + NumericDigit *res_buf; + NumericDigit *res_digits; + uint32 divisor; + int i; + + /* Guard against division by zero */ + if (ival == 0) + ereport(ERROR, + errcode(ERRCODE_DIVISION_BY_ZERO), + errmsg("division by zero")); + + /* Result zero check */ + if (var_ndigits == 0) + { + zero_var(result); + result->dscale = rscale; + return; + } + + /* + * Determine the result sign, weight and number of digits to calculate. + * The weight figured here is correct if the emitted quotient has no + * leading zero digits; otherwise strip_var() will fix things up. + */ + if (var->sign == NUMERIC_POS) + res_sign = ival > 0 ? NUMERIC_POS : NUMERIC_NEG; + else + res_sign = ival > 0 ? NUMERIC_NEG : NUMERIC_POS; + res_weight = var->weight - ival_weight; + /* The number of accurate result digits we need to produce: */ + res_ndigits = res_weight + 1 + (rscale + DEC_DIGITS - 1) / DEC_DIGITS; + /* ... but always at least 1 */ + res_ndigits = Max(res_ndigits, 1); + /* If rounding needed, figure one more digit to ensure correct result */ + if (round) + res_ndigits++; + + res_buf = digitbuf_alloc(res_ndigits + 1); + res_buf[0] = 0; /* spare digit for later rounding */ + res_digits = res_buf + 1; + + /* + * Now compute the quotient digits. This is the short division algorithm + * described in Knuth volume 2, section 4.3.1 exercise 16, except that we + * allow the divisor to exceed the internal base. + * + * In this algorithm, the carry from one digit to the next is at most + * divisor - 1. Therefore, while processing the next digit, carry may + * become as large as divisor * NBASE - 1, and so it requires a 64-bit + * integer if this exceeds UINT_MAX. + */ + divisor = Abs(ival); + + if (divisor <= UINT_MAX / NBASE) + { + /* carry cannot overflow 32 bits */ + uint32 carry = 0; + + for (i = 0; i < res_ndigits; i++) + { + carry = carry * NBASE + (i < var_ndigits ? var_digits[i] : 0); + res_digits[i] = (NumericDigit) (carry / divisor); + carry = carry % divisor; + } + } + else + { + /* carry may exceed 32 bits */ + uint64 carry = 0; + + for (i = 0; i < res_ndigits; i++) + { + carry = carry * NBASE + (i < var_ndigits ? var_digits[i] : 0); + res_digits[i] = (NumericDigit) (carry / divisor); + carry = carry % divisor; + } + } + + /* Store the quotient in result */ + digitbuf_free(result->buf); + result->ndigits = res_ndigits; + result->buf = res_buf; + result->digits = res_digits; + result->weight = res_weight; + result->sign = res_sign; + + /* Round or truncate to target rscale (and set result->dscale) */ + if (round) + round_var(result, rscale); + else + trunc_var(result, rscale); + + /* Strip leading/trailing zeroes */ + strip_var(result); +} + + /* * Default scale selection for division * @@ -9783,7 +9929,7 @@ exp_var(const NumericVar *arg, NumericVar *result, int rscale) { NumericVar x; NumericVar elem; - NumericVar ni; + int ni; double val; int dweight; int ndiv2; @@ -9792,7 +9938,6 @@ exp_var(const NumericVar *arg, NumericVar *result, int rscale) init_var(&x); init_var(&elem); - init_var(&ni); set_var_from_var(arg, &x); @@ -9820,15 +9965,13 @@ exp_var(const NumericVar *arg, NumericVar *result, int rscale) /* * Reduce x to the range -0.01 <= x <= 0.01 (approximately) by dividing by - * 2^n, to improve the convergence rate of the Taylor series. + * 2^ndiv2, to improve the convergence rate of the Taylor series. + * + * Note that the overflow check above ensures that Abs(x) < 6000, which + * means that ndiv2 <= 20 here. */ if (Abs(val) > 0.01) { - NumericVar tmp; - - init_var(&tmp); - set_var_from_var(&const_two, &tmp); - ndiv2 = 1; val /= 2; @@ -9836,13 +9979,10 @@ exp_var(const NumericVar *arg, NumericVar *result, int rscale) { ndiv2++; val /= 2; - add_var(&tmp, &tmp, &tmp); } local_rscale = x.dscale + ndiv2; - div_var_fast(&x, &tmp, &x, local_rscale, true); - - free_var(&tmp); + div_var_int(&x, 1 << ndiv2, 0, &x, local_rscale, true); } else ndiv2 = 0; @@ -9870,16 +10010,16 @@ exp_var(const NumericVar *arg, NumericVar *result, int rscale) add_var(&const_one, &x, result); mul_var(&x, &x, &elem, local_rscale); - set_var_from_var(&const_two, &ni); - div_var_fast(&elem, &ni, &elem, local_rscale, true); + ni = 2; + div_var_int(&elem, ni, 0, &elem, local_rscale, true); while (elem.ndigits != 0) { add_var(result, &elem, result); mul_var(&elem, &x, &elem, local_rscale); - add_var(&ni, &const_one, &ni); - div_var_fast(&elem, &ni, &elem, local_rscale, true); + ni++; + div_var_int(&elem, ni, 0, &elem, local_rscale, true); } /* @@ -9899,7 +10039,6 @@ exp_var(const NumericVar *arg, NumericVar *result, int rscale) free_var(&x); free_var(&elem); - free_var(&ni); } @@ -9993,7 +10132,7 @@ ln_var(const NumericVar *arg, NumericVar *result, int rscale) { NumericVar x; NumericVar xx; - NumericVar ni; + int ni; NumericVar elem; NumericVar fact; int nsqrt; @@ -10012,7 +10151,6 @@ ln_var(const NumericVar *arg, NumericVar *result, int rscale) init_var(&x); init_var(&xx); - init_var(&ni); init_var(&elem); init_var(&fact); @@ -10073,13 +10211,13 @@ ln_var(const NumericVar *arg, NumericVar *result, int rscale) set_var_from_var(result, &xx); mul_var(result, result, &x, local_rscale); - set_var_from_var(&const_one, &ni); + ni = 1; for (;;) { - add_var(&ni, &const_two, &ni); + ni += 2; mul_var(&xx, &x, &xx, local_rscale); - div_var_fast(&xx, &ni, &elem, local_rscale, true); + div_var_int(&xx, ni, 0, &elem, local_rscale, true); if (elem.ndigits == 0) break; @@ -10095,7 +10233,6 @@ ln_var(const NumericVar *arg, NumericVar *result, int rscale) free_var(&x); free_var(&xx); - free_var(&ni); free_var(&elem); free_var(&fact); } From 667726fbe50f21d7d3ce5d5c5949a45c2496b60f Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 28 Feb 2022 10:53:56 +0900 Subject: [PATCH 064/772] pg_stat_statements: Remove unnecessary call to GetUserId() The same is done a couple of lines above, so there is no need for the same, extra, call. Author: Dong Wook Lee Reviewed-by: Julien Rouhaud Discussion: https://postgr.es/m/CAAcBya+szDd1Y6dJU4_dbH_Ye3=G=8O1oQGG01kv3Tpie7wELQ@mail.gmail.com --- contrib/pg_stat_statements/pg_stat_statements.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 38d92a89cc..d803253cea 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -1508,7 +1508,7 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, pgssEntry *entry; /* Superusers or members of pg_read_all_stats members are allowed */ - is_allowed_role = is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS); + is_allowed_role = is_member_of_role(userid, ROLE_PG_READ_ALL_STATS); /* hash table must exist already */ if (!pgss || !pgss_hash) From fbee60f6a4ff2561f5a5af23959a29967f53fbde Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 22 Feb 2022 13:42:38 +0100 Subject: [PATCH 065/772] Improve some psql test code Split psql_like() into two functions psql_like() and psql_fails_like() and make them mirror the existing command_like() and command_fails_like() more closely. In particular, follow the universal convention that the test name is the last argument. Discussion: https://www.postgresql.org/message-id/3199e176-424e-1bef-f180-c1548466c2da@enterprisedb.com --- src/bin/psql/t/001_basic.pl | 59 ++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl index ba3dd846ba..f416e0ab5e 100644 --- a/src/bin/psql/t/001_basic.pl +++ b/src/bin/psql/t/001_basic.pl @@ -12,40 +12,36 @@ program_version_ok('psql'); program_options_handling_ok('psql'); -my ($stdout, $stderr); -my $result; - -# Execute a psql command and check its result patterns. +# Execute a psql command and check its output. sub psql_like { local $Test::Builder::Level = $Test::Builder::Level + 1; - my $node = shift; - my $test_name = shift; - my $query = shift; - my $expected_stdout = shift; - my $expected_stderr = shift; + my ($node, $sql, $expected_stdout, $test_name) = @_; + + my ($ret, $stdout, $stderr) = $node->psql('postgres', $sql); + + is($ret, 0, "$test_name: exit code 0"); + is($stderr, '', "$test_name: no stderr"); + like($stdout, $expected_stdout, "$test_name: matches"); + + return; +} + +# Execute a psql command and check that it fails and check the stderr. +sub psql_fails_like +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; - die "cannot specify both expected stdout and stderr here" - if (defined($expected_stdout) && defined($expected_stderr)); + my ($node, $sql, $expected_stderr, $test_name) = @_; # Use the context of a WAL sender, some of the tests rely on that. my ($ret, $stdout, $stderr) = $node->psql( - 'postgres', $query, - on_error_die => 0, + 'postgres', $sql, replication => 'database'); - if (defined($expected_stdout)) - { - is($ret, 0, "$test_name: expected result code"); - is($stderr, '', "$test_name: no stderr"); - like($stdout, $expected_stdout, "$test_name: stdout matches"); - } - if (defined($expected_stderr)) - { - isnt($ret, 0, "$test_name: expected result code"); - like($stderr, $expected_stderr, "$test_name: stderr matches"); - } + isnt($ret, 0, "$test_name: exit code not 0"); + like($stderr, $expected_stderr, "$test_name: matches"); return; } @@ -53,6 +49,9 @@ sub psql_like # test --help=foo, analogous to program_help_ok() foreach my $arg (qw(commands variables)) { + my ($stdout, $stderr); + my $result; + $result = IPC::Run::run [ 'psql', "--help=$arg" ], '>', \$stdout, '2>', \$stderr; ok($result, "psql --help=$arg exit code 0"); @@ -70,15 +69,15 @@ sub psql_like }); $node->start; -psql_like($node, '\copyright', '\copyright', qr/Copyright/, undef); -psql_like($node, '\help without arguments', '\help', qr/ALTER/, undef); -psql_like($node, '\help with argument', '\help SELECT', qr/SELECT/, undef); +psql_like($node, '\copyright', qr/Copyright/, '\copyright'); +psql_like($node, '\help', qr/ALTER/, '\help without arguments'); +psql_like($node, '\help SELECT', qr/SELECT/, '\help with argument'); # Test clean handling of unsupported replication command responses -psql_like( +psql_fails_like( $node, - 'handling of unexpected PQresultStatus', 'START_REPLICATION 0/0', - undef, qr/unexpected PQresultStatus: 8$/); + qr/unexpected PQresultStatus: 8$/, + 'handling of unexpected PQresultStatus'); done_testing(); From b15f254466aefbabcbed001929f6e09db59fd158 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 28 Feb 2022 11:31:30 -0500 Subject: [PATCH 066/772] Adjust interaction of libpq pipeline mode with errorMessage resets. Since commit ffa2e4670, libpq resets conn->errorMessage only when starting a new query. However, the later introduction of pipelining requires a further refinement: the "start of query" isn't necessarily when it's submitted to PQsendQueryStart. If we clear at that point then we risk dropping text for an error that the application has not noticed yet. Instead, when queuing a query while a previous query is still in flight, leave errorMessage alone; reset it when we begin to process the next query in pqPipelineProcessQueue. Perhaps this should be back-patched to v14 where ffa2e4670 came in. However I'm uncertain about whether it interacts with 618c16707. In the absence of user complaints, leave v14 alone. Discussion: https://postgr.es/m/1421785.1645723238@sss.pgh.pa.us --- src/interfaces/libpq/fe-exec.c | 51 +++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index 45dddaf556..0c39bc9abf 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -1380,10 +1380,7 @@ pqAppendCmdQueueEntry(PGconn *conn, PGcmdQueueEntry *entry) * state, we don't have to do anything. */ if (conn->asyncStatus == PGASYNC_IDLE) - { - pqClearConnErrorState(conn); pqPipelineProcessQueue(conn); - } break; } } @@ -1730,8 +1727,10 @@ PQsendQueryStart(PGconn *conn, bool newQuery) /* * If this is the beginning of a query cycle, reset the error state. + * However, in pipeline mode with something already queued, the error + * buffer belongs to that command and we shouldn't clear it. */ - if (newQuery) + if (newQuery && conn->cmd_queue_head == NULL) pqClearConnErrorState(conn); /* Don't try to send if we know there's no live connection. */ @@ -2149,11 +2148,8 @@ PQgetResult(PGconn *conn) /* * We're about to return the NULL that terminates the round of * results from the current query; prepare to send the results - * of the next query when we're called next. Also, since this - * is the start of the results of the next query, clear any - * prior error message. + * of the next query when we're called next. */ - pqClearConnErrorState(conn); pqPipelineProcessQueue(conn); } break; @@ -2362,6 +2358,14 @@ PQexecStart(PGconn *conn) if (!conn) return false; + /* + * Since this is the beginning of a query cycle, reset the error state. + * However, in pipeline mode with something already queued, the error + * buffer belongs to that command and we shouldn't clear it. + */ + if (conn->cmd_queue_head == NULL) + pqClearConnErrorState(conn); + if (conn->pipelineStatus != PQ_PIPELINE_OFF) { appendPQExpBufferStr(&conn->errorMessage, @@ -2369,11 +2373,6 @@ PQexecStart(PGconn *conn) return false; } - /* - * Since this is the beginning of a query cycle, reset the error state. - */ - pqClearConnErrorState(conn); - /* * Silently discard any prior query result that application didn't eat. * This is probably poor design, but it's here for backward compatibility. @@ -2928,8 +2927,11 @@ PQfn(PGconn *conn, /* * Since this is the beginning of a query cycle, reset the error state. + * However, in pipeline mode with something already queued, the error + * buffer belongs to that command and we shouldn't clear it. */ - pqClearConnErrorState(conn); + if (conn->cmd_queue_head == NULL) + pqClearConnErrorState(conn); if (conn->pipelineStatus != PQ_PIPELINE_OFF) { @@ -3099,6 +3101,12 @@ pqPipelineProcessQueue(PGconn *conn) conn->cmd_queue_head == NULL) return; + /* + * Reset the error state. This and the next couple of steps correspond to + * what PQsendQueryStart didn't do for this query. + */ + pqClearConnErrorState(conn); + /* Initialize async result-accumulation state */ pqClearAsyncResult(conn); @@ -3809,9 +3817,11 @@ PQsetnonblocking(PGconn *conn, int arg) * behavior. this is ok because either they are making a transition _from_ * or _to_ blocking mode, either way we can block them. * - * Clear error state in case pqFlush adds to it. + * Clear error state in case pqFlush adds to it, unless we're actively + * pipelining, in which case it seems best not to. */ - pqClearConnErrorState(conn); + if (conn->cmd_queue_head == NULL) + pqClearConnErrorState(conn); /* if we are going from blocking to non-blocking flush here */ if (pqFlush(conn)) @@ -4003,7 +4013,8 @@ PQescapeStringConn(PGconn *conn, return 0; } - pqClearConnErrorState(conn); + if (conn->cmd_queue_head == NULL) + pqClearConnErrorState(conn); return PQescapeStringInternal(conn, to, from, length, error, conn->client_encoding, @@ -4041,7 +4052,8 @@ PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident) if (!conn) return NULL; - pqClearConnErrorState(conn); + if (conn->cmd_queue_head == NULL) + pqClearConnErrorState(conn); /* Scan the string for characters that must be escaped. */ for (s = str; (s - str) < len && *s != '\0'; ++s) @@ -4306,7 +4318,8 @@ PQescapeByteaConn(PGconn *conn, if (!conn) return NULL; - pqClearConnErrorState(conn); + if (conn->cmd_queue_head == NULL) + pqClearConnErrorState(conn); return PQescapeByteaInternal(conn, from, from_length, to_length, conn->std_strings, From 2e517818f4af4abe93bf56442469944544f10d4b Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 28 Feb 2022 12:45:36 -0500 Subject: [PATCH 067/772] Fix SPI's handling of errors during transaction commit. SPI_commit previously left it up to the caller to recover from any error occurring during commit. Since that's complicated and requires use of low-level xact.c facilities, it's not too surprising that no caller got it right. Let's move the responsibility for cleanup into spi.c. Doing that requires redefining SPI_commit as starting a new transaction, so that it becomes equivalent to SPI_commit_and_chain except that you get default transaction characteristics instead of preserving the prior transaction's characteristics. We can make this pretty transparent API-wise by redefining SPI_start_transaction() as a no-op. Callers that expect to do something in between might be surprised, but available evidence is that no callers do so. Having made that API redefinition, we can fix this mess by having SPI_commit[_and_chain] trap errors and start a new, clean transaction before re-throwing the error. Likewise for SPI_rollback[_and_chain]. Some cleanup is also needed in AtEOXact_SPI, which was nowhere near smart enough to deal with SPI contexts nested inside a committing context. While plperl and pltcl need no changes beyond removing their now-useless SPI_start_transaction() calls, plpython needs some more work because it hadn't gotten the memo about catching commit/rollback errors in the first place. Such an error resulted in longjmp'ing out of the Python interpreter, which leaks Python stack entries at present and is reported to crash Python 3.11 altogether. Add the missing logic to catch such errors and convert them into Python exceptions. We are probably going to have to back-patch this once Python 3.11 ships, but it's a sufficiently basic change that I'm a bit nervous about doing so immediately. Let's let it bake awhile in HEAD first. Peter Eisentraut and Tom Lane Discussion: https://postgr.es/m/3375ffd8-d71c-2565-e348-a597d6e739e3@enterprisedb.com Discussion: https://postgr.es/m/17416-ed8fe5d7213d6c25@postgresql.org --- doc/src/sgml/spi.sgml | 51 ++-- src/backend/executor/spi.c | 221 +++++++++++++----- src/backend/tcop/postgres.c | 2 - src/backend/utils/mmgr/portalmem.c | 2 +- src/include/executor/spi.h | 1 - src/pl/plperl/expected/plperl_transaction.out | 48 ++++ src/pl/plperl/plperl.c | 2 - src/pl/plperl/sql/plperl_transaction.sql | 32 +++ src/pl/plpgsql/src/pl_exec.c | 6 - .../expected/plpython_transaction.out | 67 +++++- src/pl/plpython/plpy_plpymodule.c | 30 --- src/pl/plpython/plpy_spi.c | 94 ++++++++ src/pl/plpython/plpy_spi.h | 3 + src/pl/plpython/sql/plpython_transaction.sql | 30 +++ src/pl/tcl/expected/pltcl_transaction.out | 49 ++++ src/pl/tcl/pltcl.c | 2 - src/pl/tcl/sql/pltcl_transaction.sql | 37 +++ 17 files changed, 535 insertions(+), 142 deletions(-) diff --git a/doc/src/sgml/spi.sgml b/doc/src/sgml/spi.sgml index d710e2d0df..7581661fc4 100644 --- a/doc/src/sgml/spi.sgml +++ b/doc/src/sgml/spi.sgml @@ -99,10 +99,9 @@ int SPI_connect_ext(int options) Sets the SPI connection to be nonatomic, which - means that transaction control calls SPI_commit, - SPI_rollback, and - SPI_start_transaction are allowed. Otherwise, - calling these functions will result in an immediate error. + means that transaction control calls (SPI_commit, + SPI_rollback) are allowed. Otherwise, + calling those functions will result in an immediate error. @@ -5040,15 +5039,17 @@ void SPI_commit_and_chain(void) SPI_commit commits the current transaction. It is approximately equivalent to running the SQL - command COMMIT. After a transaction is committed, a new - transaction has to be started - using SPI_start_transaction before further database - actions can be executed. + command COMMIT. After the transaction is committed, a + new transaction is automatically started using default transaction + characteristics, so that the caller can continue using SPI facilities. + If there is a failure during commit, the current transaction is instead + rolled back and a new transaction is started, after which the error is + thrown in the usual way. - SPI_commit_and_chain is the same, but a new - transaction is immediately started with the same transaction + SPI_commit_and_chain is the same, but the new + transaction is started with the same transaction characteristics as the just finished one, like with the SQL command COMMIT AND CHAIN. @@ -5093,14 +5094,13 @@ void SPI_rollback_and_chain(void) SPI_rollback rolls back the current transaction. It is approximately equivalent to running the SQL - command ROLLBACK. After a transaction is rolled back, a - new transaction has to be started - using SPI_start_transaction before further database - actions can be executed. + command ROLLBACK. After the transaction is rolled back, + a new transaction is automatically started using default transaction + characteristics, so that the caller can continue using SPI facilities. - SPI_rollback_and_chain is the same, but a new - transaction is immediately started with the same transaction + SPI_rollback_and_chain is the same, but the new + transaction is started with the same transaction characteristics as the just finished one, like with the SQL command ROLLBACK AND CHAIN. @@ -5124,7 +5124,7 @@ void SPI_rollback_and_chain(void) SPI_start_transaction - start a new transaction + obsolete function @@ -5137,17 +5137,12 @@ void SPI_start_transaction(void) Description - SPI_start_transaction starts a new transaction. It - can only be called after SPI_commit - or SPI_rollback, as there is no transaction active at - that point. Normally, when an SPI-using procedure is called, there is already a - transaction active, so attempting to start another one before closing out - the current one will result in an error. - - - - This function can only be executed if the SPI connection has been set as - nonatomic in the call to SPI_connect_ext. + SPI_start_transaction does nothing, and exists + only for code compatibility with + earlier PostgreSQL releases. It used to + be required after calling SPI_commit + or SPI_rollback, but now those functions start + a new transaction automatically. diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index c93f90de9b..7971050746 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -156,7 +156,8 @@ SPI_connect_ext(int options) * XXX It could be better to use PortalContext as the parent context in * all cases, but we may not be inside a portal (consider deferred-trigger * execution). Perhaps CurTransactionContext could be an option? For now - * it doesn't matter because we clean up explicitly in AtEOSubXact_SPI(). + * it doesn't matter because we clean up explicitly in AtEOSubXact_SPI(); + * but see also AtEOXact_SPI(). */ _SPI_current->procCxt = AllocSetContextCreate(_SPI_current->atomic ? TopTransactionContext : PortalContext, "SPI Proc", @@ -214,13 +215,13 @@ SPI_finish(void) return SPI_OK_FINISH; } +/* + * SPI_start_transaction is a no-op, kept for backwards compatibility. + * SPI callers are *always* inside a transaction. + */ void SPI_start_transaction(void) { - MemoryContext oldcontext = CurrentMemoryContext; - - StartTransactionCommand(); - MemoryContextSwitchTo(oldcontext); } static void @@ -228,6 +229,12 @@ _SPI_commit(bool chain) { MemoryContext oldcontext = CurrentMemoryContext; + /* + * Complain if we are in a context that doesn't permit transaction + * termination. (Note: here and _SPI_rollback should be the only places + * that throw ERRCODE_INVALID_TRANSACTION_TERMINATION, so that callers can + * test for that with security that they know what happened.) + */ if (_SPI_current->atomic) ereport(ERROR, (errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION), @@ -240,40 +247,74 @@ _SPI_commit(bool chain) * top-level transaction in such a block violates that idea. A future PL * implementation might have different ideas about this, in which case * this restriction would have to be refined or the check possibly be - * moved out of SPI into the PLs. + * moved out of SPI into the PLs. Note however that the code below relies + * on not being within a subtransaction. */ if (IsSubTransaction()) ereport(ERROR, (errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION), errmsg("cannot commit while a subtransaction is active"))); - /* - * Hold any pinned portals that any PLs might be using. We have to do - * this before changing transaction state, since this will run - * user-defined code that might throw an error. - */ - HoldPinnedPortals(); + /* XXX this ain't re-entrant enough for my taste */ + if (chain) + SaveTransactionCharacteristics(); - /* Start the actual commit */ - _SPI_current->internal_xact = true; + /* Catch any error occurring during the COMMIT */ + PG_TRY(); + { + /* Protect current SPI stack entry against deletion */ + _SPI_current->internal_xact = true; - /* Release snapshots associated with portals */ - ForgetPortalSnapshots(); + /* + * Hold any pinned portals that any PLs might be using. We have to do + * this before changing transaction state, since this will run + * user-defined code that might throw an error. + */ + HoldPinnedPortals(); - if (chain) - SaveTransactionCharacteristics(); + /* Release snapshots associated with portals */ + ForgetPortalSnapshots(); - CommitTransactionCommand(); + /* Do the deed */ + CommitTransactionCommand(); - if (chain) - { + /* Immediately start a new transaction */ StartTransactionCommand(); - RestoreTransactionCharacteristics(); + if (chain) + RestoreTransactionCharacteristics(); + + MemoryContextSwitchTo(oldcontext); + + _SPI_current->internal_xact = false; } + PG_CATCH(); + { + ErrorData *edata; - MemoryContextSwitchTo(oldcontext); + /* Save error info in caller's context */ + MemoryContextSwitchTo(oldcontext); + edata = CopyErrorData(); + FlushErrorState(); - _SPI_current->internal_xact = false; + /* + * Abort the failed transaction. If this fails too, we'll just + * propagate the error out ... there's not that much we can do. + */ + AbortCurrentTransaction(); + + /* ... and start a new one */ + StartTransactionCommand(); + if (chain) + RestoreTransactionCharacteristics(); + + MemoryContextSwitchTo(oldcontext); + + _SPI_current->internal_xact = false; + + /* Now that we've cleaned up the transaction, re-throw the error */ + ReThrowError(edata); + } + PG_END_TRY(); } void @@ -293,6 +334,7 @@ _SPI_rollback(bool chain) { MemoryContext oldcontext = CurrentMemoryContext; + /* see under SPI_commit() */ if (_SPI_current->atomic) ereport(ERROR, (errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION), @@ -304,34 +346,68 @@ _SPI_rollback(bool chain) (errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION), errmsg("cannot roll back while a subtransaction is active"))); - /* - * Hold any pinned portals that any PLs might be using. We have to do - * this before changing transaction state, since this will run - * user-defined code that might throw an error, and in any case couldn't - * be run in an already-aborted transaction. - */ - HoldPinnedPortals(); + /* XXX this ain't re-entrant enough for my taste */ + if (chain) + SaveTransactionCharacteristics(); - /* Start the actual rollback */ - _SPI_current->internal_xact = true; + /* Catch any error occurring during the ROLLBACK */ + PG_TRY(); + { + /* Protect current SPI stack entry against deletion */ + _SPI_current->internal_xact = true; - /* Release snapshots associated with portals */ - ForgetPortalSnapshots(); + /* + * Hold any pinned portals that any PLs might be using. We have to do + * this before changing transaction state, since this will run + * user-defined code that might throw an error, and in any case + * couldn't be run in an already-aborted transaction. + */ + HoldPinnedPortals(); - if (chain) - SaveTransactionCharacteristics(); + /* Release snapshots associated with portals */ + ForgetPortalSnapshots(); - AbortCurrentTransaction(); + /* Do the deed */ + AbortCurrentTransaction(); - if (chain) - { + /* Immediately start a new transaction */ StartTransactionCommand(); - RestoreTransactionCharacteristics(); + if (chain) + RestoreTransactionCharacteristics(); + + MemoryContextSwitchTo(oldcontext); + + _SPI_current->internal_xact = false; } + PG_CATCH(); + { + ErrorData *edata; - MemoryContextSwitchTo(oldcontext); + /* Save error info in caller's context */ + MemoryContextSwitchTo(oldcontext); + edata = CopyErrorData(); + FlushErrorState(); - _SPI_current->internal_xact = false; + /* + * Try again to abort the failed transaction. If this fails too, + * we'll just propagate the error out ... there's not that much we can + * do. + */ + AbortCurrentTransaction(); + + /* ... and start a new one */ + StartTransactionCommand(); + if (chain) + RestoreTransactionCharacteristics(); + + MemoryContextSwitchTo(oldcontext); + + _SPI_current->internal_xact = false; + + /* Now that we've cleaned up the transaction, re-throw the error */ + ReThrowError(edata); + } + PG_END_TRY(); } void @@ -346,38 +422,55 @@ SPI_rollback_and_chain(void) _SPI_rollback(true); } -/* - * Clean up SPI state. Called on transaction end (of non-SPI-internal - * transactions) and when returning to the main loop on error. - */ -void -SPICleanup(void) -{ - _SPI_current = NULL; - _SPI_connected = -1; - /* Reset API global variables, too */ - SPI_processed = 0; - SPI_tuptable = NULL; - SPI_result = 0; -} - /* * Clean up SPI state at transaction commit or abort. */ void AtEOXact_SPI(bool isCommit) { - /* Do nothing if the transaction end was initiated by SPI. */ - if (_SPI_current && _SPI_current->internal_xact) - return; + bool found = false; - if (isCommit && _SPI_connected != -1) + /* + * Pop stack entries, stopping if we find one marked internal_xact (that + * one belongs to the caller of SPI_commit or SPI_abort). + */ + while (_SPI_connected >= 0) + { + _SPI_connection *connection = &(_SPI_stack[_SPI_connected]); + + if (connection->internal_xact) + break; + + found = true; + + /* + * We need not release the procedure's memory contexts explicitly, as + * they'll go away automatically when their parent context does; see + * notes in SPI_connect_ext. + */ + + /* + * Restore outer global variables and pop the stack entry. Unlike + * SPI_finish(), we don't risk switching to memory contexts that might + * be already gone. + */ + SPI_processed = connection->outer_processed; + SPI_tuptable = connection->outer_tuptable; + SPI_result = connection->outer_result; + + _SPI_connected--; + if (_SPI_connected < 0) + _SPI_current = NULL; + else + _SPI_current = &(_SPI_stack[_SPI_connected]); + } + + /* We should only find entries to pop during an ABORT. */ + if (found && isCommit) ereport(WARNING, (errcode(ERRCODE_WARNING), errmsg("transaction left non-empty SPI stack"), errhint("Check for missing \"SPI_finish\" calls."))); - - SPICleanup(); } /* diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 3c7d08209f..34c13a1113 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -43,7 +43,6 @@ #include "commands/async.h" #include "commands/prepare.h" #include "common/pg_prng.h" -#include "executor/spi.h" #include "jit/jit.h" #include "libpq/libpq.h" #include "libpq/pqformat.h" @@ -4263,7 +4262,6 @@ PostgresMain(const char *dbname, const char *username) WalSndErrorCleanup(); PortalErrorCleanup(); - SPICleanup(); /* * We can't release replication slots inside AbortTransaction() as we diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c index 21ad87c024..afc03682d9 100644 --- a/src/backend/utils/mmgr/portalmem.c +++ b/src/backend/utils/mmgr/portalmem.c @@ -1261,7 +1261,7 @@ HoldPinnedPortals(void) */ if (portal->strategy != PORTAL_ONE_SELECT) ereport(ERROR, - (errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("cannot perform transaction commands inside a cursor loop that is not read-only"))); /* Verify it's in a suitable state to be held */ diff --git a/src/include/executor/spi.h b/src/include/executor/spi.h index e20e7df780..6ec3851444 100644 --- a/src/include/executor/spi.h +++ b/src/include/executor/spi.h @@ -205,7 +205,6 @@ extern void SPI_commit_and_chain(void); extern void SPI_rollback(void); extern void SPI_rollback_and_chain(void); -extern void SPICleanup(void); extern void AtEOXact_SPI(bool isCommit); extern void AtEOSubXact_SPI(bool isCommit, SubTransactionId mySubid); extern bool SPI_inside_nonatomic_context(void); diff --git a/src/pl/plperl/expected/plperl_transaction.out b/src/pl/plperl/expected/plperl_transaction.out index 7ca0ef35fb..da4283cbce 100644 --- a/src/pl/plperl/expected/plperl_transaction.out +++ b/src/pl/plperl/expected/plperl_transaction.out @@ -192,5 +192,53 @@ SELECT * FROM pg_cursors; ------+-----------+-------------+-----------+---------------+--------------- (0 rows) +-- check handling of an error during COMMIT +CREATE TABLE testpk (id int PRIMARY KEY); +CREATE TABLE testfk(f1 int REFERENCES testpk DEFERRABLE INITIALLY DEFERRED); +DO LANGUAGE plperl $$ +# this insert will fail during commit: +spi_exec_query("INSERT INTO testfk VALUES (0)"); +spi_commit(); +elog(WARNING, 'should not get here'); +$$; +ERROR: insert or update on table "testfk" violates foreign key constraint "testfk_f1_fkey" at line 4. +CONTEXT: PL/Perl anonymous code block +SELECT * FROM testpk; + id +---- +(0 rows) + +SELECT * FROM testfk; + f1 +---- +(0 rows) + +DO LANGUAGE plperl $$ +# this insert will fail during commit: +spi_exec_query("INSERT INTO testfk VALUES (0)"); +eval { + spi_commit(); +}; +if ($@) { + elog(INFO, $@); +} +# these inserts should work: +spi_exec_query("INSERT INTO testpk VALUES (1)"); +spi_exec_query("INSERT INTO testfk VALUES (1)"); +$$; +INFO: insert or update on table "testfk" violates foreign key constraint "testfk_f1_fkey" at line 5. + +SELECT * FROM testpk; + id +---- + 1 +(1 row) + +SELECT * FROM testfk; + f1 +---- + 1 +(1 row) + DROP TABLE test1; DROP TABLE test2; diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 81bb480bc2..edb93ec1c4 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -3986,7 +3986,6 @@ plperl_spi_commit(void) PG_TRY(); { SPI_commit(); - SPI_start_transaction(); } PG_CATCH(); { @@ -4013,7 +4012,6 @@ plperl_spi_rollback(void) PG_TRY(); { SPI_rollback(); - SPI_start_transaction(); } PG_CATCH(); { diff --git a/src/pl/plperl/sql/plperl_transaction.sql b/src/pl/plperl/sql/plperl_transaction.sql index 0a60799805..d10c8bee89 100644 --- a/src/pl/plperl/sql/plperl_transaction.sql +++ b/src/pl/plperl/sql/plperl_transaction.sql @@ -159,5 +159,37 @@ SELECT * FROM test1; SELECT * FROM pg_cursors; +-- check handling of an error during COMMIT +CREATE TABLE testpk (id int PRIMARY KEY); +CREATE TABLE testfk(f1 int REFERENCES testpk DEFERRABLE INITIALLY DEFERRED); + +DO LANGUAGE plperl $$ +# this insert will fail during commit: +spi_exec_query("INSERT INTO testfk VALUES (0)"); +spi_commit(); +elog(WARNING, 'should not get here'); +$$; + +SELECT * FROM testpk; +SELECT * FROM testfk; + +DO LANGUAGE plperl $$ +# this insert will fail during commit: +spi_exec_query("INSERT INTO testfk VALUES (0)"); +eval { + spi_commit(); +}; +if ($@) { + elog(INFO, $@); +} +# these inserts should work: +spi_exec_query("INSERT INTO testpk VALUES (1)"); +spi_exec_query("INSERT INTO testfk VALUES (1)"); +$$; + +SELECT * FROM testpk; +SELECT * FROM testfk; + + DROP TABLE test1; DROP TABLE test2; diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 9674c29250..915139378e 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -4916,10 +4916,7 @@ exec_stmt_commit(PLpgSQL_execstate *estate, PLpgSQL_stmt_commit *stmt) if (stmt->chain) SPI_commit_and_chain(); else - { SPI_commit(); - SPI_start_transaction(); - } /* * We need to build new simple-expression infrastructure, since the old @@ -4943,10 +4940,7 @@ exec_stmt_rollback(PLpgSQL_execstate *estate, PLpgSQL_stmt_rollback *stmt) if (stmt->chain) SPI_rollback_and_chain(); else - { SPI_rollback(); - SPI_start_transaction(); - } /* * We need to build new simple-expression infrastructure, since the old diff --git a/src/pl/plpython/expected/plpython_transaction.out b/src/pl/plpython/expected/plpython_transaction.out index 14152993c7..72d1e45a76 100644 --- a/src/pl/plpython/expected/plpython_transaction.out +++ b/src/pl/plpython/expected/plpython_transaction.out @@ -55,8 +55,11 @@ for i in range(0, 10): return 1 $$; SELECT transaction_test2(); -ERROR: invalid transaction termination -CONTEXT: PL/Python function "transaction_test2" +ERROR: spiexceptions.InvalidTransactionTermination: invalid transaction termination +CONTEXT: Traceback (most recent call last): + PL/Python function "transaction_test2", line 5, in + plpy.commit() +PL/Python function "transaction_test2" SELECT * FROM test1; a | b ---+--- @@ -70,7 +73,7 @@ plpy.execute("CALL transaction_test1()") return 1 $$; SELECT transaction_test3(); -ERROR: spiexceptions.InvalidTransactionTermination: invalid transaction termination +ERROR: spiexceptions.InvalidTransactionTermination: spiexceptions.InvalidTransactionTermination: invalid transaction termination CONTEXT: Traceback (most recent call last): PL/Python function "transaction_test3", line 2, in plpy.execute("CALL transaction_test1()") @@ -88,7 +91,7 @@ plpy.execute("DO LANGUAGE plpythonu $x$ plpy.commit() $x$") return 1 $$; SELECT transaction_test4(); -ERROR: spiexceptions.InvalidTransactionTermination: invalid transaction termination +ERROR: spiexceptions.InvalidTransactionTermination: spiexceptions.InvalidTransactionTermination: invalid transaction termination CONTEXT: Traceback (most recent call last): PL/Python function "transaction_test4", line 2, in plpy.execute("DO LANGUAGE plpythonu $x$ plpy.commit() $x$") @@ -100,8 +103,11 @@ s.enter() plpy.commit() $$; WARNING: forcibly aborting a subtransaction that has not been exited -ERROR: cannot commit while a subtransaction is active -CONTEXT: PL/Python anonymous code block +ERROR: spiexceptions.InvalidTransactionTermination: cannot commit while a subtransaction is active +CONTEXT: Traceback (most recent call last): + PL/Python anonymous code block, line 4, in + plpy.commit() +PL/Python anonymous code block -- commit inside cursor loop CREATE TABLE test2 (x int); INSERT INTO test2 VALUES (0), (1), (2), (3), (4); @@ -191,5 +197,54 @@ SELECT * FROM pg_cursors; ------+-----------+-------------+-----------+---------------+--------------- (0 rows) +-- check handling of an error during COMMIT +CREATE TABLE testpk (id int PRIMARY KEY); +CREATE TABLE testfk(f1 int REFERENCES testpk DEFERRABLE INITIALLY DEFERRED); +DO LANGUAGE plpythonu $$ +# this insert will fail during commit: +plpy.execute("INSERT INTO testfk VALUES (0)") +plpy.commit() +plpy.warning('should not get here') +$$; +ERROR: spiexceptions.ForeignKeyViolation: insert or update on table "testfk" violates foreign key constraint "testfk_f1_fkey" +DETAIL: Key (f1)=(0) is not present in table "testpk". +CONTEXT: Traceback (most recent call last): + PL/Python anonymous code block, line 4, in + plpy.commit() +PL/Python anonymous code block +SELECT * FROM testpk; + id +---- +(0 rows) + +SELECT * FROM testfk; + f1 +---- +(0 rows) + +DO LANGUAGE plpythonu $$ +# this insert will fail during commit: +plpy.execute("INSERT INTO testfk VALUES (0)") +try: + plpy.commit() +except Exception as e: + plpy.info('sqlstate: %s' % (e.sqlstate)) +# these inserts should work: +plpy.execute("INSERT INTO testpk VALUES (1)") +plpy.execute("INSERT INTO testfk VALUES (1)") +$$; +INFO: sqlstate: 23503 +SELECT * FROM testpk; + id +---- + 1 +(1 row) + +SELECT * FROM testfk; + f1 +---- + 1 +(1 row) + DROP TABLE test1; DROP TABLE test2; diff --git a/src/pl/plpython/plpy_plpymodule.c b/src/pl/plpython/plpy_plpymodule.c index 0365acc95b..907f89d153 100644 --- a/src/pl/plpython/plpy_plpymodule.c +++ b/src/pl/plpython/plpy_plpymodule.c @@ -40,8 +40,6 @@ static PyObject *PLy_fatal(PyObject *self, PyObject *args, PyObject *kw); static PyObject *PLy_quote_literal(PyObject *self, PyObject *args); static PyObject *PLy_quote_nullable(PyObject *self, PyObject *args); static PyObject *PLy_quote_ident(PyObject *self, PyObject *args); -static PyObject *PLy_commit(PyObject *self, PyObject *args); -static PyObject *PLy_rollback(PyObject *self, PyObject *args); /* A list of all known exceptions, generated from backend/utils/errcodes.txt */ @@ -577,31 +575,3 @@ PLy_output(volatile int level, PyObject *self, PyObject *args, PyObject *kw) */ Py_RETURN_NONE; } - -static PyObject * -PLy_commit(PyObject *self, PyObject *args) -{ - PLyExecutionContext *exec_ctx = PLy_current_execution_context(); - - SPI_commit(); - SPI_start_transaction(); - - /* was cleared at transaction end, reset pointer */ - exec_ctx->scratch_ctx = NULL; - - Py_RETURN_NONE; -} - -static PyObject * -PLy_rollback(PyObject *self, PyObject *args) -{ - PLyExecutionContext *exec_ctx = PLy_current_execution_context(); - - SPI_rollback(); - SPI_start_transaction(); - - /* was cleared at transaction end, reset pointer */ - exec_ctx->scratch_ctx = NULL; - - Py_RETURN_NONE; -} diff --git a/src/pl/plpython/plpy_spi.c b/src/pl/plpython/plpy_spi.c index 99c1b4f28f..86d70470a7 100644 --- a/src/pl/plpython/plpy_spi.c +++ b/src/pl/plpython/plpy_spi.c @@ -456,6 +456,100 @@ PLy_spi_execute_fetch_result(SPITupleTable *tuptable, uint64 rows, int status) return (PyObject *) result; } +PyObject * +PLy_commit(PyObject *self, PyObject *args) +{ + MemoryContext oldcontext = CurrentMemoryContext; + PLyExecutionContext *exec_ctx = PLy_current_execution_context(); + + PG_TRY(); + { + SPI_commit(); + + /* was cleared at transaction end, reset pointer */ + exec_ctx->scratch_ctx = NULL; + } + PG_CATCH(); + { + ErrorData *edata; + PLyExceptionEntry *entry; + PyObject *exc; + + /* Save error info */ + MemoryContextSwitchTo(oldcontext); + edata = CopyErrorData(); + FlushErrorState(); + + /* was cleared at transaction end, reset pointer */ + exec_ctx->scratch_ctx = NULL; + + /* Look up the correct exception */ + entry = hash_search(PLy_spi_exceptions, &(edata->sqlerrcode), + HASH_FIND, NULL); + + /* + * This could be a custom error code, if that's the case fallback to + * SPIError + */ + exc = entry ? entry->exc : PLy_exc_spi_error; + /* Make Python raise the exception */ + PLy_spi_exception_set(exc, edata); + FreeErrorData(edata); + + return NULL; + } + PG_END_TRY(); + + Py_RETURN_NONE; +} + +PyObject * +PLy_rollback(PyObject *self, PyObject *args) +{ + MemoryContext oldcontext = CurrentMemoryContext; + PLyExecutionContext *exec_ctx = PLy_current_execution_context(); + + PG_TRY(); + { + SPI_rollback(); + + /* was cleared at transaction end, reset pointer */ + exec_ctx->scratch_ctx = NULL; + } + PG_CATCH(); + { + ErrorData *edata; + PLyExceptionEntry *entry; + PyObject *exc; + + /* Save error info */ + MemoryContextSwitchTo(oldcontext); + edata = CopyErrorData(); + FlushErrorState(); + + /* was cleared at transaction end, reset pointer */ + exec_ctx->scratch_ctx = NULL; + + /* Look up the correct exception */ + entry = hash_search(PLy_spi_exceptions, &(edata->sqlerrcode), + HASH_FIND, NULL); + + /* + * This could be a custom error code, if that's the case fallback to + * SPIError + */ + exc = entry ? entry->exc : PLy_exc_spi_error; + /* Make Python raise the exception */ + PLy_spi_exception_set(exc, edata); + FreeErrorData(edata); + + return NULL; + } + PG_END_TRY(); + + Py_RETURN_NONE; +} + /* * Utilities for running SPI functions in subtransactions. * diff --git a/src/pl/plpython/plpy_spi.h b/src/pl/plpython/plpy_spi.h index a5e2e60da7..98ccd21093 100644 --- a/src/pl/plpython/plpy_spi.h +++ b/src/pl/plpython/plpy_spi.h @@ -12,6 +12,9 @@ extern PyObject *PLy_spi_prepare(PyObject *self, PyObject *args); extern PyObject *PLy_spi_execute(PyObject *self, PyObject *args); extern PyObject *PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit); +extern PyObject *PLy_commit(PyObject *self, PyObject *args); +extern PyObject *PLy_rollback(PyObject *self, PyObject *args); + typedef struct PLyExceptionEntry { int sqlstate; /* hash key, must be first */ diff --git a/src/pl/plpython/sql/plpython_transaction.sql b/src/pl/plpython/sql/plpython_transaction.sql index 33b37e5b7f..68588d9fb0 100644 --- a/src/pl/plpython/sql/plpython_transaction.sql +++ b/src/pl/plpython/sql/plpython_transaction.sql @@ -148,5 +148,35 @@ SELECT * FROM test1; SELECT * FROM pg_cursors; +-- check handling of an error during COMMIT +CREATE TABLE testpk (id int PRIMARY KEY); +CREATE TABLE testfk(f1 int REFERENCES testpk DEFERRABLE INITIALLY DEFERRED); + +DO LANGUAGE plpythonu $$ +# this insert will fail during commit: +plpy.execute("INSERT INTO testfk VALUES (0)") +plpy.commit() +plpy.warning('should not get here') +$$; + +SELECT * FROM testpk; +SELECT * FROM testfk; + +DO LANGUAGE plpythonu $$ +# this insert will fail during commit: +plpy.execute("INSERT INTO testfk VALUES (0)") +try: + plpy.commit() +except Exception as e: + plpy.info('sqlstate: %s' % (e.sqlstate)) +# these inserts should work: +plpy.execute("INSERT INTO testpk VALUES (1)") +plpy.execute("INSERT INTO testfk VALUES (1)") +$$; + +SELECT * FROM testpk; +SELECT * FROM testfk; + + DROP TABLE test1; DROP TABLE test2; diff --git a/src/pl/tcl/expected/pltcl_transaction.out b/src/pl/tcl/expected/pltcl_transaction.out index 007204b99a..f557b79138 100644 --- a/src/pl/tcl/expected/pltcl_transaction.out +++ b/src/pl/tcl/expected/pltcl_transaction.out @@ -96,5 +96,54 @@ SELECT * FROM test1; ---+--- (0 rows) +-- check handling of an error during COMMIT +CREATE TABLE testpk (id int PRIMARY KEY); +CREATE TABLE testfk(f1 int REFERENCES testpk DEFERRABLE INITIALLY DEFERRED); +CREATE PROCEDURE transaction_testfk() +LANGUAGE pltcl +AS $$ +# this insert will fail during commit: +spi_exec "INSERT INTO testfk VALUES (0)" +commit +elog WARNING "should not get here" +$$; +CALL transaction_testfk(); +ERROR: insert or update on table "testfk" violates foreign key constraint "testfk_f1_fkey" +SELECT * FROM testpk; + id +---- +(0 rows) + +SELECT * FROM testfk; + f1 +---- +(0 rows) + +CREATE OR REPLACE PROCEDURE transaction_testfk() +LANGUAGE pltcl +AS $$ +# this insert will fail during commit: +spi_exec "INSERT INTO testfk VALUES (0)" +if [catch {commit} msg] { + elog INFO $msg +} +# these inserts should work: +spi_exec "INSERT INTO testpk VALUES (1)" +spi_exec "INSERT INTO testfk VALUES (1)" +$$; +CALL transaction_testfk(); +INFO: insert or update on table "testfk" violates foreign key constraint "testfk_f1_fkey" +SELECT * FROM testpk; + id +---- + 1 +(1 row) + +SELECT * FROM testfk; + f1 +---- + 1 +(1 row) + DROP TABLE test1; DROP TABLE test2; diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c index c5fad05e12..68c9bd1970 100644 --- a/src/pl/tcl/pltcl.c +++ b/src/pl/tcl/pltcl.c @@ -2935,7 +2935,6 @@ pltcl_commit(ClientData cdata, Tcl_Interp *interp, PG_TRY(); { SPI_commit(); - SPI_start_transaction(); } PG_CATCH(); { @@ -2975,7 +2974,6 @@ pltcl_rollback(ClientData cdata, Tcl_Interp *interp, PG_TRY(); { SPI_rollback(); - SPI_start_transaction(); } PG_CATCH(); { diff --git a/src/pl/tcl/sql/pltcl_transaction.sql b/src/pl/tcl/sql/pltcl_transaction.sql index c752faf665..bd759850a7 100644 --- a/src/pl/tcl/sql/pltcl_transaction.sql +++ b/src/pl/tcl/sql/pltcl_transaction.sql @@ -94,5 +94,42 @@ CALL transaction_test4b(); SELECT * FROM test1; +-- check handling of an error during COMMIT +CREATE TABLE testpk (id int PRIMARY KEY); +CREATE TABLE testfk(f1 int REFERENCES testpk DEFERRABLE INITIALLY DEFERRED); + +CREATE PROCEDURE transaction_testfk() +LANGUAGE pltcl +AS $$ +# this insert will fail during commit: +spi_exec "INSERT INTO testfk VALUES (0)" +commit +elog WARNING "should not get here" +$$; + +CALL transaction_testfk(); + +SELECT * FROM testpk; +SELECT * FROM testfk; + +CREATE OR REPLACE PROCEDURE transaction_testfk() +LANGUAGE pltcl +AS $$ +# this insert will fail during commit: +spi_exec "INSERT INTO testfk VALUES (0)" +if [catch {commit} msg] { + elog INFO $msg +} +# these inserts should work: +spi_exec "INSERT INTO testpk VALUES (1)" +spi_exec "INSERT INTO testfk VALUES (1)" +$$; + +CALL transaction_testfk(); + +SELECT * FROM testpk; +SELECT * FROM testfk; + + DROP TABLE test1; DROP TABLE test2; From 12d768e70497afc5a57acf73c251316997b5175a Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 28 Feb 2022 12:54:12 -0500 Subject: [PATCH 068/772] Don't use static storage for SaveTransactionCharacteristics(). This is pretty queasy-making on general principles, and the more so once you notice that CommitTransactionCommand() is actually stomping on the values saved by _SPI_commit(). It's okay as long as the active values didn't change during HoldPinnedPortals(); but that's a larger assumption than I think we want to make, especially since the fix is so simple. Discussion: https://postgr.es/m/1533956.1645731245@sss.pgh.pa.us --- src/backend/access/transam/xact.c | 32 ++++++++++++++----------------- src/backend/executor/spi.c | 16 ++++++++-------- src/include/access/xact.h | 12 ++++++++++-- 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index bb1f106946..adf763a8ea 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -2983,24 +2983,20 @@ StartTransactionCommand(void) * GUC system resets the characteristics at transaction end, so for example * just skipping the reset in StartTransaction() won't work.) */ -static int save_XactIsoLevel; -static bool save_XactReadOnly; -static bool save_XactDeferrable; - void -SaveTransactionCharacteristics(void) +SaveTransactionCharacteristics(SavedTransactionCharacteristics *s) { - save_XactIsoLevel = XactIsoLevel; - save_XactReadOnly = XactReadOnly; - save_XactDeferrable = XactDeferrable; + s->save_XactIsoLevel = XactIsoLevel; + s->save_XactReadOnly = XactReadOnly; + s->save_XactDeferrable = XactDeferrable; } void -RestoreTransactionCharacteristics(void) +RestoreTransactionCharacteristics(const SavedTransactionCharacteristics *s) { - XactIsoLevel = save_XactIsoLevel; - XactReadOnly = save_XactReadOnly; - XactDeferrable = save_XactDeferrable; + XactIsoLevel = s->save_XactIsoLevel; + XactReadOnly = s->save_XactReadOnly; + XactDeferrable = s->save_XactDeferrable; } @@ -3011,9 +3007,9 @@ void CommitTransactionCommand(void) { TransactionState s = CurrentTransactionState; + SavedTransactionCharacteristics savetc; - if (s->chain) - SaveTransactionCharacteristics(); + SaveTransactionCharacteristics(&savetc); switch (s->blockState) { @@ -3071,7 +3067,7 @@ CommitTransactionCommand(void) StartTransaction(); s->blockState = TBLOCK_INPROGRESS; s->chain = false; - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); } break; @@ -3097,7 +3093,7 @@ CommitTransactionCommand(void) StartTransaction(); s->blockState = TBLOCK_INPROGRESS; s->chain = false; - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); } break; @@ -3115,7 +3111,7 @@ CommitTransactionCommand(void) StartTransaction(); s->blockState = TBLOCK_INPROGRESS; s->chain = false; - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); } break; @@ -3182,7 +3178,7 @@ CommitTransactionCommand(void) StartTransaction(); s->blockState = TBLOCK_INPROGRESS; s->chain = false; - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); } } else if (s->blockState == TBLOCK_PREPARE) diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index 7971050746..5b353cb93a 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -228,6 +228,7 @@ static void _SPI_commit(bool chain) { MemoryContext oldcontext = CurrentMemoryContext; + SavedTransactionCharacteristics savetc; /* * Complain if we are in a context that doesn't permit transaction @@ -255,9 +256,8 @@ _SPI_commit(bool chain) (errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION), errmsg("cannot commit while a subtransaction is active"))); - /* XXX this ain't re-entrant enough for my taste */ if (chain) - SaveTransactionCharacteristics(); + SaveTransactionCharacteristics(&savetc); /* Catch any error occurring during the COMMIT */ PG_TRY(); @@ -281,7 +281,7 @@ _SPI_commit(bool chain) /* Immediately start a new transaction */ StartTransactionCommand(); if (chain) - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); MemoryContextSwitchTo(oldcontext); @@ -305,7 +305,7 @@ _SPI_commit(bool chain) /* ... and start a new one */ StartTransactionCommand(); if (chain) - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); MemoryContextSwitchTo(oldcontext); @@ -333,6 +333,7 @@ static void _SPI_rollback(bool chain) { MemoryContext oldcontext = CurrentMemoryContext; + SavedTransactionCharacteristics savetc; /* see under SPI_commit() */ if (_SPI_current->atomic) @@ -346,9 +347,8 @@ _SPI_rollback(bool chain) (errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION), errmsg("cannot roll back while a subtransaction is active"))); - /* XXX this ain't re-entrant enough for my taste */ if (chain) - SaveTransactionCharacteristics(); + SaveTransactionCharacteristics(&savetc); /* Catch any error occurring during the ROLLBACK */ PG_TRY(); @@ -373,7 +373,7 @@ _SPI_rollback(bool chain) /* Immediately start a new transaction */ StartTransactionCommand(); if (chain) - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); MemoryContextSwitchTo(oldcontext); @@ -398,7 +398,7 @@ _SPI_rollback(bool chain) /* ... and start a new one */ StartTransactionCommand(); if (chain) - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); MemoryContextSwitchTo(oldcontext); diff --git a/src/include/access/xact.h b/src/include/access/xact.h index 17a6fa4abd..062cc7e17d 100644 --- a/src/include/access/xact.h +++ b/src/include/access/xact.h @@ -135,6 +135,14 @@ typedef enum typedef void (*SubXactCallback) (SubXactEvent event, SubTransactionId mySubid, SubTransactionId parentSubid, void *arg); +/* Data structure for Save/RestoreTransactionCharacteristics */ +typedef struct SavedTransactionCharacteristics +{ + int save_XactIsoLevel; + bool save_XactReadOnly; + bool save_XactDeferrable; +} SavedTransactionCharacteristics; + /* ---------------- * transaction-related XLOG entries @@ -399,8 +407,8 @@ extern bool TransactionIdIsCurrentTransactionId(TransactionId xid); extern void CommandCounterIncrement(void); extern void ForceSyncCommit(void); extern void StartTransactionCommand(void); -extern void SaveTransactionCharacteristics(void); -extern void RestoreTransactionCharacteristics(void); +extern void SaveTransactionCharacteristics(SavedTransactionCharacteristics *s); +extern void RestoreTransactionCharacteristics(const SavedTransactionCharacteristics *s); extern void CommitTransactionCommand(void); extern void AbortCurrentTransaction(void); extern void BeginTransactionBlock(void); From a59c79564bdc209a5bc7b02d706f0d7352eb82fa Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 28 Feb 2022 14:12:52 -0500 Subject: [PATCH 069/772] Allow root-owned SSL private keys in libpq, not only the backend. This change makes libpq apply the same private-key-file ownership and permissions checks that we have used in the backend since commit 9a83564c5. Namely, that the private key can be owned by either the current user or root (with different file permissions allowed in the two cases). This allows system-wide management of key files, which is just as sensible on the client side as the server, particularly when the client is itself some application daemon. Sync the comments about this between libpq and the backend, too. David Steele Discussion: https://postgr.es/m/f4b7bc55-97ac-9e69-7398-335e212f7743@pgmasters.net --- src/backend/libpq/be-secure-common.c | 28 ++++++++--------- src/interfaces/libpq/fe-secure-openssl.c | 40 ++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/src/backend/libpq/be-secure-common.c b/src/backend/libpq/be-secure-common.c index 7e9a64d08e..7a9de524db 100644 --- a/src/backend/libpq/be-secure-common.c +++ b/src/backend/libpq/be-secure-common.c @@ -143,6 +143,7 @@ check_ssl_key_file_permissions(const char *ssl_key_file, bool isServerStart) return false; } + /* Key file must be a regular file */ if (!S_ISREG(buf.st_mode)) { ereport(loglevel, @@ -153,9 +154,19 @@ check_ssl_key_file_permissions(const char *ssl_key_file, bool isServerStart) } /* - * Refuse to load key files owned by users other than us or root. + * Refuse to load key files owned by users other than us or root, and + * require no public access to the key file. If the file is owned by us, + * require mode 0600 or less. If owned by root, require 0640 or less to + * allow read access through either our gid or a supplementary gid that + * allows us to read system-wide certificates. * - * XXX surely we can check this on Windows somehow, too. + * Note that similar checks are performed in + * src/interfaces/libpq/fe-secure-openssl.c so any changes here may need + * to be made there as well. + * + * Ideally we would do similar permissions checks on Windows, but it is + * not clear how that would work since Unix-style permissions may not be + * available. */ #if !defined(WIN32) && !defined(__CYGWIN__) if (buf.st_uid != geteuid() && buf.st_uid != 0) @@ -166,20 +177,7 @@ check_ssl_key_file_permissions(const char *ssl_key_file, bool isServerStart) ssl_key_file))); return false; } -#endif - /* - * Require no public access to key file. If the file is owned by us, - * require mode 0600 or less. If owned by root, require 0640 or less to - * allow read access through our gid, or a supplementary gid that allows - * to read system-wide certificates. - * - * XXX temporarily suppress check when on Windows, because there may not - * be proper support for Unix-y file permissions. Need to think of a - * reasonable check to apply on Windows. (See also the data directory - * permission check in postmaster.c) - */ -#if !defined(WIN32) && !defined(__CYGWIN__) if ((buf.st_uid == geteuid() && buf.st_mode & (S_IRWXG | S_IRWXO)) || (buf.st_uid == 0 && buf.st_mode & (S_IWGRP | S_IXGRP | S_IRWXO))) { diff --git a/src/interfaces/libpq/fe-secure-openssl.c b/src/interfaces/libpq/fe-secure-openssl.c index f6e563a2e5..d81218a4cc 100644 --- a/src/interfaces/libpq/fe-secure-openssl.c +++ b/src/interfaces/libpq/fe-secure-openssl.c @@ -1245,11 +1245,45 @@ initialize_SSL(PGconn *conn) fnbuf); return -1; } -#ifndef WIN32 - if (!S_ISREG(buf.st_mode) || buf.st_mode & (S_IRWXG | S_IRWXO)) + + /* Key file must be a regular file */ + if (!S_ISREG(buf.st_mode)) + { + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("private key file \"%s\" is not a regular file"), + fnbuf); + return -1; + } + + /* + * Refuse to load key files owned by users other than us or root, and + * require no public access to the key file. If the file is owned by + * us, require mode 0600 or less. If owned by root, require 0640 or + * less to allow read access through either our gid or a supplementary + * gid that allows us to read system-wide certificates. + * + * Note that similar checks are performed in + * src/backend/libpq/be-secure-common.c so any changes here may need + * to be made there as well. + * + * Ideally we would do similar permissions checks on Windows, but it + * is not clear how that would work since Unix-style permissions may + * not be available. + */ +#if !defined(WIN32) && !defined(__CYGWIN__) + if (buf.st_uid != geteuid() && buf.st_uid != 0) + { + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("private key file \"%s\" must be owned by the current user or root\n"), + fnbuf); + return -1; + } + + if ((buf.st_uid == geteuid() && buf.st_mode & (S_IRWXG | S_IRWXO)) || + (buf.st_uid == 0 && buf.st_mode & (S_IWGRP | S_IXGRP | S_IRWXO))) { appendPQExpBuffer(&conn->errorMessage, - libpq_gettext("private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n"), + libpq_gettext("private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root\n"), fnbuf); return -1; } From 54bd1e43ca56e323aef309dc2dc0e1391825ce68 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 28 Feb 2022 15:36:54 -0500 Subject: [PATCH 070/772] Handle integer overflow in interval justification functions. justify_interval, justify_hours, and justify_days didn't check for overflow when promoting hours to days or days to months; but that's possible when the upper field's value is already large. Detect and report any such overflow. Also, we can avoid unnecessary overflow in some cases in justify_interval by pre-justifying the days field. (Thanks to Nathan Bossart for this idea.) Joe Koshakow Discussion: https://postgr.es/m/CAAvxfHeNqsJ2xYFbPUf_8nNQUiJqkag04NW6aBQQ0dbZsxfWHA@mail.gmail.com --- src/backend/utils/adt/timestamp.c | 35 ++++++++++++++++++++++--- src/test/regress/expected/interval.out | 36 ++++++++++++++++++++++++++ src/test/regress/sql/interval.sql | 12 +++++++++ 3 files changed, 79 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 36f8a84bcc..ae36ff3328 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -2717,12 +2717,33 @@ interval_justify_interval(PG_FUNCTION_ARGS) result->day = span->day; result->time = span->time; + /* pre-justify days if it might prevent overflow */ + if ((result->day > 0 && result->time > 0) || + (result->day < 0 && result->time < 0)) + { + wholemonth = result->day / DAYS_PER_MONTH; + result->day -= wholemonth * DAYS_PER_MONTH; + if (pg_add_s32_overflow(result->month, wholemonth, &result->month)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + } + + /* + * Since TimeOffset is int64, abs(wholeday) can't exceed about 1.07e8. If + * we pre-justified then abs(result->day) is less than DAYS_PER_MONTH, so + * this addition can't overflow. If we didn't pre-justify, then day and + * time are of different signs, so it still can't overflow. + */ TMODULO(result->time, wholeday, USECS_PER_DAY); - result->day += wholeday; /* could overflow... */ + result->day += wholeday; wholemonth = result->day / DAYS_PER_MONTH; result->day -= wholemonth * DAYS_PER_MONTH; - result->month += wholemonth; + if (pg_add_s32_overflow(result->month, wholemonth, &result->month)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); if (result->month > 0 && (result->day < 0 || (result->day == 0 && result->time < 0))) @@ -2772,7 +2793,10 @@ interval_justify_hours(PG_FUNCTION_ARGS) result->time = span->time; TMODULO(result->time, wholeday, USECS_PER_DAY); - result->day += wholeday; /* could overflow... */ + if (pg_add_s32_overflow(result->day, wholeday, &result->day)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); if (result->day > 0 && result->time < 0) { @@ -2808,7 +2832,10 @@ interval_justify_days(PG_FUNCTION_ARGS) wholemonth = result->day / DAYS_PER_MONTH; result->day -= wholemonth * DAYS_PER_MONTH; - result->month += wholemonth; + if (pg_add_s32_overflow(result->month, wholemonth, &result->month)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); if (result->month > 0 && result->day < 0) { diff --git a/src/test/regress/expected/interval.out b/src/test/regress/expected/interval.out index accd4a7d90..146f7c55d0 100644 --- a/src/test/regress/expected/interval.out +++ b/src/test/regress/expected/interval.out @@ -396,6 +396,10 @@ SELECT justify_days(interval '6 months 36 days 5 hours 4 minutes 3 seconds') as @ 7 mons 6 days 5 hours 4 mins 3 secs (1 row) +SELECT justify_hours(interval '2147483647 days 24 hrs'); +ERROR: interval out of range +SELECT justify_days(interval '2147483647 months 30 days'); +ERROR: interval out of range -- test justify_interval() SELECT justify_interval(interval '1 month -1 hour') as "1 month -1 hour"; 1 month -1 hour @@ -403,6 +407,38 @@ SELECT justify_interval(interval '1 month -1 hour') as "1 month -1 hour"; @ 29 days 23 hours (1 row) +SELECT justify_interval(interval '2147483647 days 24 hrs'); + justify_interval +------------------------------- + @ 5965232 years 4 mons 8 days +(1 row) + +SELECT justify_interval(interval '-2147483648 days -24 hrs'); + justify_interval +----------------------------------- + @ 5965232 years 4 mons 9 days ago +(1 row) + +SELECT justify_interval(interval '2147483647 months 30 days'); +ERROR: interval out of range +SELECT justify_interval(interval '-2147483648 months -30 days'); +ERROR: interval out of range +SELECT justify_interval(interval '2147483647 months 30 days -24 hrs'); + justify_interval +---------------------------------- + @ 178956970 years 7 mons 29 days +(1 row) + +SELECT justify_interval(interval '-2147483648 months -30 days 24 hrs'); + justify_interval +-------------------------------------- + @ 178956970 years 8 mons 29 days ago +(1 row) + +SELECT justify_interval(interval '2147483647 months -30 days 1440 hrs'); +ERROR: interval out of range +SELECT justify_interval(interval '-2147483648 months 30 days -1440 hrs'); +ERROR: interval out of range -- test fractional second input, and detection of duplicate units SET DATESTYLE = 'ISO'; SET IntervalStyle TO postgres; diff --git a/src/test/regress/sql/interval.sql b/src/test/regress/sql/interval.sql index 6d532398bd..c31f0eec05 100644 --- a/src/test/regress/sql/interval.sql +++ b/src/test/regress/sql/interval.sql @@ -149,10 +149,22 @@ select '100000000y 10mon -1000000000d -100000h -10min -10.000001s ago'::interval SELECT justify_hours(interval '6 months 3 days 52 hours 3 minutes 2 seconds') as "6 mons 5 days 4 hours 3 mins 2 seconds"; SELECT justify_days(interval '6 months 36 days 5 hours 4 minutes 3 seconds') as "7 mons 6 days 5 hours 4 mins 3 seconds"; +SELECT justify_hours(interval '2147483647 days 24 hrs'); +SELECT justify_days(interval '2147483647 months 30 days'); + -- test justify_interval() SELECT justify_interval(interval '1 month -1 hour') as "1 month -1 hour"; +SELECT justify_interval(interval '2147483647 days 24 hrs'); +SELECT justify_interval(interval '-2147483648 days -24 hrs'); +SELECT justify_interval(interval '2147483647 months 30 days'); +SELECT justify_interval(interval '-2147483648 months -30 days'); +SELECT justify_interval(interval '2147483647 months 30 days -24 hrs'); +SELECT justify_interval(interval '-2147483648 months -30 days 24 hrs'); +SELECT justify_interval(interval '2147483647 months -30 days 1440 hrs'); +SELECT justify_interval(interval '-2147483648 months 30 days -1440 hrs'); + -- test fractional second input, and detection of duplicate units SET DATESTYLE = 'ISO'; SET IntervalStyle TO postgres; From 7a85073290856554416353a89799a4c04d09b74b Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Tue, 1 Mar 2022 06:17:52 +0530 Subject: [PATCH 071/772] Reconsider pg_stat_subscription_workers view. It was decided (refer to the Discussion link below) that the stats collector is not an appropriate place to store the error information of subscription workers. This patch changes the pg_stat_subscription_workers view (introduced by commit 8d74fc96db) so that it stores only statistics counters: apply_error_count and sync_error_count, and has one entry for each subscription. The removed error information such as error-XID and the error message would be stored in another way in the future which is more reliable and persistent. After removing these error details, there is no longer any relation information, so the subscription statistics are now a cluster-wide statistics. The patch also changes the view name to pg_stat_subscription_stats since the word "worker" is an implementation detail that we use one worker for one tablesync and one apply. Author: Masahiko Sawada, based on suggestions by Andres Freund Reviewed-by: Peter Smith, Haiying Tang, Takamichi Osumi, Amit Kapila Discussion: https://postgr.es/m/20220125063131.4cmvsxbz2tdg6g65@alap3.anarazel.de --- doc/src/sgml/logical-replication.sgml | 4 +- doc/src/sgml/monitoring.sgml | 99 +-- src/backend/catalog/system_functions.sql | 4 +- src/backend/catalog/system_views.sql | 27 +- src/backend/postmaster/pgstat.c | 656 +++++++++----------- src/backend/replication/logical/worker.c | 44 +- src/backend/utils/adt/pgstatfuncs.c | 156 ++--- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.dat | 27 +- src/include/pgstat.h | 129 ++-- src/test/regress/expected/rules.out | 23 +- src/test/subscription/t/026_stats.pl | 102 +++ src/test/subscription/t/026_worker_stats.pl | 165 ----- src/tools/pgindent/typedefs.list | 8 +- 14 files changed, 582 insertions(+), 864 deletions(-) create mode 100644 src/test/subscription/t/026_stats.pl delete mode 100644 src/test/subscription/t/026_worker_stats.pl diff --git a/doc/src/sgml/logical-replication.sgml b/doc/src/sgml/logical-replication.sgml index 96b4886e08..fb4472356d 100644 --- a/doc/src/sgml/logical-replication.sgml +++ b/doc/src/sgml/logical-replication.sgml @@ -346,9 +346,7 @@ A conflict will produce an error and will stop the replication; it must be resolved manually by the user. Details about the conflict can be found in - - pg_stat_subscription_workers and the - subscriber's server log. + the subscriber's server log. diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index bf7625d988..9fb62fec8e 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -628,11 +628,10 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser - pg_stat_subscription_workerspg_stat_subscription_workers - One row per subscription worker, showing statistics about errors - that occurred on that subscription worker. - See - pg_stat_subscription_workers for details. + pg_stat_subscription_statspg_stat_subscription_stats + One row per subscription, showing statistics about errors. + See + pg_stat_subscription_stats for details. @@ -3063,23 +3062,20 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i - - <structname>pg_stat_subscription_workers</structname> + + <structname>pg_stat_subscription_stats</structname> - pg_stat_subscription_workers + pg_stat_subscription_stats - The pg_stat_subscription_workers view will contain - one row per subscription worker on which errors have occurred, for workers - applying logical replication changes and workers handling the initial data - copy of the subscribed tables. The statistics entry is removed when the - corresponding subscription is dropped. + The pg_stat_subscription_stats view will contain + one row per subscription. -
- <structname>pg_stat_subscription_workers</structname> View +
+ <structname>pg_stat_subscription_stats</structname> View @@ -3113,72 +3109,31 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i - subrelid oid + apply_error_count bigint - OID of the relation that the worker is synchronizing; null for the - main apply worker - - - - - - last_error_relid oid - - - OID of the relation that the worker was processing when the - error occurred + Number of times an error occurred while applying changes - last_error_command text + sync_error_count bigint - Name of command being applied when the error occurred. This field - is null if the error was reported during the initial data copy. + Number of times an error occurred during the initial table + synchronization - last_error_xid xid - - - Transaction ID of the publisher node being applied when the error - occurred. This field is null if the error was reported - during the initial data copy. - - - - - - last_error_count uint8 - - - Number of consecutive times the error occurred - - - - - - last_error_message text - - - The error message - - - - - - last_error_time timestamp with time zone + stats_reset timestamp with time zone - Last time at which this error occurred + Time at which these statistics were last reset -
@@ -5320,22 +5275,16 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i - pg_stat_reset_subscription_worker + pg_stat_reset_subscription_stats - pg_stat_reset_subscription_worker ( subid oid , relid oid ) + pg_stat_reset_subscription_stats ( oid ) void - Resets the statistics of subscription workers running on the - subscription with subid shown in the - pg_stat_subscription_workers view. If the - argument relid is not NULL, - resets statistics of the subscription worker handling the initial data - copy of the relation with relid. Otherwise, - resets the subscription worker statistics of the main apply worker. - If the argument relid is omitted, resets the - statistics of all subscription workers running on the subscription - with subid. + Resets statistics for a single subscription shown in the + pg_stat_subscription_stats view to zero. If + the argument is NULL, reset statistics for all + subscriptions. This function is restricted to superusers by default, but other users diff --git a/src/backend/catalog/system_functions.sql b/src/backend/catalog/system_functions.sql index fd1421788e..758ab6e25a 100644 --- a/src/backend/catalog/system_functions.sql +++ b/src/backend/catalog/system_functions.sql @@ -639,9 +639,7 @@ REVOKE EXECUTE ON FUNCTION pg_stat_reset_single_function_counters(oid) FROM publ REVOKE EXECUTE ON FUNCTION pg_stat_reset_replication_slot(text) FROM public; -REVOKE EXECUTE ON FUNCTION pg_stat_reset_subscription_worker(oid) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_stat_reset_subscription_worker(oid, oid) FROM public; +REVOKE EXECUTE ON FUNCTION pg_stat_reset_subscription_stats(oid) FROM public; REVOKE EXECUTE ON FUNCTION lo_import(text) FROM public; diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 3cb69b1f87..40b7bca5a9 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -1264,25 +1264,12 @@ GRANT SELECT (oid, subdbid, subname, subowner, subenabled, subbinary, substream, subtwophasestate, subslotname, subsynccommit, subpublications) ON pg_subscription TO public; -CREATE VIEW pg_stat_subscription_workers AS +CREATE VIEW pg_stat_subscription_stats AS SELECT - w.subid, + ss.subid, s.subname, - w.subrelid, - w.last_error_relid, - w.last_error_command, - w.last_error_xid, - w.last_error_count, - w.last_error_message, - w.last_error_time - FROM (SELECT - oid as subid, - NULL as relid - FROM pg_subscription - UNION ALL - SELECT - srsubid as subid, - srrelid as relid - FROM pg_subscription_rel) sr, - LATERAL pg_stat_get_subscription_worker(sr.subid, sr.relid) w - JOIN pg_subscription s ON (w.subid = s.oid); + ss.apply_error_count, + ss.sync_error_count, + ss.stats_reset + FROM pg_subscription as s, + pg_stat_get_subscription_stats(s.oid) as ss; diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 0646f53098..53ddd930e6 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -106,7 +106,7 @@ #define PGSTAT_DB_HASH_SIZE 16 #define PGSTAT_TAB_HASH_SIZE 512 #define PGSTAT_FUNCTION_HASH_SIZE 512 -#define PGSTAT_SUBWORKER_HASH_SIZE 32 +#define PGSTAT_SUBSCRIPTION_HASH_SIZE 32 #define PGSTAT_REPLSLOT_HASH_SIZE 32 @@ -284,6 +284,7 @@ static PgStat_GlobalStats globalStats; static PgStat_WalStats walStats; static PgStat_SLRUStats slruStats[SLRU_NUM_ELEMENTS]; static HTAB *replSlotStatHash = NULL; +static HTAB *subscriptionStatHash = NULL; /* * List of OIDs of databases we need to write out. If an entry is InvalidOid, @@ -322,14 +323,13 @@ NON_EXEC_STATIC void PgstatCollectorMain(int argc, char *argv[]) pg_attribute_no static PgStat_StatDBEntry *pgstat_get_db_entry(Oid databaseid, bool create); static PgStat_StatTabEntry *pgstat_get_tab_entry(PgStat_StatDBEntry *dbentry, Oid tableoid, bool create); -static PgStat_StatSubWorkerEntry *pgstat_get_subworker_entry(PgStat_StatDBEntry *dbentry, - Oid subid, Oid subrelid, - bool create); +static PgStat_StatSubEntry *pgstat_get_subscription_entry(Oid subid, bool create); +static void pgstat_reset_subscription(PgStat_StatSubEntry *subentry, TimestampTz ts); static void pgstat_write_statsfiles(bool permanent, bool allDbs); static void pgstat_write_db_statsfile(PgStat_StatDBEntry *dbentry, bool permanent); static HTAB *pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep); static void pgstat_read_db_statsfile(Oid databaseid, HTAB *tabhash, HTAB *funchash, - HTAB *subworkerhash, bool permanent); + bool permanent); static void backend_read_statsfile(void); static bool pgstat_write_statsfile_needed(void); @@ -341,7 +341,6 @@ static void pgstat_reset_replslot(PgStat_StatReplSlotEntry *slotstats, Timestamp static void pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg, TimestampTz now); static void pgstat_send_funcstats(void); static void pgstat_send_slru(void); -static void pgstat_send_subscription_purge(PgStat_MsgSubscriptionPurge *msg); static HTAB *pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid); static bool pgstat_should_report_connstat(void); static void pgstat_report_disconnect(Oid dboid); @@ -363,6 +362,7 @@ static void pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, in static void pgstat_recv_resetsinglecounter(PgStat_MsgResetsinglecounter *msg, int len); static void pgstat_recv_resetslrucounter(PgStat_MsgResetslrucounter *msg, int len); static void pgstat_recv_resetreplslotcounter(PgStat_MsgResetreplslotcounter *msg, int len); +static void pgstat_recv_resetsubcounter(PgStat_MsgResetsubcounter *msg, int len); static void pgstat_recv_autovac(PgStat_MsgAutovacStart *msg, int len); static void pgstat_recv_vacuum(PgStat_MsgVacuum *msg, int len); static void pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len); @@ -380,8 +380,8 @@ static void pgstat_recv_connect(PgStat_MsgConnect *msg, int len); static void pgstat_recv_disconnect(PgStat_MsgDisconnect *msg, int len); static void pgstat_recv_replslot(PgStat_MsgReplSlot *msg, int len); static void pgstat_recv_tempfile(PgStat_MsgTempFile *msg, int len); -static void pgstat_recv_subscription_purge(PgStat_MsgSubscriptionPurge *msg, int len); -static void pgstat_recv_subworker_error(PgStat_MsgSubWorkerError *msg, int len); +static void pgstat_recv_subscription_drop(PgStat_MsgSubscriptionDrop *msg, int len); +static void pgstat_recv_subscription_error(PgStat_MsgSubscriptionError *msg, int len); /* ------------------------------------------------------------ * Public functions called from postmaster follow @@ -1187,6 +1187,32 @@ pgstat_vacuum_stat(void) } } + /* + * Repeat the above steps for subscriptions, if subscription stats are + * being collected. + */ + if (subscriptionStatHash) + { + PgStat_StatSubEntry *subentry; + + /* + * Read pg_subscription and make a list of OIDs of all existing + * subscriptions. + */ + htab = pgstat_collect_oids(SubscriptionRelationId, Anum_pg_subscription_oid); + + hash_seq_init(&hstat, subscriptionStatHash); + while ((subentry = (PgStat_StatSubEntry *) hash_seq_search(&hstat)) != NULL) + { + CHECK_FOR_INTERRUPTS(); + + if (hash_search(htab, (void *) &(subentry->subid), HASH_FIND, NULL) == NULL) + pgstat_report_subscription_drop(subentry->subid); + } + + hash_destroy(htab); + } + /* * Lookup our own database entry; if not found, nothing more to do. */ @@ -1311,74 +1337,6 @@ pgstat_vacuum_stat(void) hash_destroy(htab); } - - /* - * Repeat for subscription workers. Similarly, we needn't bother in the - * common case where no subscription workers' stats are being collected. - */ - if (dbentry->subworkers != NULL && - hash_get_num_entries(dbentry->subworkers) > 0) - { - PgStat_StatSubWorkerEntry *subwentry; - PgStat_MsgSubscriptionPurge spmsg; - - /* - * Read pg_subscription and make a list of OIDs of all existing - * subscriptions - */ - htab = pgstat_collect_oids(SubscriptionRelationId, Anum_pg_subscription_oid); - - spmsg.m_databaseid = MyDatabaseId; - spmsg.m_nentries = 0; - - hash_seq_init(&hstat, dbentry->subworkers); - while ((subwentry = (PgStat_StatSubWorkerEntry *) hash_seq_search(&hstat)) != NULL) - { - bool exists = false; - Oid subid = subwentry->key.subid; - - CHECK_FOR_INTERRUPTS(); - - if (hash_search(htab, (void *) &subid, HASH_FIND, NULL) != NULL) - continue; - - /* - * It is possible that we have multiple entries for the - * subscription corresponding to apply worker and tablesync - * workers. In such cases, we don't need to add the same subid - * again. - */ - for (int i = 0; i < spmsg.m_nentries; i++) - { - if (spmsg.m_subids[i] == subid) - { - exists = true; - break; - } - } - - if (exists) - continue; - - /* This subscription is dead, add the subid to the message */ - spmsg.m_subids[spmsg.m_nentries++] = subid; - - /* - * If the message is full, send it out and reinitialize to empty - */ - if (spmsg.m_nentries >= PGSTAT_NUM_SUBSCRIPTIONPURGE) - { - pgstat_send_subscription_purge(&spmsg); - spmsg.m_nentries = 0; - } - } - - /* Send the rest of dead subscriptions */ - if (spmsg.m_nentries > 0) - pgstat_send_subscription_purge(&spmsg); - - hash_destroy(htab); - } } @@ -1551,8 +1509,7 @@ pgstat_reset_shared_counters(const char *target) * ---------- */ void -pgstat_reset_single_counter(Oid objoid, Oid subobjoid, - PgStat_Single_Reset_Type type) +pgstat_reset_single_counter(Oid objoid, PgStat_Single_Reset_Type type) { PgStat_MsgResetsinglecounter msg; @@ -1563,7 +1520,6 @@ pgstat_reset_single_counter(Oid objoid, Oid subobjoid, msg.m_databaseid = MyDatabaseId; msg.m_resettype = type; msg.m_objectid = objoid; - msg.m_subobjectid = subobjoid; pgstat_send(&msg, sizeof(msg)); } @@ -1623,6 +1579,30 @@ pgstat_reset_replslot_counter(const char *name) pgstat_send(&msg, sizeof(msg)); } +/* ---------- + * pgstat_reset_subscription_counter() - + * + * Tell the statistics collector to reset a single subscription + * counter, or all subscription counters (when subid is InvalidOid). + * + * Permission checking for this function is managed through the normal + * GRANT system. + * ---------- + */ +void +pgstat_reset_subscription_counter(Oid subid) +{ + PgStat_MsgResetsubcounter msg; + + if (pgStatSock == PGINVALID_SOCKET) + return; + + msg.m_subid = subid; + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSUBCOUNTER); + + pgstat_send(&msg, sizeof(msg)); +} + /* ---------- * pgstat_report_autovac() - * @@ -1949,31 +1929,20 @@ pgstat_report_replslot_drop(const char *slotname) } /* ---------- - * pgstat_report_subworker_error() - + * pgstat_report_subscription_error() - * - * Tell the collector about the subscription worker error. + * Tell the collector about the subscription error. * ---------- */ void -pgstat_report_subworker_error(Oid subid, Oid subrelid, Oid relid, - LogicalRepMsgType command, TransactionId xid, - const char *errmsg) +pgstat_report_subscription_error(Oid subid, bool is_apply_error) { - PgStat_MsgSubWorkerError msg; - int len; + PgStat_MsgSubscriptionError msg; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_SUBWORKERERROR); - msg.m_databaseid = MyDatabaseId; + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_SUBSCRIPTIONERROR); msg.m_subid = subid; - msg.m_subrelid = subrelid; - msg.m_relid = relid; - msg.m_command = command; - msg.m_xid = xid; - msg.m_timestamp = GetCurrentTimestamp(); - strlcpy(msg.m_message, errmsg, PGSTAT_SUBWORKERERROR_MSGLEN); - - len = offsetof(PgStat_MsgSubWorkerError, m_message) + strlen(msg.m_message) + 1; - pgstat_send(&msg, len); + msg.m_is_apply_error = is_apply_error; + pgstat_send(&msg, sizeof(PgStat_MsgSubscriptionError)); } /* ---------- @@ -1985,12 +1954,11 @@ pgstat_report_subworker_error(Oid subid, Oid subrelid, Oid relid, void pgstat_report_subscription_drop(Oid subid) { - PgStat_MsgSubscriptionPurge msg; + PgStat_MsgSubscriptionDrop msg; - msg.m_databaseid = MyDatabaseId; - msg.m_subids[0] = subid; - msg.m_nentries = 1; - pgstat_send_subscription_purge(&msg); + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_SUBSCRIPTIONDROP); + msg.m_subid = subid; + pgstat_send(&msg, sizeof(PgStat_MsgSubscriptionDrop)); } /* ---------- @@ -2998,36 +2966,6 @@ pgstat_fetch_stat_funcentry(Oid func_id) return funcentry; } -/* - * --------- - * pgstat_fetch_stat_subworker_entry() - - * - * Support function for the SQL-callable pgstat* functions. Returns - * the collected statistics for subscription worker or NULL. - * --------- - */ -PgStat_StatSubWorkerEntry * -pgstat_fetch_stat_subworker_entry(Oid subid, Oid subrelid) -{ - PgStat_StatDBEntry *dbentry; - PgStat_StatSubWorkerEntry *wentry = NULL; - - /* Load the stats file if needed */ - backend_read_statsfile(); - - /* - * Lookup our database, then find the requested subscription worker stats. - */ - dbentry = pgstat_fetch_stat_dbentry(MyDatabaseId); - if (dbentry != NULL && dbentry->subworkers != NULL) - { - wentry = pgstat_get_subworker_entry(dbentry, subid, subrelid, - false); - } - - return wentry; -} - /* * --------- * pgstat_fetch_stat_archiver() - @@ -3140,6 +3078,23 @@ pgstat_fetch_replslot(NameData slotname) return pgstat_get_replslot_entry(slotname, false); } +/* + * --------- + * pgstat_fetch_stat_subscription() - + * + * Support function for the SQL-callable pgstat* functions. Returns + * the collected statistics for one subscription or NULL. + * --------- + */ +PgStat_StatSubEntry * +pgstat_fetch_stat_subscription(Oid subid) +{ + /* Load the stats file if needed */ + backend_read_statsfile(); + + return pgstat_get_subscription_entry(subid, false); +} + /* * Shut down a single backend's statistics reporting at process exit. * @@ -3465,24 +3420,6 @@ pgstat_send_slru(void) } } -/* -------- - * pgstat_send_subscription_purge() - - * - * Send a subscription purge message to the collector - * -------- - */ -static void -pgstat_send_subscription_purge(PgStat_MsgSubscriptionPurge *msg) -{ - int len; - - len = offsetof(PgStat_MsgSubscriptionPurge, m_subids[0]) - + msg->m_nentries * sizeof(Oid); - - pgstat_setheader(&msg->m_hdr, PGSTAT_MTYPE_SUBSCRIPTIONPURGE); - pgstat_send(msg, len); -} - /* ---------- * PgstatCollectorMain() - * @@ -3668,6 +3605,10 @@ PgstatCollectorMain(int argc, char *argv[]) len); break; + case PGSTAT_MTYPE_RESETSUBCOUNTER: + pgstat_recv_resetsubcounter(&msg.msg_resetsubcounter, len); + break; + case PGSTAT_MTYPE_AUTOVAC_START: pgstat_recv_autovac(&msg.msg_autovacuum_start, len); break; @@ -3738,12 +3679,12 @@ PgstatCollectorMain(int argc, char *argv[]) pgstat_recv_disconnect(&msg.msg_disconnect, len); break; - case PGSTAT_MTYPE_SUBSCRIPTIONPURGE: - pgstat_recv_subscription_purge(&msg.msg_subscriptionpurge, len); + case PGSTAT_MTYPE_SUBSCRIPTIONDROP: + pgstat_recv_subscription_drop(&msg.msg_subscriptiondrop, len); break; - case PGSTAT_MTYPE_SUBWORKERERROR: - pgstat_recv_subworker_error(&msg.msg_subworkererror, len); + case PGSTAT_MTYPE_SUBSCRIPTIONERROR: + pgstat_recv_subscription_error(&msg.msg_subscriptionerror, len); break; default: @@ -3791,8 +3732,7 @@ PgstatCollectorMain(int argc, char *argv[]) /* * Subroutine to clear stats in a database entry * - * Tables, functions, and subscription workers hashes are initialized - * to empty. + * Tables and functions hashes are initialized to empty. */ static void reset_dbentry_counters(PgStat_StatDBEntry *dbentry) @@ -3845,13 +3785,6 @@ reset_dbentry_counters(PgStat_StatDBEntry *dbentry) PGSTAT_FUNCTION_HASH_SIZE, &hash_ctl, HASH_ELEM | HASH_BLOBS); - - hash_ctl.keysize = sizeof(PgStat_StatSubWorkerKey); - hash_ctl.entrysize = sizeof(PgStat_StatSubWorkerEntry); - dbentry->subworkers = hash_create("Per-database subscription worker", - PGSTAT_SUBWORKER_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS); } /* @@ -3876,7 +3809,7 @@ pgstat_get_db_entry(Oid databaseid, bool create) /* * If not found, initialize the new one. This creates empty hash tables - * for tables, functions, and subscription workers, too. + * for tables and functions, too. */ if (!found) reset_dbentry_counters(result); @@ -3934,48 +3867,6 @@ pgstat_get_tab_entry(PgStat_StatDBEntry *dbentry, Oid tableoid, bool create) return result; } -/* ---------- - * pgstat_get_subworker_entry - * - * Return subscription worker entry with the given subscription OID and - * relation OID. If subrelid is InvalidOid, it returns an entry of the - * apply worker otherwise returns an entry of the table sync worker - * associated with subrelid. If no subscription worker entry exists, - * initialize it, if the create parameter is true. Else, return NULL. - * ---------- - */ -static PgStat_StatSubWorkerEntry * -pgstat_get_subworker_entry(PgStat_StatDBEntry *dbentry, Oid subid, Oid subrelid, - bool create) -{ - PgStat_StatSubWorkerEntry *subwentry; - PgStat_StatSubWorkerKey key; - bool found; - HASHACTION action = (create ? HASH_ENTER : HASH_FIND); - - key.subid = subid; - key.subrelid = subrelid; - subwentry = (PgStat_StatSubWorkerEntry *) hash_search(dbentry->subworkers, - (void *) &key, - action, &found); - - if (!create && !found) - return NULL; - - /* If not found, initialize the new one */ - if (!found) - { - subwentry->last_error_relid = InvalidOid; - subwentry->last_error_command = 0; - subwentry->last_error_xid = InvalidTransactionId; - subwentry->last_error_count = 0; - subwentry->last_error_time = 0; - subwentry->last_error_message[0] = '\0'; - } - - return subwentry; -} - /* ---------- * pgstat_write_statsfiles() - * Write the global statistics file, as well as requested DB files. @@ -4059,8 +3950,8 @@ pgstat_write_statsfiles(bool permanent, bool allDbs) while ((dbentry = (PgStat_StatDBEntry *) hash_seq_search(&hstat)) != NULL) { /* - * Write out the table, function, and subscription-worker stats for - * this DB into the appropriate per-DB stat file, if required. + * Write out the table and function stats for this DB into the + * appropriate per-DB stat file, if required. */ if (allDbs || pgstat_db_requested(dbentry->databaseid)) { @@ -4095,6 +3986,22 @@ pgstat_write_statsfiles(bool permanent, bool allDbs) } } + /* + * Write subscription stats struct + */ + if (subscriptionStatHash) + { + PgStat_StatSubEntry *subentry; + + hash_seq_init(&hstat, subscriptionStatHash); + while ((subentry = (PgStat_StatSubEntry *) hash_seq_search(&hstat)) != NULL) + { + fputc('S', fpout); + rc = fwrite(subentry, sizeof(PgStat_StatSubEntry), 1, fpout); + (void) rc; /* we'll check for error with ferror */ + } + } + /* * No more output to be done. Close the temp file and replace the old * pgstat.stat with it. The ferror() check replaces testing for error @@ -4174,10 +4081,8 @@ pgstat_write_db_statsfile(PgStat_StatDBEntry *dbentry, bool permanent) { HASH_SEQ_STATUS tstat; HASH_SEQ_STATUS fstat; - HASH_SEQ_STATUS sstat; PgStat_StatTabEntry *tabentry; PgStat_StatFuncEntry *funcentry; - PgStat_StatSubWorkerEntry *subwentry; FILE *fpout; int32 format_id; Oid dbid = dbentry->databaseid; @@ -4232,17 +4137,6 @@ pgstat_write_db_statsfile(PgStat_StatDBEntry *dbentry, bool permanent) (void) rc; /* we'll check for error with ferror */ } - /* - * Walk through the database's subscription worker stats table. - */ - hash_seq_init(&sstat, dbentry->subworkers); - while ((subwentry = (PgStat_StatSubWorkerEntry *) hash_seq_search(&sstat)) != NULL) - { - fputc('S', fpout); - rc = fwrite(subwentry, sizeof(PgStat_StatSubWorkerEntry), 1, fpout); - (void) rc; /* we'll check for error with ferror */ - } - /* * No more output to be done. Close the temp file and replace the old * pgstat.stat with it. The ferror() check replaces testing for error @@ -4301,9 +4195,8 @@ pgstat_write_db_statsfile(PgStat_StatDBEntry *dbentry, bool permanent) * files after reading; the in-memory status is now authoritative, and the * files would be out of date in case somebody else reads them. * - * If a 'deep' read is requested, table/function/subscription-worker stats are - * read, otherwise the table/function/subscription-worker hash tables remain - * empty. + * If a 'deep' read is requested, table/function stats are read, otherwise + * the table/function hash tables remain empty. * ---------- */ static HTAB * @@ -4482,7 +4375,6 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep) memcpy(dbentry, &dbbuf, sizeof(PgStat_StatDBEntry)); dbentry->tables = NULL; dbentry->functions = NULL; - dbentry->subworkers = NULL; /* * In the collector, disregard the timestamp we read from the @@ -4494,8 +4386,8 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep) dbentry->stats_timestamp = 0; /* - * Don't create tables/functions/subworkers hashtables for - * uninteresting databases. + * Don't create tables/functions hashtables for uninteresting + * databases. */ if (onlydb != InvalidOid) { @@ -4520,14 +4412,6 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep) &hash_ctl, HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); - hash_ctl.keysize = sizeof(PgStat_StatSubWorkerKey); - hash_ctl.entrysize = sizeof(PgStat_StatSubWorkerEntry); - hash_ctl.hcxt = pgStatLocalContext; - dbentry->subworkers = hash_create("Per-database subscription worker", - PGSTAT_SUBWORKER_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); - /* * If requested, read the data from the database-specific * file. Otherwise we just leave the hashtables empty. @@ -4536,7 +4420,6 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep) pgstat_read_db_statsfile(dbentry->databaseid, dbentry->tables, dbentry->functions, - dbentry->subworkers, permanent); break; @@ -4580,6 +4463,45 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep) break; } + /* + * 'S' A PgStat_StatSubEntry struct describing subscription + * statistics. + */ + case 'S': + { + PgStat_StatSubEntry subbuf; + PgStat_StatSubEntry *subentry; + + if (fread(&subbuf, 1, sizeof(PgStat_StatSubEntry), fpin) + != sizeof(PgStat_StatSubEntry)) + { + ereport(pgStatRunningInCollector ? LOG : WARNING, + (errmsg("corrupted statistics file \"%s\"", + statfile))); + goto done; + } + + if (subscriptionStatHash == NULL) + { + HASHCTL hash_ctl; + + hash_ctl.keysize = sizeof(Oid); + hash_ctl.entrysize = sizeof(PgStat_StatSubEntry); + hash_ctl.hcxt = pgStatLocalContext; + subscriptionStatHash = hash_create("Subscription hash", + PGSTAT_SUBSCRIPTION_HASH_SIZE, + &hash_ctl, + HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); + } + + subentry = (PgStat_StatSubEntry *) hash_search(subscriptionStatHash, + (void *) &subbuf.subid, + HASH_ENTER, NULL); + + memcpy(subentry, &subbuf, sizeof(subbuf)); + break; + } + case 'E': goto done; @@ -4614,21 +4536,19 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep) * As in pgstat_read_statsfiles, if the permanent file is requested, it is * removed after reading. * - * Note: this code has the ability to skip storing per-table, per-function, or - * per-subscription-worker data, if NULL is passed for the corresponding hashtable. - * That's not used at the moment though. + * Note: this code has the ability to skip storing per-table or per-function + * data, if NULL is passed for the corresponding hashtable. That's not used + * at the moment though. * ---------- */ static void pgstat_read_db_statsfile(Oid databaseid, HTAB *tabhash, HTAB *funchash, - HTAB *subworkerhash, bool permanent) + bool permanent) { PgStat_StatTabEntry *tabentry; PgStat_StatTabEntry tabbuf; PgStat_StatFuncEntry funcbuf; PgStat_StatFuncEntry *funcentry; - PgStat_StatSubWorkerEntry subwbuf; - PgStat_StatSubWorkerEntry *subwentry; FILE *fpin; int32 format_id; bool found; @@ -4742,41 +4662,6 @@ pgstat_read_db_statsfile(Oid databaseid, HTAB *tabhash, HTAB *funchash, memcpy(funcentry, &funcbuf, sizeof(funcbuf)); break; - /* - * 'S' A PgStat_StatSubWorkerEntry struct describing - * subscription worker statistics. - */ - case 'S': - if (fread(&subwbuf, 1, sizeof(PgStat_StatSubWorkerEntry), - fpin) != sizeof(PgStat_StatSubWorkerEntry)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; - } - - /* - * Skip if subscription worker data not wanted. - */ - if (subworkerhash == NULL) - break; - - subwentry = (PgStat_StatSubWorkerEntry *) hash_search(subworkerhash, - (void *) &subwbuf.key, - HASH_ENTER, &found); - - if (found) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; - } - - memcpy(subwentry, &subwbuf, sizeof(subwbuf)); - break; - /* * 'E' The EOF marker of a complete stats file. */ @@ -4829,6 +4714,7 @@ pgstat_read_db_statsfile_timestamp(Oid databaseid, bool permanent, PgStat_WalStats myWalStats; PgStat_SLRUStats mySLRUStats[SLRU_NUM_ELEMENTS]; PgStat_StatReplSlotEntry myReplSlotStats; + PgStat_StatSubEntry mySubStats; FILE *fpin; int32 format_id; const char *statfile = permanent ? PGSTAT_STAT_PERMANENT_FILENAME : pgstat_stat_filename; @@ -4959,6 +4845,22 @@ pgstat_read_db_statsfile_timestamp(Oid databaseid, bool permanent, } break; + /* + * 'S' A PgStat_StatSubEntry struct describing subscription + * statistics follows. + */ + case 'S': + if (fread(&mySubStats, 1, sizeof(PgStat_StatSubEntry), fpin) + != sizeof(PgStat_StatSubEntry)) + { + ereport(pgStatRunningInCollector ? LOG : WARNING, + (errmsg("corrupted statistics file \"%s\"", + statfile))); + FreeFile(fpin); + return false; + } + break; + case 'E': goto done; @@ -5164,6 +5066,7 @@ pgstat_clear_snapshot(void) pgStatLocalContext = NULL; pgStatDBHash = NULL; replSlotStatHash = NULL; + subscriptionStatHash = NULL; /* * Historically the backend_status.c facilities lived in this file, and @@ -5450,8 +5353,6 @@ pgstat_recv_dropdb(PgStat_MsgDropdb *msg, int len) hash_destroy(dbentry->tables); if (dbentry->functions != NULL) hash_destroy(dbentry->functions); - if (dbentry->subworkers != NULL) - hash_destroy(dbentry->subworkers); if (hash_search(pgStatDBHash, (void *) &dbid, @@ -5489,16 +5390,13 @@ pgstat_recv_resetcounter(PgStat_MsgResetcounter *msg, int len) hash_destroy(dbentry->tables); if (dbentry->functions != NULL) hash_destroy(dbentry->functions); - if (dbentry->subworkers != NULL) - hash_destroy(dbentry->subworkers); dbentry->tables = NULL; dbentry->functions = NULL; - dbentry->subworkers = NULL; /* * Reset database-level stats, too. This creates empty hash tables for - * tables, functions, and subscription workers. + * tables and functions. */ reset_dbentry_counters(dbentry); } @@ -5567,14 +5465,6 @@ pgstat_recv_resetsinglecounter(PgStat_MsgResetsinglecounter *msg, int len) else if (msg->m_resettype == RESET_FUNCTION) (void) hash_search(dbentry->functions, (void *) &(msg->m_objectid), HASH_REMOVE, NULL); - else if (msg->m_resettype == RESET_SUBWORKER) - { - PgStat_StatSubWorkerKey key; - - key.subid = msg->m_objectid; - key.subrelid = msg->m_subobjectid; - (void) hash_search(dbentry->subworkers, (void *) &key, HASH_REMOVE, NULL); - } } /* ---------- @@ -5645,6 +5535,51 @@ pgstat_recv_resetreplslotcounter(PgStat_MsgResetreplslotcounter *msg, } } +/* ---------- + * pgstat_recv_resetsubcounter() - + * + * Reset some subscription statistics of the cluster. + * ---------- + */ +static void +pgstat_recv_resetsubcounter(PgStat_MsgResetsubcounter *msg, int len) +{ + PgStat_StatSubEntry *subentry; + TimestampTz ts; + + /* Return if we don't have replication subscription statistics */ + if (subscriptionStatHash == NULL) + return; + + ts = GetCurrentTimestamp(); + if (!OidIsValid(msg->m_subid)) + { + HASH_SEQ_STATUS sstat; + + /* Clear all subscription counters */ + hash_seq_init(&sstat, subscriptionStatHash); + while ((subentry = (PgStat_StatSubEntry *) hash_seq_search(&sstat)) != NULL) + pgstat_reset_subscription(subentry, ts); + } + else + { + /* Get the subscription statistics to reset */ + subentry = pgstat_get_subscription_entry(msg->m_subid, false); + + /* + * Nothing to do if the given subscription entry is not found. This + * could happen when the subscription with the subid is removed and + * the corresponding statistics entry is also removed before receiving + * the reset message. + */ + if (!subentry) + return; + + /* Reset the stats for the requested subscription */ + pgstat_reset_subscription(subentry, ts); + } +} + /* ---------- * pgstat_recv_autovac() - @@ -6118,81 +6053,42 @@ pgstat_recv_funcpurge(PgStat_MsgFuncpurge *msg, int len) } /* ---------- - * pgstat_recv_subscription_purge() - + * pgstat_recv_subscription_drop() - * - * Process a SUBSCRIPTIONPURGE message. + * Process a SUBSCRIPTIONDROP message. * ---------- */ static void -pgstat_recv_subscription_purge(PgStat_MsgSubscriptionPurge *msg, int len) +pgstat_recv_subscription_drop(PgStat_MsgSubscriptionDrop *msg, int len) { - HASH_SEQ_STATUS hstat; - PgStat_StatDBEntry *dbentry; - PgStat_StatSubWorkerEntry *subwentry; - - dbentry = pgstat_get_db_entry(msg->m_databaseid, false); - - /* No need to purge if we don't even know the database */ - if (!dbentry || !dbentry->subworkers) + /* Return if we don't have replication subscription statistics */ + if (subscriptionStatHash == NULL) return; - /* Remove all subscription worker statistics for the given subscriptions */ - hash_seq_init(&hstat, dbentry->subworkers); - while ((subwentry = (PgStat_StatSubWorkerEntry *) hash_seq_search(&hstat)) != NULL) - { - for (int i = 0; i < msg->m_nentries; i++) - { - if (subwentry->key.subid == msg->m_subids[i]) - { - (void) hash_search(dbentry->subworkers, (void *) &(subwentry->key), - HASH_REMOVE, NULL); - break; - } - } - } + /* Remove from hashtable if present; we don't care if it's not */ + (void) hash_search(subscriptionStatHash, (void *) &(msg->m_subid), + HASH_REMOVE, NULL); } /* ---------- - * pgstat_recv_subworker_error() - + * pgstat_recv_subscription_error() - * - * Process a SUBWORKERERROR message. + * Process a SUBSCRIPTIONERROR message. * ---------- */ static void -pgstat_recv_subworker_error(PgStat_MsgSubWorkerError *msg, int len) +pgstat_recv_subscription_error(PgStat_MsgSubscriptionError *msg, int len) { - PgStat_StatDBEntry *dbentry; - PgStat_StatSubWorkerEntry *subwentry; - - dbentry = pgstat_get_db_entry(msg->m_databaseid, true); + PgStat_StatSubEntry *subentry; - /* Get the subscription worker stats */ - subwentry = pgstat_get_subworker_entry(dbentry, msg->m_subid, - msg->m_subrelid, true); - Assert(subwentry); - - if (subwentry->last_error_relid == msg->m_relid && - subwentry->last_error_command == msg->m_command && - subwentry->last_error_xid == msg->m_xid && - strcmp(subwentry->last_error_message, msg->m_message) == 0) - { - /* - * The same error occurred again in succession, just update its - * timestamp and count. - */ - subwentry->last_error_count++; - subwentry->last_error_time = msg->m_timestamp; - return; - } + /* Get the subscription stats */ + subentry = pgstat_get_subscription_entry(msg->m_subid, true); + Assert(subentry); - /* Otherwise, update the error information */ - subwentry->last_error_relid = msg->m_relid; - subwentry->last_error_command = msg->m_command; - subwentry->last_error_xid = msg->m_xid; - subwentry->last_error_count = 1; - subwentry->last_error_time = msg->m_timestamp; - strlcpy(subwentry->last_error_message, msg->m_message, - PGSTAT_SUBWORKERERROR_MSGLEN); + if (msg->m_is_apply_error) + subentry->apply_error_count++; + else + subentry->sync_error_count++; } /* ---------- @@ -6313,6 +6209,68 @@ pgstat_reset_replslot(PgStat_StatReplSlotEntry *slotent, TimestampTz ts) slotent->stat_reset_timestamp = ts; } +/* ---------- + * pgstat_get_subscription_entry + * + * Return the subscription statistics entry with the given subscription OID. + * If no subscription entry exists, initialize it, if the create parameter is + * true. Else, return NULL. + * ---------- + */ +static PgStat_StatSubEntry * +pgstat_get_subscription_entry(Oid subid, bool create) +{ + PgStat_StatSubEntry *subentry; + bool found; + HASHACTION action = (create ? HASH_ENTER : HASH_FIND); + + if (subscriptionStatHash == NULL) + { + HASHCTL hash_ctl; + + /* + * Quick return NULL if the hash table is empty and the caller didn't + * request to create the entry. + */ + if (!create) + return NULL; + + hash_ctl.keysize = sizeof(Oid); + hash_ctl.entrysize = sizeof(PgStat_StatSubEntry); + subscriptionStatHash = hash_create("Subscription hash", + PGSTAT_SUBSCRIPTION_HASH_SIZE, + &hash_ctl, + HASH_ELEM | HASH_BLOBS); + } + + subentry = (PgStat_StatSubEntry *) hash_search(subscriptionStatHash, + (void *) &subid, + action, &found); + + if (!create && !found) + return NULL; + + /* If not found, initialize the new one */ + if (!found) + pgstat_reset_subscription(subentry, 0); + + return subentry; +} + +/* ---------- + * pgstat_reset_subscription + * + * Reset the given subscription stats. + * ---------- + */ +static void +pgstat_reset_subscription(PgStat_StatSubEntry *subentry, TimestampTz ts) +{ + subentry->apply_error_count = 0; + subentry->sync_error_count = 0; + subentry->stat_reset_timestamp = ts; +} + /* * pgstat_slru_index * diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 5d9acc6173..7e267f7960 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -3377,7 +3377,6 @@ void ApplyWorkerMain(Datum main_arg) { int worker_slot = DatumGetInt32(main_arg); - MemoryContext cctx = CurrentMemoryContext; MemoryContext oldctx; char originname[NAMEDATALEN]; XLogRecPtr origin_startpos; @@ -3485,20 +3484,15 @@ ApplyWorkerMain(Datum main_arg) } PG_CATCH(); { - MemoryContext ecxt = MemoryContextSwitchTo(cctx); - ErrorData *errdata = CopyErrorData(); - /* - * Report the table sync error. There is no corresponding message - * type for table synchronization. + * Abort the current transaction so that we send the stats message + * in an idle state. */ - pgstat_report_subworker_error(MyLogicalRepWorker->subid, - MyLogicalRepWorker->relid, - MyLogicalRepWorker->relid, - 0, /* message type */ - InvalidTransactionId, - errdata->message); - MemoryContextSwitchTo(ecxt); + AbortOutOfAnyTransaction(); + + /* Report the worker failed during table synchronization */ + pgstat_report_subscription_error(MySubscription->oid, false); + PG_RE_THROW(); } PG_END_TRY(); @@ -3625,22 +3619,14 @@ ApplyWorkerMain(Datum main_arg) } PG_CATCH(); { - /* report the apply error */ - if (apply_error_callback_arg.command != 0) - { - MemoryContext ecxt = MemoryContextSwitchTo(cctx); - ErrorData *errdata = CopyErrorData(); - - pgstat_report_subworker_error(MyLogicalRepWorker->subid, - MyLogicalRepWorker->relid, - apply_error_callback_arg.rel != NULL - ? apply_error_callback_arg.rel->localreloid - : InvalidOid, - apply_error_callback_arg.command, - apply_error_callback_arg.remote_xid, - errdata->message); - MemoryContextSwitchTo(ecxt); - } + /* + * Abort the current transaction so that we send the stats message in + * an idle state. + */ + AbortOutOfAnyTransaction(); + + /* Report the worker failed while applying changes */ + pgstat_report_subscription_error(MySubscription->oid, !am_tablesync_worker()); PG_RE_THROW(); } diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 30e8dfa7c1..fd993d0d5f 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -2163,7 +2163,7 @@ pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS) { Oid taboid = PG_GETARG_OID(0); - pgstat_reset_single_counter(taboid, InvalidOid, RESET_TABLE); + pgstat_reset_single_counter(taboid, RESET_TABLE); PG_RETURN_VOID(); } @@ -2173,38 +2173,11 @@ pg_stat_reset_single_function_counters(PG_FUNCTION_ARGS) { Oid funcoid = PG_GETARG_OID(0); - pgstat_reset_single_counter(funcoid, InvalidOid, RESET_FUNCTION); + pgstat_reset_single_counter(funcoid, RESET_FUNCTION); PG_RETURN_VOID(); } -Datum -pg_stat_reset_subscription_worker_subrel(PG_FUNCTION_ARGS) -{ - Oid subid = PG_GETARG_OID(0); - Oid relid = PG_ARGISNULL(1) ? InvalidOid : PG_GETARG_OID(1); - - pgstat_reset_single_counter(subid, relid, RESET_SUBWORKER); - - PG_RETURN_VOID(); -} - -/* Reset all subscription worker stats associated with the given subscription */ -Datum -pg_stat_reset_subscription_worker_sub(PG_FUNCTION_ARGS) -{ - Oid subid = PG_GETARG_OID(0); - - /* - * Use subscription drop message to remove statistics of all subscription - * workers. - */ - pgstat_report_subscription_drop(subid); - - PG_RETURN_VOID(); -} - - /* Reset SLRU counters (a specific one or all of them). */ Datum pg_stat_reset_slru(PG_FUNCTION_ARGS) @@ -2258,6 +2231,32 @@ pg_stat_reset_replication_slot(PG_FUNCTION_ARGS) PG_RETURN_VOID(); } +/* Reset subscription stats (a specific one or all of them) */ +Datum +pg_stat_reset_subscription_stats(PG_FUNCTION_ARGS) +{ + Oid subid; + + if (PG_ARGISNULL(0)) + { + /* Clear all subscription stats */ + subid = InvalidOid; + } + else + { + subid = PG_GETARG_OID(0); + + if (!OidIsValid(subid)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid subscription OID %u", subid))); + } + + pgstat_reset_subscription_counter(subid); + + PG_RETURN_VOID(); +} + Datum pg_stat_get_archiver(PG_FUNCTION_ARGS) { @@ -2400,50 +2399,32 @@ pg_stat_get_replication_slot(PG_FUNCTION_ARGS) } /* - * Get the subscription worker statistics for the given subscription - * (and relation). + * Get the subscription statistics for the given subscription. If the + * subscription statistics is not available, return all-zeros stats. */ Datum -pg_stat_get_subscription_worker(PG_FUNCTION_ARGS) +pg_stat_get_subscription_stats(PG_FUNCTION_ARGS) { -#define PG_STAT_GET_SUBSCRIPTION_WORKER_COLS 8 +#define PG_STAT_GET_SUBSCRIPTION_STATS_COLS 4 Oid subid = PG_GETARG_OID(0); - Oid subrelid; TupleDesc tupdesc; - Datum values[PG_STAT_GET_SUBSCRIPTION_WORKER_COLS]; - bool nulls[PG_STAT_GET_SUBSCRIPTION_WORKER_COLS]; - PgStat_StatSubWorkerEntry *wentry; - int i; - - if (PG_ARGISNULL(1)) - subrelid = InvalidOid; - else - subrelid = PG_GETARG_OID(1); + Datum values[PG_STAT_GET_SUBSCRIPTION_STATS_COLS]; + bool nulls[PG_STAT_GET_SUBSCRIPTION_STATS_COLS]; + PgStat_StatSubEntry *subentry; + PgStat_StatSubEntry allzero; - /* Get subscription worker stats */ - wentry = pgstat_fetch_stat_subworker_entry(subid, subrelid); - - /* Return NULL if there is no worker statistics */ - if (wentry == NULL) - PG_RETURN_NULL(); + /* Get subscription stats */ + subentry = pgstat_fetch_stat_subscription(subid); /* Initialise attributes information in the tuple descriptor */ - tupdesc = CreateTemplateTupleDesc(PG_STAT_GET_SUBSCRIPTION_WORKER_COLS); + tupdesc = CreateTemplateTupleDesc(PG_STAT_GET_SUBSCRIPTION_STATS_COLS); TupleDescInitEntry(tupdesc, (AttrNumber) 1, "subid", OIDOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 2, "subrelid", - OIDOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 3, "last_error_relid", - OIDOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 4, "last_error_command", - TEXTOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 5, "last_error_xid", - XIDOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 6, "last_error_count", + TupleDescInitEntry(tupdesc, (AttrNumber) 2, "apply_error_count", INT8OID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 7, "last_error_message", - TEXTOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 8, "last_error_time", + TupleDescInitEntry(tupdesc, (AttrNumber) 3, "sync_error_count", + INT8OID, -1, 0); + TupleDescInitEntry(tupdesc, (AttrNumber) 4, "stats_reset", TIMESTAMPTZOID, -1, 0); BlessTupleDesc(tupdesc); @@ -2451,46 +2432,27 @@ pg_stat_get_subscription_worker(PG_FUNCTION_ARGS) MemSet(values, 0, sizeof(values)); MemSet(nulls, 0, sizeof(nulls)); - i = 0; - /* subid */ - values[i++] = ObjectIdGetDatum(subid); - - /* subrelid */ - if (OidIsValid(subrelid)) - values[i++] = ObjectIdGetDatum(subrelid); - else - nulls[i++] = true; - - /* last_error_relid */ - if (OidIsValid(wentry->last_error_relid)) - values[i++] = ObjectIdGetDatum(wentry->last_error_relid); - else - nulls[i++] = true; - - /* last_error_command */ - if (wentry->last_error_command != 0) - values[i++] = - CStringGetTextDatum(logicalrep_message_type(wentry->last_error_command)); - else - nulls[i++] = true; + if (!subentry) + { + /* If the subscription is not found, initialise its stats */ + memset(&allzero, 0, sizeof(PgStat_StatSubEntry)); + subentry = &allzero; + } - /* last_error_xid */ - if (TransactionIdIsValid(wentry->last_error_xid)) - values[i++] = TransactionIdGetDatum(wentry->last_error_xid); - else - nulls[i++] = true; + /* subid */ + values[0] = ObjectIdGetDatum(subid); - /* last_error_count */ - values[i++] = Int64GetDatum(wentry->last_error_count); + /* apply_error_count */ + values[1] = Int64GetDatum(subentry->apply_error_count); - /* last_error_message */ - values[i++] = CStringGetTextDatum(wentry->last_error_message); + /* sync_error_count */ + values[2] = Int64GetDatum(subentry->sync_error_count); - /* last_error_time */ - if (wentry->last_error_time != 0) - values[i++] = TimestampTzGetDatum(wentry->last_error_time); + /* stats_reset */ + if (subentry->stat_reset_timestamp == 0) + nulls[3] = true; else - nulls[i++] = true; + values[3] = TimestampTzGetDatum(subentry->stat_reset_timestamp); /* Returns the record as Datum */ PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls))); diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 14194afe1c..5cf18059b8 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202202251 +#define CATALOG_VERSION_NO 202203011 #endif diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 7de8cfc7e9..bf88858171 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -5376,14 +5376,14 @@ proargmodes => '{i,o,o,o,o,o,o,o,o,o,o}', proargnames => '{slot_name,slot_name,spill_txns,spill_count,spill_bytes,stream_txns,stream_count,stream_bytes,total_txns,total_bytes,stats_reset}', prosrc => 'pg_stat_get_replication_slot' }, -{ oid => '8523', descr => 'statistics: information about subscription worker', - proname => 'pg_stat_get_subscription_worker', prorows => '1', proisstrict => 'f', - proretset => 't', provolatile => 's', proparallel => 'r', - prorettype => 'record', proargtypes => 'oid oid', - proallargtypes => '{oid,oid,oid,oid,oid,text,xid,int8,text,timestamptz}', - proargmodes => '{i,i,o,o,o,o,o,o,o,o}', - proargnames => '{subid,subrelid,subid,subrelid,last_error_relid,last_error_command,last_error_xid,last_error_count,last_error_message,last_error_time}', - prosrc => 'pg_stat_get_subscription_worker' }, +{ oid => '8523', descr => 'statistics: information about subscription stats', + proname => 'pg_stat_get_subscription_stats', proisstrict => 'f', + provolatile => 's', proparallel => 'r', + prorettype => 'record', proargtypes => 'oid', + proallargtypes => '{oid,oid,int8,int8,timestamptz}', + proargmodes => '{i,o,o,o,o}', + proargnames => '{subid,subid,apply_error_count,sync_error_count,stats_reset}', + prosrc => 'pg_stat_get_subscription_stats' }, { oid => '6118', descr => 'statistics: information about subscription', proname => 'pg_stat_get_subscription', prorows => '10', proisstrict => 'f', proretset => 't', provolatile => 's', proparallel => 'r', @@ -5772,15 +5772,10 @@ provolatile => 'v', prorettype => 'void', proargtypes => 'text', prosrc => 'pg_stat_reset_replication_slot' }, { oid => '8524', - descr => 'statistics: reset collected statistics for a single subscription worker', - proname => 'pg_stat_reset_subscription_worker', proisstrict => 'f', - provolatile => 'v', prorettype => 'void', proargtypes => 'oid oid', - prosrc => 'pg_stat_reset_subscription_worker_subrel' }, -{ oid => '8525', - descr => 'statistics: reset all collected statistics for a single subscription', - proname => 'pg_stat_reset_subscription_worker', + descr => 'statistics: reset collected statistics for a single subscription', + proname => 'pg_stat_reset_subscription_stats', proisstrict => 'f', provolatile => 'v', prorettype => 'void', proargtypes => 'oid', - prosrc => 'pg_stat_reset_subscription_worker_sub' }, + prosrc => 'pg_stat_reset_subscription_stats' }, { oid => '3163', descr => 'current trigger depth', proname => 'pg_trigger_depth', provolatile => 's', proparallel => 'r', diff --git a/src/include/pgstat.h b/src/include/pgstat.h index e10d20222a..be2f7e2bcc 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -67,6 +67,7 @@ typedef enum StatMsgType PGSTAT_MTYPE_RESETSINGLECOUNTER, PGSTAT_MTYPE_RESETSLRUCOUNTER, PGSTAT_MTYPE_RESETREPLSLOTCOUNTER, + PGSTAT_MTYPE_RESETSUBCOUNTER, PGSTAT_MTYPE_AUTOVAC_START, PGSTAT_MTYPE_VACUUM, PGSTAT_MTYPE_ANALYZE, @@ -84,8 +85,8 @@ typedef enum StatMsgType PGSTAT_MTYPE_REPLSLOT, PGSTAT_MTYPE_CONNECT, PGSTAT_MTYPE_DISCONNECT, - PGSTAT_MTYPE_SUBSCRIPTIONPURGE, - PGSTAT_MTYPE_SUBWORKERERROR, + PGSTAT_MTYPE_SUBSCRIPTIONDROP, + PGSTAT_MTYPE_SUBSCRIPTIONERROR, } StatMsgType; /* ---------- @@ -148,8 +149,7 @@ typedef enum PgStat_Shared_Reset_Target typedef enum PgStat_Single_Reset_Type { RESET_TABLE, - RESET_FUNCTION, - RESET_SUBWORKER + RESET_FUNCTION } PgStat_Single_Reset_Type; /* ------------------------------------------------------------ @@ -368,7 +368,6 @@ typedef struct PgStat_MsgResetsinglecounter Oid m_databaseid; PgStat_Single_Reset_Type m_resettype; Oid m_objectid; - Oid m_subobjectid; } PgStat_MsgResetsinglecounter; /* ---------- @@ -394,6 +393,19 @@ typedef struct PgStat_MsgResetreplslotcounter bool clearall; } PgStat_MsgResetreplslotcounter; +/* ---------- + * PgStat_MsgResetsubcounter Sent by the backend to tell the collector + * to reset subscription counter(s) + * ---------- + */ +typedef struct PgStat_MsgResetsubcounter +{ + PgStat_MsgHdr m_hdr; + Oid m_subid; /* InvalidOid means reset all subscription + * stats */ +} PgStat_MsgResetsubcounter; + + /* ---------- * PgStat_MsgAutovacStart Sent by the autovacuum daemon to signal * that a database is going to be processed @@ -542,53 +554,28 @@ typedef struct PgStat_MsgReplSlot } PgStat_MsgReplSlot; /* ---------- - * PgStat_MsgSubscriptionPurge Sent by the backend and autovacuum to tell the - * collector about the dead subscriptions. + * PgStat_MsgSubscriptionDrop Sent by the backend and autovacuum to tell the + * collector about the dead subscription. * ---------- */ -#define PGSTAT_NUM_SUBSCRIPTIONPURGE \ - ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) / sizeof(Oid)) - -typedef struct PgStat_MsgSubscriptionPurge +typedef struct PgStat_MsgSubscriptionDrop { PgStat_MsgHdr m_hdr; - Oid m_databaseid; - int m_nentries; - Oid m_subids[PGSTAT_NUM_SUBSCRIPTIONPURGE]; -} PgStat_MsgSubscriptionPurge; + Oid m_subid; +} PgStat_MsgSubscriptionDrop; /* ---------- - * PgStat_MsgSubWorkerError Sent by the apply worker or the table sync - * worker to report the error occurred while - * processing changes. + * PgStat_MsgSubscriptionError Sent by the apply worker or the table sync + * worker to report an error on the subscription. * ---------- */ -#define PGSTAT_SUBWORKERERROR_MSGLEN 256 -typedef struct PgStat_MsgSubWorkerError +typedef struct PgStat_MsgSubscriptionError { PgStat_MsgHdr m_hdr; - /* - * m_subid and m_subrelid are used to determine the subscription and the - * reporter of the error. m_subrelid is InvalidOid if reported by an apply - * worker otherwise reported by a table sync worker. - */ - Oid m_databaseid; Oid m_subid; - Oid m_subrelid; - - /* - * Oid of the table that the reporter was actually processing. m_relid can - * be InvalidOid if an error occurred during worker applying a - * non-data-modification message such as RELATION. - */ - Oid m_relid; - - LogicalRepMsgType m_command; - TransactionId m_xid; - TimestampTz m_timestamp; - char m_message[PGSTAT_SUBWORKERERROR_MSGLEN]; -} PgStat_MsgSubWorkerError; + bool m_is_apply_error; +} PgStat_MsgSubscriptionError; /* ---------- * PgStat_MsgRecoveryConflict Sent by the backend upon recovery conflict @@ -750,6 +737,7 @@ typedef union PgStat_Msg PgStat_MsgResetsinglecounter msg_resetsinglecounter; PgStat_MsgResetslrucounter msg_resetslrucounter; PgStat_MsgResetreplslotcounter msg_resetreplslotcounter; + PgStat_MsgResetsubcounter msg_resetsubcounter; PgStat_MsgAutovacStart msg_autovacuum_start; PgStat_MsgVacuum msg_vacuum; PgStat_MsgAnalyze msg_analyze; @@ -767,8 +755,8 @@ typedef union PgStat_Msg PgStat_MsgReplSlot msg_replslot; PgStat_MsgConnect msg_connect; PgStat_MsgDisconnect msg_disconnect; - PgStat_MsgSubscriptionPurge msg_subscriptionpurge; - PgStat_MsgSubWorkerError msg_subworkererror; + PgStat_MsgSubscriptionError msg_subscriptionerror; + PgStat_MsgSubscriptionDrop msg_subscriptiondrop; } PgStat_Msg; @@ -780,7 +768,7 @@ typedef union PgStat_Msg * ------------------------------------------------------------ */ -#define PGSTAT_FILE_FORMAT_ID 0x01A5BCA5 +#define PGSTAT_FILE_FORMAT_ID 0x01A5BCA6 /* ---------- * PgStat_StatDBEntry The collector's data per database @@ -823,16 +811,11 @@ typedef struct PgStat_StatDBEntry TimestampTz stats_timestamp; /* time of db stats file update */ /* - * tables, functions, and subscription workers must be last in the struct, - * because we don't write the pointers out to the stats file. - * - * subworkers is the hash table of PgStat_StatSubWorkerEntry which stores - * statistics of logical replication workers: apply worker and table sync - * worker. + * tables and functions must be last in the struct, because we don't write + * the pointers out to the stats file. */ HTAB *tables; HTAB *functions; - HTAB *subworkers; } PgStat_StatDBEntry; @@ -989,38 +972,17 @@ typedef struct PgStat_StatReplSlotEntry TimestampTz stat_reset_timestamp; } PgStat_StatReplSlotEntry; -/* The lookup key for subscription worker hash table */ -typedef struct PgStat_StatSubWorkerKey -{ - Oid subid; - - /* - * Oid of the table for which tablesync worker will copy the initial data. - * An InvalidOid will be assigned for apply workers. - */ - Oid subrelid; -} PgStat_StatSubWorkerKey; - /* - * Logical replication apply worker and table sync worker statistics kept in the - * stats collector. + * Subscription statistics kept in the stats collector. */ -typedef struct PgStat_StatSubWorkerEntry +typedef struct PgStat_StatSubEntry { - PgStat_StatSubWorkerKey key; /* hash key (must be first) */ + Oid subid; /* hash key (must be first) */ - /* - * Subscription worker error statistics representing an error that - * occurred during application of changes or the initial table - * synchronization. - */ - Oid last_error_relid; - LogicalRepMsgType last_error_command; - TransactionId last_error_xid; - PgStat_Counter last_error_count; - TimestampTz last_error_time; - char last_error_message[PGSTAT_SUBWORKERERROR_MSGLEN]; -} PgStat_StatSubWorkerEntry; + PgStat_Counter apply_error_count; + PgStat_Counter sync_error_count; + TimestampTz stat_reset_timestamp; +} PgStat_StatSubEntry; /* * Working state needed to accumulate per-function-call timing statistics. @@ -1111,10 +1073,10 @@ extern void pgstat_drop_database(Oid databaseid); extern void pgstat_clear_snapshot(void); extern void pgstat_reset_counters(void); extern void pgstat_reset_shared_counters(const char *); -extern void pgstat_reset_single_counter(Oid objectid, Oid subobjectid, - PgStat_Single_Reset_Type type); +extern void pgstat_reset_single_counter(Oid objectid, PgStat_Single_Reset_Type type); extern void pgstat_reset_slru_counter(const char *); extern void pgstat_reset_replslot_counter(const char *name); +extern void pgstat_reset_subscription_counter(Oid subid); extern void pgstat_report_connect(Oid dboid); extern void pgstat_report_autovac(Oid dboid); @@ -1131,9 +1093,7 @@ extern void pgstat_report_checksum_failure(void); extern void pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat); extern void pgstat_report_replslot_create(const char *slotname); extern void pgstat_report_replslot_drop(const char *slotname); -extern void pgstat_report_subworker_error(Oid subid, Oid subrelid, Oid relid, - LogicalRepMsgType command, - TransactionId xid, const char *errmsg); +extern void pgstat_report_subscription_error(Oid subid, bool is_apply_error); extern void pgstat_report_subscription_drop(Oid subid); extern void pgstat_initialize(void); @@ -1226,8 +1186,7 @@ extern void pgstat_send_wal(bool force); extern PgStat_StatDBEntry *pgstat_fetch_stat_dbentry(Oid dbid); extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry(Oid relid); extern PgStat_StatFuncEntry *pgstat_fetch_stat_funcentry(Oid funcid); -extern PgStat_StatSubWorkerEntry *pgstat_fetch_stat_subworker_entry(Oid subid, - Oid subrelid); +extern PgStat_StatSubEntry *pgstat_fetch_stat_subscription(Oid subid); extern PgStat_ArchiverStats *pgstat_fetch_stat_archiver(void); extern PgStat_BgWriterStats *pgstat_fetch_stat_bgwriter(void); extern PgStat_CheckpointerStats *pgstat_fetch_stat_checkpointer(void); diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 1420288d67..ac468568a1 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -2072,24 +2072,13 @@ pg_stat_subscription| SELECT su.oid AS subid, st.latest_end_time FROM (pg_subscription su LEFT JOIN pg_stat_get_subscription(NULL::oid) st(subid, relid, pid, received_lsn, last_msg_send_time, last_msg_receipt_time, latest_end_lsn, latest_end_time) ON ((st.subid = su.oid))); -pg_stat_subscription_workers| SELECT w.subid, +pg_stat_subscription_stats| SELECT ss.subid, s.subname, - w.subrelid, - w.last_error_relid, - w.last_error_command, - w.last_error_xid, - w.last_error_count, - w.last_error_message, - w.last_error_time - FROM ( SELECT pg_subscription.oid AS subid, - NULL::oid AS relid - FROM pg_subscription - UNION ALL - SELECT pg_subscription_rel.srsubid AS subid, - pg_subscription_rel.srrelid AS relid - FROM pg_subscription_rel) sr, - (LATERAL pg_stat_get_subscription_worker(sr.subid, sr.relid) w(subid, subrelid, last_error_relid, last_error_command, last_error_xid, last_error_count, last_error_message, last_error_time) - JOIN pg_subscription s ON ((w.subid = s.oid))); + ss.apply_error_count, + ss.sync_error_count, + ss.stats_reset + FROM pg_subscription s, + LATERAL pg_stat_get_subscription_stats(s.oid) ss(subid, apply_error_count, sync_error_count, stats_reset); pg_stat_sys_indexes| SELECT pg_stat_all_indexes.relid, pg_stat_all_indexes.indexrelid, pg_stat_all_indexes.schemaname, diff --git a/src/test/subscription/t/026_stats.pl b/src/test/subscription/t/026_stats.pl new file mode 100644 index 0000000000..a42ea3170e --- /dev/null +++ b/src/test/subscription/t/026_stats.pl @@ -0,0 +1,102 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +# Tests for subscription stats. +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Create publisher node. +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); +$node_publisher->init(allows_streaming => 'logical'); +$node_publisher->start; + +# Create subscriber node. +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); +$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->start; + +# Initial table setup on both publisher and subscriber. On subscriber we +# create the same tables but with primary keys. Also, insert some data that +# will conflict with the data replicated from publisher later. +$node_publisher->safe_psql( + 'postgres', + qq[ +BEGIN; +CREATE TABLE test_tab1 (a int); +INSERT INTO test_tab1 VALUES (1); +COMMIT; +]); +$node_subscriber->safe_psql( + 'postgres', + qq[ +BEGIN; +CREATE TABLE test_tab1 (a int primary key); +INSERT INTO test_tab1 VALUES (1); +COMMIT; +]); + +# Setup publication. +my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub FOR TABLE test_tab1;"); + +# There shouldn't be any subscription errors before starting logical replication. +my $result = $node_subscriber->safe_psql('postgres', + "SELECT count(1) FROM pg_stat_subscription_stats"); +is($result, qq(0), 'check no subscription error'); + +# Create subscription. The tablesync for test_tab1 on tap_sub will enter into +# infinite error loop due to violating the unique constraint. +$node_subscriber->safe_psql('postgres', + "CREATE SUBSCRIPTION tap_sub CONNECTION '$publisher_connstr' PUBLICATION tap_pub;" +); + +$node_publisher->wait_for_catchup('tap_sub'); + +# Wait for the tablesync error to be reported. +$node_subscriber->poll_query_until( + 'postgres', + qq[ +SELECT sync_error_count > 0 +FROM pg_stat_subscription_stats +WHERE subname = 'tap_sub' +]) or die "Timed out while waiting for tablesync error"; + +# Truncate test_tab1 so that tablesync worker can continue. +$node_subscriber->safe_psql('postgres', "TRUNCATE test_tab1;"); + +# Wait for initial tablesync for test_tab1 to finish. +$node_subscriber->poll_query_until( + 'postgres', + qq[ +SELECT count(1) = 1 FROM pg_subscription_rel +WHERE srrelid = 'test_tab1'::regclass AND srsubstate in ('r', 's') +]) or die "Timed out while waiting for subscriber to synchronize data"; + +# Check test_tab1 on the subscriber has one row. +$result = $node_subscriber->safe_psql('postgres', "SELECT a FROM test_tab1"); +is($result, qq(1), 'check the table has now row'); + +# Insert data to test_tab1 on the publisher, raising an error on the subscriber +# due to violation of the unique constraint on test_tab1. +$node_publisher->safe_psql('postgres', "INSERT INTO test_tab1 VALUES (1)"); + +# Wait for the apply error to be reported. +$node_subscriber->poll_query_until( + 'postgres', + qq[ +SELECT apply_error_count > 0 +FROM pg_stat_subscription_stats +WHERE subname = 'tap_sub' +]) or die "Timed out while waiting for apply error"; + +# Truncate test_tab1 so that apply worker can continue. +$node_subscriber->safe_psql('postgres', "TRUNCATE test_tab1;"); + +$node_subscriber->stop('fast'); +$node_publisher->stop('fast'); + +done_testing(); diff --git a/src/test/subscription/t/026_worker_stats.pl b/src/test/subscription/t/026_worker_stats.pl deleted file mode 100644 index f72e4766e8..0000000000 --- a/src/test/subscription/t/026_worker_stats.pl +++ /dev/null @@ -1,165 +0,0 @@ - -# Copyright (c) 2021-2022, PostgreSQL Global Development Group - -# Tests for subscription error stats. -use strict; -use warnings; -use PostgreSQL::Test::Cluster; -use PostgreSQL::Test::Utils; -use Test::More; - -# Test if the error reported on pg_stat_subscription_workers view is expected. -sub test_subscription_error -{ - my ($node, $relname, $command, $xid, $by_apply_worker, $errmsg_prefix, $msg) - = @_; - - my $check_sql = qq[ -SELECT count(1) > 0 -FROM pg_stat_subscription_workers -WHERE last_error_relid = '$relname'::regclass - AND starts_with(last_error_message, '$errmsg_prefix')]; - - # subrelid - $check_sql .= $by_apply_worker - ? qq[ AND subrelid IS NULL] - : qq[ AND subrelid = '$relname'::regclass]; - - # last_error_command - $check_sql .= $command eq '' - ? qq[ AND last_error_command IS NULL] - : qq[ AND last_error_command = '$command']; - - # last_error_xid - $check_sql .= $xid eq '' - ? qq[ AND last_error_xid IS NULL] - : qq[ AND last_error_xid = '$xid'::xid]; - - # Wait for the particular error statistics to be reported. - $node->poll_query_until('postgres', $check_sql, -) or die "Timed out while waiting for " . $msg; -} - -# Create publisher node. -my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); -$node_publisher->init(allows_streaming => 'logical'); -$node_publisher->start; - -# Create subscriber node. -my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); - -# The subscriber will enter an infinite error loop, so we don't want -# to overflow the server log with error messages. -$node_subscriber->append_conf('postgresql.conf', - qq[ -wal_retrieve_retry_interval = 2s -]); -$node_subscriber->start; - -# Initial table setup on both publisher and subscriber. On subscriber we -# create the same tables but with primary keys. Also, insert some data that -# will conflict with the data replicated from publisher later. -$node_publisher->safe_psql( - 'postgres', - qq[ -BEGIN; -CREATE TABLE test_tab1 (a int); -CREATE TABLE test_tab2 (a int); -INSERT INTO test_tab1 VALUES (1); -INSERT INTO test_tab2 VALUES (1); -COMMIT; -]); -$node_subscriber->safe_psql( - 'postgres', - qq[ -BEGIN; -CREATE TABLE test_tab1 (a int primary key); -CREATE TABLE test_tab2 (a int primary key); -INSERT INTO test_tab2 VALUES (1); -COMMIT; -]); - -# Setup publications. -my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; -$node_publisher->safe_psql( - 'postgres', - "CREATE PUBLICATION tap_pub FOR TABLE test_tab1, test_tab2;"); - -# There shouldn't be any subscription errors before starting logical replication. -my $result = $node_subscriber->safe_psql( - 'postgres', - "SELECT count(1) FROM pg_stat_subscription_workers"); -is($result, qq(0), 'check no subscription error'); - -# Create subscription. The table sync for test_tab2 on tap_sub will enter into -# infinite error loop due to violating the unique constraint. -$node_subscriber->safe_psql( - 'postgres', - "CREATE SUBSCRIPTION tap_sub CONNECTION '$publisher_connstr' PUBLICATION tap_pub;"); - -$node_publisher->wait_for_catchup('tap_sub'); - -# Wait for initial table sync for test_tab1 to finish. -$node_subscriber->poll_query_until( - 'postgres', - qq[ -SELECT count(1) = 1 FROM pg_subscription_rel -WHERE srrelid = 'test_tab1'::regclass AND srsubstate in ('r', 's') -]) or die "Timed out while waiting for subscriber to synchronize data"; - -# Check the initial data. -$result = $node_subscriber->safe_psql( - 'postgres', - "SELECT count(a) FROM test_tab1"); -is($result, q(1), 'check initial data are copied to subscriber'); - -# Insert more data to test_tab1, raising an error on the subscriber due to -# violation of the unique constraint on test_tab1. -my $xid = $node_publisher->safe_psql( - 'postgres', - qq[ -BEGIN; -INSERT INTO test_tab1 VALUES (1); -SELECT pg_current_xact_id()::xid; -COMMIT; -]); -test_subscription_error($node_subscriber, 'test_tab1', 'INSERT', $xid, - 1, # check apply worker error - qq(duplicate key value violates unique constraint), - 'error reported by the apply worker'); - -# Check the table sync worker's error in the view. -test_subscription_error($node_subscriber, 'test_tab2', '', '', - 0, # check tablesync worker error - qq(duplicate key value violates unique constraint), - 'the error reported by the table sync worker'); - -# Test for resetting subscription worker statistics. -# Truncate test_tab1 and test_tab2 so that applying changes and table sync can -# continue, respectively. -$node_subscriber->safe_psql( - 'postgres', - "TRUNCATE test_tab1, test_tab2;"); - -# Wait for the data to be replicated. -$node_subscriber->poll_query_until( - 'postgres', - "SELECT count(1) > 0 FROM test_tab1"); -$node_subscriber->poll_query_until( - 'postgres', - "SELECT count(1) > 0 FROM test_tab2"); - -# There shouldn't be any errors in the view after dropping the subscription. -$node_subscriber->safe_psql( - 'postgres', - "DROP SUBSCRIPTION tap_sub;"); -$result = $node_subscriber->safe_psql( - 'postgres', - "SELECT count(1) FROM pg_stat_subscription_workers"); -is($result, q(0), 'no error after dropping subscription'); - -$node_subscriber->stop('fast'); -$node_publisher->stop('fast'); - -done_testing(); diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index c6b302c7b2..d9b83f744f 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1943,9 +1943,10 @@ PgStat_MsgResetreplslotcounter PgStat_MsgResetsharedcounter PgStat_MsgResetsinglecounter PgStat_MsgResetslrucounter +PgStat_MsgResetsubcounter PgStat_MsgSLRU -PgStat_MsgSubscriptionPurge -PgStat_MsgSubWorkerError +PgStat_MsgSubscriptionDrop +PgStat_MsgSubscriptionError PgStat_MsgTabpurge PgStat_MsgTabstat PgStat_MsgTempFile @@ -1957,8 +1958,7 @@ PgStat_Single_Reset_Type PgStat_StatDBEntry PgStat_StatFuncEntry PgStat_StatReplSlotEntry -PgStat_StatSubWorkerEntry -PgStat_StatSubWorkerKey +PgStat_StatSubEntry PgStat_StatTabEntry PgStat_SubXactStatus PgStat_TableCounts From a33e17f210547226ada52d2b8af851c3553bb4fa Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 1 Mar 2022 12:52:25 +0900 Subject: [PATCH 072/772] Rework internal command generation of pg_rewind pg_rewind generates and executes internally up to two commands to work on the target cluster, depending on the options given by its caller: - postgres -C to retrieve the value of restore_command, when using -c/--restore-target-wal. - postgres --single to enforce recovery once and get the target cluster in a clean shutdown state. Both commands have been applying incorrect quoting rules, which could lead to failures when for example using a target data directory with unexpected characters like CRLFs. Those commands are now generated with PQExpBuffer, making use of string_utils.h to quote those commands as they should. We may extend those commands in the future with more options, so this makes any upcoming additions easier. This is arguably a bug fix, but nobody has complained about the existing code being a problem either, so no backpatch is done. Extracted from a larger patch by the same author. Author: Gunnar "Nick" Bluth Discussion: https://postgr.es/m/7c59265d-ac50-b0aa-ca1e-65e8bd27642a@pro-open.de --- src/bin/pg_rewind/pg_rewind.c | 43 +++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c index efb82a4034..b39b5c1aac 100644 --- a/src/bin/pg_rewind/pg_rewind.c +++ b/src/bin/pg_rewind/pg_rewind.c @@ -23,6 +23,7 @@ #include "common/restricted_token.h" #include "common/string.h" #include "fe_utils/recovery_gen.h" +#include "fe_utils/string_utils.h" #include "file_ops.h" #include "filemap.h" #include "getopt_long.h" @@ -1016,8 +1017,8 @@ getRestoreCommand(const char *argv0) { int rc; char postgres_exec_path[MAXPGPATH], - postgres_cmd[MAXPGPATH], cmd_output[MAXPGPATH]; + PQExpBuffer postgres_cmd; if (!restore_wal) return; @@ -1051,11 +1052,19 @@ getRestoreCommand(const char *argv0) * Build a command able to retrieve the value of GUC parameter * restore_command, if set. */ - snprintf(postgres_cmd, sizeof(postgres_cmd), - "\"%s\" -D \"%s\" -C restore_command", - postgres_exec_path, datadir_target); + postgres_cmd = createPQExpBuffer(); - if (!pipe_read_line(postgres_cmd, cmd_output, sizeof(cmd_output))) + /* path to postgres, properly quoted */ + appendShellString(postgres_cmd, postgres_exec_path); + + /* add -D switch, with properly quoted data directory */ + appendPQExpBufferStr(postgres_cmd, " -D "); + appendShellString(postgres_cmd, datadir_target); + + /* add -C switch, for restore_command */ + appendPQExpBufferStr(postgres_cmd, " -C restore_command"); + + if (!pipe_read_line(postgres_cmd->data, cmd_output, sizeof(cmd_output))) exit(1); (void) pg_strip_crlf(cmd_output); @@ -1067,6 +1076,8 @@ getRestoreCommand(const char *argv0) pg_log_debug("using for rewind restore_command = \'%s\'", restore_command); + + destroyPQExpBuffer(postgres_cmd); } @@ -1080,7 +1091,7 @@ ensureCleanShutdown(const char *argv0) int ret; #define MAXCMDLEN (2 * MAXPGPATH) char exec_path[MAXPGPATH]; - char cmd[MAXCMDLEN]; + PQExpBuffer postgres_cmd; /* locate postgres binary */ if ((ret = find_other_exec(argv0, "postgres", @@ -1119,14 +1130,26 @@ ensureCleanShutdown(const char *argv0) * fsync here. This makes the recovery faster, and the target data folder * is synced at the end anyway. */ - snprintf(cmd, MAXCMDLEN, "\"%s\" --single -F -D \"%s\" template1 < \"%s\"", - exec_path, datadir_target, DEVNULL); + postgres_cmd = createPQExpBuffer(); - if (system(cmd) != 0) + /* path to postgres, properly quoted */ + appendShellString(postgres_cmd, exec_path); + + /* add set of options with properly quoted data directory */ + appendPQExpBufferStr(postgres_cmd, " --single -F -D "); + appendShellString(postgres_cmd, datadir_target); + + /* finish with the database name, and a properly quoted redirection */ + appendPQExpBufferStr(postgres_cmd, " template1 < "); + appendShellString(postgres_cmd, DEVNULL); + + if (system(postgres_cmd->data) != 0) { pg_log_error("postgres single-user mode in target cluster failed"); - pg_fatal("Command was: %s", cmd); + pg_fatal("Command was: %s", postgres_cmd->data); } + + destroyPQExpBuffer(postgres_cmd); } static void From 9028cce426ba6e08ee5ef8fcaedb2445e6c08c75 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 1 Mar 2022 11:21:20 +0100 Subject: [PATCH 073/772] psql: Additional tests Add a few TAP tests for things that happen while a user query is being sent: - \timing - client encoding handling - notifications Discussion: https://www.postgresql.org/message-id/3199e176-424e-1bef-f180-c1548466c2da@enterprisedb.com --- src/bin/psql/t/001_basic.pl | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl index f416e0ab5e..44ecd05add 100644 --- a/src/bin/psql/t/001_basic.pl +++ b/src/bin/psql/t/001_basic.pl @@ -60,7 +60,7 @@ sub psql_fails_like } my $node = PostgreSQL::Test::Cluster->new('main'); -$node->init; +$node->init(extra => [ '--locale=C', '--encoding=UTF8' ]); $node->append_conf( 'postgresql.conf', q{ wal_level = 'logical' @@ -80,4 +80,39 @@ sub psql_fails_like qr/unexpected PQresultStatus: 8$/, 'handling of unexpected PQresultStatus'); +# test \timing +psql_like( + $node, + '\timing on +SELECT 1', + qr/^1$ +^Time: \d+.\d\d\d ms/m, + '\timing'); + +# test that ENCODING variable is set and that it is updated when +# client encoding is changed +psql_like( + $node, + '\echo :ENCODING +set client_encoding = LATIN1; +\echo :ENCODING', + qr/^UTF8$ +^LATIN1$/m, + 'ENCODING variable is set and updated'); + +# test LISTEN/NOTIFY +psql_like( + $node, + 'LISTEN foo; +NOTIFY foo;', + qr/^Asynchronous notification "foo" received from server process with PID \d+\.$/, + 'notification'); + +psql_like( + $node, + "LISTEN foo; +NOTIFY foo, 'bar';", + qr/^Asynchronous notification "foo" with payload "bar" received from server process with PID \d+\.$/, + 'notification with payload'); + done_testing(); From dc57366c583685c4b2901f2ba69943f596b974ec Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 2 Mar 2022 07:37:07 +0900 Subject: [PATCH 074/772] Fix check for PGHOST[ADDR] in pg_upgrade with Windows and temporary paths The checks currently done at the startup of pg_upgrade on PGHOST and PGHOSTADDR to avoid any attempts to access to an external cluster fail setting those parameters to Windows paths or even temporary paths prefixed by an '@', as it only considers as a valid path strings beginning with a slash. As mentioned by Andres, is_unixsock_path() is designed to detect such cases, so, like any other code paths dealing with the same problem (psql and libpq), use it rather than assuming that all valid paths are prefixed with just a slash. This issue has been found while testing the TAP tests of pg_upgrade through the CI on Windows. This is a bug, but nobody has complained about it since pg_upgrade exists so no backpatch is done, at least for now. Analyzed-by: Andres Freund, Michael Paquier Discussion: https://postgr.es/m/YeYj4DU5qY/rtKXT@paquier.xyz --- src/bin/pg_upgrade/server.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bin/pg_upgrade/server.c b/src/bin/pg_upgrade/server.c index 7878d233de..265137e86b 100644 --- a/src/bin/pg_upgrade/server.c +++ b/src/bin/pg_upgrade/server.c @@ -11,6 +11,7 @@ #include "common/connect.h" #include "fe_utils/string_utils.h" +#include "libpq/pqcomm.h" #include "pg_upgrade.h" static PGconn *get_db_conn(ClusterInfo *cluster, const char *db_name); @@ -368,7 +369,7 @@ check_pghost_envvar(void) if (value && strlen(value) > 0 && /* check for 'local' host values */ (strcmp(value, "localhost") != 0 && strcmp(value, "127.0.0.1") != 0 && - strcmp(value, "::1") != 0 && value[0] != '/')) + strcmp(value, "::1") != 0 && !is_unixsock_path(value))) pg_fatal("libpq environment variable %s has a non-local server value: %s\n", option->envvar, value); } From 506035b0b8323126823849483cee833e1de75330 Mon Sep 17 00:00:00 2001 From: Tatsuo Ishii Date: Wed, 2 Mar 2022 08:28:12 +0900 Subject: [PATCH 075/772] Fix typo in pgbench messages. Author: KAWAMOTO Masaya Reviewed-by: Fabien COELHO Discussion: https://postgr.es/m/20220224115622.41e671e3449ebd8c270e9103%40sraoss.co.jp --- src/bin/pgbench/pgbench.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index f166a77e3a..4ebe5e6ea4 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -5598,11 +5598,11 @@ printResults(StatsData *total, return; if (throttle_delay && latency_limit) - printf("number of transactions skipped: " INT64_FORMAT " (%.3f %%)\n", + printf("number of transactions skipped: " INT64_FORMAT " (%.3f%%)\n", total->skipped, 100.0 * total->skipped / total->cnt); if (latency_limit) - printf("number of transactions above the %.1f ms latency limit: " INT64_FORMAT "/" INT64_FORMAT " (%.3f %%)\n", + printf("number of transactions above the %.1f ms latency limit: " INT64_FORMAT "/" INT64_FORMAT " (%.3f%%)\n", latency_limit / 1000.0, latency_late, ntx, (ntx > 0) ? 100.0 * latency_late / ntx : 0.0); From e58791c6ad317fddcb7f54d19f6a8a4c43fecf7b Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 2 Mar 2022 10:30:41 +0100 Subject: [PATCH 076/772] Add id's to various elements in protocol.sgml For easier direct linking. Author: Brar Piening Discussion: https://www.postgresql.org/message-id/flat/dbad4f77-4dce-1b05-2b65-831acb5d5b66@gmx.de --- doc/src/sgml/logicaldecoding.sgml | 2 +- doc/src/sgml/protocol.sgml | 172 +++++++++++++++--------------- 2 files changed, 87 insertions(+), 87 deletions(-) diff --git a/doc/src/sgml/logicaldecoding.sgml b/doc/src/sgml/logicaldecoding.sgml index 5ebf23e963..3d7d52a84d 100644 --- a/doc/src/sgml/logicaldecoding.sgml +++ b/doc/src/sgml/logicaldecoding.sgml @@ -342,7 +342,7 @@ postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NU Exported Snapshots When a new replication slot is created using the streaming replication - interface (see ), a + interface (see ), a snapshot is exported (see ), which will show exactly the state of the database after which all changes will be diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 1c5ab00879..c51c4254a7 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -1810,7 +1810,7 @@ Replication commands are logged in the server log when The commands accepted in replication mode are: - + IDENTIFY_SYSTEM IDENTIFY_SYSTEM @@ -1875,7 +1875,7 @@ The commands accepted in replication mode are: - + SHOW name SHOW @@ -1899,7 +1899,7 @@ The commands accepted in replication mode are: - + TIMELINE_HISTORY tli TIMELINE_HISTORY @@ -1941,7 +1941,7 @@ The commands accepted in replication mode are: - + CREATE_REPLICATION_SLOT slot_name [ TEMPORARY ] { PHYSICAL | LOGICAL } [ ( option [, ...] ) ] CREATE_REPLICATION_SLOT @@ -2084,7 +2084,7 @@ The commands accepted in replication mode are: - + CREATE_REPLICATION_SLOT slot_name [ TEMPORARY ] { PHYSICAL [ RESERVE_WAL ] | LOGICAL output_plugin [ EXPORT_SNAPSHOT | NOEXPORT_SNAPSHOT | USE_SNAPSHOT | TWO_PHASE ] } @@ -2095,7 +2095,7 @@ The commands accepted in replication mode are: - + READ_REPLICATION_SLOT slot_name READ_REPLICATION_SLOT @@ -2143,7 +2143,7 @@ The commands accepted in replication mode are: - + START_REPLICATION [ SLOT slot_name ] [ PHYSICAL ] XXX/XXX [ TIMELINE tli ] START_REPLICATION @@ -2201,7 +2201,7 @@ The commands accepted in replication mode are: - + XLogData (B) @@ -2270,7 +2270,7 @@ The commands accepted in replication mode are: - + Primary keepalive message (B) @@ -2334,7 +2334,7 @@ The commands accepted in replication mode are: - + Standby status update (F) @@ -2415,7 +2415,7 @@ The commands accepted in replication mode are: - + Hot Standby feedback message (F) @@ -2497,7 +2497,7 @@ The commands accepted in replication mode are: - + START_REPLICATION SLOT slot_name LOGICAL XXX/XXX [ ( option_name [ option_value ] [, ...] ) ] @@ -2572,7 +2572,7 @@ The commands accepted in replication mode are: - + DROP_REPLICATION_SLOT slot_name WAIT DROP_REPLICATION_SLOT @@ -3266,7 +3266,7 @@ of any individual CopyData message cannot be interpretable on their own.) - + AuthenticationOk (B) @@ -3311,7 +3311,7 @@ AuthenticationOk (B) - + AuthenticationKerberosV5 (B) @@ -3355,7 +3355,7 @@ AuthenticationKerberosV5 (B) - + AuthenticationCleartextPassword (B) @@ -3399,7 +3399,7 @@ AuthenticationCleartextPassword (B) - + AuthenticationMD5Password (B) @@ -3454,7 +3454,7 @@ AuthenticationMD5Password (B) - + AuthenticationSCMCredential (B) @@ -3499,7 +3499,7 @@ AuthenticationSCMCredential (B) - + AuthenticationGSS (B) @@ -3544,7 +3544,7 @@ AuthenticationGSS (B) - + AuthenticationGSSContinue (B) @@ -3599,7 +3599,7 @@ AuthenticationGSSContinue (B) - + AuthenticationSSPI (B) @@ -3644,7 +3644,7 @@ AuthenticationSSPI (B) - + AuthenticationSASL (B) @@ -3705,7 +3705,7 @@ following: - + AuthenticationSASLContinue (B) @@ -3760,7 +3760,7 @@ AuthenticationSASLContinue (B) - + AuthenticationSASLFinal (B) @@ -3816,7 +3816,7 @@ AuthenticationSASLFinal (B) - + BackendKeyData (B) @@ -3873,7 +3873,7 @@ BackendKeyData (B) - + Bind (F) @@ -4026,7 +4026,7 @@ Bind (F) - + BindComplete (B) @@ -4061,7 +4061,7 @@ BindComplete (B) - + CancelRequest (F) @@ -4119,7 +4119,7 @@ CancelRequest (F) - + Close (F) @@ -4176,7 +4176,7 @@ Close (F) - + CloseComplete (B) @@ -4211,7 +4211,7 @@ CloseComplete (B) - + CommandComplete (B) @@ -4310,7 +4310,7 @@ CommandComplete (B) - + CopyData (F & B) @@ -4356,7 +4356,7 @@ CopyData (F & B) - + CopyDone (F & B) @@ -4391,7 +4391,7 @@ CopyDone (F & B) - + CopyFail (F) @@ -4436,7 +4436,7 @@ CopyFail (F) - + CopyInResponse (B) @@ -4512,7 +4512,7 @@ CopyInResponse (B) - + CopyOutResponse (B) @@ -4585,7 +4585,7 @@ CopyOutResponse (B) - + CopyBothResponse (B) @@ -4658,7 +4658,7 @@ CopyBothResponse (B) - + DataRow (B) @@ -4730,7 +4730,7 @@ DataRow (B) - + Describe (F) @@ -4787,7 +4787,7 @@ Describe (F) - + EmptyQueryResponse (B) @@ -4823,7 +4823,7 @@ EmptyQueryResponse (B) - + ErrorResponse (B) @@ -4889,7 +4889,7 @@ ErrorResponse (B) - + Execute (F) @@ -4946,7 +4946,7 @@ Execute (F) - + Flush (F) @@ -4981,7 +4981,7 @@ Flush (F) - + FunctionCall (F) @@ -5106,7 +5106,7 @@ FunctionCall (F) - + FunctionCallResponse (B) @@ -5166,7 +5166,7 @@ FunctionCallResponse (B) - + GSSENCRequest (F) @@ -5204,7 +5204,7 @@ GSSENCRequest (F) - + GSSResponse (F) @@ -5249,7 +5249,7 @@ GSSResponse (F) - + NegotiateProtocolVersion (B) @@ -5318,7 +5318,7 @@ NegotiateProtocolVersion (B) - + NoData (B) @@ -5353,7 +5353,7 @@ NoData (B) - + NoticeResponse (B) @@ -5419,7 +5419,7 @@ NoticeResponse (B) - + NotificationResponse (B) @@ -5484,7 +5484,7 @@ NotificationResponse (B) - + ParameterDescription (B) @@ -5542,7 +5542,7 @@ ParameterDescription (B) - + ParameterStatus (B) @@ -5596,7 +5596,7 @@ ParameterStatus (B) - + Parse (F) @@ -5680,7 +5680,7 @@ Parse (F) - + ParseComplete (B) @@ -5715,7 +5715,7 @@ ParseComplete (B) - + PasswordMessage (F) @@ -5761,7 +5761,7 @@ PasswordMessage (F) - + PortalSuspended (B) @@ -5798,7 +5798,7 @@ PortalSuspended (B) - + Query (F) @@ -5843,7 +5843,7 @@ Query (F) - + ReadyForQuery (B) @@ -5893,7 +5893,7 @@ ReadyForQuery (B) - + RowDescription (B) @@ -6018,7 +6018,7 @@ RowDescription (B) - + SASLInitialResponse (F) @@ -6086,7 +6086,7 @@ SASLInitialResponse (F) - + SASLResponse (F) @@ -6132,7 +6132,7 @@ SASLResponse (F) - + SSLRequest (F) @@ -6170,7 +6170,7 @@ SSLRequest (F) - + StartupMessage (F) @@ -6299,7 +6299,7 @@ StartupMessage (F) - + Sync (F) @@ -6334,7 +6334,7 @@ Sync (F) - + Terminate (F) @@ -6665,7 +6665,7 @@ flow as physical replication. - + Begin @@ -6720,7 +6720,7 @@ Begin - + Message @@ -6808,7 +6808,7 @@ Message - + Commit @@ -6873,7 +6873,7 @@ Commit - + Origin @@ -6922,7 +6922,7 @@ Origin - + Relation @@ -7054,7 +7054,7 @@ Relation - + Type @@ -7119,7 +7119,7 @@ Type - + Insert @@ -7186,7 +7186,7 @@ Insert - + Update @@ -7300,7 +7300,7 @@ Update - + Delete @@ -7389,7 +7389,7 @@ Delete - + Truncate @@ -7467,7 +7467,7 @@ Stream Abort) are available since protocol version 2. - + Stream Start @@ -7512,7 +7512,7 @@ Stream Start - + Stream Stop @@ -7536,7 +7536,7 @@ Stream Stop - + Stream Commit @@ -7611,7 +7611,7 @@ Stream Commit - + Stream Abort @@ -7665,7 +7665,7 @@ are available since protocol version 3. - + Begin Prepare @@ -7730,7 +7730,7 @@ are available since protocol version 3. - + Prepare @@ -7804,7 +7804,7 @@ are available since protocol version 3. - + Commit Prepared @@ -7878,7 +7878,7 @@ are available since protocol version 3. - + Rollback Prepared @@ -7962,7 +7962,7 @@ are available since protocol version 3. - + Stream Prepare @@ -8046,7 +8046,7 @@ The following message parts are shared by the above messages. - + TupleData From 50f03473ed8132a43bf5c10764fb5b9eda71ac16 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 2 Mar 2022 11:29:11 -0500 Subject: [PATCH 077/772] Doc: update libpq.sgml for root-owned SSL private keys. My oversight in a59c79564. Discussion: https://postgr.es/m/f4b7bc55-97ac-9e69-7398-335e212f7743@pgmasters.net --- doc/src/sgml/libpq.sgml | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index 64e17401cd..3998b1781b 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -8397,23 +8397,35 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*) If the server attempts to verify the identity of the client by requesting the client's leaf certificate, - libpq will send the certificates stored in + libpq will send the certificate(s) stored in file ~/.postgresql/postgresql.crt in the user's home directory. The certificates must chain to the root certificate trusted by the server. A matching private key file ~/.postgresql/postgresql.key must also - be present. The private - key file must not allow any access to world or group; achieve this by the - command chmod 0600 ~/.postgresql/postgresql.key. + be present. On Microsoft Windows these files are named %APPDATA%\postgresql\postgresql.crt and - %APPDATA%\postgresql\postgresql.key, and there - is no special permissions check since the directory is presumed secure. + %APPDATA%\postgresql\postgresql.key. The location of the certificate and key files can be overridden by the - connection parameters sslcert and sslkey or the + connection parameters sslcert + and sslkey, or by the environment variables PGSSLCERT and PGSSLKEY. + + On Unix systems, the permissions on the private key file must disallow + any access to world or group; achieve this by a command such as + chmod 0600 ~/.postgresql/postgresql.key. + Alternatively, the file can be owned by root and have group read access + (that is, 0640 permissions). That setup is intended + for installations where certificate and key files are managed by the + operating system. The user of libpq should + then be made a member of the group that has access to those certificate + and key files. (On Microsoft Windows, there is no file permissions + check, since the %APPDATA%\postgresql directory is + presumed secure.) + + The first certificate in postgresql.crt must be the client's certificate because it must match the client's private key. From 62ce0c758d5d66092efbca7d037233e2ca9bdc78 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 3 Mar 2022 10:51:57 +0900 Subject: [PATCH 078/772] Fix catalog data of pg_stop_backup(), labelled v2 This function has been incorrectly marked as a set-returning function with prorows (estimated number of rows) set to 1 since its creation in 7117685, that introduced non-exclusive backups. There is no need for that as the function is designed to return only one tuple. This commit fixes the catalog definition of pg_stop_backup_v2() so as it is not marked as proretset anymore, with prorows set to 0. This simplifies its internals by removing one tuplestore (used for one single record anyway) and by removing all the checks related to a set-returning function. Issue found during my quest to simplify some of the logic used in in-core system functions. Bump catalog version. Reviewed-by: Aleksander Alekseev, Kyotaro Horiguchi Discussion: https://postgr.es/m/Yh8guT78f1Ercfzw@paquier.xyz --- src/backend/access/transam/xlogfuncs.c | 36 ++++-------------------- src/backend/catalog/system_functions.sql | 2 +- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.dat | 6 ++-- 4 files changed, 11 insertions(+), 35 deletions(-) diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c index 12e2bf4135..2752be63c1 100644 --- a/src/backend/access/transam/xlogfuncs.c +++ b/src/backend/access/transam/xlogfuncs.c @@ -165,43 +165,20 @@ pg_stop_backup(PG_FUNCTION_ARGS) Datum pg_stop_backup_v2(PG_FUNCTION_ARGS) { - ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; +#define PG_STOP_BACKUP_V2_COLS 3 TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; - Datum values[3]; - bool nulls[3]; + Datum values[PG_STOP_BACKUP_V2_COLS]; + bool nulls[PG_STOP_BACKUP_V2_COLS]; bool exclusive = PG_GETARG_BOOL(0); bool waitforarchive = PG_GETARG_BOOL(1); XLogRecPtr stoppoint; SessionBackupState status = get_backup_status(); - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ + /* Initialize attributes information in the tuple descriptor */ if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) elog(ERROR, "return type must be a row type"); - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); - MemSet(values, 0, sizeof(values)); MemSet(nulls, 0, sizeof(nulls)); @@ -251,9 +228,8 @@ pg_stop_backup_v2(PG_FUNCTION_ARGS) /* Stoppoint is included on both exclusive and nonexclusive backups */ values[0] = LSNGetDatum(stoppoint); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); - - return (Datum) 0; + /* Returns the record as Datum */ + PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls))); } /* diff --git a/src/backend/catalog/system_functions.sql b/src/backend/catalog/system_functions.sql index 758ab6e25a..81bac6f581 100644 --- a/src/backend/catalog/system_functions.sql +++ b/src/backend/catalog/system_functions.sql @@ -384,7 +384,7 @@ CREATE OR REPLACE FUNCTION CREATE OR REPLACE FUNCTION pg_stop_backup ( exclusive boolean, wait_for_archive boolean DEFAULT true, OUT lsn pg_lsn, OUT labelfile text, OUT spcmapfile text) - RETURNS SETOF record STRICT VOLATILE LANGUAGE internal as 'pg_stop_backup_v2' + RETURNS record STRICT VOLATILE LANGUAGE internal as 'pg_stop_backup_v2' PARALLEL RESTRICTED; CREATE OR REPLACE FUNCTION diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 5cf18059b8..695990959e 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202203011 +#define CATALOG_VERSION_NO 202203031 #endif diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index bf88858171..d8e8715ed1 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -6275,9 +6275,9 @@ proname => 'pg_stop_backup', provolatile => 'v', proparallel => 'r', prorettype => 'pg_lsn', proargtypes => '', prosrc => 'pg_stop_backup' }, { oid => '2739', descr => 'finish taking an online backup', - proname => 'pg_stop_backup', prorows => '1', proretset => 't', - provolatile => 'v', proparallel => 'r', prorettype => 'record', - proargtypes => 'bool bool', proallargtypes => '{bool,bool,pg_lsn,text,text}', + proname => 'pg_stop_backup', provolatile => 'v', proparallel => 'r', + prorettype => 'record', proargtypes => 'bool bool', + proallargtypes => '{bool,bool,pg_lsn,text,text}', proargmodes => '{i,i,o,o,o}', proargnames => '{exclusive,wait_for_archive,lsn,labelfile,spcmapfile}', prosrc => 'pg_stop_backup_v2' }, From 46ab07ffda9d6c8e63360ded2d4568aa160a7700 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 3 Mar 2022 18:13:24 -0500 Subject: [PATCH 079/772] Clean up assorted failures under clang's -fsanitize=undefined checks. Most of these are cases where we could call memcpy() or other libc functions with a NULL pointer and a zero count, which is forbidden by POSIX even though every production version of libc allows it. We've fixed such things before in a piecemeal way, but apparently never made an effort to try to get them all. I don't claim that this patch does so either, but it gets every failure I observe in check-world, using clang 12.0.1 on current RHEL8. numeric.c has a different issue that the sanitizer doesn't like: "ln(-1.0)" will compute log10(0) and then try to assign the resulting -Inf to an integer variable. We don't actually use the result in such a case, so there's no live bug. Back-patch to all supported branches, with the idea that we might start running a buildfarm member that tests this case. This includes back-patching c1132aae3 (Check the size in COPY_POINTER_FIELD), which previously silenced some of these issues in copyfuncs.c. Discussion: https://postgr.es/m/CALNJ-vT9r0DSsAOw9OXVJFxLENoVS_68kJ5x0p44atoYH+H4dg@mail.gmail.com --- contrib/pgcrypto/px.c | 2 +- src/backend/access/heap/heapam.c | 2 +- src/backend/access/heap/heapam_visibility.c | 4 ++-- src/backend/access/transam/clog.c | 5 +++-- src/backend/access/transam/xact.c | 5 +++-- src/backend/storage/ipc/shm_mq.c | 7 +++++-- src/backend/utils/adt/numeric.c | 8 ++++++++ src/backend/utils/time/snapmgr.c | 10 ++++++---- src/fe_utils/print.c | 3 ++- 9 files changed, 31 insertions(+), 15 deletions(-) diff --git a/contrib/pgcrypto/px.c b/contrib/pgcrypto/px.c index 75e2426e9f..0010addaf7 100644 --- a/contrib/pgcrypto/px.c +++ b/contrib/pgcrypto/px.c @@ -198,7 +198,7 @@ combo_init(PX_Combo *cx, const uint8 *key, unsigned klen, ivbuf = palloc0(ivs); if (ivlen > ivs) memcpy(ivbuf, iv, ivs); - else + else if (ivlen > 0) memcpy(ivbuf, iv, ivlen); } diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 59d43e2ba9..4e6aeba315 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -328,7 +328,7 @@ initscan(HeapScanDesc scan, ScanKey key, bool keep_startblock) /* * copy the scan key, if appropriate */ - if (key != NULL) + if (key != NULL && scan->rs_base.rs_nkeys > 0) memcpy(scan->rs_base.rs_key, key, scan->rs_base.rs_nkeys * sizeof(ScanKeyData)); /* diff --git a/src/backend/access/heap/heapam_visibility.c b/src/backend/access/heap/heapam_visibility.c index ceadac70d5..ff0b8a688d 100644 --- a/src/backend/access/heap/heapam_visibility.c +++ b/src/backend/access/heap/heapam_visibility.c @@ -1564,8 +1564,8 @@ HeapTupleHeaderIsOnlyLocked(HeapTupleHeader tuple) static bool TransactionIdInArray(TransactionId xid, TransactionId *xip, Size num) { - return bsearch(&xid, xip, num, - sizeof(TransactionId), xidComparator) != NULL; + return num > 0 && + bsearch(&xid, xip, num, sizeof(TransactionId), xidComparator) != NULL; } /* diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c index de787c3d37..3d9088a704 100644 --- a/src/backend/access/transam/clog.c +++ b/src/backend/access/transam/clog.c @@ -297,8 +297,9 @@ TransactionIdSetPageStatus(TransactionId xid, int nsubxids, if (all_xact_same_page && xid == MyProc->xid && nsubxids <= THRESHOLD_SUBTRANS_CLOG_OPT && nsubxids == MyProc->subxidStatus.count && - memcmp(subxids, MyProc->subxids.xids, - nsubxids * sizeof(TransactionId)) == 0) + (nsubxids == 0 || + memcmp(subxids, MyProc->subxids.xids, + nsubxids * sizeof(TransactionId)) == 0)) { /* * If we can immediately acquire XactSLRULock, we update the status of diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index adf763a8ea..8964ddf3eb 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -5353,8 +5353,9 @@ SerializeTransactionState(Size maxsize, char *start_address) { if (FullTransactionIdIsValid(s->fullTransactionId)) workspace[i++] = XidFromFullTransactionId(s->fullTransactionId); - memcpy(&workspace[i], s->childXids, - s->nChildXids * sizeof(TransactionId)); + if (s->nChildXids > 0) + memcpy(&workspace[i], s->childXids, + s->nChildXids * sizeof(TransactionId)); i += s->nChildXids; } Assert(i == nxids); diff --git a/src/backend/storage/ipc/shm_mq.c b/src/backend/storage/ipc/shm_mq.c index 45b0dfc062..603cf9b0fa 100644 --- a/src/backend/storage/ipc/shm_mq.c +++ b/src/backend/storage/ipc/shm_mq.c @@ -773,8 +773,11 @@ shm_mq_receive(shm_mq_handle *mqh, Size *nbytesp, void **datap, bool nowait) /* Copy as much as we can. */ Assert(mqh->mqh_partial_bytes + rb <= nbytes); - memcpy(&mqh->mqh_buffer[mqh->mqh_partial_bytes], rawdata, rb); - mqh->mqh_partial_bytes += rb; + if (rb > 0) + { + memcpy(&mqh->mqh_buffer[mqh->mqh_partial_bytes], rawdata, rb); + mqh->mqh_partial_bytes += rb; + } /* * Update count of bytes that can be consumed, accounting for diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index 975d7dcf47..45547f6ae7 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -10048,12 +10048,20 @@ exp_var(const NumericVar *arg, NumericVar *result, int rscale) * * Essentially, we're approximating log10(abs(ln(var))). This is used to * determine the appropriate rscale when computing natural logarithms. + * + * Note: many callers call this before range-checking the input. Therefore, + * we must be robust against values that are invalid to apply ln() to. + * We don't wish to throw an error here, so just return zero in such cases. */ static int estimate_ln_dweight(const NumericVar *var) { int ln_dweight; + /* Caller should fail on ln(negative), but for the moment return zero */ + if (var->sign != NUMERIC_POS) + return 0; + if (cmp_var(var, &const_zero_point_nine) >= 0 && cmp_var(var, &const_one_point_one) <= 0) { diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c index a0b81bf154..a0be0c411a 100644 --- a/src/backend/utils/time/snapmgr.c +++ b/src/backend/utils/time/snapmgr.c @@ -536,12 +536,14 @@ SetTransactionSnapshot(Snapshot sourcesnap, VirtualTransactionId *sourcevxid, CurrentSnapshot->xmax = sourcesnap->xmax; CurrentSnapshot->xcnt = sourcesnap->xcnt; Assert(sourcesnap->xcnt <= GetMaxSnapshotXidCount()); - memcpy(CurrentSnapshot->xip, sourcesnap->xip, - sourcesnap->xcnt * sizeof(TransactionId)); + if (sourcesnap->xcnt > 0) + memcpy(CurrentSnapshot->xip, sourcesnap->xip, + sourcesnap->xcnt * sizeof(TransactionId)); CurrentSnapshot->subxcnt = sourcesnap->subxcnt; Assert(sourcesnap->subxcnt <= GetMaxSnapshotSubxidCount()); - memcpy(CurrentSnapshot->subxip, sourcesnap->subxip, - sourcesnap->subxcnt * sizeof(TransactionId)); + if (sourcesnap->subxcnt > 0) + memcpy(CurrentSnapshot->subxip, sourcesnap->subxip, + sourcesnap->subxcnt * sizeof(TransactionId)); CurrentSnapshot->suboverflowed = sourcesnap->suboverflowed; CurrentSnapshot->takenDuringRecovery = sourcesnap->takenDuringRecovery; /* NB: curcid should NOT be copied, it's a local matter */ diff --git a/src/fe_utils/print.c b/src/fe_utils/print.c index 2c8e58ebf5..dcdb2e0d0c 100644 --- a/src/fe_utils/print.c +++ b/src/fe_utils/print.c @@ -966,7 +966,8 @@ print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager) more_col_wrapping = col_count; curr_nl_line = 0; - memset(header_done, false, col_count * sizeof(bool)); + if (col_count > 0) + memset(header_done, false, col_count * sizeof(bool)); while (more_col_wrapping) { if (opt_border == 2) From 0fbdfaf79d0bbfe1ede9d8ca2d85b2c9a8513082 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 3 Mar 2022 19:03:17 -0500 Subject: [PATCH 080/772] Fix bogus casting in BlockIdGetBlockNumber(). This macro cast the result to BlockNumber after shifting, not before, which is the wrong thing. Per the C spec, the uint16 fields would promote to int not unsigned int, so that (for 32-bit int) the shift potentially shifts a nonzero bit into the sign position. I doubt there are any production systems where this would actually end with the wrong answer, but it is undefined behavior per the C spec, and clang's -fsanitize=undefined option reputedly warns about it on some platforms. (I can't reproduce that right now, but the code is undeniably wrong per spec.) It's easy to fix by casting to BlockNumber (uint32) in the proper places. It's been wrong for ages, so back-patch to all supported branches. Report and patch by Zhihong Yu (cosmetic tweaking by me) Discussion: https://postgr.es/m/CALNJ-vT9r0DSsAOw9OXVJFxLENoVS_68kJ5x0p44atoYH+H4dg@mail.gmail.com --- src/include/storage/block.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/include/storage/block.h b/src/include/storage/block.h index 4c9d3ace8e..cf1fc499df 100644 --- a/src/include/storage/block.h +++ b/src/include/storage/block.h @@ -115,7 +115,7 @@ typedef BlockIdData *BlockId; /* block identifier */ #define BlockIdGetBlockNumber(blockId) \ ( \ AssertMacro(BlockIdIsValid(blockId)), \ - (BlockNumber) (((blockId)->bi_hi << 16) | ((uint16) (blockId)->bi_lo)) \ + ((((BlockNumber) (blockId)->bi_hi) << 16) | ((BlockNumber) (blockId)->bi_lo)) \ ) #endif /* BLOCK_H */ From 8134fe4ad80a1f9673770126ed7c45045b8ef467 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 3 Mar 2022 19:15:38 -0500 Subject: [PATCH 081/772] Remove some pointless code in block.h. There's no visible point in casting the result of a comparison to bool, because it already is that, at least on C99 compilers. I see no point in these assertions that a pointer we're about to dereference isn't null, either. If it is, the resulting SIGSEGV will notify us of the problem just fine. Noted while reviewing Zhihong Yu's patch. This is basically cosmetic, so no need for back-patch. Discussion: https://postgr.es/m/CALNJ-vT9r0DSsAOw9OXVJFxLENoVS_68kJ5x0p44atoYH+H4dg@mail.gmail.com --- src/include/storage/block.h | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/include/storage/block.h b/src/include/storage/block.h index cf1fc499df..d756e3fda5 100644 --- a/src/include/storage/block.h +++ b/src/include/storage/block.h @@ -68,14 +68,14 @@ typedef BlockIdData *BlockId; /* block identifier */ * True iff blockNumber is valid. */ #define BlockNumberIsValid(blockNumber) \ - ((bool) ((BlockNumber) (blockNumber) != InvalidBlockNumber)) + ((BlockNumber) (blockNumber) != InvalidBlockNumber) /* * BlockIdIsValid * True iff the block identifier is valid. */ #define BlockIdIsValid(blockId) \ - ((bool) PointerIsValid(blockId)) + PointerIsValid(blockId) /* * BlockIdSet @@ -83,7 +83,6 @@ typedef BlockIdData *BlockId; /* block identifier */ */ #define BlockIdSet(blockId, blockNumber) \ ( \ - AssertMacro(PointerIsValid(blockId)), \ (blockId)->bi_hi = (blockNumber) >> 16, \ (blockId)->bi_lo = (blockNumber) & 0xffff \ ) @@ -94,8 +93,6 @@ typedef BlockIdData *BlockId; /* block identifier */ */ #define BlockIdCopy(toBlockId, fromBlockId) \ ( \ - AssertMacro(PointerIsValid(toBlockId)), \ - AssertMacro(PointerIsValid(fromBlockId)), \ (toBlockId)->bi_hi = (fromBlockId)->bi_hi, \ (toBlockId)->bi_lo = (fromBlockId)->bi_lo \ ) @@ -113,9 +110,6 @@ typedef BlockIdData *BlockId; /* block identifier */ * Retrieve the block number from a block identifier. */ #define BlockIdGetBlockNumber(blockId) \ -( \ - AssertMacro(BlockIdIsValid(blockId)), \ - ((((BlockNumber) (blockId)->bi_hi) << 16) | ((BlockNumber) (blockId)->bi_lo)) \ -) + ((((BlockNumber) (blockId)->bi_hi) << 16) | ((BlockNumber) (blockId)->bi_lo)) #endif /* BLOCK_H */ From b3c8aae00850384b1cec5311eb1864e2f5e80a44 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 4 Mar 2022 09:51:12 +0900 Subject: [PATCH 082/772] doc: Fix description of pg_stop_backup() The function was still documented as returning a set of records, something not true as of 62ce0c7. Reported-by: Tom Lane Discussion: https://postgr.es/m/3159823.1646320180@sss.pgh.pa.us --- doc/src/sgml/func.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index df3cd5987b..8a802fb225 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -25726,7 +25726,7 @@ LOG: Grand total: 1651920 bytes in 201 blocks; 622360 free (88 chunks); 1029560 exclusive boolean , wait_for_archive boolean ) - setof record + record ( lsn pg_lsn, labelfile text, spcmapfile text ) From f7ea240aa7491b6ed2985bb50888bd432f3341df Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 3 Mar 2022 20:03:47 -0500 Subject: [PATCH 083/772] Tighten overflow checks in tidin(). This code seems to have been written on the assumption that "unsigned long" is 32 bits; or at any rate it ignored the possibility of conversion overflow. Rewrite, borrowing some logic from oidin(). Discussion: https://postgr.es/m/3441768.1646343914@sss.pgh.pa.us --- src/backend/utils/adt/tid.c | 28 +++++++++++++++++++++------- src/test/regress/expected/tid.out | 19 +++++++++++++++++++ src/test/regress/sql/tid.sql | 12 ++++++++++++ 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/src/backend/utils/adt/tid.c b/src/backend/utils/adt/tid.c index dcc1620afb..83ac589f95 100644 --- a/src/backend/utils/adt/tid.c +++ b/src/backend/utils/adt/tid.c @@ -64,10 +64,10 @@ tidin(PG_FUNCTION_ARGS) BlockNumber blockNumber; OffsetNumber offsetNumber; char *badp; - int hold_offset; + unsigned long cvt; for (i = 0, p = str; *p && i < NTIDARGS && *p != RDELIM; p++) - if (*p == DELIM || (*p == LDELIM && !i)) + if (*p == DELIM || (*p == LDELIM && i == 0)) coord[i++] = p + 1; if (i < NTIDARGS) @@ -77,22 +77,36 @@ tidin(PG_FUNCTION_ARGS) "tid", str))); errno = 0; - blockNumber = strtoul(coord[0], &badp, 10); + cvt = strtoul(coord[0], &badp, 10); if (errno || *badp != DELIM) ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for type %s: \"%s\"", "tid", str))); + blockNumber = (BlockNumber) cvt; - hold_offset = strtol(coord[1], &badp, 10); - if (errno || *badp != RDELIM || - hold_offset > USHRT_MAX || hold_offset < 0) + /* + * Cope with possibility that unsigned long is wider than BlockNumber, in + * which case strtoul will not raise an error for some values that are out + * of the range of BlockNumber. (See similar code in oidin().) + */ +#if SIZEOF_LONG > 4 + if (cvt != (unsigned long) blockNumber && + cvt != (unsigned long) ((int32) blockNumber)) ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for type %s: \"%s\"", "tid", str))); +#endif - offsetNumber = hold_offset; + cvt = strtoul(coord[1], &badp, 10); + if (errno || *badp != RDELIM || + cvt > USHRT_MAX) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("invalid input syntax for type %s: \"%s\"", + "tid", str))); + offsetNumber = (OffsetNumber) cvt; result = (ItemPointer) palloc(sizeof(ItemPointerData)); diff --git a/src/test/regress/expected/tid.out b/src/test/regress/expected/tid.out index 8da1a45576..7d8957bd6f 100644 --- a/src/test/regress/expected/tid.out +++ b/src/test/regress/expected/tid.out @@ -1,3 +1,22 @@ +-- basic tests for the TID data type +SELECT + '(0,0)'::tid as tid00, + '(0,1)'::tid as tid01, + '(-1,0)'::tid as tidm10, + '(4294967295,65535)'::tid as tidmax; + tid00 | tid01 | tidm10 | tidmax +-------+-------+----------------+-------------------- + (0,0) | (0,1) | (4294967295,0) | (4294967295,65535) +(1 row) + +SELECT '(4294967296,1)'::tid; -- error +ERROR: invalid input syntax for type tid: "(4294967296,1)" +LINE 1: SELECT '(4294967296,1)'::tid; + ^ +SELECT '(1,65536)'::tid; -- error +ERROR: invalid input syntax for type tid: "(1,65536)" +LINE 1: SELECT '(1,65536)'::tid; + ^ -- tests for functions related to TID handling CREATE TABLE tid_tab (a int); -- min() and max() for TIDs diff --git a/src/test/regress/sql/tid.sql b/src/test/regress/sql/tid.sql index 34546a3cb7..990d314a5f 100644 --- a/src/test/regress/sql/tid.sql +++ b/src/test/regress/sql/tid.sql @@ -1,3 +1,15 @@ +-- basic tests for the TID data type + +SELECT + '(0,0)'::tid as tid00, + '(0,1)'::tid as tid01, + '(-1,0)'::tid as tidm10, + '(4294967295,65535)'::tid as tidmax; + +SELECT '(4294967296,1)'::tid; -- error +SELECT '(1,65536)'::tid; -- error + + -- tests for functions related to TID handling CREATE TABLE tid_tab (a int); From ceb57afd3ce177e897cb4c5b44aa683fc0036782 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Fri, 4 Mar 2022 07:54:12 +0530 Subject: [PATCH 084/772] Add some additional tests for row filters in logical replication. Commit 52e4f0cd47 didn't add tests for pg_dump support, so add a few tests for it. Additionally, verify that catalogs are updated after few ALTER PUBLICATION commands that modify row filters by using \d. Reported-by: Tomas Vondra Author: Shi yu, based on initial by Tomas Vondra Reviewed-by: Euler Taveira and Amit Kapila Discussion: https://postgr.es/m/6bdbd7fc-e81a-9a77-d963-24adeb95f29e@enterprisedb.com --- src/bin/pg_dump/t/002_pg_dump.pl | 34 +++++++++++++++++++++++ src/test/regress/expected/publication.out | 22 +++++++++++++++ src/test/regress/sql/publication.sql | 3 ++ 3 files changed, 59 insertions(+) diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index dd065c758f..d9bc267f6d 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -2382,6 +2382,15 @@ like => { %full_runs, section_post_data => 1, }, }, + 'CREATE PUBLICATION pub4' => { + create_order => 50, + create_sql => 'CREATE PUBLICATION pub4;', + regexp => qr/^ + \QCREATE PUBLICATION pub4 WITH (publish = 'insert, update, delete, truncate');\E + /xm, + like => { %full_runs, section_post_data => 1, }, + }, + 'CREATE SUBSCRIPTION sub1' => { create_order => 50, create_sql => 'CREATE SUBSCRIPTION sub1 @@ -2439,6 +2448,31 @@ like => { %full_runs, section_post_data => 1, }, }, + 'ALTER PUBLICATION pub4 ADD TABLE test_table WHERE (col1 > 0);' => { + create_order => 51, + create_sql => + 'ALTER PUBLICATION pub4 ADD TABLE dump_test.test_table WHERE (col1 > 0);', + regexp => qr/^ + \QALTER PUBLICATION pub4 ADD TABLE ONLY dump_test.test_table WHERE ((col1 > 0));\E + /xm, + like => { %full_runs, section_post_data => 1, }, + unlike => { + exclude_dump_test_schema => 1, + exclude_test_table => 1, + }, + }, + + 'ALTER PUBLICATION pub4 ADD TABLE test_second_table WHERE (col2 = \'test\');' => { + create_order => 52, + create_sql => + 'ALTER PUBLICATION pub4 ADD TABLE dump_test.test_second_table WHERE (col2 = \'test\');', + regexp => qr/^ + \QALTER PUBLICATION pub4 ADD TABLE ONLY dump_test.test_second_table WHERE ((col2 = 'test'::text));\E + /xm, + like => { %full_runs, section_post_data => 1, }, + unlike => { exclude_dump_test_schema => 1, }, + }, + 'CREATE SCHEMA public' => { regexp => qr/^CREATE SCHEMA public;/m, diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index 3c382e520e..4e191c120a 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -263,6 +263,12 @@ Tables: "public.testpub_rf_tbl1" "public.testpub_rf_tbl2" WHERE ((c <> 'test'::text) AND (d < 5)) +\d testpub_rf_tbl3 + Table "public.testpub_rf_tbl3" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + e | integer | | | + ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl3 WHERE (e > 1000 AND e < 2000); \dRp+ testpub5 Publication testpub5 @@ -274,6 +280,14 @@ Tables: "public.testpub_rf_tbl2" WHERE ((c <> 'test'::text) AND (d < 5)) "public.testpub_rf_tbl3" WHERE ((e > 1000) AND (e < 2000)) +\d testpub_rf_tbl3 + Table "public.testpub_rf_tbl3" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + e | integer | | | +Publications: + "testpub5" WHERE ((e > 1000) AND (e < 2000)) + ALTER PUBLICATION testpub5 DROP TABLE testpub_rf_tbl2; \dRp+ testpub5 Publication testpub5 @@ -294,6 +308,14 @@ ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl3 WHERE (e > 300 AND e < 500) Tables: "public.testpub_rf_tbl3" WHERE ((e > 300) AND (e < 500)) +\d testpub_rf_tbl3 + Table "public.testpub_rf_tbl3" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + e | integer | | | +Publications: + "testpub5" WHERE ((e > 300) AND (e < 500)) + -- test \d (now it displays filter information) SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_rf_yes FOR TABLE testpub_rf_tbl1 WHERE (a > 1) WITH (publish = 'insert'); diff --git a/src/test/regress/sql/publication.sql b/src/test/regress/sql/publication.sql index 3f04d34264..5457c56b33 100644 --- a/src/test/regress/sql/publication.sql +++ b/src/test/regress/sql/publication.sql @@ -150,13 +150,16 @@ SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub5 FOR TABLE testpub_rf_tbl1, testpub_rf_tbl2 WHERE (c <> 'test' AND d < 5) WITH (publish = 'insert'); RESET client_min_messages; \dRp+ testpub5 +\d testpub_rf_tbl3 ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl3 WHERE (e > 1000 AND e < 2000); \dRp+ testpub5 +\d testpub_rf_tbl3 ALTER PUBLICATION testpub5 DROP TABLE testpub_rf_tbl2; \dRp+ testpub5 -- remove testpub_rf_tbl1 and add testpub_rf_tbl3 again (another WHERE expression) ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl3 WHERE (e > 300 AND e < 500); \dRp+ testpub5 +\d testpub_rf_tbl3 -- test \d (now it displays filter information) SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_rf_yes FOR TABLE testpub_rf_tbl1 WHERE (a > 1) WITH (publish = 'insert'); From d816f366bc427cacba29c1e4b1696afa620e73a7 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 4 Mar 2022 08:47:30 +0100 Subject: [PATCH 085/772] psql: Make SSL info display more compact Remove the bits display, since that can be derived from the cipher suite. Reviewed-by: Daniel Gustafsson Discussion: https://www.postgresql.org/message-id/flat/aee28ee7-0ab3-c2e2-5bed-109feb0c089b%40enterprisedb.com --- src/bin/psql/command.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 292cff5df9..079f4a1a76 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -3667,7 +3667,6 @@ printSSLInfo(void) { const char *protocol; const char *cipher; - const char *bits; const char *compression; if (!PQsslInUse(pset.db)) @@ -3675,13 +3674,11 @@ printSSLInfo(void) protocol = PQsslAttribute(pset.db, "protocol"); cipher = PQsslAttribute(pset.db, "cipher"); - bits = PQsslAttribute(pset.db, "key_bits"); compression = PQsslAttribute(pset.db, "compression"); - printf(_("SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n"), + printf(_("SSL connection (protocol: %s, cipher: %s, compression: %s)\n"), protocol ? protocol : _("unknown"), cipher ? cipher : _("unknown"), - bits ? bits : _("unknown"), (compression && strcmp(compression, "off") != 0) ? _("on") : _("off")); } From 791b1b71da35d9d4264f72a87e4078b85a2fcfb4 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 4 Mar 2022 14:49:37 +0100 Subject: [PATCH 086/772] Parse/analyze function renaming There are three parallel ways to call parse/analyze: with fixed parameters, with variable parameters, and by supplying your own parser callback. Some of the involved functions were confusingly named and made this API structure more confusing. This patch renames some functions to make this clearer: parse_analyze() -> parse_analyze_fixedparams() pg_analyze_and_rewrite() -> pg_analyze_and_rewrite_fixedparams() (Otherwise one might think this variant doesn't accept parameters, but in fact all three ways accept parameters.) pg_analyze_and_rewrite_params() -> pg_analyze_and_rewrite_withcb() (Before, and also when considering pg_analyze_and_rewrite(), one might think this is the only way to pass parameters. Moreover, the parser callback doesn't necessarily need to parse only parameters, it's just one of the things it could do.) parse_fixed_parameters() -> setup_parse_fixed_parameters() parse_variable_parameters() -> setup_parse_variable_parameters() (These functions don't actually do any parsing, they just set up callbacks to use during parsing later.) This patch also adds some const decorations to the fixed-parameters API, so the distinction from the variable-parameters API is more clear. Reviewed-by: Nathan Bossart Discussion: https://www.postgresql.org/message-id/flat/c67ce276-52b4-0239-dc0e-39875bf81840@enterprisedb.com --- src/backend/catalog/pg_proc.c | 2 +- src/backend/commands/copyto.c | 2 +- src/backend/commands/extension.c | 2 +- src/backend/commands/schemacmds.c | 2 +- src/backend/commands/tablecmds.c | 2 +- src/backend/commands/view.c | 2 +- src/backend/executor/functions.c | 2 +- src/backend/executor/spi.c | 8 ++++---- src/backend/optimizer/util/clauses.c | 2 +- src/backend/parser/analyze.c | 10 +++++----- src/backend/parser/parse_param.c | 8 ++++---- src/backend/parser/parse_utilcmd.c | 2 +- src/backend/tcop/postgres.c | 17 +++++++++-------- src/backend/utils/cache/plancache.c | 4 ++-- src/include/parser/analyze.h | 4 ++-- src/include/parser/parse_param.h | 6 +++--- src/include/tcop/tcopprot.h | 6 +++--- 17 files changed, 41 insertions(+), 40 deletions(-) diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c index 12521c77c3..ac8aacbd59 100644 --- a/src/backend/catalog/pg_proc.c +++ b/src/backend/catalog/pg_proc.c @@ -947,7 +947,7 @@ fmgr_sql_validator(PG_FUNCTION_ARGS) RawStmt *parsetree = lfirst_node(RawStmt, lc); List *querytree_sublist; - querytree_sublist = pg_analyze_and_rewrite_params(parsetree, + querytree_sublist = pg_analyze_and_rewrite_withcb(parsetree, prosrc, (ParserSetupHook) sql_fn_parser_setup, pinfo, diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c index 3283ef50d0..55c38b04c4 100644 --- a/src/backend/commands/copyto.c +++ b/src/backend/commands/copyto.c @@ -439,7 +439,7 @@ BeginCopyTo(ParseState *pstate, * Run parse analysis and rewrite. Note this also acquires sufficient * locks on the source table(s). */ - rewritten = pg_analyze_and_rewrite(raw_query, + rewritten = pg_analyze_and_rewrite_fixedparams(raw_query, pstate->p_sourcetext, NULL, 0, NULL); diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index 0e04304cb0..42503ef454 100644 --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c @@ -757,7 +757,7 @@ execute_sql_string(const char *sql) /* Be sure parser can see any DDL done so far */ CommandCounterIncrement(); - stmt_list = pg_analyze_and_rewrite(parsetree, + stmt_list = pg_analyze_and_rewrite_fixedparams(parsetree, sql, NULL, 0, diff --git a/src/backend/commands/schemacmds.c b/src/backend/commands/schemacmds.c index 984000a5bc..be3925b3b4 100644 --- a/src/backend/commands/schemacmds.c +++ b/src/backend/commands/schemacmds.c @@ -172,7 +172,7 @@ CreateSchemaCommand(CreateSchemaStmt *stmt, const char *queryString, /* * Execute each command contained in the CREATE SCHEMA. Since the grammar * allows only utility commands in CREATE SCHEMA, there is no need to pass - * them through parse_analyze() or the rewriter; we can just hand them + * them through parse_analyze_*() or the rewriter; we can just hand them * straight to ProcessUtility. */ foreach(parsetree_item, parsetree_list) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 3e83f375b5..dc5872f988 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -13181,7 +13181,7 @@ ATPostAlterTypeParse(Oid oldId, Oid oldRelId, Oid refRelId, char *cmd, /* * We expect that we will get only ALTER TABLE and CREATE INDEX * statements. Hence, there is no need to pass them through - * parse_analyze() or the rewriter, but instead we need to pass them + * parse_analyze_*() or the rewriter, but instead we need to pass them * through parse_utilcmd.c to make them ready for execution. */ raw_parsetree_list = raw_parser(cmd, RAW_PARSE_DEFAULT); diff --git a/src/backend/commands/view.c b/src/backend/commands/view.c index 459e9821d0..8690a3f3c6 100644 --- a/src/backend/commands/view.c +++ b/src/backend/commands/view.c @@ -439,7 +439,7 @@ DefineView(ViewStmt *stmt, const char *queryString, rawstmt->stmt_location = stmt_location; rawstmt->stmt_len = stmt_len; - viewParse = parse_analyze(rawstmt, queryString, NULL, 0, NULL); + viewParse = parse_analyze_fixedparams(rawstmt, queryString, NULL, 0, NULL); /* * The grammar should ensure that the result is a single SELECT Query. diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c index 29a68879ee..f9460ae506 100644 --- a/src/backend/executor/functions.c +++ b/src/backend/executor/functions.c @@ -718,7 +718,7 @@ init_sql_fcache(FunctionCallInfo fcinfo, Oid collation, bool lazyEvalOK) RawStmt *parsetree = lfirst_node(RawStmt, lc); List *queryTree_sublist; - queryTree_sublist = pg_analyze_and_rewrite_params(parsetree, + queryTree_sublist = pg_analyze_and_rewrite_withcb(parsetree, fcache->src, (ParserSetupHook) sql_fn_parser_setup, fcache->pinfo, diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index 5b353cb93a..a82e986667 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -2258,7 +2258,7 @@ _SPI_prepare_plan(const char *src, SPIPlanPtr plan) if (plan->parserSetup != NULL) { Assert(plan->nargs == 0); - stmt_list = pg_analyze_and_rewrite_params(parsetree, + stmt_list = pg_analyze_and_rewrite_withcb(parsetree, src, plan->parserSetup, plan->parserSetupArg, @@ -2266,7 +2266,7 @@ _SPI_prepare_plan(const char *src, SPIPlanPtr plan) } else { - stmt_list = pg_analyze_and_rewrite(parsetree, + stmt_list = pg_analyze_and_rewrite_fixedparams(parsetree, src, plan->argtypes, plan->nargs, @@ -2495,7 +2495,7 @@ _SPI_execute_plan(SPIPlanPtr plan, const SPIExecuteOptions *options, else if (plan->parserSetup != NULL) { Assert(plan->nargs == 0); - stmt_list = pg_analyze_and_rewrite_params(parsetree, + stmt_list = pg_analyze_and_rewrite_withcb(parsetree, src, plan->parserSetup, plan->parserSetupArg, @@ -2503,7 +2503,7 @@ _SPI_execute_plan(SPIPlanPtr plan, const SPIExecuteOptions *options, } else { - stmt_list = pg_analyze_and_rewrite(parsetree, + stmt_list = pg_analyze_and_rewrite_fixedparams(parsetree, src, plan->argtypes, plan->nargs, diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index a707dc9f26..413dcac036 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -5057,7 +5057,7 @@ inline_set_returning_function(PlannerInfo *root, RangeTblEntry *rte) if (list_length(raw_parsetree_list) != 1) goto fail; - querytree_list = pg_analyze_and_rewrite_params(linitial(raw_parsetree_list), + querytree_list = pg_analyze_and_rewrite_withcb(linitial(raw_parsetree_list), src, (ParserSetupHook) sql_fn_parser_setup, pinfo, NULL); diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 6ac2e9ce23..19d97fe731 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -96,7 +96,7 @@ static bool test_raw_expression_coverage(Node *node, void *context); /* - * parse_analyze + * parse_analyze_fixedparams * Analyze a raw parse tree and transform it to Query form. * * Optionally, information about $n parameter types can be supplied. @@ -107,8 +107,8 @@ static bool test_raw_expression_coverage(Node *node, void *context); * a dummy CMD_UTILITY Query node. */ Query * -parse_analyze(RawStmt *parseTree, const char *sourceText, - Oid *paramTypes, int numParams, +parse_analyze_fixedparams(RawStmt *parseTree, const char *sourceText, + const Oid *paramTypes, int numParams, QueryEnvironment *queryEnv) { ParseState *pstate = make_parsestate(NULL); @@ -120,7 +120,7 @@ parse_analyze(RawStmt *parseTree, const char *sourceText, pstate->p_sourcetext = sourceText; if (numParams > 0) - parse_fixed_parameters(pstate, paramTypes, numParams); + setup_parse_fixed_parameters(pstate, paramTypes, numParams); pstate->p_queryEnv = queryEnv; @@ -158,7 +158,7 @@ parse_analyze_varparams(RawStmt *parseTree, const char *sourceText, pstate->p_sourcetext = sourceText; - parse_variable_parameters(pstate, paramTypes, numParams); + setup_parse_variable_parameters(pstate, paramTypes, numParams); query = transformTopLevelStmt(pstate, parseTree); diff --git a/src/backend/parser/parse_param.c b/src/backend/parser/parse_param.c index 3100d890d2..31a43e034c 100644 --- a/src/backend/parser/parse_param.c +++ b/src/backend/parser/parse_param.c @@ -35,7 +35,7 @@ typedef struct FixedParamState { - Oid *paramTypes; /* array of parameter type OIDs */ + const Oid *paramTypes; /* array of parameter type OIDs */ int numParams; /* number of array entries */ } FixedParamState; @@ -64,8 +64,8 @@ static bool query_contains_extern_params_walker(Node *node, void *context); * Set up to process a query containing references to fixed parameters. */ void -parse_fixed_parameters(ParseState *pstate, - Oid *paramTypes, int numParams) +setup_parse_fixed_parameters(ParseState *pstate, + const Oid *paramTypes, int numParams) { FixedParamState *parstate = palloc(sizeof(FixedParamState)); @@ -80,7 +80,7 @@ parse_fixed_parameters(ParseState *pstate, * Set up to process a query containing references to variable parameters. */ void -parse_variable_parameters(ParseState *pstate, +setup_parse_variable_parameters(ParseState *pstate, Oid **paramTypes, int *numParams) { VarParamState *parstate = palloc(sizeof(VarParamState)); diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index 99efa26ce4..cd946c7692 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -3,7 +3,7 @@ * parse_utilcmd.c * Perform parse analysis work for various utility commands * - * Formerly we did this work during parse_analyze() in analyze.c. However + * Formerly we did this work during parse_analyze_*() in analyze.c. However * that is fairly unsafe in the presence of querytree caching, since any * database state that we depend on in making the transformations might be * obsolete by the time the utility command is executed; and utility commands diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 34c13a1113..c087db4445 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -637,8 +637,8 @@ pg_parse_query(const char *query_string) * NOTE: for reasons mentioned above, this must be separate from raw parsing. */ List * -pg_analyze_and_rewrite(RawStmt *parsetree, const char *query_string, - Oid *paramTypes, int numParams, +pg_analyze_and_rewrite_fixedparams(RawStmt *parsetree, const char *query_string, + const Oid *paramTypes, int numParams, QueryEnvironment *queryEnv) { Query *query; @@ -652,7 +652,7 @@ pg_analyze_and_rewrite(RawStmt *parsetree, const char *query_string, if (log_parser_stats) ResetUsage(); - query = parse_analyze(parsetree, query_string, paramTypes, numParams, + query = parse_analyze_fixedparams(parsetree, query_string, paramTypes, numParams, queryEnv); if (log_parser_stats) @@ -669,12 +669,13 @@ pg_analyze_and_rewrite(RawStmt *parsetree, const char *query_string, } /* - * Do parse analysis and rewriting. This is the same as pg_analyze_and_rewrite - * except that external-parameter resolution is determined by parser callback - * hooks instead of a fixed list of parameter datatypes. + * Do parse analysis and rewriting. This is the same as + * pg_analyze_and_rewrite_fixedparams except that, instead of a fixed list of + * parameter datatypes, a parser callback is supplied that can do + * external-parameter resolution and possibly other things. */ List * -pg_analyze_and_rewrite_params(RawStmt *parsetree, +pg_analyze_and_rewrite_withcb(RawStmt *parsetree, const char *query_string, ParserSetupHook parserSetup, void *parserSetupArg, @@ -1125,7 +1126,7 @@ exec_simple_query(const char *query_string) else oldcontext = MemoryContextSwitchTo(MessageContext); - querytree_list = pg_analyze_and_rewrite(parsetree, query_string, + querytree_list = pg_analyze_and_rewrite_fixedparams(parsetree, query_string, NULL, 0, NULL); plantree_list = pg_plan_queries(querytree_list, query_string, diff --git a/src/backend/utils/cache/plancache.c b/src/backend/utils/cache/plancache.c index 4a9055e6bb..4cf6db504f 100644 --- a/src/backend/utils/cache/plancache.c +++ b/src/backend/utils/cache/plancache.c @@ -682,13 +682,13 @@ RevalidateCachedQuery(CachedPlanSource *plansource, if (rawtree == NULL) tlist = NIL; else if (plansource->parserSetup != NULL) - tlist = pg_analyze_and_rewrite_params(rawtree, + tlist = pg_analyze_and_rewrite_withcb(rawtree, plansource->query_string, plansource->parserSetup, plansource->parserSetupArg, queryEnv); else - tlist = pg_analyze_and_rewrite(rawtree, + tlist = pg_analyze_and_rewrite_fixedparams(rawtree, plansource->query_string, plansource->param_types, plansource->num_params, diff --git a/src/include/parser/analyze.h b/src/include/parser/analyze.h index 0022184de0..ed989bb141 100644 --- a/src/include/parser/analyze.h +++ b/src/include/parser/analyze.h @@ -24,8 +24,8 @@ typedef void (*post_parse_analyze_hook_type) (ParseState *pstate, extern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook; -extern Query *parse_analyze(RawStmt *parseTree, const char *sourceText, - Oid *paramTypes, int numParams, QueryEnvironment *queryEnv); +extern Query *parse_analyze_fixedparams(RawStmt *parseTree, const char *sourceText, + const Oid *paramTypes, int numParams, QueryEnvironment *queryEnv); extern Query *parse_analyze_varparams(RawStmt *parseTree, const char *sourceText, Oid **paramTypes, int *numParams); diff --git a/src/include/parser/parse_param.h b/src/include/parser/parse_param.h index 18e608093c..d6f0b65649 100644 --- a/src/include/parser/parse_param.h +++ b/src/include/parser/parse_param.h @@ -15,9 +15,9 @@ #include "parser/parse_node.h" -extern void parse_fixed_parameters(ParseState *pstate, - Oid *paramTypes, int numParams); -extern void parse_variable_parameters(ParseState *pstate, +extern void setup_parse_fixed_parameters(ParseState *pstate, + const Oid *paramTypes, int numParams); +extern void setup_parse_variable_parameters(ParseState *pstate, Oid **paramTypes, int *numParams); extern void check_variable_parameters(ParseState *pstate, Query *query); extern bool query_contains_extern_params(Query *query); diff --git a/src/include/tcop/tcopprot.h b/src/include/tcop/tcopprot.h index 15a11bc3ff..00c20966ab 100644 --- a/src/include/tcop/tcopprot.h +++ b/src/include/tcop/tcopprot.h @@ -45,11 +45,11 @@ extern PGDLLIMPORT int log_statement; extern List *pg_parse_query(const char *query_string); extern List *pg_rewrite_query(Query *query); -extern List *pg_analyze_and_rewrite(RawStmt *parsetree, +extern List *pg_analyze_and_rewrite_fixedparams(RawStmt *parsetree, const char *query_string, - Oid *paramTypes, int numParams, + const Oid *paramTypes, int numParams, QueryEnvironment *queryEnv); -extern List *pg_analyze_and_rewrite_params(RawStmt *parsetree, +extern List *pg_analyze_and_rewrite_withcb(RawStmt *parsetree, const char *query_string, ParserSetupHook parserSetup, void *parserSetupArg, From 9240589798e02705dbe3e86549d064988c0f47d2 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 4 Mar 2022 13:23:58 -0500 Subject: [PATCH 087/772] Fix pg_regress to print the correct postmaster address on Windows. pg_regress reported "Unix socket" as the default location whenever HAVE_UNIX_SOCKETS is defined. However, that's not been accurate on Windows since 8f3ec75de. Update this logic to match what libpq actually does now. This is just cosmetic, but still it's potentially misleading. Back-patch to v13 where 8f3ec75de came in. Discussion: https://postgr.es/m/3894060.1646415641@sss.pgh.pa.us --- src/interfaces/libpq/fe-connect.c | 5 +++++ src/test/regress/pg_regress.c | 10 ++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 1c5a2b43e9..cf554d389f 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -1115,6 +1115,11 @@ connectOptions2(PGconn *conn) { if (ch->host) free(ch->host); + + /* + * This bit selects the default host location. If you change + * this, see also pg_regress. + */ #ifdef HAVE_UNIX_SOCKETS if (DEFAULT_PGSOCKET_DIR[0]) { diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c index db8427dd9b..982801e029 100644 --- a/src/test/regress/pg_regress.c +++ b/src/test/regress/pg_regress.c @@ -746,10 +746,16 @@ initialize_environment(void) */ pghost = getenv("PGHOST"); pgport = getenv("PGPORT"); -#ifndef HAVE_UNIX_SOCKETS if (!pghost) - pghost = "localhost"; + { + /* Keep this bit in sync with libpq's default host location: */ +#ifdef HAVE_UNIX_SOCKETS + if (DEFAULT_PGSOCKET_DIR[0]) + /* do nothing, we'll print "Unix socket" below */ ; + else #endif + pghost = "localhost"; /* DefaultHost in fe-connect.c */ + } if (pghost && pgport) printf(_("(using postmaster on %s, port %s)\n"), pghost, pgport); From f2698ea02ca8a56f38935d2b300ac54936712558 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Fri, 4 Mar 2022 18:53:13 -0800 Subject: [PATCH 088/772] Introduce PG_TEST_TIMEOUT_DEFAULT for TAP suite non-elapsing timeouts. Slow hosts may avoid load-induced, spurious failures by setting environment variable PG_TEST_TIMEOUT_DEFAULT to some number of seconds greater than 180. Developers may see faster failures by setting that environment variable to some lesser number of seconds. In tests, write $PostgreSQL::Test::Utils::timeout_default wherever the convention has been to write 180. This change raises the default for some briefer timeouts. Back-patch to v10 (all supported versions). Discussion: https://postgr.es/m/20220218052842.GA3627003@rfd.leadboat.com --- contrib/amcheck/t/002_cic.pl | 3 +- contrib/amcheck/t/003_cic_2pc.pl | 14 +++++---- src/bin/pg_ctl/t/004_logrotate.pl | 4 +-- src/bin/pg_dump/t/002_pg_dump.pl | 3 +- src/bin/psql/t/010_tab_completion.pl | 6 ++-- src/bin/psql/t/020_cancel.pl | 5 ++-- src/bin/scripts/t/080_pg_isready.pl | 4 +-- src/test/perl/PostgreSQL/Test/Cluster.pm | 29 ++++++++++--------- src/test/perl/PostgreSQL/Test/Utils.pm | 8 +++-- src/test/perl/README | 6 ++++ src/test/recovery/t/003_recovery_targets.pl | 4 +-- src/test/recovery/t/006_logical_decoding.pl | 6 ++-- .../t/010_logical_decoding_timelines.pl | 4 +-- src/test/recovery/t/013_crash_restart.pl | 6 +--- src/test/recovery/t/017_shm.pl | 13 +++++---- src/test/recovery/t/019_replslot_limit.pl | 6 ++-- src/test/recovery/t/021_row_visibility.pl | 7 ++--- src/test/recovery/t/022_crash_temp_files.pl | 6 +--- src/test/recovery/t/024_archive_recovery.pl | 4 +-- src/test/subscription/t/015_stream.pl | 2 +- 20 files changed, 75 insertions(+), 65 deletions(-) diff --git a/contrib/amcheck/t/002_cic.pl b/contrib/amcheck/t/002_cic.pl index d604def0d0..b8e4ac7cf4 100644 --- a/contrib/amcheck/t/002_cic.pl +++ b/contrib/amcheck/t/002_cic.pl @@ -18,7 +18,8 @@ # $node = PostgreSQL::Test::Cluster->new('CIC_test'); $node->init; -$node->append_conf('postgresql.conf', 'lock_timeout = 180000'); +$node->append_conf('postgresql.conf', + 'lock_timeout = ' . (1000 * $PostgreSQL::Test::Utils::timeout_default)); $node->start; $node->safe_psql('postgres', q(CREATE EXTENSION amcheck)); $node->safe_psql('postgres', q(CREATE TABLE tbl(i int))); diff --git a/contrib/amcheck/t/003_cic_2pc.pl b/contrib/amcheck/t/003_cic_2pc.pl index f668ed3c40..e66ccd93f1 100644 --- a/contrib/amcheck/t/003_cic_2pc.pl +++ b/contrib/amcheck/t/003_cic_2pc.pl @@ -22,7 +22,8 @@ $node = PostgreSQL::Test::Cluster->new('CIC_2PC_test'); $node->init; $node->append_conf('postgresql.conf', 'max_prepared_transactions = 10'); -$node->append_conf('postgresql.conf', 'lock_timeout = 180000'); +$node->append_conf('postgresql.conf', + 'lock_timeout = ' . (1000 * $PostgreSQL::Test::Utils::timeout_default)); $node->start; $node->safe_psql('postgres', q(CREATE EXTENSION amcheck)); $node->safe_psql('postgres', q(CREATE TABLE tbl(i int))); @@ -38,7 +39,7 @@ my $main_in = ''; my $main_out = ''; -my $main_timer = IPC::Run::timeout(180); +my $main_timer = IPC::Run::timeout($PostgreSQL::Test::Utils::timeout_default); my $main_h = $node->background_psql('postgres', \$main_in, \$main_out, @@ -52,7 +53,7 @@ my $cic_in = ''; my $cic_out = ''; -my $cic_timer = IPC::Run::timeout(180); +my $cic_timer = IPC::Run::timeout($PostgreSQL::Test::Utils::timeout_default); my $cic_h = $node->background_psql('postgres', \$cic_in, \$cic_out, $cic_timer, on_error_stop => 1); @@ -113,9 +114,10 @@ )); $node->restart; -my $reindex_in = ''; -my $reindex_out = ''; -my $reindex_timer = IPC::Run::timeout(180); +my $reindex_in = ''; +my $reindex_out = ''; +my $reindex_timer = + IPC::Run::timeout($PostgreSQL::Test::Utils::timeout_default); my $reindex_h = $node->background_psql('postgres', \$reindex_in, \$reindex_out, $reindex_timer, on_error_stop => 1); diff --git a/src/bin/pg_ctl/t/004_logrotate.pl b/src/bin/pg_ctl/t/004_logrotate.pl index d290452100..d73ce034cd 100644 --- a/src/bin/pg_ctl/t/004_logrotate.pl +++ b/src/bin/pg_ctl/t/004_logrotate.pl @@ -39,7 +39,7 @@ sub check_log_pattern my $node = shift; my $lfname = fetch_file_name($logfiles, $format); - my $max_attempts = 180 * 10; + my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default; my $logcontents; for (my $attempts = 0; $attempts < $max_attempts; $attempts++) @@ -78,7 +78,7 @@ sub check_log_pattern $node->psql('postgres', 'SELECT 1/0'); # might need to retry if logging collector process is slow... -my $max_attempts = 180 * 10; +my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default; my $current_logfiles; for (my $attempts = 0; $attempts < $max_attempts; $attempts++) diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index d9bc267f6d..3e55ff26f8 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -295,7 +295,8 @@ '--no-sync', "--file=$tempdir/only_dump_test_table.sql", '--table=dump_test.test_table', - '--lock-wait-timeout=1000000', + '--lock-wait-timeout=' + . (1000 * $PostgreSQL::Test::Utils::timeout_default), 'postgres', ], }, diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl index 005961f34d..a54910680e 100644 --- a/src/bin/psql/t/010_tab_completion.pl +++ b/src/bin/psql/t/010_tab_completion.pl @@ -94,7 +94,7 @@ my $in = ''; my $out = ''; -my $timer = timer(5); +my $timer = timer($PostgreSQL::Test::Utils::timeout_default); my $h = $node->interactive_psql('postgres', \$in, \$out, $timer); @@ -111,7 +111,7 @@ sub check_completion # reset output collector $out = ""; # restart per-command timer - $timer->start(5); + $timer->start($PostgreSQL::Test::Utils::timeout_default); # send the data to be sent $in .= $send; # wait ... @@ -442,7 +442,7 @@ sub clear_line clear_query(); # send psql an explicit \q to shut it down, else pty won't close properly -$timer->start(5); +$timer->start($PostgreSQL::Test::Utils::timeout_default); $in .= "\\q\n"; finish $h or die "psql returned $?"; $timer->reset; diff --git a/src/bin/psql/t/020_cancel.pl b/src/bin/psql/t/020_cancel.pl index 3224f8e26a..d57d342952 100644 --- a/src/bin/psql/t/020_cancel.pl +++ b/src/bin/psql/t/020_cancel.pl @@ -46,12 +46,13 @@ my $psql_pid; until (-s "$tempdir/psql.pid" and ($psql_pid = PostgreSQL::Test::Utils::slurp_file("$tempdir/psql.pid")) =~ /^\d+\n/s) { - ($count++ < 180 * 100) or die "pid file did not appear"; + ($count++ < 100 * $PostgreSQL::Test::Utils::timeout_default) + or die "pid file did not appear"; usleep(10_000) } # Send sleep command and wait until the server has registered it - $stdin = "select pg_sleep(180);\n"; + $stdin = "select pg_sleep($PostgreSQL::Test::Utils::timeout_default);\n"; pump $h while length $stdin; $node->poll_query_until('postgres', q{SELECT (SELECT count(*) FROM pg_stat_activity WHERE query ~ '^select pg_sleep') > 0;}) or die "timed out"; diff --git a/src/bin/scripts/t/080_pg_isready.pl b/src/bin/scripts/t/080_pg_isready.pl index e8436dc7e8..c45ca6666f 100644 --- a/src/bin/scripts/t/080_pg_isready.pl +++ b/src/bin/scripts/t/080_pg_isready.pl @@ -18,8 +18,8 @@ $node->init; $node->start; -# use a long timeout for the benefit of very slow buildfarm machines -$node->command_ok([qw(pg_isready --timeout=60)], +$node->command_ok( + [ 'pg_isready', "--timeout=$PostgreSQL::Test::Utils::timeout_default" ], 'succeeds with server running'); done_testing(); diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index be05845248..4db52bc936 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -36,7 +36,8 @@ PostgreSQL::Test::Cluster - class representing PostgreSQL server instance my ($stdout, $stderr, $timed_out); my $cmdret = $node->psql('postgres', 'SELECT pg_sleep(600)', stdout => \$stdout, stderr => \$stderr, - timeout => 180, timed_out => \$timed_out, + timeout => $PostgreSQL::Test::Utils::timeout_default, + timed_out => \$timed_out, extra_params => ['--single-transaction'], on_error_die => 1) print "Sleep timed out" if $timed_out; @@ -1723,7 +1724,8 @@ e.g. my ($stdout, $stderr, $timed_out); my $cmdret = $node->psql('postgres', 'SELECT pg_sleep(600)', stdout => \$stdout, stderr => \$stderr, - timeout => 180, timed_out => \$timed_out, + timeout => $PostgreSQL::Test::Utils::timeout_default, + timed_out => \$timed_out, extra_params => ['--single-transaction']) will set $cmdret to undef and $timed_out to a true value. @@ -1897,7 +1899,8 @@ scalar reference. This allows the caller to act on other parts of the system while idling this backend. The specified timer object is attached to the harness, as well. It's caller's -responsibility to select the timeout length, and to restart the timer after +responsibility to set the timeout length (usually +$PostgreSQL::Test::Utils::timeout_default), and to restart the timer after each command if the timeout is per-command. psql is invoked in tuples-only unaligned mode with reading of B<.psqlrc> @@ -1985,9 +1988,10 @@ The process's stdin is sourced from the $stdin scalar reference, and its stdout and stderr go to the $stdout scalar reference. ptys are used so that psql thinks it's being called interactively. -The specified timer object is attached to the harness, as well. -It's caller's responsibility to select the timeout length, and to -restart the timer after each command if the timeout is per-command. +The specified timer object is attached to the harness, as well. It's caller's +responsibility to set the timeout length (usually +$PostgreSQL::Test::Utils::timeout_default), and to restart the timer after +each command if the timeout is per-command. psql is invoked in tuples-only unaligned mode with reading of B<.psqlrc> disabled. That may be overridden by passing extra psql parameters. @@ -2303,7 +2307,7 @@ sub connect_fails Run B<$query> repeatedly, until it returns the B<$expected> result ('t', or SQL boolean true, by default). Continues polling if B returns an error result. -Times out after 180 seconds. +Times out after $PostgreSQL::Test::Utils::timeout_default seconds. Returns 1 if successful, 0 if timed out. =cut @@ -2321,7 +2325,7 @@ sub poll_query_until '-d', $self->connstr($dbname) ]; my ($stdout, $stderr); - my $max_attempts = 180 * 10; + my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default; my $attempts = 0; while ($attempts < $max_attempts) @@ -2343,8 +2347,8 @@ sub poll_query_until $attempts++; } - # The query result didn't change in 180 seconds. Give up. Print the - # output from the last attempt, hopefully that's useful for debugging. + # Give up. Print the output from the last attempt, hopefully that's useful + # for debugging. diag qq(poll_query_until timed out executing this query: $query expecting this output: @@ -2657,7 +2661,7 @@ sub wait_for_slot_catchup Waits for the contents of the server log file, starting at the given offset, to match the supplied regular expression. Checks the entire log if no offset is -given. Times out after 180 seconds. +given. Times out after $PostgreSQL::Test::Utils::timeout_default seconds. If successful, returns the length of the entire log file, in bytes. @@ -2668,7 +2672,7 @@ sub wait_for_log my ($self, $regexp, $offset) = @_; $offset = 0 unless defined $offset; - my $max_attempts = 180 * 10; + my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default; my $attempts = 0; while ($attempts < $max_attempts) @@ -2683,7 +2687,6 @@ sub wait_for_log $attempts++; } - # The logs didn't match within 180 seconds. Give up. croak "timed out waiting for match: $regexp"; } diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm index 46cd746796..15b314d1f8 100644 --- a/src/test/perl/PostgreSQL/Test/Utils.pm +++ b/src/test/perl/PostgreSQL/Test/Utils.pm @@ -91,8 +91,8 @@ our @EXPORT = qw( $use_unix_sockets ); -our ($windows_os, $is_msys2, $use_unix_sockets, $tmp_check, $log_path, - $test_logfile); +our ($windows_os, $is_msys2, $use_unix_sockets, $timeout_default, + $tmp_check, $log_path, $test_logfile); BEGIN { @@ -157,6 +157,10 @@ BEGIN # supported, but it can be overridden if desired. $use_unix_sockets = (!$windows_os || defined $ENV{PG_TEST_USE_UNIX_SOCKETS}); + + $timeout_default = $ENV{PG_TEST_TIMEOUT_DEFAULT}; + $timeout_default = 180 + if not defined $timeout_default or $timeout_default eq ''; } =pod diff --git a/src/test/perl/README b/src/test/perl/README index 0511c55e9a..4b160cce36 100644 --- a/src/test/perl/README +++ b/src/test/perl/README @@ -23,6 +23,12 @@ tmp_check/log/ to get more info. Files named 'regress_log_XXX' are log output from the perl test scripts themselves, and should be examined first. Other files are postmaster logs, and may be helpful as additional data. +The tests default to a timeout of 180 seconds for many individual operations. +Slow hosts may avoid load-induced, spurious failures by setting environment +variable PG_TEST_TIMEOUT_DEFAULT to some number of seconds greater than 180. +Developers may see faster failures by setting that environment variable to +some lesser number of seconds. + Data directories will also be left behind for analysis when a test fails; they are named according to the test filename. But if the environment variable PG_TEST_NOCLEAN is set, data directories will be retained diff --git a/src/test/recovery/t/003_recovery_targets.pl b/src/test/recovery/t/003_recovery_targets.pl index 25dd5ee7ec..e8e1a420bc 100644 --- a/src/test/recovery/t/003_recovery_targets.pl +++ b/src/test/recovery/t/003_recovery_targets.pl @@ -172,8 +172,8 @@ sub test_recovery_standby $node_standby->logfile, 'start' ]); -# wait up to 180s for postgres to terminate -foreach my $i (0 .. 1800) +# wait for postgres to terminate +foreach my $i (0 .. 10 * $PostgreSQL::Test::Utils::timeout_default) { last if !-f $node_standby->data_dir . '/postmaster.pid'; usleep(100_000); diff --git a/src/test/recovery/t/006_logical_decoding.pl b/src/test/recovery/t/006_logical_decoding.pl index fa6bd45332..9cec2792fc 100644 --- a/src/test/recovery/t/006_logical_decoding.pl +++ b/src/test/recovery/t/006_logical_decoding.pl @@ -107,7 +107,8 @@ ); my $stdout_recv = $node_primary->pg_recvlogical_upto( - 'postgres', 'test_slot', $endpos, 180, + 'postgres', 'test_slot', $endpos, + $PostgreSQL::Test::Utils::timeout_default, 'include-xids' => '0', 'skip-empty-xacts' => '1'); chomp($stdout_recv); @@ -119,7 +120,8 @@ ) or die "slot never became inactive"; $stdout_recv = $node_primary->pg_recvlogical_upto( - 'postgres', 'test_slot', $endpos, 180, + 'postgres', 'test_slot', $endpos, + $PostgreSQL::Test::Utils::timeout_default, 'include-xids' => '0', 'skip-empty-xacts' => '1'); chomp($stdout_recv); diff --git a/src/test/recovery/t/010_logical_decoding_timelines.pl b/src/test/recovery/t/010_logical_decoding_timelines.pl index 6e8b0b1b96..01ff31e61f 100644 --- a/src/test/recovery/t/010_logical_decoding_timelines.pl +++ b/src/test/recovery/t/010_logical_decoding_timelines.pl @@ -157,7 +157,7 @@ ($ret, $stdout, $stderr) = $node_replica->psql( 'postgres', "SELECT data FROM pg_logical_slot_peek_changes('before_basebackup', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');", - timeout => 180); + timeout => $PostgreSQL::Test::Utils::timeout_default); is($ret, 0, 'replay from slot before_basebackup succeeds'); my $final_expected_output_bb = q(BEGIN @@ -186,7 +186,7 @@ BEGIN $stdout = $node_replica->pg_recvlogical_upto( 'postgres', 'before_basebackup', - $endpos, 180, + $endpos, $PostgreSQL::Test::Utils::timeout_default, 'include-xids' => '0', 'skip-empty-xacts' => '1'); diff --git a/src/test/recovery/t/013_crash_restart.pl b/src/test/recovery/t/013_crash_restart.pl index 3976e339c0..44c4c62cb7 100644 --- a/src/test/recovery/t/013_crash_restart.pl +++ b/src/test/recovery/t/013_crash_restart.pl @@ -18,11 +18,7 @@ use Test::More; use Config; -# To avoid hanging while expecting some specific input from a psql -# instance being driven by us, add a timeout high enough that it -# should never trigger even on very slow machines, unless something -# is really wrong. -my $psql_timeout = IPC::Run::timer(60); +my $psql_timeout = IPC::Run::timer($PostgreSQL::Test::Utils::timeout_default); my $node = PostgreSQL::Test::Cluster->new('primary'); $node->init(allows_streaming => 1); diff --git a/src/test/recovery/t/017_shm.pl b/src/test/recovery/t/017_shm.pl index 88f9e2b9cd..713e6f068d 100644 --- a/src/test/recovery/t/017_shm.pl +++ b/src/test/recovery/t/017_shm.pl @@ -132,7 +132,7 @@ sub log_ipcs \$stdout, '2>', \$stderr, - IPC::Run::timeout(900)); # five times the poll_query_until timeout + IPC::Run::timeout(5 * $PostgreSQL::Test::Utils::timeout_default)); ok( $gnat->poll_query_until( 'postgres', "SELECT 1 FROM pg_stat_activity WHERE query = '$slow_query'", '1'), @@ -143,10 +143,11 @@ sub log_ipcs unlink($gnat->data_dir . '/postmaster.pid'); $gnat->rotate_logfile; # on Windows, can't open old log for writing log_ipcs(); -# Reject ordinary startup. Retry for the same reasons poll_start() does. +# Reject ordinary startup. Retry for the same reasons poll_start() does, +# every 0.1s for at least $PostgreSQL::Test::Utils::timeout_default seconds. my $pre_existing_msg = qr/pre-existing shared memory block/; { - my $max_attempts = 180 * 10; # Retry every 0.1s for at least 180s. + my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default; my $attempts = 0; while ($attempts < $max_attempts) { @@ -193,7 +194,7 @@ sub poll_start { my ($node) = @_; - my $max_attempts = 180 * 10; + my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default; my $attempts = 0; while ($attempts < $max_attempts) @@ -209,8 +210,8 @@ sub poll_start $attempts++; } - # No success within 180 seconds. Try one last time without fail_ok, which - # will BAIL_OUT unless it succeeds. + # Try one last time without fail_ok, which will BAIL_OUT unless it + # succeeds. $node->start && return 1; return 0; } diff --git a/src/test/recovery/t/019_replslot_limit.pl b/src/test/recovery/t/019_replslot_limit.pl index 9bb71b62c0..f62b7b32f6 100644 --- a/src/test/recovery/t/019_replslot_limit.pl +++ b/src/test/recovery/t/019_replslot_limit.pl @@ -291,7 +291,7 @@ SELECT pg_switch_wal(); CHECKPOINT; SELECT 'finished';", - timeout => '60')); + timeout => $PostgreSQL::Test::Utils::timeout_default)); is($result[1], 'finished', 'check if checkpoint command is not blocked'); $node_primary2->stop; @@ -362,7 +362,7 @@ kill 'STOP', $senderpid, $receiverpid; advance_wal($node_primary3, 2); -my $max_attempts = 180; +my $max_attempts = $PostgreSQL::Test::Utils::timeout_default; while ($max_attempts-- >= 0) { if (find_in_log( @@ -385,7 +385,7 @@ "lost") or die "timed out waiting for slot to be lost"; -$max_attempts = 180; +$max_attempts = $PostgreSQL::Test::Utils::timeout_default; while ($max_attempts-- >= 0) { if (find_in_log( diff --git a/src/test/recovery/t/021_row_visibility.pl b/src/test/recovery/t/021_row_visibility.pl index 75cd487451..55d8c31b56 100644 --- a/src/test/recovery/t/021_row_visibility.pl +++ b/src/test/recovery/t/021_row_visibility.pl @@ -32,11 +32,8 @@ $node_standby->append_conf('postgresql.conf', 'max_prepared_transactions=10'); $node_standby->start; -# To avoid hanging while expecting some specific input from a psql -# instance being driven by us, add a timeout high enough that it -# should never trigger even on very slow machines, unless something -# is really wrong. -my $psql_timeout = IPC::Run::timer(300); +my $psql_timeout = + IPC::Run::timer(2 * $PostgreSQL::Test::Utils::timeout_default); # One psql to primary and standby each, for all queries. That allows # to check uncommitted changes being replicated and such. diff --git a/src/test/recovery/t/022_crash_temp_files.pl b/src/test/recovery/t/022_crash_temp_files.pl index 49dd86e848..36906b4aca 100644 --- a/src/test/recovery/t/022_crash_temp_files.pl +++ b/src/test/recovery/t/022_crash_temp_files.pl @@ -15,11 +15,7 @@ exit; } -# To avoid hanging while expecting some specific input from a psql -# instance being driven by us, add a timeout high enough that it -# should never trigger even on very slow machines, unless something -# is really wrong. -my $psql_timeout = IPC::Run::timer(60); +my $psql_timeout = IPC::Run::timer($PostgreSQL::Test::Utils::timeout_default); my $node = PostgreSQL::Test::Cluster->new('node_crash'); $node->init(); diff --git a/src/test/recovery/t/024_archive_recovery.pl b/src/test/recovery/t/024_archive_recovery.pl index c10bb5bf70..ce347e0cd1 100644 --- a/src/test/recovery/t/024_archive_recovery.pl +++ b/src/test/recovery/t/024_archive_recovery.pl @@ -81,8 +81,8 @@ sub test_recovery_wal_level_minimal $recovery_node->logfile, 'start' ]); - # Wait up to 180s for postgres to terminate - foreach my $i (0 .. 1800) + # wait for postgres to terminate + foreach my $i (0 .. 10 * $PostgreSQL::Test::Utils::timeout_default) { last if !-f $recovery_node->data_dir . '/postmaster.pid'; usleep(100_000); diff --git a/src/test/subscription/t/015_stream.pl b/src/test/subscription/t/015_stream.pl index 9f221fc78c..6561b189de 100644 --- a/src/test/subscription/t/015_stream.pl +++ b/src/test/subscription/t/015_stream.pl @@ -58,7 +58,7 @@ my $in = ''; my $out = ''; -my $timer = IPC::Run::timeout(180); +my $timer = IPC::Run::timeout($PostgreSQL::Test::Utils::timeout_default); my $h = $node_publisher->background_psql('postgres', \$in, \$out, $timer, on_error_stop => 0); From 766075105c21442418359221e0a0da43040b273c Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Fri, 4 Mar 2022 18:53:13 -0800 Subject: [PATCH 089/772] Use PG_TEST_TIMEOUT_DEFAULT for pg_regress suite non-elapsing timeouts. Currently, only contrib/test_decoding has this property. Use \getenv to load the timeout value. Discussion: https://postgr.es/m/20220218052842.GA3627003@rfd.leadboat.com --- contrib/test_decoding/expected/twophase.out | 5 ++++- contrib/test_decoding/sql/twophase.sql | 5 ++++- src/test/regress/expected/stats.out | 5 ++++- src/test/regress/sql/stats.sql | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/contrib/test_decoding/expected/twophase.out b/contrib/test_decoding/expected/twophase.out index e5e0f96896..e89dc74a5e 100644 --- a/contrib/test_decoding/expected/twophase.out +++ b/contrib/test_decoding/expected/twophase.out @@ -137,7 +137,10 @@ WHERE locktype = 'relation' (3 rows) -- The above CLUSTER command shouldn't cause a timeout on 2pc decoding. -SET statement_timeout = '180s'; +\set env_timeout '' +\getenv env_timeout PG_TEST_TIMEOUT_DEFAULT +SELECT COALESCE(NULLIF(:'env_timeout', ''), '180') || 's' AS timeout \gset +SET statement_timeout = :'timeout'; SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data --------------------------------------------------------------------------- diff --git a/contrib/test_decoding/sql/twophase.sql b/contrib/test_decoding/sql/twophase.sql index 05f18e8494..aff5114eb1 100644 --- a/contrib/test_decoding/sql/twophase.sql +++ b/contrib/test_decoding/sql/twophase.sql @@ -69,7 +69,10 @@ FROM pg_locks WHERE locktype = 'relation' AND relation = 'test_prepared1'::regclass; -- The above CLUSTER command shouldn't cause a timeout on 2pc decoding. -SET statement_timeout = '180s'; +\set env_timeout '' +\getenv env_timeout PG_TEST_TIMEOUT_DEFAULT +SELECT COALESCE(NULLIF(:'env_timeout', ''), '180') || 's' AS timeout \gset +SET statement_timeout = :'timeout'; SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); RESET statement_timeout; COMMIT PREPARED 'test_prepared_lock'; diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index 3e9ab0915f..b7416c8f8f 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -34,7 +34,10 @@ declare updated3 bool; updated4 bool; begin - -- we don't want to wait forever; loop will exit after 30 seconds + -- We don't want to wait forever. No timeout suffices if the OS drops our + -- stats traffic because an earlier test file left a full UDP buffer. + -- Hence, don't use PG_TEST_TIMEOUT_DEFAULT, which may be large for + -- can't-happen timeouts. Exit after 30 seconds. for i in 1 .. 300 loop -- With parallel query, the seqscan and indexscan on tenk2 might be done diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index 82e6f24c39..dbc2dd28b6 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -33,7 +33,10 @@ declare updated3 bool; updated4 bool; begin - -- we don't want to wait forever; loop will exit after 30 seconds + -- We don't want to wait forever. No timeout suffices if the OS drops our + -- stats traffic because an earlier test file left a full UDP buffer. + -- Hence, don't use PG_TEST_TIMEOUT_DEFAULT, which may be large for + -- can't-happen timeouts. Exit after 30 seconds. for i in 1 .. 300 loop -- With parallel query, the seqscan and indexscan on tenk2 might be done From 770011e3f39f21f2095d3a044b72460c4efac345 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Fri, 4 Mar 2022 21:58:57 -0800 Subject: [PATCH 090/772] ci: windows: Work around cirrus-ci bug causing test failures. Will be reverted once fixed on cirrus's side. See also https://github.com/cirruslabs/cirrus-ci-agent/issues/218 Discussion: https://postgr.es/m/CA+hUKGKx7k14n2nAALSvv6M_AB6oHasNBA65X6Dvo8hwfi9y0A@mail.gmail.com --- .cirrus.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.cirrus.yml b/.cirrus.yml index d10b0a82f9..40854046d6 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -370,6 +370,11 @@ task: # "suites". T_C: "\"C:/Program Files/Git/usr/bin/timeout.exe\" -v -k60s 15m" + # Temporarily work around cirrus-ci bug causing processes started from a + # script to be killed, even if intentionally running in background. See + # https://github.com/cirruslabs/cirrus-ci-agent/issues/218 + # https://postgr.es/m/CA%2BhUKGKx7k14n2nAALSvv6M_AB6oHasNBA65X6Dvo8hwfi9y0A%40mail.gmail.com + CIRRUS_AGENT_VERSION: 1.73.2 only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*windows.*' From 9e98583898c347e007958c8a09911be2ea4acfb9 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 7 Mar 2022 10:26:29 +0900 Subject: [PATCH 091/772] Create routine able to set single-call SRFs for Materialize mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Set-returning functions that use the Materialize mode, creating a tuplestore to include all the tuples returned in a set rather than doing so in multiple calls, use roughly the same set of steps to prepare ReturnSetInfo for this job: - Check if ReturnSetInfo supports returning a tuplestore and if the materialize mode is enabled. - Create a tuplestore for all the tuples part of the returned set in the per-query memory context, stored in ReturnSetInfo->setResult. - Build a tuple descriptor mostly from get_call_result_type(), then stored in ReturnSetInfo->setDesc. Note that there are some cases where the SRF's tuple descriptor has to be the one specified by the function caller. This refactoring is done so as there are (well, should be) no behavior changes in any of the in-core functions refactored, and the centralized function that checks and sets up the function's ReturnSetInfo can be controlled with a set of bits32 options. Two of them prove to be necessary now: - SRF_SINGLE_USE_EXPECTED to use expectedDesc as tuple descriptor, as expected by the function's caller. - SRF_SINGLE_BLESS to validate the tuple descriptor for the SRF. The same initialization pattern is simplified in 28 places per my count as of src/backend/, shaving up to ~900 lines of code. These mostly come from the removal of the per-query initializations and the sanity checks now grouped in a single location. There are more locations that could be simplified in contrib/, that are left for a follow-up cleanup. fcc2817, 07daca5 and d61a361 have prepared the areas of the code related to this change, to ease this refactoring. Author: Melanie Plageman, Michael Paquier Reviewed-by: Álvaro Herrera, Justin Pryzby Discussion: https://postgr.es/m/CAAKRu_azyd1Z3W_r7Ou4sorTjRCs+PxeHw1CWJeXKofkE6TuZg@mail.gmail.com --- src/backend/commands/event_trigger.c | 62 +------- src/backend/commands/extension.c | 93 ++---------- src/backend/commands/prepare.c | 34 +---- src/backend/foreign/foreign.c | 34 +---- src/backend/libpq/hba.c | 46 ++---- src/backend/replication/logical/launcher.c | 31 +--- .../replication/logical/logicalfuncs.c | 21 +-- src/backend/replication/logical/origin.c | 32 +--- src/backend/replication/slotfuncs.c | 31 +--- src/backend/replication/walsender.c | 31 +--- src/backend/storage/ipc/shmem.c | 35 +---- src/backend/utils/adt/datetime.c | 30 +--- src/backend/utils/adt/genfile.c | 61 +------- src/backend/utils/adt/jsonfuncs.c | 141 ++---------------- src/backend/utils/adt/mcxtfuncs.c | 33 +--- src/backend/utils/adt/misc.c | 33 +--- src/backend/utils/adt/pgstatfuncs.c | 91 +---------- src/backend/utils/adt/varlena.c | 27 +--- src/backend/utils/fmgr/README | 4 + src/backend/utils/fmgr/funcapi.c | 69 +++++++++ src/backend/utils/misc/guc.c | 31 +--- src/backend/utils/misc/pg_config.c | 29 +--- src/backend/utils/mmgr/portalmem.c | 37 +---- src/include/funcapi.h | 12 +- 24 files changed, 176 insertions(+), 872 deletions(-) diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c index 1e8587502e..3c3fc2515b 100644 --- a/src/backend/commands/event_trigger.c +++ b/src/backend/commands/event_trigger.c @@ -1290,10 +1290,6 @@ Datum pg_event_trigger_dropped_objects(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; slist_iter iter; /* @@ -1306,30 +1302,8 @@ pg_event_trigger_dropped_objects(PG_FUNCTION_ARGS) errmsg("%s can only be called in a sql_drop event trigger function", "pg_event_trigger_dropped_objects()"))); - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - /* Build tuplestore to hold the result rows */ - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); slist_foreach(iter, &(currentEventTriggerState->SQLDropList)) { @@ -1398,7 +1372,8 @@ pg_event_trigger_dropped_objects(PG_FUNCTION_ARGS) nulls[i++] = true; } - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } return (Datum) 0; @@ -1846,10 +1821,6 @@ Datum pg_event_trigger_ddl_commands(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; ListCell *lc; /* @@ -1861,30 +1832,8 @@ pg_event_trigger_ddl_commands(PG_FUNCTION_ARGS) errmsg("%s can only be called in an event trigger function", "pg_event_trigger_ddl_commands()"))); - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - /* Build tuplestore to hold the result rows */ - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); foreach(lc, currentEventTriggerState->commandList) { @@ -2055,7 +2004,8 @@ pg_event_trigger_ddl_commands(PG_FUNCTION_ARGS) break; } - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } PG_RETURN_VOID(); diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index 42503ef454..1013790dbb 100644 --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c @@ -1932,38 +1932,12 @@ Datum pg_available_extensions(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; char *location; DIR *dir; struct dirent *de; - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - /* Build tuplestore to hold the result rows */ - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); location = get_extension_control_directory(); dir = AllocateDir(location); @@ -2015,7 +1989,8 @@ pg_available_extensions(PG_FUNCTION_ARGS) else values[2] = CStringGetTextDatum(control->comment); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } FreeDir(dir); @@ -2037,38 +2012,12 @@ Datum pg_available_extension_versions(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; char *location; DIR *dir; struct dirent *de; - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - /* Build tuplestore to hold the result rows */ - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); location = get_extension_control_directory(); dir = AllocateDir(location); @@ -2103,7 +2052,8 @@ pg_available_extension_versions(PG_FUNCTION_ARGS) control = read_extension_control_file(extname); /* scan extension's script directory for install scripts */ - get_available_versions_for_extension(control, tupstore, tupdesc); + get_available_versions_for_extension(control, rsinfo->setResult, + rsinfo->setDesc); } FreeDir(dir); @@ -2316,10 +2266,6 @@ pg_extension_update_paths(PG_FUNCTION_ARGS) { Name extname = PG_GETARG_NAME(0); ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; List *evi_list; ExtensionControlFile *control; ListCell *lc1; @@ -2327,30 +2273,8 @@ pg_extension_update_paths(PG_FUNCTION_ARGS) /* Check extension name validity before any filesystem access */ check_valid_extension_name(NameStr(*extname)); - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - /* Build tuplestore to hold the result rows */ - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); /* Read the extension's control file */ control = read_extension_control_file(NameStr(*extname)); @@ -2407,7 +2331,8 @@ pg_extension_update_paths(PG_FUNCTION_ARGS) pfree(pathbuf.data); } - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } } diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index dce30aed6c..d2d8ee120c 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -702,41 +702,12 @@ Datum pg_prepared_statement(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; - - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - /* need to build tuplestore in query context */ - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); /* * We put all the tuples into a tuplestore in one scan of the hashtable. * This avoids any issue of the hashtable possibly changing between calls. */ - tupstore = - tuplestore_begin_heap(rsinfo->allowedModes & SFRM_Materialize_Random, - false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - /* generate junk in short-term context */ - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); /* hash table might be uninitialized */ if (prepared_queries) @@ -761,7 +732,8 @@ pg_prepared_statement(PG_FUNCTION_ARGS) values[5] = Int64GetDatumFast(prep_stmt->plansource->num_generic_plans); values[6] = Int64GetDatumFast(prep_stmt->plansource->num_custom_plans); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } } diff --git a/src/backend/foreign/foreign.c b/src/backend/foreign/foreign.c index c3406c3b9d..cf222fc3e9 100644 --- a/src/backend/foreign/foreign.c +++ b/src/backend/foreign/foreign.c @@ -20,6 +20,7 @@ #include "catalog/pg_user_mapping.h" #include "foreign/fdwapi.h" #include "foreign/foreign.h" +#include "funcapi.h" #include "lib/stringinfo.h" #include "miscadmin.h" #include "utils/builtins.h" @@ -510,38 +511,12 @@ pg_options_to_table(PG_FUNCTION_ARGS) ListCell *cell; List *options; ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; - - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize) || - rsinfo->expectedDesc == NULL) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); options = untransformRelOptions(array); rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - /* - * Now prepare the result set. - */ - tupdesc = CreateTupleDescCopy(rsinfo->expectedDesc); - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + /* prepare the result set */ + SetSingleFuncCall(fcinfo, SRF_SINGLE_USE_EXPECTED); foreach(cell, options) { @@ -561,7 +536,8 @@ pg_options_to_table(PG_FUNCTION_ARGS) values[1] = (Datum) 0; nulls[1] = true; } - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } return (Datum) 0; diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index d84a40b726..90953c38f3 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -1685,8 +1685,8 @@ parse_hba_line(TokenizedLine *tok_line, int elevel) if (parsedline->auth_method == uaCert) { /* - * For auth method cert, client certificate validation is mandatory, and it implies - * the level of verify-full. + * For auth method cert, client certificate validation is mandatory, + * and it implies the level of verify-full. */ parsedline->clientcert = clientCertFull; } @@ -2703,47 +2703,19 @@ fill_hba_view(Tuplestorestate *tuple_store, TupleDesc tupdesc) Datum pg_hba_file_rules(PG_FUNCTION_ARGS) { - Tuplestorestate *tuple_store; - TupleDesc tupdesc; - MemoryContext old_cxt; ReturnSetInfo *rsi; /* - * We must use the Materialize mode to be safe against HBA file changes - * while the cursor is open. It's also more efficient than having to look - * up our current position in the parsed list every time. + * Build tuplestore to hold the result rows. We must use the Materialize + * mode to be safe against HBA file changes while the cursor is open. + * It's also more efficient than having to look up our current position in + * the parsed list every time. */ - rsi = (ReturnSetInfo *) fcinfo->resultinfo; - - /* Check to see if caller supports us returning a tuplestore */ - if (rsi == NULL || !IsA(rsi, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsi->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - rsi->returnMode = SFRM_Materialize; - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - /* Build tuplestore to hold the result rows */ - old_cxt = MemoryContextSwitchTo(rsi->econtext->ecxt_per_query_memory); - - tuple_store = - tuplestore_begin_heap(rsi->allowedModes & SFRM_Materialize_Random, - false, work_mem); - rsi->setDesc = tupdesc; - rsi->setResult = tuple_store; - - MemoryContextSwitchTo(old_cxt); + SetSingleFuncCall(fcinfo, 0); /* Fill the tuplestore */ - fill_hba_view(tuple_store, tupdesc); + rsi = (ReturnSetInfo *) fcinfo->resultinfo; + fill_hba_view(rsi->setResult, rsi->setDesc); PG_RETURN_NULL(); } diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c index 5a68d6dead..6f25b2c2ad 100644 --- a/src/backend/replication/logical/launcher.c +++ b/src/backend/replication/logical/launcher.c @@ -930,34 +930,8 @@ pg_stat_get_subscription(PG_FUNCTION_ARGS) Oid subid = PG_ARGISNULL(0) ? InvalidOid : PG_GETARG_OID(0); int i; ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); /* Make sure we get consistent view of the workers. */ LWLockAcquire(LogicalRepWorkerLock, LW_SHARED); @@ -1010,7 +984,8 @@ pg_stat_get_subscription(PG_FUNCTION_ARGS) else values[7] = TimestampTzGetDatum(worker.reply_time); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); /* * If only a single subscription was requested, and we found it, diff --git a/src/backend/replication/logical/logicalfuncs.c b/src/backend/replication/logical/logicalfuncs.c index 3bd770a3ba..6058d36e0d 100644 --- a/src/backend/replication/logical/logicalfuncs.c +++ b/src/backend/replication/logical/logicalfuncs.c @@ -142,25 +142,11 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin errmsg("options array must not be null"))); arr = PG_GETARG_ARRAYTYPE_P(3); - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - /* state to write output to */ p = palloc0(sizeof(DecodingOutputState)); p->binary_output = binary; - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &p->tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; oldcontext = MemoryContextSwitchTo(per_query_ctx); @@ -203,10 +189,9 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin } } - p->tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = p->tupstore; - rsinfo->setDesc = p->tupdesc; + SetSingleFuncCall(fcinfo, 0); + p->tupstore = rsinfo->setResult; + p->tupdesc = rsinfo->setDesc; /* * Compute the current end-of-wal. diff --git a/src/backend/replication/logical/origin.c b/src/backend/replication/logical/origin.c index 76055a8a03..0e38eff0f0 100644 --- a/src/backend/replication/logical/origin.c +++ b/src/backend/replication/logical/origin.c @@ -1482,40 +1482,13 @@ Datum pg_show_replication_origin_status(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; int i; #define REPLICATION_ORIGIN_PROGRESS_COLS 4 /* we want to return 0 rows if slot is set to zero */ replorigin_check_prerequisites(false, true); - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - if (tupdesc->natts != REPLICATION_ORIGIN_PROGRESS_COLS) - elog(ERROR, "wrong function definition"); - - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); - + SetSingleFuncCall(fcinfo, 0); /* prevent slots from being concurrently dropped */ LWLockAcquire(ReplicationOriginLock, LW_SHARED); @@ -1565,7 +1538,8 @@ pg_show_replication_origin_status(PG_FUNCTION_ARGS) LWLockRelease(&state->lock); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } LWLockRelease(ReplicationOriginLock); diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c index 886899afd2..ca945994ef 100644 --- a/src/backend/replication/slotfuncs.c +++ b/src/backend/replication/slotfuncs.c @@ -233,42 +233,16 @@ pg_get_replication_slots(PG_FUNCTION_ARGS) { #define PG_GET_REPLICATION_SLOTS_COLS 14 ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; XLogRecPtr currlsn; int slotno; - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - /* * We don't require any special permission to see this function's data * because nothing should be sensitive. The most critical being the slot * name, which shouldn't contain anything particularly sensitive. */ - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); currlsn = GetXLogWriteRecPtr(); @@ -431,7 +405,8 @@ pg_get_replication_slots(PG_FUNCTION_ARGS) Assert(i == PG_GET_REPLICATION_SLOTS_COLS); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } LWLockRelease(ReplicationSlotControlLock); diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 5a718b1fe9..2d0292a092 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -3403,37 +3403,11 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS) { #define PG_STAT_GET_WAL_SENDERS_COLS 12 ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; SyncRepStandbyData *sync_standbys; int num_standbys; int i; - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); /* * Get the currently active synchronous standbys. This could be out of @@ -3577,7 +3551,8 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS) values[11] = TimestampTzGetDatum(replyTime); } - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } return (Datum) 0; diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c index 1f023a3460..c1279960cd 100644 --- a/src/backend/storage/ipc/shmem.c +++ b/src/backend/storage/ipc/shmem.c @@ -537,39 +537,13 @@ pg_get_shmem_allocations(PG_FUNCTION_ARGS) { #define PG_GET_SHMEM_SIZES_COLS 4 ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; HASH_SEQ_STATUS hstat; ShmemIndexEnt *ent; Size named_allocated = 0; Datum values[PG_GET_SHMEM_SIZES_COLS]; bool nulls[PG_GET_SHMEM_SIZES_COLS]; - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); LWLockAcquire(ShmemIndexLock, LW_SHARED); @@ -585,7 +559,8 @@ pg_get_shmem_allocations(PG_FUNCTION_ARGS) values[3] = Int64GetDatum(ent->allocated_size); named_allocated += ent->allocated_size; - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } /* output shared memory allocated but not counted via the shmem index */ @@ -593,7 +568,7 @@ pg_get_shmem_allocations(PG_FUNCTION_ARGS) nulls[1] = true; values[2] = Int64GetDatum(ShmemSegHdr->freeoffset - named_allocated); values[3] = values[2]; - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); /* output as-of-yet unused shared memory */ nulls[0] = true; @@ -601,7 +576,7 @@ pg_get_shmem_allocations(PG_FUNCTION_ARGS) nulls[1] = false; values[2] = Int64GetDatum(ShmemSegHdr->totalsize - ShmemSegHdr->freeoffset); values[3] = values[2]; - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); LWLockRelease(ShmemIndexLock); diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 7926258c06..ba0ec35ac5 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -4786,9 +4786,6 @@ Datum pg_timezone_names(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - bool randomAccess; - TupleDesc tupdesc; - Tuplestorestate *tupstore; pg_tzenum *tzenum; pg_tz *tz; Datum values[4]; @@ -4799,31 +4796,8 @@ pg_timezone_names(PG_FUNCTION_ARGS) const char *tzn; Interval *resInterval; struct pg_tm itm; - MemoryContext oldcontext; - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* The tupdesc and tuplestore must be created in ecxt_per_query_memory */ - oldcontext = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory); - - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - randomAccess = (rsinfo->allowedModes & SFRM_Materialize_Random) != 0; - tupstore = tuplestore_begin_heap(randomAccess, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); /* initialize timezone scanning code */ tzenum = pg_tzenumerate_start(); @@ -4865,7 +4839,7 @@ pg_timezone_names(PG_FUNCTION_ARGS) values[3] = BoolGetDatum(tm.tm_isdst > 0); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); } pg_tzenumerate_end(tzenum); diff --git a/src/backend/utils/adt/genfile.c b/src/backend/utils/adt/genfile.c index fe6863d8b4..1ed01620a1 100644 --- a/src/backend/utils/adt/genfile.c +++ b/src/backend/utils/adt/genfile.c @@ -477,12 +477,8 @@ pg_ls_dir(PG_FUNCTION_ARGS) char *location; bool missing_ok = false; bool include_dot_dirs = false; - bool randomAccess; - TupleDesc tupdesc; - Tuplestorestate *tupstore; DIR *dirdesc; struct dirent *de; - MemoryContext oldcontext; location = convert_and_check_filename(PG_GETARG_TEXT_PP(0)); @@ -495,29 +491,7 @@ pg_ls_dir(PG_FUNCTION_ARGS) include_dot_dirs = PG_GETARG_BOOL(2); } - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* The tupdesc and tuplestore must be created in ecxt_per_query_memory */ - oldcontext = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory); - - tupdesc = CreateTemplateTupleDesc(1); - TupleDescInitEntry(tupdesc, (AttrNumber) 1, "pg_ls_dir", TEXTOID, -1, 0); - - randomAccess = (rsinfo->allowedModes & SFRM_Materialize_Random) != 0; - tupstore = tuplestore_begin_heap(randomAccess, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, SRF_SINGLE_USE_EXPECTED); dirdesc = AllocateDir(location); if (!dirdesc) @@ -541,7 +515,8 @@ pg_ls_dir(PG_FUNCTION_ARGS) values[0] = CStringGetTextDatum(de->d_name); nulls[0] = false; - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } FreeDir(dirdesc); @@ -571,36 +546,10 @@ static Datum pg_ls_dir_files(FunctionCallInfo fcinfo, const char *dir, bool missing_ok) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - bool randomAccess; - TupleDesc tupdesc; - Tuplestorestate *tupstore; DIR *dirdesc; struct dirent *de; - MemoryContext oldcontext; - - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* The tupdesc and tuplestore must be created in ecxt_per_query_memory */ - oldcontext = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory); - - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - randomAccess = (rsinfo->allowedModes & SFRM_Materialize_Random) != 0; - tupstore = tuplestore_begin_heap(randomAccess, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); /* * Now walk the directory. Note that we must do this within a single SRF @@ -648,7 +597,7 @@ pg_ls_dir_files(FunctionCallInfo fcinfo, const char *dir, bool missing_ok) values[2] = TimestampTzGetDatum(time_t_to_timestamptz(attrib.st_mtime)); memset(nulls, 0, sizeof(nulls)); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); } FreeDir(dirdesc); diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index 2457061f97..29664aa6e4 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -1909,9 +1909,6 @@ each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text) { Jsonb *jb = PG_GETARG_JSONB_P(0); ReturnSetInfo *rsi; - Tuplestorestate *tuple_store; - TupleDesc tupdesc; - TupleDesc ret_tdesc; MemoryContext old_cxt, tmp_cxt; bool skipNested = false; @@ -1926,30 +1923,7 @@ each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text) funcname))); rsi = (ReturnSetInfo *) fcinfo->resultinfo; - - if (!rsi || !IsA(rsi, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsi->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - rsi->returnMode = SFRM_Materialize; - - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - old_cxt = MemoryContextSwitchTo(rsi->econtext->ecxt_per_query_memory); - - ret_tdesc = CreateTupleDescCopy(tupdesc); - BlessTupleDesc(ret_tdesc); - tuple_store = - tuplestore_begin_heap(rsi->allowedModes & SFRM_Materialize_Random, - false, work_mem); - - MemoryContextSwitchTo(old_cxt); + SetSingleFuncCall(fcinfo, SRF_SINGLE_BLESS); tmp_cxt = AllocSetContextCreate(CurrentMemoryContext, "jsonb_each temporary cxt", @@ -1964,7 +1938,6 @@ each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text) if (r == WJB_KEY) { text *key; - HeapTuple tuple; Datum values[2]; bool nulls[2] = {false, false}; @@ -2001,9 +1974,7 @@ each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text) values[1] = PointerGetDatum(val); } - tuple = heap_form_tuple(ret_tdesc, values, nulls); - - tuplestore_puttuple(tuple_store, tuple); + tuplestore_putvalues(rsi->setResult, rsi->setDesc, values, nulls); /* clean up and switch back */ MemoryContextSwitchTo(old_cxt); @@ -2013,9 +1984,6 @@ each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text) MemoryContextDelete(tmp_cxt); - rsi->setResult = tuple_store; - rsi->setDesc = ret_tdesc; - PG_RETURN_NULL(); } @@ -2027,8 +1995,6 @@ each_worker(FunctionCallInfo fcinfo, bool as_text) JsonLexContext *lex; JsonSemAction *sem; ReturnSetInfo *rsi; - MemoryContext old_cxt; - TupleDesc tupdesc; EachState *state; lex = makeJsonLexContext(json, true); @@ -2037,30 +2003,9 @@ each_worker(FunctionCallInfo fcinfo, bool as_text) rsi = (ReturnSetInfo *) fcinfo->resultinfo; - if (!rsi || !IsA(rsi, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - - if (!(rsi->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - rsi->returnMode = SFRM_Materialize; - - (void) get_call_result_type(fcinfo, NULL, &tupdesc); - - /* make these in a sufficiently long-lived memory context */ - old_cxt = MemoryContextSwitchTo(rsi->econtext->ecxt_per_query_memory); - - state->ret_tdesc = CreateTupleDescCopy(tupdesc); - BlessTupleDesc(state->ret_tdesc); - state->tuple_store = - tuplestore_begin_heap(rsi->allowedModes & SFRM_Materialize_Random, - false, work_mem); - - MemoryContextSwitchTo(old_cxt); + SetSingleFuncCall(fcinfo, SRF_SINGLE_BLESS); + state->tuple_store = rsi->setResult; + state->ret_tdesc = rsi->setDesc; sem->semstate = (void *) state; sem->array_start = each_array_start; @@ -2079,9 +2024,6 @@ each_worker(FunctionCallInfo fcinfo, bool as_text) MemoryContextDelete(state->tmp_cxt); - rsi->setResult = state->tuple_store; - rsi->setDesc = state->ret_tdesc; - PG_RETURN_NULL(); } @@ -2206,9 +2148,6 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, { Jsonb *jb = PG_GETARG_JSONB_P(0); ReturnSetInfo *rsi; - Tuplestorestate *tuple_store; - TupleDesc tupdesc; - TupleDesc ret_tdesc; MemoryContext old_cxt, tmp_cxt; bool skipNested = false; @@ -2227,31 +2166,8 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, rsi = (ReturnSetInfo *) fcinfo->resultinfo; - if (!rsi || !IsA(rsi, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - - if (!(rsi->allowedModes & SFRM_Materialize) || - rsi->expectedDesc == NULL) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - rsi->returnMode = SFRM_Materialize; - - /* it's a simple type, so don't use get_call_result_type() */ - tupdesc = rsi->expectedDesc; - - old_cxt = MemoryContextSwitchTo(rsi->econtext->ecxt_per_query_memory); - - ret_tdesc = CreateTupleDescCopy(tupdesc); - BlessTupleDesc(ret_tdesc); - tuple_store = - tuplestore_begin_heap(rsi->allowedModes & SFRM_Materialize_Random, - false, work_mem); - - MemoryContextSwitchTo(old_cxt); + SetSingleFuncCall(fcinfo, + SRF_SINGLE_USE_EXPECTED | SRF_SINGLE_BLESS); tmp_cxt = AllocSetContextCreate(CurrentMemoryContext, "jsonb_array_elements temporary cxt", @@ -2265,7 +2181,6 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, if (r == WJB_ELEM) { - HeapTuple tuple; Datum values[1]; bool nulls[1] = {false}; @@ -2291,9 +2206,7 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, values[0] = PointerGetDatum(val); } - tuple = heap_form_tuple(ret_tdesc, values, nulls); - - tuplestore_puttuple(tuple_store, tuple); + tuplestore_putvalues(rsi->setResult, rsi->setDesc, values, nulls); /* clean up and switch back */ MemoryContextSwitchTo(old_cxt); @@ -2303,9 +2216,6 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, MemoryContextDelete(tmp_cxt); - rsi->setResult = tuple_store; - rsi->setDesc = ret_tdesc; - PG_RETURN_NULL(); } @@ -2330,41 +2240,15 @@ elements_worker(FunctionCallInfo fcinfo, const char *funcname, bool as_text) JsonLexContext *lex = makeJsonLexContext(json, as_text); JsonSemAction *sem; ReturnSetInfo *rsi; - MemoryContext old_cxt; - TupleDesc tupdesc; ElementsState *state; state = palloc0(sizeof(ElementsState)); sem = palloc0(sizeof(JsonSemAction)); + SetSingleFuncCall(fcinfo, SRF_SINGLE_USE_EXPECTED | SRF_SINGLE_BLESS); rsi = (ReturnSetInfo *) fcinfo->resultinfo; - - if (!rsi || !IsA(rsi, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - - if (!(rsi->allowedModes & SFRM_Materialize) || - rsi->expectedDesc == NULL) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - rsi->returnMode = SFRM_Materialize; - - /* it's a simple type, so don't use get_call_result_type() */ - tupdesc = rsi->expectedDesc; - - /* make these in a sufficiently long-lived memory context */ - old_cxt = MemoryContextSwitchTo(rsi->econtext->ecxt_per_query_memory); - - state->ret_tdesc = CreateTupleDescCopy(tupdesc); - BlessTupleDesc(state->ret_tdesc); - state->tuple_store = - tuplestore_begin_heap(rsi->allowedModes & SFRM_Materialize_Random, - false, work_mem); - - MemoryContextSwitchTo(old_cxt); + state->tuple_store = rsi->setResult; + state->ret_tdesc = rsi->setDesc; sem->semstate = (void *) state; sem->object_start = elements_object_start; @@ -2384,9 +2268,6 @@ elements_worker(FunctionCallInfo fcinfo, const char *funcname, bool as_text) MemoryContextDelete(state->tmp_cxt); - rsi->setResult = state->tuple_store; - rsi->setDesc = state->ret_tdesc; - PG_RETURN_NULL(); } diff --git a/src/backend/utils/adt/mcxtfuncs.c b/src/backend/utils/adt/mcxtfuncs.c index c7c95adf97..bb7cc94024 100644 --- a/src/backend/utils/adt/mcxtfuncs.c +++ b/src/backend/utils/adt/mcxtfuncs.c @@ -120,36 +120,9 @@ Datum pg_get_backend_memory_contexts(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; - - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); - - PutMemoryContextsStatsTupleStore(tupstore, tupdesc, + + SetSingleFuncCall(fcinfo, 0); + PutMemoryContextsStatsTupleStore(rsinfo->setResult, rsinfo->setDesc, TopMemoryContext, NULL, 0); return (Datum) 0; diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c index e79eb6b478..4568749d23 100644 --- a/src/backend/utils/adt/misc.c +++ b/src/backend/utils/adt/misc.c @@ -203,39 +203,11 @@ pg_tablespace_databases(PG_FUNCTION_ARGS) { Oid tablespaceOid = PG_GETARG_OID(0); ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - bool randomAccess; - TupleDesc tupdesc; - Tuplestorestate *tupstore; char *location; DIR *dirdesc; struct dirent *de; - MemoryContext oldcontext; - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* The tupdesc and tuplestore must be created in ecxt_per_query_memory */ - oldcontext = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory); - - tupdesc = CreateTemplateTupleDesc(1); - TupleDescInitEntry(tupdesc, (AttrNumber) 1, "pg_tablespace_databases", - OIDOID, -1, 0); - - randomAccess = (rsinfo->allowedModes & SFRM_Materialize_Random) != 0; - tupstore = tuplestore_begin_heap(randomAccess, false, work_mem); - - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, SRF_SINGLE_USE_EXPECTED); if (tablespaceOid == GLOBALTABLESPACE_OID) { @@ -291,7 +263,8 @@ pg_tablespace_databases(PG_FUNCTION_ARGS) values[0] = ObjectIdGetDatum(datOid); nulls[0] = false; - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } FreeDir(dirdesc); diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index fd993d0d5f..eff45b16f2 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -461,25 +461,7 @@ pg_stat_get_progress_info(PG_FUNCTION_ARGS) int curr_backend; char *cmd = text_to_cstring(PG_GETARG_TEXT_PP(0)); ProgressCommandType cmdtype; - TupleDesc tupdesc; - Tuplestorestate *tupstore; ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - MemoryContext per_query_ctx; - MemoryContext oldcontext; - - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); /* Translate command name into command type code. */ if (pg_strcasecmp(cmd, "VACUUM") == 0) @@ -499,14 +481,7 @@ pg_stat_get_progress_info(PG_FUNCTION_ARGS) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid command name: \"%s\"", cmd))); - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); /* 1-based index */ for (curr_backend = 1; curr_backend <= num_backends; curr_backend++) @@ -552,7 +527,7 @@ pg_stat_get_progress_info(PG_FUNCTION_ARGS) nulls[i + 3] = true; } - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); } return (Datum) 0; @@ -569,34 +544,8 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) int curr_backend; int pid = PG_ARGISNULL(0) ? -1 : PG_GETARG_INT32(0); ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; - - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); /* 1-based index */ for (curr_backend = 1; curr_backend <= num_backends; curr_backend++) @@ -629,7 +578,7 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) nulls[5] = false; values[5] = CStringGetTextDatum(""); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); continue; } @@ -943,7 +892,7 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) nulls[29] = true; } - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); /* If only a single backend was requested, and we found it, break. */ if (pid != -1) @@ -1866,36 +1815,10 @@ pg_stat_get_slru(PG_FUNCTION_ARGS) { #define PG_STAT_GET_SLRU_COLS 9 ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; int i; PgStat_SLRUStats *stats; - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); /* request SLRU stats from the stat collector */ stats = pgstat_fetch_slru(); @@ -1927,7 +1850,7 @@ pg_stat_get_slru(PG_FUNCTION_ARGS) values[7] = Int64GetDatum(stat.truncate); values[8] = TimestampTzGetDatum(stat.stat_reset_timestamp); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); } return (Datum) 0; diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index b2003f5672..22ab5a4329 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -24,6 +24,7 @@ #include "common/hashfn.h" #include "common/int.h" #include "common/unicode_norm.h" +#include "funcapi.h" #include "lib/hyperloglog.h" #include "libpq/pqformat.h" #include "miscadmin.h" @@ -4832,34 +4833,14 @@ text_to_table(PG_FUNCTION_ARGS) { ReturnSetInfo *rsi = (ReturnSetInfo *) fcinfo->resultinfo; SplitTextOutputData tstate; - MemoryContext old_cxt; - - /* check to see if caller supports us returning a tuplestore */ - if (rsi == NULL || !IsA(rsi, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsi->allowedModes & SFRM_Materialize) || - rsi->expectedDesc == NULL) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* OK, prepare tuplestore in per-query memory */ - old_cxt = MemoryContextSwitchTo(rsi->econtext->ecxt_per_query_memory); tstate.astate = NULL; - tstate.tupdesc = CreateTupleDescCopy(rsi->expectedDesc); - tstate.tupstore = tuplestore_begin_heap(true, false, work_mem); - - MemoryContextSwitchTo(old_cxt); + SetSingleFuncCall(fcinfo, SRF_SINGLE_USE_EXPECTED); + tstate.tupstore = rsi->setResult; + tstate.tupdesc = rsi->setDesc; (void) split_text(fcinfo, &tstate); - rsi->returnMode = SFRM_Materialize; - rsi->setResult = tstate.tupstore; - rsi->setDesc = tstate.tupdesc; - return (Datum) 0; } diff --git a/src/backend/utils/fmgr/README b/src/backend/utils/fmgr/README index 1e4c4b94a9..9d8848106d 100644 --- a/src/backend/utils/fmgr/README +++ b/src/backend/utils/fmgr/README @@ -305,6 +305,10 @@ If available, the expected tuple descriptor is passed in ReturnSetInfo; in other contexts the expectedDesc field will be NULL. The function need not pay attention to expectedDesc, but it may be useful in special cases. +SetSingleFuncCall() is a helper function able to setup the function's +ReturnSetInfo for a single call, filling in the Tuplestore and the +TupleDesc with the proper configuration for Materialize mode. + There is no support for functions accepting sets; instead, the function will be called multiple times, once for each element of the input set. diff --git a/src/backend/utils/fmgr/funcapi.c b/src/backend/utils/fmgr/funcapi.c index 5d913ae08d..d269662ad8 100644 --- a/src/backend/utils/fmgr/funcapi.c +++ b/src/backend/utils/fmgr/funcapi.c @@ -19,6 +19,7 @@ #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "funcapi.h" +#include "miscadmin.h" #include "nodes/nodeFuncs.h" #include "utils/array.h" #include "utils/builtins.h" @@ -27,6 +28,7 @@ #include "utils/regproc.h" #include "utils/rel.h" #include "utils/syscache.h" +#include "utils/tuplestore.h" #include "utils/typcache.h" @@ -54,6 +56,73 @@ static bool resolve_polymorphic_tupdesc(TupleDesc tupdesc, static TypeFuncClass get_type_func_class(Oid typid, Oid *base_typeid); +/* + * SetSingleFuncCall + * + * Helper function to build the state of a set-returning function used + * in the context of a single call with materialize mode. This code + * includes sanity checks on ReturnSetInfo, creates the Tuplestore and + * the TupleDesc used with the function and stores them into the + * function's ReturnSetInfo. + * + * "flags" can be set to SRF_SINGLE_USE_EXPECTED, to use the tuple + * descriptor coming from expectedDesc, which is the tuple descriptor + * expected by the caller. SRF_SINGLE_BLESS can be set to complete the + * information associated to the tuple descriptor, which is necessary + * in some cases where the tuple descriptor comes from a transient + * RECORD datatype. + */ +void +SetSingleFuncCall(FunctionCallInfo fcinfo, bits32 flags) +{ + bool random_access; + ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; + Tuplestorestate *tupstore; + MemoryContext old_context, + per_query_ctx; + TupleDesc stored_tupdesc; + + /* check to see if caller supports returning a tuplestore */ + if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("set-valued function called in context that cannot accept a set"))); + if (!(rsinfo->allowedModes & SFRM_Materialize) || + ((flags & SRF_SINGLE_USE_EXPECTED) != 0 && rsinfo->expectedDesc == NULL)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("materialize mode required, but it is not allowed in this context"))); + + /* + * Store the tuplestore and the tuple descriptor in ReturnSetInfo. This + * must be done in the per-query memory context. + */ + per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; + old_context = MemoryContextSwitchTo(per_query_ctx); + + /* build a tuple descriptor for our result type */ + if ((flags & SRF_SINGLE_USE_EXPECTED) != 0) + stored_tupdesc = CreateTupleDescCopy(rsinfo->expectedDesc); + else + { + if (get_call_result_type(fcinfo, NULL, &stored_tupdesc) != TYPEFUNC_COMPOSITE) + elog(ERROR, "return type must be a row type"); + } + + /* If requested, bless the tuple descriptor */ + if ((flags & SRF_SINGLE_BLESS) != 0) + BlessTupleDesc(stored_tupdesc); + + random_access = (rsinfo->allowedModes & SFRM_Materialize_Random) != 0; + + tupstore = tuplestore_begin_heap(random_access, false, work_mem); + rsinfo->returnMode = SFRM_Materialize; + rsinfo->setResult = tupstore; + rsinfo->setDesc = stored_tupdesc; + MemoryContextSwitchTo(old_context); +} + + /* * init_MultiFuncCall * Create an empty FuncCallContext data structure diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 1e3650184b..6d11f9c71b 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10157,41 +10157,14 @@ show_all_file_settings(PG_FUNCTION_ARGS) { #define NUM_PG_FILE_SETTINGS_ATTS 7 ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; ConfigVariable *conf; int seqno; - MemoryContext per_query_ctx; - MemoryContext oldcontext; - - /* Check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); /* Scan the config files using current context as workspace */ conf = ProcessConfigFileInternal(PGC_SIGHUP, false, DEBUG3); - /* Switch into long-lived context to construct returned data structures */ - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - /* Build a tuplestore to return our results in */ - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - /* The rest can be done in short-lived context */ - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); /* Process the results and create a tuplestore */ for (seqno = 1; conf != NULL; conf = conf->next, seqno++) @@ -10239,7 +10212,7 @@ show_all_file_settings(PG_FUNCTION_ARGS) nulls[6] = true; /* shove row into tuplestore */ - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); } return (Datum) 0; diff --git a/src/backend/utils/misc/pg_config.c b/src/backend/utils/misc/pg_config.c index e646a41910..d9e18caf44 100644 --- a/src/backend/utils/misc/pg_config.c +++ b/src/backend/utils/misc/pg_config.c @@ -25,35 +25,12 @@ Datum pg_config(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - Tuplestorestate *tupstore; - TupleDesc tupdesc; - MemoryContext oldcontext; ConfigData *configdata; size_t configdata_len; int i = 0; - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - /* Build tuplestore to hold the result rows */ - oldcontext = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + /* initialize our tuplestore */ + SetSingleFuncCall(fcinfo, 0); configdata = get_configdata(my_exec_path, &configdata_len); for (i = 0; i < configdata_len; i++) @@ -67,7 +44,7 @@ pg_config(PG_FUNCTION_ARGS) values[0] = CStringGetTextDatum(configdata[i].name); values[1] = CStringGetTextDatum(configdata[i].setting); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); } return (Datum) 0; diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c index afc03682d9..d549f66d4a 100644 --- a/src/backend/utils/mmgr/portalmem.c +++ b/src/backend/utils/mmgr/portalmem.c @@ -1132,43 +1132,14 @@ Datum pg_cursor(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; HASH_SEQ_STATUS hash_seq; PortalHashEnt *hentry; - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* need to build tuplestore in query context */ - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - /* * We put all the tuples into a tuplestore in one scan of the hashtable. * This avoids any issue of the hashtable possibly changing between calls. */ - tupstore = - tuplestore_begin_heap(rsinfo->allowedModes & SFRM_Materialize_Random, - false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - /* generate junk in short-term context */ - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); hash_seq_init(&hash_seq, PortalHashTable); while ((hentry = hash_seq_search(&hash_seq)) != NULL) @@ -1190,13 +1161,9 @@ pg_cursor(PG_FUNCTION_ARGS) values[4] = BoolGetDatum(portal->cursorOptions & CURSOR_OPT_SCROLL); values[5] = TimestampTzGetDatum(portal->creation_time); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); } - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - return (Datum) 0; } diff --git a/src/include/funcapi.h b/src/include/funcapi.h index ba927c2f33..dc3d819a1c 100644 --- a/src/include/funcapi.h +++ b/src/include/funcapi.h @@ -278,14 +278,20 @@ extern Datum HeapTupleHeaderGetDatum(HeapTupleHeader tuple); * memory allocated in multi_call_memory_ctx, but holding file descriptors or * other non-memory resources open across calls is a bug. SRFs that need * such resources should not use these macros, but instead populate a - * tuplestore during a single call, and return that using SFRM_Materialize - * mode (see fmgr/README). Alternatively, set up a callback to release - * resources at query shutdown, using RegisterExprContextCallback(). + * tuplestore during a single call, as set up by SetSingleFuncCall() (see + * fmgr/README). Alternatively, set up a callback to release resources + * at query shutdown, using RegisterExprContextCallback(). * *---------- */ /* from funcapi.c */ + +/* flag bits for SetSingleFuncCall() */ +#define SRF_SINGLE_USE_EXPECTED 0x01 /* use expectedDesc as tupdesc */ +#define SRF_SINGLE_BLESS 0x02 /* validate tuple for SRF */ +extern void SetSingleFuncCall(FunctionCallInfo fcinfo, bits32 flags); + extern FuncCallContext *init_MultiFuncCall(PG_FUNCTION_ARGS); extern FuncCallContext *per_MultiFuncCall(PG_FUNCTION_ARGS); extern void end_MultiFuncCall(PG_FUNCTION_ARGS, FuncCallContext *funcctx); From 5e0e99a80b2f41c8e9ed0f4071892d9e797a12be Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Mon, 7 Mar 2022 08:33:58 +0530 Subject: [PATCH 092/772] Make the errcontext message in logical replication worker translation friendly. Previously, the message for logical replication worker errcontext is incrementally built, which was not translation friendly. Instead, we use complete sentences with if-else branches. We also remove the commit timestamp from the context message since it's not important information and made the message long. Author: Masahiko Sawada Reviewed-by: Takamichi Osumi, and Amit Kapila Discussion: https://postgr.es/m/CAD21AoBarBf2oTF71ig2g_o=3Z_Dt6_sOpMQma1kFgbnA5OZ_w@mail.gmail.com --- src/backend/replication/logical/worker.c | 73 +++++++++++------------- 1 file changed, 33 insertions(+), 40 deletions(-) diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 7e267f7960..92aa794706 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -226,7 +226,6 @@ typedef struct ApplyErrorCallbackArg /* Remote node information */ int remote_attnum; /* -1 if invalid */ TransactionId remote_xid; - TimestampTz ts; /* commit, rollback, or prepare timestamp */ } ApplyErrorCallbackArg; static ApplyErrorCallbackArg apply_error_callback_arg = @@ -235,7 +234,6 @@ static ApplyErrorCallbackArg apply_error_callback_arg = .rel = NULL, .remote_attnum = -1, .remote_xid = InvalidTransactionId, - .ts = 0, }; static MemoryContext ApplyMessageContext = NULL; @@ -334,7 +332,7 @@ static void apply_spooled_messages(TransactionId xid, XLogRecPtr lsn); /* Functions for apply error callback */ static void apply_error_callback(void *arg); -static inline void set_apply_error_context_xact(TransactionId xid, TimestampTz ts); +static inline void set_apply_error_context_xact(TransactionId xid); static inline void reset_apply_error_context_info(void); /* @@ -787,7 +785,7 @@ apply_handle_begin(StringInfo s) LogicalRepBeginData begin_data; logicalrep_read_begin(s, &begin_data); - set_apply_error_context_xact(begin_data.xid, begin_data.committime); + set_apply_error_context_xact(begin_data.xid); remote_final_lsn = begin_data.final_lsn; @@ -839,7 +837,7 @@ apply_handle_begin_prepare(StringInfo s) errmsg_internal("tablesync worker received a BEGIN PREPARE message"))); logicalrep_read_begin_prepare(s, &begin_data); - set_apply_error_context_xact(begin_data.xid, begin_data.prepare_time); + set_apply_error_context_xact(begin_data.xid); remote_final_lsn = begin_data.prepare_lsn; @@ -938,7 +936,7 @@ apply_handle_commit_prepared(StringInfo s) char gid[GIDSIZE]; logicalrep_read_commit_prepared(s, &prepare_data); - set_apply_error_context_xact(prepare_data.xid, prepare_data.commit_time); + set_apply_error_context_xact(prepare_data.xid); /* Compute GID for two_phase transactions. */ TwoPhaseTransactionGid(MySubscription->oid, prepare_data.xid, @@ -979,7 +977,7 @@ apply_handle_rollback_prepared(StringInfo s) char gid[GIDSIZE]; logicalrep_read_rollback_prepared(s, &rollback_data); - set_apply_error_context_xact(rollback_data.xid, rollback_data.rollback_time); + set_apply_error_context_xact(rollback_data.xid); /* Compute GID for two_phase transactions. */ TwoPhaseTransactionGid(MySubscription->oid, rollback_data.xid, @@ -1044,7 +1042,7 @@ apply_handle_stream_prepare(StringInfo s) errmsg_internal("tablesync worker received a STREAM PREPARE message"))); logicalrep_read_stream_prepare(s, &prepare_data); - set_apply_error_context_xact(prepare_data.xid, prepare_data.prepare_time); + set_apply_error_context_xact(prepare_data.xid); elog(DEBUG1, "received prepare for streamed transaction %u", prepare_data.xid); @@ -1126,7 +1124,7 @@ apply_handle_stream_start(StringInfo s) (errcode(ERRCODE_PROTOCOL_VIOLATION), errmsg_internal("invalid transaction ID in streamed replication transaction"))); - set_apply_error_context_xact(stream_xid, 0); + set_apply_error_context_xact(stream_xid); /* * Initialize the worker's stream_fileset if we haven't yet. This will be @@ -1215,7 +1213,7 @@ apply_handle_stream_abort(StringInfo s) */ if (xid == subxid) { - set_apply_error_context_xact(xid, 0); + set_apply_error_context_xact(xid); stream_cleanup_files(MyLogicalRepWorker->subid, xid); } else @@ -1241,7 +1239,7 @@ apply_handle_stream_abort(StringInfo s) bool found = false; char path[MAXPGPATH]; - set_apply_error_context_xact(subxid, 0); + set_apply_error_context_xact(subxid); subidx = -1; begin_replication_step(); @@ -1426,7 +1424,7 @@ apply_handle_stream_commit(StringInfo s) errmsg_internal("STREAM COMMIT message without STREAM STOP"))); xid = logicalrep_read_stream_commit(s, &commit_data); - set_apply_error_context_xact(xid, commit_data.committime); + set_apply_error_context_xact(xid); elog(DEBUG1, "received commit for streamed transaction %u", xid); @@ -3648,46 +3646,41 @@ IsLogicalWorker(void) static void apply_error_callback(void *arg) { - StringInfoData buf; ApplyErrorCallbackArg *errarg = &apply_error_callback_arg; if (apply_error_callback_arg.command == 0) return; - initStringInfo(&buf); - appendStringInfo(&buf, _("processing remote data during \"%s\""), - logicalrep_message_type(errarg->command)); - - /* append relation information */ - if (errarg->rel) - { - appendStringInfo(&buf, _(" for replication target relation \"%s.%s\""), - errarg->rel->remoterel.nspname, - errarg->rel->remoterel.relname); - if (errarg->remote_attnum >= 0) - appendStringInfo(&buf, _(" column \"%s\""), - errarg->rel->remoterel.attnames[errarg->remote_attnum]); - } - - /* append transaction information */ - if (TransactionIdIsNormal(errarg->remote_xid)) + if (errarg->rel == NULL) { - appendStringInfo(&buf, _(" in transaction %u"), errarg->remote_xid); - if (errarg->ts != 0) - appendStringInfo(&buf, _(" at %s"), - timestamptz_to_str(errarg->ts)); + if (!TransactionIdIsValid(errarg->remote_xid)) + errcontext("processing remote data during \"%s\"", + logicalrep_message_type(errarg->command)); + else + errcontext("processing remote data during \"%s\" in transaction %u", + logicalrep_message_type(errarg->command), + errarg->remote_xid); } - - errcontext("%s", buf.data); - pfree(buf.data); + else if (errarg->remote_attnum < 0) + errcontext("processing remote data during \"%s\" for replication target relation \"%s.%s\" in transaction %u", + logicalrep_message_type(errarg->command), + errarg->rel->remoterel.nspname, + errarg->rel->remoterel.relname, + errarg->remote_xid); + else + errcontext("processing remote data during \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u", + logicalrep_message_type(errarg->command), + errarg->rel->remoterel.nspname, + errarg->rel->remoterel.relname, + errarg->rel->remoterel.attnames[errarg->remote_attnum], + errarg->remote_xid); } /* Set transaction information of apply error callback */ static inline void -set_apply_error_context_xact(TransactionId xid, TimestampTz ts) +set_apply_error_context_xact(TransactionId xid) { apply_error_callback_arg.remote_xid = xid; - apply_error_callback_arg.ts = ts; } /* Reset all information of apply error callback */ @@ -3697,5 +3690,5 @@ reset_apply_error_context_info(void) apply_error_callback_arg.command = 0; apply_error_callback_arg.rel = NULL; apply_error_callback_arg.remote_attnum = -1; - set_apply_error_context_xact(InvalidTransactionId, 0); + set_apply_error_context_xact(InvalidTransactionId); } From 25751f54b8e02a8fff62e9dbdbc9f2efbb4e8dc1 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 4 Mar 2022 14:49:37 +0100 Subject: [PATCH 093/772] Add pg_analyze_and_rewrite_varparams() This new function extracts common code from PrepareQuery() and exec_parse_message(). It is then exactly analogous to the existing pg_analyze_and_rewrite_fixedparams() and pg_analyze_and_rewrite_withcb(). To unify these two code paths, this makes PrepareQuery() now subject to log_parser_stats. Also, both paths now invoke TRACE_POSTGRESQL_QUERY_REWRITE_START(). PrepareQuery() no longer checks whether a utility statement was specified. The grammar doesn't allow that anyway, and exec_parse_message() supports it, so restricting it doesn't seem necessary. This also adds QueryEnvironment support to the *varparams functions, for consistency with its cousins, even though it is not used right now. Reviewed-by: Nathan Bossart Discussion: https://www.postgresql.org/message-id/flat/c67ce276-52b4-0239-dc0e-39875bf81840@enterprisedb.com --- src/backend/commands/prepare.c | 43 ++------------- src/backend/parser/analyze.c | 5 +- src/backend/tcop/postgres.c | 95 +++++++++++++++++++++++----------- src/include/parser/analyze.h | 2 +- src/include/tcop/tcopprot.h | 5 ++ 5 files changed, 78 insertions(+), 72 deletions(-) diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index d2d8ee120c..80738547ed 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -63,9 +63,7 @@ PrepareQuery(ParseState *pstate, PrepareStmt *stmt, CachedPlanSource *plansource; Oid *argtypes = NULL; int nargs; - Query *query; List *query_list; - int i; /* * Disallow empty-string statement name (conflicts with protocol-level @@ -97,6 +95,7 @@ PrepareQuery(ParseState *pstate, PrepareStmt *stmt, if (nargs) { + int i; ListCell *l; argtypes = (Oid *) palloc(nargs * sizeof(Oid)); @@ -115,44 +114,10 @@ PrepareQuery(ParseState *pstate, PrepareStmt *stmt, * Analyze the statement using these parameter types (any parameters * passed in from above us will not be visible to it), allowing * information about unknown parameters to be deduced from context. + * Rewrite the query. The result could be 0, 1, or many queries. */ - query = parse_analyze_varparams(rawstmt, pstate->p_sourcetext, - &argtypes, &nargs); - - /* - * Check that all parameter types were determined. - */ - for (i = 0; i < nargs; i++) - { - Oid argtype = argtypes[i]; - - if (argtype == InvalidOid || argtype == UNKNOWNOID) - ereport(ERROR, - (errcode(ERRCODE_INDETERMINATE_DATATYPE), - errmsg("could not determine data type of parameter $%d", - i + 1))); - } - - /* - * grammar only allows PreparableStmt, so this check should be redundant - */ - switch (query->commandType) - { - case CMD_SELECT: - case CMD_INSERT: - case CMD_UPDATE: - case CMD_DELETE: - /* OK */ - break; - default: - ereport(ERROR, - (errcode(ERRCODE_INVALID_PSTATEMENT_DEFINITION), - errmsg("utility statements cannot be prepared"))); - break; - } - - /* Rewrite the query. The result could be 0, 1, or many queries. */ - query_list = QueryRewrite(query); + query_list = pg_analyze_and_rewrite_varparams(rawstmt, pstate->p_sourcetext, + &argtypes, &nargs, NULL); /* Finish filling in the CachedPlanSource */ CompleteCachedPlan(plansource, diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 19d97fe731..53c11b3a15 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -148,7 +148,8 @@ parse_analyze_fixedparams(RawStmt *parseTree, const char *sourceText, */ Query * parse_analyze_varparams(RawStmt *parseTree, const char *sourceText, - Oid **paramTypes, int *numParams) + Oid **paramTypes, int *numParams, + QueryEnvironment *queryEnv) { ParseState *pstate = make_parsestate(NULL); Query *query; @@ -160,6 +161,8 @@ parse_analyze_varparams(RawStmt *parseTree, const char *sourceText, setup_parse_variable_parameters(pstate, paramTypes, numParams); + pstate->p_queryEnv = queryEnv; + query = transformTopLevelStmt(pstate, parseTree); /* make sure all is well with parameter types */ diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index c087db4445..d7e39aed64 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -637,9 +637,11 @@ pg_parse_query(const char *query_string) * NOTE: for reasons mentioned above, this must be separate from raw parsing. */ List * -pg_analyze_and_rewrite_fixedparams(RawStmt *parsetree, const char *query_string, - const Oid *paramTypes, int numParams, - QueryEnvironment *queryEnv) +pg_analyze_and_rewrite_fixedparams(RawStmt *parsetree, + const char *query_string, + const Oid *paramTypes, + int numParams, + QueryEnvironment *queryEnv) { Query *query; List *querytree_list; @@ -668,6 +670,59 @@ pg_analyze_and_rewrite_fixedparams(RawStmt *parsetree, const char *query_string, return querytree_list; } +/* + * Do parse analysis and rewriting. This is the same as + * pg_analyze_and_rewrite_fixedparams except that it's okay to deduce + * information about $n symbol datatypes from context. + */ +List * +pg_analyze_and_rewrite_varparams(RawStmt *parsetree, + const char *query_string, + Oid **paramTypes, + int *numParams, + QueryEnvironment *queryEnv) +{ + Query *query; + List *querytree_list; + + TRACE_POSTGRESQL_QUERY_REWRITE_START(query_string); + + /* + * (1) Perform parse analysis. + */ + if (log_parser_stats) + ResetUsage(); + + query = parse_analyze_varparams(parsetree, query_string, paramTypes, numParams, + queryEnv); + + /* + * Check all parameter types got determined. + */ + for (int i = 0; i < *numParams; i++) + { + Oid ptype = (*paramTypes)[i]; + + if (ptype == InvalidOid || ptype == UNKNOWNOID) + ereport(ERROR, + (errcode(ERRCODE_INDETERMINATE_DATATYPE), + errmsg("could not determine data type of parameter $%d", + i + 1))); + } + + if (log_parser_stats) + ShowUsage("PARSE ANALYSIS STATISTICS"); + + /* + * (2) Rewrite the queries, as necessary + */ + querytree_list = pg_rewrite_query(query); + + TRACE_POSTGRESQL_QUERY_REWRITE_DONE(query_string); + + return querytree_list; +} + /* * Do parse analysis and rewriting. This is the same as * pg_analyze_and_rewrite_fixedparams except that, instead of a fixed list of @@ -1409,7 +1464,6 @@ exec_parse_message(const char *query_string, /* string to execute */ if (parsetree_list != NIL) { - Query *query; bool snapshot_set = false; raw_parse_tree = linitial_node(RawStmt, parsetree_list); @@ -1449,34 +1503,13 @@ exec_parse_message(const char *query_string, /* string to execute */ /* * Analyze and rewrite the query. Note that the originally specified * parameter set is not required to be complete, so we have to use - * parse_analyze_varparams(). - */ - if (log_parser_stats) - ResetUsage(); - - query = parse_analyze_varparams(raw_parse_tree, - query_string, - ¶mTypes, - &numParams); - - /* - * Check all parameter types got determined. + * pg_analyze_and_rewrite_varparams(). */ - for (int i = 0; i < numParams; i++) - { - Oid ptype = paramTypes[i]; - - if (ptype == InvalidOid || ptype == UNKNOWNOID) - ereport(ERROR, - (errcode(ERRCODE_INDETERMINATE_DATATYPE), - errmsg("could not determine data type of parameter $%d", - i + 1))); - } - - if (log_parser_stats) - ShowUsage("PARSE ANALYSIS STATISTICS"); - - querytree_list = pg_rewrite_query(query); + querytree_list = pg_analyze_and_rewrite_varparams(raw_parse_tree, + query_string, + ¶mTypes, + &numParams, + NULL); /* Done with the snapshot used for parsing */ if (snapshot_set) diff --git a/src/include/parser/analyze.h b/src/include/parser/analyze.h index ed989bb141..06b237c39c 100644 --- a/src/include/parser/analyze.h +++ b/src/include/parser/analyze.h @@ -27,7 +27,7 @@ extern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook; extern Query *parse_analyze_fixedparams(RawStmt *parseTree, const char *sourceText, const Oid *paramTypes, int numParams, QueryEnvironment *queryEnv); extern Query *parse_analyze_varparams(RawStmt *parseTree, const char *sourceText, - Oid **paramTypes, int *numParams); + Oid **paramTypes, int *numParams, QueryEnvironment *queryEnv); extern Query *parse_sub_analyze(Node *parseTree, ParseState *parentParseState, CommonTableExpr *parentCTE, diff --git a/src/include/tcop/tcopprot.h b/src/include/tcop/tcopprot.h index 00c20966ab..92291a750d 100644 --- a/src/include/tcop/tcopprot.h +++ b/src/include/tcop/tcopprot.h @@ -49,6 +49,11 @@ extern List *pg_analyze_and_rewrite_fixedparams(RawStmt *parsetree, const char *query_string, const Oid *paramTypes, int numParams, QueryEnvironment *queryEnv); +extern List *pg_analyze_and_rewrite_varparams(RawStmt *parsetree, + const char *query_string, + Oid **paramTypes, + int *numParams, + QueryEnvironment *queryEnv); extern List *pg_analyze_and_rewrite_withcb(RawStmt *parsetree, const char *query_string, ParserSetupHook parserSetup, From d5ed9da41d96988d905b49bebb273a9b2d6e2915 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Mon, 7 Mar 2022 20:53:16 +0100 Subject: [PATCH 094/772] Call ReorderBufferProcessXid from sequence_decode Commit 0da92dc530c added sequence_decode() implementing logical decoding of sequences, but it failed to call ReorderBufferProcessXid() as it should. So add the missing call. Reported-by: Amit Kapila Discussion: https://postgr.es/m/CAA4eK1KGn6cQqJEsubOOENwQOANsExiV2sKL52r4U10J8NJEMQ%40mail.gmail.com --- src/backend/replication/logical/decode.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/backend/replication/logical/decode.c b/src/backend/replication/logical/decode.c index 18cf931822..8c00a73cb9 100644 --- a/src/backend/replication/logical/decode.c +++ b/src/backend/replication/logical/decode.c @@ -1321,6 +1321,8 @@ sequence_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) if (info != XLOG_SEQ_LOG) elog(ERROR, "unexpected RM_SEQ_ID record type: %u", info); + ReorderBufferProcessXid(ctx->reorder, XLogRecGetXid(r), buf->origptr); + /* * If we don't have snapshot or we are just fast-forwarding, there is no * point in decoding messages. From 5b81703787bfc1e6072c8e37125eba0c5598b807 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 8 Mar 2022 10:12:22 +0900 Subject: [PATCH 095/772] Simplify SRFs using materialize mode in contrib/ modules 9e98583 introduced a helper to centralize building their needed state (tuplestore, tuple descriptors, etc.), checking for any errors. This commit updates all places of contrib/ that can be switched to use SetSingleFuncCall() as a drop-in replacement, resulting in the removal of a lot of boilerplate code in all the modules updated by this commit. Per analysis, some places remain as they are: - pg_logdir_ls() in adminpack/ uses historically TYPEFUNC_RECORD as return type, and I suspect that changing it may cause issues at run-time with some of its past versions, down to 1.0. - dblink/ uses a wrapper function doing exactly the work of SetSingleFuncCall(). Here the switch should be possible, but rather invasive so it does not seem the extra backpatch maintenance cost. - tablefunc/, similarly, uses multiple helper functions with portions of SetSingleFuncCall() spread across the code paths of this module. Author: Melanie Plageman Discussion: https://postgr.es/m/CAAKRu_bvDPJoL9mH6eYwvBpPtTGQwbDzfJbCM-OjkSZDu5yTPg@mail.gmail.com --- contrib/amcheck/verify_heapam.c | 46 ++---------- contrib/dblink/dblink.c | 26 +------ contrib/pageinspect/brinfuncs.c | 31 +------- contrib/pageinspect/gistfuncs.c | 60 ++-------------- .../pg_stat_statements/pg_stat_statements.c | 33 +-------- contrib/pgrowlocks/pgrowlocks.c | 34 ++------- contrib/postgres_fdw/connection.c | 31 +------- contrib/xml2/xpath.c | 72 +++---------------- 8 files changed, 32 insertions(+), 301 deletions(-) diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c index f996f9a572..e5f7355dcb 100644 --- a/contrib/amcheck/verify_heapam.c +++ b/contrib/amcheck/verify_heapam.c @@ -165,7 +165,6 @@ static bool check_tuple_visibility(HeapCheckContext *ctx); static void report_corruption(HeapCheckContext *ctx, char *msg); static void report_toast_corruption(HeapCheckContext *ctx, ToastedAttribute *ta, char *msg); -static TupleDesc verify_heapam_tupdesc(void); static FullTransactionId FullTransactionIdFromXidAndCtx(TransactionId xid, const HeapCheckContext *ctx); static void update_cached_xid_range(HeapCheckContext *ctx); @@ -214,8 +213,6 @@ Datum verify_heapam(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - MemoryContext old_context; - bool random_access; HeapCheckContext ctx; Buffer vmbuffer = InvalidBuffer; Oid relid; @@ -227,16 +224,6 @@ verify_heapam(PG_FUNCTION_ARGS) BlockNumber nblocks; const char *skip; - /* Check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("materialize mode required, but it is not allowed in this context"))); - /* Check supplied arguments */ if (PG_ARGISNULL(0)) ereport(ERROR, @@ -290,15 +277,10 @@ verify_heapam(PG_FUNCTION_ARGS) */ ctx.attnum = -1; - /* The tupdesc and tuplestore must be created in ecxt_per_query_memory */ - old_context = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory); - random_access = (rsinfo->allowedModes & SFRM_Materialize_Random) != 0; - ctx.tupdesc = verify_heapam_tupdesc(); - ctx.tupstore = tuplestore_begin_heap(random_access, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = ctx.tupstore; - rsinfo->setDesc = ctx.tupdesc; - MemoryContextSwitchTo(old_context); + /* Construct the tuplestore and tuple descriptor */ + SetSingleFuncCall(fcinfo, 0); + ctx.tupdesc = rsinfo->setDesc; + ctx.tupstore = rsinfo->setResult; /* Open relation, check relkind and access method */ ctx.rel = relation_open(relid, AccessShareLock); @@ -630,26 +612,6 @@ report_toast_corruption(HeapCheckContext *ctx, ToastedAttribute *ta, ctx->is_corrupt = true; } -/* - * Construct the TupleDesc used to report messages about corruptions found - * while scanning the heap. - */ -static TupleDesc -verify_heapam_tupdesc(void) -{ - TupleDesc tupdesc; - AttrNumber a = 0; - - tupdesc = CreateTemplateTupleDesc(HEAPCHECK_RELATION_COLS); - TupleDescInitEntry(tupdesc, ++a, "blkno", INT8OID, -1, 0); - TupleDescInitEntry(tupdesc, ++a, "offnum", INT4OID, -1, 0); - TupleDescInitEntry(tupdesc, ++a, "attnum", INT4OID, -1, 0); - TupleDescInitEntry(tupdesc, ++a, "msg", TEXTOID, -1, 0); - Assert(a == HEAPCHECK_RELATION_COLS); - - return BlessTupleDesc(tupdesc); -} - /* * Check for tuple header corruption. * diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index efc4c94301..a06d4bd12d 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -1928,12 +1928,6 @@ dblink_get_notify(PG_FUNCTION_ARGS) PGconn *conn; PGnotify *notify; ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; - - prepTuplestoreResult(fcinfo); dblink_init(); if (PG_NARGS() == 1) @@ -1941,23 +1935,7 @@ dblink_get_notify(PG_FUNCTION_ARGS) else conn = pconn->conn; - /* create the tuplestore in per-query memory */ - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupdesc = CreateTemplateTupleDesc(DBLINK_NOTIFY_COLS); - TupleDescInitEntry(tupdesc, (AttrNumber) 1, "notify_name", - TEXTOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 2, "be_pid", - INT4OID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 3, "extra", - TEXTOID, -1, 0); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); PQconsumeInput(conn); while ((notify = PQnotifies(conn)) != NULL) @@ -1980,7 +1958,7 @@ dblink_get_notify(PG_FUNCTION_ARGS) else nulls[2] = true; - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); PQfreemem(notify); PQconsumeInput(conn); diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c index 683749a150..b7c8365218 100644 --- a/contrib/pageinspect/brinfuncs.c +++ b/contrib/pageinspect/brinfuncs.c @@ -126,9 +126,6 @@ brin_page_items(PG_FUNCTION_ARGS) bytea *raw_page = PG_GETARG_BYTEA_P(0); Oid indexRelid = PG_GETARG_OID(1); ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - MemoryContext oldcontext; - Tuplestorestate *tupstore; Relation indexRel; brin_column_state **columns; BrinDesc *bdesc; @@ -143,29 +140,7 @@ brin_page_items(PG_FUNCTION_ARGS) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to use raw page functions"))); - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - /* Build tuplestore to hold the result rows */ - oldcontext = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); indexRel = index_open(indexRelid, AccessShareLock); bdesc = brin_build_desc(indexRel); @@ -251,7 +226,7 @@ brin_page_items(PG_FUNCTION_ARGS) int att = attno - 1; values[0] = UInt16GetDatum(offset); - switch (TupleDescAttr(tupdesc, 1)->atttypid) + switch (TupleDescAttr(rsinfo->setDesc, 1)->atttypid) { case INT8OID: values[1] = Int64GetDatum((int64) dtup->bt_blkno); @@ -301,7 +276,7 @@ brin_page_items(PG_FUNCTION_ARGS) } } - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); /* * If the item was unused, jump straight to the next one; otherwise, diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c index 96e3cab1cc..10d6dd44d4 100644 --- a/contrib/pageinspect/gistfuncs.c +++ b/contrib/pageinspect/gistfuncs.c @@ -97,10 +97,6 @@ gist_page_items_bytea(PG_FUNCTION_ARGS) { bytea *raw_page = PG_GETARG_BYTEA_P(0); ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - bool randomAccess; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext oldcontext; Page page; OffsetNumber offset; OffsetNumber maxoff = InvalidOffsetNumber; @@ -110,29 +106,7 @@ gist_page_items_bytea(PG_FUNCTION_ARGS) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to use raw page functions"))); - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* The tupdesc and tuplestore must be created in ecxt_per_query_memory */ - oldcontext = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory); - - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - randomAccess = (rsinfo->allowedModes & SFRM_Materialize_Random) != 0; - tupstore = tuplestore_begin_heap(randomAccess, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); page = get_page_from_raw(raw_page); @@ -173,7 +147,7 @@ gist_page_items_bytea(PG_FUNCTION_ARGS) values[3] = BoolGetDatum(ItemIdIsDead(id)); values[4] = PointerGetDatum(tuple_bytea); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); } return (Datum) 0; @@ -185,11 +159,7 @@ gist_page_items(PG_FUNCTION_ARGS) bytea *raw_page = PG_GETARG_BYTEA_P(0); Oid indexRelid = PG_GETARG_OID(1); ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - bool randomAccess; Relation indexRel; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext oldcontext; Page page; OffsetNumber offset; OffsetNumber maxoff = InvalidOffsetNumber; @@ -199,29 +169,7 @@ gist_page_items(PG_FUNCTION_ARGS) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to use raw page functions"))); - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* The tupdesc and tuplestore must be created in ecxt_per_query_memory */ - oldcontext = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory); - - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - randomAccess = (rsinfo->allowedModes & SFRM_Materialize_Random) != 0; - tupstore = tuplestore_begin_heap(randomAccess, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); /* Open the relation */ indexRel = index_open(indexRelid, AccessShareLock); @@ -272,7 +220,7 @@ gist_page_items(PG_FUNCTION_ARGS) nulls[4] = true; } - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); } relation_close(indexRel, AccessShareLock); diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index d803253cea..9e525a6ad3 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -1494,10 +1494,6 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, bool showtext) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; Oid userid = GetUserId(); bool is_allowed_role = false; char *qbuffer = NULL; @@ -1516,30 +1512,14 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("pg_stat_statements must be loaded via shared_preload_libraries"))); - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Switch into long-lived context to construct returned data structures */ - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); + SetSingleFuncCall(fcinfo, 0); /* * Check we have the expected number of output arguments. Aside from * being a good safety check, we need a kluge here to detect API version * 1.1, which was wedged into the code in an ill-considered way. */ - switch (tupdesc->natts) + switch (rsinfo->setDesc->natts) { case PG_STAT_STATEMENTS_COLS_V1_0: if (api_version != PGSS_V1_0) @@ -1571,13 +1551,6 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, elog(ERROR, "incorrect number of output arguments"); } - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); - /* * We'd like to load the query text file (if needed) while not holding any * lock on pgss->lock. In the worst case we'll have to do this again @@ -1800,7 +1773,7 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, api_version == PGSS_V1_9 ? PG_STAT_STATEMENTS_COLS_V1_9 : -1 /* fail if you forget to update this assert */ )); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); } LWLockRelease(pgss->lock); diff --git a/contrib/pgrowlocks/pgrowlocks.c b/contrib/pgrowlocks/pgrowlocks.c index d8946dc510..713a165203 100644 --- a/contrib/pgrowlocks/pgrowlocks.c +++ b/contrib/pgrowlocks/pgrowlocks.c @@ -66,42 +66,16 @@ pgrowlocks(PG_FUNCTION_ARGS) { text *relname = PG_GETARG_TEXT_PP(0); ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - bool randomAccess; - TupleDesc tupdesc; - Tuplestorestate *tupstore; AttInMetadata *attinmeta; Relation rel; RangeVar *relrv; TableScanDesc scan; HeapScanDesc hscan; HeapTuple tuple; - MemoryContext oldcontext; AclResult aclresult; char **values; - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* The tupdesc and tuplestore must be created in ecxt_per_query_memory */ - oldcontext = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory); - - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - randomAccess = (rsinfo->allowedModes & SFRM_Materialize_Random) != 0; - tupstore = tuplestore_begin_heap(randomAccess, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); /* Access the table */ relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname)); @@ -140,9 +114,9 @@ pgrowlocks(PG_FUNCTION_ARGS) scan = table_beginscan(rel, GetActiveSnapshot(), 0, NULL); hscan = (HeapScanDesc) scan; - attinmeta = TupleDescGetAttInMetadata(tupdesc); + attinmeta = TupleDescGetAttInMetadata(rsinfo->setDesc); - values = (char **) palloc(tupdesc->natts * sizeof(char *)); + values = (char **) palloc(rsinfo->setDesc->natts * sizeof(char *)); while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL) { @@ -288,7 +262,7 @@ pgrowlocks(PG_FUNCTION_ARGS) /* build a tuple */ tuple = BuildTupleFromCStrings(attinmeta, values); - tuplestore_puttuple(tupstore, tuple); + tuplestore_puttuple(rsinfo->setResult, tuple); } else { diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c index 8c64d42dda..74d3e73205 100644 --- a/contrib/postgres_fdw/connection.c +++ b/contrib/postgres_fdw/connection.c @@ -1661,37 +1661,10 @@ postgres_fdw_get_connections(PG_FUNCTION_ARGS) { #define POSTGRES_FDW_GET_CONNECTIONS_COLS 2 ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - MemoryContext per_query_ctx; - MemoryContext oldcontext; HASH_SEQ_STATUS scan; ConnCacheEntry *entry; - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* Build a tuple descriptor for our result type */ - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - - /* Build tuplestore to hold the result rows */ - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - tupstore = tuplestore_begin_heap(true, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); + SetSingleFuncCall(fcinfo, 0); /* If cache doesn't exist, we return no records */ if (!ConnectionHash) @@ -1757,7 +1730,7 @@ postgres_fdw_get_connections(PG_FUNCTION_ARGS) values[1] = BoolGetDatum(!entry->invalidated); - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); } diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c index a2e5fb54e2..b8ee757674 100644 --- a/contrib/xml2/xpath.c +++ b/contrib/xml2/xpath.c @@ -491,15 +491,9 @@ xpath_table(PG_FUNCTION_ARGS) HeapTuple spi_tuple; TupleDesc spi_tupdesc; - /* Output tuple (tuplestore) support */ - Tuplestorestate *tupstore = NULL; - TupleDesc ret_tupdesc; - HeapTuple ret_tuple; ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; AttInMetadata *attinmeta; - MemoryContext per_query_ctx; - MemoryContext oldcontext; char **values; xmlChar **xpaths; @@ -517,48 +511,10 @@ xpath_table(PG_FUNCTION_ARGS) PgXmlErrorContext *xmlerrcxt; volatile xmlDocPtr doctree = NULL; - /* We only have a valid tuple description in table function mode */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (rsinfo->expectedDesc == NULL) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("xpath_table must be called as a table function"))); - - /* - * We want to materialise because it means that we don't have to carry - * libxml2 parser state between invocations of this function - */ - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("xpath_table requires Materialize mode, but it is not " - "allowed in this context"))); - - /* - * The tuplestore must exist in a higher context than this function call - * (per_query_ctx is used) - */ - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); - - /* - * Create the tuplestore - work_mem is the max in-memory size before a - * file is created on disk to hold it. - */ - tupstore = - tuplestore_begin_heap(rsinfo->allowedModes & SFRM_Materialize_Random, - false, work_mem); - - MemoryContextSwitchTo(oldcontext); - - /* get the requested return tuple description */ - ret_tupdesc = CreateTupleDescCopy(rsinfo->expectedDesc); + SetSingleFuncCall(fcinfo, SRF_SINGLE_USE_EXPECTED); /* must have at least one output column (for the pkey) */ - if (ret_tupdesc->natts < 1) + if (rsinfo->setDesc->natts < 1) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("xpath_table must have at least one output column"))); @@ -571,14 +527,10 @@ xpath_table(PG_FUNCTION_ARGS) * representation. */ - attinmeta = TupleDescGetAttInMetadata(ret_tupdesc); - - /* Set return mode and allocate value space. */ - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setDesc = ret_tupdesc; + attinmeta = TupleDescGetAttInMetadata(rsinfo->setDesc); - values = (char **) palloc(ret_tupdesc->natts * sizeof(char *)); - xpaths = (xmlChar **) palloc(ret_tupdesc->natts * sizeof(xmlChar *)); + values = (char **) palloc(rsinfo->setDesc->natts * sizeof(char *)); + xpaths = (xmlChar **) palloc(rsinfo->setDesc->natts * sizeof(xmlChar *)); /* * Split XPaths. xpathset is a writable CString. @@ -587,7 +539,7 @@ xpath_table(PG_FUNCTION_ARGS) */ numpaths = 0; pos = xpathset; - while (numpaths < (ret_tupdesc->natts - 1)) + while (numpaths < (rsinfo->setDesc->natts - 1)) { xpaths[numpaths++] = (xmlChar *) pos; pos = strstr(pos, pathsep); @@ -621,9 +573,6 @@ xpath_table(PG_FUNCTION_ARGS) tuptable = SPI_tuptable; spi_tupdesc = tuptable->tupdesc; - /* Switch out of SPI context */ - MemoryContextSwitchTo(oldcontext); - /* * Check that SPI returned correct result. If you put a comma into one of * the function parameters, this will catch it when the SPI query returns @@ -655,6 +604,7 @@ xpath_table(PG_FUNCTION_ARGS) xmlXPathObjectPtr res; xmlChar *resstr; xmlXPathCompExprPtr comppath; + HeapTuple ret_tuple; /* Extract the row data as C Strings */ spi_tuple = tuptable->vals[i]; @@ -666,7 +616,7 @@ xpath_table(PG_FUNCTION_ARGS) * return NULL in all columns. Note that this also means that * spare columns will be NULL. */ - for (j = 0; j < ret_tupdesc->natts; j++) + for (j = 0; j < rsinfo->setDesc->natts; j++) values[j] = NULL; /* Insert primary key */ @@ -682,7 +632,7 @@ xpath_table(PG_FUNCTION_ARGS) { /* not well-formed, so output all-NULL tuple */ ret_tuple = BuildTupleFromCStrings(attinmeta, values); - tuplestore_puttuple(tupstore, ret_tuple); + tuplestore_puttuple(rsinfo->setResult, ret_tuple); heap_freetuple(ret_tuple); } else @@ -749,7 +699,7 @@ xpath_table(PG_FUNCTION_ARGS) if (had_values) { ret_tuple = BuildTupleFromCStrings(attinmeta, values); - tuplestore_puttuple(tupstore, ret_tuple); + tuplestore_puttuple(rsinfo->setResult, ret_tuple); heap_freetuple(ret_tuple); } @@ -785,8 +735,6 @@ xpath_table(PG_FUNCTION_ARGS) SPI_finish(); - rsinfo->setResult = tupstore; - /* * SFRM_Materialize mode expects us to return a NULL Datum. The actual * tuples are in our tuplestore and passed back through rsinfo->setResult. From 76a29adee749f41e277459cbf2e47a2ff7777f31 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 7 Mar 2022 18:19:56 -0800 Subject: [PATCH 096/772] plpython: Remove plpythonu, plpython2u and associated transform extensions. Since 19252e8ec93 we reject Python 2 during build configuration. Now that the dust on the buildfarm has settled, remove extension variants specific to Python 2. Reviewed-By: Peter Eisentraut Reviewed-By: Tom Lane Discussion: https://postgr.es/m/20211031184548.g4sxfe47n2kyi55r@alap3.anarazel.de --- contrib/hstore_plpython/Makefile | 4 ++-- .../hstore_plpython2u--1.0.sql | 19 ------------------- .../hstore_plpython/hstore_plpython2u.control | 6 ------ .../hstore_plpython/hstore_plpythonu--1.0.sql | 19 ------------------- .../hstore_plpython/hstore_plpythonu.control | 6 ------ contrib/jsonb_plpython/Makefile | 6 +++--- .../jsonb_plpython/jsonb_plpython2u--1.0.sql | 19 ------------------- .../jsonb_plpython/jsonb_plpython2u.control | 6 ------ .../jsonb_plpython/jsonb_plpythonu--1.0.sql | 19 ------------------- .../jsonb_plpython/jsonb_plpythonu.control | 6 ------ contrib/ltree_plpython/Makefile | 4 ++-- .../ltree_plpython/ltree_plpython2u--1.0.sql | 12 ------------ .../ltree_plpython/ltree_plpython2u.control | 6 ------ .../ltree_plpython/ltree_plpythonu--1.0.sql | 12 ------------ .../ltree_plpython/ltree_plpythonu.control | 6 ------ src/pl/plpython/plpython2u--1.0.sql | 17 ----------------- src/pl/plpython/plpython2u.control | 7 ------- src/pl/plpython/plpythonu--1.0.sql | 17 ----------------- src/pl/plpython/plpythonu.control | 7 ------- 19 files changed, 7 insertions(+), 191 deletions(-) delete mode 100644 contrib/hstore_plpython/hstore_plpython2u--1.0.sql delete mode 100644 contrib/hstore_plpython/hstore_plpython2u.control delete mode 100644 contrib/hstore_plpython/hstore_plpythonu--1.0.sql delete mode 100644 contrib/hstore_plpython/hstore_plpythonu.control delete mode 100644 contrib/jsonb_plpython/jsonb_plpython2u--1.0.sql delete mode 100644 contrib/jsonb_plpython/jsonb_plpython2u.control delete mode 100644 contrib/jsonb_plpython/jsonb_plpythonu--1.0.sql delete mode 100644 contrib/jsonb_plpython/jsonb_plpythonu.control delete mode 100644 contrib/ltree_plpython/ltree_plpython2u--1.0.sql delete mode 100644 contrib/ltree_plpython/ltree_plpython2u.control delete mode 100644 contrib/ltree_plpython/ltree_plpythonu--1.0.sql delete mode 100644 contrib/ltree_plpython/ltree_plpythonu.control delete mode 100644 src/pl/plpython/plpython2u--1.0.sql delete mode 100644 src/pl/plpython/plpython2u.control delete mode 100644 src/pl/plpython/plpythonu--1.0.sql delete mode 100644 src/pl/plpython/plpythonu.control diff --git a/contrib/hstore_plpython/Makefile b/contrib/hstore_plpython/Makefile index 6af097ae68..19d99a8045 100644 --- a/contrib/hstore_plpython/Makefile +++ b/contrib/hstore_plpython/Makefile @@ -6,8 +6,8 @@ OBJS = \ hstore_plpython.o PGFILEDESC = "hstore_plpython - hstore transform for plpython" -EXTENSION = hstore_plpythonu hstore_plpython2u hstore_plpython3u -DATA = hstore_plpythonu--1.0.sql hstore_plpython2u--1.0.sql hstore_plpython3u--1.0.sql +EXTENSION = hstore_plpython3u +DATA = hstore_plpython3u--1.0.sql REGRESS = hstore_plpython REGRESS_PLPYTHON3_MANGLE := $(REGRESS) diff --git a/contrib/hstore_plpython/hstore_plpython2u--1.0.sql b/contrib/hstore_plpython/hstore_plpython2u--1.0.sql deleted file mode 100644 index 800765f3f0..0000000000 --- a/contrib/hstore_plpython/hstore_plpython2u--1.0.sql +++ /dev/null @@ -1,19 +0,0 @@ -/* contrib/hstore_plpython/hstore_plpython2u--1.0.sql */ - --- complain if script is sourced in psql, rather than via CREATE EXTENSION -\echo Use "CREATE EXTENSION hstore_plpython2u" to load this file. \quit - -CREATE FUNCTION hstore_to_plpython2(val internal) RETURNS internal -LANGUAGE C STRICT IMMUTABLE -AS 'MODULE_PATHNAME', 'hstore_to_plpython'; - -CREATE FUNCTION plpython2_to_hstore(val internal) RETURNS hstore -LANGUAGE C STRICT IMMUTABLE -AS 'MODULE_PATHNAME', 'plpython_to_hstore'; - -CREATE TRANSFORM FOR hstore LANGUAGE plpython2u ( - FROM SQL WITH FUNCTION hstore_to_plpython2(internal), - TO SQL WITH FUNCTION plpython2_to_hstore(internal) -); - -COMMENT ON TRANSFORM FOR hstore LANGUAGE plpython2u IS 'transform between hstore and Python dict'; diff --git a/contrib/hstore_plpython/hstore_plpython2u.control b/contrib/hstore_plpython/hstore_plpython2u.control deleted file mode 100644 index ed90567112..0000000000 --- a/contrib/hstore_plpython/hstore_plpython2u.control +++ /dev/null @@ -1,6 +0,0 @@ -# hstore_plpython2u extension -comment = 'transform between hstore and plpython2u' -default_version = '1.0' -module_pathname = '$libdir/hstore_plpython2' -relocatable = true -requires = 'hstore,plpython2u' diff --git a/contrib/hstore_plpython/hstore_plpythonu--1.0.sql b/contrib/hstore_plpython/hstore_plpythonu--1.0.sql deleted file mode 100644 index 52832912ab..0000000000 --- a/contrib/hstore_plpython/hstore_plpythonu--1.0.sql +++ /dev/null @@ -1,19 +0,0 @@ -/* contrib/hstore_plpython/hstore_plpythonu--1.0.sql */ - --- complain if script is sourced in psql, rather than via CREATE EXTENSION -\echo Use "CREATE EXTENSION hstore_plpythonu" to load this file. \quit - -CREATE FUNCTION hstore_to_plpython(val internal) RETURNS internal -LANGUAGE C STRICT IMMUTABLE -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION plpython_to_hstore(val internal) RETURNS hstore -LANGUAGE C STRICT IMMUTABLE -AS 'MODULE_PATHNAME'; - -CREATE TRANSFORM FOR hstore LANGUAGE plpythonu ( - FROM SQL WITH FUNCTION hstore_to_plpython(internal), - TO SQL WITH FUNCTION plpython_to_hstore(internal) -); - -COMMENT ON TRANSFORM FOR hstore LANGUAGE plpythonu IS 'transform between hstore and Python dict'; diff --git a/contrib/hstore_plpython/hstore_plpythonu.control b/contrib/hstore_plpython/hstore_plpythonu.control deleted file mode 100644 index 8e9b35e43b..0000000000 --- a/contrib/hstore_plpython/hstore_plpythonu.control +++ /dev/null @@ -1,6 +0,0 @@ -# hstore_plpythonu extension -comment = 'transform between hstore and plpythonu' -default_version = '1.0' -module_pathname = '$libdir/hstore_plpython2' -relocatable = true -requires = 'hstore,plpythonu' diff --git a/contrib/jsonb_plpython/Makefile b/contrib/jsonb_plpython/Makefile index ca76741894..eaab5ca260 100644 --- a/contrib/jsonb_plpython/Makefile +++ b/contrib/jsonb_plpython/Makefile @@ -4,12 +4,12 @@ MODULE_big = jsonb_plpython$(python_majorversion) OBJS = \ $(WIN32RES) \ jsonb_plpython.o -PGFILEDESC = "jsonb_plpython - transform between jsonb and plpythonu" +PGFILEDESC = "jsonb_plpython - jsonb transform for plpython" PG_CPPFLAGS = -I$(top_srcdir)/src/pl/plpython $(python_includespec) -DPLPYTHON_LIBNAME='"plpython$(python_majorversion)"' -EXTENSION = jsonb_plpythonu jsonb_plpython2u jsonb_plpython3u -DATA = jsonb_plpythonu--1.0.sql jsonb_plpython2u--1.0.sql jsonb_plpython3u--1.0.sql +EXTENSION = jsonb_plpython3u +DATA = jsonb_plpython3u--1.0.sql REGRESS = jsonb_plpython REGRESS_PLPYTHON3_MANGLE := $(REGRESS) diff --git a/contrib/jsonb_plpython/jsonb_plpython2u--1.0.sql b/contrib/jsonb_plpython/jsonb_plpython2u--1.0.sql deleted file mode 100644 index 2526d14ee1..0000000000 --- a/contrib/jsonb_plpython/jsonb_plpython2u--1.0.sql +++ /dev/null @@ -1,19 +0,0 @@ -/* contrib/jsonb_plpython/jsonb_plpython2u--1.0.sql */ - --- complain if script is sourced in psql, rather than via CREATE EXTENSION -\echo Use "CREATE EXTENSION jsonb_plpython2u" to load this file. \quit - -CREATE FUNCTION jsonb_to_plpython2(val internal) RETURNS internal -LANGUAGE C STRICT IMMUTABLE -AS 'MODULE_PATHNAME', 'jsonb_to_plpython'; - -CREATE FUNCTION plpython2_to_jsonb(val internal) RETURNS jsonb -LANGUAGE C STRICT IMMUTABLE -AS 'MODULE_PATHNAME', 'plpython_to_jsonb'; - -CREATE TRANSFORM FOR jsonb LANGUAGE plpython2u ( - FROM SQL WITH FUNCTION jsonb_to_plpython2(internal), - TO SQL WITH FUNCTION plpython2_to_jsonb(internal) -); - -COMMENT ON TRANSFORM FOR jsonb LANGUAGE plpython2u IS 'transform between jsonb and Python'; diff --git a/contrib/jsonb_plpython/jsonb_plpython2u.control b/contrib/jsonb_plpython/jsonb_plpython2u.control deleted file mode 100644 index d26368316b..0000000000 --- a/contrib/jsonb_plpython/jsonb_plpython2u.control +++ /dev/null @@ -1,6 +0,0 @@ -# jsonb_plpython2u extension -comment = 'transform between jsonb and plpython2u' -default_version = '1.0' -module_pathname = '$libdir/jsonb_plpython2' -relocatable = true -requires = 'plpython2u' diff --git a/contrib/jsonb_plpython/jsonb_plpythonu--1.0.sql b/contrib/jsonb_plpython/jsonb_plpythonu--1.0.sql deleted file mode 100644 index 3fa89885a6..0000000000 --- a/contrib/jsonb_plpython/jsonb_plpythonu--1.0.sql +++ /dev/null @@ -1,19 +0,0 @@ -/* contrib/jsonb_plpython/jsonb_plpythonu--1.0.sql */ - --- complain if script is sourced in psql, rather than via CREATE EXTENSION -\echo Use "CREATE EXTENSION jsonb_plpythonu" to load this file. \quit - -CREATE FUNCTION jsonb_to_plpython(val internal) RETURNS internal -LANGUAGE C STRICT IMMUTABLE -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION plpython_to_jsonb(val internal) RETURNS jsonb -LANGUAGE C STRICT IMMUTABLE -AS 'MODULE_PATHNAME'; - -CREATE TRANSFORM FOR jsonb LANGUAGE plpythonu ( - FROM SQL WITH FUNCTION jsonb_to_plpython(internal), - TO SQL WITH FUNCTION plpython_to_jsonb(internal) -); - -COMMENT ON TRANSFORM FOR jsonb LANGUAGE plpythonu IS 'transform between jsonb and Python'; diff --git a/contrib/jsonb_plpython/jsonb_plpythonu.control b/contrib/jsonb_plpython/jsonb_plpythonu.control deleted file mode 100644 index 6f8fa4f184..0000000000 --- a/contrib/jsonb_plpython/jsonb_plpythonu.control +++ /dev/null @@ -1,6 +0,0 @@ -# jsonb_plpythonu extension -comment = 'transform between jsonb and plpythonu' -default_version = '1.0' -module_pathname = '$libdir/jsonb_plpython2' -relocatable = true -requires = 'plpythonu' diff --git a/contrib/ltree_plpython/Makefile b/contrib/ltree_plpython/Makefile index 12a0146772..0bccb111e6 100644 --- a/contrib/ltree_plpython/Makefile +++ b/contrib/ltree_plpython/Makefile @@ -6,8 +6,8 @@ OBJS = \ ltree_plpython.o PGFILEDESC = "ltree_plpython - ltree transform for plpython" -EXTENSION = ltree_plpythonu ltree_plpython2u ltree_plpython3u -DATA = ltree_plpythonu--1.0.sql ltree_plpython2u--1.0.sql ltree_plpython3u--1.0.sql +EXTENSION = ltree_plpython3u +DATA = ltree_plpython3u--1.0.sql REGRESS = ltree_plpython REGRESS_PLPYTHON3_MANGLE := $(REGRESS) diff --git a/contrib/ltree_plpython/ltree_plpython2u--1.0.sql b/contrib/ltree_plpython/ltree_plpython2u--1.0.sql deleted file mode 100644 index 5c4a703701..0000000000 --- a/contrib/ltree_plpython/ltree_plpython2u--1.0.sql +++ /dev/null @@ -1,12 +0,0 @@ -/* contrib/ltree_plpython/ltree_plpython2u--1.0.sql */ - --- complain if script is sourced in psql, rather than via CREATE EXTENSION -\echo Use "CREATE EXTENSION ltree_plpython2u" to load this file. \quit - -CREATE FUNCTION ltree_to_plpython2(val internal) RETURNS internal -LANGUAGE C STRICT IMMUTABLE -AS 'MODULE_PATHNAME', 'ltree_to_plpython'; - -CREATE TRANSFORM FOR ltree LANGUAGE plpython2u ( - FROM SQL WITH FUNCTION ltree_to_plpython2(internal) -); diff --git a/contrib/ltree_plpython/ltree_plpython2u.control b/contrib/ltree_plpython/ltree_plpython2u.control deleted file mode 100644 index bedfd0acba..0000000000 --- a/contrib/ltree_plpython/ltree_plpython2u.control +++ /dev/null @@ -1,6 +0,0 @@ -# ltree_plpython2u extension -comment = 'transform between ltree and plpython2u' -default_version = '1.0' -module_pathname = '$libdir/ltree_plpython2' -relocatable = true -requires = 'ltree,plpython2u' diff --git a/contrib/ltree_plpython/ltree_plpythonu--1.0.sql b/contrib/ltree_plpython/ltree_plpythonu--1.0.sql deleted file mode 100644 index ee93edf28b..0000000000 --- a/contrib/ltree_plpython/ltree_plpythonu--1.0.sql +++ /dev/null @@ -1,12 +0,0 @@ -/* contrib/ltree_plpython/ltree_plpythonu--1.0.sql */ - --- complain if script is sourced in psql, rather than via CREATE EXTENSION -\echo Use "CREATE EXTENSION ltree_plpythonu" to load this file. \quit - -CREATE FUNCTION ltree_to_plpython(val internal) RETURNS internal -LANGUAGE C STRICT IMMUTABLE -AS 'MODULE_PATHNAME'; - -CREATE TRANSFORM FOR ltree LANGUAGE plpythonu ( - FROM SQL WITH FUNCTION ltree_to_plpython(internal) -); diff --git a/contrib/ltree_plpython/ltree_plpythonu.control b/contrib/ltree_plpython/ltree_plpythonu.control deleted file mode 100644 index b03c89a2e6..0000000000 --- a/contrib/ltree_plpython/ltree_plpythonu.control +++ /dev/null @@ -1,6 +0,0 @@ -# ltree_plpythonu extension -comment = 'transform between ltree and plpythonu' -default_version = '1.0' -module_pathname = '$libdir/ltree_plpython2' -relocatable = true -requires = 'ltree,plpythonu' diff --git a/src/pl/plpython/plpython2u--1.0.sql b/src/pl/plpython/plpython2u--1.0.sql deleted file mode 100644 index 69f7477567..0000000000 --- a/src/pl/plpython/plpython2u--1.0.sql +++ /dev/null @@ -1,17 +0,0 @@ -/* src/pl/plpython/plpython2u--1.0.sql */ - -CREATE FUNCTION plpython2_call_handler() RETURNS language_handler - LANGUAGE c AS 'MODULE_PATHNAME'; - -CREATE FUNCTION plpython2_inline_handler(internal) RETURNS void - STRICT LANGUAGE c AS 'MODULE_PATHNAME'; - -CREATE FUNCTION plpython2_validator(oid) RETURNS void - STRICT LANGUAGE c AS 'MODULE_PATHNAME'; - -CREATE LANGUAGE plpython2u - HANDLER plpython2_call_handler - INLINE plpython2_inline_handler - VALIDATOR plpython2_validator; - -COMMENT ON LANGUAGE plpython2u IS 'PL/Python2U untrusted procedural language'; diff --git a/src/pl/plpython/plpython2u.control b/src/pl/plpython/plpython2u.control deleted file mode 100644 index 39c2b791ef..0000000000 --- a/src/pl/plpython/plpython2u.control +++ /dev/null @@ -1,7 +0,0 @@ -# plpython2u extension -comment = 'PL/Python2U untrusted procedural language' -default_version = '1.0' -module_pathname = '$libdir/plpython2' -relocatable = false -schema = pg_catalog -superuser = true diff --git a/src/pl/plpython/plpythonu--1.0.sql b/src/pl/plpython/plpythonu--1.0.sql deleted file mode 100644 index 4c6f7c3f14..0000000000 --- a/src/pl/plpython/plpythonu--1.0.sql +++ /dev/null @@ -1,17 +0,0 @@ -/* src/pl/plpython/plpythonu--1.0.sql */ - -CREATE FUNCTION plpython_call_handler() RETURNS language_handler - LANGUAGE c AS 'MODULE_PATHNAME'; - -CREATE FUNCTION plpython_inline_handler(internal) RETURNS void - STRICT LANGUAGE c AS 'MODULE_PATHNAME'; - -CREATE FUNCTION plpython_validator(oid) RETURNS void - STRICT LANGUAGE c AS 'MODULE_PATHNAME'; - -CREATE LANGUAGE plpythonu - HANDLER plpython_call_handler - INLINE plpython_inline_handler - VALIDATOR plpython_validator; - -COMMENT ON LANGUAGE plpythonu IS 'PL/PythonU untrusted procedural language'; diff --git a/src/pl/plpython/plpythonu.control b/src/pl/plpython/plpythonu.control deleted file mode 100644 index ae91b1c255..0000000000 --- a/src/pl/plpython/plpythonu.control +++ /dev/null @@ -1,7 +0,0 @@ -# plpythonu extension -comment = 'PL/PythonU untrusted procedural language' -default_version = '1.0' -module_pathname = '$libdir/plpython2' -relocatable = false -schema = pg_catalog -superuser = true From db23464715f4792298c639153dda7bfd9ad9d602 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 7 Mar 2022 18:19:56 -0800 Subject: [PATCH 097/772] plpython: Remove regression test infrastructure for Python 2. Since 19252e8ec93 we reject Python 2 during build configuration. Now that the dust on the buildfarm has settled, remove regression testing infrastructure dealing with differing output between Python 2 / 3. Reviewed-By: Peter Eisentraut Reviewed-By: Tom Lane Discussion: https://postgr.es/m/20211031184548.g4sxfe47n2kyi55r@alap3.anarazel.de --- contrib/hstore_plpython/.gitignore | 2 - contrib/hstore_plpython/Makefile | 6 - .../expected/hstore_plpython.out | 22 +- .../hstore_plpython/sql/hstore_plpython.sql | 18 +- contrib/jsonb_plpython/.gitignore | 2 - contrib/jsonb_plpython/Makefile | 7 - .../expected/jsonb_plpython.out | 32 +- contrib/jsonb_plpython/sql/jsonb_plpython.sql | 30 +- contrib/ltree_plpython/.gitignore | 2 - contrib/ltree_plpython/Makefile | 6 - .../expected/ltree_plpython.out | 10 +- contrib/ltree_plpython/sql/ltree_plpython.sql | 8 +- src/pl/plpython/.gitignore | 2 - src/pl/plpython/Makefile | 14 - src/pl/plpython/expected/plpython_call.out | 12 +- .../plpython/expected/plpython_composite.out | 32 +- src/pl/plpython/expected/plpython_do.out | 8 +- src/pl/plpython/expected/plpython_drop.out | 3 +- src/pl/plpython/expected/plpython_ereport.out | 37 +- src/pl/plpython/expected/plpython_error.out | 52 +- src/pl/plpython/expected/plpython_error_5.out | 447 -------- src/pl/plpython/expected/plpython_global.out | 6 +- src/pl/plpython/expected/plpython_import.out | 8 +- src/pl/plpython/expected/plpython_newline.out | 6 +- src/pl/plpython/expected/plpython_params.out | 8 +- src/pl/plpython/expected/plpython_quote.out | 2 +- src/pl/plpython/expected/plpython_record.out | 18 +- src/pl/plpython/expected/plpython_setof.out | 18 +- src/pl/plpython/expected/plpython_spi.out | 50 +- .../expected/plpython_subtransaction.out | 38 +- src/pl/plpython/expected/plpython_test.out | 12 +- .../expected/plpython_transaction.out | 28 +- src/pl/plpython/expected/plpython_trigger.out | 46 +- src/pl/plpython/expected/plpython_types.out | 230 ++-- src/pl/plpython/expected/plpython_types_3.out | 1009 ----------------- src/pl/plpython/expected/plpython_unicode.out | 16 +- src/pl/plpython/expected/plpython_void.out | 6 +- src/pl/plpython/regress-python3-mangle.mk | 38 - src/pl/plpython/sql/plpython_call.sql | 12 +- src/pl/plpython/sql/plpython_composite.sql | 32 +- src/pl/plpython/sql/plpython_do.sql | 6 +- src/pl/plpython/sql/plpython_drop.sql | 4 +- src/pl/plpython/sql/plpython_ereport.sql | 26 +- src/pl/plpython/sql/plpython_error.sql | 48 +- src/pl/plpython/sql/plpython_global.sql | 6 +- src/pl/plpython/sql/plpython_import.sql | 8 +- src/pl/plpython/sql/plpython_newline.sql | 6 +- src/pl/plpython/sql/plpython_params.sql | 8 +- src/pl/plpython/sql/plpython_quote.sql | 2 +- src/pl/plpython/sql/plpython_record.sql | 18 +- src/pl/plpython/sql/plpython_setof.sql | 18 +- src/pl/plpython/sql/plpython_spi.sql | 50 +- .../plpython/sql/plpython_subtransaction.sql | 38 +- src/pl/plpython/sql/plpython_test.sql | 12 +- src/pl/plpython/sql/plpython_transaction.sql | 26 +- src/pl/plpython/sql/plpython_trigger.sql | 46 +- src/pl/plpython/sql/plpython_types.sql | 106 +- src/pl/plpython/sql/plpython_unicode.sql | 16 +- src/pl/plpython/sql/plpython_void.sql | 6 +- src/tools/msvc/vcregress.pl | 76 +- 60 files changed, 625 insertions(+), 2236 deletions(-) delete mode 100644 src/pl/plpython/expected/plpython_error_5.out delete mode 100644 src/pl/plpython/expected/plpython_types_3.out delete mode 100644 src/pl/plpython/regress-python3-mangle.mk diff --git a/contrib/hstore_plpython/.gitignore b/contrib/hstore_plpython/.gitignore index ce6fab94a0..5dcb3ff972 100644 --- a/contrib/hstore_plpython/.gitignore +++ b/contrib/hstore_plpython/.gitignore @@ -1,6 +1,4 @@ # Generated subdirectories -/expected/python3/ /log/ /results/ -/sql/python3/ /tmp_check/ diff --git a/contrib/hstore_plpython/Makefile b/contrib/hstore_plpython/Makefile index 19d99a8045..9d88cda1d0 100644 --- a/contrib/hstore_plpython/Makefile +++ b/contrib/hstore_plpython/Makefile @@ -10,7 +10,6 @@ EXTENSION = hstore_plpython3u DATA = hstore_plpython3u--1.0.sql REGRESS = hstore_plpython -REGRESS_PLPYTHON3_MANGLE := $(REGRESS) PG_CPPFLAGS = $(python_includespec) -DPLPYTHON_LIBNAME='"plpython$(python_majorversion)"' @@ -37,9 +36,4 @@ SHLIB_LINK += $(python_libspec) $(python_additional_libs) endif REGRESS_OPTS += --load-extension=hstore -ifeq ($(python_majorversion),2) -REGRESS_OPTS += --load-extension=plpythonu --load-extension=hstore_plpythonu -endif EXTRA_INSTALL += contrib/hstore - -include $(top_srcdir)/src/pl/plpython/regress-python3-mangle.mk diff --git a/contrib/hstore_plpython/expected/hstore_plpython.out b/contrib/hstore_plpython/expected/hstore_plpython.out index ecf1dd61bc..bf238701fe 100644 --- a/contrib/hstore_plpython/expected/hstore_plpython.out +++ b/contrib/hstore_plpython/expected/hstore_plpython.out @@ -1,8 +1,8 @@ -CREATE EXTENSION hstore_plpython2u CASCADE; -NOTICE: installing required extension "plpython2u" +CREATE EXTENSION hstore_plpython3u CASCADE; +NOTICE: installing required extension "plpython3u" -- test hstore -> python CREATE FUNCTION test1(val hstore) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ assert isinstance(val, dict) @@ -18,7 +18,7 @@ INFO: [('aa', 'bb'), ('cc', None)] -- the same with the versioned language name CREATE FUNCTION test1n(val hstore) RETURNS int -LANGUAGE plpython2u +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ assert isinstance(val, dict) @@ -34,7 +34,7 @@ INFO: [('aa', 'bb'), ('cc', None)] -- test hstore[] -> python CREATE FUNCTION test1arr(val hstore[]) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ assert(val == [{'aa': 'bb', 'cc': None}, {'dd': 'ee'}]) @@ -48,7 +48,7 @@ SELECT test1arr(array['aa=>bb, cc=>NULL'::hstore, 'dd=>ee']); -- test python -> hstore CREATE FUNCTION test2(a int, b text) RETURNS hstore -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ val = {'a': a, 'b': b, 'c': None} @@ -65,14 +65,14 @@ SELECT test2(1, 'boo'); CREATE OR REPLACE FUNCTION public.test2(a integer, b text) RETURNS hstore TRANSFORM FOR TYPE hstore - LANGUAGE plpythonu + LANGUAGE plpython3u AS $function$ val = {'a': a, 'b': b, 'c': None} return val $function$ -- test python -> hstore[] CREATE FUNCTION test2arr() RETURNS hstore[] -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ val = [{'a': 1, 'b': 'boo', 'c': None}, {'d': 2}] @@ -87,7 +87,7 @@ SELECT test2arr(); -- test python -> domain over hstore CREATE DOMAIN hstore_foo AS hstore CHECK(VALUE ? 'foo'); CREATE FUNCTION test2dom(fn text) RETURNS hstore_foo -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ return {'a': 1, fn: 'boo', 'c': None} @@ -104,7 +104,7 @@ CONTEXT: while creating return value PL/Python function "test2dom" -- test as part of prepare/execute CREATE FUNCTION test3() RETURNS void -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ rv = plpy.execute("SELECT 'aa=>bb, cc=>NULL'::hstore AS col1") @@ -131,7 +131,7 @@ SELECT * FROM test1; (1 row) CREATE FUNCTION test4() RETURNS trigger -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ assert(TD["new"] == {'a': 1, 'b': {'aa': 'bb', 'cc': None}}) diff --git a/contrib/hstore_plpython/sql/hstore_plpython.sql b/contrib/hstore_plpython/sql/hstore_plpython.sql index b6d98b7dd5..a9cfbbe13e 100644 --- a/contrib/hstore_plpython/sql/hstore_plpython.sql +++ b/contrib/hstore_plpython/sql/hstore_plpython.sql @@ -1,9 +1,9 @@ -CREATE EXTENSION hstore_plpython2u CASCADE; +CREATE EXTENSION hstore_plpython3u CASCADE; -- test hstore -> python CREATE FUNCTION test1(val hstore) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ assert isinstance(val, dict) @@ -16,7 +16,7 @@ SELECT test1('aa=>bb, cc=>NULL'::hstore); -- the same with the versioned language name CREATE FUNCTION test1n(val hstore) RETURNS int -LANGUAGE plpython2u +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ assert isinstance(val, dict) @@ -29,7 +29,7 @@ SELECT test1n('aa=>bb, cc=>NULL'::hstore); -- test hstore[] -> python CREATE FUNCTION test1arr(val hstore[]) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ assert(val == [{'aa': 'bb', 'cc': None}, {'dd': 'ee'}]) @@ -41,7 +41,7 @@ SELECT test1arr(array['aa=>bb, cc=>NULL'::hstore, 'dd=>ee']); -- test python -> hstore CREATE FUNCTION test2(a int, b text) RETURNS hstore -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ val = {'a': a, 'b': b, 'c': None} @@ -56,7 +56,7 @@ SELECT test2(1, 'boo'); -- test python -> hstore[] CREATE FUNCTION test2arr() RETURNS hstore[] -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ val = [{'a': 1, 'b': 'boo', 'c': None}, {'d': 2}] @@ -70,7 +70,7 @@ SELECT test2arr(); CREATE DOMAIN hstore_foo AS hstore CHECK(VALUE ? 'foo'); CREATE FUNCTION test2dom(fn text) RETURNS hstore_foo -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ return {'a': 1, fn: 'boo', 'c': None} @@ -82,7 +82,7 @@ SELECT test2dom('bar'); -- fail -- test as part of prepare/execute CREATE FUNCTION test3() RETURNS void -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ rv = plpy.execute("SELECT 'aa=>bb, cc=>NULL'::hstore AS col1") @@ -103,7 +103,7 @@ INSERT INTO test1 VALUES (1, 'aa=>bb, cc=>NULL'); SELECT * FROM test1; CREATE FUNCTION test4() RETURNS trigger -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE hstore AS $$ assert(TD["new"] == {'a': 1, 'b': {'aa': 'bb', 'cc': None}}) diff --git a/contrib/jsonb_plpython/.gitignore b/contrib/jsonb_plpython/.gitignore index ce6fab94a0..5dcb3ff972 100644 --- a/contrib/jsonb_plpython/.gitignore +++ b/contrib/jsonb_plpython/.gitignore @@ -1,6 +1,4 @@ # Generated subdirectories -/expected/python3/ /log/ /results/ -/sql/python3/ /tmp_check/ diff --git a/contrib/jsonb_plpython/Makefile b/contrib/jsonb_plpython/Makefile index eaab5ca260..fea7bdfc00 100644 --- a/contrib/jsonb_plpython/Makefile +++ b/contrib/jsonb_plpython/Makefile @@ -12,7 +12,6 @@ EXTENSION = jsonb_plpython3u DATA = jsonb_plpython3u--1.0.sql REGRESS = jsonb_plpython -REGRESS_PLPYTHON3_MANGLE := $(REGRESS) ifdef USE_PGXS PG_CONFIG = pg_config @@ -33,9 +32,3 @@ else rpathdir = $(python_libdir) SHLIB_LINK += $(python_libspec) $(python_additional_libs) endif - -ifeq ($(python_majorversion),2) -REGRESS_OPTS += --load-extension=plpythonu --load-extension=jsonb_plpythonu -endif - -include $(top_srcdir)/src/pl/plpython/regress-python3-mangle.mk diff --git a/contrib/jsonb_plpython/expected/jsonb_plpython.out b/contrib/jsonb_plpython/expected/jsonb_plpython.out index b491fe9cc6..cac963de69 100644 --- a/contrib/jsonb_plpython/expected/jsonb_plpython.out +++ b/contrib/jsonb_plpython/expected/jsonb_plpython.out @@ -1,8 +1,8 @@ -CREATE EXTENSION jsonb_plpython2u CASCADE; -NOTICE: installing required extension "plpython2u" +CREATE EXTENSION jsonb_plpython3u CASCADE; +NOTICE: installing required extension "plpython3u" -- test jsonb -> python dict CREATE FUNCTION test1(val jsonb) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, dict) @@ -18,7 +18,7 @@ SELECT test1('{"a": 1, "c": "NULL"}'::jsonb); -- test jsonb -> python dict -- complex dict with dicts as value CREATE FUNCTION test1complex(val jsonb) RETURNS int -LANGUAGE plpython2u +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, dict) @@ -34,7 +34,7 @@ SELECT test1complex('{"d": {"d": 1}}'::jsonb); -- test jsonb[] -> python dict -- dict with array as value CREATE FUNCTION test1arr(val jsonb) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, dict) @@ -50,7 +50,7 @@ SELECT test1arr('{"d":[12, 1]}'::jsonb); -- test jsonb[] -> python list -- simple list CREATE FUNCTION test2arr(val jsonb) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, list) @@ -66,7 +66,7 @@ SELECT test2arr('[12, 1]'::jsonb); -- test jsonb[] -> python list -- array of dicts CREATE FUNCTION test3arr(val jsonb) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, list) @@ -81,7 +81,7 @@ SELECT test3arr('[{"a": 1, "b": 2}, {"c": 3,"d": 4}]'::jsonb); -- test jsonb int -> python int CREATE FUNCTION test1int(val jsonb) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert(val == 1) @@ -95,7 +95,7 @@ SELECT test1int('1'::jsonb); -- test jsonb string -> python string CREATE FUNCTION test1string(val jsonb) RETURNS text -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert(val == "a") @@ -109,7 +109,7 @@ SELECT test1string('"a"'::jsonb); -- test jsonb null -> python None CREATE FUNCTION test1null(val jsonb) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert(val == None) @@ -123,7 +123,7 @@ SELECT test1null('null'::jsonb); -- test python -> jsonb CREATE FUNCTION roundtrip(val jsonb) RETURNS jsonb -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb as $$ return val @@ -238,7 +238,7 @@ SELECT roundtrip('["string", "string2"]'::jsonb); -- complex numbers -> jsonb CREATE FUNCTION testComplexNumbers() RETURNS jsonb -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = 1 + 2j @@ -250,7 +250,7 @@ CONTEXT: while creating return value PL/Python function "testcomplexnumbers" -- range -> jsonb CREATE FUNCTION testRange() RETURNS jsonb -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = range(3) @@ -264,7 +264,7 @@ SELECT testRange(); -- 0xff -> jsonb CREATE FUNCTION testDecimal() RETURNS jsonb -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = 0xff @@ -278,7 +278,7 @@ SELECT testDecimal(); -- tuple -> jsonb CREATE FUNCTION testTuple() RETURNS jsonb -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = (1, 'String', None) @@ -292,7 +292,7 @@ SELECT testTuple(); -- interesting dict -> jsonb CREATE FUNCTION test_dict1() RETURNS jsonb -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = {"a": 1, None: 2, 33: 3} diff --git a/contrib/jsonb_plpython/sql/jsonb_plpython.sql b/contrib/jsonb_plpython/sql/jsonb_plpython.sql index 2ee1bca0a9..29dc33279a 100644 --- a/contrib/jsonb_plpython/sql/jsonb_plpython.sql +++ b/contrib/jsonb_plpython/sql/jsonb_plpython.sql @@ -1,8 +1,8 @@ -CREATE EXTENSION jsonb_plpython2u CASCADE; +CREATE EXTENSION jsonb_plpython3u CASCADE; -- test jsonb -> python dict CREATE FUNCTION test1(val jsonb) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, dict) @@ -15,7 +15,7 @@ SELECT test1('{"a": 1, "c": "NULL"}'::jsonb); -- test jsonb -> python dict -- complex dict with dicts as value CREATE FUNCTION test1complex(val jsonb) RETURNS int -LANGUAGE plpython2u +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, dict) @@ -29,7 +29,7 @@ SELECT test1complex('{"d": {"d": 1}}'::jsonb); -- test jsonb[] -> python dict -- dict with array as value CREATE FUNCTION test1arr(val jsonb) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, dict) @@ -42,7 +42,7 @@ SELECT test1arr('{"d":[12, 1]}'::jsonb); -- test jsonb[] -> python list -- simple list CREATE FUNCTION test2arr(val jsonb) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, list) @@ -55,7 +55,7 @@ SELECT test2arr('[12, 1]'::jsonb); -- test jsonb[] -> python list -- array of dicts CREATE FUNCTION test3arr(val jsonb) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, list) @@ -67,7 +67,7 @@ SELECT test3arr('[{"a": 1, "b": 2}, {"c": 3,"d": 4}]'::jsonb); -- test jsonb int -> python int CREATE FUNCTION test1int(val jsonb) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert(val == 1) @@ -78,7 +78,7 @@ SELECT test1int('1'::jsonb); -- test jsonb string -> python string CREATE FUNCTION test1string(val jsonb) RETURNS text -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert(val == "a") @@ -89,7 +89,7 @@ SELECT test1string('"a"'::jsonb); -- test jsonb null -> python None CREATE FUNCTION test1null(val jsonb) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert(val == None) @@ -100,7 +100,7 @@ SELECT test1null('null'::jsonb); -- test python -> jsonb CREATE FUNCTION roundtrip(val jsonb) RETURNS jsonb -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb as $$ return val @@ -129,7 +129,7 @@ SELECT roundtrip('["string", "string2"]'::jsonb); -- complex numbers -> jsonb CREATE FUNCTION testComplexNumbers() RETURNS jsonb -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = 1 + 2j @@ -140,7 +140,7 @@ SELECT testComplexNumbers(); -- range -> jsonb CREATE FUNCTION testRange() RETURNS jsonb -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = range(3) @@ -151,7 +151,7 @@ SELECT testRange(); -- 0xff -> jsonb CREATE FUNCTION testDecimal() RETURNS jsonb -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = 0xff @@ -162,7 +162,7 @@ SELECT testDecimal(); -- tuple -> jsonb CREATE FUNCTION testTuple() RETURNS jsonb -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = (1, 'String', None) @@ -173,7 +173,7 @@ SELECT testTuple(); -- interesting dict -> jsonb CREATE FUNCTION test_dict1() RETURNS jsonb -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = {"a": 1, None: 2, 33: 3} diff --git a/contrib/ltree_plpython/.gitignore b/contrib/ltree_plpython/.gitignore index ce6fab94a0..5dcb3ff972 100644 --- a/contrib/ltree_plpython/.gitignore +++ b/contrib/ltree_plpython/.gitignore @@ -1,6 +1,4 @@ # Generated subdirectories -/expected/python3/ /log/ /results/ -/sql/python3/ /tmp_check/ diff --git a/contrib/ltree_plpython/Makefile b/contrib/ltree_plpython/Makefile index 0bccb111e6..406d2789c9 100644 --- a/contrib/ltree_plpython/Makefile +++ b/contrib/ltree_plpython/Makefile @@ -10,7 +10,6 @@ EXTENSION = ltree_plpython3u DATA = ltree_plpython3u--1.0.sql REGRESS = ltree_plpython -REGRESS_PLPYTHON3_MANGLE := $(REGRESS) PG_CPPFLAGS = $(python_includespec) -DPLPYTHON_LIBNAME='"plpython$(python_majorversion)"' @@ -37,9 +36,4 @@ SHLIB_LINK += $(python_libspec) $(python_additional_libs) endif REGRESS_OPTS += --load-extension=ltree -ifeq ($(python_majorversion),2) -REGRESS_OPTS += --load-extension=plpythonu --load-extension=ltree_plpythonu -endif EXTRA_INSTALL += contrib/ltree - -include $(top_srcdir)/src/pl/plpython/regress-python3-mangle.mk diff --git a/contrib/ltree_plpython/expected/ltree_plpython.out b/contrib/ltree_plpython/expected/ltree_plpython.out index f28897fee4..bd32541fdb 100644 --- a/contrib/ltree_plpython/expected/ltree_plpython.out +++ b/contrib/ltree_plpython/expected/ltree_plpython.out @@ -1,7 +1,7 @@ -CREATE EXTENSION ltree_plpython2u CASCADE; -NOTICE: installing required extension "plpython2u" +CREATE EXTENSION ltree_plpython3u CASCADE; +NOTICE: installing required extension "plpython3u" CREATE FUNCTION test1(val ltree) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE ltree AS $$ plpy.info(repr(val)) @@ -15,7 +15,7 @@ INFO: ['aa', 'bb', 'cc'] (1 row) CREATE FUNCTION test1n(val ltree) RETURNS int -LANGUAGE plpython2u +LANGUAGE plpython3u TRANSFORM FOR TYPE ltree AS $$ plpy.info(repr(val)) @@ -29,7 +29,7 @@ INFO: ['aa', 'bb', 'cc'] (1 row) CREATE FUNCTION test2() RETURNS ltree -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE ltree AS $$ return ['foo', 'bar', 'baz'] diff --git a/contrib/ltree_plpython/sql/ltree_plpython.sql b/contrib/ltree_plpython/sql/ltree_plpython.sql index 210f5428a5..0b8d28399a 100644 --- a/contrib/ltree_plpython/sql/ltree_plpython.sql +++ b/contrib/ltree_plpython/sql/ltree_plpython.sql @@ -1,8 +1,8 @@ -CREATE EXTENSION ltree_plpython2u CASCADE; +CREATE EXTENSION ltree_plpython3u CASCADE; CREATE FUNCTION test1(val ltree) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE ltree AS $$ plpy.info(repr(val)) @@ -13,7 +13,7 @@ SELECT test1('aa.bb.cc'::ltree); CREATE FUNCTION test1n(val ltree) RETURNS int -LANGUAGE plpython2u +LANGUAGE plpython3u TRANSFORM FOR TYPE ltree AS $$ plpy.info(repr(val)) @@ -24,7 +24,7 @@ SELECT test1n('aa.bb.cc'::ltree); CREATE FUNCTION test2() RETURNS ltree -LANGUAGE plpythonu +LANGUAGE plpython3u TRANSFORM FOR TYPE ltree AS $$ return ['foo', 'bar', 'baz'] diff --git a/src/pl/plpython/.gitignore b/src/pl/plpython/.gitignore index 70c08db323..07bee6a29c 100644 --- a/src/pl/plpython/.gitignore +++ b/src/pl/plpython/.gitignore @@ -1,7 +1,5 @@ /spiexceptions.h # Generated subdirectories -/expected/python3/ /log/ /results/ -/sql/python3/ /tmp_check/ diff --git a/src/pl/plpython/Makefile b/src/pl/plpython/Makefile index a83ae8865c..0d6f74de71 100644 --- a/src/pl/plpython/Makefile +++ b/src/pl/plpython/Makefile @@ -35,9 +35,6 @@ OBJS = \ plpy_util.o DATA = $(NAME)u.control $(NAME)u--1.0.sql -ifeq ($(python_majorversion),2) -DATA += plpythonu.control plpythonu--1.0.sql -endif # header files to install - it's not clear which of these might be needed # so install them all. @@ -77,11 +74,6 @@ endif # win32 SHLIB_LINK = $(python_libspec) $(python_additional_libs) $(filter -lintl,$(LIBS)) REGRESS_OPTS = --dbname=$(PL_TESTDB) -# Only load plpythonu with Python 2. The test files themselves load -# the versioned language plpython(2|3)u. -ifeq ($(python_majorversion),2) -REGRESS_OPTS += --load-extension=plpythonu -endif REGRESS = \ plpython_schema \ @@ -108,8 +100,6 @@ REGRESS = \ plpython_transaction \ plpython_drop -REGRESS_PLPYTHON3_MANGLE := $(REGRESS) - include $(top_srcdir)/src/Makefile.shlib all: all-lib @@ -127,7 +117,6 @@ uninstall: uninstall-lib uninstall-data install-data: installdirs $(INSTALL_DATA) $(addprefix $(srcdir)/, $(DATA)) '$(DESTDIR)$(datadir)/extension/' $(INSTALL_DATA) $(addprefix $(srcdir)/, $(INCS)) '$(DESTDIR)$(includedir_server)' - $(INSTALL_DATA) $(srcdir)/regress-python3-mangle.mk '$(DESTDIR)$(pgxsdir)/src/pl/plpython' uninstall-data: rm -f $(addprefix '$(DESTDIR)$(datadir)/extension'/, $(notdir $(DATA))) @@ -136,9 +125,6 @@ uninstall-data: .PHONY: install-data uninstall-data -include $(srcdir)/regress-python3-mangle.mk - - check: submake-pg-regress $(pg_regress_check) $(REGRESS_OPTS) $(REGRESS) diff --git a/src/pl/plpython/expected/plpython_call.out b/src/pl/plpython/expected/plpython_call.out index 55e1027246..4c0690067a 100644 --- a/src/pl/plpython/expected/plpython_call.out +++ b/src/pl/plpython/expected/plpython_call.out @@ -2,14 +2,14 @@ -- Tests for procedures / CALL syntax -- CREATE PROCEDURE test_proc1() -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ pass $$; CALL test_proc1(); -- error: can't return non-None CREATE PROCEDURE test_proc2() -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ return 5 $$; @@ -18,7 +18,7 @@ ERROR: PL/Python procedure did not return None CONTEXT: PL/Python procedure "test_proc2" CREATE TABLE test1 (a int); CREATE PROCEDURE test_proc3(x int) -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ plpy.execute("INSERT INTO test1 VALUES (%s)" % x) $$; @@ -31,7 +31,7 @@ SELECT * FROM test1; -- output arguments CREATE PROCEDURE test_proc5(INOUT a text) -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ return [a + '+' + a] $$; @@ -42,7 +42,7 @@ CALL test_proc5('abc'); (1 row) CREATE PROCEDURE test_proc6(a int, INOUT b int, INOUT c int) -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ return (b * a, c * a) $$; @@ -54,7 +54,7 @@ CALL test_proc6(2, 3, 4); -- OUT parameters CREATE PROCEDURE test_proc9(IN a int, OUT b int) -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ plpy.notice("a: %s" % (a)) return (a * 2,) diff --git a/src/pl/plpython/expected/plpython_composite.out b/src/pl/plpython/expected/plpython_composite.out index af80192334..bb101e07d5 100644 --- a/src/pl/plpython/expected/plpython_composite.out +++ b/src/pl/plpython/expected/plpython_composite.out @@ -1,6 +1,6 @@ CREATE FUNCTION multiout_simple(OUT i integer, OUT j integer) AS $$ return (1, 2) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT multiout_simple(); multiout_simple ----------------- @@ -27,7 +27,7 @@ SELECT (multiout_simple()).j + 3; CREATE FUNCTION multiout_simple_setof(n integer = 1, OUT integer, OUT integer) RETURNS SETOF record AS $$ return [(1, 2)] * n -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT multiout_simple_setof(); multiout_simple_setof ----------------------- @@ -67,7 +67,7 @@ elif typ == 'obj': return type_record elif typ == 'str': return "('%s',%r)" % (first, second) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM multiout_record_as('dict', 'foo', 1, 'f'); first | second -------+-------- @@ -237,7 +237,7 @@ for i in range(n): power = 2 ** i length = plpy.execute("select length('%d')" % power)[0]['length'] yield power, length -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM multiout_setof(3); power_of_2 | length ------------+-------- @@ -260,7 +260,7 @@ CREATE FUNCTION multiout_return_table() RETURNS TABLE (x integer, y text) AS $$ return [{'x': 4, 'y' :'four'}, {'x': 7, 'y' :'seven'}, {'x': 0, 'y' :'zero'}] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM multiout_return_table(); x | y ---+------- @@ -273,7 +273,7 @@ CREATE FUNCTION multiout_array(OUT integer[], OUT text) RETURNS SETOF record AS yield [[1], 'a'] yield [[1,2], 'b'] yield [[1,2,3], None] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM multiout_array(); column1 | column2 ---------+--------- @@ -284,11 +284,11 @@ SELECT * FROM multiout_array(); CREATE FUNCTION singleout_composite(OUT type_record) AS $$ return {'first': 1, 'second': 2} -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION multiout_composite(OUT type_record) RETURNS SETOF type_record AS $$ return [{'first': 1, 'second': 2}, {'first': 3, 'second': 4 }] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM singleout_composite(); first | second -------+-------- @@ -305,7 +305,7 @@ SELECT * FROM multiout_composite(); -- composite OUT parameters in functions returning RECORD not supported yet CREATE FUNCTION multiout_composite(INOUT n integer, OUT type_record) AS $$ return (n, (n * 2, n * 3)) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION multiout_table_type_setof(typ text, returnnull boolean, INOUT n integer, OUT table_record) RETURNS SETOF record AS $$ if returnnull: d = None @@ -323,7 +323,7 @@ elif typ == 'str': d = "(%r,%r)" % (n * 2, n * 3) for i in range(n): yield (i, d) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM multiout_composite(2); n | column2 ---+--------- @@ -438,7 +438,7 @@ CREATE TABLE changing ( CREATE FUNCTION changing_test(OUT n integer, OUT changing) RETURNS SETOF record AS $$ return [(1, {'i': 1, 'j': 2}), (1, (3, 4))] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM changing_test(); n | column2 ---+--------- @@ -474,7 +474,7 @@ yield {'tab': [('first', 1), ('second', 2)], yield {'tab': [('first', 1), ('second', 2)], 'typ': [{'first': 'third', 'second': 3}, {'first': 'fourth', 'second': 4}]} -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM composite_types_table(); tab | typ ----------------------------+---------------------------- @@ -486,7 +486,7 @@ SELECT * FROM composite_types_table(); -- check what happens if the output record descriptor changes CREATE FUNCTION return_record(t text) RETURNS record AS $$ return {'t': t, 'val': 10} -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM return_record('abc') AS r(t text, val integer); t | val -----+----- @@ -525,7 +525,7 @@ SELECT * FROM return_record('999') AS r(val text, t integer); CREATE FUNCTION return_record_2(t text) RETURNS record AS $$ return {'v1':1,'v2':2,t:3} -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM return_record_2('v3') AS (v3 int, v2 int, v1 int); v3 | v2 | v1 ----+----+---- @@ -572,7 +572,7 @@ SELECT * FROM return_record_2('v3') AS (v1 int, v2 int, v3 int); -- multi-dimensional array of composite types. CREATE FUNCTION composite_type_as_list() RETURNS type_record[] AS $$ return [[('first', 1), ('second', 1)], [('first', 2), ('second', 2)], [('first', 3), ('second', 3)]]; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM composite_type_as_list(); composite_type_as_list ------------------------------------------------------------------------------------ @@ -585,7 +585,7 @@ SELECT * FROM composite_type_as_list(); -- on the issue. CREATE FUNCTION composite_type_as_list_broken() RETURNS type_record[] AS $$ return [['first', 1]]; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM composite_type_as_list_broken(); ERROR: malformed record literal: "first" DETAIL: Missing left parenthesis. diff --git a/src/pl/plpython/expected/plpython_do.out b/src/pl/plpython/expected/plpython_do.out index e300530e03..d131a4c0ed 100644 --- a/src/pl/plpython/expected/plpython_do.out +++ b/src/pl/plpython/expected/plpython_do.out @@ -1,8 +1,6 @@ -DO $$ plpy.notice("This is plpythonu.") $$ LANGUAGE plpythonu; -NOTICE: This is plpythonu. -DO $$ plpy.notice("This is plpython2u.") $$ LANGUAGE plpython2u; -NOTICE: This is plpython2u. -DO $$ raise Exception("error test") $$ LANGUAGE plpythonu; +DO $$ plpy.notice("This is plpython3u.") $$ LANGUAGE plpython3u; +NOTICE: This is plpython3u. +DO $$ raise Exception("error test") $$ LANGUAGE plpython3u; ERROR: Exception: error test CONTEXT: Traceback (most recent call last): PL/Python anonymous code block, line 1, in diff --git a/src/pl/plpython/expected/plpython_drop.out b/src/pl/plpython/expected/plpython_drop.out index a0e3b5c4ef..97bb54a55e 100644 --- a/src/pl/plpython/expected/plpython_drop.out +++ b/src/pl/plpython/expected/plpython_drop.out @@ -2,5 +2,4 @@ -- For paranoia's sake, don't leave an untrusted language sitting around -- SET client_min_messages = WARNING; -DROP EXTENSION plpythonu CASCADE; -DROP EXTENSION IF EXISTS plpython2u CASCADE; +DROP EXTENSION plpython3u CASCADE; diff --git a/src/pl/plpython/expected/plpython_ereport.out b/src/pl/plpython/expected/plpython_ereport.out index b73bfff511..74dcc419ce 100644 --- a/src/pl/plpython/expected/plpython_ereport.out +++ b/src/pl/plpython/expected/plpython_ereport.out @@ -17,7 +17,7 @@ plpy.info('This is message text.', plpy.notice('notice', detail='some detail') plpy.warning('warning', detail='some detail') plpy.error('stop on error', detail='some detail', hint='some hint') -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT elog_test(); INFO: info DETAIL: some detail @@ -38,42 +38,42 @@ CONTEXT: Traceback (most recent call last): PL/Python function "elog_test", line 18, in plpy.error('stop on error', detail='some detail', hint='some hint') PL/Python function "elog_test" -DO $$ plpy.info('other types', detail=(10, 20)) $$ LANGUAGE plpythonu; +DO $$ plpy.info('other types', detail=(10, 20)) $$ LANGUAGE plpython3u; INFO: other types DETAIL: (10, 20) DO $$ import time; from datetime import date plpy.info('other types', detail=date(2016, 2, 26)) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; INFO: other types DETAIL: 2016-02-26 DO $$ basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] plpy.info('other types', detail=basket) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; INFO: other types DETAIL: ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] -- should fail -DO $$ plpy.info('wrong sqlstate', sqlstate='54444A') $$ LANGUAGE plpythonu; +DO $$ plpy.info('wrong sqlstate', sqlstate='54444A') $$ LANGUAGE plpython3u; ERROR: ValueError: invalid SQLSTATE code CONTEXT: Traceback (most recent call last): PL/Python anonymous code block, line 1, in plpy.info('wrong sqlstate', sqlstate='54444A') PL/Python anonymous code block -DO $$ plpy.info('unsupported argument', blabla='fooboo') $$ LANGUAGE plpythonu; +DO $$ plpy.info('unsupported argument', blabla='fooboo') $$ LANGUAGE plpython3u; ERROR: TypeError: 'blabla' is an invalid keyword argument for this function CONTEXT: Traceback (most recent call last): PL/Python anonymous code block, line 1, in plpy.info('unsupported argument', blabla='fooboo') PL/Python anonymous code block -DO $$ plpy.info('first message', message='second message') $$ LANGUAGE plpythonu; +DO $$ plpy.info('first message', message='second message') $$ LANGUAGE plpython3u; ERROR: TypeError: argument 'message' given by name and position CONTEXT: Traceback (most recent call last): PL/Python anonymous code block, line 1, in plpy.info('first message', message='second message') PL/Python anonymous code block -DO $$ plpy.info('first message', 'second message', message='third message') $$ LANGUAGE plpythonu; +DO $$ plpy.info('first message', 'second message', message='third message') $$ LANGUAGE plpython3u; ERROR: TypeError: argument 'message' given by name and position CONTEXT: Traceback (most recent call last): PL/Python anonymous code block, line 1, in @@ -96,7 +96,7 @@ kwargs = { } # ignore None values plpy.error(**dict((k, v) for k, v in iter(kwargs.items()) if v)) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT raise_exception('hello', 'world'); ERROR: plpy.Error: hello DETAIL: world @@ -180,26 +180,35 @@ END; $$; NOTICE: handled exception DETAIL: message:(plpy.Error: message text), detail:(detail text), hint: (hint text), sqlstate: (XX555), schema_name:(schema text), table_name:(table text), column_name:(column text), datatype_name:(datatype text), constraint_name:(constraint text) --- The displayed context is different between Python2 and Python3, --- but that's not important for this test. -\set SHOW_CONTEXT never DO $$ try: plpy.execute("select raise_exception(_message => 'my message', _sqlstate => 'XX987', _hint => 'some hint', _table_name => 'users_tab', _datatype_name => 'user_type')") except Exception as e: plpy.info(e.spidata) raise e -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; INFO: (119577128, None, 'some hint', None, 0, None, 'users_tab', None, 'user_type', None) ERROR: plpy.SPIError: plpy.Error: my message HINT: some hint +CONTEXT: Traceback (most recent call last): + PL/Python anonymous code block, line 6, in + raise e + PL/Python anonymous code block, line 3, in __plpython_inline_block + plpy.execute("select raise_exception(_message => 'my message', _sqlstate => 'XX987', _hint => 'some hint', _table_name => 'users_tab', _datatype_name => 'user_type')") +PL/Python anonymous code block DO $$ try: plpy.error(message = 'my message', sqlstate = 'XX987', hint = 'some hint', table_name = 'users_tab', datatype_name = 'user_type') except Exception as e: plpy.info('sqlstate: %s, hint: %s, table_name: %s, datatype_name: %s' % (e.sqlstate, e.hint, e.table_name, e.datatype_name)) raise e -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; INFO: sqlstate: XX987, hint: some hint, table_name: users_tab, datatype_name: user_type ERROR: plpy.Error: my message HINT: some hint +CONTEXT: Traceback (most recent call last): + PL/Python anonymous code block, line 6, in + raise e + PL/Python anonymous code block, line 3, in __plpython_inline_block + plpy.error(message = 'my message', sqlstate = 'XX987', hint = 'some hint', table_name = 'users_tab', datatype_name = 'user_type') +PL/Python anonymous code block diff --git a/src/pl/plpython/expected/plpython_error.out b/src/pl/plpython/expected/plpython_error.out index b2f8fe83eb..7fe864a1a5 100644 --- a/src/pl/plpython/expected/plpython_error.out +++ b/src/pl/plpython/expected/plpython_error.out @@ -6,7 +6,7 @@ CREATE FUNCTION python_syntax_error() RETURNS text AS '.syntaxerror' - LANGUAGE plpythonu; + LANGUAGE plpython3u; ERROR: could not compile PL/Python function "python_syntax_error" DETAIL: SyntaxError: invalid syntax (, line 2) /* With check_function_bodies = false the function should get defined @@ -16,7 +16,7 @@ SET check_function_bodies = false; CREATE FUNCTION python_syntax_error() RETURNS text AS '.syntaxerror' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT python_syntax_error(); ERROR: could not compile PL/Python function "python_syntax_error" DETAIL: SyntaxError: invalid syntax (, line 2) @@ -30,7 +30,7 @@ RESET check_function_bodies; CREATE FUNCTION sql_syntax_error() RETURNS text AS 'plpy.execute("syntax error")' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT sql_syntax_error(); ERROR: spiexceptions.SyntaxError: syntax error at or near "syntax" LINE 1: syntax error @@ -45,7 +45,7 @@ PL/Python function "sql_syntax_error" CREATE FUNCTION exception_index_invalid(text) RETURNS text AS 'return args[1]' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT exception_index_invalid('test'); ERROR: IndexError: list index out of range CONTEXT: Traceback (most recent call last): @@ -58,7 +58,7 @@ CREATE FUNCTION exception_index_invalid_nested() RETURNS text AS 'rv = plpy.execute("SELECT test5(''foo'')") return rv[0]' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT exception_index_invalid_nested(); ERROR: spiexceptions.UndefinedFunction: function test5(unknown) does not exist LINE 1: SELECT test5('foo') @@ -81,7 +81,7 @@ if len(rv): return rv[0]["fname"] return None ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT invalid_type_uncaught('rick'); ERROR: spiexceptions.UndefinedObject: type "test" does not exist CONTEXT: Traceback (most recent call last): @@ -105,7 +105,7 @@ if len(rv): return rv[0]["fname"] return None ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT invalid_type_caught('rick'); NOTICE: type "test" does not exist invalid_type_caught @@ -129,7 +129,7 @@ if len(rv): return rv[0]["fname"] return None ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT invalid_type_reraised('rick'); ERROR: plpy.Error: type "test" does not exist CONTEXT: Traceback (most recent call last): @@ -147,7 +147,7 @@ if len(rv): return rv[0]["fname"] return None ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT valid_type('rick'); valid_type ------------ @@ -170,7 +170,7 @@ def fun3(): fun3() return "not reached" ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT nested_error(); ERROR: plpy.Error: boom CONTEXT: Traceback (most recent call last): @@ -199,7 +199,7 @@ def fun3(): fun3() return "not reached" ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT nested_error_raise(); ERROR: plpy.Error: boom CONTEXT: Traceback (most recent call last): @@ -228,7 +228,7 @@ def fun3(): fun3() return "you''ve been warned" ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT nested_warning(); WARNING: boom nested_warning @@ -241,9 +241,9 @@ WARNING: boom CREATE FUNCTION toplevel_attribute_error() RETURNS void AS $$ plpy.nonexistent -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT toplevel_attribute_error(); -ERROR: AttributeError: 'module' object has no attribute 'nonexistent' +ERROR: AttributeError: module 'plpy' has no attribute 'nonexistent' CONTEXT: Traceback (most recent call last): PL/Python function "toplevel_attribute_error", line 2, in plpy.nonexistent @@ -261,7 +261,7 @@ def third(): plpy.execute("select sql_error()") first() -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE OR REPLACE FUNCTION sql_error() RETURNS void AS $$ begin select 1/0; @@ -274,7 +274,7 @@ end $$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION sql_from_python_error() RETURNS void AS $$ plpy.execute("select sql_error()") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT python_traceback(); ERROR: spiexceptions.DivisionByZero: division by zero CONTEXT: Traceback (most recent call last): @@ -325,7 +325,7 @@ except spiexceptions.NotNullViolation as e: plpy.notice("Violated the NOT NULL constraint, sqlstate %s" % e.sqlstate) except spiexceptions.UniqueViolation as e: plpy.notice("Violated the UNIQUE constraint, sqlstate %s" % e.sqlstate) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT specific_exception(2); specific_exception -------------------- @@ -351,7 +351,7 @@ NOTICE: Violated the UNIQUE constraint, sqlstate 23505 CREATE FUNCTION python_unique_violation() RETURNS void AS $$ plpy.execute("insert into specific values (1)") plpy.execute("insert into specific values (1)") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION catch_python_unique_violation() RETURNS text AS $$ begin begin @@ -374,7 +374,7 @@ CREATE FUNCTION manual_subxact() RETURNS void AS $$ plpy.execute("savepoint save") plpy.execute("create table foo(x integer)") plpy.execute("rollback to save") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT manual_subxact(); ERROR: plpy.SPIError: SPI_execute failed: SPI_ERROR_TRANSACTION CONTEXT: Traceback (most recent call last): @@ -389,7 +389,7 @@ rollback = plpy.prepare("rollback to save") plpy.execute(save) plpy.execute("create table foo(x integer)") plpy.execute(rollback) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT manual_subxact_prepared(); ERROR: plpy.SPIError: SPI_execute_plan failed: SPI_ERROR_TRANSACTION CONTEXT: Traceback (most recent call last): @@ -400,7 +400,7 @@ PL/Python function "manual_subxact_prepared" */ CREATE FUNCTION plpy_raise_spiexception() RETURNS void AS $$ raise plpy.spiexceptions.DivisionByZero() -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; DO $$ BEGIN SELECT plpy_raise_spiexception(); @@ -414,7 +414,7 @@ CREATE FUNCTION plpy_raise_spiexception_override() RETURNS void AS $$ exc = plpy.spiexceptions.DivisionByZero() exc.sqlstate = 'SILLY' raise exc -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; DO $$ BEGIN SELECT plpy_raise_spiexception_override(); @@ -425,18 +425,18 @@ $$ LANGUAGE plpgsql; /* test the context stack trace for nested execution levels */ CREATE FUNCTION notice_innerfunc() RETURNS int AS $$ -plpy.execute("DO LANGUAGE plpythonu $x$ plpy.notice('inside DO') $x$") +plpy.execute("DO LANGUAGE plpython3u $x$ plpy.notice('inside DO') $x$") return 1 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION notice_outerfunc() RETURNS int AS $$ plpy.execute("SELECT notice_innerfunc()") return 1 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; \set SHOW_CONTEXT always SELECT notice_outerfunc(); NOTICE: inside DO CONTEXT: PL/Python anonymous code block -SQL statement "DO LANGUAGE plpythonu $x$ plpy.notice('inside DO') $x$" +SQL statement "DO LANGUAGE plpython3u $x$ plpy.notice('inside DO') $x$" PL/Python function "notice_innerfunc" SQL statement "SELECT notice_innerfunc()" PL/Python function "notice_outerfunc" diff --git a/src/pl/plpython/expected/plpython_error_5.out b/src/pl/plpython/expected/plpython_error_5.out deleted file mode 100644 index bc66ab5534..0000000000 --- a/src/pl/plpython/expected/plpython_error_5.out +++ /dev/null @@ -1,447 +0,0 @@ --- test error handling, i forgot to restore Warn_restart in --- the trigger handler once. the errors and subsequent core dump were --- interesting. -/* Flat out Python syntax error - */ -CREATE FUNCTION python_syntax_error() RETURNS text - AS -'.syntaxerror' - LANGUAGE plpython3u; -ERROR: could not compile PL/Python function "python_syntax_error" -DETAIL: SyntaxError: invalid syntax (, line 2) -/* With check_function_bodies = false the function should get defined - * and the error reported when called - */ -SET check_function_bodies = false; -CREATE FUNCTION python_syntax_error() RETURNS text - AS -'.syntaxerror' - LANGUAGE plpython3u; -SELECT python_syntax_error(); -ERROR: could not compile PL/Python function "python_syntax_error" -DETAIL: SyntaxError: invalid syntax (, line 2) -/* Run the function twice to check if the hashtable entry gets cleaned up */ -SELECT python_syntax_error(); -ERROR: could not compile PL/Python function "python_syntax_error" -DETAIL: SyntaxError: invalid syntax (, line 2) -RESET check_function_bodies; -/* Flat out syntax error - */ -CREATE FUNCTION sql_syntax_error() RETURNS text - AS -'plpy.execute("syntax error")' - LANGUAGE plpython3u; -SELECT sql_syntax_error(); -ERROR: spiexceptions.SyntaxError: syntax error at or near "syntax" -LINE 1: syntax error - ^ -QUERY: syntax error -CONTEXT: Traceback (most recent call last): - PL/Python function "sql_syntax_error", line 1, in - plpy.execute("syntax error") -PL/Python function "sql_syntax_error" -/* check the handling of uncaught python exceptions - */ -CREATE FUNCTION exception_index_invalid(text) RETURNS text - AS -'return args[1]' - LANGUAGE plpython3u; -SELECT exception_index_invalid('test'); -ERROR: IndexError: list index out of range -CONTEXT: Traceback (most recent call last): - PL/Python function "exception_index_invalid", line 1, in - return args[1] -PL/Python function "exception_index_invalid" -/* check handling of nested exceptions - */ -CREATE FUNCTION exception_index_invalid_nested() RETURNS text - AS -'rv = plpy.execute("SELECT test5(''foo'')") -return rv[0]' - LANGUAGE plpython3u; -SELECT exception_index_invalid_nested(); -ERROR: spiexceptions.UndefinedFunction: function test5(unknown) does not exist -LINE 1: SELECT test5('foo') - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. -QUERY: SELECT test5('foo') -CONTEXT: Traceback (most recent call last): - PL/Python function "exception_index_invalid_nested", line 1, in - rv = plpy.execute("SELECT test5('foo')") -PL/Python function "exception_index_invalid_nested" -/* a typo - */ -CREATE FUNCTION invalid_type_uncaught(a text) RETURNS text - AS -'if "plan" not in SD: - q = "SELECT fname FROM users WHERE lname = $1" - SD["plan"] = plpy.prepare(q, [ "test" ]) -rv = plpy.execute(SD["plan"], [ a ]) -if len(rv): - return rv[0]["fname"] -return None -' - LANGUAGE plpython3u; -SELECT invalid_type_uncaught('rick'); -ERROR: spiexceptions.UndefinedObject: type "test" does not exist -CONTEXT: Traceback (most recent call last): - PL/Python function "invalid_type_uncaught", line 3, in - SD["plan"] = plpy.prepare(q, [ "test" ]) -PL/Python function "invalid_type_uncaught" -/* for what it's worth catch the exception generated by - * the typo, and return None - */ -CREATE FUNCTION invalid_type_caught(a text) RETURNS text - AS -'if "plan" not in SD: - q = "SELECT fname FROM users WHERE lname = $1" - try: - SD["plan"] = plpy.prepare(q, [ "test" ]) - except plpy.SPIError as ex: - plpy.notice(str(ex)) - return None -rv = plpy.execute(SD["plan"], [ a ]) -if len(rv): - return rv[0]["fname"] -return None -' - LANGUAGE plpython3u; -SELECT invalid_type_caught('rick'); -NOTICE: type "test" does not exist - invalid_type_caught ---------------------- - -(1 row) - -/* for what it's worth catch the exception generated by - * the typo, and reraise it as a plain error - */ -CREATE FUNCTION invalid_type_reraised(a text) RETURNS text - AS -'if "plan" not in SD: - q = "SELECT fname FROM users WHERE lname = $1" - try: - SD["plan"] = plpy.prepare(q, [ "test" ]) - except plpy.SPIError as ex: - plpy.error(str(ex)) -rv = plpy.execute(SD["plan"], [ a ]) -if len(rv): - return rv[0]["fname"] -return None -' - LANGUAGE plpython3u; -SELECT invalid_type_reraised('rick'); -ERROR: plpy.Error: type "test" does not exist -CONTEXT: Traceback (most recent call last): - PL/Python function "invalid_type_reraised", line 6, in - plpy.error(str(ex)) -PL/Python function "invalid_type_reraised" -/* no typo no messing about - */ -CREATE FUNCTION valid_type(a text) RETURNS text - AS -'if "plan" not in SD: - SD["plan"] = plpy.prepare("SELECT fname FROM users WHERE lname = $1", [ "text" ]) -rv = plpy.execute(SD["plan"], [ a ]) -if len(rv): - return rv[0]["fname"] -return None -' - LANGUAGE plpython3u; -SELECT valid_type('rick'); - valid_type ------------- - -(1 row) - -/* error in nested functions to get a traceback -*/ -CREATE FUNCTION nested_error() RETURNS text - AS -'def fun1(): - plpy.error("boom") - -def fun2(): - fun1() - -def fun3(): - fun2() - -fun3() -return "not reached" -' - LANGUAGE plpython3u; -SELECT nested_error(); -ERROR: plpy.Error: boom -CONTEXT: Traceback (most recent call last): - PL/Python function "nested_error", line 10, in - fun3() - PL/Python function "nested_error", line 8, in fun3 - fun2() - PL/Python function "nested_error", line 5, in fun2 - fun1() - PL/Python function "nested_error", line 2, in fun1 - plpy.error("boom") -PL/Python function "nested_error" -/* raising plpy.Error is just like calling plpy.error -*/ -CREATE FUNCTION nested_error_raise() RETURNS text - AS -'def fun1(): - raise plpy.Error("boom") - -def fun2(): - fun1() - -def fun3(): - fun2() - -fun3() -return "not reached" -' - LANGUAGE plpython3u; -SELECT nested_error_raise(); -ERROR: plpy.Error: boom -CONTEXT: Traceback (most recent call last): - PL/Python function "nested_error_raise", line 10, in - fun3() - PL/Python function "nested_error_raise", line 8, in fun3 - fun2() - PL/Python function "nested_error_raise", line 5, in fun2 - fun1() - PL/Python function "nested_error_raise", line 2, in fun1 - raise plpy.Error("boom") -PL/Python function "nested_error_raise" -/* using plpy.warning should not produce a traceback -*/ -CREATE FUNCTION nested_warning() RETURNS text - AS -'def fun1(): - plpy.warning("boom") - -def fun2(): - fun1() - -def fun3(): - fun2() - -fun3() -return "you''ve been warned" -' - LANGUAGE plpython3u; -SELECT nested_warning(); -WARNING: boom - nested_warning --------------------- - you've been warned -(1 row) - -/* AttributeError at toplevel used to give segfaults with the traceback -*/ -CREATE FUNCTION toplevel_attribute_error() RETURNS void AS -$$ -plpy.nonexistent -$$ LANGUAGE plpython3u; -SELECT toplevel_attribute_error(); -ERROR: AttributeError: module 'plpy' has no attribute 'nonexistent' -CONTEXT: Traceback (most recent call last): - PL/Python function "toplevel_attribute_error", line 2, in - plpy.nonexistent -PL/Python function "toplevel_attribute_error" -/* Calling PL/Python functions from SQL and vice versa should not lose context. - */ -CREATE OR REPLACE FUNCTION python_traceback() RETURNS void AS $$ -def first(): - second() - -def second(): - third() - -def third(): - plpy.execute("select sql_error()") - -first() -$$ LANGUAGE plpython3u; -CREATE OR REPLACE FUNCTION sql_error() RETURNS void AS $$ -begin - select 1/0; -end -$$ LANGUAGE plpgsql; -CREATE OR REPLACE FUNCTION python_from_sql_error() RETURNS void AS $$ -begin - select python_traceback(); -end -$$ LANGUAGE plpgsql; -CREATE OR REPLACE FUNCTION sql_from_python_error() RETURNS void AS $$ -plpy.execute("select sql_error()") -$$ LANGUAGE plpython3u; -SELECT python_traceback(); -ERROR: spiexceptions.DivisionByZero: division by zero -CONTEXT: Traceback (most recent call last): - PL/Python function "python_traceback", line 11, in - first() - PL/Python function "python_traceback", line 3, in first - second() - PL/Python function "python_traceback", line 6, in second - third() - PL/Python function "python_traceback", line 9, in third - plpy.execute("select sql_error()") -PL/Python function "python_traceback" -SELECT sql_error(); -ERROR: division by zero -CONTEXT: SQL statement "select 1/0" -PL/pgSQL function sql_error() line 3 at SQL statement -SELECT python_from_sql_error(); -ERROR: spiexceptions.DivisionByZero: division by zero -CONTEXT: Traceback (most recent call last): - PL/Python function "python_traceback", line 11, in - first() - PL/Python function "python_traceback", line 3, in first - second() - PL/Python function "python_traceback", line 6, in second - third() - PL/Python function "python_traceback", line 9, in third - plpy.execute("select sql_error()") -PL/Python function "python_traceback" -SQL statement "select python_traceback()" -PL/pgSQL function python_from_sql_error() line 3 at SQL statement -SELECT sql_from_python_error(); -ERROR: spiexceptions.DivisionByZero: division by zero -CONTEXT: Traceback (most recent call last): - PL/Python function "sql_from_python_error", line 2, in - plpy.execute("select sql_error()") -PL/Python function "sql_from_python_error" -/* check catching specific types of exceptions - */ -CREATE TABLE specific ( - i integer PRIMARY KEY -); -CREATE FUNCTION specific_exception(i integer) RETURNS void AS -$$ -from plpy import spiexceptions -try: - plpy.execute("insert into specific values (%s)" % (i or "NULL")); -except spiexceptions.NotNullViolation as e: - plpy.notice("Violated the NOT NULL constraint, sqlstate %s" % e.sqlstate) -except spiexceptions.UniqueViolation as e: - plpy.notice("Violated the UNIQUE constraint, sqlstate %s" % e.sqlstate) -$$ LANGUAGE plpython3u; -SELECT specific_exception(2); - specific_exception --------------------- - -(1 row) - -SELECT specific_exception(NULL); -NOTICE: Violated the NOT NULL constraint, sqlstate 23502 - specific_exception --------------------- - -(1 row) - -SELECT specific_exception(2); -NOTICE: Violated the UNIQUE constraint, sqlstate 23505 - specific_exception --------------------- - -(1 row) - -/* SPI errors in PL/Python functions should preserve the SQLSTATE value - */ -CREATE FUNCTION python_unique_violation() RETURNS void AS $$ -plpy.execute("insert into specific values (1)") -plpy.execute("insert into specific values (1)") -$$ LANGUAGE plpython3u; -CREATE FUNCTION catch_python_unique_violation() RETURNS text AS $$ -begin - begin - perform python_unique_violation(); - exception when unique_violation then - return 'ok'; - end; - return 'not reached'; -end; -$$ language plpgsql; -SELECT catch_python_unique_violation(); - catch_python_unique_violation -------------------------------- - ok -(1 row) - -/* manually starting subtransactions - a bad idea - */ -CREATE FUNCTION manual_subxact() RETURNS void AS $$ -plpy.execute("savepoint save") -plpy.execute("create table foo(x integer)") -plpy.execute("rollback to save") -$$ LANGUAGE plpython3u; -SELECT manual_subxact(); -ERROR: plpy.SPIError: SPI_execute failed: SPI_ERROR_TRANSACTION -CONTEXT: Traceback (most recent call last): - PL/Python function "manual_subxact", line 2, in - plpy.execute("savepoint save") -PL/Python function "manual_subxact" -/* same for prepared plans - */ -CREATE FUNCTION manual_subxact_prepared() RETURNS void AS $$ -save = plpy.prepare("savepoint save") -rollback = plpy.prepare("rollback to save") -plpy.execute(save) -plpy.execute("create table foo(x integer)") -plpy.execute(rollback) -$$ LANGUAGE plpython3u; -SELECT manual_subxact_prepared(); -ERROR: plpy.SPIError: SPI_execute_plan failed: SPI_ERROR_TRANSACTION -CONTEXT: Traceback (most recent call last): - PL/Python function "manual_subxact_prepared", line 4, in - plpy.execute(save) -PL/Python function "manual_subxact_prepared" -/* raising plpy.spiexception.* from python code should preserve sqlstate - */ -CREATE FUNCTION plpy_raise_spiexception() RETURNS void AS $$ -raise plpy.spiexceptions.DivisionByZero() -$$ LANGUAGE plpython3u; -DO $$ -BEGIN - SELECT plpy_raise_spiexception(); -EXCEPTION WHEN division_by_zero THEN - -- NOOP -END -$$ LANGUAGE plpgsql; -/* setting a custom sqlstate should be handled - */ -CREATE FUNCTION plpy_raise_spiexception_override() RETURNS void AS $$ -exc = plpy.spiexceptions.DivisionByZero() -exc.sqlstate = 'SILLY' -raise exc -$$ LANGUAGE plpython3u; -DO $$ -BEGIN - SELECT plpy_raise_spiexception_override(); -EXCEPTION WHEN SQLSTATE 'SILLY' THEN - -- NOOP -END -$$ LANGUAGE plpgsql; -/* test the context stack trace for nested execution levels - */ -CREATE FUNCTION notice_innerfunc() RETURNS int AS $$ -plpy.execute("DO LANGUAGE plpythonu $x$ plpy.notice('inside DO') $x$") -return 1 -$$ LANGUAGE plpythonu; -CREATE FUNCTION notice_outerfunc() RETURNS int AS $$ -plpy.execute("SELECT notice_innerfunc()") -return 1 -$$ LANGUAGE plpythonu; -\set SHOW_CONTEXT always -SELECT notice_outerfunc(); -NOTICE: inside DO -CONTEXT: PL/Python anonymous code block -SQL statement "DO LANGUAGE plpythonu $x$ plpy.notice('inside DO') $x$" -PL/Python function "notice_innerfunc" -SQL statement "SELECT notice_innerfunc()" -PL/Python function "notice_outerfunc" - notice_outerfunc ------------------- - 1 -(1 row) - diff --git a/src/pl/plpython/expected/plpython_global.out b/src/pl/plpython/expected/plpython_global.out index 192e3e48a7..a4cfb1483f 100644 --- a/src/pl/plpython/expected/plpython_global.out +++ b/src/pl/plpython/expected/plpython_global.out @@ -8,7 +8,7 @@ CREATE FUNCTION global_test_one() returns text if "global_test" not in GD: GD["global_test"] = "set by global_test_one" return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION global_test_two() returns text AS 'if "global_test" not in SD: @@ -16,7 +16,7 @@ CREATE FUNCTION global_test_two() returns text if "global_test" not in GD: GD["global_test"] = "set by global_test_two" return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION static_test() returns int4 AS 'if "call" in SD: @@ -25,7 +25,7 @@ else: SD["call"] = 1 return SD["call"] ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT static_test(); static_test ------------- diff --git a/src/pl/plpython/expected/plpython_import.out b/src/pl/plpython/expected/plpython_import.out index b59e1821a7..854e989eaf 100644 --- a/src/pl/plpython/expected/plpython_import.out +++ b/src/pl/plpython/expected/plpython_import.out @@ -6,7 +6,7 @@ CREATE FUNCTION import_fail() returns text except ImportError: return "failed as expected" return "succeeded, that wasn''t supposed to happen"' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION import_succeed() returns text AS 'try: @@ -25,7 +25,7 @@ except Exception as ex: plpy.notice("import failed -- %s" % str(ex)) return "failed, that wasn''t supposed to happen" return "succeeded, as expected"' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION import_test_one(p text) RETURNS text AS 'try: @@ -35,7 +35,7 @@ except ImportError: import sha digest = sha.new(p) return digest.hexdigest()' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION import_test_two(u users) RETURNS text AS 'plain = u["fname"] + u["lname"] @@ -46,7 +46,7 @@ except ImportError: import sha digest = sha.new(plain); return "sha hash of " + plain + " is " + digest.hexdigest()' - LANGUAGE plpythonu; + LANGUAGE plpython3u; -- import python modules -- SELECT import_fail(); diff --git a/src/pl/plpython/expected/plpython_newline.out b/src/pl/plpython/expected/plpython_newline.out index 27dc2f8ab0..2bc149257e 100644 --- a/src/pl/plpython/expected/plpython_newline.out +++ b/src/pl/plpython/expected/plpython_newline.out @@ -3,13 +3,13 @@ -- CREATE OR REPLACE FUNCTION newline_lf() RETURNS integer AS E'x = 100\ny = 23\nreturn x + y\n' -LANGUAGE plpythonu; +LANGUAGE plpython3u; CREATE OR REPLACE FUNCTION newline_cr() RETURNS integer AS E'x = 100\ry = 23\rreturn x + y\r' -LANGUAGE plpythonu; +LANGUAGE plpython3u; CREATE OR REPLACE FUNCTION newline_crlf() RETURNS integer AS E'x = 100\r\ny = 23\r\nreturn x + y\r\n' -LANGUAGE plpythonu; +LANGUAGE plpython3u; SELECT newline_lf(); newline_lf ------------ diff --git a/src/pl/plpython/expected/plpython_params.out b/src/pl/plpython/expected/plpython_params.out index 46ea7dfb90..d1a36f3623 100644 --- a/src/pl/plpython/expected/plpython_params.out +++ b/src/pl/plpython/expected/plpython_params.out @@ -3,12 +3,12 @@ -- CREATE FUNCTION test_param_names0(integer, integer) RETURNS int AS $$ return args[0] + args[1] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_param_names1(a0 integer, a1 text) RETURNS boolean AS $$ assert a0 == args[0] assert a1 == args[1] return True -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_param_names2(u users) RETURNS text AS $$ assert u == args[0] if isinstance(u, dict): @@ -19,7 +19,7 @@ if isinstance(u, dict): else: s = str(u) return s -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; -- use deliberately wrong parameter names CREATE FUNCTION test_param_names3(a0 integer) RETURNS boolean AS $$ try: @@ -28,7 +28,7 @@ try: except NameError as e: assert e.args[0].find("a1") > -1 return True -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT test_param_names0(2,7); test_param_names0 ------------------- diff --git a/src/pl/plpython/expected/plpython_quote.out b/src/pl/plpython/expected/plpython_quote.out index eed72923ae..1fbe93d535 100644 --- a/src/pl/plpython/expected/plpython_quote.out +++ b/src/pl/plpython/expected/plpython_quote.out @@ -8,7 +8,7 @@ CREATE FUNCTION quote(t text, how text) RETURNS text AS $$ return plpy.quote_ident(t) else: raise plpy.Error("unrecognized quote type %s" % how) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT quote(t, 'literal') FROM (VALUES ('abc'), ('a''bc'), diff --git a/src/pl/plpython/expected/plpython_record.out b/src/pl/plpython/expected/plpython_record.out index 458330713a..31de198582 100644 --- a/src/pl/plpython/expected/plpython_record.out +++ b/src/pl/plpython/expected/plpython_record.out @@ -23,7 +23,7 @@ elif typ == 'obj': type_record.first = first type_record.second = second return type_record -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_type_record_as(typ text, first text, second integer, retnull boolean) RETURNS type_record AS $$ if retnull: return None @@ -40,17 +40,17 @@ elif typ == 'obj': return type_record elif typ == 'str': return "('%s',%r)" % (first, second) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_in_out_params(first in text, second out text) AS $$ return first + '_in_to_out'; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_in_out_params_multi(first in text, second out text, third out text) AS $$ return (first + '_record_in_to_out_1', first + '_record_in_to_out_2'); -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_inout_params(first inout text) AS $$ return first + '_inout'; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; -- Test tuple returning functions SELECT * FROM test_table_record_as('dict', null, null, false); first | second @@ -340,7 +340,7 @@ SELECT * FROM test_type_record_as('obj', 'one', 1, false); -- errors cases CREATE FUNCTION test_type_record_error1() RETURNS type_record AS $$ return { 'first': 'first' } -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_record_error1(); ERROR: key "second" not found in mapping HINT: To return null in a column, add the value None to the mapping with the key named after the column. @@ -348,7 +348,7 @@ CONTEXT: while creating return value PL/Python function "test_type_record_error1" CREATE FUNCTION test_type_record_error2() RETURNS type_record AS $$ return [ 'first' ] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_record_error2(); ERROR: length of returned sequence did not match number of columns in row CONTEXT: while creating return value @@ -357,7 +357,7 @@ CREATE FUNCTION test_type_record_error3() RETURNS type_record AS $$ class type_record: pass type_record.first = 'first' return type_record -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_record_error3(); ERROR: attribute "second" does not exist in Python object HINT: To return null in a column, let the returned object have an attribute named after column with value None. @@ -365,7 +365,7 @@ CONTEXT: while creating return value PL/Python function "test_type_record_error3" CREATE FUNCTION test_type_record_error4() RETURNS type_record AS $$ return 'foo' -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_record_error4(); ERROR: malformed record literal: "foo" DETAIL: Missing left parenthesis. diff --git a/src/pl/plpython/expected/plpython_setof.out b/src/pl/plpython/expected/plpython_setof.out index 170dbc394d..3940940029 100644 --- a/src/pl/plpython/expected/plpython_setof.out +++ b/src/pl/plpython/expected/plpython_setof.out @@ -3,20 +3,20 @@ -- CREATE FUNCTION test_setof_error() RETURNS SETOF text AS $$ return 37 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT test_setof_error(); ERROR: returned object cannot be iterated DETAIL: PL/Python set-returning functions must return an iterable object. CONTEXT: PL/Python function "test_setof_error" CREATE FUNCTION test_setof_as_list(count integer, content text) RETURNS SETOF text AS $$ return [ content ]*count -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_setof_as_tuple(count integer, content text) RETURNS SETOF text AS $$ t = () for i in range(count): t += ( content, ) return t -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_setof_as_iterator(count integer, content text) RETURNS SETOF text AS $$ class producer: def __init__ (self, icount, icontent): @@ -24,13 +24,13 @@ class producer: self.icount = icount def __iter__ (self): return self - def next (self): + def __next__ (self): if self.icount == 0: raise StopIteration self.icount -= 1 return self.icontent return producer(count, content) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_setof_spi_in_iterator() RETURNS SETOF text AS $$ for s in ('Hello', 'Brave', 'New', 'World'): @@ -38,7 +38,7 @@ $$ yield s plpy.execute('select 2') $$ -LANGUAGE plpythonu; +LANGUAGE plpython3u; -- Test set returning functions SELECT test_setof_as_list(0, 'list'); test_setof_as_list @@ -130,7 +130,7 @@ global x while x <= lim: yield x x = x + 1 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT ugly(1, 5); ugly ------ @@ -155,7 +155,7 @@ CREATE OR REPLACE FUNCTION get_user_records() RETURNS SETOF users AS $$ return plpy.execute("SELECT * FROM users ORDER BY username") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT get_user_records(); get_user_records ---------------------- @@ -179,7 +179,7 @@ CREATE OR REPLACE FUNCTION get_user_records2() RETURNS TABLE(fname text, lname text, username text, userid int) AS $$ return plpy.execute("SELECT * FROM users ORDER BY username") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT get_user_records2(); get_user_records2 ---------------------- diff --git a/src/pl/plpython/expected/plpython_spi.out b/src/pl/plpython/expected/plpython_spi.out index a09df68c7d..8853e2540d 100644 --- a/src/pl/plpython/expected/plpython_spi.out +++ b/src/pl/plpython/expected/plpython_spi.out @@ -6,17 +6,17 @@ CREATE FUNCTION nested_call_one(a text) RETURNS text 'q = "SELECT nested_call_two(''%s'')" % a r = plpy.execute(q) return r[0]' - LANGUAGE plpythonu ; + LANGUAGE plpython3u ; CREATE FUNCTION nested_call_two(a text) RETURNS text AS 'q = "SELECT nested_call_three(''%s'')" % a r = plpy.execute(q) return r[0]' - LANGUAGE plpythonu ; + LANGUAGE plpython3u ; CREATE FUNCTION nested_call_three(a text) RETURNS text AS 'return a' - LANGUAGE plpythonu ; + LANGUAGE plpython3u ; -- some spi stuff CREATE FUNCTION spi_prepared_plan_test_one(a text) RETURNS text AS @@ -30,7 +30,7 @@ except Exception as ex: plpy.error(str(ex)) return None ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION spi_prepared_plan_test_two(a text) RETURNS text AS 'if "myplan" not in SD: @@ -43,7 +43,7 @@ except Exception as ex: plpy.error(str(ex)) return None ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION spi_prepared_plan_test_nested(a text) RETURNS text AS 'if "myplan" not in SD: @@ -57,7 +57,7 @@ except Exception as ex: plpy.error(str(ex)) return None ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION join_sequences(s sequences) RETURNS text AS 'if not s["multipart"]: @@ -69,7 +69,7 @@ for r in rv: seq = seq + r["sequence"] return seq ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION spi_recursive_sum(a int) RETURNS int AS 'r = 0 @@ -77,7 +77,7 @@ if a > 1: r = plpy.execute("SELECT spi_recursive_sum(%d) as a" % (a-1))[0]["a"] return a + r ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; -- -- spi and nested calls -- @@ -155,7 +155,7 @@ if result.status() > 0: return result.nrows() else: return None -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT result_metadata_test($$SELECT 1 AS foo, '11'::text AS bar UNION SELECT 2, '22'$$); INFO: True INFO: ['foo', 'bar'] @@ -177,7 +177,7 @@ CREATE FUNCTION result_nrows_test(cmd text) RETURNS int AS $$ result = plpy.execute(cmd) return result.nrows() -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT result_nrows_test($$SELECT 1$$); result_nrows_test ------------------- @@ -206,7 +206,7 @@ CREATE FUNCTION result_len_test(cmd text) RETURNS int AS $$ result = plpy.execute(cmd) return len(result) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT result_len_test($$SELECT 1$$); result_len_test ----------------- @@ -246,7 +246,7 @@ result[-1] = {'c': 1000} result[:2] = [{'c': 10}, {'c': 100}] plpy.info([item['c'] for item in result[:]]) -# raises TypeError, but the message differs on Python 2.6, so silence it +# raises TypeError, catch so further tests could be added try: plpy.info(result['foo']) except TypeError: @@ -254,7 +254,7 @@ except TypeError: else: assert False, "TypeError not raised" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT result_subscript_test(); INFO: 2 INFO: 4 @@ -272,7 +272,7 @@ result = plpy.execute("select 1 where false") plpy.info(result[:]) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT result_empty_test(); INFO: [] result_empty_test @@ -285,7 +285,7 @@ AS $$ plan = plpy.prepare(cmd) result = plpy.execute(plan) return str(result) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT result_str_test($$SELECT 1 AS foo UNION SELECT 2$$); result_str_test ------------------------------------------------------------ @@ -306,12 +306,12 @@ for row in res: if row['lname'] == 'doe': does += 1 return does -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION double_cursor_close() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users") res.close() res.close() -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_fetch() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users") assert len(res.fetch(3)) == 3 @@ -329,7 +329,7 @@ except StopIteration: pass else: assert False, "StopIteration not raised" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_mix_next_and_fetch() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users order by fname") assert len(res.fetch(2)) == 2 @@ -342,7 +342,7 @@ except AttributeError: assert item['fname'] == 'rick' assert len(res.fetch(2)) == 1 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION fetch_after_close() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users") res.close() @@ -352,7 +352,7 @@ except ValueError: pass else: assert False, "ValueError not raised" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION next_after_close() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users") res.close() @@ -365,7 +365,7 @@ except ValueError: pass else: assert False, "ValueError not raised" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_fetch_next_empty() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users where false") assert len(res.fetch(1)) == 0 @@ -378,7 +378,7 @@ except StopIteration: pass else: assert False, "StopIteration not raised" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_plan() RETURNS SETOF text AS $$ plan = plpy.prepare( "select fname, lname from users where fname like $1 || '%' order by fname", @@ -387,12 +387,12 @@ for row in plpy.cursor(plan, ["w"]): yield row['fname'] for row in plan.cursor(["j"]): yield row['fname'] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_plan_wrong_args() RETURNS SETOF text AS $$ plan = plpy.prepare("select fname, lname from users where fname like $1 || '%'", ["text"]) c = plpy.cursor(plan, ["a", "b"]) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TYPE test_composite_type AS ( a1 int, a2 varchar @@ -401,7 +401,7 @@ CREATE OR REPLACE FUNCTION plan_composite_args() RETURNS test_composite_type AS plan = plpy.prepare("select $1 as c1", ["test_composite_type"]) res = plpy.execute(plan, [{"a1": 3, "a2": "label"}]) return res[0]["c1"] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT simple_cursor_test(); simple_cursor_test -------------------- diff --git a/src/pl/plpython/expected/plpython_subtransaction.out b/src/pl/plpython/expected/plpython_subtransaction.out index 2a56541917..43d9277a33 100644 --- a/src/pl/plpython/expected/plpython_subtransaction.out +++ b/src/pl/plpython/expected/plpython_subtransaction.out @@ -14,7 +14,7 @@ with plpy.subtransaction(): plpy.execute("INSERT INTO subtransaction_tbl VALUES ('oops')") elif what_error == "Python": raise Exception("Python exception") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT subtransaction_ctx_test(); subtransaction_ctx_test ------------------------- @@ -71,7 +71,7 @@ with plpy.subtransaction(): raise plpy.notice("Swallowed %s(%r)" % (e.__class__.__name__, e.args[0])) return "ok" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT subtransaction_nested_test(); ERROR: spiexceptions.SyntaxError: syntax error at or near "error" LINE 1: error @@ -111,7 +111,7 @@ with plpy.subtransaction(): plpy.execute("INSERT INTO subtransaction_tbl VALUES (2)") plpy.execute("SELECT subtransaction_nested_test('t')") return "ok" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT subtransaction_deeply_nested_test(); NOTICE: Swallowed SyntaxError('syntax error at or near "error"') subtransaction_deeply_nested_test @@ -133,42 +133,42 @@ TRUNCATE subtransaction_tbl; CREATE FUNCTION subtransaction_exit_without_enter() RETURNS void AS $$ plpy.subtransaction().__exit__(None, None, None) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION subtransaction_enter_without_exit() RETURNS void AS $$ plpy.subtransaction().__enter__() -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION subtransaction_exit_twice() RETURNS void AS $$ plpy.subtransaction().__enter__() plpy.subtransaction().__exit__(None, None, None) plpy.subtransaction().__exit__(None, None, None) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION subtransaction_enter_twice() RETURNS void AS $$ plpy.subtransaction().__enter__() plpy.subtransaction().__enter__() -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION subtransaction_exit_same_subtransaction_twice() RETURNS void AS $$ s = plpy.subtransaction() s.__enter__() s.__exit__(None, None, None) s.__exit__(None, None, None) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION subtransaction_enter_same_subtransaction_twice() RETURNS void AS $$ s = plpy.subtransaction() s.__enter__() s.__enter__() s.__exit__(None, None, None) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; -- No warnings here, as the subtransaction gets indeed closed CREATE FUNCTION subtransaction_enter_subtransaction_in_with() RETURNS void AS $$ with plpy.subtransaction() as s: s.__enter__() -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION subtransaction_exit_subtransaction_in_with() RETURNS void AS $$ try: @@ -176,7 +176,7 @@ try: s.__exit__(None, None, None) except ValueError as e: raise ValueError(e) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT subtransaction_exit_without_enter(); ERROR: ValueError: this subtransaction has not been entered CONTEXT: Traceback (most recent call last): @@ -255,7 +255,7 @@ try: plpy.execute(p, ["wrong"]) except plpy.SPIError: plpy.warning("Caught a SPI error") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT subtransaction_mix_explicit_and_implicit(); WARNING: Caught a SPI error from an explicit subtransaction WARNING: Caught a SPI error @@ -278,7 +278,7 @@ AS $$ s = plpy.subtransaction() s.enter() s.exit(None, None, None) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT subtransaction_alternative_names(); subtransaction_alternative_names ---------------------------------- @@ -294,7 +294,7 @@ with plpy.subtransaction(): plpy.execute("INSERT INTO subtransaction_tbl VALUES ('a')") except plpy.SPIError: plpy.notice("caught") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT try_catch_inside_subtransaction(); NOTICE: caught try_catch_inside_subtransaction @@ -318,7 +318,7 @@ with plpy.subtransaction(): plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)") except plpy.SPIError: plpy.notice("caught") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT pk_violation_inside_subtransaction(); NOTICE: caught pk_violation_inside_subtransaction @@ -340,7 +340,7 @@ with plpy.subtransaction(): cur.fetch(10) fetched = cur.fetch(10); return int(fetched[5]["i"]) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_aborted_subxact() RETURNS int AS $$ try: with plpy.subtransaction(): @@ -351,7 +351,7 @@ except plpy.SPIError: fetched = cur.fetch(10) return int(fetched[5]["i"]) return 0 # not reached -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_plan_aborted_subxact() RETURNS int AS $$ try: with plpy.subtransaction(): @@ -364,7 +364,7 @@ except plpy.SPIError: fetched = cur.fetch(5) return fetched[2]["i"] return 0 # not reached -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_close_aborted_subxact() RETURNS boolean AS $$ try: with plpy.subtransaction(): @@ -374,7 +374,7 @@ except plpy.SPIError: cur.close() return True return False # not reached -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT cursor_in_subxact(); cursor_in_subxact ------------------- diff --git a/src/pl/plpython/expected/plpython_test.out b/src/pl/plpython/expected/plpython_test.out index 39b994f446..13c14119c0 100644 --- a/src/pl/plpython/expected/plpython_test.out +++ b/src/pl/plpython/expected/plpython_test.out @@ -1,7 +1,7 @@ -- first some tests of basic functionality -CREATE EXTENSION plpython2u; +CREATE EXTENSION plpython3u; -- really stupid function just to get the module loaded -CREATE FUNCTION stupid() RETURNS text AS 'return "zarkon"' LANGUAGE plpythonu; +CREATE FUNCTION stupid() RETURNS text AS 'return "zarkon"' LANGUAGE plpython3u; select stupid(); stupid -------- @@ -9,7 +9,7 @@ select stupid(); (1 row) -- check 2/3 versioning -CREATE FUNCTION stupidn() RETURNS text AS 'return "zarkon"' LANGUAGE plpython2u; +CREATE FUNCTION stupidn() RETURNS text AS 'return "zarkon"' LANGUAGE plpython3u; select stupidn(); stupidn --------- @@ -26,7 +26,7 @@ for key in keys: out.append("%s: %s" % (key, u[key])) words = a1 + " " + a2 + " => {" + ", ".join(out) + "}" return words' - LANGUAGE plpythonu; + LANGUAGE plpython3u; select "Argument test #1"(users, fname, lname) from users where lname = 'doe' order by 1; Argument test #1 ----------------------------------------------------------------------- @@ -41,7 +41,7 @@ $$ contents = list(filter(lambda x: not x.startswith("__"), dir(plpy))) contents.sort() return contents -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select module_contents(); module_contents ----------------- @@ -78,7 +78,7 @@ plpy.info('info', 37, [1, 2, 3]) plpy.notice('notice') plpy.warning('warning') plpy.error('error') -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT elog_test_basic(); INFO: info INFO: 37 diff --git a/src/pl/plpython/expected/plpython_transaction.out b/src/pl/plpython/expected/plpython_transaction.out index 72d1e45a76..659ccefc79 100644 --- a/src/pl/plpython/expected/plpython_transaction.out +++ b/src/pl/plpython/expected/plpython_transaction.out @@ -1,6 +1,6 @@ CREATE TABLE test1 (a int, b text); CREATE PROCEDURE transaction_test1() -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ for i in range(0, 10): plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i) @@ -22,7 +22,7 @@ SELECT * FROM test1; TRUNCATE test1; DO -LANGUAGE plpythonu +LANGUAGE plpython3u $$ for i in range(0, 10): plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i) @@ -44,7 +44,7 @@ SELECT * FROM test1; TRUNCATE test1; -- not allowed in a function CREATE FUNCTION transaction_test2() RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ for i in range(0, 10): plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i) @@ -67,7 +67,7 @@ SELECT * FROM test1; -- also not allowed if procedure is called from a function CREATE FUNCTION transaction_test3() RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ plpy.execute("CALL transaction_test1()") return 1 @@ -85,19 +85,19 @@ SELECT * FROM test1; -- DO block inside function CREATE FUNCTION transaction_test4() RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ -plpy.execute("DO LANGUAGE plpythonu $x$ plpy.commit() $x$") +plpy.execute("DO LANGUAGE plpython3u $x$ plpy.commit() $x$") return 1 $$; SELECT transaction_test4(); ERROR: spiexceptions.InvalidTransactionTermination: spiexceptions.InvalidTransactionTermination: invalid transaction termination CONTEXT: Traceback (most recent call last): PL/Python function "transaction_test4", line 2, in - plpy.execute("DO LANGUAGE plpythonu $x$ plpy.commit() $x$") + plpy.execute("DO LANGUAGE plpython3u $x$ plpy.commit() $x$") PL/Python function "transaction_test4" -- commit inside subtransaction (prohibited) -DO LANGUAGE plpythonu $$ +DO LANGUAGE plpython3u $$ s = plpy.subtransaction() s.enter() plpy.commit() @@ -112,7 +112,7 @@ PL/Python anonymous code block CREATE TABLE test2 (x int); INSERT INTO test2 VALUES (0), (1), (2), (3), (4); TRUNCATE test1; -DO LANGUAGE plpythonu $$ +DO LANGUAGE plpython3u $$ for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"): plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x']) plpy.commit() @@ -135,7 +135,7 @@ SELECT * FROM pg_cursors; -- error in cursor loop with commit TRUNCATE test1; -DO LANGUAGE plpythonu $$ +DO LANGUAGE plpython3u $$ for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"): plpy.execute("INSERT INTO test1 (a) VALUES (12/(%s-2))" % row['x']) plpy.commit() @@ -159,7 +159,7 @@ SELECT * FROM pg_cursors; -- rollback inside cursor loop TRUNCATE test1; -DO LANGUAGE plpythonu $$ +DO LANGUAGE plpython3u $$ for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"): plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x']) plpy.rollback() @@ -176,7 +176,7 @@ SELECT * FROM pg_cursors; -- first commit then rollback inside cursor loop TRUNCATE test1; -DO LANGUAGE plpythonu $$ +DO LANGUAGE plpython3u $$ for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"): plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x']) if row['x'] % 2 == 0: @@ -200,7 +200,7 @@ SELECT * FROM pg_cursors; -- check handling of an error during COMMIT CREATE TABLE testpk (id int PRIMARY KEY); CREATE TABLE testfk(f1 int REFERENCES testpk DEFERRABLE INITIALLY DEFERRED); -DO LANGUAGE plpythonu $$ +DO LANGUAGE plpython3u $$ # this insert will fail during commit: plpy.execute("INSERT INTO testfk VALUES (0)") plpy.commit() @@ -222,7 +222,7 @@ SELECT * FROM testfk; ---- (0 rows) -DO LANGUAGE plpythonu $$ +DO LANGUAGE plpython3u $$ # this insert will fail during commit: plpy.execute("INSERT INTO testfk VALUES (0)") try: diff --git a/src/pl/plpython/expected/plpython_trigger.out b/src/pl/plpython/expected/plpython_trigger.out index 742988a5b5..dd1ca32fa4 100644 --- a/src/pl/plpython/expected/plpython_trigger.out +++ b/src/pl/plpython/expected/plpython_trigger.out @@ -15,20 +15,20 @@ if TD["new"]["fname"] == "william": TD["new"]["fname"] = TD["args"][0] rv = "MODIFY" return rv' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION users_update() returns trigger AS 'if TD["event"] == "UPDATE": if TD["old"]["fname"] != TD["new"]["fname"] and TD["old"]["fname"] == TD["args"][0]: return "SKIP" return None' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION users_delete() RETURNS trigger AS 'if TD["old"]["fname"] == TD["args"][0]: return "SKIP" return None' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE TRIGGER users_insert_trig BEFORE INSERT ON users FOR EACH ROW EXECUTE PROCEDURE users_insert ('willem'); CREATE TRIGGER users_update_trig BEFORE UPDATE ON users FOR EACH ROW @@ -71,7 +71,7 @@ CREATE TABLE trigger_test_generated ( i int, j int GENERATED ALWAYS AS (i * 2) STORED ); -CREATE FUNCTION trigger_data() RETURNS trigger LANGUAGE plpythonu AS $$ +CREATE FUNCTION trigger_data() RETURNS trigger LANGUAGE plpython3u AS $$ if 'relid' in TD: TD['relid'] = "bogus:12345" @@ -328,7 +328,7 @@ INSERT INTO trigger_test VALUES (0, 'zero'); CREATE FUNCTION stupid1() RETURNS trigger AS $$ return 37 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger1 BEFORE INSERT ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid1(); @@ -341,7 +341,7 @@ DROP TRIGGER stupid_trigger1 ON trigger_test; CREATE FUNCTION stupid2() RETURNS trigger AS $$ return "MODIFY" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger2 BEFORE DELETE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid2(); @@ -353,7 +353,7 @@ INSERT INTO trigger_test VALUES (0, 'zero'); CREATE FUNCTION stupid3() RETURNS trigger AS $$ return "foo" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger3 BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid3(); @@ -365,8 +365,8 @@ DROP TRIGGER stupid_trigger3 ON trigger_test; -- Unicode variant CREATE FUNCTION stupid3u() RETURNS trigger AS $$ - return u"foo" -$$ LANGUAGE plpythonu; + return "foo" +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger3 BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid3u(); @@ -380,7 +380,7 @@ CREATE FUNCTION stupid4() RETURNS trigger AS $$ del TD["new"] return "MODIFY"; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger4 BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid4(); @@ -394,7 +394,7 @@ CREATE FUNCTION stupid5() RETURNS trigger AS $$ TD["new"] = ['foo', 'bar'] return "MODIFY"; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger5 BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid5(); @@ -408,7 +408,7 @@ CREATE FUNCTION stupid6() RETURNS trigger AS $$ TD["new"] = {1: 'foo', 2: 'bar'} return "MODIFY"; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger6 BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid6(); @@ -422,7 +422,7 @@ CREATE FUNCTION stupid7() RETURNS trigger AS $$ TD["new"] = {'v': 'foo', 'a': 'bar'} return "MODIFY"; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger7 BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid7(); @@ -434,9 +434,9 @@ DROP TRIGGER stupid_trigger7 ON trigger_test; -- Unicode variant CREATE FUNCTION stupid7u() RETURNS trigger AS $$ - TD["new"] = {u'v': 'foo', u'a': 'bar'} + TD["new"] = {'v': 'foo', 'a': 'bar'} return "MODIFY" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger7 BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid7u(); @@ -461,7 +461,7 @@ CREATE FUNCTION test_null() RETURNS trigger AS $$ TD["new"]['v'] = None return "MODIFY" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER test_null_trigger BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE test_null(); @@ -481,7 +481,7 @@ SET DateStyle = 'ISO'; CREATE FUNCTION set_modif_time() RETURNS trigger AS $$ TD['new']['modif_time'] = '2010-10-13 21:57:28.930486' return 'MODIFY' -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TABLE pb (a TEXT, modif_time TIMESTAMP(0) WITHOUT TIME ZONE); CREATE TRIGGER set_modif_time BEFORE UPDATE ON pb FOR EACH ROW EXECUTE PROCEDURE set_modif_time(); @@ -507,7 +507,7 @@ CREATE FUNCTION composite_trigger_f() RETURNS trigger AS $$ TD['new']['f1'] = (3, False) TD['new']['f2'] = {'k': 7, 'l': 'yes', 'ignored': 10} return 'MODIFY' -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER composite_trigger BEFORE INSERT ON composite_trigger_test FOR EACH ROW EXECUTE PROCEDURE composite_trigger_f(); INSERT INTO composite_trigger_test VALUES (NULL, NULL); @@ -521,7 +521,7 @@ SELECT * FROM composite_trigger_test; CREATE TABLE composite_trigger_noop_test (f1 comp1, f2 comp2); CREATE FUNCTION composite_trigger_noop_f() RETURNS trigger AS $$ return 'MODIFY' -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER composite_trigger_noop BEFORE INSERT ON composite_trigger_noop_test FOR EACH ROW EXECUTE PROCEDURE composite_trigger_noop_f(); INSERT INTO composite_trigger_noop_test VALUES (NULL, NULL); @@ -540,7 +540,7 @@ CREATE TYPE comp3 AS (c1 comp1, c2 comp2, m integer); CREATE TABLE composite_trigger_nested_test(c comp3); CREATE FUNCTION composite_trigger_nested_f() RETURNS trigger AS $$ return 'MODIFY' -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER composite_trigger_nested BEFORE INSERT ON composite_trigger_nested_test FOR EACH ROW EXECUTE PROCEDURE composite_trigger_nested_f(); INSERT INTO composite_trigger_nested_test VALUES (NULL); @@ -555,7 +555,7 @@ SELECT * FROM composite_trigger_nested_test; (3 rows) -- check that using a function as a trigger over two tables works correctly -CREATE FUNCTION trig1234() RETURNS trigger LANGUAGE plpythonu AS $$ +CREATE FUNCTION trig1234() RETURNS trigger LANGUAGE plpython3u AS $$ TD["new"]["data"] = '1234' return 'MODIFY' $$; @@ -581,7 +581,7 @@ SELECT * FROM b; -- check that SQL run in trigger code can see transition tables CREATE TABLE transition_table_test (id int, name text); INSERT INTO transition_table_test VALUES (1, 'a'); -CREATE FUNCTION transition_table_test_f() RETURNS trigger LANGUAGE plpythonu AS +CREATE FUNCTION transition_table_test_f() RETURNS trigger LANGUAGE plpython3u AS $$ rv = plpy.execute("SELECT * FROM old_table") assert(rv.nrows() == 1) @@ -601,7 +601,7 @@ DROP TABLE transition_table_test; DROP FUNCTION transition_table_test_f(); -- dealing with generated columns CREATE FUNCTION generated_test_func1() RETURNS trigger -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ TD['new']['j'] = 5 # not allowed return 'MODIFY' diff --git a/src/pl/plpython/expected/plpython_types.out b/src/pl/plpython/expected/plpython_types.out index 0a2659fe29..a470911c2e 100644 --- a/src/pl/plpython/expected/plpython_types.out +++ b/src/pl/plpython/expected/plpython_types.out @@ -7,23 +7,23 @@ CREATE FUNCTION test_type_conversion_bool(x bool) RETURNS bool AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_bool(true); -INFO: (True, ) +INFO: (True, ) test_type_conversion_bool --------------------------- t (1 row) SELECT * FROM test_type_conversion_bool(false); -INFO: (False, ) +INFO: (False, ) test_type_conversion_bool --------------------------- f (1 row) SELECT * FROM test_type_conversion_bool(null); -INFO: (None, ) +INFO: (None, ) test_type_conversion_bool --------------------------- @@ -48,7 +48,7 @@ elif n == 5: ret = [0] plpy.info(ret, not not ret) return ret -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_bool_other(0); INFO: (0, False) test_type_conversion_bool_other @@ -94,16 +94,16 @@ INFO: ([0], True) CREATE FUNCTION test_type_conversion_char(x char) RETURNS char AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_char('a'); -INFO: ('a', ) +INFO: ('a', ) test_type_conversion_char --------------------------- a (1 row) SELECT * FROM test_type_conversion_char(null); -INFO: (None, ) +INFO: (None, ) test_type_conversion_char --------------------------- @@ -112,23 +112,23 @@ INFO: (None, ) CREATE FUNCTION test_type_conversion_int2(x int2) RETURNS int2 AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_int2(100::int2); -INFO: (100, ) +INFO: (100, ) test_type_conversion_int2 --------------------------- 100 (1 row) SELECT * FROM test_type_conversion_int2(-100::int2); -INFO: (-100, ) +INFO: (-100, ) test_type_conversion_int2 --------------------------- -100 (1 row) SELECT * FROM test_type_conversion_int2(null); -INFO: (None, ) +INFO: (None, ) test_type_conversion_int2 --------------------------- @@ -137,23 +137,23 @@ INFO: (None, ) CREATE FUNCTION test_type_conversion_int4(x int4) RETURNS int4 AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_int4(100); -INFO: (100, ) +INFO: (100, ) test_type_conversion_int4 --------------------------- 100 (1 row) SELECT * FROM test_type_conversion_int4(-100); -INFO: (-100, ) +INFO: (-100, ) test_type_conversion_int4 --------------------------- -100 (1 row) SELECT * FROM test_type_conversion_int4(null); -INFO: (None, ) +INFO: (None, ) test_type_conversion_int4 --------------------------- @@ -162,30 +162,30 @@ INFO: (None, ) CREATE FUNCTION test_type_conversion_int8(x int8) RETURNS int8 AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_int8(100); -INFO: (100L, ) +INFO: (100, ) test_type_conversion_int8 --------------------------- 100 (1 row) SELECT * FROM test_type_conversion_int8(-100); -INFO: (-100L, ) +INFO: (-100, ) test_type_conversion_int8 --------------------------- -100 (1 row) SELECT * FROM test_type_conversion_int8(5000000000); -INFO: (5000000000L, ) +INFO: (5000000000, ) test_type_conversion_int8 --------------------------- 5000000000 (1 row) SELECT * FROM test_type_conversion_int8(null); -INFO: (None, ) +INFO: (None, ) test_type_conversion_int8 --------------------------- @@ -196,7 +196,7 @@ CREATE FUNCTION test_type_conversion_numeric(x numeric) RETURNS numeric AS $$ # between decimal and cdecimal plpy.info(str(x), x.__class__.__name__) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_numeric(100); INFO: ('100', 'Decimal') test_type_conversion_numeric @@ -256,30 +256,30 @@ INFO: ('None', 'NoneType') CREATE FUNCTION test_type_conversion_float4(x float4) RETURNS float4 AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_float4(100); -INFO: (100.0, ) +INFO: (100.0, ) test_type_conversion_float4 ----------------------------- 100 (1 row) SELECT * FROM test_type_conversion_float4(-100); -INFO: (-100.0, ) +INFO: (-100.0, ) test_type_conversion_float4 ----------------------------- -100 (1 row) SELECT * FROM test_type_conversion_float4(5000.5); -INFO: (5000.5, ) +INFO: (5000.5, ) test_type_conversion_float4 ----------------------------- 5000.5 (1 row) SELECT * FROM test_type_conversion_float4(null); -INFO: (None, ) +INFO: (None, ) test_type_conversion_float4 ----------------------------- @@ -288,37 +288,37 @@ INFO: (None, ) CREATE FUNCTION test_type_conversion_float8(x float8) RETURNS float8 AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_float8(100); -INFO: (100.0, ) +INFO: (100.0, ) test_type_conversion_float8 ----------------------------- 100 (1 row) SELECT * FROM test_type_conversion_float8(-100); -INFO: (-100.0, ) +INFO: (-100.0, ) test_type_conversion_float8 ----------------------------- -100 (1 row) SELECT * FROM test_type_conversion_float8(5000000000.5); -INFO: (5000000000.5, ) +INFO: (5000000000.5, ) test_type_conversion_float8 ----------------------------- 5000000000.5 (1 row) SELECT * FROM test_type_conversion_float8(null); -INFO: (None, ) +INFO: (None, ) test_type_conversion_float8 ----------------------------- (1 row) SELECT * FROM test_type_conversion_float8(100100100.654321); -INFO: (100100100.654321, ) +INFO: (100100100.654321, ) test_type_conversion_float8 ----------------------------- 100100100.654321 @@ -327,23 +327,23 @@ INFO: (100100100.654321, ) CREATE FUNCTION test_type_conversion_oid(x oid) RETURNS oid AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_oid(100); -INFO: (100L, ) +INFO: (100, ) test_type_conversion_oid -------------------------- 100 (1 row) SELECT * FROM test_type_conversion_oid(2147483649); -INFO: (2147483649L, ) +INFO: (2147483649, ) test_type_conversion_oid -------------------------- 2147483649 (1 row) SELECT * FROM test_type_conversion_oid(null); -INFO: (None, ) +INFO: (None, ) test_type_conversion_oid -------------------------- @@ -352,16 +352,16 @@ INFO: (None, ) CREATE FUNCTION test_type_conversion_text(x text) RETURNS text AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_text('hello world'); -INFO: ('hello world', ) +INFO: ('hello world', ) test_type_conversion_text --------------------------- hello world (1 row) SELECT * FROM test_type_conversion_text(null); -INFO: (None, ) +INFO: (None, ) test_type_conversion_text --------------------------- @@ -370,23 +370,23 @@ INFO: (None, ) CREATE FUNCTION test_type_conversion_bytea(x bytea) RETURNS bytea AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_bytea('hello world'); -INFO: ('hello world', ) +INFO: (b'hello world', ) test_type_conversion_bytea ---------------------------- \x68656c6c6f20776f726c64 (1 row) SELECT * FROM test_type_conversion_bytea(E'null\\000byte'); -INFO: ('null\x00byte', ) +INFO: (b'null\x00byte', ) test_type_conversion_bytea ---------------------------- \x6e756c6c0062797465 (1 row) SELECT * FROM test_type_conversion_bytea(null); -INFO: (None, ) +INFO: (None, ) test_type_conversion_bytea ---------------------------- @@ -395,14 +395,14 @@ INFO: (None, ) CREATE FUNCTION test_type_marshal() RETURNS bytea AS $$ import marshal return marshal.dumps('hello world') -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_type_unmarshal(x bytea) RETURNS text AS $$ import marshal try: return marshal.loads(x) except ValueError as e: return 'FAILED: ' + str(e) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT test_type_unmarshal(x) FROM test_type_marshal() x; test_type_unmarshal --------------------- @@ -415,7 +415,7 @@ SELECT test_type_unmarshal(x) FROM test_type_marshal() x; CREATE DOMAIN booltrue AS bool CHECK (VALUE IS TRUE OR VALUE IS NULL); CREATE FUNCTION test_type_conversion_booltrue(x booltrue, y bool) RETURNS booltrue AS $$ return y -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_booltrue(true, true); test_type_conversion_booltrue ------------------------------- @@ -432,21 +432,21 @@ CREATE DOMAIN uint2 AS int2 CHECK (VALUE >= 0); CREATE FUNCTION test_type_conversion_uint2(x uint2, y int) RETURNS uint2 AS $$ plpy.info(x, type(x)) return y -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_uint2(100::uint2, 50); -INFO: (100, ) +INFO: (100, ) test_type_conversion_uint2 ---------------------------- 50 (1 row) SELECT * FROM test_type_conversion_uint2(100::uint2, -50); -INFO: (100, ) +INFO: (100, ) ERROR: value for domain uint2 violates check constraint "uint2_check" CONTEXT: while creating return value PL/Python function "test_type_conversion_uint2" SELECT * FROM test_type_conversion_uint2(null, 1); -INFO: (None, ) +INFO: (None, ) test_type_conversion_uint2 ---------------------------- 1 @@ -455,7 +455,7 @@ INFO: (None, ) CREATE DOMAIN nnint AS int CHECK (VALUE IS NOT NULL); CREATE FUNCTION test_type_conversion_nnint(x nnint, y int) RETURNS nnint AS $$ return y -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_nnint(10, 20); test_type_conversion_nnint ---------------------------- @@ -472,9 +472,9 @@ CREATE DOMAIN bytea10 AS bytea CHECK (octet_length(VALUE) = 10 AND VALUE IS NOT CREATE FUNCTION test_type_conversion_bytea10(x bytea10, y bytea) RETURNS bytea10 AS $$ plpy.info(x, type(x)) return y -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_bytea10('hello wold', 'hello wold'); -INFO: ('hello wold', ) +INFO: (b'hello wold', ) test_type_conversion_bytea10 ------------------------------ \x68656c6c6f20776f6c64 @@ -483,14 +483,14 @@ INFO: ('hello wold', ) SELECT * FROM test_type_conversion_bytea10('hello world', 'hello wold'); ERROR: value for domain bytea10 violates check constraint "bytea10_check" SELECT * FROM test_type_conversion_bytea10('hello word', 'hello world'); -INFO: ('hello word', ) +INFO: (b'hello word', ) ERROR: value for domain bytea10 violates check constraint "bytea10_check" CONTEXT: while creating return value PL/Python function "test_type_conversion_bytea10" SELECT * FROM test_type_conversion_bytea10(null, 'hello word'); ERROR: value for domain bytea10 violates check constraint "bytea10_check" SELECT * FROM test_type_conversion_bytea10('hello word', null); -INFO: ('hello word', ) +INFO: (b'hello word', ) ERROR: value for domain bytea10 violates check constraint "bytea10_check" CONTEXT: while creating return value PL/Python function "test_type_conversion_bytea10" @@ -500,58 +500,58 @@ PL/Python function "test_type_conversion_bytea10" CREATE FUNCTION test_type_conversion_array_int4(x int4[]) RETURNS int4[] AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_int4(ARRAY[0, 100]); -INFO: ([0, 100], ) +INFO: ([0, 100], ) test_type_conversion_array_int4 --------------------------------- {0,100} (1 row) SELECT * FROM test_type_conversion_array_int4(ARRAY[0,-100,55]); -INFO: ([0, -100, 55], ) +INFO: ([0, -100, 55], ) test_type_conversion_array_int4 --------------------------------- {0,-100,55} (1 row) SELECT * FROM test_type_conversion_array_int4(ARRAY[NULL,1]); -INFO: ([None, 1], ) +INFO: ([None, 1], ) test_type_conversion_array_int4 --------------------------------- {NULL,1} (1 row) SELECT * FROM test_type_conversion_array_int4(ARRAY[]::integer[]); -INFO: ([], ) +INFO: ([], ) test_type_conversion_array_int4 --------------------------------- {} (1 row) SELECT * FROM test_type_conversion_array_int4(NULL); -INFO: (None, ) +INFO: (None, ) test_type_conversion_array_int4 --------------------------------- (1 row) SELECT * FROM test_type_conversion_array_int4(ARRAY[[1,2,3],[4,5,6]]); -INFO: ([[1, 2, 3], [4, 5, 6]], ) +INFO: ([[1, 2, 3], [4, 5, 6]], ) test_type_conversion_array_int4 --------------------------------- {{1,2,3},{4,5,6}} (1 row) SELECT * FROM test_type_conversion_array_int4(ARRAY[[[1,2,NULL],[NULL,5,6]],[[NULL,8,9],[10,11,12]]]); -INFO: ([[[1, 2, None], [None, 5, 6]], [[None, 8, 9], [10, 11, 12]]], ) +INFO: ([[[1, 2, None], [None, 5, 6]], [[None, 8, 9], [10, 11, 12]]], ) test_type_conversion_array_int4 --------------------------------------------------- {{{1,2,NULL},{NULL,5,6}},{{NULL,8,9},{10,11,12}}} (1 row) SELECT * FROM test_type_conversion_array_int4('[2:4]={1,2,3}'); -INFO: ([1, 2, 3], ) +INFO: ([1, 2, 3], ) test_type_conversion_array_int4 --------------------------------- {1,2,3} @@ -560,9 +560,9 @@ INFO: ([1, 2, 3], ) CREATE FUNCTION test_type_conversion_array_int8(x int8[]) RETURNS int8[] AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_int8(ARRAY[[[1,2,NULL],[NULL,5,6]],[[NULL,8,9],[10,11,12]]]::int8[]); -INFO: ([[[1L, 2L, None], [None, 5L, 6L]], [[None, 8L, 9L], [10L, 11L, 12L]]], ) +INFO: ([[[1, 2, None], [None, 5, 6]], [[None, 8, 9], [10, 11, 12]]], ) test_type_conversion_array_int8 --------------------------------------------------- {{{1,2,NULL},{NULL,5,6}},{{NULL,8,9},{10,11,12}}} @@ -571,10 +571,10 @@ INFO: ([[[1L, 2L, None], [None, 5L, 6L]], [[None, 8L, 9L], [10L, 11L, 12L]]], < CREATE FUNCTION test_type_conversion_array_date(x date[]) RETURNS date[] AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_date(ARRAY[[['2016-09-21','2016-09-22',NULL],[NULL,'2016-10-21','2016-10-22']], [[NULL,'2016-11-21','2016-10-21'],['2015-09-21','2015-09-22','2014-09-21']]]::date[]); -INFO: ([[['09-21-2016', '09-22-2016', None], [None, '10-21-2016', '10-22-2016']], [[None, '11-21-2016', '10-21-2016'], ['09-21-2015', '09-22-2015', '09-21-2014']]], ) +INFO: ([[['09-21-2016', '09-22-2016', None], [None, '10-21-2016', '10-22-2016']], [[None, '11-21-2016', '10-21-2016'], ['09-21-2015', '09-22-2015', '09-21-2014']]], ) test_type_conversion_array_date --------------------------------------------------------------------------------------------------------------------------------- {{{09-21-2016,09-22-2016,NULL},{NULL,10-21-2016,10-22-2016}},{{NULL,11-21-2016,10-21-2016},{09-21-2015,09-22-2015,09-21-2014}}} @@ -583,12 +583,12 @@ INFO: ([[['09-21-2016', '09-22-2016', None], [None, '10-21-2016', '10-22-2016'] CREATE FUNCTION test_type_conversion_array_timestamp(x timestamp[]) RETURNS timestamp[] AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_timestamp(ARRAY[[['2016-09-21 15:34:24.078792-04','2016-10-22 11:34:24.078795-04',NULL], [NULL,'2016-10-21 11:34:25.078792-04','2016-10-21 11:34:24.098792-04']], [[NULL,'2016-01-21 11:34:24.078792-04','2016-11-21 11:34:24.108792-04'], ['2015-09-21 11:34:24.079792-04','2014-09-21 11:34:24.078792-04','2013-09-21 11:34:24.078792-04']]]::timestamp[]); -INFO: ([[['Wed Sep 21 15:34:24.078792 2016', 'Sat Oct 22 11:34:24.078795 2016', None], [None, 'Fri Oct 21 11:34:25.078792 2016', 'Fri Oct 21 11:34:24.098792 2016']], [[None, 'Thu Jan 21 11:34:24.078792 2016', 'Mon Nov 21 11:34:24.108792 2016'], ['Mon Sep 21 11:34:24.079792 2015', 'Sun Sep 21 11:34:24.078792 2014', 'Sat Sep 21 11:34:24.078792 2013']]], ) +INFO: ([[['Wed Sep 21 15:34:24.078792 2016', 'Sat Oct 22 11:34:24.078795 2016', None], [None, 'Fri Oct 21 11:34:25.078792 2016', 'Fri Oct 21 11:34:24.098792 2016']], [[None, 'Thu Jan 21 11:34:24.078792 2016', 'Mon Nov 21 11:34:24.108792 2016'], ['Mon Sep 21 11:34:24.079792 2015', 'Sun Sep 21 11:34:24.078792 2014', 'Sat Sep 21 11:34:24.078792 2013']]], ) test_type_conversion_array_timestamp ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ {{{"Wed Sep 21 15:34:24.078792 2016","Sat Oct 22 11:34:24.078795 2016",NULL},{NULL,"Fri Oct 21 11:34:25.078792 2016","Fri Oct 21 11:34:24.098792 2016"}},{{NULL,"Thu Jan 21 11:34:24.078792 2016","Mon Nov 21 11:34:24.108792 2016"},{"Mon Sep 21 11:34:24.079792 2015","Sun Sep 21 11:34:24.078792 2014","Sat Sep 21 11:34:24.078792 2013"}}} @@ -598,9 +598,9 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemint4(h int4, i int4, j int4, k int4 ) m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)] plpy.info(m, type(m)) return m -$BODY$ LANGUAGE plpythonu; +$BODY$ LANGUAGE plpython3u; select pyreturnmultidemint4(8,5,3,2); -INFO: ([[[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]]], [[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]]]], ) +INFO: ([[[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]]], [[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]]]], ) pyreturnmultidemint4 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {{{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}}},{{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}}}} @@ -610,9 +610,9 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemint8(h int4, i int4, j int4, k int4 ) m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)] plpy.info(m, type(m)) return m -$BODY$ LANGUAGE plpythonu; +$BODY$ LANGUAGE plpython3u; select pyreturnmultidemint8(5,5,3,2); -INFO: ([[[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]], [[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]]], ) +INFO: ([[[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]], [[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]]], ) pyreturnmultidemint8 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {{{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}}},{{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}}}} @@ -622,9 +622,9 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemfloat4(h int4, i int4, j int4, k int4 m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)] plpy.info(m, type(m)) return m -$BODY$ LANGUAGE plpythonu; +$BODY$ LANGUAGE plpython3u; select pyreturnmultidemfloat4(6,5,3,2); -INFO: ([[[[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]]], [[[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]]]], ) +INFO: ([[[[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]]], [[[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]]]], ) pyreturnmultidemfloat4 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {{{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}}},{{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}}}} @@ -634,9 +634,9 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemfloat8(h int4, i int4, j int4, k int4 m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)] plpy.info(m, type(m)) return m -$BODY$ LANGUAGE plpythonu; +$BODY$ LANGUAGE plpython3u; select pyreturnmultidemfloat8(7,5,3,2); -INFO: ([[[[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]]], [[[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]]]], ) +INFO: ([[[[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]]], [[[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]]]], ) pyreturnmultidemfloat8 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {{{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}}},{{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}}}} @@ -645,16 +645,16 @@ INFO: ([[[[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], CREATE FUNCTION test_type_conversion_array_text(x text[]) RETURNS text[] AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_text(ARRAY['foo', 'bar']); -INFO: (['foo', 'bar'], ) +INFO: (['foo', 'bar'], ) test_type_conversion_array_text --------------------------------- {foo,bar} (1 row) SELECT * FROM test_type_conversion_array_text(ARRAY[['foo', 'bar'],['foo2', 'bar2']]); -INFO: ([['foo', 'bar'], ['foo2', 'bar2']], ) +INFO: ([['foo', 'bar'], ['foo2', 'bar2']], ) test_type_conversion_array_text --------------------------------- {{foo,bar},{foo2,bar2}} @@ -663,9 +663,9 @@ INFO: ([['foo', 'bar'], ['foo2', 'bar2']], ) CREATE FUNCTION test_type_conversion_array_bytea(x bytea[]) RETURNS bytea[] AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_bytea(ARRAY[E'\\xdeadbeef'::bytea, NULL]); -INFO: (['\xde\xad\xbe\xef', None], ) +INFO: ([b'\xde\xad\xbe\xef', None], ) test_type_conversion_array_bytea ---------------------------------- {"\\xdeadbeef",NULL} @@ -673,7 +673,7 @@ INFO: (['\xde\xad\xbe\xef', None], ) CREATE FUNCTION test_type_conversion_array_mixed1() RETURNS text[] AS $$ return [123, 'abc'] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_mixed1(); test_type_conversion_array_mixed1 ----------------------------------- @@ -682,14 +682,14 @@ SELECT * FROM test_type_conversion_array_mixed1(); CREATE FUNCTION test_type_conversion_array_mixed2() RETURNS int[] AS $$ return [123, 'abc'] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_mixed2(); ERROR: invalid input syntax for type integer: "abc" CONTEXT: while creating return value PL/Python function "test_type_conversion_array_mixed2" CREATE FUNCTION test_type_conversion_mdarray_malformed() RETURNS int[] AS $$ return [[1,2,3],[4,5]] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_mdarray_malformed(); ERROR: wrong length of inner sequence: has length 2, but 3 was expected DETAIL: To construct a multidimensional array, the inner sequences must all have the same length. @@ -697,14 +697,14 @@ CONTEXT: while creating return value PL/Python function "test_type_conversion_mdarray_malformed" CREATE FUNCTION test_type_conversion_mdarray_toodeep() RETURNS int[] AS $$ return [[[[[[[1]]]]]]] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_mdarray_toodeep(); ERROR: number of array dimensions exceeds the maximum allowed (6) CONTEXT: while creating return value PL/Python function "test_type_conversion_mdarray_toodeep" CREATE FUNCTION test_type_conversion_array_record() RETURNS type_record[] AS $$ return [{'first': 'one', 'second': 42}, {'first': 'two', 'second': 11}] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_record(); test_type_conversion_array_record ----------------------------------- @@ -713,7 +713,7 @@ SELECT * FROM test_type_conversion_array_record(); CREATE FUNCTION test_type_conversion_array_string() RETURNS text[] AS $$ return 'abc' -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_string(); test_type_conversion_array_string ----------------------------------- @@ -722,7 +722,7 @@ SELECT * FROM test_type_conversion_array_string(); CREATE FUNCTION test_type_conversion_array_tuple() RETURNS text[] AS $$ return ('abc', 'def') -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_tuple(); test_type_conversion_array_tuple ---------------------------------- @@ -731,7 +731,7 @@ SELECT * FROM test_type_conversion_array_tuple(); CREATE FUNCTION test_type_conversion_array_error() RETURNS int[] AS $$ return 5 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_error(); ERROR: return value of function with array return type is not a Python sequence CONTEXT: while creating return value @@ -743,16 +743,16 @@ CREATE DOMAIN ordered_pair_domain AS integer[] CHECK (array_length(VALUE,1)=2 AN CREATE FUNCTION test_type_conversion_array_domain(x ordered_pair_domain) RETURNS ordered_pair_domain AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_domain(ARRAY[0, 100]::ordered_pair_domain); -INFO: ([0, 100], ) +INFO: ([0, 100], ) test_type_conversion_array_domain ----------------------------------- {0,100} (1 row) SELECT * FROM test_type_conversion_array_domain(NULL::ordered_pair_domain); -INFO: (None, ) +INFO: (None, ) test_type_conversion_array_domain ----------------------------------- @@ -760,7 +760,7 @@ INFO: (None, ) CREATE FUNCTION test_type_conversion_array_domain_check_violation() RETURNS ordered_pair_domain AS $$ return [2,1] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_domain_check_violation(); ERROR: value for domain ordered_pair_domain violates check constraint "ordered_pair_domain_check" CONTEXT: while creating return value @@ -771,9 +771,9 @@ PL/Python function "test_type_conversion_array_domain_check_violation" CREATE FUNCTION test_read_uint2_array(x uint2[]) RETURNS uint2 AS $$ plpy.info(x, type(x)) return x[0] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_read_uint2_array(array[1::uint2]); -INFO: ([1], ) +INFO: ([1], ) test_read_uint2_array ----------------------- 1 @@ -781,7 +781,7 @@ INFO: ([1], ) CREATE FUNCTION test_build_uint2_array(x int2) RETURNS uint2[] AS $$ return [x, x] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_build_uint2_array(1::int2); test_build_uint2_array ------------------------ @@ -800,7 +800,7 @@ PL/Python function "test_build_uint2_array" CREATE FUNCTION test_type_conversion_domain_array(x integer[]) RETURNS ordered_pair_domain[] AS $$ return [x, x] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_domain_array(array[2,4]); ERROR: return value of function with array return type is not a Python sequence CONTEXT: while creating return value @@ -813,9 +813,9 @@ CREATE FUNCTION test_type_conversion_domain_array2(x ordered_pair_domain) RETURNS integer AS $$ plpy.info(x, type(x)) return x[1] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_domain_array2(array[2,4]); -INFO: ([2, 4], ) +INFO: ([2, 4], ) test_type_conversion_domain_array2 ------------------------------------ 4 @@ -827,9 +827,9 @@ CREATE FUNCTION test_type_conversion_array_domain_array(x ordered_pair_domain[]) RETURNS ordered_pair_domain AS $$ plpy.info(x, type(x)) return x[0] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_array_domain_array(array[array[2,4]::ordered_pair_domain]); -INFO: ([[2, 4]], ) +INFO: ([[2, 4]], ) test_type_conversion_array_domain_array ----------------------------------------- {2,4} @@ -846,7 +846,7 @@ CREATE TABLE employee ( INSERT INTO employee VALUES ('John', 100, 10), ('Mary', 200, 10); CREATE OR REPLACE FUNCTION test_composite_table_input(e employee) RETURNS integer AS $$ return e['basesalary'] + e['bonus'] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT name, test_composite_table_input(employee.*) FROM employee; name | test_composite_table_input ------+---------------------------- @@ -876,7 +876,7 @@ CREATE TYPE named_pair AS ( ); CREATE OR REPLACE FUNCTION test_composite_type_input(p named_pair) RETURNS integer AS $$ return sum(p.values()) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT test_composite_type_input(row(1, 2)); test_composite_type_input --------------------------- @@ -896,7 +896,7 @@ SELECT test_composite_type_input(row(1, 2)); CREATE TYPE nnint_container AS (f1 int, f2 nnint); CREATE FUNCTION nnint_test(x int, y int) RETURNS nnint_container AS $$ return {'f1': x, 'f2': y} -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT nnint_test(null, 3); nnint_test ------------ @@ -913,7 +913,7 @@ PL/Python function "nnint_test" CREATE DOMAIN ordered_named_pair AS named_pair_2 CHECK((VALUE).i <= (VALUE).j); CREATE FUNCTION read_ordered_named_pair(p ordered_named_pair) RETURNS integer AS $$ return p['i'] + p['j'] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT read_ordered_named_pair(row(1, 2)); read_ordered_named_pair ------------------------- @@ -924,7 +924,7 @@ SELECT read_ordered_named_pair(row(2, 1)); -- fail ERROR: value for domain ordered_named_pair violates check constraint "ordered_named_pair_check" CREATE FUNCTION build_ordered_named_pair(i int, j int) RETURNS ordered_named_pair AS $$ return {'i': i, 'j': j} -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT build_ordered_named_pair(1,2); build_ordered_named_pair -------------------------- @@ -937,7 +937,7 @@ CONTEXT: while creating return value PL/Python function "build_ordered_named_pair" CREATE FUNCTION build_ordered_named_pairs(i int, j int) RETURNS ordered_named_pair[] AS $$ return [{'i': i, 'j': j}, {'i': i, 'j': j+1}] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT build_ordered_named_pairs(1,2); build_ordered_named_pairs --------------------------- @@ -952,7 +952,7 @@ PL/Python function "build_ordered_named_pairs" -- Prepared statements -- CREATE OR REPLACE FUNCTION test_prep_bool_input() RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ plan = plpy.prepare("SELECT CASE WHEN $1 THEN 1 ELSE 0 END AS val", ['boolean']) rv = plpy.execute(plan, ['fa'], 5) # 'fa' is true in Python @@ -965,7 +965,7 @@ SELECT test_prep_bool_input(); -- 1 (1 row) CREATE OR REPLACE FUNCTION test_prep_bool_output() RETURNS bool -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ plan = plpy.prepare("SELECT $1 = 1 AS val", ['int']) rv = plpy.execute(plan, [0], 5) @@ -980,7 +980,7 @@ INFO: {'val': False} (1 row) CREATE OR REPLACE FUNCTION test_prep_bytea_input(bb bytea) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ plan = plpy.prepare("SELECT octet_length($1) AS val", ['bytea']) rv = plpy.execute(plan, [bb], 5) @@ -993,7 +993,7 @@ SELECT test_prep_bytea_input(E'a\\000b'); -- 3 (embedded null formerly truncated (1 row) CREATE OR REPLACE FUNCTION test_prep_bytea_output() RETURNS bytea -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ plan = plpy.prepare("SELECT decode('aa00bb', 'hex') AS val") rv = plpy.execute(plan, [], 5) @@ -1001,7 +1001,7 @@ plpy.info(rv[0]) return rv[0]['val'] $$; SELECT test_prep_bytea_output(); -INFO: {'val': '\xaa\x00\xbb'} +INFO: {'val': b'\xaa\x00\xbb'} test_prep_bytea_output ------------------------ \xaa00bb diff --git a/src/pl/plpython/expected/plpython_types_3.out b/src/pl/plpython/expected/plpython_types_3.out deleted file mode 100644 index a6ec10d5e1..0000000000 --- a/src/pl/plpython/expected/plpython_types_3.out +++ /dev/null @@ -1,1009 +0,0 @@ --- --- Test data type behavior --- --- --- Base/common types --- -CREATE FUNCTION test_type_conversion_bool(x bool) RETURNS bool AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_bool(true); -INFO: (True, ) - test_type_conversion_bool ---------------------------- - t -(1 row) - -SELECT * FROM test_type_conversion_bool(false); -INFO: (False, ) - test_type_conversion_bool ---------------------------- - f -(1 row) - -SELECT * FROM test_type_conversion_bool(null); -INFO: (None, ) - test_type_conversion_bool ---------------------------- - -(1 row) - --- test various other ways to express Booleans in Python -CREATE FUNCTION test_type_conversion_bool_other(n int) RETURNS bool AS $$ -# numbers -if n == 0: - ret = 0 -elif n == 1: - ret = 5 -# strings -elif n == 2: - ret = '' -elif n == 3: - ret = 'fa' # true in Python, false in PostgreSQL -# containers -elif n == 4: - ret = [] -elif n == 5: - ret = [0] -plpy.info(ret, not not ret) -return ret -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_bool_other(0); -INFO: (0, False) - test_type_conversion_bool_other ---------------------------------- - f -(1 row) - -SELECT * FROM test_type_conversion_bool_other(1); -INFO: (5, True) - test_type_conversion_bool_other ---------------------------------- - t -(1 row) - -SELECT * FROM test_type_conversion_bool_other(2); -INFO: ('', False) - test_type_conversion_bool_other ---------------------------------- - f -(1 row) - -SELECT * FROM test_type_conversion_bool_other(3); -INFO: ('fa', True) - test_type_conversion_bool_other ---------------------------------- - t -(1 row) - -SELECT * FROM test_type_conversion_bool_other(4); -INFO: ([], False) - test_type_conversion_bool_other ---------------------------------- - f -(1 row) - -SELECT * FROM test_type_conversion_bool_other(5); -INFO: ([0], True) - test_type_conversion_bool_other ---------------------------------- - t -(1 row) - -CREATE FUNCTION test_type_conversion_char(x char) RETURNS char AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_char('a'); -INFO: ('a', ) - test_type_conversion_char ---------------------------- - a -(1 row) - -SELECT * FROM test_type_conversion_char(null); -INFO: (None, ) - test_type_conversion_char ---------------------------- - -(1 row) - -CREATE FUNCTION test_type_conversion_int2(x int2) RETURNS int2 AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_int2(100::int2); -INFO: (100, ) - test_type_conversion_int2 ---------------------------- - 100 -(1 row) - -SELECT * FROM test_type_conversion_int2(-100::int2); -INFO: (-100, ) - test_type_conversion_int2 ---------------------------- - -100 -(1 row) - -SELECT * FROM test_type_conversion_int2(null); -INFO: (None, ) - test_type_conversion_int2 ---------------------------- - -(1 row) - -CREATE FUNCTION test_type_conversion_int4(x int4) RETURNS int4 AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_int4(100); -INFO: (100, ) - test_type_conversion_int4 ---------------------------- - 100 -(1 row) - -SELECT * FROM test_type_conversion_int4(-100); -INFO: (-100, ) - test_type_conversion_int4 ---------------------------- - -100 -(1 row) - -SELECT * FROM test_type_conversion_int4(null); -INFO: (None, ) - test_type_conversion_int4 ---------------------------- - -(1 row) - -CREATE FUNCTION test_type_conversion_int8(x int8) RETURNS int8 AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_int8(100); -INFO: (100, ) - test_type_conversion_int8 ---------------------------- - 100 -(1 row) - -SELECT * FROM test_type_conversion_int8(-100); -INFO: (-100, ) - test_type_conversion_int8 ---------------------------- - -100 -(1 row) - -SELECT * FROM test_type_conversion_int8(5000000000); -INFO: (5000000000, ) - test_type_conversion_int8 ---------------------------- - 5000000000 -(1 row) - -SELECT * FROM test_type_conversion_int8(null); -INFO: (None, ) - test_type_conversion_int8 ---------------------------- - -(1 row) - -CREATE FUNCTION test_type_conversion_numeric(x numeric) RETURNS numeric AS $$ -# print just the class name, not the type, to avoid differences -# between decimal and cdecimal -plpy.info(str(x), x.__class__.__name__) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_numeric(100); -INFO: ('100', 'Decimal') - test_type_conversion_numeric ------------------------------- - 100 -(1 row) - -SELECT * FROM test_type_conversion_numeric(-100); -INFO: ('-100', 'Decimal') - test_type_conversion_numeric ------------------------------- - -100 -(1 row) - -SELECT * FROM test_type_conversion_numeric(100.0); -INFO: ('100.0', 'Decimal') - test_type_conversion_numeric ------------------------------- - 100.0 -(1 row) - -SELECT * FROM test_type_conversion_numeric(100.00); -INFO: ('100.00', 'Decimal') - test_type_conversion_numeric ------------------------------- - 100.00 -(1 row) - -SELECT * FROM test_type_conversion_numeric(5000000000.5); -INFO: ('5000000000.5', 'Decimal') - test_type_conversion_numeric ------------------------------- - 5000000000.5 -(1 row) - -SELECT * FROM test_type_conversion_numeric(1234567890.0987654321); -INFO: ('1234567890.0987654321', 'Decimal') - test_type_conversion_numeric ------------------------------- - 1234567890.0987654321 -(1 row) - -SELECT * FROM test_type_conversion_numeric(-1234567890.0987654321); -INFO: ('-1234567890.0987654321', 'Decimal') - test_type_conversion_numeric ------------------------------- - -1234567890.0987654321 -(1 row) - -SELECT * FROM test_type_conversion_numeric(null); -INFO: ('None', 'NoneType') - test_type_conversion_numeric ------------------------------- - -(1 row) - -CREATE FUNCTION test_type_conversion_float4(x float4) RETURNS float4 AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_float4(100); -INFO: (100.0, ) - test_type_conversion_float4 ------------------------------ - 100 -(1 row) - -SELECT * FROM test_type_conversion_float4(-100); -INFO: (-100.0, ) - test_type_conversion_float4 ------------------------------ - -100 -(1 row) - -SELECT * FROM test_type_conversion_float4(5000.5); -INFO: (5000.5, ) - test_type_conversion_float4 ------------------------------ - 5000.5 -(1 row) - -SELECT * FROM test_type_conversion_float4(null); -INFO: (None, ) - test_type_conversion_float4 ------------------------------ - -(1 row) - -CREATE FUNCTION test_type_conversion_float8(x float8) RETURNS float8 AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_float8(100); -INFO: (100.0, ) - test_type_conversion_float8 ------------------------------ - 100 -(1 row) - -SELECT * FROM test_type_conversion_float8(-100); -INFO: (-100.0, ) - test_type_conversion_float8 ------------------------------ - -100 -(1 row) - -SELECT * FROM test_type_conversion_float8(5000000000.5); -INFO: (5000000000.5, ) - test_type_conversion_float8 ------------------------------ - 5000000000.5 -(1 row) - -SELECT * FROM test_type_conversion_float8(null); -INFO: (None, ) - test_type_conversion_float8 ------------------------------ - -(1 row) - -SELECT * FROM test_type_conversion_float8(100100100.654321); -INFO: (100100100.654321, ) - test_type_conversion_float8 ------------------------------ - 100100100.654321 -(1 row) - -CREATE FUNCTION test_type_conversion_oid(x oid) RETURNS oid AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_oid(100); -INFO: (100, ) - test_type_conversion_oid --------------------------- - 100 -(1 row) - -SELECT * FROM test_type_conversion_oid(2147483649); -INFO: (2147483649, ) - test_type_conversion_oid --------------------------- - 2147483649 -(1 row) - -SELECT * FROM test_type_conversion_oid(null); -INFO: (None, ) - test_type_conversion_oid --------------------------- - -(1 row) - -CREATE FUNCTION test_type_conversion_text(x text) RETURNS text AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_text('hello world'); -INFO: ('hello world', ) - test_type_conversion_text ---------------------------- - hello world -(1 row) - -SELECT * FROM test_type_conversion_text(null); -INFO: (None, ) - test_type_conversion_text ---------------------------- - -(1 row) - -CREATE FUNCTION test_type_conversion_bytea(x bytea) RETURNS bytea AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_bytea('hello world'); -INFO: (b'hello world', ) - test_type_conversion_bytea ----------------------------- - \x68656c6c6f20776f726c64 -(1 row) - -SELECT * FROM test_type_conversion_bytea(E'null\\000byte'); -INFO: (b'null\x00byte', ) - test_type_conversion_bytea ----------------------------- - \x6e756c6c0062797465 -(1 row) - -SELECT * FROM test_type_conversion_bytea(null); -INFO: (None, ) - test_type_conversion_bytea ----------------------------- - -(1 row) - -CREATE FUNCTION test_type_marshal() RETURNS bytea AS $$ -import marshal -return marshal.dumps('hello world') -$$ LANGUAGE plpython3u; -CREATE FUNCTION test_type_unmarshal(x bytea) RETURNS text AS $$ -import marshal -try: - return marshal.loads(x) -except ValueError as e: - return 'FAILED: ' + str(e) -$$ LANGUAGE plpython3u; -SELECT test_type_unmarshal(x) FROM test_type_marshal() x; - test_type_unmarshal ---------------------- - hello world -(1 row) - --- --- Domains --- -CREATE DOMAIN booltrue AS bool CHECK (VALUE IS TRUE OR VALUE IS NULL); -CREATE FUNCTION test_type_conversion_booltrue(x booltrue, y bool) RETURNS booltrue AS $$ -return y -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_booltrue(true, true); - test_type_conversion_booltrue -------------------------------- - t -(1 row) - -SELECT * FROM test_type_conversion_booltrue(false, true); -ERROR: value for domain booltrue violates check constraint "booltrue_check" -SELECT * FROM test_type_conversion_booltrue(true, false); -ERROR: value for domain booltrue violates check constraint "booltrue_check" -CONTEXT: while creating return value -PL/Python function "test_type_conversion_booltrue" -CREATE DOMAIN uint2 AS int2 CHECK (VALUE >= 0); -CREATE FUNCTION test_type_conversion_uint2(x uint2, y int) RETURNS uint2 AS $$ -plpy.info(x, type(x)) -return y -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_uint2(100::uint2, 50); -INFO: (100, ) - test_type_conversion_uint2 ----------------------------- - 50 -(1 row) - -SELECT * FROM test_type_conversion_uint2(100::uint2, -50); -INFO: (100, ) -ERROR: value for domain uint2 violates check constraint "uint2_check" -CONTEXT: while creating return value -PL/Python function "test_type_conversion_uint2" -SELECT * FROM test_type_conversion_uint2(null, 1); -INFO: (None, ) - test_type_conversion_uint2 ----------------------------- - 1 -(1 row) - -CREATE DOMAIN nnint AS int CHECK (VALUE IS NOT NULL); -CREATE FUNCTION test_type_conversion_nnint(x nnint, y int) RETURNS nnint AS $$ -return y -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_nnint(10, 20); - test_type_conversion_nnint ----------------------------- - 20 -(1 row) - -SELECT * FROM test_type_conversion_nnint(null, 20); -ERROR: value for domain nnint violates check constraint "nnint_check" -SELECT * FROM test_type_conversion_nnint(10, null); -ERROR: value for domain nnint violates check constraint "nnint_check" -CONTEXT: while creating return value -PL/Python function "test_type_conversion_nnint" -CREATE DOMAIN bytea10 AS bytea CHECK (octet_length(VALUE) = 10 AND VALUE IS NOT NULL); -CREATE FUNCTION test_type_conversion_bytea10(x bytea10, y bytea) RETURNS bytea10 AS $$ -plpy.info(x, type(x)) -return y -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_bytea10('hello wold', 'hello wold'); -INFO: (b'hello wold', ) - test_type_conversion_bytea10 ------------------------------- - \x68656c6c6f20776f6c64 -(1 row) - -SELECT * FROM test_type_conversion_bytea10('hello world', 'hello wold'); -ERROR: value for domain bytea10 violates check constraint "bytea10_check" -SELECT * FROM test_type_conversion_bytea10('hello word', 'hello world'); -INFO: (b'hello word', ) -ERROR: value for domain bytea10 violates check constraint "bytea10_check" -CONTEXT: while creating return value -PL/Python function "test_type_conversion_bytea10" -SELECT * FROM test_type_conversion_bytea10(null, 'hello word'); -ERROR: value for domain bytea10 violates check constraint "bytea10_check" -SELECT * FROM test_type_conversion_bytea10('hello word', null); -INFO: (b'hello word', ) -ERROR: value for domain bytea10 violates check constraint "bytea10_check" -CONTEXT: while creating return value -PL/Python function "test_type_conversion_bytea10" --- --- Arrays --- -CREATE FUNCTION test_type_conversion_array_int4(x int4[]) RETURNS int4[] AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_array_int4(ARRAY[0, 100]); -INFO: ([0, 100], ) - test_type_conversion_array_int4 ---------------------------------- - {0,100} -(1 row) - -SELECT * FROM test_type_conversion_array_int4(ARRAY[0,-100,55]); -INFO: ([0, -100, 55], ) - test_type_conversion_array_int4 ---------------------------------- - {0,-100,55} -(1 row) - -SELECT * FROM test_type_conversion_array_int4(ARRAY[NULL,1]); -INFO: ([None, 1], ) - test_type_conversion_array_int4 ---------------------------------- - {NULL,1} -(1 row) - -SELECT * FROM test_type_conversion_array_int4(ARRAY[]::integer[]); -INFO: ([], ) - test_type_conversion_array_int4 ---------------------------------- - {} -(1 row) - -SELECT * FROM test_type_conversion_array_int4(NULL); -INFO: (None, ) - test_type_conversion_array_int4 ---------------------------------- - -(1 row) - -SELECT * FROM test_type_conversion_array_int4(ARRAY[[1,2,3],[4,5,6]]); -INFO: ([[1, 2, 3], [4, 5, 6]], ) - test_type_conversion_array_int4 ---------------------------------- - {{1,2,3},{4,5,6}} -(1 row) - -SELECT * FROM test_type_conversion_array_int4(ARRAY[[[1,2,NULL],[NULL,5,6]],[[NULL,8,9],[10,11,12]]]); -INFO: ([[[1, 2, None], [None, 5, 6]], [[None, 8, 9], [10, 11, 12]]], ) - test_type_conversion_array_int4 ---------------------------------------------------- - {{{1,2,NULL},{NULL,5,6}},{{NULL,8,9},{10,11,12}}} -(1 row) - -SELECT * FROM test_type_conversion_array_int4('[2:4]={1,2,3}'); -INFO: ([1, 2, 3], ) - test_type_conversion_array_int4 ---------------------------------- - {1,2,3} -(1 row) - -CREATE FUNCTION test_type_conversion_array_int8(x int8[]) RETURNS int8[] AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_array_int8(ARRAY[[[1,2,NULL],[NULL,5,6]],[[NULL,8,9],[10,11,12]]]::int8[]); -INFO: ([[[1, 2, None], [None, 5, 6]], [[None, 8, 9], [10, 11, 12]]], ) - test_type_conversion_array_int8 ---------------------------------------------------- - {{{1,2,NULL},{NULL,5,6}},{{NULL,8,9},{10,11,12}}} -(1 row) - -CREATE FUNCTION test_type_conversion_array_date(x date[]) RETURNS date[] AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_array_date(ARRAY[[['2016-09-21','2016-09-22',NULL],[NULL,'2016-10-21','2016-10-22']], - [[NULL,'2016-11-21','2016-10-21'],['2015-09-21','2015-09-22','2014-09-21']]]::date[]); -INFO: ([[['09-21-2016', '09-22-2016', None], [None, '10-21-2016', '10-22-2016']], [[None, '11-21-2016', '10-21-2016'], ['09-21-2015', '09-22-2015', '09-21-2014']]], ) - test_type_conversion_array_date ---------------------------------------------------------------------------------------------------------------------------------- - {{{09-21-2016,09-22-2016,NULL},{NULL,10-21-2016,10-22-2016}},{{NULL,11-21-2016,10-21-2016},{09-21-2015,09-22-2015,09-21-2014}}} -(1 row) - -CREATE FUNCTION test_type_conversion_array_timestamp(x timestamp[]) RETURNS timestamp[] AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_array_timestamp(ARRAY[[['2016-09-21 15:34:24.078792-04','2016-10-22 11:34:24.078795-04',NULL], - [NULL,'2016-10-21 11:34:25.078792-04','2016-10-21 11:34:24.098792-04']], - [[NULL,'2016-01-21 11:34:24.078792-04','2016-11-21 11:34:24.108792-04'], - ['2015-09-21 11:34:24.079792-04','2014-09-21 11:34:24.078792-04','2013-09-21 11:34:24.078792-04']]]::timestamp[]); -INFO: ([[['Wed Sep 21 15:34:24.078792 2016', 'Sat Oct 22 11:34:24.078795 2016', None], [None, 'Fri Oct 21 11:34:25.078792 2016', 'Fri Oct 21 11:34:24.098792 2016']], [[None, 'Thu Jan 21 11:34:24.078792 2016', 'Mon Nov 21 11:34:24.108792 2016'], ['Mon Sep 21 11:34:24.079792 2015', 'Sun Sep 21 11:34:24.078792 2014', 'Sat Sep 21 11:34:24.078792 2013']]], ) - test_type_conversion_array_timestamp ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - {{{"Wed Sep 21 15:34:24.078792 2016","Sat Oct 22 11:34:24.078795 2016",NULL},{NULL,"Fri Oct 21 11:34:25.078792 2016","Fri Oct 21 11:34:24.098792 2016"}},{{NULL,"Thu Jan 21 11:34:24.078792 2016","Mon Nov 21 11:34:24.108792 2016"},{"Mon Sep 21 11:34:24.079792 2015","Sun Sep 21 11:34:24.078792 2014","Sat Sep 21 11:34:24.078792 2013"}}} -(1 row) - -CREATE OR REPLACE FUNCTION pyreturnmultidemint4(h int4, i int4, j int4, k int4 ) RETURNS int4[] AS $BODY$ -m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)] -plpy.info(m, type(m)) -return m -$BODY$ LANGUAGE plpython3u; -select pyreturnmultidemint4(8,5,3,2); -INFO: ([[[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]]], [[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]], [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]]]], ) - pyreturnmultidemint4 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - {{{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}}},{{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}},{{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7},{0,1,2,3,4,5,6,7}}}} -(1 row) - -CREATE OR REPLACE FUNCTION pyreturnmultidemint8(h int4, i int4, j int4, k int4 ) RETURNS int8[] AS $BODY$ -m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)] -plpy.info(m, type(m)) -return m -$BODY$ LANGUAGE plpython3u; -select pyreturnmultidemint8(5,5,3,2); -INFO: ([[[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]], [[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]]], ) - pyreturnmultidemint8 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - {{{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}}},{{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}},{{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4},{0,1,2,3,4}}}} -(1 row) - -CREATE OR REPLACE FUNCTION pyreturnmultidemfloat4(h int4, i int4, j int4, k int4 ) RETURNS float4[] AS $BODY$ -m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)] -plpy.info(m, type(m)) -return m -$BODY$ LANGUAGE plpython3u; -select pyreturnmultidemfloat4(6,5,3,2); -INFO: ([[[[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]]], [[[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]]]], ) - pyreturnmultidemfloat4 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - {{{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}}},{{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}},{{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5},{0,1,2,3,4,5}}}} -(1 row) - -CREATE OR REPLACE FUNCTION pyreturnmultidemfloat8(h int4, i int4, j int4, k int4 ) RETURNS float8[] AS $BODY$ -m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)] -plpy.info(m, type(m)) -return m -$BODY$ LANGUAGE plpython3u; -select pyreturnmultidemfloat8(7,5,3,2); -INFO: ([[[[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]]], [[[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]], [[0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6]]]], ) - pyreturnmultidemfloat8 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - {{{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}}},{{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}},{{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6},{0,1,2,3,4,5,6}}}} -(1 row) - -CREATE FUNCTION test_type_conversion_array_text(x text[]) RETURNS text[] AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_array_text(ARRAY['foo', 'bar']); -INFO: (['foo', 'bar'], ) - test_type_conversion_array_text ---------------------------------- - {foo,bar} -(1 row) - -SELECT * FROM test_type_conversion_array_text(ARRAY[['foo', 'bar'],['foo2', 'bar2']]); -INFO: ([['foo', 'bar'], ['foo2', 'bar2']], ) - test_type_conversion_array_text ---------------------------------- - {{foo,bar},{foo2,bar2}} -(1 row) - -CREATE FUNCTION test_type_conversion_array_bytea(x bytea[]) RETURNS bytea[] AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_array_bytea(ARRAY[E'\\xdeadbeef'::bytea, NULL]); -INFO: ([b'\xde\xad\xbe\xef', None], ) - test_type_conversion_array_bytea ----------------------------------- - {"\\xdeadbeef",NULL} -(1 row) - -CREATE FUNCTION test_type_conversion_array_mixed1() RETURNS text[] AS $$ -return [123, 'abc'] -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_array_mixed1(); - test_type_conversion_array_mixed1 ------------------------------------ - {123,abc} -(1 row) - -CREATE FUNCTION test_type_conversion_array_mixed2() RETURNS int[] AS $$ -return [123, 'abc'] -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_array_mixed2(); -ERROR: invalid input syntax for type integer: "abc" -CONTEXT: while creating return value -PL/Python function "test_type_conversion_array_mixed2" -CREATE FUNCTION test_type_conversion_mdarray_malformed() RETURNS int[] AS $$ -return [[1,2,3],[4,5]] -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_mdarray_malformed(); -ERROR: wrong length of inner sequence: has length 2, but 3 was expected -DETAIL: To construct a multidimensional array, the inner sequences must all have the same length. -CONTEXT: while creating return value -PL/Python function "test_type_conversion_mdarray_malformed" -CREATE FUNCTION test_type_conversion_mdarray_toodeep() RETURNS int[] AS $$ -return [[[[[[[1]]]]]]] -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_mdarray_toodeep(); -ERROR: number of array dimensions exceeds the maximum allowed (6) -CONTEXT: while creating return value -PL/Python function "test_type_conversion_mdarray_toodeep" -CREATE FUNCTION test_type_conversion_array_record() RETURNS type_record[] AS $$ -return [{'first': 'one', 'second': 42}, {'first': 'two', 'second': 11}] -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_array_record(); - test_type_conversion_array_record ------------------------------------ - {"(one,42)","(two,11)"} -(1 row) - -CREATE FUNCTION test_type_conversion_array_string() RETURNS text[] AS $$ -return 'abc' -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_array_string(); - test_type_conversion_array_string ------------------------------------ - {a,b,c} -(1 row) - -CREATE FUNCTION test_type_conversion_array_tuple() RETURNS text[] AS $$ -return ('abc', 'def') -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_array_tuple(); - test_type_conversion_array_tuple ----------------------------------- - {abc,def} -(1 row) - -CREATE FUNCTION test_type_conversion_array_error() RETURNS int[] AS $$ -return 5 -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_array_error(); -ERROR: return value of function with array return type is not a Python sequence -CONTEXT: while creating return value -PL/Python function "test_type_conversion_array_error" --- --- Domains over arrays --- -CREATE DOMAIN ordered_pair_domain AS integer[] CHECK (array_length(VALUE,1)=2 AND VALUE[1] < VALUE[2]); -CREATE FUNCTION test_type_conversion_array_domain(x ordered_pair_domain) RETURNS ordered_pair_domain AS $$ -plpy.info(x, type(x)) -return x -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_array_domain(ARRAY[0, 100]::ordered_pair_domain); -INFO: ([0, 100], ) - test_type_conversion_array_domain ------------------------------------ - {0,100} -(1 row) - -SELECT * FROM test_type_conversion_array_domain(NULL::ordered_pair_domain); -INFO: (None, ) - test_type_conversion_array_domain ------------------------------------ - -(1 row) - -CREATE FUNCTION test_type_conversion_array_domain_check_violation() RETURNS ordered_pair_domain AS $$ -return [2,1] -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_array_domain_check_violation(); -ERROR: value for domain ordered_pair_domain violates check constraint "ordered_pair_domain_check" -CONTEXT: while creating return value -PL/Python function "test_type_conversion_array_domain_check_violation" --- --- Arrays of domains --- -CREATE FUNCTION test_read_uint2_array(x uint2[]) RETURNS uint2 AS $$ -plpy.info(x, type(x)) -return x[0] -$$ LANGUAGE plpythonu; -select test_read_uint2_array(array[1::uint2]); -INFO: ([1], ) - test_read_uint2_array ------------------------ - 1 -(1 row) - -CREATE FUNCTION test_build_uint2_array(x int2) RETURNS uint2[] AS $$ -return [x, x] -$$ LANGUAGE plpythonu; -select test_build_uint2_array(1::int2); - test_build_uint2_array ------------------------- - {1,1} -(1 row) - -select test_build_uint2_array(-1::int2); -- fail -ERROR: value for domain uint2 violates check constraint "uint2_check" -CONTEXT: while creating return value -PL/Python function "test_build_uint2_array" --- --- ideally this would work, but for now it doesn't, because the return value --- is [[2,4], [2,4]] which our conversion code thinks should become a 2-D --- integer array, not an array of arrays. --- -CREATE FUNCTION test_type_conversion_domain_array(x integer[]) - RETURNS ordered_pair_domain[] AS $$ -return [x, x] -$$ LANGUAGE plpythonu; -select test_type_conversion_domain_array(array[2,4]); -ERROR: return value of function with array return type is not a Python sequence -CONTEXT: while creating return value -PL/Python function "test_type_conversion_domain_array" -select test_type_conversion_domain_array(array[4,2]); -- fail -ERROR: return value of function with array return type is not a Python sequence -CONTEXT: while creating return value -PL/Python function "test_type_conversion_domain_array" -CREATE FUNCTION test_type_conversion_domain_array2(x ordered_pair_domain) - RETURNS integer AS $$ -plpy.info(x, type(x)) -return x[1] -$$ LANGUAGE plpythonu; -select test_type_conversion_domain_array2(array[2,4]); -INFO: ([2, 4], ) - test_type_conversion_domain_array2 ------------------------------------- - 4 -(1 row) - -select test_type_conversion_domain_array2(array[4,2]); -- fail -ERROR: value for domain ordered_pair_domain violates check constraint "ordered_pair_domain_check" -CREATE FUNCTION test_type_conversion_array_domain_array(x ordered_pair_domain[]) - RETURNS ordered_pair_domain AS $$ -plpy.info(x, type(x)) -return x[0] -$$ LANGUAGE plpythonu; -select test_type_conversion_array_domain_array(array[array[2,4]::ordered_pair_domain]); -INFO: ([[2, 4]], ) - test_type_conversion_array_domain_array ------------------------------------------ - {2,4} -(1 row) - ---- ---- Composite types ---- -CREATE TABLE employee ( - name text, - basesalary integer, - bonus integer -); -INSERT INTO employee VALUES ('John', 100, 10), ('Mary', 200, 10); -CREATE OR REPLACE FUNCTION test_composite_table_input(e employee) RETURNS integer AS $$ -return e['basesalary'] + e['bonus'] -$$ LANGUAGE plpython3u; -SELECT name, test_composite_table_input(employee.*) FROM employee; - name | test_composite_table_input -------+---------------------------- - John | 110 - Mary | 210 -(2 rows) - -ALTER TABLE employee DROP bonus; -SELECT name, test_composite_table_input(employee.*) FROM employee; -ERROR: KeyError: 'bonus' -CONTEXT: Traceback (most recent call last): - PL/Python function "test_composite_table_input", line 2, in - return e['basesalary'] + e['bonus'] -PL/Python function "test_composite_table_input" -ALTER TABLE employee ADD bonus integer; -UPDATE employee SET bonus = 10; -SELECT name, test_composite_table_input(employee.*) FROM employee; - name | test_composite_table_input -------+---------------------------- - John | 110 - Mary | 210 -(2 rows) - -CREATE TYPE named_pair AS ( - i integer, - j integer -); -CREATE OR REPLACE FUNCTION test_composite_type_input(p named_pair) RETURNS integer AS $$ -return sum(p.values()) -$$ LANGUAGE plpython3u; -SELECT test_composite_type_input(row(1, 2)); - test_composite_type_input ---------------------------- - 3 -(1 row) - -ALTER TYPE named_pair RENAME TO named_pair_2; -SELECT test_composite_type_input(row(1, 2)); - test_composite_type_input ---------------------------- - 3 -(1 row) - --- --- Domains within composite --- -CREATE TYPE nnint_container AS (f1 int, f2 nnint); -CREATE FUNCTION nnint_test(x int, y int) RETURNS nnint_container AS $$ -return {'f1': x, 'f2': y} -$$ LANGUAGE plpythonu; -SELECT nnint_test(null, 3); - nnint_test ------------- - (,3) -(1 row) - -SELECT nnint_test(3, null); -- fail -ERROR: value for domain nnint violates check constraint "nnint_check" -CONTEXT: while creating return value -PL/Python function "nnint_test" --- --- Domains of composite --- -CREATE DOMAIN ordered_named_pair AS named_pair_2 CHECK((VALUE).i <= (VALUE).j); -CREATE FUNCTION read_ordered_named_pair(p ordered_named_pair) RETURNS integer AS $$ -return p['i'] + p['j'] -$$ LANGUAGE plpythonu; -SELECT read_ordered_named_pair(row(1, 2)); - read_ordered_named_pair -------------------------- - 3 -(1 row) - -SELECT read_ordered_named_pair(row(2, 1)); -- fail -ERROR: value for domain ordered_named_pair violates check constraint "ordered_named_pair_check" -CREATE FUNCTION build_ordered_named_pair(i int, j int) RETURNS ordered_named_pair AS $$ -return {'i': i, 'j': j} -$$ LANGUAGE plpythonu; -SELECT build_ordered_named_pair(1,2); - build_ordered_named_pair --------------------------- - (1,2) -(1 row) - -SELECT build_ordered_named_pair(2,1); -- fail -ERROR: value for domain ordered_named_pair violates check constraint "ordered_named_pair_check" -CONTEXT: while creating return value -PL/Python function "build_ordered_named_pair" -CREATE FUNCTION build_ordered_named_pairs(i int, j int) RETURNS ordered_named_pair[] AS $$ -return [{'i': i, 'j': j}, {'i': i, 'j': j+1}] -$$ LANGUAGE plpythonu; -SELECT build_ordered_named_pairs(1,2); - build_ordered_named_pairs ---------------------------- - {"(1,2)","(1,3)"} -(1 row) - -SELECT build_ordered_named_pairs(2,1); -- fail -ERROR: value for domain ordered_named_pair violates check constraint "ordered_named_pair_check" -CONTEXT: while creating return value -PL/Python function "build_ordered_named_pairs" --- --- Prepared statements --- -CREATE OR REPLACE FUNCTION test_prep_bool_input() RETURNS int -LANGUAGE plpython3u -AS $$ -plan = plpy.prepare("SELECT CASE WHEN $1 THEN 1 ELSE 0 END AS val", ['boolean']) -rv = plpy.execute(plan, ['fa'], 5) # 'fa' is true in Python -return rv[0]['val'] -$$; -SELECT test_prep_bool_input(); -- 1 - test_prep_bool_input ----------------------- - 1 -(1 row) - -CREATE OR REPLACE FUNCTION test_prep_bool_output() RETURNS bool -LANGUAGE plpython3u -AS $$ -plan = plpy.prepare("SELECT $1 = 1 AS val", ['int']) -rv = plpy.execute(plan, [0], 5) -plpy.info(rv[0]) -return rv[0]['val'] -$$; -SELECT test_prep_bool_output(); -- false -INFO: {'val': False} - test_prep_bool_output ------------------------ - f -(1 row) - -CREATE OR REPLACE FUNCTION test_prep_bytea_input(bb bytea) RETURNS int -LANGUAGE plpython3u -AS $$ -plan = plpy.prepare("SELECT octet_length($1) AS val", ['bytea']) -rv = plpy.execute(plan, [bb], 5) -return rv[0]['val'] -$$; -SELECT test_prep_bytea_input(E'a\\000b'); -- 3 (embedded null formerly truncated value) - test_prep_bytea_input ------------------------ - 3 -(1 row) - -CREATE OR REPLACE FUNCTION test_prep_bytea_output() RETURNS bytea -LANGUAGE plpython3u -AS $$ -plan = plpy.prepare("SELECT decode('aa00bb', 'hex') AS val") -rv = plpy.execute(plan, [], 5) -plpy.info(rv[0]) -return rv[0]['val'] -$$; -SELECT test_prep_bytea_output(); -INFO: {'val': b'\xaa\x00\xbb'} - test_prep_bytea_output ------------------------- - \xaa00bb -(1 row) - diff --git a/src/pl/plpython/expected/plpython_unicode.out b/src/pl/plpython/expected/plpython_unicode.out index c7546dd458..fd54b0b88e 100644 --- a/src/pl/plpython/expected/plpython_unicode.out +++ b/src/pl/plpython/expected/plpython_unicode.out @@ -11,24 +11,24 @@ CREATE TABLE unicode_test ( testvalue text NOT NULL ); CREATE FUNCTION unicode_return() RETURNS text AS E' -return u"\\xA0" -' LANGUAGE plpythonu; +return "\\xA0" +' LANGUAGE plpython3u; CREATE FUNCTION unicode_trigger() RETURNS trigger AS E' -TD["new"]["testvalue"] = u"\\xA0" +TD["new"]["testvalue"] = "\\xA0" return "MODIFY" -' LANGUAGE plpythonu; +' LANGUAGE plpython3u; CREATE TRIGGER unicode_test_bi BEFORE INSERT ON unicode_test FOR EACH ROW EXECUTE PROCEDURE unicode_trigger(); CREATE FUNCTION unicode_plan1() RETURNS text AS E' plan = plpy.prepare("SELECT $1 AS testvalue", ["text"]) -rv = plpy.execute(plan, [u"\\xA0"], 1) +rv = plpy.execute(plan, ["\\xA0"], 1) return rv[0]["testvalue"] -' LANGUAGE plpythonu; +' LANGUAGE plpython3u; CREATE FUNCTION unicode_plan2() RETURNS text AS E' -plan = plpy.prepare("SELECT $1 || $2 AS testvalue", ["text", u"text"]) +plan = plpy.prepare("SELECT $1 || $2 AS testvalue", ["text", "text"]) rv = plpy.execute(plan, ["foo", "bar"], 1) return rv[0]["testvalue"] -' LANGUAGE plpythonu; +' LANGUAGE plpython3u; SELECT unicode_return(); unicode_return ---------------- diff --git a/src/pl/plpython/expected/plpython_void.out b/src/pl/plpython/expected/plpython_void.out index 1080d12d6b..07d0760783 100644 --- a/src/pl/plpython/expected/plpython_void.out +++ b/src/pl/plpython/expected/plpython_void.out @@ -3,14 +3,14 @@ -- CREATE FUNCTION test_void_func1() RETURNS void AS $$ x = 10 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; -- illegal: can't return non-None value in void-returning func CREATE FUNCTION test_void_func2() RETURNS void AS $$ return 10 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_return_none() RETURNS int AS $$ None -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; -- Tests for functions returning void SELECT test_void_func1(), test_void_func1() IS NULL AS "is null"; test_void_func1 | is null diff --git a/src/pl/plpython/regress-python3-mangle.mk b/src/pl/plpython/regress-python3-mangle.mk deleted file mode 100644 index a785818a17..0000000000 --- a/src/pl/plpython/regress-python3-mangle.mk +++ /dev/null @@ -1,38 +0,0 @@ -ifeq ($(python_majorversion),3) -# Adjust regression tests for Python 3 compatibility -# -# Mention those regression test files that need to be mangled in the -# variable REGRESS_PLPYTHON3_MANGLE. They will be copied to a -# subdirectory python3/ and have their Python syntax and other bits -# adjusted to work with Python 3. - -# Note that the order of the tests needs to be preserved in this -# expression. -REGRESS := $(foreach test,$(REGRESS),$(if $(filter $(test),$(REGRESS_PLPYTHON3_MANGLE)),python3/$(test),$(test))) - -.PHONY: pgregress-python3-mangle -pgregress-python3-mangle: - $(MKDIR_P) sql/python3 expected/python3 results/python3 - for file in $(patsubst %,$(srcdir)/sql/%.sql,$(REGRESS_PLPYTHON3_MANGLE)) $(patsubst %,$(srcdir)/expected/%*.out,$(REGRESS_PLPYTHON3_MANGLE)); do \ - sed \ - -e "s///g" \ - -e "s///g" \ - -e "s/\([0-9][0-9]*\)L/\1/g" \ - -e 's/\([ [{]\)u"/\1"/g' \ - -e "s/\([ [{]\)u'/\1'/g" \ - -e "s/def next/def __next__/g" \ - -e "s/LANGUAGE plpythonu/LANGUAGE plpython3u/g" \ - -e "s/LANGUAGE plpython2u/LANGUAGE plpython3u/g" \ - -e "s/EXTENSION plpythonu/EXTENSION plpython3u/g" \ - -e "s/EXTENSION plpython2u/EXTENSION plpython3u/g" \ - -e "s/EXTENSION \([^ ]*\)_plpythonu/EXTENSION \1_plpython3u/g" \ - -e "s/EXTENSION \([^ ]*\)_plpython2u/EXTENSION \1_plpython3u/g" \ - -e 's/installing required extension "plpython2u"/installing required extension "plpython3u"/g' \ - $$file >`echo $$file | sed 's,^.*/\([^/][^/]*/\)\([^/][^/]*\)$$,\1python3/\2,'` || exit; \ - done - -check installcheck: pgregress-python3-mangle - -pg_regress_clean_files += sql/python3/ expected/python3/ results/python3/ - -endif # Python 3 diff --git a/src/pl/plpython/sql/plpython_call.sql b/src/pl/plpython/sql/plpython_call.sql index b0b3705ae3..daa4bc377d 100644 --- a/src/pl/plpython/sql/plpython_call.sql +++ b/src/pl/plpython/sql/plpython_call.sql @@ -3,7 +3,7 @@ -- CREATE PROCEDURE test_proc1() -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ pass $$; @@ -13,7 +13,7 @@ CALL test_proc1(); -- error: can't return non-None CREATE PROCEDURE test_proc2() -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ return 5 $$; @@ -24,7 +24,7 @@ CALL test_proc2(); CREATE TABLE test1 (a int); CREATE PROCEDURE test_proc3(x int) -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ plpy.execute("INSERT INTO test1 VALUES (%s)" % x) $$; @@ -37,7 +37,7 @@ SELECT * FROM test1; -- output arguments CREATE PROCEDURE test_proc5(INOUT a text) -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ return [a + '+' + a] $$; @@ -46,7 +46,7 @@ CALL test_proc5('abc'); CREATE PROCEDURE test_proc6(a int, INOUT b int, INOUT c int) -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ return (b * a, c * a) $$; @@ -57,7 +57,7 @@ CALL test_proc6(2, 3, 4); -- OUT parameters CREATE PROCEDURE test_proc9(IN a int, OUT b int) -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ plpy.notice("a: %s" % (a)) return (a * 2,) diff --git a/src/pl/plpython/sql/plpython_composite.sql b/src/pl/plpython/sql/plpython_composite.sql index 0fd2f5d5e3..21757701cc 100644 --- a/src/pl/plpython/sql/plpython_composite.sql +++ b/src/pl/plpython/sql/plpython_composite.sql @@ -1,6 +1,6 @@ CREATE FUNCTION multiout_simple(OUT i integer, OUT j integer) AS $$ return (1, 2) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT multiout_simple(); SELECT * FROM multiout_simple(); @@ -9,7 +9,7 @@ SELECT (multiout_simple()).j + 3; CREATE FUNCTION multiout_simple_setof(n integer = 1, OUT integer, OUT integer) RETURNS SETOF record AS $$ return [(1, 2)] * n -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT multiout_simple_setof(); SELECT * FROM multiout_simple_setof(); @@ -34,7 +34,7 @@ elif typ == 'obj': return type_record elif typ == 'str': return "('%s',%r)" % (first, second) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM multiout_record_as('dict', 'foo', 1, 'f'); SELECT multiout_record_as('dict', 'foo', 1, 'f'); @@ -77,7 +77,7 @@ for i in range(n): power = 2 ** i length = plpy.execute("select length('%d')" % power)[0]['length'] yield power, length -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM multiout_setof(3); SELECT multiout_setof(5); @@ -86,7 +86,7 @@ CREATE FUNCTION multiout_return_table() RETURNS TABLE (x integer, y text) AS $$ return [{'x': 4, 'y' :'four'}, {'x': 7, 'y' :'seven'}, {'x': 0, 'y' :'zero'}] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM multiout_return_table(); @@ -94,18 +94,18 @@ CREATE FUNCTION multiout_array(OUT integer[], OUT text) RETURNS SETOF record AS yield [[1], 'a'] yield [[1,2], 'b'] yield [[1,2,3], None] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM multiout_array(); CREATE FUNCTION singleout_composite(OUT type_record) AS $$ return {'first': 1, 'second': 2} -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION multiout_composite(OUT type_record) RETURNS SETOF type_record AS $$ return [{'first': 1, 'second': 2}, {'first': 3, 'second': 4 }] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM singleout_composite(); SELECT * FROM multiout_composite(); @@ -113,7 +113,7 @@ SELECT * FROM multiout_composite(); -- composite OUT parameters in functions returning RECORD not supported yet CREATE FUNCTION multiout_composite(INOUT n integer, OUT type_record) AS $$ return (n, (n * 2, n * 3)) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION multiout_table_type_setof(typ text, returnnull boolean, INOUT n integer, OUT table_record) RETURNS SETOF record AS $$ if returnnull: @@ -132,7 +132,7 @@ elif typ == 'str': d = "(%r,%r)" % (n * 2, n * 3) for i in range(n): yield (i, d) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM multiout_composite(2); SELECT * FROM multiout_table_type_setof('dict', 'f', 3); @@ -157,7 +157,7 @@ CREATE TABLE changing ( CREATE FUNCTION changing_test(OUT n integer, OUT changing) RETURNS SETOF record AS $$ return [(1, {'i': 1, 'j': 2}), (1, (3, 4))] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM changing_test(); ALTER TABLE changing DROP COLUMN j; @@ -178,14 +178,14 @@ yield {'tab': [('first', 1), ('second', 2)], yield {'tab': [('first', 1), ('second', 2)], 'typ': [{'first': 'third', 'second': 3}, {'first': 'fourth', 'second': 4}]} -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM composite_types_table(); -- check what happens if the output record descriptor changes CREATE FUNCTION return_record(t text) RETURNS record AS $$ return {'t': t, 'val': 10} -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM return_record('abc') AS r(t text, val integer); SELECT * FROM return_record('abc') AS r(t text, val bigint); @@ -196,7 +196,7 @@ SELECT * FROM return_record('999') AS r(val text, t integer); CREATE FUNCTION return_record_2(t text) RETURNS record AS $$ return {'v1':1,'v2':2,t:3} -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM return_record_2('v3') AS (v3 int, v2 int, v1 int); SELECT * FROM return_record_2('v3') AS (v2 int, v3 int, v1 int); @@ -211,7 +211,7 @@ SELECT * FROM return_record_2('v3') AS (v1 int, v2 int, v3 int); -- multi-dimensional array of composite types. CREATE FUNCTION composite_type_as_list() RETURNS type_record[] AS $$ return [[('first', 1), ('second', 1)], [('first', 2), ('second', 2)], [('first', 3), ('second', 3)]]; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM composite_type_as_list(); -- Starting with PostgreSQL 10, a composite type in an array cannot be @@ -220,5 +220,5 @@ SELECT * FROM composite_type_as_list(); -- on the issue. CREATE FUNCTION composite_type_as_list_broken() RETURNS type_record[] AS $$ return [['first', 1]]; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM composite_type_as_list_broken(); diff --git a/src/pl/plpython/sql/plpython_do.sql b/src/pl/plpython/sql/plpython_do.sql index 0e281a08ee..d49413268e 100644 --- a/src/pl/plpython/sql/plpython_do.sql +++ b/src/pl/plpython/sql/plpython_do.sql @@ -1,5 +1,3 @@ -DO $$ plpy.notice("This is plpythonu.") $$ LANGUAGE plpythonu; +DO $$ plpy.notice("This is plpython3u.") $$ LANGUAGE plpython3u; -DO $$ plpy.notice("This is plpython2u.") $$ LANGUAGE plpython2u; - -DO $$ raise Exception("error test") $$ LANGUAGE plpythonu; +DO $$ raise Exception("error test") $$ LANGUAGE plpython3u; diff --git a/src/pl/plpython/sql/plpython_drop.sql b/src/pl/plpython/sql/plpython_drop.sql index 72d5d657ec..e4f373b2bc 100644 --- a/src/pl/plpython/sql/plpython_drop.sql +++ b/src/pl/plpython/sql/plpython_drop.sql @@ -3,6 +3,4 @@ -- SET client_min_messages = WARNING; -DROP EXTENSION plpythonu CASCADE; - -DROP EXTENSION IF EXISTS plpython2u CASCADE; +DROP EXTENSION plpython3u CASCADE; diff --git a/src/pl/plpython/sql/plpython_ereport.sql b/src/pl/plpython/sql/plpython_ereport.sql index 58df2057ef..d4f6223e59 100644 --- a/src/pl/plpython/sql/plpython_ereport.sql +++ b/src/pl/plpython/sql/plpython_ereport.sql @@ -17,28 +17,28 @@ plpy.info('This is message text.', plpy.notice('notice', detail='some detail') plpy.warning('warning', detail='some detail') plpy.error('stop on error', detail='some detail', hint='some hint') -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT elog_test(); -DO $$ plpy.info('other types', detail=(10, 20)) $$ LANGUAGE plpythonu; +DO $$ plpy.info('other types', detail=(10, 20)) $$ LANGUAGE plpython3u; DO $$ import time; from datetime import date plpy.info('other types', detail=date(2016, 2, 26)) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; DO $$ basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] plpy.info('other types', detail=basket) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; -- should fail -DO $$ plpy.info('wrong sqlstate', sqlstate='54444A') $$ LANGUAGE plpythonu; -DO $$ plpy.info('unsupported argument', blabla='fooboo') $$ LANGUAGE plpythonu; -DO $$ plpy.info('first message', message='second message') $$ LANGUAGE plpythonu; -DO $$ plpy.info('first message', 'second message', message='third message') $$ LANGUAGE plpythonu; +DO $$ plpy.info('wrong sqlstate', sqlstate='54444A') $$ LANGUAGE plpython3u; +DO $$ plpy.info('unsupported argument', blabla='fooboo') $$ LANGUAGE plpython3u; +DO $$ plpy.info('first message', message='second message') $$ LANGUAGE plpython3u; +DO $$ plpy.info('first message', 'second message', message='third message') $$ LANGUAGE plpython3u; -- raise exception in python, handle exception in plgsql CREATE OR REPLACE FUNCTION raise_exception(_message text, _detail text DEFAULT NULL, _hint text DEFAULT NULL, @@ -57,7 +57,7 @@ kwargs = { } # ignore None values plpy.error(**dict((k, v) for k, v in iter(kwargs.items()) if v)) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT raise_exception('hello', 'world'); SELECT raise_exception('message text', 'detail text', _sqlstate => 'YY333'); @@ -118,17 +118,13 @@ BEGIN END; $$; --- The displayed context is different between Python2 and Python3, --- but that's not important for this test. -\set SHOW_CONTEXT never - DO $$ try: plpy.execute("select raise_exception(_message => 'my message', _sqlstate => 'XX987', _hint => 'some hint', _table_name => 'users_tab', _datatype_name => 'user_type')") except Exception as e: plpy.info(e.spidata) raise e -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; DO $$ try: @@ -136,4 +132,4 @@ try: except Exception as e: plpy.info('sqlstate: %s, hint: %s, table_name: %s, datatype_name: %s' % (e.sqlstate, e.hint, e.table_name, e.datatype_name)) raise e -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; diff --git a/src/pl/plpython/sql/plpython_error.sql b/src/pl/plpython/sql/plpython_error.sql index 88d6936fd0..11f14ec5a7 100644 --- a/src/pl/plpython/sql/plpython_error.sql +++ b/src/pl/plpython/sql/plpython_error.sql @@ -7,7 +7,7 @@ CREATE FUNCTION python_syntax_error() RETURNS text AS '.syntaxerror' - LANGUAGE plpythonu; + LANGUAGE plpython3u; /* With check_function_bodies = false the function should get defined * and the error reported when called @@ -17,7 +17,7 @@ SET check_function_bodies = false; CREATE FUNCTION python_syntax_error() RETURNS text AS '.syntaxerror' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT python_syntax_error(); /* Run the function twice to check if the hashtable entry gets cleaned up */ @@ -30,7 +30,7 @@ RESET check_function_bodies; CREATE FUNCTION sql_syntax_error() RETURNS text AS 'plpy.execute("syntax error")' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT sql_syntax_error(); @@ -40,7 +40,7 @@ SELECT sql_syntax_error(); CREATE FUNCTION exception_index_invalid(text) RETURNS text AS 'return args[1]' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT exception_index_invalid('test'); @@ -51,7 +51,7 @@ CREATE FUNCTION exception_index_invalid_nested() RETURNS text AS 'rv = plpy.execute("SELECT test5(''foo'')") return rv[0]' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT exception_index_invalid_nested(); @@ -68,7 +68,7 @@ if len(rv): return rv[0]["fname"] return None ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT invalid_type_uncaught('rick'); @@ -90,7 +90,7 @@ if len(rv): return rv[0]["fname"] return None ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT invalid_type_caught('rick'); @@ -111,7 +111,7 @@ if len(rv): return rv[0]["fname"] return None ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT invalid_type_reraised('rick'); @@ -127,7 +127,7 @@ if len(rv): return rv[0]["fname"] return None ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT valid_type('rick'); @@ -147,7 +147,7 @@ def fun3(): fun3() return "not reached" ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT nested_error(); @@ -167,7 +167,7 @@ def fun3(): fun3() return "not reached" ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT nested_error_raise(); @@ -187,7 +187,7 @@ def fun3(): fun3() return "you''ve been warned" ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT nested_warning(); @@ -196,7 +196,7 @@ SELECT nested_warning(); CREATE FUNCTION toplevel_attribute_error() RETURNS void AS $$ plpy.nonexistent -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT toplevel_attribute_error(); @@ -213,7 +213,7 @@ def third(): plpy.execute("select sql_error()") first() -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE OR REPLACE FUNCTION sql_error() RETURNS void AS $$ begin @@ -229,7 +229,7 @@ $$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION sql_from_python_error() RETURNS void AS $$ plpy.execute("select sql_error()") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT python_traceback(); SELECT sql_error(); @@ -251,7 +251,7 @@ except spiexceptions.NotNullViolation as e: plpy.notice("Violated the NOT NULL constraint, sqlstate %s" % e.sqlstate) except spiexceptions.UniqueViolation as e: plpy.notice("Violated the UNIQUE constraint, sqlstate %s" % e.sqlstate) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT specific_exception(2); SELECT specific_exception(NULL); @@ -262,7 +262,7 @@ SELECT specific_exception(2); CREATE FUNCTION python_unique_violation() RETURNS void AS $$ plpy.execute("insert into specific values (1)") plpy.execute("insert into specific values (1)") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION catch_python_unique_violation() RETURNS text AS $$ begin @@ -283,7 +283,7 @@ CREATE FUNCTION manual_subxact() RETURNS void AS $$ plpy.execute("savepoint save") plpy.execute("create table foo(x integer)") plpy.execute("rollback to save") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT manual_subxact(); @@ -295,7 +295,7 @@ rollback = plpy.prepare("rollback to save") plpy.execute(save) plpy.execute("create table foo(x integer)") plpy.execute(rollback) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT manual_subxact_prepared(); @@ -303,7 +303,7 @@ SELECT manual_subxact_prepared(); */ CREATE FUNCTION plpy_raise_spiexception() RETURNS void AS $$ raise plpy.spiexceptions.DivisionByZero() -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; DO $$ BEGIN @@ -319,7 +319,7 @@ CREATE FUNCTION plpy_raise_spiexception_override() RETURNS void AS $$ exc = plpy.spiexceptions.DivisionByZero() exc.sqlstate = 'SILLY' raise exc -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; DO $$ BEGIN @@ -332,14 +332,14 @@ $$ LANGUAGE plpgsql; /* test the context stack trace for nested execution levels */ CREATE FUNCTION notice_innerfunc() RETURNS int AS $$ -plpy.execute("DO LANGUAGE plpythonu $x$ plpy.notice('inside DO') $x$") +plpy.execute("DO LANGUAGE plpython3u $x$ plpy.notice('inside DO') $x$") return 1 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION notice_outerfunc() RETURNS int AS $$ plpy.execute("SELECT notice_innerfunc()") return 1 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; \set SHOW_CONTEXT always diff --git a/src/pl/plpython/sql/plpython_global.sql b/src/pl/plpython/sql/plpython_global.sql index 32502b41ee..96d2049286 100644 --- a/src/pl/plpython/sql/plpython_global.sql +++ b/src/pl/plpython/sql/plpython_global.sql @@ -9,7 +9,7 @@ CREATE FUNCTION global_test_one() returns text if "global_test" not in GD: GD["global_test"] = "set by global_test_one" return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION global_test_two() returns text AS @@ -18,7 +18,7 @@ CREATE FUNCTION global_test_two() returns text if "global_test" not in GD: GD["global_test"] = "set by global_test_two" return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION static_test() returns int4 @@ -29,7 +29,7 @@ else: SD["call"] = 1 return SD["call"] ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; SELECT static_test(); diff --git a/src/pl/plpython/sql/plpython_import.sql b/src/pl/plpython/sql/plpython_import.sql index ec887677e1..3031eef2e6 100644 --- a/src/pl/plpython/sql/plpython_import.sql +++ b/src/pl/plpython/sql/plpython_import.sql @@ -7,7 +7,7 @@ CREATE FUNCTION import_fail() returns text except ImportError: return "failed as expected" return "succeeded, that wasn''t supposed to happen"' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION import_succeed() returns text @@ -28,7 +28,7 @@ except Exception as ex: plpy.notice("import failed -- %s" % str(ex)) return "failed, that wasn''t supposed to happen" return "succeeded, as expected"' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION import_test_one(p text) RETURNS text AS @@ -39,7 +39,7 @@ except ImportError: import sha digest = sha.new(p) return digest.hexdigest()' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION import_test_two(u users) RETURNS text AS @@ -51,7 +51,7 @@ except ImportError: import sha digest = sha.new(plain); return "sha hash of " + plain + " is " + digest.hexdigest()' - LANGUAGE plpythonu; + LANGUAGE plpython3u; -- import python modules diff --git a/src/pl/plpython/sql/plpython_newline.sql b/src/pl/plpython/sql/plpython_newline.sql index f9cee9491b..cb22ba923f 100644 --- a/src/pl/plpython/sql/plpython_newline.sql +++ b/src/pl/plpython/sql/plpython_newline.sql @@ -4,15 +4,15 @@ CREATE OR REPLACE FUNCTION newline_lf() RETURNS integer AS E'x = 100\ny = 23\nreturn x + y\n' -LANGUAGE plpythonu; +LANGUAGE plpython3u; CREATE OR REPLACE FUNCTION newline_cr() RETURNS integer AS E'x = 100\ry = 23\rreturn x + y\r' -LANGUAGE plpythonu; +LANGUAGE plpython3u; CREATE OR REPLACE FUNCTION newline_crlf() RETURNS integer AS E'x = 100\r\ny = 23\r\nreturn x + y\r\n' -LANGUAGE plpythonu; +LANGUAGE plpython3u; SELECT newline_lf(); diff --git a/src/pl/plpython/sql/plpython_params.sql b/src/pl/plpython/sql/plpython_params.sql index ee75c4dc41..8bab488859 100644 --- a/src/pl/plpython/sql/plpython_params.sql +++ b/src/pl/plpython/sql/plpython_params.sql @@ -4,13 +4,13 @@ CREATE FUNCTION test_param_names0(integer, integer) RETURNS int AS $$ return args[0] + args[1] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_param_names1(a0 integer, a1 text) RETURNS boolean AS $$ assert a0 == args[0] assert a1 == args[1] return True -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_param_names2(u users) RETURNS text AS $$ assert u == args[0] @@ -22,7 +22,7 @@ if isinstance(u, dict): else: s = str(u) return s -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; -- use deliberately wrong parameter names CREATE FUNCTION test_param_names3(a0 integer) RETURNS boolean AS $$ @@ -32,7 +32,7 @@ try: except NameError as e: assert e.args[0].find("a1") > -1 return True -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT test_param_names0(2,7); diff --git a/src/pl/plpython/sql/plpython_quote.sql b/src/pl/plpython/sql/plpython_quote.sql index 346b5485da..a1133e7e26 100644 --- a/src/pl/plpython/sql/plpython_quote.sql +++ b/src/pl/plpython/sql/plpython_quote.sql @@ -9,7 +9,7 @@ CREATE FUNCTION quote(t text, how text) RETURNS text AS $$ return plpy.quote_ident(t) else: raise plpy.Error("unrecognized quote type %s" % how) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT quote(t, 'literal') FROM (VALUES ('abc'), diff --git a/src/pl/plpython/sql/plpython_record.sql b/src/pl/plpython/sql/plpython_record.sql index 9bab4c9e82..52bad8bcce 100644 --- a/src/pl/plpython/sql/plpython_record.sql +++ b/src/pl/plpython/sql/plpython_record.sql @@ -27,7 +27,7 @@ elif typ == 'obj': type_record.first = first type_record.second = second return type_record -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_type_record_as(typ text, first text, second integer, retnull boolean) RETURNS type_record AS $$ if retnull: @@ -45,20 +45,20 @@ elif typ == 'obj': return type_record elif typ == 'str': return "('%s',%r)" % (first, second) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_in_out_params(first in text, second out text) AS $$ return first + '_in_to_out'; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_in_out_params_multi(first in text, second out text, third out text) AS $$ return (first + '_record_in_to_out_1', first + '_record_in_to_out_2'); -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_inout_params(first inout text) AS $$ return first + '_inout'; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; -- Test tuple returning functions @@ -136,14 +136,14 @@ SELECT * FROM test_type_record_as('obj', 'one', 1, false); CREATE FUNCTION test_type_record_error1() RETURNS type_record AS $$ return { 'first': 'first' } -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_record_error1(); CREATE FUNCTION test_type_record_error2() RETURNS type_record AS $$ return [ 'first' ] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_record_error2(); @@ -152,12 +152,12 @@ CREATE FUNCTION test_type_record_error3() RETURNS type_record AS $$ class type_record: pass type_record.first = 'first' return type_record -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_record_error3(); CREATE FUNCTION test_type_record_error4() RETURNS type_record AS $$ return 'foo' -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_record_error4(); diff --git a/src/pl/plpython/sql/plpython_setof.sql b/src/pl/plpython/sql/plpython_setof.sql index 16c2eef0ad..4cfb10192c 100644 --- a/src/pl/plpython/sql/plpython_setof.sql +++ b/src/pl/plpython/sql/plpython_setof.sql @@ -4,21 +4,21 @@ CREATE FUNCTION test_setof_error() RETURNS SETOF text AS $$ return 37 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT test_setof_error(); CREATE FUNCTION test_setof_as_list(count integer, content text) RETURNS SETOF text AS $$ return [ content ]*count -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_setof_as_tuple(count integer, content text) RETURNS SETOF text AS $$ t = () for i in range(count): t += ( content, ) return t -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_setof_as_iterator(count integer, content text) RETURNS SETOF text AS $$ class producer: @@ -27,13 +27,13 @@ class producer: self.icount = icount def __iter__ (self): return self - def next (self): + def __next__ (self): if self.icount == 0: raise StopIteration self.icount -= 1 return self.icontent return producer(count, content) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_setof_spi_in_iterator() RETURNS SETOF text AS $$ @@ -42,7 +42,7 @@ $$ yield s plpy.execute('select 2') $$ -LANGUAGE plpythonu; +LANGUAGE plpython3u; -- Test set returning functions @@ -69,7 +69,7 @@ global x while x <= lim: yield x x = x + 1 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT ugly(1, 5); @@ -81,7 +81,7 @@ CREATE OR REPLACE FUNCTION get_user_records() RETURNS SETOF users AS $$ return plpy.execute("SELECT * FROM users ORDER BY username") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT get_user_records(); SELECT * FROM get_user_records(); @@ -91,7 +91,7 @@ CREATE OR REPLACE FUNCTION get_user_records2() RETURNS TABLE(fname text, lname text, username text, userid int) AS $$ return plpy.execute("SELECT * FROM users ORDER BY username") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT get_user_records2(); SELECT * FROM get_user_records2(); diff --git a/src/pl/plpython/sql/plpython_spi.sql b/src/pl/plpython/sql/plpython_spi.sql index dd77833ed5..fcd113acaa 100644 --- a/src/pl/plpython/sql/plpython_spi.sql +++ b/src/pl/plpython/sql/plpython_spi.sql @@ -7,19 +7,19 @@ CREATE FUNCTION nested_call_one(a text) RETURNS text 'q = "SELECT nested_call_two(''%s'')" % a r = plpy.execute(q) return r[0]' - LANGUAGE plpythonu ; + LANGUAGE plpython3u ; CREATE FUNCTION nested_call_two(a text) RETURNS text AS 'q = "SELECT nested_call_three(''%s'')" % a r = plpy.execute(q) return r[0]' - LANGUAGE plpythonu ; + LANGUAGE plpython3u ; CREATE FUNCTION nested_call_three(a text) RETURNS text AS 'return a' - LANGUAGE plpythonu ; + LANGUAGE plpython3u ; -- some spi stuff @@ -35,7 +35,7 @@ except Exception as ex: plpy.error(str(ex)) return None ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION spi_prepared_plan_test_two(a text) RETURNS text AS @@ -49,7 +49,7 @@ except Exception as ex: plpy.error(str(ex)) return None ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION spi_prepared_plan_test_nested(a text) RETURNS text AS @@ -64,7 +64,7 @@ except Exception as ex: plpy.error(str(ex)) return None ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION join_sequences(s sequences) RETURNS text AS @@ -77,7 +77,7 @@ for r in rv: seq = seq + r["sequence"] return seq ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION spi_recursive_sum(a int) RETURNS int AS @@ -86,7 +86,7 @@ if a > 1: r = plpy.execute("SELECT spi_recursive_sum(%d) as a" % (a-1))[0]["a"] return a + r ' - LANGUAGE plpythonu; + LANGUAGE plpython3u; -- -- spi and nested calls @@ -120,7 +120,7 @@ if result.status() > 0: return result.nrows() else: return None -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT result_metadata_test($$SELECT 1 AS foo, '11'::text AS bar UNION SELECT 2, '22'$$); SELECT result_metadata_test($$CREATE TEMPORARY TABLE foo1 (a int, b text)$$); @@ -129,7 +129,7 @@ CREATE FUNCTION result_nrows_test(cmd text) RETURNS int AS $$ result = plpy.execute(cmd) return result.nrows() -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT result_nrows_test($$SELECT 1$$); SELECT result_nrows_test($$CREATE TEMPORARY TABLE foo2 (a int, b text)$$); @@ -140,7 +140,7 @@ CREATE FUNCTION result_len_test(cmd text) RETURNS int AS $$ result = plpy.execute(cmd) return len(result) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT result_len_test($$SELECT 1$$); SELECT result_len_test($$CREATE TEMPORARY TABLE foo3 (a int, b text)$$); @@ -162,7 +162,7 @@ result[-1] = {'c': 1000} result[:2] = [{'c': 10}, {'c': 100}] plpy.info([item['c'] for item in result[:]]) -# raises TypeError, but the message differs on Python 2.6, so silence it +# raises TypeError, catch so further tests could be added try: plpy.info(result['foo']) except TypeError: @@ -170,7 +170,7 @@ except TypeError: else: assert False, "TypeError not raised" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT result_subscript_test(); @@ -180,7 +180,7 @@ result = plpy.execute("select 1 where false") plpy.info(result[:]) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT result_empty_test(); @@ -189,7 +189,7 @@ AS $$ plan = plpy.prepare(cmd) result = plpy.execute(plan) return str(result) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT result_str_test($$SELECT 1 AS foo UNION SELECT 2$$); SELECT result_str_test($$CREATE TEMPORARY TABLE foo1 (a int, b text)$$); @@ -203,13 +203,13 @@ for row in res: if row['lname'] == 'doe': does += 1 return does -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION double_cursor_close() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users") res.close() res.close() -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_fetch() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users") @@ -228,7 +228,7 @@ except StopIteration: pass else: assert False, "StopIteration not raised" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_mix_next_and_fetch() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users order by fname") @@ -242,7 +242,7 @@ except AttributeError: assert item['fname'] == 'rick' assert len(res.fetch(2)) == 1 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION fetch_after_close() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users") @@ -253,7 +253,7 @@ except ValueError: pass else: assert False, "ValueError not raised" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION next_after_close() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users") @@ -267,7 +267,7 @@ except ValueError: pass else: assert False, "ValueError not raised" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_fetch_next_empty() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users where false") @@ -281,7 +281,7 @@ except StopIteration: pass else: assert False, "StopIteration not raised" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_plan() RETURNS SETOF text AS $$ plan = plpy.prepare( @@ -291,13 +291,13 @@ for row in plpy.cursor(plan, ["w"]): yield row['fname'] for row in plan.cursor(["j"]): yield row['fname'] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_plan_wrong_args() RETURNS SETOF text AS $$ plan = plpy.prepare("select fname, lname from users where fname like $1 || '%'", ["text"]) c = plpy.cursor(plan, ["a", "b"]) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TYPE test_composite_type AS ( a1 int, @@ -308,7 +308,7 @@ CREATE OR REPLACE FUNCTION plan_composite_args() RETURNS test_composite_type AS plan = plpy.prepare("select $1 as c1", ["test_composite_type"]) res = plpy.execute(plan, [{"a1": 3, "a2": "label"}]) return res[0]["c1"] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT simple_cursor_test(); SELECT double_cursor_close(); diff --git a/src/pl/plpython/sql/plpython_subtransaction.sql b/src/pl/plpython/sql/plpython_subtransaction.sql index cc4b1ae102..c65c380f40 100644 --- a/src/pl/plpython/sql/plpython_subtransaction.sql +++ b/src/pl/plpython/sql/plpython_subtransaction.sql @@ -17,7 +17,7 @@ with plpy.subtransaction(): plpy.execute("INSERT INTO subtransaction_tbl VALUES ('oops')") elif what_error == "Python": raise Exception("Python exception") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT subtransaction_ctx_test(); SELECT * FROM subtransaction_tbl; @@ -45,7 +45,7 @@ with plpy.subtransaction(): raise plpy.notice("Swallowed %s(%r)" % (e.__class__.__name__, e.args[0])) return "ok" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT subtransaction_nested_test(); SELECT * FROM subtransaction_tbl; @@ -65,7 +65,7 @@ with plpy.subtransaction(): plpy.execute("INSERT INTO subtransaction_tbl VALUES (2)") plpy.execute("SELECT subtransaction_nested_test('t')") return "ok" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT subtransaction_deeply_nested_test(); SELECT * FROM subtransaction_tbl; @@ -76,25 +76,25 @@ TRUNCATE subtransaction_tbl; CREATE FUNCTION subtransaction_exit_without_enter() RETURNS void AS $$ plpy.subtransaction().__exit__(None, None, None) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION subtransaction_enter_without_exit() RETURNS void AS $$ plpy.subtransaction().__enter__() -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION subtransaction_exit_twice() RETURNS void AS $$ plpy.subtransaction().__enter__() plpy.subtransaction().__exit__(None, None, None) plpy.subtransaction().__exit__(None, None, None) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION subtransaction_enter_twice() RETURNS void AS $$ plpy.subtransaction().__enter__() plpy.subtransaction().__enter__() -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION subtransaction_exit_same_subtransaction_twice() RETURNS void AS $$ @@ -102,7 +102,7 @@ s = plpy.subtransaction() s.__enter__() s.__exit__(None, None, None) s.__exit__(None, None, None) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION subtransaction_enter_same_subtransaction_twice() RETURNS void AS $$ @@ -110,14 +110,14 @@ s = plpy.subtransaction() s.__enter__() s.__enter__() s.__exit__(None, None, None) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; -- No warnings here, as the subtransaction gets indeed closed CREATE FUNCTION subtransaction_enter_subtransaction_in_with() RETURNS void AS $$ with plpy.subtransaction() as s: s.__enter__() -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION subtransaction_exit_subtransaction_in_with() RETURNS void AS $$ @@ -126,7 +126,7 @@ try: s.__exit__(None, None, None) except ValueError as e: raise ValueError(e) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT subtransaction_exit_without_enter(); SELECT subtransaction_enter_without_exit(); @@ -159,7 +159,7 @@ try: plpy.execute(p, ["wrong"]) except plpy.SPIError: plpy.warning("Caught a SPI error") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT subtransaction_mix_explicit_and_implicit(); SELECT * FROM subtransaction_tbl; @@ -172,7 +172,7 @@ AS $$ s = plpy.subtransaction() s.enter() s.exit(None, None, None) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT subtransaction_alternative_names(); @@ -186,7 +186,7 @@ with plpy.subtransaction(): plpy.execute("INSERT INTO subtransaction_tbl VALUES ('a')") except plpy.SPIError: plpy.notice("caught") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT try_catch_inside_subtransaction(); SELECT * FROM subtransaction_tbl; @@ -202,7 +202,7 @@ with plpy.subtransaction(): plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)") except plpy.SPIError: plpy.notice("caught") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT pk_violation_inside_subtransaction(); SELECT * FROM subtransaction_tbl; @@ -217,7 +217,7 @@ with plpy.subtransaction(): cur.fetch(10) fetched = cur.fetch(10); return int(fetched[5]["i"]) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_aborted_subxact() RETURNS int AS $$ try: @@ -229,7 +229,7 @@ except plpy.SPIError: fetched = cur.fetch(10) return int(fetched[5]["i"]) return 0 # not reached -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_plan_aborted_subxact() RETURNS int AS $$ try: @@ -243,7 +243,7 @@ except plpy.SPIError: fetched = cur.fetch(5) return fetched[2]["i"] return 0 # not reached -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION cursor_close_aborted_subxact() RETURNS boolean AS $$ try: @@ -254,7 +254,7 @@ except plpy.SPIError: cur.close() return True return False # not reached -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT cursor_in_subxact(); SELECT cursor_aborted_subxact(); diff --git a/src/pl/plpython/sql/plpython_test.sql b/src/pl/plpython/sql/plpython_test.sql index 5f1be9c94a..aa22a27415 100644 --- a/src/pl/plpython/sql/plpython_test.sql +++ b/src/pl/plpython/sql/plpython_test.sql @@ -1,13 +1,13 @@ -- first some tests of basic functionality -CREATE EXTENSION plpython2u; +CREATE EXTENSION plpython3u; -- really stupid function just to get the module loaded -CREATE FUNCTION stupid() RETURNS text AS 'return "zarkon"' LANGUAGE plpythonu; +CREATE FUNCTION stupid() RETURNS text AS 'return "zarkon"' LANGUAGE plpython3u; select stupid(); -- check 2/3 versioning -CREATE FUNCTION stupidn() RETURNS text AS 'return "zarkon"' LANGUAGE plpython2u; +CREATE FUNCTION stupidn() RETURNS text AS 'return "zarkon"' LANGUAGE plpython3u; select stupidn(); @@ -21,7 +21,7 @@ for key in keys: out.append("%s: %s" % (key, u[key])) words = a1 + " " + a2 + " => {" + ", ".join(out) + "}" return words' - LANGUAGE plpythonu; + LANGUAGE plpython3u; select "Argument test #1"(users, fname, lname) from users where lname = 'doe' order by 1; @@ -32,7 +32,7 @@ $$ contents = list(filter(lambda x: not x.startswith("__"), dir(plpy))) contents.sort() return contents -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select module_contents(); @@ -47,6 +47,6 @@ plpy.info('info', 37, [1, 2, 3]) plpy.notice('notice') plpy.warning('warning') plpy.error('error') -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT elog_test_basic(); diff --git a/src/pl/plpython/sql/plpython_transaction.sql b/src/pl/plpython/sql/plpython_transaction.sql index 68588d9fb0..c939ba76d4 100644 --- a/src/pl/plpython/sql/plpython_transaction.sql +++ b/src/pl/plpython/sql/plpython_transaction.sql @@ -2,7 +2,7 @@ CREATE TABLE test1 (a int, b text); CREATE PROCEDURE transaction_test1() -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ for i in range(0, 10): plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i) @@ -20,7 +20,7 @@ SELECT * FROM test1; TRUNCATE test1; DO -LANGUAGE plpythonu +LANGUAGE plpython3u $$ for i in range(0, 10): plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i) @@ -37,7 +37,7 @@ TRUNCATE test1; -- not allowed in a function CREATE FUNCTION transaction_test2() RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ for i in range(0, 10): plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i) @@ -55,7 +55,7 @@ SELECT * FROM test1; -- also not allowed if procedure is called from a function CREATE FUNCTION transaction_test3() RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ plpy.execute("CALL transaction_test1()") return 1 @@ -68,9 +68,9 @@ SELECT * FROM test1; -- DO block inside function CREATE FUNCTION transaction_test4() RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ -plpy.execute("DO LANGUAGE plpythonu $x$ plpy.commit() $x$") +plpy.execute("DO LANGUAGE plpython3u $x$ plpy.commit() $x$") return 1 $$; @@ -78,7 +78,7 @@ SELECT transaction_test4(); -- commit inside subtransaction (prohibited) -DO LANGUAGE plpythonu $$ +DO LANGUAGE plpython3u $$ s = plpy.subtransaction() s.enter() plpy.commit() @@ -91,7 +91,7 @@ INSERT INTO test2 VALUES (0), (1), (2), (3), (4); TRUNCATE test1; -DO LANGUAGE plpythonu $$ +DO LANGUAGE plpython3u $$ for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"): plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x']) plpy.commit() @@ -106,7 +106,7 @@ SELECT * FROM pg_cursors; -- error in cursor loop with commit TRUNCATE test1; -DO LANGUAGE plpythonu $$ +DO LANGUAGE plpython3u $$ for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"): plpy.execute("INSERT INTO test1 (a) VALUES (12/(%s-2))" % row['x']) plpy.commit() @@ -120,7 +120,7 @@ SELECT * FROM pg_cursors; -- rollback inside cursor loop TRUNCATE test1; -DO LANGUAGE plpythonu $$ +DO LANGUAGE plpython3u $$ for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"): plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x']) plpy.rollback() @@ -134,7 +134,7 @@ SELECT * FROM pg_cursors; -- first commit then rollback inside cursor loop TRUNCATE test1; -DO LANGUAGE plpythonu $$ +DO LANGUAGE plpython3u $$ for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"): plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x']) if row['x'] % 2 == 0: @@ -152,7 +152,7 @@ SELECT * FROM pg_cursors; CREATE TABLE testpk (id int PRIMARY KEY); CREATE TABLE testfk(f1 int REFERENCES testpk DEFERRABLE INITIALLY DEFERRED); -DO LANGUAGE plpythonu $$ +DO LANGUAGE plpython3u $$ # this insert will fail during commit: plpy.execute("INSERT INTO testfk VALUES (0)") plpy.commit() @@ -162,7 +162,7 @@ $$; SELECT * FROM testpk; SELECT * FROM testfk; -DO LANGUAGE plpythonu $$ +DO LANGUAGE plpython3u $$ # this insert will fail during commit: plpy.execute("INSERT INTO testfk VALUES (0)") try: diff --git a/src/pl/plpython/sql/plpython_trigger.sql b/src/pl/plpython/sql/plpython_trigger.sql index 19852dc585..e5504b9ab1 100644 --- a/src/pl/plpython/sql/plpython_trigger.sql +++ b/src/pl/plpython/sql/plpython_trigger.sql @@ -16,7 +16,7 @@ if TD["new"]["fname"] == "william": TD["new"]["fname"] = TD["args"][0] rv = "MODIFY" return rv' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION users_update() returns trigger @@ -25,7 +25,7 @@ CREATE FUNCTION users_update() returns trigger if TD["old"]["fname"] != TD["new"]["fname"] and TD["old"]["fname"] == TD["args"][0]: return "SKIP" return None' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE FUNCTION users_delete() RETURNS trigger @@ -33,7 +33,7 @@ CREATE FUNCTION users_delete() RETURNS trigger 'if TD["old"]["fname"] == TD["args"][0]: return "SKIP" return None' - LANGUAGE plpythonu; + LANGUAGE plpython3u; CREATE TRIGGER users_insert_trig BEFORE INSERT ON users FOR EACH ROW @@ -72,7 +72,7 @@ CREATE TABLE trigger_test_generated ( j int GENERATED ALWAYS AS (i * 2) STORED ); -CREATE FUNCTION trigger_data() RETURNS trigger LANGUAGE plpythonu AS $$ +CREATE FUNCTION trigger_data() RETURNS trigger LANGUAGE plpython3u AS $$ if 'relid' in TD: TD['relid'] = "bogus:12345" @@ -157,7 +157,7 @@ INSERT INTO trigger_test VALUES (0, 'zero'); CREATE FUNCTION stupid1() RETURNS trigger AS $$ return 37 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger1 BEFORE INSERT ON trigger_test @@ -173,7 +173,7 @@ DROP TRIGGER stupid_trigger1 ON trigger_test; CREATE FUNCTION stupid2() RETURNS trigger AS $$ return "MODIFY" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger2 BEFORE DELETE ON trigger_test @@ -191,7 +191,7 @@ INSERT INTO trigger_test VALUES (0, 'zero'); CREATE FUNCTION stupid3() RETURNS trigger AS $$ return "foo" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger3 BEFORE UPDATE ON trigger_test @@ -206,8 +206,8 @@ DROP TRIGGER stupid_trigger3 ON trigger_test; CREATE FUNCTION stupid3u() RETURNS trigger AS $$ - return u"foo" -$$ LANGUAGE plpythonu; + return "foo" +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger3 BEFORE UPDATE ON trigger_test @@ -224,7 +224,7 @@ CREATE FUNCTION stupid4() RETURNS trigger AS $$ del TD["new"] return "MODIFY"; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger4 BEFORE UPDATE ON trigger_test @@ -241,7 +241,7 @@ CREATE FUNCTION stupid5() RETURNS trigger AS $$ TD["new"] = ['foo', 'bar'] return "MODIFY"; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger5 BEFORE UPDATE ON trigger_test @@ -258,7 +258,7 @@ CREATE FUNCTION stupid6() RETURNS trigger AS $$ TD["new"] = {1: 'foo', 2: 'bar'} return "MODIFY"; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger6 BEFORE UPDATE ON trigger_test @@ -275,7 +275,7 @@ CREATE FUNCTION stupid7() RETURNS trigger AS $$ TD["new"] = {'v': 'foo', 'a': 'bar'} return "MODIFY"; -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger7 BEFORE UPDATE ON trigger_test @@ -290,9 +290,9 @@ DROP TRIGGER stupid_trigger7 ON trigger_test; CREATE FUNCTION stupid7u() RETURNS trigger AS $$ - TD["new"] = {u'v': 'foo', u'a': 'bar'} + TD["new"] = {'v': 'foo', 'a': 'bar'} return "MODIFY" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER stupid_trigger7 BEFORE UPDATE ON trigger_test @@ -318,7 +318,7 @@ CREATE FUNCTION test_null() RETURNS trigger AS $$ TD["new"]['v'] = None return "MODIFY" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER test_null_trigger BEFORE UPDATE ON trigger_test @@ -341,7 +341,7 @@ SET DateStyle = 'ISO'; CREATE FUNCTION set_modif_time() RETURNS trigger AS $$ TD['new']['modif_time'] = '2010-10-13 21:57:28.930486' return 'MODIFY' -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TABLE pb (a TEXT, modif_time TIMESTAMP(0) WITHOUT TIME ZONE); @@ -365,7 +365,7 @@ CREATE FUNCTION composite_trigger_f() RETURNS trigger AS $$ TD['new']['f1'] = (3, False) TD['new']['f2'] = {'k': 7, 'l': 'yes', 'ignored': 10} return 'MODIFY' -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER composite_trigger BEFORE INSERT ON composite_trigger_test FOR EACH ROW EXECUTE PROCEDURE composite_trigger_f(); @@ -380,7 +380,7 @@ CREATE TABLE composite_trigger_noop_test (f1 comp1, f2 comp2); CREATE FUNCTION composite_trigger_noop_f() RETURNS trigger AS $$ return 'MODIFY' -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER composite_trigger_noop BEFORE INSERT ON composite_trigger_noop_test FOR EACH ROW EXECUTE PROCEDURE composite_trigger_noop_f(); @@ -399,7 +399,7 @@ CREATE TABLE composite_trigger_nested_test(c comp3); CREATE FUNCTION composite_trigger_nested_f() RETURNS trigger AS $$ return 'MODIFY' -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE TRIGGER composite_trigger_nested BEFORE INSERT ON composite_trigger_nested_test FOR EACH ROW EXECUTE PROCEDURE composite_trigger_nested_f(); @@ -410,7 +410,7 @@ INSERT INTO composite_trigger_nested_test VALUES (ROW(ROW(NULL, 't'), ROW(1, 'f' SELECT * FROM composite_trigger_nested_test; -- check that using a function as a trigger over two tables works correctly -CREATE FUNCTION trig1234() RETURNS trigger LANGUAGE plpythonu AS $$ +CREATE FUNCTION trig1234() RETURNS trigger LANGUAGE plpython3u AS $$ TD["new"]["data"] = '1234' return 'MODIFY' $$; @@ -432,7 +432,7 @@ SELECT * FROM b; CREATE TABLE transition_table_test (id int, name text); INSERT INTO transition_table_test VALUES (1, 'a'); -CREATE FUNCTION transition_table_test_f() RETURNS trigger LANGUAGE plpythonu AS +CREATE FUNCTION transition_table_test_f() RETURNS trigger LANGUAGE plpython3u AS $$ rv = plpy.execute("SELECT * FROM old_table") assert(rv.nrows() == 1) @@ -455,7 +455,7 @@ DROP FUNCTION transition_table_test_f(); -- dealing with generated columns CREATE FUNCTION generated_test_func1() RETURNS trigger -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ TD['new']['j'] = 5 # not allowed return 'MODIFY' diff --git a/src/pl/plpython/sql/plpython_types.sql b/src/pl/plpython/sql/plpython_types.sql index 0d207d9c01..40f4f79d99 100644 --- a/src/pl/plpython/sql/plpython_types.sql +++ b/src/pl/plpython/sql/plpython_types.sql @@ -9,7 +9,7 @@ CREATE FUNCTION test_type_conversion_bool(x bool) RETURNS bool AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_bool(true); SELECT * FROM test_type_conversion_bool(false); @@ -35,7 +35,7 @@ elif n == 5: ret = [0] plpy.info(ret, not not ret) return ret -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_bool_other(0); SELECT * FROM test_type_conversion_bool_other(1); @@ -48,7 +48,7 @@ SELECT * FROM test_type_conversion_bool_other(5); CREATE FUNCTION test_type_conversion_char(x char) RETURNS char AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_char('a'); SELECT * FROM test_type_conversion_char(null); @@ -57,7 +57,7 @@ SELECT * FROM test_type_conversion_char(null); CREATE FUNCTION test_type_conversion_int2(x int2) RETURNS int2 AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_int2(100::int2); SELECT * FROM test_type_conversion_int2(-100::int2); @@ -67,7 +67,7 @@ SELECT * FROM test_type_conversion_int2(null); CREATE FUNCTION test_type_conversion_int4(x int4) RETURNS int4 AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_int4(100); SELECT * FROM test_type_conversion_int4(-100); @@ -77,7 +77,7 @@ SELECT * FROM test_type_conversion_int4(null); CREATE FUNCTION test_type_conversion_int8(x int8) RETURNS int8 AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_int8(100); SELECT * FROM test_type_conversion_int8(-100); @@ -90,7 +90,7 @@ CREATE FUNCTION test_type_conversion_numeric(x numeric) RETURNS numeric AS $$ # between decimal and cdecimal plpy.info(str(x), x.__class__.__name__) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_numeric(100); SELECT * FROM test_type_conversion_numeric(-100); @@ -105,7 +105,7 @@ SELECT * FROM test_type_conversion_numeric(null); CREATE FUNCTION test_type_conversion_float4(x float4) RETURNS float4 AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_float4(100); SELECT * FROM test_type_conversion_float4(-100); @@ -116,7 +116,7 @@ SELECT * FROM test_type_conversion_float4(null); CREATE FUNCTION test_type_conversion_float8(x float8) RETURNS float8 AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_float8(100); SELECT * FROM test_type_conversion_float8(-100); @@ -128,7 +128,7 @@ SELECT * FROM test_type_conversion_float8(100100100.654321); CREATE FUNCTION test_type_conversion_oid(x oid) RETURNS oid AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_oid(100); SELECT * FROM test_type_conversion_oid(2147483649); @@ -138,7 +138,7 @@ SELECT * FROM test_type_conversion_oid(null); CREATE FUNCTION test_type_conversion_text(x text) RETURNS text AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_text('hello world'); SELECT * FROM test_type_conversion_text(null); @@ -147,7 +147,7 @@ SELECT * FROM test_type_conversion_text(null); CREATE FUNCTION test_type_conversion_bytea(x bytea) RETURNS bytea AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_bytea('hello world'); SELECT * FROM test_type_conversion_bytea(E'null\\000byte'); @@ -157,7 +157,7 @@ SELECT * FROM test_type_conversion_bytea(null); CREATE FUNCTION test_type_marshal() RETURNS bytea AS $$ import marshal return marshal.dumps('hello world') -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_type_unmarshal(x bytea) RETURNS text AS $$ import marshal @@ -165,7 +165,7 @@ try: return marshal.loads(x) except ValueError as e: return 'FAILED: ' + str(e) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT test_type_unmarshal(x) FROM test_type_marshal() x; @@ -178,7 +178,7 @@ CREATE DOMAIN booltrue AS bool CHECK (VALUE IS TRUE OR VALUE IS NULL); CREATE FUNCTION test_type_conversion_booltrue(x booltrue, y bool) RETURNS booltrue AS $$ return y -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_booltrue(true, true); SELECT * FROM test_type_conversion_booltrue(false, true); @@ -190,7 +190,7 @@ CREATE DOMAIN uint2 AS int2 CHECK (VALUE >= 0); CREATE FUNCTION test_type_conversion_uint2(x uint2, y int) RETURNS uint2 AS $$ plpy.info(x, type(x)) return y -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_uint2(100::uint2, 50); SELECT * FROM test_type_conversion_uint2(100::uint2, -50); @@ -201,7 +201,7 @@ CREATE DOMAIN nnint AS int CHECK (VALUE IS NOT NULL); CREATE FUNCTION test_type_conversion_nnint(x nnint, y int) RETURNS nnint AS $$ return y -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_nnint(10, 20); SELECT * FROM test_type_conversion_nnint(null, 20); @@ -213,7 +213,7 @@ CREATE DOMAIN bytea10 AS bytea CHECK (octet_length(VALUE) = 10 AND VALUE IS NOT CREATE FUNCTION test_type_conversion_bytea10(x bytea10, y bytea) RETURNS bytea10 AS $$ plpy.info(x, type(x)) return y -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_bytea10('hello wold', 'hello wold'); SELECT * FROM test_type_conversion_bytea10('hello world', 'hello wold'); @@ -229,7 +229,7 @@ SELECT * FROM test_type_conversion_bytea10('hello word', null); CREATE FUNCTION test_type_conversion_array_int4(x int4[]) RETURNS int4[] AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_int4(ARRAY[0, 100]); SELECT * FROM test_type_conversion_array_int4(ARRAY[0,-100,55]); @@ -243,14 +243,14 @@ SELECT * FROM test_type_conversion_array_int4('[2:4]={1,2,3}'); CREATE FUNCTION test_type_conversion_array_int8(x int8[]) RETURNS int8[] AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_int8(ARRAY[[[1,2,NULL],[NULL,5,6]],[[NULL,8,9],[10,11,12]]]::int8[]); CREATE FUNCTION test_type_conversion_array_date(x date[]) RETURNS date[] AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_date(ARRAY[[['2016-09-21','2016-09-22',NULL],[NULL,'2016-10-21','2016-10-22']], [[NULL,'2016-11-21','2016-10-21'],['2015-09-21','2015-09-22','2014-09-21']]]::date[]); @@ -258,7 +258,7 @@ SELECT * FROM test_type_conversion_array_date(ARRAY[[['2016-09-21','2016-09-22', CREATE FUNCTION test_type_conversion_array_timestamp(x timestamp[]) RETURNS timestamp[] AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_timestamp(ARRAY[[['2016-09-21 15:34:24.078792-04','2016-10-22 11:34:24.078795-04',NULL], [NULL,'2016-10-21 11:34:25.078792-04','2016-10-21 11:34:24.098792-04']], @@ -270,7 +270,7 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemint4(h int4, i int4, j int4, k int4 ) m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)] plpy.info(m, type(m)) return m -$BODY$ LANGUAGE plpythonu; +$BODY$ LANGUAGE plpython3u; select pyreturnmultidemint4(8,5,3,2); @@ -278,7 +278,7 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemint8(h int4, i int4, j int4, k int4 ) m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)] plpy.info(m, type(m)) return m -$BODY$ LANGUAGE plpythonu; +$BODY$ LANGUAGE plpython3u; select pyreturnmultidemint8(5,5,3,2); @@ -286,7 +286,7 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemfloat4(h int4, i int4, j int4, k int4 m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)] plpy.info(m, type(m)) return m -$BODY$ LANGUAGE plpythonu; +$BODY$ LANGUAGE plpython3u; select pyreturnmultidemfloat4(6,5,3,2); @@ -294,14 +294,14 @@ CREATE OR REPLACE FUNCTION pyreturnmultidemfloat8(h int4, i int4, j int4, k int4 m = [[[[x for x in range(h)] for y in range(i)] for z in range(j)] for w in range(k)] plpy.info(m, type(m)) return m -$BODY$ LANGUAGE plpythonu; +$BODY$ LANGUAGE plpython3u; select pyreturnmultidemfloat8(7,5,3,2); CREATE FUNCTION test_type_conversion_array_text(x text[]) RETURNS text[] AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_text(ARRAY['foo', 'bar']); SELECT * FROM test_type_conversion_array_text(ARRAY[['foo', 'bar'],['foo2', 'bar2']]); @@ -310,59 +310,59 @@ SELECT * FROM test_type_conversion_array_text(ARRAY[['foo', 'bar'],['foo2', 'bar CREATE FUNCTION test_type_conversion_array_bytea(x bytea[]) RETURNS bytea[] AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_bytea(ARRAY[E'\\xdeadbeef'::bytea, NULL]); CREATE FUNCTION test_type_conversion_array_mixed1() RETURNS text[] AS $$ return [123, 'abc'] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_mixed1(); CREATE FUNCTION test_type_conversion_array_mixed2() RETURNS int[] AS $$ return [123, 'abc'] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_mixed2(); CREATE FUNCTION test_type_conversion_mdarray_malformed() RETURNS int[] AS $$ return [[1,2,3],[4,5]] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_mdarray_malformed(); CREATE FUNCTION test_type_conversion_mdarray_toodeep() RETURNS int[] AS $$ return [[[[[[[1]]]]]]] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_mdarray_toodeep(); CREATE FUNCTION test_type_conversion_array_record() RETURNS type_record[] AS $$ return [{'first': 'one', 'second': 42}, {'first': 'two', 'second': 11}] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_record(); CREATE FUNCTION test_type_conversion_array_string() RETURNS text[] AS $$ return 'abc' -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_string(); CREATE FUNCTION test_type_conversion_array_tuple() RETURNS text[] AS $$ return ('abc', 'def') -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_tuple(); CREATE FUNCTION test_type_conversion_array_error() RETURNS int[] AS $$ return 5 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_error(); @@ -376,14 +376,14 @@ CREATE DOMAIN ordered_pair_domain AS integer[] CHECK (array_length(VALUE,1)=2 AN CREATE FUNCTION test_type_conversion_array_domain(x ordered_pair_domain) RETURNS ordered_pair_domain AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_domain(ARRAY[0, 100]::ordered_pair_domain); SELECT * FROM test_type_conversion_array_domain(NULL::ordered_pair_domain); CREATE FUNCTION test_type_conversion_array_domain_check_violation() RETURNS ordered_pair_domain AS $$ return [2,1] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_domain_check_violation(); @@ -394,13 +394,13 @@ SELECT * FROM test_type_conversion_array_domain_check_violation(); CREATE FUNCTION test_read_uint2_array(x uint2[]) RETURNS uint2 AS $$ plpy.info(x, type(x)) return x[0] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_read_uint2_array(array[1::uint2]); CREATE FUNCTION test_build_uint2_array(x int2) RETURNS uint2[] AS $$ return [x, x] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_build_uint2_array(1::int2); select test_build_uint2_array(-1::int2); -- fail @@ -413,7 +413,7 @@ select test_build_uint2_array(-1::int2); -- fail CREATE FUNCTION test_type_conversion_domain_array(x integer[]) RETURNS ordered_pair_domain[] AS $$ return [x, x] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_domain_array(array[2,4]); select test_type_conversion_domain_array(array[4,2]); -- fail @@ -422,7 +422,7 @@ CREATE FUNCTION test_type_conversion_domain_array2(x ordered_pair_domain) RETURNS integer AS $$ plpy.info(x, type(x)) return x[1] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_domain_array2(array[2,4]); select test_type_conversion_domain_array2(array[4,2]); -- fail @@ -431,7 +431,7 @@ CREATE FUNCTION test_type_conversion_array_domain_array(x ordered_pair_domain[]) RETURNS ordered_pair_domain AS $$ plpy.info(x, type(x)) return x[0] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_array_domain_array(array[array[2,4]::ordered_pair_domain]); @@ -450,7 +450,7 @@ INSERT INTO employee VALUES ('John', 100, 10), ('Mary', 200, 10); CREATE OR REPLACE FUNCTION test_composite_table_input(e employee) RETURNS integer AS $$ return e['basesalary'] + e['bonus'] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT name, test_composite_table_input(employee.*) FROM employee; @@ -470,7 +470,7 @@ CREATE TYPE named_pair AS ( CREATE OR REPLACE FUNCTION test_composite_type_input(p named_pair) RETURNS integer AS $$ return sum(p.values()) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT test_composite_type_input(row(1, 2)); @@ -487,7 +487,7 @@ CREATE TYPE nnint_container AS (f1 int, f2 nnint); CREATE FUNCTION nnint_test(x int, y int) RETURNS nnint_container AS $$ return {'f1': x, 'f2': y} -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT nnint_test(null, 3); SELECT nnint_test(3, null); -- fail @@ -501,21 +501,21 @@ CREATE DOMAIN ordered_named_pair AS named_pair_2 CHECK((VALUE).i <= (VALUE).j); CREATE FUNCTION read_ordered_named_pair(p ordered_named_pair) RETURNS integer AS $$ return p['i'] + p['j'] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT read_ordered_named_pair(row(1, 2)); SELECT read_ordered_named_pair(row(2, 1)); -- fail CREATE FUNCTION build_ordered_named_pair(i int, j int) RETURNS ordered_named_pair AS $$ return {'i': i, 'j': j} -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT build_ordered_named_pair(1,2); SELECT build_ordered_named_pair(2,1); -- fail CREATE FUNCTION build_ordered_named_pairs(i int, j int) RETURNS ordered_named_pair[] AS $$ return [{'i': i, 'j': j}, {'i': i, 'j': j+1}] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT build_ordered_named_pairs(1,2); SELECT build_ordered_named_pairs(2,1); -- fail @@ -526,7 +526,7 @@ SELECT build_ordered_named_pairs(2,1); -- fail -- CREATE OR REPLACE FUNCTION test_prep_bool_input() RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ plan = plpy.prepare("SELECT CASE WHEN $1 THEN 1 ELSE 0 END AS val", ['boolean']) rv = plpy.execute(plan, ['fa'], 5) # 'fa' is true in Python @@ -537,7 +537,7 @@ SELECT test_prep_bool_input(); -- 1 CREATE OR REPLACE FUNCTION test_prep_bool_output() RETURNS bool -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ plan = plpy.prepare("SELECT $1 = 1 AS val", ['int']) rv = plpy.execute(plan, [0], 5) @@ -549,7 +549,7 @@ SELECT test_prep_bool_output(); -- false CREATE OR REPLACE FUNCTION test_prep_bytea_input(bb bytea) RETURNS int -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ plan = plpy.prepare("SELECT octet_length($1) AS val", ['bytea']) rv = plpy.execute(plan, [bb], 5) @@ -560,7 +560,7 @@ SELECT test_prep_bytea_input(E'a\\000b'); -- 3 (embedded null formerly truncated CREATE OR REPLACE FUNCTION test_prep_bytea_output() RETURNS bytea -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ plan = plpy.prepare("SELECT decode('aa00bb', 'hex') AS val") rv = plpy.execute(plan, [], 5) diff --git a/src/pl/plpython/sql/plpython_unicode.sql b/src/pl/plpython/sql/plpython_unicode.sql index a11e5eeaa2..14f7b4e005 100644 --- a/src/pl/plpython/sql/plpython_unicode.sql +++ b/src/pl/plpython/sql/plpython_unicode.sql @@ -14,28 +14,28 @@ CREATE TABLE unicode_test ( ); CREATE FUNCTION unicode_return() RETURNS text AS E' -return u"\\xA0" -' LANGUAGE plpythonu; +return "\\xA0" +' LANGUAGE plpython3u; CREATE FUNCTION unicode_trigger() RETURNS trigger AS E' -TD["new"]["testvalue"] = u"\\xA0" +TD["new"]["testvalue"] = "\\xA0" return "MODIFY" -' LANGUAGE plpythonu; +' LANGUAGE plpython3u; CREATE TRIGGER unicode_test_bi BEFORE INSERT ON unicode_test FOR EACH ROW EXECUTE PROCEDURE unicode_trigger(); CREATE FUNCTION unicode_plan1() RETURNS text AS E' plan = plpy.prepare("SELECT $1 AS testvalue", ["text"]) -rv = plpy.execute(plan, [u"\\xA0"], 1) +rv = plpy.execute(plan, ["\\xA0"], 1) return rv[0]["testvalue"] -' LANGUAGE plpythonu; +' LANGUAGE plpython3u; CREATE FUNCTION unicode_plan2() RETURNS text AS E' -plan = plpy.prepare("SELECT $1 || $2 AS testvalue", ["text", u"text"]) +plan = plpy.prepare("SELECT $1 || $2 AS testvalue", ["text", "text"]) rv = plpy.execute(plan, ["foo", "bar"], 1) return rv[0]["testvalue"] -' LANGUAGE plpythonu; +' LANGUAGE plpython3u; SELECT unicode_return(); diff --git a/src/pl/plpython/sql/plpython_void.sql b/src/pl/plpython/sql/plpython_void.sql index 77d7f59e4c..5a1a6711fb 100644 --- a/src/pl/plpython/sql/plpython_void.sql +++ b/src/pl/plpython/sql/plpython_void.sql @@ -4,16 +4,16 @@ CREATE FUNCTION test_void_func1() RETURNS void AS $$ x = 10 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; -- illegal: can't return non-None value in void-returning func CREATE FUNCTION test_void_func2() RETURNS void AS $$ return 10 -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION test_return_none() RETURNS int AS $$ None -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; -- Tests for functions returning void diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl index e2b0db0879..625f6fb88a 100644 --- a/src/tools/msvc/vcregress.pl +++ b/src/tools/msvc/vcregress.pl @@ -314,55 +314,6 @@ sub taptest return; } -sub mangle_plpython3 -{ - my $tests = shift; - mkdir "results" unless -d "results"; - mkdir "sql/python3"; - mkdir "results/python3"; - mkdir "expected/python3"; - - foreach my $test (@$tests) - { - local $/ = undef; - foreach my $dir ('sql', 'expected') - { - my $extension = ($dir eq 'sql' ? 'sql' : 'out'); - - my @files = - glob("$dir/$test.$extension $dir/${test}_[0-9].$extension"); - foreach my $file (@files) - { - open(my $handle, '<', $file) - || die "test file $file not found"; - my $contents = <$handle>; - close($handle); - do - { - s///g; - s///g; - s/([0-9][0-9]*)L/$1/g; - s/([ [{])u"/$1"/g; - s/([ [{])u'/$1'/g; - s/def next/def __next__/g; - s/LANGUAGE plpython2?u/LANGUAGE plpython3u/g; - s/EXTENSION (\S*?)plpython2?u/EXTENSION $1plpython3u/g; - s/installing required extension "plpython2u"/installing required extension "plpython3u"/g; - } - for ($contents); - my $base = basename $file; - open($handle, '>', "$dir/python3/$base") - || die "opening python 3 file for $file"; - print $handle $contents; - close($handle); - } - } - } - do { s!^!python3/!; } - foreach (@$tests); - return @$tests; -} - sub plcheck { chdir "$topdir/src/pl"; @@ -386,8 +337,7 @@ sub plcheck if ($lang eq 'plpython') { next - unless -d "$topdir/$Config/plpython2" - || -d "$topdir/$Config/plpython3"; + unless -d "$topdir/$Config/plpython3"; $lang = 'plpythonu'; } else @@ -397,8 +347,6 @@ sub plcheck my @lang_args = ("--load-extension=$lang"); chdir $dir; my @tests = fetchTests(); - @tests = mangle_plpython3(\@tests) - if $lang eq 'plpythonu' && -d "$topdir/$Config/plpython3"; if ($lang eq 'plperl') { @@ -462,28 +410,6 @@ sub subdircheck my @opts = fetchRegressOpts(); - # Special processing for python transform modules, see their respective - # Makefiles for more details regarding Python-version specific - # dependencies. - if ($module =~ /_plpython$/) - { - die "Python not enabled in configuration" - if !defined($config->{python}); - - @opts = grep { $_ !~ /plpythonu/ } @opts; - - if (-d "$topdir/$Config/plpython2") - { - push @opts, "--load-extension=plpythonu"; - push @opts, '--load-extension=' . $module . 'u'; - } - else - { - # must be python 3 - @tests = mangle_plpython3(\@tests); - } - } - print "============================================================\n"; print "Checking $module\n"; my @args = ( From 9b7e24a2cb37fb52af13219f625cd719e364a346 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 7 Mar 2022 18:30:28 -0800 Subject: [PATCH 098/772] plpython: Code cleanup related to removal of Python 2 support. Since 19252e8ec93 we reject Python 2 during build configuration. Now that the dust on the buildfarm has settled, remove Python 2 specific code, including the "Python 2/3 porting layer". The code to detect conflicts between plpython using Python 2 and 3 is not removed, in case somebody creates an out-of-tree version adding back support for Python 2. Reviewed-By: Peter Eisentraut Reviewed-By: Tom Lane Discussion: https://postgr.es/m/20211031184548.g4sxfe47n2kyi55r@alap3.anarazel.de --- contrib/hstore_plpython/hstore_plpython.c | 12 ++--- contrib/jsonb_plpython/jsonb_plpython.c | 27 +++++------ contrib/ltree_plpython/ltree_plpython.c | 6 +-- src/pl/plpython/plpy_cursorobject.c | 8 +-- src/pl/plpython/plpy_elog.c | 26 +++++----- src/pl/plpython/plpy_exec.c | 44 ++++++++--------- src/pl/plpython/plpy_main.c | 59 ++++------------------- src/pl/plpython/plpy_planobject.c | 2 +- src/pl/plpython/plpy_plpymodule.c | 32 +++--------- src/pl/plpython/plpy_plpymodule.h | 2 - src/pl/plpython/plpy_resultobject.c | 16 ++---- src/pl/plpython/plpy_spi.c | 10 ++-- src/pl/plpython/plpy_typeio.c | 40 ++++++--------- src/pl/plpython/plpy_util.c | 9 ---- src/pl/plpython/plpy_util.h | 2 - src/pl/plpython/plpython.h | 34 +------------ 16 files changed, 95 insertions(+), 234 deletions(-) diff --git a/contrib/hstore_plpython/hstore_plpython.c b/contrib/hstore_plpython/hstore_plpython.c index 39bad55802..889ece315d 100644 --- a/contrib/hstore_plpython/hstore_plpython.c +++ b/contrib/hstore_plpython/hstore_plpython.c @@ -12,10 +12,8 @@ extern void _PG_init(void); /* Linkage to functions in plpython module */ typedef char *(*PLyObject_AsString_t) (PyObject *plrv); static PLyObject_AsString_t PLyObject_AsString_p; -#if PY_MAJOR_VERSION >= 3 typedef PyObject *(*PLyUnicode_FromStringAndSize_t) (const char *s, Py_ssize_t size); static PLyUnicode_FromStringAndSize_t PLyUnicode_FromStringAndSize_p; -#endif /* Linkage to functions in hstore module */ typedef HStore *(*hstoreUpgrade_t) (Datum orig); @@ -41,12 +39,10 @@ _PG_init(void) PLyObject_AsString_p = (PLyObject_AsString_t) load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyObject_AsString", true, NULL); -#if PY_MAJOR_VERSION >= 3 AssertVariableIsOfType(&PLyUnicode_FromStringAndSize, PLyUnicode_FromStringAndSize_t); PLyUnicode_FromStringAndSize_p = (PLyUnicode_FromStringAndSize_t) load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyUnicode_FromStringAndSize", true, NULL); -#endif AssertVariableIsOfType(&hstoreUpgrade, hstoreUpgrade_t); hstoreUpgrade_p = (hstoreUpgrade_t) load_external_function("$libdir/hstore", "hstoreUpgrade", @@ -102,16 +98,16 @@ hstore_to_plpython(PG_FUNCTION_ARGS) { PyObject *key; - key = PyString_FromStringAndSize(HSTORE_KEY(entries, base, i), - HSTORE_KEYLEN(entries, i)); + key = PLyUnicode_FromStringAndSize(HSTORE_KEY(entries, base, i), + HSTORE_KEYLEN(entries, i)); if (HSTORE_VALISNULL(entries, i)) PyDict_SetItem(dict, key, Py_None); else { PyObject *value; - value = PyString_FromStringAndSize(HSTORE_VAL(entries, base, i), - HSTORE_VALLEN(entries, i)); + value = PLyUnicode_FromStringAndSize(HSTORE_VAL(entries, base, i), + HSTORE_VALLEN(entries, i)); PyDict_SetItem(dict, key, value); Py_XDECREF(value); } diff --git a/contrib/jsonb_plpython/jsonb_plpython.c b/contrib/jsonb_plpython/jsonb_plpython.c index 836c178770..03bbfa87d9 100644 --- a/contrib/jsonb_plpython/jsonb_plpython.c +++ b/contrib/jsonb_plpython/jsonb_plpython.c @@ -28,11 +28,9 @@ static PyObject *PLyObject_FromJsonbContainer(JsonbContainer *jsonb); static JsonbValue *PLyObject_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state, bool is_elem); -#if PY_MAJOR_VERSION >= 3 typedef PyObject *(*PLyUnicode_FromStringAndSize_t) (const char *s, Py_ssize_t size); static PLyUnicode_FromStringAndSize_t PLyUnicode_FromStringAndSize_p; -#endif /* * Module initialize function: fetch function pointers for cross-module calls. @@ -45,13 +43,10 @@ _PG_init(void) PLyObject_AsString_p = (PLyObject_AsString_t) load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyObject_AsString", true, NULL); -#if PY_MAJOR_VERSION >= 3 AssertVariableIsOfType(&PLyUnicode_FromStringAndSize, PLyUnicode_FromStringAndSize_t); PLyUnicode_FromStringAndSize_p = (PLyUnicode_FromStringAndSize_t) load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyUnicode_FromStringAndSize", true, NULL); -#endif - AssertVariableIsOfType(&PLy_elog_impl, PLy_elog_impl_t); PLy_elog_impl_p = (PLy_elog_impl_t) load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLy_elog_impl", @@ -65,25 +60,25 @@ _PG_init(void) #define PLy_elog (PLy_elog_impl_p) /* - * PLyString_FromJsonbValue + * PLyUnicode_FromJsonbValue * * Transform string JsonbValue to Python string. */ static PyObject * -PLyString_FromJsonbValue(JsonbValue *jbv) +PLyUnicode_FromJsonbValue(JsonbValue *jbv) { Assert(jbv->type == jbvString); - return PyString_FromStringAndSize(jbv->val.string.val, jbv->val.string.len); + return PLyUnicode_FromStringAndSize(jbv->val.string.val, jbv->val.string.len); } /* - * PLyString_ToJsonbValue + * PLyUnicode_ToJsonbValue * * Transform Python string to JsonbValue. */ static void -PLyString_ToJsonbValue(PyObject *obj, JsonbValue *jbvElem) +PLyUnicode_ToJsonbValue(PyObject *obj, JsonbValue *jbvElem) { jbvElem->type = jbvString; jbvElem->val.string.val = PLyObject_AsString(obj); @@ -118,7 +113,7 @@ PLyObject_FromJsonbValue(JsonbValue *jsonbValue) } case jbvString: - return PLyString_FromJsonbValue(jsonbValue); + return PLyUnicode_FromJsonbValue(jsonbValue); case jbvBool: if (jsonbValue->val.boolean) @@ -210,7 +205,7 @@ PLyObject_FromJsonbContainer(JsonbContainer *jsonb) if (r != WJB_KEY) continue; - key = PLyString_FromJsonbValue(&v); + key = PLyUnicode_FromJsonbValue(&v); if (!key) { Py_XDECREF(result_v); @@ -298,7 +293,7 @@ PLyMapping_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state) else { /* All others types of keys we serialize to string */ - PLyString_ToJsonbValue(key, &jbvKey); + PLyUnicode_ToJsonbValue(key, &jbvKey); } (void) pushJsonbValue(jsonb_state, WJB_KEY, &jbvKey); @@ -415,7 +410,7 @@ PLyObject_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state, bool is_ele { JsonbValue *out; - if (!(PyString_Check(obj) || PyUnicode_Check(obj))) + if (!PyUnicode_Check(obj)) { if (PySequence_Check(obj)) return PLySequence_ToJsonbValue(obj, jsonb_state); @@ -427,8 +422,8 @@ PLyObject_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state, bool is_ele if (obj == Py_None) out->type = jbvNull; - else if (PyString_Check(obj) || PyUnicode_Check(obj)) - PLyString_ToJsonbValue(obj, out); + else if (PyUnicode_Check(obj)) + PLyUnicode_ToJsonbValue(obj, out); /* * PyNumber_Check() returns true for booleans, so boolean check should diff --git a/contrib/ltree_plpython/ltree_plpython.c b/contrib/ltree_plpython/ltree_plpython.c index 1570e77dd9..7431a1150a 100644 --- a/contrib/ltree_plpython/ltree_plpython.c +++ b/contrib/ltree_plpython/ltree_plpython.c @@ -9,10 +9,8 @@ PG_MODULE_MAGIC; extern void _PG_init(void); /* Linkage to functions in plpython module */ -#if PY_MAJOR_VERSION >= 3 typedef PyObject *(*PLyUnicode_FromStringAndSize_t) (const char *s, Py_ssize_t size); static PLyUnicode_FromStringAndSize_t PLyUnicode_FromStringAndSize_p; -#endif /* @@ -22,12 +20,10 @@ void _PG_init(void) { /* Asserts verify that typedefs above match original declarations */ -#if PY_MAJOR_VERSION >= 3 AssertVariableIsOfType(&PLyUnicode_FromStringAndSize, PLyUnicode_FromStringAndSize_t); PLyUnicode_FromStringAndSize_p = (PLyUnicode_FromStringAndSize_t) load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyUnicode_FromStringAndSize", true, NULL); -#endif } @@ -54,7 +50,7 @@ ltree_to_plpython(PG_FUNCTION_ARGS) curlevel = LTREE_FIRST(in); for (i = 0; i < in->numlevel; i++) { - PyList_SetItem(list, i, PyString_FromStringAndSize(curlevel->name, curlevel->len)); + PyList_SetItem(list, i, PLyUnicode_FromStringAndSize(curlevel->name, curlevel->len)); curlevel = LEVEL_NEXT(curlevel); } diff --git a/src/pl/plpython/plpy_cursorobject.c b/src/pl/plpython/plpy_cursorobject.c index 08d8b607e3..6b6e743345 100644 --- a/src/pl/plpython/plpy_cursorobject.c +++ b/src/pl/plpython/plpy_cursorobject.c @@ -40,7 +40,7 @@ static PyTypeObject PLy_CursorType = { .tp_name = "PLyCursor", .tp_basicsize = sizeof(PLyCursorObject), .tp_dealloc = PLy_cursor_dealloc, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_ITER, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, .tp_doc = PLy_cursor_doc, .tp_iter = PyObject_SelfIter, .tp_iternext = PLy_cursor_iternext, @@ -150,7 +150,7 @@ PLy_cursor_plan(PyObject *ob, PyObject *args) if (args) { - if (!PySequence_Check(args) || PyString_Check(args) || PyUnicode_Check(args)) + if (!PySequence_Check(args) || PyUnicode_Check(args)) { PLy_exception_set(PyExc_TypeError, "plpy.cursor takes a sequence as its second argument"); return NULL; @@ -169,7 +169,7 @@ PLy_cursor_plan(PyObject *ob, PyObject *args) if (!so) PLy_elog(ERROR, "could not execute plan"); - sv = PyString_AsString(so); + sv = PLyUnicode_AsString(so); PLy_exception_set_plural(PyExc_TypeError, "Expected sequence of %d argument, got %d: %s", "Expected sequence of %d arguments, got %d: %s", @@ -410,7 +410,7 @@ PLy_cursor_fetch(PyObject *self, PyObject *args) SPI_cursor_fetch(portal, true, count); Py_DECREF(ret->status); - ret->status = PyInt_FromLong(SPI_OK_FETCH); + ret->status = PyLong_FromLong(SPI_OK_FETCH); Py_DECREF(ret->nrows); ret->nrows = PyLong_FromUnsignedLongLong(SPI_processed); diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.c index 224b8836fb..7c627eacfb 100644 --- a/src/pl/plpython/plpy_elog.c +++ b/src/pl/plpython/plpy_elog.c @@ -193,24 +193,20 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, e_type_o = PyObject_GetAttrString(e, "__name__"); e_module_o = PyObject_GetAttrString(e, "__module__"); if (e_type_o) - e_type_s = PyString_AsString(e_type_o); + e_type_s = PLyUnicode_AsString(e_type_o); if (e_type_s) - e_module_s = PyString_AsString(e_module_o); + e_module_s = PLyUnicode_AsString(e_module_o); if (v && ((vob = PyObject_Str(v)) != NULL)) - vstr = PyString_AsString(vob); + vstr = PLyUnicode_AsString(vob); else vstr = "unknown"; initStringInfo(&xstr); if (!e_type_s || !e_module_s) { - if (PyString_Check(e)) - /* deprecated string exceptions */ - appendStringInfoString(&xstr, PyString_AsString(e)); - else - /* shouldn't happen */ - appendStringInfoString(&xstr, "unrecognized exception"); + /* shouldn't happen */ + appendStringInfoString(&xstr, "unrecognized exception"); } /* mimics behavior of traceback.format_exception_only */ else if (strcmp(e_module_s, "builtins") == 0 @@ -290,11 +286,11 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, if (*tb_depth == 1) fname = ""; else - fname = PyString_AsString(name); + fname = PLyUnicode_AsString(name); proname = PLy_procedure_name(exec_ctx->curr_proc); - plain_filename = PyString_AsString(filename); - plain_lineno = PyInt_AsLong(lineno); + plain_filename = PLyUnicode_AsString(filename); + plain_lineno = PyLong_AsLong(lineno); if (proname == NULL) appendStringInfo(&tbstr, "\n PL/Python anonymous code block, line %ld, in %s", @@ -365,7 +361,7 @@ PLy_get_sqlerrcode(PyObject *exc, int *sqlerrcode) if (sqlstate == NULL) return; - buffer = PyString_AsString(sqlstate); + buffer = PLyUnicode_AsString(sqlstate); if (strlen(buffer) == 5 && strspn(buffer, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") == 5) { @@ -573,7 +569,7 @@ get_string_attr(PyObject *obj, char *attrname, char **str) val = PyObject_GetAttrString(obj, attrname); if (val != NULL && val != Py_None) { - *str = pstrdup(PyString_AsString(val)); + *str = pstrdup(PLyUnicode_AsString(val)); } Py_XDECREF(val); } @@ -589,7 +585,7 @@ set_string_attr(PyObject *obj, char *attrname, char *str) if (str != NULL) { - val = PyString_FromString(str); + val = PLyUnicode_FromString(str); if (!val) return false; } diff --git a/src/pl/plpython/plpy_exec.c b/src/pl/plpython/plpy_exec.c index c6f6a6fbcc..150b3a5977 100644 --- a/src/pl/plpython/plpy_exec.c +++ b/src/pl/plpython/plpy_exec.c @@ -294,7 +294,7 @@ PLy_exec_function(FunctionCallInfo fcinfo, PLyProcedure *proc) /* trigger subhandler * * the python function is expected to return Py_None if the tuple is - * acceptable and unmodified. Otherwise it should return a PyString + * acceptable and unmodified. Otherwise it should return a PyUnicode * object who's value is SKIP, or MODIFY. SKIP means don't perform * this action. MODIFY means the tuple has been modified, so update * tuple and perform action. SKIP and MODIFY assume the trigger fires @@ -360,9 +360,7 @@ PLy_exec_trigger(FunctionCallInfo fcinfo, PLyProcedure *proc) { char *srv; - if (PyString_Check(plrv)) - srv = PyString_AsString(plrv); - else if (PyUnicode_Check(plrv)) + if (PyUnicode_Check(plrv)) srv = PLyUnicode_AsString(plrv); else { @@ -700,35 +698,35 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r if (!pltdata) return NULL; - pltname = PyString_FromString(tdata->tg_trigger->tgname); + pltname = PLyUnicode_FromString(tdata->tg_trigger->tgname); PyDict_SetItemString(pltdata, "name", pltname); Py_DECREF(pltname); stroid = DatumGetCString(DirectFunctionCall1(oidout, ObjectIdGetDatum(tdata->tg_relation->rd_id))); - pltrelid = PyString_FromString(stroid); + pltrelid = PLyUnicode_FromString(stroid); PyDict_SetItemString(pltdata, "relid", pltrelid); Py_DECREF(pltrelid); pfree(stroid); stroid = SPI_getrelname(tdata->tg_relation); - plttablename = PyString_FromString(stroid); + plttablename = PLyUnicode_FromString(stroid); PyDict_SetItemString(pltdata, "table_name", plttablename); Py_DECREF(plttablename); pfree(stroid); stroid = SPI_getnspname(tdata->tg_relation); - plttableschema = PyString_FromString(stroid); + plttableschema = PLyUnicode_FromString(stroid); PyDict_SetItemString(pltdata, "table_schema", plttableschema); Py_DECREF(plttableschema); pfree(stroid); if (TRIGGER_FIRED_BEFORE(tdata->tg_event)) - pltwhen = PyString_FromString("BEFORE"); + pltwhen = PLyUnicode_FromString("BEFORE"); else if (TRIGGER_FIRED_AFTER(tdata->tg_event)) - pltwhen = PyString_FromString("AFTER"); + pltwhen = PLyUnicode_FromString("AFTER"); else if (TRIGGER_FIRED_INSTEAD(tdata->tg_event)) - pltwhen = PyString_FromString("INSTEAD OF"); + pltwhen = PLyUnicode_FromString("INSTEAD OF"); else { elog(ERROR, "unrecognized WHEN tg_event: %u", tdata->tg_event); @@ -739,7 +737,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r if (TRIGGER_FIRED_FOR_ROW(tdata->tg_event)) { - pltlevel = PyString_FromString("ROW"); + pltlevel = PLyUnicode_FromString("ROW"); PyDict_SetItemString(pltdata, "level", pltlevel); Py_DECREF(pltlevel); @@ -750,7 +748,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event)) { - pltevent = PyString_FromString("INSERT"); + pltevent = PLyUnicode_FromString("INSERT"); PyDict_SetItemString(pltdata, "old", Py_None); pytnew = PLy_input_from_tuple(&proc->result_in, @@ -763,7 +761,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r } else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event)) { - pltevent = PyString_FromString("DELETE"); + pltevent = PLyUnicode_FromString("DELETE"); PyDict_SetItemString(pltdata, "new", Py_None); pytold = PLy_input_from_tuple(&proc->result_in, @@ -776,7 +774,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r } else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event)) { - pltevent = PyString_FromString("UPDATE"); + pltevent = PLyUnicode_FromString("UPDATE"); pytnew = PLy_input_from_tuple(&proc->result_in, tdata->tg_newtuple, @@ -803,7 +801,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r } else if (TRIGGER_FIRED_FOR_STATEMENT(tdata->tg_event)) { - pltlevel = PyString_FromString("STATEMENT"); + pltlevel = PLyUnicode_FromString("STATEMENT"); PyDict_SetItemString(pltdata, "level", pltlevel); Py_DECREF(pltlevel); @@ -812,13 +810,13 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r *rv = NULL; if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event)) - pltevent = PyString_FromString("INSERT"); + pltevent = PLyUnicode_FromString("INSERT"); else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event)) - pltevent = PyString_FromString("DELETE"); + pltevent = PLyUnicode_FromString("DELETE"); else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event)) - pltevent = PyString_FromString("UPDATE"); + pltevent = PLyUnicode_FromString("UPDATE"); else if (TRIGGER_FIRED_BY_TRUNCATE(tdata->tg_event)) - pltevent = PyString_FromString("TRUNCATE"); + pltevent = PLyUnicode_FromString("TRUNCATE"); else { elog(ERROR, "unrecognized OP tg_event: %u", tdata->tg_event); @@ -847,7 +845,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r } for (i = 0; i < tdata->tg_trigger->tgnargs; i++) { - pltarg = PyString_FromString(tdata->tg_trigger->tgargs[i]); + pltarg = PLyUnicode_FromString(tdata->tg_trigger->tgargs[i]); /* * stolen, don't Py_DECREF @@ -931,9 +929,7 @@ PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata, PLyObToDatum *att; platt = PyList_GetItem(plkeys, i); - if (PyString_Check(platt)) - plattstr = PyString_AsString(platt); - else if (PyUnicode_Check(platt)) + if (PyUnicode_Check(platt)) plattstr = PLyUnicode_AsString(platt); else { diff --git a/src/pl/plpython/plpy_main.c b/src/pl/plpython/plpy_main.c index 3eedaa80da..0bce106495 100644 --- a/src/pl/plpython/plpy_main.c +++ b/src/pl/plpython/plpy_main.c @@ -28,27 +28,13 @@ * exported functions */ -#if PY_MAJOR_VERSION >= 3 -/* Use separate names to reduce confusion */ -#define plpython_validator plpython3_validator -#define plpython_call_handler plpython3_call_handler -#define plpython_inline_handler plpython3_inline_handler -#endif - extern void _PG_init(void); PG_MODULE_MAGIC; -PG_FUNCTION_INFO_V1(plpython_validator); -PG_FUNCTION_INFO_V1(plpython_call_handler); -PG_FUNCTION_INFO_V1(plpython_inline_handler); - -#if PY_MAJOR_VERSION < 3 -/* Define aliases plpython2_call_handler etc */ -PG_FUNCTION_INFO_V1(plpython2_validator); -PG_FUNCTION_INFO_V1(plpython2_call_handler); -PG_FUNCTION_INFO_V1(plpython2_inline_handler); -#endif +PG_FUNCTION_INFO_V1(plpython3_validator); +PG_FUNCTION_INFO_V1(plpython3_call_handler); +PG_FUNCTION_INFO_V1(plpython3_inline_handler); static bool PLy_procedure_is_trigger(Form_pg_proc procStruct); @@ -82,6 +68,10 @@ _PG_init(void) * the actual failure for later, so that operations like pg_restore can * load more than one plpython library so long as they don't try to do * anything much with the language. + * + * While we only support Python 3 these days, somebody might create an + * out-of-tree version adding back support for Python 2. Conflicts with + * such an extension should be detected. */ bitmask_ptr = (int **) find_rendezvous_variable("plpython_version_bitmask"); if (!(*bitmask_ptr)) /* am I the first? */ @@ -125,13 +115,9 @@ PLy_initialize(void) if (inited) return; -#if PY_MAJOR_VERSION >= 3 PyImport_AppendInittab("plpy", PyInit_plpy); -#endif Py_Initialize(); -#if PY_MAJOR_VERSION >= 3 PyImport_ImportModule("plpy"); -#endif PLy_init_interp(); PLy_init_plpy(); if (PyErr_Occurred()) @@ -171,7 +157,7 @@ PLy_init_interp(void) } Datum -plpython_validator(PG_FUNCTION_ARGS) +plpython3_validator(PG_FUNCTION_ARGS) { Oid funcoid = PG_GETARG_OID(0); HeapTuple tuple; @@ -203,17 +189,8 @@ plpython_validator(PG_FUNCTION_ARGS) PG_RETURN_VOID(); } -#if PY_MAJOR_VERSION < 3 -Datum -plpython2_validator(PG_FUNCTION_ARGS) -{ - /* call plpython validator with our fcinfo so it gets our oid */ - return plpython_validator(fcinfo); -} -#endif /* PY_MAJOR_VERSION < 3 */ - Datum -plpython_call_handler(PG_FUNCTION_ARGS) +plpython3_call_handler(PG_FUNCTION_ARGS) { bool nonatomic; Datum retval; @@ -284,16 +261,8 @@ plpython_call_handler(PG_FUNCTION_ARGS) return retval; } -#if PY_MAJOR_VERSION < 3 Datum -plpython2_call_handler(PG_FUNCTION_ARGS) -{ - return plpython_call_handler(fcinfo); -} -#endif /* PY_MAJOR_VERSION < 3 */ - -Datum -plpython_inline_handler(PG_FUNCTION_ARGS) +plpython3_inline_handler(PG_FUNCTION_ARGS) { LOCAL_FCINFO(fake_fcinfo, 0); InlineCodeBlock *codeblock = (InlineCodeBlock *) DatumGetPointer(PG_GETARG_DATUM(0)); @@ -368,14 +337,6 @@ plpython_inline_handler(PG_FUNCTION_ARGS) PG_RETURN_VOID(); } -#if PY_MAJOR_VERSION < 3 -Datum -plpython2_inline_handler(PG_FUNCTION_ARGS) -{ - return plpython_inline_handler(fcinfo); -} -#endif /* PY_MAJOR_VERSION < 3 */ - static bool PLy_procedure_is_trigger(Form_pg_proc procStruct) { diff --git a/src/pl/plpython/plpy_planobject.c b/src/pl/plpython/plpy_planobject.c index 5951d2a6ff..ec2439c6a1 100644 --- a/src/pl/plpython/plpy_planobject.c +++ b/src/pl/plpython/plpy_planobject.c @@ -119,7 +119,7 @@ PLy_plan_status(PyObject *self, PyObject *args) { Py_INCREF(Py_True); return Py_True; - /* return PyInt_FromLong(self->status); */ + /* return PyLong_FromLong(self->status); */ } return NULL; } diff --git a/src/pl/plpython/plpy_plpymodule.c b/src/pl/plpython/plpy_plpymodule.c index 907f89d153..fa08f0dbfb 100644 --- a/src/pl/plpython/plpy_plpymodule.c +++ b/src/pl/plpython/plpy_plpymodule.c @@ -107,7 +107,6 @@ static PyMethodDef PLy_exc_methods[] = { {NULL, NULL, 0, NULL} }; -#if PY_MAJOR_VERSION >= 3 static PyModuleDef PLy_module = { PyModuleDef_HEAD_INIT, .m_name = "plpy", @@ -139,7 +138,6 @@ PyInit_plpy(void) return m; } -#endif /* PY_MAJOR_VERSION >= 3 */ void PLy_init_plpy(void) @@ -148,10 +146,6 @@ PLy_init_plpy(void) *main_dict, *plpy_mod; -#if PY_MAJOR_VERSION < 3 - PyObject *plpy; -#endif - /* * initialize plpy module */ @@ -160,13 +154,7 @@ PLy_init_plpy(void) PLy_subtransaction_init_type(); PLy_cursor_init_type(); -#if PY_MAJOR_VERSION >= 3 PyModule_Create(&PLy_module); - /* for Python 3 we initialized the exceptions in PyInit_plpy */ -#else - plpy = Py_InitModule("plpy", PLy_methods); - PLy_add_exceptions(plpy); -#endif /* PyDict_SetItemString(plpy, "PlanType", (PyObject *) &PLy_PlanType); */ @@ -189,11 +177,7 @@ PLy_add_exceptions(PyObject *plpy) PyObject *excmod; HASHCTL hash_ctl; -#if PY_MAJOR_VERSION < 3 - excmod = Py_InitModule("spiexceptions", PLy_exc_methods); -#else excmod = PyModule_Create(&PLy_exc_module); -#endif if (excmod == NULL) PLy_elog(ERROR, "could not create the spiexceptions module"); @@ -268,7 +252,7 @@ PLy_generate_spi_exceptions(PyObject *mod, PyObject *base) if (dict == NULL) PLy_elog(ERROR, NULL); - sqlstate = PyString_FromString(unpack_sql_state(exception_map[i].sqlstate)); + sqlstate = PLyUnicode_FromString(unpack_sql_state(exception_map[i].sqlstate)); if (sqlstate == NULL) PLy_elog(ERROR, "could not generate SPI exceptions"); @@ -346,7 +330,7 @@ PLy_quote_literal(PyObject *self, PyObject *args) return NULL; quoted = quote_literal_cstr(str); - ret = PyString_FromString(quoted); + ret = PLyUnicode_FromString(quoted); pfree(quoted); return ret; @@ -363,10 +347,10 @@ PLy_quote_nullable(PyObject *self, PyObject *args) return NULL; if (str == NULL) - return PyString_FromString("NULL"); + return PLyUnicode_FromString("NULL"); quoted = quote_literal_cstr(str); - ret = PyString_FromString(quoted); + ret = PLyUnicode_FromString(quoted); pfree(quoted); return ret; @@ -383,7 +367,7 @@ PLy_quote_ident(PyObject *self, PyObject *args) return NULL; quoted = quote_identifier(str); - ret = PyString_FromString(quoted); + ret = PLyUnicode_FromString(quoted); return ret; } @@ -400,7 +384,7 @@ object_to_string(PyObject *obj) { char *str; - str = pstrdup(PyString_AsString(so)); + str = pstrdup(PLyUnicode_AsString(so)); Py_DECREF(so); return str; @@ -444,7 +428,7 @@ PLy_output(volatile int level, PyObject *self, PyObject *args, PyObject *kw) else so = PyObject_Str(args); - if (so == NULL || ((message = PyString_AsString(so)) == NULL)) + if (so == NULL || ((message = PLyUnicode_AsString(so)) == NULL)) { level = ERROR; message = dgettext(TEXTDOMAIN, "could not parse error message in plpy.elog"); @@ -457,7 +441,7 @@ PLy_output(volatile int level, PyObject *self, PyObject *args, PyObject *kw) { while (PyDict_Next(kw, &pos, &key, &value)) { - char *keyword = PyString_AsString(key); + char *keyword = PLyUnicode_AsString(key); if (strcmp(keyword, "message") == 0) { diff --git a/src/pl/plpython/plpy_plpymodule.h b/src/pl/plpython/plpy_plpymodule.h index 54d78101ce..ad6436aca7 100644 --- a/src/pl/plpython/plpy_plpymodule.h +++ b/src/pl/plpython/plpy_plpymodule.h @@ -11,9 +11,7 @@ extern HTAB *PLy_spi_exceptions; -#if PY_MAJOR_VERSION >= 3 PyMODINIT_FUNC PyInit_plpy(void); -#endif extern void PLy_init_plpy(void); #endif /* PLPY_PLPYMODULE_H */ diff --git a/src/pl/plpython/plpy_resultobject.c b/src/pl/plpython/plpy_resultobject.c index 54f39419c8..a8516b2db3 100644 --- a/src/pl/plpython/plpy_resultobject.c +++ b/src/pl/plpython/plpy_resultobject.c @@ -76,7 +76,7 @@ PLy_result_new(void) Py_INCREF(Py_None); ob->status = Py_None; - ob->nrows = PyInt_FromLong(-1); + ob->nrows = PyLong_FromLong(-1); ob->rows = PyList_New(0); ob->tupdesc = NULL; if (!ob->rows) @@ -125,7 +125,7 @@ PLy_result_colnames(PyObject *self, PyObject *unused) { Form_pg_attribute attr = TupleDescAttr(ob->tupdesc, i); - PyList_SET_ITEM(list, i, PyString_FromString(NameStr(attr->attname))); + PyList_SET_ITEM(list, i, PLyUnicode_FromString(NameStr(attr->attname))); } return list; @@ -151,7 +151,7 @@ PLy_result_coltypes(PyObject *self, PyObject *unused) { Form_pg_attribute attr = TupleDescAttr(ob->tupdesc, i); - PyList_SET_ITEM(list, i, PyInt_FromLong(attr->atttypid)); + PyList_SET_ITEM(list, i, PyLong_FromLong(attr->atttypid)); } return list; @@ -177,7 +177,7 @@ PLy_result_coltypmods(PyObject *self, PyObject *unused) { Form_pg_attribute attr = TupleDescAttr(ob->tupdesc, i); - PyList_SET_ITEM(list, i, PyInt_FromLong(attr->atttypmod)); + PyList_SET_ITEM(list, i, PyLong_FromLong(attr->atttypmod)); } return list; @@ -226,19 +226,11 @@ PLy_result_str(PyObject *arg) { PLyResultObject *ob = (PLyResultObject *) arg; -#if PY_MAJOR_VERSION >= 3 return PyUnicode_FromFormat("<%s status=%S nrows=%S rows=%S>", Py_TYPE(ob)->tp_name, ob->status, ob->nrows, ob->rows); -#else - return PyString_FromFormat("<%s status=%ld nrows=%ld rows=%s>", - ob->ob_type->tp_name, - PyInt_AsLong(ob->status), - PyInt_AsLong(ob->nrows), - PyString_AsString(PyObject_Str(ob->rows))); -#endif } static PyObject * diff --git a/src/pl/plpython/plpy_spi.c b/src/pl/plpython/plpy_spi.c index 86d70470a7..9a71a42c15 100644 --- a/src/pl/plpython/plpy_spi.c +++ b/src/pl/plpython/plpy_spi.c @@ -90,9 +90,7 @@ PLy_spi_prepare(PyObject *self, PyObject *args) int32 typmod; optr = PySequence_GetItem(list, i); - if (PyString_Check(optr)) - sptr = PyString_AsString(optr); - else if (PyUnicode_Check(optr)) + if (PyUnicode_Check(optr)) sptr = PLyUnicode_AsString(optr); else { @@ -186,7 +184,7 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit) if (list != NULL) { - if (!PySequence_Check(list) || PyString_Check(list) || PyUnicode_Check(list)) + if (!PySequence_Check(list) || PyUnicode_Check(list)) { PLy_exception_set(PyExc_TypeError, "plpy.execute takes a sequence as its second argument"); return NULL; @@ -205,7 +203,7 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit) if (!so) PLy_elog(ERROR, "could not execute plan"); - sv = PyString_AsString(so); + sv = PLyUnicode_AsString(so); PLy_exception_set_plural(PyExc_TypeError, "Expected sequence of %d argument, got %d: %s", "Expected sequence of %d arguments, got %d: %s", @@ -360,7 +358,7 @@ PLy_spi_execute_fetch_result(SPITupleTable *tuptable, uint64 rows, int status) return NULL; } Py_DECREF(result->status); - result->status = PyInt_FromLong(status); + result->status = PyLong_FromLong(status); if (status > 0 && tuptable == NULL) { diff --git a/src/pl/plpython/plpy_typeio.c b/src/pl/plpython/plpy_typeio.c index 5e807b139f..7018c9d404 100644 --- a/src/pl/plpython/plpy_typeio.c +++ b/src/pl/plpython/plpy_typeio.c @@ -26,12 +26,12 @@ static PyObject *PLyBool_FromBool(PLyDatumToOb *arg, Datum d); static PyObject *PLyFloat_FromFloat4(PLyDatumToOb *arg, Datum d); static PyObject *PLyFloat_FromFloat8(PLyDatumToOb *arg, Datum d); static PyObject *PLyDecimal_FromNumeric(PLyDatumToOb *arg, Datum d); -static PyObject *PLyInt_FromInt16(PLyDatumToOb *arg, Datum d); -static PyObject *PLyInt_FromInt32(PLyDatumToOb *arg, Datum d); +static PyObject *PLyLong_FromInt16(PLyDatumToOb *arg, Datum d); +static PyObject *PLyLong_FromInt32(PLyDatumToOb *arg, Datum d); static PyObject *PLyLong_FromInt64(PLyDatumToOb *arg, Datum d); static PyObject *PLyLong_FromOid(PLyDatumToOb *arg, Datum d); static PyObject *PLyBytes_FromBytea(PLyDatumToOb *arg, Datum d); -static PyObject *PLyString_FromScalar(PLyDatumToOb *arg, Datum d); +static PyObject *PLyUnicode_FromScalar(PLyDatumToOb *arg, Datum d); static PyObject *PLyObject_FromTransform(PLyDatumToOb *arg, Datum d); static PyObject *PLyList_FromArray(PLyDatumToOb *arg, Datum d); static PyObject *PLyList_FromArray_recurse(PLyDatumToOb *elm, int *dims, int ndim, int dim, @@ -59,7 +59,7 @@ static void PLySequence_ToArray_recurse(PLyObToDatum *elm, PyObject *list, Datum *elems, bool *nulls, int *currelem); /* conversion from Python objects to composite Datums */ -static Datum PLyString_ToComposite(PLyObToDatum *arg, PyObject *string, bool inarray); +static Datum PLyUnicode_ToComposite(PLyObToDatum *arg, PyObject *string, bool inarray); static Datum PLyMapping_ToComposite(PLyObToDatum *arg, TupleDesc desc, PyObject *mapping); static Datum PLySequence_ToComposite(PLyObToDatum *arg, TupleDesc desc, PyObject *sequence); static Datum PLyGenericObject_ToComposite(PLyObToDatum *arg, TupleDesc desc, PyObject *object, bool inarray); @@ -517,10 +517,10 @@ PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt, arg->func = PLyDecimal_FromNumeric; break; case INT2OID: - arg->func = PLyInt_FromInt16; + arg->func = PLyLong_FromInt16; break; case INT4OID: - arg->func = PLyInt_FromInt32; + arg->func = PLyLong_FromInt32; break; case INT8OID: arg->func = PLyLong_FromInt64; @@ -532,7 +532,7 @@ PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt, arg->func = PLyBytes_FromBytea; break; default: - arg->func = PLyString_FromScalar; + arg->func = PLyUnicode_FromScalar; getTypeOutputInfo(typeOid, &typoutput, &typisvarlena); fmgr_info_cxt(typoutput, &arg->u.scalar.typfunc, arg_mcxt); break; @@ -600,15 +600,15 @@ PLyDecimal_FromNumeric(PLyDatumToOb *arg, Datum d) } static PyObject * -PLyInt_FromInt16(PLyDatumToOb *arg, Datum d) +PLyLong_FromInt16(PLyDatumToOb *arg, Datum d) { - return PyInt_FromLong(DatumGetInt16(d)); + return PyLong_FromLong(DatumGetInt16(d)); } static PyObject * -PLyInt_FromInt32(PLyDatumToOb *arg, Datum d) +PLyLong_FromInt32(PLyDatumToOb *arg, Datum d) { - return PyInt_FromLong(DatumGetInt32(d)); + return PyLong_FromLong(DatumGetInt32(d)); } static PyObject * @@ -638,10 +638,10 @@ PLyBytes_FromBytea(PLyDatumToOb *arg, Datum d) * Generic input conversion using a SQL type's output function. */ static PyObject * -PLyString_FromScalar(PLyDatumToOb *arg, Datum d) +PLyUnicode_FromScalar(PLyDatumToOb *arg, Datum d) { char *x = OutputFunctionCall(&arg->u.scalar.typfunc, d); - PyObject *r = PyString_FromString(x); + PyObject *r = PLyUnicode_FromString(x); pfree(x); return r; @@ -954,8 +954,8 @@ PLyObject_ToComposite(PLyObToDatum *arg, PyObject *plrv, * The string conversion case doesn't require a tupdesc, nor per-field * conversion data, so just go for it if that's the case to use. */ - if (PyString_Check(plrv) || PyUnicode_Check(plrv)) - return PLyString_ToComposite(arg, plrv, inarray); + if (PyUnicode_Check(plrv)) + return PLyUnicode_ToComposite(arg, plrv, inarray); /* * If we're dealing with a named composite type, we must look up the @@ -1032,25 +1032,17 @@ PLyObject_AsString(PyObject *plrv) else if (PyFloat_Check(plrv)) { /* use repr() for floats, str() is lossy */ -#if PY_MAJOR_VERSION >= 3 PyObject *s = PyObject_Repr(plrv); plrv_bo = PLyUnicode_Bytes(s); Py_XDECREF(s); -#else - plrv_bo = PyObject_Repr(plrv); -#endif } else { -#if PY_MAJOR_VERSION >= 3 PyObject *s = PyObject_Str(plrv); plrv_bo = PLyUnicode_Bytes(s); Py_XDECREF(s); -#else - plrv_bo = PyObject_Str(plrv); -#endif } if (!plrv_bo) PLy_elog(ERROR, "could not create string representation of Python object"); @@ -1299,7 +1291,7 @@ PLySequence_ToArray_recurse(PLyObToDatum *elm, PyObject *list, * Convert a Python string to composite, using record_in. */ static Datum -PLyString_ToComposite(PLyObToDatum *arg, PyObject *string, bool inarray) +PLyUnicode_ToComposite(PLyObToDatum *arg, PyObject *string, bool inarray) { char *str; diff --git a/src/pl/plpython/plpy_util.c b/src/pl/plpython/plpy_util.c index 4a7d7264d7..22e2a599ad 100644 --- a/src/pl/plpython/plpy_util.c +++ b/src/pl/plpython/plpy_util.c @@ -78,12 +78,6 @@ PLyUnicode_Bytes(PyObject *unicode) * Convert a Python unicode object to a C string in PostgreSQL server * encoding. No Python object reference is passed out of this * function. The result is palloc'ed. - * - * Note that this function is disguised as PyString_AsString() when - * using Python 3. That function returns a pointer into the internal - * memory of the argument, which isn't exactly the interface of this - * function. But in either case you get a rather short-lived - * reference that you ought to better leave alone. */ char * PLyUnicode_AsString(PyObject *unicode) @@ -95,7 +89,6 @@ PLyUnicode_AsString(PyObject *unicode) return rv; } -#if PY_MAJOR_VERSION >= 3 /* * Convert a C string in the PostgreSQL server encoding to a Python * unicode object. Reference ownership is passed to the caller. @@ -126,5 +119,3 @@ PLyUnicode_FromString(const char *s) { return PLyUnicode_FromStringAndSize(s, strlen(s)); } - -#endif /* PY_MAJOR_VERSION >= 3 */ diff --git a/src/pl/plpython/plpy_util.h b/src/pl/plpython/plpy_util.h index c9ba7edc0e..7c6577925e 100644 --- a/src/pl/plpython/plpy_util.h +++ b/src/pl/plpython/plpy_util.h @@ -11,9 +11,7 @@ extern PyObject *PLyUnicode_Bytes(PyObject *unicode); extern char *PLyUnicode_AsString(PyObject *unicode); -#if PY_MAJOR_VERSION >= 3 extern PyObject *PLyUnicode_FromString(const char *s); extern PyObject *PLyUnicode_FromStringAndSize(const char *s, Py_ssize_t size); -#endif #endif /* PLPY_UTIL_H */ diff --git a/src/pl/plpython/plpython.h b/src/pl/plpython/plpython.h index 05e4362dab..2a0c9bf036 100644 --- a/src/pl/plpython/plpython.h +++ b/src/pl/plpython/plpython.h @@ -59,37 +59,6 @@ #include #endif -/* - * Python 2/3 strings/unicode/bytes handling. Python 2 has strings - * and unicode, Python 3 has strings, which are unicode on the C - * level, and bytes. The porting convention, which is similarly used - * in Python 2.6, is that "Unicode" is always unicode, and "Bytes" are - * bytes in Python 3 and strings in Python 2. Since we keep - * supporting Python 2 and its usual strings, we provide a - * compatibility layer for Python 3 that when asked to convert a C - * string to a Python string it converts the C string from the - * PostgreSQL server encoding to a Python Unicode object. - */ -#if PY_MAJOR_VERSION >= 3 -#define PyString_Check(x) 0 -#define PyString_AsString(x) PLyUnicode_AsString(x) -#define PyString_FromString(x) PLyUnicode_FromString(x) -#define PyString_FromStringAndSize(x, size) PLyUnicode_FromStringAndSize(x, size) -#endif - -/* - * Python 3 only has long. - */ -#if PY_MAJOR_VERSION >= 3 -#define PyInt_FromLong(x) PyLong_FromLong(x) -#define PyInt_AsLong(x) PyLong_AsLong(x) -#endif - -/* Python 3 removed the Py_TPFLAGS_HAVE_ITER flag */ -#if PY_MAJOR_VERSION >= 3 -#define Py_TPFLAGS_HAVE_ITER 0 -#endif - /* define our text domain for translations */ #undef TEXTDOMAIN #define TEXTDOMAIN PG_TEXTDOMAIN("plpython") @@ -130,8 +99,7 @@ #define printf(...) pg_printf(__VA_ARGS__) /* - * Used throughout, and also by the Python 2/3 porting layer, so it's easier to - * just include it everywhere. + * Used throughout, so it's easier to just include it everywhere. */ #include "plpy_util.h" From 4228cabb72bb57e1df4c9d92613f1fcd4baadd5a Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 7 Mar 2022 18:30:57 -0800 Subject: [PATCH 099/772] plpython: Adjust docs after removal of Python 2 support. Reviewed-By: Tom Lane Discussion: https://postgr.es/m/20211031184548.g4sxfe47n2kyi55r@alap3.anarazel.de --- doc/src/sgml/hstore.sgml | 8 +- doc/src/sgml/json.sgml | 9 +- doc/src/sgml/ltree.sgml | 10 +- doc/src/sgml/plpython.sgml | 289 +++++-------------------- doc/src/sgml/ref/comment.sgml | 2 +- doc/src/sgml/ref/create_transform.sgml | 6 +- doc/src/sgml/ref/drop_transform.sgml | 4 +- 7 files changed, 71 insertions(+), 257 deletions(-) diff --git a/doc/src/sgml/hstore.sgml b/doc/src/sgml/hstore.sgml index 870063c288..679878b3af 100644 --- a/doc/src/sgml/hstore.sgml +++ b/doc/src/sgml/hstore.sgml @@ -943,12 +943,8 @@ ALTER TABLE tablename ALTER hstorecol TYPE hstore USING hstorecol || ''; and hstore_plperlu, for trusted and untrusted PL/Perl. If you install these transforms and specify them when creating a function, hstore values are mapped to Perl hashes. The - extensions for PL/Python are - called hstore_plpythonu, hstore_plpython2u, - and hstore_plpython3u - (see for the PL/Python naming - convention). If you use them, hstore values are mapped to - Python dictionaries. + extension for PL/Python is called hstore_plpython3u. + If you use it, hstore values are mapped to Python dictionaries. diff --git a/doc/src/sgml/json.sgml b/doc/src/sgml/json.sgml index 673c70c3bb..c4223fafb6 100644 --- a/doc/src/sgml/json.sgml +++ b/doc/src/sgml/json.sgml @@ -716,12 +716,9 @@ UPDATE table_name SET jsonb_field[1]['a'] = '1'; - The extensions for PL/Python are called jsonb_plpythonu, - jsonb_plpython2u, and - jsonb_plpython3u (see for the PL/Python naming convention). If you - use them, jsonb values are mapped to Python dictionaries, - lists, and scalars, as appropriate. + The extension for PL/Python is called jsonb_plpython3u. + If you use it, jsonb values are mapped to Python + dictionaries, lists, and scalars, as appropriate. diff --git a/doc/src/sgml/ltree.sgml b/doc/src/sgml/ltree.sgml index 436be76bfa..508f404ae8 100644 --- a/doc/src/sgml/ltree.sgml +++ b/doc/src/sgml/ltree.sgml @@ -826,19 +826,15 @@ ltreetest=> SELECT ins_label(path,2,'Space') FROM test WHERE path <@ 'Top. Transforms - Additional extensions are available that implement transforms for - the ltree type for PL/Python. The extensions are - called ltree_plpythonu, ltree_plpython2u, - and ltree_plpython3u - (see for the PL/Python naming - convention). If you install these transforms and specify them when + The ltree_plpython3u extension implements transforms for + the ltree type for PL/Python. If installed and specified when creating a function, ltree values are mapped to Python lists. (The reverse is currently not supported, however.) - It is strongly recommended that the transform extensions be installed in + It is strongly recommended that the transform extension be installed in the same schema as ltree. Otherwise there are installation-time security hazards if a transform extension's schema contains objects defined by a hostile user. diff --git a/doc/src/sgml/plpython.sgml b/doc/src/sgml/plpython.sgml index b67f8f4aae..54355effd7 100644 --- a/doc/src/sgml/plpython.sgml +++ b/doc/src/sgml/plpython.sgml @@ -14,8 +14,7 @@ To install PL/Python in a particular database, use - CREATE EXTENSION plpythonu (but - see also ). + CREATE EXTENSION plpython3u. @@ -28,14 +27,14 @@ PL/Python is only available as an untrusted language, meaning it does not offer any way of restricting what users can do in it and - is therefore named plpythonu. A trusted + is therefore named plpython3u. A trusted variant plpython might become available in the future if a secure execution mechanism is developed in Python. The writer of a function in untrusted PL/Python must take care that the function cannot be used to do anything unwanted, since it will be able to do anything that could be done by a user logged in as the database administrator. Only superusers can create functions in - untrusted languages such as plpythonu. + untrusted languages such as plpython3u. @@ -47,140 +46,6 @@ - - Python 2 vs. Python 3 - - - PL/Python supports both the Python 2 and Python 3 language - variants. (The PostgreSQL installation instructions might contain - more precise information about the exact supported minor versions - of Python.) Because the Python 2 and Python 3 language variants - are incompatible in some important aspects, the following naming - and transitioning scheme is used by PL/Python to avoid mixing them: - - - - - The PostgreSQL language named plpython2u - implements PL/Python based on the Python 2 language variant. - - - - - - The PostgreSQL language named plpython3u - implements PL/Python based on the Python 3 language variant. - - - - - - The language named plpythonu implements - PL/Python based on the default Python language variant, which is - currently Python 2. (This default is independent of what any - local Python installations might consider to be - their default, for example, - what /usr/bin/python might be.) The - default will probably be changed to Python 3 in a distant future - release of PostgreSQL, depending on the progress of the - migration to Python 3 in the Python community. - - - - - This scheme is analogous to the recommendations in PEP 394 regarding the - naming and transitioning of the python command. - - - - It depends on the build configuration or the installed packages - whether PL/Python for Python 2 or Python 3 or both are available. - - - - - The built variant depends on which Python version was found during - the installation or which version was explicitly set using - the PYTHON environment variable; - see . To make both variants of - PL/Python available in one installation, the source tree has to be - configured and built twice. - - - - - This results in the following usage and migration strategy: - - - - - Existing users and users who are currently not interested in - Python 3 use the language name plpythonu and - don't have to change anything for the foreseeable future. It is - recommended to gradually future-proof the code - via migration to Python 2.6/2.7 to simplify the eventual - migration to Python 3. - - - - In practice, many PL/Python functions will migrate to Python 3 - with few or no changes. - - - - - - Users who know that they have heavily Python 2 dependent code - and don't plan to ever change it can make use of - the plpython2u language name. This will - continue to work into the very distant future, until Python 2 - support might be completely dropped by PostgreSQL. - - - - - - Users who want to dive into Python 3 can use - the plpython3u language name, which will keep - working forever by today's standards. In the distant future, - when Python 3 might become the default, they might like to - remove the 3 for aesthetic reasons. - - - - - - Daredevils, who want to build a Python-3-only operating system - environment, can change the contents of - plpythonu's extension control and script files - to make plpythonu be equivalent - to plpython3u, keeping in mind that this - would make their installation incompatible with most of the rest - of the world. - - - - - - - See also the - document What's - New In Python 3.0 for more information about porting to - Python 3. - - - - It is not allowed to use PL/Python based on Python 2 and PL/Python - based on Python 3 in the same session, because the symbols in the - dynamic modules would clash, which could result in crashes of the - PostgreSQL server process. There is a check that prevents mixing - Python major versions in a session, which will abort the session if - a mismatch is detected. It is possible, however, to use both - PL/Python variants in the same database, from separate sessions. - - - PL/Python Functions @@ -193,7 +58,7 @@ CREATE FUNCTION funcname (argument-list< RETURNS return-type AS $$ # PL/Python function body -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; @@ -225,7 +90,7 @@ AS $$ if a > b: return a return b -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; The Python code that is given as the body of the function definition @@ -255,7 +120,7 @@ CREATE FUNCTION pystrip(x text) AS $$ x = x.strip() # error return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; because assigning to x makes x a local variable for the entire block, @@ -271,7 +136,7 @@ AS $$ global x x = x.strip() # ok now return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; But it is advisable not to rely on this implementation detail of PL/Python. It is better to treat the function parameters as @@ -303,11 +168,8 @@ $$ LANGUAGE plpythonu; - PostgreSQL smallint and int are - converted to Python int. - PostgreSQL bigint and oid are converted - to long in Python 2 and to int in - Python 3. + PostgreSQL smallint, int, bigint + and oid are converted to Python int. @@ -335,19 +197,15 @@ $$ LANGUAGE plpythonu; - PostgreSQL bytea is converted to - Python str in Python 2 and to bytes - in Python 3. In Python 2, the string should be treated as a - byte sequence without any character encoding. + PostgreSQL bytea is converted to Python bytes. - All other data types, including the PostgreSQL character string - types, are converted to a Python str. In Python - 2, this string will be in the PostgreSQL server encoding; in - Python 3, it will be a Unicode string like all strings. + All other data types, including the PostgreSQL character string types, + are converted to a Python str (in Unicode like all Python + strings). @@ -375,10 +233,10 @@ $$ LANGUAGE plpythonu; - When the PostgreSQL return type is bytea, the - return value will be converted to a string (Python 2) or bytes - (Python 3) using the respective Python built-ins, with the - result being converted to bytea. + When the PostgreSQL return type is bytea, the return value + will be converted to Python bytes using the respective + Python built-ins, with the result being converted to + bytea. @@ -393,14 +251,8 @@ $$ LANGUAGE plpythonu; - Strings in Python 2 are required to be in the PostgreSQL server - encoding when they are passed to PostgreSQL. Strings that are - not valid in the current server encoding will raise an error, - but not all encoding mismatches can be detected, so garbage - data can still result when this is not done correctly. Unicode - strings are converted to the correct encoding automatically, so - it can be safer and more convenient to use those. In Python 3, - all strings are Unicode strings. + Strings are automatically converted to the PostgreSQL server encoding + when they are passed to PostgreSQL. @@ -440,7 +292,7 @@ AS $$ if a > b: return a return b -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; As shown above, to return an SQL null value from a PL/Python @@ -461,10 +313,10 @@ CREATE FUNCTION return_arr() RETURNS int[] AS $$ return [1, 2, 3, 4, 5] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT return_arr(); - return_arr + return_arr ------------- {1,2,3,4,5} (1 row) @@ -479,11 +331,11 @@ SELECT return_arr(); CREATE FUNCTION test_type_conversion_array_int4(x int4[]) RETURNS int4[] AS $$ plpy.info(x, type(x)) return x -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_int4(ARRAY[[1,2,3],[4,5,6]]); INFO: ([[1, 2, 3], [4, 5, 6]], <type 'list'>) - test_type_conversion_array_int4 + test_type_conversion_array_int4 --------------------------------- {{1,2,3},{4,5,6}} (1 row) @@ -506,7 +358,7 @@ CREATE FUNCTION return_str_arr() RETURNS varchar[] AS $$ return "hello" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT return_str_arr(); return_str_arr @@ -540,7 +392,7 @@ AS $$ if (e["age"] < 30) and (e["salary"] > 100000): return True return False -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; @@ -574,7 +426,7 @@ CREATE FUNCTION make_pair (name text, value integer) AS $$ return ( name, value ) # or alternatively, as list: return [ name, value ] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; To return an SQL null for any column, insert None at @@ -600,7 +452,7 @@ CREATE FUNCTION make_pair (name text, value integer) RETURNS named_value AS $$ return { "name": name, "value": value } -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; Any extra dictionary key/value pairs are ignored. Missing keys are @@ -633,7 +485,7 @@ AS $$ nv.name = name nv.value = value return nv -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; @@ -646,7 +498,7 @@ $$ LANGUAGE plpythonu; CREATE FUNCTION multiout_simple(OUT i integer, OUT j integer) AS $$ return (1, 2) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM multiout_simple(); @@ -657,7 +509,7 @@ SELECT * FROM multiout_simple(); CREATE PROCEDURE python_triple(INOUT a integer, INOUT b integer) AS $$ return (a * 3, b * 3) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CALL python_triple(5, 10); @@ -693,7 +545,7 @@ AS $$ # return tuple containing lists as composite types # all other combinations work also return ( [ how, "World" ], [ how, "PostgreSQL" ], [ how, "PL/Python" ] ) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; @@ -724,7 +576,7 @@ AS $$ return ( self.how, self.who[self.ndx] ) return producer(how, [ "World", "PostgreSQL", "PL/Python" ]) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; @@ -740,7 +592,7 @@ CREATE FUNCTION greet (how text) AS $$ for who in [ "World", "PostgreSQL", "PL/Python" ]: yield ( how, who ) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; @@ -756,7 +608,7 @@ $$ LANGUAGE plpythonu; CREATE FUNCTION multiout_simple_setof(n integer, OUT integer, OUT integer) RETURNS SETOF record AS $$ return [(1, 2)] * n -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM multiout_simple_setof(3); @@ -794,7 +646,7 @@ SELECT * FROM multiout_simple_setof(3); DO $$ # PL/Python code -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; An anonymous code block receives no arguments, and whatever value it @@ -1089,7 +941,7 @@ CREATE FUNCTION usesavedplan() RETURNS trigger AS $$ plan = plpy.prepare("SELECT 1") SD["plan"] = plan # rest of function -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; @@ -1132,7 +984,7 @@ for row in plpy.cursor("select num from largetable"): if row['num'] % 2: odd += 1 return odd -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION count_odd_fetch(batch_size integer) RETURNS integer AS $$ odd = 0 @@ -1145,7 +997,7 @@ while True: if row['num'] % 2: odd += 1 return odd -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; CREATE FUNCTION count_odd_prepared() RETURNS integer AS $$ odd = 0 @@ -1153,7 +1005,7 @@ plan = plpy.prepare("select num from largetable where num % $1 <> 0", ["in rows = list(plpy.cursor(plan, [2])) # or: = list(plan.cursor([2])) return len(rows) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; @@ -1198,7 +1050,7 @@ CREATE FUNCTION try_adding_joe() RETURNS text AS $$ return "something went wrong" else: return "Joe added" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; @@ -1231,7 +1083,7 @@ except plpy.SPIError as e: return "other error, SQLSTATE %s" % e.sqlstate else: return "fraction inserted" -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; Note that because all exceptions from the plpy.spiexceptions module inherit @@ -1280,7 +1132,7 @@ else: result = "funds transferred correctly" plan = plpy.prepare("INSERT INTO operations (result) VALUES ($1)", ["text"]) plpy.execute(plan, [result]) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; If the second UPDATE statement results in an exception being raised, this function will report the error, but @@ -1312,7 +1164,7 @@ else: result = "funds transferred correctly" plan = plpy.prepare("INSERT INTO operations (result) VALUES ($1)", ["text"]) plpy.execute(plan, [result]) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; Note that the use of try/catch is still required. Otherwise the exception would propagate to the top of @@ -1329,44 +1181,6 @@ $$ LANGUAGE plpythonu; to be rolled back. - - - Older Python Versions - - - Context managers syntax using the with keyword - is available by default in Python 2.6. For compatibility with - older Python versions, you can call the - subtransaction manager's __enter__ and - __exit__ functions using the - enter and exit convenience - aliases. The example function that transfers funds could be - written as: - -CREATE FUNCTION transfer_funds_old() RETURNS void AS $$ -try: - subxact = plpy.subtransaction() - subxact.enter() - try: - plpy.execute("UPDATE accounts SET balance = balance - 100 WHERE account_name = 'joe'") - plpy.execute("UPDATE accounts SET balance = balance + 100 WHERE account_name = 'mary'") - except: - import sys - subxact.exit(*sys.exc_info()) - raise - else: - subxact.exit(None, None, None) -except plpy.SPIError as e: - result = "error transferring funds: %s" % e.args -else: - result = "funds transferred correctly" - -plan = plpy.prepare("INSERT INTO operations (result) VALUES ($1)", ["text"]) -plpy.execute(plan, [result]) -$$ LANGUAGE plpythonu; - - - @@ -1389,7 +1203,7 @@ $$ LANGUAGE plpythonu; Here is an example: CREATE PROCEDURE transaction_test1() -LANGUAGE plpythonu +LANGUAGE plpython3u AS $$ for i in range(0, 10): plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i) @@ -1465,7 +1279,7 @@ CREATE FUNCTION raise_custom_exception() RETURNS void AS $$ plpy.error("custom exception message", detail="some info about exception", hint="hint for users") -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; =# SELECT raise_custom_exception(); ERROR: plpy.Error: custom exception message @@ -1496,6 +1310,17 @@ plpy.execute("UPDATE tbl SET %s = %s WHERE key = %s" % ( + + Python 2 vs. Python 3 + + + PL/Python supports only Python 3. Past versions of + PostgreSQL supported Python 2, using the + plpythonu and plpython2u language + names. + + + Environment Variables diff --git a/doc/src/sgml/ref/comment.sgml b/doc/src/sgml/ref/comment.sgml index b12796095f..23d9029af9 100644 --- a/doc/src/sgml/ref/comment.sgml +++ b/doc/src/sgml/ref/comment.sgml @@ -349,7 +349,7 @@ COMMENT ON TEXT SEARCH CONFIGURATION my_config IS 'Special word filtering'; COMMENT ON TEXT SEARCH DICTIONARY swedish IS 'Snowball stemmer for Swedish language'; COMMENT ON TEXT SEARCH PARSER my_parser IS 'Splits text into words'; COMMENT ON TEXT SEARCH TEMPLATE snowball IS 'Snowball stemmer'; -COMMENT ON TRANSFORM FOR hstore LANGUAGE plpythonu IS 'Transform between hstore and Python dict'; +COMMENT ON TRANSFORM FOR hstore LANGUAGE plpython3u IS 'Transform between hstore and Python dict'; COMMENT ON TRIGGER my_trigger ON my_table IS 'Used for RI'; COMMENT ON TYPE complex IS 'Complex number data type'; COMMENT ON VIEW my_view IS 'View of departmental costs'; diff --git a/doc/src/sgml/ref/create_transform.sgml b/doc/src/sgml/ref/create_transform.sgml index 3f81dc6bba..34bdc60e13 100644 --- a/doc/src/sgml/ref/create_transform.sgml +++ b/doc/src/sgml/ref/create_transform.sgml @@ -156,11 +156,11 @@ CREATE [ OR REPLACE ] TRANSFORM FOR type_name LANGUAG To create a transform for type hstore and language - plpythonu, first set up the type and the language: + plpython3u, first set up the type and the language: CREATE TYPE hstore ...; -CREATE EXTENSION plpythonu; +CREATE EXTENSION plpython3u; Then create the necessary functions: @@ -174,7 +174,7 @@ AS ...; And finally create the transform to connect them all together: -CREATE TRANSFORM FOR hstore LANGUAGE plpythonu ( +CREATE TRANSFORM FOR hstore LANGUAGE plpython3u ( FROM SQL WITH FUNCTION hstore_to_plpython(internal), TO SQL WITH FUNCTION plpython_to_hstore(internal) ); diff --git a/doc/src/sgml/ref/drop_transform.sgml b/doc/src/sgml/ref/drop_transform.sgml index d25cb51604..544a9663d7 100644 --- a/doc/src/sgml/ref/drop_transform.sgml +++ b/doc/src/sgml/ref/drop_transform.sgml @@ -101,9 +101,9 @@ DROP TRANSFORM [ IF EXISTS ] FOR type_name LANGUAGE < To drop the transform for type hstore and language - plpythonu: + plpython3u: -DROP TRANSFORM FOR hstore LANGUAGE plpythonu; +DROP TRANSFORM FOR hstore LANGUAGE plpython3u;
From d3e8368c4b6e5110d8b3d12859850aeaae08dffb Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Tue, 8 Mar 2022 08:08:32 +0530 Subject: [PATCH 100/772] Add the additional information to the logical replication worker errcontext. This commits adds both the finish LSN (commit_lsn in case transaction got committed, prepare_lsn in case of a prepared transaction, etc.) and replication origin name to the existing error context message. This will help users in specifying the origin name and transaction finish LSN to pg_replication_origin_advance() SQL function to skip a particular transaction. Author: Masahiko Sawada Reviewed-by: Takamichi Osumi, Euler Taveira, and Amit Kapila Discussion: https://postgr.es/m/CAD21AoBarBf2oTF71ig2g_o=3Z_Dt6_sOpMQma1kFgbnA5OZ_w@mail.gmail.com --- doc/src/sgml/logical-replication.sgml | 23 ++++++-- src/backend/replication/logical/worker.c | 75 ++++++++++++++++++------ 2 files changed, 75 insertions(+), 23 deletions(-) diff --git a/doc/src/sgml/logical-replication.sgml b/doc/src/sgml/logical-replication.sgml index fb4472356d..82326c3901 100644 --- a/doc/src/sgml/logical-replication.sgml +++ b/doc/src/sgml/logical-replication.sgml @@ -352,11 +352,26 @@ The resolution can be done either by changing data or permissions on the subscriber so that it does not conflict with the incoming change or by skipping the - transaction that conflicts with the existing data. The transaction can be - skipped by calling the + transaction that conflicts with the existing data. When a conflict produces + an error, the replication won't proceed, and the logical replication worker will + emit the following kind of message to the subscriber's server log: + +ERROR: duplicate key value violates unique constraint "test_pkey" +DETAIL: Key (c)=(1) already exists. +CONTEXT: processing remote data for replication origin "pg_16395" during "INSERT" for replication target relation "public.test" in transaction 725 finished at 0/14C0378 + + The LSN of the transaction that contains the change violating the constraint and + the replication origin name can be found from the server log (LSN 0/14C0378 and + replication origin pg_16395 in the above case). To skip the + transaction, the subscription needs to be disabled temporarily by + ALTER SUBSCRIPTION ... DISABLE first. Then, the transaction + can be skipped by calling the + pg_replication_origin_advance() function with - a node_name corresponding to the subscription name, - and a position. The current position of origins can be seen in the + the node_name (i.e., pg_16395) and the + next LSN of the transaction's LSN (i.e., LSN 0/14C0379). After that the replication + can be resumed by ALTER SUBSCRIPTION ... ENABLE. The current + position of origins can be seen in the pg_replication_origin_status system view. diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 92aa794706..8653e1d840 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -226,6 +226,8 @@ typedef struct ApplyErrorCallbackArg /* Remote node information */ int remote_attnum; /* -1 if invalid */ TransactionId remote_xid; + XLogRecPtr finish_lsn; + char *origin_name; } ApplyErrorCallbackArg; static ApplyErrorCallbackArg apply_error_callback_arg = @@ -234,6 +236,8 @@ static ApplyErrorCallbackArg apply_error_callback_arg = .rel = NULL, .remote_attnum = -1, .remote_xid = InvalidTransactionId, + .finish_lsn = InvalidXLogRecPtr, + .origin_name = NULL, }; static MemoryContext ApplyMessageContext = NULL; @@ -332,7 +336,7 @@ static void apply_spooled_messages(TransactionId xid, XLogRecPtr lsn); /* Functions for apply error callback */ static void apply_error_callback(void *arg); -static inline void set_apply_error_context_xact(TransactionId xid); +static inline void set_apply_error_context_xact(TransactionId xid, XLogRecPtr lsn); static inline void reset_apply_error_context_info(void); /* @@ -785,7 +789,7 @@ apply_handle_begin(StringInfo s) LogicalRepBeginData begin_data; logicalrep_read_begin(s, &begin_data); - set_apply_error_context_xact(begin_data.xid); + set_apply_error_context_xact(begin_data.xid, begin_data.final_lsn); remote_final_lsn = begin_data.final_lsn; @@ -837,7 +841,7 @@ apply_handle_begin_prepare(StringInfo s) errmsg_internal("tablesync worker received a BEGIN PREPARE message"))); logicalrep_read_begin_prepare(s, &begin_data); - set_apply_error_context_xact(begin_data.xid); + set_apply_error_context_xact(begin_data.xid, begin_data.prepare_lsn); remote_final_lsn = begin_data.prepare_lsn; @@ -936,7 +940,7 @@ apply_handle_commit_prepared(StringInfo s) char gid[GIDSIZE]; logicalrep_read_commit_prepared(s, &prepare_data); - set_apply_error_context_xact(prepare_data.xid); + set_apply_error_context_xact(prepare_data.xid, prepare_data.commit_lsn); /* Compute GID for two_phase transactions. */ TwoPhaseTransactionGid(MySubscription->oid, prepare_data.xid, @@ -977,7 +981,7 @@ apply_handle_rollback_prepared(StringInfo s) char gid[GIDSIZE]; logicalrep_read_rollback_prepared(s, &rollback_data); - set_apply_error_context_xact(rollback_data.xid); + set_apply_error_context_xact(rollback_data.xid, rollback_data.rollback_end_lsn); /* Compute GID for two_phase transactions. */ TwoPhaseTransactionGid(MySubscription->oid, rollback_data.xid, @@ -1042,7 +1046,7 @@ apply_handle_stream_prepare(StringInfo s) errmsg_internal("tablesync worker received a STREAM PREPARE message"))); logicalrep_read_stream_prepare(s, &prepare_data); - set_apply_error_context_xact(prepare_data.xid); + set_apply_error_context_xact(prepare_data.xid, prepare_data.prepare_lsn); elog(DEBUG1, "received prepare for streamed transaction %u", prepare_data.xid); @@ -1124,7 +1128,7 @@ apply_handle_stream_start(StringInfo s) (errcode(ERRCODE_PROTOCOL_VIOLATION), errmsg_internal("invalid transaction ID in streamed replication transaction"))); - set_apply_error_context_xact(stream_xid); + set_apply_error_context_xact(stream_xid, InvalidXLogRecPtr); /* * Initialize the worker's stream_fileset if we haven't yet. This will be @@ -1213,7 +1217,7 @@ apply_handle_stream_abort(StringInfo s) */ if (xid == subxid) { - set_apply_error_context_xact(xid); + set_apply_error_context_xact(xid, InvalidXLogRecPtr); stream_cleanup_files(MyLogicalRepWorker->subid, xid); } else @@ -1239,7 +1243,7 @@ apply_handle_stream_abort(StringInfo s) bool found = false; char path[MAXPGPATH]; - set_apply_error_context_xact(subxid); + set_apply_error_context_xact(subxid, InvalidXLogRecPtr); subidx = -1; begin_replication_step(); @@ -1424,7 +1428,7 @@ apply_handle_stream_commit(StringInfo s) errmsg_internal("STREAM COMMIT message without STREAM STOP"))); xid = logicalrep_read_stream_commit(s, &commit_data); - set_apply_error_context_xact(xid); + set_apply_error_context_xact(xid, commit_data.commit_lsn); elog(DEBUG1, "received commit for streamed transaction %u", xid); @@ -3499,6 +3503,17 @@ ApplyWorkerMain(Datum main_arg) myslotname = MemoryContextStrdup(ApplyContext, syncslotname); pfree(syncslotname); + + /* + * Allocate the origin name in long-lived context for error context + * message. + */ + ReplicationOriginNameForTablesync(MySubscription->oid, + MyLogicalRepWorker->relid, + originname, + sizeof(originname)); + apply_error_callback_arg.origin_name = MemoryContextStrdup(ApplyContext, + originname); } else { @@ -3542,6 +3557,13 @@ ApplyWorkerMain(Datum main_arg) * does some initializations on the upstream so let's still call it. */ (void) walrcv_identify_system(LogRepWorkerWalRcvConn, &startpointTLI); + + /* + * Allocate the origin name in long-lived context for error context + * message. + */ + apply_error_callback_arg.origin_name = MemoryContextStrdup(ApplyContext, + originname); } /* @@ -3651,36 +3673,51 @@ apply_error_callback(void *arg) if (apply_error_callback_arg.command == 0) return; + Assert(errarg->origin_name); + if (errarg->rel == NULL) { if (!TransactionIdIsValid(errarg->remote_xid)) - errcontext("processing remote data during \"%s\"", + errcontext("processing remote data for replication origin \"%s\" during \"%s\"", + errarg->origin_name, logicalrep_message_type(errarg->command)); - else - errcontext("processing remote data during \"%s\" in transaction %u", + else if (XLogRecPtrIsInvalid(errarg->finish_lsn)) + errcontext("processing remote data for replication origin \"%s\" during \"%s\" in transaction %u", + errarg->origin_name, logicalrep_message_type(errarg->command), errarg->remote_xid); + else + errcontext("processing remote data for replication origin \"%s\" during \"%s\" in transaction %u finished at %X/%X", + errarg->origin_name, + logicalrep_message_type(errarg->command), + errarg->remote_xid, + LSN_FORMAT_ARGS(errarg->finish_lsn)); } else if (errarg->remote_attnum < 0) - errcontext("processing remote data during \"%s\" for replication target relation \"%s.%s\" in transaction %u", + errcontext("processing remote data for replication origin \"%s\" during \"%s\" for replication target relation \"%s.%s\" in transaction %u finished at %X/%X", + errarg->origin_name, logicalrep_message_type(errarg->command), errarg->rel->remoterel.nspname, errarg->rel->remoterel.relname, - errarg->remote_xid); + errarg->remote_xid, + LSN_FORMAT_ARGS(errarg->finish_lsn)); else - errcontext("processing remote data during \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u", + errcontext("processing remote data for replication origin \"%s\" during \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u finished at %X/%X", + errarg->origin_name, logicalrep_message_type(errarg->command), errarg->rel->remoterel.nspname, errarg->rel->remoterel.relname, errarg->rel->remoterel.attnames[errarg->remote_attnum], - errarg->remote_xid); + errarg->remote_xid, + LSN_FORMAT_ARGS(errarg->finish_lsn)); } /* Set transaction information of apply error callback */ static inline void -set_apply_error_context_xact(TransactionId xid) +set_apply_error_context_xact(TransactionId xid, XLogRecPtr lsn) { apply_error_callback_arg.remote_xid = xid; + apply_error_callback_arg.finish_lsn = lsn; } /* Reset all information of apply error callback */ @@ -3690,5 +3727,5 @@ reset_apply_error_context_info(void) apply_error_callback_arg.command = 0; apply_error_callback_arg.rel = NULL; apply_error_callback_arg.remote_attnum = -1; - set_apply_error_context_xact(InvalidTransactionId); + set_apply_error_context_xact(InvalidTransactionId, InvalidXLogRecPtr); } From c28839c8326155f25161ed42f23890c997e0b4a4 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 8 Mar 2022 14:29:03 +0900 Subject: [PATCH 101/772] Improve comment in execReplication.c Author: Peter Smith Reviewed-by: Julien Rouhaud Discussion: https://postgr.es/m/CAHut+PuRVf3ghNTg8EV5XOQu6unGSZma0ahsRoz-haaOFZe-1A@mail.gmail.com --- src/backend/executor/execReplication.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c index de106d767d..09f78f2244 100644 --- a/src/backend/executor/execReplication.c +++ b/src/backend/executor/execReplication.c @@ -607,7 +607,7 @@ CheckCmdReplicaIdentity(Relation rel, CmdType cmd) return; /* - * This is either UPDATE OR DELETE and there is no replica identity. + * This is UPDATE/DELETE and there is no replica identity. * * Check if the table publishes UPDATES or DELETES. */ From 7cf085f077df8dd9b80cf1f5964b5b8c142be496 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 7 Mar 2022 15:08:45 -0500 Subject: [PATCH 102/772] Add support for zstd base backup compression. Both client-side compression and server-side compression are now supported for zstd. In addition, a backup compressed by the server using zstd can now be decompressed by the client in order to accommodate the use of -Fp. Jeevan Ladhe, with some edits by me. Discussion: http://postgr.es/m/CA+Tgmobyzfbz=gyze2_LL1ZumZunmaEKbHQxjrFkOR7APZGu-g@mail.gmail.com --- doc/src/sgml/protocol.sgml | 7 +- doc/src/sgml/ref/pg_basebackup.sgml | 41 ++- src/backend/replication/Makefile | 1 + src/backend/replication/basebackup.c | 7 +- src/backend/replication/basebackup_zstd.c | 299 ++++++++++++++++ src/bin/pg_basebackup/Makefile | 1 + src/bin/pg_basebackup/bbstreamer.h | 3 + src/bin/pg_basebackup/bbstreamer_zstd.c | 338 ++++++++++++++++++ src/bin/pg_basebackup/pg_basebackup.c | 49 ++- src/bin/pg_basebackup/pg_receivewal.c | 4 + src/bin/pg_basebackup/walmethods.h | 1 + src/bin/pg_verifybackup/Makefile | 1 + src/bin/pg_verifybackup/t/008_untar.pl | 9 + src/bin/pg_verifybackup/t/009_extract.pl | 5 + src/bin/pg_verifybackup/t/010_client_untar.pl | 8 + src/include/replication/basebackup_sink.h | 1 + src/tools/msvc/Mkvcbuild.pm | 1 + 17 files changed, 750 insertions(+), 26 deletions(-) create mode 100644 src/backend/replication/basebackup_zstd.c create mode 100644 src/bin/pg_basebackup/bbstreamer_zstd.c diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index c51c4254a7..0695bcd423 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -2724,8 +2724,8 @@ The commands accepted in replication mode are: Instructs the server to compress the backup using the specified - method. Currently, the supported methods are gzip - and lz4. + method. Currently, the supported methods are gzip, + lz4, and zstd. @@ -2737,7 +2737,8 @@ The commands accepted in replication mode are: Specifies the compression level to be used. This should only be used in conjunction with the COMPRESSION option. For gzip the value should be an integer between 1 - and 9, and for lz4 it should be between 1 and 12. + and 9, for lz4 between 1 and 12, and for + zstd it should be between 1 and 22. diff --git a/doc/src/sgml/ref/pg_basebackup.sgml b/doc/src/sgml/ref/pg_basebackup.sgml index 53aa40dcd1..4a630b59b7 100644 --- a/doc/src/sgml/ref/pg_basebackup.sgml +++ b/doc/src/sgml/ref/pg_basebackup.sgml @@ -417,30 +417,33 @@ PostgreSQL documentation specify -Xfetch. - The compression method can be set to gzip or - lz4, or none for no - compression. A compression level can be optionally specified, by - appending the level number after a colon (:). If no - level is specified, the default compression level will be used. If - only a level is specified without mentioning an algorithm, - gzip compression will be used if the level is - greater than 0, and no compression will be used if the level is 0. - - - When the tar format is used with gzip or - lz4, the suffix .gz or - .lz4 will automatically be added to all tar - filenames. When the plain format is used, client-side compression may - not be specified, but it is still possible to request server-side - compression. If this is done, the server will compress the backup for - transmission, and the client will decompress and extract it. + The compression method can be set to gzip, + lz4, zstd, or + none for no compression. A compression level can + optionally be specified, by appending the level number after a colon + (:). If no level is specified, the default + compression level will be used. If only a level is specified without + mentioning an algorithm, gzip compression will be + used if the level is greater than 0, and no compression will be used if + the level is 0. + + + When the tar format is used with gzip, + lz4, or zstd, the suffix + .gz, .lz4, or + .zst, respectively, will be automatically added to + all tar filenames. When the plain format is used, client-side + compression may not be specified, but it is still possible to request + server-side compression. If this is done, the server will compress the + backup for transmission, and the client will decompress and extract it. When this option is used in combination with -Xstream, pg_wal.tar will be compressed using gzip if client-side gzip - compression is selected, but will not be compressed if server-side - compresion or LZ4 compresion is selected. + compression is selected, but will not be compressed if any other + compression algorithm is selected, or if server-side compression + is selected. diff --git a/src/backend/replication/Makefile b/src/backend/replication/Makefile index 74043ff331..2e6de7007f 100644 --- a/src/backend/replication/Makefile +++ b/src/backend/replication/Makefile @@ -20,6 +20,7 @@ OBJS = \ basebackup_copy.o \ basebackup_gzip.o \ basebackup_lz4.o \ + basebackup_zstd.o \ basebackup_progress.o \ basebackup_server.o \ basebackup_sink.o \ diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index 0bf28b55d7..2378ce5c5e 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -64,7 +64,8 @@ typedef enum { BACKUP_COMPRESSION_NONE, BACKUP_COMPRESSION_GZIP, - BACKUP_COMPRESSION_LZ4 + BACKUP_COMPRESSION_LZ4, + BACKUP_COMPRESSION_ZSTD } basebackup_compression_type; typedef struct @@ -906,6 +907,8 @@ parse_basebackup_options(List *options, basebackup_options *opt) opt->compression = BACKUP_COMPRESSION_GZIP; else if (strcmp(optval, "lz4") == 0) opt->compression = BACKUP_COMPRESSION_LZ4; + else if (strcmp(optval, "zstd") == 0) + opt->compression = BACKUP_COMPRESSION_ZSTD; else ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -1026,6 +1029,8 @@ SendBaseBackup(BaseBackupCmd *cmd) sink = bbsink_gzip_new(sink, opt.compression_level); else if (opt.compression == BACKUP_COMPRESSION_LZ4) sink = bbsink_lz4_new(sink, opt.compression_level); + else if (opt.compression == BACKUP_COMPRESSION_ZSTD) + sink = bbsink_zstd_new(sink, opt.compression_level); /* Set up progress reporting. */ sink = bbsink_progress_new(sink, opt.progress); diff --git a/src/backend/replication/basebackup_zstd.c b/src/backend/replication/basebackup_zstd.c new file mode 100644 index 0000000000..e3f9b1d4dc --- /dev/null +++ b/src/backend/replication/basebackup_zstd.c @@ -0,0 +1,299 @@ +/*------------------------------------------------------------------------- + * + * basebackup_zstd.c + * Basebackup sink implementing zstd compression. + * + * Portions Copyright (c) 2010-2020, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/replication/basebackup_zstd.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#ifdef HAVE_LIBZSTD +#include +#endif + +#include "replication/basebackup_sink.h" + +#ifdef HAVE_LIBZSTD + +typedef struct bbsink_zstd +{ + /* Common information for all types of sink. */ + bbsink base; + + /* Compression level */ + int compresslevel; + + ZSTD_CCtx *cctx; + ZSTD_outBuffer zstd_outBuf; +} bbsink_zstd; + +static void bbsink_zstd_begin_backup(bbsink *sink); +static void bbsink_zstd_begin_archive(bbsink *sink, const char *archive_name); +static void bbsink_zstd_archive_contents(bbsink *sink, size_t avail_in); +static void bbsink_zstd_manifest_contents(bbsink *sink, size_t len); +static void bbsink_zstd_end_archive(bbsink *sink); +static void bbsink_zstd_cleanup(bbsink *sink); +static void bbsink_zstd_end_backup(bbsink *sink, XLogRecPtr endptr, + TimeLineID endtli); + +const bbsink_ops bbsink_zstd_ops = { + .begin_backup = bbsink_zstd_begin_backup, + .begin_archive = bbsink_zstd_begin_archive, + .archive_contents = bbsink_zstd_archive_contents, + .end_archive = bbsink_zstd_end_archive, + .begin_manifest = bbsink_forward_begin_manifest, + .manifest_contents = bbsink_zstd_manifest_contents, + .end_manifest = bbsink_forward_end_manifest, + .end_backup = bbsink_zstd_end_backup, + .cleanup = bbsink_zstd_cleanup +}; +#endif + +/* + * Create a new basebackup sink that performs zstd compression using the + * designated compression level. + */ +bbsink * +bbsink_zstd_new(bbsink *next, int compresslevel) +{ +#ifndef HAVE_LIBZSTD + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("zstd compression is not supported by this build"))); + return NULL; /* keep compiler quiet */ +#else + bbsink_zstd *sink; + + Assert(next != NULL); + + if (compresslevel < 0 || compresslevel > 22) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("zstd compression level %d is out of range", + compresslevel))); + + sink = palloc0(sizeof(bbsink_zstd)); + *((const bbsink_ops **) &sink->base.bbs_ops) = &bbsink_zstd_ops; + sink->base.bbs_next = next; + sink->compresslevel = compresslevel; + + return &sink->base; +#endif +} + +#ifdef HAVE_LIBZSTD + +/* + * Begin backup. + */ +static void +bbsink_zstd_begin_backup(bbsink *sink) +{ + bbsink_zstd *mysink = (bbsink_zstd *) sink; + size_t output_buffer_bound; + + mysink->cctx = ZSTD_createCCtx(); + if (!mysink->cctx) + elog(ERROR, "could not create zstd compression context"); + + ZSTD_CCtx_setParameter(mysink->cctx, ZSTD_c_compressionLevel, + mysink->compresslevel); + + /* + * We need our own buffer, because we're going to pass different data to + * the next sink than what gets passed to us. + */ + mysink->base.bbs_buffer = palloc(mysink->base.bbs_buffer_length); + + /* + * Make sure that the next sink's bbs_buffer is big enough to accommodate + * the compressed input buffer. + */ + output_buffer_bound = ZSTD_compressBound(mysink->base.bbs_buffer_length); + + /* + * The buffer length is expected to be a multiple of BLCKSZ, so round up. + */ + output_buffer_bound = output_buffer_bound + BLCKSZ - + (output_buffer_bound % BLCKSZ); + + bbsink_begin_backup(sink->bbs_next, sink->bbs_state, output_buffer_bound); +} + +/* + * Prepare to compress the next archive. + */ +static void +bbsink_zstd_begin_archive(bbsink *sink, const char *archive_name) +{ + bbsink_zstd *mysink = (bbsink_zstd *) sink; + char *zstd_archive_name; + + /* + * At the start of each archive we reset the state to start a new + * compression operation. The parameters are sticky and they will stick + * around as we are resetting with option ZSTD_reset_session_only. + */ + ZSTD_CCtx_reset(mysink->cctx, ZSTD_reset_session_only); + + mysink->zstd_outBuf.dst = mysink->base.bbs_next->bbs_buffer; + mysink->zstd_outBuf.size = mysink->base.bbs_next->bbs_buffer_length; + mysink->zstd_outBuf.pos = 0; + + /* Add ".zst" to the archive name. */ + zstd_archive_name = psprintf("%s.zst", archive_name); + Assert(sink->bbs_next != NULL); + bbsink_begin_archive(sink->bbs_next, zstd_archive_name); + pfree(zstd_archive_name); +} + +/* + * Compress the input data to the output buffer until we run out of input + * data. Each time the output buffer falls below the compression bound for + * the input buffer, invoke the archive_contents() method for the next sink. + * + * Note that since we're compressing the input, it may very commonly happen + * that we consume all the input data without filling the output buffer. In + * that case, the compressed representation of the current input data won't + * actually be sent to the next bbsink until a later call to this function, + * or perhaps even not until bbsink_zstd_end_archive() is invoked. + */ +static void +bbsink_zstd_archive_contents(bbsink *sink, size_t len) +{ + bbsink_zstd *mysink = (bbsink_zstd *) sink; + ZSTD_inBuffer inBuf = {mysink->base.bbs_buffer, len, 0}; + + while (inBuf.pos < inBuf.size) + { + size_t yet_to_flush; + size_t max_needed = ZSTD_compressBound(inBuf.size - inBuf.pos); + + /* + * If the out buffer is not left with enough space, send the output + * buffer to the next sink, and reset it. + */ + if (mysink->zstd_outBuf.size - mysink->zstd_outBuf.pos < max_needed) + { + bbsink_archive_contents(mysink->base.bbs_next, + mysink->zstd_outBuf.pos); + mysink->zstd_outBuf.dst = mysink->base.bbs_next->bbs_buffer; + mysink->zstd_outBuf.size = + mysink->base.bbs_next->bbs_buffer_length; + mysink->zstd_outBuf.pos = 0; + } + + yet_to_flush = ZSTD_compressStream2(mysink->cctx, &mysink->zstd_outBuf, + &inBuf, ZSTD_e_continue); + + if (ZSTD_isError(yet_to_flush)) + elog(ERROR, + "could not compress data: %s", + ZSTD_getErrorName(yet_to_flush)); + } +} + +/* + * There might be some data inside zstd's internal buffers; we need to get that + * flushed out, also end the zstd frame and then get that forwarded to the + * successor sink as archive content. + * + * Then we can end processing for this archive. + */ +static void +bbsink_zstd_end_archive(bbsink *sink) +{ + bbsink_zstd *mysink = (bbsink_zstd *) sink; + size_t yet_to_flush; + + do + { + ZSTD_inBuffer in = {NULL, 0, 0}; + size_t max_needed = ZSTD_compressBound(0); + + /* + * If the out buffer is not left with enough space, send the output + * buffer to the next sink, and reset it. + */ + if (mysink->zstd_outBuf.size - mysink->zstd_outBuf.pos < max_needed) + { + bbsink_archive_contents(mysink->base.bbs_next, + mysink->zstd_outBuf.pos); + mysink->zstd_outBuf.dst = mysink->base.bbs_next->bbs_buffer; + mysink->zstd_outBuf.size = + mysink->base.bbs_next->bbs_buffer_length; + mysink->zstd_outBuf.pos = 0; + } + + yet_to_flush = ZSTD_compressStream2(mysink->cctx, + &mysink->zstd_outBuf, + &in, ZSTD_e_end); + + if (ZSTD_isError(yet_to_flush)) + elog(ERROR, "could not compress data: %s", + ZSTD_getErrorName(yet_to_flush)); + + } while (yet_to_flush > 0); + + /* Make sure to pass any remaining bytes to the next sink. */ + if (mysink->zstd_outBuf.pos > 0) + bbsink_archive_contents(mysink->base.bbs_next, + mysink->zstd_outBuf.pos); + + /* Pass on the information that this archive has ended. */ + bbsink_forward_end_archive(sink); +} + +/* + * Free the resources and context. + */ +static void +bbsink_zstd_end_backup(bbsink *sink, XLogRecPtr endptr, + TimeLineID endtli) +{ + bbsink_zstd *mysink = (bbsink_zstd *) sink; + + /* Release the context. */ + if (mysink->cctx) + { + ZSTD_freeCCtx(mysink->cctx); + mysink->cctx = NULL; + } + + bbsink_forward_end_backup(sink, endptr, endtli); +} + +/* + * Manifest contents are not compressed, but we do need to copy them into + * the successor sink's buffer, because we have our own. + */ +static void +bbsink_zstd_manifest_contents(bbsink *sink, size_t len) +{ + memcpy(sink->bbs_next->bbs_buffer, sink->bbs_buffer, len); + bbsink_manifest_contents(sink->bbs_next, len); +} + +/* + * In case the backup fails, make sure we free any compression context that + * got allocated, so that we don't leak memory. + */ +static void +bbsink_zstd_cleanup(bbsink *sink) +{ + bbsink_zstd *mysink = (bbsink_zstd *) sink; + + /* Release the context if not already released. */ + if (mysink->cctx) + { + ZSTD_freeCCtx(mysink->cctx); + mysink->cctx = NULL; + } +} + +#endif diff --git a/src/bin/pg_basebackup/Makefile b/src/bin/pg_basebackup/Makefile index 1d0db4f9d0..0035ebcef5 100644 --- a/src/bin/pg_basebackup/Makefile +++ b/src/bin/pg_basebackup/Makefile @@ -44,6 +44,7 @@ BBOBJS = \ bbstreamer_gzip.o \ bbstreamer_inject.o \ bbstreamer_lz4.o \ + bbstreamer_zstd.o \ bbstreamer_tar.o all: pg_basebackup pg_receivewal pg_recvlogical diff --git a/src/bin/pg_basebackup/bbstreamer.h b/src/bin/pg_basebackup/bbstreamer.h index c2de77bacc..02d4c05df6 100644 --- a/src/bin/pg_basebackup/bbstreamer.h +++ b/src/bin/pg_basebackup/bbstreamer.h @@ -209,6 +209,9 @@ extern bbstreamer *bbstreamer_gzip_decompressor_new(bbstreamer *next); extern bbstreamer *bbstreamer_lz4_compressor_new(bbstreamer *next, int compresslevel); extern bbstreamer *bbstreamer_lz4_decompressor_new(bbstreamer *next); +extern bbstreamer *bbstreamer_zstd_compressor_new(bbstreamer *next, + int compresslevel); +extern bbstreamer *bbstreamer_zstd_decompressor_new(bbstreamer *next); extern bbstreamer *bbstreamer_tar_parser_new(bbstreamer *next); extern bbstreamer *bbstreamer_tar_terminator_new(bbstreamer *next); extern bbstreamer *bbstreamer_tar_archiver_new(bbstreamer *next); diff --git a/src/bin/pg_basebackup/bbstreamer_zstd.c b/src/bin/pg_basebackup/bbstreamer_zstd.c new file mode 100644 index 0000000000..cc68367dd5 --- /dev/null +++ b/src/bin/pg_basebackup/bbstreamer_zstd.c @@ -0,0 +1,338 @@ +/*------------------------------------------------------------------------- + * + * bbstreamer_zstd.c + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/bin/pg_basebackup/bbstreamer_zstd.c + *------------------------------------------------------------------------- + */ + +#include "postgres_fe.h" + +#include + +#ifdef HAVE_LIBZSTD +#include +#endif + +#include "bbstreamer.h" +#include "common/logging.h" + +#ifdef HAVE_LIBZSTD + +typedef struct bbstreamer_zstd_frame +{ + bbstreamer base; + + ZSTD_CCtx *cctx; + ZSTD_DCtx *dctx; + ZSTD_outBuffer zstd_outBuf; +} bbstreamer_zstd_frame; + +static void bbstreamer_zstd_compressor_content(bbstreamer *streamer, + bbstreamer_member *member, + const char *data, int len, + bbstreamer_archive_context context); +static void bbstreamer_zstd_compressor_finalize(bbstreamer *streamer); +static void bbstreamer_zstd_compressor_free(bbstreamer *streamer); + +const bbstreamer_ops bbstreamer_zstd_compressor_ops = { + .content = bbstreamer_zstd_compressor_content, + .finalize = bbstreamer_zstd_compressor_finalize, + .free = bbstreamer_zstd_compressor_free +}; + +static void bbstreamer_zstd_decompressor_content(bbstreamer *streamer, + bbstreamer_member *member, + const char *data, int len, + bbstreamer_archive_context context); +static void bbstreamer_zstd_decompressor_finalize(bbstreamer *streamer); +static void bbstreamer_zstd_decompressor_free(bbstreamer *streamer); + +const bbstreamer_ops bbstreamer_zstd_decompressor_ops = { + .content = bbstreamer_zstd_decompressor_content, + .finalize = bbstreamer_zstd_decompressor_finalize, + .free = bbstreamer_zstd_decompressor_free +}; +#endif + +/* + * Create a new base backup streamer that performs zstd compression of tar + * blocks. + */ +bbstreamer * +bbstreamer_zstd_compressor_new(bbstreamer *next, int compresslevel) +{ +#ifdef HAVE_LIBZSTD + bbstreamer_zstd_frame *streamer; + + Assert(next != NULL); + + streamer = palloc0(sizeof(bbstreamer_zstd_frame)); + + *((const bbstreamer_ops **) &streamer->base.bbs_ops) = + &bbstreamer_zstd_compressor_ops; + + streamer->base.bbs_next = next; + initStringInfo(&streamer->base.bbs_buffer); + enlargeStringInfo(&streamer->base.bbs_buffer, ZSTD_DStreamOutSize()); + + streamer->cctx = ZSTD_createCCtx(); + if (!streamer->cctx) + pg_log_error("could not create zstd compression context"); + + /* Initialize stream compression preferences */ + ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_compressionLevel, + compresslevel); + + /* Initialize the ZSTD output buffer. */ + streamer->zstd_outBuf.dst = streamer->base.bbs_buffer.data; + streamer->zstd_outBuf.size = streamer->base.bbs_buffer.maxlen; + streamer->zstd_outBuf.pos = 0; + + return &streamer->base; +#else + pg_log_error("this build does not support zstd compression"); + exit(1); +#endif +} + +#ifdef HAVE_LIBZSTD +/* + * Compress the input data to output buffer. + * + * Find out the compression bound based on input data length for each + * invocation to make sure that output buffer has enough capacity to + * accommodate the compressed data. In case if the output buffer + * capacity falls short of compression bound then forward the content + * of output buffer to next streamer and empty the buffer. + */ +static void +bbstreamer_zstd_compressor_content(bbstreamer *streamer, + bbstreamer_member *member, + const char *data, int len, + bbstreamer_archive_context context) +{ + bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer; + ZSTD_inBuffer inBuf = {data, len, 0}; + + while (inBuf.pos < inBuf.size) + { + size_t yet_to_flush; + size_t max_needed = ZSTD_compressBound(inBuf.size - inBuf.pos); + + /* + * If the output buffer is not left with enough space, send the + * compressed bytes to the next streamer, and empty the buffer. + */ + if (mystreamer->zstd_outBuf.size - mystreamer->zstd_outBuf.pos < + max_needed) + { + bbstreamer_content(mystreamer->base.bbs_next, member, + mystreamer->zstd_outBuf.dst, + mystreamer->zstd_outBuf.pos, + context); + + /* Reset the ZSTD output buffer. */ + mystreamer->zstd_outBuf.dst = mystreamer->base.bbs_buffer.data; + mystreamer->zstd_outBuf.size = mystreamer->base.bbs_buffer.maxlen; + mystreamer->zstd_outBuf.pos = 0; + } + + yet_to_flush = + ZSTD_compressStream2(mystreamer->cctx, &mystreamer->zstd_outBuf, + &inBuf, ZSTD_e_continue); + + if (ZSTD_isError(yet_to_flush)) + pg_log_error("could not compress data: %s", + ZSTD_getErrorName(yet_to_flush)); + } +} + +/* + * End-of-stream processing. + */ +static void +bbstreamer_zstd_compressor_finalize(bbstreamer *streamer) +{ + bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer; + size_t yet_to_flush; + + do + { + ZSTD_inBuffer in = {NULL, 0, 0}; + size_t max_needed = ZSTD_compressBound(0); + + /* + * If the output buffer is not left with enough space, send the + * compressed bytes to the next streamer, and empty the buffer. + */ + if (mystreamer->zstd_outBuf.size - mystreamer->zstd_outBuf.pos < + max_needed) + { + bbstreamer_content(mystreamer->base.bbs_next, NULL, + mystreamer->zstd_outBuf.dst, + mystreamer->zstd_outBuf.pos, + BBSTREAMER_UNKNOWN); + + /* Reset the ZSTD output buffer. */ + mystreamer->zstd_outBuf.dst = mystreamer->base.bbs_buffer.data; + mystreamer->zstd_outBuf.size = mystreamer->base.bbs_buffer.maxlen; + mystreamer->zstd_outBuf.pos = 0; + } + + yet_to_flush = ZSTD_compressStream2(mystreamer->cctx, + &mystreamer->zstd_outBuf, + &in, ZSTD_e_end); + + if (ZSTD_isError(yet_to_flush)) + pg_log_error("could not compress data: %s", + ZSTD_getErrorName(yet_to_flush)); + + } while (yet_to_flush > 0); + + /* Make sure to pass any remaining bytes to the next streamer. */ + if (mystreamer->zstd_outBuf.pos > 0) + bbstreamer_content(mystreamer->base.bbs_next, NULL, + mystreamer->zstd_outBuf.dst, + mystreamer->zstd_outBuf.pos, + BBSTREAMER_UNKNOWN); + + bbstreamer_finalize(mystreamer->base.bbs_next); +} + +/* + * Free memory. + */ +static void +bbstreamer_zstd_compressor_free(bbstreamer *streamer) +{ + bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer; + + bbstreamer_free(streamer->bbs_next); + ZSTD_freeCCtx(mystreamer->cctx); + pfree(streamer->bbs_buffer.data); + pfree(streamer); +} +#endif + +/* + * Create a new base backup streamer that performs decompression of zstd + * compressed blocks. + */ +bbstreamer * +bbstreamer_zstd_decompressor_new(bbstreamer *next) +{ +#ifdef HAVE_LIBZSTD + bbstreamer_zstd_frame *streamer; + + Assert(next != NULL); + + streamer = palloc0(sizeof(bbstreamer_zstd_frame)); + *((const bbstreamer_ops **) &streamer->base.bbs_ops) = + &bbstreamer_zstd_decompressor_ops; + + streamer->base.bbs_next = next; + initStringInfo(&streamer->base.bbs_buffer); + enlargeStringInfo(&streamer->base.bbs_buffer, ZSTD_DStreamOutSize()); + + streamer->dctx = ZSTD_createDCtx(); + if (!streamer->dctx) + { + pg_log_error("could not create zstd decompression context"); + exit(1); + } + + /* Initialize the ZSTD output buffer. */ + streamer->zstd_outBuf.dst = streamer->base.bbs_buffer.data; + streamer->zstd_outBuf.size = streamer->base.bbs_buffer.maxlen; + streamer->zstd_outBuf.pos = 0; + + return &streamer->base; +#else + pg_log_error("this build does not support compression"); + exit(1); +#endif +} + +#ifdef HAVE_LIBZSTD +/* + * Decompress the input data to output buffer until we run out of input + * data. Each time the output buffer is full, pass on the decompressed data + * to the next streamer. + */ +static void +bbstreamer_zstd_decompressor_content(bbstreamer *streamer, + bbstreamer_member *member, + const char *data, int len, + bbstreamer_archive_context context) +{ + bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer; + ZSTD_inBuffer inBuf = {data, len, 0}; + + while (inBuf.pos < inBuf.size) + { + size_t ret; + + /* + * If output buffer is full then forward the content to next streamer + * and update the output buffer. + */ + if (mystreamer->zstd_outBuf.pos >= mystreamer->zstd_outBuf.size) + { + bbstreamer_content(mystreamer->base.bbs_next, member, + mystreamer->zstd_outBuf.dst, + mystreamer->zstd_outBuf.pos, + context); + + /* Reset the ZSTD output buffer. */ + mystreamer->zstd_outBuf.dst = mystreamer->base.bbs_buffer.data; + mystreamer->zstd_outBuf.size = mystreamer->base.bbs_buffer.maxlen; + mystreamer->zstd_outBuf.pos = 0; + } + + ret = ZSTD_decompressStream(mystreamer->dctx, + &mystreamer->zstd_outBuf, &inBuf); + + if (ZSTD_isError(ret)) + pg_log_error("could not decompress data: %s", ZSTD_getErrorName(ret)); + } +} + +/* + * End-of-stream processing. + */ +static void +bbstreamer_zstd_decompressor_finalize(bbstreamer *streamer) +{ + bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer; + + /* + * End of the stream, if there is some pending data in output buffers then + * we must forward it to next streamer. + */ + if (mystreamer->zstd_outBuf.pos > 0) + bbstreamer_content(mystreamer->base.bbs_next, NULL, + mystreamer->base.bbs_buffer.data, + mystreamer->base.bbs_buffer.maxlen, + BBSTREAMER_UNKNOWN); + + bbstreamer_finalize(mystreamer->base.bbs_next); +} + +/* + * Free memory. + */ +static void +bbstreamer_zstd_decompressor_free(bbstreamer *streamer) +{ + bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer; + + bbstreamer_free(streamer->bbs_next); + ZSTD_freeDCtx(mystreamer->dctx); + pfree(streamer->bbs_buffer.data); + pfree(streamer); +} +#endif diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index c1ed7aeeee..9f3ecc60fb 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -405,8 +405,9 @@ usage(void) printf(_(" -X, --wal-method=none|fetch|stream\n" " include required WAL files with specified method\n")); printf(_(" -z, --gzip compress tar output\n")); - printf(_(" -Z, --compress={[{client,server}-]gzip,lz4,none}[:LEVEL] or [LEVEL]\n" + printf(_(" -Z, --compress=[{client|server}-]{gzip|lz4|zstd}[:LEVEL]\n" " compress tar output with given compression method or level\n")); + printf(_(" -Z, --compress=none do not compress tar output\n")); printf(_("\nGeneral options:\n")); printf(_(" -c, --checkpoint=fast|spread\n" " set fast or spread checkpointing\n")); @@ -1067,6 +1068,21 @@ parse_compress_options(char *src, WalCompressionMethod *methodres, *methodres = COMPRESSION_LZ4; *locationres = COMPRESS_LOCATION_SERVER; } + else if (pg_strcasecmp(firstpart, "zstd") == 0) + { + *methodres = COMPRESSION_ZSTD; + *locationres = COMPRESS_LOCATION_UNSPECIFIED; + } + else if (pg_strcasecmp(firstpart, "client-zstd") == 0) + { + *methodres = COMPRESSION_ZSTD; + *locationres = COMPRESS_LOCATION_CLIENT; + } + else if (pg_strcasecmp(firstpart, "server-zstd") == 0) + { + *methodres = COMPRESSION_ZSTD; + *locationres = COMPRESS_LOCATION_SERVER; + } else if (pg_strcasecmp(firstpart, "none") == 0) { *methodres = COMPRESSION_NONE; @@ -1191,7 +1207,8 @@ CreateBackupStreamer(char *archive_name, char *spclocation, bool inject_manifest; bool is_tar, is_tar_gz, - is_tar_lz4; + is_tar_lz4, + is_tar_zstd; bool must_parse_archive; int archive_name_len = strlen(archive_name); @@ -1214,6 +1231,10 @@ CreateBackupStreamer(char *archive_name, char *spclocation, is_tar_lz4 = (archive_name_len > 8 && strcmp(archive_name + archive_name_len - 4, ".lz4") == 0); + /* Is this a ZSTD archive? */ + is_tar_zstd = (archive_name_len > 8 && + strcmp(archive_name + archive_name_len - 4, ".zst") == 0); + /* * We have to parse the archive if (1) we're suppose to extract it, or if * (2) we need to inject backup_manifest or recovery configuration into it. @@ -1223,7 +1244,8 @@ CreateBackupStreamer(char *archive_name, char *spclocation, (spclocation == NULL && writerecoveryconf)); /* At present, we only know how to parse tar archives. */ - if (must_parse_archive && !is_tar && !is_tar_gz && !is_tar_lz4) + if (must_parse_archive && !is_tar && !is_tar_gz && !is_tar_lz4 + && !is_tar_zstd) { pg_log_error("unable to parse archive: %s", archive_name); pg_log_info("only tar archives can be parsed"); @@ -1295,6 +1317,14 @@ CreateBackupStreamer(char *archive_name, char *spclocation, streamer = bbstreamer_lz4_compressor_new(streamer, compresslevel); } + else if (compressmethod == COMPRESSION_ZSTD) + { + strlcat(archive_filename, ".zst", sizeof(archive_filename)); + streamer = bbstreamer_plain_writer_new(archive_filename, + archive_file); + streamer = bbstreamer_zstd_compressor_new(streamer, + compresslevel); + } else { Assert(false); /* not reachable */ @@ -1353,6 +1383,8 @@ CreateBackupStreamer(char *archive_name, char *spclocation, streamer = bbstreamer_gzip_decompressor_new(streamer); else if (compressmethod == COMPRESSION_LZ4) streamer = bbstreamer_lz4_decompressor_new(streamer); + else if (compressmethod == COMPRESSION_ZSTD) + streamer = bbstreamer_zstd_decompressor_new(streamer); } /* Return the results. */ @@ -2020,6 +2052,9 @@ BaseBackup(void) case COMPRESSION_LZ4: compressmethodstr = "lz4"; break; + case COMPRESSION_ZSTD: + compressmethodstr = "zstd"; + break; default: Assert(false); break; @@ -2869,6 +2904,14 @@ main(int argc, char **argv) exit(1); } break; + case COMPRESSION_ZSTD: + if (compresslevel > 22) + { + pg_log_error("compression level %d of method %s higher than maximum of 22", + compresslevel, "zstd"); + exit(1); + } + break; } /* diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c index ce661a9ce4..8a4c2b8964 100644 --- a/src/bin/pg_basebackup/pg_receivewal.c +++ b/src/bin/pg_basebackup/pg_receivewal.c @@ -904,6 +904,10 @@ main(int argc, char **argv) exit(1); #endif break; + case COMPRESSION_ZSTD: + pg_log_error("compression with %s is not yet supported", "ZSTD"); + exit(1); + } diff --git a/src/bin/pg_basebackup/walmethods.h b/src/bin/pg_basebackup/walmethods.h index 2dfb353baa..ec54019cfc 100644 --- a/src/bin/pg_basebackup/walmethods.h +++ b/src/bin/pg_basebackup/walmethods.h @@ -24,6 +24,7 @@ typedef enum { COMPRESSION_GZIP, COMPRESSION_LZ4, + COMPRESSION_ZSTD, COMPRESSION_NONE } WalCompressionMethod; diff --git a/src/bin/pg_verifybackup/Makefile b/src/bin/pg_verifybackup/Makefile index 851233a6e0..596df15118 100644 --- a/src/bin/pg_verifybackup/Makefile +++ b/src/bin/pg_verifybackup/Makefile @@ -10,6 +10,7 @@ export TAR # name. export GZIP_PROGRAM=$(GZIP) export LZ4=$(LZ4) +export ZSTD=$(ZSTD) subdir = src/bin/pg_verifybackup top_builddir = ../../.. diff --git a/src/bin/pg_verifybackup/t/008_untar.pl b/src/bin/pg_verifybackup/t/008_untar.pl index 383203d0b8..efbc910dfb 100644 --- a/src/bin/pg_verifybackup/t/008_untar.pl +++ b/src/bin/pg_verifybackup/t/008_untar.pl @@ -42,6 +42,14 @@ 'decompress_program' => $ENV{'LZ4'}, 'decompress_flags' => [ '-d', '-m'], 'enabled' => check_pg_config("#define HAVE_LIBLZ4 1") + }, + { + 'compression_method' => 'zstd', + 'backup_flags' => ['--compress', 'server-zstd'], + 'backup_archive' => 'base.tar.zst', + 'decompress_program' => $ENV{'ZSTD'}, + 'decompress_flags' => [ '-d' ], + 'enabled' => check_pg_config("#define HAVE_LIBZSTD 1") } ); @@ -107,6 +115,7 @@ # Cleanup. unlink($backup_path . '/backup_manifest'); unlink($backup_path . '/base.tar'); + unlink($backup_path . '/' . $tc->{'backup_archive'}); rmtree($extract_path); } } diff --git a/src/bin/pg_verifybackup/t/009_extract.pl b/src/bin/pg_verifybackup/t/009_extract.pl index c51cdf79f8..d30ba01742 100644 --- a/src/bin/pg_verifybackup/t/009_extract.pl +++ b/src/bin/pg_verifybackup/t/009_extract.pl @@ -31,6 +31,11 @@ 'compression_method' => 'lz4', 'backup_flags' => ['--compress', 'server-lz4:5'], 'enabled' => check_pg_config("#define HAVE_LIBLZ4 1") + }, + { + 'compression_method' => 'zstd', + 'backup_flags' => ['--compress', 'server-zstd:5'], + 'enabled' => check_pg_config("#define HAVE_LIBZSTD 1") } ); diff --git a/src/bin/pg_verifybackup/t/010_client_untar.pl b/src/bin/pg_verifybackup/t/010_client_untar.pl index 3616529390..c2a6161be6 100644 --- a/src/bin/pg_verifybackup/t/010_client_untar.pl +++ b/src/bin/pg_verifybackup/t/010_client_untar.pl @@ -42,6 +42,14 @@ 'decompress_flags' => [ '-d' ], 'output_file' => 'base.tar', 'enabled' => check_pg_config("#define HAVE_LIBLZ4 1") + }, + { + 'compression_method' => 'zstd', + 'backup_flags' => ['--compress', 'client-zstd:5'], + 'backup_archive' => 'base.tar.zst', + 'decompress_program' => $ENV{'ZSTD'}, + 'decompress_flags' => [ '-d' ], + 'enabled' => check_pg_config("#define HAVE_LIBZSTD 1") } ); diff --git a/src/include/replication/basebackup_sink.h b/src/include/replication/basebackup_sink.h index a3f8d37258..a7f16758a4 100644 --- a/src/include/replication/basebackup_sink.h +++ b/src/include/replication/basebackup_sink.h @@ -285,6 +285,7 @@ extern void bbsink_forward_cleanup(bbsink *sink); extern bbsink *bbsink_copystream_new(bool send_to_client); extern bbsink *bbsink_gzip_new(bbsink *next, int compresslevel); extern bbsink *bbsink_lz4_new(bbsink *next, int compresslevel); +extern bbsink *bbsink_zstd_new(bbsink *next, int compresslevel); extern bbsink *bbsink_progress_new(bbsink *next, bool estimate_backup_size); extern bbsink *bbsink_server_new(bbsink *next, char *pathname); extern bbsink *bbsink_throttle_new(bbsink *next, uint32 maxrate); diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm index 105f5c72a2..441d6ae6bf 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -380,6 +380,7 @@ sub mkvcbuild $pgbasebackup->AddFile('src/bin/pg_basebackup/bbstreamer_gzip.c'); $pgbasebackup->AddFile('src/bin/pg_basebackup/bbstreamer_inject.c'); $pgbasebackup->AddFile('src/bin/pg_basebackup/bbstreamer_lz4.c'); + $pgbasebackup->AddFile('src/bin/pg_basebackup/bbstreamer_zstd.c'); $pgbasebackup->AddFile('src/bin/pg_basebackup/bbstreamer_tar.c'); $pgbasebackup->AddLibrary('ws2_32.lib'); From 1d4be6be65ab18aa3b240d9bc912ebece255c53b Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 8 Mar 2022 10:05:55 -0500 Subject: [PATCH 103/772] Fix LZ4 tests for remaining buffer space. We should flush the buffer when the remaining space is less than the maximum amount that we might need, not when it is less than or equal to the maximum amount we might need. Jeevan Ladhe, per an observation from me. Discussion: http://postgr.es/m/CANm22CgVMa85O1akgs+DOPE8NSrT1zbz5_vYfS83_r+6nCivLQ@mail.gmail.com --- src/backend/replication/basebackup_lz4.c | 4 ++-- src/bin/pg_basebackup/bbstreamer_lz4.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/replication/basebackup_lz4.c b/src/backend/replication/basebackup_lz4.c index d26032783c..472b620d7c 100644 --- a/src/backend/replication/basebackup_lz4.c +++ b/src/backend/replication/basebackup_lz4.c @@ -193,7 +193,7 @@ bbsink_lz4_archive_contents(bbsink *sink, size_t avail_in) * LZ4F_compressBound(), ask the next sink to process the data so that we * can empty the buffer. */ - if ((mysink->base.bbs_next->bbs_buffer_length - mysink->bytes_written) <= + if ((mysink->base.bbs_next->bbs_buffer_length - mysink->bytes_written) < avail_in_bound) { bbsink_archive_contents(sink->bbs_next, mysink->bytes_written); @@ -238,7 +238,7 @@ bbsink_lz4_end_archive(bbsink *sink) Assert(mysink->base.bbs_next->bbs_buffer_length >= lz4_footer_bound); - if ((mysink->base.bbs_next->bbs_buffer_length - mysink->bytes_written) <= + if ((mysink->base.bbs_next->bbs_buffer_length - mysink->bytes_written) < lz4_footer_bound) { bbsink_archive_contents(sink->bbs_next, mysink->bytes_written); diff --git a/src/bin/pg_basebackup/bbstreamer_lz4.c b/src/bin/pg_basebackup/bbstreamer_lz4.c index f0bc226bf8..bde018246f 100644 --- a/src/bin/pg_basebackup/bbstreamer_lz4.c +++ b/src/bin/pg_basebackup/bbstreamer_lz4.c @@ -99,7 +99,7 @@ bbstreamer_lz4_compressor_new(bbstreamer *next, int compresslevel) compressed_bound = LZ4F_compressBound(streamer->base.bbs_buffer.maxlen, prefs); /* Enlarge buffer if it falls short of compression bound. */ - if (streamer->base.bbs_buffer.maxlen <= compressed_bound) + if (streamer->base.bbs_buffer.maxlen < compressed_bound) enlargeStringInfo(&streamer->base.bbs_buffer, compressed_bound); ctxError = LZ4F_createCompressionContext(&streamer->cctx, LZ4F_VERSION); @@ -170,7 +170,7 @@ bbstreamer_lz4_compressor_content(bbstreamer *streamer, */ out_bound = LZ4F_compressBound(len, &mystreamer->prefs); Assert(mystreamer->base.bbs_buffer.maxlen >= out_bound); - if (avail_out <= out_bound) + if (avail_out < out_bound) { bbstreamer_content(mystreamer->base.bbs_next, member, mystreamer->base.bbs_buffer.data, @@ -218,7 +218,7 @@ bbstreamer_lz4_compressor_finalize(bbstreamer *streamer) /* Find out the footer bound and update the output buffer. */ footer_bound = LZ4F_compressBound(0, &mystreamer->prefs); Assert(mystreamer->base.bbs_buffer.maxlen >= footer_bound); - if ((mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written) <= + if ((mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written) < footer_bound) { bbstreamer_content(mystreamer->base.bbs_next, NULL, From 54c72eb5e5e63f99f68c054900424724b0570b20 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 8 Mar 2022 09:47:34 -0800 Subject: [PATCH 104/772] plpython: add missing plpython.h include to plpy_plpymodule.h The include was missing before 9b7e24a2cb3, but starting with that commit the missing include causes cpluspluscheck to fail because the use of PyMODINIT_FUNC isn't incidentally protected by an ifdef anymore. Discussion: https://postgr.es/m/20220308045916.7baapelbgftoqeop@alap3.anarazel.de --- src/pl/plpython/plpy_plpymodule.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pl/plpython/plpy_plpymodule.h b/src/pl/plpython/plpy_plpymodule.h index ad6436aca7..1ca3823daf 100644 --- a/src/pl/plpython/plpy_plpymodule.h +++ b/src/pl/plpython/plpy_plpymodule.h @@ -5,6 +5,7 @@ #ifndef PLPY_PLPYMODULE_H #define PLPY_PLPYMODULE_H +#include "plpython.h" #include "utils/hsearch.h" /* A hash table mapping sqlstates to exceptions, for speedy lookup */ From a180c2b34de0989269fdb819bff241a249bf5380 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Tue, 8 Mar 2022 18:54:37 +0100 Subject: [PATCH 105/772] Stabilize test_decoding touching with sequences Some of the test_decoding regression tests are unstable due to modifying a sequence. The first increment of a sequence after a checkpoint is always logged (and thus decoded), which makes the output unpredictable. The runs are usually much shorter than a checkpoint internal, so these failures are rare, but we've seen a couple of them on animals that are either slow or are running with valgrind/clobber cache/... Fixed by skipping sequence decoding in most tests, with the exception of the test aimed at testing decoding of sequences. Reported-by: Amita Kapila Discussion: https://postgr.es/m/d045f3c2-6cfb-06d3-5540-e63c320df8bc@enterprisedb.com --- contrib/test_decoding/expected/ddl.out | 26 +++++++++---------- .../expected/decoding_in_xact.out | 2 +- contrib/test_decoding/expected/replorigin.out | 8 +++--- contrib/test_decoding/expected/rewrite.out | 2 +- contrib/test_decoding/expected/slot.out | 6 ++--- contrib/test_decoding/sql/ddl.sql | 26 +++++++++---------- .../test_decoding/sql/decoding_in_xact.sql | 2 +- contrib/test_decoding/sql/replorigin.sql | 8 +++--- contrib/test_decoding/sql/rewrite.sql | 2 +- contrib/test_decoding/sql/slot.sql | 6 ++--- 10 files changed, 44 insertions(+), 44 deletions(-) diff --git a/contrib/test_decoding/expected/ddl.out b/contrib/test_decoding/expected/ddl.out index 82898201ca..8bb52b559f 100644 --- a/contrib/test_decoding/expected/ddl.out +++ b/contrib/test_decoding/expected/ddl.out @@ -40,7 +40,7 @@ SELECT 'init' FROM pg_create_physical_replication_slot('repl'); init (1 row) -SELECT data FROM pg_logical_slot_get_changes('repl', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('repl', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); ERROR: cannot use physical replication slot for logical decoding SELECT pg_drop_replication_slot('repl'); pg_drop_replication_slot @@ -118,7 +118,7 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc ALTER TABLE replication_example ALTER COLUMN somenum TYPE int4 USING (somenum::int4); -- check that this doesn't produce any changes from the heap rewrite -SELECT count(data) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT count(data) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); count ------- 0 @@ -134,7 +134,7 @@ INSERT INTO replication_example(somedata, somenum, zaphod2) VALUES (6, 3, 1); INSERT INTO replication_example(somedata, somenum, zaphod1) VALUES (6, 4, 2); COMMIT; -- show changes -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); data ------------------------------------------------------------------------------------------------------------------------------------------ BEGIN @@ -154,7 +154,7 @@ INSERT INTO replication_example(id, somedata, somenum) SELECT i, i, i FROM gener ON CONFLICT (id) DO UPDATE SET somenum = excluded.somenum + 1; COMMIT; /* display results */ -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); data -------------------------------------------------------------------------------------------------------------------------------------------------- BEGIN @@ -211,7 +211,7 @@ INSERT INTO tr_pkey(data) VALUES(1); --show deletion with primary key DELETE FROM tr_pkey; /* display results */ -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); data ---------------------------------------------------------------------------- BEGIN @@ -264,7 +264,7 @@ DELETE FROM spoolme; DROP TABLE spoolme; COMMIT; SELECT data -FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') +FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0') WHERE data ~ 'UPDATE'; data ------------------------------------------------------------------------------------------------------------- @@ -278,7 +278,7 @@ INSERT INTO tr_etoomuch (id, data) SELECT g.i, -g.i FROM generate_series(8000, 12000) g(i) ON CONFLICT(id) DO UPDATE SET data = EXCLUDED.data; SELECT substring(data, 1, 29), count(*) -FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') WITH ORDINALITY +FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0') WITH ORDINALITY GROUP BY 1 ORDER BY min(ordinality); substring | count @@ -348,7 +348,7 @@ INSERT INTO tr_sub(path) VALUES ('2-top-1...--#3'); RELEASE SAVEPOINT subtop; INSERT INTO tr_sub(path) VALUES ('2-top-#1'); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); data ------------------------------------------------------------------------ BEGIN @@ -369,7 +369,7 @@ INSERT INTO tr_sub(path) VALUES ('3-top-2-2-#1'); ROLLBACK TO SAVEPOINT b; INSERT INTO tr_sub(path) VALUES ('3-top-2-#2'); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); data ----------------------------------------------------------------------- BEGIN @@ -398,7 +398,7 @@ BEGIN; SAVEPOINT a; INSERT INTO tr_sub(path) VALUES ('5-top-1-#1'); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); data --------------------------------------------------------------------- BEGIN @@ -419,7 +419,7 @@ ROLLBACK TO SAVEPOINT a; ALTER TABLE tr_sub_ddl ALTER COLUMN data TYPE bigint; INSERT INTO tr_sub_ddl VALUES(43); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); data -------------------------------------------------- BEGIN @@ -768,7 +768,7 @@ UPDATE toasttable WHERE id = 1; -- make sure we decode correctly even if the toast table is gone DROP TABLE toasttable; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); data ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- BEGIN @@ -780,7 +780,7 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc (6 rows) -- done, free logical replication slot -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); data ------ (0 rows) diff --git a/contrib/test_decoding/expected/decoding_in_xact.out b/contrib/test_decoding/expected/decoding_in_xact.out index 6e97b6e34b..0816c780fe 100644 --- a/contrib/test_decoding/expected/decoding_in_xact.out +++ b/contrib/test_decoding/expected/decoding_in_xact.out @@ -68,7 +68,7 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc COMMIT; INSERT INTO nobarf(data) VALUES('3'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); data ----------------------------------------------------------- BEGIN diff --git a/contrib/test_decoding/expected/replorigin.out b/contrib/test_decoding/expected/replorigin.out index fb96aa3172..7468c24f2b 100644 --- a/contrib/test_decoding/expected/replorigin.out +++ b/contrib/test_decoding/expected/replorigin.out @@ -110,7 +110,7 @@ SELECT pg_replication_origin_xact_setup('0/aabbccdd', '2013-01-01 00:00'); (1 row) INSERT INTO target_tbl(data) -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1', 'include-sequences', '0'); COMMIT; -- check replication progress for the session is correct SELECT pg_replication_origin_session_progress(false); @@ -154,14 +154,14 @@ SELECT pg_replication_origin_progress('regress_test_decoding: regression_slot', SELECT pg_replication_origin_session_reset(); ERROR: no replication origin is configured -- and magically the replayed xact will be filtered! -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1', 'include-sequences', '0'); data ------ (0 rows) --but new original changes still show up INSERT INTO origin_tbl(data) VALUES ('will be replicated'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1', 'include-sequences', '0'); data -------------------------------------------------------------------------------- BEGIN @@ -227,7 +227,7 @@ SELECT local_id, external_id, 1 | regress_test_decoding: regression_slot_no_lsn | f | t (1 row) -SELECT data FROM pg_logical_slot_get_changes('regression_slot_no_lsn', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot_no_lsn', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0', 'include-sequences', '0'); data ------------------------------------------------------------------------------------- BEGIN diff --git a/contrib/test_decoding/expected/rewrite.out b/contrib/test_decoding/expected/rewrite.out index 0b5eade41f..5d15b192ed 100644 --- a/contrib/test_decoding/expected/rewrite.out +++ b/contrib/test_decoding/expected/rewrite.out @@ -115,7 +115,7 @@ INSERT INTO replication_example(somedata, testcolumn1, testcolumn3) VALUES (7, 5 COMMIT; -- make old files go away CHECKPOINT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); data ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- BEGIN diff --git a/contrib/test_decoding/expected/slot.out b/contrib/test_decoding/expected/slot.out index 93d7b95d47..de59d544ae 100644 --- a/contrib/test_decoding/expected/slot.out +++ b/contrib/test_decoding/expected/slot.out @@ -107,7 +107,7 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'in COMMIT (7 rows) -SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); data --------------------------------------------------------------------------------------------------------- BEGIN @@ -132,7 +132,7 @@ SELECT :'wal_lsn' = :'end_lsn'; t (1 row) -SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); data --------------------------------------------------------------------------------------------------------- BEGIN @@ -140,7 +140,7 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'in COMMIT (3 rows) -SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); data ------ (0 rows) diff --git a/contrib/test_decoding/sql/ddl.sql b/contrib/test_decoding/sql/ddl.sql index f677460d34..ea406b1303 100644 --- a/contrib/test_decoding/sql/ddl.sql +++ b/contrib/test_decoding/sql/ddl.sql @@ -19,7 +19,7 @@ SELECT pg_drop_replication_slot('regression_slot'); -- check that we're detecting a streaming rep slot used for logical decoding SELECT 'init' FROM pg_create_physical_replication_slot('repl'); -SELECT data FROM pg_logical_slot_get_changes('repl', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('repl', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); SELECT pg_drop_replication_slot('repl'); @@ -68,7 +68,7 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc ALTER TABLE replication_example ALTER COLUMN somenum TYPE int4 USING (somenum::int4); -- check that this doesn't produce any changes from the heap rewrite -SELECT count(data) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT count(data) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); INSERT INTO replication_example(somedata, somenum) VALUES (5, 1); @@ -82,7 +82,7 @@ INSERT INTO replication_example(somedata, somenum, zaphod1) VALUES (6, 4, 2); COMMIT; -- show changes -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); -- ON CONFLICT DO UPDATE support BEGIN; @@ -91,7 +91,7 @@ INSERT INTO replication_example(id, somedata, somenum) SELECT i, i, i FROM gener COMMIT; /* display results */ -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); CREATE TABLE tr_unique(id2 serial unique NOT NULL, data int); INSERT INTO tr_unique(data) VALUES(10); @@ -104,7 +104,7 @@ INSERT INTO tr_pkey(data) VALUES(1); DELETE FROM tr_pkey; /* display results */ -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); /* * check that disk spooling works (also for logical messages) @@ -136,7 +136,7 @@ DROP TABLE spoolme; COMMIT; SELECT data -FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') +FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0') WHERE data ~ 'UPDATE'; -- check that a large, spooled, upsert works @@ -145,7 +145,7 @@ SELECT g.i, -g.i FROM generate_series(8000, 12000) g(i) ON CONFLICT(id) DO UPDATE SET data = EXCLUDED.data; SELECT substring(data, 1, 29), count(*) -FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') WITH ORDINALITY +FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0') WITH ORDINALITY GROUP BY 1 ORDER BY min(ordinality); @@ -202,7 +202,7 @@ RELEASE SAVEPOINT subtop; INSERT INTO tr_sub(path) VALUES ('2-top-#1'); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); -- make sure rollbacked subtransactions aren't decoded BEGIN; @@ -215,7 +215,7 @@ ROLLBACK TO SAVEPOINT b; INSERT INTO tr_sub(path) VALUES ('3-top-2-#2'); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); -- test whether a known, but not yet logged toplevel xact, followed by a -- subxact commit is handled correctly @@ -234,7 +234,7 @@ INSERT INTO tr_sub(path) VALUES ('5-top-1-#1'); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); -- check that DDL in aborted subtransactions handled correctly CREATE TABLE tr_sub_ddl(data int); @@ -247,7 +247,7 @@ ALTER TABLE tr_sub_ddl ALTER COLUMN data TYPE bigint; INSERT INTO tr_sub_ddl VALUES(43); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); /* @@ -410,10 +410,10 @@ WHERE id = 1; -- make sure we decode correctly even if the toast table is gone DROP TABLE toasttable; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); -- done, free logical replication slot -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); SELECT pg_drop_replication_slot('regression_slot'); diff --git a/contrib/test_decoding/sql/decoding_in_xact.sql b/contrib/test_decoding/sql/decoding_in_xact.sql index 33a9c4a6c7..b343b74566 100644 --- a/contrib/test_decoding/sql/decoding_in_xact.sql +++ b/contrib/test_decoding/sql/decoding_in_xact.sql @@ -36,6 +36,6 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc COMMIT; INSERT INTO nobarf(data) VALUES('3'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); SELECT 'stop' FROM pg_drop_replication_slot('regression_slot'); diff --git a/contrib/test_decoding/sql/replorigin.sql b/contrib/test_decoding/sql/replorigin.sql index f0f4dd4964..cd0a370208 100644 --- a/contrib/test_decoding/sql/replorigin.sql +++ b/contrib/test_decoding/sql/replorigin.sql @@ -60,7 +60,7 @@ BEGIN; -- setup transaction origin SELECT pg_replication_origin_xact_setup('0/aabbccdd', '2013-01-01 00:00'); INSERT INTO target_tbl(data) -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1', 'include-sequences', '0'); COMMIT; -- check replication progress for the session is correct @@ -79,11 +79,11 @@ SELECT pg_replication_origin_progress('regress_test_decoding: regression_slot', SELECT pg_replication_origin_session_reset(); -- and magically the replayed xact will be filtered! -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1', 'include-sequences', '0'); --but new original changes still show up INSERT INTO origin_tbl(data) VALUES ('will be replicated'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1', 'include-sequences', '0'); SELECT pg_drop_replication_slot('regression_slot'); SELECT pg_replication_origin_drop('regress_test_decoding: regression_slot'); @@ -114,7 +114,7 @@ SELECT local_id, external_id, remote_lsn <> '0/0' AS valid_remote_lsn, local_lsn <> '0/0' AS valid_local_lsn FROM pg_replication_origin_status; -SELECT data FROM pg_logical_slot_get_changes('regression_slot_no_lsn', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot_no_lsn', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0', 'include-sequences', '0'); -- Clean up SELECT pg_replication_origin_session_reset(); SELECT pg_drop_replication_slot('regression_slot_no_lsn'); diff --git a/contrib/test_decoding/sql/rewrite.sql b/contrib/test_decoding/sql/rewrite.sql index 945c39eb41..1715bd289d 100644 --- a/contrib/test_decoding/sql/rewrite.sql +++ b/contrib/test_decoding/sql/rewrite.sql @@ -90,7 +90,7 @@ COMMIT; -- make old files go away CHECKPOINT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); -- trigger repeated rewrites of a system catalog with a toast table, -- that previously was buggy: 20180914021046.oi7dm4ra3ot2g2kt@alap3.anarazel.de diff --git a/contrib/test_decoding/sql/slot.sql b/contrib/test_decoding/sql/slot.sql index 70ea1603e6..52a740c43d 100644 --- a/contrib/test_decoding/sql/slot.sql +++ b/contrib/test_decoding/sql/slot.sql @@ -51,7 +51,7 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot2', 'test_ INSERT INTO replication_example(somedata, text) VALUES (1, 3); SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); INSERT INTO replication_example(somedata, text) VALUES (1, 4); INSERT INTO replication_example(somedata, text) VALUES (1, 5); @@ -65,8 +65,8 @@ SELECT slot_name FROM pg_replication_slot_advance('regression_slot2', pg_current SELECT :'wal_lsn' = :'end_lsn'; -SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); DROP TABLE replication_example; From 43e7787dd3387a7455fc4d9c353addb79a50ebe5 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 8 Mar 2022 10:31:06 -0800 Subject: [PATCH 106/772] plpython: Restore alternative output for plpython_error test. In db23464715f I removed the alternative output for plpython_error. Wrongly so, because the output changed in Python 3.5, not Python 3. --- src/pl/plpython/expected/plpython_error.out | 2 +- src/pl/plpython/expected/plpython_error_5.out | 447 ++++++++++++++++++ 2 files changed, 448 insertions(+), 1 deletion(-) create mode 100644 src/pl/plpython/expected/plpython_error_5.out diff --git a/src/pl/plpython/expected/plpython_error.out b/src/pl/plpython/expected/plpython_error.out index 7fe864a1a5..9af7ea7292 100644 --- a/src/pl/plpython/expected/plpython_error.out +++ b/src/pl/plpython/expected/plpython_error.out @@ -243,7 +243,7 @@ $$ plpy.nonexistent $$ LANGUAGE plpython3u; SELECT toplevel_attribute_error(); -ERROR: AttributeError: module 'plpy' has no attribute 'nonexistent' +ERROR: AttributeError: 'module' object has no attribute 'nonexistent' CONTEXT: Traceback (most recent call last): PL/Python function "toplevel_attribute_error", line 2, in plpy.nonexistent diff --git a/src/pl/plpython/expected/plpython_error_5.out b/src/pl/plpython/expected/plpython_error_5.out new file mode 100644 index 0000000000..7fe864a1a5 --- /dev/null +++ b/src/pl/plpython/expected/plpython_error_5.out @@ -0,0 +1,447 @@ +-- test error handling, i forgot to restore Warn_restart in +-- the trigger handler once. the errors and subsequent core dump were +-- interesting. +/* Flat out Python syntax error + */ +CREATE FUNCTION python_syntax_error() RETURNS text + AS +'.syntaxerror' + LANGUAGE plpython3u; +ERROR: could not compile PL/Python function "python_syntax_error" +DETAIL: SyntaxError: invalid syntax (, line 2) +/* With check_function_bodies = false the function should get defined + * and the error reported when called + */ +SET check_function_bodies = false; +CREATE FUNCTION python_syntax_error() RETURNS text + AS +'.syntaxerror' + LANGUAGE plpython3u; +SELECT python_syntax_error(); +ERROR: could not compile PL/Python function "python_syntax_error" +DETAIL: SyntaxError: invalid syntax (, line 2) +/* Run the function twice to check if the hashtable entry gets cleaned up */ +SELECT python_syntax_error(); +ERROR: could not compile PL/Python function "python_syntax_error" +DETAIL: SyntaxError: invalid syntax (, line 2) +RESET check_function_bodies; +/* Flat out syntax error + */ +CREATE FUNCTION sql_syntax_error() RETURNS text + AS +'plpy.execute("syntax error")' + LANGUAGE plpython3u; +SELECT sql_syntax_error(); +ERROR: spiexceptions.SyntaxError: syntax error at or near "syntax" +LINE 1: syntax error + ^ +QUERY: syntax error +CONTEXT: Traceback (most recent call last): + PL/Python function "sql_syntax_error", line 1, in + plpy.execute("syntax error") +PL/Python function "sql_syntax_error" +/* check the handling of uncaught python exceptions + */ +CREATE FUNCTION exception_index_invalid(text) RETURNS text + AS +'return args[1]' + LANGUAGE plpython3u; +SELECT exception_index_invalid('test'); +ERROR: IndexError: list index out of range +CONTEXT: Traceback (most recent call last): + PL/Python function "exception_index_invalid", line 1, in + return args[1] +PL/Python function "exception_index_invalid" +/* check handling of nested exceptions + */ +CREATE FUNCTION exception_index_invalid_nested() RETURNS text + AS +'rv = plpy.execute("SELECT test5(''foo'')") +return rv[0]' + LANGUAGE plpython3u; +SELECT exception_index_invalid_nested(); +ERROR: spiexceptions.UndefinedFunction: function test5(unknown) does not exist +LINE 1: SELECT test5('foo') + ^ +HINT: No function matches the given name and argument types. You might need to add explicit type casts. +QUERY: SELECT test5('foo') +CONTEXT: Traceback (most recent call last): + PL/Python function "exception_index_invalid_nested", line 1, in + rv = plpy.execute("SELECT test5('foo')") +PL/Python function "exception_index_invalid_nested" +/* a typo + */ +CREATE FUNCTION invalid_type_uncaught(a text) RETURNS text + AS +'if "plan" not in SD: + q = "SELECT fname FROM users WHERE lname = $1" + SD["plan"] = plpy.prepare(q, [ "test" ]) +rv = plpy.execute(SD["plan"], [ a ]) +if len(rv): + return rv[0]["fname"] +return None +' + LANGUAGE plpython3u; +SELECT invalid_type_uncaught('rick'); +ERROR: spiexceptions.UndefinedObject: type "test" does not exist +CONTEXT: Traceback (most recent call last): + PL/Python function "invalid_type_uncaught", line 3, in + SD["plan"] = plpy.prepare(q, [ "test" ]) +PL/Python function "invalid_type_uncaught" +/* for what it's worth catch the exception generated by + * the typo, and return None + */ +CREATE FUNCTION invalid_type_caught(a text) RETURNS text + AS +'if "plan" not in SD: + q = "SELECT fname FROM users WHERE lname = $1" + try: + SD["plan"] = plpy.prepare(q, [ "test" ]) + except plpy.SPIError as ex: + plpy.notice(str(ex)) + return None +rv = plpy.execute(SD["plan"], [ a ]) +if len(rv): + return rv[0]["fname"] +return None +' + LANGUAGE plpython3u; +SELECT invalid_type_caught('rick'); +NOTICE: type "test" does not exist + invalid_type_caught +--------------------- + +(1 row) + +/* for what it's worth catch the exception generated by + * the typo, and reraise it as a plain error + */ +CREATE FUNCTION invalid_type_reraised(a text) RETURNS text + AS +'if "plan" not in SD: + q = "SELECT fname FROM users WHERE lname = $1" + try: + SD["plan"] = plpy.prepare(q, [ "test" ]) + except plpy.SPIError as ex: + plpy.error(str(ex)) +rv = plpy.execute(SD["plan"], [ a ]) +if len(rv): + return rv[0]["fname"] +return None +' + LANGUAGE plpython3u; +SELECT invalid_type_reraised('rick'); +ERROR: plpy.Error: type "test" does not exist +CONTEXT: Traceback (most recent call last): + PL/Python function "invalid_type_reraised", line 6, in + plpy.error(str(ex)) +PL/Python function "invalid_type_reraised" +/* no typo no messing about + */ +CREATE FUNCTION valid_type(a text) RETURNS text + AS +'if "plan" not in SD: + SD["plan"] = plpy.prepare("SELECT fname FROM users WHERE lname = $1", [ "text" ]) +rv = plpy.execute(SD["plan"], [ a ]) +if len(rv): + return rv[0]["fname"] +return None +' + LANGUAGE plpython3u; +SELECT valid_type('rick'); + valid_type +------------ + +(1 row) + +/* error in nested functions to get a traceback +*/ +CREATE FUNCTION nested_error() RETURNS text + AS +'def fun1(): + plpy.error("boom") + +def fun2(): + fun1() + +def fun3(): + fun2() + +fun3() +return "not reached" +' + LANGUAGE plpython3u; +SELECT nested_error(); +ERROR: plpy.Error: boom +CONTEXT: Traceback (most recent call last): + PL/Python function "nested_error", line 10, in + fun3() + PL/Python function "nested_error", line 8, in fun3 + fun2() + PL/Python function "nested_error", line 5, in fun2 + fun1() + PL/Python function "nested_error", line 2, in fun1 + plpy.error("boom") +PL/Python function "nested_error" +/* raising plpy.Error is just like calling plpy.error +*/ +CREATE FUNCTION nested_error_raise() RETURNS text + AS +'def fun1(): + raise plpy.Error("boom") + +def fun2(): + fun1() + +def fun3(): + fun2() + +fun3() +return "not reached" +' + LANGUAGE plpython3u; +SELECT nested_error_raise(); +ERROR: plpy.Error: boom +CONTEXT: Traceback (most recent call last): + PL/Python function "nested_error_raise", line 10, in + fun3() + PL/Python function "nested_error_raise", line 8, in fun3 + fun2() + PL/Python function "nested_error_raise", line 5, in fun2 + fun1() + PL/Python function "nested_error_raise", line 2, in fun1 + raise plpy.Error("boom") +PL/Python function "nested_error_raise" +/* using plpy.warning should not produce a traceback +*/ +CREATE FUNCTION nested_warning() RETURNS text + AS +'def fun1(): + plpy.warning("boom") + +def fun2(): + fun1() + +def fun3(): + fun2() + +fun3() +return "you''ve been warned" +' + LANGUAGE plpython3u; +SELECT nested_warning(); +WARNING: boom + nested_warning +-------------------- + you've been warned +(1 row) + +/* AttributeError at toplevel used to give segfaults with the traceback +*/ +CREATE FUNCTION toplevel_attribute_error() RETURNS void AS +$$ +plpy.nonexistent +$$ LANGUAGE plpython3u; +SELECT toplevel_attribute_error(); +ERROR: AttributeError: module 'plpy' has no attribute 'nonexistent' +CONTEXT: Traceback (most recent call last): + PL/Python function "toplevel_attribute_error", line 2, in + plpy.nonexistent +PL/Python function "toplevel_attribute_error" +/* Calling PL/Python functions from SQL and vice versa should not lose context. + */ +CREATE OR REPLACE FUNCTION python_traceback() RETURNS void AS $$ +def first(): + second() + +def second(): + third() + +def third(): + plpy.execute("select sql_error()") + +first() +$$ LANGUAGE plpython3u; +CREATE OR REPLACE FUNCTION sql_error() RETURNS void AS $$ +begin + select 1/0; +end +$$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION python_from_sql_error() RETURNS void AS $$ +begin + select python_traceback(); +end +$$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION sql_from_python_error() RETURNS void AS $$ +plpy.execute("select sql_error()") +$$ LANGUAGE plpython3u; +SELECT python_traceback(); +ERROR: spiexceptions.DivisionByZero: division by zero +CONTEXT: Traceback (most recent call last): + PL/Python function "python_traceback", line 11, in + first() + PL/Python function "python_traceback", line 3, in first + second() + PL/Python function "python_traceback", line 6, in second + third() + PL/Python function "python_traceback", line 9, in third + plpy.execute("select sql_error()") +PL/Python function "python_traceback" +SELECT sql_error(); +ERROR: division by zero +CONTEXT: SQL statement "select 1/0" +PL/pgSQL function sql_error() line 3 at SQL statement +SELECT python_from_sql_error(); +ERROR: spiexceptions.DivisionByZero: division by zero +CONTEXT: Traceback (most recent call last): + PL/Python function "python_traceback", line 11, in + first() + PL/Python function "python_traceback", line 3, in first + second() + PL/Python function "python_traceback", line 6, in second + third() + PL/Python function "python_traceback", line 9, in third + plpy.execute("select sql_error()") +PL/Python function "python_traceback" +SQL statement "select python_traceback()" +PL/pgSQL function python_from_sql_error() line 3 at SQL statement +SELECT sql_from_python_error(); +ERROR: spiexceptions.DivisionByZero: division by zero +CONTEXT: Traceback (most recent call last): + PL/Python function "sql_from_python_error", line 2, in + plpy.execute("select sql_error()") +PL/Python function "sql_from_python_error" +/* check catching specific types of exceptions + */ +CREATE TABLE specific ( + i integer PRIMARY KEY +); +CREATE FUNCTION specific_exception(i integer) RETURNS void AS +$$ +from plpy import spiexceptions +try: + plpy.execute("insert into specific values (%s)" % (i or "NULL")); +except spiexceptions.NotNullViolation as e: + plpy.notice("Violated the NOT NULL constraint, sqlstate %s" % e.sqlstate) +except spiexceptions.UniqueViolation as e: + plpy.notice("Violated the UNIQUE constraint, sqlstate %s" % e.sqlstate) +$$ LANGUAGE plpython3u; +SELECT specific_exception(2); + specific_exception +-------------------- + +(1 row) + +SELECT specific_exception(NULL); +NOTICE: Violated the NOT NULL constraint, sqlstate 23502 + specific_exception +-------------------- + +(1 row) + +SELECT specific_exception(2); +NOTICE: Violated the UNIQUE constraint, sqlstate 23505 + specific_exception +-------------------- + +(1 row) + +/* SPI errors in PL/Python functions should preserve the SQLSTATE value + */ +CREATE FUNCTION python_unique_violation() RETURNS void AS $$ +plpy.execute("insert into specific values (1)") +plpy.execute("insert into specific values (1)") +$$ LANGUAGE plpython3u; +CREATE FUNCTION catch_python_unique_violation() RETURNS text AS $$ +begin + begin + perform python_unique_violation(); + exception when unique_violation then + return 'ok'; + end; + return 'not reached'; +end; +$$ language plpgsql; +SELECT catch_python_unique_violation(); + catch_python_unique_violation +------------------------------- + ok +(1 row) + +/* manually starting subtransactions - a bad idea + */ +CREATE FUNCTION manual_subxact() RETURNS void AS $$ +plpy.execute("savepoint save") +plpy.execute("create table foo(x integer)") +plpy.execute("rollback to save") +$$ LANGUAGE plpython3u; +SELECT manual_subxact(); +ERROR: plpy.SPIError: SPI_execute failed: SPI_ERROR_TRANSACTION +CONTEXT: Traceback (most recent call last): + PL/Python function "manual_subxact", line 2, in + plpy.execute("savepoint save") +PL/Python function "manual_subxact" +/* same for prepared plans + */ +CREATE FUNCTION manual_subxact_prepared() RETURNS void AS $$ +save = plpy.prepare("savepoint save") +rollback = plpy.prepare("rollback to save") +plpy.execute(save) +plpy.execute("create table foo(x integer)") +plpy.execute(rollback) +$$ LANGUAGE plpython3u; +SELECT manual_subxact_prepared(); +ERROR: plpy.SPIError: SPI_execute_plan failed: SPI_ERROR_TRANSACTION +CONTEXT: Traceback (most recent call last): + PL/Python function "manual_subxact_prepared", line 4, in + plpy.execute(save) +PL/Python function "manual_subxact_prepared" +/* raising plpy.spiexception.* from python code should preserve sqlstate + */ +CREATE FUNCTION plpy_raise_spiexception() RETURNS void AS $$ +raise plpy.spiexceptions.DivisionByZero() +$$ LANGUAGE plpython3u; +DO $$ +BEGIN + SELECT plpy_raise_spiexception(); +EXCEPTION WHEN division_by_zero THEN + -- NOOP +END +$$ LANGUAGE plpgsql; +/* setting a custom sqlstate should be handled + */ +CREATE FUNCTION plpy_raise_spiexception_override() RETURNS void AS $$ +exc = plpy.spiexceptions.DivisionByZero() +exc.sqlstate = 'SILLY' +raise exc +$$ LANGUAGE plpython3u; +DO $$ +BEGIN + SELECT plpy_raise_spiexception_override(); +EXCEPTION WHEN SQLSTATE 'SILLY' THEN + -- NOOP +END +$$ LANGUAGE plpgsql; +/* test the context stack trace for nested execution levels + */ +CREATE FUNCTION notice_innerfunc() RETURNS int AS $$ +plpy.execute("DO LANGUAGE plpython3u $x$ plpy.notice('inside DO') $x$") +return 1 +$$ LANGUAGE plpython3u; +CREATE FUNCTION notice_outerfunc() RETURNS int AS $$ +plpy.execute("SELECT notice_innerfunc()") +return 1 +$$ LANGUAGE plpython3u; +\set SHOW_CONTEXT always +SELECT notice_outerfunc(); +NOTICE: inside DO +CONTEXT: PL/Python anonymous code block +SQL statement "DO LANGUAGE plpython3u $x$ plpy.notice('inside DO') $x$" +PL/Python function "notice_innerfunc" +SQL statement "SELECT notice_innerfunc()" +PL/Python function "notice_outerfunc" + notice_outerfunc +------------------ + 1 +(1 row) + From 7687ca996e558d95e68d2d0d70fed22a6317ba78 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 9 Mar 2022 10:43:25 +0900 Subject: [PATCH 107/772] doc: Improve references to term "FSM" in pageinspect and pgfreespacemap Author: Dong Wook Lee Reviewed-by: Laurenz Albe Discussion: https://postgr.es/m/CAAcBya+=F=HaHxJ7tGjAM1r=A=+bDbimpsex8Vqrb4GjqFDYsQ@mail.gmail.com --- doc/src/sgml/pageinspect.sgml | 12 +++++++----- doc/src/sgml/pgfreespacemap.sgml | 17 +++++++++-------- doc/src/sgml/storage.sgml | 9 +++++---- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/doc/src/sgml/pageinspect.sgml b/doc/src/sgml/pageinspect.sgml index 24b5e463ed..55513cf522 100644 --- a/doc/src/sgml/pageinspect.sgml +++ b/doc/src/sgml/pageinspect.sgml @@ -31,9 +31,11 @@ relation and returns a copy as a bytea value. This allows a single time-consistent copy of the block to be obtained. fork should be 'main' for - the main data fork, 'fsm' for the free space map, - 'vm' for the visibility map, or 'init' - for the initialization fork. + the main data fork, 'fsm' for the + free space map, + 'vm' for the + visibility map, or + 'init' for the initialization fork. @@ -136,7 +138,7 @@ test=# SELECT page_checksum(get_raw_page('pg_class', 0), 0); fsm_page_contents shows the internal node structure - of an FSM page. For example: + of an FSM page. For example: test=# SELECT fsm_page_contents(get_raw_page('pg_class', 'fsm', 0)); @@ -147,7 +149,7 @@ test=# SELECT fsm_page_contents(get_raw_page('pg_class', 'fsm', 0)); See src/backend/storage/freespace/README for more - information on the structure of an FSM page. + information on the structure of an FSM page. diff --git a/doc/src/sgml/pgfreespacemap.sgml b/doc/src/sgml/pgfreespacemap.sgml index 5025498249..1f7867d9b9 100644 --- a/doc/src/sgml/pgfreespacemap.sgml +++ b/doc/src/sgml/pgfreespacemap.sgml @@ -9,10 +9,10 @@ The pg_freespacemap module provides a means for examining the - free space map (FSM). It provides a function called - pg_freespace, or two overloaded functions, to be - precise. The functions show the value recorded in the free space map for - a given page, or for all pages in the relation. + free space map (FSM). + It provides a function called pg_freespace, or two + overloaded functions, to be precise. The functions show the value recorded in + the free space map for a given page, or for all pages in the relation. @@ -36,7 +36,7 @@ Returns the amount of free space on the page of the relation, specified - by blkno, according to the FSM. + by blkno, according to the FSM. @@ -50,7 +50,8 @@ Displays the amount of free space on each page of the relation, - according to the FSM. A set of (blkno bigint, avail int2) + according to the FSM. A set of + (blkno bigint, avail int2) tuples is returned, one tuple for each page in the relation. @@ -112,8 +113,8 @@ postgres=# SELECT * FROM pg_freespace('foo', 7); Original version by Mark Kirkwood markir@paradise.net.nz. - Rewritten in version 8.4 to suit new FSM implementation by Heikki - Linnakangas heikki@enterprisedb.com + Rewritten in version 8.4 to suit new FSM implementation + by Heikki Linnakangas heikki@enterprisedb.com diff --git a/doc/src/sgml/storage.sgml b/doc/src/sgml/storage.sgml index 7136bbe7a3..f4b9f66589 100644 --- a/doc/src/sgml/storage.sgml +++ b/doc/src/sgml/storage.sgml @@ -603,10 +603,11 @@ tuple would otherwise be too big. Each heap and index relation, except for hash indexes, has a Free Space Map -(FSM) to keep track of available space in the relation. It's stored -alongside the main relation data in a separate relation fork, named after the -filenode number of the relation, plus a _fsm suffix. For example, -if the filenode of a relation is 12345, the FSM is stored in a file called +(FSM) to keep track of available space in the relation. +It's stored alongside the main relation data in a separate relation fork, +named after the filenode number of the relation, plus a _fsm +suffix. For example, if the filenode of a relation is 12345, the +FSM is stored in a file called 12345_fsm, in the same directory as the main relation file. From e3df32bbc38bc4a20092ea18b482b81119fa72dd Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 9 Mar 2022 14:59:08 +0900 Subject: [PATCH 108/772] doc: Add ALTER/DROP ROUTINE to the event trigger matrix ALTER ROUTINE triggers the events ddl_command_start and ddl_command_end, and DROP ROUTINE triggers sql_drop, ddl_command_start and ddl_command_end, but this was not mention on the matrix table. Reported-by: Leslie Lemaire Discussion: https://postgr.es/m/164647533363.646.5802968483136493025@wrigleys.postgresql.org Backpatch-through: 11 --- doc/src/sgml/event-trigger.sgml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/doc/src/sgml/event-trigger.sgml b/doc/src/sgml/event-trigger.sgml index 60366a950e..9c66f97b0f 100644 --- a/doc/src/sgml/event-trigger.sgml +++ b/doc/src/sgml/event-trigger.sgml @@ -293,6 +293,14 @@ - + + ALTER ROUTINE + X + X + - + - + + ALTER SCHEMA X @@ -853,6 +861,14 @@ - + + DROP ROUTINE + X + X + X + - + + DROP RULE X From e80a7a1f3d65e34fff73166d42abe0e2d5f91add Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 9 Mar 2022 10:39:17 +0100 Subject: [PATCH 109/772] unaccent: Remove Python 2 support from Python script This is a maintainer-only script, but since we're removing Python 2 support elsewhere, we might as well clean this one up as well. --- contrib/unaccent/generate_unaccent_rules.py | 29 ++++----------------- 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/contrib/unaccent/generate_unaccent_rules.py b/contrib/unaccent/generate_unaccent_rules.py index a952de510c..bc667eaf15 100644 --- a/contrib/unaccent/generate_unaccent_rules.py +++ b/contrib/unaccent/generate_unaccent_rules.py @@ -26,32 +26,13 @@ # [1] https://www.unicode.org/Public/${UNICODE_VERSION}/ucd/UnicodeData.txt # [2] https://raw.githubusercontent.com/unicode-org/cldr/${TAG}/common/transforms/Latin-ASCII.xml -# BEGIN: Python 2/3 compatibility - remove when Python 2 compatibility dropped -# The approach is to be Python3 compatible with Python2 "backports". -from __future__ import print_function -from __future__ import unicode_literals -# END: Python 2/3 compatibility - remove when Python 2 compatibility dropped - import argparse import codecs import re import sys import xml.etree.ElementTree as ET -# BEGIN: Python 2/3 compatibility - remove when Python 2 compatibility dropped -if sys.version_info[0] <= 2: - # Encode stdout as UTF-8, so we can just print to it - sys.stdout = codecs.getwriter('utf8')(sys.stdout) - - # Map Python 2's chr to unichr - chr = unichr - - # Python 2 and 3 compatible bytes call - def bytes(source, encoding='ascii', errors='strict'): - return source.encode(encoding=encoding, errors=errors) -else: -# END: Python 2/3 compatibility - remove when Python 2 compatibility dropped - sys.stdout = codecs.getwriter('utf8')(sys.stdout.buffer) +sys.stdout = codecs.getwriter('utf8')(sys.stdout.buffer) # The ranges of Unicode characters that we consider to be "plain letters". # For now we are being conservative by including only Latin and Greek. This @@ -213,12 +194,12 @@ def special_cases(): charactersSet = set() # Cyrillic - charactersSet.add((0x0401, u"\u0415")) # CYRILLIC CAPITAL LETTER IO - charactersSet.add((0x0451, u"\u0435")) # CYRILLIC SMALL LETTER IO + charactersSet.add((0x0401, "\u0415")) # CYRILLIC CAPITAL LETTER IO + charactersSet.add((0x0451, "\u0435")) # CYRILLIC SMALL LETTER IO # Symbols of "Letterlike Symbols" Unicode Block (U+2100 to U+214F) - charactersSet.add((0x2103, u"\xb0C")) # DEGREE CELSIUS - charactersSet.add((0x2109, u"\xb0F")) # DEGREE FAHRENHEIT + charactersSet.add((0x2103, "\xb0C")) # DEGREE CELSIUS + charactersSet.add((0x2109, "\xb0F")) # DEGREE FAHRENHEIT charactersSet.add((0x2117, "(P)")) # SOUND RECORDING COPYRIGHT return charactersSet From ddf590b8115212ea061f9428f20f4c36d8e25e62 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 9 Mar 2022 10:51:41 +0100 Subject: [PATCH 110/772] pycodestyle (PEP 8) cleanup in Python scripts These are mainly whitespace changes. I didn't fix "E501 line too long", which would require more significant surgery. --- contrib/unaccent/generate_unaccent_rules.py | 54 +++++++++++++-------- src/test/locale/sort-test.py | 10 ++-- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/contrib/unaccent/generate_unaccent_rules.py b/contrib/unaccent/generate_unaccent_rules.py index bc667eaf15..c405e231b3 100644 --- a/contrib/unaccent/generate_unaccent_rules.py +++ b/contrib/unaccent/generate_unaccent_rules.py @@ -38,10 +38,10 @@ # For now we are being conservative by including only Latin and Greek. This # could be extended in future based on feedback from people with relevant # language knowledge. -PLAIN_LETTER_RANGES = ((ord('a'), ord('z')), # Latin lower case - (ord('A'), ord('Z')), # Latin upper case - (0x03b1, 0x03c9), # GREEK SMALL LETTER ALPHA, GREEK SMALL LETTER OMEGA - (0x0391, 0x03a9)) # GREEK CAPITAL LETTER ALPHA, GREEK CAPITAL LETTER OMEGA +PLAIN_LETTER_RANGES = ((ord('a'), ord('z')), # Latin lower case + (ord('A'), ord('Z')), # Latin upper case + (0x03b1, 0x03c9), # GREEK SMALL LETTER ALPHA, GREEK SMALL LETTER OMEGA + (0x0391, 0x03a9)) # GREEK CAPITAL LETTER ALPHA, GREEK CAPITAL LETTER OMEGA # Combining marks follow a "base" character, and result in a composite # character. Example: "U&'A\0300'"produces "À".There are three types of @@ -51,9 +51,10 @@ # https://en.wikipedia.org/wiki/Combining_character # https://www.unicode.org/charts/PDF/U0300.pdf # https://www.unicode.org/charts/PDF/U20D0.pdf -COMBINING_MARK_RANGES = ((0x0300, 0x0362), # Mn: Accents, IPA - (0x20dd, 0x20E0), # Me: Symbols - (0x20e2, 0x20e4),) # Me: Screen, keycap, triangle +COMBINING_MARK_RANGES = ((0x0300, 0x0362), # Mn: Accents, IPA + (0x20dd, 0x20E0), # Me: Symbols + (0x20e2, 0x20e4),) # Me: Screen, keycap, triangle + def print_record(codepoint, letter): if letter: @@ -63,12 +64,14 @@ def print_record(codepoint, letter): print(output) + class Codepoint: def __init__(self, id, general_category, combining_ids): self.id = id self.general_category = general_category self.combining_ids = combining_ids + def is_mark_to_remove(codepoint): """Return true if this is a combining mark to remove.""" if not is_mark(codepoint): @@ -79,17 +82,20 @@ def is_mark_to_remove(codepoint): return True return False + def is_plain_letter(codepoint): """Return true if codepoint represents a "plain letter".""" for begin, end in PLAIN_LETTER_RANGES: - if codepoint.id >= begin and codepoint.id <= end: - return True + if codepoint.id >= begin and codepoint.id <= end: + return True return False + def is_mark(codepoint): """Returns true for diacritical marks (combining codepoints).""" return codepoint.general_category in ("Mn", "Me", "Mc") + def is_letter_with_marks(codepoint, table): """Returns true for letters combined with one or more marks.""" # See https://www.unicode.org/reports/tr44/tr44-14.html#General_Category_Values @@ -105,16 +111,18 @@ def is_letter_with_marks(codepoint, table): # Check if the base letter of this letter has marks. codepoint_base = codepoint.combining_ids[0] - if (is_plain_letter(table[codepoint_base]) is False and \ - is_letter_with_marks(table[codepoint_base], table) is False): + if is_plain_letter(table[codepoint_base]) is False and \ + is_letter_with_marks(table[codepoint_base], table) is False: return False return True + def is_letter(codepoint, table): """Return true for letter with or without diacritical marks.""" return is_plain_letter(codepoint) or is_letter_with_marks(codepoint, table) + def get_plain_letter(codepoint, table): """Return the base codepoint without marks. If this codepoint has more than one combining character, do a recursive lookup on the table to @@ -133,15 +141,18 @@ def get_plain_letter(codepoint, table): # Should not come here assert(False) + def is_ligature(codepoint, table): """Return true for letters combined with letters.""" return all(is_letter(table[i], table) for i in codepoint.combining_ids) + def get_plain_letters(codepoint, table): """Return a list of plain letters from a ligature.""" assert(is_ligature(codepoint, table)) return [get_plain_letter(table[id], table) for id in codepoint.combining_ids] + def parse_cldr_latin_ascii_transliterator(latinAsciiFilePath): """Parse the XML file and return a set of tuples (src, trg), where "src" is the original character and "trg" the substitute.""" @@ -189,21 +200,23 @@ def parse_cldr_latin_ascii_transliterator(latinAsciiFilePath): return charactersSet + def special_cases(): """Returns the special cases which are not handled by other methods""" charactersSet = set() # Cyrillic - charactersSet.add((0x0401, "\u0415")) # CYRILLIC CAPITAL LETTER IO - charactersSet.add((0x0451, "\u0435")) # CYRILLIC SMALL LETTER IO + charactersSet.add((0x0401, "\u0415")) # CYRILLIC CAPITAL LETTER IO + charactersSet.add((0x0451, "\u0435")) # CYRILLIC SMALL LETTER IO # Symbols of "Letterlike Symbols" Unicode Block (U+2100 to U+214F) - charactersSet.add((0x2103, "\xb0C")) # DEGREE CELSIUS - charactersSet.add((0x2109, "\xb0F")) # DEGREE FAHRENHEIT - charactersSet.add((0x2117, "(P)")) # SOUND RECORDING COPYRIGHT + charactersSet.add((0x2103, "\xb0C")) # DEGREE CELSIUS + charactersSet.add((0x2109, "\xb0F")) # DEGREE FAHRENHEIT + charactersSet.add((0x2117, "(P)")) # SOUND RECORDING COPYRIGHT return charactersSet + def main(args): # https://www.unicode.org/reports/tr44/tr44-14.html#Character_Decomposition_Mappings decomposition_type_pattern = re.compile(" *<[^>]*> *") @@ -238,12 +251,12 @@ def main(args): len(codepoint.combining_ids) > 1: if is_letter_with_marks(codepoint, table): charactersSet.add((codepoint.id, - chr(get_plain_letter(codepoint, table).id))) + chr(get_plain_letter(codepoint, table).id))) elif args.noLigaturesExpansion is False and is_ligature(codepoint, table): charactersSet.add((codepoint.id, - "".join(chr(combining_codepoint.id) - for combining_codepoint \ - in get_plain_letters(codepoint, table)))) + "".join(chr(combining_codepoint.id) + for combining_codepoint + in get_plain_letters(codepoint, table)))) elif is_mark_to_remove(codepoint): charactersSet.add((codepoint.id, None)) @@ -258,6 +271,7 @@ def main(args): for characterPair in charactersList: print_record(characterPair[0], characterPair[1]) + if __name__ == "__main__": parser = argparse.ArgumentParser(description='This script builds unaccent.rules on standard output when given the contents of UnicodeData.txt and Latin-ASCII.xml given as arguments.') parser.add_argument("--unicode-data-file", help="Path to formatted text file corresponding to UnicodeData.txt.", type=str, required=True, dest='unicodeDataFilePath') diff --git a/src/test/locale/sort-test.py b/src/test/locale/sort-test.py index 53019038ab..21d6e78eb5 100755 --- a/src/test/locale/sort-test.py +++ b/src/test/locale/sort-test.py @@ -1,18 +1,20 @@ #! /usr/bin/env python -import sys, string, locale +import locale +import sys + locale.setlocale(locale.LC_ALL, "") if len(sys.argv) != 2: - sys.stderr.write("Usage: sort.py filename\n") - sys.exit(1) + sys.stderr.write("Usage: sort.py filename\n") + sys.exit(1) infile = open(sys.argv[1], 'r') list = infile.readlines() infile.close() for i in range(0, len(list)): - list[i] = list[i][:-1] # chop! + list[i] = list[i][:-1] # chop! list.sort(key=locale.strxfrm) print('\n'.join(list)) From df4c3cbd8f4f619785c735669150e3a1df9cf7ca Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 9 Mar 2022 10:56:44 +0100 Subject: [PATCH 111/772] Add parse_analyze_withcb() This extracts code from pg_analyze_and_rewrite_withcb() into a separate function that mirrors the existing parse_analyze_fixedparams() and parse_analyze_varparams(). Reviewed-by: Nathan Bossart Discussion: https://www.postgresql.org/message-id/flat/c67ce276-52b4-0239-dc0e-39875bf81840@enterprisedb.com --- src/backend/parser/analyze.c | 38 ++++++++++++++++++++++++++++++++++++ src/backend/tcop/postgres.c | 22 ++------------------- src/include/parser/analyze.h | 5 +++++ 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 53c11b3a15..61026753a3 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -181,6 +181,44 @@ parse_analyze_varparams(RawStmt *parseTree, const char *sourceText, return query; } +/* + * parse_analyze_withcb + * + * This variant is used when the caller supplies their own parser callback to + * resolve parameters and possibly other things. + */ +Query * +parse_analyze_withcb(RawStmt *parseTree, const char *sourceText, + ParserSetupHook parserSetup, + void *parserSetupArg, + QueryEnvironment *queryEnv) +{ + ParseState *pstate = make_parsestate(NULL); + Query *query; + JumbleState *jstate = NULL; + + Assert(sourceText != NULL); /* required as of 8.4 */ + + pstate->p_sourcetext = sourceText; + pstate->p_queryEnv = queryEnv; + (*parserSetup) (pstate, parserSetupArg); + + query = transformTopLevelStmt(pstate, parseTree); + + if (IsQueryIdEnabled()) + jstate = JumbleQuery(query, sourceText); + + if (post_parse_analyze_hook) + (*post_parse_analyze_hook) (pstate, query, jstate); + + free_parsestate(pstate); + + pgstat_report_query_id(query->queryId, false); + + return query; +} + + /* * parse_sub_analyze * Entry point for recursively analyzing a sub-statement. diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index d7e39aed64..ba2fcfeb4a 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -736,12 +736,8 @@ pg_analyze_and_rewrite_withcb(RawStmt *parsetree, void *parserSetupArg, QueryEnvironment *queryEnv) { - ParseState *pstate; Query *query; List *querytree_list; - JumbleState *jstate = NULL; - - Assert(query_string != NULL); /* required as of 8.4 */ TRACE_POSTGRESQL_QUERY_REWRITE_START(query_string); @@ -751,22 +747,8 @@ pg_analyze_and_rewrite_withcb(RawStmt *parsetree, if (log_parser_stats) ResetUsage(); - pstate = make_parsestate(NULL); - pstate->p_sourcetext = query_string; - pstate->p_queryEnv = queryEnv; - (*parserSetup) (pstate, parserSetupArg); - - query = transformTopLevelStmt(pstate, parsetree); - - if (IsQueryIdEnabled()) - jstate = JumbleQuery(query, query_string); - - if (post_parse_analyze_hook) - (*post_parse_analyze_hook) (pstate, query, jstate); - - free_parsestate(pstate); - - pgstat_report_query_id(query->queryId, false); + query = parse_analyze_withcb(parsetree, query_string, parserSetup, parserSetupArg, + queryEnv); if (log_parser_stats) ShowUsage("PARSE ANALYSIS STATISTICS"); diff --git a/src/include/parser/analyze.h b/src/include/parser/analyze.h index 06b237c39c..b30cbd26bf 100644 --- a/src/include/parser/analyze.h +++ b/src/include/parser/analyze.h @@ -14,6 +14,7 @@ #ifndef ANALYZE_H #define ANALYZE_H +#include "nodes/params.h" #include "parser/parse_node.h" #include "utils/queryjumble.h" @@ -28,6 +29,10 @@ extern Query *parse_analyze_fixedparams(RawStmt *parseTree, const char *sourceTe const Oid *paramTypes, int numParams, QueryEnvironment *queryEnv); extern Query *parse_analyze_varparams(RawStmt *parseTree, const char *sourceText, Oid **paramTypes, int *numParams, QueryEnvironment *queryEnv); +extern Query *parse_analyze_withcb(RawStmt *parseTree, const char *sourceText, + ParserSetupHook parserSetup, + void *parserSetupArg, + QueryEnvironment *queryEnv); extern Query *parse_sub_analyze(Node *parseTree, ParseState *parentParseState, CommonTableExpr *parentCTE, From 2cfde3c2371860aa6c05f84c3fbec9c400ab6b1a Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 9 Mar 2022 12:12:20 +0100 Subject: [PATCH 112/772] Fix double declaration for check_ok() in pg_upgrade.h Author: Pavel Borisov --- src/bin/pg_upgrade/pg_upgrade.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h index ca86c11292..b9b3ac81b2 100644 --- a/src/bin/pg_upgrade/pg_upgrade.h +++ b/src/bin/pg_upgrade/pg_upgrade.h @@ -429,7 +429,6 @@ void pg_fatal(const char *fmt,...) pg_attribute_printf(1, 2) pg_attribute_noret void end_progress_output(void); void prep_status(const char *fmt,...) pg_attribute_printf(1, 2); void prep_status_progress(const char *fmt,...) pg_attribute_printf(1, 2); -void check_ok(void); unsigned int str2uint(const char *str); From ee56c3b21629277cf7f2e6398e7dd4e40c11df3c Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 9 Mar 2022 09:31:02 -0800 Subject: [PATCH 113/772] ldap tests: Don't run on unsupported operating systems. The tests currently fail on unsupported operating systems, rather than getting skipped. The ony reason this doesn't cause problems is that the tests aren't run by default. Discussion: https://postgr.es/m/721828a7-3043-6803-a85b-da63538db3cc@enterprisedb.com --- src/test/ldap/t/001_auth.pl | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/test/ldap/t/001_auth.pl b/src/test/ldap/t/001_auth.pl index 094270cb5d..2c7ce2a8aa 100644 --- a/src/test/ldap/t/001_auth.pl +++ b/src/test/ldap/t/001_auth.pl @@ -6,17 +6,18 @@ use PostgreSQL::Test::Utils; use PostgreSQL::Test::Cluster; use Test::More; +use Config; -if ($ENV{with_ldap} ne 'yes') -{ - plan skip_all => 'LDAP not supported by this build'; -} my ($slapd, $ldap_bin_dir, $ldap_schema_dir); $ldap_bin_dir = undef; # usually in PATH -if ($^O eq 'darwin' && -d '/usr/local/opt/openldap') +if ($ENV{with_ldap} ne 'yes') +{ + plan skip_all => 'LDAP not supported by this build'; +} +elsif ($^O eq 'darwin' && -d '/usr/local/opt/openldap') { # typical paths for Homebrew $slapd = '/usr/local/opt/openldap/libexec/slapd'; @@ -39,6 +40,10 @@ $slapd = '/usr/local/libexec/slapd'; $ldap_schema_dir = '/usr/local/etc/openldap/schema'; } +else +{ + plan skip_all => "ldap tests not supported on $^O or dependencies not installed"; +} # make your own edits here #$slapd = ''; From 45fb0de4dc65f43a037fe7c90f360ae0596d9328 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 9 Mar 2022 09:46:21 -0800 Subject: [PATCH 114/772] ldap tests: Add paths for openbsd. Discussion: https://postgr.es/m/721828a7-3043-6803-a85b-da63538db3cc@enterprisedb.com --- src/test/ldap/t/001_auth.pl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/ldap/t/001_auth.pl b/src/test/ldap/t/001_auth.pl index 2c7ce2a8aa..9f15248935 100644 --- a/src/test/ldap/t/001_auth.pl +++ b/src/test/ldap/t/001_auth.pl @@ -40,6 +40,11 @@ $slapd = '/usr/local/libexec/slapd'; $ldap_schema_dir = '/usr/local/etc/openldap/schema'; } +elsif ($^O eq 'openbsd') +{ + $slapd = '/usr/local/libexec/slapd'; + $ldap_schema_dir = '/usr/local/share/examples/openldap/schema'; +} else { plan skip_all => "ldap tests not supported on $^O or dependencies not installed"; From adb5c28adc59415b54c087507dd84c71368c289c Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 10 Mar 2022 14:09:21 +0100 Subject: [PATCH 115/772] Re-update Unicode data to CLDR 39 Apparently, the previous update (2e0e0666790e48cec716d4947f89d067ef53490c) must have used a stale input file and missed a few additions that were added shortly before the CLDR release. Update this now so that the next update really only changes things new in that version. --- contrib/unaccent/unaccent.rules | 37 +++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/contrib/unaccent/unaccent.rules b/contrib/unaccent/unaccent.rules index 1b5eb1b16c..3030166ed6 100644 --- a/contrib/unaccent/unaccent.rules +++ b/contrib/unaccent/unaccent.rules @@ -1611,3 +1611,40 @@ 、 , ← <- → -> +🄀 0. +🄁 0, +🄂 1, +🄃 2, +🄄 3, +🄅 4, +🄆 5, +🄇 6, +🄈 7, +🄉 8, +🄊 9, +🄐 (A) +🄑 (B) +🄒 (C) +🄓 (D) +🄔 (E) +🄕 (F) +🄖 (G) +🄗 (H) +🄘 (I) +🄙 (J) +🄚 (K) +🄛 (L) +🄜 (M) +🄝 (N) +🄞 (O) +🄟 (P) +🄠 (Q) +🄡 (R) +🄢 (S) +🄣 (T) +🄤 (U) +🄥 (V) +🄦 (W) +🄧 (X) +🄨 (Y) +🄩 (Z) From 352d297dc74feb0bf0dcb255cc0dfaaed2b96c1e Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 10 Mar 2022 12:54:54 -0800 Subject: [PATCH 116/772] dshash: Add sequential scan support. Add ability to scan all entries sequentially to dshash. The interface is similar but a bit different both from that of dynahash and simple dshash search functions. The most significant differences is that dshash's interfac always needs a call to dshash_seq_term when scan ends. Another is locking. Dshash holds partition lock when returning an entry, dshash_seq_next() also holds lock when returning an entry but callers shouldn't release it, since the lock is essential to continue a scan. The seqscan interface allows entry deletion while a scan is in progress using dshash_delete_current(). Reviewed-By: Andres Freund Author: Kyotaro Horiguchi --- src/backend/lib/dshash.c | 163 ++++++++++++++++++++++++++++++- src/include/lib/dshash.h | 23 +++++ src/tools/pgindent/typedefs.list | 1 + 3 files changed, 186 insertions(+), 1 deletion(-) diff --git a/src/backend/lib/dshash.c b/src/backend/lib/dshash.c index decedb2605..84a9db47c7 100644 --- a/src/backend/lib/dshash.c +++ b/src/backend/lib/dshash.c @@ -127,6 +127,10 @@ struct dshash_table #define NUM_SPLITS(size_log2) \ (size_log2 - DSHASH_NUM_PARTITIONS_LOG2) +/* How many buckets are there in a given size? */ +#define NUM_BUCKETS(size_log2) \ + (((size_t) 1) << (size_log2)) + /* How many buckets are there in each partition at a given size? */ #define BUCKETS_PER_PARTITION(size_log2) \ (((size_t) 1) << NUM_SPLITS(size_log2)) @@ -153,6 +157,10 @@ struct dshash_table #define BUCKET_INDEX_FOR_PARTITION(partition, size_log2) \ ((partition) << NUM_SPLITS(size_log2)) +/* Choose partition based on bucket index. */ +#define PARTITION_FOR_BUCKET_INDEX(bucket_idx, size_log2) \ + ((bucket_idx) >> NUM_SPLITS(size_log2)) + /* The head of the active bucket for a given hash value (lvalue). */ #define BUCKET_FOR_HASH(hash_table, hash) \ (hash_table->buckets[ \ @@ -324,7 +332,7 @@ dshash_destroy(dshash_table *hash_table) ensure_valid_bucket_pointers(hash_table); /* Free all the entries. */ - size = ((size_t) 1) << hash_table->size_log2; + size = NUM_BUCKETS(hash_table->size_log2); for (i = 0; i < size; ++i) { dsa_pointer item_pointer = hash_table->buckets[i]; @@ -592,6 +600,159 @@ dshash_memhash(const void *v, size_t size, void *arg) return tag_hash(v, size); } +/* + * dshash_seq_init/_next/_term + * Sequentially scan through dshash table and return all the + * elements one by one, return NULL when no more. + * + * dshash_seq_term should always be called when a scan finished. + * The caller may delete returned elements midst of a scan by using + * dshash_delete_current(). exclusive must be true to delete elements. + */ +void +dshash_seq_init(dshash_seq_status *status, dshash_table *hash_table, + bool exclusive) +{ + status->hash_table = hash_table; + status->curbucket = 0; + status->nbuckets = 0; + status->curitem = NULL; + status->pnextitem = InvalidDsaPointer; + status->curpartition = -1; + status->exclusive = exclusive; +} + +/* + * Returns the next element. + * + * Returned elements are locked and the caller must not explicitly release + * it. It is released at the next call to dshash_next(). + */ +void * +dshash_seq_next(dshash_seq_status *status) +{ + dsa_pointer next_item_pointer; + + if (status->curitem == NULL) + { + int partition; + + Assert(status->curbucket == 0); + Assert(!status->hash_table->find_locked); + + /* first shot. grab the first item. */ + partition = + PARTITION_FOR_BUCKET_INDEX(status->curbucket, + status->hash_table->size_log2); + LWLockAcquire(PARTITION_LOCK(status->hash_table, partition), + status->exclusive ? LW_EXCLUSIVE : LW_SHARED); + status->curpartition = partition; + + /* resize doesn't happen from now until seq scan ends */ + status->nbuckets = + NUM_BUCKETS(status->hash_table->control->size_log2); + ensure_valid_bucket_pointers(status->hash_table); + + next_item_pointer = status->hash_table->buckets[status->curbucket]; + } + else + next_item_pointer = status->pnextitem; + + Assert(LWLockHeldByMeInMode(PARTITION_LOCK(status->hash_table, + status->curpartition), + status->exclusive ? LW_EXCLUSIVE : LW_SHARED)); + + /* Move to the next bucket if we finished the current bucket */ + while (!DsaPointerIsValid(next_item_pointer)) + { + int next_partition; + + if (++status->curbucket >= status->nbuckets) + { + /* all buckets have been scanned. finish. */ + return NULL; + } + + /* Check if move to the next partition */ + next_partition = + PARTITION_FOR_BUCKET_INDEX(status->curbucket, + status->hash_table->size_log2); + + if (status->curpartition != next_partition) + { + /* + * Move to the next partition. Lock the next partition then + * release the current, not in the reverse order to avoid + * concurrent resizing. Avoid dead lock by taking lock in the + * same order with resize(). + */ + LWLockAcquire(PARTITION_LOCK(status->hash_table, + next_partition), + status->exclusive ? LW_EXCLUSIVE : LW_SHARED); + LWLockRelease(PARTITION_LOCK(status->hash_table, + status->curpartition)); + status->curpartition = next_partition; + } + + next_item_pointer = status->hash_table->buckets[status->curbucket]; + } + + status->curitem = + dsa_get_address(status->hash_table->area, next_item_pointer); + status->hash_table->find_locked = true; + status->hash_table->find_exclusively_locked = status->exclusive; + + /* + * The caller may delete the item. Store the next item in case of + * deletion. + */ + status->pnextitem = status->curitem->next; + + return ENTRY_FROM_ITEM(status->curitem); +} + +/* + * Terminates the seqscan and release all locks. + * + * Should be always called when finishing or exiting a seqscan. + */ +void +dshash_seq_term(dshash_seq_status *status) +{ + status->hash_table->find_locked = false; + status->hash_table->find_exclusively_locked = false; + + if (status->curpartition >= 0) + LWLockRelease(PARTITION_LOCK(status->hash_table, status->curpartition)); +} + +/* Remove the current entry while a seq scan. */ +void +dshash_delete_current(dshash_seq_status *status) +{ + dshash_table *hash_table = status->hash_table; + dshash_table_item *item = status->curitem; + size_t partition PG_USED_FOR_ASSERTS_ONLY; + + partition = PARTITION_FOR_HASH(item->hash); + + Assert(status->exclusive); + Assert(hash_table->control->magic == DSHASH_MAGIC); + Assert(hash_table->find_locked); + Assert(hash_table->find_exclusively_locked); + Assert(LWLockHeldByMeInMode(PARTITION_LOCK(hash_table, partition), + LW_EXCLUSIVE)); + + delete_item(hash_table, item); +} + +/* Get the current entry while a seq scan. */ +void * +dshash_get_current(dshash_seq_status *status) +{ + return ENTRY_FROM_ITEM(status->curitem); +} + /* * Print debugging information about the internal state of the hash table to * stderr. The caller must hold no partition locks. diff --git a/src/include/lib/dshash.h b/src/include/lib/dshash.h index f3c57e76bf..caeb60ad72 100644 --- a/src/include/lib/dshash.h +++ b/src/include/lib/dshash.h @@ -59,6 +59,21 @@ typedef struct dshash_parameters struct dshash_table_item; typedef struct dshash_table_item dshash_table_item; +/* + * Sequential scan state. The detail is exposed to let users know the storage + * size but it should be considered as an opaque type by callers. + */ +typedef struct dshash_seq_status +{ + dshash_table *hash_table; /* dshash table working on */ + int curbucket; /* bucket number we are at */ + int nbuckets; /* total number of buckets in the dshash */ + dshash_table_item *curitem; /* item we are currently at */ + dsa_pointer pnextitem; /* dsa-pointer to the next item */ + int curpartition; /* partition number we are at */ + bool exclusive; /* locking mode */ +} dshash_seq_status; + /* Creating, sharing and destroying from hash tables. */ extern dshash_table *dshash_create(dsa_area *area, const dshash_parameters *params, @@ -80,6 +95,14 @@ extern bool dshash_delete_key(dshash_table *hash_table, const void *key); extern void dshash_delete_entry(dshash_table *hash_table, void *entry); extern void dshash_release_lock(dshash_table *hash_table, void *entry); +/* seq scan support */ +extern void dshash_seq_init(dshash_seq_status *status, dshash_table *hash_table, + bool exclusive); +extern void *dshash_seq_next(dshash_seq_status *status); +extern void dshash_seq_term(dshash_seq_status *status); +extern void dshash_delete_current(dshash_seq_status *status); +extern void *dshash_get_current(dshash_seq_status *status); + /* Convenience hash and compare functions wrapping memcmp and tag_hash. */ extern int dshash_memcmp(const void *a, const void *b, size_t size, void *arg); extern dshash_hash dshash_memhash(const void *v, size_t size, void *arg); diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index d9b83f744f..eaf3e7a8d4 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -3103,6 +3103,7 @@ dshash_hash dshash_hash_function dshash_parameters dshash_partition +dshash_seq_status dshash_table dshash_table_control dshash_table_handle From 0071fc71277e51723eeb4856eeeb5d25600a429a Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 11 Mar 2022 10:59:47 +0900 Subject: [PATCH 117/772] Fix header inclusion order in xloginsert.c with lz4.h Per project policy, all system and library headers need to be declared in the backend code after "postgres.h" and before the internal headers, but 4035cd5 broke this policy when adding support for LZ4 in wal_compression. Noticed while reviewing the patch to add support for zstd in this area. This only impacts HEAD, so there is no need for a back-patch. --- src/backend/access/transam/xloginsert.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/backend/access/transam/xloginsert.c b/src/backend/access/transam/xloginsert.c index c260310c4c..83d40b55e6 100644 --- a/src/backend/access/transam/xloginsert.c +++ b/src/backend/access/transam/xloginsert.c @@ -19,6 +19,10 @@ #include "postgres.h" +#ifdef USE_LZ4 +#include +#endif + #include "access/xact.h" #include "access/xlog.h" #include "access/xlog_internal.h" @@ -38,7 +42,6 @@ * backup block image. */ #ifdef USE_LZ4 -#include #define LZ4_MAX_BLCKSZ LZ4_COMPRESSBOUND(BLCKSZ) #else #define LZ4_MAX_BLCKSZ 0 From e9537321a74a2b062c8f7a452314b4570913f780 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 11 Mar 2022 12:18:53 +0900 Subject: [PATCH 118/772] Add support for zstd with compression of full-page writes in WAL wal_compression gains a new value, "zstd", to allow the compression of full-page images using the compression method of the same name. Compression is done using the default level recommended by the library, as of ZSTD_CLEVEL_DEFAULT = 3. Some benchmarking has shown that it could make sense to use a level lower for the FPI compression, like 1 or 2, as the compression rate did not change much with a bit less CPU consumed, but any tests done would only cover few scenarios so it is hard to come to a clear conclusion. Anyway, there is no reason to not use the default level instead, which is the level recommended by the library so it should be fine for most cases. zstd outclasses easily pglz, and is better than LZ4 where one wants to have more compression at the cost of extra CPU but both are good enough in their own scenarios, so the choice between one or the other of these comes to a study of the workload patterns and the schema involved, mainly. This commit relies heavily on 4035cd5, that reshaped the code creating and restoring full-page writes to be aware of the compression type, making this integration straight-forward. This patch borrows some early work from Andrey Borodin, though the patch got a complete rewrite. Author: Justin Pryzby Discussion: https://postgr.es/m/20220222231948.GJ9008@telsasoft.com --- doc/src/sgml/config.sgml | 11 ++++--- doc/src/sgml/installation.sgml | 8 +++++ src/backend/access/transam/xloginsert.c | 32 ++++++++++++++++++- src/backend/access/transam/xlogreader.c | 20 ++++++++++++ src/backend/utils/misc/guc.c | 3 ++ src/backend/utils/misc/postgresql.conf.sample | 2 +- src/bin/pg_waldump/pg_waldump.c | 2 ++ src/include/access/xlog.h | 3 +- src/include/access/xlogrecord.h | 5 ++- 9 files changed, 78 insertions(+), 8 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 7ed8c82a9d..5612e80453 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -3154,10 +3154,13 @@ include_dir 'conf.d' server compresses full page images written to WAL when is on or during a base backup. A compressed page image will be decompressed during WAL replay. - The supported methods are pglz and - lz4 (if PostgreSQL was - compiled with ). The default value is - off. Only superusers can change this setting. + The supported methods are pglz, + lz4 (if PostgreSQL + was compiled with ) and + zstd (if PostgreSQL + was compiled with ) and + The default value is off. + Only superusers can change this setting. diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index 0f74252590..a239bbef2f 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -271,6 +271,14 @@ su - postgres + + + You need zstd, if you want to support + compression of data with this method; see + . + + + To build the PostgreSQL documentation, diff --git a/src/backend/access/transam/xloginsert.c b/src/backend/access/transam/xloginsert.c index 83d40b55e6..f4eb54b63c 100644 --- a/src/backend/access/transam/xloginsert.c +++ b/src/backend/access/transam/xloginsert.c @@ -23,6 +23,10 @@ #include #endif +#ifdef USE_ZSTD +#include +#endif + #include "access/xact.h" #include "access/xlog.h" #include "access/xlog_internal.h" @@ -47,9 +51,16 @@ #define LZ4_MAX_BLCKSZ 0 #endif +#ifdef USE_ZSTD +#define ZSTD_MAX_BLCKSZ ZSTD_COMPRESSBOUND(BLCKSZ) +#else +#define ZSTD_MAX_BLCKSZ 0 +#endif + #define PGLZ_MAX_BLCKSZ PGLZ_MAX_OUTPUT(BLCKSZ) -#define COMPRESS_BUFSIZE Max(PGLZ_MAX_BLCKSZ, LZ4_MAX_BLCKSZ) +/* Buffer size required to store a compressed version of backup block image */ +#define COMPRESS_BUFSIZE Max(Max(PGLZ_MAX_BLCKSZ, LZ4_MAX_BLCKSZ), ZSTD_MAX_BLCKSZ) /* * For each block reference registered with XLogRegisterBuffer, we fill in @@ -698,6 +709,14 @@ XLogRecordAssemble(RmgrId rmid, uint8 info, #endif break; + case WAL_COMPRESSION_ZSTD: +#ifdef USE_ZSTD + bimg.bimg_info |= BKPIMAGE_COMPRESS_ZSTD; +#else + elog(ERROR, "zstd is not supported by this build"); +#endif + break; + case WAL_COMPRESSION_NONE: Assert(false); /* cannot happen */ break; @@ -906,6 +925,17 @@ XLogCompressBackupBlock(char *page, uint16 hole_offset, uint16 hole_length, #endif break; + case WAL_COMPRESSION_ZSTD: +#ifdef USE_ZSTD + len = ZSTD_compress(dest, COMPRESS_BUFSIZE, source, orig_len, + ZSTD_CLEVEL_DEFAULT); + if (ZSTD_isError(len)) + len = -1; /* failure */ +#else + elog(ERROR, "zstd is not supported by this build"); +#endif + break; + case WAL_COMPRESSION_NONE: Assert(false); /* cannot happen */ break; diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index 35029cf97d..b7c06da255 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -21,6 +21,9 @@ #ifdef USE_LZ4 #include #endif +#ifdef USE_ZSTD +#include +#endif #include "access/transam.h" #include "access/xlog_internal.h" @@ -1618,6 +1621,23 @@ RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page) "LZ4", block_id); return false; +#endif + } + else if ((bkpb->bimg_info & BKPIMAGE_COMPRESS_ZSTD) != 0) + { +#ifdef USE_ZSTD + size_t decomp_result = ZSTD_decompress(tmp.data, + BLCKSZ - bkpb->hole_length, + ptr, bkpb->bimg_len); + + if (ZSTD_isError(decomp_result)) + decomp_success = false; +#else + report_invalid_record(record, "image at %X/%X compressed with %s not supported by build, block %d", + LSN_FORMAT_ARGS(record->ReadRecPtr), + "zstd", + block_id); + return false; #endif } else diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 6d11f9c71b..e7f0a380e6 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -550,6 +550,9 @@ static const struct config_enum_entry wal_compression_options[] = { {"pglz", WAL_COMPRESSION_PGLZ, false}, #ifdef USE_LZ4 {"lz4", WAL_COMPRESSION_LZ4, false}, +#endif +#ifdef USE_ZSTD + {"zstd", WAL_COMPRESSION_ZSTD, false}, #endif {"on", WAL_COMPRESSION_PGLZ, false}, {"off", WAL_COMPRESSION_NONE, false}, diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 4a094bb38b..4cf5b26a36 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -220,7 +220,7 @@ #wal_log_hints = off # also do full page writes of non-critical updates # (change requires restart) #wal_compression = off # enables compression of full-page writes; - # off, pglz, lz4, or on + # off, pglz, lz4, zstd, or on #wal_init_zero = on # zero-fill new WAL files #wal_recycle = on # recycle WAL files #wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 2340dc247b..f128050b4e 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -562,6 +562,8 @@ XLogDumpDisplayRecord(XLogDumpConfig *config, XLogReaderState *record) method = "pglz"; else if ((bimg_info & BKPIMAGE_COMPRESS_LZ4) != 0) method = "lz4"; + else if ((bimg_info & BKPIMAGE_COMPRESS_ZSTD) != 0) + method = "zstd"; else method = "unknown"; diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index 4b45ac64db..09f6464331 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -75,7 +75,8 @@ typedef enum WalCompression { WAL_COMPRESSION_NONE = 0, WAL_COMPRESSION_PGLZ, - WAL_COMPRESSION_LZ4 + WAL_COMPRESSION_LZ4, + WAL_COMPRESSION_ZSTD } WalCompression; /* Recovery states */ diff --git a/src/include/access/xlogrecord.h b/src/include/access/xlogrecord.h index c1b1137aa7..052ac6817a 100644 --- a/src/include/access/xlogrecord.h +++ b/src/include/access/xlogrecord.h @@ -149,8 +149,11 @@ typedef struct XLogRecordBlockImageHeader /* compression methods supported */ #define BKPIMAGE_COMPRESS_PGLZ 0x04 #define BKPIMAGE_COMPRESS_LZ4 0x08 +#define BKPIMAGE_COMPRESS_ZSTD 0x10 + #define BKPIMAGE_COMPRESSED(info) \ - ((info & (BKPIMAGE_COMPRESS_PGLZ | BKPIMAGE_COMPRESS_LZ4)) != 0) + ((info & (BKPIMAGE_COMPRESS_PGLZ | BKPIMAGE_COMPRESS_LZ4 | \ + BKPIMAGE_COMPRESS_ZSTD)) != 0) /* * Extra header information used when page image has "hole" and From 9198e6399664c34985236b7a88a8efae96be633b Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 11 Mar 2022 15:16:21 +0900 Subject: [PATCH 119/772] doc: Standardize capitalization of term "hot standby"/"Hot Standby" "Hot Standby" was capitalized in a couple of places in the docs, as the style primarily used when it was introduced, but this has not been much respected across the years. Per discussion, it is more natural for the reader to use "hot standby" (aka lower-case only) when in the middle of a sentence, and "Hot standby" (aka capitalized) in a title. This commit adjusts all the places in the docs to be consistent with this choice, rather than applying one style or the other midway. Author: Daniel Westermann Reviewed-by: Kyotaro Horiguchi, Aleksander Alekseev, Robert Treat Discussion: https://postgr.es/m/GVAP278MB093160025A779A1A5788D0EAD2039@GVAP278MB0931.CHEP278.PROD.OUTLOOK.COM --- doc/src/sgml/amcheck.sgml | 2 +- doc/src/sgml/config.sgml | 6 +++--- doc/src/sgml/high-availability.sgml | 26 +++++++++++++------------- doc/src/sgml/mvcc.sgml | 2 +- doc/src/sgml/protocol.sgml | 6 +++--- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/doc/src/sgml/amcheck.sgml b/doc/src/sgml/amcheck.sgml index 11d1eb5af2..5d61a33936 100644 --- a/doc/src/sgml/amcheck.sgml +++ b/doc/src/sgml/amcheck.sgml @@ -174,7 +174,7 @@ ORDER BY c.relpages DESC LIMIT 10; hypothetically, undiscovered bugs in the underlying B-Tree index access method code. Note that bt_index_parent_check cannot be used when - Hot Standby mode is enabled (i.e., on read-only physical + hot standby mode is enabled (i.e., on read-only physical replicas), unlike bt_index_check. diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 5612e80453..9773d94568 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -4553,7 +4553,7 @@ ANY num_sync ( . @@ -4585,7 +4585,7 @@ ANY num_sync ( . @@ -10890,7 +10890,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' Enables logging of recovery-related debugging output that otherwise would not be logged. This parameter allows the user to override the normal setting of , but only for - specific messages. This is intended for use in debugging Hot Standby. + specific messages. This is intended for use in debugging hot standby. Valid values are DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, and LOG. The default, LOG, does not affect diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml index b5b6042104..81fa26f985 100644 --- a/doc/src/sgml/high-availability.sgml +++ b/doc/src/sgml/high-availability.sgml @@ -548,8 +548,8 @@ protocol to make nodes agree on a serializable transactional order. rollforward will take considerably longer, so that technique only offers a solution for disaster recovery, not high availability. A standby server can also be used for read-only queries, in which case - it is called a Hot Standby server. See for - more information. + it is called a hot standby server. See + for more information. @@ -1032,7 +1032,7 @@ primary_slot_name = 'node_a_slot' - Hot Standby feedback propagates upstream, whatever the cascaded arrangement. + Hot standby feedback propagates upstream, whatever the cascaded arrangement. @@ -1499,16 +1499,16 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)' Hot Standby - Hot Standby + hot standby - Hot Standby is the term used to describe the ability to connect to + Hot standby is the term used to describe the ability to connect to the server and run read-only queries while the server is in archive recovery or standby mode. This is useful both for replication purposes and for restoring a backup to a desired state with great precision. - The term Hot Standby also refers to the ability of the server to move + The term hot standby also refers to the ability of the server to move from recovery through to normal operation while users continue running queries and/or keep their connections open. @@ -1623,7 +1623,7 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)' being executed during recovery. This restriction applies even to temporary tables, because table rows cannot be read or written without assigning a transaction ID, which is currently not possible in a - Hot Standby environment. + hot standby environment. @@ -1703,7 +1703,7 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)' In normal operation, read-only transactions are allowed to use LISTEN and NOTIFY, - so Hot Standby sessions operate under slightly tighter + so hot standby sessions operate under slightly tighter restrictions than ordinary read-only sessions. It is possible that some of these restrictions might be loosened in a future release. @@ -1746,7 +1746,7 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)' - There are also additional types of conflict that can occur with Hot Standby. + There are also additional types of conflict that can occur with hot standby. These conflicts are hard conflicts in the sense that queries might need to be canceled and, in some cases, sessions disconnected to resolve them. The user is provided with several ways to handle these @@ -1947,8 +1947,8 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)' If hot_standby is on in postgresql.conf (the default value) and there is a standby.signalstandby.signalfor hot standby - file present, the server will run in Hot Standby mode. - However, it may take some time for Hot Standby connections to be allowed, + file present, the server will run in hot standby mode. + However, it may take some time for hot standby connections to be allowed, because the server will not accept connections until it has completed sufficient recovery to provide a consistent state against which queries can run. During this period, @@ -2282,7 +2282,7 @@ HINT: You can then restart the server after making the necessary configuration Caveats - There are several limitations of Hot Standby. + There are several limitations of hot standby. These can and probably will be fixed in future releases: @@ -2299,7 +2299,7 @@ HINT: You can then restart the server after making the necessary configuration Valid starting points for standby queries are generated at each checkpoint on the primary. If the standby is shut down while the primary - is in a shutdown state, it might not be possible to re-enter Hot Standby + is in a shutdown state, it might not be possible to re-enter hot standby until the primary is started up, so that it generates further starting points in the WAL logs. This situation isn't a problem in the most common situations where it might happen. Generally, if the primary is diff --git a/doc/src/sgml/mvcc.sgml b/doc/src/sgml/mvcc.sgml index 6c94f6a942..da07f3f6c6 100644 --- a/doc/src/sgml/mvcc.sgml +++ b/doc/src/sgml/mvcc.sgml @@ -1741,7 +1741,7 @@ SELECT pg_advisory_lock(q.id) FROM Support for the Serializable transaction isolation level has not yet - been added to Hot Standby replication targets (described in + been added to hot standby replication targets (described in ). The strictest isolation level currently supported in hot standby mode is Repeatable Read. While performing all permanent database writes within Serializable transactions on the diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 0695bcd423..9178c779ba 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -2417,7 +2417,7 @@ The commands accepted in replication mode are: - Hot Standby feedback message (F) + Hot standby feedback message (F) @@ -2428,7 +2428,7 @@ The commands accepted in replication mode are: - Identifies the message as a Hot Standby feedback message. + Identifies the message as a hot standby feedback message. @@ -2451,7 +2451,7 @@ The commands accepted in replication mode are: The standby's current global xmin, excluding the catalog_xmin from any replication slots. If both this value and the following - catalog_xmin are 0 this is treated as a notification that Hot Standby + catalog_xmin are 0 this is treated as a notification that hot standby feedback will no longer be sent on this connection. Later non-zero messages may reinitiate the feedback mechanism. From e94bb1473eb36e19c200476cebc3750cf6a978e7 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 11 Mar 2022 08:27:24 +0100 Subject: [PATCH 120/772] DefineCollation() code cleanup Reorganize the code in DefineCollation() so that the parts using the FROM clause and the parts not doing so are more cleanly separated. No functionality change intended. Reviewed-by: Julien Rouhaud Discussion: https://www.postgresql.org/message-id/29ae752f-80e9-8d31-601c-62cf01cc93d8@enterprisedb.com --- src/backend/commands/collationcmds.c | 109 ++++++++++++++------------- 1 file changed, 57 insertions(+), 52 deletions(-) diff --git a/src/backend/commands/collationcmds.c b/src/backend/commands/collationcmds.c index 12fc2316f9..93df1d366c 100644 --- a/src/backend/commands/collationcmds.c +++ b/src/backend/commands/collationcmds.c @@ -63,12 +63,11 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e DefElem *providerEl = NULL; DefElem *deterministicEl = NULL; DefElem *versionEl = NULL; - char *collcollate = NULL; - char *collctype = NULL; - char *collproviderstr = NULL; - bool collisdeterministic = true; - int collencoding = 0; - char collprovider = 0; + char *collcollate; + char *collctype; + bool collisdeterministic; + int collencoding; + char collprovider; char *collversion = NULL; Oid newoid; ObjectAddress address; @@ -167,65 +166,71 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("collation \"default\" cannot be copied"))); } - - if (localeEl) + else { - collcollate = defGetString(localeEl); - collctype = defGetString(localeEl); - } + char *collproviderstr = NULL; - if (lccollateEl) - collcollate = defGetString(lccollateEl); + collcollate = NULL; + collctype = NULL; - if (lcctypeEl) - collctype = defGetString(lcctypeEl); + if (localeEl) + { + collcollate = defGetString(localeEl); + collctype = defGetString(localeEl); + } - if (providerEl) - collproviderstr = defGetString(providerEl); + if (lccollateEl) + collcollate = defGetString(lccollateEl); - if (deterministicEl) - collisdeterministic = defGetBoolean(deterministicEl); + if (lcctypeEl) + collctype = defGetString(lcctypeEl); - if (versionEl) - collversion = defGetString(versionEl); + if (providerEl) + collproviderstr = defGetString(providerEl); - if (collproviderstr) - { - if (pg_strcasecmp(collproviderstr, "icu") == 0) - collprovider = COLLPROVIDER_ICU; - else if (pg_strcasecmp(collproviderstr, "libc") == 0) - collprovider = COLLPROVIDER_LIBC; + if (deterministicEl) + collisdeterministic = defGetBoolean(deterministicEl); + else + collisdeterministic = true; + + if (versionEl) + collversion = defGetString(versionEl); + + if (collproviderstr) + { + if (pg_strcasecmp(collproviderstr, "icu") == 0) + collprovider = COLLPROVIDER_ICU; + else if (pg_strcasecmp(collproviderstr, "libc") == 0) + collprovider = COLLPROVIDER_LIBC; + else + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("unrecognized collation provider: %s", + collproviderstr))); + } else + collprovider = COLLPROVIDER_LIBC; + + if (!collcollate) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("unrecognized collation provider: %s", - collproviderstr))); - } - else if (!fromEl) - collprovider = COLLPROVIDER_LIBC; - - if (!collcollate) - ereport(ERROR, - (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("parameter \"lc_collate\" must be specified"))); + errmsg("parameter \"lc_collate\" must be specified"))); - if (!collctype) - ereport(ERROR, - (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("parameter \"lc_ctype\" must be specified"))); + if (!collctype) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("parameter \"lc_ctype\" must be specified"))); - /* - * Nondeterministic collations are currently only supported with ICU - * because that's the only case where it can actually make a difference. - * So we can save writing the code for the other providers. - */ - if (!collisdeterministic && collprovider != COLLPROVIDER_ICU) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("nondeterministic collations not supported with this provider"))); + /* + * Nondeterministic collations are currently only supported with ICU + * because that's the only case where it can actually make a difference. + * So we can save writing the code for the other providers. + */ + if (!collisdeterministic && collprovider != COLLPROVIDER_ICU) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("nondeterministic collations not supported with this provider"))); - if (!fromEl) - { if (collprovider == COLLPROVIDER_ICU) { #ifdef USE_ICU From b2de45f9200d9adcac50015521574696dc464ccd Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 11 Mar 2022 12:22:02 -0500 Subject: [PATCH 121/772] pg_basebackup: Avoid unclean failure with server-compression and -D -. Fail with a suitable error message instead. We can't inject the backup manifest into the output tarfile without decompressing it, and if we did that, we'd have to recompress the tarfile afterwards to produce the result the user is expecting. While we have enough infrastructure in pg_basebackup now to accomplish that whole series of steps without much additional code, it seems like excessively surprising behavior. The user probably did not select server-side compression with the idea that the client was going to end up decompressing it and then recompressing. Report from Justin Pryzby. Fix by me. Discussion: http://postgr.es/m/CA+Tgmob6Rnjz-Qv32h3yJn8nnUkLhrtQDAS4y5AtsgtorAFHRA@mail.gmail.com --- src/bin/pg_basebackup/pg_basebackup.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index 9f3ecc60fb..43c4036eee 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -1208,7 +1208,8 @@ CreateBackupStreamer(char *archive_name, char *spclocation, bool is_tar, is_tar_gz, is_tar_lz4, - is_tar_zstd; + is_tar_zstd, + is_compressed_tar; bool must_parse_archive; int archive_name_len = strlen(archive_name); @@ -1235,6 +1236,24 @@ CreateBackupStreamer(char *archive_name, char *spclocation, is_tar_zstd = (archive_name_len > 8 && strcmp(archive_name + archive_name_len - 4, ".zst") == 0); + /* Is this any kind of compressed tar? */ + is_compressed_tar = is_tar_gz || is_tar_lz4 || is_tar_zstd; + + /* + * Injecting the manifest into a compressed tar file would be possible if + * we decompressed it, parsed the tarfile, generated a new tarfile, and + * recompressed it, but compressing and decompressing multiple times just + * to inject the manifest seems inefficient enough that it's probably not + * what the user wants. So, instead, reject the request and tell the user + * to specify something more reasonable. + */ + if (inject_manifest && is_compressed_tar) + { + pg_log_error("cannot inject manifest into a compressed tarfile"); + pg_log_info("use client-side compression, send the output to a directory rather than standard output, or use --no-manifest"); + exit(1); + } + /* * We have to parse the archive if (1) we're suppose to extract it, or if * (2) we need to inject backup_manifest or recovery configuration into it. @@ -1244,8 +1263,7 @@ CreateBackupStreamer(char *archive_name, char *spclocation, (spclocation == NULL && writerecoveryconf)); /* At present, we only know how to parse tar archives. */ - if (must_parse_archive && !is_tar && !is_tar_gz && !is_tar_lz4 - && !is_tar_zstd) + if (must_parse_archive && !is_tar && !is_compressed_tar) { pg_log_error("unable to parse archive: %s", archive_name); pg_log_info("only tar archives can be parsed"); From d6f1cdeb9a9ea227f87a2156e3a1ed94706b2193 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 11 Mar 2022 12:35:13 -0500 Subject: [PATCH 122/772] pg_basebackup: Clean up some bogus file extension tests. Justin Pryzby Discussion: http://postgr.es/m/20220311162911.GM28503@telsasoft.com --- src/bin/pg_basebackup/pg_basebackup.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index 43c4036eee..d265ee3b3c 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -1224,17 +1224,17 @@ CreateBackupStreamer(char *archive_name, char *spclocation, is_tar = (archive_name_len > 4 && strcmp(archive_name + archive_name_len - 4, ".tar") == 0); - /* Is this a gzip archive? */ - is_tar_gz = (archive_name_len > 8 && - strcmp(archive_name + archive_name_len - 3, ".gz") == 0); + /* Is this a .tar.gz archive? */ + is_tar_gz = (archive_name_len > 7 && + strcmp(archive_name + archive_name_len - 7, ".tar.gz") == 0); - /* Is this a LZ4 archive? */ + /* Is this a .tar.lz4 archive? */ is_tar_lz4 = (archive_name_len > 8 && - strcmp(archive_name + archive_name_len - 4, ".lz4") == 0); + strcmp(archive_name + archive_name_len - 8, ".tar.lz4") == 0); - /* Is this a ZSTD archive? */ + /* Is this a .tar.zst archive? */ is_tar_zstd = (archive_name_len > 8 && - strcmp(archive_name + archive_name_len - 4, ".zst") == 0); + strcmp(archive_name + archive_name_len - 8, ".tar.zst") == 0); /* Is this any kind of compressed tar? */ is_compressed_tar = is_tar_gz || is_tar_lz4 || is_tar_zstd; From 641f3dffcdf1c7378cfb94c98b6642793181d6db Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 11 Mar 2022 13:47:26 -0500 Subject: [PATCH 123/772] Restore the previous semantics of get_constraint_index(). Commit 8b069ef5d changed this function to look at pg_constraint.conindid rather than searching pg_depend. That was a good performance improvement, but it failed to preserve the exact semantics. The old code would only return an index that was "owned by" (internally dependent on) the specified constraint, whereas the new code will also return indexes that are just referenced by foreign key constraints. This confuses ALTER TABLE, which was implicitly expecting the previous semantics, into failing with errors like ERROR: relation 146621 has multiple clustered indexes or ERROR: "pk_attbl" is not an index for table "atref" We can fix this without reverting the performance improvement by adding a contype check in get_constraint_index(). Another way could be to make ALTER TABLE check it, but I'm worried that extension code could also have subtle dependencies on the old semantics. Tom Lane and Japin Li, per bug #17409 from Holly Roberts. Back-patch to v14 where the error crept in. Discussion: https://postgr.es/m/17409-52871dda8b5741cb@postgresql.org --- src/backend/utils/cache/lsyscache.c | 16 +++++++++++++--- src/test/regress/expected/alter_table.out | 14 ++++++++++++++ src/test/regress/sql/alter_table.sql | 18 ++++++++++++++++++ 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c index feef999863..1b7e11b93e 100644 --- a/src/backend/utils/cache/lsyscache.c +++ b/src/backend/utils/cache/lsyscache.c @@ -1126,8 +1126,13 @@ get_constraint_name(Oid conoid) * Given the OID of a unique, primary-key, or exclusion constraint, * return the OID of the underlying index. * - * Return InvalidOid if the index couldn't be found; this suggests the - * given OID is bogus, but we leave it to caller to decide what to do. + * Returns InvalidOid if the constraint could not be found or is of + * the wrong type. + * + * The intent of this function is to return the index "owned" by the + * specified constraint. Therefore we must check contype, since some + * pg_constraint entries (e.g. for foreign-key constraints) store the + * OID of an index that is referenced but not owned by the constraint. */ Oid get_constraint_index(Oid conoid) @@ -1140,7 +1145,12 @@ get_constraint_index(Oid conoid) Form_pg_constraint contup = (Form_pg_constraint) GETSTRUCT(tp); Oid result; - result = contup->conindid; + if (contup->contype == CONSTRAINT_UNIQUE || + contup->contype == CONSTRAINT_PRIMARY || + contup->contype == CONSTRAINT_EXCLUSION) + result = contup->conindid; + else + result = InvalidOid; ReleaseSysCache(tp); return result; } diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 16e0475663..aabc564e2c 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -4502,6 +4502,20 @@ create trigger xtrig update bar1 set a = a + 1; INFO: a=1, b=1 /* End test case for bug #16242 */ +/* Test case for bug #17409 */ +create table attbl (p1 int constraint pk_attbl primary key); +create table atref (c1 int references attbl(p1)); +cluster attbl using pk_attbl; +alter table attbl alter column p1 set data type bigint; +alter table atref alter column c1 set data type bigint; +drop table attbl, atref; +create table attbl (p1 int constraint pk_attbl primary key); +alter table attbl replica identity using index pk_attbl; +create table atref (c1 int references attbl(p1)); +alter table attbl alter column p1 set data type bigint; +alter table atref alter column c1 set data type bigint; +drop table attbl, atref; +/* End test case for bug #17409 */ -- Test that ALTER TABLE rewrite preserves a clustered index -- for normal indexes and indexes on constraints. create table alttype_cluster (a int); diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index ac894c0602..cce1cb1dd3 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -2958,6 +2958,24 @@ update bar1 set a = a + 1; /* End test case for bug #16242 */ +/* Test case for bug #17409 */ + +create table attbl (p1 int constraint pk_attbl primary key); +create table atref (c1 int references attbl(p1)); +cluster attbl using pk_attbl; +alter table attbl alter column p1 set data type bigint; +alter table atref alter column c1 set data type bigint; +drop table attbl, atref; + +create table attbl (p1 int constraint pk_attbl primary key); +alter table attbl replica identity using index pk_attbl; +create table atref (c1 int references attbl(p1)); +alter table attbl alter column p1 set data type bigint; +alter table atref alter column c1 set data type bigint; +drop table attbl, atref; + +/* End test case for bug #17409 */ + -- Test that ALTER TABLE rewrite preserves a clustered index -- for normal indexes and indexes on constraints. create table alttype_cluster (a int); From 3a46a45f6f009785b46188ed862afbccfb4cf56a Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Fri, 11 Mar 2022 20:40:03 -0300 Subject: [PATCH 124/772] Add API of sorts for transition table handling in trigger.c MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Preparatory patch for further additions in this area, particularly to allow MERGE to have separate transition tables for each action. Author: Pavan Deolasee Reviewed-by: Álvaro Herrera Discussion: https://postgr.es/m/CABOikdNj+8HEJ5D8tu56mrPkjHVRrBb2_cdKWwpiYNcjXgDw8g@mail.gmail.com Discussion: https://postgr.es/m/20201231134736.GA25392@alvherre.pgsql --- src/backend/commands/trigger.c | 172 +++++++++++++++++++++++---------- 1 file changed, 119 insertions(+), 53 deletions(-) diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 1a9c1ac290..e08bd9a370 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -3772,6 +3772,16 @@ static AfterTriggersTableData *GetAfterTriggersTableData(Oid relid, CmdType cmdType); static TupleTableSlot *GetAfterTriggersStoreSlot(AfterTriggersTableData *table, TupleDesc tupdesc); +static Tuplestorestate *GetAfterTriggersTransitionTable(int event, + TupleTableSlot *oldslot, + TupleTableSlot *newslot, + TransitionCaptureState *transition_capture); +static void TransitionTableAddTuple(EState *estate, + TransitionCaptureState *transition_capture, + ResultRelInfo *relinfo, + TupleTableSlot *slot, + TupleTableSlot *original_insert_tuple, + Tuplestorestate *tuplestore); static void AfterTriggerFreeQuery(AfterTriggersQueryData *qs); static SetConstraintState SetConstraintStateCreate(int numalloc); static SetConstraintState SetConstraintStateCopy(SetConstraintState state); @@ -5158,6 +5168,92 @@ AfterTriggerEndSubXact(bool isCommit) } } +/* + * Get the transition table for the given event and depending on whether we are + * processing the old or the new tuple. + */ +static Tuplestorestate * +GetAfterTriggersTransitionTable(int event, + TupleTableSlot *oldslot, + TupleTableSlot *newslot, + TransitionCaptureState *transition_capture) +{ + Tuplestorestate *tuplestore = NULL; + bool delete_old_table = transition_capture->tcs_delete_old_table; + bool update_old_table = transition_capture->tcs_update_old_table; + bool update_new_table = transition_capture->tcs_update_new_table; + bool insert_new_table = transition_capture->tcs_insert_new_table; + + /* + * For INSERT events NEW should be non-NULL, for DELETE events OLD should + * be non-NULL, whereas for UPDATE events normally both OLD and NEW are + * non-NULL. But for UPDATE events fired for capturing transition tuples + * during UPDATE partition-key row movement, OLD is NULL when the event is + * for a row being inserted, whereas NEW is NULL when the event is for a + * row being deleted. + */ + Assert(!(event == TRIGGER_EVENT_DELETE && delete_old_table && + TupIsNull(oldslot))); + Assert(!(event == TRIGGER_EVENT_INSERT && insert_new_table && + TupIsNull(newslot))); + + if (!TupIsNull(oldslot)) + { + Assert(TupIsNull(newslot)); + if (event == TRIGGER_EVENT_DELETE && delete_old_table) + tuplestore = transition_capture->tcs_private->old_tuplestore; + else if (event == TRIGGER_EVENT_UPDATE && update_old_table) + tuplestore = transition_capture->tcs_private->old_tuplestore; + } + else if (!TupIsNull(newslot)) + { + Assert(TupIsNull(oldslot)); + if (event == TRIGGER_EVENT_INSERT && insert_new_table) + tuplestore = transition_capture->tcs_private->new_tuplestore; + else if (event == TRIGGER_EVENT_UPDATE && update_new_table) + tuplestore = transition_capture->tcs_private->new_tuplestore; + } + + return tuplestore; +} + +/* + * Add the given heap tuple to the given tuplestore, applying the conversion + * map if necessary. + * + * If original_insert_tuple is given, we can add that tuple without conversion. + */ +static void +TransitionTableAddTuple(EState *estate, + TransitionCaptureState *transition_capture, + ResultRelInfo *relinfo, + TupleTableSlot *slot, + TupleTableSlot *original_insert_tuple, + Tuplestorestate *tuplestore) +{ + TupleConversionMap *map; + + /* + * Nothing needs to be done if we don't have a tuplestore. + */ + if (tuplestore == NULL) + return; + + if (original_insert_tuple) + tuplestore_puttupleslot(tuplestore, original_insert_tuple); + else if ((map = ExecGetChildToRootMap(relinfo)) != NULL) + { + AfterTriggersTableData *table = transition_capture->tcs_private; + TupleTableSlot *storeslot; + + storeslot = GetAfterTriggersStoreSlot(table, map->outdesc); + execute_attr_map_slot(map->attrMap, slot, storeslot); + tuplestore_puttupleslot(tuplestore, storeslot); + } + else + tuplestore_puttupleslot(tuplestore, slot); +} + /* ---------- * AfterTriggerEnlargeQueryState() * @@ -5650,7 +5746,6 @@ AfterTriggerPendingOnRel(Oid relid) return false; } - /* ---------- * AfterTriggerSaveEvent() * @@ -5709,68 +5804,39 @@ AfterTriggerSaveEvent(EState *estate, ResultRelInfo *relinfo, */ if (row_trigger && transition_capture != NULL) { - TupleTableSlot *original_insert_tuple = transition_capture->tcs_original_insert_tuple; - TupleConversionMap *map = ExecGetChildToRootMap(relinfo); - bool delete_old_table = transition_capture->tcs_delete_old_table; - bool update_old_table = transition_capture->tcs_update_old_table; - bool update_new_table = transition_capture->tcs_update_new_table; - bool insert_new_table = transition_capture->tcs_insert_new_table; /* - * For INSERT events NEW should be non-NULL, for DELETE events OLD - * should be non-NULL, whereas for UPDATE events normally both OLD and - * NEW are non-NULL. But for UPDATE events fired for capturing - * transition tuples during UPDATE partition-key row movement, OLD is - * NULL when the event is for a row being inserted, whereas NEW is - * NULL when the event is for a row being deleted. + * Capture the old tuple in the appropriate transition table based on + * the event. */ - Assert(!(event == TRIGGER_EVENT_DELETE && delete_old_table && - TupIsNull(oldslot))); - Assert(!(event == TRIGGER_EVENT_INSERT && insert_new_table && - TupIsNull(newslot))); - - if (!TupIsNull(oldslot) && - ((event == TRIGGER_EVENT_DELETE && delete_old_table) || - (event == TRIGGER_EVENT_UPDATE && update_old_table))) + if (!TupIsNull(oldslot)) { Tuplestorestate *old_tuplestore; - old_tuplestore = transition_capture->tcs_private->old_tuplestore; - - if (map != NULL) - { - AfterTriggersTableData *table = transition_capture->tcs_private; - TupleTableSlot *storeslot; - - storeslot = GetAfterTriggersStoreSlot(table, map->outdesc); - execute_attr_map_slot(map->attrMap, oldslot, storeslot); - tuplestore_puttupleslot(old_tuplestore, storeslot); - } - else - tuplestore_puttupleslot(old_tuplestore, oldslot); + old_tuplestore = GetAfterTriggersTransitionTable(event, + oldslot, + NULL, + transition_capture); + TransitionTableAddTuple(estate, transition_capture, relinfo, + oldslot, NULL, old_tuplestore); } - if (!TupIsNull(newslot) && - ((event == TRIGGER_EVENT_INSERT && insert_new_table) || - (event == TRIGGER_EVENT_UPDATE && update_new_table))) + + /* + * Capture the new tuple in the appropriate transition table based on + * the event. + */ + if (!TupIsNull(newslot)) { Tuplestorestate *new_tuplestore; - new_tuplestore = transition_capture->tcs_private->new_tuplestore; - - if (original_insert_tuple != NULL) - tuplestore_puttupleslot(new_tuplestore, - original_insert_tuple); - else if (map != NULL) - { - AfterTriggersTableData *table = transition_capture->tcs_private; - TupleTableSlot *storeslot; - - storeslot = GetAfterTriggersStoreSlot(table, map->outdesc); - execute_attr_map_slot(map->attrMap, newslot, storeslot); - tuplestore_puttupleslot(new_tuplestore, storeslot); - } - else - tuplestore_puttupleslot(new_tuplestore, newslot); + new_tuplestore = GetAfterTriggersTransitionTable(event, + NULL, + newslot, + transition_capture); + TransitionTableAddTuple(estate, transition_capture, relinfo, + newslot, + transition_capture->tcs_original_insert_tuple, + new_tuplestore); } /* From 8e375ea4a0e95dd0d74f11c439cce4498bf80bd7 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 12 Mar 2022 09:39:13 +0900 Subject: [PATCH 125/772] Bump XLOG_PAGE_MAGIC due to the addition of wal_compression=zstd While on it, fix a thinko in the docs, introduced by the same commit. Oversights in e953732. Reported-by: Justin Pryzby Discussion: https://postgr.es/m/20220311214900.GN28503@telsasoft.com --- doc/src/sgml/config.sgml | 2 +- src/include/access/xlog_internal.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 9773d94568..5b763bf60f 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -3158,7 +3158,7 @@ include_dir 'conf.d' lz4 (if PostgreSQL was compiled with ) and zstd (if PostgreSQL - was compiled with ) and + was compiled with ). The default value is off. Only superusers can change this setting. diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h index 849954a8e5..0e94833129 100644 --- a/src/include/access/xlog_internal.h +++ b/src/include/access/xlog_internal.h @@ -31,7 +31,7 @@ /* * Each page of XLOG file has a header like this: */ -#define XLOG_PAGE_MAGIC 0xD10E /* can be used as WAL version indicator */ +#define XLOG_PAGE_MAGIC 0xD10F /* can be used as WAL version indicator */ typedef struct XLogPageHeaderData { From 5b68f75e12831cd5b7d8058320c0ca29bbe76067 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Fri, 11 Mar 2022 19:30:21 -0800 Subject: [PATCH 126/772] Normalize heap_prepare_freeze_tuple argument name. We called the argument totally_frozen in its function prototype as well as in code comments, even though totally_frozen_p was used in the function definition. Standardize on totally_frozen. --- src/backend/access/heap/heapam.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 4e6aeba315..3746336a09 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -6417,7 +6417,7 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, * are older than the specified cutoff XID and cutoff MultiXactId. If so, * setup enough state (in the *frz output argument) to later execute and * WAL-log what we would need to do, and return true. Return false if nothing - * is to be changed. In addition, set *totally_frozen_p to true if the tuple + * is to be changed. In addition, set *totally_frozen to true if the tuple * will be totally frozen after these operations are performed and false if * more freezing will eventually be required. * @@ -6445,7 +6445,7 @@ bool heap_prepare_freeze_tuple(HeapTupleHeader tuple, TransactionId relfrozenxid, TransactionId relminmxid, TransactionId cutoff_xid, TransactionId cutoff_multi, - xl_heap_freeze_tuple *frz, bool *totally_frozen_p) + xl_heap_freeze_tuple *frz, bool *totally_frozen) { bool changed = false; bool xmax_already_frozen = false; @@ -6645,8 +6645,8 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple, } } - *totally_frozen_p = (xmin_frozen && - (freeze_xmax || xmax_already_frozen)); + *totally_frozen = (xmin_frozen && + (freeze_xmax || xmax_already_frozen)); return changed; } From 73f6ec3d3c8d5786c54373e71a096e5acf78e7ca Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Sat, 12 Mar 2022 12:52:38 -0800 Subject: [PATCH 127/772] vacuumlazy.c: document vistest and OldestXmin. Explain the relationship between vacuumlazy.c's vistest and OldestXmin cutoffs. These closely related cutoffs are different in subtle but important ways. Also document a closely related rule: we must establish rel_pages _after_ OldestXmin to ensure that no XID < OldestXmin can be missed by lazy_scan_heap(). It's easier to explain these issues by initializing everything together, so consolidate initialization of vacrel state. Now almost every vacrel field is initialized by heap_vacuum_rel(). The only remaining exception is the dead_items array, which is still managed by lazy_scan_heap() due to interactions with how we initialize parallel VACUUM. Also move the process that updates pg_class entries for each index into heap_vacuum_rel(), and adjust related assertions. All pg_class updates now take place after lazy_scan_heap() returns, which seems clearer. Author: Peter Geoghegan Reviewed-By: Andres Freund Discussion: https://postgr.es/m/20211211045710.ljtuu4gfloh754rs@alap3.anarazel.de Discussion: https://postgr.es/m/CAH2-WznYsUxVT156rCQ+q=YD4S4=1M37hWvvHLz-H1pwSM8-Ew@mail.gmail.com --- src/backend/access/heap/vacuumlazy.c | 173 ++++++++++++++------------- 1 file changed, 92 insertions(+), 81 deletions(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 40101e0cb8..7982139baa 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -167,9 +167,10 @@ typedef struct LVRelState MultiXactId relminmxid; double old_live_tuples; /* previous value of pg_class.reltuples */ - /* VACUUM operation's cutoff for pruning */ + /* VACUUM operation's cutoffs for freezing and pruning */ TransactionId OldestXmin; - /* VACUUM operation's cutoff for freezing XIDs and MultiXactIds */ + GlobalVisState *vistest; + /* VACUUM operation's target cutoffs for freezing XIDs and MultiXactIds */ TransactionId FreezeLimit; MultiXactId MultiXactCutoff; /* Are FreezeLimit/MultiXactCutoff still valid? */ @@ -185,8 +186,6 @@ typedef struct LVRelState bool verbose; /* VACUUM VERBOSE? */ /* - * State managed by lazy_scan_heap() follows. - * * dead_items stores TIDs whose index tuples are deleted by index * vacuuming. Each TID points to an LP_DEAD line pointer from a heap page * that has been processed by lazy_scan_prune. Also needed by @@ -252,7 +251,6 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, bool sharelock, Buffer vmbuffer); static void lazy_scan_prune(LVRelState *vacrel, Buffer buf, BlockNumber blkno, Page page, - GlobalVisState *vistest, LVPagePruneState *prunestate); static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf, BlockNumber blkno, Page page, @@ -281,7 +279,7 @@ static void dead_items_alloc(LVRelState *vacrel, int nworkers); static void dead_items_cleanup(LVRelState *vacrel); static bool heap_page_is_all_visible(LVRelState *vacrel, Buffer buf, TransactionId *visibility_cutoff_xid, bool *all_frozen); -static void update_index_statistics(LVRelState *vacrel); +static void update_relstats_all_indexes(LVRelState *vacrel); static void vacuum_error_callback(void *arg); static void update_vacuum_error_info(LVRelState *vacrel, LVSavedErrInfo *saved_vacrel, @@ -296,7 +294,8 @@ static void restore_vacuum_error_info(LVRelState *vacrel, * * This routine sets things up for and then calls lazy_scan_heap, where * almost all work actually takes place. Finalizes everything after call - * returns by managing rel truncation and updating pg_class statistics. + * returns by managing relation truncation and updating rel's pg_class + * entry. (Also updates pg_class entries for any indexes that need it.) * * At entry, we have already established a transaction and opened * and locked the relation. @@ -468,9 +467,51 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, vacrel->relminmxid = rel->rd_rel->relminmxid; vacrel->old_live_tuples = rel->rd_rel->reltuples; - /* Set cutoffs for entire VACUUM */ + /* Initialize page counters explicitly (be tidy) */ + vacrel->scanned_pages = 0; + vacrel->frozenskipped_pages = 0; + vacrel->removed_pages = 0; + vacrel->lpdead_item_pages = 0; + vacrel->missed_dead_pages = 0; + vacrel->nonempty_pages = 0; + /* dead_items_alloc allocates vacrel->dead_items later on */ + + /* Allocate/initialize output statistics state */ + vacrel->new_rel_tuples = 0; + vacrel->new_live_tuples = 0; + vacrel->indstats = (IndexBulkDeleteResult **) + palloc0(vacrel->nindexes * sizeof(IndexBulkDeleteResult *)); + + /* Initialize remaining counters (be tidy) */ + vacrel->num_index_scans = 0; + vacrel->tuples_deleted = 0; + vacrel->lpdead_items = 0; + vacrel->live_tuples = 0; + vacrel->recently_dead_tuples = 0; + vacrel->missed_dead_tuples = 0; + + /* + * Determine the extent of the blocks that we'll scan in lazy_scan_heap, + * and finalize cutoffs used for freezing and pruning in lazy_scan_prune. + * + * We expect vistest will always make heap_page_prune remove any deleted + * tuple whose xmax is < OldestXmin. lazy_scan_prune must never become + * confused about whether a tuple should be frozen or removed. (In the + * future we might want to teach lazy_scan_prune to recompute vistest from + * time to time, to increase the number of dead tuples it can prune away.) + * + * We must determine rel_pages _after_ OldestXmin has been established. + * lazy_scan_heap's physical heap scan (scan of pages < rel_pages) is + * thereby guaranteed to not miss any tuples with XIDs < OldestXmin. These + * XIDs must at least be considered for freezing (though not necessarily + * frozen) during its scan. + */ + vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel); vacrel->OldestXmin = OldestXmin; + vacrel->vistest = GlobalVisTestFor(rel); + /* FreezeLimit controls XID freezing (always <= OldestXmin) */ vacrel->FreezeLimit = FreezeLimit; + /* MultiXactCutoff controls MXID freezing */ vacrel->MultiXactCutoff = MultiXactCutoff; /* Track if cutoffs became invalid (possible in !aggressive case only) */ vacrel->freeze_cutoffs_valid = true; @@ -481,21 +522,21 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, */ lazy_scan_heap(vacrel, params->nworkers); - /* Done with indexes */ - vac_close_indexes(vacrel->nindexes, vacrel->indrels, NoLock); - /* - * Optionally truncate the relation. But remember the relation size used - * by lazy_scan_heap for later first. + * Update pg_class entries for each of rel's indexes where appropriate. + * + * Unlike the later update to rel's pg_class entry, this is not critical. + * Maintains relpages/reltuples statistics used by the planner only. */ - orig_rel_pages = vacrel->rel_pages; + if (vacrel->do_index_cleanup) + update_relstats_all_indexes(vacrel); + + /* Done with rel's indexes */ + vac_close_indexes(vacrel->nindexes, vacrel->indrels, NoLock); + + /* Optionally truncate rel */ if (should_attempt_truncation(vacrel)) - { - update_vacuum_error_info(vacrel, NULL, VACUUM_ERRCB_PHASE_TRUNCATE, - vacrel->nonempty_pages, - InvalidOffsetNumber); lazy_truncate_heap(vacrel); - } /* Pop the error context stack */ error_context_stack = errcallback.previous; @@ -505,7 +546,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, PROGRESS_VACUUM_PHASE_FINAL_CLEANUP); /* - * Update statistics in pg_class. + * Prepare to update rel's pg_class entry. * * In principle new_live_tuples could be -1 indicating that we (still) * don't know the tuple count. In practice that probably can't happen, @@ -517,22 +558,19 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, */ new_rel_pages = vacrel->rel_pages; /* After possible rel truncation */ new_live_tuples = vacrel->new_live_tuples; - visibilitymap_count(rel, &new_rel_allvisible, NULL); if (new_rel_allvisible > new_rel_pages) new_rel_allvisible = new_rel_pages; /* + * Now actually update rel's pg_class entry. + * * Aggressive VACUUM must reliably advance relfrozenxid (and relminmxid). * We are able to advance relfrozenxid in a non-aggressive VACUUM too, * provided we didn't skip any all-visible (not all-frozen) pages using * the visibility map, and assuming that we didn't fail to get a cleanup * lock that made it unsafe with respect to FreezeLimit (or perhaps our * MultiXactCutoff) established for VACUUM operation. - * - * NB: We must use orig_rel_pages, not vacrel->rel_pages, since we want - * the rel_pages used by lazy_scan_heap, which won't match when we - * happened to truncate the relation afterwards. */ if (vacrel->scanned_pages + vacrel->frozenskipped_pages < orig_rel_pages || !vacrel->freeze_cutoffs_valid) @@ -787,7 +825,7 @@ static void lazy_scan_heap(LVRelState *vacrel, int nworkers) { VacDeadItems *dead_items; - BlockNumber nblocks, + BlockNumber nblocks = vacrel->rel_pages, blkno, next_unskippable_block, next_failsafe_block, @@ -800,29 +838,6 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) PROGRESS_VACUUM_MAX_DEAD_TUPLES }; int64 initprog_val[3]; - GlobalVisState *vistest; - - nblocks = RelationGetNumberOfBlocks(vacrel->rel); - vacrel->rel_pages = nblocks; - vacrel->scanned_pages = 0; - vacrel->frozenskipped_pages = 0; - vacrel->removed_pages = 0; - vacrel->lpdead_item_pages = 0; - vacrel->missed_dead_pages = 0; - vacrel->nonempty_pages = 0; - - /* Initialize instrumentation counters */ - vacrel->num_index_scans = 0; - vacrel->tuples_deleted = 0; - vacrel->lpdead_items = 0; - vacrel->live_tuples = 0; - vacrel->recently_dead_tuples = 0; - vacrel->missed_dead_tuples = 0; - - vistest = GlobalVisTestFor(vacrel->rel); - - vacrel->indstats = (IndexBulkDeleteResult **) - palloc0(vacrel->nindexes * sizeof(IndexBulkDeleteResult *)); /* * Do failsafe precheck before calling dead_items_alloc. This ensures @@ -880,9 +895,9 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) * might leave some dead tuples lying around, but the next vacuum will * find them. But even when aggressive *is* set, it's still OK if we miss * a page whose all-frozen marking has just been cleared. Any new XIDs - * just added to that page are necessarily newer than the GlobalXmin we - * computed, so they'll have no effect on the value to which we can safely - * set relfrozenxid. A similar argument applies for MXIDs and relminmxid. + * just added to that page are necessarily >= vacrel->OldestXmin, and so + * they'll have no effect on the value to which we can safely set + * relfrozenxid. A similar argument applies for MXIDs and relminmxid. */ next_unskippable_block = 0; if (vacrel->skipwithvm) @@ -1153,7 +1168,7 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) * were pruned some time earlier. Also considers freezing XIDs in the * tuple headers of remaining items with storage. */ - lazy_scan_prune(vacrel, buf, blkno, page, vistest, &prunestate); + lazy_scan_prune(vacrel, buf, blkno, page, &prunestate); Assert(!prunestate.all_visible || !prunestate.has_lpdead_items); @@ -1392,15 +1407,11 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) lazy_cleanup_all_indexes(vacrel); /* - * Free resources managed by dead_items_alloc. This will end parallel - * mode when needed (it must end before updating index statistics as we - * can't write in parallel mode). + * Free resources managed by dead_items_alloc. This ends parallel mode in + * passing when necessary. */ dead_items_cleanup(vacrel); - - /* Update index statistics */ - if (vacrel->nindexes > 0 && vacrel->do_index_cleanup) - update_index_statistics(vacrel); + Assert(!IsInParallelMode()); } /* @@ -1559,7 +1570,6 @@ lazy_scan_prune(LVRelState *vacrel, Buffer buf, BlockNumber blkno, Page page, - GlobalVisState *vistest, LVPagePruneState *prunestate) { Relation rel = vacrel->rel; @@ -1598,7 +1608,7 @@ lazy_scan_prune(LVRelState *vacrel, * lpdead_items's final value can be thought of as the number of tuples * that were deleted from indexes. */ - tuples_deleted = heap_page_prune(rel, buf, vistest, + tuples_deleted = heap_page_prune(rel, buf, vacrel->vistest, InvalidTransactionId, 0, &nnewlpdead, &vacrel->offnum); @@ -2292,8 +2302,6 @@ lazy_vacuum_all_indexes(LVRelState *vacrel) Assert(vacrel->nindexes > 0); Assert(vacrel->do_index_vacuuming); Assert(vacrel->do_index_cleanup); - Assert(TransactionIdIsNormal(vacrel->relfrozenxid)); - Assert(MultiXactIdIsValid(vacrel->relminmxid)); /* Precheck for XID wraparound emergencies */ if (lazy_check_wraparound_failsafe(vacrel)) @@ -2604,6 +2612,9 @@ lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, Buffer buffer, static bool lazy_check_wraparound_failsafe(LVRelState *vacrel) { + Assert(TransactionIdIsNormal(vacrel->relfrozenxid)); + Assert(MultiXactIdIsValid(vacrel->relminmxid)); + /* Don't warn more than once per VACUUM */ if (vacrel->failsafe_active) return true; @@ -2644,6 +2655,10 @@ lazy_check_wraparound_failsafe(LVRelState *vacrel) static void lazy_cleanup_all_indexes(LVRelState *vacrel) { + double reltuples = vacrel->new_rel_tuples; + bool estimated_count = vacrel->scanned_pages < vacrel->rel_pages; + + Assert(vacrel->do_index_cleanup); Assert(vacrel->nindexes > 0); /* Report that we are now cleaning up indexes */ @@ -2652,10 +2667,6 @@ lazy_cleanup_all_indexes(LVRelState *vacrel) if (!ParallelVacuumIsActive(vacrel)) { - double reltuples = vacrel->new_rel_tuples; - bool estimated_count = - vacrel->scanned_pages < vacrel->rel_pages; - for (int idx = 0; idx < vacrel->nindexes; idx++) { Relation indrel = vacrel->indrels[idx]; @@ -2669,9 +2680,9 @@ lazy_cleanup_all_indexes(LVRelState *vacrel) else { /* Outsource everything to parallel variant */ - parallel_vacuum_cleanup_all_indexes(vacrel->pvs, vacrel->new_rel_tuples, + parallel_vacuum_cleanup_all_indexes(vacrel->pvs, reltuples, vacrel->num_index_scans, - (vacrel->scanned_pages < vacrel->rel_pages)); + estimated_count); } } @@ -2797,27 +2808,23 @@ lazy_cleanup_one_index(Relation indrel, IndexBulkDeleteResult *istat, * Also don't attempt it if we are doing early pruning/vacuuming, because a * scan which cannot find a truncated heap page cannot determine that the * snapshot is too old to read that page. - * - * This is split out so that we can test whether truncation is going to be - * called for before we actually do it. If you change the logic here, be - * careful to depend only on fields that lazy_scan_heap updates on-the-fly. */ static bool should_attempt_truncation(LVRelState *vacrel) { BlockNumber possibly_freeable; - if (!vacrel->do_rel_truncate || vacrel->failsafe_active) + if (!vacrel->do_rel_truncate || vacrel->failsafe_active || + old_snapshot_threshold >= 0) return false; possibly_freeable = vacrel->rel_pages - vacrel->nonempty_pages; if (possibly_freeable > 0 && (possibly_freeable >= REL_TRUNCATE_MINIMUM || - possibly_freeable >= vacrel->rel_pages / REL_TRUNCATE_FRACTION) && - old_snapshot_threshold < 0) + possibly_freeable >= vacrel->rel_pages / REL_TRUNCATE_FRACTION)) return true; - else - return false; + + return false; } /* @@ -2835,6 +2842,10 @@ lazy_truncate_heap(LVRelState *vacrel) pgstat_progress_update_param(PROGRESS_VACUUM_PHASE, PROGRESS_VACUUM_PHASE_TRUNCATE); + /* Update error traceback information one last time */ + update_vacuum_error_info(vacrel, NULL, VACUUM_ERRCB_PHASE_TRUNCATE, + vacrel->nonempty_pages, InvalidOffsetNumber); + /* * Loop until no more truncating can be done. */ @@ -3328,13 +3339,13 @@ heap_page_is_all_visible(LVRelState *vacrel, Buffer buf, * Update index statistics in pg_class if the statistics are accurate. */ static void -update_index_statistics(LVRelState *vacrel) +update_relstats_all_indexes(LVRelState *vacrel) { Relation *indrels = vacrel->indrels; int nindexes = vacrel->nindexes; IndexBulkDeleteResult **indstats = vacrel->indstats; - Assert(!IsInParallelMode()); + Assert(vacrel->do_index_cleanup); for (int idx = 0; idx < nindexes; idx++) { From e370f100f05d77eec258fb430009c16c0e315065 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Sat, 12 Mar 2022 13:20:45 -0800 Subject: [PATCH 128/772] vacuumlazy.c: Standardize rel_pages terminology. VACUUM's rel_pages field indicates the size of the target heap rel just after the table_relation_vacuum() operation began. There are specific expectations around how rel_pages can be related to other nearby state. In particular, the range of rel_pages must contain every tuple in the relation whose tuple headers might contain an XID < OldestXmin. Consistently refer to the field as rel_pages to make this clearer and more discoverable. This is follow-up work to commit 73f6ec3d from earlier today. Author: Peter Geoghegan Reviewed-By: Andres Freund Discussion: https://postgr.es/m/20220311031351.sbge5m2bpvy2ttxg@alap3.anarazel.de --- src/backend/access/heap/vacuumlazy.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 7982139baa..620b7a7af5 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -825,7 +825,7 @@ static void lazy_scan_heap(LVRelState *vacrel, int nworkers) { VacDeadItems *dead_items; - BlockNumber nblocks = vacrel->rel_pages, + BlockNumber rel_pages = vacrel->rel_pages, blkno, next_unskippable_block, next_failsafe_block, @@ -858,7 +858,7 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) /* Report that we're scanning the heap, advertising total # of blocks */ initprog_val[0] = PROGRESS_VACUUM_PHASE_SCAN_HEAP; - initprog_val[1] = nblocks; + initprog_val[1] = rel_pages; initprog_val[2] = dead_items->max_items; pgstat_progress_update_multi_param(3, initprog_index, initprog_val); @@ -882,9 +882,9 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) * Before entering the main loop, establish the invariant that * next_unskippable_block is the next block number >= blkno that we can't * skip based on the visibility map, either all-visible for a regular scan - * or all-frozen for an aggressive scan. We set it to nblocks if there's - * no such block. We also set up the skipping_blocks flag correctly at - * this stage. + * or all-frozen for an aggressive scan. We set it to rel_pages when + * there's no such block. We also set up the skipping_blocks flag + * correctly at this stage. * * Note: The value returned by visibilitymap_get_status could be slightly * out-of-date, since we make this test before reading the corresponding @@ -902,7 +902,7 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) next_unskippable_block = 0; if (vacrel->skipwithvm) { - while (next_unskippable_block < nblocks) + while (next_unskippable_block < rel_pages) { uint8 vmstatus; @@ -929,7 +929,7 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) else skipping_blocks = false; - for (blkno = 0; blkno < nblocks; blkno++) + for (blkno = 0; blkno < rel_pages; blkno++) { Buffer buf; Page page; @@ -947,7 +947,7 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) next_unskippable_block++; if (vacrel->skipwithvm) { - while (next_unskippable_block < nblocks) + while (next_unskippable_block < rel_pages) { uint8 vmskipflags; @@ -992,7 +992,7 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) /* * The current page can be skipped if we've seen a long enough run * of skippable blocks to justify skipping it -- provided it's not - * the last page in the relation (according to rel_pages/nblocks). + * the last page in the relation (according to rel_pages). * * We always scan the table's last page to determine whether it * has tuples or not, even if it would otherwise be skipped. This @@ -1000,7 +1000,7 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) * on the table to attempt a truncation that just fails * immediately because there are tuples on the last page. */ - if (skipping_blocks && blkno < nblocks - 1) + if (skipping_blocks && blkno < rel_pages - 1) { /* * Tricky, tricky. If this is in aggressive vacuum, the page @@ -1367,7 +1367,7 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) vacrel->blkno = InvalidBlockNumber; /* now we can compute the new value for pg_class.reltuples */ - vacrel->new_live_tuples = vac_estimate_reltuples(vacrel->rel, nblocks, + vacrel->new_live_tuples = vac_estimate_reltuples(vacrel->rel, rel_pages, vacrel->scanned_pages, vacrel->live_tuples); From 02fea8fdda6531f34305b445f92f5b62241329b3 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 12 Mar 2022 14:04:50 -0800 Subject: [PATCH 129/772] Set synchronous_commit=on in test_setup.sql. Starting in cc50080a82 create_index test fails when run with synchronous_commit=off. synchronous_commit=off delays when hint bits may be set. Some plans change depending on the number of all-visible pages, which in turn can be influenced by the delayed hint bits. Force synchronous_commit to `on` in test_setup.sql. Not very satisfying, but there's no obvious alternative. Reported-By: Aleksander Alekseev Author: Andres Freund Author: Aleksander Alekseev Discussion: https://www.postgresql.org/message-id/flat/CAJ7c6TPJNof1Q+vJsy3QebgbPgXdu2ErPvYkBdhD6_Ckv5EZRg@mail.gmail.com --- src/test/regress/expected/test_setup.out | 7 +++++++ src/test/regress/sql/test_setup.sql | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/src/test/regress/expected/test_setup.out b/src/test/regress/expected/test_setup.out index 98e08cb6eb..a9d0de3dea 100644 --- a/src/test/regress/expected/test_setup.out +++ b/src/test/regress/expected/test_setup.out @@ -7,6 +7,13 @@ \getenv dlsuffix PG_DLSUFFIX \set regresslib :libdir '/regress' :dlsuffix -- +-- synchronous_commit=off delays when hint bits may be set. Some plans change +-- depending on the number of all-visible pages, which in turn can be +-- influenced by the delayed hint bits. Force synchronous_commit=on to avoid +-- that source of variability. +-- +SET synchronous_commit = on; +-- -- Postgres formerly made the public schema read/write by default, -- and most of the core regression tests still expect that. -- diff --git a/src/test/regress/sql/test_setup.sql b/src/test/regress/sql/test_setup.sql index d0a73c473d..1f3f2f1724 100644 --- a/src/test/regress/sql/test_setup.sql +++ b/src/test/regress/sql/test_setup.sql @@ -9,6 +9,14 @@ \set regresslib :libdir '/regress' :dlsuffix +-- +-- synchronous_commit=off delays when hint bits may be set. Some plans change +-- depending on the number of all-visible pages, which in turn can be +-- influenced by the delayed hint bits. Force synchronous_commit=on to avoid +-- that source of variability. +-- +SET synchronous_commit = on; + -- -- Postgres formerly made the public schema read/write by default, -- and most of the core regression tests still expect that. From 7e12256b478b89518ff410f29192af21de37d070 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 12 Mar 2022 14:21:40 -0800 Subject: [PATCH 130/772] Force track_io_timing off in explain.sql to avoid failures when enabled. Discussion: https://postgr.es/m/20201029231037.rkxo57ugnuchykpu@alap3.anarazel.de --- src/test/regress/expected/explain.out | 7 +++++-- src/test/regress/sql/explain.sql | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/test/regress/expected/explain.out b/src/test/regress/expected/explain.out index 1734dfee8c..bc36175921 100644 --- a/src/test/regress/expected/explain.out +++ b/src/test/regress/expected/explain.out @@ -47,9 +47,12 @@ begin return data::jsonb; end; $$; --- Also, disable JIT, or we'll get different output on machines --- where that's been forced on +-- Disable JIT, or we'll get different output on machines where that's been +-- forced on set jit = off; +-- Similarly, disable track_io_timing, to avoid output differences when +-- enabled. +set track_io_timing = off; -- Simple cases select explain_filter('explain select * from int8_tbl i8'); explain_filter diff --git a/src/test/regress/sql/explain.sql b/src/test/regress/sql/explain.sql index 84549c78fa..5069fa8795 100644 --- a/src/test/regress/sql/explain.sql +++ b/src/test/regress/sql/explain.sql @@ -51,10 +51,13 @@ begin end; $$; --- Also, disable JIT, or we'll get different output on machines --- where that's been forced on +-- Disable JIT, or we'll get different output on machines where that's been +-- forced on set jit = off; +-- Similarly, disable track_io_timing, to avoid output differences when +-- enabled. +set track_io_timing = off; -- Simple cases From 6e20f4600a420961817ce743be454080745f84d1 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Sun, 13 Mar 2022 13:07:49 -0700 Subject: [PATCH 131/772] VACUUM VERBOSE: tweak scanned_pages logic. Commit 872770fd6c taught VACUUM VERBOSE and autovacuum logging to display the total number of pages scanned by VACUUM. This information was also displayed as a percentage of rel_pages in parenthesis, which makes it easy to spot trends over time and across tables. The instrumentation displayed "0 scanned (0.00% of total)" for totally empty tables. Tweak the instrumentation: have it show "0 scanned (100.00% of total)" for empty tables instead. This approach is clearer and more consistent. --- src/backend/access/heap/vacuumlazy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 620b7a7af5..87ab7775ae 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -676,7 +676,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, vacrel->removed_pages, vacrel->rel_pages, vacrel->scanned_pages, - orig_rel_pages == 0 ? 0 : + orig_rel_pages == 0 ? 100.0 : 100.0 * vacrel->scanned_pages / orig_rel_pages); appendStringInfo(&buf, _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"), From 369398ed886dc13956654777467536625e6fc7ee Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 13 Mar 2022 19:52:48 -0400 Subject: [PATCH 132/772] Fix bogus tab-completion queries. My (tgl's) thinko in commit 02b8048ba: I forgot that the first argument of COMPLETE_WITH_QUERY_PLUS is a format string, and hence failed to double a literal %. These two places seem to be the only ones that are wrong, though. Vignesh C Discussion: https://postgr.es/m/CALDaNm0hBO+tZqBWhBjTVxyET1GWANq5K9XpQ07atSxnFXbG7w@mail.gmail.com --- src/bin/psql/tab-complete.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 6957567264..6d5c928c10 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1811,7 +1811,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("(", "ALL TABLES IN SCHEMA", "TABLE"); else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD|DROP|SET", "ALL", "TABLES", "IN", "SCHEMA")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas - " AND nspname NOT LIKE E'pg\\\\_%'", + " AND nspname NOT LIKE E'pg\\\\_%%'", "CURRENT_SCHEMA"); /* ALTER PUBLICATION SET ( */ else if (HeadMatches("ALTER", "PUBLICATION", MatchAny) && TailMatches("SET", "(")) @@ -2956,7 +2956,7 @@ psql_completion(const char *text, int start, int end) */ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES", "IN", "SCHEMA")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas - " AND nspname NOT LIKE E'pg\\\\_%'", + " AND nspname NOT LIKE E'pg\\\\_%%'", "CURRENT_SCHEMA"); else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES", "IN", "SCHEMA", MatchAny) && (!ends_with(prev_wd, ','))) COMPLETE_WITH("WITH ("); From 705e20f8550c0e8e47c0b6b20b5f5ffd6ffd9e33 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Mon, 14 Mar 2022 09:32:40 +0530 Subject: [PATCH 133/772] Optionally disable subscriptions on error. Logical replication apply workers for a subscription can easily get stuck in an infinite loop of attempting to apply a change, triggering an error (such as a constraint violation), exiting with the error written to the subscription server log, and restarting. To partially remedy the situation, this patch adds a new subscription option named 'disable_on_error'. To be consistent with old behavior, this option defaults to false. When true, both the tablesync worker and apply worker catch any errors thrown and disable the subscription in order to break the loop. The error is still also written in the logs. Once the subscription is disabled, users can either manually resolve the conflict/error or skip the conflicting transaction by using pg_replication_origin_advance() function. After resolving the conflict, users need to enable the subscription to allow apply process to proceed. Author: Osumi Takamichi and Mark Dilger Reviewed-by: Greg Nancarrow, Vignesh C, Amit Kapila, Wang wei, Tang Haiying, Peter Smith, Masahiko Sawada, Shi Yu Discussion : https://postgr.es/m/DB35438F-9356-4841-89A0-412709EBD3AB%40enterprisedb.com --- doc/src/sgml/catalogs.sgml | 10 ++ doc/src/sgml/logical-replication.sgml | 5 +- doc/src/sgml/ref/alter_subscription.sgml | 4 +- doc/src/sgml/ref/create_subscription.sgml | 12 ++ src/backend/catalog/pg_subscription.c | 40 +++++ src/backend/catalog/system_views.sql | 3 +- src/backend/commands/subscriptioncmds.c | 27 ++- src/backend/replication/logical/worker.c | 162 +++++++++++++----- src/bin/pg_dump/pg_dump.c | 14 +- src/bin/pg_dump/pg_dump.h | 1 + src/bin/psql/describe.c | 10 +- src/bin/psql/tab-complete.c | 4 +- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_subscription.h | 7 + src/test/regress/expected/subscription.out | 119 +++++++------ src/test/regress/sql/subscription.sql | 15 ++ .../subscription/t/029_disable_on_error.pl | 94 ++++++++++ 17 files changed, 421 insertions(+), 108 deletions(-) create mode 100644 src/test/subscription/t/029_disable_on_error.pl diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 83987a9904..7777d60514 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -7769,6 +7769,16 @@ SCRAM-SHA-256$<iteration count>:&l + + + subdisableonerr bool + + + If true, the subscription will be disabled if one of its workers + detects an error + + + subconninfo text diff --git a/doc/src/sgml/logical-replication.sgml b/doc/src/sgml/logical-replication.sgml index 82326c3901..6431d4796d 100644 --- a/doc/src/sgml/logical-replication.sgml +++ b/doc/src/sgml/logical-replication.sgml @@ -364,8 +364,9 @@ CONTEXT: processing remote data for replication origin "pg_16395" during "INSER the replication origin name can be found from the server log (LSN 0/14C0378 and replication origin pg_16395 in the above case). To skip the transaction, the subscription needs to be disabled temporarily by - ALTER SUBSCRIPTION ... DISABLE first. Then, the transaction - can be skipped by calling the + ALTER SUBSCRIPTION ... DISABLE first or alternatively, the + subscription can be used with the disable_on_error option. + Then, the transaction can be skipped by calling the pg_replication_origin_advance() function with the node_name (i.e., pg_16395) and the diff --git a/doc/src/sgml/ref/alter_subscription.sgml b/doc/src/sgml/ref/alter_subscription.sgml index 0d6f064f58..58b78a94ea 100644 --- a/doc/src/sgml/ref/alter_subscription.sgml +++ b/doc/src/sgml/ref/alter_subscription.sgml @@ -204,8 +204,8 @@ ALTER SUBSCRIPTION name RENAME TO < information. The parameters that can be altered are slot_name, synchronous_commit, - binary, and - streaming. + binary, streaming, and + disable_on_error. diff --git a/doc/src/sgml/ref/create_subscription.sgml b/doc/src/sgml/ref/create_subscription.sgml index e80a2617a3..b701752fc9 100644 --- a/doc/src/sgml/ref/create_subscription.sgml +++ b/doc/src/sgml/ref/create_subscription.sgml @@ -290,6 +290,18 @@ CREATE SUBSCRIPTION subscription_name + + + disable_on_error (boolean) + + + Specifies whether the subscription should be automatically disabled + if any errors are detected by subscription workers during data + replication from the publisher. The default is + false. + + + diff --git a/src/backend/catalog/pg_subscription.c b/src/backend/catalog/pg_subscription.c index ca65a8bd20..a6304f5f81 100644 --- a/src/backend/catalog/pg_subscription.c +++ b/src/backend/catalog/pg_subscription.c @@ -69,6 +69,7 @@ GetSubscription(Oid subid, bool missing_ok) sub->binary = subform->subbinary; sub->stream = subform->substream; sub->twophasestate = subform->subtwophasestate; + sub->disableonerr = subform->subdisableonerr; /* Get conninfo */ datum = SysCacheGetAttr(SUBSCRIPTIONOID, @@ -156,6 +157,45 @@ FreeSubscription(Subscription *sub) pfree(sub); } +/* + * Disable the given subscription. + */ +void +DisableSubscription(Oid subid) +{ + Relation rel; + bool nulls[Natts_pg_subscription]; + bool replaces[Natts_pg_subscription]; + Datum values[Natts_pg_subscription]; + HeapTuple tup; + + /* Look up the subscription in the catalog */ + rel = table_open(SubscriptionRelationId, RowExclusiveLock); + tup = SearchSysCacheCopy1(SUBSCRIPTIONOID, ObjectIdGetDatum(subid)); + + if (!HeapTupleIsValid(tup)) + elog(ERROR, "cache lookup failed for subscription %u", subid); + + LockSharedObject(SubscriptionRelationId, subid, 0, AccessShareLock); + + /* Form a new tuple. */ + memset(values, 0, sizeof(values)); + memset(nulls, false, sizeof(nulls)); + memset(replaces, false, sizeof(replaces)); + + /* Set the subscription to disabled. */ + values[Anum_pg_subscription_subenabled - 1] = BoolGetDatum(false); + replaces[Anum_pg_subscription_subenabled - 1] = true; + + /* Update the catalog */ + tup = heap_modify_tuple(tup, RelationGetDescr(rel), values, nulls, + replaces); + CatalogTupleUpdate(rel, &tup->t_self, tup); + heap_freetuple(tup); + + table_close(rel, NoLock); +} + /* * get_subscription_oid - given a subscription name, look up the OID * diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 40b7bca5a9..bb1ac30cd1 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -1261,7 +1261,8 @@ REVOKE ALL ON pg_replication_origin_status FROM public; -- All columns of pg_subscription except subconninfo are publicly readable. REVOKE ALL ON pg_subscription FROM public; GRANT SELECT (oid, subdbid, subname, subowner, subenabled, subbinary, - substream, subtwophasestate, subslotname, subsynccommit, subpublications) + substream, subtwophasestate, subdisableonerr, subslotname, + subsynccommit, subpublications) ON pg_subscription TO public; CREATE VIEW pg_stat_subscription_stats AS diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 3ef6607d24..3922658bbc 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -61,6 +61,7 @@ #define SUBOPT_BINARY 0x00000080 #define SUBOPT_STREAMING 0x00000100 #define SUBOPT_TWOPHASE_COMMIT 0x00000200 +#define SUBOPT_DISABLE_ON_ERR 0x00000400 /* check if the 'val' has 'bits' set */ #define IsSet(val, bits) (((val) & (bits)) == (bits)) @@ -82,6 +83,7 @@ typedef struct SubOpts bool binary; bool streaming; bool twophase; + bool disableonerr; } SubOpts; static List *fetch_table_list(WalReceiverConn *wrconn, List *publications); @@ -130,6 +132,8 @@ parse_subscription_options(ParseState *pstate, List *stmt_options, opts->streaming = false; if (IsSet(supported_opts, SUBOPT_TWOPHASE_COMMIT)) opts->twophase = false; + if (IsSet(supported_opts, SUBOPT_DISABLE_ON_ERR)) + opts->disableonerr = false; /* Parse options */ foreach(lc, stmt_options) @@ -249,6 +253,15 @@ parse_subscription_options(ParseState *pstate, List *stmt_options, opts->specified_opts |= SUBOPT_TWOPHASE_COMMIT; opts->twophase = defGetBoolean(defel); } + else if (IsSet(supported_opts, SUBOPT_DISABLE_ON_ERR) && + strcmp(defel->defname, "disable_on_error") == 0) + { + if (IsSet(opts->specified_opts, SUBOPT_DISABLE_ON_ERR)) + errorConflictingDefElem(defel, pstate); + + opts->specified_opts |= SUBOPT_DISABLE_ON_ERR; + opts->disableonerr = defGetBoolean(defel); + } else ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -390,7 +403,8 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, supported_opts = (SUBOPT_CONNECT | SUBOPT_ENABLED | SUBOPT_CREATE_SLOT | SUBOPT_SLOT_NAME | SUBOPT_COPY_DATA | SUBOPT_SYNCHRONOUS_COMMIT | SUBOPT_BINARY | - SUBOPT_STREAMING | SUBOPT_TWOPHASE_COMMIT); + SUBOPT_STREAMING | SUBOPT_TWOPHASE_COMMIT | + SUBOPT_DISABLE_ON_ERR); parse_subscription_options(pstate, stmt->options, supported_opts, &opts); /* @@ -464,6 +478,7 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, CharGetDatum(opts.twophase ? LOGICALREP_TWOPHASE_STATE_PENDING : LOGICALREP_TWOPHASE_STATE_DISABLED); + values[Anum_pg_subscription_subdisableonerr - 1] = BoolGetDatum(opts.disableonerr); values[Anum_pg_subscription_subconninfo - 1] = CStringGetTextDatum(conninfo); if (opts.slot_name) @@ -864,7 +879,7 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, { supported_opts = (SUBOPT_SLOT_NAME | SUBOPT_SYNCHRONOUS_COMMIT | SUBOPT_BINARY | - SUBOPT_STREAMING); + SUBOPT_STREAMING | SUBOPT_DISABLE_ON_ERR); parse_subscription_options(pstate, stmt->options, supported_opts, &opts); @@ -913,6 +928,14 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, replaces[Anum_pg_subscription_substream - 1] = true; } + if (IsSet(opts.specified_opts, SUBOPT_DISABLE_ON_ERR)) + { + values[Anum_pg_subscription_subdisableonerr - 1] + = BoolGetDatum(opts.disableonerr); + replaces[Anum_pg_subscription_subdisableonerr - 1] + = true; + } + update_tuple = true; break; } diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 8653e1d840..a1fe81b34f 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -305,6 +305,8 @@ static void store_flush_position(XLogRecPtr remote_lsn); static void maybe_reread_subscription(void); +static void DisableSubscriptionAndExit(void); + /* prototype needed because of stream_commit */ static void apply_dispatch(StringInfo s); @@ -3374,6 +3376,84 @@ TwoPhaseTransactionGid(Oid subid, TransactionId xid, char *gid, int szgid) snprintf(gid, szgid, "pg_gid_%u_%u", subid, xid); } +/* + * Execute the initial sync with error handling. Disable the subscription, + * if it's required. + * + * Allocate the slot name in long-lived context on return. Note that we don't + * handle FATAL errors which are probably because of system resource error and + * are not repeatable. + */ +static void +start_table_sync(XLogRecPtr *origin_startpos, char **myslotname) +{ + char *syncslotname; + + Assert(am_tablesync_worker()); + + PG_TRY(); + { + /* Call initial sync. */ + syncslotname = LogicalRepSyncTableStart(origin_startpos); + } + PG_CATCH(); + { + if (MySubscription->disableonerr) + DisableSubscriptionAndExit(); + else + { + /* + * Report the worker failed during table synchronization. Abort + * the current transaction so that the stats message is sent in an + * idle state. + */ + AbortOutOfAnyTransaction(); + pgstat_report_subscription_error(MySubscription->oid, false); + + PG_RE_THROW(); + } + } + PG_END_TRY(); + + /* allocate slot name in long-lived context */ + *myslotname = MemoryContextStrdup(ApplyContext, syncslotname); + pfree(syncslotname); +} + +/* + * Run the apply loop with error handling. Disable the subscription, + * if necessary. + * + * Note that we don't handle FATAL errors which are probably because + * of system resource error and are not repeatable. + */ +static void +start_apply(XLogRecPtr origin_startpos) +{ + PG_TRY(); + { + LogicalRepApplyLoop(origin_startpos); + } + PG_CATCH(); + { + if (MySubscription->disableonerr) + DisableSubscriptionAndExit(); + else + { + /* + * Report the worker failed while applying changes. Abort the + * current transaction so that the stats message is sent in an + * idle state. + */ + AbortOutOfAnyTransaction(); + pgstat_report_subscription_error(MySubscription->oid, !am_tablesync_worker()); + + PG_RE_THROW(); + } + } + PG_END_TRY(); +} + /* Logical Replication Apply worker entry point */ void ApplyWorkerMain(Datum main_arg) @@ -3381,8 +3461,8 @@ ApplyWorkerMain(Datum main_arg) int worker_slot = DatumGetInt32(main_arg); MemoryContext oldctx; char originname[NAMEDATALEN]; - XLogRecPtr origin_startpos; - char *myslotname; + XLogRecPtr origin_startpos = InvalidXLogRecPtr; + char *myslotname = NULL; WalRcvStreamOptions options; int server_version; @@ -3477,32 +3557,7 @@ ApplyWorkerMain(Datum main_arg) if (am_tablesync_worker()) { - char *syncslotname; - - PG_TRY(); - { - /* This is table synchronization worker, call initial sync. */ - syncslotname = LogicalRepSyncTableStart(&origin_startpos); - } - PG_CATCH(); - { - /* - * Abort the current transaction so that we send the stats message - * in an idle state. - */ - AbortOutOfAnyTransaction(); - - /* Report the worker failed during table synchronization */ - pgstat_report_subscription_error(MySubscription->oid, false); - - PG_RE_THROW(); - } - PG_END_TRY(); - - /* allocate slot name in long-lived context */ - myslotname = MemoryContextStrdup(ApplyContext, syncslotname); - - pfree(syncslotname); + start_table_sync(&origin_startpos, &myslotname); /* * Allocate the origin name in long-lived context for error context @@ -3633,24 +3688,43 @@ ApplyWorkerMain(Datum main_arg) } /* Run the main loop. */ - PG_TRY(); - { - LogicalRepApplyLoop(origin_startpos); - } - PG_CATCH(); - { - /* - * Abort the current transaction so that we send the stats message in - * an idle state. - */ - AbortOutOfAnyTransaction(); + start_apply(origin_startpos); - /* Report the worker failed while applying changes */ - pgstat_report_subscription_error(MySubscription->oid, !am_tablesync_worker()); + proc_exit(0); +} - PG_RE_THROW(); - } - PG_END_TRY(); +/* + * After error recovery, disable the subscription in a new transaction + * and exit cleanly. + */ +static void +DisableSubscriptionAndExit(void) +{ + /* + * Emit the error message, and recover from the error state to an idle + * state + */ + HOLD_INTERRUPTS(); + + EmitErrorReport(); + AbortOutOfAnyTransaction(); + FlushErrorState(); + + RESUME_INTERRUPTS(); + + /* Report the worker failed during either table synchronization or apply */ + pgstat_report_subscription_error(MyLogicalRepWorker->subid, + !am_tablesync_worker()); + + /* Disable the subscription */ + StartTransactionCommand(); + DisableSubscription(MySubscription->oid); + CommitTransactionCommand(); + + /* Notify the subscription has been disabled and exit */ + ereport(LOG, + errmsg("logical replication subscription \"%s\" has been disabled due to an error", + MySubscription->name)); proc_exit(0); } diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index e69dcf8a48..4dd24b8c89 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -4293,6 +4293,7 @@ getSubscriptions(Archive *fout) int i_subowner; int i_substream; int i_subtwophasestate; + int i_subdisableonerr; int i_subconninfo; int i_subslotname; int i_subsynccommit; @@ -4340,10 +4341,13 @@ getSubscriptions(Archive *fout) appendPQExpBufferStr(query, " false AS substream,\n"); if (fout->remoteVersion >= 150000) - appendPQExpBufferStr(query, " s.subtwophasestate\n"); + appendPQExpBufferStr(query, + " s.subtwophasestate,\n" + " s.subdisableonerr\n"); else appendPQExpBuffer(query, - " '%c' AS subtwophasestate\n", + " '%c' AS subtwophasestate,\n" + " false AS subdisableonerr\n", LOGICALREP_TWOPHASE_STATE_DISABLED); appendPQExpBufferStr(query, @@ -4366,6 +4370,7 @@ getSubscriptions(Archive *fout) i_subbinary = PQfnumber(res, "subbinary"); i_substream = PQfnumber(res, "substream"); i_subtwophasestate = PQfnumber(res, "subtwophasestate"); + i_subdisableonerr = PQfnumber(res, "subdisableonerr"); subinfo = pg_malloc(ntups * sizeof(SubscriptionInfo)); @@ -4393,6 +4398,8 @@ getSubscriptions(Archive *fout) pg_strdup(PQgetvalue(res, i, i_substream)); subinfo[i].subtwophasestate = pg_strdup(PQgetvalue(res, i, i_subtwophasestate)); + subinfo[i].subdisableonerr = + pg_strdup(PQgetvalue(res, i, i_subdisableonerr)); /* Decide whether we want to dump it */ selectDumpableObject(&(subinfo[i].dobj), fout); @@ -4463,6 +4470,9 @@ dumpSubscription(Archive *fout, const SubscriptionInfo *subinfo) if (strcmp(subinfo->subtwophasestate, two_phase_disabled) != 0) appendPQExpBufferStr(query, ", two_phase = on"); + if (strcmp(subinfo->subdisableonerr, "t") == 0) + appendPQExpBufferStr(query, ", disable_on_error = true"); + if (strcmp(subinfo->subsynccommit, "off") != 0) appendPQExpBuffer(query, ", synchronous_commit = %s", fmtId(subinfo->subsynccommit)); diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 997a3b6071..772dc0cf7a 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -657,6 +657,7 @@ typedef struct _SubscriptionInfo char *subbinary; char *substream; char *subtwophasestate; + char *subdisableonerr; char *subsynccommit; char *subpublications; } SubscriptionInfo; diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index e3382933d9..9229eacb6d 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -6084,7 +6084,7 @@ describeSubscriptions(const char *pattern, bool verbose) PGresult *res; printQueryOpt myopt = pset.popt; static const bool translate_columns[] = {false, false, false, false, - false, false, false, false, false}; + false, false, false, false, false, false}; if (pset.sversion < 100000) { @@ -6118,11 +6118,13 @@ describeSubscriptions(const char *pattern, bool verbose) gettext_noop("Binary"), gettext_noop("Streaming")); - /* Two_phase is only supported in v15 and higher */ + /* Two_phase and disable_on_error are only supported in v15 and higher */ if (pset.sversion >= 150000) appendPQExpBuffer(&buf, - ", subtwophasestate AS \"%s\"\n", - gettext_noop("Two phase commit")); + ", subtwophasestate AS \"%s\"\n" + ", subdisableonerr AS \"%s\"\n", + gettext_noop("Two phase commit"), + gettext_noop("Disable on error")); appendPQExpBuffer(&buf, ", subsynccommit AS \"%s\"\n" diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 6d5c928c10..17172827a9 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1834,7 +1834,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("(", "PUBLICATION"); /* ALTER SUBSCRIPTION SET ( */ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) && TailMatches("SET", "(")) - COMPLETE_WITH("binary", "slot_name", "streaming", "synchronous_commit"); + COMPLETE_WITH("binary", "slot_name", "streaming", "synchronous_commit", "disable_on_error"); /* ALTER SUBSCRIPTION SET PUBLICATION */ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) && TailMatches("SET", "PUBLICATION")) { @@ -3104,7 +3104,7 @@ psql_completion(const char *text, int start, int end) else if (HeadMatches("CREATE", "SUBSCRIPTION") && TailMatches("WITH", "(")) COMPLETE_WITH("binary", "connect", "copy_data", "create_slot", "enabled", "slot_name", "streaming", - "synchronous_commit", "two_phase"); + "synchronous_commit", "two_phase", "disable_on_error"); /* CREATE TRIGGER --- is allowed inside CREATE SCHEMA, so use TailMatches */ diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 695990959e..1aa1d41e79 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202203031 +#define CATALOG_VERSION_NO 202203141 #endif diff --git a/src/include/catalog/pg_subscription.h b/src/include/catalog/pg_subscription.h index 18c291289f..e2befaf351 100644 --- a/src/include/catalog/pg_subscription.h +++ b/src/include/catalog/pg_subscription.h @@ -67,6 +67,9 @@ CATALOG(pg_subscription,6100,SubscriptionRelationId) BKI_SHARED_RELATION BKI_ROW char subtwophasestate; /* Stream two-phase transactions */ + bool subdisableonerr; /* True if a worker error should cause the + * subscription to be disabled */ + #ifdef CATALOG_VARLEN /* variable-length fields start here */ /* Connection string to the publisher */ text subconninfo BKI_FORCE_NOT_NULL; @@ -103,6 +106,9 @@ typedef struct Subscription * binary format */ bool stream; /* Allow streaming in-progress transactions. */ char twophasestate; /* Allow streaming two-phase transactions */ + bool disableonerr; /* Indicates if the subscription should be + * automatically disabled if a worker error + * occurs */ char *conninfo; /* Connection string to the publisher */ char *slotname; /* Name of the replication slot */ char *synccommit; /* Synchronous commit setting for worker */ @@ -111,6 +117,7 @@ typedef struct Subscription extern Subscription *GetSubscription(Oid subid, bool missing_ok); extern void FreeSubscription(Subscription *sub); +extern void DisableSubscription(Oid subid); extern Oid get_subscription_oid(const char *subname, bool missing_ok); extern char *get_subscription_name(Oid subid, bool missing_ok); diff --git a/src/test/regress/expected/subscription.out b/src/test/regress/expected/subscription.out index 80aae83562..ad8003fae1 100644 --- a/src/test/regress/expected/subscription.out +++ b/src/test/regress/expected/subscription.out @@ -76,10 +76,10 @@ ALTER SUBSCRIPTION regress_testsub CONNECTION 'foobar'; ERROR: invalid connection string syntax: missing "=" after "foobar" in connection info string \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist (1 row) ALTER SUBSCRIPTION regress_testsub SET PUBLICATION testpub2, testpub3 WITH (refresh = false); @@ -94,10 +94,10 @@ ERROR: subscription "regress_doesnotexist" does not exist ALTER SUBSCRIPTION regress_testsub SET (create_slot = false); ERROR: unrecognized subscription parameter: "create_slot" \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Synchronous commit | Conninfo ------------------+---------------------------+---------+---------------------+--------+-----------+------------------+--------------------+------------------------------ - regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | f | d | off | dbname=regress_doesnotexist2 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo +-----------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------------------+------------------------------ + regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | f | d | f | off | dbname=regress_doesnotexist2 (1 row) BEGIN; @@ -129,10 +129,10 @@ ALTER SUBSCRIPTION regress_testsub_foo SET (synchronous_commit = foobar); ERROR: invalid value for parameter "synchronous_commit": "foobar" HINT: Available values: local, remote_write, remote_apply, on, off. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Synchronous commit | Conninfo ----------------------+---------------------------+---------+---------------------+--------+-----------+------------------+--------------------+------------------------------ - regress_testsub_foo | regress_subscription_user | f | {testpub2,testpub3} | f | f | d | local | dbname=regress_doesnotexist2 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo +---------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------------------+------------------------------ + regress_testsub_foo | regress_subscription_user | f | {testpub2,testpub3} | f | f | d | f | local | dbname=regress_doesnotexist2 (1 row) -- rename back to keep the rest simple @@ -165,19 +165,19 @@ ERROR: binary requires a Boolean value CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, binary = true); WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | t | f | d | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | t | f | d | f | off | dbname=regress_doesnotexist (1 row) ALTER SUBSCRIPTION regress_testsub SET (binary = false); ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist (1 row) DROP SUBSCRIPTION regress_testsub; @@ -188,19 +188,19 @@ ERROR: streaming requires a Boolean value CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, streaming = true); WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | t | d | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | t | d | f | off | dbname=regress_doesnotexist (1 row) ALTER SUBSCRIPTION regress_testsub SET (streaming = false); ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist (1 row) -- fail - publication already exists @@ -215,10 +215,10 @@ ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub2 WITH (refr ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub2 WITH (refresh = false); ERROR: publication "testpub1" is already in subscription "regress_testsub" \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Synchronous commit | Conninfo ------------------+---------------------------+---------+-----------------------------+--------+-----------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub,testpub1,testpub2} | f | f | d | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-----------------------------+--------+-----------+------------------+------------------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub,testpub1,testpub2} | f | f | d | f | off | dbname=regress_doesnotexist (1 row) -- fail - publication used more then once @@ -233,10 +233,10 @@ ERROR: publication "testpub3" is not in subscription "regress_testsub" -- ok - delete publications ALTER SUBSCRIPTION regress_testsub DROP PUBLICATION testpub1, testpub2 WITH (refresh = false); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist (1 row) DROP SUBSCRIPTION regress_testsub; @@ -270,10 +270,10 @@ ERROR: two_phase requires a Boolean value CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, two_phase = true); WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | f | p | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | p | f | off | dbname=regress_doesnotexist (1 row) --fail - alter of two_phase option not supported. @@ -282,10 +282,10 @@ ERROR: unrecognized subscription parameter: "two_phase" -- but can alter streaming when two_phase enabled ALTER SUBSCRIPTION regress_testsub SET (streaming = true); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | t | p | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | t | p | f | off | dbname=regress_doesnotexist (1 row) ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); @@ -294,10 +294,33 @@ DROP SUBSCRIPTION regress_testsub; CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, streaming = true, two_phase = true); WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | t | p | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | t | p | f | off | dbname=regress_doesnotexist +(1 row) + +ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); +DROP SUBSCRIPTION regress_testsub; +-- fail - disable_on_error must be boolean +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, disable_on_error = foo); +ERROR: disable_on_error requires a Boolean value +-- now it works +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, disable_on_error = false); +WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables +\dRs+ + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist +(1 row) + +ALTER SUBSCRIPTION regress_testsub SET (disable_on_error = true); +\dRs+ + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | t | off | dbname=regress_doesnotexist (1 row) ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); diff --git a/src/test/regress/sql/subscription.sql b/src/test/regress/sql/subscription.sql index bd0f4af1e4..a7c15b1daf 100644 --- a/src/test/regress/sql/subscription.sql +++ b/src/test/regress/sql/subscription.sql @@ -228,6 +228,21 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); DROP SUBSCRIPTION regress_testsub; +-- fail - disable_on_error must be boolean +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, disable_on_error = foo); + +-- now it works +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, disable_on_error = false); + +\dRs+ + +ALTER SUBSCRIPTION regress_testsub SET (disable_on_error = true); + +\dRs+ + +ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); +DROP SUBSCRIPTION regress_testsub; + RESET SESSION AUTHORIZATION; DROP ROLE regress_subscription_user; DROP ROLE regress_subscription_user2; diff --git a/src/test/subscription/t/029_disable_on_error.pl b/src/test/subscription/t/029_disable_on_error.pl new file mode 100644 index 0000000000..5eca804446 --- /dev/null +++ b/src/test/subscription/t/029_disable_on_error.pl @@ -0,0 +1,94 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +# Test of logical replication subscription self-disabling feature. +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# create publisher node +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); +$node_publisher->init(allows_streaming => 'logical'); +$node_publisher->start; + +# create subscriber node +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); +$node_subscriber->init; +$node_subscriber->start; + +# Create identical table on both nodes. +$node_publisher->safe_psql('postgres', "CREATE TABLE tbl (i INT)"); +$node_subscriber->safe_psql('postgres', "CREATE TABLE tbl (i INT)"); + +# Insert duplicate values on the publisher. +$node_publisher->safe_psql('postgres', + "INSERT INTO tbl (i) VALUES (1), (1), (1)"); + +# Create an additional unique index on the subscriber. +$node_subscriber->safe_psql('postgres', + "CREATE UNIQUE INDEX tbl_unique ON tbl (i)"); + +# Create a pub/sub to set up logical replication. This tests that the +# uniqueness violation will cause the subscription to fail during initial +# synchronization and make it disabled. +my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION pub FOR TABLE tbl"); +$node_subscriber->safe_psql('postgres', + "CREATE SUBSCRIPTION sub CONNECTION '$publisher_connstr' PUBLICATION pub WITH (disable_on_error = true)" +); + +# Initial synchronization failure causes the subscription to be disabled. +$node_subscriber->poll_query_until('postgres', + "SELECT subenabled = false FROM pg_catalog.pg_subscription WHERE subname = 'sub'" +) or die "Timed out while waiting for subscriber to be disabled"; + +# Drop the unique index on the subscriber which caused the subscription to be +# disabled. +$node_subscriber->safe_psql('postgres', "DROP INDEX tbl_unique"); + +# Re-enable the subscription "sub". +$node_subscriber->safe_psql('postgres', "ALTER SUBSCRIPTION sub ENABLE"); + +# Wait for the data to replicate. +$node_publisher->wait_for_catchup('sub'); +$node_subscriber->poll_query_until('postgres', + "SELECT COUNT(1) = 0 FROM pg_subscription_rel sr WHERE sr.srsubstate NOT IN ('s', 'r') AND sr.srrelid = 'tbl'::regclass" +); + +# Confirm that we have finished the table sync. +my $result = + $node_subscriber->safe_psql('postgres', "SELECT MAX(i), COUNT(*) FROM tbl"); +is($result, qq(1|3), "subscription sub replicated data"); + +# Delete the data from the subscriber and recreate the unique index. +$node_subscriber->safe_psql('postgres', "DELETE FROM tbl"); +$node_subscriber->safe_psql('postgres', + "CREATE UNIQUE INDEX tbl_unique ON tbl (i)"); + +# Add more non-unique data to the publisher. +$node_publisher->safe_psql('postgres', + "INSERT INTO tbl (i) VALUES (3), (3), (3)"); + +# Apply failure causes the subscription to be disabled. +$node_subscriber->poll_query_until('postgres', + "SELECT subenabled = false FROM pg_catalog.pg_subscription WHERE subname = 'sub'" +) or die "Timed out while waiting for subscription sub to be disabled"; + +# Drop the unique index on the subscriber and re-enabled the subscription. Then +# confirm that the previously failing insert was applied OK. +$node_subscriber->safe_psql('postgres', "DROP INDEX tbl_unique"); +$node_subscriber->safe_psql('postgres', "ALTER SUBSCRIPTION sub ENABLE"); + +$node_publisher->wait_for_catchup('sub'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT COUNT(*) FROM tbl WHERE i = 3"); +is($result, qq(3), 'check the result of apply'); + +$node_subscriber->stop; +$node_publisher->stop; + +done_testing(); From 9dde82899cdf48bd7b2f3d83e4f724ac9ae02c79 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 14 Mar 2022 16:46:46 -0400 Subject: [PATCH 134/772] Support "of", "tzh", and "tzm" format codes. The upper case versions "OF", "TZH", and "TZM" are already supported, and all other format codes that are supported in upper case are also supported in lower case, so we should support these as well for consistency. Nitin Jadhav, with a tiny cosmetic change by me. Reviewed by Suraj Kharage and David Zhang. Discussion: http://postgr.es/m/CAMm1aWZ-oZyKd75+8D=VJ0sAoSwtdXWLP-MAWD4D8R1Dgandzw@mail.gmail.com --- src/backend/utils/adt/formatting.c | 10 +++- src/test/regress/expected/timestamptz.out | 65 +++++++++++++++++++++++ src/test/regress/sql/timestamptz.sql | 22 ++++++++ 3 files changed, 95 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index d4c2e7b069..ed698f788d 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -702,6 +702,7 @@ typedef enum DCH_month, DCH_mon, DCH_ms, + DCH_of, DCH_p_m, DCH_pm, DCH_q, @@ -709,6 +710,8 @@ typedef enum DCH_sssss, DCH_ssss, DCH_ss, + DCH_tzh, + DCH_tzm, DCH_tz, DCH_us, DCH_ww, @@ -865,6 +868,7 @@ static const KeyWord DCH_keywords[] = { {"month", 5, DCH_month, false, FROM_CHAR_DATE_GREGORIAN}, {"mon", 3, DCH_mon, false, FROM_CHAR_DATE_GREGORIAN}, {"ms", 2, DCH_MS, true, FROM_CHAR_DATE_NONE}, + {"of", 2, DCH_OF, false, FROM_CHAR_DATE_NONE}, /* o */ {"p.m.", 4, DCH_p_m, false, FROM_CHAR_DATE_NONE}, /* p */ {"pm", 2, DCH_pm, false, FROM_CHAR_DATE_NONE}, {"q", 1, DCH_Q, true, FROM_CHAR_DATE_NONE}, /* q */ @@ -872,7 +876,9 @@ static const KeyWord DCH_keywords[] = { {"sssss", 5, DCH_SSSS, true, FROM_CHAR_DATE_NONE}, /* s */ {"ssss", 4, DCH_SSSS, true, FROM_CHAR_DATE_NONE}, {"ss", 2, DCH_SS, true, FROM_CHAR_DATE_NONE}, - {"tz", 2, DCH_tz, false, FROM_CHAR_DATE_NONE}, /* t */ + {"tzh", 3, DCH_TZH, false, FROM_CHAR_DATE_NONE}, /* t */ + {"tzm", 3, DCH_TZM, true, FROM_CHAR_DATE_NONE}, + {"tz", 2, DCH_tz, false, FROM_CHAR_DATE_NONE}, {"us", 2, DCH_US, true, FROM_CHAR_DATE_NONE}, /* u */ {"ww", 2, DCH_WW, true, FROM_CHAR_DATE_GREGORIAN}, /* w */ {"w", 1, DCH_W, true, FROM_CHAR_DATE_GREGORIAN}, @@ -954,7 +960,7 @@ static const int DCH_index[KeyWord_INDEX_SIZE] = { DCH_P_M, DCH_Q, DCH_RM, DCH_SSSSS, DCH_TZH, DCH_US, -1, DCH_WW, -1, DCH_Y_YYY, -1, -1, -1, -1, -1, -1, -1, DCH_a_d, DCH_b_c, DCH_cc, DCH_day, -1, DCH_ff1, -1, DCH_hh24, DCH_iddd, DCH_j, -1, -1, DCH_mi, - -1, -1, DCH_p_m, DCH_q, DCH_rm, DCH_sssss, DCH_tz, DCH_us, -1, DCH_ww, + -1, DCH_of, DCH_p_m, DCH_q, DCH_rm, DCH_sssss, DCH_tzh, DCH_us, -1, DCH_ww, -1, DCH_y_yyy, -1, -1, -1, -1 /*---- chars over 126 are skipped ----*/ diff --git a/src/test/regress/expected/timestamptz.out b/src/test/regress/expected/timestamptz.out index 990c4eddf1..d402802db0 100644 --- a/src/test/regress/expected/timestamptz.out +++ b/src/test/regress/expected/timestamptz.out @@ -2166,6 +2166,71 @@ SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; -04:15 | -04:15 (1 row) +RESET timezone; +-- Check of, tzh, tzm with various zone offsets. +SET timezone = '00:00'; +SELECT to_char(now(), 'of') as "Of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; + Of | tzh:tzm +-----+--------- + +00 | +00:00 +(1 row) + +SET timezone = '+02:00'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; + of | tzh:tzm +-----+--------- + -02 | -02:00 +(1 row) + +SET timezone = '-13:00'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; + of | tzh:tzm +-----+--------- + +13 | +13:00 +(1 row) + +SET timezone = '-00:30'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; + of | tzh:tzm +--------+--------- + +00:30 | +00:30 +(1 row) + +SET timezone = '00:30'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; + of | tzh:tzm +--------+--------- + -00:30 | -00:30 +(1 row) + +SET timezone = '-04:30'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; + of | tzh:tzm +--------+--------- + +04:30 | +04:30 +(1 row) + +SET timezone = '04:30'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; + of | tzh:tzm +--------+--------- + -04:30 | -04:30 +(1 row) + +SET timezone = '-04:15'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; + of | tzh:tzm +--------+--------- + +04:15 | +04:15 +(1 row) + +SET timezone = '04:15'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; + of | tzh:tzm +--------+--------- + -04:15 | -04:15 +(1 row) + RESET timezone; CREATE TABLE TIMESTAMPTZ_TST (a int , b timestamptz); -- Test year field value with len > 4 diff --git a/src/test/regress/sql/timestamptz.sql b/src/test/regress/sql/timestamptz.sql index b18821de53..7cd2420b08 100644 --- a/src/test/regress/sql/timestamptz.sql +++ b/src/test/regress/sql/timestamptz.sql @@ -360,6 +360,28 @@ SET timezone = '04:15'; SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM"; RESET timezone; +-- Check of, tzh, tzm with various zone offsets. +SET timezone = '00:00'; +SELECT to_char(now(), 'of') as "Of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; +SET timezone = '+02:00'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; +SET timezone = '-13:00'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; +SET timezone = '-00:30'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; +SET timezone = '00:30'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; +SET timezone = '-04:30'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; +SET timezone = '04:30'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; +SET timezone = '-04:15'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; +SET timezone = '04:15'; +SELECT to_char(now(), 'of') as "of", to_char(now(), 'tzh:tzm') as "tzh:tzm"; +RESET timezone; + + CREATE TABLE TIMESTAMPTZ_TST (a int , b timestamptz); -- Test year field value with len > 4 From c6f2f01611d4f2c412e92eb7893f76fa590818e8 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Tue, 15 Mar 2022 13:38:41 +1300 Subject: [PATCH 135/772] Fix pg_basebackup with in-place tablespaces. Previously, pg_basebackup from a cluster that contained an 'in-place' tablespace, as introduced by commit 7170f215, would produce a harmless warning on Unix and fail completely on Windows. Reported-by: Kyotaro Horiguchi Reviewed-by: Kyotaro Horiguchi Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/20220304.165449.1200020258723305904.horikyota.ntt%40gmail.com --- src/backend/access/transam/xlog.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 0d2bd7a357..a22f7addac 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -66,6 +66,7 @@ #include "catalog/pg_control.h" #include "catalog/pg_database.h" #include "common/controldata_utils.h" +#include "common/file_utils.h" #include "executor/instrument.h" #include "miscadmin.h" #include "pg_trace.h" @@ -8292,6 +8293,19 @@ do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p, snprintf(fullpath, sizeof(fullpath), "pg_tblspc/%s", de->d_name); + /* + * Skip anything that isn't a symlink/junction. For testing only, + * we sometimes use allow_in_place_tablespaces to create + * directories directly under pg_tblspc, which would fail below. + */ +#ifdef WIN32 + if (!pgwin32_is_junction(fullpath)) + continue; +#else + if (get_dirent_type(fullpath, de, false, ERROR) != PGFILETYPE_LNK) + continue; +#endif + #if defined(HAVE_READLINK) || defined(WIN32) rllen = readlink(fullpath, linkpath, sizeof(linkpath)); if (rllen < 0) From ff8b37ba801073b4506f670317141785bab9f4d8 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 15 Mar 2022 10:52:19 +0900 Subject: [PATCH 136/772] Add more regression tests for pg_ls_dir() This system function was being triggered once in the main regression test suite to check its SRF configuration, and more in other test modules but nothing checked the behavior of the options missing_ok and include_dot_dirs. This commit adds some tests for both options, to avoid mistakes if this code is manipulated in the future. Extracted from a larger patch by the same author, with a few tweaks by me. Author: Justin Pryzby Discussion: https://postgr.es/m/20191227170220.GE12890@telsasoft.com --- src/test/regress/expected/misc_functions.out | 23 ++++++++++++++++++++ src/test/regress/sql/misc_functions.sql | 8 +++++++ 2 files changed, 31 insertions(+) diff --git a/src/test/regress/expected/misc_functions.out b/src/test/regress/expected/misc_functions.out index 8567fcc2b4..01d1ad0b9a 100644 --- a/src/test/regress/expected/misc_functions.out +++ b/src/test/regress/expected/misc_functions.out @@ -378,6 +378,29 @@ select * from (select pg_ls_dir('.') a) a where a = 'base' limit 1; base (1 row) +-- Test missing_ok (second argument) +select pg_ls_dir('does not exist', false, false); -- error +ERROR: could not open directory "does not exist": No such file or directory +select pg_ls_dir('does not exist', true, false); -- ok + pg_ls_dir +----------- +(0 rows) + +-- Test include_dot_dirs (third argument) +select count(*) = 1 as dot_found + from pg_ls_dir('.', false, true) as ls where ls = '.'; + dot_found +----------- + t +(1 row) + +select count(*) = 1 as dot_found + from pg_ls_dir('.', false, false) as ls where ls = '.'; + dot_found +----------- + f +(1 row) + select * from (select (pg_timezone_names()).name) ptn where name='UTC' limit 1; name ------ diff --git a/src/test/regress/sql/misc_functions.sql b/src/test/regress/sql/misc_functions.sql index 3db3f8bade..072fc36a1f 100644 --- a/src/test/regress/sql/misc_functions.sql +++ b/src/test/regress/sql/misc_functions.sql @@ -124,6 +124,14 @@ from (select pg_ls_waldir() w) ss where length((w).name) = 24 limit 1; select count(*) >= 0 as ok from pg_ls_archive_statusdir(); select * from (select pg_ls_dir('.') a) a where a = 'base' limit 1; +-- Test missing_ok (second argument) +select pg_ls_dir('does not exist', false, false); -- error +select pg_ls_dir('does not exist', true, false); -- ok +-- Test include_dot_dirs (third argument) +select count(*) = 1 as dot_found + from pg_ls_dir('.', false, true) as ls where ls = '.'; +select count(*) = 1 as dot_found + from pg_ls_dir('.', false, false) as ls where ls = '.'; select * from (select (pg_timezone_names()).name) ptn where name='UTC' limit 1; From 6bdf1a1400d3fb8c87e020be943942dcab7e75e2 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 15 Mar 2022 11:29:23 +0900 Subject: [PATCH 137/772] Fix collection of typos in the code and the documentation Some words were duplicated while other places were grammatically incorrect, including one variable name in the code. Author: Otto Kekalainen, Justin Pryzby Discussion: https://postgr.es/m/7DDBEFC5-09B6-4325-B942-B563D1A24BDC@amazon.com --- config/pkg.m4 | 2 +- contrib/pageinspect/expected/gist.out | 2 +- contrib/pageinspect/sql/gist.sql | 2 +- doc/src/sgml/config.sgml | 4 ++-- doc/src/sgml/logicaldecoding.sgml | 10 +++++----- doc/src/sgml/postgres-fdw.sgml | 2 +- src/backend/access/heap/pruneheap.c | 2 +- src/backend/access/transam/xlog.c | 2 +- src/backend/catalog/index.c | 2 +- src/backend/commands/explain.c | 6 +++--- src/backend/main/main.c | 2 +- src/backend/postmaster/bgworker.c | 2 +- src/backend/replication/basebackup_sink.c | 4 ++-- src/backend/utils/adt/tsrank.c | 2 +- src/bin/pg_basebackup/pg_basebackup.c | 2 +- src/bin/pg_basebackup/t/010_pg_basebackup.pl | 4 ++-- src/bin/pg_verifybackup/t/008_untar.pl | 2 +- src/bin/pg_verifybackup/t/010_client_untar.pl | 2 +- src/bin/pgbench/pgbench.c | 2 +- src/include/libpq/sasl.h | 2 +- src/interfaces/libpq/t/001_uri.pl | 2 +- src/test/perl/PostgreSQL/Test/Cluster.pm | 6 +++--- src/test/regress/expected/create_function_sql.out | 2 +- src/test/regress/expected/create_table.out | 2 +- src/test/regress/expected/object_address.out | 2 +- src/test/regress/sql/create_function_sql.sql | 2 +- src/test/regress/sql/create_table.sql | 2 +- src/test/regress/sql/object_address.sql | 2 +- src/test/subscription/t/001_rep_changes.pl | 2 +- 29 files changed, 40 insertions(+), 40 deletions(-) diff --git a/config/pkg.m4 b/config/pkg.m4 index 13a8890178..f9075e56c8 100644 --- a/config/pkg.m4 +++ b/config/pkg.m4 @@ -86,7 +86,7 @@ dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -dnl only at the first occurence in configure.ac, so if the first place +dnl only at the first occurrence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], diff --git a/contrib/pageinspect/expected/gist.out b/contrib/pageinspect/expected/gist.out index b26b56ba15..93abfcdd5e 100644 --- a/contrib/pageinspect/expected/gist.out +++ b/contrib/pageinspect/expected/gist.out @@ -52,7 +52,7 @@ SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 1), 'test_gist_idx') (5 rows) -- gist_page_items_bytea prints the raw key data as a bytea. The output of that is --- platform-dependent (endianess), so omit the actual key data from the output. +-- platform-dependent (endianness), so omit the actual key data from the output. SELECT itemoffset, ctid, itemlen FROM gist_page_items_bytea(get_raw_page('test_gist_idx', 0)); itemoffset | ctid | itemlen ------------+-----------+--------- diff --git a/contrib/pageinspect/sql/gist.sql b/contrib/pageinspect/sql/gist.sql index 1560d1e15c..3e83239a9d 100644 --- a/contrib/pageinspect/sql/gist.sql +++ b/contrib/pageinspect/sql/gist.sql @@ -23,7 +23,7 @@ SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 0), 'test_gist_idx') SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 1), 'test_gist_idx') LIMIT 5; -- gist_page_items_bytea prints the raw key data as a bytea. The output of that is --- platform-dependent (endianess), so omit the actual key data from the output. +-- platform-dependent (endianness), so omit the actual key data from the output. SELECT itemoffset, ctid, itemlen FROM gist_page_items_bytea(get_raw_page('test_gist_idx', 0)); DROP TABLE test_gist; diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 5b763bf60f..7a48973b3c 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -4746,7 +4746,7 @@ ANY num_sync ( for details. diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c index b6500763a5..4656f1b3db 100644 --- a/src/backend/access/heap/pruneheap.c +++ b/src/backend/access/heap/pruneheap.c @@ -69,7 +69,7 @@ typedef struct /* * Tuple visibility is only computed once for each tuple, for correctness * and efficiency reasons; see comment in heap_page_prune() for - * details. This is of type int8[,] intead of HTSV_Result[], so we can use + * details. This is of type int8[,] instead of HTSV_Result[], so we can use * -1 to indicate no visibility has been computed, e.g. for LP_DEAD items. * * Same indexing as ->marked. diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index a22f7addac..ed16f279b1 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -5870,7 +5870,7 @@ GetRedoRecPtr(void) * full-page image to be included in the WAL record. * * The returned values are cached copies from backend-private memory, and - * possibly out-of-date or, indeed, uninitalized, in which case they will + * possibly out-of-date or, indeed, uninitialized, in which case they will * be InvalidXLogRecPtr and false, respectively. XLogInsertRecord will * re-check them against up-to-date values, while holding the WAL insert lock. */ diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 5e3fc2b35d..e43117ffef 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -918,7 +918,7 @@ index_create(Relation heapRelation, indexRelationId = binary_upgrade_next_index_pg_class_oid; binary_upgrade_next_index_pg_class_oid = InvalidOid; - /* Overide the index relfilenode */ + /* Override the index relfilenode */ if ((relkind == RELKIND_INDEX) && (!OidIsValid(binary_upgrade_next_index_pg_class_relfilenode))) ereport(ERROR, diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index de81379da3..9f632285b6 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -3102,7 +3102,7 @@ show_memoize_info(MemoizeState *mstate, List *ancestors, ExplainState *es) ListCell *lc; List *context; StringInfoData keystr; - char *seperator = ""; + char *separator = ""; bool useprefix; int64 memPeakKb; @@ -3123,11 +3123,11 @@ show_memoize_info(MemoizeState *mstate, List *ancestors, ExplainState *es) { Node *expr = (Node *) lfirst(lc); - appendStringInfoString(&keystr, seperator); + appendStringInfoString(&keystr, separator); appendStringInfoString(&keystr, deparse_expression(expr, context, useprefix, false)); - seperator = ", "; + separator = ", "; } if (es->format != EXPLAIN_FORMAT_TEXT) diff --git a/src/backend/main/main.c b/src/backend/main/main.c index 3d67ce9dce..c43a527d3f 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -247,7 +247,7 @@ startup_hacks(const char *progname) * leaving the default in place would make debugging harder. * * MINGW's own C runtime doesn't have _set_abort_behavior(). When - * targetting Microsoft's UCRT with mingw, it never links to the debug + * targeting Microsoft's UCRT with mingw, it never links to the debug * version of the library and thus doesn't need the call to * _set_abort_behavior() either. */ diff --git a/src/backend/postmaster/bgworker.c b/src/backend/postmaster/bgworker.c index e441726c83..30682b63b3 100644 --- a/src/backend/postmaster/bgworker.c +++ b/src/backend/postmaster/bgworker.c @@ -531,7 +531,7 @@ BackgroundWorkerStopNotifications(pid_t pid) * This is called during a normal ("smart" or "fast") database shutdown. * After this point, no new background workers will be started, so anything * that might be waiting for them needs to be kicked off its wait. We do - * that by cancelling the bgworker registration entirely, which is perhaps + * that by canceling the bgworker registration entirely, which is perhaps * overkill, but since we're shutting down it does not matter whether the * registration record sticks around. * diff --git a/src/backend/replication/basebackup_sink.c b/src/backend/replication/basebackup_sink.c index 47ba50c2f8..81353f8f4d 100644 --- a/src/backend/replication/basebackup_sink.c +++ b/src/backend/replication/basebackup_sink.c @@ -18,7 +18,7 @@ * Forward begin_backup callback. * * Only use this implementation if you want the bbsink you're implementing to - * share a buffer with the succesor bbsink. + * share a buffer with the successor bbsink. */ void bbsink_forward_begin_backup(bbsink *sink) @@ -43,7 +43,7 @@ bbsink_forward_begin_archive(bbsink *sink, const char *archive_name) /* * Forward archive_contents callback. * - * Code that wants to use this should initalize its own bbs_buffer and + * Code that wants to use this should initialize its own bbs_buffer and * bbs_buffer_length fields to the values from the successor sink. In cases * where the buffer isn't shared, the data needs to be copied before forwarding * the callback. We don't do try to do that here, because there's really no diff --git a/src/backend/utils/adt/tsrank.c b/src/backend/utils/adt/tsrank.c index cd8aff0ad2..3858fc5928 100644 --- a/src/backend/utils/adt/tsrank.c +++ b/src/backend/utils/adt/tsrank.c @@ -337,7 +337,7 @@ calc_rank_or(const float *w, TSVector t, TSQuery q) } /* limit (sum(1/i^2),i=1,inf) = pi^2/6 - resj = sum(wi/i^2),i=1,noccurence, + resj = sum(wi/i^2),i=1,noccurrence, wi - should be sorted desc, don't sort for now, just choose maximum weight. This should be corrected Oleg Bartunov diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index d265ee3b3c..2943d9ec1a 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -1722,7 +1722,7 @@ GetCopyDataEnd(size_t r, char *copybuf, size_t cursor) * * As a debugging aid, we try to give some hint about what kind of message * provoked the failure. Perhaps this is not detailed enough, but it's not - * clear that it's worth expending any more code on what shoud be a + * clear that it's worth expending any more code on what should be a * can't-happen case. */ static void diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 8cb8cfe045..efefe947d9 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -22,7 +22,7 @@ # For nearly all pg_basebackup invocations some options should be specified, # to keep test times reasonable. Using @pg_basebackup_defs as the first -# element of the array passed to to IPC::Run interpolate the array (as it is +# element of the array passed to IPC::Run interpolate the array (as it is # not a reference to an array)... my @pg_basebackup_defs = ('pg_basebackup', '--no-sync', '-cfast'); @@ -287,7 +287,7 @@ SKIP: { my $tar = $ENV{TAR}; - # don't check for a working tar here, to accomodate various odd + # don't check for a working tar here, to accommodate various odd # cases such as AIX. If tar doesn't work the init_from_backup below # will fail. skip "no tar program available", 1 diff --git a/src/bin/pg_verifybackup/t/008_untar.pl b/src/bin/pg_verifybackup/t/008_untar.pl index efbc910dfb..d52ca17430 100644 --- a/src/bin/pg_verifybackup/t/008_untar.pl +++ b/src/bin/pg_verifybackup/t/008_untar.pl @@ -95,7 +95,7 @@ SKIP: { my $tar = $ENV{TAR}; - # don't check for a working tar here, to accomodate various odd + # don't check for a working tar here, to accommodate various odd # cases such as AIX. If tar doesn't work the init_from_backup below # will fail. skip "no tar program available", 1 diff --git a/src/bin/pg_verifybackup/t/010_client_untar.pl b/src/bin/pg_verifybackup/t/010_client_untar.pl index c2a6161be6..0b96b6cc43 100644 --- a/src/bin/pg_verifybackup/t/010_client_untar.pl +++ b/src/bin/pg_verifybackup/t/010_client_untar.pl @@ -96,7 +96,7 @@ SKIP: { my $tar = $ENV{TAR}; - # don't check for a working tar here, to accomodate various odd + # don't check for a working tar here, to accommodate various odd # cases such as AIX. If tar doesn't work the init_from_backup below # will fail. skip "no tar program available", 1 diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 4ebe5e6ea4..000ffc4a5c 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -4183,7 +4183,7 @@ initGenerateDataClientSide(PGconn *con) * accounts is big enough to be worth using COPY and tracking runtime */ - /* use COPY with FREEZE on v14 and later without partioning */ + /* use COPY with FREEZE on v14 and later without partitioning */ if (partitions == 0 && PQserverVersion(con) >= 140000) copy_statement = "copy pgbench_accounts from stdin with (freeze on)"; else diff --git a/src/include/libpq/sasl.h b/src/include/libpq/sasl.h index 71cc0dc251..39ccf8f0e3 100644 --- a/src/include/libpq/sasl.h +++ b/src/include/libpq/sasl.h @@ -62,7 +62,7 @@ typedef struct pg_be_sasl_mech * must return a pointer to its allocated state, which will be passed * as-is as the first argument to the other callbacks. * - * Input paramters: + * Input parameters: * * port: The client Port. * diff --git a/src/interfaces/libpq/t/001_uri.pl b/src/interfaces/libpq/t/001_uri.pl index 90f370f8fd..1d595c0529 100644 --- a/src/interfaces/libpq/t/001_uri.pl +++ b/src/interfaces/libpq/t/001_uri.pl @@ -232,7 +232,7 @@ sub test_uri chomp($result{stderr}); # use is_deeply so there's one test result for each test above, without - # loosing the information whether stdout/stderr mismatched. + # losing the information whether stdout/stderr mismatched. is_deeply(\%result, \%expect, $uri); } diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index 4db52bc936..e7b9161137 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -1372,9 +1372,9 @@ sub _set_pg_version # local %ENV = $self->_get_env{[%extra_settings]); # # A copy of the environment is taken and node's host and port settings are -# added as PGHOST and PGPORT, Then the extra settings (if any) are applied. -# Any setting in %extra_settings with a value that is undefined is deleted -# the remainder are# set. Then the PATH and (DY)LD_LIBRARY_PATH are adjusted +# added as PGHOST and PGPORT, then the extra settings (if any) are applied. +# Any setting in %extra_settings with a value that is undefined is deleted; +# the remainder are set. Then the PATH and (DY)LD_LIBRARY_PATH are adjusted # if the node's install path is set, and the copy environment is returned. # # The install path set in new() needs to be a directory containing diff --git a/src/test/regress/expected/create_function_sql.out b/src/test/regress/expected/create_function_sql.out index f956955464..a31daffbf3 100644 --- a/src/test/regress/expected/create_function_sql.out +++ b/src/test/regress/expected/create_function_sql.out @@ -279,7 +279,7 @@ CREATE FUNCTION functest_S_13() RETURNS boolean SELECT 1; SELECT false; END; --- check display of function argments in sub-SELECT +-- check display of function arguments in sub-SELECT CREATE TABLE functest1 (i int); CREATE FUNCTION functest_S_16(a int, b int) RETURNS void LANGUAGE SQL diff --git a/src/test/regress/expected/create_table.out b/src/test/regress/expected/create_table.out index 02d0999580..4407a017a9 100644 --- a/src/test/regress/expected/create_table.out +++ b/src/test/regress/expected/create_table.out @@ -811,7 +811,7 @@ create table parted_notnull_inh_test1 partition of parted_notnull_inh_test (a no insert into parted_notnull_inh_test (b) values (null); ERROR: null value in column "b" of relation "parted_notnull_inh_test1" violates not-null constraint DETAIL: Failing row contains (1, null). --- note that while b's default is overriden, a's default is preserved +-- note that while b's default is overridden, a's default is preserved \d parted_notnull_inh_test1 Table "public.parted_notnull_inh_test1" Column | Type | Collation | Nullable | Default diff --git a/src/test/regress/expected/object_address.out b/src/test/regress/expected/object_address.out index a9e7f2eed5..4117fc27c9 100644 --- a/src/test/regress/expected/object_address.out +++ b/src/test/regress/expected/object_address.out @@ -558,7 +558,7 @@ WITH objects (classid, objid, objsubid) AS (VALUES ('pg_namespace'::regclass, 0, 0), -- no schema ('pg_statistic_ext'::regclass, 0, 0), -- no statistics ('pg_ts_parser'::regclass, 0, 0), -- no TS parser - ('pg_ts_dict'::regclass, 0, 0), -- no TS dictionnary + ('pg_ts_dict'::regclass, 0, 0), -- no TS dictionary ('pg_ts_template'::regclass, 0, 0), -- no TS template ('pg_ts_config'::regclass, 0, 0), -- no TS configuration ('pg_authid'::regclass, 0, 0), -- no role diff --git a/src/test/regress/sql/create_function_sql.sql b/src/test/regress/sql/create_function_sql.sql index 4512456eae..cc0ccd8db1 100644 --- a/src/test/regress/sql/create_function_sql.sql +++ b/src/test/regress/sql/create_function_sql.sql @@ -180,7 +180,7 @@ CREATE FUNCTION functest_S_13() RETURNS boolean SELECT false; END; --- check display of function argments in sub-SELECT +-- check display of function arguments in sub-SELECT CREATE TABLE functest1 (i int); CREATE FUNCTION functest_S_16(a int, b int) RETURNS void LANGUAGE SQL diff --git a/src/test/regress/sql/create_table.sql b/src/test/regress/sql/create_table.sql index 37dac6b5fb..5175f404f7 100644 --- a/src/test/regress/sql/create_table.sql +++ b/src/test/regress/sql/create_table.sql @@ -559,7 +559,7 @@ CREATE TABLE part_c_1_10 PARTITION OF part_c FOR VALUES FROM (1) TO (10); create table parted_notnull_inh_test (a int default 1, b int not null default 0) partition by list (a); create table parted_notnull_inh_test1 partition of parted_notnull_inh_test (a not null, b default 1) for values in (1); insert into parted_notnull_inh_test (b) values (null); --- note that while b's default is overriden, a's default is preserved +-- note that while b's default is overridden, a's default is preserved \d parted_notnull_inh_test1 drop table parted_notnull_inh_test; diff --git a/src/test/regress/sql/object_address.sql b/src/test/regress/sql/object_address.sql index 2f40156eb4..acd0468a9d 100644 --- a/src/test/regress/sql/object_address.sql +++ b/src/test/regress/sql/object_address.sql @@ -259,7 +259,7 @@ WITH objects (classid, objid, objsubid) AS (VALUES ('pg_namespace'::regclass, 0, 0), -- no schema ('pg_statistic_ext'::regclass, 0, 0), -- no statistics ('pg_ts_parser'::regclass, 0, 0), -- no TS parser - ('pg_ts_dict'::regclass, 0, 0), -- no TS dictionnary + ('pg_ts_dict'::regclass, 0, 0), -- no TS dictionary ('pg_ts_template'::regclass, 0, 0), -- no TS template ('pg_ts_config'::regclass, 0, 0), -- no TS configuration ('pg_authid'::regclass, 0, 0), -- no role diff --git a/src/test/subscription/t/001_rep_changes.pl b/src/test/subscription/t/001_rep_changes.pl index af0cff6a30..eca1c63335 100644 --- a/src/test/subscription/t/001_rep_changes.pl +++ b/src/test/subscription/t/001_rep_changes.pl @@ -418,7 +418,7 @@ # application_name to ensure that the walsender is (re)started. # # Not all of these are registered as tests as we need to poll for a change -# but the test suite will fail none the less when something goes wrong. +# but the test suite will fail nonetheless when something goes wrong. my $oldpid = $node_publisher->safe_psql('postgres', "SELECT pid FROM pg_stat_replication WHERE application_name = 'tap_sub' AND state = 'streaming';" ); From 695f459f1713303ba33b76eeb866c6501dff6380 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Tue, 15 Mar 2022 08:11:17 +0530 Subject: [PATCH 138/772] Fix compiler warning introduced in commit 705e20f855. Reported-by: Nathan Bossart Author: Nathan Bossart Reviewed-by: Osumi Takamichi Discussion : https://postgr.es/m/20220314230424.GA1085716@nathanxps13 --- src/backend/replication/logical/worker.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index a1fe81b34f..03e069c7cd 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -3387,7 +3387,7 @@ TwoPhaseTransactionGid(Oid subid, TransactionId xid, char *gid, int szgid) static void start_table_sync(XLogRecPtr *origin_startpos, char **myslotname) { - char *syncslotname; + char *syncslotname = NULL; Assert(am_tablesync_worker()); From 75eae090876f4d47bf6a1e1016627b75da612307 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 15 Mar 2022 13:06:25 -0400 Subject: [PATCH 139/772] Change HAVE_LIBLZ4 and HAVE_LIBZSTD tests to USE_LZ4 and USE_ZSTD. These tests were added recently, but older code tests USE_LZ4 rathr than HAVE_LIBLZ4, so let's follow the established precedent. It also seems more consistent with the intent of the configure tests, since I think that the USE_* symbols are intended to correspond to what the user requested, and the HAVE_* symbols to what configure found while probing. Discussion: http://postgr.es/m/CA+Tgmoap+hTD2-QNPJLH4tffeFE8MX5+xkbFKMU3FKBy=ZSNKA@mail.gmail.com --- src/backend/replication/basebackup_lz4.c | 8 ++++---- src/backend/replication/basebackup_zstd.c | 8 ++++---- src/bin/pg_basebackup/bbstreamer_lz4.c | 12 +++++------ src/bin/pg_basebackup/bbstreamer_zstd.c | 12 +++++------ src/bin/pg_basebackup/pg_receivewal.c | 6 +++--- src/bin/pg_basebackup/t/020_pg_receivewal.pl | 2 +- src/bin/pg_basebackup/walmethods.c | 20 +++++++++---------- src/bin/pg_dump/t/002_pg_dump.pl | 2 +- src/bin/pg_verifybackup/t/008_untar.pl | 4 ++-- src/bin/pg_verifybackup/t/009_extract.pl | 4 ++-- src/bin/pg_verifybackup/t/010_client_untar.pl | 4 ++-- 11 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/backend/replication/basebackup_lz4.c b/src/backend/replication/basebackup_lz4.c index 472b620d7c..d838f723d0 100644 --- a/src/backend/replication/basebackup_lz4.c +++ b/src/backend/replication/basebackup_lz4.c @@ -12,13 +12,13 @@ */ #include "postgres.h" -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 #include #endif #include "replication/basebackup_sink.h" -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 typedef struct bbsink_lz4 { @@ -62,7 +62,7 @@ const bbsink_ops bbsink_lz4_ops = { bbsink * bbsink_lz4_new(bbsink *next, int compresslevel) { -#ifndef HAVE_LIBLZ4 +#ifndef USE_LZ4 ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("lz4 compression is not supported by this build"))); @@ -87,7 +87,7 @@ bbsink_lz4_new(bbsink *next, int compresslevel) #endif } -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 /* * Begin backup. diff --git a/src/backend/replication/basebackup_zstd.c b/src/backend/replication/basebackup_zstd.c index e3f9b1d4dc..c0e2be6e27 100644 --- a/src/backend/replication/basebackup_zstd.c +++ b/src/backend/replication/basebackup_zstd.c @@ -12,13 +12,13 @@ */ #include "postgres.h" -#ifdef HAVE_LIBZSTD +#ifdef USE_ZSTD #include #endif #include "replication/basebackup_sink.h" -#ifdef HAVE_LIBZSTD +#ifdef USE_ZSTD typedef struct bbsink_zstd { @@ -61,7 +61,7 @@ const bbsink_ops bbsink_zstd_ops = { bbsink * bbsink_zstd_new(bbsink *next, int compresslevel) { -#ifndef HAVE_LIBZSTD +#ifndef USE_ZSTD ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("zstd compression is not supported by this build"))); @@ -86,7 +86,7 @@ bbsink_zstd_new(bbsink *next, int compresslevel) #endif } -#ifdef HAVE_LIBZSTD +#ifdef USE_ZSTD /* * Begin backup. diff --git a/src/bin/pg_basebackup/bbstreamer_lz4.c b/src/bin/pg_basebackup/bbstreamer_lz4.c index bde018246f..810052e4e3 100644 --- a/src/bin/pg_basebackup/bbstreamer_lz4.c +++ b/src/bin/pg_basebackup/bbstreamer_lz4.c @@ -13,7 +13,7 @@ #include -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 #include #endif @@ -22,7 +22,7 @@ #include "common/file_perm.h" #include "common/string.h" -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 typedef struct bbstreamer_lz4_frame { bbstreamer base; @@ -69,7 +69,7 @@ const bbstreamer_ops bbstreamer_lz4_decompressor_ops = { bbstreamer * bbstreamer_lz4_compressor_new(bbstreamer *next, int compresslevel) { -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 bbstreamer_lz4_frame *streamer; LZ4F_errorCode_t ctxError; LZ4F_preferences_t *prefs; @@ -114,7 +114,7 @@ bbstreamer_lz4_compressor_new(bbstreamer *next, int compresslevel) #endif } -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 /* * Compress the input data to output buffer. * @@ -280,7 +280,7 @@ bbstreamer_lz4_compressor_free(bbstreamer *streamer) bbstreamer * bbstreamer_lz4_decompressor_new(bbstreamer *next) { -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 bbstreamer_lz4_frame *streamer; LZ4F_errorCode_t ctxError; @@ -309,7 +309,7 @@ bbstreamer_lz4_decompressor_new(bbstreamer *next) #endif } -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 /* * Decompress the input data to output buffer until we run out of input * data. Each time the output buffer is full, pass on the decompressed data diff --git a/src/bin/pg_basebackup/bbstreamer_zstd.c b/src/bin/pg_basebackup/bbstreamer_zstd.c index cc68367dd5..e86749a8fb 100644 --- a/src/bin/pg_basebackup/bbstreamer_zstd.c +++ b/src/bin/pg_basebackup/bbstreamer_zstd.c @@ -13,14 +13,14 @@ #include -#ifdef HAVE_LIBZSTD +#ifdef USE_ZSTD #include #endif #include "bbstreamer.h" #include "common/logging.h" -#ifdef HAVE_LIBZSTD +#ifdef USE_ZSTD typedef struct bbstreamer_zstd_frame { @@ -65,7 +65,7 @@ const bbstreamer_ops bbstreamer_zstd_decompressor_ops = { bbstreamer * bbstreamer_zstd_compressor_new(bbstreamer *next, int compresslevel) { -#ifdef HAVE_LIBZSTD +#ifdef USE_ZSTD bbstreamer_zstd_frame *streamer; Assert(next != NULL); @@ -99,7 +99,7 @@ bbstreamer_zstd_compressor_new(bbstreamer *next, int compresslevel) #endif } -#ifdef HAVE_LIBZSTD +#ifdef USE_ZSTD /* * Compress the input data to output buffer. * @@ -225,7 +225,7 @@ bbstreamer_zstd_compressor_free(bbstreamer *streamer) bbstreamer * bbstreamer_zstd_decompressor_new(bbstreamer *next) { -#ifdef HAVE_LIBZSTD +#ifdef USE_ZSTD bbstreamer_zstd_frame *streamer; Assert(next != NULL); @@ -257,7 +257,7 @@ bbstreamer_zstd_decompressor_new(bbstreamer *next) #endif } -#ifdef HAVE_LIBZSTD +#ifdef USE_ZSTD /* * Decompress the input data to output buffer until we run out of input * data. Each time the output buffer is full, pass on the decompressed data diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c index 8a4c2b8964..e2ceafeb0f 100644 --- a/src/bin/pg_basebackup/pg_receivewal.c +++ b/src/bin/pg_basebackup/pg_receivewal.c @@ -32,7 +32,7 @@ #include "receivelog.h" #include "streamutil.h" -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 #include "lz4frame.h" #endif @@ -382,7 +382,7 @@ FindStreamingStart(uint32 *tli) } else if (!ispartial && wal_compression_method == COMPRESSION_LZ4) { -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 #define LZ4_CHUNK_SZ 64 * 1024 /* 64kB as maximum chunk size read */ int fd; ssize_t r; @@ -889,7 +889,7 @@ main(int argc, char **argv) #endif break; case COMPRESSION_LZ4: -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 if (compresslevel != 0) { pg_log_error("cannot use --compress with --compression-method=%s", diff --git a/src/bin/pg_basebackup/t/020_pg_receivewal.pl b/src/bin/pg_basebackup/t/020_pg_receivewal.pl index 545618e0b2..8c38816b22 100644 --- a/src/bin/pg_basebackup/t/020_pg_receivewal.pl +++ b/src/bin/pg_basebackup/t/020_pg_receivewal.pl @@ -141,7 +141,7 @@ SKIP: { skip "postgres was not built with LZ4 support", 5 - if (!check_pg_config("#define HAVE_LIBLZ4 1")); + if (!check_pg_config("#define USE_LZ4 1")); # Generate more WAL including one completed, compressed segment. $primary->psql('postgres', 'SELECT pg_switch_wal();'); diff --git a/src/bin/pg_basebackup/walmethods.c b/src/bin/pg_basebackup/walmethods.c index a6d08c1270..1e0ff760eb 100644 --- a/src/bin/pg_basebackup/walmethods.c +++ b/src/bin/pg_basebackup/walmethods.c @@ -18,7 +18,7 @@ #include #include -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 #include #endif #ifdef HAVE_LIBZ @@ -70,7 +70,7 @@ typedef struct DirectoryMethodFile #ifdef HAVE_LIBZ gzFile gzfp; #endif -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 LZ4F_compressionContext_t ctx; size_t lz4bufsize; void *lz4buf; @@ -114,7 +114,7 @@ dir_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_ #ifdef HAVE_LIBZ gzFile gzfp = NULL; #endif -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 LZ4F_compressionContext_t ctx = NULL; size_t lz4bufsize = 0; void *lz4buf = NULL; @@ -160,7 +160,7 @@ dir_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_ } } #endif -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 if (dir_data->compression_method == COMPRESSION_LZ4) { size_t ctx_out; @@ -245,7 +245,7 @@ dir_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_ gzclose(gzfp); else #endif -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 if (dir_data->compression_method == COMPRESSION_LZ4) { (void) LZ4F_compressEnd(ctx, lz4buf, lz4bufsize, NULL); @@ -265,7 +265,7 @@ dir_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_ if (dir_data->compression_method == COMPRESSION_GZIP) f->gzfp = gzfp; #endif -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 if (dir_data->compression_method == COMPRESSION_LZ4) { f->ctx = ctx; @@ -306,7 +306,7 @@ dir_write(Walfile f, const void *buf, size_t count) } else #endif -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 if (dir_data->compression_method == COMPRESSION_LZ4) { size_t chunk; @@ -394,7 +394,7 @@ dir_close(Walfile f, WalCloseMethod method) } else #endif -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 if (dir_data->compression_method == COMPRESSION_LZ4) { size_t compressed; @@ -487,7 +487,7 @@ dir_close(Walfile f, WalCloseMethod method) if (r != 0) dir_data->lasterrno = errno; -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 pg_free(df->lz4buf); /* supports free on NULL */ LZ4F_freeCompressionContext(df->ctx); @@ -523,7 +523,7 @@ dir_sync(Walfile f) } } #endif -#ifdef HAVE_LIBLZ4 +#ifdef USE_LZ4 if (dir_data->compression_method == COMPRESSION_LZ4) { DirectoryMethodFile *df = (DirectoryMethodFile *) f; diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index 3e55ff26f8..fd1052e5db 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -3743,7 +3743,7 @@ } # Determine whether build supports LZ4. -my $supports_lz4 = check_pg_config("#define HAVE_LIBLZ4 1"); +my $supports_lz4 = check_pg_config("#define USE_LZ4 1"); # Create additional databases for mutations of schema public $node->psql('postgres', 'create database regress_pg_dump_test;'); diff --git a/src/bin/pg_verifybackup/t/008_untar.pl b/src/bin/pg_verifybackup/t/008_untar.pl index d52ca17430..98d09ce40c 100644 --- a/src/bin/pg_verifybackup/t/008_untar.pl +++ b/src/bin/pg_verifybackup/t/008_untar.pl @@ -41,7 +41,7 @@ 'backup_archive' => 'base.tar.lz4', 'decompress_program' => $ENV{'LZ4'}, 'decompress_flags' => [ '-d', '-m'], - 'enabled' => check_pg_config("#define HAVE_LIBLZ4 1") + 'enabled' => check_pg_config("#define USE_LZ4 1") }, { 'compression_method' => 'zstd', @@ -49,7 +49,7 @@ 'backup_archive' => 'base.tar.zst', 'decompress_program' => $ENV{'ZSTD'}, 'decompress_flags' => [ '-d' ], - 'enabled' => check_pg_config("#define HAVE_LIBZSTD 1") + 'enabled' => check_pg_config("#define USE_ZSTD 1") } ); diff --git a/src/bin/pg_verifybackup/t/009_extract.pl b/src/bin/pg_verifybackup/t/009_extract.pl index d30ba01742..9f9cc7540b 100644 --- a/src/bin/pg_verifybackup/t/009_extract.pl +++ b/src/bin/pg_verifybackup/t/009_extract.pl @@ -30,12 +30,12 @@ { 'compression_method' => 'lz4', 'backup_flags' => ['--compress', 'server-lz4:5'], - 'enabled' => check_pg_config("#define HAVE_LIBLZ4 1") + 'enabled' => check_pg_config("#define USE_LZ4 1") }, { 'compression_method' => 'zstd', 'backup_flags' => ['--compress', 'server-zstd:5'], - 'enabled' => check_pg_config("#define HAVE_LIBZSTD 1") + 'enabled' => check_pg_config("#define USE_ZSTD 1") } ); diff --git a/src/bin/pg_verifybackup/t/010_client_untar.pl b/src/bin/pg_verifybackup/t/010_client_untar.pl index 0b96b6cc43..487e30e826 100644 --- a/src/bin/pg_verifybackup/t/010_client_untar.pl +++ b/src/bin/pg_verifybackup/t/010_client_untar.pl @@ -41,7 +41,7 @@ 'decompress_program' => $ENV{'LZ4'}, 'decompress_flags' => [ '-d' ], 'output_file' => 'base.tar', - 'enabled' => check_pg_config("#define HAVE_LIBLZ4 1") + 'enabled' => check_pg_config("#define USE_LZ4 1") }, { 'compression_method' => 'zstd', @@ -49,7 +49,7 @@ 'backup_archive' => 'base.tar.zst', 'decompress_program' => $ENV{'ZSTD'}, 'decompress_flags' => [ '-d' ], - 'enabled' => check_pg_config("#define HAVE_LIBZSTD 1") + 'enabled' => check_pg_config("#define USE_ZSTD 1") } ); From e4ba69f3f4a1b997aa493cc02e563a91c0f35b87 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 15 Mar 2022 13:22:04 -0400 Subject: [PATCH 140/772] Allow extensions to add new backup targets. Commit 3500ccc39b0dadd1068a03938e4b8ff562587ccc allowed for base backup targets, meaning that we could do something with the backup other than send it to the client, but all of those targets had to be baked in to the core code. This commit makes it possible for extensions to define additional backup targets. Patch by me, reviewed by Abhijit Menon-Sen. Discussion: http://postgr.es/m/CA+TgmoaqvdT-u3nt+_kkZ7bgDAyqDB0i-+XOMmr5JN2Rd37hxw@mail.gmail.com --- src/backend/replication/Makefile | 1 + src/backend/replication/Makefile.orig | 49 ++++ src/backend/replication/basebackup.c | 82 +++---- src/backend/replication/basebackup_target.c | 238 ++++++++++++++++++++ src/include/replication/basebackup_target.h | 66 ++++++ 5 files changed, 381 insertions(+), 55 deletions(-) create mode 100644 src/backend/replication/Makefile.orig create mode 100644 src/backend/replication/basebackup_target.c create mode 100644 src/include/replication/basebackup_target.h diff --git a/src/backend/replication/Makefile b/src/backend/replication/Makefile index 2e6de7007f..3d8fb70c0e 100644 --- a/src/backend/replication/Makefile +++ b/src/backend/replication/Makefile @@ -24,6 +24,7 @@ OBJS = \ basebackup_progress.o \ basebackup_server.o \ basebackup_sink.o \ + basebackup_target.o \ basebackup_throttle.o \ repl_gram.o \ slot.o \ diff --git a/src/backend/replication/Makefile.orig b/src/backend/replication/Makefile.orig new file mode 100644 index 0000000000..2e6de7007f --- /dev/null +++ b/src/backend/replication/Makefile.orig @@ -0,0 +1,49 @@ +#------------------------------------------------------------------------- +# +# Makefile-- +# Makefile for src/backend/replication +# +# IDENTIFICATION +# src/backend/replication/Makefile +# +#------------------------------------------------------------------------- + +subdir = src/backend/replication +top_builddir = ../../.. +include $(top_builddir)/src/Makefile.global + +override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS) + +OBJS = \ + backup_manifest.o \ + basebackup.o \ + basebackup_copy.o \ + basebackup_gzip.o \ + basebackup_lz4.o \ + basebackup_zstd.o \ + basebackup_progress.o \ + basebackup_server.o \ + basebackup_sink.o \ + basebackup_throttle.o \ + repl_gram.o \ + slot.o \ + slotfuncs.o \ + syncrep.o \ + syncrep_gram.o \ + walreceiver.o \ + walreceiverfuncs.o \ + walsender.o + +SUBDIRS = logical + +include $(top_srcdir)/src/backend/common.mk + +# repl_scanner is compiled as part of repl_gram +repl_gram.o: repl_scanner.c + +# syncrep_scanner is compiled as part of syncrep_gram +syncrep_gram.o: syncrep_scanner.c + +# repl_gram.c, repl_scanner.c, syncrep_gram.c and syncrep_scanner.c +# are in the distribution tarball, so they are not cleaned here. +# (Our parent Makefile takes care of them during maintainer-clean.) diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index 2378ce5c5e..c2aedc14a2 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -28,6 +28,7 @@ #include "postmaster/syslogger.h" #include "replication/basebackup.h" #include "replication/basebackup_sink.h" +#include "replication/basebackup_target.h" #include "replication/backup_manifest.h" #include "replication/walsender.h" #include "replication/walsender_private.h" @@ -53,13 +54,6 @@ */ #define SINK_BUFFER_LENGTH Max(32768, BLCKSZ) -typedef enum -{ - BACKUP_TARGET_BLACKHOLE, - BACKUP_TARGET_CLIENT, - BACKUP_TARGET_SERVER -} backup_target_type; - typedef enum { BACKUP_COMPRESSION_NONE, @@ -77,8 +71,9 @@ typedef struct bool includewal; uint32 maxrate; bool sendtblspcmapfile; - backup_target_type target; - char *target_detail; + bool send_to_client; + bool use_copytblspc; + BaseBackupTargetHandle *target_handle; backup_manifest_option manifest; basebackup_compression_type compression; int compression_level; @@ -715,12 +710,12 @@ parse_basebackup_options(List *options, basebackup_options *opt) bool o_manifest_checksums = false; bool o_target = false; bool o_target_detail = false; - char *target_str = "compat"; /* placate compiler */ + char *target_str = NULL; + char *target_detail_str = NULL; bool o_compression = false; bool o_compression_level = false; MemSet(opt, 0, sizeof(*opt)); - opt->target = BACKUP_TARGET_CLIENT; opt->manifest = MANIFEST_OPTION_NO; opt->manifest_checksum_type = CHECKSUM_TYPE_CRC32C; opt->compression = BACKUP_COMPRESSION_NONE; @@ -864,22 +859,11 @@ parse_basebackup_options(List *options, basebackup_options *opt) } else if (strcmp(defel->defname, "target") == 0) { - target_str = defGetString(defel); - if (o_target) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("duplicate option \"%s\"", defel->defname))); - if (strcmp(target_str, "blackhole") == 0) - opt->target = BACKUP_TARGET_BLACKHOLE; - else if (strcmp(target_str, "client") == 0) - opt->target = BACKUP_TARGET_CLIENT; - else if (strcmp(target_str, "server") == 0) - opt->target = BACKUP_TARGET_SERVER; - else - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("unrecognized target: \"%s\"", target_str))); + target_str = defGetString(defel); o_target = true; } else if (strcmp(defel->defname, "target_detail") == 0) @@ -890,7 +874,7 @@ parse_basebackup_options(List *options, basebackup_options *opt) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("duplicate option \"%s\"", defel->defname))); - opt->target_detail = optval; + target_detail_str = optval; o_target_detail = true; } else if (strcmp(defel->defname, "compression") == 0) @@ -942,22 +926,28 @@ parse_basebackup_options(List *options, basebackup_options *opt) errmsg("manifest checksums require a backup manifest"))); opt->manifest_checksum_type = CHECKSUM_TYPE_NONE; } - if (opt->target == BACKUP_TARGET_SERVER) + + if (target_str == NULL) { - if (opt->target_detail == NULL) + if (target_detail_str != NULL) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("target '%s' requires a target detail", - target_str))); + errmsg("target detail cannot be used without target"))); + opt->use_copytblspc = true; + opt->send_to_client = true; } - else + else if (strcmp(target_str, "client") == 0) { - if (opt->target_detail != NULL) + if (target_detail_str != NULL) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("target '%s' does not accept a target detail", target_str))); + opt->send_to_client = true; } + else + opt->target_handle = + BaseBackupGetTargetHandle(target_str, target_detail_str); if (o_compression_level && !o_compression) ereport(ERROR, @@ -993,32 +983,14 @@ SendBaseBackup(BaseBackupCmd *cmd) } /* - * If the TARGET option was specified, then we can use the new copy-stream - * protocol. If the target is specifically 'client' then set up to stream - * the backup to the client; otherwise, it's being sent someplace else and - * should not be sent to the client. - */ - if (opt.target == BACKUP_TARGET_CLIENT) - sink = bbsink_copystream_new(true); - else - sink = bbsink_copystream_new(false); - - /* - * If a non-default backup target is in use, arrange to send the data - * wherever it needs to go. + * If the target is specifically 'client' then set up to stream the backup + * to the client; otherwise, it's being sent someplace else and should not + * be sent to the client. BaseBackupGetSink has the job of setting up a + * sink to send the backup data wherever it needs to go. */ - switch (opt.target) - { - case BACKUP_TARGET_BLACKHOLE: - /* Nothing to do, just discard data. */ - break; - case BACKUP_TARGET_CLIENT: - /* Nothing to do, handling above is sufficient. */ - break; - case BACKUP_TARGET_SERVER: - sink = bbsink_server_new(sink, opt.target_detail); - break; - } + sink = bbsink_copystream_new(opt.send_to_client); + if (opt.target_handle != NULL) + sink = BaseBackupGetSink(opt.target_handle, sink); /* Set up network throttling, if client requested it */ if (opt.maxrate > 0) diff --git a/src/backend/replication/basebackup_target.c b/src/backend/replication/basebackup_target.c new file mode 100644 index 0000000000..d93f5e02db --- /dev/null +++ b/src/backend/replication/basebackup_target.c @@ -0,0 +1,238 @@ +/*------------------------------------------------------------------------- + * + * basebackup_target.c + * Base backups can be "targetted," which means that they can be sent + * somewhere other than to the client which requested the backup. + * Furthermore, new targets can be defined by extensions. This file + * contains code to support that functionality. + * + * Portions Copyright (c) 2010-2020, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/replication/basebackup_gzip.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "replication/basebackup_target.h" +#include "utils/memutils.h" + +typedef struct BaseBackupTargetType +{ + char *name; + void *(*check_detail) (char *, char *); + bbsink *(*get_sink) (bbsink *, void *); +} BaseBackupTargetType; + +struct BaseBackupTargetHandle +{ + BaseBackupTargetType *type; + void *detail_arg; +}; + +static void initialize_target_list(void); +extern bbsink *blackhole_get_sink(bbsink *next_sink, void *detail_arg); +extern bbsink *server_get_sink(bbsink *next_sink, void *detail_arg); +static void *reject_target_detail(char *target, char *target_detail); +static void *server_check_detail(char *target, char *target_detail); + +static BaseBackupTargetType builtin_backup_targets[] = +{ + { + "blackhole", reject_target_detail, blackhole_get_sink + }, + { + "server", server_check_detail, server_get_sink + }, + { + NULL + } +}; + +static List *BaseBackupTargetTypeList = NIL; + +/* + * Add a new base backup target type. + * + * This is intended for use by server extensions. + */ +void +BaseBackupAddTarget(char *name, + void *(*check_detail) (char *, char *), + bbsink *(*get_sink) (bbsink *, void *)) +{ + BaseBackupTargetType *ttype; + MemoryContext oldcontext; + ListCell *lc; + + /* If the target list is not yet initialized, do that first. */ + if (BaseBackupTargetTypeList == NIL) + initialize_target_list(); + + /* Search the target type list for an existing entry with this name. */ + foreach(lc, BaseBackupTargetTypeList) + { + BaseBackupTargetType *ttype = lfirst(lc); + + if (strcmp(ttype->name, name) == 0) + { + /* + * We found one, so update it. + * + * It is probably not a great idea to call BaseBackupAddTarget + * for the same name multiple times, but if it happens, this + * seems like the sanest behavior. + */ + ttype->check_detail = check_detail; + ttype->get_sink = get_sink; + return; + } + } + + /* + * We use TopMemoryContext for allocations here to make sure that the + * data we need doesn't vanish under us; that's also why we copy the + * target name into a newly-allocated chunk of memory. + */ + oldcontext = MemoryContextSwitchTo(TopMemoryContext); + ttype = palloc(sizeof(BaseBackupTargetType)); + ttype->name = pstrdup(name); + ttype->check_detail = check_detail; + ttype->get_sink = get_sink; + BaseBackupTargetTypeList = lappend(BaseBackupTargetTypeList, ttype); + MemoryContextSwitchTo(oldcontext); +} + +/* + * Look up a base backup target and validate the target_detail. + * + * Extensions that define new backup targets will probably define a new + * type of bbsink to match. Validation of the target_detail can be performed + * either in the check_detail routine called here, or in the bbsink + * constructor, which will be called from BaseBackupGetSink. It's mostly + * a matter of taste, but the check_detail function runs somewhat earlier. + */ +BaseBackupTargetHandle * +BaseBackupGetTargetHandle(char *target, char *target_detail) +{ + ListCell *lc; + + /* If the target list is not yet initialized, do that first. */ + if (BaseBackupTargetTypeList == NIL) + initialize_target_list(); + + /* Search the target type list for a match. */ + foreach(lc, BaseBackupTargetTypeList) + { + BaseBackupTargetType *ttype = lfirst(lc); + + if (strcmp(ttype->name, target) == 0) + { + BaseBackupTargetHandle *handle; + + /* Found the target. */ + handle = palloc(sizeof(BaseBackupTargetHandle)); + handle->type = ttype; + handle->detail_arg = ttype->check_detail(target, target_detail); + + return handle; + } + } + + /* Did not find the target. */ + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("unrecognized target: \"%s\"", target))); +} + +/* + * Construct a bbsink that will implement the backup target. + * + * The get_sink function does all the real work, so all we have to do here + * is call it with the correct arguments. Whatever the check_detail function + * returned is here passed through to the get_sink function. This lets those + * two functions communicate with each other, if they wish. If not, the + * check_detail function can simply return the target_detail and let the + * get_sink function take it from there. + */ +bbsink * +BaseBackupGetSink(BaseBackupTargetHandle *handle, bbsink *next_sink) +{ + return handle->type->get_sink(next_sink, handle->detail_arg); +} + +/* + * Load predefined target types into BaseBackupTargetTypeList. + */ +static void +initialize_target_list(void) +{ + BaseBackupTargetType *ttype = builtin_backup_targets; + MemoryContext oldcontext; + + oldcontext = MemoryContextSwitchTo(TopMemoryContext); + while (ttype->name != NULL) + { + BaseBackupTargetTypeList = lappend(BaseBackupTargetTypeList, ttype); + ++ttype; + } + MemoryContextSwitchTo(oldcontext); +} + +/* + * Normally, a get_sink function should construct and return a new bbsink that + * implements the backup target, but the 'blackhole' target just throws the + * data away. We could implement that by adding a bbsink that does nothing + * but forward, but it's even cheaper to implement that by not adding a bbsink + * at all. + */ +bbsink * +blackhole_get_sink(bbsink *next_sink, void *detail_arg) +{ + return next_sink; +} + +/* + * Create a bbsink implementing a server-side backup. + */ +bbsink * +server_get_sink(bbsink *next_sink, void *detail_arg) +{ + return bbsink_server_new(next_sink, detail_arg); +} + +/* + * Implement target-detail checking for a target that does not accept a + * detail. + */ +void * +reject_target_detail(char *target, char *target_detail) +{ + if (target_detail != NULL) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("target '%s' does not accept a target detail", + target))); + + return NULL; +} + +/* + * Implement target-detail checking for a server-side backup. + * + * target_detail should be the name of the directory to which the backup + * should be written, but we don't check that here. Rather, that check, + * as well as the necessary permissions checking, happens in bbsink_server_new. + */ +void * +server_check_detail(char *target, char *target_detail) +{ + if (target_detail == NULL) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("target '%s' requires a target detail", + target))); + + return target_detail; +} diff --git a/src/include/replication/basebackup_target.h b/src/include/replication/basebackup_target.h new file mode 100644 index 0000000000..e23ac29a89 --- /dev/null +++ b/src/include/replication/basebackup_target.h @@ -0,0 +1,66 @@ +/*------------------------------------------------------------------------- + * + * basebackup_target.h + * Extensibility framework for adding base backup targets. + * + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group + * + * src/include/replication/basebackup_target.h + * + *------------------------------------------------------------------------- + */ +#ifndef BASEBACKUP_TARGET_H +#define BASEBACKUP_TARGET_H + +#include "replication/basebackup_sink.h" + +struct BaseBackupTargetHandle; +typedef struct BaseBackupTargetHandle BaseBackupTargetHandle; + +/* + * Extensions can call this function to create new backup targets. + * + * 'name' is the name of the new target. + * + * 'check_detail' is a function that accepts a target name and target detail + * and either throws an error (if the target detail is not valid or some other + * problem, such as a permissions issue, is detected) or returns a pointer to + * the data that will be needed to create a bbsink implementing that target. + * The second argumnt will be NULL if the TARGET_DETAIL option to the + * BASE_BACKUP command was not specified. + * + * 'get_sink' is a function that creates the bbsink. The first argument + * is the successor sink; the sink created by this function should always + * forward to this sink. The second argument is the pointer returned by a + * previous call to the 'check_detail' function. + * + * In practice, a user will type something like "pg_basebackup --target foo:bar + * -Xfetch". That will cause the server to look for a backup target named + * "foo". If one is found, the check_detail callback will be invoked for the + * string "bar", and whatever that callback returns will be passed as the + * second argument to the get_sink callback. + */ +extern void BaseBackupAddTarget(char *name, + void *(*check_detail) (char *, char *), + bbsink * (*get_sink) (bbsink *, void *)); + +/* + * These functions are used by the core code to access base backup targets + * added via BaseBackupAddTarget(). The core code will pass the TARGET and + * TARGET_DETAIL strings obtained from the user to BaseBackupGetTargetHandle, + * which will either throw an error (if the TARGET is not recognized or the + * check_detail hook for that TARGET doesn't like the TARGET_DETAIL) or + * return a BaseBackupTargetHandle object that can later be passed to + * BaseBackupGetSink. + * + * BaseBackupGetSink constructs a bbsink implementing the desired target + * using the BaseBackupTargetHandle and the successor bbsink. It does this + * by arranging to call the get_sink() callback provided by the extension + * that implements the base backup target. + */ +extern BaseBackupTargetHandle *BaseBackupGetTargetHandle(char *target, + char *target_detail); +extern bbsink *BaseBackupGetSink(BaseBackupTargetHandle *handle, + bbsink *next_sink); + +#endif From c6306db24bd913375f99494e38ab315befe44e11 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 15 Mar 2022 13:24:23 -0400 Subject: [PATCH 141/772] Add 'basebackup_to_shell' contrib module. As a demonstration of the sort of thing that can be done by adding a custom backup target, this defines a 'shell' target which executes a command defined by the system administrator. The command is executed once for each tar archive generate by the backup and once for the backup manifest, if any. Each time the command is executed, it receives the contents of th file for which it is executed via standard input. The configured command can use %f to refer to the name of the archive (e.g. base.tar, $TABLESPACE_OID.tar, backup_manifest) and %d to refer to the target detail (pg_basebackup --target shell:DETAIL). A target detail is required if %d appears in the configured command and forbidden if it does not. Patch by me, reviewed by Abhijit Menon-Sen. Discussion: http://postgr.es/m/CA+TgmoaqvdT-u3nt+_kkZ7bgDAyqDB0i-+XOMmr5JN2Rd37hxw@mail.gmail.com --- contrib/Makefile | 1 + contrib/basebackup_to_shell/Makefile | 19 + .../basebackup_to_shell/basebackup_to_shell.c | 419 ++++++++++++++++++ doc/src/sgml/basebackup-to-shell.sgml | 69 +++ doc/src/sgml/contrib.sgml | 1 + doc/src/sgml/filelist.sgml | 1 + 6 files changed, 510 insertions(+) create mode 100644 contrib/basebackup_to_shell/Makefile create mode 100644 contrib/basebackup_to_shell/basebackup_to_shell.c create mode 100644 doc/src/sgml/basebackup-to-shell.sgml diff --git a/contrib/Makefile b/contrib/Makefile index e3e221308b..332b486ecc 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -10,6 +10,7 @@ SUBDIRS = \ auth_delay \ auto_explain \ basic_archive \ + basebackup_to_shell \ bloom \ btree_gin \ btree_gist \ diff --git a/contrib/basebackup_to_shell/Makefile b/contrib/basebackup_to_shell/Makefile new file mode 100644 index 0000000000..f31dfaae9c --- /dev/null +++ b/contrib/basebackup_to_shell/Makefile @@ -0,0 +1,19 @@ +# contrib/basebackup_to_shell/Makefile + +MODULE_big = basebackup_to_shell +OBJS = \ + $(WIN32RES) \ + basebackup_to_shell.o + +PGFILEDESC = "basebackup_to_shell - target basebackup to shell command" + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = contrib/basebackup_to_shell +top_builddir = ../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/contrib/basebackup_to_shell/basebackup_to_shell.c b/contrib/basebackup_to_shell/basebackup_to_shell.c new file mode 100644 index 0000000000..d82cb6d13f --- /dev/null +++ b/contrib/basebackup_to_shell/basebackup_to_shell.c @@ -0,0 +1,419 @@ +/*------------------------------------------------------------------------- + * + * basebackup_to_shell.c + * target base backup files to a shell command + * + * Copyright (c) 2016-2022, PostgreSQL Global Development Group + * + * contrib/basebackup_to_shell/basebackup_to_shell.c + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/xact.h" +#include "miscadmin.h" +#include "replication/basebackup_target.h" +#include "storage/fd.h" +#include "utils/acl.h" +#include "utils/guc.h" + +PG_MODULE_MAGIC; + +typedef struct bbsink_shell +{ + /* Common information for all types of sink. */ + bbsink base; + + /* User-supplied target detail string. */ + char *target_detail; + + /* Shell command pattern being used for this backup. */ + char *shell_command; + + /* The command that is currently running. */ + char *current_command; + + /* Pipe to the running command. */ + FILE *pipe; +} bbsink_shell; + +void _PG_init(void); + +static void *shell_check_detail(char *target, char *target_detail); +static bbsink *shell_get_sink(bbsink *next_sink, void *detail_arg); + +static void bbsink_shell_begin_archive(bbsink *sink, + const char *archive_name); +static void bbsink_shell_archive_contents(bbsink *sink, size_t len); +static void bbsink_shell_end_archive(bbsink *sink); +static void bbsink_shell_begin_manifest(bbsink *sink); +static void bbsink_shell_manifest_contents(bbsink *sink, size_t len); +static void bbsink_shell_end_manifest(bbsink *sink); + +const bbsink_ops bbsink_shell_ops = { + .begin_backup = bbsink_forward_begin_backup, + .begin_archive = bbsink_shell_begin_archive, + .archive_contents = bbsink_shell_archive_contents, + .end_archive = bbsink_shell_end_archive, + .begin_manifest = bbsink_shell_begin_manifest, + .manifest_contents = bbsink_shell_manifest_contents, + .end_manifest = bbsink_shell_end_manifest, + .end_backup = bbsink_forward_end_backup, + .cleanup = bbsink_forward_cleanup +}; + +static char *shell_command = ""; +static char *shell_required_role = ""; + +void +_PG_init(void) +{ + DefineCustomStringVariable("basebackup_to_shell.command", + "Shell command to be executed for each backup file.", + NULL, + &shell_command, + "", + PGC_SIGHUP, + 0, + NULL, NULL, NULL); + + DefineCustomStringVariable("basebackup_to_shell.required_role", + "Backup user must be a member of this role to use shell backup target.", + NULL, + &shell_required_role, + "", + PGC_SIGHUP, + 0, + NULL, NULL, NULL); + + BaseBackupAddTarget("shell", shell_check_detail, shell_get_sink); +} + +/* + * We choose to defer sanity sanity checking until shell_get_sink(), and so + * just pass the target detail through without doing anything. However, we do + * permissions checks here, before any real work has been done. + */ +static void * +shell_check_detail(char *target, char *target_detail) +{ + if (shell_required_role[0] != '\0') + { + Oid roleid; + + StartTransactionCommand(); + roleid = get_role_oid(shell_required_role, true); + if (!is_member_of_role(GetUserId(), roleid)) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied to use basebackup_to_shell"))); + CommitTransactionCommand(); + } + + return target_detail; +} + +/* + * Set up a bbsink to implement this base backup target. + * + * This is also a convenient place to sanity check that a target detail was + * given if and only if %d is present. + */ +static bbsink * +shell_get_sink(bbsink *next_sink, void *detail_arg) +{ + bbsink_shell *sink; + bool has_detail_escape = false; + char *c; + + /* + * Set up the bbsink. + * + * We remember the current value of basebackup_to_shell.shell_command to + * be certain that it can't change under us during the backup. + */ + sink = palloc0(sizeof(bbsink_shell)); + *((const bbsink_ops **) &sink->base.bbs_ops) = &bbsink_shell_ops; + sink->base.bbs_next = next_sink; + sink->target_detail = detail_arg; + sink->shell_command = pstrdup(shell_command); + + /* Reject an empty shell command. */ + if (sink->shell_command[0] == '\0') + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("shell command for backup is not configured")); + + /* Determine whether the shell command we're using contains %d. */ + for (c = sink->shell_command; *c != '\0'; ++c) + { + if (c[0] == '%' && c[1] != '\0') + { + if (c[1] == 'd') + has_detail_escape = true; + ++c; + } + } + + /* There should be a target detail if %d was used, and not otherwise. */ + if (has_detail_escape && sink->target_detail == NULL) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("a target detail is required because the configured command includes %%d"), + errhint("Try \"pg_basebackup --target shell:DETAIL ...\""))); + else if (!has_detail_escape && sink->target_detail != NULL) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("a target detail is not permitted because the configured command does not include %%d"))); + + /* + * Since we're passing the string provided by the user to popen(), it will + * be interpreted by the shell, which is a potential security + * vulnerability, since the user invoking this module is not necessarily + * a superuser. To stay out of trouble, we must disallow any shell + * metacharacters here; to be conservative and keep things simple, we + * allow only alphanumerics. + */ + if (sink->target_detail != NULL) + { + char *d; + bool scary = false; + + for (d = sink->target_detail; *d != '\0'; ++d) + { + if (*d >= 'a' && *d <= 'z') + continue; + if (*d >= 'A' && *d <= 'Z') + continue; + if (*d >= '0' && *d <= '9') + continue; + scary = true; + break; + } + + if (scary) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("target detail must contain only alphanumeric characters")); + } + + return &sink->base; +} + +/* + * Construct the exact shell command that we're actually going to run, + * making substitutions as appropriate for escape sequences. + */ +static char * +shell_construct_command(char *base_command, const char *filename, + char *target_detail) +{ + StringInfoData buf; + char *c; + + initStringInfo(&buf); + for (c = base_command; *c != '\0'; ++c) + { + /* Anything other than '%' is copied verbatim. */ + if (*c != '%') + { + appendStringInfoChar(&buf, *c); + continue; + } + + /* Any time we see '%' we eat the following character as well. */ + ++c; + + /* + * The following character determines what we insert here, or may + * cause us to throw an error. + */ + if (*c == '%') + { + /* '%%' is replaced by a single '%' */ + appendStringInfoChar(&buf, '%'); + } + else if (*c == 'f') + { + /* '%f' is replaced by the filename */ + appendStringInfoString(&buf, filename); + } + else if (*c == 'd') + { + /* '%d' is replaced by the target detail */ + appendStringInfoString(&buf, target_detail); + } + else if (*c == '\0') + { + /* Incomplete escape sequence, expected a character afterward */ + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("shell command ends unexpectedly after escape character \"%%\"")); + } + else + { + /* Unknown escape sequence */ + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("shell command contains unexpected escape sequence \"%c\"", + *c)); + } + } + + return buf.data; +} + +/* + * Finish executing the shell command once all data has been written. + */ +static void +shell_finish_command(bbsink_shell *sink) +{ + int pclose_rc; + + /* There should be a command running. */ + Assert(sink->current_command != NULL); + Assert(sink->pipe != NULL); + + /* Close down the pipe we opened. */ + pclose_rc = ClosePipeStream(sink->pipe); + if (pclose_rc == -1) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not close pipe to external command: %m"))); + else if (pclose_rc != 0) + { + ereport(ERROR, + (errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION), + errmsg("shell command \"%s\" failed", + sink->current_command), + errdetail_internal("%s", wait_result_to_str(pclose_rc)))); + } + + /* Clean up. */ + sink->pipe = NULL; + pfree(sink->current_command); + sink->current_command = NULL; +} + +/* + * Start up the shell command, substituting %f in for the current filename. + */ +static void +shell_run_command(bbsink_shell *sink, const char *filename) +{ + /* There should not be anything already running. */ + Assert(sink->current_command == NULL); + Assert(sink->pipe == NULL); + + /* Construct a suitable command. */ + sink->current_command = shell_construct_command(sink->shell_command, + filename, + sink->target_detail); + + /* Run it. */ + sink->pipe = OpenPipeStream(sink->current_command, PG_BINARY_W); +} + +/* + * Send accumulated data to the running shell command. + */ +static void +shell_send_data(bbsink_shell *sink, size_t len) +{ + /* There should be a command running. */ + Assert(sink->current_command != NULL); + Assert(sink->pipe != NULL); + + /* Try to write the data. */ + if (fwrite(sink->base.bbs_buffer, len, 1, sink->pipe) != 1 || + ferror(sink->pipe)) + { + if (errno == EPIPE) + { + /* + * The error we're about to throw would shut down the command + * anyway, but we may get a more meaningful error message by + * doing this. If not, we'll fall through to the generic error + * below. + */ + shell_finish_command(sink); + errno = EPIPE; + } + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not write to shell backup program: %m"))); + } +} + +/* + * At start of archive, start up the shell command and forward to next sink. + */ +static void +bbsink_shell_begin_archive(bbsink *sink, const char *archive_name) +{ + bbsink_shell *mysink = (bbsink_shell *) sink; + + shell_run_command(mysink, archive_name); + bbsink_forward_begin_archive(sink, archive_name); +} + +/* + * Send archive contents to command's stdin and forward to next sink. + */ +static void +bbsink_shell_archive_contents(bbsink *sink, size_t len) +{ + bbsink_shell *mysink = (bbsink_shell *) sink; + + shell_send_data(mysink, len); + bbsink_forward_archive_contents(sink, len); +} + +/* + * At end of archive, shut down the shell command and forward to next sink. + */ +static void +bbsink_shell_end_archive(bbsink *sink) +{ + bbsink_shell *mysink = (bbsink_shell *) sink; + + shell_finish_command(mysink); + bbsink_forward_end_archive(sink); +} + +/* + * At start of manifest, start up the shell command and forward to next sink. + */ +static void +bbsink_shell_begin_manifest(bbsink *sink) +{ + bbsink_shell *mysink = (bbsink_shell *) sink; + + shell_run_command(mysink, "backup_manifest"); + bbsink_forward_begin_manifest(sink); +} + +/* + * Send manifest contents to command's stdin and forward to next sink. + */ +static void +bbsink_shell_manifest_contents(bbsink *sink, size_t len) +{ + bbsink_shell *mysink = (bbsink_shell *) sink; + + shell_send_data(mysink, len); + bbsink_forward_manifest_contents(sink, len); +} + +/* + * At end of manifest, shut down the shell command and forward to next sink. + */ +static void +bbsink_shell_end_manifest(bbsink *sink) +{ + bbsink_shell *mysink = (bbsink_shell *) sink; + + shell_finish_command(mysink); + bbsink_forward_end_manifest(sink); +} diff --git a/doc/src/sgml/basebackup-to-shell.sgml b/doc/src/sgml/basebackup-to-shell.sgml new file mode 100644 index 0000000000..f36f37e510 --- /dev/null +++ b/doc/src/sgml/basebackup-to-shell.sgml @@ -0,0 +1,69 @@ + + + + basebackup_to_shell + + + basebackup_to_shell + + + + basebackup_to_shell adds a custom basebackup target + called shell. This makes it possible to run + pg_basebackup --target=shell or, depending on how this + module is configured, + pg_basebackup --target=shell:DETAIL_STRING, and cause + a server command chosen by the server administrator to be executed for + each tar archive generated by the backup process. The command will receive + the contents of the archive via standard input. + + + + This module is primarily intended as an example of how to create a new + backup targets via an extension module, but in some scenarios it may be + useful for its own sake. + In order to function, this module must be loaded via + or + . + + + + Configuration Parameters + + + + + basebackup_to_shell.command (string) + + basebackup_to_shell.command configuration parameter + + + + + The command which the server should execute for each archive generated + by the backup process. If %f occurs in the command + string, it will be replaced by the name of the archive (e.g. + base.tar). If %d occurs in the + command string, it will be replaced by the target detail provided by + the user. A target detail is required if %d is + used in the command string, and prohibited otherwise. For security + reasons, it may contain only alphanumeric characters. If + %% occurs in the command string, it will be replaced + by a single %. If % occurs in + the command string followed by any other character or at the end of the + string, an error occurs. + + + + + + + + Author + + + Robert Haas rhaas@postgresql.org + + + + diff --git a/doc/src/sgml/contrib.sgml b/doc/src/sgml/contrib.sgml index be9711c6f2..1e42ce1a7f 100644 --- a/doc/src/sgml/contrib.sgml +++ b/doc/src/sgml/contrib.sgml @@ -99,6 +99,7 @@ CREATE EXTENSION module_name; &amcheck; &auth-delay; &auto-explain; + &basebackup-to-shell; &basic-archive; &bloom; &btree-gin; diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml index 328cd1f378..fd853af01f 100644 --- a/doc/src/sgml/filelist.sgml +++ b/doc/src/sgml/filelist.sgml @@ -114,6 +114,7 @@ + From 8ef1fa3ee05d7acfe3f69d28daabec33db84d870 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 15 Mar 2022 13:41:36 -0400 Subject: [PATCH 142/772] Remove accidentally-committed file. --- src/backend/replication/Makefile.orig | 49 --------------------------- 1 file changed, 49 deletions(-) delete mode 100644 src/backend/replication/Makefile.orig diff --git a/src/backend/replication/Makefile.orig b/src/backend/replication/Makefile.orig deleted file mode 100644 index 2e6de7007f..0000000000 --- a/src/backend/replication/Makefile.orig +++ /dev/null @@ -1,49 +0,0 @@ -#------------------------------------------------------------------------- -# -# Makefile-- -# Makefile for src/backend/replication -# -# IDENTIFICATION -# src/backend/replication/Makefile -# -#------------------------------------------------------------------------- - -subdir = src/backend/replication -top_builddir = ../../.. -include $(top_builddir)/src/Makefile.global - -override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS) - -OBJS = \ - backup_manifest.o \ - basebackup.o \ - basebackup_copy.o \ - basebackup_gzip.o \ - basebackup_lz4.o \ - basebackup_zstd.o \ - basebackup_progress.o \ - basebackup_server.o \ - basebackup_sink.o \ - basebackup_throttle.o \ - repl_gram.o \ - slot.o \ - slotfuncs.o \ - syncrep.o \ - syncrep_gram.o \ - walreceiver.o \ - walreceiverfuncs.o \ - walsender.o - -SUBDIRS = logical - -include $(top_srcdir)/src/backend/common.mk - -# repl_scanner is compiled as part of repl_gram -repl_gram.o: repl_scanner.c - -# syncrep_scanner is compiled as part of syncrep_gram -syncrep_gram.o: syncrep_scanner.c - -# repl_gram.c, repl_scanner.c, syncrep_gram.c and syncrep_scanner.c -# are in the distribution tarball, so they are not cleaned here. -# (Our parent Makefile takes care of them during maintainer-clean.) From a56e7b66010f330782243de9e25ac2a6596be0e1 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Wed, 16 Mar 2022 10:30:55 +1300 Subject: [PATCH 143/772] Silence LLVM 14 API deprecation warnings. We are going to need to handle the upcoming opaque pointer API changes[1], possibly in time for LLVM 15, but in the meantime let's silence the warnings produced by LLVM 14. [1] https://llvm.org/docs/OpaquePointers.html Reviewed-by: Andres Freund Discussion: https://postgr.es/m/CA%2BhUKG%2Bp%3DfaBQR2PSAqWoWa%2B_tJdKPT0wjZPQe7XcDEttUCgdQ%40mail.gmail.com --- src/backend/jit/llvm/Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/backend/jit/llvm/Makefile b/src/backend/jit/llvm/Makefile index 0268bd46d5..2da122a391 100644 --- a/src/backend/jit/llvm/Makefile +++ b/src/backend/jit/llvm/Makefile @@ -22,6 +22,12 @@ endif PGFILEDESC = "llvmjit - JIT using LLVM" NAME = llvmjit +# LLVM 14 produces deprecation warnings. We'll need to make some changes +# before the relevant functions are removed, but for now silence the warnings. +ifeq ($(GCC), yes) +LLVM_CFLAGS += -Wno-deprecated-declarations +endif + # All files in this directory use LLVM. CFLAGS += $(LLVM_CFLAGS) CXXFLAGS += $(LLVM_CXXFLAGS) From 5e6368b42ee6d4b59e085301ca7b0e50f37a897b Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Wed, 16 Mar 2022 13:37:58 +1300 Subject: [PATCH 144/772] Wake up for latches in CheckpointWriteDelay(). The checkpointer shouldn't ignore its latch. Other backends may be waiting for it to drain the request queue. Hopefully real systems don't have a full queue often, but the condition is reached easily when shared_buffers is small. This involves defining a new wait event, which will appear in the pg_stat_activity view often due to spread checkpoints. Back-patch only to 14. Even though the problem exists in earlier branches too, it's hard to hit there. In 14 we stopped using signal handlers for latches on Linux, *BSD and macOS, which were previously hiding this problem by interrupting the sleep (though not reliably, as the signal could arrive before the sleep begins; precisely the problem latches address). Reported-by: Andres Freund Reviewed-by: Andres Freund Discussion: https://postgr.es/m/20220226213942.nb7uvb2pamyu26dj%40alap3.anarazel.de --- doc/src/sgml/monitoring.sgml | 4 ++++ src/backend/postmaster/checkpointer.c | 8 +++++++- src/backend/utils/activity/wait_event.c | 3 +++ src/include/utils/wait_event.h | 1 + 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 9fb62fec8e..8620aaddc7 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -2235,6 +2235,10 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser BaseBackupThrottle Waiting during base backup when throttling activity. + + CheckpointerWriteDelay + Waiting between writes while performing a checkpoint. + PgSleep Waiting due to a call to pg_sleep or diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c index 4488e3a443..a59c3cf020 100644 --- a/src/backend/postmaster/checkpointer.c +++ b/src/backend/postmaster/checkpointer.c @@ -484,6 +484,9 @@ CheckpointerMain(void) } ckpt_active = false; + + /* We may have received an interrupt during the checkpoint. */ + HandleCheckpointerInterrupts(); } /* Check for archive_timeout and switch xlog files if necessary. */ @@ -726,7 +729,10 @@ CheckpointWriteDelay(int flags, double progress) * Checkpointer and bgwriter are no longer related so take the Big * Sleep. */ - pg_usleep(100000L); + WaitLatch(MyLatch, WL_LATCH_SET | WL_EXIT_ON_PM_DEATH | WL_TIMEOUT, + 100, + WAIT_EVENT_CHECKPOINT_WRITE_DELAY); + ResetLatch(MyLatch); } else if (--absorb_counter <= 0) { diff --git a/src/backend/utils/activity/wait_event.c b/src/backend/utils/activity/wait_event.c index 60972c3a75..0706e922b5 100644 --- a/src/backend/utils/activity/wait_event.c +++ b/src/backend/utils/activity/wait_event.c @@ -485,6 +485,9 @@ pgstat_get_wait_timeout(WaitEventTimeout w) case WAIT_EVENT_BASE_BACKUP_THROTTLE: event_name = "BaseBackupThrottle"; break; + case WAIT_EVENT_CHECKPOINT_WRITE_DELAY: + event_name = "CheckpointWriteDelay"; + break; case WAIT_EVENT_PG_SLEEP: event_name = "PgSleep"; break; diff --git a/src/include/utils/wait_event.h b/src/include/utils/wait_event.h index 395d325c5f..d0345c6b49 100644 --- a/src/include/utils/wait_event.h +++ b/src/include/utils/wait_event.h @@ -141,6 +141,7 @@ typedef enum typedef enum { WAIT_EVENT_BASE_BACKUP_THROTTLE = PG_WAIT_TIMEOUT, + WAIT_EVENT_CHECKPOINT_WRITE_DELAY, WAIT_EVENT_PG_SLEEP, WAIT_EVENT_RECOVERY_APPLY_DELAY, WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL, From 076f4d9539e9687d68ada32353c0c16d9bfa3cfb Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 16 Mar 2022 11:19:39 +0900 Subject: [PATCH 145/772] pageinspect: Fix handling of page sizes and AM types This commit fixes a set of issues related to the use of the SQL functions in this module when the caller is able to pass down raw page data as input argument: - The page size check was fuzzy in a couple of places, sometimes looking after only a sub-range, but what we are looking for is an exact match on BLCKSZ. After considering a few options here, I have settled down to do a generalization of get_page_from_raw(). Most of the SQL functions already used that, and this is not strictly required if not accessing an 8-byte-wide value from a raw page, but this feels safer in the long run for alignment-picky environment, particularly if a code path begins to access such values. This also reduces the number of strings that need to be translated. - The BRIN function brin_page_items() uses a Relation but it did not check the access method of the opened index, potentially leading to crashes. All the other functions in need of a Relation already did that. - Some code paths could fail on elog(), but we should to use ereport() for failures that can be triggered by the user. Tests are added to stress all the cases that are fixed as of this commit, with some junk raw pages (\set VERBOSITY ensures that this works across all page sizes) and unexpected index types when functions open relations. Author: Michael Paquier, Justin Prysby Discussion: https://postgr.es/m/20220218030020.GA1137@telsasoft.com Backpatch-through: 10 --- contrib/pageinspect/brinfuncs.c | 36 ++++++++++---------------- contrib/pageinspect/btreefuncs.c | 28 ++++++++++---------- contrib/pageinspect/expected/brin.out | 4 +++ contrib/pageinspect/expected/btree.out | 15 +++++++++++ contrib/pageinspect/expected/gin.out | 11 ++++++++ contrib/pageinspect/expected/gist.out | 15 +++++++++++ contrib/pageinspect/expected/hash.out | 17 ++++++++++++ contrib/pageinspect/expected/page.out | 11 ++++++++ contrib/pageinspect/fsmfuncs.c | 4 ++- contrib/pageinspect/gistfuncs.c | 9 +++++++ contrib/pageinspect/hashfuncs.c | 6 +++-- contrib/pageinspect/rawpage.c | 29 +++------------------ contrib/pageinspect/sql/brin.sql | 4 +++ contrib/pageinspect/sql/btree.sql | 13 ++++++++++ contrib/pageinspect/sql/gin.sql | 9 +++++++ contrib/pageinspect/sql/gist.sql | 13 ++++++++++ contrib/pageinspect/sql/hash.sql | 13 ++++++++++ contrib/pageinspect/sql/page.sql | 9 +++++++ 18 files changed, 179 insertions(+), 67 deletions(-) diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c index b7c8365218..bd0ea8b18c 100644 --- a/contrib/pageinspect/brinfuncs.c +++ b/contrib/pageinspect/brinfuncs.c @@ -16,6 +16,7 @@ #include "access/brin_tuple.h" #include "access/htup_details.h" #include "catalog/index.h" +#include "catalog/pg_am_d.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "lib/stringinfo.h" @@ -31,6 +32,8 @@ PG_FUNCTION_INFO_V1(brin_page_items); PG_FUNCTION_INFO_V1(brin_metapage_info); PG_FUNCTION_INFO_V1(brin_revmap_data); +#define IS_BRIN(r) ((r)->rd_rel->relam == BRIN_AM_OID) + typedef struct brin_column_state { int nstored; @@ -45,8 +48,7 @@ Datum brin_page_type(PG_FUNCTION_ARGS) { bytea *raw_page = PG_GETARG_BYTEA_P(0); - Page page = VARDATA(raw_page); - int raw_page_size; + Page page; char *type; if (!superuser()) @@ -54,14 +56,7 @@ brin_page_type(PG_FUNCTION_ARGS) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to use raw page functions"))); - raw_page_size = VARSIZE(raw_page) - VARHDRSZ; - - if (raw_page_size != BLCKSZ) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("input page too small"), - errdetail("Expected size %d, got %d", - BLCKSZ, raw_page_size))); + page = get_page_from_raw(raw_page); switch (BrinPageType(page)) { @@ -89,19 +84,7 @@ brin_page_type(PG_FUNCTION_ARGS) static Page verify_brin_page(bytea *raw_page, uint16 type, const char *strtype) { - Page page; - int raw_page_size; - - raw_page_size = VARSIZE(raw_page) - VARHDRSZ; - - if (raw_page_size != BLCKSZ) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("input page too small"), - errdetail("Expected size %d, got %d", - BLCKSZ, raw_page_size))); - - page = VARDATA(raw_page); + Page page = get_page_from_raw(raw_page); /* verify the special space says this page is what we want */ if (BrinPageType(page) != type) @@ -143,6 +126,13 @@ brin_page_items(PG_FUNCTION_ARGS) SetSingleFuncCall(fcinfo, 0); indexRel = index_open(indexRelid, AccessShareLock); + + if (!IS_BRIN(indexRel)) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is not a %s index", + RelationGetRelationName(indexRel), "BRIN"))); + bdesc = brin_build_desc(indexRel); /* minimally verify the page we got */ diff --git a/contrib/pageinspect/btreefuncs.c b/contrib/pageinspect/btreefuncs.c index 03debe336b..d9628dd664 100644 --- a/contrib/pageinspect/btreefuncs.c +++ b/contrib/pageinspect/btreefuncs.c @@ -206,8 +206,10 @@ bt_page_stats_internal(PG_FUNCTION_ARGS, enum pageinspect_version ext_version) rel = relation_openrv(relrv, AccessShareLock); if (!IS_INDEX(rel) || !IS_BTREE(rel)) - elog(ERROR, "relation \"%s\" is not a btree index", - RelationGetRelationName(rel)); + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is not a %s index", + RelationGetRelationName(rel), "btree"))); /* * Reject attempts to read non-local temporary relations; we would be @@ -476,8 +478,10 @@ bt_page_items_internal(PG_FUNCTION_ARGS, enum pageinspect_version ext_version) rel = relation_openrv(relrv, AccessShareLock); if (!IS_INDEX(rel) || !IS_BTREE(rel)) - elog(ERROR, "relation \"%s\" is not a btree index", - RelationGetRelationName(rel)); + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is not a %s index", + RelationGetRelationName(rel), "btree"))); /* * Reject attempts to read non-local temporary relations; we would be @@ -588,7 +592,6 @@ bt_page_items_bytea(PG_FUNCTION_ARGS) Datum result; FuncCallContext *fctx; struct user_args *uargs; - int raw_page_size; if (!superuser()) ereport(ERROR, @@ -601,19 +604,12 @@ bt_page_items_bytea(PG_FUNCTION_ARGS) MemoryContext mctx; TupleDesc tupleDesc; - raw_page_size = VARSIZE(raw_page) - VARHDRSZ; - - if (raw_page_size < SizeOfPageHeaderData) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("input page too small (%d bytes)", raw_page_size))); - fctx = SRF_FIRSTCALL_INIT(); mctx = MemoryContextSwitchTo(fctx->multi_call_memory_ctx); uargs = palloc(sizeof(struct user_args)); - uargs->page = VARDATA(raw_page); + uargs->page = get_page_from_raw(raw_page); uargs->offset = FirstOffsetNumber; @@ -698,8 +694,10 @@ bt_metap(PG_FUNCTION_ARGS) rel = relation_openrv(relrv, AccessShareLock); if (!IS_INDEX(rel) || !IS_BTREE(rel)) - elog(ERROR, "relation \"%s\" is not a btree index", - RelationGetRelationName(rel)); + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is not a %s index", + RelationGetRelationName(rel), "btree"))); /* * Reject attempts to read non-local temporary relations; we would be diff --git a/contrib/pageinspect/expected/brin.out b/contrib/pageinspect/expected/brin.out index 71eb190380..10cd36c177 100644 --- a/contrib/pageinspect/expected/brin.out +++ b/contrib/pageinspect/expected/brin.out @@ -48,4 +48,8 @@ SELECT * FROM brin_page_items(get_raw_page('test1_a_idx', 2), 'test1_a_idx') 1 | 0 | 1 | f | f | f | {1 .. 1} (1 row) +-- Failure for non-BRIN index. +CREATE INDEX test1_a_btree ON test1 (a); +SELECT brin_page_items(get_raw_page('test1_a_btree', 0), 'test1_a_btree'); +ERROR: "test1_a_btree" is not a BRIN index DROP TABLE test1; diff --git a/contrib/pageinspect/expected/btree.out b/contrib/pageinspect/expected/btree.out index c60bc88560..80b3dfe861 100644 --- a/contrib/pageinspect/expected/btree.out +++ b/contrib/pageinspect/expected/btree.out @@ -70,4 +70,19 @@ tids | SELECT * FROM bt_page_items(get_raw_page('test1_a_idx', 2)); ERROR: block number 2 is out of range for relation "test1_a_idx" +-- Failure when using a non-btree index. +CREATE INDEX test1_a_hash ON test1 USING hash(a); +SELECT bt_metap('test1_a_hash'); +ERROR: "test1_a_hash" is not a btree index +SELECT bt_page_stats('test1_a_hash', 0); +ERROR: "test1_a_hash" is not a btree index +SELECT bt_page_items('test1_a_hash', 0); +ERROR: "test1_a_hash" is not a btree index +-- Failure with incorrect page size +-- Suppress the DETAIL message, to allow the tests to work across various +-- page sizes. +\set VERBOSITY terse +SELECT bt_page_items('aaa'::bytea); +ERROR: invalid page size +\set VERBOSITY default DROP TABLE test1; diff --git a/contrib/pageinspect/expected/gin.out b/contrib/pageinspect/expected/gin.out index ef7570b972..802f48284b 100644 --- a/contrib/pageinspect/expected/gin.out +++ b/contrib/pageinspect/expected/gin.out @@ -36,3 +36,14 @@ FROM gin_leafpage_items(get_raw_page('test1_y_idx', ?column? | t DROP TABLE test1; +-- Failure with incorrect page size +-- Suppress the DETAIL message, to allow the tests to work across various +-- page sizes. +\set VERBOSITY terse +SELECT gin_leafpage_items('aaa'::bytea); +ERROR: invalid page size +SELECT gin_metapage_info('bbb'::bytea); +ERROR: invalid page size +SELECT gin_page_opaque_info('ccc'::bytea); +ERROR: invalid page size +\set VERBOSITY default diff --git a/contrib/pageinspect/expected/gist.out b/contrib/pageinspect/expected/gist.out index 93abfcdd5e..3f33e04066 100644 --- a/contrib/pageinspect/expected/gist.out +++ b/contrib/pageinspect/expected/gist.out @@ -64,4 +64,19 @@ SELECT itemoffset, ctid, itemlen FROM gist_page_items_bytea(get_raw_page('test_g 6 | (6,65535) | 40 (6 rows) +-- Failure with non-GiST index. +CREATE INDEX test_gist_btree on test_gist(t); +SELECT gist_page_items(get_raw_page('test_gist_btree', 0), 'test_gist_btree'); +ERROR: "test_gist_btree" is not a GiST index +-- Failure with incorrect page size +-- Suppress the DETAIL message, to allow the tests to work across various +-- page sizes. +\set VERBOSITY terse +SELECT gist_page_items_bytea('aaa'::bytea); +ERROR: invalid page size +SELECT gist_page_items('aaa'::bytea, 'test_gist_idx'::regclass); +ERROR: invalid page size +SELECT gist_page_opaque_info('aaa'::bytea); +ERROR: invalid page size +\set VERBOSITY default DROP TABLE test_gist; diff --git a/contrib/pageinspect/expected/hash.out b/contrib/pageinspect/expected/hash.out index bd0628d013..6c606630dd 100644 --- a/contrib/pageinspect/expected/hash.out +++ b/contrib/pageinspect/expected/hash.out @@ -163,4 +163,21 @@ SELECT * FROM hash_page_items(get_raw_page('test_hash_a_idx', 4)); SELECT * FROM hash_page_items(get_raw_page('test_hash_a_idx', 5)); ERROR: page is not a hash bucket or overflow page +-- Failure with non-hash index +CREATE INDEX test_hash_a_btree ON test_hash USING btree (a); +SELECT hash_bitmap_info('test_hash_a_btree', 0); +ERROR: "test_hash_a_btree" is not a hash index +-- Failure with incorrect page size +-- Suppress the DETAIL message, to allow the tests to work across various +-- page sizes. +\set VERBOSITY terse +SELECT hash_metapage_info('aaa'::bytea); +ERROR: invalid page size +SELECT hash_page_items('bbb'::bytea); +ERROR: invalid page size +SELECT hash_page_stats('ccc'::bytea); +ERROR: invalid page size +SELECT hash_page_type('ddd'::bytea); +ERROR: invalid page size +\set VERBOSITY default DROP TABLE test_hash; diff --git a/contrib/pageinspect/expected/page.out b/contrib/pageinspect/expected/page.out index 4e325ae56d..9bbdda7f18 100644 --- a/contrib/pageinspect/expected/page.out +++ b/contrib/pageinspect/expected/page.out @@ -207,3 +207,14 @@ select tuple_data_split('test8'::regclass, t_data, t_infomask, t_infomask2, t_bi (1 row) drop table test8; +-- Failure with incorrect page size +-- Suppress the DETAIL message, to allow the tests to work across various +-- page sizes. +\set VERBOSITY terse +SELECT fsm_page_contents('aaa'::bytea); +ERROR: invalid page size +SELECT page_checksum('bbb'::bytea, 0); +ERROR: invalid page size +SELECT page_header('ccc'::bytea); +ERROR: invalid page size +\set VERBOSITY default diff --git a/contrib/pageinspect/fsmfuncs.c b/contrib/pageinspect/fsmfuncs.c index dadd62aa20..b914da1d4a 100644 --- a/contrib/pageinspect/fsmfuncs.c +++ b/contrib/pageinspect/fsmfuncs.c @@ -36,6 +36,7 @@ fsm_page_contents(PG_FUNCTION_ARGS) { bytea *raw_page = PG_GETARG_BYTEA_P(0); StringInfoData sinfo; + Page page; FSMPage fsmpage; int i; @@ -44,7 +45,8 @@ fsm_page_contents(PG_FUNCTION_ARGS) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to use raw page functions"))); - fsmpage = (FSMPage) PageGetContents(VARDATA(raw_page)); + page = get_page_from_raw(raw_page); + fsmpage = (FSMPage) PageGetContents(page); initStringInfo(&sinfo); diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c index 10d6dd44d4..a31cff47fe 100644 --- a/contrib/pageinspect/gistfuncs.c +++ b/contrib/pageinspect/gistfuncs.c @@ -14,6 +14,7 @@ #include "access/htup.h" #include "access/relation.h" #include "catalog/namespace.h" +#include "catalog/pg_am_d.h" #include "funcapi.h" #include "miscadmin.h" #include "pageinspect.h" @@ -28,6 +29,8 @@ PG_FUNCTION_INFO_V1(gist_page_opaque_info); PG_FUNCTION_INFO_V1(gist_page_items); PG_FUNCTION_INFO_V1(gist_page_items_bytea); +#define IS_GIST(r) ((r)->rd_rel->relam == GIST_AM_OID) + #define ItemPointerGetDatum(X) PointerGetDatum(X) @@ -174,6 +177,12 @@ gist_page_items(PG_FUNCTION_ARGS) /* Open the relation */ indexRel = index_open(indexRelid, AccessShareLock); + if (!IS_GIST(indexRel)) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is not a %s index", + RelationGetRelationName(indexRel), "GiST"))); + page = get_page_from_raw(raw_page); /* Avoid bogus PageGetMaxOffsetNumber() call with deleted pages */ diff --git a/contrib/pageinspect/hashfuncs.c b/contrib/pageinspect/hashfuncs.c index 090eba4a93..ff73c363fc 100644 --- a/contrib/pageinspect/hashfuncs.c +++ b/contrib/pageinspect/hashfuncs.c @@ -417,8 +417,10 @@ hash_bitmap_info(PG_FUNCTION_ARGS) indexRel = index_open(indexRelid, AccessShareLock); if (!IS_HASH(indexRel)) - elog(ERROR, "relation \"%s\" is not a hash index", - RelationGetRelationName(indexRel)); + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is not a %s index", + RelationGetRelationName(indexRel), "hash"))); if (RELATION_IS_OTHER_TEMP(indexRel)) ereport(ERROR, diff --git a/contrib/pageinspect/rawpage.c b/contrib/pageinspect/rawpage.c index 7e41af045f..92ffb2d930 100644 --- a/contrib/pageinspect/rawpage.c +++ b/contrib/pageinspect/rawpage.c @@ -246,7 +246,6 @@ Datum page_header(PG_FUNCTION_ARGS) { bytea *raw_page = PG_GETARG_BYTEA_P(0); - int raw_page_size; TupleDesc tupdesc; @@ -263,18 +262,7 @@ page_header(PG_FUNCTION_ARGS) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to use raw page functions"))); - raw_page_size = VARSIZE(raw_page) - VARHDRSZ; - - /* - * Check that enough data was supplied, so that we don't try to access - * fields outside the supplied buffer. - */ - if (raw_page_size < SizeOfPageHeaderData) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("input page too small (%d bytes)", raw_page_size))); - - page = (PageHeader) VARDATA(raw_page); + page = (PageHeader) get_page_from_raw(raw_page); /* Build a tuple descriptor for our result type */ if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) @@ -350,8 +338,7 @@ page_checksum_internal(PG_FUNCTION_ARGS, enum pageinspect_version ext_version) { bytea *raw_page = PG_GETARG_BYTEA_P(0); int64 blkno = (ext_version == PAGEINSPECT_V1_8 ? PG_GETARG_UINT32(1) : PG_GETARG_INT64(1)); - int raw_page_size; - PageHeader page; + Page page; if (!superuser()) ereport(ERROR, @@ -363,17 +350,7 @@ page_checksum_internal(PG_FUNCTION_ARGS, enum pageinspect_version ext_version) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid block number"))); - raw_page_size = VARSIZE(raw_page) - VARHDRSZ; - - /* - * Check that the supplied page is of the right size. - */ - if (raw_page_size != BLCKSZ) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("incorrect size of input page (%d bytes)", raw_page_size))); - - page = (PageHeader) VARDATA(raw_page); + page = get_page_from_raw(raw_page); PG_RETURN_INT16(pg_checksum_page((char *) page, blkno)); } diff --git a/contrib/pageinspect/sql/brin.sql b/contrib/pageinspect/sql/brin.sql index 735bc3b673..8717229c5d 100644 --- a/contrib/pageinspect/sql/brin.sql +++ b/contrib/pageinspect/sql/brin.sql @@ -15,4 +15,8 @@ SELECT * FROM brin_revmap_data(get_raw_page('test1_a_idx', 1)) LIMIT 5; SELECT * FROM brin_page_items(get_raw_page('test1_a_idx', 2), 'test1_a_idx') ORDER BY blknum, attnum LIMIT 5; +-- Failure for non-BRIN index. +CREATE INDEX test1_a_btree ON test1 (a); +SELECT brin_page_items(get_raw_page('test1_a_btree', 0), 'test1_a_btree'); + DROP TABLE test1; diff --git a/contrib/pageinspect/sql/btree.sql b/contrib/pageinspect/sql/btree.sql index 9635917959..fdda777b9e 100644 --- a/contrib/pageinspect/sql/btree.sql +++ b/contrib/pageinspect/sql/btree.sql @@ -21,4 +21,17 @@ SELECT * FROM bt_page_items(get_raw_page('test1_a_idx', 0)); SELECT * FROM bt_page_items(get_raw_page('test1_a_idx', 1)); SELECT * FROM bt_page_items(get_raw_page('test1_a_idx', 2)); +-- Failure when using a non-btree index. +CREATE INDEX test1_a_hash ON test1 USING hash(a); +SELECT bt_metap('test1_a_hash'); +SELECT bt_page_stats('test1_a_hash', 0); +SELECT bt_page_items('test1_a_hash', 0); + +-- Failure with incorrect page size +-- Suppress the DETAIL message, to allow the tests to work across various +-- page sizes. +\set VERBOSITY terse +SELECT bt_page_items('aaa'::bytea); +\set VERBOSITY default + DROP TABLE test1; diff --git a/contrib/pageinspect/sql/gin.sql b/contrib/pageinspect/sql/gin.sql index 423f5c5749..aadb07856d 100644 --- a/contrib/pageinspect/sql/gin.sql +++ b/contrib/pageinspect/sql/gin.sql @@ -19,3 +19,12 @@ FROM gin_leafpage_items(get_raw_page('test1_y_idx', current_setting('block_size')::bigint)::int - 1)); DROP TABLE test1; + +-- Failure with incorrect page size +-- Suppress the DETAIL message, to allow the tests to work across various +-- page sizes. +\set VERBOSITY terse +SELECT gin_leafpage_items('aaa'::bytea); +SELECT gin_metapage_info('bbb'::bytea); +SELECT gin_page_opaque_info('ccc'::bytea); +\set VERBOSITY default diff --git a/contrib/pageinspect/sql/gist.sql b/contrib/pageinspect/sql/gist.sql index 3e83239a9d..8abeb19140 100644 --- a/contrib/pageinspect/sql/gist.sql +++ b/contrib/pageinspect/sql/gist.sql @@ -26,4 +26,17 @@ SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 1), 'test_gist_idx') -- platform-dependent (endianness), so omit the actual key data from the output. SELECT itemoffset, ctid, itemlen FROM gist_page_items_bytea(get_raw_page('test_gist_idx', 0)); +-- Failure with non-GiST index. +CREATE INDEX test_gist_btree on test_gist(t); +SELECT gist_page_items(get_raw_page('test_gist_btree', 0), 'test_gist_btree'); + +-- Failure with incorrect page size +-- Suppress the DETAIL message, to allow the tests to work across various +-- page sizes. +\set VERBOSITY terse +SELECT gist_page_items_bytea('aaa'::bytea); +SELECT gist_page_items('aaa'::bytea, 'test_gist_idx'::regclass); +SELECT gist_page_opaque_info('aaa'::bytea); +\set VERBOSITY default + DROP TABLE test_gist; diff --git a/contrib/pageinspect/sql/hash.sql b/contrib/pageinspect/sql/hash.sql index 64f33f1d52..fcddd706ae 100644 --- a/contrib/pageinspect/sql/hash.sql +++ b/contrib/pageinspect/sql/hash.sql @@ -78,5 +78,18 @@ SELECT * FROM hash_page_items(get_raw_page('test_hash_a_idx', 3)); SELECT * FROM hash_page_items(get_raw_page('test_hash_a_idx', 4)); SELECT * FROM hash_page_items(get_raw_page('test_hash_a_idx', 5)); +-- Failure with non-hash index +CREATE INDEX test_hash_a_btree ON test_hash USING btree (a); +SELECT hash_bitmap_info('test_hash_a_btree', 0); + +-- Failure with incorrect page size +-- Suppress the DETAIL message, to allow the tests to work across various +-- page sizes. +\set VERBOSITY terse +SELECT hash_metapage_info('aaa'::bytea); +SELECT hash_page_items('bbb'::bytea); +SELECT hash_page_stats('ccc'::bytea); +SELECT hash_page_type('ddd'::bytea); +\set VERBOSITY default DROP TABLE test_hash; diff --git a/contrib/pageinspect/sql/page.sql b/contrib/pageinspect/sql/page.sql index d333b763d7..38b1681541 100644 --- a/contrib/pageinspect/sql/page.sql +++ b/contrib/pageinspect/sql/page.sql @@ -82,3 +82,12 @@ select t_bits, t_data from heap_page_items(get_raw_page('test8', 0)); select tuple_data_split('test8'::regclass, t_data, t_infomask, t_infomask2, t_bits) from heap_page_items(get_raw_page('test8', 0)); drop table test8; + +-- Failure with incorrect page size +-- Suppress the DETAIL message, to allow the tests to work across various +-- page sizes. +\set VERBOSITY terse +SELECT fsm_page_contents('aaa'::bytea); +SELECT page_checksum('bbb'::bytea, 0); +SELECT page_header('ccc'::bytea); +\set VERBOSITY default From 3390ef1b7be28eac24dd95af23a4a287e6e7b1a4 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Wed, 16 Mar 2022 15:35:16 +1300 Subject: [PATCH 146/772] Fix waiting in RegisterSyncRequest(). If we run out of space in the checkpointer sync request queue (which is hopefully rare on real systems, but common with very small buffer pool), we wait for it to drain. While waiting, we should report that as a wait event so that users know what is going on, and also handle postmaster death, since otherwise the loop might never terminate if the checkpointer has exited. Back-patch to 12. Although the problem exists in earlier releases too, the code is structured differently before 12 so I haven't gone any further for now, in the absence of field complaints. Reported-by: Andres Freund Reviewed-by: Andres Freund Discussion: https://postgr.es/m/20220226213942.nb7uvb2pamyu26dj%40alap3.anarazel.de --- doc/src/sgml/monitoring.sgml | 5 +++++ src/backend/storage/sync/sync.c | 4 +++- src/backend/utils/activity/wait_event.c | 3 +++ src/include/utils/wait_event.h | 1 + 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 8620aaddc7..71559442f0 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -2254,6 +2254,11 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser Waiting during recovery when WAL data is not available from any source (pg_wal, archive or stream). + + RegisterSyncRequest + Waiting while sending synchronization requests to the + checkpointer, because the request queue is full. + VacuumDelay Waiting in a cost-based vacuum delay point. diff --git a/src/backend/storage/sync/sync.c b/src/backend/storage/sync/sync.c index e161d57761..0c4d9ce687 100644 --- a/src/backend/storage/sync/sync.c +++ b/src/backend/storage/sync/sync.c @@ -31,6 +31,7 @@ #include "storage/bufmgr.h" #include "storage/fd.h" #include "storage/ipc.h" +#include "storage/latch.h" #include "storage/md.h" #include "utils/hsearch.h" #include "utils/inval.h" @@ -606,7 +607,8 @@ RegisterSyncRequest(const FileTag *ftag, SyncRequestType type, if (ret || (!ret && !retryOnError)) break; - pg_usleep(10000L); + WaitLatch(NULL, WL_EXIT_ON_PM_DEATH | WL_TIMEOUT, 10, + WAIT_EVENT_REGISTER_SYNC_REQUEST); } return ret; diff --git a/src/backend/utils/activity/wait_event.c b/src/backend/utils/activity/wait_event.c index 0706e922b5..ff46a0e3c7 100644 --- a/src/backend/utils/activity/wait_event.c +++ b/src/backend/utils/activity/wait_event.c @@ -497,6 +497,9 @@ pgstat_get_wait_timeout(WaitEventTimeout w) case WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL: event_name = "RecoveryRetrieveRetryInterval"; break; + case WAIT_EVENT_REGISTER_SYNC_REQUEST: + event_name = "RegisterSyncRequest"; + break; case WAIT_EVENT_VACUUM_DELAY: event_name = "VacuumDelay"; break; diff --git a/src/include/utils/wait_event.h b/src/include/utils/wait_event.h index d0345c6b49..1c39ce031a 100644 --- a/src/include/utils/wait_event.h +++ b/src/include/utils/wait_event.h @@ -145,6 +145,7 @@ typedef enum WAIT_EVENT_PG_SLEEP, WAIT_EVENT_RECOVERY_APPLY_DELAY, WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL, + WAIT_EVENT_REGISTER_SYNC_REQUEST, WAIT_EVENT_VACUUM_DELAY, WAIT_EVENT_VACUUM_TRUNCATE } WaitEventTimeout; From 501c66c81b755583fa516c88e1cc7c760dc88bd5 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Wed, 16 Mar 2022 15:53:28 +1300 Subject: [PATCH 147/772] Fix documentation typo in commit 5e6368b4. Back-patch to 14. --- doc/src/sgml/monitoring.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 71559442f0..35b2923c5e 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -2236,7 +2236,7 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser Waiting during base backup when throttling activity. - CheckpointerWriteDelay + CheckpointWriteDelay Waiting between writes while performing a checkpoint. From 4477dcb207c23f808737a5059157a085212f55e9 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 16 Mar 2022 12:29:39 +0900 Subject: [PATCH 148/772] pageinspect: Fix memory context allocation of page in brin_revmap_data() This caused the function to fail, as the aligned copy of the raw page given by the function caller was not saved in the correct memory context, which needs to be multi_call_memory_ctx in this case. Issue introduced by 076f4d9. Per buildfarm members sifika, mylodon and longfin. I have reproduced that locally with macos. Discussion: https://postgr.es/m/YjFPOtfCW6yLXUeM@paquier.xyz Backpatch-through: 10 --- contrib/pageinspect/brinfuncs.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c index bd0ea8b18c..bf12901ac3 100644 --- a/contrib/pageinspect/brinfuncs.c +++ b/contrib/pageinspect/brinfuncs.c @@ -355,15 +355,15 @@ brin_revmap_data(PG_FUNCTION_ARGS) MemoryContext mctx; Page page; - /* minimally verify the page we got */ - page = verify_brin_page(raw_page, BRIN_PAGETYPE_REVMAP, "revmap"); - /* create a function context for cross-call persistence */ fctx = SRF_FIRSTCALL_INIT(); /* switch to memory context appropriate for multiple function calls */ mctx = MemoryContextSwitchTo(fctx->multi_call_memory_ctx); + /* minimally verify the page we got */ + page = verify_brin_page(raw_page, BRIN_PAGETYPE_REVMAP, "revmap"); + state = palloc(sizeof(*state)); state->tids = ((RevmapContents *) PageGetContents(page))->rm_tids; state->idx = 0; From 46d9bfb0a68f7b145199711d2fb5d37561c4a130 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Wed, 16 Mar 2022 17:20:24 +1300 Subject: [PATCH 149/772] Fix race between DROP TABLESPACE and checkpointing. Commands like ALTER TABLE SET TABLESPACE may leave files for the next checkpoint to clean up. If such files are not removed by the time DROP TABLESPACE is called, we request a checkpoint so that they are deleted. However, there is presently a window before checkpoint start where new unlink requests won't be scheduled until the following checkpoint. This means that the checkpoint forced by DROP TABLESPACE might not remove the files we expect it to remove, and the following ERROR will be emitted: ERROR: tablespace "mytblspc" is not empty To fix, add a call to AbsorbSyncRequests() just before advancing the unlink cycle counter. This ensures that any unlink requests forwarded prior to checkpoint start (i.e., when ckpt_started is incremented) will be processed by the current checkpoint. Since AbsorbSyncRequests() performs memory allocations, it cannot be called within a critical section, so we also need to move SyncPreCheckpoint() to before CreateCheckPoint()'s critical section. This is an old bug, so back-patch to all supported versions. Author: Nathan Bossart Reported-by: Nathan Bossart Reviewed-by: Thomas Munro Reviewed-by: Andres Freund Discussion: https://postgr.es/m/20220215235845.GA2665318%40nathanxps13 --- src/backend/access/transam/xlog.c | 15 ++++++++------- src/backend/storage/sync/sync.c | 14 +++++++++++++- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index ed16f279b1..f436471b27 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -6297,6 +6297,14 @@ CreateCheckPoint(int flags) MemSet(&CheckpointStats, 0, sizeof(CheckpointStats)); CheckpointStats.ckpt_start_t = GetCurrentTimestamp(); + /* + * Let smgr prepare for checkpoint; this has to happen outside the + * critical section and before we determine the REDO pointer. Note that + * smgr must not do anything that'd have to be undone if we decide no + * checkpoint is needed. + */ + SyncPreCheckpoint(); + /* * Use a critical section to force system panic if we have trouble. */ @@ -6310,13 +6318,6 @@ CreateCheckPoint(int flags) LWLockRelease(ControlFileLock); } - /* - * Let smgr prepare for checkpoint; this has to happen before we determine - * the REDO pointer. Note that smgr must not do anything that'd have to - * be undone if we decide no checkpoint is needed. - */ - SyncPreCheckpoint(); - /* Begin filling in the checkpoint WAL record */ MemSet(&checkPoint, 0, sizeof(checkPoint)); checkPoint.time = (pg_time_t) time(NULL); diff --git a/src/backend/storage/sync/sync.c b/src/backend/storage/sync/sync.c index 0c4d9ce687..c695d816fc 100644 --- a/src/backend/storage/sync/sync.c +++ b/src/backend/storage/sync/sync.c @@ -174,7 +174,9 @@ InitSync(void) * counter is incremented here. * * This must be called *before* the checkpoint REDO point is determined. - * That ensures that we won't delete files too soon. + * That ensures that we won't delete files too soon. Since this calls + * AbsorbSyncRequests(), which performs memory allocations, it cannot be + * called within a critical section. * * Note that we can't do anything here that depends on the assumption * that the checkpoint will be completed. @@ -182,6 +184,16 @@ InitSync(void) void SyncPreCheckpoint(void) { + /* + * Operations such as DROP TABLESPACE assume that the next checkpoint will + * process all recently forwarded unlink requests, but if they aren't + * absorbed prior to advancing the cycle counter, they won't be processed + * until a future checkpoint. The following absorb ensures that any + * unlink requests forwarded before the checkpoint began will be processed + * in the current checkpoint. + */ + AbsorbSyncRequests(); + /* * Any unlink requests arriving after this point will be assigned the next * cycle counter, and won't be unlinked until next checkpoint. From 7e74aafc4335e743199c6c68ca9dd539053db9e5 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Wed, 16 Mar 2022 11:41:18 +0300 Subject: [PATCH 150/772] Fix default signature length for gist_ltree_ops 911e702077 implemented operator class parameters including the signature length in ltree. Previously, the signature length for gist_ltree_ops was 8. Because of bug 911e702077 the default signature length for gist_ltree_ops became 28 for ltree 1.1 (where options method is NOT provided) and 8 for ltree 1.2 (where options method is provided). This commit changes the default signature length for ltree 1.1 to 8. Existing gist_ltree_ops indexes might be corrupted in various scenarios. Thus, we have to recommend reindexing all the gist_ltree_ops indexes after the upgrade. Reported-by: Victor Yegorov Reviewed-by: Tomas Vondra, Tom Lane, Andres Freund, Nikita Glukhov Reviewed-by: Andrew Dunstan Author: Tomas Vondra, Alexander Korotkov Discussion: https://postgr.es/m/17406-71e02820ae79bb40%40postgresql.org Discussion: https://postgr.es/m/d80e0a55-6c3e-5b26-53e3-3c4f973f737c%40enterprisedb.com --- contrib/ltree/ltree.h | 8 +++++--- contrib/ltree/ltree_gist.c | 12 ++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/contrib/ltree/ltree.h b/contrib/ltree/ltree.h index 5b4be5e680..10341d6021 100644 --- a/contrib/ltree/ltree.h +++ b/contrib/ltree/ltree.h @@ -229,11 +229,13 @@ int ltree_strncasecmp(const char *a, const char *b, size_t s); /* GiST support for ltree */ -#define SIGLEN_MAX GISTMaxIndexKeySize -#define SIGLEN_DEFAULT (2 * sizeof(int32)) #define BITBYTE 8 -#define SIGLEN (sizeof(int32) * SIGLENINT) #define SIGLENBIT(siglen) ((siglen) * BITBYTE) +#define LTREE_SIGLEN_DEFAULT (2 * sizeof(int32)) +#define LTREE_SIGLEN_MAX GISTMaxIndexKeySize +#define LTREE_GET_SIGLEN() (PG_HAS_OPCLASS_OPTIONS() ? \ + ((LtreeGistOptions *) PG_GET_OPCLASS_OPTIONS())->siglen : \ + LTREE_SIGLEN_DEFAULT) typedef unsigned char *BITVECP; diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c index 7c39ed4298..36874e9c72 100644 --- a/contrib/ltree/ltree_gist.c +++ b/contrib/ltree/ltree_gist.c @@ -130,7 +130,7 @@ ltree_same(PG_FUNCTION_ARGS) ltree_gist *a = (ltree_gist *) PG_GETARG_POINTER(0); ltree_gist *b = (ltree_gist *) PG_GETARG_POINTER(1); bool *result = (bool *) PG_GETARG_POINTER(2); - int siglen = LTREE_GET_ASIGLEN(); + int siglen = LTREE_GET_SIGLEN(); *result = false; if (LTG_ISONENODE(a) != LTG_ISONENODE(b)) @@ -190,7 +190,7 @@ ltree_union(PG_FUNCTION_ARGS) { GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); int *size = (int *) PG_GETARG_POINTER(1); - int siglen = LTREE_GET_ASIGLEN(); + int siglen = LTREE_GET_SIGLEN(); BITVECP base = palloc0(siglen); int32 i, j; @@ -260,7 +260,7 @@ ltree_penalty(PG_FUNCTION_ARGS) ltree_gist *origval = (ltree_gist *) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(0))->key); ltree_gist *newval = (ltree_gist *) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(1))->key); float *penalty = (float *) PG_GETARG_POINTER(2); - int siglen = LTREE_GET_ASIGLEN(); + int siglen = LTREE_GET_SIGLEN(); int32 cmpr, cmpl; @@ -292,7 +292,7 @@ ltree_picksplit(PG_FUNCTION_ARGS) { GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1); - int siglen = LTREE_GET_ASIGLEN(); + int siglen = LTREE_GET_SIGLEN(); OffsetNumber j; int32 i; RIX *array; @@ -618,7 +618,7 @@ ltree_consistent(PG_FUNCTION_ARGS) /* Oid subtype = PG_GETARG_OID(3); */ bool *recheck = (bool *) PG_GETARG_POINTER(4); - int siglen = LTREE_GET_ASIGLEN(); + int siglen = LTREE_GET_SIGLEN(); ltree_gist *key = (ltree_gist *) DatumGetPointer(entry->key); void *query = NULL; bool res = false; @@ -724,7 +724,7 @@ ltree_gist_options(PG_FUNCTION_ARGS) init_local_reloptions(relopts, sizeof(LtreeGistOptions)); add_local_int_reloption(relopts, "siglen", "signature length in bytes", - SIGLEN_DEFAULT, 1, SIGLEN_MAX, + LTREE_SIGLEN_DEFAULT, 1, LTREE_SIGLEN_MAX, offsetof(LtreeGistOptions, siglen)); PG_RETURN_VOID(); From 3ac577b912fb869f8c472c66f9bd60db833a103a Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Wed, 16 Mar 2022 11:38:29 +0100 Subject: [PATCH 151/772] doc: Ensure intermediate path creation with mkdir The mkdir command in the Installation from Source Short Version docs didn't use the -p intermediate path creation parameter which likely would cause the command to fail. At the time of writing, -p wasn't universally available but it can now be relied upon existing. The -p parameter is defined by POSIX, at least since posix-2004. Reported-by: Daniel Westermann Reviewed-by: Tom Lane Discussion: https://postgr.es/m/ZR0P278MB0920263E7F2D546A33E50079D20E9@ZR0P278MB0920.CHEP278.PROD.OUTLOOK.COM --- doc/src/sgml/installation.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index a239bbef2f..dcd1e772c6 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -41,7 +41,7 @@ make su make install adduser postgres -mkdir /usr/local/pgsql/data +mkdir -p /usr/local/pgsql/data chown postgres /usr/local/pgsql/data su - postgres /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data From d0083c1d2a21f2e5c8f341891cca4fad5a616758 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 16 Mar 2022 09:26:48 -0400 Subject: [PATCH 152/772] Suppress compiler warnings. Michael Paquier Discussion: http://postgr.es/m/YjGvq4zPDT6j15go@paquier.xyz --- src/backend/replication/basebackup_target.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backend/replication/basebackup_target.c b/src/backend/replication/basebackup_target.c index d93f5e02db..d8b7cb3243 100644 --- a/src/backend/replication/basebackup_target.c +++ b/src/backend/replication/basebackup_target.c @@ -144,6 +144,9 @@ BaseBackupGetTargetHandle(char *target, char *target_detail) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("unrecognized target: \"%s\"", target))); + + /* keep compiler quiet */ + return NULL; } /* From c91f71b9dc91ef95e1d50d6d782f477258374fc6 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Wed, 16 Mar 2022 16:42:47 +0100 Subject: [PATCH 153/772] Fix publish_as_relid with multiple publications Commit 83fd4532a7 allowed publishing of changes via ancestors, for publications defined with publish_via_partition_root. But the way the ancestor was determined in get_rel_sync_entry() was incorrect, simply updating the same variable. So with multiple publications, replicating different ancestors, the outcome depended on the order of publications in the list - the value from the last loop was used, even if it wasn't the top-most ancestor. This is a probably rare situation, as in most cases publications do not overlap, so each partition has exactly one candidate ancestor to replicate as and there's no ambiguity. Fixed by tracking the "ancestor level" for each publication, and picking the top-most ancestor. Adds a test case, verifying the correct ancestor is used for publishing the changes and that this does not depend on order of publications in the list. Older releases have another bug in this loop - once all actions are replicated, the loop is terminated, on the assumption that inspecting additional publications is unecessary. But that misses the fact that those additional applications may replicate different ancestors. Fixed by removal of this break condition. We might still terminate the loop in some cases (e.g. when replicating all actions and the ancestor is the partition root). Backpatch to 13, where publish_via_partition_root was introduced. Initial report and fix by me, test added by Hou zj. Reviews and improvements by Amit Kapila. Author: Tomas Vondra, Hou zj, Amit Kapila Reviewed-by: Amit Kapila, Hou zj Discussion: https://postgr.es/m/d26d24dd-2fab-3c48-0162-2b7f84a9c893%40enterprisedb.com --- src/backend/catalog/pg_publication.c | 21 +++++- src/backend/commands/publicationcmds.c | 3 +- src/backend/replication/pgoutput/pgoutput.c | 43 +++++++++++- src/include/catalog/pg_publication.h | 3 +- src/test/subscription/t/013_partition.pl | 72 ++++++++++++++++++++- 5 files changed, 133 insertions(+), 9 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 25998fbb39..789b895db8 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -277,16 +277,21 @@ GetPubPartitionOptionRelations(List *result, PublicationPartOpt pub_partopt, /* * Returns the relid of the topmost ancestor that is published via this - * publication if any, otherwise returns InvalidOid. + * publication if any and set its ancestor level to ancestor_level, + * otherwise returns InvalidOid. + * + * The ancestor_level value allows us to compare the results for multiple + * publications, and decide which value is higher up. * * Note that the list of ancestors should be ordered such that the topmost * ancestor is at the end of the list. */ Oid -GetTopMostAncestorInPublication(Oid puboid, List *ancestors) +GetTopMostAncestorInPublication(Oid puboid, List *ancestors, int *ancestor_level) { ListCell *lc; Oid topmost_relid = InvalidOid; + int level = 0; /* * Find the "topmost" ancestor that is in this publication. @@ -297,13 +302,25 @@ GetTopMostAncestorInPublication(Oid puboid, List *ancestors) List *apubids = GetRelationPublications(ancestor); List *aschemaPubids = NIL; + level++; + if (list_member_oid(apubids, puboid)) + { topmost_relid = ancestor; + + if (ancestor_level) + *ancestor_level = level; + } else { aschemaPubids = GetSchemaPublications(get_rel_namespace(ancestor)); if (list_member_oid(aschemaPubids, puboid)) + { topmost_relid = ancestor; + + if (ancestor_level) + *ancestor_level = level; + } } list_free(apubids); diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index 16b8661a1b..1aad2e769c 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -323,7 +323,8 @@ contain_invalid_rfcolumn(Oid pubid, Relation relation, List *ancestors, */ if (pubviaroot && relation->rd_rel->relispartition) { - publish_as_relid = GetTopMostAncestorInPublication(pubid, ancestors); + publish_as_relid + = GetTopMostAncestorInPublication(pubid, ancestors, NULL); if (!OidIsValid(publish_as_relid)) publish_as_relid = relid; diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index ea57a0477f..d869f3e93e 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -1748,6 +1748,7 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) List *schemaPubids = GetSchemaPublications(schemaId); ListCell *lc; Oid publish_as_relid = relid; + int publish_ancestor_level = 0; bool am_partition = get_rel_relispartition(relid); char relkind = get_rel_relkind(relid); List *rel_publications = NIL; @@ -1815,11 +1816,28 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) Publication *pub = lfirst(lc); bool publish = false; + /* + * Under what relid should we publish changes in this publication? + * We'll use the top-most relid across all publications. Also track + * the ancestor level for this publication. + */ + Oid pub_relid = relid; + int ancestor_level = 0; + + /* + * If this is a FOR ALL TABLES publication, pick the partition root + * and set the ancestor level accordingly. + */ if (pub->alltables) { publish = true; if (pub->pubviaroot && am_partition) - publish_as_relid = llast_oid(get_partition_ancestors(relid)); + { + List *ancestors = get_partition_ancestors(relid); + + pub_relid = llast_oid(ancestors); + ancestor_level = list_length(ancestors); + } } if (!publish) @@ -1835,16 +1853,21 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) if (am_partition) { Oid ancestor; + int level; List *ancestors = get_partition_ancestors(relid); ancestor = GetTopMostAncestorInPublication(pub->oid, - ancestors); + ancestors, + &level); if (ancestor != InvalidOid) { ancestor_published = true; if (pub->pubviaroot) - publish_as_relid = ancestor; + { + pub_relid = ancestor; + ancestor_level = level; + } } } @@ -1868,6 +1891,20 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) entry->pubactions.pubtruncate |= pub->pubactions.pubtruncate; rel_publications = lappend(rel_publications, pub); + + /* + * We want to publish the changes as the top-most ancestor + * across all publications. So we need to check if the + * already calculated level is higher than the new one. If + * yes, we can ignore the new value (as it's a child). + * Otherwise the new value is an ancestor, so we keep it. + */ + if (publish_ancestor_level > ancestor_level) + continue; + + /* The new value is an ancestor, so let's keep it. */ + publish_as_relid = pub_relid; + publish_ancestor_level = ancestor_level; } } diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h index ba72e62e61..fe773cf9b7 100644 --- a/src/include/catalog/pg_publication.h +++ b/src/include/catalog/pg_publication.h @@ -134,7 +134,8 @@ extern List *GetAllSchemaPublicationRelations(Oid puboid, extern List *GetPubPartitionOptionRelations(List *result, PublicationPartOpt pub_partopt, Oid relid); -extern Oid GetTopMostAncestorInPublication(Oid puboid, List *ancestors); +extern Oid GetTopMostAncestorInPublication(Oid puboid, List *ancestors, + int *ancestor_level); extern bool is_publishable_relation(Relation rel); extern bool is_schema_publication(Oid pubid); diff --git a/src/test/subscription/t/013_partition.pl b/src/test/subscription/t/013_partition.pl index 5266471a7a..66e63e755e 100644 --- a/src/test/subscription/t/013_partition.pl +++ b/src/test/subscription/t/013_partition.pl @@ -409,6 +409,14 @@ BEGIN "CREATE TABLE tab3 (a int PRIMARY KEY, b text) PARTITION BY LIST (a)"); $node_publisher->safe_psql('postgres', "CREATE TABLE tab3_1 PARTITION OF tab3 FOR VALUES IN (0, 1, 2, 3, 5, 6)"); + +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab4 (a int PRIMARY KEY) PARTITION BY LIST (a)"); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab4_1 PARTITION OF tab4 FOR VALUES IN (0, 1) PARTITION BY LIST (a)"); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab4_1_1 PARTITION OF tab4_1 FOR VALUES IN (0, 1)"); + $node_publisher->safe_psql('postgres', "ALTER PUBLICATION pub_all SET (publish_via_partition_root = true)"); # Note: tab3_1's parent is not in the publication, in which case its @@ -419,6 +427,11 @@ BEGIN "CREATE PUBLICATION pub_viaroot FOR TABLE tab2, tab2_1, tab3_1 WITH (publish_via_partition_root = true)" ); +# for tab4, we publish changes through the "middle" partitioned table +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION pub_lower_level FOR TABLE tab4_1 WITH (publish_via_partition_root = true)" +); + # prepare data for the initial sync $node_publisher->safe_psql('postgres', "INSERT INTO tab2 VALUES (1)"); @@ -462,10 +475,20 @@ BEGIN $node_subscriber2->safe_psql('postgres', "CREATE TABLE tab3_1 (a int PRIMARY KEY, c text DEFAULT 'sub2_tab3_1', b text)" ); + +# Note: We create two separate tables, not a partitioned one, so that we can +# easily identity through which relation were the changes replicated. +$node_subscriber2->safe_psql('postgres', + "CREATE TABLE tab4 (a int PRIMARY KEY)" +); +$node_subscriber2->safe_psql('postgres', + "CREATE TABLE tab4_1 (a int PRIMARY KEY)" +); # Publication that sub2 points to now publishes via root, so must update -# subscription target relations. +# subscription target relations. We set the list of publications so that +# the FOR ALL TABLES publication is second (the list order matters). $node_subscriber2->safe_psql('postgres', - "ALTER SUBSCRIPTION sub2 REFRESH PUBLICATION"); + "ALTER SUBSCRIPTION sub2 SET PUBLICATION pub_lower_level, pub_all"); # Wait for initial sync of all subscriptions $node_subscriber1->poll_query_until('postgres', $synced_query) @@ -487,6 +510,11 @@ BEGIN $node_publisher->safe_psql('postgres', "INSERT INTO tab3 VALUES (1), (0), (3), (5)"); +# Insert a row into the leaf partition, should be replicated through the +# partition root (thanks to the FOR ALL TABLES partition). +$node_publisher->safe_psql('postgres', + "INSERT INTO tab4 VALUES (0)"); + $node_publisher->wait_for_catchup('sub_viaroot'); $node_publisher->wait_for_catchup('sub2'); @@ -525,6 +553,46 @@ BEGIN sub2_tab3|3 sub2_tab3|5), 'inserts into tab3 replicated'); +# tab4 change should be replicated through the root partition, which +# maps to the tab4 relation on subscriber. +$result = $node_subscriber2->safe_psql('postgres', + "SELECT a FROM tab4 ORDER BY 1"); +is( $result, qq(0), 'inserts into tab4 replicated'); + +$result = $node_subscriber2->safe_psql('postgres', + "SELECT a FROM tab4_1 ORDER BY 1"); +is( $result, qq(), 'inserts into tab4_1 replicated'); + + +# now switch the order of publications in the list, try again, the result +# should be the same (no dependence on order of pulications) +$node_subscriber2->safe_psql('postgres', + "ALTER SUBSCRIPTION sub2 SET PUBLICATION pub_all, pub_lower_level"); + +# make sure the subscription on the second subscriber is synced, before +# continuing +$node_subscriber2->poll_query_until('postgres', $synced_query) + or die "Timed out while waiting for subscriber to synchronize data"; + +# Insert a change into the leaf partition, should be replicated through +# the partition root (thanks to the FOR ALL TABLES partition). +$node_publisher->safe_psql('postgres', + "INSERT INTO tab4 VALUES (1)"); + +$node_publisher->wait_for_catchup('sub2'); + +# tab4 change should be replicated through the root partition, which +# maps to the tab4 relation on subscriber. +$result = $node_subscriber2->safe_psql('postgres', + "SELECT a FROM tab4 ORDER BY 1"); +is( $result, qq(0 +1), 'inserts into tab4 replicated'); + +$result = $node_subscriber2->safe_psql('postgres', + "SELECT a FROM tab4_1 ORDER BY 1"); +is( $result, qq(), 'inserts into tab4_1 replicated'); + + # update (replicated as update) $node_publisher->safe_psql('postgres', "UPDATE tab1 SET a = 6 WHERE a = 5"); $node_publisher->safe_psql('postgres', "UPDATE tab2 SET a = 6 WHERE a = 5"); From f6f0db4d62400ff88f523dcc4d7e25f9506bc0d8 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 17 Mar 2022 11:25:02 +0900 Subject: [PATCH 154/772] Fix pg_tablespace_location() with in-place tablespaces Using this system function with an in-place tablespace (created when allow_in_place_tablespaces is enabled by specifying an empty string as location) caused a failure when using readlink(), as the tablespace is, in this case, not a symbolic link in pg_tblspc/ but a directory. Rather than getting a failure, the commit changes pg_tablespace_location() so as a relative path to the data directory is returned for in-place tablespaces, to make a difference between tablespaces created when allow_in_place_tablespaces is enabled or not. Getting a path rather than an empty string that would match the CREATE TABLESPACE command in this case is more useful for tests that would like to rely on this function. While on it, a regression test is added for this case. This is simple to add in the main regression test suite thanks to regexp_replace() to mask the part of the tablespace location dependent on its OID. Author: Michael Paquier Reviewed-by: Kyotaro Horiguchi, Thomas Munro Discussion: https://postgr.es/m/YiG1RleON1WBcLnX@paquier.xyz --- doc/src/sgml/func.sgml | 8 ++++++- src/backend/utils/adt/misc.c | 29 ++++++++++++++++++++++++ src/test/regress/expected/tablespace.out | 9 ++++++++ src/test/regress/sql/tablespace.sql | 4 ++++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 8a802fb225..89a5e17884 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -23924,7 +23924,13 @@ SELECT currval(pg_get_serial_sequence('sometable', 'id')); Returns the file system path that this tablespace is located in. - + + + A relative path to the data directory is returned for tablespaces + created when is + enabled. + + diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c index 4568749d23..89690be2ed 100644 --- a/src/backend/utils/adt/misc.c +++ b/src/backend/utils/adt/misc.c @@ -15,6 +15,7 @@ #include "postgres.h" #include +#include #include #include #include @@ -282,6 +283,9 @@ pg_tablespace_location(PG_FUNCTION_ARGS) char sourcepath[MAXPGPATH]; char targetpath[MAXPGPATH]; int rllen; +#ifndef WIN32 + struct stat st; +#endif /* * It's useful to apply this function to pg_class.reltablespace, wherein @@ -306,6 +310,31 @@ pg_tablespace_location(PG_FUNCTION_ARGS) */ snprintf(sourcepath, sizeof(sourcepath), "pg_tblspc/%u", tablespaceOid); + /* + * Before reading the link, check if the source path is a link or a + * junction point. Note that a directory is possible for a tablespace + * created with allow_in_place_tablespaces enabled. If a directory is + * found, a relative path to the data directory is returned. + */ +#ifdef WIN32 + if (!pgwin32_is_junction(sourcepath)) + PG_RETURN_TEXT_P(cstring_to_text(sourcepath)); +#else + if (lstat(sourcepath, &st) < 0) + { + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not stat file \"%s\": %m", + sourcepath))); + } + + if (!S_ISLNK(st.st_mode)) + PG_RETURN_TEXT_P(cstring_to_text(sourcepath)); +#endif + + /* + * In presence of a link or a junction point, return the path pointing to. + */ rllen = readlink(sourcepath, targetpath, sizeof(targetpath)); if (rllen < 0) ereport(ERROR, diff --git a/src/test/regress/expected/tablespace.out b/src/test/regress/expected/tablespace.out index 2dfbcfdebe..473fe8c28e 100644 --- a/src/test/regress/expected/tablespace.out +++ b/src/test/regress/expected/tablespace.out @@ -24,6 +24,15 @@ SELECT spcoptions FROM pg_tablespace WHERE spcname = 'regress_tblspacewith'; DROP TABLESPACE regress_tblspacewith; -- create a tablespace we can use CREATE TABLESPACE regress_tblspace LOCATION ''; +-- This returns a relative path as of an effect of allow_in_place_tablespaces, +-- masking the tablespace OID used in the path name. +SELECT regexp_replace(pg_tablespace_location(oid), '(pg_tblspc)/(\d+)', '\1/NNN') + FROM pg_tablespace WHERE spcname = 'regress_tblspace'; + regexp_replace +---------------- + pg_tblspc/NNN +(1 row) + -- try setting and resetting some properties for the new tablespace ALTER TABLESPACE regress_tblspace SET (random_page_cost = 1.0, seq_page_cost = 1.1); ALTER TABLESPACE regress_tblspace SET (some_nonexistent_parameter = true); -- fail diff --git a/src/test/regress/sql/tablespace.sql b/src/test/regress/sql/tablespace.sql index 896f05cea3..0949a28488 100644 --- a/src/test/regress/sql/tablespace.sql +++ b/src/test/regress/sql/tablespace.sql @@ -22,6 +22,10 @@ DROP TABLESPACE regress_tblspacewith; -- create a tablespace we can use CREATE TABLESPACE regress_tblspace LOCATION ''; +-- This returns a relative path as of an effect of allow_in_place_tablespaces, +-- masking the tablespace OID used in the path name. +SELECT regexp_replace(pg_tablespace_location(oid), '(pg_tblspc)/(\d+)', '\1/NNN') + FROM pg_tablespace WHERE spcname = 'regress_tblspace'; -- try setting and resetting some properties for the new tablespace ALTER TABLESPACE regress_tblspace SET (random_page_cost = 1.0, seq_page_cost = 1.1); From f2553d43060edb210b36c63187d52a632448e1d2 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 17 Mar 2022 11:11:21 +0100 Subject: [PATCH 155/772] Add option to use ICU as global locale provider This adds the option to use ICU as the default locale provider for either the whole cluster or a database. New options for initdb, createdb, and CREATE DATABASE are used to select this. Since some (legacy) code still uses the libc locale facilities directly, we still need to set the libc global locale settings even if ICU is otherwise selected. So pg_database now has three locale-related fields: the existing datcollate and datctype, which are always set, and a new daticulocale, which is only set if ICU is selected. A similar change is made in pg_collation for consistency, but in that case, only the libc-related fields or the ICU-related field is set, never both. Reviewed-by: Julien Rouhaud Discussion: https://www.postgresql.org/message-id/flat/5e756dd6-0e91-d778-96fd-b1bcb06c161a%402ndquadrant.com --- doc/src/sgml/catalogs.sgml | 9 + doc/src/sgml/charset.sgml | 102 ++++++++++++ doc/src/sgml/ref/create_database.sgml | 32 ++++ doc/src/sgml/ref/createdb.sgml | 19 +++ doc/src/sgml/ref/initdb.sgml | 72 ++++++-- src/backend/catalog/pg_collation.c | 18 +- src/backend/commands/collationcmds.c | 97 +++++++---- src/backend/commands/dbcommands.c | 157 +++++++++++++++--- src/backend/utils/adt/pg_locale.c | 144 ++++++++++------ src/backend/utils/init/postinit.c | 21 ++- src/bin/initdb/Makefile | 4 +- src/bin/initdb/initdb.c | 97 +++++++++-- src/bin/initdb/t/001_initdb.pl | 27 +++ src/bin/pg_dump/pg_dump.c | 30 +++- src/bin/pg_upgrade/check.c | 13 ++ src/bin/pg_upgrade/info.c | 18 +- src/bin/pg_upgrade/pg_upgrade.h | 2 + src/bin/psql/describe.c | 23 ++- src/bin/psql/tab-complete.c | 3 +- src/bin/scripts/Makefile | 2 + src/bin/scripts/createdb.c | 20 +++ src/bin/scripts/t/020_createdb.pl | 28 ++++ src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_collation.dat | 3 +- src/include/catalog/pg_collation.h | 20 ++- src/include/catalog/pg_database.dat | 4 +- src/include/catalog/pg_database.h | 6 + src/include/utils/pg_locale.h | 5 + src/test/Makefile | 6 +- src/test/icu/.gitignore | 2 + src/test/icu/Makefile | 25 +++ src/test/icu/README | 27 +++ src/test/icu/t/010_database.pl | 58 +++++++ .../regress/expected/collate.icu.utf8.out | 10 +- src/test/regress/sql/collate.icu.utf8.sql | 8 +- 35 files changed, 947 insertions(+), 167 deletions(-) create mode 100644 src/test/icu/.gitignore create mode 100644 src/test/icu/Makefile create mode 100644 src/test/icu/README create mode 100644 src/test/icu/t/010_database.pl diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 7777d60514..bcf2b43206 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -2384,6 +2384,15 @@ SCRAM-SHA-256$<iteration count>:&l + + + colliculocale text + + + ICU locale ID for this collation object + + + collversion text diff --git a/doc/src/sgml/charset.sgml b/doc/src/sgml/charset.sgml index f203c368c2..d60d3207fd 100644 --- a/doc/src/sgml/charset.sgml +++ b/doc/src/sgml/charset.sgml @@ -276,6 +276,108 @@ initdb --locale=sv_SE + + Selecting Locales + + + Locales can be selected in different scopes depending on requirements. + The above overview showed how locales are specified using + initdb to set the defaults for the entire cluster. The + following list shows where locales can be selected. Each item provides + the defaults for the subsequent items, and each lower item allows + overriding the defaults on a finer granularity. + + + + + + As explained above, the environment of the operating system provides the + defaults for the locales of a newly initialized database cluster. In + many cases, this is enough: If the operating system is configured for + the desired language/territory, then + PostgreSQL will by default also behave + according to that locale. + + + + + + As shown above, command-line options for initdb + specify the locale settings for a newly initialized database cluster. + Use this if the operating system does not have the locale configuration + you want for your database system. + + + + + + A locale can be selected separately for each database. The SQL command + CREATE DATABASE and its command-line equivalent + createdb have options for that. Use this for example + if a database cluster houses databases for multiple tennants with + different requirements. + + + + + + Locale settings can be made for individual table columns. This uses an + SQL object called collation and is explained in + . Use this for example to sort data in + different languages or customize the sort order of a particular table. + + + + + + Finally, locales can be selected for an individual query. Again, this + uses SQL collation objects. This could be used to change the sort order + based on run-time choices or for ad-hoc experimentation. + + + + + + + Locale Providers + + + PostgreSQL supports multiple locale + providers. This specifies which library supplies the locale + data. One standard provider name is libc, which uses + the locales provided by the operating system C library. These are the + locales that most tools provided by the operating system use. Another + provider is icu, which uses the external + ICUICU library. ICU locales can + only be used if support for ICU was configured when PostgreSQL was built. + + + + The commands and tools that select the locale settings, as described + above, each have an option to select the locale provider. The examples + shown earlier all use the libc provider, which is the + default. Here is an example to initialize a database cluster using the + ICU provider: + +initdb --locale-provider=icu --icu-locale=en + + See the description of the respective commands and programs for the + respective details. Note that you can mix locale providers on different + granularities, for example use libc by default for the + cluster but have one database that uses the icu + provider, and then have collation objects using either provider within + those databases. + + + + Which locale provider to use depends on individual requirements. For most + basic uses, either provider will give adequate results. For the libc + provider, it depends on what the operating system offers; some operating + systems are better than others. For advanced uses, ICU offers more locale + variants and customization options. + + + Problems diff --git a/doc/src/sgml/ref/create_database.sgml b/doc/src/sgml/ref/create_database.sgml index f70d0c75b4..5ae785ab95 100644 --- a/doc/src/sgml/ref/create_database.sgml +++ b/doc/src/sgml/ref/create_database.sgml @@ -28,6 +28,8 @@ CREATE DATABASE name [ LOCALE [=] locale ] [ LC_COLLATE [=] lc_collate ] [ LC_CTYPE [=] lc_ctype ] + [ ICU_LOCALE [=] icu_locale ] + [ LOCALE_PROVIDER [=] locale_provider ] [ COLLATION_VERSION = collation_version ] [ TABLESPACE [=] tablespace_name ] [ ALLOW_CONNECTIONS [=] allowconn ] @@ -160,6 +162,29 @@ CREATE DATABASE name + + icu_locale + + + Specifies the ICU locale ID if the ICU locale provider is used. + + + + + + locale_provider + + + + Specifies the provider to use for the default collation in this + database. Possible values are: + icu,ICU + libc. libc is the default. The + available choices depend on the operating system and build options. + + + + collation_version @@ -314,6 +339,13 @@ CREATE DATABASE name indexes that would be affected. + + There is currently no option to use a database locale with nondeterministic + comparisons (see CREATE + COLLATION for an explanation). If this is needed, then + per-column collations would need to be used. + + The CONNECTION LIMIT option is only enforced approximately; if two new sessions start at about the same time when just one diff --git a/doc/src/sgml/ref/createdb.sgml b/doc/src/sgml/ref/createdb.sgml index 86473455c9..be42e502d6 100644 --- a/doc/src/sgml/ref/createdb.sgml +++ b/doc/src/sgml/ref/createdb.sgml @@ -147,6 +147,25 @@ PostgreSQL documentation + + + + + Specifies the ICU locale ID to be used in this database, if the + ICU locale provider is selected. + + + + + + + + + Specifies the locale provider for the database's default collation. + + + + diff --git a/doc/src/sgml/ref/initdb.sgml b/doc/src/sgml/ref/initdb.sgml index 8f71c7c962..f5d633b0af 100644 --- a/doc/src/sgml/ref/initdb.sgml +++ b/doc/src/sgml/ref/initdb.sgml @@ -86,30 +86,45 @@ PostgreSQL documentation - initdb initializes the database cluster's default - locale and character set encoding. The character set encoding, - collation order (LC_COLLATE) and character set classes - (LC_CTYPE, e.g., upper, lower, digit) can be set separately - for a database when it is created. initdb determines - those settings for the template databases, which will - serve as the default for all other databases. + initdb initializes the database cluster's default locale + and character set encoding. These can also be set separately for each + database when it is created. initdb determines those + settings for the template databases, which will serve as the default for + all other databases. By default, initdb uses the + locale provider libc, takes the locale settings from + the environment, and determines the encoding from the locale settings. + This is almost always sufficient, unless there are special requirements. - To alter the default collation order or character set classes, use the - and options. - Collation orders other than C or POSIX also have - a performance penalty. For these reasons it is important to choose the - right locale when running initdb. + To choose a different locale for the cluster, use the option + . There are also individual options + (see below) to set values for the individual locale + categories. Note that inconsistent settings for different locale + categories can give nonsensical results, so this should be used with care. - The remaining locale categories can be changed later when the server - is started. You can also use to set the - default for all locale categories, including collation order and - character set classes. All server locale values (lc_*) can - be displayed via SHOW ALL. - More details can be found in . + Alternatively, the ICU library can be used to provide locale services. + (Again, this only sets the default for subsequently created databases.) To + select this option, specify --locale-provider=icu. + To chose the specific ICU locale ID to apply, use the option + . Note that + for implementation reasons and to support legacy code, + initdb will still select and initialize libc locale + settings when the ICU locale provider is used. + + + + When initdb runs, it will print out the locale settings + it has chosen. If you have complex requirements or specified multiple + options, it is advisable to check that the result matches what was + intended. + + + + More details about locale settings can be found in . @@ -210,6 +225,15 @@ PostgreSQL documentation + + + + + Specifies the ICU locale ID, if the ICU locale provider is used. + + + + @@ -264,6 +288,18 @@ PostgreSQL documentation + + + + + This option sets the locale provider for databases created in the + new cluster. It can be overridden in the CREATE + DATABASE command when new databases are subsequently + created. The default is libc. + + + + diff --git a/src/backend/catalog/pg_collation.c b/src/backend/catalog/pg_collation.c index bfc02d3038..93545786df 100644 --- a/src/backend/catalog/pg_collation.c +++ b/src/backend/catalog/pg_collation.c @@ -49,6 +49,7 @@ CollationCreate(const char *collname, Oid collnamespace, bool collisdeterministic, int32 collencoding, const char *collcollate, const char *collctype, + const char *colliculocale, const char *collversion, bool if_not_exists, bool quiet) @@ -66,8 +67,7 @@ CollationCreate(const char *collname, Oid collnamespace, AssertArg(collname); AssertArg(collnamespace); AssertArg(collowner); - AssertArg(collcollate); - AssertArg(collctype); + AssertArg((collcollate && collctype) || colliculocale); /* * Make sure there is no existing collation of same name & encoding. @@ -161,8 +161,18 @@ CollationCreate(const char *collname, Oid collnamespace, values[Anum_pg_collation_collprovider - 1] = CharGetDatum(collprovider); values[Anum_pg_collation_collisdeterministic - 1] = BoolGetDatum(collisdeterministic); values[Anum_pg_collation_collencoding - 1] = Int32GetDatum(collencoding); - values[Anum_pg_collation_collcollate - 1] = CStringGetTextDatum(collcollate); - values[Anum_pg_collation_collctype - 1] = CStringGetTextDatum(collctype); + if (collcollate) + values[Anum_pg_collation_collcollate - 1] = CStringGetTextDatum(collcollate); + else + nulls[Anum_pg_collation_collcollate - 1] = true; + if (collctype) + values[Anum_pg_collation_collctype - 1] = CStringGetTextDatum(collctype); + else + nulls[Anum_pg_collation_collctype - 1] = true; + if (colliculocale) + values[Anum_pg_collation_colliculocale - 1] = CStringGetTextDatum(colliculocale); + else + nulls[Anum_pg_collation_colliculocale - 1] = true; if (collversion) values[Anum_pg_collation_collversion - 1] = CStringGetTextDatum(collversion); else diff --git a/src/backend/commands/collationcmds.c b/src/backend/commands/collationcmds.c index 93df1d366c..346f85f05e 100644 --- a/src/backend/commands/collationcmds.c +++ b/src/backend/commands/collationcmds.c @@ -65,6 +65,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e DefElem *versionEl = NULL; char *collcollate; char *collctype; + char *colliculocale; bool collisdeterministic; int collencoding; char collprovider; @@ -152,6 +153,12 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e else collctype = NULL; + datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_colliculocale, &isnull); + if (!isnull) + colliculocale = TextDatumGetCString(datum); + else + colliculocale = NULL; + ReleaseSysCache(tp); /* @@ -172,18 +179,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e collcollate = NULL; collctype = NULL; - - if (localeEl) - { - collcollate = defGetString(localeEl); - collctype = defGetString(localeEl); - } - - if (lccollateEl) - collcollate = defGetString(lccollateEl); - - if (lcctypeEl) - collctype = defGetString(lcctypeEl); + colliculocale = NULL; if (providerEl) collproviderstr = defGetString(providerEl); @@ -211,15 +207,42 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e else collprovider = COLLPROVIDER_LIBC; - if (!collcollate) - ereport(ERROR, - (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("parameter \"lc_collate\" must be specified"))); + if (localeEl) + { + if (collprovider == COLLPROVIDER_LIBC) + { + collcollate = defGetString(localeEl); + collctype = defGetString(localeEl); + } + else + colliculocale = defGetString(localeEl); + } - if (!collctype) - ereport(ERROR, - (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("parameter \"lc_ctype\" must be specified"))); + if (lccollateEl) + collcollate = defGetString(lccollateEl); + + if (lcctypeEl) + collctype = defGetString(lcctypeEl); + + if (collprovider == COLLPROVIDER_LIBC) + { + if (!collcollate) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("parameter \"lc_collate\" must be specified"))); + + if (!collctype) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("parameter \"lc_ctype\" must be specified"))); + } + else if (collprovider == COLLPROVIDER_ICU) + { + if (!colliculocale) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("parameter \"locale\" must be specified"))); + } /* * Nondeterministic collations are currently only supported with ICU @@ -260,7 +283,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e } if (!collversion) - collversion = get_collation_actual_version(collprovider, collcollate); + collversion = get_collation_actual_version(collprovider, collprovider == COLLPROVIDER_ICU ? colliculocale : collcollate); newoid = CollationCreate(collName, collNamespace, @@ -270,6 +293,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e collencoding, collcollate, collctype, + colliculocale, collversion, if_not_exists, false); /* not quiet */ @@ -352,8 +376,9 @@ AlterCollation(AlterCollationStmt *stmt) datum = SysCacheGetAttr(COLLOID, tup, Anum_pg_collation_collversion, &isnull); oldversion = isnull ? NULL : TextDatumGetCString(datum); - datum = SysCacheGetAttr(COLLOID, tup, Anum_pg_collation_collcollate, &isnull); - Assert(!isnull); + datum = SysCacheGetAttr(COLLOID, tup, collForm->collprovider == COLLPROVIDER_ICU ? Anum_pg_collation_colliculocale : Anum_pg_collation_collcollate, &isnull); + if (isnull) + elog(ERROR, "unexpected null in pg_collation"); newversion = get_collation_actual_version(collForm->collprovider, TextDatumGetCString(datum)); /* cannot change from NULL to non-NULL or vice versa */ @@ -414,9 +439,15 @@ pg_collation_actual_version(PG_FUNCTION_ARGS) collprovider = ((Form_pg_collation) GETSTRUCT(tp))->collprovider; - datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collcollate, &isnull); - Assert(!isnull); - version = get_collation_actual_version(collprovider, TextDatumGetCString(datum)); + if (collprovider != COLLPROVIDER_DEFAULT) + { + datum = SysCacheGetAttr(COLLOID, tp, collprovider == COLLPROVIDER_ICU ? Anum_pg_collation_colliculocale : Anum_pg_collation_collcollate, &isnull); + if (isnull) + elog(ERROR, "unexpected null in pg_collation"); + version = get_collation_actual_version(collprovider, TextDatumGetCString(datum)); + } + else + version = NULL; ReleaseSysCache(tp); @@ -643,7 +674,7 @@ pg_import_system_collations(PG_FUNCTION_ARGS) */ collid = CollationCreate(localebuf, nspid, GetUserId(), COLLPROVIDER_LIBC, true, enc, - localebuf, localebuf, + localebuf, localebuf, NULL, get_collation_actual_version(COLLPROVIDER_LIBC, localebuf), true, true); if (OidIsValid(collid)) @@ -704,7 +735,7 @@ pg_import_system_collations(PG_FUNCTION_ARGS) collid = CollationCreate(alias, nspid, GetUserId(), COLLPROVIDER_LIBC, true, enc, - locale, locale, + locale, locale, NULL, get_collation_actual_version(COLLPROVIDER_LIBC, locale), true, true); if (OidIsValid(collid)) @@ -745,7 +776,7 @@ pg_import_system_collations(PG_FUNCTION_ARGS) const char *name; char *langtag; char *icucomment; - const char *collcollate; + const char *iculocstr; Oid collid; if (i == -1) @@ -754,20 +785,20 @@ pg_import_system_collations(PG_FUNCTION_ARGS) name = uloc_getAvailable(i); langtag = get_icu_language_tag(name); - collcollate = U_ICU_VERSION_MAJOR_NUM >= 54 ? langtag : name; + iculocstr = U_ICU_VERSION_MAJOR_NUM >= 54 ? langtag : name; /* * Be paranoid about not allowing any non-ASCII strings into * pg_collation */ - if (!pg_is_ascii(langtag) || !pg_is_ascii(collcollate)) + if (!pg_is_ascii(langtag) || !pg_is_ascii(iculocstr)) continue; collid = CollationCreate(psprintf("%s-x-icu", langtag), nspid, GetUserId(), COLLPROVIDER_ICU, true, -1, - collcollate, collcollate, - get_collation_actual_version(COLLPROVIDER_ICU, collcollate), + NULL, NULL, iculocstr, + get_collation_actual_version(COLLPROVIDER_ICU, iculocstr), true, true); if (OidIsValid(collid)) { diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index c37e3c9a9a..2e1af642e4 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -86,7 +86,8 @@ static bool get_db_info(const char *name, LOCKMODE lockmode, Oid *dbIdP, Oid *ownerIdP, int *encodingP, bool *dbIsTemplateP, bool *dbAllowConnP, TransactionId *dbFrozenXidP, MultiXactId *dbMinMultiP, - Oid *dbTablespace, char **dbCollate, char **dbCtype, + Oid *dbTablespace, char **dbCollate, char **dbCtype, char **dbIculocale, + char *dbLocProvider, char **dbCollversion); static bool have_createdb_privilege(void); static void remove_dbtablespaces(Oid db_id); @@ -107,6 +108,8 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) int src_encoding = -1; char *src_collate = NULL; char *src_ctype = NULL; + char *src_iculocale = NULL; + char src_locprovider; char *src_collversion = NULL; bool src_istemplate; bool src_allowconn; @@ -128,6 +131,8 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) DefElem *dlocale = NULL; DefElem *dcollate = NULL; DefElem *dctype = NULL; + DefElem *diculocale = NULL; + DefElem *dlocprovider = NULL; DefElem *distemplate = NULL; DefElem *dallowconnections = NULL; DefElem *dconnlimit = NULL; @@ -137,6 +142,8 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) const char *dbtemplate = NULL; char *dbcollate = NULL; char *dbctype = NULL; + char *dbiculocale = NULL; + char dblocprovider = '\0'; char *canonname; int encoding = -1; bool dbistemplate = false; @@ -194,6 +201,18 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) errorConflictingDefElem(defel, pstate); dctype = defel; } + else if (strcmp(defel->defname, "icu_locale") == 0) + { + if (diculocale) + errorConflictingDefElem(defel, pstate); + diculocale = defel; + } + else if (strcmp(defel->defname, "locale_provider") == 0) + { + if (dlocprovider) + errorConflictingDefElem(defel, pstate); + dlocprovider = defel; + } else if (strcmp(defel->defname, "is_template") == 0) { if (distemplate) @@ -257,12 +276,6 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) parser_errposition(pstate, defel->location))); } - if (dlocale && (dcollate || dctype)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - errdetail("LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE."))); - if (downer && downer->arg) dbowner = defGetString(downer); if (dtemplate && dtemplate->arg) @@ -304,6 +317,31 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) dbcollate = defGetString(dcollate); if (dctype && dctype->arg) dbctype = defGetString(dctype); + if (diculocale && diculocale->arg) + dbiculocale = defGetString(diculocale); + if (dlocprovider && dlocprovider->arg) + { + char *locproviderstr = defGetString(dlocprovider); + + if (pg_strcasecmp(locproviderstr, "icu") == 0) + dblocprovider = COLLPROVIDER_ICU; + else if (pg_strcasecmp(locproviderstr, "libc") == 0) + dblocprovider = COLLPROVIDER_LIBC; + else + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("unrecognized locale provider: %s", + locproviderstr))); + } + if (diculocale && dblocprovider != COLLPROVIDER_ICU) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("ICU locale cannot be specified unless locale provider is ICU"))); + if (dblocprovider == COLLPROVIDER_ICU && !dbiculocale) + { + if (dlocale && dlocale->arg) + dbiculocale = defGetString(dlocale); + } if (distemplate && distemplate->arg) dbistemplate = defGetBoolean(distemplate); if (dallowconnections && dallowconnections->arg) @@ -355,7 +393,8 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) &src_dboid, &src_owner, &src_encoding, &src_istemplate, &src_allowconn, &src_frozenxid, &src_minmxid, &src_deftablespace, - &src_collate, &src_ctype, &src_collversion)) + &src_collate, &src_ctype, &src_iculocale, &src_locprovider, + &src_collversion)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_DATABASE), errmsg("template database \"%s\" does not exist", @@ -381,6 +420,10 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) dbcollate = src_collate; if (dbctype == NULL) dbctype = src_ctype; + if (dbiculocale == NULL) + dbiculocale = src_iculocale; + if (dblocprovider == '\0') + dblocprovider = src_locprovider; /* Some encodings are client only */ if (!PG_VALID_BE_ENCODING(encoding)) @@ -402,6 +445,37 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) check_encoding_locale_matches(encoding, dbcollate, dbctype); + if (dblocprovider == COLLPROVIDER_ICU) + { + /* + * This would happen if template0 uses the libc provider but the new + * database uses icu. + */ + if (!dbiculocale) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("ICU locale must be specified"))); + } + + if (dblocprovider == COLLPROVIDER_ICU) + { +#ifdef USE_ICU + UErrorCode status; + + status = U_ZERO_ERROR; + ucol_open(dbiculocale, &status); + if (U_FAILURE(status)) + ereport(ERROR, + (errmsg("could not open collator for locale \"%s\": %s", + dbiculocale, u_errorName(status)))); +#else + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("ICU is not supported in this build"), \ + errhint("You need to rebuild PostgreSQL using %s.", "--with-icu"))); +#endif + } + /* * Check that the new encoding and locale settings match the source * database. We insist on this because we simply copy the source data --- @@ -435,6 +509,25 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) errmsg("new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)", dbctype, src_ctype), errhint("Use the same LC_CTYPE as in the template database, or use template0 as template."))); + + if (dblocprovider != src_locprovider) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("new locale provider (%s) does not match locale provider of the template database (%s)", + collprovider_name(dblocprovider), collprovider_name(src_locprovider)), + errhint("Use the same locale provider as in the template database, or use template0 as template."))); + + if (dblocprovider == COLLPROVIDER_ICU) + { + Assert(dbiculocale); + Assert(src_iculocale); + if (strcmp(dbiculocale, src_iculocale) != 0) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)", + dbiculocale, src_iculocale), + errhint("Use the same ICU locale as in the template database, or use template0 as template."))); + } } /* @@ -453,7 +546,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) { char *actual_versionstr; - actual_versionstr = get_collation_actual_version(COLLPROVIDER_LIBC, dbcollate); + actual_versionstr = get_collation_actual_version(dblocprovider, dblocprovider == COLLPROVIDER_ICU ? dbiculocale : dbcollate); if (!actual_versionstr) ereport(ERROR, (errmsg("template database \"%s\" has a collation version, but no actual collation version could be determined", @@ -481,7 +574,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) * collation version, which is normally only the case for template0. */ if (dbcollversion == NULL) - dbcollversion = get_collation_actual_version(COLLPROVIDER_LIBC, dbcollate); + dbcollversion = get_collation_actual_version(dblocprovider, dblocprovider == COLLPROVIDER_ICU ? dbiculocale : dbcollate); /* Resolve default tablespace for new database */ if (dtablespacename && dtablespacename->arg) @@ -620,6 +713,9 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) * block on the unique index, and fail after we commit). */ + Assert((dblocprovider == COLLPROVIDER_ICU && dbiculocale) || + (dblocprovider != COLLPROVIDER_ICU && !dbiculocale)); + /* Form tuple */ MemSet(new_record, 0, sizeof(new_record)); MemSet(new_record_nulls, false, sizeof(new_record_nulls)); @@ -629,6 +725,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) DirectFunctionCall1(namein, CStringGetDatum(dbname)); new_record[Anum_pg_database_datdba - 1] = ObjectIdGetDatum(datdba); new_record[Anum_pg_database_encoding - 1] = Int32GetDatum(encoding); + new_record[Anum_pg_database_datlocprovider - 1] = CharGetDatum(dblocprovider); new_record[Anum_pg_database_datistemplate - 1] = BoolGetDatum(dbistemplate); new_record[Anum_pg_database_datallowconn - 1] = BoolGetDatum(dballowconnections); new_record[Anum_pg_database_datconnlimit - 1] = Int32GetDatum(dbconnlimit); @@ -637,6 +734,10 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) new_record[Anum_pg_database_dattablespace - 1] = ObjectIdGetDatum(dst_deftablespace); new_record[Anum_pg_database_datcollate - 1] = CStringGetTextDatum(dbcollate); new_record[Anum_pg_database_datctype - 1] = CStringGetTextDatum(dbctype); + if (dbiculocale) + new_record[Anum_pg_database_daticulocale - 1] = CStringGetTextDatum(dbiculocale); + else + new_record_nulls[Anum_pg_database_daticulocale - 1] = true; if (dbcollversion) new_record[Anum_pg_database_datcollversion - 1] = CStringGetTextDatum(dbcollversion); else @@ -907,7 +1008,7 @@ dropdb(const char *dbname, bool missing_ok, bool force) pgdbrel = table_open(DatabaseRelationId, RowExclusiveLock); if (!get_db_info(dbname, AccessExclusiveLock, &db_id, NULL, NULL, - &db_istemplate, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + &db_istemplate, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) { if (!missing_ok) { @@ -1109,7 +1210,7 @@ RenameDatabase(const char *oldname, const char *newname) rel = table_open(DatabaseRelationId, RowExclusiveLock); if (!get_db_info(oldname, AccessExclusiveLock, &db_id, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_DATABASE), errmsg("database \"%s\" does not exist", oldname))); @@ -1222,7 +1323,7 @@ movedb(const char *dbname, const char *tblspcname) pgdbrel = table_open(DatabaseRelationId, RowExclusiveLock); if (!get_db_info(dbname, AccessExclusiveLock, &db_id, NULL, NULL, - NULL, NULL, NULL, NULL, &src_tblspcoid, NULL, NULL, NULL)) + NULL, NULL, NULL, NULL, &src_tblspcoid, NULL, NULL, NULL, NULL, NULL)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_DATABASE), errmsg("database \"%s\" does not exist", dbname))); @@ -1755,9 +1856,10 @@ AlterDatabaseRefreshColl(AlterDatabaseRefreshCollStmt *stmt) datum = heap_getattr(tuple, Anum_pg_database_datcollversion, RelationGetDescr(rel), &isnull); oldversion = isnull ? NULL : TextDatumGetCString(datum); - datum = heap_getattr(tuple, Anum_pg_database_datcollate, RelationGetDescr(rel), &isnull); - Assert(!isnull); - newversion = get_collation_actual_version(COLLPROVIDER_LIBC, TextDatumGetCString(datum)); + datum = heap_getattr(tuple, datForm->datlocprovider == COLLPROVIDER_ICU ? Anum_pg_database_daticulocale : Anum_pg_database_datcollate, RelationGetDescr(rel), &isnull); + if (isnull) + elog(ERROR, "unexpected null in pg_database"); + newversion = get_collation_actual_version(datForm->datlocprovider, TextDatumGetCString(datum)); /* cannot change from NULL to non-NULL or vice versa */ if ((!oldversion && newversion) || (oldversion && !newversion)) @@ -1943,6 +2045,7 @@ pg_database_collation_actual_version(PG_FUNCTION_ARGS) { Oid dbid = PG_GETARG_OID(0); HeapTuple tp; + char datlocprovider; Datum datum; bool isnull; char *version; @@ -1953,9 +2056,12 @@ pg_database_collation_actual_version(PG_FUNCTION_ARGS) (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("database with OID %u does not exist", dbid))); - datum = SysCacheGetAttr(DATABASEOID, tp, Anum_pg_database_datcollate, &isnull); - Assert(!isnull); - version = get_collation_actual_version(COLLPROVIDER_LIBC, TextDatumGetCString(datum)); + datlocprovider = ((Form_pg_database) GETSTRUCT(tp))->datlocprovider; + + datum = SysCacheGetAttr(DATABASEOID, tp, datlocprovider == COLLPROVIDER_ICU ? Anum_pg_database_daticulocale : Anum_pg_database_datcollate, &isnull); + if (isnull) + elog(ERROR, "unexpected null in pg_database"); + version = get_collation_actual_version(datlocprovider, TextDatumGetCString(datum)); ReleaseSysCache(tp); @@ -1981,7 +2087,8 @@ get_db_info(const char *name, LOCKMODE lockmode, Oid *dbIdP, Oid *ownerIdP, int *encodingP, bool *dbIsTemplateP, bool *dbAllowConnP, TransactionId *dbFrozenXidP, MultiXactId *dbMinMultiP, - Oid *dbTablespace, char **dbCollate, char **dbCtype, + Oid *dbTablespace, char **dbCollate, char **dbCtype, char **dbIculocale, + char *dbLocProvider, char **dbCollversion) { bool result = false; @@ -2075,6 +2182,8 @@ get_db_info(const char *name, LOCKMODE lockmode, if (dbTablespace) *dbTablespace = dbform->dattablespace; /* default locale settings for this database */ + if (dbLocProvider) + *dbLocProvider = dbform->datlocprovider; if (dbCollate) { datum = SysCacheGetAttr(DATABASEOID, tuple, Anum_pg_database_datcollate, &isnull); @@ -2087,6 +2196,14 @@ get_db_info(const char *name, LOCKMODE lockmode, Assert(!isnull); *dbCtype = TextDatumGetCString(datum); } + if (dbIculocale) + { + datum = SysCacheGetAttr(DATABASEOID, tuple, Anum_pg_database_daticulocale, &isnull); + if (isnull) + *dbIculocale = NULL; + else + *dbIculocale = TextDatumGetCString(datum); + } if (dbCollversion) { datum = SysCacheGetAttr(DATABASEOID, tuple, Anum_pg_database_datcollversion, &isnull); diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index 871a710967..4019255f8e 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -1288,26 +1288,37 @@ lookup_collation_cache(Oid collation, bool set_flags) { /* Attempt to set the flags */ HeapTuple tp; - Datum datum; - bool isnull; - const char *collcollate; - const char *collctype; + Form_pg_collation collform; tp = SearchSysCache1(COLLOID, ObjectIdGetDatum(collation)); if (!HeapTupleIsValid(tp)) elog(ERROR, "cache lookup failed for collation %u", collation); + collform = (Form_pg_collation) GETSTRUCT(tp); - datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collcollate, &isnull); - Assert(!isnull); - collcollate = TextDatumGetCString(datum); - datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collctype, &isnull); - Assert(!isnull); - collctype = TextDatumGetCString(datum); - - cache_entry->collate_is_c = ((strcmp(collcollate, "C") == 0) || - (strcmp(collcollate, "POSIX") == 0)); - cache_entry->ctype_is_c = ((strcmp(collctype, "C") == 0) || - (strcmp(collctype, "POSIX") == 0)); + if (collform->collprovider == COLLPROVIDER_LIBC) + { + Datum datum; + bool isnull; + const char *collcollate; + const char *collctype; + + datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collcollate, &isnull); + Assert(!isnull); + collcollate = TextDatumGetCString(datum); + datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collctype, &isnull); + Assert(!isnull); + collctype = TextDatumGetCString(datum); + + cache_entry->collate_is_c = ((strcmp(collcollate, "C") == 0) || + (strcmp(collcollate, "POSIX") == 0)); + cache_entry->ctype_is_c = ((strcmp(collctype, "C") == 0) || + (strcmp(collctype, "POSIX") == 0)); + } + else + { + cache_entry->collate_is_c = false; + cache_entry->ctype_is_c = false; + } cache_entry->flags_valid = true; @@ -1340,6 +1351,9 @@ lc_collate_is_c(Oid collation) static int result = -1; char *localeptr; + if (default_locale.provider == COLLPROVIDER_ICU) + return false; + if (result >= 0) return (bool) result; localeptr = setlocale(LC_COLLATE, NULL); @@ -1390,6 +1404,9 @@ lc_ctype_is_c(Oid collation) static int result = -1; char *localeptr; + if (default_locale.provider == COLLPROVIDER_ICU) + return false; + if (result >= 0) return (bool) result; localeptr = setlocale(LC_CTYPE, NULL); @@ -1418,6 +1435,38 @@ lc_ctype_is_c(Oid collation) return (lookup_collation_cache(collation, true))->ctype_is_c; } +struct pg_locale_struct default_locale; + +void +make_icu_collator(const char *iculocstr, + struct pg_locale_struct *resultp) +{ +#ifdef USE_ICU + UCollator *collator; + UErrorCode status; + + status = U_ZERO_ERROR; + collator = ucol_open(iculocstr, &status); + if (U_FAILURE(status)) + ereport(ERROR, + (errmsg("could not open collator for locale \"%s\": %s", + iculocstr, u_errorName(status)))); + + if (U_ICU_VERSION_MAJOR_NUM < 54) + icu_set_collation_attributes(collator, iculocstr); + + /* We will leak this string if the caller errors later :-( */ + resultp->info.icu.locale = MemoryContextStrdup(TopMemoryContext, iculocstr); + resultp->info.icu.ucol = collator; +#else /* not USE_ICU */ + /* could get here if a collation was created by a build with ICU */ + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("ICU is not supported in this build"), \ + errhint("You need to rebuild PostgreSQL using %s.", "--with-icu"))); +#endif /* not USE_ICU */ +} + /* simple subroutine for reporting errors from newlocale() */ #ifdef HAVE_LOCALE_T @@ -1475,7 +1524,12 @@ pg_newlocale_from_collation(Oid collid) Assert(OidIsValid(collid)); if (collid == DEFAULT_COLLATION_OID) - return (pg_locale_t) 0; + { + if (default_locale.provider == COLLPROVIDER_ICU) + return &default_locale; + else + return (pg_locale_t) 0; + } cache_entry = lookup_collation_cache(collid, false); @@ -1484,8 +1538,6 @@ pg_newlocale_from_collation(Oid collid) /* We haven't computed this yet in this session, so do it */ HeapTuple tp; Form_pg_collation collform; - const char *collcollate; - const char *collctype pg_attribute_unused(); struct pg_locale_struct result; pg_locale_t resultp; Datum datum; @@ -1496,13 +1548,6 @@ pg_newlocale_from_collation(Oid collid) elog(ERROR, "cache lookup failed for collation %u", collid); collform = (Form_pg_collation) GETSTRUCT(tp); - datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collcollate, &isnull); - Assert(!isnull); - collcollate = TextDatumGetCString(datum); - datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collctype, &isnull); - Assert(!isnull); - collctype = TextDatumGetCString(datum); - /* We'll fill in the result struct locally before allocating memory */ memset(&result, 0, sizeof(result)); result.provider = collform->collprovider; @@ -1511,8 +1556,17 @@ pg_newlocale_from_collation(Oid collid) if (collform->collprovider == COLLPROVIDER_LIBC) { #ifdef HAVE_LOCALE_T + const char *collcollate; + const char *collctype pg_attribute_unused(); locale_t loc; + datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collcollate, &isnull); + Assert(!isnull); + collcollate = TextDatumGetCString(datum); + datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collctype, &isnull); + Assert(!isnull); + collctype = TextDatumGetCString(datum); + if (strcmp(collcollate, collctype) == 0) { /* Normal case where they're the same */ @@ -1563,36 +1617,12 @@ pg_newlocale_from_collation(Oid collid) } else if (collform->collprovider == COLLPROVIDER_ICU) { -#ifdef USE_ICU - UCollator *collator; - UErrorCode status; - - if (strcmp(collcollate, collctype) != 0) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("collations with different collate and ctype values are not supported by ICU"))); - - status = U_ZERO_ERROR; - collator = ucol_open(collcollate, &status); - if (U_FAILURE(status)) - ereport(ERROR, - (errmsg("could not open collator for locale \"%s\": %s", - collcollate, u_errorName(status)))); + const char *iculocstr; - if (U_ICU_VERSION_MAJOR_NUM < 54) - icu_set_collation_attributes(collator, collcollate); - - /* We will leak this string if we get an error below :-( */ - result.info.icu.locale = MemoryContextStrdup(TopMemoryContext, - collcollate); - result.info.icu.ucol = collator; -#else /* not USE_ICU */ - /* could get here if a collation was created by a build with ICU */ - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("ICU is not supported in this build"), \ - errhint("You need to rebuild PostgreSQL using %s.", "--with-icu"))); -#endif /* not USE_ICU */ + datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_colliculocale, &isnull); + Assert(!isnull); + iculocstr = TextDatumGetCString(datum); + make_icu_collator(iculocstr, &result); } datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collversion, @@ -1604,7 +1634,11 @@ pg_newlocale_from_collation(Oid collid) collversionstr = TextDatumGetCString(datum); - actual_versionstr = get_collation_actual_version(collform->collprovider, collcollate); + datum = SysCacheGetAttr(COLLOID, tp, collform->collprovider == COLLPROVIDER_ICU ? Anum_pg_collation_colliculocale : Anum_pg_collation_collcollate, &isnull); + Assert(!isnull); + + actual_versionstr = get_collation_actual_version(collform->collprovider, + TextDatumGetCString(datum)); if (!actual_versionstr) { /* diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 86d193c89f..6452b42dbf 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -318,6 +318,7 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect bool isnull; char *collate; char *ctype; + char *iculocale; /* Fetch our pg_database row normally, via syscache */ tup = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(MyDatabaseId)); @@ -420,6 +421,24 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect " which is not recognized by setlocale().", ctype), errhint("Recreate the database with another locale or install the missing locale."))); + if (dbform->datlocprovider == COLLPROVIDER_ICU) + { + datum = SysCacheGetAttr(DATABASEOID, tup, Anum_pg_database_daticulocale, &isnull); + Assert(!isnull); + iculocale = TextDatumGetCString(datum); + make_icu_collator(iculocale, &default_locale); + } + else + iculocale = NULL; + + default_locale.provider = dbform->datlocprovider; + /* + * Default locale is currently always deterministic. Nondeterministic + * locales currently don't support pattern matching, which would break a + * lot of things if applied globally. + */ + default_locale.deterministic = true; + /* * Check collation version. See similar code in * pg_newlocale_from_collation(). Note that here we warn instead of error @@ -434,7 +453,7 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect collversionstr = TextDatumGetCString(datum); - actual_versionstr = get_collation_actual_version(COLLPROVIDER_LIBC, collate); + actual_versionstr = get_collation_actual_version(dbform->datlocprovider, dbform->datlocprovider == COLLPROVIDER_ICU ? iculocale : collate); if (!actual_versionstr) ereport(WARNING, (errmsg("database \"%s\" has no actual collation version, but a version was recorded", diff --git a/src/bin/initdb/Makefile b/src/bin/initdb/Makefile index eba282267a..8dd25e7afc 100644 --- a/src/bin/initdb/Makefile +++ b/src/bin/initdb/Makefile @@ -40,7 +40,7 @@ OBJS = \ all: initdb initdb: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils - $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) + $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) $(ICU_LIBS) -o $@$(X) # We must pull in localtime.c from src/timezones localtime.c: % : $(top_srcdir)/src/timezone/% @@ -62,6 +62,8 @@ clean distclean maintainer-clean: # ensure that changes in datadir propagate into object file initdb.o: initdb.c $(top_builddir)/src/Makefile.global +export with_icu + check: $(prove_check) diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 97f15971e2..cbcd55288f 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -55,6 +55,10 @@ #include #include +#ifdef USE_ICU +#include +#endif + #ifdef HAVE_SHM_OPEN #include "sys/mman.h" #endif @@ -132,6 +136,8 @@ static char *lc_monetary = NULL; static char *lc_numeric = NULL; static char *lc_time = NULL; static char *lc_messages = NULL; +static char locale_provider = COLLPROVIDER_LIBC; +static char *icu_locale = NULL; static const char *default_text_search_config = NULL; static char *username = NULL; static bool pwprompt = false; @@ -1405,6 +1411,12 @@ bootstrap_template1(void) bki_lines = replace_token(bki_lines, "LC_CTYPE", escape_quotes_bki(lc_ctype)); + bki_lines = replace_token(bki_lines, "ICU_LOCALE", + locale_provider == COLLPROVIDER_ICU ? escape_quotes_bki(icu_locale) : "_null_"); + + sprintf(buf, "%c", locale_provider); + bki_lines = replace_token(bki_lines, "LOCALE_PROVIDER", buf); + /* Also ensure backend isn't confused by this environment var: */ unsetenv("PGCLIENTENCODING"); @@ -2165,7 +2177,6 @@ setlocales(void) * canonicalize locale names, and obtain any missing values from our * current environment */ - check_locale_name(LC_CTYPE, lc_ctype, &canonname); lc_ctype = canonname; check_locale_name(LC_COLLATE, lc_collate, &canonname); @@ -2184,6 +2195,37 @@ setlocales(void) check_locale_name(LC_CTYPE, lc_messages, &canonname); lc_messages = canonname; #endif + + if (locale_provider == COLLPROVIDER_ICU) + { + if (!icu_locale) + { + pg_log_error("ICU locale must be specified"); + exit(1); + } + + /* + * Check ICU locale ID + */ +#ifdef USE_ICU + { + UErrorCode status; + + status = U_ZERO_ERROR; + ucol_open(icu_locale, &status); + if (U_FAILURE(status)) + { + pg_log_error("could not open collator for locale \"%s\": %s", + icu_locale, u_errorName(status)); + exit(1); + } + } +#else + pg_log_error("ICU is not supported in this build"); + fprintf(stderr, _("You need to rebuild PostgreSQL using %s.\n"), "--with-icu"); + exit(1); +#endif + } } /* @@ -2202,6 +2244,7 @@ usage(const char *progname) printf(_(" [-D, --pgdata=]DATADIR location for this database cluster\n")); printf(_(" -E, --encoding=ENCODING set default encoding for new databases\n")); printf(_(" -g, --allow-group-access allow group read/execute on data directory\n")); + printf(_(" --icu-locale=LOCALE set ICU locale ID for new databases\n")); printf(_(" -k, --data-checksums use data page checksums\n")); printf(_(" --locale=LOCALE set default locale for new databases\n")); printf(_(" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -2209,6 +2252,8 @@ usage(const char *progname) " set default locale in the respective category for\n" " new databases (default taken from environment)\n")); printf(_(" --no-locale equivalent to --locale=C\n")); + printf(_(" --locale-provider={libc|icu}\n" + " set default locale provider for new databases\n")); printf(_(" --pwfile=FILE read password for the new superuser from file\n")); printf(_(" -T, --text-search-config=CFG\n" " default text search configuration\n")); @@ -2372,21 +2417,26 @@ setup_locale_encoding(void) { setlocales(); - if (strcmp(lc_ctype, lc_collate) == 0 && + if (locale_provider == COLLPROVIDER_LIBC && + strcmp(lc_ctype, lc_collate) == 0 && strcmp(lc_ctype, lc_time) == 0 && strcmp(lc_ctype, lc_numeric) == 0 && strcmp(lc_ctype, lc_monetary) == 0 && - strcmp(lc_ctype, lc_messages) == 0) + strcmp(lc_ctype, lc_messages) == 0 && + (!icu_locale || strcmp(lc_ctype, icu_locale) == 0)) printf(_("The database cluster will be initialized with locale \"%s\".\n"), lc_ctype); else { - printf(_("The database cluster will be initialized with locales\n" - " COLLATE: %s\n" - " CTYPE: %s\n" - " MESSAGES: %s\n" - " MONETARY: %s\n" - " NUMERIC: %s\n" - " TIME: %s\n"), + printf(_("The database cluster will be initialized with this locale configuration:\n")); + printf(_(" provider: %s\n"), collprovider_name(locale_provider)); + if (icu_locale) + printf(_(" ICU locale: %s\n"), icu_locale); + printf(_(" LC_COLLATE: %s\n" + " LC_CTYPE: %s\n" + " LC_MESSAGES: %s\n" + " LC_MONETARY: %s\n" + " LC_NUMERIC: %s\n" + " LC_TIME: %s\n"), lc_collate, lc_ctype, lc_messages, @@ -2395,7 +2445,9 @@ setup_locale_encoding(void) lc_time); } - if (!encoding) + if (!encoding && locale_provider == COLLPROVIDER_ICU) + encodingid = PG_UTF8; + else if (!encoding) { int ctype_enc; @@ -2899,6 +2951,8 @@ main(int argc, char *argv[]) {"data-checksums", no_argument, NULL, 'k'}, {"allow-group-access", no_argument, NULL, 'g'}, {"discard-caches", no_argument, NULL, 14}, + {"locale-provider", required_argument, NULL, 15}, + {"icu-locale", required_argument, NULL, 16}, {NULL, 0, NULL, 0} }; @@ -3045,6 +3099,20 @@ main(int argc, char *argv[]) extra_options, "-c debug_discard_caches=1"); break; + case 15: + if (strcmp(optarg, "icu") == 0) + locale_provider = COLLPROVIDER_ICU; + else if (strcmp(optarg, "libc") == 0) + locale_provider = COLLPROVIDER_LIBC; + else + { + pg_log_error("unrecognized locale provider: %s", optarg); + exit(1); + } + break; + case 16: + icu_locale = pg_strdup(optarg); + break; default: /* getopt_long already emitted a complaint */ fprintf(stderr, _("Try \"%s --help\" for more information.\n"), @@ -3073,6 +3141,13 @@ main(int argc, char *argv[]) exit(1); } + if (icu_locale && locale_provider != COLLPROVIDER_ICU) + { + pg_log_error("%s cannot be specified unless locale provider \"%s\" is chosen", + "--icu-locale", "icu"); + exit(1); + } + atexit(cleanup_directories_atexit); /* If we only need to fsync, just do it and exit */ diff --git a/src/bin/initdb/t/001_initdb.pl b/src/bin/initdb/t/001_initdb.pl index 7dc8cdd855..c636bf3ab2 100644 --- a/src/bin/initdb/t/001_initdb.pl +++ b/src/bin/initdb/t/001_initdb.pl @@ -93,4 +93,31 @@ 'check PGDATA permissions'); } +# Locale provider tests + +if ($ENV{with_icu} eq 'yes') +{ + command_fails_like(['initdb', '--no-sync', '--locale-provider=icu', "$tempdir/data2"], + qr/initdb: error: ICU locale must be specified/, + 'locale provider ICU requires --icu-locale'); + + command_ok(['initdb', '--no-sync', '--locale-provider=icu', '--icu-locale=en', "$tempdir/data3"], + 'option --icu-locale'); + + command_fails_like(['initdb', '--no-sync', '--locale-provider=icu', '--icu-locale=@colNumeric=lower', "$tempdir/dataX"], + qr/initdb: error: could not open collator for locale/, + 'fails for invalid ICU locale'); +} +else +{ + command_fails(['initdb', '--no-sync', '--locale-provider=icu', "$tempdir/data2"], + 'locale provider ICU fails since no ICU support'); +} + +command_fails(['initdb', '--no-sync', '--locale-provider=xyz', "$tempdir/dataX"], + 'fails for invalid locale provider'); + +command_fails(['initdb', '--no-sync', '--locale-provider=libc', '--icu-locale=en', "$tempdir/dataX"], + 'fails for invalid option combination'); + done_testing(); diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 4dd24b8c89..725cd2e4eb 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -2753,8 +2753,10 @@ dumpDatabase(Archive *fout) i_datname, i_datdba, i_encoding, + i_datlocprovider, i_collate, i_ctype, + i_daticulocale, i_frozenxid, i_minmxid, i_datacl, @@ -2769,8 +2771,10 @@ dumpDatabase(Archive *fout) const char *datname, *dba, *encoding, + *datlocprovider, *collate, *ctype, + *iculocale, *datistemplate, *datconnlimit, *tablespace; @@ -2794,9 +2798,9 @@ dumpDatabase(Archive *fout) else appendPQExpBuffer(dbQry, "0 AS datminmxid, "); if (fout->remoteVersion >= 150000) - appendPQExpBuffer(dbQry, "datcollversion, "); + appendPQExpBuffer(dbQry, "datlocprovider, daticulocale, datcollversion, "); else - appendPQExpBuffer(dbQry, "NULL AS datcollversion, "); + appendPQExpBuffer(dbQry, "'c' AS datlocprovider, NULL AS daticulocale, NULL AS datcollversion, "); appendPQExpBuffer(dbQry, "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace, " "shobj_description(oid, 'pg_database') AS description " @@ -2810,8 +2814,10 @@ dumpDatabase(Archive *fout) i_datname = PQfnumber(res, "datname"); i_datdba = PQfnumber(res, "datdba"); i_encoding = PQfnumber(res, "encoding"); + i_datlocprovider = PQfnumber(res, "datlocprovider"); i_collate = PQfnumber(res, "datcollate"); i_ctype = PQfnumber(res, "datctype"); + i_daticulocale = PQfnumber(res, "daticulocale"); i_frozenxid = PQfnumber(res, "datfrozenxid"); i_minmxid = PQfnumber(res, "datminmxid"); i_datacl = PQfnumber(res, "datacl"); @@ -2826,8 +2832,13 @@ dumpDatabase(Archive *fout) datname = PQgetvalue(res, 0, i_datname); dba = getRoleName(PQgetvalue(res, 0, i_datdba)); encoding = PQgetvalue(res, 0, i_encoding); + datlocprovider = PQgetvalue(res, 0, i_datlocprovider); collate = PQgetvalue(res, 0, i_collate); ctype = PQgetvalue(res, 0, i_ctype); + if (!PQgetisnull(res, 0, i_daticulocale)) + iculocale = PQgetvalue(res, 0, i_daticulocale); + else + iculocale = NULL; frozenxid = atooid(PQgetvalue(res, 0, i_frozenxid)); minmxid = atooid(PQgetvalue(res, 0, i_minmxid)); dbdacl.acl = PQgetvalue(res, 0, i_datacl); @@ -2859,6 +2870,16 @@ dumpDatabase(Archive *fout) appendPQExpBufferStr(creaQry, " ENCODING = "); appendStringLiteralAH(creaQry, encoding, fout); } + + appendPQExpBufferStr(creaQry, " LOCALE_PROVIDER = "); + if (datlocprovider[0] == 'c') + appendPQExpBufferStr(creaQry, "libc"); + else if (datlocprovider[0] == 'i') + appendPQExpBufferStr(creaQry, "icu"); + else + fatal("unrecognized locale provider: %s", + datlocprovider); + if (strlen(collate) > 0 && strcmp(collate, ctype) == 0) { appendPQExpBufferStr(creaQry, " LOCALE = "); @@ -2877,6 +2898,11 @@ dumpDatabase(Archive *fout) appendStringLiteralAH(creaQry, ctype, fout); } } + if (iculocale) + { + appendPQExpBufferStr(creaQry, " ICU_LOCALE = "); + appendStringLiteralAH(creaQry, iculocale, fout); + } /* * For binary upgrade, carry over the collation version. For normal diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c index 019bcb6c7b..cf3b398d9e 100644 --- a/src/bin/pg_upgrade/check.c +++ b/src/bin/pg_upgrade/check.c @@ -10,6 +10,7 @@ #include "postgres_fe.h" #include "catalog/pg_authid_d.h" +#include "catalog/pg_collation.h" #include "fe_utils/string_utils.h" #include "mb/pg_wchar.h" #include "pg_upgrade.h" @@ -349,6 +350,18 @@ check_locale_and_encoding(DbInfo *olddb, DbInfo *newdb) if (!equivalent_locale(LC_CTYPE, olddb->db_ctype, newdb->db_ctype)) pg_fatal("lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n", olddb->db_name, olddb->db_ctype, newdb->db_ctype); + if (olddb->db_collprovider != newdb->db_collprovider) + pg_fatal("locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n", + olddb->db_name, + collprovider_name(olddb->db_collprovider), + collprovider_name(newdb->db_collprovider)); + if ((olddb->db_iculocale == NULL && newdb->db_iculocale != NULL) || + (olddb->db_iculocale != NULL && newdb->db_iculocale == NULL) || + (olddb->db_iculocale != NULL && newdb->db_iculocale != NULL && strcmp(olddb->db_iculocale, newdb->db_iculocale) != 0)) + pg_fatal("ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n", + olddb->db_name, + olddb->db_iculocale ? olddb->db_iculocale : "(null)", + newdb->db_iculocale ? newdb->db_iculocale : "(null)"); } /* diff --git a/src/bin/pg_upgrade/info.c b/src/bin/pg_upgrade/info.c index 69ef23119f..5c3968e0ea 100644 --- a/src/bin/pg_upgrade/info.c +++ b/src/bin/pg_upgrade/info.c @@ -312,11 +312,20 @@ get_db_infos(ClusterInfo *cluster) i_encoding, i_datcollate, i_datctype, + i_datlocprovider, + i_daticulocale, i_spclocation; char query[QUERY_ALLOC]; snprintf(query, sizeof(query), - "SELECT d.oid, d.datname, d.encoding, d.datcollate, d.datctype, " + "SELECT d.oid, d.datname, d.encoding, d.datcollate, d.datctype, "); + if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1500) + snprintf(query + strlen(query), sizeof(query) - strlen(query), + "'c' AS datlocprovider, NULL AS daticulocale, "); + else + snprintf(query + strlen(query), sizeof(query) - strlen(query), + "datlocprovider, daticulocale, "); + snprintf(query + strlen(query), sizeof(query) - strlen(query), "pg_catalog.pg_tablespace_location(t.oid) AS spclocation " "FROM pg_catalog.pg_database d " " LEFT OUTER JOIN pg_catalog.pg_tablespace t " @@ -331,6 +340,8 @@ get_db_infos(ClusterInfo *cluster) i_encoding = PQfnumber(res, "encoding"); i_datcollate = PQfnumber(res, "datcollate"); i_datctype = PQfnumber(res, "datctype"); + i_datlocprovider = PQfnumber(res, "datlocprovider"); + i_daticulocale = PQfnumber(res, "daticulocale"); i_spclocation = PQfnumber(res, "spclocation"); ntups = PQntuples(res); @@ -343,6 +354,11 @@ get_db_infos(ClusterInfo *cluster) dbinfos[tupnum].db_encoding = atoi(PQgetvalue(res, tupnum, i_encoding)); dbinfos[tupnum].db_collate = pg_strdup(PQgetvalue(res, tupnum, i_datcollate)); dbinfos[tupnum].db_ctype = pg_strdup(PQgetvalue(res, tupnum, i_datctype)); + dbinfos[tupnum].db_collprovider = PQgetvalue(res, tupnum, i_datlocprovider)[0]; + if (PQgetisnull(res, tupnum, i_daticulocale)) + dbinfos[tupnum].db_iculocale = NULL; + else + dbinfos[tupnum].db_iculocale = pg_strdup(PQgetvalue(res, tupnum, i_daticulocale)); snprintf(dbinfos[tupnum].db_tablespace, sizeof(dbinfos[tupnum].db_tablespace), "%s", PQgetvalue(res, tupnum, i_spclocation)); } diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h index b9b3ac81b2..6d7fd88c0c 100644 --- a/src/bin/pg_upgrade/pg_upgrade.h +++ b/src/bin/pg_upgrade/pg_upgrade.h @@ -171,6 +171,8 @@ typedef struct * path */ char *db_collate; char *db_ctype; + char db_collprovider; + char *db_iculocale; int db_encoding; RelInfoArr rel_arr; /* array of all user relinfos */ } DbInfo; diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 9229eacb6d..991bfc1546 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -896,6 +896,18 @@ listAllDbs(const char *pattern, bool verbose) gettext_noop("Encoding"), gettext_noop("Collate"), gettext_noop("Ctype")); + if (pset.sversion >= 150000) + appendPQExpBuffer(&buf, + " d.daticulocale as \"%s\",\n" + " CASE d.datlocprovider WHEN 'c' THEN 'libc' WHEN 'i' THEN 'icu' END AS \"%s\",\n", + gettext_noop("ICU Locale"), + gettext_noop("Locale Provider")); + else + appendPQExpBuffer(&buf, + " d.datcollate as \"%s\",\n" + " 'libc' AS \"%s\",\n", + gettext_noop("ICU Locale"), + gettext_noop("Locale Provider")); appendPQExpBufferStr(&buf, " "); printACLColumn(&buf, "d.datacl"); if (verbose) @@ -4625,7 +4637,7 @@ listCollations(const char *pattern, bool verbose, bool showSystem) PQExpBufferData buf; PGresult *res; printQueryOpt myopt = pset.popt; - static const bool translate_columns[] = {false, false, false, false, false, true, false}; + static const bool translate_columns[] = {false, false, false, false, false, false, true, false}; initPQExpBuffer(&buf); @@ -4639,6 +4651,15 @@ listCollations(const char *pattern, bool verbose, bool showSystem) gettext_noop("Collate"), gettext_noop("Ctype")); + if (pset.sversion >= 150000) + appendPQExpBuffer(&buf, + ",\n c.colliculocale AS \"%s\"", + gettext_noop("ICU Locale")); + else + appendPQExpBuffer(&buf, + ",\n c.collcollate AS \"%s\"", + gettext_noop("ICU Locale")); + if (pset.sversion >= 100000) appendPQExpBuffer(&buf, ",\n CASE c.collprovider WHEN 'd' THEN 'default' WHEN 'c' THEN 'libc' WHEN 'i' THEN 'icu' END AS \"%s\"", diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 17172827a9..380cbc0b1f 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -2738,7 +2738,8 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("OWNER", "TEMPLATE", "ENCODING", "TABLESPACE", "IS_TEMPLATE", "ALLOW_CONNECTIONS", "CONNECTION LIMIT", - "LC_COLLATE", "LC_CTYPE", "LOCALE", "OID"); + "LC_COLLATE", "LC_CTYPE", "LOCALE", "OID", + "LOCALE_PROVIDER", "ICU_LOCALE"); else if (Matches("CREATE", "DATABASE", MatchAny, "TEMPLATE")) COMPLETE_WITH_QUERY(Query_for_list_of_template_databases); diff --git a/src/bin/scripts/Makefile b/src/bin/scripts/Makefile index b833109da6..25e7da3d3f 100644 --- a/src/bin/scripts/Makefile +++ b/src/bin/scripts/Makefile @@ -53,6 +53,8 @@ clean distclean maintainer-clean: rm -f common.o $(WIN32RES) rm -rf tmp_check +export with_icu + check: $(prove_check) diff --git a/src/bin/scripts/createdb.c b/src/bin/scripts/createdb.c index b0c6805bc9..6f612abf7c 100644 --- a/src/bin/scripts/createdb.c +++ b/src/bin/scripts/createdb.c @@ -38,6 +38,8 @@ main(int argc, char *argv[]) {"lc-ctype", required_argument, NULL, 2}, {"locale", required_argument, NULL, 'l'}, {"maintenance-db", required_argument, NULL, 3}, + {"locale-provider", required_argument, NULL, 4}, + {"icu-locale", required_argument, NULL, 5}, {NULL, 0, NULL, 0} }; @@ -61,6 +63,8 @@ main(int argc, char *argv[]) char *lc_collate = NULL; char *lc_ctype = NULL; char *locale = NULL; + char *locale_provider = NULL; + char *icu_locale = NULL; PQExpBufferData sql; @@ -119,6 +123,12 @@ main(int argc, char *argv[]) case 3: maintenance_db = pg_strdup(optarg); break; + case 4: + locale_provider = pg_strdup(optarg); + break; + case 5: + icu_locale = pg_strdup(optarg); + break; default: fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); @@ -217,6 +227,13 @@ main(int argc, char *argv[]) appendPQExpBufferStr(&sql, " LC_CTYPE "); appendStringLiteralConn(&sql, lc_ctype, conn); } + if (locale_provider) + appendPQExpBuffer(&sql, " LOCALE_PROVIDER %s", locale_provider); + if (icu_locale) + { + appendPQExpBufferStr(&sql, " ICU_LOCALE "); + appendStringLiteralConn(&sql, icu_locale, conn); + } appendPQExpBufferChar(&sql, ';'); @@ -273,6 +290,9 @@ help(const char *progname) printf(_(" -l, --locale=LOCALE locale settings for the database\n")); printf(_(" --lc-collate=LOCALE LC_COLLATE setting for the database\n")); printf(_(" --lc-ctype=LOCALE LC_CTYPE setting for the database\n")); + printf(_(" --icu-locale=LOCALE ICU locale setting for the database\n")); + printf(_(" --locale-provider={libc|icu}\n" + " locale provider for the database's default collation\n")); printf(_(" -O, --owner=OWNER database user to own the new database\n")); printf(_(" -T, --template=TEMPLATE template database to copy\n")); printf(_(" -V, --version output version information, then exit\n")); diff --git a/src/bin/scripts/t/020_createdb.pl b/src/bin/scripts/t/020_createdb.pl index 639245466e..35deec9a92 100644 --- a/src/bin/scripts/t/020_createdb.pl +++ b/src/bin/scripts/t/020_createdb.pl @@ -25,9 +25,37 @@ qr/statement: CREATE DATABASE foobar2 ENCODING 'LATIN1'/, 'create database with encoding'); +if ($ENV{with_icu} eq 'yes') +{ + # This fails because template0 uses libc provider and has no ICU + # locale set. It would succeed if template0 used the icu + # provider. XXX Maybe split into multiple tests? + $node->command_fails( + [ 'createdb', '-T', 'template0', '--locale-provider=icu', 'foobar4' ], + 'create database with ICU fails without ICU locale specified'); + + $node->issues_sql_like( + [ 'createdb', '-T', 'template0', '--locale-provider=icu', '--icu-locale=en', 'foobar5' ], + qr/statement: CREATE DATABASE foobar5 .* LOCALE_PROVIDER icu ICU_LOCALE 'en'/, + 'create database with ICU locale specified'); + + $node->command_fails( + [ 'createdb', '-T', 'template0', '--locale-provider=icu', '--icu-locale=@colNumeric=lower', 'foobarX' ], + 'fails for invalid ICU locale'); +} +else +{ + $node->command_fails( + [ 'createdb', '-T', 'template0', '--locale-provider=icu', 'foobar4' ], + 'create database with ICU fails since no ICU support'); +} + $node->command_fails([ 'createdb', 'foobar1' ], 'fails if database already exists'); +$node->command_fails([ 'createdb', '-T', 'template0', '--locale-provider=xyz', 'foobarX' ], + 'fails for invalid locale provider'); + # Check use of templates with shared dependencies copied from the template. my ($ret, $stdout, $stderr) = $node->psql( 'foobar2', diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 1aa1d41e79..dcc0aba82a 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202203141 +#define CATALOG_VERSION_NO 202203171 #endif diff --git a/src/include/catalog/pg_collation.dat b/src/include/catalog/pg_collation.dat index 4b56825d82..f7470ead49 100644 --- a/src/include/catalog/pg_collation.dat +++ b/src/include/catalog/pg_collation.dat @@ -14,8 +14,7 @@ { oid => '100', oid_symbol => 'DEFAULT_COLLATION_OID', descr => 'database\'s default collation', - collname => 'default', collprovider => 'd', collencoding => '-1', - collcollate => '', collctype => '' }, + collname => 'default', collprovider => 'd', collencoding => '-1' }, { oid => '950', oid_symbol => 'C_COLLATION_OID', descr => 'standard C collation', collname => 'C', collprovider => 'c', collencoding => '-1', diff --git a/src/include/catalog/pg_collation.h b/src/include/catalog/pg_collation.h index 8763dd4080..c642c3bb95 100644 --- a/src/include/catalog/pg_collation.h +++ b/src/include/catalog/pg_collation.h @@ -40,8 +40,9 @@ CATALOG(pg_collation,3456,CollationRelationId) bool collisdeterministic BKI_DEFAULT(t); int32 collencoding; /* encoding for this collation; -1 = "all" */ #ifdef CATALOG_VARLEN /* variable-length fields start here */ - text collcollate BKI_FORCE_NOT_NULL; /* LC_COLLATE setting */ - text collctype BKI_FORCE_NOT_NULL; /* LC_CTYPE setting */ + text collcollate BKI_DEFAULT(_null_); /* LC_COLLATE setting */ + text collctype BKI_DEFAULT(_null_); /* LC_CTYPE setting */ + text colliculocale BKI_DEFAULT(_null_); /* ICU locale ID */ text collversion BKI_DEFAULT(_null_); /* provider-dependent * version of collation * data */ @@ -66,6 +67,20 @@ DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, CollationOidIndexId, on #define COLLPROVIDER_ICU 'i' #define COLLPROVIDER_LIBC 'c' +static inline const char * +collprovider_name(char c) +{ + switch (c) + { + case COLLPROVIDER_ICU: + return "icu"; + case COLLPROVIDER_LIBC: + return "libc"; + default: + return "???"; + } +} + #endif /* EXPOSE_TO_CLIENT_CODE */ @@ -75,6 +90,7 @@ extern Oid CollationCreate(const char *collname, Oid collnamespace, bool collisdeterministic, int32 collencoding, const char *collcollate, const char *collctype, + const char *colliculocale, const char *collversion, bool if_not_exists, bool quiet); diff --git a/src/include/catalog/pg_database.dat b/src/include/catalog/pg_database.dat index e7e42d6023..5feedff7bf 100644 --- a/src/include/catalog/pg_database.dat +++ b/src/include/catalog/pg_database.dat @@ -14,9 +14,9 @@ { oid => '1', oid_symbol => 'TemplateDbOid', descr => 'default template for new databases', - datname => 'template1', encoding => 'ENCODING', datistemplate => 't', + datname => 'template1', encoding => 'ENCODING', datlocprovider => 'LOCALE_PROVIDER', datistemplate => 't', datallowconn => 't', datconnlimit => '-1', datfrozenxid => '0', datminmxid => '1', dattablespace => 'pg_default', datcollate => 'LC_COLLATE', - datctype => 'LC_CTYPE', datacl => '_null_' }, + datctype => 'LC_CTYPE', daticulocale => 'ICU_LOCALE', datacl => '_null_' }, ] diff --git a/src/include/catalog/pg_database.h b/src/include/catalog/pg_database.h index 76adbd4aad..a9f4a8071f 100644 --- a/src/include/catalog/pg_database.h +++ b/src/include/catalog/pg_database.h @@ -40,6 +40,9 @@ CATALOG(pg_database,1262,DatabaseRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID /* character encoding */ int32 encoding; + /* locale provider, see pg_collation.collprovider */ + char datlocprovider; + /* allowed as CREATE DATABASE template? */ bool datistemplate; @@ -65,6 +68,9 @@ CATALOG(pg_database,1262,DatabaseRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID /* LC_CTYPE setting */ text datctype BKI_FORCE_NOT_NULL; + /* ICU locale ID */ + text daticulocale; + /* provider-dependent version of collation data */ text datcollversion BKI_DEFAULT(_null_); diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h index 30e423af0e..9b158f24a0 100644 --- a/src/include/utils/pg_locale.h +++ b/src/include/utils/pg_locale.h @@ -103,6 +103,11 @@ struct pg_locale_struct typedef struct pg_locale_struct *pg_locale_t; +extern struct pg_locale_struct default_locale; + +extern void make_icu_collator(const char *iculocstr, + struct pg_locale_struct *resultp); + extern pg_locale_t pg_newlocale_from_collation(Oid collid); extern char *get_collation_actual_version(char collprovider, const char *collcollate); diff --git a/src/test/Makefile b/src/test/Makefile index 46275915ff..69ef074d75 100644 --- a/src/test/Makefile +++ b/src/test/Makefile @@ -14,6 +14,10 @@ include $(top_builddir)/src/Makefile.global SUBDIRS = perl regress isolation modules authentication recovery subscription +ifeq ($(with_icu),yes) +SUBDIRS += icu +endif + # Test suites that are not safe by default but can be run if selected # by the user via the whitespace-separated list in variable # PG_TEST_EXTRA: @@ -37,7 +41,7 @@ endif # clean" etc to recurse into them. (We must filter out those that we # have conditionally included into SUBDIRS above, else there will be # make confusion.) -ALWAYS_SUBDIRS = $(filter-out $(SUBDIRS),examples kerberos ldap ssl) +ALWAYS_SUBDIRS = $(filter-out $(SUBDIRS),examples kerberos icu ldap ssl) # We want to recurse to all subdirs for all standard targets, except that # installcheck and install should not recurse into the subdirectory "modules". diff --git a/src/test/icu/.gitignore b/src/test/icu/.gitignore new file mode 100644 index 0000000000..871e943d50 --- /dev/null +++ b/src/test/icu/.gitignore @@ -0,0 +1,2 @@ +# Generated by test suite +/tmp_check/ diff --git a/src/test/icu/Makefile b/src/test/icu/Makefile new file mode 100644 index 0000000000..e30f5e9524 --- /dev/null +++ b/src/test/icu/Makefile @@ -0,0 +1,25 @@ +#------------------------------------------------------------------------- +# +# Makefile for src/test/icu +# +# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group +# Portions Copyright (c) 1994, Regents of the University of California +# +# src/test/icu/Makefile +# +#------------------------------------------------------------------------- + +subdir = src/test/icu +top_builddir = ../../.. +include $(top_builddir)/src/Makefile.global + +export with_icu + +check: + $(prove_check) + +installcheck: + $(prove_installcheck) + +clean distclean maintainer-clean: + rm -rf tmp_check diff --git a/src/test/icu/README b/src/test/icu/README new file mode 100644 index 0000000000..cfc9353dff --- /dev/null +++ b/src/test/icu/README @@ -0,0 +1,27 @@ +src/test/icu/README + +Regression tests for ICU functionality +====================================== + +This directory contains a test suite for ICU functionality. + +Running the tests +================= + +NOTE: You must have given the --enable-tap-tests argument to configure. +Also, to use "make installcheck", you must have built and installed +contrib/hstore in addition to the core code. + +Run + make check +or + make installcheck +You can use "make installcheck" if you previously did "make install". +In that case, the code in the installation tree is tested. With +"make check", a temporary installation tree is built from the current +sources and then tested. + +Either way, this test initializes, starts, and stops several test Postgres +clusters. + +See src/test/perl/README for more info about running these tests. diff --git a/src/test/icu/t/010_database.pl b/src/test/icu/t/010_database.pl new file mode 100644 index 0000000000..4cc8907b42 --- /dev/null +++ b/src/test/icu/t/010_database.pl @@ -0,0 +1,58 @@ +# Copyright (c) 2022, PostgreSQL Global Development Group + +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +if ($ENV{with_icu} ne 'yes') +{ + plan skip_all => 'ICU not supported by this build'; +} + +my $node1 = PostgreSQL::Test::Cluster->new('node1'); +$node1->init; +$node1->start; + +$node1->safe_psql('postgres', + q{CREATE DATABASE dbicu LOCALE_PROVIDER icu LOCALE 'C' ICU_LOCALE 'en-u-kf-upper' TEMPLATE template0}); + +$node1->safe_psql('dbicu', +q{ +CREATE COLLATION upperfirst (provider = icu, locale = 'en-u-kf-upper'); +CREATE TABLE icu (def text, en text COLLATE "en-x-icu", upfirst text COLLATE upperfirst); +INSERT INTO icu VALUES ('a', 'a', 'a'), ('b', 'b', 'b'), ('A', 'A', 'A'), ('B', 'B', 'B'); +}); + +is($node1->safe_psql('dbicu', q{SELECT def FROM icu ORDER BY def}), + qq(A +a +B +b), + 'sort by database default locale'); + +is($node1->safe_psql('dbicu', q{SELECT def FROM icu ORDER BY def COLLATE "en-x-icu"}), + qq(a +A +b +B), + 'sort by explicit collation standard'); + +is($node1->safe_psql('dbicu', q{SELECT def FROM icu ORDER BY en COLLATE upperfirst}), + qq(A +a +B +b), + 'sort by explicit collation upper first'); + + +# Test error cases in CREATE DATABASE involving locale-related options + +my ($ret, $stdout, $stderr) = $node1->psql('postgres', + q{CREATE DATABASE dbicu LOCALE_PROVIDER icu TEMPLATE template0}); +isnt($ret, 0, "ICU locale must be specified for ICU provider: exit code not 0"); +like($stderr, qr/ERROR: ICU locale must be specified/, "ICU locale must be specified for ICU provider: error message"); + + +done_testing(); diff --git a/src/test/regress/expected/collate.icu.utf8.out b/src/test/regress/expected/collate.icu.utf8.out index 9699ca16cf..d4c8c6de38 100644 --- a/src/test/regress/expected/collate.icu.utf8.out +++ b/src/test/regress/expected/collate.icu.utf8.out @@ -1029,14 +1029,12 @@ CREATE COLLATION test0 FROM "C"; -- fail, duplicate name ERROR: collation "test0" already exists do $$ BEGIN - EXECUTE 'CREATE COLLATION test1 (provider = icu, lc_collate = ' || - quote_literal(current_setting('lc_collate')) || - ', lc_ctype = ' || - quote_literal(current_setting('lc_ctype')) || ');'; + EXECUTE 'CREATE COLLATION test1 (provider = icu, locale = ' || + quote_literal(current_setting('lc_collate')) || ');'; END $$; -CREATE COLLATION test3 (provider = icu, lc_collate = 'en_US.utf8'); -- fail, need lc_ctype -ERROR: parameter "lc_ctype" must be specified +CREATE COLLATION test3 (provider = icu, lc_collate = 'en_US.utf8'); -- fail, needs "locale" +ERROR: parameter "locale" must be specified CREATE COLLATION testx (provider = icu, locale = 'nonsense'); /* never fails with ICU */ DROP COLLATION testx; CREATE COLLATION test4 FROM nonsense; ERROR: collation "nonsense" for encoding "UTF8" does not exist diff --git a/src/test/regress/sql/collate.icu.utf8.sql b/src/test/regress/sql/collate.icu.utf8.sql index 242a7ce6b7..b0ddc7db44 100644 --- a/src/test/regress/sql/collate.icu.utf8.sql +++ b/src/test/regress/sql/collate.icu.utf8.sql @@ -366,13 +366,11 @@ $$; CREATE COLLATION test0 FROM "C"; -- fail, duplicate name do $$ BEGIN - EXECUTE 'CREATE COLLATION test1 (provider = icu, lc_collate = ' || - quote_literal(current_setting('lc_collate')) || - ', lc_ctype = ' || - quote_literal(current_setting('lc_ctype')) || ');'; + EXECUTE 'CREATE COLLATION test1 (provider = icu, locale = ' || + quote_literal(current_setting('lc_collate')) || ');'; END $$; -CREATE COLLATION test3 (provider = icu, lc_collate = 'en_US.utf8'); -- fail, need lc_ctype +CREATE COLLATION test3 (provider = icu, lc_collate = 'en_US.utf8'); -- fail, needs "locale" CREATE COLLATION testx (provider = icu, locale = 'nonsense'); /* never fails with ICU */ DROP COLLATION testx; CREATE COLLATION test4 FROM nonsense; From 25e777cf8e547d7423d2e1e9da71f98b9414d59e Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 17 Mar 2022 11:47:04 +0100 Subject: [PATCH 156/772] Split ExecUpdate and ExecDelete into reusable pieces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create subroutines ExecUpdatePrologue / ExecUpdateAct / ExecUpdateEpilogue, and similar for ExecDelete. Introduce a new struct to be used internally in nodeModifyTable.c, dubbed ModifyTableContext, which contains all context information needed to perform these operations, as well as ExecInsert and others. This allows using a different schedule and a different way of evaluating the results of these operations, which can be exploited by a later commit introducing support for MERGE. It also makes ExecUpdate and ExecDelete proper shorter and (hopefully) simpler. Author: Álvaro Herrera Reviewed-by: Amit Langote Reviewed-by: Japin Li Reviewed-by: Zhihong Yu Discussion: https://postgr.es/m/202202271724.4z7xv3cf46kv@alvherre.pgsql --- src/backend/executor/nodeModifyTable.c | 781 +++++++++++++++---------- src/tools/pgindent/typedefs.list | 2 + 2 files changed, 484 insertions(+), 299 deletions(-) diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 5ec699a9bd..6239abae90 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -20,8 +20,8 @@ * * NOTES * The ModifyTable node receives input from its outerPlan, which is - * the data to insert for INSERT cases, or the changed columns' new - * values plus row-locating info for UPDATE cases, or just the + * the data to insert for INSERT cases, the changed columns' new + * values plus row-locating info for UPDATE and MERGE cases, or just the * row-locating info for DELETE cases. * * If the query specifies RETURNING, then the ModifyTable returns a @@ -60,6 +60,61 @@ typedef struct MTTargetRelLookup int relationIndex; /* rel's index in resultRelInfo[] array */ } MTTargetRelLookup; +/* + * Context struct for a ModifyTable operation, containing basic execution + * state and some output variables populated by ExecUpdateAct() and + * ExecDeleteAct() to report the result of their actions to callers. + */ +typedef struct ModifyTableContext +{ + /* Operation state */ + ModifyTableState *mtstate; + EPQState *epqstate; + EState *estate; + + /* + * Slot containing tuple obtained from ModifyTable's subplan. Used to + * access "junk" columns that are not going to be stored. + */ + TupleTableSlot *planSlot; + + + /* + * Information about the changes that were made concurrently to a tuple + * being updated or deleted + */ + TM_FailureData tmfd; + + /* + * The tuple produced by EvalPlanQual to retry from, if a cross-partition + * UPDATE requires it + */ + TupleTableSlot *cpUpdateRetrySlot; + + /* + * The tuple projected by the INSERT's RETURNING clause, when doing a + * cross-partition UPDATE + */ + TupleTableSlot *cpUpdateReturningSlot; + + /* + * Lock mode to acquire on the latest tuple version before performing + * EvalPlanQual on it + */ + LockTupleMode lockmode; +} ModifyTableContext; + +/* + * Context struct containing output data specific to UPDATE operations. + */ +typedef struct UpdateContext +{ + bool updated; /* did UPDATE actually occur? */ + bool updateIndexes; /* index update required? */ + bool crossPartUpdate; /* was it a cross-partition update? */ +} UpdateContext; + + static void ExecBatchInsert(ModifyTableState *mtstate, ResultRelInfo *resultRelInfo, TupleTableSlot **slots, @@ -67,12 +122,10 @@ static void ExecBatchInsert(ModifyTableState *mtstate, int numSlots, EState *estate, bool canSetTag); -static bool ExecOnConflictUpdate(ModifyTableState *mtstate, +static bool ExecOnConflictUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer conflictTid, - TupleTableSlot *planSlot, TupleTableSlot *excludedSlot, - EState *estate, bool canSetTag, TupleTableSlot **returning); static TupleTableSlot *ExecPrepareTupleRouting(ModifyTableState *mtstate, @@ -580,8 +633,6 @@ ExecGetUpdateNewTuple(ResultRelInfo *relinfo, * relations. * * slot contains the new tuple value to be stored. - * planSlot is the output of the ModifyTable's subplan; we use it - * to access "junk" columns that are not going to be stored. * * Returns RETURNING result if any, otherwise NULL. * @@ -591,15 +642,16 @@ ExecGetUpdateNewTuple(ResultRelInfo *relinfo, * ---------------------------------------------------------------- */ static TupleTableSlot * -ExecInsert(ModifyTableState *mtstate, +ExecInsert(ModifyTableContext *context, ResultRelInfo *resultRelInfo, TupleTableSlot *slot, - TupleTableSlot *planSlot, - EState *estate, bool canSetTag) { + ModifyTableState *mtstate = context->mtstate; + EState *estate = context->estate; Relation resultRelationDesc; List *recheckIndexes = NIL; + TupleTableSlot *planSlot = context->planSlot; TupleTableSlot *result = NULL; TransitionCaptureState *ar_insert_trig_tcs; ModifyTable *node = (ModifyTable *) mtstate->ps.plan; @@ -850,9 +902,9 @@ ExecInsert(ModifyTableState *mtstate, */ TupleTableSlot *returning = NULL; - if (ExecOnConflictUpdate(mtstate, resultRelInfo, - &conflictTid, planSlot, slot, - estate, canSetTag, &returning)) + if (ExecOnConflictUpdate(context, resultRelInfo, + &conflictTid, slot, canSetTag, + &returning)) { InstrCountTuples2(&mtstate->ps, 1); return returning; @@ -1055,6 +1107,90 @@ ExecBatchInsert(ModifyTableState *mtstate, estate->es_processed += numInserted; } +/* + * ExecDeletePrologue -- subroutine for ExecDelete + * + * Prepare executor state for DELETE. Actually, the only thing we have to do + * here is execute BEFORE ROW triggers. We return false if one of them makes + * the delete a no-op; otherwise, return true. + */ +static bool +ExecDeletePrologue(ModifyTableContext *context, ResultRelInfo *resultRelInfo, + ItemPointer tupleid, HeapTuple oldtuple, + TupleTableSlot **epqreturnslot) +{ + /* BEFORE ROW DELETE triggers */ + if (resultRelInfo->ri_TrigDesc && + resultRelInfo->ri_TrigDesc->trig_delete_before_row) + return ExecBRDeleteTriggers(context->estate, context->epqstate, + resultRelInfo, tupleid, oldtuple, + epqreturnslot); + + return true; +} + +/* + * ExecDeleteAct -- subroutine for ExecDelete + * + * Actually delete the tuple from a plain table. + * + * Caller is in charge of doing EvalPlanQual as necessary + */ +static TM_Result +ExecDeleteAct(ModifyTableContext *context, ResultRelInfo *resultRelInfo, + ItemPointer tupleid, bool changingPart) +{ + EState *estate = context->estate; + + return table_tuple_delete(resultRelInfo->ri_RelationDesc, tupleid, + estate->es_output_cid, + estate->es_snapshot, + estate->es_crosscheck_snapshot, + true /* wait for commit */ , + &context->tmfd, + changingPart); +} + +/* + * ExecDeleteEpilogue -- subroutine for ExecDelete + * + * Closing steps of tuple deletion; this invokes AFTER FOR EACH ROW triggers, + * including the UPDATE triggers if the deletion is being done as part of a + * cross-partition tuple move. + */ +static void +ExecDeleteEpilogue(ModifyTableContext *context, ResultRelInfo *resultRelInfo, + ItemPointer tupleid, HeapTuple oldtuple) +{ + ModifyTableState *mtstate = context->mtstate; + EState *estate = context->estate; + TransitionCaptureState *ar_delete_trig_tcs; + + /* + * If this delete is the result of a partition key update that moved the + * tuple to a new partition, put this row into the transition OLD TABLE, + * if there is one. We need to do this separately for DELETE and INSERT + * because they happen on different tables. + */ + ar_delete_trig_tcs = mtstate->mt_transition_capture; + if (mtstate->operation == CMD_UPDATE && mtstate->mt_transition_capture && + mtstate->mt_transition_capture->tcs_update_old_table) + { + ExecARUpdateTriggers(estate, resultRelInfo, tupleid, oldtuple, + NULL, NULL, mtstate->mt_transition_capture); + + /* + * We've already captured the NEW TABLE row, so make sure any AR + * DELETE trigger fired below doesn't capture it again. + */ + ar_delete_trig_tcs = NULL; + } + + /* AFTER ROW DELETE Triggers */ + ExecARDeleteTriggers(estate, resultRelInfo, tupleid, oldtuple, + ar_delete_trig_tcs); +} + /* ---------------------------------------------------------------- * ExecDelete * @@ -1072,46 +1208,37 @@ ExecBatchInsert(ModifyTableState *mtstate, * whether the tuple is actually deleted, callers can use it to * decide whether to continue the operation. When this DELETE is a * part of an UPDATE of partition-key, then the slot returned by - * EvalPlanQual() is passed back using output parameter epqslot. + * EvalPlanQual() is passed back using output parameter epqreturnslot. * * Returns RETURNING result if any, otherwise NULL. * ---------------------------------------------------------------- */ static TupleTableSlot * -ExecDelete(ModifyTableState *mtstate, +ExecDelete(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, - TupleTableSlot *planSlot, - EPQState *epqstate, - EState *estate, bool processReturning, - bool canSetTag, bool changingPart, + bool canSetTag, bool *tupleDeleted, TupleTableSlot **epqreturnslot) { + EState *estate = context->estate; Relation resultRelationDesc = resultRelInfo->ri_RelationDesc; - TM_Result result; - TM_FailureData tmfd; TupleTableSlot *slot = NULL; - TransitionCaptureState *ar_delete_trig_tcs; + TM_Result result; if (tupleDeleted) *tupleDeleted = false; - /* BEFORE ROW DELETE Triggers */ - if (resultRelInfo->ri_TrigDesc && - resultRelInfo->ri_TrigDesc->trig_delete_before_row) - { - bool dodelete; - - dodelete = ExecBRDeleteTriggers(estate, epqstate, resultRelInfo, - tupleid, oldtuple, epqreturnslot); - - if (!dodelete) /* "do nothing" */ - return NULL; - } + /* + * Prepare for the delete. This includes BEFORE ROW triggers, so we're + * done if it says we are. + */ + if (!ExecDeletePrologue(context, resultRelInfo, tupleid, oldtuple, + epqreturnslot)) + return NULL; /* INSTEAD OF ROW DELETE Triggers */ if (resultRelInfo->ri_TrigDesc && @@ -1137,7 +1264,7 @@ ExecDelete(ModifyTableState *mtstate, slot = resultRelInfo->ri_FdwRoutine->ExecForeignDelete(estate, resultRelInfo, slot, - planSlot); + context->planSlot); if (slot == NULL) /* "do nothing" */ return NULL; @@ -1156,20 +1283,14 @@ ExecDelete(ModifyTableState *mtstate, /* * delete the tuple * - * Note: if es_crosscheck_snapshot isn't InvalidSnapshot, we check - * that the row to be deleted is visible to that snapshot, and throw a - * can't-serialize error if not. This is a special-case behavior - * needed for referential integrity updates in transaction-snapshot - * mode transactions. + * Note: if context->estate->es_crosscheck_snapshot isn't + * InvalidSnapshot, we check that the row to be deleted is visible to + * that snapshot, and throw a can't-serialize error if not. This is a + * special-case behavior needed for referential integrity updates in + * transaction-snapshot mode transactions. */ ldelete:; - result = table_tuple_delete(resultRelationDesc, tupleid, - estate->es_output_cid, - estate->es_snapshot, - estate->es_crosscheck_snapshot, - true /* wait for commit */ , - &tmfd, - changingPart); + result = ExecDeleteAct(context, resultRelInfo, tupleid, changingPart); switch (result) { @@ -1199,7 +1320,7 @@ ldelete:; * can re-execute the DELETE and then return NULL to cancel * the outer delete. */ - if (tmfd.cmax != estate->es_output_cid) + if (context->tmfd.cmax != estate->es_output_cid) ereport(ERROR, (errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION), errmsg("tuple to be deleted was already modified by an operation triggered by the current command"), @@ -1225,8 +1346,8 @@ ldelete:; * Already know that we're going to need to do EPQ, so * fetch tuple directly into the right slot. */ - EvalPlanQualBegin(epqstate); - inputslot = EvalPlanQualSlot(epqstate, resultRelationDesc, + EvalPlanQualBegin(context->epqstate); + inputslot = EvalPlanQualSlot(context->epqstate, resultRelationDesc, resultRelInfo->ri_RangeTableIndex); result = table_tuple_lock(resultRelationDesc, tupleid, @@ -1234,13 +1355,13 @@ ldelete:; inputslot, estate->es_output_cid, LockTupleExclusive, LockWaitBlock, TUPLE_LOCK_FLAG_FIND_LAST_VERSION, - &tmfd); + &context->tmfd); switch (result) { case TM_Ok: - Assert(tmfd.traversed); - epqslot = EvalPlanQual(epqstate, + Assert(context->tmfd.traversed); + epqslot = EvalPlanQual(context->epqstate, resultRelationDesc, resultRelInfo->ri_RangeTableIndex, inputslot); @@ -1273,7 +1394,7 @@ ldelete:; * See also TM_SelfModified response to * table_tuple_delete() above. */ - if (tmfd.cmax != estate->es_output_cid) + if (context->tmfd.cmax != estate->es_output_cid) ereport(ERROR, (errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION), errmsg("tuple to be deleted was already modified by an operation triggered by the current command"), @@ -1336,33 +1457,7 @@ ldelete:; if (tupleDeleted) *tupleDeleted = true; - /* - * If this delete is the result of a partition key update that moved the - * tuple to a new partition, put this row into the transition OLD TABLE, - * if there is one. We need to do this separately for DELETE and INSERT - * because they happen on different tables. - */ - ar_delete_trig_tcs = mtstate->mt_transition_capture; - if (mtstate->operation == CMD_UPDATE && mtstate->mt_transition_capture - && mtstate->mt_transition_capture->tcs_update_old_table) - { - ExecARUpdateTriggers(estate, resultRelInfo, - tupleid, - oldtuple, - NULL, - NULL, - mtstate->mt_transition_capture); - - /* - * We've already captured the NEW TABLE row, so make sure any AR - * DELETE trigger fired below doesn't capture it again. - */ - ar_delete_trig_tcs = NULL; - } - - /* AFTER ROW DELETE Triggers */ - ExecARDeleteTriggers(estate, resultRelInfo, tupleid, oldtuple, - ar_delete_trig_tcs); + ExecDeleteEpilogue(context, resultRelInfo, tupleid, oldtuple); /* Process RETURNING if present and if requested */ if (processReturning && resultRelInfo->ri_projectReturning) @@ -1393,7 +1488,7 @@ ldelete:; } } - rslot = ExecProcessReturning(resultRelInfo, slot, planSlot); + rslot = ExecProcessReturning(resultRelInfo, slot, context->planSlot); /* * Before releasing the target tuple again, make sure rslot has a @@ -1427,21 +1522,20 @@ ldelete:; * and call this function again or perform a regular update accordingly. */ static bool -ExecCrossPartitionUpdate(ModifyTableState *mtstate, +ExecCrossPartitionUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, - TupleTableSlot *slot, TupleTableSlot *planSlot, - EPQState *epqstate, bool canSetTag, - TupleTableSlot **retry_slot, - TupleTableSlot **inserted_tuple) + TupleTableSlot *slot, + bool canSetTag, UpdateContext *updateCxt) { + ModifyTableState *mtstate = context->mtstate; EState *estate = mtstate->ps.state; TupleConversionMap *tupconv_map; bool tuple_deleted; TupleTableSlot *epqslot = NULL; - *inserted_tuple = NULL; - *retry_slot = NULL; + context->cpUpdateReturningSlot = NULL; + context->cpUpdateRetrySlot = NULL; /* * Disallow an INSERT ON CONFLICT DO UPDATE that causes the original row @@ -1488,11 +1582,11 @@ ExecCrossPartitionUpdate(ModifyTableState *mtstate, * Row movement, part 1. Delete the tuple, but skip RETURNING processing. * We want to return rows from INSERT. */ - ExecDelete(mtstate, resultRelInfo, tupleid, oldtuple, planSlot, - epqstate, estate, + ExecDelete(context, resultRelInfo, + tupleid, oldtuple, false, /* processReturning */ - false, /* canSetTag */ true, /* changingPart */ + false, /* canSetTag */ &tuple_deleted, &epqslot); /* @@ -1538,8 +1632,9 @@ ExecCrossPartitionUpdate(ModifyTableState *mtstate, SnapshotAny, oldSlot)) elog(ERROR, "failed to fetch tuple being updated"); - *retry_slot = ExecGetUpdateNewTuple(resultRelInfo, epqslot, - oldSlot); + /* and project the new tuple to retry the UPDATE with */ + context->cpUpdateRetrySlot = + ExecGetUpdateNewTuple(resultRelInfo, epqslot, oldSlot); return false; } } @@ -1556,8 +1651,8 @@ ExecCrossPartitionUpdate(ModifyTableState *mtstate, mtstate->mt_root_tuple_slot); /* Tuple routing starts from the root table. */ - *inserted_tuple = ExecInsert(mtstate, mtstate->rootResultRelInfo, slot, - planSlot, estate, canSetTag); + context->cpUpdateReturningSlot = + ExecInsert(context, mtstate->rootResultRelInfo, slot, canSetTag); /* * Reset the transition state that may possibly have been written by @@ -1570,6 +1665,233 @@ ExecCrossPartitionUpdate(ModifyTableState *mtstate, return true; } +/* + * ExecUpdatePrologue -- subroutine for ExecUpdate + * + * Prepare executor state for UPDATE. This includes running BEFORE ROW + * triggers. We return false if one of them makes the update a no-op; + * otherwise, return true. + */ +static bool +ExecUpdatePrologue(ModifyTableContext *context, ResultRelInfo *resultRelInfo, + ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot *slot) +{ + Relation resultRelationDesc = resultRelInfo->ri_RelationDesc; + + ExecMaterializeSlot(slot); + + /* + * Open the table's indexes, if we have not done so already, so that we + * can add new index entries for the updated tuple. + */ + if (resultRelationDesc->rd_rel->relhasindex && + resultRelInfo->ri_IndexRelationDescs == NULL) + ExecOpenIndices(resultRelInfo, false); + + /* BEFORE ROW UPDATE triggers */ + if (resultRelInfo->ri_TrigDesc && + resultRelInfo->ri_TrigDesc->trig_update_before_row) + return ExecBRUpdateTriggers(context->estate, context->epqstate, + resultRelInfo, tupleid, oldtuple, slot); + + return true; +} + +/* + * ExecUpdatePrepareSlot -- subroutine for ExecUpdate + * + * Apply the final modifications to the tuple slot before the update. + */ +static void +ExecUpdatePrepareSlot(ResultRelInfo *resultRelInfo, + TupleTableSlot *slot, + EState *estate) +{ + Relation resultRelationDesc = resultRelInfo->ri_RelationDesc; + + /* + * Constraints and GENERATED expressions might reference the tableoid + * column, so (re-)initialize tts_tableOid before evaluating them. + */ + slot->tts_tableOid = RelationGetRelid(resultRelationDesc); + + /* + * Compute stored generated columns + */ + if (resultRelationDesc->rd_att->constr && + resultRelationDesc->rd_att->constr->has_generated_stored) + ExecComputeStoredGenerated(resultRelInfo, estate, slot, + CMD_UPDATE); +} + +/* + * ExecUpdateAct -- subroutine for ExecUpdate + * + * Actually update the tuple, when operating on a plain table. If the + * table is a partition, and the command was called referencing an ancestor + * partitioned table, this routine migrates the resulting tuple to another + * partition. + * + * The caller is in charge of keeping indexes current as necessary. The + * caller is also in charge of doing EvalPlanQual if the tuple is found to + * be concurrently updated. However, in case of a cross-partition update, + * this routine does it. + * + * Caller is in charge of doing EvalPlanQual as necessary, and of keeping + * indexes current for the update. + */ +static TM_Result +ExecUpdateAct(ModifyTableContext *context, ResultRelInfo *resultRelInfo, + ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot *slot, + bool canSetTag, UpdateContext *updateCxt) +{ + EState *estate = context->estate; + Relation resultRelationDesc = resultRelInfo->ri_RelationDesc; + bool partition_constraint_failed; + TM_Result result; + + updateCxt->crossPartUpdate = false; + + /* + * If we generate a new candidate tuple after EvalPlanQual testing, we + * must loop back here and recheck any RLS policies and constraints. (We + * don't need to redo triggers, however. If there are any BEFORE triggers + * then trigger.c will have done table_tuple_lock to lock the correct + * tuple, so there's no need to do them again.) + */ +lreplace:; + + /* ensure slot is independent, consider e.g. EPQ */ + ExecMaterializeSlot(slot); + + /* + * If partition constraint fails, this row might get moved to another + * partition, in which case we should check the RLS CHECK policy just + * before inserting into the new partition, rather than doing it here. + * This is because a trigger on that partition might again change the row. + * So skip the WCO checks if the partition constraint fails. + */ + partition_constraint_failed = + resultRelationDesc->rd_rel->relispartition && + !ExecPartitionCheck(resultRelInfo, slot, estate, false); + + /* Check any RLS UPDATE WITH CHECK policies */ + if (!partition_constraint_failed && + resultRelInfo->ri_WithCheckOptions != NIL) + { + /* + * ExecWithCheckOptions() will skip any WCOs which are not of the kind + * we are looking for at this point. + */ + ExecWithCheckOptions(WCO_RLS_UPDATE_CHECK, + resultRelInfo, slot, estate); + } + + /* + * If a partition check failed, try to move the row into the right + * partition. + */ + if (partition_constraint_failed) + { + /* + * ExecCrossPartitionUpdate will first DELETE the row from the + * partition it's currently in and then insert it back into the root + * table, which will re-route it to the correct partition. However, + * if the tuple has been concurrently updated, a retry is needed. + */ + if (ExecCrossPartitionUpdate(context, resultRelInfo, + tupleid, oldtuple, slot, + canSetTag, updateCxt)) + { + /* success! */ + updateCxt->updated = true; + updateCxt->crossPartUpdate = true; + return TM_Ok; + } + + /* + * ExecCrossPartitionUpdate installed an updated version of the new + * tuple in the retry slot; start over. + */ + slot = context->cpUpdateRetrySlot; + goto lreplace; + } + + /* + * Check the constraints of the tuple. We've already checked the + * partition constraint above; however, we must still ensure the tuple + * passes all other constraints, so we will call ExecConstraints() and + * have it validate all remaining checks. + */ + if (resultRelationDesc->rd_att->constr) + ExecConstraints(resultRelInfo, slot, estate); + + /* + * replace the heap tuple + * + * Note: if es_crosscheck_snapshot isn't InvalidSnapshot, we check that + * the row to be updated is visible to that snapshot, and throw a + * can't-serialize error if not. This is a special-case behavior needed + * for referential integrity updates in transaction-snapshot mode + * transactions. + */ + result = table_tuple_update(resultRelationDesc, tupleid, slot, + estate->es_output_cid, + estate->es_snapshot, + estate->es_crosscheck_snapshot, + true /* wait for commit */ , + &context->tmfd, &context->lockmode, + &updateCxt->updateIndexes); + if (result == TM_Ok) + updateCxt->updated = true; + + return result; +} + +/* + * ExecUpdateEpilogue -- subroutine for ExecUpdate + * + * Closing steps of updating a tuple. Must be called if ExecUpdateAct + * returns indicating that the tuple was updated. + */ +static void +ExecUpdateEpilogue(ModifyTableContext *context, UpdateContext *updateCxt, + ResultRelInfo *resultRelInfo, ItemPointer tupleid, + HeapTuple oldtuple, TupleTableSlot *slot, + List *recheckIndexes) +{ + ModifyTableState *mtstate = context->mtstate; + + /* insert index entries for tuple if necessary */ + if (resultRelInfo->ri_NumIndices > 0 && updateCxt->updateIndexes) + recheckIndexes = ExecInsertIndexTuples(resultRelInfo, + slot, context->estate, + true, false, + NULL, NIL); + + /* AFTER ROW UPDATE Triggers */ + ExecARUpdateTriggers(context->estate, resultRelInfo, + tupleid, oldtuple, slot, + recheckIndexes, + mtstate->operation == CMD_INSERT ? + mtstate->mt_oc_transition_capture : + mtstate->mt_transition_capture); + + /* + * Check any WITH CHECK OPTION constraints from parent views. We are + * required to do this after testing all constraints and uniqueness + * violations per the SQL spec, so we do it after actually updating the + * record in the heap and all indexes. + * + * ExecWithCheckOptions() will skip any WCOs which are not of the kind we + * are looking for at this point. + */ + if (resultRelInfo->ri_WithCheckOptions != NIL) + ExecWithCheckOptions(WCO_VIEW_CHECK, resultRelInfo, + slot, context->estate); +} + + /* ---------------------------------------------------------------- * ExecUpdate * @@ -1598,20 +1920,15 @@ ExecCrossPartitionUpdate(ModifyTableState *mtstate, * ---------------------------------------------------------------- */ static TupleTableSlot * -ExecUpdate(ModifyTableState *mtstate, - ResultRelInfo *resultRelInfo, - ItemPointer tupleid, - HeapTuple oldtuple, - TupleTableSlot *slot, - TupleTableSlot *planSlot, - EPQState *epqstate, - EState *estate, +ExecUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, + ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot *slot, bool canSetTag) { + EState *estate = context->estate; Relation resultRelationDesc = resultRelInfo->ri_RelationDesc; - TM_Result result; - TM_FailureData tmfd; + UpdateContext updateCxt = {0}; List *recheckIndexes = NIL; + TM_Result result; /* * abort the operation if not running transactions @@ -1619,24 +1936,12 @@ ExecUpdate(ModifyTableState *mtstate, if (IsBootstrapProcessingMode()) elog(ERROR, "cannot UPDATE during bootstrap"); - ExecMaterializeSlot(slot); - /* - * Open the table's indexes, if we have not done so already, so that we - * can add new index entries for the updated tuple. + * Prepare for the update. This includes BEFORE ROW triggers, so we're + * done if it says we are. */ - if (resultRelationDesc->rd_rel->relhasindex && - resultRelInfo->ri_IndexRelationDescs == NULL) - ExecOpenIndices(resultRelInfo, false); - - /* BEFORE ROW UPDATE Triggers */ - if (resultRelInfo->ri_TrigDesc && - resultRelInfo->ri_TrigDesc->trig_update_before_row) - { - if (!ExecBRUpdateTriggers(estate, epqstate, resultRelInfo, - tupleid, oldtuple, slot)) - return NULL; /* "do nothing" */ - } + if (!ExecUpdatePrologue(context, resultRelInfo, tupleid, oldtuple, slot)) + return NULL; /* INSTEAD OF ROW UPDATE Triggers */ if (resultRelInfo->ri_TrigDesc && @@ -1648,19 +1953,7 @@ ExecUpdate(ModifyTableState *mtstate, } else if (resultRelInfo->ri_FdwRoutine) { - /* - * GENERATED expressions might reference the tableoid column, so - * (re-)initialize tts_tableOid before evaluating them. - */ - slot->tts_tableOid = RelationGetRelid(resultRelInfo->ri_RelationDesc); - - /* - * Compute stored generated columns - */ - if (resultRelationDesc->rd_att->constr && - resultRelationDesc->rd_att->constr->has_generated_stored) - ExecComputeStoredGenerated(resultRelInfo, estate, slot, - CMD_UPDATE); + ExecUpdatePrepareSlot(resultRelInfo, slot, estate); /* * update in foreign table: let the FDW do it @@ -1668,7 +1961,7 @@ ExecUpdate(ModifyTableState *mtstate, slot = resultRelInfo->ri_FdwRoutine->ExecForeignUpdate(estate, resultRelInfo, slot, - planSlot); + context->planSlot); if (slot == NULL) /* "do nothing" */ return NULL; @@ -1682,114 +1975,20 @@ ExecUpdate(ModifyTableState *mtstate, } else { - LockTupleMode lockmode; - bool partition_constraint_failed; - bool update_indexes; - - /* - * Constraints and GENERATED expressions might reference the tableoid - * column, so (re-)initialize tts_tableOid before evaluating them. - */ - slot->tts_tableOid = RelationGetRelid(resultRelationDesc); - - /* - * Compute stored generated columns - */ - if (resultRelationDesc->rd_att->constr && - resultRelationDesc->rd_att->constr->has_generated_stored) - ExecComputeStoredGenerated(resultRelInfo, estate, slot, - CMD_UPDATE); - - /* - * Check any RLS UPDATE WITH CHECK policies - * - * If we generate a new candidate tuple after EvalPlanQual testing, we - * must loop back here and recheck any RLS policies and constraints. - * (We don't need to redo triggers, however. If there are any BEFORE - * triggers then trigger.c will have done table_tuple_lock to lock the - * correct tuple, so there's no need to do them again.) - */ -lreplace:; - - /* ensure slot is independent, consider e.g. EPQ */ - ExecMaterializeSlot(slot); - - /* - * If partition constraint fails, this row might get moved to another - * partition, in which case we should check the RLS CHECK policy just - * before inserting into the new partition, rather than doing it here. - * This is because a trigger on that partition might again change the - * row. So skip the WCO checks if the partition constraint fails. - */ - partition_constraint_failed = - resultRelationDesc->rd_rel->relispartition && - !ExecPartitionCheck(resultRelInfo, slot, estate, false); - - if (!partition_constraint_failed && - resultRelInfo->ri_WithCheckOptions != NIL) - { - /* - * ExecWithCheckOptions() will skip any WCOs which are not of the - * kind we are looking for at this point. - */ - ExecWithCheckOptions(WCO_RLS_UPDATE_CHECK, - resultRelInfo, slot, estate); - } - - /* - * If a partition check failed, try to move the row into the right - * partition. - */ - if (partition_constraint_failed) - { - TupleTableSlot *inserted_tuple, - *retry_slot; - bool retry; + /* Fill in the slot appropriately */ + ExecUpdatePrepareSlot(resultRelInfo, slot, estate); - /* - * ExecCrossPartitionUpdate will first DELETE the row from the - * partition it's currently in and then insert it back into the - * root table, which will re-route it to the correct partition. - * The first part may have to be repeated if it is detected that - * the tuple we're trying to move has been concurrently updated. - */ - retry = !ExecCrossPartitionUpdate(mtstate, resultRelInfo, tupleid, - oldtuple, slot, planSlot, - epqstate, canSetTag, - &retry_slot, &inserted_tuple); - if (retry) - { - slot = retry_slot; - goto lreplace; - } - - return inserted_tuple; - } +redo_act: + result = ExecUpdateAct(context, resultRelInfo, tupleid, oldtuple, slot, + canSetTag, &updateCxt); /* - * Check the constraints of the tuple. We've already checked the - * partition constraint above; however, we must still ensure the tuple - * passes all other constraints, so we will call ExecConstraints() and - * have it validate all remaining checks. + * If ExecUpdateAct reports that a cross-partition update was done, + * then the returning tuple has been projected and there's nothing + * else for us to do. */ - if (resultRelationDesc->rd_att->constr) - ExecConstraints(resultRelInfo, slot, estate); - - /* - * replace the heap tuple - * - * Note: if es_crosscheck_snapshot isn't InvalidSnapshot, we check - * that the row to be updated is visible to that snapshot, and throw a - * can't-serialize error if not. This is a special-case behavior - * needed for referential integrity updates in transaction-snapshot - * mode transactions. - */ - result = table_tuple_update(resultRelationDesc, tupleid, slot, - estate->es_output_cid, - estate->es_snapshot, - estate->es_crosscheck_snapshot, - true /* wait for commit */ , - &tmfd, &lockmode, &update_indexes); + if (updateCxt.crossPartUpdate) + return context->cpUpdateReturningSlot; switch (result) { @@ -1818,7 +2017,7 @@ lreplace:; * can re-execute the UPDATE (assuming it can figure out how) * and then return NULL to cancel the outer update. */ - if (tmfd.cmax != estate->es_output_cid) + if (context->tmfd.cmax != estate->es_output_cid) ereport(ERROR, (errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION), errmsg("tuple to be updated was already modified by an operation triggered by the current command"), @@ -1845,22 +2044,22 @@ lreplace:; * Already know that we're going to need to do EPQ, so * fetch tuple directly into the right slot. */ - inputslot = EvalPlanQualSlot(epqstate, resultRelationDesc, + inputslot = EvalPlanQualSlot(context->epqstate, resultRelationDesc, resultRelInfo->ri_RangeTableIndex); result = table_tuple_lock(resultRelationDesc, tupleid, estate->es_snapshot, inputslot, estate->es_output_cid, - lockmode, LockWaitBlock, + context->lockmode, LockWaitBlock, TUPLE_LOCK_FLAG_FIND_LAST_VERSION, - &tmfd); + &context->tmfd); switch (result) { case TM_Ok: - Assert(tmfd.traversed); + Assert(context->tmfd.traversed); - epqslot = EvalPlanQual(epqstate, + epqslot = EvalPlanQual(context->epqstate, resultRelationDesc, resultRelInfo->ri_RangeTableIndex, inputslot); @@ -1870,7 +2069,8 @@ lreplace:; /* Make sure ri_oldTupleSlot is initialized. */ if (unlikely(!resultRelInfo->ri_projectNewInfoValid)) - ExecInitUpdateProjection(mtstate, resultRelInfo); + ExecInitUpdateProjection(context->mtstate, + resultRelInfo); /* Fetch the most recent version of old tuple. */ oldSlot = resultRelInfo->ri_oldTupleSlot; @@ -1881,7 +2081,7 @@ lreplace:; elog(ERROR, "failed to fetch tuple being updated"); slot = ExecGetUpdateNewTuple(resultRelInfo, epqslot, oldSlot); - goto lreplace; + goto redo_act; case TM_Deleted: /* tuple already deleted; nothing to do */ @@ -1900,7 +2100,7 @@ lreplace:; * See also TM_SelfModified response to * table_tuple_update() above. */ - if (tmfd.cmax != estate->es_output_cid) + if (context->tmfd.cmax != estate->es_output_cid) ereport(ERROR, (errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION), errmsg("tuple to be updated was already modified by an operation triggered by the current command"), @@ -1930,41 +2130,19 @@ lreplace:; result); return NULL; } - - /* insert index entries for tuple if necessary */ - if (resultRelInfo->ri_NumIndices > 0 && update_indexes) - recheckIndexes = ExecInsertIndexTuples(resultRelInfo, - slot, estate, true, false, - NULL, NIL); } if (canSetTag) (estate->es_processed)++; - /* AFTER ROW UPDATE Triggers */ - ExecARUpdateTriggers(estate, resultRelInfo, tupleid, oldtuple, slot, - recheckIndexes, - mtstate->operation == CMD_INSERT ? - mtstate->mt_oc_transition_capture : - mtstate->mt_transition_capture); + ExecUpdateEpilogue(context, &updateCxt, resultRelInfo, tupleid, oldtuple, + slot, recheckIndexes); list_free(recheckIndexes); - /* - * Check any WITH CHECK OPTION constraints from parent views. We are - * required to do this after testing all constraints and uniqueness - * violations per the SQL spec, so we do it after actually updating the - * record in the heap and all indexes. - * - * ExecWithCheckOptions() will skip any WCOs which are not of the kind we - * are looking for at this point. - */ - if (resultRelInfo->ri_WithCheckOptions != NIL) - ExecWithCheckOptions(WCO_VIEW_CHECK, resultRelInfo, slot, estate); - /* Process RETURNING if present */ if (resultRelInfo->ri_projectReturning) - return ExecProcessReturning(resultRelInfo, slot, planSlot); + return ExecProcessReturning(resultRelInfo, slot, context->planSlot); return NULL; } @@ -1981,15 +2159,14 @@ lreplace:; * the caller must retry the INSERT from scratch. */ static bool -ExecOnConflictUpdate(ModifyTableState *mtstate, +ExecOnConflictUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer conflictTid, - TupleTableSlot *planSlot, TupleTableSlot *excludedSlot, - EState *estate, bool canSetTag, TupleTableSlot **returning) { + ModifyTableState *mtstate = context->mtstate; ExprContext *econtext = mtstate->ps.ps_ExprContext; Relation relation = resultRelInfo->ri_RelationDesc; ExprState *onConflictSetWhere = resultRelInfo->ri_onConflict->oc_WhereClause; @@ -2002,7 +2179,7 @@ ExecOnConflictUpdate(ModifyTableState *mtstate, bool isnull; /* Determine lock mode to use */ - lockmode = ExecUpdateLockMode(estate, resultRelInfo); + lockmode = ExecUpdateLockMode(context->estate, resultRelInfo); /* * Lock tuple for update. Don't follow updates when tuple cannot be @@ -2011,8 +2188,8 @@ ExecOnConflictUpdate(ModifyTableState *mtstate, * true anymore. */ test = table_tuple_lock(relation, conflictTid, - estate->es_snapshot, - existing, estate->es_output_cid, + context->estate->es_snapshot, + existing, context->estate->es_output_cid, lockmode, LockWaitBlock, 0, &tmfd); switch (test) @@ -2119,7 +2296,7 @@ ExecOnConflictUpdate(ModifyTableState *mtstate, * snapshot. This is in line with the way UPDATE deals with newer tuple * versions. */ - ExecCheckTupleVisible(estate, relation, existing); + ExecCheckTupleVisible(context->estate, relation, existing); /* * Make tuple and any needed join variables available to ExecQual and @@ -2174,10 +2351,9 @@ ExecOnConflictUpdate(ModifyTableState *mtstate, */ /* Execute UPDATE with projection */ - *returning = ExecUpdate(mtstate, resultRelInfo, conflictTid, NULL, + *returning = ExecUpdate(context, resultRelInfo, + conflictTid, NULL, resultRelInfo->ri_onConflict->oc_ProjSlot, - planSlot, - &mtstate->mt_epqstate, mtstate->ps.state, canSetTag); /* @@ -2349,6 +2525,7 @@ static TupleTableSlot * ExecModifyTable(PlanState *pstate) { ModifyTableState *node = castNode(ModifyTableState, pstate); + ModifyTableContext context; EState *estate = node->ps.state; CmdType operation = node->operation; ResultRelInfo *resultRelInfo; @@ -2356,10 +2533,10 @@ ExecModifyTable(PlanState *pstate) TupleTableSlot *slot; TupleTableSlot *planSlot; TupleTableSlot *oldSlot; - ItemPointer tupleid; ItemPointerData tuple_ctid; HeapTupleData oldtupdata; HeapTuple oldtuple; + ItemPointer tupleid; PartitionTupleRouting *proute = node->mt_partition_tuple_routing; List *relinfos = NIL; ListCell *lc; @@ -2400,6 +2577,11 @@ ExecModifyTable(PlanState *pstate) resultRelInfo = node->resultRelInfo + node->mt_lastResultIndex; subplanstate = outerPlanState(node); + /* Set global context */ + context.mtstate = node; + context.epqstate = &node->mt_epqstate; + context.estate = estate; + /* * Fetch rows from subplan, and execute the required table modification * for each row. @@ -2551,6 +2733,10 @@ ExecModifyTable(PlanState *pstate) } } + /* complete context setup */ + context.planSlot = planSlot; + context.lockmode = 0; + switch (operation) { case CMD_INSERT: @@ -2558,9 +2744,10 @@ ExecModifyTable(PlanState *pstate) if (unlikely(!resultRelInfo->ri_projectNewInfoValid)) ExecInitInsertProjection(node, resultRelInfo); slot = ExecGetInsertNewTuple(resultRelInfo, planSlot); - slot = ExecInsert(node, resultRelInfo, slot, planSlot, - estate, node->canSetTag); + slot = ExecInsert(&context, resultRelInfo, slot, + node->canSetTag); break; + case CMD_UPDATE: /* Initialize projection info if first time for this table */ if (unlikely(!resultRelInfo->ri_projectNewInfoValid)) @@ -2581,7 +2768,6 @@ ExecModifyTable(PlanState *pstate) /* Fetch the most recent version of old tuple. */ Relation relation = resultRelInfo->ri_RelationDesc; - Assert(tupleid != NULL); if (!table_tuple_fetch_row_version(relation, tupleid, SnapshotAny, oldSlot)) @@ -2591,18 +2777,15 @@ ExecModifyTable(PlanState *pstate) oldSlot); /* Now apply the update. */ - slot = ExecUpdate(node, resultRelInfo, tupleid, oldtuple, slot, - planSlot, &node->mt_epqstate, estate, - node->canSetTag); + slot = ExecUpdate(&context, resultRelInfo, tupleid, oldtuple, + slot, node->canSetTag); break; + case CMD_DELETE: - slot = ExecDelete(node, resultRelInfo, tupleid, oldtuple, - planSlot, &node->mt_epqstate, estate, - true, /* processReturning */ - node->canSetTag, - false, /* changingPart */ - NULL, NULL); + slot = ExecDelete(&context, resultRelInfo, tupleid, oldtuple, + true, false, node->canSetTag, NULL, NULL); break; + default: elog(ERROR, "unknown operation"); break; @@ -2800,8 +2983,8 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) } /* Initialize the usesFdwDirectModify flag */ - resultRelInfo->ri_usesFdwDirectModify = bms_is_member(i, - node->fdwDirectModifyPlans); + resultRelInfo->ri_usesFdwDirectModify = + bms_is_member(i, node->fdwDirectModifyPlans); /* * Verify result relation is a valid target for the current operation diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index eaf3e7a8d4..6ffd4474bc 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1460,6 +1460,7 @@ MinimalTupleTableSlot MinmaxMultiOpaque MinmaxOpaque ModifyTable +ModifyTableContext ModifyTablePath ModifyTableState MorphOpaque @@ -2793,6 +2794,7 @@ UnlistenStmt UnpackTarState UnresolvedTup UnresolvedTupData +UpdateContext UpdateStmt UpperRelationKind UpperUniquePath From a9b7e92084cdea1bd397ec26c3233206932f29c7 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 17 Mar 2022 14:12:03 +0100 Subject: [PATCH 157/772] doc: Add documentation for new field pg_database.daticulocale forgotten in f2553d43060edb210b36c63187d52a632448e1d2 Author: Shinoda, Noriyoshi (PN Japan FSIP) --- doc/src/sgml/catalogs.sgml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index bcf2b43206..4dc5b34d21 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -3052,6 +3052,15 @@ SCRAM-SHA-256$<iteration count>:&l + + + daticulocale text + + + ICU locale ID for this database + + + datcollversion text From 5a079662256e381fde699c4fbbed6c2504a6d30a Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Thu, 17 Mar 2022 17:03:45 +0100 Subject: [PATCH 158/772] Fix row filters with multiple publications When publishing changes through a artition root, we should use the row filter for the top-most ancestor. The relation may be added to multiple publications, using different ancestors, and 52e4f0cd47 handled this incorrectly. With c91f71b9dc we find the correct top-most ancestor, but the code tried to fetch the row filter from all publications, including those using a different ancestor etc. No row filter can be found for such publications, which was treated as replicating all rows. Similarly to c91f71b9dc, this seems to be a rare issue in practice. It requires multiple publications including the same partitioned relation, through different ancestors. Fixed by only passing publications containing the top-most ancestor to pgoutput_row_filter_init(), so that treating a missing row filter as replicating all rows is correct. Report and fix by me, test case by Hou zj. Reviews and improvements by Amit Kapila. Author: Tomas Vondra, Hou zj, Amit Kapila Reviewed-by: Amit Kapila, Hou zj Discussion: https://postgr.es/m/d26d24dd-2fab-3c48-0162-2b7f84a9c893%40enterprisedb.com --- src/backend/replication/pgoutput/pgoutput.c | 26 +++++++++--- src/test/subscription/t/028_row_filter.pl | 47 ++++++++++++++++++++- 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index d869f3e93e..5fddab3a3d 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -1890,8 +1890,6 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) entry->pubactions.pubdelete |= pub->pubactions.pubdelete; entry->pubactions.pubtruncate |= pub->pubactions.pubtruncate; - rel_publications = lappend(rel_publications, pub); - /* * We want to publish the changes as the top-most ancestor * across all publications. So we need to check if the @@ -1902,9 +1900,27 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) if (publish_ancestor_level > ancestor_level) continue; - /* The new value is an ancestor, so let's keep it. */ - publish_as_relid = pub_relid; - publish_ancestor_level = ancestor_level; + /* + * If we found an ancestor higher up in the tree, discard + * the list of publications through which we replicate it, + * and use the new ancestor. + */ + if (publish_ancestor_level < ancestor_level) + { + publish_as_relid = pub_relid; + publish_ancestor_level = ancestor_level; + + /* reset the publication list for this relation */ + rel_publications = NIL; + } + else + { + /* Same ancestor level, has to be the same OID. */ + Assert(publish_as_relid == pub_relid); + } + + /* Track publications for this ancestor. */ + rel_publications = lappend(rel_publications, pub); } } diff --git a/src/test/subscription/t/028_row_filter.pl b/src/test/subscription/t/028_row_filter.pl index 89bb364e9d..82c4eb6ef6 100644 --- a/src/test/subscription/t/028_row_filter.pl +++ b/src/test/subscription/t/028_row_filter.pl @@ -237,6 +237,11 @@ $node_publisher->safe_psql('postgres', "CREATE TABLE tab_rowfilter_child (b text) INHERITS (tab_rowfilter_inherited)" ); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_viaroot_part (a int) PARTITION BY RANGE (a)"); +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_viaroot_part_1 PARTITION OF tab_rowfilter_viaroot_part FOR VALUES FROM (1) TO (20)" +); # setup structure on subscriber $node_subscriber->safe_psql('postgres', @@ -283,6 +288,11 @@ $node_subscriber->safe_psql('postgres', "CREATE TABLE tab_rowfilter_child (b text) INHERITS (tab_rowfilter_inherited)" ); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_viaroot_part (a int)"); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_rowfilter_viaroot_part_1 (a int)" +); # setup logical replication $node_publisher->safe_psql('postgres', @@ -330,6 +340,15 @@ "CREATE PUBLICATION tap_pub_inherits FOR TABLE tab_rowfilter_inherited WHERE (a > 15)" ); +# two publications, each publishing the partition through a different ancestor, with +# different row filters +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_viaroot_1 FOR TABLE tab_rowfilter_viaroot_part WHERE (a > 15) WITH (publish_via_partition_root)" +); +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_viaroot_2 FOR TABLE tab_rowfilter_viaroot_part_1 WHERE (a < 15) WITH (publish_via_partition_root)" +); + # # The following INSERTs are executed before the CREATE SUBSCRIPTION, so these # SQL commands are for testing the initial data copy using logical replication. @@ -376,7 +395,7 @@ ); $node_subscriber->safe_psql('postgres', - "CREATE SUBSCRIPTION tap_sub CONNECTION '$publisher_connstr application_name=$appname' PUBLICATION tap_pub_1, tap_pub_2, tap_pub_3, tap_pub_4a, tap_pub_4b, tap_pub_5a, tap_pub_5b, tap_pub_toast, tap_pub_inherits" + "CREATE SUBSCRIPTION tap_sub CONNECTION '$publisher_connstr application_name=$appname' PUBLICATION tap_pub_1, tap_pub_2, tap_pub_3, tap_pub_4a, tap_pub_4b, tap_pub_5a, tap_pub_5b, tap_pub_toast, tap_pub_inherits, tap_pub_viaroot_2, tap_pub_viaroot_1" ); $node_publisher->wait_for_catchup($appname); @@ -534,6 +553,8 @@ "INSERT INTO tab_rowfilter_inherited (a) VALUES (14), (16)"); $node_publisher->safe_psql('postgres', "INSERT INTO tab_rowfilter_child (a, b) VALUES (13, '13'), (17, '17')"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_rowfilter_viaroot_part (a) VALUES (14), (15), (16)"); $node_publisher->wait_for_catchup($appname); @@ -688,6 +709,30 @@ "SELECT a = repeat('1234567890', 200), b FROM tab_rowfilter_toast"); is($result, qq(t|1), 'check replicated rows to tab_rowfilter_toast'); +# Check expected replicated rows for tab_rowfilter_viaroot_part and +# tab_rowfilter_viaroot_part_1. We should replicate only rows matching +# the row filter for the top-level ancestor: +# +# tab_rowfilter_viaroot_part filter is: (a > 15) +# - INSERT (14) NO, 14 < 15 +# - INSERT (15) NO, 15 = 15 +# - INSERT (16) YES, 16 > 15 +$result = + $node_subscriber->safe_psql('postgres', + "SELECT a FROM tab_rowfilter_viaroot_part"); +is( $result, qq(16), + 'check replicated rows to tab_rowfilter_viaroot_part' +); + +# Check there is no data in tab_rowfilter_viaroot_part_1 because rows are +# replicated via the top most parent table tab_rowfilter_viaroot_part +$result = + $node_subscriber->safe_psql('postgres', + "SELECT a FROM tab_rowfilter_viaroot_part_1"); +is( $result, qq(), + 'check replicated rows to tab_rowfilter_viaroot_part_1' +); + # Testcase end: FOR TABLE with row filter publications # ====================================================== From 39f0c4bd670c3482f4def87a31108c175da0a8d3 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Thu, 17 Mar 2022 13:21:07 -0400 Subject: [PATCH 159/772] Refactor code for reading and writing relation map files. Restructure things so that the functions which update the global variables shared_map and local_map are separate from the functions which just read and write relation map files without touching any global variables. In the new structure of things, write_relmap_file() writes a relmap file but no longer performs global variable updates. A symmetric function read_relmap_file() that just reads a file without changing any global variables is added, and load_relmap_file(), which does change the global variables, uses it as a subroutine. Because write_relmap_file() no longer updates shared_map and local_map, that logic is moved to perform_relmap_update(). However, no similar logic is added to relmap_redo() even though it also calls write_relmap_file(). That's because recovery must not rely on the contents of the relation map, and therefore there is no need to initialize it. In fact, doing so seems like a mistake, because we might then manage to rely on the in-memory map where we shouldn't. Patch by me, based on earlier work by Dilip Kumar. Reviewed by Ashutosh Sharma. Discussion: http://postgr.es/m/CA+TgmobQLgrt4AXsc0ru7aFFkzv=9fS-Q_yO69=k9WY67RCctg@mail.gmail.com --- src/backend/utils/cache/relmapper.c | 121 ++++++++++++++-------------- 1 file changed, 60 insertions(+), 61 deletions(-) diff --git a/src/backend/utils/cache/relmapper.c b/src/backend/utils/cache/relmapper.c index 4f6811f571..4d0718f001 100644 --- a/src/backend/utils/cache/relmapper.c +++ b/src/backend/utils/cache/relmapper.c @@ -137,8 +137,10 @@ static void apply_map_update(RelMapFile *map, Oid relationId, Oid fileNode, static void merge_map_updates(RelMapFile *map, const RelMapFile *updates, bool add_okay); static void load_relmap_file(bool shared, bool lock_held); -static void write_relmap_file(bool shared, RelMapFile *newmap, - bool write_wal, bool send_sinval, bool preserve_files, +static void read_relmap_file(RelMapFile *map, char *dbpath, bool lock_held, + int elevel); +static void write_relmap_file(RelMapFile *newmap, bool write_wal, + bool send_sinval, bool preserve_files, Oid dbid, Oid tsid, const char *dbpath); static void perform_relmap_update(bool shared, const RelMapFile *updates); @@ -568,9 +570,9 @@ RelationMapFinishBootstrap(void) Assert(pending_local_updates.num_mappings == 0); /* Write the files; no WAL or sinval needed */ - write_relmap_file(true, &shared_map, false, false, false, - InvalidOid, GLOBALTABLESPACE_OID, NULL); - write_relmap_file(false, &local_map, false, false, false, + write_relmap_file(&shared_map, false, false, false, + InvalidOid, GLOBALTABLESPACE_OID, "global"); + write_relmap_file(&local_map, false, false, false, MyDatabaseId, MyDatabaseTableSpace, DatabasePath); } @@ -687,39 +689,48 @@ RestoreRelationMap(char *startAddress) } /* - * load_relmap_file -- load data from the shared or local map file + * load_relmap_file -- load the shared or local map file * - * Because the map file is essential for access to core system catalogs, - * failure to read it is a fatal error. + * Because these files are essential for access to core system catalogs, + * failure to load either of them is a fatal error. * * Note that the local case requires DatabasePath to be set up. */ static void load_relmap_file(bool shared, bool lock_held) { - RelMapFile *map; + if (shared) + read_relmap_file(&shared_map, "global", lock_held, FATAL); + else + read_relmap_file(&local_map, DatabasePath, lock_held, FATAL); +} + +/* + * read_relmap_file -- load data from any relation mapper file + * + * dbpath must be the relevant database path, or "global" for shared relations. + * + * RelationMappingLock will be acquired released unless lock_held = true. + * + * Errors will be reported at the indicated elevel, which should be at least + * ERROR. + */ +static void +read_relmap_file(RelMapFile *map, char *dbpath, bool lock_held, int elevel) +{ char mapfilename[MAXPGPATH]; pg_crc32c crc; int fd; int r; - if (shared) - { - snprintf(mapfilename, sizeof(mapfilename), "global/%s", - RELMAPPER_FILENAME); - map = &shared_map; - } - else - { - snprintf(mapfilename, sizeof(mapfilename), "%s/%s", - DatabasePath, RELMAPPER_FILENAME); - map = &local_map; - } + Assert(elevel >= ERROR); - /* Read data ... */ + /* Open the target file. */ + snprintf(mapfilename, sizeof(mapfilename), "%s/%s", dbpath, + RELMAPPER_FILENAME); fd = OpenTransientFile(mapfilename, O_RDONLY | PG_BINARY); if (fd < 0) - ereport(FATAL, + ereport(elevel, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", mapfilename))); @@ -734,16 +745,17 @@ load_relmap_file(bool shared, bool lock_held) if (!lock_held) LWLockAcquire(RelationMappingLock, LW_SHARED); + /* Now read the data. */ pgstat_report_wait_start(WAIT_EVENT_RELATION_MAP_READ); r = read(fd, map, sizeof(RelMapFile)); if (r != sizeof(RelMapFile)) { if (r < 0) - ereport(FATAL, + ereport(elevel, (errcode_for_file_access(), errmsg("could not read file \"%s\": %m", mapfilename))); else - ereport(FATAL, + ereport(elevel, (errcode(ERRCODE_DATA_CORRUPTED), errmsg("could not read file \"%s\": read %d of %zu", mapfilename, r, sizeof(RelMapFile)))); @@ -754,7 +766,7 @@ load_relmap_file(bool shared, bool lock_held) LWLockRelease(RelationMappingLock); if (CloseTransientFile(fd) != 0) - ereport(FATAL, + ereport(elevel, (errcode_for_file_access(), errmsg("could not close file \"%s\": %m", mapfilename))); @@ -763,7 +775,7 @@ load_relmap_file(bool shared, bool lock_held) if (map->magic != RELMAPPER_FILEMAGIC || map->num_mappings < 0 || map->num_mappings > MAX_MAPPINGS) - ereport(FATAL, + ereport(elevel, (errmsg("relation mapping file \"%s\" contains invalid data", mapfilename))); @@ -773,7 +785,7 @@ load_relmap_file(bool shared, bool lock_held) FIN_CRC32C(crc); if (!EQ_CRC32C(crc, map->crc)) - ereport(FATAL, + ereport(elevel, (errmsg("relation mapping file \"%s\" contains incorrect checksum", mapfilename))); } @@ -795,16 +807,16 @@ load_relmap_file(bool shared, bool lock_held) * * Because this may be called during WAL replay when MyDatabaseId, * DatabasePath, etc aren't valid, we require the caller to pass in suitable - * values. The caller is also responsible for being sure no concurrent - * map update could be happening. + * values. Pass dbpath as "global" for the shared map. + * + * The caller is also responsible for being sure no concurrent map update + * could be happening. */ static void -write_relmap_file(bool shared, RelMapFile *newmap, - bool write_wal, bool send_sinval, bool preserve_files, - Oid dbid, Oid tsid, const char *dbpath) +write_relmap_file(RelMapFile *newmap, bool write_wal, bool send_sinval, + bool preserve_files, Oid dbid, Oid tsid, const char *dbpath) { int fd; - RelMapFile *realmap; char mapfilename[MAXPGPATH]; /* @@ -822,19 +834,8 @@ write_relmap_file(bool shared, RelMapFile *newmap, * Open the target file. We prefer to do this before entering the * critical section, so that an open() failure need not force PANIC. */ - if (shared) - { - snprintf(mapfilename, sizeof(mapfilename), "global/%s", - RELMAPPER_FILENAME); - realmap = &shared_map; - } - else - { - snprintf(mapfilename, sizeof(mapfilename), "%s/%s", - dbpath, RELMAPPER_FILENAME); - realmap = &local_map; - } - + snprintf(mapfilename, sizeof(mapfilename), "%s/%s", + dbpath, RELMAPPER_FILENAME); fd = OpenTransientFile(mapfilename, O_WRONLY | O_CREAT | PG_BINARY); if (fd < 0) ereport(ERROR, @@ -934,16 +935,6 @@ write_relmap_file(bool shared, RelMapFile *newmap, } } - /* - * Success, update permanent copy. During bootstrap, we might be working - * on the permanent copy itself, in which case skip the memcpy() to avoid - * invoking nominally-undefined behavior. - */ - if (realmap != newmap) - memcpy(realmap, newmap, sizeof(RelMapFile)); - else - Assert(!send_sinval); /* must be bootstrapping */ - /* Critical section done */ if (write_wal) END_CRIT_SECTION(); @@ -990,10 +981,19 @@ perform_relmap_update(bool shared, const RelMapFile *updates) merge_map_updates(&newmap, updates, allowSystemTableMods); /* Write out the updated map and do other necessary tasks */ - write_relmap_file(shared, &newmap, true, true, true, + write_relmap_file(&newmap, true, true, true, (shared ? InvalidOid : MyDatabaseId), (shared ? GLOBALTABLESPACE_OID : MyDatabaseTableSpace), - DatabasePath); + (shared ? "global" : DatabasePath)); + + /* + * We succesfully wrote the updated file, so it's now safe to rely on the + * new values in this process, too. + */ + if (shared) + memcpy(&shared_map, &newmap, sizeof(RelMapFile)); + else + memcpy(&local_map, &newmap, sizeof(RelMapFile)); /* Now we can release the lock */ LWLockRelease(RelationMappingLock); @@ -1033,8 +1033,7 @@ relmap_redo(XLogReaderState *record) * but grab the lock to interlock against load_relmap_file(). */ LWLockAcquire(RelationMappingLock, LW_EXCLUSIVE); - write_relmap_file((xlrec->dbid == InvalidOid), &newmap, - false, true, false, + write_relmap_file(&newmap, false, true, false, xlrec->dbid, xlrec->tsid, dbpath); LWLockRelease(RelationMappingLock); From ec62cb0aac5ba31a82339606009ddbd7eb00e2ac Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 17 Mar 2022 18:18:05 -0400 Subject: [PATCH 160/772] Revert applying column aliases to the output of whole-row Vars. In commit bf7ca1587, I had the bright idea that we could make the result of a whole-row Var (that is, foo.*) track any column aliases that had been applied to the FROM entry the Var refers to. However, that's not terribly logically consistent, because now the output of the Var is no longer of the named composite type that the Var claims to emit. bf7ca1587 tried to handle that by changing the output tuple values to be labeled with a blessed RECORD type, but that's really pretty disastrous: we can wind up storing such tuples onto disk, whereupon they're not readable by other sessions. The only practical fix I can see is to give up on what bf7ca1587 tried to do, and say that the column names of tuples produced by a whole-row Var are always those of the underlying named composite type, query aliases or no. While this introduces some inconsistencies, it removes others, so it's not that awful in the abstract. What *is* kind of awful is to make such a behavioral change in a back-patched bug fix. But corrupt data is worse, so back-patched it will be. (A workaround available to anyone who's unhappy about this is to introduce an extra level of sub-SELECT, so that the whole-row Var is referring to the sub-SELECT's output and not to a named table type. Then the Var is of type RECORD to begin with and there's no issue.) Per report from Miles Delahunty. The faulty commit dates to 9.5, so back-patch to all supported branches. Discussion: https://postgr.es/m/2950001.1638729947@sss.pgh.pa.us --- src/backend/executor/execExpr.c | 8 +-- src/backend/executor/execExprInterp.c | 72 ++++++++++++-------------- src/backend/executor/execTuples.c | 37 +++++-------- src/test/regress/expected/rowtypes.out | 23 +------- src/test/regress/sql/rowtypes.sql | 6 +-- 5 files changed, 54 insertions(+), 92 deletions(-) diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index 847357bf80..e0656bfe85 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -1913,16 +1913,16 @@ ExecInitExprRec(Expr *node, ExprState *state, { /* generic record, use types of given expressions */ tupdesc = ExecTypeFromExprList(rowexpr->args); + /* ... but adopt RowExpr's column aliases */ + ExecTypeSetColNames(tupdesc, rowexpr->colnames); + /* Bless the tupdesc so it can be looked up later */ + BlessTupleDesc(tupdesc); } else { /* it's been cast to a named type, use that */ tupdesc = lookup_rowtype_tupdesc_copy(rowexpr->row_typeid, -1); } - /* In either case, adopt RowExpr's column aliases */ - ExecTypeSetColNames(tupdesc, rowexpr->colnames); - /* Bless the tupdesc in case it's now of type RECORD */ - BlessTupleDesc(tupdesc); /* * In the named-type case, the tupdesc could have more columns diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index d6f7d7c2d7..64bd17b62e 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -4021,12 +4021,8 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext) * generates an INT4 NULL regardless of the dropped column type). * If we find a dropped column and cannot verify that case (1) * holds, we have to use the slow path to check (2) for each row. - * - * If vartype is a domain over composite, just look through that - * to the base composite type. */ - var_tupdesc = lookup_rowtype_tupdesc_domain(variable->vartype, - -1, false); + var_tupdesc = lookup_rowtype_tupdesc(variable->vartype, -1); slot_tupdesc = slot->tts_tupleDescriptor; @@ -4063,9 +4059,8 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext) /* * Use the variable's declared rowtype as the descriptor for the - * output values, modulo possibly assigning new column names - * below. In particular, we *must* absorb any attisdropped - * markings. + * output values. In particular, we *must* absorb any + * attisdropped markings. */ oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_query_memory); output_tupdesc = CreateTupleDescCopy(var_tupdesc); @@ -4083,39 +4078,38 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext) oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_query_memory); output_tupdesc = CreateTupleDescCopy(slot->tts_tupleDescriptor); MemoryContextSwitchTo(oldcontext); - } - /* - * Construct a tuple descriptor for the composite values we'll - * produce, and make sure its record type is "blessed". The main - * reason to do this is to be sure that operations such as - * row_to_json() will see the desired column names when they look up - * the descriptor from the type information embedded in the composite - * values. - * - * We already got the correct physical datatype info above, but now we - * should try to find the source RTE and adopt its column aliases, in - * case they are different from the original rowtype's names. For - * example, in "SELECT foo(t) FROM tab t(x,y)", the first two columns - * in the composite output should be named "x" and "y" regardless of - * tab's column names. - * - * If we can't locate the RTE, assume the column names we've got are - * OK. (As of this writing, the only cases where we can't locate the - * RTE are in execution of trigger WHEN clauses, and then the Var will - * have the trigger's relation's rowtype, so its names are fine.) - * Also, if the creator of the RTE didn't bother to fill in an eref - * field, assume our column names are OK. (This happens in COPY, and - * perhaps other places.) - */ - if (econtext->ecxt_estate && - variable->varno <= econtext->ecxt_estate->es_range_table_size) - { - RangeTblEntry *rte = exec_rt_fetch(variable->varno, - econtext->ecxt_estate); + /* + * It's possible that the input slot is a relation scan slot and + * so is marked with that relation's rowtype. But we're supposed + * to be returning RECORD, so reset to that. + */ + output_tupdesc->tdtypeid = RECORDOID; + output_tupdesc->tdtypmod = -1; - if (rte->eref) - ExecTypeSetColNames(output_tupdesc, rte->eref->colnames); + /* + * We already got the correct physical datatype info above, but + * now we should try to find the source RTE and adopt its column + * aliases, since it's unlikely that the input slot has the + * desired names. + * + * If we can't locate the RTE, assume the column names we've got + * are OK. (As of this writing, the only cases where we can't + * locate the RTE are in execution of trigger WHEN clauses, and + * then the Var will have the trigger's relation's rowtype, so its + * names are fine.) Also, if the creator of the RTE didn't bother + * to fill in an eref field, assume our column names are OK. (This + * happens in COPY, and perhaps other places.) + */ + if (econtext->ecxt_estate && + variable->varno <= econtext->ecxt_estate->es_range_table_size) + { + RangeTblEntry *rte = exec_rt_fetch(variable->varno, + econtext->ecxt_estate); + + if (rte->eref) + ExecTypeSetColNames(output_tupdesc, rte->eref->colnames); + } } /* Bless the tupdesc if needed, and save it in the execution state */ diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c index 2a55d5759d..06ac253ea0 100644 --- a/src/backend/executor/execTuples.c +++ b/src/backend/executor/execTuples.c @@ -2022,51 +2022,40 @@ ExecTypeFromExprList(List *exprList) } /* - * ExecTypeSetColNames - set column names in a TupleDesc + * ExecTypeSetColNames - set column names in a RECORD TupleDesc * * Column names must be provided as an alias list (list of String nodes). - * - * For some callers, the supplied tupdesc has a named rowtype (not RECORD) - * and it is moderately likely that the alias list matches the column names - * already present in the tupdesc. If we do change any column names then - * we must reset the tupdesc's type to anonymous RECORD; but we avoid doing - * so if no names change. */ void ExecTypeSetColNames(TupleDesc typeInfo, List *namesList) { - bool modified = false; int colno = 0; ListCell *lc; + /* It's only OK to change col names in a not-yet-blessed RECORD type */ + Assert(typeInfo->tdtypeid == RECORDOID); + Assert(typeInfo->tdtypmod < 0); + foreach(lc, namesList) { char *cname = strVal(lfirst(lc)); Form_pg_attribute attr; - /* Guard against too-long names list */ + /* Guard against too-long names list (probably can't happen) */ if (colno >= typeInfo->natts) break; attr = TupleDescAttr(typeInfo, colno); colno++; - /* Ignore empty aliases (these must be for dropped columns) */ - if (cname[0] == '\0') + /* + * Do nothing for empty aliases or dropped columns (these cases + * probably can't arise in RECORD types, either) + */ + if (cname[0] == '\0' || attr->attisdropped) continue; - /* Change tupdesc only if alias is actually different */ - if (strcmp(cname, NameStr(attr->attname)) != 0) - { - namestrcpy(&(attr->attname), cname); - modified = true; - } - } - - /* If we modified the tupdesc, it's now a new record type */ - if (modified) - { - typeInfo->tdtypeid = RECORDOID; - typeInfo->tdtypmod = -1; + /* OK, assign the column name */ + namestrcpy(&(attr->attname), cname); } } diff --git a/src/test/regress/expected/rowtypes.out b/src/test/regress/expected/rowtypes.out index 0e71baf8fb..a4cc2d8c12 100644 --- a/src/test/regress/expected/rowtypes.out +++ b/src/test/regress/expected/rowtypes.out @@ -1010,18 +1010,8 @@ select row_to_json(i) from int8_tbl i; {"q1":4567890123456789,"q2":-4567890123456789} (5 rows) +-- since "i" is of type "int8_tbl", attaching aliases doesn't change anything: select row_to_json(i) from int8_tbl i(x,y); - row_to_json ----------------------------------------------- - {"x":123,"y":456} - {"x":123,"y":4567890123456789} - {"x":4567890123456789,"y":123} - {"x":4567890123456789,"y":4567890123456789} - {"x":4567890123456789,"y":-4567890123456789} -(5 rows) - -create temp view vv1 as select * from int8_tbl; -select row_to_json(i) from vv1 i; row_to_json ------------------------------------------------ {"q1":123,"q2":456} @@ -1031,16 +1021,7 @@ select row_to_json(i) from vv1 i; {"q1":4567890123456789,"q2":-4567890123456789} (5 rows) -select row_to_json(i) from vv1 i(x,y); - row_to_json ----------------------------------------------- - {"x":123,"y":456} - {"x":123,"y":4567890123456789} - {"x":4567890123456789,"y":123} - {"x":4567890123456789,"y":4567890123456789} - {"x":4567890123456789,"y":-4567890123456789} -(5 rows) - +-- in these examples, we'll report the exposed column names of the subselect: select row_to_json(ss) from (select q1, q2 from int8_tbl) as ss; row_to_json diff --git a/src/test/regress/sql/rowtypes.sql b/src/test/regress/sql/rowtypes.sql index 845e3305f3..ad5b7e128f 100644 --- a/src/test/regress/sql/rowtypes.sql +++ b/src/test/regress/sql/rowtypes.sql @@ -417,12 +417,10 @@ select longname(f) from fullname f; -- select row_to_json(i) from int8_tbl i; +-- since "i" is of type "int8_tbl", attaching aliases doesn't change anything: select row_to_json(i) from int8_tbl i(x,y); -create temp view vv1 as select * from int8_tbl; -select row_to_json(i) from vv1 i; -select row_to_json(i) from vv1 i(x,y); - +-- in these examples, we'll report the exposed column names of the subselect: select row_to_json(ss) from (select q1, q2 from int8_tbl) as ss; select row_to_json(ss) from From d7b5c071dd6af2b81a7042dc60295061c7230cdc Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 17 Mar 2022 18:25:44 -0400 Subject: [PATCH 161/772] Don't bother to attach column name lists to RowExprs of named types. If a RowExpr is marked as returning a named composite type, we aren't going to consult its colnames list; we'll use the attribute names shown for the type in pg_attribute. Hence, skip storing that list, to save a few nanoseconds when copying the expression tree around. Discussion: https://postgr.es/m/2950001.1638729947@sss.pgh.pa.us --- src/backend/optimizer/prep/prepjointree.c | 6 +++--- src/backend/optimizer/util/var.c | 1 + src/backend/rewrite/rewriteManip.c | 6 +++--- src/include/nodes/primnodes.h | 16 +++++++--------- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c index 282589dec8..74823e8437 100644 --- a/src/backend/optimizer/prep/prepjointree.c +++ b/src/backend/optimizer/prep/prepjointree.c @@ -2279,8 +2279,8 @@ pullup_replace_vars_callback(Var *var, * If generating an expansion for a var of a named rowtype (ie, this * is a plain relation RTE), then we must include dummy items for * dropped columns. If the var is RECORD (ie, this is a JOIN), then - * omit dropped columns. Either way, attach column names to the - * RowExpr for use of ruleutils.c. + * omit dropped columns. In the latter case, attach column names to + * the RowExpr for use of the executor and ruleutils.c. * * In order to be able to cache the results, we always generate the * expansion with varlevelsup = 0, and then adjust if needed. @@ -2301,7 +2301,7 @@ pullup_replace_vars_callback(Var *var, rowexpr->args = fields; rowexpr->row_typeid = var->vartype; rowexpr->row_format = COERCE_IMPLICIT_CAST; - rowexpr->colnames = colnames; + rowexpr->colnames = (var->vartype == RECORDOID) ? colnames : NIL; rowexpr->location = var->location; newnode = (Node *) rowexpr; diff --git a/src/backend/optimizer/util/var.c b/src/backend/optimizer/util/var.c index a0543b7f47..2b44ef3e17 100644 --- a/src/backend/optimizer/util/var.c +++ b/src/backend/optimizer/util/var.c @@ -809,6 +809,7 @@ flatten_join_alias_vars_mutator(Node *node, rowexpr->args = fields; rowexpr->row_typeid = var->vartype; rowexpr->row_format = COERCE_IMPLICIT_CAST; + /* vartype will always be RECORDOID, so we always need colnames */ rowexpr->colnames = colnames; rowexpr->location = var->location; diff --git a/src/backend/rewrite/rewriteManip.c b/src/backend/rewrite/rewriteManip.c index 708e5453e3..101c39553a 100644 --- a/src/backend/rewrite/rewriteManip.c +++ b/src/backend/rewrite/rewriteManip.c @@ -1424,8 +1424,8 @@ ReplaceVarsFromTargetList_callback(Var *var, * If generating an expansion for a var of a named rowtype (ie, this * is a plain relation RTE), then we must include dummy items for * dropped columns. If the var is RECORD (ie, this is a JOIN), then - * omit dropped columns. Either way, attach column names to the - * RowExpr for use of ruleutils.c. + * omit dropped columns. In the latter case, attach column names to + * the RowExpr for use of the executor and ruleutils.c. */ expandRTE(rcon->target_rte, var->varno, var->varlevelsup, var->location, @@ -1438,7 +1438,7 @@ ReplaceVarsFromTargetList_callback(Var *var, rowexpr->args = fields; rowexpr->row_typeid = var->vartype; rowexpr->row_format = COERCE_IMPLICIT_CAST; - rowexpr->colnames = colnames; + rowexpr->colnames = (var->vartype == RECORDOID) ? colnames : NIL; rowexpr->location = var->location; return (Node *) rowexpr; diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index dab5c4ff5d..439e4b4a9d 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -1052,15 +1052,13 @@ typedef struct ArrayExpr * than vice versa.) It is important not to assume that length(args) is * the same as the number of columns logically present in the rowtype. * - * colnames provides field names in cases where the names can't easily be - * obtained otherwise. Names *must* be provided if row_typeid is RECORDOID. - * If row_typeid identifies a known composite type, colnames can be NIL to - * indicate the type's cataloged field names apply. Note that colnames can - * be non-NIL even for a composite type, and typically is when the RowExpr - * was created by expanding a whole-row Var. This is so that we can retain - * the column alias names of the RTE that the Var referenced (which would - * otherwise be very difficult to extract from the parsetree). Like the - * args list, colnames is one-for-one with physical fields of the rowtype. + * colnames provides field names if the ROW() result is of type RECORD. + * Names *must* be provided if row_typeid is RECORDOID; but if it is a + * named composite type, colnames will be ignored in favor of using the + * type's cataloged field names, so colnames should be NIL. Like the + * args list, colnames is defined to be one-for-one with physical fields + * of the rowtype (although dropped columns shouldn't appear in the + * RECORD case, so this fine point is currently moot). */ typedef struct RowExpr { From b2397aae23982b77de29d3a55b263a03852d0714 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Fri, 18 Mar 2022 13:40:26 +1300 Subject: [PATCH 162/772] Declare aarch64 has single copy atomicity for 8 byte values. Architecture Reference Manual for ARMv8 B2.2.1 [1] For explicit memory effects generated from an Exception level the following rules apply: - A read that is generated by a load instruction that loads a single general-purpose register and is aligned to the size of the read in the instruction is single-copy atomic. - A write that is generated by a store instruction that stores a single general-purpose register and is aligned to the size of the write in the instruction is single-copy atomic. [1] https://documentation-service.arm.com/static/61fbe8f4fa8173727a1b734e https://developer.arm.com/documentation/ddi0487/latest Author: Yura Sokolov Reviewed-by: Thomas Munro Reviewed-by: Alexander Korotkov Discussion: https://postgr.es/m/f7f3f0febe27862711f924a7b0f39e065e547f4b.camel%40postgrespro.ru Discussion: https://postgr.es/m/CA%2BhUKGKyJf7kwYkqDgzTE26Ra1m9nvM%3Deds2RSSu7WSL-r2wKw%40mail.gmail.com --- src/include/port/atomics/arch-arm.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/include/port/atomics/arch-arm.h b/src/include/port/atomics/arch-arm.h index 2083e3230d..9fe8f1b95f 100644 --- a/src/include/port/atomics/arch-arm.h +++ b/src/include/port/atomics/arch-arm.h @@ -23,4 +23,10 @@ */ #if !defined(__aarch64__) && !defined(__aarch64) #define PG_DISABLE_64_BIT_ATOMICS +#else +/* + * Architecture Reference Manual for ARMv8 states aligned read/write to/from + * general purpose register is atomic. + */ +#define PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY #endif /* __aarch64__ || __aarch64 */ From f512efb2d50ab78e7610f0e3801925f22ebec611 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 18 Mar 2022 10:38:16 +0900 Subject: [PATCH 163/772] Fix header inclusion order in pg_receivewal.c lz4frame.h was getting declared after the headers specific to Postgres, but it needs to be included between postgres_fe.h and the internal headers. Issue introduced by babbbb5. Reported-by: Justin Prysby Discussion: https://postgr.es/m/20220317111220.GI28503@telsasoft.com --- src/bin/pg_basebackup/pg_receivewal.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c index e2ceafeb0f..8d2c1e6ce0 100644 --- a/src/bin/pg_basebackup/pg_receivewal.c +++ b/src/bin/pg_basebackup/pg_receivewal.c @@ -19,6 +19,10 @@ #include #include #include + +#ifdef USE_LZ4 +#include +#endif #ifdef HAVE_LIBZ #include #endif @@ -32,10 +36,6 @@ #include "receivelog.h" #include "streamutil.h" -#ifdef USE_LZ4 -#include "lz4frame.h" -#endif - /* Time to sleep between reconnection attempts */ #define RECONNECT_SLEEP_TIME 5 From 7a7cd84893e02e79d4b5e2d72b4ae327b031b217 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 18 Mar 2022 10:46:36 +0900 Subject: [PATCH 164/772] doc: Remove mention to in-place tablespaces for pg_tablespace_location() This paragraph has been added in the documentation by f6f0db4, but after more discussion we found that this just makes things more confusing, adding some cross-references between a general feature and something only aimed at being used by developers. The original documentation is not wrong either, and this commit brings back this part of the docs to the same state as before f6f0db4. Per discussion with Kyotaro Horiguchi and Thomas Munro. Discussion: https://postgr.es/m/CA+hUKGL2uaRKu=3+bMBpejHh4k7wqzWC05aiasTsSsHGRCWa8g@mail.gmail.com --- doc/src/sgml/func.sgml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 89a5e17884..8a802fb225 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -23924,13 +23924,7 @@ SELECT currval(pg_get_serial_sequence('sometable', 'id')); Returns the file system path that this tablespace is located in. - - - A relative path to the data directory is returned for tablespaces - created when is - enabled. - - + From 3f1ce973467a0d285961bf2f99b11d06e264e2c1 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Fri, 18 Mar 2022 17:45:04 +1300 Subject: [PATCH 165/772] Add circular WAL decoding buffer, take II. Teach xlogreader.c to decode the WAL into a circular buffer. This will support optimizations based on looking ahead, to follow in a later commit. * XLogReadRecord() works as before, decoding records one by one, and allowing them to be examined via the traditional XLogRecGetXXX() macros and certain traditional members like xlogreader->ReadRecPtr. * An alternative new interface XLogReadAhead()/XLogNextRecord() is added that returns pointers to DecodedXLogRecord objects so that it's now possible to look ahead in the WAL stream while replaying. * In order to be able to use the new interface effectively while streaming data, support is added for the page_read() callback to respond to a new nonblocking mode with XLREAD_WOULDBLOCK instead of waiting for more data to arrive. No direct user of the new interface is included in this commit, though XLogReadRecord() uses it internally. Existing code doesn't need to change, except in a few places where it was accessing reader internals directly and now needs to go through accessor macros. Reviewed-by: Julien Rouhaud Reviewed-by: Tomas Vondra Reviewed-by: Andres Freund (earlier versions) Discussion: https://postgr.es/m/CA+hUKGJ4VJN8ttxScUFM8dOKX0BrBiboo5uz1cq=AovOddfHpA@mail.gmail.com --- src/backend/access/transam/generic_xlog.c | 6 +- src/backend/access/transam/xlog.c | 18 +- src/backend/access/transam/xlogreader.c | 645 ++++++++++++++++++---- src/backend/access/transam/xlogrecovery.c | 4 +- src/backend/access/transam/xlogutils.c | 2 +- src/backend/replication/logical/decode.c | 2 +- src/bin/pg_rewind/parsexlog.c | 2 +- src/bin/pg_waldump/pg_waldump.c | 25 +- src/include/access/xlogreader.h | 154 +++++- src/tools/pgindent/typedefs.list | 2 + 10 files changed, 686 insertions(+), 174 deletions(-) diff --git a/src/backend/access/transam/generic_xlog.c b/src/backend/access/transam/generic_xlog.c index 4b0c63817f..bbb542b322 100644 --- a/src/backend/access/transam/generic_xlog.c +++ b/src/backend/access/transam/generic_xlog.c @@ -482,10 +482,10 @@ generic_redo(XLogReaderState *record) uint8 block_id; /* Protect limited size of buffers[] array */ - Assert(record->max_block_id < MAX_GENERIC_XLOG_PAGES); + Assert(XLogRecMaxBlockId(record) < MAX_GENERIC_XLOG_PAGES); /* Iterate over blocks */ - for (block_id = 0; block_id <= record->max_block_id; block_id++) + for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) { XLogRedoAction action; @@ -525,7 +525,7 @@ generic_redo(XLogReaderState *record) } /* Changes are done: unlock and release all buffers */ - for (block_id = 0; block_id <= record->max_block_id; block_id++) + for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) { if (BufferIsValid(buffers[block_id])) UnlockReleaseBuffer(buffers[block_id]); diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index f436471b27..4ac3871c74 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -971,6 +971,8 @@ XLogInsertRecord(XLogRecData *rdata, if (XLOG_DEBUG) { static XLogReaderState *debug_reader = NULL; + XLogRecord *record; + DecodedXLogRecord *decoded; StringInfoData buf; StringInfoData recordBuf; char *errormsg = NULL; @@ -990,6 +992,11 @@ XLogInsertRecord(XLogRecData *rdata, for (; rdata != NULL; rdata = rdata->next) appendBinaryStringInfo(&recordBuf, rdata->data, rdata->len); + /* We also need temporary space to decode the record. */ + record = (XLogRecord *) recordBuf.data; + decoded = (DecodedXLogRecord *) + palloc(DecodeXLogRecordRequiredSpace(record->xl_tot_len)); + if (!debug_reader) debug_reader = XLogReaderAllocate(wal_segment_size, NULL, XL_ROUTINE(), NULL); @@ -998,7 +1005,10 @@ XLogInsertRecord(XLogRecData *rdata, { appendStringInfoString(&buf, "error decoding record: out of memory while allocating a WAL reading processor"); } - else if (!DecodeXLogRecord(debug_reader, (XLogRecord *) recordBuf.data, + else if (!DecodeXLogRecord(debug_reader, + decoded, + record, + EndPos, &errormsg)) { appendStringInfo(&buf, "error decoding record: %s", @@ -1007,10 +1017,14 @@ XLogInsertRecord(XLogRecData *rdata, else { appendStringInfoString(&buf, " - "); + + debug_reader->record = decoded; xlog_outdesc(&buf, debug_reader); + debug_reader->record = NULL; } elog(LOG, "%s", buf.data); + pfree(decoded); pfree(buf.data); pfree(recordBuf.data); MemoryContextSwitchTo(oldCxt); @@ -7738,7 +7752,7 @@ xlog_redo(XLogReaderState *record) * resource manager needs to generate conflicts, it has to define a * separate WAL record type and redo routine. */ - for (uint8 block_id = 0; block_id <= record->max_block_id; block_id++) + for (uint8 block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) { Buffer buffer; diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index b7c06da255..e437c42992 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -45,6 +45,7 @@ static bool allocate_recordbuf(XLogReaderState *state, uint32 reclength); static int ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen); static void XLogReaderInvalReadState(XLogReaderState *state); +static XLogPageReadResult XLogDecodeNextRecord(XLogReaderState *state, bool non_blocking); static bool ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr RecPtr, XLogRecPtr PrevRecPtr, XLogRecord *record, bool randAccess); static bool ValidXLogRecord(XLogReaderState *state, XLogRecord *record, @@ -56,6 +57,12 @@ static void WALOpenSegmentInit(WALOpenSegment *seg, WALSegmentContext *segcxt, /* size of the buffer allocated for error message. */ #define MAX_ERRORMSG_LEN 1000 +/* + * Default size; large enough that typical users of XLogReader won't often need + * to use the 'oversized' memory allocation code path. + */ +#define DEFAULT_DECODE_BUFFER_SIZE (64 * 1024) + /* * Construct a string in state->errormsg_buf explaining what's wrong with * the current record being read. @@ -70,6 +77,24 @@ report_invalid_record(XLogReaderState *state, const char *fmt,...) va_start(args, fmt); vsnprintf(state->errormsg_buf, MAX_ERRORMSG_LEN, fmt, args); va_end(args); + + state->errormsg_deferred = true; +} + +/* + * Set the size of the decoding buffer. A pointer to a caller supplied memory + * region may also be passed in, in which case non-oversized records will be + * decoded there. + */ +void +XLogReaderSetDecodeBuffer(XLogReaderState *state, void *buffer, size_t size) +{ + Assert(state->decode_buffer == NULL); + + state->decode_buffer = buffer; + state->decode_buffer_size = size; + state->decode_buffer_tail = buffer; + state->decode_buffer_head = buffer; } /* @@ -92,8 +117,6 @@ XLogReaderAllocate(int wal_segment_size, const char *waldir, /* initialize caller-provided support functions */ state->routine = *routine; - state->max_block_id = -1; - /* * Permanently allocate readBuf. We do it this way, rather than just * making a static array, for two reasons: (1) no need to waste the @@ -144,18 +167,11 @@ XLogReaderAllocate(int wal_segment_size, const char *waldir, void XLogReaderFree(XLogReaderState *state) { - int block_id; - if (state->seg.ws_file != -1) state->routine.segment_close(state); - for (block_id = 0; block_id <= XLR_MAX_BLOCK_ID; block_id++) - { - if (state->blocks[block_id].data) - pfree(state->blocks[block_id].data); - } - if (state->main_data) - pfree(state->main_data); + if (state->decode_buffer && state->free_decode_buffer) + pfree(state->decode_buffer); pfree(state->errormsg_buf); if (state->readRecordBuf) @@ -251,7 +267,133 @@ XLogBeginRead(XLogReaderState *state, XLogRecPtr RecPtr) /* Begin at the passed-in record pointer. */ state->EndRecPtr = RecPtr; + state->NextRecPtr = RecPtr; state->ReadRecPtr = InvalidXLogRecPtr; + state->DecodeRecPtr = InvalidXLogRecPtr; +} + +/* + * See if we can release the last record that was returned by + * XLogNextRecord(), if any, to free up space. + */ +void +XLogReleasePreviousRecord(XLogReaderState *state) +{ + DecodedXLogRecord *record; + + if (!state->record) + return; + + /* + * Remove it from the decoded record queue. It must be the oldest item + * decoded, decode_queue_head. + */ + record = state->record; + Assert(record == state->decode_queue_head); + state->record = NULL; + state->decode_queue_head = record->next; + + /* It might also be the newest item decoded, decode_queue_tail. */ + if (state->decode_queue_tail == record) + state->decode_queue_tail = NULL; + + /* Release the space. */ + if (unlikely(record->oversized)) + { + /* It's not in the the decode buffer, so free it to release space. */ + pfree(record); + } + else + { + /* It must be the head (oldest) record in the decode buffer. */ + Assert(state->decode_buffer_head == (char *) record); + + /* + * We need to update head to point to the next record that is in the + * decode buffer, if any, being careful to skip oversized ones + * (they're not in the decode buffer). + */ + record = record->next; + while (unlikely(record && record->oversized)) + record = record->next; + + if (record) + { + /* Adjust head to release space up to the next record. */ + state->decode_buffer_head = (char *) record; + } + else + { + /* + * Otherwise we might as well just reset head and tail to the + * start of the buffer space, because we're empty. This means + * we'll keep overwriting the same piece of memory if we're not + * doing any prefetching. + */ + state->decode_buffer_head = state->decode_buffer; + state->decode_buffer_tail = state->decode_buffer; + } + } +} + +/* + * Attempt to read an XLOG record. + * + * XLogBeginRead() or XLogFindNextRecord() and then XLogReadAhead() must be + * called before the first call to XLogNextRecord(). This functions returns + * records and errors that were put into an internal queue by XLogReadAhead(). + * + * On success, a record is returned. + * + * The returned record (or *errormsg) points to an internal buffer that's + * valid until the next call to XLogNextRecord. + */ +DecodedXLogRecord * +XLogNextRecord(XLogReaderState *state, char **errormsg) +{ + /* Release the last record returned by XLogNextRecord(). */ + XLogReleasePreviousRecord(state); + + if (state->decode_queue_head == NULL) + { + *errormsg = NULL; + if (state->errormsg_deferred) + { + if (state->errormsg_buf[0] != '\0') + *errormsg = state->errormsg_buf; + state->errormsg_deferred = false; + } + + /* + * state->EndRecPtr is expected to have been set by the last call to + * XLogBeginRead() or XLogNextRecord(), and is the location of the + * error. + */ + Assert(!XLogRecPtrIsInvalid(state->EndRecPtr)); + + return NULL; + } + + /* + * Record this as the most recent record returned, so that we'll release + * it next time. This also exposes it to the traditional + * XLogRecXXX(xlogreader) macros, which work with the decoder rather than + * the record for historical reasons. + */ + state->record = state->decode_queue_head; + + /* + * Update the pointers to the beginning and one-past-the-end of this + * record, again for the benefit of historical code that expected the + * decoder to track this rather than accessing these fields of the record + * itself. + */ + state->ReadRecPtr = state->record->lsn; + state->EndRecPtr = state->record->next_lsn; + + *errormsg = NULL; + + return state->record; } /* @@ -272,6 +414,119 @@ XLogBeginRead(XLogReaderState *state, XLogRecPtr RecPtr) */ XLogRecord * XLogReadRecord(XLogReaderState *state, char **errormsg) +{ + DecodedXLogRecord *decoded; + + /* + * Release last returned record, if there is one. We need to do this so + * that we can check for empty decode queue accurately. + */ + XLogReleasePreviousRecord(state); + + /* + * Call XLogReadAhead() in blocking mode to make sure there is something + * in the queue, though we don't use the result. + */ + if (!XLogReaderHasQueuedRecordOrError(state)) + XLogReadAhead(state, false /* nonblocking */ ); + + /* Consume the head record or error. */ + decoded = XLogNextRecord(state, errormsg); + if (decoded) + { + /* + * This function returns a pointer to the record's header, not the + * actual decoded record. The caller will access the decoded record + * through the XLogRecGetXXX() macros, which reach the decoded + * recorded as xlogreader->record. + */ + Assert(state->record == decoded); + return &decoded->header; + } + + return NULL; +} + +/* + * Allocate space for a decoded record. The only member of the returned + * object that is initialized is the 'oversized' flag, indicating that the + * decoded record wouldn't fit in the decode buffer and must eventually be + * freed explicitly. + * + * The caller is responsible for adjusting decode_buffer_tail with the real + * size after successfully decoding a record into this space. This way, if + * decoding fails, then there is nothing to undo unless the 'oversized' flag + * was set and pfree() must be called. + * + * Return NULL if there is no space in the decode buffer and allow_oversized + * is false, or if memory allocation fails for an oversized buffer. + */ +static DecodedXLogRecord * +XLogReadRecordAlloc(XLogReaderState *state, size_t xl_tot_len, bool allow_oversized) +{ + size_t required_space = DecodeXLogRecordRequiredSpace(xl_tot_len); + DecodedXLogRecord *decoded = NULL; + + /* Allocate a circular decode buffer if we don't have one already. */ + if (unlikely(state->decode_buffer == NULL)) + { + if (state->decode_buffer_size == 0) + state->decode_buffer_size = DEFAULT_DECODE_BUFFER_SIZE; + state->decode_buffer = palloc(state->decode_buffer_size); + state->decode_buffer_head = state->decode_buffer; + state->decode_buffer_tail = state->decode_buffer; + state->free_decode_buffer = true; + } + + /* Try to allocate space in the circular decode buffer. */ + if (state->decode_buffer_tail >= state->decode_buffer_head) + { + /* Empty, or tail is to the right of head. */ + if (state->decode_buffer_tail + required_space <= + state->decode_buffer + state->decode_buffer_size) + { + /* There is space between tail and end. */ + decoded = (DecodedXLogRecord *) state->decode_buffer_tail; + decoded->oversized = false; + return decoded; + } + else if (state->decode_buffer + required_space < + state->decode_buffer_head) + { + /* There is space between start and head. */ + decoded = (DecodedXLogRecord *) state->decode_buffer; + decoded->oversized = false; + return decoded; + } + } + else + { + /* Tail is to the left of head. */ + if (state->decode_buffer_tail + required_space < + state->decode_buffer_head) + { + /* There is space between tail and head. */ + decoded = (DecodedXLogRecord *) state->decode_buffer_tail; + decoded->oversized = false; + return decoded; + } + } + + /* Not enough space in the decode buffer. Are we allowed to allocate? */ + if (allow_oversized) + { + decoded = palloc_extended(required_space, MCXT_ALLOC_NO_OOM); + if (decoded == NULL) + return NULL; + decoded->oversized = true; + return decoded; + } + + return NULL; +} + +static XLogPageReadResult +XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) { XLogRecPtr RecPtr; XLogRecord *record; @@ -284,6 +539,8 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) bool assembled; bool gotheader; int readOff; + DecodedXLogRecord *decoded; + char *errormsg; /* not used */ /* * randAccess indicates whether to verify the previous-record pointer of @@ -293,21 +550,20 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) randAccess = false; /* reset error state */ - *errormsg = NULL; state->errormsg_buf[0] = '\0'; + decoded = NULL; - ResetDecoder(state); state->abortedRecPtr = InvalidXLogRecPtr; state->missingContrecPtr = InvalidXLogRecPtr; - RecPtr = state->EndRecPtr; + RecPtr = state->NextRecPtr; - if (state->ReadRecPtr != InvalidXLogRecPtr) + if (state->DecodeRecPtr != InvalidXLogRecPtr) { /* read the record after the one we just read */ /* - * EndRecPtr is pointing to end+1 of the previous WAL record. If + * NextRecPtr is pointing to end+1 of the previous WAL record. If * we're at a page boundary, no more records can fit on the current * page. We must skip over the page header, but we can't do that until * we've read in the page, since the header size is variable. @@ -318,7 +574,7 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) /* * Caller supplied a position to start at. * - * In this case, EndRecPtr should already be pointing to a valid + * In this case, NextRecPtr should already be pointing to a valid * record starting position. */ Assert(XRecOffIsValid(RecPtr)); @@ -326,6 +582,7 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) } restart: + state->nonblocking = nonblocking; state->currRecPtr = RecPtr; assembled = false; @@ -339,7 +596,9 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) */ readOff = ReadPageInternal(state, targetPagePtr, Min(targetRecOff + SizeOfXLogRecord, XLOG_BLCKSZ)); - if (readOff < 0) + if (readOff == XLREAD_WOULDBLOCK) + return XLREAD_WOULDBLOCK; + else if (readOff < 0) goto err; /* @@ -395,7 +654,7 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) */ if (targetRecOff <= XLOG_BLCKSZ - SizeOfXLogRecord) { - if (!ValidXLogRecordHeader(state, RecPtr, state->ReadRecPtr, record, + if (!ValidXLogRecordHeader(state, RecPtr, state->DecodeRecPtr, record, randAccess)) goto err; gotheader = true; @@ -414,6 +673,31 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) gotheader = false; } + /* + * Find space to decode this record. Don't allow oversized allocation if + * the caller requested nonblocking. Otherwise, we *have* to try to + * decode the record now because the caller has nothing else to do, so + * allow an oversized record to be palloc'd if that turns out to be + * necessary. + */ + decoded = XLogReadRecordAlloc(state, + total_len, + !nonblocking /* allow_oversized */ ); + if (decoded == NULL) + { + /* + * There is no space in the decode buffer. The caller should help + * with that problem by consuming some records. + */ + if (nonblocking) + return XLREAD_WOULDBLOCK; + + /* We failed to allocate memory for an oversized record. */ + report_invalid_record(state, + "out of memory while trying to decode a record of length %u", total_len); + goto err; + } + len = XLOG_BLCKSZ - RecPtr % XLOG_BLCKSZ; if (total_len > len) { @@ -453,7 +737,9 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) Min(total_len - gotlen + SizeOfXLogShortPHD, XLOG_BLCKSZ)); - if (readOff < 0) + if (readOff == XLREAD_WOULDBLOCK) + return XLREAD_WOULDBLOCK; + else if (readOff < 0) goto err; Assert(SizeOfXLogShortPHD <= readOff); @@ -471,7 +757,6 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) if (pageHeader->xlp_info & XLP_FIRST_IS_OVERWRITE_CONTRECORD) { state->overwrittenRecPtr = RecPtr; - ResetDecoder(state); RecPtr = targetPagePtr; goto restart; } @@ -526,7 +811,7 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) if (!gotheader) { record = (XLogRecord *) state->readRecordBuf; - if (!ValidXLogRecordHeader(state, RecPtr, state->ReadRecPtr, + if (!ValidXLogRecordHeader(state, RecPtr, state->DecodeRecPtr, record, randAccess)) goto err; gotheader = true; @@ -540,8 +825,8 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) goto err; pageHeaderSize = XLogPageHeaderSize((XLogPageHeader) state->readBuf); - state->ReadRecPtr = RecPtr; - state->EndRecPtr = targetPagePtr + pageHeaderSize + state->DecodeRecPtr = RecPtr; + state->NextRecPtr = targetPagePtr + pageHeaderSize + MAXALIGN(pageHeader->xlp_rem_len); } else @@ -549,16 +834,18 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) /* Wait for the record data to become available */ readOff = ReadPageInternal(state, targetPagePtr, Min(targetRecOff + total_len, XLOG_BLCKSZ)); - if (readOff < 0) + if (readOff == XLREAD_WOULDBLOCK) + return XLREAD_WOULDBLOCK; + else if (readOff < 0) goto err; /* Record does not cross a page boundary */ if (!ValidXLogRecord(state, record, RecPtr)) goto err; - state->EndRecPtr = RecPtr + MAXALIGN(total_len); + state->NextRecPtr = RecPtr + MAXALIGN(total_len); - state->ReadRecPtr = RecPtr; + state->DecodeRecPtr = RecPtr; } /* @@ -568,14 +855,40 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) (record->xl_info & ~XLR_INFO_MASK) == XLOG_SWITCH) { /* Pretend it extends to end of segment */ - state->EndRecPtr += state->segcxt.ws_segsize - 1; - state->EndRecPtr -= XLogSegmentOffset(state->EndRecPtr, state->segcxt.ws_segsize); + state->NextRecPtr += state->segcxt.ws_segsize - 1; + state->NextRecPtr -= XLogSegmentOffset(state->NextRecPtr, state->segcxt.ws_segsize); } - if (DecodeXLogRecord(state, record, errormsg)) - return record; + if (DecodeXLogRecord(state, decoded, record, RecPtr, &errormsg)) + { + /* Record the location of the next record. */ + decoded->next_lsn = state->NextRecPtr; + + /* + * If it's in the decode buffer, mark the decode buffer space as + * occupied. + */ + if (!decoded->oversized) + { + /* The new decode buffer head must be MAXALIGNed. */ + Assert(decoded->size == MAXALIGN(decoded->size)); + if ((char *) decoded == state->decode_buffer) + state->decode_buffer_tail = state->decode_buffer + decoded->size; + else + state->decode_buffer_tail += decoded->size; + } + + /* Insert it into the queue of decoded records. */ + Assert(state->decode_queue_tail != decoded); + if (state->decode_queue_tail) + state->decode_queue_tail->next = decoded; + state->decode_queue_tail = decoded; + if (!state->decode_queue_head) + state->decode_queue_head = decoded; + return XLREAD_SUCCESS; + } else - return NULL; + return XLREAD_FAIL; err: if (assembled) @@ -593,14 +906,46 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) state->missingContrecPtr = targetPagePtr; } + if (decoded && decoded->oversized) + pfree(decoded); + /* * Invalidate the read state. We might read from a different source after * failure. */ XLogReaderInvalReadState(state); - if (state->errormsg_buf[0] != '\0') - *errormsg = state->errormsg_buf; + /* + * If an error was written to errmsg_buf, it'll be returned to the caller + * of XLogReadRecord() after all successfully decoded records from the + * read queue. + */ + + return XLREAD_FAIL; +} + +/* + * Try to decode the next available record, and return it. The record will + * also be returned to XLogNextRecord(), which must be called to 'consume' + * each record. + * + * If nonblocking is true, may return NULL due to lack of data or WAL decoding + * space. + */ +DecodedXLogRecord * +XLogReadAhead(XLogReaderState *state, bool nonblocking) +{ + XLogPageReadResult result; + + if (state->errormsg_deferred) + return NULL; + + result = XLogDecodeNextRecord(state, nonblocking); + if (result == XLREAD_SUCCESS) + { + Assert(state->decode_queue_tail != NULL); + return state->decode_queue_tail; + } return NULL; } @@ -609,8 +954,14 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) * Read a single xlog page including at least [pageptr, reqLen] of valid data * via the page_read() callback. * - * Returns -1 if the required page cannot be read for some reason; errormsg_buf - * is set in that case (unless the error occurs in the page_read callback). + * Returns XLREAD_FAIL if the required page cannot be read for some + * reason; errormsg_buf is set in that case (unless the error occurs in the + * page_read callback). + * + * Returns XLREAD_WOULDBLOCK if the requested data can't be read without + * waiting. This can be returned only if the installed page_read callback + * respects the state->nonblocking flag, and cannot read the requested data + * immediately. * * We fetch the page from a reader-local cache if we know we have the required * data and if there hasn't been any error since caching the data. @@ -652,7 +1003,9 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen) readLen = state->routine.page_read(state, targetSegmentPtr, XLOG_BLCKSZ, state->currRecPtr, state->readBuf); - if (readLen < 0) + if (readLen == XLREAD_WOULDBLOCK) + return XLREAD_WOULDBLOCK; + else if (readLen < 0) goto err; /* we can be sure to have enough WAL available, we scrolled back */ @@ -670,7 +1023,9 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen) readLen = state->routine.page_read(state, pageptr, Max(reqLen, SizeOfXLogShortPHD), state->currRecPtr, state->readBuf); - if (readLen < 0) + if (readLen == XLREAD_WOULDBLOCK) + return XLREAD_WOULDBLOCK; + else if (readLen < 0) goto err; Assert(readLen <= XLOG_BLCKSZ); @@ -689,7 +1044,9 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen) readLen = state->routine.page_read(state, pageptr, XLogPageHeaderSize(hdr), state->currRecPtr, state->readBuf); - if (readLen < 0) + if (readLen == XLREAD_WOULDBLOCK) + return XLREAD_WOULDBLOCK; + else if (readLen < 0) goto err; } @@ -707,8 +1064,12 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen) return readLen; err: - XLogReaderInvalReadState(state); - return -1; + if (state->errormsg_buf[0] != '\0') + { + state->errormsg_deferred = true; + XLogReaderInvalReadState(state); + } + return XLREAD_FAIL; } /* @@ -987,6 +1348,9 @@ XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr) Assert(!XLogRecPtrIsInvalid(RecPtr)); + /* Make sure ReadPageInternal() can't return XLREAD_WOULDBLOCK. */ + state->nonblocking = false; + /* * skip over potential continuation data, keeping in mind that it may span * multiple pages @@ -1187,34 +1551,83 @@ WALRead(XLogReaderState *state, * ---------------------------------------- */ -/* private function to reset the state between records */ +/* + * Private function to reset the state, forgetting all decoded records, if we + * are asked to move to a new read position. + */ static void ResetDecoder(XLogReaderState *state) { - int block_id; + DecodedXLogRecord *r; - state->decoded_record = NULL; - - state->main_data_len = 0; - - for (block_id = 0; block_id <= state->max_block_id; block_id++) + /* Reset the decoded record queue, freeing any oversized records. */ + while ((r = state->decode_queue_head) != NULL) { - state->blocks[block_id].in_use = false; - state->blocks[block_id].has_image = false; - state->blocks[block_id].has_data = false; - state->blocks[block_id].apply_image = false; + state->decode_queue_head = r->next; + if (r->oversized) + pfree(r); } - state->max_block_id = -1; + state->decode_queue_tail = NULL; + state->decode_queue_head = NULL; + state->record = NULL; + + /* Reset the decode buffer to empty. */ + state->decode_buffer_tail = state->decode_buffer; + state->decode_buffer_head = state->decode_buffer; + + /* Clear error state. */ + state->errormsg_buf[0] = '\0'; + state->errormsg_deferred = false; } /* - * Decode the previously read record. + * Compute the maximum possible amount of padding that could be required to + * decode a record, given xl_tot_len from the record's header. This is the + * amount of output buffer space that we need to decode a record, though we + * might not finish up using it all. + * + * This computation is pessimistic and assumes the maximum possible number of + * blocks, due to lack of better information. + */ +size_t +DecodeXLogRecordRequiredSpace(size_t xl_tot_len) +{ + size_t size = 0; + + /* Account for the fixed size part of the decoded record struct. */ + size += offsetof(DecodedXLogRecord, blocks[0]); + /* Account for the flexible blocks array of maximum possible size. */ + size += sizeof(DecodedBkpBlock) * (XLR_MAX_BLOCK_ID + 1); + /* Account for all the raw main and block data. */ + size += xl_tot_len; + /* We might insert padding before main_data. */ + size += (MAXIMUM_ALIGNOF - 1); + /* We might insert padding before each block's data. */ + size += (MAXIMUM_ALIGNOF - 1) * (XLR_MAX_BLOCK_ID + 1); + /* We might insert padding at the end. */ + size += (MAXIMUM_ALIGNOF - 1); + + return size; +} + +/* + * Decode a record. "decoded" must point to a MAXALIGNed memory area that has + * space for at least DecodeXLogRecordRequiredSpace(record) bytes. On + * success, decoded->size contains the actual space occupied by the decoded + * record, which may turn out to be less. + * + * Only decoded->oversized member must be initialized already, and will not be + * modified. Other members will be initialized as required. * * On error, a human-readable error message is returned in *errormsg, and * the return value is false. */ bool -DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, char **errormsg) +DecodeXLogRecord(XLogReaderState *state, + DecodedXLogRecord *decoded, + XLogRecord *record, + XLogRecPtr lsn, + char **errormsg) { /* * read next _size bytes from record buffer, but check for overrun first. @@ -1229,17 +1642,20 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, char **errormsg) } while(0) char *ptr; + char *out; uint32 remaining; uint32 datatotal; RelFileNode *rnode = NULL; uint8 block_id; - ResetDecoder(state); - - state->decoded_record = record; - state->record_origin = InvalidRepOriginId; - state->toplevel_xid = InvalidTransactionId; - + decoded->header = *record; + decoded->lsn = lsn; + decoded->next = NULL; + decoded->record_origin = InvalidRepOriginId; + decoded->toplevel_xid = InvalidTransactionId; + decoded->main_data = NULL; + decoded->main_data_len = 0; + decoded->max_block_id = -1; ptr = (char *) record; ptr += SizeOfXLogRecord; remaining = record->xl_tot_len - SizeOfXLogRecord; @@ -1257,7 +1673,7 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, char **errormsg) COPY_HEADER_FIELD(&main_data_len, sizeof(uint8)); - state->main_data_len = main_data_len; + decoded->main_data_len = main_data_len; datatotal += main_data_len; break; /* by convention, the main data fragment is * always last */ @@ -1268,18 +1684,18 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, char **errormsg) uint32 main_data_len; COPY_HEADER_FIELD(&main_data_len, sizeof(uint32)); - state->main_data_len = main_data_len; + decoded->main_data_len = main_data_len; datatotal += main_data_len; break; /* by convention, the main data fragment is * always last */ } else if (block_id == XLR_BLOCK_ID_ORIGIN) { - COPY_HEADER_FIELD(&state->record_origin, sizeof(RepOriginId)); + COPY_HEADER_FIELD(&decoded->record_origin, sizeof(RepOriginId)); } else if (block_id == XLR_BLOCK_ID_TOPLEVEL_XID) { - COPY_HEADER_FIELD(&state->toplevel_xid, sizeof(TransactionId)); + COPY_HEADER_FIELD(&decoded->toplevel_xid, sizeof(TransactionId)); } else if (block_id <= XLR_MAX_BLOCK_ID) { @@ -1287,7 +1703,11 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, char **errormsg) DecodedBkpBlock *blk; uint8 fork_flags; - if (block_id <= state->max_block_id) + /* mark any intervening block IDs as not in use */ + for (int i = decoded->max_block_id + 1; i < block_id; ++i) + decoded->blocks[i].in_use = false; + + if (block_id <= decoded->max_block_id) { report_invalid_record(state, "out-of-order block_id %u at %X/%X", @@ -1295,9 +1715,9 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, char **errormsg) LSN_FORMAT_ARGS(state->ReadRecPtr)); goto err; } - state->max_block_id = block_id; + decoded->max_block_id = block_id; - blk = &state->blocks[block_id]; + blk = &decoded->blocks[block_id]; blk->in_use = true; blk->apply_image = false; @@ -1440,17 +1860,18 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, char **errormsg) /* * Ok, we've parsed the fragment headers, and verified that the total * length of the payload in the fragments is equal to the amount of data - * left. Copy the data of each fragment to a separate buffer. - * - * We could just set up pointers into readRecordBuf, but we want to align - * the data for the convenience of the callers. Backup images are not - * copied, however; they don't need alignment. + * left. Copy the data of each fragment to contiguous space after the + * blocks array, inserting alignment padding before the data fragments so + * they can be cast to struct pointers by REDO routines. */ + out = ((char *) decoded) + + offsetof(DecodedXLogRecord, blocks) + + sizeof(decoded->blocks[0]) * (decoded->max_block_id + 1); /* block data first */ - for (block_id = 0; block_id <= state->max_block_id; block_id++) + for (block_id = 0; block_id <= decoded->max_block_id; block_id++) { - DecodedBkpBlock *blk = &state->blocks[block_id]; + DecodedBkpBlock *blk = &decoded->blocks[block_id]; if (!blk->in_use) continue; @@ -1459,58 +1880,37 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, char **errormsg) if (blk->has_image) { - blk->bkp_image = ptr; + /* no need to align image */ + blk->bkp_image = out; + memcpy(out, ptr, blk->bimg_len); ptr += blk->bimg_len; + out += blk->bimg_len; } if (blk->has_data) { - if (!blk->data || blk->data_len > blk->data_bufsz) - { - if (blk->data) - pfree(blk->data); - - /* - * Force the initial request to be BLCKSZ so that we don't - * waste time with lots of trips through this stanza as a - * result of WAL compression. - */ - blk->data_bufsz = MAXALIGN(Max(blk->data_len, BLCKSZ)); - blk->data = palloc(blk->data_bufsz); - } + out = (char *) MAXALIGN(out); + blk->data = out; memcpy(blk->data, ptr, blk->data_len); ptr += blk->data_len; + out += blk->data_len; } } /* and finally, the main data */ - if (state->main_data_len > 0) + if (decoded->main_data_len > 0) { - if (!state->main_data || state->main_data_len > state->main_data_bufsz) - { - if (state->main_data) - pfree(state->main_data); - - /* - * main_data_bufsz must be MAXALIGN'ed. In many xlog record - * types, we omit trailing struct padding on-disk to save a few - * bytes; but compilers may generate accesses to the xlog struct - * that assume that padding bytes are present. If the palloc - * request is not large enough to include such padding bytes then - * we'll get valgrind complaints due to otherwise-harmless fetches - * of the padding bytes. - * - * In addition, force the initial request to be reasonably large - * so that we don't waste time with lots of trips through this - * stanza. BLCKSZ / 2 seems like a good compromise choice. - */ - state->main_data_bufsz = MAXALIGN(Max(state->main_data_len, - BLCKSZ / 2)); - state->main_data = palloc(state->main_data_bufsz); - } - memcpy(state->main_data, ptr, state->main_data_len); - ptr += state->main_data_len; + out = (char *) MAXALIGN(out); + decoded->main_data = out; + memcpy(decoded->main_data, ptr, decoded->main_data_len); + ptr += decoded->main_data_len; + out += decoded->main_data_len; } + /* Report the actual size we used. */ + decoded->size = MAXALIGN(out - (char *) decoded); + Assert(DecodeXLogRecordRequiredSpace(record->xl_tot_len) >= + decoded->size); + return true; shortdata_err: @@ -1536,10 +1936,11 @@ XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id, { DecodedBkpBlock *bkpb; - if (!record->blocks[block_id].in_use) + if (block_id > record->record->max_block_id || + !record->record->blocks[block_id].in_use) return false; - bkpb = &record->blocks[block_id]; + bkpb = &record->record->blocks[block_id]; if (rnode) *rnode = bkpb->rnode; if (forknum) @@ -1559,10 +1960,11 @@ XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len) { DecodedBkpBlock *bkpb; - if (!record->blocks[block_id].in_use) + if (block_id > record->record->max_block_id || + !record->record->blocks[block_id].in_use) return NULL; - bkpb = &record->blocks[block_id]; + bkpb = &record->record->blocks[block_id]; if (!bkpb->has_data) { @@ -1590,12 +1992,13 @@ RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page) char *ptr; PGAlignedBlock tmp; - if (!record->blocks[block_id].in_use) + if (block_id > record->record->max_block_id || + !record->record->blocks[block_id].in_use) return false; - if (!record->blocks[block_id].has_image) + if (!record->record->blocks[block_id].has_image) return false; - bkpb = &record->blocks[block_id]; + bkpb = &record->record->blocks[block_id]; ptr = bkpb->bkp_image; if (BKPIMAGE_COMPRESSED(bkpb->bimg_info)) diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index f9f212680b..9feea3e6ec 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -2139,7 +2139,7 @@ xlog_block_info(StringInfo buf, XLogReaderState *record) int block_id; /* decode block references */ - for (block_id = 0; block_id <= record->max_block_id; block_id++) + for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) { RelFileNode rnode; ForkNumber forknum; @@ -2271,7 +2271,7 @@ verifyBackupPageConsistency(XLogReaderState *record) Assert((XLogRecGetInfo(record) & XLR_CHECK_CONSISTENCY) != 0); - for (block_id = 0; block_id <= record->max_block_id; block_id++) + for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) { Buffer buf; Page page; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index 54d5f20734..511f2f186f 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -370,7 +370,7 @@ XLogReadBufferForRedoExtended(XLogReaderState *record, * going to initialize it. And vice versa. */ zeromode = (mode == RBM_ZERO_AND_LOCK || mode == RBM_ZERO_AND_CLEANUP_LOCK); - willinit = (record->blocks[block_id].flags & BKPBLOCK_WILL_INIT) != 0; + willinit = (XLogRecGetBlock(record, block_id)->flags & BKPBLOCK_WILL_INIT) != 0; if (willinit && !zeromode) elog(PANIC, "block with WILL_INIT flag in WAL record must be zeroed by redo routine"); if (!willinit && zeromode) diff --git a/src/backend/replication/logical/decode.c b/src/backend/replication/logical/decode.c index 8c00a73cb9..77bc7aea7a 100644 --- a/src/backend/replication/logical/decode.c +++ b/src/backend/replication/logical/decode.c @@ -111,7 +111,7 @@ LogicalDecodingProcessRecord(LogicalDecodingContext *ctx, XLogReaderState *recor { ReorderBufferAssignChild(ctx->reorder, txid, - record->decoded_record->xl_xid, + XLogRecGetXid(record), buf.origptr); } diff --git a/src/bin/pg_rewind/parsexlog.c b/src/bin/pg_rewind/parsexlog.c index 56df08c64f..7cfa169e9b 100644 --- a/src/bin/pg_rewind/parsexlog.c +++ b/src/bin/pg_rewind/parsexlog.c @@ -432,7 +432,7 @@ extractPageInfo(XLogReaderState *record) RmgrNames[rmid], info); } - for (block_id = 0; block_id <= record->max_block_id; block_id++) + for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) { RelFileNode rnode; ForkNumber forknum; diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index f128050b4e..fc081adfb8 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -403,14 +403,13 @@ XLogDumpRecordLen(XLogReaderState *record, uint32 *rec_len, uint32 *fpi_len) * Calculate the amount of FPI data in the record. * * XXX: We peek into xlogreader's private decoded backup blocks for the - * bimg_len indicating the length of FPI data. It doesn't seem worth it to - * add an accessor macro for this. + * bimg_len indicating the length of FPI data. */ *fpi_len = 0; - for (block_id = 0; block_id <= record->max_block_id; block_id++) + for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) { if (XLogRecHasBlockImage(record, block_id)) - *fpi_len += record->blocks[block_id].bimg_len; + *fpi_len += XLogRecGetBlock(record, block_id)->bimg_len; } /* @@ -508,7 +507,7 @@ XLogDumpDisplayRecord(XLogDumpConfig *config, XLogReaderState *record) if (!config->bkp_details) { /* print block references (short format) */ - for (block_id = 0; block_id <= record->max_block_id; block_id++) + for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) { if (!XLogRecHasBlockRef(record, block_id)) continue; @@ -539,7 +538,7 @@ XLogDumpDisplayRecord(XLogDumpConfig *config, XLogReaderState *record) { /* print block references (detailed format) */ putchar('\n'); - for (block_id = 0; block_id <= record->max_block_id; block_id++) + for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) { if (!XLogRecHasBlockRef(record, block_id)) continue; @@ -552,7 +551,7 @@ XLogDumpDisplayRecord(XLogDumpConfig *config, XLogReaderState *record) blk); if (XLogRecHasBlockImage(record, block_id)) { - uint8 bimg_info = record->blocks[block_id].bimg_info; + uint8 bimg_info = XLogRecGetBlock(record, block_id)->bimg_info; if (BKPIMAGE_COMPRESSED(bimg_info)) { @@ -571,11 +570,11 @@ XLogDumpDisplayRecord(XLogDumpConfig *config, XLogReaderState *record) "compression saved: %u, method: %s", XLogRecBlockImageApply(record, block_id) ? "" : " for WAL verification", - record->blocks[block_id].hole_offset, - record->blocks[block_id].hole_length, + XLogRecGetBlock(record, block_id)->hole_offset, + XLogRecGetBlock(record, block_id)->hole_length, BLCKSZ - - record->blocks[block_id].hole_length - - record->blocks[block_id].bimg_len, + XLogRecGetBlock(record, block_id)->hole_length - + XLogRecGetBlock(record, block_id)->bimg_len, method); } else @@ -583,8 +582,8 @@ XLogDumpDisplayRecord(XLogDumpConfig *config, XLogReaderState *record) printf(" (FPW%s); hole: offset: %u, length: %u", XLogRecBlockImageApply(record, block_id) ? "" : " for WAL verification", - record->blocks[block_id].hole_offset, - record->blocks[block_id].hole_length); + XLogRecGetBlock(record, block_id)->hole_offset, + XLogRecGetBlock(record, block_id)->hole_length); } } putchar('\n'); diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index 477f0efe26..f4388cc9be 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -144,6 +144,30 @@ typedef struct uint16 data_bufsz; } DecodedBkpBlock; +/* + * The decoded contents of a record. This occupies a contiguous region of + * memory, with main_data and blocks[n].data pointing to memory after the + * members declared here. + */ +typedef struct DecodedXLogRecord +{ + /* Private member used for resource management. */ + size_t size; /* total size of decoded record */ + bool oversized; /* outside the regular decode buffer? */ + struct DecodedXLogRecord *next; /* decoded record queue link */ + + /* Public members. */ + XLogRecPtr lsn; /* location */ + XLogRecPtr next_lsn; /* location of next record */ + XLogRecord header; /* header */ + RepOriginId record_origin; + TransactionId toplevel_xid; /* XID of top-level transaction */ + char *main_data; /* record's main data portion */ + uint32 main_data_len; /* main data portion's length */ + int max_block_id; /* highest block_id in use (-1 if none) */ + DecodedBkpBlock blocks[FLEXIBLE_ARRAY_MEMBER]; +} DecodedXLogRecord; + struct XLogReaderState { /* @@ -171,6 +195,9 @@ struct XLogReaderState * Start and end point of last record read. EndRecPtr is also used as the * position to read next. Calling XLogBeginRead() sets EndRecPtr to the * starting position and ReadRecPtr to invalid. + * + * Start and end point of last record returned by XLogReadRecord(). These + * are also available as record->lsn and record->next_lsn. */ XLogRecPtr ReadRecPtr; /* start of last record read */ XLogRecPtr EndRecPtr; /* end+1 of last record read */ @@ -192,27 +219,43 @@ struct XLogReaderState * Use XLogRecGet* functions to investigate the record; these fields * should not be accessed directly. * ---------------------------------------- + * Start and end point of the last record read and decoded by + * XLogReadRecordInternal(). NextRecPtr is also used as the position to + * decode next. Calling XLogBeginRead() sets NextRecPtr and EndRecPtr to + * the requested starting position. */ - XLogRecord *decoded_record; /* currently decoded record */ + XLogRecPtr DecodeRecPtr; /* start of last record decoded */ + XLogRecPtr NextRecPtr; /* end+1 of last record decoded */ + XLogRecPtr PrevRecPtr; /* start of previous record decoded */ - char *main_data; /* record's main data portion */ - uint32 main_data_len; /* main data portion's length */ - uint32 main_data_bufsz; /* allocated size of the buffer */ - - RepOriginId record_origin; - - TransactionId toplevel_xid; /* XID of top-level transaction */ - - /* information about blocks referenced by the record. */ - DecodedBkpBlock blocks[XLR_MAX_BLOCK_ID + 1]; - - int max_block_id; /* highest block_id in use (-1 if none) */ + /* Last record returned by XLogReadRecord(). */ + DecodedXLogRecord *record; /* ---------------------------------------- * private/internal state * ---------------------------------------- */ + /* + * Buffer for decoded records. This is a circular buffer, though + * individual records can't be split in the middle, so some space is often + * wasted at the end. Oversized records that don't fit in this space are + * allocated separately. + */ + char *decode_buffer; + size_t decode_buffer_size; + bool free_decode_buffer; /* need to free? */ + char *decode_buffer_head; /* data is read from the head */ + char *decode_buffer_tail; /* new data is written at the tail */ + + /* + * Queue of records that have been decoded. This is a linked list that + * usually consists of consecutive records in decode_buffer, but may also + * contain oversized records allocated with palloc(). + */ + DecodedXLogRecord *decode_queue_head; /* oldest decoded record */ + DecodedXLogRecord *decode_queue_tail; /* newest decoded record */ + /* * Buffer for currently read page (XLOG_BLCKSZ bytes, valid up to at least * readLen bytes) @@ -262,8 +305,24 @@ struct XLogReaderState /* Buffer to hold error message */ char *errormsg_buf; + bool errormsg_deferred; + + /* + * Flag to indicate to XLogPageReadCB that it should not block waiting for + * data. + */ + bool nonblocking; }; +/* + * Check if XLogNextRecord() has any more queued records or an error to return. + */ +static inline bool +XLogReaderHasQueuedRecordOrError(XLogReaderState *state) +{ + return (state->decode_queue_head != NULL) || state->errormsg_deferred; +} + /* Get a new XLogReader */ extern XLogReaderState *XLogReaderAllocate(int wal_segment_size, const char *waldir, @@ -274,16 +333,40 @@ extern XLogReaderRoutine *LocalXLogReaderRoutine(void); /* Free an XLogReader */ extern void XLogReaderFree(XLogReaderState *state); +/* Optionally provide a circular decoding buffer to allow readahead. */ +extern void XLogReaderSetDecodeBuffer(XLogReaderState *state, + void *buffer, + size_t size); + /* Position the XLogReader to given record */ extern void XLogBeginRead(XLogReaderState *state, XLogRecPtr RecPtr); #ifdef FRONTEND extern XLogRecPtr XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr); #endif /* FRONTEND */ +/* Return values from XLogPageReadCB. */ +typedef enum XLogPageReadResult +{ + XLREAD_SUCCESS = 0, /* record is successfully read */ + XLREAD_FAIL = -1, /* failed during reading a record */ + XLREAD_WOULDBLOCK = -2 /* nonblocking mode only, no data */ +} XLogPageReadResult; + /* Read the next XLog record. Returns NULL on end-of-WAL or failure */ extern struct XLogRecord *XLogReadRecord(XLogReaderState *state, char **errormsg); +/* Consume the next record or error. */ +extern DecodedXLogRecord *XLogNextRecord(XLogReaderState *state, + char **errormsg); + +/* Release the previously returned record, if necessary. */ +extern void XLogReleasePreviousRecord(XLogReaderState *state); + +/* Try to read ahead, if there is data and space. */ +extern DecodedXLogRecord *XLogReadAhead(XLogReaderState *state, + bool nonblocking); + /* Validate a page */ extern bool XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr, char *phdr); @@ -307,25 +390,36 @@ extern bool WALRead(XLogReaderState *state, /* Functions for decoding an XLogRecord */ -extern bool DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, +extern size_t DecodeXLogRecordRequiredSpace(size_t xl_tot_len); +extern bool DecodeXLogRecord(XLogReaderState *state, + DecodedXLogRecord *decoded, + XLogRecord *record, + XLogRecPtr lsn, char **errmsg); -#define XLogRecGetTotalLen(decoder) ((decoder)->decoded_record->xl_tot_len) -#define XLogRecGetPrev(decoder) ((decoder)->decoded_record->xl_prev) -#define XLogRecGetInfo(decoder) ((decoder)->decoded_record->xl_info) -#define XLogRecGetRmid(decoder) ((decoder)->decoded_record->xl_rmid) -#define XLogRecGetXid(decoder) ((decoder)->decoded_record->xl_xid) -#define XLogRecGetOrigin(decoder) ((decoder)->record_origin) -#define XLogRecGetTopXid(decoder) ((decoder)->toplevel_xid) -#define XLogRecGetData(decoder) ((decoder)->main_data) -#define XLogRecGetDataLen(decoder) ((decoder)->main_data_len) -#define XLogRecHasAnyBlockRefs(decoder) ((decoder)->max_block_id >= 0) -#define XLogRecHasBlockRef(decoder, block_id) \ - ((decoder)->blocks[block_id].in_use) -#define XLogRecHasBlockImage(decoder, block_id) \ - ((decoder)->blocks[block_id].has_image) -#define XLogRecBlockImageApply(decoder, block_id) \ - ((decoder)->blocks[block_id].apply_image) +/* + * Macros that provide access to parts of the record most recently returned by + * XLogReadRecord() or XLogNextRecord(). + */ +#define XLogRecGetTotalLen(decoder) ((decoder)->record->header.xl_tot_len) +#define XLogRecGetPrev(decoder) ((decoder)->record->header.xl_prev) +#define XLogRecGetInfo(decoder) ((decoder)->record->header.xl_info) +#define XLogRecGetRmid(decoder) ((decoder)->record->header.xl_rmid) +#define XLogRecGetXid(decoder) ((decoder)->record->header.xl_xid) +#define XLogRecGetOrigin(decoder) ((decoder)->record->record_origin) +#define XLogRecGetTopXid(decoder) ((decoder)->record->toplevel_xid) +#define XLogRecGetData(decoder) ((decoder)->record->main_data) +#define XLogRecGetDataLen(decoder) ((decoder)->record->main_data_len) +#define XLogRecHasAnyBlockRefs(decoder) ((decoder)->record->max_block_id >= 0) +#define XLogRecMaxBlockId(decoder) ((decoder)->record->max_block_id) +#define XLogRecGetBlock(decoder, i) (&(decoder)->record->blocks[(i)]) +#define XLogRecHasBlockRef(decoder, block_id) \ + (((decoder)->record->max_block_id >= (block_id)) && \ + ((decoder)->record->blocks[block_id].in_use)) +#define XLogRecHasBlockImage(decoder, block_id) \ + ((decoder)->record->blocks[block_id].has_image) +#define XLogRecBlockImageApply(decoder, block_id) \ + ((decoder)->record->blocks[block_id].apply_image) #ifndef FRONTEND extern FullTransactionId XLogRecGetFullXid(XLogReaderState *record); diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 6ffd4474bc..d8e228d89a 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -533,6 +533,7 @@ DeadLockState DeallocateStmt DeclareCursorStmt DecodedBkpBlock +DecodedXLogRecord DecodingOutputState DefElem DefElemAction @@ -2941,6 +2942,7 @@ XLogPageHeader XLogPageHeaderData XLogPageReadCB XLogPageReadPrivate +XLogPageReadResult XLogReaderRoutine XLogReaderState XLogRecData From d914eb347fcd7554a7afda5efaa709582f64f660 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 18 Mar 2022 13:10:04 -0400 Subject: [PATCH 166/772] Remove workarounds for avoiding [U]INT64_FORMAT in translatable strings. Update pg_backup_tar.c along the same lines as 62aa2bb29 and other previous cleanup: we can now rely on %lld or %llu as long as we explicitly cast to long long or unsigned long long. Japin Li Discussion: https://postgr.es/m/MEYP282MB16694F7CC1B119B4ECDD8CBEB6139@MEYP282MB1669.AUSP282.PROD.OUTLOOK.COM --- src/bin/pg_dump/pg_backup_tar.c | 48 +++++++-------------------------- 1 file changed, 9 insertions(+), 39 deletions(-) diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c index 5c351acda0..ccfbe346be 100644 --- a/src/bin/pg_dump/pg_backup_tar.c +++ b/src/bin/pg_dump/pg_backup_tar.c @@ -1102,15 +1102,8 @@ _tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th) fatal("could not close temporary file: %m"); if (len != th->fileLen) - { - char buf1[32], - buf2[32]; - - snprintf(buf1, sizeof(buf1), INT64_FORMAT, (int64) len); - snprintf(buf2, sizeof(buf2), INT64_FORMAT, (int64) th->fileLen); - fatal("actual file length (%s) does not match expected (%s)", - buf1, buf2); - } + fatal("actual file length (%lld) does not match expected (%lld)", + (long long) len, (long long) th->fileLen); pad = tarPaddingBytesRequired(len); for (i = 0; i < pad; i++) @@ -1140,24 +1133,14 @@ _tarPositionTo(ArchiveHandle *AH, const char *filename) /* Go to end of current file, if any */ if (ctx->tarFHpos != 0) { - char buf1[100], - buf2[100]; - - snprintf(buf1, sizeof(buf1), INT64_FORMAT, (int64) ctx->tarFHpos); - snprintf(buf2, sizeof(buf2), INT64_FORMAT, (int64) ctx->tarNextMember); - pg_log_debug("moving from position %s to next member at file position %s", - buf1, buf2); + pg_log_debug("moving from position %lld to next member at file position %lld", + (long long) ctx->tarFHpos, (long long) ctx->tarNextMember); while (ctx->tarFHpos < ctx->tarNextMember) _tarReadRaw(AH, &c, 1, NULL, ctx->tarFH); } - { - char buf[100]; - - snprintf(buf, sizeof(buf), INT64_FORMAT, (int64) ctx->tarFHpos); - pg_log_debug("now at file position %s", buf); - } + pg_log_debug("now at file position %lld", (long long) ctx->tarFHpos); /* We are at the start of the file, or at the next member */ @@ -1265,25 +1248,12 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th) len = read_tar_number(&h[124], 12); - { - char posbuf[32]; - char lenbuf[32]; - - snprintf(posbuf, sizeof(posbuf), UINT64_FORMAT, (uint64) hPos); - snprintf(lenbuf, sizeof(lenbuf), UINT64_FORMAT, (uint64) len); - pg_log_debug("TOC Entry %s at %s (length %s, checksum %d)", - tag, posbuf, lenbuf, sum); - } + pg_log_debug("TOC Entry %s at %llu (length %llu, checksum %d)", + tag, (unsigned long long) hPos, (unsigned long long) len, sum); if (chk != sum) - { - char posbuf[32]; - - snprintf(posbuf, sizeof(posbuf), UINT64_FORMAT, - (uint64) ftello(ctx->tarFH)); - fatal("corrupt tar header found in %s (expected %d, computed %d) file position %s", - tag, sum, chk, posbuf); - } + fatal("corrupt tar header found in %s (expected %d, computed %d) file position %llu", + tag, sum, chk, (unsigned long long) ftello(ctx->tarFH)); th->targetFile = pg_strdup(tag); th->fileLen = len; From 9eaef6f8ea951320eae0c0083b07d901fe9bd3e5 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 18 Mar 2022 13:21:47 -0400 Subject: [PATCH 167/772] Doc: remove bogus instruction to install contrib/hstore. This test suite does not use hstore. Looks like this text was copied-and-pasted from src/test/subscription/README. --- src/test/icu/README | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/icu/README b/src/test/icu/README index cfc9353dff..c257af1950 100644 --- a/src/test/icu/README +++ b/src/test/icu/README @@ -9,8 +9,6 @@ Running the tests ================= NOTE: You must have given the --enable-tap-tests argument to configure. -Also, to use "make installcheck", you must have built and installed -contrib/hstore in addition to the core code. Run make check From 0d3aaadd324e0566820c863d4617eb4fc949d220 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 18 Mar 2022 13:26:04 -0400 Subject: [PATCH 168/772] Specify database encoding in new ICU test. Otherwise, the database encoding varies depending on the user's environment, and so the test might fail depending on whether ICU likes the encoding. In particular, the test fails completely if the prevailing locale is C. --- src/test/icu/t/010_database.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/icu/t/010_database.pl b/src/test/icu/t/010_database.pl index 4cc8907b42..d50941b53d 100644 --- a/src/test/icu/t/010_database.pl +++ b/src/test/icu/t/010_database.pl @@ -16,7 +16,7 @@ $node1->start; $node1->safe_psql('postgres', - q{CREATE DATABASE dbicu LOCALE_PROVIDER icu LOCALE 'C' ICU_LOCALE 'en-u-kf-upper' TEMPLATE template0}); + q{CREATE DATABASE dbicu LOCALE_PROVIDER icu LOCALE 'C' ICU_LOCALE 'en-u-kf-upper' ENCODING 'UTF8' TEMPLATE template0}); $node1->safe_psql('dbicu', q{ From 068739fb4f345c8c922d72f2c8e15e9c0a75056d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 18 Mar 2022 16:01:42 -0400 Subject: [PATCH 169/772] Fix incorrect xmlschema output for types timetz and timestamptz. The output of table_to_xmlschema() and allied functions includes a regex describing valid values for these types ... but the regex was itself invalid, as it failed to escape a literal "+" sign. Report and fix by Renan Soares Lopes. Back-patch to all supported branches. Discussion: https://postgr.es/m/7f6fabaa-3f8f-49ab-89ca-59fbfe633105@me.com --- src/backend/utils/adt/xml.c | 4 +- src/test/regress/expected/xmlmap.out | 928 +++++++++++++------------ src/test/regress/expected/xmlmap_1.out | 10 +- src/test/regress/sql/xmlmap.sql | 10 +- 4 files changed, 514 insertions(+), 438 deletions(-) diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 51773db890..801ad8fa4e 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -3659,7 +3659,7 @@ map_sql_type_to_xmlschema_type(Oid typeoid, int typmod) case TIMEOID: case TIMETZOID: { - const char *tz = (typeoid == TIMETZOID ? "(+|-)\\p{Nd}{2}:\\p{Nd}{2}" : ""); + const char *tz = (typeoid == TIMETZOID ? "(\\+|-)\\p{Nd}{2}:\\p{Nd}{2}" : ""); if (typmod == -1) appendStringInfo(&result, @@ -3682,7 +3682,7 @@ map_sql_type_to_xmlschema_type(Oid typeoid, int typmod) case TIMESTAMPOID: case TIMESTAMPTZOID: { - const char *tz = (typeoid == TIMESTAMPTZOID ? "(+|-)\\p{Nd}{2}:\\p{Nd}{2}" : ""); + const char *tz = (typeoid == TIMESTAMPTZOID ? "(\\+|-)\\p{Nd}{2}:\\p{Nd}{2}" : ""); if (typmod == -1) appendStringInfo(&result, diff --git a/src/test/regress/expected/xmlmap.out b/src/test/regress/expected/xmlmap.out index c08f8a0d9c..ccc5460663 100644 --- a/src/test/regress/expected/xmlmap.out +++ b/src/test/regress/expected/xmlmap.out @@ -2,9 +2,15 @@ CREATE SCHEMA testxmlschema; CREATE TABLE testxmlschema.test1 (a int, b text); INSERT INTO testxmlschema.test1 VALUES (1, 'one'), (2, 'two'), (-1, null); CREATE DOMAIN testxmldomain AS varchar; -CREATE TABLE testxmlschema.test2 (z int, y varchar(500), x char(6), w numeric(9,2), v smallint, u bigint, t real, s time, r timestamp, q date, p xml, o testxmldomain, n bool, m bytea, aaa text); +CREATE TABLE testxmlschema.test2 (z int, y varchar(500), x char(6), + w numeric(9,2), v smallint, u bigint, t real, + s time, stz timetz, r timestamp, rtz timestamptz, q date, + p xml, o testxmldomain, n bool, m bytea, aaa text); ALTER TABLE testxmlschema.test2 DROP COLUMN aaa; -INSERT INTO testxmlschema.test2 VALUES (55, 'abc', 'def', 98.6, 2, 999, 0, '21:07', '2009-06-08 21:07:30', '2009-06-08', NULL, 'ABC', true, 'XYZ'); +INSERT INTO testxmlschema.test2 VALUES (55, 'abc', 'def', + 98.6, 2, 999, 0, + '21:07', '21:11 +05', '2009-06-08 21:07:30', '2009-06-08 21:07:30 -07', '2009-06-08', + NULL, 'ABC', true, 'XYZ'); SELECT table_to_xml('testxmlschema.test1', false, false, ''); table_to_xml --------------------------------------------------------------- @@ -107,7 +113,9 @@ SELECT table_to_xml('testxmlschema.test2', false, false, ''); 999 + 0 + 21:07:00 + + 21:11:00+05 + 2009-06-08T21:07:30 + + 2009-06-08T21:07:30-07:00 + 2009-06-08 + ABC + true + @@ -253,113 +261,127 @@ SELECT table_to_xmlschema('testxmlschema.test1', true, true, ''); (1 row) SELECT table_to_xmlschema('testxmlschema.test2', false, false, ''); - table_to_xmlschema ------------------------------------------------------------------------------------------------------------------ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + table_to_xmlschema +---------------------------------------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (1 row) @@ -816,7 +838,9 @@ SELECT schema_to_xml('testxmlschema', false, true, ''); 999 + 0 + 21:07:00 + + 21:11:00+05 + 2009-06-08T21:07:30 + + 2009-06-08T21:07:30-07:00 + 2009-06-08 + ABC + true + @@ -863,7 +887,9 @@ SELECT schema_to_xml('testxmlschema', true, false, ''); 999 + 0 + 21:07:00 + + 21:11:00+05 + 2009-06-08T21:07:30 + + 2009-06-08T21:07:30-07:00 + 2009-06-08 +

+ ABC + @@ -878,337 +904,375 @@ SELECT schema_to_xml('testxmlschema', true, false, ''); (1 row) SELECT schema_to_xmlschema('testxmlschema', false, true, ''); - schema_to_xmlschema -------------------------------------------------------------------------------------------------------------------- - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + schema_to_xmlschema +---------------------------------------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (1 row) SELECT schema_to_xmlschema('testxmlschema', true, false, ''); - schema_to_xmlschema ---------------------------------------------------------------------------------------------------- - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + schema_to_xmlschema +---------------------------------------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (1 row) SELECT schema_to_xml_and_xmlschema('testxmlschema', true, true, 'foo'); - schema_to_xml_and_xmlschema -------------------------------------------------------------------------------------------------------------------- - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - 1 + - one + - + - + - + - 2 + - two + - + - + - + - -1 + - + - + - + - + - + - 55 + - abc + - def + - 98.60 + - 2 + - 999 + - 0 + - 21:07:00 + - 2009-06-08T21:07:30 + - 2009-06-08 + -

+ - ABC + - true + - WFla + - + - + - + - + + schema_to_xml_and_xmlschema +---------------------------------------------------------------------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + one + + + + + + + + 2 + + two + + + + + + + + -1 + + + + + + + + + + + + 55 + + abc + + def + + 98.60 + + 2 + + 999 + + 0 + + 21:07:00 + + 21:11:00+05 + + 2009-06-08T21:07:30 + + 2009-06-08T21:07:30-07:00 + + 2009-06-08 + +

+ + ABC + + true + + WFla + + + + + + + + + (1 row) diff --git a/src/test/regress/expected/xmlmap_1.out b/src/test/regress/expected/xmlmap_1.out index f6dbf81666..4504acd377 100644 --- a/src/test/regress/expected/xmlmap_1.out +++ b/src/test/regress/expected/xmlmap_1.out @@ -2,9 +2,15 @@ CREATE SCHEMA testxmlschema; CREATE TABLE testxmlschema.test1 (a int, b text); INSERT INTO testxmlschema.test1 VALUES (1, 'one'), (2, 'two'), (-1, null); CREATE DOMAIN testxmldomain AS varchar; -CREATE TABLE testxmlschema.test2 (z int, y varchar(500), x char(6), w numeric(9,2), v smallint, u bigint, t real, s time, r timestamp, q date, p xml, o testxmldomain, n bool, m bytea, aaa text); +CREATE TABLE testxmlschema.test2 (z int, y varchar(500), x char(6), + w numeric(9,2), v smallint, u bigint, t real, + s time, stz timetz, r timestamp, rtz timestamptz, q date, + p xml, o testxmldomain, n bool, m bytea, aaa text); ALTER TABLE testxmlschema.test2 DROP COLUMN aaa; -INSERT INTO testxmlschema.test2 VALUES (55, 'abc', 'def', 98.6, 2, 999, 0, '21:07', '2009-06-08 21:07:30', '2009-06-08', NULL, 'ABC', true, 'XYZ'); +INSERT INTO testxmlschema.test2 VALUES (55, 'abc', 'def', + 98.6, 2, 999, 0, + '21:07', '21:11 +05', '2009-06-08 21:07:30', '2009-06-08 21:07:30 -07', '2009-06-08', + NULL, 'ABC', true, 'XYZ'); SELECT table_to_xml('testxmlschema.test1', false, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. diff --git a/src/test/regress/sql/xmlmap.sql b/src/test/regress/sql/xmlmap.sql index fde1b9eb59..16582bf6ab 100644 --- a/src/test/regress/sql/xmlmap.sql +++ b/src/test/regress/sql/xmlmap.sql @@ -3,9 +3,15 @@ CREATE SCHEMA testxmlschema; CREATE TABLE testxmlschema.test1 (a int, b text); INSERT INTO testxmlschema.test1 VALUES (1, 'one'), (2, 'two'), (-1, null); CREATE DOMAIN testxmldomain AS varchar; -CREATE TABLE testxmlschema.test2 (z int, y varchar(500), x char(6), w numeric(9,2), v smallint, u bigint, t real, s time, r timestamp, q date, p xml, o testxmldomain, n bool, m bytea, aaa text); +CREATE TABLE testxmlschema.test2 (z int, y varchar(500), x char(6), + w numeric(9,2), v smallint, u bigint, t real, + s time, stz timetz, r timestamp, rtz timestamptz, q date, + p xml, o testxmldomain, n bool, m bytea, aaa text); ALTER TABLE testxmlschema.test2 DROP COLUMN aaa; -INSERT INTO testxmlschema.test2 VALUES (55, 'abc', 'def', 98.6, 2, 999, 0, '21:07', '2009-06-08 21:07:30', '2009-06-08', NULL, 'ABC', true, 'XYZ'); +INSERT INTO testxmlschema.test2 VALUES (55, 'abc', 'def', + 98.6, 2, 999, 0, + '21:07', '21:11 +05', '2009-06-08 21:07:30', '2009-06-08 21:07:30 -07', '2009-06-08', + NULL, 'ABC', true, 'XYZ'); SELECT table_to_xml('testxmlschema.test1', false, false, ''); SELECT table_to_xml('testxmlschema.test1', true, false, 'foo'); From 225fb558cd42fe05b5ac55b7586cc1d16fd2f0ea Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Fri, 18 Mar 2022 15:42:02 -0700 Subject: [PATCH 170/772] ci: include hints how to install OS packages. This is useful for patches during development, but once a feature is merged, new libraries should be added to the OS image files, rather than installed during every CI run forever into the future. Author: Justin Pryzby Reviewed-By: Andres Freund Discussion: https://postgr.es/m/20220310220611.GH28503@telsasoft.com --- .cirrus.yml | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 40854046d6..3e3a7c81e4 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -73,10 +73,12 @@ task: chown -R postgres:postgres . mkdir -p ${CCACHE_DIR} chown -R postgres:postgres ${CCACHE_DIR} - setup_cores_script: | + setup_core_files_script: | mkdir -m 770 /tmp/cores chown root:postgres /tmp/cores sysctl kern.corefile='/tmp/cores/%N.%P.core' + setup_additional_packages_script: | + #pkg install -y ... # NB: Intentionally build without --with-llvm. The freebsd image size is # already large enough to make VM startup slow, and even without llvm @@ -180,10 +182,13 @@ task: chown -R postgres:postgres ${CCACHE_DIR} echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf su postgres -c "ulimit -l -H && ulimit -l -S" - setup_cores_script: | + setup_core_files_script: | mkdir -m 770 /tmp/cores chown root:postgres /tmp/cores sysctl kernel.core_pattern='/tmp/cores/%e-%s-%p.core' + setup_additional_packages_script: | + #apt-get update + #DEBIAN_FRONTEND=noninteractive apt-get -y install ... configure_script: | su postgres <<-EOF @@ -237,7 +242,7 @@ task: ulimit -a -H && ulimit -a -S export - setup_cores_script: + setup_core_files_script: - mkdir ${HOME}/cores - sudo sysctl kern.corefile="${HOME}/cores/core.%P" @@ -254,7 +259,7 @@ task: # packages do not need to be downloaded. homebrew_cache: folder: $HOMEBREW_CACHE - homebrew_install_script: | + setup_additional_packages_script: | brew install \ ccache \ icu4c \ @@ -389,6 +394,9 @@ task: powershell -Command get-psdrive -psprovider filesystem set + setup_additional_packages_script: | + REM choco install -y --no-progress ... + configure_script: # copy errors out when using forward slashes - copy src\tools\ci\windows_build_config.pl src\tools\msvc\config.pl @@ -484,6 +492,10 @@ task: ccache_cache: folder: $CCACHE_DIR + setup_additional_packages_script: | + #apt-get update + #DEBIAN_FRONTEND=noninteractive apt-get -y install ... + ### # Test that code can be built with gcc/clang without warnings ### From 4a288a37f9b7bfd13c4f5cd8b545ac856f975813 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Fri, 18 Mar 2022 15:42:33 -0700 Subject: [PATCH 171/772] ci: compile with -Og where applicable. To improve performance of check-world, and improve debugging, without significantly slower builds (they're cached anyway). This makes freebsd check-world run in 8.5 minutes rather than 15 minutes. Author: Justin Pryzby Reviewed-By: Andres Freund Discussion: https://postgr.es/m/20220310220611.GH28503@telsasoft.com --- .cirrus.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 3e3a7c81e4..6929a0d65a 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -107,7 +107,7 @@ task: \ CC="ccache cc" \ CXX="ccache c++" \ - CFLAGS="-O0 -ggdb" + CFLAGS="-Og -ggdb" EOF build_script: su postgres -c "gmake -s -j${BUILD_JOBS} world-bin" upload_caches: ccache @@ -201,8 +201,8 @@ task: CC="ccache gcc" \ CXX="ccache g++" \ CLANG="ccache clang" \ - CFLAGS="-O0 -ggdb" \ - CXXFLAGS="-O0 -ggdb" + CFLAGS="-Og -ggdb" \ + CXXFLAGS="-Og -ggdb" EOF build_script: su postgres -c "make -s -j${BUILD_JOBS} world-bin" upload_caches: ccache @@ -315,8 +315,8 @@ task: CC="ccache cc" \ CXX="ccache c++" \ CLANG="ccache ${brewpath}/llvm/bin/ccache" \ - CFLAGS="-O0 -ggdb" \ - CXXFLAGS="-O0 -ggdb" \ + CFLAGS="-Og -ggdb" \ + CXXFLAGS="-Og -ggdb" \ \ LLVM_CONFIG=${brewpath}/llvm/bin/llvm-config \ PYTHON=python3 From e186f56f9c6ead4ef65848ae6c499f9949b12625 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Fri, 18 Mar 2022 18:18:00 -0700 Subject: [PATCH 172/772] Close race condition in slot_creation_error.spec. Use the pattern from detach-partition-concurrently-3.spec. Per buildfarm member wrasse. Reviewed by Kyotaro Horiguchi and Andres Freund. Discussion: https://postgr.es/m/20220318072837.GC2739027@rfd.leadboat.com --- .../expected/slot_creation_error.out | 20 ++++++++++--------- .../specs/slot_creation_error.spec | 4 ++-- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/contrib/test_decoding/expected/slot_creation_error.out b/contrib/test_decoding/expected/slot_creation_error.out index 043bdae0a2..25883b508f 100644 --- a/contrib/test_decoding/expected/slot_creation_error.out +++ b/contrib/test_decoding/expected/slot_creation_error.out @@ -23,14 +23,15 @@ step s1_cancel_s2: SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE application_name = 'isolation/slot_creation_error/s2'; - + +step s2_init: <... completed> +ERROR: canceling statement due to user request +step s1_cancel_s2: <... completed> pg_cancel_backend ----------------- t (1 row) -step s2_init: <... completed> -ERROR: canceling statement due to user request step s1_view_slot: SELECT slot_name, slot_type, active FROM pg_replication_slots WHERE slot_name = 'slot_creation_error' @@ -90,18 +91,19 @@ step s1_terminate_s2: SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE application_name = 'isolation/slot_creation_error/s2'; - -pg_terminate_backend --------------------- -t -(1 row) - + step s2_init: <... completed> FATAL: terminating connection due to administrator command server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. +step s1_terminate_s2: <... completed> +pg_terminate_backend +-------------------- +t +(1 row) + step s1_c: COMMIT; step s1_view_slot: SELECT slot_name, slot_type, active FROM pg_replication_slots WHERE slot_name = 'slot_creation_error' diff --git a/contrib/test_decoding/specs/slot_creation_error.spec b/contrib/test_decoding/specs/slot_creation_error.spec index 6816696b9d..d1e35bf58b 100644 --- a/contrib/test_decoding/specs/slot_creation_error.spec +++ b/contrib/test_decoding/specs/slot_creation_error.spec @@ -35,7 +35,7 @@ step s2_init { # The tests first start a transaction with an xid assigned in s1, then create # a slot in s2. The slot creation waits for s1's transaction to end. Instead # we cancel / terminate s2. -permutation s1_b s1_xid s2_init s1_view_slot s1_cancel_s2 s1_view_slot s1_c +permutation s1_b s1_xid s2_init s1_view_slot s1_cancel_s2(s2_init) s1_view_slot s1_c permutation s1_b s1_xid s2_init s1_c s1_view_slot s1_drop_slot # check slot creation still works -permutation s1_b s1_xid s2_init s1_terminate_s2 s1_c s1_view_slot +permutation s1_b s1_xid s2_init s1_terminate_s2(s2_init) s1_c s1_view_slot # can't run tests after this, due to s2's connection failure From 97bddda61b9ae1a33116c8596c48d9dc095597a5 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Fri, 18 Mar 2022 18:48:03 -0700 Subject: [PATCH 173/772] Silence -Wmaybe-uninitialized compiler warning in dbcommands.c. Introduced in f2553d43060e. See also 3f6b3be39ca9, which did so for nearby variables. Discussion: https://postgr.es/m/20220319014707.kgtomqdzm6m2ulro@alap3.anarazel.de --- src/backend/commands/dbcommands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 2e1af642e4..962e11dd8f 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -109,7 +109,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) char *src_collate = NULL; char *src_ctype = NULL; char *src_iculocale = NULL; - char src_locprovider; + char src_locprovider = '\0'; char *src_collversion = NULL; bool src_istemplate; bool src_allowconn; From 9616da3ddbc14de43c34676f92aa061dad8caefb Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 19 Mar 2022 16:37:31 +0900 Subject: [PATCH 174/772] doc: Mention SET TABLESPACE clause for ALTER MATERIALIZED VIEW This command flavor is supported, but there was nothing in the documentation about it. Author: Yugo Nagata Discussion: https://postgr.es/m/20220316133337.5dc9740abfa24c25ec9f67f5@sraoss.co.jp Backpatch-through: 10 --- doc/src/sgml/ref/alter_materialized_view.sgml | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/src/sgml/ref/alter_materialized_view.sgml b/doc/src/sgml/ref/alter_materialized_view.sgml index 7011a0e7da..c6a132de06 100644 --- a/doc/src/sgml/ref/alter_materialized_view.sgml +++ b/doc/src/sgml/ref/alter_materialized_view.sgml @@ -43,6 +43,7 @@ ALTER MATERIALIZED VIEW ALL IN TABLESPACE namecolumn_name SET COMPRESSION compression_method CLUSTER ON index_name SET WITHOUT CLUSTER + SET TABLESPACE new_tablespace SET ( storage_parameter [= value] [, ... ] ) RESET ( storage_parameter [, ... ] ) OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER } From ade2159bcdc18939d4e9b1773d12fe06cfcd201d Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 19 Mar 2022 17:28:50 +0900 Subject: [PATCH 175/772] Add regression tests for ALTER MATERIALIZED VIEW with tablespaces The clauses SET TABLESPACE and ALL IN TABLESPACE are supported in ALTER MATERIALIZED VIEW for a long time, and they behave mostly like ALTER TABLE by reusing the same code paths, but there were zero tests for them. This commit closes the gap with new tests in tablespace.sql. Author: Yugo Nagata Discussion: https://postgr.es/m/20220316133337.5dc9740abfa24c25ec9f67f5@sraoss.co.jp --- src/test/regress/expected/tablespace.out | 16 +++++++++++++++- src/test/regress/sql/tablespace.sql | 8 ++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/test/regress/expected/tablespace.out b/src/test/regress/expected/tablespace.out index 473fe8c28e..c52cf1cfcf 100644 --- a/src/test/regress/expected/tablespace.out +++ b/src/test/regress/expected/tablespace.out @@ -905,6 +905,16 @@ SELECT COUNT(*) FROM testschema.atable; -- checks heap 3 (1 row) +-- let's try moving a materialized view from one place to another +CREATE MATERIALIZED VIEW testschema.amv AS SELECT * FROM testschema.atable; +ALTER MATERIALIZED VIEW testschema.amv SET TABLESPACE regress_tblspace; +REFRESH MATERIALIZED VIEW testschema.amv; +SELECT COUNT(*) FROM testschema.amv; + count +------- + 3 +(1 row) + -- Will fail with bad path CREATE TABLESPACE regress_badspace LOCATION '/no/such/location'; ERROR: directory "/no/such/location" does not exist @@ -939,18 +949,22 @@ RESET ROLE; ALTER TABLESPACE regress_tblspace RENAME TO regress_tblspace_renamed; ALTER TABLE ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; ALTER INDEX ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; +ALTER MATERIALIZED VIEW ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; -- Should show notice that nothing was done ALTER TABLE ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; NOTICE: no matching relations in tablespace "regress_tblspace_renamed" found +ALTER MATERIALIZED VIEW ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; +NOTICE: no matching relations in tablespace "regress_tblspace_renamed" found -- Should succeed DROP TABLESPACE regress_tblspace_renamed; DROP SCHEMA testschema CASCADE; -NOTICE: drop cascades to 6 other objects +NOTICE: drop cascades to 7 other objects DETAIL: drop cascades to table testschema.foo drop cascades to table testschema.asselect drop cascades to table testschema.asexecute drop cascades to table testschema.part drop cascades to table testschema.atable +drop cascades to materialized view testschema.amv drop cascades to table testschema.tablespace_acl DROP ROLE regress_tablespace_user1; DROP ROLE regress_tablespace_user2; diff --git a/src/test/regress/sql/tablespace.sql b/src/test/regress/sql/tablespace.sql index 0949a28488..21db433f2a 100644 --- a/src/test/regress/sql/tablespace.sql +++ b/src/test/regress/sql/tablespace.sql @@ -380,6 +380,12 @@ INSERT INTO testschema.atable VALUES(3); -- ok INSERT INTO testschema.atable VALUES(1); -- fail (checks index) SELECT COUNT(*) FROM testschema.atable; -- checks heap +-- let's try moving a materialized view from one place to another +CREATE MATERIALIZED VIEW testschema.amv AS SELECT * FROM testschema.atable; +ALTER MATERIALIZED VIEW testschema.amv SET TABLESPACE regress_tblspace; +REFRESH MATERIALIZED VIEW testschema.amv; +SELECT COUNT(*) FROM testschema.amv; + -- Will fail with bad path CREATE TABLESPACE regress_badspace LOCATION '/no/such/location'; @@ -414,9 +420,11 @@ ALTER TABLESPACE regress_tblspace RENAME TO regress_tblspace_renamed; ALTER TABLE ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; ALTER INDEX ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; +ALTER MATERIALIZED VIEW ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; -- Should show notice that nothing was done ALTER TABLE ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; +ALTER MATERIALIZED VIEW ALL IN TABLESPACE regress_tblspace_renamed SET TABLESPACE pg_default; -- Should succeed DROP TABLESPACE regress_tblspace_renamed; From eb8399cf1f3dd8ad02633e3bb84e2289d2debb44 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 19 Mar 2022 19:13:52 +0900 Subject: [PATCH 176/772] Improve handling of SET ACCESS METHOD for ALTER MATERIALIZED VIEW b048326 has added support for SET ACCESS METHOD in ALTER TABLE, but it has missed a few things for materialized views: - No documentation for this clause on the ALTER MATERIALIZED VIEW page. - psql tab completion missing. - No regression tests. This commit closes the gap on all the points listed above. Author: Yugo Nagata Discussion: https://postgr.es/m/20220316133337.5dc9740abfa24c25ec9f67f5@sraoss.co.jp --- doc/src/sgml/ref/alter_materialized_view.sgml | 1 + src/bin/psql/tab-complete.c | 6 ++++- src/test/regress/expected/create_am.out | 26 +++++++++++++++++++ src/test/regress/sql/create_am.sql | 10 +++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/alter_materialized_view.sgml b/doc/src/sgml/ref/alter_materialized_view.sgml index c6a132de06..cae135c27a 100644 --- a/doc/src/sgml/ref/alter_materialized_view.sgml +++ b/doc/src/sgml/ref/alter_materialized_view.sgml @@ -43,6 +43,7 @@ ALTER MATERIALIZED VIEW ALL IN TABLESPACE namecolumn_name SET COMPRESSION compression_method CLUSTER ON index_name SET WITHOUT CLUSTER + SET ACCESS METHOD new_access_method SET TABLESPACE new_tablespace SET ( storage_parameter [= value] [, ... ] ) RESET ( storage_parameter [, ... ] ) diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 380cbc0b1f..7b331a38ae 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -2124,7 +2124,11 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("TO"); /* ALTER MATERIALIZED VIEW xxx SET */ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "SET")) - COMPLETE_WITH("(", "SCHEMA", "TABLESPACE", "WITHOUT CLUSTER"); + COMPLETE_WITH("(", "ACCESS METHOD", "SCHEMA", "TABLESPACE", "WITHOUT CLUSTER"); + /* ALTER MATERIALIZED VIEW xxx SET ACCESS METHOD */ + else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "SET", "ACCESS", "METHOD")) + COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods); + /* ALTER POLICY */ else if (Matches("ALTER", "POLICY")) COMPLETE_WITH_QUERY(Query_for_list_of_policies); diff --git a/src/test/regress/expected/create_am.out b/src/test/regress/expected/create_am.out index 32b7134080..e9a9283d7a 100644 --- a/src/test/regress/expected/create_am.out +++ b/src/test/regress/expected/create_am.out @@ -254,9 +254,35 @@ SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heaptable; 9 | 1 (1 row) +-- ALTER MATERIALIZED VIEW SET ACCESS METHOD +CREATE MATERIALIZED VIEW heapmv USING heap AS SELECT * FROM heaptable; +SELECT amname FROM pg_class c, pg_am am + WHERE c.relam = am.oid AND c.oid = 'heapmv'::regclass; + amname +-------- + heap +(1 row) + +ALTER MATERIALIZED VIEW heapmv SET ACCESS METHOD heap2; +SELECT amname FROM pg_class c, pg_am am + WHERE c.relam = am.oid AND c.oid = 'heapmv'::regclass; + amname +-------- + heap2 +(1 row) + +SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heapmv; + count | count +-------+------- + 9 | 1 +(1 row) + -- No support for multiple subcommands ALTER TABLE heaptable SET ACCESS METHOD heap, SET ACCESS METHOD heap2; ERROR: cannot have multiple SET ACCESS METHOD subcommands +ALTER MATERIALIZED VIEW heapmv SET ACCESS METHOD heap, SET ACCESS METHOD heap2; +ERROR: cannot have multiple SET ACCESS METHOD subcommands +DROP MATERIALIZED VIEW heapmv; DROP TABLE heaptable; -- No support for partitioned tables. CREATE TABLE am_partitioned(x INT, y INT) diff --git a/src/test/regress/sql/create_am.sql b/src/test/regress/sql/create_am.sql index 967bfac21a..256884c959 100644 --- a/src/test/regress/sql/create_am.sql +++ b/src/test/regress/sql/create_am.sql @@ -170,8 +170,18 @@ ALTER TABLE heaptable SET ACCESS METHOD heap2; SELECT amname FROM pg_class c, pg_am am WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass; SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heaptable; +-- ALTER MATERIALIZED VIEW SET ACCESS METHOD +CREATE MATERIALIZED VIEW heapmv USING heap AS SELECT * FROM heaptable; +SELECT amname FROM pg_class c, pg_am am + WHERE c.relam = am.oid AND c.oid = 'heapmv'::regclass; +ALTER MATERIALIZED VIEW heapmv SET ACCESS METHOD heap2; +SELECT amname FROM pg_class c, pg_am am + WHERE c.relam = am.oid AND c.oid = 'heapmv'::regclass; +SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heapmv; -- No support for multiple subcommands ALTER TABLE heaptable SET ACCESS METHOD heap, SET ACCESS METHOD heap2; +ALTER MATERIALIZED VIEW heapmv SET ACCESS METHOD heap, SET ACCESS METHOD heap2; +DROP MATERIALIZED VIEW heapmv; DROP TABLE heaptable; -- No support for partitioned tables. CREATE TABLE am_partitioned(x INT, y INT) From a1fc50672c4b410f6a75db1efe807efeaccf571c Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Sat, 19 Mar 2022 19:31:38 +0100 Subject: [PATCH 177/772] Fix an outdated and grammatically wrong comment Authored by Amit Langote and myself independently Discussion: https://postgr.es/m/CA+HiwqGCjcH0gG-=tM7hhP7TEDmzrHMHJbPGSHtHgFmx9mnFkg@mail.gmail.com --- src/backend/executor/nodeModifyTable.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 6239abae90..babf26810b 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -1517,9 +1517,9 @@ ldelete:; * for the caller. * * False is returned if the tuple we're trying to move is found to have been - * concurrently updated. In that case, the caller must to check if the - * updated tuple that's returned in *retry_slot still needs to be re-routed, - * and call this function again or perform a regular update accordingly. + * concurrently updated. In that case, the caller must check if the updated + * tuple (in updateCxt->cpUpdateRetrySlot) still needs to be re-routed, and + * call this function again or perform a regular update accordingly. */ static bool ExecCrossPartitionUpdate(ModifyTableContext *context, From 50b1e8c51b3c779bdfce5cd61bf4bbc80fd48377 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 19 Mar 2022 11:32:18 -0700 Subject: [PATCH 178/772] ci: windows: Use CIRRUS_ESCAPING_PROCESSES, revert 770011e3f39. cirrus-ci now defaults to killing processes still running at the end of a script. Unfortunately we start postgres in the background, which seems nontrivial to fix. Previously we worked around that in 770011e3f39 by using an older agent version, but now that CIRRUS_ESCAPING_PROCESSES we should use that. This reverts commit 770011e3f39f21f2095d3a044b72460c4efac345 "ci: windows: Work around cirrus-ci bug causing test failures. Discussion: https://postgr.es/m/CA+hUKGKx7k14n2nAALSvv6M_AB6oHasNBA65X6Dvo8hwfi9y0A@mail.gmail.com --- .cirrus.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 6929a0d65a..e5335fede7 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -375,11 +375,12 @@ task: # "suites". T_C: "\"C:/Program Files/Git/usr/bin/timeout.exe\" -v -k60s 15m" - # Temporarily work around cirrus-ci bug causing processes started from a - # script to be killed, even if intentionally running in background. See - # https://github.com/cirruslabs/cirrus-ci-agent/issues/218 - # https://postgr.es/m/CA%2BhUKGKx7k14n2nAALSvv6M_AB6oHasNBA65X6Dvo8hwfi9y0A%40mail.gmail.com - CIRRUS_AGENT_VERSION: 1.73.2 + # startcreate_script starts a postgres instance that we don't want to get + # killed at the end of that script (it's stopped in stop_script). Can't + # trivially use background_scripts because a) need pg_ctl's dropping of + # permissions b) need to wait for startup to have finished, and we don't + # currently have a tool for that... + CIRRUS_ESCAPING_PROCESSES: 1 only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*windows.*' From a3a75b982b5bb6fba95ad8b3d48e70439dcd2329 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 19 Mar 2022 11:32:18 -0700 Subject: [PATCH 179/772] pgstat: run pgindent on pgstat.c/h. Upcoming commits will touch a lot of the pgstats code. Reindenting separately makes it easier to keep the code in a well-formatted shape each step. Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/backend/postmaster/pgstat.c | 28 ++++++++++++++++------------ src/include/pgstat.h | 4 ++-- src/tools/pgindent/typedefs.list | 3 +++ 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 53ddd930e6..8df60f2681 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -265,7 +265,7 @@ typedef struct TwoPhasePgStatRecord PgStat_Counter deleted_pre_truncdrop; Oid t_id; /* table's OID */ bool t_shared; /* is it a shared catalog? */ - bool t_truncdropped; /* was the relation truncated/dropped? */ + bool t_truncdropped; /* was the relation truncated/dropped? */ } TwoPhasePgStatRecord; /* @@ -2622,11 +2622,11 @@ AtEOSubXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit, in { /* * When there isn't an immediate parent state, we can just - * reuse the record instead of going through a - * palloc/pfree pushup (this works since it's all in - * TopTransactionContext anyway). We have to re-link it - * into the parent level, though, and that might mean - * pushing a new entry into the pgStatXactStack. + * reuse the record instead of going through a palloc/pfree + * pushup (this works since it's all in TopTransactionContext + * anyway). We have to re-link it into the parent level, + * though, and that might mean pushing a new entry into the + * pgStatXactStack. */ PgStat_SubXactStatus *upper_xact_state; @@ -3352,9 +3352,9 @@ pgstat_send_wal(bool force) WalUsage walusage; /* - * Calculate how much WAL usage counters were increased by - * subtracting the previous counters from the current ones. Fill the - * results in WAL stats message. + * Calculate how much WAL usage counters were increased by subtracting + * the previous counters from the current ones. Fill the results in + * WAL stats message. */ MemSet(&walusage, 0, sizeof(WalUsage)); WalUsageAccumDiff(&walusage, &pgWalUsage, &prevWalUsage); @@ -4211,7 +4211,7 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep) bool found; const char *statfile = permanent ? PGSTAT_STAT_PERMANENT_FILENAME : pgstat_stat_filename; int i; - TimestampTz ts; + TimestampTz ts; /* * The tables will live in pgStatLocalContext. @@ -4473,7 +4473,7 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep) PgStat_StatSubEntry *subentry; if (fread(&subbuf, 1, sizeof(PgStat_StatSubEntry), fpin) - != sizeof(PgStat_StatSubEntry)) + != sizeof(PgStat_StatSubEntry)) { ereport(pgStatRunningInCollector ? LOG : WARNING, (errmsg("corrupted statistics file \"%s\"", @@ -5250,6 +5250,7 @@ pgstat_recv_tabstat(PgStat_MsgTabstat *msg, int len) tabentry->tuples_updated += tabmsg->t_counts.t_tuples_updated; tabentry->tuples_deleted += tabmsg->t_counts.t_tuples_deleted; tabentry->tuples_hot_updated += tabmsg->t_counts.t_tuples_hot_updated; + /* * If table was truncated/dropped, first reset the live/dead * counters. @@ -5412,7 +5413,10 @@ pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len) { if (msg->m_resettarget == RESET_BGWRITER) { - /* Reset the global, bgwriter and checkpointer statistics for the cluster. */ + /* + * Reset the global, bgwriter and checkpointer statistics for the + * cluster. + */ memset(&globalStats, 0, sizeof(globalStats)); globalStats.bgwriter.stat_reset_timestamp = GetCurrentTimestamp(); } diff --git a/src/include/pgstat.h b/src/include/pgstat.h index be2f7e2bcc..95f595353d 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -190,8 +190,8 @@ typedef struct PgStat_TableXactStatus PgStat_Counter tuples_inserted; /* tuples inserted in (sub)xact */ PgStat_Counter tuples_updated; /* tuples updated in (sub)xact */ PgStat_Counter tuples_deleted; /* tuples deleted in (sub)xact */ - bool truncdropped; /* relation truncated/dropped in this - * (sub)xact */ + bool truncdropped; /* relation truncated/dropped in this + * (sub)xact */ /* tuples i/u/d prior to truncate/drop */ PgStat_Counter inserted_pre_truncdrop; PgStat_Counter updated_pre_truncdrop; diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index d8e228d89a..93d5190508 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1917,6 +1917,8 @@ PgFdwScanState PgIfAddrCallback PgStat_ArchiverStats PgStat_BackendFunctionEntry +PgStat_BgWriterStats +PgStat_CheckpointerStats PgStat_Counter PgStat_FunctionCallUsage PgStat_FunctionCounts @@ -1928,6 +1930,7 @@ PgStat_MsgAnlAncestors PgStat_MsgArchiver PgStat_MsgAutovacStart PgStat_MsgBgWriter +PgStat_MsgCheckpointer PgStat_MsgChecksumFailure PgStat_MsgConnect PgStat_MsgDeadlock From 89c546c2948904a2c811ccb26d92fb54edaf7821 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 19 Mar 2022 11:32:18 -0700 Subject: [PATCH 180/772] pgstat: split relation, database handling out of pgstat_report_stat(). pgstat_report_stat() handles several types of stats, yet relation stats have so far been handled directly in pgstat_report_stat(). A later commit will move the handling of the different kinds of stats into separate files. By splitting out relation handling in this commit that later move will just move code around without other changes. Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/backend/postmaster/pgstat.c | 79 +++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 23 deletions(-) diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 8df60f2681..5c3d286239 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -222,6 +222,12 @@ static HTAB *pgStatTabHash = NULL; */ static HTAB *pgStatFunctions = NULL; +/* + * Indicates if backend has some relation stats that it hasn't yet + * sent to the collector. + */ +static bool have_relation_stats = false; + /* * Indicates if backend has some function stats that it hasn't yet * sent to the collector. @@ -338,7 +344,9 @@ static bool pgstat_db_requested(Oid databaseid); static PgStat_StatReplSlotEntry *pgstat_get_replslot_entry(NameData name, bool create_it); static void pgstat_reset_replslot(PgStat_StatReplSlotEntry *slotstats, TimestampTz ts); +static void pgstat_send_tabstats(TimestampTz now, bool disconnect); static void pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg, TimestampTz now); +static void pgstat_update_dbstats(PgStat_MsgTabstat *tsmsg, TimestampTz now); static void pgstat_send_funcstats(void); static void pgstat_send_slru(void); static HTAB *pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid); @@ -866,15 +874,9 @@ allow_immediate_pgstat_restart(void) void pgstat_report_stat(bool disconnect) { - /* we assume this inits to all zeroes: */ - static const PgStat_TableCounts all_zeroes; static TimestampTz last_report = 0; TimestampTz now; - PgStat_MsgTabstat regular_msg; - PgStat_MsgTabstat shared_msg; - TabStatusArray *tsa; - int i; pgstat_assert_is_up(); @@ -887,7 +889,7 @@ pgstat_report_stat(bool disconnect) * generates no WAL records can write or sync WAL data when flushing the * data pages. */ - if ((pgStatTabList == NULL || pgStatTabList->tsa_used == 0) && + if (!have_relation_stats && pgStatXactCommit == 0 && pgStatXactRollback == 0 && pgWalUsage.wal_records == prevWalUsage.wal_records && WalStats.m_wal_write == 0 && WalStats.m_wal_sync == 0 && @@ -908,6 +910,32 @@ pgstat_report_stat(bool disconnect) if (disconnect) pgstat_report_disconnect(MyDatabaseId); + /* First, send relation statistics */ + pgstat_send_tabstats(now, disconnect); + + /* Now, send function statistics */ + pgstat_send_funcstats(); + + /* Send WAL statistics */ + pgstat_send_wal(true); + + /* Finally send SLRU statistics */ + pgstat_send_slru(); +} + +/* + * Subroutine for pgstat_report_stat: Send relation statistics + */ +static void +pgstat_send_tabstats(TimestampTz now, bool disconnect) +{ + /* we assume this inits to all zeroes: */ + static const PgStat_TableCounts all_zeroes; + PgStat_MsgTabstat regular_msg; + PgStat_MsgTabstat shared_msg; + TabStatusArray *tsa; + int i; + /* * Destroy pgStatTabHash before we start invalidating PgStat_TableEntry * entries it points to. (Should we fail partway through the loop below, @@ -980,18 +1008,11 @@ pgstat_report_stat(bool disconnect) if (shared_msg.m_nentries > 0) pgstat_send_tabstat(&shared_msg, now); - /* Now, send function statistics */ - pgstat_send_funcstats(); - - /* Send WAL statistics */ - pgstat_send_wal(true); - - /* Finally send SLRU statistics */ - pgstat_send_slru(); + have_relation_stats = false; } /* - * Subroutine for pgstat_report_stat: finish and send a tabstat message + * Subroutine for pgstat_send_tabstats: finish and send one tabstat message */ static void pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg, TimestampTz now) @@ -1007,6 +1028,23 @@ pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg, TimestampTz now) * Report and reset accumulated xact commit/rollback and I/O timings * whenever we send a normal tabstat message */ + pgstat_update_dbstats(tsmsg, now); + + n = tsmsg->m_nentries; + len = offsetof(PgStat_MsgTabstat, m_entry[0]) + + n * sizeof(PgStat_TableEntry); + + pgstat_setheader(&tsmsg->m_hdr, PGSTAT_MTYPE_TABSTAT); + pgstat_send(tsmsg, len); +} + +/* + * Subroutine for pgstat_send_tabstat: Handle xact commit/rollback and I/O + * timings. + */ +static void +pgstat_update_dbstats(PgStat_MsgTabstat *tsmsg, TimestampTz now) +{ if (OidIsValid(tsmsg->m_databaseid)) { tsmsg->m_xact_commit = pgStatXactCommit; @@ -1052,13 +1090,6 @@ pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg, TimestampTz now) tsmsg->m_active_time = 0; tsmsg->m_idle_in_xact_time = 0; } - - n = tsmsg->m_nentries; - len = offsetof(PgStat_MsgTabstat, m_entry[0]) + - n * sizeof(PgStat_TableEntry); - - pgstat_setheader(&tsmsg->m_hdr, PGSTAT_MTYPE_TABSTAT); - pgstat_send(tsmsg, len); } /* @@ -2179,6 +2210,8 @@ get_tabstat_entry(Oid rel_id, bool isshared) pgstat_assert_is_up(); + have_relation_stats = true; + /* * Create hash table if we don't have it already. */ From 78f9506b380f0cd3eb2229e2a49040ee00f102bb Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 19 Mar 2022 11:35:37 -0700 Subject: [PATCH 181/772] pgstat: split out WAL handling from pgstat_{initialize,report_stat}. A later commit will move the handling of the different kinds of stats into separate files. By splitting out WAL handling in this commit that later move will just move code around without other changes. Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/backend/postmaster/pgstat.c | 44 ++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 5c3d286239..e74a66d743 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -348,6 +348,8 @@ static void pgstat_send_tabstats(TimestampTz now, bool disconnect); static void pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg, TimestampTz now); static void pgstat_update_dbstats(PgStat_MsgTabstat *tsmsg, TimestampTz now); static void pgstat_send_funcstats(void); +static void pgstat_wal_initialize(void); +static bool pgstat_wal_pending(void); static void pgstat_send_slru(void); static HTAB *pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid); static bool pgstat_should_report_connstat(void); @@ -882,17 +884,10 @@ pgstat_report_stat(bool disconnect) /* * Don't expend a clock check if nothing to do. - * - * To determine whether any WAL activity has occurred since last time, not - * only the number of generated WAL records but also the numbers of WAL - * writes and syncs need to be checked. Because even transaction that - * generates no WAL records can write or sync WAL data when flushing the - * data pages. */ if (!have_relation_stats && pgStatXactCommit == 0 && pgStatXactRollback == 0 && - pgWalUsage.wal_records == prevWalUsage.wal_records && - WalStats.m_wal_write == 0 && WalStats.m_wal_sync == 0 && + !pgstat_wal_pending() && !have_function_stats && !disconnect) return; @@ -3168,12 +3163,7 @@ pgstat_initialize(void) { Assert(!pgstat_is_initialized); - /* - * Initialize prevWalUsage with pgWalUsage so that pgstat_send_wal() can - * calculate how much pgWalUsage counters are increased by subtracting - * prevWalUsage from pgWalUsage. - */ - prevWalUsage = pgWalUsage; + pgstat_wal_initialize(); /* Set up a process-exit hook to clean up */ before_shmem_exit(pgstat_shutdown_hook, 0); @@ -3415,6 +3405,32 @@ pgstat_send_wal(bool force) MemSet(&WalStats, 0, sizeof(WalStats)); } +static void +pgstat_wal_initialize(void) +{ + /* + * Initialize prevWalUsage with pgWalUsage so that pgstat_send_wal() can + * calculate how much pgWalUsage counters are increased by subtracting + * prevWalUsage from pgWalUsage. + */ + prevWalUsage = pgWalUsage; +} + +/* + * To determine whether any WAL activity has occurred since last time, not + * only the number of generated WAL records but also the numbers of WAL + * writes and syncs need to be checked. Because even transaction that + * generates no WAL records can write or sync WAL data when flushing the + * data pages. + */ +static bool +pgstat_wal_pending(void) +{ + return pgWalUsage.wal_records != prevWalUsage.wal_records || + WalStats.m_wal_write != 0 || + WalStats.m_wal_sync != 0; +} + /* ---------- * pgstat_send_slru() - * From 3c0c5cc5e65906bad6abe6bb8c2d9f6669870f33 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 19 Mar 2022 12:37:28 -0700 Subject: [PATCH 182/772] Add a few recent and not so recent revs to git-blame-ignore-revs. --- .git-blame-ignore-revs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 3169c439fa..466986554c 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -14,12 +14,21 @@ # # $ git log --pretty=format:"%H # %cd %n# %s" $PGINDENTGITHASH -1 --date=iso +a3a75b982b5bb6fba95ad8b3d48e70439dcd2329 # 2022-03-19 11:42:22 -0700 +# pgstat: run pgindent on pgstat.c/h. + +d231be00cbf29bf24e5b4fc79e587982bbc00ebb # 2022-02-16 09:22:34 +0200 +# Run pgindent on xlog.c. + e1c1c30f635390b6a3ae4993e8cac213a33e6e3f # 2021-06-28 11:05:54 -0400 # Pre branch pgindent / pgperltidy run def5b065ff22a16a80084587613599fe15627213 # 2021-05-12 13:14:10 -0400 # Initial pgindent and pgperltidy run for v14. +ed43677e20369040ca4e50c698010c39d5ac0f47 # 2021-01-19 08:10:13 +0530 +# pgindent worker.c. + 8b411b8ff41566a1aa601d1f05aeebbebbdb4a54 # 2021-01-13 16:14:38 -0500 # Run reformat-dat-files to declutter the catalog data files. From 3a671e1f7cb8b29ad77b08f891b8f22621f490a3 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sun, 20 Mar 2022 10:21:45 +0100 Subject: [PATCH 183/772] Fix global ICU collations for ICU < 54 createdb() didn't check for collation attributes validity, which has to be done explicitly on ICU < 54. It also forgot to close the ICU collator opened during the check which leaks some memory. To fix both, add a new check_icu_locale() that does all the appropriate verification and close the ICU collator. initdb also had some partial check for ICU < 54. To have consistent error reporting across major ICU versions, and get rid of the need to include ucol.h, remove the partial check there. The backend will report an error if needed during the post-boostrap iniitialization phase. Author: Julien Rouhaud Discussion: https://www.postgresql.org/message-id/20220319041459.qqqiqh335sga5ezj@jrouhaud --- src/backend/commands/dbcommands.c | 18 +----------------- src/backend/utils/adt/pg_locale.c | 28 ++++++++++++++++++++++++++++ src/bin/initdb/Makefile | 2 +- src/bin/initdb/initdb.c | 22 +++------------------- src/bin/initdb/t/001_initdb.pl | 2 +- src/include/utils/pg_locale.h | 1 + src/test/icu/t/010_database.pl | 4 ++-- 7 files changed, 37 insertions(+), 40 deletions(-) diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 962e11dd8f..623e5ec778 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -458,23 +458,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) } if (dblocprovider == COLLPROVIDER_ICU) - { -#ifdef USE_ICU - UErrorCode status; - - status = U_ZERO_ERROR; - ucol_open(dbiculocale, &status); - if (U_FAILURE(status)) - ereport(ERROR, - (errmsg("could not open collator for locale \"%s\": %s", - dbiculocale, u_errorName(status)))); -#else - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("ICU is not supported in this build"), \ - errhint("You need to rebuild PostgreSQL using %s.", "--with-icu"))); -#endif - } + check_icu_locale(dbiculocale); /* * Check that the new encoding and locale settings match the source diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index 4019255f8e..c84fdd8525 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -1985,6 +1985,34 @@ icu_set_collation_attributes(UCollator *collator, const char *loc) #endif /* USE_ICU */ +/* + * Check if the given locale ID is valid, and ereport(ERROR) if it isn't. + */ +void +check_icu_locale(const char *icu_locale) +{ +#ifdef USE_ICU + UCollator *collator; + UErrorCode status; + + status = U_ZERO_ERROR; + collator = ucol_open(icu_locale, &status); + if (U_FAILURE(status)) + ereport(ERROR, + (errmsg("could not open collator for locale \"%s\": %s", + icu_locale, u_errorName(status)))); + + if (U_ICU_VERSION_MAJOR_NUM < 54) + icu_set_collation_attributes(collator, icu_locale); + ucol_close(collator); +#else + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("ICU is not supported in this build"), \ + errhint("You need to rebuild PostgreSQL using %s.", "--with-icu"))); +#endif +} + /* * These functions convert from/to libc's wchar_t, *not* pg_wchar_t. * Therefore we keep them here rather than with the mbutils code. diff --git a/src/bin/initdb/Makefile b/src/bin/initdb/Makefile index 8dd25e7afc..b0dd13dfbd 100644 --- a/src/bin/initdb/Makefile +++ b/src/bin/initdb/Makefile @@ -40,7 +40,7 @@ OBJS = \ all: initdb initdb: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils - $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) $(ICU_LIBS) -o $@$(X) + $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) # We must pull in localtime.c from src/timezones localtime.c: % : $(top_srcdir)/src/timezone/% diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index cbcd55288f..5e36943ef3 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -55,10 +55,6 @@ #include #include -#ifdef USE_ICU -#include -#endif - #ifdef HAVE_SHM_OPEN #include "sys/mman.h" #endif @@ -2205,22 +2201,10 @@ setlocales(void) } /* - * Check ICU locale ID + * In supported builds, the ICU locale ID will be checked by the + * backend when performing the post-boostrap initialization. */ -#ifdef USE_ICU - { - UErrorCode status; - - status = U_ZERO_ERROR; - ucol_open(icu_locale, &status); - if (U_FAILURE(status)) - { - pg_log_error("could not open collator for locale \"%s\": %s", - icu_locale, u_errorName(status)); - exit(1); - } - } -#else +#ifndef USE_ICU pg_log_error("ICU is not supported in this build"); fprintf(stderr, _("You need to rebuild PostgreSQL using %s.\n"), "--with-icu"); exit(1); diff --git a/src/bin/initdb/t/001_initdb.pl b/src/bin/initdb/t/001_initdb.pl index c636bf3ab2..a3397777cf 100644 --- a/src/bin/initdb/t/001_initdb.pl +++ b/src/bin/initdb/t/001_initdb.pl @@ -105,7 +105,7 @@ 'option --icu-locale'); command_fails_like(['initdb', '--no-sync', '--locale-provider=icu', '--icu-locale=@colNumeric=lower', "$tempdir/dataX"], - qr/initdb: error: could not open collator for locale/, + qr/FATAL: could not open collator for locale/, 'fails for invalid ICU locale'); } else diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h index 9b158f24a0..a44e17ffdf 100644 --- a/src/include/utils/pg_locale.h +++ b/src/include/utils/pg_locale.h @@ -116,6 +116,7 @@ extern char *get_collation_actual_version(char collprovider, const char *collcol extern int32_t icu_to_uchar(UChar **buff_uchar, const char *buff, size_t nbytes); extern int32_t icu_from_uchar(char **result, const UChar *buff_uchar, int32_t len_uchar); #endif +extern void check_icu_locale(const char *icu_locale); /* These functions convert from/to libc's wchar_t, *not* pg_wchar_t */ extern size_t wchar2char(char *to, const wchar_t *from, size_t tolen, diff --git a/src/test/icu/t/010_database.pl b/src/test/icu/t/010_database.pl index d50941b53d..07a1084b09 100644 --- a/src/test/icu/t/010_database.pl +++ b/src/test/icu/t/010_database.pl @@ -16,11 +16,11 @@ $node1->start; $node1->safe_psql('postgres', - q{CREATE DATABASE dbicu LOCALE_PROVIDER icu LOCALE 'C' ICU_LOCALE 'en-u-kf-upper' ENCODING 'UTF8' TEMPLATE template0}); + q{CREATE DATABASE dbicu LOCALE_PROVIDER icu LOCALE 'C' ICU_LOCALE 'en@colCaseFirst=upper' ENCODING 'UTF8' TEMPLATE template0}); $node1->safe_psql('dbicu', q{ -CREATE COLLATION upperfirst (provider = icu, locale = 'en-u-kf-upper'); +CREATE COLLATION upperfirst (provider = icu, locale = 'en@colCaseFirst=upper'); CREATE TABLE icu (def text, en text COLLATE "en-x-icu", upfirst text COLLATE upperfirst); INSERT INTO icu VALUES ('a', 'a', 'a'), ('b', 'b', 'b'), ('A', 'A', 'A'), ('B', 'B', 'B'); }); From 3f513ac7935db86f72511aac24fa6b52ed29bfe7 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 20 Mar 2022 12:39:40 -0400 Subject: [PATCH 184/772] Doc: fix our example systemd script. The example used "TimeoutSec=0", but systemd's documented way to get the desired effect is "TimeoutSec=infinity". Discussion: https://postgr.es/m/164770078557.670.5467111518383664377@wrigleys.postgresql.org --- doc/src/sgml/runtime.sgml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml index f77ed24204..ffb0b6f287 100644 --- a/doc/src/sgml/runtime.sgml +++ b/doc/src/sgml/runtime.sgml @@ -488,7 +488,7 @@ ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed KillSignal=SIGINT -TimeoutSec=0 +TimeoutSec=infinity [Install] WantedBy=multi-user.target @@ -500,11 +500,11 @@ WantedBy=multi-user.target Consider carefully the timeout setting. systemd has a default timeout of 90 - seconds as of this writing and will kill a process that does not notify + seconds as of this writing and will kill a process that does not report readiness within that time. But a PostgreSQL server that might have to perform crash recovery at startup could take - much longer to become ready. The suggested value of 0 disables the - timeout logic. + much longer to become ready. The suggested value + of infinity disables the timeout logic. From ba9a7e392171c83eb3332a757279e7088487f9a2 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Sun, 20 Mar 2022 18:43:40 +0100 Subject: [PATCH 185/772] Enforce foreign key correctly during cross-partition updates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When an update on a partitioned table referenced in foreign key constraints causes a row to move from one partition to another, the fact that the move is implemented as a delete followed by an insert on the target partition causes the foreign key triggers to have surprising behavior. For example, a given foreign key's delete trigger which implements the ON DELETE CASCADE clause of that key will delete any referencing rows when triggered for that internal DELETE, although it should not, because the referenced row is simply being moved from one partition of the referenced root partitioned table into another, not being deleted from it. This commit teaches trigger.c to skip queuing such delete trigger events on the leaf partitions in favor of an UPDATE event fired on the root target relation. Doing so is sensible because both the old and the new tuple "logically" belong to the root relation. The after trigger event queuing interface now allows passing the source and the target partitions of a particular cross-partition update when registering the update event for the root partitioned table. Along with the two ctids of the old and the new tuple, the after trigger event now also stores the OIDs of those partitions. The tuples fetched from the source and the target partitions are converted into the root table format, if necessary, before they are passed to the trigger function. The implementation currently has a limitation that only the foreign keys pointing into the query's target relation are considered, not those of its sub-partitioned partitions. That seems like a reasonable limitation, because it sounds rare to have distinct foreign keys pointing to sub-partitioned partitions instead of to the root table. This misbehavior stems from commit f56f8f8da6af (which added support for foreign keys to reference partitioned tables) not paying sufficient attention to commit 2f178441044b (which had introduced cross-partition updates a year earlier). Even though the former commit goes back to Postgres 12, we're not backpatching this fix at this time for fear of destabilizing things too much, and because there are a few ABI breaks in it that we'd have to work around in older branches. It also depends on commit f4566345cf40, which had its own share of backpatchability issues as well. Author: Amit Langote Reviewed-by: Masahiko Sawada Reviewed-by: Álvaro Herrera Reported-by: Eduard Català Discussion: https://postgr.es/m/CA+HiwqFvkBCmfwkQX_yBqv2Wz8ugUGiBDxum8=WvVbfU1TXaNg@mail.gmail.com Discussion: https://postgr.es/m/CAL54xNZsLwEM1XCk5yW9EqaRzsZYHuWsHQkA2L5MOSKXAwviCQ@mail.gmail.com --- doc/src/sgml/ref/update.sgml | 7 + src/backend/commands/trigger.c | 394 +++++++++++++++++++--- src/backend/executor/execMain.c | 86 ++++- src/backend/executor/execReplication.c | 5 +- src/backend/executor/nodeModifyTable.c | 151 ++++++++- src/backend/utils/adt/ri_triggers.c | 6 + src/include/commands/trigger.h | 8 +- src/include/executor/executor.h | 4 +- src/include/nodes/execnodes.h | 6 + src/test/regress/expected/foreign_key.out | 204 ++++++++++- src/test/regress/sql/foreign_key.sql | 135 +++++++- 11 files changed, 926 insertions(+), 80 deletions(-) diff --git a/doc/src/sgml/ref/update.sgml b/doc/src/sgml/ref/update.sgml index 3fa54e5f70..3a0285df79 100644 --- a/doc/src/sgml/ref/update.sgml +++ b/doc/src/sgml/ref/update.sgml @@ -316,6 +316,13 @@ UPDATE count partition (provided the foreign data wrapper supports tuple routing), they cannot be moved from a foreign-table partition to another partition. + + + An attempt of moving a row from one partition to another will fail if a + foreign key is found to directly reference an ancestor of the source + partition that is not the same as the ancestor that's mentioned in the + UPDATE query. + diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index e08bd9a370..fce79b02a5 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -95,10 +95,13 @@ static HeapTuple ExecCallTriggerFunc(TriggerData *trigdata, Instrumentation *instr, MemoryContext per_tuple_context); static void AfterTriggerSaveEvent(EState *estate, ResultRelInfo *relinfo, + ResultRelInfo *src_partinfo, + ResultRelInfo *dst_partinfo, int event, bool row_trigger, TupleTableSlot *oldtup, TupleTableSlot *newtup, List *recheckIndexes, Bitmapset *modifiedCols, - TransitionCaptureState *transition_capture); + TransitionCaptureState *transition_capture, + bool is_crosspart_update); static void AfterTriggerEnlargeQueryState(void); static bool before_stmt_triggers_fired(Oid relid, CmdType cmdType); @@ -2458,8 +2461,10 @@ ExecASInsertTriggers(EState *estate, ResultRelInfo *relinfo, TriggerDesc *trigdesc = relinfo->ri_TrigDesc; if (trigdesc && trigdesc->trig_insert_after_statement) - AfterTriggerSaveEvent(estate, relinfo, TRIGGER_EVENT_INSERT, - false, NULL, NULL, NIL, NULL, transition_capture); + AfterTriggerSaveEvent(estate, relinfo, NULL, NULL, + TRIGGER_EVENT_INSERT, + false, NULL, NULL, NIL, NULL, transition_capture, + false); } bool @@ -2547,10 +2552,12 @@ ExecARInsertTriggers(EState *estate, ResultRelInfo *relinfo, if ((trigdesc && trigdesc->trig_insert_after_row) || (transition_capture && transition_capture->tcs_insert_new_table)) - AfterTriggerSaveEvent(estate, relinfo, TRIGGER_EVENT_INSERT, + AfterTriggerSaveEvent(estate, relinfo, NULL, NULL, + TRIGGER_EVENT_INSERT, true, NULL, slot, recheckIndexes, NULL, - transition_capture); + transition_capture, + false); } bool @@ -2672,8 +2679,10 @@ ExecASDeleteTriggers(EState *estate, ResultRelInfo *relinfo, TriggerDesc *trigdesc = relinfo->ri_TrigDesc; if (trigdesc && trigdesc->trig_delete_after_statement) - AfterTriggerSaveEvent(estate, relinfo, TRIGGER_EVENT_DELETE, - false, NULL, NULL, NIL, NULL, transition_capture); + AfterTriggerSaveEvent(estate, relinfo, NULL, NULL, + TRIGGER_EVENT_DELETE, + false, NULL, NULL, NIL, NULL, transition_capture, + false); } /* @@ -2768,11 +2777,17 @@ ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, return result; } +/* + * Note: is_crosspart_update must be true if the DELETE is being performed + * as part of a cross-partition update. + */ void -ExecARDeleteTriggers(EState *estate, ResultRelInfo *relinfo, +ExecARDeleteTriggers(EState *estate, + ResultRelInfo *relinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, - TransitionCaptureState *transition_capture) + TransitionCaptureState *transition_capture, + bool is_crosspart_update) { TriggerDesc *trigdesc = relinfo->ri_TrigDesc; @@ -2793,9 +2808,11 @@ ExecARDeleteTriggers(EState *estate, ResultRelInfo *relinfo, else ExecForceStoreHeapTuple(fdw_trigtuple, slot, false); - AfterTriggerSaveEvent(estate, relinfo, TRIGGER_EVENT_DELETE, + AfterTriggerSaveEvent(estate, relinfo, NULL, NULL, + TRIGGER_EVENT_DELETE, true, slot, NULL, NIL, NULL, - transition_capture); + transition_capture, + is_crosspart_update); } } @@ -2914,10 +2931,12 @@ ExecASUpdateTriggers(EState *estate, ResultRelInfo *relinfo, Assert(relinfo->ri_RootResultRelInfo == NULL); if (trigdesc && trigdesc->trig_update_after_statement) - AfterTriggerSaveEvent(estate, relinfo, TRIGGER_EVENT_UPDATE, + AfterTriggerSaveEvent(estate, relinfo, NULL, NULL, + TRIGGER_EVENT_UPDATE, false, NULL, NULL, NIL, ExecGetAllUpdatedCols(relinfo, estate), - transition_capture); + transition_capture, + false); } bool @@ -3052,13 +3071,26 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, return true; } +/* + * Note: 'src_partinfo' and 'dst_partinfo', when non-NULL, refer to the source + * and destination partitions, respectively, of a cross-partition update of + * the root partitioned table mentioned in the query, given by 'relinfo'. + * 'tupleid' in that case refers to the ctid of the "old" tuple in the source + * partition, and 'newslot' contains the "new" tuple in the destination + * partition. This interface allows to support the requirements of + * ExecCrossPartitionUpdateForeignKey(); is_crosspart_update must be true in + * that case. + */ void ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, + ResultRelInfo *src_partinfo, + ResultRelInfo *dst_partinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, TupleTableSlot *newslot, List *recheckIndexes, - TransitionCaptureState *transition_capture) + TransitionCaptureState *transition_capture, + bool is_crosspart_update) { TriggerDesc *trigdesc = relinfo->ri_TrigDesc; @@ -3073,12 +3105,19 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, * separately for DELETE and INSERT to capture transition table rows. * In such case, either old tuple or new tuple can be NULL. */ - TupleTableSlot *oldslot = ExecGetTriggerOldSlot(estate, relinfo); + TupleTableSlot *oldslot; + ResultRelInfo *tupsrc; + + Assert((src_partinfo != NULL && dst_partinfo != NULL) || + !is_crosspart_update); + + tupsrc = src_partinfo ? src_partinfo : relinfo; + oldslot = ExecGetTriggerOldSlot(estate, tupsrc); if (fdw_trigtuple == NULL && ItemPointerIsValid(tupleid)) GetTupleForTrigger(estate, NULL, - relinfo, + tupsrc, tupleid, LockTupleExclusive, oldslot, @@ -3088,10 +3127,14 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, else ExecClearTuple(oldslot); - AfterTriggerSaveEvent(estate, relinfo, TRIGGER_EVENT_UPDATE, - true, oldslot, newslot, recheckIndexes, + AfterTriggerSaveEvent(estate, relinfo, + src_partinfo, dst_partinfo, + TRIGGER_EVENT_UPDATE, + true, + oldslot, newslot, recheckIndexes, ExecGetAllUpdatedCols(relinfo, estate), - transition_capture); + transition_capture, + is_crosspart_update); } } @@ -3214,8 +3257,11 @@ ExecASTruncateTriggers(EState *estate, ResultRelInfo *relinfo) TriggerDesc *trigdesc = relinfo->ri_TrigDesc; if (trigdesc && trigdesc->trig_truncate_after_statement) - AfterTriggerSaveEvent(estate, relinfo, TRIGGER_EVENT_TRUNCATE, - false, NULL, NULL, NIL, NULL, NULL); + AfterTriggerSaveEvent(estate, relinfo, + NULL, NULL, + TRIGGER_EVENT_TRUNCATE, + false, NULL, NULL, NIL, NULL, NULL, + false); } @@ -3496,9 +3542,9 @@ typedef SetConstraintStateData *SetConstraintState; * Per-trigger-event data * * The actual per-event data, AfterTriggerEventData, includes DONE/IN_PROGRESS - * status bits and up to two tuple CTIDs. Each event record also has an - * associated AfterTriggerSharedData that is shared across all instances of - * similar events within a "chunk". + * status bits, up to two tuple CTIDs, and optionally two OIDs of partitions. + * Each event record also has an associated AfterTriggerSharedData that is + * shared across all instances of similar events within a "chunk". * * For row-level triggers, we arrange not to waste storage on unneeded ctid * fields. Updates of regular tables use two; inserts and deletes of regular @@ -3509,6 +3555,11 @@ typedef SetConstraintStateData *SetConstraintState; * tuple(s). This permits storing tuples once regardless of the number of * row-level triggers on a foreign table. * + * When updates on partitioned tables cause rows to move between partitions, + * the OIDs of both partitions are stored too, so that the tuples can be + * fetched; such entries are marked AFTER_TRIGGER_CP_UPDATE (for "cross- + * partition update"). + * * Note that we need triggers on foreign tables to be fired in exactly the * order they were queued, so that the tuples come out of the tuplestore in * the right order. To ensure that, we forbid deferrable (constraint) @@ -3531,16 +3582,16 @@ typedef SetConstraintStateData *SetConstraintState; */ typedef uint32 TriggerFlags; -#define AFTER_TRIGGER_OFFSET 0x0FFFFFFF /* must be low-order bits */ -#define AFTER_TRIGGER_DONE 0x10000000 -#define AFTER_TRIGGER_IN_PROGRESS 0x20000000 +#define AFTER_TRIGGER_OFFSET 0x07FFFFFF /* must be low-order bits */ +#define AFTER_TRIGGER_DONE 0x80000000 +#define AFTER_TRIGGER_IN_PROGRESS 0x40000000 /* bits describing the size and tuple sources of this event */ #define AFTER_TRIGGER_FDW_REUSE 0x00000000 -#define AFTER_TRIGGER_FDW_FETCH 0x80000000 -#define AFTER_TRIGGER_1CTID 0x40000000 -#define AFTER_TRIGGER_2CTID 0xC0000000 -#define AFTER_TRIGGER_TUP_BITS 0xC0000000 - +#define AFTER_TRIGGER_FDW_FETCH 0x20000000 +#define AFTER_TRIGGER_1CTID 0x10000000 +#define AFTER_TRIGGER_2CTID 0x30000000 +#define AFTER_TRIGGER_CP_UPDATE 0x08000000 +#define AFTER_TRIGGER_TUP_BITS 0x38000000 typedef struct AfterTriggerSharedData *AfterTriggerShared; typedef struct AfterTriggerSharedData @@ -3560,27 +3611,45 @@ typedef struct AfterTriggerEventData TriggerFlags ate_flags; /* status bits and offset to shared data */ ItemPointerData ate_ctid1; /* inserted, deleted, or old updated tuple */ ItemPointerData ate_ctid2; /* new updated tuple */ + + /* + * During a cross-partition update of a partitioned table, we also store + * the OIDs of source and destination partitions that are needed to fetch + * the old (ctid1) and the new tuple (ctid2) from, respectively. + */ + Oid ate_src_part; + Oid ate_dst_part; } AfterTriggerEventData; -/* AfterTriggerEventData, minus ate_ctid2 */ +/* AfterTriggerEventData, minus ate_src_part, ate_dst_part */ +typedef struct AfterTriggerEventDataNoOids +{ + TriggerFlags ate_flags; + ItemPointerData ate_ctid1; + ItemPointerData ate_ctid2; +} AfterTriggerEventDataNoOids; + +/* AfterTriggerEventData, minus ate_*_part and ate_ctid2 */ typedef struct AfterTriggerEventDataOneCtid { TriggerFlags ate_flags; /* status bits and offset to shared data */ ItemPointerData ate_ctid1; /* inserted, deleted, or old updated tuple */ } AfterTriggerEventDataOneCtid; -/* AfterTriggerEventData, minus ate_ctid1 and ate_ctid2 */ +/* AfterTriggerEventData, minus ate_*_part, ate_ctid1 and ate_ctid2 */ typedef struct AfterTriggerEventDataZeroCtids { TriggerFlags ate_flags; /* status bits and offset to shared data */ } AfterTriggerEventDataZeroCtids; #define SizeofTriggerEvent(evt) \ - (((evt)->ate_flags & AFTER_TRIGGER_TUP_BITS) == AFTER_TRIGGER_2CTID ? \ + (((evt)->ate_flags & AFTER_TRIGGER_TUP_BITS) == AFTER_TRIGGER_CP_UPDATE ? \ sizeof(AfterTriggerEventData) : \ - ((evt)->ate_flags & AFTER_TRIGGER_TUP_BITS) == AFTER_TRIGGER_1CTID ? \ - sizeof(AfterTriggerEventDataOneCtid) : \ - sizeof(AfterTriggerEventDataZeroCtids)) + (((evt)->ate_flags & AFTER_TRIGGER_TUP_BITS) == AFTER_TRIGGER_2CTID ? \ + sizeof(AfterTriggerEventDataNoOids) : \ + (((evt)->ate_flags & AFTER_TRIGGER_TUP_BITS) == AFTER_TRIGGER_1CTID ? \ + sizeof(AfterTriggerEventDataOneCtid) : \ + sizeof(AfterTriggerEventDataZeroCtids)))) #define GetTriggerSharedData(evt) \ ((AfterTriggerShared) ((char *) (evt) + ((evt)->ate_flags & AFTER_TRIGGER_OFFSET))) @@ -3762,6 +3831,8 @@ static AfterTriggersData afterTriggers; static void AfterTriggerExecute(EState *estate, AfterTriggerEvent event, ResultRelInfo *relInfo, + ResultRelInfo *src_relInfo, + ResultRelInfo *dst_relInfo, TriggerDesc *trigdesc, FmgrInfo *finfo, Instrumentation *instr, @@ -4096,8 +4167,16 @@ afterTriggerDeleteHeadEventChunk(AfterTriggersQueryData *qs) * fmgr lookup cache space at the caller level. (For triggers fired at * the end of a query, we can even piggyback on the executor's state.) * + * When fired for a cross-partition update of a partitioned table, the old + * tuple is fetched using 'src_relInfo' (the source leaf partition) and + * the new tuple using 'dst_relInfo' (the destination leaf partition), though + * both are converted into the root partitioned table's format before passing + * to the trigger function. + * * event: event currently being fired. - * rel: open relation for event. + * relInfo: result relation for event. + * src_relInfo: source partition of a cross-partition update + * dst_relInfo: its destination partition * trigdesc: working copy of rel's trigger info. * finfo: array of fmgr lookup cache entries (one per trigger in trigdesc). * instr: array of EXPLAIN ANALYZE instrumentation nodes (one per trigger), @@ -4111,6 +4190,8 @@ static void AfterTriggerExecute(EState *estate, AfterTriggerEvent event, ResultRelInfo *relInfo, + ResultRelInfo *src_relInfo, + ResultRelInfo *dst_relInfo, TriggerDesc *trigdesc, FmgrInfo *finfo, Instrumentation *instr, MemoryContext per_tuple_context, @@ -4118,6 +4199,8 @@ AfterTriggerExecute(EState *estate, TupleTableSlot *trig_tuple_slot2) { Relation rel = relInfo->ri_RelationDesc; + Relation src_rel = src_relInfo->ri_RelationDesc; + Relation dst_rel = dst_relInfo->ri_RelationDesc; AfterTriggerShared evtshared = GetTriggerSharedData(event); Oid tgoid = evtshared->ats_tgoid; TriggerData LocTriggerData = {0}; @@ -4198,12 +4281,35 @@ AfterTriggerExecute(EState *estate, default: if (ItemPointerIsValid(&(event->ate_ctid1))) { - LocTriggerData.tg_trigslot = ExecGetTriggerOldSlot(estate, relInfo); + TupleTableSlot *src_slot = ExecGetTriggerOldSlot(estate, + src_relInfo); - if (!table_tuple_fetch_row_version(rel, &(event->ate_ctid1), + if (!table_tuple_fetch_row_version(src_rel, + &(event->ate_ctid1), SnapshotAny, - LocTriggerData.tg_trigslot)) + src_slot)) elog(ERROR, "failed to fetch tuple1 for AFTER trigger"); + + /* + * Store the tuple fetched from the source partition into the + * target (root partitioned) table slot, converting if needed. + */ + if (src_relInfo != relInfo) + { + TupleConversionMap *map = ExecGetChildToRootMap(src_relInfo); + + LocTriggerData.tg_trigslot = ExecGetTriggerOldSlot(estate, relInfo); + if (map) + { + execute_attr_map_slot(map->attrMap, + src_slot, + LocTriggerData.tg_trigslot); + } + else + ExecCopySlot(LocTriggerData.tg_trigslot, src_slot); + } + else + LocTriggerData.tg_trigslot = src_slot; LocTriggerData.tg_trigtuple = ExecFetchSlotHeapTuple(LocTriggerData.tg_trigslot, false, &should_free_trig); } @@ -4213,16 +4319,40 @@ AfterTriggerExecute(EState *estate, } /* don't touch ctid2 if not there */ - if ((event->ate_flags & AFTER_TRIGGER_TUP_BITS) == - AFTER_TRIGGER_2CTID && + if (((event->ate_flags & AFTER_TRIGGER_TUP_BITS) == AFTER_TRIGGER_2CTID || + (event->ate_flags & AFTER_TRIGGER_CP_UPDATE)) && ItemPointerIsValid(&(event->ate_ctid2))) { - LocTriggerData.tg_newslot = ExecGetTriggerNewSlot(estate, relInfo); + TupleTableSlot *dst_slot = ExecGetTriggerNewSlot(estate, + dst_relInfo); - if (!table_tuple_fetch_row_version(rel, &(event->ate_ctid2), + if (!table_tuple_fetch_row_version(dst_rel, + &(event->ate_ctid2), SnapshotAny, - LocTriggerData.tg_newslot)) + dst_slot)) elog(ERROR, "failed to fetch tuple2 for AFTER trigger"); + + /* + * Store the tuple fetched from the destination partition into + * the target (root partitioned) table slot, converting if + * needed. + */ + if (dst_relInfo != relInfo) + { + TupleConversionMap *map = ExecGetChildToRootMap(dst_relInfo); + + LocTriggerData.tg_newslot = ExecGetTriggerNewSlot(estate, relInfo); + if (map) + { + execute_attr_map_slot(map->attrMap, + dst_slot, + LocTriggerData.tg_newslot); + } + else + ExecCopySlot(LocTriggerData.tg_newslot, dst_slot); + } + else + LocTriggerData.tg_newslot = dst_slot; LocTriggerData.tg_newtuple = ExecFetchSlotHeapTuple(LocTriggerData.tg_newslot, false, &should_free_new); } @@ -4451,13 +4581,17 @@ afterTriggerInvokeEvents(AfterTriggerEventList *events, if ((event->ate_flags & AFTER_TRIGGER_IN_PROGRESS) && evtshared->ats_firing_id == firing_id) { + ResultRelInfo *src_rInfo, + *dst_rInfo; + /* * So let's fire it... but first, find the correct relation if * this is not the same relation as before. */ if (rel == NULL || RelationGetRelid(rel) != evtshared->ats_relid) { - rInfo = ExecGetTriggerResultRel(estate, evtshared->ats_relid); + rInfo = ExecGetTriggerResultRel(estate, evtshared->ats_relid, + NULL); rel = rInfo->ri_RelationDesc; /* Catch calls with insufficient relcache refcounting */ Assert(!RelationHasReferenceCountZero(rel)); @@ -4482,12 +4616,33 @@ afterTriggerInvokeEvents(AfterTriggerEventList *events, evtshared->ats_relid); } + /* + * Look up source and destination partition result rels of a + * cross-partition update event. + */ + if ((event->ate_flags & AFTER_TRIGGER_TUP_BITS) == + AFTER_TRIGGER_CP_UPDATE) + { + Assert(OidIsValid(event->ate_src_part) && + OidIsValid(event->ate_dst_part)); + src_rInfo = ExecGetTriggerResultRel(estate, + event->ate_src_part, + rInfo); + dst_rInfo = ExecGetTriggerResultRel(estate, + event->ate_dst_part, + rInfo); + } + else + src_rInfo = dst_rInfo = rInfo; + /* * Fire it. Note that the AFTER_TRIGGER_IN_PROGRESS flag is * still set, so recursive examinations of the event list * won't try to re-fire it. */ - AfterTriggerExecute(estate, event, rInfo, trigdesc, finfo, instr, + AfterTriggerExecute(estate, event, rInfo, + src_rInfo, dst_rInfo, + trigdesc, finfo, instr, per_tuple_context, slot1, slot2); /* @@ -5767,14 +5922,35 @@ AfterTriggerPendingOnRel(Oid relid) * Transition tuplestores are built now, rather than when events are pulled * off of the queue because AFTER ROW triggers are allowed to select from the * transition tables for the statement. + * + * This contains special support to queue the update events for the case where + * a partitioned table undergoing a cross-partition update may have foreign + * keys pointing into it. Normally, a partitioned table's row triggers are + * not fired because the leaf partition(s) which are modified as a result of + * the operation on the partitioned table contain the same triggers which are + * fired instead. But that general scheme can cause problematic behavior with + * foreign key triggers during cross-partition updates, which are implemented + * as DELETE on the source partition followed by INSERT into the destination + * partition. Specifically, firing DELETE triggers would lead to the wrong + * foreign key action to be enforced considering that the original command is + * UPDATE; in this case, this function is called with relinfo as the + * partitioned table, and src_partinfo and dst_partinfo referring to the + * source and target leaf partitions, respectively. + * + * is_crosspart_update is true either when a DELETE event is fired on the + * source partition (which is to be ignored) or an UPDATE event is fired on + * the root partitioned table. * ---------- */ static void AfterTriggerSaveEvent(EState *estate, ResultRelInfo *relinfo, + ResultRelInfo *src_partinfo, + ResultRelInfo *dst_partinfo, int event, bool row_trigger, TupleTableSlot *oldslot, TupleTableSlot *newslot, List *recheckIndexes, Bitmapset *modifiedCols, - TransitionCaptureState *transition_capture) + TransitionCaptureState *transition_capture, + bool is_crosspart_update) { Relation rel = relinfo->ri_RelationDesc; TriggerDesc *trigdesc = relinfo->ri_TrigDesc; @@ -5854,6 +6030,19 @@ AfterTriggerSaveEvent(EState *estate, ResultRelInfo *relinfo, return; } + /* + * We normally don't see partitioned tables here for row level triggers + * except in the special case of a cross-partition update. In that case, + * nodeModifyTable.c:ExecCrossPartitionUpdateForeignKey() calls here to + * queue an update event on the root target partitioned table, also + * passing the source and destination partitions and their tuples. + */ + Assert(!row_trigger || + rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE || + (is_crosspart_update && + TRIGGER_FIRED_BY_UPDATE(event) && + src_partinfo != NULL && dst_partinfo != NULL)); + /* * Validate the event code and collect the associated tuple CTIDs. * @@ -5914,6 +6103,19 @@ AfterTriggerSaveEvent(EState *estate, ResultRelInfo *relinfo, Assert(newslot != NULL); ItemPointerCopy(&(oldslot->tts_tid), &(new_event.ate_ctid1)); ItemPointerCopy(&(newslot->tts_tid), &(new_event.ate_ctid2)); + + /* + * Also remember the OIDs of partitions to fetch these tuples + * out of later in AfterTriggerExecute(). + */ + if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + { + Assert(src_partinfo != NULL && dst_partinfo != NULL); + new_event.ate_src_part = + RelationGetRelid(src_partinfo->ri_RelationDesc); + new_event.ate_dst_part = + RelationGetRelid(dst_partinfo->ri_RelationDesc); + } } else { @@ -5938,13 +6140,53 @@ AfterTriggerSaveEvent(EState *estate, ResultRelInfo *relinfo, break; } + /* Determine flags */ if (!(relkind == RELKIND_FOREIGN_TABLE && row_trigger)) - new_event.ate_flags = (row_trigger && event == TRIGGER_EVENT_UPDATE) ? - AFTER_TRIGGER_2CTID : AFTER_TRIGGER_1CTID; + { + if (row_trigger && event == TRIGGER_EVENT_UPDATE) + { + if (relkind == RELKIND_PARTITIONED_TABLE) + new_event.ate_flags = AFTER_TRIGGER_CP_UPDATE; + else + new_event.ate_flags = AFTER_TRIGGER_2CTID; + } + else + new_event.ate_flags = AFTER_TRIGGER_1CTID; + } + /* else, we'll initialize ate_flags for each trigger */ tgtype_level = (row_trigger ? TRIGGER_TYPE_ROW : TRIGGER_TYPE_STATEMENT); + /* + * Must convert/copy the source and destination partition tuples into the + * root partitioned table's format/slot, because the processing in the + * loop below expects both oldslot and newslot tuples to be in that form. + */ + if (row_trigger && rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + { + TupleTableSlot *rootslot; + TupleConversionMap *map; + + rootslot = ExecGetTriggerOldSlot(estate, relinfo); + map = ExecGetChildToRootMap(src_partinfo); + if (map) + oldslot = execute_attr_map_slot(map->attrMap, + oldslot, + rootslot); + else + oldslot = ExecCopySlot(rootslot, oldslot); + + rootslot = ExecGetTriggerNewSlot(estate, relinfo); + map = ExecGetChildToRootMap(dst_partinfo); + if (map) + newslot = execute_attr_map_slot(map->attrMap, + newslot, + rootslot); + else + newslot = ExecCopySlot(rootslot, newslot); + } + for (i = 0; i < trigdesc->numtriggers; i++) { Trigger *trigger = &trigdesc->triggers[i]; @@ -5973,13 +6215,30 @@ AfterTriggerSaveEvent(EState *estate, ResultRelInfo *relinfo, /* * If the trigger is a foreign key enforcement trigger, there are * certain cases where we can skip queueing the event because we can - * tell by inspection that the FK constraint will still pass. + * tell by inspection that the FK constraint will still pass. There + * are also some cases during cross-partition updates of a partitioned + * table where queuing the event can be skipped. */ if (TRIGGER_FIRED_BY_UPDATE(event) || TRIGGER_FIRED_BY_DELETE(event)) { switch (RI_FKey_trigger_type(trigger->tgfoid)) { case RI_TRIGGER_PK: + + /* + * For cross-partitioned updates of partitioned PK table, + * skip the event fired by the component delete on the + * source leaf partition unless the constraint originates + * in the partition itself (!tgisclone), because the + * update event that will be fired on the root + * (partitioned) target table will be used to perform the + * necessary foreign key enforcement action. + */ + if (is_crosspart_update && + TRIGGER_FIRED_BY_DELETE(event) && + trigger->tgisclone) + continue; + /* Update or delete on trigger's PK table */ if (!RI_FKey_pk_upd_check_required(trigger, rel, oldslot, newslot)) @@ -5990,8 +6249,20 @@ AfterTriggerSaveEvent(EState *estate, ResultRelInfo *relinfo, break; case RI_TRIGGER_FK: - /* Update on trigger's FK table */ - if (!RI_FKey_fk_upd_check_required(trigger, rel, + + /* + * Update on trigger's FK table. We can skip the update + * event fired on a partitioned table during a + * cross-partition of that table, because the insert event + * that is fired on the destination leaf partition would + * suffice to perform the necessary foreign key check. + * Moreover, RI_FKey_fk_upd_check_required() expects to be + * passed a tuple that contains system attributes, most of + * which are not present in the virtual slot belonging to + * a partitioned table. + */ + if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE || + !RI_FKey_fk_upd_check_required(trigger, rel, oldslot, newslot)) { /* skip queuing this event */ @@ -6000,7 +6271,18 @@ AfterTriggerSaveEvent(EState *estate, ResultRelInfo *relinfo, break; case RI_TRIGGER_NONE: - /* Not an FK trigger */ + + /* + * Not an FK trigger. No need to queue the update event + * fired during a cross-partitioned update of a + * partitioned table, because the same row trigger must be + * present in the leaf partition(s) that are affected as + * part of this update and the events fired on them are + * queued instead. + */ + if (row_trigger && + rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + continue; break; } } diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 549d9eb696..473d2e00a2 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -44,6 +44,7 @@ #include "access/transam.h" #include "access/xact.h" #include "catalog/namespace.h" +#include "catalog/partition.h" #include "catalog/pg_publication.h" #include "commands/matview.h" #include "commands/trigger.h" @@ -1279,7 +1280,8 @@ InitResultRelInfo(ResultRelInfo *resultRelInfo, * in es_trig_target_relations. */ ResultRelInfo * -ExecGetTriggerResultRel(EState *estate, Oid relid) +ExecGetTriggerResultRel(EState *estate, Oid relid, + ResultRelInfo *rootRelInfo) { ResultRelInfo *rInfo; ListCell *l; @@ -1330,7 +1332,7 @@ ExecGetTriggerResultRel(EState *estate, Oid relid) InitResultRelInfo(rInfo, rel, 0, /* dummy rangetable index */ - NULL, + rootRelInfo, estate->es_instrument); estate->es_trig_target_relations = lappend(estate->es_trig_target_relations, rInfo); @@ -1344,6 +1346,69 @@ ExecGetTriggerResultRel(EState *estate, Oid relid) return rInfo; } +/* + * Return the ancestor relations of a given leaf partition result relation + * up to and including the query's root target relation. + * + * These work much like the ones opened by ExecGetTriggerResultRel, except + * that we need to keep them in a separate list. + * + * These are closed by ExecCloseResultRelations. + */ +List * +ExecGetAncestorResultRels(EState *estate, ResultRelInfo *resultRelInfo) +{ + ResultRelInfo *rootRelInfo = resultRelInfo->ri_RootResultRelInfo; + Relation partRel = resultRelInfo->ri_RelationDesc; + Oid rootRelOid; + + if (!partRel->rd_rel->relispartition) + elog(ERROR, "cannot find ancestors of a non-partition result relation"); + Assert(rootRelInfo != NULL); + rootRelOid = RelationGetRelid(rootRelInfo->ri_RelationDesc); + if (resultRelInfo->ri_ancestorResultRels == NIL) + { + ListCell *lc; + List *oids = get_partition_ancestors(RelationGetRelid(partRel)); + List *ancResultRels = NIL; + + foreach(lc, oids) + { + Oid ancOid = lfirst_oid(lc); + Relation ancRel; + ResultRelInfo *rInfo; + + /* + * Ignore the root ancestor here, and use ri_RootResultRelInfo + * (below) for it instead. Also, we stop climbing up the + * hierarchy when we find the table that was mentioned in the + * query. + */ + if (ancOid == rootRelOid) + break; + + /* + * All ancestors up to the root target relation must have been + * locked by the planner or AcquireExecutorLocks(). + */ + ancRel = table_open(ancOid, NoLock); + rInfo = makeNode(ResultRelInfo); + + /* dummy rangetable index */ + InitResultRelInfo(rInfo, ancRel, 0, NULL, + estate->es_instrument); + ancResultRels = lappend(ancResultRels, rInfo); + } + ancResultRels = lappend(ancResultRels, rootRelInfo); + resultRelInfo->ri_ancestorResultRels = ancResultRels; + } + + /* We must have found some ancestor */ + Assert(resultRelInfo->ri_ancestorResultRels != NIL); + + return resultRelInfo->ri_ancestorResultRels; +} + /* ---------------------------------------------------------------- * ExecPostprocessPlan * @@ -1443,12 +1508,29 @@ ExecCloseResultRelations(EState *estate) /* * close indexes of result relation(s) if any. (Rels themselves are * closed in ExecCloseRangeTableRelations()) + * + * In addition, close the stub RTs that may be in each resultrel's + * ri_ancestorResultRels. */ foreach(l, estate->es_opened_result_relations) { ResultRelInfo *resultRelInfo = lfirst(l); + ListCell *lc; ExecCloseIndices(resultRelInfo); + foreach(lc, resultRelInfo->ri_ancestorResultRels) + { + ResultRelInfo *rInfo = lfirst(lc); + + /* + * Ancestors with RTI > 0 (should only be the root ancestor) are + * closed by ExecCloseRangeTableRelations. + */ + if (rInfo->ri_RangeTableIndex > 0) + continue; + + table_close(rInfo->ri_RelationDesc, NoLock); + } } /* Close any relations that have been opened by ExecGetTriggerResultRel(). */ diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c index 09f78f2244..13328141e2 100644 --- a/src/backend/executor/execReplication.c +++ b/src/backend/executor/execReplication.c @@ -517,8 +517,9 @@ ExecSimpleRelationUpdate(ResultRelInfo *resultRelInfo, /* AFTER ROW UPDATE Triggers */ ExecARUpdateTriggers(estate, resultRelInfo, + NULL, NULL, tid, NULL, slot, - recheckIndexes, NULL); + recheckIndexes, NULL, false); list_free(recheckIndexes); } @@ -557,7 +558,7 @@ ExecSimpleRelationDelete(ResultRelInfo *resultRelInfo, /* AFTER ROW DELETE Triggers */ ExecARDeleteTriggers(estate, resultRelInfo, - tid, NULL, NULL); + tid, NULL, NULL, false); } } diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index babf26810b..5e4226abe2 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -122,6 +122,12 @@ static void ExecBatchInsert(ModifyTableState *mtstate, int numSlots, EState *estate, bool canSetTag); +static void ExecCrossPartitionUpdateForeignKey(ModifyTableContext *context, + ResultRelInfo *sourcePartInfo, + ResultRelInfo *destPartInfo, + ItemPointer tupleid, + TupleTableSlot *oldslot, + TupleTableSlot *newslot); static bool ExecOnConflictUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer conflictTid, @@ -635,6 +641,9 @@ ExecGetUpdateNewTuple(ResultRelInfo *relinfo, * slot contains the new tuple value to be stored. * * Returns RETURNING result if any, otherwise NULL. + * *inserted_tuple is the tuple that's effectively inserted; + * *inserted_destrel is the relation where it was inserted. + * These are only set on success. * * This may change the currently active tuple conversion map in * mtstate->mt_transition_capture, so the callers must take care to @@ -645,7 +654,9 @@ static TupleTableSlot * ExecInsert(ModifyTableContext *context, ResultRelInfo *resultRelInfo, TupleTableSlot *slot, - bool canSetTag) + bool canSetTag, + TupleTableSlot **inserted_tuple, + ResultRelInfo **insert_destrel) { ModifyTableState *mtstate = context->mtstate; EState *estate = context->estate; @@ -1008,11 +1019,14 @@ ExecInsert(ModifyTableContext *context, if (mtstate->operation == CMD_UPDATE && mtstate->mt_transition_capture && mtstate->mt_transition_capture->tcs_update_new_table) { - ExecARUpdateTriggers(estate, resultRelInfo, NULL, + ExecARUpdateTriggers(estate, resultRelInfo, + NULL, NULL, + NULL, NULL, slot, NULL, - mtstate->mt_transition_capture); + mtstate->mt_transition_capture, + false); /* * We've already captured the NEW TABLE row, so make sure any AR @@ -1046,6 +1060,11 @@ ExecInsert(ModifyTableContext *context, if (resultRelInfo->ri_projectReturning) result = ExecProcessReturning(resultRelInfo, slot, planSlot); + if (inserted_tuple) + *inserted_tuple = slot; + if (insert_destrel) + *insert_destrel = resultRelInfo; + return result; } @@ -1160,7 +1179,7 @@ ExecDeleteAct(ModifyTableContext *context, ResultRelInfo *resultRelInfo, */ static void ExecDeleteEpilogue(ModifyTableContext *context, ResultRelInfo *resultRelInfo, - ItemPointer tupleid, HeapTuple oldtuple) + ItemPointer tupleid, HeapTuple oldtuple, bool changingPart) { ModifyTableState *mtstate = context->mtstate; EState *estate = context->estate; @@ -1176,8 +1195,11 @@ ExecDeleteEpilogue(ModifyTableContext *context, ResultRelInfo *resultRelInfo, if (mtstate->operation == CMD_UPDATE && mtstate->mt_transition_capture && mtstate->mt_transition_capture->tcs_update_old_table) { - ExecARUpdateTriggers(estate, resultRelInfo, tupleid, oldtuple, - NULL, NULL, mtstate->mt_transition_capture); + ExecARUpdateTriggers(estate, resultRelInfo, + NULL, NULL, + tupleid, oldtuple, + NULL, NULL, mtstate->mt_transition_capture, + false); /* * We've already captured the NEW TABLE row, so make sure any AR @@ -1188,7 +1210,7 @@ ExecDeleteEpilogue(ModifyTableContext *context, ResultRelInfo *resultRelInfo, /* AFTER ROW DELETE Triggers */ ExecARDeleteTriggers(estate, resultRelInfo, tupleid, oldtuple, - ar_delete_trig_tcs); + ar_delete_trig_tcs, changingPart); } /* ---------------------------------------------------------------- @@ -1457,7 +1479,7 @@ ldelete:; if (tupleDeleted) *tupleDeleted = true; - ExecDeleteEpilogue(context, resultRelInfo, tupleid, oldtuple); + ExecDeleteEpilogue(context, resultRelInfo, tupleid, oldtuple, changingPart); /* Process RETURNING if present and if requested */ if (processReturning && resultRelInfo->ri_projectReturning) @@ -1526,7 +1548,10 @@ ExecCrossPartitionUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot *slot, - bool canSetTag, UpdateContext *updateCxt) + bool canSetTag, + UpdateContext *updateCxt, + TupleTableSlot **inserted_tuple, + ResultRelInfo **insert_destrel) { ModifyTableState *mtstate = context->mtstate; EState *estate = mtstate->ps.state; @@ -1652,7 +1677,8 @@ ExecCrossPartitionUpdate(ModifyTableContext *context, /* Tuple routing starts from the root table. */ context->cpUpdateReturningSlot = - ExecInsert(context, mtstate->rootResultRelInfo, slot, canSetTag); + ExecInsert(context, mtstate->rootResultRelInfo, slot, canSetTag, + inserted_tuple, insert_destrel); /* * Reset the transition state that may possibly have been written by @@ -1793,6 +1819,9 @@ lreplace:; */ if (partition_constraint_failed) { + TupleTableSlot *inserted_tuple; + ResultRelInfo *insert_destrel; + /* * ExecCrossPartitionUpdate will first DELETE the row from the * partition it's currently in and then insert it back into the root @@ -1801,11 +1830,37 @@ lreplace:; */ if (ExecCrossPartitionUpdate(context, resultRelInfo, tupleid, oldtuple, slot, - canSetTag, updateCxt)) + canSetTag, updateCxt, + &inserted_tuple, + &insert_destrel)) { /* success! */ updateCxt->updated = true; updateCxt->crossPartUpdate = true; + + /* + * If the partitioned table being updated is referenced in foreign + * keys, queue up trigger events to check that none of them were + * violated. No special treatment is needed in + * non-cross-partition update situations, because the leaf + * partition's AR update triggers will take care of that. During + * cross-partition updates implemented as delete on the source + * partition followed by insert on the destination partition, + * AR-UPDATE triggers of the root table (that is, the table + * mentioned in the query) must be fired. + * + * NULL insert_destrel means that the move failed to occur, that + * is, the update failed, so no need to anything in that case. + */ + if (insert_destrel && + resultRelInfo->ri_TrigDesc && + resultRelInfo->ri_TrigDesc->trig_update_after_row) + ExecCrossPartitionUpdateForeignKey(context, + resultRelInfo, + insert_destrel, + tupleid, slot, + inserted_tuple); + return TM_Ok; } @@ -1871,11 +1926,13 @@ ExecUpdateEpilogue(ModifyTableContext *context, UpdateContext *updateCxt, /* AFTER ROW UPDATE Triggers */ ExecARUpdateTriggers(context->estate, resultRelInfo, + NULL, NULL, tupleid, oldtuple, slot, recheckIndexes, mtstate->operation == CMD_INSERT ? mtstate->mt_oc_transition_capture : - mtstate->mt_transition_capture); + mtstate->mt_transition_capture, + false); /* * Check any WITH CHECK OPTION constraints from parent views. We are @@ -1891,6 +1948,74 @@ ExecUpdateEpilogue(ModifyTableContext *context, UpdateContext *updateCxt, slot, context->estate); } +/* + * Queues up an update event using the target root partitioned table's + * trigger to check that a cross-partition update hasn't broken any foreign + * keys pointing into it. + */ +static void +ExecCrossPartitionUpdateForeignKey(ModifyTableContext *context, + ResultRelInfo *sourcePartInfo, + ResultRelInfo *destPartInfo, + ItemPointer tupleid, + TupleTableSlot *oldslot, + TupleTableSlot *newslot) +{ + ListCell *lc; + ResultRelInfo *rootRelInfo; + List *ancestorRels; + + rootRelInfo = sourcePartInfo->ri_RootResultRelInfo; + ancestorRels = ExecGetAncestorResultRels(context->estate, sourcePartInfo); + + /* + * For any foreign keys that point directly into a non-root ancestors of + * the source partition, we can in theory fire an update event to enforce + * those constraints using their triggers, if we could tell that both the + * source and the destination partitions are under the same ancestor. But + * for now, we simply report an error that those cannot be enforced. + */ + foreach(lc, ancestorRels) + { + ResultRelInfo *rInfo = lfirst(lc); + TriggerDesc *trigdesc = rInfo->ri_TrigDesc; + bool has_noncloned_fkey = false; + + /* Root ancestor's triggers will be processed. */ + if (rInfo == rootRelInfo) + continue; + + if (trigdesc && trigdesc->trig_update_after_row) + { + for (int i = 0; i < trigdesc->numtriggers; i++) + { + Trigger *trig = &trigdesc->triggers[i]; + + if (!trig->tgisclone && + RI_FKey_trigger_type(trig->tgfoid) == RI_TRIGGER_PK) + { + has_noncloned_fkey = true; + break; + } + } + } + + if (has_noncloned_fkey) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key"), + errdetail("A foreign key points to ancestor \"%s\", but not the root ancestor \"%s\".", + RelationGetRelationName(rInfo->ri_RelationDesc), + RelationGetRelationName(rootRelInfo->ri_RelationDesc)), + errhint("Consider defining the foreign key on \"%s\".", + RelationGetRelationName(rootRelInfo->ri_RelationDesc)))); + } + + /* Perform the root table's triggers. */ + ExecARUpdateTriggers(context->estate, + rootRelInfo, sourcePartInfo, destPartInfo, + tupleid, NULL, newslot, NIL, NULL, true); +} /* ---------------------------------------------------------------- * ExecUpdate @@ -2745,7 +2870,7 @@ ExecModifyTable(PlanState *pstate) ExecInitInsertProjection(node, resultRelInfo); slot = ExecGetInsertNewTuple(resultRelInfo, planSlot); slot = ExecInsert(&context, resultRelInfo, slot, - node->canSetTag); + node->canSetTag, NULL, NULL); break; case CMD_UPDATE: diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c index c95cd32402..01d4c22cfc 100644 --- a/src/backend/utils/adt/ri_triggers.c +++ b/src/backend/utils/adt/ri_triggers.c @@ -1261,6 +1261,12 @@ RI_FKey_fk_upd_check_required(Trigger *trigger, Relation fk_rel, TransactionId xmin; bool isnull; + /* + * AfterTriggerSaveEvent() handles things such that this function is never + * called for partitioned tables. + */ + Assert(fk_rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE); + riinfo = ri_FetchConstraintInfo(trigger, fk_rel, false); ri_nullcheck = ri_NullCheck(RelationGetDescr(fk_rel), newslot, riinfo, false); diff --git a/src/include/commands/trigger.h b/src/include/commands/trigger.h index e1271420e5..66bf6c16e3 100644 --- a/src/include/commands/trigger.h +++ b/src/include/commands/trigger.h @@ -214,7 +214,8 @@ extern void ExecARDeleteTriggers(EState *estate, ResultRelInfo *relinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, - TransitionCaptureState *transition_capture); + TransitionCaptureState *transition_capture, + bool is_crosspart_update); extern bool ExecIRDeleteTriggers(EState *estate, ResultRelInfo *relinfo, HeapTuple trigtuple); @@ -231,11 +232,14 @@ extern bool ExecBRUpdateTriggers(EState *estate, TupleTableSlot *slot); extern void ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, + ResultRelInfo *src_partinfo, + ResultRelInfo *dst_partinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, TupleTableSlot *slot, List *recheckIndexes, - TransitionCaptureState *transition_capture); + TransitionCaptureState *transition_capture, + bool is_crosspart_update); extern bool ExecIRUpdateTriggers(EState *estate, ResultRelInfo *relinfo, HeapTuple trigtuple, diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index 344399f6a8..82925b4b63 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -203,7 +203,9 @@ extern void InitResultRelInfo(ResultRelInfo *resultRelInfo, Index resultRelationIndex, ResultRelInfo *partition_root_rri, int instrument_options); -extern ResultRelInfo *ExecGetTriggerResultRel(EState *estate, Oid relid); +extern ResultRelInfo *ExecGetTriggerResultRel(EState *estate, Oid relid, + ResultRelInfo *rootRelInfo); +extern List *ExecGetAncestorResultRels(EState *estate, ResultRelInfo *resultRelInfo); extern void ExecConstraints(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate); extern bool ExecPartitionCheck(ResultRelInfo *resultRelInfo, diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index dd95dc40c7..44dd73fc80 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -530,6 +530,12 @@ typedef struct ResultRelInfo /* for use by copyfrom.c when performing multi-inserts */ struct CopyMultiInsertBuffer *ri_CopyMultiInsertBuffer; + + /* + * Used when a leaf partition is involved in a cross-partition update of + * one of its ancestors; see ExecCrossPartitionUpdateForeignKey(). + */ + List *ri_ancestorResultRels; } ResultRelInfo; /* ---------------- diff --git a/src/test/regress/expected/foreign_key.out b/src/test/regress/expected/foreign_key.out index 4c5274983d..da26f083bc 100644 --- a/src/test/regress/expected/foreign_key.out +++ b/src/test/regress/expected/foreign_key.out @@ -2556,7 +2556,7 @@ DELETE FROM pk WHERE a = 20; ERROR: update or delete on table "pk11" violates foreign key constraint "fk_a_fkey2" on table "fk" DETAIL: Key (a)=(20) is still referenced from table "fk". UPDATE pk SET a = 90 WHERE a = 30; -ERROR: update or delete on table "pk11" violates foreign key constraint "fk_a_fkey2" on table "fk" +ERROR: update or delete on table "pk" violates foreign key constraint "fk_a_fkey" on table "fk" DETAIL: Key (a)=(30) is still referenced from table "fk". SELECT tableoid::regclass, * FROM fk; tableoid | a @@ -2625,15 +2625,213 @@ CREATE SCHEMA fkpart10 CREATE TABLE tbl1(f1 int PRIMARY KEY) PARTITION BY RANGE(f1) CREATE TABLE tbl1_p1 PARTITION OF tbl1 FOR VALUES FROM (minvalue) TO (1) CREATE TABLE tbl1_p2 PARTITION OF tbl1 FOR VALUES FROM (1) TO (maxvalue) - CREATE TABLE tbl2(f1 int REFERENCES tbl1 DEFERRABLE INITIALLY DEFERRED); + CREATE TABLE tbl2(f1 int REFERENCES tbl1 DEFERRABLE INITIALLY DEFERRED) + CREATE TABLE tbl3(f1 int PRIMARY KEY) PARTITION BY RANGE(f1) + CREATE TABLE tbl3_p1 PARTITION OF tbl3 FOR VALUES FROM (minvalue) TO (1) + CREATE TABLE tbl3_p2 PARTITION OF tbl3 FOR VALUES FROM (1) TO (maxvalue) + CREATE TABLE tbl4(f1 int REFERENCES tbl3 DEFERRABLE INITIALLY DEFERRED); INSERT INTO fkpart10.tbl1 VALUES (0), (1); INSERT INTO fkpart10.tbl2 VALUES (0), (1); +INSERT INTO fkpart10.tbl3 VALUES (-2), (-1), (0); +INSERT INTO fkpart10.tbl4 VALUES (-2), (-1); BEGIN; DELETE FROM fkpart10.tbl1 WHERE f1 = 0; UPDATE fkpart10.tbl1 SET f1 = 2 WHERE f1 = 1; INSERT INTO fkpart10.tbl1 VALUES (0), (1); COMMIT; +-- test that cross-partition updates correctly enforces the foreign key +-- restriction (specifically testing INITIAILLY DEFERRED) +BEGIN; +UPDATE fkpart10.tbl1 SET f1 = 3 WHERE f1 = 0; +UPDATE fkpart10.tbl3 SET f1 = f1 * -1; +INSERT INTO fkpart10.tbl1 VALUES (4); +COMMIT; +ERROR: update or delete on table "tbl1" violates foreign key constraint "tbl2_f1_fkey" on table "tbl2" +DETAIL: Key (f1)=(0) is still referenced from table "tbl2". +BEGIN; +UPDATE fkpart10.tbl3 SET f1 = f1 * -1; +UPDATE fkpart10.tbl3 SET f1 = f1 + 3; +UPDATE fkpart10.tbl1 SET f1 = 3 WHERE f1 = 0; +INSERT INTO fkpart10.tbl1 VALUES (0); +COMMIT; +ERROR: update or delete on table "tbl3" violates foreign key constraint "tbl4_f1_fkey" on table "tbl4" +DETAIL: Key (f1)=(-2) is still referenced from table "tbl4". +BEGIN; +UPDATE fkpart10.tbl3 SET f1 = f1 * -1; +UPDATE fkpart10.tbl1 SET f1 = 3 WHERE f1 = 0; +INSERT INTO fkpart10.tbl1 VALUES (0); +INSERT INTO fkpart10.tbl3 VALUES (-2), (-1); +COMMIT; +-- test where the updated table now has both an IMMEDIATE and a DEFERRED +-- constraint pointing into it +CREATE TABLE fkpart10.tbl5(f1 int REFERENCES fkpart10.tbl3); +INSERT INTO fkpart10.tbl5 VALUES (-2), (-1); +BEGIN; +UPDATE fkpart10.tbl3 SET f1 = f1 * -3; +ERROR: update or delete on table "tbl3" violates foreign key constraint "tbl5_f1_fkey" on table "tbl5" +DETAIL: Key (f1)=(-2) is still referenced from table "tbl5". +COMMIT; +-- Now test where the row referenced from the table with an IMMEDIATE +-- constraint stays in place, while those referenced from the table with a +-- DEFERRED constraint don't. +DELETE FROM fkpart10.tbl5; +INSERT INTO fkpart10.tbl5 VALUES (0); +BEGIN; +UPDATE fkpart10.tbl3 SET f1 = f1 * -3; +COMMIT; +ERROR: update or delete on table "tbl3" violates foreign key constraint "tbl4_f1_fkey" on table "tbl4" +DETAIL: Key (f1)=(-2) is still referenced from table "tbl4". DROP SCHEMA fkpart10 CASCADE; -NOTICE: drop cascades to 2 other objects +NOTICE: drop cascades to 5 other objects DETAIL: drop cascades to table fkpart10.tbl1 drop cascades to table fkpart10.tbl2 +drop cascades to table fkpart10.tbl3 +drop cascades to table fkpart10.tbl4 +drop cascades to table fkpart10.tbl5 +-- verify foreign keys are enforced during cross-partition updates, +-- especially on the PK side +CREATE SCHEMA fkpart11 + CREATE TABLE pk (a INT PRIMARY KEY, b text) PARTITION BY LIST (a) + CREATE TABLE fk ( + a INT, + CONSTRAINT fkey FOREIGN KEY (a) REFERENCES pk(a) ON UPDATE CASCADE ON DELETE CASCADE + ) + CREATE TABLE fk_parted ( + a INT PRIMARY KEY, + CONSTRAINT fkey FOREIGN KEY (a) REFERENCES pk(a) ON UPDATE CASCADE ON DELETE CASCADE + ) PARTITION BY LIST (a) + CREATE TABLE fk_another ( + a INT, + CONSTRAINT fkey FOREIGN KEY (a) REFERENCES fk_parted (a) ON UPDATE CASCADE ON DELETE CASCADE + ) + CREATE TABLE pk1 PARTITION OF pk FOR VALUES IN (1, 2) PARTITION BY LIST (a) + CREATE TABLE pk2 PARTITION OF pk FOR VALUES IN (3) + CREATE TABLE pk3 PARTITION OF pk FOR VALUES IN (4) + CREATE TABLE fk1 PARTITION OF fk_parted FOR VALUES IN (1, 2) + CREATE TABLE fk2 PARTITION OF fk_parted FOR VALUES IN (3) + CREATE TABLE fk3 PARTITION OF fk_parted FOR VALUES IN (4); +CREATE TABLE fkpart11.pk11 (b text, a int NOT NULL); +ALTER TABLE fkpart11.pk1 ATTACH PARTITION fkpart11.pk11 FOR VALUES IN (1); +CREATE TABLE fkpart11.pk12 (b text, c int, a int NOT NULL); +ALTER TABLE fkpart11.pk12 DROP c; +ALTER TABLE fkpart11.pk1 ATTACH PARTITION fkpart11.pk12 FOR VALUES IN (2); +INSERT INTO fkpart11.pk VALUES (1, 'xxx'), (3, 'yyy'); +INSERT INTO fkpart11.fk VALUES (1), (3); +INSERT INTO fkpart11.fk_parted VALUES (1), (3); +INSERT INTO fkpart11.fk_another VALUES (1), (3); +-- moves 2 rows from one leaf partition to another, with both updates being +-- cascaded to fk and fk_parted. Updates of fk_parted, of which one is +-- cross-partition (3 -> 4), are further cascaded to fk_another. +UPDATE fkpart11.pk SET a = a + 1 RETURNING tableoid::pg_catalog.regclass, *; + tableoid | a | b +---------------+---+----- + fkpart11.pk12 | 2 | xxx + fkpart11.pk3 | 4 | yyy +(2 rows) + +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.fk; + tableoid | a +-------------+--- + fkpart11.fk | 2 + fkpart11.fk | 4 +(2 rows) + +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.fk_parted; + tableoid | a +--------------+--- + fkpart11.fk1 | 2 + fkpart11.fk3 | 4 +(2 rows) + +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.fk_another; + tableoid | a +---------------------+--- + fkpart11.fk_another | 2 + fkpart11.fk_another | 4 +(2 rows) + +-- let's try with the foreign key pointing at tables in the partition tree +-- that are not the same as the query's target table +-- 1. foreign key pointing into a non-root ancestor +-- +-- A cross-partition update on the root table will fail, because we currently +-- can't enforce the foreign keys pointing into a non-leaf partition +ALTER TABLE fkpart11.fk DROP CONSTRAINT fkey; +DELETE FROM fkpart11.fk WHERE a = 4; +ALTER TABLE fkpart11.fk ADD CONSTRAINT fkey FOREIGN KEY (a) REFERENCES fkpart11.pk1 (a) ON UPDATE CASCADE ON DELETE CASCADE; +UPDATE fkpart11.pk SET a = a - 1; +ERROR: cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key +DETAIL: A foreign key points to ancestor "pk1", but not the root ancestor "pk". +HINT: Consider defining the foreign key on "pk". +-- it's okay though if the non-leaf partition is updated directly +UPDATE fkpart11.pk1 SET a = a - 1; +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.pk; + tableoid | a | b +---------------+---+----- + fkpart11.pk11 | 1 | xxx + fkpart11.pk3 | 4 | yyy +(2 rows) + +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.fk; + tableoid | a +-------------+--- + fkpart11.fk | 1 +(1 row) + +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.fk_parted; + tableoid | a +--------------+--- + fkpart11.fk1 | 1 + fkpart11.fk3 | 4 +(2 rows) + +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.fk_another; + tableoid | a +---------------------+--- + fkpart11.fk_another | 4 + fkpart11.fk_another | 1 +(2 rows) + +-- 2. foreign key pointing into a single leaf partition +-- +-- A cross-partition update that deletes from the pointed-to leaf partition +-- is allowed to succeed +ALTER TABLE fkpart11.fk DROP CONSTRAINT fkey; +ALTER TABLE fkpart11.fk ADD CONSTRAINT fkey FOREIGN KEY (a) REFERENCES fkpart11.pk11 (a) ON UPDATE CASCADE ON DELETE CASCADE; +-- will delete (1) from p11 which is cascaded to fk +UPDATE fkpart11.pk SET a = a + 1 WHERE a = 1; +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.fk; + tableoid | a +----------+--- +(0 rows) + +DROP TABLE fkpart11.fk; +-- check that regular and deferrable AR triggers on the PK tables +-- still work as expected +CREATE FUNCTION fkpart11.print_row () RETURNS TRIGGER LANGUAGE plpgsql AS $$ + BEGIN + RAISE NOTICE 'TABLE: %, OP: %, OLD: %, NEW: %', TG_RELNAME, TG_OP, OLD, NEW; + RETURN NULL; + END; +$$; +CREATE TRIGGER trig_upd_pk AFTER UPDATE ON fkpart11.pk FOR EACH ROW EXECUTE FUNCTION fkpart11.print_row(); +CREATE TRIGGER trig_del_pk AFTER DELETE ON fkpart11.pk FOR EACH ROW EXECUTE FUNCTION fkpart11.print_row(); +CREATE TRIGGER trig_ins_pk AFTER INSERT ON fkpart11.pk FOR EACH ROW EXECUTE FUNCTION fkpart11.print_row(); +CREATE CONSTRAINT TRIGGER trig_upd_fk_parted AFTER UPDATE ON fkpart11.fk_parted INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION fkpart11.print_row(); +CREATE CONSTRAINT TRIGGER trig_del_fk_parted AFTER DELETE ON fkpart11.fk_parted INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION fkpart11.print_row(); +CREATE CONSTRAINT TRIGGER trig_ins_fk_parted AFTER INSERT ON fkpart11.fk_parted INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION fkpart11.print_row(); +UPDATE fkpart11.pk SET a = 3 WHERE a = 4; +NOTICE: TABLE: pk3, OP: DELETE, OLD: (4,yyy), NEW: +NOTICE: TABLE: pk2, OP: INSERT, OLD: , NEW: (3,yyy) +NOTICE: TABLE: fk3, OP: DELETE, OLD: (4), NEW: +NOTICE: TABLE: fk2, OP: INSERT, OLD: , NEW: (3) +UPDATE fkpart11.pk SET a = 1 WHERE a = 2; +NOTICE: TABLE: pk12, OP: DELETE, OLD: (xxx,2), NEW: +NOTICE: TABLE: pk11, OP: INSERT, OLD: , NEW: (xxx,1) +NOTICE: TABLE: fk1, OP: UPDATE, OLD: (2), NEW: (1) +DROP SCHEMA fkpart11 CASCADE; +NOTICE: drop cascades to 4 other objects +DETAIL: drop cascades to table fkpart11.pk +drop cascades to table fkpart11.fk_parted +drop cascades to table fkpart11.fk_another +drop cascades to function fkpart11.print_row() diff --git a/src/test/regress/sql/foreign_key.sql b/src/test/regress/sql/foreign_key.sql index fa781b6e32..725a59a525 100644 --- a/src/test/regress/sql/foreign_key.sql +++ b/src/test/regress/sql/foreign_key.sql @@ -1871,12 +1871,145 @@ CREATE SCHEMA fkpart10 CREATE TABLE tbl1(f1 int PRIMARY KEY) PARTITION BY RANGE(f1) CREATE TABLE tbl1_p1 PARTITION OF tbl1 FOR VALUES FROM (minvalue) TO (1) CREATE TABLE tbl1_p2 PARTITION OF tbl1 FOR VALUES FROM (1) TO (maxvalue) - CREATE TABLE tbl2(f1 int REFERENCES tbl1 DEFERRABLE INITIALLY DEFERRED); + CREATE TABLE tbl2(f1 int REFERENCES tbl1 DEFERRABLE INITIALLY DEFERRED) + CREATE TABLE tbl3(f1 int PRIMARY KEY) PARTITION BY RANGE(f1) + CREATE TABLE tbl3_p1 PARTITION OF tbl3 FOR VALUES FROM (minvalue) TO (1) + CREATE TABLE tbl3_p2 PARTITION OF tbl3 FOR VALUES FROM (1) TO (maxvalue) + CREATE TABLE tbl4(f1 int REFERENCES tbl3 DEFERRABLE INITIALLY DEFERRED); INSERT INTO fkpart10.tbl1 VALUES (0), (1); INSERT INTO fkpart10.tbl2 VALUES (0), (1); +INSERT INTO fkpart10.tbl3 VALUES (-2), (-1), (0); +INSERT INTO fkpart10.tbl4 VALUES (-2), (-1); BEGIN; DELETE FROM fkpart10.tbl1 WHERE f1 = 0; UPDATE fkpart10.tbl1 SET f1 = 2 WHERE f1 = 1; INSERT INTO fkpart10.tbl1 VALUES (0), (1); COMMIT; + +-- test that cross-partition updates correctly enforces the foreign key +-- restriction (specifically testing INITIAILLY DEFERRED) +BEGIN; +UPDATE fkpart10.tbl1 SET f1 = 3 WHERE f1 = 0; +UPDATE fkpart10.tbl3 SET f1 = f1 * -1; +INSERT INTO fkpart10.tbl1 VALUES (4); +COMMIT; + +BEGIN; +UPDATE fkpart10.tbl3 SET f1 = f1 * -1; +UPDATE fkpart10.tbl3 SET f1 = f1 + 3; +UPDATE fkpart10.tbl1 SET f1 = 3 WHERE f1 = 0; +INSERT INTO fkpart10.tbl1 VALUES (0); +COMMIT; + +BEGIN; +UPDATE fkpart10.tbl3 SET f1 = f1 * -1; +UPDATE fkpart10.tbl1 SET f1 = 3 WHERE f1 = 0; +INSERT INTO fkpart10.tbl1 VALUES (0); +INSERT INTO fkpart10.tbl3 VALUES (-2), (-1); +COMMIT; + +-- test where the updated table now has both an IMMEDIATE and a DEFERRED +-- constraint pointing into it +CREATE TABLE fkpart10.tbl5(f1 int REFERENCES fkpart10.tbl3); +INSERT INTO fkpart10.tbl5 VALUES (-2), (-1); +BEGIN; +UPDATE fkpart10.tbl3 SET f1 = f1 * -3; +COMMIT; + +-- Now test where the row referenced from the table with an IMMEDIATE +-- constraint stays in place, while those referenced from the table with a +-- DEFERRED constraint don't. +DELETE FROM fkpart10.tbl5; +INSERT INTO fkpart10.tbl5 VALUES (0); +BEGIN; +UPDATE fkpart10.tbl3 SET f1 = f1 * -3; +COMMIT; + DROP SCHEMA fkpart10 CASCADE; + +-- verify foreign keys are enforced during cross-partition updates, +-- especially on the PK side +CREATE SCHEMA fkpart11 + CREATE TABLE pk (a INT PRIMARY KEY, b text) PARTITION BY LIST (a) + CREATE TABLE fk ( + a INT, + CONSTRAINT fkey FOREIGN KEY (a) REFERENCES pk(a) ON UPDATE CASCADE ON DELETE CASCADE + ) + CREATE TABLE fk_parted ( + a INT PRIMARY KEY, + CONSTRAINT fkey FOREIGN KEY (a) REFERENCES pk(a) ON UPDATE CASCADE ON DELETE CASCADE + ) PARTITION BY LIST (a) + CREATE TABLE fk_another ( + a INT, + CONSTRAINT fkey FOREIGN KEY (a) REFERENCES fk_parted (a) ON UPDATE CASCADE ON DELETE CASCADE + ) + CREATE TABLE pk1 PARTITION OF pk FOR VALUES IN (1, 2) PARTITION BY LIST (a) + CREATE TABLE pk2 PARTITION OF pk FOR VALUES IN (3) + CREATE TABLE pk3 PARTITION OF pk FOR VALUES IN (4) + CREATE TABLE fk1 PARTITION OF fk_parted FOR VALUES IN (1, 2) + CREATE TABLE fk2 PARTITION OF fk_parted FOR VALUES IN (3) + CREATE TABLE fk3 PARTITION OF fk_parted FOR VALUES IN (4); +CREATE TABLE fkpart11.pk11 (b text, a int NOT NULL); +ALTER TABLE fkpart11.pk1 ATTACH PARTITION fkpart11.pk11 FOR VALUES IN (1); +CREATE TABLE fkpart11.pk12 (b text, c int, a int NOT NULL); +ALTER TABLE fkpart11.pk12 DROP c; +ALTER TABLE fkpart11.pk1 ATTACH PARTITION fkpart11.pk12 FOR VALUES IN (2); +INSERT INTO fkpart11.pk VALUES (1, 'xxx'), (3, 'yyy'); +INSERT INTO fkpart11.fk VALUES (1), (3); +INSERT INTO fkpart11.fk_parted VALUES (1), (3); +INSERT INTO fkpart11.fk_another VALUES (1), (3); +-- moves 2 rows from one leaf partition to another, with both updates being +-- cascaded to fk and fk_parted. Updates of fk_parted, of which one is +-- cross-partition (3 -> 4), are further cascaded to fk_another. +UPDATE fkpart11.pk SET a = a + 1 RETURNING tableoid::pg_catalog.regclass, *; +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.fk; +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.fk_parted; +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.fk_another; + +-- let's try with the foreign key pointing at tables in the partition tree +-- that are not the same as the query's target table + +-- 1. foreign key pointing into a non-root ancestor +-- +-- A cross-partition update on the root table will fail, because we currently +-- can't enforce the foreign keys pointing into a non-leaf partition +ALTER TABLE fkpart11.fk DROP CONSTRAINT fkey; +DELETE FROM fkpart11.fk WHERE a = 4; +ALTER TABLE fkpart11.fk ADD CONSTRAINT fkey FOREIGN KEY (a) REFERENCES fkpart11.pk1 (a) ON UPDATE CASCADE ON DELETE CASCADE; +UPDATE fkpart11.pk SET a = a - 1; +-- it's okay though if the non-leaf partition is updated directly +UPDATE fkpart11.pk1 SET a = a - 1; +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.pk; +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.fk; +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.fk_parted; +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.fk_another; + +-- 2. foreign key pointing into a single leaf partition +-- +-- A cross-partition update that deletes from the pointed-to leaf partition +-- is allowed to succeed +ALTER TABLE fkpart11.fk DROP CONSTRAINT fkey; +ALTER TABLE fkpart11.fk ADD CONSTRAINT fkey FOREIGN KEY (a) REFERENCES fkpart11.pk11 (a) ON UPDATE CASCADE ON DELETE CASCADE; +-- will delete (1) from p11 which is cascaded to fk +UPDATE fkpart11.pk SET a = a + 1 WHERE a = 1; +SELECT tableoid::pg_catalog.regclass, * FROM fkpart11.fk; +DROP TABLE fkpart11.fk; + +-- check that regular and deferrable AR triggers on the PK tables +-- still work as expected +CREATE FUNCTION fkpart11.print_row () RETURNS TRIGGER LANGUAGE plpgsql AS $$ + BEGIN + RAISE NOTICE 'TABLE: %, OP: %, OLD: %, NEW: %', TG_RELNAME, TG_OP, OLD, NEW; + RETURN NULL; + END; +$$; +CREATE TRIGGER trig_upd_pk AFTER UPDATE ON fkpart11.pk FOR EACH ROW EXECUTE FUNCTION fkpart11.print_row(); +CREATE TRIGGER trig_del_pk AFTER DELETE ON fkpart11.pk FOR EACH ROW EXECUTE FUNCTION fkpart11.print_row(); +CREATE TRIGGER trig_ins_pk AFTER INSERT ON fkpart11.pk FOR EACH ROW EXECUTE FUNCTION fkpart11.print_row(); +CREATE CONSTRAINT TRIGGER trig_upd_fk_parted AFTER UPDATE ON fkpart11.fk_parted INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION fkpart11.print_row(); +CREATE CONSTRAINT TRIGGER trig_del_fk_parted AFTER DELETE ON fkpart11.fk_parted INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION fkpart11.print_row(); +CREATE CONSTRAINT TRIGGER trig_ins_fk_parted AFTER INSERT ON fkpart11.fk_parted INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION fkpart11.print_row(); +UPDATE fkpart11.pk SET a = 3 WHERE a = 4; +UPDATE fkpart11.pk SET a = 1 WHERE a = 2; + +DROP SCHEMA fkpart11 CASCADE; From 7fa3db367986160dee2b2b0bbfb61e1a51d486fd Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 20 Mar 2022 16:06:41 -0400 Subject: [PATCH 186/772] psql: handle tab completion of timezone names after "SET TIMEZONE TO". MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dagfinn Ilmari Mannsåker and Tom Lane Discussion: https://postgr.es/m/87k0curq0w.fsf@wibble.ilmari.org --- src/bin/psql/t/010_tab_completion.pl | 13 +++++++++++ src/bin/psql/tab-complete.c | 35 ++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl index a54910680e..2711935a2c 100644 --- a/src/bin/psql/t/010_tab_completion.pl +++ b/src/bin/psql/t/010_tab_completion.pl @@ -338,6 +338,19 @@ sub clear_line clear_line(); +# check timezone name completion +check_completion( + "SET timezone TO am\t", + qr|'America/|, + "offer partial timezone name"); + +check_completion( + "new_\t", + qr|New_York|, + "complete partial timezone name"); + +clear_line(); + # check completion of a keyword offered in addition to object names; # such a keyword should obey COMP_KEYWORD_CASE foreach ( diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 7b331a38ae..183abcc275 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -402,6 +402,24 @@ do { \ matches = rl_completion_matches(text, complete_from_schema_query); \ } while (0) +/* + * Timezone completion is mostly like enum label completion, but we work + * a little harder since this is a more common use-case. + */ +#define COMPLETE_WITH_TIMEZONE_NAME() \ +do { \ + static const char *const list[] = { "DEFAULT", NULL }; \ + if (text[0] == '\'') \ + completion_charp = Query_for_list_of_timezone_names_quoted_in; \ + else if (start == 0 || rl_line_buffer[start - 1] != '\'') \ + completion_charp = Query_for_list_of_timezone_names_quoted_out; \ + else \ + completion_charp = Query_for_list_of_timezone_names_unquoted; \ + completion_charpp = list; \ + completion_verbatim = true; \ + matches = rl_completion_matches(text, complete_from_query); \ +} while (0) + #define COMPLETE_WITH_FUNCTION_ARG(function) \ do { \ set_completion_reference(function); \ @@ -1105,6 +1123,21 @@ static const SchemaQuery Query_for_trigger_of_table = { " FROM pg_catalog.pg_cursors "\ " WHERE name LIKE '%s'" +#define Query_for_list_of_timezone_names_unquoted \ +" SELECT name "\ +" FROM pg_catalog.pg_timezone_names() "\ +" WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')" + +#define Query_for_list_of_timezone_names_quoted_out \ +"SELECT pg_catalog.quote_literal(name) AS name "\ +" FROM pg_catalog.pg_timezone_names() "\ +" WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')" + +#define Query_for_list_of_timezone_names_quoted_in \ +"SELECT pg_catalog.quote_literal(name) AS name "\ +" FROM pg_catalog.pg_timezone_names() "\ +" WHERE pg_catalog.quote_literal(pg_catalog.lower(name)) LIKE pg_catalog.lower('%s')" + /* * These object types were introduced later than our support cutoff of * server version 9.2. We use the VersionedQuery infrastructure so that @@ -4176,6 +4209,8 @@ psql_completion(const char *text, int start, int end) " AND nspname NOT LIKE E'pg\\\\_temp%%'", "DEFAULT"); } + else if (TailMatches("TimeZone", "TO|=")) + COMPLETE_WITH_TIMEZONE_NAME(); else { /* generic, type based, GUC support */ From a096813b6f583621db4119b6ab1be4ffc26f859d Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Mon, 21 Mar 2022 09:31:22 +1300 Subject: [PATCH 187/772] Log regression.diffs in 027_stream_regress.pl. To help diagnose the reasons for a regression test failure inside this TAP test, dump the contents of regression.diffs to the log. While the CI scripts show it automatically, the build farm client does not. Reviewed-by: Andrew Dunstan Discussion: https://postgr.es/m/CA%2BhUKGLsrWbiCcMxBLRBAP6Z%3DykFRHWzdmP9YKujSKoSnEJECQ%40mail.gmail.com --- src/test/recovery/t/027_stream_regress.pl | 30 ++++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/test/recovery/t/027_stream_regress.pl b/src/test/recovery/t/027_stream_regress.pl index c40951b7ba..aa972f8958 100644 --- a/src/test/recovery/t/027_stream_regress.pl +++ b/src/test/recovery/t/027_stream_regress.pl @@ -53,15 +53,27 @@ # Run the regression tests against the primary. my $extra_opts = $ENV{EXTRA_REGRESS_OPTS} || ""; -system_or_bail($ENV{PG_REGRESS} . " $extra_opts " . - "--dlpath=\"$dlpath\" " . - "--bindir= " . - "--host=" . $node_primary->host . " " . - "--port=" . $node_primary->port . " " . - "--schedule=../regress/parallel_schedule " . - "--max-concurrent-tests=20 " . - "--inputdir=../regress " . - "--outputdir=\"$outputdir\""); +my $rc = system($ENV{PG_REGRESS} . " $extra_opts " . + "--dlpath=\"$dlpath\" " . + "--bindir= " . + "--host=" . $node_primary->host . " " . + "--port=" . $node_primary->port . " " . + "--schedule=../regress/parallel_schedule " . + "--max-concurrent-tests=20 " . + "--inputdir=../regress " . + "--outputdir=\"$outputdir\""); +if ($rc != 0) +{ + # Dump out the regression diffs file, if there is one + my $diffs = "$outputdir/regression.diffs"; + if (-e $diffs) + { + print "=== dumping $diffs ===\n"; + print slurp_file($diffs); + print "=== EOF ===\n"; + } +} +is($rc, 0, 'regression tests pass'); # Clobber all sequences with their next value, so that we don't have # differences between nodes due to caching. From 2d655a08d532feed356222a8b1e427561dc7a883 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Sun, 20 Mar 2022 22:10:24 +0100 Subject: [PATCH 188/772] Blind fix for uninitialized memory bug in ba9a7e392171 Valgrind animal skink shows a crash in this new code. I couldn't reproduce the problem locally, but going by blind code inspection, initializing insert_destrel should be sufficient to fix the problem. --- src/backend/executor/nodeModifyTable.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 5e4226abe2..701fe05296 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -1820,7 +1820,7 @@ lreplace:; if (partition_constraint_failed) { TupleTableSlot *inserted_tuple; - ResultRelInfo *insert_destrel; + ResultRelInfo *insert_destrel = NULL; /* * ExecCrossPartitionUpdate will first DELETE the row from the From 8363102009d8ee64255ad4948183f9d159eb8f4b Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sun, 20 Mar 2022 19:12:09 -0700 Subject: [PATCH 189/772] pgstat: introduce pgstat_relation_should_count(). A later commit will make the check more complicated than the current (rel)->pgstat_info != NULL. It also just seems nicer to have a central copy of the logic, even while still simple. Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/backend/catalog/index.c | 2 +- src/backend/postmaster/pgstat.c | 36 ++++++++++++++++----------------- src/include/pgstat.h | 17 +++++++++------- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index e43117ffef..dd715ca060 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -1743,7 +1743,7 @@ index_concurrently_swap(Oid newIndexId, Oid oldIndexId, const char *oldName) tabentry = pgstat_fetch_stat_tabentry(oldIndexId); if (tabentry) { - if (newClassRel->pgstat_info) + if (pgstat_relation_should_count(newClassRel)) { newClassRel->pgstat_info->t_counts.t_numscans = tabentry->numscans; newClassRel->pgstat_info->t_counts.t_tuples_returned = tabentry->tuples_returned; diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index e74a66d743..62411313af 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -1709,7 +1709,7 @@ pgstat_report_analyze(Relation rel, * * Waste no time on partitioned tables, though. */ - if (rel->pgstat_info != NULL && + if (pgstat_relation_should_count(rel) && rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) { PgStat_TableXactStatus *trans; @@ -2359,13 +2359,12 @@ add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level) void pgstat_count_heap_insert(Relation rel, PgStat_Counter n) { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - if (pgstat_info != NULL) + if (pgstat_relation_should_count(rel)) { - /* We have to log the effect at the proper transactional level */ + PgStat_TableStatus *pgstat_info = rel->pgstat_info; int nest_level = GetCurrentTransactionNestLevel(); + /* We have to log the effect at the proper transactional level */ if (pgstat_info->trans == NULL || pgstat_info->trans->nest_level != nest_level) add_tabstat_xact_level(pgstat_info, nest_level); @@ -2380,13 +2379,12 @@ pgstat_count_heap_insert(Relation rel, PgStat_Counter n) void pgstat_count_heap_update(Relation rel, bool hot) { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - if (pgstat_info != NULL) + if (pgstat_relation_should_count(rel)) { - /* We have to log the effect at the proper transactional level */ + PgStat_TableStatus *pgstat_info = rel->pgstat_info; int nest_level = GetCurrentTransactionNestLevel(); + /* We have to log the effect at the proper transactional level */ if (pgstat_info->trans == NULL || pgstat_info->trans->nest_level != nest_level) add_tabstat_xact_level(pgstat_info, nest_level); @@ -2405,13 +2403,12 @@ pgstat_count_heap_update(Relation rel, bool hot) void pgstat_count_heap_delete(Relation rel) { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - if (pgstat_info != NULL) + if (pgstat_relation_should_count(rel)) { - /* We have to log the effect at the proper transactional level */ + PgStat_TableStatus *pgstat_info = rel->pgstat_info; int nest_level = GetCurrentTransactionNestLevel(); + /* We have to log the effect at the proper transactional level */ if (pgstat_info->trans == NULL || pgstat_info->trans->nest_level != nest_level) add_tabstat_xact_level(pgstat_info, nest_level); @@ -2463,13 +2460,12 @@ pgstat_truncdrop_restore_counters(PgStat_TableXactStatus *trans) void pgstat_count_truncate(Relation rel) { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - if (pgstat_info != NULL) + if (pgstat_relation_should_count(rel)) { - /* We have to log the effect at the proper transactional level */ + PgStat_TableStatus *pgstat_info = rel->pgstat_info; int nest_level = GetCurrentTransactionNestLevel(); + /* We have to log the effect at the proper transactional level */ if (pgstat_info->trans == NULL || pgstat_info->trans->nest_level != nest_level) add_tabstat_xact_level(pgstat_info, nest_level); @@ -2492,10 +2488,12 @@ pgstat_count_truncate(Relation rel) void pgstat_update_heap_dead_tuples(Relation rel, int delta) { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; + if (pgstat_relation_should_count(rel)) + { + PgStat_TableStatus *pgstat_info = rel->pgstat_info; - if (pgstat_info != NULL) pgstat_info->t_counts.t_delta_dead_tuples -= delta; + } } /* diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 95f595353d..3499c86dbf 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -1104,41 +1104,44 @@ extern PgStat_BackendFunctionEntry *find_funcstat_entry(Oid func_id); extern void pgstat_initstats(Relation rel); +#define pgstat_relation_should_count(rel) \ + (likely((rel)->pgstat_info != NULL)) + /* nontransactional event counts are simple enough to inline */ #define pgstat_count_heap_scan(rel) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_numscans++; \ } while (0) #define pgstat_count_heap_getnext(rel) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_tuples_returned++; \ } while (0) #define pgstat_count_heap_fetch(rel) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_tuples_fetched++; \ } while (0) #define pgstat_count_index_scan(rel) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_numscans++; \ } while (0) #define pgstat_count_index_tuples(rel, n) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_tuples_returned += (n); \ } while (0) #define pgstat_count_buffer_read(rel) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_blocks_fetched++; \ } while (0) #define pgstat_count_buffer_hit(rel) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_blocks_hit++; \ } while (0) #define pgstat_count_buffer_read_time(n) \ From bff258a2732e3f8cf94010345c4ad37f8f9b5899 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sun, 20 Mar 2022 19:12:09 -0700 Subject: [PATCH 190/772] pgstat: rename pgstat_initstats() to pgstat_relation_init(). The old name was overly generic. An upcoming commit moves relation stats handling into its own file, making pgstat_initstats() look even more out of place. Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/backend/access/common/relation.c | 4 ++-- src/backend/postmaster/pgstat.c | 6 +++--- src/include/pgstat.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backend/access/common/relation.c b/src/backend/access/common/relation.c index 1c02bf03a3..003663ab81 100644 --- a/src/backend/access/common/relation.c +++ b/src/backend/access/common/relation.c @@ -73,7 +73,7 @@ relation_open(Oid relationId, LOCKMODE lockmode) if (RelationUsesLocalBuffers(r)) MyXactFlags |= XACT_FLAGS_ACCESSEDTEMPNAMESPACE; - pgstat_initstats(r); + pgstat_relation_init(r); return r; } @@ -123,7 +123,7 @@ try_relation_open(Oid relationId, LOCKMODE lockmode) if (RelationUsesLocalBuffers(r)) MyXactFlags |= XACT_FLAGS_ACCESSEDTEMPNAMESPACE; - pgstat_initstats(r); + pgstat_relation_init(r); return r; } diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 62411313af..e90b456006 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -188,7 +188,7 @@ static bool pgStatRunningInCollector = false; * for the life of the backend. Also, we zero out the t_id fields of the * contained PgStat_TableStatus structs whenever they are not actively in use. * This allows relcache pgstat_info pointers to be treated as long-lived data, - * avoiding repeated searches in pgstat_initstats() when a relation is + * avoiding repeated searches in pgstat_relation_init() when a relation is * repeatedly opened during a transaction. */ #define TABSTAT_QUANTUM 100 /* we alloc this many at a time */ @@ -2147,7 +2147,7 @@ pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize) /* ---------- - * pgstat_initstats() - + * pgstat_relation_init() - * * Initialize a relcache entry to count access statistics. * Called whenever a relation is opened. @@ -2159,7 +2159,7 @@ pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize) * ---------- */ void -pgstat_initstats(Relation rel) +pgstat_relation_init(Relation rel) { Oid rel_id = rel->rd_id; char relkind = rel->rd_rel->relkind; diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 3499c86dbf..cfb00ba65a 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -1102,7 +1102,7 @@ extern void pgstat_initialize(void); extern PgStat_TableStatus *find_tabstat_entry(Oid rel_id); extern PgStat_BackendFunctionEntry *find_funcstat_entry(Oid func_id); -extern void pgstat_initstats(Relation rel); +extern void pgstat_relation_init(Relation rel); #define pgstat_relation_should_count(rel) \ (likely((rel)->pgstat_info != NULL)) From d4ba8b51c76300f06cc23f4d8a41d9f7210c4866 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sun, 20 Mar 2022 19:12:09 -0700 Subject: [PATCH 191/772] pgstat: separate "xact level" handling out of relation specific functions. This is in preparation of a later commit moving relation stats handling into its own file. Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/backend/postmaster/pgstat.c | 68 +++++++++++++++++---------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index e90b456006..ab47a083c3 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -235,16 +235,24 @@ static bool have_relation_stats = false; static bool have_function_stats = false; /* - * Tuple insertion/deletion counts for an open transaction can't be propagated - * into PgStat_TableStatus counters until we know if it is going to commit - * or abort. Hence, we keep these counts in per-subxact structs that live - * in TopTransactionContext. This data structure is designed on the assumption - * that subxacts won't usually modify very many tables. + * Some stats changes are transactional. To maintain those, a stack of + * PgStat_SubXactStatus entries is maintained, which contain data pertaining + * to the current transaction and its active subtransactions. */ typedef struct PgStat_SubXactStatus { int nest_level; /* subtransaction nest level */ + struct PgStat_SubXactStatus *prev; /* higher-level subxact if any */ + + /* + * Tuple insertion/deletion counts for an open transaction can't be + * propagated into PgStat_TableStatus counters until we know if it is + * going to commit or abort. Hence, we keep these counts in per-subxact + * structs that live in TopTransactionContext. This data structure is + * designed on the assumption that subxacts won't usually modify very many + * tables. + */ PgStat_TableXactStatus *first; /* head of list for this subxact */ } PgStat_SubXactStatus; @@ -2305,10 +2313,11 @@ find_tabstat_entry(Oid rel_id) } /* - * get_tabstat_stack_level - add a new (sub)transaction stack entry if needed + * Ensure (sub)transaction stack entry for the given nest_level exists, adding + * it if needed. */ static PgStat_SubXactStatus * -get_tabstat_stack_level(int nest_level) +pgstat_xact_stack_level_get(int nest_level) { PgStat_SubXactStatus *xact_state; @@ -2339,7 +2348,7 @@ add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level) * If this is the first rel to be modified at the current nest level, we * first have to push a transaction stack entry. */ - xact_state = get_tabstat_stack_level(nest_level); + xact_state = pgstat_xact_stack_level_get(nest_level); /* Now make a per-table stack entry */ trans = (PgStat_TableXactStatus *) @@ -2353,6 +2362,19 @@ add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level) pgstat_info->trans = trans; } +/* + * Add a new (sub)transaction record if needed. + */ +static void +ensure_tabstat_xact_level(PgStat_TableStatus *pgstat_info) +{ + int nest_level = GetCurrentTransactionNestLevel(); + + if (pgstat_info->trans == NULL || + pgstat_info->trans->nest_level != nest_level) + add_tabstat_xact_level(pgstat_info, nest_level); +} + /* * pgstat_count_heap_insert - count a tuple insertion of n tuples */ @@ -2362,13 +2384,8 @@ pgstat_count_heap_insert(Relation rel, PgStat_Counter n) if (pgstat_relation_should_count(rel)) { PgStat_TableStatus *pgstat_info = rel->pgstat_info; - int nest_level = GetCurrentTransactionNestLevel(); - - /* We have to log the effect at the proper transactional level */ - if (pgstat_info->trans == NULL || - pgstat_info->trans->nest_level != nest_level) - add_tabstat_xact_level(pgstat_info, nest_level); + ensure_tabstat_xact_level(pgstat_info); pgstat_info->trans->tuples_inserted += n; } } @@ -2382,13 +2399,8 @@ pgstat_count_heap_update(Relation rel, bool hot) if (pgstat_relation_should_count(rel)) { PgStat_TableStatus *pgstat_info = rel->pgstat_info; - int nest_level = GetCurrentTransactionNestLevel(); - - /* We have to log the effect at the proper transactional level */ - if (pgstat_info->trans == NULL || - pgstat_info->trans->nest_level != nest_level) - add_tabstat_xact_level(pgstat_info, nest_level); + ensure_tabstat_xact_level(pgstat_info); pgstat_info->trans->tuples_updated++; /* t_tuples_hot_updated is nontransactional, so just advance it */ @@ -2406,13 +2418,8 @@ pgstat_count_heap_delete(Relation rel) if (pgstat_relation_should_count(rel)) { PgStat_TableStatus *pgstat_info = rel->pgstat_info; - int nest_level = GetCurrentTransactionNestLevel(); - - /* We have to log the effect at the proper transactional level */ - if (pgstat_info->trans == NULL || - pgstat_info->trans->nest_level != nest_level) - add_tabstat_xact_level(pgstat_info, nest_level); + ensure_tabstat_xact_level(pgstat_info); pgstat_info->trans->tuples_deleted++; } } @@ -2463,13 +2470,8 @@ pgstat_count_truncate(Relation rel) if (pgstat_relation_should_count(rel)) { PgStat_TableStatus *pgstat_info = rel->pgstat_info; - int nest_level = GetCurrentTransactionNestLevel(); - - /* We have to log the effect at the proper transactional level */ - if (pgstat_info->trans == NULL || - pgstat_info->trans->nest_level != nest_level) - add_tabstat_xact_level(pgstat_info, nest_level); + ensure_tabstat_xact_level(pgstat_info); pgstat_truncdrop_save_counters(pgstat_info->trans, false); pgstat_info->trans->tuples_inserted = 0; pgstat_info->trans->tuples_updated = 0; @@ -2656,7 +2658,7 @@ AtEOSubXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit, in */ PgStat_SubXactStatus *upper_xact_state; - upper_xact_state = get_tabstat_stack_level(nestDepth - 1); + upper_xact_state = pgstat_xact_stack_level_get(nestDepth - 1); trans->next = upper_xact_state->first; upper_xact_state->first = trans; trans->nest_level = nestDepth - 1; From c540d3715731e0e50259011ee62ea4c0c042b1b1 Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Mon, 21 Mar 2022 12:33:29 +0200 Subject: [PATCH 192/772] Fix typo in file identification Clearly a simple copy/paste mistake when the file was created. --- src/backend/replication/basebackup_target.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/replication/basebackup_target.c b/src/backend/replication/basebackup_target.c index d8b7cb3243..55651cbe16 100644 --- a/src/backend/replication/basebackup_target.c +++ b/src/backend/replication/basebackup_target.c @@ -9,7 +9,7 @@ * Portions Copyright (c) 2010-2020, PostgreSQL Global Development Group * * IDENTIFICATION - * src/backend/replication/basebackup_gzip.c + * src/backend/replication/basebackup_target.c * *------------------------------------------------------------------------- */ From 1f8bc448680bf93a974cb5f52d496514ff67720c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 21 Mar 2022 11:11:55 -0400 Subject: [PATCH 193/772] Remove workarounds for avoiding [U]INT64_FORMAT in translatable strings. Further code simplification along the same lines as d914eb347 and earlier patches. Aleksander Alekseev, Japin Li Discussion: https://postgr.es/m/CAJ7c6TMSKi3Xs8h5MP38XOnQQpBLazJvVxVfPn++roitDJcR7g@mail.gmail.com --- src/backend/access/brin/brin.c | 14 +--- src/backend/commands/copyfrom.c | 37 ++++---- src/backend/commands/sequence.c | 126 +++++++--------------------- src/backend/utils/adt/xid8funcs.c | 5 +- src/bin/pg_checksums/pg_checksums.c | 27 ++---- 5 files changed, 66 insertions(+), 143 deletions(-) diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c index ba78ecff66..4366010768 100644 --- a/src/backend/access/brin/brin.c +++ b/src/backend/access/brin/brin.c @@ -1017,13 +1017,10 @@ brin_summarize_range(PG_FUNCTION_ARGS) errhint("BRIN control functions cannot be executed during recovery."))); if (heapBlk64 > BRIN_ALL_BLOCKRANGES || heapBlk64 < 0) - { - char *blk = psprintf(INT64_FORMAT, heapBlk64); - ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), - errmsg("block number out of range: %s", blk))); - } + errmsg("block number out of range: %lld", + (long long) heapBlk64))); heapBlk = (BlockNumber) heapBlk64; /* @@ -1094,13 +1091,10 @@ brin_desummarize_range(PG_FUNCTION_ARGS) errhint("BRIN control functions cannot be executed during recovery."))); if (heapBlk64 > MaxBlockNumber || heapBlk64 < 0) - { - char *blk = psprintf(INT64_FORMAT, heapBlk64); - ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), - errmsg("block number out of range: %s", blk))); - } + errmsg("block number out of range: %lld", + (long long) heapBlk64))); heapBlk = (BlockNumber) heapBlk64; /* diff --git a/src/backend/commands/copyfrom.c b/src/backend/commands/copyfrom.c index 7b3f5a84b8..db6eb6fae7 100644 --- a/src/backend/commands/copyfrom.c +++ b/src/backend/commands/copyfrom.c @@ -115,21 +115,19 @@ void CopyFromErrorCallback(void *arg) { CopyFromState cstate = (CopyFromState) arg; - char curlineno_str[32]; - - snprintf(curlineno_str, sizeof(curlineno_str), UINT64_FORMAT, - cstate->cur_lineno); if (cstate->opts.binary) { /* can't usefully display the data */ if (cstate->cur_attname) - errcontext("COPY %s, line %s, column %s", - cstate->cur_relname, curlineno_str, + errcontext("COPY %s, line %llu, column %s", + cstate->cur_relname, + (unsigned long long) cstate->cur_lineno, cstate->cur_attname); else - errcontext("COPY %s, line %s", - cstate->cur_relname, curlineno_str); + errcontext("COPY %s, line %llu", + cstate->cur_relname, + (unsigned long long) cstate->cur_lineno); } else { @@ -139,16 +137,19 @@ CopyFromErrorCallback(void *arg) char *attval; attval = limit_printout_length(cstate->cur_attval); - errcontext("COPY %s, line %s, column %s: \"%s\"", - cstate->cur_relname, curlineno_str, - cstate->cur_attname, attval); + errcontext("COPY %s, line %llu, column %s: \"%s\"", + cstate->cur_relname, + (unsigned long long) cstate->cur_lineno, + cstate->cur_attname, + attval); pfree(attval); } else if (cstate->cur_attname) { /* error is relevant to a particular column, value is NULL */ - errcontext("COPY %s, line %s, column %s: null input", - cstate->cur_relname, curlineno_str, + errcontext("COPY %s, line %llu, column %s: null input", + cstate->cur_relname, + (unsigned long long) cstate->cur_lineno, cstate->cur_attname); } else @@ -163,14 +164,16 @@ CopyFromErrorCallback(void *arg) char *lineval; lineval = limit_printout_length(cstate->line_buf.data); - errcontext("COPY %s, line %s: \"%s\"", - cstate->cur_relname, curlineno_str, lineval); + errcontext("COPY %s, line %llu: \"%s\"", + cstate->cur_relname, + (unsigned long long) cstate->cur_lineno, lineval); pfree(lineval); } else { - errcontext("COPY %s, line %s", - cstate->cur_relname, curlineno_str); + errcontext("COPY %s, line %llu", + cstate->cur_relname, + (unsigned long long) cstate->cur_lineno); } } } diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index ab592ce2f1..c13cada3bf 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -706,15 +706,11 @@ nextval_internal(Oid relid, bool check_permissions) if (rescnt > 0) break; /* stop fetching */ if (!cycle) - { - char buf[100]; - - snprintf(buf, sizeof(buf), INT64_FORMAT, maxv); ereport(ERROR, (errcode(ERRCODE_SEQUENCE_GENERATOR_LIMIT_EXCEEDED), - errmsg("nextval: reached maximum value of sequence \"%s\" (%s)", - RelationGetRelationName(seqrel), buf))); - } + errmsg("nextval: reached maximum value of sequence \"%s\" (%lld)", + RelationGetRelationName(seqrel), + (long long) maxv))); next = minv; } else @@ -729,15 +725,11 @@ nextval_internal(Oid relid, bool check_permissions) if (rescnt > 0) break; /* stop fetching */ if (!cycle) - { - char buf[100]; - - snprintf(buf, sizeof(buf), INT64_FORMAT, minv); ereport(ERROR, (errcode(ERRCODE_SEQUENCE_GENERATOR_LIMIT_EXCEEDED), - errmsg("nextval: reached minimum value of sequence \"%s\" (%s)", - RelationGetRelationName(seqrel), buf))); - } + errmsg("nextval: reached minimum value of sequence \"%s\" (%lld)", + RelationGetRelationName(seqrel), + (long long) minv))); next = maxv; } else @@ -975,20 +967,11 @@ do_setval(Oid relid, int64 next, bool iscalled) seq = read_seq_tuple(seqrel, &buf, &seqdatatuple); if ((next < minv) || (next > maxv)) - { - char bufv[100], - bufm[100], - bufx[100]; - - snprintf(bufv, sizeof(bufv), INT64_FORMAT, next); - snprintf(bufm, sizeof(bufm), INT64_FORMAT, minv); - snprintf(bufx, sizeof(bufx), INT64_FORMAT, maxv); ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), - errmsg("setval: value %s is out of bounds for sequence \"%s\" (%s..%s)", - bufv, RelationGetRelationName(seqrel), - bufm, bufx))); - } + errmsg("setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)", + (long long) next, RelationGetRelationName(seqrel), + (long long) minv, (long long) maxv))); /* Set the currval() state only if iscalled = true */ if (iscalled) @@ -1468,16 +1451,11 @@ init_params(ParseState *pstate, List *options, bool for_identity, /* Validate maximum value. No need to check INT8 as seqmax is an int64 */ if ((seqform->seqtypid == INT2OID && (seqform->seqmax < PG_INT16_MIN || seqform->seqmax > PG_INT16_MAX)) || (seqform->seqtypid == INT4OID && (seqform->seqmax < PG_INT32_MIN || seqform->seqmax > PG_INT32_MAX))) - { - char bufx[100]; - - snprintf(bufx, sizeof(bufx), INT64_FORMAT, seqform->seqmax); - ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("MAXVALUE (%s) is out of range for sequence data type %s", - bufx, format_type_be(seqform->seqtypid)))); - } + errmsg("MAXVALUE (%lld) is out of range for sequence data type %s", + (long long) seqform->seqmax, + format_type_be(seqform->seqtypid)))); /* MINVALUE (null arg means NO MINVALUE) */ if (min_value != NULL && min_value->arg) @@ -1505,30 +1483,19 @@ init_params(ParseState *pstate, List *options, bool for_identity, /* Validate minimum value. No need to check INT8 as seqmin is an int64 */ if ((seqform->seqtypid == INT2OID && (seqform->seqmin < PG_INT16_MIN || seqform->seqmin > PG_INT16_MAX)) || (seqform->seqtypid == INT4OID && (seqform->seqmin < PG_INT32_MIN || seqform->seqmin > PG_INT32_MAX))) - { - char bufm[100]; - - snprintf(bufm, sizeof(bufm), INT64_FORMAT, seqform->seqmin); - ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("MINVALUE (%s) is out of range for sequence data type %s", - bufm, format_type_be(seqform->seqtypid)))); - } + errmsg("MINVALUE (%lld) is out of range for sequence data type %s", + (long long) seqform->seqmin, + format_type_be(seqform->seqtypid)))); /* crosscheck min/max */ if (seqform->seqmin >= seqform->seqmax) - { - char bufm[100], - bufx[100]; - - snprintf(bufm, sizeof(bufm), INT64_FORMAT, seqform->seqmin); - snprintf(bufx, sizeof(bufx), INT64_FORMAT, seqform->seqmax); ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("MINVALUE (%s) must be less than MAXVALUE (%s)", - bufm, bufx))); - } + errmsg("MINVALUE (%lld) must be less than MAXVALUE (%lld)", + (long long) seqform->seqmin, + (long long) seqform->seqmax))); /* START WITH */ if (start_value != NULL) @@ -1545,29 +1512,17 @@ init_params(ParseState *pstate, List *options, bool for_identity, /* crosscheck START */ if (seqform->seqstart < seqform->seqmin) - { - char bufs[100], - bufm[100]; - - snprintf(bufs, sizeof(bufs), INT64_FORMAT, seqform->seqstart); - snprintf(bufm, sizeof(bufm), INT64_FORMAT, seqform->seqmin); ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("START value (%s) cannot be less than MINVALUE (%s)", - bufs, bufm))); - } + errmsg("START value (%lld) cannot be less than MINVALUE (%lld)", + (long long) seqform->seqstart, + (long long) seqform->seqmin))); if (seqform->seqstart > seqform->seqmax) - { - char bufs[100], - bufm[100]; - - snprintf(bufs, sizeof(bufs), INT64_FORMAT, seqform->seqstart); - snprintf(bufm, sizeof(bufm), INT64_FORMAT, seqform->seqmax); ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("START value (%s) cannot be greater than MAXVALUE (%s)", - bufs, bufm))); - } + errmsg("START value (%lld) cannot be greater than MAXVALUE (%lld)", + (long long) seqform->seqstart, + (long long) seqform->seqmax))); /* RESTART [WITH] */ if (restart_value != NULL) @@ -1587,44 +1542,27 @@ init_params(ParseState *pstate, List *options, bool for_identity, /* crosscheck RESTART (or current value, if changing MIN/MAX) */ if (seqdataform->last_value < seqform->seqmin) - { - char bufs[100], - bufm[100]; - - snprintf(bufs, sizeof(bufs), INT64_FORMAT, seqdataform->last_value); - snprintf(bufm, sizeof(bufm), INT64_FORMAT, seqform->seqmin); ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("RESTART value (%s) cannot be less than MINVALUE (%s)", - bufs, bufm))); - } + errmsg("RESTART value (%lld) cannot be less than MINVALUE (%lld)", + (long long) seqdataform->last_value, + (long long) seqform->seqmin))); if (seqdataform->last_value > seqform->seqmax) - { - char bufs[100], - bufm[100]; - - snprintf(bufs, sizeof(bufs), INT64_FORMAT, seqdataform->last_value); - snprintf(bufm, sizeof(bufm), INT64_FORMAT, seqform->seqmax); ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("RESTART value (%s) cannot be greater than MAXVALUE (%s)", - bufs, bufm))); - } + errmsg("RESTART value (%lld) cannot be greater than MAXVALUE (%lld)", + (long long) seqdataform->last_value, + (long long) seqform->seqmax))); /* CACHE */ if (cache_value != NULL) { seqform->seqcache = defGetInt64(cache_value); if (seqform->seqcache <= 0) - { - char buf[100]; - - snprintf(buf, sizeof(buf), INT64_FORMAT, seqform->seqcache); ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("CACHE (%s) must be greater than zero", - buf))); - } + errmsg("CACHE (%lld) must be greater than zero", + (long long) seqform->seqcache))); seqdataform->log_cnt = 0; } else if (isInit) diff --git a/src/backend/utils/adt/xid8funcs.c b/src/backend/utils/adt/xid8funcs.c index 60e57876de..6c57ec3d35 100644 --- a/src/backend/utils/adt/xid8funcs.c +++ b/src/backend/utils/adt/xid8funcs.c @@ -113,9 +113,8 @@ TransactionIdInRecentPast(FullTransactionId fxid, TransactionId *extracted_xid) if (!FullTransactionIdPrecedes(fxid, now_fullxid)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("transaction ID %s is in the future", - psprintf(UINT64_FORMAT, - U64FromFullTransactionId(fxid))))); + errmsg("transaction ID %llu is in the future", + (unsigned long long) U64FromFullTransactionId(fxid)))); /* * ShmemVariableCache->oldestClogXid is protected by XactTruncationLock, diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c index 7e69475947..5f0f5ee62d 100644 --- a/src/bin/pg_checksums/pg_checksums.c +++ b/src/bin/pg_checksums/pg_checksums.c @@ -132,8 +132,6 @@ static void progress_report(bool finished) { int percent; - char total_size_str[32]; - char current_size_str[32]; pg_time_t now; Assert(showprogress); @@ -152,18 +150,9 @@ progress_report(bool finished) /* Calculate current percentage of size done */ percent = total_size ? (int) ((current_size) * 100 / total_size) : 0; - /* - * Separate step to keep platform-dependent format code out of - * translatable strings. And we only test for INT64_FORMAT availability - * in snprintf, not fprintf. - */ - snprintf(total_size_str, sizeof(total_size_str), INT64_FORMAT, - total_size / (1024 * 1024)); - snprintf(current_size_str, sizeof(current_size_str), INT64_FORMAT, - current_size / (1024 * 1024)); - - fprintf(stderr, _("%*s/%s MB (%d%%) computed"), - (int) strlen(current_size_str), current_size_str, total_size_str, + fprintf(stderr, _("%lld/%lld MB (%d%%) computed"), + (long long) (current_size / (1024 * 1024)), + (long long) (total_size / (1024 * 1024)), percent); /* @@ -657,11 +646,11 @@ main(int argc, char *argv[]) progress_report(true); printf(_("Checksum operation completed\n")); - printf(_("Files scanned: %s\n"), psprintf(INT64_FORMAT, files_scanned)); - printf(_("Blocks scanned: %s\n"), psprintf(INT64_FORMAT, blocks_scanned)); + printf(_("Files scanned: %lld\n"), (long long) files_scanned); + printf(_("Blocks scanned: %lld\n"), (long long) blocks_scanned); if (mode == PG_MODE_CHECK) { - printf(_("Bad checksums: %s\n"), psprintf(INT64_FORMAT, badblocks)); + printf(_("Bad checksums: %lld\n"), (long long) badblocks); printf(_("Data checksum version: %u\n"), ControlFile->data_checksum_version); if (badblocks > 0) @@ -669,8 +658,8 @@ main(int argc, char *argv[]) } else if (mode == PG_MODE_ENABLE) { - printf(_("Files written: %s\n"), psprintf(INT64_FORMAT, files_written)); - printf(_("Blocks written: %s\n"), psprintf(INT64_FORMAT, blocks_written)); + printf(_("Files written: %lld\n"), (long long) files_written); + printf(_("Blocks written: %lld\n"), (long long) blocks_written); } } From 7b6ec86532c2ca585d671239bba867fe380448ed Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 21 Mar 2022 12:22:13 -0400 Subject: [PATCH 194/772] Fix risk of deadlock failure while dropping a partitioned index. DROP INDEX needs to lock the index's table before the index itself, else it will deadlock against ordinary queries that acquire the relation locks in that order. This is correctly mechanized for plain indexes by RangeVarCallbackForDropRelation; but in the case of a partitioned index, we neglected to lock the child tables in advance of locking the child indexes. We can fix that by traversing the inheritance tree and acquiring the needed locks in RemoveRelations, after we have acquired our locks on the parent partitioned table and index. While at it, do some refactoring to eliminate confusion between the actual and expected relkind in RangeVarCallbackForDropRelation. We can save a couple of syscache lookups too, by having that function pass back info that RemoveRelations will need. Back-patch to v11 where partitioned indexes were added. Jimmy Yih, Gaurab Dey, Tom Lane Discussion: https://postgr.es/m/BYAPR05MB645402330042E17D91A70C12BD5F9@BYAPR05MB6454.namprd05.prod.outlook.com --- src/backend/commands/tablecmds.c | 61 +++++++---- .../expected/partition-drop-index-locking.out | 100 ++++++++++++++++++ src/test/isolation/isolation_schedule | 1 + .../specs/partition-drop-index-locking.spec | 47 ++++++++ 4 files changed, 191 insertions(+), 18 deletions(-) create mode 100644 src/test/isolation/expected/partition-drop-index-locking.out create mode 100644 src/test/isolation/specs/partition-drop-index-locking.spec diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index dc5872f988..ab9a53b27c 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -295,12 +295,18 @@ static const struct dropmsgstrings dropmsgstringarray[] = { {'\0', 0, NULL, NULL, NULL, NULL} }; +/* communication between RemoveRelations and RangeVarCallbackForDropRelation */ struct DropRelationCallbackState { - char relkind; + /* These fields are set by RemoveRelations: */ + char expected_relkind; + LOCKMODE heap_lockmode; + /* These fields are state to track which subsidiary locks are held: */ Oid heapOid; Oid partParentOid; - bool concurrent; + /* These fields are passed back by RangeVarCallbackForDropRelation: */ + char actual_relkind; + char actual_relpersistence; }; /* Alter table target-type flags for ATSimplePermissions */ @@ -1416,10 +1422,13 @@ RemoveRelations(DropStmt *drop) AcceptInvalidationMessages(); /* Look up the appropriate relation using namespace search. */ - state.relkind = relkind; + state.expected_relkind = relkind; + state.heap_lockmode = drop->concurrent ? + ShareUpdateExclusiveLock : AccessExclusiveLock; + /* We must initialize these fields to show that no locks are held: */ state.heapOid = InvalidOid; state.partParentOid = InvalidOid; - state.concurrent = drop->concurrent; + relOid = RangeVarGetRelidExtended(rel, lockmode, RVR_MISSING_OK, RangeVarCallbackForDropRelation, (void *) &state); @@ -1433,10 +1442,10 @@ RemoveRelations(DropStmt *drop) /* * Decide if concurrent mode needs to be used here or not. The - * relation persistence cannot be known without its OID. + * callback retrieved the rel's persistence for us. */ if (drop->concurrent && - get_rel_persistence(relOid) != RELPERSISTENCE_TEMP) + state.actual_relpersistence != RELPERSISTENCE_TEMP) { Assert(list_length(drop->objects) == 1 && drop->removeType == OBJECT_INDEX); @@ -1448,12 +1457,24 @@ RemoveRelations(DropStmt *drop) * either. */ if ((flags & PERFORM_DELETION_CONCURRENTLY) != 0 && - get_rel_relkind(relOid) == RELKIND_PARTITIONED_INDEX) + state.actual_relkind == RELKIND_PARTITIONED_INDEX) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot drop partitioned index \"%s\" concurrently", rel->relname))); + /* + * If we're told to drop a partitioned index, we must acquire lock on + * all the children of its parent partitioned table before proceeding. + * Otherwise we'd try to lock the child index partitions before their + * tables, leading to potential deadlock against other sessions that + * will lock those objects in the other order. + */ + if (state.actual_relkind == RELKIND_PARTITIONED_INDEX) + (void) find_all_inheritors(state.heapOid, + state.heap_lockmode, + NULL); + /* OK, we're ready to delete this one */ obj.classId = RelationRelationId; obj.objectId = relOid; @@ -1479,7 +1500,6 @@ RangeVarCallbackForDropRelation(const RangeVar *rel, Oid relOid, Oid oldRelOid, { HeapTuple tuple; struct DropRelationCallbackState *state; - char relkind; char expected_relkind; bool is_partition; Form_pg_class classform; @@ -1487,9 +1507,7 @@ RangeVarCallbackForDropRelation(const RangeVar *rel, Oid relOid, Oid oldRelOid, bool invalid_system_index = false; state = (struct DropRelationCallbackState *) arg; - relkind = state->relkind; - heap_lockmode = state->concurrent ? - ShareUpdateExclusiveLock : AccessExclusiveLock; + heap_lockmode = state->heap_lockmode; /* * If we previously locked some other index's heap, and the name we're @@ -1523,6 +1541,10 @@ RangeVarCallbackForDropRelation(const RangeVar *rel, Oid relOid, Oid oldRelOid, classform = (Form_pg_class) GETSTRUCT(tuple); is_partition = classform->relispartition; + /* Pass back some data to save lookups in RemoveRelations */ + state->actual_relkind = classform->relkind; + state->actual_relpersistence = classform->relpersistence; + /* * Both RELKIND_RELATION and RELKIND_PARTITIONED_TABLE are OBJECT_TABLE, * but RemoveRelations() can only pass one relkind for a given relation. @@ -1538,13 +1560,15 @@ RangeVarCallbackForDropRelation(const RangeVar *rel, Oid relOid, Oid oldRelOid, else expected_relkind = classform->relkind; - if (relkind != expected_relkind) - DropErrorMsgWrongType(rel->relname, classform->relkind, relkind); + if (state->expected_relkind != expected_relkind) + DropErrorMsgWrongType(rel->relname, classform->relkind, + state->expected_relkind); /* Allow DROP to either table owner or schema owner */ if (!pg_class_ownercheck(relOid, GetUserId()) && !pg_namespace_ownercheck(classform->relnamespace, GetUserId())) - aclcheck_error(ACLCHECK_NOT_OWNER, get_relkind_objtype(get_rel_relkind(relOid)), + aclcheck_error(ACLCHECK_NOT_OWNER, + get_relkind_objtype(classform->relkind), rel->relname); /* @@ -1553,7 +1577,7 @@ RangeVarCallbackForDropRelation(const RangeVar *rel, Oid relOid, Oid oldRelOid, * only concerns indexes of toast relations that became invalid during a * REINDEX CONCURRENTLY process. */ - if (IsSystemClass(relOid, classform) && relkind == RELKIND_INDEX) + if (IsSystemClass(relOid, classform) && classform->relkind == RELKIND_INDEX) { HeapTuple locTuple; Form_pg_index indexform; @@ -1589,9 +1613,10 @@ RangeVarCallbackForDropRelation(const RangeVar *rel, Oid relOid, Oid oldRelOid, * locking the index. index_drop() will need this anyway, and since * regular queries lock tables before their indexes, we risk deadlock if * we do it the other way around. No error if we don't find a pg_index - * entry, though --- the relation may have been dropped. + * entry, though --- the relation may have been dropped. Note that this + * code will execute for either plain or partitioned indexes. */ - if ((relkind == RELKIND_INDEX || relkind == RELKIND_PARTITIONED_INDEX) && + if (expected_relkind == RELKIND_INDEX && relOid != oldRelOid) { state->heapOid = IndexGetRelation(relOid, true); @@ -1602,7 +1627,7 @@ RangeVarCallbackForDropRelation(const RangeVar *rel, Oid relOid, Oid oldRelOid, /* * Similarly, if the relation is a partition, we must acquire lock on its * parent before locking the partition. That's because queries lock the - * parent before its partitions, so we risk deadlock it we do it the other + * parent before its partitions, so we risk deadlock if we do it the other * way around. */ if (is_partition && relOid != oldRelOid) diff --git a/src/test/isolation/expected/partition-drop-index-locking.out b/src/test/isolation/expected/partition-drop-index-locking.out new file mode 100644 index 0000000000..9acd51dfde --- /dev/null +++ b/src/test/isolation/expected/partition-drop-index-locking.out @@ -0,0 +1,100 @@ +Parsed test spec with 3 sessions + +starting permutation: s1begin s1lock s2begin s2drop s1select s3getlocks s1commit s3getlocks s2commit +step s1begin: BEGIN; +step s1lock: LOCK TABLE part_drop_index_locking_subpart_child IN ACCESS SHARE MODE; +step s2begin: BEGIN; +step s2drop: DROP INDEX part_drop_index_locking_idx; +step s1select: SELECT * FROM part_drop_index_locking_subpart_child; +id +-- +(0 rows) + +step s3getlocks: + SELECT s.query, c.relname, l.mode, l.granted + FROM pg_locks l + JOIN pg_class c ON l.relation = c.oid + JOIN pg_stat_activity s ON l.pid = s.pid + WHERE c.relname LIKE 'part_drop_index_locking%' + ORDER BY s.query, c.relname, l.mode, l.granted; + +query |relname |mode |granted +----------------------------------------------------+---------------------------------------------+-------------------+------- +DROP INDEX part_drop_index_locking_idx; |part_drop_index_locking |AccessExclusiveLock|t +DROP INDEX part_drop_index_locking_idx; |part_drop_index_locking_idx |AccessExclusiveLock|t +DROP INDEX part_drop_index_locking_idx; |part_drop_index_locking_subpart |AccessExclusiveLock|t +DROP INDEX part_drop_index_locking_idx; |part_drop_index_locking_subpart_child |AccessExclusiveLock|f +SELECT * FROM part_drop_index_locking_subpart_child;|part_drop_index_locking_subpart_child |AccessShareLock |t +SELECT * FROM part_drop_index_locking_subpart_child;|part_drop_index_locking_subpart_child_id_idx |AccessShareLock |t +SELECT * FROM part_drop_index_locking_subpart_child;|part_drop_index_locking_subpart_child_id_idx1|AccessShareLock |t +(7 rows) + +step s1commit: COMMIT; +step s2drop: <... completed> +step s3getlocks: + SELECT s.query, c.relname, l.mode, l.granted + FROM pg_locks l + JOIN pg_class c ON l.relation = c.oid + JOIN pg_stat_activity s ON l.pid = s.pid + WHERE c.relname LIKE 'part_drop_index_locking%' + ORDER BY s.query, c.relname, l.mode, l.granted; + +query |relname |mode |granted +---------------------------------------+--------------------------------------------+-------------------+------- +DROP INDEX part_drop_index_locking_idx;|part_drop_index_locking |AccessExclusiveLock|t +DROP INDEX part_drop_index_locking_idx;|part_drop_index_locking_idx |AccessExclusiveLock|t +DROP INDEX part_drop_index_locking_idx;|part_drop_index_locking_subpart |AccessExclusiveLock|t +DROP INDEX part_drop_index_locking_idx;|part_drop_index_locking_subpart_child |AccessExclusiveLock|t +DROP INDEX part_drop_index_locking_idx;|part_drop_index_locking_subpart_child_id_idx|AccessExclusiveLock|t +DROP INDEX part_drop_index_locking_idx;|part_drop_index_locking_subpart_id_idx |AccessExclusiveLock|t +(6 rows) + +step s2commit: COMMIT; + +starting permutation: s1begin s1lock s2begin s2dropsub s1select s3getlocks s1commit s3getlocks s2commit +step s1begin: BEGIN; +step s1lock: LOCK TABLE part_drop_index_locking_subpart_child IN ACCESS SHARE MODE; +step s2begin: BEGIN; +step s2dropsub: DROP INDEX part_drop_index_locking_subpart_idx; +step s1select: SELECT * FROM part_drop_index_locking_subpart_child; +id +-- +(0 rows) + +step s3getlocks: + SELECT s.query, c.relname, l.mode, l.granted + FROM pg_locks l + JOIN pg_class c ON l.relation = c.oid + JOIN pg_stat_activity s ON l.pid = s.pid + WHERE c.relname LIKE 'part_drop_index_locking%' + ORDER BY s.query, c.relname, l.mode, l.granted; + +query |relname |mode |granted +----------------------------------------------------+---------------------------------------------+-------------------+------- +DROP INDEX part_drop_index_locking_subpart_idx; |part_drop_index_locking_subpart |AccessExclusiveLock|t +DROP INDEX part_drop_index_locking_subpart_idx; |part_drop_index_locking_subpart_child |AccessExclusiveLock|f +DROP INDEX part_drop_index_locking_subpart_idx; |part_drop_index_locking_subpart_idx |AccessExclusiveLock|t +SELECT * FROM part_drop_index_locking_subpart_child;|part_drop_index_locking_subpart_child |AccessShareLock |t +SELECT * FROM part_drop_index_locking_subpart_child;|part_drop_index_locking_subpart_child_id_idx |AccessShareLock |t +SELECT * FROM part_drop_index_locking_subpart_child;|part_drop_index_locking_subpart_child_id_idx1|AccessShareLock |t +(6 rows) + +step s1commit: COMMIT; +step s2dropsub: <... completed> +step s3getlocks: + SELECT s.query, c.relname, l.mode, l.granted + FROM pg_locks l + JOIN pg_class c ON l.relation = c.oid + JOIN pg_stat_activity s ON l.pid = s.pid + WHERE c.relname LIKE 'part_drop_index_locking%' + ORDER BY s.query, c.relname, l.mode, l.granted; + +query |relname |mode |granted +-----------------------------------------------+---------------------------------------------+-------------------+------- +DROP INDEX part_drop_index_locking_subpart_idx;|part_drop_index_locking_subpart |AccessExclusiveLock|t +DROP INDEX part_drop_index_locking_subpart_idx;|part_drop_index_locking_subpart_child |AccessExclusiveLock|t +DROP INDEX part_drop_index_locking_subpart_idx;|part_drop_index_locking_subpart_child_id_idx1|AccessExclusiveLock|t +DROP INDEX part_drop_index_locking_subpart_idx;|part_drop_index_locking_subpart_idx |AccessExclusiveLock|t +(4 rows) + +step s2commit: COMMIT; diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule index 0dae483e82..8e87098150 100644 --- a/src/test/isolation/isolation_schedule +++ b/src/test/isolation/isolation_schedule @@ -90,6 +90,7 @@ test: predicate-hash test: predicate-gist test: predicate-gin test: partition-concurrent-attach +test: partition-drop-index-locking test: partition-key-update-1 test: partition-key-update-2 test: partition-key-update-3 diff --git a/src/test/isolation/specs/partition-drop-index-locking.spec b/src/test/isolation/specs/partition-drop-index-locking.spec new file mode 100644 index 0000000000..34e8b528b8 --- /dev/null +++ b/src/test/isolation/specs/partition-drop-index-locking.spec @@ -0,0 +1,47 @@ +# Verify that DROP INDEX properly locks all downward sub-partitions +# and partitions before locking the indexes. + +setup +{ + CREATE TABLE part_drop_index_locking (id int) PARTITION BY RANGE(id); + CREATE TABLE part_drop_index_locking_subpart PARTITION OF part_drop_index_locking FOR VALUES FROM (1) TO (100) PARTITION BY RANGE(id); + CREATE TABLE part_drop_index_locking_subpart_child PARTITION OF part_drop_index_locking_subpart FOR VALUES FROM (1) TO (100); + CREATE INDEX part_drop_index_locking_idx ON part_drop_index_locking(id); + CREATE INDEX part_drop_index_locking_subpart_idx ON part_drop_index_locking_subpart(id); +} + +teardown +{ + DROP TABLE part_drop_index_locking; +} + +# SELECT will take AccessShare lock first on the table and then on its index. +# We can simulate the case where DROP INDEX starts between those steps +# by manually taking the table lock beforehand. +session s1 +step s1begin { BEGIN; } +step s1lock { LOCK TABLE part_drop_index_locking_subpart_child IN ACCESS SHARE MODE; } +step s1select { SELECT * FROM part_drop_index_locking_subpart_child; } +step s1commit { COMMIT; } + +session s2 +step s2begin { BEGIN; } +step s2drop { DROP INDEX part_drop_index_locking_idx; } +step s2dropsub { DROP INDEX part_drop_index_locking_subpart_idx; } +step s2commit { COMMIT; } + +session s3 +step s3getlocks { + SELECT s.query, c.relname, l.mode, l.granted + FROM pg_locks l + JOIN pg_class c ON l.relation = c.oid + JOIN pg_stat_activity s ON l.pid = s.pid + WHERE c.relname LIKE 'part_drop_index_locking%' + ORDER BY s.query, c.relname, l.mode, l.granted; +} + +# Run DROP INDEX on top partitioned table +permutation s1begin s1lock s2begin s2drop(s1commit) s1select s3getlocks s1commit s3getlocks s2commit + +# Run DROP INDEX on top sub-partition table +permutation s1begin s1lock s2begin s2dropsub(s1commit) s1select s3getlocks s1commit s3getlocks s2commit From 17f3bc09284e1b529cdf524bbba709af6493f30c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 21 Mar 2022 14:38:23 -0400 Subject: [PATCH 195/772] Move pg_attrdef manipulation code into new file catalog/pg_attrdef.c. This is a pure refactoring commit: there isn't (I hope) any functional change. StoreAttrDefault and RemoveAttrDefault[ById] are moved from heap.c, reducing the size of that overly-large file by about 300 lines. I took the opportunity to trim unused #includes from heap.c, too. Two new functions for translating between a pg_attrdef OID and the relid/attnum of the owning column are created by extracting ad-hoc code from objectaddress.c. This already removes one copy of said code, and a follow-on bug fix will create more callers. The only other function directly manipulating pg_attrdef is AttrDefaultFetch. I judged it was better to leave that in relcache.c, since it shares special concerns about recursion and error handling with the rest of that module. Discussion: https://postgr.es/m/651168.1647451676@sss.pgh.pa.us --- src/backend/catalog/Makefile | 1 + src/backend/catalog/heap.c | 330 --------------------- src/backend/catalog/objectaddress.c | 95 +----- src/backend/catalog/pg_attrdef.c | 428 ++++++++++++++++++++++++++++ src/backend/commands/tablecmds.c | 1 + src/include/catalog/heap.h | 8 +- src/include/catalog/pg_attrdef.h | 13 + 7 files changed, 450 insertions(+), 426 deletions(-) create mode 100644 src/backend/catalog/pg_attrdef.c diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile index eefebb7bb8..87d7386e01 100644 --- a/src/backend/catalog/Makefile +++ b/src/backend/catalog/Makefile @@ -25,6 +25,7 @@ OBJS = \ objectaddress.o \ partition.o \ pg_aggregate.o \ + pg_attrdef.o \ pg_cast.o \ pg_class.o \ pg_collation.o \ diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 7e99de88b3..696fd5977e 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -30,19 +30,11 @@ #include "postgres.h" #include "access/genam.h" -#include "access/htup_details.h" #include "access/multixact.h" #include "access/relation.h" -#include "access/sysattr.h" #include "access/table.h" #include "access/tableam.h" -#include "access/toast_compression.h" -#include "access/transam.h" -#include "access/xact.h" -#include "access/xlog.h" -#include "catalog/binary_upgrade.h" #include "catalog/catalog.h" -#include "catalog/dependency.h" #include "catalog/heap.h" #include "catalog/index.h" #include "catalog/objectaccess.h" @@ -61,10 +53,8 @@ #include "catalog/pg_tablespace.h" #include "catalog/pg_type.h" #include "catalog/storage.h" -#include "catalog/storage_xlog.h" #include "commands/tablecmds.h" #include "commands/typecmds.h" -#include "executor/executor.h" #include "miscadmin.h" #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" @@ -76,16 +66,10 @@ #include "partitioning/partdesc.h" #include "storage/lmgr.h" #include "storage/predicate.h" -#include "storage/smgr.h" -#include "utils/acl.h" #include "utils/builtins.h" -#include "utils/datum.h" #include "utils/fmgroids.h" #include "utils/inval.h" #include "utils/lsyscache.h" -#include "utils/partcache.h" -#include "utils/ruleutils.h" -#include "utils/snapmgr.h" #include "utils/syscache.h" @@ -1757,131 +1741,6 @@ RemoveAttributeById(Oid relid, AttrNumber attnum) relation_close(rel, NoLock); } -/* - * RemoveAttrDefault - * - * If the specified relation/attribute has a default, remove it. - * (If no default, raise error if complain is true, else return quietly.) - */ -void -RemoveAttrDefault(Oid relid, AttrNumber attnum, - DropBehavior behavior, bool complain, bool internal) -{ - Relation attrdef_rel; - ScanKeyData scankeys[2]; - SysScanDesc scan; - HeapTuple tuple; - bool found = false; - - attrdef_rel = table_open(AttrDefaultRelationId, RowExclusiveLock); - - ScanKeyInit(&scankeys[0], - Anum_pg_attrdef_adrelid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(relid)); - ScanKeyInit(&scankeys[1], - Anum_pg_attrdef_adnum, - BTEqualStrategyNumber, F_INT2EQ, - Int16GetDatum(attnum)); - - scan = systable_beginscan(attrdef_rel, AttrDefaultIndexId, true, - NULL, 2, scankeys); - - /* There should be at most one matching tuple, but we loop anyway */ - while (HeapTupleIsValid(tuple = systable_getnext(scan))) - { - ObjectAddress object; - Form_pg_attrdef attrtuple = (Form_pg_attrdef) GETSTRUCT(tuple); - - object.classId = AttrDefaultRelationId; - object.objectId = attrtuple->oid; - object.objectSubId = 0; - - performDeletion(&object, behavior, - internal ? PERFORM_DELETION_INTERNAL : 0); - - found = true; - } - - systable_endscan(scan); - table_close(attrdef_rel, RowExclusiveLock); - - if (complain && !found) - elog(ERROR, "could not find attrdef tuple for relation %u attnum %d", - relid, attnum); -} - -/* - * RemoveAttrDefaultById - * - * Remove a pg_attrdef entry specified by OID. This is the guts of - * attribute-default removal. Note it should be called via performDeletion, - * not directly. - */ -void -RemoveAttrDefaultById(Oid attrdefId) -{ - Relation attrdef_rel; - Relation attr_rel; - Relation myrel; - ScanKeyData scankeys[1]; - SysScanDesc scan; - HeapTuple tuple; - Oid myrelid; - AttrNumber myattnum; - - /* Grab an appropriate lock on the pg_attrdef relation */ - attrdef_rel = table_open(AttrDefaultRelationId, RowExclusiveLock); - - /* Find the pg_attrdef tuple */ - ScanKeyInit(&scankeys[0], - Anum_pg_attrdef_oid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(attrdefId)); - - scan = systable_beginscan(attrdef_rel, AttrDefaultOidIndexId, true, - NULL, 1, scankeys); - - tuple = systable_getnext(scan); - if (!HeapTupleIsValid(tuple)) - elog(ERROR, "could not find tuple for attrdef %u", attrdefId); - - myrelid = ((Form_pg_attrdef) GETSTRUCT(tuple))->adrelid; - myattnum = ((Form_pg_attrdef) GETSTRUCT(tuple))->adnum; - - /* Get an exclusive lock on the relation owning the attribute */ - myrel = relation_open(myrelid, AccessExclusiveLock); - - /* Now we can delete the pg_attrdef row */ - CatalogTupleDelete(attrdef_rel, &tuple->t_self); - - systable_endscan(scan); - table_close(attrdef_rel, RowExclusiveLock); - - /* Fix the pg_attribute row */ - attr_rel = table_open(AttributeRelationId, RowExclusiveLock); - - tuple = SearchSysCacheCopy2(ATTNUM, - ObjectIdGetDatum(myrelid), - Int16GetDatum(myattnum)); - if (!HeapTupleIsValid(tuple)) /* shouldn't happen */ - elog(ERROR, "cache lookup failed for attribute %d of relation %u", - myattnum, myrelid); - - ((Form_pg_attribute) GETSTRUCT(tuple))->atthasdef = false; - - CatalogTupleUpdate(attr_rel, &tuple->t_self, tuple); - - /* - * Our update of the pg_attribute row will force a relcache rebuild, so - * there's nothing else to do here. - */ - table_close(attr_rel, RowExclusiveLock); - - /* Keep lock on attribute's rel until end of xact */ - relation_close(myrel, NoLock); -} - /* * heap_drop_with_catalog - removes specified relation from catalogs * @@ -2193,195 +2052,6 @@ SetAttrMissing(Oid relid, char *attname, char *value) table_close(tablerel, AccessExclusiveLock); } -/* - * Store a default expression for column attnum of relation rel. - * - * Returns the OID of the new pg_attrdef tuple. - * - * add_column_mode must be true if we are storing the default for a new - * attribute, and false if it's for an already existing attribute. The reason - * for this is that the missing value must never be updated after it is set, - * which can only be when a column is added to the table. Otherwise we would - * in effect be changing existing tuples. - */ -Oid -StoreAttrDefault(Relation rel, AttrNumber attnum, - Node *expr, bool is_internal, bool add_column_mode) -{ - char *adbin; - Relation adrel; - HeapTuple tuple; - Datum values[4]; - static bool nulls[4] = {false, false, false, false}; - Relation attrrel; - HeapTuple atttup; - Form_pg_attribute attStruct; - char attgenerated; - Oid attrdefOid; - ObjectAddress colobject, - defobject; - - adrel = table_open(AttrDefaultRelationId, RowExclusiveLock); - - /* - * Flatten expression to string form for storage. - */ - adbin = nodeToString(expr); - - /* - * Make the pg_attrdef entry. - */ - attrdefOid = GetNewOidWithIndex(adrel, AttrDefaultOidIndexId, - Anum_pg_attrdef_oid); - values[Anum_pg_attrdef_oid - 1] = ObjectIdGetDatum(attrdefOid); - values[Anum_pg_attrdef_adrelid - 1] = RelationGetRelid(rel); - values[Anum_pg_attrdef_adnum - 1] = attnum; - values[Anum_pg_attrdef_adbin - 1] = CStringGetTextDatum(adbin); - - tuple = heap_form_tuple(adrel->rd_att, values, nulls); - CatalogTupleInsert(adrel, tuple); - - defobject.classId = AttrDefaultRelationId; - defobject.objectId = attrdefOid; - defobject.objectSubId = 0; - - table_close(adrel, RowExclusiveLock); - - /* now can free some of the stuff allocated above */ - pfree(DatumGetPointer(values[Anum_pg_attrdef_adbin - 1])); - heap_freetuple(tuple); - pfree(adbin); - - /* - * Update the pg_attribute entry for the column to show that a default - * exists. - */ - attrrel = table_open(AttributeRelationId, RowExclusiveLock); - atttup = SearchSysCacheCopy2(ATTNUM, - ObjectIdGetDatum(RelationGetRelid(rel)), - Int16GetDatum(attnum)); - if (!HeapTupleIsValid(atttup)) - elog(ERROR, "cache lookup failed for attribute %d of relation %u", - attnum, RelationGetRelid(rel)); - attStruct = (Form_pg_attribute) GETSTRUCT(atttup); - attgenerated = attStruct->attgenerated; - if (!attStruct->atthasdef) - { - Form_pg_attribute defAttStruct; - - ExprState *exprState; - Expr *expr2 = (Expr *) expr; - EState *estate = NULL; - ExprContext *econtext; - Datum valuesAtt[Natts_pg_attribute]; - bool nullsAtt[Natts_pg_attribute]; - bool replacesAtt[Natts_pg_attribute]; - Datum missingval = (Datum) 0; - bool missingIsNull = true; - - MemSet(valuesAtt, 0, sizeof(valuesAtt)); - MemSet(nullsAtt, false, sizeof(nullsAtt)); - MemSet(replacesAtt, false, sizeof(replacesAtt)); - valuesAtt[Anum_pg_attribute_atthasdef - 1] = true; - replacesAtt[Anum_pg_attribute_atthasdef - 1] = true; - - if (rel->rd_rel->relkind == RELKIND_RELATION && add_column_mode && - !attgenerated) - { - expr2 = expression_planner(expr2); - estate = CreateExecutorState(); - exprState = ExecPrepareExpr(expr2, estate); - econtext = GetPerTupleExprContext(estate); - - missingval = ExecEvalExpr(exprState, econtext, - &missingIsNull); - - FreeExecutorState(estate); - - defAttStruct = TupleDescAttr(rel->rd_att, attnum - 1); - - if (missingIsNull) - { - /* if the default evaluates to NULL, just store a NULL array */ - missingval = (Datum) 0; - } - else - { - /* otherwise make a one-element array of the value */ - missingval = PointerGetDatum(construct_array(&missingval, - 1, - defAttStruct->atttypid, - defAttStruct->attlen, - defAttStruct->attbyval, - defAttStruct->attalign)); - } - - valuesAtt[Anum_pg_attribute_atthasmissing - 1] = !missingIsNull; - replacesAtt[Anum_pg_attribute_atthasmissing - 1] = true; - valuesAtt[Anum_pg_attribute_attmissingval - 1] = missingval; - replacesAtt[Anum_pg_attribute_attmissingval - 1] = true; - nullsAtt[Anum_pg_attribute_attmissingval - 1] = missingIsNull; - } - atttup = heap_modify_tuple(atttup, RelationGetDescr(attrrel), - valuesAtt, nullsAtt, replacesAtt); - - CatalogTupleUpdate(attrrel, &atttup->t_self, atttup); - - if (!missingIsNull) - pfree(DatumGetPointer(missingval)); - - } - table_close(attrrel, RowExclusiveLock); - heap_freetuple(atttup); - - /* - * Make a dependency so that the pg_attrdef entry goes away if the column - * (or whole table) is deleted. - */ - colobject.classId = RelationRelationId; - colobject.objectId = RelationGetRelid(rel); - colobject.objectSubId = attnum; - - recordDependencyOn(&defobject, &colobject, DEPENDENCY_AUTO); - - /* - * Record dependencies on objects used in the expression, too. - */ - if (attgenerated) - { - /* - * Generated column: Dropping anything that the generation expression - * refers to automatically drops the generated column. - */ - recordDependencyOnSingleRelExpr(&colobject, expr, RelationGetRelid(rel), - DEPENDENCY_AUTO, - DEPENDENCY_AUTO, false); - } - else - { - /* - * Normal default: Dropping anything that the default refers to - * requires CASCADE and drops the default only. - */ - recordDependencyOnSingleRelExpr(&defobject, expr, RelationGetRelid(rel), - DEPENDENCY_NORMAL, - DEPENDENCY_NORMAL, false); - } - - /* - * Post creation hook for attribute defaults. - * - * XXX. ALTER TABLE ALTER COLUMN SET/DROP DEFAULT is implemented with a - * couple of deletion/creation of the attribute's default entry, so the - * callee should check existence of an older version of this entry if it - * needs to distinguish. - */ - InvokeObjectPostCreateHookArg(AttrDefaultRelationId, - RelationGetRelid(rel), attnum, is_internal); - - return attrdefOid; -} - /* * Store a check-constraint expression for the given relation. * diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index f30c742d48..d7ce063997 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -1578,39 +1578,11 @@ get_object_address_attrdef(ObjectType objtype, List *object, tupdesc = RelationGetDescr(relation); - /* Look up attribute number and scan pg_attrdef to find its tuple */ + /* Look up attribute number and fetch the pg_attrdef OID */ attnum = get_attnum(reloid, attname); defoid = InvalidOid; if (attnum != InvalidAttrNumber && tupdesc->constr != NULL) - { - Relation attrdef; - ScanKeyData keys[2]; - SysScanDesc scan; - HeapTuple tup; - - attrdef = relation_open(AttrDefaultRelationId, AccessShareLock); - ScanKeyInit(&keys[0], - Anum_pg_attrdef_adrelid, - BTEqualStrategyNumber, - F_OIDEQ, - ObjectIdGetDatum(reloid)); - ScanKeyInit(&keys[1], - Anum_pg_attrdef_adnum, - BTEqualStrategyNumber, - F_INT2EQ, - Int16GetDatum(attnum)); - scan = systable_beginscan(attrdef, AttrDefaultIndexId, true, - NULL, 2, keys); - if (HeapTupleIsValid(tup = systable_getnext(scan))) - { - Form_pg_attrdef atdform = (Form_pg_attrdef) GETSTRUCT(tup); - - defoid = atdform->oid; - } - - systable_endscan(scan); - relation_close(attrdef, AccessShareLock); - } + defoid = GetAttrDefaultOid(reloid, attnum); if (!OidIsValid(defoid)) { if (!missing_ok) @@ -3161,48 +3133,21 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) case OCLASS_DEFAULT: { - Relation attrdefDesc; - ScanKeyData skey[1]; - SysScanDesc adscan; - HeapTuple tup; - Form_pg_attrdef attrdef; ObjectAddress colobject; - attrdefDesc = table_open(AttrDefaultRelationId, AccessShareLock); + colobject = GetAttrDefaultColumnAddress(object->objectId); - ScanKeyInit(&skey[0], - Anum_pg_attrdef_oid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(object->objectId)); - - adscan = systable_beginscan(attrdefDesc, AttrDefaultOidIndexId, - true, NULL, 1, skey); - - tup = systable_getnext(adscan); - - if (!HeapTupleIsValid(tup)) + if (!OidIsValid(colobject.objectId)) { if (!missing_ok) elog(ERROR, "could not find tuple for attrdef %u", object->objectId); - - systable_endscan(adscan); - table_close(attrdefDesc, AccessShareLock); break; } - attrdef = (Form_pg_attrdef) GETSTRUCT(tup); - - colobject.classId = RelationRelationId; - colobject.objectId = attrdef->adrelid; - colobject.objectSubId = attrdef->adnum; - /* translator: %s is typically "column %s of table %s" */ appendStringInfo(&buffer, _("default value for %s"), getObjectDescription(&colobject, false)); - - systable_endscan(adscan); - table_close(attrdefDesc, AccessShareLock); break; } @@ -5006,50 +4951,22 @@ getObjectIdentityParts(const ObjectAddress *object, case OCLASS_DEFAULT: { - Relation attrdefDesc; - ScanKeyData skey[1]; - SysScanDesc adscan; - - HeapTuple tup; - Form_pg_attrdef attrdef; ObjectAddress colobject; - attrdefDesc = table_open(AttrDefaultRelationId, AccessShareLock); - - ScanKeyInit(&skey[0], - Anum_pg_attrdef_oid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(object->objectId)); - - adscan = systable_beginscan(attrdefDesc, AttrDefaultOidIndexId, - true, NULL, 1, skey); + colobject = GetAttrDefaultColumnAddress(object->objectId); - tup = systable_getnext(adscan); - - if (!HeapTupleIsValid(tup)) + if (!OidIsValid(colobject.objectId)) { if (!missing_ok) elog(ERROR, "could not find tuple for attrdef %u", object->objectId); - - systable_endscan(adscan); - table_close(attrdefDesc, AccessShareLock); break; } - attrdef = (Form_pg_attrdef) GETSTRUCT(tup); - - colobject.classId = RelationRelationId; - colobject.objectId = attrdef->adrelid; - colobject.objectSubId = attrdef->adnum; - appendStringInfo(&buffer, "for %s", getObjectIdentityParts(&colobject, objname, objargs, false)); - - systable_endscan(adscan); - table_close(attrdefDesc, AccessShareLock); break; } diff --git a/src/backend/catalog/pg_attrdef.c b/src/backend/catalog/pg_attrdef.c new file mode 100644 index 0000000000..490a52a086 --- /dev/null +++ b/src/backend/catalog/pg_attrdef.c @@ -0,0 +1,428 @@ +/*------------------------------------------------------------------------- + * + * pg_attrdef.c + * routines to support manipulation of the pg_attrdef relation + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/catalog/pg_attrdef.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/genam.h" +#include "access/relation.h" +#include "access/table.h" +#include "catalog/catalog.h" +#include "catalog/dependency.h" +#include "catalog/indexing.h" +#include "catalog/objectaccess.h" +#include "catalog/pg_attrdef.h" +#include "executor/executor.h" +#include "optimizer/optimizer.h" +#include "utils/array.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/rel.h" +#include "utils/syscache.h" + + +/* + * Store a default expression for column attnum of relation rel. + * + * Returns the OID of the new pg_attrdef tuple. + * + * add_column_mode must be true if we are storing the default for a new + * attribute, and false if it's for an already existing attribute. The reason + * for this is that the missing value must never be updated after it is set, + * which can only be when a column is added to the table. Otherwise we would + * in effect be changing existing tuples. + */ +Oid +StoreAttrDefault(Relation rel, AttrNumber attnum, + Node *expr, bool is_internal, bool add_column_mode) +{ + char *adbin; + Relation adrel; + HeapTuple tuple; + Datum values[4]; + static bool nulls[4] = {false, false, false, false}; + Relation attrrel; + HeapTuple atttup; + Form_pg_attribute attStruct; + char attgenerated; + Oid attrdefOid; + ObjectAddress colobject, + defobject; + + adrel = table_open(AttrDefaultRelationId, RowExclusiveLock); + + /* + * Flatten expression to string form for storage. + */ + adbin = nodeToString(expr); + + /* + * Make the pg_attrdef entry. + */ + attrdefOid = GetNewOidWithIndex(adrel, AttrDefaultOidIndexId, + Anum_pg_attrdef_oid); + values[Anum_pg_attrdef_oid - 1] = ObjectIdGetDatum(attrdefOid); + values[Anum_pg_attrdef_adrelid - 1] = RelationGetRelid(rel); + values[Anum_pg_attrdef_adnum - 1] = attnum; + values[Anum_pg_attrdef_adbin - 1] = CStringGetTextDatum(adbin); + + tuple = heap_form_tuple(adrel->rd_att, values, nulls); + CatalogTupleInsert(adrel, tuple); + + defobject.classId = AttrDefaultRelationId; + defobject.objectId = attrdefOid; + defobject.objectSubId = 0; + + table_close(adrel, RowExclusiveLock); + + /* now can free some of the stuff allocated above */ + pfree(DatumGetPointer(values[Anum_pg_attrdef_adbin - 1])); + heap_freetuple(tuple); + pfree(adbin); + + /* + * Update the pg_attribute entry for the column to show that a default + * exists. + */ + attrrel = table_open(AttributeRelationId, RowExclusiveLock); + atttup = SearchSysCacheCopy2(ATTNUM, + ObjectIdGetDatum(RelationGetRelid(rel)), + Int16GetDatum(attnum)); + if (!HeapTupleIsValid(atttup)) + elog(ERROR, "cache lookup failed for attribute %d of relation %u", + attnum, RelationGetRelid(rel)); + attStruct = (Form_pg_attribute) GETSTRUCT(atttup); + attgenerated = attStruct->attgenerated; + if (!attStruct->atthasdef) + { + Form_pg_attribute defAttStruct; + + ExprState *exprState; + Expr *expr2 = (Expr *) expr; + EState *estate = NULL; + ExprContext *econtext; + Datum valuesAtt[Natts_pg_attribute]; + bool nullsAtt[Natts_pg_attribute]; + bool replacesAtt[Natts_pg_attribute]; + Datum missingval = (Datum) 0; + bool missingIsNull = true; + + MemSet(valuesAtt, 0, sizeof(valuesAtt)); + MemSet(nullsAtt, false, sizeof(nullsAtt)); + MemSet(replacesAtt, false, sizeof(replacesAtt)); + valuesAtt[Anum_pg_attribute_atthasdef - 1] = true; + replacesAtt[Anum_pg_attribute_atthasdef - 1] = true; + + if (rel->rd_rel->relkind == RELKIND_RELATION && add_column_mode && + !attgenerated) + { + expr2 = expression_planner(expr2); + estate = CreateExecutorState(); + exprState = ExecPrepareExpr(expr2, estate); + econtext = GetPerTupleExprContext(estate); + + missingval = ExecEvalExpr(exprState, econtext, + &missingIsNull); + + FreeExecutorState(estate); + + defAttStruct = TupleDescAttr(rel->rd_att, attnum - 1); + + if (missingIsNull) + { + /* if the default evaluates to NULL, just store a NULL array */ + missingval = (Datum) 0; + } + else + { + /* otherwise make a one-element array of the value */ + missingval = PointerGetDatum(construct_array(&missingval, + 1, + defAttStruct->atttypid, + defAttStruct->attlen, + defAttStruct->attbyval, + defAttStruct->attalign)); + } + + valuesAtt[Anum_pg_attribute_atthasmissing - 1] = !missingIsNull; + replacesAtt[Anum_pg_attribute_atthasmissing - 1] = true; + valuesAtt[Anum_pg_attribute_attmissingval - 1] = missingval; + replacesAtt[Anum_pg_attribute_attmissingval - 1] = true; + nullsAtt[Anum_pg_attribute_attmissingval - 1] = missingIsNull; + } + atttup = heap_modify_tuple(atttup, RelationGetDescr(attrrel), + valuesAtt, nullsAtt, replacesAtt); + + CatalogTupleUpdate(attrrel, &atttup->t_self, atttup); + + if (!missingIsNull) + pfree(DatumGetPointer(missingval)); + + } + table_close(attrrel, RowExclusiveLock); + heap_freetuple(atttup); + + /* + * Make a dependency so that the pg_attrdef entry goes away if the column + * (or whole table) is deleted. + */ + colobject.classId = RelationRelationId; + colobject.objectId = RelationGetRelid(rel); + colobject.objectSubId = attnum; + + recordDependencyOn(&defobject, &colobject, DEPENDENCY_AUTO); + + /* + * Record dependencies on objects used in the expression, too. + */ + if (attgenerated) + { + /* + * Generated column: Dropping anything that the generation expression + * refers to automatically drops the generated column. + */ + recordDependencyOnSingleRelExpr(&colobject, expr, RelationGetRelid(rel), + DEPENDENCY_AUTO, + DEPENDENCY_AUTO, false); + } + else + { + /* + * Normal default: Dropping anything that the default refers to + * requires CASCADE and drops the default only. + */ + recordDependencyOnSingleRelExpr(&defobject, expr, RelationGetRelid(rel), + DEPENDENCY_NORMAL, + DEPENDENCY_NORMAL, false); + } + + /* + * Post creation hook for attribute defaults. + * + * XXX. ALTER TABLE ALTER COLUMN SET/DROP DEFAULT is implemented with a + * couple of deletion/creation of the attribute's default entry, so the + * callee should check existence of an older version of this entry if it + * needs to distinguish. + */ + InvokeObjectPostCreateHookArg(AttrDefaultRelationId, + RelationGetRelid(rel), attnum, is_internal); + + return attrdefOid; +} + + +/* + * RemoveAttrDefault + * + * If the specified relation/attribute has a default, remove it. + * (If no default, raise error if complain is true, else return quietly.) + */ +void +RemoveAttrDefault(Oid relid, AttrNumber attnum, + DropBehavior behavior, bool complain, bool internal) +{ + Relation attrdef_rel; + ScanKeyData scankeys[2]; + SysScanDesc scan; + HeapTuple tuple; + bool found = false; + + attrdef_rel = table_open(AttrDefaultRelationId, RowExclusiveLock); + + ScanKeyInit(&scankeys[0], + Anum_pg_attrdef_adrelid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(relid)); + ScanKeyInit(&scankeys[1], + Anum_pg_attrdef_adnum, + BTEqualStrategyNumber, F_INT2EQ, + Int16GetDatum(attnum)); + + scan = systable_beginscan(attrdef_rel, AttrDefaultIndexId, true, + NULL, 2, scankeys); + + /* There should be at most one matching tuple, but we loop anyway */ + while (HeapTupleIsValid(tuple = systable_getnext(scan))) + { + ObjectAddress object; + Form_pg_attrdef attrtuple = (Form_pg_attrdef) GETSTRUCT(tuple); + + object.classId = AttrDefaultRelationId; + object.objectId = attrtuple->oid; + object.objectSubId = 0; + + performDeletion(&object, behavior, + internal ? PERFORM_DELETION_INTERNAL : 0); + + found = true; + } + + systable_endscan(scan); + table_close(attrdef_rel, RowExclusiveLock); + + if (complain && !found) + elog(ERROR, "could not find attrdef tuple for relation %u attnum %d", + relid, attnum); +} + +/* + * RemoveAttrDefaultById + * + * Remove a pg_attrdef entry specified by OID. This is the guts of + * attribute-default removal. Note it should be called via performDeletion, + * not directly. + */ +void +RemoveAttrDefaultById(Oid attrdefId) +{ + Relation attrdef_rel; + Relation attr_rel; + Relation myrel; + ScanKeyData scankeys[1]; + SysScanDesc scan; + HeapTuple tuple; + Oid myrelid; + AttrNumber myattnum; + + /* Grab an appropriate lock on the pg_attrdef relation */ + attrdef_rel = table_open(AttrDefaultRelationId, RowExclusiveLock); + + /* Find the pg_attrdef tuple */ + ScanKeyInit(&scankeys[0], + Anum_pg_attrdef_oid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(attrdefId)); + + scan = systable_beginscan(attrdef_rel, AttrDefaultOidIndexId, true, + NULL, 1, scankeys); + + tuple = systable_getnext(scan); + if (!HeapTupleIsValid(tuple)) + elog(ERROR, "could not find tuple for attrdef %u", attrdefId); + + myrelid = ((Form_pg_attrdef) GETSTRUCT(tuple))->adrelid; + myattnum = ((Form_pg_attrdef) GETSTRUCT(tuple))->adnum; + + /* Get an exclusive lock on the relation owning the attribute */ + myrel = relation_open(myrelid, AccessExclusiveLock); + + /* Now we can delete the pg_attrdef row */ + CatalogTupleDelete(attrdef_rel, &tuple->t_self); + + systable_endscan(scan); + table_close(attrdef_rel, RowExclusiveLock); + + /* Fix the pg_attribute row */ + attr_rel = table_open(AttributeRelationId, RowExclusiveLock); + + tuple = SearchSysCacheCopy2(ATTNUM, + ObjectIdGetDatum(myrelid), + Int16GetDatum(myattnum)); + if (!HeapTupleIsValid(tuple)) /* shouldn't happen */ + elog(ERROR, "cache lookup failed for attribute %d of relation %u", + myattnum, myrelid); + + ((Form_pg_attribute) GETSTRUCT(tuple))->atthasdef = false; + + CatalogTupleUpdate(attr_rel, &tuple->t_self, tuple); + + /* + * Our update of the pg_attribute row will force a relcache rebuild, so + * there's nothing else to do here. + */ + table_close(attr_rel, RowExclusiveLock); + + /* Keep lock on attribute's rel until end of xact */ + relation_close(myrel, NoLock); +} + + +/* + * Get the pg_attrdef OID of the default expression for a column + * identified by relation OID and and column number. + * + * Returns InvalidOid if there is no such pg_attrdef entry. + */ +Oid +GetAttrDefaultOid(Oid relid, AttrNumber attnum) +{ + Oid result = InvalidOid; + Relation attrdef; + ScanKeyData keys[2]; + SysScanDesc scan; + HeapTuple tup; + + attrdef = table_open(AttrDefaultRelationId, AccessShareLock); + ScanKeyInit(&keys[0], + Anum_pg_attrdef_adrelid, + BTEqualStrategyNumber, + F_OIDEQ, + ObjectIdGetDatum(relid)); + ScanKeyInit(&keys[1], + Anum_pg_attrdef_adnum, + BTEqualStrategyNumber, + F_INT2EQ, + Int16GetDatum(attnum)); + scan = systable_beginscan(attrdef, AttrDefaultIndexId, true, + NULL, 2, keys); + + if (HeapTupleIsValid(tup = systable_getnext(scan))) + { + Form_pg_attrdef atdform = (Form_pg_attrdef) GETSTRUCT(tup); + + result = atdform->oid; + } + + systable_endscan(scan); + table_close(attrdef, AccessShareLock); + + return result; +} + +/* + * Given a pg_attrdef OID, return the relation OID and column number of + * the owning column (represented as an ObjectAddress for convenience). + * + * Returns InvalidObjectAddress if there is no such pg_attrdef entry. + */ +ObjectAddress +GetAttrDefaultColumnAddress(Oid attrdefoid) +{ + ObjectAddress result = InvalidObjectAddress; + Relation attrdef; + ScanKeyData skey[1]; + SysScanDesc scan; + HeapTuple tup; + + attrdef = table_open(AttrDefaultRelationId, AccessShareLock); + ScanKeyInit(&skey[0], + Anum_pg_attrdef_oid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(attrdefoid)); + scan = systable_beginscan(attrdef, AttrDefaultOidIndexId, true, + NULL, 1, skey); + + if (HeapTupleIsValid(tup = systable_getnext(scan))) + { + Form_pg_attrdef atdform = (Form_pg_attrdef) GETSTRUCT(tup); + + result.classId = RelationRelationId; + result.objectId = atdform->adrelid; + result.objectSubId = atdform->adnum; + } + + systable_endscan(scan); + table_close(attrdef, AccessShareLock); + + return result; +} diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index ab9a53b27c..fc3fc9b384 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -34,6 +34,7 @@ #include "catalog/objectaccess.h" #include "catalog/partition.h" #include "catalog/pg_am.h" +#include "catalog/pg_attrdef.h" #include "catalog/pg_collation.h" #include "catalog/pg_constraint.h" #include "catalog/pg_depend.h" diff --git a/src/include/catalog/heap.h b/src/include/catalog/heap.h index c4757bda2d..07c5b88f0e 100644 --- a/src/include/catalog/heap.h +++ b/src/include/catalog/heap.h @@ -117,10 +117,6 @@ extern List *AddRelationNewConstraints(Relation rel, extern void RelationClearMissing(Relation rel); extern void SetAttrMissing(Oid relid, char *attname, char *value); -extern Oid StoreAttrDefault(Relation rel, AttrNumber attnum, - Node *expr, bool is_internal, - bool add_column_mode); - extern Node *cookDefault(ParseState *pstate, Node *raw_default, Oid atttypid, @@ -132,9 +128,7 @@ extern void DeleteRelationTuple(Oid relid); extern void DeleteAttributeTuples(Oid relid); extern void DeleteSystemAttributeTuples(Oid relid); extern void RemoveAttributeById(Oid relid, AttrNumber attnum); -extern void RemoveAttrDefault(Oid relid, AttrNumber attnum, - DropBehavior behavior, bool complain, bool internal); -extern void RemoveAttrDefaultById(Oid attrdefId); + extern void CopyStatistics(Oid fromrelid, Oid torelid); extern void RemoveStatistics(Oid relid, AttrNumber attnum); diff --git a/src/include/catalog/pg_attrdef.h b/src/include/catalog/pg_attrdef.h index 2916feb5c9..a21dd3812b 100644 --- a/src/include/catalog/pg_attrdef.h +++ b/src/include/catalog/pg_attrdef.h @@ -19,6 +19,7 @@ #define PG_ATTRDEF_H #include "catalog/genbki.h" +#include "catalog/objectaddress.h" #include "catalog/pg_attrdef_d.h" /* ---------------- @@ -54,4 +55,16 @@ DECLARE_UNIQUE_INDEX_PKEY(pg_attrdef_oid_index, 2657, AttrDefaultOidIndexId, on DECLARE_FOREIGN_KEY((adrelid, adnum), pg_attribute, (attrelid, attnum)); + +extern Oid StoreAttrDefault(Relation rel, AttrNumber attnum, + Node *expr, bool is_internal, + bool add_column_mode); +extern void RemoveAttrDefault(Oid relid, AttrNumber attnum, + DropBehavior behavior, + bool complain, bool internal); +extern void RemoveAttrDefaultById(Oid attrdefId); + +extern Oid GetAttrDefaultOid(Oid relid, AttrNumber attnum); +extern ObjectAddress GetAttrDefaultColumnAddress(Oid attrdefoid); + #endif /* PG_ATTRDEF_H */ From cb02fcb4c95bae08adaca1202c2081cfc81a28b5 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 21 Mar 2022 14:58:49 -0400 Subject: [PATCH 196/772] Fix bogus dependency handling for GENERATED expressions. For GENERATED columns, we record all dependencies of the generation expression as AUTO dependencies of the column itself. This means that the generated column is silently dropped if any dependency is removed, even if CASCADE wasn't specified. This is at least a POLA violation, but I think it's actually based on a misreading of the standard. The standard does say that you can't drop a dependent GENERATED column in RESTRICT mode; but that's buried down in a subparagraph, on a different page from some pseudocode that makes it look like an AUTO drop is being suggested. Change this to be more like the way that we handle regular default expressions, ie record the dependencies as NORMAL dependencies of the pg_attrdef entry. Also, make the pg_attrdef entry's dependency on the column itself be INTERNAL not AUTO. That has two effects: * the column will go away, not just lose its default, if any dependency of the expression is dropped with CASCADE. So we don't need any special mechanism to make that happen. * it provides an additional cross-check preventing someone from dropping the default expression without dropping the column. catversion bump because of change in the contents of pg_depend (which also requires a change in one information_schema view). Per bug #17439 from Kevin Humphreys. Although this is a longstanding bug, it seems impractical to back-patch because of the need for catalog contents changes. Discussion: https://postgr.es/m/17439-7df4421197e928f0@postgresql.org --- src/backend/catalog/information_schema.sql | 12 +- src/backend/catalog/pg_attrdef.c | 30 +--- src/backend/commands/tablecmds.c | 163 ++++++++++----------- src/bin/pg_dump/pg_dump_sort.c | 8 +- src/include/catalog/catversion.h | 2 +- src/test/regress/expected/generated.out | 11 +- src/test/regress/sql/generated.sql | 4 +- 7 files changed, 113 insertions(+), 117 deletions(-) diff --git a/src/backend/catalog/information_schema.sql b/src/backend/catalog/information_schema.sql index c4ef8e78a5..18725a02d1 100644 --- a/src/backend/catalog/information_schema.sql +++ b/src/backend/catalog/information_schema.sql @@ -514,16 +514,18 @@ CREATE VIEW column_column_usage AS CAST(ad.attname AS sql_identifier) AS dependent_column FROM pg_namespace n, pg_class c, pg_depend d, - pg_attribute ac, pg_attribute ad + pg_attribute ac, pg_attribute ad, pg_attrdef atd WHERE n.oid = c.relnamespace AND c.oid = ac.attrelid AND c.oid = ad.attrelid - AND d.classid = 'pg_catalog.pg_class'::regclass + AND ac.attnum <> ad.attnum + AND ad.attrelid = atd.adrelid + AND ad.attnum = atd.adnum + AND d.classid = 'pg_catalog.pg_attrdef'::regclass AND d.refclassid = 'pg_catalog.pg_class'::regclass - AND d.objid = d.refobjid - AND c.oid = d.objid - AND d.objsubid = ad.attnum + AND d.objid = atd.oid + AND d.refobjid = ac.attrelid AND d.refobjsubid = ac.attnum AND ad.attgenerated <> '' AND pg_has_role(c.relowner, 'USAGE'); diff --git a/src/backend/catalog/pg_attrdef.c b/src/backend/catalog/pg_attrdef.c index 490a52a086..2d63c6e62a 100644 --- a/src/backend/catalog/pg_attrdef.c +++ b/src/backend/catalog/pg_attrdef.c @@ -174,37 +174,23 @@ StoreAttrDefault(Relation rel, AttrNumber attnum, /* * Make a dependency so that the pg_attrdef entry goes away if the column - * (or whole table) is deleted. + * (or whole table) is deleted. In the case of a generated column, make + * it an internal dependency to prevent the default expression from being + * deleted separately. */ colobject.classId = RelationRelationId; colobject.objectId = RelationGetRelid(rel); colobject.objectSubId = attnum; - recordDependencyOn(&defobject, &colobject, DEPENDENCY_AUTO); + recordDependencyOn(&defobject, &colobject, + attgenerated ? DEPENDENCY_INTERNAL : DEPENDENCY_AUTO); /* * Record dependencies on objects used in the expression, too. */ - if (attgenerated) - { - /* - * Generated column: Dropping anything that the generation expression - * refers to automatically drops the generated column. - */ - recordDependencyOnSingleRelExpr(&colobject, expr, RelationGetRelid(rel), - DEPENDENCY_AUTO, - DEPENDENCY_AUTO, false); - } - else - { - /* - * Normal default: Dropping anything that the default refers to - * requires CASCADE and drops the default only. - */ - recordDependencyOnSingleRelExpr(&defobject, expr, RelationGetRelid(rel), - DEPENDENCY_NORMAL, - DEPENDENCY_NORMAL, false); - } + recordDependencyOnSingleRelExpr(&defobject, expr, RelationGetRelid(rel), + DEPENDENCY_NORMAL, + DEPENDENCY_NORMAL, false); /* * Post creation hook for attribute defaults. diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index fc3fc9b384..80faae985e 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -7899,6 +7899,7 @@ ATExecDropExpression(Relation rel, const char *colName, bool missing_ok, LOCKMOD Form_pg_attribute attTup; AttrNumber attnum; Relation attrelation; + Oid attrdefoid; ObjectAddress address; attrelation = table_open(AttributeRelationId, RowExclusiveLock); @@ -7936,71 +7937,44 @@ ATExecDropExpression(Relation rel, const char *colName, bool missing_ok, LOCKMOD } } + /* + * Mark the column as no longer generated. (The atthasdef flag needs to + * get cleared too, but RemoveAttrDefault will handle that.) + */ attTup->attgenerated = '\0'; CatalogTupleUpdate(attrelation, &tuple->t_self, tuple); InvokeObjectPostAlterHook(RelationRelationId, RelationGetRelid(rel), - attTup->attnum); - ObjectAddressSubSet(address, RelationRelationId, - RelationGetRelid(rel), attnum); + attnum); heap_freetuple(tuple); table_close(attrelation, RowExclusiveLock); - CommandCounterIncrement(); - - RemoveAttrDefault(RelationGetRelid(rel), attnum, DROP_RESTRICT, false, false); - /* - * Remove all dependencies of this (formerly generated) column on other - * columns in the same table. (See StoreAttrDefault() for which - * dependencies are created.) We don't expect there to be dependencies - * between columns of the same table for other reasons, so it's okay to - * remove all of them. + * Drop the dependency records of the GENERATED expression, in particular + * its INTERNAL dependency on the column, which would otherwise cause + * dependency.c to refuse to perform the deletion. */ - { - Relation depRel; - ScanKeyData key[3]; - SysScanDesc scan; - HeapTuple tup; - - depRel = table_open(DependRelationId, RowExclusiveLock); - - ScanKeyInit(&key[0], - Anum_pg_depend_classid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(RelationRelationId)); - ScanKeyInit(&key[1], - Anum_pg_depend_objid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(RelationGetRelid(rel))); - ScanKeyInit(&key[2], - Anum_pg_depend_objsubid, - BTEqualStrategyNumber, F_INT4EQ, - Int32GetDatum(attnum)); + attrdefoid = GetAttrDefaultOid(RelationGetRelid(rel), attnum); + if (!OidIsValid(attrdefoid)) + elog(ERROR, "could not find attrdef tuple for relation %u attnum %d", + RelationGetRelid(rel), attnum); + (void) deleteDependencyRecordsFor(AttrDefaultRelationId, attrdefoid, false); - scan = systable_beginscan(depRel, DependDependerIndexId, true, - NULL, 3, key); - - while (HeapTupleIsValid(tup = systable_getnext(scan))) - { - Form_pg_depend depform = (Form_pg_depend) GETSTRUCT(tup); - - if (depform->refclassid == RelationRelationId && - depform->refobjid == RelationGetRelid(rel) && - depform->refobjsubid != 0 && - depform->deptype == DEPENDENCY_AUTO) - { - CatalogTupleDelete(depRel, &tup->t_self); - } - } - - systable_endscan(scan); + /* Make above changes visible */ + CommandCounterIncrement(); - table_close(depRel, RowExclusiveLock); - } + /* + * Get rid of the GENERATED expression itself. We use RESTRICT here for + * safety, but at present we do not expect anything to depend on the + * default. + */ + RemoveAttrDefault(RelationGetRelid(rel), attnum, DROP_RESTRICT, + false, false); + ObjectAddressSubSet(address, RelationRelationId, + RelationGetRelid(rel), attnum); return address; } @@ -12548,21 +12522,6 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, */ Assert(foundObject.objectSubId == 0); } - else if (relKind == RELKIND_RELATION && - foundObject.objectSubId != 0 && - get_attgenerated(foundObject.objectId, foundObject.objectSubId)) - { - /* - * Changing the type of a column that is used by a - * generated column is not allowed by SQL standard. It - * might be doable with some thinking and effort. - */ - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("cannot alter type of a column used by a generated column"), - errdetail("Column \"%s\" is used by generated column \"%s\".", - colName, get_attname(foundObject.objectId, foundObject.objectSubId, false)))); - } else { /* Not expecting any other direct dependencies... */ @@ -12625,13 +12584,39 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, break; case OCLASS_DEFAULT: + { + ObjectAddress col = GetAttrDefaultColumnAddress(foundObject.objectId); - /* - * Ignore the column's default expression, since we will fix - * it below. - */ - Assert(defaultexpr); - break; + if (col.objectId == RelationGetRelid(rel) && + col.objectSubId == attnum) + { + /* + * Ignore the column's own default expression, which + * we will deal with below. + */ + Assert(defaultexpr); + } + else + { + /* + * This must be a reference from the expression of a + * generated column elsewhere in the same table. + * Changing the type of a column that is used by a + * generated column is not allowed by SQL standard, so + * just punt for now. It might be doable with some + * thinking and effort. + */ + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot alter type of a column used by a generated column"), + errdetail("Column \"%s\" is used by generated column \"%s\".", + colName, + get_attname(col.objectId, + col.objectSubId, + false)))); + } + break; + } case OCLASS_STATISTIC_EXT: @@ -12694,9 +12679,8 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, /* * Now scan for dependencies of this column on other things. The only - * thing we should find is the dependency on the column datatype, which we - * want to remove, possibly a collation dependency, and dependencies on - * other columns if it is a generated column. + * things we should find are the dependency on the column datatype and + * possibly a collation dependency. Those can be removed. */ ScanKeyInit(&key[0], Anum_pg_depend_classid, @@ -12723,18 +12707,13 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, foundObject.objectId = foundDep->refobjid; foundObject.objectSubId = foundDep->refobjsubid; - if (foundDep->deptype != DEPENDENCY_NORMAL && - foundDep->deptype != DEPENDENCY_AUTO) + if (foundDep->deptype != DEPENDENCY_NORMAL) elog(ERROR, "found unexpected dependency type '%c'", foundDep->deptype); if (!(foundDep->refclassid == TypeRelationId && foundDep->refobjid == attTup->atttypid) && !(foundDep->refclassid == CollationRelationId && - foundDep->refobjid == attTup->attcollation) && - !(foundDep->refclassid == RelationRelationId && - foundDep->refobjid == RelationGetRelid(rel) && - foundDep->refobjsubid != 0) - ) + foundDep->refobjid == attTup->attcollation)) elog(ERROR, "found unexpected dependency for column: %s", getObjectDescription(&foundObject, false)); @@ -12850,7 +12829,25 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, */ if (defaultexpr) { - /* Must make new row visible since it will be updated again */ + /* + * If it's a GENERATED default, drop its dependency records, in + * particular its INTERNAL dependency on the column, which would + * otherwise cause dependency.c to refuse to perform the deletion. + */ + if (attTup->attgenerated) + { + Oid attrdefoid = GetAttrDefaultOid(RelationGetRelid(rel), attnum); + + if (!OidIsValid(attrdefoid)) + elog(ERROR, "could not find attrdef tuple for relation %u attnum %d", + RelationGetRelid(rel), attnum); + (void) deleteDependencyRecordsFor(AttrDefaultRelationId, attrdefoid, false); + } + + /* + * Make updates-so-far visible, particularly the new pg_attribute row + * which will be updated again. + */ CommandCounterIncrement(); /* diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c index d979f93b3d..1592090839 100644 --- a/src/bin/pg_dump/pg_dump_sort.c +++ b/src/bin/pg_dump/pg_dump_sort.c @@ -1203,10 +1203,10 @@ repairDependencyLoop(DumpableObject **loop, * Loop of table with itself --- just ignore it. * * (Actually, what this arises from is a dependency of a table column on - * another column, which happens with generated columns; or a dependency - * of a table column on the whole table, which happens with partitioning. - * But we didn't pay attention to sub-object IDs while collecting the - * dependency data, so we can't see that here.) + * another column, which happened with generated columns before v15; or a + * dependency of a table column on the whole table, which happens with + * partitioning. But we didn't pay attention to sub-object IDs while + * collecting the dependency data, so we can't see that here.) */ if (nLoop == 1) { diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index dcc0aba82a..1383761c1f 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202203171 +#define CATALOG_VERSION_NO 202203211 #endif diff --git a/src/test/regress/expected/generated.out b/src/test/regress/expected/generated.out index cb9373227d..bb4190340e 100644 --- a/src/test/regress/expected/generated.out +++ b/src/test/regress/expected/generated.out @@ -477,7 +477,12 @@ SELECT * FROM gtest_tableoid; -- drop column behavior CREATE TABLE gtest10 (a int PRIMARY KEY, b int, c int GENERATED ALWAYS AS (b * 2) STORED); -ALTER TABLE gtest10 DROP COLUMN b; +ALTER TABLE gtest10 DROP COLUMN b; -- fails +ERROR: cannot drop column b of table gtest10 because other objects depend on it +DETAIL: column c of table gtest10 depends on column b of table gtest10 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +ALTER TABLE gtest10 DROP COLUMN b CASCADE; -- drops c too +NOTICE: drop cascades to column c of table gtest10 \d gtest10 Table "public.gtest10" Column | Type | Collation | Nullable | Default @@ -519,6 +524,10 @@ SELECT a, c FROM gtest12s; -- allowed (2 rows) RESET ROLE; +DROP FUNCTION gf1(int); -- fail +ERROR: cannot drop function gf1(integer) because other objects depend on it +DETAIL: column c of table gtest12s depends on function gf1(integer) +HINT: Use DROP ... CASCADE to drop the dependent objects too. DROP TABLE gtest11s, gtest12s; DROP FUNCTION gf1(int); DROP USER regress_user11; diff --git a/src/test/regress/sql/generated.sql b/src/test/regress/sql/generated.sql index b7eb072671..378297e6ea 100644 --- a/src/test/regress/sql/generated.sql +++ b/src/test/regress/sql/generated.sql @@ -231,7 +231,8 @@ SELECT * FROM gtest_tableoid; -- drop column behavior CREATE TABLE gtest10 (a int PRIMARY KEY, b int, c int GENERATED ALWAYS AS (b * 2) STORED); -ALTER TABLE gtest10 DROP COLUMN b; +ALTER TABLE gtest10 DROP COLUMN b; -- fails +ALTER TABLE gtest10 DROP COLUMN b CASCADE; -- drops c too \d gtest10 @@ -260,6 +261,7 @@ SELECT gf1(10); -- not allowed SELECT a, c FROM gtest12s; -- allowed RESET ROLE; +DROP FUNCTION gf1(int); -- fail DROP TABLE gtest11s, gtest12s; DROP FUNCTION gf1(int); DROP USER regress_user11; From 13619598f1080d7923454634a2570ca1bc0f2fec Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 21 Mar 2022 12:02:25 -0700 Subject: [PATCH 197/772] pgstat: split different types of stats into separate files. pgstat.c is very long, and it's hard to find an order that makes sense and is likely to be maintained over time. Splitting the different pieces into separate files makes that a lot easier. With a few exceptions, this commit just moves code around. Those exceptions are: - adding file headers for new files - removing 'static' from functions - adapting pgstat_assert_is_up() to work across TUs - minor comment adjustments git diff --color-moved=dimmed-zebra is very helpful separating code movement from code changes. The next commit in this series will reorder pgstat.[ch] contents to be a bit more coherent. Earlier revisions of this patch had "global" statistics (archiver, bgwriter, checkpointer, replication slots, SLRU, WAL) in one file, because each seemed small enough. However later commits will increase their size and their aggregate size is not insubstantial. It also just seems easier to split each type of statistic into its own file. Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/backend/postmaster/pgstat.c | 2113 +---------------- src/backend/utils/activity/Makefile | 10 + src/backend/utils/activity/pgstat_archiver.c | 44 + src/backend/utils/activity/pgstat_bgwriter.c | 63 + .../utils/activity/pgstat_checkpointer.c | 61 + src/backend/utils/activity/pgstat_database.c | 279 +++ src/backend/utils/activity/pgstat_function.c | 225 ++ src/backend/utils/activity/pgstat_relation.c | 935 ++++++++ src/backend/utils/activity/pgstat_replslot.c | 119 + src/backend/utils/activity/pgstat_slru.c | 201 ++ .../utils/activity/pgstat_subscription.c | 78 + src/backend/utils/activity/pgstat_wal.c | 159 ++ src/include/utils/pgstat_internal.h | 161 ++ 13 files changed, 2408 insertions(+), 2040 deletions(-) create mode 100644 src/backend/utils/activity/pgstat_archiver.c create mode 100644 src/backend/utils/activity/pgstat_bgwriter.c create mode 100644 src/backend/utils/activity/pgstat_checkpointer.c create mode 100644 src/backend/utils/activity/pgstat_database.c create mode 100644 src/backend/utils/activity/pgstat_function.c create mode 100644 src/backend/utils/activity/pgstat_relation.c create mode 100644 src/backend/utils/activity/pgstat_replslot.c create mode 100644 src/backend/utils/activity/pgstat_slru.c create mode 100644 src/backend/utils/activity/pgstat_subscription.c create mode 100644 src/backend/utils/activity/pgstat_wal.c create mode 100644 src/include/utils/pgstat_internal.h diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index ab47a083c3..e781cac7bf 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -36,14 +36,12 @@ #include "access/htup_details.h" #include "access/tableam.h" #include "access/transam.h" -#include "access/twophase_rmgr.h" #include "access/xact.h" #include "catalog/catalog.h" #include "catalog/pg_database.h" #include "catalog/pg_proc.h" #include "catalog/pg_subscription.h" #include "common/ip.h" -#include "executor/instrument.h" #include "libpq/libpq.h" #include "libpq/pqsignal.h" #include "mb/pg_wchar.h" @@ -67,6 +65,7 @@ #include "utils/builtins.h" #include "utils/guc.h" #include "utils/memutils.h" +#include "utils/pgstat_internal.h" #include "utils/ps_status.h" #include "utils/rel.h" #include "utils/snapmgr.h" @@ -76,9 +75,6 @@ * Timer definitions. * ---------- */ -#define PGSTAT_STAT_INTERVAL 500 /* Minimum time between stats file - * updates; in milliseconds. */ - #define PGSTAT_RETRY_DELAY 10 /* How long to wait between checks for a * new file; in milliseconds. */ @@ -99,23 +95,11 @@ #define PGSTAT_MIN_RCVBUF (100 * 1024) -/* ---------- - * The initial size hints for the hash tables used in the collector. - * ---------- - */ -#define PGSTAT_DB_HASH_SIZE 16 -#define PGSTAT_TAB_HASH_SIZE 512 -#define PGSTAT_FUNCTION_HASH_SIZE 512 -#define PGSTAT_SUBSCRIPTION_HASH_SIZE 32 -#define PGSTAT_REPLSLOT_HASH_SIZE 32 - - /* ---------- * GUC parameters * ---------- */ bool pgstat_track_counts = false; -int pgstat_track_functions = TRACK_FUNC_OFF; /* ---------- * Built from GUC parameter @@ -125,54 +109,17 @@ char *pgstat_stat_directory = NULL; char *pgstat_stat_filename = NULL; char *pgstat_stat_tmpname = NULL; -/* - * BgWriter and WAL global statistics counters. - * Stored directly in a stats message structure so they can be sent - * without needing to copy things around. We assume these init to zeroes. - */ -PgStat_MsgBgWriter PendingBgWriterStats; -PgStat_MsgCheckpointer PendingCheckpointerStats; -PgStat_MsgWal WalStats; - -/* - * WAL usage counters saved from pgWALUsage at the previous call to - * pgstat_send_wal(). This is used to calculate how much WAL usage - * happens between pgstat_send_wal() calls, by subtracting - * the previous counters from the current ones. - */ -static WalUsage prevWalUsage; - -/* - * List of SLRU names that we keep stats for. There is no central registry of - * SLRUs, so we use this fixed list instead. The "other" entry is used for - * all SLRUs without an explicit entry (e.g. SLRUs in extensions). +/* ---------- + * state shared with pgstat_*.c + * ---------- */ -static const char *const slru_names[] = { - "CommitTs", - "MultiXactMember", - "MultiXactOffset", - "Notify", - "Serial", - "Subtrans", - "Xact", - "other" /* has to be last */ -}; - -#define SLRU_NUM_ELEMENTS lengthof(slru_names) -/* - * SLRU statistics counts waiting to be sent to the collector. These are - * stored directly in stats message format so they can be sent without needing - * to copy things around. We assume this variable inits to zeroes. Entries - * are one-to-one with slru_names[]. - */ -static PgStat_MsgSLRU SLRUStats[SLRU_NUM_ELEMENTS]; +pgsocket pgStatSock = PGINVALID_SOCKET; /* ---------- * Local data * ---------- */ -NON_EXEC_STATIC pgsocket pgStatSock = PGINVALID_SOCKET; static struct sockaddr_storage pgStatAddr; @@ -180,108 +127,8 @@ static time_t last_pgstat_start_time; static bool pgStatRunningInCollector = false; -/* - * Structures in which backends store per-table info that's waiting to be - * sent to the collector. - * - * NOTE: once allocated, TabStatusArray structures are never moved or deleted - * for the life of the backend. Also, we zero out the t_id fields of the - * contained PgStat_TableStatus structs whenever they are not actively in use. - * This allows relcache pgstat_info pointers to be treated as long-lived data, - * avoiding repeated searches in pgstat_relation_init() when a relation is - * repeatedly opened during a transaction. - */ -#define TABSTAT_QUANTUM 100 /* we alloc this many at a time */ - -typedef struct TabStatusArray -{ - struct TabStatusArray *tsa_next; /* link to next array, if any */ - int tsa_used; /* # entries currently used */ - PgStat_TableStatus tsa_entries[TABSTAT_QUANTUM]; /* per-table data */ -} TabStatusArray; - -static TabStatusArray *pgStatTabList = NULL; - -/* - * pgStatTabHash entry: map from relation OID to PgStat_TableStatus pointer - */ -typedef struct TabStatHashEntry -{ - Oid t_id; - PgStat_TableStatus *tsa_entry; -} TabStatHashEntry; - -/* - * Hash table for O(1) t_id -> tsa_entry lookup - */ -static HTAB *pgStatTabHash = NULL; - -/* - * Backends store per-function info that's waiting to be sent to the collector - * in this hash table (indexed by function OID). - */ -static HTAB *pgStatFunctions = NULL; - -/* - * Indicates if backend has some relation stats that it hasn't yet - * sent to the collector. - */ -static bool have_relation_stats = false; - -/* - * Indicates if backend has some function stats that it hasn't yet - * sent to the collector. - */ -static bool have_function_stats = false; - -/* - * Some stats changes are transactional. To maintain those, a stack of - * PgStat_SubXactStatus entries is maintained, which contain data pertaining - * to the current transaction and its active subtransactions. - */ -typedef struct PgStat_SubXactStatus -{ - int nest_level; /* subtransaction nest level */ - - struct PgStat_SubXactStatus *prev; /* higher-level subxact if any */ - - /* - * Tuple insertion/deletion counts for an open transaction can't be - * propagated into PgStat_TableStatus counters until we know if it is - * going to commit or abort. Hence, we keep these counts in per-subxact - * structs that live in TopTransactionContext. This data structure is - * designed on the assumption that subxacts won't usually modify very many - * tables. - */ - PgStat_TableXactStatus *first; /* head of list for this subxact */ -} PgStat_SubXactStatus; - static PgStat_SubXactStatus *pgStatXactStack = NULL; -static int pgStatXactCommit = 0; -static int pgStatXactRollback = 0; -PgStat_Counter pgStatBlockReadTime = 0; -PgStat_Counter pgStatBlockWriteTime = 0; -static PgStat_Counter pgLastSessionReportTime = 0; -PgStat_Counter pgStatActiveTime = 0; -PgStat_Counter pgStatTransactionIdleTime = 0; -SessionEndType pgStatSessionEndCause = DISCONNECT_NORMAL; - -/* Record that's written to 2PC state file when pgstat state is persisted */ -typedef struct TwoPhasePgStatRecord -{ - PgStat_Counter tuples_inserted; /* tuples inserted in xact */ - PgStat_Counter tuples_updated; /* tuples updated in xact */ - PgStat_Counter tuples_deleted; /* tuples deleted in xact */ - /* tuples i/u/d prior to truncate/drop */ - PgStat_Counter inserted_pre_truncdrop; - PgStat_Counter updated_pre_truncdrop; - PgStat_Counter deleted_pre_truncdrop; - Oid t_id; /* table's OID */ - bool t_shared; /* is it a shared catalog? */ - bool t_truncdropped; /* was the relation truncated/dropped? */ -} TwoPhasePgStatRecord; - /* * Info about current "snapshot" of stats file */ @@ -307,13 +154,6 @@ static HTAB *subscriptionStatHash = NULL; */ static List *pending_write_requests = NIL; -/* - * Total time charged to functions so far in the current backend. - * We use this to help separate "self" and "other" time charges. - * (We assume this initializes to zero.) - */ -static instr_time total_func_time; - /* * For assertions that check pgstat is not used before initialization / after * shutdown. @@ -352,24 +192,10 @@ static bool pgstat_db_requested(Oid databaseid); static PgStat_StatReplSlotEntry *pgstat_get_replslot_entry(NameData name, bool create_it); static void pgstat_reset_replslot(PgStat_StatReplSlotEntry *slotstats, TimestampTz ts); -static void pgstat_send_tabstats(TimestampTz now, bool disconnect); -static void pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg, TimestampTz now); -static void pgstat_update_dbstats(PgStat_MsgTabstat *tsmsg, TimestampTz now); -static void pgstat_send_funcstats(void); -static void pgstat_wal_initialize(void); -static bool pgstat_wal_pending(void); -static void pgstat_send_slru(void); static HTAB *pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid); -static bool pgstat_should_report_connstat(void); -static void pgstat_report_disconnect(Oid dboid); - -static PgStat_TableStatus *get_tabstat_entry(Oid rel_id, bool isshared); static void pgstat_setup_memcxt(void); -static void pgstat_assert_is_up(void); -static void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype); -static void pgstat_send(void *msg, int len); static void pgstat_recv_inquiry(PgStat_MsgInquiry *msg, int len); static void pgstat_recv_tabstat(PgStat_MsgTabstat *msg, int len); @@ -926,231 +752,6 @@ pgstat_report_stat(bool disconnect) pgstat_send_slru(); } -/* - * Subroutine for pgstat_report_stat: Send relation statistics - */ -static void -pgstat_send_tabstats(TimestampTz now, bool disconnect) -{ - /* we assume this inits to all zeroes: */ - static const PgStat_TableCounts all_zeroes; - PgStat_MsgTabstat regular_msg; - PgStat_MsgTabstat shared_msg; - TabStatusArray *tsa; - int i; - - /* - * Destroy pgStatTabHash before we start invalidating PgStat_TableEntry - * entries it points to. (Should we fail partway through the loop below, - * it's okay to have removed the hashtable already --- the only - * consequence is we'd get multiple entries for the same table in the - * pgStatTabList, and that's safe.) - */ - if (pgStatTabHash) - hash_destroy(pgStatTabHash); - pgStatTabHash = NULL; - - /* - * Scan through the TabStatusArray struct(s) to find tables that actually - * have counts, and build messages to send. We have to separate shared - * relations from regular ones because the databaseid field in the message - * header has to depend on that. - */ - regular_msg.m_databaseid = MyDatabaseId; - shared_msg.m_databaseid = InvalidOid; - regular_msg.m_nentries = 0; - shared_msg.m_nentries = 0; - - for (tsa = pgStatTabList; tsa != NULL; tsa = tsa->tsa_next) - { - for (i = 0; i < tsa->tsa_used; i++) - { - PgStat_TableStatus *entry = &tsa->tsa_entries[i]; - PgStat_MsgTabstat *this_msg; - PgStat_TableEntry *this_ent; - - /* Shouldn't have any pending transaction-dependent counts */ - Assert(entry->trans == NULL); - - /* - * Ignore entries that didn't accumulate any actual counts, such - * as indexes that were opened by the planner but not used. - */ - if (memcmp(&entry->t_counts, &all_zeroes, - sizeof(PgStat_TableCounts)) == 0) - continue; - - /* - * OK, insert data into the appropriate message, and send if full. - */ - this_msg = entry->t_shared ? &shared_msg : ®ular_msg; - this_ent = &this_msg->m_entry[this_msg->m_nentries]; - this_ent->t_id = entry->t_id; - memcpy(&this_ent->t_counts, &entry->t_counts, - sizeof(PgStat_TableCounts)); - if (++this_msg->m_nentries >= PGSTAT_NUM_TABENTRIES) - { - pgstat_send_tabstat(this_msg, now); - this_msg->m_nentries = 0; - } - } - /* zero out PgStat_TableStatus structs after use */ - MemSet(tsa->tsa_entries, 0, - tsa->tsa_used * sizeof(PgStat_TableStatus)); - tsa->tsa_used = 0; - } - - /* - * Send partial messages. Make sure that any pending xact commit/abort - * and connection stats get counted, even if there are no table stats to - * send. - */ - if (regular_msg.m_nentries > 0 || - pgStatXactCommit > 0 || pgStatXactRollback > 0 || disconnect) - pgstat_send_tabstat(®ular_msg, now); - if (shared_msg.m_nentries > 0) - pgstat_send_tabstat(&shared_msg, now); - - have_relation_stats = false; -} - -/* - * Subroutine for pgstat_send_tabstats: finish and send one tabstat message - */ -static void -pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg, TimestampTz now) -{ - int n; - int len; - - /* It's unlikely we'd get here with no socket, but maybe not impossible */ - if (pgStatSock == PGINVALID_SOCKET) - return; - - /* - * Report and reset accumulated xact commit/rollback and I/O timings - * whenever we send a normal tabstat message - */ - pgstat_update_dbstats(tsmsg, now); - - n = tsmsg->m_nentries; - len = offsetof(PgStat_MsgTabstat, m_entry[0]) + - n * sizeof(PgStat_TableEntry); - - pgstat_setheader(&tsmsg->m_hdr, PGSTAT_MTYPE_TABSTAT); - pgstat_send(tsmsg, len); -} - -/* - * Subroutine for pgstat_send_tabstat: Handle xact commit/rollback and I/O - * timings. - */ -static void -pgstat_update_dbstats(PgStat_MsgTabstat *tsmsg, TimestampTz now) -{ - if (OidIsValid(tsmsg->m_databaseid)) - { - tsmsg->m_xact_commit = pgStatXactCommit; - tsmsg->m_xact_rollback = pgStatXactRollback; - tsmsg->m_block_read_time = pgStatBlockReadTime; - tsmsg->m_block_write_time = pgStatBlockWriteTime; - - if (pgstat_should_report_connstat()) - { - long secs; - int usecs; - - /* - * pgLastSessionReportTime is initialized to MyStartTimestamp by - * pgstat_report_connect(). - */ - TimestampDifference(pgLastSessionReportTime, now, &secs, &usecs); - pgLastSessionReportTime = now; - tsmsg->m_session_time = (PgStat_Counter) secs * 1000000 + usecs; - tsmsg->m_active_time = pgStatActiveTime; - tsmsg->m_idle_in_xact_time = pgStatTransactionIdleTime; - } - else - { - tsmsg->m_session_time = 0; - tsmsg->m_active_time = 0; - tsmsg->m_idle_in_xact_time = 0; - } - pgStatXactCommit = 0; - pgStatXactRollback = 0; - pgStatBlockReadTime = 0; - pgStatBlockWriteTime = 0; - pgStatActiveTime = 0; - pgStatTransactionIdleTime = 0; - } - else - { - tsmsg->m_xact_commit = 0; - tsmsg->m_xact_rollback = 0; - tsmsg->m_block_read_time = 0; - tsmsg->m_block_write_time = 0; - tsmsg->m_session_time = 0; - tsmsg->m_active_time = 0; - tsmsg->m_idle_in_xact_time = 0; - } -} - -/* - * Subroutine for pgstat_report_stat: populate and send a function stat message - */ -static void -pgstat_send_funcstats(void) -{ - /* we assume this inits to all zeroes: */ - static const PgStat_FunctionCounts all_zeroes; - - PgStat_MsgFuncstat msg; - PgStat_BackendFunctionEntry *entry; - HASH_SEQ_STATUS fstat; - - if (pgStatFunctions == NULL) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_FUNCSTAT); - msg.m_databaseid = MyDatabaseId; - msg.m_nentries = 0; - - hash_seq_init(&fstat, pgStatFunctions); - while ((entry = (PgStat_BackendFunctionEntry *) hash_seq_search(&fstat)) != NULL) - { - PgStat_FunctionEntry *m_ent; - - /* Skip it if no counts accumulated since last time */ - if (memcmp(&entry->f_counts, &all_zeroes, - sizeof(PgStat_FunctionCounts)) == 0) - continue; - - /* need to convert format of time accumulators */ - m_ent = &msg.m_entry[msg.m_nentries]; - m_ent->f_id = entry->f_id; - m_ent->f_numcalls = entry->f_counts.f_numcalls; - m_ent->f_total_time = INSTR_TIME_GET_MICROSEC(entry->f_counts.f_total_time); - m_ent->f_self_time = INSTR_TIME_GET_MICROSEC(entry->f_counts.f_self_time); - - if (++msg.m_nentries >= PGSTAT_NUM_FUNCENTRIES) - { - pgstat_send(&msg, offsetof(PgStat_MsgFuncstat, m_entry[0]) + - msg.m_nentries * sizeof(PgStat_FunctionEntry)); - msg.m_nentries = 0; - } - - /* reset the entry's counts */ - MemSet(&entry->f_counts, 0, sizeof(PgStat_FunctionCounts)); - } - - if (msg.m_nentries > 0) - pgstat_send(&msg, offsetof(PgStat_MsgFuncstat, m_entry[0]) + - msg.m_nentries * sizeof(PgStat_FunctionEntry)); - - have_function_stats = false; -} - - /* ---------- * pgstat_vacuum_stat() - * @@ -1423,80 +1024,50 @@ pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid) return htab; } - -/* ---------- - * pgstat_drop_database() - - * - * Tell the collector that we just dropped a database. - * (If the message gets lost, we will still clean the dead DB eventually - * via future invocations of pgstat_vacuum_stat().) - * ---------- - */ -void -pgstat_drop_database(Oid databaseid) -{ - PgStat_MsgDropdb msg; - - if (pgStatSock == PGINVALID_SOCKET) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_DROPDB); - msg.m_databaseid = databaseid; - pgstat_send(&msg, sizeof(msg)); -} - - /* ---------- - * pgstat_drop_relation() - + * pgstat_reset_counters() - * - * Tell the collector that we just dropped a relation. - * (If the message gets lost, we will still clean the dead entry eventually - * via future invocations of pgstat_vacuum_stat().) + * Tell the statistics collector to reset counters for our database. * - * Currently not used for lack of any good place to call it; we rely - * entirely on pgstat_vacuum_stat() to clean out stats for dead rels. + * Permission checking for this function is managed through the normal + * GRANT system. * ---------- */ -#ifdef NOT_USED void -pgstat_drop_relation(Oid relid) +pgstat_reset_counters(void) { - PgStat_MsgTabpurge msg; - int len; + PgStat_MsgResetcounter msg; if (pgStatSock == PGINVALID_SOCKET) return; - msg.m_tableid[0] = relid; - msg.m_nentries = 1; - - len = offsetof(PgStat_MsgTabpurge, m_tableid[0]) + sizeof(Oid); - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_TABPURGE); + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETCOUNTER); msg.m_databaseid = MyDatabaseId; - pgstat_send(&msg, len); + pgstat_send(&msg, sizeof(msg)); } -#endif /* NOT_USED */ /* ---------- - * pgstat_reset_counters() - + * pgstat_reset_single_counter() - * - * Tell the statistics collector to reset counters for our database. + * Tell the statistics collector to reset a single counter. * * Permission checking for this function is managed through the normal * GRANT system. * ---------- */ void -pgstat_reset_counters(void) +pgstat_reset_single_counter(Oid objoid, PgStat_Single_Reset_Type type) { - PgStat_MsgResetcounter msg; + PgStat_MsgResetsinglecounter msg; if (pgStatSock == PGINVALID_SOCKET) return; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETCOUNTER); + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSINGLECOUNTER); msg.m_databaseid = MyDatabaseId; + msg.m_resettype = type; + msg.m_objectid = objoid; + pgstat_send(&msg, sizeof(msg)); } @@ -1534,1156 +1105,90 @@ pgstat_reset_shared_counters(const char *target) } /* ---------- - * pgstat_reset_single_counter() - - * - * Tell the statistics collector to reset a single counter. + * pgstat_ping() - * - * Permission checking for this function is managed through the normal - * GRANT system. + * Send some junk data to the collector to increase traffic. * ---------- */ void -pgstat_reset_single_counter(Oid objoid, PgStat_Single_Reset_Type type) +pgstat_ping(void) { - PgStat_MsgResetsinglecounter msg; + PgStat_MsgDummy msg; if (pgStatSock == PGINVALID_SOCKET) return; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSINGLECOUNTER); - msg.m_databaseid = MyDatabaseId; - msg.m_resettype = type; - msg.m_objectid = objoid; - + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_DUMMY); pgstat_send(&msg, sizeof(msg)); } /* ---------- - * pgstat_reset_slru_counter() - - * - * Tell the statistics collector to reset a single SLRU counter, or all - * SLRU counters (when name is null). + * pgstat_send_inquiry() - * - * Permission checking for this function is managed through the normal - * GRANT system. + * Notify collector that we need fresh data. * ---------- */ -void -pgstat_reset_slru_counter(const char *name) +static void +pgstat_send_inquiry(TimestampTz clock_time, TimestampTz cutoff_time, Oid databaseid) { - PgStat_MsgResetslrucounter msg; - - if (pgStatSock == PGINVALID_SOCKET) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSLRUCOUNTER); - msg.m_index = (name) ? pgstat_slru_index(name) : -1; + PgStat_MsgInquiry msg; + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_INQUIRY); + msg.clock_time = clock_time; + msg.cutoff_time = cutoff_time; + msg.databaseid = databaseid; pgstat_send(&msg, sizeof(msg)); } -/* ---------- - * pgstat_reset_replslot_counter() - - * - * Tell the statistics collector to reset a single replication slot - * counter, or all replication slots counters (when name is null). - * - * Permission checking for this function is managed through the normal - * GRANT system. - * ---------- +/* + * Ensure (sub)transaction stack entry for the given nest_level exists, adding + * it if needed. */ -void -pgstat_reset_replslot_counter(const char *name) +PgStat_SubXactStatus * +pgstat_xact_stack_level_get(int nest_level) { - PgStat_MsgResetreplslotcounter msg; - - if (pgStatSock == PGINVALID_SOCKET) - return; + PgStat_SubXactStatus *xact_state; - if (name) + xact_state = pgStatXactStack; + if (xact_state == NULL || xact_state->nest_level != nest_level) { - namestrcpy(&msg.m_slotname, name); - msg.clearall = false; + xact_state = (PgStat_SubXactStatus *) + MemoryContextAlloc(TopTransactionContext, + sizeof(PgStat_SubXactStatus)); + xact_state->nest_level = nest_level; + xact_state->prev = pgStatXactStack; + xact_state->first = NULL; + pgStatXactStack = xact_state; } - else - msg.clearall = true; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETREPLSLOTCOUNTER); - - pgstat_send(&msg, sizeof(msg)); + return xact_state; } /* ---------- - * pgstat_reset_subscription_counter() - - * - * Tell the statistics collector to reset a single subscription - * counter, or all subscription counters (when subid is InvalidOid). - * - * Permission checking for this function is managed through the normal - * GRANT system. - * ---------- - */ -void -pgstat_reset_subscription_counter(Oid subid) -{ - PgStat_MsgResetsubcounter msg; - - if (pgStatSock == PGINVALID_SOCKET) - return; - - msg.m_subid = subid; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSUBCOUNTER); - - pgstat_send(&msg, sizeof(msg)); -} - -/* ---------- - * pgstat_report_autovac() - - * - * Called from autovacuum.c to report startup of an autovacuum process. - * We are called before InitPostgres is done, so can't rely on MyDatabaseId; - * the db OID must be passed in, instead. - * ---------- - */ -void -pgstat_report_autovac(Oid dboid) -{ - PgStat_MsgAutovacStart msg; - - if (pgStatSock == PGINVALID_SOCKET) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_AUTOVAC_START); - msg.m_databaseid = dboid; - msg.m_start_time = GetCurrentTimestamp(); - - pgstat_send(&msg, sizeof(msg)); -} - - -/* --------- - * pgstat_report_vacuum() - - * - * Tell the collector about the table we just vacuumed. - * --------- - */ -void -pgstat_report_vacuum(Oid tableoid, bool shared, - PgStat_Counter livetuples, PgStat_Counter deadtuples) -{ - PgStat_MsgVacuum msg; - - if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_VACUUM); - msg.m_databaseid = shared ? InvalidOid : MyDatabaseId; - msg.m_tableoid = tableoid; - msg.m_autovacuum = IsAutoVacuumWorkerProcess(); - msg.m_vacuumtime = GetCurrentTimestamp(); - msg.m_live_tuples = livetuples; - msg.m_dead_tuples = deadtuples; - pgstat_send(&msg, sizeof(msg)); -} - -/* -------- - * pgstat_report_analyze() - - * - * Tell the collector about the table we just analyzed. - * - * Caller must provide new live- and dead-tuples estimates, as well as a - * flag indicating whether to reset the changes_since_analyze counter. - * -------- - */ -void -pgstat_report_analyze(Relation rel, - PgStat_Counter livetuples, PgStat_Counter deadtuples, - bool resetcounter) -{ - PgStat_MsgAnalyze msg; - - if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) - return; - - /* - * Unlike VACUUM, ANALYZE might be running inside a transaction that has - * already inserted and/or deleted rows in the target table. ANALYZE will - * have counted such rows as live or dead respectively. Because we will - * report our counts of such rows at transaction end, we should subtract - * off these counts from what we send to the collector now, else they'll - * be double-counted after commit. (This approach also ensures that the - * collector ends up with the right numbers if we abort instead of - * committing.) - * - * Waste no time on partitioned tables, though. - */ - if (pgstat_relation_should_count(rel) && - rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) - { - PgStat_TableXactStatus *trans; - - for (trans = rel->pgstat_info->trans; trans; trans = trans->upper) - { - livetuples -= trans->tuples_inserted - trans->tuples_deleted; - deadtuples -= trans->tuples_updated + trans->tuples_deleted; - } - /* count stuff inserted by already-aborted subxacts, too */ - deadtuples -= rel->pgstat_info->t_counts.t_delta_dead_tuples; - /* Since ANALYZE's counts are estimates, we could have underflowed */ - livetuples = Max(livetuples, 0); - deadtuples = Max(deadtuples, 0); - } - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_ANALYZE); - msg.m_databaseid = rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId; - msg.m_tableoid = RelationGetRelid(rel); - msg.m_autovacuum = IsAutoVacuumWorkerProcess(); - msg.m_resetcounter = resetcounter; - msg.m_analyzetime = GetCurrentTimestamp(); - msg.m_live_tuples = livetuples; - msg.m_dead_tuples = deadtuples; - pgstat_send(&msg, sizeof(msg)); -} - -/* -------- - * pgstat_report_recovery_conflict() - - * - * Tell the collector about a Hot Standby recovery conflict. - * -------- - */ -void -pgstat_report_recovery_conflict(int reason) -{ - PgStat_MsgRecoveryConflict msg; - - if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RECOVERYCONFLICT); - msg.m_databaseid = MyDatabaseId; - msg.m_reason = reason; - pgstat_send(&msg, sizeof(msg)); -} - -/* -------- - * pgstat_report_deadlock() - - * - * Tell the collector about a deadlock detected. - * -------- - */ -void -pgstat_report_deadlock(void) -{ - PgStat_MsgDeadlock msg; - - if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_DEADLOCK); - msg.m_databaseid = MyDatabaseId; - pgstat_send(&msg, sizeof(msg)); -} - - - -/* -------- - * pgstat_report_checksum_failures_in_db() - - * - * Tell the collector about one or more checksum failures. - * -------- - */ -void -pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount) -{ - PgStat_MsgChecksumFailure msg; - - if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_CHECKSUMFAILURE); - msg.m_databaseid = dboid; - msg.m_failurecount = failurecount; - msg.m_failure_time = GetCurrentTimestamp(); - - pgstat_send(&msg, sizeof(msg)); -} - -/* -------- - * pgstat_report_checksum_failure() - - * - * Tell the collector about a checksum failure. - * -------- - */ -void -pgstat_report_checksum_failure(void) -{ - pgstat_report_checksum_failures_in_db(MyDatabaseId, 1); -} - -/* -------- - * pgstat_report_tempfile() - - * - * Tell the collector about a temporary file. - * -------- - */ -void -pgstat_report_tempfile(size_t filesize) -{ - PgStat_MsgTempFile msg; - - if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_TEMPFILE); - msg.m_databaseid = MyDatabaseId; - msg.m_filesize = filesize; - pgstat_send(&msg, sizeof(msg)); -} - -/* -------- - * pgstat_report_connect() - - * - * Tell the collector about a new connection. - * -------- - */ -void -pgstat_report_connect(Oid dboid) -{ - PgStat_MsgConnect msg; - - if (!pgstat_should_report_connstat()) - return; - - pgLastSessionReportTime = MyStartTimestamp; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_CONNECT); - msg.m_databaseid = MyDatabaseId; - pgstat_send(&msg, sizeof(PgStat_MsgConnect)); -} - -/* -------- - * pgstat_report_disconnect() - - * - * Tell the collector about a disconnect. - * -------- - */ -static void -pgstat_report_disconnect(Oid dboid) -{ - PgStat_MsgDisconnect msg; - - if (!pgstat_should_report_connstat()) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_DISCONNECT); - msg.m_databaseid = MyDatabaseId; - msg.m_cause = pgStatSessionEndCause; - pgstat_send(&msg, sizeof(PgStat_MsgDisconnect)); -} - -/* -------- - * pgstat_should_report_connstats() - - * - * We report session statistics only for normal backend processes. Parallel - * workers run in parallel, so they don't contribute to session times, even - * though they use CPU time. Walsender processes could be considered here, - * but they have different session characteristics from normal backends (for - * example, they are always "active"), so they would skew session statistics. - * ---------- - */ -static bool -pgstat_should_report_connstat(void) -{ - return MyBackendType == B_BACKEND; -} - -/* ---------- - * pgstat_report_replslot() - - * - * Tell the collector about replication slot statistics. - * ---------- - */ -void -pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat) -{ - PgStat_MsgReplSlot msg; - - /* - * Prepare and send the message - */ - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); - namestrcpy(&msg.m_slotname, NameStr(repSlotStat->slotname)); - msg.m_create = false; - msg.m_drop = false; - msg.m_spill_txns = repSlotStat->spill_txns; - msg.m_spill_count = repSlotStat->spill_count; - msg.m_spill_bytes = repSlotStat->spill_bytes; - msg.m_stream_txns = repSlotStat->stream_txns; - msg.m_stream_count = repSlotStat->stream_count; - msg.m_stream_bytes = repSlotStat->stream_bytes; - msg.m_total_txns = repSlotStat->total_txns; - msg.m_total_bytes = repSlotStat->total_bytes; - pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); -} - -/* ---------- - * pgstat_report_replslot_create() - - * - * Tell the collector about creating the replication slot. - * ---------- - */ -void -pgstat_report_replslot_create(const char *slotname) -{ - PgStat_MsgReplSlot msg; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); - namestrcpy(&msg.m_slotname, slotname); - msg.m_create = true; - msg.m_drop = false; - pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); -} - -/* ---------- - * pgstat_report_replslot_drop() - - * - * Tell the collector about dropping the replication slot. - * ---------- - */ -void -pgstat_report_replslot_drop(const char *slotname) -{ - PgStat_MsgReplSlot msg; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); - namestrcpy(&msg.m_slotname, slotname); - msg.m_create = false; - msg.m_drop = true; - pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); -} - -/* ---------- - * pgstat_report_subscription_error() - - * - * Tell the collector about the subscription error. - * ---------- - */ -void -pgstat_report_subscription_error(Oid subid, bool is_apply_error) -{ - PgStat_MsgSubscriptionError msg; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_SUBSCRIPTIONERROR); - msg.m_subid = subid; - msg.m_is_apply_error = is_apply_error; - pgstat_send(&msg, sizeof(PgStat_MsgSubscriptionError)); -} - -/* ---------- - * pgstat_report_subscription_drop() - - * - * Tell the collector about dropping the subscription. - * ---------- - */ -void -pgstat_report_subscription_drop(Oid subid) -{ - PgStat_MsgSubscriptionDrop msg; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_SUBSCRIPTIONDROP); - msg.m_subid = subid; - pgstat_send(&msg, sizeof(PgStat_MsgSubscriptionDrop)); -} - -/* ---------- - * pgstat_ping() - - * - * Send some junk data to the collector to increase traffic. - * ---------- - */ -void -pgstat_ping(void) -{ - PgStat_MsgDummy msg; - - if (pgStatSock == PGINVALID_SOCKET) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_DUMMY); - pgstat_send(&msg, sizeof(msg)); -} - -/* ---------- - * pgstat_send_inquiry() - - * - * Notify collector that we need fresh data. - * ---------- - */ -static void -pgstat_send_inquiry(TimestampTz clock_time, TimestampTz cutoff_time, Oid databaseid) -{ - PgStat_MsgInquiry msg; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_INQUIRY); - msg.clock_time = clock_time; - msg.cutoff_time = cutoff_time; - msg.databaseid = databaseid; - pgstat_send(&msg, sizeof(msg)); -} - - -/* - * Initialize function call usage data. - * Called by the executor before invoking a function. - */ -void -pgstat_init_function_usage(FunctionCallInfo fcinfo, - PgStat_FunctionCallUsage *fcu) -{ - PgStat_BackendFunctionEntry *htabent; - bool found; - - if (pgstat_track_functions <= fcinfo->flinfo->fn_stats) - { - /* stats not wanted */ - fcu->fs = NULL; - return; - } - - if (!pgStatFunctions) - { - /* First time through - initialize function stat table */ - HASHCTL hash_ctl; - - hash_ctl.keysize = sizeof(Oid); - hash_ctl.entrysize = sizeof(PgStat_BackendFunctionEntry); - pgStatFunctions = hash_create("Function stat entries", - PGSTAT_FUNCTION_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS); - } - - /* Get the stats entry for this function, create if necessary */ - htabent = hash_search(pgStatFunctions, &fcinfo->flinfo->fn_oid, - HASH_ENTER, &found); - if (!found) - MemSet(&htabent->f_counts, 0, sizeof(PgStat_FunctionCounts)); - - fcu->fs = &htabent->f_counts; - - /* save stats for this function, later used to compensate for recursion */ - fcu->save_f_total_time = htabent->f_counts.f_total_time; - - /* save current backend-wide total time */ - fcu->save_total = total_func_time; - - /* get clock time as of function start */ - INSTR_TIME_SET_CURRENT(fcu->f_start); -} - -/* - * find_funcstat_entry - find any existing PgStat_BackendFunctionEntry entry - * for specified function - * - * If no entry, return NULL, don't create a new one - */ -PgStat_BackendFunctionEntry * -find_funcstat_entry(Oid func_id) -{ - pgstat_assert_is_up(); - - if (pgStatFunctions == NULL) - return NULL; - - return (PgStat_BackendFunctionEntry *) hash_search(pgStatFunctions, - (void *) &func_id, - HASH_FIND, NULL); -} - -/* - * Calculate function call usage and update stat counters. - * Called by the executor after invoking a function. - * - * In the case of a set-returning function that runs in value-per-call mode, - * we will see multiple pgstat_init_function_usage/pgstat_end_function_usage - * calls for what the user considers a single call of the function. The - * finalize flag should be TRUE on the last call. - */ -void -pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize) -{ - PgStat_FunctionCounts *fs = fcu->fs; - instr_time f_total; - instr_time f_others; - instr_time f_self; - - /* stats not wanted? */ - if (fs == NULL) - return; - - /* total elapsed time in this function call */ - INSTR_TIME_SET_CURRENT(f_total); - INSTR_TIME_SUBTRACT(f_total, fcu->f_start); - - /* self usage: elapsed minus anything already charged to other calls */ - f_others = total_func_time; - INSTR_TIME_SUBTRACT(f_others, fcu->save_total); - f_self = f_total; - INSTR_TIME_SUBTRACT(f_self, f_others); - - /* update backend-wide total time */ - INSTR_TIME_ADD(total_func_time, f_self); - - /* - * Compute the new f_total_time as the total elapsed time added to the - * pre-call value of f_total_time. This is necessary to avoid - * double-counting any time taken by recursive calls of myself. (We do - * not need any similar kluge for self time, since that already excludes - * any recursive calls.) - */ - INSTR_TIME_ADD(f_total, fcu->save_f_total_time); - - /* update counters in function stats table */ - if (finalize) - fs->f_numcalls++; - fs->f_total_time = f_total; - INSTR_TIME_ADD(fs->f_self_time, f_self); - - /* indicate that we have something to send */ - have_function_stats = true; -} - - -/* ---------- - * pgstat_relation_init() - - * - * Initialize a relcache entry to count access statistics. - * Called whenever a relation is opened. - * - * We assume that a relcache entry's pgstat_info field is zeroed by - * relcache.c when the relcache entry is made; thereafter it is long-lived - * data. We can avoid repeated searches of the TabStatus arrays when the - * same relation is touched repeatedly within a transaction. - * ---------- - */ -void -pgstat_relation_init(Relation rel) -{ - Oid rel_id = rel->rd_id; - char relkind = rel->rd_rel->relkind; - - /* - * We only count stats for relations with storage and partitioned tables - */ - if (!RELKIND_HAS_STORAGE(relkind) && relkind != RELKIND_PARTITIONED_TABLE) - { - rel->pgstat_info = NULL; - return; - } - - if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) - { - /* We're not counting at all */ - rel->pgstat_info = NULL; - return; - } - - /* - * If we already set up this relation in the current transaction, nothing - * to do. - */ - if (rel->pgstat_info != NULL && - rel->pgstat_info->t_id == rel_id) - return; - - /* Else find or make the PgStat_TableStatus entry, and update link */ - rel->pgstat_info = get_tabstat_entry(rel_id, rel->rd_rel->relisshared); -} - -/* - * get_tabstat_entry - find or create a PgStat_TableStatus entry for rel - */ -static PgStat_TableStatus * -get_tabstat_entry(Oid rel_id, bool isshared) -{ - TabStatHashEntry *hash_entry; - PgStat_TableStatus *entry; - TabStatusArray *tsa; - bool found; - - pgstat_assert_is_up(); - - have_relation_stats = true; - - /* - * Create hash table if we don't have it already. - */ - if (pgStatTabHash == NULL) - { - HASHCTL ctl; - - ctl.keysize = sizeof(Oid); - ctl.entrysize = sizeof(TabStatHashEntry); - - pgStatTabHash = hash_create("pgstat TabStatusArray lookup hash table", - TABSTAT_QUANTUM, - &ctl, - HASH_ELEM | HASH_BLOBS); - } - - /* - * Find an entry or create a new one. - */ - hash_entry = hash_search(pgStatTabHash, &rel_id, HASH_ENTER, &found); - if (!found) - { - /* initialize new entry with null pointer */ - hash_entry->tsa_entry = NULL; - } - - /* - * If entry is already valid, we're done. - */ - if (hash_entry->tsa_entry) - return hash_entry->tsa_entry; - - /* - * Locate the first pgStatTabList entry with free space, making a new list - * entry if needed. Note that we could get an OOM failure here, but if so - * we have left the hashtable and the list in a consistent state. - */ - if (pgStatTabList == NULL) - { - /* Set up first pgStatTabList entry */ - pgStatTabList = (TabStatusArray *) - MemoryContextAllocZero(TopMemoryContext, - sizeof(TabStatusArray)); - } - - tsa = pgStatTabList; - while (tsa->tsa_used >= TABSTAT_QUANTUM) - { - if (tsa->tsa_next == NULL) - tsa->tsa_next = (TabStatusArray *) - MemoryContextAllocZero(TopMemoryContext, - sizeof(TabStatusArray)); - tsa = tsa->tsa_next; - } - - /* - * Allocate a PgStat_TableStatus entry within this list entry. We assume - * the entry was already zeroed, either at creation or after last use. - */ - entry = &tsa->tsa_entries[tsa->tsa_used++]; - entry->t_id = rel_id; - entry->t_shared = isshared; - - /* - * Now we can fill the entry in pgStatTabHash. - */ - hash_entry->tsa_entry = entry; - - return entry; -} - -/* - * find_tabstat_entry - find any existing PgStat_TableStatus entry for rel - * - * If no entry, return NULL, don't create a new one - * - * Note: if we got an error in the most recent execution of pgstat_report_stat, - * it's possible that an entry exists but there's no hashtable entry for it. - * That's okay, we'll treat this case as "doesn't exist". - */ -PgStat_TableStatus * -find_tabstat_entry(Oid rel_id) -{ - TabStatHashEntry *hash_entry; - - /* If hashtable doesn't exist, there are no entries at all */ - if (!pgStatTabHash) - return NULL; - - hash_entry = hash_search(pgStatTabHash, &rel_id, HASH_FIND, NULL); - if (!hash_entry) - return NULL; - - /* Note that this step could also return NULL, but that's correct */ - return hash_entry->tsa_entry; -} - -/* - * Ensure (sub)transaction stack entry for the given nest_level exists, adding - * it if needed. - */ -static PgStat_SubXactStatus * -pgstat_xact_stack_level_get(int nest_level) -{ - PgStat_SubXactStatus *xact_state; - - xact_state = pgStatXactStack; - if (xact_state == NULL || xact_state->nest_level != nest_level) - { - xact_state = (PgStat_SubXactStatus *) - MemoryContextAlloc(TopTransactionContext, - sizeof(PgStat_SubXactStatus)); - xact_state->nest_level = nest_level; - xact_state->prev = pgStatXactStack; - xact_state->first = NULL; - pgStatXactStack = xact_state; - } - return xact_state; -} - -/* - * add_tabstat_xact_level - add a new (sub)transaction state record - */ -static void -add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level) -{ - PgStat_SubXactStatus *xact_state; - PgStat_TableXactStatus *trans; - - /* - * If this is the first rel to be modified at the current nest level, we - * first have to push a transaction stack entry. - */ - xact_state = pgstat_xact_stack_level_get(nest_level); - - /* Now make a per-table stack entry */ - trans = (PgStat_TableXactStatus *) - MemoryContextAllocZero(TopTransactionContext, - sizeof(PgStat_TableXactStatus)); - trans->nest_level = nest_level; - trans->upper = pgstat_info->trans; - trans->parent = pgstat_info; - trans->next = xact_state->first; - xact_state->first = trans; - pgstat_info->trans = trans; -} - -/* - * Add a new (sub)transaction record if needed. - */ -static void -ensure_tabstat_xact_level(PgStat_TableStatus *pgstat_info) -{ - int nest_level = GetCurrentTransactionNestLevel(); - - if (pgstat_info->trans == NULL || - pgstat_info->trans->nest_level != nest_level) - add_tabstat_xact_level(pgstat_info, nest_level); -} - -/* - * pgstat_count_heap_insert - count a tuple insertion of n tuples - */ -void -pgstat_count_heap_insert(Relation rel, PgStat_Counter n) -{ - if (pgstat_relation_should_count(rel)) - { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - ensure_tabstat_xact_level(pgstat_info); - pgstat_info->trans->tuples_inserted += n; - } -} - -/* - * pgstat_count_heap_update - count a tuple update - */ -void -pgstat_count_heap_update(Relation rel, bool hot) -{ - if (pgstat_relation_should_count(rel)) - { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - ensure_tabstat_xact_level(pgstat_info); - pgstat_info->trans->tuples_updated++; - - /* t_tuples_hot_updated is nontransactional, so just advance it */ - if (hot) - pgstat_info->t_counts.t_tuples_hot_updated++; - } -} - -/* - * pgstat_count_heap_delete - count a tuple deletion - */ -void -pgstat_count_heap_delete(Relation rel) -{ - if (pgstat_relation_should_count(rel)) - { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - ensure_tabstat_xact_level(pgstat_info); - pgstat_info->trans->tuples_deleted++; - } -} - -/* - * pgstat_truncdrop_save_counters - * - * Whenever a table is truncated/dropped, we save its i/u/d counters so that - * they can be cleared, and if the (sub)xact that executed the truncate/drop - * later aborts, the counters can be restored to the saved (pre-truncate/drop) - * values. - * - * Note that for truncate we do this on the first truncate in any particular - * subxact level only. - */ -static void -pgstat_truncdrop_save_counters(PgStat_TableXactStatus *trans, bool is_drop) -{ - if (!trans->truncdropped || is_drop) - { - trans->inserted_pre_truncdrop = trans->tuples_inserted; - trans->updated_pre_truncdrop = trans->tuples_updated; - trans->deleted_pre_truncdrop = trans->tuples_deleted; - trans->truncdropped = true; - } -} - -/* - * pgstat_truncdrop_restore_counters - restore counters when a truncate aborts - */ -static void -pgstat_truncdrop_restore_counters(PgStat_TableXactStatus *trans) -{ - if (trans->truncdropped) - { - trans->tuples_inserted = trans->inserted_pre_truncdrop; - trans->tuples_updated = trans->updated_pre_truncdrop; - trans->tuples_deleted = trans->deleted_pre_truncdrop; - } -} - -/* - * pgstat_count_truncate - update tuple counters due to truncate - */ -void -pgstat_count_truncate(Relation rel) -{ - if (pgstat_relation_should_count(rel)) - { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - ensure_tabstat_xact_level(pgstat_info); - pgstat_truncdrop_save_counters(pgstat_info->trans, false); - pgstat_info->trans->tuples_inserted = 0; - pgstat_info->trans->tuples_updated = 0; - pgstat_info->trans->tuples_deleted = 0; - } -} - -/* - * pgstat_update_heap_dead_tuples - update dead-tuples count - * - * The semantics of this are that we are reporting the nontransactional - * recovery of "delta" dead tuples; so t_delta_dead_tuples decreases - * rather than increasing, and the change goes straight into the per-table - * counter, not into transactional state. - */ -void -pgstat_update_heap_dead_tuples(Relation rel, int delta) -{ - if (pgstat_relation_should_count(rel)) - { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - pgstat_info->t_counts.t_delta_dead_tuples -= delta; - } -} - -/* - * Perform relation stats specific end-of-transaction work. Helper for - * AtEOXact_PgStat. - * - * Transfer transactional insert/update counts into the base tabstat entries. - * We don't bother to free any of the transactional state, since it's all in - * TopTransactionContext and will go away anyway. - */ -static void -AtEOXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit) -{ - PgStat_TableXactStatus *trans; - - for (trans = xact_state->first; trans != NULL; trans = trans->next) - { - PgStat_TableStatus *tabstat; - - Assert(trans->nest_level == 1); - Assert(trans->upper == NULL); - tabstat = trans->parent; - Assert(tabstat->trans == trans); - /* restore pre-truncate/drop stats (if any) in case of aborted xact */ - if (!isCommit) - pgstat_truncdrop_restore_counters(trans); - /* count attempted actions regardless of commit/abort */ - tabstat->t_counts.t_tuples_inserted += trans->tuples_inserted; - tabstat->t_counts.t_tuples_updated += trans->tuples_updated; - tabstat->t_counts.t_tuples_deleted += trans->tuples_deleted; - if (isCommit) - { - tabstat->t_counts.t_truncdropped = trans->truncdropped; - if (trans->truncdropped) - { - /* forget live/dead stats seen by backend thus far */ - tabstat->t_counts.t_delta_live_tuples = 0; - tabstat->t_counts.t_delta_dead_tuples = 0; - } - /* insert adds a live tuple, delete removes one */ - tabstat->t_counts.t_delta_live_tuples += - trans->tuples_inserted - trans->tuples_deleted; - /* update and delete each create a dead tuple */ - tabstat->t_counts.t_delta_dead_tuples += - trans->tuples_updated + trans->tuples_deleted; - /* insert, update, delete each count as one change event */ - tabstat->t_counts.t_changed_tuples += - trans->tuples_inserted + trans->tuples_updated + - trans->tuples_deleted; - } - else - { - /* inserted tuples are dead, deleted tuples are unaffected */ - tabstat->t_counts.t_delta_dead_tuples += - trans->tuples_inserted + trans->tuples_updated; - /* an aborted xact generates no changed_tuple events */ - } - tabstat->trans = NULL; - } -} - -static void -AtEOXact_PgStat_Database(bool isCommit, bool parallel) -{ - /* Don't count parallel worker transaction stats */ - if (!parallel) - { - /* - * Count transaction commit or abort. (We use counters, not just - * bools, in case the reporting message isn't sent right away.) - */ - if (isCommit) - pgStatXactCommit++; - else - pgStatXactRollback++; - } -} - -/* ---------- - * AtEOXact_PgStat + * AtEOXact_PgStat * * Called from access/transam/xact.c at top-level transaction commit/abort. * ---------- */ void AtEOXact_PgStat(bool isCommit, bool parallel) -{ - PgStat_SubXactStatus *xact_state; - - AtEOXact_PgStat_Database(isCommit, parallel); - - /* handle transactional stats information */ - xact_state = pgStatXactStack; - if (xact_state != NULL) - { - Assert(xact_state->nest_level == 1); - Assert(xact_state->prev == NULL); - - AtEOXact_PgStat_Relations(xact_state, isCommit); - } - pgStatXactStack = NULL; - - /* Make sure any stats snapshot is thrown away */ - pgstat_clear_snapshot(); -} - -/* - * Perform relation stats specific end-of-sub-transaction work. Helper for - * AtEOSubXact_PgStat. - * - * Transfer transactional insert/update counts into the next higher - * subtransaction state. - */ -static void -AtEOSubXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit, int nestDepth) -{ - PgStat_TableXactStatus *trans; - PgStat_TableXactStatus *next_trans; - - for (trans = xact_state->first; trans != NULL; trans = next_trans) - { - PgStat_TableStatus *tabstat; - - next_trans = trans->next; - Assert(trans->nest_level == nestDepth); - tabstat = trans->parent; - Assert(tabstat->trans == trans); - - if (isCommit) - { - if (trans->upper && trans->upper->nest_level == nestDepth - 1) - { - if (trans->truncdropped) - { - /* propagate the truncate/drop status one level up */ - pgstat_truncdrop_save_counters(trans->upper, false); - /* replace upper xact stats with ours */ - trans->upper->tuples_inserted = trans->tuples_inserted; - trans->upper->tuples_updated = trans->tuples_updated; - trans->upper->tuples_deleted = trans->tuples_deleted; - } - else - { - trans->upper->tuples_inserted += trans->tuples_inserted; - trans->upper->tuples_updated += trans->tuples_updated; - trans->upper->tuples_deleted += trans->tuples_deleted; - } - tabstat->trans = trans->upper; - pfree(trans); - } - else - { - /* - * When there isn't an immediate parent state, we can just - * reuse the record instead of going through a palloc/pfree - * pushup (this works since it's all in TopTransactionContext - * anyway). We have to re-link it into the parent level, - * though, and that might mean pushing a new entry into the - * pgStatXactStack. - */ - PgStat_SubXactStatus *upper_xact_state; - - upper_xact_state = pgstat_xact_stack_level_get(nestDepth - 1); - trans->next = upper_xact_state->first; - upper_xact_state->first = trans; - trans->nest_level = nestDepth - 1; - } - } - else - { - /* - * On abort, update top-level tabstat counts, then forget the - * subtransaction - */ +{ + PgStat_SubXactStatus *xact_state; - /* first restore values obliterated by truncate/drop */ - pgstat_truncdrop_restore_counters(trans); - /* count attempted actions regardless of commit/abort */ - tabstat->t_counts.t_tuples_inserted += trans->tuples_inserted; - tabstat->t_counts.t_tuples_updated += trans->tuples_updated; - tabstat->t_counts.t_tuples_deleted += trans->tuples_deleted; - /* inserted tuples are dead, deleted tuples are unaffected */ - tabstat->t_counts.t_delta_dead_tuples += - trans->tuples_inserted + trans->tuples_updated; - tabstat->trans = trans->upper; - pfree(trans); - } + AtEOXact_PgStat_Database(isCommit, parallel); + + /* handle transactional stats information */ + xact_state = pgStatXactStack; + if (xact_state != NULL) + { + Assert(xact_state->nest_level == 1); + Assert(xact_state->prev == NULL); + + AtEOXact_PgStat_Relations(xact_state, isCommit); } + pgStatXactStack = NULL; + + /* Make sure any stats snapshot is thrown away */ + pgstat_clear_snapshot(); } /* ---------- @@ -2711,40 +1216,6 @@ AtEOSubXact_PgStat(bool isCommit, int nestDepth) } } -/* - * Generate 2PC records for all the pending transaction-dependent relation - * stats. - */ -static void -AtPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state) -{ - PgStat_TableXactStatus *trans; - - for (trans = xact_state->first; trans != NULL; trans = trans->next) - { - PgStat_TableStatus *tabstat; - TwoPhasePgStatRecord record; - - Assert(trans->nest_level == 1); - Assert(trans->upper == NULL); - tabstat = trans->parent; - Assert(tabstat->trans == trans); - - record.tuples_inserted = trans->tuples_inserted; - record.tuples_updated = trans->tuples_updated; - record.tuples_deleted = trans->tuples_deleted; - record.inserted_pre_truncdrop = trans->inserted_pre_truncdrop; - record.updated_pre_truncdrop = trans->updated_pre_truncdrop; - record.deleted_pre_truncdrop = trans->deleted_pre_truncdrop; - record.t_id = tabstat->t_id; - record.t_shared = tabstat->t_shared; - record.t_truncdropped = trans->truncdropped; - - RegisterTwoPhaseRecord(TWOPHASE_RM_PGSTAT_ID, 0, - &record, sizeof(TwoPhasePgStatRecord)); - } -} - /* * AtPrepare_PgStat * Save the transactional stats state at 2PC transaction prepare. @@ -2764,28 +1235,6 @@ AtPrepare_PgStat(void) } } -/* - * All we need do here is unlink the transaction stats state from the - * nontransactional state. The nontransactional action counts will be - * reported to the stats collector immediately, while the effects on - * live and dead tuple counts are preserved in the 2PC state file. - * - * Note: AtEOXact_PgStat_Relations is not called during PREPARE. - */ -static void -PostPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state) -{ - PgStat_TableXactStatus *trans; - - for (trans = xact_state->first; trans != NULL; trans = trans->next) - { - PgStat_TableStatus *tabstat; - - tabstat = trans->parent; - tabstat->trans = NULL; - } -} - /* * PostPrepare_PgStat * Clean up after successful PREPARE. @@ -2815,72 +1264,6 @@ PostPrepare_PgStat(void) pgstat_clear_snapshot(); } -/* - * 2PC processing routine for COMMIT PREPARED case. - * - * Load the saved counts into our local pgstats state. - */ -void -pgstat_twophase_postcommit(TransactionId xid, uint16 info, - void *recdata, uint32 len) -{ - TwoPhasePgStatRecord *rec = (TwoPhasePgStatRecord *) recdata; - PgStat_TableStatus *pgstat_info; - - /* Find or create a tabstat entry for the rel */ - pgstat_info = get_tabstat_entry(rec->t_id, rec->t_shared); - - /* Same math as in AtEOXact_PgStat, commit case */ - pgstat_info->t_counts.t_tuples_inserted += rec->tuples_inserted; - pgstat_info->t_counts.t_tuples_updated += rec->tuples_updated; - pgstat_info->t_counts.t_tuples_deleted += rec->tuples_deleted; - pgstat_info->t_counts.t_truncdropped = rec->t_truncdropped; - if (rec->t_truncdropped) - { - /* forget live/dead stats seen by backend thus far */ - pgstat_info->t_counts.t_delta_live_tuples = 0; - pgstat_info->t_counts.t_delta_dead_tuples = 0; - } - pgstat_info->t_counts.t_delta_live_tuples += - rec->tuples_inserted - rec->tuples_deleted; - pgstat_info->t_counts.t_delta_dead_tuples += - rec->tuples_updated + rec->tuples_deleted; - pgstat_info->t_counts.t_changed_tuples += - rec->tuples_inserted + rec->tuples_updated + - rec->tuples_deleted; -} - -/* - * 2PC processing routine for ROLLBACK PREPARED case. - * - * Load the saved counts into our local pgstats state, but treat them - * as aborted. - */ -void -pgstat_twophase_postabort(TransactionId xid, uint16 info, - void *recdata, uint32 len) -{ - TwoPhasePgStatRecord *rec = (TwoPhasePgStatRecord *) recdata; - PgStat_TableStatus *pgstat_info; - - /* Find or create a tabstat entry for the rel */ - pgstat_info = get_tabstat_entry(rec->t_id, rec->t_shared); - - /* Same math as in AtEOXact_PgStat, abort case */ - if (rec->t_truncdropped) - { - rec->tuples_inserted = rec->inserted_pre_truncdrop; - rec->tuples_updated = rec->updated_pre_truncdrop; - rec->tuples_deleted = rec->deleted_pre_truncdrop; - } - pgstat_info->t_counts.t_tuples_inserted += rec->tuples_inserted; - pgstat_info->t_counts.t_tuples_updated += rec->tuples_updated; - pgstat_info->t_counts.t_tuples_deleted += rec->tuples_deleted; - pgstat_info->t_counts.t_delta_dead_tuples += - rec->tuples_inserted + rec->tuples_updated; -} - - /* ---------- * pgstat_fetch_stat_dbentry() - * @@ -3185,7 +1568,7 @@ pgstat_initialize(void) * Set common header fields in a statistics message * ---------- */ -static void +void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype) { hdr->m_type = mtype; @@ -3198,7 +1581,7 @@ pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype) * Send out one statistics message to the collector * ---------- */ -static void +void pgstat_send(void *msg, int len) { int rc; @@ -3223,252 +1606,6 @@ pgstat_send(void *msg, int len) #endif } -/* ---------- - * pgstat_send_archiver() - - * - * Tell the collector about the WAL file that we successfully - * archived or failed to archive. - * ---------- - */ -void -pgstat_send_archiver(const char *xlog, bool failed) -{ - PgStat_MsgArchiver msg; - - /* - * Prepare and send the message - */ - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_ARCHIVER); - msg.m_failed = failed; - strlcpy(msg.m_xlog, xlog, sizeof(msg.m_xlog)); - msg.m_timestamp = GetCurrentTimestamp(); - pgstat_send(&msg, sizeof(msg)); -} - -/* ---------- - * pgstat_send_bgwriter() - - * - * Send bgwriter statistics to the collector - * ---------- - */ -void -pgstat_send_bgwriter(void) -{ - /* We assume this initializes to zeroes */ - static const PgStat_MsgBgWriter all_zeroes; - - pgstat_assert_is_up(); - - /* - * This function can be called even if nothing at all has happened. In - * this case, avoid sending a completely empty message to the stats - * collector. - */ - if (memcmp(&PendingBgWriterStats, &all_zeroes, sizeof(PgStat_MsgBgWriter)) == 0) - return; - - /* - * Prepare and send the message - */ - pgstat_setheader(&PendingBgWriterStats.m_hdr, PGSTAT_MTYPE_BGWRITER); - pgstat_send(&PendingBgWriterStats, sizeof(PendingBgWriterStats)); - - /* - * Clear out the statistics buffer, so it can be re-used. - */ - MemSet(&PendingBgWriterStats, 0, sizeof(PendingBgWriterStats)); -} - -/* ---------- - * pgstat_send_checkpointer() - - * - * Send checkpointer statistics to the collector - * ---------- - */ -void -pgstat_send_checkpointer(void) -{ - /* We assume this initializes to zeroes */ - static const PgStat_MsgCheckpointer all_zeroes; - - /* - * This function can be called even if nothing at all has happened. In - * this case, avoid sending a completely empty message to the stats - * collector. - */ - if (memcmp(&PendingCheckpointerStats, &all_zeroes, sizeof(PgStat_MsgCheckpointer)) == 0) - return; - - /* - * Prepare and send the message - */ - pgstat_setheader(&PendingCheckpointerStats.m_hdr, PGSTAT_MTYPE_CHECKPOINTER); - pgstat_send(&PendingCheckpointerStats, sizeof(PendingCheckpointerStats)); - - /* - * Clear out the statistics buffer, so it can be re-used. - */ - MemSet(&PendingCheckpointerStats, 0, sizeof(PendingCheckpointerStats)); -} - -/* ---------- - * pgstat_send_wal() - - * - * Send WAL statistics to the collector. - * - * If 'force' is not set, WAL stats message is only sent if enough time has - * passed since last one was sent to reach PGSTAT_STAT_INTERVAL. - * ---------- - */ -void -pgstat_send_wal(bool force) -{ - static TimestampTz sendTime = 0; - - /* - * This function can be called even if nothing at all has happened. In - * this case, avoid sending a completely empty message to the stats - * collector. - * - * Check wal_records counter to determine whether any WAL activity has - * happened since last time. Note that other WalUsage counters don't need - * to be checked because they are incremented always together with - * wal_records counter. - * - * m_wal_buffers_full also doesn't need to be checked because it's - * incremented only when at least one WAL record is generated (i.e., - * wal_records counter is incremented). But for safely, we assert that - * m_wal_buffers_full is always zero when no WAL record is generated - * - * This function can be called by a process like walwriter that normally - * generates no WAL records. To determine whether any WAL activity has - * happened at that process since the last time, the numbers of WAL writes - * and syncs are also checked. - */ - if (pgWalUsage.wal_records == prevWalUsage.wal_records && - WalStats.m_wal_write == 0 && WalStats.m_wal_sync == 0) - { - Assert(WalStats.m_wal_buffers_full == 0); - return; - } - - if (!force) - { - TimestampTz now = GetCurrentTimestamp(); - - /* - * Don't send a message unless it's been at least PGSTAT_STAT_INTERVAL - * msec since we last sent one to avoid overloading the stats - * collector. - */ - if (!TimestampDifferenceExceeds(sendTime, now, PGSTAT_STAT_INTERVAL)) - return; - sendTime = now; - } - - /* - * Set the counters related to generated WAL data if the counters were - * updated. - */ - if (pgWalUsage.wal_records != prevWalUsage.wal_records) - { - WalUsage walusage; - - /* - * Calculate how much WAL usage counters were increased by subtracting - * the previous counters from the current ones. Fill the results in - * WAL stats message. - */ - MemSet(&walusage, 0, sizeof(WalUsage)); - WalUsageAccumDiff(&walusage, &pgWalUsage, &prevWalUsage); - - WalStats.m_wal_records = walusage.wal_records; - WalStats.m_wal_fpi = walusage.wal_fpi; - WalStats.m_wal_bytes = walusage.wal_bytes; - - /* - * Save the current counters for the subsequent calculation of WAL - * usage. - */ - prevWalUsage = pgWalUsage; - } - - /* - * Prepare and send the message - */ - pgstat_setheader(&WalStats.m_hdr, PGSTAT_MTYPE_WAL); - pgstat_send(&WalStats, sizeof(WalStats)); - - /* - * Clear out the statistics buffer, so it can be re-used. - */ - MemSet(&WalStats, 0, sizeof(WalStats)); -} - -static void -pgstat_wal_initialize(void) -{ - /* - * Initialize prevWalUsage with pgWalUsage so that pgstat_send_wal() can - * calculate how much pgWalUsage counters are increased by subtracting - * prevWalUsage from pgWalUsage. - */ - prevWalUsage = pgWalUsage; -} - -/* - * To determine whether any WAL activity has occurred since last time, not - * only the number of generated WAL records but also the numbers of WAL - * writes and syncs need to be checked. Because even transaction that - * generates no WAL records can write or sync WAL data when flushing the - * data pages. - */ -static bool -pgstat_wal_pending(void) -{ - return pgWalUsage.wal_records != prevWalUsage.wal_records || - WalStats.m_wal_write != 0 || - WalStats.m_wal_sync != 0; -} - -/* ---------- - * pgstat_send_slru() - - * - * Send SLRU statistics to the collector - * ---------- - */ -static void -pgstat_send_slru(void) -{ - /* We assume this initializes to zeroes */ - static const PgStat_MsgSLRU all_zeroes; - - for (int i = 0; i < SLRU_NUM_ELEMENTS; i++) - { - /* - * This function can be called even if nothing at all has happened. In - * this case, avoid sending a completely empty message to the stats - * collector. - */ - if (memcmp(&SLRUStats[i], &all_zeroes, sizeof(PgStat_MsgSLRU)) == 0) - continue; - - /* set the SLRU type before each send */ - SLRUStats[i].m_index = i; - - /* - * Prepare and send the message - */ - pgstat_setheader(&SLRUStats[i].m_hdr, PGSTAT_MTYPE_SLRU); - pgstat_send(&SLRUStats[i], sizeof(PgStat_MsgSLRU)); - - /* - * Clear out the statistics buffer, so it can be re-used. - */ - MemSet(&SLRUStats[i], 0, sizeof(PgStat_MsgSLRU)); - } -} - /* ---------- * PgstatCollectorMain() - * @@ -5085,11 +3222,13 @@ pgstat_setup_memcxt(void) * pgstat_shutdown(). This check is put in a few central places to catch * violations of this rule more easily. */ -static void +#ifdef USE_ASSERT_CHECKING +void pgstat_assert_is_up(void) { Assert(pgstat_is_initialized && !pgstat_is_shutdown); } +#endif /* ---------- @@ -6323,109 +4462,3 @@ pgstat_reset_subscription(PgStat_StatSubEntry *subentry, TimestampTz ts) subentry->sync_error_count = 0; subentry->stat_reset_timestamp = ts; } - -/* - * pgstat_slru_index - * - * Determine index of entry for a SLRU with a given name. If there's no exact - * match, returns index of the last "other" entry used for SLRUs defined in - * external projects. - */ -int -pgstat_slru_index(const char *name) -{ - int i; - - for (i = 0; i < SLRU_NUM_ELEMENTS; i++) - { - if (strcmp(slru_names[i], name) == 0) - return i; - } - - /* return index of the last entry (which is the "other" one) */ - return (SLRU_NUM_ELEMENTS - 1); -} - -/* - * pgstat_slru_name - * - * Returns SLRU name for an index. The index may be above SLRU_NUM_ELEMENTS, - * in which case this returns NULL. This allows writing code that does not - * know the number of entries in advance. - */ -const char * -pgstat_slru_name(int slru_idx) -{ - if (slru_idx < 0 || slru_idx >= SLRU_NUM_ELEMENTS) - return NULL; - - return slru_names[slru_idx]; -} - -/* - * slru_entry - * - * Returns pointer to entry with counters for given SLRU (based on the name - * stored in SlruCtl as lwlock tranche name). - */ -static inline PgStat_MsgSLRU * -slru_entry(int slru_idx) -{ - pgstat_assert_is_up(); - - /* - * The postmaster should never register any SLRU statistics counts; if it - * did, the counts would be duplicated into child processes via fork(). - */ - Assert(IsUnderPostmaster || !IsPostmasterEnvironment); - - Assert((slru_idx >= 0) && (slru_idx < SLRU_NUM_ELEMENTS)); - - return &SLRUStats[slru_idx]; -} - -/* - * SLRU statistics count accumulation functions --- called from slru.c - */ - -void -pgstat_count_slru_page_zeroed(int slru_idx) -{ - slru_entry(slru_idx)->m_blocks_zeroed += 1; -} - -void -pgstat_count_slru_page_hit(int slru_idx) -{ - slru_entry(slru_idx)->m_blocks_hit += 1; -} - -void -pgstat_count_slru_page_exists(int slru_idx) -{ - slru_entry(slru_idx)->m_blocks_exists += 1; -} - -void -pgstat_count_slru_page_read(int slru_idx) -{ - slru_entry(slru_idx)->m_blocks_read += 1; -} - -void -pgstat_count_slru_page_written(int slru_idx) -{ - slru_entry(slru_idx)->m_blocks_written += 1; -} - -void -pgstat_count_slru_flush(int slru_idx) -{ - slru_entry(slru_idx)->m_flush += 1; -} - -void -pgstat_count_slru_truncate(int slru_idx) -{ - slru_entry(slru_idx)->m_truncate += 1; -} diff --git a/src/backend/utils/activity/Makefile b/src/backend/utils/activity/Makefile index 425f1d11b8..25a967ab7d 100644 --- a/src/backend/utils/activity/Makefile +++ b/src/backend/utils/activity/Makefile @@ -16,6 +16,16 @@ include $(top_builddir)/src/Makefile.global OBJS = \ backend_progress.o \ backend_status.o \ + pgstat_archiver.o \ + pgstat_bgwriter.o \ + pgstat_checkpointer.o \ + pgstat_database.o \ + pgstat_function.o \ + pgstat_relation.o \ + pgstat_replslot.o \ + pgstat_subscription.o \ + pgstat_wal.o \ + pgstat_slru.o \ wait_event.o include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/utils/activity/pgstat_archiver.c b/src/backend/utils/activity/pgstat_archiver.c new file mode 100644 index 0000000000..36788f7ab4 --- /dev/null +++ b/src/backend/utils/activity/pgstat_archiver.c @@ -0,0 +1,44 @@ +/* ------------------------------------------------------------------------- + * + * pgstat_archiver.c + * Implementation of archiver statistics. + * + * This file contains the implementation of archiver statistics. It is kept + * separate from pgstat.c to enforce the line between the statistics access / + * storage implementation and the details about individual types of + * statistics. + * + * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/activity/pgstat_archiver.c + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "utils/pgstat_internal.h" +#include "utils/timestamp.h" + + +/* ---------- + * pgstat_send_archiver() - + * + * Tell the collector about the WAL file that we successfully + * archived or failed to archive. + * ---------- + */ +void +pgstat_send_archiver(const char *xlog, bool failed) +{ + PgStat_MsgArchiver msg; + + /* + * Prepare and send the message + */ + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_ARCHIVER); + msg.m_failed = failed; + strlcpy(msg.m_xlog, xlog, sizeof(msg.m_xlog)); + msg.m_timestamp = GetCurrentTimestamp(); + pgstat_send(&msg, sizeof(msg)); +} diff --git a/src/backend/utils/activity/pgstat_bgwriter.c b/src/backend/utils/activity/pgstat_bgwriter.c new file mode 100644 index 0000000000..c5cf0002de --- /dev/null +++ b/src/backend/utils/activity/pgstat_bgwriter.c @@ -0,0 +1,63 @@ +/* ------------------------------------------------------------------------- + * + * pgstat_bgwriter.c + * Implementation of bgwriter statistics. + * + * This file contains the implementation of bgwriter statistics. It is kept + * separate from pgstat.c to enforce the line between the statistics access / + * storage implementation and the details about individual types of + * statistics. + * + * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/activity/pgstat_bgwriter.c + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "utils/pgstat_internal.h" + + +/* + * BgWriter global statistics counters. Stored directly in a stats + * message structure so they can be sent without needing to copy things + * around. We assume this init to zeroes. + */ +PgStat_MsgBgWriter PendingBgWriterStats; + + +/* ---------- + * pgstat_send_bgwriter() - + * + * Send bgwriter statistics to the collector + * ---------- + */ +void +pgstat_send_bgwriter(void) +{ + /* We assume this initializes to zeroes */ + static const PgStat_MsgBgWriter all_zeroes; + + pgstat_assert_is_up(); + + /* + * This function can be called even if nothing at all has happened. In + * this case, avoid sending a completely empty message to the stats + * collector. + */ + if (memcmp(&PendingBgWriterStats, &all_zeroes, sizeof(PgStat_MsgBgWriter)) == 0) + return; + + /* + * Prepare and send the message + */ + pgstat_setheader(&PendingBgWriterStats.m_hdr, PGSTAT_MTYPE_BGWRITER); + pgstat_send(&PendingBgWriterStats, sizeof(PendingBgWriterStats)); + + /* + * Clear out the statistics buffer, so it can be re-used. + */ + MemSet(&PendingBgWriterStats, 0, sizeof(PendingBgWriterStats)); +} diff --git a/src/backend/utils/activity/pgstat_checkpointer.c b/src/backend/utils/activity/pgstat_checkpointer.c new file mode 100644 index 0000000000..2ce3fba76c --- /dev/null +++ b/src/backend/utils/activity/pgstat_checkpointer.c @@ -0,0 +1,61 @@ +/* ------------------------------------------------------------------------- + * + * pgstat_checkpointer.c + * Implementation of checkpoint statistics. + * + * This file contains the implementation of checkpoint statistics. It is kept + * separate from pgstat.c to enforce the line between the statistics access / + * storage implementation and the details about individual types of + * statistics. + * + * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/activity/pgstat_checkpointer.c + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "utils/pgstat_internal.h" + + +/* + * Checkpointer global statistics counters. Stored directly in a stats + * message structure so they can be sent without needing to copy things + * around. We assume this init to zeroes. + */ +PgStat_MsgCheckpointer PendingCheckpointerStats; + + +/* ---------- + * pgstat_send_checkpointer() - + * + * Send checkpointer statistics to the collector + * ---------- + */ +void +pgstat_send_checkpointer(void) +{ + /* We assume this initializes to zeroes */ + static const PgStat_MsgCheckpointer all_zeroes; + + /* + * This function can be called even if nothing at all has happened. In + * this case, avoid sending a completely empty message to the stats + * collector. + */ + if (memcmp(&PendingCheckpointerStats, &all_zeroes, sizeof(PgStat_MsgCheckpointer)) == 0) + return; + + /* + * Prepare and send the message + */ + pgstat_setheader(&PendingCheckpointerStats.m_hdr, PGSTAT_MTYPE_CHECKPOINTER); + pgstat_send(&PendingCheckpointerStats, sizeof(PendingCheckpointerStats)); + + /* + * Clear out the statistics buffer, so it can be re-used. + */ + MemSet(&PendingCheckpointerStats, 0, sizeof(PendingCheckpointerStats)); +} diff --git a/src/backend/utils/activity/pgstat_database.c b/src/backend/utils/activity/pgstat_database.c new file mode 100644 index 0000000000..31f6624c58 --- /dev/null +++ b/src/backend/utils/activity/pgstat_database.c @@ -0,0 +1,279 @@ +/* ------------------------------------------------------------------------- + * + * pgstat_database.c + * Implementation of database statistics. + * + * This file contains the implementation of database statistics. It is kept + * separate from pgstat.c to enforce the line between the statistics access / + * storage implementation and the details about individual types of + * statistics. + * + * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/activity/pgstat_database.c + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "utils/pgstat_internal.h" +#include "utils/timestamp.h" + + +static bool pgstat_should_report_connstat(void); + + +int pgStatXactCommit = 0; +int pgStatXactRollback = 0; +PgStat_Counter pgStatBlockReadTime = 0; +PgStat_Counter pgStatBlockWriteTime = 0; +PgStat_Counter pgStatActiveTime = 0; +PgStat_Counter pgStatTransactionIdleTime = 0; +SessionEndType pgStatSessionEndCause = DISCONNECT_NORMAL; + + +static PgStat_Counter pgLastSessionReportTime = 0; + + +/* ---------- + * pgstat_drop_database() - + * + * Tell the collector that we just dropped a database. + * (If the message gets lost, we will still clean the dead DB eventually + * via future invocations of pgstat_vacuum_stat().) + * ---------- + */ +void +pgstat_drop_database(Oid databaseid) +{ + PgStat_MsgDropdb msg; + + if (pgStatSock == PGINVALID_SOCKET) + return; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_DROPDB); + msg.m_databaseid = databaseid; + pgstat_send(&msg, sizeof(msg)); +} + +/* -------- + * pgstat_report_recovery_conflict() - + * + * Tell the collector about a Hot Standby recovery conflict. + * -------- + */ +void +pgstat_report_recovery_conflict(int reason) +{ + PgStat_MsgRecoveryConflict msg; + + if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) + return; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RECOVERYCONFLICT); + msg.m_databaseid = MyDatabaseId; + msg.m_reason = reason; + pgstat_send(&msg, sizeof(msg)); +} + +/* -------- + * pgstat_report_deadlock() - + * + * Tell the collector about a deadlock detected. + * -------- + */ +void +pgstat_report_deadlock(void) +{ + PgStat_MsgDeadlock msg; + + if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) + return; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_DEADLOCK); + msg.m_databaseid = MyDatabaseId; + pgstat_send(&msg, sizeof(msg)); +} + +/* -------- + * pgstat_report_checksum_failures_in_db() - + * + * Tell the collector about one or more checksum failures. + * -------- + */ +void +pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount) +{ + PgStat_MsgChecksumFailure msg; + + if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) + return; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_CHECKSUMFAILURE); + msg.m_databaseid = dboid; + msg.m_failurecount = failurecount; + msg.m_failure_time = GetCurrentTimestamp(); + + pgstat_send(&msg, sizeof(msg)); +} + +/* -------- + * pgstat_report_checksum_failure() - + * + * Tell the collector about a checksum failure. + * -------- + */ +void +pgstat_report_checksum_failure(void) +{ + pgstat_report_checksum_failures_in_db(MyDatabaseId, 1); +} + +/* -------- + * pgstat_report_tempfile() - + * + * Tell the collector about a temporary file. + * -------- + */ +void +pgstat_report_tempfile(size_t filesize) +{ + PgStat_MsgTempFile msg; + + if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) + return; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_TEMPFILE); + msg.m_databaseid = MyDatabaseId; + msg.m_filesize = filesize; + pgstat_send(&msg, sizeof(msg)); +} + +/* -------- + * pgstat_report_connect() - + * + * Tell the collector about a new connection. + * -------- + */ +void +pgstat_report_connect(Oid dboid) +{ + PgStat_MsgConnect msg; + + if (!pgstat_should_report_connstat()) + return; + + pgLastSessionReportTime = MyStartTimestamp; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_CONNECT); + msg.m_databaseid = MyDatabaseId; + pgstat_send(&msg, sizeof(PgStat_MsgConnect)); +} + +/* -------- + * pgstat_report_disconnect() - + * + * Tell the collector about a disconnect. + * -------- + */ +void +pgstat_report_disconnect(Oid dboid) +{ + PgStat_MsgDisconnect msg; + + if (!pgstat_should_report_connstat()) + return; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_DISCONNECT); + msg.m_databaseid = MyDatabaseId; + msg.m_cause = pgStatSessionEndCause; + pgstat_send(&msg, sizeof(PgStat_MsgDisconnect)); +} + +void +AtEOXact_PgStat_Database(bool isCommit, bool parallel) +{ + /* Don't count parallel worker transaction stats */ + if (!parallel) + { + /* + * Count transaction commit or abort. (We use counters, not just + * bools, in case the reporting message isn't sent right away.) + */ + if (isCommit) + pgStatXactCommit++; + else + pgStatXactRollback++; + } +} + +/* + * Subroutine for pgstat_send_tabstat: Handle xact commit/rollback and I/O + * timings. + */ +void +pgstat_update_dbstats(PgStat_MsgTabstat *tsmsg, TimestampTz now) +{ + if (OidIsValid(tsmsg->m_databaseid)) + { + tsmsg->m_xact_commit = pgStatXactCommit; + tsmsg->m_xact_rollback = pgStatXactRollback; + tsmsg->m_block_read_time = pgStatBlockReadTime; + tsmsg->m_block_write_time = pgStatBlockWriteTime; + + if (pgstat_should_report_connstat()) + { + long secs; + int usecs; + + /* + * pgLastSessionReportTime is initialized to MyStartTimestamp by + * pgstat_report_connect(). + */ + TimestampDifference(pgLastSessionReportTime, now, &secs, &usecs); + pgLastSessionReportTime = now; + tsmsg->m_session_time = (PgStat_Counter) secs * 1000000 + usecs; + tsmsg->m_active_time = pgStatActiveTime; + tsmsg->m_idle_in_xact_time = pgStatTransactionIdleTime; + } + else + { + tsmsg->m_session_time = 0; + tsmsg->m_active_time = 0; + tsmsg->m_idle_in_xact_time = 0; + } + pgStatXactCommit = 0; + pgStatXactRollback = 0; + pgStatBlockReadTime = 0; + pgStatBlockWriteTime = 0; + pgStatActiveTime = 0; + pgStatTransactionIdleTime = 0; + } + else + { + tsmsg->m_xact_commit = 0; + tsmsg->m_xact_rollback = 0; + tsmsg->m_block_read_time = 0; + tsmsg->m_block_write_time = 0; + tsmsg->m_session_time = 0; + tsmsg->m_active_time = 0; + tsmsg->m_idle_in_xact_time = 0; + } +} + +/* -------- + * pgstat_should_report_connstats() - + * + * We report session statistics only for normal backend processes. Parallel + * workers run in parallel, so they don't contribute to session times, even + * though they use CPU time. Walsender processes could be considered here, + * but they have different session characteristics from normal backends (for + * example, they are always "active"), so they would skew session statistics. + * ---------- + */ +static bool +pgstat_should_report_connstat(void) +{ + return MyBackendType == B_BACKEND; +} diff --git a/src/backend/utils/activity/pgstat_function.c b/src/backend/utils/activity/pgstat_function.c new file mode 100644 index 0000000000..ad37bb74aa --- /dev/null +++ b/src/backend/utils/activity/pgstat_function.c @@ -0,0 +1,225 @@ +/* ------------------------------------------------------------------------- + * + * pgstat_function.c + * Implementation of function statistics. + * + * This file contains the implementation of function statistics. It is kept + * separate from pgstat.c to enforce the line between the statistics access / + * storage implementation and the details about individual types of + * statistics. + * + * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/activity/pgstat_function.c + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "utils/pgstat_internal.h" +#include "utils/timestamp.h" + + +/* ---------- + * GUC parameters + * ---------- + */ +int pgstat_track_functions = TRACK_FUNC_OFF; + + +/* + * Indicates if backend has some function stats that it hasn't yet + * sent to the collector. + */ +bool have_function_stats = false; + +/* + * Backends store per-function info that's waiting to be sent to the collector + * in this hash table (indexed by function OID). + */ +static HTAB *pgStatFunctions = NULL; + +/* + * Total time charged to functions so far in the current backend. + * We use this to help separate "self" and "other" time charges. + * (We assume this initializes to zero.) + */ +static instr_time total_func_time; + + +/* + * Initialize function call usage data. + * Called by the executor before invoking a function. + */ +void +pgstat_init_function_usage(FunctionCallInfo fcinfo, + PgStat_FunctionCallUsage *fcu) +{ + PgStat_BackendFunctionEntry *htabent; + bool found; + + if (pgstat_track_functions <= fcinfo->flinfo->fn_stats) + { + /* stats not wanted */ + fcu->fs = NULL; + return; + } + + if (!pgStatFunctions) + { + /* First time through - initialize function stat table */ + HASHCTL hash_ctl; + + hash_ctl.keysize = sizeof(Oid); + hash_ctl.entrysize = sizeof(PgStat_BackendFunctionEntry); + pgStatFunctions = hash_create("Function stat entries", + PGSTAT_FUNCTION_HASH_SIZE, + &hash_ctl, + HASH_ELEM | HASH_BLOBS); + } + + /* Get the stats entry for this function, create if necessary */ + htabent = hash_search(pgStatFunctions, &fcinfo->flinfo->fn_oid, + HASH_ENTER, &found); + if (!found) + MemSet(&htabent->f_counts, 0, sizeof(PgStat_FunctionCounts)); + + fcu->fs = &htabent->f_counts; + + /* save stats for this function, later used to compensate for recursion */ + fcu->save_f_total_time = htabent->f_counts.f_total_time; + + /* save current backend-wide total time */ + fcu->save_total = total_func_time; + + /* get clock time as of function start */ + INSTR_TIME_SET_CURRENT(fcu->f_start); +} + +/* + * Calculate function call usage and update stat counters. + * Called by the executor after invoking a function. + * + * In the case of a set-returning function that runs in value-per-call mode, + * we will see multiple pgstat_init_function_usage/pgstat_end_function_usage + * calls for what the user considers a single call of the function. The + * finalize flag should be TRUE on the last call. + */ +void +pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize) +{ + PgStat_FunctionCounts *fs = fcu->fs; + instr_time f_total; + instr_time f_others; + instr_time f_self; + + /* stats not wanted? */ + if (fs == NULL) + return; + + /* total elapsed time in this function call */ + INSTR_TIME_SET_CURRENT(f_total); + INSTR_TIME_SUBTRACT(f_total, fcu->f_start); + + /* self usage: elapsed minus anything already charged to other calls */ + f_others = total_func_time; + INSTR_TIME_SUBTRACT(f_others, fcu->save_total); + f_self = f_total; + INSTR_TIME_SUBTRACT(f_self, f_others); + + /* update backend-wide total time */ + INSTR_TIME_ADD(total_func_time, f_self); + + /* + * Compute the new f_total_time as the total elapsed time added to the + * pre-call value of f_total_time. This is necessary to avoid + * double-counting any time taken by recursive calls of myself. (We do + * not need any similar kluge for self time, since that already excludes + * any recursive calls.) + */ + INSTR_TIME_ADD(f_total, fcu->save_f_total_time); + + /* update counters in function stats table */ + if (finalize) + fs->f_numcalls++; + fs->f_total_time = f_total; + INSTR_TIME_ADD(fs->f_self_time, f_self); + + /* indicate that we have something to send */ + have_function_stats = true; +} + +/* + * Subroutine for pgstat_report_stat: populate and send a function stat message + */ +void +pgstat_send_funcstats(void) +{ + /* we assume this inits to all zeroes: */ + static const PgStat_FunctionCounts all_zeroes; + + PgStat_MsgFuncstat msg; + PgStat_BackendFunctionEntry *entry; + HASH_SEQ_STATUS fstat; + + if (pgStatFunctions == NULL) + return; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_FUNCSTAT); + msg.m_databaseid = MyDatabaseId; + msg.m_nentries = 0; + + hash_seq_init(&fstat, pgStatFunctions); + while ((entry = (PgStat_BackendFunctionEntry *) hash_seq_search(&fstat)) != NULL) + { + PgStat_FunctionEntry *m_ent; + + /* Skip it if no counts accumulated since last time */ + if (memcmp(&entry->f_counts, &all_zeroes, + sizeof(PgStat_FunctionCounts)) == 0) + continue; + + /* need to convert format of time accumulators */ + m_ent = &msg.m_entry[msg.m_nentries]; + m_ent->f_id = entry->f_id; + m_ent->f_numcalls = entry->f_counts.f_numcalls; + m_ent->f_total_time = INSTR_TIME_GET_MICROSEC(entry->f_counts.f_total_time); + m_ent->f_self_time = INSTR_TIME_GET_MICROSEC(entry->f_counts.f_self_time); + + if (++msg.m_nentries >= PGSTAT_NUM_FUNCENTRIES) + { + pgstat_send(&msg, offsetof(PgStat_MsgFuncstat, m_entry[0]) + + msg.m_nentries * sizeof(PgStat_FunctionEntry)); + msg.m_nentries = 0; + } + + /* reset the entry's counts */ + MemSet(&entry->f_counts, 0, sizeof(PgStat_FunctionCounts)); + } + + if (msg.m_nentries > 0) + pgstat_send(&msg, offsetof(PgStat_MsgFuncstat, m_entry[0]) + + msg.m_nentries * sizeof(PgStat_FunctionEntry)); + + have_function_stats = false; +} + +/* + * find_funcstat_entry - find any existing PgStat_BackendFunctionEntry entry + * for specified function + * + * If no entry, return NULL, don't create a new one + */ +PgStat_BackendFunctionEntry * +find_funcstat_entry(Oid func_id) +{ + pgstat_assert_is_up(); + + if (pgStatFunctions == NULL) + return NULL; + + return (PgStat_BackendFunctionEntry *) hash_search(pgStatFunctions, + (void *) &func_id, + HASH_FIND, NULL); +} diff --git a/src/backend/utils/activity/pgstat_relation.c b/src/backend/utils/activity/pgstat_relation.c new file mode 100644 index 0000000000..f5c03b54b4 --- /dev/null +++ b/src/backend/utils/activity/pgstat_relation.c @@ -0,0 +1,935 @@ +/* ------------------------------------------------------------------------- + * + * pgstat_relation.c + * Implementation of relation statistics. + * + * This file contains the implementation of function relation. It is kept + * separate from pgstat.c to enforce the line between the statistics access / + * storage implementation and the details about individual types of + * statistics. + * + * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/activity/pgstat_relation.c + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "access/twophase_rmgr.h" +#include "access/xact.h" +#include "postmaster/autovacuum.h" +#include "utils/memutils.h" +#include "utils/pgstat_internal.h" +#include "utils/rel.h" +#include "utils/timestamp.h" + + +/* + * Structures in which backends store per-table info that's waiting to be + * sent to the collector. + * + * NOTE: once allocated, TabStatusArray structures are never moved or deleted + * for the life of the backend. Also, we zero out the t_id fields of the + * contained PgStat_TableStatus structs whenever they are not actively in use. + * This allows relcache pgstat_info pointers to be treated as long-lived data, + * avoiding repeated searches in pgstat_relation_init() when a relation is + * repeatedly opened during a transaction. + */ +#define TABSTAT_QUANTUM 100 /* we alloc this many at a time */ + + +typedef struct TabStatusArray +{ + struct TabStatusArray *tsa_next; /* link to next array, if any */ + int tsa_used; /* # entries currently used */ + PgStat_TableStatus tsa_entries[TABSTAT_QUANTUM]; /* per-table data */ +} TabStatusArray; + +static TabStatusArray *pgStatTabList = NULL; + +/* + * pgStatTabHash entry: map from relation OID to PgStat_TableStatus pointer + */ +typedef struct TabStatHashEntry +{ + Oid t_id; + PgStat_TableStatus *tsa_entry; +} TabStatHashEntry; + +/* Record that's written to 2PC state file when pgstat state is persisted */ +typedef struct TwoPhasePgStatRecord +{ + PgStat_Counter tuples_inserted; /* tuples inserted in xact */ + PgStat_Counter tuples_updated; /* tuples updated in xact */ + PgStat_Counter tuples_deleted; /* tuples deleted in xact */ + /* tuples i/u/d prior to truncate/drop */ + PgStat_Counter inserted_pre_truncdrop; + PgStat_Counter updated_pre_truncdrop; + PgStat_Counter deleted_pre_truncdrop; + Oid t_id; /* table's OID */ + bool t_shared; /* is it a shared catalog? */ + bool t_truncdropped; /* was the relation truncated/dropped? */ +} TwoPhasePgStatRecord; + + +static PgStat_TableStatus *get_tabstat_entry(Oid rel_id, bool isshared); +static void pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg, TimestampTz now); +static void add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level); +static void ensure_tabstat_xact_level(PgStat_TableStatus *pgstat_info); +static void pgstat_truncdrop_save_counters(PgStat_TableXactStatus *trans, bool is_drop); +static void pgstat_truncdrop_restore_counters(PgStat_TableXactStatus *trans); + + +/* + * Indicates if backend has some relation stats that it hasn't yet + * sent to the collector. + */ +bool have_relation_stats; + + +/* + * Hash table for O(1) t_id -> tsa_entry lookup + */ +static HTAB *pgStatTabHash = NULL; + + +/* ---------- + * pgstat_relation_init() - + * + * Initialize a relcache entry to count access statistics. + * Called whenever a relation is opened. + * + * We assume that a relcache entry's pgstat_info field is zeroed by + * relcache.c when the relcache entry is made; thereafter it is long-lived + * data. We can avoid repeated searches of the TabStatus arrays when the + * same relation is touched repeatedly within a transaction. + * ---------- + */ +void +pgstat_relation_init(Relation rel) +{ + Oid rel_id = rel->rd_id; + char relkind = rel->rd_rel->relkind; + + /* + * We only count stats for relations with storage and partitioned tables + */ + if (!RELKIND_HAS_STORAGE(relkind) && relkind != RELKIND_PARTITIONED_TABLE) + { + rel->pgstat_info = NULL; + return; + } + + if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) + { + /* We're not counting at all */ + rel->pgstat_info = NULL; + return; + } + + /* + * If we already set up this relation in the current transaction, nothing + * to do. + */ + if (rel->pgstat_info != NULL && + rel->pgstat_info->t_id == rel_id) + return; + + /* Else find or make the PgStat_TableStatus entry, and update link */ + rel->pgstat_info = get_tabstat_entry(rel_id, rel->rd_rel->relisshared); +} + +/* ---------- + * pgstat_drop_relation() - + * + * Tell the collector that we just dropped a relation. + * (If the message gets lost, we will still clean the dead entry eventually + * via future invocations of pgstat_vacuum_stat().) + * + * Currently not used for lack of any good place to call it; we rely + * entirely on pgstat_vacuum_stat() to clean out stats for dead rels. + * ---------- + */ +#ifdef NOT_USED +void +pgstat_drop_relation(Oid relid) +{ + PgStat_MsgTabpurge msg; + int len; + + if (pgStatSock == PGINVALID_SOCKET) + return; + + msg.m_tableid[0] = relid; + msg.m_nentries = 1; + + len = offsetof(PgStat_MsgTabpurge, m_tableid[0]) + sizeof(Oid); + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_TABPURGE); + msg.m_databaseid = MyDatabaseId; + pgstat_send(&msg, len); +} +#endif /* NOT_USED */ + +/* ---------- + * pgstat_report_autovac() - + * + * Called from autovacuum.c to report startup of an autovacuum process. + * We are called before InitPostgres is done, so can't rely on MyDatabaseId; + * the db OID must be passed in, instead. + * ---------- + */ +void +pgstat_report_autovac(Oid dboid) +{ + PgStat_MsgAutovacStart msg; + + if (pgStatSock == PGINVALID_SOCKET) + return; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_AUTOVAC_START); + msg.m_databaseid = dboid; + msg.m_start_time = GetCurrentTimestamp(); + + pgstat_send(&msg, sizeof(msg)); +} + +/* --------- + * pgstat_report_vacuum() - + * + * Tell the collector about the table we just vacuumed. + * --------- + */ +void +pgstat_report_vacuum(Oid tableoid, bool shared, + PgStat_Counter livetuples, PgStat_Counter deadtuples) +{ + PgStat_MsgVacuum msg; + + if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) + return; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_VACUUM); + msg.m_databaseid = shared ? InvalidOid : MyDatabaseId; + msg.m_tableoid = tableoid; + msg.m_autovacuum = IsAutoVacuumWorkerProcess(); + msg.m_vacuumtime = GetCurrentTimestamp(); + msg.m_live_tuples = livetuples; + msg.m_dead_tuples = deadtuples; + pgstat_send(&msg, sizeof(msg)); +} + +/* -------- + * pgstat_report_analyze() - + * + * Tell the collector about the table we just analyzed. + * + * Caller must provide new live- and dead-tuples estimates, as well as a + * flag indicating whether to reset the changes_since_analyze counter. + * -------- + */ +void +pgstat_report_analyze(Relation rel, + PgStat_Counter livetuples, PgStat_Counter deadtuples, + bool resetcounter) +{ + PgStat_MsgAnalyze msg; + + if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) + return; + + /* + * Unlike VACUUM, ANALYZE might be running inside a transaction that has + * already inserted and/or deleted rows in the target table. ANALYZE will + * have counted such rows as live or dead respectively. Because we will + * report our counts of such rows at transaction end, we should subtract + * off these counts from what we send to the collector now, else they'll + * be double-counted after commit. (This approach also ensures that the + * collector ends up with the right numbers if we abort instead of + * committing.) + * + * Waste no time on partitioned tables, though. + */ + if (pgstat_relation_should_count(rel) && + rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) + { + PgStat_TableXactStatus *trans; + + for (trans = rel->pgstat_info->trans; trans; trans = trans->upper) + { + livetuples -= trans->tuples_inserted - trans->tuples_deleted; + deadtuples -= trans->tuples_updated + trans->tuples_deleted; + } + /* count stuff inserted by already-aborted subxacts, too */ + deadtuples -= rel->pgstat_info->t_counts.t_delta_dead_tuples; + /* Since ANALYZE's counts are estimates, we could have underflowed */ + livetuples = Max(livetuples, 0); + deadtuples = Max(deadtuples, 0); + } + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_ANALYZE); + msg.m_databaseid = rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId; + msg.m_tableoid = RelationGetRelid(rel); + msg.m_autovacuum = IsAutoVacuumWorkerProcess(); + msg.m_resetcounter = resetcounter; + msg.m_analyzetime = GetCurrentTimestamp(); + msg.m_live_tuples = livetuples; + msg.m_dead_tuples = deadtuples; + pgstat_send(&msg, sizeof(msg)); +} + +/* + * pgstat_count_heap_insert - count a tuple insertion of n tuples + */ +void +pgstat_count_heap_insert(Relation rel, PgStat_Counter n) +{ + if (pgstat_relation_should_count(rel)) + { + PgStat_TableStatus *pgstat_info = rel->pgstat_info; + + ensure_tabstat_xact_level(pgstat_info); + pgstat_info->trans->tuples_inserted += n; + } +} + +/* + * pgstat_count_heap_update - count a tuple update + */ +void +pgstat_count_heap_update(Relation rel, bool hot) +{ + if (pgstat_relation_should_count(rel)) + { + PgStat_TableStatus *pgstat_info = rel->pgstat_info; + + ensure_tabstat_xact_level(pgstat_info); + pgstat_info->trans->tuples_updated++; + + /* t_tuples_hot_updated is nontransactional, so just advance it */ + if (hot) + pgstat_info->t_counts.t_tuples_hot_updated++; + } +} + +/* + * pgstat_count_heap_delete - count a tuple deletion + */ +void +pgstat_count_heap_delete(Relation rel) +{ + if (pgstat_relation_should_count(rel)) + { + PgStat_TableStatus *pgstat_info = rel->pgstat_info; + + ensure_tabstat_xact_level(pgstat_info); + pgstat_info->trans->tuples_deleted++; + } +} + +/* + * pgstat_count_truncate - update tuple counters due to truncate + */ +void +pgstat_count_truncate(Relation rel) +{ + if (pgstat_relation_should_count(rel)) + { + PgStat_TableStatus *pgstat_info = rel->pgstat_info; + + ensure_tabstat_xact_level(pgstat_info); + pgstat_truncdrop_save_counters(pgstat_info->trans, false); + pgstat_info->trans->tuples_inserted = 0; + pgstat_info->trans->tuples_updated = 0; + pgstat_info->trans->tuples_deleted = 0; + } +} + +/* + * pgstat_update_heap_dead_tuples - update dead-tuples count + * + * The semantics of this are that we are reporting the nontransactional + * recovery of "delta" dead tuples; so t_delta_dead_tuples decreases + * rather than increasing, and the change goes straight into the per-table + * counter, not into transactional state. + */ +void +pgstat_update_heap_dead_tuples(Relation rel, int delta) +{ + if (pgstat_relation_should_count(rel)) + { + PgStat_TableStatus *pgstat_info = rel->pgstat_info; + + pgstat_info->t_counts.t_delta_dead_tuples -= delta; + } +} + +/* + * find_tabstat_entry - find any existing PgStat_TableStatus entry for rel + * + * If no entry, return NULL, don't create a new one + * + * Note: if we got an error in the most recent execution of pgstat_report_stat, + * it's possible that an entry exists but there's no hashtable entry for it. + * That's okay, we'll treat this case as "doesn't exist". + */ +PgStat_TableStatus * +find_tabstat_entry(Oid rel_id) +{ + TabStatHashEntry *hash_entry; + + /* If hashtable doesn't exist, there are no entries at all */ + if (!pgStatTabHash) + return NULL; + + hash_entry = hash_search(pgStatTabHash, &rel_id, HASH_FIND, NULL); + if (!hash_entry) + return NULL; + + /* Note that this step could also return NULL, but that's correct */ + return hash_entry->tsa_entry; +} + +/* + * Perform relation stats specific end-of-transaction work. Helper for + * AtEOXact_PgStat. + * + * Transfer transactional insert/update counts into the base tabstat entries. + * We don't bother to free any of the transactional state, since it's all in + * TopTransactionContext and will go away anyway. + */ +void +AtEOXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit) +{ + PgStat_TableXactStatus *trans; + + for (trans = xact_state->first; trans != NULL; trans = trans->next) + { + PgStat_TableStatus *tabstat; + + Assert(trans->nest_level == 1); + Assert(trans->upper == NULL); + tabstat = trans->parent; + Assert(tabstat->trans == trans); + /* restore pre-truncate/drop stats (if any) in case of aborted xact */ + if (!isCommit) + pgstat_truncdrop_restore_counters(trans); + /* count attempted actions regardless of commit/abort */ + tabstat->t_counts.t_tuples_inserted += trans->tuples_inserted; + tabstat->t_counts.t_tuples_updated += trans->tuples_updated; + tabstat->t_counts.t_tuples_deleted += trans->tuples_deleted; + if (isCommit) + { + tabstat->t_counts.t_truncdropped = trans->truncdropped; + if (trans->truncdropped) + { + /* forget live/dead stats seen by backend thus far */ + tabstat->t_counts.t_delta_live_tuples = 0; + tabstat->t_counts.t_delta_dead_tuples = 0; + } + /* insert adds a live tuple, delete removes one */ + tabstat->t_counts.t_delta_live_tuples += + trans->tuples_inserted - trans->tuples_deleted; + /* update and delete each create a dead tuple */ + tabstat->t_counts.t_delta_dead_tuples += + trans->tuples_updated + trans->tuples_deleted; + /* insert, update, delete each count as one change event */ + tabstat->t_counts.t_changed_tuples += + trans->tuples_inserted + trans->tuples_updated + + trans->tuples_deleted; + } + else + { + /* inserted tuples are dead, deleted tuples are unaffected */ + tabstat->t_counts.t_delta_dead_tuples += + trans->tuples_inserted + trans->tuples_updated; + /* an aborted xact generates no changed_tuple events */ + } + tabstat->trans = NULL; + } +} + +/* + * Perform relation stats specific end-of-sub-transaction work. Helper for + * AtEOSubXact_PgStat. + * + * Transfer transactional insert/update counts into the next higher + * subtransaction state. + */ +void +AtEOSubXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit, int nestDepth) +{ + PgStat_TableXactStatus *trans; + PgStat_TableXactStatus *next_trans; + + for (trans = xact_state->first; trans != NULL; trans = next_trans) + { + PgStat_TableStatus *tabstat; + + next_trans = trans->next; + Assert(trans->nest_level == nestDepth); + tabstat = trans->parent; + Assert(tabstat->trans == trans); + + if (isCommit) + { + if (trans->upper && trans->upper->nest_level == nestDepth - 1) + { + if (trans->truncdropped) + { + /* propagate the truncate/drop status one level up */ + pgstat_truncdrop_save_counters(trans->upper, false); + /* replace upper xact stats with ours */ + trans->upper->tuples_inserted = trans->tuples_inserted; + trans->upper->tuples_updated = trans->tuples_updated; + trans->upper->tuples_deleted = trans->tuples_deleted; + } + else + { + trans->upper->tuples_inserted += trans->tuples_inserted; + trans->upper->tuples_updated += trans->tuples_updated; + trans->upper->tuples_deleted += trans->tuples_deleted; + } + tabstat->trans = trans->upper; + pfree(trans); + } + else + { + /* + * When there isn't an immediate parent state, we can just + * reuse the record instead of going through a palloc/pfree + * pushup (this works since it's all in TopTransactionContext + * anyway). We have to re-link it into the parent level, + * though, and that might mean pushing a new entry into the + * pgStatXactStack. + */ + PgStat_SubXactStatus *upper_xact_state; + + upper_xact_state = pgstat_xact_stack_level_get(nestDepth - 1); + trans->next = upper_xact_state->first; + upper_xact_state->first = trans; + trans->nest_level = nestDepth - 1; + } + } + else + { + /* + * On abort, update top-level tabstat counts, then forget the + * subtransaction + */ + + /* first restore values obliterated by truncate/drop */ + pgstat_truncdrop_restore_counters(trans); + /* count attempted actions regardless of commit/abort */ + tabstat->t_counts.t_tuples_inserted += trans->tuples_inserted; + tabstat->t_counts.t_tuples_updated += trans->tuples_updated; + tabstat->t_counts.t_tuples_deleted += trans->tuples_deleted; + /* inserted tuples are dead, deleted tuples are unaffected */ + tabstat->t_counts.t_delta_dead_tuples += + trans->tuples_inserted + trans->tuples_updated; + tabstat->trans = trans->upper; + pfree(trans); + } + } +} + +/* + * Generate 2PC records for all the pending transaction-dependent relation + * stats. + */ +void +AtPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state) +{ + PgStat_TableXactStatus *trans; + + for (trans = xact_state->first; trans != NULL; trans = trans->next) + { + PgStat_TableStatus *tabstat; + TwoPhasePgStatRecord record; + + Assert(trans->nest_level == 1); + Assert(trans->upper == NULL); + tabstat = trans->parent; + Assert(tabstat->trans == trans); + + record.tuples_inserted = trans->tuples_inserted; + record.tuples_updated = trans->tuples_updated; + record.tuples_deleted = trans->tuples_deleted; + record.inserted_pre_truncdrop = trans->inserted_pre_truncdrop; + record.updated_pre_truncdrop = trans->updated_pre_truncdrop; + record.deleted_pre_truncdrop = trans->deleted_pre_truncdrop; + record.t_id = tabstat->t_id; + record.t_shared = tabstat->t_shared; + record.t_truncdropped = trans->truncdropped; + + RegisterTwoPhaseRecord(TWOPHASE_RM_PGSTAT_ID, 0, + &record, sizeof(TwoPhasePgStatRecord)); + } +} + +/* + * All we need do here is unlink the transaction stats state from the + * nontransactional state. The nontransactional action counts will be + * reported to the stats collector immediately, while the effects on + * live and dead tuple counts are preserved in the 2PC state file. + * + * Note: AtEOXact_PgStat_Relations is not called during PREPARE. + */ +void +PostPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state) +{ + PgStat_TableXactStatus *trans; + + for (trans = xact_state->first; trans != NULL; trans = trans->next) + { + PgStat_TableStatus *tabstat; + + tabstat = trans->parent; + tabstat->trans = NULL; + } +} + +/* + * 2PC processing routine for COMMIT PREPARED case. + * + * Load the saved counts into our local pgstats state. + */ +void +pgstat_twophase_postcommit(TransactionId xid, uint16 info, + void *recdata, uint32 len) +{ + TwoPhasePgStatRecord *rec = (TwoPhasePgStatRecord *) recdata; + PgStat_TableStatus *pgstat_info; + + /* Find or create a tabstat entry for the rel */ + pgstat_info = get_tabstat_entry(rec->t_id, rec->t_shared); + + /* Same math as in AtEOXact_PgStat, commit case */ + pgstat_info->t_counts.t_tuples_inserted += rec->tuples_inserted; + pgstat_info->t_counts.t_tuples_updated += rec->tuples_updated; + pgstat_info->t_counts.t_tuples_deleted += rec->tuples_deleted; + pgstat_info->t_counts.t_truncdropped = rec->t_truncdropped; + if (rec->t_truncdropped) + { + /* forget live/dead stats seen by backend thus far */ + pgstat_info->t_counts.t_delta_live_tuples = 0; + pgstat_info->t_counts.t_delta_dead_tuples = 0; + } + pgstat_info->t_counts.t_delta_live_tuples += + rec->tuples_inserted - rec->tuples_deleted; + pgstat_info->t_counts.t_delta_dead_tuples += + rec->tuples_updated + rec->tuples_deleted; + pgstat_info->t_counts.t_changed_tuples += + rec->tuples_inserted + rec->tuples_updated + + rec->tuples_deleted; +} + +/* + * 2PC processing routine for ROLLBACK PREPARED case. + * + * Load the saved counts into our local pgstats state, but treat them + * as aborted. + */ +void +pgstat_twophase_postabort(TransactionId xid, uint16 info, + void *recdata, uint32 len) +{ + TwoPhasePgStatRecord *rec = (TwoPhasePgStatRecord *) recdata; + PgStat_TableStatus *pgstat_info; + + /* Find or create a tabstat entry for the rel */ + pgstat_info = get_tabstat_entry(rec->t_id, rec->t_shared); + + /* Same math as in AtEOXact_PgStat, abort case */ + if (rec->t_truncdropped) + { + rec->tuples_inserted = rec->inserted_pre_truncdrop; + rec->tuples_updated = rec->updated_pre_truncdrop; + rec->tuples_deleted = rec->deleted_pre_truncdrop; + } + pgstat_info->t_counts.t_tuples_inserted += rec->tuples_inserted; + pgstat_info->t_counts.t_tuples_updated += rec->tuples_updated; + pgstat_info->t_counts.t_tuples_deleted += rec->tuples_deleted; + pgstat_info->t_counts.t_delta_dead_tuples += + rec->tuples_inserted + rec->tuples_updated; +} + +/* + * Subroutine for pgstat_report_stat: Send relation statistics + */ +void +pgstat_send_tabstats(TimestampTz now, bool disconnect) +{ + /* we assume this inits to all zeroes: */ + static const PgStat_TableCounts all_zeroes; + PgStat_MsgTabstat regular_msg; + PgStat_MsgTabstat shared_msg; + TabStatusArray *tsa; + int i; + + /* + * Destroy pgStatTabHash before we start invalidating PgStat_TableEntry + * entries it points to. (Should we fail partway through the loop below, + * it's okay to have removed the hashtable already --- the only + * consequence is we'd get multiple entries for the same table in the + * pgStatTabList, and that's safe.) + */ + if (pgStatTabHash) + hash_destroy(pgStatTabHash); + pgStatTabHash = NULL; + + /* + * Scan through the TabStatusArray struct(s) to find tables that actually + * have counts, and build messages to send. We have to separate shared + * relations from regular ones because the databaseid field in the message + * header has to depend on that. + */ + regular_msg.m_databaseid = MyDatabaseId; + shared_msg.m_databaseid = InvalidOid; + regular_msg.m_nentries = 0; + shared_msg.m_nentries = 0; + + for (tsa = pgStatTabList; tsa != NULL; tsa = tsa->tsa_next) + { + for (i = 0; i < tsa->tsa_used; i++) + { + PgStat_TableStatus *entry = &tsa->tsa_entries[i]; + PgStat_MsgTabstat *this_msg; + PgStat_TableEntry *this_ent; + + /* Shouldn't have any pending transaction-dependent counts */ + Assert(entry->trans == NULL); + + /* + * Ignore entries that didn't accumulate any actual counts, such + * as indexes that were opened by the planner but not used. + */ + if (memcmp(&entry->t_counts, &all_zeroes, + sizeof(PgStat_TableCounts)) == 0) + continue; + + /* + * OK, insert data into the appropriate message, and send if full. + */ + this_msg = entry->t_shared ? &shared_msg : ®ular_msg; + this_ent = &this_msg->m_entry[this_msg->m_nentries]; + this_ent->t_id = entry->t_id; + memcpy(&this_ent->t_counts, &entry->t_counts, + sizeof(PgStat_TableCounts)); + if (++this_msg->m_nentries >= PGSTAT_NUM_TABENTRIES) + { + pgstat_send_tabstat(this_msg, now); + this_msg->m_nentries = 0; + } + } + /* zero out PgStat_TableStatus structs after use */ + MemSet(tsa->tsa_entries, 0, + tsa->tsa_used * sizeof(PgStat_TableStatus)); + tsa->tsa_used = 0; + } + + /* + * Send partial messages. Make sure that any pending xact commit/abort + * and connection stats get counted, even if there are no table stats to + * send. + */ + if (regular_msg.m_nentries > 0 || + pgStatXactCommit > 0 || pgStatXactRollback > 0 || disconnect) + pgstat_send_tabstat(®ular_msg, now); + if (shared_msg.m_nentries > 0) + pgstat_send_tabstat(&shared_msg, now); + + have_relation_stats = false; +} + +/* + * Subroutine for pgstat_send_tabstats: finish and send one tabstat message + */ +static void +pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg, TimestampTz now) +{ + int n; + int len; + + /* It's unlikely we'd get here with no socket, but maybe not impossible */ + if (pgStatSock == PGINVALID_SOCKET) + return; + + /* + * Report and reset accumulated xact commit/rollback and I/O timings + * whenever we send a normal tabstat message + */ + pgstat_update_dbstats(tsmsg, now); + + n = tsmsg->m_nentries; + len = offsetof(PgStat_MsgTabstat, m_entry[0]) + + n * sizeof(PgStat_TableEntry); + + pgstat_setheader(&tsmsg->m_hdr, PGSTAT_MTYPE_TABSTAT); + pgstat_send(tsmsg, len); +} + +/* + * get_tabstat_entry - find or create a PgStat_TableStatus entry for rel + */ +static PgStat_TableStatus * +get_tabstat_entry(Oid rel_id, bool isshared) +{ + TabStatHashEntry *hash_entry; + PgStat_TableStatus *entry; + TabStatusArray *tsa; + bool found; + + pgstat_assert_is_up(); + + have_relation_stats = true; + + /* + * Create hash table if we don't have it already. + */ + if (pgStatTabHash == NULL) + { + HASHCTL ctl; + + ctl.keysize = sizeof(Oid); + ctl.entrysize = sizeof(TabStatHashEntry); + + pgStatTabHash = hash_create("pgstat TabStatusArray lookup hash table", + TABSTAT_QUANTUM, + &ctl, + HASH_ELEM | HASH_BLOBS); + } + + /* + * Find an entry or create a new one. + */ + hash_entry = hash_search(pgStatTabHash, &rel_id, HASH_ENTER, &found); + if (!found) + { + /* initialize new entry with null pointer */ + hash_entry->tsa_entry = NULL; + } + + /* + * If entry is already valid, we're done. + */ + if (hash_entry->tsa_entry) + return hash_entry->tsa_entry; + + /* + * Locate the first pgStatTabList entry with free space, making a new list + * entry if needed. Note that we could get an OOM failure here, but if so + * we have left the hashtable and the list in a consistent state. + */ + if (pgStatTabList == NULL) + { + /* Set up first pgStatTabList entry */ + pgStatTabList = (TabStatusArray *) + MemoryContextAllocZero(TopMemoryContext, + sizeof(TabStatusArray)); + } + + tsa = pgStatTabList; + while (tsa->tsa_used >= TABSTAT_QUANTUM) + { + if (tsa->tsa_next == NULL) + tsa->tsa_next = (TabStatusArray *) + MemoryContextAllocZero(TopMemoryContext, + sizeof(TabStatusArray)); + tsa = tsa->tsa_next; + } + + /* + * Allocate a PgStat_TableStatus entry within this list entry. We assume + * the entry was already zeroed, either at creation or after last use. + */ + entry = &tsa->tsa_entries[tsa->tsa_used++]; + entry->t_id = rel_id; + entry->t_shared = isshared; + + /* + * Now we can fill the entry in pgStatTabHash. + */ + hash_entry->tsa_entry = entry; + + return entry; +} + +/* + * add_tabstat_xact_level - add a new (sub)transaction state record + */ +static void +add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level) +{ + PgStat_SubXactStatus *xact_state; + PgStat_TableXactStatus *trans; + + /* + * If this is the first rel to be modified at the current nest level, we + * first have to push a transaction stack entry. + */ + xact_state = pgstat_xact_stack_level_get(nest_level); + + /* Now make a per-table stack entry */ + trans = (PgStat_TableXactStatus *) + MemoryContextAllocZero(TopTransactionContext, + sizeof(PgStat_TableXactStatus)); + trans->nest_level = nest_level; + trans->upper = pgstat_info->trans; + trans->parent = pgstat_info; + trans->next = xact_state->first; + xact_state->first = trans; + pgstat_info->trans = trans; +} + +/* + * Add a new (sub)transaction record if needed. + */ +static void +ensure_tabstat_xact_level(PgStat_TableStatus *pgstat_info) +{ + int nest_level = GetCurrentTransactionNestLevel(); + + if (pgstat_info->trans == NULL || + pgstat_info->trans->nest_level != nest_level) + add_tabstat_xact_level(pgstat_info, nest_level); +} + +/* + * pgstat_truncdrop_save_counters + * + * Whenever a table is truncated/dropped, we save its i/u/d counters so that + * they can be cleared, and if the (sub)xact that executed the truncate/drop + * later aborts, the counters can be restored to the saved (pre-truncate/drop) + * values. + * + * Note that for truncate we do this on the first truncate in any particular + * subxact level only. + */ +static void +pgstat_truncdrop_save_counters(PgStat_TableXactStatus *trans, bool is_drop) +{ + if (!trans->truncdropped || is_drop) + { + trans->inserted_pre_truncdrop = trans->tuples_inserted; + trans->updated_pre_truncdrop = trans->tuples_updated; + trans->deleted_pre_truncdrop = trans->tuples_deleted; + trans->truncdropped = true; + } +} + +/* + * pgstat_truncdrop_restore_counters - restore counters when a truncate aborts + */ +static void +pgstat_truncdrop_restore_counters(PgStat_TableXactStatus *trans) +{ + if (trans->truncdropped) + { + trans->tuples_inserted = trans->inserted_pre_truncdrop; + trans->tuples_updated = trans->updated_pre_truncdrop; + trans->tuples_deleted = trans->deleted_pre_truncdrop; + } +} diff --git a/src/backend/utils/activity/pgstat_replslot.c b/src/backend/utils/activity/pgstat_replslot.c new file mode 100644 index 0000000000..2d575b6e5c --- /dev/null +++ b/src/backend/utils/activity/pgstat_replslot.c @@ -0,0 +1,119 @@ +/* ------------------------------------------------------------------------- + * + * pgstat_replslot.c + * Implementation of replication slot statistics. + * + * This file contains the implementation of replication slot statistics. It is kept + * separate from pgstat.c to enforce the line between the statistics access / + * storage implementation and the details about individual types of + * statistics. + * + * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/activity/pgstat_replslot.c + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "replication/slot.h" +#include "utils/builtins.h" /* for namestrcpy() */ +#include "utils/pgstat_internal.h" + + +/* ---------- + * pgstat_reset_replslot_counter() - + * + * Tell the statistics collector to reset a single replication slot + * counter, or all replication slots counters (when name is null). + * + * Permission checking for this function is managed through the normal + * GRANT system. + * ---------- + */ +void +pgstat_reset_replslot_counter(const char *name) +{ + PgStat_MsgResetreplslotcounter msg; + + if (pgStatSock == PGINVALID_SOCKET) + return; + + if (name) + { + namestrcpy(&msg.m_slotname, name); + msg.clearall = false; + } + else + msg.clearall = true; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETREPLSLOTCOUNTER); + + pgstat_send(&msg, sizeof(msg)); +} + +/* ---------- + * pgstat_report_replslot() - + * + * Tell the collector about replication slot statistics. + * ---------- + */ +void +pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat) +{ + PgStat_MsgReplSlot msg; + + /* + * Prepare and send the message + */ + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); + namestrcpy(&msg.m_slotname, NameStr(repSlotStat->slotname)); + msg.m_create = false; + msg.m_drop = false; + msg.m_spill_txns = repSlotStat->spill_txns; + msg.m_spill_count = repSlotStat->spill_count; + msg.m_spill_bytes = repSlotStat->spill_bytes; + msg.m_stream_txns = repSlotStat->stream_txns; + msg.m_stream_count = repSlotStat->stream_count; + msg.m_stream_bytes = repSlotStat->stream_bytes; + msg.m_total_txns = repSlotStat->total_txns; + msg.m_total_bytes = repSlotStat->total_bytes; + pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); +} + +/* ---------- + * pgstat_report_replslot_create() - + * + * Tell the collector about creating the replication slot. + * ---------- + */ +void +pgstat_report_replslot_create(const char *slotname) +{ + PgStat_MsgReplSlot msg; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); + namestrcpy(&msg.m_slotname, slotname); + msg.m_create = true; + msg.m_drop = false; + pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); +} + +/* ---------- + * pgstat_report_replslot_drop() - + * + * Tell the collector about dropping the replication slot. + * ---------- + */ +void +pgstat_report_replslot_drop(const char *slotname) +{ + PgStat_MsgReplSlot msg; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); + namestrcpy(&msg.m_slotname, slotname); + msg.m_create = false; + msg.m_drop = true; + pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); +} diff --git a/src/backend/utils/activity/pgstat_slru.c b/src/backend/utils/activity/pgstat_slru.c new file mode 100644 index 0000000000..058a926211 --- /dev/null +++ b/src/backend/utils/activity/pgstat_slru.c @@ -0,0 +1,201 @@ +/* ------------------------------------------------------------------------- + * + * pgstat_slru.c + * Implementation of SLRU statistics. + * + * This file contains the implementation of SLRU statistics. It is kept + * separate from pgstat.c to enforce the line between the statistics access / + * storage implementation and the details about individual types of + * statistics. + * + * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/activity/pgstat_slru.c + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "utils/pgstat_internal.h" + + +static inline PgStat_MsgSLRU *slru_entry(int slru_idx); + + +/* + * SLRU statistics counts waiting to be sent to the collector. These are + * stored directly in stats message format so they can be sent without needing + * to copy things around. We assume this variable inits to zeroes. Entries + * are one-to-one with slru_names[]. + */ +static PgStat_MsgSLRU SLRUStats[SLRU_NUM_ELEMENTS]; + + +/* ---------- + * pgstat_reset_slru_counter() - + * + * Tell the statistics collector to reset a single SLRU counter, or all + * SLRU counters (when name is null). + * + * Permission checking for this function is managed through the normal + * GRANT system. + * ---------- + */ +void +pgstat_reset_slru_counter(const char *name) +{ + PgStat_MsgResetslrucounter msg; + + if (pgStatSock == PGINVALID_SOCKET) + return; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSLRUCOUNTER); + msg.m_index = (name) ? pgstat_slru_index(name) : -1; + + pgstat_send(&msg, sizeof(msg)); +} + +/* + * SLRU statistics count accumulation functions --- called from slru.c + */ + +void +pgstat_count_slru_page_zeroed(int slru_idx) +{ + slru_entry(slru_idx)->m_blocks_zeroed += 1; +} + +void +pgstat_count_slru_page_hit(int slru_idx) +{ + slru_entry(slru_idx)->m_blocks_hit += 1; +} + +void +pgstat_count_slru_page_exists(int slru_idx) +{ + slru_entry(slru_idx)->m_blocks_exists += 1; +} + +void +pgstat_count_slru_page_read(int slru_idx) +{ + slru_entry(slru_idx)->m_blocks_read += 1; +} + +void +pgstat_count_slru_page_written(int slru_idx) +{ + slru_entry(slru_idx)->m_blocks_written += 1; +} + +void +pgstat_count_slru_flush(int slru_idx) +{ + slru_entry(slru_idx)->m_flush += 1; +} + +void +pgstat_count_slru_truncate(int slru_idx) +{ + slru_entry(slru_idx)->m_truncate += 1; +} + +/* + * pgstat_slru_name + * + * Returns SLRU name for an index. The index may be above SLRU_NUM_ELEMENTS, + * in which case this returns NULL. This allows writing code that does not + * know the number of entries in advance. + */ +const char * +pgstat_slru_name(int slru_idx) +{ + if (slru_idx < 0 || slru_idx >= SLRU_NUM_ELEMENTS) + return NULL; + + return slru_names[slru_idx]; +} + +/* + * pgstat_slru_index + * + * Determine index of entry for a SLRU with a given name. If there's no exact + * match, returns index of the last "other" entry used for SLRUs defined in + * external projects. + */ +int +pgstat_slru_index(const char *name) +{ + int i; + + for (i = 0; i < SLRU_NUM_ELEMENTS; i++) + { + if (strcmp(slru_names[i], name) == 0) + return i; + } + + /* return index of the last entry (which is the "other" one) */ + return (SLRU_NUM_ELEMENTS - 1); +} + +/* ---------- + * pgstat_send_slru() - + * + * Send SLRU statistics to the collector + * ---------- + */ +void +pgstat_send_slru(void) +{ + /* We assume this initializes to zeroes */ + static const PgStat_MsgSLRU all_zeroes; + + for (int i = 0; i < SLRU_NUM_ELEMENTS; i++) + { + /* + * This function can be called even if nothing at all has happened. In + * this case, avoid sending a completely empty message to the stats + * collector. + */ + if (memcmp(&SLRUStats[i], &all_zeroes, sizeof(PgStat_MsgSLRU)) == 0) + continue; + + /* set the SLRU type before each send */ + SLRUStats[i].m_index = i; + + /* + * Prepare and send the message + */ + pgstat_setheader(&SLRUStats[i].m_hdr, PGSTAT_MTYPE_SLRU); + pgstat_send(&SLRUStats[i], sizeof(PgStat_MsgSLRU)); + + /* + * Clear out the statistics buffer, so it can be re-used. + */ + MemSet(&SLRUStats[i], 0, sizeof(PgStat_MsgSLRU)); + } +} + +/* + * slru_entry + * + * Returns pointer to entry with counters for given SLRU (based on the name + * stored in SlruCtl as lwlock tranche name). + */ +static inline PgStat_MsgSLRU * +slru_entry(int slru_idx) +{ + pgstat_assert_is_up(); + + /* + * The postmaster should never register any SLRU statistics counts; if it + * did, the counts would be duplicated into child processes via fork(). + */ + Assert(IsUnderPostmaster || !IsPostmasterEnvironment); + + Assert((slru_idx >= 0) && (slru_idx < SLRU_NUM_ELEMENTS)); + + return &SLRUStats[slru_idx]; +} diff --git a/src/backend/utils/activity/pgstat_subscription.c b/src/backend/utils/activity/pgstat_subscription.c new file mode 100644 index 0000000000..2f1168f5e4 --- /dev/null +++ b/src/backend/utils/activity/pgstat_subscription.c @@ -0,0 +1,78 @@ +/* ------------------------------------------------------------------------- + * + * pgstat_subscription.c + * Implementation of subscription statistics. + * + * This file contains the implementation of subscription statistics. It is kept + * separate from pgstat.c to enforce the line between the statistics access / + * storage implementation and the details about individual types of + * statistics. + * + * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/activity/pgstat_subscription.c + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "utils/pgstat_internal.h" + + +/* ---------- + * pgstat_reset_subscription_counter() - + * + * Tell the statistics collector to reset a single subscription + * counter, or all subscription counters (when subid is InvalidOid). + * + * Permission checking for this function is managed through the normal + * GRANT system. + * ---------- + */ +void +pgstat_reset_subscription_counter(Oid subid) +{ + PgStat_MsgResetsubcounter msg; + + if (pgStatSock == PGINVALID_SOCKET) + return; + + msg.m_subid = subid; + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSUBCOUNTER); + + pgstat_send(&msg, sizeof(msg)); +} + +/* ---------- + * pgstat_report_subscription_error() - + * + * Tell the collector about the subscription error. + * ---------- + */ +void +pgstat_report_subscription_error(Oid subid, bool is_apply_error) +{ + PgStat_MsgSubscriptionError msg; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_SUBSCRIPTIONERROR); + msg.m_subid = subid; + msg.m_is_apply_error = is_apply_error; + pgstat_send(&msg, sizeof(PgStat_MsgSubscriptionError)); +} + +/* ---------- + * pgstat_report_subscription_drop() - + * + * Tell the collector about dropping the subscription. + * ---------- + */ +void +pgstat_report_subscription_drop(Oid subid) +{ + PgStat_MsgSubscriptionDrop msg; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_SUBSCRIPTIONDROP); + msg.m_subid = subid; + pgstat_send(&msg, sizeof(PgStat_MsgSubscriptionDrop)); +} diff --git a/src/backend/utils/activity/pgstat_wal.c b/src/backend/utils/activity/pgstat_wal.c new file mode 100644 index 0000000000..14b6394033 --- /dev/null +++ b/src/backend/utils/activity/pgstat_wal.c @@ -0,0 +1,159 @@ +/* ------------------------------------------------------------------------- + * + * pgstat_wal.c + * Implementation of WAL statistics. + * + * This file contains the implementation of WAL statistics. It is kept + * separate from pgstat.c to enforce the line between the statistics access / + * storage implementation and the details about individual types of + * statistics. + * + * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/activity/pgstat_wal.c + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "utils/pgstat_internal.h" +#include "executor/instrument.h" + + +/* + * WAL global statistics counters. Stored directly in a stats message + * structure so they can be sent without needing to copy things around. We + * assume these init to zeroes. + */ +PgStat_MsgWal WalStats; + + +/* + * WAL usage counters saved from pgWALUsage at the previous call to + * pgstat_send_wal(). This is used to calculate how much WAL usage + * happens between pgstat_send_wal() calls, by subtracting + * the previous counters from the current ones. + */ +static WalUsage prevWalUsage; + + +/* ---------- + * pgstat_send_wal() - + * + * Send WAL statistics to the collector. + * + * If 'force' is not set, WAL stats message is only sent if enough time has + * passed since last one was sent to reach PGSTAT_STAT_INTERVAL. + * ---------- + */ +void +pgstat_send_wal(bool force) +{ + static TimestampTz sendTime = 0; + + /* + * This function can be called even if nothing at all has happened. In + * this case, avoid sending a completely empty message to the stats + * collector. + * + * Check wal_records counter to determine whether any WAL activity has + * happened since last time. Note that other WalUsage counters don't need + * to be checked because they are incremented always together with + * wal_records counter. + * + * m_wal_buffers_full also doesn't need to be checked because it's + * incremented only when at least one WAL record is generated (i.e., + * wal_records counter is incremented). But for safely, we assert that + * m_wal_buffers_full is always zero when no WAL record is generated + * + * This function can be called by a process like walwriter that normally + * generates no WAL records. To determine whether any WAL activity has + * happened at that process since the last time, the numbers of WAL writes + * and syncs are also checked. + */ + if (pgWalUsage.wal_records == prevWalUsage.wal_records && + WalStats.m_wal_write == 0 && WalStats.m_wal_sync == 0) + { + Assert(WalStats.m_wal_buffers_full == 0); + return; + } + + if (!force) + { + TimestampTz now = GetCurrentTimestamp(); + + /* + * Don't send a message unless it's been at least PGSTAT_STAT_INTERVAL + * msec since we last sent one to avoid overloading the stats + * collector. + */ + if (!TimestampDifferenceExceeds(sendTime, now, PGSTAT_STAT_INTERVAL)) + return; + sendTime = now; + } + + /* + * Set the counters related to generated WAL data if the counters were + * updated. + */ + if (pgWalUsage.wal_records != prevWalUsage.wal_records) + { + WalUsage walusage; + + /* + * Calculate how much WAL usage counters were increased by subtracting + * the previous counters from the current ones. Fill the results in + * WAL stats message. + */ + MemSet(&walusage, 0, sizeof(WalUsage)); + WalUsageAccumDiff(&walusage, &pgWalUsage, &prevWalUsage); + + WalStats.m_wal_records = walusage.wal_records; + WalStats.m_wal_fpi = walusage.wal_fpi; + WalStats.m_wal_bytes = walusage.wal_bytes; + + /* + * Save the current counters for the subsequent calculation of WAL + * usage. + */ + prevWalUsage = pgWalUsage; + } + + /* + * Prepare and send the message + */ + pgstat_setheader(&WalStats.m_hdr, PGSTAT_MTYPE_WAL); + pgstat_send(&WalStats, sizeof(WalStats)); + + /* + * Clear out the statistics buffer, so it can be re-used. + */ + MemSet(&WalStats, 0, sizeof(WalStats)); +} + +void +pgstat_wal_initialize(void) +{ + /* + * Initialize prevWalUsage with pgWalUsage so that pgstat_send_wal() can + * calculate how much pgWalUsage counters are increased by subtracting + * prevWalUsage from pgWalUsage. + */ + prevWalUsage = pgWalUsage; +} + +/* + * To determine whether any WAL activity has occurred since last time, not + * only the number of generated WAL records but also the numbers of WAL + * writes and syncs need to be checked. Because even transaction that + * generates no WAL records can write or sync WAL data when flushing the + * data pages. + */ +bool +pgstat_wal_pending(void) +{ + return pgWalUsage.wal_records != prevWalUsage.wal_records || + WalStats.m_wal_write != 0 || + WalStats.m_wal_sync != 0; +} diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h new file mode 100644 index 0000000000..abbb4f8d96 --- /dev/null +++ b/src/include/utils/pgstat_internal.h @@ -0,0 +1,161 @@ +/* ---------- + * pgstat_internal.h + * + * Definitions for the PostgreSQL activity statistics facility that should + * only be needed by files implementing statistics support (rather than ones + * reporting / querying stats). + * + * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * + * src/include/utils/pgstat_internal.h + * ---------- + */ +#ifndef PGSTAT_INTERNAL_H +#define PGSTAT_INTERNAL_H + + +#include "pgstat.h" + + +#define PGSTAT_STAT_INTERVAL 500 /* Minimum time between stats file + * updates; in milliseconds. */ + +/* ---------- + * The initial size hints for the hash tables used in the collector. + * ---------- + */ +#define PGSTAT_DB_HASH_SIZE 16 +#define PGSTAT_TAB_HASH_SIZE 512 +#define PGSTAT_FUNCTION_HASH_SIZE 512 +#define PGSTAT_SUBSCRIPTION_HASH_SIZE 32 +#define PGSTAT_REPLSLOT_HASH_SIZE 32 + + +/* + * Some stats changes are transactional. To maintain those, a stack of + * PgStat_SubXactStatus entries is maintained, which contain data pertaining + * to the current transaction and its active subtransactions. + */ +typedef struct PgStat_SubXactStatus +{ + int nest_level; /* subtransaction nest level */ + + struct PgStat_SubXactStatus *prev; /* higher-level subxact if any */ + + /* + * Tuple insertion/deletion counts for an open transaction can't be + * propagated into PgStat_TableStatus counters until we know if it is + * going to commit or abort. Hence, we keep these counts in per-subxact + * structs that live in TopTransactionContext. This data structure is + * designed on the assumption that subxacts won't usually modify very many + * tables. + */ + PgStat_TableXactStatus *first; /* head of list for this subxact */ +} PgStat_SubXactStatus; + + +/* + * List of SLRU names that we keep stats for. There is no central registry of + * SLRUs, so we use this fixed list instead. The "other" entry is used for + * all SLRUs without an explicit entry (e.g. SLRUs in extensions). + */ +static const char *const slru_names[] = { + "CommitTs", + "MultiXactMember", + "MultiXactOffset", + "Notify", + "Serial", + "Subtrans", + "Xact", + "other" /* has to be last */ +}; + +#define SLRU_NUM_ELEMENTS lengthof(slru_names) + + +/* + * Functions in pgstat.c + */ + +extern PgStat_SubXactStatus *pgstat_xact_stack_level_get(int nest_level); +extern void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype); +extern void pgstat_send(void *msg, int len); +#ifdef USE_ASSERT_CHECKING +extern void pgstat_assert_is_up(void); +#else +#define pgstat_assert_is_up() ((void)true) +#endif + + +/* + * Functions in pgstat_database.c + */ + +extern void AtEOXact_PgStat_Database(bool isCommit, bool parallel); +extern void pgstat_report_disconnect(Oid dboid); +extern void pgstat_update_dbstats(PgStat_MsgTabstat *tsmsg, TimestampTz now); + + +/* + * Functions in pgstat_function.c + */ + +extern void pgstat_send_funcstats(void); + + +/* + * Functions in pgstat_relation.c + */ + +extern void AtEOXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit); +extern void AtEOSubXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit, int nestDepth); +extern void AtPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state); +extern void PostPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state); +extern void pgstat_send_tabstats(TimestampTz now, bool disconnect); + + +/* + * Functions in pgstat_slru.c + */ + +extern void pgstat_send_slru(void); + + +/* + * Functions in pgstat_wal.c + */ + +extern void pgstat_wal_initialize(void); +extern bool pgstat_wal_pending(void); + + +/* + * Variables in pgstat.c + */ + +extern pgsocket pgStatSock; + + +/* + * Variables in pgstat_database.c + */ + +extern int pgStatXactCommit; +extern int pgStatXactRollback; + + +/* + * Variables in pgstat_functions.c + */ + +extern bool have_function_stats; + + +/* + * Variables in pgstat_relation.c + */ + +extern bool have_relation_stats; + + +#endif /* PGSTAT_INTERNAL_H */ From 2591ee8ec44d8cbc8e1226550337a64c684746e4 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 21 Mar 2022 17:44:29 -0400 Subject: [PATCH 198/772] Fix assorted missing logic for GroupingFunc nodes. The planner needs to treat GroupingFunc like Aggref for many purposes, in particular with respect to processing of the argument expressions, which are not to be evaluated at runtime. A few places hadn't gotten that memo, notably including subselect.c's processing of outer-level aggregates. This resulted in assertion failures or wrong plans for cases in which a GROUPING() construct references an outer aggregation level. Also fix missing special cases for GroupingFunc in cost_qual_eval (resulting in wrong cost estimates for GROUPING(), although it's not clear that that would affect plan shapes in practice) and in ruleutils.c (resulting in excess parentheses in pretty-print mode). Per bug #17088 from Yaoguang Chen. Back-patch to all supported branches. Richard Guo, Tom Lane Discussion: https://postgr.es/m/17088-e33882b387de7f5c@postgresql.org --- src/backend/nodes/nodeFuncs.c | 2 + src/backend/optimizer/path/costsize.c | 6 +++ src/backend/optimizer/plan/subselect.c | 30 +++++++++------ src/backend/utils/adt/ruleutils.c | 10 +++-- src/test/regress/expected/groupingsets.out | 45 ++++++++++++++++++++++ src/test/regress/sql/groupingsets.sql | 9 +++++ 6 files changed, 88 insertions(+), 14 deletions(-) diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index 47d0564fa2..ec25aae6e3 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -736,6 +736,8 @@ expression_returns_set_walker(Node *node, void *context) /* Avoid recursion for some cases that parser checks not to return a set */ if (IsA(node, Aggref)) return false; + if (IsA(node, GroupingFunc)) + return false; if (IsA(node, WindowFunc)) return false; diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 8dc7dd4ca2..4d9f3b4bb6 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -4492,6 +4492,12 @@ cost_qual_eval_walker(Node *node, cost_qual_eval_context *context) */ return false; /* don't recurse into children */ } + else if (IsA(node, GroupingFunc)) + { + /* Treat this as having cost 1 */ + context->total.per_tuple += cpu_operator_cost; + return false; /* don't recurse into children */ + } else if (IsA(node, CoerceViaIO)) { CoerceViaIO *iocoerce = (CoerceViaIO *) node; diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index 41bd1ae7d4..863e0e24a1 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -356,15 +356,17 @@ build_subplan(PlannerInfo *root, Plan *plan, PlannerInfo *subroot, Node *arg = pitem->item; /* - * The Var, PlaceHolderVar, or Aggref has already been adjusted to - * have the correct varlevelsup, phlevelsup, or agglevelsup. + * The Var, PlaceHolderVar, Aggref or GroupingFunc has already been + * adjusted to have the correct varlevelsup, phlevelsup, or + * agglevelsup. * - * If it's a PlaceHolderVar or Aggref, its arguments might contain - * SubLinks, which have not yet been processed (see the comments for - * SS_replace_correlation_vars). Do that now. + * If it's a PlaceHolderVar, Aggref or GroupingFunc, its arguments + * might contain SubLinks, which have not yet been processed (see the + * comments for SS_replace_correlation_vars). Do that now. */ if (IsA(arg, PlaceHolderVar) || - IsA(arg, Aggref)) + IsA(arg, Aggref) || + IsA(arg, GroupingFunc)) arg = SS_process_sublinks(root, arg, false); splan->parParam = lappend_int(splan->parParam, pitem->paramId); @@ -1957,10 +1959,11 @@ process_sublinks_mutator(Node *node, process_sublinks_context *context) } /* - * Don't recurse into the arguments of an outer PHV or aggregate here. Any - * SubLinks in the arguments have to be dealt with at the outer query - * level; they'll be handled when build_subplan collects the PHV or Aggref - * into the arguments to be passed down to the current subplan. + * Don't recurse into the arguments of an outer PHV, Aggref or + * GroupingFunc here. Any SubLinks in the arguments have to be dealt with + * at the outer query level; they'll be handled when build_subplan + * collects the PHV, Aggref or GroupingFunc into the arguments to be + * passed down to the current subplan. */ if (IsA(node, PlaceHolderVar)) { @@ -1972,6 +1975,11 @@ process_sublinks_mutator(Node *node, process_sublinks_context *context) if (((Aggref *) node)->agglevelsup > 0) return node; } + else if (IsA(node, GroupingFunc)) + { + if (((GroupingFunc *) node)->agglevelsup > 0) + return node; + } /* * We should never see a SubPlan expression in the input (since this is @@ -2084,7 +2092,7 @@ SS_identify_outer_params(PlannerInfo *root) outer_params = NULL; for (proot = root->parent_root; proot != NULL; proot = proot->parent_root) { - /* Include ordinary Var/PHV/Aggref params */ + /* Include ordinary Var/PHV/Aggref/GroupingFunc params */ foreach(l, proot->plan_params) { PlannerParamItem *pitem = (PlannerParamItem *) lfirst(l); diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index b16526e65e..7f4f3f7369 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -7956,12 +7956,13 @@ get_parameter(Param *param, deparse_context *context) context->varprefix = true; /* - * A Param's expansion is typically a Var, Aggref, or upper-level - * Param, which wouldn't need extra parentheses. Otherwise, insert - * parens to ensure the expression looks atomic. + * A Param's expansion is typically a Var, Aggref, GroupingFunc, or + * upper-level Param, which wouldn't need extra parentheses. + * Otherwise, insert parens to ensure the expression looks atomic. */ need_paren = !(IsA(expr, Var) || IsA(expr, Aggref) || + IsA(expr, GroupingFunc) || IsA(expr, Param)); if (need_paren) appendStringInfoChar(context->buf, '('); @@ -8089,6 +8090,7 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags) case T_NextValueExpr: case T_NullIfExpr: case T_Aggref: + case T_GroupingFunc: case T_WindowFunc: case T_FuncExpr: /* function-like: name(..) or name[..] */ @@ -8205,6 +8207,7 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags) case T_XmlExpr: /* own parentheses */ case T_NullIfExpr: /* other separators */ case T_Aggref: /* own parentheses */ + case T_GroupingFunc: /* own parentheses */ case T_WindowFunc: /* own parentheses */ case T_CaseExpr: /* other separators */ return true; @@ -8255,6 +8258,7 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags) case T_XmlExpr: /* own parentheses */ case T_NullIfExpr: /* other separators */ case T_Aggref: /* own parentheses */ + case T_GroupingFunc: /* own parentheses */ case T_WindowFunc: /* own parentheses */ case T_CaseExpr: /* other separators */ return true; diff --git a/src/test/regress/expected/groupingsets.out b/src/test/regress/expected/groupingsets.out index 58a25b691a..6a56f0b09c 100644 --- a/src/test/regress/expected/groupingsets.out +++ b/src/test/regress/expected/groupingsets.out @@ -2042,4 +2042,49 @@ order by a, b, c; | | (11 rows) +-- test handling of outer GroupingFunc within subqueries +explain (costs off) +select (select grouping(v1)) from (values ((select 1))) v(v1) group by cube(v1); + QUERY PLAN +--------------------------- + MixedAggregate + Hash Key: $2 + Group Key: () + InitPlan 1 (returns $1) + -> Result + InitPlan 3 (returns $2) + -> Result + -> Result + SubPlan 2 + -> Result +(10 rows) + +select (select grouping(v1)) from (values ((select 1))) v(v1) group by cube(v1); + grouping +---------- + 1 + 0 +(2 rows) + +explain (costs off) +select (select grouping(v1)) from (values ((select 1))) v(v1) group by v1; + QUERY PLAN +--------------------------- + GroupAggregate + Group Key: $2 + InitPlan 1 (returns $1) + -> Result + InitPlan 3 (returns $2) + -> Result + -> Result + SubPlan 2 + -> Result +(9 rows) + +select (select grouping(v1)) from (values ((select 1))) v(v1) group by v1; + grouping +---------- + 0 +(1 row) + -- end diff --git a/src/test/regress/sql/groupingsets.sql b/src/test/regress/sql/groupingsets.sql index 473d21f6b9..8050dbf260 100644 --- a/src/test/regress/sql/groupingsets.sql +++ b/src/test/regress/sql/groupingsets.sql @@ -557,4 +557,13 @@ from (values (1, 2, 3), (4, null, 6), (7, 8, 9)) as t (a, b, c) group by rollup(a, b), rollup(a, c) order by a, b, c; +-- test handling of outer GroupingFunc within subqueries +explain (costs off) +select (select grouping(v1)) from (values ((select 1))) v(v1) group by cube(v1); +select (select grouping(v1)) from (values ((select 1))) v(v1) group by cube(v1); + +explain (costs off) +select (select grouping(v1)) from (values ((select 1))) v(v1) group by v1; +select (select grouping(v1)) from (values ((select 1))) v(v1) group by v1; + -- end From 315ae75e9b6da72456eaa44e55ace9ab1b95ef74 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 21 Mar 2022 16:16:42 -0700 Subject: [PATCH 199/772] pgstat: reorder pgstat.[ch] contents. Now that 13619598f10 has split pgstat up into multiple files it isn't quite as hard to come up with a sensible order for pgstat.[ch]. Inconsistent naming makes it still not quite right looking, but that's work for another commit. Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/backend/postmaster/pgstat.c | 1018 ++++++++++++++++--------------- src/include/pgstat.h | 698 +++++++++++---------- 2 files changed, 893 insertions(+), 823 deletions(-) diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index e781cac7bf..1e7adc27b9 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -71,10 +71,12 @@ #include "utils/snapmgr.h" #include "utils/timestamp.h" + /* ---------- * Timer definitions. * ---------- */ + #define PGSTAT_RETRY_DELAY 10 /* How long to wait between checks for a * new file; in milliseconds. */ @@ -95,20 +97,88 @@ #define PGSTAT_MIN_RCVBUF (100 * 1024) +/* ---------- + * Local function forward declarations + * ---------- + */ + +#ifdef EXEC_BACKEND +static pid_t pgstat_forkexec(void); +#endif + +NON_EXEC_STATIC void PgstatCollectorMain(int argc, char *argv[]) pg_attribute_noreturn(); + +static PgStat_StatDBEntry *pgstat_get_db_entry(Oid databaseid, bool create); +static PgStat_StatTabEntry *pgstat_get_tab_entry(PgStat_StatDBEntry *dbentry, + Oid tableoid, bool create); +static PgStat_StatSubEntry *pgstat_get_subscription_entry(Oid subid, bool create); +static void pgstat_reset_subscription(PgStat_StatSubEntry *subentry, TimestampTz ts); +static void pgstat_write_statsfiles(bool permanent, bool allDbs); +static void pgstat_write_db_statsfile(PgStat_StatDBEntry *dbentry, bool permanent); +static HTAB *pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep); +static void pgstat_read_db_statsfile(Oid databaseid, HTAB *tabhash, HTAB *funchash, + bool permanent); +static void backend_read_statsfile(void); + +static bool pgstat_write_statsfile_needed(void); +static bool pgstat_db_requested(Oid databaseid); + +static PgStat_StatReplSlotEntry *pgstat_get_replslot_entry(NameData name, bool create_it); +static void pgstat_reset_replslot(PgStat_StatReplSlotEntry *slotstats, TimestampTz ts); + +static HTAB *pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid); + +static void pgstat_setup_memcxt(void); + +static void pgstat_recv_inquiry(PgStat_MsgInquiry *msg, int len); +static void pgstat_recv_tabstat(PgStat_MsgTabstat *msg, int len); +static void pgstat_recv_tabpurge(PgStat_MsgTabpurge *msg, int len); +static void pgstat_recv_dropdb(PgStat_MsgDropdb *msg, int len); +static void pgstat_recv_resetcounter(PgStat_MsgResetcounter *msg, int len); +static void pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len); +static void pgstat_recv_resetsinglecounter(PgStat_MsgResetsinglecounter *msg, int len); +static void pgstat_recv_resetslrucounter(PgStat_MsgResetslrucounter *msg, int len); +static void pgstat_recv_resetreplslotcounter(PgStat_MsgResetreplslotcounter *msg, int len); +static void pgstat_recv_resetsubcounter(PgStat_MsgResetsubcounter *msg, int len); +static void pgstat_recv_autovac(PgStat_MsgAutovacStart *msg, int len); +static void pgstat_recv_vacuum(PgStat_MsgVacuum *msg, int len); +static void pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len); +static void pgstat_recv_archiver(PgStat_MsgArchiver *msg, int len); +static void pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len); +static void pgstat_recv_checkpointer(PgStat_MsgCheckpointer *msg, int len); +static void pgstat_recv_wal(PgStat_MsgWal *msg, int len); +static void pgstat_recv_slru(PgStat_MsgSLRU *msg, int len); +static void pgstat_recv_funcstat(PgStat_MsgFuncstat *msg, int len); +static void pgstat_recv_funcpurge(PgStat_MsgFuncpurge *msg, int len); +static void pgstat_recv_recoveryconflict(PgStat_MsgRecoveryConflict *msg, int len); +static void pgstat_recv_deadlock(PgStat_MsgDeadlock *msg, int len); +static void pgstat_recv_checksum_failure(PgStat_MsgChecksumFailure *msg, int len); +static void pgstat_recv_connect(PgStat_MsgConnect *msg, int len); +static void pgstat_recv_disconnect(PgStat_MsgDisconnect *msg, int len); +static void pgstat_recv_replslot(PgStat_MsgReplSlot *msg, int len); +static void pgstat_recv_tempfile(PgStat_MsgTempFile *msg, int len); +static void pgstat_recv_subscription_drop(PgStat_MsgSubscriptionDrop *msg, int len); +static void pgstat_recv_subscription_error(PgStat_MsgSubscriptionError *msg, int len); + + /* ---------- * GUC parameters * ---------- */ + bool pgstat_track_counts = false; + /* ---------- * Built from GUC parameter * ---------- */ + char *pgstat_stat_directory = NULL; char *pgstat_stat_filename = NULL; char *pgstat_stat_tmpname = NULL; + /* ---------- * state shared with pgstat_*.c * ---------- @@ -116,6 +186,7 @@ char *pgstat_stat_tmpname = NULL; pgsocket pgStatSock = PGINVALID_SOCKET; + /* ---------- * Local data * ---------- @@ -164,69 +235,6 @@ static bool pgstat_is_shutdown = false; #endif -/* ---------- - * Local function forward declarations - * ---------- - */ -#ifdef EXEC_BACKEND -static pid_t pgstat_forkexec(void); -#endif - -NON_EXEC_STATIC void PgstatCollectorMain(int argc, char *argv[]) pg_attribute_noreturn(); - -static PgStat_StatDBEntry *pgstat_get_db_entry(Oid databaseid, bool create); -static PgStat_StatTabEntry *pgstat_get_tab_entry(PgStat_StatDBEntry *dbentry, - Oid tableoid, bool create); -static PgStat_StatSubEntry *pgstat_get_subscription_entry(Oid subid, bool create); -static void pgstat_reset_subscription(PgStat_StatSubEntry *subentry, TimestampTz ts); -static void pgstat_write_statsfiles(bool permanent, bool allDbs); -static void pgstat_write_db_statsfile(PgStat_StatDBEntry *dbentry, bool permanent); -static HTAB *pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep); -static void pgstat_read_db_statsfile(Oid databaseid, HTAB *tabhash, HTAB *funchash, - bool permanent); -static void backend_read_statsfile(void); - -static bool pgstat_write_statsfile_needed(void); -static bool pgstat_db_requested(Oid databaseid); - -static PgStat_StatReplSlotEntry *pgstat_get_replslot_entry(NameData name, bool create_it); -static void pgstat_reset_replslot(PgStat_StatReplSlotEntry *slotstats, TimestampTz ts); - -static HTAB *pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid); - -static void pgstat_setup_memcxt(void); - - -static void pgstat_recv_inquiry(PgStat_MsgInquiry *msg, int len); -static void pgstat_recv_tabstat(PgStat_MsgTabstat *msg, int len); -static void pgstat_recv_tabpurge(PgStat_MsgTabpurge *msg, int len); -static void pgstat_recv_dropdb(PgStat_MsgDropdb *msg, int len); -static void pgstat_recv_resetcounter(PgStat_MsgResetcounter *msg, int len); -static void pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len); -static void pgstat_recv_resetsinglecounter(PgStat_MsgResetsinglecounter *msg, int len); -static void pgstat_recv_resetslrucounter(PgStat_MsgResetslrucounter *msg, int len); -static void pgstat_recv_resetreplslotcounter(PgStat_MsgResetreplslotcounter *msg, int len); -static void pgstat_recv_resetsubcounter(PgStat_MsgResetsubcounter *msg, int len); -static void pgstat_recv_autovac(PgStat_MsgAutovacStart *msg, int len); -static void pgstat_recv_vacuum(PgStat_MsgVacuum *msg, int len); -static void pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len); -static void pgstat_recv_archiver(PgStat_MsgArchiver *msg, int len); -static void pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len); -static void pgstat_recv_checkpointer(PgStat_MsgCheckpointer *msg, int len); -static void pgstat_recv_wal(PgStat_MsgWal *msg, int len); -static void pgstat_recv_slru(PgStat_MsgSLRU *msg, int len); -static void pgstat_recv_funcstat(PgStat_MsgFuncstat *msg, int len); -static void pgstat_recv_funcpurge(PgStat_MsgFuncpurge *msg, int len); -static void pgstat_recv_recoveryconflict(PgStat_MsgRecoveryConflict *msg, int len); -static void pgstat_recv_deadlock(PgStat_MsgDeadlock *msg, int len); -static void pgstat_recv_checksum_failure(PgStat_MsgChecksumFailure *msg, int len); -static void pgstat_recv_connect(PgStat_MsgConnect *msg, int len); -static void pgstat_recv_disconnect(PgStat_MsgDisconnect *msg, int len); -static void pgstat_recv_replslot(PgStat_MsgReplSlot *msg, int len); -static void pgstat_recv_tempfile(PgStat_MsgTempFile *msg, int len); -static void pgstat_recv_subscription_drop(PgStat_MsgSubscriptionDrop *msg, int len); -static void pgstat_recv_subscription_error(PgStat_MsgSubscriptionError *msg, int len); - /* ------------------------------------------------------------ * Public functions called from postmaster follow * ------------------------------------------------------------ @@ -687,11 +695,230 @@ allow_immediate_pgstat_restart(void) last_pgstat_start_time = 0; } + /* ------------------------------------------------------------ - * Public functions used by backends follow - *------------------------------------------------------------ + * Backend initialization / shutdown functions + * ------------------------------------------------------------ + */ + +/* + * Shut down a single backend's statistics reporting at process exit. + * + * Flush any remaining statistics counts out to the collector. + * Without this, operations triggered during backend exit (such as + * temp table deletions) won't be counted. */ +static void +pgstat_shutdown_hook(int code, Datum arg) +{ + Assert(!pgstat_is_shutdown); + /* + * If we got as far as discovering our own database ID, we can report what + * we did to the collector. Otherwise, we'd be sending an invalid + * database ID, so forget it. (This means that accesses to pg_database + * during failed backend starts might never get counted.) + */ + if (OidIsValid(MyDatabaseId)) + pgstat_report_stat(true); + +#ifdef USE_ASSERT_CHECKING + pgstat_is_shutdown = true; +#endif +} + +/* ---------- + * pgstat_initialize() - + * + * Initialize pgstats state, and set up our on-proc-exit hook. Called from + * BaseInit(). + * + * NOTE: MyDatabaseId isn't set yet; so the shutdown hook has to be careful. + * ---------- + */ +void +pgstat_initialize(void) +{ + Assert(!pgstat_is_initialized); + + pgstat_wal_initialize(); + + /* Set up a process-exit hook to clean up */ + before_shmem_exit(pgstat_shutdown_hook, 0); + +#ifdef USE_ASSERT_CHECKING + pgstat_is_initialized = true; +#endif +} + + +/* ------------------------------------------------------------ + * Transaction integration + * ------------------------------------------------------------ + */ + +/* ---------- + * AtEOXact_PgStat + * + * Called from access/transam/xact.c at top-level transaction commit/abort. + * ---------- + */ +void +AtEOXact_PgStat(bool isCommit, bool parallel) +{ + PgStat_SubXactStatus *xact_state; + + AtEOXact_PgStat_Database(isCommit, parallel); + + /* handle transactional stats information */ + xact_state = pgStatXactStack; + if (xact_state != NULL) + { + Assert(xact_state->nest_level == 1); + Assert(xact_state->prev == NULL); + + AtEOXact_PgStat_Relations(xact_state, isCommit); + } + pgStatXactStack = NULL; + + /* Make sure any stats snapshot is thrown away */ + pgstat_clear_snapshot(); +} + +/* ---------- + * AtEOSubXact_PgStat + * + * Called from access/transam/xact.c at subtransaction commit/abort. + * ---------- + */ +void +AtEOSubXact_PgStat(bool isCommit, int nestDepth) +{ + PgStat_SubXactStatus *xact_state; + + /* merge the sub-transaction's transactional stats into the parent */ + xact_state = pgStatXactStack; + if (xact_state != NULL && + xact_state->nest_level >= nestDepth) + { + /* delink xact_state from stack immediately to simplify reuse case */ + pgStatXactStack = xact_state->prev; + + AtEOSubXact_PgStat_Relations(xact_state, isCommit, nestDepth); + + pfree(xact_state); + } +} + +/* + * AtPrepare_PgStat + * Save the transactional stats state at 2PC transaction prepare. + */ +void +AtPrepare_PgStat(void) +{ + PgStat_SubXactStatus *xact_state; + + xact_state = pgStatXactStack; + if (xact_state != NULL) + { + Assert(xact_state->nest_level == 1); + Assert(xact_state->prev == NULL); + + AtPrepare_PgStat_Relations(xact_state); + } +} + +/* + * PostPrepare_PgStat + * Clean up after successful PREPARE. + * + * Note: AtEOXact_PgStat is not called during PREPARE. + */ +void +PostPrepare_PgStat(void) +{ + PgStat_SubXactStatus *xact_state; + + /* + * We don't bother to free any of the transactional state, since it's all + * in TopTransactionContext and will go away anyway. + */ + xact_state = pgStatXactStack; + if (xact_state != NULL) + { + Assert(xact_state->nest_level == 1); + Assert(xact_state->prev == NULL); + + PostPrepare_PgStat_Relations(xact_state); + } + pgStatXactStack = NULL; + + /* Make sure any stats snapshot is thrown away */ + pgstat_clear_snapshot(); +} + +/* ---------- + * pgstat_clear_snapshot() - + * + * Discard any data collected in the current transaction. Any subsequent + * request will cause new snapshots to be read. + * + * This is also invoked during transaction commit or abort to discard + * the no-longer-wanted snapshot. + * ---------- + */ +void +pgstat_clear_snapshot(void) +{ + pgstat_assert_is_up(); + + /* Release memory, if any was allocated */ + if (pgStatLocalContext) + MemoryContextDelete(pgStatLocalContext); + + /* Reset variables */ + pgStatLocalContext = NULL; + pgStatDBHash = NULL; + replSlotStatHash = NULL; + subscriptionStatHash = NULL; + + /* + * Historically the backend_status.c facilities lived in this file, and + * were reset with the same function. For now keep it that way, and + * forward the reset request. + */ + pgstat_clear_backend_activity_snapshot(); +} + +/* + * Ensure (sub)transaction stack entry for the given nest_level exists, adding + * it if needed. + */ +PgStat_SubXactStatus * +pgstat_xact_stack_level_get(int nest_level) +{ + PgStat_SubXactStatus *xact_state; + + xact_state = pgStatXactStack; + if (xact_state == NULL || xact_state->nest_level != nest_level) + { + xact_state = (PgStat_SubXactStatus *) + MemoryContextAlloc(TopTransactionContext, + sizeof(PgStat_SubXactStatus)); + xact_state->nest_level = nest_level; + xact_state->prev = pgStatXactStack; + xact_state->first = NULL; + pgStatXactStack = xact_state; + } + return xact_state; +} + + +/* ------------------------------------------------------------ + * Public functions used by backends follow + * ------------------------------------------------------------ + */ /* ---------- * pgstat_report_stat() - @@ -974,7 +1201,6 @@ pgstat_vacuum_stat(void) } } - /* ---------- * pgstat_collect_oids() - * @@ -1140,130 +1366,6 @@ pgstat_send_inquiry(TimestampTz clock_time, TimestampTz cutoff_time, Oid databas pgstat_send(&msg, sizeof(msg)); } -/* - * Ensure (sub)transaction stack entry for the given nest_level exists, adding - * it if needed. - */ -PgStat_SubXactStatus * -pgstat_xact_stack_level_get(int nest_level) -{ - PgStat_SubXactStatus *xact_state; - - xact_state = pgStatXactStack; - if (xact_state == NULL || xact_state->nest_level != nest_level) - { - xact_state = (PgStat_SubXactStatus *) - MemoryContextAlloc(TopTransactionContext, - sizeof(PgStat_SubXactStatus)); - xact_state->nest_level = nest_level; - xact_state->prev = pgStatXactStack; - xact_state->first = NULL; - pgStatXactStack = xact_state; - } - return xact_state; -} - -/* ---------- - * AtEOXact_PgStat - * - * Called from access/transam/xact.c at top-level transaction commit/abort. - * ---------- - */ -void -AtEOXact_PgStat(bool isCommit, bool parallel) -{ - PgStat_SubXactStatus *xact_state; - - AtEOXact_PgStat_Database(isCommit, parallel); - - /* handle transactional stats information */ - xact_state = pgStatXactStack; - if (xact_state != NULL) - { - Assert(xact_state->nest_level == 1); - Assert(xact_state->prev == NULL); - - AtEOXact_PgStat_Relations(xact_state, isCommit); - } - pgStatXactStack = NULL; - - /* Make sure any stats snapshot is thrown away */ - pgstat_clear_snapshot(); -} - -/* ---------- - * AtEOSubXact_PgStat - * - * Called from access/transam/xact.c at subtransaction commit/abort. - * ---------- - */ -void -AtEOSubXact_PgStat(bool isCommit, int nestDepth) -{ - PgStat_SubXactStatus *xact_state; - - /* merge the sub-transaction's transactional stats into the parent */ - xact_state = pgStatXactStack; - if (xact_state != NULL && - xact_state->nest_level >= nestDepth) - { - /* delink xact_state from stack immediately to simplify reuse case */ - pgStatXactStack = xact_state->prev; - - AtEOSubXact_PgStat_Relations(xact_state, isCommit, nestDepth); - - pfree(xact_state); - } -} - -/* - * AtPrepare_PgStat - * Save the transactional stats state at 2PC transaction prepare. - */ -void -AtPrepare_PgStat(void) -{ - PgStat_SubXactStatus *xact_state; - - xact_state = pgStatXactStack; - if (xact_state != NULL) - { - Assert(xact_state->nest_level == 1); - Assert(xact_state->prev == NULL); - - AtPrepare_PgStat_Relations(xact_state); - } -} - -/* - * PostPrepare_PgStat - * Clean up after successful PREPARE. - * - * Note: AtEOXact_PgStat is not called during PREPARE. - */ -void -PostPrepare_PgStat(void) -{ - PgStat_SubXactStatus *xact_state; - - /* - * We don't bother to free any of the transactional state, since it's all - * in TopTransactionContext and will go away anyway. - */ - xact_state = pgStatXactStack; - if (xact_state != NULL) - { - Assert(xact_state->nest_level == 1); - Assert(xact_state->prev == NULL); - - PostPrepare_PgStat_Relations(xact_state); - } - pgStatXactStack = NULL; - - /* Make sure any stats snapshot is thrown away */ - pgstat_clear_snapshot(); -} - /* ---------- * pgstat_fetch_stat_dbentry() - * @@ -1282,15 +1384,30 @@ pgstat_fetch_stat_dbentry(Oid dbid) */ backend_read_statsfile(); - /* - * Lookup the requested database; return NULL if not found - */ - return (PgStat_StatDBEntry *) hash_search(pgStatDBHash, - (void *) &dbid, - HASH_FIND, NULL); + /* + * Lookup the requested database; return NULL if not found + */ + return (PgStat_StatDBEntry *) hash_search(pgStatDBHash, + (void *) &dbid, + HASH_FIND, NULL); +} + +/* + * --------- + * pgstat_fetch_global() - + * + * Support function for the SQL-callable pgstat* functions. Returns + * a pointer to the global statistics struct. + * --------- + */ +PgStat_GlobalStats * +pgstat_fetch_global(void) +{ + backend_read_statsfile(); + + return &globalStats; } - /* ---------- * pgstat_fetch_stat_tabentry() - * @@ -1425,22 +1542,6 @@ pgstat_fetch_stat_checkpointer(void) return &globalStats.checkpointer; } -/* - * --------- - * pgstat_fetch_global() - - * - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the global statistics struct. - * --------- - */ -PgStat_GlobalStats * -pgstat_fetch_global(void) -{ - backend_read_statsfile(); - - return &globalStats; -} - /* * --------- * pgstat_fetch_stat_wal() - @@ -1506,61 +1607,39 @@ pgstat_fetch_stat_subscription(Oid subid) return pgstat_get_subscription_entry(subid, false); } -/* - * Shut down a single backend's statistics reporting at process exit. - * - * Flush any remaining statistics counts out to the collector. - * Without this, operations triggered during backend exit (such as - * temp table deletions) won't be counted. - */ -static void -pgstat_shutdown_hook(int code, Datum arg) -{ - Assert(!pgstat_is_shutdown); - - /* - * If we got as far as discovering our own database ID, we can report what - * we did to the collector. Otherwise, we'd be sending an invalid - * database ID, so forget it. (This means that accesses to pg_database - * during failed backend starts might never get counted.) - */ - if (OidIsValid(MyDatabaseId)) - pgstat_report_stat(true); -#ifdef USE_ASSERT_CHECKING - pgstat_is_shutdown = true; -#endif -} +/* ------------------------------------------------------------ + * Helper / infrastructure functions + * ------------------------------------------------------------ + */ /* ---------- - * pgstat_initialize() - - * - * Initialize pgstats state, and set up our on-proc-exit hook. Called from - * BaseInit(). + * pgstat_setup_memcxt() - * - * NOTE: MyDatabaseId isn't set yet; so the shutdown hook has to be careful. + * Create pgStatLocalContext, if not already done. * ---------- */ -void -pgstat_initialize(void) +static void +pgstat_setup_memcxt(void) { - Assert(!pgstat_is_initialized); - - pgstat_wal_initialize(); - - /* Set up a process-exit hook to clean up */ - before_shmem_exit(pgstat_shutdown_hook, 0); - -#ifdef USE_ASSERT_CHECKING - pgstat_is_initialized = true; -#endif + if (!pgStatLocalContext) + pgStatLocalContext = AllocSetContextCreate(TopMemoryContext, + "Statistics snapshot", + ALLOCSET_SMALL_SIZES); } -/* ------------------------------------------------------------ - * Local support functions follow - * ------------------------------------------------------------ +/* + * Stats should only be reported after pgstat_initialize() and before + * pgstat_shutdown(). This check is put in a few central places to catch + * violations of this rule more easily. */ - +#ifdef USE_ASSERT_CHECKING +void +pgstat_assert_is_up(void) +{ + Assert(pgstat_is_initialized && !pgstat_is_shutdown); +} +#endif /* ---------- * pgstat_setheader() - @@ -2003,7 +2082,6 @@ pgstat_get_db_entry(Oid databaseid, bool create) return result; } - /* * Lookup the hash table entry for the specified table. If no hash * table entry exists, initialize it, if the create parameter is true. @@ -2053,6 +2131,151 @@ pgstat_get_tab_entry(PgStat_StatDBEntry *dbentry, Oid tableoid, bool create) return result; } +/* ---------- + * pgstat_replslot_entry + * + * Return the entry of replication slot stats with the given name. Return + * NULL if not found and the caller didn't request to create it. + * + * create tells whether to create the new slot entry if it is not found. + * ---------- + */ +static PgStat_StatReplSlotEntry * +pgstat_get_replslot_entry(NameData name, bool create) +{ + PgStat_StatReplSlotEntry *slotent; + bool found; + + if (replSlotStatHash == NULL) + { + HASHCTL hash_ctl; + + /* + * Quick return NULL if the hash table is empty and the caller didn't + * request to create the entry. + */ + if (!create) + return NULL; + + hash_ctl.keysize = sizeof(NameData); + hash_ctl.entrysize = sizeof(PgStat_StatReplSlotEntry); + replSlotStatHash = hash_create("Replication slots hash", + PGSTAT_REPLSLOT_HASH_SIZE, + &hash_ctl, + HASH_ELEM | HASH_BLOBS); + } + + slotent = (PgStat_StatReplSlotEntry *) hash_search(replSlotStatHash, + (void *) &name, + create ? HASH_ENTER : HASH_FIND, + &found); + + if (!slotent) + { + /* not found */ + Assert(!create && !found); + return NULL; + } + + /* initialize the entry */ + if (create && !found) + { + namestrcpy(&(slotent->slotname), NameStr(name)); + pgstat_reset_replslot(slotent, 0); + } + + return slotent; +} + +/* ---------- + * pgstat_reset_replslot + * + * Reset the given replication slot stats. + * ---------- + */ +static void +pgstat_reset_replslot(PgStat_StatReplSlotEntry *slotent, TimestampTz ts) +{ + /* reset only counters. Don't clear slot name */ + slotent->spill_txns = 0; + slotent->spill_count = 0; + slotent->spill_bytes = 0; + slotent->stream_txns = 0; + slotent->stream_count = 0; + slotent->stream_bytes = 0; + slotent->total_txns = 0; + slotent->total_bytes = 0; + slotent->stat_reset_timestamp = ts; +} + +/* ---------- + * pgstat_get_subscription_entry + * + * Return the subscription statistics entry with the given subscription OID. + * If no subscription entry exists, initialize it, if the create parameter is + * true. Else, return NULL. + * ---------- + */ +static PgStat_StatSubEntry * +pgstat_get_subscription_entry(Oid subid, bool create) +{ + PgStat_StatSubEntry *subentry; + bool found; + HASHACTION action = (create ? HASH_ENTER : HASH_FIND); + + if (subscriptionStatHash == NULL) + { + HASHCTL hash_ctl; + + /* + * Quick return NULL if the hash table is empty and the caller didn't + * request to create the entry. + */ + if (!create) + return NULL; + + hash_ctl.keysize = sizeof(Oid); + hash_ctl.entrysize = sizeof(PgStat_StatSubEntry); + subscriptionStatHash = hash_create("Subscription hash", + PGSTAT_SUBSCRIPTION_HASH_SIZE, + &hash_ctl, + HASH_ELEM | HASH_BLOBS); + } + + subentry = (PgStat_StatSubEntry *) hash_search(subscriptionStatHash, + (void *) &subid, + action, &found); + + if (!create && !found) + return NULL; + + /* If not found, initialize the new one */ + if (!found) + pgstat_reset_subscription(subentry, 0); + + return subentry; +} + +/* ---------- + * pgstat_reset_subscription + * + * Reset the given subscription stats. + * ---------- + */ +static void +pgstat_reset_subscription(PgStat_StatSubEntry *subentry, TimestampTz ts) +{ + subentry->apply_error_count = 0; + subentry->sync_error_count = 0; + subentry->stat_reset_timestamp = ts; +} + + +/* ------------------------------------------------------------ + * reading and writing of on-disk stats file + * ------------------------------------------------------------ + */ + /* ---------- * pgstat_write_statsfiles() - * Write the global statistics file, as well as requested DB files. @@ -3195,76 +3418,59 @@ backend_read_statsfile(void) * is sufficient. Regular backends want a deep read for just the tables * they can see (MyDatabaseId + shared catalogs). */ - if (IsAutoVacuumLauncherProcess()) - pgStatDBHash = pgstat_read_statsfiles(InvalidOid, false, false); - else - pgStatDBHash = pgstat_read_statsfiles(MyDatabaseId, false, true); -} - - -/* ---------- - * pgstat_setup_memcxt() - - * - * Create pgStatLocalContext, if not already done. - * ---------- - */ -static void -pgstat_setup_memcxt(void) -{ - if (!pgStatLocalContext) - pgStatLocalContext = AllocSetContextCreate(TopMemoryContext, - "Statistics snapshot", - ALLOCSET_SMALL_SIZES); + if (IsAutoVacuumLauncherProcess()) + pgStatDBHash = pgstat_read_statsfiles(InvalidOid, false, false); + else + pgStatDBHash = pgstat_read_statsfiles(MyDatabaseId, false, true); } -/* - * Stats should only be reported after pgstat_initialize() and before - * pgstat_shutdown(). This check is put in a few central places to catch - * violations of this rule more easily. +/* ---------- + * pgstat_write_statsfile_needed() - + * + * Do we need to write out any stats files? + * ---------- */ -#ifdef USE_ASSERT_CHECKING -void -pgstat_assert_is_up(void) +static bool +pgstat_write_statsfile_needed(void) { - Assert(pgstat_is_initialized && !pgstat_is_shutdown); -} -#endif + if (pending_write_requests != NIL) + return true; + /* Everything was written recently */ + return false; +} /* ---------- - * pgstat_clear_snapshot() - - * - * Discard any data collected in the current transaction. Any subsequent - * request will cause new snapshots to be read. + * pgstat_db_requested() - * - * This is also invoked during transaction commit or abort to discard - * the no-longer-wanted snapshot. + * Checks whether stats for a particular DB need to be written to a file. * ---------- */ -void -pgstat_clear_snapshot(void) +static bool +pgstat_db_requested(Oid databaseid) { - pgstat_assert_is_up(); - - /* Release memory, if any was allocated */ - if (pgStatLocalContext) - MemoryContextDelete(pgStatLocalContext); - - /* Reset variables */ - pgStatLocalContext = NULL; - pgStatDBHash = NULL; - replSlotStatHash = NULL; - subscriptionStatHash = NULL; - /* - * Historically the backend_status.c facilities lived in this file, and - * were reset with the same function. For now keep it that way, and - * forward the reset request. + * If any requests are outstanding at all, we should write the stats for + * shared catalogs (the "database" with OID 0). This ensures that + * backends will see up-to-date stats for shared catalogs, even though + * they send inquiry messages mentioning only their own DB. */ - pgstat_clear_backend_activity_snapshot(); + if (databaseid == InvalidOid && pending_write_requests != NIL) + return true; + + /* Search to see if there's an open request to write this database. */ + if (list_member_oid(pending_write_requests, databaseid)) + return true; + + return false; } +/* ------------------------------------------------------------ + * stats collector message processing functions + * ------------------------------------------------------------ + */ + /* ---------- * pgstat_recv_inquiry() - * @@ -3357,7 +3563,6 @@ pgstat_recv_inquiry(PgStat_MsgInquiry *msg, int len) msg->databaseid); } - /* ---------- * pgstat_recv_tabstat() - * @@ -3475,7 +3680,6 @@ pgstat_recv_tabstat(PgStat_MsgTabstat *msg, int len) } } - /* ---------- * pgstat_recv_tabpurge() - * @@ -3508,7 +3712,6 @@ pgstat_recv_tabpurge(PgStat_MsgTabpurge *msg, int len) } } - /* ---------- * pgstat_recv_dropdb() - * @@ -3551,7 +3754,6 @@ pgstat_recv_dropdb(PgStat_MsgDropdb *msg, int len) } } - /* ---------- * pgstat_recv_resetcounter() - * @@ -3772,7 +3974,6 @@ pgstat_recv_resetsubcounter(PgStat_MsgResetsubcounter *msg, int len) } } - /* ---------- * pgstat_recv_autovac() - * @@ -3880,7 +4081,6 @@ pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len) } } - /* ---------- * pgstat_recv_archiver() - * @@ -4282,183 +4482,3 @@ pgstat_recv_subscription_error(PgStat_MsgSubscriptionError *msg, int len) else subentry->sync_error_count++; } - -/* ---------- - * pgstat_write_statsfile_needed() - - * - * Do we need to write out any stats files? - * ---------- - */ -static bool -pgstat_write_statsfile_needed(void) -{ - if (pending_write_requests != NIL) - return true; - - /* Everything was written recently */ - return false; -} - -/* ---------- - * pgstat_db_requested() - - * - * Checks whether stats for a particular DB need to be written to a file. - * ---------- - */ -static bool -pgstat_db_requested(Oid databaseid) -{ - /* - * If any requests are outstanding at all, we should write the stats for - * shared catalogs (the "database" with OID 0). This ensures that - * backends will see up-to-date stats for shared catalogs, even though - * they send inquiry messages mentioning only their own DB. - */ - if (databaseid == InvalidOid && pending_write_requests != NIL) - return true; - - /* Search to see if there's an open request to write this database. */ - if (list_member_oid(pending_write_requests, databaseid)) - return true; - - return false; -} - -/* ---------- - * pgstat_replslot_entry - * - * Return the entry of replication slot stats with the given name. Return - * NULL if not found and the caller didn't request to create it. - * - * create tells whether to create the new slot entry if it is not found. - * ---------- - */ -static PgStat_StatReplSlotEntry * -pgstat_get_replslot_entry(NameData name, bool create) -{ - PgStat_StatReplSlotEntry *slotent; - bool found; - - if (replSlotStatHash == NULL) - { - HASHCTL hash_ctl; - - /* - * Quick return NULL if the hash table is empty and the caller didn't - * request to create the entry. - */ - if (!create) - return NULL; - - hash_ctl.keysize = sizeof(NameData); - hash_ctl.entrysize = sizeof(PgStat_StatReplSlotEntry); - replSlotStatHash = hash_create("Replication slots hash", - PGSTAT_REPLSLOT_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS); - } - - slotent = (PgStat_StatReplSlotEntry *) hash_search(replSlotStatHash, - (void *) &name, - create ? HASH_ENTER : HASH_FIND, - &found); - - if (!slotent) - { - /* not found */ - Assert(!create && !found); - return NULL; - } - - /* initialize the entry */ - if (create && !found) - { - namestrcpy(&(slotent->slotname), NameStr(name)); - pgstat_reset_replslot(slotent, 0); - } - - return slotent; -} - -/* ---------- - * pgstat_reset_replslot - * - * Reset the given replication slot stats. - * ---------- - */ -static void -pgstat_reset_replslot(PgStat_StatReplSlotEntry *slotent, TimestampTz ts) -{ - /* reset only counters. Don't clear slot name */ - slotent->spill_txns = 0; - slotent->spill_count = 0; - slotent->spill_bytes = 0; - slotent->stream_txns = 0; - slotent->stream_count = 0; - slotent->stream_bytes = 0; - slotent->total_txns = 0; - slotent->total_bytes = 0; - slotent->stat_reset_timestamp = ts; -} - -/* ---------- - * pgstat_get_subscription_entry - * - * Return the subscription statistics entry with the given subscription OID. - * If no subscription entry exists, initialize it, if the create parameter is - * true. Else, return NULL. - * ---------- - */ -static PgStat_StatSubEntry * -pgstat_get_subscription_entry(Oid subid, bool create) -{ - PgStat_StatSubEntry *subentry; - bool found; - HASHACTION action = (create ? HASH_ENTER : HASH_FIND); - - if (subscriptionStatHash == NULL) - { - HASHCTL hash_ctl; - - /* - * Quick return NULL if the hash table is empty and the caller didn't - * request to create the entry. - */ - if (!create) - return NULL; - - hash_ctl.keysize = sizeof(Oid); - hash_ctl.entrysize = sizeof(PgStat_StatSubEntry); - subscriptionStatHash = hash_create("Subscription hash", - PGSTAT_SUBSCRIPTION_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS); - } - - subentry = (PgStat_StatSubEntry *) hash_search(subscriptionStatHash, - (void *) &subid, - action, &found); - - if (!create && !found) - return NULL; - - /* If not found, initialize the new one */ - if (!found) - pgstat_reset_subscription(subentry, 0); - - return subentry; -} - -/* ---------- - * pgstat_reset_subscription - * - * Reset the given subscription stats. - * ---------- - */ -static void -pgstat_reset_subscription(PgStat_StatSubEntry *subentry, TimestampTz ts) -{ - subentry->apply_error_count = 0; - subentry->sync_error_count = 0; - subentry->stat_reset_timestamp = ts; -} diff --git a/src/include/pgstat.h b/src/include/pgstat.h index cfb00ba65a..534d595ca0 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -33,6 +33,7 @@ /* Default directory to store temporary statistics data in */ #define PG_STAT_TMP_DIR "pg_stat_tmp" + /* Values for track_functions GUC variable --- order is significant! */ typedef enum TrackFunctionsLevel { @@ -52,48 +53,74 @@ typedef enum SessionEndType } SessionEndType; /* ---------- - * The types of backend -> collector messages + * The data type used for counters. * ---------- */ -typedef enum StatMsgType +typedef int64 PgStat_Counter; + +/* Possible targets for resetting cluster-wide shared values */ +typedef enum PgStat_Shared_Reset_Target { - PGSTAT_MTYPE_DUMMY, - PGSTAT_MTYPE_INQUIRY, - PGSTAT_MTYPE_TABSTAT, - PGSTAT_MTYPE_TABPURGE, - PGSTAT_MTYPE_DROPDB, - PGSTAT_MTYPE_RESETCOUNTER, - PGSTAT_MTYPE_RESETSHAREDCOUNTER, - PGSTAT_MTYPE_RESETSINGLECOUNTER, - PGSTAT_MTYPE_RESETSLRUCOUNTER, - PGSTAT_MTYPE_RESETREPLSLOTCOUNTER, - PGSTAT_MTYPE_RESETSUBCOUNTER, - PGSTAT_MTYPE_AUTOVAC_START, - PGSTAT_MTYPE_VACUUM, - PGSTAT_MTYPE_ANALYZE, - PGSTAT_MTYPE_ARCHIVER, - PGSTAT_MTYPE_BGWRITER, - PGSTAT_MTYPE_CHECKPOINTER, - PGSTAT_MTYPE_WAL, - PGSTAT_MTYPE_SLRU, - PGSTAT_MTYPE_FUNCSTAT, - PGSTAT_MTYPE_FUNCPURGE, - PGSTAT_MTYPE_RECOVERYCONFLICT, - PGSTAT_MTYPE_TEMPFILE, - PGSTAT_MTYPE_DEADLOCK, - PGSTAT_MTYPE_CHECKSUMFAILURE, - PGSTAT_MTYPE_REPLSLOT, - PGSTAT_MTYPE_CONNECT, - PGSTAT_MTYPE_DISCONNECT, - PGSTAT_MTYPE_SUBSCRIPTIONDROP, - PGSTAT_MTYPE_SUBSCRIPTIONERROR, -} StatMsgType; + RESET_ARCHIVER, + RESET_BGWRITER, + RESET_WAL +} PgStat_Shared_Reset_Target; + +/* Possible object types for resetting single counters */ +typedef enum PgStat_Single_Reset_Type +{ + RESET_TABLE, + RESET_FUNCTION +} PgStat_Single_Reset_Type; + + +/* ------------------------------------------------------------ + * Structures kept in backend local memory while accumulating counts + * ------------------------------------------------------------ + */ /* ---------- - * The data type used for counters. + * PgStat_FunctionCounts The actual per-function counts kept by a backend + * + * This struct should contain only actual event counters, because we memcmp + * it against zeroes to detect whether there are any counts to transmit. + * + * Note that the time counters are in instr_time format here. We convert to + * microseconds in PgStat_Counter format when transmitting to the collector. * ---------- */ -typedef int64 PgStat_Counter; +typedef struct PgStat_FunctionCounts +{ + PgStat_Counter f_numcalls; + instr_time f_total_time; + instr_time f_self_time; +} PgStat_FunctionCounts; + +/* ---------- + * PgStat_BackendFunctionEntry Entry in backend's per-function hash table + * ---------- + */ +typedef struct PgStat_BackendFunctionEntry +{ + Oid f_id; + PgStat_FunctionCounts f_counts; +} PgStat_BackendFunctionEntry; + +/* + * Working state needed to accumulate per-function-call timing statistics. + */ +typedef struct PgStat_FunctionCallUsage +{ + /* Link to function's hashtable entry (must still be there at exit!) */ + /* NULL means we are not tracking the current function call */ + PgStat_FunctionCounts *fs; + /* Total time previously charged to function, as of function start */ + instr_time save_f_total_time; + /* Backend-wide total time as of function start */ + instr_time save_total; + /* system clock as of function start */ + instr_time f_start; +} PgStat_FunctionCallUsage; /* ---------- * PgStat_TableCounts The actual per-table counts kept by a backend @@ -137,27 +164,6 @@ typedef struct PgStat_TableCounts PgStat_Counter t_blocks_hit; } PgStat_TableCounts; -/* Possible targets for resetting cluster-wide shared values */ -typedef enum PgStat_Shared_Reset_Target -{ - RESET_ARCHIVER, - RESET_BGWRITER, - RESET_WAL -} PgStat_Shared_Reset_Target; - -/* Possible object types for resetting single counters */ -typedef enum PgStat_Single_Reset_Type -{ - RESET_TABLE, - RESET_FUNCTION -} PgStat_Single_Reset_Type; - -/* ------------------------------------------------------------ - * Structures kept in backend local memory while accumulating counts - * ------------------------------------------------------------ - */ - - /* ---------- * PgStat_TableStatus Per-table status within a backend * @@ -210,6 +216,43 @@ typedef struct PgStat_TableXactStatus * ------------------------------------------------------------ */ +/* ---------- + * The types of backend -> collector messages + * ---------- + */ +typedef enum StatMsgType +{ + PGSTAT_MTYPE_DUMMY, + PGSTAT_MTYPE_INQUIRY, + PGSTAT_MTYPE_TABSTAT, + PGSTAT_MTYPE_TABPURGE, + PGSTAT_MTYPE_DROPDB, + PGSTAT_MTYPE_RESETCOUNTER, + PGSTAT_MTYPE_RESETSHAREDCOUNTER, + PGSTAT_MTYPE_RESETSINGLECOUNTER, + PGSTAT_MTYPE_RESETSLRUCOUNTER, + PGSTAT_MTYPE_RESETREPLSLOTCOUNTER, + PGSTAT_MTYPE_RESETSUBCOUNTER, + PGSTAT_MTYPE_AUTOVAC_START, + PGSTAT_MTYPE_VACUUM, + PGSTAT_MTYPE_ANALYZE, + PGSTAT_MTYPE_ARCHIVER, + PGSTAT_MTYPE_BGWRITER, + PGSTAT_MTYPE_CHECKPOINTER, + PGSTAT_MTYPE_WAL, + PGSTAT_MTYPE_SLRU, + PGSTAT_MTYPE_FUNCSTAT, + PGSTAT_MTYPE_FUNCPURGE, + PGSTAT_MTYPE_RECOVERYCONFLICT, + PGSTAT_MTYPE_TEMPFILE, + PGSTAT_MTYPE_DEADLOCK, + PGSTAT_MTYPE_CHECKSUMFAILURE, + PGSTAT_MTYPE_REPLSLOT, + PGSTAT_MTYPE_CONNECT, + PGSTAT_MTYPE_DISCONNECT, + PGSTAT_MTYPE_SUBSCRIPTIONDROP, + PGSTAT_MTYPE_SUBSCRIPTIONERROR, +} StatMsgType; /* ---------- * PgStat_MsgHdr The common message header @@ -241,7 +284,6 @@ typedef struct PgStat_MsgDummy PgStat_MsgHdr m_hdr; } PgStat_MsgDummy; - /* ---------- * PgStat_MsgInquiry Sent by a backend to ask the collector * to write the stats file(s). @@ -260,7 +302,6 @@ typedef struct PgStat_MsgDummy * effect unless that occurs. We assume clock_time >= cutoff_time, though. * ---------- */ - typedef struct PgStat_MsgInquiry { PgStat_MsgHdr m_hdr; @@ -269,7 +310,6 @@ typedef struct PgStat_MsgInquiry Oid databaseid; /* requested DB (InvalidOid => shared only) */ } PgStat_MsgInquiry; - /* ---------- * PgStat_TableEntry Per-table info in a MsgTabstat * ---------- @@ -304,7 +344,6 @@ typedef struct PgStat_MsgTabstat PgStat_TableEntry m_entry[PGSTAT_NUM_TABENTRIES]; } PgStat_MsgTabstat; - /* ---------- * PgStat_MsgTabpurge Sent by the backend to tell the collector * about dead tables. @@ -322,7 +361,6 @@ typedef struct PgStat_MsgTabpurge Oid m_tableid[PGSTAT_NUM_TABPURGE]; } PgStat_MsgTabpurge; - /* ---------- * PgStat_MsgDropdb Sent by the backend to tell the collector * about a dropped database @@ -334,7 +372,6 @@ typedef struct PgStat_MsgDropdb Oid m_databaseid; } PgStat_MsgDropdb; - /* ---------- * PgStat_MsgResetcounter Sent by the backend to tell the collector * to reset counters @@ -405,7 +442,6 @@ typedef struct PgStat_MsgResetsubcounter * stats */ } PgStat_MsgResetsubcounter; - /* ---------- * PgStat_MsgAutovacStart Sent by the autovacuum daemon to signal * that a database is going to be processed @@ -418,7 +454,6 @@ typedef struct PgStat_MsgAutovacStart TimestampTz m_start_time; } PgStat_MsgAutovacStart; - /* ---------- * PgStat_MsgVacuum Sent by the backend or autovacuum daemon * after VACUUM @@ -435,7 +470,6 @@ typedef struct PgStat_MsgVacuum PgStat_Counter m_dead_tuples; } PgStat_MsgVacuum; - /* ---------- * PgStat_MsgAnalyze Sent by the backend or autovacuum daemon * after ANALYZE @@ -453,7 +487,6 @@ typedef struct PgStat_MsgAnalyze PgStat_Counter m_dead_tuples; } PgStat_MsgAnalyze; - /* ---------- * PgStat_MsgArchiver Sent by the archiver to update statistics. * ---------- @@ -601,33 +634,6 @@ typedef struct PgStat_MsgTempFile size_t m_filesize; } PgStat_MsgTempFile; -/* ---------- - * PgStat_FunctionCounts The actual per-function counts kept by a backend - * - * This struct should contain only actual event counters, because we memcmp - * it against zeroes to detect whether there are any counts to transmit. - * - * Note that the time counters are in instr_time format here. We convert to - * microseconds in PgStat_Counter format when transmitting to the collector. - * ---------- - */ -typedef struct PgStat_FunctionCounts -{ - PgStat_Counter f_numcalls; - instr_time f_total_time; - instr_time f_self_time; -} PgStat_FunctionCounts; - -/* ---------- - * PgStat_BackendFunctionEntry Entry in backend's per-function hash table - * ---------- - */ -typedef struct PgStat_BackendFunctionEntry -{ - Oid f_id; - PgStat_FunctionCounts f_counts; -} PgStat_BackendFunctionEntry; - /* ---------- * PgStat_FunctionEntry Per-function info in a MsgFuncstat * ---------- @@ -770,6 +776,48 @@ typedef union PgStat_Msg #define PGSTAT_FILE_FORMAT_ID 0x01A5BCA6 +/* + * Archiver statistics kept in the stats collector + */ +typedef struct PgStat_ArchiverStats +{ + PgStat_Counter archived_count; /* archival successes */ + char last_archived_wal[MAX_XFN_CHARS + 1]; /* last WAL file + * archived */ + TimestampTz last_archived_timestamp; /* last archival success time */ + PgStat_Counter failed_count; /* failed archival attempts */ + char last_failed_wal[MAX_XFN_CHARS + 1]; /* WAL file involved in + * last failure */ + TimestampTz last_failed_timestamp; /* last archival failure time */ + TimestampTz stat_reset_timestamp; +} PgStat_ArchiverStats; + +/* + * Background writer statistics kept in the stats collector + */ +typedef struct PgStat_BgWriterStats +{ + PgStat_Counter buf_written_clean; + PgStat_Counter maxwritten_clean; + PgStat_Counter buf_alloc; + TimestampTz stat_reset_timestamp; +} PgStat_BgWriterStats; + +/* + * Checkpointer statistics kept in the stats collector + */ +typedef struct PgStat_CheckpointerStats +{ + TimestampTz stats_timestamp; /* time of stats file update */ + PgStat_Counter timed_checkpoints; + PgStat_Counter requested_checkpoints; + PgStat_Counter checkpoint_write_time; /* times in milliseconds */ + PgStat_Counter checkpoint_sync_time; + PgStat_Counter buf_written_checkpoints; + PgStat_Counter buf_written_backend; + PgStat_Counter buf_fsync_backend; +} PgStat_CheckpointerStats; + /* ---------- * PgStat_StatDBEntry The collector's data per database * ---------- @@ -818,100 +866,19 @@ typedef struct PgStat_StatDBEntry HTAB *functions; } PgStat_StatDBEntry; - /* ---------- - * PgStat_StatTabEntry The collector's data per table (or index) + * PgStat_StatFuncEntry The collector's data per function * ---------- */ -typedef struct PgStat_StatTabEntry +typedef struct PgStat_StatFuncEntry { - Oid tableid; - - PgStat_Counter numscans; + Oid functionid; - PgStat_Counter tuples_returned; - PgStat_Counter tuples_fetched; + PgStat_Counter f_numcalls; - PgStat_Counter tuples_inserted; - PgStat_Counter tuples_updated; - PgStat_Counter tuples_deleted; - PgStat_Counter tuples_hot_updated; - - PgStat_Counter n_live_tuples; - PgStat_Counter n_dead_tuples; - PgStat_Counter changes_since_analyze; - PgStat_Counter inserts_since_vacuum; - - PgStat_Counter blocks_fetched; - PgStat_Counter blocks_hit; - - TimestampTz vacuum_timestamp; /* user initiated vacuum */ - PgStat_Counter vacuum_count; - TimestampTz autovac_vacuum_timestamp; /* autovacuum initiated */ - PgStat_Counter autovac_vacuum_count; - TimestampTz analyze_timestamp; /* user initiated */ - PgStat_Counter analyze_count; - TimestampTz autovac_analyze_timestamp; /* autovacuum initiated */ - PgStat_Counter autovac_analyze_count; -} PgStat_StatTabEntry; - - -/* ---------- - * PgStat_StatFuncEntry The collector's data per function - * ---------- - */ -typedef struct PgStat_StatFuncEntry -{ - Oid functionid; - - PgStat_Counter f_numcalls; - - PgStat_Counter f_total_time; /* times in microseconds */ - PgStat_Counter f_self_time; -} PgStat_StatFuncEntry; - - -/* - * Archiver statistics kept in the stats collector - */ -typedef struct PgStat_ArchiverStats -{ - PgStat_Counter archived_count; /* archival successes */ - char last_archived_wal[MAX_XFN_CHARS + 1]; /* last WAL file - * archived */ - TimestampTz last_archived_timestamp; /* last archival success time */ - PgStat_Counter failed_count; /* failed archival attempts */ - char last_failed_wal[MAX_XFN_CHARS + 1]; /* WAL file involved in - * last failure */ - TimestampTz last_failed_timestamp; /* last archival failure time */ - TimestampTz stat_reset_timestamp; -} PgStat_ArchiverStats; - -/* - * Background writer statistics kept in the stats collector - */ -typedef struct PgStat_BgWriterStats -{ - PgStat_Counter buf_written_clean; - PgStat_Counter maxwritten_clean; - PgStat_Counter buf_alloc; - TimestampTz stat_reset_timestamp; -} PgStat_BgWriterStats; - -/* - * Checkpointer statistics kept in the stats collector - */ -typedef struct PgStat_CheckpointerStats -{ - TimestampTz stats_timestamp; /* time of stats file update */ - PgStat_Counter timed_checkpoints; - PgStat_Counter requested_checkpoints; - PgStat_Counter checkpoint_write_time; /* times in milliseconds */ - PgStat_Counter checkpoint_sync_time; - PgStat_Counter buf_written_checkpoints; - PgStat_Counter buf_written_backend; - PgStat_Counter buf_fsync_backend; -} PgStat_CheckpointerStats; + PgStat_Counter f_total_time; /* times in microseconds */ + PgStat_Counter f_self_time; +} PgStat_StatFuncEntry; /* * Global statistics kept in the stats collector @@ -925,20 +892,21 @@ typedef struct PgStat_GlobalStats } PgStat_GlobalStats; /* - * WAL statistics kept in the stats collector + * Replication slot statistics kept in the stats collector */ -typedef struct PgStat_WalStats +typedef struct PgStat_StatReplSlotEntry { - PgStat_Counter wal_records; - PgStat_Counter wal_fpi; - uint64 wal_bytes; - PgStat_Counter wal_buffers_full; - PgStat_Counter wal_write; - PgStat_Counter wal_sync; - PgStat_Counter wal_write_time; - PgStat_Counter wal_sync_time; + NameData slotname; + PgStat_Counter spill_txns; + PgStat_Counter spill_count; + PgStat_Counter spill_bytes; + PgStat_Counter stream_txns; + PgStat_Counter stream_count; + PgStat_Counter stream_bytes; + PgStat_Counter total_txns; + PgStat_Counter total_bytes; TimestampTz stat_reset_timestamp; -} PgStat_WalStats; +} PgStat_StatReplSlotEntry; /* * SLRU statistics kept in the stats collector @@ -955,23 +923,6 @@ typedef struct PgStat_SLRUStats TimestampTz stat_reset_timestamp; } PgStat_SLRUStats; -/* - * Replication slot statistics kept in the stats collector - */ -typedef struct PgStat_StatReplSlotEntry -{ - NameData slotname; - PgStat_Counter spill_txns; - PgStat_Counter spill_count; - PgStat_Counter spill_bytes; - PgStat_Counter stream_txns; - PgStat_Counter stream_count; - PgStat_Counter stream_bytes; - PgStat_Counter total_txns; - PgStat_Counter total_bytes; - TimestampTz stat_reset_timestamp; -} PgStat_StatReplSlotEntry; - /* * Subscription statistics kept in the stats collector. */ @@ -984,126 +935,174 @@ typedef struct PgStat_StatSubEntry TimestampTz stat_reset_timestamp; } PgStat_StatSubEntry; -/* - * Working state needed to accumulate per-function-call timing statistics. +/* ---------- + * PgStat_StatTabEntry The collector's data per table (or index) + * ---------- */ -typedef struct PgStat_FunctionCallUsage +typedef struct PgStat_StatTabEntry { - /* Link to function's hashtable entry (must still be there at exit!) */ - /* NULL means we are not tracking the current function call */ - PgStat_FunctionCounts *fs; - /* Total time previously charged to function, as of function start */ - instr_time save_f_total_time; - /* Backend-wide total time as of function start */ - instr_time save_total; - /* system clock as of function start */ - instr_time f_start; -} PgStat_FunctionCallUsage; + Oid tableid; + PgStat_Counter numscans; -/* ---------- - * GUC parameters - * ---------- - */ -extern PGDLLIMPORT bool pgstat_track_counts; -extern PGDLLIMPORT int pgstat_track_functions; -extern char *pgstat_stat_directory; -extern char *pgstat_stat_tmpname; -extern char *pgstat_stat_filename; + PgStat_Counter tuples_returned; + PgStat_Counter tuples_fetched; -/* - * BgWriter statistics counters are updated directly by bgwriter and bufmgr - */ -extern PgStat_MsgBgWriter PendingBgWriterStats; + PgStat_Counter tuples_inserted; + PgStat_Counter tuples_updated; + PgStat_Counter tuples_deleted; + PgStat_Counter tuples_hot_updated; -/* - * Checkpointer statistics counters are updated directly by checkpointer and - * bufmgr. - */ -extern PgStat_MsgCheckpointer PendingCheckpointerStats; + PgStat_Counter n_live_tuples; + PgStat_Counter n_dead_tuples; + PgStat_Counter changes_since_analyze; + PgStat_Counter inserts_since_vacuum; -/* - * WAL statistics counter is updated by backends and background processes - */ -extern PgStat_MsgWal WalStats; + PgStat_Counter blocks_fetched; + PgStat_Counter blocks_hit; -/* - * Updated by pgstat_count_buffer_*_time macros - */ -extern PgStat_Counter pgStatBlockReadTime; -extern PgStat_Counter pgStatBlockWriteTime; + TimestampTz vacuum_timestamp; /* user initiated vacuum */ + PgStat_Counter vacuum_count; + TimestampTz autovac_vacuum_timestamp; /* autovacuum initiated */ + PgStat_Counter autovac_vacuum_count; + TimestampTz analyze_timestamp; /* user initiated */ + PgStat_Counter analyze_count; + TimestampTz autovac_analyze_timestamp; /* autovacuum initiated */ + PgStat_Counter autovac_analyze_count; +} PgStat_StatTabEntry; /* - * Updated by pgstat_count_conn_*_time macros, called by - * pgstat_report_activity(). + * WAL statistics kept in the stats collector */ -extern PgStat_Counter pgStatActiveTime; -extern PgStat_Counter pgStatTransactionIdleTime; +typedef struct PgStat_WalStats +{ + PgStat_Counter wal_records; + PgStat_Counter wal_fpi; + uint64 wal_bytes; + PgStat_Counter wal_buffers_full; + PgStat_Counter wal_write; + PgStat_Counter wal_sync; + PgStat_Counter wal_write_time; + PgStat_Counter wal_sync_time; + TimestampTz stat_reset_timestamp; +} PgStat_WalStats; /* - * Updated by the traffic cop and in errfinish() + * Functions in pgstat.c */ -extern SessionEndType pgStatSessionEndCause; -/* ---------- - * Functions called from postmaster - * ---------- - */ +/* functions called from postmaster */ extern void pgstat_init(void); -extern int pgstat_start(void); extern void pgstat_reset_all(void); +extern int pgstat_start(void); extern void allow_immediate_pgstat_restart(void); #ifdef EXEC_BACKEND extern void PgstatCollectorMain(int argc, char *argv[]) pg_attribute_noreturn(); #endif +/* Functions for backend initialization */ +extern void pgstat_initialize(void); -/* ---------- - * Functions called from backends - * ---------- - */ -extern void pgstat_ping(void); +/* transactional integration */ +extern void AtEOXact_PgStat(bool isCommit, bool parallel); +extern void AtEOSubXact_PgStat(bool isCommit, int nestDepth); +extern void AtPrepare_PgStat(void); +extern void PostPrepare_PgStat(void); +extern void pgstat_clear_snapshot(void); +/* Functions called from backends */ extern void pgstat_report_stat(bool force); extern void pgstat_vacuum_stat(void); -extern void pgstat_drop_database(Oid databaseid); +extern void pgstat_ping(void); -extern void pgstat_clear_snapshot(void); extern void pgstat_reset_counters(void); -extern void pgstat_reset_shared_counters(const char *); extern void pgstat_reset_single_counter(Oid objectid, PgStat_Single_Reset_Type type); -extern void pgstat_reset_slru_counter(const char *); -extern void pgstat_reset_replslot_counter(const char *name); -extern void pgstat_reset_subscription_counter(Oid subid); +extern void pgstat_reset_shared_counters(const char *); -extern void pgstat_report_connect(Oid dboid); -extern void pgstat_report_autovac(Oid dboid); -extern void pgstat_report_vacuum(Oid tableoid, bool shared, - PgStat_Counter livetuples, PgStat_Counter deadtuples); -extern void pgstat_report_analyze(Relation rel, - PgStat_Counter livetuples, PgStat_Counter deadtuples, - bool resetcounter); +/* stats accessors */ +extern PgStat_ArchiverStats *pgstat_fetch_stat_archiver(void); +extern PgStat_BgWriterStats *pgstat_fetch_stat_bgwriter(void); +extern PgStat_CheckpointerStats *pgstat_fetch_stat_checkpointer(void); +extern PgStat_StatDBEntry *pgstat_fetch_stat_dbentry(Oid dbid); +extern PgStat_StatFuncEntry *pgstat_fetch_stat_funcentry(Oid funcid); +extern PgStat_GlobalStats *pgstat_fetch_global(void); +extern PgStat_StatReplSlotEntry *pgstat_fetch_replslot(NameData slotname); +extern PgStat_StatSubEntry *pgstat_fetch_stat_subscription(Oid subid); +extern PgStat_SLRUStats *pgstat_fetch_slru(void); +extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry(Oid relid); +extern PgStat_WalStats *pgstat_fetch_stat_wal(void); + + +/* + * Functions in pgstat_archiver.c + */ + +extern void pgstat_send_archiver(const char *xlog, bool failed); + + +/* + * Functions in pgstat_bgwriter.c + */ + +extern void pgstat_send_bgwriter(void); + + +/* + * Functions in pgstat_checkpointer.c + */ + +extern void pgstat_send_checkpointer(void); + + +/* + * Functions in pgstat_database.c + */ +extern void pgstat_drop_database(Oid databaseid); extern void pgstat_report_recovery_conflict(int reason); extern void pgstat_report_deadlock(void); extern void pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount); extern void pgstat_report_checksum_failure(void); -extern void pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat); -extern void pgstat_report_replslot_create(const char *slotname); -extern void pgstat_report_replslot_drop(const char *slotname); -extern void pgstat_report_subscription_error(Oid subid, bool is_apply_error); -extern void pgstat_report_subscription_drop(Oid subid); +extern void pgstat_report_connect(Oid dboid); -extern void pgstat_initialize(void); +#define pgstat_count_buffer_read_time(n) \ + (pgStatBlockReadTime += (n)) +#define pgstat_count_buffer_write_time(n) \ + (pgStatBlockWriteTime += (n)) +#define pgstat_count_conn_active_time(n) \ + (pgStatActiveTime += (n)) +#define pgstat_count_conn_txn_idle_time(n) \ + (pgStatTransactionIdleTime += (n)) -extern PgStat_TableStatus *find_tabstat_entry(Oid rel_id); +/* + * Functions in pgstat_function.c + */ + +struct FunctionCallInfoBaseData; +extern void pgstat_init_function_usage(struct FunctionCallInfoBaseData *fcinfo, + PgStat_FunctionCallUsage *fcu); +extern void pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, + bool finalize); + extern PgStat_BackendFunctionEntry *find_funcstat_entry(Oid func_id); + +/* + * Functions in pgstat_relation.c + */ + extern void pgstat_relation_init(Relation rel); +extern void pgstat_report_autovac(Oid dboid); +extern void pgstat_report_vacuum(Oid tableoid, bool shared, + PgStat_Counter livetuples, PgStat_Counter deadtuples); +extern void pgstat_report_analyze(Relation rel, + PgStat_Counter livetuples, PgStat_Counter deadtuples, + bool resetcounter); + #define pgstat_relation_should_count(rel) \ (likely((rel)->pgstat_info != NULL)) @@ -1144,14 +1143,6 @@ extern void pgstat_relation_init(Relation rel); if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_blocks_hit++; \ } while (0) -#define pgstat_count_buffer_read_time(n) \ - (pgStatBlockReadTime += (n)) -#define pgstat_count_buffer_write_time(n) \ - (pgStatBlockWriteTime += (n)) -#define pgstat_count_conn_active_time(n) \ - (pgStatActiveTime += (n)) -#define pgstat_count_conn_txn_idle_time(n) \ - (pgStatTransactionIdleTime += (n)) extern void pgstat_count_heap_insert(Relation rel, PgStat_Counter n); extern void pgstat_count_heap_update(Relation rel, bool hot); @@ -1159,45 +1150,29 @@ extern void pgstat_count_heap_delete(Relation rel); extern void pgstat_count_truncate(Relation rel); extern void pgstat_update_heap_dead_tuples(Relation rel, int delta); -struct FunctionCallInfoBaseData; -extern void pgstat_init_function_usage(struct FunctionCallInfoBaseData *fcinfo, - PgStat_FunctionCallUsage *fcu); -extern void pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, - bool finalize); - -extern void AtEOXact_PgStat(bool isCommit, bool parallel); -extern void AtEOSubXact_PgStat(bool isCommit, int nestDepth); - -extern void AtPrepare_PgStat(void); -extern void PostPrepare_PgStat(void); - extern void pgstat_twophase_postcommit(TransactionId xid, uint16 info, void *recdata, uint32 len); extern void pgstat_twophase_postabort(TransactionId xid, uint16 info, void *recdata, uint32 len); -extern void pgstat_send_archiver(const char *xlog, bool failed); -extern void pgstat_send_bgwriter(void); -extern void pgstat_send_checkpointer(void); -extern void pgstat_send_wal(bool force); +extern PgStat_TableStatus *find_tabstat_entry(Oid rel_id); -/* ---------- - * Support functions for the SQL-callable functions to - * generate the pgstat* views. - * ---------- + +/* + * Functions in pgstat_replslot.c */ -extern PgStat_StatDBEntry *pgstat_fetch_stat_dbentry(Oid dbid); -extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry(Oid relid); -extern PgStat_StatFuncEntry *pgstat_fetch_stat_funcentry(Oid funcid); -extern PgStat_StatSubEntry *pgstat_fetch_stat_subscription(Oid subid); -extern PgStat_ArchiverStats *pgstat_fetch_stat_archiver(void); -extern PgStat_BgWriterStats *pgstat_fetch_stat_bgwriter(void); -extern PgStat_CheckpointerStats *pgstat_fetch_stat_checkpointer(void); -extern PgStat_GlobalStats *pgstat_fetch_global(void); -extern PgStat_WalStats *pgstat_fetch_stat_wal(void); -extern PgStat_SLRUStats *pgstat_fetch_slru(void); -extern PgStat_StatReplSlotEntry *pgstat_fetch_replslot(NameData slotname); +extern void pgstat_reset_replslot_counter(const char *name); +extern void pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat); +extern void pgstat_report_replslot_create(const char *slotname); +extern void pgstat_report_replslot_drop(const char *slotname); + + +/* + * Functions in pgstat_slru.c + */ + +extern void pgstat_reset_slru_counter(const char *); extern void pgstat_count_slru_page_zeroed(int slru_idx); extern void pgstat_count_slru_page_hit(int slru_idx); extern void pgstat_count_slru_page_read(int slru_idx); @@ -1208,4 +1183,79 @@ extern void pgstat_count_slru_truncate(int slru_idx); extern const char *pgstat_slru_name(int slru_idx); extern int pgstat_slru_index(const char *name); + +/* + * Functions in pgstat_subscription.c + */ + +extern void pgstat_reset_subscription_counter(Oid subid); +extern void pgstat_report_subscription_error(Oid subid, bool is_apply_error); +extern void pgstat_report_subscription_drop(Oid subid); + + +/* + * Functions in pgstat_wal.c + */ + +extern void pgstat_send_wal(bool force); + + +/* + * Variables in pgstat.c + */ + +/* GUC parameters */ +extern PGDLLIMPORT bool pgstat_track_counts; +extern PGDLLIMPORT int pgstat_track_functions; +extern char *pgstat_stat_directory; +extern char *pgstat_stat_tmpname; +extern char *pgstat_stat_filename; + + +/* + * Variables in pgstat_bgwriter.c + */ + +/* updated directly by bgwriter and bufmgr */ +extern PgStat_MsgBgWriter PendingBgWriterStats; + + +/* + * Variables in pgstat_checkpointer.c + */ + +/* + * Checkpointer statistics counters are updated directly by checkpointer and + * bufmgr. + */ +extern PgStat_MsgCheckpointer PendingCheckpointerStats; + + +/* + * Variables in pgstat_database.c + */ + +/* Updated by pgstat_count_buffer_*_time macros */ +extern PgStat_Counter pgStatBlockReadTime; +extern PgStat_Counter pgStatBlockWriteTime; + +/* + * Updated by pgstat_count_conn_*_time macros, called by + * pgstat_report_activity(). + */ +extern PgStat_Counter pgStatActiveTime; +extern PgStat_Counter pgStatTransactionIdleTime; + +/* updated by the traffic cop and in errfinish() */ +extern SessionEndType pgStatSessionEndCause; + + +/* + * Variables in pgstat_wal.c + */ + +/* updated directly by backends and background processes */ +extern PgStat_MsgWal WalStats; + + #endif /* PGSTAT_H */ From 208c5d65bbd60e33e272964578cb74182ac726a8 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Tue, 22 Mar 2022 07:11:19 +0530 Subject: [PATCH 200/772] Add ALTER SUBSCRIPTION ... SKIP. This feature allows skipping the transaction on subscriber nodes. If incoming change violates any constraint, logical replication stops until it's resolved. Currently, users need to either manually resolve the conflict by updating a subscriber-side database or by using function pg_replication_origin_advance() to skip the conflicting transaction. This commit introduces a simpler way to skip the conflicting transactions. The user can specify LSN by ALTER SUBSCRIPTION ... SKIP (lsn = XXX), which allows the apply worker to skip the transaction finished at specified LSN. The apply worker skips all data modification changes within the transaction. Author: Masahiko Sawada Reviewed-by: Takamichi Osumi, Hou Zhijie, Peter Eisentraut, Amit Kapila, Shi Yu, Vignesh C, Greg Nancarrow, Haiying Tang, Euler Taveira Discussion: https://postgr.es/m/CAD21AoDeScrsHhLyEPYqN3sydg6PxAPVBboK=30xJfUVihNZDA@mail.gmail.com --- doc/src/sgml/catalogs.sgml | 10 + doc/src/sgml/logical-replication.sgml | 27 +- doc/src/sgml/ref/alter_subscription.sgml | 42 ++++ src/backend/catalog/pg_subscription.c | 1 + src/backend/catalog/system_views.sql | 2 +- src/backend/commands/subscriptioncmds.c | 73 ++++++ src/backend/parser/gram.y | 9 + src/backend/replication/logical/worker.c | 233 +++++++++++++++++- src/bin/pg_dump/pg_dump.c | 4 + src/bin/psql/describe.c | 8 +- src/bin/psql/tab-complete.c | 5 +- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_subscription.h | 5 + src/include/nodes/parsenodes.h | 3 +- src/test/regress/expected/subscription.out | 126 +++++----- src/test/regress/sql/subscription.sql | 11 + .../subscription/t/029_disable_on_error.pl | 94 ------- src/test/subscription/t/029_on_error.pl | 183 ++++++++++++++ 18 files changed, 665 insertions(+), 173 deletions(-) delete mode 100644 src/test/subscription/t/029_disable_on_error.pl create mode 100644 src/test/subscription/t/029_on_error.pl diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 4dc5b34d21..2a8cd02664 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -7797,6 +7797,16 @@ SCRAM-SHA-256$<iteration count>:&l + + + subskiplsn pg_lsn + + + Finish LSN of the transaction whose changes are to be skipped, if a valid + LSN; otherwise 0/0. + + + subconninfo text diff --git a/doc/src/sgml/logical-replication.sgml b/doc/src/sgml/logical-replication.sgml index 6431d4796d..555fbd749c 100644 --- a/doc/src/sgml/logical-replication.sgml +++ b/doc/src/sgml/logical-replication.sgml @@ -362,19 +362,24 @@ CONTEXT: processing remote data for replication origin "pg_16395" during "INSER The LSN of the transaction that contains the change violating the constraint and the replication origin name can be found from the server log (LSN 0/14C0378 and - replication origin pg_16395 in the above case). To skip the - transaction, the subscription needs to be disabled temporarily by - ALTER SUBSCRIPTION ... DISABLE first or alternatively, the + replication origin pg_16395 in the above case). The + transaction that produces conflict can be skipped by using + ALTER SUBSCRIPTION ... SKIP with the finish LSN + (i.e., LSN 0/14C0378). The finish LSN could be an LSN at which the transaction + is committed or prepared on the publisher. Alternatively, the transaction can + also be skipped by calling the + pg_replication_origin_advance() function + transaction. Before using this function, the subscription needs to be disabled + temporarily either by ALTER SUBSCRIPTION ... DISABLE or, the subscription can be used with the disable_on_error option. - Then, the transaction can be skipped by calling the - - pg_replication_origin_advance() function with - the node_name (i.e., pg_16395) and the - next LSN of the transaction's LSN (i.e., LSN 0/14C0379). After that the replication - can be resumed by ALTER SUBSCRIPTION ... ENABLE. The current - position of origins can be seen in the - + Then, you can use pg_replication_origin_advance() function + with the node_name (i.e., pg_16395) + and the next LSN of the finish LSN (i.e., 0/14C0379). The current position of + origins can be seen in the pg_replication_origin_status system view. + Please note that skipping the whole transaction include skipping changes that + might not violate any constraint. This can easily make the subscriber + inconsistent. diff --git a/doc/src/sgml/ref/alter_subscription.sgml b/doc/src/sgml/ref/alter_subscription.sgml index 58b78a94ea..ac2db249cb 100644 --- a/doc/src/sgml/ref/alter_subscription.sgml +++ b/doc/src/sgml/ref/alter_subscription.sgml @@ -29,6 +29,7 @@ ALTER SUBSCRIPTION name REFRESH PUB ALTER SUBSCRIPTION name ENABLE ALTER SUBSCRIPTION name DISABLE ALTER SUBSCRIPTION name SET ( subscription_parameter [= value] [, ... ] ) +ALTER SUBSCRIPTION name SKIP ( skip_option = value ) ALTER SUBSCRIPTION name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER SUBSCRIPTION name RENAME TO new_name @@ -210,6 +211,47 @@ ALTER SUBSCRIPTION name RENAME TO < + + SKIP ( skip_option = value ) + + + Skips applying all changes of the remote transaction. If incoming data + violates any constraints, logical replication will stop until it is + resolved. By using ALTER SUBSCRIPTION ... SKIP command, + the logical replication worker skips all data modification changes within + the transaction. This option has no effect on the transactions that are + already prepared by enabling two_phase on + subscriber. + After logical replication worker successfully skips the transaction or + finishes a transaction, LSN (stored in + pg_subscription.subskiplsn) + is cleared. See for + the details of logical replication conflicts. Using this command requires + superuser privilege. + + + + skip_option specifies options for this operation. + The supported option is: + + + + lsn (pg_lsn) + + + Specifies the finish LSN of the remote transaction whose changes + are to be skipped by the logical replication worker. The finish LSN + is the LSN at which the transaction is either committed or prepared. + Skipping individual subtransaction is not supported. Setting + NONE resets the LSN. + + + + + + + + new_owner diff --git a/src/backend/catalog/pg_subscription.c b/src/backend/catalog/pg_subscription.c index a6304f5f81..0ff0982f7b 100644 --- a/src/backend/catalog/pg_subscription.c +++ b/src/backend/catalog/pg_subscription.c @@ -70,6 +70,7 @@ GetSubscription(Oid subid, bool missing_ok) sub->stream = subform->substream; sub->twophasestate = subform->subtwophasestate; sub->disableonerr = subform->subdisableonerr; + sub->skiplsn = subform->subskiplsn; /* Get conninfo */ datum = SysCacheGetAttr(SUBSCRIPTIONOID, diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index bb1ac30cd1..bd48ee7bd2 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -1261,7 +1261,7 @@ REVOKE ALL ON pg_replication_origin_status FROM public; -- All columns of pg_subscription except subconninfo are publicly readable. REVOKE ALL ON pg_subscription FROM public; GRANT SELECT (oid, subdbid, subname, subowner, subenabled, subbinary, - substream, subtwophasestate, subdisableonerr, subslotname, + substream, subtwophasestate, subdisableonerr, subskiplsn, subslotname, subsynccommit, subpublications) ON pg_subscription TO public; diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 3922658bbc..e16f04626d 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -45,6 +45,7 @@ #include "utils/guc.h" #include "utils/lsyscache.h" #include "utils/memutils.h" +#include "utils/pg_lsn.h" #include "utils/syscache.h" /* @@ -62,6 +63,7 @@ #define SUBOPT_STREAMING 0x00000100 #define SUBOPT_TWOPHASE_COMMIT 0x00000200 #define SUBOPT_DISABLE_ON_ERR 0x00000400 +#define SUBOPT_LSN 0x00000800 /* check if the 'val' has 'bits' set */ #define IsSet(val, bits) (((val) & (bits)) == (bits)) @@ -84,6 +86,7 @@ typedef struct SubOpts bool streaming; bool twophase; bool disableonerr; + XLogRecPtr lsn; } SubOpts; static List *fetch_table_list(WalReceiverConn *wrconn, List *publications); @@ -262,6 +265,33 @@ parse_subscription_options(ParseState *pstate, List *stmt_options, opts->specified_opts |= SUBOPT_DISABLE_ON_ERR; opts->disableonerr = defGetBoolean(defel); } + else if (IsSet(supported_opts, SUBOPT_LSN) && + strcmp(defel->defname, "lsn") == 0) + { + char *lsn_str = defGetString(defel); + XLogRecPtr lsn; + + if (IsSet(opts->specified_opts, SUBOPT_LSN)) + errorConflictingDefElem(defel, pstate); + + /* Setting lsn = NONE is treated as resetting LSN */ + if (strcmp(lsn_str, "none") == 0) + lsn = InvalidXLogRecPtr; + else + { + /* Parse the argument as LSN */ + lsn = DatumGetLSN(DirectFunctionCall1(pg_lsn_in, + CStringGetDatum(lsn_str))); + + if (XLogRecPtrIsInvalid(lsn)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid WAL location (LSN): %s", lsn_str))); + } + + opts->specified_opts |= SUBOPT_LSN; + opts->lsn = lsn; + } else ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -479,6 +509,7 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, LOGICALREP_TWOPHASE_STATE_PENDING : LOGICALREP_TWOPHASE_STATE_DISABLED); values[Anum_pg_subscription_subdisableonerr - 1] = BoolGetDatum(opts.disableonerr); + values[Anum_pg_subscription_subskiplsn - 1] = LSNGetDatum(InvalidXLogRecPtr); values[Anum_pg_subscription_subconninfo - 1] = CStringGetTextDatum(conninfo); if (opts.slot_name) @@ -1106,6 +1137,48 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, break; } + case ALTER_SUBSCRIPTION_SKIP: + { + parse_subscription_options(pstate, stmt->options, SUBOPT_LSN, &opts); + + /* ALTER SUBSCRIPTION ... SKIP supports only LSN option */ + Assert(IsSet(opts.specified_opts, SUBOPT_LSN)); + + if (!superuser()) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser to skip transaction"))); + + /* + * If the user sets subskiplsn, we do a sanity check to make + * sure that the specified LSN is a probable value. + */ + if (!XLogRecPtrIsInvalid(opts.lsn)) + { + RepOriginId originid; + char originname[NAMEDATALEN]; + XLogRecPtr remote_lsn; + + snprintf(originname, sizeof(originname), "pg_%u", subid); + originid = replorigin_by_name(originname, false); + remote_lsn = replorigin_get_progress(originid, false); + + /* Check the given LSN is at least a future LSN */ + if (!XLogRecPtrIsInvalid(remote_lsn) && opts.lsn < remote_lsn) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X", + LSN_FORMAT_ARGS(opts.lsn), + LSN_FORMAT_ARGS(remote_lsn)))); + } + + values[Anum_pg_subscription_subskiplsn - 1] = LSNGetDatum(opts.lsn); + replaces[Anum_pg_subscription_subskiplsn - 1] = true; + + update_tuple = true; + break; + } + default: elog(ERROR, "unrecognized ALTER SUBSCRIPTION kind %d", stmt->kind); diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index a03b33b53b..0036c2f9e2 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -9983,6 +9983,15 @@ AlterSubscriptionStmt: (Node *)makeBoolean(false), @1)); $$ = (Node *)n; } + | ALTER SUBSCRIPTION name SKIP definition + { + AlterSubscriptionStmt *n = + makeNode(AlterSubscriptionStmt); + n->kind = ALTER_SUBSCRIPTION_SKIP; + n->subname = $3; + n->options = $5; + $$ = (Node *)n; + } ; /***************************************************************************** diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 03e069c7cd..82dcffc2db 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -136,6 +136,7 @@ #include "access/xact.h" #include "access/xlog_internal.h" #include "catalog/catalog.h" +#include "catalog/indexing.h" #include "catalog/namespace.h" #include "catalog/partition.h" #include "catalog/pg_inherits.h" @@ -189,6 +190,7 @@ #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/memutils.h" +#include "utils/pg_lsn.h" #include "utils/rel.h" #include "utils/rls.h" #include "utils/syscache.h" @@ -259,6 +261,21 @@ static bool in_streamed_transaction = false; static TransactionId stream_xid = InvalidTransactionId; +/* + * We enable skipping all data modification changes (INSERT, UPDATE, etc.) for + * the subscription if the remote transaction's finish LSN matches the subskiplsn. + * Once we start skipping changes, we don't stop it until we skip all changes of + * the transaction even if pg_subscription is updated and MySubscription->skiplsn + * gets changed or reset during that. Also, in streaming transaction cases, we + * don't skip receiving and spooling the changes since we decide whether or not + * to skip applying the changes when starting to apply changes. The subskiplsn is + * cleared after successfully skipping the transaction or applying non-empty + * transaction. The latter prevents the mistakenly specified subskiplsn from + * being left. + */ +static XLogRecPtr skip_xact_finish_lsn = InvalidXLogRecPtr; +#define is_skipping_changes() (unlikely(!XLogRecPtrIsInvalid(skip_xact_finish_lsn))) + /* BufFile handle of the current streaming file */ static BufFile *stream_fd = NULL; @@ -336,6 +353,11 @@ static void TwoPhaseTransactionGid(Oid subid, TransactionId xid, char *gid, int /* Common streaming function to apply all the spooled messages */ static void apply_spooled_messages(TransactionId xid, XLogRecPtr lsn); +/* Functions for skipping changes */ +static void maybe_start_skipping_changes(XLogRecPtr finish_lsn); +static void stop_skipping_changes(void); +static void clear_subscription_skip_lsn(XLogRecPtr finish_lsn); + /* Functions for apply error callback */ static void apply_error_callback(void *arg); static inline void set_apply_error_context_xact(TransactionId xid, XLogRecPtr lsn); @@ -795,6 +817,8 @@ apply_handle_begin(StringInfo s) remote_final_lsn = begin_data.final_lsn; + maybe_start_skipping_changes(begin_data.final_lsn); + in_remote_transaction = true; pgstat_report_activity(STATE_RUNNING, NULL); @@ -847,6 +871,8 @@ apply_handle_begin_prepare(StringInfo s) remote_final_lsn = begin_data.prepare_lsn; + maybe_start_skipping_changes(begin_data.prepare_lsn); + in_remote_transaction = true; pgstat_report_activity(STATE_RUNNING, NULL); @@ -905,9 +931,9 @@ apply_handle_prepare(StringInfo s) /* * Unlike commit, here, we always prepare the transaction even though no - * change has happened in this transaction. It is done this way because at - * commit prepared time, we won't know whether we have skipped preparing a - * transaction because of no change. + * change has happened in this transaction or all changes are skipped. It + * is done this way because at commit prepared time, we won't know whether + * we have skipped preparing a transaction because of those reasons. * * XXX, We can optimize such that at commit prepared time, we first check * whether we have prepared the transaction or not but that doesn't seem @@ -928,6 +954,15 @@ apply_handle_prepare(StringInfo s) /* Process any tables that are being synchronized in parallel. */ process_syncing_tables(prepare_data.end_lsn); + /* + * Since we have already prepared the transaction, in a case where the + * server crashes before clearing the subskiplsn, it will be left but the + * transaction won't be resent. But that's okay because it's a rare case + * and the subskiplsn will be cleared when finishing the next transaction. + */ + stop_skipping_changes(); + clear_subscription_skip_lsn(prepare_data.prepare_lsn); + pgstat_report_activity(STATE_IDLE, NULL); reset_apply_error_context_info(); } @@ -969,6 +1004,8 @@ apply_handle_commit_prepared(StringInfo s) /* Process any tables that are being synchronized in parallel. */ process_syncing_tables(prepare_data.end_lsn); + clear_subscription_skip_lsn(prepare_data.end_lsn); + pgstat_report_activity(STATE_IDLE, NULL); reset_apply_error_context_info(); } @@ -1010,6 +1047,8 @@ apply_handle_rollback_prepared(StringInfo s) FinishPreparedTransaction(gid, false); end_replication_step(); CommitTransactionCommand(); + + clear_subscription_skip_lsn(rollback_data.rollback_end_lsn); } pgstat_report_stat(false); @@ -1072,6 +1111,13 @@ apply_handle_stream_prepare(StringInfo s) /* Process any tables that are being synchronized in parallel. */ process_syncing_tables(prepare_data.end_lsn); + /* + * Similar to prepare case, the subskiplsn could be left in a case of + * server crash but it's okay. See the comments in apply_handle_prepare(). + */ + stop_skipping_changes(); + clear_subscription_skip_lsn(prepare_data.prepare_lsn); + pgstat_report_activity(STATE_IDLE, NULL); reset_apply_error_context_info(); @@ -1311,6 +1357,8 @@ apply_spooled_messages(TransactionId xid, XLogRecPtr lsn) MemoryContext oldcxt; BufFile *fd; + maybe_start_skipping_changes(lsn); + /* Make sure we have an open transaction */ begin_replication_step(); @@ -1455,8 +1503,26 @@ apply_handle_stream_commit(StringInfo s) static void apply_handle_commit_internal(LogicalRepCommitData *commit_data) { + if (is_skipping_changes()) + { + stop_skipping_changes(); + + /* + * Start a new transaction to clear the subskiplsn, if not started + * yet. + */ + if (!IsTransactionState()) + StartTransactionCommand(); + } + if (IsTransactionState()) { + /* + * The transaction is either non-empty or skipped, so we clear the + * subskiplsn. + */ + clear_subscription_skip_lsn(commit_data->commit_lsn); + /* * Update origin state so we can restart streaming from correct * position in case of crash. @@ -1583,7 +1649,12 @@ apply_handle_insert(StringInfo s) TupleTableSlot *remoteslot; MemoryContext oldctx; - if (handle_streamed_transaction(LOGICAL_REP_MSG_INSERT, s)) + /* + * Quick return if we are skipping data modification changes or handling + * streamed transactions. + */ + if (is_skipping_changes() || + handle_streamed_transaction(LOGICAL_REP_MSG_INSERT, s)) return; begin_replication_step(); @@ -1710,7 +1781,12 @@ apply_handle_update(StringInfo s) RangeTblEntry *target_rte; MemoryContext oldctx; - if (handle_streamed_transaction(LOGICAL_REP_MSG_UPDATE, s)) + /* + * Quick return if we are skipping data modification changes or handling + * streamed transactions. + */ + if (is_skipping_changes() || + handle_streamed_transaction(LOGICAL_REP_MSG_UPDATE, s)) return; begin_replication_step(); @@ -1874,7 +1950,12 @@ apply_handle_delete(StringInfo s) TupleTableSlot *remoteslot; MemoryContext oldctx; - if (handle_streamed_transaction(LOGICAL_REP_MSG_DELETE, s)) + /* + * Quick return if we are skipping data modification changes or handling + * streamed transactions. + */ + if (is_skipping_changes() || + handle_streamed_transaction(LOGICAL_REP_MSG_DELETE, s)) return; begin_replication_step(); @@ -2261,7 +2342,12 @@ apply_handle_truncate(StringInfo s) ListCell *lc; LOCKMODE lockmode = AccessExclusiveLock; - if (handle_streamed_transaction(LOGICAL_REP_MSG_TRUNCATE, s)) + /* + * Quick return if we are skipping data modification changes or handling + * streamed transactions. + */ + if (is_skipping_changes() || + handle_streamed_transaction(LOGICAL_REP_MSG_TRUNCATE, s)) return; begin_replication_step(); @@ -3738,6 +3824,139 @@ IsLogicalWorker(void) return MyLogicalRepWorker != NULL; } +/* + * Start skipping changes of the transaction if the given LSN matches the + * LSN specified by subscription's skiplsn. + */ +static void +maybe_start_skipping_changes(XLogRecPtr finish_lsn) +{ + Assert(!is_skipping_changes()); + Assert(!in_remote_transaction); + Assert(!in_streamed_transaction); + + /* + * Quick return if it's not requested to skip this transaction. This + * function is called for every remote transaction and we assume that + * skipping the transaction is not used often. + */ + if (likely(XLogRecPtrIsInvalid(MySubscription->skiplsn) || + MySubscription->skiplsn != finish_lsn)) + return; + + /* Start skipping all changes of this transaction */ + skip_xact_finish_lsn = finish_lsn; + + ereport(LOG, + errmsg("start skipping logical replication transaction finished at %X/%X", + LSN_FORMAT_ARGS(skip_xact_finish_lsn))); +} + +/* + * Stop skipping changes by resetting skip_xact_finish_lsn if enabled. + */ +static void +stop_skipping_changes(void) +{ + if (!is_skipping_changes()) + return; + + ereport(LOG, + (errmsg("done skipping logical replication transaction finished at %X/%X", + LSN_FORMAT_ARGS(skip_xact_finish_lsn)))); + + /* Stop skipping changes */ + skip_xact_finish_lsn = InvalidXLogRecPtr; +} + +/* + * Clear subskiplsn of pg_subscription catalog. + * + * finish_lsn is the transaction's finish LSN that is used to check if the + * subskiplsn matches it. If not matched, we raise a warning when clearing the + * subskiplsn in order to inform users for cases e.g., where the user mistakenly + * specified the wrong subskiplsn. + */ +static void +clear_subscription_skip_lsn(XLogRecPtr finish_lsn) +{ + Relation rel; + Form_pg_subscription subform; + HeapTuple tup; + XLogRecPtr myskiplsn = MySubscription->skiplsn; + bool started_tx = false; + + if (likely(XLogRecPtrIsInvalid(myskiplsn))) + return; + + if (!IsTransactionState()) + { + StartTransactionCommand(); + started_tx = true; + } + + /* + * Protect subskiplsn of pg_subscription from being concurrently updated + * while clearing it. + */ + LockSharedObject(SubscriptionRelationId, MySubscription->oid, 0, + AccessShareLock); + + rel = table_open(SubscriptionRelationId, RowExclusiveLock); + + /* Fetch the existing tuple. */ + tup = SearchSysCacheCopy1(SUBSCRIPTIONOID, + ObjectIdGetDatum(MySubscription->oid)); + + if (!HeapTupleIsValid(tup)) + elog(ERROR, "subscription \"%s\" does not exist", MySubscription->name); + + subform = (Form_pg_subscription) GETSTRUCT(tup); + + /* + * Clear the subskiplsn. If the user has already changed subskiplsn before + * clearing it we don't update the catalog and the replication origin + * state won't get advanced. So in the worst case, if the server crashes + * before sending an acknowledgment of the flush position the transaction + * will be sent again and the user needs to set subskiplsn again. We can + * reduce the possibility by logging a replication origin WAL record to + * advance the origin LSN instead but there is no way to advance the + * origin timestamp and it doesn't seem to be worth doing anything about + * it since it's a very rare case. + */ + if (subform->subskiplsn == myskiplsn) + { + bool nulls[Natts_pg_subscription]; + bool replaces[Natts_pg_subscription]; + Datum values[Natts_pg_subscription]; + + memset(values, 0, sizeof(values)); + memset(nulls, false, sizeof(nulls)); + memset(replaces, false, sizeof(replaces)); + + /* reset subskiplsn */ + values[Anum_pg_subscription_subskiplsn - 1] = LSNGetDatum(InvalidXLogRecPtr); + replaces[Anum_pg_subscription_subskiplsn - 1] = true; + + tup = heap_modify_tuple(tup, RelationGetDescr(rel), values, nulls, + replaces); + CatalogTupleUpdate(rel, &tup->t_self, tup); + + if (myskiplsn != finish_lsn) + ereport(WARNING, + errmsg("skip-LSN of logical replication subscription \"%s\" cleared", MySubscription->name), + errdetail("Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X", + LSN_FORMAT_ARGS(finish_lsn), + LSN_FORMAT_ARGS(myskiplsn))); + } + + heap_freetuple(tup); + table_close(rel, NoLock); + + if (started_tx) + CommitTransactionCommand(); +} + /* Error callback to give more context info about the change being applied */ static void apply_error_callback(void *arg) diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 725cd2e4eb..e5816c4cce 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -4385,6 +4385,10 @@ getSubscriptions(Archive *fout) ntups = PQntuples(res); + /* + * Get subscription fields. We don't include subskiplsn in the dump as + * after restoring the dump this value may no longer be relevant. + */ i_tableoid = PQfnumber(res, "tableoid"); i_oid = PQfnumber(res, "oid"); i_subname = PQfnumber(res, "subname"); diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 991bfc1546..714097cad1 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -6105,7 +6105,7 @@ describeSubscriptions(const char *pattern, bool verbose) PGresult *res; printQueryOpt myopt = pset.popt; static const bool translate_columns[] = {false, false, false, false, - false, false, false, false, false, false}; + false, false, false, false, false, false, false}; if (pset.sversion < 100000) { @@ -6152,6 +6152,12 @@ describeSubscriptions(const char *pattern, bool verbose) ", subconninfo AS \"%s\"\n", gettext_noop("Synchronous commit"), gettext_noop("Conninfo")); + + /* Skip LSN is only supported in v15 and higher */ + if (pset.sversion >= 150000) + appendPQExpBuffer(&buf, + ", subskiplsn AS \"%s\"\n", + gettext_noop("Skip LSN")); } /* Only display subscriptions in current database. */ diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 183abcc275..5c064595a9 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1852,7 +1852,7 @@ psql_completion(const char *text, int start, int end) /* ALTER SUBSCRIPTION */ else if (Matches("ALTER", "SUBSCRIPTION", MatchAny)) COMPLETE_WITH("CONNECTION", "ENABLE", "DISABLE", "OWNER TO", - "RENAME TO", "REFRESH PUBLICATION", "SET", + "RENAME TO", "REFRESH PUBLICATION", "SET", "SKIP (", "ADD PUBLICATION", "DROP PUBLICATION"); /* ALTER SUBSCRIPTION REFRESH PUBLICATION */ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) && @@ -1868,6 +1868,9 @@ psql_completion(const char *text, int start, int end) /* ALTER SUBSCRIPTION SET ( */ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) && TailMatches("SET", "(")) COMPLETE_WITH("binary", "slot_name", "streaming", "synchronous_commit", "disable_on_error"); + /* ALTER SUBSCRIPTION SKIP ( */ + else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) && TailMatches("SKIP", "(")) + COMPLETE_WITH("lsn"); /* ALTER SUBSCRIPTION SET PUBLICATION */ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) && TailMatches("SET", "PUBLICATION")) { diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 1383761c1f..db9963db72 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202203211 +#define CATALOG_VERSION_NO 202203221 #endif diff --git a/src/include/catalog/pg_subscription.h b/src/include/catalog/pg_subscription.h index e2befaf351..69969a0617 100644 --- a/src/include/catalog/pg_subscription.h +++ b/src/include/catalog/pg_subscription.h @@ -70,6 +70,9 @@ CATALOG(pg_subscription,6100,SubscriptionRelationId) BKI_SHARED_RELATION BKI_ROW bool subdisableonerr; /* True if a worker error should cause the * subscription to be disabled */ + XLogRecPtr subskiplsn; /* All changes finished at this LSN are + * skipped */ + #ifdef CATALOG_VARLEN /* variable-length fields start here */ /* Connection string to the publisher */ text subconninfo BKI_FORCE_NOT_NULL; @@ -109,6 +112,8 @@ typedef struct Subscription bool disableonerr; /* Indicates if the subscription should be * automatically disabled if a worker error * occurs */ + XLogRecPtr skiplsn; /* All changes finished at this LSN are + * skipped */ char *conninfo; /* Connection string to the publisher */ char *slotname; /* Name of the replication slot */ char *synccommit; /* Synchronous commit setting for worker */ diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 1617702d9d..6f83a79a96 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3726,7 +3726,8 @@ typedef enum AlterSubscriptionType ALTER_SUBSCRIPTION_ADD_PUBLICATION, ALTER_SUBSCRIPTION_DROP_PUBLICATION, ALTER_SUBSCRIPTION_REFRESH, - ALTER_SUBSCRIPTION_ENABLED + ALTER_SUBSCRIPTION_ENABLED, + ALTER_SUBSCRIPTION_SKIP } AlterSubscriptionType; typedef struct AlterSubscriptionStmt diff --git a/src/test/regress/expected/subscription.out b/src/test/regress/expected/subscription.out index ad8003fae1..7fcfad1591 100644 --- a/src/test/regress/expected/subscription.out +++ b/src/test/regress/expected/subscription.out @@ -76,10 +76,10 @@ ALTER SUBSCRIPTION regress_testsub CONNECTION 'foobar'; ERROR: invalid connection string syntax: missing "=" after "foobar" in connection info string \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET PUBLICATION testpub2, testpub3 WITH (refresh = false); @@ -93,11 +93,25 @@ ALTER SUBSCRIPTION regress_doesnotexist CONNECTION 'dbname=regress_doesnotexist2 ERROR: subscription "regress_doesnotexist" does not exist ALTER SUBSCRIPTION regress_testsub SET (create_slot = false); ERROR: unrecognized subscription parameter: "create_slot" +-- ok +ALTER SUBSCRIPTION regress_testsub SKIP (lsn = '0/12345'); +\dRs+ + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------------------+------------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | f | d | f | off | dbname=regress_doesnotexist2 | 0/12345 +(1 row) + +-- ok - with lsn = NONE +ALTER SUBSCRIPTION regress_testsub SKIP (lsn = NONE); +-- fail +ALTER SUBSCRIPTION regress_testsub SKIP (lsn = '0/0'); +ERROR: invalid WAL location (LSN): 0/0 \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo ------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------------------+------------------------------ - regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | f | d | f | off | dbname=regress_doesnotexist2 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------------------+------------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | f | d | f | off | dbname=regress_doesnotexist2 | 0/0 (1 row) BEGIN; @@ -129,10 +143,10 @@ ALTER SUBSCRIPTION regress_testsub_foo SET (synchronous_commit = foobar); ERROR: invalid value for parameter "synchronous_commit": "foobar" HINT: Available values: local, remote_write, remote_apply, on, off. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo ----------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------------------+------------------------------ - regress_testsub_foo | regress_subscription_user | f | {testpub2,testpub3} | f | f | d | f | local | dbname=regress_doesnotexist2 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +---------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------------------+------------------------------+---------- + regress_testsub_foo | regress_subscription_user | f | {testpub2,testpub3} | f | f | d | f | local | dbname=regress_doesnotexist2 | 0/0 (1 row) -- rename back to keep the rest simple @@ -165,19 +179,19 @@ ERROR: binary requires a Boolean value CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, binary = true); WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | t | f | d | f | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | t | f | d | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET (binary = false); ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist | 0/0 (1 row) DROP SUBSCRIPTION regress_testsub; @@ -188,19 +202,19 @@ ERROR: streaming requires a Boolean value CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, streaming = true); WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | t | d | f | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | t | d | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET (streaming = false); ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist | 0/0 (1 row) -- fail - publication already exists @@ -215,10 +229,10 @@ ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub2 WITH (refr ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub2 WITH (refresh = false); ERROR: publication "testpub1" is already in subscription "regress_testsub" \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo ------------------+---------------------------+---------+-----------------------------+--------+-----------+------------------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub,testpub1,testpub2} | f | f | d | f | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-----------------------------+--------+-----------+------------------+------------------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub,testpub1,testpub2} | f | f | d | f | off | dbname=regress_doesnotexist | 0/0 (1 row) -- fail - publication used more then once @@ -233,10 +247,10 @@ ERROR: publication "testpub3" is not in subscription "regress_testsub" -- ok - delete publications ALTER SUBSCRIPTION regress_testsub DROP PUBLICATION testpub1, testpub2 WITH (refresh = false); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist | 0/0 (1 row) DROP SUBSCRIPTION regress_testsub; @@ -270,10 +284,10 @@ ERROR: two_phase requires a Boolean value CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, two_phase = true); WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | f | p | f | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | p | f | off | dbname=regress_doesnotexist | 0/0 (1 row) --fail - alter of two_phase option not supported. @@ -282,10 +296,10 @@ ERROR: unrecognized subscription parameter: "two_phase" -- but can alter streaming when two_phase enabled ALTER SUBSCRIPTION regress_testsub SET (streaming = true); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | t | p | f | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | t | p | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); @@ -294,10 +308,10 @@ DROP SUBSCRIPTION regress_testsub; CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, streaming = true, two_phase = true); WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | t | p | f | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | t | p | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); @@ -309,18 +323,18 @@ ERROR: disable_on_error requires a Boolean value CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, disable_on_error = false); WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET (disable_on_error = true); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | t | off | dbname=regress_doesnotexist + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two phase commit | Disable on error | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | f | d | t | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); diff --git a/src/test/regress/sql/subscription.sql b/src/test/regress/sql/subscription.sql index a7c15b1daf..74c38ead5d 100644 --- a/src/test/regress/sql/subscription.sql +++ b/src/test/regress/sql/subscription.sql @@ -72,6 +72,17 @@ ALTER SUBSCRIPTION regress_testsub SET (slot_name = ''); ALTER SUBSCRIPTION regress_doesnotexist CONNECTION 'dbname=regress_doesnotexist2'; ALTER SUBSCRIPTION regress_testsub SET (create_slot = false); +-- ok +ALTER SUBSCRIPTION regress_testsub SKIP (lsn = '0/12345'); + +\dRs+ + +-- ok - with lsn = NONE +ALTER SUBSCRIPTION regress_testsub SKIP (lsn = NONE); + +-- fail +ALTER SUBSCRIPTION regress_testsub SKIP (lsn = '0/0'); + \dRs+ BEGIN; diff --git a/src/test/subscription/t/029_disable_on_error.pl b/src/test/subscription/t/029_disable_on_error.pl deleted file mode 100644 index 5eca804446..0000000000 --- a/src/test/subscription/t/029_disable_on_error.pl +++ /dev/null @@ -1,94 +0,0 @@ - -# Copyright (c) 2021-2022, PostgreSQL Global Development Group - -# Test of logical replication subscription self-disabling feature. -use strict; -use warnings; -use PostgreSQL::Test::Cluster; -use PostgreSQL::Test::Utils; -use Test::More; - -# create publisher node -my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); -$node_publisher->init(allows_streaming => 'logical'); -$node_publisher->start; - -# create subscriber node -my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init; -$node_subscriber->start; - -# Create identical table on both nodes. -$node_publisher->safe_psql('postgres', "CREATE TABLE tbl (i INT)"); -$node_subscriber->safe_psql('postgres', "CREATE TABLE tbl (i INT)"); - -# Insert duplicate values on the publisher. -$node_publisher->safe_psql('postgres', - "INSERT INTO tbl (i) VALUES (1), (1), (1)"); - -# Create an additional unique index on the subscriber. -$node_subscriber->safe_psql('postgres', - "CREATE UNIQUE INDEX tbl_unique ON tbl (i)"); - -# Create a pub/sub to set up logical replication. This tests that the -# uniqueness violation will cause the subscription to fail during initial -# synchronization and make it disabled. -my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; -$node_publisher->safe_psql('postgres', - "CREATE PUBLICATION pub FOR TABLE tbl"); -$node_subscriber->safe_psql('postgres', - "CREATE SUBSCRIPTION sub CONNECTION '$publisher_connstr' PUBLICATION pub WITH (disable_on_error = true)" -); - -# Initial synchronization failure causes the subscription to be disabled. -$node_subscriber->poll_query_until('postgres', - "SELECT subenabled = false FROM pg_catalog.pg_subscription WHERE subname = 'sub'" -) or die "Timed out while waiting for subscriber to be disabled"; - -# Drop the unique index on the subscriber which caused the subscription to be -# disabled. -$node_subscriber->safe_psql('postgres', "DROP INDEX tbl_unique"); - -# Re-enable the subscription "sub". -$node_subscriber->safe_psql('postgres', "ALTER SUBSCRIPTION sub ENABLE"); - -# Wait for the data to replicate. -$node_publisher->wait_for_catchup('sub'); -$node_subscriber->poll_query_until('postgres', - "SELECT COUNT(1) = 0 FROM pg_subscription_rel sr WHERE sr.srsubstate NOT IN ('s', 'r') AND sr.srrelid = 'tbl'::regclass" -); - -# Confirm that we have finished the table sync. -my $result = - $node_subscriber->safe_psql('postgres', "SELECT MAX(i), COUNT(*) FROM tbl"); -is($result, qq(1|3), "subscription sub replicated data"); - -# Delete the data from the subscriber and recreate the unique index. -$node_subscriber->safe_psql('postgres', "DELETE FROM tbl"); -$node_subscriber->safe_psql('postgres', - "CREATE UNIQUE INDEX tbl_unique ON tbl (i)"); - -# Add more non-unique data to the publisher. -$node_publisher->safe_psql('postgres', - "INSERT INTO tbl (i) VALUES (3), (3), (3)"); - -# Apply failure causes the subscription to be disabled. -$node_subscriber->poll_query_until('postgres', - "SELECT subenabled = false FROM pg_catalog.pg_subscription WHERE subname = 'sub'" -) or die "Timed out while waiting for subscription sub to be disabled"; - -# Drop the unique index on the subscriber and re-enabled the subscription. Then -# confirm that the previously failing insert was applied OK. -$node_subscriber->safe_psql('postgres', "DROP INDEX tbl_unique"); -$node_subscriber->safe_psql('postgres', "ALTER SUBSCRIPTION sub ENABLE"); - -$node_publisher->wait_for_catchup('sub'); - -$result = $node_subscriber->safe_psql('postgres', - "SELECT COUNT(*) FROM tbl WHERE i = 3"); -is($result, qq(3), 'check the result of apply'); - -$node_subscriber->stop; -$node_publisher->stop; - -done_testing(); diff --git a/src/test/subscription/t/029_on_error.pl b/src/test/subscription/t/029_on_error.pl new file mode 100644 index 0000000000..e8b904b745 --- /dev/null +++ b/src/test/subscription/t/029_on_error.pl @@ -0,0 +1,183 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +# Tests for disable_on_error and SKIP transaction features. +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $offset = 0; + +# Test skipping the transaction. This function must be called after the caller +# has inserted data that conflicts with the subscriber. The finish LSN of the +# error transaction that is used to specify to ALTER SUBSCRIPTION ... SKIP is +# fetched from the server logs. After executing ALTER SUBSCRITPION ... SKIP, we +# check if logical replication can continue working by inserting $nonconflict_data +# on the publisher. +sub test_skip_lsn +{ + my ($node_publisher, $node_subscriber, $nonconflict_data, $expected, $msg) + = @_; + + # Wait until a conflict occurs on the subscriber. + $node_subscriber->poll_query_until('postgres', + "SELECT subenabled = FALSE FROM pg_subscription WHERE subname = 'sub'" + ); + + # Get the finish LSN of the error transaction. + my $contents = slurp_file($node_subscriber->logfile, $offset); + $contents =~ + qr/processing remote data for replication origin \"pg_\d+\" during "INSERT" for replication target relation "public.tbl" in transaction \d+ finished at ([[:xdigit:]]+\/[[:xdigit:]]+)/ + or die "could not get error-LSN"; + my $lsn = $1; + + # Set skip lsn. + $node_subscriber->safe_psql('postgres', + "ALTER SUBSCRIPTION sub SKIP (lsn = '$lsn')"); + + # Re-enable the subscription. + $node_subscriber->safe_psql('postgres', "ALTER SUBSCRIPTION sub ENABLE"); + + # Wait for the failed transaction to be skipped + $node_subscriber->poll_query_until('postgres', + "SELECT subskiplsn = '0/0' FROM pg_subscription WHERE subname = 'sub'" + ); + + # Check the log to ensure that the transaction is skipped, and advance the + # offset of the log file for the next test. + $offset = $node_subscriber->wait_for_log( + qr/LOG: done skipping logical replication transaction finished at $lsn/, + $offset); + + # Insert non-conflict data + $node_publisher->safe_psql('postgres', + "INSERT INTO tbl VALUES $nonconflict_data"); + + $node_publisher->wait_for_catchup('sub'); + + # Check replicated data + my $res = + $node_subscriber->safe_psql('postgres', "SELECT count(*) FROM tbl"); + is($res, $expected, $msg); +} + +# Create publisher node. Set a low value of logical_decoding_work_mem to test +# streaming cases. +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); +$node_publisher->init(allows_streaming => 'logical'); +$node_publisher->append_conf( + 'postgresql.conf', + qq[ +logical_decoding_work_mem = 64kB +max_prepared_transactions = 10 +]); +$node_publisher->start; + +# Create subscriber node +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); +$node_subscriber->init; +$node_subscriber->append_conf( + 'postgresql.conf', + qq[ +max_prepared_transactions = 10 +]); +$node_subscriber->start; + +# Initial table setup on both publisher and subscriber. On the subscriber, we +# create the same tables but with a primary key. Also, insert some data that +# will conflict with the data replicated from publisher later. +$node_publisher->safe_psql( + 'postgres', + qq[ +CREATE TABLE tbl (i INT, t TEXT); +INSERT INTO tbl VALUES (1, NULL); +]); +$node_subscriber->safe_psql( + 'postgres', + qq[ +CREATE TABLE tbl (i INT PRIMARY KEY, t TEXT); +INSERT INTO tbl VALUES (1, NULL); +]); + +# Create a pub/sub to set up logical replication. This tests that the +# uniqueness violation will cause the subscription to fail during initial +# synchronization and make it disabled. +my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION pub FOR TABLE tbl"); +$node_subscriber->safe_psql('postgres', + "CREATE SUBSCRIPTION sub CONNECTION '$publisher_connstr' PUBLICATION pub WITH (disable_on_error = true, streaming = on, two_phase = on)" +); + +# Initial synchronization failure causes the subscription to be disabled. +$node_subscriber->poll_query_until('postgres', + "SELECT subenabled = false FROM pg_catalog.pg_subscription WHERE subname = 'sub'" +) or die "Timed out while waiting for subscriber to be disabled"; + +# Truncate the table on the subscriber which caused the subscription to be +# disabled. +$node_subscriber->safe_psql('postgres', "TRUNCATE tbl"); + +# Re-enable the subscription "sub". +$node_subscriber->safe_psql('postgres', "ALTER SUBSCRIPTION sub ENABLE"); + +# Wait for the data to replicate. +$node_publisher->wait_for_catchup('sub'); +$node_subscriber->poll_query_until('postgres', + "SELECT COUNT(1) = 0 FROM pg_subscription_rel sr WHERE sr.srsubstate NOT IN ('s', 'r') AND sr.srrelid = 'tbl'::regclass" +); + +# Confirm that we have finished the table sync. +my $result = + $node_subscriber->safe_psql('postgres', "SELECT COUNT(*) FROM tbl"); +is($result, qq(1), "subscription sub replicated data"); + +# Insert data to tbl, raising an error on the subscriber due to violation +# of the unique constraint on tbl. Then skip the transaction. +$node_publisher->safe_psql( + 'postgres', + qq[ +BEGIN; +INSERT INTO tbl VALUES (1, NULL); +COMMIT; +]); +test_skip_lsn($node_publisher, $node_subscriber, + "(2, NULL)", "2", "test skipping transaction"); + +# Test for PREPARE and COMMIT PREPARED. Insert the same data to tbl and +# PREPARE the transaction, raising an error. Then skip the transaction. +$node_publisher->safe_psql( + 'postgres', + qq[ +BEGIN; +INSERT INTO tbl VALUES (1, NULL); +PREPARE TRANSACTION 'gtx'; +COMMIT PREPARED 'gtx'; +]); +test_skip_lsn($node_publisher, $node_subscriber, + "(3, NULL)", "3", "test skipping prepare and commit prepared "); + +# Test for STREAM COMMIT. Insert enough rows to tbl to exceed the 64kB +# limit, also raising an error on the subscriber during applying spooled +# changes for the same reason. Then skip the transaction. +$node_publisher->safe_psql( + 'postgres', + qq[ +BEGIN; +INSERT INTO tbl SELECT i, md5(i::text) FROM generate_series(1, 10000) s(i); +COMMIT; +]); +test_skip_lsn($node_publisher, $node_subscriber, "(4, md5(4::text))", + "4", "test skipping stream-commit"); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT COUNT(*) FROM pg_prepared_xacts"); +is($result, "0", + "check all prepared transactions are resolved on the subscriber"); + +$node_subscriber->stop; +$node_publisher->stop; + +done_testing(); From 9ca234bae79358a24de2a8dc1ec8024656ca66a4 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 22 Mar 2022 13:20:31 +0900 Subject: [PATCH 201/772] Fix failures in SSL tests caused by out-of-tree keys and certificates This issue is environment-sensitive, where the SSL tests could fail in various way by feeding on defaults provided by sslcert, sslkey, sslrootkey, sslrootcert, sslcrl and sslcrldir coming from a local setup, as of ~/.postgresql/ by default. Horiguchi-san has reported two failures, but more advanced testing from me (aka inclusion of garbage SSL configuration in ~/.postgresql/ for all the configuration parameters) has showed dozens of failures that can be triggered in the whole test suite. History has showed that we are not good when it comes to address such issues, fixing them locally like in dd87799, and such problems keep appearing. This commit strengthens the entire test suite to put an end to this set of problems by embedding invalid default values in all the connection strings used in the tests. The invalid values are prefixed in each connection string, relying on the follow-up values passed in the connection string to enforce any invalid value previously set. Note that two tests related to CRLs are required to fail with certain pre-set configurations, but we can rely on enforcing an empty value instead after the invalid set of values. Reported-by: Kyotaro Horiguchi Reviewed-by: Andrew Dunstan, Daniel Gustafsson, Kyotaro Horiguchi Discussion: https://postgr.es/m/20220316.163658.1122740600489097632.horikyota.ntt@gmail.com backpatch-through: 10 --- src/test/ssl/t/001_ssltests.pl | 34 +++++++++++++++++++++------------- src/test/ssl/t/003_sslinfo.pl | 11 ++++++++--- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl index 5c5b16fbe7..605e405de3 100644 --- a/src/test/ssl/t/001_ssltests.pl +++ b/src/test/ssl/t/001_ssltests.pl @@ -138,8 +138,13 @@ switch_server_cert($node, 'server-cn-only'); +# Set of default settings for SSL parameters in connection string. This +# makes the tests protected against any defaults the environment may have +# in ~/.postgresql/. +my $default_ssl_connstr = "sslkey=invalid sslcert=invalid sslrootcert=invalid sslcrl=invalid sslcrldir=invalid"; + $common_connstr = - "user=ssltestuser dbname=trustdb sslcert=invalid hostaddr=$SERVERHOSTADDR host=common-name.pg-ssltest.test"; + "$default_ssl_connstr user=ssltestuser dbname=trustdb hostaddr=$SERVERHOSTADDR host=common-name.pg-ssltest.test"; # The server should not accept non-SSL connections. $node->connect_fails( @@ -216,9 +221,10 @@ "CRL belonging to a different CA", expected_stderr => qr/SSL error: certificate verify failed/); -# The same for CRL directory +# The same for CRL directory. sslcrl='' is added here to override the +# invalid default, so as this does not interfere with this case. $node->connect_fails( - "$common_connstr sslrootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrldir=ssl/client-crldir", + "$common_connstr sslcrl='' sslrootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrldir=ssl/client-crldir", "directory CRL belonging to a different CA", expected_stderr => qr/SSL error: certificate verify failed/); @@ -235,7 +241,7 @@ # Check that connecting with verify-full fails, when the hostname doesn't # match the hostname in the server's certificate. $common_connstr = - "user=ssltestuser dbname=trustdb sslcert=invalid sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR"; + "$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR"; $node->connect_ok("$common_connstr sslmode=require host=wronghost.test", "mismatch between host name and server certificate sslmode=require"); @@ -253,7 +259,7 @@ switch_server_cert($node, 'server-multiple-alt-names'); $common_connstr = - "user=ssltestuser dbname=trustdb sslcert=invalid sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full"; + "$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full"; $node->connect_ok( "$common_connstr host=dns1.alt-name.pg-ssltest.test", @@ -282,7 +288,7 @@ switch_server_cert($node, 'server-single-alt-name'); $common_connstr = - "user=ssltestuser dbname=trustdb sslcert=invalid sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full"; + "$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full"; $node->connect_ok( "$common_connstr host=single.alt-name.pg-ssltest.test", @@ -306,7 +312,7 @@ switch_server_cert($node, 'server-cn-and-alt-names'); $common_connstr = - "user=ssltestuser dbname=trustdb sslcert=invalid sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full"; + "$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full"; $node->connect_ok("$common_connstr host=dns1.alt-name.pg-ssltest.test", "certificate with both a CN and SANs 1"); @@ -323,7 +329,7 @@ # not a very sensible certificate, but libpq should handle it gracefully. switch_server_cert($node, 'server-no-names'); $common_connstr = - "user=ssltestuser dbname=trustdb sslcert=invalid sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR"; + "$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR"; $node->connect_ok( "$common_connstr sslmode=verify-ca host=common-name.pg-ssltest.test", @@ -339,7 +345,7 @@ switch_server_cert($node, 'server-revoked'); $common_connstr = - "user=ssltestuser dbname=trustdb sslcert=invalid hostaddr=$SERVERHOSTADDR host=common-name.pg-ssltest.test"; + "$default_ssl_connstr user=ssltestuser dbname=trustdb hostaddr=$SERVERHOSTADDR host=common-name.pg-ssltest.test"; # Without the CRL, succeeds. With it, fails. $node->connect_ok( @@ -349,8 +355,10 @@ "$common_connstr sslrootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrl=ssl/root+server.crl", "does not connect with client-side CRL file", expected_stderr => qr/SSL error: certificate verify failed/); +# sslcrl='' is added here to override the invalid default, so as this +# does not interfere with this case. $node->connect_fails( - "$common_connstr sslrootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrldir=ssl/root+server-crldir", + "$common_connstr sslcrl='' sslrootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrldir=ssl/root+server-crldir", "does not connect with client-side CRL directory", expected_stderr => qr/SSL error: certificate verify failed/); @@ -392,7 +400,7 @@ note "running server tests"; $common_connstr = - "sslrootcert=ssl/root+server_ca.crt sslmode=require dbname=certdb hostaddr=$SERVERHOSTADDR host=localhost"; + "$default_ssl_connstr sslrootcert=ssl/root+server_ca.crt sslmode=require dbname=certdb hostaddr=$SERVERHOSTADDR host=localhost"; # no client cert $node->connect_fails( @@ -569,7 +577,7 @@ # works, iff username matches Common Name # fails, iff username doesn't match Common Name. $common_connstr = - "sslrootcert=ssl/root+server_ca.crt sslmode=require dbname=verifydb hostaddr=$SERVERHOSTADDR host=localhost"; + "$default_ssl_connstr sslrootcert=ssl/root+server_ca.crt sslmode=require dbname=verifydb hostaddr=$SERVERHOSTADDR host=localhost"; $node->connect_ok( "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=$key{'client.key'}", @@ -596,7 +604,7 @@ # intermediate client_ca.crt is provided by client, and isn't in server's ssl_ca_file switch_server_cert($node, 'server-cn-only', 'root_ca'); $common_connstr = - "user=ssltestuser dbname=certdb sslkey=$key{'client.key'} sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR host=localhost"; + "$default_ssl_connstr user=ssltestuser dbname=certdb sslkey=$key{'client.key'} sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR host=localhost"; $node->connect_ok( "$common_connstr sslmode=require sslcert=ssl/client+client_ca.crt", diff --git a/src/test/ssl/t/003_sslinfo.pl b/src/test/ssl/t/003_sslinfo.pl index 95742081f3..72eb6b860c 100644 --- a/src/test/ssl/t/003_sslinfo.pl +++ b/src/test/ssl/t/003_sslinfo.pl @@ -62,8 +62,13 @@ # 001 test does. switch_server_cert($node, 'server-revoked'); +# Set of default settings for SSL parameters in connection string. This +# makes the tests protected against any defaults the environment may have +# in ~/.postgresql/. +my $default_ssl_connstr = "sslkey=invalid sslcert=invalid sslrootcert=invalid sslcrl=invalid sslcrldir=invalid"; + $common_connstr = - "sslrootcert=ssl/root+server_ca.crt sslmode=require dbname=certdb hostaddr=$SERVERHOSTADDR host=localhost " . + "$default_ssl_connstr sslrootcert=ssl/root+server_ca.crt sslmode=require dbname=certdb hostaddr=$SERVERHOSTADDR host=localhost " . "user=ssltestuser sslcert=ssl/client_ext.crt sslkey=$client_tmp_key"; # Make sure we can connect even though previous test suites have established this @@ -93,7 +98,7 @@ is($result, 't', "ssl_client_cert_present() for connection with cert"); $result = $node->safe_psql("trustdb", "SELECT ssl_client_cert_present();", - connstr => "sslrootcert=ssl/root+server_ca.crt sslmode=require " . + connstr => "$default_ssl_connstr sslrootcert=ssl/root+server_ca.crt sslmode=require " . "dbname=trustdb hostaddr=$SERVERHOSTADDR user=ssltestuser host=localhost"); is($result, 'f', "ssl_client_cert_present() for connection without cert"); @@ -108,7 +113,7 @@ is($result, '3', "ssl_client_dn_field() for an invalid field"); $result = $node->safe_psql("trustdb", "SELECT ssl_client_dn_field('commonName');", - connstr => "sslrootcert=ssl/root+server_ca.crt sslmode=require " . + connstr => "$default_ssl_connstr sslrootcert=ssl/root+server_ca.crt sslmode=require " . "dbname=trustdb hostaddr=$SERVERHOSTADDR user=ssltestuser host=localhost"); is($result, '', "ssl_client_dn_field() for connection without cert"); From f5576a21b0778f275d7418f6f7a44d9400ee90aa Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 22 Mar 2022 08:51:05 +0100 Subject: [PATCH 202/772] pgcrypto: Remove internal padding implementation Use the padding provided by OpenSSL instead of doing it ourselves. The internal implementation was once applicable to the non-OpenSSL code paths, but those have since been removed. The padding algorithm is still the same. The OpenSSL padding implementation is stricter than the previous internal one: Bad padding during decryption is now an error, and encryption without padding now requires the input size to be a multiple of the block size, otherwise it is also an error. Previously, these cases silently proceeded, in spite of the documentation saying otherwise. Add some test cases about this, too. (The test cases are in rijndael.sql, but they apply to all encryption algorithms.) Reviewed-by: Jacob Champion Reviewed-by: Nathan Bossart Discussion: https://www.postgresql.org/message-id/flat/ba94c26b-0c58-c97e-7a44-f44e08b4cca2%40enterprisedb.com --- contrib/pgcrypto/expected/rijndael.out | 14 +++ contrib/pgcrypto/openssl.c | 22 +++-- contrib/pgcrypto/pgp-cfb.c | 4 +- contrib/pgcrypto/px.c | 120 +------------------------ contrib/pgcrypto/px.h | 14 +-- contrib/pgcrypto/sql/rijndael.sql | 12 +++ 6 files changed, 52 insertions(+), 134 deletions(-) diff --git a/contrib/pgcrypto/expected/rijndael.out b/contrib/pgcrypto/expected/rijndael.out index ad69cdba49..015ba4430d 100644 --- a/contrib/pgcrypto/expected/rijndael.out +++ b/contrib/pgcrypto/expected/rijndael.out @@ -39,6 +39,12 @@ SELECT encrypt( \x8ea2b7ca516745bfeafc49904b496089 (1 row) +-- without padding, input not multiple of block size +SELECT encrypt( +'\x00112233445566778899aabbccddeeff00', +'\x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', +'aes-cbc/pad:none'); +ERROR: encrypt error: Encryption failed -- key padding SELECT encrypt( '\x0011223344', @@ -95,6 +101,14 @@ select encode(decrypt(encrypt('foo', '0123456', 'aes'), '0123456', 'aes'), 'esca foo (1 row) +-- data not multiple of block size +select encode(decrypt(encrypt('foo', '0123456', 'aes') || '\x00'::bytea, '0123456', 'aes'), 'escape'); +ERROR: decrypt error: Decryption failed +-- bad padding +-- (The input value is the result of encrypt_iv('abcdefghijklmnopqrstuvwxyz', '0123456', 'abcd', 'aes') +-- with the 16th byte changed (s/db/eb/) to corrupt the padding of the last block.) +select encode(decrypt_iv('\xa21a9c15231465964e3396d32095e67eb52bab05f556a581621dee1b85385789', '0123456', 'abcd', 'aes'), 'escape'); +ERROR: decrypt_iv error: Decryption failed -- iv select encrypt_iv('foo', '0123456', 'abcd', 'aes'); encrypt_iv diff --git a/contrib/pgcrypto/openssl.c b/contrib/pgcrypto/openssl.c index e236b0d79c..68fd61b716 100644 --- a/contrib/pgcrypto/openssl.c +++ b/contrib/pgcrypto/openssl.c @@ -369,17 +369,17 @@ gen_ossl_free(PX_Cipher *c) } static int -gen_ossl_decrypt(PX_Cipher *c, const uint8 *data, unsigned dlen, - uint8 *res) +gen_ossl_decrypt(PX_Cipher *c, int padding, const uint8 *data, unsigned dlen, + uint8 *res, unsigned *rlen) { OSSLCipher *od = c->ptr; - int outlen; + int outlen, outlen2; if (!od->init) { if (!EVP_DecryptInit_ex(od->evp_ctx, od->evp_ciph, NULL, NULL, NULL)) return PXE_CIPHER_INIT; - if (!EVP_CIPHER_CTX_set_padding(od->evp_ctx, 0)) + if (!EVP_CIPHER_CTX_set_padding(od->evp_ctx, padding)) return PXE_CIPHER_INIT; if (!EVP_CIPHER_CTX_set_key_length(od->evp_ctx, od->klen)) return PXE_CIPHER_INIT; @@ -390,22 +390,25 @@ gen_ossl_decrypt(PX_Cipher *c, const uint8 *data, unsigned dlen, if (!EVP_DecryptUpdate(od->evp_ctx, res, &outlen, data, dlen)) return PXE_DECRYPT_FAILED; + if (!EVP_DecryptFinal_ex(od->evp_ctx, res + outlen, &outlen2)) + return PXE_DECRYPT_FAILED; + *rlen = outlen + outlen2; return 0; } static int -gen_ossl_encrypt(PX_Cipher *c, const uint8 *data, unsigned dlen, - uint8 *res) +gen_ossl_encrypt(PX_Cipher *c, int padding, const uint8 *data, unsigned dlen, + uint8 *res, unsigned *rlen) { OSSLCipher *od = c->ptr; - int outlen; + int outlen, outlen2; if (!od->init) { if (!EVP_EncryptInit_ex(od->evp_ctx, od->evp_ciph, NULL, NULL, NULL)) return PXE_CIPHER_INIT; - if (!EVP_CIPHER_CTX_set_padding(od->evp_ctx, 0)) + if (!EVP_CIPHER_CTX_set_padding(od->evp_ctx, padding)) return PXE_CIPHER_INIT; if (!EVP_CIPHER_CTX_set_key_length(od->evp_ctx, od->klen)) return PXE_CIPHER_INIT; @@ -416,6 +419,9 @@ gen_ossl_encrypt(PX_Cipher *c, const uint8 *data, unsigned dlen, if (!EVP_EncryptUpdate(od->evp_ctx, res, &outlen, data, dlen)) return PXE_ENCRYPT_FAILED; + if (!EVP_EncryptFinal_ex(od->evp_ctx, res + outlen, &outlen2)) + return PXE_ENCRYPT_FAILED; + *rlen = outlen + outlen2; return 0; } diff --git a/contrib/pgcrypto/pgp-cfb.c b/contrib/pgcrypto/pgp-cfb.c index dafa562daa..de41e825b0 100644 --- a/contrib/pgcrypto/pgp-cfb.c +++ b/contrib/pgcrypto/pgp-cfb.c @@ -220,7 +220,9 @@ cfb_process(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst, while (len > 0) { - px_cipher_encrypt(ctx->ciph, ctx->fr, ctx->block_size, ctx->fre); + unsigned rlen; + + px_cipher_encrypt(ctx->ciph, 0, ctx->fr, ctx->block_size, ctx->fre, &rlen); if (ctx->block_no < 5) ctx->block_no++; diff --git a/contrib/pgcrypto/px.c b/contrib/pgcrypto/px.c index 0010addaf7..c139798f3b 100644 --- a/contrib/pgcrypto/px.c +++ b/contrib/pgcrypto/px.c @@ -44,7 +44,6 @@ static const struct error_desc px_err_list[] = { {PXE_ERR_GENERIC, "Some PX error (not specified)"}, {PXE_NO_HASH, "No such hash algorithm"}, {PXE_NO_CIPHER, "No such cipher algorithm"}, - {PXE_NOTBLOCKSIZE, "Data not a multiple of block size"}, {PXE_BAD_OPTION, "Unknown option"}, {PXE_BAD_FORMAT, "Badly formatted type"}, {PXE_KEY_TOO_BIG, "Key was too big"}, @@ -221,129 +220,14 @@ static int combo_encrypt(PX_Combo *cx, const uint8 *data, unsigned dlen, uint8 *res, unsigned *rlen) { - int err = 0; - uint8 *bbuf; - unsigned bs, - bpos, - i, - pad; - - PX_Cipher *c = cx->cipher; - - bbuf = NULL; - bs = px_cipher_block_size(c); - - /* encrypt */ - if (bs > 1) - { - bbuf = palloc(bs * 4); - bpos = dlen % bs; - *rlen = dlen - bpos; - memcpy(bbuf, data + *rlen, bpos); - - /* encrypt full-block data */ - if (*rlen) - { - err = px_cipher_encrypt(c, data, *rlen, res); - if (err) - goto out; - } - - /* bbuf has now bpos bytes of stuff */ - if (cx->padding) - { - pad = bs - (bpos % bs); - for (i = 0; i < pad; i++) - bbuf[bpos++] = pad; - } - else if (bpos % bs) - { - /* ERROR? */ - pad = bs - (bpos % bs); - for (i = 0; i < pad; i++) - bbuf[bpos++] = 0; - } - - /* encrypt the rest - pad */ - if (bpos) - { - err = px_cipher_encrypt(c, bbuf, bpos, res + *rlen); - *rlen += bpos; - } - } - else - { - /* stream cipher/mode - no pad needed */ - err = px_cipher_encrypt(c, data, dlen, res); - if (err) - goto out; - *rlen = dlen; - } -out: - if (bbuf) - pfree(bbuf); - - return err; + return px_cipher_encrypt(cx->cipher, cx->padding, data, dlen, res, rlen); } static int combo_decrypt(PX_Combo *cx, const uint8 *data, unsigned dlen, uint8 *res, unsigned *rlen) { - int err = 0; - unsigned bs, - i, - pad; - unsigned pad_ok; - - PX_Cipher *c = cx->cipher; - - /* decide whether zero-length input is allowed */ - if (dlen == 0) - { - /* with padding, empty ciphertext is not allowed */ - if (cx->padding) - return PXE_DECRYPT_FAILED; - - /* without padding, report empty result */ - *rlen = 0; - return 0; - } - - bs = px_cipher_block_size(c); - if (bs > 1 && (dlen % bs) != 0) - goto block_error; - - /* decrypt */ - *rlen = dlen; - err = px_cipher_decrypt(c, data, dlen, res); - if (err) - return err; - - /* unpad */ - if (bs > 1 && cx->padding) - { - pad = res[*rlen - 1]; - pad_ok = 0; - if (pad > 0 && pad <= bs && pad <= *rlen) - { - pad_ok = 1; - for (i = *rlen - pad; i < *rlen; i++) - if (res[i] != pad) - { - pad_ok = 0; - break; - } - } - - if (pad_ok) - *rlen -= pad; - } - - return 0; - -block_error: - return PXE_NOTBLOCKSIZE; + return px_cipher_decrypt(cx->cipher, cx->padding, data, dlen, res, rlen); } static void diff --git a/contrib/pgcrypto/px.h b/contrib/pgcrypto/px.h index eef49a8b76..f175862f8e 100644 --- a/contrib/pgcrypto/px.h +++ b/contrib/pgcrypto/px.h @@ -47,7 +47,7 @@ #define PXE_ERR_GENERIC -1 #define PXE_NO_HASH -2 #define PXE_NO_CIPHER -3 -#define PXE_NOTBLOCKSIZE -4 +/* -4 is unused */ #define PXE_BAD_OPTION -5 #define PXE_BAD_FORMAT -6 #define PXE_KEY_TOO_BIG -7 @@ -144,8 +144,8 @@ struct px_cipher unsigned (*iv_size) (PX_Cipher *c); int (*init) (PX_Cipher *c, const uint8 *key, unsigned klen, const uint8 *iv); - int (*encrypt) (PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res); - int (*decrypt) (PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res); + int (*encrypt) (PX_Cipher *c, int padding, const uint8 *data, unsigned dlen, uint8 *res, unsigned *rlen); + int (*decrypt) (PX_Cipher *c, int padding, const uint8 *data, unsigned dlen, uint8 *res, unsigned *rlen); void (*free) (PX_Cipher *c); /* private */ void *ptr; @@ -208,10 +208,10 @@ void px_debug(const char *fmt,...) pg_attribute_printf(1, 2); #define px_cipher_block_size(c) (c)->block_size(c) #define px_cipher_iv_size(c) (c)->iv_size(c) #define px_cipher_init(c, k, klen, iv) (c)->init(c, k, klen, iv) -#define px_cipher_encrypt(c, data, dlen, res) \ - (c)->encrypt(c, data, dlen, res) -#define px_cipher_decrypt(c, data, dlen, res) \ - (c)->decrypt(c, data, dlen, res) +#define px_cipher_encrypt(c, padding, data, dlen, res, rlen) \ + (c)->encrypt(c, padding, data, dlen, res, rlen) +#define px_cipher_decrypt(c, padding, data, dlen, res, rlen) \ + (c)->decrypt(c, padding, data, dlen, res, rlen) #define px_cipher_free(c) (c)->free(c) diff --git a/contrib/pgcrypto/sql/rijndael.sql b/contrib/pgcrypto/sql/rijndael.sql index b162fc61f5..a276641998 100644 --- a/contrib/pgcrypto/sql/rijndael.sql +++ b/contrib/pgcrypto/sql/rijndael.sql @@ -24,6 +24,12 @@ SELECT encrypt( '\x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', 'aes-cbc/pad:none'); +-- without padding, input not multiple of block size +SELECT encrypt( +'\x00112233445566778899aabbccddeeff00', +'\x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', +'aes-cbc/pad:none'); + -- key padding SELECT encrypt( @@ -50,6 +56,12 @@ select encrypt('foo', '0123456789012345678901', 'aes'); -- decrypt select encode(decrypt(encrypt('foo', '0123456', 'aes'), '0123456', 'aes'), 'escape'); +-- data not multiple of block size +select encode(decrypt(encrypt('foo', '0123456', 'aes') || '\x00'::bytea, '0123456', 'aes'), 'escape'); +-- bad padding +-- (The input value is the result of encrypt_iv('abcdefghijklmnopqrstuvwxyz', '0123456', 'abcd', 'aes') +-- with the 16th byte changed (s/db/eb/) to corrupt the padding of the last block.) +select encode(decrypt_iv('\xa21a9c15231465964e3396d32095e67eb52bab05f556a581621dee1b85385789', '0123456', 'abcd', 'aes'), 'escape'); -- iv select encrypt_iv('foo', '0123456', 'abcd', 'aes'); From 7faa5fc84bf46ea6c543993cffb8be64dff60d25 Mon Sep 17 00:00:00 2001 From: Dean Rasheed Date: Tue, 22 Mar 2022 10:28:10 +0000 Subject: [PATCH 203/772] Add support for security invoker views. A security invoker view checks permissions for accessing its underlying base relations using the privileges of the user of the view, rather than the privileges of the view owner. Additionally, if any of the base relations are tables with RLS enabled, the policies of the user of the view are applied, rather than those of the view owner. This allows views to be defined without giving away additional privileges on the underlying base relations, and matches a similar feature available in other database systems. It also allows views to operate more naturally with RLS, without affecting the assignments of policies to users. Christoph Heiss, with some additional hacking by me. Reviewed by Laurenz Albe and Wolfgang Walther. Discussion: https://postgr.es/m/b66dd6d6-ad3e-c6f2-8b90-47be773da240%40cybertec.at --- doc/src/sgml/ref/alter_view.sgml | 12 +- doc/src/sgml/ref/create_policy.sgml | 4 +- doc/src/sgml/ref/create_view.sgml | 105 +++++-- doc/src/sgml/ref/lock.sgml | 13 +- doc/src/sgml/rules.sgml | 11 +- src/backend/access/common/reloptions.c | 11 + src/backend/commands/lockcmds.c | 19 +- src/backend/rewrite/rewriteHandler.c | 18 +- src/backend/utils/cache/relcache.c | 73 +++-- src/include/utils/rel.h | 11 + src/test/regress/expected/create_view.out | 46 +++- src/test/regress/expected/lock.out | 66 +++++ src/test/regress/expected/rowsecurity.out | 257 +++++++++++++++++- src/test/regress/expected/rules.out | 30 ++ src/test/regress/expected/updatable_views.out | 237 ++++++++++++++++ src/test/regress/sql/create_view.sql | 22 +- src/test/regress/sql/lock.sql | 49 ++++ src/test/regress/sql/rowsecurity.sql | 122 +++++++++ src/test/regress/sql/rules.sql | 28 ++ src/test/regress/sql/updatable_views.sql | 180 ++++++++++++ 20 files changed, 1239 insertions(+), 75 deletions(-) diff --git a/doc/src/sgml/ref/alter_view.sgml b/doc/src/sgml/ref/alter_view.sgml index 98c312c5bf..8bdc90a5a1 100644 --- a/doc/src/sgml/ref/alter_view.sgml +++ b/doc/src/sgml/ref/alter_view.sgml @@ -156,7 +156,17 @@ ALTER VIEW [ IF EXISTS ] name RESET Changes the security-barrier property of the view. The value must - be Boolean value, such as true + be a Boolean value, such as true + or false. + + + + + security_invoker (boolean) + + + Changes the security-invoker property of the view. The value must + be a Boolean value, such as true or false. diff --git a/doc/src/sgml/ref/create_policy.sgml b/doc/src/sgml/ref/create_policy.sgml index 9f532068e6..f898b7a218 100644 --- a/doc/src/sgml/ref/create_policy.sgml +++ b/doc/src/sgml/ref/create_policy.sgml @@ -608,7 +608,9 @@ AND This does not change how views work, however. As with normal queries and views, permission checks and policies for the tables which are referenced by a view will use the view - owner's rights and any policies which apply to the view owner. + owner's rights and any policies which apply to the view owner, except if + the view is defined using the security_invoker option + (see CREATE VIEW). diff --git a/doc/src/sgml/ref/create_view.sgml b/doc/src/sgml/ref/create_view.sgml index bf03287592..3b26205f78 100644 --- a/doc/src/sgml/ref/create_view.sgml +++ b/doc/src/sgml/ref/create_view.sgml @@ -137,8 +137,6 @@ CREATE VIEW [ schema . ] view_namelocal or cascaded, and is equivalent to specifying WITH [ CASCADED | LOCAL ] CHECK OPTION (see below). - This option can be changed on existing views using ALTER VIEW. @@ -152,7 +150,22 @@ CREATE VIEW [ schema . ] view_name - + + + security_invoker (boolean) + + + This option causes the underlying base relations to be checked + against the privileges of the user of the view rather than the view + owner. See the notes below for full details. + + + + + + All of the above options can be changed on existing views using ALTER VIEW. + @@ -265,18 +278,74 @@ CREATE VIEW vista AS SELECT text 'Hello World' AS hello; - Access to tables referenced in the view is determined by permissions of - the view owner. In some cases, this can be used to provide secure but - restricted access to the underlying tables. However, not all views are - secure against tampering; see for - details. Functions called in the view are treated the same as if they had - been called directly from the query using the view. Therefore the user of + By default, access to the underlying base relations referenced in the view + is determined by the permissions of the view owner. In some cases, this + can be used to provide secure but restricted access to the underlying + tables. However, not all views are secure against tampering; see for details. + + + + If the view has the security_invoker property set to + true, access to the underlying base relations is + determined by the permissions of the user executing the query, rather than + the view owner. Thus, the user of a security invoker view must have the + relevant permissions on the view and its underlying base relations. + + + + If any of the underlying base relations is a security invoker view, it + will be treated as if it had been accessed directly from the original + query. Thus, a security invoker view will always check its underlying + base relations using the permissions of the current user, even if it is + accessed from a view without the security_invoker + property. + + + + If any of the underlying base relations has + row-level security enabled, then + by default, the row-level security policies of the view owner are applied, + and access to any additional relations referred to by those policies is + determined by the permissions of the view owner. However, if the view has + security_invoker set to true, then + the policies and permissions of the invoking user are used instead, as if + the base relations had been referenced directly from the query using the + view. + + + + Functions called in the view are treated the same as if they had been + called directly from the query using the view. Therefore, the user of a view must have permissions to call all functions used by the view. + Functions in the view are executed with the privileges of the user + executing the query or the function owner, depending on whether the + functions are defined as SECURITY INVOKER or + SECURITY DEFINER. Thus, for example, calling + CURRENT_USER directly in a view will always return the + invoking user, not the view owner. This is not affected by the view's + security_invoker setting, and so a view with + security_invoker set to false is + not equivalent to a + SECURITY DEFINER function and those concepts should not + be confused. + + + + The user creating or replacing a view must have USAGE + privileges on any schemas referred to in the view query, in order to look + up the referenced objects in those schemas. Note, however, that this + lookup only happens when the view is created or replaced. Therefore, the + user of the view only requires the USAGE privilege on + the schema containing the view, not on the schemas referred to in the view + query, even for a security invoker view. - When CREATE OR REPLACE VIEW is used on an - existing view, only the view's defining SELECT rule is changed. + When CREATE OR REPLACE VIEW is used on an existing + view, only the view's defining SELECT rule, plus any + WITH ( ... ) parameters and its + CHECK OPTION are changed. Other view properties, including ownership, permissions, and non-SELECT rules, remain unchanged. You must own the view to replace it (this includes being a member of the owning role). @@ -387,10 +456,13 @@ CREATE VIEW vista AS SELECT text 'Hello World' AS hello; Note that the user performing the insert, update or delete on the view must have the corresponding insert, update or delete privilege on the - view. In addition the view's owner must have the relevant privileges on - the underlying base relations, but the user performing the update does - not need any permissions on the underlying base relations (see - ). + view. In addition, by default, the view's owner must have the relevant + privileges on the underlying base relations, whereas the user performing + the update does not need any permissions on the underlying base relations + (see ). However, if the view has + security_invoker set to true, the + user performing the update, rather than the view owner, must have the + relevant privileges on the underlying base relations. @@ -486,7 +558,8 @@ UNION ALL CREATE OR REPLACE VIEW is a PostgreSQL language extension. So is the concept of a temporary view. - The WITH ( ... ) clause is an extension as well. + The WITH ( ... ) clause is an extension as well, as are + security barrier views and security invoker views. diff --git a/doc/src/sgml/ref/lock.sgml b/doc/src/sgml/ref/lock.sgml index 4cdfae2279..19e7194207 100644 --- a/doc/src/sgml/ref/lock.sgml +++ b/doc/src/sgml/ref/lock.sgml @@ -174,10 +174,15 @@ LOCK [ TABLE ] [ ONLY ] name [ * ] - The user performing the lock on the view must have the corresponding privilege - on the view. In addition the view's owner must have the relevant privileges on - the underlying base relations, but the user performing the lock does - not need any permissions on the underlying base relations. + The user performing the lock on the view must have the corresponding + privilege on the view. In addition, by default, the view's owner must + have the relevant privileges on the underlying base relations, whereas the + user performing the lock does not need any permissions on the underlying + base relations. However, if the view has + security_invoker set to true + (see CREATE VIEW), + the user performing the lock, rather than the view owner, must have the + relevant privileges on the underlying base relations. diff --git a/doc/src/sgml/rules.sgml b/doc/src/sgml/rules.sgml index 4aa4e00e01..4b2ba5a4e6 100644 --- a/doc/src/sgml/rules.sgml +++ b/doc/src/sgml/rules.sgml @@ -2007,11 +2007,14 @@ SELECT * FROM shoelace; a relation (table or view) is automatically the owner of the rewrite rules that are defined for it. The PostgreSQL rule system changes the - behavior of the default access control system. Relations that - are used due to rules get checked against the + behavior of the default access control system. With the exception of + SELECT rules associated with security invoker views + (see CREATE VIEW), + all relations that are used due to rules get checked against the privileges of the rule owner, not the user invoking the rule. - This means that users only need the required privileges - for the tables/views that are explicitly named in their queries. + This means that, except for security invoker views, users only need the + required privileges for the tables/views that are explicitly named in + their queries. diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index d592655258..599e160ca6 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -140,6 +140,15 @@ static relopt_bool boolRelOpts[] = }, false }, + { + { + "security_invoker", + "Privileges on underlying relations are checked as the invoking user, not the view owner", + RELOPT_KIND_VIEW, + AccessExclusiveLock + }, + false + }, { { "vacuum_truncate", @@ -1996,6 +2005,8 @@ view_reloptions(Datum reloptions, bool validate) static const relopt_parse_elt tab[] = { {"security_barrier", RELOPT_TYPE_BOOL, offsetof(ViewOptions, security_barrier)}, + {"security_invoker", RELOPT_TYPE_BOOL, + offsetof(ViewOptions, security_invoker)}, {"check_option", RELOPT_TYPE_ENUM, offsetof(ViewOptions, check_option)} }; diff --git a/src/backend/commands/lockcmds.c b/src/backend/commands/lockcmds.c index 4b3f79704f..b97b8b0435 100644 --- a/src/backend/commands/lockcmds.c +++ b/src/backend/commands/lockcmds.c @@ -169,7 +169,7 @@ typedef struct { LOCKMODE lockmode; /* lock mode to use */ bool nowait; /* no wait mode */ - Oid viewowner; /* view owner for checking the privilege */ + Oid check_as_user; /* user for checking the privilege */ Oid viewoid; /* OID of the view to be locked */ List *ancestor_views; /* OIDs of ancestor views */ } LockViewRecurse_context; @@ -215,8 +215,12 @@ LockViewRecurse_walker(Node *node, LockViewRecurse_context *context) if (list_member_oid(context->ancestor_views, relid)) continue; - /* Check permissions with the view owner's privilege. */ - aclresult = LockTableAclCheck(relid, context->lockmode, context->viewowner); + /* + * Check permissions as the specified user. This will either be + * the view owner or the current user. + */ + aclresult = LockTableAclCheck(relid, context->lockmode, + context->check_as_user); if (aclresult != ACLCHECK_OK) aclcheck_error(aclresult, get_relkind_objtype(relkind), relname); @@ -259,9 +263,16 @@ LockViewRecurse(Oid reloid, LOCKMODE lockmode, bool nowait, view = table_open(reloid, NoLock); viewquery = get_view_query(view); + /* + * If the view has the security_invoker property set, check permissions as + * the current user. Otherwise, check permissions as the view owner. + */ context.lockmode = lockmode; context.nowait = nowait; - context.viewowner = view->rd_rel->relowner; + if (RelationHasSecurityInvoker(view)) + context.check_as_user = GetUserId(); + else + context.check_as_user = view->rd_rel->relowner; context.viewoid = reloid; context.ancestor_views = lappend_oid(ancestor_views, reloid); diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index 3d82138cb3..4eeed580b1 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -3242,18 +3242,24 @@ rewriteTargetView(Query *parsetree, Relation view) 0); /* - * Mark the new target RTE for the permissions checks that we want to - * enforce against the view owner, as distinct from the query caller. At - * the relation level, require the same INSERT/UPDATE/DELETE permissions - * that the query caller needs against the view. We drop the ACL_SELECT - * bit that is presumably in new_rte->requiredPerms initially. + * If the view has "security_invoker" set, mark the new target RTE for the + * permissions checks that we want to enforce against the query caller. + * Otherwise we want to enforce them against the view owner. + * + * At the relation level, require the same INSERT/UPDATE/DELETE + * permissions that the query caller needs against the view. We drop the + * ACL_SELECT bit that is presumably in new_rte->requiredPerms initially. * * Note: the original view RTE remains in the query's rangetable list. * Although it will be unused in the query plan, we need it there so that * the executor still performs appropriate permissions checks for the * query caller's use of the view. */ - new_rte->checkAsUser = view->rd_rel->relowner; + if (RelationHasSecurityInvoker(view)) + new_rte->checkAsUser = InvalidOid; + else + new_rte->checkAsUser = view->rd_rel->relowner; + new_rte->requiredPerms = view_rte->requiredPerms; /* diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index fccffce572..fbd11883e1 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -722,6 +722,8 @@ RelationBuildTupleDesc(Relation relation) * entry, because that keeps the update logic in RelationClearRelation() * manageable. The other subsidiary data structures are simple enough * to be easy to free explicitly, anyway. + * + * Note: The relation's reloptions must have been extracted first. */ static void RelationBuildRuleLock(Relation relation) @@ -787,6 +789,7 @@ RelationBuildRuleLock(Relation relation) Datum rule_datum; char *rule_str; RewriteRule *rule; + Oid check_as_user; rule = (RewriteRule *) MemoryContextAlloc(rulescxt, sizeof(RewriteRule)); @@ -826,10 +829,23 @@ RelationBuildRuleLock(Relation relation) pfree(rule_str); /* - * We want the rule's table references to be checked as though by the - * table owner, not the user referencing the rule. Therefore, scan - * through the rule's actions and set the checkAsUser field on all - * rtable entries. We have to look at the qual as well, in case it + * If this is a SELECT rule defining a view, and the view has + * "security_invoker" set, we must perform all permissions checks on + * relations referred to by the rule as the invoking user. + * + * In all other cases (including non-SELECT rules on security invoker + * views), perform the permissions checks as the relation owner. + */ + if (rule->event == CMD_SELECT && + relation->rd_rel->relkind == RELKIND_VIEW && + RelationHasSecurityInvoker(relation)) + check_as_user = InvalidOid; + else + check_as_user = relation->rd_rel->relowner; + + /* + * Scan through the rule's actions and set the checkAsUser field on + * all rtable entries. We have to look at the qual as well, in case it * contains sublinks. * * The reason for doing this when the rule is loaded, rather than when @@ -838,8 +854,8 @@ RelationBuildRuleLock(Relation relation) * the rule tree during load is relatively cheap (compared to * constructing it in the first place), so we do it here. */ - setRuleCheckAsUser((Node *) rule->actions, relation->rd_rel->relowner); - setRuleCheckAsUser(rule->qual, relation->rd_rel->relowner); + setRuleCheckAsUser((Node *) rule->actions, check_as_user); + setRuleCheckAsUser(rule->qual, check_as_user); if (numlocks >= maxlocks) { @@ -1164,27 +1180,6 @@ RelationBuildDesc(Oid targetRelId, bool insertIt) */ RelationBuildTupleDesc(relation); - /* - * Fetch rules and triggers that affect this relation - */ - if (relation->rd_rel->relhasrules) - RelationBuildRuleLock(relation); - else - { - relation->rd_rules = NULL; - relation->rd_rulescxt = NULL; - } - - if (relation->rd_rel->relhastriggers) - RelationBuildTriggers(relation); - else - relation->trigdesc = NULL; - - if (relation->rd_rel->relrowsecurity) - RelationBuildRowSecurity(relation); - else - relation->rd_rsdesc = NULL; - /* foreign key data is not loaded till asked for */ relation->rd_fkeylist = NIL; relation->rd_fkeyvalid = false; @@ -1216,6 +1211,30 @@ RelationBuildDesc(Oid targetRelId, bool insertIt) /* extract reloptions if any */ RelationParseRelOptions(relation, pg_class_tuple); + /* + * Fetch rules and triggers that affect this relation. + * + * Note that RelationBuildRuleLock() relies on this being done after + * extracting the relation's reloptions. + */ + if (relation->rd_rel->relhasrules) + RelationBuildRuleLock(relation); + else + { + relation->rd_rules = NULL; + relation->rd_rulescxt = NULL; + } + + if (relation->rd_rel->relhastriggers) + RelationBuildTriggers(relation); + else + relation->trigdesc = NULL; + + if (relation->rd_rel->relrowsecurity) + RelationBuildRowSecurity(relation); + else + relation->rd_rsdesc = NULL; + /* * initialize the relation lock manager information */ diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 3b4ab65ae2..7a8ed943b7 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -398,6 +398,7 @@ typedef struct ViewOptions { int32 vl_len_; /* varlena header (do not touch directly!) */ bool security_barrier; + bool security_invoker; ViewOptCheckOption check_option; } ViewOptions; @@ -411,6 +412,16 @@ typedef struct ViewOptions (relation)->rd_options ? \ ((ViewOptions *) (relation)->rd_options)->security_barrier : false) +/* + * RelationHasSecurityInvoker + * Returns true if the relation has the security_invoker property set. + * Note multiple eval of argument! + */ +#define RelationHasSecurityInvoker(relation) \ + (AssertMacro(relation->rd_rel->relkind == RELKIND_VIEW), \ + (relation)->rd_options ? \ + ((ViewOptions *) (relation)->rd_options)->security_invoker : false) + /* * RelationHasCheckOption * Returns true if the relation is a view defined with either the local diff --git a/src/test/regress/expected/create_view.out b/src/test/regress/expected/create_view.out index ae7c04353c..32385bbb0e 100644 --- a/src/test/regress/expected/create_view.out +++ b/src/test/regress/expected/create_view.out @@ -296,17 +296,31 @@ ERROR: invalid value for boolean option "security_barrier": 100 CREATE VIEW mysecview6 WITH (invalid_option) -- Error AS SELECT * FROM tbl1 WHERE a < 100; ERROR: unrecognized parameter "invalid_option" +CREATE VIEW mysecview7 WITH (security_invoker=true) + AS SELECT * FROM tbl1 WHERE a = 100; +CREATE VIEW mysecview8 WITH (security_invoker=false, security_barrier=true) + AS SELECT * FROM tbl1 WHERE a > 100; +CREATE VIEW mysecview9 WITH (security_invoker) + AS SELECT * FROM tbl1 WHERE a < 100; +CREATE VIEW mysecview10 WITH (security_invoker=100) -- Error + AS SELECT * FROM tbl1 WHERE a <> 100; +ERROR: invalid value for boolean option "security_invoker": 100 SELECT relname, relkind, reloptions FROM pg_class WHERE oid in ('mysecview1'::regclass, 'mysecview2'::regclass, - 'mysecview3'::regclass, 'mysecview4'::regclass) + 'mysecview3'::regclass, 'mysecview4'::regclass, + 'mysecview7'::regclass, 'mysecview8'::regclass, + 'mysecview9'::regclass) ORDER BY relname; - relname | relkind | reloptions -------------+---------+-------------------------- + relname | relkind | reloptions +------------+---------+------------------------------------------------ mysecview1 | v | mysecview2 | v | {security_barrier=true} mysecview3 | v | {security_barrier=false} mysecview4 | v | {security_barrier=true} -(4 rows) + mysecview7 | v | {security_invoker=true} + mysecview8 | v | {security_invoker=false,security_barrier=true} + mysecview9 | v | {security_invoker=true} +(7 rows) CREATE OR REPLACE VIEW mysecview1 AS SELECT * FROM tbl1 WHERE a = 256; @@ -316,17 +330,28 @@ CREATE OR REPLACE VIEW mysecview3 WITH (security_barrier=true) AS SELECT * FROM tbl1 WHERE a < 256; CREATE OR REPLACE VIEW mysecview4 WITH (security_barrier=false) AS SELECT * FROM tbl1 WHERE a <> 256; +CREATE OR REPLACE VIEW mysecview7 + AS SELECT * FROM tbl1 WHERE a > 256; +CREATE OR REPLACE VIEW mysecview8 WITH (security_invoker=true) + AS SELECT * FROM tbl1 WHERE a < 256; +CREATE OR REPLACE VIEW mysecview9 WITH (security_invoker=false, security_barrier=true) + AS SELECT * FROM tbl1 WHERE a <> 256; SELECT relname, relkind, reloptions FROM pg_class WHERE oid in ('mysecview1'::regclass, 'mysecview2'::regclass, - 'mysecview3'::regclass, 'mysecview4'::regclass) + 'mysecview3'::regclass, 'mysecview4'::regclass, + 'mysecview7'::regclass, 'mysecview8'::regclass, + 'mysecview9'::regclass) ORDER BY relname; - relname | relkind | reloptions -------------+---------+-------------------------- + relname | relkind | reloptions +------------+---------+------------------------------------------------ mysecview1 | v | mysecview2 | v | mysecview3 | v | {security_barrier=true} mysecview4 | v | {security_barrier=false} -(4 rows) + mysecview7 | v | + mysecview8 | v | {security_invoker=true} + mysecview9 | v | {security_invoker=false,security_barrier=true} +(7 rows) -- Check that unknown literals are converted to "text" in CREATE VIEW, -- so that we don't end up with unknown-type columns. @@ -2039,7 +2064,7 @@ drop cascades to view aliased_view_2 drop cascades to view aliased_view_3 drop cascades to view aliased_view_4 DROP SCHEMA testviewschm2 CASCADE; -NOTICE: drop cascades to 74 other objects +NOTICE: drop cascades to 77 other objects DETAIL: drop cascades to table t1 drop cascades to view temporal1 drop cascades to view temporal2 @@ -2060,6 +2085,9 @@ drop cascades to view mysecview1 drop cascades to view mysecview2 drop cascades to view mysecview3 drop cascades to view mysecview4 +drop cascades to view mysecview7 +drop cascades to view mysecview8 +drop cascades to view mysecview9 drop cascades to view unspecified_types drop cascades to table tt1 drop cascades to table tx1 diff --git a/src/test/regress/expected/lock.out b/src/test/regress/expected/lock.out index 01d467a6e0..ad137d3645 100644 --- a/src/test/regress/expected/lock.out +++ b/src/test/regress/expected/lock.out @@ -156,9 +156,75 @@ BEGIN; LOCK TABLE ONLY lock_tbl1; ROLLBACK; RESET ROLE; +REVOKE UPDATE ON TABLE lock_tbl1 FROM regress_rol_lock1; +-- Tables referred to by views are locked without explicit permission to do so +-- as long as we have permission to lock the view itself. +SET ROLE regress_rol_lock1; +-- fail without permissions on the view +BEGIN; +LOCK TABLE lock_view1; +ERROR: permission denied for view lock_view1 +ROLLBACK; +RESET ROLE; +GRANT UPDATE ON TABLE lock_view1 TO regress_rol_lock1; +SET ROLE regress_rol_lock1; +BEGIN; +LOCK TABLE lock_view1 IN ACCESS EXCLUSIVE MODE; +-- lock_view1 and lock_tbl1 (plus children lock_tbl2 and lock_tbl3) are locked. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'AccessExclusiveLock' + order by relname; + relname +------------ + lock_tbl1 + lock_tbl2 + lock_tbl3 + lock_view1 +(4 rows) + +ROLLBACK; +RESET ROLE; +REVOKE UPDATE ON TABLE lock_view1 FROM regress_rol_lock1; +-- Tables referred to by security invoker views require explicit permission to +-- be locked. +CREATE VIEW lock_view8 WITH (security_invoker) AS SELECT * FROM lock_tbl1; +SET ROLE regress_rol_lock1; +-- fail without permissions on the view +BEGIN; +LOCK TABLE lock_view8; +ERROR: permission denied for view lock_view8 +ROLLBACK; +RESET ROLE; +GRANT UPDATE ON TABLE lock_view8 TO regress_rol_lock1; +SET ROLE regress_rol_lock1; +-- fail without permissions on the table referenced by the view +BEGIN; +LOCK TABLE lock_view8; +ERROR: permission denied for table lock_tbl1 +ROLLBACK; +RESET ROLE; +GRANT UPDATE ON TABLE lock_tbl1 TO regress_rol_lock1; +BEGIN; +LOCK TABLE lock_view8 IN ACCESS EXCLUSIVE MODE; +-- lock_view8 and lock_tbl1 (plus children lock_tbl2 and lock_tbl3) are locked. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'AccessExclusiveLock' + order by relname; + relname +------------ + lock_tbl1 + lock_tbl2 + lock_tbl3 + lock_view8 +(4 rows) + +ROLLBACK; +RESET ROLE; +REVOKE UPDATE ON TABLE lock_view8 FROM regress_rol_lock1; -- -- Clean up -- +DROP VIEW lock_view8; DROP VIEW lock_view7; DROP VIEW lock_view6; DROP VIEW lock_view5; diff --git a/src/test/regress/expected/rowsecurity.out b/src/test/regress/expected/rowsecurity.out index 89397e41f0..d32a40ede3 100644 --- a/src/test/regress/expected/rowsecurity.out +++ b/src/test/regress/expected/rowsecurity.out @@ -2431,6 +2431,182 @@ ERROR: permission denied for view rls_view -- Query as role that is not the owner of the table or view with permissions. SET SESSION AUTHORIZATION regress_rls_bob; GRANT SELECT ON rls_view TO regress_rls_carol; +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; +NOTICE: f_leak => bbb +NOTICE: f_leak => dad + a | b +---+----- + 2 | bbb + 4 | dad +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 0) AND f_leak(b)) +(2 rows) + +-- Policy requiring access to another table. +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE z1_blacklist (a int); +INSERT INTO z1_blacklist VALUES (3), (4); +CREATE POLICY p3 ON z1 AS RESTRICTIVE USING (a NOT IN (SELECT a FROM z1_blacklist)); +-- Query as role that is not owner of table but is owner of view without permissions. +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; --fail - permission denied. +ERROR: permission denied for table z1_blacklist +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --fail - permission denied. +ERROR: permission denied for table z1_blacklist +-- Query as role that is not the owner of the table or view without permissions. +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; --fail - permission denied. +ERROR: permission denied for table z1_blacklist +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --fail - permission denied. +ERROR: permission denied for table z1_blacklist +-- Query as role that is not owner of table but is owner of view with permissions. +SET SESSION AUTHORIZATION regress_rls_alice; +GRANT SELECT ON z1_blacklist TO regress_rls_bob; +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; +NOTICE: f_leak => bbb + a | b +---+----- + 2 | bbb +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +---------------------------------------------------------------------- + Seq Scan on z1 + Filter: ((NOT (hashed SubPlan 1)) AND ((a % 2) = 0) AND f_leak(b)) + SubPlan 1 + -> Seq Scan on z1_blacklist +(4 rows) + +-- Query as role that is not the owner of the table or view with permissions. +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; +NOTICE: f_leak => bbb + a | b +---+----- + 2 | bbb +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +---------------------------------------------------------------------- + Seq Scan on z1 + Filter: ((NOT (hashed SubPlan 1)) AND ((a % 2) = 0) AND f_leak(b)) + SubPlan 1 + -> Seq Scan on z1_blacklist +(4 rows) + +SET SESSION AUTHORIZATION regress_rls_alice; +REVOKE SELECT ON z1_blacklist FROM regress_rls_bob; +DROP POLICY p3 ON z1; +SET SESSION AUTHORIZATION regress_rls_bob; +DROP VIEW rls_view; +-- +-- Security invoker views should follow policy for current user. +-- +-- View and table owner are the same. +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE VIEW rls_view WITH (security_invoker) AS + SELECT * FROM z1 WHERE f_leak(b); +GRANT SELECT ON rls_view TO regress_rls_bob; +GRANT SELECT ON rls_view TO regress_rls_carol; +-- Query as table owner. Should return all records. +SELECT * FROM rls_view; +NOTICE: f_leak => aba +NOTICE: f_leak => bbb +NOTICE: f_leak => ccc +NOTICE: f_leak => dad + a | b +---+----- + 1 | aba + 2 | bbb + 3 | ccc + 4 | dad +(4 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +--------------------- + Seq Scan on z1 + Filter: f_leak(b) +(2 rows) + +-- Queries as other users. +-- Should return records based on current user's policies. +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; +NOTICE: f_leak => bbb +NOTICE: f_leak => dad + a | b +---+----- + 2 | bbb + 4 | dad +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 0) AND f_leak(b)) +(2 rows) + +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; +NOTICE: f_leak => aba +NOTICE: f_leak => ccc + a | b +---+----- + 1 | aba + 3 | ccc +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 1) AND f_leak(b)) +(2 rows) + +-- View and table owners are different. +SET SESSION AUTHORIZATION regress_rls_alice; +DROP VIEW rls_view; +SET SESSION AUTHORIZATION regress_rls_bob; +CREATE VIEW rls_view WITH (security_invoker) AS + SELECT * FROM z1 WHERE f_leak(b); +GRANT SELECT ON rls_view TO regress_rls_alice; +GRANT SELECT ON rls_view TO regress_rls_carol; +-- Query as table owner. Should return all records. +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM rls_view; +NOTICE: f_leak => aba +NOTICE: f_leak => bbb +NOTICE: f_leak => ccc +NOTICE: f_leak => dad + a | b +---+----- + 1 | aba + 2 | bbb + 3 | ccc + 4 | dad +(4 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +--------------------- + Seq Scan on z1 + Filter: f_leak(b) +(2 rows) + +-- Queries as other users. +-- Should return records based on current user's policies. +SET SESSION AUTHORIZATION regress_rls_bob; SELECT * FROM rls_view; NOTICE: f_leak => bbb NOTICE: f_leak => dad @@ -2447,6 +2623,84 @@ EXPLAIN (COSTS OFF) SELECT * FROM rls_view; Filter: (((a % 2) = 0) AND f_leak(b)) (2 rows) +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; +NOTICE: f_leak => aba +NOTICE: f_leak => ccc + a | b +---+----- + 1 | aba + 3 | ccc +(2 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +----------------------------------------- + Seq Scan on z1 + Filter: (((a % 2) = 1) AND f_leak(b)) +(2 rows) + +-- Policy requiring access to another table. +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE POLICY p3 ON z1 AS RESTRICTIVE USING (a NOT IN (SELECT a FROM z1_blacklist)); +-- Query as role that is not owner of table but is owner of view without permissions. +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; --fail - permission denied. +ERROR: permission denied for table z1_blacklist +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --fail - permission denied. +ERROR: permission denied for table z1_blacklist +-- Query as role that is not the owner of the table or view without permissions. +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; --fail - permission denied. +ERROR: permission denied for table z1_blacklist +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --fail - permission denied. +ERROR: permission denied for table z1_blacklist +-- Query as role that is not owner of table but is owner of view with permissions. +SET SESSION AUTHORIZATION regress_rls_alice; +GRANT SELECT ON z1_blacklist TO regress_rls_bob; +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; +NOTICE: f_leak => bbb + a | b +---+----- + 2 | bbb +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +---------------------------------------------------------------------- + Seq Scan on z1 + Filter: ((NOT (hashed SubPlan 1)) AND ((a % 2) = 0) AND f_leak(b)) + SubPlan 1 + -> Seq Scan on z1_blacklist +(4 rows) + +-- Query as role that is not the owner of the table or view without permissions. +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; --fail - permission denied. +ERROR: permission denied for table z1_blacklist +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --fail - permission denied. +ERROR: permission denied for table z1_blacklist +-- Query as role that is not the owner of the table or view with permissions. +SET SESSION AUTHORIZATION regress_rls_alice; +GRANT SELECT ON z1_blacklist TO regress_rls_carol; +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; +NOTICE: f_leak => aba + a | b +---+----- + 1 | aba +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + QUERY PLAN +---------------------------------------------------------------------- + Seq Scan on z1 + Filter: ((NOT (hashed SubPlan 1)) AND ((a % 2) = 1) AND f_leak(b)) + SubPlan 1 + -> Seq Scan on z1_blacklist +(4 rows) + SET SESSION AUTHORIZATION regress_rls_bob; DROP VIEW rls_view; -- @@ -3987,7 +4241,7 @@ RESET SESSION AUTHORIZATION; -- RESET SESSION AUTHORIZATION; DROP SCHEMA regress_rls_schema CASCADE; -NOTICE: drop cascades to 29 other objects +NOTICE: drop cascades to 30 other objects DETAIL: drop cascades to function f_leak(text) drop cascades to table uaccount drop cascades to table category @@ -4005,6 +4259,7 @@ drop cascades to table b1 drop cascades to view bv1 drop cascades to table z1 drop cascades to table z2 +drop cascades to table z1_blacklist drop cascades to table x1 drop cascades to table y1 drop cascades to table y2 diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index ac468568a1..6cb6388880 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -3496,3 +3496,33 @@ SELECT * FROM ruletest2; DROP TABLE ruletest1; DROP TABLE ruletest2; +-- +-- Test non-SELECT rule on security invoker view. +-- Should use view owner's permissions. +-- +CREATE USER regress_rule_user1; +CREATE TABLE ruletest_t1 (x int); +CREATE TABLE ruletest_t2 (x int); +CREATE VIEW ruletest_v1 WITH (security_invoker=true) AS + SELECT * FROM ruletest_t1; +GRANT INSERT ON ruletest_v1 TO regress_rule_user1; +CREATE RULE rule1 AS ON INSERT TO ruletest_v1 + DO INSTEAD INSERT INTO ruletest_t2 VALUES (NEW.*); +SET SESSION AUTHORIZATION regress_rule_user1; +INSERT INTO ruletest_v1 VALUES (1); +RESET SESSION AUTHORIZATION; +SELECT * FROM ruletest_t1; + x +--- +(0 rows) + +SELECT * FROM ruletest_t2; + x +--- + 1 +(1 row) + +DROP VIEW ruletest_v1; +DROP TABLE ruletest_t2; +DROP TABLE ruletest_t1; +DROP USER regress_rule_user1; diff --git a/src/test/regress/expected/updatable_views.out b/src/test/regress/expected/updatable_views.out index cdff914b93..d57eeb761c 100644 --- a/src/test/regress/expected/updatable_views.out +++ b/src/test/regress/expected/updatable_views.out @@ -979,6 +979,7 @@ drop cascades to function rw_view1_aa(rw_view1) -- permissions checks CREATE USER regress_view_user1; CREATE USER regress_view_user2; +CREATE USER regress_view_user3; SET SESSION AUTHORIZATION regress_view_user1; CREATE TABLE base_tbl(a int, b text, c float); INSERT INTO base_tbl VALUES (1, 'Row 1', 1.0); @@ -1205,8 +1206,244 @@ DROP TABLE base_tbl CASCADE; NOTICE: drop cascades to 2 other objects DETAIL: drop cascades to view rw_view1 drop cascades to view rw_view2 +-- security invoker view permissions +SET SESSION AUTHORIZATION regress_view_user1; +CREATE TABLE base_tbl(a int, b text, c float); +INSERT INTO base_tbl VALUES (1, 'Row 1', 1.0); +CREATE VIEW rw_view1 AS SELECT b AS bb, c AS cc, a AS aa FROM base_tbl; +ALTER VIEW rw_view1 SET (security_invoker = true); +INSERT INTO rw_view1 VALUES ('Row 2', 2.0, 2); +GRANT SELECT ON rw_view1 TO regress_view_user2; +GRANT UPDATE (bb,cc) ON rw_view1 TO regress_view_user2; +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM base_tbl; -- not allowed +ERROR: permission denied for table base_tbl +SELECT * FROM rw_view1; -- not allowed +ERROR: permission denied for table base_tbl +INSERT INTO base_tbl VALUES (3, 'Row 3', 3.0); -- not allowed +ERROR: permission denied for table base_tbl +INSERT INTO rw_view1 VALUES ('Row 3', 3.0, 3); -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE base_tbl SET a=a; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view1 SET bb=bb, cc=cc; -- not allowed +ERROR: permission denied for table base_tbl +DELETE FROM base_tbl; -- not allowed +ERROR: permission denied for table base_tbl +DELETE FROM rw_view1; -- not allowed +ERROR: permission denied for view rw_view1 +SET SESSION AUTHORIZATION regress_view_user1; +GRANT SELECT ON base_tbl TO regress_view_user2; +GRANT UPDATE (a,c) ON base_tbl TO regress_view_user2; +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM base_tbl; -- ok + a | b | c +---+-------+--- + 1 | Row 1 | 1 + 2 | Row 2 | 2 +(2 rows) + +SELECT * FROM rw_view1; -- ok + bb | cc | aa +-------+----+---- + Row 1 | 1 | 1 + Row 2 | 2 | 2 +(2 rows) + +UPDATE base_tbl SET a=a, c=c; -- ok +UPDATE base_tbl SET b=b; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view1 SET cc=cc; -- ok +UPDATE rw_view1 SET aa=aa; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view1 SET bb=bb; -- not allowed +ERROR: permission denied for table base_tbl +SET SESSION AUTHORIZATION regress_view_user1; +GRANT INSERT, DELETE ON base_tbl TO regress_view_user2; +SET SESSION AUTHORIZATION regress_view_user2; +INSERT INTO base_tbl VALUES (3, 'Row 3', 3.0); -- ok +INSERT INTO rw_view1 VALUES ('Row 4', 4.0, 4); -- not allowed +ERROR: permission denied for view rw_view1 +DELETE FROM base_tbl WHERE a=1; -- ok +DELETE FROM rw_view1 WHERE aa=2; -- not allowed +ERROR: permission denied for view rw_view1 +SET SESSION AUTHORIZATION regress_view_user1; +REVOKE INSERT, DELETE ON base_tbl FROM regress_view_user2; +GRANT INSERT, DELETE ON rw_view1 TO regress_view_user2; +SET SESSION AUTHORIZATION regress_view_user2; +INSERT INTO rw_view1 VALUES ('Row 4', 4.0, 4); -- not allowed +ERROR: permission denied for table base_tbl +DELETE FROM rw_view1 WHERE aa=2; -- not allowed +ERROR: permission denied for table base_tbl +SET SESSION AUTHORIZATION regress_view_user1; +GRANT INSERT, DELETE ON base_tbl TO regress_view_user2; +SET SESSION AUTHORIZATION regress_view_user2; +INSERT INTO rw_view1 VALUES ('Row 4', 4.0, 4); -- ok +DELETE FROM rw_view1 WHERE aa=2; -- ok +SELECT * FROM base_tbl; -- ok + a | b | c +---+-------+--- + 3 | Row 3 | 3 + 4 | Row 4 | 4 +(2 rows) + +RESET SESSION AUTHORIZATION; +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to view rw_view1 +-- ordinary view on top of security invoker view permissions +CREATE TABLE base_tbl(a int, b text, c float); +INSERT INTO base_tbl VALUES (1, 'Row 1', 1.0); +SET SESSION AUTHORIZATION regress_view_user1; +CREATE VIEW rw_view1 AS SELECT b AS bb, c AS cc, a AS aa FROM base_tbl; +ALTER VIEW rw_view1 SET (security_invoker = true); +SELECT * FROM rw_view1; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view1 SET aa=aa; -- not allowed +ERROR: permission denied for table base_tbl +SET SESSION AUTHORIZATION regress_view_user2; +CREATE VIEW rw_view2 AS SELECT cc AS ccc, aa AS aaa, bb AS bbb FROM rw_view1; +GRANT SELECT, UPDATE ON rw_view2 TO regress_view_user3; +SELECT * FROM rw_view2; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET aaa=aaa; -- not allowed +ERROR: permission denied for view rw_view1 +RESET SESSION AUTHORIZATION; +GRANT SELECT ON base_tbl TO regress_view_user1; +GRANT UPDATE (a, b) ON base_tbl TO regress_view_user1; +SET SESSION AUTHORIZATION regress_view_user1; +SELECT * FROM rw_view1; -- ok + bb | cc | aa +-------+----+---- + Row 1 | 1 | 1 +(1 row) + +UPDATE rw_view1 SET aa=aa, bb=bb; -- ok +UPDATE rw_view1 SET cc=cc; -- not allowed +ERROR: permission denied for table base_tbl +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET aaa=aaa; -- not allowed +ERROR: permission denied for view rw_view1 +SET SESSION AUTHORIZATION regress_view_user3; +SELECT * FROM rw_view2; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET aaa=aaa; -- not allowed +ERROR: permission denied for view rw_view1 +SET SESSION AUTHORIZATION regress_view_user1; +GRANT SELECT ON rw_view1 TO regress_view_user2; +GRANT UPDATE (bb, cc) ON rw_view1 TO regress_view_user2; +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view2 SET bbb=bbb; -- not allowed +ERROR: permission denied for table base_tbl +SET SESSION AUTHORIZATION regress_view_user3; +SELECT * FROM rw_view2; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view2 SET bbb=bbb; -- not allowed +ERROR: permission denied for table base_tbl +RESET SESSION AUTHORIZATION; +GRANT SELECT ON base_tbl TO regress_view_user2; +GRANT UPDATE (a, c) ON base_tbl TO regress_view_user2; +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; -- ok + ccc | aaa | bbb +-----+-----+------- + 1 | 1 | Row 1 +(1 row) + +UPDATE rw_view2 SET aaa=aaa; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET bbb=bbb; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view2 SET ccc=ccc; -- ok +SET SESSION AUTHORIZATION regress_view_user3; +SELECT * FROM rw_view2; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view2 SET aaa=aaa; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET bbb=bbb; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view2 SET ccc=ccc; -- not allowed +ERROR: permission denied for table base_tbl +RESET SESSION AUTHORIZATION; +GRANT SELECT ON base_tbl TO regress_view_user3; +GRANT UPDATE (a, c) ON base_tbl TO regress_view_user3; +SET SESSION AUTHORIZATION regress_view_user3; +SELECT * FROM rw_view2; -- ok + ccc | aaa | bbb +-----+-----+------- + 1 | 1 | Row 1 +(1 row) + +UPDATE rw_view2 SET aaa=aaa; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET bbb=bbb; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view2 SET ccc=ccc; -- ok +RESET SESSION AUTHORIZATION; +REVOKE SELECT, UPDATE ON base_tbl FROM regress_view_user1; +SET SESSION AUTHORIZATION regress_view_user1; +SELECT * FROM rw_view1; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view1 SET aa=aa; -- not allowed +ERROR: permission denied for table base_tbl +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; -- ok + ccc | aaa | bbb +-----+-----+------- + 1 | 1 | Row 1 +(1 row) + +UPDATE rw_view2 SET aaa=aaa; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET bbb=bbb; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view2 SET ccc=ccc; -- ok +SET SESSION AUTHORIZATION regress_view_user3; +SELECT * FROM rw_view2; -- ok + ccc | aaa | bbb +-----+-----+------- + 1 | 1 | Row 1 +(1 row) + +UPDATE rw_view2 SET aaa=aaa; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET bbb=bbb; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view2 SET ccc=ccc; -- ok +RESET SESSION AUTHORIZATION; +REVOKE SELECT, UPDATE ON base_tbl FROM regress_view_user2; +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view2 SET aaa=aaa; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET bbb=bbb; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view2 SET ccc=ccc; -- not allowed +ERROR: permission denied for table base_tbl +SET SESSION AUTHORIZATION regress_view_user3; +SELECT * FROM rw_view2; -- ok + ccc | aaa | bbb +-----+-----+------- + 1 | 1 | Row 1 +(1 row) + +UPDATE rw_view2 SET aaa=aaa; -- not allowed +ERROR: permission denied for view rw_view1 +UPDATE rw_view2 SET bbb=bbb; -- not allowed +ERROR: permission denied for table base_tbl +UPDATE rw_view2 SET ccc=ccc; -- ok +RESET SESSION AUTHORIZATION; +DROP TABLE base_tbl CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to view rw_view1 +drop cascades to view rw_view2 DROP USER regress_view_user1; DROP USER regress_view_user2; +DROP USER regress_view_user3; -- column defaults CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified', c serial); INSERT INTO base_tbl VALUES (1, 'Row 1'); diff --git a/src/test/regress/sql/create_view.sql b/src/test/regress/sql/create_view.sql index 829f3ddbe6..50acfe96e6 100644 --- a/src/test/regress/sql/create_view.sql +++ b/src/test/regress/sql/create_view.sql @@ -254,9 +254,19 @@ CREATE VIEW mysecview5 WITH (security_barrier=100) -- Error AS SELECT * FROM tbl1 WHERE a > 100; CREATE VIEW mysecview6 WITH (invalid_option) -- Error AS SELECT * FROM tbl1 WHERE a < 100; +CREATE VIEW mysecview7 WITH (security_invoker=true) + AS SELECT * FROM tbl1 WHERE a = 100; +CREATE VIEW mysecview8 WITH (security_invoker=false, security_barrier=true) + AS SELECT * FROM tbl1 WHERE a > 100; +CREATE VIEW mysecview9 WITH (security_invoker) + AS SELECT * FROM tbl1 WHERE a < 100; +CREATE VIEW mysecview10 WITH (security_invoker=100) -- Error + AS SELECT * FROM tbl1 WHERE a <> 100; SELECT relname, relkind, reloptions FROM pg_class WHERE oid in ('mysecview1'::regclass, 'mysecview2'::regclass, - 'mysecview3'::regclass, 'mysecview4'::regclass) + 'mysecview3'::regclass, 'mysecview4'::regclass, + 'mysecview7'::regclass, 'mysecview8'::regclass, + 'mysecview9'::regclass) ORDER BY relname; CREATE OR REPLACE VIEW mysecview1 @@ -267,9 +277,17 @@ CREATE OR REPLACE VIEW mysecview3 WITH (security_barrier=true) AS SELECT * FROM tbl1 WHERE a < 256; CREATE OR REPLACE VIEW mysecview4 WITH (security_barrier=false) AS SELECT * FROM tbl1 WHERE a <> 256; +CREATE OR REPLACE VIEW mysecview7 + AS SELECT * FROM tbl1 WHERE a > 256; +CREATE OR REPLACE VIEW mysecview8 WITH (security_invoker=true) + AS SELECT * FROM tbl1 WHERE a < 256; +CREATE OR REPLACE VIEW mysecview9 WITH (security_invoker=false, security_barrier=true) + AS SELECT * FROM tbl1 WHERE a <> 256; SELECT relname, relkind, reloptions FROM pg_class WHERE oid in ('mysecview1'::regclass, 'mysecview2'::regclass, - 'mysecview3'::regclass, 'mysecview4'::regclass) + 'mysecview3'::regclass, 'mysecview4'::regclass, + 'mysecview7'::regclass, 'mysecview8'::regclass, + 'mysecview9'::regclass) ORDER BY relname; -- Check that unknown literals are converted to "text" in CREATE VIEW, diff --git a/src/test/regress/sql/lock.sql b/src/test/regress/sql/lock.sql index b867e0f994..b88488c6d0 100644 --- a/src/test/regress/sql/lock.sql +++ b/src/test/regress/sql/lock.sql @@ -122,10 +122,59 @@ BEGIN; LOCK TABLE ONLY lock_tbl1; ROLLBACK; RESET ROLE; +REVOKE UPDATE ON TABLE lock_tbl1 FROM regress_rol_lock1; + +-- Tables referred to by views are locked without explicit permission to do so +-- as long as we have permission to lock the view itself. +SET ROLE regress_rol_lock1; +-- fail without permissions on the view +BEGIN; +LOCK TABLE lock_view1; +ROLLBACK; +RESET ROLE; +GRANT UPDATE ON TABLE lock_view1 TO regress_rol_lock1; +SET ROLE regress_rol_lock1; +BEGIN; +LOCK TABLE lock_view1 IN ACCESS EXCLUSIVE MODE; +-- lock_view1 and lock_tbl1 (plus children lock_tbl2 and lock_tbl3) are locked. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'AccessExclusiveLock' + order by relname; +ROLLBACK; +RESET ROLE; +REVOKE UPDATE ON TABLE lock_view1 FROM regress_rol_lock1; + +-- Tables referred to by security invoker views require explicit permission to +-- be locked. +CREATE VIEW lock_view8 WITH (security_invoker) AS SELECT * FROM lock_tbl1; +SET ROLE regress_rol_lock1; +-- fail without permissions on the view +BEGIN; +LOCK TABLE lock_view8; +ROLLBACK; +RESET ROLE; +GRANT UPDATE ON TABLE lock_view8 TO regress_rol_lock1; +SET ROLE regress_rol_lock1; +-- fail without permissions on the table referenced by the view +BEGIN; +LOCK TABLE lock_view8; +ROLLBACK; +RESET ROLE; +GRANT UPDATE ON TABLE lock_tbl1 TO regress_rol_lock1; +BEGIN; +LOCK TABLE lock_view8 IN ACCESS EXCLUSIVE MODE; +-- lock_view8 and lock_tbl1 (plus children lock_tbl2 and lock_tbl3) are locked. +select relname from pg_locks l, pg_class c + where l.relation = c.oid and relname like '%lock_%' and mode = 'AccessExclusiveLock' + order by relname; +ROLLBACK; +RESET ROLE; +REVOKE UPDATE ON TABLE lock_view8 FROM regress_rol_lock1; -- -- Clean up -- +DROP VIEW lock_view8; DROP VIEW lock_view7; DROP VIEW lock_view6; DROP VIEW lock_view5; diff --git a/src/test/regress/sql/rowsecurity.sql b/src/test/regress/sql/rowsecurity.sql index 44deb42bad..b310acdd27 100644 --- a/src/test/regress/sql/rowsecurity.sql +++ b/src/test/regress/sql/rowsecurity.sql @@ -912,6 +912,128 @@ EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --fail - permission denied. -- Query as role that is not the owner of the table or view with permissions. SET SESSION AUTHORIZATION regress_rls_bob; GRANT SELECT ON rls_view TO regress_rls_carol; + +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + +-- Policy requiring access to another table. +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE TABLE z1_blacklist (a int); +INSERT INTO z1_blacklist VALUES (3), (4); +CREATE POLICY p3 ON z1 AS RESTRICTIVE USING (a NOT IN (SELECT a FROM z1_blacklist)); + +-- Query as role that is not owner of table but is owner of view without permissions. +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; --fail - permission denied. +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --fail - permission denied. + +-- Query as role that is not the owner of the table or view without permissions. +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; --fail - permission denied. +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --fail - permission denied. + +-- Query as role that is not owner of table but is owner of view with permissions. +SET SESSION AUTHORIZATION regress_rls_alice; +GRANT SELECT ON z1_blacklist TO regress_rls_bob; + +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + +-- Query as role that is not the owner of the table or view with permissions. +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + +SET SESSION AUTHORIZATION regress_rls_alice; +REVOKE SELECT ON z1_blacklist FROM regress_rls_bob; +DROP POLICY p3 ON z1; + +SET SESSION AUTHORIZATION regress_rls_bob; +DROP VIEW rls_view; + +-- +-- Security invoker views should follow policy for current user. +-- +-- View and table owner are the same. +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE VIEW rls_view WITH (security_invoker) AS + SELECT * FROM z1 WHERE f_leak(b); +GRANT SELECT ON rls_view TO regress_rls_bob; +GRANT SELECT ON rls_view TO regress_rls_carol; + +-- Query as table owner. Should return all records. +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + +-- Queries as other users. +-- Should return records based on current user's policies. +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + +-- View and table owners are different. +SET SESSION AUTHORIZATION regress_rls_alice; +DROP VIEW rls_view; + +SET SESSION AUTHORIZATION regress_rls_bob; +CREATE VIEW rls_view WITH (security_invoker) AS + SELECT * FROM z1 WHERE f_leak(b); +GRANT SELECT ON rls_view TO regress_rls_alice; +GRANT SELECT ON rls_view TO regress_rls_carol; + +-- Query as table owner. Should return all records. +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + +-- Queries as other users. +-- Should return records based on current user's policies. +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + +-- Policy requiring access to another table. +SET SESSION AUTHORIZATION regress_rls_alice; +CREATE POLICY p3 ON z1 AS RESTRICTIVE USING (a NOT IN (SELECT a FROM z1_blacklist)); + +-- Query as role that is not owner of table but is owner of view without permissions. +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; --fail - permission denied. +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --fail - permission denied. + +-- Query as role that is not the owner of the table or view without permissions. +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; --fail - permission denied. +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --fail - permission denied. + +-- Query as role that is not owner of table but is owner of view with permissions. +SET SESSION AUTHORIZATION regress_rls_alice; +GRANT SELECT ON z1_blacklist TO regress_rls_bob; + +SET SESSION AUTHORIZATION regress_rls_bob; +SELECT * FROM rls_view; +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; + +-- Query as role that is not the owner of the table or view without permissions. +SET SESSION AUTHORIZATION regress_rls_carol; +SELECT * FROM rls_view; --fail - permission denied. +EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --fail - permission denied. + +-- Query as role that is not the owner of the table or view with permissions. +SET SESSION AUTHORIZATION regress_rls_alice; +GRANT SELECT ON z1_blacklist TO regress_rls_carol; + +SET SESSION AUTHORIZATION regress_rls_carol; SELECT * FROM rls_view; EXPLAIN (COSTS OFF) SELECT * FROM rls_view; diff --git a/src/test/regress/sql/rules.sql b/src/test/regress/sql/rules.sql index 8bdab6dec3..aae2ba32e8 100644 --- a/src/test/regress/sql/rules.sql +++ b/src/test/regress/sql/rules.sql @@ -1257,3 +1257,31 @@ SELECT * FROM ruletest2; DROP TABLE ruletest1; DROP TABLE ruletest2; + +-- +-- Test non-SELECT rule on security invoker view. +-- Should use view owner's permissions. +-- +CREATE USER regress_rule_user1; + +CREATE TABLE ruletest_t1 (x int); +CREATE TABLE ruletest_t2 (x int); +CREATE VIEW ruletest_v1 WITH (security_invoker=true) AS + SELECT * FROM ruletest_t1; +GRANT INSERT ON ruletest_v1 TO regress_rule_user1; + +CREATE RULE rule1 AS ON INSERT TO ruletest_v1 + DO INSTEAD INSERT INTO ruletest_t2 VALUES (NEW.*); + +SET SESSION AUTHORIZATION regress_rule_user1; +INSERT INTO ruletest_v1 VALUES (1); + +RESET SESSION AUTHORIZATION; +SELECT * FROM ruletest_t1; +SELECT * FROM ruletest_t2; + +DROP VIEW ruletest_v1; +DROP TABLE ruletest_t2; +DROP TABLE ruletest_t1; + +DROP USER regress_rule_user1; diff --git a/src/test/regress/sql/updatable_views.sql b/src/test/regress/sql/updatable_views.sql index 09328e582b..fa206a8fe7 100644 --- a/src/test/regress/sql/updatable_views.sql +++ b/src/test/regress/sql/updatable_views.sql @@ -410,6 +410,7 @@ DROP TABLE base_tbl CASCADE; CREATE USER regress_view_user1; CREATE USER regress_view_user2; +CREATE USER regress_view_user3; SET SESSION AUTHORIZATION regress_view_user1; CREATE TABLE base_tbl(a int, b text, c float); @@ -552,8 +553,187 @@ RESET SESSION AUTHORIZATION; DROP TABLE base_tbl CASCADE; +-- security invoker view permissions + +SET SESSION AUTHORIZATION regress_view_user1; +CREATE TABLE base_tbl(a int, b text, c float); +INSERT INTO base_tbl VALUES (1, 'Row 1', 1.0); +CREATE VIEW rw_view1 AS SELECT b AS bb, c AS cc, a AS aa FROM base_tbl; +ALTER VIEW rw_view1 SET (security_invoker = true); +INSERT INTO rw_view1 VALUES ('Row 2', 2.0, 2); +GRANT SELECT ON rw_view1 TO regress_view_user2; +GRANT UPDATE (bb,cc) ON rw_view1 TO regress_view_user2; + +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM base_tbl; -- not allowed +SELECT * FROM rw_view1; -- not allowed +INSERT INTO base_tbl VALUES (3, 'Row 3', 3.0); -- not allowed +INSERT INTO rw_view1 VALUES ('Row 3', 3.0, 3); -- not allowed +UPDATE base_tbl SET a=a; -- not allowed +UPDATE rw_view1 SET bb=bb, cc=cc; -- not allowed +DELETE FROM base_tbl; -- not allowed +DELETE FROM rw_view1; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user1; +GRANT SELECT ON base_tbl TO regress_view_user2; +GRANT UPDATE (a,c) ON base_tbl TO regress_view_user2; + +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM base_tbl; -- ok +SELECT * FROM rw_view1; -- ok +UPDATE base_tbl SET a=a, c=c; -- ok +UPDATE base_tbl SET b=b; -- not allowed +UPDATE rw_view1 SET cc=cc; -- ok +UPDATE rw_view1 SET aa=aa; -- not allowed +UPDATE rw_view1 SET bb=bb; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user1; +GRANT INSERT, DELETE ON base_tbl TO regress_view_user2; + +SET SESSION AUTHORIZATION regress_view_user2; +INSERT INTO base_tbl VALUES (3, 'Row 3', 3.0); -- ok +INSERT INTO rw_view1 VALUES ('Row 4', 4.0, 4); -- not allowed +DELETE FROM base_tbl WHERE a=1; -- ok +DELETE FROM rw_view1 WHERE aa=2; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user1; +REVOKE INSERT, DELETE ON base_tbl FROM regress_view_user2; +GRANT INSERT, DELETE ON rw_view1 TO regress_view_user2; + +SET SESSION AUTHORIZATION regress_view_user2; +INSERT INTO rw_view1 VALUES ('Row 4', 4.0, 4); -- not allowed +DELETE FROM rw_view1 WHERE aa=2; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user1; +GRANT INSERT, DELETE ON base_tbl TO regress_view_user2; + +SET SESSION AUTHORIZATION regress_view_user2; +INSERT INTO rw_view1 VALUES ('Row 4', 4.0, 4); -- ok +DELETE FROM rw_view1 WHERE aa=2; -- ok +SELECT * FROM base_tbl; -- ok + +RESET SESSION AUTHORIZATION; + +DROP TABLE base_tbl CASCADE; + +-- ordinary view on top of security invoker view permissions + +CREATE TABLE base_tbl(a int, b text, c float); +INSERT INTO base_tbl VALUES (1, 'Row 1', 1.0); + +SET SESSION AUTHORIZATION regress_view_user1; +CREATE VIEW rw_view1 AS SELECT b AS bb, c AS cc, a AS aa FROM base_tbl; +ALTER VIEW rw_view1 SET (security_invoker = true); +SELECT * FROM rw_view1; -- not allowed +UPDATE rw_view1 SET aa=aa; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user2; +CREATE VIEW rw_view2 AS SELECT cc AS ccc, aa AS aaa, bb AS bbb FROM rw_view1; +GRANT SELECT, UPDATE ON rw_view2 TO regress_view_user3; +SELECT * FROM rw_view2; -- not allowed +UPDATE rw_view2 SET aaa=aaa; -- not allowed + +RESET SESSION AUTHORIZATION; + +GRANT SELECT ON base_tbl TO regress_view_user1; +GRANT UPDATE (a, b) ON base_tbl TO regress_view_user1; + +SET SESSION AUTHORIZATION regress_view_user1; +SELECT * FROM rw_view1; -- ok +UPDATE rw_view1 SET aa=aa, bb=bb; -- ok +UPDATE rw_view1 SET cc=cc; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; -- not allowed +UPDATE rw_view2 SET aaa=aaa; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user3; +SELECT * FROM rw_view2; -- not allowed +UPDATE rw_view2 SET aaa=aaa; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user1; +GRANT SELECT ON rw_view1 TO regress_view_user2; +GRANT UPDATE (bb, cc) ON rw_view1 TO regress_view_user2; + +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; -- not allowed +UPDATE rw_view2 SET bbb=bbb; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user3; +SELECT * FROM rw_view2; -- not allowed +UPDATE rw_view2 SET bbb=bbb; -- not allowed + +RESET SESSION AUTHORIZATION; + +GRANT SELECT ON base_tbl TO regress_view_user2; +GRANT UPDATE (a, c) ON base_tbl TO regress_view_user2; + +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; -- ok +UPDATE rw_view2 SET aaa=aaa; -- not allowed +UPDATE rw_view2 SET bbb=bbb; -- not allowed +UPDATE rw_view2 SET ccc=ccc; -- ok + +SET SESSION AUTHORIZATION regress_view_user3; +SELECT * FROM rw_view2; -- not allowed +UPDATE rw_view2 SET aaa=aaa; -- not allowed +UPDATE rw_view2 SET bbb=bbb; -- not allowed +UPDATE rw_view2 SET ccc=ccc; -- not allowed + +RESET SESSION AUTHORIZATION; + +GRANT SELECT ON base_tbl TO regress_view_user3; +GRANT UPDATE (a, c) ON base_tbl TO regress_view_user3; + +SET SESSION AUTHORIZATION regress_view_user3; +SELECT * FROM rw_view2; -- ok +UPDATE rw_view2 SET aaa=aaa; -- not allowed +UPDATE rw_view2 SET bbb=bbb; -- not allowed +UPDATE rw_view2 SET ccc=ccc; -- ok + +RESET SESSION AUTHORIZATION; + +REVOKE SELECT, UPDATE ON base_tbl FROM regress_view_user1; + +SET SESSION AUTHORIZATION regress_view_user1; +SELECT * FROM rw_view1; -- not allowed +UPDATE rw_view1 SET aa=aa; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; -- ok +UPDATE rw_view2 SET aaa=aaa; -- not allowed +UPDATE rw_view2 SET bbb=bbb; -- not allowed +UPDATE rw_view2 SET ccc=ccc; -- ok + +SET SESSION AUTHORIZATION regress_view_user3; +SELECT * FROM rw_view2; -- ok +UPDATE rw_view2 SET aaa=aaa; -- not allowed +UPDATE rw_view2 SET bbb=bbb; -- not allowed +UPDATE rw_view2 SET ccc=ccc; -- ok + +RESET SESSION AUTHORIZATION; + +REVOKE SELECT, UPDATE ON base_tbl FROM regress_view_user2; + +SET SESSION AUTHORIZATION regress_view_user2; +SELECT * FROM rw_view2; -- not allowed +UPDATE rw_view2 SET aaa=aaa; -- not allowed +UPDATE rw_view2 SET bbb=bbb; -- not allowed +UPDATE rw_view2 SET ccc=ccc; -- not allowed + +SET SESSION AUTHORIZATION regress_view_user3; +SELECT * FROM rw_view2; -- ok +UPDATE rw_view2 SET aaa=aaa; -- not allowed +UPDATE rw_view2 SET bbb=bbb; -- not allowed +UPDATE rw_view2 SET ccc=ccc; -- ok + +RESET SESSION AUTHORIZATION; + +DROP TABLE base_tbl CASCADE; + DROP USER regress_view_user1; DROP USER regress_view_user2; +DROP USER regress_view_user3; -- column defaults From 29992a6a509b256efc4ac560a1586b51a64b2637 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 22 Mar 2022 10:19:15 -0400 Subject: [PATCH 204/772] Revert "graceful shutdown" changes for Windows. This reverts commits 6051857fc and ed52c3707 in HEAD (they were already reverted in the back branches). Further testing has shown that while those changes do fix some things, they also break others; in particular, it looks like walreceivers fail to detect walsender-initiated connection close reliably if the walsender shuts down this way. A proper fix for this seems possible but won't be done in time for v15. Discussion: https://postgr.es/m/CA+hUKG+OeoETZQ=Qw5Ub5h3tmwQhBmDA=nuNO3KG=zWfUypFAw@mail.gmail.com Discussion: https://postgr.es/m/CA+hUKGKkp2XkvSe9nG+bsgkXVKCdTeGSa_TR0Qx1jafc_oqCVA@mail.gmail.com --- src/backend/libpq/pqcomm.c | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index 47923b9e9d..7d3dc2a51f 100644 --- a/src/backend/libpq/pqcomm.c +++ b/src/backend/libpq/pqcomm.c @@ -277,30 +277,15 @@ socket_close(int code, Datum arg) secure_close(MyProcPort); /* - * On most platforms, we leave the socket open until the process dies. - * This allows clients to perform a "synchronous close" if they care - * --- wait till the transport layer reports connection closure, and - * you can be sure the backend has exited. Saves a kernel call, too. + * Formerly we did an explicit close() here, but it seems better to + * leave the socket open until the process dies. This allows clients + * to perform a "synchronous close" if they care --- wait till the + * transport layer reports connection closure, and you can be sure the + * backend has exited. * - * However, that does not work on Windows: if the kernel closes the - * socket it will invoke an "abortive shutdown" that discards any data - * not yet sent to the client. (This is a flat-out violation of the - * TCP RFCs, but count on Microsoft not to care about that.) To get - * the spec-compliant "graceful shutdown" behavior, we must invoke - * closesocket() explicitly. When using OpenSSL, it seems that clean - * shutdown also requires an explicit shutdown() call. - * - * This code runs late enough during process shutdown that we should - * have finished all externally-visible shutdown activities, so that - * in principle it's good enough to act as a synchronous close on - * Windows too. But it's a lot more fragile than the other way. + * We do set sock to PGINVALID_SOCKET to prevent any further I/O, + * though. */ -#ifdef WIN32 - shutdown(MyProcPort->sock, SD_SEND); - closesocket(MyProcPort->sock); -#endif - - /* In any case, set sock to PGINVALID_SOCKET to prevent further I/O */ MyProcPort->sock = PGINVALID_SOCKET; } } From d11e84ea466b4e3855d7bd5142fb68f51c273567 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Tue, 22 Mar 2022 09:06:15 -0400 Subject: [PATCH 205/772] Add String object access hooks This caters for cases where the access is to an object identified by name rather than Oid. The first user of these is the GUC access controls Joshua Brindle and Mark Dilger Discussion: https://postgr.es/m/47F87A0E-C0E5-43A6-89F6-D403F2B45175@enterprisedb.com --- src/backend/catalog/objectaccess.c | 140 +++++++++++++++++++++++++++-- src/backend/utils/misc/guc.c | 17 ++++ src/include/catalog/objectaccess.h | 70 ++++++++++++++- src/include/nodes/parsenodes.h | 4 +- src/include/utils/acl.h | 4 +- 5 files changed, 226 insertions(+), 9 deletions(-) diff --git a/src/backend/catalog/objectaccess.c b/src/backend/catalog/objectaccess.c index 549fac4539..38922294e2 100644 --- a/src/backend/catalog/objectaccess.c +++ b/src/backend/catalog/objectaccess.c @@ -20,11 +20,13 @@ * and logging plugins. */ object_access_hook_type object_access_hook = NULL; +object_access_hook_type_str object_access_hook_str = NULL; + /* * RunObjectPostCreateHook * - * It is entrypoint of OAT_POST_CREATE event + * OAT_POST_CREATE object ID based event hook entrypoint */ void RunObjectPostCreateHook(Oid classId, Oid objectId, int subId, @@ -46,7 +48,7 @@ RunObjectPostCreateHook(Oid classId, Oid objectId, int subId, /* * RunObjectDropHook * - * It is entrypoint of OAT_DROP event + * OAT_DROP object ID based event hook entrypoint */ void RunObjectDropHook(Oid classId, Oid objectId, int subId, @@ -68,7 +70,7 @@ RunObjectDropHook(Oid classId, Oid objectId, int subId, /* * RunObjectTruncateHook * - * It is the entrypoint of OAT_TRUNCATE event + * OAT_TRUNCATE object ID based event hook entrypoint */ void RunObjectTruncateHook(Oid objectId) @@ -84,7 +86,7 @@ RunObjectTruncateHook(Oid objectId) /* * RunObjectPostAlterHook * - * It is entrypoint of OAT_POST_ALTER event + * OAT_POST_ALTER object ID based event hook entrypoint */ void RunObjectPostAlterHook(Oid classId, Oid objectId, int subId, @@ -107,7 +109,7 @@ RunObjectPostAlterHook(Oid classId, Oid objectId, int subId, /* * RunNamespaceSearchHook * - * It is entrypoint of OAT_NAMESPACE_SEARCH event + * OAT_NAMESPACE_SEARCH object ID based event hook entrypoint */ bool RunNamespaceSearchHook(Oid objectId, bool ereport_on_violation) @@ -131,7 +133,7 @@ RunNamespaceSearchHook(Oid objectId, bool ereport_on_violation) /* * RunFunctionExecuteHook * - * It is entrypoint of OAT_FUNCTION_EXECUTE event + * OAT_FUNCTION_EXECUTE object ID based event hook entrypoint */ void RunFunctionExecuteHook(Oid objectId) @@ -143,3 +145,129 @@ RunFunctionExecuteHook(Oid objectId) ProcedureRelationId, objectId, 0, NULL); } + +/* String versions */ + + +/* + * RunObjectPostCreateHookStr + * + * OAT_POST_CREATE object name based event hook entrypoint + */ +void +RunObjectPostCreateHookStr(Oid classId, const char *objectName, int subId, + bool is_internal) +{ + ObjectAccessPostCreate pc_arg; + + /* caller should check, but just in case... */ + Assert(object_access_hook_str != NULL); + + memset(&pc_arg, 0, sizeof(ObjectAccessPostCreate)); + pc_arg.is_internal = is_internal; + + (*object_access_hook_str) (OAT_POST_CREATE, + classId, objectName, subId, + (void *) &pc_arg); +} + +/* + * RunObjectDropHookStr + * + * OAT_DROP object name based event hook entrypoint + */ +void +RunObjectDropHookStr(Oid classId, const char *objectName, int subId, + int dropflags) +{ + ObjectAccessDrop drop_arg; + + /* caller should check, but just in case... */ + Assert(object_access_hook_str != NULL); + + memset(&drop_arg, 0, sizeof(ObjectAccessDrop)); + drop_arg.dropflags = dropflags; + + (*object_access_hook_str) (OAT_DROP, + classId, objectName, subId, + (void *) &drop_arg); +} + +/* + * RunObjectTruncateHookStr + * + * OAT_TRUNCATE object name based event hook entrypoint + */ +void +RunObjectTruncateHookStr(const char *objectName) +{ + /* caller should check, but just in case... */ + Assert(object_access_hook_str != NULL); + + (*object_access_hook_str) (OAT_TRUNCATE, + RelationRelationId, objectName, 0, + NULL); +} + +/* + * RunObjectPostAlterHookStr + * + * OAT_POST_ALTER object name based event hook entrypoint + */ +void +RunObjectPostAlterHookStr(Oid classId, const char *objectName, int subId, + Oid auxiliaryId, bool is_internal) +{ + ObjectAccessPostAlter pa_arg; + + /* caller should check, but just in case... */ + Assert(object_access_hook_str != NULL); + + memset(&pa_arg, 0, sizeof(ObjectAccessPostAlter)); + pa_arg.auxiliary_id = auxiliaryId; + pa_arg.is_internal = is_internal; + + (*object_access_hook_str) (OAT_POST_ALTER, + classId, objectName, subId, + (void *) &pa_arg); +} + +/* + * RunNamespaceSearchHookStr + * + * OAT_NAMESPACE_SEARCH object name based event hook entrypoint + */ +bool +RunNamespaceSearchHookStr(const char *objectName, bool ereport_on_violation) +{ + ObjectAccessNamespaceSearch ns_arg; + + /* caller should check, but just in case... */ + Assert(object_access_hook_str != NULL); + + memset(&ns_arg, 0, sizeof(ObjectAccessNamespaceSearch)); + ns_arg.ereport_on_violation = ereport_on_violation; + ns_arg.result = true; + + (*object_access_hook_str) (OAT_NAMESPACE_SEARCH, + NamespaceRelationId, objectName, 0, + (void *) &ns_arg); + + return ns_arg.result; +} + +/* + * RunFunctionExecuteHookStr + * + * OAT_FUNCTION_EXECUTE object name based event hook entrypoint + */ +void +RunFunctionExecuteHookStr(const char *objectName) +{ + /* caller should check, but just in case... */ + Assert(object_access_hook_str != NULL); + + (*object_access_hook_str) (OAT_FUNCTION_EXECUTE, + ProcedureRelationId, objectName, 0, + NULL); +} diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index e7f0a380e6..932aefc777 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -43,6 +43,7 @@ #include "access/xlog_internal.h" #include "access/xlogrecovery.h" #include "catalog/namespace.h" +#include "catalog/objectaccess.h" #include "catalog/pg_authid.h" #include "catalog/storage.h" #include "commands/async.h" @@ -8736,6 +8737,18 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt) replace_auto_config_value(&head, &tail, name, value); } + /* + * Invoke the post-alter hook for altering this GUC variable. + * + * We do this here rather than at the end, because ALTER SYSTEM is not + * transactional. If the hook aborts our transaction, it will be cleaner + * to do so before we touch any files. + */ + InvokeObjectPostAlterHookArgStr(InvalidOid, name, + ACL_ALTER_SYSTEM, + altersysstmt->setstmt->kind, + false); + /* * To ensure crash safety, first write the new file data to a temp file, * then atomically rename it into place. @@ -8907,6 +8920,10 @@ ExecSetVariableStmt(VariableSetStmt *stmt, bool isTopLevel) ResetAllOptions(); break; } + + /* Invoke the post-alter hook for setting this GUC variable. */ + InvokeObjectPostAlterHookArgStr(InvalidOid, stmt->name, + ACL_SET_VALUE, stmt->kind, false); } /* diff --git a/src/include/catalog/objectaccess.h b/src/include/catalog/objectaccess.h index 508dfd0a6b..4d54ae2a7d 100644 --- a/src/include/catalog/objectaccess.h +++ b/src/include/catalog/objectaccess.h @@ -121,15 +121,23 @@ typedef struct bool result; } ObjectAccessNamespaceSearch; -/* Plugin provides a hook function matching this signature. */ +/* Plugin provides a hook function matching one or both of these signatures. */ typedef void (*object_access_hook_type) (ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg); +typedef void (*object_access_hook_type_str) (ObjectAccessType access, + Oid classId, + const char *objectStr, + int subId, + void *arg); + /* Plugin sets this variable to a suitable hook function. */ extern PGDLLIMPORT object_access_hook_type object_access_hook; +extern PGDLLIMPORT object_access_hook_type_str object_access_hook_str; + /* Core code uses these functions to call the hook (see macros below). */ extern void RunObjectPostCreateHook(Oid classId, Oid objectId, int subId, @@ -142,6 +150,18 @@ extern void RunObjectPostAlterHook(Oid classId, Oid objectId, int subId, extern bool RunNamespaceSearchHook(Oid objectId, bool ereport_on_violation); extern void RunFunctionExecuteHook(Oid objectId); +/* String versions */ +extern void RunObjectPostCreateHookStr(Oid classId, const char *objectStr, int subId, + bool is_internal); +extern void RunObjectDropHookStr(Oid classId, const char *objectStr, int subId, + int dropflags); +extern void RunObjectTruncateHookStr(const char *objectStr); +extern void RunObjectPostAlterHookStr(Oid classId, const char *objectStr, int subId, + Oid auxiliaryId, bool is_internal); +extern bool RunNamespaceSearchHookStr(const char *objectStr, bool ereport_on_violation); +extern void RunFunctionExecuteHookStr(const char *objectStr); + + /* * The following macros are wrappers around the functions above; these should * normally be used to invoke the hook in lieu of calling the above functions @@ -194,4 +214,52 @@ extern void RunFunctionExecuteHook(Oid objectId); RunFunctionExecuteHook(objectId); \ } while(0) + +#define InvokeObjectPostCreateHookStr(classId,objectName,subId) \ + InvokeObjectPostCreateHookArgStr((classId),(objectName),(subId),false) +#define InvokeObjectPostCreateHookArgStr(classId,objectName,subId,is_internal) \ + do { \ + if (object_access_hook_str) \ + RunObjectPostCreateHookStr((classId),(objectName),(subId), \ + (is_internal)); \ + } while(0) + +#define InvokeObjectDropHookStr(classId,objectName,subId) \ + InvokeObjectDropHookArgStr((classId),(objectName),(subId),0) +#define InvokeObjectDropHookArgStr(classId,objectName,subId,dropflags) \ + do { \ + if (object_access_hook_str) \ + RunObjectDropHookStr((classId),(objectName),(subId), \ + (dropflags)); \ + } while(0) + +#define InvokeObjectTruncateHookStr(objectName) \ + do { \ + if (object_access_hook_str) \ + RunObjectTruncateHookStr(objectName); \ + } while(0) + +#define InvokeObjectPostAlterHookStr(className,objectName,subId) \ + InvokeObjectPostAlterHookArgStr((classId),(objectName),(subId), \ + InvalidOid,false) +#define InvokeObjectPostAlterHookArgStr(classId,objectName,subId, \ + auxiliaryId,is_internal) \ + do { \ + if (object_access_hook_str) \ + RunObjectPostAlterHookStr((classId),(objectName),(subId), \ + (auxiliaryId),(is_internal)); \ + } while(0) + +#define InvokeNamespaceSearchHookStr(objectName, ereport_on_violation) \ + (!object_access_hook_str \ + ? true \ + : RunNamespaceSearchHookStr((objectName), (ereport_on_violation))) + +#define InvokeFunctionExecuteHookStr(objectName) \ + do { \ + if (object_access_hook_str) \ + RunFunctionExecuteHookStr(objectName); \ + } while(0) + + #endif /* OBJECTACCESS_H */ diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 6f83a79a96..2f618cb229 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -92,7 +92,9 @@ typedef uint32 AclMode; /* a bitmask of privilege bits */ #define ACL_CREATE (1<<9) /* for namespaces and databases */ #define ACL_CREATE_TEMP (1<<10) /* for databases */ #define ACL_CONNECT (1<<11) /* for databases */ -#define N_ACL_RIGHTS 12 /* 1 plus the last 1< Date: Tue, 22 Mar 2022 10:27:00 -0400 Subject: [PATCH 206/772] Add a test module for Object Access hooks This includes tests of both the newly added name type object access hooks and the older Oid type hooks, and provides a useful example of how to use the hooks. Mark Dilger, based on some code from Joshua Brindle. Discussion: https://postgr.es/m/47F87A0E-C0E5-43A6-89F6-D403F2B45175@enterprisedb.com --- src/test/modules/Makefile | 1 + src/test/modules/test_oat_hooks/.gitignore | 4 + src/test/modules/test_oat_hooks/Makefile | 24 + src/test/modules/test_oat_hooks/README | 86 ++ .../expected/test_oat_hooks.out | 209 ++++ .../test_oat_hooks/sql/test_oat_hooks.sql | 52 + .../modules/test_oat_hooks/test_oat_hooks.c | 934 ++++++++++++++++++ .../test_oat_hooks/test_oat_hooks.conf | 1 + 8 files changed, 1311 insertions(+) create mode 100644 src/test/modules/test_oat_hooks/.gitignore create mode 100644 src/test/modules/test_oat_hooks/Makefile create mode 100644 src/test/modules/test_oat_hooks/README create mode 100644 src/test/modules/test_oat_hooks/expected/test_oat_hooks.out create mode 100644 src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql create mode 100644 src/test/modules/test_oat_hooks/test_oat_hooks.c create mode 100644 src/test/modules/test_oat_hooks/test_oat_hooks.conf diff --git a/src/test/modules/Makefile b/src/test/modules/Makefile index dffc79b2d9..9090226daa 100644 --- a/src/test/modules/Makefile +++ b/src/test/modules/Makefile @@ -20,6 +20,7 @@ SUBDIRS = \ test_ginpostinglist \ test_integerset \ test_misc \ + test_oat_hooks \ test_parser \ test_pg_dump \ test_predtest \ diff --git a/src/test/modules/test_oat_hooks/.gitignore b/src/test/modules/test_oat_hooks/.gitignore new file mode 100644 index 0000000000..5dcb3ff972 --- /dev/null +++ b/src/test/modules/test_oat_hooks/.gitignore @@ -0,0 +1,4 @@ +# Generated subdirectories +/log/ +/results/ +/tmp_check/ diff --git a/src/test/modules/test_oat_hooks/Makefile b/src/test/modules/test_oat_hooks/Makefile new file mode 100644 index 0000000000..d0df9c1abb --- /dev/null +++ b/src/test/modules/test_oat_hooks/Makefile @@ -0,0 +1,24 @@ +# src/test/modules/test_oat_hooks/Makefile + +MODULE_big = test_oat_hooks +OBJS = \ + $(WIN32RES) \ + test_oat_hooks.o +PGFILEDESC = "test_oat_hooks - example use of object access hooks" + +REGRESS = test_oat_hooks +REGRESS_OPTS = --temp-config=$(top_srcdir)/src/test/modules/test_oat_hooks/test_oat_hooks.conf +# Disabled because these tests require "shared_preload_libraries=test_oat_hooks", +# which typical installcheck users do not have (e.g. buildfarm clients). +NO_INSTALLCHECK = 1 + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/test_oat_hooks +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/src/test/modules/test_oat_hooks/README b/src/test/modules/test_oat_hooks/README new file mode 100644 index 0000000000..a7c400c747 --- /dev/null +++ b/src/test/modules/test_oat_hooks/README @@ -0,0 +1,86 @@ +OVERVIEW +======== + +This test module, "test_oat_hooks", is an example of how to use the object +access hooks (OAT) to enforce mandatory access controls (MAC). + +The testing strategy is as follows: When this module loads, it registers hooks +of various types. (See below.) GUCs are defined to control each hook, +determining whether the hook allows or denies actions for which it fires. A +single additional GUC controls the verbosity of the hooks. GUCs default to +permissive/quiet, which allows the module to load without generating noise in +the log or denying any activity in the run-up to the regression test beginning. +When the test begins, it uses SET commands to turn on logging and to control +each hook's permissive/restrictive behavior. Various SQL statements are run +under both superuser and ordinary user permissions. The output is compared +against the expected output to verify that the hooks behaved and fired in the +order by expect. + +Because users may care about the firing order of other system hooks relative to +OAT hooks, ProcessUtility hooks and ExecutorCheckPerms hooks are also +registered by this module, with their own logging and allow/deny behavior. + + +SUSET test configuration GUCs +============================= + +The following configuration parameters (GUCs) control this test module's Object +Access Type (OAT), Process Utility and Executor Check Permissions hooks. The +general pattern is that each hook has a corresponding GUC which controls +whether the hook will allow or deny operations for which the hook gets called. +A real-world OAT hook should certainly provide more fine-grained conrol than +merely "allow-all" vs. "deny-all", but for testing this is sufficient. + +Note that even when these hooks allow an action, the core permissions system +may still refuse the action. The firing order of the hooks relative to the +core permissions system can be inferred from which NOTICE messages get emitted +before an action is refused. + +Each hook applies the allow vs. deny setting to all operations performed by +non-superusers. + +- test_oat_hooks.deny_set_variable + + Controls whether the object_access_hook_str MAC function rejects attempts to + set a configuration parameter. + +- test_oat_hooks.deny_alter_system + + Controls whether the object_access_hook_str MAC function rejects attempts to + alter system set a configuration parameter. + +- test_oat_hooks.deny_object_access + + Controls whether the object_access_hook MAC function rejects all operations + for which it is called. + +- test_oat_hooks.deny_exec_perms + + Controls whether the exec_check_perms MAC function rejects all operations for + which it is called. + +- test_oat_hooks.deny_utility_commands + + Controls whether the ProcessUtility_hook function rejects all operations for + which it is called. + +- test_oat_hooks.audit + + Controls whether each hook logs NOTICE messages for each attempt, along with + success or failure status. Note that clearing or setting this GUC may itself + generate NOTICE messages appearing before but not after, or after but not + before, the new setting takes effect. + + +Functions +========= + +The module registers hooks by the following names: + +- REGRESS_object_access_hook + +- REGRESS_object_access_hook_str + +- REGRESS_exec_check_perms + +- REGRESS_utility_command diff --git a/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out b/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out new file mode 100644 index 0000000000..2035769580 --- /dev/null +++ b/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out @@ -0,0 +1,209 @@ +-- SET commands fire both the ProcessUtility_hook and the +-- object_access_hook_str. Since the auditing GUC starts out false, we miss the +-- initial "attempting" audit message from the ProcessUtility_hook, but we +-- should thereafter see the audit messages +SET test_oat_hooks.audit = true; +NOTICE: in object_access_hook_str: superuser attempting alter (set) [test_oat_hooks.audit] +NOTICE: in object_access_hook_str: superuser finished alter (set) [test_oat_hooks.audit] +NOTICE: in process utility: superuser finished set +-- Create objects for use in the test +CREATE USER regress_test_user; +NOTICE: in process utility: superuser attempting CreateRoleStmt +NOTICE: in object access: superuser attempting create (subId=0) [explicit] +NOTICE: in object access: superuser finished create (subId=0) [explicit] +NOTICE: in process utility: superuser finished CreateRoleStmt +CREATE TABLE regress_test_table (t text); +NOTICE: in process utility: superuser attempting CreateStmt +NOTICE: in object access: superuser attempting namespace search (subId=0) [no report on violation, allowed] +LINE 1: CREATE TABLE regress_test_table (t text); + ^ +NOTICE: in object access: superuser finished namespace search (subId=0) [no report on violation, allowed] +LINE 1: CREATE TABLE regress_test_table (t text); + ^ +NOTICE: in object access: superuser attempting create (subId=0) [explicit] +NOTICE: in object access: superuser finished create (subId=0) [explicit] +NOTICE: in object access: superuser attempting create (subId=0) [explicit] +NOTICE: in object access: superuser finished create (subId=0) [explicit] +NOTICE: in object access: superuser attempting create (subId=0) [explicit] +NOTICE: in object access: superuser finished create (subId=0) [explicit] +NOTICE: in object access: superuser attempting create (subId=0) [internal] +NOTICE: in object access: superuser finished create (subId=0) [internal] +NOTICE: in object access: superuser attempting create (subId=0) [internal] +NOTICE: in object access: superuser finished create (subId=0) [internal] +NOTICE: in process utility: superuser finished CreateStmt +GRANT SELECT ON Table regress_test_table TO public; +NOTICE: in process utility: superuser attempting GrantStmt +NOTICE: in process utility: superuser finished GrantStmt +CREATE FUNCTION regress_test_func (t text) RETURNS text AS $$ + SELECT $1; +$$ LANGUAGE sql; +NOTICE: in process utility: superuser attempting CreateFunctionStmt +NOTICE: in object access: superuser attempting create (subId=0) [explicit] +NOTICE: in object access: superuser finished create (subId=0) [explicit] +NOTICE: in process utility: superuser finished CreateFunctionStmt +GRANT EXECUTE ON FUNCTION regress_test_func (text) TO public; +NOTICE: in process utility: superuser attempting GrantStmt +NOTICE: in process utility: superuser finished GrantStmt +-- Do a few things as superuser +SELECT * FROM regress_test_table; +NOTICE: in executor check perms: superuser attempting execute +NOTICE: in executor check perms: superuser finished execute + t +--- +(0 rows) + +SELECT regress_test_func('arg'); +NOTICE: in executor check perms: superuser attempting execute +NOTICE: in executor check perms: superuser finished execute + regress_test_func +------------------- + arg +(1 row) + +SET work_mem = 8192; +NOTICE: in process utility: superuser attempting set +NOTICE: in object_access_hook_str: superuser attempting alter (set) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (set) [work_mem] +NOTICE: in process utility: superuser finished set +RESET work_mem; +NOTICE: in process utility: superuser attempting set +NOTICE: in object_access_hook_str: superuser attempting alter (set) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (set) [work_mem] +NOTICE: in process utility: superuser finished set +ALTER SYSTEM SET work_mem = 8192; +NOTICE: in process utility: superuser attempting alter system +NOTICE: in object_access_hook_str: superuser attempting alter (alter system set) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (alter system set) [work_mem] +NOTICE: in process utility: superuser finished alter system +ALTER SYSTEM RESET work_mem; +NOTICE: in process utility: superuser attempting alter system +NOTICE: in object_access_hook_str: superuser attempting alter (alter system set) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (alter system set) [work_mem] +NOTICE: in process utility: superuser finished alter system +-- Do those same things as non-superuser +SET SESSION AUTHORIZATION regress_test_user; +NOTICE: in process utility: superuser attempting set +NOTICE: in object_access_hook_str: non-superuser attempting alter (set) [session_authorization] +NOTICE: in object_access_hook_str: non-superuser finished alter (set) [session_authorization] +NOTICE: in process utility: non-superuser finished set +SELECT * FROM regress_test_table; +NOTICE: in object access: non-superuser attempting namespace search (subId=0) [no report on violation, allowed] +LINE 1: SELECT * FROM regress_test_table; + ^ +NOTICE: in object access: non-superuser finished namespace search (subId=0) [no report on violation, allowed] +LINE 1: SELECT * FROM regress_test_table; + ^ +NOTICE: in executor check perms: non-superuser attempting execute +NOTICE: in executor check perms: non-superuser finished execute + t +--- +(0 rows) + +SELECT regress_test_func('arg'); +NOTICE: in executor check perms: non-superuser attempting execute +NOTICE: in executor check perms: non-superuser finished execute + regress_test_func +------------------- + arg +(1 row) + +SET work_mem = 8192; +NOTICE: in process utility: non-superuser attempting set +NOTICE: in object_access_hook_str: non-superuser attempting alter (set) [work_mem] +NOTICE: in object_access_hook_str: non-superuser finished alter (set) [work_mem] +NOTICE: in process utility: non-superuser finished set +RESET work_mem; +NOTICE: in process utility: non-superuser attempting set +NOTICE: in object_access_hook_str: non-superuser attempting alter (set) [work_mem] +NOTICE: in object_access_hook_str: non-superuser finished alter (set) [work_mem] +NOTICE: in process utility: non-superuser finished set +ALTER SYSTEM SET work_mem = 8192; +NOTICE: in process utility: non-superuser attempting alter system +ERROR: must be superuser to execute ALTER SYSTEM command +ALTER SYSTEM RESET work_mem; +NOTICE: in process utility: non-superuser attempting alter system +ERROR: must be superuser to execute ALTER SYSTEM command +RESET SESSION AUTHORIZATION; +NOTICE: in process utility: non-superuser attempting set +NOTICE: in object_access_hook_str: superuser attempting alter (set) [session_authorization] +NOTICE: in object_access_hook_str: superuser finished alter (set) [session_authorization] +NOTICE: in process utility: superuser finished set +-- Turn off non-superuser permissions +SET test_oat_hooks.deny_set_variable = true; +NOTICE: in process utility: superuser attempting set +NOTICE: in object_access_hook_str: superuser attempting alter (set) [test_oat_hooks.deny_set_variable] +NOTICE: in object_access_hook_str: superuser finished alter (set) [test_oat_hooks.deny_set_variable] +NOTICE: in process utility: superuser finished set +SET test_oat_hooks.deny_alter_system = true; +NOTICE: in process utility: superuser attempting set +NOTICE: in object_access_hook_str: superuser attempting alter (set) [test_oat_hooks.deny_alter_system] +NOTICE: in object_access_hook_str: superuser finished alter (set) [test_oat_hooks.deny_alter_system] +NOTICE: in process utility: superuser finished set +SET test_oat_hooks.deny_object_access = true; +NOTICE: in process utility: superuser attempting set +NOTICE: in object_access_hook_str: superuser attempting alter (set) [test_oat_hooks.deny_object_access] +NOTICE: in object_access_hook_str: superuser finished alter (set) [test_oat_hooks.deny_object_access] +NOTICE: in process utility: superuser finished set +SET test_oat_hooks.deny_exec_perms = true; +NOTICE: in process utility: superuser attempting set +NOTICE: in object_access_hook_str: superuser attempting alter (set) [test_oat_hooks.deny_exec_perms] +NOTICE: in object_access_hook_str: superuser finished alter (set) [test_oat_hooks.deny_exec_perms] +NOTICE: in process utility: superuser finished set +SET test_oat_hooks.deny_utility_commands = true; +NOTICE: in process utility: superuser attempting set +NOTICE: in object_access_hook_str: superuser attempting alter (set) [test_oat_hooks.deny_utility_commands] +NOTICE: in object_access_hook_str: superuser finished alter (set) [test_oat_hooks.deny_utility_commands] +NOTICE: in process utility: superuser finished set +-- Try again as non-superuser with permisisons denied +SET SESSION AUTHORIZATION regress_test_user; +NOTICE: in process utility: superuser attempting set +NOTICE: in object_access_hook_str: non-superuser attempting alter (set) [session_authorization] +ERROR: permission denied: set session_authorization +SELECT * FROM regress_test_table; +NOTICE: in object access: superuser attempting namespace search (subId=0) [no report on violation, allowed] +LINE 1: SELECT * FROM regress_test_table; + ^ +NOTICE: in object access: superuser finished namespace search (subId=0) [no report on violation, allowed] +LINE 1: SELECT * FROM regress_test_table; + ^ +NOTICE: in executor check perms: superuser attempting execute +NOTICE: in executor check perms: superuser finished execute + t +--- +(0 rows) + +SELECT regress_test_func('arg'); +NOTICE: in executor check perms: superuser attempting execute +NOTICE: in executor check perms: superuser finished execute + regress_test_func +------------------- + arg +(1 row) + +SET work_mem = 8192; +NOTICE: in process utility: superuser attempting set +NOTICE: in object_access_hook_str: superuser attempting alter (set) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (set) [work_mem] +NOTICE: in process utility: superuser finished set +RESET work_mem; +NOTICE: in process utility: superuser attempting set +NOTICE: in object_access_hook_str: superuser attempting alter (set) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (set) [work_mem] +NOTICE: in process utility: superuser finished set +ALTER SYSTEM SET work_mem = 8192; +NOTICE: in process utility: superuser attempting alter system +NOTICE: in object_access_hook_str: superuser attempting alter (alter system set) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (alter system set) [work_mem] +NOTICE: in process utility: superuser finished alter system +ALTER SYSTEM RESET work_mem; +NOTICE: in process utility: superuser attempting alter system +NOTICE: in object_access_hook_str: superuser attempting alter (alter system set) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (alter system set) [work_mem] +NOTICE: in process utility: superuser finished alter system +RESET SESSION AUTHORIZATION; +NOTICE: in process utility: superuser attempting set +NOTICE: in object_access_hook_str: superuser attempting alter (set) [session_authorization] +NOTICE: in object_access_hook_str: superuser finished alter (set) [session_authorization] +NOTICE: in process utility: superuser finished set +SET test_oat_hooks.audit = false; +NOTICE: in process utility: superuser attempting set diff --git a/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql b/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql new file mode 100644 index 0000000000..5fb3a2f0ea --- /dev/null +++ b/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql @@ -0,0 +1,52 @@ +-- SET commands fire both the ProcessUtility_hook and the +-- object_access_hook_str. Since the auditing GUC starts out false, we miss the +-- initial "attempting" audit message from the ProcessUtility_hook, but we +-- should thereafter see the audit messages +SET test_oat_hooks.audit = true; + +-- Create objects for use in the test +CREATE USER regress_test_user; +CREATE TABLE regress_test_table (t text); +GRANT SELECT ON Table regress_test_table TO public; +CREATE FUNCTION regress_test_func (t text) RETURNS text AS $$ + SELECT $1; +$$ LANGUAGE sql; +GRANT EXECUTE ON FUNCTION regress_test_func (text) TO public; + +-- Do a few things as superuser +SELECT * FROM regress_test_table; +SELECT regress_test_func('arg'); +SET work_mem = 8192; +RESET work_mem; +ALTER SYSTEM SET work_mem = 8192; +ALTER SYSTEM RESET work_mem; + +-- Do those same things as non-superuser +SET SESSION AUTHORIZATION regress_test_user; +SELECT * FROM regress_test_table; +SELECT regress_test_func('arg'); +SET work_mem = 8192; +RESET work_mem; +ALTER SYSTEM SET work_mem = 8192; +ALTER SYSTEM RESET work_mem; +RESET SESSION AUTHORIZATION; + +-- Turn off non-superuser permissions +SET test_oat_hooks.deny_set_variable = true; +SET test_oat_hooks.deny_alter_system = true; +SET test_oat_hooks.deny_object_access = true; +SET test_oat_hooks.deny_exec_perms = true; +SET test_oat_hooks.deny_utility_commands = true; + +-- Try again as non-superuser with permisisons denied +SET SESSION AUTHORIZATION regress_test_user; +SELECT * FROM regress_test_table; +SELECT regress_test_func('arg'); +SET work_mem = 8192; +RESET work_mem; +ALTER SYSTEM SET work_mem = 8192; +ALTER SYSTEM RESET work_mem; + +RESET SESSION AUTHORIZATION; + +SET test_oat_hooks.audit = false; diff --git a/src/test/modules/test_oat_hooks/test_oat_hooks.c b/src/test/modules/test_oat_hooks/test_oat_hooks.c new file mode 100644 index 0000000000..b1709f4d63 --- /dev/null +++ b/src/test/modules/test_oat_hooks/test_oat_hooks.c @@ -0,0 +1,934 @@ +/*-------------------------------------------------------------------------- + * + * test_oat_hooks.c + * Code for testing mandatory access control (MAC) using object access hooks. + * + * Copyright (c) 2015-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/test/modules/test_oat_hooks/test_oat_hooks.c + * + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "catalog/dependency.h" +#include "catalog/objectaccess.h" +#include "catalog/pg_proc.h" +#include "executor/executor.h" +#include "fmgr.h" +#include "miscadmin.h" +#include "tcop/utility.h" + +PG_MODULE_MAGIC; + +/* + * GUCs controlling which operations to deny + */ +static bool REGRESS_deny_set_variable = false; +static bool REGRESS_deny_alter_system = false; +static bool REGRESS_deny_object_access = false; +static bool REGRESS_deny_exec_perms = false; +static bool REGRESS_deny_utility_commands = false; +static bool REGRESS_audit = false; + +/* Saved hook values in case of unload */ +static object_access_hook_type next_object_access_hook = NULL; +static object_access_hook_type_str next_object_access_hook_str = NULL; +static ExecutorCheckPerms_hook_type next_exec_check_perms_hook = NULL; +static ProcessUtility_hook_type next_ProcessUtility_hook = NULL; + +/* Test Object Access Type Hook hooks */ +static void REGRESS_object_access_hook_str(ObjectAccessType access, + Oid classId, const char *objName, + int subId, void *arg); +static void REGRESS_object_access_hook(ObjectAccessType access, Oid classId, + Oid objectId, int subId, void *arg); +static bool REGRESS_exec_check_perms(List *rangeTabls, bool do_abort); +static void REGRESS_utility_command(PlannedStmt *pstmt, + const char *queryString, bool readOnlyTree, + ProcessUtilityContext context, + ParamListInfo params, + QueryEnvironment *queryEnv, + DestReceiver *dest, QueryCompletion *qc); + +/* Helper functions */ +static const char *nodetag_to_string(NodeTag tag); +static char *accesstype_to_string(ObjectAccessType access, int subId); +static char *accesstype_arg_to_string(ObjectAccessType access, void *arg); + + +void _PG_init(void); +void _PG_fini(void); + +/* + * Module load/unload callback + */ +void +_PG_init(void) +{ + /* + * We allow to load the Object Access Type test module on single-user-mode + * or shared_preload_libraries settings only. + */ + if (IsUnderPostmaster) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("test_oat_hooks must be loaded via shared_preload_libraries"))); + + /* + * test_oat_hooks.deny_set_variable = (on|off) + */ + DefineCustomBoolVariable("test_oat_hooks.deny_set_variable", + "Deny non-superuser set permissions", + NULL, + ®RESS_deny_set_variable, + false, + PGC_SUSET, + GUC_NOT_IN_SAMPLE, + NULL, + NULL, + NULL); + + /* + * test_oat_hooks.deny_alter_system = (on|off) + */ + DefineCustomBoolVariable("test_oat_hooks.deny_alter_system", + "Deny non-superuser alter system set permissions", + NULL, + ®RESS_deny_alter_system, + false, + PGC_SUSET, + GUC_NOT_IN_SAMPLE, + NULL, + NULL, + NULL); + + /* + * test_oat_hooks.deny_object_access = (on|off) + */ + DefineCustomBoolVariable("test_oat_hooks.deny_object_access", + "Deny non-superuser object access permissions", + NULL, + ®RESS_deny_object_access, + false, + PGC_SUSET, + GUC_NOT_IN_SAMPLE, + NULL, + NULL, + NULL); + + /* + * test_oat_hooks.deny_exec_perms = (on|off) + */ + DefineCustomBoolVariable("test_oat_hooks.deny_exec_perms", + "Deny non-superuser exec permissions", + NULL, + ®RESS_deny_exec_perms, + false, + PGC_SUSET, + GUC_NOT_IN_SAMPLE, + NULL, + NULL, + NULL); + + /* + * test_oat_hooks.deny_utility_commands = (on|off) + */ + DefineCustomBoolVariable("test_oat_hooks.deny_utility_commands", + "Deny non-superuser utility commands", + NULL, + ®RESS_deny_utility_commands, + false, + PGC_SUSET, + GUC_NOT_IN_SAMPLE, + NULL, + NULL, + NULL); + + /* + * test_oat_hooks.audit = (on|off) + */ + DefineCustomBoolVariable("test_oat_hooks.audit", + "Turn on/off debug audit messages", + NULL, + ®RESS_audit, + false, + PGC_SUSET, + GUC_NOT_IN_SAMPLE, + NULL, + NULL, + NULL); + + MarkGUCPrefixReserved("test_oat_hooks"); + + /* Object access hook */ + next_object_access_hook = object_access_hook; + object_access_hook = REGRESS_object_access_hook; + + /* Object access hook str */ + next_object_access_hook_str = object_access_hook_str; + object_access_hook_str = REGRESS_object_access_hook_str; + + /* DML permission check */ + next_exec_check_perms_hook = ExecutorCheckPerms_hook; + ExecutorCheckPerms_hook = REGRESS_exec_check_perms; + + /* ProcessUtility hook */ + next_ProcessUtility_hook = ProcessUtility_hook; + ProcessUtility_hook = REGRESS_utility_command; +} + +void +_PG_fini(void) +{ + /* Unload hooks */ + if (object_access_hook == REGRESS_object_access_hook) + object_access_hook = next_object_access_hook; + + if (object_access_hook_str == REGRESS_object_access_hook_str) + object_access_hook_str = next_object_access_hook_str; + + if (ExecutorCheckPerms_hook == REGRESS_exec_check_perms) + ExecutorCheckPerms_hook = next_exec_check_perms_hook; + + if (ProcessUtility_hook == REGRESS_utility_command) + ProcessUtility_hook = next_ProcessUtility_hook; +} + +static void +emit_audit_message(const char *type, const char *hook, char *action, char *objName) +{ + if (REGRESS_audit) + { + const char *who = superuser_arg(GetUserId()) ? "superuser" : "non-superuser"; + + if (objName) + ereport(NOTICE, + (errcode(ERRCODE_INTERNAL_ERROR), + errmsg("in %s: %s %s %s [%s]", hook, who, type, action, objName))); + else + ereport(NOTICE, + (errcode(ERRCODE_INTERNAL_ERROR), + errmsg("in %s: %s %s %s", hook, who, type, action))); + } + + if (action) + pfree(action); + if (objName) + pfree(objName); +} + +static void +audit_attempt(const char *hook, char *action, char *objName) +{ + emit_audit_message("attempting", hook, action, objName); +} + +static void +audit_success(const char *hook, char *action, char *objName) +{ + emit_audit_message("finished", hook, action, objName); +} + +static void +audit_failure(const char *hook, char *action, char *objName) +{ + emit_audit_message("denied", hook, action, objName); +} + +static void +REGRESS_object_access_hook_str(ObjectAccessType access, Oid classId, const char *objName, int subId, void *arg) +{ + audit_attempt("object_access_hook_str", + accesstype_to_string(access, subId), + pstrdup(objName)); + + if (next_object_access_hook_str) + { + (*next_object_access_hook_str)(access, classId, objName, subId, arg); + } + + switch (access) + { + case OAT_POST_ALTER: + if (subId & ACL_SET_VALUE) + { + if (REGRESS_deny_set_variable && !superuser_arg(GetUserId())) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied: set %s", objName))); + } + else if (subId & ACL_ALTER_SYSTEM) + { + if (REGRESS_deny_alter_system && !superuser_arg(GetUserId())) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied: alter system set %s", objName))); + } + else + elog(ERROR, "Unknown SettingAclRelationId subId: %d", subId); + break; + default: + break; + } + + audit_success("object_access_hook_str", + accesstype_to_string(access, subId), + pstrdup(objName)); +} + +static void +REGRESS_object_access_hook (ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg) +{ + audit_attempt("object access", + accesstype_to_string(access, 0), + accesstype_arg_to_string(access, arg)); + + if (REGRESS_deny_object_access && !superuser_arg(GetUserId())) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied: %s [%s]", + accesstype_to_string(access, 0), + accesstype_arg_to_string(access, arg)))); + + /* Forward to next hook in the chain */ + if (next_object_access_hook) + (*next_object_access_hook)(access, classId, objectId, subId, arg); + + audit_success("object access", + accesstype_to_string(access, 0), + accesstype_arg_to_string(access, arg)); +} + +static bool +REGRESS_exec_check_perms(List *rangeTabls, bool do_abort) +{ + bool am_super = superuser_arg(GetUserId()); + bool allow = true; + + audit_attempt("executor check perms", pstrdup("execute"), NULL); + + /* Perform our check */ + allow = !REGRESS_deny_exec_perms || am_super; + if (do_abort && !allow) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied: %s", "execute"))); + + /* Forward to next hook in the chain */ + if (next_exec_check_perms_hook && + !(*next_exec_check_perms_hook) (rangeTabls, do_abort)) + allow = false; + + if (allow) + audit_success("executor check perms", + pstrdup("execute"), + NULL); + else + audit_failure("executor check perms", + pstrdup("execute"), + NULL); + + return allow; +} + +static void +REGRESS_utility_command(PlannedStmt *pstmt, + const char *queryString, + bool readOnlyTree, + ProcessUtilityContext context, + ParamListInfo params, + QueryEnvironment *queryEnv, + DestReceiver *dest, + QueryCompletion *qc) +{ + Node *parsetree = pstmt->utilityStmt; + + const char *action; + NodeTag tag = nodeTag(parsetree); + + switch (tag) + { + case T_VariableSetStmt: + action = "set"; + break; + case T_AlterSystemStmt: + action = "alter system"; + break; + case T_LoadStmt: + action = "load"; + break; + default: + action = nodetag_to_string(tag); + break; + } + + audit_attempt("process utility", + pstrdup(action), + NULL); + + /* Check permissions */ + if (REGRESS_deny_utility_commands && !superuser_arg(GetUserId())) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied: %s", action))); + + /* Forward to next hook in the chain */ + if (next_ProcessUtility_hook) + (*next_ProcessUtility_hook) (pstmt, queryString, readOnlyTree, + context, params, queryEnv, + dest, qc); + else + standard_ProcessUtility(pstmt, queryString, readOnlyTree, + context, params, queryEnv, + dest, qc); + + /* We're done */ + audit_success("process utility", + pstrdup(action), + NULL); +} + +static const char * +nodetag_to_string(NodeTag tag) +{ + switch (tag) + { + case T_Invalid: return "Invalid"; break; + case T_IndexInfo: return "IndexInfo"; break; + case T_ExprContext: return "ExprContext"; break; + case T_ProjectionInfo: return "ProjectionInfo"; break; + case T_JunkFilter: return "JunkFilter"; break; + case T_OnConflictSetState: return "OnConflictSetState"; break; + case T_ResultRelInfo: return "ResultRelInfo"; break; + case T_EState: return "EState"; break; + case T_TupleTableSlot: return "TupleTableSlot"; break; + case T_Plan: return "Plan"; break; + case T_Result: return "Result"; break; + case T_ProjectSet: return "ProjectSet"; break; + case T_ModifyTable: return "ModifyTable"; break; + case T_Append: return "Append"; break; + case T_MergeAppend: return "MergeAppend"; break; + case T_RecursiveUnion: return "RecursiveUnion"; break; + case T_BitmapAnd: return "BitmapAnd"; break; + case T_BitmapOr: return "BitmapOr"; break; + case T_Scan: return "Scan"; break; + case T_SeqScan: return "SeqScan"; break; + case T_SampleScan: return "SampleScan"; break; + case T_IndexScan: return "IndexScan"; break; + case T_IndexOnlyScan: return "IndexOnlyScan"; break; + case T_BitmapIndexScan: return "BitmapIndexScan"; break; + case T_BitmapHeapScan: return "BitmapHeapScan"; break; + case T_TidScan: return "TidScan"; break; + case T_TidRangeScan: return "TidRangeScan"; break; + case T_SubqueryScan: return "SubqueryScan"; break; + case T_FunctionScan: return "FunctionScan"; break; + case T_ValuesScan: return "ValuesScan"; break; + case T_TableFuncScan: return "TableFuncScan"; break; + case T_CteScan: return "CteScan"; break; + case T_NamedTuplestoreScan: return "NamedTuplestoreScan"; break; + case T_WorkTableScan: return "WorkTableScan"; break; + case T_ForeignScan: return "ForeignScan"; break; + case T_CustomScan: return "CustomScan"; break; + case T_Join: return "Join"; break; + case T_NestLoop: return "NestLoop"; break; + case T_MergeJoin: return "MergeJoin"; break; + case T_HashJoin: return "HashJoin"; break; + case T_Material: return "Material"; break; + case T_Memoize: return "Memoize"; break; + case T_Sort: return "Sort"; break; + case T_IncrementalSort: return "IncrementalSort"; break; + case T_Group: return "Group"; break; + case T_Agg: return "Agg"; break; + case T_WindowAgg: return "WindowAgg"; break; + case T_Unique: return "Unique"; break; + case T_Gather: return "Gather"; break; + case T_GatherMerge: return "GatherMerge"; break; + case T_Hash: return "Hash"; break; + case T_SetOp: return "SetOp"; break; + case T_LockRows: return "LockRows"; break; + case T_Limit: return "Limit"; break; + case T_NestLoopParam: return "NestLoopParam"; break; + case T_PlanRowMark: return "PlanRowMark"; break; + case T_PartitionPruneInfo: return "PartitionPruneInfo"; break; + case T_PartitionedRelPruneInfo: return "PartitionedRelPruneInfo"; break; + case T_PartitionPruneStepOp: return "PartitionPruneStepOp"; break; + case T_PartitionPruneStepCombine: return "PartitionPruneStepCombine"; break; + case T_PlanInvalItem: return "PlanInvalItem"; break; + case T_PlanState: return "PlanState"; break; + case T_ResultState: return "ResultState"; break; + case T_ProjectSetState: return "ProjectSetState"; break; + case T_ModifyTableState: return "ModifyTableState"; break; + case T_AppendState: return "AppendState"; break; + case T_MergeAppendState: return "MergeAppendState"; break; + case T_RecursiveUnionState: return "RecursiveUnionState"; break; + case T_BitmapAndState: return "BitmapAndState"; break; + case T_BitmapOrState: return "BitmapOrState"; break; + case T_ScanState: return "ScanState"; break; + case T_SeqScanState: return "SeqScanState"; break; + case T_SampleScanState: return "SampleScanState"; break; + case T_IndexScanState: return "IndexScanState"; break; + case T_IndexOnlyScanState: return "IndexOnlyScanState"; break; + case T_BitmapIndexScanState: return "BitmapIndexScanState"; break; + case T_BitmapHeapScanState: return "BitmapHeapScanState"; break; + case T_TidScanState: return "TidScanState"; break; + case T_TidRangeScanState: return "TidRangeScanState"; break; + case T_SubqueryScanState: return "SubqueryScanState"; break; + case T_FunctionScanState: return "FunctionScanState"; break; + case T_TableFuncScanState: return "TableFuncScanState"; break; + case T_ValuesScanState: return "ValuesScanState"; break; + case T_CteScanState: return "CteScanState"; break; + case T_NamedTuplestoreScanState: return "NamedTuplestoreScanState"; break; + case T_WorkTableScanState: return "WorkTableScanState"; break; + case T_ForeignScanState: return "ForeignScanState"; break; + case T_CustomScanState: return "CustomScanState"; break; + case T_JoinState: return "JoinState"; break; + case T_NestLoopState: return "NestLoopState"; break; + case T_MergeJoinState: return "MergeJoinState"; break; + case T_HashJoinState: return "HashJoinState"; break; + case T_MaterialState: return "MaterialState"; break; + case T_MemoizeState: return "MemoizeState"; break; + case T_SortState: return "SortState"; break; + case T_IncrementalSortState: return "IncrementalSortState"; break; + case T_GroupState: return "GroupState"; break; + case T_AggState: return "AggState"; break; + case T_WindowAggState: return "WindowAggState"; break; + case T_UniqueState: return "UniqueState"; break; + case T_GatherState: return "GatherState"; break; + case T_GatherMergeState: return "GatherMergeState"; break; + case T_HashState: return "HashState"; break; + case T_SetOpState: return "SetOpState"; break; + case T_LockRowsState: return "LockRowsState"; break; + case T_LimitState: return "LimitState"; break; + case T_Alias: return "Alias"; break; + case T_RangeVar: return "RangeVar"; break; + case T_TableFunc: return "TableFunc"; break; + case T_Var: return "Var"; break; + case T_Const: return "Const"; break; + case T_Param: return "Param"; break; + case T_Aggref: return "Aggref"; break; + case T_GroupingFunc: return "GroupingFunc"; break; + case T_WindowFunc: return "WindowFunc"; break; + case T_SubscriptingRef: return "SubscriptingRef"; break; + case T_FuncExpr: return "FuncExpr"; break; + case T_NamedArgExpr: return "NamedArgExpr"; break; + case T_OpExpr: return "OpExpr"; break; + case T_DistinctExpr: return "DistinctExpr"; break; + case T_NullIfExpr: return "NullIfExpr"; break; + case T_ScalarArrayOpExpr: return "ScalarArrayOpExpr"; break; + case T_BoolExpr: return "BoolExpr"; break; + case T_SubLink: return "SubLink"; break; + case T_SubPlan: return "SubPlan"; break; + case T_AlternativeSubPlan: return "AlternativeSubPlan"; break; + case T_FieldSelect: return "FieldSelect"; break; + case T_FieldStore: return "FieldStore"; break; + case T_RelabelType: return "RelabelType"; break; + case T_CoerceViaIO: return "CoerceViaIO"; break; + case T_ArrayCoerceExpr: return "ArrayCoerceExpr"; break; + case T_ConvertRowtypeExpr: return "ConvertRowtypeExpr"; break; + case T_CollateExpr: return "CollateExpr"; break; + case T_CaseExpr: return "CaseExpr"; break; + case T_CaseWhen: return "CaseWhen"; break; + case T_CaseTestExpr: return "CaseTestExpr"; break; + case T_ArrayExpr: return "ArrayExpr"; break; + case T_RowExpr: return "RowExpr"; break; + case T_RowCompareExpr: return "RowCompareExpr"; break; + case T_CoalesceExpr: return "CoalesceExpr"; break; + case T_MinMaxExpr: return "MinMaxExpr"; break; + case T_SQLValueFunction: return "SQLValueFunction"; break; + case T_XmlExpr: return "XmlExpr"; break; + case T_NullTest: return "NullTest"; break; + case T_BooleanTest: return "BooleanTest"; break; + case T_CoerceToDomain: return "CoerceToDomain"; break; + case T_CoerceToDomainValue: return "CoerceToDomainValue"; break; + case T_SetToDefault: return "SetToDefault"; break; + case T_CurrentOfExpr: return "CurrentOfExpr"; break; + case T_NextValueExpr: return "NextValueExpr"; break; + case T_InferenceElem: return "InferenceElem"; break; + case T_TargetEntry: return "TargetEntry"; break; + case T_RangeTblRef: return "RangeTblRef"; break; + case T_JoinExpr: return "JoinExpr"; break; + case T_FromExpr: return "FromExpr"; break; + case T_OnConflictExpr: return "OnConflictExpr"; break; + case T_IntoClause: return "IntoClause"; break; + case T_ExprState: return "ExprState"; break; + case T_WindowFuncExprState: return "WindowFuncExprState"; break; + case T_SetExprState: return "SetExprState"; break; + case T_SubPlanState: return "SubPlanState"; break; + case T_DomainConstraintState: return "DomainConstraintState"; break; + case T_PlannerInfo: return "PlannerInfo"; break; + case T_PlannerGlobal: return "PlannerGlobal"; break; + case T_RelOptInfo: return "RelOptInfo"; break; + case T_IndexOptInfo: return "IndexOptInfo"; break; + case T_ForeignKeyOptInfo: return "ForeignKeyOptInfo"; break; + case T_ParamPathInfo: return "ParamPathInfo"; break; + case T_Path: return "Path"; break; + case T_IndexPath: return "IndexPath"; break; + case T_BitmapHeapPath: return "BitmapHeapPath"; break; + case T_BitmapAndPath: return "BitmapAndPath"; break; + case T_BitmapOrPath: return "BitmapOrPath"; break; + case T_TidPath: return "TidPath"; break; + case T_TidRangePath: return "TidRangePath"; break; + case T_SubqueryScanPath: return "SubqueryScanPath"; break; + case T_ForeignPath: return "ForeignPath"; break; + case T_CustomPath: return "CustomPath"; break; + case T_NestPath: return "NestPath"; break; + case T_MergePath: return "MergePath"; break; + case T_HashPath: return "HashPath"; break; + case T_AppendPath: return "AppendPath"; break; + case T_MergeAppendPath: return "MergeAppendPath"; break; + case T_GroupResultPath: return "GroupResultPath"; break; + case T_MaterialPath: return "MaterialPath"; break; + case T_MemoizePath: return "MemoizePath"; break; + case T_UniquePath: return "UniquePath"; break; + case T_GatherPath: return "GatherPath"; break; + case T_GatherMergePath: return "GatherMergePath"; break; + case T_ProjectionPath: return "ProjectionPath"; break; + case T_ProjectSetPath: return "ProjectSetPath"; break; + case T_SortPath: return "SortPath"; break; + case T_IncrementalSortPath: return "IncrementalSortPath"; break; + case T_GroupPath: return "GroupPath"; break; + case T_UpperUniquePath: return "UpperUniquePath"; break; + case T_AggPath: return "AggPath"; break; + case T_GroupingSetsPath: return "GroupingSetsPath"; break; + case T_MinMaxAggPath: return "MinMaxAggPath"; break; + case T_WindowAggPath: return "WindowAggPath"; break; + case T_SetOpPath: return "SetOpPath"; break; + case T_RecursiveUnionPath: return "RecursiveUnionPath"; break; + case T_LockRowsPath: return "LockRowsPath"; break; + case T_ModifyTablePath: return "ModifyTablePath"; break; + case T_LimitPath: return "LimitPath"; break; + case T_EquivalenceClass: return "EquivalenceClass"; break; + case T_EquivalenceMember: return "EquivalenceMember"; break; + case T_PathKey: return "PathKey"; break; + case T_PathTarget: return "PathTarget"; break; + case T_RestrictInfo: return "RestrictInfo"; break; + case T_IndexClause: return "IndexClause"; break; + case T_PlaceHolderVar: return "PlaceHolderVar"; break; + case T_SpecialJoinInfo: return "SpecialJoinInfo"; break; + case T_AppendRelInfo: return "AppendRelInfo"; break; + case T_RowIdentityVarInfo: return "RowIdentityVarInfo"; break; + case T_PlaceHolderInfo: return "PlaceHolderInfo"; break; + case T_MinMaxAggInfo: return "MinMaxAggInfo"; break; + case T_PlannerParamItem: return "PlannerParamItem"; break; + case T_RollupData: return "RollupData"; break; + case T_GroupingSetData: return "GroupingSetData"; break; + case T_StatisticExtInfo: return "StatisticExtInfo"; break; + case T_AllocSetContext: return "AllocSetContext"; break; + case T_SlabContext: return "SlabContext"; break; + case T_GenerationContext: return "GenerationContext"; break; + case T_Integer: return "Integer"; break; + case T_Float: return "Float"; break; + case T_Boolean: return "Boolean"; break; + case T_String: return "String"; break; + case T_BitString: return "BitString"; break; + case T_List: return "List"; break; + case T_IntList: return "IntList"; break; + case T_OidList: return "OidList"; break; + case T_ExtensibleNode: return "ExtensibleNode"; break; + case T_RawStmt: return "RawStmt"; break; + case T_Query: return "Query"; break; + case T_PlannedStmt: return "PlannedStmt"; break; + case T_InsertStmt: return "InsertStmt"; break; + case T_DeleteStmt: return "DeleteStmt"; break; + case T_UpdateStmt: return "UpdateStmt"; break; + case T_SelectStmt: return "SelectStmt"; break; + case T_ReturnStmt: return "ReturnStmt"; break; + case T_PLAssignStmt: return "PLAssignStmt"; break; + case T_AlterTableStmt: return "AlterTableStmt"; break; + case T_AlterTableCmd: return "AlterTableCmd"; break; + case T_AlterDomainStmt: return "AlterDomainStmt"; break; + case T_SetOperationStmt: return "SetOperationStmt"; break; + case T_GrantStmt: return "GrantStmt"; break; + case T_GrantRoleStmt: return "GrantRoleStmt"; break; + case T_AlterDefaultPrivilegesStmt: return "AlterDefaultPrivilegesStmt"; break; + case T_ClosePortalStmt: return "ClosePortalStmt"; break; + case T_ClusterStmt: return "ClusterStmt"; break; + case T_CopyStmt: return "CopyStmt"; break; + case T_CreateStmt: return "CreateStmt"; break; + case T_DefineStmt: return "DefineStmt"; break; + case T_DropStmt: return "DropStmt"; break; + case T_TruncateStmt: return "TruncateStmt"; break; + case T_CommentStmt: return "CommentStmt"; break; + case T_FetchStmt: return "FetchStmt"; break; + case T_IndexStmt: return "IndexStmt"; break; + case T_CreateFunctionStmt: return "CreateFunctionStmt"; break; + case T_AlterFunctionStmt: return "AlterFunctionStmt"; break; + case T_DoStmt: return "DoStmt"; break; + case T_RenameStmt: return "RenameStmt"; break; + case T_RuleStmt: return "RuleStmt"; break; + case T_NotifyStmt: return "NotifyStmt"; break; + case T_ListenStmt: return "ListenStmt"; break; + case T_UnlistenStmt: return "UnlistenStmt"; break; + case T_TransactionStmt: return "TransactionStmt"; break; + case T_ViewStmt: return "ViewStmt"; break; + case T_LoadStmt: return "LoadStmt"; break; + case T_CreateDomainStmt: return "CreateDomainStmt"; break; + case T_CreatedbStmt: return "CreatedbStmt"; break; + case T_DropdbStmt: return "DropdbStmt"; break; + case T_VacuumStmt: return "VacuumStmt"; break; + case T_ExplainStmt: return "ExplainStmt"; break; + case T_CreateTableAsStmt: return "CreateTableAsStmt"; break; + case T_CreateSeqStmt: return "CreateSeqStmt"; break; + case T_AlterSeqStmt: return "AlterSeqStmt"; break; + case T_VariableSetStmt: return "VariableSetStmt"; break; + case T_VariableShowStmt: return "VariableShowStmt"; break; + case T_DiscardStmt: return "DiscardStmt"; break; + case T_CreateTrigStmt: return "CreateTrigStmt"; break; + case T_CreatePLangStmt: return "CreatePLangStmt"; break; + case T_CreateRoleStmt: return "CreateRoleStmt"; break; + case T_AlterRoleStmt: return "AlterRoleStmt"; break; + case T_DropRoleStmt: return "DropRoleStmt"; break; + case T_LockStmt: return "LockStmt"; break; + case T_ConstraintsSetStmt: return "ConstraintsSetStmt"; break; + case T_ReindexStmt: return "ReindexStmt"; break; + case T_CheckPointStmt: return "CheckPointStmt"; break; + case T_CreateSchemaStmt: return "CreateSchemaStmt"; break; + case T_AlterDatabaseStmt: return "AlterDatabaseStmt"; break; + case T_AlterDatabaseRefreshCollStmt: return "AlterDatabaseRefreshCollStmt"; break; + case T_AlterDatabaseSetStmt: return "AlterDatabaseSetStmt"; break; + case T_AlterRoleSetStmt: return "AlterRoleSetStmt"; break; + case T_CreateConversionStmt: return "CreateConversionStmt"; break; + case T_CreateCastStmt: return "CreateCastStmt"; break; + case T_CreateOpClassStmt: return "CreateOpClassStmt"; break; + case T_CreateOpFamilyStmt: return "CreateOpFamilyStmt"; break; + case T_AlterOpFamilyStmt: return "AlterOpFamilyStmt"; break; + case T_PrepareStmt: return "PrepareStmt"; break; + case T_ExecuteStmt: return "ExecuteStmt"; break; + case T_DeallocateStmt: return "DeallocateStmt"; break; + case T_DeclareCursorStmt: return "DeclareCursorStmt"; break; + case T_CreateTableSpaceStmt: return "CreateTableSpaceStmt"; break; + case T_DropTableSpaceStmt: return "DropTableSpaceStmt"; break; + case T_AlterObjectDependsStmt: return "AlterObjectDependsStmt"; break; + case T_AlterObjectSchemaStmt: return "AlterObjectSchemaStmt"; break; + case T_AlterOwnerStmt: return "AlterOwnerStmt"; break; + case T_AlterOperatorStmt: return "AlterOperatorStmt"; break; + case T_AlterTypeStmt: return "AlterTypeStmt"; break; + case T_DropOwnedStmt: return "DropOwnedStmt"; break; + case T_ReassignOwnedStmt: return "ReassignOwnedStmt"; break; + case T_CompositeTypeStmt: return "CompositeTypeStmt"; break; + case T_CreateEnumStmt: return "CreateEnumStmt"; break; + case T_CreateRangeStmt: return "CreateRangeStmt"; break; + case T_AlterEnumStmt: return "AlterEnumStmt"; break; + case T_AlterTSDictionaryStmt: return "AlterTSDictionaryStmt"; break; + case T_AlterTSConfigurationStmt: return "AlterTSConfigurationStmt"; break; + case T_CreateFdwStmt: return "CreateFdwStmt"; break; + case T_AlterFdwStmt: return "AlterFdwStmt"; break; + case T_CreateForeignServerStmt: return "CreateForeignServerStmt"; break; + case T_AlterForeignServerStmt: return "AlterForeignServerStmt"; break; + case T_CreateUserMappingStmt: return "CreateUserMappingStmt"; break; + case T_AlterUserMappingStmt: return "AlterUserMappingStmt"; break; + case T_DropUserMappingStmt: return "DropUserMappingStmt"; break; + case T_AlterTableSpaceOptionsStmt: return "AlterTableSpaceOptionsStmt"; break; + case T_AlterTableMoveAllStmt: return "AlterTableMoveAllStmt"; break; + case T_SecLabelStmt: return "SecLabelStmt"; break; + case T_CreateForeignTableStmt: return "CreateForeignTableStmt"; break; + case T_ImportForeignSchemaStmt: return "ImportForeignSchemaStmt"; break; + case T_CreateExtensionStmt: return "CreateExtensionStmt"; break; + case T_AlterExtensionStmt: return "AlterExtensionStmt"; break; + case T_AlterExtensionContentsStmt: return "AlterExtensionContentsStmt"; break; + case T_CreateEventTrigStmt: return "CreateEventTrigStmt"; break; + case T_AlterEventTrigStmt: return "AlterEventTrigStmt"; break; + case T_RefreshMatViewStmt: return "RefreshMatViewStmt"; break; + case T_ReplicaIdentityStmt: return "ReplicaIdentityStmt"; break; + case T_AlterSystemStmt: return "AlterSystemStmt"; break; + case T_CreatePolicyStmt: return "CreatePolicyStmt"; break; + case T_AlterPolicyStmt: return "AlterPolicyStmt"; break; + case T_CreateTransformStmt: return "CreateTransformStmt"; break; + case T_CreateAmStmt: return "CreateAmStmt"; break; + case T_CreatePublicationStmt: return "CreatePublicationStmt"; break; + case T_AlterPublicationStmt: return "AlterPublicationStmt"; break; + case T_CreateSubscriptionStmt: return "CreateSubscriptionStmt"; break; + case T_AlterSubscriptionStmt: return "AlterSubscriptionStmt"; break; + case T_DropSubscriptionStmt: return "DropSubscriptionStmt"; break; + case T_CreateStatsStmt: return "CreateStatsStmt"; break; + case T_AlterCollationStmt: return "AlterCollationStmt"; break; + case T_CallStmt: return "CallStmt"; break; + case T_AlterStatsStmt: return "AlterStatsStmt"; break; + case T_A_Expr: return "A_Expr"; break; + case T_ColumnRef: return "ColumnRef"; break; + case T_ParamRef: return "ParamRef"; break; + case T_A_Const: return "A_Const"; break; + case T_FuncCall: return "FuncCall"; break; + case T_A_Star: return "A_Star"; break; + case T_A_Indices: return "A_Indices"; break; + case T_A_Indirection: return "A_Indirection"; break; + case T_A_ArrayExpr: return "A_ArrayExpr"; break; + case T_ResTarget: return "ResTarget"; break; + case T_MultiAssignRef: return "MultiAssignRef"; break; + case T_TypeCast: return "TypeCast"; break; + case T_CollateClause: return "CollateClause"; break; + case T_SortBy: return "SortBy"; break; + case T_WindowDef: return "WindowDef"; break; + case T_RangeSubselect: return "RangeSubselect"; break; + case T_RangeFunction: return "RangeFunction"; break; + case T_RangeTableSample: return "RangeTableSample"; break; + case T_RangeTableFunc: return "RangeTableFunc"; break; + case T_RangeTableFuncCol: return "RangeTableFuncCol"; break; + case T_TypeName: return "TypeName"; break; + case T_ColumnDef: return "ColumnDef"; break; + case T_IndexElem: return "IndexElem"; break; + case T_StatsElem: return "StatsElem"; break; + case T_Constraint: return "Constraint"; break; + case T_DefElem: return "DefElem"; break; + case T_RangeTblEntry: return "RangeTblEntry"; break; + case T_RangeTblFunction: return "RangeTblFunction"; break; + case T_TableSampleClause: return "TableSampleClause"; break; + case T_WithCheckOption: return "WithCheckOption"; break; + case T_SortGroupClause: return "SortGroupClause"; break; + case T_GroupingSet: return "GroupingSet"; break; + case T_WindowClause: return "WindowClause"; break; + case T_ObjectWithArgs: return "ObjectWithArgs"; break; + case T_AccessPriv: return "AccessPriv"; break; + case T_CreateOpClassItem: return "CreateOpClassItem"; break; + case T_TableLikeClause: return "TableLikeClause"; break; + case T_FunctionParameter: return "FunctionParameter"; break; + case T_LockingClause: return "LockingClause"; break; + case T_RowMarkClause: return "RowMarkClause"; break; + case T_XmlSerialize: return "XmlSerialize"; break; + case T_WithClause: return "WithClause"; break; + case T_InferClause: return "InferClause"; break; + case T_OnConflictClause: return "OnConflictClause"; break; + case T_CTESearchClause: return "CTESearchClause"; break; + case T_CTECycleClause: return "CTECycleClause"; break; + case T_CommonTableExpr: return "CommonTableExpr"; break; + case T_RoleSpec: return "RoleSpec"; break; + case T_TriggerTransition: return "TriggerTransition"; break; + case T_PartitionElem: return "PartitionElem"; break; + case T_PartitionSpec: return "PartitionSpec"; break; + case T_PartitionBoundSpec: return "PartitionBoundSpec"; break; + case T_PartitionRangeDatum: return "PartitionRangeDatum"; break; + case T_PartitionCmd: return "PartitionCmd"; break; + case T_VacuumRelation: return "VacuumRelation"; break; + case T_PublicationObjSpec: return "PublicationObjSpec"; break; + case T_PublicationTable: return "PublicationTable"; break; + case T_IdentifySystemCmd: return "IdentifySystemCmd"; break; + case T_BaseBackupCmd: return "BaseBackupCmd"; break; + case T_CreateReplicationSlotCmd: return "CreateReplicationSlotCmd"; break; + case T_DropReplicationSlotCmd: return "DropReplicationSlotCmd"; break; + case T_ReadReplicationSlotCmd: return "ReadReplicationSlotCmd"; break; + case T_StartReplicationCmd: return "StartReplicationCmd"; break; + case T_TimeLineHistoryCmd: return "TimeLineHistoryCmd"; break; + case T_TriggerData: return "TriggerData"; break; + case T_EventTriggerData: return "EventTriggerData"; break; + case T_ReturnSetInfo: return "ReturnSetInfo"; break; + case T_WindowObjectData: return "WindowObjectData"; break; + case T_TIDBitmap: return "TIDBitmap"; break; + case T_InlineCodeBlock: return "InlineCodeBlock"; break; + case T_FdwRoutine: return "FdwRoutine"; break; + case T_IndexAmRoutine: return "IndexAmRoutine"; break; + case T_TableAmRoutine: return "TableAmRoutine"; break; + case T_TsmRoutine: return "TsmRoutine"; break; + case T_ForeignKeyCacheInfo: return "ForeignKeyCacheInfo"; break; + case T_CallContext: return "CallContext"; break; + case T_SupportRequestSimplify: return "SupportRequestSimplify"; break; + case T_SupportRequestSelectivity: return "SupportRequestSelectivity"; break; + case T_SupportRequestCost: return "SupportRequestCost"; break; + case T_SupportRequestRows: return "SupportRequestRows"; break; + case T_SupportRequestIndexCondition: return "SupportRequestIndexCondition"; break; + default: + break; + } + return "UNRECOGNIZED NodeTag"; +} + +static char * +accesstype_to_string(ObjectAccessType access, int subId) +{ + const char *type; + + switch (access) + { + case OAT_POST_CREATE: + type = "create"; + break; + case OAT_DROP: + type = "drop"; + break; + case OAT_POST_ALTER: + type = "alter"; + break; + case OAT_NAMESPACE_SEARCH: + type = "namespace search"; + break; + case OAT_FUNCTION_EXECUTE: + type = "execute"; + break; + case OAT_TRUNCATE: + type = "truncate"; + break; + default: + type = "UNRECOGNIZED ObjectAccessType"; + } + + if (subId & ACL_SET_VALUE) + return psprintf("%s (set)", type); + if (subId & ACL_ALTER_SYSTEM) + return psprintf("%s (alter system set)", type); + + return psprintf("%s (subId=%d)", type, subId); +} + +static char * +accesstype_arg_to_string(ObjectAccessType access, void *arg) +{ + if (arg == NULL) + return pstrdup("extra info null"); + + switch (access) + { + case OAT_POST_CREATE: + { + ObjectAccessPostCreate *pc_arg = (ObjectAccessPostCreate *)arg; + return pstrdup(pc_arg->is_internal ? "internal" : "explicit"); + } + break; + case OAT_DROP: + { + ObjectAccessDrop *drop_arg = (ObjectAccessDrop *)arg; + + return psprintf("%s%s%s%s%s%s", + ((drop_arg->dropflags & PERFORM_DELETION_INTERNAL) + ? "internal action," : ""), + ((drop_arg->dropflags & PERFORM_DELETION_INTERNAL) + ? "concurrent drop," : ""), + ((drop_arg->dropflags & PERFORM_DELETION_INTERNAL) + ? "suppress notices," : ""), + ((drop_arg->dropflags & PERFORM_DELETION_INTERNAL) + ? "keep original object," : ""), + ((drop_arg->dropflags & PERFORM_DELETION_INTERNAL) + ? "keep extensions," : ""), + ((drop_arg->dropflags & PERFORM_DELETION_INTERNAL) + ? "normal concurrent drop," : "")); + } + break; + case OAT_POST_ALTER: + { + ObjectAccessPostAlter *pa_arg = (ObjectAccessPostAlter*)arg; + + return psprintf("%s %s auxiliary object", + (pa_arg->is_internal ? "internal" : "explicit"), + (OidIsValid(pa_arg->auxiliary_id) ? "with" : "without")); + } + break; + case OAT_NAMESPACE_SEARCH: + { + ObjectAccessNamespaceSearch *ns_arg = (ObjectAccessNamespaceSearch *)arg; + + return psprintf("%s, %s", + (ns_arg->ereport_on_violation ? "report on violation" : "no report on violation"), + (ns_arg->result ? "allowed" : "denied")); + } + break; + case OAT_TRUNCATE: + case OAT_FUNCTION_EXECUTE: + /* hook takes no arg. */ + return pstrdup("unexpected extra info pointer received"); + default: + return pstrdup("cannot parse extra info for unrecognized access type"); + } + + return pstrdup("unknown"); +} diff --git a/src/test/modules/test_oat_hooks/test_oat_hooks.conf b/src/test/modules/test_oat_hooks/test_oat_hooks.conf new file mode 100644 index 0000000000..a44cbdd4a4 --- /dev/null +++ b/src/test/modules/test_oat_hooks/test_oat_hooks.conf @@ -0,0 +1 @@ +shared_preload_libraries = test_oat_hooks From ce8c978295a55912dc81f9fbcd4f9f6d35379224 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 22 Mar 2022 08:15:40 -0700 Subject: [PATCH 207/772] pgstat: fix function name in comment. Introduced in 3fa17d37716. --- src/backend/postmaster/pgstat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 1e7adc27b9..c10311e036 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -2132,7 +2132,7 @@ pgstat_get_tab_entry(PgStat_StatDBEntry *dbentry, Oid tableoid, bool create) } /* ---------- - * pgstat_replslot_entry + * pgstat_get_replslot_entry * * Return the entry of replication slot stats with the given name. Return * NULL if not found and the caller didn't request to create it. From 097786fbbb58897fec12ed9bfff3940c77b5867b Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 22 Mar 2022 08:22:02 -0700 Subject: [PATCH 208/772] Add missing dependency of pg_dumpall to WIN32RES. When cross-building to windows, or building with mingw on windows, the build could fail with x86_64-w64-mingw32-gcc: error: win32ver.o: No such file or director because pg_dumpall didn't depend on WIN32RES, but it's recipe references it. The build nevertheless succeeded most of the time, due to pg_dump/pg_restore having the required dependency, causing win32ver.o to be built. Reported-By: Thomas Munro Discussion: https://postgr.es/m/CA+hUKGJeekpUPWW6yCVdf9=oBAcCp86RrBivo4Y4cwazAzGPng@mail.gmail.com Backpatch: 10-, omission present on all live branches --- src/bin/pg_dump/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/pg_dump/Makefile b/src/bin/pg_dump/Makefile index 84306d94ee..302f7e02d6 100644 --- a/src/bin/pg_dump/Makefile +++ b/src/bin/pg_dump/Makefile @@ -40,7 +40,7 @@ pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) | submake-libpq submake-libpg pg_restore: pg_restore.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils $(CC) $(CFLAGS) pg_restore.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) -pg_dumpall: pg_dumpall.o dumputils.o | submake-libpq submake-libpgport submake-libpgfeutils +pg_dumpall: pg_dumpall.o dumputils.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils $(CC) $(CFLAGS) pg_dumpall.o dumputils.o $(WIN32RES) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) install: all installdirs From f0206d99520ebdb751469ad53ff62bbff817ab3d Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Tue, 22 Mar 2022 13:27:26 -0400 Subject: [PATCH 209/772] Fix new Object Access hooks test Commit 90efa2f556 caused some issues with EXEC_BACKEND builds and with force_parallel_mode = regress setups. For the first issue we no longer test if the module has been preloaded, and in fact we don't preload it, but simply LOAD it in the test script. For the second issue we suppress error messages emanating from parallel workers. Mark Dilger Discussion: https://postgr.es/m/7f6d54a1-4024-3b6e-e3ec-26cd394aac9e@dunslane.net --- src/test/modules/test_oat_hooks/Makefile | 3 --- .../test_oat_hooks/expected/test_oat_hooks.out | 1 + .../modules/test_oat_hooks/sql/test_oat_hooks.sql | 1 + src/test/modules/test_oat_hooks/test_oat_hooks.c | 12 ++---------- src/test/modules/test_oat_hooks/test_oat_hooks.conf | 1 - 5 files changed, 4 insertions(+), 14 deletions(-) delete mode 100644 src/test/modules/test_oat_hooks/test_oat_hooks.conf diff --git a/src/test/modules/test_oat_hooks/Makefile b/src/test/modules/test_oat_hooks/Makefile index d0df9c1abb..d03ef2caf1 100644 --- a/src/test/modules/test_oat_hooks/Makefile +++ b/src/test/modules/test_oat_hooks/Makefile @@ -7,9 +7,6 @@ OBJS = \ PGFILEDESC = "test_oat_hooks - example use of object access hooks" REGRESS = test_oat_hooks -REGRESS_OPTS = --temp-config=$(top_srcdir)/src/test/modules/test_oat_hooks/test_oat_hooks.conf -# Disabled because these tests require "shared_preload_libraries=test_oat_hooks", -# which typical installcheck users do not have (e.g. buildfarm clients). NO_INSTALLCHECK = 1 ifdef USE_PGXS diff --git a/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out b/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out index 2035769580..4192a2fb49 100644 --- a/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out +++ b/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out @@ -2,6 +2,7 @@ -- object_access_hook_str. Since the auditing GUC starts out false, we miss the -- initial "attempting" audit message from the ProcessUtility_hook, but we -- should thereafter see the audit messages +LOAD 'test_oat_hooks'; SET test_oat_hooks.audit = true; NOTICE: in object_access_hook_str: superuser attempting alter (set) [test_oat_hooks.audit] NOTICE: in object_access_hook_str: superuser finished alter (set) [test_oat_hooks.audit] diff --git a/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql b/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql index 5fb3a2f0ea..7c38202782 100644 --- a/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql +++ b/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql @@ -2,6 +2,7 @@ -- object_access_hook_str. Since the auditing GUC starts out false, we miss the -- initial "attempting" audit message from the ProcessUtility_hook, but we -- should thereafter see the audit messages +LOAD 'test_oat_hooks'; SET test_oat_hooks.audit = true; -- Create objects for use in the test diff --git a/src/test/modules/test_oat_hooks/test_oat_hooks.c b/src/test/modules/test_oat_hooks/test_oat_hooks.c index b1709f4d63..b50567749c 100644 --- a/src/test/modules/test_oat_hooks/test_oat_hooks.c +++ b/src/test/modules/test_oat_hooks/test_oat_hooks.c @@ -13,6 +13,7 @@ #include "postgres.h" +#include "access/parallel.h" #include "catalog/dependency.h" #include "catalog/objectaccess.h" #include "catalog/pg_proc.h" @@ -68,15 +69,6 @@ void _PG_fini(void); void _PG_init(void) { - /* - * We allow to load the Object Access Type test module on single-user-mode - * or shared_preload_libraries settings only. - */ - if (IsUnderPostmaster) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("test_oat_hooks must be loaded via shared_preload_libraries"))); - /* * test_oat_hooks.deny_set_variable = (on|off) */ @@ -200,7 +192,7 @@ _PG_fini(void) static void emit_audit_message(const char *type, const char *hook, char *action, char *objName) { - if (REGRESS_audit) + if (REGRESS_audit && !IsParallelWorker()) { const char *who = superuser_arg(GetUserId()) ? "superuser" : "non-superuser"; diff --git a/src/test/modules/test_oat_hooks/test_oat_hooks.conf b/src/test/modules/test_oat_hooks/test_oat_hooks.conf deleted file mode 100644 index a44cbdd4a4..0000000000 --- a/src/test/modules/test_oat_hooks/test_oat_hooks.conf +++ /dev/null @@ -1 +0,0 @@ -shared_preload_libraries = test_oat_hooks From a3b071bbe050252b35c589a7f1a2ee2f7ee3e9d4 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Tue, 22 Mar 2022 16:18:06 -0400 Subject: [PATCH 210/772] Tidy up Object Access hooks tests per gripelet from Tom Lane. --- src/test/modules/test_oat_hooks/Makefile | 5 +---- src/test/modules/test_oat_hooks/expected/test_oat_hooks.out | 2 +- src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql | 2 +- src/test/modules/test_oat_hooks/test_oat_hooks.c | 5 +++++ 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/test/modules/test_oat_hooks/Makefile b/src/test/modules/test_oat_hooks/Makefile index d03ef2caf1..ba068acc53 100644 --- a/src/test/modules/test_oat_hooks/Makefile +++ b/src/test/modules/test_oat_hooks/Makefile @@ -1,13 +1,10 @@ # src/test/modules/test_oat_hooks/Makefile MODULE_big = test_oat_hooks -OBJS = \ - $(WIN32RES) \ - test_oat_hooks.o +OBJS = test_oat_hooks.o $(WIN32RES) PGFILEDESC = "test_oat_hooks - example use of object access hooks" REGRESS = test_oat_hooks -NO_INSTALLCHECK = 1 ifdef USE_PGXS PG_CONFIG = pg_config diff --git a/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out b/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out index 4192a2fb49..45ff276f7e 100644 --- a/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out +++ b/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out @@ -155,7 +155,7 @@ NOTICE: in process utility: superuser attempting set NOTICE: in object_access_hook_str: superuser attempting alter (set) [test_oat_hooks.deny_utility_commands] NOTICE: in object_access_hook_str: superuser finished alter (set) [test_oat_hooks.deny_utility_commands] NOTICE: in process utility: superuser finished set --- Try again as non-superuser with permisisons denied +-- Try again as non-superuser with permissions denied SET SESSION AUTHORIZATION regress_test_user; NOTICE: in process utility: superuser attempting set NOTICE: in object_access_hook_str: non-superuser attempting alter (set) [session_authorization] diff --git a/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql b/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql index 7c38202782..09e61864ee 100644 --- a/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql +++ b/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql @@ -39,7 +39,7 @@ SET test_oat_hooks.deny_object_access = true; SET test_oat_hooks.deny_exec_perms = true; SET test_oat_hooks.deny_utility_commands = true; --- Try again as non-superuser with permisisons denied +-- Try again as non-superuser with permissions denied SET SESSION AUTHORIZATION regress_test_user; SELECT * FROM regress_test_table; SELECT regress_test_func('arg'); diff --git a/src/test/modules/test_oat_hooks/test_oat_hooks.c b/src/test/modules/test_oat_hooks/test_oat_hooks.c index b50567749c..eb7564ce22 100644 --- a/src/test/modules/test_oat_hooks/test_oat_hooks.c +++ b/src/test/modules/test_oat_hooks/test_oat_hooks.c @@ -192,6 +192,11 @@ _PG_fini(void) static void emit_audit_message(const char *type, const char *hook, char *action, char *objName) { + /* + * Ensure that audit messages are not duplicated by only emitting them from + * a leader process, not a worker process. This makes the test results + * deterministic even if run with force_parallel_mode = regress. + */ if (REGRESS_audit && !IsParallelWorker()) { const char *who = superuser_arg(GetUserId()) ? "superuser" : "non-superuser"; From 865fe4d5df560a6f5353da652018ff876978ad2d Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 3 Mar 2022 13:00:49 -0500 Subject: [PATCH 211/772] Common SQL/JSON clauses This introduces some of the building blocks used by the SQL/JSON constructor and query functions. Specifically, it provides node executor and grammar support for the FORMAT JSON [ENCODING foo] clause, and values decorated with it, and for the RETURNING clause. The following SQL/JSON patches will leverage these. Nikita Glukhov (who probably deserves an award for perseverance). Reviewers have included (in no particular order) Andres Freund, Alexander Korotkov, Pavel Stehule, Andrew Alsup. Erik Rijkers, Zihong Yu and Himanshu Upadhyaya. Discussion: https://postgr.es/m/cd0bb935-0158-78a7-08b5-904886deac4b@postgrespro.ru --- src/backend/executor/execExpr.c | 22 ++++ src/backend/nodes/copyfuncs.c | 55 ++++++++ src/backend/nodes/equalfuncs.c | 39 ++++++ src/backend/nodes/makefuncs.c | 54 ++++++++ src/backend/nodes/nodeFuncs.c | 66 ++++++++++ src/backend/nodes/outfuncs.c | 39 ++++++ src/backend/nodes/readfuncs.c | 51 ++++++++ src/backend/optimizer/util/clauses.c | 23 ++++ src/backend/parser/gram.y | 65 +++++++++- src/backend/parser/parse_expr.c | 181 +++++++++++++++++++++++++++ src/backend/utils/adt/ruleutils.c | 56 +++++++++ src/backend/utils/misc/queryjumble.c | 26 ++++ src/include/nodes/makefuncs.h | 5 + src/include/nodes/nodes.h | 4 + src/include/nodes/parsenodes.h | 13 ++ src/include/nodes/primnodes.h | 59 +++++++++ src/include/parser/kwlist.h | 2 + 17 files changed, 758 insertions(+), 2 deletions(-) diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index e0656bfe85..d0b91e881d 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -2428,6 +2428,28 @@ ExecInitExprRec(Expr *node, ExprState *state, break; } + case T_JsonValueExpr: + { + JsonValueExpr *jve = (JsonValueExpr *) node; + + ExecInitExprRec(jve->raw_expr, state, resv, resnull); + + if (jve->formatted_expr) + { + Datum *innermost_caseval = state->innermost_caseval; + bool *innermost_isnull = state->innermost_casenull; + + state->innermost_caseval = resv; + state->innermost_casenull = resnull; + + ExecInitExprRec(jve->formatted_expr, state, resv, resnull); + + state->innermost_caseval = innermost_caseval; + state->innermost_casenull = innermost_isnull; + } + break; + } + default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index d4f8455a2b..55c36b46a8 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -2298,6 +2298,52 @@ _copyOnConflictExpr(const OnConflictExpr *from) return newnode; } + +/* + * _copyJsonFormat + */ +static JsonFormat * +_copyJsonFormat(const JsonFormat *from) +{ + JsonFormat *newnode = makeNode(JsonFormat); + + COPY_SCALAR_FIELD(format_type); + COPY_SCALAR_FIELD(encoding); + COPY_LOCATION_FIELD(location); + + return newnode; +} + +/* + * _copyJsonReturning + */ +static JsonReturning * +_copyJsonReturning(const JsonReturning *from) +{ + JsonReturning *newnode = makeNode(JsonReturning); + + COPY_NODE_FIELD(format); + COPY_SCALAR_FIELD(typid); + COPY_SCALAR_FIELD(typmod); + + return newnode; +} + +/* + * _copyJsonValueExpr + */ +static JsonValueExpr * +_copyJsonValueExpr(const JsonValueExpr *from) +{ + JsonValueExpr *newnode = makeNode(JsonValueExpr); + + COPY_NODE_FIELD(raw_expr); + COPY_NODE_FIELD(formatted_expr); + COPY_NODE_FIELD(format); + + return newnode; +} + /* **************************************************************** * pathnodes.h copy functions * @@ -5350,6 +5396,15 @@ copyObjectImpl(const void *from) case T_OnConflictExpr: retval = _copyOnConflictExpr(from); break; + case T_JsonFormat: + retval = _copyJsonFormat(from); + break; + case T_JsonReturning: + retval = _copyJsonReturning(from); + break; + case T_JsonValueExpr: + retval = _copyJsonValueExpr(from); + break; /* * RELATION NODES diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index f1002afe7a..0ddebd066e 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -841,6 +841,36 @@ _equalOnConflictExpr(const OnConflictExpr *a, const OnConflictExpr *b) return true; } +static bool +_equalJsonFormat(const JsonFormat *a, const JsonFormat *b) +{ + COMPARE_SCALAR_FIELD(format_type); + COMPARE_SCALAR_FIELD(encoding); + COMPARE_LOCATION_FIELD(location); + + return true; +} + +static bool +_equalJsonReturning(const JsonReturning *a, const JsonReturning *b) +{ + COMPARE_NODE_FIELD(format); + COMPARE_SCALAR_FIELD(typid); + COMPARE_SCALAR_FIELD(typmod); + + return true; +} + +static bool +_equalJsonValueExpr(const JsonValueExpr *a, const JsonValueExpr *b) +{ + COMPARE_NODE_FIELD(raw_expr); + COMPARE_NODE_FIELD(formatted_expr); + COMPARE_NODE_FIELD(format); + + return true; +} + /* * Stuff from pathnodes.h */ @@ -3358,6 +3388,15 @@ equal(const void *a, const void *b) case T_JoinExpr: retval = _equalJoinExpr(a, b); break; + case T_JsonFormat: + retval = _equalJsonFormat(a, b); + break; + case T_JsonReturning: + retval = _equalJsonReturning(a, b); + break; + case T_JsonValueExpr: + retval = _equalJsonValueExpr(a, b); + break; /* * RELATION NODES diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c index c85d8fe975..867a927e7a 100644 --- a/src/backend/nodes/makefuncs.c +++ b/src/backend/nodes/makefuncs.c @@ -19,6 +19,7 @@ #include "catalog/pg_type.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" +#include "utils/errcodes.h" #include "utils/lsyscache.h" @@ -818,3 +819,56 @@ makeVacuumRelation(RangeVar *relation, Oid oid, List *va_cols) v->va_cols = va_cols; return v; } + +/* + * makeJsonFormat - + * creates a JsonFormat node + */ +JsonFormat * +makeJsonFormat(JsonFormatType type, JsonEncoding encoding, int location) +{ + JsonFormat *jf = makeNode(JsonFormat); + + jf->format_type = type; + jf->encoding = encoding; + jf->location = location; + + return jf; +} + +/* + * makeJsonValueExpr - + * creates a JsonValueExpr node + */ +JsonValueExpr * +makeJsonValueExpr(Expr *expr, JsonFormat *format) +{ + JsonValueExpr *jve = makeNode(JsonValueExpr); + + jve->raw_expr = expr; + jve->formatted_expr = NULL; + jve->format = format; + + return jve; +} + +/* + * makeJsonEncoding - + * converts JSON encoding name to enum JsonEncoding + */ +JsonEncoding +makeJsonEncoding(char *name) +{ + if (!pg_strcasecmp(name, "utf8")) + return JS_ENC_UTF8; + if (!pg_strcasecmp(name, "utf16")) + return JS_ENC_UTF16; + if (!pg_strcasecmp(name, "utf32")) + return JS_ENC_UTF32; + + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized JSON encoding: %s", name))); + + return JS_ENC_DEFAULT; +} diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index ec25aae6e3..0b242c76ec 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -250,6 +250,13 @@ exprType(const Node *expr) case T_PlaceHolderVar: type = exprType((Node *) ((const PlaceHolderVar *) expr)->phexpr); break; + case T_JsonValueExpr: + { + const JsonValueExpr *jve = (const JsonValueExpr *) expr; + + type = exprType((Node *) (jve->formatted_expr ? jve->formatted_expr : jve->raw_expr)); + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); type = InvalidOid; /* keep compiler quiet */ @@ -482,6 +489,8 @@ exprTypmod(const Node *expr) return ((const SetToDefault *) expr)->typeMod; case T_PlaceHolderVar: return exprTypmod((Node *) ((const PlaceHolderVar *) expr)->phexpr); + case T_JsonValueExpr: + return exprTypmod((Node *) ((const JsonValueExpr *) expr)->formatted_expr); default: break; } @@ -958,6 +967,9 @@ exprCollation(const Node *expr) case T_PlaceHolderVar: coll = exprCollation((Node *) ((const PlaceHolderVar *) expr)->phexpr); break; + case T_JsonValueExpr: + coll = exprCollation((Node *) ((const JsonValueExpr *) expr)->formatted_expr); + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); coll = InvalidOid; /* keep compiler quiet */ @@ -1170,6 +1182,10 @@ exprSetCollation(Node *expr, Oid collation) /* NextValueExpr's result is an integer type ... */ Assert(!OidIsValid(collation)); /* ... so never set a collation */ break; + case T_JsonValueExpr: + exprSetCollation((Node *) ((JsonValueExpr *) expr)->formatted_expr, + collation); + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); break; @@ -1616,6 +1632,9 @@ exprLocation(const Node *expr) case T_PartitionRangeDatum: loc = ((const PartitionRangeDatum *) expr)->location; break; + case T_JsonValueExpr: + loc = exprLocation((Node *) ((const JsonValueExpr *) expr)->raw_expr); + break; default: /* for any other node type it's just unknown... */ loc = -1; @@ -2350,6 +2369,16 @@ expression_tree_walker(Node *node, return true; } break; + case T_JsonValueExpr: + { + JsonValueExpr *jve = (JsonValueExpr *) node; + + if (walker(jve->raw_expr, context)) + return true; + if (walker(jve->formatted_expr, context)) + return true; + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); @@ -2680,6 +2709,7 @@ expression_tree_mutator(Node *node, case T_RangeTblRef: case T_SortGroupClause: case T_CTESearchClause: + case T_JsonFormat: return (Node *) copyObject(node); case T_WithCheckOption: { @@ -3311,6 +3341,28 @@ expression_tree_mutator(Node *node, return (Node *) newnode; } break; + case T_JsonReturning: + { + JsonReturning *jr = (JsonReturning *) node; + JsonReturning *newnode; + + FLATCOPY(newnode, jr, JsonReturning); + MUTATE(newnode->format, jr->format, JsonFormat *); + + return (Node *) newnode; + } + case T_JsonValueExpr: + { + JsonValueExpr *jve = (JsonValueExpr *) node; + JsonValueExpr *newnode; + + FLATCOPY(newnode, jve, JsonValueExpr); + MUTATE(newnode->raw_expr, jve->raw_expr, Expr *); + MUTATE(newnode->formatted_expr, jve->formatted_expr, Expr *); + MUTATE(newnode->format, jve->format, JsonFormat *); + + return (Node *) newnode; + } default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); @@ -4019,6 +4071,20 @@ raw_expression_tree_walker(Node *node, case T_CommonTableExpr: /* search_clause and cycle_clause are not interesting here */ return walker(((CommonTableExpr *) node)->ctequery, context); + case T_JsonReturning: + return walker(((JsonReturning *) node)->format, context); + case T_JsonValueExpr: + { + JsonValueExpr *jve = (JsonValueExpr *) node; + + if (walker(jve->raw_expr, context)) + return true; + if (walker(jve->formatted_expr, context)) + return true; + if (walker(jve->format, context)) + return true; + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 6bdad462c7..449d90c8f4 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1751,6 +1751,36 @@ _outOnConflictExpr(StringInfo str, const OnConflictExpr *node) WRITE_NODE_FIELD(exclRelTlist); } +static void +_outJsonFormat(StringInfo str, const JsonFormat *node) +{ + WRITE_NODE_TYPE("JSONFORMAT"); + + WRITE_ENUM_FIELD(format_type, JsonFormatType); + WRITE_ENUM_FIELD(encoding, JsonEncoding); + WRITE_LOCATION_FIELD(location); +} + +static void +_outJsonReturning(StringInfo str, const JsonReturning *node) +{ + WRITE_NODE_TYPE("JSONRETURNING"); + + WRITE_NODE_FIELD(format); + WRITE_OID_FIELD(typid); + WRITE_INT_FIELD(typmod); +} + +static void +_outJsonValueExpr(StringInfo str, const JsonValueExpr *node) +{ + WRITE_NODE_TYPE("JSONVALUEEXPR"); + + WRITE_NODE_FIELD(raw_expr); + WRITE_NODE_FIELD(formatted_expr); + WRITE_NODE_FIELD(format); +} + /***************************************************************************** * * Stuff from pathnodes.h. @@ -4537,6 +4567,15 @@ outNode(StringInfo str, const void *obj) case T_PartitionRangeDatum: _outPartitionRangeDatum(str, obj); break; + case T_JsonFormat: + _outJsonFormat(str, obj); + break; + case T_JsonReturning: + _outJsonReturning(str, obj); + break; + case T_JsonValueExpr: + _outJsonValueExpr(str, obj); + break; default: diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 3f68f7c18d..6f398cdc15 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -1389,6 +1389,51 @@ _readOnConflictExpr(void) READ_DONE(); } +/* + * _readJsonFormat + */ +static JsonFormat * +_readJsonFormat(void) +{ + READ_LOCALS(JsonFormat); + + READ_ENUM_FIELD(format_type, JsonFormatType); + READ_ENUM_FIELD(encoding, JsonEncoding); + READ_LOCATION_FIELD(location); + + READ_DONE(); +} + +/* + * _readJsonReturning + */ +static JsonReturning * +_readJsonReturning(void) +{ + READ_LOCALS(JsonReturning); + + READ_NODE_FIELD(format); + READ_OID_FIELD(typid); + READ_INT_FIELD(typmod); + + READ_DONE(); +} + +/* + * _readJsonValueExpr + */ +static JsonValueExpr * +_readJsonValueExpr(void) +{ + READ_LOCALS(JsonValueExpr); + + READ_NODE_FIELD(raw_expr); + READ_NODE_FIELD(formatted_expr); + READ_NODE_FIELD(format); + + READ_DONE(); +} + /* * Stuff from pathnodes.h. * @@ -2974,6 +3019,12 @@ parseNodeString(void) return_value = _readPartitionBoundSpec(); else if (MATCH("PARTITIONRANGEDATUM", 19)) return_value = _readPartitionRangeDatum(); + else if (MATCH("JSONFORMAT", 10)) + return_value = _readJsonFormat(); + else if (MATCH("JSONRETURNING", 13)) + return_value = _readJsonReturning(); + else if (MATCH("JSONVALUEEXPR", 13)) + return_value = _readJsonValueExpr(); else { elog(ERROR, "badly formatted node string \"%.32s\"...", token); diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index 413dcac036..b9cefe8847 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -3512,6 +3512,29 @@ eval_const_expressions_mutator(Node *node, return ece_evaluate_expr((Node *) newcre); return (Node *) newcre; } + case T_JsonValueExpr: + { + JsonValueExpr *jve = (JsonValueExpr *) node; + Node *raw = eval_const_expressions_mutator((Node *) jve->raw_expr, + context); + + if (raw && IsA(raw, Const)) + { + Node *formatted; + Node *save_case_val = context->case_val; + + context->case_val = raw; + + formatted = eval_const_expressions_mutator((Node *) jve->formatted_expr, + context); + + context->case_val = save_case_val; + + if (formatted && IsA(formatted, Const)) + return formatted; + } + break; + } default: break; } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 0036c2f9e2..204b754eba 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -635,6 +635,14 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type hash_partbound_elem +%type json_format_clause_opt + json_representation + json_value_expr + json_output_clause_opt + +%type json_encoding + json_encoding_clause_opt + /* * Non-keyword token types. These are hard-wired into the "flex" lexer. * They must be listed first so that their numeric codes do not depend on @@ -686,7 +694,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); EXTENSION EXTERNAL EXTRACT FALSE_P FAMILY FETCH FILTER FINALIZE FIRST_P FLOAT_P FOLLOWING FOR - FORCE FOREIGN FORWARD FREEZE FROM FULL FUNCTION FUNCTIONS + FORCE FOREIGN FORMAT FORWARD FREEZE FROM FULL FUNCTION FUNCTIONS GENERATED GLOBAL GRANT GRANTED GREATEST GROUP_P GROUPING GROUPS @@ -697,7 +705,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION - JOIN + JOIN JSON KEY @@ -781,6 +789,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); /* Precedence: lowest to highest */ %nonassoc SET /* see relation_expr_opt_alias */ +%right FORMAT %left UNION EXCEPT %left INTERSECT %left OR @@ -15235,6 +15244,54 @@ opt_asymmetric: ASYMMETRIC | /*EMPTY*/ ; +/* SQL/JSON support */ + +json_value_expr: + a_expr json_format_clause_opt + { + $$ = (Node *) makeJsonValueExpr((Expr *) $1, $2); + } + ; + +json_format_clause_opt: + FORMAT json_representation + { + $$ = $2; + $$.location = @1; + } + | /* EMPTY */ + { + $$ = (Node *) makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1); + } + ; + +json_representation: + JSON json_encoding_clause_opt + { + $$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, $2, @1); + } + /* | other implementation defined JSON representation options (BSON, AVRO etc) */ + ; + +json_encoding_clause_opt: + ENCODING json_encoding { $$ = $2; } + | /* EMPTY */ { $$ = JS_ENC_DEFAULT; } + ; + +json_encoding: + name { $$ = makeJsonEncoding($1); } + ; + +json_output_clause_opt: + RETURNING Typename json_format_clause_opt + { + JsonOutput *n = makeNode(JsonOutput); + n->typeName = $2; + n->returning.format = $3; + $$ = (Node *) n; + } + | /* EMPTY */ { $$ = NULL; } + ; /***************************************************************************** * @@ -15776,6 +15833,7 @@ unreserved_keyword: | FIRST_P | FOLLOWING | FORCE + | FORMAT | FORWARD | FUNCTION | FUNCTIONS @@ -15807,6 +15865,7 @@ unreserved_keyword: | INSTEAD | INVOKER | ISOLATION + | JSON | KEY | LABEL | LANGUAGE @@ -16323,6 +16382,7 @@ bare_label_keyword: | FOLLOWING | FORCE | FOREIGN + | FORMAT | FORWARD | FREEZE | FULL @@ -16367,6 +16427,7 @@ bare_label_keyword: | IS | ISOLATION | JOIN + | JSON | KEY | LABEL | LANGUAGE diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 1c09ea24cd..985ddbedf1 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -34,6 +34,7 @@ #include "parser/parse_type.h" #include "utils/builtins.h" #include "utils/date.h" +#include "utils/fmgroids.h" #include "utils/lsyscache.h" #include "utils/timestamp.h" #include "utils/xml.h" @@ -3099,3 +3100,183 @@ ParseExprKindName(ParseExprKind exprKind) } return "unrecognized expression kind"; } + +/* + * Make string Const node from JSON encoding name. + * + * UTF8 is default encoding. + */ +static Const * +getJsonEncodingConst(JsonFormat *format) +{ + JsonEncoding encoding; + const char *enc; + Name encname = palloc(sizeof(NameData)); + + if (!format || + format->format_type == JS_FORMAT_DEFAULT || + format->encoding == JS_ENC_DEFAULT) + encoding = JS_ENC_UTF8; + else + encoding = format->encoding; + + switch (encoding) + { + case JS_ENC_UTF16: + enc = "UTF16"; + break; + case JS_ENC_UTF32: + enc = "UTF32"; + break; + case JS_ENC_UTF8: + enc = "UTF8"; + break; + default: + elog(ERROR, "invalid JSON encoding: %d", encoding); + break; + } + + namestrcpy(encname, enc); + + return makeConst(NAMEOID, -1, InvalidOid, NAMEDATALEN, + NameGetDatum(encname), false, false); +} + +/* + * Make bytea => text conversion using specified JSON format encoding. + */ +static Node * +makeJsonByteaToTextConversion(Node *expr, JsonFormat *format, int location) +{ + Const *encoding = getJsonEncodingConst(format); + FuncExpr *fexpr = makeFuncExpr(F_CONVERT_FROM, TEXTOID, + list_make2(expr, encoding), + InvalidOid, InvalidOid, + COERCE_EXPLICIT_CALL); + + fexpr->location = location; + + return (Node *) fexpr; +} + +/* + * Make CaseTestExpr node. + */ +static Node * +makeCaseTestExpr(Node *expr) +{ + CaseTestExpr *placeholder = makeNode(CaseTestExpr); + + placeholder->typeId = exprType(expr); + placeholder->typeMod = exprTypmod(expr); + placeholder->collation = exprCollation(expr); + + return (Node *) placeholder; +} + +/* + * Transform JSON value expression using specified input JSON format or + * default format otherwise. + */ +static Node * +transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, + JsonFormatType default_format) +{ + Node *expr = transformExprRecurse(pstate, (Node *) ve->raw_expr); + Node *rawexpr; + JsonFormatType format; + Oid exprtype; + int location; + char typcategory; + bool typispreferred; + + if (exprType(expr) == UNKNOWNOID) + expr = coerce_to_specific_type(pstate, expr, TEXTOID, "JSON_VALUE_EXPR"); + + rawexpr = expr; + exprtype = exprType(expr); + location = exprLocation(expr); + + get_type_category_preferred(exprtype, &typcategory, &typispreferred); + + if (ve->format->format_type != JS_FORMAT_DEFAULT) + { + if (ve->format->encoding != JS_ENC_DEFAULT && exprtype != BYTEAOID) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("JSON ENCODING clause is only allowed for bytea input type"), + parser_errposition(pstate, ve->format->location))); + + if (exprtype == JSONOID || exprtype == JSONBOID) + { + format = JS_FORMAT_DEFAULT; /* do not format json[b] types */ + ereport(WARNING, + (errmsg("FORMAT JSON has no effect for json and jsonb types"), + parser_errposition(pstate, ve->format->location))); + } + else + format = ve->format->format_type; + } + else if (exprtype == JSONOID || exprtype == JSONBOID) + format = JS_FORMAT_DEFAULT; /* do not format json[b] types */ + else + format = default_format; + + if (format != JS_FORMAT_DEFAULT) + { + Oid targettype = format == JS_FORMAT_JSONB ? JSONBOID : JSONOID; + Node *orig = makeCaseTestExpr(expr); + Node *coerced; + + expr = orig; + + if (exprtype != BYTEAOID && typcategory != TYPCATEGORY_STRING) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg(ve->format->format_type == JS_FORMAT_DEFAULT ? + "cannot use non-string types with implicit FORMAT JSON clause" : + "cannot use non-string types with explicit FORMAT JSON clause"), + parser_errposition(pstate, ve->format->location >= 0 ? + ve->format->location : location))); + + /* Convert encoded JSON text from bytea. */ + if (format == JS_FORMAT_JSON && exprtype == BYTEAOID) + { + expr = makeJsonByteaToTextConversion(expr, ve->format, location); + exprtype = TEXTOID; + } + + /* Try to coerce to the target type. */ + coerced = coerce_to_target_type(pstate, expr, exprtype, + targettype, -1, + COERCION_EXPLICIT, + COERCE_EXPLICIT_CAST, + location); + + if (!coerced) + { + /* If coercion failed, use to_json()/to_jsonb() functions. */ + Oid fnoid = targettype == JSONOID ? F_TO_JSON : F_TO_JSONB; + FuncExpr *fexpr = makeFuncExpr(fnoid, targettype, + list_make1(expr), + InvalidOid, InvalidOid, + COERCE_EXPLICIT_CALL); + fexpr->location = location; + + coerced = (Node *) fexpr; + } + + if (coerced == orig) + expr = rawexpr; + else + { + ve = copyObject(ve); + ve->raw_expr = (Expr *) rawexpr; + ve->formatted_expr = (Expr *) coerced; + + expr = (Node *) ve; + } + } + + return expr; +} diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 7f4f3f7369..c7860a7580 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -8266,6 +8266,11 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags) return false; } + case T_JsonValueExpr: + /* maybe simple, check args */ + return isSimpleNode((Node *) ((JsonValueExpr *) node)->raw_expr, + node, prettyFlags); + default: break; } @@ -8371,6 +8376,48 @@ get_rule_expr_paren(Node *node, deparse_context *context, appendStringInfoChar(context->buf, ')'); } +/* + * get_json_format - Parse back a JsonFormat node + */ +static void +get_json_format(JsonFormat *format, deparse_context *context) +{ + if (format->format_type == JS_FORMAT_DEFAULT) + return; + + appendStringInfoString(context->buf, + format->format_type == JS_FORMAT_JSONB ? + " FORMAT JSONB" : " FORMAT JSON"); + + if (format->encoding != JS_ENC_DEFAULT) + { + const char *encoding = + format->encoding == JS_ENC_UTF16 ? "UTF16" : + format->encoding == JS_ENC_UTF32 ? "UTF32" : "UTF8"; + + appendStringInfo(context->buf, " ENCODING %s", encoding); + } +} + +/* + * get_json_returning - Parse back a JsonReturning structure + */ +static void +get_json_returning(JsonReturning *returning, deparse_context *context, + bool json_format_by_default) +{ + if (!OidIsValid(returning->typid)) + return; + + appendStringInfo(context->buf, " RETURNING %s", + format_type_with_typemod(returning->typid, + returning->typmod)); + + if (!json_format_by_default || + returning->format->format_type != + (returning->typid == JSONBOID ? JS_FORMAT_JSONB : JS_FORMAT_JSON)) + get_json_format(returning->format, context); +} /* ---------- * get_rule_expr - Parse back an expression @@ -9531,6 +9578,15 @@ get_rule_expr(Node *node, deparse_context *context, } break; + case T_JsonValueExpr: + { + JsonValueExpr *jve = (JsonValueExpr *) node; + + get_rule_expr((Node *) jve->raw_expr, context, false); + get_json_format(jve->format, context); + } + break; + case T_List: { char *sep; diff --git a/src/backend/utils/misc/queryjumble.c b/src/backend/utils/misc/queryjumble.c index a67487e5fe..84435420e4 100644 --- a/src/backend/utils/misc/queryjumble.c +++ b/src/backend/utils/misc/queryjumble.c @@ -737,6 +737,32 @@ JumbleExpr(JumbleState *jstate, Node *node) JumbleExpr(jstate, (Node *) conf->exclRelTlist); } break; + case T_JsonFormat: + { + JsonFormat *format = (JsonFormat *) node; + + APP_JUMB(format->type); + APP_JUMB(format->encoding); + } + break; + case T_JsonReturning: + { + JsonReturning *returning = (JsonReturning *) node; + + JumbleExpr(jstate, (Node *) returning->format); + APP_JUMB(returning->typid); + APP_JUMB(returning->typmod); + } + break; + case T_JsonValueExpr: + { + JsonValueExpr *expr = (JsonValueExpr *) node; + + JumbleExpr(jstate, (Node *) expr->raw_expr); + JumbleExpr(jstate, (Node *) expr->formatted_expr); + JumbleExpr(jstate, (Node *) expr->format); + } + break; case T_List: foreach(temp, (List *) node) { diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h index 50de4c62af..ec8b71a685 100644 --- a/src/include/nodes/makefuncs.h +++ b/src/include/nodes/makefuncs.h @@ -106,4 +106,9 @@ extern GroupingSet *makeGroupingSet(GroupingSetKind kind, List *content, int loc extern VacuumRelation *makeVacuumRelation(RangeVar *relation, Oid oid, List *va_cols); +extern JsonFormat *makeJsonFormat(JsonFormatType type, JsonEncoding encoding, + int location); +extern JsonValueExpr *makeJsonValueExpr(Expr *expr, JsonFormat *format); +extern JsonEncoding makeJsonEncoding(char *name); + #endif /* MAKEFUNC_H */ diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index 5d075f0c34..59737f1034 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -201,6 +201,9 @@ typedef enum NodeTag T_FromExpr, T_OnConflictExpr, T_IntoClause, + T_JsonFormat, + T_JsonReturning, + T_JsonValueExpr, /* * TAGS FOR EXPRESSION STATE NODES (execnodes.h) @@ -491,6 +494,7 @@ typedef enum NodeTag T_VacuumRelation, T_PublicationObjSpec, T_PublicationTable, + T_JsonOutput, /* * TAGS FOR REPLICATION GRAMMAR PARSE NODES (replnodes.h) diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 2f618cb229..712e56b5f2 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1553,6 +1553,19 @@ typedef struct TriggerTransition bool isTable; } TriggerTransition; +/* Nodes for SQL/JSON support */ + +/* + * JsonOutput - + * representation of JSON output clause (RETURNING type [FORMAT format]) + */ +typedef struct JsonOutput +{ + NodeTag type; + TypeName *typeName; /* RETURNING type name, if specified */ + JsonReturning returning; /* RETURNING FORMAT clause and type Oids */ +} JsonOutput; + /***************************************************************************** * Raw Grammar Output Statements *****************************************************************************/ diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index 439e4b4a9d..8e3c99bdb5 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -1233,6 +1233,65 @@ typedef struct XmlExpr int location; /* token location, or -1 if unknown */ } XmlExpr; +/* + * JsonEncoding - + * representation of JSON ENCODING clause + */ +typedef enum JsonEncoding +{ + JS_ENC_DEFAULT, /* unspecified */ + JS_ENC_UTF8, + JS_ENC_UTF16, + JS_ENC_UTF32, +} JsonEncoding; + +/* + * JsonFormatType - + * enumeration of JSON formats used in JSON FORMAT clause + */ +typedef enum JsonFormatType +{ + JS_FORMAT_DEFAULT, /* unspecified */ + JS_FORMAT_JSON, /* FORMAT JSON [ENCODING ...] */ + JS_FORMAT_JSONB /* implicit internal format for RETURNING jsonb */ +} JsonFormatType; + +/* + * JsonFormat - + * representation of JSON FORMAT clause + */ +typedef struct JsonFormat +{ + NodeTag type; + JsonFormatType format_type; /* format type */ + JsonEncoding encoding; /* JSON encoding */ + int location; /* token location, or -1 if unknown */ +} JsonFormat; + +/* + * JsonReturning - + * transformed representation of JSON RETURNING clause + */ +typedef struct JsonReturning +{ + NodeTag type; + JsonFormat *format; /* output JSON format */ + Oid typid; /* target type Oid */ + int32 typmod; /* target type modifier */ +} JsonReturning; + +/* + * JsonValueExpr - + * representation of JSON value expression (expr [FORMAT json_format]) + */ +typedef struct JsonValueExpr +{ + NodeTag type; + Expr *raw_expr; /* raw expression */ + Expr *formatted_expr; /* formatted expression or NULL */ + JsonFormat *format; /* FORMAT clause, if specified */ +} JsonValueExpr; + /* ---------------- * NullTest * diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index bcef7eed2f..f3502b8be4 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -175,6 +175,7 @@ PG_KEYWORD("following", FOLLOWING, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("for", FOR, RESERVED_KEYWORD, AS_LABEL) PG_KEYWORD("force", FORCE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("foreign", FOREIGN, RESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("format", FORMAT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("forward", FORWARD, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("freeze", FREEZE, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("from", FROM, RESERVED_KEYWORD, AS_LABEL) @@ -227,6 +228,7 @@ PG_KEYWORD("is", IS, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("isnull", ISNULL, TYPE_FUNC_NAME_KEYWORD, AS_LABEL) PG_KEYWORD("isolation", ISOLATION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("join", JOIN, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json", JSON, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("key", KEY, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("label", LABEL, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("language", LANGUAGE, UNRESERVED_KEYWORD, BARE_LABEL) From 3707e437c73920492cab0dd17432be6e89bafd76 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 22 Mar 2022 16:46:24 -0700 Subject: [PATCH 212/772] Add missing xlogdefs.h include to pg_subscription.h. Missed in 208c5d65bbd. The missing include causes headerscheck to fail. Per buildfarm member crake. --- src/include/catalog/pg_subscription.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/include/catalog/pg_subscription.h b/src/include/catalog/pg_subscription.h index 69969a0617..599c2e4422 100644 --- a/src/include/catalog/pg_subscription.h +++ b/src/include/catalog/pg_subscription.h @@ -17,6 +17,7 @@ #ifndef PG_SUBSCRIPTION_H #define PG_SUBSCRIPTION_H +#include "access/xlogdefs.h" #include "catalog/genbki.h" #include "catalog/pg_subscription_d.h" From 1460fc5942591fdb6bee0bc8342019ede31ff3b6 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Tue, 22 Mar 2022 19:55:15 -0400 Subject: [PATCH 213/772] Revert "Common SQL/JSON clauses" This reverts commit 865fe4d5df560a6f5353da652018ff876978ad2d. This has caused issues with a significant number of buildfarm members --- src/backend/executor/execExpr.c | 22 ---- src/backend/nodes/copyfuncs.c | 55 -------- src/backend/nodes/equalfuncs.c | 39 ------ src/backend/nodes/makefuncs.c | 54 -------- src/backend/nodes/nodeFuncs.c | 66 ---------- src/backend/nodes/outfuncs.c | 39 ------ src/backend/nodes/readfuncs.c | 51 -------- src/backend/optimizer/util/clauses.c | 23 ---- src/backend/parser/gram.y | 65 +--------- src/backend/parser/parse_expr.c | 181 --------------------------- src/backend/utils/adt/ruleutils.c | 56 --------- src/backend/utils/misc/queryjumble.c | 26 ---- src/include/nodes/makefuncs.h | 5 - src/include/nodes/nodes.h | 4 - src/include/nodes/parsenodes.h | 13 -- src/include/nodes/primnodes.h | 59 --------- src/include/parser/kwlist.h | 2 - 17 files changed, 2 insertions(+), 758 deletions(-) diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index d0b91e881d..e0656bfe85 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -2428,28 +2428,6 @@ ExecInitExprRec(Expr *node, ExprState *state, break; } - case T_JsonValueExpr: - { - JsonValueExpr *jve = (JsonValueExpr *) node; - - ExecInitExprRec(jve->raw_expr, state, resv, resnull); - - if (jve->formatted_expr) - { - Datum *innermost_caseval = state->innermost_caseval; - bool *innermost_isnull = state->innermost_casenull; - - state->innermost_caseval = resv; - state->innermost_casenull = resnull; - - ExecInitExprRec(jve->formatted_expr, state, resv, resnull); - - state->innermost_caseval = innermost_caseval; - state->innermost_casenull = innermost_isnull; - } - break; - } - default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 55c36b46a8..d4f8455a2b 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -2298,52 +2298,6 @@ _copyOnConflictExpr(const OnConflictExpr *from) return newnode; } - -/* - * _copyJsonFormat - */ -static JsonFormat * -_copyJsonFormat(const JsonFormat *from) -{ - JsonFormat *newnode = makeNode(JsonFormat); - - COPY_SCALAR_FIELD(format_type); - COPY_SCALAR_FIELD(encoding); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -/* - * _copyJsonReturning - */ -static JsonReturning * -_copyJsonReturning(const JsonReturning *from) -{ - JsonReturning *newnode = makeNode(JsonReturning); - - COPY_NODE_FIELD(format); - COPY_SCALAR_FIELD(typid); - COPY_SCALAR_FIELD(typmod); - - return newnode; -} - -/* - * _copyJsonValueExpr - */ -static JsonValueExpr * -_copyJsonValueExpr(const JsonValueExpr *from) -{ - JsonValueExpr *newnode = makeNode(JsonValueExpr); - - COPY_NODE_FIELD(raw_expr); - COPY_NODE_FIELD(formatted_expr); - COPY_NODE_FIELD(format); - - return newnode; -} - /* **************************************************************** * pathnodes.h copy functions * @@ -5396,15 +5350,6 @@ copyObjectImpl(const void *from) case T_OnConflictExpr: retval = _copyOnConflictExpr(from); break; - case T_JsonFormat: - retval = _copyJsonFormat(from); - break; - case T_JsonReturning: - retval = _copyJsonReturning(from); - break; - case T_JsonValueExpr: - retval = _copyJsonValueExpr(from); - break; /* * RELATION NODES diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 0ddebd066e..f1002afe7a 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -841,36 +841,6 @@ _equalOnConflictExpr(const OnConflictExpr *a, const OnConflictExpr *b) return true; } -static bool -_equalJsonFormat(const JsonFormat *a, const JsonFormat *b) -{ - COMPARE_SCALAR_FIELD(format_type); - COMPARE_SCALAR_FIELD(encoding); - COMPARE_LOCATION_FIELD(location); - - return true; -} - -static bool -_equalJsonReturning(const JsonReturning *a, const JsonReturning *b) -{ - COMPARE_NODE_FIELD(format); - COMPARE_SCALAR_FIELD(typid); - COMPARE_SCALAR_FIELD(typmod); - - return true; -} - -static bool -_equalJsonValueExpr(const JsonValueExpr *a, const JsonValueExpr *b) -{ - COMPARE_NODE_FIELD(raw_expr); - COMPARE_NODE_FIELD(formatted_expr); - COMPARE_NODE_FIELD(format); - - return true; -} - /* * Stuff from pathnodes.h */ @@ -3388,15 +3358,6 @@ equal(const void *a, const void *b) case T_JoinExpr: retval = _equalJoinExpr(a, b); break; - case T_JsonFormat: - retval = _equalJsonFormat(a, b); - break; - case T_JsonReturning: - retval = _equalJsonReturning(a, b); - break; - case T_JsonValueExpr: - retval = _equalJsonValueExpr(a, b); - break; /* * RELATION NODES diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c index 867a927e7a..c85d8fe975 100644 --- a/src/backend/nodes/makefuncs.c +++ b/src/backend/nodes/makefuncs.c @@ -19,7 +19,6 @@ #include "catalog/pg_type.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" -#include "utils/errcodes.h" #include "utils/lsyscache.h" @@ -819,56 +818,3 @@ makeVacuumRelation(RangeVar *relation, Oid oid, List *va_cols) v->va_cols = va_cols; return v; } - -/* - * makeJsonFormat - - * creates a JsonFormat node - */ -JsonFormat * -makeJsonFormat(JsonFormatType type, JsonEncoding encoding, int location) -{ - JsonFormat *jf = makeNode(JsonFormat); - - jf->format_type = type; - jf->encoding = encoding; - jf->location = location; - - return jf; -} - -/* - * makeJsonValueExpr - - * creates a JsonValueExpr node - */ -JsonValueExpr * -makeJsonValueExpr(Expr *expr, JsonFormat *format) -{ - JsonValueExpr *jve = makeNode(JsonValueExpr); - - jve->raw_expr = expr; - jve->formatted_expr = NULL; - jve->format = format; - - return jve; -} - -/* - * makeJsonEncoding - - * converts JSON encoding name to enum JsonEncoding - */ -JsonEncoding -makeJsonEncoding(char *name) -{ - if (!pg_strcasecmp(name, "utf8")) - return JS_ENC_UTF8; - if (!pg_strcasecmp(name, "utf16")) - return JS_ENC_UTF16; - if (!pg_strcasecmp(name, "utf32")) - return JS_ENC_UTF32; - - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("unrecognized JSON encoding: %s", name))); - - return JS_ENC_DEFAULT; -} diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index 0b242c76ec..ec25aae6e3 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -250,13 +250,6 @@ exprType(const Node *expr) case T_PlaceHolderVar: type = exprType((Node *) ((const PlaceHolderVar *) expr)->phexpr); break; - case T_JsonValueExpr: - { - const JsonValueExpr *jve = (const JsonValueExpr *) expr; - - type = exprType((Node *) (jve->formatted_expr ? jve->formatted_expr : jve->raw_expr)); - } - break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); type = InvalidOid; /* keep compiler quiet */ @@ -489,8 +482,6 @@ exprTypmod(const Node *expr) return ((const SetToDefault *) expr)->typeMod; case T_PlaceHolderVar: return exprTypmod((Node *) ((const PlaceHolderVar *) expr)->phexpr); - case T_JsonValueExpr: - return exprTypmod((Node *) ((const JsonValueExpr *) expr)->formatted_expr); default: break; } @@ -967,9 +958,6 @@ exprCollation(const Node *expr) case T_PlaceHolderVar: coll = exprCollation((Node *) ((const PlaceHolderVar *) expr)->phexpr); break; - case T_JsonValueExpr: - coll = exprCollation((Node *) ((const JsonValueExpr *) expr)->formatted_expr); - break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); coll = InvalidOid; /* keep compiler quiet */ @@ -1182,10 +1170,6 @@ exprSetCollation(Node *expr, Oid collation) /* NextValueExpr's result is an integer type ... */ Assert(!OidIsValid(collation)); /* ... so never set a collation */ break; - case T_JsonValueExpr: - exprSetCollation((Node *) ((JsonValueExpr *) expr)->formatted_expr, - collation); - break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); break; @@ -1632,9 +1616,6 @@ exprLocation(const Node *expr) case T_PartitionRangeDatum: loc = ((const PartitionRangeDatum *) expr)->location; break; - case T_JsonValueExpr: - loc = exprLocation((Node *) ((const JsonValueExpr *) expr)->raw_expr); - break; default: /* for any other node type it's just unknown... */ loc = -1; @@ -2369,16 +2350,6 @@ expression_tree_walker(Node *node, return true; } break; - case T_JsonValueExpr: - { - JsonValueExpr *jve = (JsonValueExpr *) node; - - if (walker(jve->raw_expr, context)) - return true; - if (walker(jve->formatted_expr, context)) - return true; - } - break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); @@ -2709,7 +2680,6 @@ expression_tree_mutator(Node *node, case T_RangeTblRef: case T_SortGroupClause: case T_CTESearchClause: - case T_JsonFormat: return (Node *) copyObject(node); case T_WithCheckOption: { @@ -3341,28 +3311,6 @@ expression_tree_mutator(Node *node, return (Node *) newnode; } break; - case T_JsonReturning: - { - JsonReturning *jr = (JsonReturning *) node; - JsonReturning *newnode; - - FLATCOPY(newnode, jr, JsonReturning); - MUTATE(newnode->format, jr->format, JsonFormat *); - - return (Node *) newnode; - } - case T_JsonValueExpr: - { - JsonValueExpr *jve = (JsonValueExpr *) node; - JsonValueExpr *newnode; - - FLATCOPY(newnode, jve, JsonValueExpr); - MUTATE(newnode->raw_expr, jve->raw_expr, Expr *); - MUTATE(newnode->formatted_expr, jve->formatted_expr, Expr *); - MUTATE(newnode->format, jve->format, JsonFormat *); - - return (Node *) newnode; - } default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); @@ -4071,20 +4019,6 @@ raw_expression_tree_walker(Node *node, case T_CommonTableExpr: /* search_clause and cycle_clause are not interesting here */ return walker(((CommonTableExpr *) node)->ctequery, context); - case T_JsonReturning: - return walker(((JsonReturning *) node)->format, context); - case T_JsonValueExpr: - { - JsonValueExpr *jve = (JsonValueExpr *) node; - - if (walker(jve->raw_expr, context)) - return true; - if (walker(jve->formatted_expr, context)) - return true; - if (walker(jve->format, context)) - return true; - } - break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 449d90c8f4..6bdad462c7 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1751,36 +1751,6 @@ _outOnConflictExpr(StringInfo str, const OnConflictExpr *node) WRITE_NODE_FIELD(exclRelTlist); } -static void -_outJsonFormat(StringInfo str, const JsonFormat *node) -{ - WRITE_NODE_TYPE("JSONFORMAT"); - - WRITE_ENUM_FIELD(format_type, JsonFormatType); - WRITE_ENUM_FIELD(encoding, JsonEncoding); - WRITE_LOCATION_FIELD(location); -} - -static void -_outJsonReturning(StringInfo str, const JsonReturning *node) -{ - WRITE_NODE_TYPE("JSONRETURNING"); - - WRITE_NODE_FIELD(format); - WRITE_OID_FIELD(typid); - WRITE_INT_FIELD(typmod); -} - -static void -_outJsonValueExpr(StringInfo str, const JsonValueExpr *node) -{ - WRITE_NODE_TYPE("JSONVALUEEXPR"); - - WRITE_NODE_FIELD(raw_expr); - WRITE_NODE_FIELD(formatted_expr); - WRITE_NODE_FIELD(format); -} - /***************************************************************************** * * Stuff from pathnodes.h. @@ -4567,15 +4537,6 @@ outNode(StringInfo str, const void *obj) case T_PartitionRangeDatum: _outPartitionRangeDatum(str, obj); break; - case T_JsonFormat: - _outJsonFormat(str, obj); - break; - case T_JsonReturning: - _outJsonReturning(str, obj); - break; - case T_JsonValueExpr: - _outJsonValueExpr(str, obj); - break; default: diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 6f398cdc15..3f68f7c18d 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -1389,51 +1389,6 @@ _readOnConflictExpr(void) READ_DONE(); } -/* - * _readJsonFormat - */ -static JsonFormat * -_readJsonFormat(void) -{ - READ_LOCALS(JsonFormat); - - READ_ENUM_FIELD(format_type, JsonFormatType); - READ_ENUM_FIELD(encoding, JsonEncoding); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readJsonReturning - */ -static JsonReturning * -_readJsonReturning(void) -{ - READ_LOCALS(JsonReturning); - - READ_NODE_FIELD(format); - READ_OID_FIELD(typid); - READ_INT_FIELD(typmod); - - READ_DONE(); -} - -/* - * _readJsonValueExpr - */ -static JsonValueExpr * -_readJsonValueExpr(void) -{ - READ_LOCALS(JsonValueExpr); - - READ_NODE_FIELD(raw_expr); - READ_NODE_FIELD(formatted_expr); - READ_NODE_FIELD(format); - - READ_DONE(); -} - /* * Stuff from pathnodes.h. * @@ -3019,12 +2974,6 @@ parseNodeString(void) return_value = _readPartitionBoundSpec(); else if (MATCH("PARTITIONRANGEDATUM", 19)) return_value = _readPartitionRangeDatum(); - else if (MATCH("JSONFORMAT", 10)) - return_value = _readJsonFormat(); - else if (MATCH("JSONRETURNING", 13)) - return_value = _readJsonReturning(); - else if (MATCH("JSONVALUEEXPR", 13)) - return_value = _readJsonValueExpr(); else { elog(ERROR, "badly formatted node string \"%.32s\"...", token); diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index b9cefe8847..413dcac036 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -3512,29 +3512,6 @@ eval_const_expressions_mutator(Node *node, return ece_evaluate_expr((Node *) newcre); return (Node *) newcre; } - case T_JsonValueExpr: - { - JsonValueExpr *jve = (JsonValueExpr *) node; - Node *raw = eval_const_expressions_mutator((Node *) jve->raw_expr, - context); - - if (raw && IsA(raw, Const)) - { - Node *formatted; - Node *save_case_val = context->case_val; - - context->case_val = raw; - - formatted = eval_const_expressions_mutator((Node *) jve->formatted_expr, - context); - - context->case_val = save_case_val; - - if (formatted && IsA(formatted, Const)) - return formatted; - } - break; - } default: break; } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 204b754eba..0036c2f9e2 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -635,14 +635,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type hash_partbound_elem -%type json_format_clause_opt - json_representation - json_value_expr - json_output_clause_opt - -%type json_encoding - json_encoding_clause_opt - /* * Non-keyword token types. These are hard-wired into the "flex" lexer. * They must be listed first so that their numeric codes do not depend on @@ -694,7 +686,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); EXTENSION EXTERNAL EXTRACT FALSE_P FAMILY FETCH FILTER FINALIZE FIRST_P FLOAT_P FOLLOWING FOR - FORCE FOREIGN FORMAT FORWARD FREEZE FROM FULL FUNCTION FUNCTIONS + FORCE FOREIGN FORWARD FREEZE FROM FULL FUNCTION FUNCTIONS GENERATED GLOBAL GRANT GRANTED GREATEST GROUP_P GROUPING GROUPS @@ -705,7 +697,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION - JOIN JSON + JOIN KEY @@ -789,7 +781,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); /* Precedence: lowest to highest */ %nonassoc SET /* see relation_expr_opt_alias */ -%right FORMAT %left UNION EXCEPT %left INTERSECT %left OR @@ -15244,54 +15235,6 @@ opt_asymmetric: ASYMMETRIC | /*EMPTY*/ ; -/* SQL/JSON support */ - -json_value_expr: - a_expr json_format_clause_opt - { - $$ = (Node *) makeJsonValueExpr((Expr *) $1, $2); - } - ; - -json_format_clause_opt: - FORMAT json_representation - { - $$ = $2; - $$.location = @1; - } - | /* EMPTY */ - { - $$ = (Node *) makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1); - } - ; - -json_representation: - JSON json_encoding_clause_opt - { - $$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, $2, @1); - } - /* | other implementation defined JSON representation options (BSON, AVRO etc) */ - ; - -json_encoding_clause_opt: - ENCODING json_encoding { $$ = $2; } - | /* EMPTY */ { $$ = JS_ENC_DEFAULT; } - ; - -json_encoding: - name { $$ = makeJsonEncoding($1); } - ; - -json_output_clause_opt: - RETURNING Typename json_format_clause_opt - { - JsonOutput *n = makeNode(JsonOutput); - n->typeName = $2; - n->returning.format = $3; - $$ = (Node *) n; - } - | /* EMPTY */ { $$ = NULL; } - ; /***************************************************************************** * @@ -15833,7 +15776,6 @@ unreserved_keyword: | FIRST_P | FOLLOWING | FORCE - | FORMAT | FORWARD | FUNCTION | FUNCTIONS @@ -15865,7 +15807,6 @@ unreserved_keyword: | INSTEAD | INVOKER | ISOLATION - | JSON | KEY | LABEL | LANGUAGE @@ -16382,7 +16323,6 @@ bare_label_keyword: | FOLLOWING | FORCE | FOREIGN - | FORMAT | FORWARD | FREEZE | FULL @@ -16427,7 +16367,6 @@ bare_label_keyword: | IS | ISOLATION | JOIN - | JSON | KEY | LABEL | LANGUAGE diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 985ddbedf1..1c09ea24cd 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -34,7 +34,6 @@ #include "parser/parse_type.h" #include "utils/builtins.h" #include "utils/date.h" -#include "utils/fmgroids.h" #include "utils/lsyscache.h" #include "utils/timestamp.h" #include "utils/xml.h" @@ -3100,183 +3099,3 @@ ParseExprKindName(ParseExprKind exprKind) } return "unrecognized expression kind"; } - -/* - * Make string Const node from JSON encoding name. - * - * UTF8 is default encoding. - */ -static Const * -getJsonEncodingConst(JsonFormat *format) -{ - JsonEncoding encoding; - const char *enc; - Name encname = palloc(sizeof(NameData)); - - if (!format || - format->format_type == JS_FORMAT_DEFAULT || - format->encoding == JS_ENC_DEFAULT) - encoding = JS_ENC_UTF8; - else - encoding = format->encoding; - - switch (encoding) - { - case JS_ENC_UTF16: - enc = "UTF16"; - break; - case JS_ENC_UTF32: - enc = "UTF32"; - break; - case JS_ENC_UTF8: - enc = "UTF8"; - break; - default: - elog(ERROR, "invalid JSON encoding: %d", encoding); - break; - } - - namestrcpy(encname, enc); - - return makeConst(NAMEOID, -1, InvalidOid, NAMEDATALEN, - NameGetDatum(encname), false, false); -} - -/* - * Make bytea => text conversion using specified JSON format encoding. - */ -static Node * -makeJsonByteaToTextConversion(Node *expr, JsonFormat *format, int location) -{ - Const *encoding = getJsonEncodingConst(format); - FuncExpr *fexpr = makeFuncExpr(F_CONVERT_FROM, TEXTOID, - list_make2(expr, encoding), - InvalidOid, InvalidOid, - COERCE_EXPLICIT_CALL); - - fexpr->location = location; - - return (Node *) fexpr; -} - -/* - * Make CaseTestExpr node. - */ -static Node * -makeCaseTestExpr(Node *expr) -{ - CaseTestExpr *placeholder = makeNode(CaseTestExpr); - - placeholder->typeId = exprType(expr); - placeholder->typeMod = exprTypmod(expr); - placeholder->collation = exprCollation(expr); - - return (Node *) placeholder; -} - -/* - * Transform JSON value expression using specified input JSON format or - * default format otherwise. - */ -static Node * -transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, - JsonFormatType default_format) -{ - Node *expr = transformExprRecurse(pstate, (Node *) ve->raw_expr); - Node *rawexpr; - JsonFormatType format; - Oid exprtype; - int location; - char typcategory; - bool typispreferred; - - if (exprType(expr) == UNKNOWNOID) - expr = coerce_to_specific_type(pstate, expr, TEXTOID, "JSON_VALUE_EXPR"); - - rawexpr = expr; - exprtype = exprType(expr); - location = exprLocation(expr); - - get_type_category_preferred(exprtype, &typcategory, &typispreferred); - - if (ve->format->format_type != JS_FORMAT_DEFAULT) - { - if (ve->format->encoding != JS_ENC_DEFAULT && exprtype != BYTEAOID) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("JSON ENCODING clause is only allowed for bytea input type"), - parser_errposition(pstate, ve->format->location))); - - if (exprtype == JSONOID || exprtype == JSONBOID) - { - format = JS_FORMAT_DEFAULT; /* do not format json[b] types */ - ereport(WARNING, - (errmsg("FORMAT JSON has no effect for json and jsonb types"), - parser_errposition(pstate, ve->format->location))); - } - else - format = ve->format->format_type; - } - else if (exprtype == JSONOID || exprtype == JSONBOID) - format = JS_FORMAT_DEFAULT; /* do not format json[b] types */ - else - format = default_format; - - if (format != JS_FORMAT_DEFAULT) - { - Oid targettype = format == JS_FORMAT_JSONB ? JSONBOID : JSONOID; - Node *orig = makeCaseTestExpr(expr); - Node *coerced; - - expr = orig; - - if (exprtype != BYTEAOID && typcategory != TYPCATEGORY_STRING) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg(ve->format->format_type == JS_FORMAT_DEFAULT ? - "cannot use non-string types with implicit FORMAT JSON clause" : - "cannot use non-string types with explicit FORMAT JSON clause"), - parser_errposition(pstate, ve->format->location >= 0 ? - ve->format->location : location))); - - /* Convert encoded JSON text from bytea. */ - if (format == JS_FORMAT_JSON && exprtype == BYTEAOID) - { - expr = makeJsonByteaToTextConversion(expr, ve->format, location); - exprtype = TEXTOID; - } - - /* Try to coerce to the target type. */ - coerced = coerce_to_target_type(pstate, expr, exprtype, - targettype, -1, - COERCION_EXPLICIT, - COERCE_EXPLICIT_CAST, - location); - - if (!coerced) - { - /* If coercion failed, use to_json()/to_jsonb() functions. */ - Oid fnoid = targettype == JSONOID ? F_TO_JSON : F_TO_JSONB; - FuncExpr *fexpr = makeFuncExpr(fnoid, targettype, - list_make1(expr), - InvalidOid, InvalidOid, - COERCE_EXPLICIT_CALL); - fexpr->location = location; - - coerced = (Node *) fexpr; - } - - if (coerced == orig) - expr = rawexpr; - else - { - ve = copyObject(ve); - ve->raw_expr = (Expr *) rawexpr; - ve->formatted_expr = (Expr *) coerced; - - expr = (Node *) ve; - } - } - - return expr; -} diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index c7860a7580..7f4f3f7369 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -8266,11 +8266,6 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags) return false; } - case T_JsonValueExpr: - /* maybe simple, check args */ - return isSimpleNode((Node *) ((JsonValueExpr *) node)->raw_expr, - node, prettyFlags); - default: break; } @@ -8376,48 +8371,6 @@ get_rule_expr_paren(Node *node, deparse_context *context, appendStringInfoChar(context->buf, ')'); } -/* - * get_json_format - Parse back a JsonFormat node - */ -static void -get_json_format(JsonFormat *format, deparse_context *context) -{ - if (format->format_type == JS_FORMAT_DEFAULT) - return; - - appendStringInfoString(context->buf, - format->format_type == JS_FORMAT_JSONB ? - " FORMAT JSONB" : " FORMAT JSON"); - - if (format->encoding != JS_ENC_DEFAULT) - { - const char *encoding = - format->encoding == JS_ENC_UTF16 ? "UTF16" : - format->encoding == JS_ENC_UTF32 ? "UTF32" : "UTF8"; - - appendStringInfo(context->buf, " ENCODING %s", encoding); - } -} - -/* - * get_json_returning - Parse back a JsonReturning structure - */ -static void -get_json_returning(JsonReturning *returning, deparse_context *context, - bool json_format_by_default) -{ - if (!OidIsValid(returning->typid)) - return; - - appendStringInfo(context->buf, " RETURNING %s", - format_type_with_typemod(returning->typid, - returning->typmod)); - - if (!json_format_by_default || - returning->format->format_type != - (returning->typid == JSONBOID ? JS_FORMAT_JSONB : JS_FORMAT_JSON)) - get_json_format(returning->format, context); -} /* ---------- * get_rule_expr - Parse back an expression @@ -9578,15 +9531,6 @@ get_rule_expr(Node *node, deparse_context *context, } break; - case T_JsonValueExpr: - { - JsonValueExpr *jve = (JsonValueExpr *) node; - - get_rule_expr((Node *) jve->raw_expr, context, false); - get_json_format(jve->format, context); - } - break; - case T_List: { char *sep; diff --git a/src/backend/utils/misc/queryjumble.c b/src/backend/utils/misc/queryjumble.c index 84435420e4..a67487e5fe 100644 --- a/src/backend/utils/misc/queryjumble.c +++ b/src/backend/utils/misc/queryjumble.c @@ -737,32 +737,6 @@ JumbleExpr(JumbleState *jstate, Node *node) JumbleExpr(jstate, (Node *) conf->exclRelTlist); } break; - case T_JsonFormat: - { - JsonFormat *format = (JsonFormat *) node; - - APP_JUMB(format->type); - APP_JUMB(format->encoding); - } - break; - case T_JsonReturning: - { - JsonReturning *returning = (JsonReturning *) node; - - JumbleExpr(jstate, (Node *) returning->format); - APP_JUMB(returning->typid); - APP_JUMB(returning->typmod); - } - break; - case T_JsonValueExpr: - { - JsonValueExpr *expr = (JsonValueExpr *) node; - - JumbleExpr(jstate, (Node *) expr->raw_expr); - JumbleExpr(jstate, (Node *) expr->formatted_expr); - JumbleExpr(jstate, (Node *) expr->format); - } - break; case T_List: foreach(temp, (List *) node) { diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h index ec8b71a685..50de4c62af 100644 --- a/src/include/nodes/makefuncs.h +++ b/src/include/nodes/makefuncs.h @@ -106,9 +106,4 @@ extern GroupingSet *makeGroupingSet(GroupingSetKind kind, List *content, int loc extern VacuumRelation *makeVacuumRelation(RangeVar *relation, Oid oid, List *va_cols); -extern JsonFormat *makeJsonFormat(JsonFormatType type, JsonEncoding encoding, - int location); -extern JsonValueExpr *makeJsonValueExpr(Expr *expr, JsonFormat *format); -extern JsonEncoding makeJsonEncoding(char *name); - #endif /* MAKEFUNC_H */ diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index 59737f1034..5d075f0c34 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -201,9 +201,6 @@ typedef enum NodeTag T_FromExpr, T_OnConflictExpr, T_IntoClause, - T_JsonFormat, - T_JsonReturning, - T_JsonValueExpr, /* * TAGS FOR EXPRESSION STATE NODES (execnodes.h) @@ -494,7 +491,6 @@ typedef enum NodeTag T_VacuumRelation, T_PublicationObjSpec, T_PublicationTable, - T_JsonOutput, /* * TAGS FOR REPLICATION GRAMMAR PARSE NODES (replnodes.h) diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 712e56b5f2..2f618cb229 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1553,19 +1553,6 @@ typedef struct TriggerTransition bool isTable; } TriggerTransition; -/* Nodes for SQL/JSON support */ - -/* - * JsonOutput - - * representation of JSON output clause (RETURNING type [FORMAT format]) - */ -typedef struct JsonOutput -{ - NodeTag type; - TypeName *typeName; /* RETURNING type name, if specified */ - JsonReturning returning; /* RETURNING FORMAT clause and type Oids */ -} JsonOutput; - /***************************************************************************** * Raw Grammar Output Statements *****************************************************************************/ diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index 8e3c99bdb5..439e4b4a9d 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -1233,65 +1233,6 @@ typedef struct XmlExpr int location; /* token location, or -1 if unknown */ } XmlExpr; -/* - * JsonEncoding - - * representation of JSON ENCODING clause - */ -typedef enum JsonEncoding -{ - JS_ENC_DEFAULT, /* unspecified */ - JS_ENC_UTF8, - JS_ENC_UTF16, - JS_ENC_UTF32, -} JsonEncoding; - -/* - * JsonFormatType - - * enumeration of JSON formats used in JSON FORMAT clause - */ -typedef enum JsonFormatType -{ - JS_FORMAT_DEFAULT, /* unspecified */ - JS_FORMAT_JSON, /* FORMAT JSON [ENCODING ...] */ - JS_FORMAT_JSONB /* implicit internal format for RETURNING jsonb */ -} JsonFormatType; - -/* - * JsonFormat - - * representation of JSON FORMAT clause - */ -typedef struct JsonFormat -{ - NodeTag type; - JsonFormatType format_type; /* format type */ - JsonEncoding encoding; /* JSON encoding */ - int location; /* token location, or -1 if unknown */ -} JsonFormat; - -/* - * JsonReturning - - * transformed representation of JSON RETURNING clause - */ -typedef struct JsonReturning -{ - NodeTag type; - JsonFormat *format; /* output JSON format */ - Oid typid; /* target type Oid */ - int32 typmod; /* target type modifier */ -} JsonReturning; - -/* - * JsonValueExpr - - * representation of JSON value expression (expr [FORMAT json_format]) - */ -typedef struct JsonValueExpr -{ - NodeTag type; - Expr *raw_expr; /* raw expression */ - Expr *formatted_expr; /* formatted expression or NULL */ - JsonFormat *format; /* FORMAT clause, if specified */ -} JsonValueExpr; - /* ---------------- * NullTest * diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index f3502b8be4..bcef7eed2f 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -175,7 +175,6 @@ PG_KEYWORD("following", FOLLOWING, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("for", FOR, RESERVED_KEYWORD, AS_LABEL) PG_KEYWORD("force", FORCE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("foreign", FOREIGN, RESERVED_KEYWORD, BARE_LABEL) -PG_KEYWORD("format", FORMAT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("forward", FORWARD, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("freeze", FREEZE, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("from", FROM, RESERVED_KEYWORD, AS_LABEL) @@ -228,7 +227,6 @@ PG_KEYWORD("is", IS, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("isnull", ISNULL, TYPE_FUNC_NAME_KEYWORD, AS_LABEL) PG_KEYWORD("isolation", ISOLATION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("join", JOIN, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) -PG_KEYWORD("json", JSON, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("key", KEY, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("label", LABEL, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("language", LANGUAGE, UNRESERVED_KEYWORD, BARE_LABEL) From 5b29a9f772974e5863238b3f88b2f38c62b2a48f Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Tue, 22 Mar 2022 20:18:30 -0400 Subject: [PATCH 214/772] Temporarily disable installcheck for test_oat_hooks module Buildfarm members are encountering errors when the test is run under various locales/encodings. As the buildfarm only does this for installchecks, disable them for now. Discussion: https://postgr.es/m/6067945b-960a-ab04-d40f-06b006a1dcd0@dunslane.net --- src/test/modules/test_oat_hooks/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/modules/test_oat_hooks/Makefile b/src/test/modules/test_oat_hooks/Makefile index ba068acc53..8456723808 100644 --- a/src/test/modules/test_oat_hooks/Makefile +++ b/src/test/modules/test_oat_hooks/Makefile @@ -6,6 +6,9 @@ PGFILEDESC = "test_oat_hooks - example use of object access hooks" REGRESS = test_oat_hooks +# disable installcheck for now +NO_INSTALLCHECK = 1 + ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) From 383f222119f54e3904aae768b1ca23d03f56a042 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Wed, 23 Mar 2022 14:31:18 +1300 Subject: [PATCH 215/772] Try to stabilize vacuum test. As commits b700f96c and 3414099c did for the reloptions test, make sure VACUUM can always truncate the table as expected. Back-patch to 12, where vacuum_truncate arrived. Discussion: https://postgr.es/m/CAD21AoCNoWjYkdEtr%2BVDoF9v__V905AedKZ9iF%3DArgCtrbxZqw%40mail.gmail.com --- src/test/regress/expected/vacuum.out | 6 +++--- src/test/regress/sql/vacuum.sql | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/regress/expected/vacuum.out b/src/test/regress/expected/vacuum.out index 3e70e4c788..c63a157e5f 100644 --- a/src/test/regress/expected/vacuum.out +++ b/src/test/regress/expected/vacuum.out @@ -165,19 +165,19 @@ VACUUM (INDEX_CLEANUP FALSE) vaccluster; VACUUM (INDEX_CLEANUP AUTO) vactst; -- index cleanup option is ignored if no indexes VACUUM (INDEX_CLEANUP FALSE, FREEZE TRUE) vaccluster; -- TRUNCATE option -CREATE TABLE vac_truncate_test(i INT NOT NULL, j text) +CREATE TEMP TABLE vac_truncate_test(i INT NOT NULL, j text) WITH (vacuum_truncate=true, autovacuum_enabled=false); INSERT INTO vac_truncate_test VALUES (1, NULL), (NULL, NULL); ERROR: null value in column "i" of relation "vac_truncate_test" violates not-null constraint DETAIL: Failing row contains (null, null). -VACUUM (TRUNCATE FALSE) vac_truncate_test; +VACUUM (TRUNCATE FALSE, DISABLE_PAGE_SKIPPING) vac_truncate_test; SELECT pg_relation_size('vac_truncate_test') > 0; ?column? ---------- t (1 row) -VACUUM vac_truncate_test; +VACUUM (DISABLE_PAGE_SKIPPING) vac_truncate_test; SELECT pg_relation_size('vac_truncate_test') = 0; ?column? ---------- diff --git a/src/test/regress/sql/vacuum.sql b/src/test/regress/sql/vacuum.sql index 18cb7fd08a..9faa8a34a6 100644 --- a/src/test/regress/sql/vacuum.sql +++ b/src/test/regress/sql/vacuum.sql @@ -147,12 +147,12 @@ VACUUM (INDEX_CLEANUP AUTO) vactst; -- index cleanup option is ignored if no ind VACUUM (INDEX_CLEANUP FALSE, FREEZE TRUE) vaccluster; -- TRUNCATE option -CREATE TABLE vac_truncate_test(i INT NOT NULL, j text) +CREATE TEMP TABLE vac_truncate_test(i INT NOT NULL, j text) WITH (vacuum_truncate=true, autovacuum_enabled=false); INSERT INTO vac_truncate_test VALUES (1, NULL), (NULL, NULL); -VACUUM (TRUNCATE FALSE) vac_truncate_test; +VACUUM (TRUNCATE FALSE, DISABLE_PAGE_SKIPPING) vac_truncate_test; SELECT pg_relation_size('vac_truncate_test') > 0; -VACUUM vac_truncate_test; +VACUUM (DISABLE_PAGE_SKIPPING) vac_truncate_test; SELECT pg_relation_size('vac_truncate_test') = 0; VACUUM (TRUNCATE FALSE, FULL TRUE) vac_truncate_test; DROP TABLE vac_truncate_test; From 4a39f87acd6e681e5ded1239391d8a92645b43d6 Mon Sep 17 00:00:00 2001 From: Tatsuo Ishii Date: Wed, 23 Mar 2022 18:52:37 +0900 Subject: [PATCH 216/772] Allow pgbench to retry in some cases. When serialization or deadlock errors are reported by backend, allow to retry and continue the benchmarking. For this purpose new options "--max-tries", "--failures-detailed" and "--verbose-errors" are added. Transactions with serialization errors or deadlock errors will be repeated after rollbacks until they complete successfully or reach the maximum number of tries (specified by the --max-tries option), or the maximum time of tries (specified by the --latency-limit option). These options can be specified at the same time. It is not possible to use an unlimited number of tries (--max-tries=0) without the --latency-limit option or the --time option. By default the option --max-tries is set to 1, which means transactions with serialization/deadlock errors are not retried. If the last try fails, this transaction will be reported as failed, and the client variables will be set as they were before the first run of this transaction. Statistics on retries and failures are printed in the progress, transaction / aggregation logs and in the end with other results (all and for each script). Also retries and failures are printed per-command with average latency by using option (--report-per-command, -r). Option --failures-detailed prints group failures by basic types (serialization failures / deadlock failures). Option --verbose-errors prints distinct reports on errors and failures (errors without retrying) by type with detailed information like which limit for retries was violated and how far it was exceeded for the serialization/deadlock failures. Patch originally written by Marina Polyakova then Yugo Nagata inherited the discussion and heavily modified the patch to make it commitable. Authors: Yugo Nagata, Marina Polyakova Reviewed-by: Fabien Coelho, Tatsuo Ishii, Alvaro Herrera, Kevin Grittner, Andres Freund, Arthur Zakirov, Alexander Korotkov, Teodor Sigaev, Ildus Kurbangaliev Discussion: https://postgr.es/m/flat/72a0d590d6ba06f242d75c2e641820ec%40postgrespro.ru --- doc/src/sgml/ref/pgbench.sgml | 431 ++++++- src/bin/pgbench/pgbench.c | 1128 +++++++++++++++--- src/bin/pgbench/t/001_pgbench_with_server.pl | 215 +++- src/bin/pgbench/t/002_pgbench_no_server.pl | 10 + src/fe_utils/conditional.c | 16 +- src/include/fe_utils/conditional.h | 2 + 6 files changed, 1594 insertions(+), 208 deletions(-) diff --git a/doc/src/sgml/ref/pgbench.sgml b/doc/src/sgml/ref/pgbench.sgml index be1896fa99..ebdb4b3f46 100644 --- a/doc/src/sgml/ref/pgbench.sgml +++ b/doc/src/sgml/ref/pgbench.sgml @@ -56,20 +56,29 @@ scaling factor: 10 query mode: simple number of clients: 10 number of threads: 1 +maximum number of tries: 1 number of transactions per client: 1000 number of transactions actually processed: 10000/10000 +number of failed transactions: 0 (0.000%) latency average = 11.013 ms latency stddev = 7.351 ms initial connection time = 45.758 ms tps = 896.967014 (without initial connection time) - The first six lines report some of the most important parameter - settings. The next line reports the number of transactions completed + The first seven lines report some of the most important parameter + settings. + The sixth line reports the maximum number of tries for transactions with + serialization or deadlock errors (see + for more information). + The eighth line reports the number of transactions completed and intended (the latter being just the product of number of clients and number of transactions per client); these will be equal unless the run - failed before completion. (In mode, only the actual - number of transactions is printed.) + failed before completion or some SQL command(s) failed. (In + mode, only the actual number of transactions is printed.) + The next line reports the number of failed transactions due to + serialization or deadlock errors (see + for more information). The last line reports the number of transactions per second. @@ -531,6 +540,17 @@ pgbench options d at all. They are counted and reported separately as skipped. + + When the option is used, the transaction with + serialization or deadlock error cannot be retried if the total time of + all its tries is greater than limit ms. To + limit only the time of tries and not their number, use + --max-tries=0. By default option + is set to 1 and transactions with + serialization/deadlock errors are not retried. See for more information about retrying + such transactions. + @@ -597,23 +617,29 @@ pgbench options d Show progress report every sec seconds. The report includes the time since the beginning of the run, the TPS since the - last report, and the transaction latency average and standard - deviation since the last report. Under throttling (), - the latency is computed with respect to the transaction scheduled - start time, not the actual transaction beginning time, thus it also - includes the average schedule lag time. + last report, and the transaction latency average, standard deviation, + and the number of failed transactions since the last report. Under + throttling (), the latency is computed with respect + to the transaction scheduled start time, not the actual transaction + beginning time, thus it also includes the average schedule lag time. + When is used to enable transactions retries + after serialization/deadlock errors, the report includes the number of + retried transactions and the sum of all retries. - + - Report the average per-statement latency (execution time from the - perspective of the client) of each command after the benchmark - finishes. See below for details. + Report the following statistics for each command after the benchmark + finishes: the average per-statement latency (execution time from the + perspective of the client), the number of failures and the number of + retries after serialization or deadlock errors in this command. The + report displays retry statistics only if the + option is not equal to 1. @@ -741,6 +767,25 @@ pgbench options d + + + + + Report failures in per-transaction and aggregation logs, as well as in + the main and per-script reports, grouped by the following types: + + + serialization failures; + + + deadlock failures; + + + See for more information. + + + + @@ -751,6 +796,36 @@ pgbench options d + + + + + Enable retries for transactions with serialization/deadlock errors and + set the maximum number of these tries. This option can be combined with + the option which limits the total time + of all transaction tries; moreover, you cannot use an unlimited number + of tries (--max-tries=0) without + or . + The default value is 1 and transactions with serialization/deadlock + errors are not retried. See + for more information about retrying such transactions. + + + + + + + + + Print messages about all errors and failures (errors without retrying) + including which limit for retries was violated and how far it was + exceeded for the serialization/deadlock failures. (Note that in this + case the output can be significantly increased.). + See for more information. + + + + @@ -948,8 +1023,8 @@ pgbench options d Notes - - What Is the <quote>Transaction</quote> Actually Performed in <application>pgbench</application>? + + What is the <quote>Transaction</quote> Actually Performed in <application>pgbench</application>? pgbench executes test scripts chosen randomly @@ -1022,6 +1097,11 @@ pgbench options d both old and new versions of pgbench, be sure to write each SQL command on a single line ending with a semicolon. + + It is assumed that pgbench scripts do not contain incomplete blocks of SQL + transactions. If at runtime the client reaches the end of the script without + completing the last transaction block, it will be aborted. + @@ -2212,7 +2292,7 @@ END; The format of the log is: -client_id transaction_no time script_no time_epoch time_us schedule_lag +client_id transaction_no time script_no time_epoch time_us schedule_lag retries where @@ -2233,6 +2313,16 @@ END; When both and are used, the time for a skipped transaction will be reported as skipped. + retries is the sum of all retries after the + serialization or deadlock errors during the current script execution. It is + present only if the option is not equal to 1. + If the transaction ends with a failure, its time + will be reported as failed. If you use the + option, the + time of the failed transaction will be reported as + serialization or + deadlock depending on the type of failure (see + for more information). @@ -2261,6 +2351,41 @@ END; were already late before they were even started. + + The following example shows a snippet of a log file with failures and + retries, with the maximum number of tries set to 10 (note the additional + retries column): + +3 0 47423 0 1499414498 34501 3 +3 1 8333 0 1499414498 42848 0 +3 2 8358 0 1499414498 51219 0 +4 0 72345 0 1499414498 59433 6 +1 3 41718 0 1499414498 67879 4 +1 4 8416 0 1499414498 76311 0 +3 3 33235 0 1499414498 84469 3 +0 0 failed 0 1499414498 84905 9 +2 0 failed 0 1499414498 86248 9 +3 4 8307 0 1499414498 92788 0 + + + + + If option is used, the type of + failure is reported in the time like this: + +3 0 47423 0 1499414498 34501 3 +3 1 8333 0 1499414498 42848 0 +3 2 8358 0 1499414498 51219 0 +4 0 72345 0 1499414498 59433 6 +1 3 41718 0 1499414498 67879 4 +1 4 8416 0 1499414498 76311 0 +3 3 33235 0 1499414498 84469 3 +0 0 serialization 0 1499414498 84905 9 +2 0 serialization 0 1499414498 86248 9 +3 4 8307 0 1499414498 92788 0 + + + When running a long test on hardware that can handle a lot of transactions, the log files can become very large. The option @@ -2276,7 +2401,7 @@ END; format is used for the log files: -interval_start num_transactions&zwsp; sum_latency sum_latency_2 min_latency max_latency&zwsp; sum_lag sum_lag_2 min_lag max_lag skipped +interval_start num_transactions sum_latency sum_latency_2 min_latency max_latency { failures | serialization_failures deadlock_failures } sum_lag sum_lag_2 min_lag max_lag skipped retried retries where @@ -2290,7 +2415,16 @@ END; transaction latencies within the interval, min_latency is the minimum latency within the interval, and - max_latency is the maximum latency within the interval. + max_latency is the maximum latency within the interval, + failures is the number of transactions that ended + with a failed SQL command within the interval. If you use option + , instead of the sum of all failed + transactions you will get more detailed statistics for the failed + transactions grouped by the following types: + serialization_failures is the number of + transactions that got a serialization error and were not retried after this, + deadlock_failures is the number of transactions + that got a deadlock error and were not retried after this. The next fields, sum_lag, sum_lag_2, min_lag, and max_lag, are only present if the @@ -2298,21 +2432,25 @@ END; They provide statistics about the time each transaction had to wait for the previous one to finish, i.e., the difference between each transaction's scheduled start time and the time it actually started. - The very last field, skipped, + The next field, skipped, is only present if the option is used, too. It counts the number of transactions skipped because they would have started too late. + The retried and retries + fields are present only if the option is not + equal to 1. They report the number of retried transactions and the sum of all + retries after serialization or deadlock errors within the interval. Each transaction is counted in the interval when it was committed. Here is some example output: -1345828501 5601 1542744 483552416 61 2573 -1345828503 7884 1979812 565806736 60 1479 -1345828505 7208 1979422 567277552 59 1391 -1345828507 7685 1980268 569784714 60 1398 -1345828509 7073 1979779 573489941 236 1411 +1345828501 5601 1542744 483552416 61 2573 0 +1345828503 7884 1979812 565806736 60 1479 0 +1345828505 7208 1979422 567277552 59 1391 0 +1345828507 7685 1980268 569784714 60 1398 0 +1345828509 7073 1979779 573489941 236 1411 0 @@ -2324,13 +2462,42 @@ END; - Per-Statement Latencies + Per-Statement Report + + + With the option, pgbench + collects the following statistics for each statement: + + + + latency — elapsed transaction time for each + statement. pgbench reports an average value + of all successful runs of the statement. + + + + + The number of failures in this statement. See + for more information. + + + + + The number of retries after a serialization or a deadlock error in this + statement. See for more information. + + + + + + + The report displays retry statistics only if the + option is not equal to 1. + - With the option, pgbench collects - the elapsed transaction time of each statement executed by every - client. It then reports an average of those values, referred to - as the latency for each statement, after the benchmark has finished. + All values are computed for each statement executed by every client and are + reported after the benchmark has finished. @@ -2342,29 +2509,67 @@ scaling factor: 1 query mode: simple number of clients: 10 number of threads: 1 +maximum number of tries: 1 number of transactions per client: 1000 number of transactions actually processed: 10000/10000 -latency average = 10.870 ms -latency stddev = 7.341 ms -initial connection time = 30.954 ms -tps = 907.949122 (without initial connection time) -statement latencies in milliseconds: - 0.001 \set aid random(1, 100000 * :scale) - 0.001 \set bid random(1, 1 * :scale) - 0.001 \set tid random(1, 10 * :scale) - 0.000 \set delta random(-5000, 5000) - 0.046 BEGIN; - 0.151 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; - 0.107 SELECT abalance FROM pgbench_accounts WHERE aid = :aid; - 4.241 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; - 5.245 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; - 0.102 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); - 0.974 END; +number of failed transactions: 0 (0.000%) +number of transactions above the 50.0 ms latency limit: 1311/10000 (13.110 %) +latency average = 28.488 ms +latency stddev = 21.009 ms +initial connection time = 69.068 ms +tps = 346.224794 (without initial connection time) +statement latencies in milliseconds and failures: + 0.012 0 \set aid random(1, 100000 * :scale) + 0.002 0 \set bid random(1, 1 * :scale) + 0.002 0 \set tid random(1, 10 * :scale) + 0.002 0 \set delta random(-5000, 5000) + 0.319 0 BEGIN; + 0.834 0 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; + 0.641 0 SELECT abalance FROM pgbench_accounts WHERE aid = :aid; + 11.126 0 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; + 12.961 0 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; + 0.634 0 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); + 1.957 0 END; + + Another example of output for the default script using serializable default + transaction isolation level (PGOPTIONS='-c + default_transaction_isolation=serializable' pgbench ...): + +starting vacuum...end. +transaction type: <builtin: TPC-B (sort of)> +scaling factor: 1 +query mode: simple +number of clients: 10 +number of threads: 1 +maximum number of tries: 10 +number of transactions per client: 1000 +number of transactions actually processed: 6317/10000 +number of failed transactions: 3683 (36.830%) +number of transactions retried: 7667 (76.670%) +total number of retries: 45339 +number of transactions above the 50.0 ms latency limit: 106/6317 (1.678 %) +latency average = 17.016 ms +latency stddev = 13.283 ms +initial connection time = 45.017 ms +tps = 186.792667 (without initial connection time) +statement latencies in milliseconds, failures and retries: + 0.006 0 0 \set aid random(1, 100000 * :scale) + 0.001 0 0 \set bid random(1, 1 * :scale) + 0.001 0 0 \set tid random(1, 10 * :scale) + 0.001 0 0 \set delta random(-5000, 5000) + 0.385 0 0 BEGIN; + 0.773 0 1 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; + 0.624 0 0 SELECT abalance FROM pgbench_accounts WHERE aid = :aid; + 1.098 320 3762 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; + 0.582 3363 41576 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; + 0.465 0 0 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); + 1.933 0 0 END; + - If multiple script files are specified, the averages are reported + If multiple script files are specified, all statistics are reported separately for each script file. @@ -2378,6 +2583,140 @@ statement latencies in milliseconds: + + Failures and Serialization/Deadlock Retries + + + When executing pgbench, there are three main types + of errors: + + + + Errors of the main program. They are the most serious and always result + in an immediate exit from the pgbench with + the corresponding error message. They include: + + + + errors at the beginning of the pgbench + (e.g. an invalid option value); + + + + + errors in the initialization mode (e.g. the query to create + tables for built-in scripts fails); + + + + + errors before starting threads (e.g. we could not connect to the + database server / the syntax error in the meta command / thread + creation failure); + + + + + internal pgbench errors (which are + supposed to never occur...). + + + + + + + + Errors when the thread manages its clients (e.g. the client could not + start a connection to the database server / the socket for connecting + the client to the database server has become invalid). In such cases + all clients of this thread stop while other threads continue to work. + + + + + Direct client errors. They lead to immediate exit from the + pgbench with the corresponding error message + only in the case of an internal pgbench + error (which are supposed to never occur...). Otherwise in the worst + case they only lead to the abortion of the failed client while other + clients continue their run (but some client errors are handled without + an abortion of the client and reported separately, see below). Later in + this section it is assumed that the discussed errors are only the + direct client errors and they are not internal + pgbench errors. + + + + + + + Client's run is aborted in case of a serious error, for example, the + connection with the database server was lost or the end of script reached + without completing the last transaction. In addition, if an execution of SQL + or meta command fails for reasons other than serialization or deadlock errors, + the client is aborted. Otherwise, if an SQL fails with serialization or + deadlock errors, the client is not aborted. In such cases, the current + transaction is rolled back, which also includes setting the client variables + as they were before the run of this transaction (it is assumed that one + transaction script contains only one transaction; see + for more information). + Transactions with serialization or deadlock errors are repeated after + rollbacks until they complete successfully or reach the maximum + number of tries (specified by the option) / the maximum + time of retries (specified by the option) / the end + of benchmark (specified by the option). If + the last trial run fails, this transaction will be reported as failed but + the client is not aborted and continue to work. + + + + + Without specifying the option a transaction will + never be retried after a serialization or deadlock error because its default + values is 1. Use an unlimited number of tries (--max-tries=0) + and the option to limit only the maximum time + of tries. You can also use the option to limit the + benchmark duration under an unlimited number of tries. + + + Be careful when repeating scripts that contain multiple transactions: the + script is always retried completely, so the successful transactions can be + performed several times. + + + Be careful when repeating transactions with shell commands. Unlike the + results of SQL commands, the results of shell commands are not rolled back, + except for the variable value of the \setshell command. + + + + + The latency of a successful transaction includes the entire time of + transaction execution with rollbacks and retries. The latency is measured + only for successful transactions and commands but not for failed transactions + or commands. + + + + The main report contains the number of failed transactions. If the + option is not equal to 1, the main report also + contains the statistics related to retries: the total number of retried + transactions and total number of retries. The per-script report inherits all + these fields from the main report. The per-statement report displays retry + statistics only if the option is not equal to 1. + + + + If you want to group failures by basic types in per-transaction and + aggregation logs, as well as in the main and per-script reports, use the + option. If you also want to distinguish + all errors and failures (errors without retrying) by type including which + limit for retries was violated and how far it was exceeded for the + serialization/deadlock failures, use the + option. + + + Good Practices diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 000ffc4a5c..7080d2a795 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -76,6 +76,8 @@ #define M_PI 3.14159265358979323846 #endif +#define ERRCODE_T_R_SERIALIZATION_FAILURE "40001" +#define ERRCODE_T_R_DEADLOCK_DETECTED "40P01" #define ERRCODE_UNDEFINED_TABLE "42P01" /* @@ -275,9 +277,34 @@ bool progress_timestamp = false; /* progress report with Unix time */ int nclients = 1; /* number of clients */ int nthreads = 1; /* number of threads */ bool is_connect; /* establish connection for each transaction */ -bool report_per_command; /* report per-command latencies */ +bool report_per_command = false; /* report per-command latencies, retries + * after errors and failures (errors + * without retrying) */ int main_pid; /* main process id used in log filename */ +/* + * There are different types of restrictions for deciding that the current + * transaction with a serialization/deadlock error can no longer be retried and + * should be reported as failed: + * - max_tries (--max-tries) can be used to limit the number of tries; + * - latency_limit (-L) can be used to limit the total time of tries; + * - duration (-T) can be used to limit the total benchmark time. + * + * They can be combined together, and you need to use at least one of them to + * retry the transactions with serialization/deadlock errors. If none of them is + * used, the default value of max_tries is 1 and such transactions will not be + * retried. + */ + +/* + * We cannot retry a transaction after the serialization/deadlock error if its + * number of tries reaches this maximum; if its value is zero, it is not used. + */ +uint32 max_tries = 1; + +bool failures_detailed = false; /* whether to group failures in reports + * or logs by basic types */ + const char *pghost = NULL; const char *pgport = NULL; const char *username = NULL; @@ -289,6 +316,12 @@ const char *progname; volatile bool timer_exceeded = false; /* flag from signal handler */ +/* + * We don't want to allocate variables one by one; for efficiency, add a + * constant margin each time it overflows. + */ +#define VARIABLES_ALLOC_MARGIN 8 + /* * Variable definitions. * @@ -306,6 +339,24 @@ typedef struct PgBenchValue value; /* actual variable's value */ } Variable; +/* + * Data structure for client variables. + */ +typedef struct +{ + Variable *vars; /* array of variable definitions */ + int nvars; /* number of variables */ + + /* + * The maximum number of variables that we can currently store in 'vars' + * without having to reallocate more space. We must always have max_vars >= + * nvars. + */ + int max_vars; + + bool vars_sorted; /* are variables sorted by name? */ +} Variables; + #define MAX_SCRIPTS 128 /* max number of SQL scripts allowed */ #define SHELL_COMMAND_SIZE 256 /* maximum size allowed for shell command */ @@ -338,9 +389,66 @@ typedef int64 pg_time_usec_t; typedef struct StatsData { pg_time_usec_t start_time; /* interval start time, for aggregates */ - int64 cnt; /* number of transactions, including skipped */ + + /* + * Transactions are counted depending on their execution and outcome. First + * a transaction may have started or not: skipped transactions occur under + * --rate and --latency-limit when the client is too late to execute them. + * Secondly, a started transaction may ultimately succeed or fail, possibly + * after some retries when --max-tries is not one. Thus + * + * the number of all transactions = + * 'skipped' (it was too late to execute them) + + * 'cnt' (the number of successful transactions) + + * failed (the number of failed transactions). + * + * A successful transaction can have several unsuccessful tries before a + * successful run. Thus + * + * 'cnt' (the number of successful transactions) = + * successfully retried transactions (they got a serialization or a + * deadlock error(s), but were + * successfully retried from the very + * beginning) + + * directly successful transactions (they were successfully completed on + * the first try). + * + * A failed transaction is defined as unsuccessfully retried transactions. + * It can be one of two types: + * + * failed (the number of failed transactions) = + * 'serialization_failures' (they got a serialization error and were not + * successfully retried) + + * 'deadlock_failures' (they got a deadlock error and were not successfully + * retried). + * + * If the transaction was retried after a serialization or a deadlock error + * this does not guarantee that this retry was successful. Thus + * + * 'retries' (number of retries) = + * number of retries in all retried transactions = + * number of retries in (successfully retried transactions + + * failed transactions); + * + * 'retried' (number of all retried transactions) = + * successfully retried transactions + + * failed transactions. + */ + int64 cnt; /* number of successful transactions, not + * including 'skipped' */ int64 skipped; /* number of transactions skipped under --rate * and --latency-limit */ + int64 retries; /* number of retries after a serialization or a + * deadlock error in all the transactions */ + int64 retried; /* number of all transactions that were retried + * after a serialization or a deadlock error + * (perhaps the last try was unsuccessful) */ + int64 serialization_failures; /* number of transactions that were not + * successfully retried after a + * serialization error */ + int64 deadlock_failures; /* number of transactions that were not + * successfully retried after a deadlock + * error */ SimpleStats latency; SimpleStats lag; } StatsData; @@ -351,6 +459,31 @@ typedef struct StatsData */ pg_time_usec_t epoch_shift; +/* + * Error status for errors during script execution. + */ +typedef enum EStatus +{ + ESTATUS_NO_ERROR = 0, + ESTATUS_META_COMMAND_ERROR, + + /* SQL errors */ + ESTATUS_SERIALIZATION_ERROR, + ESTATUS_DEADLOCK_ERROR, + ESTATUS_OTHER_SQL_ERROR +} EStatus; + +/* + * Transaction status at the end of a command. + */ +typedef enum TStatus +{ + TSTATUS_IDLE, + TSTATUS_IN_BLOCK, + TSTATUS_CONN_ERROR, + TSTATUS_OTHER_ERROR +} TStatus; + /* Various random sequences are initialized from this one. */ static pg_prng_state base_random_sequence; @@ -422,6 +555,35 @@ typedef enum CSTATE_END_COMMAND, CSTATE_SKIP_COMMAND, + /* + * States for failed commands. + * + * If the SQL/meta command fails, in CSTATE_ERROR clean up after an error: + * - clear the conditional stack; + * - if we have an unterminated (possibly failed) transaction block, send + * the rollback command to the server and wait for the result in + * CSTATE_WAIT_ROLLBACK_RESULT. If something goes wrong with rolling back, + * go to CSTATE_ABORTED. + * + * But if everything is ok we are ready for future transactions: if this is + * a serialization or deadlock error and we can re-execute the transaction + * from the very beginning, go to CSTATE_RETRY; otherwise go to + * CSTATE_FAILURE. + * + * In CSTATE_RETRY report an error, set the same parameters for the + * transaction execution as in the previous tries and process the first + * transaction command in CSTATE_START_COMMAND. + * + * In CSTATE_FAILURE report a failure, set the parameters for the + * transaction execution as they were before the first run of this + * transaction (except for a random state) and go to CSTATE_END_TX to + * complete this transaction. + */ + CSTATE_ERROR, + CSTATE_WAIT_ROLLBACK_RESULT, + CSTATE_RETRY, + CSTATE_FAILURE, + /* * CSTATE_END_TX performs end-of-transaction processing. It calculates * latency, and logs the transaction. In --connect mode, it closes the @@ -460,9 +622,7 @@ typedef struct int command; /* command number in script */ /* client variables */ - Variable *variables; /* array of variable definitions */ - int nvariables; /* number of variables */ - bool vars_sorted; /* are variables sorted by name? */ + Variables variables; /* various times about current transaction in microseconds */ pg_time_usec_t txn_scheduled; /* scheduled start time of transaction */ @@ -472,8 +632,20 @@ typedef struct bool prepared[MAX_SCRIPTS]; /* whether client prepared the script */ + /* + * For processing failures and repeating transactions with serialization or + * deadlock errors: + */ + EStatus estatus; /* the error status of the current transaction + * execution; this is ESTATUS_NO_ERROR if there were + * no errors */ + pg_prng_state random_state; /* random state */ + uint32 tries; /* how many times have we already tried the + * current transaction? */ + /* per client collected stats */ - int64 cnt; /* client transaction count, for -t */ + int64 cnt; /* client transaction count, for -t; skipped and + * failed transactions are also counted here */ } CState; /* @@ -568,6 +740,9 @@ static const char *QUERYMODE[] = {"simple", "extended", "prepared"}; * aset do gset on all possible queries of a combined query (\;). * expr Parsed expression, if needed. * stats Time spent in this command. + * retries Number of retries after a serialization or deadlock error in the + * current command. + * failures Number of errors in the current command that were not retried. */ typedef struct Command { @@ -580,6 +755,8 @@ typedef struct Command char *varprefix; PgBenchExpr *expr; SimpleStats stats; + int64 retries; + int64 failures; } Command; typedef struct ParsedScript @@ -594,6 +771,8 @@ static ParsedScript sql_script[MAX_SCRIPTS]; /* SQL script files */ static int num_scripts; /* number of scripts in sql_script[] */ static int64 total_weight = 0; +static bool verbose_errors = false; /* print verbose messages of all errors */ + /* Builtin test scripts */ typedef struct BuiltinScript { @@ -731,15 +910,18 @@ usage(void) " protocol for submitting queries (default: simple)\n" " -n, --no-vacuum do not run VACUUM before tests\n" " -P, --progress=NUM show thread progress report every NUM seconds\n" - " -r, --report-latencies report average latency per command\n" + " -r, --report-per-command report latencies, failures and retries per command\n" " -R, --rate=NUM target rate in transactions per second\n" " -s, --scale=NUM report this scale factor in output\n" " -t, --transactions=NUM number of transactions each client runs (default: 10)\n" " -T, --time=NUM duration of benchmark test in seconds\n" " -v, --vacuum-all vacuum all four standard tables before tests\n" " --aggregate-interval=NUM aggregate data over NUM seconds\n" + " --failures-detailed report the failures grouped by basic types\n" " --log-prefix=PREFIX prefix for transaction time log file\n" " (default: \"pgbench_log\")\n" + " --max-tries=NUM max number of tries to run transaction (default: 1)\n" + " --verbose-errors print messages of all errors\n" " --progress-timestamp use Unix epoch timestamps for progress\n" " --random-seed=SEED set random seed (\"time\", \"rand\", integer)\n" " --sampling-rate=NUM fraction of transactions to log (e.g., 0.01 for 1%%)\n" @@ -1265,6 +1447,10 @@ initStats(StatsData *sd, pg_time_usec_t start) sd->start_time = start; sd->cnt = 0; sd->skipped = 0; + sd->retries = 0; + sd->retried = 0; + sd->serialization_failures = 0; + sd->deadlock_failures = 0; initSimpleStats(&sd->latency); initSimpleStats(&sd->lag); } @@ -1273,22 +1459,51 @@ initStats(StatsData *sd, pg_time_usec_t start) * Accumulate one additional item into the given stats object. */ static void -accumStats(StatsData *stats, bool skipped, double lat, double lag) +accumStats(StatsData *stats, bool skipped, double lat, double lag, + EStatus estatus, int64 tries) { - stats->cnt++; - + /* Record the skipped transaction */ if (skipped) { /* no latency to record on skipped transactions */ stats->skipped++; + return; } - else + + /* + * Record the number of retries regardless of whether the transaction was + * successful or failed. + */ + if (tries > 1) { - addToSimpleStats(&stats->latency, lat); + stats->retries += (tries - 1); + stats->retried++; + } - /* and possibly the same for schedule lag */ - if (throttle_delay) - addToSimpleStats(&stats->lag, lag); + switch (estatus) + { + /* Record the successful transaction */ + case ESTATUS_NO_ERROR: + stats->cnt++; + + addToSimpleStats(&stats->latency, lat); + + /* and possibly the same for schedule lag */ + if (throttle_delay) + addToSimpleStats(&stats->lag, lag); + break; + + /* Record the failed transaction */ + case ESTATUS_SERIALIZATION_ERROR: + stats->serialization_failures++; + break; + case ESTATUS_DEADLOCK_ERROR: + stats->deadlock_failures++; + break; + default: + /* internal error which should never occur */ + pg_log_fatal("unexpected error status: %d", estatus); + exit(1); } } @@ -1398,39 +1613,39 @@ compareVariableNames(const void *v1, const void *v2) /* Locate a variable by name; returns NULL if unknown */ static Variable * -lookupVariable(CState *st, char *name) +lookupVariable(Variables *variables, char *name) { Variable key; /* On some versions of Solaris, bsearch of zero items dumps core */ - if (st->nvariables <= 0) + if (variables->nvars <= 0) return NULL; /* Sort if we have to */ - if (!st->vars_sorted) + if (!variables->vars_sorted) { - qsort((void *) st->variables, st->nvariables, sizeof(Variable), + qsort((void *) variables->vars, variables->nvars, sizeof(Variable), compareVariableNames); - st->vars_sorted = true; + variables->vars_sorted = true; } /* Now we can search */ key.name = name; return (Variable *) bsearch((void *) &key, - (void *) st->variables, - st->nvariables, + (void *) variables->vars, + variables->nvars, sizeof(Variable), compareVariableNames); } /* Get the value of a variable, in string form; returns NULL if unknown */ static char * -getVariable(CState *st, char *name) +getVariable(Variables *variables, char *name) { Variable *var; char stringform[64]; - var = lookupVariable(st, name); + var = lookupVariable(variables, name); if (var == NULL) return NULL; /* not found */ @@ -1562,21 +1777,37 @@ valid_variable_name(const char *name) return true; } +/* + * Make sure there is enough space for 'needed' more variable in the variables + * array. + */ +static void +enlargeVariables(Variables *variables, int needed) +{ + /* total number of variables required now */ + needed += variables->nvars; + + if (variables->max_vars < needed) + { + variables->max_vars = needed + VARIABLES_ALLOC_MARGIN; + variables->vars = (Variable *) + pg_realloc(variables->vars, variables->max_vars * sizeof(Variable)); + } +} + /* * Lookup a variable by name, creating it if need be. * Caller is expected to assign a value to the variable. * Returns NULL on failure (bad name). */ static Variable * -lookupCreateVariable(CState *st, const char *context, char *name) +lookupCreateVariable(Variables *variables, const char *context, char *name) { Variable *var; - var = lookupVariable(st, name); + var = lookupVariable(variables, name); if (var == NULL) { - Variable *newvars; - /* * Check for the name only when declaring a new variable to avoid * overhead. @@ -1588,23 +1819,17 @@ lookupCreateVariable(CState *st, const char *context, char *name) } /* Create variable at the end of the array */ - if (st->variables) - newvars = (Variable *) pg_realloc(st->variables, - (st->nvariables + 1) * sizeof(Variable)); - else - newvars = (Variable *) pg_malloc(sizeof(Variable)); - - st->variables = newvars; + enlargeVariables(variables, 1); - var = &newvars[st->nvariables]; + var = &(variables->vars[variables->nvars]); var->name = pg_strdup(name); var->svalue = NULL; /* caller is expected to initialize remaining fields */ - st->nvariables++; + variables->nvars++; /* we don't re-sort the array till we have to */ - st->vars_sorted = false; + variables->vars_sorted = false; } return var; @@ -1613,12 +1838,13 @@ lookupCreateVariable(CState *st, const char *context, char *name) /* Assign a string value to a variable, creating it if need be */ /* Returns false on failure (bad name) */ static bool -putVariable(CState *st, const char *context, char *name, const char *value) +putVariable(Variables *variables, const char *context, char *name, + const char *value) { Variable *var; char *val; - var = lookupCreateVariable(st, context, name); + var = lookupCreateVariable(variables, context, name); if (!var) return false; @@ -1636,12 +1862,12 @@ putVariable(CState *st, const char *context, char *name, const char *value) /* Assign a value to a variable, creating it if need be */ /* Returns false on failure (bad name) */ static bool -putVariableValue(CState *st, const char *context, char *name, +putVariableValue(Variables *variables, const char *context, char *name, const PgBenchValue *value) { Variable *var; - var = lookupCreateVariable(st, context, name); + var = lookupCreateVariable(variables, context, name); if (!var) return false; @@ -1656,12 +1882,13 @@ putVariableValue(CState *st, const char *context, char *name, /* Assign an integer value to a variable, creating it if need be */ /* Returns false on failure (bad name) */ static bool -putVariableInt(CState *st, const char *context, char *name, int64 value) +putVariableInt(Variables *variables, const char *context, char *name, + int64 value) { PgBenchValue val; setIntValue(&val, value); - return putVariableValue(st, context, name, &val); + return putVariableValue(variables, context, name, &val); } /* @@ -1720,7 +1947,7 @@ replaceVariable(char **sql, char *param, int len, char *value) } static char * -assignVariables(CState *st, char *sql) +assignVariables(Variables *variables, char *sql) { char *p, *name, @@ -1741,7 +1968,7 @@ assignVariables(CState *st, char *sql) continue; } - val = getVariable(st, name); + val = getVariable(variables, name); free(name); if (val == NULL) { @@ -1756,12 +1983,13 @@ assignVariables(CState *st, char *sql) } static void -getQueryParams(CState *st, const Command *command, const char **params) +getQueryParams(Variables *variables, const Command *command, + const char **params) { int i; for (i = 0; i < command->argc - 1; i++) - params[i] = getVariable(st, command->argv[i + 1]); + params[i] = getVariable(variables, command->argv[i + 1]); } static char * @@ -2629,7 +2857,7 @@ evaluateExpr(CState *st, PgBenchExpr *expr, PgBenchValue *retval) { Variable *var; - if ((var = lookupVariable(st, expr->u.variable.varname)) == NULL) + if ((var = lookupVariable(&st->variables, expr->u.variable.varname)) == NULL) { pg_log_error("undefined variable \"%s\"", expr->u.variable.varname); return false; @@ -2699,7 +2927,7 @@ getMetaCommand(const char *cmd) * Return true if succeeded, or false on error. */ static bool -runShellCommand(CState *st, char *variable, char **argv, int argc) +runShellCommand(Variables *variables, char *variable, char **argv, int argc) { char command[SHELL_COMMAND_SIZE]; int i, @@ -2730,7 +2958,7 @@ runShellCommand(CState *st, char *variable, char **argv, int argc) { arg = argv[i] + 1; /* a string literal starting with colons */ } - else if ((arg = getVariable(st, argv[i] + 1)) == NULL) + else if ((arg = getVariable(variables, argv[i] + 1)) == NULL) { pg_log_error("%s: undefined variable \"%s\"", argv[0], argv[i]); return false; @@ -2791,7 +3019,7 @@ runShellCommand(CState *st, char *variable, char **argv, int argc) pg_log_error("%s: shell command must return an integer (not \"%s\")", argv[0], res); return false; } - if (!putVariableInt(st, "setshell", variable, retval)) + if (!putVariableInt(variables, "setshell", variable, retval)) return false; pg_log_debug("%s: shell parameter name: \"%s\", value: \"%s\"", argv[0], argv[1], res); @@ -2806,6 +3034,9 @@ preparedStatementName(char *buffer, int file, int state) sprintf(buffer, "P%d_%d", file, state); } +/* + * Report the abortion of the client when processing SQL commands. + */ static void commandFailed(CState *st, const char *cmd, const char *message) { @@ -2813,6 +3044,17 @@ commandFailed(CState *st, const char *cmd, const char *message) st->id, st->command, cmd, st->use_file, message); } +/* + * Report the error in the command while the script is executing. + */ +static void +commandError(CState *st, const char *message) +{ + Assert(sql_script[st->use_file].commands[st->command]->type == SQL_COMMAND); + pg_log_info("client %d got an error in command %d (SQL) of script %d; %s", + st->id, st->command, st->use_file, message); +} + /* return a script number with a weighted choice. */ static int chooseScript(TState *thread) @@ -2843,7 +3085,7 @@ sendCommand(CState *st, Command *command) char *sql; sql = pg_strdup(command->argv[0]); - sql = assignVariables(st, sql); + sql = assignVariables(&st->variables, sql); pg_log_debug("client %d sending %s", st->id, sql); r = PQsendQuery(st->con, sql); @@ -2854,7 +3096,7 @@ sendCommand(CState *st, Command *command) const char *sql = command->argv[0]; const char *params[MAX_ARGS]; - getQueryParams(st, command, params); + getQueryParams(&st->variables, command, params); pg_log_debug("client %d sending %s", st->id, sql); r = PQsendQueryParams(st->con, sql, command->argc - 1, @@ -2901,7 +3143,7 @@ sendCommand(CState *st, Command *command) st->prepared[st->use_file] = true; } - getQueryParams(st, command, params); + getQueryParams(&st->variables, command, params); preparedStatementName(name, st->use_file, st->command); pg_log_debug("client %d sending %s", st->id, name); @@ -2920,6 +3162,33 @@ sendCommand(CState *st, Command *command) return true; } +/* + * Get the error status from the error code. + */ +static EStatus +getSQLErrorStatus(const char *sqlState) +{ + if (sqlState != NULL) + { + if (strcmp(sqlState, ERRCODE_T_R_SERIALIZATION_FAILURE) == 0) + return ESTATUS_SERIALIZATION_ERROR; + else if (strcmp(sqlState, ERRCODE_T_R_DEADLOCK_DETECTED) == 0) + return ESTATUS_DEADLOCK_ERROR; + } + + return ESTATUS_OTHER_SQL_ERROR; +} + +/* + * Returns true if this type of error can be retried. + */ +static bool +canRetryError(EStatus estatus) +{ + return (estatus == ESTATUS_SERIALIZATION_ERROR || + estatus == ESTATUS_DEADLOCK_ERROR); +} + /* * Process query response from the backend. * @@ -2962,6 +3231,7 @@ readCommandResponse(CState *st, MetaCommand meta, char *varprefix) { pg_log_error("client %d script %d command %d query %d: expected one row, got %d", st->id, st->use_file, st->command, qrynum, 0); + st->estatus = ESTATUS_META_COMMAND_ERROR; goto error; } break; @@ -2976,6 +3246,7 @@ readCommandResponse(CState *st, MetaCommand meta, char *varprefix) /* under \gset, report the error */ pg_log_error("client %d script %d command %d query %d: expected one row, got %d", st->id, st->use_file, st->command, qrynum, PQntuples(res)); + st->estatus = ESTATUS_META_COMMAND_ERROR; goto error; } else if (meta == META_ASET && ntuples <= 0) @@ -2994,12 +3265,13 @@ readCommandResponse(CState *st, MetaCommand meta, char *varprefix) varname = psprintf("%s%s", varprefix, varname); /* store last row result as a string */ - if (!putVariable(st, meta == META_ASET ? "aset" : "gset", varname, + if (!putVariable(&st->variables, meta == META_ASET ? "aset" : "gset", varname, PQgetvalue(res, ntuples - 1, fld))) { /* internal error */ pg_log_error("client %d script %d command %d query %d: error storing into variable %s", st->id, st->use_file, st->command, qrynum, varname); + st->estatus = ESTATUS_META_COMMAND_ERROR; goto error; } @@ -3017,6 +3289,18 @@ readCommandResponse(CState *st, MetaCommand meta, char *varprefix) PQerrorMessage(st->con)); break; + case PGRES_NONFATAL_ERROR: + case PGRES_FATAL_ERROR: + st->estatus = getSQLErrorStatus( + PQresultErrorField(res, PG_DIAG_SQLSTATE)); + if (canRetryError(st->estatus)) + { + if (verbose_errors) + commandError(st, PQerrorMessage(st->con)); + goto error; + } + /* fall through */ + default: /* anything else is unexpected */ pg_log_error("client %d script %d aborted in command %d query %d: %s", @@ -3055,14 +3339,14 @@ readCommandResponse(CState *st, MetaCommand meta, char *varprefix) * of delay, in microseconds. Returns true on success, false on error. */ static bool -evaluateSleep(CState *st, int argc, char **argv, int *usecs) +evaluateSleep(Variables *variables, int argc, char **argv, int *usecs) { char *var; int usec; if (*argv[1] == ':') { - if ((var = getVariable(st, argv[1] + 1)) == NULL) + if ((var = getVariable(variables, argv[1] + 1)) == NULL) { pg_log_error("%s: undefined variable \"%s\"", argv[0], argv[1] + 1); return false; @@ -3095,6 +3379,165 @@ evaluateSleep(CState *st, int argc, char **argv, int *usecs) return true; } + +/* + * Returns true if the error can be retried. + */ +static bool +doRetry(CState *st, pg_time_usec_t *now) +{ + Assert(st->estatus != ESTATUS_NO_ERROR); + + /* We can only retry serialization or deadlock errors. */ + if (!canRetryError(st->estatus)) + return false; + + /* + * We must have at least one option to limit the retrying of transactions + * that got an error. + */ + Assert(max_tries || latency_limit || duration > 0); + + /* + * We cannot retry the error if we have reached the maximum number of tries. + */ + if (max_tries && st->tries >= max_tries) + return false; + + /* + * We cannot retry the error if we spent too much time on this transaction. + */ + if (latency_limit) + { + pg_time_now_lazy(now); + if (*now - st->txn_scheduled > latency_limit) + return false; + } + + /* + * We cannot retry the error if the benchmark duration is over. + */ + if (timer_exceeded) + return false; + + /* OK */ + return true; +} + +/* + * Read results and discard it until a sync point. + */ +static int +discardUntilSync(CState *st) +{ + /* send a sync */ + if (!PQpipelineSync(st->con)) + { + pg_log_error("client %d aborted: failed to send a pipeline sync", + st->id); + return 0; + } + + /* receive PGRES_PIPELINE_SYNC and null following it */ + for(;;) + { + PGresult *res = PQgetResult(st->con); + if (PQresultStatus(res) == PGRES_PIPELINE_SYNC) + { + PQclear(res); + res = PQgetResult(st->con); + Assert(res == NULL); + break; + } + PQclear(res); + } + + /* exit pipline */ + if (PQexitPipelineMode(st->con) != 1) + { + pg_log_error("client %d aborted: failed to exit pipeline mode for rolling back the failed transaction", + st->id); + return 0; + } + return 1; +} + +/* + * Get the transaction status at the end of a command especially for + * checking if we are in a (failed) transaction block. + */ +static TStatus +getTransactionStatus(PGconn *con) +{ + PGTransactionStatusType tx_status; + + tx_status = PQtransactionStatus(con); + switch (tx_status) + { + case PQTRANS_IDLE: + return TSTATUS_IDLE; + case PQTRANS_INTRANS: + case PQTRANS_INERROR: + return TSTATUS_IN_BLOCK; + case PQTRANS_UNKNOWN: + /* PQTRANS_UNKNOWN is expected given a broken connection */ + if (PQstatus(con) == CONNECTION_BAD) + return TSTATUS_CONN_ERROR; + /* fall through */ + case PQTRANS_ACTIVE: + default: + /* + * We cannot find out whether we are in a transaction block or not. + * Internal error which should never occur. + */ + pg_log_error("unexpected transaction status %d", tx_status); + return TSTATUS_OTHER_ERROR; + } + + /* not reached */ + Assert(false); + return TSTATUS_OTHER_ERROR; +} + +/* + * Print verbose messages of an error + */ +static void +printVerboseErrorMessages(CState *st, pg_time_usec_t *now, bool is_retry) +{ + static PQExpBuffer buf = NULL; + + if (buf == NULL) + buf = createPQExpBuffer(); + else + resetPQExpBuffer(buf); + + printfPQExpBuffer(buf, "client %d ", st->id); + appendPQExpBuffer(buf, "%s", + (is_retry ? + "repeats the transaction after the error" : + "ends the failed transaction")); + appendPQExpBuffer(buf, " (try %d", st->tries); + + /* Print max_tries if it is not unlimitted. */ + if (max_tries) + appendPQExpBuffer(buf, "/%d", max_tries); + + /* + * If the latency limit is used, print a percentage of the current transaction + * latency from the latency limit. + */ + if (latency_limit) + { + pg_time_now_lazy(now); + appendPQExpBuffer(buf, ", %.3f%% of the maximum time of tries was used", + (100.0 * (*now - st->txn_scheduled) / latency_limit)); + } + appendPQExpBuffer(buf, ")\n"); + + pg_log_info("%s", buf->data); +} + /* * Advance the state machine of a connection. */ @@ -3132,6 +3575,10 @@ advanceConnectionState(TState *thread, CState *st, StatsData *agg) st->use_file = chooseScript(thread); Assert(conditional_stack_empty(st->cstack)); + /* reset transaction variables to default values */ + st->estatus = ESTATUS_NO_ERROR; + st->tries = 1; + pg_log_debug("client %d executing script \"%s\"", st->id, sql_script[st->use_file].desc); @@ -3172,6 +3619,13 @@ advanceConnectionState(TState *thread, CState *st, StatsData *agg) memset(st->prepared, 0, sizeof(st->prepared)); } + /* + * It is the first try to run this transaction. Remember the + * random state: maybe it will get an error and we will need to + * run it again. + */ + st->random_state = st->cs_func_rs; + /* record transaction start time */ st->txn_begin = now; @@ -3328,6 +3782,8 @@ advanceConnectionState(TState *thread, CState *st, StatsData *agg) * - else CSTATE_END_COMMAND */ st->state = executeMetaCommand(st, &now); + if (st->state == CSTATE_ABORTED) + st->estatus = ESTATUS_META_COMMAND_ERROR; } /* @@ -3473,6 +3929,8 @@ advanceConnectionState(TState *thread, CState *st, StatsData *agg) if (PQpipelineStatus(st->con) != PQ_PIPELINE_ON) st->state = CSTATE_END_COMMAND; } + else if (canRetryError(st->estatus)) + st->state = CSTATE_ERROR; else st->state = CSTATE_ABORTED; break; @@ -3520,44 +3978,223 @@ advanceConnectionState(TState *thread, CState *st, StatsData *agg) break; /* - * End of transaction (end of script, really). + * Clean up after an error. */ - case CSTATE_END_TX: + case CSTATE_ERROR: + { + TStatus tstatus; - /* transaction finished: calculate latency and do log */ - processXactStats(thread, st, &now, false, agg); + Assert(st->estatus != ESTATUS_NO_ERROR); - /* - * missing \endif... cannot happen if CheckConditional was - * okay - */ - Assert(conditional_stack_empty(st->cstack)); + /* Clear the conditional stack */ + conditional_stack_reset(st->cstack); - if (is_connect) - { - pg_time_usec_t start = now; + /* Read and discard until a sync point in pipeline mode */ + if (PQpipelineStatus(st->con) != PQ_PIPELINE_OFF) + { + if (!discardUntilSync(st)) + { + st->state = CSTATE_ABORTED; + break; + } + } - pg_time_now_lazy(&start); - finishCon(st); - now = pg_time_now(); - thread->conn_duration += now - start; + /* + * Check if we have a (failed) transaction block or not, and + * roll it back if any. + */ + tstatus = getTransactionStatus(st->con); + if (tstatus == TSTATUS_IN_BLOCK) + { + /* Try to rollback a (failed) transaction block. */ + if (!PQsendQuery(st->con, "ROLLBACK")) + { + pg_log_error("client %d aborted: failed to send sql command for rolling back the failed transaction", + st->id); + st->state = CSTATE_ABORTED; + } + else + st->state = CSTATE_WAIT_ROLLBACK_RESULT; + } + else if (tstatus == TSTATUS_IDLE) + { + /* + * If time is over, we're done; + * otherwise, check if we can retry the error. + */ + st->state = timer_exceeded ? CSTATE_FINISHED : + doRetry(st, &now) ? CSTATE_RETRY : CSTATE_FAILURE; + } + else + { + if (tstatus == TSTATUS_CONN_ERROR) + pg_log_error("perhaps the backend died while processing"); + + pg_log_error("client %d aborted while receiving the transaction status", st->id); + st->state = CSTATE_ABORTED; + } + break; } - if ((st->cnt >= nxacts && duration <= 0) || timer_exceeded) + /* + * Wait for the rollback command to complete + */ + case CSTATE_WAIT_ROLLBACK_RESULT: { - /* script completed */ - st->state = CSTATE_FINISHED; + PGresult *res; + + pg_log_debug("client %d receiving", st->id); + if (!PQconsumeInput(st->con)) + { + pg_log_error("client %d aborted while rolling back the transaction after an error; perhaps the backend died while processing", + st->id); + st->state = CSTATE_ABORTED; + break; + } + if (PQisBusy(st->con)) + return; /* don't have the whole result yet */ + + /* + * Read and discard the query result; + */ + res = PQgetResult(st->con); + switch (PQresultStatus(res)) + { + case PGRES_COMMAND_OK: + /* OK */ + PQclear(res); + /* null must be returned */ + res = PQgetResult(st->con); + Assert(res == NULL); + + /* + * If time is over, we're done; + * otherwise, check if we can retry the error. + */ + st->state = timer_exceeded ? CSTATE_FINISHED : + doRetry(st, &now) ? CSTATE_RETRY : CSTATE_FAILURE; + break; + default: + pg_log_error("client %d aborted while rolling back the transaction after an error; %s", + st->id, PQerrorMessage(st->con)); + PQclear(res); + st->state = CSTATE_ABORTED; + break; + } break; } - /* next transaction (script) */ - st->state = CSTATE_CHOOSE_SCRIPT; + /* + * Retry the transaction after an error. + */ + case CSTATE_RETRY: + command = sql_script[st->use_file].commands[st->command]; /* - * Ensure that we always return on this point, so as to avoid - * an infinite loop if the script only contains meta commands. + * Inform that the transaction will be retried after the error. */ - return; + if (verbose_errors) + printVerboseErrorMessages(st, &now, true); + + /* Count tries and retries */ + st->tries++; + command->retries++; + + /* + * Reset the random state as they were at the beginning + * of the transaction. + */ + st->cs_func_rs = st->random_state; + + /* Process the first transaction command. */ + st->command = 0; + st->estatus = ESTATUS_NO_ERROR; + st->state = CSTATE_START_COMMAND; + break; + + /* + * Record a failed transaction. + */ + case CSTATE_FAILURE: + command = sql_script[st->use_file].commands[st->command]; + + /* Accumulate the failure. */ + command->failures++; + + /* + * Inform that the failed transaction will not be retried. + */ + if (verbose_errors) + printVerboseErrorMessages(st, &now, false); + + /* End the failed transaction. */ + st->state = CSTATE_END_TX; + break; + + /* + * End of transaction (end of script, really). + */ + case CSTATE_END_TX: + { + TStatus tstatus; + + /* transaction finished: calculate latency and do log */ + processXactStats(thread, st, &now, false, agg); + + /* + * missing \endif... cannot happen if CheckConditional was + * okay + */ + Assert(conditional_stack_empty(st->cstack)); + + /* + * We must complete all the transaction blocks that were + * started in this script. + */ + tstatus = getTransactionStatus(st->con); + if (tstatus == TSTATUS_IN_BLOCK) + { + pg_log_error("client %d aborted: end of script reached without completing the last transaction", + st->id); + st->state = CSTATE_ABORTED; + break; + } + else if (tstatus != TSTATUS_IDLE) + { + if (tstatus == TSTATUS_CONN_ERROR) + pg_log_error("perhaps the backend died while processing"); + + pg_log_error("client %d aborted while receiving the transaction status", st->id); + st->state = CSTATE_ABORTED; + break; + } + + if (is_connect) + { + pg_time_usec_t start = now; + + pg_time_now_lazy(&start); + finishCon(st); + now = pg_time_now(); + thread->conn_duration += now - start; + } + + if ((st->cnt >= nxacts && duration <= 0) || timer_exceeded) + { + /* script completed */ + st->state = CSTATE_FINISHED; + break; + } + + /* next transaction (script) */ + st->state = CSTATE_CHOOSE_SCRIPT; + + /* + * Ensure that we always return on this point, so as to avoid + * an infinite loop if the script only contains meta commands. + */ + return; + } /* * Final states. Close the connection if it's still open. @@ -3627,7 +4264,7 @@ executeMetaCommand(CState *st, pg_time_usec_t *now) * latency will be recorded in CSTATE_SLEEP state, not here, after the * delay has elapsed.) */ - if (!evaluateSleep(st, argc, argv, &usec)) + if (!evaluateSleep(&st->variables, argc, argv, &usec)) { commandFailed(st, "sleep", "execution of meta-command failed"); return CSTATE_ABORTED; @@ -3648,7 +4285,7 @@ executeMetaCommand(CState *st, pg_time_usec_t *now) return CSTATE_ABORTED; } - if (!putVariableValue(st, argv[0], argv[1], &result)) + if (!putVariableValue(&st->variables, argv[0], argv[1], &result)) { commandFailed(st, "set", "assignment of meta-command failed"); return CSTATE_ABORTED; @@ -3718,7 +4355,7 @@ executeMetaCommand(CState *st, pg_time_usec_t *now) } else if (command->meta == META_SETSHELL) { - if (!runShellCommand(st, argv[1], argv + 2, argc - 2)) + if (!runShellCommand(&st->variables, argv[1], argv + 2, argc - 2)) { commandFailed(st, "setshell", "execution of meta-command failed"); return CSTATE_ABORTED; @@ -3726,7 +4363,7 @@ executeMetaCommand(CState *st, pg_time_usec_t *now) } else if (command->meta == META_SHELL) { - if (!runShellCommand(st, NULL, argv + 1, argc - 1)) + if (!runShellCommand(&st->variables, NULL, argv + 1, argc - 1)) { commandFailed(st, "shell", "execution of meta-command failed"); return CSTATE_ABORTED; @@ -3781,6 +4418,43 @@ executeMetaCommand(CState *st, pg_time_usec_t *now) return CSTATE_END_COMMAND; } +/* + * Return the number fo failed transactions. + */ +static int64 +getFailures(const StatsData *stats) +{ + return (stats->serialization_failures + + stats->deadlock_failures); +} + +/* + * Return a string constant representing the result of a transaction + * that is not successfully processed. + */ +static const char * +getResultString(bool skipped, EStatus estatus) +{ + if (skipped) + return "skipped"; + else if (failures_detailed) + { + switch (estatus) + { + case ESTATUS_SERIALIZATION_ERROR: + return "serialization"; + case ESTATUS_DEADLOCK_ERROR: + return "deadlock"; + default: + /* internal error which should never occur */ + pg_log_fatal("unexpected error status: %d", estatus); + exit(1); + } + } + else + return "failed"; +} + /* * Print log entry after completing one transaction. * @@ -3828,6 +4502,14 @@ doLog(TState *thread, CState *st, agg->latency.sum2, agg->latency.min, agg->latency.max); + + if (failures_detailed) + fprintf(logfile, " " INT64_FORMAT " " INT64_FORMAT, + agg->serialization_failures, + agg->deadlock_failures); + else + fprintf(logfile, " " INT64_FORMAT, getFailures(agg)); + if (throttle_delay) { fprintf(logfile, " %.0f %.0f %.0f %.0f", @@ -3838,6 +4520,10 @@ doLog(TState *thread, CState *st, if (latency_limit) fprintf(logfile, " " INT64_FORMAT, agg->skipped); } + if (max_tries != 1) + fprintf(logfile, " " INT64_FORMAT " " INT64_FORMAT, + agg->retried, + agg->retries); fputc('\n', logfile); /* reset data and move to next interval */ @@ -3845,22 +4531,26 @@ doLog(TState *thread, CState *st, } /* accumulate the current transaction */ - accumStats(agg, skipped, latency, lag); + accumStats(agg, skipped, latency, lag, st->estatus, st->tries); } else { /* no, print raw transactions */ - if (skipped) - fprintf(logfile, "%d " INT64_FORMAT " skipped %d " INT64_FORMAT " " - INT64_FORMAT, - st->id, st->cnt, st->use_file, now / 1000000, now % 1000000); - else + if (!skipped && st->estatus == ESTATUS_NO_ERROR) fprintf(logfile, "%d " INT64_FORMAT " %.0f %d " INT64_FORMAT " " INT64_FORMAT, st->id, st->cnt, latency, st->use_file, now / 1000000, now % 1000000); + else + fprintf(logfile, "%d " INT64_FORMAT " %s %d " INT64_FORMAT " " + INT64_FORMAT, + st->id, st->cnt, getResultString(skipped, st->estatus), + st->use_file, now / 1000000, now % 1000000); + if (throttle_delay) fprintf(logfile, " %.0f", lag); + if (max_tries != 1) + fprintf(logfile, " %d", st->tries - 1); fputc('\n', logfile); } } @@ -3869,7 +4559,8 @@ doLog(TState *thread, CState *st, * Accumulate and report statistics at end of a transaction. * * (This is also called when a transaction is late and thus skipped. - * Note that even skipped transactions are counted in the "cnt" fields.) + * Note that even skipped and failed transactions are counted in the CState + * "cnt" field.) */ static void processXactStats(TState *thread, CState *st, pg_time_usec_t *now, @@ -3877,10 +4568,10 @@ processXactStats(TState *thread, CState *st, pg_time_usec_t *now, { double latency = 0.0, lag = 0.0; - bool thread_details = progress || throttle_delay || latency_limit, - detailed = thread_details || use_log || per_script_stats; + bool detailed = progress || throttle_delay || latency_limit || + use_log || per_script_stats; - if (detailed && !skipped) + if (detailed && !skipped && st->estatus == ESTATUS_NO_ERROR) { pg_time_now_lazy(now); @@ -3889,20 +4580,12 @@ processXactStats(TState *thread, CState *st, pg_time_usec_t *now, lag = st->txn_begin - st->txn_scheduled; } - if (thread_details) - { - /* keep detailed thread stats */ - accumStats(&thread->stats, skipped, latency, lag); + /* keep detailed thread stats */ + accumStats(&thread->stats, skipped, latency, lag, st->estatus, st->tries); - /* count transactions over the latency limit, if needed */ - if (latency_limit && latency > latency_limit) - thread->latency_late++; - } - else - { - /* no detailed stats, just count */ - thread->stats.cnt++; - } + /* count transactions over the latency limit, if needed */ + if (latency_limit && latency > latency_limit) + thread->latency_late++; /* client stat is just counting */ st->cnt++; @@ -3912,7 +4595,8 @@ processXactStats(TState *thread, CState *st, pg_time_usec_t *now, /* XXX could use a mutex here, but we choose not to */ if (per_script_stats) - accumStats(&sql_script[st->use_file].stats, skipped, latency, lag); + accumStats(&sql_script[st->use_file].stats, skipped, latency, lag, + st->estatus, st->tries); } @@ -4771,6 +5455,8 @@ create_sql_command(PQExpBuffer buf, const char *source) my_command->type = SQL_COMMAND; my_command->meta = META_NONE; my_command->argc = 0; + my_command->retries = 0; + my_command->failures = 0; memset(my_command->argv, 0, sizeof(my_command->argv)); my_command->varprefix = NULL; /* allocated later, if needed */ my_command->expr = NULL; @@ -5439,7 +6125,9 @@ printProgressReport(TState *threads, int64 test_start, pg_time_usec_t now, { /* generate and show report */ pg_time_usec_t run = now - *last_report; - int64 ntx; + int64 cnt, + failures, + retried; double tps, total_run, latency, @@ -5466,23 +6154,30 @@ printProgressReport(TState *threads, int64 test_start, pg_time_usec_t now, mergeSimpleStats(&cur.lag, &threads[i].stats.lag); cur.cnt += threads[i].stats.cnt; cur.skipped += threads[i].stats.skipped; + cur.retries += threads[i].stats.retries; + cur.retried += threads[i].stats.retried; + cur.serialization_failures += + threads[i].stats.serialization_failures; + cur.deadlock_failures += threads[i].stats.deadlock_failures; } /* we count only actually executed transactions */ - ntx = (cur.cnt - cur.skipped) - (last->cnt - last->skipped); + cnt = cur.cnt - last->cnt; total_run = (now - test_start) / 1000000.0; - tps = 1000000.0 * ntx / run; - if (ntx > 0) + tps = 1000000.0 * cnt / run; + if (cnt > 0) { - latency = 0.001 * (cur.latency.sum - last->latency.sum) / ntx; - sqlat = 1.0 * (cur.latency.sum2 - last->latency.sum2) / ntx; + latency = 0.001 * (cur.latency.sum - last->latency.sum) / cnt; + sqlat = 1.0 * (cur.latency.sum2 - last->latency.sum2) / cnt; stdev = 0.001 * sqrt(sqlat - 1000000.0 * latency * latency); - lag = 0.001 * (cur.lag.sum - last->lag.sum) / ntx; + lag = 0.001 * (cur.lag.sum - last->lag.sum) / cnt; } else { latency = sqlat = stdev = lag = 0; } + failures = getFailures(&cur) - getFailures(last); + retried = cur.retried - last->retried; if (progress_timestamp) { @@ -5496,8 +6191,8 @@ printProgressReport(TState *threads, int64 test_start, pg_time_usec_t now, } fprintf(stderr, - "progress: %s, %.1f tps, lat %.3f ms stddev %.3f", - tbuf, tps, latency, stdev); + "progress: %s, %.1f tps, lat %.3f ms stddev %.3f, " INT64_FORMAT " failed", + tbuf, tps, latency, stdev, failures); if (throttle_delay) { @@ -5506,6 +6201,12 @@ printProgressReport(TState *threads, int64 test_start, pg_time_usec_t now, fprintf(stderr, ", " INT64_FORMAT " skipped", cur.skipped - last->skipped); } + + /* it can be non-zero only if max_tries is not equal to one */ + if (max_tries != 1) + fprintf(stderr, + ", " INT64_FORMAT " retried, " INT64_FORMAT " retries", + retried, cur.retries - last->retries); fprintf(stderr, "\n"); *last = cur; @@ -5565,9 +6266,10 @@ printResults(StatsData *total, int64 latency_late) { /* tps is about actually executed transactions during benchmarking */ - int64 ntx = total->cnt - total->skipped; + int64 failures = getFailures(total); + int64 total_cnt = total->cnt + total->skipped + failures; double bench_duration = PG_TIME_GET_DOUBLE(total_duration); - double tps = ntx / bench_duration; + double tps = total->cnt / bench_duration; /* Report test parameters. */ printf("transaction type: %s\n", @@ -5580,39 +6282,65 @@ printResults(StatsData *total, printf("query mode: %s\n", QUERYMODE[querymode]); printf("number of clients: %d\n", nclients); printf("number of threads: %d\n", nthreads); + + if (max_tries) + printf("maximum number of tries: %d\n", max_tries); + if (duration <= 0) { printf("number of transactions per client: %d\n", nxacts); printf("number of transactions actually processed: " INT64_FORMAT "/%d\n", - ntx, nxacts * nclients); + total->cnt, nxacts * nclients); } else { printf("duration: %d s\n", duration); printf("number of transactions actually processed: " INT64_FORMAT "\n", - ntx); + total->cnt); + } + + printf("number of failed transactions: " INT64_FORMAT " (%.3f%%)\n", + failures, 100.0 * failures / total_cnt); + + if (failures_detailed) + { + printf("number of serialization failures: " INT64_FORMAT " (%.3f%%)\n", + total->serialization_failures, + 100.0 * total->serialization_failures / total_cnt); + printf("number of deadlock failures: " INT64_FORMAT " (%.3f%%)\n", + total->deadlock_failures, + 100.0 * total->deadlock_failures / total_cnt); + } + + /* it can be non-zero only if max_tries is not equal to one */ + if (max_tries != 1) + { + printf("number of transactions retried: " INT64_FORMAT " (%.3f%%)\n", + total->retried, 100.0 * total->retried / total_cnt); + printf("total number of retries: " INT64_FORMAT "\n", total->retries); } /* Remaining stats are nonsensical if we failed to execute any xacts */ - if (total->cnt <= 0) + if (total->cnt + total->skipped <= 0) return; if (throttle_delay && latency_limit) printf("number of transactions skipped: " INT64_FORMAT " (%.3f%%)\n", - total->skipped, 100.0 * total->skipped / total->cnt); + total->skipped, 100.0 * total->skipped / total_cnt); if (latency_limit) printf("number of transactions above the %.1f ms latency limit: " INT64_FORMAT "/" INT64_FORMAT " (%.3f%%)\n", - latency_limit / 1000.0, latency_late, ntx, - (ntx > 0) ? 100.0 * latency_late / ntx : 0.0); + latency_limit / 1000.0, latency_late, total->cnt, + (total->cnt > 0) ? 100.0 * latency_late / total->cnt : 0.0); if (throttle_delay || progress || latency_limit) printSimpleStats("latency", &total->latency); else { /* no measurement, show average latency computed from run time */ - printf("latency average = %.3f ms\n", - 0.001 * total_duration * nclients / total->cnt); + printf("latency average = %.3f ms%s\n", + 0.001 * total_duration * nclients / total_cnt, + failures > 0 ? " (including failures)" : ""); } if (throttle_delay) @@ -5638,7 +6366,7 @@ printResults(StatsData *total, */ if (is_connect) { - printf("average connection time = %.3f ms\n", 0.001 * conn_total_duration / total->cnt); + printf("average connection time = %.3f ms\n", 0.001 * conn_total_duration / (total->cnt + failures)); printf("tps = %f (including reconnection times)\n", tps); } else @@ -5657,6 +6385,9 @@ printResults(StatsData *total, if (per_script_stats) { StatsData *sstats = &sql_script[i].stats; + int64 script_failures = getFailures(sstats); + int64 script_total_cnt = + sstats->cnt + sstats->skipped + script_failures; printf("SQL script %d: %s\n" " - weight: %d (targets %.1f%% of total)\n" @@ -5666,25 +6397,55 @@ printResults(StatsData *total, 100.0 * sql_script[i].weight / total_weight, sstats->cnt, 100.0 * sstats->cnt / total->cnt, - (sstats->cnt - sstats->skipped) / bench_duration); + sstats->cnt / bench_duration); + + printf(" - number of failed transactions: " INT64_FORMAT " (%.3f%%)\n", + script_failures, + 100.0 * script_failures / script_total_cnt); + + if (failures_detailed) + { + printf(" - number of serialization failures: " INT64_FORMAT " (%.3f%%)\n", + sstats->serialization_failures, + (100.0 * sstats->serialization_failures / + script_total_cnt)); + printf(" - number of deadlock failures: " INT64_FORMAT " (%.3f%%)\n", + sstats->deadlock_failures, + (100.0 * sstats->deadlock_failures / + script_total_cnt)); + } + + /* it can be non-zero only if max_tries is not equal to one */ + if (max_tries != 1) + { + printf(" - number of transactions retried: " INT64_FORMAT " (%.3f%%)\n", + sstats->retried, + 100.0 * sstats->retried / script_total_cnt); + printf(" - total number of retries: " INT64_FORMAT "\n", + sstats->retries); + } - if (throttle_delay && latency_limit && sstats->cnt > 0) + if (throttle_delay && latency_limit && script_total_cnt > 0) printf(" - number of transactions skipped: " INT64_FORMAT " (%.3f%%)\n", sstats->skipped, - 100.0 * sstats->skipped / sstats->cnt); + 100.0 * sstats->skipped / script_total_cnt); printSimpleStats(" - latency", &sstats->latency); } - /* Report per-command latencies */ + /* + * Report per-command statistics: latencies, retries after errors, + * failures (errors without retrying). + */ if (report_per_command) { Command **commands; - if (per_script_stats) - printf(" - statement latencies in milliseconds:\n"); - else - printf("statement latencies in milliseconds:\n"); + printf("%sstatement latencies in milliseconds%s:\n", + per_script_stats ? " - " : "", + (max_tries == 1 ? + " and failures" : + ", failures and retries")); for (commands = sql_script[i].commands; *commands != NULL; @@ -5692,10 +6453,19 @@ printResults(StatsData *total, { SimpleStats *cstats = &(*commands)->stats; - printf(" %11.3f %s\n", - (cstats->count > 0) ? - 1000.0 * cstats->sum / cstats->count : 0.0, - (*commands)->first_line); + if (max_tries == 1) + printf(" %11.3f %10" INT64_MODIFIER "d %s\n", + (cstats->count > 0) ? + 1000.0 * cstats->sum / cstats->count : 0.0, + (*commands)->failures, + (*commands)->first_line); + else + printf(" %11.3f %10" INT64_MODIFIER "d %10" INT64_MODIFIER "d %s\n", + (cstats->count > 0) ? + 1000.0 * cstats->sum / cstats->count : 0.0, + (*commands)->failures, + (*commands)->retries, + (*commands)->first_line); } } } @@ -5775,7 +6545,7 @@ main(int argc, char **argv) {"progress", required_argument, NULL, 'P'}, {"protocol", required_argument, NULL, 'M'}, {"quiet", no_argument, NULL, 'q'}, - {"report-latencies", no_argument, NULL, 'r'}, + {"report-per-command", no_argument, NULL, 'r'}, {"rate", required_argument, NULL, 'R'}, {"scale", required_argument, NULL, 's'}, {"select-only", no_argument, NULL, 'S'}, @@ -5797,6 +6567,9 @@ main(int argc, char **argv) {"show-script", required_argument, NULL, 10}, {"partitions", required_argument, NULL, 11}, {"partition-method", required_argument, NULL, 12}, + {"failures-detailed", no_argument, NULL, 13}, + {"max-tries", required_argument, NULL, 14}, + {"verbose-errors", no_argument, NULL, 15}, {NULL, 0, NULL, 0} }; @@ -6020,7 +6793,7 @@ main(int argc, char **argv) } *p++ = '\0'; - if (!putVariable(&state[0], "option", optarg, p)) + if (!putVariable(&state[0].variables, "option", optarg, p)) exit(1); } break; @@ -6150,6 +6923,28 @@ main(int argc, char **argv) exit(1); } break; + case 13: /* failures-detailed */ + benchmarking_option_set = true; + failures_detailed = true; + break; + case 14: /* max-tries */ + { + int32 max_tries_arg = atoi(optarg); + + if (max_tries_arg < 0) + { + pg_log_fatal("invalid number of maximum tries: \"%s\"", optarg); + exit(1); + } + + benchmarking_option_set = true; + max_tries = (uint32) max_tries_arg; + } + break; + case 15: /* verbose-errors */ + benchmarking_option_set = true; + verbose_errors = true; + break; default: fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); @@ -6331,6 +7126,15 @@ main(int argc, char **argv) exit(1); } + if (!max_tries) + { + if (!latency_limit && duration <= 0) + { + pg_log_fatal("an unlimited number of transaction tries can only be used with --latency-limit or a duration (-T)"); + exit(1); + } + } + /* * save main process id in the global variable because process id will be * changed after fork. @@ -6348,19 +7152,19 @@ main(int argc, char **argv) int j; state[i].id = i; - for (j = 0; j < state[0].nvariables; j++) + for (j = 0; j < state[0].variables.nvars; j++) { - Variable *var = &state[0].variables[j]; + Variable *var = &state[0].variables.vars[j]; if (var->value.type != PGBT_NO_VALUE) { - if (!putVariableValue(&state[i], "startup", + if (!putVariableValue(&state[i].variables, "startup", var->name, &var->value)) exit(1); } else { - if (!putVariable(&state[i], "startup", + if (!putVariable(&state[i].variables, "startup", var->name, var->svalue)) exit(1); } @@ -6398,11 +7202,11 @@ main(int argc, char **argv) * :scale variables normally get -s or database scale, but don't override * an explicit -D switch */ - if (lookupVariable(&state[0], "scale") == NULL) + if (lookupVariable(&state[0].variables, "scale") == NULL) { for (i = 0; i < nclients; i++) { - if (!putVariableInt(&state[i], "startup", "scale", scale)) + if (!putVariableInt(&state[i].variables, "startup", "scale", scale)) exit(1); } } @@ -6411,28 +7215,30 @@ main(int argc, char **argv) * Define a :client_id variable that is unique per connection. But don't * override an explicit -D switch. */ - if (lookupVariable(&state[0], "client_id") == NULL) + if (lookupVariable(&state[0].variables, "client_id") == NULL) { for (i = 0; i < nclients; i++) - if (!putVariableInt(&state[i], "startup", "client_id", i)) + if (!putVariableInt(&state[i].variables, "startup", "client_id", i)) exit(1); } /* set default seed for hash functions */ - if (lookupVariable(&state[0], "default_seed") == NULL) + if (lookupVariable(&state[0].variables, "default_seed") == NULL) { uint64 seed = pg_prng_uint64(&base_random_sequence); for (i = 0; i < nclients; i++) - if (!putVariableInt(&state[i], "startup", "default_seed", (int64) seed)) + if (!putVariableInt(&state[i].variables, "startup", "default_seed", + (int64) seed)) exit(1); } /* set random seed unless overwritten */ - if (lookupVariable(&state[0], "random_seed") == NULL) + if (lookupVariable(&state[0].variables, "random_seed") == NULL) { for (i = 0; i < nclients; i++) - if (!putVariableInt(&state[i], "startup", "random_seed", random_seed)) + if (!putVariableInt(&state[i].variables, "startup", "random_seed", + random_seed)) exit(1); } @@ -6541,6 +7347,10 @@ main(int argc, char **argv) mergeSimpleStats(&stats.lag, &thread->stats.lag); stats.cnt += thread->stats.cnt; stats.skipped += thread->stats.skipped; + stats.retries += thread->stats.retries; + stats.retried += thread->stats.retried; + stats.serialization_failures += thread->stats.serialization_failures; + stats.deadlock_failures += thread->stats.deadlock_failures; latency_late += thread->latency_late; conn_total_duration += thread->conn_duration; @@ -6687,7 +7497,8 @@ threadRun(void *arg) if (min_usec > this_usec) min_usec = this_usec; } - else if (st->state == CSTATE_WAIT_RESULT) + else if (st->state == CSTATE_WAIT_RESULT || + st->state == CSTATE_WAIT_ROLLBACK_RESULT) { /* * waiting for result from server - nothing to do unless the @@ -6776,7 +7587,8 @@ threadRun(void *arg) { CState *st = &state[i]; - if (st->state == CSTATE_WAIT_RESULT) + if (st->state == CSTATE_WAIT_RESULT || + st->state == CSTATE_WAIT_ROLLBACK_RESULT) { /* don't call advanceConnectionState unless data is available */ int sock = PQsocket(st->con); diff --git a/src/bin/pgbench/t/001_pgbench_with_server.pl b/src/bin/pgbench/t/001_pgbench_with_server.pl index f1341092fe..d173ceae7a 100644 --- a/src/bin/pgbench/t/001_pgbench_with_server.pl +++ b/src/bin/pgbench/t/001_pgbench_with_server.pl @@ -11,7 +11,9 @@ # start a pgbench specific server my $node = PostgreSQL::Test::Cluster->new('main'); -$node->init; +# Set to untranslated messages, to be able to compare program output with +# expected strings. +$node->init(extra => [ '--locale', 'C' ]); $node->start; # tablespace for testing, because partitioned tables cannot use pg_default @@ -109,7 +111,8 @@ qr{builtin: TPC-B}, qr{clients: 2\b}, qr{processed: 10/10}, - qr{mode: simple} + qr{mode: simple}, + qr{maximum number of tries: 1} ], [qr{^$}], 'pgbench tpcb-like'); @@ -1198,6 +1201,214 @@ sub check_pgbench_logs check_pgbench_logs($bdir, '001_pgbench_log_3', 1, 10, 10, qr{^0 \d{1,2} \d+ \d \d+ \d+$}); +# abortion of the client if the script contains an incomplete transaction block +$node->pgbench( + '--no-vacuum', 2, [ qr{processed: 1/10} ], + [ qr{client 0 aborted: end of script reached without completing the last transaction} ], + 'incomplete transaction block', + { '001_pgbench_incomplete_transaction_block' => q{BEGIN;SELECT 1;} }); + +# Test the concurrent update in the table row and deadlocks. + +$node->safe_psql('postgres', + 'CREATE UNLOGGED TABLE first_client_table (value integer); ' + . 'CREATE UNLOGGED TABLE xy (x integer, y integer); ' + . 'INSERT INTO xy VALUES (1, 2);'); + +# Serialization error and retry + +local $ENV{PGOPTIONS} = "-c default_transaction_isolation=repeatable\\ read"; + +# Check that we have a serialization error and the same random value of the +# delta variable in the next try +my $err_pattern = + "client (0|1) got an error in command 3 \\(SQL\\) of script 0; " + . "ERROR: could not serialize access due to concurrent update\\b.*" + . "\\g1"; + +$node->pgbench( + "-n -c 2 -t 1 -d --verbose-errors --max-tries 2", + 0, + [ qr{processed: 2/2\b}, qr{number of transactions retried: 1\b}, + qr{total number of retries: 1\b} ], + [ qr/$err_pattern/s ], + 'concurrent update with retrying', + { + '001_pgbench_serialization' => q{ +-- What's happening: +-- The first client starts the transaction with the isolation level Repeatable +-- Read: +-- +-- BEGIN; +-- UPDATE xy SET y = ... WHERE x = 1; +-- +-- The second client starts a similar transaction with the same isolation level: +-- +-- BEGIN; +-- UPDATE xy SET y = ... WHERE x = 1; +-- +-- +-- The first client commits its transaction, and the second client gets a +-- serialization error. + +\set delta random(-5000, 5000) + +-- The second client will stop here +SELECT pg_advisory_lock(0); + +-- Start transaction with concurrent update +BEGIN; +UPDATE xy SET y = y + :delta WHERE x = 1 AND pg_advisory_lock(1) IS NOT NULL; + +-- Wait for the second client +DO $$ +DECLARE + exists boolean; + waiters integer; +BEGIN + -- The second client always comes in second, and the number of rows in the + -- table first_client_table reflect this. Here the first client inserts a row, + -- so the second client will see a non-empty table when repeating the + -- transaction after the serialization error. + SELECT EXISTS (SELECT * FROM first_client_table) INTO STRICT exists; + IF NOT exists THEN + -- Let the second client begin + PERFORM pg_advisory_unlock(0); + -- And wait until the second client tries to get the same lock + LOOP + SELECT COUNT(*) INTO STRICT waiters FROM pg_locks WHERE + locktype = 'advisory' AND objsubid = 1 AND + ((classid::bigint << 32) | objid::bigint = 1::bigint) AND NOT granted; + IF waiters = 1 THEN + INSERT INTO first_client_table VALUES (1); + + -- Exit loop + EXIT; + END IF; + END LOOP; + END IF; +END$$; + +COMMIT; +SELECT pg_advisory_unlock_all(); +} + }); + +# Clean up + +$node->safe_psql('postgres', 'DELETE FROM first_client_table;'); + +local $ENV{PGOPTIONS} = "-c default_transaction_isolation=read\\ committed"; + +# Deadlock error and retry + +# Check that we have a deadlock error +$err_pattern = + "client (0|1) got an error in command (3|5) \\(SQL\\) of script 0; " + . "ERROR: deadlock detected\\b"; + +$node->pgbench( + "-n -c 2 -t 1 --max-tries 2 --verbose-errors", + 0, + [ qr{processed: 2/2\b}, qr{number of transactions retried: 1\b}, + qr{total number of retries: 1\b} ], + [ qr{$err_pattern} ], + 'deadlock with retrying', + { + '001_pgbench_deadlock' => q{ +-- What's happening: +-- The first client gets the lock 2. +-- The second client gets the lock 3 and tries to get the lock 2. +-- The first client tries to get the lock 3 and one of them gets a deadlock +-- error. +-- +-- A client that does not get a deadlock error must hold a lock at the +-- transaction start. Thus in the end it releases all of its locks before the +-- client with the deadlock error starts a retry (we do not want any errors +-- again). + +-- Since the client with the deadlock error has not released the blocking locks, +-- let's do this here. +SELECT pg_advisory_unlock_all(); + +-- The second client and the client with the deadlock error stop here +SELECT pg_advisory_lock(0); +SELECT pg_advisory_lock(1); + +-- The second client and the client with the deadlock error always come after +-- the first and the number of rows in the table first_client_table reflects +-- this. Here the first client inserts a row, so in the future the table is +-- always non-empty. +DO $$ +DECLARE + exists boolean; +BEGIN + SELECT EXISTS (SELECT * FROM first_client_table) INTO STRICT exists; + IF exists THEN + -- We are the second client or the client with the deadlock error + + -- The first client will take care by itself of this lock (see below) + PERFORM pg_advisory_unlock(0); + + PERFORM pg_advisory_lock(3); + + -- The second client can get a deadlock here + PERFORM pg_advisory_lock(2); + ELSE + -- We are the first client + + -- This code should not be used in a new transaction after an error + INSERT INTO first_client_table VALUES (1); + + PERFORM pg_advisory_lock(2); + END IF; +END$$; + +DO $$ +DECLARE + num_rows integer; + waiters integer; +BEGIN + -- Check if we are the first client + SELECT COUNT(*) FROM first_client_table INTO STRICT num_rows; + IF num_rows = 1 THEN + -- This code should not be used in a new transaction after an error + INSERT INTO first_client_table VALUES (2); + + -- Let the second client begin + PERFORM pg_advisory_unlock(0); + PERFORM pg_advisory_unlock(1); + + -- Make sure the second client is ready for deadlock + LOOP + SELECT COUNT(*) INTO STRICT waiters FROM pg_locks WHERE + locktype = 'advisory' AND + objsubid = 1 AND + ((classid::bigint << 32) | objid::bigint = 2::bigint) AND + NOT granted; + + IF waiters = 1 THEN + -- Exit loop + EXIT; + END IF; + END LOOP; + + PERFORM pg_advisory_lock(0); + -- And the second client took care by itself of the lock 1 + END IF; +END$$; + +-- The first client can get a deadlock here +SELECT pg_advisory_lock(3); + +SELECT pg_advisory_unlock_all(); +} + }); + +# Clean up +$node->safe_psql('postgres', 'DROP TABLE first_client_table, xy;'); + + # done $node->safe_psql('postgres', 'DROP TABLESPACE regress_pgbench_tap_1_ts'); $node->stop; diff --git a/src/bin/pgbench/t/002_pgbench_no_server.pl b/src/bin/pgbench/t/002_pgbench_no_server.pl index acad19edd0..a5074c70d9 100644 --- a/src/bin/pgbench/t/002_pgbench_no_server.pl +++ b/src/bin/pgbench/t/002_pgbench_no_server.pl @@ -188,6 +188,16 @@ sub pgbench_scripts '-i --partition-method=hash', [qr{partition-method requires greater than zero --partitions}] ], + [ + 'bad maximum number of tries', + '--max-tries -10', + [qr{invalid number of maximum tries: "-10"}] + ], + [ + 'an infinite number of tries', + '--max-tries 0', + [qr{an unlimited number of transaction tries can only be used with --latency-limit or a duration}] + ], # logging sub-options [ diff --git a/src/fe_utils/conditional.c b/src/fe_utils/conditional.c index 0bf877e895..5a94664989 100644 --- a/src/fe_utils/conditional.c +++ b/src/fe_utils/conditional.c @@ -24,13 +24,25 @@ conditional_stack_create(void) } /* - * destroy stack + * Destroy all the elements from the stack. The stack itself is not freed. */ void -conditional_stack_destroy(ConditionalStack cstack) +conditional_stack_reset(ConditionalStack cstack) { + if (!cstack) + return; /* nothing to do here */ + while (conditional_stack_pop(cstack)) continue; +} + +/* + * destroy stack + */ +void +conditional_stack_destroy(ConditionalStack cstack) +{ + conditional_stack_reset(cstack); free(cstack); } diff --git a/src/include/fe_utils/conditional.h b/src/include/fe_utils/conditional.h index b28189471c..fa53d86501 100644 --- a/src/include/fe_utils/conditional.h +++ b/src/include/fe_utils/conditional.h @@ -73,6 +73,8 @@ typedef struct ConditionalStackData *ConditionalStack; extern ConditionalStack conditional_stack_create(void); +extern void conditional_stack_reset(ConditionalStack cstack); + extern void conditional_stack_destroy(ConditionalStack cstack); extern int conditional_stack_depth(ConditionalStack cstack); From ffd53659c46a54a6978bcb8c4424c1e157a2c0f1 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 23 Mar 2022 09:19:14 -0400 Subject: [PATCH 217/772] Replace BASE_BACKUP COMPRESSION_LEVEL option with COMPRESSION_DETAIL. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are more compression parameters that can be specified than just an integer compression level, so rename the new COMPRESSION_LEVEL option to COMPRESSION_DETAIL before it gets released. Introduce a flexible syntax for that option to allow arbitrary options to be specified without needing to adjust the main replication grammar, and common code to parse it that is shared between the client and the server. This commit doesn't actually add any new compression parameters, so the only user-visible change is that you can now type something like pg_basebackup --compress gzip:level=5 instead of writing just pg_basebackup --compress gzip:5. However, it should make it easy to add new options. If for example gzip starts offering fries, we can support pg_basebackup --compress gzip:level=5,fries=true for the benefit of users who want fries with that. Along the way, this fixes a few things in pg_basebackup so that the pg_basebackup can be used with a server-side compression algorithm that pg_basebackup itself does not understand. For example, pg_basebackup --compress server-lz4 could still succeed even if only the server and not the client has LZ4 support, provided that the other options to pg_basebackup don't require the client to decompress the archive. Patch by me. Reviewed by Justin Pryzby and Dagfinn Ilmari Mannsåker. Discussion: http://postgr.es/m/CA+TgmoYvpetyRAbbg1M8b3-iHsaN4nsgmWPjOENu5-doHuJ7fA@mail.gmail.com --- doc/src/sgml/protocol.sgml | 22 +- doc/src/sgml/ref/pg_basebackup.sgml | 25 +- src/backend/replication/basebackup.c | 62 +-- src/backend/replication/basebackup_gzip.c | 20 +- src/backend/replication/basebackup_lz4.c | 19 +- src/backend/replication/basebackup_zstd.c | 19 +- src/bin/pg_basebackup/bbstreamer.h | 7 +- src/bin/pg_basebackup/bbstreamer_gzip.c | 7 +- src/bin/pg_basebackup/bbstreamer_lz4.c | 4 +- src/bin/pg_basebackup/bbstreamer_zstd.c | 4 +- src/bin/pg_basebackup/pg_basebackup.c | 409 ++++++++----------- src/bin/pg_basebackup/t/010_pg_basebackup.pl | 72 +++- src/common/Makefile | 1 + src/common/backup_compression.c | 269 ++++++++++++ src/include/common/backup_compression.h | 44 ++ src/include/replication/basebackup_sink.h | 7 +- src/tools/msvc/Mkvcbuild.pm | 2 +- 17 files changed, 662 insertions(+), 331 deletions(-) create mode 100644 src/common/backup_compression.c create mode 100644 src/include/common/backup_compression.h diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 9178c779ba..719b947ef4 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -2731,14 +2731,24 @@ The commands accepted in replication mode are: - COMPRESSION_LEVEL level + COMPRESSION_DETAIL detail - Specifies the compression level to be used. This should only be - used in conjunction with the COMPRESSION option. - For gzip the value should be an integer between 1 - and 9, for lz4 between 1 and 12, and for - zstd it should be between 1 and 22. + Specifies details for the chosen compression method. This should only + be used in conjunction with the COMPRESSION + option. If the value is an integer, it specifies the compression + level. Otherwise, it should be a comma-separated list of items, + each of the form keyword or + keyword=value. Currently, the only supported + keyword is level, which sets the compression + level. + + + + For gzip the compression level should be an + integer between 1 and 9, for lz4 an integer + between 1 and 12, and for zstd an integer + between 1 and 22. diff --git a/doc/src/sgml/ref/pg_basebackup.sgml b/doc/src/sgml/ref/pg_basebackup.sgml index 4a630b59b7..d9233beb8e 100644 --- a/doc/src/sgml/ref/pg_basebackup.sgml +++ b/doc/src/sgml/ref/pg_basebackup.sgml @@ -399,9 +399,9 @@ PostgreSQL documentation - [:level] + - [:level] + Requests compression of the backup. If client or @@ -419,13 +419,20 @@ PostgreSQL documentation The compression method can be set to gzip, lz4, zstd, or - none for no compression. A compression level can - optionally be specified, by appending the level number after a colon - (:). If no level is specified, the default - compression level will be used. If only a level is specified without - mentioning an algorithm, gzip compression will be - used if the level is greater than 0, and no compression will be used if - the level is 0. + none for no compression. A compression detail + string can optionally be specified. If the detail string is an + integer, it specifies the compression level. Otherwise, it should be + a comma-separated list of items, each of the form + keyword or keyword=value. + Currently, the only supported keyword is level, + which sets the compression level. + + + If no compression level is specified, the default compression level + will be used. If only a level is specified without mentioning an + algorithm, gzip compression will be used if the + level is greater than 0, and no compression will be used if the level + is 0. When the tar format is used with gzip, diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index c2aedc14a2..6884cad2c0 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -17,6 +17,7 @@ #include #include "access/xlog_internal.h" /* for pg_start/stop_backup */ +#include "common/backup_compression.h" #include "common/file_perm.h" #include "commands/defrem.h" #include "lib/stringinfo.h" @@ -54,14 +55,6 @@ */ #define SINK_BUFFER_LENGTH Max(32768, BLCKSZ) -typedef enum -{ - BACKUP_COMPRESSION_NONE, - BACKUP_COMPRESSION_GZIP, - BACKUP_COMPRESSION_LZ4, - BACKUP_COMPRESSION_ZSTD -} basebackup_compression_type; - typedef struct { const char *label; @@ -75,8 +68,8 @@ typedef struct bool use_copytblspc; BaseBackupTargetHandle *target_handle; backup_manifest_option manifest; - basebackup_compression_type compression; - int compression_level; + bc_algorithm compression; + bc_specification compression_specification; pg_checksum_type manifest_checksum_type; } basebackup_options; @@ -713,12 +706,14 @@ parse_basebackup_options(List *options, basebackup_options *opt) char *target_str = NULL; char *target_detail_str = NULL; bool o_compression = false; - bool o_compression_level = false; + bool o_compression_detail = false; + char *compression_detail_str = NULL; MemSet(opt, 0, sizeof(*opt)); opt->manifest = MANIFEST_OPTION_NO; opt->manifest_checksum_type = CHECKSUM_TYPE_CRC32C; opt->compression = BACKUP_COMPRESSION_NONE; + opt->compression_specification.algorithm = BACKUP_COMPRESSION_NONE; foreach(lopt, options) { @@ -885,29 +880,21 @@ parse_basebackup_options(List *options, basebackup_options *opt) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("duplicate option \"%s\"", defel->defname))); - if (strcmp(optval, "none") == 0) - opt->compression = BACKUP_COMPRESSION_NONE; - else if (strcmp(optval, "gzip") == 0) - opt->compression = BACKUP_COMPRESSION_GZIP; - else if (strcmp(optval, "lz4") == 0) - opt->compression = BACKUP_COMPRESSION_LZ4; - else if (strcmp(optval, "zstd") == 0) - opt->compression = BACKUP_COMPRESSION_ZSTD; - else + if (!parse_bc_algorithm(optval, &opt->compression)) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("unrecognized compression algorithm: \"%s\"", + errmsg("unrecognized compression algorithm \"%s\"", optval))); o_compression = true; } - else if (strcmp(defel->defname, "compression_level") == 0) + else if (strcmp(defel->defname, "compression_detail") == 0) { - if (o_compression_level) + if (o_compression_detail) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("duplicate option \"%s\"", defel->defname))); - opt->compression_level = defGetInt32(defel); - o_compression_level = true; + compression_detail_str = defGetString(defel); + o_compression_detail = true; } else ereport(ERROR, @@ -949,10 +936,25 @@ parse_basebackup_options(List *options, basebackup_options *opt) opt->target_handle = BaseBackupGetTargetHandle(target_str, target_detail_str); - if (o_compression_level && !o_compression) + if (o_compression_detail && !o_compression) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("compression level requires compression"))); + errmsg("compression detail requires compression"))); + + if (o_compression) + { + char *error_detail; + + parse_bc_specification(opt->compression, compression_detail_str, + &opt->compression_specification); + error_detail = + validate_bc_specification(&opt->compression_specification); + if (error_detail != NULL) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid compression specification: %s", + error_detail)); + } } @@ -998,11 +1000,11 @@ SendBaseBackup(BaseBackupCmd *cmd) /* Set up server-side compression, if client requested it */ if (opt.compression == BACKUP_COMPRESSION_GZIP) - sink = bbsink_gzip_new(sink, opt.compression_level); + sink = bbsink_gzip_new(sink, &opt.compression_specification); else if (opt.compression == BACKUP_COMPRESSION_LZ4) - sink = bbsink_lz4_new(sink, opt.compression_level); + sink = bbsink_lz4_new(sink, &opt.compression_specification); else if (opt.compression == BACKUP_COMPRESSION_ZSTD) - sink = bbsink_zstd_new(sink, opt.compression_level); + sink = bbsink_zstd_new(sink, &opt.compression_specification); /* Set up progress reporting. */ sink = bbsink_progress_new(sink, opt.progress); diff --git a/src/backend/replication/basebackup_gzip.c b/src/backend/replication/basebackup_gzip.c index b66d3da7a3..703a91ba77 100644 --- a/src/backend/replication/basebackup_gzip.c +++ b/src/backend/replication/basebackup_gzip.c @@ -56,12 +56,13 @@ const bbsink_ops bbsink_gzip_ops = { #endif /* - * Create a new basebackup sink that performs gzip compression using the - * designated compression level. + * Create a new basebackup sink that performs gzip compression. */ bbsink * -bbsink_gzip_new(bbsink *next, int compresslevel) +bbsink_gzip_new(bbsink *next, bc_specification *compress) { + int compresslevel; + #ifndef HAVE_LIBZ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -71,15 +72,14 @@ bbsink_gzip_new(bbsink *next, int compresslevel) bbsink_gzip *sink; Assert(next != NULL); - Assert(compresslevel >= 0 && compresslevel <= 9); - if (compresslevel == 0) + if ((compress->options & BACKUP_COMPRESSION_OPTION_LEVEL) == 0) compresslevel = Z_DEFAULT_COMPRESSION; - else if (compresslevel < 0 || compresslevel > 9) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("gzip compression level %d is out of range", - compresslevel))); + else + { + compresslevel = compress->level; + Assert(compresslevel >= 1 && compresslevel <= 9); + } sink = palloc0(sizeof(bbsink_gzip)); *((const bbsink_ops **) &sink->base.bbs_ops) = &bbsink_gzip_ops; diff --git a/src/backend/replication/basebackup_lz4.c b/src/backend/replication/basebackup_lz4.c index d838f723d0..06c161ddc4 100644 --- a/src/backend/replication/basebackup_lz4.c +++ b/src/backend/replication/basebackup_lz4.c @@ -56,12 +56,13 @@ const bbsink_ops bbsink_lz4_ops = { #endif /* - * Create a new basebackup sink that performs lz4 compression using the - * designated compression level. + * Create a new basebackup sink that performs lz4 compression. */ bbsink * -bbsink_lz4_new(bbsink *next, int compresslevel) +bbsink_lz4_new(bbsink *next, bc_specification *compress) { + int compresslevel; + #ifndef USE_LZ4 ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -72,11 +73,13 @@ bbsink_lz4_new(bbsink *next, int compresslevel) Assert(next != NULL); - if (compresslevel < 0 || compresslevel > 12) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("lz4 compression level %d is out of range", - compresslevel))); + if ((compress->options & BACKUP_COMPRESSION_OPTION_LEVEL) == 0) + compresslevel = 0; + else + { + compresslevel = compress->level; + Assert(compresslevel >= 1 && compresslevel <= 12); + } sink = palloc0(sizeof(bbsink_lz4)); *((const bbsink_ops **) &sink->base.bbs_ops) = &bbsink_lz4_ops; diff --git a/src/backend/replication/basebackup_zstd.c b/src/backend/replication/basebackup_zstd.c index c0e2be6e27..96b7985693 100644 --- a/src/backend/replication/basebackup_zstd.c +++ b/src/backend/replication/basebackup_zstd.c @@ -55,12 +55,13 @@ const bbsink_ops bbsink_zstd_ops = { #endif /* - * Create a new basebackup sink that performs zstd compression using the - * designated compression level. + * Create a new basebackup sink that performs zstd compression. */ bbsink * -bbsink_zstd_new(bbsink *next, int compresslevel) +bbsink_zstd_new(bbsink *next, bc_specification *compress) { + int compresslevel; + #ifndef USE_ZSTD ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -71,11 +72,13 @@ bbsink_zstd_new(bbsink *next, int compresslevel) Assert(next != NULL); - if (compresslevel < 0 || compresslevel > 22) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("zstd compression level %d is out of range", - compresslevel))); + if ((compress->options & BACKUP_COMPRESSION_OPTION_LEVEL) == 0) + compresslevel = 0; + else + { + compresslevel = compress->level; + Assert(compresslevel >= 1 && compresslevel <= 22); + } sink = palloc0(sizeof(bbsink_zstd)); *((const bbsink_ops **) &sink->base.bbs_ops) = &bbsink_zstd_ops; diff --git a/src/bin/pg_basebackup/bbstreamer.h b/src/bin/pg_basebackup/bbstreamer.h index 02d4c05df6..dfa3f77af4 100644 --- a/src/bin/pg_basebackup/bbstreamer.h +++ b/src/bin/pg_basebackup/bbstreamer.h @@ -22,6 +22,7 @@ #ifndef BBSTREAMER_H #define BBSTREAMER_H +#include "common/backup_compression.h" #include "lib/stringinfo.h" #include "pqexpbuffer.h" @@ -200,17 +201,17 @@ bbstreamer_buffer_until(bbstreamer *streamer, const char **data, int *len, */ extern bbstreamer *bbstreamer_plain_writer_new(char *pathname, FILE *file); extern bbstreamer *bbstreamer_gzip_writer_new(char *pathname, FILE *file, - int compresslevel); + bc_specification *compress); extern bbstreamer *bbstreamer_extractor_new(const char *basepath, const char *(*link_map) (const char *), void (*report_output_file) (const char *)); extern bbstreamer *bbstreamer_gzip_decompressor_new(bbstreamer *next); extern bbstreamer *bbstreamer_lz4_compressor_new(bbstreamer *next, - int compresslevel); + bc_specification *compress); extern bbstreamer *bbstreamer_lz4_decompressor_new(bbstreamer *next); extern bbstreamer *bbstreamer_zstd_compressor_new(bbstreamer *next, - int compresslevel); + bc_specification *compress); extern bbstreamer *bbstreamer_zstd_decompressor_new(bbstreamer *next); extern bbstreamer *bbstreamer_tar_parser_new(bbstreamer *next); extern bbstreamer *bbstreamer_tar_terminator_new(bbstreamer *next); diff --git a/src/bin/pg_basebackup/bbstreamer_gzip.c b/src/bin/pg_basebackup/bbstreamer_gzip.c index 894f857103..1979e95639 100644 --- a/src/bin/pg_basebackup/bbstreamer_gzip.c +++ b/src/bin/pg_basebackup/bbstreamer_gzip.c @@ -76,7 +76,8 @@ const bbstreamer_ops bbstreamer_gzip_decompressor_ops = { * closed so that the data may be written there. */ bbstreamer * -bbstreamer_gzip_writer_new(char *pathname, FILE *file, int compresslevel) +bbstreamer_gzip_writer_new(char *pathname, FILE *file, + bc_specification *compress) { #ifdef HAVE_LIBZ bbstreamer_gzip_writer *streamer; @@ -115,11 +116,11 @@ bbstreamer_gzip_writer_new(char *pathname, FILE *file, int compresslevel) } } - if (gzsetparams(streamer->gzfile, compresslevel, + if (gzsetparams(streamer->gzfile, compress->level, Z_DEFAULT_STRATEGY) != Z_OK) { pg_log_error("could not set compression level %d: %s", - compresslevel, get_gz_error(streamer->gzfile)); + compress->level, get_gz_error(streamer->gzfile)); exit(1); } diff --git a/src/bin/pg_basebackup/bbstreamer_lz4.c b/src/bin/pg_basebackup/bbstreamer_lz4.c index 810052e4e3..a6ec317e2b 100644 --- a/src/bin/pg_basebackup/bbstreamer_lz4.c +++ b/src/bin/pg_basebackup/bbstreamer_lz4.c @@ -67,7 +67,7 @@ const bbstreamer_ops bbstreamer_lz4_decompressor_ops = { * blocks. */ bbstreamer * -bbstreamer_lz4_compressor_new(bbstreamer *next, int compresslevel) +bbstreamer_lz4_compressor_new(bbstreamer *next, bc_specification *compress) { #ifdef USE_LZ4 bbstreamer_lz4_frame *streamer; @@ -89,7 +89,7 @@ bbstreamer_lz4_compressor_new(bbstreamer *next, int compresslevel) prefs = &streamer->prefs; memset(prefs, 0, sizeof(LZ4F_preferences_t)); prefs->frameInfo.blockSizeID = LZ4F_max256KB; - prefs->compressionLevel = compresslevel; + prefs->compressionLevel = compress->level; /* * Find out the compression bound, it specifies the minimum destination diff --git a/src/bin/pg_basebackup/bbstreamer_zstd.c b/src/bin/pg_basebackup/bbstreamer_zstd.c index e86749a8fb..caa5edcaf1 100644 --- a/src/bin/pg_basebackup/bbstreamer_zstd.c +++ b/src/bin/pg_basebackup/bbstreamer_zstd.c @@ -63,7 +63,7 @@ const bbstreamer_ops bbstreamer_zstd_decompressor_ops = { * blocks. */ bbstreamer * -bbstreamer_zstd_compressor_new(bbstreamer *next, int compresslevel) +bbstreamer_zstd_compressor_new(bbstreamer *next, bc_specification *compress) { #ifdef USE_ZSTD bbstreamer_zstd_frame *streamer; @@ -85,7 +85,7 @@ bbstreamer_zstd_compressor_new(bbstreamer *next, int compresslevel) /* Initialize stream compression preferences */ ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_compressionLevel, - compresslevel); + compress->level); /* Initialize the ZSTD output buffer. */ streamer->zstd_outBuf.dst = streamer->base.bbs_buffer.data; diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index 2943d9ec1a..3e6977df1a 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -29,6 +29,7 @@ #include "access/xlog_internal.h" #include "bbstreamer.h" +#include "common/backup_compression.h" #include "common/file_perm.h" #include "common/file_utils.h" #include "common/logging.h" @@ -57,6 +58,7 @@ typedef struct TablespaceList typedef struct ArchiveStreamState { int tablespacenum; + bc_specification *compress; bbstreamer *streamer; bbstreamer *manifest_inject_streamer; PQExpBuffer manifest_buffer; @@ -132,9 +134,6 @@ static bool checksum_failure = false; static bool showprogress = false; static bool estimatesize = true; static int verbose = 0; -static int compresslevel = 0; -static WalCompressionMethod compressmethod = COMPRESSION_NONE; -static CompressionLocation compressloc = COMPRESS_LOCATION_UNSPECIFIED; static IncludeWal includewal = STREAM_WAL; static bool fastcheckpoint = false; static bool writerecoveryconf = false; @@ -198,7 +197,8 @@ static void progress_report(int tablespacenum, bool force, bool finished); static bbstreamer *CreateBackupStreamer(char *archive_name, char *spclocation, bbstreamer **manifest_inject_streamer_p, bool is_recovery_guc_supported, - bool expect_unterminated_tarfile); + bool expect_unterminated_tarfile, + bc_specification *compress); static void ReceiveArchiveStreamChunk(size_t r, char *copybuf, void *callback_data); static char GetCopyDataByte(size_t r, char *copybuf, size_t *cursor); @@ -207,7 +207,7 @@ static uint64 GetCopyDataUInt64(size_t r, char *copybuf, size_t *cursor); static void GetCopyDataEnd(size_t r, char *copybuf, size_t cursor); static void ReportCopyDataParseError(size_t r, char *copybuf); static void ReceiveTarFile(PGconn *conn, char *archive_name, char *spclocation, - bool tablespacenum); + bool tablespacenum, bc_specification *compress); static void ReceiveTarCopyChunk(size_t r, char *copybuf, void *callback_data); static void ReceiveBackupManifest(PGconn *conn); static void ReceiveBackupManifestChunk(size_t r, char *copybuf, @@ -215,7 +215,9 @@ static void ReceiveBackupManifestChunk(size_t r, char *copybuf, static void ReceiveBackupManifestInMemory(PGconn *conn, PQExpBuffer buf); static void ReceiveBackupManifestInMemoryChunk(size_t r, char *copybuf, void *callback_data); -static void BaseBackup(void); +static void BaseBackup(char *compression_algorithm, char *compression_detail, + CompressionLocation compressloc, + bc_specification *client_compress); static bool reached_end_position(XLogRecPtr segendpos, uint32 timeline, bool segment_finished); @@ -405,8 +407,8 @@ usage(void) printf(_(" -X, --wal-method=none|fetch|stream\n" " include required WAL files with specified method\n")); printf(_(" -z, --gzip compress tar output\n")); - printf(_(" -Z, --compress=[{client|server}-]{gzip|lz4|zstd}[:LEVEL]\n" - " compress tar output with given compression method or level\n")); + printf(_(" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" + " compress on client or server as specified\n")); printf(_(" -Z, --compress=none do not compress tar output\n")); printf(_("\nGeneral options:\n")); printf(_(" -c, --checkpoint=fast|spread\n" @@ -542,7 +544,9 @@ typedef struct } logstreamer_param; static int -LogStreamerMain(logstreamer_param *param) +LogStreamerMain(logstreamer_param *param, + WalCompressionMethod wal_compress_method, + int wal_compress_level) { StreamCtl stream; @@ -565,25 +569,14 @@ LogStreamerMain(logstreamer_param *param) stream.mark_done = true; stream.partial_suffix = NULL; stream.replication_slot = replication_slot; - if (format == 'p') stream.walmethod = CreateWalDirectoryMethod(param->xlog, COMPRESSION_NONE, 0, stream.do_sync); - else if (compressloc != COMPRESS_LOCATION_CLIENT) - stream.walmethod = CreateWalTarMethod(param->xlog, - COMPRESSION_NONE, - compresslevel, - stream.do_sync); - else if (compressmethod == COMPRESSION_GZIP) - stream.walmethod = CreateWalTarMethod(param->xlog, - compressmethod, - compresslevel, - stream.do_sync); else stream.walmethod = CreateWalTarMethod(param->xlog, - COMPRESSION_NONE, - compresslevel, + wal_compress_method, + wal_compress_level, stream.do_sync); if (!ReceiveXlogStream(param->bgconn, &stream)) @@ -629,7 +622,9 @@ LogStreamerMain(logstreamer_param *param) * stream the logfile in parallel with the backups. */ static void -StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier) +StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier, + WalCompressionMethod wal_compress_method, + int wal_compress_level) { logstreamer_param *param; uint32 hi, @@ -729,7 +724,7 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier) int ret; /* in child process */ - ret = LogStreamerMain(param); + ret = LogStreamerMain(param, wal_compress_method, wal_compress_level); /* temp debugging aid to analyze 019_replslot_limit failures */ if (verbose) @@ -1004,136 +999,81 @@ parse_max_rate(char *src) } /* - * Utility wrapper to parse the values specified for -Z/--compress. - * *methodres and *levelres will be optionally filled with values coming - * from the parsed results. + * Basic parsing of a value specified for -Z/--compress. + * + * We're not concerned here with understanding exactly what behavior the + * user wants, but we do need to know whether the user is requesting client + * or server side compression or leaving it unspecified, and we need to + * separate the name of the compression algorithm from the detail string. + * + * For instance, if the user writes --compress client-lz4:6, we want to + * separate that into (a) client-side compression, (b) algorithm "lz4", + * and (c) detail "6". Note, however, that all the client/server prefix is + * optional, and so is the detail. The algorithm name is required, unless + * the whole string is an integer, in which case we assume "gzip" as the + * algorithm and use the integer as the detail. + * + * We're not concerned with validation at this stage, so if the user writes + * --compress client-turkey:sandwich, the requested algorithm is "turkey" + * and the detail string is "sandwich". We'll sort out whether that's legal + * at a later stage. */ static void -parse_compress_options(char *src, WalCompressionMethod *methodres, - CompressionLocation *locationres, int *levelres) +parse_compress_options(char *option, char **algorithm, char **detail, + CompressionLocation *locationres) { char *sep; - int firstlen; - char *firstpart; + char *endp; /* - * clear 'levelres' so that if there are multiple compression options, - * the last one fully overrides the earlier ones - */ - *levelres = 0; - - /* check if the option is split in two */ - sep = strchr(src, ':'); - - /* - * The first part of the option value could be a method name, or just a - * level value. - */ - firstlen = (sep != NULL) ? (sep - src) : strlen(src); - firstpart = pg_malloc(firstlen + 1); - memcpy(firstpart, src, firstlen); - firstpart[firstlen] = '\0'; - - /* - * Check if the first part of the string matches with a supported - * compression method. + * Check whether the compression specification consists of a bare integer. + * + * If so, for backward compatibility, assume gzip. */ - if (pg_strcasecmp(firstpart, "gzip") == 0) + (void) strtol(option, &endp, 10); + if (*endp == '\0') { - *methodres = COMPRESSION_GZIP; *locationres = COMPRESS_LOCATION_UNSPECIFIED; + *algorithm = pstrdup("gzip"); + *detail = pstrdup(option); + return; } - else if (pg_strcasecmp(firstpart, "client-gzip") == 0) - { - *methodres = COMPRESSION_GZIP; - *locationres = COMPRESS_LOCATION_CLIENT; - } - else if (pg_strcasecmp(firstpart, "server-gzip") == 0) + + /* Strip off any "client-" or "server-" prefix. */ + if (strncmp(option, "server-", 7) == 0) { - *methodres = COMPRESSION_GZIP; *locationres = COMPRESS_LOCATION_SERVER; + option += 7; } - else if (pg_strcasecmp(firstpart, "lz4") == 0) - { - *methodres = COMPRESSION_LZ4; - *locationres = COMPRESS_LOCATION_UNSPECIFIED; - } - else if (pg_strcasecmp(firstpart, "client-lz4") == 0) + else if (strncmp(option, "client-", 7) == 0) { - *methodres = COMPRESSION_LZ4; *locationres = COMPRESS_LOCATION_CLIENT; - } - else if (pg_strcasecmp(firstpart, "server-lz4") == 0) - { - *methodres = COMPRESSION_LZ4; - *locationres = COMPRESS_LOCATION_SERVER; - } - else if (pg_strcasecmp(firstpart, "zstd") == 0) - { - *methodres = COMPRESSION_ZSTD; - *locationres = COMPRESS_LOCATION_UNSPECIFIED; - } - else if (pg_strcasecmp(firstpart, "client-zstd") == 0) - { - *methodres = COMPRESSION_ZSTD; - *locationres = COMPRESS_LOCATION_CLIENT; - } - else if (pg_strcasecmp(firstpart, "server-zstd") == 0) - { - *methodres = COMPRESSION_ZSTD; - *locationres = COMPRESS_LOCATION_SERVER; - } - else if (pg_strcasecmp(firstpart, "none") == 0) - { - *methodres = COMPRESSION_NONE; - *locationres = COMPRESS_LOCATION_UNSPECIFIED; + option += 7; } else - { - /* - * It does not match anything known, so check for the - * backward-compatible case of only an integer where the implied - * compression method changes depending on the level value. - */ - if (!option_parse_int(firstpart, "-Z/--compress", 0, - INT_MAX, levelres)) - exit(1); - - *methodres = (*levelres > 0) ? - COMPRESSION_GZIP : COMPRESSION_NONE; *locationres = COMPRESS_LOCATION_UNSPECIFIED; - free(firstpart); - return; - } - + /* + * Check whether there is a compression detail following the algorithm + * name. + */ + sep = strchr(option, ':'); if (sep == NULL) { - /* - * The caller specified a method without a colon separator, so let any - * subsequent checks assign a default level. - */ - free(firstpart); - return; + *algorithm = pstrdup(option); + *detail = NULL; } - - /* Check the contents after the colon separator. */ - sep++; - if (*sep == '\0') + else { - pg_log_error("no compression level defined for method %s", firstpart); - exit(1); - } + char *alg; - /* - * For any of the methods currently supported, the data after the - * separator can just be an integer. - */ - if (!option_parse_int(sep, "-Z/--compress", 0, INT_MAX, - levelres)) - exit(1); + alg = palloc((sep - option) + 1); + memcpy(alg, option, sep - option); + alg[sep - option] = '\0'; - free(firstpart); + *algorithm = alg; + *detail = pstrdup(sep + 1); + } } /* @@ -1200,7 +1140,8 @@ static bbstreamer * CreateBackupStreamer(char *archive_name, char *spclocation, bbstreamer **manifest_inject_streamer_p, bool is_recovery_guc_supported, - bool expect_unterminated_tarfile) + bool expect_unterminated_tarfile, + bc_specification *compress) { bbstreamer *streamer = NULL; bbstreamer *manifest_inject_streamer = NULL; @@ -1316,32 +1257,28 @@ CreateBackupStreamer(char *archive_name, char *spclocation, archive_file = NULL; } - if (compressmethod == COMPRESSION_NONE || - compressloc != COMPRESS_LOCATION_CLIENT) + if (compress->algorithm == BACKUP_COMPRESSION_NONE) streamer = bbstreamer_plain_writer_new(archive_filename, archive_file); - else if (compressmethod == COMPRESSION_GZIP) + else if (compress->algorithm == BACKUP_COMPRESSION_GZIP) { strlcat(archive_filename, ".gz", sizeof(archive_filename)); streamer = bbstreamer_gzip_writer_new(archive_filename, - archive_file, - compresslevel); + archive_file, compress); } - else if (compressmethod == COMPRESSION_LZ4) + else if (compress->algorithm == BACKUP_COMPRESSION_LZ4) { strlcat(archive_filename, ".lz4", sizeof(archive_filename)); streamer = bbstreamer_plain_writer_new(archive_filename, archive_file); - streamer = bbstreamer_lz4_compressor_new(streamer, - compresslevel); + streamer = bbstreamer_lz4_compressor_new(streamer, compress); } - else if (compressmethod == COMPRESSION_ZSTD) + else if (compress->algorithm == BACKUP_COMPRESSION_ZSTD) { strlcat(archive_filename, ".zst", sizeof(archive_filename)); streamer = bbstreamer_plain_writer_new(archive_filename, archive_file); - streamer = bbstreamer_zstd_compressor_new(streamer, - compresslevel); + streamer = bbstreamer_zstd_compressor_new(streamer, compress); } else { @@ -1395,13 +1332,13 @@ CreateBackupStreamer(char *archive_name, char *spclocation, * If the user has requested a server compressed archive along with archive * extraction at client then we need to decompress it. */ - if (format == 'p' && compressloc == COMPRESS_LOCATION_SERVER) + if (format == 'p') { - if (compressmethod == COMPRESSION_GZIP) + if (is_tar_gz) streamer = bbstreamer_gzip_decompressor_new(streamer); - else if (compressmethod == COMPRESSION_LZ4) + else if (is_tar_lz4) streamer = bbstreamer_lz4_decompressor_new(streamer); - else if (compressmethod == COMPRESSION_ZSTD) + else if (is_tar_zstd) streamer = bbstreamer_zstd_decompressor_new(streamer); } @@ -1415,13 +1352,14 @@ CreateBackupStreamer(char *archive_name, char *spclocation, * manifest if present - as a single COPY stream. */ static void -ReceiveArchiveStream(PGconn *conn) +ReceiveArchiveStream(PGconn *conn, bc_specification *compress) { ArchiveStreamState state; /* Set up initial state. */ memset(&state, 0, sizeof(state)); state.tablespacenum = -1; + state.compress = compress; /* All the real work happens in ReceiveArchiveStreamChunk. */ ReceiveCopyData(conn, ReceiveArchiveStreamChunk, &state); @@ -1542,7 +1480,8 @@ ReceiveArchiveStreamChunk(size_t r, char *copybuf, void *callback_data) CreateBackupStreamer(archive_name, spclocation, &state->manifest_inject_streamer, - true, false); + true, false, + state->compress); } break; } @@ -1743,7 +1682,7 @@ ReportCopyDataParseError(size_t r, char *copybuf) */ static void ReceiveTarFile(PGconn *conn, char *archive_name, char *spclocation, - bool tablespacenum) + bool tablespacenum, bc_specification *compress) { WriteTarState state; bbstreamer *manifest_inject_streamer; @@ -1759,7 +1698,8 @@ ReceiveTarFile(PGconn *conn, char *archive_name, char *spclocation, state.streamer = CreateBackupStreamer(archive_name, spclocation, &manifest_inject_streamer, is_recovery_guc_supported, - expect_unterminated_tarfile); + expect_unterminated_tarfile, + compress); state.tablespacenum = tablespacenum; ReceiveCopyData(conn, ReceiveTarCopyChunk, &state); progress_update_filename(NULL); @@ -1902,7 +1842,8 @@ ReceiveBackupManifestInMemoryChunk(size_t r, char *copybuf, } static void -BaseBackup(void) +BaseBackup(char *compression_algorithm, char *compression_detail, + CompressionLocation compressloc, bc_specification *client_compress) { PGresult *res; char *sysidentifier; @@ -2055,33 +1996,17 @@ BaseBackup(void) if (compressloc == COMPRESS_LOCATION_SERVER) { - char *compressmethodstr = NULL; - if (!use_new_option_syntax) { pg_log_error("server does not support server-side compression"); exit(1); } - switch (compressmethod) - { - case COMPRESSION_GZIP: - compressmethodstr = "gzip"; - break; - case COMPRESSION_LZ4: - compressmethodstr = "lz4"; - break; - case COMPRESSION_ZSTD: - compressmethodstr = "zstd"; - break; - default: - Assert(false); - break; - } AppendStringCommandOption(&buf, use_new_option_syntax, - "COMPRESSION", compressmethodstr); - if (compresslevel >= 1) /* not 0 or Z_DEFAULT_COMPRESSION */ - AppendIntegerCommandOption(&buf, use_new_option_syntax, - "COMPRESSION_LEVEL", compresslevel); + "COMPRESSION", compression_algorithm); + if (compression_detail != NULL) + AppendStringCommandOption(&buf, use_new_option_syntax, + "COMPRESSION_DETAIL", + compression_detail); } if (verbose) @@ -2207,15 +2132,33 @@ BaseBackup(void) */ if (includewal == STREAM_WAL) { + WalCompressionMethod wal_compress_method; + int wal_compress_level; + if (verbose) pg_log_info("starting background WAL receiver"); - StartLogStreamer(xlogstart, starttli, sysidentifier); + + if (client_compress->algorithm == BACKUP_COMPRESSION_GZIP) + { + wal_compress_method = COMPRESSION_GZIP; + wal_compress_level = + (client_compress->options & BACKUP_COMPRESSION_OPTION_LEVEL) + != 0 ? client_compress->level : 0; + } + else + { + wal_compress_method = COMPRESSION_NONE; + wal_compress_level = 0; + } + + StartLogStreamer(xlogstart, starttli, sysidentifier, + wal_compress_method, wal_compress_level); } if (serverMajor >= 1500) { /* Receive a single tar stream with everything. */ - ReceiveArchiveStream(conn); + ReceiveArchiveStream(conn, client_compress); } else { @@ -2244,7 +2187,8 @@ BaseBackup(void) spclocation = PQgetvalue(res, i, 1); } - ReceiveTarFile(conn, archive_name, spclocation, i); + ReceiveTarFile(conn, archive_name, spclocation, i, + client_compress); } /* @@ -2511,6 +2455,10 @@ main(int argc, char **argv) int c; int option_index; + char *compression_algorithm = "none"; + char *compression_detail = NULL; + CompressionLocation compressloc = COMPRESS_LOCATION_UNSPECIFIED; + bc_specification client_compress; pg_logging_init(argv[0]); progname = get_progname(argv[0]); @@ -2616,17 +2564,13 @@ main(int argc, char **argv) do_sync = false; break; case 'z': -#ifdef HAVE_LIBZ - compresslevel = Z_DEFAULT_COMPRESSION; -#else - compresslevel = 1; /* will be rejected below */ -#endif - compressmethod = COMPRESSION_GZIP; + compression_algorithm = "gzip"; + compression_detail = NULL; compressloc = COMPRESS_LOCATION_UNSPECIFIED; break; case 'Z': - parse_compress_options(optarg, &compressmethod, - &compressloc, &compresslevel); + parse_compress_options(optarg, &compression_algorithm, + &compression_detail, &compressloc); break; case 'c': if (pg_strcasecmp(optarg, "fast") == 0) @@ -2753,12 +2697,11 @@ main(int argc, char **argv) } /* - * If we're compressing the backup and the user has not said where to - * perform the compression, do it on the client, unless they specified - * --target, in which case the server is the only choice. + * If the user has not specified where to perform backup compression, + * default to the client, unless the user specified --target, in which case + * the server is the only choice. */ - if (compressmethod != COMPRESSION_NONE && - compressloc == COMPRESS_LOCATION_UNSPECIFIED) + if (compressloc == COMPRESS_LOCATION_UNSPECIFIED) { if (backup_target == NULL) compressloc = COMPRESS_LOCATION_CLIENT; @@ -2766,6 +2709,40 @@ main(int argc, char **argv) compressloc = COMPRESS_LOCATION_SERVER; } + /* + * If any compression that we're doing is happening on the client side, + * we must try to parse the compression algorithm and detail, but if it's + * all on the server side, then we're just going to pass through whatever + * was requested and let the server decide what to do. + */ + if (compressloc == COMPRESS_LOCATION_CLIENT) + { + bc_algorithm alg; + char *error_detail; + + if (!parse_bc_algorithm(compression_algorithm, &alg)) + { + pg_log_error("unrecognized compression algorithm \"%s\"", + compression_algorithm); + exit(1); + } + + parse_bc_specification(alg, compression_detail, &client_compress); + error_detail = validate_bc_specification(&client_compress); + if (error_detail != NULL) + { + pg_log_error("invalid compression specification: %s", + error_detail); + exit(1); + } + } + else + { + Assert(compressloc == COMPRESS_LOCATION_SERVER); + client_compress.algorithm = BACKUP_COMPRESSION_NONE; + client_compress.options = 0; + } + /* * Can't perform client-side compression if the backup is not being * sent to the client. @@ -2779,9 +2756,10 @@ main(int argc, char **argv) } /* - * Compression doesn't make sense unless tar format is in use. + * Client-side compression doesn't make sense unless tar format is in use. */ - if (format == 'p' && compressloc == COMPRESS_LOCATION_CLIENT) + if (format == 'p' && compressloc == COMPRESS_LOCATION_CLIENT && + client_compress.algorithm != BACKUP_COMPRESSION_NONE) { pg_log_error("only tar mode backups can be compressed"); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), @@ -2882,56 +2860,6 @@ main(int argc, char **argv) } } - /* Sanity checks for compression-related options. */ - switch (compressmethod) - { - case COMPRESSION_NONE: - if (compresslevel != 0) - { - pg_log_error("cannot use compression level with method %s", - "none"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); - exit(1); - } - break; - case COMPRESSION_GZIP: - if (compresslevel > 9) - { - pg_log_error("compression level %d of method %s higher than maximum of 9", - compresslevel, "gzip"); - exit(1); - } - if (compressloc == COMPRESS_LOCATION_CLIENT) - { -#ifdef HAVE_LIBZ - if (compresslevel == 0) - compresslevel = Z_DEFAULT_COMPRESSION; -#else - pg_log_error("this build does not support compression with %s", - "gzip"); - exit(1); -#endif - } - break; - case COMPRESSION_LZ4: - if (compresslevel > 12) - { - pg_log_error("compression level %d of method %s higher than maximum of 12", - compresslevel, "lz4"); - exit(1); - } - break; - case COMPRESSION_ZSTD: - if (compresslevel > 22) - { - pg_log_error("compression level %d of method %s higher than maximum of 22", - compresslevel, "zstd"); - exit(1); - } - break; - } - /* * Sanity checks for progress reporting options. */ @@ -3040,7 +2968,8 @@ main(int argc, char **argv) free(linkloc); } - BaseBackup(); + BaseBackup(compression_algorithm, compression_detail, compressloc, + &client_compress); success = true; return 0; diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index efefe947d9..2869a239e7 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -42,16 +42,12 @@ # Sanity checks for options $node->command_fails_like( [ 'pg_basebackup', '-D', "$tempdir/backup", '--compress', 'none:1' ], - qr/\Qpg_basebackup: error: cannot use compression level with method none/, + qr/\Qcompression algorithm "none" does not accept a compression level/, 'failure if method "none" specified with compression level'); $node->command_fails_like( [ 'pg_basebackup', '-D', "$tempdir/backup", '--compress', 'none+' ], - qr/\Qpg_basebackup: error: invalid value "none+" for option/, + qr/\Qunrecognized compression algorithm "none+"/, 'failure on incorrect separator to define compression level'); -$node->command_fails_like( - [ 'pg_basebackup', '-D', "$tempdir/backup", '--compress', 'none:' ], - qr/\Qpg_basebackup: error: no compression level defined for method none/, - 'failure on missing compression level value'); # Some Windows ANSI code pages may reject this filename, in which case we # quietly proceed without this bit of test coverage. @@ -89,6 +85,70 @@ close $conf; $node->restart; +# Now that we have a server that supports replication commands, test whether +# certain invalid compression commands fail on the client side with client-side +# compression and on the server side with server-side compression. +my $client_fails = + 'pg_basebackup: error: '; +my $server_fails = + 'pg_basebackup: error: could not initiate base backup: ERROR: '; +my @compression_failure_tests = ( + [ + 'extrasquishy', + 'unrecognized compression algorithm "extrasquishy"', + 'failure on invalid compression algorithm' + ], + [ + 'gzip:', + 'invalid compression specification: found empty string where a compression option was expected', + 'failure on empty compression options list' + ], + [ + 'gzip:thunk', + 'invalid compression specification: unknown compression option "thunk"', + 'failure on unknown compression option' + ], + [ + 'gzip:level', + 'invalid compression specification: compression option "level" requires a value', + 'failure on missing compression level' + ], + [ + 'gzip:level=', + 'invalid compression specification: value for compression option "level" must be an integer', + 'failure on empty compression level' + ], + [ + 'gzip:level=high', + 'invalid compression specification: value for compression option "level" must be an integer', + 'failure on non-numeric compression level' + ], + [ + 'gzip:level=236', + 'invalid compression specification: compression algorithm "gzip" expects a compression level between 1 and 9', + 'failure on out-of-range compression level' + ], + [ + 'gzip:level=9,', + 'invalid compression specification: found empty string where a compression option was expected', + 'failure on extra, empty compression option' + ], +); +for my $cft (@compression_failure_tests) +{ + my $cfail = quotemeta($client_fails . $cft->[1]); + my $sfail = quotemeta($server_fails . $cft->[1]); + $node->command_fails_like( + [ 'pg_basebackup', '-D', "$tempdir/backup", '--compress', $cft->[0] ], + qr/$cfail/, + 'client '. $cft->[2]); + $node->command_fails_like( + [ 'pg_basebackup', '-D', "$tempdir/backup", '--compress', + 'server-' . $cft->[0] ], + qr/$sfail/, + 'server ' . $cft->[2]); +} + # Write some files to test that they are not copied. foreach my $filename ( qw(backup_label tablespace_map postgresql.auto.conf.tmp diff --git a/src/common/Makefile b/src/common/Makefile index 31c0dd366d..f627349835 100644 --- a/src/common/Makefile +++ b/src/common/Makefile @@ -47,6 +47,7 @@ LIBS += $(PTHREAD_LIBS) OBJS_COMMON = \ archive.o \ + backup_compression.o \ base64.o \ checksum_helper.o \ config_info.o \ diff --git a/src/common/backup_compression.c b/src/common/backup_compression.c new file mode 100644 index 0000000000..591b97a60c --- /dev/null +++ b/src/common/backup_compression.c @@ -0,0 +1,269 @@ +/*------------------------------------------------------------------------- + * + * backup_compression.c + * + * Shared code for backup compression methods and specifications. + * + * A compression specification specifies the parameters that should be used + * when performing compression with a specific algorithm. The simplest + * possible compression specification is an integer, which sets the + * compression level. + * + * Otherwise, a compression specification is a comma-separated list of items, + * each having the form keyword or keyword=value. + * + * Currently, the only supported keyword is "level". + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/common/backup_compression.c + *------------------------------------------------------------------------- + */ + +#ifndef FRONTEND +#include "postgres.h" +#else +#include "postgres_fe.h" +#endif + +#include "common/backup_compression.h" + +static int expect_integer_value(char *keyword, char *value, + bc_specification *result); + +/* + * Look up a compression algorithm by name. Returns true and sets *algorithm + * if the name is recognized. Otherwise returns false. + */ +bool +parse_bc_algorithm(char *name, bc_algorithm *algorithm) +{ + if (strcmp(name, "none") == 0) + *algorithm = BACKUP_COMPRESSION_NONE; + else if (strcmp(name, "gzip") == 0) + *algorithm = BACKUP_COMPRESSION_GZIP; + else if (strcmp(name, "lz4") == 0) + *algorithm = BACKUP_COMPRESSION_LZ4; + else if (strcmp(name, "zstd") == 0) + *algorithm = BACKUP_COMPRESSION_ZSTD; + else + return false; + return true; +} + +/* + * Get the human-readable name corresponding to a particular compression + * algorithm. + */ +const char * +get_bc_algorithm_name(bc_algorithm algorithm) +{ + switch (algorithm) + { + case BACKUP_COMPRESSION_NONE: + return "none"; + case BACKUP_COMPRESSION_GZIP: + return "gzip"; + case BACKUP_COMPRESSION_LZ4: + return "lz4"; + case BACKUP_COMPRESSION_ZSTD: + return "zstd"; + /* no default, to provoke compiler warnings if values are added */ + } + Assert(false); +} + +/* + * Parse a compression specification for a specified algorithm. + * + * See the file header comments for a brief description of what a compression + * specification is expected to look like. + * + * On return, all fields of the result object will be initialized. + * In particular, result->parse_error will be NULL if no errors occurred + * during parsing, and will otherwise contain an appropriate error message. + * The caller may free this error message string using pfree, if desired. + * Note, however, even if there's no parse error, the string might not make + * sense: e.g. for gzip, level=12 is not sensible, but it does parse OK. + * + * Use validate_bc_specification() to find out whether a compression + * specification is semantically sensible. + */ +void +parse_bc_specification(bc_algorithm algorithm, char *specification, + bc_specification *result) +{ + int bare_level; + char *bare_level_endp; + + /* Initial setup of result object. */ + result->algorithm = algorithm; + result->options = 0; + result->level = -1; + result->parse_error = NULL; + + /* If there is no specification, we're done already. */ + if (specification == NULL) + return; + + /* As a special case, the specification can be a bare integer. */ + bare_level = strtol(specification, &bare_level_endp, 10); + if (specification != bare_level_endp && *bare_level_endp == '\0') + { + result->level = bare_level; + result->options |= BACKUP_COMPRESSION_OPTION_LEVEL; + return; + } + + /* Look for comma-separated keyword or keyword=value entries. */ + while (1) + { + char *kwstart; + char *kwend; + char *vstart; + char *vend; + int kwlen; + int vlen; + bool has_value; + char *keyword; + char *value; + + /* Figure start, end, and length of next keyword and any value. */ + kwstart = kwend = specification; + while (*kwend != '\0' && *kwend != ',' && *kwend != '=') + ++kwend; + kwlen = kwend - kwstart; + if (*kwend != '=') + { + vstart = vend = NULL; + vlen = 0; + has_value = false; + } + else + { + vstart = vend = kwend + 1; + while (*vend != '\0' && *vend != ',') + ++vend; + vlen = vend - vstart; + has_value = true; + } + + /* Reject empty keyword. */ + if (kwlen == 0) + { + result->parse_error = + pstrdup(_("found empty string where a compression option was expected")); + break; + } + + /* Extract keyword and value as separate C strings. */ + keyword = palloc(kwlen + 1); + memcpy(keyword, kwstart, kwlen); + keyword[kwlen] = '\0'; + if (!has_value) + value = NULL; + else + { + value = palloc(vlen + 1); + memcpy(value, vstart, vlen); + value[vlen] = '\0'; + } + + /* Handle whatever keyword we found. */ + if (strcmp(keyword, "level") == 0) + { + result->level = expect_integer_value(keyword, value, result); + result->options |= BACKUP_COMPRESSION_OPTION_LEVEL; + } + else + result->parse_error = + psprintf(_("unknown compression option \"%s\""), keyword); + + /* Release memory, just to be tidy. */ + pfree(keyword); + if (value != NULL) + pfree(value); + + /* If we got an error or have reached the end of the string, stop. */ + if (result->parse_error != NULL || *kwend == '\0' || *vend == '\0') + break; + + /* Advance to next entry and loop around. */ + specification = vend == NULL ? kwend + 1 : vend + 1; + } +} + +/* + * Parse 'value' as an integer and return the result. + * + * If parsing fails, set result->parse_error to an appropriate message + * and return -1. + */ +static int +expect_integer_value(char *keyword, char *value, bc_specification *result) +{ + int ivalue; + char *ivalue_endp; + + if (value == NULL) + { + result->parse_error = + psprintf(_("compression option \"%s\" requires a value"), + keyword); + return -1; + } + + ivalue = strtol(value, &ivalue_endp, 10); + if (ivalue_endp == value || *ivalue_endp != '\0') + { + result->parse_error = + psprintf(_("value for compression option \"%s\" must be an integer"), + keyword); + return -1; + } + return ivalue; +} + +/* + * Returns NULL if the compression specification string was syntactically + * valid and semantically sensible. Otherwise, returns an error message. + * + * Does not test whether this build of PostgreSQL supports the requested + * compression method. + */ +char * +validate_bc_specification(bc_specification *spec) +{ + /* If it didn't even parse OK, it's definitely no good. */ + if (spec->parse_error != NULL) + return spec->parse_error; + + /* + * If a compression level was specified, check that the algorithm expects + * a compression level and that the level is within the legal range for + * the algorithm. + */ + if ((spec->options & BACKUP_COMPRESSION_OPTION_LEVEL) != 0) + { + int min_level = 1; + int max_level; + + if (spec->algorithm == BACKUP_COMPRESSION_GZIP) + max_level = 9; + else if (spec->algorithm == BACKUP_COMPRESSION_LZ4) + max_level = 12; + else if (spec->algorithm == BACKUP_COMPRESSION_ZSTD) + max_level = 22; + else + return psprintf(_("compression algorithm \"%s\" does not accept a compression level"), + get_bc_algorithm_name(spec->algorithm)); + + if (spec->level < min_level || spec->level > max_level) + return psprintf(_("compression algorithm \"%s\" expects a compression level between %d and %d"), + get_bc_algorithm_name(spec->algorithm), + min_level, max_level); + } + + return NULL; +} diff --git a/src/include/common/backup_compression.h b/src/include/common/backup_compression.h new file mode 100644 index 0000000000..0565cbc657 --- /dev/null +++ b/src/include/common/backup_compression.h @@ -0,0 +1,44 @@ +/*------------------------------------------------------------------------- + * + * backup_compression.h + * + * Shared definitions for backup compression methods and specifications. + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/common/backup_compression.h + *------------------------------------------------------------------------- + */ + +#ifndef BACKUP_COMPRESSION_H +#define BACKUP_COMPRESSION_H + +typedef enum bc_algorithm +{ + BACKUP_COMPRESSION_NONE, + BACKUP_COMPRESSION_GZIP, + BACKUP_COMPRESSION_LZ4, + BACKUP_COMPRESSION_ZSTD +} bc_algorithm; + +#define BACKUP_COMPRESSION_OPTION_LEVEL (1 << 0) + +typedef struct bc_specification +{ + bc_algorithm algorithm; + unsigned options; /* OR of BACKUP_COMPRESSION_OPTION constants */ + int level; + char *parse_error; /* NULL if parsing was OK, else message */ +} bc_specification; + +extern bool parse_bc_algorithm(char *name, bc_algorithm *algorithm); +extern const char *get_bc_algorithm_name(bc_algorithm algorithm); + +extern void parse_bc_specification(bc_algorithm algorithm, + char *specification, + bc_specification *result); + +extern char *validate_bc_specification(bc_specification *); + +#endif diff --git a/src/include/replication/basebackup_sink.h b/src/include/replication/basebackup_sink.h index a7f16758a4..654df28576 100644 --- a/src/include/replication/basebackup_sink.h +++ b/src/include/replication/basebackup_sink.h @@ -27,6 +27,7 @@ #define BASEBACKUP_SINK_H #include "access/xlog_internal.h" +#include "common/backup_compression.h" #include "nodes/pg_list.h" /* Forward declarations. */ @@ -283,9 +284,9 @@ extern void bbsink_forward_cleanup(bbsink *sink); /* Constructors for various types of sinks. */ extern bbsink *bbsink_copystream_new(bool send_to_client); -extern bbsink *bbsink_gzip_new(bbsink *next, int compresslevel); -extern bbsink *bbsink_lz4_new(bbsink *next, int compresslevel); -extern bbsink *bbsink_zstd_new(bbsink *next, int compresslevel); +extern bbsink *bbsink_gzip_new(bbsink *next, bc_specification *); +extern bbsink *bbsink_lz4_new(bbsink *next, bc_specification *); +extern bbsink *bbsink_zstd_new(bbsink *next, bc_specification *); extern bbsink *bbsink_progress_new(bbsink *next, bool estimate_backup_size); extern bbsink *bbsink_server_new(bbsink *next, char *pathname); extern bbsink *bbsink_throttle_new(bbsink *next, uint32 maxrate); diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm index 441d6ae6bf..de8676d339 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -124,7 +124,7 @@ sub mkvcbuild } our @pgcommonallfiles = qw( - archive.c base64.c checksum_helper.c + archive.c backup_compression.c base64.c checksum_helper.c config_info.c controldata_utils.c d2s.c encnames.c exec.c f2s.c file_perm.c file_utils.c hashfn.c ip.c jsonapi.c keywords.c kwlookup.c link-canary.c md5_common.c From 607e75e8f0f84544feb879b747da1d40fed71499 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 23 Mar 2022 10:22:54 -0400 Subject: [PATCH 218/772] Unbreak the build. Commit ffd53659c46a54a6978bcb8c4424c1e157a2c0f1 broke the build for anyone not compiling with LZ4 and ZSTD enabled. Woops. --- src/backend/replication/basebackup_lz4.c | 3 +-- src/backend/replication/basebackup_zstd.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/backend/replication/basebackup_lz4.c b/src/backend/replication/basebackup_lz4.c index 06c161ddc4..48929321a4 100644 --- a/src/backend/replication/basebackup_lz4.c +++ b/src/backend/replication/basebackup_lz4.c @@ -61,8 +61,6 @@ const bbsink_ops bbsink_lz4_ops = { bbsink * bbsink_lz4_new(bbsink *next, bc_specification *compress) { - int compresslevel; - #ifndef USE_LZ4 ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -70,6 +68,7 @@ bbsink_lz4_new(bbsink *next, bc_specification *compress) return NULL; /* keep compiler quiet */ #else bbsink_lz4 *sink; + int compresslevel; Assert(next != NULL); diff --git a/src/backend/replication/basebackup_zstd.c b/src/backend/replication/basebackup_zstd.c index 96b7985693..bb5b668c2a 100644 --- a/src/backend/replication/basebackup_zstd.c +++ b/src/backend/replication/basebackup_zstd.c @@ -60,8 +60,6 @@ const bbsink_ops bbsink_zstd_ops = { bbsink * bbsink_zstd_new(bbsink *next, bc_specification *compress) { - int compresslevel; - #ifndef USE_ZSTD ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -69,6 +67,7 @@ bbsink_zstd_new(bbsink *next, bc_specification *compress) return NULL; /* keep compiler quiet */ #else bbsink_zstd *sink; + int compresslevel; Assert(next != NULL); From fc15396dc6821e15c883b8101be45ee6298a4d77 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Wed, 23 Mar 2022 10:42:25 -0400 Subject: [PATCH 219/772] Use approved style for listing OBJS in test_oat_hooks Makefile --- src/test/modules/test_oat_hooks/Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/modules/test_oat_hooks/Makefile b/src/test/modules/test_oat_hooks/Makefile index 8456723808..d1d874be79 100644 --- a/src/test/modules/test_oat_hooks/Makefile +++ b/src/test/modules/test_oat_hooks/Makefile @@ -1,7 +1,9 @@ # src/test/modules/test_oat_hooks/Makefile MODULE_big = test_oat_hooks -OBJS = test_oat_hooks.o $(WIN32RES) +OBJS = \ + $(WIN32RES) \ + test_oat_hooks.o PGFILEDESC = "test_oat_hooks - example use of object access hooks" REGRESS = test_oat_hooks From 7c51b7f7cc0860ab9a5784fce7a44142e4eb5463 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Wed, 23 Mar 2022 11:13:33 -0400 Subject: [PATCH 220/772] Force NO_LOCALE / UTF8 for test_oat_hooks tests This will fix cases like fairywren that have been having issues. Discussion: https://postgr.es/m/2630561.1647994022@sss.pgh.pa.us --- src/test/modules/test_oat_hooks/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/modules/test_oat_hooks/Makefile b/src/test/modules/test_oat_hooks/Makefile index d1d874be79..2b5d2687f8 100644 --- a/src/test/modules/test_oat_hooks/Makefile +++ b/src/test/modules/test_oat_hooks/Makefile @@ -10,6 +10,9 @@ REGRESS = test_oat_hooks # disable installcheck for now NO_INSTALLCHECK = 1 +# and also for now force NO_LOCALE and UTF8 +ENCODING = UTF8 +NO_LOCALE = 1 ifdef USE_PGXS PG_CONFIG = pg_config From 68d8f9bfb2f467c306d81b4f1cee1a5a0e5ede37 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 23 Mar 2022 11:37:12 -0400 Subject: [PATCH 221/772] In get_bc_algorithm_name, add a dummy return statement. This code shouldn't be reached, but having it here might avoid a compiler warning. Per CI complaint from Andres Freund. Discussion: http://postgr.es/m/C6A7643A-582B-47F7-A03D-01736BC0349B@anarazel.de --- src/common/backup_compression.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/backup_compression.c b/src/common/backup_compression.c index 591b97a60c..0650f975c4 100644 --- a/src/common/backup_compression.c +++ b/src/common/backup_compression.c @@ -72,6 +72,7 @@ get_bc_algorithm_name(bc_algorithm algorithm) /* no default, to provoke compiler warnings if values are added */ } Assert(false); + return "???"; /* placate compiler */ } /* From dfdb2f3bf5c6ff4014de142a7b82b205224e01d3 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 23 Mar 2022 16:17:00 +0100 Subject: [PATCH 222/772] test_decoding: Add comments about delaying BEGIN/PREPARE It is not immediately obvious why we return early in these functions; these comments should make it so. Reviewed-by: Tomas Vondra Discussion: https://postgr.es/m/202202141336.xv35beswc6ec@alvherre.pgsql --- contrib/test_decoding/test_decoding.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/contrib/test_decoding/test_decoding.c b/contrib/test_decoding/test_decoding.c index ea22649e41..c7a87f5fe5 100644 --- a/contrib/test_decoding/test_decoding.c +++ b/contrib/test_decoding/test_decoding.c @@ -322,6 +322,10 @@ pg_decode_begin_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn) txndata->xact_wrote_changes = false; txn->output_plugin_private = txndata; + /* + * If asked to skip empty transactions, we'll emit BEGIN at the point where + * the first operation is received for this transaction. + */ if (data->skip_empty_xacts) return; @@ -378,6 +382,10 @@ pg_decode_begin_prepare_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn) txndata->xact_wrote_changes = false; txn->output_plugin_private = txndata; + /* + * If asked to skip empty transactions, we'll emit BEGIN at the point where + * the first operation is received for this transaction. + */ if (data->skip_empty_xacts) return; @@ -392,6 +400,10 @@ pg_decode_prepare_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, TestDecodingData *data = ctx->output_plugin_private; TestDecodingTxnData *txndata = txn->output_plugin_private; + /* + * If asked to skip empty transactions, we'll emit PREPARE at the point + * where the first operation is received for this transaction. + */ if (data->skip_empty_xacts && !txndata->xact_wrote_changes) return; From 9d92582abf918215d27659d45a4c9e78bda50aff Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 23 Mar 2022 18:22:10 +0100 Subject: [PATCH 223/772] Fix "missing continuation record" after standby promotion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Invalidate abortedRecPtr and missingContrecPtr after a missing continuation record is successfully skipped on a standby. This fixes a PANIC caused when a recently promoted standby attempts to write an OVERWRITE_RECORD with an LSN of the previously read aborted record. Backpatch to 10 (all stable versions). Author: Sami Imseih Reviewed-by: Kyotaro Horiguchi Reviewed-by: Álvaro Herrera Discussion: https://postgr.es/m/44D259DE-7542-49C4-8A52-2AB01534DCA9@amazon.com --- src/backend/access/transam/xlogrecovery.c | 4 ++++ src/test/recovery/t/026_overwrite_contrecord.pl | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 9feea3e6ec..8d2395dae2 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -1948,6 +1948,10 @@ xlogrecovery_redo(XLogReaderState *record, TimeLineID replayTLI) LSN_FORMAT_ARGS(xlrec.overwritten_lsn), LSN_FORMAT_ARGS(record->overwrittenRecPtr)); + /* We have safely skipped the aborted record */ + abortedRecPtr = InvalidXLogRecPtr; + missingContrecPtr = InvalidXLogRecPtr; + ereport(LOG, (errmsg("successfully skipped missing contrecord at %X/%X, overwritten at %s", LSN_FORMAT_ARGS(xlrec.overwritten_lsn), diff --git a/src/test/recovery/t/026_overwrite_contrecord.pl b/src/test/recovery/t/026_overwrite_contrecord.pl index 0fd907f152..78feccd9aa 100644 --- a/src/test/recovery/t/026_overwrite_contrecord.pl +++ b/src/test/recovery/t/026_overwrite_contrecord.pl @@ -13,7 +13,7 @@ # Test: Create a physical replica that's missing the last WAL file, # then restart the primary to create a divergent WAL file and observe # that the replica replays the "overwrite contrecord" from that new -# file. +# file and the standby promotes successfully. my $node = PostgreSQL::Test::Cluster->new('primary'); $node->init(allows_streaming => 1); @@ -100,6 +100,9 @@ END qr[successfully skipped missing contrecord at], "found log line in standby"); +# Verify promotion is successful +$node_standby->promote; + $node->stop; $node_standby->stop; From 591767150f5f91ccc3614e71977c47ce7a68786b Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 23 Mar 2022 13:25:26 -0400 Subject: [PATCH 224/772] pg_basebackup: Try to fix some failures on Windows. Commit ffd53659c46a54a6978bcb8c4424c1e157a2c0f1 messed up the mechanism that was being used to pass parameters to LogStreamerMain() on Windows. It worked on Linux because only Windows was using threads. Repair by moving the additional parameters added by that commit into the 'logstreamer_param' struct. Along the way, fix a compiler warning on builds without HAVE_LIBZ. Discussion: http://postgr.es/m/CA+TgmoY5=AmWOtMj3v+cySP2rR=Bt6EGyF_joAq4CfczMddKtw@mail.gmail.com --- src/backend/replication/basebackup_gzip.c | 3 +-- src/bin/pg_basebackup/pg_basebackup.c | 14 ++++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/backend/replication/basebackup_gzip.c b/src/backend/replication/basebackup_gzip.c index 703a91ba77..e4df57b121 100644 --- a/src/backend/replication/basebackup_gzip.c +++ b/src/backend/replication/basebackup_gzip.c @@ -61,8 +61,6 @@ const bbsink_ops bbsink_gzip_ops = { bbsink * bbsink_gzip_new(bbsink *next, bc_specification *compress) { - int compresslevel; - #ifndef HAVE_LIBZ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -70,6 +68,7 @@ bbsink_gzip_new(bbsink *next, bc_specification *compress) return NULL; /* keep compiler quiet */ #else bbsink_gzip *sink; + int compresslevel; Assert(next != NULL); diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index 3e6977df1a..ed8d084d62 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -541,12 +541,12 @@ typedef struct char xlog[MAXPGPATH]; /* directory or tarfile depending on mode */ char *sysidentifier; int timeline; + WalCompressionMethod wal_compress_method; + int wal_compress_level; } logstreamer_param; static int -LogStreamerMain(logstreamer_param *param, - WalCompressionMethod wal_compress_method, - int wal_compress_level) +LogStreamerMain(logstreamer_param *param) { StreamCtl stream; @@ -575,8 +575,8 @@ LogStreamerMain(logstreamer_param *param, stream.do_sync); else stream.walmethod = CreateWalTarMethod(param->xlog, - wal_compress_method, - wal_compress_level, + param->wal_compress_method, + param->wal_compress_level, stream.do_sync); if (!ReceiveXlogStream(param->bgconn, &stream)) @@ -634,6 +634,8 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier, param = pg_malloc0(sizeof(logstreamer_param)); param->timeline = timeline; param->sysidentifier = sysidentifier; + param->wal_compress_method = wal_compress_method; + param->wal_compress_level = wal_compress_level; /* Convert the starting position */ if (sscanf(startpos, "%X/%X", &hi, &lo) != 2) @@ -724,7 +726,7 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier, int ret; /* in child process */ - ret = LogStreamerMain(param, wal_compress_method, wal_compress_level); + ret = LogStreamerMain(param); /* temp debugging aid to analyze 019_replslot_limit failures */ if (verbose) From 3e1c942a4e2f06e9b0196180eb8fd1383e6d788e Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 23 Mar 2022 19:23:51 +0100 Subject: [PATCH 225/772] pg_upgrade: Upgrade an Assert to a real 'if' test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It seems possible for the condition being tested to be true in production, and nobody would never know (except when some data eventually becomes corrupt?). Author: Álvaro Herrera Discussion: https://postgr.es/m//202109040001.zky3wgv2qeqg@alvherre.pgsql --- src/bin/pg_rewind/parsexlog.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bin/pg_rewind/parsexlog.c b/src/bin/pg_rewind/parsexlog.c index 7cfa169e9b..3ed2a2e811 100644 --- a/src/bin/pg_rewind/parsexlog.c +++ b/src/bin/pg_rewind/parsexlog.c @@ -102,7 +102,9 @@ extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex, * If 'endpoint' didn't point exactly at a record boundary, the caller * messed up. */ - Assert(xlogreader->EndRecPtr == endpoint); + if (xlogreader->EndRecPtr != endpoint) + pg_fatal("end pointer %X/%X is not a valid end point; expected %X/%X", + LSN_FORMAT_ARGS(endpoint), LSN_FORMAT_ARGS(xlogreader->EndRecPtr)); XLogReaderFree(xlogreader); if (xlogreadfd != -1) From 81b9f23c9c83813f14d20cf6993d94fdd44c0991 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 23 Mar 2022 11:33:01 -0700 Subject: [PATCH 226/772] ci: test headerscheck, cpluspluscheck as part of CompilerWarnings task. Discussion: https://postgr.es/m/20220323002024.f2g6tivduzrktgfa@alap3.anarazel.de --- .cirrus.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.cirrus.yml b/.cirrus.yml index e5335fede7..171bd29cf0 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -576,5 +576,28 @@ task: make -s -j${BUILD_JOBS} clean time make -s -j${BUILD_JOBS} -C doc + ### + # Verify headerscheck / cpluspluscheck succeed + # + # - Don't use ccache, the files are uncacheable, polluting ccache's + # cache + # - Use -fmax-errors, as particularly cpluspluscheck can be very verbose + # - XXX have to disable ICU to avoid errors: + # https://postgr.es/m/20220323002024.f2g6tivduzrktgfa%40alap3.anarazel.de + # - XXX: the -Wno-register avoids verbose warnings: + # https://postgr.es/m/20220308181837.aun3tdtdvao4vb7o%40alap3.anarazel.de + ### + always: + headers_headerscheck_script: | + time ./configure \ + ${LINUX_CONFIGURE_FEATURES} \ + --without-icu \ + --quiet \ + CC="gcc" CXX"=g++" CLANG="clang" + make -s -j${BUILD_JOBS} clean + time make -s headerscheck EXTRAFLAGS='-fmax-errors=10' + headers_cpluspluscheck_script: | + time make -s cpluspluscheck EXTRAFLAGS='-Wno-register -fmax-errors=10' + always: upload_caches: ccache From c97e4bdcb142effc452d33b81f31e0b3ac990b71 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Wed, 23 Mar 2022 15:11:45 -0400 Subject: [PATCH 227/772] Clean test_rls_hooks module This module isn't an extension and doesn't need to be preloaded. Adjust the Makefile and remove the extraneous .control and .conf files accordingly. Discussion: https://postgr.es/m/43bcaaab-077e-cebe-35be-3cd7f2633449@dunslane.net --- src/test/modules/test_rls_hooks/Makefile | 7 ------- src/test/modules/test_rls_hooks/rls_hooks.conf | 1 - src/test/modules/test_rls_hooks/test_rls_hooks.control | 4 ---- 3 files changed, 12 deletions(-) delete mode 100644 src/test/modules/test_rls_hooks/rls_hooks.conf delete mode 100644 src/test/modules/test_rls_hooks/test_rls_hooks.control diff --git a/src/test/modules/test_rls_hooks/Makefile b/src/test/modules/test_rls_hooks/Makefile index a4f7d855c0..14ccc35250 100644 --- a/src/test/modules/test_rls_hooks/Makefile +++ b/src/test/modules/test_rls_hooks/Makefile @@ -6,14 +6,7 @@ OBJS = \ test_rls_hooks.o PGFILEDESC = "test_rls_hooks - example use of RLS hooks" -EXTENSION = test_rls_hooks -# DATA = test_rls_hooks--1.0.sql - REGRESS = test_rls_hooks -REGRESS_OPTS = --temp-config=$(top_srcdir)/src/test/modules/test_rls_hooks/rls_hooks.conf -# Disabled because these tests require "shared_preload_libraries=test_rls_hooks", -# which typical installcheck users do not have (e.g. buildfarm clients). -NO_INSTALLCHECK = 1 ifdef USE_PGXS PG_CONFIG = pg_config diff --git a/src/test/modules/test_rls_hooks/rls_hooks.conf b/src/test/modules/test_rls_hooks/rls_hooks.conf deleted file mode 100644 index a522c0e550..0000000000 --- a/src/test/modules/test_rls_hooks/rls_hooks.conf +++ /dev/null @@ -1 +0,0 @@ -shared_preload_libraries = test_rls_hooks diff --git a/src/test/modules/test_rls_hooks/test_rls_hooks.control b/src/test/modules/test_rls_hooks/test_rls_hooks.control deleted file mode 100644 index 9f9f13f76c..0000000000 --- a/src/test/modules/test_rls_hooks/test_rls_hooks.control +++ /dev/null @@ -1,4 +0,0 @@ -comment = 'Test code for RLS hooks' -default_version = '1.0' -module_pathname = '$libdir/test_rls_hooks' -relocatable = true From e71c76fcab8d00defe9a7a608facdd9663f7bcbf Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 23 Mar 2022 12:43:14 -0700 Subject: [PATCH 228/772] configure: check for dlsym instead of dlopen. When building with sanitizers the sanitizer library provides dlopen, but not dlsym(), making configure think that -ldl isn't needed. Just checking for dlsym() ought to suffice, hard to see dlsym() being provided without dlopen() also being provided. Backpatch to all branches, for the same reasons as 46ab07ffda9. Reviewed-By: Tom Lane Discussion: https://postgr.es/m/20220323173537.ll7klrglnp4gn2um@alap3.anarazel.de Backpatch: 10- --- configure | 27 +++++++++++++++------------ configure.ac | 5 ++++- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/configure b/configure index f3cb5c2b51..e066cbe2c8 100755 --- a/configure +++ b/configure @@ -11856,9 +11856,12 @@ if test "$ac_res" != no; then : fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 -$as_echo_n "checking for library containing dlopen... " >&6; } -if ${ac_cv_search_dlopen+:} false; then : +# gcc/clang's sanitizer helper library provides dlopen but not dlsym, thus +# when enabling asan the dlopen check doesn't notice that -ldl is actually +# required. Just checking for dlsym() ought to suffice. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlsym" >&5 +$as_echo_n "checking for library containing dlsym... " >&6; } +if ${ac_cv_search_dlsym+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS @@ -11871,11 +11874,11 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char dlopen (); +char dlsym (); int main () { -return dlopen (); +return dlsym (); ; return 0; } @@ -11888,25 +11891,25 @@ for ac_lib in '' dl; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : - ac_cv_search_dlopen=$ac_res + ac_cv_search_dlsym=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext - if ${ac_cv_search_dlopen+:} false; then : + if ${ac_cv_search_dlsym+:} false; then : break fi done -if ${ac_cv_search_dlopen+:} false; then : +if ${ac_cv_search_dlsym+:} false; then : else - ac_cv_search_dlopen=no + ac_cv_search_dlsym=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 -$as_echo "$ac_cv_search_dlopen" >&6; } -ac_res=$ac_cv_search_dlopen +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlsym" >&5 +$as_echo "$ac_cv_search_dlsym" >&6; } +ac_res=$ac_cv_search_dlsym if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" diff --git a/configure.ac b/configure.ac index 19d1a80367..078381e568 100644 --- a/configure.ac +++ b/configure.ac @@ -1229,7 +1229,10 @@ AC_SUBST(PTHREAD_LIBS) AC_CHECK_LIB(m, main) AC_SEARCH_LIBS(setproctitle, util) -AC_SEARCH_LIBS(dlopen, dl) +# gcc/clang's sanitizer helper library provides dlopen but not dlsym, thus +# when enabling asan the dlopen check doesn't notice that -ldl is actually +# required. Just checking for dlsym() ought to suffice. +AC_SEARCH_LIBS(dlsym, dl) AC_SEARCH_LIBS(socket, [socket ws2_32]) AC_SEARCH_LIBS(shl_load, dld) AC_SEARCH_LIBS(getopt_long, [getopt gnugetopt]) From 1c6bb380e5aba195204a9c6d0b4713bd1b3dec9c Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 23 Mar 2022 13:05:25 -0700 Subject: [PATCH 229/772] Don't call fwrite() with len == 0 when writing out relcache init file. Noticed via -fsanitize=undefined. Backpatch to all branches, for the same reasons as 46ab07ffda9. Discussion: https://postgr.es/m/20220323173537.ll7klrglnp4gn2um@alap3.anarazel.de Backpatch: 10- --- src/backend/utils/cache/relcache.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index fbd11883e1..3d05297b0d 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -6528,7 +6528,7 @@ write_item(const void *data, Size len, FILE *fp) { if (fwrite(&len, 1, sizeof(len), fp) != sizeof(len)) elog(FATAL, "could not write init file"); - if (fwrite(data, 1, len, fp) != len) + if (len > 0 && fwrite(data, 1, len, fp) != len) elog(FATAL, "could not write init file"); } From 3ac7d024122f26d828907f15d088dcd67d2eb4f1 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 23 Mar 2022 13:05:59 -0700 Subject: [PATCH 230/772] Don't try to translate NULL in GetConfigOptionByNum(). Noticed via -fsanitize=undefined. Introduced when a few columns in GetConfigOptionByNum() / pg_settings started to be translated in 72be8c29a / PG 12. Backpatch to all affected branches, for the same reasons as 46ab07ffda9. Discussion: https://postgr.es/m/20220323173537.ll7klrglnp4gn2um@alap3.anarazel.de Backpatch: 12- --- src/backend/utils/misc/guc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 932aefc777..f70f7f5c01 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -9797,7 +9797,7 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow) values[4] = _(conf->short_desc); /* extra_desc */ - values[5] = _(conf->long_desc); + values[5] = conf->long_desc != NULL ? _(conf->long_desc) : NULL; /* context */ values[6] = GucContext_Names[conf->context]; From a1bc4d3590b1f620485c3ec5290dc628e62476f8 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 24 Mar 2022 09:36:30 +0900 Subject: [PATCH 231/772] Add some basic regression tests for pg_freespacemap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The number of relation pages is tricky to get right in a portable way, particularly across 32b and 64b builds, but checking after the existence of the FSM and if there is any space available space should be stable enough with a minimal number of tuples involved. This commit introduces checks on a table with some btree, BRIN and hash indexes, as a first attempt. Author: Dong Wook Lee, Fabrízio de Royes Mello, Michael Paquier Discussion: https://postgr.es/m/CAAcByaJ5KW3bd7fJr=jPEyK8M_UzXJFHHBVuOcBe+JHD8txRyQ@mail.gmail.com --- contrib/pg_freespacemap/.gitignore | 4 + contrib/pg_freespacemap/Makefile | 2 + .../expected/pg_freespacemap.out | 85 +++++++++++++++++++ .../pg_freespacemap/sql/pg_freespacemap.sql | 32 +++++++ 4 files changed, 123 insertions(+) create mode 100644 contrib/pg_freespacemap/.gitignore create mode 100644 contrib/pg_freespacemap/expected/pg_freespacemap.out create mode 100644 contrib/pg_freespacemap/sql/pg_freespacemap.sql diff --git a/contrib/pg_freespacemap/.gitignore b/contrib/pg_freespacemap/.gitignore new file mode 100644 index 0000000000..5dcb3ff972 --- /dev/null +++ b/contrib/pg_freespacemap/.gitignore @@ -0,0 +1,4 @@ +# Generated subdirectories +/log/ +/results/ +/tmp_check/ diff --git a/contrib/pg_freespacemap/Makefile b/contrib/pg_freespacemap/Makefile index da40b80c7c..2d525a1284 100644 --- a/contrib/pg_freespacemap/Makefile +++ b/contrib/pg_freespacemap/Makefile @@ -10,6 +10,8 @@ DATA = pg_freespacemap--1.1.sql pg_freespacemap--1.1--1.2.sql \ pg_freespacemap--1.0--1.1.sql PGFILEDESC = "pg_freespacemap - monitoring of free space map" +REGRESS = pg_freespacemap + ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) diff --git a/contrib/pg_freespacemap/expected/pg_freespacemap.out b/contrib/pg_freespacemap/expected/pg_freespacemap.out new file mode 100644 index 0000000000..eb574c2373 --- /dev/null +++ b/contrib/pg_freespacemap/expected/pg_freespacemap.out @@ -0,0 +1,85 @@ +CREATE EXTENSION pg_freespacemap; +CREATE TABLE freespace_tab (c1 int) WITH (autovacuum_enabled = off); +CREATE INDEX freespace_brin ON freespace_tab USING brin (c1); +CREATE INDEX freespace_btree ON freespace_tab USING btree (c1); +CREATE INDEX freespace_hash ON freespace_tab USING hash (c1); +-- report all the sizes of the FSMs for all the relation blocks. +WITH rel AS (SELECT oid::regclass AS id FROM pg_class WHERE relname ~ 'freespace') + SELECT rel.id, fsm.blkno, (fsm.avail > 0) AS is_avail + FROM rel, LATERAL pg_freespace(rel.id) AS fsm + ORDER BY 1, 2; + id | blkno | is_avail +-----------------+-------+---------- + freespace_brin | 0 | f + freespace_brin | 1 | f + freespace_brin | 2 | t + freespace_btree | 0 | f + freespace_hash | 0 | f + freespace_hash | 1 | f + freespace_hash | 2 | f + freespace_hash | 3 | f + freespace_hash | 4 | f + freespace_hash | 5 | f + freespace_hash | 6 | f + freespace_hash | 7 | f + freespace_hash | 8 | f + freespace_hash | 9 | f +(14 rows) + +INSERT INTO freespace_tab VALUES (1); +VACUUM freespace_tab; +WITH rel AS (SELECT oid::regclass AS id FROM pg_class WHERE relname ~ 'freespace') + SELECT rel.id, fsm.blkno, (fsm.avail > 0) AS is_avail + FROM rel, LATERAL pg_freespace(rel.id) AS fsm + ORDER BY 1, 2; + id | blkno | is_avail +-----------------+-------+---------- + freespace_tab | 0 | t + freespace_brin | 0 | f + freespace_brin | 1 | f + freespace_brin | 2 | t + freespace_btree | 0 | f + freespace_btree | 1 | f + freespace_hash | 0 | f + freespace_hash | 1 | f + freespace_hash | 2 | f + freespace_hash | 3 | f + freespace_hash | 4 | f + freespace_hash | 5 | f + freespace_hash | 6 | f + freespace_hash | 7 | f + freespace_hash | 8 | f + freespace_hash | 9 | f +(16 rows) + +DELETE FROM freespace_tab; +VACUUM freespace_tab; +WITH rel AS (SELECT oid::regclass AS id FROM pg_class WHERE relname ~ 'freespace') + SELECT rel.id, fsm.blkno, (fsm.avail > 0) AS is_avail + FROM rel, LATERAL pg_freespace(rel.id) AS fsm + ORDER BY 1, 2; + id | blkno | is_avail +-----------------+-------+---------- + freespace_brin | 0 | f + freespace_brin | 1 | f + freespace_brin | 2 | t + freespace_btree | 0 | f + freespace_btree | 1 | f + freespace_hash | 0 | f + freespace_hash | 1 | f + freespace_hash | 2 | f + freespace_hash | 3 | f + freespace_hash | 4 | f + freespace_hash | 5 | f + freespace_hash | 6 | f + freespace_hash | 7 | f + freespace_hash | 8 | f + freespace_hash | 9 | f +(15 rows) + +-- failures with incorrect block number +SELECT * FROM pg_freespace('freespace_tab', -1); +ERROR: invalid block number +SELECT * FROM pg_freespace('freespace_tab', 4294967295); +ERROR: invalid block number +DROP TABLE freespace_tab; diff --git a/contrib/pg_freespacemap/sql/pg_freespacemap.sql b/contrib/pg_freespacemap/sql/pg_freespacemap.sql new file mode 100644 index 0000000000..06275d8fac --- /dev/null +++ b/contrib/pg_freespacemap/sql/pg_freespacemap.sql @@ -0,0 +1,32 @@ +CREATE EXTENSION pg_freespacemap; + +CREATE TABLE freespace_tab (c1 int) WITH (autovacuum_enabled = off); +CREATE INDEX freespace_brin ON freespace_tab USING brin (c1); +CREATE INDEX freespace_btree ON freespace_tab USING btree (c1); +CREATE INDEX freespace_hash ON freespace_tab USING hash (c1); + +-- report all the sizes of the FSMs for all the relation blocks. +WITH rel AS (SELECT oid::regclass AS id FROM pg_class WHERE relname ~ 'freespace') + SELECT rel.id, fsm.blkno, (fsm.avail > 0) AS is_avail + FROM rel, LATERAL pg_freespace(rel.id) AS fsm + ORDER BY 1, 2; + +INSERT INTO freespace_tab VALUES (1); +VACUUM freespace_tab; +WITH rel AS (SELECT oid::regclass AS id FROM pg_class WHERE relname ~ 'freespace') + SELECT rel.id, fsm.blkno, (fsm.avail > 0) AS is_avail + FROM rel, LATERAL pg_freespace(rel.id) AS fsm + ORDER BY 1, 2; + +DELETE FROM freespace_tab; +VACUUM freespace_tab; +WITH rel AS (SELECT oid::regclass AS id FROM pg_class WHERE relname ~ 'freespace') + SELECT rel.id, fsm.blkno, (fsm.avail > 0) AS is_avail + FROM rel, LATERAL pg_freespace(rel.id) AS fsm + ORDER BY 1, 2; + +-- failures with incorrect block number +SELECT * FROM pg_freespace('freespace_tab', -1); +SELECT * FROM pg_freespace('freespace_tab', 4294967295); + +DROP TABLE freespace_tab; From d4781d8873f8c3fc8b0957cc03ce91627576cf36 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 24 Mar 2022 12:42:30 +0900 Subject: [PATCH 232/772] Refactor code related to pg_hba_file_rules() into new file hba.c is growing big, and more contents are planned for it. In order to prepare for this future work, this commit moves all the code related to the system function processing the contents of pg_hba.conf, pg_hba_file_rules() to a new file called hbafuncs.c, which will be used as the location for the SQL portion of the authentication file parsing. While on it, HbaToken, the structure holding a string token lexed from a configuration file related to authentication, is renamed to a more generic AuthToken, as it gets used not only for pg_hba.conf, but also for pg_ident.conf. TokenizedLine is now named TokenizedAuthLine. The size of hba.c is reduced by ~12%. Author: Julien Rouhaud Reviewed-by: Aleksander Alekseev, Michael Paquier Discussion: https://postgr.es/m/20220223045959.35ipdsvbxcstrhya@jrouhaud --- src/backend/libpq/hba.c | 517 +++---------------------------- src/backend/utils/adt/Makefile | 1 + src/backend/utils/adt/hbafuncs.c | 428 +++++++++++++++++++++++++ src/include/libpq/hba.h | 31 ++ src/tools/pgindent/typedefs.list | 4 +- 5 files changed, 511 insertions(+), 470 deletions(-) create mode 100644 src/backend/utils/adt/hbafuncs.c diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index 90953c38f3..673135144d 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -68,32 +68,6 @@ typedef struct check_network_data #define token_is_keyword(t, k) (!t->quoted && strcmp(t->string, k) == 0) #define token_matches(t, k) (strcmp(t->string, k) == 0) -/* - * A single string token lexed from a config file, together with whether - * the token had been quoted. - */ -typedef struct HbaToken -{ - char *string; - bool quoted; -} HbaToken; - -/* - * TokenizedLine represents one line lexed from a config file. - * Each item in the "fields" list is a sub-list of HbaTokens. - * We don't emit a TokenizedLine for empty or all-comment lines, - * so "fields" is never NIL (nor are any of its sub-lists). - * Exception: if an error occurs during tokenization, we might - * have fields == NIL, in which case err_msg != NULL. - */ -typedef struct TokenizedLine -{ - List *fields; /* List of lists of HbaTokens */ - int line_num; /* Line number */ - char *raw_line; /* Raw line text */ - char *err_msg; /* Error message if any */ -} TokenizedLine; - /* * pre-parsed content of HBA config file: list of HbaLine structs. * parsed_hba_context is the memory context where it lives. @@ -138,16 +112,10 @@ static const char *const UserAuthName[] = }; -static MemoryContext tokenize_file(const char *filename, FILE *file, - List **tok_lines, int elevel); static List *tokenize_inc_file(List *tokens, const char *outer_filename, const char *inc_filename, int elevel, char **err_msg); static bool parse_hba_auth_opt(char *name, char *val, HbaLine *hbaline, int elevel, char **err_msg); -static ArrayType *gethba_options(HbaLine *hba); -static void fill_hba_line(Tuplestorestate *tuple_store, TupleDesc tupdesc, - int lineno, HbaLine *hba, const char *err_msg); -static void fill_hba_view(Tuplestorestate *tuple_store, TupleDesc tupdesc); /* @@ -288,31 +256,31 @@ next_token(char **lineptr, char *buf, int bufsz, } /* - * Construct a palloc'd HbaToken struct, copying the given string. + * Construct a palloc'd AuthToken struct, copying the given string. */ -static HbaToken * -make_hba_token(const char *token, bool quoted) +static AuthToken * +make_auth_token(const char *token, bool quoted) { - HbaToken *hbatoken; + AuthToken *authtoken; int toklen; toklen = strlen(token); /* we copy string into same palloc block as the struct */ - hbatoken = (HbaToken *) palloc(sizeof(HbaToken) + toklen + 1); - hbatoken->string = (char *) hbatoken + sizeof(HbaToken); - hbatoken->quoted = quoted; - memcpy(hbatoken->string, token, toklen + 1); + authtoken = (AuthToken *) palloc(sizeof(AuthToken) + toklen + 1); + authtoken->string = (char *) authtoken + sizeof(AuthToken); + authtoken->quoted = quoted; + memcpy(authtoken->string, token, toklen + 1); - return hbatoken; + return authtoken; } /* - * Copy a HbaToken struct into freshly palloc'd memory. + * Copy a AuthToken struct into freshly palloc'd memory. */ -static HbaToken * -copy_hba_token(HbaToken *in) +static AuthToken * +copy_auth_token(AuthToken *in) { - HbaToken *out = make_hba_token(in->string, in->quoted); + AuthToken *out = make_auth_token(in->string, in->quoted); return out; } @@ -329,7 +297,7 @@ copy_hba_token(HbaToken *in) * may be non-NIL anyway, so *err_msg must be tested to determine whether * there was an error. * - * The result is a List of HbaToken structs, one for each token in the field, + * The result is a List of AuthToken structs, one for each token in the field, * or NIL if we reached EOL. */ static List * @@ -353,7 +321,7 @@ next_field_expand(const char *filename, char **lineptr, tokens = tokenize_inc_file(tokens, filename, buf + 1, elevel, err_msg); else - tokens = lappend(tokens, make_hba_token(buf, initial_quote)); + tokens = lappend(tokens, make_auth_token(buf, initial_quote)); } while (trailing_comma && (*err_msg == NULL)); return tokens; @@ -364,7 +332,7 @@ next_field_expand(const char *filename, char **lineptr, * Expand a file included from another file into an hba "field" * * Opens and tokenises a file included from another HBA config file with @, - * and returns all values found therein as a flat list of HbaTokens. If a + * and returns all values found therein as a flat list of AuthTokens. If a * @-token is found, recursively expand it. The newly read tokens are * appended to "tokens" (so that foo,bar,@baz does what you expect). * All new tokens are allocated in caller's memory context. @@ -419,7 +387,7 @@ tokenize_inc_file(List *tokens, } /* There is possible recursion here if the file contains @ */ - linecxt = tokenize_file(inc_fullname, inc_file, &inc_lines, elevel); + linecxt = tokenize_auth_file(inc_fullname, inc_file, &inc_lines, elevel); FreeFile(inc_file); pfree(inc_fullname); @@ -427,7 +395,7 @@ tokenize_inc_file(List *tokens, /* Copy all tokens found in the file and append to the tokens list */ foreach(inc_line, inc_lines) { - TokenizedLine *tok_line = (TokenizedLine *) lfirst(inc_line); + TokenizedAuthLine *tok_line = (TokenizedAuthLine *) lfirst(inc_line); ListCell *inc_field; /* If any line has an error, propagate that up to caller */ @@ -444,9 +412,9 @@ tokenize_inc_file(List *tokens, foreach(inc_token, inc_tokens) { - HbaToken *token = lfirst(inc_token); + AuthToken *token = lfirst(inc_token); - tokens = lappend(tokens, copy_hba_token(token)); + tokens = lappend(tokens, copy_auth_token(token)); } } } @@ -456,9 +424,11 @@ tokenize_inc_file(List *tokens, } /* - * Tokenize the given file. + * tokenize_auth_file + * Tokenize the given file. * - * The output is a list of TokenizedLine structs; see struct definition above. + * The output is a list of TokenizedAuthLine structs; see the struct definition + * in libpq/hba.h. * * filename: the absolute path to the target file * file: the already-opened target file @@ -466,14 +436,15 @@ tokenize_inc_file(List *tokens, * elevel: message logging level * * Errors are reported by logging messages at ereport level elevel and by - * adding TokenizedLine structs containing non-null err_msg fields to the + * adding TokenizedAuthLine structs containing non-null err_msg fields to the * output list. * * Return value is a memory context which contains all memory allocated by * this function (it's a child of caller's context). */ -static MemoryContext -tokenize_file(const char *filename, FILE *file, List **tok_lines, int elevel) +MemoryContext +tokenize_auth_file(const char *filename, FILE *file, List **tok_lines, + int elevel) { int line_number = 1; StringInfoData buf; @@ -481,7 +452,7 @@ tokenize_file(const char *filename, FILE *file, List **tok_lines, int elevel) MemoryContext oldcxt; linecxt = AllocSetContextCreate(CurrentMemoryContext, - "tokenize_file", + "tokenize_auth_file", ALLOCSET_SMALL_SIZES); oldcxt = MemoryContextSwitchTo(linecxt); @@ -550,12 +521,14 @@ tokenize_file(const char *filename, FILE *file, List **tok_lines, int elevel) current_line = lappend(current_line, current_field); } - /* Reached EOL; emit line to TokenizedLine list unless it's boring */ + /* + * Reached EOL; emit line to TokenizedAuthLine list unless it's boring + */ if (current_line != NIL || err_msg != NULL) { - TokenizedLine *tok_line; + TokenizedAuthLine *tok_line; - tok_line = (TokenizedLine *) palloc(sizeof(TokenizedLine)); + tok_line = (TokenizedAuthLine *) palloc(sizeof(TokenizedAuthLine)); tok_line->fields = current_line; tok_line->line_num = line_number; tok_line->raw_line = pstrdup(buf.data); @@ -600,13 +573,13 @@ is_member(Oid userid, const char *role) } /* - * Check HbaToken list for a match to role, allowing group names. + * Check AuthToken list for a match to role, allowing group names. */ static bool check_role(const char *role, Oid roleid, List *tokens) { ListCell *cell; - HbaToken *tok; + AuthToken *tok; foreach(cell, tokens) { @@ -624,13 +597,13 @@ check_role(const char *role, Oid roleid, List *tokens) } /* - * Check to see if db/role combination matches HbaToken list. + * Check to see if db/role combination matches AuthToken list. */ static bool check_db(const char *dbname, const char *role, Oid roleid, List *tokens) { ListCell *cell; - HbaToken *tok; + AuthToken *tok; foreach(cell, tokens) { @@ -962,8 +935,8 @@ do { \ * to have set a memory context that will be reset if this function returns * NULL. */ -static HbaLine * -parse_hba_line(TokenizedLine *tok_line, int elevel) +HbaLine * +parse_hba_line(TokenizedAuthLine *tok_line, int elevel) { int line_num = tok_line->line_num; char **err_msg = &tok_line->err_msg; @@ -976,7 +949,7 @@ parse_hba_line(TokenizedLine *tok_line, int elevel) ListCell *field; List *tokens; ListCell *tokencell; - HbaToken *token; + AuthToken *token; HbaLine *parsedline; parsedline = palloc0(sizeof(HbaLine)); @@ -1097,7 +1070,7 @@ parse_hba_line(TokenizedLine *tok_line, int elevel) foreach(tokencell, tokens) { parsedline->databases = lappend(parsedline->databases, - copy_hba_token(lfirst(tokencell))); + copy_auth_token(lfirst(tokencell))); } /* Get the roles. */ @@ -1117,7 +1090,7 @@ parse_hba_line(TokenizedLine *tok_line, int elevel) foreach(tokencell, tokens) { parsedline->roles = lappend(parsedline->roles, - copy_hba_token(lfirst(tokencell))); + copy_auth_token(lfirst(tokencell))); } if (parsedline->conntype != ctLocal) @@ -2257,7 +2230,7 @@ load_hba(void) return false; } - linecxt = tokenize_file(HbaFileName, file, &hba_lines, LOG); + linecxt = tokenize_auth_file(HbaFileName, file, &hba_lines, LOG); FreeFile(file); /* Now parse all the lines */ @@ -2268,7 +2241,7 @@ load_hba(void) oldcxt = MemoryContextSwitchTo(hbacxt); foreach(line, hba_lines) { - TokenizedLine *tok_line = (TokenizedLine *) lfirst(line); + TokenizedAuthLine *tok_line = (TokenizedAuthLine *) lfirst(line); HbaLine *newline; /* don't parse lines that already have errors */ @@ -2328,398 +2301,6 @@ load_hba(void) return true; } -/* - * This macro specifies the maximum number of authentication options - * that are possible with any given authentication method that is supported. - * Currently LDAP supports 11, and there are 3 that are not dependent on - * the auth method here. It may not actually be possible to set all of them - * at the same time, but we'll set the macro value high enough to be - * conservative and avoid warnings from static analysis tools. - */ -#define MAX_HBA_OPTIONS 14 - -/* - * Create a text array listing the options specified in the HBA line. - * Return NULL if no options are specified. - */ -static ArrayType * -gethba_options(HbaLine *hba) -{ - int noptions; - Datum options[MAX_HBA_OPTIONS]; - - noptions = 0; - - if (hba->auth_method == uaGSS || hba->auth_method == uaSSPI) - { - if (hba->include_realm) - options[noptions++] = - CStringGetTextDatum("include_realm=true"); - - if (hba->krb_realm) - options[noptions++] = - CStringGetTextDatum(psprintf("krb_realm=%s", hba->krb_realm)); - } - - if (hba->usermap) - options[noptions++] = - CStringGetTextDatum(psprintf("map=%s", hba->usermap)); - - if (hba->clientcert != clientCertOff) - options[noptions++] = - CStringGetTextDatum(psprintf("clientcert=%s", (hba->clientcert == clientCertCA) ? "verify-ca" : "verify-full")); - - if (hba->pamservice) - options[noptions++] = - CStringGetTextDatum(psprintf("pamservice=%s", hba->pamservice)); - - if (hba->auth_method == uaLDAP) - { - if (hba->ldapserver) - options[noptions++] = - CStringGetTextDatum(psprintf("ldapserver=%s", hba->ldapserver)); - - if (hba->ldapport) - options[noptions++] = - CStringGetTextDatum(psprintf("ldapport=%d", hba->ldapport)); - - if (hba->ldaptls) - options[noptions++] = - CStringGetTextDatum("ldaptls=true"); - - if (hba->ldapprefix) - options[noptions++] = - CStringGetTextDatum(psprintf("ldapprefix=%s", hba->ldapprefix)); - - if (hba->ldapsuffix) - options[noptions++] = - CStringGetTextDatum(psprintf("ldapsuffix=%s", hba->ldapsuffix)); - - if (hba->ldapbasedn) - options[noptions++] = - CStringGetTextDatum(psprintf("ldapbasedn=%s", hba->ldapbasedn)); - - if (hba->ldapbinddn) - options[noptions++] = - CStringGetTextDatum(psprintf("ldapbinddn=%s", hba->ldapbinddn)); - - if (hba->ldapbindpasswd) - options[noptions++] = - CStringGetTextDatum(psprintf("ldapbindpasswd=%s", - hba->ldapbindpasswd)); - - if (hba->ldapsearchattribute) - options[noptions++] = - CStringGetTextDatum(psprintf("ldapsearchattribute=%s", - hba->ldapsearchattribute)); - - if (hba->ldapsearchfilter) - options[noptions++] = - CStringGetTextDatum(psprintf("ldapsearchfilter=%s", - hba->ldapsearchfilter)); - - if (hba->ldapscope) - options[noptions++] = - CStringGetTextDatum(psprintf("ldapscope=%d", hba->ldapscope)); - } - - if (hba->auth_method == uaRADIUS) - { - if (hba->radiusservers_s) - options[noptions++] = - CStringGetTextDatum(psprintf("radiusservers=%s", hba->radiusservers_s)); - - if (hba->radiussecrets_s) - options[noptions++] = - CStringGetTextDatum(psprintf("radiussecrets=%s", hba->radiussecrets_s)); - - if (hba->radiusidentifiers_s) - options[noptions++] = - CStringGetTextDatum(psprintf("radiusidentifiers=%s", hba->radiusidentifiers_s)); - - if (hba->radiusports_s) - options[noptions++] = - CStringGetTextDatum(psprintf("radiusports=%s", hba->radiusports_s)); - } - - /* If you add more options, consider increasing MAX_HBA_OPTIONS. */ - Assert(noptions <= MAX_HBA_OPTIONS); - - if (noptions > 0) - return construct_array(options, noptions, TEXTOID, -1, false, TYPALIGN_INT); - else - return NULL; -} - -/* Number of columns in pg_hba_file_rules view */ -#define NUM_PG_HBA_FILE_RULES_ATTS 9 - -/* - * fill_hba_line: build one row of pg_hba_file_rules view, add it to tuplestore - * - * tuple_store: where to store data - * tupdesc: tuple descriptor for the view - * lineno: pg_hba.conf line number (must always be valid) - * hba: parsed line data (can be NULL, in which case err_msg should be set) - * err_msg: error message (NULL if none) - * - * Note: leaks memory, but we don't care since this is run in a short-lived - * memory context. - */ -static void -fill_hba_line(Tuplestorestate *tuple_store, TupleDesc tupdesc, - int lineno, HbaLine *hba, const char *err_msg) -{ - Datum values[NUM_PG_HBA_FILE_RULES_ATTS]; - bool nulls[NUM_PG_HBA_FILE_RULES_ATTS]; - char buffer[NI_MAXHOST]; - HeapTuple tuple; - int index; - ListCell *lc; - const char *typestr; - const char *addrstr; - const char *maskstr; - ArrayType *options; - - Assert(tupdesc->natts == NUM_PG_HBA_FILE_RULES_ATTS); - - memset(values, 0, sizeof(values)); - memset(nulls, 0, sizeof(nulls)); - index = 0; - - /* line_number */ - values[index++] = Int32GetDatum(lineno); - - if (hba != NULL) - { - /* type */ - /* Avoid a default: case so compiler will warn about missing cases */ - typestr = NULL; - switch (hba->conntype) - { - case ctLocal: - typestr = "local"; - break; - case ctHost: - typestr = "host"; - break; - case ctHostSSL: - typestr = "hostssl"; - break; - case ctHostNoSSL: - typestr = "hostnossl"; - break; - case ctHostGSS: - typestr = "hostgssenc"; - break; - case ctHostNoGSS: - typestr = "hostnogssenc"; - break; - } - if (typestr) - values[index++] = CStringGetTextDatum(typestr); - else - nulls[index++] = true; - - /* database */ - if (hba->databases) - { - /* - * Flatten HbaToken list to string list. It might seem that we - * should re-quote any quoted tokens, but that has been rejected - * on the grounds that it makes it harder to compare the array - * elements to other system catalogs. That makes entries like - * "all" or "samerole" formally ambiguous ... but users who name - * databases/roles that way are inflicting their own pain. - */ - List *names = NIL; - - foreach(lc, hba->databases) - { - HbaToken *tok = lfirst(lc); - - names = lappend(names, tok->string); - } - values[index++] = PointerGetDatum(strlist_to_textarray(names)); - } - else - nulls[index++] = true; - - /* user */ - if (hba->roles) - { - /* Flatten HbaToken list to string list; see comment above */ - List *roles = NIL; - - foreach(lc, hba->roles) - { - HbaToken *tok = lfirst(lc); - - roles = lappend(roles, tok->string); - } - values[index++] = PointerGetDatum(strlist_to_textarray(roles)); - } - else - nulls[index++] = true; - - /* address and netmask */ - /* Avoid a default: case so compiler will warn about missing cases */ - addrstr = maskstr = NULL; - switch (hba->ip_cmp_method) - { - case ipCmpMask: - if (hba->hostname) - { - addrstr = hba->hostname; - } - else - { - /* - * Note: if pg_getnameinfo_all fails, it'll set buffer to - * "???", which we want to return. - */ - if (hba->addrlen > 0) - { - if (pg_getnameinfo_all(&hba->addr, hba->addrlen, - buffer, sizeof(buffer), - NULL, 0, - NI_NUMERICHOST) == 0) - clean_ipv6_addr(hba->addr.ss_family, buffer); - addrstr = pstrdup(buffer); - } - if (hba->masklen > 0) - { - if (pg_getnameinfo_all(&hba->mask, hba->masklen, - buffer, sizeof(buffer), - NULL, 0, - NI_NUMERICHOST) == 0) - clean_ipv6_addr(hba->mask.ss_family, buffer); - maskstr = pstrdup(buffer); - } - } - break; - case ipCmpAll: - addrstr = "all"; - break; - case ipCmpSameHost: - addrstr = "samehost"; - break; - case ipCmpSameNet: - addrstr = "samenet"; - break; - } - if (addrstr) - values[index++] = CStringGetTextDatum(addrstr); - else - nulls[index++] = true; - if (maskstr) - values[index++] = CStringGetTextDatum(maskstr); - else - nulls[index++] = true; - - /* auth_method */ - values[index++] = CStringGetTextDatum(hba_authname(hba->auth_method)); - - /* options */ - options = gethba_options(hba); - if (options) - values[index++] = PointerGetDatum(options); - else - nulls[index++] = true; - } - else - { - /* no parsing result, so set relevant fields to nulls */ - memset(&nulls[1], true, (NUM_PG_HBA_FILE_RULES_ATTS - 2) * sizeof(bool)); - } - - /* error */ - if (err_msg) - values[NUM_PG_HBA_FILE_RULES_ATTS - 1] = CStringGetTextDatum(err_msg); - else - nulls[NUM_PG_HBA_FILE_RULES_ATTS - 1] = true; - - tuple = heap_form_tuple(tupdesc, values, nulls); - tuplestore_puttuple(tuple_store, tuple); -} - -/* - * Read the pg_hba.conf file and fill the tuplestore with view records. - */ -static void -fill_hba_view(Tuplestorestate *tuple_store, TupleDesc tupdesc) -{ - FILE *file; - List *hba_lines = NIL; - ListCell *line; - MemoryContext linecxt; - MemoryContext hbacxt; - MemoryContext oldcxt; - - /* - * In the unlikely event that we can't open pg_hba.conf, we throw an - * error, rather than trying to report it via some sort of view entry. - * (Most other error conditions should result in a message in a view - * entry.) - */ - file = AllocateFile(HbaFileName, "r"); - if (file == NULL) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open configuration file \"%s\": %m", - HbaFileName))); - - linecxt = tokenize_file(HbaFileName, file, &hba_lines, DEBUG3); - FreeFile(file); - - /* Now parse all the lines */ - hbacxt = AllocSetContextCreate(CurrentMemoryContext, - "hba parser context", - ALLOCSET_SMALL_SIZES); - oldcxt = MemoryContextSwitchTo(hbacxt); - foreach(line, hba_lines) - { - TokenizedLine *tok_line = (TokenizedLine *) lfirst(line); - HbaLine *hbaline = NULL; - - /* don't parse lines that already have errors */ - if (tok_line->err_msg == NULL) - hbaline = parse_hba_line(tok_line, DEBUG3); - - fill_hba_line(tuple_store, tupdesc, tok_line->line_num, - hbaline, tok_line->err_msg); - } - - /* Free tokenizer memory */ - MemoryContextDelete(linecxt); - /* Free parse_hba_line memory */ - MemoryContextSwitchTo(oldcxt); - MemoryContextDelete(hbacxt); -} - -/* - * SQL-accessible SRF to return all the entries in the pg_hba.conf file. - */ -Datum -pg_hba_file_rules(PG_FUNCTION_ARGS) -{ - ReturnSetInfo *rsi; - - /* - * Build tuplestore to hold the result rows. We must use the Materialize - * mode to be safe against HBA file changes while the cursor is open. - * It's also more efficient than having to look up our current position in - * the parsed list every time. - */ - SetSingleFuncCall(fcinfo, 0); - - /* Fill the tuplestore */ - rsi = (ReturnSetInfo *) fcinfo->resultinfo; - fill_hba_view(rsi->setResult, rsi->setDesc); - - PG_RETURN_NULL(); -} - /* * Parse one tokenised line from the ident config file and store the result in @@ -2735,12 +2316,12 @@ pg_hba_file_rules(PG_FUNCTION_ARGS) * NULL. */ static IdentLine * -parse_ident_line(TokenizedLine *tok_line) +parse_ident_line(TokenizedAuthLine *tok_line) { int line_num = tok_line->line_num; ListCell *field; List *tokens; - HbaToken *token; + AuthToken *token; IdentLine *parsedline; Assert(tok_line->fields != NIL); @@ -3026,7 +2607,7 @@ load_ident(void) return false; } - linecxt = tokenize_file(IdentFileName, file, &ident_lines, LOG); + linecxt = tokenize_auth_file(IdentFileName, file, &ident_lines, LOG); FreeFile(file); /* Now parse all the lines */ @@ -3037,7 +2618,7 @@ load_ident(void) oldcxt = MemoryContextSwitchTo(ident_context); foreach(line_cell, ident_lines) { - TokenizedLine *tok_line = (TokenizedLine *) lfirst(line_cell); + TokenizedAuthLine *tok_line = (TokenizedAuthLine *) lfirst(line_cell); /* don't parse lines that already have errors */ if (tok_line->err_msg != NULL) diff --git a/src/backend/utils/adt/Makefile b/src/backend/utils/adt/Makefile index 41b486bcef..7c722ea2ce 100644 --- a/src/backend/utils/adt/Makefile +++ b/src/backend/utils/adt/Makefile @@ -42,6 +42,7 @@ OBJS = \ geo_ops.o \ geo_selfuncs.o \ geo_spgist.o \ + hbafuncs.o \ inet_cidr_ntop.o \ inet_net_pton.o \ int.o \ diff --git a/src/backend/utils/adt/hbafuncs.c b/src/backend/utils/adt/hbafuncs.c new file mode 100644 index 0000000000..f46cd935a1 --- /dev/null +++ b/src/backend/utils/adt/hbafuncs.c @@ -0,0 +1,428 @@ +/*------------------------------------------------------------------------- + * + * hbafuncs.c + * Support functions for SQL views of authentication files. + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/utils/adt/hbafuncs.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "catalog/objectaddress.h" +#include "common/ip.h" +#include "funcapi.h" +#include "libpq/hba.h" +#include "miscadmin.h" +#include "utils/array.h" +#include "utils/builtins.h" +#include "utils/guc.h" + + +static ArrayType *get_hba_options(HbaLine *hba); +static void fill_hba_line(Tuplestorestate *tuple_store, TupleDesc tupdesc, + int lineno, HbaLine *hba, const char *err_msg); +static void fill_hba_view(Tuplestorestate *tuple_store, TupleDesc tupdesc); + + +/* + * This macro specifies the maximum number of authentication options + * that are possible with any given authentication method that is supported. + * Currently LDAP supports 11, and there are 3 that are not dependent on + * the auth method here. It may not actually be possible to set all of them + * at the same time, but we'll set the macro value high enough to be + * conservative and avoid warnings from static analysis tools. + */ +#define MAX_HBA_OPTIONS 14 + +/* + * Create a text array listing the options specified in the HBA line. + * Return NULL if no options are specified. + */ +static ArrayType * +get_hba_options(HbaLine *hba) +{ + int noptions; + Datum options[MAX_HBA_OPTIONS]; + + noptions = 0; + + if (hba->auth_method == uaGSS || hba->auth_method == uaSSPI) + { + if (hba->include_realm) + options[noptions++] = + CStringGetTextDatum("include_realm=true"); + + if (hba->krb_realm) + options[noptions++] = + CStringGetTextDatum(psprintf("krb_realm=%s", hba->krb_realm)); + } + + if (hba->usermap) + options[noptions++] = + CStringGetTextDatum(psprintf("map=%s", hba->usermap)); + + if (hba->clientcert != clientCertOff) + options[noptions++] = + CStringGetTextDatum(psprintf("clientcert=%s", (hba->clientcert == clientCertCA) ? "verify-ca" : "verify-full")); + + if (hba->pamservice) + options[noptions++] = + CStringGetTextDatum(psprintf("pamservice=%s", hba->pamservice)); + + if (hba->auth_method == uaLDAP) + { + if (hba->ldapserver) + options[noptions++] = + CStringGetTextDatum(psprintf("ldapserver=%s", hba->ldapserver)); + + if (hba->ldapport) + options[noptions++] = + CStringGetTextDatum(psprintf("ldapport=%d", hba->ldapport)); + + if (hba->ldaptls) + options[noptions++] = + CStringGetTextDatum("ldaptls=true"); + + if (hba->ldapprefix) + options[noptions++] = + CStringGetTextDatum(psprintf("ldapprefix=%s", hba->ldapprefix)); + + if (hba->ldapsuffix) + options[noptions++] = + CStringGetTextDatum(psprintf("ldapsuffix=%s", hba->ldapsuffix)); + + if (hba->ldapbasedn) + options[noptions++] = + CStringGetTextDatum(psprintf("ldapbasedn=%s", hba->ldapbasedn)); + + if (hba->ldapbinddn) + options[noptions++] = + CStringGetTextDatum(psprintf("ldapbinddn=%s", hba->ldapbinddn)); + + if (hba->ldapbindpasswd) + options[noptions++] = + CStringGetTextDatum(psprintf("ldapbindpasswd=%s", + hba->ldapbindpasswd)); + + if (hba->ldapsearchattribute) + options[noptions++] = + CStringGetTextDatum(psprintf("ldapsearchattribute=%s", + hba->ldapsearchattribute)); + + if (hba->ldapsearchfilter) + options[noptions++] = + CStringGetTextDatum(psprintf("ldapsearchfilter=%s", + hba->ldapsearchfilter)); + + if (hba->ldapscope) + options[noptions++] = + CStringGetTextDatum(psprintf("ldapscope=%d", hba->ldapscope)); + } + + if (hba->auth_method == uaRADIUS) + { + if (hba->radiusservers_s) + options[noptions++] = + CStringGetTextDatum(psprintf("radiusservers=%s", hba->radiusservers_s)); + + if (hba->radiussecrets_s) + options[noptions++] = + CStringGetTextDatum(psprintf("radiussecrets=%s", hba->radiussecrets_s)); + + if (hba->radiusidentifiers_s) + options[noptions++] = + CStringGetTextDatum(psprintf("radiusidentifiers=%s", hba->radiusidentifiers_s)); + + if (hba->radiusports_s) + options[noptions++] = + CStringGetTextDatum(psprintf("radiusports=%s", hba->radiusports_s)); + } + + /* If you add more options, consider increasing MAX_HBA_OPTIONS. */ + Assert(noptions <= MAX_HBA_OPTIONS); + + if (noptions > 0) + return construct_array(options, noptions, TEXTOID, -1, false, TYPALIGN_INT); + else + return NULL; +} + +/* Number of columns in pg_hba_file_rules view */ +#define NUM_PG_HBA_FILE_RULES_ATTS 9 + +/* + * fill_hba_line + * Build one row of pg_hba_file_rules view, add it to tuplestore. + * + * tuple_store: where to store data + * tupdesc: tuple descriptor for the view + * lineno: pg_hba.conf line number (must always be valid) + * hba: parsed line data (can be NULL, in which case err_msg should be set) + * err_msg: error message (NULL if none) + * + * Note: leaks memory, but we don't care since this is run in a short-lived + * memory context. + */ +static void +fill_hba_line(Tuplestorestate *tuple_store, TupleDesc tupdesc, + int lineno, HbaLine *hba, const char *err_msg) +{ + Datum values[NUM_PG_HBA_FILE_RULES_ATTS]; + bool nulls[NUM_PG_HBA_FILE_RULES_ATTS]; + char buffer[NI_MAXHOST]; + HeapTuple tuple; + int index; + ListCell *lc; + const char *typestr; + const char *addrstr; + const char *maskstr; + ArrayType *options; + + Assert(tupdesc->natts == NUM_PG_HBA_FILE_RULES_ATTS); + + memset(values, 0, sizeof(values)); + memset(nulls, 0, sizeof(nulls)); + index = 0; + + /* line_number */ + values[index++] = Int32GetDatum(lineno); + + if (hba != NULL) + { + /* type */ + /* Avoid a default: case so compiler will warn about missing cases */ + typestr = NULL; + switch (hba->conntype) + { + case ctLocal: + typestr = "local"; + break; + case ctHost: + typestr = "host"; + break; + case ctHostSSL: + typestr = "hostssl"; + break; + case ctHostNoSSL: + typestr = "hostnossl"; + break; + case ctHostGSS: + typestr = "hostgssenc"; + break; + case ctHostNoGSS: + typestr = "hostnogssenc"; + break; + } + if (typestr) + values[index++] = CStringGetTextDatum(typestr); + else + nulls[index++] = true; + + /* database */ + if (hba->databases) + { + /* + * Flatten AuthToken list to string list. It might seem that we + * should re-quote any quoted tokens, but that has been rejected + * on the grounds that it makes it harder to compare the array + * elements to other system catalogs. That makes entries like + * "all" or "samerole" formally ambiguous ... but users who name + * databases/roles that way are inflicting their own pain. + */ + List *names = NIL; + + foreach(lc, hba->databases) + { + AuthToken *tok = lfirst(lc); + + names = lappend(names, tok->string); + } + values[index++] = PointerGetDatum(strlist_to_textarray(names)); + } + else + nulls[index++] = true; + + /* user */ + if (hba->roles) + { + /* Flatten AuthToken list to string list; see comment above */ + List *roles = NIL; + + foreach(lc, hba->roles) + { + AuthToken *tok = lfirst(lc); + + roles = lappend(roles, tok->string); + } + values[index++] = PointerGetDatum(strlist_to_textarray(roles)); + } + else + nulls[index++] = true; + + /* address and netmask */ + /* Avoid a default: case so compiler will warn about missing cases */ + addrstr = maskstr = NULL; + switch (hba->ip_cmp_method) + { + case ipCmpMask: + if (hba->hostname) + { + addrstr = hba->hostname; + } + else + { + /* + * Note: if pg_getnameinfo_all fails, it'll set buffer to + * "???", which we want to return. + */ + if (hba->addrlen > 0) + { + if (pg_getnameinfo_all(&hba->addr, hba->addrlen, + buffer, sizeof(buffer), + NULL, 0, + NI_NUMERICHOST) == 0) + clean_ipv6_addr(hba->addr.ss_family, buffer); + addrstr = pstrdup(buffer); + } + if (hba->masklen > 0) + { + if (pg_getnameinfo_all(&hba->mask, hba->masklen, + buffer, sizeof(buffer), + NULL, 0, + NI_NUMERICHOST) == 0) + clean_ipv6_addr(hba->mask.ss_family, buffer); + maskstr = pstrdup(buffer); + } + } + break; + case ipCmpAll: + addrstr = "all"; + break; + case ipCmpSameHost: + addrstr = "samehost"; + break; + case ipCmpSameNet: + addrstr = "samenet"; + break; + } + if (addrstr) + values[index++] = CStringGetTextDatum(addrstr); + else + nulls[index++] = true; + if (maskstr) + values[index++] = CStringGetTextDatum(maskstr); + else + nulls[index++] = true; + + /* auth_method */ + values[index++] = CStringGetTextDatum(hba_authname(hba->auth_method)); + + /* options */ + options = get_hba_options(hba); + if (options) + values[index++] = PointerGetDatum(options); + else + nulls[index++] = true; + } + else + { + /* no parsing result, so set relevant fields to nulls */ + memset(&nulls[1], true, (NUM_PG_HBA_FILE_RULES_ATTS - 2) * sizeof(bool)); + } + + /* error */ + if (err_msg) + values[NUM_PG_HBA_FILE_RULES_ATTS - 1] = CStringGetTextDatum(err_msg); + else + nulls[NUM_PG_HBA_FILE_RULES_ATTS - 1] = true; + + tuple = heap_form_tuple(tupdesc, values, nulls); + tuplestore_puttuple(tuple_store, tuple); +} + +/* + * fill_hba_view + * Read the pg_hba.conf file and fill the tuplestore with view records. + */ +static void +fill_hba_view(Tuplestorestate *tuple_store, TupleDesc tupdesc) +{ + FILE *file; + List *hba_lines = NIL; + ListCell *line; + MemoryContext linecxt; + MemoryContext hbacxt; + MemoryContext oldcxt; + + /* + * In the unlikely event that we can't open pg_hba.conf, we throw an + * error, rather than trying to report it via some sort of view entry. + * (Most other error conditions should result in a message in a view + * entry.) + */ + file = AllocateFile(HbaFileName, "r"); + if (file == NULL) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open configuration file \"%s\": %m", + HbaFileName))); + + linecxt = tokenize_auth_file(HbaFileName, file, &hba_lines, DEBUG3); + FreeFile(file); + + /* Now parse all the lines */ + hbacxt = AllocSetContextCreate(CurrentMemoryContext, + "hba parser context", + ALLOCSET_SMALL_SIZES); + oldcxt = MemoryContextSwitchTo(hbacxt); + foreach(line, hba_lines) + { + TokenizedAuthLine *tok_line = (TokenizedAuthLine *) lfirst(line); + HbaLine *hbaline = NULL; + + /* don't parse lines that already have errors */ + if (tok_line->err_msg == NULL) + hbaline = parse_hba_line(tok_line, DEBUG3); + + fill_hba_line(tuple_store, tupdesc, tok_line->line_num, + hbaline, tok_line->err_msg); + } + + /* Free tokenizer memory */ + MemoryContextDelete(linecxt); + /* Free parse_hba_line memory */ + MemoryContextSwitchTo(oldcxt); + MemoryContextDelete(hbacxt); +} + +/* + * pg_hba_file_rules + * + * SQL-accessible set-returning function to return all the entries in the + * pg_hba.conf file. + */ +Datum +pg_hba_file_rules(PG_FUNCTION_ARGS) +{ + ReturnSetInfo *rsi; + + /* + * Build tuplestore to hold the result rows. We must use the Materialize + * mode to be safe against HBA file changes while the cursor is open. It's + * also more efficient than having to look up our current position in the + * parsed list every time. + */ + SetSingleFuncCall(fcinfo, 0); + + /* Fill the tuplestore */ + rsi = (ReturnSetInfo *) fcinfo->resultinfo; + fill_hba_view(rsi->setResult, rsi->setDesc); + + PG_RETURN_NULL(); +} diff --git a/src/include/libpq/hba.h b/src/include/libpq/hba.h index 8d9f3821b1..13ecb329f8 100644 --- a/src/include/libpq/hba.h +++ b/src/include/libpq/hba.h @@ -132,6 +132,34 @@ typedef struct IdentLine regex_t re; } IdentLine; +/* + * A single string token lexed from an authentication configuration file + * (pg_ident.conf or pg_hba.conf), together with whether the token has + * been quoted. + */ +typedef struct AuthToken +{ + char *string; + bool quoted; +} AuthToken; + +/* + * TokenizedAuthLine represents one line lexed from an authentication + * configuration file. Each item in the "fields" list is a sub-list of + * AuthTokens. We don't emit a TokenizedAuthLine for empty or all-comment + * lines, so "fields" is never NIL (nor are any of its sub-lists). + * + * Exception: if an error occurs during tokenization, we might have + * fields == NIL, in which case err_msg != NULL. + */ +typedef struct TokenizedAuthLine +{ + List *fields; /* List of lists of AuthTokens */ + int line_num; /* Line number */ + char *raw_line; /* Raw line text */ + char *err_msg; /* Error message if any */ +} TokenizedAuthLine; + /* kluge to avoid including libpq/libpq-be.h here */ typedef struct Port hbaPort; @@ -142,6 +170,9 @@ extern void hba_getauthmethod(hbaPort *port); extern int check_usermap(const char *usermap_name, const char *pg_role, const char *auth_user, bool case_sensitive); +extern HbaLine *parse_hba_line(TokenizedAuthLine *tok_line, int elevel); extern bool pg_isblank(const char c); +extern MemoryContext tokenize_auth_file(const char *filename, FILE *file, + List **tok_lines, int elevel); #endif /* HBA_H */ diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 93d5190508..49688036a7 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -153,6 +153,7 @@ AttrMissing AttrNumber AttributeOpts AuthRequest +AuthToken AutoPrewarmSharedState AutoVacOpts AutoVacuumShmemStruct @@ -1063,7 +1064,6 @@ HashState HashTapeInfo HashValueFunc HbaLine -HbaToken HeadlineJsonState HeadlineParsedText HeadlineWordEntry @@ -2699,7 +2699,7 @@ ToastTupleContext ToastedAttribute TocEntry TokenAuxData -TokenizedLine +TokenizedAuthLine TrackItem TransInvalidationInfo TransState From ac9c5dc5d4cc15e396b59ca66df25969e51a2a00 Mon Sep 17 00:00:00 2001 From: Tatsuo Ishii Date: Thu, 24 Mar 2022 13:32:59 +0900 Subject: [PATCH 233/772] Fix pgbench TAP test. Bildfarm member prairiedog reported a pgbench TAP test failure after commit: 4a39f87acd6e681e5ded1239391d8a92645b43d6. This commit attempts to fix some copy&paste errors introduced in the previous commit. Author: Yugo Nagata Reported-by: Tom Lane Discussion: https://postgr.es/m/2775989.1648060014%40sss.pgh.pa.us --- src/bin/pgbench/t/001_pgbench_with_server.pl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bin/pgbench/t/001_pgbench_with_server.pl b/src/bin/pgbench/t/001_pgbench_with_server.pl index d173ceae7a..3eb5905e5a 100644 --- a/src/bin/pgbench/t/001_pgbench_with_server.pl +++ b/src/bin/pgbench/t/001_pgbench_with_server.pl @@ -1222,7 +1222,8 @@ sub check_pgbench_logs # Check that we have a serialization error and the same random value of the # delta variable in the next try my $err_pattern = - "client (0|1) got an error in command 3 \\(SQL\\) of script 0; " + "(client (0|1) sending UPDATE xy SET y = y \\+ -?\\d+\\b).*" + . "client \\g2 got an error in command 3 \\(SQL\\) of script 0; " . "ERROR: could not serialize access due to concurrent update\\b.*" . "\\g1"; From 127aea2a65cd89c1c28357c6db199683e219491e Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Thu, 24 Mar 2022 20:58:20 +1300 Subject: [PATCH 234/772] Add additional filtering options to pg_waldump. Allow filtering by RelFileNode, BlockNumber, ForkNum and FPW. Author: David Christensen Reviewed-by: Japin Li Reviewed-by: Bharath Rupireddy Reviewed-by: Cary Huang Reviewed-by: Thomas Munro Discussion: https://postgr.es/m/lzzgmgm6e5.fsf%40veeddrois.attlocal.net --- doc/src/sgml/ref/pg_waldump.sgml | 49 +++++++++++ src/bin/pg_waldump/pg_waldump.c | 144 ++++++++++++++++++++++++++++++- 2 files changed, 192 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/pg_waldump.sgml b/doc/src/sgml/ref/pg_waldump.sgml index 5735a161ce..981d3c9038 100644 --- a/doc/src/sgml/ref/pg_waldump.sgml +++ b/doc/src/sgml/ref/pg_waldump.sgml @@ -100,6 +100,45 @@ PostgreSQL documentation + + + + + + Only display records that modify the given block. The relation must + also be provided with or + . + + + + + + + + + + If provided, only display records that modify blocks in the given fork. + The valid values are 0 for the main fork, + 1 for the free space map, + 2 for the visibility map, + and 3 for the init fork. + + + + + + + + + + Only display records that modify blocks in the given relation. The + relation is specified with tablespace OID, database OID, and relfilenode + separated by slashes, for example 1234/12345/12345. + This is the same format used for relations in the program's output. + + + + @@ -183,6 +222,16 @@ PostgreSQL documentation + + + + + + Only display records that include full page images. + + + + diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index fc081adfb8..92238f30c9 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -31,6 +31,8 @@ static const char *progname; static int WalSegSz; static volatile sig_atomic_t time_to_stop = false; +static const RelFileNode emptyRelFileNode = {0, 0, 0}; + typedef struct XLogDumpPrivate { TimeLineID timeline; @@ -55,6 +57,13 @@ typedef struct XLogDumpConfig bool filter_by_rmgr_enabled; TransactionId filter_by_xid; bool filter_by_xid_enabled; + RelFileNode filter_by_relation; + bool filter_by_extended; + bool filter_by_relation_enabled; + BlockNumber filter_by_relation_block; + bool filter_by_relation_block_enabled; + ForkNumber filter_by_relation_forknum; + bool filter_by_fpw; } XLogDumpConfig; typedef struct Stats @@ -391,6 +400,59 @@ WALDumpReadPage(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, return count; } +/* + * Boolean to return whether the given WAL record matches a specific relation + * and optionally block. + */ +static bool +XLogRecordMatchesRelationBlock(XLogReaderState *record, + RelFileNode matchRnode, + BlockNumber matchBlock, + ForkNumber matchFork) +{ + int block_id; + + for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) + { + RelFileNode rnode; + ForkNumber forknum; + BlockNumber blk; + + if (!XLogRecHasBlockRef(record, block_id)) + continue; + + XLogRecGetBlockTag(record, block_id, &rnode, &forknum, &blk); + + if ((matchFork == InvalidForkNumber || matchFork == forknum) && + (RelFileNodeEquals(matchRnode, emptyRelFileNode) || + RelFileNodeEquals(matchRnode, rnode)) && + (matchBlock == InvalidBlockNumber || matchBlock == blk)) + return true; + } + + return false; +} + +/* + * Boolean to return whether the given WAL record contains a full page write. + */ +static bool +XLogRecordHasFPW(XLogReaderState *record) +{ + int block_id; + + for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) + { + if (!XLogRecHasBlockRef(record, block_id)) + continue; + + if (XLogRecHasBlockImage(record, block_id)) + return true; + } + + return false; +} + /* * Calculate the size of a record, split into !FPI and FPI parts. */ @@ -765,6 +827,10 @@ usage(void) printf(_(" -b, --bkp-details output detailed information about backup blocks\n")); printf(_(" -e, --end=RECPTR stop reading at WAL location RECPTR\n")); printf(_(" -f, --follow keep retrying after reaching end of WAL\n")); + printf(_(" -k, --block=N with --relation, only show records matching this block\n")); + printf(_(" -F, --fork=N only show records matching a specific fork number\n" + " (defaults to showing all)\n")); + printf(_(" -l, --relation=N/N/N only show records that affect a specific relation\n")); printf(_(" -n, --limit=N number of records to display\n")); printf(_(" -p, --path=PATH directory in which to find log segment files or a\n" " directory with a ./pg_wal that contains such files\n" @@ -777,6 +843,7 @@ usage(void) " (default: 1 or the value used in STARTSEG)\n")); printf(_(" -V, --version output version information, then exit\n")); printf(_(" -x, --xid=XID only show records with transaction ID XID\n")); + printf(_(" -w, --fullpage only show records with a full page write\n")); printf(_(" -z, --stats[=record] show statistics instead of records\n" " (optionally, show per-record statistics)\n")); printf(_(" -?, --help show this help, then exit\n")); @@ -800,12 +867,16 @@ main(int argc, char **argv) static struct option long_options[] = { {"bkp-details", no_argument, NULL, 'b'}, + {"block", required_argument, NULL, 'k'}, {"end", required_argument, NULL, 'e'}, {"follow", no_argument, NULL, 'f'}, + {"fork", required_argument, NULL, 'F'}, + {"fullpage", no_argument, NULL, 'w'}, {"help", no_argument, NULL, '?'}, {"limit", required_argument, NULL, 'n'}, {"path", required_argument, NULL, 'p'}, {"quiet", no_argument, NULL, 'q'}, + {"relation", required_argument, NULL, 'l'}, {"rmgr", required_argument, NULL, 'r'}, {"start", required_argument, NULL, 's'}, {"timeline", required_argument, NULL, 't'}, @@ -858,6 +929,11 @@ main(int argc, char **argv) config.filter_by_rmgr_enabled = false; config.filter_by_xid = InvalidTransactionId; config.filter_by_xid_enabled = false; + config.filter_by_extended = false; + config.filter_by_relation_enabled = false; + config.filter_by_relation_block_enabled = false; + config.filter_by_relation_forknum = InvalidForkNumber; + config.filter_by_fpw = false; config.stats = false; config.stats_per_record = false; @@ -870,7 +946,7 @@ main(int argc, char **argv) goto bad_argument; } - while ((option = getopt_long(argc, argv, "be:fn:p:qr:s:t:x:z", + while ((option = getopt_long(argc, argv, "be:fF:k:l:n:p:qr:s:t:wx:z", long_options, &optindex)) != -1) { switch (option) @@ -890,6 +966,47 @@ main(int argc, char **argv) case 'f': config.follow = true; break; + case 'F': + { + unsigned int forknum; + + if (sscanf(optarg, "%u", &forknum) != 1 || + forknum > MAX_FORKNUM) + { + pg_log_error("could not parse valid fork number (0..%d) \"%s\"", + MAX_FORKNUM, optarg); + goto bad_argument; + } + config.filter_by_relation_forknum = (ForkNumber) forknum; + config.filter_by_extended = true; + } + break; + case 'k': + if (sscanf(optarg, "%u", &config.filter_by_relation_block) != 1 || + !BlockNumberIsValid(config.filter_by_relation_block)) + { + pg_log_error("could not parse valid block number \"%s\"", optarg); + goto bad_argument; + } + config.filter_by_relation_block_enabled = true; + config.filter_by_extended = true; + break; + case 'l': + if (sscanf(optarg, "%u/%u/%u", + &config.filter_by_relation.spcNode, + &config.filter_by_relation.dbNode, + &config.filter_by_relation.relNode) != 3 || + !OidIsValid(config.filter_by_relation.spcNode) || + !OidIsValid(config.filter_by_relation.relNode)) + { + pg_log_error("could not parse valid relation from \"%s\"" + " (expecting \"tablespace OID/database OID/" + "relation filenode\")", optarg); + goto bad_argument; + } + config.filter_by_relation_enabled = true; + config.filter_by_extended = true; + break; case 'n': if (sscanf(optarg, "%d", &config.stop_after_records) != 1) { @@ -947,6 +1064,9 @@ main(int argc, char **argv) goto bad_argument; } break; + case 'w': + config.filter_by_fpw = true; + break; case 'x': if (sscanf(optarg, "%u", &config.filter_by_xid) != 1) { @@ -976,6 +1096,13 @@ main(int argc, char **argv) } } + if (config.filter_by_relation_block_enabled && + !config.filter_by_relation_enabled) + { + pg_log_error("--block option requires --relation option to be specified"); + goto bad_argument; + } + if ((optind + 2) < argc) { pg_log_error("too many command-line arguments (first is \"%s\")", @@ -1148,6 +1275,21 @@ main(int argc, char **argv) config.filter_by_xid != record->xl_xid) continue; + /* check for extended filtering */ + if (config.filter_by_extended && + !XLogRecordMatchesRelationBlock(xlogreader_state, + config.filter_by_relation_enabled ? + config.filter_by_relation : + emptyRelFileNode, + config.filter_by_relation_block_enabled ? + config.filter_by_relation_block : + InvalidBlockNumber, + config.filter_by_relation_forknum)) + continue; + + if (config.filter_by_fpw && !XLogRecordHasFPW(xlogreader_state)) + continue; + /* perform any per-record work */ if (!config.quiet) { From bbd4951b73ec5ba4356133140da19cf378a796fd Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 24 Mar 2022 20:56:31 +0900 Subject: [PATCH 235/772] doc: Improve postgres command for shared_memory_size_in_huge_pages The command used in the documentation to retrieve the value of the runtime-computed GUC shared_memory_size_in_huge_pages would also show to the user all the log messages generated by the postmaster before and after printing the wanted value. This can be confusing, as the wanted result could be masked with a lot of noise. One way to avoid those log messages is to use something like "-c log_min_messages=fatal" in the command (my idea, but that's not common knowledge). Rather than mentioning this option, suffix the command with a redirection of stderr to /dev/null, which is the stream location where the logs show up. This is enough to show only the GUC value to the user when copy-pasting the command. Reported-by: Magnus Hagander Author: Nathan Bossart Discussion: https://postgr.es/m/20220314173417.GA1020555@nathanxps13 --- doc/src/sgml/runtime.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml index ffb0b6f287..3a463f12d7 100644 --- a/doc/src/sgml/runtime.sgml +++ b/doc/src/sgml/runtime.sgml @@ -1448,7 +1448,7 @@ export PG_OOM_ADJUST_VALUE=0 server must be shut down to view this runtime-computed parameter. This might look like: -$ postgres -D $PGDATA -C shared_memory_size_in_huge_pages +$ postgres -D $PGDATA -C shared_memory_size_in_huge_pages 2> /dev/null 3170 $ grep ^Hugepagesize /proc/meminfo Hugepagesize: 2048 kB From a47651447f01562dac2e007db03733e750d45b6b Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 24 Mar 2022 14:06:08 +0100 Subject: [PATCH 236/772] Remove unnecessary translator comment Discussion: https://www.postgresql.org/message-id/flat/CALj2ACUfJKTmK5v%3DvF%2BH2iLkqM9Yvjsp6iXaCqAks6gDpzZh6g%40mail.gmail.com --- src/backend/catalog/dependency.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index ab9e42d7d1..25fe56d310 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -1199,7 +1199,6 @@ reportDependentObjects(const ObjectAddresses *targetObjects, else if (numReportedClient > 1) { ereport(msglevel, - /* translator: %d always has a value larger than 1 */ (errmsg_plural("drop cascades to %d other object", "drop cascades to %d other objects", numReportedClient + numNotReportedClient, From 0bd7af082ace135581bb13a6bd2d88e68c66a3e0 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 24 Mar 2022 11:47:41 -0400 Subject: [PATCH 237/772] Invent recursive_worktable_factor GUC to replace hard-wired constant. Up to now, the planner estimated the size of a recursive query's worktable as 10 times the size of the non-recursive term. It's hard to see how to do significantly better than that automatically, but we can give users control over the multiplier to allow tuning for specific use-cases. The default behavior remains the same. Simon Riggs Discussion: https://postgr.es/m/CANbhV-EuaLm4H3g0+BSTYHEGxJj3Kht0R+rJ8vT57Dejnh=_nA@mail.gmail.com --- doc/src/sgml/config.sgml | 23 +++++++++++++++++++ src/backend/optimizer/path/costsize.c | 8 ++++--- src/backend/utils/misc/guc.c | 12 ++++++++++ src/backend/utils/misc/postgresql.conf.sample | 1 + src/include/optimizer/cost.h | 2 ++ src/include/optimizer/optimizer.h | 1 + 6 files changed, 44 insertions(+), 3 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 7a48973b3c..05df48131d 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -5919,6 +5919,29 @@ SELECT * FROM parent WHERE key = 2400; + + recursive_worktable_factor (floating point) + + recursive_worktable_factor configuration parameter + + + + + Sets the planner's estimate of the average size of the working + table of a recursive + query, as a multiple of the estimated size of the initial + non-recursive term of the query. This helps the planner choose + the most appropriate method for joining the working table to the + query's other tables. + The default value is 10.0. A smaller value + such as 1.0 can be helpful when the recursion + has low fan-out from one step to the next, as for + example in shortest-path queries. Graph analytics queries may + benefit from larger-than-default values. + + + + diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 4d9f3b4bb6..1b07ea392d 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -123,6 +123,7 @@ double cpu_index_tuple_cost = DEFAULT_CPU_INDEX_TUPLE_COST; double cpu_operator_cost = DEFAULT_CPU_OPERATOR_COST; double parallel_tuple_cost = DEFAULT_PARALLEL_TUPLE_COST; double parallel_setup_cost = DEFAULT_PARALLEL_SETUP_COST; +double recursive_worktable_factor = DEFAULT_RECURSIVE_WORKTABLE_FACTOR; int effective_cache_size = DEFAULT_EFFECTIVE_CACHE_SIZE; @@ -5665,10 +5666,11 @@ set_cte_size_estimates(PlannerInfo *root, RelOptInfo *rel, double cte_rows) if (rte->self_reference) { /* - * In a self-reference, arbitrarily assume the average worktable size - * is about 10 times the nonrecursive term's size. + * In a self-reference, we assume the average worktable size is a + * multiple of the nonrecursive term's size. The best multiplier will + * vary depending on query "fan-out", so make its value adjustable. */ - rel->tuples = 10 * cte_rows; + rel->tuples = clamp_row_est(recursive_worktable_factor * cte_rows); } else { diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index f70f7f5c01..b86137dc38 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -3740,6 +3740,18 @@ static struct config_real ConfigureNamesReal[] = NULL, NULL, NULL }, + { + {"recursive_worktable_factor", PGC_USERSET, QUERY_TUNING_OTHER, + gettext_noop("Sets the planner's estimate of the average size " + "of a recursive query's working table."), + NULL, + GUC_EXPLAIN + }, + &recursive_worktable_factor, + DEFAULT_RECURSIVE_WORKTABLE_FACTOR, 0.001, 1000000.0, + NULL, NULL, NULL + }, + { {"geqo_selection_bias", PGC_USERSET, QUERY_TUNING_GEQO, gettext_noop("GEQO: selective pressure within the population."), diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 4cf5b26a36..b933fade8c 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -426,6 +426,7 @@ # JOIN clauses #plan_cache_mode = auto # auto, force_generic_plan or # force_custom_plan +#recursive_worktable_factor = 10.0 # range 0.001-1000000 #------------------------------------------------------------------------------ diff --git a/src/include/optimizer/cost.h b/src/include/optimizer/cost.h index 356a51f370..bc12071af6 100644 --- a/src/include/optimizer/cost.h +++ b/src/include/optimizer/cost.h @@ -29,6 +29,8 @@ #define DEFAULT_PARALLEL_TUPLE_COST 0.1 #define DEFAULT_PARALLEL_SETUP_COST 1000.0 +/* defaults for non-Cost parameters */ +#define DEFAULT_RECURSIVE_WORKTABLE_FACTOR 10.0 #define DEFAULT_EFFECTIVE_CACHE_SIZE 524288 /* measured in pages */ typedef enum diff --git a/src/include/optimizer/optimizer.h b/src/include/optimizer/optimizer.h index 6b8ee0c69f..2302ab6d54 100644 --- a/src/include/optimizer/optimizer.h +++ b/src/include/optimizer/optimizer.h @@ -91,6 +91,7 @@ extern PGDLLIMPORT double cpu_index_tuple_cost; extern PGDLLIMPORT double cpu_operator_cost; extern PGDLLIMPORT double parallel_tuple_cost; extern PGDLLIMPORT double parallel_setup_cost; +extern PGDLLIMPORT double recursive_worktable_factor; extern PGDLLIMPORT int effective_cache_size; extern double clamp_row_est(double nrows); From e27f4ee0a701854daf16ac1d044f20d28a17053e Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 24 Mar 2022 18:02:27 +0100 Subject: [PATCH 238/772] Change fastgetattr and heap_getattr to inline functions They were macros previously, but recent callsite additions made Coverity complain about one of the assertions being always true. This change could have been made a long time ago, but the Coverity complain broke the inertia. Reviewed-by: Michael Paquier Reviewed-by: Japin Li Reviewed-by: Peter Eisentraut Discussion: https://postgr.es/m/202203241021.uts52sczx3al@alvherre.pgsql --- src/backend/access/heap/heapam.c | 46 --------- src/include/access/htup_details.h | 151 ++++++++++++++---------------- 2 files changed, 69 insertions(+), 128 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 3746336a09..74ad445e59 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -1131,52 +1131,6 @@ heapgettup_pagemode(HeapScanDesc scan, } -#if defined(DISABLE_COMPLEX_MACRO) -/* - * This is formatted so oddly so that the correspondence to the macro - * definition in access/htup_details.h is maintained. - */ -Datum -fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, - bool *isnull) -{ - return ( - (attnum) > 0 ? - ( - (*(isnull) = false), - HeapTupleNoNulls(tup) ? - ( - TupleDescAttr((tupleDesc), (attnum) - 1)->attcacheoff >= 0 ? - ( - fetchatt(TupleDescAttr((tupleDesc), (attnum) - 1), - (char *) (tup)->t_data + (tup)->t_data->t_hoff + - TupleDescAttr((tupleDesc), (attnum) - 1)->attcacheoff) - ) - : - nocachegetattr((tup), (attnum), (tupleDesc)) - ) - : - ( - att_isnull((attnum) - 1, (tup)->t_data->t_bits) ? - ( - (*(isnull) = true), - (Datum) NULL - ) - : - ( - nocachegetattr((tup), (attnum), (tupleDesc)) - ) - ) - ) - : - ( - (Datum) NULL - ) - ); -} -#endif /* defined(DISABLE_COMPLEX_MACRO) */ - - /* ---------------------------------------------------------------- * heap access method interface * ---------------------------------------------------------------- diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h index b2d52ed16c..de0b91e1fa 100644 --- a/src/include/access/htup_details.h +++ b/src/include/access/htup_details.h @@ -690,88 +690,6 @@ struct MinimalTupleData #define HeapTupleClearHeapOnly(tuple) \ HeapTupleHeaderClearHeapOnly((tuple)->t_data) - -/* ---------------- - * fastgetattr - * - * Fetch a user attribute's value as a Datum (might be either a - * value, or a pointer into the data area of the tuple). - * - * This must not be used when a system attribute might be requested. - * Furthermore, the passed attnum MUST be valid. Use heap_getattr() - * instead, if in doubt. - * - * This gets called many times, so we macro the cacheable and NULL - * lookups, and call nocachegetattr() for the rest. - * ---------------- - */ - -#if !defined(DISABLE_COMPLEX_MACRO) - -#define fastgetattr(tup, attnum, tupleDesc, isnull) \ -( \ - AssertMacro((attnum) > 0), \ - (*(isnull) = false), \ - HeapTupleNoNulls(tup) ? \ - ( \ - TupleDescAttr((tupleDesc), (attnum)-1)->attcacheoff >= 0 ? \ - ( \ - fetchatt(TupleDescAttr((tupleDesc), (attnum)-1), \ - (char *) (tup)->t_data + (tup)->t_data->t_hoff + \ - TupleDescAttr((tupleDesc), (attnum)-1)->attcacheoff)\ - ) \ - : \ - nocachegetattr((tup), (attnum), (tupleDesc)) \ - ) \ - : \ - ( \ - att_isnull((attnum)-1, (tup)->t_data->t_bits) ? \ - ( \ - (*(isnull) = true), \ - (Datum)NULL \ - ) \ - : \ - ( \ - nocachegetattr((tup), (attnum), (tupleDesc)) \ - ) \ - ) \ -) -#else /* defined(DISABLE_COMPLEX_MACRO) */ - -extern Datum fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, - bool *isnull); -#endif /* defined(DISABLE_COMPLEX_MACRO) */ - - -/* ---------------- - * heap_getattr - * - * Extract an attribute of a heap tuple and return it as a Datum. - * This works for either system or user attributes. The given attnum - * is properly range-checked. - * - * If the field in question has a NULL value, we return a zero Datum - * and set *isnull == true. Otherwise, we set *isnull == false. - * - * is the pointer to the heap tuple. is the attribute - * number of the column (field) caller wants. is a - * pointer to the structure describing the row and all its fields. - * ---------------- - */ -#define heap_getattr(tup, attnum, tupleDesc, isnull) \ - ( \ - ((attnum) > 0) ? \ - ( \ - ((attnum) > (int) HeapTupleHeaderGetNatts((tup)->t_data)) ? \ - getmissingattr((tupleDesc), (attnum), (isnull)) \ - : \ - fastgetattr((tup), (attnum), (tupleDesc), (isnull)) \ - ) \ - : \ - heap_getsysattr((tup), (attnum), (tupleDesc), (isnull)) \ - ) - - /* prototypes for functions in common/heaptuple.c */ extern Size heap_compute_data_size(TupleDesc tupleDesc, Datum *values, bool *isnull); @@ -815,4 +733,73 @@ extern size_t varsize_any(void *p); extern HeapTuple heap_expand_tuple(HeapTuple sourceTuple, TupleDesc tupleDesc); extern MinimalTuple minimal_expand_tuple(HeapTuple sourceTuple, TupleDesc tupleDesc); +/* + * fastgetattr + * Fetch a user attribute's value as a Datum (might be either a + * value, or a pointer into the data area of the tuple). + * + * This must not be used when a system attribute might be requested. + * Furthermore, the passed attnum MUST be valid. Use heap_getattr() + * instead, if in doubt. + * + * This gets called many times, so we macro the cacheable and NULL + * lookups, and call nocachegetattr() for the rest. + */ +static inline Datum +fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull) +{ + AssertMacro(attnum > 0); + + *isnull = false; + if (HeapTupleNoNulls(tup)) + { + Form_pg_attribute att; + + att = TupleDescAttr(tupleDesc, attnum - 1); + if (att->attcacheoff >= 0) + return fetchatt(att, (char *) tup->t_data + tup->t_data->t_hoff + + att->attcacheoff); + else + return nocachegetattr(tup, attnum, tupleDesc); + } + else + { + if (att_isnull(attnum - 1, tup->t_data->t_bits)) + { + *isnull = true; + return (Datum) NULL; + } + else + return nocachegetattr(tup, attnum, tupleDesc); + } +} + +/* + * heap_getattr + * Extract an attribute of a heap tuple and return it as a Datum. + * This works for either system or user attributes. The given attnum + * is properly range-checked. + * + * If the field in question has a NULL value, we return a zero Datum + * and set *isnull == true. Otherwise, we set *isnull == false. + * + * is the pointer to the heap tuple. is the attribute + * number of the column (field) caller wants. is a + * pointer to the structure describing the row and all its fields. + * + */ +static inline Datum +heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull) +{ + if (attnum > 0) + { + if (attnum > (int) HeapTupleHeaderGetNatts(tup->t_data)) + return getmissingattr(tupleDesc, attnum, isnull); + else + return fastgetattr(tup, attnum, tupleDesc, isnull); + } + else + return heap_getsysattr(tup, attnum, tupleDesc, isnull); +} + #endif /* HTUP_DETAILS_H */ From 0adb3dc68bfb9a347ff2c7fe63200419bb649265 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 24 Mar 2022 13:34:27 -0400 Subject: [PATCH 239/772] Doc: add some documentation about serialization failure handling. We weren't very explicit about when to retry such errors. Simon Riggs Discussion: https://postgr.es/m/CANbhV-E+u+Z4VBNyJ6GzeO1fd2wP_5S+f6+kmxnN+ALQE6iG9Q@mail.gmail.com --- doc/src/sgml/mvcc.sgml | 68 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/mvcc.sgml b/doc/src/sgml/mvcc.sgml index da07f3f6c6..b4d1e57170 100644 --- a/doc/src/sgml/mvcc.sgml +++ b/doc/src/sgml/mvcc.sgml @@ -588,7 +588,7 @@ ERROR: could not serialize access due to concurrent update applications using this level must be prepared to retry transactions due to serialization failures. In fact, this isolation level works exactly the same as Repeatable - Read except that it monitors for conditions which could make + Read except that it also monitors for conditions which could make execution of a concurrent set of serializable transactions behave in a manner inconsistent with all possible serial (one at a time) executions of those transactions. This monitoring does not @@ -1720,6 +1720,72 @@ SELECT pg_advisory_lock(q.id) FROM + + Serialization Failure Handling + + + serialization failure + + + retryable error + + + + Both Repeatable Read and Serializable isolation levels can produce + errors that are designed to prevent serialization anomalies. As + previously stated, applications using these levels must be prepared to + retry transactions that fail due to serialization errors. Such an + error's message text will vary according to the precise circumstances, + but it will always have the SQLSTATE code 40001 + (serialization_failure). + + + + It may also be advisable to retry deadlock failures. + These have the SQLSTATE code 40P01 + (deadlock_detected). + + + + In some cases it is also appropriate to retry unique-key failures, + which have SQLSTATE code 23505 + (unique_violation), and exclusion constraint + failures, which have SQLSTATE code 23P01 + (exclusion_violation). For example, if the + application selects a new value for a primary key column after + inspecting the currently stored keys, it could get a unique-key + failure because another application instance selected the same new key + concurrently. This is effectively a serialization failure, but the + server will not detect it as such because it cannot see + the connection between the inserted value and the previous reads. + There are also some corner cases in which the server will issue a + unique-key or exclusion constraint error even though in principle it + has enough information to determine that a serialization problem + is the underlying cause. While it's recommendable to just + retry serialization_failure errors unconditionally, + more care is needed when retrying these other error codes, since they + might represent persistent error conditions rather than transient + failures. + + + + It is important to retry the complete transaction, including all logic + that decides which SQL to issue and/or which values to use. + Therefore, PostgreSQL does not offer an + automatic retry facility, since it cannot do so with any guarantee of + correctness. + + + + Transaction retry does not guarantee that the retried transaction will + complete; multiple retries may be needed. In cases with very high + contention, it is possible that completion of a transaction may take + many attempts. In cases involving a conflicting prepared transaction, + it may not be possible to make progress until the prepared transaction + commits or rolls back. + + + Caveats From 75b1521dae1ff1fde17fda2e30e591f2e5d64b6a Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Thu, 24 Mar 2022 18:20:21 +0100 Subject: [PATCH 240/772] Add decoding of sequences to built-in replication This commit adds support for decoding of sequences to the built-in replication (the infrastructure was added by commit 0da92dc530). The syntax and behavior mostly mimics handling of tables, i.e. a publication may be defined as FOR ALL SEQUENCES (replicating all sequences in a database), FOR ALL SEQUENCES IN SCHEMA (replicating all sequences in a particular schema) or individual sequences. To publish sequence modifications, the publication has to include 'sequence' action. The protocol is extended with a new message, describing sequence increments. A new system view pg_publication_sequences lists all the sequences added to a publication, both directly and indirectly. Various psql commands (\d and \dRp) are improved to also display publications including a given sequence, or sequences included in a publication. Author: Tomas Vondra, Cary Huang Reviewed-by: Peter Eisentraut, Amit Kapila, Hannu Krosing, Andres Freund, Petr Jelinek Discussion: https://postgr.es/m/d045f3c2-6cfb-06d3-5540-e63c320df8bc@enterprisedb.com Discussion: https://postgr.es/m/1710ed7e13b.cd7177461430746.3372264562543607781@highgo.ca --- doc/src/sgml/catalogs.sgml | 81 ++ doc/src/sgml/protocol.sgml | 119 ++ doc/src/sgml/ref/alter_publication.sgml | 25 +- doc/src/sgml/ref/alter_subscription.sgml | 8 +- doc/src/sgml/ref/create_publication.sgml | 51 +- src/backend/catalog/objectaddress.c | 44 +- src/backend/catalog/pg_publication.c | 328 +++++- src/backend/catalog/system_views.sql | 10 + src/backend/commands/publicationcmds.c | 424 +++++-- src/backend/commands/sequence.c | 154 +++ src/backend/commands/subscriptioncmds.c | 101 +- src/backend/commands/tablecmds.c | 27 +- src/backend/executor/execReplication.c | 4 +- src/backend/nodes/copyfuncs.c | 4 +- src/backend/nodes/equalfuncs.c | 4 +- src/backend/parser/gram.y | 52 +- src/backend/replication/logical/proto.c | 52 + src/backend/replication/logical/tablesync.c | 109 +- src/backend/replication/logical/worker.c | 56 + src/backend/replication/pgoutput/pgoutput.c | 79 +- src/backend/utils/cache/relcache.c | 28 +- src/backend/utils/cache/syscache.c | 6 +- src/bin/pg_dump/pg_dump.c | 65 +- src/bin/pg_dump/pg_dump.h | 3 + src/bin/pg_dump/t/002_pg_dump.pl | 40 +- src/bin/psql/describe.c | 287 +++-- src/bin/psql/tab-complete.c | 12 +- src/include/catalog/pg_proc.dat | 5 + src/include/catalog/pg_publication.h | 26 +- .../catalog/pg_publication_namespace.h | 10 +- src/include/commands/sequence.h | 1 + src/include/nodes/parsenodes.h | 8 +- src/include/replication/logicalproto.h | 19 + src/include/replication/pgoutput.h | 1 + src/test/regress/expected/object_address.out | 10 +- src/test/regress/expected/publication.out | 1009 ++++++++++++++--- src/test/regress/expected/rules.out | 8 + src/test/regress/sql/object_address.sql | 5 +- src/test/regress/sql/publication.sql | 226 +++- src/test/subscription/t/030_sequences.pl | 202 ++++ 40 files changed, 3235 insertions(+), 468 deletions(-) create mode 100644 src/test/subscription/t/030_sequences.pl diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 2a8cd02664..b8c954a554 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -6281,6 +6281,16 @@ SCRAM-SHA-256$<iteration count>:&l Reference to schema + + + + pntype char + Determines which object type is included from this schema. + + + Reference to schema + + @@ -9598,6 +9608,11 @@ SCRAM-SHA-256$<iteration count>:&l prepared transactions + + pg_publication_sequences + publications and their associated sequences + + pg_publication_tables publications and their associated tables @@ -11433,6 +11448,72 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx + + <structname>pg_publication_sequences</structname> + + + pg_publication_sequences + + + + The view pg_publication_sequences provides + information about the mapping between publications and the sequences they + contain. Unlike the underlying catalog + pg_publication_rel, + this view expands + publications defined as FOR ALL SEQUENCES, so for such + publications there will be a row for each eligible sequence. + + + + <structname>pg_publication_sequences</structname> Columns + + + + + Column Type + + + Description + + + + + + + + pubname name + (references pg_publication.pubname) + + + Name of publication + + + + + + schemaname name + (references pg_namespace.nspname) + + + Name of schema containing sequence + + + + + + sequencename name + (references pg_class.relname) + + + Name of sequence + + + + +
+
+ <structname>pg_publication_tables</structname> diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 719b947ef4..c61c310e17 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -7065,6 +7065,125 @@ Relation + + +Sequence + + + + + + + + Byte1('X') + + + + Identifies the message as a sequence message. + + + + + + Int32 (TransactionId) + + + + Xid of the transaction (only present for streamed transactions). + This field is available since protocol version 2. + + + + + + Int8(0) + + + + Flags; currently unused. + + + + + + Int64 (XLogRecPtr) + + + + The LSN of the sequence increment. + + + + + + String + + + + Namespace (empty string for pg_catalog). + + + + + + String + + + + Relation name. + + + + + + + Int8 + + + + 1 if the sequence update is transactions, 0 otherwise. + + + + + + + Int64 + + + + last_value value of the sequence. + + + + + + + Int64 + + + + log_cnt value of the sequence. + + + + + + + Int8 + + + + is_called value of the sequence. + + + + + + + + + Type diff --git a/doc/src/sgml/ref/alter_publication.sgml b/doc/src/sgml/ref/alter_publication.sgml index 32b75f6c78..a8cc8f3dc2 100644 --- a/doc/src/sgml/ref/alter_publication.sgml +++ b/doc/src/sgml/ref/alter_publication.sgml @@ -31,7 +31,9 @@ ALTER PUBLICATION name RENAME TO where publication_object is one of: TABLE [ ONLY ] table_name [ * ] [ WHERE ( expression ) ] [, ... ] + SEQUENCE sequence_name [, ... ] ALL TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] + ALL SEQUENCES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] @@ -44,13 +46,13 @@ ALTER PUBLICATION name RENAME TO - The first three variants change which tables/schemas are part of the - publication. The SET clause will replace the list of - tables/schemas in the publication with the specified list; the existing - tables/schemas that were present in the publication will be removed. The - ADD and DROP clauses will add and - remove one or more tables/schemas from the publication. Note that adding - tables/schemas to a publication that is already subscribed to will require an + The first three variants change which objects (tables, sequences or schemas) + are part of the publication. The SET clause will replace + the list of objects in the publication with the specified list; the existing + objects that were present in the publication will be removed. + The ADD and DROP clauses will add and + remove one or more objects from the publication. Note that adding objects + to a publication that is already subscribed to will require an ALTER SUBSCRIPTION ... REFRESH PUBLICATION action on the subscribing side in order to become effective. Note also that the combination of DROP with a WHERE clause is not @@ -122,6 +124,15 @@ ALTER PUBLICATION name RENAME TO + + sequence_name + + + Name of an existing sequence. + + + + schema_name diff --git a/doc/src/sgml/ref/alter_subscription.sgml b/doc/src/sgml/ref/alter_subscription.sgml index ac2db249cb..3e46bbdb04 100644 --- a/doc/src/sgml/ref/alter_subscription.sgml +++ b/doc/src/sgml/ref/alter_subscription.sgml @@ -148,8 +148,8 @@ ALTER SUBSCRIPTION name RENAME TO < Fetch missing table information from publisher. This will start - replication of tables that were added to the subscribed-to publications - since CREATE SUBSCRIPTION or + replication of tables and sequences that were added to the subscribed-to + publications since CREATE SUBSCRIPTION or the last invocation of REFRESH PUBLICATION. @@ -167,8 +167,8 @@ ALTER SUBSCRIPTION name RENAME TO < The default is true. - Previously subscribed tables are not copied, even if a table's row - filter WHERE clause has since been modified. + Previously subscribed tables and sequences are not copied, even if a + table's row filter WHERE clause has since been modified. diff --git a/doc/src/sgml/ref/create_publication.sgml b/doc/src/sgml/ref/create_publication.sgml index 4979b9b646..e5081eb50e 100644 --- a/doc/src/sgml/ref/create_publication.sgml +++ b/doc/src/sgml/ref/create_publication.sgml @@ -22,14 +22,21 @@ PostgreSQL documentation CREATE PUBLICATION name - [ FOR ALL TABLES + [ FOR ALL object_type [, ...] | FOR publication_object [, ... ] ] [ WITH ( publication_parameter [= value] [, ... ] ) ] +where object type is one of: + + TABLES + SEQUENCES + where publication_object is one of: TABLE [ ONLY ] table_name [ * ] [ WHERE ( expression ) ] [, ... ] + SEQUENCE sequence_name [ * ] [, ... ] ALL TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] + ALL SEQUENCES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] @@ -107,27 +114,43 @@ CREATE PUBLICATION name + + FOR SEQUENCE + + + Specifies a list of sequences to add to the publication. + + + + Specifying a sequence that is part of a schema specified by FOR + ALL SEQUENCES IN SCHEMA is not supported. + + + + FOR ALL TABLES + FOR ALL SEQUENCES - Marks the publication as one that replicates changes for all tables in - the database, including tables created in the future. + Marks the publication as one that replicates changes for all tables/sequences in + the database, including tables/sequences created in the future. FOR ALL TABLES IN SCHEMA + FOR ALL SEQUENCES IN SCHEMA - Marks the publication as one that replicates changes for all tables in - the specified list of schemas, including tables created in the future. + Marks the publication as one that replicates changes for all sequences/tables in + the specified list of schemas, including sequences/tables created in the future. - Specifying a schema along with a table which belongs to the specified - schema using FOR TABLE is not supported. + Specifying a schema along with a sequence/table which belongs to the specified + schema using FOR SEQUENCE/FOR TABLE is not supported. @@ -202,10 +225,9 @@ CREATE PUBLICATION name Notes - If FOR TABLE, FOR ALL TABLES or - FOR ALL TABLES IN SCHEMA are not specified, then the - publication starts out with an empty set of tables. That is useful if - tables or schemas are to be added later. + If FOR TABLE, FOR SEQUENCE, etc. is + not specified, then the publication starts out with an empty set of tables + and sequences. That is useful if objects are to be added later. @@ -220,10 +242,9 @@ CREATE PUBLICATION name - To add a table to a publication, the invoking user must have ownership - rights on the table. The FOR ALL TABLES and - FOR ALL TABLES IN SCHEMA clauses require the invoking - user to be a superuser. + To add a table or a sequence to a publication, the invoking user must + have ownership rights on the object. The FOR ALL ... + clauses require the invoking user to be a superuser. diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index d7ce063997..3fd17ea64f 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -1930,12 +1930,14 @@ get_object_address_publication_schema(List *object, bool missing_ok) char *pubname; char *schemaname; Oid schemaid; + char *objtype; ObjectAddressSet(address, PublicationNamespaceRelationId, InvalidOid); /* Fetch schema name and publication name from input list */ schemaname = strVal(linitial(object)); pubname = strVal(lsecond(object)); + objtype = strVal(lthird(object)); schemaid = get_namespace_oid(schemaname, missing_ok); if (!OidIsValid(schemaid)) @@ -1948,10 +1950,12 @@ get_object_address_publication_schema(List *object, bool missing_ok) /* Find the publication schema mapping in syscache */ address.objectId = - GetSysCacheOid2(PUBLICATIONNAMESPACEMAP, + GetSysCacheOid3(PUBLICATIONNAMESPACEMAP, Anum_pg_publication_namespace_oid, ObjectIdGetDatum(schemaid), - ObjectIdGetDatum(pub->oid)); + ObjectIdGetDatum(pub->oid), + CharGetDatum(objtype[0])); + if (!OidIsValid(address.objectId) && !missing_ok) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), @@ -2232,7 +2236,6 @@ pg_get_object_address(PG_FUNCTION_ARGS) case OBJECT_DOMCONSTRAINT: case OBJECT_CAST: case OBJECT_USER_MAPPING: - case OBJECT_PUBLICATION_NAMESPACE: case OBJECT_PUBLICATION_REL: case OBJECT_DEFACL: case OBJECT_TRANSFORM: @@ -2257,6 +2260,7 @@ pg_get_object_address(PG_FUNCTION_ARGS) /* fall through to check args length */ /* FALLTHROUGH */ case OBJECT_OPERATOR: + case OBJECT_PUBLICATION_NAMESPACE: if (list_length(args) != 2) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -2327,6 +2331,8 @@ pg_get_object_address(PG_FUNCTION_ARGS) objnode = (Node *) list_make2(name, linitial(args)); break; case OBJECT_PUBLICATION_NAMESPACE: + objnode = (Node *) list_make3(linitial(name), linitial(args), lsecond(args)); + break; case OBJECT_USER_MAPPING: objnode = (Node *) list_make2(linitial(name), linitial(args)); break; @@ -2881,11 +2887,12 @@ get_catalog_object_by_oid(Relation catalog, AttrNumber oidcol, Oid objectId) * * Get publication name and schema name from the object address into pubname and * nspname. Both pubname and nspname are palloc'd strings which will be freed by - * the caller. + * the caller. The last parameter specifies which object type is included from + * the schema. */ static bool getPublicationSchemaInfo(const ObjectAddress *object, bool missing_ok, - char **pubname, char **nspname) + char **pubname, char **nspname, char **objtype) { HeapTuple tup; Form_pg_publication_namespace pnform; @@ -2921,6 +2928,13 @@ getPublicationSchemaInfo(const ObjectAddress *object, bool missing_ok, return false; } + /* + * The type is always a single character, but we need to pass it as a string, + * so allocate two charaters and set the first one. The second one is \0. + */ + *objtype = palloc0(2); + *objtype[0] = pnform->pntype; + ReleaseSysCache(tup); return true; } @@ -3926,15 +3940,17 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) { char *pubname; char *nspname; + char *objtype; if (!getPublicationSchemaInfo(object, missing_ok, - &pubname, &nspname)) + &pubname, &nspname, &objtype)) break; - appendStringInfo(&buffer, _("publication of schema %s in publication %s"), - nspname, pubname); + appendStringInfo(&buffer, _("publication of schema %s in publication %s type %s"), + nspname, pubname, objtype); pfree(pubname); pfree(nspname); + pfree(objtype); break; } @@ -5729,18 +5745,24 @@ getObjectIdentityParts(const ObjectAddress *object, { char *pubname; char *nspname; + char *objtype; if (!getPublicationSchemaInfo(object, missing_ok, &pubname, - &nspname)) + &nspname, &objtype)) break; - appendStringInfo(&buffer, "%s in publication %s", - nspname, pubname); + appendStringInfo(&buffer, "%s in publication %s type %s", + nspname, pubname, objtype); if (objargs) *objargs = list_make1(pubname); else pfree(pubname); + if (objargs) + *objargs = lappend(*objargs, objtype); + else + pfree(objtype); + if (objname) *objname = list_make1(nspname); else diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 789b895db8..5bcfc94e2b 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -52,9 +52,10 @@ static void check_publication_add_relation(Relation targetrel) { - /* Must be a regular or partitioned table */ + /* Must be a regular or partitioned table, or a sequence */ if (RelationGetForm(targetrel)->relkind != RELKIND_RELATION && - RelationGetForm(targetrel)->relkind != RELKIND_PARTITIONED_TABLE) + RelationGetForm(targetrel)->relkind != RELKIND_PARTITIONED_TABLE && + RelationGetForm(targetrel)->relkind != RELKIND_SEQUENCE) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("cannot add relation \"%s\" to publication", @@ -131,7 +132,8 @@ static bool is_publishable_class(Oid relid, Form_pg_class reltuple) { return (reltuple->relkind == RELKIND_RELATION || - reltuple->relkind == RELKIND_PARTITIONED_TABLE) && + reltuple->relkind == RELKIND_PARTITIONED_TABLE || + reltuple->relkind == RELKIND_SEQUENCE) && !IsCatalogRelationOid(relid) && reltuple->relpersistence == RELPERSISTENCE_PERMANENT && relid >= FirstNormalObjectId; @@ -176,6 +178,52 @@ filter_partitions(List *relids) return result; } +/* + * Check the character is a valid object type for schema publication. + * + * This recognizes either 't' for tables or 's' for sequences. Places that + * need to handle 'u' for unsupported relkinds need to do that explicitlyl + */ +static void +AssertObjectTypeValid(char objectType) +{ +#ifdef USE_ASSERT_CHECKING + Assert(objectType == PUB_OBJTYPE_SEQUENCE || objectType == PUB_OBJTYPE_TABLE); +#endif +} + +/* + * Determine object type given the object type set for a schema. + */ +char +pub_get_object_type_for_relkind(char relkind) +{ + /* sequence maps directly to sequence relkind */ + if (relkind == RELKIND_SEQUENCE) + return PUB_OBJTYPE_SEQUENCE; + + /* for table, we match either regular or partitioned table */ + if (relkind == RELKIND_RELATION || + relkind == RELKIND_PARTITIONED_TABLE) + return PUB_OBJTYPE_TABLE; + + return PUB_OBJTYPE_UNSUPPORTED; +} + +/* + * Determine if publication object type matches the relkind. + * + * Returns true if the relation matches object type replicated by this schema, + * false otherwise. + */ +static bool +pub_object_type_matches_relkind(char objectType, char relkind) +{ + AssertObjectTypeValid(objectType); + + return (pub_get_object_type_for_relkind(relkind) == objectType); +} + /* * Another variant of this, taking a Relation. */ @@ -205,7 +253,7 @@ is_schema_publication(Oid pubid) ObjectIdGetDatum(pubid)); scan = systable_beginscan(pubschsrel, - PublicationNamespacePnnspidPnpubidIndexId, + PublicationNamespacePnnspidPnpubidPntypeIndexId, true, NULL, 1, &scankey); tup = systable_getnext(scan); result = HeapTupleIsValid(tup); @@ -313,7 +361,9 @@ GetTopMostAncestorInPublication(Oid puboid, List *ancestors, int *ancestor_level } else { - aschemaPubids = GetSchemaPublications(get_rel_namespace(ancestor)); + /* we only search for ancestors of tables, so PUB_OBJTYPE_TABLE */ + aschemaPubids = GetSchemaPublications(get_rel_namespace(ancestor), + PUB_OBJTYPE_TABLE); if (list_member_oid(aschemaPubids, puboid)) { topmost_relid = ancestor; @@ -436,7 +486,7 @@ publication_add_relation(Oid pubid, PublicationRelInfo *pri, * Insert new publication / schema mapping. */ ObjectAddress -publication_add_schema(Oid pubid, Oid schemaid, bool if_not_exists) +publication_add_schema(Oid pubid, Oid schemaid, char objectType, bool if_not_exists) { Relation rel; HeapTuple tup; @@ -448,6 +498,8 @@ publication_add_schema(Oid pubid, Oid schemaid, bool if_not_exists) ObjectAddress myself, referenced; + AssertObjectTypeValid(objectType); + rel = table_open(PublicationNamespaceRelationId, RowExclusiveLock); /* @@ -455,9 +507,10 @@ publication_add_schema(Oid pubid, Oid schemaid, bool if_not_exists) * duplicates, it's here just to provide nicer error message in common * case. The real protection is the unique key on the catalog. */ - if (SearchSysCacheExists2(PUBLICATIONNAMESPACEMAP, + if (SearchSysCacheExists3(PUBLICATIONNAMESPACEMAP, ObjectIdGetDatum(schemaid), - ObjectIdGetDatum(pubid))) + ObjectIdGetDatum(pubid), + CharGetDatum(objectType))) { table_close(rel, RowExclusiveLock); @@ -483,6 +536,8 @@ publication_add_schema(Oid pubid, Oid schemaid, bool if_not_exists) ObjectIdGetDatum(pubid); values[Anum_pg_publication_namespace_pnnspid - 1] = ObjectIdGetDatum(schemaid); + values[Anum_pg_publication_namespace_pntype - 1] = + CharGetDatum(objectType); tup = heap_form_tuple(RelationGetDescr(rel), values, nulls); @@ -508,7 +563,7 @@ publication_add_schema(Oid pubid, Oid schemaid, bool if_not_exists) * publication_add_relation for why we need to consider all the * partitions. */ - schemaRels = GetSchemaPublicationRelations(schemaid, + schemaRels = GetSchemaPublicationRelations(schemaid, objectType, PUBLICATION_PART_ALL); InvalidatePublicationRels(schemaRels); @@ -542,11 +597,14 @@ GetRelationPublications(Oid relid) /* * Gets list of relation oids for a publication. * - * This should only be used FOR TABLE publications, the FOR ALL TABLES - * should use GetAllTablesPublicationRelations(). + * This should only be used FOR TABLE / FOR SEQUENCE publications, the FOR + * ALL TABLES / SEQUENCES should use GetAllTablesPublicationRelations() + * and GetAllSequencesPublicationRelations(). + * + * XXX pub_partopt only matters for tables, not sequences. */ List * -GetPublicationRelations(Oid pubid, PublicationPartOpt pub_partopt) +GetPublicationRelations(Oid pubid, char objectType, PublicationPartOpt pub_partopt) { List *result; Relation pubrelsrel; @@ -554,6 +612,8 @@ GetPublicationRelations(Oid pubid, PublicationPartOpt pub_partopt) SysScanDesc scan; HeapTuple tup; + AssertObjectTypeValid(objectType); + /* Find all publications associated with the relation. */ pubrelsrel = table_open(PublicationRelRelationId, AccessShareLock); @@ -568,11 +628,29 @@ GetPublicationRelations(Oid pubid, PublicationPartOpt pub_partopt) result = NIL; while (HeapTupleIsValid(tup = systable_getnext(scan))) { + char relkind; Form_pg_publication_rel pubrel; pubrel = (Form_pg_publication_rel) GETSTRUCT(tup); - result = GetPubPartitionOptionRelations(result, pub_partopt, - pubrel->prrelid); + relkind = get_rel_relkind(pubrel->prrelid); + + /* + * If the relkind does not match the requested object type, ignore the + * relation. For example we might be interested only in sequences, so + * we ignore tables. + */ + if (!pub_object_type_matches_relkind(objectType, relkind)) + continue; + + /* + * We don't have partitioned sequences, so just add them to the list. + * Otherwise consider adding all child relations, if requested. + */ + if (relkind == RELKIND_SEQUENCE) + result = lappend_oid(result, pubrel->prrelid); + else + result = GetPubPartitionOptionRelations(result, pub_partopt, + pubrel->prrelid); } systable_endscan(scan); @@ -622,6 +700,43 @@ GetAllTablesPublications(void) return result; } +/* + * Gets list of publication oids for publications marked as FOR ALL SEQUENCES. + */ +List * +GetAllSequencesPublications(void) +{ + List *result; + Relation rel; + ScanKeyData scankey; + SysScanDesc scan; + HeapTuple tup; + + /* Find all publications that are marked as for all sequences. */ + rel = table_open(PublicationRelationId, AccessShareLock); + + ScanKeyInit(&scankey, + Anum_pg_publication_puballsequences, + BTEqualStrategyNumber, F_BOOLEQ, + BoolGetDatum(true)); + + scan = systable_beginscan(rel, InvalidOid, false, + NULL, 1, &scankey); + + result = NIL; + while (HeapTupleIsValid(tup = systable_getnext(scan))) + { + Oid oid = ((Form_pg_publication) GETSTRUCT(tup))->oid; + + result = lappend_oid(result, oid); + } + + systable_endscan(scan); + table_close(rel, AccessShareLock); + + return result; +} + /* * Gets list of all relation published by FOR ALL TABLES publication(s). * @@ -688,28 +803,38 @@ GetAllTablesPublicationRelations(bool pubviaroot) /* * Gets the list of schema oids for a publication. * - * This should only be used FOR ALL TABLES IN SCHEMA publications. + * This should only be used FOR ALL TABLES IN SCHEMA and FOR ALL SEQUENCES + * publications. + * + * 'objectType' determines whether to get FOR TABLE or FOR SEQUENCES schemas */ List * -GetPublicationSchemas(Oid pubid) +GetPublicationSchemas(Oid pubid, char objectType) { List *result = NIL; Relation pubschsrel; - ScanKeyData scankey; + ScanKeyData scankey[2]; SysScanDesc scan; HeapTuple tup; + AssertObjectTypeValid(objectType); + /* Find all schemas associated with the publication */ pubschsrel = table_open(PublicationNamespaceRelationId, AccessShareLock); - ScanKeyInit(&scankey, + ScanKeyInit(&scankey[0], Anum_pg_publication_namespace_pnpubid, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(pubid)); + ScanKeyInit(&scankey[1], + Anum_pg_publication_namespace_pntype, + BTEqualStrategyNumber, F_CHAREQ, + CharGetDatum(objectType)); + scan = systable_beginscan(pubschsrel, - PublicationNamespacePnnspidPnpubidIndexId, - true, NULL, 1, &scankey); + PublicationNamespacePnnspidPnpubidPntypeIndexId, + true, NULL, 2, scankey); while (HeapTupleIsValid(tup = systable_getnext(scan))) { Form_pg_publication_namespace pubsch; @@ -727,14 +852,26 @@ GetPublicationSchemas(Oid pubid) /* * Gets the list of publication oids associated with a specified schema. + * + * objectType specifies whether we're looking for schemas including tables or + * sequences. + * + * Note: relcache calls this for all object types, not just tables and sequences. + * Which is why we handle the PUB_OBJTYPE_UNSUPPORTED object type too. */ List * -GetSchemaPublications(Oid schemaid) +GetSchemaPublications(Oid schemaid, char objectType) { List *result = NIL; CatCList *pubschlist; int i; + /* unsupported object type */ + if (objectType == PUB_OBJTYPE_UNSUPPORTED) + return result; + + AssertObjectTypeValid(objectType); + /* Find all publications associated with the schema */ pubschlist = SearchSysCacheList1(PUBLICATIONNAMESPACEMAP, ObjectIdGetDatum(schemaid)); @@ -742,6 +879,11 @@ GetSchemaPublications(Oid schemaid) { HeapTuple tup = &pubschlist->members[i]->tuple; Oid pubid = ((Form_pg_publication_namespace) GETSTRUCT(tup))->pnpubid; + char pntype = ((Form_pg_publication_namespace) GETSTRUCT(tup))->pntype; + + /* Skip schemas publishing a different object type. */ + if (pntype != objectType) + continue; result = lappend_oid(result, pubid); } @@ -753,9 +895,13 @@ GetSchemaPublications(Oid schemaid) /* * Get the list of publishable relation oids for a specified schema. + * + * objectType specifies whether this is FOR ALL TABLES IN SCHEMA or FOR ALL + * SEQUENCES IN SCHEMA */ List * -GetSchemaPublicationRelations(Oid schemaid, PublicationPartOpt pub_partopt) +GetSchemaPublicationRelations(Oid schemaid, char objectType, + PublicationPartOpt pub_partopt) { Relation classRel; ScanKeyData key[1]; @@ -764,6 +910,7 @@ GetSchemaPublicationRelations(Oid schemaid, PublicationPartOpt pub_partopt) List *result = NIL; Assert(OidIsValid(schemaid)); + AssertObjectTypeValid(objectType); classRel = table_open(RelationRelationId, AccessShareLock); @@ -784,9 +931,16 @@ GetSchemaPublicationRelations(Oid schemaid, PublicationPartOpt pub_partopt) continue; relkind = get_rel_relkind(relid); - if (relkind == RELKIND_RELATION) - result = lappend_oid(result, relid); - else if (relkind == RELKIND_PARTITIONED_TABLE) + + /* Skip if the relkind does not match FOR ALL TABLES / SEQUENCES. */ + if (!pub_object_type_matches_relkind(objectType, relkind)) + continue; + + /* + * If the object is a partitioned table, lookup all the child relations + * (if requested). Otherwise just add the object to the list. + */ + if (relkind == RELKIND_PARTITIONED_TABLE) { List *partitionrels = NIL; @@ -799,7 +953,11 @@ GetSchemaPublicationRelations(Oid schemaid, PublicationPartOpt pub_partopt) pub_partopt, relForm->oid); result = list_concat_unique_oid(result, partitionrels); + continue; } + + /* non-partitioned tables and sequences */ + result = lappend_oid(result, relid); } table_endscan(scan); @@ -809,27 +967,67 @@ GetSchemaPublicationRelations(Oid schemaid, PublicationPartOpt pub_partopt) /* * Gets the list of all relations published by FOR ALL TABLES IN SCHEMA - * publication. + * or FOR ALL SEQUENCES IN SCHEMA publication. */ List * -GetAllSchemaPublicationRelations(Oid pubid, PublicationPartOpt pub_partopt) +GetAllSchemaPublicationRelations(Oid pubid, char objectType, + PublicationPartOpt pub_partopt) { List *result = NIL; - List *pubschemalist = GetPublicationSchemas(pubid); + List *pubschemalist = GetPublicationSchemas(pubid, objectType); ListCell *cell; + AssertObjectTypeValid(objectType); + foreach(cell, pubschemalist) { Oid schemaid = lfirst_oid(cell); List *schemaRels = NIL; - schemaRels = GetSchemaPublicationRelations(schemaid, pub_partopt); + schemaRels = GetSchemaPublicationRelations(schemaid, objectType, + pub_partopt); result = list_concat(result, schemaRels); } return result; } +/* + * Gets list of all relation published by FOR ALL SEQUENCES publication(s). + */ +List * +GetAllSequencesPublicationRelations(void) +{ + Relation classRel; + ScanKeyData key[1]; + TableScanDesc scan; + HeapTuple tuple; + List *result = NIL; + + classRel = table_open(RelationRelationId, AccessShareLock); + + ScanKeyInit(&key[0], + Anum_pg_class_relkind, + BTEqualStrategyNumber, F_CHAREQ, + CharGetDatum(RELKIND_SEQUENCE)); + + scan = table_beginscan_catalog(classRel, 1, key); + + while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL) + { + Form_pg_class relForm = (Form_pg_class) GETSTRUCT(tuple); + Oid relid = relForm->oid; + + if (is_publishable_class(relid, relForm)) + result = lappend_oid(result, relid); + } + + table_endscan(scan); + + table_close(classRel, AccessShareLock); + return result; +} + /* * Get publication using oid * @@ -852,10 +1050,12 @@ GetPublication(Oid pubid) pub->oid = pubid; pub->name = pstrdup(NameStr(pubform->pubname)); pub->alltables = pubform->puballtables; + pub->allsequences = pubform->puballsequences; pub->pubactions.pubinsert = pubform->pubinsert; pub->pubactions.pubupdate = pubform->pubupdate; pub->pubactions.pubdelete = pubform->pubdelete; pub->pubactions.pubtruncate = pubform->pubtruncate; + pub->pubactions.pubsequence = pubform->pubsequence; pub->pubviaroot = pubform->pubviaroot; ReleaseSysCache(tup); @@ -966,10 +1166,12 @@ pg_get_publication_tables(PG_FUNCTION_ARGS) *schemarelids; relids = GetPublicationRelations(publication->oid, + PUB_OBJTYPE_TABLE, publication->pubviaroot ? PUBLICATION_PART_ROOT : PUBLICATION_PART_LEAF); schemarelids = GetAllSchemaPublicationRelations(publication->oid, + PUB_OBJTYPE_TABLE, publication->pubviaroot ? PUBLICATION_PART_ROOT : PUBLICATION_PART_LEAF); @@ -1005,3 +1207,71 @@ pg_get_publication_tables(PG_FUNCTION_ARGS) SRF_RETURN_DONE(funcctx); } + +/* + * Returns Oids of sequences in a publication. + */ +Datum +pg_get_publication_sequences(PG_FUNCTION_ARGS) +{ + FuncCallContext *funcctx; + char *pubname = text_to_cstring(PG_GETARG_TEXT_PP(0)); + Publication *publication; + List *sequences; + + /* stuff done only on the first call of the function */ + if (SRF_IS_FIRSTCALL()) + { + MemoryContext oldcontext; + + /* create a function context for cross-call persistence */ + funcctx = SRF_FIRSTCALL_INIT(); + + /* switch to memory context appropriate for multiple function calls */ + oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); + + publication = GetPublicationByName(pubname, false); + + /* + * Publications support partitioned tables, although all changes are + * replicated using leaf partition identity and schema, so we only + * need those. + */ + if (publication->allsequences) + sequences = GetAllSequencesPublicationRelations(); + else + { + List *relids, + *schemarelids; + + relids = GetPublicationRelations(publication->oid, + PUB_OBJTYPE_SEQUENCE, + publication->pubviaroot ? + PUBLICATION_PART_ROOT : + PUBLICATION_PART_LEAF); + schemarelids = GetAllSchemaPublicationRelations(publication->oid, + PUB_OBJTYPE_SEQUENCE, + publication->pubviaroot ? + PUBLICATION_PART_ROOT : + PUBLICATION_PART_LEAF); + sequences = list_concat_unique_oid(relids, schemarelids); + } + + funcctx->user_fctx = (void *) sequences; + + MemoryContextSwitchTo(oldcontext); + } + + /* stuff done on every call of the function */ + funcctx = SRF_PERCALL_SETUP(); + sequences = (List *) funcctx->user_fctx; + + if (funcctx->call_cntr < list_length(sequences)) + { + Oid relid = list_nth_oid(sequences, funcctx->call_cntr); + + SRF_RETURN_NEXT(funcctx, ObjectIdGetDatum(relid)); + } + + SRF_RETURN_DONE(funcctx); +} diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index bd48ee7bd2..9ac8e9a299 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -374,6 +374,16 @@ CREATE VIEW pg_publication_tables AS pg_class C JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.oid = GPT.relid; +CREATE VIEW pg_publication_sequences AS + SELECT + P.pubname AS pubname, + N.nspname AS schemaname, + C.relname AS sequencename + FROM pg_publication P, + LATERAL pg_get_publication_sequences(P.pubname) GPS, + pg_class C JOIN pg_namespace N ON (N.oid = C.relnamespace) + WHERE C.oid = GPS.relid; + CREATE VIEW pg_locks AS SELECT * FROM pg_lock_status() AS L; diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index 1aad2e769c..f890d3f0ba 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -16,6 +16,7 @@ #include "access/genam.h" #include "access/htup_details.h" +#include "access/relation.h" #include "access/table.h" #include "access/xact.h" #include "catalog/catalog.h" @@ -67,15 +68,17 @@ typedef struct rf_context } rf_context; static List *OpenRelIdList(List *relids); -static List *OpenTableList(List *tables); -static void CloseTableList(List *rels); +static List *OpenRelationList(List *rels, char objectType); +static void CloseRelationList(List *rels); static void LockSchemaList(List *schemalist); -static void PublicationAddTables(Oid pubid, List *rels, bool if_not_exists, +static void PublicationAddRelations(Oid pubid, List *rels, bool if_not_exists, AlterPublicationStmt *stmt); -static void PublicationDropTables(Oid pubid, List *rels, bool missing_ok); -static void PublicationAddSchemas(Oid pubid, List *schemas, bool if_not_exists, - AlterPublicationStmt *stmt); -static void PublicationDropSchemas(Oid pubid, List *schemas, bool missing_ok); +static void PublicationDropRelations(Oid pubid, List *rels, bool missing_ok); +static void PublicationAddSchemas(Oid pubid, List *schemas, char objectType, + bool if_not_exists, AlterPublicationStmt *stmt); +static void PublicationDropSchemas(Oid pubid, List *schemas, char objectType, + bool missing_ok); + static void parse_publication_options(ParseState *pstate, @@ -95,6 +98,7 @@ parse_publication_options(ParseState *pstate, pubactions->pubupdate = true; pubactions->pubdelete = true; pubactions->pubtruncate = true; + pubactions->pubsequence = true; *publish_via_partition_root = false; /* Parse options */ @@ -119,6 +123,7 @@ parse_publication_options(ParseState *pstate, pubactions->pubupdate = false; pubactions->pubdelete = false; pubactions->pubtruncate = false; + pubactions->pubsequence = false; *publish_given = true; publish = defGetString(defel); @@ -141,6 +146,8 @@ parse_publication_options(ParseState *pstate, pubactions->pubdelete = true; else if (strcmp(publish_opt, "truncate") == 0) pubactions->pubtruncate = true; + else if (strcmp(publish_opt, "sequence") == 0) + pubactions->pubsequence = true; else ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -167,7 +174,9 @@ parse_publication_options(ParseState *pstate, */ static void ObjectsInPublicationToOids(List *pubobjspec_list, ParseState *pstate, - List **rels, List **schemas) + List **tables, List **sequences, + List **tables_schemas, List **sequences_schemas, + List **schemas) { ListCell *cell; PublicationObjSpec *pubobj; @@ -185,12 +194,23 @@ ObjectsInPublicationToOids(List *pubobjspec_list, ParseState *pstate, switch (pubobj->pubobjtype) { case PUBLICATIONOBJ_TABLE: - *rels = lappend(*rels, pubobj->pubtable); + *tables = lappend(*tables, pubobj->pubtable); + break; + case PUBLICATIONOBJ_SEQUENCE: + *sequences = lappend(*sequences, pubobj->pubtable); break; case PUBLICATIONOBJ_TABLES_IN_SCHEMA: schemaid = get_namespace_oid(pubobj->name, false); /* Filter out duplicates if user specifies "sch1, sch1" */ + *tables_schemas = list_append_unique_oid(*tables_schemas, schemaid); + *schemas = list_append_unique_oid(*schemas, schemaid); + break; + case PUBLICATIONOBJ_SEQUENCES_IN_SCHEMA: + schemaid = get_namespace_oid(pubobj->name, false); + + /* Filter out duplicates if user specifies "sch1, sch1" */ + *sequences_schemas = list_append_unique_oid(*sequences_schemas, schemaid); *schemas = list_append_unique_oid(*schemas, schemaid); break; case PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA: @@ -204,6 +224,21 @@ ObjectsInPublicationToOids(List *pubobjspec_list, ParseState *pstate, list_free(search_path); /* Filter out duplicates if user specifies "sch1, sch1" */ + *tables_schemas = list_append_unique_oid(*tables_schemas, schemaid); + *schemas = list_append_unique_oid(*schemas, schemaid); + break; + case PUBLICATIONOBJ_SEQUENCES_IN_CUR_SCHEMA: + search_path = fetch_search_path(false); + if (search_path == NIL) /* nothing valid in search_path? */ + ereport(ERROR, + errcode(ERRCODE_UNDEFINED_SCHEMA), + errmsg("no schema has been selected for CURRENT_SCHEMA")); + + schemaid = linitial_oid(search_path); + list_free(search_path); + + /* Filter out duplicates if user specifies "sch1, sch1" */ + *sequences_schemas = list_append_unique_oid(*sequences_schemas, schemaid); *schemas = list_append_unique_oid(*schemas, schemaid); break; default: @@ -240,6 +275,14 @@ CheckObjSchemaNotAlreadyInPublication(List *rels, List *schemaidlist, errdetail("Table \"%s\" in schema \"%s\" is already part of the publication, adding the same schema is not supported.", RelationGetRelationName(rel), get_namespace_name(relSchemaId))); + else if (checkobjtype == PUBLICATIONOBJ_SEQUENCES_IN_SCHEMA) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot add schema \"%s\" to publication", + get_namespace_name(relSchemaId)), + errdetail("Sequence \"%s\" in schema \"%s\" is already part of the publication, adding the same schema is not supported.", + RelationGetRelationName(rel), + get_namespace_name(relSchemaId))); else if (checkobjtype == PUBLICATIONOBJ_TABLE) ereport(ERROR, errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -248,6 +291,14 @@ CheckObjSchemaNotAlreadyInPublication(List *rels, List *schemaidlist, RelationGetRelationName(rel)), errdetail("Table's schema \"%s\" is already part of the publication or part of the specified schema list.", get_namespace_name(relSchemaId))); + else if (checkobjtype == PUBLICATIONOBJ_SEQUENCE) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot add relation \"%s.%s\" to publication", + get_namespace_name(relSchemaId), + RelationGetRelationName(rel)), + errdetail("Sequence's schema \"%s\" is already part of the publication or part of the specified schema list.", + get_namespace_name(relSchemaId))); } } } @@ -615,6 +666,7 @@ TransformPubWhereClauses(List *tables, const char *queryString, ObjectAddress CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) { + ListCell *lc; Relation rel; ObjectAddress myself; Oid puboid; @@ -626,9 +678,25 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) bool publish_via_partition_root_given; bool publish_via_partition_root; AclResult aclresult; - List *relations = NIL; + List *tables = NIL; + List *sequences = NIL; + List *tables_schemaidlist = NIL; + List *sequences_schemaidlist = NIL; List *schemaidlist = NIL; + bool for_all_tables = false; + bool for_all_sequences = false; + + /* Translate the list of object types (represented by strings) to bool flags. */ + foreach (lc, stmt->for_all_objects) + { + char *val = strVal(lfirst(lc)); + if (strcmp(val, "tables") == 0) + for_all_tables = true; + else if (strcmp(val, "sequences") == 0) + for_all_sequences = true; + } + /* must have CREATE privilege on database */ aclresult = pg_database_aclcheck(MyDatabaseId, GetUserId(), ACL_CREATE); if (aclresult != ACLCHECK_OK) @@ -636,7 +704,7 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) get_database_name(MyDatabaseId)); /* FOR ALL TABLES requires superuser */ - if (stmt->for_all_tables && !superuser()) + if (for_all_tables && !superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to create FOR ALL TABLES publication"))); @@ -672,7 +740,9 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) Anum_pg_publication_oid); values[Anum_pg_publication_oid - 1] = ObjectIdGetDatum(puboid); values[Anum_pg_publication_puballtables - 1] = - BoolGetDatum(stmt->for_all_tables); + BoolGetDatum(for_all_tables); + values[Anum_pg_publication_puballsequences - 1] = + BoolGetDatum(for_all_sequences); values[Anum_pg_publication_pubinsert - 1] = BoolGetDatum(pubactions.pubinsert); values[Anum_pg_publication_pubupdate - 1] = @@ -681,6 +751,8 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) BoolGetDatum(pubactions.pubdelete); values[Anum_pg_publication_pubtruncate - 1] = BoolGetDatum(pubactions.pubtruncate); + values[Anum_pg_publication_pubsequence - 1] = + BoolGetDatum(pubactions.pubsequence); values[Anum_pg_publication_pubviaroot - 1] = BoolGetDatum(publish_via_partition_root); @@ -698,45 +770,88 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) CommandCounterIncrement(); /* Associate objects with the publication. */ - if (stmt->for_all_tables) + if (for_all_tables || for_all_sequences) { /* Invalidate relcache so that publication info is rebuilt. */ CacheInvalidateRelcacheAll(); } - else + + /* + * If the publication might have either tables or sequences (directly or + * through a schema), process that. + */ + if (!for_all_tables || !for_all_sequences) { - ObjectsInPublicationToOids(stmt->pubobjects, pstate, &relations, + ObjectsInPublicationToOids(stmt->pubobjects, pstate, + &tables, &sequences, + &tables_schemaidlist, + &sequences_schemaidlist, &schemaidlist); /* FOR ALL TABLES IN SCHEMA requires superuser */ - if (list_length(schemaidlist) > 0 && !superuser()) + if (list_length(tables_schemaidlist) > 0 && !superuser()) ereport(ERROR, errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to create FOR ALL TABLES IN SCHEMA publication")); - if (list_length(relations) > 0) + /* FOR ALL SEQUENCES IN SCHEMA requires superuser */ + if (list_length(sequences_schemaidlist) > 0 && !superuser()) + ereport(ERROR, + errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser to create FOR ALL SEQUENCES IN SCHEMA publication")); + + /* tables added directly */ + if (list_length(tables) > 0) { List *rels; - rels = OpenTableList(relations); - CheckObjSchemaNotAlreadyInPublication(rels, schemaidlist, + rels = OpenRelationList(tables, PUB_OBJTYPE_TABLE); + CheckObjSchemaNotAlreadyInPublication(rels, tables_schemaidlist, PUBLICATIONOBJ_TABLE); TransformPubWhereClauses(rels, pstate->p_sourcetext, publish_via_partition_root); - PublicationAddTables(puboid, rels, true, NULL); - CloseTableList(rels); + PublicationAddRelations(puboid, rels, true, NULL); + CloseRelationList(rels); + } + + /* sequences added directly */ + if (list_length(sequences) > 0) + { + List *rels; + + rels = OpenRelationList(sequences, PUB_OBJTYPE_SEQUENCE); + CheckObjSchemaNotAlreadyInPublication(rels, sequences_schemaidlist, + PUBLICATIONOBJ_SEQUENCE); + PublicationAddRelations(puboid, rels, true, NULL); + CloseRelationList(rels); + } + + /* tables added through a schema */ + if (list_length(tables_schemaidlist) > 0) + { + /* + * Schema lock is held until the publication is created to prevent + * concurrent schema deletion. + */ + LockSchemaList(tables_schemaidlist); + PublicationAddSchemas(puboid, + tables_schemaidlist, PUB_OBJTYPE_TABLE, + true, NULL); } - if (list_length(schemaidlist) > 0) + /* sequences added through a schema */ + if (list_length(sequences_schemaidlist) > 0) { /* * Schema lock is held until the publication is created to prevent * concurrent schema deletion. */ - LockSchemaList(schemaidlist); - PublicationAddSchemas(puboid, schemaidlist, true, NULL); + LockSchemaList(sequences_schemaidlist); + PublicationAddSchemas(puboid, + sequences_schemaidlist, PUB_OBJTYPE_SEQUENCE, + true, NULL); } } @@ -799,6 +914,7 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, AccessShareLock); root_relids = GetPublicationRelations(pubform->oid, + PUB_OBJTYPE_TABLE, PUBLICATION_PART_ROOT); foreach(lc, root_relids) @@ -857,6 +973,9 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, values[Anum_pg_publication_pubtruncate - 1] = BoolGetDatum(pubactions.pubtruncate); replaces[Anum_pg_publication_pubtruncate - 1] = true; + + values[Anum_pg_publication_pubsequence - 1] = BoolGetDatum(pubactions.pubsequence); + replaces[Anum_pg_publication_pubsequence - 1] = true; } if (publish_via_partition_root_given) @@ -876,7 +995,7 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, pubform = (Form_pg_publication) GETSTRUCT(tup); /* Invalidate the relcache. */ - if (pubform->puballtables) + if (pubform->puballtables || pubform->puballsequences) { CacheInvalidateRelcacheAll(); } @@ -892,6 +1011,7 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, */ if (root_relids == NIL) relids = GetPublicationRelations(pubform->oid, + PUB_OBJTYPE_TABLE, PUBLICATION_PART_ALL); else { @@ -905,7 +1025,20 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, lfirst_oid(lc)); } + /* tables */ + schemarelids = GetAllSchemaPublicationRelations(pubform->oid, + PUB_OBJTYPE_TABLE, + PUBLICATION_PART_ALL); + relids = list_concat_unique_oid(relids, schemarelids); + + /* sequences */ + relids = list_concat_unique_oid(relids, + GetPublicationRelations(pubform->oid, + PUB_OBJTYPE_SEQUENCE, + PUBLICATION_PART_ALL)); + schemarelids = GetAllSchemaPublicationRelations(pubform->oid, + PUB_OBJTYPE_SEQUENCE, PUBLICATION_PART_ALL); relids = list_concat_unique_oid(relids, schemarelids); @@ -960,7 +1093,7 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, if (!tables && stmt->action != AP_SetObjects) return; - rels = OpenTableList(tables); + rels = OpenRelationList(tables, PUB_OBJTYPE_TABLE); if (stmt->action == AP_AddObjects) { @@ -970,19 +1103,22 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, * Check if the relation is member of the existing schema in the * publication or member of the schema list specified. */ - schemas = list_concat_copy(schemaidlist, GetPublicationSchemas(pubid)); + schemas = list_concat_copy(schemaidlist, + GetPublicationSchemas(pubid, + PUB_OBJTYPE_TABLE)); CheckObjSchemaNotAlreadyInPublication(rels, schemas, PUBLICATIONOBJ_TABLE); TransformPubWhereClauses(rels, queryString, pubform->pubviaroot); - PublicationAddTables(pubid, rels, false, stmt); + PublicationAddRelations(pubid, rels, false, stmt); } else if (stmt->action == AP_DropObjects) - PublicationDropTables(pubid, rels, false); + PublicationDropRelations(pubid, rels, false); else /* AP_SetObjects */ { List *oldrelids = GetPublicationRelations(pubid, + PUB_OBJTYPE_TABLE, PUBLICATION_PART_ROOT); List *delrels = NIL; ListCell *oldlc; @@ -1064,18 +1200,18 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, } /* And drop them. */ - PublicationDropTables(pubid, delrels, true); + PublicationDropRelations(pubid, delrels, true); /* * Don't bother calculating the difference for adding, we'll catch and * skip existing ones when doing catalog update. */ - PublicationAddTables(pubid, rels, true, stmt); + PublicationAddRelations(pubid, rels, true, stmt); - CloseTableList(delrels); + CloseRelationList(delrels); } - CloseTableList(rels); + CloseRelationList(rels); } /* @@ -1085,7 +1221,8 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, */ static void AlterPublicationSchemas(AlterPublicationStmt *stmt, - HeapTuple tup, List *schemaidlist) + HeapTuple tup, List *schemaidlist, + char objectType) { Form_pg_publication pubform = (Form_pg_publication) GETSTRUCT(tup); @@ -1107,20 +1244,20 @@ AlterPublicationSchemas(AlterPublicationStmt *stmt, List *rels; List *reloids; - reloids = GetPublicationRelations(pubform->oid, PUBLICATION_PART_ROOT); + reloids = GetPublicationRelations(pubform->oid, objectType, PUBLICATION_PART_ROOT); rels = OpenRelIdList(reloids); CheckObjSchemaNotAlreadyInPublication(rels, schemaidlist, PUBLICATIONOBJ_TABLES_IN_SCHEMA); - CloseTableList(rels); - PublicationAddSchemas(pubform->oid, schemaidlist, false, stmt); + CloseRelationList(rels); + PublicationAddSchemas(pubform->oid, schemaidlist, objectType, false, stmt); } else if (stmt->action == AP_DropObjects) - PublicationDropSchemas(pubform->oid, schemaidlist, false); + PublicationDropSchemas(pubform->oid, schemaidlist, objectType, false); else /* AP_SetObjects */ { - List *oldschemaids = GetPublicationSchemas(pubform->oid); + List *oldschemaids = GetPublicationSchemas(pubform->oid, objectType); List *delschemas = NIL; /* Identify which schemas should be dropped */ @@ -1133,13 +1270,13 @@ AlterPublicationSchemas(AlterPublicationStmt *stmt, LockSchemaList(delschemas); /* And drop them */ - PublicationDropSchemas(pubform->oid, delschemas, true); + PublicationDropSchemas(pubform->oid, delschemas, objectType, true); /* * Don't bother calculating the difference for adding, we'll catch and * skip existing ones when doing catalog update. */ - PublicationAddSchemas(pubform->oid, schemaidlist, true, stmt); + PublicationAddSchemas(pubform->oid, schemaidlist, objectType, true, stmt); } } @@ -1149,12 +1286,13 @@ AlterPublicationSchemas(AlterPublicationStmt *stmt, */ static void CheckAlterPublication(AlterPublicationStmt *stmt, HeapTuple tup, - List *tables, List *schemaidlist) + List *tables, List *tables_schemaidlist, + List *sequences, List *sequences_schemaidlist) { Form_pg_publication pubform = (Form_pg_publication) GETSTRUCT(tup); if ((stmt->action == AP_AddObjects || stmt->action == AP_SetObjects) && - schemaidlist && !superuser()) + (tables_schemaidlist || sequences_schemaidlist) && !superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to add or set schemas"))); @@ -1163,13 +1301,24 @@ CheckAlterPublication(AlterPublicationStmt *stmt, HeapTuple tup, * Check that user is allowed to manipulate the publication tables in * schema */ - if (schemaidlist && pubform->puballtables) + if (tables_schemaidlist && pubform->puballtables) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("publication \"%s\" is defined as FOR ALL TABLES", NameStr(pubform->pubname)), errdetail("Tables from schema cannot be added to, dropped from, or set on FOR ALL TABLES publications."))); + /* + * Check that user is allowed to manipulate the publication sequences in + * schema + */ + if (sequences_schemaidlist && pubform->puballsequences) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("publication \"%s\" is defined as FOR ALL SEQUENCES", + NameStr(pubform->pubname)), + errdetail("Sequences from schema cannot be added to, dropped from, or set on FOR ALL SEQUENCES publications."))); + /* Check that user is allowed to manipulate the publication tables. */ if (tables && pubform->puballtables) ereport(ERROR, @@ -1177,6 +1326,107 @@ CheckAlterPublication(AlterPublicationStmt *stmt, HeapTuple tup, errmsg("publication \"%s\" is defined as FOR ALL TABLES", NameStr(pubform->pubname)), errdetail("Tables cannot be added to or dropped from FOR ALL TABLES publications."))); + + /* Check that user is allowed to manipulate the publication tables. */ + if (sequences && pubform->puballsequences) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("publication \"%s\" is defined as FOR ALL SEQUENCES", + NameStr(pubform->pubname)), + errdetail("Sequences cannot be added to or dropped from FOR ALL SEQUENCES publications."))); +} + +/* + * Add or remove sequence to/from publication. + */ +static void +AlterPublicationSequences(AlterPublicationStmt *stmt, HeapTuple tup, + List *sequences, List *schemaidlist) +{ + List *rels = NIL; + Form_pg_publication pubform = (Form_pg_publication) GETSTRUCT(tup); + Oid pubid = pubform->oid; + + /* + * It is quite possible that for the SET case user has not specified any + * tables in which case we need to remove all the existing tables. + */ + if (!sequences && stmt->action != AP_SetObjects) + return; + + rels = OpenRelationList(sequences, PUB_OBJTYPE_SEQUENCE); + + if (stmt->action == AP_AddObjects) + { + List *schemas = NIL; + + /* + * Check if the relation is member of the existing schema in the + * publication or member of the schema list specified. + */ + schemas = list_concat_copy(schemaidlist, + GetPublicationSchemas(pubid, + PUB_OBJTYPE_SEQUENCE)); + CheckObjSchemaNotAlreadyInPublication(rels, schemas, + PUBLICATIONOBJ_SEQUENCE); + PublicationAddRelations(pubid, rels, false, stmt); + } + else if (stmt->action == AP_DropObjects) + PublicationDropRelations(pubid, rels, false); + else /* DEFELEM_SET */ + { + List *oldrelids = GetPublicationRelations(pubid, + PUB_OBJTYPE_SEQUENCE, + PUBLICATION_PART_ROOT); + List *delrels = NIL; + ListCell *oldlc; + + CheckObjSchemaNotAlreadyInPublication(rels, schemaidlist, + PUBLICATIONOBJ_SEQUENCE); + + /* Calculate which relations to drop. */ + foreach(oldlc, oldrelids) + { + Oid oldrelid = lfirst_oid(oldlc); + ListCell *newlc; + PublicationRelInfo *oldrel; + bool found = false; + + foreach(newlc, rels) + { + PublicationRelInfo *newpubrel; + + newpubrel = (PublicationRelInfo *) lfirst(newlc); + if (RelationGetRelid(newpubrel->relation) == oldrelid) + { + found = true; + break; + } + } + /* Not yet in the list, open it and add to the list */ + if (!found) + { + oldrel = palloc(sizeof(PublicationRelInfo)); + oldrel->whereClause = NULL; + oldrel->relation = table_open(oldrelid, + ShareUpdateExclusiveLock); + delrels = lappend(delrels, oldrel); + } + } + + /* And drop them. */ + PublicationDropRelations(pubid, delrels, true); + + /* + * Don't bother calculating the difference for adding, we'll catch and + * skip existing ones when doing catalog update. + */ + PublicationAddRelations(pubid, rels, true, stmt); + + CloseRelationList(delrels); + } + + CloseRelationList(rels); } /* @@ -1214,14 +1464,22 @@ AlterPublication(ParseState *pstate, AlterPublicationStmt *stmt) AlterPublicationOptions(pstate, stmt, rel, tup); else { - List *relations = NIL; + List *tables = NIL; + List *sequences = NIL; + List *tables_schemaidlist = NIL; + List *sequences_schemaidlist = NIL; List *schemaidlist = NIL; Oid pubid = pubform->oid; - ObjectsInPublicationToOids(stmt->pubobjects, pstate, &relations, + ObjectsInPublicationToOids(stmt->pubobjects, pstate, + &tables, &sequences, + &tables_schemaidlist, + &sequences_schemaidlist, &schemaidlist); - CheckAlterPublication(stmt, tup, relations, schemaidlist); + CheckAlterPublication(stmt, tup, + tables, tables_schemaidlist, + sequences, sequences_schemaidlist); heap_freetuple(tup); @@ -1249,9 +1507,16 @@ AlterPublication(ParseState *pstate, AlterPublicationStmt *stmt) errmsg("publication \"%s\" does not exist", stmt->pubname)); - AlterPublicationTables(stmt, tup, relations, schemaidlist, + AlterPublicationTables(stmt, tup, tables, tables_schemaidlist, pstate->p_sourcetext); - AlterPublicationSchemas(stmt, tup, schemaidlist); + + AlterPublicationSequences(stmt, tup, sequences, sequences_schemaidlist); + + AlterPublicationSchemas(stmt, tup, tables_schemaidlist, + PUB_OBJTYPE_TABLE); + + AlterPublicationSchemas(stmt, tup, sequences_schemaidlist, + PUB_OBJTYPE_SEQUENCE); } /* Cleanup. */ @@ -1319,7 +1584,7 @@ RemovePublicationById(Oid pubid) pubform = (Form_pg_publication) GETSTRUCT(tup); /* Invalidate relcache so that publication info is rebuilt. */ - if (pubform->puballtables) + if (pubform->puballtables || pubform->puballsequences) CacheInvalidateRelcacheAll(); CatalogTupleDelete(rel, &tup->t_self); @@ -1355,6 +1620,7 @@ RemovePublicationSchemaById(Oid psoid) * partitions. */ schemaRels = GetSchemaPublicationRelations(pubsch->pnnspid, + pubsch->pntype, PUBLICATION_PART_ALL); InvalidatePublicationRels(schemaRels); @@ -1397,29 +1663,45 @@ OpenRelIdList(List *relids) * add them to a publication. */ static List * -OpenTableList(List *tables) +OpenRelationList(List *rels, char objectType) { List *relids = NIL; - List *rels = NIL; + List *result = NIL; ListCell *lc; List *relids_with_rf = NIL; /* * Open, share-lock, and check all the explicitly-specified relations */ - foreach(lc, tables) + foreach(lc, rels) { PublicationTable *t = lfirst_node(PublicationTable, lc); bool recurse = t->relation->inh; Relation rel; Oid myrelid; PublicationRelInfo *pub_rel; + char myrelkind; /* Allow query cancel in case this takes a long time */ CHECK_FOR_INTERRUPTS(); rel = table_openrv(t->relation, ShareUpdateExclusiveLock); myrelid = RelationGetRelid(rel); + myrelkind = get_rel_relkind(myrelid); + + /* + * Make sure the relkind matches the expected object type. This may + * happen e.g. when adding a sequence using ADD TABLE or a table + * using ADD SEQUENCE). + * + * XXX We let through unsupported object types (views etc.). Those + * will be caught later in check_publication_add_relation. + */ + if (pub_get_object_type_for_relkind(myrelkind) != PUB_OBJTYPE_UNSUPPORTED && + pub_get_object_type_for_relkind(myrelkind) != objectType) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("object type does not match type expected by command")); /* * Filter out duplicates if user specifies "foo, foo". @@ -1444,7 +1726,7 @@ OpenTableList(List *tables) pub_rel = palloc(sizeof(PublicationRelInfo)); pub_rel->relation = rel; pub_rel->whereClause = t->whereClause; - rels = lappend(rels, pub_rel); + result = lappend(result, pub_rel); relids = lappend_oid(relids, myrelid); if (t->whereClause) @@ -1498,7 +1780,7 @@ OpenTableList(List *tables) pub_rel->relation = rel; /* child inherits WHERE clause from parent */ pub_rel->whereClause = t->whereClause; - rels = lappend(rels, pub_rel); + result = lappend(result, pub_rel); relids = lappend_oid(relids, childrelid); if (t->whereClause) @@ -1510,14 +1792,14 @@ OpenTableList(List *tables) list_free(relids); list_free(relids_with_rf); - return rels; + return result; } /* * Close all relations in the list. */ static void -CloseTableList(List *rels) +CloseRelationList(List *rels) { ListCell *lc; @@ -1565,12 +1847,12 @@ LockSchemaList(List *schemalist) * Add listed tables to the publication. */ static void -PublicationAddTables(Oid pubid, List *rels, bool if_not_exists, +PublicationAddRelations(Oid pubid, List *rels, bool if_not_exists, AlterPublicationStmt *stmt) { ListCell *lc; - Assert(!stmt || !stmt->for_all_tables); + Assert(!stmt || !stmt->for_all_objects); foreach(lc, rels) { @@ -1599,7 +1881,7 @@ PublicationAddTables(Oid pubid, List *rels, bool if_not_exists, * Remove listed tables from the publication. */ static void -PublicationDropTables(Oid pubid, List *rels, bool missing_ok) +PublicationDropRelations(Oid pubid, List *rels, bool missing_ok) { ObjectAddress obj; ListCell *lc; @@ -1639,19 +1921,19 @@ PublicationDropTables(Oid pubid, List *rels, bool missing_ok) * Add listed schemas to the publication. */ static void -PublicationAddSchemas(Oid pubid, List *schemas, bool if_not_exists, - AlterPublicationStmt *stmt) +PublicationAddSchemas(Oid pubid, List *schemas, char objectType, + bool if_not_exists, AlterPublicationStmt *stmt) { ListCell *lc; - Assert(!stmt || !stmt->for_all_tables); + Assert(!stmt || !stmt->for_all_objects); foreach(lc, schemas) { Oid schemaid = lfirst_oid(lc); ObjectAddress obj; - obj = publication_add_schema(pubid, schemaid, if_not_exists); + obj = publication_add_schema(pubid, schemaid, objectType, if_not_exists); if (stmt) { EventTriggerCollectSimpleCommand(obj, InvalidObjectAddress, @@ -1667,7 +1949,7 @@ PublicationAddSchemas(Oid pubid, List *schemas, bool if_not_exists, * Remove listed schemas from the publication. */ static void -PublicationDropSchemas(Oid pubid, List *schemas, bool missing_ok) +PublicationDropSchemas(Oid pubid, List *schemas, char objectType, bool missing_ok) { ObjectAddress obj; ListCell *lc; @@ -1677,10 +1959,11 @@ PublicationDropSchemas(Oid pubid, List *schemas, bool missing_ok) { Oid schemaid = lfirst_oid(lc); - psid = GetSysCacheOid2(PUBLICATIONNAMESPACEMAP, + psid = GetSysCacheOid3(PUBLICATIONNAMESPACEMAP, Anum_pg_publication_namespace_oid, ObjectIdGetDatum(schemaid), - ObjectIdGetDatum(pubid)); + ObjectIdGetDatum(pubid), + CharGetDatum(objectType)); if (!OidIsValid(psid)) { if (missing_ok) @@ -1735,6 +2018,13 @@ AlterPublicationOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId) NameStr(form->pubname)), errhint("The owner of a FOR ALL TABLES publication must be a superuser."))); + if (form->puballsequences && !superuser_arg(newOwnerId)) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied to change owner of publication \"%s\"", + NameStr(form->pubname)), + errhint("The owner of a FOR ALL SEQUENCES publication must be a superuser."))); + if (!superuser_arg(newOwnerId) && is_schema_publication(form->oid)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index c13cada3bf..717bb0b2aa 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -336,6 +336,160 @@ ResetSequence(Oid seq_relid) relation_close(seq_rel, NoLock); } +/* + * Update the sequence state by modifying the existing sequence data row. + * + * This keeps the same relfilenode, so the behavior is non-transactional. + */ +static void +SetSequence_non_transactional(Oid seqrelid, int64 last_value, int64 log_cnt, bool is_called) +{ + SeqTable elm; + Relation seqrel; + Buffer buf; + HeapTupleData seqdatatuple; + Form_pg_sequence_data seq; + + /* open and lock sequence */ + init_sequence(seqrelid, &elm, &seqrel); + + /* lock page' buffer and read tuple */ + seq = read_seq_tuple(seqrel, &buf, &seqdatatuple); + + /* check the comment above nextval_internal()'s equivalent call. */ + if (RelationNeedsWAL(seqrel)) + { + GetTopTransactionId(); + + if (XLogLogicalInfoActive()) + GetCurrentTransactionId(); + } + + /* ready to change the on-disk (or really, in-buffer) tuple */ + START_CRIT_SECTION(); + + seq->last_value = last_value; + seq->is_called = is_called; + seq->log_cnt = log_cnt; + + MarkBufferDirty(buf); + + /* XLOG stuff */ + if (RelationNeedsWAL(seqrel)) + { + xl_seq_rec xlrec; + XLogRecPtr recptr; + Page page = BufferGetPage(buf); + + XLogBeginInsert(); + XLogRegisterBuffer(0, buf, REGBUF_WILL_INIT); + + xlrec.node = seqrel->rd_node; + xlrec.created = false; + + XLogRegisterData((char *) &xlrec, sizeof(xl_seq_rec)); + XLogRegisterData((char *) seqdatatuple.t_data, seqdatatuple.t_len); + + recptr = XLogInsert(RM_SEQ_ID, XLOG_SEQ_LOG); + + PageSetLSN(page, recptr); + } + + END_CRIT_SECTION(); + + UnlockReleaseBuffer(buf); + + /* Clear local cache so that we don't think we have cached numbers */ + /* Note that we do not change the currval() state */ + elm->cached = elm->last; + + relation_close(seqrel, NoLock); +} + +/* + * Update the sequence state by creating a new relfilenode. + * + * This creates a new relfilenode, to allow transactional behavior. + */ +static void +SetSequence_transactional(Oid seq_relid, int64 last_value, int64 log_cnt, bool is_called) +{ + SeqTable elm; + Relation seqrel; + Buffer buf; + HeapTupleData seqdatatuple; + Form_pg_sequence_data seq; + HeapTuple tuple; + + /* open and lock sequence */ + init_sequence(seq_relid, &elm, &seqrel); + + /* lock page' buffer and read tuple */ + seq = read_seq_tuple(seqrel, &buf, &seqdatatuple); + + /* Copy the existing sequence tuple. */ + tuple = heap_copytuple(&seqdatatuple); + + /* Now we're done with the old page */ + UnlockReleaseBuffer(buf); + + /* + * Modify the copied tuple to update the sequence state (similar to what + * ResetSequence does). + */ + seq = (Form_pg_sequence_data) GETSTRUCT(tuple); + seq->last_value = last_value; + seq->is_called = is_called; + seq->log_cnt = log_cnt; + + /* + * Create a new storage file for the sequence - this is needed for the + * transactional behavior. + */ + RelationSetNewRelfilenode(seqrel, seqrel->rd_rel->relpersistence); + + /* + * Ensure sequence's relfrozenxid is at 0, since it won't contain any + * unfrozen XIDs. Same with relminmxid, since a sequence will never + * contain multixacts. + */ + Assert(seqrel->rd_rel->relfrozenxid == InvalidTransactionId); + Assert(seqrel->rd_rel->relminmxid == InvalidMultiXactId); + + /* + * Insert the modified tuple into the new storage file. This does all the + * necessary WAL-logging etc. + */ + fill_seq_with_data(seqrel, tuple); + + /* Clear local cache so that we don't think we have cached numbers */ + /* Note that we do not change the currval() state */ + elm->cached = elm->last; + + relation_close(seqrel, NoLock); +} + +/* + * Set a sequence to a specified internal state. + * + * The change is made transactionally, so that on failure of the current + * transaction, the sequence will be restored to its previous state. + * We do that by creating a whole new relfilenode for the sequence; so this + * works much like the rewriting forms of ALTER TABLE. + * + * Caller is assumed to have acquired AccessExclusiveLock on the sequence, + * which must not be released until end of transaction. Caller is also + * responsible for permissions checking. + */ +void +SetSequence(Oid seq_relid, bool transactional, int64 last_value, int64 log_cnt, bool is_called) +{ + if (transactional) + SetSequence_transactional(seq_relid, last_value, log_cnt, is_called); + else + SetSequence_non_transactional(seq_relid, last_value, log_cnt, is_called); +} + /* * Initialize a sequence's relation with the specified tuple as content */ diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index e16f04626d..abebffdf3b 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -90,6 +90,7 @@ typedef struct SubOpts } SubOpts; static List *fetch_table_list(WalReceiverConn *wrconn, List *publications); +static List *fetch_sequence_list(WalReceiverConn *wrconn, List *publications); static void check_duplicates_in_publist(List *publist, Datum *datums); static List *merge_publications(List *oldpublist, List *newpublist, bool addpub, const char *subname); static void ReportSlotConnectionError(List *rstates, Oid subid, char *slotname, char *err); @@ -541,9 +542,9 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, { char *err; WalReceiverConn *wrconn; - List *tables; + List *relations; ListCell *lc; - char table_state; + char sync_state; /* Try to connect to the publisher. */ wrconn = walrcv_connect(conninfo, true, stmt->subname, &err); @@ -558,14 +559,17 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, * Set sync state based on if we were asked to do data copy or * not. */ - table_state = opts.copy_data ? SUBREL_STATE_INIT : SUBREL_STATE_READY; + sync_state = opts.copy_data ? SUBREL_STATE_INIT : SUBREL_STATE_READY; /* - * Get the table list from publisher and build local table status - * info. + * Get the table and sequence list from publisher and build + * local relation sync status info. */ - tables = fetch_table_list(wrconn, publications); - foreach(lc, tables) + relations = fetch_table_list(wrconn, publications); + relations = list_concat(relations, + fetch_sequence_list(wrconn, publications)); + + foreach(lc, relations) { RangeVar *rv = (RangeVar *) lfirst(lc); Oid relid; @@ -576,7 +580,7 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, CheckSubscriptionRelkind(get_rel_relkind(relid), rv->schemaname, rv->relname); - AddSubscriptionRelState(subid, relid, table_state, + AddSubscriptionRelState(subid, relid, sync_state, InvalidXLogRecPtr); } @@ -602,12 +606,12 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, * * Note that if tables were specified but copy_data is false * then it is safe to enable two_phase up-front because those - * tables are already initially in READY state. When the - * subscription has no tables, we leave the twophase state as - * PENDING, to allow ALTER SUBSCRIPTION ... REFRESH + * relations are already initially in READY state. When the + * subscription has no relations, we leave the twophase state + * as PENDING, to allow ALTER SUBSCRIPTION ... REFRESH * PUBLICATION to work. */ - if (opts.twophase && !opts.copy_data && tables != NIL) + if (opts.twophase && !opts.copy_data && relations != NIL) twophase_enabled = true; walrcv_create_slot(wrconn, opts.slot_name, false, twophase_enabled, @@ -677,8 +681,10 @@ AlterSubscription_refresh(Subscription *sub, bool copy_data) PG_TRY(); { - /* Get the table list from publisher. */ + /* Get the list of relations from publisher. */ pubrel_names = fetch_table_list(wrconn, sub->publications); + pubrel_names = list_concat(pubrel_names, + fetch_sequence_list(wrconn, sub->publications)); /* Get local table list. */ subrel_states = GetSubscriptionRelations(sub->oid); @@ -1712,6 +1718,75 @@ fetch_table_list(WalReceiverConn *wrconn, List *publications) return tablelist; } +/* + * Get the list of sequences which belong to specified publications on the + * publisher connection. + */ +static List * +fetch_sequence_list(WalReceiverConn *wrconn, List *publications) +{ + WalRcvExecResult *res; + StringInfoData cmd; + TupleTableSlot *slot; + Oid tableRow[2] = {TEXTOID, TEXTOID}; + ListCell *lc; + bool first; + List *tablelist = NIL; + + Assert(list_length(publications) > 0); + + initStringInfo(&cmd); + appendStringInfoString(&cmd, "SELECT DISTINCT s.schemaname, s.sequencename\n" + " FROM pg_catalog.pg_publication_sequences s\n" + " WHERE s.pubname IN ("); + first = true; + foreach(lc, publications) + { + char *pubname = strVal(lfirst(lc)); + + if (first) + first = false; + else + appendStringInfoString(&cmd, ", "); + + appendStringInfoString(&cmd, quote_literal_cstr(pubname)); + } + appendStringInfoChar(&cmd, ')'); + + res = walrcv_exec(wrconn, cmd.data, 2, tableRow); + pfree(cmd.data); + + if (res->status != WALRCV_OK_TUPLES) + ereport(ERROR, + (errmsg("could not receive list of replicated sequences from the publisher: %s", + res->err))); + + /* Process sequences. */ + slot = MakeSingleTupleTableSlot(res->tupledesc, &TTSOpsMinimalTuple); + while (tuplestore_gettupleslot(res->tuplestore, true, false, slot)) + { + char *nspname; + char *relname; + bool isnull; + RangeVar *rv; + + nspname = TextDatumGetCString(slot_getattr(slot, 1, &isnull)); + Assert(!isnull); + relname = TextDatumGetCString(slot_getattr(slot, 2, &isnull)); + Assert(!isnull); + + rv = makeRangeVar(nspname, relname, -1); + tablelist = lappend(tablelist, rv); + + ExecClearTuple(slot); + } + ExecDropSingleTupleTableSlot(slot); + + walrcv_clear_result(res); + + return tablelist; +} + /* * This is to report the connection failure while dropping replication slots. * Here, we report the WARNING for all tablesync slots so that user can drop diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 80faae985e..124b9961dc 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -42,6 +42,7 @@ #include "catalog/pg_inherits.h" #include "catalog/pg_namespace.h" #include "catalog/pg_opclass.h" +#include "catalog/pg_publication_namespace.h" #include "catalog/pg_statistic_ext.h" #include "catalog/pg_tablespace.h" #include "catalog/pg_trigger.h" @@ -16381,11 +16382,14 @@ AlterTableNamespace(AlterObjectSchemaStmt *stmt, Oid *oldschema) * Check that setting the relation to a different schema won't result in a * publication having both a schema and the same schema's table, as this * is not supported. + * + * XXX We do this for tables and sequences, but it's better to keep the two + * blocks separate, to make the strings easier to translate. */ if (stmt->objectType == OBJECT_TABLE) { ListCell *lc; - List *schemaPubids = GetSchemaPublications(nspOid); + List *schemaPubids = GetSchemaPublications(nspOid, PUB_OBJTYPE_TABLE); List *relPubids = GetRelationPublications(RelationGetRelid(rel)); foreach(lc, relPubids) @@ -16403,6 +16407,27 @@ AlterTableNamespace(AlterObjectSchemaStmt *stmt, Oid *oldschema) get_publication_name(pubid, false))); } } + else if (stmt->objectType == OBJECT_SEQUENCE) + { + ListCell *lc; + List *schemaPubids = GetSchemaPublications(nspOid, PUB_OBJTYPE_SEQUENCE); + List *relPubids = GetRelationPublications(RelationGetRelid(rel)); + + foreach(lc, relPubids) + { + Oid pubid = lfirst_oid(lc); + + if (list_member_oid(schemaPubids, pubid)) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot move sequence \"%s\" to schema \"%s\"", + RelationGetRelationName(rel), stmt->newschema), + errdetail("The schema \"%s\" and same schema's sequence \"%s\" cannot be part of the same publication \"%s\".", + stmt->newschema, + RelationGetRelationName(rel), + get_publication_name(pubid, false))); + } + } /* common checks on switching namespaces */ CheckSetNamespace(oldNspOid, nspOid); diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c index 13328141e2..0df7cf5874 100644 --- a/src/backend/executor/execReplication.c +++ b/src/backend/executor/execReplication.c @@ -636,7 +636,9 @@ void CheckSubscriptionRelkind(char relkind, const char *nspname, const char *relname) { - if (relkind != RELKIND_RELATION && relkind != RELKIND_PARTITIONED_TABLE) + if (relkind != RELKIND_RELATION && + relkind != RELKIND_PARTITIONED_TABLE && + relkind != RELKIND_SEQUENCE) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot use relation \"%s.%s\" as logical replication target", diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index d4f8455a2b..55f720a88f 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -4862,7 +4862,7 @@ _copyCreatePublicationStmt(const CreatePublicationStmt *from) COPY_STRING_FIELD(pubname); COPY_NODE_FIELD(options); COPY_NODE_FIELD(pubobjects); - COPY_SCALAR_FIELD(for_all_tables); + COPY_NODE_FIELD(for_all_objects); return newnode; } @@ -4875,7 +4875,7 @@ _copyAlterPublicationStmt(const AlterPublicationStmt *from) COPY_STRING_FIELD(pubname); COPY_NODE_FIELD(options); COPY_NODE_FIELD(pubobjects); - COPY_SCALAR_FIELD(for_all_tables); + COPY_NODE_FIELD(for_all_objects); COPY_SCALAR_FIELD(action); return newnode; diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index f1002afe7a..82562eb9b8 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -2333,7 +2333,7 @@ _equalCreatePublicationStmt(const CreatePublicationStmt *a, COMPARE_STRING_FIELD(pubname); COMPARE_NODE_FIELD(options); COMPARE_NODE_FIELD(pubobjects); - COMPARE_SCALAR_FIELD(for_all_tables); + COMPARE_NODE_FIELD(for_all_objects); return true; } @@ -2345,7 +2345,7 @@ _equalAlterPublicationStmt(const AlterPublicationStmt *a, COMPARE_STRING_FIELD(pubname); COMPARE_NODE_FIELD(options); COMPARE_NODE_FIELD(pubobjects); - COMPARE_SCALAR_FIELD(for_all_tables); + COMPARE_NODE_FIELD(for_all_objects); COMPARE_SCALAR_FIELD(action); return true; diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 0036c2f9e2..e327bc735f 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -446,7 +446,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); transform_element_list transform_type_list TriggerTransitions TriggerReferencing vacuum_relation_list opt_vacuum_relation_list - drop_option_list pub_obj_list + drop_option_list pub_obj_list pub_obj_type_list %type opt_routine_body %type group_clause @@ -575,6 +575,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type var_value zone_value %type auth_ident RoleSpec opt_granted_by %type PublicationObjSpec +%type pub_obj_type %type unreserved_keyword type_func_name_keyword %type col_name_keyword reserved_keyword @@ -9701,12 +9702,9 @@ AlterOwnerStmt: ALTER AGGREGATE aggregate_with_argtypes OWNER TO RoleSpec * * CREATE PUBLICATION FOR ALL TABLES [WITH options] * - * CREATE PUBLICATION FOR pub_obj [, ...] [WITH options] - * - * pub_obj is one of: + * CREATE PUBLICATION FOR ALL SEQUENCES [WITH options] * - * TABLE table [, ...] - * ALL TABLES IN SCHEMA schema [, ...] + * CREATE PUBLICATION FOR pub_obj [, ...] [WITH options] * *****************************************************************************/ @@ -9718,12 +9716,12 @@ CreatePublicationStmt: n->options = $4; $$ = (Node *)n; } - | CREATE PUBLICATION name FOR ALL TABLES opt_definition + | CREATE PUBLICATION name FOR ALL pub_obj_type_list opt_definition { CreatePublicationStmt *n = makeNode(CreatePublicationStmt); n->pubname = $3; n->options = $7; - n->for_all_tables = true; + n->for_all_objects = $6; $$ = (Node *)n; } | CREATE PUBLICATION name FOR pub_obj_list opt_definition @@ -9772,6 +9770,26 @@ PublicationObjSpec: $$->pubobjtype = PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA; $$->location = @5; } + | SEQUENCE relation_expr + { + $$ = makeNode(PublicationObjSpec); + $$->pubobjtype = PUBLICATIONOBJ_SEQUENCE; + $$->pubtable = makeNode(PublicationTable); + $$->pubtable->relation = $2; + } + | ALL SEQUENCES IN_P SCHEMA ColId + { + $$ = makeNode(PublicationObjSpec); + $$->pubobjtype = PUBLICATIONOBJ_SEQUENCES_IN_SCHEMA; + $$->name = $5; + $$->location = @5; + } + | ALL SEQUENCES IN_P SCHEMA CURRENT_SCHEMA + { + $$ = makeNode(PublicationObjSpec); + $$->pubobjtype = PUBLICATIONOBJ_SEQUENCES_IN_CUR_SCHEMA; + $$->location = @5; + } | ColId OptWhereClause { $$ = makeNode(PublicationObjSpec); @@ -9826,6 +9844,19 @@ pub_obj_list: PublicationObjSpec { $$ = lappend($1, $3); } ; +pub_obj_type: TABLES + { $$ = (Node *) makeString("tables"); } + | SEQUENCES + { $$ = (Node *) makeString("sequences"); } + ; + +pub_obj_type_list: pub_obj_type + { $$ = list_make1($1); } + | pub_obj_type_list ',' pub_obj_type + { $$ = lappend($1, $3); } + ; + + /***************************************************************************** * * ALTER PUBLICATION name SET ( options ) @@ -9836,11 +9867,6 @@ pub_obj_list: PublicationObjSpec * * ALTER PUBLICATION name SET pub_obj [, ...] * - * pub_obj is one of: - * - * TABLE table_name [, ...] - * ALL TABLES IN SCHEMA schema_name [, ...] - * *****************************************************************************/ AlterPublicationStmt: diff --git a/src/backend/replication/logical/proto.c b/src/backend/replication/logical/proto.c index c9b0eeefd7..3dbe85d61a 100644 --- a/src/backend/replication/logical/proto.c +++ b/src/backend/replication/logical/proto.c @@ -648,6 +648,56 @@ logicalrep_write_message(StringInfo out, TransactionId xid, XLogRecPtr lsn, pq_sendbytes(out, message, sz); } +/* + * Write SEQUENCE to stream + */ +void +logicalrep_write_sequence(StringInfo out, Relation rel, TransactionId xid, + XLogRecPtr lsn, bool transactional, + int64 last_value, int64 log_cnt, bool is_called) +{ + uint8 flags = 0; + char *relname; + + pq_sendbyte(out, LOGICAL_REP_MSG_SEQUENCE); + + /* transaction ID (if not valid, we're not streaming) */ + if (TransactionIdIsValid(xid)) + pq_sendint32(out, xid); + + pq_sendint8(out, flags); + pq_sendint64(out, lsn); + + logicalrep_write_namespace(out, RelationGetNamespace(rel)); + relname = RelationGetRelationName(rel); + pq_sendstring(out, relname); + + pq_sendint8(out, transactional); + pq_sendint64(out, last_value); + pq_sendint64(out, log_cnt); + pq_sendint8(out, is_called); +} + +/* + * Read SEQUENCE from the stream. + */ +void +logicalrep_read_sequence(StringInfo in, LogicalRepSequence *seqdata) +{ + /* XXX skipping flags and lsn */ + pq_getmsgint(in, 1); + pq_getmsgint64(in); + + /* Read relation name from stream */ + seqdata->nspname = pstrdup(logicalrep_read_namespace(in)); + seqdata->seqname = pstrdup(pq_getmsgstring(in)); + + seqdata->transactional = pq_getmsgint(in, 1); + seqdata->last_value = pq_getmsgint64(in); + seqdata->log_cnt = pq_getmsgint64(in); + seqdata->is_called = pq_getmsgint(in, 1); +} + /* * Write relation description to the output stream. */ @@ -1203,6 +1253,8 @@ logicalrep_message_type(LogicalRepMsgType action) return "STREAM ABORT"; case LOGICAL_REP_MSG_STREAM_PREPARE: return "STREAM PREPARE"; + case LOGICAL_REP_MSG_SEQUENCE: + return "SEQUENCE"; } elog(ERROR, "invalid logical replication message type \"%c\"", action); diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index 1659964571..d8b12d94bc 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -100,6 +100,7 @@ #include "catalog/pg_subscription_rel.h" #include "catalog/pg_type.h" #include "commands/copy.h" +#include "commands/sequence.h" #include "miscadmin.h" #include "parser/parse_relation.h" #include "pgstat.h" @@ -999,6 +1000,95 @@ copy_table(Relation rel) logicalrep_rel_close(relmapentry, NoLock); } +/* + * Fetch sequence data (current state) from the remote node. + */ +static void +fetch_sequence_data(char *nspname, char *relname, + int64 *last_value, int64 *log_cnt, bool *is_called) +{ + WalRcvExecResult *res; + StringInfoData cmd; + TupleTableSlot *slot; + Oid tableRow[3] = {INT8OID, INT8OID, BOOLOID}; + + initStringInfo(&cmd); + appendStringInfo(&cmd, "SELECT last_value, log_cnt, is_called\n" + " FROM %s", quote_qualified_identifier(nspname, relname)); + + res = walrcv_exec(LogRepWorkerWalRcvConn, cmd.data, 3, tableRow); + pfree(cmd.data); + + if (res->status != WALRCV_OK_TUPLES) + ereport(ERROR, + (errmsg("could not receive list of replicated tables from the publisher: %s", + res->err))); + + /* Process the sequence. */ + slot = MakeSingleTupleTableSlot(res->tupledesc, &TTSOpsMinimalTuple); + while (tuplestore_gettupleslot(res->tuplestore, true, false, slot)) + { + bool isnull; + + *last_value = DatumGetInt64(slot_getattr(slot, 1, &isnull)); + Assert(!isnull); + + *log_cnt = DatumGetInt64(slot_getattr(slot, 2, &isnull)); + Assert(!isnull); + + *is_called = DatumGetBool(slot_getattr(slot, 3, &isnull)); + Assert(!isnull); + + ExecClearTuple(slot); + } + ExecDropSingleTupleTableSlot(slot); + + walrcv_clear_result(res); +} + +/* + * Copy existing data of a sequence from publisher. + * + * Caller is responsible for locking the local relation. + */ +static void +copy_sequence(Relation rel) +{ + LogicalRepRelMapEntry *relmapentry; + LogicalRepRelation lrel; + List *qual = NIL; + StringInfoData cmd; + int64 last_value = 0, + log_cnt = 0; + bool is_called = 0; + + /* Get the publisher relation info. */ + fetch_remote_table_info(get_namespace_name(RelationGetNamespace(rel)), + RelationGetRelationName(rel), &lrel, &qual); + + /* sequences don't have row filters */ + Assert(!qual); + + /* Put the relation into relmap. */ + logicalrep_relmap_update(&lrel); + + /* Map the publisher relation to local one. */ + relmapentry = logicalrep_rel_open(lrel.remoteid, NoLock); + Assert(rel == relmapentry->localrel); + + /* Start copy on the publisher. */ + initStringInfo(&cmd); + + Assert(lrel.relkind == RELKIND_SEQUENCE); + + fetch_sequence_data(lrel.nspname, lrel.relname, &last_value, &log_cnt, &is_called); + + /* tablesync sets the sequences in non-transactional way */ + SetSequence(RelationGetRelid(rel), false, last_value, log_cnt, is_called); + + logicalrep_rel_close(relmapentry, NoLock); +} + /* * Determine the tablesync slot name. * @@ -1260,10 +1350,21 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) originname))); } - /* Now do the initial data copy */ - PushActiveSnapshot(GetTransactionSnapshot()); - copy_table(rel); - PopActiveSnapshot(); + /* Do the right action depending on the relation kind. */ + if (get_rel_relkind(RelationGetRelid(rel)) == RELKIND_SEQUENCE) + { + /* Now do the initial sequence copy */ + PushActiveSnapshot(GetTransactionSnapshot()); + copy_sequence(rel); + PopActiveSnapshot(); + } + else + { + /* Now do the initial data copy */ + PushActiveSnapshot(GetTransactionSnapshot()); + copy_table(rel); + PopActiveSnapshot(); + } res = walrcv_exec(LogRepWorkerWalRcvConn, "COMMIT", 0, NULL); if (res->status != WALRCV_OK_COMMAND) diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 82dcffc2db..f3868b3e1f 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -143,6 +143,7 @@ #include "catalog/pg_subscription.h" #include "catalog/pg_subscription_rel.h" #include "catalog/pg_tablespace.h" +#include "commands/sequence.h" #include "commands/tablecmds.h" #include "commands/tablespace.h" #include "commands/trigger.h" @@ -1143,6 +1144,57 @@ apply_handle_origin(StringInfo s) errmsg_internal("ORIGIN message sent out of order"))); } +/* + * Handle SEQUENCE message. + */ +static void +apply_handle_sequence(StringInfo s) +{ + LogicalRepSequence seq; + Oid relid; + + if (handle_streamed_transaction(LOGICAL_REP_MSG_SEQUENCE, s)) + return; + + logicalrep_read_sequence(s, &seq); + + /* + * Non-transactional sequence updates should not be part of a remote + * transaction. There should not be any running transaction. + */ + Assert((!seq.transactional) || in_remote_transaction); + Assert(!(!seq.transactional && in_remote_transaction)); + Assert(!(!seq.transactional && IsTransactionState())); + + /* + * Make sure we're in a transaction (needed by SetSequence). For + * non-transactional updates we're guaranteed to start a new one, + * and we'll commit it at the end. + */ + if (!IsTransactionState()) + { + StartTransactionCommand(); + maybe_reread_subscription(); + } + + relid = RangeVarGetRelid(makeRangeVar(seq.nspname, + seq.seqname, -1), + RowExclusiveLock, false); + + /* lock the sequence in AccessExclusiveLock, as expected by SetSequence */ + LockRelationOid(relid, AccessExclusiveLock); + + /* apply the sequence change */ + SetSequence(relid, seq.transactional, seq.last_value, seq.log_cnt, seq.is_called); + + /* + * Commit the per-stream transaction (we only do this when not in + * remote transaction, i.e. for non-transactional sequence updates. + */ + if (!in_remote_transaction) + CommitTransactionCommand(); +} + /* * Handle STREAM START message. */ @@ -2511,6 +2563,10 @@ apply_dispatch(StringInfo s) */ break; + case LOGICAL_REP_MSG_SEQUENCE: + apply_handle_sequence(s); + return; + case LOGICAL_REP_MSG_STREAM_START: apply_handle_stream_start(s); break; diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 5fddab3a3d..4cdc698cbb 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -15,6 +15,7 @@ #include "access/tupconvert.h" #include "catalog/partition.h" #include "catalog/pg_publication.h" +#include "catalog/pg_publication_namespace.h" #include "catalog/pg_publication_rel.h" #include "commands/defrem.h" #include "executor/executor.h" @@ -53,6 +54,10 @@ static void pgoutput_message(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr message_lsn, bool transactional, const char *prefix, Size sz, const char *message); +static void pgoutput_sequence(LogicalDecodingContext *ctx, + ReorderBufferTXN *txn, XLogRecPtr sequence_lsn, + Relation relation, bool transactional, + int64 last_value, int64 log_cnt, bool is_called); static bool pgoutput_origin_filter(LogicalDecodingContext *ctx, RepOriginId origin_id); static void pgoutput_begin_prepare_txn(LogicalDecodingContext *ctx, @@ -208,6 +213,7 @@ _PG_output_plugin_init(OutputPluginCallbacks *cb) cb->change_cb = pgoutput_change; cb->truncate_cb = pgoutput_truncate; cb->message_cb = pgoutput_message; + cb->sequence_cb = pgoutput_sequence; cb->commit_cb = pgoutput_commit_txn; cb->begin_prepare_cb = pgoutput_begin_prepare_txn; @@ -224,6 +230,7 @@ _PG_output_plugin_init(OutputPluginCallbacks *cb) cb->stream_commit_cb = pgoutput_stream_commit; cb->stream_change_cb = pgoutput_change; cb->stream_message_cb = pgoutput_message; + cb->stream_sequence_cb = pgoutput_sequence; cb->stream_truncate_cb = pgoutput_truncate; /* transaction streaming - two-phase commit */ cb->stream_prepare_cb = pgoutput_stream_prepare_txn; @@ -237,6 +244,7 @@ parse_output_parameters(List *options, PGOutputData *data) bool publication_names_given = false; bool binary_option_given = false; bool messages_option_given = false; + bool sequences_option_given = false; bool streaming_given = false; bool two_phase_option_given = false; @@ -244,6 +252,7 @@ parse_output_parameters(List *options, PGOutputData *data) data->streaming = false; data->messages = false; data->two_phase = false; + data->sequences = true; foreach(lc, options) { @@ -312,6 +321,16 @@ parse_output_parameters(List *options, PGOutputData *data) data->messages = defGetBoolean(defel); } + else if (strcmp(defel->defname, "sequences") == 0) + { + if (sequences_option_given) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("conflicting or redundant options"))); + sequences_option_given = true; + + data->sequences = defGetBoolean(defel); + } else if (strcmp(defel->defname, "streaming") == 0) { if (streaming_given) @@ -1440,6 +1459,51 @@ pgoutput_message(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, OutputPluginWrite(ctx, true); } +static void +pgoutput_sequence(LogicalDecodingContext *ctx, + ReorderBufferTXN *txn, XLogRecPtr sequence_lsn, + Relation relation, bool transactional, + int64 last_value, int64 log_cnt, bool is_called) +{ + PGOutputData *data = (PGOutputData *) ctx->output_plugin_private; + TransactionId xid = InvalidTransactionId; + RelationSyncEntry *relentry; + + if (!data->sequences) + return; + + if (!is_publishable_relation(relation)) + return; + + /* + * Remember the xid for the message in streaming mode. See + * pgoutput_change. + */ + if (in_streaming) + xid = txn->xid; + + relentry = get_rel_sync_entry(data, relation); + + /* + * First check the sequence filter. + * + * We handle just REORDER_BUFFER_CHANGE_SEQUENCE here. + */ + if (!relentry->pubactions.pubsequence) + return; + + OutputPluginPrepareWrite(ctx, true); + logicalrep_write_sequence(ctx->out, + relation, + xid, + sequence_lsn, + transactional, + last_value, + log_cnt, + is_called); + OutputPluginWrite(ctx, true); +} + /* * Currently we always forward. */ @@ -1725,7 +1789,8 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) entry->schema_sent = false; entry->streamed_txns = NIL; entry->pubactions.pubinsert = entry->pubactions.pubupdate = - entry->pubactions.pubdelete = entry->pubactions.pubtruncate = false; + entry->pubactions.pubdelete = entry->pubactions.pubtruncate = + entry->pubactions.pubsequence = false; entry->new_slot = NULL; entry->old_slot = NULL; memset(entry->exprstate, 0, sizeof(entry->exprstate)); @@ -1739,13 +1804,13 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) { Oid schemaId = get_rel_namespace(relid); List *pubids = GetRelationPublications(relid); - + char objectType = pub_get_object_type_for_relkind(get_rel_relkind(relid)); /* * We don't acquire a lock on the namespace system table as we build * the cache entry using a historic snapshot and all the later changes * are absorbed while decoding WAL. */ - List *schemaPubids = GetSchemaPublications(schemaId); + List *schemaPubids = GetSchemaPublications(schemaId, objectType); ListCell *lc; Oid publish_as_relid = relid; int publish_ancestor_level = 0; @@ -1780,6 +1845,7 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) entry->pubactions.pubupdate = false; entry->pubactions.pubdelete = false; entry->pubactions.pubtruncate = false; + entry->pubactions.pubsequence = false; /* * Tuple slots cleanups. (Will be rebuilt later if needed). @@ -1826,9 +1892,11 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) /* * If this is a FOR ALL TABLES publication, pick the partition root - * and set the ancestor level accordingly. + * and set the ancestor level accordingly. If this is a FOR ALL + * SEQUENCES publication, we publish it too but we don't need to + * pick the partition root etc. */ - if (pub->alltables) + if (pub->alltables || pub->allsequences) { publish = true; if (pub->pubviaroot && am_partition) @@ -1889,6 +1957,7 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) entry->pubactions.pubupdate |= pub->pubactions.pubupdate; entry->pubactions.pubdelete |= pub->pubactions.pubdelete; entry->pubactions.pubtruncate |= pub->pubactions.pubtruncate; + entry->pubactions.pubsequence |= pub->pubactions.pubsequence; /* * We want to publish the changes as the top-most ancestor diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 3d05297b0d..4f3fe1118a 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -56,6 +56,7 @@ #include "catalog/pg_opclass.h" #include "catalog/pg_proc.h" #include "catalog/pg_publication.h" +#include "catalog/pg_publication_namespace.h" #include "catalog/pg_rewrite.h" #include "catalog/pg_shseclabel.h" #include "catalog/pg_statistic_ext.h" @@ -5562,6 +5563,8 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) Oid schemaid; List *ancestors = NIL; Oid relid = RelationGetRelid(relation); + char relkind = relation->rd_rel->relkind; + char objType; /* * If not publishable, it publishes no actions. (pgoutput_change() will @@ -5588,8 +5591,15 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) /* Fetch the publication membership info. */ puboids = GetRelationPublications(relid); schemaid = RelationGetNamespace(relation); - puboids = list_concat_unique_oid(puboids, GetSchemaPublications(schemaid)); + objType = pub_get_object_type_for_relkind(relkind); + puboids = list_concat_unique_oid(puboids, + GetSchemaPublications(schemaid, objType)); + + /* + * If this is a partion (and thus a table), lookup all ancestors and track + * all publications them too. + */ if (relation->rd_rel->relispartition) { /* Add publications that the ancestors are in too. */ @@ -5601,12 +5611,23 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) puboids = list_concat_unique_oid(puboids, GetRelationPublications(ancestor)); + + /* include all publications publishing schema of all ancestors */ schemaid = get_rel_namespace(ancestor); puboids = list_concat_unique_oid(puboids, - GetSchemaPublications(schemaid)); + GetSchemaPublications(schemaid, + PUB_OBJTYPE_TABLE)); } } - puboids = list_concat_unique_oid(puboids, GetAllTablesPublications()); + + /* + * Consider also FOR ALL TABLES and FOR ALL SEQUENCES publications, + * depending on the relkind of the relation. + */ + if (relation->rd_rel->relkind == RELKIND_SEQUENCE) + puboids = list_concat_unique_oid(puboids, GetAllSequencesPublications()); + else + puboids = list_concat_unique_oid(puboids, GetAllTablesPublications()); foreach(lc, puboids) { @@ -5625,6 +5646,7 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) pubdesc->pubactions.pubupdate |= pubform->pubupdate; pubdesc->pubactions.pubdelete |= pubform->pubdelete; pubdesc->pubactions.pubtruncate |= pubform->pubtruncate; + pubdesc->pubactions.pubsequence |= pubform->pubsequence; /* * Check if all columns referenced in the filter expression are part of diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c index f4e7819f1e..a675877d19 100644 --- a/src/backend/utils/cache/syscache.c +++ b/src/backend/utils/cache/syscache.c @@ -630,12 +630,12 @@ static const struct cachedesc cacheinfo[] = { 64 }, {PublicationNamespaceRelationId, /* PUBLICATIONNAMESPACEMAP */ - PublicationNamespacePnnspidPnpubidIndexId, - 2, + PublicationNamespacePnnspidPnpubidPntypeIndexId, + 3, { Anum_pg_publication_namespace_pnnspid, Anum_pg_publication_namespace_pnpubid, - 0, + Anum_pg_publication_namespace_pntype, 0 }, 64 diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index e5816c4cce..00629f0836 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -3814,10 +3814,12 @@ getPublications(Archive *fout, int *numPublications) int i_pubname; int i_pubowner; int i_puballtables; + int i_puballsequences; int i_pubinsert; int i_pubupdate; int i_pubdelete; int i_pubtruncate; + int i_pubsequence; int i_pubviaroot; int i, ntups; @@ -3833,23 +3835,29 @@ getPublications(Archive *fout, int *numPublications) resetPQExpBuffer(query); /* Get the publications. */ - if (fout->remoteVersion >= 130000) + if (fout->remoteVersion >= 150000) + appendPQExpBuffer(query, + "SELECT p.tableoid, p.oid, p.pubname, " + "p.pubowner, " + "p.puballtables, p.puballsequences, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, p.pubsequence, p.pubviaroot " + "FROM pg_publication p"); + else if (fout->remoteVersion >= 130000) appendPQExpBuffer(query, "SELECT p.tableoid, p.oid, p.pubname, " "p.pubowner, " - "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, p.pubviaroot " + "p.puballtables, false AS puballsequences, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, false AS pubsequence, p.pubviaroot " "FROM pg_publication p"); else if (fout->remoteVersion >= 110000) appendPQExpBuffer(query, "SELECT p.tableoid, p.oid, p.pubname, " "p.pubowner, " - "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, false AS pubviaroot " + "p.puballtables, false AS puballsequences, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, false AS pubsequence, false AS pubviaroot " "FROM pg_publication p"); else appendPQExpBuffer(query, "SELECT p.tableoid, p.oid, p.pubname, " "p.pubowner, " - "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, false AS pubtruncate, false AS pubviaroot " + "p.puballtables, false AS puballsequences, p.pubinsert, p.pubupdate, p.pubdelete, false AS pubtruncate, false AS pubsequence, false AS pubviaroot " "FROM pg_publication p"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -3861,10 +3869,12 @@ getPublications(Archive *fout, int *numPublications) i_pubname = PQfnumber(res, "pubname"); i_pubowner = PQfnumber(res, "pubowner"); i_puballtables = PQfnumber(res, "puballtables"); + i_puballsequences = PQfnumber(res, "puballsequences"); i_pubinsert = PQfnumber(res, "pubinsert"); i_pubupdate = PQfnumber(res, "pubupdate"); i_pubdelete = PQfnumber(res, "pubdelete"); i_pubtruncate = PQfnumber(res, "pubtruncate"); + i_pubsequence = PQfnumber(res, "pubsequence"); i_pubviaroot = PQfnumber(res, "pubviaroot"); pubinfo = pg_malloc(ntups * sizeof(PublicationInfo)); @@ -3880,6 +3890,8 @@ getPublications(Archive *fout, int *numPublications) pubinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_pubowner)); pubinfo[i].puballtables = (strcmp(PQgetvalue(res, i, i_puballtables), "t") == 0); + pubinfo[i].puballsequences = + (strcmp(PQgetvalue(res, i, i_puballsequences), "t") == 0); pubinfo[i].pubinsert = (strcmp(PQgetvalue(res, i, i_pubinsert), "t") == 0); pubinfo[i].pubupdate = @@ -3888,6 +3900,8 @@ getPublications(Archive *fout, int *numPublications) (strcmp(PQgetvalue(res, i, i_pubdelete), "t") == 0); pubinfo[i].pubtruncate = (strcmp(PQgetvalue(res, i, i_pubtruncate), "t") == 0); + pubinfo[i].pubsequence = + (strcmp(PQgetvalue(res, i, i_pubsequence), "t") == 0); pubinfo[i].pubviaroot = (strcmp(PQgetvalue(res, i, i_pubviaroot), "t") == 0); @@ -3933,6 +3947,9 @@ dumpPublication(Archive *fout, const PublicationInfo *pubinfo) if (pubinfo->puballtables) appendPQExpBufferStr(query, " FOR ALL TABLES"); + if (pubinfo->puballsequences) + appendPQExpBufferStr(query, " FOR ALL SEQUENCES"); + appendPQExpBufferStr(query, " WITH (publish = '"); if (pubinfo->pubinsert) { @@ -3967,6 +3984,15 @@ dumpPublication(Archive *fout, const PublicationInfo *pubinfo) first = false; } + if (pubinfo->pubsequence) + { + if (!first) + appendPQExpBufferStr(query, ", "); + + appendPQExpBufferStr(query, "sequence"); + first = false; + } + appendPQExpBufferStr(query, "'"); if (pubinfo->pubviaroot) @@ -4013,6 +4039,7 @@ getPublicationNamespaces(Archive *fout) int i_oid; int i_pnpubid; int i_pnnspid; + int i_pntype; int i, j, ntups; @@ -4024,7 +4051,7 @@ getPublicationNamespaces(Archive *fout) /* Collect all publication membership info. */ appendPQExpBufferStr(query, - "SELECT tableoid, oid, pnpubid, pnnspid " + "SELECT tableoid, oid, pnpubid, pnnspid, pntype " "FROM pg_catalog.pg_publication_namespace"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -4034,6 +4061,7 @@ getPublicationNamespaces(Archive *fout) i_oid = PQfnumber(res, "oid"); i_pnpubid = PQfnumber(res, "pnpubid"); i_pnnspid = PQfnumber(res, "pnnspid"); + i_pntype = PQfnumber(res, "pntype"); /* this allocation may be more than we need */ pubsinfo = pg_malloc(ntups * sizeof(PublicationSchemaInfo)); @@ -4043,6 +4071,7 @@ getPublicationNamespaces(Archive *fout) { Oid pnpubid = atooid(PQgetvalue(res, i, i_pnpubid)); Oid pnnspid = atooid(PQgetvalue(res, i, i_pnnspid)); + char pntype = PQgetvalue(res, i, i_pntype)[0]; PublicationInfo *pubinfo; NamespaceInfo *nspinfo; @@ -4074,6 +4103,7 @@ getPublicationNamespaces(Archive *fout) pubsinfo[j].dobj.name = nspinfo->dobj.name; pubsinfo[j].publication = pubinfo; pubsinfo[j].pubschema = nspinfo; + pubsinfo[j].pubtype = pntype; /* Decide whether we want to dump it */ selectDumpablePublicationObject(&(pubsinfo[j].dobj), fout); @@ -4207,7 +4237,11 @@ dumpPublicationNamespace(Archive *fout, const PublicationSchemaInfo *pubsinfo) query = createPQExpBuffer(); appendPQExpBuffer(query, "ALTER PUBLICATION %s ", fmtId(pubinfo->dobj.name)); - appendPQExpBuffer(query, "ADD ALL TABLES IN SCHEMA %s;\n", fmtId(schemainfo->dobj.name)); + + if (pubsinfo->pubtype == 't') + appendPQExpBuffer(query, "ADD ALL TABLES IN SCHEMA %s;\n", fmtId(schemainfo->dobj.name)); + else + appendPQExpBuffer(query, "ADD ALL SEQUENCES IN SCHEMA %s;\n", fmtId(schemainfo->dobj.name)); /* * There is no point in creating drop query as the drop is done by schema @@ -4240,6 +4274,7 @@ dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo) TableInfo *tbinfo = pubrinfo->pubtable; PQExpBuffer query; char *tag; + char *description; /* Do nothing in data-only dump */ if (dopt->dataOnly) @@ -4249,10 +4284,22 @@ dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo) query = createPQExpBuffer(); - appendPQExpBuffer(query, "ALTER PUBLICATION %s ADD TABLE ONLY", - fmtId(pubinfo->dobj.name)); + if (tbinfo->relkind == RELKIND_SEQUENCE) + { + appendPQExpBuffer(query, "ALTER PUBLICATION %s ADD SEQUENCE", + fmtId(pubinfo->dobj.name)); + description = "PUBLICATION SEQUENCE"; + } + else + { + appendPQExpBuffer(query, "ALTER PUBLICATION %s ADD TABLE ONLY", + fmtId(pubinfo->dobj.name)); + description = "PUBLICATION TABLE"; + } + appendPQExpBuffer(query, " %s", fmtQualifiedDumpable(tbinfo)); + if (pubrinfo->pubrelqual) { /* @@ -4275,7 +4322,7 @@ dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo) ARCHIVE_OPTS(.tag = tag, .namespace = tbinfo->dobj.namespace->dobj.name, .owner = pubinfo->rolname, - .description = "PUBLICATION TABLE", + .description = description, .section = SECTION_POST_DATA, .createStmt = query->data)); diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 772dc0cf7a..893725d121 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -615,10 +615,12 @@ typedef struct _PublicationInfo DumpableObject dobj; const char *rolname; bool puballtables; + bool puballsequences; bool pubinsert; bool pubupdate; bool pubdelete; bool pubtruncate; + bool pubsequence; bool pubviaroot; } PublicationInfo; @@ -643,6 +645,7 @@ typedef struct _PublicationSchemaInfo DumpableObject dobj; PublicationInfo *publication; NamespaceInfo *pubschema; + char pubtype; } PublicationSchemaInfo; /* diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index fd1052e5db..19f908f600 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -2358,7 +2358,7 @@ create_order => 50, create_sql => 'CREATE PUBLICATION pub1;', regexp => qr/^ - \QCREATE PUBLICATION pub1 WITH (publish = 'insert, update, delete, truncate');\E + \QCREATE PUBLICATION pub1 WITH (publish = 'insert, update, delete, truncate, sequence');\E /xm, like => { %full_runs, section_post_data => 1, }, }, @@ -2378,16 +2378,27 @@ create_order => 50, create_sql => 'CREATE PUBLICATION pub3;', regexp => qr/^ - \QCREATE PUBLICATION pub3 WITH (publish = 'insert, update, delete, truncate');\E + \QCREATE PUBLICATION pub3 WITH (publish = 'insert, update, delete, truncate, sequence');\E /xm, like => { %full_runs, section_post_data => 1, }, }, 'CREATE PUBLICATION pub4' => { create_order => 50, - create_sql => 'CREATE PUBLICATION pub4;', + create_sql => 'CREATE PUBLICATION pub4 + FOR ALL SEQUENCES + WITH (publish = \'\');', regexp => qr/^ - \QCREATE PUBLICATION pub4 WITH (publish = 'insert, update, delete, truncate');\E + \QCREATE PUBLICATION pub4 FOR ALL SEQUENCES WITH (publish = '');\E + /xm, + like => { %full_runs, section_post_data => 1, }, + }, + + 'CREATE PUBLICATION pub5' => { + create_order => 50, + create_sql => 'CREATE PUBLICATION pub5;', + regexp => qr/^ + \QCREATE PUBLICATION pub5 WITH (publish = 'insert, update, delete, truncate, sequence');\E /xm, like => { %full_runs, section_post_data => 1, }, }, @@ -2474,6 +2485,27 @@ unlike => { exclude_dump_test_schema => 1, }, }, + 'ALTER PUBLICATION pub3 ADD ALL SEQUENCES IN SCHEMA dump_test' => { + create_order => 51, + create_sql => + 'ALTER PUBLICATION pub3 ADD ALL SEQUENCES IN SCHEMA dump_test;', + regexp => qr/^ + \QALTER PUBLICATION pub3 ADD ALL SEQUENCES IN SCHEMA dump_test;\E + /xm, + like => { %full_runs, section_post_data => 1, }, + unlike => { exclude_dump_test_schema => 1, }, + }, + + 'ALTER PUBLICATION pub3 ADD ALL SEQUENCES IN SCHEMA public' => { + create_order => 52, + create_sql => + 'ALTER PUBLICATION pub3 ADD ALL SEQUENCES IN SCHEMA public;', + regexp => qr/^ + \QALTER PUBLICATION pub3 ADD ALL SEQUENCES IN SCHEMA public;\E + /xm, + like => { %full_runs, section_post_data => 1, }, + }, + 'CREATE SCHEMA public' => { regexp => qr/^CREATE SCHEMA public;/m, diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 714097cad1..b8a532a45f 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -1633,28 +1633,19 @@ describeOneTableDetails(const char *schemaname, if (tableinfo.relkind == RELKIND_SEQUENCE) { PGresult *result = NULL; - printQueryOpt myopt = pset.popt; - char *footers[2] = {NULL, NULL}; if (pset.sversion >= 100000) { printfPQExpBuffer(&buf, - "SELECT pg_catalog.format_type(seqtypid, NULL) AS \"%s\",\n" - " seqstart AS \"%s\",\n" - " seqmin AS \"%s\",\n" - " seqmax AS \"%s\",\n" - " seqincrement AS \"%s\",\n" - " CASE WHEN seqcycle THEN '%s' ELSE '%s' END AS \"%s\",\n" - " seqcache AS \"%s\"\n", - gettext_noop("Type"), - gettext_noop("Start"), - gettext_noop("Minimum"), - gettext_noop("Maximum"), - gettext_noop("Increment"), + "SELECT pg_catalog.format_type(seqtypid, NULL),\n" + " seqstart,\n" + " seqmin,\n" + " seqmax,\n" + " seqincrement,\n" + " CASE WHEN seqcycle THEN '%s' ELSE '%s' END,\n" + " seqcache\n", gettext_noop("yes"), - gettext_noop("no"), - gettext_noop("Cycles?"), - gettext_noop("Cache")); + gettext_noop("no")); appendPQExpBuffer(&buf, "FROM pg_catalog.pg_sequence\n" "WHERE seqrelid = '%s';", @@ -1663,22 +1654,15 @@ describeOneTableDetails(const char *schemaname, else { printfPQExpBuffer(&buf, - "SELECT 'bigint' AS \"%s\",\n" - " start_value AS \"%s\",\n" - " min_value AS \"%s\",\n" - " max_value AS \"%s\",\n" - " increment_by AS \"%s\",\n" - " CASE WHEN is_cycled THEN '%s' ELSE '%s' END AS \"%s\",\n" - " cache_value AS \"%s\"\n", - gettext_noop("Type"), - gettext_noop("Start"), - gettext_noop("Minimum"), - gettext_noop("Maximum"), - gettext_noop("Increment"), + "SELECT 'bigint',\n" + " start_value,\n" + " min_value,\n" + " max_value,\n" + " increment_by,\n" + " CASE WHEN is_cycled THEN '%s' ELSE '%s' END,\n" + " cache_value\n", gettext_noop("yes"), - gettext_noop("no"), - gettext_noop("Cycles?"), - gettext_noop("Cache")); + gettext_noop("no")); appendPQExpBuffer(&buf, "FROM %s", fmtId(schemaname)); /* must be separate because fmtId isn't reentrant */ appendPQExpBuffer(&buf, ".%s;", fmtId(relationname)); @@ -1688,6 +1672,51 @@ describeOneTableDetails(const char *schemaname, if (!res) goto error_return; + numrows = PQntuples(res); + + /* XXX reset to use expanded output for sequences (maybe we should + * keep this disabled, just like for tables?) */ + myopt.expanded = pset.popt.topt.expanded; + + printTableInit(&cont, &myopt, title.data, 7, numrows); + printTableInitialized = true; + + printfPQExpBuffer(&title, _("Sequence \"%s.%s\""), + schemaname, relationname); + + printTableAddHeader(&cont, gettext_noop("Type"), true, 'l'); + printTableAddHeader(&cont, gettext_noop("Start"), true, 'r'); + printTableAddHeader(&cont, gettext_noop("Minimum"), true, 'r'); + printTableAddHeader(&cont, gettext_noop("Maximum"), true, 'r'); + printTableAddHeader(&cont, gettext_noop("Increment"), true, 'r'); + printTableAddHeader(&cont, gettext_noop("Cycles?"), true, 'l'); + printTableAddHeader(&cont, gettext_noop("Cache"), true, 'r'); + + /* Generate table cells to be printed */ + for (i = 0; i < numrows; i++) + { + /* Type */ + printTableAddCell(&cont, PQgetvalue(res, i, 0), false, false); + + /* Start */ + printTableAddCell(&cont, PQgetvalue(res, i, 1), false, false); + + /* Minimum */ + printTableAddCell(&cont, PQgetvalue(res, i, 2), false, false); + + /* Maximum */ + printTableAddCell(&cont, PQgetvalue(res, i, 3), false, false); + + /* Increment */ + printTableAddCell(&cont, PQgetvalue(res, i, 4), false, false); + + /* Cycles? */ + printTableAddCell(&cont, PQgetvalue(res, i, 5), false, false); + + /* Cache */ + printTableAddCell(&cont, PQgetvalue(res, i, 6), false, false); + } + /* Footer information about a sequence */ /* Get the column that owns this sequence */ @@ -1721,29 +1750,63 @@ describeOneTableDetails(const char *schemaname, switch (PQgetvalue(result, 0, 1)[0]) { case 'a': - footers[0] = psprintf(_("Owned by: %s"), - PQgetvalue(result, 0, 0)); + printTableAddFooter(&cont, + psprintf(_("Owned by: %s"), + PQgetvalue(result, 0, 0))); break; case 'i': - footers[0] = psprintf(_("Sequence for identity column: %s"), - PQgetvalue(result, 0, 0)); + printTableAddFooter(&cont, + psprintf(_("Sequence for identity column: %s"), + PQgetvalue(result, 0, 0))); break; } } PQclear(result); - printfPQExpBuffer(&title, _("Sequence \"%s.%s\""), - schemaname, relationname); + /* print any publications */ + if (pset.sversion >= 150000) + { + int tuples = 0; - myopt.footers = footers; - myopt.topt.default_footer = false; - myopt.title = title.data; - myopt.translate_header = true; + printfPQExpBuffer(&buf, + "SELECT pubname\n" + "FROM pg_catalog.pg_publication p\n" + " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" + " JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid\n" + "WHERE pc.oid ='%s' and pn.pntype = 's' and pg_catalog.pg_relation_is_publishable('%s')\n" + "UNION\n" + "SELECT pubname\n" + "FROM pg_catalog.pg_publication p\n" + " JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n" + "WHERE pr.prrelid = '%s'\n" + "UNION\n" + "SELECT pubname\n" + "FROM pg_catalog.pg_publication p\n" + "WHERE p.puballsequences AND pg_catalog.pg_relation_is_publishable('%s')\n" + "ORDER BY 1;", + oid, oid, oid, oid); - printQuery(res, &myopt, pset.queryFout, false, pset.logfile); + result = PSQLexec(buf.data); + if (!result) + goto error_return; + else + tuples = PQntuples(result); + + if (tuples > 0) + printTableAddFooter(&cont, _("Publications:")); + + /* Might be an empty set - that's ok */ + for (i = 0; i < tuples; i++) + { + printfPQExpBuffer(&buf, " \"%s\"", + PQgetvalue(result, i, 0)); + + printTableAddFooter(&cont, buf.data); + } + PQclear(result); + } - if (footers[0]) - free(footers[0]); + printTable(&cont, pset.queryFout, false, pset.logfile); retval = true; goto error_return; /* not an error, just return early */ @@ -1970,6 +2033,11 @@ describeOneTableDetails(const char *schemaname, for (i = 0; i < cols; i++) printTableAddHeader(&cont, headers[i], true, 'l'); + res = PSQLexec(buf.data); + if (!res) + goto error_return; + numrows = PQntuples(res); + /* Generate table cells to be printed */ for (i = 0; i < numrows; i++) { @@ -2895,7 +2963,7 @@ describeOneTableDetails(const char *schemaname, "FROM pg_catalog.pg_publication p\n" " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" " JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid\n" - "WHERE pc.oid ='%s' and pg_catalog.pg_relation_is_publishable('%s')\n" + "WHERE pc.oid ='%s' and pn.pntype = 't' and pg_catalog.pg_relation_is_publishable('%s')\n" "UNION\n" "SELECT pubname\n" " , pg_get_expr(pr.prqual, c.oid)\n" @@ -4785,7 +4853,7 @@ listSchemas(const char *pattern, bool verbose, bool showSystem) int i; printfPQExpBuffer(&buf, - "SELECT pubname \n" + "SELECT pubname, (CASE WHEN pntype = 't' THEN 'tables' ELSE 'sequences' END) AS pubtype\n" "FROM pg_catalog.pg_publication p\n" " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" " JOIN pg_catalog.pg_namespace n ON n.oid = pn.pnnspid \n" @@ -4814,8 +4882,9 @@ listSchemas(const char *pattern, bool verbose, bool showSystem) /* Might be an empty set - that's ok */ for (i = 0; i < pub_schema_tuples; i++) { - printfPQExpBuffer(&buf, " \"%s\"", - PQgetvalue(result, i, 0)); + printfPQExpBuffer(&buf, " \"%s\" (%s)", + PQgetvalue(result, i, 0), + PQgetvalue(result, i, 1)); footers[i + 1] = pg_strdup(buf.data); } @@ -5820,7 +5889,7 @@ listPublications(const char *pattern) PQExpBufferData buf; PGresult *res; printQueryOpt myopt = pset.popt; - static const bool translate_columns[] = {false, false, false, false, false, false, false, false}; + static const bool translate_columns[] = {false, false, false, false, false, false, false, false, false, false}; if (pset.sversion < 100000) { @@ -5834,23 +5903,45 @@ listPublications(const char *pattern) initPQExpBuffer(&buf); - printfPQExpBuffer(&buf, - "SELECT pubname AS \"%s\",\n" - " pg_catalog.pg_get_userbyid(pubowner) AS \"%s\",\n" - " puballtables AS \"%s\",\n" - " pubinsert AS \"%s\",\n" - " pubupdate AS \"%s\",\n" - " pubdelete AS \"%s\"", - gettext_noop("Name"), - gettext_noop("Owner"), - gettext_noop("All tables"), - gettext_noop("Inserts"), - gettext_noop("Updates"), - gettext_noop("Deletes")); + if (pset.sversion >= 150000) + printfPQExpBuffer(&buf, + "SELECT pubname AS \"%s\",\n" + " pg_catalog.pg_get_userbyid(pubowner) AS \"%s\",\n" + " puballtables AS \"%s\",\n" + " puballsequences AS \"%s\",\n" + " pubinsert AS \"%s\",\n" + " pubupdate AS \"%s\",\n" + " pubdelete AS \"%s\"", + gettext_noop("Name"), + gettext_noop("Owner"), + gettext_noop("All tables"), + gettext_noop("All sequences"), + gettext_noop("Inserts"), + gettext_noop("Updates"), + gettext_noop("Deletes")); + else + printfPQExpBuffer(&buf, + "SELECT pubname AS \"%s\",\n" + " pg_catalog.pg_get_userbyid(pubowner) AS \"%s\",\n" + " puballtables AS \"%s\",\n" + " pubinsert AS \"%s\",\n" + " pubupdate AS \"%s\",\n" + " pubdelete AS \"%s\"", + gettext_noop("Name"), + gettext_noop("Owner"), + gettext_noop("All tables"), + gettext_noop("Inserts"), + gettext_noop("Updates"), + gettext_noop("Deletes")); + if (pset.sversion >= 110000) appendPQExpBuffer(&buf, ",\n pubtruncate AS \"%s\"", gettext_noop("Truncates")); + if (pset.sversion >= 150000) + appendPQExpBuffer(&buf, + ",\n pubsequence AS \"%s\"", + gettext_noop("Sequences")); if (pset.sversion >= 130000) appendPQExpBuffer(&buf, ",\n pubviaroot AS \"%s\"", @@ -5936,6 +6027,7 @@ describePublications(const char *pattern) PGresult *res; bool has_pubtruncate; bool has_pubviaroot; + bool has_pubsequence; PQExpBufferData title; printTableContent cont; @@ -5952,6 +6044,7 @@ describePublications(const char *pattern) has_pubtruncate = (pset.sversion >= 110000); has_pubviaroot = (pset.sversion >= 130000); + has_pubsequence = (pset.sversion >= 150000); initPQExpBuffer(&buf); @@ -5959,12 +6052,17 @@ describePublications(const char *pattern) "SELECT oid, pubname,\n" " pg_catalog.pg_get_userbyid(pubowner) AS owner,\n" " puballtables, pubinsert, pubupdate, pubdelete"); + if (has_pubtruncate) appendPQExpBufferStr(&buf, ", pubtruncate"); if (has_pubviaroot) appendPQExpBufferStr(&buf, ", pubviaroot"); + if (has_pubsequence) + appendPQExpBufferStr(&buf, + ", puballsequences, pubsequence"); + appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_publication\n"); @@ -6005,6 +6103,7 @@ describePublications(const char *pattern) char *pubid = PQgetvalue(res, i, 0); char *pubname = PQgetvalue(res, i, 1); bool puballtables = strcmp(PQgetvalue(res, i, 3), "t") == 0; + bool puballsequences = strcmp(PQgetvalue(res, i, 9), "t") == 0; printTableOpt myopt = pset.popt.topt; if (has_pubtruncate) @@ -6012,29 +6111,43 @@ describePublications(const char *pattern) if (has_pubviaroot) ncols++; + /* sequences have two extra columns (puballsequences, pubsequences) */ + if (has_pubsequence) + ncols += 2; + initPQExpBuffer(&title); printfPQExpBuffer(&title, _("Publication %s"), pubname); printTableInit(&cont, &myopt, title.data, ncols, nrows); printTableAddHeader(&cont, gettext_noop("Owner"), true, align); printTableAddHeader(&cont, gettext_noop("All tables"), true, align); + if (has_pubsequence) + printTableAddHeader(&cont, gettext_noop("All sequences"), true, align); printTableAddHeader(&cont, gettext_noop("Inserts"), true, align); printTableAddHeader(&cont, gettext_noop("Updates"), true, align); printTableAddHeader(&cont, gettext_noop("Deletes"), true, align); if (has_pubtruncate) printTableAddHeader(&cont, gettext_noop("Truncates"), true, align); + if (has_pubsequence) + printTableAddHeader(&cont, gettext_noop("Sequences"), true, align); if (has_pubviaroot) printTableAddHeader(&cont, gettext_noop("Via root"), true, align); - printTableAddCell(&cont, PQgetvalue(res, i, 2), false, false); - printTableAddCell(&cont, PQgetvalue(res, i, 3), false, false); - printTableAddCell(&cont, PQgetvalue(res, i, 4), false, false); - printTableAddCell(&cont, PQgetvalue(res, i, 5), false, false); - printTableAddCell(&cont, PQgetvalue(res, i, 6), false, false); + printTableAddCell(&cont, PQgetvalue(res, i, 2), false, false); /* owner */ + printTableAddCell(&cont, PQgetvalue(res, i, 3), false, false); /* all tables */ + + if (has_pubsequence) + printTableAddCell(&cont, PQgetvalue(res, i, 9), false, false); /* all sequences */ + + printTableAddCell(&cont, PQgetvalue(res, i, 4), false, false); /* insert */ + printTableAddCell(&cont, PQgetvalue(res, i, 5), false, false); /* update */ + printTableAddCell(&cont, PQgetvalue(res, i, 6), false, false); /* delete */ if (has_pubtruncate) - printTableAddCell(&cont, PQgetvalue(res, i, 7), false, false); + printTableAddCell(&cont, PQgetvalue(res, i, 7), false, false); /* truncate */ + if (has_pubsequence) + printTableAddCell(&cont, PQgetvalue(res, i, 10), false, false); /* sequence */ if (has_pubviaroot) - printTableAddCell(&cont, PQgetvalue(res, i, 8), false, false); + printTableAddCell(&cont, PQgetvalue(res, i, 8), false, false); /* via root */ if (!puballtables) { @@ -6054,6 +6167,7 @@ describePublications(const char *pattern) "WHERE c.relnamespace = n.oid\n" " AND c.oid = pr.prrelid\n" " AND pr.prpubid = '%s'\n" + " AND c.relkind != 'S'\n" /* exclude sequences */ "ORDER BY 1,2", pubid); if (!addFooterToPublicationDesc(&buf, "Tables:", false, &cont)) goto error_return; @@ -6065,7 +6179,7 @@ describePublications(const char *pattern) "SELECT n.nspname\n" "FROM pg_catalog.pg_namespace n\n" " JOIN pg_catalog.pg_publication_namespace pn ON n.oid = pn.pnnspid\n" - "WHERE pn.pnpubid = '%s'\n" + "WHERE pn.pnpubid = '%s' AND pn.pntype = 't'\n" "ORDER BY 1", pubid); if (!addFooterToPublicationDesc(&buf, "Tables from schemas:", true, &cont)) @@ -6073,6 +6187,37 @@ describePublications(const char *pattern) } } + if (!puballsequences) + { + /* Get the tables for the specified publication */ + printfPQExpBuffer(&buf, + "SELECT n.nspname, c.relname, NULL\n" + "FROM pg_catalog.pg_class c,\n" + " pg_catalog.pg_namespace n,\n" + " pg_catalog.pg_publication_rel pr\n" + "WHERE c.relnamespace = n.oid\n" + " AND c.oid = pr.prrelid\n" + " AND pr.prpubid = '%s'\n" + " AND c.relkind = 'S'\n" /* only sequences */ + "ORDER BY 1,2", pubid); + if (!addFooterToPublicationDesc(&buf, "Sequences:", false, &cont)) + goto error_return; + + if (pset.sversion >= 150000) + { + /* Get the schemas for the specified publication */ + printfPQExpBuffer(&buf, + "SELECT n.nspname\n" + "FROM pg_catalog.pg_namespace n\n" + " JOIN pg_catalog.pg_publication_namespace pn ON n.oid = pn.pnnspid\n" + "WHERE pn.pnpubid = '%s' AND pn.pntype = 's'\n" + "ORDER BY 1", pubid); + if (!addFooterToPublicationDesc(&buf, "Sequences from schemas:", + true, &cont)) + goto error_return; + } + } + printTable(&cont, pset.queryFout, false, pset.logfile); printTableCleanup(&cont); diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 5c064595a9..e59bd8302d 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1815,11 +1815,15 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("ADD", "DROP", "OWNER TO", "RENAME TO", "SET"); /* ALTER PUBLICATION ADD */ else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD")) - COMPLETE_WITH("ALL TABLES IN SCHEMA", "TABLE"); + COMPLETE_WITH("ALL TABLES IN SCHEMA", "ALL SEQUENCES IN SCHEMA", "TABLE", "SEQUENCE"); else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE") || (HeadMatches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE") && ends_with(prev_wd, ','))) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); + else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "SEQUENCE") || + (HeadMatches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "SEQUENCE") && + ends_with(prev_wd, ','))) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences); /* * "ALTER PUBLICATION SET TABLE WHERE (" - complete with * table attributes @@ -1838,11 +1842,11 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH(","); /* ALTER PUBLICATION DROP */ else if (Matches("ALTER", "PUBLICATION", MatchAny, "DROP")) - COMPLETE_WITH("ALL TABLES IN SCHEMA", "TABLE"); + COMPLETE_WITH("ALL TABLES IN SCHEMA", "ALL SEQUENCES IN SCHEMA", "TABLE", "SEQUENCE"); /* ALTER PUBLICATION SET */ else if (Matches("ALTER", "PUBLICATION", MatchAny, "SET")) - COMPLETE_WITH("(", "ALL TABLES IN SCHEMA", "TABLE"); - else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD|DROP|SET", "ALL", "TABLES", "IN", "SCHEMA")) + COMPLETE_WITH("(", "ALL TABLES IN SCHEMA", "ALL SEQUENCES IN SCHEMA", "TABLE", "SEQUENCE"); + else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD|DROP|SET", "ALL", "TABLES|SEQUENCES", "IN", "SCHEMA")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas " AND nspname NOT LIKE E'pg\\\\_%%'", "CURRENT_SCHEMA"); diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index d8e8715ed1..699bd0aa3e 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -11540,6 +11540,11 @@ provolatile => 's', prorettype => 'oid', proargtypes => 'text', proallargtypes => '{text,oid}', proargmodes => '{i,o}', proargnames => '{pubname,relid}', prosrc => 'pg_get_publication_tables' }, +{ oid => '8000', descr => 'get OIDs of sequences in a publication', + proname => 'pg_get_publication_sequences', prorows => '1000', proretset => 't', + provolatile => 's', prorettype => 'oid', proargtypes => 'text', + proallargtypes => '{text,oid}', proargmodes => '{i,o}', + proargnames => '{pubname,relid}', prosrc => 'pg_get_publication_sequences' }, { oid => '6121', descr => 'returns whether a relation can be part of a publication', proname => 'pg_relation_is_publishable', provolatile => 's', diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h index fe773cf9b7..97f26208e1 100644 --- a/src/include/catalog/pg_publication.h +++ b/src/include/catalog/pg_publication.h @@ -40,6 +40,12 @@ CATALOG(pg_publication,6104,PublicationRelationId) */ bool puballtables; + /* + * indicates that this is special publication which should encompass all + * sequences in the database (except for the unlogged and temp ones) + */ + bool puballsequences; + /* true if inserts are published */ bool pubinsert; @@ -52,6 +58,9 @@ CATALOG(pg_publication,6104,PublicationRelationId) /* true if truncates are published */ bool pubtruncate; + /* true if sequences are published */ + bool pubsequence; + /* true if partition changes are published using root schema */ bool pubviaroot; } FormData_pg_publication; @@ -72,6 +81,7 @@ typedef struct PublicationActions bool pubupdate; bool pubdelete; bool pubtruncate; + bool pubsequence; } PublicationActions; typedef struct PublicationDesc @@ -92,6 +102,7 @@ typedef struct Publication Oid oid; char *name; bool alltables; + bool allsequences; bool pubviaroot; PublicationActions pubactions; } Publication; @@ -122,14 +133,15 @@ typedef enum PublicationPartOpt PUBLICATION_PART_ALL, } PublicationPartOpt; -extern List *GetPublicationRelations(Oid pubid, PublicationPartOpt pub_partopt); +extern List *GetPublicationRelations(Oid pubid, char objectType, + PublicationPartOpt pub_partopt); extern List *GetAllTablesPublications(void); extern List *GetAllTablesPublicationRelations(bool pubviaroot); -extern List *GetPublicationSchemas(Oid pubid); -extern List *GetSchemaPublications(Oid schemaid); -extern List *GetSchemaPublicationRelations(Oid schemaid, +extern List *GetPublicationSchemas(Oid pubid, char objectType); +extern List *GetSchemaPublications(Oid schemaid, char objectType); +extern List *GetSchemaPublicationRelations(Oid schemaid, char objectType, PublicationPartOpt pub_partopt); -extern List *GetAllSchemaPublicationRelations(Oid puboid, +extern List *GetAllSchemaPublicationRelations(Oid puboid, char objectType, PublicationPartOpt pub_partopt); extern List *GetPubPartitionOptionRelations(List *result, PublicationPartOpt pub_partopt, @@ -137,11 +149,15 @@ extern List *GetPubPartitionOptionRelations(List *result, extern Oid GetTopMostAncestorInPublication(Oid puboid, List *ancestors, int *ancestor_level); +extern List *GetAllSequencesPublications(void); +extern List *GetAllSequencesPublicationRelations(void); + extern bool is_publishable_relation(Relation rel); extern bool is_schema_publication(Oid pubid); extern ObjectAddress publication_add_relation(Oid pubid, PublicationRelInfo *pri, bool if_not_exists); extern ObjectAddress publication_add_schema(Oid pubid, Oid schemaid, + char objectType, bool if_not_exists); extern Oid get_publication_oid(const char *pubname, bool missing_ok); diff --git a/src/include/catalog/pg_publication_namespace.h b/src/include/catalog/pg_publication_namespace.h index e4306da02e..7340a1ec64 100644 --- a/src/include/catalog/pg_publication_namespace.h +++ b/src/include/catalog/pg_publication_namespace.h @@ -32,6 +32,7 @@ CATALOG(pg_publication_namespace,8901,PublicationNamespaceRelationId) Oid oid; /* oid */ Oid pnpubid BKI_LOOKUP(pg_publication); /* Oid of the publication */ Oid pnnspid BKI_LOOKUP(pg_namespace); /* Oid of the schema */ + char pntype; /* object type to include */ } FormData_pg_publication_namespace; /* ---------------- @@ -42,6 +43,13 @@ CATALOG(pg_publication_namespace,8901,PublicationNamespaceRelationId) typedef FormData_pg_publication_namespace *Form_pg_publication_namespace; DECLARE_UNIQUE_INDEX_PKEY(pg_publication_namespace_oid_index, 8902, PublicationNamespaceObjectIndexId, on pg_publication_namespace using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_index, 8903, PublicationNamespacePnnspidPnpubidIndexId, on pg_publication_namespace using btree(pnnspid oid_ops, pnpubid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_pntype_index, 8903, PublicationNamespacePnnspidPnpubidPntypeIndexId, on pg_publication_namespace using btree(pnnspid oid_ops, pnpubid oid_ops, pntype char_ops)); + +/* object type to include from a schema, maps to relkind */ +#define PUB_OBJTYPE_TABLE 't' /* table (regular or partitioned) */ +#define PUB_OBJTYPE_SEQUENCE 's' /* sequence object */ +#define PUB_OBJTYPE_UNSUPPORTED 'u' /* used for non-replicated types */ + +extern char pub_get_object_type_for_relkind(char relkind); #endif /* PG_PUBLICATION_NAMESPACE_H */ diff --git a/src/include/commands/sequence.h b/src/include/commands/sequence.h index 9fecc41954..5bab90db8e 100644 --- a/src/include/commands/sequence.h +++ b/src/include/commands/sequence.h @@ -60,6 +60,7 @@ extern ObjectAddress DefineSequence(ParseState *pstate, CreateSeqStmt *stmt); extern ObjectAddress AlterSequence(ParseState *pstate, AlterSeqStmt *stmt); extern void DeleteSequenceTuple(Oid relid); extern void ResetSequence(Oid seq_relid); +extern void SetSequence(Oid seq_relid, bool transactional, int64 last_value, int64 log_cnt, bool is_called); extern void ResetSequenceCaches(void); extern void seq_redo(XLogReaderState *rptr); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 2f618cb229..cb1fcc0ee3 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3665,6 +3665,10 @@ typedef enum PublicationObjSpecType PUBLICATIONOBJ_TABLES_IN_SCHEMA, /* All tables in schema */ PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA, /* All tables in first element of * search_path */ + PUBLICATIONOBJ_SEQUENCE, /* Sequence type */ + PUBLICATIONOBJ_SEQUENCES_IN_SCHEMA, /* Sequences in schema type */ + PUBLICATIONOBJ_SEQUENCES_IN_CUR_SCHEMA, /* Get the first element of + * search_path */ PUBLICATIONOBJ_CONTINUATION /* Continuation of previous type */ } PublicationObjSpecType; @@ -3683,7 +3687,7 @@ typedef struct CreatePublicationStmt char *pubname; /* Name of the publication */ List *options; /* List of DefElem nodes */ List *pubobjects; /* Optional list of publication objects */ - bool for_all_tables; /* Special publication for all tables in db */ + List *for_all_objects; /* Special publication for all objects in db */ } CreatePublicationStmt; typedef enum AlterPublicationAction @@ -3706,7 +3710,7 @@ typedef struct AlterPublicationStmt * objects. */ List *pubobjects; /* Optional list of publication objects */ - bool for_all_tables; /* Special publication for all tables in db */ + List *for_all_objects; /* Special publication for all objects in db */ AlterPublicationAction action; /* What action to perform with the given * objects */ } AlterPublicationStmt; diff --git a/src/include/replication/logicalproto.h b/src/include/replication/logicalproto.h index 4d2c881644..fb86ca022d 100644 --- a/src/include/replication/logicalproto.h +++ b/src/include/replication/logicalproto.h @@ -61,6 +61,7 @@ typedef enum LogicalRepMsgType LOGICAL_REP_MSG_RELATION = 'R', LOGICAL_REP_MSG_TYPE = 'Y', LOGICAL_REP_MSG_MESSAGE = 'M', + LOGICAL_REP_MSG_SEQUENCE = 'Q', LOGICAL_REP_MSG_BEGIN_PREPARE = 'b', LOGICAL_REP_MSG_PREPARE = 'P', LOGICAL_REP_MSG_COMMIT_PREPARED = 'K', @@ -118,6 +119,18 @@ typedef struct LogicalRepTyp char *typname; /* name of the remote type */ } LogicalRepTyp; +/* Sequence info */ +typedef struct LogicalRepSequence +{ + Oid remoteid; /* unique id of the remote sequence */ + char *nspname; /* schema name of remote sequence */ + char *seqname; /* name of the remote sequence */ + bool transactional; + int64 last_value; + int64 log_cnt; + bool is_called; +} LogicalRepSequence; + /* Transaction info */ typedef struct LogicalRepBeginData { @@ -230,6 +243,12 @@ extern List *logicalrep_read_truncate(StringInfo in, bool *cascade, bool *restart_seqs); extern void logicalrep_write_message(StringInfo out, TransactionId xid, XLogRecPtr lsn, bool transactional, const char *prefix, Size sz, const char *message); +extern void logicalrep_write_sequence(StringInfo out, Relation rel, + TransactionId xid, XLogRecPtr lsn, + bool transactional, + int64 last_value, int64 log_cnt, + bool is_called); +extern void logicalrep_read_sequence(StringInfo in, LogicalRepSequence *seqdata); extern void logicalrep_write_rel(StringInfo out, TransactionId xid, Relation rel); extern LogicalRepRelation *logicalrep_read_rel(StringInfo in); diff --git a/src/include/replication/pgoutput.h b/src/include/replication/pgoutput.h index eafedd610a..f4e9f35d09 100644 --- a/src/include/replication/pgoutput.h +++ b/src/include/replication/pgoutput.h @@ -29,6 +29,7 @@ typedef struct PGOutputData bool streaming; bool messages; bool two_phase; + bool sequences; } PGOutputData; #endif /* PGOUTPUT_H */ diff --git a/src/test/regress/expected/object_address.out b/src/test/regress/expected/object_address.out index 4117fc27c9..c95d44b3db 100644 --- a/src/test/regress/expected/object_address.out +++ b/src/test/regress/expected/object_address.out @@ -46,6 +46,7 @@ CREATE TRANSFORM FOR int LANGUAGE SQL ( SET client_min_messages = 'ERROR'; CREATE PUBLICATION addr_pub FOR TABLE addr_nsp.gentable; CREATE PUBLICATION addr_pub_schema FOR ALL TABLES IN SCHEMA addr_nsp; +CREATE PUBLICATION addr_pub_schema2 FOR ALL SEQUENCES IN SCHEMA addr_nsp; RESET client_min_messages; CREATE SUBSCRIPTION regress_addr_sub CONNECTION '' PUBLICATION bar WITH (connect = false, slot_name = NONE); WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables @@ -428,7 +429,8 @@ WITH objects (type, name, args) AS (VALUES ('transform', '{int}', '{sql}'), ('access method', '{btree}', '{}'), ('publication', '{addr_pub}', '{}'), - ('publication namespace', '{addr_nsp}', '{addr_pub_schema}'), + ('publication namespace', '{addr_nsp}', '{addr_pub_schema,t}'), + ('publication namespace', '{addr_nsp}', '{addr_pub_schema2,s}'), ('publication relation', '{addr_nsp, gentable}', '{addr_pub}'), ('subscription', '{regress_addr_sub}', '{}'), ('statistics object', '{addr_nsp, gentable_stat}', '{}') @@ -492,8 +494,9 @@ SELECT (pg_identify_object(addr1.classid, addr1.objid, addr1.objsubid)).*, subscription | | regress_addr_sub | regress_addr_sub | t publication | | addr_pub | addr_pub | t publication relation | | | addr_nsp.gentable in publication addr_pub | t - publication namespace | | | addr_nsp in publication addr_pub_schema | t -(50 rows) + publication namespace | | | addr_nsp in publication addr_pub_schema type t | t + publication namespace | | | addr_nsp in publication addr_pub_schema2 type s | t +(51 rows) --- --- Cleanup resources @@ -506,6 +509,7 @@ drop cascades to server integer drop cascades to user mapping for regress_addr_user on server integer DROP PUBLICATION addr_pub; DROP PUBLICATION addr_pub_schema; +DROP PUBLICATION addr_pub_schema2; DROP SUBSCRIPTION regress_addr_sub; DROP SCHEMA addr_nsp CASCADE; NOTICE: drop cascades to 14 other objects diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index 4e191c120a..92f6122d40 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -30,20 +30,20 @@ ERROR: conflicting or redundant options LINE 1: ...ub_xxx WITH (publish_via_partition_root = 'true', publish_vi... ^ \dRp - List of publications - Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------+--------------------------+------------+---------+---------+---------+-----------+---------- - testpib_ins_trunct | regress_publication_user | f | t | f | f | f | f - testpub_default | regress_publication_user | f | f | t | f | f | f + List of publications + Name | Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------+--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + testpib_ins_trunct | regress_publication_user | f | f | t | f | f | f | f | f + testpub_default | regress_publication_user | f | f | f | t | f | f | f | f (2 rows) -ALTER PUBLICATION testpub_default SET (publish = 'insert, update, delete'); +ALTER PUBLICATION testpub_default SET (publish = 'insert, update, delete, sequence'); \dRp - List of publications - Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------+--------------------------+------------+---------+---------+---------+-----------+---------- - testpib_ins_trunct | regress_publication_user | f | t | f | f | f | f - testpub_default | regress_publication_user | f | t | t | t | f | f + List of publications + Name | Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------+--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + testpib_ins_trunct | regress_publication_user | f | f | t | f | f | f | f | f + testpub_default | regress_publication_user | f | f | t | t | t | f | t | f (2 rows) --- adding tables @@ -61,6 +61,9 @@ CREATE TABLE testpub_tbl2 (id serial primary key, data text); ALTER PUBLICATION testpub_foralltables ADD TABLE testpub_tbl2; ERROR: publication "testpub_foralltables" is defined as FOR ALL TABLES DETAIL: Tables cannot be added to or dropped from FOR ALL TABLES publications. +-- fail - can't add a table using ADD SEQUENCE command +ALTER PUBLICATION testpub_foralltables ADD SEQUENCE testpub_tbl2; +ERROR: object type does not match type expected by command -- fail - can't drop from all tables publication ALTER PUBLICATION testpub_foralltables DROP TABLE testpub_tbl2; ERROR: publication "testpub_foralltables" is defined as FOR ALL TABLES @@ -87,10 +90,10 @@ RESET client_min_messages; -- should be able to add schema to 'FOR TABLE' publication ALTER PUBLICATION testpub_fortable ADD ALL TABLES IN SCHEMA pub_test; \dRp+ testpub_fortable - Publication testpub_fortable - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub_fortable + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables: "public.testpub_tbl1" Tables from schemas: @@ -99,20 +102,20 @@ Tables from schemas: -- should be able to drop schema from 'FOR TABLE' publication ALTER PUBLICATION testpub_fortable DROP ALL TABLES IN SCHEMA pub_test; \dRp+ testpub_fortable - Publication testpub_fortable - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub_fortable + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables: "public.testpub_tbl1" -- should be able to set schema to 'FOR TABLE' publication ALTER PUBLICATION testpub_fortable SET ALL TABLES IN SCHEMA pub_test; \dRp+ testpub_fortable - Publication testpub_fortable - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub_fortable + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test" @@ -134,10 +137,10 @@ ERROR: relation "testpub_nopk" is not part of the publication -- should be able to set table to schema publication ALTER PUBLICATION testpub_forschema SET TABLE pub_test.testpub_nopk; \dRp+ testpub_forschema - Publication testpub_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables: "pub_test.testpub_nopk" @@ -159,10 +162,10 @@ Publications: "testpub_foralltables" \dRp+ testpub_foralltables - Publication testpub_foralltables - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | t | t | t | f | f | f + Publication testpub_foralltables + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | t | f | t | t | f | f | f | f (1 row) DROP TABLE testpub_tbl2; @@ -174,24 +177,527 @@ CREATE PUBLICATION testpub3 FOR TABLE testpub_tbl3; CREATE PUBLICATION testpub4 FOR TABLE ONLY testpub_tbl3; RESET client_min_messages; \dRp+ testpub3 - Publication testpub3 - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub3 + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables: "public.testpub_tbl3" "public.testpub_tbl3a" \dRp+ testpub4 - Publication testpub4 - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub4 + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables: "public.testpub_tbl3" DROP TABLE testpub_tbl3, testpub_tbl3a; DROP PUBLICATION testpub3, testpub4; +--- adding sequences +CREATE SEQUENCE testpub_seq0; +CREATE SEQUENCE pub_test.testpub_seq1; +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_forallsequences FOR ALL SEQUENCES WITH (publish = 'sequence'); +RESET client_min_messages; +ALTER PUBLICATION testpub_forallsequences SET (publish = 'insert, sequence'); +CREATE SEQUENCE testpub_seq2; +-- fail - can't add to for all sequences publication +ALTER PUBLICATION testpub_forallsequences ADD SEQUENCE testpub_seq2; +ERROR: publication "testpub_forallsequences" is defined as FOR ALL SEQUENCES +DETAIL: Sequences cannot be added to or dropped from FOR ALL SEQUENCES publications. +-- fail - can't drop from all sequences publication +ALTER PUBLICATION testpub_forallsequences DROP SEQUENCE testpub_seq2; +ERROR: publication "testpub_forallsequences" is defined as FOR ALL SEQUENCES +DETAIL: Sequences cannot be added to or dropped from FOR ALL SEQUENCES publications. +-- fail - can't add to for all sequences publication +ALTER PUBLICATION testpub_forallsequences SET SEQUENCE pub_test.testpub_seq1; +ERROR: publication "testpub_forallsequences" is defined as FOR ALL SEQUENCES +DETAIL: Sequences cannot be added to or dropped from FOR ALL SEQUENCES publications. +-- fail - can't add schema to 'FOR ALL SEQUENCES' publication +ALTER PUBLICATION testpub_forallsequences ADD ALL SEQUENCES IN SCHEMA pub_test; +ERROR: publication "testpub_forallsequences" is defined as FOR ALL SEQUENCES +DETAIL: Sequences from schema cannot be added to, dropped from, or set on FOR ALL SEQUENCES publications. +-- fail - can't drop schema from 'FOR ALL SEQUENCES' publication +ALTER PUBLICATION testpub_forallsequences DROP ALL SEQUENCES IN SCHEMA pub_test; +ERROR: publication "testpub_forallsequences" is defined as FOR ALL SEQUENCES +DETAIL: Sequences from schema cannot be added to, dropped from, or set on FOR ALL SEQUENCES publications. +-- fail - can't set schema to 'FOR ALL SEQUENCES' publication +ALTER PUBLICATION testpub_forallsequences SET ALL SEQUENCES IN SCHEMA pub_test; +ERROR: publication "testpub_forallsequences" is defined as FOR ALL SEQUENCES +DETAIL: Sequences from schema cannot be added to, dropped from, or set on FOR ALL SEQUENCES publications. +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_forsequence FOR SEQUENCE testpub_seq0; +RESET client_min_messages; +-- should be able to add schema to 'FOR SEQUENCE' publication +ALTER PUBLICATION testpub_forsequence ADD ALL SEQUENCES IN SCHEMA pub_test; +\dRp+ testpub_forsequence + Publication testpub_forsequence + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Sequences: + "public.testpub_seq0" +Sequences from schemas: + "pub_test" + +-- fail - can't add sequence from the schema we already added +ALTER PUBLICATION testpub_forsequence ADD SEQUENCE pub_test.testpub_seq1; +ERROR: cannot add relation "pub_test.testpub_seq1" to publication +DETAIL: Sequence's schema "pub_test" is already part of the publication or part of the specified schema list. +-- fail - can't add sequence using ADD TABLE command +ALTER PUBLICATION testpub_forsequence ADD TABLE pub_test.testpub_seq1; +ERROR: object type does not match type expected by command +-- should be able to drop schema from 'FOR SEQUENCE' publication +ALTER PUBLICATION testpub_forsequence DROP ALL SEQUENCES IN SCHEMA pub_test; +\dRp+ testpub_forsequence + Publication testpub_forsequence + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Sequences: + "public.testpub_seq0" + +-- should be able to set schema to 'FOR SEQUENCE' publication +ALTER PUBLICATION testpub_forsequence SET ALL SEQUENCES IN SCHEMA pub_test; +\dRp+ testpub_forsequence + Publication testpub_forsequence + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Sequences from schemas: + "pub_test" + +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_forschema FOR ALL SEQUENCES IN SCHEMA pub_test; +RESET client_min_messages; +-- fail - can't create publication with schema and sequence of the same schema +CREATE PUBLICATION testpub_for_seq_schema FOR ALL SEQUENCES IN SCHEMA pub_test, SEQUENCE pub_test.testpub_seq1; +ERROR: cannot add relation "pub_test.testpub_seq1" to publication +DETAIL: Sequence's schema "pub_test" is already part of the publication or part of the specified schema list. +-- fail - can't add a sequence of the same schema to the schema publication +ALTER PUBLICATION testpub_forschema ADD SEQUENCE pub_test.testpub_seq1; +ERROR: cannot add relation "pub_test.testpub_seq1" to publication +DETAIL: Sequence's schema "pub_test" is already part of the publication or part of the specified schema list. +-- fail - can't drop a sequence from the schema publication which isn't in the +-- publication +ALTER PUBLICATION testpub_forschema DROP SEQUENCE pub_test.testpub_seq1; +ERROR: relation "testpub_seq1" is not part of the publication +-- should be able to set sequence to schema publication +ALTER PUBLICATION testpub_forschema SET SEQUENCE pub_test.testpub_seq1; +\dRp+ testpub_forschema + Publication testpub_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Sequences: + "pub_test.testpub_seq1" + +SELECT pubname, puballtables, puballsequences FROM pg_publication WHERE pubname = 'testpub_forallsequences'; + pubname | puballtables | puballsequences +-------------------------+--------------+----------------- + testpub_forallsequences | f | t +(1 row) + +\d+ pub_test.testpub_seq1 + Sequence "pub_test.testpub_seq1" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+---------+---------------------+-----------+---------+------- + bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 +Publications: + "testpub_forallsequences" + "testpub_forschema" + "testpub_forsequence" + +\dRp+ testpub_forallsequences + Publication testpub_forallsequences + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | t | t | f | f | f | t | f +(1 row) + +DROP SEQUENCE testpub_seq0, pub_test.testpub_seq1, testpub_seq2; +DROP PUBLICATION testpub_forallsequences, testpub_forsequence, testpub_forschema; +-- Publication mixing tables and sequences +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_mix; +RESET client_min_messages; +CREATE SEQUENCE testpub_seq1; +CREATE SEQUENCE pub_test.testpub_seq2; +ALTER PUBLICATION testpub_mix ADD SEQUENCE testpub_seq1, TABLE testpub_tbl1; +\dRp+ testpub_mix + Publication testpub_mix + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Tables: + "public.testpub_tbl1" +Sequences: + "public.testpub_seq1" + +ALTER PUBLICATION testpub_mix ADD ALL SEQUENCES IN SCHEMA pub_test, ALL TABLES IN SCHEMA pub_test; +\dRp+ testpub_mix + Publication testpub_mix + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Tables: + "public.testpub_tbl1" +Tables from schemas: + "pub_test" +Sequences: + "public.testpub_seq1" +Sequences from schemas: + "pub_test" + +ALTER PUBLICATION testpub_mix DROP ALL SEQUENCES IN SCHEMA pub_test; +\dRp+ testpub_mix + Publication testpub_mix + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Tables: + "public.testpub_tbl1" +Tables from schemas: + "pub_test" +Sequences: + "public.testpub_seq1" + +ALTER PUBLICATION testpub_mix DROP ALL TABLES IN SCHEMA pub_test; +\dRp+ testpub_mix + Publication testpub_mix + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Tables: + "public.testpub_tbl1" +Sequences: + "public.testpub_seq1" + +DROP PUBLICATION testpub_mix; +DROP SEQUENCE testpub_seq1; +DROP SEQUENCE pub_test.testpub_seq2; +-- make sure we replicate only the correct relation type +CREATE SCHEMA pub_test1; +CREATE SEQUENCE pub_test1.test_seq1; +CREATE TABLE pub_test1.test_tbl1 (a int primary key, b int); +CREATE SCHEMA pub_test2; +CREATE SEQUENCE pub_test2.test_seq2; +CREATE TABLE pub_test2.test_tbl2 (a int primary key, b int); +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_schemas; +RESET client_min_messages; +-- add tables from one schema, sequences from the other +ALTER PUBLICATION testpub_schemas ADD ALL TABLES IN SCHEMA pub_test2; +ALTER PUBLICATION testpub_schemas ADD ALL SEQUENCES IN SCHEMA pub_test1; +\dRp+ testpub_schemas + Publication testpub_schemas + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Tables from schemas: + "pub_test2" +Sequences from schemas: + "pub_test1" + +\dn+ pub_test1 + List of schemas + Name | Owner | Access privileges | Description +-----------+--------------------------+-------------------+------------- + pub_test1 | regress_publication_user | | +Publications: + "testpub_schemas" (sequences) + +\dn+ pub_test2 + List of schemas + Name | Owner | Access privileges | Description +-----------+--------------------------+-------------------+------------- + pub_test2 | regress_publication_user | | +Publications: + "testpub_schemas" (tables) + +\d+ pub_test1.test_seq1; + Sequence "pub_test1.test_seq1" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+---------+---------------------+-----------+---------+------- + bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 +Publications: + "testpub_schemas" + +\d+ pub_test1.test_tbl1; + Table "pub_test1.test_tbl1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | not null | | plain | | + b | integer | | | | plain | | +Indexes: + "test_tbl1_pkey" PRIMARY KEY, btree (a) + +\d+ pub_test2.test_seq2; + Sequence "pub_test2.test_seq2" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+---------+---------------------+-----------+---------+------- + bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 + +\d+ pub_test2.test_tbl2; + Table "pub_test2.test_tbl2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | not null | | plain | | + b | integer | | | | plain | | +Indexes: + "test_tbl2_pkey" PRIMARY KEY, btree (a) +Publications: + "testpub_schemas" + +-- add the other object type from each schema +ALTER PUBLICATION testpub_schemas ADD ALL TABLES IN SCHEMA pub_test1; +ALTER PUBLICATION testpub_schemas ADD ALL SEQUENCES IN SCHEMA pub_test2; +\dRp+ testpub_schemas + Publication testpub_schemas + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Tables from schemas: + "pub_test1" + "pub_test2" +Sequences from schemas: + "pub_test1" + "pub_test2" + +\dn+ pub_test1 + List of schemas + Name | Owner | Access privileges | Description +-----------+--------------------------+-------------------+------------- + pub_test1 | regress_publication_user | | +Publications: + "testpub_schemas" (sequences) + "testpub_schemas" (tables) + +\dn+ pub_test2 + List of schemas + Name | Owner | Access privileges | Description +-----------+--------------------------+-------------------+------------- + pub_test2 | regress_publication_user | | +Publications: + "testpub_schemas" (tables) + "testpub_schemas" (sequences) + +\d+ pub_test1.test_seq1; + Sequence "pub_test1.test_seq1" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+---------+---------------------+-----------+---------+------- + bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 +Publications: + "testpub_schemas" + +\d+ pub_test1.test_tbl1; + Table "pub_test1.test_tbl1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | not null | | plain | | + b | integer | | | | plain | | +Indexes: + "test_tbl1_pkey" PRIMARY KEY, btree (a) +Publications: + "testpub_schemas" + +\d+ pub_test2.test_seq2; + Sequence "pub_test2.test_seq2" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+---------+---------------------+-----------+---------+------- + bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 +Publications: + "testpub_schemas" + +\d+ pub_test2.test_tbl2; + Table "pub_test2.test_tbl2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | not null | | plain | | + b | integer | | | | plain | | +Indexes: + "test_tbl2_pkey" PRIMARY KEY, btree (a) +Publications: + "testpub_schemas" + +-- now drop the object type added first +ALTER PUBLICATION testpub_schemas DROP ALL TABLES IN SCHEMA pub_test2; +ALTER PUBLICATION testpub_schemas DROP ALL SEQUENCES IN SCHEMA pub_test1; +\dRp+ testpub_schemas + Publication testpub_schemas + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Tables from schemas: + "pub_test1" +Sequences from schemas: + "pub_test2" + +\dn+ pub_test1 + List of schemas + Name | Owner | Access privileges | Description +-----------+--------------------------+-------------------+------------- + pub_test1 | regress_publication_user | | +Publications: + "testpub_schemas" (tables) + +\dn+ pub_test2 + List of schemas + Name | Owner | Access privileges | Description +-----------+--------------------------+-------------------+------------- + pub_test2 | regress_publication_user | | +Publications: + "testpub_schemas" (sequences) + +\d+ pub_test1.test_seq1; + Sequence "pub_test1.test_seq1" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+---------+---------------------+-----------+---------+------- + bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 + +\d+ pub_test1.test_tbl1; + Table "pub_test1.test_tbl1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | not null | | plain | | + b | integer | | | | plain | | +Indexes: + "test_tbl1_pkey" PRIMARY KEY, btree (a) +Publications: + "testpub_schemas" + +\d+ pub_test2.test_seq2; + Sequence "pub_test2.test_seq2" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+---------+---------------------+-----------+---------+------- + bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 +Publications: + "testpub_schemas" + +\d+ pub_test2.test_tbl2; + Table "pub_test2.test_tbl2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | not null | | plain | | + b | integer | | | | plain | | +Indexes: + "test_tbl2_pkey" PRIMARY KEY, btree (a) + +-- should fail (publication contains the whole schema) +ALTER PUBLICATION testpub_schemas ADD TABLE pub_test1.test_tbl1; +ERROR: cannot add relation "pub_test1.test_tbl1" to publication +DETAIL: Table's schema "pub_test1" is already part of the publication or part of the specified schema list. +ALTER PUBLICATION testpub_schemas ADD SEQUENCE pub_test2.test_seq2; +ERROR: cannot add relation "pub_test2.test_seq2" to publication +DETAIL: Sequence's schema "pub_test2" is already part of the publication or part of the specified schema list. +-- should work (different schema) +ALTER PUBLICATION testpub_schemas ADD TABLE pub_test2.test_tbl2; +ALTER PUBLICATION testpub_schemas ADD SEQUENCE pub_test1.test_seq1; +\dRp+ testpub_schemas + Publication testpub_schemas + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Tables: + "pub_test2.test_tbl2" +Tables from schemas: + "pub_test1" +Sequences: + "pub_test1.test_seq1" +Sequences from schemas: + "pub_test2" + +\d+ pub_test1.test_seq1; + Sequence "pub_test1.test_seq1" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+---------+---------------------+-----------+---------+------- + bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 +Publications: + "testpub_schemas" + +\d+ pub_test1.test_tbl1; + Table "pub_test1.test_tbl1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | not null | | plain | | + b | integer | | | | plain | | +Indexes: + "test_tbl1_pkey" PRIMARY KEY, btree (a) +Publications: + "testpub_schemas" + +\d+ pub_test2.test_seq2; + Sequence "pub_test2.test_seq2" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+---------+---------------------+-----------+---------+------- + bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 +Publications: + "testpub_schemas" + +\d+ pub_test2.test_tbl2; + Table "pub_test2.test_tbl2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | not null | | plain | | + b | integer | | | | plain | | +Indexes: + "test_tbl2_pkey" PRIMARY KEY, btree (a) +Publications: + "testpub_schemas" + +-- now drop the explicitly added objects again +ALTER PUBLICATION testpub_schemas DROP TABLE pub_test2.test_tbl2; +ALTER PUBLICATION testpub_schemas DROP SEQUENCE pub_test1.test_seq1; +\dRp+ testpub_schemas + Publication testpub_schemas + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Tables from schemas: + "pub_test1" +Sequences from schemas: + "pub_test2" + +\d+ pub_test1.test_seq1; + Sequence "pub_test1.test_seq1" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+---------+---------------------+-----------+---------+------- + bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 + +\d+ pub_test1.test_tbl1; + Table "pub_test1.test_tbl1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | not null | | plain | | + b | integer | | | | plain | | +Indexes: + "test_tbl1_pkey" PRIMARY KEY, btree (a) +Publications: + "testpub_schemas" + +\d+ pub_test2.test_seq2; + Sequence "pub_test2.test_seq2" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+---------+---------------------+-----------+---------+------- + bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 +Publications: + "testpub_schemas" + +\d+ pub_test2.test_tbl2; + Table "pub_test2.test_tbl2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | not null | | plain | | + b | integer | | | | plain | | +Indexes: + "test_tbl2_pkey" PRIMARY KEY, btree (a) + +DROP PUBLICATION testpub_schemas; +DROP TABLE pub_test1.test_tbl1, pub_test2.test_tbl2; +DROP SEQUENCE pub_test1.test_seq1, pub_test2.test_seq2; +DROP SCHEMA pub_test1, pub_test2; -- Tests for partitioned tables SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_forparted; @@ -207,10 +713,10 @@ UPDATE testpub_parted1 SET a = 1; -- only parent is listed as being in publication, not the partition ALTER PUBLICATION testpub_forparted ADD TABLE testpub_parted; \dRp+ testpub_forparted - Publication testpub_forparted - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub_forparted + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables: "public.testpub_parted" @@ -223,10 +729,10 @@ ALTER TABLE testpub_parted DETACH PARTITION testpub_parted1; UPDATE testpub_parted1 SET a = 1; ALTER PUBLICATION testpub_forparted SET (publish_via_partition_root = true); \dRp+ testpub_forparted - Publication testpub_forparted - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | t + Publication testpub_forparted + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | t Tables: "public.testpub_parted" @@ -255,10 +761,10 @@ SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub5 FOR TABLE testpub_rf_tbl1, testpub_rf_tbl2 WHERE (c <> 'test' AND d < 5) WITH (publish = 'insert'); RESET client_min_messages; \dRp+ testpub5 - Publication testpub5 - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | f | f | f | f + Publication testpub5 + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | f | f | f | f | f Tables: "public.testpub_rf_tbl1" "public.testpub_rf_tbl2" WHERE ((c <> 'test'::text) AND (d < 5)) @@ -271,10 +777,10 @@ Tables: ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl3 WHERE (e > 1000 AND e < 2000); \dRp+ testpub5 - Publication testpub5 - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | f | f | f | f + Publication testpub5 + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | f | f | f | f | f Tables: "public.testpub_rf_tbl1" "public.testpub_rf_tbl2" WHERE ((c <> 'test'::text) AND (d < 5)) @@ -290,10 +796,10 @@ Publications: ALTER PUBLICATION testpub5 DROP TABLE testpub_rf_tbl2; \dRp+ testpub5 - Publication testpub5 - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | f | f | f | f + Publication testpub5 + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | f | f | f | f | f Tables: "public.testpub_rf_tbl1" "public.testpub_rf_tbl3" WHERE ((e > 1000) AND (e < 2000)) @@ -301,10 +807,10 @@ Tables: -- remove testpub_rf_tbl1 and add testpub_rf_tbl3 again (another WHERE expression) ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl3 WHERE (e > 300 AND e < 500); \dRp+ testpub5 - Publication testpub5 - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | f | f | f | f + Publication testpub5 + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | f | f | f | f | f Tables: "public.testpub_rf_tbl3" WHERE ((e > 300) AND (e < 500)) @@ -337,10 +843,10 @@ SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_syntax1 FOR TABLE testpub_rf_tbl1, ONLY testpub_rf_tbl3 WHERE (e < 999) WITH (publish = 'insert'); RESET client_min_messages; \dRp+ testpub_syntax1 - Publication testpub_syntax1 - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | f | f | f | f + Publication testpub_syntax1 + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | f | f | f | f | f Tables: "public.testpub_rf_tbl1" "public.testpub_rf_tbl3" WHERE (e < 999) @@ -350,10 +856,10 @@ SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_syntax2 FOR TABLE testpub_rf_tbl1, testpub_rf_schema1.testpub_rf_tbl5 WHERE (h < 999) WITH (publish = 'insert'); RESET client_min_messages; \dRp+ testpub_syntax2 - Publication testpub_syntax2 - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | f | f | f | f + Publication testpub_syntax2 + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | f | f | f | f | f Tables: "public.testpub_rf_tbl1" "testpub_rf_schema1.testpub_rf_tbl5" WHERE (h < 999) @@ -658,10 +1164,10 @@ ERROR: relation "testpub_tbl1" is already member of publication "testpub_fortbl CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_tbl1; ERROR: publication "testpub_fortbl" already exists \dRp+ testpub_fortbl - Publication testpub_fortbl - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub_fortbl + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables: "pub_test.testpub_nopk" "public.testpub_tbl1" @@ -699,10 +1205,10 @@ Publications: "testpub_fortbl" \dRp+ testpub_default - Publication testpub_default - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | f | f + Publication testpub_default + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | f | t | f Tables: "pub_test.testpub_nopk" "public.testpub_tbl1" @@ -780,10 +1286,10 @@ REVOKE CREATE ON DATABASE regression FROM regress_publication_user2; DROP TABLE testpub_parted; DROP TABLE testpub_tbl1; \dRp+ testpub_default - Publication testpub_default - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | f | f + Publication testpub_default + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | f | t | f (1 row) -- fail - must be owner of publication @@ -793,20 +1299,20 @@ ERROR: must be owner of publication testpub_default RESET ROLE; ALTER PUBLICATION testpub_default RENAME TO testpub_foo; \dRp testpub_foo - List of publications - Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root --------------+--------------------------+------------+---------+---------+---------+-----------+---------- - testpub_foo | regress_publication_user | f | t | t | t | f | f + List of publications + Name | Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +-------------+--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + testpub_foo | regress_publication_user | f | f | t | t | t | f | t | f (1 row) -- rename back to keep the rest simple ALTER PUBLICATION testpub_foo RENAME TO testpub_default; ALTER PUBLICATION testpub_default OWNER TO regress_publication_user2; \dRp testpub_default - List of publications - Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ------------------+---------------------------+------------+---------+---------+---------+-----------+---------- - testpub_default | regress_publication_user2 | f | t | t | t | f | f + List of publications + Name | Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +-----------------+---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + testpub_default | regress_publication_user2 | f | f | t | t | t | f | t | f (1 row) -- adding schemas and tables @@ -822,19 +1328,19 @@ CREATE TABLE "CURRENT_SCHEMA"."CURRENT_SCHEMA"(id int); SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub1_forschema FOR ALL TABLES IN SCHEMA pub_test1; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1" CREATE PUBLICATION testpub2_forschema FOR ALL TABLES IN SCHEMA pub_test1, pub_test2, pub_test3; \dRp+ testpub2_forschema - Publication testpub2_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub2_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -848,44 +1354,44 @@ CREATE PUBLICATION testpub6_forschema FOR ALL TABLES IN SCHEMA "CURRENT_SCHEMA", CREATE PUBLICATION testpub_fortable FOR TABLE "CURRENT_SCHEMA"."CURRENT_SCHEMA"; RESET client_min_messages; \dRp+ testpub3_forschema - Publication testpub3_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub3_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "public" \dRp+ testpub4_forschema - Publication testpub4_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub4_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "CURRENT_SCHEMA" \dRp+ testpub5_forschema - Publication testpub5_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub5_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "CURRENT_SCHEMA" "public" \dRp+ testpub6_forschema - Publication testpub6_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub6_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "CURRENT_SCHEMA" "public" \dRp+ testpub_fortable - Publication testpub_fortable - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub_fortable + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables: "CURRENT_SCHEMA.CURRENT_SCHEMA" @@ -919,10 +1425,10 @@ ERROR: schema "testpub_view" does not exist -- dropping the schema should reflect the change in publication DROP SCHEMA pub_test3; \dRp+ testpub2_forschema - Publication testpub2_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub2_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -930,20 +1436,20 @@ Tables from schemas: -- renaming the schema should reflect the change in publication ALTER SCHEMA pub_test1 RENAME to pub_test1_renamed; \dRp+ testpub2_forschema - Publication testpub2_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub2_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1_renamed" "pub_test2" ALTER SCHEMA pub_test1_renamed RENAME to pub_test1; \dRp+ testpub2_forschema - Publication testpub2_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub2_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -951,10 +1457,10 @@ Tables from schemas: -- alter publication add schema ALTER PUBLICATION testpub1_forschema ADD ALL TABLES IN SCHEMA pub_test2; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -963,10 +1469,10 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema ADD ALL TABLES IN SCHEMA non_existent_schema; ERROR: schema "non_existent_schema" does not exist \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -975,10 +1481,10 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema ADD ALL TABLES IN SCHEMA pub_test1; ERROR: schema "pub_test1" is already member of publication "testpub1_forschema" \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -986,10 +1492,10 @@ Tables from schemas: -- alter publication drop schema ALTER PUBLICATION testpub1_forschema DROP ALL TABLES IN SCHEMA pub_test2; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1" @@ -997,10 +1503,10 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema DROP ALL TABLES IN SCHEMA pub_test2; ERROR: tables from schema "pub_test2" are not part of the publication \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1" @@ -1008,29 +1514,29 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema DROP ALL TABLES IN SCHEMA non_existent_schema; ERROR: schema "non_existent_schema" does not exist \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1" -- drop all schemas ALTER PUBLICATION testpub1_forschema DROP ALL TABLES IN SCHEMA pub_test1; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f (1 row) -- alter publication set multiple schema ALTER PUBLICATION testpub1_forschema SET ALL TABLES IN SCHEMA pub_test1, pub_test2; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1039,10 +1545,10 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema SET ALL TABLES IN SCHEMA non_existent_schema; ERROR: schema "non_existent_schema" does not exist \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1051,10 +1557,10 @@ Tables from schemas: -- removing the duplicate schemas ALTER PUBLICATION testpub1_forschema SET ALL TABLES IN SCHEMA pub_test1, pub_test1; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1" @@ -1124,18 +1630,18 @@ SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub3_forschema; RESET client_min_messages; \dRp+ testpub3_forschema - Publication testpub3_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub3_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f (1 row) ALTER PUBLICATION testpub3_forschema SET ALL TABLES IN SCHEMA pub_test1; \dRp+ testpub3_forschema - Publication testpub3_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub3_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables from schemas: "pub_test1" @@ -1145,20 +1651,20 @@ CREATE PUBLICATION testpub_forschema_fortable FOR ALL TABLES IN SCHEMA pub_test1 CREATE PUBLICATION testpub_fortable_forschema FOR TABLE pub_test2.tbl1, ALL TABLES IN SCHEMA pub_test1; RESET client_min_messages; \dRp+ testpub_forschema_fortable - Publication testpub_forschema_fortable - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub_forschema_fortable + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables: "pub_test2.tbl1" Tables from schemas: "pub_test1" \dRp+ testpub_fortable_forschema - Publication testpub_fortable_forschema - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | t | t | t | t | f + Publication testpub_fortable_forschema + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f Tables: "pub_test2.tbl1" Tables from schemas: @@ -1202,40 +1708,85 @@ CREATE SCHEMA sch1; CREATE SCHEMA sch2; CREATE TABLE sch1.tbl1 (a int) PARTITION BY RANGE(a); CREATE TABLE sch2.tbl1_part1 PARTITION OF sch1.tbl1 FOR VALUES FROM (1) to (10); +CREATE SEQUENCE sch1.seq1; +CREATE SEQUENCE sch2.seq2; -- Schema publication that does not include the schema that has the parent table CREATE PUBLICATION pub FOR ALL TABLES IN SCHEMA sch2 WITH (PUBLISH_VIA_PARTITION_ROOT=1); +ALTER PUBLICATION pub ADD ALL SEQUENCES IN SCHEMA sch2; SELECT * FROM pg_publication_tables; pubname | schemaname | tablename ---------+------------+------------ pub | sch2 | tbl1_part1 (1 row) +SELECT * FROM pg_publication_sequences; + pubname | schemaname | sequencename +---------+------------+-------------- + pub | sch2 | seq2 +(1 row) + DROP PUBLICATION pub; -- Table publication that does not include the parent table CREATE PUBLICATION pub FOR TABLE sch2.tbl1_part1 WITH (PUBLISH_VIA_PARTITION_ROOT=1); +ALTER PUBLICATION pub ADD SEQUENCE sch2.seq2; SELECT * FROM pg_publication_tables; pubname | schemaname | tablename ---------+------------+------------ pub | sch2 | tbl1_part1 (1 row) +SELECT * FROM pg_publication_sequences; + pubname | schemaname | sequencename +---------+------------+-------------- + pub | sch2 | seq2 +(1 row) + -- Table publication that includes both the parent table and the child table ALTER PUBLICATION pub ADD TABLE sch1.tbl1; +ALTER PUBLICATION pub ADD SEQUENCE sch1.seq1; SELECT * FROM pg_publication_tables; pubname | schemaname | tablename ---------+------------+----------- pub | sch1 | tbl1 (1 row) +SELECT * FROM pg_publication_sequences; + pubname | schemaname | sequencename +---------+------------+-------------- + pub | sch1 | seq1 + pub | sch2 | seq2 +(2 rows) + DROP PUBLICATION pub; -- Schema publication that does not include the schema that has the parent table CREATE PUBLICATION pub FOR ALL TABLES IN SCHEMA sch2 WITH (PUBLISH_VIA_PARTITION_ROOT=0); +ALTER PUBLICATION pub ADD SEQUENCE sch1.seq1; SELECT * FROM pg_publication_tables; pubname | schemaname | tablename ---------+------------+------------ pub | sch2 | tbl1_part1 (1 row) +SELECT * FROM pg_publication_sequences; + pubname | schemaname | sequencename +---------+------------+-------------- + pub | sch1 | seq1 +(1 row) + +DROP PUBLICATION pub; +-- Sequence publication +CREATE PUBLICATION pub FOR SEQUENCE sch2.seq2; +SELECT * FROM pg_publication_tables; + pubname | schemaname | tablename +---------+------------+----------- +(0 rows) + +SELECT * FROM pg_publication_sequences; + pubname | schemaname | sequencename +---------+------------+-------------- + pub | sch2 | seq2 +(1 row) + DROP PUBLICATION pub; -- Table publication that does not include the parent table CREATE PUBLICATION pub FOR TABLE sch2.tbl1_part1 WITH (PUBLISH_VIA_PARTITION_ROOT=0); @@ -1245,14 +1796,26 @@ SELECT * FROM pg_publication_tables; pub | sch2 | tbl1_part1 (1 row) +SELECT * FROM pg_publication_sequences; + pubname | schemaname | sequencename +---------+------------+-------------- +(0 rows) + -- Table publication that includes both the parent table and the child table ALTER PUBLICATION pub ADD TABLE sch1.tbl1; +ALTER PUBLICATION pub ADD ALL SEQUENCES IN SCHEMA sch2; SELECT * FROM pg_publication_tables; pubname | schemaname | tablename ---------+------------+------------ pub | sch2 | tbl1_part1 (1 row) +SELECT * FROM pg_publication_sequences; + pubname | schemaname | sequencename +---------+------------+-------------- + pub | sch2 | seq2 +(1 row) + DROP PUBLICATION pub; DROP TABLE sch2.tbl1_part1; DROP TABLE sch1.tbl1; @@ -1268,9 +1831,81 @@ SELECT * FROM pg_publication_tables; pub | sch1 | tbl1 (1 row) +SELECT * FROM pg_publication_sequences; + pubname | schemaname | sequencename +---------+------------+-------------- +(0 rows) + +DROP PUBLICATION pub; +-- Schema publication +CREATE PUBLICATION pub FOR SEQUENCE sch2.seq2; +SELECT * FROM pg_publication_tables; + pubname | schemaname | tablename +---------+------------+----------- +(0 rows) + +SELECT * FROM pg_publication_sequences; + pubname | schemaname | sequencename +---------+------------+-------------- + pub | sch2 | seq2 +(1 row) + +DROP PUBLICATION pub; +-- Sequence publication +CREATE PUBLICATION pub FOR ALL SEQUENCES IN SCHEMA sch2; +SELECT * FROM pg_publication_tables; + pubname | schemaname | tablename +---------+------------+----------- +(0 rows) + +SELECT * FROM pg_publication_sequences; + pubname | schemaname | sequencename +---------+------------+-------------- + pub | sch2 | seq2 +(1 row) + +ALTER PUBLICATION pub ADD SEQUENCE sch1.seq1; +SELECT * FROM pg_publication_tables; + pubname | schemaname | tablename +---------+------------+----------- +(0 rows) + +SELECT * FROM pg_publication_sequences; + pubname | schemaname | sequencename +---------+------------+-------------- + pub | sch1 | seq1 + pub | sch2 | seq2 +(2 rows) + +ALTER PUBLICATION pub DROP SEQUENCE sch1.seq1; +SELECT * FROM pg_publication_tables; + pubname | schemaname | tablename +---------+------------+----------- +(0 rows) + +SELECT * FROM pg_publication_sequences; + pubname | schemaname | sequencename +---------+------------+-------------- + pub | sch2 | seq2 +(1 row) + +ALTER PUBLICATION pub ADD ALL SEQUENCES IN SCHEMA sch1; +SELECT * FROM pg_publication_tables; + pubname | schemaname | tablename +---------+------------+----------- +(0 rows) + +SELECT * FROM pg_publication_sequences; + pubname | schemaname | sequencename +---------+------------+-------------- + pub | sch1 | seq1 + pub | sch2 | seq2 +(2 rows) + RESET client_min_messages; DROP PUBLICATION pub; DROP TABLE sch1.tbl1; +DROP SEQUENCE sch1.seq1, sch2.seq2; DROP SCHEMA sch1 cascade; DROP SCHEMA sch2 cascade; RESET SESSION AUTHORIZATION; diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 6cb6388880..8a5b20e62c 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -1429,6 +1429,14 @@ pg_prepared_xacts| SELECT p.transaction, FROM ((pg_prepared_xact() p(transaction, gid, prepared, ownerid, dbid) LEFT JOIN pg_authid u ON ((p.ownerid = u.oid))) LEFT JOIN pg_database d ON ((p.dbid = d.oid))); +pg_publication_sequences| SELECT p.pubname, + n.nspname AS schemaname, + c.relname AS sequencename + FROM pg_publication p, + LATERAL pg_get_publication_sequences((p.pubname)::text) gps(relid), + (pg_class c + JOIN pg_namespace n ON ((n.oid = c.relnamespace))) + WHERE (c.oid = gps.relid); pg_publication_tables| SELECT p.pubname, n.nspname AS schemaname, c.relname AS tablename diff --git a/src/test/regress/sql/object_address.sql b/src/test/regress/sql/object_address.sql index acd0468a9d..9d8323468d 100644 --- a/src/test/regress/sql/object_address.sql +++ b/src/test/regress/sql/object_address.sql @@ -49,6 +49,7 @@ CREATE TRANSFORM FOR int LANGUAGE SQL ( SET client_min_messages = 'ERROR'; CREATE PUBLICATION addr_pub FOR TABLE addr_nsp.gentable; CREATE PUBLICATION addr_pub_schema FOR ALL TABLES IN SCHEMA addr_nsp; +CREATE PUBLICATION addr_pub_schema2 FOR ALL SEQUENCES IN SCHEMA addr_nsp; RESET client_min_messages; CREATE SUBSCRIPTION regress_addr_sub CONNECTION '' PUBLICATION bar WITH (connect = false, slot_name = NONE); CREATE STATISTICS addr_nsp.gentable_stat ON a, b FROM addr_nsp.gentable; @@ -198,7 +199,8 @@ WITH objects (type, name, args) AS (VALUES ('transform', '{int}', '{sql}'), ('access method', '{btree}', '{}'), ('publication', '{addr_pub}', '{}'), - ('publication namespace', '{addr_nsp}', '{addr_pub_schema}'), + ('publication namespace', '{addr_nsp}', '{addr_pub_schema,t}'), + ('publication namespace', '{addr_nsp}', '{addr_pub_schema2,s}'), ('publication relation', '{addr_nsp, gentable}', '{addr_pub}'), ('subscription', '{regress_addr_sub}', '{}'), ('statistics object', '{addr_nsp, gentable_stat}', '{}') @@ -218,6 +220,7 @@ SELECT (pg_identify_object(addr1.classid, addr1.objid, addr1.objsubid)).*, DROP FOREIGN DATA WRAPPER addr_fdw CASCADE; DROP PUBLICATION addr_pub; DROP PUBLICATION addr_pub_schema; +DROP PUBLICATION addr_pub_schema2; DROP SUBSCRIPTION regress_addr_sub; DROP SCHEMA addr_nsp CASCADE; diff --git a/src/test/regress/sql/publication.sql b/src/test/regress/sql/publication.sql index 5457c56b33..c195e75c6f 100644 --- a/src/test/regress/sql/publication.sql +++ b/src/test/regress/sql/publication.sql @@ -27,7 +27,7 @@ CREATE PUBLICATION testpub_xxx WITH (publish_via_partition_root = 'true', publis \dRp -ALTER PUBLICATION testpub_default SET (publish = 'insert, update, delete'); +ALTER PUBLICATION testpub_default SET (publish = 'insert, update, delete, sequence'); \dRp @@ -46,6 +46,8 @@ ALTER PUBLICATION testpub_foralltables SET (publish = 'insert, update'); CREATE TABLE testpub_tbl2 (id serial primary key, data text); -- fail - can't add to for all tables publication ALTER PUBLICATION testpub_foralltables ADD TABLE testpub_tbl2; +-- fail - can't add a table using ADD SEQUENCE command +ALTER PUBLICATION testpub_foralltables ADD SEQUENCE testpub_tbl2; -- fail - can't drop from all tables publication ALTER PUBLICATION testpub_foralltables DROP TABLE testpub_tbl2; -- fail - can't add to for all tables publication @@ -104,6 +106,183 @@ RESET client_min_messages; DROP TABLE testpub_tbl3, testpub_tbl3a; DROP PUBLICATION testpub3, testpub4; +--- adding sequences +CREATE SEQUENCE testpub_seq0; +CREATE SEQUENCE pub_test.testpub_seq1; + +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_forallsequences FOR ALL SEQUENCES WITH (publish = 'sequence'); +RESET client_min_messages; +ALTER PUBLICATION testpub_forallsequences SET (publish = 'insert, sequence'); + +CREATE SEQUENCE testpub_seq2; +-- fail - can't add to for all sequences publication +ALTER PUBLICATION testpub_forallsequences ADD SEQUENCE testpub_seq2; +-- fail - can't drop from all sequences publication +ALTER PUBLICATION testpub_forallsequences DROP SEQUENCE testpub_seq2; +-- fail - can't add to for all sequences publication +ALTER PUBLICATION testpub_forallsequences SET SEQUENCE pub_test.testpub_seq1; + +-- fail - can't add schema to 'FOR ALL SEQUENCES' publication +ALTER PUBLICATION testpub_forallsequences ADD ALL SEQUENCES IN SCHEMA pub_test; +-- fail - can't drop schema from 'FOR ALL SEQUENCES' publication +ALTER PUBLICATION testpub_forallsequences DROP ALL SEQUENCES IN SCHEMA pub_test; +-- fail - can't set schema to 'FOR ALL SEQUENCES' publication +ALTER PUBLICATION testpub_forallsequences SET ALL SEQUENCES IN SCHEMA pub_test; + +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_forsequence FOR SEQUENCE testpub_seq0; +RESET client_min_messages; +-- should be able to add schema to 'FOR SEQUENCE' publication +ALTER PUBLICATION testpub_forsequence ADD ALL SEQUENCES IN SCHEMA pub_test; +\dRp+ testpub_forsequence +-- fail - can't add sequence from the schema we already added +ALTER PUBLICATION testpub_forsequence ADD SEQUENCE pub_test.testpub_seq1; +-- fail - can't add sequence using ADD TABLE command +ALTER PUBLICATION testpub_forsequence ADD TABLE pub_test.testpub_seq1; +-- should be able to drop schema from 'FOR SEQUENCE' publication +ALTER PUBLICATION testpub_forsequence DROP ALL SEQUENCES IN SCHEMA pub_test; +\dRp+ testpub_forsequence +-- should be able to set schema to 'FOR SEQUENCE' publication +ALTER PUBLICATION testpub_forsequence SET ALL SEQUENCES IN SCHEMA pub_test; +\dRp+ testpub_forsequence + +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_forschema FOR ALL SEQUENCES IN SCHEMA pub_test; +RESET client_min_messages; +-- fail - can't create publication with schema and sequence of the same schema +CREATE PUBLICATION testpub_for_seq_schema FOR ALL SEQUENCES IN SCHEMA pub_test, SEQUENCE pub_test.testpub_seq1; +-- fail - can't add a sequence of the same schema to the schema publication +ALTER PUBLICATION testpub_forschema ADD SEQUENCE pub_test.testpub_seq1; +-- fail - can't drop a sequence from the schema publication which isn't in the +-- publication +ALTER PUBLICATION testpub_forschema DROP SEQUENCE pub_test.testpub_seq1; +-- should be able to set sequence to schema publication +ALTER PUBLICATION testpub_forschema SET SEQUENCE pub_test.testpub_seq1; +\dRp+ testpub_forschema + +SELECT pubname, puballtables, puballsequences FROM pg_publication WHERE pubname = 'testpub_forallsequences'; +\d+ pub_test.testpub_seq1 +\dRp+ testpub_forallsequences +DROP SEQUENCE testpub_seq0, pub_test.testpub_seq1, testpub_seq2; +DROP PUBLICATION testpub_forallsequences, testpub_forsequence, testpub_forschema; + +-- Publication mixing tables and sequences +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_mix; +RESET client_min_messages; + +CREATE SEQUENCE testpub_seq1; +CREATE SEQUENCE pub_test.testpub_seq2; + +ALTER PUBLICATION testpub_mix ADD SEQUENCE testpub_seq1, TABLE testpub_tbl1; +\dRp+ testpub_mix + +ALTER PUBLICATION testpub_mix ADD ALL SEQUENCES IN SCHEMA pub_test, ALL TABLES IN SCHEMA pub_test; +\dRp+ testpub_mix + +ALTER PUBLICATION testpub_mix DROP ALL SEQUENCES IN SCHEMA pub_test; +\dRp+ testpub_mix + +ALTER PUBLICATION testpub_mix DROP ALL TABLES IN SCHEMA pub_test; +\dRp+ testpub_mix + +DROP PUBLICATION testpub_mix; +DROP SEQUENCE testpub_seq1; +DROP SEQUENCE pub_test.testpub_seq2; + + +-- make sure we replicate only the correct relation type +CREATE SCHEMA pub_test1; +CREATE SEQUENCE pub_test1.test_seq1; +CREATE TABLE pub_test1.test_tbl1 (a int primary key, b int); + +CREATE SCHEMA pub_test2; +CREATE SEQUENCE pub_test2.test_seq2; +CREATE TABLE pub_test2.test_tbl2 (a int primary key, b int); + +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_schemas; +RESET client_min_messages; + +-- add tables from one schema, sequences from the other +ALTER PUBLICATION testpub_schemas ADD ALL TABLES IN SCHEMA pub_test2; +ALTER PUBLICATION testpub_schemas ADD ALL SEQUENCES IN SCHEMA pub_test1; + +\dRp+ testpub_schemas + +\dn+ pub_test1 +\dn+ pub_test2 + +\d+ pub_test1.test_seq1; +\d+ pub_test1.test_tbl1; + +\d+ pub_test2.test_seq2; +\d+ pub_test2.test_tbl2; + +-- add the other object type from each schema +ALTER PUBLICATION testpub_schemas ADD ALL TABLES IN SCHEMA pub_test1; +ALTER PUBLICATION testpub_schemas ADD ALL SEQUENCES IN SCHEMA pub_test2; + +\dRp+ testpub_schemas + +\dn+ pub_test1 +\dn+ pub_test2 + +\d+ pub_test1.test_seq1; +\d+ pub_test1.test_tbl1; + +\d+ pub_test2.test_seq2; +\d+ pub_test2.test_tbl2; + +-- now drop the object type added first +ALTER PUBLICATION testpub_schemas DROP ALL TABLES IN SCHEMA pub_test2; +ALTER PUBLICATION testpub_schemas DROP ALL SEQUENCES IN SCHEMA pub_test1; + +\dRp+ testpub_schemas + +\dn+ pub_test1 +\dn+ pub_test2 + +\d+ pub_test1.test_seq1; +\d+ pub_test1.test_tbl1; + +\d+ pub_test2.test_seq2; +\d+ pub_test2.test_tbl2; + +-- should fail (publication contains the whole schema) +ALTER PUBLICATION testpub_schemas ADD TABLE pub_test1.test_tbl1; +ALTER PUBLICATION testpub_schemas ADD SEQUENCE pub_test2.test_seq2; + +-- should work (different schema) +ALTER PUBLICATION testpub_schemas ADD TABLE pub_test2.test_tbl2; +ALTER PUBLICATION testpub_schemas ADD SEQUENCE pub_test1.test_seq1; + +\dRp+ testpub_schemas + +\d+ pub_test1.test_seq1; +\d+ pub_test1.test_tbl1; + +\d+ pub_test2.test_seq2; +\d+ pub_test2.test_tbl2; + +-- now drop the explicitly added objects again +ALTER PUBLICATION testpub_schemas DROP TABLE pub_test2.test_tbl2; +ALTER PUBLICATION testpub_schemas DROP SEQUENCE pub_test1.test_seq1; + +\dRp+ testpub_schemas + +\d+ pub_test1.test_seq1; +\d+ pub_test1.test_tbl1; + +\d+ pub_test2.test_seq2; +\d+ pub_test2.test_tbl2; + +DROP PUBLICATION testpub_schemas; +DROP TABLE pub_test1.test_tbl1, pub_test2.test_tbl2; +DROP SEQUENCE pub_test1.test_seq1, pub_test2.test_seq2; +DROP SCHEMA pub_test1, pub_test2; + -- Tests for partitioned tables SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_forparted; @@ -717,32 +896,51 @@ CREATE SCHEMA sch1; CREATE SCHEMA sch2; CREATE TABLE sch1.tbl1 (a int) PARTITION BY RANGE(a); CREATE TABLE sch2.tbl1_part1 PARTITION OF sch1.tbl1 FOR VALUES FROM (1) to (10); +CREATE SEQUENCE sch1.seq1; +CREATE SEQUENCE sch2.seq2; -- Schema publication that does not include the schema that has the parent table CREATE PUBLICATION pub FOR ALL TABLES IN SCHEMA sch2 WITH (PUBLISH_VIA_PARTITION_ROOT=1); +ALTER PUBLICATION pub ADD ALL SEQUENCES IN SCHEMA sch2; SELECT * FROM pg_publication_tables; +SELECT * FROM pg_publication_sequences; DROP PUBLICATION pub; -- Table publication that does not include the parent table CREATE PUBLICATION pub FOR TABLE sch2.tbl1_part1 WITH (PUBLISH_VIA_PARTITION_ROOT=1); +ALTER PUBLICATION pub ADD SEQUENCE sch2.seq2; SELECT * FROM pg_publication_tables; +SELECT * FROM pg_publication_sequences; -- Table publication that includes both the parent table and the child table ALTER PUBLICATION pub ADD TABLE sch1.tbl1; +ALTER PUBLICATION pub ADD SEQUENCE sch1.seq1; SELECT * FROM pg_publication_tables; +SELECT * FROM pg_publication_sequences; DROP PUBLICATION pub; -- Schema publication that does not include the schema that has the parent table CREATE PUBLICATION pub FOR ALL TABLES IN SCHEMA sch2 WITH (PUBLISH_VIA_PARTITION_ROOT=0); +ALTER PUBLICATION pub ADD SEQUENCE sch1.seq1; +SELECT * FROM pg_publication_tables; +SELECT * FROM pg_publication_sequences; + +DROP PUBLICATION pub; +-- Sequence publication +CREATE PUBLICATION pub FOR SEQUENCE sch2.seq2; SELECT * FROM pg_publication_tables; +SELECT * FROM pg_publication_sequences; DROP PUBLICATION pub; -- Table publication that does not include the parent table CREATE PUBLICATION pub FOR TABLE sch2.tbl1_part1 WITH (PUBLISH_VIA_PARTITION_ROOT=0); SELECT * FROM pg_publication_tables; +SELECT * FROM pg_publication_sequences; -- Table publication that includes both the parent table and the child table ALTER PUBLICATION pub ADD TABLE sch1.tbl1; +ALTER PUBLICATION pub ADD ALL SEQUENCES IN SCHEMA sch2; SELECT * FROM pg_publication_tables; +SELECT * FROM pg_publication_sequences; DROP PUBLICATION pub; DROP TABLE sch2.tbl1_part1; @@ -755,10 +953,36 @@ CREATE TABLE sch1.tbl1_part3 (a int) PARTITION BY RANGE(a); ALTER TABLE sch1.tbl1 ATTACH PARTITION sch1.tbl1_part3 FOR VALUES FROM (20) to (30); CREATE PUBLICATION pub FOR ALL TABLES IN SCHEMA sch1 WITH (PUBLISH_VIA_PARTITION_ROOT=1); SELECT * FROM pg_publication_tables; +SELECT * FROM pg_publication_sequences; + +DROP PUBLICATION pub; +-- Schema publication +CREATE PUBLICATION pub FOR SEQUENCE sch2.seq2; +SELECT * FROM pg_publication_tables; +SELECT * FROM pg_publication_sequences; + +DROP PUBLICATION pub; +-- Sequence publication +CREATE PUBLICATION pub FOR ALL SEQUENCES IN SCHEMA sch2; +SELECT * FROM pg_publication_tables; +SELECT * FROM pg_publication_sequences; + +ALTER PUBLICATION pub ADD SEQUENCE sch1.seq1; +SELECT * FROM pg_publication_tables; +SELECT * FROM pg_publication_sequences; + +ALTER PUBLICATION pub DROP SEQUENCE sch1.seq1; +SELECT * FROM pg_publication_tables; +SELECT * FROM pg_publication_sequences; + +ALTER PUBLICATION pub ADD ALL SEQUENCES IN SCHEMA sch1; +SELECT * FROM pg_publication_tables; +SELECT * FROM pg_publication_sequences; RESET client_min_messages; DROP PUBLICATION pub; DROP TABLE sch1.tbl1; +DROP SEQUENCE sch1.seq1, sch2.seq2; DROP SCHEMA sch1 cascade; DROP SCHEMA sch2 cascade; diff --git a/src/test/subscription/t/030_sequences.pl b/src/test/subscription/t/030_sequences.pl new file mode 100644 index 0000000000..9ae3c03d7d --- /dev/null +++ b/src/test/subscription/t/030_sequences.pl @@ -0,0 +1,202 @@ + +# Copyright (c) 2021, PostgreSQL Global Development Group + +# This tests that sequences are replicated correctly by logical replication +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Initialize publisher node +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); +$node_publisher->init(allows_streaming => 'logical'); +$node_publisher->start; + +# Create subscriber node +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); +$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->start; + +# Create some preexisting content on publisher +my $ddl = qq( + CREATE TABLE seq_test (v BIGINT); + CREATE SEQUENCE s; +); + +# Setup structure on the publisher +$node_publisher->safe_psql('postgres', $ddl); + +# Create some the same structure on subscriber, and an extra sequence that +# we'll create on the publisher later +$ddl = qq( + CREATE TABLE seq_test (v BIGINT); + CREATE SEQUENCE s; + CREATE SEQUENCE s2; +); + +$node_subscriber->safe_psql('postgres', $ddl); + +# Setup logical replication +my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION seq_pub"); + +$node_publisher->safe_psql('postgres', + "ALTER PUBLICATION seq_pub ADD SEQUENCE s"); + +$node_subscriber->safe_psql('postgres', + "CREATE SUBSCRIPTION seq_sub CONNECTION '$publisher_connstr' PUBLICATION seq_pub" +); + +$node_publisher->wait_for_catchup('seq_sub'); + +# Wait for initial sync to finish as well +my $synced_query = + "SELECT count(1) = 0 FROM pg_subscription_rel WHERE srsubstate NOT IN ('s', 'r');"; +$node_subscriber->poll_query_until('postgres', $synced_query) + or die "Timed out while waiting for subscriber to synchronize data"; + +# Insert initial test data +$node_publisher->safe_psql( + 'postgres', qq( + -- generate a number of values using the sequence + INSERT INTO seq_test SELECT nextval('s') FROM generate_series(1,100); +)); + +$node_publisher->wait_for_catchup('seq_sub'); + +# Check the data on subscriber +my $result = $node_subscriber->safe_psql( + 'postgres', qq( + SELECT * FROM s; +)); + +is( $result, '132|0|t', + 'initial test data replicated'); + + +# advance the sequence in a rolled-back transaction - the rollback +# does not wait for the replication, so we could see any intermediate state +# so do something else after the test, to ensure we wait for everything +$node_publisher->safe_psql( + 'postgres', qq( + BEGIN; + INSERT INTO seq_test SELECT nextval('s') FROM generate_series(1,100); + ROLLBACK; + INSERT INTO seq_test VALUES (-1); +)); + +$node_publisher->wait_for_catchup('seq_sub'); + +# Check the data on subscriber +$result = $node_subscriber->safe_psql( + 'postgres', qq( + SELECT * FROM s; +)); + +is( $result, '231|0|t', + 'advance sequence in rolled-back transaction'); + + +# create a new sequence and roll it back - should not be replicated, due to +# the transactional behavior +$node_publisher->safe_psql( + 'postgres', qq( + BEGIN; + CREATE SEQUENCE s2; + ALTER PUBLICATION seq_pub ADD SEQUENCE s2; + INSERT INTO seq_test SELECT nextval('s2') FROM generate_series(1,100); + ROLLBACK; +)); + +$node_publisher->wait_for_catchup('seq_sub'); + +# Check the data on subscriber +$result = $node_subscriber->safe_psql( + 'postgres', qq( + SELECT * FROM s2; +)); + +is( $result, '1|0|f', + 'create new sequence and roll it back'); + + +# create a new sequence, advance it in a rolled-back transaction, but commit +# the create - the advance should be replicated nevertheless +$node_publisher->safe_psql( + 'postgres', qq( + BEGIN; + CREATE SEQUENCE s2; + ALTER PUBLICATION seq_pub ADD SEQUENCE s2; + SAVEPOINT sp1; + INSERT INTO seq_test SELECT nextval('s2') FROM generate_series(1,100); + ROLLBACK TO sp1; + COMMIT; +)); + +$node_publisher->wait_for_catchup('seq_sub'); + +# Wait for sync of the second sequence we just added to finish +$synced_query = + "SELECT count(1) = 0 FROM pg_subscription_rel WHERE srsubstate NOT IN ('s', 'r');"; +$node_subscriber->poll_query_until('postgres', $synced_query) + or die "Timed out while waiting for subscriber to synchronize data"; + +# Check the data on subscriber +$result = $node_subscriber->safe_psql( + 'postgres', qq( + SELECT * FROM s2; +)); + +is( $result, '132|0|t', + 'create sequence, advance it in rolled-back transaction, but commit the create'); + + +# advance the new sequence in a transaction, and roll it back - the rollback +# does not wait for the replication, so we could see any intermediate state +# so do something else after the test, to ensure we wait for everything +$node_publisher->safe_psql( + 'postgres', qq( + BEGIN; + INSERT INTO seq_test SELECT nextval('s2') FROM generate_series(1,100); + ROLLBACK; + INSERT INTO seq_test VALUES (-1); +)); + +$node_publisher->wait_for_catchup('seq_sub'); + +# Check the data on subscriber +$result = $node_subscriber->safe_psql( + 'postgres', qq( + SELECT * FROM s2; +)); + +is( $result, '231|0|t', + 'advance the new sequence in a transaction and roll it back'); + + +# advance the sequence in a subtransaction - the subtransaction gets rolled +# back, but commit the main one - the changes should still be replicated +$node_publisher->safe_psql( + 'postgres', qq( + BEGIN; + SAVEPOINT s1; + INSERT INTO seq_test SELECT nextval('s2') FROM generate_series(1,100); + ROLLBACK TO s1; + COMMIT; +)); + +$node_publisher->wait_for_catchup('seq_sub'); + +# Check the data on subscriber +$result = $node_subscriber->safe_psql( + 'postgres', qq( + SELECT * FROM s2; +)); + +is( $result, '330|0|t', + 'advance sequence in a subtransaction'); + + +done_testing(); From 86459b3296803cfa4d3e53c0fc8763412c71b6d0 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 24 Mar 2022 19:30:06 +0100 Subject: [PATCH 241/772] Wrap inline function definitions in #ifndef FRONTEND This should fix failures under certain compilers (a well known limitation). My oversight in e27f4ee0a701. Discussion: https://postgr.es/m/3029088.1648145389@sss.pgh.pa.us --- src/include/access/htup_details.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h index de0b91e1fa..3d452d50a1 100644 --- a/src/include/access/htup_details.h +++ b/src/include/access/htup_details.h @@ -733,6 +733,7 @@ extern size_t varsize_any(void *p); extern HeapTuple heap_expand_tuple(HeapTuple sourceTuple, TupleDesc tupleDesc); extern MinimalTuple minimal_expand_tuple(HeapTuple sourceTuple, TupleDesc tupleDesc); +#ifndef FRONTEND /* * fastgetattr * Fetch a user attribute's value as a Datum (might be either a @@ -801,5 +802,6 @@ heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull) else return heap_getsysattr(tup, attnum, tupleDesc, isnull); } +#endif /* FRONTEND */ #endif /* HTUP_DETAILS_H */ From 412ad7a55639516f284cd0ef9757d6ae5c7abd43 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Thu, 24 Mar 2022 14:32:06 -0400 Subject: [PATCH 242/772] Fix possible recovery trouble if TRUNCATE overlaps a checkpoint. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If TRUNCATE causes some buffers to be invalidated and thus the checkpoint does not flush them, TRUNCATE must also ensure that the corresponding files are truncated on disk. Otherwise, a replay from the checkpoint might find that the buffers exist but have the wrong contents, which may cause replay to fail. Report by Teja Mupparti. Patch by Kyotaro Horiguchi, per a design suggestion from Heikki Linnakangas, with some changes to the comments by me. Review of this and a prior patch that approached the issue differently by Heikki Linnakangas, Andres Freund, Álvaro Herrera, Masahiko Sawada, and Tom Lane. Discussion: http://postgr.es/m/BYAPR06MB6373BF50B469CA393C614257ABF00@BYAPR06MB6373.namprd06.prod.outlook.com --- src/backend/access/transam/multixact.c | 6 ++-- src/backend/access/transam/twophase.c | 12 ++++---- src/backend/access/transam/xact.c | 5 ++-- src/backend/access/transam/xlog.c | 16 +++++++++-- src/backend/access/transam/xloginsert.c | 2 +- src/backend/catalog/storage.c | 29 ++++++++++++++++++- src/backend/storage/buffer/bufmgr.c | 6 ++-- src/backend/storage/ipc/procarray.c | 26 ++++++++++++----- src/backend/storage/lmgr/proc.c | 4 +-- src/include/storage/proc.h | 37 ++++++++++++++++++++++++- src/include/storage/procarray.h | 5 ++-- 11 files changed, 120 insertions(+), 28 deletions(-) diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index 6a70d49738..9f65c600d0 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -3088,8 +3088,8 @@ TruncateMultiXact(MultiXactId newOldestMulti, Oid newOldestMultiDB) * crash/basebackup, even though the state of the data directory would * require it. */ - Assert(!MyProc->delayChkpt); - MyProc->delayChkpt = true; + Assert((MyProc->delayChkpt & DELAY_CHKPT_START) == 0); + MyProc->delayChkpt |= DELAY_CHKPT_START; /* WAL log truncation */ WriteMTruncateXlogRec(newOldestMultiDB, @@ -3115,7 +3115,7 @@ TruncateMultiXact(MultiXactId newOldestMulti, Oid newOldestMultiDB) /* Then offsets */ PerformOffsetsTruncation(oldestMulti, newOldestMulti); - MyProc->delayChkpt = false; + MyProc->delayChkpt &= ~DELAY_CHKPT_START; END_CRIT_SECTION(); LWLockRelease(MultiXactTruncationLock); diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 874c8ed125..4dc8ccc12b 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -475,7 +475,7 @@ MarkAsPreparingGuts(GlobalTransaction gxact, TransactionId xid, const char *gid, } proc->xid = xid; Assert(proc->xmin == InvalidTransactionId); - proc->delayChkpt = false; + proc->delayChkpt = 0; proc->statusFlags = 0; proc->pid = 0; proc->databaseId = databaseid; @@ -1164,7 +1164,8 @@ EndPrepare(GlobalTransaction gxact) START_CRIT_SECTION(); - MyProc->delayChkpt = true; + Assert((MyProc->delayChkpt & DELAY_CHKPT_START) == 0); + MyProc->delayChkpt |= DELAY_CHKPT_START; XLogBeginInsert(); for (record = records.head; record != NULL; record = record->next) @@ -1207,7 +1208,7 @@ EndPrepare(GlobalTransaction gxact) * checkpoint starting after this will certainly see the gxact as a * candidate for fsyncing. */ - MyProc->delayChkpt = false; + MyProc->delayChkpt &= ~DELAY_CHKPT_START; /* * Remember that we have this GlobalTransaction entry locked for us. If @@ -2266,7 +2267,8 @@ RecordTransactionCommitPrepared(TransactionId xid, START_CRIT_SECTION(); /* See notes in RecordTransactionCommit */ - MyProc->delayChkpt = true; + Assert((MyProc->delayChkpt & DELAY_CHKPT_START) == 0); + MyProc->delayChkpt |= DELAY_CHKPT_START; /* * Emit the XLOG commit record. Note that we mark 2PC commits as @@ -2314,7 +2316,7 @@ RecordTransactionCommitPrepared(TransactionId xid, TransactionIdCommitTree(xid, nchildren, children); /* Checkpoint can proceed now */ - MyProc->delayChkpt = false; + MyProc->delayChkpt &= ~DELAY_CHKPT_START; END_CRIT_SECTION(); diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 8964ddf3eb..3596a7d734 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -1387,8 +1387,9 @@ RecordTransactionCommit(void) * This makes checkpoint's determination of which xacts are delayChkpt * a bit fuzzy, but it doesn't matter. */ + Assert((MyProc->delayChkpt & DELAY_CHKPT_START) == 0); START_CRIT_SECTION(); - MyProc->delayChkpt = true; + MyProc->delayChkpt |= DELAY_CHKPT_START; SetCurrentTransactionStopTimestamp(); @@ -1489,7 +1490,7 @@ RecordTransactionCommit(void) */ if (markXidCommitted) { - MyProc->delayChkpt = false; + MyProc->delayChkpt &= ~DELAY_CHKPT_START; END_CRIT_SECTION(); } diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 4ac3871c74..17a56152f1 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -6517,18 +6517,30 @@ CreateCheckPoint(int flags) * and we will correctly flush the update below. So we cannot miss any * xacts we need to wait for. */ - vxids = GetVirtualXIDsDelayingChkpt(&nvxids); + vxids = GetVirtualXIDsDelayingChkpt(&nvxids, DELAY_CHKPT_START); if (nvxids > 0) { do { pg_usleep(10000L); /* wait for 10 msec */ - } while (HaveVirtualXIDsDelayingChkpt(vxids, nvxids)); + } while (HaveVirtualXIDsDelayingChkpt(vxids, nvxids, + DELAY_CHKPT_START)); } pfree(vxids); CheckPointGuts(checkPoint.redo, flags); + vxids = GetVirtualXIDsDelayingChkpt(&nvxids, DELAY_CHKPT_COMPLETE); + if (nvxids > 0) + { + do + { + pg_usleep(10000L); /* wait for 10 msec */ + } while (HaveVirtualXIDsDelayingChkpt(vxids, nvxids, + DELAY_CHKPT_COMPLETE)); + } + pfree(vxids); + /* * Take a snapshot of running transactions and write this to WAL. This * allows us to reconstruct the state of running transactions during diff --git a/src/backend/access/transam/xloginsert.c b/src/backend/access/transam/xloginsert.c index f4eb54b63c..462e23503e 100644 --- a/src/backend/access/transam/xloginsert.c +++ b/src/backend/access/transam/xloginsert.c @@ -1011,7 +1011,7 @@ XLogSaveBufferForHint(Buffer buffer, bool buffer_std) /* * Ensure no checkpoint can change our view of RedoRecPtr. */ - Assert(MyProc->delayChkpt); + Assert((MyProc->delayChkpt & DELAY_CHKPT_START) != 0); /* * Update RedoRecPtr so that we can make the right decision diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index 9b8075536a..ce5568ff08 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -325,6 +325,22 @@ RelationTruncate(Relation rel, BlockNumber nblocks) RelationPreTruncate(rel); + /* + * Make sure that a concurrent checkpoint can't complete while truncation + * is in progress. + * + * The truncation operation might drop buffers that the checkpoint + * otherwise would have flushed. If it does, then it's essential that + * the files actually get truncated on disk before the checkpoint record + * is written. Otherwise, if reply begins from that checkpoint, the + * to-be-truncated blocks might still exist on disk but have older + * contents than expected, which can cause replay to fail. It's OK for + * the blocks to not exist on disk at all, but not for them to have the + * wrong contents. + */ + Assert((MyProc->delayChkpt & DELAY_CHKPT_COMPLETE) == 0); + MyProc->delayChkpt |= DELAY_CHKPT_COMPLETE; + /* * We WAL-log the truncation before actually truncating, which means * trouble if the truncation fails. If we then crash, the WAL replay @@ -363,13 +379,24 @@ RelationTruncate(Relation rel, BlockNumber nblocks) XLogFlush(lsn); } - /* Do the real work to truncate relation forks */ + /* + * This will first remove any buffers from the buffer pool that should no + * longer exist after truncation is complete, and then truncate the + * corresponding files on disk. + */ smgrtruncate(RelationGetSmgr(rel), forks, nforks, blocks); + /* We've done all the critical work, so checkpoints are OK now. */ + MyProc->delayChkpt &= ~DELAY_CHKPT_COMPLETE; + /* * Update upper-level FSM pages to account for the truncation. This is * important because the just-truncated pages were likely marked as * all-free, and would be preferentially selected. + * + * NB: There's no point in delaying checkpoints until this is done. + * Because the FSM is not WAL-logged, we have to be prepared for the + * possibility of corruption after a crash anyway. */ if (need_fsm_vacuum) FreeSpaceMapVacuumRange(rel, nblocks, InvalidBlockNumber); diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index f5459c68f8..11005edc73 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -3911,7 +3911,9 @@ MarkBufferDirtyHint(Buffer buffer, bool buffer_std) * essential that CreateCheckPoint waits for virtual transactions * rather than full transactionids. */ - MyProc->delayChkpt = delayChkpt = true; + Assert((MyProc->delayChkpt & DELAY_CHKPT_START) == 0); + MyProc->delayChkpt |= DELAY_CHKPT_START; + delayChkpt = true; lsn = XLogSaveBufferForHint(buffer, buffer_std); } @@ -3944,7 +3946,7 @@ MarkBufferDirtyHint(Buffer buffer, bool buffer_std) UnlockBufHdr(bufHdr, buf_state); if (delayChkpt) - MyProc->delayChkpt = false; + MyProc->delayChkpt &= ~DELAY_CHKPT_START; if (dirtied) { diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index 13d192ec2b..735763cc24 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -698,7 +698,10 @@ ProcArrayEndTransaction(PGPROC *proc, TransactionId latestXid) proc->lxid = InvalidLocalTransactionId; proc->xmin = InvalidTransactionId; - proc->delayChkpt = false; /* be sure this is cleared in abort */ + + /* be sure this is cleared in abort */ + proc->delayChkpt = 0; + proc->recoveryConflictPending = false; /* must be cleared with xid/xmin: */ @@ -737,7 +740,10 @@ ProcArrayEndTransactionInternal(PGPROC *proc, TransactionId latestXid) proc->xid = InvalidTransactionId; proc->lxid = InvalidLocalTransactionId; proc->xmin = InvalidTransactionId; - proc->delayChkpt = false; /* be sure this is cleared in abort */ + + /* be sure this is cleared in abort */ + proc->delayChkpt = 0; + proc->recoveryConflictPending = false; /* must be cleared with xid/xmin: */ @@ -3053,7 +3059,8 @@ GetOldestSafeDecodingTransactionId(bool catalogOnly) * delaying checkpoint because they have critical actions in progress. * * Constructs an array of VXIDs of transactions that are currently in commit - * critical sections, as shown by having delayChkpt set in their PGPROC. + * critical sections, as shown by having specified delayChkpt bits set in their + * PGPROC. * * Returns a palloc'd array that should be freed by the caller. * *nvxids is the number of valid entries. @@ -3067,13 +3074,15 @@ GetOldestSafeDecodingTransactionId(bool catalogOnly) * for clearing of delayChkpt to propagate is unimportant for correctness. */ VirtualTransactionId * -GetVirtualXIDsDelayingChkpt(int *nvxids) +GetVirtualXIDsDelayingChkpt(int *nvxids, int type) { VirtualTransactionId *vxids; ProcArrayStruct *arrayP = procArray; int count = 0; int index; + Assert(type != 0); + /* allocate what's certainly enough result space */ vxids = (VirtualTransactionId *) palloc(sizeof(VirtualTransactionId) * arrayP->maxProcs); @@ -3085,7 +3094,7 @@ GetVirtualXIDsDelayingChkpt(int *nvxids) int pgprocno = arrayP->pgprocnos[index]; PGPROC *proc = &allProcs[pgprocno]; - if (proc->delayChkpt) + if ((proc->delayChkpt & type) != 0) { VirtualTransactionId vxid; @@ -3111,12 +3120,14 @@ GetVirtualXIDsDelayingChkpt(int *nvxids) * those numbers should be small enough for it not to be a problem. */ bool -HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids, int nvxids) +HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids, int nvxids, int type) { bool result = false; ProcArrayStruct *arrayP = procArray; int index; + Assert(type != 0); + LWLockAcquire(ProcArrayLock, LW_SHARED); for (index = 0; index < arrayP->numProcs; index++) @@ -3127,7 +3138,8 @@ HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids, int nvxids) GET_VXID_FROM_PGPROC(vxid, *proc); - if (proc->delayChkpt && VirtualTransactionIdIsValid(vxid)) + if ((proc->delayChkpt & type) != 0 && + VirtualTransactionIdIsValid(vxid)) { int i; diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index 90283f8a9f..df080cd332 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -393,7 +393,7 @@ InitProcess(void) MyProc->roleId = InvalidOid; MyProc->tempNamespaceId = InvalidOid; MyProc->isBackgroundWorker = IsBackgroundWorker; - MyProc->delayChkpt = false; + MyProc->delayChkpt = 0; MyProc->statusFlags = 0; /* NB -- autovac launcher intentionally does not set IS_AUTOVACUUM */ if (IsAutoVacuumWorkerProcess()) @@ -578,7 +578,7 @@ InitAuxiliaryProcess(void) MyProc->roleId = InvalidOid; MyProc->tempNamespaceId = InvalidOid; MyProc->isBackgroundWorker = IsBackgroundWorker; - MyProc->delayChkpt = false; + MyProc->delayChkpt = 0; MyProc->statusFlags = 0; MyProc->lwWaiting = false; MyProc->lwWaitMode = 0; diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h index a58888f9e9..36ecf7d005 100644 --- a/src/include/storage/proc.h +++ b/src/include/storage/proc.h @@ -86,6 +86,41 @@ struct XidCache */ #define INVALID_PGPROCNO PG_INT32_MAX +/* + * Flags for PGPROC.delayChkpt + * + * These flags can be used to delay the start or completion of a checkpoint + * for short periods. A flag is in effect if the corresponding bit is set in + * the PGPROC of any backend. + * + * For our purposes here, a checkpoint has three phases: (1) determine the + * location to which the redo pointer will be moved, (2) write all the + * data durably to disk, and (3) WAL-log the checkpoint. + * + * Setting DELAY_CHKPT_START prevents the system from moving from phase 1 + * to phase 2. This is useful when we are performing a WAL-logged modification + * of data that will be flushed to disk in phase 2. By setting this flag + * before writing WAL and clearing it after we've both written WAL and + * performed the corresponding modification, we ensure that if the WAL record + * is inserted prior to the new redo point, the corresponding data changes will + * also be flushed to disk before the checkpoint can complete. (In the + * extremely common case where the data being modified is in shared buffers + * and we acquire an exclusive content lock on the relevant buffers before + * writing WAL, this mechanism is not needed, because phase 2 will block + * until we release the content lock and then flush the modified data to + * disk.) + * + * Setting DELAY_CHKPT_COMPLETE prevents the system from moving from phase 2 + * to phase 3. This is useful if we are performing a WAL-logged operation that + * might invalidate buffers, such as relation truncation. In this case, we need + * to ensure that any buffers which were invalidated and thus not flushed by + * the checkpoint are actaully destroyed on disk. Replay can cope with a file + * or block that doesn't exist, but not with a block that has the wrong + * contents. + */ +#define DELAY_CHKPT_START (1<<0) +#define DELAY_CHKPT_COMPLETE (1<<1) + typedef enum { PROC_WAIT_STATUS_OK, @@ -191,7 +226,7 @@ struct PGPROC pg_atomic_uint64 waitStart; /* time at which wait for lock acquisition * started */ - bool delayChkpt; /* true if this proc delays checkpoint start */ + int delayChkpt; /* for DELAY_CHKPT_* flags */ uint8 statusFlags; /* this backend's status flags, see PROC_* * above. mirrored in diff --git a/src/include/storage/procarray.h b/src/include/storage/procarray.h index e03692053e..1b2cfac5ad 100644 --- a/src/include/storage/procarray.h +++ b/src/include/storage/procarray.h @@ -59,8 +59,9 @@ extern TransactionId GetOldestActiveTransactionId(void); extern TransactionId GetOldestSafeDecodingTransactionId(bool catalogOnly); extern void GetReplicationHorizons(TransactionId *slot_xmin, TransactionId *catalog_xmin); -extern VirtualTransactionId *GetVirtualXIDsDelayingChkpt(int *nvxids); -extern bool HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids, int nvxids); +extern VirtualTransactionId *GetVirtualXIDsDelayingChkpt(int *nvxids, int type); +extern bool HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids, + int nvxids, int type); extern PGPROC *BackendPidGetProc(int pid); extern PGPROC *BackendPidGetProcWithLock(int pid); From 7dac61402e34c6d41d5d11cdc4c6a55f91e24026 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Thu, 24 Mar 2022 20:51:40 +0100 Subject: [PATCH 243/772] Remove unused module imports from TAP tests The Config and Cwd modules were no longer used, but remained imported, in a number of tests. Remove to keep the imports to the actually used modules. Reviewed-by: Andrew Dunstan Discussion: https://postgr.es/m/A5A074CD-3198-492B-BE5E-7961EFC3733F@yesql.se --- contrib/amcheck/t/002_cic.pl | 1 - contrib/amcheck/t/003_cic_2pc.pl | 1 - src/bin/pg_basebackup/t/010_pg_basebackup.pl | 2 -- src/bin/pg_checksums/t/002_actions.pl | 1 - src/bin/pg_dump/t/001_basic.pl | 1 - src/bin/pg_dump/t/002_pg_dump.pl | 1 - src/bin/pg_test_fsync/t/001_basic.pl | 1 - src/bin/pg_test_timing/t/001_basic.pl | 1 - src/bin/pg_verifybackup/t/002_algorithm.pl | 2 -- src/bin/pg_verifybackup/t/003_corruption.pl | 2 -- src/bin/pg_verifybackup/t/004_options.pl | 2 -- src/bin/pg_verifybackup/t/005_bad_manifest.pl | 2 -- src/bin/pg_verifybackup/t/006_encoding.pl | 2 -- src/bin/pg_verifybackup/t/007_wal.pl | 2 -- src/bin/pg_verifybackup/t/008_untar.pl | 1 - src/bin/pg_verifybackup/t/009_extract.pl | 2 -- src/bin/pg_verifybackup/t/010_client_untar.pl | 1 - src/bin/pgbench/t/001_pgbench_with_server.pl | 1 - src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl | 1 - src/test/modules/test_pg_dump/t/001_base.pl | 1 - src/test/perl/PostgreSQL/Test/Cluster.pm | 1 - src/test/recovery/t/011_crash_recovery.pl | 1 - src/test/recovery/t/013_crash_restart.pl | 1 - src/test/recovery/t/017_shm.pl | 1 - src/test/recovery/t/020_archive_status.pl | 1 - src/test/recovery/t/021_row_visibility.pl | 1 - 26 files changed, 34 deletions(-) diff --git a/contrib/amcheck/t/002_cic.pl b/contrib/amcheck/t/002_cic.pl index b8e4ac7cf4..32e4e4abd8 100644 --- a/contrib/amcheck/t/002_cic.pl +++ b/contrib/amcheck/t/002_cic.pl @@ -5,7 +5,6 @@ use strict; use warnings; -use Config; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/contrib/amcheck/t/003_cic_2pc.pl b/contrib/amcheck/t/003_cic_2pc.pl index e66ccd93f1..1a2cceae49 100644 --- a/contrib/amcheck/t/003_cic_2pc.pl +++ b/contrib/amcheck/t/003_cic_2pc.pl @@ -5,7 +5,6 @@ use strict; use warnings; -use Config; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 2869a239e7..9aa35a16a4 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -3,8 +3,6 @@ use strict; use warnings; -use Cwd; -use Config; use File::Basename qw(basename dirname); use File::Path qw(rmtree); use Fcntl qw(:seek); diff --git a/src/bin/pg_checksums/t/002_actions.pl b/src/bin/pg_checksums/t/002_actions.pl index 751f732451..62c608eaf6 100644 --- a/src/bin/pg_checksums/t/002_actions.pl +++ b/src/bin/pg_checksums/t/002_actions.pl @@ -6,7 +6,6 @@ use strict; use warnings; -use Config; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_dump/t/001_basic.pl b/src/bin/pg_dump/t/001_basic.pl index 48faeb4371..e0bf3eb032 100644 --- a/src/bin/pg_dump/t/001_basic.pl +++ b/src/bin/pg_dump/t/001_basic.pl @@ -4,7 +4,6 @@ use strict; use warnings; -use Config; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index 19f908f600..0e724b0366 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -4,7 +4,6 @@ use strict; use warnings; -use Config; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_test_fsync/t/001_basic.pl b/src/bin/pg_test_fsync/t/001_basic.pl index 0b579dde9d..8c5c0e7967 100644 --- a/src/bin/pg_test_fsync/t/001_basic.pl +++ b/src/bin/pg_test_fsync/t/001_basic.pl @@ -4,7 +4,6 @@ use strict; use warnings; -use Config; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_test_timing/t/001_basic.pl b/src/bin/pg_test_timing/t/001_basic.pl index ef9f6d6746..51bf68b0e1 100644 --- a/src/bin/pg_test_timing/t/001_basic.pl +++ b/src/bin/pg_test_timing/t/001_basic.pl @@ -4,7 +4,6 @@ use strict; use warnings; -use Config; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_verifybackup/t/002_algorithm.pl b/src/bin/pg_verifybackup/t/002_algorithm.pl index 20e3ca587a..ca2c0f0c7b 100644 --- a/src/bin/pg_verifybackup/t/002_algorithm.pl +++ b/src/bin/pg_verifybackup/t/002_algorithm.pl @@ -5,8 +5,6 @@ use strict; use warnings; -use Cwd; -use Config; use File::Path qw(rmtree); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_verifybackup/t/003_corruption.pl b/src/bin/pg_verifybackup/t/003_corruption.pl index 406c0c9877..843016ad80 100644 --- a/src/bin/pg_verifybackup/t/003_corruption.pl +++ b/src/bin/pg_verifybackup/t/003_corruption.pl @@ -5,8 +5,6 @@ use strict; use warnings; -use Cwd; -use Config; use File::Path qw(rmtree); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_verifybackup/t/004_options.pl b/src/bin/pg_verifybackup/t/004_options.pl index 7461dee03f..6fdd74e5ee 100644 --- a/src/bin/pg_verifybackup/t/004_options.pl +++ b/src/bin/pg_verifybackup/t/004_options.pl @@ -5,8 +5,6 @@ use strict; use warnings; -use Cwd; -use Config; use File::Path qw(rmtree); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_verifybackup/t/005_bad_manifest.pl b/src/bin/pg_verifybackup/t/005_bad_manifest.pl index 118beb53d7..74d0a8d1b2 100644 --- a/src/bin/pg_verifybackup/t/005_bad_manifest.pl +++ b/src/bin/pg_verifybackup/t/005_bad_manifest.pl @@ -6,8 +6,6 @@ use strict; use warnings; -use Cwd; -use Config; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_verifybackup/t/006_encoding.pl b/src/bin/pg_verifybackup/t/006_encoding.pl index ce45c919a8..210f269d59 100644 --- a/src/bin/pg_verifybackup/t/006_encoding.pl +++ b/src/bin/pg_verifybackup/t/006_encoding.pl @@ -5,8 +5,6 @@ use strict; use warnings; -use Cwd; -use Config; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_verifybackup/t/007_wal.pl b/src/bin/pg_verifybackup/t/007_wal.pl index 56fcd84bec..bef2701ef7 100644 --- a/src/bin/pg_verifybackup/t/007_wal.pl +++ b/src/bin/pg_verifybackup/t/007_wal.pl @@ -5,8 +5,6 @@ use strict; use warnings; -use Cwd; -use Config; use File::Path qw(rmtree); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_verifybackup/t/008_untar.pl b/src/bin/pg_verifybackup/t/008_untar.pl index 98d09ce40c..915249a19d 100644 --- a/src/bin/pg_verifybackup/t/008_untar.pl +++ b/src/bin/pg_verifybackup/t/008_untar.pl @@ -7,7 +7,6 @@ use strict; use warnings; -use Config; use File::Path qw(rmtree); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_verifybackup/t/009_extract.pl b/src/bin/pg_verifybackup/t/009_extract.pl index 9f9cc7540b..41a5b370cc 100644 --- a/src/bin/pg_verifybackup/t/009_extract.pl +++ b/src/bin/pg_verifybackup/t/009_extract.pl @@ -6,8 +6,6 @@ use strict; use warnings; -use Cwd; -use Config; use File::Path qw(rmtree); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_verifybackup/t/010_client_untar.pl b/src/bin/pg_verifybackup/t/010_client_untar.pl index 487e30e826..488a6d1ede 100644 --- a/src/bin/pg_verifybackup/t/010_client_untar.pl +++ b/src/bin/pg_verifybackup/t/010_client_untar.pl @@ -6,7 +6,6 @@ use strict; use warnings; -use Config; use File::Path qw(rmtree); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pgbench/t/001_pgbench_with_server.pl b/src/bin/pgbench/t/001_pgbench_with_server.pl index 3eb5905e5a..60cae1e843 100644 --- a/src/bin/pgbench/t/001_pgbench_with_server.pl +++ b/src/bin/pgbench/t/001_pgbench_with_server.pl @@ -7,7 +7,6 @@ use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; -use Config; # start a pgbench specific server my $node = PostgreSQL::Test::Cluster->new('main'); diff --git a/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl b/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl index 0c164dcaba..cc79d96d47 100644 --- a/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl +++ b/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl @@ -4,7 +4,6 @@ use strict; use warnings; -use Config; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/modules/test_pg_dump/t/001_base.pl b/src/test/modules/test_pg_dump/t/001_base.pl index c73bd37835..84a35590b7 100644 --- a/src/test/modules/test_pg_dump/t/001_base.pl +++ b/src/test/modules/test_pg_dump/t/001_base.pl @@ -4,7 +4,6 @@ use strict; use warnings; -use Config; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index e7b9161137..0295731bd0 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -93,7 +93,6 @@ use warnings; use Carp; use Config; -use Cwd; use Fcntl qw(:mode); use File::Basename; use File::Path qw(rmtree); diff --git a/src/test/recovery/t/011_crash_recovery.pl b/src/test/recovery/t/011_crash_recovery.pl index 14154d1ce0..1b57d01046 100644 --- a/src/test/recovery/t/011_crash_recovery.pl +++ b/src/test/recovery/t/011_crash_recovery.pl @@ -9,7 +9,6 @@ use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; -use Config; my $node = PostgreSQL::Test::Cluster->new('primary'); $node->init(allows_streaming => 1); diff --git a/src/test/recovery/t/013_crash_restart.pl b/src/test/recovery/t/013_crash_restart.pl index 44c4c62cb7..8807c0a291 100644 --- a/src/test/recovery/t/013_crash_restart.pl +++ b/src/test/recovery/t/013_crash_restart.pl @@ -16,7 +16,6 @@ use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; -use Config; my $psql_timeout = IPC::Run::timer($PostgreSQL::Test::Utils::timeout_default); diff --git a/src/test/recovery/t/017_shm.pl b/src/test/recovery/t/017_shm.pl index 713e6f068d..875657b4bb 100644 --- a/src/test/recovery/t/017_shm.pl +++ b/src/test/recovery/t/017_shm.pl @@ -6,7 +6,6 @@ # use strict; use warnings; -use Config; use File::stat qw(stat); use IPC::Run 'run'; use PostgreSQL::Test::Cluster; diff --git a/src/test/recovery/t/020_archive_status.pl b/src/test/recovery/t/020_archive_status.pl index cbff26e122..e6e4eb56a9 100644 --- a/src/test/recovery/t/020_archive_status.pl +++ b/src/test/recovery/t/020_archive_status.pl @@ -9,7 +9,6 @@ use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; -use Config; my $primary = PostgreSQL::Test::Cluster->new('primary'); $primary->init( diff --git a/src/test/recovery/t/021_row_visibility.pl b/src/test/recovery/t/021_row_visibility.pl index 55d8c31b56..aeaf37cfad 100644 --- a/src/test/recovery/t/021_row_visibility.pl +++ b/src/test/recovery/t/021_row_visibility.pl @@ -9,7 +9,6 @@ use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; -use Config; # Initialize primary node my $node_primary = PostgreSQL::Test::Cluster->new('primary'); From ce95c543763b6fade641a67fa0c70649d8527243 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 24 Mar 2022 16:33:13 -0400 Subject: [PATCH 244/772] Fix pg_statio_all_tables view for multiple TOAST indexes. A TOAST table can normally have only one index, but there are corner cases where it has more; for example, transiently during REINDEX CONCURRENTLY. In such a case, the pg_statio_all_tables view produced multiple rows for the owning table, one per TOAST index. Refactor the view to avoid that, instead summing the stats across all the indexes, as we do for regular table indexes. While this has been wrong for a long time, back-patching seems unwise due to the difficulty of putting a system view change into back branches. Andrei Zubkov, tweaked a bit by me Discussion: https://postgr.es/m/acefef4189706971fc475f912c1afdab1c48d627.camel@moonset.ru --- src/backend/catalog/system_views.sql | 31 ++++++++++++++++++---------- src/include/catalog/catversion.h | 2 +- src/test/regress/expected/rules.out | 21 ++++++++++++------- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 9ac8e9a299..9570a53e7b 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -727,22 +727,31 @@ CREATE VIEW pg_statio_all_tables AS pg_stat_get_blocks_fetched(C.oid) - pg_stat_get_blocks_hit(C.oid) AS heap_blks_read, pg_stat_get_blocks_hit(C.oid) AS heap_blks_hit, - sum(pg_stat_get_blocks_fetched(I.indexrelid) - - pg_stat_get_blocks_hit(I.indexrelid))::bigint AS idx_blks_read, - sum(pg_stat_get_blocks_hit(I.indexrelid))::bigint AS idx_blks_hit, + I.idx_blks_read AS idx_blks_read, + I.idx_blks_hit AS idx_blks_hit, pg_stat_get_blocks_fetched(T.oid) - pg_stat_get_blocks_hit(T.oid) AS toast_blks_read, pg_stat_get_blocks_hit(T.oid) AS toast_blks_hit, - pg_stat_get_blocks_fetched(X.indexrelid) - - pg_stat_get_blocks_hit(X.indexrelid) AS tidx_blks_read, - pg_stat_get_blocks_hit(X.indexrelid) AS tidx_blks_hit + X.idx_blks_read AS tidx_blks_read, + X.idx_blks_hit AS tidx_blks_hit FROM pg_class C LEFT JOIN - pg_index I ON C.oid = I.indrelid LEFT JOIN - pg_class T ON C.reltoastrelid = T.oid LEFT JOIN - pg_index X ON T.oid = X.indrelid + pg_class T ON C.reltoastrelid = T.oid LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) - WHERE C.relkind IN ('r', 't', 'm') - GROUP BY C.oid, N.nspname, C.relname, T.oid, X.indexrelid; + LEFT JOIN LATERAL ( + SELECT sum(pg_stat_get_blocks_fetched(indexrelid) - + pg_stat_get_blocks_hit(indexrelid))::bigint + AS idx_blks_read, + sum(pg_stat_get_blocks_hit(indexrelid))::bigint + AS idx_blks_hit + FROM pg_index WHERE indrelid = C.oid ) I ON true + LEFT JOIN LATERAL ( + SELECT sum(pg_stat_get_blocks_fetched(indexrelid) - + pg_stat_get_blocks_hit(indexrelid))::bigint + AS idx_blks_read, + sum(pg_stat_get_blocks_hit(indexrelid))::bigint + AS idx_blks_hit + FROM pg_index WHERE indrelid = T.oid ) X ON true + WHERE C.relkind IN ('r', 't', 'm'); CREATE VIEW pg_statio_sys_tables AS SELECT * FROM pg_statio_all_tables diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index db9963db72..a3a49d3938 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202203221 +#define CATALOG_VERSION_NO 202203241 #endif diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 8a5b20e62c..27d19b4bf1 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -2269,19 +2269,24 @@ pg_statio_all_tables| SELECT c.oid AS relid, c.relname, (pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS heap_blks_read, pg_stat_get_blocks_hit(c.oid) AS heap_blks_hit, - (sum((pg_stat_get_blocks_fetched(i.indexrelid) - pg_stat_get_blocks_hit(i.indexrelid))))::bigint AS idx_blks_read, - (sum(pg_stat_get_blocks_hit(i.indexrelid)))::bigint AS idx_blks_hit, + i.idx_blks_read, + i.idx_blks_hit, (pg_stat_get_blocks_fetched(t.oid) - pg_stat_get_blocks_hit(t.oid)) AS toast_blks_read, pg_stat_get_blocks_hit(t.oid) AS toast_blks_hit, - (pg_stat_get_blocks_fetched(x.indexrelid) - pg_stat_get_blocks_hit(x.indexrelid)) AS tidx_blks_read, - pg_stat_get_blocks_hit(x.indexrelid) AS tidx_blks_hit + x.idx_blks_read AS tidx_blks_read, + x.idx_blks_hit AS tidx_blks_hit FROM ((((pg_class c - LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) LEFT JOIN pg_class t ON ((c.reltoastrelid = t.oid))) - LEFT JOIN pg_index x ON ((t.oid = x.indrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) - WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"])) - GROUP BY c.oid, n.nspname, c.relname, t.oid, x.indexrelid; + LEFT JOIN LATERAL ( SELECT (sum((pg_stat_get_blocks_fetched(pg_index.indexrelid) - pg_stat_get_blocks_hit(pg_index.indexrelid))))::bigint AS idx_blks_read, + (sum(pg_stat_get_blocks_hit(pg_index.indexrelid)))::bigint AS idx_blks_hit + FROM pg_index + WHERE (pg_index.indrelid = c.oid)) i ON (true)) + LEFT JOIN LATERAL ( SELECT (sum((pg_stat_get_blocks_fetched(pg_index.indexrelid) - pg_stat_get_blocks_hit(pg_index.indexrelid))))::bigint AS idx_blks_read, + (sum(pg_stat_get_blocks_hit(pg_index.indexrelid)))::bigint AS idx_blks_hit + FROM pg_index + WHERE (pg_index.indrelid = t.oid)) x ON (true)) + WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"])); pg_statio_sys_indexes| SELECT pg_statio_all_indexes.relid, pg_statio_all_indexes.indexrelid, pg_statio_all_indexes.schemaname, From 26ebb0e28032283f99bf985fb47ea3d19fbaf91a Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Thu, 24 Mar 2022 22:41:40 +0100 Subject: [PATCH 245/772] List offending databases in pg_upgrade datallowconn check The check for datallowconn being properly set on all databases in the old cluster errored out on the first instance, rather than report the set of problematic databases. This adds reporting to a textfile like how many other checks are performed. While there, also add a comment to the function as per how other checks are commented. This check won't catch if template1 isn't allowing connections, since that's used for connecting in the first place. That error remains as it is today: connection to server on socket ".." failed: FATAL: database "template1" is not currently accepting connections Author: Jeevan Ladhe Reviewed-by: Suraj Kharage Reviewed-by: Justin Pryzby Discussion: https://postgr.es/m/CAOgcT0McABqF_iFFQuuRf9is+gmYMsmUu_SWNikyr=2VGyP9Jw@mail.gmail.com --- src/bin/pg_upgrade/check.c | 41 +++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c index cf3b398d9e..dd3972bb6c 100644 --- a/src/bin/pg_upgrade/check.c +++ b/src/bin/pg_upgrade/check.c @@ -682,6 +682,13 @@ check_is_install_user(ClusterInfo *cluster) } +/* + * check_proper_datallowconn + * + * Ensure that all non-template0 databases allow connections since they + * otherwise won't be restored; and that template0 explicitly doesn't allow + * connections since it would make pg_dumpall --globals restore fail. + */ static void check_proper_datallowconn(ClusterInfo *cluster) { @@ -691,9 +698,16 @@ check_proper_datallowconn(ClusterInfo *cluster) int ntups; int i_datname; int i_datallowconn; + FILE *script = NULL; + char output_path[MAXPGPATH]; + bool found = false; prep_status("Checking database connection settings"); + snprintf(output_path, sizeof(output_path), "%s/%s", + log_opts.basedir, + "databases_with_datallowconn_false.txt"); + conn_template1 = connectToServer(cluster, "template1"); /* get database names */ @@ -724,8 +738,14 @@ check_proper_datallowconn(ClusterInfo *cluster) * restore */ if (strcmp(datallowconn, "f") == 0) - pg_fatal("All non-template0 databases must allow connections, " - "i.e. their pg_database.datallowconn must be true\n"); + { + found = true; + if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) + pg_fatal("could not open file \"%s\": %s\n", + output_path, strerror(errno)); + + fprintf(script, "%s\n", datname); + } } } @@ -733,7 +753,22 @@ check_proper_datallowconn(ClusterInfo *cluster) PQfinish(conn_template1); - check_ok(); + if (script) + fclose(script); + + if (found) + { + pg_log(PG_REPORT, "fatal\n"); + pg_fatal("All non-template0 databases must allow connections, i.e. their\n" + "pg_database.datallowconn must be true. Your installation contains\n" + "non-template0 databases with their pg_database.datallowconn set to\n" + "false. Consider allowing connection for all non-template0 databases\n" + "or drop the databases which do not allow connections. A list of\n" + "databases with the problem is in the file:\n" + " %s\n\n", output_path); + } + else + check_ok(); } From f28bf667f602f6ff36c219eb40c5f61de4440ae5 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 24 Mar 2022 17:12:09 -0700 Subject: [PATCH 246/772] Add retries for further investigation of 019_replslot_limit.pl failures. Tom noticed evidence in the buildfarm suggesting the failures might just be really slow process exits. To investigate further, instead of giving up after seeing multiple walsender pids once, retry. For now continue to report test failure if a retry succeeds. See also commit afdeff10526 and fe0972ee5e6. Per suggestion from Tom Lane. Discussion: https://postgr.es/m/3042597.1648148740@sss.pgh.pa.us --- src/test/recovery/t/019_replslot_limit.pl | 40 ++++++++++++++++------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/test/recovery/t/019_replslot_limit.pl b/src/test/recovery/t/019_replslot_limit.pl index f62b7b32f6..77bb401bc5 100644 --- a/src/test/recovery/t/019_replslot_limit.pl +++ b/src/test/recovery/t/019_replslot_limit.pl @@ -333,23 +333,41 @@ $node_standby3->append_conf('postgresql.conf', "primary_slot_name = 'rep3'"); $node_standby3->start; $node_primary3->wait_for_catchup($node_standby3); -my $senderpid = $node_primary3->safe_psql('postgres', - "SELECT pid FROM pg_stat_activity WHERE backend_type = 'walsender'"); - -# We've seen occasional cases where multiple walsender pids are active. An -# immediate shutdown may hide evidence of a locking bug. So if multiple -# walsenders are observed, shut down in fast mode, and collect some more -# information. -if (not like($senderpid, qr/^[0-9]+$/, "have walsender pid $senderpid")) + +my $senderpid; + +# We've seen occasional cases where multiple walsender pids are active. It +# could be that we're just observing process shutdown being slow. To collect +# more information, retry a couple times, print a bit of debugging information +# each iteration. For now report a test failure even if later iterations +# succeed. +my $i = 0; +while (1) { my ($stdout, $stderr); + + $senderpid = $node_primary3->safe_psql('postgres', + "SELECT pid FROM pg_stat_activity WHERE backend_type = 'walsender'"); + + last if like($senderpid, qr/^[0-9]+$/, "have walsender pid $senderpid"); + + # show information about all active connections $node_primary3->psql('postgres', "\\a\\t\nSELECT * FROM pg_stat_activity", stdout => \$stdout, stderr => \$stderr); diag $stdout, $stderr; - $node_primary3->stop('fast'); - $node_standby3->stop('fast'); - die "could not determine walsender pid, can't continue"; + + # unlikely that the problem would resolve after 15s, so give up at point + if ($i++ == 150) + { + # An immediate shutdown may hide evidence of a locking bug. If + # retrying didn't resolve the issue, shut down in fast mode. + $node_primary3->stop('fast'); + $node_standby3->stop('fast'); + die "could not determine walsender pid, can't continue"; + } + + usleep(100_000); } my $receiverpid = $node_standby3->safe_psql('postgres', From 52b5568432963b721698a2df1f37a0795b9611dc Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Fri, 25 Mar 2022 13:44:10 +1300 Subject: [PATCH 247/772] Improve command line options for pg_waldump. Follow-up improvements for commit 127aea2a based on discussion: * use fork name for --fork, not number * use -R, -B as short switches for --relation, --block * re-alphabetize the list of switches (code, --help and docs) Suggested-by: Peter Eisentraut (fork name part) Reviewed-by: David Christensen Reviewed-by: Japin Li Discussion: https://postgr.es/m/3a4c2e93-7976-2320-fc0a-32097fe148a7%40enterprisedb.com --- doc/src/sgml/ref/pg_waldump.sgml | 58 +++++++++++------------ src/bin/pg_waldump/pg_waldump.c | 80 +++++++++++++++----------------- 2 files changed, 66 insertions(+), 72 deletions(-) diff --git a/doc/src/sgml/ref/pg_waldump.sgml b/doc/src/sgml/ref/pg_waldump.sgml index 981d3c9038..4e86f44c5b 100644 --- a/doc/src/sgml/ref/pg_waldump.sgml +++ b/doc/src/sgml/ref/pg_waldump.sgml @@ -78,6 +78,18 @@ PostgreSQL documentation + + + + + + Only display records that modify the given block. The relation must + also be provided with or + . + + + + @@ -100,41 +112,16 @@ PostgreSQL documentation - - - - - - Only display records that modify the given block. The relation must - also be provided with or - . - - - - If provided, only display records that modify blocks in the given fork. - The valid values are 0 for the main fork, - 1 for the free space map, - 2 for the visibility map, - and 3 for the init fork. - - - - - - - - - - Only display records that modify blocks in the given relation. The - relation is specified with tablespace OID, database OID, and relfilenode - separated by slashes, for example 1234/12345/12345. - This is the same format used for relations in the program's output. + The valid values are main for the main fork, + fsm for the free space map, + vm for the visibility map, + and init for the init fork. @@ -189,6 +176,19 @@ PostgreSQL documentation + + + + + + Only display records that modify blocks in the given relation. The + relation is specified with tablespace OID, database OID, and relfilenode + separated by slashes, for example 1234/12345/12345. + This is the same format used for relations in the program's output. + + + + diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 92238f30c9..9ffe9e55bd 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -825,12 +825,11 @@ usage(void) printf(_(" %s [OPTION]... [STARTSEG [ENDSEG]]\n"), progname); printf(_("\nOptions:\n")); printf(_(" -b, --bkp-details output detailed information about backup blocks\n")); + printf(_(" -B, --block=N with --relation, only show records that modify block N\n")); printf(_(" -e, --end=RECPTR stop reading at WAL location RECPTR\n")); printf(_(" -f, --follow keep retrying after reaching end of WAL\n")); - printf(_(" -k, --block=N with --relation, only show records matching this block\n")); - printf(_(" -F, --fork=N only show records matching a specific fork number\n" - " (defaults to showing all)\n")); - printf(_(" -l, --relation=N/N/N only show records that affect a specific relation\n")); + printf(_(" -F, --fork=FORK only show records that modify blocks in fork FORK;\n" + " valid names are main, fsm, vm, init\n")); printf(_(" -n, --limit=N number of records to display\n")); printf(_(" -p, --path=PATH directory in which to find log segment files or a\n" " directory with a ./pg_wal that contains such files\n" @@ -838,12 +837,13 @@ usage(void) printf(_(" -q, --quiet do not print any output, except for errors\n")); printf(_(" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" " use --rmgr=list to list valid resource manager names\n")); + printf(_(" -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n")); printf(_(" -s, --start=RECPTR start reading at WAL location RECPTR\n")); printf(_(" -t, --timeline=TLI timeline from which to read log records\n" " (default: 1 or the value used in STARTSEG)\n")); printf(_(" -V, --version output version information, then exit\n")); - printf(_(" -x, --xid=XID only show records with transaction ID XID\n")); printf(_(" -w, --fullpage only show records with a full page write\n")); + printf(_(" -x, --xid=XID only show records with transaction ID XID\n")); printf(_(" -z, --stats[=record] show statistics instead of records\n" " (optionally, show per-record statistics)\n")); printf(_(" -?, --help show this help, then exit\n")); @@ -867,7 +867,7 @@ main(int argc, char **argv) static struct option long_options[] = { {"bkp-details", no_argument, NULL, 'b'}, - {"block", required_argument, NULL, 'k'}, + {"block", required_argument, NULL, 'B'}, {"end", required_argument, NULL, 'e'}, {"follow", no_argument, NULL, 'f'}, {"fork", required_argument, NULL, 'F'}, @@ -876,7 +876,7 @@ main(int argc, char **argv) {"limit", required_argument, NULL, 'n'}, {"path", required_argument, NULL, 'p'}, {"quiet", no_argument, NULL, 'q'}, - {"relation", required_argument, NULL, 'l'}, + {"relation", required_argument, NULL, 'R'}, {"rmgr", required_argument, NULL, 'r'}, {"start", required_argument, NULL, 's'}, {"timeline", required_argument, NULL, 't'}, @@ -946,7 +946,7 @@ main(int argc, char **argv) goto bad_argument; } - while ((option = getopt_long(argc, argv, "be:fF:k:l:n:p:qr:s:t:wx:z", + while ((option = getopt_long(argc, argv, "bB:e:fF:n:p:qr:R:s:t:wx:z", long_options, &optindex)) != -1) { switch (option) @@ -954,6 +954,16 @@ main(int argc, char **argv) case 'b': config.bkp_details = true; break; + case 'B': + if (sscanf(optarg, "%u", &config.filter_by_relation_block) != 1 || + !BlockNumberIsValid(config.filter_by_relation_block)) + { + pg_log_error("could not parse valid block number \"%s\"", optarg); + goto bad_argument; + } + config.filter_by_relation_block_enabled = true; + config.filter_by_extended = true; + break; case 'e': if (sscanf(optarg, "%X/%X", &xlogid, &xrecoff) != 2) { @@ -967,44 +977,12 @@ main(int argc, char **argv) config.follow = true; break; case 'F': + config.filter_by_relation_forknum = forkname_to_number(optarg); + if (config.filter_by_relation_forknum == InvalidForkNumber) { - unsigned int forknum; - - if (sscanf(optarg, "%u", &forknum) != 1 || - forknum > MAX_FORKNUM) - { - pg_log_error("could not parse valid fork number (0..%d) \"%s\"", - MAX_FORKNUM, optarg); - goto bad_argument; - } - config.filter_by_relation_forknum = (ForkNumber) forknum; - config.filter_by_extended = true; - } - break; - case 'k': - if (sscanf(optarg, "%u", &config.filter_by_relation_block) != 1 || - !BlockNumberIsValid(config.filter_by_relation_block)) - { - pg_log_error("could not parse valid block number \"%s\"", optarg); - goto bad_argument; - } - config.filter_by_relation_block_enabled = true; - config.filter_by_extended = true; - break; - case 'l': - if (sscanf(optarg, "%u/%u/%u", - &config.filter_by_relation.spcNode, - &config.filter_by_relation.dbNode, - &config.filter_by_relation.relNode) != 3 || - !OidIsValid(config.filter_by_relation.spcNode) || - !OidIsValid(config.filter_by_relation.relNode)) - { - pg_log_error("could not parse valid relation from \"%s\"" - " (expecting \"tablespace OID/database OID/" - "relation filenode\")", optarg); + pg_log_error("could not parse fork \"%s\"", optarg); goto bad_argument; } - config.filter_by_relation_enabled = true; config.filter_by_extended = true; break; case 'n': @@ -1047,6 +1025,22 @@ main(int argc, char **argv) } } break; + case 'R': + if (sscanf(optarg, "%u/%u/%u", + &config.filter_by_relation.spcNode, + &config.filter_by_relation.dbNode, + &config.filter_by_relation.relNode) != 3 || + !OidIsValid(config.filter_by_relation.spcNode) || + !OidIsValid(config.filter_by_relation.relNode)) + { + pg_log_error("could not parse valid relation from \"%s\"" + " (expecting \"tablespace OID/database OID/" + "relation filenode\")", optarg); + goto bad_argument; + } + config.filter_by_relation_enabled = true; + config.filter_by_extended = true; + break; case 's': if (sscanf(optarg, "%X/%X", &xlogid, &xrecoff) != 2) { From 0f79caa3c61e643e6285524f3148a35fb61ddcf3 Mon Sep 17 00:00:00 2001 From: Tatsuo Ishii Date: Fri, 25 Mar 2022 10:11:19 +0900 Subject: [PATCH 248/772] Second attempt to fix pgbench TAP test. Bildfarm member prairiedog reported a pgbench TAP test failure after commit: 4a39f87acd6e681e5ded1239391d8a92645b43d6. This is the second attempt to fix it. It seems older version of Perl does not accept "\gN". Replace it with plain old "\N" because actually "\gN" is not necessary here. Author: Tatsuo Ishii Reported-by: Tom Lane Reviewed-by: Tom Lane, Yugo Nagata Discussion: https://postgr.es/m/2775989.1648060014%40sss.pgh.pa.us --- src/bin/pgbench/t/001_pgbench_with_server.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/pgbench/t/001_pgbench_with_server.pl b/src/bin/pgbench/t/001_pgbench_with_server.pl index 60cae1e843..ca71f968dc 100644 --- a/src/bin/pgbench/t/001_pgbench_with_server.pl +++ b/src/bin/pgbench/t/001_pgbench_with_server.pl @@ -1222,9 +1222,9 @@ sub check_pgbench_logs # delta variable in the next try my $err_pattern = "(client (0|1) sending UPDATE xy SET y = y \\+ -?\\d+\\b).*" - . "client \\g2 got an error in command 3 \\(SQL\\) of script 0; " + . "client \\2 got an error in command 3 \\(SQL\\) of script 0; " . "ERROR: could not serialize access due to concurrent update\\b.*" - . "\\g1"; + . "\\1"; $node->pgbench( "-n -c 2 -t 1 -d --verbose-errors --max-tries 2", From 3e67a5cac6a50139bd29b96ab97496dbc1543d92 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Fri, 25 Mar 2022 07:37:06 +0530 Subject: [PATCH 249/772] Remove some useless free calls. These were introduced in recent commit 52e4f0cd47. We were trying to free some transient space consumption and that too was not entirely correct and complete. We don't need this partial freeing of memory as it will be allocated just once for a query and will be freed at the end of the query. Author: Zhihong Yu Reviewed-by: Amit Kapila Discussion: https://postgr.es/m/CALNJ-vQORfQ=vicbKA_RmeGZGzm1y3WsEcZqXWi7qjN43Cz_vg@mail.gmail.com --- src/backend/commands/publicationcmds.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index f890d3f0ba..c6437799c5 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -409,9 +409,6 @@ contain_invalid_rfcolumn(Oid pubid, Relation relation, List *ancestors, context.bms_replident = bms; rfnode = stringToNode(TextDatumGetCString(rfdatum)); result = contain_invalid_rfcolumn_walker(rfnode, &context); - - bms_free(bms); - pfree(rfnode); } ReleaseSysCache(rftuple); @@ -1182,9 +1179,6 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, } } - if (oldrelwhereclause) - pfree(oldrelwhereclause); - /* * Add the non-matched relations to a list so that they can be * dropped. From ad8759bea06d2a0cac033f5ba551011663d9e716 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 25 Mar 2022 14:11:18 +0900 Subject: [PATCH 250/772] Fix typos in standby.c xl_running_xacts exists, not xl_xact_running_xacts. Author: Hou Zhijie Discussion: https://postgr.es/m/OS0PR01MB57160D8B01097FFB5C175065941A9@OS0PR01MB5716.jpnprd01.prod.outlook.com --- src/backend/storage/ipc/standby.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c index 27361ac861..2850867323 100644 --- a/src/backend/storage/ipc/standby.c +++ b/src/backend/storage/ipc/standby.c @@ -1273,10 +1273,10 @@ LogStandbySnapshot(void) /* * Record an enhanced snapshot of running transactions into WAL. * - * The definitions of RunningTransactionsData and xl_xact_running_xacts are - * similar. We keep them separate because xl_xact_running_xacts is a - * contiguous chunk of memory and never exists fully until it is assembled in - * WAL. The inserted records are marked as not being important for durability, + * The definitions of RunningTransactionsData and xl_running_xacts are + * similar. We keep them separate because xl_running_xacts is a contiguous + * chunk of memory and never exists fully until it is assembled in WAL. + * The inserted records are marked as not being important for durability, * to avoid triggering superfluous checkpoint / archiving activity. */ static XLogRecPtr From 56566835039ac5eed70f188518cef1a7ea0971b2 Mon Sep 17 00:00:00 2001 From: Etsuro Fujita Date: Fri, 25 Mar 2022 15:30:00 +0900 Subject: [PATCH 251/772] postgres_fdw: Minor cleanup for pgfdw_abort_cleanup(). Commit 85c696112 introduced this function to deduplicate code in the transaction callback functions, but the SQL command passed as an argument to it was useless when it returned before aborting a remote transaction using the command. Modify pgfdw_abort_cleanup() so that it constructs the command when/if necessary, as before, removing the argument from it. Also update comments in pgfdw_abort_cleanup() and one of the calling functions. Etsuro Fujita, reviewed by David Zhang. Discussion: https://postgr.es/m/CAPmGK158hrd%3DZfXmgkmNFHivgh18e4oE2Gz151C2Q4OBDjZ08A%40mail.gmail.com --- contrib/postgres_fdw/connection.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c index 74d3e73205..129ca79221 100644 --- a/contrib/postgres_fdw/connection.c +++ b/contrib/postgres_fdw/connection.c @@ -110,8 +110,7 @@ static bool pgfdw_exec_cleanup_query(PGconn *conn, const char *query, bool ignore_errors); static bool pgfdw_get_cleanup_result(PGconn *conn, TimestampTz endtime, PGresult **result, bool *timed_out); -static void pgfdw_abort_cleanup(ConnCacheEntry *entry, const char *sql, - bool toplevel); +static void pgfdw_abort_cleanup(ConnCacheEntry *entry, bool toplevel); static void pgfdw_finish_pre_commit_cleanup(List *pending_entries); static void pgfdw_finish_pre_subcommit_cleanup(List *pending_entries, int curlevel); @@ -1015,8 +1014,8 @@ pgfdw_xact_callback(XactEvent event, void *arg) break; case XACT_EVENT_PARALLEL_ABORT: case XACT_EVENT_ABORT: - - pgfdw_abort_cleanup(entry, "ABORT TRANSACTION", true); + /* Rollback all remote transactions during abort */ + pgfdw_abort_cleanup(entry, true); break; } } @@ -1109,10 +1108,7 @@ pgfdw_subxact_callback(SubXactEvent event, SubTransactionId mySubid, else { /* Rollback all remote subtransactions during abort */ - snprintf(sql, sizeof(sql), - "ROLLBACK TO SAVEPOINT s%d; RELEASE SAVEPOINT s%d", - curlevel, curlevel); - pgfdw_abort_cleanup(entry, sql, false); + pgfdw_abort_cleanup(entry, false); } /* OK, we're outta that level of subtransaction */ @@ -1465,10 +1461,7 @@ exit: ; } /* - * Abort remote transaction. - * - * The statement specified in "sql" is sent to the remote server, - * in order to rollback the remote transaction. + * Abort remote transaction or subtransaction. * * "toplevel" should be set to true if toplevel (main) transaction is * rollbacked, false otherwise. @@ -1476,8 +1469,10 @@ exit: ; * Set entry->changing_xact_state to false on success, true on failure. */ static void -pgfdw_abort_cleanup(ConnCacheEntry *entry, const char *sql, bool toplevel) +pgfdw_abort_cleanup(ConnCacheEntry *entry, bool toplevel) { + char sql[100]; + /* * Don't try to clean up the connection if we're already in error * recursion trouble. @@ -1509,8 +1504,14 @@ pgfdw_abort_cleanup(ConnCacheEntry *entry, const char *sql, bool toplevel) !pgfdw_cancel_query(entry->conn)) return; /* Unable to cancel running query */ + if (toplevel) + snprintf(sql, sizeof(sql), "ABORT TRANSACTION"); + else + snprintf(sql, sizeof(sql), + "ROLLBACK TO SAVEPOINT s%d; RELEASE SAVEPOINT s%d", + entry->xact_depth, entry->xact_depth); if (!pgfdw_exec_cleanup_query(entry->conn, sql, false)) - return; /* Unable to abort remote transaction */ + return; /* Unable to abort remote (sub)transaction */ if (toplevel) { From 23119d51a14c046dae35ae5e6ad9e35982d044fd Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 25 Mar 2022 08:44:31 +0100 Subject: [PATCH 252/772] Refactor DLSUFFIX handling Move DLSUFFIX from makefiles into header files for all platforms. Move the DLSUFFIX assignment from src/makefiles/ to src/templates/, have configure read it, and then substitute it into Makefile.global and pg_config.h. This avoids the need for all makefile rules that need it to locally set CPPFLAGS. It also resolves an inconsistent setup between the two Windows build systems. Reviewed-by: Andres Freund Discussion: https://www.postgresql.org/message-id/2f9861fb-8969-9005-7518-b8e60f2bead9@enterprisedb.com --- config/python.m4 | 4 +++- configure | 14 +++++++++++++- configure.ac | 7 +++++++ src/Makefile.global.in | 2 ++ src/backend/jit/Makefile | 2 -- src/backend/utils/fmgr/Makefile | 2 -- src/backend/utils/fmgr/dfmgr.c | 5 ----- src/bin/pg_upgrade/Makefile | 2 +- src/include/pg_config.h.in | 3 +++ src/include/port/win32_port.h | 3 --- src/interfaces/ecpg/test/Makefile | 1 - src/makefiles/Makefile.aix | 1 - src/makefiles/Makefile.cygwin | 1 - src/makefiles/Makefile.darwin | 2 -- src/makefiles/Makefile.freebsd | 2 -- src/makefiles/Makefile.hpux | 6 ------ src/makefiles/Makefile.linux | 2 -- src/makefiles/Makefile.netbsd | 2 -- src/makefiles/Makefile.openbsd | 2 -- src/makefiles/Makefile.solaris | 2 -- src/makefiles/Makefile.win32 | 1 - src/template/cygwin | 2 ++ src/template/hpux | 7 +++++++ src/template/win32 | 2 ++ src/test/regress/GNUmakefile | 3 +-- src/tools/msvc/Solution.pm | 1 + 26 files changed, 42 insertions(+), 39 deletions(-) diff --git a/config/python.m4 b/config/python.m4 index 52f34070dd..e500873ff3 100644 --- a/config/python.m4 +++ b/config/python.m4 @@ -120,7 +120,9 @@ else found_shlib=0 for d in "${python_libdir}" "${python_configdir}" /usr/lib64 /usr/lib do - # We don't know the platform DLSUFFIX here, so check 'em all. + # Note: DLSUFFIX is for loadable modules, not shared + # libraries, so cannot be used here portably. Just + # check all known possibilities. for e in .so .dll .dylib .sl; do if test -e "$d/lib${ldlibrary}$e"; then python_libdir="$d" diff --git a/configure b/configure index e066cbe2c8..8b361e211b 100755 --- a/configure +++ b/configure @@ -734,6 +734,7 @@ autodepend PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG +DLSUFFIX TAS GCC CPP @@ -3033,6 +3034,9 @@ PORTNAME=$template need_tas=no tas_file=dummy.s +# Default, works for most platforms, override in template file if needed +DLSUFFIX=".so" + ## @@ -7688,6 +7692,12 @@ else fi + +cat >>confdefs.h <<_ACEOF +#define DLSUFFIX "$DLSUFFIX" +_ACEOF + + # # Set up pkg_config in case we need it below # @@ -10560,7 +10570,9 @@ else found_shlib=0 for d in "${python_libdir}" "${python_configdir}" /usr/lib64 /usr/lib do - # We don't know the platform DLSUFFIX here, so check 'em all. + # Note: DLSUFFIX is for loadable modules, not shared + # libraries, so cannot be used here portably. Just + # check all known possibilities. for e in .so .dll .dylib .sl; do if test -e "$d/lib${ldlibrary}$e"; then python_libdir="$d" diff --git a/configure.ac b/configure.ac index 078381e568..68ade8f7a6 100644 --- a/configure.ac +++ b/configure.ac @@ -103,6 +103,9 @@ AC_SUBST(PORTNAME) need_tas=no tas_file=dummy.s +# Default, works for most platforms, override in template file if needed +DLSUFFIX=".so" + ## @@ -721,6 +724,10 @@ else fi AC_SUBST(TAS) +AC_SUBST(DLSUFFIX)dnl +AC_DEFINE_UNQUOTED([DLSUFFIX], ["$DLSUFFIX"], + [Define to the file name extension of dynamically-loadable modules.]) + # # Set up pkg_config in case we need it below # diff --git a/src/Makefile.global.in b/src/Makefile.global.in index bbdc1c4bda..0726b2020f 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -545,6 +545,8 @@ WIN32_STACK_RLIMIT=4194304 # Set if we have a working win32 crashdump header have_win32_dbghelp = @have_win32_dbghelp@ +DLSUFFIX = @DLSUFFIX@ + # Pull in platform-specific magic include $(top_builddir)/src/Makefile.port diff --git a/src/backend/jit/Makefile b/src/backend/jit/Makefile index a895ebac5f..a9a603e639 100644 --- a/src/backend/jit/Makefile +++ b/src/backend/jit/Makefile @@ -15,8 +15,6 @@ subdir = src/backend/jit top_builddir = ../../.. include $(top_builddir)/src/Makefile.global -override CPPFLAGS += -DDLSUFFIX=\"$(DLSUFFIX)\" - OBJS = \ jit.o diff --git a/src/backend/utils/fmgr/Makefile b/src/backend/utils/fmgr/Makefile index f552b95ca9..ceffb807fb 100644 --- a/src/backend/utils/fmgr/Makefile +++ b/src/backend/utils/fmgr/Makefile @@ -17,6 +17,4 @@ OBJS = \ fmgr.o \ funcapi.o -override CPPFLAGS += -DDLSUFFIX=\"$(DLSUFFIX)\" - include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/utils/fmgr/dfmgr.c b/src/backend/utils/fmgr/dfmgr.c index 050da78080..3774f33e0e 100644 --- a/src/backend/utils/fmgr/dfmgr.c +++ b/src/backend/utils/fmgr/dfmgr.c @@ -483,11 +483,6 @@ file_exists(const char *name) } -/* Example format: ".so" */ -#ifndef DLSUFFIX -#error "DLSUFFIX must be defined to compile this file." -#endif - /* * If name contains a slash, check if the file exists, if so return * the name. Else (no slash) try to expand using search path (see diff --git a/src/bin/pg_upgrade/Makefile b/src/bin/pg_upgrade/Makefile index 49b94f0ac7..7a3225b27c 100644 --- a/src/bin/pg_upgrade/Makefile +++ b/src/bin/pg_upgrade/Makefile @@ -25,7 +25,7 @@ OBJS = \ util.o \ version.o -override CPPFLAGS := -DDLSUFFIX=\"$(DLSUFFIX)\" -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS) +override CPPFLAGS := -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS) LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) all: pg_upgrade diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 635fbb2181..9e2ca83993 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -42,6 +42,9 @@ /* Define to the default TCP port number as a string constant. */ #undef DEF_PGPORT_STR +/* Define to the file name extension of dynamically-loadable modules. */ +#undef DLSUFFIX + /* Define to build with GSSAPI support. (--with-gssapi) */ #undef ENABLE_GSS diff --git a/src/include/port/win32_port.h b/src/include/port/win32_port.h index d3cb765976..4bb6fc5e1e 100644 --- a/src/include/port/win32_port.h +++ b/src/include/port/win32_port.h @@ -529,9 +529,6 @@ typedef unsigned short mode_t; #define W_OK 2 #define R_OK 4 -/* Pulled from Makefile.port in MinGW */ -#define DLSUFFIX ".dll" - #endif /* _MSC_VER */ #if (defined(_MSC_VER) && (_MSC_VER < 1900)) || \ diff --git a/src/interfaces/ecpg/test/Makefile b/src/interfaces/ecpg/test/Makefile index be53b7b94d..10f53c708c 100644 --- a/src/interfaces/ecpg/test/Makefile +++ b/src/interfaces/ecpg/test/Makefile @@ -12,7 +12,6 @@ override CPPFLAGS := \ '-I$(top_srcdir)/src/test/regress' \ '-DHOST_TUPLE="$(host_tuple)"' \ '-DSHELLPROG="$(SHELL)"' \ - '-DDLSUFFIX="$(DLSUFFIX)"' \ $(CPPFLAGS) # default encoding for regression tests diff --git a/src/makefiles/Makefile.aix b/src/makefiles/Makefile.aix index ba3695dd57..84f26b49b8 100644 --- a/src/makefiles/Makefile.aix +++ b/src/makefiles/Makefile.aix @@ -14,7 +14,6 @@ else rpath = -Wl,-blibpath:'$(rpathdir)$(libpath)' endif -DLSUFFIX = .so ifeq ($(host_os), aix3.2.5) ifneq ($(GCC), yes) LDFLAGS_SL += -e _nostart -H512 -bM:SRE diff --git a/src/makefiles/Makefile.cygwin b/src/makefiles/Makefile.cygwin index 81089d6257..6afa9a06a1 100644 --- a/src/makefiles/Makefile.cygwin +++ b/src/makefiles/Makefile.cygwin @@ -11,7 +11,6 @@ endif LIBS:=$(filter-out -lm -lc, $(LIBS)) AROPT = crs -DLSUFFIX = .dll override CPPFLAGS += -DWIN32_STACK_RLIMIT=$(WIN32_STACK_RLIMIT) diff --git a/src/makefiles/Makefile.darwin b/src/makefiles/Makefile.darwin index b17598f058..4fc81c1584 100644 --- a/src/makefiles/Makefile.darwin +++ b/src/makefiles/Makefile.darwin @@ -1,7 +1,5 @@ AROPT = crs -DLSUFFIX = .so - # env var name to use in place of LD_LIBRARY_PATH ld_library_path_var = DYLD_LIBRARY_PATH diff --git a/src/makefiles/Makefile.freebsd b/src/makefiles/Makefile.freebsd index 75db21ba14..0e77616b0f 100644 --- a/src/makefiles/Makefile.freebsd +++ b/src/makefiles/Makefile.freebsd @@ -3,8 +3,6 @@ AROPT = cr export_dynamic = -Wl,-export-dynamic rpath = -Wl,-R'$(rpathdir)' -DLSUFFIX = .so - # extra stuff for $(with_temp_install) # we need this to get LD_LIBRARY_PATH searched ahead of the compiled-in # rpath, if no DT_RUNPATH is present in the executable. The conditions diff --git a/src/makefiles/Makefile.hpux b/src/makefiles/Makefile.hpux index 7e18770d89..25e036bd8d 100644 --- a/src/makefiles/Makefile.hpux +++ b/src/makefiles/Makefile.hpux @@ -25,12 +25,6 @@ INSTALL_SHLIB_OPTS = -m 555 AROPT = crs -ifeq ($(host_cpu), ia64) - DLSUFFIX = .so -else - DLSUFFIX = .sl -endif - # env var name to use in place of LD_LIBRARY_PATH ld_library_path_var = SHLIB_PATH diff --git a/src/makefiles/Makefile.linux b/src/makefiles/Makefile.linux index 645f73aa2b..1ffec9d169 100644 --- a/src/makefiles/Makefile.linux +++ b/src/makefiles/Makefile.linux @@ -5,8 +5,6 @@ export_dynamic = -Wl,-E # This allows LD_LIBRARY_PATH to still work when needed. rpath = -Wl,-rpath,'$(rpathdir)',--enable-new-dtags -DLSUFFIX = .so - # Rule for building a shared library from a single .o file %.so: %.o diff --git a/src/makefiles/Makefile.netbsd b/src/makefiles/Makefile.netbsd index 6f9cb1d45d..421b735e40 100644 --- a/src/makefiles/Makefile.netbsd +++ b/src/makefiles/Makefile.netbsd @@ -3,8 +3,6 @@ AROPT = cr export_dynamic = -Wl,-E rpath = -Wl,-R'$(rpathdir)' -DLSUFFIX = .so - # Rule for building a shared library from a single .o file %.so: %.o diff --git a/src/makefiles/Makefile.openbsd b/src/makefiles/Makefile.openbsd index 6f9cb1d45d..421b735e40 100644 --- a/src/makefiles/Makefile.openbsd +++ b/src/makefiles/Makefile.openbsd @@ -3,8 +3,6 @@ AROPT = cr export_dynamic = -Wl,-E rpath = -Wl,-R'$(rpathdir)' -DLSUFFIX = .so - # Rule for building a shared library from a single .o file %.so: %.o diff --git a/src/makefiles/Makefile.solaris b/src/makefiles/Makefile.solaris index 62a6c01c3a..5496edcafc 100644 --- a/src/makefiles/Makefile.solaris +++ b/src/makefiles/Makefile.solaris @@ -9,8 +9,6 @@ else rpath = -Wl,-R'$(rpathdir)' endif -DLSUFFIX = .so - # Rule for building a shared library from a single .o file %.so: %.o diff --git a/src/makefiles/Makefile.win32 b/src/makefiles/Makefile.win32 index e72cb2db0e..17d6819644 100644 --- a/src/makefiles/Makefile.win32 +++ b/src/makefiles/Makefile.win32 @@ -11,7 +11,6 @@ endif override CPPFLAGS += -DWIN32_STACK_RLIMIT=$(WIN32_STACK_RLIMIT) AROPT = crs -DLSUFFIX = .dll ifneq (,$(findstring backend,$(subdir))) ifeq (,$(findstring conversion_procs,$(subdir))) diff --git a/src/template/cygwin b/src/template/cygwin index 1e7274bc33..3f42e2f8b6 100644 --- a/src/template/cygwin +++ b/src/template/cygwin @@ -13,3 +13,5 @@ CFLAGS_SL="" # we'd prefer to use --disable-auto-import to match MSVC linking behavior, # but support for it in Cygwin is too haphazard LDFLAGS="$LDFLAGS -Wl,--allow-multiple-definition -Wl,--enable-auto-import" + +DLSUFFIX=".dll" diff --git a/src/template/hpux b/src/template/hpux index 50fff80c53..5105a74c78 100644 --- a/src/template/hpux +++ b/src/template/hpux @@ -25,3 +25,10 @@ case $host in fi ;; esac + +case $host_cpu in + ia64) + DLSUFFIX=".so";; + *) + DLSUFFIX=".sl";; +esac diff --git a/src/template/win32 b/src/template/win32 index 1380d16548..1895f067a8 100644 --- a/src/template/win32 +++ b/src/template/win32 @@ -7,3 +7,5 @@ CFLAGS_SL="" # pg_toupper() etc. in both libpq and pgport # --disable-auto-import is to ensure we get MSVC-like linking behavior LDFLAGS="$LDFLAGS -Wl,--allow-multiple-definition -Wl,--disable-auto-import" + +DLSUFFIX=".dll" diff --git a/src/test/regress/GNUmakefile b/src/test/regress/GNUmakefile index b40361c84c..88b82d9268 100644 --- a/src/test/regress/GNUmakefile +++ b/src/test/regress/GNUmakefile @@ -25,8 +25,7 @@ endif # stuff to pass into build of pg_regress EXTRADEFS = '-DHOST_TUPLE="$(host_tuple)"' \ - '-DSHELLPROG="$(SHELL)"' \ - '-DDLSUFFIX="$(DLSUFFIX)"' + '-DSHELLPROG="$(SHELL)"' ## ## Prepare for tests diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index a21ea9bef9..ef5476d034 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -216,6 +216,7 @@ sub GenerateFiles CONFIGURE_ARGS => '"' . $self->GetFakeConfigure() . '"', DEF_PGPORT => $port, DEF_PGPORT_STR => qq{"$port"}, + DLSUFFIX => '".dll"', ENABLE_GSS => $self->{options}->{gss} ? 1 : undef, ENABLE_NLS => $self->{options}->{nls} ? 1 : undef, ENABLE_THREAD_SAFETY => 1, From c64fb698d076b297b350f667719ba5d58551a7f9 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 25 Mar 2022 09:47:50 +0100 Subject: [PATCH 253/772] Make update-unicode target work in vpath builds Author: Andres Freund Discussion: https://www.postgresql.org/message-id/616c6873-83b5-85c0-93cb-548977c39c60@enterprisedb.com --- contrib/unaccent/Makefile | 4 ++-- src/common/unicode/Makefile | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contrib/unaccent/Makefile b/contrib/unaccent/Makefile index b8307d1601..d6c466e07a 100644 --- a/contrib/unaccent/Makefile +++ b/contrib/unaccent/Makefile @@ -27,12 +27,12 @@ include $(top_builddir)/src/Makefile.global include $(top_srcdir)/contrib/contrib-global.mk endif -update-unicode: unaccent.rules +update-unicode: $(srcdir)/unaccent.rules # Allow running this even without --with-python PYTHON ?= python -unaccent.rules: generate_unaccent_rules.py ../../src/common/unicode/UnicodeData.txt Latin-ASCII.xml +$(srcdir)/unaccent.rules: generate_unaccent_rules.py ../../src/common/unicode/UnicodeData.txt Latin-ASCII.xml $(PYTHON) $< --unicode-data-file $(word 2,$^) --latin-ascii-file $(word 3,$^) >$@ # Only download it once; dependencies must match src/common/unicode/ diff --git a/src/common/unicode/Makefile b/src/common/unicode/Makefile index a3683dd86b..60e01e748f 100644 --- a/src/common/unicode/Makefile +++ b/src/common/unicode/Makefile @@ -12,14 +12,14 @@ subdir = src/common/unicode top_builddir = ../../.. include $(top_builddir)/src/Makefile.global -override CPPFLAGS := -DFRONTEND $(CPPFLAGS) +override CPPFLAGS := -DFRONTEND -I. $(CPPFLAGS) LIBS += $(PTHREAD_LIBS) # By default, do nothing. all: update-unicode: unicode_norm_table.h unicode_combining_table.h unicode_east_asian_fw_table.h unicode_normprops_table.h unicode_norm_hashfunc.h - mv $^ ../../../src/include/common/ + mv $^ $(top_srcdir)/src/include/common/ $(MAKE) normalization-check # These files are part of the Unicode Character Database. Download @@ -33,7 +33,7 @@ UnicodeData.txt EastAsianWidth.txt DerivedNormalizationProps.txt CompositionExcl unicode_norm_hashfunc.h: unicode_norm_table.h unicode_norm_table.h: generate-unicode_norm_table.pl UnicodeData.txt CompositionExclusions.txt - $(PERL) generate-unicode_norm_table.pl + $(PERL) $< unicode_combining_table.h: generate-unicode_combining_table.pl UnicodeData.txt $(PERL) $^ >$@ @@ -58,7 +58,7 @@ submake-common: $(MAKE) -C .. all norm_test_table.h: generate-norm_test_table.pl NormalizationTest.txt - perl generate-norm_test_table.pl NormalizationTest.txt $@ + perl $^ $@ .PHONY: normalization-check From 49d9cfc68bf4e0d32a948fe72d5a0ef7f464944e Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Fri, 25 Mar 2022 13:16:21 +0100 Subject: [PATCH 254/772] Fix replay of create database records on standby MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Crash recovery on standby may encounter missing directories when replaying create database WAL records. Prior to this patch, the standby would fail to recover in such a case. However, the directories could be legitimately missing. Consider a sequence of WAL records as follows: CREATE DATABASE DROP DATABASE DROP TABLESPACE If, after replaying the last WAL record and removing the tablespace directory, the standby crashes and has to replay the create database record again, the crash recovery must be able to move on. This patch adds a mechanism similar to invalid-page tracking, to keep a tally of missing directories during crash recovery. If all the missing directory references are matched with corresponding drop records at the end of crash recovery, the standby can safely continue following the primary. Backpatch to 13, at least for now. The bug is older, but fixing it in older branches requires more careful study of the interactions with commit e6d8069522c8, which appeared in 13. A new TAP test file is added to verify the condition. However, because it depends on commit d6d317dbf615, it can only be added to branch master. I (Álvaro) manually verified that the code behaves as expected in branch 14. It's a bit nervous-making to leave the code uncovered by tests in older branches, but leaving the bug unfixed is even worse. Also, the main reason this fix took so long is precisely that we couldn't agree on a good strategy to approach testing for the bug, so perhaps this is the best we can do. Diagnosed-by: Paul Guo Author: Paul Guo Author: Kyotaro Horiguchi Author: Asim R Praveen Discussion: https://postgr.es/m/CAEET0ZGx9AvioViLf7nbR_8tH9-=27DN5xWJ2P9-ROH16e4JUA@mail.gmail.com --- src/backend/access/transam/xlogrecovery.c | 6 + src/backend/access/transam/xlogutils.c | 159 +++++++++++++++++++- src/backend/commands/dbcommands.c | 57 +++++++ src/backend/commands/tablespace.c | 17 +++ src/include/access/xlogutils.h | 4 + src/test/recovery/t/029_replay_tsp_drops.pl | 67 +++++++++ src/tools/pgindent/typedefs.list | 2 + 7 files changed, 311 insertions(+), 1 deletion(-) create mode 100644 src/test/recovery/t/029_replay_tsp_drops.pl diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 8d2395dae2..8b22c4e634 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -2047,6 +2047,12 @@ CheckRecoveryConsistency(void) */ XLogCheckInvalidPages(); + /* + * Check if the XLOG sequence contained any unresolved references to + * missing directories. + */ + XLogCheckMissingDirs(); + reachedConsistency = true; ereport(LOG, (errmsg("consistent recovery state reached at %X/%X", diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index 511f2f186f..8c1b8216be 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -54,6 +54,164 @@ bool InRecovery = false; /* Are we in Hot Standby mode? Only valid in startup process, see xlogutils.h */ HotStandbyState standbyState = STANDBY_DISABLED; + +/* + * If a create database WAL record is being replayed more than once during + * crash recovery on a standby, it is possible that either the tablespace + * directory or the template database directory is missing. This happens when + * the directories are removed by replay of subsequent drop records. Note + * that this problem happens only on standby and not on master. On master, a + * checkpoint is created at the end of create database operation. On standby, + * however, such a strategy (creating restart points during replay) is not + * viable because it will slow down WAL replay. + * + * The alternative is to track references to each missing directory + * encountered when performing crash recovery in the following hash table. + * Similar to invalid page table above, the expectation is that each missing + * directory entry should be matched with a drop database or drop tablespace + * WAL record by the end of crash recovery. + */ +typedef struct xl_missing_dir_key +{ + Oid spcNode; + Oid dbNode; +} xl_missing_dir_key; + +typedef struct xl_missing_dir +{ + xl_missing_dir_key key; + char path[MAXPGPATH]; +} xl_missing_dir; + +static HTAB *missing_dir_tab = NULL; + + +/* + * Keep track of a directory that wasn't found while replaying database + * creation records. These should match up with tablespace removal records + * later in the WAL stream; we verify that before reaching consistency. + */ +void +XLogRememberMissingDir(Oid spcNode, Oid dbNode, char *path) +{ + xl_missing_dir_key key; + bool found; + xl_missing_dir *entry; + + /* + * Database OID may be invalid but tablespace OID must be valid. If + * dbNode is InvalidOid, we are logging a missing tablespace directory, + * otherwise we are logging a missing database directory. + */ + Assert(OidIsValid(spcNode)); + + if (missing_dir_tab == NULL) + { + /* create hash table when first needed */ + HASHCTL ctl; + + memset(&ctl, 0, sizeof(ctl)); + ctl.keysize = sizeof(xl_missing_dir_key); + ctl.entrysize = sizeof(xl_missing_dir); + + missing_dir_tab = hash_create("XLOG missing directory table", + 100, + &ctl, + HASH_ELEM | HASH_BLOBS); + } + + key.spcNode = spcNode; + key.dbNode = dbNode; + + entry = hash_search(missing_dir_tab, &key, HASH_ENTER, &found); + + if (found) + { + if (dbNode == InvalidOid) + elog(DEBUG1, "missing directory %s (tablespace %u) already exists: %s", + path, spcNode, entry->path); + else + elog(DEBUG1, "missing directory %s (tablespace %u database %u) already exists: %s", + path, spcNode, dbNode, entry->path); + } + else + { + strlcpy(entry->path, path, sizeof(entry->path)); + if (dbNode == InvalidOid) + elog(DEBUG1, "logged missing dir %s (tablespace %u)", + path, spcNode); + else + elog(DEBUG1, "logged missing dir %s (tablespace %u database %u)", + path, spcNode, dbNode); + } +} + +/* + * Remove an entry from the list of directories not found. This is to be done + * when the matching tablespace removal WAL record is found. + */ +void +XLogForgetMissingDir(Oid spcNode, Oid dbNode) +{ + xl_missing_dir_key key; + + key.spcNode = spcNode; + key.dbNode = dbNode; + + /* Database OID may be invalid but tablespace OID must be valid. */ + Assert(OidIsValid(spcNode)); + + if (missing_dir_tab == NULL) + return; + + if (hash_search(missing_dir_tab, &key, HASH_REMOVE, NULL) != NULL) + { + if (dbNode == InvalidOid) + { + elog(DEBUG2, "forgot missing dir (tablespace %u)", spcNode); + } + else + { + char *path = GetDatabasePath(dbNode, spcNode); + + elog(DEBUG2, "forgot missing dir %s (tablespace %u database %u)", + path, spcNode, dbNode); + pfree(path); + } + } +} + +/* + * This is called at the end of crash recovery, before entering archive + * recovery on a standby. PANIC if the hash table is not empty. + */ +void +XLogCheckMissingDirs(void) +{ + HASH_SEQ_STATUS status; + xl_missing_dir *hentry; + bool foundone = false; + + if (missing_dir_tab == NULL) + return; /* nothing to do */ + + hash_seq_init(&status, missing_dir_tab); + + while ((hentry = (xl_missing_dir *) hash_seq_search(&status)) != NULL) + { + elog(WARNING, "missing directory \"%s\" tablespace %u database %u", + hentry->path, hentry->key.spcNode, hentry->key.dbNode); + foundone = true; + } + + if (foundone) + elog(PANIC, "WAL contains references to missing directories"); + + hash_destroy(missing_dir_tab); + missing_dir_tab = NULL; +} + + /* * During XLOG replay, we may see XLOG records for incremental updates of * pages that no longer exist, because their relation was later dropped or @@ -79,7 +237,6 @@ typedef struct xl_invalid_page static HTAB *invalid_page_tab = NULL; - /* Report a reference to an invalid page */ static void report_invalid_page(int elevel, RelFileNode node, ForkNumber forkno, diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 623e5ec778..95771b06a2 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -30,6 +30,7 @@ #include "access/tableam.h" #include "access/xact.h" #include "access/xloginsert.h" +#include "access/xlogrecovery.h" #include "access/xlogutils.h" #include "catalog/catalog.h" #include "catalog/dependency.h" @@ -2483,7 +2484,9 @@ dbase_redo(XLogReaderState *record) xl_dbase_create_rec *xlrec = (xl_dbase_create_rec *) XLogRecGetData(record); char *src_path; char *dst_path; + char *parent_path; struct stat st; + bool skip = false; src_path = GetDatabasePath(xlrec->src_db_id, xlrec->src_tablespace_id); dst_path = GetDatabasePath(xlrec->db_id, xlrec->tablespace_id); @@ -2501,6 +2504,56 @@ dbase_redo(XLogReaderState *record) (errmsg("some useless files may be left behind in old database directory \"%s\"", dst_path))); } + else if (!reachedConsistency) + { + /* + * It is possible that a drop tablespace record appearing later in + * WAL has already been replayed -- in other words, that we are + * replaying the database creation record a second time with no + * intervening checkpoint. In that case, the tablespace directory + * has already been removed and the create database operation + * cannot be replayed. Skip the replay itself, but remember the + * fact that the tablespace directory is missing, to be matched + * with the expected tablespace drop record later. + */ + parent_path = pstrdup(dst_path); + get_parent_directory(parent_path); + if (!(stat(parent_path, &st) == 0 && S_ISDIR(st.st_mode))) + { + XLogRememberMissingDir(xlrec->tablespace_id, InvalidOid, parent_path); + skip = true; + ereport(WARNING, + (errmsg("skipping replay of database creation WAL record"), + errdetail("The target tablespace \"%s\" directory was not found.", + parent_path), + errhint("A future WAL record that removes the directory before reaching consistent mode is expected."))); + } + pfree(parent_path); + } + + /* + * If the source directory is missing, skip the copy and make a note of + * it for later. + * + * One possible reason for this is that the template database used for + * creating this database may have been dropped, as noted above. + * Moving a database from one tablespace may also be a partner in the + * crime. + */ + if (!(stat(src_path, &st) == 0 && S_ISDIR(st.st_mode)) && + !reachedConsistency) + { + XLogRememberMissingDir(xlrec->src_tablespace_id, xlrec->src_db_id, src_path); + skip = true; + ereport(WARNING, + (errmsg("skipping replay of database creation WAL record"), + errdetail("The source database directory \"%s\" was not found.", + src_path), + errhint("A future WAL record that removes the directory before reaching consistent mode is expected."))); + } + + if (skip) + return; /* * Force dirty buffers out to disk, to ensure source database is @@ -2563,6 +2616,10 @@ dbase_redo(XLogReaderState *record) ereport(WARNING, (errmsg("some useless files may be left behind in old database directory \"%s\"", dst_path))); + + if (!reachedConsistency) + XLogForgetMissingDir(xlrec->tablespace_ids[i], xlrec->db_id); + pfree(dst_path); } diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c index 40514ab550..55f40831da 100644 --- a/src/backend/commands/tablespace.c +++ b/src/backend/commands/tablespace.c @@ -57,6 +57,7 @@ #include "access/tableam.h" #include "access/xact.h" #include "access/xloginsert.h" +#include "access/xlogrecovery.h" #include "access/xlogutils.h" #include "catalog/catalog.h" #include "catalog/dependency.h" @@ -1574,6 +1575,22 @@ tblspc_redo(XLogReaderState *record) { xl_tblspc_drop_rec *xlrec = (xl_tblspc_drop_rec *) XLogRecGetData(record); + if (!reachedConsistency) + XLogForgetMissingDir(xlrec->ts_id, InvalidOid); + + /* + * Before we remove the tablespace directory, update minimum recovery + * point to cover this WAL record. Once the tablespace is removed, + * there's no going back. This manually enforces the WAL-first rule. + * Doing this before the removal means that if the removal fails for + * some reason, the directory is left alone and needs to be manually + * removed. Alternatively we could update the minimum recovery point + * after removal, but that would leave a small window where the + * WAL-first rule could be violated. + */ + if (!reachedConsistency) + XLogFlush(record->EndRecPtr); + /* * If we issued a WAL record for a drop tablespace it implies that * there were no files in it at all when the DROP was done. That means diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 64708949db..8d48f003b0 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -65,6 +65,10 @@ extern void XLogDropDatabase(Oid dbid); extern void XLogTruncateRelation(RelFileNode rnode, ForkNumber forkNum, BlockNumber nblocks); +extern void XLogRememberMissingDir(Oid spcNode, Oid dbNode, char *path); +extern void XLogForgetMissingDir(Oid spcNode, Oid dbNode); +extern void XLogCheckMissingDirs(void); + /* Result codes for XLogReadBufferForRedo[Extended] */ typedef enum { diff --git a/src/test/recovery/t/029_replay_tsp_drops.pl b/src/test/recovery/t/029_replay_tsp_drops.pl new file mode 100644 index 0000000000..90a72be489 --- /dev/null +++ b/src/test/recovery/t/029_replay_tsp_drops.pl @@ -0,0 +1,67 @@ +# Copyright (c) 2022, PostgreSQL Global Development Group + +# Test recovery involving tablespace removal. If recovery stops +# after once tablespace is removed, the next recovery should properly +# ignore the operations within the removed tablespaces. + +use strict; +use warnings; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $node_primary = PostgreSQL::Test::Cluster->new('primary1'); +$node_primary->init(allows_streaming => 1); +$node_primary->start; +$node_primary->psql('postgres', +qq[ + SET allow_in_place_tablespaces=on; + CREATE TABLESPACE dropme_ts1 LOCATION ''; + CREATE TABLESPACE dropme_ts2 LOCATION ''; + CREATE TABLESPACE source_ts LOCATION ''; + CREATE TABLESPACE target_ts LOCATION ''; + CREATE DATABASE template_db IS_TEMPLATE = true; +]); +my $backup_name = 'my_backup'; +$node_primary->backup($backup_name); + +my $node_standby = PostgreSQL::Test::Cluster->new('standby1'); +$node_standby->init_from_backup($node_primary, $backup_name, has_streaming => 1); +$node_standby->start; + +# Make sure connection is made +$node_primary->poll_query_until( + 'postgres', 'SELECT count(*) = 1 FROM pg_stat_replication'); + +$node_standby->safe_psql('postgres', 'CHECKPOINT'); + +# Do immediate shutdown just after a sequence of CREATE DATABASE / DROP +# DATABASE / DROP TABLESPACE. This causes CREATE DATABASE WAL records +# to be applied to already-removed directories. +$node_primary->safe_psql('postgres', + q[CREATE DATABASE dropme_db1 WITH TABLESPACE dropme_ts1; + CREATE DATABASE dropme_db2 WITH TABLESPACE dropme_ts2; + CREATE DATABASE moveme_db TABLESPACE source_ts; + ALTER DATABASE moveme_db SET TABLESPACE target_ts; + CREATE DATABASE newdb TEMPLATE template_db; + ALTER DATABASE template_db IS_TEMPLATE = false; + DROP DATABASE dropme_db1; + DROP DATABASE dropme_db2; DROP TABLESPACE dropme_ts2; + DROP TABLESPACE source_ts; + DROP DATABASE template_db;]); + +$node_primary->wait_for_catchup($node_standby, 'replay', + $node_primary->lsn('replay')); +$node_standby->stop('immediate'); + +# Should restart ignoring directory creation error. +is($node_standby->start, 1, "standby started successfully"); + +my $log = PostgreSQL::Test::Utils::slurp_file($node_standby->logfile); +like( + $log, + qr[WARNING: skipping replay of database creation WAL record], + "warning message is logged"); + +done_testing(); diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 49688036a7..85c808af90 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -3736,6 +3736,8 @@ xl_invalid_page xl_invalid_page_key xl_invalidations xl_logical_message +xl_missing_dir_key +xl_missing_dir xl_multi_insert_tuple xl_multixact_create xl_multixact_truncate From 2d2232933b02d9396113662e44dca5f120d6830e Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Fri, 25 Mar 2022 13:24:14 +0100 Subject: [PATCH 255/772] Update tab-completion for CREATE PUBLICATION with sequences Commit 75b1521dae added support for sequences to built-in replication, but the tab-completion was updated only for ALTER PUBLICATION, not for CREATE PUBLICATION. Report and patch by Masahiko Sawada. Author: Masahiko Sawada Discussion: https://postgr.es/m/CAD21AoDtKpdJcHOLjfPQ7TmpFqNB5__%3DQ_g1e8OBRrwT5LP-%3Dg%40mail.gmail.com --- src/bin/psql/tab-complete.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index e59bd8302d..63bfdf11c6 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -2971,21 +2971,27 @@ psql_completion(const char *text, int start, int end) /* CREATE PUBLICATION */ else if (Matches("CREATE", "PUBLICATION", MatchAny)) - COMPLETE_WITH("FOR TABLE", "FOR ALL TABLES", "FOR ALL TABLES IN SCHEMA", "WITH ("); + COMPLETE_WITH("FOR TABLE", "FOR ALL TABLES", "FOR ALL TABLES IN SCHEMA", + "FOR SEQUENCE", "FOR ALL SEQUENCES", "FOR ALL SEQUENCES IN SCHEMA", + "WITH ("); else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR")) - COMPLETE_WITH("TABLE", "ALL TABLES", "ALL TABLES IN SCHEMA"); + COMPLETE_WITH("TABLE", "ALL TABLES", "ALL TABLES IN SCHEMA", + "SEQUENCE", "ALL SEQUENCES", "ALL SEQUENCES IN SCHEMA"); else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL")) - COMPLETE_WITH("TABLES", "TABLES IN SCHEMA"); - else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES")) + COMPLETE_WITH("TABLES", "TABLES IN SCHEMA", "SEQUENCES", "SEQUENCES IN SCHEMA"); + else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES|SEQUENCES")) COMPLETE_WITH("IN SCHEMA", "WITH ("); - else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE", MatchAny) && !ends_with(prev_wd, ',')) + else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE|SEQUENCE", MatchAny) && !ends_with(prev_wd, ',')) COMPLETE_WITH("WHERE (", "WITH ("); /* Complete "CREATE PUBLICATION FOR TABLE" with ", ..." */ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); + /* Complete "CREATE PUBLICATION FOR SEQUENCE" with ", ..." */ + else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "SEQUENCE")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences); /* - * "CREATE PUBLICATION FOR TABLE WHERE (" - complete with + * "CREATE PUBLICATION FOR TABLE|SEQUENCE WHERE (" - complete with * table attributes */ else if (HeadMatches("CREATE", "PUBLICATION", MatchAny) && TailMatches("WHERE")) @@ -2996,14 +3002,14 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH(" WITH ("); /* - * Complete "CREATE PUBLICATION FOR ALL TABLES IN SCHEMA , + * Complete "CREATE PUBLICATION FOR ALL TABLES|SEQUENCES IN SCHEMA , * ..." */ - else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES", "IN", "SCHEMA")) + else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES|SEQUENCES", "IN", "SCHEMA")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas " AND nspname NOT LIKE E'pg\\\\_%%'", "CURRENT_SCHEMA"); - else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES", "IN", "SCHEMA", MatchAny) && (!ends_with(prev_wd, ','))) + else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES|SEQUENCES", "IN", "SCHEMA", MatchAny) && (!ends_with(prev_wd, ','))) COMPLETE_WITH("WITH ("); /* Complete "CREATE PUBLICATION [...] WITH" */ else if (HeadMatches("CREATE", "PUBLICATION") && TailMatches("WITH", "(")) From 002c9dd97a0c874fd1693a570383e2dd38cd40d5 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Fri, 25 Mar 2022 14:29:56 +0100 Subject: [PATCH 256/772] Handle sequences in preprocess_pubobj_list Commit 75b1521dae added support for logical replication of sequences, including grammar changes, but it did not update preprocess_pubobj_list accordingly. This can cause segfaults with "continuations", i.e. when command specifies a list of objects: CREATE PUBLICATION p FOR SEQUENCE s1, s2; Reported by Amit Kapila, patch by me. Reported-by: Amit Kapila Discussion: https://postgr.es/m/CAA4eK1JxDNKGBSNTyN-Xj2JRjzFo+ziSqJbjH==vuO0YF_CQrg@mail.gmail.com --- src/backend/parser/gram.y | 27 ++++++++++++++++++++++- src/test/regress/expected/publication.out | 18 +++++++++++++++ src/test/regress/sql/publication.sql | 16 ++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index e327bc735f..f8301541c9 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -17493,7 +17493,8 @@ preprocess_pubobj_list(List *pubobjspec_list, core_yyscan_t yyscanner) if (pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION) pubobj->pubobjtype = prevobjtype; - if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLE) + if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLE || + pubobj->pubobjtype == PUBLICATIONOBJ_SEQUENCE) { /* relation name or pubtable must be set for this type of object */ if (!pubobj->name && !pubobj->pubtable) @@ -17537,6 +17538,30 @@ preprocess_pubobj_list(List *pubobjspec_list, core_yyscan_t yyscanner) errmsg("invalid schema name at or near"), parser_errposition(pubobj->location)); } + else if (pubobj->pubobjtype == PUBLICATIONOBJ_SEQUENCES_IN_SCHEMA || + pubobj->pubobjtype == PUBLICATIONOBJ_SEQUENCES_IN_CUR_SCHEMA) + { + /* WHERE clause is not allowed on a schema object */ + if (pubobj->pubtable && pubobj->pubtable->whereClause) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("WHERE clause not allowed for schema"), + parser_errposition(pubobj->location)); + + /* + * We can distinguish between the different type of schema + * objects based on whether name and pubtable is set. + */ + if (pubobj->name) + pubobj->pubobjtype = PUBLICATIONOBJ_SEQUENCES_IN_SCHEMA; + else if (!pubobj->name && !pubobj->pubtable) + pubobj->pubobjtype = PUBLICATIONOBJ_SEQUENCES_IN_CUR_SCHEMA; + else + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid schema name at or near"), + parser_errposition(pubobj->location)); + } prevobjtype = pubobj->pubobjtype; } diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index 92f6122d40..a5a519d6c8 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -319,6 +319,24 @@ Publications: DROP SEQUENCE testpub_seq0, pub_test.testpub_seq1, testpub_seq2; DROP PUBLICATION testpub_forallsequences, testpub_forsequence, testpub_forschema; +-- publication testing multiple sequences at the same time +CREATE SEQUENCE testpub_seq1; +CREATE SEQUENCE testpub_seq2; +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_multi FOR SEQUENCE testpub_seq1, testpub_seq2; +RESET client_min_messages; +\dRp+ testpub_multi + Publication testpub_multi + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Sequences: + "public.testpub_seq1" + "public.testpub_seq2" + +DROP PUBLICATION testpub_multi; +DROP SEQUENCE testpub_seq1; +DROP SEQUENCE testpub_seq2; -- Publication mixing tables and sequences SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_mix; diff --git a/src/test/regress/sql/publication.sql b/src/test/regress/sql/publication.sql index c195e75c6f..151b8be14e 100644 --- a/src/test/regress/sql/publication.sql +++ b/src/test/regress/sql/publication.sql @@ -167,6 +167,22 @@ SELECT pubname, puballtables, puballsequences FROM pg_publication WHERE pubname DROP SEQUENCE testpub_seq0, pub_test.testpub_seq1, testpub_seq2; DROP PUBLICATION testpub_forallsequences, testpub_forsequence, testpub_forschema; + +-- publication testing multiple sequences at the same time +CREATE SEQUENCE testpub_seq1; +CREATE SEQUENCE testpub_seq2; + +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_multi FOR SEQUENCE testpub_seq1, testpub_seq2; +RESET client_min_messages; + +\dRp+ testpub_multi + +DROP PUBLICATION testpub_multi; +DROP SEQUENCE testpub_seq1; +DROP SEQUENCE testpub_seq2; + + -- Publication mixing tables and sequences SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_mix; From 174877f1e344812f620fd8891af97104d5dfca13 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 25 Mar 2022 14:23:26 -0400 Subject: [PATCH 257/772] Harden TAP tests that intentionally corrupt page checksums. The previous method for doing that was to write zeroes into a predetermined set of page locations. However, there's a roughly 1-in-64K chance that the existing checksum will match by chance, and yesterday several buildfarm animals started to reproducibly see that, resulting in test failures because no checksum mismatch was reported. Since the checksum includes the page LSN, test success depends on the length of the installation's WAL history, which is affected by (at least) the initial catalog contents, the set of locales installed on the system, and the length of the pathname of the test directory. Sooner or later we were going to hit a chance match, and today is that day. Harden these tests by specifically inverting the checksum field and leaving all else alone, thereby guaranteeing that the checksum is incorrect. In passing, fix places that were using seek() to set up for syswrite(), a combination that the Perl docs very explicitly warn against. We've probably escaped problems because no regular buffered I/O is done on these filehandles; but if it ever breaks, we wouldn't deserve or get much sympathy. Although we've only seen problems in HEAD, now that we recognize the environmental dependencies it seems like it might be just a matter of time until someone manages to hit this in back-branch testing. Hence, back-patch to v11 where we started doing this kind of test. Discussion: https://postgr.es/m/3192026.1648185780@sss.pgh.pa.us --- contrib/amcheck/t/001_verify_heapam.pl | 5 ++- src/bin/pg_amcheck/t/003_check.pl | 5 ++- src/bin/pg_amcheck/t/004_verify_heapam.pl | 9 +++--- src/bin/pg_basebackup/t/010_pg_basebackup.pl | 34 +++++++------------- src/bin/pg_checksums/t/002_actions.pl | 10 ++---- src/test/perl/PostgreSQL/Test/Cluster.pm | 31 ++++++++++++++++++ 6 files changed, 52 insertions(+), 42 deletions(-) diff --git a/contrib/amcheck/t/001_verify_heapam.pl b/contrib/amcheck/t/001_verify_heapam.pl index bb0997cd5d..019eed33a0 100644 --- a/contrib/amcheck/t/001_verify_heapam.pl +++ b/contrib/amcheck/t/001_verify_heapam.pl @@ -7,7 +7,6 @@ use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; -use Fcntl qw(:seek); use Test::More; my ($node, $result); @@ -193,8 +192,8 @@ sub corrupt_first_page # Corrupt some line pointers. The values are chosen to hit the # various line-pointer-corruption checks in verify_heapam.c # on both little-endian and big-endian architectures. - seek($fh, 32, SEEK_SET) - or BAIL_OUT("seek failed: $!"); + sysseek($fh, 32, 0) + or BAIL_OUT("sysseek failed: $!"); syswrite( $fh, pack("L*", diff --git a/src/bin/pg_amcheck/t/003_check.pl b/src/bin/pg_amcheck/t/003_check.pl index d984eacb24..0cf67065d6 100644 --- a/src/bin/pg_amcheck/t/003_check.pl +++ b/src/bin/pg_amcheck/t/003_check.pl @@ -7,7 +7,6 @@ use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; -use Fcntl qw(:seek); use Test::More; my ($node, $port, %corrupt_page, %remove_relation); @@ -90,8 +89,8 @@ sub corrupt_first_page # Corrupt some line pointers. The values are chosen to hit the # various line-pointer-corruption checks in verify_heapam.c # on both little-endian and big-endian architectures. - seek($fh, 32, SEEK_SET) - or BAIL_OUT("seek failed: $!"); + sysseek($fh, 32, 0) + or BAIL_OUT("sysseek failed: $!"); syswrite( $fh, pack("L*", diff --git a/src/bin/pg_amcheck/t/004_verify_heapam.pl b/src/bin/pg_amcheck/t/004_verify_heapam.pl index 94d691a614..bbada168f0 100644 --- a/src/bin/pg_amcheck/t/004_verify_heapam.pl +++ b/src/bin/pg_amcheck/t/004_verify_heapam.pl @@ -7,7 +7,6 @@ use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; -use Fcntl qw(:seek); use Test::More; # This regression test demonstrates that the pg_amcheck binary correctly @@ -99,8 +98,8 @@ sub read_tuple { my ($fh, $offset) = @_; my ($buffer, %tup); - seek($fh, $offset, SEEK_SET) - or BAIL_OUT("seek failed: $!"); + sysseek($fh, $offset, 0) + or BAIL_OUT("sysseek failed: $!"); defined(sysread($fh, $buffer, HEAPTUPLE_PACK_LENGTH)) or BAIL_OUT("sysread failed: $!"); @@ -165,8 +164,8 @@ sub write_tuple $tup->{c_va_header}, $tup->{c_va_vartag}, $tup->{c_va_rawsize}, $tup->{c_va_extinfo}, $tup->{c_va_valueid}, $tup->{c_va_toastrelid}); - seek($fh, $offset, SEEK_SET) - or BAIL_OUT("seek failed: $!"); + sysseek($fh, $offset, 0) + or BAIL_OUT("sysseek failed: $!"); defined(syswrite($fh, $buffer, HEAPTUPLE_PACK_LENGTH)) or BAIL_OUT("syswrite failed: $!"); return; diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 9aa35a16a4..47f3d00ac4 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -5,7 +5,6 @@ use warnings; use File::Basename qw(basename dirname); use File::Path qw(rmtree); -use Fcntl qw(:seek); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -56,7 +55,7 @@ } $node->set_replication_conf(); -system_or_bail 'pg_ctl', '-D', $pgdata, 'reload'; +$node->reload; $node->command_fails( [ @pg_basebackup_defs, '-D', "$tempdir/backup" ], @@ -706,17 +705,13 @@ q{CREATE TABLE corrupt2 AS SELECT b FROM generate_series(1,2) AS b; ALTER TABLE corrupt2 SET (autovacuum_enabled=false); SELECT pg_relation_filepath('corrupt2')} ); -# set page header and block sizes -my $pageheader_size = 24; +# get block size for corruption steps my $block_size = $node->safe_psql('postgres', 'SHOW block_size;'); # induce corruption -system_or_bail 'pg_ctl', '-D', $pgdata, 'stop'; -open $file, '+<', "$pgdata/$file_corrupt1"; -seek($file, $pageheader_size, SEEK_SET); -syswrite($file, "\0\0\0\0\0\0\0\0\0"); -close $file; -system_or_bail 'pg_ctl', '-D', $pgdata, 'start'; +$node->stop; +$node->corrupt_page_checksum($file_corrupt1, 0); +$node->start; $node->command_checks_all( [ @pg_basebackup_defs, '-D', "$tempdir/backup_corrupt" ], @@ -727,16 +722,12 @@ rmtree("$tempdir/backup_corrupt"); # induce further corruption in 5 more blocks -system_or_bail 'pg_ctl', '-D', $pgdata, 'stop'; -open $file, '+<', "$pgdata/$file_corrupt1"; +$node->stop; for my $i (1 .. 5) { - my $offset = $pageheader_size + $i * $block_size; - seek($file, $offset, SEEK_SET); - syswrite($file, "\0\0\0\0\0\0\0\0\0"); + $node->corrupt_page_checksum($file_corrupt1, $i * $block_size); } -close $file; -system_or_bail 'pg_ctl', '-D', $pgdata, 'start'; +$node->start; $node->command_checks_all( [ @pg_basebackup_defs, '-D', "$tempdir/backup_corrupt2" ], @@ -747,12 +738,9 @@ rmtree("$tempdir/backup_corrupt2"); # induce corruption in a second file -system_or_bail 'pg_ctl', '-D', $pgdata, 'stop'; -open $file, '+<', "$pgdata/$file_corrupt2"; -seek($file, $pageheader_size, SEEK_SET); -syswrite($file, "\0\0\0\0\0\0\0\0\0"); -close $file; -system_or_bail 'pg_ctl', '-D', $pgdata, 'start'; +$node->stop; +$node->corrupt_page_checksum($file_corrupt2, 0); +$node->start; $node->command_checks_all( [ @pg_basebackup_defs, '-D', "$tempdir/backup_corrupt3" ], diff --git a/src/bin/pg_checksums/t/002_actions.pl b/src/bin/pg_checksums/t/002_actions.pl index 62c608eaf6..0309cbbaa3 100644 --- a/src/bin/pg_checksums/t/002_actions.pl +++ b/src/bin/pg_checksums/t/002_actions.pl @@ -9,7 +9,6 @@ use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; -use Fcntl qw(:seek); use Test::More; @@ -24,6 +23,7 @@ sub check_relation_corruption my $tablespace = shift; my $pgdata = $node->data_dir; + # Create table and discover its filesystem location. $node->safe_psql( 'postgres', "CREATE TABLE $table AS SELECT a FROM generate_series(1,10000) AS a; @@ -37,9 +37,6 @@ sub check_relation_corruption my $relfilenode_corrupted = $node->safe_psql('postgres', "SELECT relfilenode FROM pg_class WHERE relname = '$table';"); - # Set page header and block size - my $pageheader_size = 24; - my $block_size = $node->safe_psql('postgres', 'SHOW block_size;'); $node->stop; # Checksums are correct for single relfilenode as the table is not @@ -54,10 +51,7 @@ sub check_relation_corruption ); # Time to create some corruption - open my $file, '+<', "$pgdata/$file_corrupted"; - seek($file, $pageheader_size, SEEK_SET); - syswrite($file, "\0\0\0\0\0\0\0\0\0"); - close $file; + $node->corrupt_page_checksum($file_corrupted, 0); # Checksum checks on single relfilenode fail $node->command_checks_all( diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index 0295731bd0..bee6aacf47 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -2856,6 +2856,37 @@ sub pg_recvlogical_upto =pod +=item $node->corrupt_page_checksum(self, file, page_offset) + +Intentionally corrupt the checksum field of one page in a file. +The server must be stopped for this to work reliably. + +The file name should be specified relative to the cluster datadir. +page_offset had better be a multiple of the cluster's block size. + +=cut + +sub corrupt_page_checksum +{ + my ($self, $file, $page_offset) = @_; + my $pgdata = $self->data_dir; + my $pageheader; + + open my $fh, '+<', "$pgdata/$file" or die "open($file) failed: $!"; + binmode $fh; + sysseek($fh, $page_offset, 0) or die "sysseek failed: $!"; + sysread($fh, $pageheader, 24) or die "sysread failed: $!"; + # This inverts the pd_checksum field (only); see struct PageHeaderData + $pageheader ^= "\0\0\0\0\0\0\0\0\xff\xff"; + sysseek($fh, $page_offset, 0) or die "sysseek failed: $!"; + syswrite($fh, $pageheader) or die "syswrite failed: $!"; + close $fh; + + return; +} + +=pod + =back =cut From 05843b1aa49df2ecc9b97c693b755bd1b6f856a9 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Fri, 25 Mar 2022 20:12:50 +0100 Subject: [PATCH 258/772] Minor improvements in sequence decoding code and docs A couple minor comment improvements and code cleanups, based on post-commit feedback to the sequence decoding patch. Author: Amit Kapila, vignesh C Discussion: https://postgr.es/m/aeb2ba8d-e6f4-5486-cc4c-0d4982c291cb@enterprisedb.com --- doc/src/sgml/protocol.sgml | 2 +- src/backend/catalog/pg_publication.c | 2 +- src/backend/commands/publicationcmds.c | 23 +++++++++------------ src/backend/replication/pgoutput/pgoutput.c | 4 ++-- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index c61c310e17..8bb34a7c5b 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -7141,7 +7141,7 @@ Sequence - 1 if the sequence update is transactions, 0 otherwise. + 1 if the sequence update is transactional, 0 otherwise. diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5bcfc94e2b..514a94796e 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -193,7 +193,7 @@ AssertObjectTypeValid(char objectType) } /* - * Determine object type given the object type set for a schema. + * Determine object type matching a given a relkind value. */ char pub_get_object_type_for_relkind(char relkind) diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index c6437799c5..e449e8e8f2 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -175,8 +175,7 @@ parse_publication_options(ParseState *pstate, static void ObjectsInPublicationToOids(List *pubobjspec_list, ParseState *pstate, List **tables, List **sequences, - List **tables_schemas, List **sequences_schemas, - List **schemas) + List **tables_schemas, List **sequences_schemas) { ListCell *cell; PublicationObjSpec *pubobj; @@ -204,14 +203,12 @@ ObjectsInPublicationToOids(List *pubobjspec_list, ParseState *pstate, /* Filter out duplicates if user specifies "sch1, sch1" */ *tables_schemas = list_append_unique_oid(*tables_schemas, schemaid); - *schemas = list_append_unique_oid(*schemas, schemaid); break; case PUBLICATIONOBJ_SEQUENCES_IN_SCHEMA: schemaid = get_namespace_oid(pubobj->name, false); /* Filter out duplicates if user specifies "sch1, sch1" */ *sequences_schemas = list_append_unique_oid(*sequences_schemas, schemaid); - *schemas = list_append_unique_oid(*schemas, schemaid); break; case PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA: search_path = fetch_search_path(false); @@ -225,7 +222,6 @@ ObjectsInPublicationToOids(List *pubobjspec_list, ParseState *pstate, /* Filter out duplicates if user specifies "sch1, sch1" */ *tables_schemas = list_append_unique_oid(*tables_schemas, schemaid); - *schemas = list_append_unique_oid(*schemas, schemaid); break; case PUBLICATIONOBJ_SEQUENCES_IN_CUR_SCHEMA: search_path = fetch_search_path(false); @@ -239,7 +235,6 @@ ObjectsInPublicationToOids(List *pubobjspec_list, ParseState *pstate, /* Filter out duplicates if user specifies "sch1, sch1" */ *sequences_schemas = list_append_unique_oid(*sequences_schemas, schemaid); - *schemas = list_append_unique_oid(*schemas, schemaid); break; default: /* shouldn't happen */ @@ -679,7 +674,6 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) List *sequences = NIL; List *tables_schemaidlist = NIL; List *sequences_schemaidlist = NIL; - List *schemaidlist = NIL; bool for_all_tables = false; bool for_all_sequences = false; @@ -706,6 +700,12 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to create FOR ALL TABLES publication"))); + /* FOR ALL SEQUENCES requires superuser */ + if (for_all_sequences && !superuser()) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser to create FOR ALL SEQUENCES publication"))); + rel = table_open(PublicationRelationId, RowExclusiveLock); /* Check if name is used */ @@ -782,8 +782,7 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) ObjectsInPublicationToOids(stmt->pubobjects, pstate, &tables, &sequences, &tables_schemaidlist, - &sequences_schemaidlist, - &schemaidlist); + &sequences_schemaidlist); /* FOR ALL TABLES IN SCHEMA requires superuser */ if (list_length(tables_schemaidlist) > 0 && !superuser()) @@ -1321,7 +1320,7 @@ CheckAlterPublication(AlterPublicationStmt *stmt, HeapTuple tup, NameStr(pubform->pubname)), errdetail("Tables cannot be added to or dropped from FOR ALL TABLES publications."))); - /* Check that user is allowed to manipulate the publication tables. */ + /* Check that user is allowed to manipulate the publication sequences. */ if (sequences && pubform->puballsequences) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), @@ -1462,14 +1461,12 @@ AlterPublication(ParseState *pstate, AlterPublicationStmt *stmt) List *sequences = NIL; List *tables_schemaidlist = NIL; List *sequences_schemaidlist = NIL; - List *schemaidlist = NIL; Oid pubid = pubform->oid; ObjectsInPublicationToOids(stmt->pubobjects, pstate, &tables, &sequences, &tables_schemaidlist, - &sequences_schemaidlist, - &schemaidlist); + &sequences_schemaidlist); CheckAlterPublication(stmt, tup, tables, tables_schemaidlist, diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 4cdc698cbb..292e7299d8 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -1804,7 +1804,8 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) { Oid schemaId = get_rel_namespace(relid); List *pubids = GetRelationPublications(relid); - char objectType = pub_get_object_type_for_relkind(get_rel_relkind(relid)); + char relkind = get_rel_relkind(relid); + char objectType = pub_get_object_type_for_relkind(relkind); /* * We don't acquire a lock on the namespace system table as we build * the cache entry using a historic snapshot and all the later changes @@ -1815,7 +1816,6 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) Oid publish_as_relid = relid; int publish_ancestor_level = 0; bool am_partition = get_rel_relispartition(relid); - char relkind = get_rel_relkind(relid); List *rel_publications = NIL; /* Reload publications if needed before use. */ From 923def9a533a7d986acfb524139d8b9e5466d0a5 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Sat, 26 Mar 2022 00:45:21 +0100 Subject: [PATCH 259/772] Allow specifying column lists for logical replication This allows specifying an optional column list when adding a table to logical replication. The column list may be specified after the table name, enclosed in parentheses. Columns not included in this list are not sent to the subscriber, allowing the schema on the subscriber to be a subset of the publisher schema. For UPDATE/DELETE publications, the column list needs to cover all REPLICA IDENTITY columns. For INSERT publications, the column list is arbitrary and may omit some REPLICA IDENTITY columns. Furthermore, if the table uses REPLICA IDENTITY FULL, column list is not allowed. The column list can contain only simple column references. Complex expressions, function calls etc. are not allowed. This restriction could be relaxed in the future. During the initial table synchronization, only columns included in the column list are copied to the subscriber. If the subscription has several publications, containing the same table with different column lists, columns specified in any of the lists will be copied. This means all columns are replicated if the table has no column list at all (which is treated as column list with all columns), or when of the publications is defined as FOR ALL TABLES (possibly IN SCHEMA that matches the schema of the table). For partitioned tables, publish_via_partition_root determines whether the column list for the root or the leaf relation will be used. If the parameter is 'false' (the default), the list defined for the leaf relation is used. Otherwise, the column list for the root partition will be used. Psql commands \dRp+ and \d now display any column lists. Author: Tomas Vondra, Alvaro Herrera, Rahila Syed Reviewed-by: Peter Eisentraut, Alvaro Herrera, Vignesh C, Ibrar Ahmed, Amit Kapila, Hou zj, Peter Smith, Wang wei, Tang, Shi yu Discussion: https://postgr.es/m/CAH2L28vddB_NFdRVpuyRBJEBWjz4BSyTB=_ektNRH8NJ1jf95g@mail.gmail.com --- doc/src/sgml/catalogs.sgml | 15 +- doc/src/sgml/protocol.sgml | 3 +- doc/src/sgml/ref/alter_publication.sgml | 18 +- doc/src/sgml/ref/create_publication.sgml | 17 +- src/backend/catalog/pg_publication.c | 145 +++ src/backend/commands/publicationcmds.c | 265 ++++- src/backend/executor/execReplication.c | 19 +- src/backend/nodes/copyfuncs.c | 1 + src/backend/nodes/equalfuncs.c | 1 + src/backend/parser/gram.y | 33 +- src/backend/replication/logical/proto.c | 61 +- src/backend/replication/logical/tablesync.c | 153 ++- src/backend/replication/pgoutput/pgoutput.c | 201 +++- src/backend/utils/cache/relcache.c | 33 +- src/bin/pg_dump/pg_dump.c | 41 +- src/bin/pg_dump/pg_dump.h | 1 + src/bin/pg_dump/t/002_pg_dump.pl | 60 + src/bin/psql/describe.c | 44 +- src/include/catalog/pg_publication.h | 12 + src/include/catalog/pg_publication_rel.h | 1 + src/include/commands/publicationcmds.h | 4 +- src/include/nodes/parsenodes.h | 1 + src/include/replication/logicalproto.h | 6 +- src/test/regress/expected/publication.out | 372 ++++++ src/test/regress/sql/publication.sql | 287 +++++ src/test/subscription/t/031_column_list.pl | 1131 +++++++++++++++++++ 26 files changed, 2833 insertions(+), 92 deletions(-) create mode 100644 src/test/subscription/t/031_column_list.pl diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index b8c954a554..560e205b95 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -4410,7 +4410,7 @@ SCRAM-SHA-256$<iteration count>:&l This is an array of indnatts values that - indicate which table columns this index indexes. For example a value + indicate which table columns this index indexes. For example, a value of 1 3 would mean that the first and the third table columns make up the index entries. Key columns come before non-key (included) columns. A zero in this array indicates that the @@ -6291,6 +6291,19 @@ SCRAM-SHA-256$<iteration count>:&l Reference to schema + + + + prattrs int2vector + (references pg_attribute.attnum) + + + This is an array of values that indicates which table columns are + part of the publication. For example, a value of 1 3 + would mean that the first and the third table columns are published. + A null value indicates that all columns are published. + +
diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 8bb34a7c5b..2fa3cedfe9 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -7016,7 +7016,8 @@ Relation
- Next, the following message part appears for each column (except generated columns): + Next, the following message part appears for each column included in + the publication (except generated columns): diff --git a/doc/src/sgml/ref/alter_publication.sgml b/doc/src/sgml/ref/alter_publication.sgml index a8cc8f3dc2..40366a10fe 100644 --- a/doc/src/sgml/ref/alter_publication.sgml +++ b/doc/src/sgml/ref/alter_publication.sgml @@ -30,7 +30,7 @@ ALTER PUBLICATION name RENAME TO where publication_object is one of: - TABLE [ ONLY ] table_name [ * ] [ WHERE ( expression ) ] [, ... ] + TABLE [ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ] [, ... ] SEQUENCE sequence_name [, ... ] ALL TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] ALL SEQUENCES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] @@ -114,6 +114,14 @@ ALTER PUBLICATION name RENAME TO * can be specified after the table name to explicitly indicate that descendant tables are included. + + + + Optionally, a column list can be specified. See for details. + + + If the optional WHERE clause is specified, rows for which the expression evaluates to false or null will not be published. Note that parentheses @@ -185,7 +193,13 @@ ALTER PUBLICATION noinsert SET (publish = 'update, delete'); Add some tables to the publication: -ALTER PUBLICATION mypublication ADD TABLE users, departments; +ALTER PUBLICATION mypublication ADD TABLE users (user_id, firstname), departments; + + + + Change the set of columns published for a table: + +ALTER PUBLICATION mypublication SET TABLE users (user_id, firstname, lastname), TABLE departments; diff --git a/doc/src/sgml/ref/create_publication.sgml b/doc/src/sgml/ref/create_publication.sgml index e5081eb50e..d2739968d9 100644 --- a/doc/src/sgml/ref/create_publication.sgml +++ b/doc/src/sgml/ref/create_publication.sgml @@ -33,7 +33,7 @@ CREATE PUBLICATION name where publication_object is one of: - TABLE [ ONLY ] table_name [ * ] [ WHERE ( expression ) ] [, ... ] + TABLE [ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ] [, ... ] SEQUENCE sequence_name [ * ] [, ... ] ALL TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] ALL SEQUENCES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] @@ -93,6 +93,13 @@ CREATE PUBLICATION name TRUNCATE commands. + + When a column list is specified, only the named columns are replicated. + If no column list is specified, all columns of the table are replicated + through this publication, including any columns added later. If a column + list is specified, it must include the replica identity columns. + + Only persistent base tables and partitioned tables can be part of a publication. Temporary tables, unlogged tables, foreign tables, @@ -348,6 +355,14 @@ CREATE PUBLICATION production_publication FOR TABLE users, departments, ALL TABL sales: CREATE PUBLICATION sales_publication FOR ALL TABLES IN SCHEMA marketing, sales; + + + + Create a publication that publishes all changes for table users, + but replicates only columns user_id and + firstname: + +CREATE PUBLICATION users_filtered FOR TABLE users (user_id, firstname); diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 514a94796e..a5a54e676e 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -45,6 +45,9 @@ #include "utils/rel.h" #include "utils/syscache.h" +static void publication_translate_columns(Relation targetrel, List *columns, + int *natts, AttrNumber **attrs); + /* * Check if relation can be in given publication and throws appropriate * error if not. @@ -395,6 +398,8 @@ publication_add_relation(Oid pubid, PublicationRelInfo *pri, Oid relid = RelationGetRelid(targetrel); Oid pubreloid; Publication *pub = GetPublication(pubid); + AttrNumber *attarray = NULL; + int natts = 0; ObjectAddress myself, referenced; List *relids = NIL; @@ -422,6 +427,14 @@ publication_add_relation(Oid pubid, PublicationRelInfo *pri, check_publication_add_relation(targetrel); + /* + * Translate column names to attnums and make sure the column list contains + * only allowed elements (no system or generated columns etc.). Also build + * an array of attnums, for storing in the catalog. + */ + publication_translate_columns(pri->relation, pri->columns, + &natts, &attarray); + /* Form a tuple. */ memset(values, 0, sizeof(values)); memset(nulls, false, sizeof(nulls)); @@ -440,6 +453,12 @@ publication_add_relation(Oid pubid, PublicationRelInfo *pri, else nulls[Anum_pg_publication_rel_prqual - 1] = true; + /* Add column list, if available */ + if (pri->columns) + values[Anum_pg_publication_rel_prattrs - 1] = PointerGetDatum(buildint2vector(attarray, natts)); + else + nulls[Anum_pg_publication_rel_prattrs - 1] = true; + tup = heap_form_tuple(RelationGetDescr(rel), values, nulls); /* Insert tuple into catalog. */ @@ -463,6 +482,13 @@ publication_add_relation(Oid pubid, PublicationRelInfo *pri, DEPENDENCY_NORMAL, DEPENDENCY_NORMAL, false); + /* Add dependency on the columns, if any are listed */ + for (int i = 0; i < natts; i++) + { + ObjectAddressSubSet(referenced, RelationRelationId, relid, attarray[i]); + recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL); + } + /* Close the table. */ table_close(rel, RowExclusiveLock); @@ -482,6 +508,125 @@ publication_add_relation(Oid pubid, PublicationRelInfo *pri, return myself; } +/* qsort comparator for attnums */ +static int +compare_int16(const void *a, const void *b) +{ + int av = *(const int16 *) a; + int bv = *(const int16 *) b; + + /* this can't overflow if int is wider than int16 */ + return (av - bv); +} + +/* + * Translate a list of column names to an array of attribute numbers + * and a Bitmapset with them; verify that each attribute is appropriate + * to have in a publication column list (no system or generated attributes, + * no duplicates). Additional checks with replica identity are done later; + * see check_publication_columns. + * + * Note that the attribute numbers are *not* offset by + * FirstLowInvalidHeapAttributeNumber; system columns are forbidden so this + * is okay. + */ +static void +publication_translate_columns(Relation targetrel, List *columns, + int *natts, AttrNumber **attrs) +{ + AttrNumber *attarray = NULL; + Bitmapset *set = NULL; + ListCell *lc; + int n = 0; + TupleDesc tupdesc = RelationGetDescr(targetrel); + + /* Bail out when no column list defined. */ + if (!columns) + return; + + /* + * Translate list of columns to attnums. We prohibit system attributes and + * make sure there are no duplicate columns. + */ + attarray = palloc(sizeof(AttrNumber) * list_length(columns)); + foreach(lc, columns) + { + char *colname = strVal(lfirst(lc)); + AttrNumber attnum = get_attnum(RelationGetRelid(targetrel), colname); + + if (attnum == InvalidAttrNumber) + ereport(ERROR, + errcode(ERRCODE_UNDEFINED_COLUMN), + errmsg("column \"%s\" of relation \"%s\" does not exist", + colname, RelationGetRelationName(targetrel))); + + if (!AttrNumberIsForUserDefinedAttr(attnum)) + ereport(ERROR, + errcode(ERRCODE_INVALID_COLUMN_REFERENCE), + errmsg("cannot reference system column \"%s\" in publication column list", + colname)); + + if (TupleDescAttr(tupdesc, attnum - 1)->attgenerated) + ereport(ERROR, + errcode(ERRCODE_INVALID_COLUMN_REFERENCE), + errmsg("cannot reference generated column \"%s\" in publication column list", + colname)); + + if (bms_is_member(attnum, set)) + ereport(ERROR, + errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("duplicate column \"%s\" in publication column list", + colname)); + + set = bms_add_member(set, attnum); + attarray[n++] = attnum; + } + + /* Be tidy, so that the catalog representation is always sorted */ + qsort(attarray, n, sizeof(AttrNumber), compare_int16); + + *natts = n; + *attrs = attarray; + + bms_free(set); +} + +/* + * Transform the column list (represented by an array) to a bitmapset. + */ +Bitmapset * +pub_collist_to_bitmapset(Bitmapset *columns, Datum pubcols, MemoryContext mcxt) +{ + Bitmapset *result = NULL; + ArrayType *arr; + int nelems; + int16 *elems; + MemoryContext oldcxt; + + /* + * If an existing bitmap was provided, use it. Otherwise just use NULL + * and build a new bitmap. + */ + if (columns) + result = columns; + + arr = DatumGetArrayTypeP(pubcols); + nelems = ARR_DIMS(arr)[0]; + elems = (int16 *) ARR_DATA_PTR(arr); + + /* If a memory context was specified, switch to it. */ + if (mcxt) + oldcxt = MemoryContextSwitchTo(mcxt); + + for (int i = 0; i < nelems; i++) + result = bms_add_member(result, elems[i]); + + if (mcxt) + MemoryContextSwitchTo(oldcxt); + + return result; +} + /* * Insert new publication / schema mapping. */ diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index e449e8e8f2..84e37df783 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -342,7 +342,7 @@ contain_invalid_rfcolumn_walker(Node *node, rf_context *context) * Returns true if any invalid column is found. */ bool -contain_invalid_rfcolumn(Oid pubid, Relation relation, List *ancestors, +pub_rf_contains_invalid_column(Oid pubid, Relation relation, List *ancestors, bool pubviaroot) { HeapTuple rftuple; @@ -411,6 +411,114 @@ contain_invalid_rfcolumn(Oid pubid, Relation relation, List *ancestors, return result; } +/* + * Check if all columns referenced in the REPLICA IDENTITY are covered by + * the column list. + * + * Returns true if any replica identity column is not covered by column list. + */ +bool +pub_collist_contains_invalid_column(Oid pubid, Relation relation, List *ancestors, + bool pubviaroot) +{ + HeapTuple tuple; + Oid relid = RelationGetRelid(relation); + Oid publish_as_relid = RelationGetRelid(relation); + bool result = false; + Datum datum; + bool isnull; + + /* + * For a partition, if pubviaroot is true, find the topmost ancestor that + * is published via this publication as we need to use its column list + * for the changes. + * + * Note that even though the column list used is for an ancestor, the + * REPLICA IDENTITY used will be for the actual child table. + */ + if (pubviaroot && relation->rd_rel->relispartition) + { + publish_as_relid = GetTopMostAncestorInPublication(pubid, ancestors, NULL); + + if (!OidIsValid(publish_as_relid)) + publish_as_relid = relid; + } + + tuple = SearchSysCache2(PUBLICATIONRELMAP, + ObjectIdGetDatum(publish_as_relid), + ObjectIdGetDatum(pubid)); + + if (!HeapTupleIsValid(tuple)) + return false; + + datum = SysCacheGetAttr(PUBLICATIONRELMAP, tuple, + Anum_pg_publication_rel_prattrs, + &isnull); + + if (!isnull) + { + int x; + Bitmapset *idattrs; + Bitmapset *columns = NULL; + + /* With REPLICA IDENTITY FULL, no column list is allowed. */ + if (relation->rd_rel->relreplident == REPLICA_IDENTITY_FULL) + result = true; + + /* Transform the column list datum to a bitmapset. */ + columns = pub_collist_to_bitmapset(NULL, datum, NULL); + + /* Remember columns that are part of the REPLICA IDENTITY */ + idattrs = RelationGetIndexAttrBitmap(relation, + INDEX_ATTR_BITMAP_IDENTITY_KEY); + + /* + * Attnums in the bitmap returned by RelationGetIndexAttrBitmap are + * offset (to handle system columns the usual way), while column list + * does not use offset, so we can't do bms_is_subset(). Instead, we have + * to loop over the idattrs and check all of them are in the list. + */ + x = -1; + while ((x = bms_next_member(idattrs, x)) >= 0) + { + AttrNumber attnum = (x + FirstLowInvalidHeapAttributeNumber); + + /* + * If pubviaroot is true, we are validating the column list of the + * parent table, but the bitmap contains the replica identity + * information of the child table. The parent/child attnums may not + * match, so translate them to the parent - get the attname from + * the child, and look it up in the parent. + */ + if (pubviaroot) + { + /* attribute name in the child table */ + char *colname = get_attname(relid, attnum, false); + + /* + * Determine the attnum for the attribute name in parent (we + * are using the column list defined on the parent). + */ + attnum = get_attnum(publish_as_relid, colname); + } + + /* replica identity column, not covered by the column list */ + if (!bms_is_member(attnum, columns)) + { + result = true; + break; + } + } + + bms_free(idattrs); + bms_free(columns); + } + + ReleaseSysCache(tuple); + + return result; +} + /* check_functions_in_node callback */ static bool contain_mutable_or_user_functions_checker(Oid func_id, void *context) @@ -652,6 +760,39 @@ TransformPubWhereClauses(List *tables, const char *queryString, } } + +/* + * Check the publication column lists expression for all relations in the list. + */ +static void +CheckPubRelationColumnList(List *tables, const char *queryString, + bool pubviaroot) +{ + ListCell *lc; + + foreach(lc, tables) + { + PublicationRelInfo *pri = (PublicationRelInfo *) lfirst(lc); + + if (pri->columns == NIL) + continue; + + /* + * If the publication doesn't publish changes via the root partitioned + * table, the partition's column list will be used. So disallow using + * the column list on partitioned table in this case. + */ + if (!pubviaroot && + pri->relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot use publication column list for relation \"%s\"", + RelationGetRelationName(pri->relation)), + errdetail("column list cannot be used for a partitioned table when %s is false.", + "publish_via_partition_root"))); + } +} + /* * Create new publication. */ @@ -808,6 +949,9 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) TransformPubWhereClauses(rels, pstate->p_sourcetext, publish_via_partition_root); + CheckPubRelationColumnList(rels, pstate->p_sourcetext, + publish_via_partition_root); + PublicationAddRelations(puboid, rels, true, NULL); CloseRelationList(rels); } @@ -895,8 +1039,8 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, /* * If the publication doesn't publish changes via the root partitioned - * table, the partition's row filter will be used. So disallow using WHERE - * clause on partitioned table in this case. + * table, the partition's row filter and column list will be used. So disallow + * using WHERE clause and column lists on partitioned table in this case. */ if (!pubform->puballtables && publish_via_partition_root_given && !publish_via_partition_root) @@ -904,7 +1048,8 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, /* * Lock the publication so nobody else can do anything with it. This * prevents concurrent alter to add partitioned table(s) with WHERE - * clause(s) which we don't allow when not publishing via root. + * clause(s) and/or column lists which we don't allow when not + * publishing via root. */ LockDatabaseObject(PublicationRelationId, pubform->oid, 0, AccessShareLock); @@ -917,13 +1062,21 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, { HeapTuple rftuple; Oid relid = lfirst_oid(lc); + bool has_column_list; + bool has_row_filter; rftuple = SearchSysCache2(PUBLICATIONRELMAP, ObjectIdGetDatum(relid), ObjectIdGetDatum(pubform->oid)); + has_row_filter + = !heap_attisnull(rftuple, Anum_pg_publication_rel_prqual, NULL); + + has_column_list + = !heap_attisnull(rftuple, Anum_pg_publication_rel_prattrs, NULL); + if (HeapTupleIsValid(rftuple) && - !heap_attisnull(rftuple, Anum_pg_publication_rel_prqual, NULL)) + (has_row_filter || has_column_list)) { HeapTuple tuple; @@ -932,7 +1085,8 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, { Form_pg_class relform = (Form_pg_class) GETSTRUCT(tuple); - if (relform->relkind == RELKIND_PARTITIONED_TABLE) + if ((relform->relkind == RELKIND_PARTITIONED_TABLE) && + has_row_filter) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("cannot set %s for publication \"%s\"", @@ -943,6 +1097,18 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, NameStr(relform->relname), "publish_via_partition_root"))); + if ((relform->relkind == RELKIND_PARTITIONED_TABLE) && + has_column_list) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot set %s for publication \"%s\"", + "publish_via_partition_root = false", + stmt->pubname), + errdetail("The publication contains a column list for a partitioned table \"%s\" " + "which is not allowed when %s is false.", + NameStr(relform->relname), + "publish_via_partition_root"))); + ReleaseSysCache(tuple); } @@ -1107,6 +1273,8 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, TransformPubWhereClauses(rels, queryString, pubform->pubviaroot); + CheckPubRelationColumnList(rels, queryString, pubform->pubviaroot); + PublicationAddRelations(pubid, rels, false, stmt); } else if (stmt->action == AP_DropObjects) @@ -1124,6 +1292,8 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, TransformPubWhereClauses(rels, queryString, pubform->pubviaroot); + CheckPubRelationColumnList(rels, queryString, pubform->pubviaroot); + /* * To recreate the relation list for the publication, look for * existing relations that do not need to be dropped. @@ -1135,42 +1305,79 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, PublicationRelInfo *oldrel; bool found = false; HeapTuple rftuple; - bool rfisnull = true; Node *oldrelwhereclause = NULL; + Bitmapset *oldcolumns = NULL; /* look up the cache for the old relmap */ rftuple = SearchSysCache2(PUBLICATIONRELMAP, ObjectIdGetDatum(oldrelid), ObjectIdGetDatum(pubid)); + /* + * See if the existing relation currently has a WHERE clause or a + * column list. We need to compare those too. + */ if (HeapTupleIsValid(rftuple)) { + bool isnull = true; Datum whereClauseDatum; + Datum columnListDatum; + /* Load the WHERE clause for this table. */ whereClauseDatum = SysCacheGetAttr(PUBLICATIONRELMAP, rftuple, Anum_pg_publication_rel_prqual, - &rfisnull); - if (!rfisnull) + &isnull); + if (!isnull) oldrelwhereclause = stringToNode(TextDatumGetCString(whereClauseDatum)); + /* Transform the int2vector column list to a bitmap. */ + columnListDatum = SysCacheGetAttr(PUBLICATIONRELMAP, rftuple, + Anum_pg_publication_rel_prattrs, + &isnull); + + if (!isnull) + oldcolumns = pub_collist_to_bitmapset(NULL, columnListDatum, NULL); + ReleaseSysCache(rftuple); } foreach(newlc, rels) { PublicationRelInfo *newpubrel; + Oid newrelid; + Bitmapset *newcolumns = NULL; newpubrel = (PublicationRelInfo *) lfirst(newlc); + newrelid = RelationGetRelid(newpubrel->relation); + + /* + * If the new publication has column list, transform it to + * a bitmap too. + */ + if (newpubrel->columns) + { + ListCell *lc; + + foreach(lc, newpubrel->columns) + { + char *colname = strVal(lfirst(lc)); + AttrNumber attnum = get_attnum(newrelid, colname); + + newcolumns = bms_add_member(newcolumns, attnum); + } + } /* * Check if any of the new set of relations matches with the * existing relations in the publication. Additionally, if the * relation has an associated WHERE clause, check the WHERE - * expressions also match. Drop the rest. + * expressions also match. Same for the column list. Drop the + * rest. */ if (RelationGetRelid(newpubrel->relation) == oldrelid) { - if (equal(oldrelwhereclause, newpubrel->whereClause)) + if (equal(oldrelwhereclause, newpubrel->whereClause) && + bms_equal(oldcolumns, newcolumns)) { found = true; break; @@ -1186,6 +1393,7 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, { oldrel = palloc(sizeof(PublicationRelInfo)); oldrel->whereClause = NULL; + oldrel->columns = NIL; oldrel->relation = table_open(oldrelid, ShareUpdateExclusiveLock); delrels = lappend(delrels, oldrel); @@ -1401,6 +1609,7 @@ AlterPublicationSequences(AlterPublicationStmt *stmt, HeapTuple tup, { oldrel = palloc(sizeof(PublicationRelInfo)); oldrel->whereClause = NULL; + oldrel->columns = NULL; oldrel->relation = table_open(oldrelid, ShareUpdateExclusiveLock); delrels = lappend(delrels, oldrel); @@ -1660,6 +1869,7 @@ OpenRelationList(List *rels, char objectType) List *result = NIL; ListCell *lc; List *relids_with_rf = NIL; + List *relids_with_collist = NIL; /* * Open, share-lock, and check all the explicitly-specified relations @@ -1710,6 +1920,13 @@ OpenRelationList(List *rels, char objectType) errmsg("conflicting or redundant WHERE clauses for table \"%s\"", RelationGetRelationName(rel)))); + /* Disallow duplicate tables if there are any with column lists. */ + if (t->columns || list_member_oid(relids_with_collist, myrelid)) + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("conflicting or redundant column lists for table \"%s\"", + RelationGetRelationName(rel)))); + table_close(rel, ShareUpdateExclusiveLock); continue; } @@ -1717,12 +1934,16 @@ OpenRelationList(List *rels, char objectType) pub_rel = palloc(sizeof(PublicationRelInfo)); pub_rel->relation = rel; pub_rel->whereClause = t->whereClause; + pub_rel->columns = t->columns; result = lappend(result, pub_rel); relids = lappend_oid(relids, myrelid); if (t->whereClause) relids_with_rf = lappend_oid(relids_with_rf, myrelid); + if (t->columns) + relids_with_collist = lappend_oid(relids_with_collist, myrelid); + /* * Add children of this rel, if requested, so that they too are added * to the publication. A partitioned table can't have any inheritance @@ -1762,6 +1983,18 @@ OpenRelationList(List *rels, char objectType) errmsg("conflicting or redundant WHERE clauses for table \"%s\"", RelationGetRelationName(rel)))); + /* + * We don't allow to specify column list for both parent + * and child table at the same time as it is not very + * clear which one should be given preference. + */ + if (childrelid != myrelid && + (t->columns || list_member_oid(relids_with_collist, childrelid))) + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("conflicting or redundant column lists for table \"%s\"", + RelationGetRelationName(rel)))); + continue; } @@ -1771,11 +2004,16 @@ OpenRelationList(List *rels, char objectType) pub_rel->relation = rel; /* child inherits WHERE clause from parent */ pub_rel->whereClause = t->whereClause; + /* child inherits column list from parent */ + pub_rel->columns = t->columns; result = lappend(result, pub_rel); relids = lappend_oid(relids, childrelid); if (t->whereClause) relids_with_rf = lappend_oid(relids_with_rf, childrelid); + + if (t->columns) + relids_with_collist = lappend_oid(relids_with_collist, childrelid); } } } @@ -1884,6 +2122,11 @@ PublicationDropRelations(Oid pubid, List *rels, bool missing_ok) Relation rel = pubrel->relation; Oid relid = RelationGetRelid(rel); + if (pubrel->columns) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("column list must not be specified in ALTER PUBLICATION ... DROP")); + prid = GetSysCacheOid2(PUBLICATIONRELMAP, Anum_pg_publication_rel_oid, ObjectIdGetDatum(relid), ObjectIdGetDatum(pubid)); diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c index 0df7cf5874..1a4fbdc38c 100644 --- a/src/backend/executor/execReplication.c +++ b/src/backend/executor/execReplication.c @@ -574,9 +574,6 @@ CheckCmdReplicaIdentity(Relation rel, CmdType cmd) if (cmd != CMD_UPDATE && cmd != CMD_DELETE) return; - if (rel->rd_rel->relreplident == REPLICA_IDENTITY_FULL) - return; - /* * It is only safe to execute UPDATE/DELETE when all columns, referenced * in the row filters from publications which the relation is in, are @@ -596,17 +593,33 @@ CheckCmdReplicaIdentity(Relation rel, CmdType cmd) errmsg("cannot update table \"%s\"", RelationGetRelationName(rel)), errdetail("Column used in the publication WHERE expression is not part of the replica identity."))); + else if (cmd == CMD_UPDATE && !pubdesc.cols_valid_for_update) + ereport(ERROR, + (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), + errmsg("cannot update table \"%s\"", + RelationGetRelationName(rel)), + errdetail("Column list used by the publication does not cover the replica identity."))); else if (cmd == CMD_DELETE && !pubdesc.rf_valid_for_delete) ereport(ERROR, (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), errmsg("cannot delete from table \"%s\"", RelationGetRelationName(rel)), errdetail("Column used in the publication WHERE expression is not part of the replica identity."))); + else if (cmd == CMD_DELETE && !pubdesc.cols_valid_for_delete) + ereport(ERROR, + (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), + errmsg("cannot delete from table \"%s\"", + RelationGetRelationName(rel)), + errdetail("Column list used by the publication does not cover the replica identity."))); /* If relation has replica identity we are always good. */ if (OidIsValid(RelationGetReplicaIndex(rel))) return; + /* REPLICA IDENTITY FULL is also good for UPDATE/DELETE. */ + if (rel->rd_rel->relreplident == REPLICA_IDENTITY_FULL) + return; + /* * This is UPDATE/DELETE and there is no replica identity. * diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 55f720a88f..e38ff4000f 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -4850,6 +4850,7 @@ _copyPublicationTable(const PublicationTable *from) COPY_NODE_FIELD(relation); COPY_NODE_FIELD(whereClause); + COPY_NODE_FIELD(columns); return newnode; } diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 82562eb9b8..0f330e3c70 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -2322,6 +2322,7 @@ _equalPublicationTable(const PublicationTable *a, const PublicationTable *b) { COMPARE_NODE_FIELD(relation); COMPARE_NODE_FIELD(whereClause); + COMPARE_NODE_FIELD(columns); return true; } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index f8301541c9..945a9ada8b 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -9749,13 +9749,14 @@ CreatePublicationStmt: * relation_expr here. */ PublicationObjSpec: - TABLE relation_expr OptWhereClause + TABLE relation_expr opt_column_list OptWhereClause { $$ = makeNode(PublicationObjSpec); $$->pubobjtype = PUBLICATIONOBJ_TABLE; $$->pubtable = makeNode(PublicationTable); $$->pubtable->relation = $2; - $$->pubtable->whereClause = $3; + $$->pubtable->columns = $3; + $$->pubtable->whereClause = $4; } | ALL TABLES IN_P SCHEMA ColId { @@ -9790,11 +9791,15 @@ PublicationObjSpec: $$->pubobjtype = PUBLICATIONOBJ_SEQUENCES_IN_CUR_SCHEMA; $$->location = @5; } - | ColId OptWhereClause + | ColId opt_column_list OptWhereClause { $$ = makeNode(PublicationObjSpec); $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; - if ($2) + /* + * If either a row filter or column list is specified, create + * a PublicationTable object. + */ + if ($2 || $3) { /* * The OptWhereClause must be stored here but it is @@ -9804,7 +9809,8 @@ PublicationObjSpec: */ $$->pubtable = makeNode(PublicationTable); $$->pubtable->relation = makeRangeVar(NULL, $1, @1); - $$->pubtable->whereClause = $2; + $$->pubtable->columns = $2; + $$->pubtable->whereClause = $3; } else { @@ -9812,23 +9818,25 @@ PublicationObjSpec: } $$->location = @1; } - | ColId indirection OptWhereClause + | ColId indirection opt_column_list OptWhereClause { $$ = makeNode(PublicationObjSpec); $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; $$->pubtable = makeNode(PublicationTable); $$->pubtable->relation = makeRangeVarFromQualifiedName($1, $2, @1, yyscanner); - $$->pubtable->whereClause = $3; + $$->pubtable->columns = $3; + $$->pubtable->whereClause = $4; $$->location = @1; } /* grammar like tablename * , ONLY tablename, ONLY ( tablename ) */ - | extended_relation_expr OptWhereClause + | extended_relation_expr opt_column_list OptWhereClause { $$ = makeNode(PublicationObjSpec); $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; $$->pubtable = makeNode(PublicationTable); $$->pubtable->relation = $1; - $$->pubtable->whereClause = $2; + $$->pubtable->columns = $2; + $$->pubtable->whereClause = $3; } | CURRENT_SCHEMA { @@ -17524,6 +17532,13 @@ preprocess_pubobj_list(List *pubobjspec_list, core_yyscan_t yyscanner) errmsg("WHERE clause not allowed for schema"), parser_errposition(pubobj->location)); + /* Column list is not allowed on a schema object */ + if (pubobj->pubtable && pubobj->pubtable->columns) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("column specification not allowed for schema"), + parser_errposition(pubobj->location)); + /* * We can distinguish between the different type of schema * objects based on whether name and pubtable is set. diff --git a/src/backend/replication/logical/proto.c b/src/backend/replication/logical/proto.c index 3dbe85d61a..18d3cbb924 100644 --- a/src/backend/replication/logical/proto.c +++ b/src/backend/replication/logical/proto.c @@ -29,16 +29,30 @@ #define TRUNCATE_CASCADE (1<<0) #define TRUNCATE_RESTART_SEQS (1<<1) -static void logicalrep_write_attrs(StringInfo out, Relation rel); +static void logicalrep_write_attrs(StringInfo out, Relation rel, + Bitmapset *columns); static void logicalrep_write_tuple(StringInfo out, Relation rel, TupleTableSlot *slot, - bool binary); + bool binary, Bitmapset *columns); static void logicalrep_read_attrs(StringInfo in, LogicalRepRelation *rel); static void logicalrep_read_tuple(StringInfo in, LogicalRepTupleData *tuple); static void logicalrep_write_namespace(StringInfo out, Oid nspid); static const char *logicalrep_read_namespace(StringInfo in); +/* + * Check if a column is covered by a column list. + * + * Need to be careful about NULL, which is treated as a column list covering + * all columns. + */ +static bool +column_in_column_list(int attnum, Bitmapset *columns) +{ + return (columns == NULL || bms_is_member(attnum, columns)); +} + + /* * Write BEGIN to the output stream. */ @@ -398,7 +412,7 @@ logicalrep_read_origin(StringInfo in, XLogRecPtr *origin_lsn) */ void logicalrep_write_insert(StringInfo out, TransactionId xid, Relation rel, - TupleTableSlot *newslot, bool binary) + TupleTableSlot *newslot, bool binary, Bitmapset *columns) { pq_sendbyte(out, LOGICAL_REP_MSG_INSERT); @@ -410,7 +424,7 @@ logicalrep_write_insert(StringInfo out, TransactionId xid, Relation rel, pq_sendint32(out, RelationGetRelid(rel)); pq_sendbyte(out, 'N'); /* new tuple follows */ - logicalrep_write_tuple(out, rel, newslot, binary); + logicalrep_write_tuple(out, rel, newslot, binary, columns); } /* @@ -443,7 +457,7 @@ logicalrep_read_insert(StringInfo in, LogicalRepTupleData *newtup) void logicalrep_write_update(StringInfo out, TransactionId xid, Relation rel, TupleTableSlot *oldslot, TupleTableSlot *newslot, - bool binary) + bool binary, Bitmapset *columns) { pq_sendbyte(out, LOGICAL_REP_MSG_UPDATE); @@ -464,11 +478,11 @@ logicalrep_write_update(StringInfo out, TransactionId xid, Relation rel, pq_sendbyte(out, 'O'); /* old tuple follows */ else pq_sendbyte(out, 'K'); /* old key follows */ - logicalrep_write_tuple(out, rel, oldslot, binary); + logicalrep_write_tuple(out, rel, oldslot, binary, NULL); } pq_sendbyte(out, 'N'); /* new tuple follows */ - logicalrep_write_tuple(out, rel, newslot, binary); + logicalrep_write_tuple(out, rel, newslot, binary, columns); } /* @@ -537,7 +551,7 @@ logicalrep_write_delete(StringInfo out, TransactionId xid, Relation rel, else pq_sendbyte(out, 'K'); /* old key follows */ - logicalrep_write_tuple(out, rel, oldslot, binary); + logicalrep_write_tuple(out, rel, oldslot, binary, NULL); } /* @@ -702,7 +716,8 @@ logicalrep_read_sequence(StringInfo in, LogicalRepSequence *seqdata) * Write relation description to the output stream. */ void -logicalrep_write_rel(StringInfo out, TransactionId xid, Relation rel) +logicalrep_write_rel(StringInfo out, TransactionId xid, Relation rel, + Bitmapset *columns) { char *relname; @@ -724,7 +739,7 @@ logicalrep_write_rel(StringInfo out, TransactionId xid, Relation rel) pq_sendbyte(out, rel->rd_rel->relreplident); /* send the attribute info */ - logicalrep_write_attrs(out, rel); + logicalrep_write_attrs(out, rel, columns); } /* @@ -801,7 +816,7 @@ logicalrep_read_typ(StringInfo in, LogicalRepTyp *ltyp) */ static void logicalrep_write_tuple(StringInfo out, Relation rel, TupleTableSlot *slot, - bool binary) + bool binary, Bitmapset *columns) { TupleDesc desc; Datum *values; @@ -813,8 +828,14 @@ logicalrep_write_tuple(StringInfo out, Relation rel, TupleTableSlot *slot, for (i = 0; i < desc->natts; i++) { - if (TupleDescAttr(desc, i)->attisdropped || TupleDescAttr(desc, i)->attgenerated) + Form_pg_attribute att = TupleDescAttr(desc, i); + + if (att->attisdropped || att->attgenerated) + continue; + + if (!column_in_column_list(att->attnum, columns)) continue; + nliveatts++; } pq_sendint16(out, nliveatts); @@ -833,6 +854,9 @@ logicalrep_write_tuple(StringInfo out, Relation rel, TupleTableSlot *slot, if (att->attisdropped || att->attgenerated) continue; + if (!column_in_column_list(att->attnum, columns)) + continue; + if (isnull[i]) { pq_sendbyte(out, LOGICALREP_COLUMN_NULL); @@ -954,7 +978,7 @@ logicalrep_read_tuple(StringInfo in, LogicalRepTupleData *tuple) * Write relation attribute metadata to the stream. */ static void -logicalrep_write_attrs(StringInfo out, Relation rel) +logicalrep_write_attrs(StringInfo out, Relation rel, Bitmapset *columns) { TupleDesc desc; int i; @@ -967,8 +991,14 @@ logicalrep_write_attrs(StringInfo out, Relation rel) /* send number of live attributes */ for (i = 0; i < desc->natts; i++) { - if (TupleDescAttr(desc, i)->attisdropped || TupleDescAttr(desc, i)->attgenerated) + Form_pg_attribute att = TupleDescAttr(desc, i); + + if (att->attisdropped || att->attgenerated) continue; + + if (!column_in_column_list(att->attnum, columns)) + continue; + nliveatts++; } pq_sendint16(out, nliveatts); @@ -987,6 +1017,9 @@ logicalrep_write_attrs(StringInfo out, Relation rel) if (att->attisdropped || att->attgenerated) continue; + if (!column_in_column_list(att->attnum, columns)) + continue; + /* REPLICA IDENTITY FULL means all columns are sent as part of key. */ if (replidentfull || bms_is_member(att->attnum - FirstLowInvalidHeapAttributeNumber, diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index d8b12d94bc..697fb23634 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -113,6 +113,7 @@ #include "storage/ipc.h" #include "storage/lmgr.h" #include "utils/acl.h" +#include "utils/array.h" #include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/memutils.h" @@ -702,12 +703,13 @@ fetch_remote_table_info(char *nspname, char *relname, StringInfoData cmd; TupleTableSlot *slot; Oid tableRow[] = {OIDOID, CHAROID, CHAROID}; - Oid attrRow[] = {TEXTOID, OIDOID, BOOLOID}; + Oid attrRow[] = {INT2OID, TEXTOID, OIDOID, BOOLOID}; Oid qualRow[] = {TEXTOID}; bool isnull; int natt; ListCell *lc; bool first; + Bitmapset *included_cols = NULL; lrel->nspname = nspname; lrel->relname = relname; @@ -748,10 +750,110 @@ fetch_remote_table_info(char *nspname, char *relname, ExecDropSingleTupleTableSlot(slot); walrcv_clear_result(res); - /* Now fetch columns. */ + + /* + * Get column lists for each relation. + * + * For initial synchronization, column lists can be ignored in following + * cases: + * + * 1) one of the subscribed publications for the table hasn't specified + * any column list + * + * 2) one of the subscribed publications has puballtables set to true + * + * 3) one of the subscribed publications is declared as ALL TABLES IN + * SCHEMA that includes this relation + * + * We need to do this before fetching info about column names and types, + * so that we can skip columns that should not be replicated. + */ + if (walrcv_server_version(LogRepWorkerWalRcvConn) >= 150000) + { + WalRcvExecResult *pubres; + TupleTableSlot *slot; + Oid attrsRow[] = {INT2OID}; + StringInfoData pub_names; + bool first = true; + + initStringInfo(&pub_names); + foreach(lc, MySubscription->publications) + { + if (!first) + appendStringInfo(&pub_names, ", "); + appendStringInfoString(&pub_names, quote_literal_cstr(strVal(lfirst(lc)))); + first = false; + } + + /* + * Fetch info about column lists for the relation (from all the + * publications). We unnest the int2vector values, because that + * makes it easier to combine lists by simply adding the attnums + * to a new bitmap (without having to parse the int2vector data). + * This preserves NULL values, so that if one of the publications + * has no column list, we'll know that. + */ + resetStringInfo(&cmd); + appendStringInfo(&cmd, + "SELECT DISTINCT unnest" + " FROM pg_publication p" + " LEFT OUTER JOIN pg_publication_rel pr" + " ON (p.oid = pr.prpubid AND pr.prrelid = %u)" + " LEFT OUTER JOIN unnest(pr.prattrs) ON TRUE," + " LATERAL pg_get_publication_tables(p.pubname) gpt" + " WHERE gpt.relid = %u" + " AND p.pubname IN ( %s )", + lrel->remoteid, + lrel->remoteid, + pub_names.data); + + pubres = walrcv_exec(LogRepWorkerWalRcvConn, cmd.data, + lengthof(attrsRow), attrsRow); + + if (pubres->status != WALRCV_OK_TUPLES) + ereport(ERROR, + (errcode(ERRCODE_CONNECTION_FAILURE), + errmsg("could not fetch column list info for table \"%s.%s\" from publisher: %s", + nspname, relname, pubres->err))); + + /* + * Merge the column lists (from different publications) by creating + * a single bitmap with all the attnums. If we find a NULL value, + * that means one of the publications has no column list for the + * table we're syncing. + */ + slot = MakeSingleTupleTableSlot(pubres->tupledesc, &TTSOpsMinimalTuple); + while (tuplestore_gettupleslot(pubres->tuplestore, true, false, slot)) + { + Datum cfval = slot_getattr(slot, 1, &isnull); + + /* NULL means empty column list, so we're done. */ + if (isnull) + { + bms_free(included_cols); + included_cols = NULL; + break; + } + + included_cols = bms_add_member(included_cols, + DatumGetInt16(cfval)); + + ExecClearTuple(slot); + } + ExecDropSingleTupleTableSlot(slot); + + walrcv_clear_result(pubres); + + pfree(pub_names.data); + } + + /* + * Now fetch column names and types. + */ resetStringInfo(&cmd); appendStringInfo(&cmd, - "SELECT a.attname," + "SELECT a.attnum," + " a.attname," " a.atttypid," " a.attnum = ANY(i.indkey)" " FROM pg_catalog.pg_attribute a" @@ -779,16 +881,35 @@ fetch_remote_table_info(char *nspname, char *relname, lrel->atttyps = palloc0(MaxTupleAttributeNumber * sizeof(Oid)); lrel->attkeys = NULL; + /* + * Store the columns as a list of names. Ignore those that are not + * present in the column list, if there is one. + */ natt = 0; slot = MakeSingleTupleTableSlot(res->tupledesc, &TTSOpsMinimalTuple); while (tuplestore_gettupleslot(res->tuplestore, true, false, slot)) { - lrel->attnames[natt] = - TextDatumGetCString(slot_getattr(slot, 1, &isnull)); + char *rel_colname; + AttrNumber attnum; + + attnum = DatumGetInt16(slot_getattr(slot, 1, &isnull)); Assert(!isnull); - lrel->atttyps[natt] = DatumGetObjectId(slot_getattr(slot, 2, &isnull)); + + /* If the column is not in the column list, skip it. */ + if (included_cols != NULL && !bms_is_member(attnum, included_cols)) + { + ExecClearTuple(slot); + continue; + } + + rel_colname = TextDatumGetCString(slot_getattr(slot, 2, &isnull)); + Assert(!isnull); + + lrel->attnames[natt] = rel_colname; + lrel->atttyps[natt] = DatumGetObjectId(slot_getattr(slot, 3, &isnull)); Assert(!isnull); - if (DatumGetBool(slot_getattr(slot, 3, &isnull))) + + if (DatumGetBool(slot_getattr(slot, 4, &isnull))) lrel->attkeys = bms_add_member(lrel->attkeys, natt); /* Should never happen. */ @@ -931,8 +1052,24 @@ copy_table(Relation rel) /* Regular table with no row filter */ if (lrel.relkind == RELKIND_RELATION && qual == NIL) - appendStringInfo(&cmd, "COPY %s TO STDOUT", + { + appendStringInfo(&cmd, "COPY %s (", quote_qualified_identifier(lrel.nspname, lrel.relname)); + + /* + * XXX Do we need to list the columns in all cases? Maybe we're replicating + * all columns? + */ + for (int i = 0; i < lrel.natts; i++) + { + if (i > 0) + appendStringInfoString(&cmd, ", "); + + appendStringInfoString(&cmd, quote_identifier(lrel.attnames[i])); + } + + appendStringInfo(&cmd, ") TO STDOUT"); + } else { /* diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 292e7299d8..893833ea83 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -30,6 +30,7 @@ #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/memutils.h" +#include "utils/rel.h" #include "utils/syscache.h" #include "utils/varlena.h" @@ -90,7 +91,8 @@ static List *LoadPublications(List *pubnames); static void publication_invalidation_cb(Datum arg, int cacheid, uint32 hashvalue); static void send_relation_and_attrs(Relation relation, TransactionId xid, - LogicalDecodingContext *ctx); + LogicalDecodingContext *ctx, + Bitmapset *columns); static void send_repl_origin(LogicalDecodingContext *ctx, RepOriginId origin_id, XLogRecPtr origin_lsn, bool send_origin); @@ -148,9 +150,6 @@ typedef struct RelationSyncEntry */ ExprState *exprstate[NUM_ROWFILTER_PUBACTIONS]; EState *estate; /* executor state used for row filter */ - MemoryContext cache_expr_cxt; /* private context for exprstate and - * estate, if any */ - TupleTableSlot *new_slot; /* slot for storing new tuple */ TupleTableSlot *old_slot; /* slot for storing old tuple */ @@ -169,6 +168,19 @@ typedef struct RelationSyncEntry * having identical TupleDesc. */ AttrMap *attrmap; + + /* + * Columns included in the publication, or NULL if all columns are + * included implicitly. Note that the attnums in this bitmap are not + * shifted by FirstLowInvalidHeapAttributeNumber. + */ + Bitmapset *columns; + + /* + * Private context to store additional data for this entry - state for + * the row filter expressions, column list, etc. + */ + MemoryContext entry_cxt; } RelationSyncEntry; /* Map used to remember which relation schemas we sent. */ @@ -200,6 +212,11 @@ static bool pgoutput_row_filter(Relation relation, TupleTableSlot *old_slot, RelationSyncEntry *entry, ReorderBufferChangeType *action); +/* column list routines */ +static void pgoutput_column_list_init(PGOutputData *data, + List *publications, + RelationSyncEntry *entry); + /* * Specify output plugin callbacks */ @@ -622,11 +639,11 @@ maybe_send_schema(LogicalDecodingContext *ctx, { Relation ancestor = RelationIdGetRelation(relentry->publish_as_relid); - send_relation_and_attrs(ancestor, xid, ctx); + send_relation_and_attrs(ancestor, xid, ctx, relentry->columns); RelationClose(ancestor); } - send_relation_and_attrs(relation, xid, ctx); + send_relation_and_attrs(relation, xid, ctx, relentry->columns); if (in_streaming) set_schema_sent_in_streamed_txn(relentry, topxid); @@ -639,7 +656,8 @@ maybe_send_schema(LogicalDecodingContext *ctx, */ static void send_relation_and_attrs(Relation relation, TransactionId xid, - LogicalDecodingContext *ctx) + LogicalDecodingContext *ctx, + Bitmapset *columns) { TupleDesc desc = RelationGetDescr(relation); int i; @@ -662,13 +680,17 @@ send_relation_and_attrs(Relation relation, TransactionId xid, if (att->atttypid < FirstGenbkiObjectId) continue; + /* Skip this attribute if it's not present in the column list */ + if (columns != NULL && !bms_is_member(att->attnum, columns)) + continue; + OutputPluginPrepareWrite(ctx, false); logicalrep_write_typ(ctx->out, xid, att->atttypid); OutputPluginWrite(ctx, false); } OutputPluginPrepareWrite(ctx, false); - logicalrep_write_rel(ctx->out, xid, relation); + logicalrep_write_rel(ctx->out, xid, relation, columns); OutputPluginWrite(ctx, false); } @@ -722,6 +744,28 @@ pgoutput_row_filter_exec_expr(ExprState *state, ExprContext *econtext) return DatumGetBool(ret); } +/* + * Make sure the per-entry memory context exists. + */ +static void +pgoutput_ensure_entry_cxt(PGOutputData *data, RelationSyncEntry *entry) +{ + Relation relation; + + /* The context may already exist, in which case bail out. */ + if (entry->entry_cxt) + return; + + relation = RelationIdGetRelation(entry->publish_as_relid); + + entry->entry_cxt = AllocSetContextCreate(data->cachectx, + "entry private context", + ALLOCSET_SMALL_SIZES); + + MemoryContextCopyAndSetIdentifier(entry->entry_cxt, + RelationGetRelationName(relation)); +} + /* * Initialize the row filter. */ @@ -842,21 +886,13 @@ pgoutput_row_filter_init(PGOutputData *data, List *publications, { Relation relation = RelationIdGetRelation(entry->publish_as_relid); - Assert(entry->cache_expr_cxt == NULL); - - /* Create the memory context for row filters */ - entry->cache_expr_cxt = AllocSetContextCreate(data->cachectx, - "Row filter expressions", - ALLOCSET_DEFAULT_SIZES); - - MemoryContextCopyAndSetIdentifier(entry->cache_expr_cxt, - RelationGetRelationName(relation)); + pgoutput_ensure_entry_cxt(data, entry); /* * Now all the filters for all pubactions are known. Combine them when * their pubactions are the same. */ - oldctx = MemoryContextSwitchTo(entry->cache_expr_cxt); + oldctx = MemoryContextSwitchTo(entry->entry_cxt); entry->estate = create_estate_for_relation(relation); for (idx = 0; idx < NUM_ROWFILTER_PUBACTIONS; idx++) { @@ -879,6 +915,105 @@ pgoutput_row_filter_init(PGOutputData *data, List *publications, } } +/* + * Initialize the column list. + */ +static void +pgoutput_column_list_init(PGOutputData *data, List *publications, + RelationSyncEntry *entry) +{ + ListCell *lc; + + /* + * Find if there are any column lists for this relation. If there are, + * build a bitmap merging all the column lists. + * + * All the given publication-table mappings must be checked. + * + * Multiple publications might have multiple column lists for this relation. + * + * FOR ALL TABLES and FOR ALL TABLES IN SCHEMA implies "don't use column + * list" so it takes precedence. + */ + foreach(lc, publications) + { + Publication *pub = lfirst(lc); + HeapTuple cftuple = NULL; + Datum cfdatum = 0; + + /* + * Assume there's no column list. Only if we find pg_publication_rel + * entry with a column list we'll switch it to false. + */ + bool pub_no_list = true; + + /* + * If the publication is FOR ALL TABLES then it is treated the same as if + * there are no column lists (even if other publications have a list). + */ + if (!pub->alltables) + { + /* + * Check for the presence of a column list in this publication. + * + * Note: If we find no pg_publication_rel row, it's a publication + * defined for a whole schema, so it can't have a column list, just + * like a FOR ALL TABLES publication. + */ + cftuple = SearchSysCache2(PUBLICATIONRELMAP, + ObjectIdGetDatum(entry->publish_as_relid), + ObjectIdGetDatum(pub->oid)); + + if (HeapTupleIsValid(cftuple)) + { + /* + * Lookup the column list attribute. + * + * Note: We update the pub_no_list value directly, because if + * the value is NULL, we have no list (and vice versa). + */ + cfdatum = SysCacheGetAttr(PUBLICATIONRELMAP, cftuple, + Anum_pg_publication_rel_prattrs, + &pub_no_list); + + /* + * Build the column list bitmap in the per-entry context. + * + * We need to merge column lists from all publications, so we + * update the same bitmapset. If the column list is null, we + * interpret it as replicating all columns. + */ + if (!pub_no_list) /* when not null */ + { + pgoutput_ensure_entry_cxt(data, entry); + + entry->columns = pub_collist_to_bitmapset(entry->columns, + cfdatum, + entry->entry_cxt); + } + } + } + + /* + * Found a publication with no column list, so we're done. But first + * discard column list we might have from preceding publications. + */ + if (pub_no_list) + { + if (cftuple) + ReleaseSysCache(cftuple); + + bms_free(entry->columns); + entry->columns = NULL; + + break; + } + + ReleaseSysCache(cftuple); + } /* loop all subscribed publications */ + +} + /* * Initialize the slot for storing new and old tuples, and build the map that * will be used to convert the relation's tuples into the ancestor's format. @@ -1243,7 +1378,7 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, OutputPluginPrepareWrite(ctx, true); logicalrep_write_insert(ctx->out, xid, targetrel, new_slot, - data->binary); + data->binary, relentry->columns); OutputPluginWrite(ctx, true); break; case REORDER_BUFFER_CHANGE_UPDATE: @@ -1297,11 +1432,13 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, { case REORDER_BUFFER_CHANGE_INSERT: logicalrep_write_insert(ctx->out, xid, targetrel, - new_slot, data->binary); + new_slot, data->binary, + relentry->columns); break; case REORDER_BUFFER_CHANGE_UPDATE: logicalrep_write_update(ctx->out, xid, targetrel, - old_slot, new_slot, data->binary); + old_slot, new_slot, data->binary, + relentry->columns); break; case REORDER_BUFFER_CHANGE_DELETE: logicalrep_write_delete(ctx->out, xid, targetrel, @@ -1794,8 +1931,9 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) entry->new_slot = NULL; entry->old_slot = NULL; memset(entry->exprstate, 0, sizeof(entry->exprstate)); - entry->cache_expr_cxt = NULL; + entry->entry_cxt = NULL; entry->publish_as_relid = InvalidOid; + entry->columns = NULL; entry->attrmap = NULL; } @@ -1841,6 +1979,8 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) entry->schema_sent = false; list_free(entry->streamed_txns); entry->streamed_txns = NIL; + bms_free(entry->columns); + entry->columns = NULL; entry->pubactions.pubinsert = false; entry->pubactions.pubupdate = false; entry->pubactions.pubdelete = false; @@ -1865,17 +2005,18 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) /* * Row filter cache cleanups. */ - if (entry->cache_expr_cxt) - MemoryContextDelete(entry->cache_expr_cxt); + if (entry->entry_cxt) + MemoryContextDelete(entry->entry_cxt); - entry->cache_expr_cxt = NULL; + entry->entry_cxt = NULL; entry->estate = NULL; memset(entry->exprstate, 0, sizeof(entry->exprstate)); /* * Build publication cache. We can't use one provided by relcache as - * relcache considers all publications given relation is in, but here - * we only need to consider ones that the subscriber requested. + * relcache considers all publications that the given relation is in, + * but here we only need to consider ones that the subscriber + * requested. */ foreach(lc, data->publications) { @@ -1946,6 +2087,9 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) } /* + * If the relation is to be published, determine actions to + * publish, and list of columns, if appropriate. + * * Don't publish changes for partitioned tables, because * publishing those of its partitions suffices, unless partition * changes won't be published due to pubviaroot being set. @@ -2007,6 +2151,9 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) /* Initialize the row filter */ pgoutput_row_filter_init(data, rel_publications, entry); + + /* Initialize the column list */ + pgoutput_column_list_init(data, rel_publications, entry); } list_free(pubids); diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 4f3fe1118a..d47fac7bb9 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -5575,6 +5575,8 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) memset(pubdesc, 0, sizeof(PublicationDesc)); pubdesc->rf_valid_for_update = true; pubdesc->rf_valid_for_delete = true; + pubdesc->cols_valid_for_update = true; + pubdesc->cols_valid_for_delete = true; return; } @@ -5587,6 +5589,8 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) memset(pubdesc, 0, sizeof(PublicationDesc)); pubdesc->rf_valid_for_update = true; pubdesc->rf_valid_for_delete = true; + pubdesc->cols_valid_for_update = true; + pubdesc->cols_valid_for_delete = true; /* Fetch the publication membership info. */ puboids = GetRelationPublications(relid); @@ -5657,7 +5661,7 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) */ if (!pubform->puballtables && (pubform->pubupdate || pubform->pubdelete) && - contain_invalid_rfcolumn(pubid, relation, ancestors, + pub_rf_contains_invalid_column(pubid, relation, ancestors, pubform->pubviaroot)) { if (pubform->pubupdate) @@ -5666,6 +5670,23 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) pubdesc->rf_valid_for_delete = false; } + /* + * Check if all columns are part of the REPLICA IDENTITY index or not. + * + * If the publication is FOR ALL TABLES then it means the table has no + * column list and we can skip the validation. + */ + if (!pubform->puballtables && + (pubform->pubupdate || pubform->pubdelete) && + pub_collist_contains_invalid_column(pubid, relation, ancestors, + pubform->pubviaroot)) + { + if (pubform->pubupdate) + pubdesc->cols_valid_for_update = false; + if (pubform->pubdelete) + pubdesc->cols_valid_for_delete = false; + } + ReleaseSysCache(tup); /* @@ -5677,6 +5698,16 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) pubdesc->pubactions.pubdelete && pubdesc->pubactions.pubtruncate && !pubdesc->rf_valid_for_update && !pubdesc->rf_valid_for_delete) break; + + /* + * If we know everything is replicated and the column list is invalid + * for update and delete, there is no point to check for other + * publications. + */ + if (pubdesc->pubactions.pubinsert && pubdesc->pubactions.pubupdate && + pubdesc->pubactions.pubdelete && pubdesc->pubactions.pubtruncate && + !pubdesc->cols_valid_for_update && !pubdesc->cols_valid_for_delete) + break; } if (relation->rd_pubdesc) diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 00629f0836..535b160165 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -4131,6 +4131,7 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables) int i_prpubid; int i_prrelid; int i_prrelqual; + int i_prattrs; int i, j, ntups; @@ -4144,12 +4145,20 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables) if (fout->remoteVersion >= 150000) appendPQExpBufferStr(query, "SELECT tableoid, oid, prpubid, prrelid, " - "pg_catalog.pg_get_expr(prqual, prrelid) AS prrelqual " - "FROM pg_catalog.pg_publication_rel"); + "pg_catalog.pg_get_expr(prqual, prrelid) AS prrelqual, " + "(CASE\n" + " WHEN pr.prattrs IS NOT NULL THEN\n" + " (SELECT array_agg(attname)\n" + " FROM\n" + " pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,\n" + " pg_catalog.pg_attribute\n" + " WHERE attrelid = pr.prrelid AND attnum = prattrs[s])\n" + " ELSE NULL END) prattrs " + "FROM pg_catalog.pg_publication_rel pr"); else appendPQExpBufferStr(query, "SELECT tableoid, oid, prpubid, prrelid, " - "NULL AS prrelqual " + "NULL AS prrelqual, NULL AS prattrs " "FROM pg_catalog.pg_publication_rel"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -4160,6 +4169,7 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables) i_prpubid = PQfnumber(res, "prpubid"); i_prrelid = PQfnumber(res, "prrelid"); i_prrelqual = PQfnumber(res, "prrelqual"); + i_prattrs = PQfnumber(res, "prattrs"); /* this allocation may be more than we need */ pubrinfo = pg_malloc(ntups * sizeof(PublicationRelInfo)); @@ -4205,6 +4215,28 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables) else pubrinfo[j].pubrelqual = pg_strdup(PQgetvalue(res, i, i_prrelqual)); + if (!PQgetisnull(res, i, i_prattrs)) + { + char **attnames; + int nattnames; + PQExpBuffer attribs; + + if (!parsePGArray(PQgetvalue(res, i, i_prattrs), + &attnames, &nattnames)) + fatal("could not parse %s array", "prattrs"); + attribs = createPQExpBuffer(); + for (int k = 0; k < nattnames; k++) + { + if (k > 0) + appendPQExpBufferStr(attribs, ", "); + + appendPQExpBufferStr(attribs, fmtId(attnames[k])); + } + pubrinfo[j].pubrattrs = attribs->data; + } + else + pubrinfo[j].pubrattrs = NULL; + /* Decide whether we want to dump it */ selectDumpablePublicationObject(&(pubrinfo[j].dobj), fout); @@ -4300,6 +4332,9 @@ dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo) appendPQExpBuffer(query, " %s", fmtQualifiedDumpable(tbinfo)); + if (pubrinfo->pubrattrs) + appendPQExpBuffer(query, " (%s)", pubrinfo->pubrattrs); + if (pubrinfo->pubrelqual) { /* diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 893725d121..688093c55e 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -634,6 +634,7 @@ typedef struct _PublicationRelInfo PublicationInfo *publication; TableInfo *pubtable; char *pubrelqual; + char *pubrattrs; } PublicationRelInfo; /* diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index 0e724b0366..af5d6fa5a3 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -2438,6 +2438,28 @@ unlike => { exclude_dump_test_schema => 1, }, }, + 'ALTER PUBLICATION pub1 ADD TABLE test_sixth_table (col3, col2)' => { + create_order => 52, + create_sql => + 'ALTER PUBLICATION pub1 ADD TABLE dump_test.test_sixth_table (col3, col2);', + regexp => qr/^ + \QALTER PUBLICATION pub1 ADD TABLE ONLY dump_test.test_sixth_table (col2, col3);\E + /xm, + like => { %full_runs, section_post_data => 1, }, + unlike => { exclude_dump_test_schema => 1, }, + }, + + 'ALTER PUBLICATION pub1 ADD TABLE test_seventh_table (col3, col2) WHERE (col1 = 1)' => { + create_order => 52, + create_sql => + 'ALTER PUBLICATION pub1 ADD TABLE dump_test.test_seventh_table (col3, col2) WHERE (col1 = 1);', + regexp => qr/^ + \QALTER PUBLICATION pub1 ADD TABLE ONLY dump_test.test_seventh_table (col2, col3) WHERE ((col1 = 1));\E + /xm, + like => { %full_runs, section_post_data => 1, }, + unlike => { exclude_dump_test_schema => 1, }, + }, + 'ALTER PUBLICATION pub3 ADD ALL TABLES IN SCHEMA dump_test' => { create_order => 51, create_sql => @@ -2809,6 +2831,44 @@ unlike => { exclude_dump_test_schema => 1, }, }, + 'CREATE TABLE test_sixth_table' => { + create_order => 6, + create_sql => 'CREATE TABLE dump_test.test_sixth_table ( + col1 int, + col2 text, + col3 bytea + );', + regexp => qr/^ + \QCREATE TABLE dump_test.test_sixth_table (\E + \n\s+\Qcol1 integer,\E + \n\s+\Qcol2 text,\E + \n\s+\Qcol3 bytea\E + \n\); + /xm, + like => + { %full_runs, %dump_test_schema_runs, section_pre_data => 1, }, + unlike => { exclude_dump_test_schema => 1, }, + }, + + 'CREATE TABLE test_seventh_table' => { + create_order => 6, + create_sql => 'CREATE TABLE dump_test.test_seventh_table ( + col1 int, + col2 text, + col3 bytea + );', + regexp => qr/^ + \QCREATE TABLE dump_test.test_seventh_table (\E + \n\s+\Qcol1 integer,\E + \n\s+\Qcol2 text,\E + \n\s+\Qcol3 bytea\E + \n\); + /xm, + like => + { %full_runs, %dump_test_schema_runs, section_pre_data => 1, }, + unlike => { exclude_dump_test_schema => 1, }, + }, + 'CREATE TABLE test_table_identity' => { create_order => 3, create_sql => 'CREATE TABLE dump_test.test_table_identity ( diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index b8a532a45f..4dddf08789 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -2960,6 +2960,7 @@ describeOneTableDetails(const char *schemaname, printfPQExpBuffer(&buf, "SELECT pubname\n" " , NULL\n" + " , NULL\n" "FROM pg_catalog.pg_publication p\n" " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" " JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid\n" @@ -2967,6 +2968,12 @@ describeOneTableDetails(const char *schemaname, "UNION\n" "SELECT pubname\n" " , pg_get_expr(pr.prqual, c.oid)\n" + " , (CASE WHEN pr.prattrs IS NOT NULL THEN\n" + " (SELECT string_agg(attname, ', ')\n" + " FROM pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,\n" + " pg_catalog.pg_attribute\n" + " WHERE attrelid = pr.prrelid AND attnum = prattrs[s])\n" + " ELSE NULL END) " "FROM pg_catalog.pg_publication p\n" " JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n" " JOIN pg_catalog.pg_class c ON c.oid = pr.prrelid\n" @@ -2974,6 +2981,7 @@ describeOneTableDetails(const char *schemaname, "UNION\n" "SELECT pubname\n" " , NULL\n" + " , NULL\n" "FROM pg_catalog.pg_publication p\n" "WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n" "ORDER BY 1;", @@ -2984,12 +2992,14 @@ describeOneTableDetails(const char *schemaname, printfPQExpBuffer(&buf, "SELECT pubname\n" " , NULL\n" + " , NULL\n" "FROM pg_catalog.pg_publication p\n" "JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n" "WHERE pr.prrelid = '%s'\n" "UNION ALL\n" "SELECT pubname\n" " , NULL\n" + " , NULL\n" "FROM pg_catalog.pg_publication p\n" "WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n" "ORDER BY 1;", @@ -3011,6 +3021,11 @@ describeOneTableDetails(const char *schemaname, printfPQExpBuffer(&buf, " \"%s\"", PQgetvalue(result, i, 0)); + /* column list (if any) */ + if (!PQgetisnull(result, i, 2)) + appendPQExpBuffer(&buf, " (%s)", + PQgetvalue(result, i, 2)); + /* row filter (if any) */ if (!PQgetisnull(result, i, 1)) appendPQExpBuffer(&buf, " WHERE %s", @@ -5979,7 +5994,7 @@ listPublications(const char *pattern) */ static bool addFooterToPublicationDesc(PQExpBuffer buf, char *footermsg, - bool singlecol, printTableContent *cont) + bool as_schema, printTableContent *cont) { PGresult *res; int count = 0; @@ -5996,15 +6011,19 @@ addFooterToPublicationDesc(PQExpBuffer buf, char *footermsg, for (i = 0; i < count; i++) { - if (!singlecol) + if (as_schema) + printfPQExpBuffer(buf, " \"%s\"", PQgetvalue(res, i, 0)); + else { printfPQExpBuffer(buf, " \"%s.%s\"", PQgetvalue(res, i, 0), PQgetvalue(res, i, 1)); + + if (!PQgetisnull(res, i, 3)) + appendPQExpBuffer(buf, " (%s)", PQgetvalue(res, i, 3)); + if (!PQgetisnull(res, i, 2)) appendPQExpBuffer(buf, " WHERE %s", PQgetvalue(res, i, 2)); } - else - printfPQExpBuffer(buf, " \"%s\"", PQgetvalue(res, i, 0)); printTableAddFooter(cont, buf->data); } @@ -6155,11 +6174,22 @@ describePublications(const char *pattern) printfPQExpBuffer(&buf, "SELECT n.nspname, c.relname"); if (pset.sversion >= 150000) + { appendPQExpBufferStr(&buf, ", pg_get_expr(pr.prqual, c.oid)"); + appendPQExpBufferStr(&buf, + ", (CASE WHEN pr.prattrs IS NOT NULL THEN\n" + " pg_catalog.array_to_string(" + " ARRAY(SELECT attname\n" + " FROM\n" + " pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,\n" + " pg_catalog.pg_attribute\n" + " WHERE attrelid = c.oid AND attnum = prattrs[s]), ', ')\n" + " ELSE NULL END)"); + } else appendPQExpBufferStr(&buf, - ", NULL"); + ", NULL, NULL"); appendPQExpBuffer(&buf, "\nFROM pg_catalog.pg_class c,\n" " pg_catalog.pg_namespace n,\n" @@ -6189,9 +6219,9 @@ describePublications(const char *pattern) if (!puballsequences) { - /* Get the tables for the specified publication */ + /* Get the sequences for the specified publication */ printfPQExpBuffer(&buf, - "SELECT n.nspname, c.relname, NULL\n" + "SELECT n.nspname, c.relname, NULL, NULL\n" "FROM pg_catalog.pg_class c,\n" " pg_catalog.pg_namespace n,\n" " pg_catalog.pg_publication_rel pr\n" diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h index 97f26208e1..186d8ea74b 100644 --- a/src/include/catalog/pg_publication.h +++ b/src/include/catalog/pg_publication.h @@ -95,6 +95,13 @@ typedef struct PublicationDesc */ bool rf_valid_for_update; bool rf_valid_for_delete; + + /* + * true if the columns are part of the replica identity or the publication actions + * do not include UPDATE or DELETE. + */ + bool cols_valid_for_update; + bool cols_valid_for_delete; } PublicationDesc; typedef struct Publication @@ -111,6 +118,7 @@ typedef struct PublicationRelInfo { Relation relation; Node *whereClause; + List *columns; } PublicationRelInfo; extern Publication *GetPublication(Oid pubid); @@ -137,6 +145,7 @@ extern List *GetPublicationRelations(Oid pubid, char objectType, PublicationPartOpt pub_partopt); extern List *GetAllTablesPublications(void); extern List *GetAllTablesPublicationRelations(bool pubviaroot); +extern void GetActionsInPublication(Oid pubid, PublicationActions *actions); extern List *GetPublicationSchemas(Oid pubid, char objectType); extern List *GetSchemaPublications(Oid schemaid, char objectType); extern List *GetSchemaPublicationRelations(Oid schemaid, char objectType, @@ -160,6 +169,9 @@ extern ObjectAddress publication_add_schema(Oid pubid, Oid schemaid, char objectType, bool if_not_exists); +extern Bitmapset *pub_collist_to_bitmapset(Bitmapset *columns, Datum pubcols, + MemoryContext mcxt); + extern Oid get_publication_oid(const char *pubname, bool missing_ok); extern char *get_publication_name(Oid pubid, bool missing_ok); diff --git a/src/include/catalog/pg_publication_rel.h b/src/include/catalog/pg_publication_rel.h index 0dd0f425db..4feb581899 100644 --- a/src/include/catalog/pg_publication_rel.h +++ b/src/include/catalog/pg_publication_rel.h @@ -34,6 +34,7 @@ CATALOG(pg_publication_rel,6106,PublicationRelRelationId) #ifdef CATALOG_VARLEN /* variable-length fields start here */ pg_node_tree prqual; /* qualifications */ + int2vector prattrs; /* columns to replicate */ #endif } FormData_pg_publication_rel; diff --git a/src/include/commands/publicationcmds.h b/src/include/commands/publicationcmds.h index 7813cbcb6b..ae87caf089 100644 --- a/src/include/commands/publicationcmds.h +++ b/src/include/commands/publicationcmds.h @@ -31,7 +31,9 @@ extern void RemovePublicationSchemaById(Oid psoid); extern ObjectAddress AlterPublicationOwner(const char *name, Oid newOwnerId); extern void AlterPublicationOwner_oid(Oid pubid, Oid newOwnerId); extern void InvalidatePublicationRels(List *relids); -extern bool contain_invalid_rfcolumn(Oid pubid, Relation relation, +extern bool pub_rf_contains_invalid_column(Oid pubid, Relation relation, + List *ancestors, bool pubviaroot); +extern bool pub_collist_contains_invalid_column(Oid pubid, Relation relation, List *ancestors, bool pubviaroot); #endif /* PUBLICATIONCMDS_H */ diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index cb1fcc0ee3..5a458c42e5 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3654,6 +3654,7 @@ typedef struct PublicationTable NodeTag type; RangeVar *relation; /* relation to be published */ Node *whereClause; /* qualifications */ + List *columns; /* List of columns in a publication table */ } PublicationTable; /* diff --git a/src/include/replication/logicalproto.h b/src/include/replication/logicalproto.h index fb86ca022d..13ee10fdd4 100644 --- a/src/include/replication/logicalproto.h +++ b/src/include/replication/logicalproto.h @@ -222,12 +222,12 @@ extern char *logicalrep_read_origin(StringInfo in, XLogRecPtr *origin_lsn); extern void logicalrep_write_insert(StringInfo out, TransactionId xid, Relation rel, TupleTableSlot *newslot, - bool binary); + bool binary, Bitmapset *columns); extern LogicalRepRelId logicalrep_read_insert(StringInfo in, LogicalRepTupleData *newtup); extern void logicalrep_write_update(StringInfo out, TransactionId xid, Relation rel, TupleTableSlot *oldslot, - TupleTableSlot *newslot, bool binary); + TupleTableSlot *newslot, bool binary, Bitmapset *columns); extern LogicalRepRelId logicalrep_read_update(StringInfo in, bool *has_oldtuple, LogicalRepTupleData *oldtup, LogicalRepTupleData *newtup); @@ -250,7 +250,7 @@ extern void logicalrep_write_sequence(StringInfo out, Relation rel, bool is_called); extern void logicalrep_read_sequence(StringInfo in, LogicalRepSequence *seqdata); extern void logicalrep_write_rel(StringInfo out, TransactionId xid, - Relation rel); + Relation rel, Bitmapset *columns); extern LogicalRepRelation *logicalrep_read_rel(StringInfo in); extern void logicalrep_write_typ(StringInfo out, TransactionId xid, Oid typoid); diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index a5a519d6c8..0308e40ba6 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -1137,6 +1137,369 @@ DROP TABLE rf_tbl_abcd_pk; DROP TABLE rf_tbl_abcd_nopk; DROP TABLE rf_tbl_abcd_part_pk; -- ====================================================== +-- fail - duplicate tables are not allowed if that table has any column lists +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_dups FOR TABLE testpub_tbl1 (a), testpub_tbl1 WITH (publish = 'insert'); +ERROR: conflicting or redundant column lists for table "testpub_tbl1" +CREATE PUBLICATION testpub_dups FOR TABLE testpub_tbl1, testpub_tbl1 (a) WITH (publish = 'insert'); +ERROR: conflicting or redundant column lists for table "testpub_tbl1" +RESET client_min_messages; +-- test for column lists +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_fortable FOR TABLE testpub_tbl1; +CREATE PUBLICATION testpub_fortable_insert WITH (publish = 'insert'); +RESET client_min_messages; +CREATE TABLE testpub_tbl5 (a int PRIMARY KEY, b text, c text, + d int generated always as (a + length(b)) stored); +-- error: column "x" does not exist +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, x); +ERROR: column "x" of relation "testpub_tbl5" does not exist +-- error: replica identity "a" not included in the column list +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (b, c); +UPDATE testpub_tbl5 SET a = 1; +ERROR: cannot update table "testpub_tbl5" +DETAIL: Column list used by the publication does not cover the replica identity. +ALTER PUBLICATION testpub_fortable DROP TABLE testpub_tbl5; +-- error: generated column "d" can't be in list +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, d); +ERROR: cannot reference generated column "d" in publication column list +-- error: system attributes "ctid" not allowed in column list +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, ctid); +ERROR: cannot reference system column "ctid" in publication column list +-- ok +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, c); +ALTER TABLE testpub_tbl5 DROP COLUMN c; -- no dice +ERROR: cannot drop column c of table testpub_tbl5 because other objects depend on it +DETAIL: publication of table testpub_tbl5 in publication testpub_fortable depends on column c of table testpub_tbl5 +HINT: Use DROP ... CASCADE to drop the dependent objects too. +-- ok: for insert-only publication, any column list is acceptable +ALTER PUBLICATION testpub_fortable_insert ADD TABLE testpub_tbl5 (b, c); +/* not all replica identities are good enough */ +CREATE UNIQUE INDEX testpub_tbl5_b_key ON testpub_tbl5 (b, c); +ALTER TABLE testpub_tbl5 ALTER b SET NOT NULL, ALTER c SET NOT NULL; +ALTER TABLE testpub_tbl5 REPLICA IDENTITY USING INDEX testpub_tbl5_b_key; +-- error: replica identity (b,c) is not covered by column list (a, c) +UPDATE testpub_tbl5 SET a = 1; +ERROR: cannot update table "testpub_tbl5" +DETAIL: Column list used by the publication does not cover the replica identity. +ALTER PUBLICATION testpub_fortable DROP TABLE testpub_tbl5; +-- error: change the replica identity to "b", and column list to (a, c) +-- then update fails, because (a, c) does not cover replica identity +ALTER TABLE testpub_tbl5 REPLICA IDENTITY USING INDEX testpub_tbl5_b_key; +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, c); +UPDATE testpub_tbl5 SET a = 1; +ERROR: cannot update table "testpub_tbl5" +DETAIL: Column list used by the publication does not cover the replica identity. +/* But if upd/del are not published, it works OK */ +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_table_ins WITH (publish = 'insert, truncate'); +RESET client_min_messages; +ALTER PUBLICATION testpub_table_ins ADD TABLE testpub_tbl5 (a); -- ok +\dRp+ testpub_table_ins + Publication testpub_table_ins + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | f | f | t | f | f +Tables: + "public.testpub_tbl5" (a) + +-- tests with REPLICA IDENTITY FULL +CREATE TABLE testpub_tbl6 (a int, b text, c text); +ALTER TABLE testpub_tbl6 REPLICA IDENTITY FULL; +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl6 (a, b, c); +UPDATE testpub_tbl6 SET a = 1; +ERROR: cannot update table "testpub_tbl6" +DETAIL: Column list used by the publication does not cover the replica identity. +ALTER PUBLICATION testpub_fortable DROP TABLE testpub_tbl6; +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl6; -- ok +UPDATE testpub_tbl6 SET a = 1; +-- make sure changing the column list is propagated to the catalog +CREATE TABLE testpub_tbl7 (a int primary key, b text, c text); +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl7 (a, b); +\d+ testpub_tbl7 + Table "public.testpub_tbl7" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | not null | | plain | | + b | text | | | | extended | | + c | text | | | | extended | | +Indexes: + "testpub_tbl7_pkey" PRIMARY KEY, btree (a) +Publications: + "testpub_fortable" (a, b) + +-- ok: the column list is the same, we should skip this table (or at least not fail) +ALTER PUBLICATION testpub_fortable SET TABLE testpub_tbl7 (a, b); +\d+ testpub_tbl7 + Table "public.testpub_tbl7" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | not null | | plain | | + b | text | | | | extended | | + c | text | | | | extended | | +Indexes: + "testpub_tbl7_pkey" PRIMARY KEY, btree (a) +Publications: + "testpub_fortable" (a, b) + +-- ok: the column list changes, make sure the catalog gets updated +ALTER PUBLICATION testpub_fortable SET TABLE testpub_tbl7 (a, c); +\d+ testpub_tbl7 + Table "public.testpub_tbl7" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | not null | | plain | | + b | text | | | | extended | | + c | text | | | | extended | | +Indexes: + "testpub_tbl7_pkey" PRIMARY KEY, btree (a) +Publications: + "testpub_fortable" (a, c) + +-- column list for partitioned tables has to cover replica identities for +-- all child relations +CREATE TABLE testpub_tbl8 (a int, b text, c text) PARTITION BY HASH (a); +-- first partition has replica identity "a" +CREATE TABLE testpub_tbl8_0 PARTITION OF testpub_tbl8 FOR VALUES WITH (modulus 2, remainder 0); +ALTER TABLE testpub_tbl8_0 ADD PRIMARY KEY (a); +ALTER TABLE testpub_tbl8_0 REPLICA IDENTITY USING INDEX testpub_tbl8_0_pkey; +-- second partition has replica identity "b" +CREATE TABLE testpub_tbl8_1 PARTITION OF testpub_tbl8 FOR VALUES WITH (modulus 2, remainder 1); +ALTER TABLE testpub_tbl8_1 ADD PRIMARY KEY (b); +ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey; +-- ok: column list covers both "a" and "b" +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_col_list FOR TABLE testpub_tbl8 (a, b) WITH (publish_via_partition_root = 'true'); +RESET client_min_messages; +-- ok: the same thing, but try plain ADD TABLE +ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8; +ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, b); +UPDATE testpub_tbl8 SET a = 1; +-- failure: column list does not cover replica identity for the second partition +ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8; +ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, c); +UPDATE testpub_tbl8 SET a = 1; +ERROR: cannot update table "testpub_tbl8_1" +DETAIL: Column list used by the publication does not cover the replica identity. +ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8; +-- failure: one of the partitions has REPLICA IDENTITY FULL +ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY FULL; +ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, c); +UPDATE testpub_tbl8 SET a = 1; +ERROR: cannot update table "testpub_tbl8_1" +DETAIL: Column list used by the publication does not cover the replica identity. +ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8; +-- add table and then try changing replica identity +ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey; +ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, b); +-- failure: replica identity full can't be used with a column list +ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY FULL; +UPDATE testpub_tbl8 SET a = 1; +ERROR: cannot update table "testpub_tbl8_1" +DETAIL: Column list used by the publication does not cover the replica identity. +-- failure: replica identity has to be covered by the column list +ALTER TABLE testpub_tbl8_1 DROP CONSTRAINT testpub_tbl8_1_pkey; +ALTER TABLE testpub_tbl8_1 ADD PRIMARY KEY (c); +ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey; +UPDATE testpub_tbl8 SET a = 1; +ERROR: cannot update table "testpub_tbl8_1" +DETAIL: Column list used by the publication does not cover the replica identity. +DROP TABLE testpub_tbl8; +-- column list for partitioned tables has to cover replica identities for +-- all child relations +CREATE TABLE testpub_tbl8 (a int, b text, c text) PARTITION BY HASH (a); +ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, b); +-- first partition has replica identity "a" +CREATE TABLE testpub_tbl8_0 (a int, b text, c text); +ALTER TABLE testpub_tbl8_0 ADD PRIMARY KEY (a); +ALTER TABLE testpub_tbl8_0 REPLICA IDENTITY USING INDEX testpub_tbl8_0_pkey; +-- second partition has replica identity "b" +CREATE TABLE testpub_tbl8_1 (a int, b text, c text); +ALTER TABLE testpub_tbl8_1 ADD PRIMARY KEY (c); +ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey; +-- ok: attaching first partition works, because (a) is in column list +ALTER TABLE testpub_tbl8 ATTACH PARTITION testpub_tbl8_0 FOR VALUES WITH (modulus 2, remainder 0); +-- failure: second partition has replica identity (c), which si not in column list +ALTER TABLE testpub_tbl8 ATTACH PARTITION testpub_tbl8_1 FOR VALUES WITH (modulus 2, remainder 1); +UPDATE testpub_tbl8 SET a = 1; +ERROR: cannot update table "testpub_tbl8_1" +DETAIL: Column list used by the publication does not cover the replica identity. +-- failure: changing replica identity to FULL for partition fails, because +-- of the column list on the parent +ALTER TABLE testpub_tbl8_0 REPLICA IDENTITY FULL; +UPDATE testpub_tbl8 SET a = 1; +ERROR: cannot update table "testpub_tbl8_0" +DETAIL: Column list used by the publication does not cover the replica identity. +DROP TABLE testpub_tbl5, testpub_tbl6, testpub_tbl7, testpub_tbl8, testpub_tbl8_1; +DROP PUBLICATION testpub_table_ins, testpub_fortable, testpub_fortable_insert, testpub_col_list; +-- ====================================================== +-- Test combination of column list and row filter +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_both_filters; +RESET client_min_messages; +CREATE TABLE testpub_tbl_both_filters (a int, b int, c int, PRIMARY KEY (a,c)); +ALTER TABLE testpub_tbl_both_filters REPLICA IDENTITY USING INDEX testpub_tbl_both_filters_pkey; +ALTER PUBLICATION testpub_both_filters ADD TABLE testpub_tbl_both_filters (a,c) WHERE (c != 1); +\dRp+ testpub_both_filters + Publication testpub_both_filters + Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root +--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- + regress_publication_user | f | f | t | t | t | t | t | f +Tables: + "public.testpub_tbl_both_filters" (a, c) WHERE (c <> 1) + +\d+ testpub_tbl_both_filters + Table "public.testpub_tbl_both_filters" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | not null | | plain | | + b | integer | | | | plain | | + c | integer | | not null | | plain | | +Indexes: + "testpub_tbl_both_filters_pkey" PRIMARY KEY, btree (a, c) REPLICA IDENTITY +Publications: + "testpub_both_filters" (a, c) WHERE (c <> 1) + +DROP TABLE testpub_tbl_both_filters; +DROP PUBLICATION testpub_both_filters; +-- ====================================================== +-- More column list tests for validating column references +CREATE TABLE rf_tbl_abcd_nopk(a int, b int, c int, d int); +CREATE TABLE rf_tbl_abcd_pk(a int, b int, c int, d int, PRIMARY KEY(a,b)); +CREATE TABLE rf_tbl_abcd_part_pk (a int PRIMARY KEY, b int) PARTITION by RANGE (a); +CREATE TABLE rf_tbl_abcd_part_pk_1 (b int, a int PRIMARY KEY); +ALTER TABLE rf_tbl_abcd_part_pk ATTACH PARTITION rf_tbl_abcd_part_pk_1 FOR VALUES FROM (1) TO (10); +-- Case 1. REPLICA IDENTITY DEFAULT (means use primary key or nothing) +-- 1a. REPLICA IDENTITY is DEFAULT and table has a PK. +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub6 FOR TABLE rf_tbl_abcd_pk (a, b); +RESET client_min_messages; +-- ok - (a,b) coverts all PK cols +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a, b, c); +-- ok - (a,b,c) coverts all PK cols +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a); +-- fail - "b" is missing from the column list +UPDATE rf_tbl_abcd_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_pk" +DETAIL: Column list used by the publication does not cover the replica identity. +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (b); +-- fail - "a" is missing from the column list +UPDATE rf_tbl_abcd_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_pk" +DETAIL: Column list used by the publication does not cover the replica identity. +-- 1b. REPLICA IDENTITY is DEFAULT and table has no PK +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (a); +-- ok - there's no replica identity, so any column list works +-- note: it fails anyway, just a bit later because UPDATE requires RI +UPDATE rf_tbl_abcd_nopk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_nopk" because it does not have a replica identity and publishes updates +HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. +-- Case 2. REPLICA IDENTITY FULL +ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY FULL; +ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY FULL; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (c); +-- fail - with REPLICA IDENTITY FULL no column list is allowed +UPDATE rf_tbl_abcd_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_pk" +DETAIL: Column list used by the publication does not cover the replica identity. +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (a, b, c, d); +-- fail - with REPLICA IDENTITY FULL no column list is allowed +UPDATE rf_tbl_abcd_nopk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_nopk" +DETAIL: Column list used by the publication does not cover the replica identity. +-- Case 3. REPLICA IDENTITY NOTHING +ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY NOTHING; +ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY NOTHING; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a); +-- ok - REPLICA IDENTITY NOTHING means all column lists are valid +-- it still fails later because without RI we can't replicate updates +UPDATE rf_tbl_abcd_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_pk" because it does not have a replica identity and publishes updates +HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a, b, c, d); +-- ok - REPLICA IDENTITY NOTHING means all column lists are valid +-- it still fails later because without RI we can't replicate updates +UPDATE rf_tbl_abcd_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_pk" because it does not have a replica identity and publishes updates +HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (d); +-- ok - REPLICA IDENTITY NOTHING means all column lists are valid +-- it still fails later because without RI we can't replicate updates +UPDATE rf_tbl_abcd_nopk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_nopk" because it does not have a replica identity and publishes updates +HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. +-- Case 4. REPLICA IDENTITY INDEX +ALTER TABLE rf_tbl_abcd_pk ALTER COLUMN c SET NOT NULL; +CREATE UNIQUE INDEX idx_abcd_pk_c ON rf_tbl_abcd_pk(c); +ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY USING INDEX idx_abcd_pk_c; +ALTER TABLE rf_tbl_abcd_nopk ALTER COLUMN c SET NOT NULL; +CREATE UNIQUE INDEX idx_abcd_nopk_c ON rf_tbl_abcd_nopk(c); +ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY USING INDEX idx_abcd_nopk_c; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a); +-- fail - column list "a" does not cover the REPLICA IDENTITY INDEX on "c" +UPDATE rf_tbl_abcd_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_pk" +DETAIL: Column list used by the publication does not cover the replica identity. +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (c); +-- ok - column list "c" does cover the REPLICA IDENTITY INDEX on "c" +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (a); +-- fail - column list "a" does not cover the REPLICA IDENTITY INDEX on "c" +UPDATE rf_tbl_abcd_nopk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_nopk" +DETAIL: Column list used by the publication does not cover the replica identity. +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (c); +-- ok - column list "c" does cover the REPLICA IDENTITY INDEX on "c" +UPDATE rf_tbl_abcd_nopk SET a = 1; +-- Tests for partitioned table +-- set PUBLISH_VIA_PARTITION_ROOT to false and test column list for partitioned +-- table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +-- fail - cannot use column list for partitioned table +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk (a); +ERROR: cannot use publication column list for relation "rf_tbl_abcd_part_pk" +DETAIL: column list cannot be used for a partitioned table when publish_via_partition_root is false. +-- ok - can use column list for partition +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 (a); +-- ok - "a" is a PK col +UPDATE rf_tbl_abcd_part_pk SET a = 1; +-- set PUBLISH_VIA_PARTITION_ROOT to true and test column list for partitioned +-- table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=1); +-- ok - can use column list for partitioned table +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk (a); +-- ok - "a" is a PK col +UPDATE rf_tbl_abcd_part_pk SET a = 1; +-- fail - cannot set PUBLISH_VIA_PARTITION_ROOT to false if any column list is +-- used for partitioned table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +ERROR: cannot set publish_via_partition_root = false for publication "testpub6" +DETAIL: The publication contains a column list for a partitioned table "rf_tbl_abcd_part_pk" which is not allowed when publish_via_partition_root is false. +-- Now change the root column list to use a column "b" +-- (which is not in the replica identity) +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 (b); +-- ok - we don't have column list for partitioned table. +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +-- fail - "b" is not in REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_part_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_part_pk_1" +DETAIL: Column list used by the publication does not cover the replica identity. +-- set PUBLISH_VIA_PARTITION_ROOT to true +-- can use column list for partitioned table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=1); +-- ok - can use column list for partitioned table +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk (b); +-- fail - "b" is not in REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_part_pk SET a = 1; +ERROR: cannot update table "rf_tbl_abcd_part_pk_1" +DETAIL: Column list used by the publication does not cover the replica identity. +DROP PUBLICATION testpub6; +DROP TABLE rf_tbl_abcd_pk; +DROP TABLE rf_tbl_abcd_nopk; +DROP TABLE rf_tbl_abcd_part_pk; +-- ====================================================== -- Test cache invalidation FOR ALL TABLES publication SET client_min_messages = 'ERROR'; CREATE TABLE testpub_tbl4(a int); @@ -1582,6 +1945,15 @@ ALTER PUBLICATION testpub1_forschema SET ALL TABLES IN SCHEMA pub_test1, pub_tes Tables from schemas: "pub_test1" +-- Verify that it fails to add a schema with a column specification +ALTER PUBLICATION testpub1_forschema ADD ALL TABLES IN SCHEMA foo (a, b); +ERROR: syntax error at or near "(" +LINE 1: ...TION testpub1_forschema ADD ALL TABLES IN SCHEMA foo (a, b); + ^ +ALTER PUBLICATION testpub1_forschema ADD ALL TABLES IN SCHEMA foo, bar (a, b); +ERROR: column specification not allowed for schema +LINE 1: ... testpub1_forschema ADD ALL TABLES IN SCHEMA foo, bar (a, b)... + ^ -- cleanup pub_test1 schema for invalidation tests ALTER PUBLICATION testpub2_forschema DROP ALL TABLES IN SCHEMA pub_test1; DROP PUBLICATION testpub3_forschema, testpub4_forschema, testpub5_forschema, testpub6_forschema, testpub_fortable; diff --git a/src/test/regress/sql/publication.sql b/src/test/regress/sql/publication.sql index 151b8be14e..96b02947fa 100644 --- a/src/test/regress/sql/publication.sql +++ b/src/test/regress/sql/publication.sql @@ -568,6 +568,289 @@ DROP TABLE rf_tbl_abcd_nopk; DROP TABLE rf_tbl_abcd_part_pk; -- ====================================================== +-- fail - duplicate tables are not allowed if that table has any column lists +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_dups FOR TABLE testpub_tbl1 (a), testpub_tbl1 WITH (publish = 'insert'); +CREATE PUBLICATION testpub_dups FOR TABLE testpub_tbl1, testpub_tbl1 (a) WITH (publish = 'insert'); +RESET client_min_messages; + +-- test for column lists +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_fortable FOR TABLE testpub_tbl1; +CREATE PUBLICATION testpub_fortable_insert WITH (publish = 'insert'); +RESET client_min_messages; +CREATE TABLE testpub_tbl5 (a int PRIMARY KEY, b text, c text, + d int generated always as (a + length(b)) stored); +-- error: column "x" does not exist +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, x); +-- error: replica identity "a" not included in the column list +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (b, c); +UPDATE testpub_tbl5 SET a = 1; +ALTER PUBLICATION testpub_fortable DROP TABLE testpub_tbl5; +-- error: generated column "d" can't be in list +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, d); +-- error: system attributes "ctid" not allowed in column list +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, ctid); +-- ok +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, c); +ALTER TABLE testpub_tbl5 DROP COLUMN c; -- no dice +-- ok: for insert-only publication, any column list is acceptable +ALTER PUBLICATION testpub_fortable_insert ADD TABLE testpub_tbl5 (b, c); + +/* not all replica identities are good enough */ +CREATE UNIQUE INDEX testpub_tbl5_b_key ON testpub_tbl5 (b, c); +ALTER TABLE testpub_tbl5 ALTER b SET NOT NULL, ALTER c SET NOT NULL; +ALTER TABLE testpub_tbl5 REPLICA IDENTITY USING INDEX testpub_tbl5_b_key; +-- error: replica identity (b,c) is not covered by column list (a, c) +UPDATE testpub_tbl5 SET a = 1; +ALTER PUBLICATION testpub_fortable DROP TABLE testpub_tbl5; + +-- error: change the replica identity to "b", and column list to (a, c) +-- then update fails, because (a, c) does not cover replica identity +ALTER TABLE testpub_tbl5 REPLICA IDENTITY USING INDEX testpub_tbl5_b_key; +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, c); +UPDATE testpub_tbl5 SET a = 1; + +/* But if upd/del are not published, it works OK */ +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_table_ins WITH (publish = 'insert, truncate'); +RESET client_min_messages; +ALTER PUBLICATION testpub_table_ins ADD TABLE testpub_tbl5 (a); -- ok +\dRp+ testpub_table_ins + +-- tests with REPLICA IDENTITY FULL +CREATE TABLE testpub_tbl6 (a int, b text, c text); +ALTER TABLE testpub_tbl6 REPLICA IDENTITY FULL; + +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl6 (a, b, c); +UPDATE testpub_tbl6 SET a = 1; +ALTER PUBLICATION testpub_fortable DROP TABLE testpub_tbl6; + +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl6; -- ok +UPDATE testpub_tbl6 SET a = 1; + +-- make sure changing the column list is propagated to the catalog +CREATE TABLE testpub_tbl7 (a int primary key, b text, c text); +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl7 (a, b); +\d+ testpub_tbl7 +-- ok: the column list is the same, we should skip this table (or at least not fail) +ALTER PUBLICATION testpub_fortable SET TABLE testpub_tbl7 (a, b); +\d+ testpub_tbl7 +-- ok: the column list changes, make sure the catalog gets updated +ALTER PUBLICATION testpub_fortable SET TABLE testpub_tbl7 (a, c); +\d+ testpub_tbl7 + +-- column list for partitioned tables has to cover replica identities for +-- all child relations +CREATE TABLE testpub_tbl8 (a int, b text, c text) PARTITION BY HASH (a); +-- first partition has replica identity "a" +CREATE TABLE testpub_tbl8_0 PARTITION OF testpub_tbl8 FOR VALUES WITH (modulus 2, remainder 0); +ALTER TABLE testpub_tbl8_0 ADD PRIMARY KEY (a); +ALTER TABLE testpub_tbl8_0 REPLICA IDENTITY USING INDEX testpub_tbl8_0_pkey; +-- second partition has replica identity "b" +CREATE TABLE testpub_tbl8_1 PARTITION OF testpub_tbl8 FOR VALUES WITH (modulus 2, remainder 1); +ALTER TABLE testpub_tbl8_1 ADD PRIMARY KEY (b); +ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey; + +-- ok: column list covers both "a" and "b" +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_col_list FOR TABLE testpub_tbl8 (a, b) WITH (publish_via_partition_root = 'true'); +RESET client_min_messages; + +-- ok: the same thing, but try plain ADD TABLE +ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8; +ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, b); +UPDATE testpub_tbl8 SET a = 1; + +-- failure: column list does not cover replica identity for the second partition +ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8; +ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, c); +UPDATE testpub_tbl8 SET a = 1; +ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8; + +-- failure: one of the partitions has REPLICA IDENTITY FULL +ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY FULL; +ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, c); +UPDATE testpub_tbl8 SET a = 1; +ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8; + +-- add table and then try changing replica identity +ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey; +ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, b); + +-- failure: replica identity full can't be used with a column list +ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY FULL; +UPDATE testpub_tbl8 SET a = 1; + +-- failure: replica identity has to be covered by the column list +ALTER TABLE testpub_tbl8_1 DROP CONSTRAINT testpub_tbl8_1_pkey; +ALTER TABLE testpub_tbl8_1 ADD PRIMARY KEY (c); +ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey; +UPDATE testpub_tbl8 SET a = 1; + +DROP TABLE testpub_tbl8; + +-- column list for partitioned tables has to cover replica identities for +-- all child relations +CREATE TABLE testpub_tbl8 (a int, b text, c text) PARTITION BY HASH (a); +ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, b); +-- first partition has replica identity "a" +CREATE TABLE testpub_tbl8_0 (a int, b text, c text); +ALTER TABLE testpub_tbl8_0 ADD PRIMARY KEY (a); +ALTER TABLE testpub_tbl8_0 REPLICA IDENTITY USING INDEX testpub_tbl8_0_pkey; +-- second partition has replica identity "b" +CREATE TABLE testpub_tbl8_1 (a int, b text, c text); +ALTER TABLE testpub_tbl8_1 ADD PRIMARY KEY (c); +ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey; + +-- ok: attaching first partition works, because (a) is in column list +ALTER TABLE testpub_tbl8 ATTACH PARTITION testpub_tbl8_0 FOR VALUES WITH (modulus 2, remainder 0); +-- failure: second partition has replica identity (c), which si not in column list +ALTER TABLE testpub_tbl8 ATTACH PARTITION testpub_tbl8_1 FOR VALUES WITH (modulus 2, remainder 1); +UPDATE testpub_tbl8 SET a = 1; + +-- failure: changing replica identity to FULL for partition fails, because +-- of the column list on the parent +ALTER TABLE testpub_tbl8_0 REPLICA IDENTITY FULL; +UPDATE testpub_tbl8 SET a = 1; + +DROP TABLE testpub_tbl5, testpub_tbl6, testpub_tbl7, testpub_tbl8, testpub_tbl8_1; +DROP PUBLICATION testpub_table_ins, testpub_fortable, testpub_fortable_insert, testpub_col_list; +-- ====================================================== + +-- Test combination of column list and row filter +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_both_filters; +RESET client_min_messages; +CREATE TABLE testpub_tbl_both_filters (a int, b int, c int, PRIMARY KEY (a,c)); +ALTER TABLE testpub_tbl_both_filters REPLICA IDENTITY USING INDEX testpub_tbl_both_filters_pkey; +ALTER PUBLICATION testpub_both_filters ADD TABLE testpub_tbl_both_filters (a,c) WHERE (c != 1); +\dRp+ testpub_both_filters +\d+ testpub_tbl_both_filters + +DROP TABLE testpub_tbl_both_filters; +DROP PUBLICATION testpub_both_filters; +-- ====================================================== + +-- More column list tests for validating column references +CREATE TABLE rf_tbl_abcd_nopk(a int, b int, c int, d int); +CREATE TABLE rf_tbl_abcd_pk(a int, b int, c int, d int, PRIMARY KEY(a,b)); +CREATE TABLE rf_tbl_abcd_part_pk (a int PRIMARY KEY, b int) PARTITION by RANGE (a); +CREATE TABLE rf_tbl_abcd_part_pk_1 (b int, a int PRIMARY KEY); +ALTER TABLE rf_tbl_abcd_part_pk ATTACH PARTITION rf_tbl_abcd_part_pk_1 FOR VALUES FROM (1) TO (10); + +-- Case 1. REPLICA IDENTITY DEFAULT (means use primary key or nothing) + +-- 1a. REPLICA IDENTITY is DEFAULT and table has a PK. +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub6 FOR TABLE rf_tbl_abcd_pk (a, b); +RESET client_min_messages; +-- ok - (a,b) coverts all PK cols +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a, b, c); +-- ok - (a,b,c) coverts all PK cols +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a); +-- fail - "b" is missing from the column list +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (b); +-- fail - "a" is missing from the column list +UPDATE rf_tbl_abcd_pk SET a = 1; + +-- 1b. REPLICA IDENTITY is DEFAULT and table has no PK +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (a); +-- ok - there's no replica identity, so any column list works +-- note: it fails anyway, just a bit later because UPDATE requires RI +UPDATE rf_tbl_abcd_nopk SET a = 1; + +-- Case 2. REPLICA IDENTITY FULL +ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY FULL; +ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY FULL; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (c); +-- fail - with REPLICA IDENTITY FULL no column list is allowed +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (a, b, c, d); +-- fail - with REPLICA IDENTITY FULL no column list is allowed +UPDATE rf_tbl_abcd_nopk SET a = 1; + +-- Case 3. REPLICA IDENTITY NOTHING +ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY NOTHING; +ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY NOTHING; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a); +-- ok - REPLICA IDENTITY NOTHING means all column lists are valid +-- it still fails later because without RI we can't replicate updates +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a, b, c, d); +-- ok - REPLICA IDENTITY NOTHING means all column lists are valid +-- it still fails later because without RI we can't replicate updates +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (d); +-- ok - REPLICA IDENTITY NOTHING means all column lists are valid +-- it still fails later because without RI we can't replicate updates +UPDATE rf_tbl_abcd_nopk SET a = 1; + +-- Case 4. REPLICA IDENTITY INDEX +ALTER TABLE rf_tbl_abcd_pk ALTER COLUMN c SET NOT NULL; +CREATE UNIQUE INDEX idx_abcd_pk_c ON rf_tbl_abcd_pk(c); +ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY USING INDEX idx_abcd_pk_c; +ALTER TABLE rf_tbl_abcd_nopk ALTER COLUMN c SET NOT NULL; +CREATE UNIQUE INDEX idx_abcd_nopk_c ON rf_tbl_abcd_nopk(c); +ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY USING INDEX idx_abcd_nopk_c; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a); +-- fail - column list "a" does not cover the REPLICA IDENTITY INDEX on "c" +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (c); +-- ok - column list "c" does cover the REPLICA IDENTITY INDEX on "c" +UPDATE rf_tbl_abcd_pk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (a); +-- fail - column list "a" does not cover the REPLICA IDENTITY INDEX on "c" +UPDATE rf_tbl_abcd_nopk SET a = 1; +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (c); +-- ok - column list "c" does cover the REPLICA IDENTITY INDEX on "c" +UPDATE rf_tbl_abcd_nopk SET a = 1; + +-- Tests for partitioned table + +-- set PUBLISH_VIA_PARTITION_ROOT to false and test column list for partitioned +-- table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +-- fail - cannot use column list for partitioned table +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk (a); +-- ok - can use column list for partition +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 (a); +-- ok - "a" is a PK col +UPDATE rf_tbl_abcd_part_pk SET a = 1; +-- set PUBLISH_VIA_PARTITION_ROOT to true and test column list for partitioned +-- table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=1); +-- ok - can use column list for partitioned table +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk (a); +-- ok - "a" is a PK col +UPDATE rf_tbl_abcd_part_pk SET a = 1; +-- fail - cannot set PUBLISH_VIA_PARTITION_ROOT to false if any column list is +-- used for partitioned table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +-- Now change the root column list to use a column "b" +-- (which is not in the replica identity) +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 (b); +-- ok - we don't have column list for partitioned table. +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +-- fail - "b" is not in REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_part_pk SET a = 1; +-- set PUBLISH_VIA_PARTITION_ROOT to true +-- can use column list for partitioned table +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=1); +-- ok - can use column list for partitioned table +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk (b); +-- fail - "b" is not in REPLICA IDENTITY INDEX +UPDATE rf_tbl_abcd_part_pk SET a = 1; + +DROP PUBLICATION testpub6; +DROP TABLE rf_tbl_abcd_pk; +DROP TABLE rf_tbl_abcd_nopk; +DROP TABLE rf_tbl_abcd_part_pk; +-- ====================================================== + -- Test cache invalidation FOR ALL TABLES publication SET client_min_messages = 'ERROR'; CREATE TABLE testpub_tbl4(a int); @@ -809,6 +1092,10 @@ ALTER PUBLICATION testpub1_forschema SET ALL TABLES IN SCHEMA non_existent_schem ALTER PUBLICATION testpub1_forschema SET ALL TABLES IN SCHEMA pub_test1, pub_test1; \dRp+ testpub1_forschema +-- Verify that it fails to add a schema with a column specification +ALTER PUBLICATION testpub1_forschema ADD ALL TABLES IN SCHEMA foo (a, b); +ALTER PUBLICATION testpub1_forschema ADD ALL TABLES IN SCHEMA foo, bar (a, b); + -- cleanup pub_test1 schema for invalidation tests ALTER PUBLICATION testpub2_forschema DROP ALL TABLES IN SCHEMA pub_test1; DROP PUBLICATION testpub3_forschema, testpub4_forschema, testpub5_forschema, testpub6_forschema, testpub_fortable; diff --git a/src/test/subscription/t/031_column_list.pl b/src/test/subscription/t/031_column_list.pl new file mode 100644 index 0000000000..c778840f4c --- /dev/null +++ b/src/test/subscription/t/031_column_list.pl @@ -0,0 +1,1131 @@ +# Copyright (c) 2022, PostgreSQL Global Development Group + +# Test partial-column publication of tables +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# create publisher node +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); +$node_publisher->init(allows_streaming => 'logical'); +$node_publisher->start; + +# create subscriber node +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); +$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->append_conf('postgresql.conf', + qq(max_logical_replication_workers = 6)); +$node_subscriber->start; + +my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; + +sub wait_for_subscription_sync +{ + my ($node) = @_; + + # Also wait for initial table sync to finish + my $synced_query = "SELECT count(1) = 0 FROM pg_subscription_rel WHERE srsubstate NOT IN ('r', 's');"; + + $node->poll_query_until('postgres', $synced_query) + or die "Timed out while waiting for subscriber to synchronize data"; +} + +# setup tables on both nodes + +# tab1: simple 1:1 replication +$node_publisher->safe_psql('postgres', qq( + CREATE TABLE tab1 (a int PRIMARY KEY, "B" int, c int) +)); + +$node_subscriber->safe_psql('postgres', qq( + CREATE TABLE tab1 (a int PRIMARY KEY, "B" int, c int) +)); + +# tab2: replication from regular to table with fewer columns +$node_publisher->safe_psql('postgres', qq( + CREATE TABLE tab2 (a int PRIMARY KEY, b varchar, c int); +)); + +$node_subscriber->safe_psql('postgres', qq( + CREATE TABLE tab2 (a int PRIMARY KEY, b varchar) +)); + +# tab3: simple 1:1 replication with weird column names +$node_publisher->safe_psql('postgres', qq( + CREATE TABLE tab3 ("a'" int PRIMARY KEY, "B" varchar, "c'" int) +)); + +$node_subscriber->safe_psql('postgres', qq( + CREATE TABLE tab3 ("a'" int PRIMARY KEY, "c'" int) +)); + +# test_part: partitioned tables, with partitioning (including multi-level +# partitioning, and fewer columns on the subscriber) +$node_publisher->safe_psql('postgres', qq( + CREATE TABLE test_part (a int PRIMARY KEY, b text, c timestamptz) PARTITION BY LIST (a); + CREATE TABLE test_part_1_1 PARTITION OF test_part FOR VALUES IN (1,2,3,4,5,6); + CREATE TABLE test_part_2_1 PARTITION OF test_part FOR VALUES IN (7,8,9,10,11,12) PARTITION BY LIST (a); + CREATE TABLE test_part_2_2 PARTITION OF test_part_2_1 FOR VALUES IN (7,8,9,10); +)); + +$node_subscriber->safe_psql('postgres', qq( + CREATE TABLE test_part (a int PRIMARY KEY, b text) PARTITION BY LIST (a); + CREATE TABLE test_part_1_1 PARTITION OF test_part FOR VALUES IN (1,2,3,4,5,6); + CREATE TABLE test_part_2_1 PARTITION OF test_part FOR VALUES IN (7,8,9,10,11,12) PARTITION BY LIST (a); + CREATE TABLE test_part_2_2 PARTITION OF test_part_2_1 FOR VALUES IN (7,8,9,10); +)); + +# tab4: table with user-defined enum types +$node_publisher->safe_psql('postgres', qq( + CREATE TYPE test_typ AS ENUM ('blue', 'red'); + CREATE TABLE tab4 (a INT PRIMARY KEY, b test_typ, c int, d text); +)); + +$node_subscriber->safe_psql('postgres', qq( + CREATE TYPE test_typ AS ENUM ('blue', 'red'); + CREATE TABLE tab4 (a INT PRIMARY KEY, b test_typ, d text); +)); + + +# TEST: create publication and subscription for some of the tables with +# column lists +$node_publisher->safe_psql('postgres', qq( + CREATE PUBLICATION pub1 + FOR TABLE tab1 (a, "B"), tab3 ("a'", "c'"), test_part (a, b), tab4 (a, b, d) + WITH (publish_via_partition_root = 'true'); +)); + +# check that we got the right prattrs values for the publication in the +# pg_publication_rel catalog (order by relname, to get stable ordering) +my $result = $node_publisher->safe_psql('postgres', qq( + SELECT relname, prattrs + FROM pg_publication_rel pb JOIN pg_class pc ON(pb.prrelid = pc.oid) + ORDER BY relname +)); + +is($result, qq(tab1|1 2 +tab3|1 3 +tab4|1 2 4 +test_part|1 2), 'publication relation updated'); + +# TEST: insert data into the tables, create subscription and see if sync +# replicates the right columns +$node_publisher->safe_psql('postgres', qq( + INSERT INTO tab1 VALUES (1, 2, 3); + INSERT INTO tab1 VALUES (4, 5, 6); +)); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO tab3 VALUES (1, 2, 3); + INSERT INTO tab3 VALUES (4, 5, 6); +)); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO tab4 VALUES (1, 'red', 3, 'oh my'); + INSERT INTO tab4 VALUES (2, 'blue', 4, 'hello'); +)); + +# replication of partitioned table +$node_publisher->safe_psql('postgres', qq( + INSERT INTO test_part VALUES (1, 'abc', '2021-07-04 12:00:00'); + INSERT INTO test_part VALUES (2, 'bcd', '2021-07-03 11:12:13'); + INSERT INTO test_part VALUES (7, 'abc', '2021-07-04 12:00:00'); + INSERT INTO test_part VALUES (8, 'bcd', '2021-07-03 11:12:13'); +)); + +# create subscription for the publication, wait for sync to complete, +# then check the sync results +$node_subscriber->safe_psql('postgres', qq( + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub1 +)); + +wait_for_subscription_sync($node_subscriber); + +# tab1: only (a,b) is replicated +$result = $node_subscriber->safe_psql('postgres', + "SELECT * FROM tab1 ORDER BY a"); +is($result, qq(1|2| +4|5|), 'insert on column tab1.c is not replicated'); + +# tab3: only (a,c) is replicated +$result = $node_subscriber->safe_psql('postgres', + qq(SELECT * FROM tab3 ORDER BY "a'")); +is($result, qq(1|3 +4|6), 'insert on column tab3.b is not replicated'); + +# tab4: only (a,b,d) is replicated +$result = $node_subscriber->safe_psql('postgres', + "SELECT * FROM tab4 ORDER BY a"); +is($result, qq(1|red|oh my +2|blue|hello), 'insert on column tab4.c is not replicated'); + +# test_part: (a,b) is replicated +$result = $node_subscriber->safe_psql('postgres', + "SELECT * FROM test_part ORDER BY a"); +is($result, qq(1|abc +2|bcd +7|abc +8|bcd), 'insert on column test_part.c columns is not replicated'); + + +# TEST: now insert more data into the tables, and wait until we replicate +# them (not by tablesync, but regular decoding and replication) + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO tab1 VALUES (2, 3, 4); + INSERT INTO tab1 VALUES (5, 6, 7); +)); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO tab3 VALUES (2, 3, 4); + INSERT INTO tab3 VALUES (5, 6, 7); +)); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO tab4 VALUES (3, 'red', 5, 'foo'); + INSERT INTO tab4 VALUES (4, 'blue', 6, 'bar'); +)); + +# replication of partitioned table +$node_publisher->safe_psql('postgres', qq( + INSERT INTO test_part VALUES (3, 'xxx', '2022-02-01 10:00:00'); + INSERT INTO test_part VALUES (4, 'yyy', '2022-03-02 15:12:13'); + INSERT INTO test_part VALUES (9, 'zzz', '2022-04-03 21:00:00'); + INSERT INTO test_part VALUES (10, 'qqq', '2022-05-04 22:12:13'); +)); + +# wait for catchup before checking the subscriber +$node_publisher->wait_for_catchup('sub1'); + +# tab1: only (a,b) is replicated +$result = $node_subscriber->safe_psql('postgres', + "SELECT * FROM tab1 ORDER BY a"); +is($result, qq(1|2| +2|3| +4|5| +5|6|), 'insert on column tab1.c is not replicated'); + +# tab3: only (a,c) is replicated +$result = $node_subscriber->safe_psql('postgres', + qq(SELECT * FROM tab3 ORDER BY "a'")); +is($result, qq(1|3 +2|4 +4|6 +5|7), 'insert on column tab3.b is not replicated'); + +# tab4: only (a,b,d) is replicated +$result = $node_subscriber->safe_psql('postgres', + "SELECT * FROM tab4 ORDER BY a"); +is($result, qq(1|red|oh my +2|blue|hello +3|red|foo +4|blue|bar), 'insert on column tab4.c is not replicated'); + +# test_part: (a,b) is replicated +$result = $node_subscriber->safe_psql('postgres', + "SELECT * FROM test_part ORDER BY a"); +is($result, qq(1|abc +2|bcd +3|xxx +4|yyy +7|abc +8|bcd +9|zzz +10|qqq), 'insert on column test_part.c columns is not replicated'); + + +# TEST: do some updates on some of the tables, both on columns included +# in the column list and other + +# tab1: update of replicated column +$node_publisher->safe_psql('postgres', + qq(UPDATE tab1 SET "B" = 2 * "B" where a = 1)); + +# tab1: update of non-replicated column +$node_publisher->safe_psql('postgres', + qq(UPDATE tab1 SET c = 2*c where a = 4)); + +# tab3: update of non-replicated +$node_publisher->safe_psql('postgres', + qq(UPDATE tab3 SET "B" = "B" || ' updated' where "a'" = 4)); + +# tab3: update of replicated column +$node_publisher->safe_psql('postgres', + qq(UPDATE tab3 SET "c'" = 2 * "c'" where "a'" = 1)); + +# tab4 +$node_publisher->safe_psql('postgres', + qq(UPDATE tab4 SET b = 'blue', c = c * 2, d = d || ' updated' where a = 1)); + +# tab4 +$node_publisher->safe_psql('postgres', + qq(UPDATE tab4 SET b = 'red', c = c * 2, d = d || ' updated' where a = 2)); + +# wait for the replication to catch up, and check the UPDATE results got +# replicated correctly, with the right column list +$node_publisher->wait_for_catchup('sub1'); + +$result = $node_subscriber->safe_psql('postgres', + qq(SELECT * FROM tab1 ORDER BY a)); +is($result, +qq(1|4| +2|3| +4|5| +5|6|), 'only update on column tab1.b is replicated'); + +$result = $node_subscriber->safe_psql('postgres', + qq(SELECT * FROM tab3 ORDER BY "a'")); +is($result, +qq(1|6 +2|4 +4|6 +5|7), 'only update on column tab3.c is replicated'); + +$result = $node_subscriber->safe_psql('postgres', + qq(SELECT * FROM tab4 ORDER BY a)); + +is($result, qq(1|blue|oh my updated +2|red|hello updated +3|red|foo +4|blue|bar), 'update on column tab4.c is not replicated'); + + +# TEST: add table with a column list, insert data, replicate + +# insert some data before adding it to the publication +$node_publisher->safe_psql('postgres', qq( + INSERT INTO tab2 VALUES (1, 'abc', 3); +)); + +$node_publisher->safe_psql('postgres', + "ALTER PUBLICATION pub1 ADD TABLE tab2 (a, b)"); + +$node_subscriber->safe_psql('postgres', + "ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION"); + +# wait for the tablesync to complete, add a bit more data and then check +# the results of the replication +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO tab2 VALUES (2, 'def', 6); +)); + +$node_publisher->wait_for_catchup('sub1'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT * FROM tab2 ORDER BY a"); +is($result, qq(1|abc +2|def), 'insert on column tab2.c is not replicated'); + +# do a couple updates, check the correct stuff gets replicated +$node_publisher->safe_psql('postgres', qq( + UPDATE tab2 SET c = 5 where a = 1; + UPDATE tab2 SET b = 'xyz' where a = 2; +)); + +$node_publisher->wait_for_catchup('sub1'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT * FROM tab2 ORDER BY a"); +is($result, qq(1|abc +2|xyz), 'update on column tab2.c is not replicated'); + + +# TEST: add a table to two publications with different column lists, and +# create a single subscription replicating both publications +$node_publisher->safe_psql('postgres', qq( + CREATE TABLE tab5 (a int PRIMARY KEY, b int, c int, d int); + CREATE PUBLICATION pub2 FOR TABLE tab5 (a, b); + CREATE PUBLICATION pub3 FOR TABLE tab5 (a, d); + + -- insert a couple initial records + INSERT INTO tab5 VALUES (1, 11, 111, 1111); + INSERT INTO tab5 VALUES (2, 22, 222, 2222); +)); + +$node_subscriber->safe_psql('postgres', qq( + CREATE TABLE tab5 (a int PRIMARY KEY, b int, d int); +)); + +$node_subscriber->safe_psql('postgres', qq( + ALTER SUBSCRIPTION sub1 SET PUBLICATION pub2, pub3 +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->wait_for_catchup('sub1'); + +# insert data and make sure all the columns (union of the columns lists) +# get fully replicated +$node_publisher->safe_psql('postgres', qq( + INSERT INTO tab5 VALUES (3, 33, 333, 3333); + INSERT INTO tab5 VALUES (4, 44, 444, 4444); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM tab5 ORDER BY a"), + qq(1|11|1111 +2|22|2222 +3|33|3333 +4|44|4444), + 'overlapping publications with overlapping column lists'); + +# and finally, remove the column list for one of the publications, which +# means replicating all columns (removing the column list), but first add +# the missing column to the table on subscriber +$node_publisher->safe_psql('postgres', qq( + ALTER PUBLICATION pub3 SET TABLE tab5; +)); + +$node_subscriber->safe_psql('postgres', qq( + ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION; + ALTER TABLE tab5 ADD COLUMN c INT; +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO tab5 VALUES (5, 55, 555, 5555); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM tab5 ORDER BY a"), + qq(1|11|1111| +2|22|2222| +3|33|3333| +4|44|4444| +5|55|5555|555), + 'overlapping publications with overlapping column lists'); + +# TEST: create a table with a column list, then change the replica +# identity by replacing a primary key (but use a different column in +# the column list) +$node_publisher->safe_psql('postgres', qq( + CREATE TABLE tab6 (a int PRIMARY KEY, b int, c int, d int); + CREATE PUBLICATION pub4 FOR TABLE tab6 (a, b); + + -- initial data + INSERT INTO tab6 VALUES (1, 22, 333, 4444); +)); + +$node_subscriber->safe_psql('postgres', qq( + CREATE TABLE tab6 (a int PRIMARY KEY, b int, c int, d int); +)); + +$node_subscriber->safe_psql('postgres', qq( + ALTER SUBSCRIPTION sub1 SET PUBLICATION pub4 +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO tab6 VALUES (2, 33, 444, 5555); + UPDATE tab6 SET b = b * 2, c = c * 3, d = d * 4; +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM tab6 ORDER BY a"), + qq(1|44|| +2|66||), 'replication with the original primary key'); + +# now redefine the constraint - move the primary key to a different column +# (which is still covered by the column list, though) + +$node_publisher->safe_psql('postgres', qq( + ALTER TABLE tab6 DROP CONSTRAINT tab6_pkey; + ALTER TABLE tab6 ADD PRIMARY KEY (b); +)); + +# we need to do the same thing on the subscriber +# XXX What would happen if this happens before the publisher ALTER? Or +# interleaved, somehow? But that seems unrelated to column lists. +$node_subscriber->safe_psql('postgres', qq( + ALTER TABLE tab6 DROP CONSTRAINT tab6_pkey; + ALTER TABLE tab6 ADD PRIMARY KEY (b); +)); + +$node_subscriber->safe_psql('postgres', qq( + ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO tab6 VALUES (3, 55, 666, 8888); + UPDATE tab6 SET b = b * 2, c = c * 3, d = d * 4; +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM tab6 ORDER BY a"), + qq(1|88|| +2|132|| +3|110||), + 'replication with the modified primary key'); + + +# TEST: create a table with a column list, then change the replica +# identity by replacing a primary key with a key on multiple columns +# (all of them covered by the column list) +$node_publisher->safe_psql('postgres', qq( + CREATE TABLE tab7 (a int PRIMARY KEY, b int, c int, d int); + CREATE PUBLICATION pub5 FOR TABLE tab7 (a, b); + + -- some initial data + INSERT INTO tab7 VALUES (1, 22, 333, 4444); +)); + +$node_subscriber->safe_psql('postgres', qq( + CREATE TABLE tab7 (a int PRIMARY KEY, b int, c int, d int); +)); + +$node_subscriber->safe_psql('postgres', qq( + ALTER SUBSCRIPTION sub1 SET PUBLICATION pub5 +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO tab7 VALUES (2, 33, 444, 5555); + UPDATE tab7 SET b = b * 2, c = c * 3, d = d * 4; +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM tab7 ORDER BY a"), + qq(1|44|| +2|66||), 'replication with the original primary key'); + +# now redefine the constraint - move the primary key to a different column +# (which is not covered by the column list) +$node_publisher->safe_psql('postgres', qq( + ALTER TABLE tab7 DROP CONSTRAINT tab7_pkey; + ALTER TABLE tab7 ADD PRIMARY KEY (a, b); +)); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO tab7 VALUES (3, 55, 666, 7777); + UPDATE tab7 SET b = b * 2, c = c * 3, d = d * 4; +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM tab7 ORDER BY a"), + qq(1|88|| +2|132|| +3|110||), + 'replication with the modified primary key'); + +# now switch the primary key again to another columns not covered by the +# column list, but also generate writes between the drop and creation +# of the new constraint + +$node_publisher->safe_psql('postgres', qq( + ALTER TABLE tab7 DROP CONSTRAINT tab7_pkey; + INSERT INTO tab7 VALUES (4, 77, 888, 9999); + -- update/delete is not allowed for tables without RI + ALTER TABLE tab7 ADD PRIMARY KEY (b, a); + UPDATE tab7 SET b = b * 2, c = c * 3, d = d * 4; + DELETE FROM tab7 WHERE a = 1; +)); + +$node_publisher->safe_psql('postgres', qq( +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM tab7 ORDER BY a"), + qq(2|264|| +3|220|| +4|154||), + 'replication with the modified primary key'); + + +# TEST: partitioned tables (with publish_via_partition_root = false) +# and replica identity. The (leaf) partitions may have different RI, so +# we need to check the partition RI (with respect to the column list) +# while attaching the partition. + +# First, let's create a partitioned table with two partitions, each with +# a different RI, but a column list not covering all those RI. + +$node_publisher->safe_psql('postgres', qq( + CREATE TABLE test_part_a (a int, b int, c int) PARTITION BY LIST (a); + + CREATE TABLE test_part_a_1 PARTITION OF test_part_a FOR VALUES IN (1,2,3,4,5); + ALTER TABLE test_part_a_1 ADD PRIMARY KEY (a); + ALTER TABLE test_part_a_1 REPLICA IDENTITY USING INDEX test_part_a_1_pkey; + + CREATE TABLE test_part_a_2 PARTITION OF test_part_a FOR VALUES IN (6,7,8,9,10); + ALTER TABLE test_part_a_2 ADD PRIMARY KEY (b); + ALTER TABLE test_part_a_2 REPLICA IDENTITY USING INDEX test_part_a_2_pkey; + + -- initial data, one row in each partition + INSERT INTO test_part_a VALUES (1, 3); + INSERT INTO test_part_a VALUES (6, 4); +)); + +# do the same thing on the subscriber (with the opposite column order) +$node_subscriber->safe_psql('postgres', qq( + CREATE TABLE test_part_a (b int, a int) PARTITION BY LIST (a); + + CREATE TABLE test_part_a_1 PARTITION OF test_part_a FOR VALUES IN (1,2,3,4,5); + ALTER TABLE test_part_a_1 ADD PRIMARY KEY (a); + ALTER TABLE test_part_a_1 REPLICA IDENTITY USING INDEX test_part_a_1_pkey; + + CREATE TABLE test_part_a_2 PARTITION OF test_part_a FOR VALUES IN (6,7,8,9,10); + ALTER TABLE test_part_a_2 ADD PRIMARY KEY (b); + ALTER TABLE test_part_a_2 REPLICA IDENTITY USING INDEX test_part_a_2_pkey; +)); + +# create a publication replicating just the column "a", which is not enough +# for the second partition +$node_publisher->safe_psql('postgres', qq( + CREATE PUBLICATION pub6 FOR TABLE test_part_a (b, a) WITH (publish_via_partition_root = true); + ALTER PUBLICATION pub6 ADD TABLE test_part_a_1 (a); + ALTER PUBLICATION pub6 ADD TABLE test_part_a_2 (b); +)); + +# add the publication to our subscription, wait for sync to complete +$node_subscriber->safe_psql('postgres', qq( + ALTER SUBSCRIPTION sub1 SET PUBLICATION pub6 +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO test_part_a VALUES (2, 5); + INSERT INTO test_part_a VALUES (7, 6); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT a, b FROM test_part_a ORDER BY a, b"), + qq(1|3 +2|5 +6|4 +7|6), + 'partitions with different replica identities not replicated correctly'); + +# This time start with a column list covering RI for all partitions, but +# then update the column list to not cover column "b" (needed by the +# second partition) + +$node_publisher->safe_psql('postgres', qq( + CREATE TABLE test_part_b (a int, b int) PARTITION BY LIST (a); + + CREATE TABLE test_part_b_1 PARTITION OF test_part_b FOR VALUES IN (1,2,3,4,5); + ALTER TABLE test_part_b_1 ADD PRIMARY KEY (a); + ALTER TABLE test_part_b_1 REPLICA IDENTITY USING INDEX test_part_b_1_pkey; + + CREATE TABLE test_part_b_2 PARTITION OF test_part_b FOR VALUES IN (6,7,8,9,10); + ALTER TABLE test_part_b_2 ADD PRIMARY KEY (b); + ALTER TABLE test_part_b_2 REPLICA IDENTITY USING INDEX test_part_b_2_pkey; + + -- initial data, one row in each partitions + INSERT INTO test_part_b VALUES (1, 1); + INSERT INTO test_part_b VALUES (6, 2); +)); + +# do the same thing on the subscriber +$node_subscriber->safe_psql('postgres', qq( + CREATE TABLE test_part_b (a int, b int) PARTITION BY LIST (a); + + CREATE TABLE test_part_b_1 PARTITION OF test_part_b FOR VALUES IN (1,2,3,4,5); + ALTER TABLE test_part_b_1 ADD PRIMARY KEY (a); + ALTER TABLE test_part_b_1 REPLICA IDENTITY USING INDEX test_part_b_1_pkey; + + CREATE TABLE test_part_b_2 PARTITION OF test_part_b FOR VALUES IN (6,7,8,9,10); + ALTER TABLE test_part_b_2 ADD PRIMARY KEY (b); + ALTER TABLE test_part_b_2 REPLICA IDENTITY USING INDEX test_part_b_2_pkey; +)); + +# create a publication replicating both columns, which is sufficient for +# both partitions +$node_publisher->safe_psql('postgres', qq( + CREATE PUBLICATION pub7 FOR TABLE test_part_b (a, b) WITH (publish_via_partition_root = true); +)); + +# add the publication to our subscription, wait for sync to complete +$node_subscriber->safe_psql('postgres', qq( + ALTER SUBSCRIPTION sub1 SET PUBLICATION pub7 +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO test_part_b VALUES (2, 3); + INSERT INTO test_part_b VALUES (7, 4); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM test_part_b ORDER BY a, b"), + qq(1|1 +2|3 +6|2 +7|4), + 'partitions with different replica identities not replicated correctly'); + + +# TEST: This time start with a column list covering RI for all partitions, +# but then update RI for one of the partitions to not be covered by the +# column list anymore. + +$node_publisher->safe_psql('postgres', qq( + CREATE TABLE test_part_c (a int, b int, c int) PARTITION BY LIST (a); + + CREATE TABLE test_part_c_1 PARTITION OF test_part_c FOR VALUES IN (1,3); + ALTER TABLE test_part_c_1 ADD PRIMARY KEY (a); + ALTER TABLE test_part_c_1 REPLICA IDENTITY USING INDEX test_part_c_1_pkey; + + CREATE TABLE test_part_c_2 PARTITION OF test_part_c FOR VALUES IN (2,4); + ALTER TABLE test_part_c_2 ADD PRIMARY KEY (b); + ALTER TABLE test_part_c_2 REPLICA IDENTITY USING INDEX test_part_c_2_pkey; + + -- initial data, one row for each partition + INSERT INTO test_part_c VALUES (1, 3, 5); + INSERT INTO test_part_c VALUES (2, 4, 6); +)); + +# do the same thing on the subscriber +$node_subscriber->safe_psql('postgres', qq( + CREATE TABLE test_part_c (a int, b int, c int) PARTITION BY LIST (a); + + CREATE TABLE test_part_c_1 PARTITION OF test_part_c FOR VALUES IN (1,3); + ALTER TABLE test_part_c_1 ADD PRIMARY KEY (a); + ALTER TABLE test_part_c_1 REPLICA IDENTITY USING INDEX test_part_c_1_pkey; + + CREATE TABLE test_part_c_2 PARTITION OF test_part_c FOR VALUES IN (2,4); + ALTER TABLE test_part_c_2 ADD PRIMARY KEY (b); + ALTER TABLE test_part_c_2 REPLICA IDENTITY USING INDEX test_part_c_2_pkey; +)); + +# create a publication replicating data through partition root, with a column +# list on the root, and then add the partitions one by one with separate +# column lists (but those are not applied) +$node_publisher->safe_psql('postgres', qq( + CREATE PUBLICATION pub8 FOR TABLE test_part_c WITH (publish_via_partition_root = false); + ALTER PUBLICATION pub8 ADD TABLE test_part_c_1 (a,c); + ALTER PUBLICATION pub8 ADD TABLE test_part_c_2 (a,b); +)); + +# add the publication to our subscription, wait for sync to complete +$node_subscriber->safe_psql('postgres', qq( + DROP SUBSCRIPTION sub1; + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub8; +)); + +$node_publisher->wait_for_catchup('sub1'); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO test_part_c VALUES (3, 7, 8); + INSERT INTO test_part_c VALUES (4, 9, 10); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM test_part_c ORDER BY a, b"), + qq(1||5 +2|4| +3||8 +4|9|), + 'partitions with different replica identities not replicated correctly'); + + +# create a publication not replicating data through partition root, without +# a column list on the root, and then add the partitions one by one with +# separate column lists +$node_publisher->safe_psql('postgres', qq( + DROP PUBLICATION pub8; + CREATE PUBLICATION pub8 FOR TABLE test_part_c WITH (publish_via_partition_root = false); + ALTER PUBLICATION pub8 ADD TABLE test_part_c_1 (a); + ALTER PUBLICATION pub8 ADD TABLE test_part_c_2 (a,b); +)); + +# add the publication to our subscription, wait for sync to complete +$node_subscriber->safe_psql('postgres', qq( + ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION; + TRUNCATE test_part_c; +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + TRUNCATE test_part_c; + INSERT INTO test_part_c VALUES (1, 3, 5); + INSERT INTO test_part_c VALUES (2, 4, 6); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM test_part_c ORDER BY a, b"), + qq(1|| +2|4|), + 'partitions with different replica identities not replicated correctly'); + + +# TEST: Start with a single partition, with RI compatible with the column +# list, and then attach a partition with incompatible RI. + +$node_publisher->safe_psql('postgres', qq( + CREATE TABLE test_part_d (a int, b int) PARTITION BY LIST (a); + + CREATE TABLE test_part_d_1 PARTITION OF test_part_d FOR VALUES IN (1,3); + ALTER TABLE test_part_d_1 ADD PRIMARY KEY (a); + ALTER TABLE test_part_d_1 REPLICA IDENTITY USING INDEX test_part_d_1_pkey; + + INSERT INTO test_part_d VALUES (1, 2); +)); + +# do the same thing on the subscriber (in fact, create both partitions right +# away, no need to delay that) +$node_subscriber->safe_psql('postgres', qq( + CREATE TABLE test_part_d (a int, b int) PARTITION BY LIST (a); + + CREATE TABLE test_part_d_1 PARTITION OF test_part_d FOR VALUES IN (1,3); + ALTER TABLE test_part_d_1 ADD PRIMARY KEY (a); + ALTER TABLE test_part_d_1 REPLICA IDENTITY USING INDEX test_part_d_1_pkey; + + CREATE TABLE test_part_d_2 PARTITION OF test_part_d FOR VALUES IN (2,4); + ALTER TABLE test_part_d_2 ADD PRIMARY KEY (a); + ALTER TABLE test_part_d_2 REPLICA IDENTITY USING INDEX test_part_d_2_pkey; +)); + +# create a publication replicating both columns, which is sufficient for +# both partitions +$node_publisher->safe_psql('postgres', qq( + CREATE PUBLICATION pub9 FOR TABLE test_part_d (a) WITH (publish_via_partition_root = true); +)); + +# add the publication to our subscription, wait for sync to complete +$node_subscriber->safe_psql('postgres', qq( + ALTER SUBSCRIPTION sub1 SET PUBLICATION pub9 +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO test_part_d VALUES (3, 4); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM test_part_d ORDER BY a, b"), + qq(1| +3|), + 'partitions with different replica identities not replicated correctly'); + +# TEST: With a table included in multiple publications, we should use a +# union of the column lists. So with column lists (a,b) and (a,c) we +# should replicate (a,b,c). + +$node_publisher->safe_psql('postgres', qq( + CREATE TABLE test_mix_1 (a int PRIMARY KEY, b int, c int); + CREATE PUBLICATION pub_mix_1 FOR TABLE test_mix_1 (a, b); + CREATE PUBLICATION pub_mix_2 FOR TABLE test_mix_1 (a, c); + + -- initial data + INSERT INTO test_mix_1 VALUES (1, 2, 3); +)); + +$node_subscriber->safe_psql('postgres', qq( + CREATE TABLE test_mix_1 (a int PRIMARY KEY, b int, c int); + ALTER SUBSCRIPTION sub1 SET PUBLICATION pub_mix_1, pub_mix_2; +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO test_mix_1 VALUES (4, 5, 6); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM test_mix_1 ORDER BY a"), + qq(1|2|3 +4|5|6), + 'a mix of publications should use a union of column list'); + + +# TEST: With a table included in multiple publications, we should use a +# union of the column lists. If any of the publications is FOR ALL +# TABLES, we should replicate all columns. + +# drop unnecessary tables, so as not to interfere with the FOR ALL TABLES +$node_publisher->safe_psql('postgres', qq( + DROP TABLE tab1, tab2, tab3, tab4, tab5, tab6, tab7, test_mix_1, + test_part, test_part_a, test_part_b, test_part_c, test_part_d; +)); + +$node_publisher->safe_psql('postgres', qq( + CREATE TABLE test_mix_2 (a int PRIMARY KEY, b int, c int); + CREATE PUBLICATION pub_mix_3 FOR TABLE test_mix_2 (a, b); + CREATE PUBLICATION pub_mix_4 FOR ALL TABLES; + + -- initial data + INSERT INTO test_mix_2 VALUES (1, 2, 3); +)); + +$node_subscriber->safe_psql('postgres', qq( + CREATE TABLE test_mix_2 (a int PRIMARY KEY, b int, c int); + ALTER SUBSCRIPTION sub1 SET PUBLICATION pub_mix_3, pub_mix_4; + ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION; +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO test_mix_2 VALUES (4, 5, 6); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM test_mix_2"), + qq(1|2|3 +4|5|6), + 'a mix of publications should use a union of column list'); + + +# TEST: With a table included in multiple publications, we should use a +# union of the column lists. If any of the publications is FOR ALL +# TABLES IN SCHEMA, we should replicate all columns. + +$node_subscriber->safe_psql('postgres', qq( + DROP SUBSCRIPTION sub1; + CREATE TABLE test_mix_3 (a int PRIMARY KEY, b int, c int); +)); + +$node_publisher->safe_psql('postgres', qq( + DROP TABLE test_mix_2; + CREATE TABLE test_mix_3 (a int PRIMARY KEY, b int, c int); + CREATE PUBLICATION pub_mix_5 FOR TABLE test_mix_3 (a, b); + CREATE PUBLICATION pub_mix_6 FOR ALL TABLES IN SCHEMA public; + + -- initial data + INSERT INTO test_mix_3 VALUES (1, 2, 3); +)); + +$node_subscriber->safe_psql('postgres', qq( + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub_mix_5, pub_mix_6; +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO test_mix_3 VALUES (4, 5, 6); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM test_mix_3"), + qq(1|2|3 +4|5|6), + 'a mix of publications should use a union of column list'); + + +# TEST: Check handling of publish_via_partition_root - if a partition is +# published through partition root, we should only apply the column list +# defined for the whole table (not the partitions) - both during the initial +# sync and when replicating changes. This is what we do for row filters. + +$node_subscriber->safe_psql('postgres', qq( + DROP SUBSCRIPTION sub1; + + CREATE TABLE test_root (a int PRIMARY KEY, b int, c int) PARTITION BY RANGE (a); + CREATE TABLE test_root_1 PARTITION OF test_root FOR VALUES FROM (1) TO (10); + CREATE TABLE test_root_2 PARTITION OF test_root FOR VALUES FROM (10) TO (20); +)); + +$node_publisher->safe_psql('postgres', qq( + CREATE TABLE test_root (a int PRIMARY KEY, b int, c int) PARTITION BY RANGE (a); + CREATE TABLE test_root_1 PARTITION OF test_root FOR VALUES FROM (1) TO (10); + CREATE TABLE test_root_2 PARTITION OF test_root FOR VALUES FROM (10) TO (20); + + CREATE PUBLICATION pub_root_true FOR TABLE test_root (a) WITH (publish_via_partition_root = true); + + -- initial data + INSERT INTO test_root VALUES (1, 2, 3); + INSERT INTO test_root VALUES (10, 20, 30); +)); + +$node_subscriber->safe_psql('postgres', qq( + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub_root_true; +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO test_root VALUES (2, 3, 4); + INSERT INTO test_root VALUES (11, 21, 31); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM test_root ORDER BY a, b, c"), + qq(1|| +2|| +10|| +11||), + 'publication via partition root applies column list'); + + +# TEST: Multiple publications which publish schema of parent table and +# partition. The partition is published through two publications, once +# through a schema (so no column list) containing the parent, and then +# also directly (with a columns list). The expected outcome is there is +# no column list. + +$node_publisher->safe_psql('postgres', qq( + DROP PUBLICATION pub1, pub2, pub3, pub4, pub5, pub6, pub7, pub8; + + CREATE SCHEMA s1; + CREATE TABLE s1.t (a int, b int, c int) PARTITION BY RANGE (a); + CREATE TABLE t_1 PARTITION OF s1.t FOR VALUES FROM (1) TO (10); + + CREATE PUBLICATION pub1 FOR ALL TABLES IN SCHEMA s1; + CREATE PUBLICATION pub2 FOR TABLE t_1(b); + + -- initial data + INSERT INTO s1.t VALUES (1, 2, 3); +)); + +$node_subscriber->safe_psql('postgres', qq( + CREATE SCHEMA s1; + CREATE TABLE s1.t (a int, b int, c int) PARTITION BY RANGE (a); + CREATE TABLE t_1 PARTITION OF s1.t FOR VALUES FROM (1) TO (10); + + ALTER SUBSCRIPTION sub1 SET PUBLICATION pub1, pub2; +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO s1.t VALUES (4, 5, 6); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM s1.t ORDER BY a"), + qq(1|2|3 +4|5|6), + 'two publications, publishing the same relation'); + +# Now resync the subcription, but with publications in the opposite order. +# The result should be the same. + +$node_subscriber->safe_psql('postgres', qq( + TRUNCATE s1.t; + + ALTER SUBSCRIPTION sub1 SET PUBLICATION pub2, pub1; +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO s1.t VALUES (7, 8, 9); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM s1.t ORDER BY a"), + qq(7|8|9), + 'two publications, publishing the same relation'); + + +# TEST: One publication, containing both the parent and child relations. +# The expected outcome is list "a", because that's the column list defined +# for the top-most ancestor added to the publication. + +$node_publisher->safe_psql('postgres', qq( + DROP SCHEMA s1 CASCADE; + CREATE TABLE t (a int, b int, c int) PARTITION BY RANGE (a); + CREATE TABLE t_1 PARTITION OF t FOR VALUES FROM (1) TO (10) + PARTITION BY RANGE (a); + CREATE TABLE t_2 PARTITION OF t_1 FOR VALUES FROM (1) TO (10); + + CREATE PUBLICATION pub3 FOR TABLE t_1 (a), t_2 + WITH (PUBLISH_VIA_PARTITION_ROOT); + + -- initial data + INSERT INTO t VALUES (1, 2, 3); +)); + +$node_subscriber->safe_psql('postgres', qq( + DROP SCHEMA s1 CASCADE; + CREATE TABLE t (a int, b int, c int) PARTITION BY RANGE (a); + CREATE TABLE t_1 PARTITION OF t FOR VALUES FROM (1) TO (10) + PARTITION BY RANGE (a); + CREATE TABLE t_2 PARTITION OF t_1 FOR VALUES FROM (1) TO (10); + + ALTER SUBSCRIPTION sub1 SET PUBLICATION pub3; +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO t VALUES (4, 5, 6); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM t ORDER BY a, b, c"), + qq(1|| +4||), + 'publication containing both parent and child relation'); + + +# TEST: One publication, containing both the parent and child relations. +# The expected outcome is list "a", because that's the column list defined +# for the top-most ancestor added to the publication. +# Note: The difference from the preceding test is that in this case both +# relations have a column list defined. + +$node_publisher->safe_psql('postgres', qq( + DROP TABLE t; + CREATE TABLE t (a int, b int, c int) PARTITION BY RANGE (a); + CREATE TABLE t_1 PARTITION OF t FOR VALUES FROM (1) TO (10) + PARTITION BY RANGE (a); + CREATE TABLE t_2 PARTITION OF t_1 FOR VALUES FROM (1) TO (10); + + CREATE PUBLICATION pub4 FOR TABLE t_1 (a), t_2 (b) + WITH (PUBLISH_VIA_PARTITION_ROOT); + + -- initial data + INSERT INTO t VALUES (1, 2, 3); +)); + +$node_subscriber->safe_psql('postgres', qq( + DROP TABLE t; + CREATE TABLE t (a int, b int, c int) PARTITION BY RANGE (a); + CREATE TABLE t_1 PARTITION OF t FOR VALUES FROM (1) TO (10) + PARTITION BY RANGE (a); + CREATE TABLE t_2 PARTITION OF t_1 FOR VALUES FROM (1) TO (10); + + ALTER SUBSCRIPTION sub1 SET PUBLICATION pub4; +)); + +wait_for_subscription_sync($node_subscriber); + +$node_publisher->safe_psql('postgres', qq( + INSERT INTO t VALUES (4, 5, 6); +)); + +$node_publisher->wait_for_catchup('sub1'); + +is($node_subscriber->safe_psql('postgres',"SELECT * FROM t ORDER BY a, b, c"), + qq(1|| +4||), + 'publication containing both parent and child relation'); + + +$node_subscriber->stop('fast'); +$node_publisher->stop('fast'); + +done_testing(); From 979cd655c13c3ea5d7df1db84ef9c9c85c0ea6b3 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 26 Mar 2022 11:53:37 -0400 Subject: [PATCH 260/772] Suppress compiler warning in pub_collist_to_bitmapset(). A fair percentage of the buildfarm doesn't recognize that oldcxt won't be used uninitialized; silence those warnings by initializing it. While here, upgrade the function's thoroughly inadequate header comment. Oversight in 923def9a5, per buildfarm. --- src/backend/catalog/pg_publication.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index a5a54e676e..9fe3b18926 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -592,7 +592,11 @@ publication_translate_columns(Relation targetrel, List *columns, } /* - * Transform the column list (represented by an array) to a bitmapset. + * Transform a column list (represented by an array Datum) to a bitmapset. + * + * If columns isn't NULL, add the column numbers to that set. + * + * If mcxt isn't NULL, build the bitmapset in that context. */ Bitmapset * pub_collist_to_bitmapset(Bitmapset *columns, Datum pubcols, MemoryContext mcxt) @@ -601,7 +605,7 @@ pub_collist_to_bitmapset(Bitmapset *columns, Datum pubcols, MemoryContext mcxt) ArrayType *arr; int nelems; int16 *elems; - MemoryContext oldcxt; + MemoryContext oldcxt = NULL; /* * If an existing bitmap was provided, use it. Otherwise just use NULL From 41b00f8e601fcf82aab2fc5ad0214a67f4829431 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Sat, 26 Mar 2022 19:06:10 +0100 Subject: [PATCH 261/772] Move prattrs to the pg_publication_rel section in docs Commit 923def9a53 documented the prattrs to the pg_publication_namespace catalog, probably due to a rebase mistake. Move it to the section for the pg_publication_rel catalog. Author: Noriyoshi Shinoda Discussion: https://postgr.es/m/PH7PR84MB18850A74D275F39762059E6CEE1B9@PH7PR84MB1885.NAMPRD84.PROD.OUTLOOK.COM --- doc/src/sgml/catalogs.sgml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 560e205b95..94f01e4099 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -6291,19 +6291,6 @@ SCRAM-SHA-256$<iteration count>:&l Reference to schema - - - - prattrs int2vector - (references pg_attribute.attnum) - - - This is an array of values that indicates which table columns are - part of the publication. For example, a value of 1 3 - would mean that the first and the third table columns are published. - A null value indicates that all columns are published. - - @@ -6375,6 +6362,19 @@ SCRAM-SHA-256$<iteration count>:&l representation) for the relation's publication qualifying condition. Null if there is no publication qualifying condition. + + + + prattrs int2vector + (references pg_attribute.attnum) + + + This is an array of values that indicates which table columns are + part of the publication. For example, a value of 1 3 + would mean that the first and the third table columns are published. + A null value indicates that all columns are published. + + From e07d4ddc55fdcf82082950b3eb0cd8f728284c9d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 26 Mar 2022 14:29:29 -0400 Subject: [PATCH 262/772] Suppress compiler warning in relptr_store(). clang 13 with -Wextra warns that "performing pointer subtraction with a null pointer has undefined behavior" in the places where freepage.c tries to set a relptr variable to constant NULL. This appears to be a compiler bug, but it's unlikely to get fixed instantly. Fortunately, we can work around it by introducing an inline support function, which seems like a good change anyway because it removes the macro's existing double-evaluation hazard. Backpatch to v10 where this code was introduced. Patch by me, based on an idea of Andres Freund's. Discussion: https://postgr.es/m/48826.1648310694@sss.pgh.pa.us --- src/include/utils/relptr.h | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/include/utils/relptr.h b/src/include/utils/relptr.h index fdc2124d2c..cc80a7200d 100644 --- a/src/include/utils/relptr.h +++ b/src/include/utils/relptr.h @@ -56,11 +56,24 @@ #define relptr_is_null(rp) \ ((rp).relptr_off == 0) +/* We use this inline to avoid double eval of "val" in relptr_store */ +static inline Size +relptr_store_eval(char *base, char *val) +{ + if (val == NULL) + return 0; + else + { + Assert(val > base); + return val - base; + } +} + #ifdef HAVE__BUILTIN_TYPES_COMPATIBLE_P #define relptr_store(base, rp, val) \ (AssertVariableIsOfTypeMacro(base, char *), \ AssertVariableIsOfTypeMacro(val, __typeof__((rp).relptr_type)), \ - (rp).relptr_off = ((val) == NULL ? 0 : ((char *) (val)) - (base))) + (rp).relptr_off = relptr_store_eval(base, (char *) (val))) #else /* * If we don't have __builtin_types_compatible_p, assume we might not have @@ -68,7 +81,7 @@ */ #define relptr_store(base, rp, val) \ (AssertVariableIsOfTypeMacro(base, char *), \ - (rp).relptr_off = ((val) == NULL ? 0 : ((char *) (val)) - (base))) + (rp).relptr_off = relptr_store_eval(base, (char *) (val))) #endif #define relptr_copy(rp1, rp2) \ From 4a7e964fc67a541b6ea1b72729ad3f8e632d003c Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Sat, 26 Mar 2022 22:00:39 +0100 Subject: [PATCH 263/772] SSL TAP test backend library independence refactoring The SSL TAP tests were tightly coupled to the OpenSSL implementation, making it hard to add support for additional SSL/TLS backends. This refactoring makes the test avoid depending on specific implementations The SSLServer Perl module is renamed SSL::Server, which in turn use SSL::Backend::X where X is the backend pointed to by with_ssl. Each backend will implement its own module responsible for setting up keys, certs and to resolve sslkey values to their implementation specific value (file paths or vault nicknames etc). Further, switch_server_cert now takes a set of named parameters rather than a fixed set which used defaults. The modules also come with POD documentation. There are a few testcases which still use OpenSSL specifics, but it's not entirely clear how to abstract those until we have another library implemented. Original patch by me, with lots of rework by Andrew Dunstan to turn it into better Perl. Discussion: https://postgr.es/m/AA18A362-CA65-4F9A-AF61-76AE318FE97C@yesql.se --- src/test/ssl/t/001_ssltests.pl | 143 +++++------ src/test/ssl/t/002_scram.pl | 17 +- src/test/ssl/t/003_sslinfo.pl | 28 +- src/test/ssl/t/SSL/Backend/OpenSSL.pm | 226 +++++++++++++++++ src/test/ssl/t/SSL/Server.pm | 353 ++++++++++++++++++++++++++ src/test/ssl/t/SSLServer.pm | 219 ---------------- 6 files changed, 664 insertions(+), 322 deletions(-) create mode 100644 src/test/ssl/t/SSL/Backend/OpenSSL.pm create mode 100644 src/test/ssl/t/SSL/Server.pm delete mode 100644 src/test/ssl/t/SSLServer.pm diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl index 605e405de3..d8eeb085da 100644 --- a/src/test/ssl/t/001_ssltests.pl +++ b/src/test/ssl/t/001_ssltests.pl @@ -8,18 +8,25 @@ use PostgreSQL::Test::Utils; use Test::More; -use File::Copy; - use FindBin; use lib $FindBin::RealBin; -use SSLServer; +use SSL::Server; if ($ENV{with_ssl} ne 'openssl') { plan skip_all => 'OpenSSL not supported by this build'; } +my $ssl_server = SSL::Server->new(); +sub sslkey +{ + return $ssl_server->sslkey(@_); +} +sub switch_server_cert +{ + $ssl_server->switch_server_cert(@_); +} #### Some configuration # This is the hostname used to connect to the server. This cannot be a @@ -32,39 +39,6 @@ # Allocation of base connection string shared among multiple tests. my $common_connstr; -# The client's private key must not be world-readable, so take a copy -# of the key stored in the code tree and update its permissions. -# -# This changes to using keys stored in a temporary path for the rest of -# the tests. To get the full path for inclusion in connection strings, the -# %key hash can be interrogated. -my $cert_tempdir = PostgreSQL::Test::Utils::tempdir(); -my %key; -my @keys = ( - "client.key", "client-revoked.key", - "client-der.key", "client-encrypted-pem.key", - "client-encrypted-der.key", "client-dn.key"); -foreach my $keyfile (@keys) -{ - copy("ssl/$keyfile", "$cert_tempdir/$keyfile") - or die - "couldn't copy ssl/$keyfile to $cert_tempdir/$keyfile for permissions change: $!"; - chmod 0600, "$cert_tempdir/$keyfile" - or die "failed to change permissions on $cert_tempdir/$keyfile: $!"; - $key{$keyfile} = "$cert_tempdir/$keyfile"; - $key{$keyfile} =~ s!\\!/!g if $PostgreSQL::Test::Utils::windows_os; -} - -# Also make a copy of that explicitly world-readable. We can't -# necessarily rely on the file in the source tree having those -# permissions. -copy("ssl/client.key", "$cert_tempdir/client_wrongperms.key") - or die - "couldn't copy ssl/client_key to $cert_tempdir/client_wrongperms.key for permission change: $!"; -chmod 0644, "$cert_tempdir/client_wrongperms.key" - or die "failed to change permissions on $cert_tempdir/client_wrongperms.key: $!"; -$key{'client_wrongperms.key'} = "$cert_tempdir/client_wrongperms.key"; -$key{'client_wrongperms.key'} =~ s!\\!/!g if $PostgreSQL::Test::Utils::windows_os; #### Set up the server. note "setting up data directory"; @@ -79,31 +53,31 @@ # Run this before we lock down access below. my $result = $node->safe_psql('postgres', "SHOW ssl_library"); -is($result, 'OpenSSL', 'ssl_library parameter'); +is($result, $ssl_server->ssl_library(), 'ssl_library parameter'); -configure_test_server_for_ssl($node, $SERVERHOSTADDR, $SERVERHOSTCIDR, - 'trust'); +$ssl_server->configure_test_server_for_ssl($node, $SERVERHOSTADDR, + $SERVERHOSTCIDR, 'trust'); note "testing password-protected keys"; -open my $sslconf, '>', $node->data_dir . "/sslconfig.conf"; -print $sslconf "ssl=on\n"; -print $sslconf "ssl_cert_file='server-cn-only.crt'\n"; -print $sslconf "ssl_key_file='server-password.key'\n"; -print $sslconf "ssl_passphrase_command='echo wrongpassword'\n"; -close $sslconf; +switch_server_cert($node, + certfile => 'server-cn-only', + cafile => 'root+client_ca', + keyfile => 'server-password', + passphrase_cmd => 'echo wrongpassword', + restart => 'no' ); command_fails( [ 'pg_ctl', '-D', $node->data_dir, '-l', $node->logfile, 'restart' ], 'restart fails with password-protected key file with wrong password'); $node->_update_pid(0); -open $sslconf, '>', $node->data_dir . "/sslconfig.conf"; -print $sslconf "ssl=on\n"; -print $sslconf "ssl_cert_file='server-cn-only.crt'\n"; -print $sslconf "ssl_key_file='server-password.key'\n"; -print $sslconf "ssl_passphrase_command='echo secret1'\n"; -close $sslconf; +switch_server_cert($node, + certfile => 'server-cn-only', + cafile => 'root+client_ca', + keyfile => 'server-password', + passphrase_cmd => 'echo secret1', + restart => 'no'); command_ok( [ 'pg_ctl', '-D', $node->data_dir, '-l', $node->logfile, 'restart' ], @@ -136,7 +110,7 @@ note "running client tests"; -switch_server_cert($node, 'server-cn-only'); +switch_server_cert($node, certfile => 'server-cn-only'); # Set of default settings for SSL parameters in connection string. This # makes the tests protected against any defaults the environment may have @@ -256,7 +230,7 @@ ); # Test Subject Alternative Names. -switch_server_cert($node, 'server-multiple-alt-names'); +switch_server_cert($node, certfile => 'server-multiple-alt-names'); $common_connstr = "$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full"; @@ -285,7 +259,7 @@ # Test certificate with a single Subject Alternative Name. (this gives a # slightly different error message, that's all) -switch_server_cert($node, 'server-single-alt-name'); +switch_server_cert($node, certfile => 'server-single-alt-name'); $common_connstr = "$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full"; @@ -309,7 +283,7 @@ # Test server certificate with a CN and SANs. Per RFCs 2818 and 6125, the CN # should be ignored when the certificate has both. -switch_server_cert($node, 'server-cn-and-alt-names'); +switch_server_cert($node, certfile => 'server-cn-and-alt-names'); $common_connstr = "$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full"; @@ -327,7 +301,7 @@ # Finally, test a server certificate that has no CN or SANs. Of course, that's # not a very sensible certificate, but libpq should handle it gracefully. -switch_server_cert($node, 'server-no-names'); +switch_server_cert($node, certfile => 'server-no-names'); $common_connstr = "$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR"; @@ -342,7 +316,7 @@ qr/could not get server's host name from server certificate/); # Test that the CRL works -switch_server_cert($node, 'server-revoked'); +switch_server_cert($node, certfile => 'server-revoked'); $common_connstr = "$default_ssl_connstr user=ssltestuser dbname=trustdb hostaddr=$SERVERHOSTADDR host=common-name.pg-ssltest.test"; @@ -410,34 +384,34 @@ # correct client cert in unencrypted PEM $node->connect_ok( - "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=$key{'client.key'}", + "$common_connstr user=ssltestuser sslcert=ssl/client.crt " . sslkey('client.key'), "certificate authorization succeeds with correct client cert in PEM format" ); # correct client cert in unencrypted DER $node->connect_ok( - "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=$key{'client-der.key'}", + "$common_connstr user=ssltestuser sslcert=ssl/client.crt " . sslkey('client-der.key'), "certificate authorization succeeds with correct client cert in DER format" ); # correct client cert in encrypted PEM $node->connect_ok( - "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=$key{'client-encrypted-pem.key'} sslpassword='dUmmyP^#+'", + "$common_connstr user=ssltestuser sslcert=ssl/client.crt " . sslkey('client-encrypted-pem.key') . " sslpassword='dUmmyP^#+'", "certificate authorization succeeds with correct client cert in encrypted PEM format" ); # correct client cert in encrypted DER $node->connect_ok( - "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=$key{'client-encrypted-der.key'} sslpassword='dUmmyP^#+'", + "$common_connstr user=ssltestuser sslcert=ssl/client.crt " . sslkey('client-encrypted-der.key') . " sslpassword='dUmmyP^#+'", "certificate authorization succeeds with correct client cert in encrypted DER format" ); # correct client cert in encrypted PEM with wrong password $node->connect_fails( - "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=$key{'client-encrypted-pem.key'} sslpassword='wrong'", + "$common_connstr user=ssltestuser sslcert=ssl/client.crt " . sslkey('client-encrypted-pem.key') . " sslpassword='wrong'", "certificate authorization fails with correct client cert and wrong password in encrypted PEM format", expected_stderr => - qr!\Qprivate key file "$key{'client-encrypted-pem.key'}": bad decrypt\E! + qr!private key file \".*client-encrypted-pem\.key\": bad decrypt!, ); @@ -445,7 +419,7 @@ my $dn_connstr = "$common_connstr dbname=certdb_dn"; $node->connect_ok( - "$dn_connstr user=ssltestuser sslcert=ssl/client-dn.crt sslkey=$key{'client-dn.key'}", + "$dn_connstr user=ssltestuser sslcert=ssl/client-dn.crt " . sslkey('client-dn.key'), "certificate authorization succeeds with DN mapping", log_like => [ qr/connection authenticated: identity="CN=ssltestuser-dn,OU=Testing,OU=Engineering,O=PGDG" method=cert/ @@ -455,14 +429,14 @@ $dn_connstr = "$common_connstr dbname=certdb_dn_re"; $node->connect_ok( - "$dn_connstr user=ssltestuser sslcert=ssl/client-dn.crt sslkey=$key{'client-dn.key'}", + "$dn_connstr user=ssltestuser sslcert=ssl/client-dn.crt " . sslkey('client-dn.key'), "certificate authorization succeeds with DN regex mapping"); # same thing but using explicit CN $dn_connstr = "$common_connstr dbname=certdb_cn"; $node->connect_ok( - "$dn_connstr user=ssltestuser sslcert=ssl/client-dn.crt sslkey=$key{'client-dn.key'}", + "$dn_connstr user=ssltestuser sslcert=ssl/client-dn.crt " . sslkey('client-dn.key'), "certificate authorization succeeds with CN mapping", # the full DN should still be used as the authenticated identity log_like => [ @@ -480,18 +454,18 @@ # correct client cert in encrypted PEM with empty password $node->connect_fails( - "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=$key{'client-encrypted-pem.key'} sslpassword=''", + "$common_connstr user=ssltestuser sslcert=ssl/client.crt " . sslkey('client-encrypted-pem.key') . " sslpassword=''", "certificate authorization fails with correct client cert and empty password in encrypted PEM format", expected_stderr => - qr!\Qprivate key file "$key{'client-encrypted-pem.key'}": processing error\E! + qr!private key file \".*client-encrypted-pem\.key\": processing error! ); # correct client cert in encrypted PEM with no password $node->connect_fails( - "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=$key{'client-encrypted-pem.key'}", + "$common_connstr user=ssltestuser sslcert=ssl/client.crt " . sslkey('client-encrypted-pem.key'), "certificate authorization fails with correct client cert and no password in encrypted PEM format", expected_stderr => - qr!\Qprivate key file "$key{'client-encrypted-pem.key'}": processing error\E! + qr!private key file \".*client-encrypted-pem\.key\": processing error! ); } @@ -534,12 +508,12 @@ '-P', 'null=_null_', '-d', - "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=$key{'client.key'}", + "$common_connstr user=ssltestuser sslcert=ssl/client.crt " . sslkey('client.key'), '-c', "SELECT * FROM pg_stat_ssl WHERE pid = pg_backend_pid()" ], qr{^pid,ssl,version,cipher,bits,client_dn,client_serial,issuer_dn\r?\n - ^\d+,t,TLSv[\d.]+,[\w-]+,\d+,/CN=ssltestuser,$serialno,\Q/CN=Test CA for PostgreSQL SSL regression test client certs\E\r?$}mx, + ^\d+,t,TLSv[\d.]+,[\w-]+,\d+,/?CN=ssltestuser,$serialno,/?\QCN=Test CA for PostgreSQL SSL regression test client certs\E\r?$}mx, 'pg_stat_ssl with client certificate'); # client key with wrong permissions @@ -548,16 +522,16 @@ skip "Permissions check not enforced on Windows", 2 if ($windows_os); $node->connect_fails( - "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=$key{'client_wrongperms.key'}", + "$common_connstr user=ssltestuser sslcert=ssl/client.crt " . sslkey('client_wrongperms.key'), "certificate authorization fails because of file permissions", expected_stderr => - qr!\Qprivate key file "$key{'client_wrongperms.key'}" has group or world access\E! + qr!private key file \".*client_wrongperms\.key\" has group or world access! ); } # client cert belonging to another user $node->connect_fails( - "$common_connstr user=anotheruser sslcert=ssl/client.crt sslkey=$key{'client.key'}", + "$common_connstr user=anotheruser sslcert=ssl/client.crt " . sslkey('client.key'), "certificate authorization fails with client cert belonging to another user", expected_stderr => qr/certificate authentication failed for user "anotheruser"/, @@ -567,7 +541,7 @@ # revoked client cert $node->connect_fails( - "$common_connstr user=ssltestuser sslcert=ssl/client-revoked.crt sslkey=$key{'client-revoked.key'}", + "$common_connstr user=ssltestuser sslcert=ssl/client-revoked.crt " . sslkey('client-revoked.key'), "certificate authorization fails with revoked client cert", expected_stderr => qr/SSL error: sslv3 alert certificate revoked/, # revoked certificates should not authenticate the user @@ -580,31 +554,31 @@ "$default_ssl_connstr sslrootcert=ssl/root+server_ca.crt sslmode=require dbname=verifydb hostaddr=$SERVERHOSTADDR host=localhost"; $node->connect_ok( - "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=$key{'client.key'}", + "$common_connstr user=ssltestuser sslcert=ssl/client.crt " . sslkey('client.key'), "auth_option clientcert=verify-full succeeds with matching username and Common Name", # verify-full does not provide authentication log_unlike => [qr/connection authenticated:/],); $node->connect_fails( - "$common_connstr user=anotheruser sslcert=ssl/client.crt sslkey=$key{'client.key'}", + "$common_connstr user=anotheruser sslcert=ssl/client.crt " . sslkey('client.key'), "auth_option clientcert=verify-full fails with mismatching username and Common Name", expected_stderr => qr/FATAL: .* "trust" authentication failed for user "anotheruser"/, # verify-full does not provide authentication log_unlike => [qr/connection authenticated:/],); -# Check that connecting with auth-optionverify-ca in pg_hba : +# Check that connecting with auth-option verify-ca in pg_hba : # works, when username doesn't match Common Name $node->connect_ok( - "$common_connstr user=yetanotheruser sslcert=ssl/client.crt sslkey=$key{'client.key'}", + "$common_connstr user=yetanotheruser sslcert=ssl/client.crt " . sslkey('client.key'), "auth_option clientcert=verify-ca succeeds with mismatching username and Common Name", # verify-full does not provide authentication log_unlike => [qr/connection authenticated:/],); # intermediate client_ca.crt is provided by client, and isn't in server's ssl_ca_file -switch_server_cert($node, 'server-cn-only', 'root_ca'); +switch_server_cert($node, certfile => 'server-cn-only', cafile => 'root_ca'); $common_connstr = - "$default_ssl_connstr user=ssltestuser dbname=certdb sslkey=$key{'client.key'} sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR host=localhost"; + "$default_ssl_connstr user=ssltestuser dbname=certdb " . sslkey('client.key') . " sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR host=localhost"; $node->connect_ok( "$common_connstr sslmode=require sslcert=ssl/client+client_ca.crt", @@ -615,12 +589,11 @@ expected_stderr => qr/SSL error: tlsv1 alert unknown ca/); # test server-side CRL directory -switch_server_cert($node, 'server-cn-only', undef, undef, - 'root+client-crldir'); +switch_server_cert($node, certfile => 'server-cn-only', crldir => 'root+client-crldir'); # revoked client cert $node->connect_fails( - "$common_connstr user=ssltestuser sslcert=ssl/client-revoked.crt sslkey=$key{'client-revoked.key'}", + "$common_connstr user=ssltestuser sslcert=ssl/client-revoked.crt " . sslkey('client-revoked.key'), "certificate authorization fails with revoked client cert with server-side CRL directory", expected_stderr => qr/SSL error: sslv3 alert certificate revoked/); diff --git a/src/test/ssl/t/002_scram.pl b/src/test/ssl/t/002_scram.pl index 4decd7a506..4354901f53 100644 --- a/src/test/ssl/t/002_scram.pl +++ b/src/test/ssl/t/002_scram.pl @@ -14,13 +14,24 @@ use FindBin; use lib $FindBin::RealBin; -use SSLServer; +use SSL::Server; if ($ENV{with_ssl} ne 'openssl') { plan skip_all => 'OpenSSL not supported by this build'; } +my $ssl_server = SSL::Server->new(); +sub sslkey +{ + return $ssl_server->sslkey(@_); +} +sub switch_server_cert +{ + $ssl_server->switch_server_cert(@_); +} + + # This is the hostname used to connect to the server. my $SERVERHOSTADDR = '127.0.0.1'; # This is the pattern to use in pg_hba.conf to match incoming connections. @@ -46,9 +57,9 @@ $node->start; # Configure server for SSL connections, with password handling. -configure_test_server_for_ssl($node, $SERVERHOSTADDR, $SERVERHOSTCIDR, +$ssl_server->configure_test_server_for_ssl($node, $SERVERHOSTADDR, $SERVERHOSTCIDR, "scram-sha-256", 'password' => "pass", 'password_enc' => "scram-sha-256"); -switch_server_cert($node, 'server-cn-only'); +switch_server_cert($node, certfile => 'server-cn-only'); $ENV{PGPASSWORD} = "pass"; $common_connstr = "dbname=trustdb sslmode=require sslcert=invalid sslrootcert=invalid hostaddr=$SERVERHOSTADDR host=localhost"; diff --git a/src/test/ssl/t/003_sslinfo.pl b/src/test/ssl/t/003_sslinfo.pl index 72eb6b860c..96a5db8672 100644 --- a/src/test/ssl/t/003_sslinfo.pl +++ b/src/test/ssl/t/003_sslinfo.pl @@ -12,7 +12,7 @@ use FindBin; use lib $FindBin::RealBin; -use SSLServer; +use SSL::Server; if ($ENV{with_ssl} ne 'openssl') { @@ -20,6 +20,15 @@ } #### Some configuration +my $ssl_server = SSL::Server->new(); +sub sslkey +{ + return $ssl_server->sslkey(@_); +} +sub switch_server_cert +{ + $ssl_server->switch_server_cert(@_); +} # This is the hostname used to connect to the server. This cannot be a # hostname, because the server certificate is always for the domain @@ -31,17 +40,6 @@ # Allocation of base connection string shared among multiple tests. my $common_connstr; -# The client's private key must not be world-readable, so take a copy -# of the key stored in the code tree and update its permissions. -my $cert_tempdir = PostgreSQL::Test::Utils::tempdir(); -my $client_tmp_key = "$cert_tempdir/client_ext.key"; -copy("ssl/client_ext.key", "$cert_tempdir/client_ext.key") - or die - "couldn't copy ssl/client_ext.key to $cert_tempdir/client_ext.key for permissions change: $!"; -chmod 0600, "$cert_tempdir/client_ext.key" - or die "failed to change permissions on $cert_tempdir/client_ext.key: $!"; -$client_tmp_key =~ s!\\!/!g if $PostgreSQL::Test::Utils::windows_os; - #### Set up the server. note "setting up data directory"; @@ -54,13 +52,13 @@ $ENV{PGPORT} = $node->port; $node->start; -configure_test_server_for_ssl($node, $SERVERHOSTADDR, $SERVERHOSTCIDR, +$ssl_server->configure_test_server_for_ssl($node, $SERVERHOSTADDR, $SERVERHOSTCIDR, 'trust', extensions => [ qw(sslinfo) ]); # We aren't using any CRL's in this suite so we can keep using server-revoked # as server certificate for simple client.crt connection much like how the # 001 test does. -switch_server_cert($node, 'server-revoked'); +switch_server_cert($node, certfile => 'server-revoked'); # Set of default settings for SSL parameters in connection string. This # makes the tests protected against any defaults the environment may have @@ -69,7 +67,7 @@ $common_connstr = "$default_ssl_connstr sslrootcert=ssl/root+server_ca.crt sslmode=require dbname=certdb hostaddr=$SERVERHOSTADDR host=localhost " . - "user=ssltestuser sslcert=ssl/client_ext.crt sslkey=$client_tmp_key"; + "user=ssltestuser sslcert=ssl/client_ext.crt " . sslkey('client_ext.key'); # Make sure we can connect even though previous test suites have established this $node->connect_ok( diff --git a/src/test/ssl/t/SSL/Backend/OpenSSL.pm b/src/test/ssl/t/SSL/Backend/OpenSSL.pm new file mode 100644 index 0000000000..1546b5081b --- /dev/null +++ b/src/test/ssl/t/SSL/Backend/OpenSSL.pm @@ -0,0 +1,226 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +=pod + +=head1 NAME + +SSL::Backend::OpenSSL + +=head1 SYNOPSIS + + use SSL::Backend::OpenSSL; + + my $backend = SSL::Backend::OpenSSL->new(); + + $backend->init($pgdata); + +=head1 DESCRIPTION + +SSL::Backend::OpenSSL implements the library specific parts in SSL::Server +for a PostgreSQL cluster compiled against OpenSSL. + +=cut + +package SSL::Backend::OpenSSL; + +use strict; +use warnings; +use File::Basename; +use File::Copy; + +=pod + +=head1 METHODS + +=over + +=item SSL::Backend::OpenSSL->new() + +Create a new instance of the OpenSSL backend. + +=cut + +sub new +{ + my ($class) = @_; + + my $self = { _library => 'OpenSSL', key => {} }; + + bless $self, $class; + + return $self; +} + +=pod + +=item $backend->init(pgdata) + +Install certificates, keys and CRL files required to run the tests against an +OpenSSL backend. + +=cut + +sub init +{ + my ($self, $pgdata) = @_; + + # Install server certificates and keys into the cluster data directory. + _copy_files("ssl/server-*.crt", $pgdata); + _copy_files("ssl/server-*.key", $pgdata); + chmod(0600, glob "$pgdata/server-*.key") + or die "failed to change permissions on server keys: $!"; + _copy_files("ssl/root+client_ca.crt", $pgdata); + _copy_files("ssl/root_ca.crt", $pgdata); + _copy_files("ssl/root+client.crl", $pgdata); + mkdir("$pgdata/root+client-crldir") + or die "unable to create server CRL dir $pgdata/root+client-crldir: $!"; + _copy_files("ssl/root+client-crldir/*", "$pgdata/root+client-crldir/"); + + # The client's private key must not be world-readable, so take a copy + # of the key stored in the code tree and update its permissions. + # + # This changes to using keys stored in a temporary path for the rest of + # the tests. To get the full path for inclusion in connection strings, the + # %key hash can be interrogated. + my $cert_tempdir = PostgreSQL::Test::Utils::tempdir(); + my @keys = ( + "client.key", "client-revoked.key", + "client-der.key", "client-encrypted-pem.key", + "client-encrypted-der.key", "client-dn.key", + "client_ext.key"); + foreach my $keyfile (@keys) + { + copy("ssl/$keyfile", "$cert_tempdir/$keyfile") + or die + "couldn't copy ssl/$keyfile to $cert_tempdir/$keyfile for permissions change: $!"; + chmod 0600, "$cert_tempdir/$keyfile" + or die "failed to change permissions on $cert_tempdir/$keyfile: $!"; + $self->{key}->{$keyfile} = "$cert_tempdir/$keyfile"; + $self->{key}->{$keyfile} =~ s!\\!/!g + if $PostgreSQL::Test::Utils::windows_os; + } + + # Also make a copy of client.key explicitly world-readable in order to be + # able to test incorrect permissions. We can't necessarily rely on the + # file in the source tree having those permissions. + copy("ssl/client.key", "$cert_tempdir/client_wrongperms.key") + or die + "couldn't copy ssl/client_key to $cert_tempdir/client_wrongperms.key for permission change: $!"; + chmod 0644, "$cert_tempdir/client_wrongperms.key" + or die "failed to change permissions on $cert_tempdir/client_wrongperms.key: $!"; + $self->{key}->{'client_wrongperms.key'} = "$cert_tempdir/client_wrongperms.key"; + $self->{key}->{'client_wrongperms.key'} =~ s!\\!/!g + if $PostgreSQL::Test::Utils::windows_os; +} + +=pod + +=item $backend->get_sslkey(key) + +Get an 'sslkey' connection string parameter for the specified B which has +the correct path for direct inclusion in a connection string. + +=cut + +sub get_sslkey +{ + my ($self, $keyfile) = @_; + + return " sslkey=$self->{key}->{$keyfile}"; +} + +=pod + +=item $backend->set_server_cert(params) + +Change the configuration to use given server cert, key and crl file(s). The +following paramters are supported: + +=over + +=item cafile => B + +The CA certificate file to use for the C GUC. If omitted it will +default to 'root+client_ca.crt'. + +=item certfile => B + +The server certificate file to use for the C GUC. + +=item keyfile => B + +The private key file to use for the C. If omitted it will +default to the B.key. + +=item crlfile => B + +The CRL file to use for the C GUC. If omitted it will default to +'root+client.crl'. + +=item crldir => B + +The CRL directory to use for the C GUC. If omitted, +C configuration parameter will be set. + +=back + +=cut + +sub set_server_cert +{ + my ($self, $params) = @_; + + $params->{cafile} = 'root+client_ca' unless defined $params->{cafile}; + $params->{crlfile} = 'root+client.crl' unless defined $params->{crlfile}; + $params->{keyfile} = $params->{certfile} unless defined $params->{keyfile}; + + my $sslconf = + "ssl_ca_file='$params->{cafile}.crt'\n" + . "ssl_cert_file='$params->{certfile}.crt'\n" + . "ssl_key_file='$params->{keyfile}.key'\n" + . "ssl_crl_file='$params->{crlfile}'\n"; + $sslconf .= "ssl_crl_dir='$params->{crldir}'\n" + if defined $params->{crldir}; + + return $sslconf; +} + +=pod + +=item $backend->get_library() + +Returns the name of the SSL library, in this case "OpenSSL". + +=cut + +sub get_library +{ + my ($self) = @_; + + return $self->{_library}; +} + +# Internal method for copying a set of files, taking into account wildcards +sub _copy_files +{ + my $orig = shift; + my $dest = shift; + + my @orig_files = glob $orig; + foreach my $orig_file (@orig_files) + { + my $base_file = basename($orig_file); + copy($orig_file, "$dest/$base_file") + or die "Could not copy $orig_file to $dest"; + } + return; +} + +=pod + +=back + +=cut + +1; diff --git a/src/test/ssl/t/SSL/Server.pm b/src/test/ssl/t/SSL/Server.pm new file mode 100644 index 0000000000..de460c2d96 --- /dev/null +++ b/src/test/ssl/t/SSL/Server.pm @@ -0,0 +1,353 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +=pod + +=head1 NAME + +SSL::Server - Class for setting up SSL in a PostgreSQL Cluster + +=head1 SYNOPSIS + + use PostgreSQL::Test::Cluster; + use SSL::Server; + + # Create a new cluster + my $node = PostgreSQL::Test::Cluster->new('primary'); + + # Initialize and start the new cluster + $node->init; + $node->start; + + # Initialize SSL Server functionality for the cluster + my $ssl_server = SSL::Server->new(); + + # Configure SSL on the newly formed cluster + $server->configure_test_server_for_ssl($node, '127.0.0.1', '127.0.0.1/32', 'trust'); + +=head1 DESCRIPTION + +SSL::Server configures an existing test cluster, for the SSL regression tests. + +The server is configured as follows: + +=over + +=item * SSL enabled, with the server certificate specified by arguments to switch_server_cert function. + +=item * reject non-SSL connections + +=item * a database called trustdb that lets anyone in + +=item * another database called certdb that uses certificate authentication, ie. the client must present a valid certificate signed by the client CA + +=back + +The server is configured to only accept connections from localhost. If you +want to run the client from another host, you'll have to configure that +manually. + +Note: Someone running these test could have key or certificate files in their +~/.postgresql/, which would interfere with the tests. The way to override that +is to specify sslcert=invalid and/or sslrootcert=invalid if no actual +certificate is used for a particular test. libpq will ignore specifications +that name nonexisting files. (sslkey and sslcrl do not need to specified +explicitly because an invalid sslcert or sslrootcert, respectively, causes +those to be ignored.) + +The SSL::Server module presents a SSL library abstraction to the test writer, +which in turn use modules in SSL::Backend which implements the SSL library +specific infrastructure. Currently only OpenSSL is supported. + +=cut + +package SSL::Server; + +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; +use SSL::Backend::OpenSSL; + +=pod + +=head1 METHODS + +=over + +=item SSL::Server->new(flavor) + +Create a new SSL Server object for configuring a PostgreSQL test cluster +node for accepting SSL connections using the with B selected SSL +backend. If B isn't set, the C environment variable will +be used for selecting backend. Currently only C is supported. + +=cut + +sub new +{ + my $class = shift; + my $flavor = shift || $ENV{with_ssl}; + die "SSL flavor not defined" unless $flavor; + my $self = {}; + bless $self, $class; + if ($flavor =~ /\Aopenssl\z/i) + { + $self->{flavor} = 'openssl'; + $self->{backend} = SSL::Backend::OpenSSL->new(); + } + else + { + die "SSL flavor $flavor unknown"; + } + return $self; +} + +=pod + +=item sslkey(filename) + +Return a C construct for the specified key for use in a connection +string. + +=cut + +sub sslkey +{ + my $self = shift; + my $keyfile = shift; + my $backend = $self->{backend}; + + return $backend->get_sslkey($keyfile); +} + +=pod + +=item $server->configure_test_server_for_ssl(node, host, cidr, auth, params) + +Configure the cluster specified by B or listening on SSL connections. +The following databases will be created in the cluster: trustdb, certdb, +certdb_dn, certdb_dn_re, certdb_cn, verifydb. The following users will be +created in the cluster: ssltestuser, md5testuser, anotheruser, yetanotheruser. +If B<< $params{password} >> is set, it will be used as password for all users +with the password encoding B<< $params{password_enc} >> (except for md5testuser +which always have MD5). Extensions defined in B<< @{$params{extension}} >> +will be created in all the above created databases. B is used for +C and B for configuring C. + +=cut + +sub configure_test_server_for_ssl +{ + my $self=shift; + my ($node, $serverhost, $servercidr, $authmethod, %params) = @_; + my $backend = $self->{backend}; + my $pgdata = $node->data_dir; + + my @databases = ( 'trustdb', 'certdb', 'certdb_dn', 'certdb_dn_re', 'certdb_cn', 'verifydb' ); + + # Create test users and databases + $node->psql('postgres', "CREATE USER ssltestuser"); + $node->psql('postgres', "CREATE USER md5testuser"); + $node->psql('postgres', "CREATE USER anotheruser"); + $node->psql('postgres', "CREATE USER yetanotheruser"); + + foreach my $db (@databases) + { + $node->psql('postgres', "CREATE DATABASE $db"); + } + + # Update password of each user as needed. + if (defined($params{password})) + { + die "Password encryption must be specified when password is set" + unless defined($params{password_enc}); + + $node->psql('postgres', + "SET password_encryption='$params{password_enc}'; ALTER USER ssltestuser PASSWORD '$params{password}';" + ); + # A special user that always has an md5-encrypted password + $node->psql('postgres', + "SET password_encryption='md5'; ALTER USER md5testuser PASSWORD '$params{password}';" + ); + $node->psql('postgres', + "SET password_encryption='$params{password_enc}'; ALTER USER anotheruser PASSWORD '$params{password}';" + ); + } + + # Create any extensions requested in the setup + if (defined($params{extensions})) + { + foreach my $extension (@{$params{extensions}}) + { + foreach my $db (@databases) + { + $node->psql($db, "CREATE EXTENSION $extension CASCADE;"); + } + } + } + + # enable logging etc. + open my $conf, '>>', "$pgdata/postgresql.conf"; + print $conf "fsync=off\n"; + print $conf "log_connections=on\n"; + print $conf "log_hostname=on\n"; + print $conf "listen_addresses='$serverhost'\n"; + print $conf "log_statement=all\n"; + + # enable SSL and set up server key + print $conf "include 'sslconfig.conf'\n"; + + close $conf; + + # SSL configuration will be placed here + open my $sslconf, '>', "$pgdata/sslconfig.conf"; + close $sslconf; + + # Perform backend specific configuration + $backend->init($pgdata); + + # Stop and restart server to load new listen_addresses. + $node->restart; + + # Change pg_hba after restart because hostssl requires ssl=on + _configure_hba_for_ssl($node, $servercidr, $authmethod); + + return; +} + +=pod + +=item $server->ssl_library() + +Get the name of the currently used SSL backend. + +=cut + +sub ssl_library +{ + my $self = shift; + my $backend = $self->{backend}; + + return $backend->get_library(); +} + +=pod + +=item switch_server_cert(params) + +Change the configuration to use the given set of certificate, key, ca and +CRL, and potentially reload the configuration by restarting the server so +that the configuration takes effect. Restarting is the default, passing +B<< $params{restart} >> => 'no' opts out of it leaving the server running. +The following params are supported: + +=over + +=item cafile => B + +The CA certificate to use. Implementation is SSL backend specific. + +=item certfile => B + +The certificate file to use. Implementation is SSL backend specific. + +=item keyfile => B + +The private key to to use. Implementation is SSL backend specific. + +=item crlfile => B + +The CRL file to use. Implementation is SSL backend specific. + +=item crldir => B + +The CRL directory to use. Implementation is SSL backend specific. + +=item passphrase_cmd => B + +The passphrase command to use. If not set, an empty passphrase command will +be set. + +=item restart => B + +If set to 'no', the server won't be restarted after updating the settings. +If omitted, or any other value is passed, the server will be restarted before +returning. + +=back + +=cut + +sub switch_server_cert +{ + my $self = shift; + my $node = shift; + my $backend = $self->{backend}; + my %params = @_; + my $pgdata = $node->data_dir; + + open my $sslconf, '>', "$pgdata/sslconfig.conf"; + print $sslconf "ssl=on\n"; + print $sslconf $backend->set_server_cert(\%params); + print $sslconf "ssl_passphrase_command='" . $params{passphrase_cmd} . "'\n" + if defined $params{passphrase_cmd}; + close $sslconf; + + return if (defined($params{restart}) && $params{restart} eq 'no'); + + $node->restart; + return; +} + + +# Internal function for configuring pg_hba.conf for SSL connections. +sub _configure_hba_for_ssl +{ + my ($node, $servercidr, $authmethod) = @_; + my $pgdata = $node->data_dir; + + # Only accept SSL connections from $servercidr. Our tests don't depend on this + # but seems best to keep it as narrow as possible for security reasons. + # + # When connecting to certdb, also check the client certificate. + open my $hba, '>', "$pgdata/pg_hba.conf"; + print $hba + "# TYPE DATABASE USER ADDRESS METHOD OPTIONS\n"; + print $hba + "hostssl trustdb md5testuser $servercidr md5\n"; + print $hba + "hostssl trustdb all $servercidr $authmethod\n"; + print $hba + "hostssl verifydb ssltestuser $servercidr $authmethod clientcert=verify-full\n"; + print $hba + "hostssl verifydb anotheruser $servercidr $authmethod clientcert=verify-full\n"; + print $hba + "hostssl verifydb yetanotheruser $servercidr $authmethod clientcert=verify-ca\n"; + print $hba + "hostssl certdb all $servercidr cert\n"; + print $hba + "hostssl certdb_dn all $servercidr cert clientname=DN map=dn\n", + "hostssl certdb_dn_re all $servercidr cert clientname=DN map=dnre\n", + "hostssl certdb_cn all $servercidr cert clientname=CN map=cn\n"; + close $hba; + + # Also set the ident maps. Note: fields with commas must be quoted + open my $map, ">", "$pgdata/pg_ident.conf"; + print $map + "# MAPNAME SYSTEM-USERNAME PG-USERNAME\n", + "dn \"CN=ssltestuser-dn,OU=Testing,OU=Engineering,O=PGDG\" ssltestuser\n", + "dnre \"/^.*OU=Testing,.*\$\" ssltestuser\n", + "cn ssltestuser-dn ssltestuser\n"; + + return; +} + +=pod + +=back + +=cut + +1; diff --git a/src/test/ssl/t/SSLServer.pm b/src/test/ssl/t/SSLServer.pm deleted file mode 100644 index c85c6fd997..0000000000 --- a/src/test/ssl/t/SSLServer.pm +++ /dev/null @@ -1,219 +0,0 @@ - -# Copyright (c) 2021-2022, PostgreSQL Global Development Group - -# This module sets up a test server, for the SSL regression tests. -# -# The server is configured as follows: -# -# - SSL enabled, with the server certificate specified by argument to -# switch_server_cert function. -# - ssl/root+client_ca.crt as the CA root for validating client certs. -# - reject non-SSL connections -# - a database called trustdb that lets anyone in -# - another database called certdb that uses certificate authentication, ie. -# the client must present a valid certificate signed by the client CA -# -# The server is configured to only accept connections from localhost. If you -# want to run the client from another host, you'll have to configure that -# manually. -# -# Note: Someone running these test could have key or certificate files -# in their ~/.postgresql/, which would interfere with the tests. The -# way to override that is to specify sslcert=invalid and/or -# sslrootcert=invalid if no actual certificate is used for a -# particular test. libpq will ignore specifications that name -# nonexisting files. (sslkey and sslcrl do not need to specified -# explicitly because an invalid sslcert or sslrootcert, respectively, -# causes those to be ignored.) - -package SSLServer; - -use strict; -use warnings; -use PostgreSQL::Test::Cluster; -use PostgreSQL::Test::Utils; -use File::Basename; -use File::Copy; -use Test::More; - -use Exporter 'import'; -our @EXPORT = qw( - configure_test_server_for_ssl - switch_server_cert -); - -# Copy a set of files, taking into account wildcards -sub copy_files -{ - my $orig = shift; - my $dest = shift; - - my @orig_files = glob $orig; - foreach my $orig_file (@orig_files) - { - my $base_file = basename($orig_file); - copy($orig_file, "$dest/$base_file") - or die "Could not copy $orig_file to $dest"; - } - return; -} - -# serverhost: what to put in listen_addresses, e.g. '127.0.0.1' -# servercidr: what to put in pg_hba.conf, e.g. '127.0.0.1/32' -sub configure_test_server_for_ssl -{ - my ($node, $serverhost, $servercidr, $authmethod, %params) = @_; - my $pgdata = $node->data_dir; - - my @databases = ( 'trustdb', 'certdb', 'certdb_dn', 'certdb_dn_re', 'certdb_cn', 'verifydb' ); - - # Create test users and databases - $node->psql('postgres', "CREATE USER ssltestuser"); - $node->psql('postgres', "CREATE USER md5testuser"); - $node->psql('postgres', "CREATE USER anotheruser"); - $node->psql('postgres', "CREATE USER yetanotheruser"); - - foreach my $db (@databases) - { - $node->psql('postgres', "CREATE DATABASE $db"); - } - - # Update password of each user as needed. - if (defined($params{password})) - { - die "Password encryption must be specified when password is set" - unless defined($params{password_enc}); - - $node->psql('postgres', - "SET password_encryption='$params{password_enc}'; ALTER USER ssltestuser PASSWORD '$params{password}';" - ); - # A special user that always has an md5-encrypted password - $node->psql('postgres', - "SET password_encryption='md5'; ALTER USER md5testuser PASSWORD '$params{password}';" - ); - $node->psql('postgres', - "SET password_encryption='$params{password_enc}'; ALTER USER anotheruser PASSWORD '$params{password}';" - ); - } - - # Create any extensions requested in the setup - if (defined($params{extensions})) - { - foreach my $extension (@{$params{extensions}}) - { - foreach my $db (@databases) - { - $node->psql($db, "CREATE EXTENSION $extension CASCADE;"); - } - } - } - - # enable logging etc. - open my $conf, '>>', "$pgdata/postgresql.conf"; - print $conf "fsync=off\n"; - print $conf "log_connections=on\n"; - print $conf "log_hostname=on\n"; - print $conf "listen_addresses='$serverhost'\n"; - print $conf "log_statement=all\n"; - - # enable SSL and set up server key - print $conf "include 'sslconfig.conf'\n"; - - close $conf; - - # ssl configuration will be placed here - open my $sslconf, '>', "$pgdata/sslconfig.conf"; - close $sslconf; - - # Copy all server certificates and keys, and client root cert, to the data dir - copy_files("ssl/server-*.crt", $pgdata); - copy_files("ssl/server-*.key", $pgdata); - chmod(0600, glob "$pgdata/server-*.key") or die $!; - copy_files("ssl/root+client_ca.crt", $pgdata); - copy_files("ssl/root_ca.crt", $pgdata); - copy_files("ssl/root+client.crl", $pgdata); - mkdir("$pgdata/root+client-crldir"); - copy_files("ssl/root+client-crldir/*", "$pgdata/root+client-crldir/"); - - # Stop and restart server to load new listen_addresses. - $node->restart; - - # Change pg_hba after restart because hostssl requires ssl=on - configure_hba_for_ssl($node, $servercidr, $authmethod); - - return; -} - -# Change the configuration to use given server cert file, and reload -# the server so that the configuration takes effect. -sub switch_server_cert -{ - my $node = $_[0]; - my $certfile = $_[1]; - my $cafile = $_[2] || "root+client_ca"; - my $crlfile = "root+client.crl"; - my $crldir; - my $pgdata = $node->data_dir; - - # defaults to use crl file - if (defined $_[3] || defined $_[4]) - { - $crlfile = $_[3]; - $crldir = $_[4]; - } - - open my $sslconf, '>', "$pgdata/sslconfig.conf"; - print $sslconf "ssl=on\n"; - print $sslconf "ssl_ca_file='$cafile.crt'\n"; - print $sslconf "ssl_cert_file='$certfile.crt'\n"; - print $sslconf "ssl_key_file='$certfile.key'\n"; - print $sslconf "ssl_crl_file='$crlfile'\n" if defined $crlfile; - print $sslconf "ssl_crl_dir='$crldir'\n" if defined $crldir; - close $sslconf; - - $node->restart; - return; -} - -sub configure_hba_for_ssl -{ - my ($node, $servercidr, $authmethod) = @_; - my $pgdata = $node->data_dir; - - # Only accept SSL connections from $servercidr. Our tests don't depend on this - # but seems best to keep it as narrow as possible for security reasons. - # - # When connecting to certdb, also check the client certificate. - open my $hba, '>', "$pgdata/pg_hba.conf"; - print $hba - "# TYPE DATABASE USER ADDRESS METHOD OPTIONS\n"; - print $hba - "hostssl trustdb md5testuser $servercidr md5\n"; - print $hba - "hostssl trustdb all $servercidr $authmethod\n"; - print $hba - "hostssl verifydb ssltestuser $servercidr $authmethod clientcert=verify-full\n"; - print $hba - "hostssl verifydb anotheruser $servercidr $authmethod clientcert=verify-full\n"; - print $hba - "hostssl verifydb yetanotheruser $servercidr $authmethod clientcert=verify-ca\n"; - print $hba - "hostssl certdb all $servercidr cert\n"; - print $hba - "hostssl certdb_dn all $servercidr cert clientname=DN map=dn\n", - "hostssl certdb_dn_re all $servercidr cert clientname=DN map=dnre\n", - "hostssl certdb_cn all $servercidr cert clientname=CN map=cn\n"; - close $hba; - - # Also set the ident maps. Note: fields with commas must be quoted - open my $map, ">", "$pgdata/pg_ident.conf"; - print $map - "# MAPNAME SYSTEM-USERNAME PG-USERNAME\n", - "dn \"CN=ssltestuser-dn,OU=Testing,OU=Engineering,O=PGDG\" ssltestuser\n", - "dnre \"/^.*OU=Testing,.*\$\" ssltestuser\n", - "cn ssltestuser-dn ssltestuser\n"; - - return; -} - -1; From 404f49338fef32150f930ddfa8ae0411b5e35121 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Sun, 27 Mar 2022 00:11:38 +0100 Subject: [PATCH 264/772] Wait for subscription to sync in t/031_column_list.sql One of the TAP tests added in 923def9a53 did not wait after creating a subscription, and wait_for_catchup is not sufficient for this. So if the tablesync workers happen do not complete quickly enough, the test won't see the expected results. This probably explains intermittent failures on a couple buildfarm animals (komodoensis, petalura and snapper). Reported-by: Tom Lane Discussion: https://postgr.es/m/170549.1648330634@sss.pgh.pa.us --- src/test/subscription/t/031_column_list.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/subscription/t/031_column_list.pl b/src/test/subscription/t/031_column_list.pl index c778840f4c..bdcf3e4a24 100644 --- a/src/test/subscription/t/031_column_list.pl +++ b/src/test/subscription/t/031_column_list.pl @@ -722,7 +722,7 @@ sub wait_for_subscription_sync CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub8; )); -$node_publisher->wait_for_catchup('sub1'); +wait_for_subscription_sync($node_subscriber); $node_publisher->safe_psql('postgres', qq( INSERT INTO test_part_c VALUES (3, 7, 8); From 291e517a4dc93b4137b0da8d46350f9300183f05 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sun, 27 Mar 2022 17:53:40 +0900 Subject: [PATCH 265/772] pageinspect: Add more sanity checks to prevent out-of-bound reads A couple of code paths use the special area on the page passed by the function caller, expecting to find some data in it. However, feeding an incorrect page can lead to out-of-bound reads when trying to access the page special area (like a heap page that has no special area, leading PageGetSpecialPointer() to grab a pointer outside the allocated page). The functions used for hash and btree indexes have some protection already against that, while some other functions using a relation OID as argument would make sure that the access method involved is correct, but functions taking in input a raw page without knowing the relation the page is attached to would run into problems. This commit improves the set of checks used in the code paths of BRIN, btree (including one check if a leaf page is found with a non-zero level), GIN and GiST to verify that the page given in input has a special area size that fits with each access method, which is done though PageGetSpecialSize(), becore calling PageGetSpecialPointer(). The scope of the checks done is limited to work with pages that one would pass after getting a block with get_raw_page(), as it is possible to craft byteas that could bypass existing code paths. Having too many checks would also impact the usability of pageinspect, as the existing code is very useful to look at the content details in a corrupted page, so the focus is really to avoid out-of-bound reads as this is never a good thing even with functions whose execution is limited to superusers. The safest approach could be to rework the functions so as these fetch a block using a relation OID and a block number, but there are also cases where using a raw page is useful. Tests are added to cover all the code paths that needed such checks, and an error message for hash indexes is reworded to fit better with what this commit adds. Reported-By: Alexander Lakhin Author: Julien Rouhaud, Michael Paquier Discussion: https://postgr.es/m/16527-ef7606186f0610a1@postgresql.org Discussion: https://postgr.es/m/561e187b-3549-c8d5-03f5-525c14e65bd0@postgrespro.ru Backpatch-through: 10 --- contrib/pageinspect/brinfuncs.c | 18 +++++++++++++ contrib/pageinspect/btreefuncs.c | 14 +++++++++++ contrib/pageinspect/expected/brin.out | 10 ++++++++ contrib/pageinspect/expected/btree.out | 22 +++++++++++++--- contrib/pageinspect/expected/gin.out | 14 ++++++++--- contrib/pageinspect/expected/gist.out | 12 +++++++-- contrib/pageinspect/expected/hash.out | 14 +++++++++-- contrib/pageinspect/ginfuncs.c | 22 +++++++++++++--- contrib/pageinspect/gistfuncs.c | 35 ++++++++++++++++++++++++++ contrib/pageinspect/hashfuncs.c | 11 +++++--- contrib/pageinspect/sql/brin.sql | 8 ++++++ contrib/pageinspect/sql/btree.sql | 18 ++++++++++--- contrib/pageinspect/sql/gin.sql | 13 +++++++--- contrib/pageinspect/sql/gist.sql | 9 +++++-- contrib/pageinspect/sql/hash.sql | 10 ++++++-- 15 files changed, 200 insertions(+), 30 deletions(-) diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c index bf12901ac3..0387b2847a 100644 --- a/contrib/pageinspect/brinfuncs.c +++ b/contrib/pageinspect/brinfuncs.c @@ -58,6 +58,15 @@ brin_page_type(PG_FUNCTION_ARGS) page = get_page_from_raw(raw_page); + /* verify the special space has the expected size */ + if (PageGetSpecialSize(page) != MAXALIGN(sizeof(BrinSpecialSpace))) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("input page is not a valid %s page", "BRIN"), + errdetail("Expected special size %d, got %d.", + (int) MAXALIGN(sizeof(BrinSpecialSpace)), + (int) PageGetSpecialSize(page)))); + switch (BrinPageType(page)) { case BRIN_PAGETYPE_META: @@ -86,6 +95,15 @@ verify_brin_page(bytea *raw_page, uint16 type, const char *strtype) { Page page = get_page_from_raw(raw_page); + /* verify the special space has the expected size */ + if (PageGetSpecialSize(page) != MAXALIGN(sizeof(BrinSpecialSpace))) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("input page is not a valid %s page", "BRIN"), + errdetail("Expected special size %d, got %d.", + (int) MAXALIGN(sizeof(BrinSpecialSpace)), + (int) PageGetSpecialSize(page)))); + /* verify the special space says this page is what we want */ if (BrinPageType(page) != type) ereport(ERROR, diff --git a/contrib/pageinspect/btreefuncs.c b/contrib/pageinspect/btreefuncs.c index d9628dd664..7651c59bbf 100644 --- a/contrib/pageinspect/btreefuncs.c +++ b/contrib/pageinspect/btreefuncs.c @@ -613,6 +613,15 @@ bt_page_items_bytea(PG_FUNCTION_ARGS) uargs->offset = FirstOffsetNumber; + /* verify the special space has the expected size */ + if (PageGetSpecialSize(uargs->page) != MAXALIGN(sizeof(BTPageOpaqueData))) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("input page is not a valid %s page", "btree"), + errdetail("Expected special size %d, got %d.", + (int) MAXALIGN(sizeof(BTPageOpaqueData)), + (int) PageGetSpecialSize(uargs->page)))); + opaque = (BTPageOpaque) PageGetSpecialPointer(uargs->page); if (P_ISMETA(opaque)) @@ -620,6 +629,11 @@ bt_page_items_bytea(PG_FUNCTION_ARGS) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("block is a meta page"))); + if (P_ISLEAF(opaque) && opaque->btpo_level != 0) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("block is not a valid btree leaf page"))); + if (P_ISDELETED(opaque)) elog(NOTICE, "page is deleted"); diff --git a/contrib/pageinspect/expected/brin.out b/contrib/pageinspect/expected/brin.out index 10cd36c177..62ee783b60 100644 --- a/contrib/pageinspect/expected/brin.out +++ b/contrib/pageinspect/expected/brin.out @@ -52,4 +52,14 @@ SELECT * FROM brin_page_items(get_raw_page('test1_a_idx', 2), 'test1_a_idx') CREATE INDEX test1_a_btree ON test1 (a); SELECT brin_page_items(get_raw_page('test1_a_btree', 0), 'test1_a_btree'); ERROR: "test1_a_btree" is not a BRIN index +-- Mask DETAIL messages as these are not portable across architectures. +\set VERBOSITY terse +-- Invalid special area size +SELECT brin_page_type(get_raw_page('test1', 0)); +ERROR: input page is not a valid BRIN page +SELECT * FROM brin_metapage_info(get_raw_page('test1', 0)); +ERROR: input page is not a valid BRIN page +SELECT * FROM brin_revmap_data(get_raw_page('test1', 0)); +ERROR: input page is not a valid BRIN page +\set VERBOSITY default DROP TABLE test1; diff --git a/contrib/pageinspect/expected/btree.out b/contrib/pageinspect/expected/btree.out index 80b3dfe861..89d2160990 100644 --- a/contrib/pageinspect/expected/btree.out +++ b/contrib/pageinspect/expected/btree.out @@ -1,5 +1,5 @@ -CREATE TABLE test1 (a int8, b text); -INSERT INTO test1 VALUES (72057594037927937, 'text'); +CREATE TABLE test1 (a int8, b int4range); +INSERT INTO test1 VALUES (72057594037927937, '[0,1)'); CREATE INDEX test1_a_idx ON test1 USING btree (a); \x SELECT * FROM bt_metap('test1_a_idx'); @@ -78,11 +78,25 @@ SELECT bt_page_stats('test1_a_hash', 0); ERROR: "test1_a_hash" is not a btree index SELECT bt_page_items('test1_a_hash', 0); ERROR: "test1_a_hash" is not a btree index --- Failure with incorrect page size +SELECT bt_page_items(get_raw_page('test1_a_hash', 0)); +ERROR: block is a meta page +CREATE INDEX test1_b_gist ON test1 USING gist(b); +-- Special area of GiST is the same as btree, this complains about inconsistent +-- leaf data on the page. +SELECT bt_page_items(get_raw_page('test1_b_gist', 0)); +ERROR: block is not a valid btree leaf page +-- Several failure modes. -- Suppress the DETAIL message, to allow the tests to work across various --- page sizes. +-- page sizes and architectures. \set VERBOSITY terse +-- invalid page size SELECT bt_page_items('aaa'::bytea); ERROR: invalid page size +-- invalid special area size +CREATE INDEX test1_a_brin ON test1 USING brin(a); +SELECT bt_page_items(get_raw_page('test1', 0)); +ERROR: input page is not a valid btree page +SELECT bt_page_items(get_raw_page('test1_a_brin', 0)); +ERROR: input page is not a valid btree page \set VERBOSITY default DROP TABLE test1; diff --git a/contrib/pageinspect/expected/gin.out b/contrib/pageinspect/expected/gin.out index 802f48284b..e9fdb4cf20 100644 --- a/contrib/pageinspect/expected/gin.out +++ b/contrib/pageinspect/expected/gin.out @@ -35,15 +35,23 @@ FROM gin_leafpage_items(get_raw_page('test1_y_idx', -[ RECORD 1 ] ?column? | t -DROP TABLE test1; --- Failure with incorrect page size +-- Failure with various modes. -- Suppress the DETAIL message, to allow the tests to work across various --- page sizes. +-- page sizes and architectures. \set VERBOSITY terse +-- invalid page size SELECT gin_leafpage_items('aaa'::bytea); ERROR: invalid page size SELECT gin_metapage_info('bbb'::bytea); ERROR: invalid page size SELECT gin_page_opaque_info('ccc'::bytea); ERROR: invalid page size +-- invalid special area size +SELECT * FROM gin_metapage_info(get_raw_page('test1', 0)); +ERROR: input page is not a valid GIN metapage +SELECT * FROM gin_page_opaque_info(get_raw_page('test1', 0)); +ERROR: input page is not a valid GIN data leaf page +SELECT * FROM gin_leafpage_items(get_raw_page('test1', 0)); +ERROR: input page is not a valid GIN data leaf page \set VERBOSITY default +DROP TABLE test1; diff --git a/contrib/pageinspect/expected/gist.out b/contrib/pageinspect/expected/gist.out index 3f33e04066..c18a7091b2 100644 --- a/contrib/pageinspect/expected/gist.out +++ b/contrib/pageinspect/expected/gist.out @@ -68,15 +68,23 @@ SELECT itemoffset, ctid, itemlen FROM gist_page_items_bytea(get_raw_page('test_g CREATE INDEX test_gist_btree on test_gist(t); SELECT gist_page_items(get_raw_page('test_gist_btree', 0), 'test_gist_btree'); ERROR: "test_gist_btree" is not a GiST index --- Failure with incorrect page size +-- Failure with various modes. -- Suppress the DETAIL message, to allow the tests to work across various --- page sizes. +-- page sizes and architectures. \set VERBOSITY terse +-- invalid page size SELECT gist_page_items_bytea('aaa'::bytea); ERROR: invalid page size SELECT gist_page_items('aaa'::bytea, 'test_gist_idx'::regclass); ERROR: invalid page size SELECT gist_page_opaque_info('aaa'::bytea); ERROR: invalid page size +-- invalid special area size +SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist', 0)); +ERROR: input page is not a valid GiST page +SELECT gist_page_items_bytea(get_raw_page('test_gist', 0)); +ERROR: input page is not a valid GiST page +SELECT gist_page_items_bytea(get_raw_page('test_gist_btree', 0)); +ERROR: input page is not a valid GiST page \set VERBOSITY default DROP TABLE test_gist; diff --git a/contrib/pageinspect/expected/hash.out b/contrib/pageinspect/expected/hash.out index 6c606630dd..96c9511457 100644 --- a/contrib/pageinspect/expected/hash.out +++ b/contrib/pageinspect/expected/hash.out @@ -167,10 +167,11 @@ ERROR: page is not a hash bucket or overflow page CREATE INDEX test_hash_a_btree ON test_hash USING btree (a); SELECT hash_bitmap_info('test_hash_a_btree', 0); ERROR: "test_hash_a_btree" is not a hash index --- Failure with incorrect page size +-- Failure with various modes. -- Suppress the DETAIL message, to allow the tests to work across various --- page sizes. +-- page sizes and architectures. \set VERBOSITY terse +-- invalid page size SELECT hash_metapage_info('aaa'::bytea); ERROR: invalid page size SELECT hash_page_items('bbb'::bytea); @@ -179,5 +180,14 @@ SELECT hash_page_stats('ccc'::bytea); ERROR: invalid page size SELECT hash_page_type('ddd'::bytea); ERROR: invalid page size +-- invalid special area size +SELECT hash_metapage_info(get_raw_page('test_hash', 0)); +ERROR: input page is not a valid hash page +SELECT hash_page_items(get_raw_page('test_hash', 0)); +ERROR: input page is not a valid hash page +SELECT hash_page_stats(get_raw_page('test_hash', 0)); +ERROR: input page is not a valid hash page +SELECT hash_page_type(get_raw_page('test_hash', 0)); +ERROR: input page is not a valid hash page \set VERBOSITY default DROP TABLE test_hash; diff --git a/contrib/pageinspect/ginfuncs.c b/contrib/pageinspect/ginfuncs.c index f55128857e..7ad6d2d3bd 100644 --- a/contrib/pageinspect/ginfuncs.c +++ b/contrib/pageinspect/ginfuncs.c @@ -49,6 +49,14 @@ gin_metapage_info(PG_FUNCTION_ARGS) page = get_page_from_raw(raw_page); + if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GinPageOpaqueData))) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("input page is not a valid GIN metapage"), + errdetail("Expected special size %d, got %d.", + (int) MAXALIGN(sizeof(GinPageOpaqueData)), + (int) PageGetSpecialSize(page)))); + opaq = (GinPageOpaque) PageGetSpecialPointer(page); if (opaq->flags != GIN_META) ereport(ERROR, @@ -107,6 +115,14 @@ gin_page_opaque_info(PG_FUNCTION_ARGS) page = get_page_from_raw(raw_page); + if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GinPageOpaqueData))) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("input page is not a valid GIN data leaf page"), + errdetail("Expected special size %d, got %d.", + (int) MAXALIGN(sizeof(GinPageOpaqueData)), + (int) PageGetSpecialSize(page)))); + opaq = (GinPageOpaque) PageGetSpecialPointer(page); /* Build a tuple descriptor for our result type */ @@ -188,9 +204,9 @@ gin_leafpage_items(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("input page is not a valid GIN data leaf page"), - errdetail("Special size %d, expected %d", - (int) PageGetSpecialSize(page), - (int) MAXALIGN(sizeof(GinPageOpaqueData))))); + errdetail("Expected special size %d, got %d.", + (int) MAXALIGN(sizeof(GinPageOpaqueData)), + (int) PageGetSpecialSize(page)))); opaq = (GinPageOpaque) PageGetSpecialPointer(page); if (opaq->flags != (GIN_DATA | GIN_LEAF | GIN_COMPRESSED)) diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c index a31cff47fe..6bb81ffb84 100644 --- a/contrib/pageinspect/gistfuncs.c +++ b/contrib/pageinspect/gistfuncs.c @@ -55,7 +55,23 @@ gist_page_opaque_info(PG_FUNCTION_ARGS) page = get_page_from_raw(raw_page); + /* verify the special space has the expected size */ + if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GISTPageOpaqueData))) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("input page is not a valid %s page", "GiST"), + errdetail("Expected special size %d, got %d.", + (int) MAXALIGN(sizeof(GISTPageOpaqueData)), + (int) PageGetSpecialSize(page)))); + opaq = (GISTPageOpaque) PageGetSpecialPointer(page); + if (opaq->gist_page_id != GIST_PAGE_ID) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("input page is not a valid %s page", "GiST"), + errdetail("Expected %08x, got %08x.", + GIST_PAGE_ID, + opaq->gist_page_id))); /* Build a tuple descriptor for our result type */ if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) @@ -101,6 +117,7 @@ gist_page_items_bytea(PG_FUNCTION_ARGS) bytea *raw_page = PG_GETARG_BYTEA_P(0); ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; Page page; + GISTPageOpaque opaq; OffsetNumber offset; OffsetNumber maxoff = InvalidOffsetNumber; @@ -113,6 +130,24 @@ gist_page_items_bytea(PG_FUNCTION_ARGS) page = get_page_from_raw(raw_page); + /* verify the special space has the expected size */ + if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GISTPageOpaqueData))) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("input page is not a valid %s page", "GiST"), + errdetail("Expected special size %d, got %d.", + (int) MAXALIGN(sizeof(GISTPageOpaqueData)), + (int) PageGetSpecialSize(page)))); + + opaq = (GISTPageOpaque) PageGetSpecialPointer(page); + if (opaq->gist_page_id != GIST_PAGE_ID) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("input page is not a valid %s page", "GiST"), + errdetail("Expected %08x, got %08x.", + GIST_PAGE_ID, + opaq->gist_page_id))); + /* Avoid bogus PageGetMaxOffsetNumber() call with deleted pages */ if (GistPageIsDeleted(page)) elog(NOTICE, "page is deleted"); diff --git a/contrib/pageinspect/hashfuncs.c b/contrib/pageinspect/hashfuncs.c index ff73c363fc..6de21d6608 100644 --- a/contrib/pageinspect/hashfuncs.c +++ b/contrib/pageinspect/hashfuncs.c @@ -66,14 +66,17 @@ verify_hash_page(bytea *raw_page, int flags) if (PageGetSpecialSize(page) != MAXALIGN(sizeof(HashPageOpaqueData))) ereport(ERROR, - (errcode(ERRCODE_INDEX_CORRUPTED), - errmsg("index table contains corrupted page"))); + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("input page is not a valid %s page", "hash"), + errdetail("Expected special size %d, got %d.", + (int) MAXALIGN(sizeof(HashPageOpaqueData)), + (int) PageGetSpecialSize(page)))); pageopaque = (HashPageOpaque) PageGetSpecialPointer(page); if (pageopaque->hasho_page_id != HASHO_PAGE_ID) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("page is not a hash page"), + errmsg("input page is not a valid %s page", "hash"), errdetail("Expected %08x, got %08x.", HASHO_PAGE_ID, pageopaque->hasho_page_id))); @@ -134,7 +137,7 @@ verify_hash_page(bytea *raw_page, int flags) ereport(ERROR, (errcode(ERRCODE_INDEX_CORRUPTED), errmsg("invalid version for metadata"), - errdetail("Expected %d, got %d", + errdetail("Expected %d, got %d.", HASH_VERSION, metap->hashm_version))); } diff --git a/contrib/pageinspect/sql/brin.sql b/contrib/pageinspect/sql/brin.sql index 8717229c5d..dc5d1661b6 100644 --- a/contrib/pageinspect/sql/brin.sql +++ b/contrib/pageinspect/sql/brin.sql @@ -19,4 +19,12 @@ SELECT * FROM brin_page_items(get_raw_page('test1_a_idx', 2), 'test1_a_idx') CREATE INDEX test1_a_btree ON test1 (a); SELECT brin_page_items(get_raw_page('test1_a_btree', 0), 'test1_a_btree'); +-- Mask DETAIL messages as these are not portable across architectures. +\set VERBOSITY terse +-- Invalid special area size +SELECT brin_page_type(get_raw_page('test1', 0)); +SELECT * FROM brin_metapage_info(get_raw_page('test1', 0)); +SELECT * FROM brin_revmap_data(get_raw_page('test1', 0)); +\set VERBOSITY default + DROP TABLE test1; diff --git a/contrib/pageinspect/sql/btree.sql b/contrib/pageinspect/sql/btree.sql index fdda777b9e..44d83f90ba 100644 --- a/contrib/pageinspect/sql/btree.sql +++ b/contrib/pageinspect/sql/btree.sql @@ -1,5 +1,5 @@ -CREATE TABLE test1 (a int8, b text); -INSERT INTO test1 VALUES (72057594037927937, 'text'); +CREATE TABLE test1 (a int8, b int4range); +INSERT INTO test1 VALUES (72057594037927937, '[0,1)'); CREATE INDEX test1_a_idx ON test1 USING btree (a); \x @@ -26,12 +26,22 @@ CREATE INDEX test1_a_hash ON test1 USING hash(a); SELECT bt_metap('test1_a_hash'); SELECT bt_page_stats('test1_a_hash', 0); SELECT bt_page_items('test1_a_hash', 0); +SELECT bt_page_items(get_raw_page('test1_a_hash', 0)); +CREATE INDEX test1_b_gist ON test1 USING gist(b); +-- Special area of GiST is the same as btree, this complains about inconsistent +-- leaf data on the page. +SELECT bt_page_items(get_raw_page('test1_b_gist', 0)); --- Failure with incorrect page size +-- Several failure modes. -- Suppress the DETAIL message, to allow the tests to work across various --- page sizes. +-- page sizes and architectures. \set VERBOSITY terse +-- invalid page size SELECT bt_page_items('aaa'::bytea); +-- invalid special area size +CREATE INDEX test1_a_brin ON test1 USING brin(a); +SELECT bt_page_items(get_raw_page('test1', 0)); +SELECT bt_page_items(get_raw_page('test1_a_brin', 0)); \set VERBOSITY default DROP TABLE test1; diff --git a/contrib/pageinspect/sql/gin.sql b/contrib/pageinspect/sql/gin.sql index aadb07856d..6499b5c72b 100644 --- a/contrib/pageinspect/sql/gin.sql +++ b/contrib/pageinspect/sql/gin.sql @@ -18,13 +18,18 @@ FROM gin_leafpage_items(get_raw_page('test1_y_idx', (pg_relation_size('test1_y_idx') / current_setting('block_size')::bigint)::int - 1)); -DROP TABLE test1; - --- Failure with incorrect page size +-- Failure with various modes. -- Suppress the DETAIL message, to allow the tests to work across various --- page sizes. +-- page sizes and architectures. \set VERBOSITY terse +-- invalid page size SELECT gin_leafpage_items('aaa'::bytea); SELECT gin_metapage_info('bbb'::bytea); SELECT gin_page_opaque_info('ccc'::bytea); +-- invalid special area size +SELECT * FROM gin_metapage_info(get_raw_page('test1', 0)); +SELECT * FROM gin_page_opaque_info(get_raw_page('test1', 0)); +SELECT * FROM gin_leafpage_items(get_raw_page('test1', 0)); \set VERBOSITY default + +DROP TABLE test1; diff --git a/contrib/pageinspect/sql/gist.sql b/contrib/pageinspect/sql/gist.sql index 8abeb19140..e76f6fa8d1 100644 --- a/contrib/pageinspect/sql/gist.sql +++ b/contrib/pageinspect/sql/gist.sql @@ -30,13 +30,18 @@ SELECT itemoffset, ctid, itemlen FROM gist_page_items_bytea(get_raw_page('test_g CREATE INDEX test_gist_btree on test_gist(t); SELECT gist_page_items(get_raw_page('test_gist_btree', 0), 'test_gist_btree'); --- Failure with incorrect page size +-- Failure with various modes. -- Suppress the DETAIL message, to allow the tests to work across various --- page sizes. +-- page sizes and architectures. \set VERBOSITY terse +-- invalid page size SELECT gist_page_items_bytea('aaa'::bytea); SELECT gist_page_items('aaa'::bytea, 'test_gist_idx'::regclass); SELECT gist_page_opaque_info('aaa'::bytea); +-- invalid special area size +SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist', 0)); +SELECT gist_page_items_bytea(get_raw_page('test_gist', 0)); +SELECT gist_page_items_bytea(get_raw_page('test_gist_btree', 0)); \set VERBOSITY default DROP TABLE test_gist; diff --git a/contrib/pageinspect/sql/hash.sql b/contrib/pageinspect/sql/hash.sql index fcddd706ae..ccc984c086 100644 --- a/contrib/pageinspect/sql/hash.sql +++ b/contrib/pageinspect/sql/hash.sql @@ -82,14 +82,20 @@ SELECT * FROM hash_page_items(get_raw_page('test_hash_a_idx', 5)); CREATE INDEX test_hash_a_btree ON test_hash USING btree (a); SELECT hash_bitmap_info('test_hash_a_btree', 0); --- Failure with incorrect page size +-- Failure with various modes. -- Suppress the DETAIL message, to allow the tests to work across various --- page sizes. +-- page sizes and architectures. \set VERBOSITY terse +-- invalid page size SELECT hash_metapage_info('aaa'::bytea); SELECT hash_page_items('bbb'::bytea); SELECT hash_page_stats('ccc'::bytea); SELECT hash_page_type('ddd'::bytea); +-- invalid special area size +SELECT hash_metapage_info(get_raw_page('test_hash', 0)); +SELECT hash_page_items(get_raw_page('test_hash', 0)); +SELECT hash_page_stats(get_raw_page('test_hash', 0)); +SELECT hash_page_type(get_raw_page('test_hash', 0)); \set VERBOSITY default DROP TABLE test_hash; From 411b91360f2711e36782b68cd0c9bc6de44d3384 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sun, 27 Mar 2022 18:22:22 +0900 Subject: [PATCH 266/772] Fix comment in execParallel.c 0f61727 has made this comment incorrect. Author: Julien Rouhaud Reviewed-by: Matthias van de Meent Discussion: https://postgr.es/m/20220326160117.qtp5nkuku6cvhcby@jrouhaud --- src/backend/executor/execParallel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/executor/execParallel.c b/src/backend/executor/execParallel.c index 5dd8ab7db2..9a0d5d59ef 100644 --- a/src/backend/executor/execParallel.c +++ b/src/backend/executor/execParallel.c @@ -1420,7 +1420,7 @@ ParallelQueryMain(dsm_segment *seg, shm_toc *toc) /* Setting debug_query_string for individual workers */ debug_query_string = queryDesc->sourceText; - /* Report workers' query and queryId for monitoring purposes */ + /* Report workers' query for monitoring purposes */ pgstat_report_activity(STATE_RUNNING, debug_query_string); /* Attach to the dynamic shared memory area. */ From 0fb6954aa5012fc0c41af364fb328f90e648f6b7 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 27 Mar 2022 12:57:46 -0400 Subject: [PATCH 267/772] Fix breakage of get_ps_display() in the PS_USE_NONE case. Commit 8c6d30f21 caused this function to fail to set *displen in the PS_USE_NONE code path. If the variable's previous value had been negative, that'd lead to a memory clobber at some call sites. We'd managed not to notice due to very thin test coverage of such configurations, but this appears to explain buildfarm member lorikeet's recent struggles. Credit to Andrew Dunstan for spotting the problem. Back-patch to v13 where the bug was introduced. Discussion: https://postgr.es/m/136102.1648320427@sss.pgh.pa.us --- src/backend/utils/misc/ps_status.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backend/utils/misc/ps_status.c b/src/backend/utils/misc/ps_status.c index 20b717e5be..ec314c03f5 100644 --- a/src/backend/utils/misc/ps_status.c +++ b/src/backend/utils/misc/ps_status.c @@ -443,6 +443,7 @@ get_ps_display(int *displen) return ps_buffer + ps_buffer_fixed_size; #else + *displen = 0; return ""; #endif } From 641a9b716789628a4e7403ecef1b82cc4a9552b0 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 27 Mar 2022 14:38:05 -0400 Subject: [PATCH 268/772] Avoid using large pass-by-value struct arguments in pgbench. In the wake of commit 4a39f87ac, which noticeably increased the size of struct StatsData and thereby ParsedScript, Coverity started to complain that ParsedScript was unreasonably large to be passing by value. The two places that do this are only used during setup, so they're not really dragging down benchmark measurements --- but gratuitous inefficiency is not a good look in a benchmarking program. Convert to use pointers instead. --- src/bin/pgbench/pgbench.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 7080d2a795..acf3e56413 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -832,7 +832,7 @@ static void doLog(TState *thread, CState *st, StatsData *agg, bool skipped, double latency, double lag); static void processXactStats(TState *thread, CState *st, pg_time_usec_t *now, bool skipped, StatsData *agg); -static void addScript(ParsedScript script); +static void addScript(const ParsedScript *script); static THREAD_FUNC_RETURN_TYPE THREAD_FUNC_CC threadRun(void *arg); static void finishCon(CState *st); static void setalarm(int seconds); @@ -5743,15 +5743,15 @@ ConditionError(const char *desc, int cmdn, const char *msg) * Partial evaluation of conditionals before recording and running the script. */ static void -CheckConditional(ParsedScript ps) +CheckConditional(const ParsedScript *ps) { /* statically check conditional structure */ ConditionalStack cs = conditional_stack_create(); int i; - for (i = 0; ps.commands[i] != NULL; i++) + for (i = 0; ps->commands[i] != NULL; i++) { - Command *cmd = ps.commands[i]; + Command *cmd = ps->commands[i]; if (cmd->type == META_COMMAND) { @@ -5762,20 +5762,20 @@ CheckConditional(ParsedScript ps) break; case META_ELIF: if (conditional_stack_empty(cs)) - ConditionError(ps.desc, i + 1, "\\elif without matching \\if"); + ConditionError(ps->desc, i + 1, "\\elif without matching \\if"); if (conditional_stack_peek(cs) == IFSTATE_ELSE_FALSE) - ConditionError(ps.desc, i + 1, "\\elif after \\else"); + ConditionError(ps->desc, i + 1, "\\elif after \\else"); break; case META_ELSE: if (conditional_stack_empty(cs)) - ConditionError(ps.desc, i + 1, "\\else without matching \\if"); + ConditionError(ps->desc, i + 1, "\\else without matching \\if"); if (conditional_stack_peek(cs) == IFSTATE_ELSE_FALSE) - ConditionError(ps.desc, i + 1, "\\else after \\else"); + ConditionError(ps->desc, i + 1, "\\else after \\else"); conditional_stack_poke(cs, IFSTATE_ELSE_FALSE); break; case META_ENDIF: if (!conditional_stack_pop(cs)) - ConditionError(ps.desc, i + 1, "\\endif without matching \\if"); + ConditionError(ps->desc, i + 1, "\\endif without matching \\if"); break; default: /* ignore anything else... */ @@ -5784,7 +5784,7 @@ CheckConditional(ParsedScript ps) } } if (!conditional_stack_empty(cs)) - ConditionError(ps.desc, i + 1, "\\if without matching \\endif"); + ConditionError(ps->desc, i + 1, "\\if without matching \\endif"); conditional_stack_destroy(cs); } @@ -5916,7 +5916,7 @@ ParseScript(const char *script, const char *desc, int weight) ps.commands[index] = NULL; - addScript(ps); + addScript(&ps); termPQExpBuffer(&line_buf); psql_scan_finish(sstate); @@ -6093,11 +6093,11 @@ parseScriptWeight(const char *option, char **script) /* append a script to the list of scripts to process */ static void -addScript(ParsedScript script) +addScript(const ParsedScript *script) { - if (script.commands == NULL || script.commands[0] == NULL) + if (script->commands == NULL || script->commands[0] == NULL) { - pg_log_fatal("empty command list for script \"%s\"", script.desc); + pg_log_fatal("empty command list for script \"%s\"", script->desc); exit(1); } @@ -6109,7 +6109,7 @@ addScript(ParsedScript script) CheckConditional(script); - sql_script[num_scripts] = script; + sql_script[num_scripts] = *script; num_scripts++; } From c2d81ee902b96e6218e832eea184dbbfbc3af7d7 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 27 Mar 2022 15:05:22 -0400 Subject: [PATCH 269/772] Remove useless variable. flatten_join_alias_vars_mutator counted attnums, but didn't do anything with the count (no doubt it did at one time). Noted by buildfarm member seawasp. --- src/backend/optimizer/util/var.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/backend/optimizer/util/var.c b/src/backend/optimizer/util/var.c index 2b44ef3e17..6d11d187a0 100644 --- a/src/backend/optimizer/util/var.c +++ b/src/backend/optimizer/util/var.c @@ -774,16 +774,13 @@ flatten_join_alias_vars_mutator(Node *node, RowExpr *rowexpr; List *fields = NIL; List *colnames = NIL; - AttrNumber attnum; ListCell *lv; ListCell *ln; - attnum = 0; Assert(list_length(rte->joinaliasvars) == list_length(rte->eref->colnames)); forboth(lv, rte->joinaliasvars, ln, rte->eref->colnames) { newvar = (Node *) lfirst(lv); - attnum++; /* Ignore dropped columns */ if (newvar == NULL) continue; From b64c3bd62ea7064a1a36fbd921e8955fa76faa3e Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Sun, 27 Mar 2022 22:26:40 +0200 Subject: [PATCH 270/772] Remove more unused module imports from TAP tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a follow-up to commit 7dac61402 which removed a set of unused modules from the TAP test. The Config references in the pg_ctl and pg_rewind tests were removed in commit 1c6d46293. Fcntl ':mode' and File::stat in the pg_ctl test were added in c37b3d08c which was probably a leftover from an earlier version of the patch, as the function using these was added to another module in that commit. The Config reference in the ldap test was added in ee56c3b21 which in turn use $^O instead of interrogating Config. Author: Dagfinn Ilmari Mannsåker Discussion: https://postgr.es/m/87lewyqk45.fsf@wibble.ilmari.org --- src/bin/pg_ctl/t/001_start_stop.pl | 3 --- src/bin/pg_rewind/t/RewindTest.pm | 1 - src/test/ldap/t/001_auth.pl | 1 - 3 files changed, 5 deletions(-) diff --git a/src/bin/pg_ctl/t/001_start_stop.pl b/src/bin/pg_ctl/t/001_start_stop.pl index 3b45390ced..fdffd76d99 100644 --- a/src/bin/pg_ctl/t/001_start_stop.pl +++ b/src/bin/pg_ctl/t/001_start_stop.pl @@ -4,9 +4,6 @@ use strict; use warnings; -use Config; -use Fcntl ':mode'; -use File::stat qw{lstat}; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_rewind/t/RewindTest.pm b/src/bin/pg_rewind/t/RewindTest.pm index 5651602858..1e34768e27 100644 --- a/src/bin/pg_rewind/t/RewindTest.pm +++ b/src/bin/pg_rewind/t/RewindTest.pm @@ -35,7 +35,6 @@ use strict; use warnings; use Carp; -use Config; use Exporter 'import'; use File::Copy; use File::Path qw(rmtree); diff --git a/src/test/ldap/t/001_auth.pl b/src/test/ldap/t/001_auth.pl index 9f15248935..b342146e55 100644 --- a/src/test/ldap/t/001_auth.pl +++ b/src/test/ldap/t/001_auth.pl @@ -6,7 +6,6 @@ use PostgreSQL::Test::Utils; use PostgreSQL::Test::Cluster; use Test::More; -use Config; my ($slapd, $ldap_bin_dir, $ldap_schema_dir); From f79b803dcc98d707450e158db3638dc67ff8380b Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 3 Mar 2022 13:00:49 -0500 Subject: [PATCH 271/772] Common SQL/JSON clauses This introduces some of the building blocks used by the SQL/JSON constructor and query functions. Specifically, it provides node executor and grammar support for the FORMAT JSON [ENCODING foo] clause, and values decorated with it, and for the RETURNING clause. The following SQL/JSON patches will leverage these. Nikita Glukhov (who probably deserves an award for perseverance). Reviewers have included (in no particular order) Andres Freund, Alexander Korotkov, Pavel Stehule, Andrew Alsup, Erik Rijkers, Zihong Yu, Himanshu Upadhyaya, Daniel Gustafsson, Justin Pryzby. Discussion: https://postgr.es/m/cd0bb935-0158-78a7-08b5-904886deac4b@postgrespro.ru --- src/backend/executor/execExpr.c | 22 ++++ src/backend/nodes/copyfuncs.c | 55 ++++++++ src/backend/nodes/equalfuncs.c | 39 ++++++ src/backend/nodes/makefuncs.c | 54 ++++++++ src/backend/nodes/nodeFuncs.c | 66 ++++++++++ src/backend/nodes/outfuncs.c | 39 ++++++ src/backend/nodes/readfuncs.c | 51 ++++++++ src/backend/optimizer/util/clauses.c | 23 ++++ src/backend/parser/gram.y | 65 +++++++++- src/backend/parser/parse_expr.c | 181 +++++++++++++++++++++++++++ src/backend/utils/adt/ruleutils.c | 56 +++++++++ src/backend/utils/misc/queryjumble.c | 26 ++++ src/include/nodes/makefuncs.h | 5 + src/include/nodes/nodes.h | 4 + src/include/nodes/parsenodes.h | 13 ++ src/include/nodes/primnodes.h | 59 +++++++++ src/include/parser/kwlist.h | 2 + 17 files changed, 758 insertions(+), 2 deletions(-) diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index e0656bfe85..d0b91e881d 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -2428,6 +2428,28 @@ ExecInitExprRec(Expr *node, ExprState *state, break; } + case T_JsonValueExpr: + { + JsonValueExpr *jve = (JsonValueExpr *) node; + + ExecInitExprRec(jve->raw_expr, state, resv, resnull); + + if (jve->formatted_expr) + { + Datum *innermost_caseval = state->innermost_caseval; + bool *innermost_isnull = state->innermost_casenull; + + state->innermost_caseval = resv; + state->innermost_casenull = resnull; + + ExecInitExprRec(jve->formatted_expr, state, resv, resnull); + + state->innermost_caseval = innermost_caseval; + state->innermost_casenull = innermost_isnull; + } + break; + } + default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index e38ff4000f..9d6a404760 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -2298,6 +2298,52 @@ _copyOnConflictExpr(const OnConflictExpr *from) return newnode; } + +/* + * _copyJsonFormat + */ +static JsonFormat * +_copyJsonFormat(const JsonFormat *from) +{ + JsonFormat *newnode = makeNode(JsonFormat); + + COPY_SCALAR_FIELD(format_type); + COPY_SCALAR_FIELD(encoding); + COPY_LOCATION_FIELD(location); + + return newnode; +} + +/* + * _copyJsonReturning + */ +static JsonReturning * +_copyJsonReturning(const JsonReturning *from) +{ + JsonReturning *newnode = makeNode(JsonReturning); + + COPY_NODE_FIELD(format); + COPY_SCALAR_FIELD(typid); + COPY_SCALAR_FIELD(typmod); + + return newnode; +} + +/* + * _copyJsonValueExpr + */ +static JsonValueExpr * +_copyJsonValueExpr(const JsonValueExpr *from) +{ + JsonValueExpr *newnode = makeNode(JsonValueExpr); + + COPY_NODE_FIELD(raw_expr); + COPY_NODE_FIELD(formatted_expr); + COPY_NODE_FIELD(format); + + return newnode; +} + /* **************************************************************** * pathnodes.h copy functions * @@ -5351,6 +5397,15 @@ copyObjectImpl(const void *from) case T_OnConflictExpr: retval = _copyOnConflictExpr(from); break; + case T_JsonFormat: + retval = _copyJsonFormat(from); + break; + case T_JsonReturning: + retval = _copyJsonReturning(from); + break; + case T_JsonValueExpr: + retval = _copyJsonValueExpr(from); + break; /* * RELATION NODES diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 0f330e3c70..e73b351acd 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -841,6 +841,36 @@ _equalOnConflictExpr(const OnConflictExpr *a, const OnConflictExpr *b) return true; } +static bool +_equalJsonFormat(const JsonFormat *a, const JsonFormat *b) +{ + COMPARE_SCALAR_FIELD(format_type); + COMPARE_SCALAR_FIELD(encoding); + COMPARE_LOCATION_FIELD(location); + + return true; +} + +static bool +_equalJsonReturning(const JsonReturning *a, const JsonReturning *b) +{ + COMPARE_NODE_FIELD(format); + COMPARE_SCALAR_FIELD(typid); + COMPARE_SCALAR_FIELD(typmod); + + return true; +} + +static bool +_equalJsonValueExpr(const JsonValueExpr *a, const JsonValueExpr *b) +{ + COMPARE_NODE_FIELD(raw_expr); + COMPARE_NODE_FIELD(formatted_expr); + COMPARE_NODE_FIELD(format); + + return true; +} + /* * Stuff from pathnodes.h */ @@ -3359,6 +3389,15 @@ equal(const void *a, const void *b) case T_JoinExpr: retval = _equalJoinExpr(a, b); break; + case T_JsonFormat: + retval = _equalJsonFormat(a, b); + break; + case T_JsonReturning: + retval = _equalJsonReturning(a, b); + break; + case T_JsonValueExpr: + retval = _equalJsonValueExpr(a, b); + break; /* * RELATION NODES diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c index c85d8fe975..867a927e7a 100644 --- a/src/backend/nodes/makefuncs.c +++ b/src/backend/nodes/makefuncs.c @@ -19,6 +19,7 @@ #include "catalog/pg_type.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" +#include "utils/errcodes.h" #include "utils/lsyscache.h" @@ -818,3 +819,56 @@ makeVacuumRelation(RangeVar *relation, Oid oid, List *va_cols) v->va_cols = va_cols; return v; } + +/* + * makeJsonFormat - + * creates a JsonFormat node + */ +JsonFormat * +makeJsonFormat(JsonFormatType type, JsonEncoding encoding, int location) +{ + JsonFormat *jf = makeNode(JsonFormat); + + jf->format_type = type; + jf->encoding = encoding; + jf->location = location; + + return jf; +} + +/* + * makeJsonValueExpr - + * creates a JsonValueExpr node + */ +JsonValueExpr * +makeJsonValueExpr(Expr *expr, JsonFormat *format) +{ + JsonValueExpr *jve = makeNode(JsonValueExpr); + + jve->raw_expr = expr; + jve->formatted_expr = NULL; + jve->format = format; + + return jve; +} + +/* + * makeJsonEncoding - + * converts JSON encoding name to enum JsonEncoding + */ +JsonEncoding +makeJsonEncoding(char *name) +{ + if (!pg_strcasecmp(name, "utf8")) + return JS_ENC_UTF8; + if (!pg_strcasecmp(name, "utf16")) + return JS_ENC_UTF16; + if (!pg_strcasecmp(name, "utf32")) + return JS_ENC_UTF32; + + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized JSON encoding: %s", name))); + + return JS_ENC_DEFAULT; +} diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index ec25aae6e3..0b242c76ec 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -250,6 +250,13 @@ exprType(const Node *expr) case T_PlaceHolderVar: type = exprType((Node *) ((const PlaceHolderVar *) expr)->phexpr); break; + case T_JsonValueExpr: + { + const JsonValueExpr *jve = (const JsonValueExpr *) expr; + + type = exprType((Node *) (jve->formatted_expr ? jve->formatted_expr : jve->raw_expr)); + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); type = InvalidOid; /* keep compiler quiet */ @@ -482,6 +489,8 @@ exprTypmod(const Node *expr) return ((const SetToDefault *) expr)->typeMod; case T_PlaceHolderVar: return exprTypmod((Node *) ((const PlaceHolderVar *) expr)->phexpr); + case T_JsonValueExpr: + return exprTypmod((Node *) ((const JsonValueExpr *) expr)->formatted_expr); default: break; } @@ -958,6 +967,9 @@ exprCollation(const Node *expr) case T_PlaceHolderVar: coll = exprCollation((Node *) ((const PlaceHolderVar *) expr)->phexpr); break; + case T_JsonValueExpr: + coll = exprCollation((Node *) ((const JsonValueExpr *) expr)->formatted_expr); + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); coll = InvalidOid; /* keep compiler quiet */ @@ -1170,6 +1182,10 @@ exprSetCollation(Node *expr, Oid collation) /* NextValueExpr's result is an integer type ... */ Assert(!OidIsValid(collation)); /* ... so never set a collation */ break; + case T_JsonValueExpr: + exprSetCollation((Node *) ((JsonValueExpr *) expr)->formatted_expr, + collation); + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); break; @@ -1616,6 +1632,9 @@ exprLocation(const Node *expr) case T_PartitionRangeDatum: loc = ((const PartitionRangeDatum *) expr)->location; break; + case T_JsonValueExpr: + loc = exprLocation((Node *) ((const JsonValueExpr *) expr)->raw_expr); + break; default: /* for any other node type it's just unknown... */ loc = -1; @@ -2350,6 +2369,16 @@ expression_tree_walker(Node *node, return true; } break; + case T_JsonValueExpr: + { + JsonValueExpr *jve = (JsonValueExpr *) node; + + if (walker(jve->raw_expr, context)) + return true; + if (walker(jve->formatted_expr, context)) + return true; + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); @@ -2680,6 +2709,7 @@ expression_tree_mutator(Node *node, case T_RangeTblRef: case T_SortGroupClause: case T_CTESearchClause: + case T_JsonFormat: return (Node *) copyObject(node); case T_WithCheckOption: { @@ -3311,6 +3341,28 @@ expression_tree_mutator(Node *node, return (Node *) newnode; } break; + case T_JsonReturning: + { + JsonReturning *jr = (JsonReturning *) node; + JsonReturning *newnode; + + FLATCOPY(newnode, jr, JsonReturning); + MUTATE(newnode->format, jr->format, JsonFormat *); + + return (Node *) newnode; + } + case T_JsonValueExpr: + { + JsonValueExpr *jve = (JsonValueExpr *) node; + JsonValueExpr *newnode; + + FLATCOPY(newnode, jve, JsonValueExpr); + MUTATE(newnode->raw_expr, jve->raw_expr, Expr *); + MUTATE(newnode->formatted_expr, jve->formatted_expr, Expr *); + MUTATE(newnode->format, jve->format, JsonFormat *); + + return (Node *) newnode; + } default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); @@ -4019,6 +4071,20 @@ raw_expression_tree_walker(Node *node, case T_CommonTableExpr: /* search_clause and cycle_clause are not interesting here */ return walker(((CommonTableExpr *) node)->ctequery, context); + case T_JsonReturning: + return walker(((JsonReturning *) node)->format, context); + case T_JsonValueExpr: + { + JsonValueExpr *jve = (JsonValueExpr *) node; + + if (walker(jve->raw_expr, context)) + return true; + if (walker(jve->formatted_expr, context)) + return true; + if (walker(jve->format, context)) + return true; + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 6bdad462c7..449d90c8f4 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1751,6 +1751,36 @@ _outOnConflictExpr(StringInfo str, const OnConflictExpr *node) WRITE_NODE_FIELD(exclRelTlist); } +static void +_outJsonFormat(StringInfo str, const JsonFormat *node) +{ + WRITE_NODE_TYPE("JSONFORMAT"); + + WRITE_ENUM_FIELD(format_type, JsonFormatType); + WRITE_ENUM_FIELD(encoding, JsonEncoding); + WRITE_LOCATION_FIELD(location); +} + +static void +_outJsonReturning(StringInfo str, const JsonReturning *node) +{ + WRITE_NODE_TYPE("JSONRETURNING"); + + WRITE_NODE_FIELD(format); + WRITE_OID_FIELD(typid); + WRITE_INT_FIELD(typmod); +} + +static void +_outJsonValueExpr(StringInfo str, const JsonValueExpr *node) +{ + WRITE_NODE_TYPE("JSONVALUEEXPR"); + + WRITE_NODE_FIELD(raw_expr); + WRITE_NODE_FIELD(formatted_expr); + WRITE_NODE_FIELD(format); +} + /***************************************************************************** * * Stuff from pathnodes.h. @@ -4537,6 +4567,15 @@ outNode(StringInfo str, const void *obj) case T_PartitionRangeDatum: _outPartitionRangeDatum(str, obj); break; + case T_JsonFormat: + _outJsonFormat(str, obj); + break; + case T_JsonReturning: + _outJsonReturning(str, obj); + break; + case T_JsonValueExpr: + _outJsonValueExpr(str, obj); + break; default: diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 3f68f7c18d..6f398cdc15 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -1389,6 +1389,51 @@ _readOnConflictExpr(void) READ_DONE(); } +/* + * _readJsonFormat + */ +static JsonFormat * +_readJsonFormat(void) +{ + READ_LOCALS(JsonFormat); + + READ_ENUM_FIELD(format_type, JsonFormatType); + READ_ENUM_FIELD(encoding, JsonEncoding); + READ_LOCATION_FIELD(location); + + READ_DONE(); +} + +/* + * _readJsonReturning + */ +static JsonReturning * +_readJsonReturning(void) +{ + READ_LOCALS(JsonReturning); + + READ_NODE_FIELD(format); + READ_OID_FIELD(typid); + READ_INT_FIELD(typmod); + + READ_DONE(); +} + +/* + * _readJsonValueExpr + */ +static JsonValueExpr * +_readJsonValueExpr(void) +{ + READ_LOCALS(JsonValueExpr); + + READ_NODE_FIELD(raw_expr); + READ_NODE_FIELD(formatted_expr); + READ_NODE_FIELD(format); + + READ_DONE(); +} + /* * Stuff from pathnodes.h. * @@ -2974,6 +3019,12 @@ parseNodeString(void) return_value = _readPartitionBoundSpec(); else if (MATCH("PARTITIONRANGEDATUM", 19)) return_value = _readPartitionRangeDatum(); + else if (MATCH("JSONFORMAT", 10)) + return_value = _readJsonFormat(); + else if (MATCH("JSONRETURNING", 13)) + return_value = _readJsonReturning(); + else if (MATCH("JSONVALUEEXPR", 13)) + return_value = _readJsonValueExpr(); else { elog(ERROR, "badly formatted node string \"%.32s\"...", token); diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index 413dcac036..b9cefe8847 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -3512,6 +3512,29 @@ eval_const_expressions_mutator(Node *node, return ece_evaluate_expr((Node *) newcre); return (Node *) newcre; } + case T_JsonValueExpr: + { + JsonValueExpr *jve = (JsonValueExpr *) node; + Node *raw = eval_const_expressions_mutator((Node *) jve->raw_expr, + context); + + if (raw && IsA(raw, Const)) + { + Node *formatted; + Node *save_case_val = context->case_val; + + context->case_val = raw; + + formatted = eval_const_expressions_mutator((Node *) jve->formatted_expr, + context); + + context->case_val = save_case_val; + + if (formatted && IsA(formatted, Const)) + return formatted; + } + break; + } default: break; } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 945a9ada8b..a324983f5d 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -636,6 +636,14 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type hash_partbound_elem +%type json_format_clause_opt + json_representation + json_value_expr + json_output_clause_opt + +%type json_encoding + json_encoding_clause_opt + /* * Non-keyword token types. These are hard-wired into the "flex" lexer. * They must be listed first so that their numeric codes do not depend on @@ -687,7 +695,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); EXTENSION EXTERNAL EXTRACT FALSE_P FAMILY FETCH FILTER FINALIZE FIRST_P FLOAT_P FOLLOWING FOR - FORCE FOREIGN FORWARD FREEZE FROM FULL FUNCTION FUNCTIONS + FORCE FOREIGN FORMAT FORWARD FREEZE FROM FULL FUNCTION FUNCTIONS GENERATED GLOBAL GRANT GRANTED GREATEST GROUP_P GROUPING GROUPS @@ -698,7 +706,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION - JOIN + JOIN JSON KEY @@ -782,6 +790,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); /* Precedence: lowest to highest */ %nonassoc SET /* see relation_expr_opt_alias */ +%right FORMAT %left UNION EXCEPT %left INTERSECT %left OR @@ -15269,6 +15278,54 @@ opt_asymmetric: ASYMMETRIC | /*EMPTY*/ ; +/* SQL/JSON support */ + +json_value_expr: + a_expr json_format_clause_opt + { + $$ = (Node *) makeJsonValueExpr((Expr *) $1, $2); + } + ; + +json_format_clause_opt: + FORMAT json_representation + { + $$ = $2; + $$.location = @1; + } + | /* EMPTY */ + { + $$ = (Node *) makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1); + } + ; + +json_representation: + JSON json_encoding_clause_opt + { + $$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, $2, @1); + } + /* | other implementation defined JSON representation options (BSON, AVRO etc) */ + ; + +json_encoding_clause_opt: + ENCODING json_encoding { $$ = $2; } + | /* EMPTY */ { $$ = JS_ENC_DEFAULT; } + ; + +json_encoding: + name { $$ = makeJsonEncoding($1); } + ; + +json_output_clause_opt: + RETURNING Typename json_format_clause_opt + { + JsonOutput *n = makeNode(JsonOutput); + n->typeName = $2; + n->returning.format = $3; + $$ = (Node *) n; + } + | /* EMPTY */ { $$ = NULL; } + ; /***************************************************************************** * @@ -15810,6 +15867,7 @@ unreserved_keyword: | FIRST_P | FOLLOWING | FORCE + | FORMAT | FORWARD | FUNCTION | FUNCTIONS @@ -15841,6 +15899,7 @@ unreserved_keyword: | INSTEAD | INVOKER | ISOLATION + | JSON | KEY | LABEL | LANGUAGE @@ -16357,6 +16416,7 @@ bare_label_keyword: | FOLLOWING | FORCE | FOREIGN + | FORMAT | FORWARD | FREEZE | FULL @@ -16401,6 +16461,7 @@ bare_label_keyword: | IS | ISOLATION | JOIN + | JSON | KEY | LABEL | LANGUAGE diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 1c09ea24cd..985ddbedf1 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -34,6 +34,7 @@ #include "parser/parse_type.h" #include "utils/builtins.h" #include "utils/date.h" +#include "utils/fmgroids.h" #include "utils/lsyscache.h" #include "utils/timestamp.h" #include "utils/xml.h" @@ -3099,3 +3100,183 @@ ParseExprKindName(ParseExprKind exprKind) } return "unrecognized expression kind"; } + +/* + * Make string Const node from JSON encoding name. + * + * UTF8 is default encoding. + */ +static Const * +getJsonEncodingConst(JsonFormat *format) +{ + JsonEncoding encoding; + const char *enc; + Name encname = palloc(sizeof(NameData)); + + if (!format || + format->format_type == JS_FORMAT_DEFAULT || + format->encoding == JS_ENC_DEFAULT) + encoding = JS_ENC_UTF8; + else + encoding = format->encoding; + + switch (encoding) + { + case JS_ENC_UTF16: + enc = "UTF16"; + break; + case JS_ENC_UTF32: + enc = "UTF32"; + break; + case JS_ENC_UTF8: + enc = "UTF8"; + break; + default: + elog(ERROR, "invalid JSON encoding: %d", encoding); + break; + } + + namestrcpy(encname, enc); + + return makeConst(NAMEOID, -1, InvalidOid, NAMEDATALEN, + NameGetDatum(encname), false, false); +} + +/* + * Make bytea => text conversion using specified JSON format encoding. + */ +static Node * +makeJsonByteaToTextConversion(Node *expr, JsonFormat *format, int location) +{ + Const *encoding = getJsonEncodingConst(format); + FuncExpr *fexpr = makeFuncExpr(F_CONVERT_FROM, TEXTOID, + list_make2(expr, encoding), + InvalidOid, InvalidOid, + COERCE_EXPLICIT_CALL); + + fexpr->location = location; + + return (Node *) fexpr; +} + +/* + * Make CaseTestExpr node. + */ +static Node * +makeCaseTestExpr(Node *expr) +{ + CaseTestExpr *placeholder = makeNode(CaseTestExpr); + + placeholder->typeId = exprType(expr); + placeholder->typeMod = exprTypmod(expr); + placeholder->collation = exprCollation(expr); + + return (Node *) placeholder; +} + +/* + * Transform JSON value expression using specified input JSON format or + * default format otherwise. + */ +static Node * +transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, + JsonFormatType default_format) +{ + Node *expr = transformExprRecurse(pstate, (Node *) ve->raw_expr); + Node *rawexpr; + JsonFormatType format; + Oid exprtype; + int location; + char typcategory; + bool typispreferred; + + if (exprType(expr) == UNKNOWNOID) + expr = coerce_to_specific_type(pstate, expr, TEXTOID, "JSON_VALUE_EXPR"); + + rawexpr = expr; + exprtype = exprType(expr); + location = exprLocation(expr); + + get_type_category_preferred(exprtype, &typcategory, &typispreferred); + + if (ve->format->format_type != JS_FORMAT_DEFAULT) + { + if (ve->format->encoding != JS_ENC_DEFAULT && exprtype != BYTEAOID) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("JSON ENCODING clause is only allowed for bytea input type"), + parser_errposition(pstate, ve->format->location))); + + if (exprtype == JSONOID || exprtype == JSONBOID) + { + format = JS_FORMAT_DEFAULT; /* do not format json[b] types */ + ereport(WARNING, + (errmsg("FORMAT JSON has no effect for json and jsonb types"), + parser_errposition(pstate, ve->format->location))); + } + else + format = ve->format->format_type; + } + else if (exprtype == JSONOID || exprtype == JSONBOID) + format = JS_FORMAT_DEFAULT; /* do not format json[b] types */ + else + format = default_format; + + if (format != JS_FORMAT_DEFAULT) + { + Oid targettype = format == JS_FORMAT_JSONB ? JSONBOID : JSONOID; + Node *orig = makeCaseTestExpr(expr); + Node *coerced; + + expr = orig; + + if (exprtype != BYTEAOID && typcategory != TYPCATEGORY_STRING) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg(ve->format->format_type == JS_FORMAT_DEFAULT ? + "cannot use non-string types with implicit FORMAT JSON clause" : + "cannot use non-string types with explicit FORMAT JSON clause"), + parser_errposition(pstate, ve->format->location >= 0 ? + ve->format->location : location))); + + /* Convert encoded JSON text from bytea. */ + if (format == JS_FORMAT_JSON && exprtype == BYTEAOID) + { + expr = makeJsonByteaToTextConversion(expr, ve->format, location); + exprtype = TEXTOID; + } + + /* Try to coerce to the target type. */ + coerced = coerce_to_target_type(pstate, expr, exprtype, + targettype, -1, + COERCION_EXPLICIT, + COERCE_EXPLICIT_CAST, + location); + + if (!coerced) + { + /* If coercion failed, use to_json()/to_jsonb() functions. */ + Oid fnoid = targettype == JSONOID ? F_TO_JSON : F_TO_JSONB; + FuncExpr *fexpr = makeFuncExpr(fnoid, targettype, + list_make1(expr), + InvalidOid, InvalidOid, + COERCE_EXPLICIT_CALL); + fexpr->location = location; + + coerced = (Node *) fexpr; + } + + if (coerced == orig) + expr = rawexpr; + else + { + ve = copyObject(ve); + ve->raw_expr = (Expr *) rawexpr; + ve->formatted_expr = (Expr *) coerced; + + expr = (Node *) ve; + } + } + + return expr; +} diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 7f4f3f7369..c7860a7580 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -8266,6 +8266,11 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags) return false; } + case T_JsonValueExpr: + /* maybe simple, check args */ + return isSimpleNode((Node *) ((JsonValueExpr *) node)->raw_expr, + node, prettyFlags); + default: break; } @@ -8371,6 +8376,48 @@ get_rule_expr_paren(Node *node, deparse_context *context, appendStringInfoChar(context->buf, ')'); } +/* + * get_json_format - Parse back a JsonFormat node + */ +static void +get_json_format(JsonFormat *format, deparse_context *context) +{ + if (format->format_type == JS_FORMAT_DEFAULT) + return; + + appendStringInfoString(context->buf, + format->format_type == JS_FORMAT_JSONB ? + " FORMAT JSONB" : " FORMAT JSON"); + + if (format->encoding != JS_ENC_DEFAULT) + { + const char *encoding = + format->encoding == JS_ENC_UTF16 ? "UTF16" : + format->encoding == JS_ENC_UTF32 ? "UTF32" : "UTF8"; + + appendStringInfo(context->buf, " ENCODING %s", encoding); + } +} + +/* + * get_json_returning - Parse back a JsonReturning structure + */ +static void +get_json_returning(JsonReturning *returning, deparse_context *context, + bool json_format_by_default) +{ + if (!OidIsValid(returning->typid)) + return; + + appendStringInfo(context->buf, " RETURNING %s", + format_type_with_typemod(returning->typid, + returning->typmod)); + + if (!json_format_by_default || + returning->format->format_type != + (returning->typid == JSONBOID ? JS_FORMAT_JSONB : JS_FORMAT_JSON)) + get_json_format(returning->format, context); +} /* ---------- * get_rule_expr - Parse back an expression @@ -9531,6 +9578,15 @@ get_rule_expr(Node *node, deparse_context *context, } break; + case T_JsonValueExpr: + { + JsonValueExpr *jve = (JsonValueExpr *) node; + + get_rule_expr((Node *) jve->raw_expr, context, false); + get_json_format(jve->format, context); + } + break; + case T_List: { char *sep; diff --git a/src/backend/utils/misc/queryjumble.c b/src/backend/utils/misc/queryjumble.c index a67487e5fe..84435420e4 100644 --- a/src/backend/utils/misc/queryjumble.c +++ b/src/backend/utils/misc/queryjumble.c @@ -737,6 +737,32 @@ JumbleExpr(JumbleState *jstate, Node *node) JumbleExpr(jstate, (Node *) conf->exclRelTlist); } break; + case T_JsonFormat: + { + JsonFormat *format = (JsonFormat *) node; + + APP_JUMB(format->type); + APP_JUMB(format->encoding); + } + break; + case T_JsonReturning: + { + JsonReturning *returning = (JsonReturning *) node; + + JumbleExpr(jstate, (Node *) returning->format); + APP_JUMB(returning->typid); + APP_JUMB(returning->typmod); + } + break; + case T_JsonValueExpr: + { + JsonValueExpr *expr = (JsonValueExpr *) node; + + JumbleExpr(jstate, (Node *) expr->raw_expr); + JumbleExpr(jstate, (Node *) expr->formatted_expr); + JumbleExpr(jstate, (Node *) expr->format); + } + break; case T_List: foreach(temp, (List *) node) { diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h index 50de4c62af..ec8b71a685 100644 --- a/src/include/nodes/makefuncs.h +++ b/src/include/nodes/makefuncs.h @@ -106,4 +106,9 @@ extern GroupingSet *makeGroupingSet(GroupingSetKind kind, List *content, int loc extern VacuumRelation *makeVacuumRelation(RangeVar *relation, Oid oid, List *va_cols); +extern JsonFormat *makeJsonFormat(JsonFormatType type, JsonEncoding encoding, + int location); +extern JsonValueExpr *makeJsonValueExpr(Expr *expr, JsonFormat *format); +extern JsonEncoding makeJsonEncoding(char *name); + #endif /* MAKEFUNC_H */ diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index 5d075f0c34..59737f1034 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -201,6 +201,9 @@ typedef enum NodeTag T_FromExpr, T_OnConflictExpr, T_IntoClause, + T_JsonFormat, + T_JsonReturning, + T_JsonValueExpr, /* * TAGS FOR EXPRESSION STATE NODES (execnodes.h) @@ -491,6 +494,7 @@ typedef enum NodeTag T_VacuumRelation, T_PublicationObjSpec, T_PublicationTable, + T_JsonOutput, /* * TAGS FOR REPLICATION GRAMMAR PARSE NODES (replnodes.h) diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 5a458c42e5..e06d43d4df 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1553,6 +1553,19 @@ typedef struct TriggerTransition bool isTable; } TriggerTransition; +/* Nodes for SQL/JSON support */ + +/* + * JsonOutput - + * representation of JSON output clause (RETURNING type [FORMAT format]) + */ +typedef struct JsonOutput +{ + NodeTag type; + TypeName *typeName; /* RETURNING type name, if specified */ + JsonReturning returning; /* RETURNING FORMAT clause and type Oids */ +} JsonOutput; + /***************************************************************************** * Raw Grammar Output Statements *****************************************************************************/ diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index 439e4b4a9d..8e3c99bdb5 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -1233,6 +1233,65 @@ typedef struct XmlExpr int location; /* token location, or -1 if unknown */ } XmlExpr; +/* + * JsonEncoding - + * representation of JSON ENCODING clause + */ +typedef enum JsonEncoding +{ + JS_ENC_DEFAULT, /* unspecified */ + JS_ENC_UTF8, + JS_ENC_UTF16, + JS_ENC_UTF32, +} JsonEncoding; + +/* + * JsonFormatType - + * enumeration of JSON formats used in JSON FORMAT clause + */ +typedef enum JsonFormatType +{ + JS_FORMAT_DEFAULT, /* unspecified */ + JS_FORMAT_JSON, /* FORMAT JSON [ENCODING ...] */ + JS_FORMAT_JSONB /* implicit internal format for RETURNING jsonb */ +} JsonFormatType; + +/* + * JsonFormat - + * representation of JSON FORMAT clause + */ +typedef struct JsonFormat +{ + NodeTag type; + JsonFormatType format_type; /* format type */ + JsonEncoding encoding; /* JSON encoding */ + int location; /* token location, or -1 if unknown */ +} JsonFormat; + +/* + * JsonReturning - + * transformed representation of JSON RETURNING clause + */ +typedef struct JsonReturning +{ + NodeTag type; + JsonFormat *format; /* output JSON format */ + Oid typid; /* target type Oid */ + int32 typmod; /* target type modifier */ +} JsonReturning; + +/* + * JsonValueExpr - + * representation of JSON value expression (expr [FORMAT json_format]) + */ +typedef struct JsonValueExpr +{ + NodeTag type; + Expr *raw_expr; /* raw expression */ + Expr *formatted_expr; /* formatted expression or NULL */ + JsonFormat *format; /* FORMAT clause, if specified */ +} JsonValueExpr; + /* ---------------- * NullTest * diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index bcef7eed2f..f3502b8be4 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -175,6 +175,7 @@ PG_KEYWORD("following", FOLLOWING, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("for", FOR, RESERVED_KEYWORD, AS_LABEL) PG_KEYWORD("force", FORCE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("foreign", FOREIGN, RESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("format", FORMAT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("forward", FORWARD, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("freeze", FREEZE, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("from", FROM, RESERVED_KEYWORD, AS_LABEL) @@ -227,6 +228,7 @@ PG_KEYWORD("is", IS, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("isnull", ISNULL, TYPE_FUNC_NAME_KEYWORD, AS_LABEL) PG_KEYWORD("isolation", ISOLATION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("join", JOIN, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json", JSON, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("key", KEY, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("label", LABEL, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("language", LANGUAGE, UNRESERVED_KEYWORD, BARE_LABEL) From f4fb45d15c59d7add2e1b81a9d477d0119a9691a Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 3 Mar 2022 13:02:10 -0500 Subject: [PATCH 272/772] SQL/JSON constructors This patch introduces the SQL/JSON standard constructors for JSON: JSON() JSON_ARRAY() JSON_ARRAYAGG() JSON_OBJECT() JSON_OBJECTAGG() For the most part these functions provide facilities that mimic existing json/jsonb functions. However, they also offer some useful additional functionality. In addition to text input, the JSON() function accepts bytea input, which it will decode and constuct a json value from. The other functions provide useful options for handling duplicate keys and null values. This series of patches will be followed by a consolidated documentation patch. Nikita Glukhov Reviewers have included (in no particular order) Andres Freund, Alexander Korotkov, Pavel Stehule, Andrew Alsup, Erik Rijkers, Zihong Yu, Himanshu Upadhyaya, Daniel Gustafsson, Justin Pryzby. Discussion: https://postgr.es/m/cd0bb935-0158-78a7-08b5-904886deac4b@postgrespro.ru --- src/backend/executor/execExpr.c | 63 ++ src/backend/executor/execExprInterp.c | 48 ++ src/backend/jit/llvm/llvmjit_expr.c | 6 + src/backend/jit/llvm/llvmjit_types.c | 1 + src/backend/nodes/copyfuncs.c | 173 ++++++ src/backend/nodes/equalfuncs.c | 132 ++++ src/backend/nodes/makefuncs.c | 15 + src/backend/nodes/nodeFuncs.c | 152 +++++ src/backend/nodes/outfuncs.c | 18 + src/backend/nodes/readfuncs.c | 22 + src/backend/optimizer/util/clauses.c | 23 + src/backend/parser/gram.y | 265 +++++++- src/backend/parser/parse_expr.c | 589 ++++++++++++++++++ src/backend/parser/parse_target.c | 13 + src/backend/parser/parser.c | 16 + src/backend/utils/adt/json.c | 422 +++++++++++-- src/backend/utils/adt/jsonb.c | 224 +++++-- src/backend/utils/adt/jsonb_util.c | 24 +- src/backend/utils/adt/ruleutils.c | 212 ++++++- src/backend/utils/misc/queryjumble.c | 12 + src/include/catalog/pg_aggregate.dat | 22 + src/include/catalog/pg_proc.dat | 70 +++ src/include/executor/execExpr.h | 14 + src/include/nodes/makefuncs.h | 1 + src/include/nodes/nodes.h | 8 + src/include/nodes/parsenodes.h | 96 ++- src/include/nodes/primnodes.h | 25 + src/include/parser/kwlist.h | 6 + src/include/utils/json.h | 6 + src/include/utils/jsonb.h | 9 + src/interfaces/ecpg/preproc/parse.pl | 2 + src/interfaces/ecpg/preproc/parser.c | 14 + src/test/regress/expected/opr_sanity.out | 6 +- src/test/regress/expected/sqljson.out | 746 +++++++++++++++++++++++ src/test/regress/parallel_schedule | 2 +- src/test/regress/sql/opr_sanity.sql | 6 +- src/test/regress/sql/sqljson.sql | 282 +++++++++ 37 files changed, 3615 insertions(+), 130 deletions(-) create mode 100644 src/test/regress/expected/sqljson.out create mode 100644 src/test/regress/sql/sqljson.sql diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index d0b91e881d..a9547aaef1 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -2450,6 +2450,69 @@ ExecInitExprRec(Expr *node, ExprState *state, break; } + case T_JsonConstructorExpr: + { + JsonConstructorExpr *ctor = (JsonConstructorExpr *) node; + List *args = ctor->args; + ListCell *lc; + int nargs = list_length(args); + int argno = 0; + + if (ctor->func) + { + ExecInitExprRec(ctor->func, state, resv, resnull); + } + else + { + scratch.opcode = EEOP_JSON_CONSTRUCTOR; + scratch.d.json_constructor.constructor = ctor; + scratch.d.json_constructor.arg_values = palloc(sizeof(Datum) * nargs); + scratch.d.json_constructor.arg_nulls = palloc(sizeof(bool) * nargs); + scratch.d.json_constructor.arg_types = palloc(sizeof(Oid) * nargs); + scratch.d.json_constructor.nargs = nargs; + + foreach(lc, args) + { + Expr *arg = (Expr *) lfirst(lc); + + scratch.d.json_constructor.arg_types[argno] = exprType((Node *) arg); + + if (IsA(arg, Const)) + { + /* Don't evaluate const arguments every round */ + Const *con = (Const *) arg; + + scratch.d.json_constructor.arg_values[argno] = con->constvalue; + scratch.d.json_constructor.arg_nulls[argno] = con->constisnull; + } + else + { + ExecInitExprRec(arg, state, + &scratch.d.json_constructor.arg_values[argno], + &scratch.d.json_constructor.arg_nulls[argno]); + } + argno++; + } + + ExprEvalPushStep(state, &scratch); + } + + if (ctor->coercion) + { + Datum *innermost_caseval = state->innermost_caseval; + bool *innermost_isnull = state->innermost_casenull; + + state->innermost_caseval = resv; + state->innermost_casenull = resnull; + + ExecInitExprRec(ctor->coercion, state, resv, resnull); + + state->innermost_caseval = innermost_caseval; + state->innermost_casenull = innermost_isnull; + } + } + break; + default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index 64bd17b62e..f2a0821a7a 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -71,6 +71,8 @@ #include "utils/date.h" #include "utils/datum.h" #include "utils/expandedrecord.h" +#include "utils/json.h" +#include "utils/jsonb.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/timestamp.h" @@ -477,6 +479,7 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) &&CASE_EEOP_GROUPING_FUNC, &&CASE_EEOP_WINDOW_FUNC, &&CASE_EEOP_SUBPLAN, + &&CASE_EEOP_JSON_CONSTRUCTOR, &&CASE_EEOP_AGG_STRICT_DESERIALIZE, &&CASE_EEOP_AGG_DESERIALIZE, &&CASE_EEOP_AGG_STRICT_INPUT_CHECK_ARGS, @@ -1786,7 +1789,13 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) { /* too complex for an inline implementation */ ExecEvalAggOrderedTransTuple(state, op, econtext); + EEO_NEXT(); + } + EEO_CASE(EEOP_JSON_CONSTRUCTOR) + { + /* too complex for an inline implementation */ + ExecEvalJsonConstructor(state, op, econtext); EEO_NEXT(); } @@ -4380,3 +4389,42 @@ ExecAggPlainTransByRef(AggState *aggstate, AggStatePerTrans pertrans, MemoryContextSwitchTo(oldContext); } + +/* + * Evaluate a JSON constructor expression. + */ +void +ExecEvalJsonConstructor(ExprState *state, ExprEvalStep *op, + ExprContext *econtext) +{ + Datum res; + JsonConstructorExpr *ctor = op->d.json_constructor.constructor; + bool is_jsonb = ctor->returning->format->format_type == JS_FORMAT_JSONB; + bool isnull = false; + + if (ctor->type == JSCTOR_JSON_ARRAY) + res = (is_jsonb ? + jsonb_build_array_worker : + json_build_array_worker)(op->d.json_constructor.nargs, + op->d.json_constructor.arg_values, + op->d.json_constructor.arg_nulls, + op->d.json_constructor.arg_types, + op->d.json_constructor.constructor->absent_on_null); + else if (ctor->type == JSCTOR_JSON_OBJECT) + res = (is_jsonb ? + jsonb_build_object_worker : + json_build_object_worker)(op->d.json_constructor.nargs, + op->d.json_constructor.arg_values, + op->d.json_constructor.arg_nulls, + op->d.json_constructor.arg_types, + op->d.json_constructor.constructor->absent_on_null, + op->d.json_constructor.constructor->unique); + else + { + res = (Datum) 0; + elog(ERROR, "invalid JsonConstructorExpr type %d", ctor->type); + } + + *op->resvalue = res; + *op->resnull = isnull; +} diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c index bd86f546d7..d0c26cf58b 100644 --- a/src/backend/jit/llvm/llvmjit_expr.c +++ b/src/backend/jit/llvm/llvmjit_expr.c @@ -2348,6 +2348,12 @@ llvm_compile_expr(ExprState *state) LLVMBuildBr(b, opblocks[opno + 1]); break; + case EEOP_JSON_CONSTRUCTOR: + build_EvalXFunc(b, mod, "ExecEvalJsonConstructor", + v_state, op, v_econtext); + LLVMBuildBr(b, opblocks[opno + 1]); + break; + case EEOP_LAST: Assert(false); break; diff --git a/src/backend/jit/llvm/llvmjit_types.c b/src/backend/jit/llvm/llvmjit_types.c index d5191cf02b..53c75dd9d6 100644 --- a/src/backend/jit/llvm/llvmjit_types.c +++ b/src/backend/jit/llvm/llvmjit_types.c @@ -131,6 +131,7 @@ void *referenced_functions[] = ExecEvalSysVar, ExecEvalWholeRowVar, ExecEvalXmlExpr, + ExecEvalJsonConstructor, MakeExpandedObjectReadOnlyInternal, slot_getmissingattrs, slot_getsomeattrs_int, diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 9d6a404760..2cbd8aa0df 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -2344,6 +2344,152 @@ _copyJsonValueExpr(const JsonValueExpr *from) return newnode; } +/* + * _copyJsonConstructorExpr + */ +static JsonConstructorExpr * +_copyJsonConstructorExpr(const JsonConstructorExpr *from) +{ + JsonConstructorExpr *newnode = makeNode(JsonConstructorExpr); + + COPY_SCALAR_FIELD(type); + COPY_NODE_FIELD(args); + COPY_NODE_FIELD(func); + COPY_NODE_FIELD(coercion); + COPY_NODE_FIELD(returning); + COPY_SCALAR_FIELD(absent_on_null); + COPY_SCALAR_FIELD(unique); + COPY_LOCATION_FIELD(location); + + return newnode; +} + +/* + * _copyJsonKeyValue + */ +static JsonKeyValue * +_copyJsonKeyValue(const JsonKeyValue *from) +{ + JsonKeyValue *newnode = makeNode(JsonKeyValue); + + COPY_NODE_FIELD(key); + COPY_NODE_FIELD(value); + + return newnode; +} + +/* + * _copyJsonObjectConstructor + */ +static JsonObjectConstructor * +_copyJsonObjectConstructor(const JsonObjectConstructor *from) +{ + JsonObjectConstructor *newnode = makeNode(JsonObjectConstructor); + + COPY_NODE_FIELD(exprs); + COPY_NODE_FIELD(output); + COPY_SCALAR_FIELD(absent_on_null); + COPY_SCALAR_FIELD(unique); + COPY_LOCATION_FIELD(location); + + return newnode; +} + +/* + * _copyJsonAggConstructor + */ +static JsonAggConstructor * +_copyJsonAggConstructor(const JsonAggConstructor *from) +{ + JsonAggConstructor *newnode = makeNode(JsonAggConstructor); + + COPY_NODE_FIELD(output); + COPY_NODE_FIELD(agg_filter); + COPY_NODE_FIELD(agg_order); + COPY_NODE_FIELD(over); + COPY_LOCATION_FIELD(location); + + return newnode; +} + +/* + * _copyJsonObjectAgg + */ +static JsonObjectAgg * +_copyJsonObjectAgg(const JsonObjectAgg *from) +{ + JsonObjectAgg *newnode = makeNode(JsonObjectAgg); + + COPY_NODE_FIELD(constructor); + COPY_NODE_FIELD(arg); + COPY_SCALAR_FIELD(absent_on_null); + COPY_SCALAR_FIELD(unique); + + return newnode; +} + +/* + * _copyJsonOutput + */ +static JsonOutput * +_copyJsonOutput(const JsonOutput *from) +{ + JsonOutput *newnode = makeNode(JsonOutput); + + COPY_NODE_FIELD(typeName); + COPY_NODE_FIELD(returning); + + return newnode; +} + +/* + * _copyJsonArrayConstructor + */ +static JsonArrayConstructor * +_copyJsonArrayConstructor(const JsonArrayConstructor *from) +{ + JsonArrayConstructor *newnode = makeNode(JsonArrayConstructor); + + COPY_NODE_FIELD(exprs); + COPY_NODE_FIELD(output); + COPY_SCALAR_FIELD(absent_on_null); + COPY_LOCATION_FIELD(location); + + return newnode; +} + +/* + * _copyJsonArrayAgg + */ +static JsonArrayAgg * +_copyJsonArrayAgg(const JsonArrayAgg *from) +{ + JsonArrayAgg *newnode = makeNode(JsonArrayAgg); + + COPY_NODE_FIELD(constructor); + COPY_NODE_FIELD(arg); + COPY_SCALAR_FIELD(absent_on_null); + + return newnode; +} + +/* + * _copyJsonArrayQueryConstructor + */ +static JsonArrayQueryConstructor * +_copyJsonArrayQueryConstructor(const JsonArrayQueryConstructor *from) +{ + JsonArrayQueryConstructor *newnode = makeNode(JsonArrayQueryConstructor); + + COPY_NODE_FIELD(query); + COPY_NODE_FIELD(output); + COPY_NODE_FIELD(format); + COPY_SCALAR_FIELD(absent_on_null); + COPY_LOCATION_FIELD(location); + + return newnode; +} + /* **************************************************************** * pathnodes.h copy functions * @@ -5406,6 +5552,33 @@ copyObjectImpl(const void *from) case T_JsonValueExpr: retval = _copyJsonValueExpr(from); break; + case T_JsonKeyValue: + retval = _copyJsonKeyValue(from); + break; + case T_JsonConstructorExpr: + retval = _copyJsonConstructorExpr(from); + break; + case T_JsonObjectConstructor: + retval = _copyJsonObjectConstructor(from); + break; + case T_JsonAggConstructor: + retval = _copyJsonAggConstructor(from); + break; + case T_JsonObjectAgg: + retval = _copyJsonObjectAgg(from); + break; + case T_JsonOutput: + retval = _copyJsonOutput(from); + break; + case T_JsonArrayConstructor: + retval = _copyJsonArrayConstructor(from); + break; + case T_JsonArrayQueryConstructor: + retval = _copyJsonArrayQueryConstructor(from); + break; + case T_JsonArrayAgg: + retval = _copyJsonArrayAgg(from); + break; /* * RELATION NODES diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index e73b351acd..9f17e15e15 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -871,6 +871,111 @@ _equalJsonValueExpr(const JsonValueExpr *a, const JsonValueExpr *b) return true; } +static bool +_equalJsonConstructorExpr(const JsonConstructorExpr *a, const JsonConstructorExpr *b) +{ + COMPARE_SCALAR_FIELD(type); + COMPARE_NODE_FIELD(args); + COMPARE_NODE_FIELD(func); + COMPARE_NODE_FIELD(coercion); + COMPARE_NODE_FIELD(returning); + COMPARE_SCALAR_FIELD(absent_on_null); + COMPARE_SCALAR_FIELD(unique); + COMPARE_LOCATION_FIELD(location); + + return true; +} + +static bool +_equalJsonKeyValue(const JsonKeyValue *a, const JsonKeyValue *b) +{ + COMPARE_NODE_FIELD(key); + COMPARE_NODE_FIELD(value); + + return true; +} + +static bool +_equalJsonObjectConstructor(const JsonObjectConstructor *a, + const JsonObjectConstructor *b) +{ + COMPARE_NODE_FIELD(exprs); + COMPARE_NODE_FIELD(output); + COMPARE_SCALAR_FIELD(absent_on_null); + COMPARE_SCALAR_FIELD(unique); + COMPARE_LOCATION_FIELD(location); + + return true; +} + +static bool +_equalJsonAggConstructor(const JsonAggConstructor *a, + const JsonAggConstructor *b) +{ + COMPARE_NODE_FIELD(output); + COMPARE_NODE_FIELD(agg_filter); + COMPARE_NODE_FIELD(agg_order); + COMPARE_NODE_FIELD(over); + COMPARE_LOCATION_FIELD(location); + + return true; +} + +static bool +_equalJsonObjectAgg(const JsonObjectAgg *a, const JsonObjectAgg *b) +{ + COMPARE_NODE_FIELD(constructor); + COMPARE_NODE_FIELD(arg); + COMPARE_SCALAR_FIELD(absent_on_null); + COMPARE_SCALAR_FIELD(unique); + + return true; +} + +static bool +_equalJsonOutput(const JsonOutput *a, const JsonOutput *b) +{ + COMPARE_NODE_FIELD(typeName); + COMPARE_NODE_FIELD(returning); + + return true; +} + +static bool +_equalJsonArrayConstructor(const JsonArrayConstructor *a, + const JsonArrayConstructor *b) +{ + COMPARE_NODE_FIELD(exprs); + COMPARE_NODE_FIELD(output); + COMPARE_SCALAR_FIELD(absent_on_null); + COMPARE_LOCATION_FIELD(location); + + return true; +} + +static bool +_equalJsonArrayAgg(const JsonArrayAgg *a, const JsonArrayAgg *b) +{ + COMPARE_NODE_FIELD(constructor); + COMPARE_NODE_FIELD(arg); + COMPARE_SCALAR_FIELD(absent_on_null); + + return true; +} + +static bool +_equalJsonArrayQueryConstructor(const JsonArrayQueryConstructor *a, + const JsonArrayQueryConstructor *b) +{ + COMPARE_NODE_FIELD(query); + COMPARE_NODE_FIELD(output); + COMPARE_NODE_FIELD(format); + COMPARE_SCALAR_FIELD(absent_on_null); + COMPARE_LOCATION_FIELD(location); + + return true; +} + /* * Stuff from pathnodes.h */ @@ -3398,6 +3503,9 @@ equal(const void *a, const void *b) case T_JsonValueExpr: retval = _equalJsonValueExpr(a, b); break; + case T_JsonConstructorExpr: + retval = _equalJsonConstructorExpr(a, b); + break; /* * RELATION NODES @@ -3978,6 +4086,30 @@ equal(const void *a, const void *b) case T_PublicationTable: retval = _equalPublicationTable(a, b); break; + case T_JsonKeyValue: + retval = _equalJsonKeyValue(a, b); + break; + case T_JsonObjectConstructor: + retval = _equalJsonObjectConstructor(a, b); + break; + case T_JsonAggConstructor: + retval = _equalJsonAggConstructor(a, b); + break; + case T_JsonObjectAgg: + retval = _equalJsonObjectAgg(a, b); + break; + case T_JsonOutput: + retval = _equalJsonOutput(a, b); + break; + case T_JsonArrayConstructor: + retval = _equalJsonArrayConstructor(a, b); + break; + case T_JsonArrayQueryConstructor: + retval = _equalJsonArrayQueryConstructor(a, b); + break; + case T_JsonArrayAgg: + retval = _equalJsonArrayAgg(a, b); + break; default: elog(ERROR, "unrecognized node type: %d", diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c index 867a927e7a..7b4f7972e6 100644 --- a/src/backend/nodes/makefuncs.c +++ b/src/backend/nodes/makefuncs.c @@ -872,3 +872,18 @@ makeJsonEncoding(char *name) return JS_ENC_DEFAULT; } + +/* + * makeJsonKeyValue - + * creates a JsonKeyValue node + */ +Node * +makeJsonKeyValue(Node *key, Node *value) +{ + JsonKeyValue *n = makeNode(JsonKeyValue); + + n->key = (Expr *) key; + n->value = castNode(JsonValueExpr, value); + + return (Node *) n; +} diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index 0b242c76ec..25cf282aab 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -257,6 +257,9 @@ exprType(const Node *expr) type = exprType((Node *) (jve->formatted_expr ? jve->formatted_expr : jve->raw_expr)); } break; + case T_JsonConstructorExpr: + type = ((const JsonConstructorExpr *) expr)->returning->typid; + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); type = InvalidOid; /* keep compiler quiet */ @@ -491,6 +494,8 @@ exprTypmod(const Node *expr) return exprTypmod((Node *) ((const PlaceHolderVar *) expr)->phexpr); case T_JsonValueExpr: return exprTypmod((Node *) ((const JsonValueExpr *) expr)->formatted_expr); + case T_JsonConstructorExpr: + return -1; /* ((const JsonConstructorExpr *) expr)->returning->typmod; */ default: break; } @@ -970,6 +975,16 @@ exprCollation(const Node *expr) case T_JsonValueExpr: coll = exprCollation((Node *) ((const JsonValueExpr *) expr)->formatted_expr); break; + case T_JsonConstructorExpr: + { + const JsonConstructorExpr *ctor = (const JsonConstructorExpr *) expr; + + if (ctor->coercion) + coll = exprCollation((Node *) ctor->coercion); + else + coll = InvalidOid; + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); coll = InvalidOid; /* keep compiler quiet */ @@ -1186,6 +1201,16 @@ exprSetCollation(Node *expr, Oid collation) exprSetCollation((Node *) ((JsonValueExpr *) expr)->formatted_expr, collation); break; + case T_JsonConstructorExpr: + { + JsonConstructorExpr *ctor = (JsonConstructorExpr *) expr; + + if (ctor->coercion) + exprSetCollation((Node *) ctor->coercion, collation); + else + Assert(!OidIsValid(collation)); /* result is always a json[b] type */ + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); break; @@ -1635,6 +1660,9 @@ exprLocation(const Node *expr) case T_JsonValueExpr: loc = exprLocation((Node *) ((const JsonValueExpr *) expr)->raw_expr); break; + case T_JsonConstructorExpr: + loc = ((const JsonConstructorExpr *) expr)->location; + break; default: /* for any other node type it's just unknown... */ loc = -1; @@ -2379,6 +2407,18 @@ expression_tree_walker(Node *node, return true; } break; + case T_JsonConstructorExpr: + { + JsonConstructorExpr *ctor = (JsonConstructorExpr *) node; + + if (walker(ctor->args, context)) + return true; + if (walker(ctor->func, context)) + return true; + if (walker(ctor->coercion, context)) + return true; + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); @@ -3361,6 +3401,19 @@ expression_tree_mutator(Node *node, MUTATE(newnode->formatted_expr, jve->formatted_expr, Expr *); MUTATE(newnode->format, jve->format, JsonFormat *); + return (Node *) newnode; + } + case T_JsonConstructorExpr: + { + JsonConstructorExpr *jve = (JsonConstructorExpr *) node; + JsonConstructorExpr *newnode; + + FLATCOPY(newnode, jve, JsonConstructorExpr); + MUTATE(newnode->args, jve->args, List *); + MUTATE(newnode->func, jve->func, Expr *); + MUTATE(newnode->coercion, jve->coercion, Expr *); + MUTATE(newnode->returning, jve->returning, JsonReturning *); + return (Node *) newnode; } default: @@ -3637,6 +3690,7 @@ raw_expression_tree_walker(Node *node, case T_ParamRef: case T_A_Const: case T_A_Star: + case T_JsonFormat: /* primitive node types with no subnodes */ break; case T_Alias: @@ -4085,6 +4139,104 @@ raw_expression_tree_walker(Node *node, return true; } break; + case T_JsonConstructorExpr: + { + JsonConstructorExpr *ctor = (JsonConstructorExpr *) node; + + if (walker(ctor->args, context)) + return true; + if (walker(ctor->func, context)) + return true; + if (walker(ctor->coercion, context)) + return true; + if (walker(ctor->returning, context)) + return true; + } + break; + case T_JsonOutput: + { + JsonOutput *out = (JsonOutput *) node; + + if (walker(out->typeName, context)) + return true; + if (walker(out->returning, context)) + return true; + } + break; + case T_JsonKeyValue: + { + JsonKeyValue *jkv = (JsonKeyValue *) node; + + if (walker(jkv->key, context)) + return true; + if (walker(jkv->value, context)) + return true; + } + break; + case T_JsonObjectConstructor: + { + JsonObjectConstructor *joc = (JsonObjectConstructor *) node; + + if (walker(joc->output, context)) + return true; + if (walker(joc->exprs, context)) + return true; + } + break; + case T_JsonArrayConstructor: + { + JsonArrayConstructor *jac = (JsonArrayConstructor *) node; + + if (walker(jac->output, context)) + return true; + if (walker(jac->exprs, context)) + return true; + } + break; + case T_JsonAggConstructor: + { + JsonAggConstructor *ctor = (JsonAggConstructor *) node; + + if (walker(ctor->output, context)) + return true; + if (walker(ctor->agg_order, context)) + return true; + if (walker(ctor->agg_filter, context)) + return true; + if (walker(ctor->over, context)) + return true; + } + break; + case T_JsonObjectAgg: + { + JsonObjectAgg *joa = (JsonObjectAgg *) node; + + if (walker(joa->constructor, context)) + return true; + if (walker(joa->arg, context)) + return true; + } + break; + case T_JsonArrayAgg: + { + JsonArrayAgg *jaa = (JsonArrayAgg *) node; + + if (walker(jaa->constructor, context)) + return true; + if (walker(jaa->arg, context)) + return true; + } + break; + case T_JsonArrayQueryConstructor: + { + JsonArrayQueryConstructor *jaqc = (JsonArrayQueryConstructor *) node; + + if (walker(jaqc->output, context)) + return true; + if (walker(jaqc->query, context)) + return true; + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 449d90c8f4..c25f0bd684 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1781,6 +1781,21 @@ _outJsonValueExpr(StringInfo str, const JsonValueExpr *node) WRITE_NODE_FIELD(format); } +static void +_outJsonConstructorExpr(StringInfo str, const JsonConstructorExpr *node) +{ + WRITE_NODE_TYPE("JSONCTOREXPR"); + + WRITE_NODE_FIELD(args); + WRITE_NODE_FIELD(func); + WRITE_NODE_FIELD(coercion); + WRITE_INT_FIELD(type); + WRITE_NODE_FIELD(returning); + WRITE_BOOL_FIELD(unique); + WRITE_BOOL_FIELD(absent_on_null); + WRITE_LOCATION_FIELD(location); +} + /***************************************************************************** * * Stuff from pathnodes.h. @@ -4576,6 +4591,9 @@ outNode(StringInfo str, const void *obj) case T_JsonValueExpr: _outJsonValueExpr(str, obj); break; + case T_JsonConstructorExpr: + _outJsonConstructorExpr(str, obj); + break; default: diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 6f398cdc15..e0b3ad1ed2 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -1434,6 +1434,26 @@ _readJsonValueExpr(void) READ_DONE(); } +/* + * _readJsonConstructorExpr + */ +static JsonConstructorExpr * +_readJsonConstructorExpr(void) +{ + READ_LOCALS(JsonConstructorExpr); + + READ_NODE_FIELD(args); + READ_NODE_FIELD(func); + READ_NODE_FIELD(coercion); + READ_INT_FIELD(type); + READ_NODE_FIELD(returning); + READ_BOOL_FIELD(unique); + READ_BOOL_FIELD(absent_on_null); + READ_LOCATION_FIELD(location); + + READ_DONE(); +} + /* * Stuff from pathnodes.h. * @@ -3025,6 +3045,8 @@ parseNodeString(void) return_value = _readJsonReturning(); else if (MATCH("JSONVALUEEXPR", 13)) return_value = _readJsonValueExpr(); + else if (MATCH("JSONCTOREXPR", 12)) + return_value = _readJsonConstructorExpr(); else { elog(ERROR, "badly formatted node string \"%.32s\"...", token); diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index b9cefe8847..e1147c431e 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -50,6 +50,8 @@ #include "utils/builtins.h" #include "utils/datum.h" #include "utils/fmgroids.h" +#include "utils/json.h" +#include "utils/jsonb.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/syscache.h" @@ -382,6 +384,27 @@ contain_mutable_functions_walker(Node *node, void *context) context)) return true; + if (IsA(node, JsonConstructorExpr)) + { + const JsonConstructorExpr *ctor = (JsonConstructorExpr *) node; + ListCell *lc; + bool is_jsonb = + ctor->returning->format->format_type == JS_FORMAT_JSONB; + + /* Check argument_type => json[b] conversions */ + foreach(lc, ctor->args) + { + Oid typid = exprType(lfirst(lc)); + + if (is_jsonb ? + !to_jsonb_is_immutable(typid) : + !to_json_is_immutable(typid)) + return true; + } + + /* Check all subnodes */ + } + if (IsA(node, SQLValueFunction)) { /* all variants of SQLValueFunction are stable */ diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index a324983f5d..c6613af9fe 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -639,11 +639,31 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type json_format_clause_opt json_representation json_value_expr + json_func_expr json_output_clause_opt + json_value_constructor + json_object_constructor + json_object_constructor_args + json_object_constructor_args_opt + json_object_args + json_object_func_args + json_array_constructor + json_name_and_value + json_aggregate_func + json_object_aggregate_constructor + json_array_aggregate_constructor + +%type json_name_and_value_list + json_value_expr_list + json_array_aggregate_order_by_clause_opt %type json_encoding json_encoding_clause_opt +%type json_key_uniqueness_constraint_opt + json_object_constructor_null_clause_opt + json_array_constructor_null_clause_opt + /* * Non-keyword token types. These are hard-wired into the "flex" lexer. * They must be listed first so that their numeric codes do not depend on @@ -669,7 +689,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); */ /* ordinary key words in alphabetical order */ -%token ABORT_P ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER +%token ABORT_P ABSENT ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER AGGREGATE ALL ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARRAY AS ASC ASENSITIVE ASSERTION ASSIGNMENT ASYMMETRIC ATOMIC AT ATTACH ATTRIBUTE AUTHORIZATION @@ -706,9 +726,9 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION - JOIN JSON + JOIN JSON JSON_ARRAY JSON_ARRAYAGG JSON_OBJECT JSON_OBJECTAGG - KEY + KEY KEYS LABEL LANGUAGE LARGE_P LAST_P LATERAL_P LEADING LEAKPROOF LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL @@ -772,7 +792,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); * as NOT, at least with respect to their left-hand subexpression. * NULLS_LA and WITH_LA are needed to make the grammar LALR(1). */ -%token NOT_LA NULLS_LA WITH_LA +%token NOT_LA NULLS_LA WITH_LA WITH_LA_UNIQUE WITHOUT_LA /* * The grammar likewise thinks these tokens are keywords, but they are never @@ -826,11 +846,13 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); * Using the same precedence as IDENT seems right for the reasons given above. */ %nonassoc UNBOUNDED /* ideally would have same precedence as IDENT */ +%nonassoc ABSENT UNIQUE %nonassoc IDENT PARTITION RANGE ROWS GROUPS PRECEDING FOLLOWING CUBE ROLLUP %left Op OPERATOR /* multi-character ops and user-defined operators */ %left '+' '-' %left '*' '/' '%' %left '^' +%left KEYS /* UNIQUE [ KEYS ] */ /* Unary Operators */ %left AT /* sets precedence for AT TIME ZONE */ %left COLLATE @@ -848,6 +870,9 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); */ %left JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL +%nonassoc empty_json_unique +%left WITHOUT WITH_LA_UNIQUE + %% /* @@ -13415,7 +13440,7 @@ ConstInterval: opt_timezone: WITH_LA TIME ZONE { $$ = true; } - | WITHOUT TIME ZONE { $$ = false; } + | WITHOUT_LA TIME ZONE { $$ = false; } | /*EMPTY*/ { $$ = false; } ; @@ -14028,6 +14053,17 @@ b_expr: c_expr } ; +json_key_uniqueness_constraint_opt: + WITH_LA_UNIQUE unique_keys { $$ = true; } + | WITHOUT unique_keys { $$ = false; } + | /* EMPTY */ %prec empty_json_unique { $$ = false; } + ; + +unique_keys: + UNIQUE + | UNIQUE KEYS + ; + /* * Productions that can be used in both a_expr and b_expr. * @@ -14280,6 +14316,15 @@ func_expr: func_application within_group_clause filter_clause over_clause n->over = $4; $$ = (Node *) n; } + | json_aggregate_func filter_clause over_clause + { + JsonAggConstructor *n = IsA($1, JsonObjectAgg) ? + ((JsonObjectAgg *) $1)->constructor : + ((JsonArrayAgg *) $1)->constructor; + n->agg_filter = $2; + n->over = $3; + $$ = (Node *) $1; + } | func_expr_common_subexpr { $$ = $1; } ; @@ -14293,6 +14338,7 @@ func_expr: func_application within_group_clause filter_clause over_clause func_expr_windowless: func_application { $$ = $1; } | func_expr_common_subexpr { $$ = $1; } + | json_aggregate_func { $$ = $1; } ; /* @@ -14580,6 +14626,8 @@ func_expr_common_subexpr: n->location = @1; $$ = (Node *)n; } + | json_func_expr + { $$ = $1; } ; /* @@ -15279,11 +15327,14 @@ opt_asymmetric: ASYMMETRIC ; /* SQL/JSON support */ +json_func_expr: + json_value_constructor + ; json_value_expr: a_expr json_format_clause_opt { - $$ = (Node *) makeJsonValueExpr((Expr *) $1, $2); + $$ = (Node *) makeJsonValueExpr((Expr *) $1, castNode(JsonFormat, $2)); } ; @@ -15291,7 +15342,7 @@ json_format_clause_opt: FORMAT json_representation { $$ = $2; - $$.location = @1; + castNode(JsonFormat, $$)->location = @1; } | /* EMPTY */ { @@ -15321,10 +15372,196 @@ json_output_clause_opt: { JsonOutput *n = makeNode(JsonOutput); n->typeName = $2; - n->returning.format = $3; + n->returning = makeNode(JsonReturning); + n->returning->format = (JsonFormat *) $3; $$ = (Node *) n; } | /* EMPTY */ { $$ = NULL; } + ; + +json_value_constructor: + json_object_constructor + | json_array_constructor + ; + +json_object_constructor: + JSON_OBJECT '(' json_object_args ')' + { + $$ = $3; + } + ; + +json_object_args: + json_object_constructor_args + | json_object_func_args + ; + +json_object_func_args: + func_arg_list + { + List *func = list_make1(makeString("json_object")); + $$ = (Node *) makeFuncCall(func, $1, COERCE_EXPLICIT_CALL, @1); + } + ; + +json_object_constructor_args: + json_object_constructor_args_opt json_output_clause_opt + { + JsonObjectConstructor *n = (JsonObjectConstructor *) $1; + n->output = (JsonOutput *) $2; + n->location = @1; + $$ = (Node *) n; + } + ; + +json_object_constructor_args_opt: + json_name_and_value_list + json_object_constructor_null_clause_opt + json_key_uniqueness_constraint_opt + { + JsonObjectConstructor *n = makeNode(JsonObjectConstructor); + n->exprs = $1; + n->absent_on_null = $2; + n->unique = $3; + $$ = (Node *) n; + } + | /* EMPTY */ + { + JsonObjectConstructor *n = makeNode(JsonObjectConstructor); + n->exprs = NULL; + n->absent_on_null = false; + n->unique = false; + $$ = (Node *) n; + } + ; + +json_name_and_value_list: + json_name_and_value + { $$ = list_make1($1); } + | json_name_and_value_list ',' json_name_and_value + { $$ = lappend($1, $3); } + ; + +json_name_and_value: +/* TODO This is not supported due to conflicts + KEY c_expr VALUE_P json_value_expr %prec POSTFIXOP + { $$ = makeJsonKeyValue($2, $4); } + | +*/ + c_expr VALUE_P json_value_expr + { $$ = makeJsonKeyValue($1, $3); } + | + a_expr ':' json_value_expr + { $$ = makeJsonKeyValue($1, $3); } + ; + +json_object_constructor_null_clause_opt: + NULL_P ON NULL_P { $$ = false; } + | ABSENT ON NULL_P { $$ = true; } + | /* EMPTY */ { $$ = false; } + ; + +json_array_constructor: + JSON_ARRAY '(' + json_value_expr_list + json_array_constructor_null_clause_opt + json_output_clause_opt + ')' + { + JsonArrayConstructor *n = makeNode(JsonArrayConstructor); + n->exprs = $3; + n->absent_on_null = $4; + n->output = (JsonOutput *) $5; + n->location = @1; + $$ = (Node *) n; + } + | JSON_ARRAY '(' + select_no_parens + /* json_format_clause_opt */ + /* json_array_constructor_null_clause_opt */ + json_output_clause_opt + ')' + { + JsonArrayQueryConstructor *n = makeNode(JsonArrayQueryConstructor); + n->query = $3; + n->format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1); + /* n->format = $4; */ + n->absent_on_null = true /* $5 */; + n->output = (JsonOutput *) $4; + n->location = @1; + $$ = (Node *) n; + } + | JSON_ARRAY '(' + json_output_clause_opt + ')' + { + JsonArrayConstructor *n = makeNode(JsonArrayConstructor); + n->exprs = NIL; + n->absent_on_null = true; + n->output = (JsonOutput *) $3; + n->location = @1; + $$ = (Node *) n; + } + ; + +json_value_expr_list: + json_value_expr { $$ = list_make1($1); } + | json_value_expr_list ',' json_value_expr { $$ = lappend($1, $3);} + ; + +json_array_constructor_null_clause_opt: + NULL_P ON NULL_P { $$ = false; } + | ABSENT ON NULL_P { $$ = true; } + | /* EMPTY */ { $$ = true; } + ; + +json_aggregate_func: + json_object_aggregate_constructor + | json_array_aggregate_constructor + ; + +json_object_aggregate_constructor: + JSON_OBJECTAGG '(' + json_name_and_value + json_object_constructor_null_clause_opt + json_key_uniqueness_constraint_opt + json_output_clause_opt + ')' + { + JsonObjectAgg *n = makeNode(JsonObjectAgg); + n->arg = (JsonKeyValue *) $3; + n->absent_on_null = $4; + n->unique = $5; + n->constructor = makeNode(JsonAggConstructor); + n->constructor->output = (JsonOutput *) $6; + n->constructor->agg_order = NULL; + n->constructor->location = @1; + $$ = (Node *) n; + } + ; + +json_array_aggregate_constructor: + JSON_ARRAYAGG '(' + json_value_expr + json_array_aggregate_order_by_clause_opt + json_array_constructor_null_clause_opt + json_output_clause_opt + ')' + { + JsonArrayAgg *n = makeNode(JsonArrayAgg); + n->arg = (JsonValueExpr *) $3; + n->absent_on_null = $5; + n->constructor = makeNode(JsonAggConstructor); + n->constructor->agg_order = $4; + n->constructor->output = (JsonOutput *) $6; + n->constructor->location = @1; + $$ = (Node *) n; + } + ; + +json_array_aggregate_order_by_clause_opt: + ORDER BY sortby_list { $$ = $3; } + | /* EMPTY */ { $$ = NIL; } ; /***************************************************************************** @@ -15771,6 +16008,7 @@ BareColLabel: IDENT { $$ = $1; } */ unreserved_keyword: ABORT_P + | ABSENT | ABSOLUTE_P | ACCESS | ACTION @@ -15901,6 +16139,7 @@ unreserved_keyword: | ISOLATION | JSON | KEY + | KEYS | LABEL | LANGUAGE | LARGE_P @@ -16109,6 +16348,10 @@ col_name_keyword: | INT_P | INTEGER | INTERVAL + | JSON_ARRAY + | JSON_ARRAYAGG + | JSON_OBJECT + | JSON_OBJECTAGG | LEAST | NATIONAL | NCHAR @@ -16277,6 +16520,7 @@ reserved_keyword: */ bare_label_keyword: ABORT_P + | ABSENT | ABSOLUTE_P | ACCESS | ACTION @@ -16462,7 +16706,12 @@ bare_label_keyword: | ISOLATION | JOIN | JSON + | JSON_ARRAY + | JSON_ARRAYAGG + | JSON_OBJECT + | JSON_OBJECTAGG | KEY + | KEYS | LABEL | LANGUAGE | LARGE_P diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 985ddbedf1..6b93a76bca 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -15,6 +15,8 @@ #include "postgres.h" +#include "catalog/pg_aggregate.h" +#include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "commands/dbcommands.h" #include "miscadmin.h" @@ -75,6 +77,14 @@ static Node *transformWholeRowRef(ParseState *pstate, static Node *transformIndirection(ParseState *pstate, A_Indirection *ind); static Node *transformTypeCast(ParseState *pstate, TypeCast *tc); static Node *transformCollateClause(ParseState *pstate, CollateClause *c); +static Node *transformJsonObjectConstructor(ParseState *pstate, + JsonObjectConstructor *ctor); +static Node *transformJsonArrayConstructor(ParseState *pstate, + JsonArrayConstructor *ctor); +static Node *transformJsonArrayQueryConstructor(ParseState *pstate, + JsonArrayQueryConstructor *ctor); +static Node *transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg); +static Node *transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg); static Node *make_row_comparison_op(ParseState *pstate, List *opname, List *largs, List *rargs, int location); static Node *make_row_distinct_op(ParseState *pstate, List *opname, @@ -302,6 +312,26 @@ transformExprRecurse(ParseState *pstate, Node *expr) break; } + case T_JsonObjectConstructor: + result = transformJsonObjectConstructor(pstate, (JsonObjectConstructor *) expr); + break; + + case T_JsonArrayConstructor: + result = transformJsonArrayConstructor(pstate, (JsonArrayConstructor *) expr); + break; + + case T_JsonArrayQueryConstructor: + result = transformJsonArrayQueryConstructor(pstate, (JsonArrayQueryConstructor *) expr); + break; + + case T_JsonObjectAgg: + result = transformJsonObjectAgg(pstate, (JsonObjectAgg *) expr); + break; + + case T_JsonArrayAgg: + result = transformJsonArrayAgg(pstate, (JsonArrayAgg *) expr); + break; + default: /* should not reach here */ elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); @@ -3280,3 +3310,562 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, return expr; } + +/* + * Checks specified output format for its applicability to the target type. + */ +static void +checkJsonOutputFormat(ParseState *pstate, const JsonFormat *format, + Oid targettype, bool allow_format_for_non_strings) +{ + if (!allow_format_for_non_strings && + format->format_type != JS_FORMAT_DEFAULT && + (targettype != BYTEAOID && + targettype != JSONOID && + targettype != JSONBOID)) + { + char typcategory; + bool typispreferred; + + get_type_category_preferred(targettype, &typcategory, &typispreferred); + + if (typcategory != TYPCATEGORY_STRING) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + parser_errposition(pstate, format->location), + errmsg("cannot use JSON format with non-string output types"))); + } + + if (format->format_type == JS_FORMAT_JSON) + { + JsonEncoding enc = format->encoding != JS_ENC_DEFAULT ? + format->encoding : JS_ENC_UTF8; + + if (targettype != BYTEAOID && + format->encoding != JS_ENC_DEFAULT) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + parser_errposition(pstate, format->location), + errmsg("cannot set JSON encoding for non-bytea output types"))); + + if (enc != JS_ENC_UTF8) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("unsupported JSON encoding"), + errhint("only UTF8 JSON encoding is supported"), + parser_errposition(pstate, format->location))); + } +} + +/* + * Transform JSON output clause. + * + * Assigns target type oid and modifier. + * Assigns default format or checks specified format for its applicability to + * the target type. + */ +static JsonReturning * +transformJsonOutput(ParseState *pstate, const JsonOutput *output, + bool allow_format) +{ + JsonReturning *ret; + + /* if output clause is not specified, make default clause value */ + if (!output) + { + ret = makeNode(JsonReturning); + + ret->format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1); + ret->typid = InvalidOid; + ret->typmod = -1; + + return ret; + } + + ret = copyObject(output->returning); + + typenameTypeIdAndMod(pstate, output->typeName, &ret->typid, &ret->typmod); + + if (output->typeName->setof) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("returning SETOF types is not supported in SQL/JSON functions"))); + + if (ret->format->format_type == JS_FORMAT_DEFAULT) + /* assign JSONB format when returning jsonb, or JSON format otherwise */ + ret->format->format_type = + ret->typid == JSONBOID ? JS_FORMAT_JSONB : JS_FORMAT_JSON; + else + checkJsonOutputFormat(pstate, ret->format, ret->typid, allow_format); + + return ret; +} + +/* + * Transform JSON output clause of JSON contructor functions. + * + * Derive RETURNING type, if not specified, from argument types. + */ +static JsonReturning * +transformJsonConstructorOutput(ParseState *pstate, JsonOutput *output, + List *args) +{ + JsonReturning *returning = transformJsonOutput(pstate, output, true); + + if (!OidIsValid(returning->typid)) + { + ListCell *lc; + bool have_json = false; + bool have_jsonb = false; + + foreach(lc, args) + { + Node *expr = lfirst(lc); + Oid typid = exprType(expr); + + have_json |= typid == JSONOID; + have_jsonb |= typid == JSONBOID; + + if (have_jsonb) + break; + } + + if (have_jsonb) + { + returning->typid = JSONBOID; + returning->format->format_type = JS_FORMAT_JSONB; + } + else + { + /* Note: this includes the have_json case */ + + /* XXX TEXT is default by the standard, but we return JSON */ + returning->typid = JSONOID; + returning->format->format_type = JS_FORMAT_JSON; + } + + returning->typmod = -1; + } + + return returning; +} + +/* + * Coerce json[b]-valued function expression to the output type. + */ +static Node * +coerceJsonFuncExpr(ParseState *pstate, Node *expr, + const JsonReturning *returning, bool report_error) +{ + Node *res; + int location; + Oid exprtype = exprType(expr); + + /* if output type is not specified or equals to function type, return */ + if (!OidIsValid(returning->typid) || returning->typid == exprtype) + return expr; + + location = exprLocation(expr); + + if (location < 0) + location = returning ? returning->format->location : -1; + + /* special case for RETURNING bytea FORMAT json */ + if (returning->format->format_type == JS_FORMAT_JSON && + returning->typid == BYTEAOID) + { + /* encode json text into bytea using pg_convert_to() */ + Node *texpr = coerce_to_specific_type(pstate, expr, TEXTOID, + "JSON_FUNCTION"); + Const *enc = getJsonEncodingConst(returning->format); + FuncExpr *fexpr = makeFuncExpr(F_CONVERT_TO, BYTEAOID, + list_make2(texpr, enc), + InvalidOid, InvalidOid, + COERCE_EXPLICIT_CALL); + fexpr->location = location; + + return (Node *) fexpr; + } + + /* try to coerce expression to the output type */ + res = coerce_to_target_type(pstate, expr, exprtype, + returning->typid, returning->typmod, + /* XXX throwing errors when casting to char(N) */ + COERCION_EXPLICIT, + COERCE_EXPLICIT_CAST, + location); + + if (!res && report_error) + ereport(ERROR, + (errcode(ERRCODE_CANNOT_COERCE), + errmsg("cannot cast type %s to %s", + format_type_be(exprtype), + format_type_be(returning->typid)), + parser_coercion_errposition(pstate, location, expr))); + + return res; +} + +static Node * +makeJsonConstructorExpr(ParseState *pstate, JsonConstructorType type, + List *args, Expr *fexpr, JsonReturning *returning, + bool unique, bool absent_on_null, int location) +{ + JsonConstructorExpr *jsctor = makeNode(JsonConstructorExpr); + Node *placeholder; + Node *coercion; + Oid intermediate_typid = + returning->format->format_type == JS_FORMAT_JSONB ? JSONBOID : JSONOID; + + jsctor->args = args; + jsctor->func = fexpr; + jsctor->type = type; + jsctor->returning = returning; + jsctor->unique = unique; + jsctor->absent_on_null = absent_on_null; + jsctor->location = location; + + if (fexpr) + placeholder = makeCaseTestExpr((Node *) fexpr); + else + { + CaseTestExpr *cte = makeNode(CaseTestExpr); + + cte->typeId = intermediate_typid; + cte->typeMod = -1; + cte->collation = InvalidOid; + + placeholder = (Node *) cte; + } + + coercion = coerceJsonFuncExpr(pstate, placeholder, returning, true); + + if (coercion != placeholder) + jsctor->coercion = (Expr *) coercion; + + return (Node *) jsctor; +} + +/* + * Transform JSON_OBJECT() constructor. + * + * JSON_OBJECT() is transformed into json[b]_build_object[_ext]() call + * depending on the output JSON format. The first two arguments of + * json[b]_build_object_ext() are absent_on_null and check_key_uniqueness. + * + * Then function call result is coerced to the target type. + */ +static Node * +transformJsonObjectConstructor(ParseState *pstate, JsonObjectConstructor *ctor) +{ + JsonReturning *returning; + List *args = NIL; + + /* transform key-value pairs, if any */ + if (ctor->exprs) + { + ListCell *lc; + + /* transform and append key-value arguments */ + foreach(lc, ctor->exprs) + { + JsonKeyValue *kv = castNode(JsonKeyValue, lfirst(lc)); + Node *key = transformExprRecurse(pstate, (Node *) kv->key); + Node *val = transformJsonValueExpr(pstate, kv->value, + JS_FORMAT_DEFAULT); + + args = lappend(args, key); + args = lappend(args, val); + } + } + + returning = transformJsonConstructorOutput(pstate, ctor->output, args); + + return makeJsonConstructorExpr(pstate, JSCTOR_JSON_OBJECT, args, NULL, + returning, ctor->unique, + ctor->absent_on_null, ctor->location); +} + +/* + * Transform JSON_ARRAY(query [FORMAT] [RETURNING] [ON NULL]) into + * (SELECT JSON_ARRAYAGG(a [FORMAT] [RETURNING] [ON NULL]) FROM (query) q(a)) + */ +static Node * +transformJsonArrayQueryConstructor(ParseState *pstate, + JsonArrayQueryConstructor *ctor) +{ + SubLink *sublink = makeNode(SubLink); + SelectStmt *select = makeNode(SelectStmt); + RangeSubselect *range = makeNode(RangeSubselect); + Alias *alias = makeNode(Alias); + ResTarget *target = makeNode(ResTarget); + JsonArrayAgg *agg = makeNode(JsonArrayAgg); + ColumnRef *colref = makeNode(ColumnRef); + Query *query; + ParseState *qpstate; + + /* Transform query only for counting target list entries. */ + qpstate = make_parsestate(pstate); + + query = transformStmt(qpstate, ctor->query); + + if (count_nonjunk_tlist_entries(query->targetList) != 1) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("subquery must return only one column"), + parser_errposition(pstate, ctor->location))); + + free_parsestate(qpstate); + + colref->fields = list_make2(makeString(pstrdup("q")), + makeString(pstrdup("a"))); + colref->location = ctor->location; + + agg->arg = makeJsonValueExpr((Expr *) colref, ctor->format); + agg->absent_on_null = ctor->absent_on_null; + agg->constructor = makeNode(JsonAggConstructor); + agg->constructor->agg_order = NIL; + agg->constructor->output = ctor->output; + agg->constructor->location = ctor->location; + + target->name = NULL; + target->indirection = NIL; + target->val = (Node *) agg; + target->location = ctor->location; + + alias->aliasname = pstrdup("q"); + alias->colnames = list_make1(makeString(pstrdup("a"))); + + range->lateral = false; + range->subquery = ctor->query; + range->alias = alias; + + select->targetList = list_make1(target); + select->fromClause = list_make1(range); + + sublink->subLinkType = EXPR_SUBLINK; + sublink->subLinkId = 0; + sublink->testexpr = NULL; + sublink->operName = NIL; + sublink->subselect = (Node *) select; + sublink->location = ctor->location; + + return transformExprRecurse(pstate, (Node *) sublink); +} + +/* + * Common code for JSON_OBJECTAGG and JSON_ARRAYAGG transformation. + */ +static Node * +transformJsonAggConstructor(ParseState *pstate, JsonAggConstructor *agg_ctor, + JsonReturning *returning, List *args, + const char *aggfn, Oid aggtype, + JsonConstructorType ctor_type, + bool unique, bool absent_on_null) +{ + Oid aggfnoid; + Node *node; + Expr *aggfilter = agg_ctor->agg_filter ? (Expr *) + transformWhereClause(pstate, agg_ctor->agg_filter, + EXPR_KIND_FILTER, "FILTER") : NULL; + + aggfnoid = DatumGetInt32(DirectFunctionCall1(regprocin, + CStringGetDatum(aggfn))); + + if (agg_ctor->over) + { + /* window function */ + WindowFunc *wfunc = makeNode(WindowFunc); + + wfunc->winfnoid = aggfnoid; + wfunc->wintype = aggtype; + /* wincollid and inputcollid will be set by parse_collate.c */ + wfunc->args = args; + /* winref will be set by transformWindowFuncCall */ + wfunc->winstar = false; + wfunc->winagg = true; + wfunc->aggfilter = aggfilter; + wfunc->location = agg_ctor->location; + + /* + * ordered aggs not allowed in windows yet + */ + if (agg_ctor->agg_order != NIL) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("aggregate ORDER BY is not implemented for window functions"), + parser_errposition(pstate, agg_ctor->location))); + + /* parse_agg.c does additional window-func-specific processing */ + transformWindowFuncCall(pstate, wfunc, agg_ctor->over); + + node = (Node *) wfunc; + } + else + { + Aggref *aggref = makeNode(Aggref); + + aggref->aggfnoid = aggfnoid; + aggref->aggtype = aggtype; + + /* aggcollid and inputcollid will be set by parse_collate.c */ + aggref->aggtranstype = InvalidOid; /* will be set by planner */ + /* aggargtypes will be set by transformAggregateCall */ + /* aggdirectargs and args will be set by transformAggregateCall */ + /* aggorder and aggdistinct will be set by transformAggregateCall */ + aggref->aggfilter = aggfilter; + aggref->aggstar = false; + aggref->aggvariadic = false; + aggref->aggkind = AGGKIND_NORMAL; + /* agglevelsup will be set by transformAggregateCall */ + aggref->aggsplit = AGGSPLIT_SIMPLE; /* planner might change this */ + aggref->location = agg_ctor->location; + + transformAggregateCall(pstate, aggref, args, agg_ctor->agg_order, false); + + node = (Node *) aggref; + } + + return makeJsonConstructorExpr(pstate, ctor_type, NIL, (Expr *) node, + returning, unique, absent_on_null, + agg_ctor->location); +} + +/* + * Transform JSON_OBJECTAGG() aggregate function. + * + * JSON_OBJECTAGG() is transformed into + * json[b]_objectagg(key, value, absent_on_null, check_unique) call depending on + * the output JSON format. Then the function call result is coerced to the + * target output type. + */ +static Node * +transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg) +{ + JsonReturning *returning; + Node *key; + Node *val; + List *args; + const char *aggfnname; + Oid aggtype; + + key = transformExprRecurse(pstate, (Node *) agg->arg->key); + val = transformJsonValueExpr(pstate, agg->arg->value, JS_FORMAT_DEFAULT); + args = list_make2(key, val); + + returning = transformJsonConstructorOutput(pstate, agg->constructor->output, + args); + + if (returning->format->format_type == JS_FORMAT_JSONB) + { + if (agg->absent_on_null) + if (agg->unique) + aggfnname = "pg_catalog.jsonb_object_agg_unique_strict"; /* F_JSONB_OBJECT_AGG_UNIQUE_STRICT */ + else + aggfnname = "pg_catalog.jsonb_object_agg_strict"; /* F_JSONB_OBJECT_AGG_STRICT */ + else + if (agg->unique) + aggfnname = "pg_catalog.jsonb_object_agg_unique"; /* F_JSONB_OBJECT_AGG_UNIQUE */ + else + aggfnname = "pg_catalog.jsonb_object_agg"; /* F_JSONB_OBJECT_AGG */ + + aggtype = JSONBOID; + } + else + { + if (agg->absent_on_null) + if (agg->unique) + aggfnname = "pg_catalog.json_object_agg_unique_strict"; /* F_JSON_OBJECT_AGG_UNIQUE_STRICT */ + else + aggfnname = "pg_catalog.json_object_agg_strict"; /* F_JSON_OBJECT_AGG_STRICT */ + else + if (agg->unique) + aggfnname = "pg_catalog.json_object_agg_unique"; /* F_JSON_OBJECT_AGG_UNIQUE */ + else + aggfnname = "pg_catalog.json_object_agg"; /* F_JSON_OBJECT_AGG */ + + aggtype = JSONOID; + } + + return transformJsonAggConstructor(pstate, agg->constructor, returning, + args, aggfnname, aggtype, + JSCTOR_JSON_OBJECTAGG, + agg->unique, agg->absent_on_null); +} + +/* + * Transform JSON_ARRAYAGG() aggregate function. + * + * JSON_ARRAYAGG() is transformed into json[b]_agg[_strict]() call depending + * on the output JSON format and absent_on_null. Then the function call result + * is coerced to the target output type. + */ +static Node * +transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg) +{ + JsonReturning *returning; + Node *arg; + const char *aggfnname; + Oid aggtype; + + arg = transformJsonValueExpr(pstate, agg->arg, JS_FORMAT_DEFAULT); + + returning = transformJsonConstructorOutput(pstate, agg->constructor->output, + list_make1(arg)); + + if (returning->format->format_type == JS_FORMAT_JSONB) + { + aggfnname = agg->absent_on_null ? + "pg_catalog.jsonb_agg_strict" : "pg_catalog.jsonb_agg"; + aggtype = JSONBOID; + } + else + { + aggfnname = agg->absent_on_null ? + "pg_catalog.json_agg_strict" : "pg_catalog.json_agg"; + aggtype = JSONOID; + } + + return transformJsonAggConstructor(pstate, agg->constructor, returning, + list_make1(arg), aggfnname, aggtype, + JSCTOR_JSON_ARRAYAGG, + false, agg->absent_on_null); +} + +/* + * Transform JSON_ARRAY() constructor. + * + * JSON_ARRAY() is transformed into json[b]_build_array[_ext]() call + * depending on the output JSON format. The first argument of + * json[b]_build_array_ext() is absent_on_null. + * + * Then function call result is coerced to the target type. + */ +static Node * +transformJsonArrayConstructor(ParseState *pstate, JsonArrayConstructor *ctor) +{ + JsonReturning *returning; + List *args = NIL; + + /* transform element expressions, if any */ + if (ctor->exprs) + { + ListCell *lc; + + /* transform and append element arguments */ + foreach(lc, ctor->exprs) + { + JsonValueExpr *jsval = castNode(JsonValueExpr, lfirst(lc)); + Node *val = transformJsonValueExpr(pstate, jsval, + JS_FORMAT_DEFAULT); + + args = lappend(args, val); + } + } + + returning = transformJsonConstructorOutput(pstate, ctor->output, args); + + return makeJsonConstructorExpr(pstate, JSCTOR_JSON_ARRAY, args, NULL, + returning, false, ctor->absent_on_null, + ctor->location); +} diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index 059eeb9e94..204d285773 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -1957,6 +1957,19 @@ FigureColnameInternal(Node *node, char **name) case T_XmlSerialize: *name = "xmlserialize"; return 2; + case T_JsonObjectConstructor: + *name = "json_object"; + return 2; + case T_JsonArrayConstructor: + case T_JsonArrayQueryConstructor: + *name = "json_array"; + return 2; + case T_JsonObjectAgg: + *name = "json_objectagg"; + return 2; + case T_JsonArrayAgg: + *name = "json_arrayagg"; + return 2; default: break; } diff --git a/src/backend/parser/parser.c b/src/backend/parser/parser.c index 50227cc098..eee0a29c08 100644 --- a/src/backend/parser/parser.c +++ b/src/backend/parser/parser.c @@ -150,6 +150,9 @@ base_yylex(YYSTYPE *lvalp, YYLTYPE *llocp, core_yyscan_t yyscanner) case USCONST: cur_token_length = strlen(yyextra->core_yy_extra.scanbuf + *llocp); break; + case WITHOUT: + cur_token_length = 7; + break; default: return cur_token; } @@ -221,6 +224,19 @@ base_yylex(YYSTYPE *lvalp, YYLTYPE *llocp, core_yyscan_t yyscanner) case ORDINALITY: cur_token = WITH_LA; break; + case UNIQUE: + cur_token = WITH_LA_UNIQUE; + break; + } + break; + + case WITHOUT: + /* Replace WITHOUT by WITHOUT_LA if it's followed by TIME */ + switch (next_token) + { + case TIME: + cur_token = WITHOUT_LA; + break; } break; diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c index 7879f342e6..d088fafc56 100644 --- a/src/backend/utils/adt/json.c +++ b/src/backend/utils/adt/json.c @@ -13,7 +13,9 @@ */ #include "postgres.h" +#include "catalog/pg_proc.h" #include "catalog/pg_type.h" +#include "common/hashfn.h" #include "funcapi.h" #include "libpq/pqformat.h" #include "miscadmin.h" @@ -42,6 +44,42 @@ typedef enum /* type categories for datum_to_json */ JSONTYPE_OTHER /* all else */ } JsonTypeCategory; +/* Common context for key uniqueness check */ +typedef struct HTAB *JsonUniqueCheckState; /* hash table for key names */ + +/* Hash entry for JsonUniqueCheckState */ +typedef struct JsonUniqueHashEntry +{ + const char *key; + int key_len; + int object_id; +} JsonUniqueHashEntry; + +/* Context for key uniqueness check in builder functions */ +typedef struct JsonUniqueBuilderState +{ + JsonUniqueCheckState check; /* unique check */ + StringInfoData skipped_keys; /* skipped keys with NULL values */ + MemoryContext mcxt; /* context for saving skipped keys */ +} JsonUniqueBuilderState; + +/* Element of object stack for key uniqueness check during json parsing */ +typedef struct JsonUniqueStackEntry +{ + struct JsonUniqueStackEntry *parent; + int object_id; +} JsonUniqueStackEntry; + +/* State for key uniqueness check during json parsing */ +typedef struct JsonUniqueParsingState +{ + JsonLexContext *lex; + JsonUniqueCheckState check; + JsonUniqueStackEntry *stack; + int id_counter; + bool unique; +} JsonUniqueParsingState; + typedef struct JsonAggState { StringInfo str; @@ -49,6 +87,7 @@ typedef struct JsonAggState Oid key_output_func; JsonTypeCategory val_category; Oid val_output_func; + JsonUniqueBuilderState unique_check; } JsonAggState; static void composite_to_json(Datum composite, StringInfo result, @@ -722,6 +761,38 @@ row_to_json_pretty(PG_FUNCTION_ARGS) PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len)); } +bool +to_json_is_immutable(Oid typoid) +{ + JsonTypeCategory tcategory; + Oid outfuncoid; + + json_categorize_type(typoid, &tcategory, &outfuncoid); + + switch (tcategory) + { + case JSONTYPE_BOOL: + case JSONTYPE_JSON: + return true; + + case JSONTYPE_DATE: + case JSONTYPE_TIMESTAMP: + case JSONTYPE_TIMESTAMPTZ: + return false; + + case JSONTYPE_ARRAY: + return false; /* TODO recurse into elements */ + + case JSONTYPE_COMPOSITE: + return false; /* TODO recurse into fields */ + + case JSONTYPE_NUMERIC: + case JSONTYPE_CAST: + default: + return func_volatile(outfuncoid) == PROVOLATILE_IMMUTABLE; + } +} + /* * SQL function to_json(anyvalue) */ @@ -754,8 +825,8 @@ to_json(PG_FUNCTION_ARGS) * * aggregate input column as a json array value. */ -Datum -json_agg_transfn(PG_FUNCTION_ARGS) +static Datum +json_agg_transfn_worker(FunctionCallInfo fcinfo, bool absent_on_null) { MemoryContext aggcontext, oldcontext; @@ -795,9 +866,14 @@ json_agg_transfn(PG_FUNCTION_ARGS) else { state = (JsonAggState *) PG_GETARG_POINTER(0); - appendStringInfoString(state->str, ", "); } + if (absent_on_null && PG_ARGISNULL(1)) + PG_RETURN_POINTER(state); + + if (state->str->len > 1) + appendStringInfoString(state->str, ", "); + /* fast path for NULLs */ if (PG_ARGISNULL(1)) { @@ -809,7 +885,7 @@ json_agg_transfn(PG_FUNCTION_ARGS) val = PG_GETARG_DATUM(1); /* add some whitespace if structured type and not first item */ - if (!PG_ARGISNULL(0) && + if (!PG_ARGISNULL(0) && state->str->len > 1 && (state->val_category == JSONTYPE_ARRAY || state->val_category == JSONTYPE_COMPOSITE)) { @@ -827,6 +903,25 @@ json_agg_transfn(PG_FUNCTION_ARGS) PG_RETURN_POINTER(state); } + +/* + * json_agg aggregate function + */ +Datum +json_agg_transfn(PG_FUNCTION_ARGS) +{ + return json_agg_transfn_worker(fcinfo, false); +} + +/* + * json_agg_strict aggregate function + */ +Datum +json_agg_strict_transfn(PG_FUNCTION_ARGS) +{ + return json_agg_transfn_worker(fcinfo, true); +} + /* * json_agg final function */ @@ -850,18 +945,122 @@ json_agg_finalfn(PG_FUNCTION_ARGS) PG_RETURN_TEXT_P(catenate_stringinfo_string(state->str, "]")); } +/* Functions implementing hash table for key uniqueness check */ +static uint32 +json_unique_hash(const void *key, Size keysize) +{ + const JsonUniqueHashEntry *entry = (JsonUniqueHashEntry *) key; + uint32 hash = hash_bytes_uint32(entry->object_id); + + hash ^= hash_bytes((const unsigned char *) entry->key, entry->key_len); + + return DatumGetUInt32(hash); +} + +static int +json_unique_hash_match(const void *key1, const void *key2, Size keysize) +{ + const JsonUniqueHashEntry *entry1 = (const JsonUniqueHashEntry *) key1; + const JsonUniqueHashEntry *entry2 = (const JsonUniqueHashEntry *) key2; + + if (entry1->object_id != entry2->object_id) + return entry1->object_id > entry2->object_id ? 1 : -1; + + if (entry1->key_len != entry2->key_len) + return entry1->key_len > entry2->key_len ? 1 : -1; + + return strncmp(entry1->key, entry2->key, entry1->key_len); +} + +/* Functions implementing object key uniqueness check */ +static void +json_unique_check_init(JsonUniqueCheckState *cxt) +{ + HASHCTL ctl; + + memset(&ctl, 0, sizeof(ctl)); + ctl.keysize = sizeof(JsonUniqueHashEntry); + ctl.entrysize = sizeof(JsonUniqueHashEntry); + ctl.hcxt = CurrentMemoryContext; + ctl.hash = json_unique_hash; + ctl.match = json_unique_hash_match; + + *cxt = hash_create("json object hashtable", + 32, + &ctl, + HASH_ELEM | HASH_CONTEXT | HASH_FUNCTION | HASH_COMPARE); +} + +static void +json_unique_check_free(JsonUniqueCheckState *cxt) +{ + hash_destroy(*cxt); +} + +static bool +json_unique_check_key(JsonUniqueCheckState *cxt, const char *key, int object_id) +{ + JsonUniqueHashEntry entry; + bool found; + + entry.key = key; + entry.key_len = strlen(key); + entry.object_id = object_id; + + (void) hash_search(*cxt, &entry, HASH_ENTER, &found); + + return !found; +} + +static void +json_unique_builder_init(JsonUniqueBuilderState *cxt) +{ + json_unique_check_init(&cxt->check); + cxt->mcxt = CurrentMemoryContext; + cxt->skipped_keys.data = NULL; +} + +static void +json_unique_builder_free(JsonUniqueBuilderState *cxt) +{ + json_unique_check_free(&cxt->check); + + if (cxt->skipped_keys.data) + pfree(cxt->skipped_keys.data); +} + +/* On-demand initialization of skipped_keys StringInfo structure */ +static StringInfo +json_unique_builder_get_skipped_keys(JsonUniqueBuilderState *cxt) +{ + StringInfo out = &cxt->skipped_keys; + + if (!out->data) + { + MemoryContext oldcxt = MemoryContextSwitchTo(cxt->mcxt); + initStringInfo(out); + MemoryContextSwitchTo(oldcxt); + } + + return out; +} + /* * json_object_agg transition function. * * aggregate two input columns as a single json object value. */ -Datum -json_object_agg_transfn(PG_FUNCTION_ARGS) +static Datum +json_object_agg_transfn_worker(FunctionCallInfo fcinfo, + bool absent_on_null, bool unique_keys) { MemoryContext aggcontext, oldcontext; JsonAggState *state; + StringInfo out; Datum arg; + bool skip; + int key_offset; if (!AggCheckCallContext(fcinfo, &aggcontext)) { @@ -882,6 +1081,10 @@ json_object_agg_transfn(PG_FUNCTION_ARGS) oldcontext = MemoryContextSwitchTo(aggcontext); state = (JsonAggState *) palloc(sizeof(JsonAggState)); state->str = makeStringInfo(); + if (unique_keys) + json_unique_builder_init(&state->unique_check); + else + memset(&state->unique_check, 0, sizeof(state->unique_check)); MemoryContextSwitchTo(oldcontext); arg_type = get_fn_expr_argtype(fcinfo->flinfo, 1); @@ -909,7 +1112,6 @@ json_object_agg_transfn(PG_FUNCTION_ARGS) else { state = (JsonAggState *) PG_GETARG_POINTER(0); - appendStringInfoString(state->str, ", "); } /* @@ -925,11 +1127,49 @@ json_object_agg_transfn(PG_FUNCTION_ARGS) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("field name must not be null"))); + /* Skip null values if absent_on_null */ + skip = absent_on_null && PG_ARGISNULL(2); + + if (skip) + { + /* If key uniqueness check is needed we must save skipped keys */ + if (!unique_keys) + PG_RETURN_POINTER(state); + + out = json_unique_builder_get_skipped_keys(&state->unique_check); + } + else + { + out = state->str; + + /* + * Append comma delimiter only if we have already outputted some fields + * after the initial string "{ ". + */ + if (out->len > 2) + appendStringInfoString(out, ", "); + } + arg = PG_GETARG_DATUM(1); - datum_to_json(arg, false, state->str, state->key_category, + key_offset = out->len; + + datum_to_json(arg, false, out, state->key_category, state->key_output_func, true); + if (unique_keys) + { + const char *key = &out->data[key_offset]; + + if (!json_unique_check_key(&state->unique_check.check, key, 0)) + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE), + errmsg("duplicate JSON key %s", key))); + + if (skip) + PG_RETURN_POINTER(state); + } + appendStringInfoString(state->str, " : "); if (PG_ARGISNULL(2)) @@ -943,6 +1183,42 @@ json_object_agg_transfn(PG_FUNCTION_ARGS) PG_RETURN_POINTER(state); } +/* + * json_object_agg aggregate function + */ +Datum +json_object_agg_transfn(PG_FUNCTION_ARGS) +{ + return json_object_agg_transfn_worker(fcinfo, false, false); +} + +/* + * json_object_agg_strict aggregate function + */ +Datum +json_object_agg_strict_transfn(PG_FUNCTION_ARGS) +{ + return json_object_agg_transfn_worker(fcinfo, true, false); +} + +/* + * json_object_agg_unique aggregate function + */ +Datum +json_object_agg_unique_transfn(PG_FUNCTION_ARGS) +{ + return json_object_agg_transfn_worker(fcinfo, false, true); +} + +/* + * json_object_agg_unique_strict aggregate function + */ +Datum +json_object_agg_unique_strict_transfn(PG_FUNCTION_ARGS) +{ + return json_object_agg_transfn_worker(fcinfo, true, true); +} + /* * json_object_agg final function. */ @@ -960,6 +1236,8 @@ json_object_agg_finalfn(PG_FUNCTION_ARGS) if (state == NULL) PG_RETURN_NULL(); + json_unique_builder_free(&state->unique_check); + /* Else return state with appropriate object terminator added */ PG_RETURN_TEXT_P(catenate_stringinfo_string(state->str, " }")); } @@ -984,25 +1262,14 @@ catenate_stringinfo_string(StringInfo buffer, const char *addon) return result; } -/* - * SQL function json_build_object(variadic "any") - */ Datum -json_build_object(PG_FUNCTION_ARGS) +json_build_object_worker(int nargs, Datum *args, bool *nulls, Oid *types, + bool absent_on_null, bool unique_keys) { - int nargs; int i; const char *sep = ""; StringInfo result; - Datum *args; - bool *nulls; - Oid *types; - - /* fetch argument values to build the object */ - nargs = extract_variadic_args(fcinfo, 0, false, &args, &types, &nulls); - - if (nargs < 0) - PG_RETURN_NULL(); + JsonUniqueBuilderState unique_check; if (nargs % 2 != 0) ereport(ERROR, @@ -1016,19 +1283,58 @@ json_build_object(PG_FUNCTION_ARGS) appendStringInfoChar(result, '{'); + if (unique_keys) + json_unique_builder_init(&unique_check); + for (i = 0; i < nargs; i += 2) { - appendStringInfoString(result, sep); - sep = ", "; + StringInfo out; + bool skip; + int key_offset; + + /* Skip null values if absent_on_null */ + skip = absent_on_null && nulls[i + 1]; + + if (skip) + { + /* If key uniqueness check is needed we must save skipped keys */ + if (!unique_keys) + continue; + + out = json_unique_builder_get_skipped_keys(&unique_check); + } + else + { + appendStringInfoString(result, sep); + sep = ", "; + out = result; + } /* process key */ if (nulls[i]) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("argument %d cannot be null", i + 1), + errmsg("argument %d cannot be null", i + 1), errhint("Object keys should be text."))); - add_json(args[i], false, result, types[i], true); + /* save key offset before key appending */ + key_offset = out->len; + + add_json(args[i], false, out, types[i], true); + + if (unique_keys) + { + /* check key uniqueness after key appending */ + const char *key = &out->data[key_offset]; + + if (!json_unique_check_key(&unique_check.check, key, 0)) + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE), + errmsg("duplicate JSON key %s", key))); + + if (skip) + continue; + } appendStringInfoString(result, " : "); @@ -1038,7 +1344,29 @@ json_build_object(PG_FUNCTION_ARGS) appendStringInfoChar(result, '}'); - PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len)); + if (unique_keys) + json_unique_builder_free(&unique_check); + + return PointerGetDatum(cstring_to_text_with_len(result->data, result->len)); +} + +/* + * SQL function json_build_object(variadic "any") + */ +Datum +json_build_object(PG_FUNCTION_ARGS) +{ + Datum *args; + bool *nulls; + Oid *types; + /* build argument values to build the object */ + int nargs = extract_variadic_args(fcinfo, 0, true, + &args, &types, &nulls); + + if (nargs < 0) + PG_RETURN_NULL(); + + PG_RETURN_DATUM(json_build_object_worker(nargs, args, nulls, types, false, false)); } /* @@ -1050,25 +1378,13 @@ json_build_object_noargs(PG_FUNCTION_ARGS) PG_RETURN_TEXT_P(cstring_to_text_with_len("{}", 2)); } -/* - * SQL function json_build_array(variadic "any") - */ Datum -json_build_array(PG_FUNCTION_ARGS) +json_build_array_worker(int nargs, Datum *args, bool *nulls, Oid *types, + bool absent_on_null) { - int nargs; int i; const char *sep = ""; StringInfo result; - Datum *args; - bool *nulls; - Oid *types; - - /* fetch argument values to build the array */ - nargs = extract_variadic_args(fcinfo, 0, false, &args, &types, &nulls); - - if (nargs < 0) - PG_RETURN_NULL(); result = makeStringInfo(); @@ -1076,6 +1392,9 @@ json_build_array(PG_FUNCTION_ARGS) for (i = 0; i < nargs; i++) { + if (absent_on_null && nulls[i]) + continue; + appendStringInfoString(result, sep); sep = ", "; add_json(args[i], nulls[i], result, types[i], false); @@ -1083,7 +1402,26 @@ json_build_array(PG_FUNCTION_ARGS) appendStringInfoChar(result, ']'); - PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len)); + return PointerGetDatum(cstring_to_text_with_len(result->data, result->len)); +} + +/* + * SQL function json_build_array(variadic "any") + */ +Datum +json_build_array(PG_FUNCTION_ARGS) +{ + Datum *args; + bool *nulls; + Oid *types; + /* build argument values to build the object */ + int nargs = extract_variadic_args(fcinfo, 0, true, + &args, &types, &nulls); + + if (nargs < 0) + PG_RETURN_NULL(); + + PG_RETURN_DATUM(json_build_array_worker(nargs, args, nulls, types, false)); } /* diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c index f5f40a94bd..a103cbc7c6 100644 --- a/src/backend/utils/adt/jsonb.c +++ b/src/backend/utils/adt/jsonb.c @@ -14,6 +14,7 @@ #include "access/htup_details.h" #include "access/transam.h" +#include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "libpq/pqformat.h" @@ -1126,6 +1127,39 @@ add_jsonb(Datum val, bool is_null, JsonbInState *result, datum_to_jsonb(val, is_null, result, tcategory, outfuncoid, key_scalar); } +bool +to_jsonb_is_immutable(Oid typoid) +{ + JsonbTypeCategory tcategory; + Oid outfuncoid; + + jsonb_categorize_type(typoid, &tcategory, &outfuncoid); + + switch (tcategory) + { + case JSONBTYPE_BOOL: + case JSONBTYPE_JSON: + case JSONBTYPE_JSONB: + return true; + + case JSONBTYPE_DATE: + case JSONBTYPE_TIMESTAMP: + case JSONBTYPE_TIMESTAMPTZ: + return false; + + case JSONBTYPE_ARRAY: + return false; /* TODO recurse into elements */ + + case JSONBTYPE_COMPOSITE: + return false; /* TODO recurse into fields */ + + case JSONBTYPE_NUMERIC: + case JSONBTYPE_JSONCAST: + default: + return func_volatile(outfuncoid) == PROVOLATILE_IMMUTABLE; + } +} + /* * SQL function to_jsonb(anyvalue) */ @@ -1153,24 +1187,12 @@ to_jsonb(PG_FUNCTION_ARGS) PG_RETURN_POINTER(JsonbValueToJsonb(result.res)); } -/* - * SQL function jsonb_build_object(variadic "any") - */ Datum -jsonb_build_object(PG_FUNCTION_ARGS) +jsonb_build_object_worker(int nargs, Datum *args, bool *nulls, Oid *types, + bool absent_on_null, bool unique_keys) { - int nargs; int i; JsonbInState result; - Datum *args; - bool *nulls; - Oid *types; - - /* build argument values to build the object */ - nargs = extract_variadic_args(fcinfo, 0, true, &args, &types, &nulls); - - if (nargs < 0) - PG_RETURN_NULL(); if (nargs % 2 != 0) ereport(ERROR, @@ -1183,15 +1205,26 @@ jsonb_build_object(PG_FUNCTION_ARGS) memset(&result, 0, sizeof(JsonbInState)); result.res = pushJsonbValue(&result.parseState, WJB_BEGIN_OBJECT, NULL); + result.parseState->unique_keys = unique_keys; + result.parseState->skip_nulls = absent_on_null; for (i = 0; i < nargs; i += 2) { /* process key */ + bool skip; + if (nulls[i]) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("argument %d: key must not be null", i + 1))); + /* skip null values if absent_on_null */ + skip = absent_on_null && nulls[i + 1]; + + /* we need to save skipped keys for the key uniqueness check */ + if (skip && !unique_keys) + continue; + add_jsonb(args[i], false, &result, types[i], true); /* process value */ @@ -1200,7 +1233,26 @@ jsonb_build_object(PG_FUNCTION_ARGS) result.res = pushJsonbValue(&result.parseState, WJB_END_OBJECT, NULL); - PG_RETURN_POINTER(JsonbValueToJsonb(result.res)); + return JsonbPGetDatum(JsonbValueToJsonb(result.res)); +} + +/* + * SQL function jsonb_build_object(variadic "any") + */ +Datum +jsonb_build_object(PG_FUNCTION_ARGS) +{ + Datum *args; + bool *nulls; + Oid *types; + /* build argument values to build the object */ + int nargs = extract_variadic_args(fcinfo, 0, true, + &args, &types, &nulls); + + if (nargs < 0) + PG_RETURN_NULL(); + + PG_RETURN_DATUM(jsonb_build_object_worker(nargs, args, nulls, types, false, false)); } /* @@ -1219,37 +1271,50 @@ jsonb_build_object_noargs(PG_FUNCTION_ARGS) PG_RETURN_POINTER(JsonbValueToJsonb(result.res)); } -/* - * SQL function jsonb_build_array(variadic "any") - */ Datum -jsonb_build_array(PG_FUNCTION_ARGS) +jsonb_build_array_worker(int nargs, Datum *args, bool *nulls, Oid *types, + bool absent_on_null) { - int nargs; int i; JsonbInState result; - Datum *args; - bool *nulls; - Oid *types; - - /* build argument values to build the array */ - nargs = extract_variadic_args(fcinfo, 0, true, &args, &types, &nulls); - - if (nargs < 0) - PG_RETURN_NULL(); memset(&result, 0, sizeof(JsonbInState)); result.res = pushJsonbValue(&result.parseState, WJB_BEGIN_ARRAY, NULL); for (i = 0; i < nargs; i++) + { + if (absent_on_null && nulls[i]) + continue; + add_jsonb(args[i], nulls[i], &result, types[i], false); + } result.res = pushJsonbValue(&result.parseState, WJB_END_ARRAY, NULL); - PG_RETURN_POINTER(JsonbValueToJsonb(result.res)); + return JsonbPGetDatum(JsonbValueToJsonb(result.res)); +} + +/* + * SQL function jsonb_build_array(variadic "any") + */ +Datum +jsonb_build_array(PG_FUNCTION_ARGS) +{ + Datum *args; + bool *nulls; + Oid *types; + /* build argument values to build the object */ + int nargs = extract_variadic_args(fcinfo, 0, true, + &args, &types, &nulls); + + if (nargs < 0) + PG_RETURN_NULL(); + + PG_RETURN_DATUM(jsonb_build_array_worker(nargs, args, nulls, types, false)); } + /* * degenerate case of jsonb_build_array where it gets 0 arguments. */ @@ -1490,6 +1555,8 @@ clone_parse_state(JsonbParseState *state) { ocursor->contVal = icursor->contVal; ocursor->size = icursor->size; + ocursor->unique_keys = icursor->unique_keys; + ocursor->skip_nulls = icursor->skip_nulls; icursor = icursor->next; if (icursor == NULL) break; @@ -1501,12 +1568,8 @@ clone_parse_state(JsonbParseState *state) return result; } - -/* - * jsonb_agg aggregate function - */ -Datum -jsonb_agg_transfn(PG_FUNCTION_ARGS) +static Datum +jsonb_agg_transfn_worker(FunctionCallInfo fcinfo, bool absent_on_null) { MemoryContext oldcontext, aggcontext; @@ -1554,6 +1617,9 @@ jsonb_agg_transfn(PG_FUNCTION_ARGS) result = state->res; } + if (absent_on_null && PG_ARGISNULL(1)) + PG_RETURN_POINTER(state); + /* turn the argument into jsonb in the normal function context */ val = PG_ARGISNULL(1) ? (Datum) 0 : PG_GETARG_DATUM(1); @@ -1623,6 +1689,24 @@ jsonb_agg_transfn(PG_FUNCTION_ARGS) PG_RETURN_POINTER(state); } +/* + * jsonb_agg aggregate function + */ +Datum +jsonb_agg_transfn(PG_FUNCTION_ARGS) +{ + return jsonb_agg_transfn_worker(fcinfo, false); +} + +/* + * jsonb_agg_strict aggregate function + */ +Datum +jsonb_agg_strict_transfn(PG_FUNCTION_ARGS) +{ + return jsonb_agg_transfn_worker(fcinfo, true); +} + Datum jsonb_agg_finalfn(PG_FUNCTION_ARGS) { @@ -1655,11 +1739,9 @@ jsonb_agg_finalfn(PG_FUNCTION_ARGS) PG_RETURN_POINTER(out); } -/* - * jsonb_object_agg aggregate function - */ -Datum -jsonb_object_agg_transfn(PG_FUNCTION_ARGS) +static Datum +jsonb_object_agg_transfn_worker(FunctionCallInfo fcinfo, + bool absent_on_null, bool unique_keys) { MemoryContext oldcontext, aggcontext; @@ -1673,6 +1755,7 @@ jsonb_object_agg_transfn(PG_FUNCTION_ARGS) *jbval; JsonbValue v; JsonbIteratorToken type; + bool skip; if (!AggCheckCallContext(fcinfo, &aggcontext)) { @@ -1692,6 +1775,9 @@ jsonb_object_agg_transfn(PG_FUNCTION_ARGS) state->res = result; result->res = pushJsonbValue(&result->parseState, WJB_BEGIN_OBJECT, NULL); + result->parseState->unique_keys = unique_keys; + result->parseState->skip_nulls = absent_on_null; + MemoryContextSwitchTo(oldcontext); arg_type = get_fn_expr_argtype(fcinfo->flinfo, 1); @@ -1727,6 +1813,15 @@ jsonb_object_agg_transfn(PG_FUNCTION_ARGS) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("field name must not be null"))); + /* + * Skip null values if absent_on_null unless key uniqueness check is + * needed (because we must save keys in this case). + */ + skip = absent_on_null && PG_ARGISNULL(2); + + if (skip && !unique_keys) + PG_RETURN_POINTER(state); + val = PG_GETARG_DATUM(1); memset(&elem, 0, sizeof(JsonbInState)); @@ -1782,6 +1877,16 @@ jsonb_object_agg_transfn(PG_FUNCTION_ARGS) } result->res = pushJsonbValue(&result->parseState, WJB_KEY, &v); + + if (skip) + { + v.type = jbvNull; + result->res = pushJsonbValue(&result->parseState, + WJB_VALUE, &v); + MemoryContextSwitchTo(oldcontext); + PG_RETURN_POINTER(state); + } + break; case WJB_END_ARRAY: break; @@ -1854,6 +1959,43 @@ jsonb_object_agg_transfn(PG_FUNCTION_ARGS) PG_RETURN_POINTER(state); } +/* + * jsonb_object_agg aggregate function + */ +Datum +jsonb_object_agg_transfn(PG_FUNCTION_ARGS) +{ + return jsonb_object_agg_transfn_worker(fcinfo, false, false); +} + + +/* + * jsonb_object_agg_strict aggregate function + */ +Datum +jsonb_object_agg_strict_transfn(PG_FUNCTION_ARGS) +{ + return jsonb_object_agg_transfn_worker(fcinfo, true, false); +} + +/* + * jsonb_object_agg_unique aggregate function + */ +Datum +jsonb_object_agg_unique_transfn(PG_FUNCTION_ARGS) +{ + return jsonb_object_agg_transfn_worker(fcinfo, false, true); +} + +/* + * jsonb_object_agg_unique_strict aggregate function + */ +Datum +jsonb_object_agg_unique_strict_transfn(PG_FUNCTION_ARGS) +{ + return jsonb_object_agg_transfn_worker(fcinfo, true, true); +} + Datum jsonb_object_agg_finalfn(PG_FUNCTION_ARGS) { diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c index 60442758b3..aa151a53d6 100644 --- a/src/backend/utils/adt/jsonb_util.c +++ b/src/backend/utils/adt/jsonb_util.c @@ -64,7 +64,8 @@ static int lengthCompareJsonbStringValue(const void *a, const void *b); static int lengthCompareJsonbString(const char *val1, int len1, const char *val2, int len2); static int lengthCompareJsonbPair(const void *a, const void *b, void *arg); -static void uniqueifyJsonbObject(JsonbValue *object); +static void uniqueifyJsonbObject(JsonbValue *object, bool unique_keys, + bool skip_nulls); static JsonbValue *pushJsonbValueScalar(JsonbParseState **pstate, JsonbIteratorToken seq, JsonbValue *scalarVal); @@ -689,7 +690,9 @@ pushJsonbValueScalar(JsonbParseState **pstate, JsonbIteratorToken seq, appendElement(*pstate, scalarVal); break; case WJB_END_OBJECT: - uniqueifyJsonbObject(&(*pstate)->contVal); + uniqueifyJsonbObject(&(*pstate)->contVal, + (*pstate)->unique_keys, + (*pstate)->skip_nulls); /* fall through! */ case WJB_END_ARRAY: /* Steps here common to WJB_END_OBJECT case */ @@ -732,6 +735,9 @@ pushState(JsonbParseState **pstate) JsonbParseState *ns = palloc(sizeof(JsonbParseState)); ns->next = *pstate; + ns->unique_keys = false; + ns->skip_nulls = false; + return ns; } @@ -1936,7 +1942,7 @@ lengthCompareJsonbPair(const void *a, const void *b, void *binequal) * Sort and unique-ify pairs in JsonbValue object */ static void -uniqueifyJsonbObject(JsonbValue *object) +uniqueifyJsonbObject(JsonbValue *object, bool unique_keys, bool skip_nulls) { bool hasNonUniq = false; @@ -1946,15 +1952,21 @@ uniqueifyJsonbObject(JsonbValue *object) qsort_arg(object->val.object.pairs, object->val.object.nPairs, sizeof(JsonbPair), lengthCompareJsonbPair, &hasNonUniq); - if (hasNonUniq) + if (hasNonUniq && unique_keys) + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE), + errmsg("duplicate JSON object key value"))); + + if (hasNonUniq || skip_nulls) { JsonbPair *ptr = object->val.object.pairs + 1, *res = object->val.object.pairs; while (ptr - object->val.object.pairs < object->val.object.nPairs) { - /* Avoid copying over duplicate */ - if (lengthCompareJsonbStringValue(ptr, res) != 0) + /* Avoid copying over duplicate or null */ + if (lengthCompareJsonbStringValue(ptr, res) != 0 && + (!skip_nulls || ptr->value.type != jbvNull)) { res++; if (ptr != res) diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index c7860a7580..6db6c008dd 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -457,6 +457,12 @@ static void get_coercion_expr(Node *arg, deparse_context *context, Node *parentNode); static void get_const_expr(Const *constval, deparse_context *context, int showtype); +static void get_json_constructor(JsonConstructorExpr *ctor, + deparse_context *context, bool showimplicit); +static void get_json_agg_constructor(JsonConstructorExpr *ctor, + deparse_context *context, + const char *funcname, + bool is_json_objectagg); static void get_const_collation(Const *constval, deparse_context *context); static void simple_quote_literal(StringInfo buf, const char *val); static void get_sublink_expr(SubLink *sublink, deparse_context *context); @@ -6245,7 +6251,8 @@ get_rule_sortgroupclause(Index ref, List *tlist, bool force_colno, bool need_paren = (PRETTY_PAREN(context) || IsA(expr, FuncExpr) || IsA(expr, Aggref) - || IsA(expr, WindowFunc)); + || IsA(expr, WindowFunc) + || IsA(expr, JsonConstructorExpr)); if (need_paren) appendStringInfoChar(context->buf, '('); @@ -8093,6 +8100,7 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags) case T_GroupingFunc: case T_WindowFunc: case T_FuncExpr: + case T_JsonConstructorExpr: /* function-like: name(..) or name[..] */ return true; @@ -8380,12 +8388,12 @@ get_rule_expr_paren(Node *node, deparse_context *context, * get_json_format - Parse back a JsonFormat node */ static void -get_json_format(JsonFormat *format, deparse_context *context) +get_json_format(JsonFormat *format, StringInfo buf) { if (format->format_type == JS_FORMAT_DEFAULT) return; - appendStringInfoString(context->buf, + appendStringInfoString(buf, format->format_type == JS_FORMAT_JSONB ? " FORMAT JSONB" : " FORMAT JSON"); @@ -8395,7 +8403,7 @@ get_json_format(JsonFormat *format, deparse_context *context) format->encoding == JS_ENC_UTF16 ? "UTF16" : format->encoding == JS_ENC_UTF32 ? "UTF32" : "UTF8"; - appendStringInfo(context->buf, " ENCODING %s", encoding); + appendStringInfo(buf, " ENCODING %s", encoding); } } @@ -8403,20 +8411,20 @@ get_json_format(JsonFormat *format, deparse_context *context) * get_json_returning - Parse back a JsonReturning structure */ static void -get_json_returning(JsonReturning *returning, deparse_context *context, +get_json_returning(JsonReturning *returning, StringInfo buf, bool json_format_by_default) { if (!OidIsValid(returning->typid)) return; - appendStringInfo(context->buf, " RETURNING %s", + appendStringInfo(buf, " RETURNING %s", format_type_with_typemod(returning->typid, returning->typmod)); if (!json_format_by_default || returning->format->format_type != (returning->typid == JSONBOID ? JS_FORMAT_JSONB : JS_FORMAT_JSON)) - get_json_format(returning->format, context); + get_json_format(returning->format, buf); } /* ---------- @@ -9583,10 +9591,14 @@ get_rule_expr(Node *node, deparse_context *context, JsonValueExpr *jve = (JsonValueExpr *) node; get_rule_expr((Node *) jve->raw_expr, context, false); - get_json_format(jve->format, context); + get_json_format(jve->format, context->buf); } break; + case T_JsonConstructorExpr: + get_json_constructor((JsonConstructorExpr *) node, context, false); + break; + case T_List: { char *sep; @@ -9855,17 +9867,89 @@ get_func_expr(FuncExpr *expr, deparse_context *context, appendStringInfoChar(buf, ')'); } +static void +get_json_constructor_options(JsonConstructorExpr *ctor, StringInfo buf) +{ + if (ctor->absent_on_null) + { + if (ctor->type == JSCTOR_JSON_OBJECT || + ctor->type == JSCTOR_JSON_OBJECTAGG) + appendStringInfoString(buf, " ABSENT ON NULL"); + } + else + { + if (ctor->type == JSCTOR_JSON_ARRAY || + ctor->type == JSCTOR_JSON_ARRAYAGG) + appendStringInfoString(buf, " NULL ON NULL"); + } + + if (ctor->unique) + appendStringInfoString(buf, " WITH UNIQUE KEYS"); + + get_json_returning(ctor->returning, buf, true); +} + +static void +get_json_constructor(JsonConstructorExpr *ctor, deparse_context *context, + bool showimplicit) +{ + StringInfo buf = context->buf; + const char *funcname; + int nargs; + ListCell *lc; + + switch (ctor->type) + { + case JSCTOR_JSON_OBJECT: + funcname = "JSON_OBJECT"; + break; + case JSCTOR_JSON_ARRAY: + funcname = "JSON_ARRAY"; + break; + case JSCTOR_JSON_OBJECTAGG: + return get_json_agg_constructor(ctor, context, "JSON_OBJECTAGG", true); + case JSCTOR_JSON_ARRAYAGG: + return get_json_agg_constructor(ctor, context, "JSON_ARRAYAGG", false); + default: + elog(ERROR, "invalid JsonConstructorExprType %d", ctor->type); + } + + appendStringInfo(buf, "%s(", funcname); + + nargs = 0; + foreach(lc, ctor->args) + { + if (nargs > 0) + { + const char *sep = ctor->type == JSCTOR_JSON_OBJECT && + (nargs % 2) != 0 ? " : " : ", "; + + appendStringInfoString(buf, sep); + } + + get_rule_expr((Node *) lfirst(lc), context, true); + + nargs++; + } + + get_json_constructor_options(ctor, buf); + + appendStringInfo(buf, ")"); +} + + /* - * get_agg_expr - Parse back an Aggref node + * get_agg_expr_helper - Parse back an Aggref node */ static void -get_agg_expr(Aggref *aggref, deparse_context *context, - Aggref *original_aggref) +get_agg_expr_helper(Aggref *aggref, deparse_context *context, + Aggref *original_aggref, const char *funcname, + const char *options, bool is_json_objectagg) { StringInfo buf = context->buf; Oid argtypes[FUNC_MAX_ARGS]; int nargs; - bool use_variadic; + bool use_variadic = false; /* * For a combining aggregate, we look up and deparse the corresponding @@ -9895,13 +9979,14 @@ get_agg_expr(Aggref *aggref, deparse_context *context, /* Extract the argument types as seen by the parser */ nargs = get_aggregate_argtypes(aggref, argtypes); + if (!funcname) + funcname = generate_function_name(aggref->aggfnoid, nargs, NIL, + argtypes, aggref->aggvariadic, + &use_variadic, + context->special_exprkind); + /* Print the aggregate name, schema-qualified if needed */ - appendStringInfo(buf, "%s(%s", - generate_function_name(aggref->aggfnoid, nargs, - NIL, argtypes, - aggref->aggvariadic, - &use_variadic, - context->special_exprkind), + appendStringInfo(buf, "%s(%s", funcname, (aggref->aggdistinct != NIL) ? "DISTINCT " : ""); if (AGGKIND_IS_ORDERED_SET(aggref->aggkind)) @@ -9937,7 +10022,17 @@ get_agg_expr(Aggref *aggref, deparse_context *context, if (tle->resjunk) continue; if (i++ > 0) - appendStringInfoString(buf, ", "); + { + if (is_json_objectagg) + { + if (i > 2) + break; /* skip ABSENT ON NULL and WITH UNIQUE args */ + + appendStringInfoString(buf, " : "); + } + else + appendStringInfoString(buf, ", "); + } if (use_variadic && i == nargs) appendStringInfoString(buf, "VARIADIC "); get_rule_expr(arg, context, true); @@ -9951,6 +10046,9 @@ get_agg_expr(Aggref *aggref, deparse_context *context, } } + if (options) + appendStringInfoString(buf, options); + if (aggref->aggfilter != NULL) { appendStringInfoString(buf, ") FILTER (WHERE "); @@ -9960,6 +10058,16 @@ get_agg_expr(Aggref *aggref, deparse_context *context, appendStringInfoChar(buf, ')'); } +/* + * get_agg_expr - Parse back an Aggref node + */ +static void +get_agg_expr(Aggref *aggref, deparse_context *context, Aggref *original_aggref) +{ + return get_agg_expr_helper(aggref, context, original_aggref, NULL, NULL, + false); +} + /* * This is a helper function for get_agg_expr(). It's used when we deparse * a combining Aggref; resolve_special_varno locates the corresponding partial @@ -9979,10 +10087,12 @@ get_agg_combine_expr(Node *node, deparse_context *context, void *callback_arg) } /* - * get_windowfunc_expr - Parse back a WindowFunc node + * get_windowfunc_expr_helper - Parse back a WindowFunc node */ static void -get_windowfunc_expr(WindowFunc *wfunc, deparse_context *context) +get_windowfunc_expr_helper(WindowFunc *wfunc, deparse_context *context, + const char *funcname, const char *options, + bool is_json_objectagg) { StringInfo buf = context->buf; Oid argtypes[FUNC_MAX_ARGS]; @@ -10006,16 +10116,30 @@ get_windowfunc_expr(WindowFunc *wfunc, deparse_context *context) nargs++; } - appendStringInfo(buf, "%s(", - generate_function_name(wfunc->winfnoid, nargs, - argnames, argtypes, - false, NULL, - context->special_exprkind)); + if (!funcname) + funcname = generate_function_name(wfunc->winfnoid, nargs, argnames, + argtypes, false, NULL, + context->special_exprkind); + + appendStringInfo(buf, "%s(", funcname); + /* winstar can be set only in zero-argument aggregates */ if (wfunc->winstar) appendStringInfoChar(buf, '*'); else - get_rule_expr((Node *) wfunc->args, context, true); + { + if (is_json_objectagg) + { + get_rule_expr((Node *) linitial(wfunc->args), context, false); + appendStringInfoString(buf, " : "); + get_rule_expr((Node *) lsecond(wfunc->args), context, false); + } + else + get_rule_expr((Node *) wfunc->args, context, true); + } + + if (options) + appendStringInfoString(buf, options); if (wfunc->aggfilter != NULL) { @@ -10052,6 +10176,15 @@ get_windowfunc_expr(WindowFunc *wfunc, deparse_context *context) } } +/* + * get_windowfunc_expr - Parse back a WindowFunc node + */ +static void +get_windowfunc_expr(WindowFunc *wfunc, deparse_context *context) +{ + return get_windowfunc_expr_helper(wfunc, context, NULL, NULL, false); +} + /* * get_func_sql_syntax - Parse back a SQL-syntax function call * @@ -10292,6 +10425,31 @@ get_func_sql_syntax(FuncExpr *expr, deparse_context *context) return false; } +/* + * get_json_agg_constructor - Parse back an aggregate JsonConstructorExpr node + */ +static void +get_json_agg_constructor(JsonConstructorExpr *ctor, deparse_context *context, + const char *funcname, bool is_json_objectagg) +{ + StringInfoData options; + + initStringInfo(&options); + get_json_constructor_options(ctor, &options); + + if (IsA(ctor->func, Aggref)) + return get_agg_expr_helper((Aggref *) ctor->func, context, + (Aggref *) ctor->func, + funcname, options.data, is_json_objectagg); + else if (IsA(ctor->func, WindowFunc)) + return get_windowfunc_expr_helper((WindowFunc *) ctor->func, context, + funcname, options.data, + is_json_objectagg); + else + elog(ERROR, "invalid JsonConstructorExpr underlying node type: %d", + nodeTag(ctor->func)); +} + /* ---------- * get_coercion_expr * diff --git a/src/backend/utils/misc/queryjumble.c b/src/backend/utils/misc/queryjumble.c index 84435420e4..d14b751058 100644 --- a/src/backend/utils/misc/queryjumble.c +++ b/src/backend/utils/misc/queryjumble.c @@ -763,6 +763,18 @@ JumbleExpr(JumbleState *jstate, Node *node) JumbleExpr(jstate, (Node *) expr->format); } break; + case T_JsonConstructorExpr: + { + JsonConstructorExpr *ctor = (JsonConstructorExpr *) node; + + JumbleExpr(jstate, (Node *) ctor->func); + JumbleExpr(jstate, (Node *) ctor->coercion); + JumbleExpr(jstate, (Node *) ctor->returning); + APP_JUMB(ctor->type); + APP_JUMB(ctor->unique); + APP_JUMB(ctor->absent_on_null); + } + break; case T_List: foreach(temp, (List *) node) { diff --git a/src/include/catalog/pg_aggregate.dat b/src/include/catalog/pg_aggregate.dat index 2843f4b415..1934f19335 100644 --- a/src/include/catalog/pg_aggregate.dat +++ b/src/include/catalog/pg_aggregate.dat @@ -567,14 +567,36 @@ # json { aggfnoid => 'json_agg', aggtransfn => 'json_agg_transfn', aggfinalfn => 'json_agg_finalfn', aggtranstype => 'internal' }, +{ aggfnoid => 'json_agg_strict', aggtransfn => 'json_agg_strict_transfn', + aggfinalfn => 'json_agg_finalfn', aggtranstype => 'internal' }, { aggfnoid => 'json_object_agg', aggtransfn => 'json_object_agg_transfn', aggfinalfn => 'json_object_agg_finalfn', aggtranstype => 'internal' }, +{ aggfnoid => 'json_object_agg_unique', + aggtransfn => 'json_object_agg_unique_transfn', + aggfinalfn => 'json_object_agg_finalfn', aggtranstype => 'internal' }, +{ aggfnoid => 'json_object_agg_strict', + aggtransfn => 'json_object_agg_strict_transfn', + aggfinalfn => 'json_object_agg_finalfn', aggtranstype => 'internal' }, +{ aggfnoid => 'json_object_agg_unique_strict', + aggtransfn => 'json_object_agg_unique_strict_transfn', + aggfinalfn => 'json_object_agg_finalfn', aggtranstype => 'internal' }, # jsonb { aggfnoid => 'jsonb_agg', aggtransfn => 'jsonb_agg_transfn', aggfinalfn => 'jsonb_agg_finalfn', aggtranstype => 'internal' }, +{ aggfnoid => 'jsonb_agg_strict', aggtransfn => 'jsonb_agg_strict_transfn', + aggfinalfn => 'jsonb_agg_finalfn', aggtranstype => 'internal' }, { aggfnoid => 'jsonb_object_agg', aggtransfn => 'jsonb_object_agg_transfn', aggfinalfn => 'jsonb_object_agg_finalfn', aggtranstype => 'internal' }, +{ aggfnoid => 'jsonb_object_agg_unique', + aggtransfn => 'jsonb_object_agg_unique_transfn', + aggfinalfn => 'jsonb_object_agg_finalfn', aggtranstype => 'internal' }, +{ aggfnoid => 'jsonb_object_agg_strict', + aggtransfn => 'jsonb_object_agg_strict_transfn', + aggfinalfn => 'jsonb_object_agg_finalfn', aggtranstype => 'internal' }, +{ aggfnoid => 'jsonb_object_agg_unique_strict', + aggtransfn => 'jsonb_object_agg_unique_strict_transfn', + aggfinalfn => 'jsonb_object_agg_finalfn', aggtranstype => 'internal' }, # ordered-set and hypothetical-set aggregates { aggfnoid => 'percentile_disc(float8,anyelement)', aggkind => 'o', diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 699bd0aa3e..5e612a6b67 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -8737,6 +8737,10 @@ proname => 'json_agg_transfn', proisstrict => 'f', provolatile => 's', prorettype => 'internal', proargtypes => 'internal anyelement', prosrc => 'json_agg_transfn' }, +{ oid => '8173', descr => 'json aggregate transition function', + proname => 'json_agg_strict_transfn', proisstrict => 'f', provolatile => 's', + prorettype => 'internal', proargtypes => 'internal anyelement', + prosrc => 'json_agg_strict_transfn' }, { oid => '3174', descr => 'json aggregate final function', proname => 'json_agg_finalfn', proisstrict => 'f', prorettype => 'json', proargtypes => 'internal', prosrc => 'json_agg_finalfn' }, @@ -8744,10 +8748,26 @@ proname => 'json_agg', prokind => 'a', proisstrict => 'f', provolatile => 's', prorettype => 'json', proargtypes => 'anyelement', prosrc => 'aggregate_dummy' }, +{ oid => '8174', descr => 'aggregate input into json', + proname => 'json_agg_strict', prokind => 'a', proisstrict => 'f', + provolatile => 's', prorettype => 'json', proargtypes => 'anyelement', + prosrc => 'aggregate_dummy' }, { oid => '3180', descr => 'json object aggregate transition function', proname => 'json_object_agg_transfn', proisstrict => 'f', provolatile => 's', prorettype => 'internal', proargtypes => 'internal any any', prosrc => 'json_object_agg_transfn' }, +{ oid => '8175', descr => 'json object aggregate transition function', + proname => 'json_object_agg_strict_transfn', proisstrict => 'f', + provolatile => 's', prorettype => 'internal', proargtypes => 'internal any any', + prosrc => 'json_object_agg_strict_transfn' }, +{ oid => '8176', descr => 'json object aggregate transition function', + proname => 'json_object_agg_unique_transfn', proisstrict => 'f', + provolatile => 's', prorettype => 'internal', proargtypes => 'internal any any', + prosrc => 'json_object_agg_unique_transfn' }, +{ oid => '8177', descr => 'json object aggregate transition function', + proname => 'json_object_agg_unique_strict_transfn', proisstrict => 'f', + provolatile => 's', prorettype => 'internal', proargtypes => 'internal any any', + prosrc => 'json_object_agg_unique_strict_transfn' }, { oid => '3196', descr => 'json object aggregate final function', proname => 'json_object_agg_finalfn', proisstrict => 'f', prorettype => 'json', proargtypes => 'internal', @@ -8756,6 +8776,19 @@ proname => 'json_object_agg', prokind => 'a', proisstrict => 'f', provolatile => 's', prorettype => 'json', proargtypes => 'any any', prosrc => 'aggregate_dummy' }, +{ oid => '8178', descr => 'aggregate non-NULL input into a json object', + proname => 'json_object_agg_strict', prokind => 'a', proisstrict => 'f', + provolatile => 's', prorettype => 'json', proargtypes => 'any any', + prosrc => 'aggregate_dummy' }, +{ oid => '8179', descr => 'aggregate input into a json object with unique keys', + proname => 'json_object_agg_unique', prokind => 'a', proisstrict => 'f', + provolatile => 's', prorettype => 'json', proargtypes => 'any any', + prosrc => 'aggregate_dummy' }, +{ oid => '8180', + descr => 'aggregate non-NULL input into a json object with unique keys', + proname => 'json_object_agg_unique_strict', prokind => 'a', + proisstrict => 'f', provolatile => 's', prorettype => 'json', + proargtypes => 'any any', prosrc => 'aggregate_dummy' }, { oid => '3198', descr => 'build a json array from any inputs', proname => 'json_build_array', provariadic => 'any', proisstrict => 'f', provolatile => 's', prorettype => 'json', proargtypes => 'any', @@ -9628,6 +9661,10 @@ proname => 'jsonb_agg_transfn', proisstrict => 'f', provolatile => 's', prorettype => 'internal', proargtypes => 'internal anyelement', prosrc => 'jsonb_agg_transfn' }, +{ oid => '8181', descr => 'jsonb aggregate transition function', + proname => 'jsonb_agg_strict_transfn', proisstrict => 'f', provolatile => 's', + prorettype => 'internal', proargtypes => 'internal anyelement', + prosrc => 'jsonb_agg_strict_transfn' }, { oid => '3266', descr => 'jsonb aggregate final function', proname => 'jsonb_agg_finalfn', proisstrict => 'f', provolatile => 's', prorettype => 'jsonb', proargtypes => 'internal', @@ -9636,10 +9673,29 @@ proname => 'jsonb_agg', prokind => 'a', proisstrict => 'f', provolatile => 's', prorettype => 'jsonb', proargtypes => 'anyelement', prosrc => 'aggregate_dummy' }, +{ oid => '8182', descr => 'aggregate input into jsonb skipping nulls', + proname => 'jsonb_agg_strict', prokind => 'a', proisstrict => 'f', + provolatile => 's', prorettype => 'jsonb', proargtypes => 'anyelement', + prosrc => 'aggregate_dummy' }, { oid => '3268', descr => 'jsonb object aggregate transition function', proname => 'jsonb_object_agg_transfn', proisstrict => 'f', provolatile => 's', prorettype => 'internal', proargtypes => 'internal any any', prosrc => 'jsonb_object_agg_transfn' }, +{ oid => '8183', descr => 'jsonb object aggregate transition function', + proname => 'jsonb_object_agg_strict_transfn', proisstrict => 'f', + provolatile => 's', prorettype => 'internal', + proargtypes => 'internal any any', + prosrc => 'jsonb_object_agg_strict_transfn' }, +{ oid => '8184', descr => 'jsonb object aggregate transition function', + proname => 'jsonb_object_agg_unique_transfn', proisstrict => 'f', + provolatile => 's', prorettype => 'internal', + proargtypes => 'internal any any', + prosrc => 'jsonb_object_agg_unique_transfn' }, +{ oid => '8185', descr => 'jsonb object aggregate transition function', + proname => 'jsonb_object_agg_unique_strict_transfn', proisstrict => 'f', + provolatile => 's', prorettype => 'internal', + proargtypes => 'internal any any', + prosrc => 'jsonb_object_agg_unique_strict_transfn' }, { oid => '3269', descr => 'jsonb object aggregate final function', proname => 'jsonb_object_agg_finalfn', proisstrict => 'f', provolatile => 's', prorettype => 'jsonb', proargtypes => 'internal', @@ -9648,6 +9704,20 @@ proname => 'jsonb_object_agg', prokind => 'a', proisstrict => 'f', prorettype => 'jsonb', proargtypes => 'any any', prosrc => 'aggregate_dummy' }, +{ oid => '8186', descr => 'aggregate non-NULL inputs into jsonb object', + proname => 'jsonb_object_agg_strict', prokind => 'a', proisstrict => 'f', + prorettype => 'jsonb', proargtypes => 'any any', + prosrc => 'aggregate_dummy' }, +{ oid => '8187', + descr => 'aggregate inputs into jsonb object checking key uniqueness', + proname => 'jsonb_object_agg_unique', prokind => 'a', proisstrict => 'f', + prorettype => 'jsonb', proargtypes => 'any any', + prosrc => 'aggregate_dummy' }, +{ oid => '8188', + descr => 'aggregate non-NULL inputs into jsonb object checking key uniqueness', + proname => 'jsonb_object_agg_unique_strict', prokind => 'a', + proisstrict => 'f', prorettype => 'jsonb', proargtypes => 'any any', + prosrc => 'aggregate_dummy' }, { oid => '3271', descr => 'build a jsonb array from any inputs', proname => 'jsonb_build_array', provariadic => 'any', proisstrict => 'f', provolatile => 's', prorettype => 'jsonb', proargtypes => 'any', diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h index 56a89ebafb..c830fcf726 100644 --- a/src/include/executor/execExpr.h +++ b/src/include/executor/execExpr.h @@ -239,6 +239,7 @@ typedef enum ExprEvalOp EEOP_GROUPING_FUNC, EEOP_WINDOW_FUNC, EEOP_SUBPLAN, + EEOP_JSON_CONSTRUCTOR, /* aggregation related nodes */ EEOP_AGG_STRICT_DESERIALIZE, @@ -668,6 +669,17 @@ typedef struct ExprEvalStep int transno; int setoff; } agg_trans; + + /* for EEOP_JSON_CONSTRUCTOR */ + struct + { + JsonConstructorExpr *constructor; + Datum *arg_values; + bool *arg_nulls; + Oid *arg_types; + int nargs; + } json_constructor; + } d; } ExprEvalStep; @@ -769,6 +781,8 @@ extern void ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext); extern void ExecEvalSysVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext, TupleTableSlot *slot); +extern void ExecEvalJsonConstructor(ExprState *state, ExprEvalStep *op, + ExprContext *econtext); extern void ExecAggInitGroup(AggState *aggstate, AggStatePerTrans pertrans, AggStatePerGroup pergroup, ExprContext *aggcontext); diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h index ec8b71a685..e50b933288 100644 --- a/src/include/nodes/makefuncs.h +++ b/src/include/nodes/makefuncs.h @@ -109,6 +109,7 @@ extern VacuumRelation *makeVacuumRelation(RangeVar *relation, Oid oid, List *va_ extern JsonFormat *makeJsonFormat(JsonFormatType type, JsonEncoding encoding, int location); extern JsonValueExpr *makeJsonValueExpr(Expr *expr, JsonFormat *format); +extern Node *makeJsonKeyValue(Node *key, Node *value); extern JsonEncoding makeJsonEncoding(char *name); #endif /* MAKEFUNC_H */ diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index 59737f1034..05f0b79e82 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -204,6 +204,7 @@ typedef enum NodeTag T_JsonFormat, T_JsonReturning, T_JsonValueExpr, + T_JsonConstructorExpr, /* * TAGS FOR EXPRESSION STATE NODES (execnodes.h) @@ -494,6 +495,13 @@ typedef enum NodeTag T_VacuumRelation, T_PublicationObjSpec, T_PublicationTable, + T_JsonObjectConstructor, + T_JsonArrayConstructor, + T_JsonArrayQueryConstructor, + T_JsonAggConstructor, + T_JsonObjectAgg, + T_JsonArrayAgg, + T_JsonKeyValue, T_JsonOutput, /* diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index e06d43d4df..3b12a708ec 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1563,9 +1563,103 @@ typedef struct JsonOutput { NodeTag type; TypeName *typeName; /* RETURNING type name, if specified */ - JsonReturning returning; /* RETURNING FORMAT clause and type Oids */ + JsonReturning *returning; /* RETURNING FORMAT clause and type Oids */ } JsonOutput; +/* + * JsonKeyValue - + * untransformed representation of JSON object key-value pair for + * JSON_OBJECT() and JSON_OBJECTAGG() + */ +typedef struct JsonKeyValue +{ + NodeTag type; + Expr *key; /* key expression */ + JsonValueExpr *value; /* JSON value expression */ +} JsonKeyValue; + +/* + * JsonObjectConstructor - + * untransformed representation of JSON_OBJECT() constructor + */ +typedef struct JsonObjectConstructor +{ + NodeTag type; + List *exprs; /* list of JsonKeyValue pairs */ + JsonOutput *output; /* RETURNING clause, if specified */ + bool absent_on_null; /* skip NULL values? */ + bool unique; /* check key uniqueness? */ + int location; /* token location, or -1 if unknown */ +} JsonObjectConstructor; + +/* + * JsonArrayConstructor - + * untransformed representation of JSON_ARRAY(element,...) constructor + */ +typedef struct JsonArrayConstructor +{ + NodeTag type; + List *exprs; /* list of JsonValueExpr elements */ + JsonOutput *output; /* RETURNING clause, if specified */ + bool absent_on_null; /* skip NULL elements? */ + int location; /* token location, or -1 if unknown */ +} JsonArrayConstructor; + +/* + * JsonArrayQueryConstructor - + * untransformed representation of JSON_ARRAY(subquery) constructor + */ +typedef struct JsonArrayQueryConstructor +{ + NodeTag type; + Node *query; /* subquery */ + JsonOutput *output; /* RETURNING clause, if specified */ + JsonFormat *format; /* FORMAT clause for subquery, if specified */ + bool absent_on_null; /* skip NULL elements? */ + int location; /* token location, or -1 if unknown */ +} JsonArrayQueryConstructor; + +/* + * JsonAggConstructor - + * common fields of untransformed representation of + * JSON_ARRAYAGG() and JSON_OBJECTAGG() + */ +typedef struct JsonAggConstructor +{ + NodeTag type; + JsonOutput *output; /* RETURNING clause, if any */ + Node *agg_filter; /* FILTER clause, if any */ + List *agg_order; /* ORDER BY clause, if any */ + struct WindowDef *over; /* OVER clause, if any */ + int location; /* token location, or -1 if unknown */ +} JsonAggConstructor; + +/* + * JsonObjectAgg - + * untransformed representation of JSON_OBJECTAGG() + */ +typedef struct JsonObjectAgg +{ + NodeTag type; + JsonAggConstructor *constructor; /* common fields */ + JsonKeyValue *arg; /* object key-value pair */ + bool absent_on_null; /* skip NULL values? */ + bool unique; /* check key uniqueness? */ +} JsonObjectAgg; + +/* + * JsonArrayAgg - + * untransformed representation of JSON_ARRRAYAGG() + */ +typedef struct JsonArrayAgg +{ + NodeTag type; + JsonAggConstructor *constructor; /* common fields */ + JsonValueExpr *arg; /* array element expression */ + bool absent_on_null; /* skip NULL elements? */ +} JsonArrayAgg; + + /***************************************************************************** * Raw Grammar Output Statements *****************************************************************************/ diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index 8e3c99bdb5..c48527e998 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -1292,6 +1292,31 @@ typedef struct JsonValueExpr JsonFormat *format; /* FORMAT clause, if specified */ } JsonValueExpr; +typedef enum JsonConstructorType +{ + JSCTOR_JSON_OBJECT = 1, + JSCTOR_JSON_ARRAY = 2, + JSCTOR_JSON_OBJECTAGG = 3, + JSCTOR_JSON_ARRAYAGG = 4 +} JsonConstructorType; + +/* + * JsonConstructorExpr - + * wrapper over FuncExpr/Aggref/WindowFunc for SQL/JSON constructors + */ +typedef struct JsonConstructorExpr +{ + Expr xpr; + JsonConstructorType type; /* constructor type */ + List *args; + Expr *func; /* underlying json[b]_xxx() function call */ + Expr *coercion; /* coercion to RETURNING type */ + JsonReturning *returning; /* RETURNING clause */ + bool absent_on_null; /* ABSENT ON NULL? */ + bool unique; /* WITH UNIQUE KEYS? (JSON_OBJECT[AGG] only) */ + int location; +} JsonConstructorExpr; + /* ---------------- * NullTest * diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index f3502b8be4..f44440d4a9 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -26,6 +26,7 @@ /* name, value, category, is-bare-label */ PG_KEYWORD("abort", ABORT_P, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("absent", ABSENT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("absolute", ABSOLUTE_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("access", ACCESS, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("action", ACTION, UNRESERVED_KEYWORD, BARE_LABEL) @@ -229,7 +230,12 @@ PG_KEYWORD("isnull", ISNULL, TYPE_FUNC_NAME_KEYWORD, AS_LABEL) PG_KEYWORD("isolation", ISOLATION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("join", JOIN, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json", JSON, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_array", JSON_ARRAY, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_arrayagg", JSON_ARRAYAGG, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_object", JSON_OBJECT, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_objectagg", JSON_OBJECTAGG, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("key", KEY, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("keys", KEYS, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("label", LABEL, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("language", LANGUAGE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("large", LARGE_P, UNRESERVED_KEYWORD, BARE_LABEL) diff --git a/src/include/utils/json.h b/src/include/utils/json.h index 8a84a0cdb4..63d83b815f 100644 --- a/src/include/utils/json.h +++ b/src/include/utils/json.h @@ -20,5 +20,11 @@ extern void escape_json(StringInfo buf, const char *str); extern char *JsonEncodeDateTime(char *buf, Datum value, Oid typid, const int *tzp); +extern bool to_json_is_immutable(Oid typoid); +extern Datum json_build_object_worker(int nargs, Datum *args, bool *nulls, + Oid *types, bool absent_on_null, + bool unique_keys); +extern Datum json_build_array_worker(int nargs, Datum *args, bool *nulls, + Oid *types, bool absent_on_null); #endif /* JSON_H */ diff --git a/src/include/utils/jsonb.h b/src/include/utils/jsonb.h index 4cbe6edf21..6bcf35dd0a 100644 --- a/src/include/utils/jsonb.h +++ b/src/include/utils/jsonb.h @@ -329,6 +329,8 @@ typedef struct JsonbParseState JsonbValue contVal; Size size; struct JsonbParseState *next; + bool unique_keys; /* Check object key uniqueness */ + bool skip_nulls; /* Skip null object fields */ } JsonbParseState; /* @@ -412,4 +414,11 @@ extern Datum jsonb_set_element(Jsonb *jb, Datum *path, int path_len, JsonbValue *newval); extern Datum jsonb_get_element(Jsonb *jb, Datum *path, int npath, bool *isnull, bool as_text); +extern bool to_jsonb_is_immutable(Oid typoid); +extern Datum jsonb_build_object_worker(int nargs, Datum *args, bool *nulls, + Oid *types, bool absent_on_null, + bool unique_keys); +extern Datum jsonb_build_array_worker(int nargs, Datum *args, bool *nulls, + Oid *types, bool absent_on_null); + #endif /* __JSONB_H__ */ diff --git a/src/interfaces/ecpg/preproc/parse.pl b/src/interfaces/ecpg/preproc/parse.pl index dee6b8200d..5ec511fd01 100644 --- a/src/interfaces/ecpg/preproc/parse.pl +++ b/src/interfaces/ecpg/preproc/parse.pl @@ -47,6 +47,8 @@ 'NOT_LA' => 'not', 'NULLS_LA' => 'nulls', 'WITH_LA' => 'with', + 'WITH_LA_UNIQUE' => 'with', + 'WITHOUT_LA' => 'without', 'TYPECAST' => '::', 'DOT_DOT' => '..', 'COLON_EQUALS' => ':=', diff --git a/src/interfaces/ecpg/preproc/parser.c b/src/interfaces/ecpg/preproc/parser.c index a44e07a17a..5e2b606f9b 100644 --- a/src/interfaces/ecpg/preproc/parser.c +++ b/src/interfaces/ecpg/preproc/parser.c @@ -83,6 +83,7 @@ filtered_base_yylex(void) case WITH: case UIDENT: case USCONST: + case WITHOUT: break; default: return cur_token; @@ -143,6 +144,19 @@ filtered_base_yylex(void) case ORDINALITY: cur_token = WITH_LA; break; + case UNIQUE: + cur_token = WITH_LA_UNIQUE; + break; + } + break; + + case WITHOUT: + /* Replace WITHOUT by WITHOUT_LA if it's followed by TIME */ + switch (next_token) + { + case TIME: + cur_token = WITHOUT_LA; + break; } break; case UIDENT: diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out index 4ce6c039b4..15e4016836 100644 --- a/src/test/regress/expected/opr_sanity.out +++ b/src/test/regress/expected/opr_sanity.out @@ -1473,8 +1473,10 @@ WHERE a.aggfnoid = p.oid AND NOT binary_coercible(p.proargtypes[1], ptr.proargtypes[2])) OR (p.pronargs > 2 AND NOT binary_coercible(p.proargtypes[2], ptr.proargtypes[3])) - -- we could carry the check further, but 3 args is enough for now - OR (p.pronargs > 3) + OR (p.pronargs > 3 AND + NOT binary_coercible(p.proargtypes[3], ptr.proargtypes[4])) + -- we could carry the check further, but 4 args is enough for now + OR (p.pronargs > 4) ); aggfnoid | proname | oid | proname ----------+---------+-----+--------- diff --git a/src/test/regress/expected/sqljson.out b/src/test/regress/expected/sqljson.out new file mode 100644 index 0000000000..7dca5a8a30 --- /dev/null +++ b/src/test/regress/expected/sqljson.out @@ -0,0 +1,746 @@ +-- JSON_OBJECT() +SELECT JSON_OBJECT(); + json_object +------------- + {} +(1 row) + +SELECT JSON_OBJECT(RETURNING json); + json_object +------------- + {} +(1 row) + +SELECT JSON_OBJECT(RETURNING json FORMAT JSON); + json_object +------------- + {} +(1 row) + +SELECT JSON_OBJECT(RETURNING jsonb); + json_object +------------- + {} +(1 row) + +SELECT JSON_OBJECT(RETURNING jsonb FORMAT JSON); + json_object +------------- + {} +(1 row) + +SELECT JSON_OBJECT(RETURNING text); + json_object +------------- + {} +(1 row) + +SELECT JSON_OBJECT(RETURNING text FORMAT JSON); + json_object +------------- + {} +(1 row) + +SELECT JSON_OBJECT(RETURNING text FORMAT JSON ENCODING UTF8); +ERROR: cannot set JSON encoding for non-bytea output types +LINE 1: SELECT JSON_OBJECT(RETURNING text FORMAT JSON ENCODING UTF8)... + ^ +SELECT JSON_OBJECT(RETURNING text FORMAT JSON ENCODING INVALID_ENCODING); +ERROR: unrecognized JSON encoding: invalid_encoding +SELECT JSON_OBJECT(RETURNING bytea); + json_object +------------- + \x7b7d +(1 row) + +SELECT JSON_OBJECT(RETURNING bytea FORMAT JSON); + json_object +------------- + \x7b7d +(1 row) + +SELECT JSON_OBJECT(RETURNING bytea FORMAT JSON ENCODING UTF8); + json_object +------------- + \x7b7d +(1 row) + +SELECT JSON_OBJECT(RETURNING bytea FORMAT JSON ENCODING UTF16); +ERROR: unsupported JSON encoding +LINE 1: SELECT JSON_OBJECT(RETURNING bytea FORMAT JSON ENCODING UTF1... + ^ +HINT: only UTF8 JSON encoding is supported +SELECT JSON_OBJECT(RETURNING bytea FORMAT JSON ENCODING UTF32); +ERROR: unsupported JSON encoding +LINE 1: SELECT JSON_OBJECT(RETURNING bytea FORMAT JSON ENCODING UTF3... + ^ +HINT: only UTF8 JSON encoding is supported +SELECT JSON_OBJECT('foo': NULL::int FORMAT JSON); +ERROR: cannot use non-string types with explicit FORMAT JSON clause +LINE 1: SELECT JSON_OBJECT('foo': NULL::int FORMAT JSON); + ^ +SELECT JSON_OBJECT('foo': NULL::int FORMAT JSON ENCODING UTF8); +ERROR: JSON ENCODING clause is only allowed for bytea input type +LINE 1: SELECT JSON_OBJECT('foo': NULL::int FORMAT JSON ENCODING UTF... + ^ +SELECT JSON_OBJECT('foo': NULL::json FORMAT JSON); +WARNING: FORMAT JSON has no effect for json and jsonb types +LINE 1: SELECT JSON_OBJECT('foo': NULL::json FORMAT JSON); + ^ + json_object +---------------- + {"foo" : null} +(1 row) + +SELECT JSON_OBJECT('foo': NULL::json FORMAT JSON ENCODING UTF8); +ERROR: JSON ENCODING clause is only allowed for bytea input type +LINE 1: SELECT JSON_OBJECT('foo': NULL::json FORMAT JSON ENCODING UT... + ^ +SELECT JSON_OBJECT('foo': NULL::jsonb FORMAT JSON); +WARNING: FORMAT JSON has no effect for json and jsonb types +LINE 1: SELECT JSON_OBJECT('foo': NULL::jsonb FORMAT JSON); + ^ + json_object +--------------- + {"foo": null} +(1 row) + +SELECT JSON_OBJECT('foo': NULL::jsonb FORMAT JSON ENCODING UTF8); +ERROR: JSON ENCODING clause is only allowed for bytea input type +LINE 1: SELECT JSON_OBJECT('foo': NULL::jsonb FORMAT JSON ENCODING U... + ^ +SELECT JSON_OBJECT(NULL: 1); +ERROR: argument 1 cannot be null +HINT: Object keys should be text. +SELECT JSON_OBJECT('a': 2 + 3); + json_object +------------- + {"a" : 5} +(1 row) + +SELECT JSON_OBJECT('a' VALUE 2 + 3); + json_object +------------- + {"a" : 5} +(1 row) + +--SELECT JSON_OBJECT(KEY 'a' VALUE 2 + 3); +SELECT JSON_OBJECT('a' || 2: 1); + json_object +------------- + {"a2" : 1} +(1 row) + +SELECT JSON_OBJECT(('a' || 2) VALUE 1); + json_object +------------- + {"a2" : 1} +(1 row) + +--SELECT JSON_OBJECT('a' || 2 VALUE 1); +--SELECT JSON_OBJECT(KEY 'a' || 2 VALUE 1); +SELECT JSON_OBJECT('a': 2::text); + json_object +------------- + {"a" : "2"} +(1 row) + +SELECT JSON_OBJECT('a' VALUE 2::text); + json_object +------------- + {"a" : "2"} +(1 row) + +--SELECT JSON_OBJECT(KEY 'a' VALUE 2::text); +SELECT JSON_OBJECT(1::text: 2); + json_object +------------- + {"1" : 2} +(1 row) + +SELECT JSON_OBJECT((1::text) VALUE 2); + json_object +------------- + {"1" : 2} +(1 row) + +--SELECT JSON_OBJECT(1::text VALUE 2); +--SELECT JSON_OBJECT(KEY 1::text VALUE 2); +SELECT JSON_OBJECT(json '[1]': 123); +ERROR: key value must be scalar, not array, composite, or json +SELECT JSON_OBJECT(ARRAY[1,2,3]: 'aaa'); +ERROR: key value must be scalar, not array, composite, or json +SELECT JSON_OBJECT( + 'a': '123', + 1.23: 123, + 'c': json '[ 1,true,{ } ]', + 'd': jsonb '{ "x" : 123.45 }' +); + json_object +------------------------------------------------------------------- + {"a": "123", "c": [1, true, {}], "d": {"x": 123.45}, "1.23": 123} +(1 row) + +SELECT JSON_OBJECT( + 'a': '123', + 1.23: 123, + 'c': json '[ 1,true,{ } ]', + 'd': jsonb '{ "x" : 123.45 }' + RETURNING jsonb +); + json_object +------------------------------------------------------------------- + {"a": "123", "c": [1, true, {}], "d": {"x": 123.45}, "1.23": 123} +(1 row) + +/* +SELECT JSON_OBJECT( + 'a': '123', + KEY 1.23 VALUE 123, + 'c' VALUE json '[1, true, {}]' +); +*/ +SELECT JSON_OBJECT('a': '123', 'b': JSON_OBJECT('a': 111, 'b': 'aaa')); + json_object +----------------------------------------------- + {"a" : "123", "b" : {"a" : 111, "b" : "aaa"}} +(1 row) + +SELECT JSON_OBJECT('a': '123', 'b': JSON_OBJECT('a': 111, 'b': 'aaa' RETURNING jsonb)); + json_object +------------------------------------------- + {"a": "123", "b": {"a": 111, "b": "aaa"}} +(1 row) + +SELECT JSON_OBJECT('a': JSON_OBJECT('b': 1 RETURNING text)); + json_object +----------------------- + {"a" : "{\"b\" : 1}"} +(1 row) + +SELECT JSON_OBJECT('a': JSON_OBJECT('b': 1 RETURNING text) FORMAT JSON); + json_object +------------------- + {"a" : {"b" : 1}} +(1 row) + +SELECT JSON_OBJECT('a': JSON_OBJECT('b': 1 RETURNING bytea)); + json_object +--------------------------------- + {"a" : "\\x7b226222203a20317d"} +(1 row) + +SELECT JSON_OBJECT('a': JSON_OBJECT('b': 1 RETURNING bytea) FORMAT JSON); + json_object +------------------- + {"a" : {"b" : 1}} +(1 row) + +SELECT JSON_OBJECT('a': '1', 'b': NULL, 'c': 2); + json_object +---------------------------------- + {"a" : "1", "b" : null, "c" : 2} +(1 row) + +SELECT JSON_OBJECT('a': '1', 'b': NULL, 'c': 2 NULL ON NULL); + json_object +---------------------------------- + {"a" : "1", "b" : null, "c" : 2} +(1 row) + +SELECT JSON_OBJECT('a': '1', 'b': NULL, 'c': 2 ABSENT ON NULL); + json_object +---------------------- + {"a" : "1", "c" : 2} +(1 row) + +SELECT JSON_OBJECT(1: 1, '1': NULL WITH UNIQUE); +ERROR: duplicate JSON key "1" +SELECT JSON_OBJECT(1: 1, '1': NULL ABSENT ON NULL WITH UNIQUE); +ERROR: duplicate JSON key "1" +SELECT JSON_OBJECT(1: 1, '1': NULL NULL ON NULL WITH UNIQUE RETURNING jsonb); +ERROR: duplicate JSON object key value +SELECT JSON_OBJECT(1: 1, '1': NULL ABSENT ON NULL WITH UNIQUE RETURNING jsonb); +ERROR: duplicate JSON object key value +SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 NULL ON NULL WITH UNIQUE); +ERROR: duplicate JSON key "1" +SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITH UNIQUE); +ERROR: duplicate JSON key "1" +SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITHOUT UNIQUE); + json_object +-------------------- + {"1" : 1, "1" : 1} +(1 row) + +SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITH UNIQUE RETURNING jsonb); +ERROR: duplicate JSON object key value +SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITHOUT UNIQUE RETURNING jsonb); + json_object +------------- + {"1": 1} +(1 row) + +SELECT JSON_OBJECT(1: 1, '2': NULL, '3': 1, 4: NULL, '5': 'a' ABSENT ON NULL WITH UNIQUE RETURNING jsonb); + json_object +---------------------------- + {"1": 1, "3": 1, "5": "a"} +(1 row) + +-- JSON_ARRAY() +SELECT JSON_ARRAY(); + json_array +------------ + [] +(1 row) + +SELECT JSON_ARRAY(RETURNING json); + json_array +------------ + [] +(1 row) + +SELECT JSON_ARRAY(RETURNING json FORMAT JSON); + json_array +------------ + [] +(1 row) + +SELECT JSON_ARRAY(RETURNING jsonb); + json_array +------------ + [] +(1 row) + +SELECT JSON_ARRAY(RETURNING jsonb FORMAT JSON); + json_array +------------ + [] +(1 row) + +SELECT JSON_ARRAY(RETURNING text); + json_array +------------ + [] +(1 row) + +SELECT JSON_ARRAY(RETURNING text FORMAT JSON); + json_array +------------ + [] +(1 row) + +SELECT JSON_ARRAY(RETURNING text FORMAT JSON ENCODING UTF8); +ERROR: cannot set JSON encoding for non-bytea output types +LINE 1: SELECT JSON_ARRAY(RETURNING text FORMAT JSON ENCODING UTF8); + ^ +SELECT JSON_ARRAY(RETURNING text FORMAT JSON ENCODING INVALID_ENCODING); +ERROR: unrecognized JSON encoding: invalid_encoding +SELECT JSON_ARRAY(RETURNING bytea); + json_array +------------ + \x5b5d +(1 row) + +SELECT JSON_ARRAY(RETURNING bytea FORMAT JSON); + json_array +------------ + \x5b5d +(1 row) + +SELECT JSON_ARRAY(RETURNING bytea FORMAT JSON ENCODING UTF8); + json_array +------------ + \x5b5d +(1 row) + +SELECT JSON_ARRAY(RETURNING bytea FORMAT JSON ENCODING UTF16); +ERROR: unsupported JSON encoding +LINE 1: SELECT JSON_ARRAY(RETURNING bytea FORMAT JSON ENCODING UTF16... + ^ +HINT: only UTF8 JSON encoding is supported +SELECT JSON_ARRAY(RETURNING bytea FORMAT JSON ENCODING UTF32); +ERROR: unsupported JSON encoding +LINE 1: SELECT JSON_ARRAY(RETURNING bytea FORMAT JSON ENCODING UTF32... + ^ +HINT: only UTF8 JSON encoding is supported +SELECT JSON_ARRAY('aaa', 111, true, array[1,2,3], NULL, json '{"a": [1]}', jsonb '["a",3]'); + json_array +----------------------------------------------------- + ["aaa", 111, true, [1, 2, 3], {"a": [1]}, ["a", 3]] +(1 row) + +SELECT JSON_ARRAY('a', NULL, 'b' NULL ON NULL); + json_array +------------------ + ["a", null, "b"] +(1 row) + +SELECT JSON_ARRAY('a', NULL, 'b' ABSENT ON NULL); + json_array +------------ + ["a", "b"] +(1 row) + +SELECT JSON_ARRAY(NULL, NULL, 'b' ABSENT ON NULL); + json_array +------------ + ["b"] +(1 row) + +SELECT JSON_ARRAY('a', NULL, 'b' NULL ON NULL RETURNING jsonb); + json_array +------------------ + ["a", null, "b"] +(1 row) + +SELECT JSON_ARRAY('a', NULL, 'b' ABSENT ON NULL RETURNING jsonb); + json_array +------------ + ["a", "b"] +(1 row) + +SELECT JSON_ARRAY(NULL, NULL, 'b' ABSENT ON NULL RETURNING jsonb); + json_array +------------ + ["b"] +(1 row) + +SELECT JSON_ARRAY(JSON_ARRAY('{ "a" : 123 }' RETURNING text)); + json_array +------------------------------- + ["[\"{ \\\"a\\\" : 123 }\"]"] +(1 row) + +SELECT JSON_ARRAY(JSON_ARRAY('{ "a" : 123 }' FORMAT JSON RETURNING text)); + json_array +----------------------- + ["[{ \"a\" : 123 }]"] +(1 row) + +SELECT JSON_ARRAY(JSON_ARRAY('{ "a" : 123 }' FORMAT JSON RETURNING text) FORMAT JSON); + json_array +------------------- + [[{ "a" : 123 }]] +(1 row) + +SELECT JSON_ARRAY(SELECT i FROM (VALUES (1), (2), (NULL), (4)) foo(i)); + json_array +------------ + [1, 2, 4] +(1 row) + +SELECT JSON_ARRAY(SELECT i FROM (VALUES (NULL::int[]), ('{1,2}'), (NULL), (NULL), ('{3,4}'), (NULL)) foo(i)); + json_array +------------ + [[1,2], + + [3,4]] +(1 row) + +SELECT JSON_ARRAY(SELECT i FROM (VALUES (NULL::int[]), ('{1,2}'), (NULL), (NULL), ('{3,4}'), (NULL)) foo(i) RETURNING jsonb); + json_array +------------------ + [[1, 2], [3, 4]] +(1 row) + +--SELECT JSON_ARRAY(SELECT i FROM (VALUES (NULL::int[]), ('{1,2}'), (NULL), (NULL), ('{3,4}'), (NULL)) foo(i) NULL ON NULL); +--SELECT JSON_ARRAY(SELECT i FROM (VALUES (NULL::int[]), ('{1,2}'), (NULL), (NULL), ('{3,4}'), (NULL)) foo(i) NULL ON NULL RETURNING jsonb); +SELECT JSON_ARRAY(SELECT i FROM (VALUES (3), (1), (NULL), (2)) foo(i) ORDER BY i); + json_array +------------ + [1, 2, 3] +(1 row) + +-- Should fail +SELECT JSON_ARRAY(SELECT FROM (VALUES (1)) foo(i)); +ERROR: subquery must return only one column +LINE 1: SELECT JSON_ARRAY(SELECT FROM (VALUES (1)) foo(i)); + ^ +SELECT JSON_ARRAY(SELECT i, i FROM (VALUES (1)) foo(i)); +ERROR: subquery must return only one column +LINE 1: SELECT JSON_ARRAY(SELECT i, i FROM (VALUES (1)) foo(i)); + ^ +SELECT JSON_ARRAY(SELECT * FROM (VALUES (1, 2)) foo(i, j)); +ERROR: subquery must return only one column +LINE 1: SELECT JSON_ARRAY(SELECT * FROM (VALUES (1, 2)) foo(i, j)); + ^ +-- JSON_ARRAYAGG() +SELECT JSON_ARRAYAGG(i) IS NULL, + JSON_ARRAYAGG(i RETURNING jsonb) IS NULL +FROM generate_series(1, 0) i; + ?column? | ?column? +----------+---------- + t | t +(1 row) + +SELECT JSON_ARRAYAGG(i), + JSON_ARRAYAGG(i RETURNING jsonb) +FROM generate_series(1, 5) i; + json_arrayagg | json_arrayagg +-----------------+----------------- + [1, 2, 3, 4, 5] | [1, 2, 3, 4, 5] +(1 row) + +SELECT JSON_ARRAYAGG(i ORDER BY i DESC) +FROM generate_series(1, 5) i; + json_arrayagg +----------------- + [5, 4, 3, 2, 1] +(1 row) + +SELECT JSON_ARRAYAGG(i::text::json) +FROM generate_series(1, 5) i; + json_arrayagg +----------------- + [1, 2, 3, 4, 5] +(1 row) + +SELECT JSON_ARRAYAGG(JSON_ARRAY(i, i + 1 RETURNING text) FORMAT JSON) +FROM generate_series(1, 5) i; + json_arrayagg +------------------------------------------ + [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]] +(1 row) + +SELECT JSON_ARRAYAGG(NULL), + JSON_ARRAYAGG(NULL RETURNING jsonb) +FROM generate_series(1, 5); + json_arrayagg | json_arrayagg +---------------+--------------- + [] | [] +(1 row) + +SELECT JSON_ARRAYAGG(NULL NULL ON NULL), + JSON_ARRAYAGG(NULL NULL ON NULL RETURNING jsonb) +FROM generate_series(1, 5); + json_arrayagg | json_arrayagg +--------------------------------+-------------------------------- + [null, null, null, null, null] | [null, null, null, null, null] +(1 row) + +SELECT + JSON_ARRAYAGG(bar), + JSON_ARRAYAGG(bar RETURNING jsonb), + JSON_ARRAYAGG(bar ABSENT ON NULL), + JSON_ARRAYAGG(bar ABSENT ON NULL RETURNING jsonb), + JSON_ARRAYAGG(bar NULL ON NULL), + JSON_ARRAYAGG(bar NULL ON NULL RETURNING jsonb), + JSON_ARRAYAGG(foo), + JSON_ARRAYAGG(foo RETURNING jsonb), + JSON_ARRAYAGG(foo ORDER BY bar) FILTER (WHERE bar > 2), + JSON_ARRAYAGG(foo ORDER BY bar RETURNING jsonb) FILTER (WHERE bar > 2) +FROM + (VALUES (NULL), (3), (1), (NULL), (NULL), (5), (2), (4), (NULL)) foo(bar); + json_arrayagg | json_arrayagg | json_arrayagg | json_arrayagg | json_arrayagg | json_arrayagg | json_arrayagg | json_arrayagg | json_arrayagg | json_arrayagg +-----------------+-----------------+-----------------+-----------------+-----------------------------------------+-----------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------------------+---------------+-------------------------------------- + [3, 1, 5, 2, 4] | [3, 1, 5, 2, 4] | [3, 1, 5, 2, 4] | [3, 1, 5, 2, 4] | [null, 3, 1, null, null, 5, 2, 4, null] | [null, 3, 1, null, null, 5, 2, 4, null] | [{"bar":null}, +| [{"bar": null}, {"bar": 3}, {"bar": 1}, {"bar": null}, {"bar": null}, {"bar": 5}, {"bar": 2}, {"bar": 4}, {"bar": null}] | [{"bar":3}, +| [{"bar": 3}, {"bar": 4}, {"bar": 5}] + | | | | | | {"bar":3}, +| | {"bar":4}, +| + | | | | | | {"bar":1}, +| | {"bar":5}] | + | | | | | | {"bar":null}, +| | | + | | | | | | {"bar":null}, +| | | + | | | | | | {"bar":5}, +| | | + | | | | | | {"bar":2}, +| | | + | | | | | | {"bar":4}, +| | | + | | | | | | {"bar":null}] | | | +(1 row) + +SELECT + bar, JSON_ARRAYAGG(bar) FILTER (WHERE bar > 2) OVER (PARTITION BY foo.bar % 2) +FROM + (VALUES (NULL), (3), (1), (NULL), (NULL), (5), (2), (4), (NULL), (5), (4)) foo(bar); + bar | json_arrayagg +-----+--------------- + 4 | [4, 4] + 4 | [4, 4] + 2 | [4, 4] + 5 | [5, 3, 5] + 3 | [5, 3, 5] + 1 | [5, 3, 5] + 5 | [5, 3, 5] + | + | + | + | +(11 rows) + +-- JSON_OBJECTAGG() +SELECT JSON_OBJECTAGG('key': 1) IS NULL, + JSON_OBJECTAGG('key': 1 RETURNING jsonb) IS NULL +WHERE FALSE; + ?column? | ?column? +----------+---------- + t | t +(1 row) + +SELECT JSON_OBJECTAGG(NULL: 1); +ERROR: field name must not be null +SELECT JSON_OBJECTAGG(NULL: 1 RETURNING jsonb); +ERROR: field name must not be null +SELECT + JSON_OBJECTAGG(i: i), +-- JSON_OBJECTAGG(i VALUE i), +-- JSON_OBJECTAGG(KEY i VALUE i), + JSON_OBJECTAGG(i: i RETURNING jsonb) +FROM + generate_series(1, 5) i; + json_objectagg | json_objectagg +-------------------------------------------------+------------------------------------------ + { "1" : 1, "2" : 2, "3" : 3, "4" : 4, "5" : 5 } | {"1": 1, "2": 2, "3": 3, "4": 4, "5": 5} +(1 row) + +SELECT + JSON_OBJECTAGG(k: v), + JSON_OBJECTAGG(k: v NULL ON NULL), + JSON_OBJECTAGG(k: v ABSENT ON NULL), + JSON_OBJECTAGG(k: v RETURNING jsonb), + JSON_OBJECTAGG(k: v NULL ON NULL RETURNING jsonb), + JSON_OBJECTAGG(k: v ABSENT ON NULL RETURNING jsonb) +FROM + (VALUES (1, 1), (1, NULL), (2, NULL), (3, 3)) foo(k, v); + json_objectagg | json_objectagg | json_objectagg | json_objectagg | json_objectagg | json_objectagg +----------------------------------------------+----------------------------------------------+----------------------+--------------------------------+--------------------------------+------------------ + { "1" : 1, "1" : null, "2" : null, "3" : 3 } | { "1" : 1, "1" : null, "2" : null, "3" : 3 } | { "1" : 1, "3" : 3 } | {"1": null, "2": null, "3": 3} | {"1": null, "2": null, "3": 3} | {"1": 1, "3": 3} +(1 row) + +SELECT JSON_OBJECTAGG(k: v WITH UNIQUE KEYS) +FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); +ERROR: duplicate JSON key "1" +SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS) +FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); +ERROR: duplicate JSON key "1" +SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS) +FROM (VALUES (1, 1), (0, NULL), (3, NULL), (2, 2), (4, NULL)) foo(k, v); + json_objectagg +---------------------- + { "1" : 1, "2" : 2 } +(1 row) + +SELECT JSON_OBJECTAGG(k: v WITH UNIQUE KEYS RETURNING jsonb) +FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); +ERROR: duplicate JSON object key value +SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb) +FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); +ERROR: duplicate JSON object key value +-- Test JSON_OBJECT deparsing +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_OBJECT('foo' : '1' FORMAT JSON, 'bar' : 'baz' RETURNING json); + QUERY PLAN +------------------------------------------------------------------------------ + Result + Output: JSON_OBJECT('foo' : '1'::json, 'bar' : 'baz'::text RETURNING json) +(2 rows) + +CREATE VIEW json_object_view AS +SELECT JSON_OBJECT('foo' : '1' FORMAT JSON, 'bar' : 'baz' RETURNING json); +\sv json_object_view +CREATE OR REPLACE VIEW public.json_object_view AS + SELECT JSON_OBJECT('foo' : '1'::text FORMAT JSON, 'bar' : 'baz'::text RETURNING json) AS "json_object" +DROP VIEW json_object_view; +-- Test JSON_ARRAY deparsing +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_ARRAY('1' FORMAT JSON, 2 RETURNING json); + QUERY PLAN +--------------------------------------------------- + Result + Output: JSON_ARRAY('1'::json, 2 RETURNING json) +(2 rows) + +CREATE VIEW json_array_view AS +SELECT JSON_ARRAY('1' FORMAT JSON, 2 RETURNING json); +\sv json_array_view +CREATE OR REPLACE VIEW public.json_array_view AS + SELECT JSON_ARRAY('1'::text FORMAT JSON, 2 RETURNING json) AS "json_array" +DROP VIEW json_array_view; +-- Test JSON_OBJECTAGG deparsing +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_OBJECTAGG(i: ('111' || i)::bytea FORMAT JSON WITH UNIQUE RETURNING text) FILTER (WHERE i > 3) +FROM generate_series(1,5) i; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------- + Aggregate + Output: JSON_OBJECTAGG(i : (('111'::text || (i)::text))::bytea FORMAT JSON WITH UNIQUE KEYS RETURNING text) FILTER (WHERE (i > 3)) + -> Function Scan on pg_catalog.generate_series i + Output: i + Function Call: generate_series(1, 5) +(5 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_OBJECTAGG(i: ('111' || i)::bytea FORMAT JSON WITH UNIQUE RETURNING text) OVER (PARTITION BY i % 2) +FROM generate_series(1,5) i; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------- + WindowAgg + Output: JSON_OBJECTAGG(i : (('111'::text || (i)::text))::bytea FORMAT JSON WITH UNIQUE KEYS RETURNING text) OVER (?), ((i % 2)) + -> Sort + Output: ((i % 2)), i + Sort Key: ((i.i % 2)) + -> Function Scan on pg_catalog.generate_series i + Output: (i % 2), i + Function Call: generate_series(1, 5) +(8 rows) + +CREATE VIEW json_objectagg_view AS +SELECT JSON_OBJECTAGG(i: ('111' || i)::bytea FORMAT JSON WITH UNIQUE RETURNING text) FILTER (WHERE i > 3) +FROM generate_series(1,5) i; +\sv json_objectagg_view +CREATE OR REPLACE VIEW public.json_objectagg_view AS + SELECT JSON_OBJECTAGG(i.i : ('111'::text || i.i)::bytea FORMAT JSON WITH UNIQUE KEYS RETURNING text) FILTER (WHERE i.i > 3) AS "json_objectagg" + FROM generate_series(1, 5) i(i) +DROP VIEW json_objectagg_view; +-- Test JSON_ARRAYAGG deparsing +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_ARRAYAGG(('111' || i)::bytea FORMAT JSON NULL ON NULL RETURNING text) FILTER (WHERE i > 3) +FROM generate_series(1,5) i; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------- + Aggregate + Output: JSON_ARRAYAGG((('111'::text || (i)::text))::bytea FORMAT JSON NULL ON NULL RETURNING text) FILTER (WHERE (i > 3)) + -> Function Scan on pg_catalog.generate_series i + Output: i + Function Call: generate_series(1, 5) +(5 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_ARRAYAGG(('111' || i)::bytea FORMAT JSON NULL ON NULL RETURNING text) OVER (PARTITION BY i % 2) +FROM generate_series(1,5) i; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------- + WindowAgg + Output: JSON_ARRAYAGG((('111'::text || (i)::text))::bytea FORMAT JSON NULL ON NULL RETURNING text) OVER (?), ((i % 2)) + -> Sort + Output: ((i % 2)), i + Sort Key: ((i.i % 2)) + -> Function Scan on pg_catalog.generate_series i + Output: (i % 2), i + Function Call: generate_series(1, 5) +(8 rows) + +CREATE VIEW json_arrayagg_view AS +SELECT JSON_ARRAYAGG(('111' || i)::bytea FORMAT JSON NULL ON NULL RETURNING text) FILTER (WHERE i > 3) +FROM generate_series(1,5) i; +\sv json_arrayagg_view +CREATE OR REPLACE VIEW public.json_arrayagg_view AS + SELECT JSON_ARRAYAGG(('111'::text || i.i)::bytea FORMAT JSON NULL ON NULL RETURNING text) FILTER (WHERE i.i > 3) AS "json_arrayagg" + FROM generate_series(1, 5) i(i) +DROP VIEW json_arrayagg_view; +-- Test JSON_ARRAY(subquery) deparsing +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_ARRAY(SELECT i FROM (VALUES (1), (2), (NULL), (4)) foo(i) RETURNING jsonb); + QUERY PLAN +--------------------------------------------------------------------- + Result + Output: $0 + InitPlan 1 (returns $0) + -> Aggregate + Output: JSON_ARRAYAGG("*VALUES*".column1 RETURNING jsonb) + -> Values Scan on "*VALUES*" + Output: "*VALUES*".column1 +(7 rows) + +CREATE VIEW json_array_subquery_view AS +SELECT JSON_ARRAY(SELECT i FROM (VALUES (1), (2), (NULL), (4)) foo(i) RETURNING jsonb); +\sv json_array_subquery_view +CREATE OR REPLACE VIEW public.json_array_subquery_view AS + SELECT ( SELECT JSON_ARRAYAGG(q.a RETURNING jsonb) AS "json_arrayagg" + FROM ( SELECT foo.i + FROM ( VALUES (1), (2), (NULL::integer), (4)) foo(i)) q(a)) AS "json_array" +DROP VIEW json_array_subquery_view; diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 6d8f524ae9..3ce701a588 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -111,7 +111,7 @@ test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combo # ---------- # Another group of parallel tests (JSON related) # ---------- -test: json jsonb json_encoding jsonpath jsonpath_encoding jsonb_jsonpath +test: json jsonb json_encoding jsonpath jsonpath_encoding jsonb_jsonpath sqljson # ---------- # Another group of parallel tests diff --git a/src/test/regress/sql/opr_sanity.sql b/src/test/regress/sql/opr_sanity.sql index 2b292851e3..63fe114fed 100644 --- a/src/test/regress/sql/opr_sanity.sql +++ b/src/test/regress/sql/opr_sanity.sql @@ -854,8 +854,10 @@ WHERE a.aggfnoid = p.oid AND NOT binary_coercible(p.proargtypes[1], ptr.proargtypes[2])) OR (p.pronargs > 2 AND NOT binary_coercible(p.proargtypes[2], ptr.proargtypes[3])) - -- we could carry the check further, but 3 args is enough for now - OR (p.pronargs > 3) + OR (p.pronargs > 3 AND + NOT binary_coercible(p.proargtypes[3], ptr.proargtypes[4])) + -- we could carry the check further, but 4 args is enough for now + OR (p.pronargs > 4) ); -- Cross-check finalfn (if present) against its entry in pg_proc. diff --git a/src/test/regress/sql/sqljson.sql b/src/test/regress/sql/sqljson.sql new file mode 100644 index 0000000000..aaef2d8aab --- /dev/null +++ b/src/test/regress/sql/sqljson.sql @@ -0,0 +1,282 @@ +-- JSON_OBJECT() +SELECT JSON_OBJECT(); +SELECT JSON_OBJECT(RETURNING json); +SELECT JSON_OBJECT(RETURNING json FORMAT JSON); +SELECT JSON_OBJECT(RETURNING jsonb); +SELECT JSON_OBJECT(RETURNING jsonb FORMAT JSON); +SELECT JSON_OBJECT(RETURNING text); +SELECT JSON_OBJECT(RETURNING text FORMAT JSON); +SELECT JSON_OBJECT(RETURNING text FORMAT JSON ENCODING UTF8); +SELECT JSON_OBJECT(RETURNING text FORMAT JSON ENCODING INVALID_ENCODING); +SELECT JSON_OBJECT(RETURNING bytea); +SELECT JSON_OBJECT(RETURNING bytea FORMAT JSON); +SELECT JSON_OBJECT(RETURNING bytea FORMAT JSON ENCODING UTF8); +SELECT JSON_OBJECT(RETURNING bytea FORMAT JSON ENCODING UTF16); +SELECT JSON_OBJECT(RETURNING bytea FORMAT JSON ENCODING UTF32); + +SELECT JSON_OBJECT('foo': NULL::int FORMAT JSON); +SELECT JSON_OBJECT('foo': NULL::int FORMAT JSON ENCODING UTF8); +SELECT JSON_OBJECT('foo': NULL::json FORMAT JSON); +SELECT JSON_OBJECT('foo': NULL::json FORMAT JSON ENCODING UTF8); +SELECT JSON_OBJECT('foo': NULL::jsonb FORMAT JSON); +SELECT JSON_OBJECT('foo': NULL::jsonb FORMAT JSON ENCODING UTF8); + +SELECT JSON_OBJECT(NULL: 1); +SELECT JSON_OBJECT('a': 2 + 3); +SELECT JSON_OBJECT('a' VALUE 2 + 3); +--SELECT JSON_OBJECT(KEY 'a' VALUE 2 + 3); +SELECT JSON_OBJECT('a' || 2: 1); +SELECT JSON_OBJECT(('a' || 2) VALUE 1); +--SELECT JSON_OBJECT('a' || 2 VALUE 1); +--SELECT JSON_OBJECT(KEY 'a' || 2 VALUE 1); +SELECT JSON_OBJECT('a': 2::text); +SELECT JSON_OBJECT('a' VALUE 2::text); +--SELECT JSON_OBJECT(KEY 'a' VALUE 2::text); +SELECT JSON_OBJECT(1::text: 2); +SELECT JSON_OBJECT((1::text) VALUE 2); +--SELECT JSON_OBJECT(1::text VALUE 2); +--SELECT JSON_OBJECT(KEY 1::text VALUE 2); +SELECT JSON_OBJECT(json '[1]': 123); +SELECT JSON_OBJECT(ARRAY[1,2,3]: 'aaa'); + +SELECT JSON_OBJECT( + 'a': '123', + 1.23: 123, + 'c': json '[ 1,true,{ } ]', + 'd': jsonb '{ "x" : 123.45 }' +); + +SELECT JSON_OBJECT( + 'a': '123', + 1.23: 123, + 'c': json '[ 1,true,{ } ]', + 'd': jsonb '{ "x" : 123.45 }' + RETURNING jsonb +); + +/* +SELECT JSON_OBJECT( + 'a': '123', + KEY 1.23 VALUE 123, + 'c' VALUE json '[1, true, {}]' +); +*/ + +SELECT JSON_OBJECT('a': '123', 'b': JSON_OBJECT('a': 111, 'b': 'aaa')); +SELECT JSON_OBJECT('a': '123', 'b': JSON_OBJECT('a': 111, 'b': 'aaa' RETURNING jsonb)); + +SELECT JSON_OBJECT('a': JSON_OBJECT('b': 1 RETURNING text)); +SELECT JSON_OBJECT('a': JSON_OBJECT('b': 1 RETURNING text) FORMAT JSON); +SELECT JSON_OBJECT('a': JSON_OBJECT('b': 1 RETURNING bytea)); +SELECT JSON_OBJECT('a': JSON_OBJECT('b': 1 RETURNING bytea) FORMAT JSON); + +SELECT JSON_OBJECT('a': '1', 'b': NULL, 'c': 2); +SELECT JSON_OBJECT('a': '1', 'b': NULL, 'c': 2 NULL ON NULL); +SELECT JSON_OBJECT('a': '1', 'b': NULL, 'c': 2 ABSENT ON NULL); + +SELECT JSON_OBJECT(1: 1, '1': NULL WITH UNIQUE); +SELECT JSON_OBJECT(1: 1, '1': NULL ABSENT ON NULL WITH UNIQUE); +SELECT JSON_OBJECT(1: 1, '1': NULL NULL ON NULL WITH UNIQUE RETURNING jsonb); +SELECT JSON_OBJECT(1: 1, '1': NULL ABSENT ON NULL WITH UNIQUE RETURNING jsonb); + +SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 NULL ON NULL WITH UNIQUE); +SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITH UNIQUE); +SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITHOUT UNIQUE); +SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITH UNIQUE RETURNING jsonb); +SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITHOUT UNIQUE RETURNING jsonb); +SELECT JSON_OBJECT(1: 1, '2': NULL, '3': 1, 4: NULL, '5': 'a' ABSENT ON NULL WITH UNIQUE RETURNING jsonb); + + +-- JSON_ARRAY() +SELECT JSON_ARRAY(); +SELECT JSON_ARRAY(RETURNING json); +SELECT JSON_ARRAY(RETURNING json FORMAT JSON); +SELECT JSON_ARRAY(RETURNING jsonb); +SELECT JSON_ARRAY(RETURNING jsonb FORMAT JSON); +SELECT JSON_ARRAY(RETURNING text); +SELECT JSON_ARRAY(RETURNING text FORMAT JSON); +SELECT JSON_ARRAY(RETURNING text FORMAT JSON ENCODING UTF8); +SELECT JSON_ARRAY(RETURNING text FORMAT JSON ENCODING INVALID_ENCODING); +SELECT JSON_ARRAY(RETURNING bytea); +SELECT JSON_ARRAY(RETURNING bytea FORMAT JSON); +SELECT JSON_ARRAY(RETURNING bytea FORMAT JSON ENCODING UTF8); +SELECT JSON_ARRAY(RETURNING bytea FORMAT JSON ENCODING UTF16); +SELECT JSON_ARRAY(RETURNING bytea FORMAT JSON ENCODING UTF32); + +SELECT JSON_ARRAY('aaa', 111, true, array[1,2,3], NULL, json '{"a": [1]}', jsonb '["a",3]'); + +SELECT JSON_ARRAY('a', NULL, 'b' NULL ON NULL); +SELECT JSON_ARRAY('a', NULL, 'b' ABSENT ON NULL); +SELECT JSON_ARRAY(NULL, NULL, 'b' ABSENT ON NULL); +SELECT JSON_ARRAY('a', NULL, 'b' NULL ON NULL RETURNING jsonb); +SELECT JSON_ARRAY('a', NULL, 'b' ABSENT ON NULL RETURNING jsonb); +SELECT JSON_ARRAY(NULL, NULL, 'b' ABSENT ON NULL RETURNING jsonb); + +SELECT JSON_ARRAY(JSON_ARRAY('{ "a" : 123 }' RETURNING text)); +SELECT JSON_ARRAY(JSON_ARRAY('{ "a" : 123 }' FORMAT JSON RETURNING text)); +SELECT JSON_ARRAY(JSON_ARRAY('{ "a" : 123 }' FORMAT JSON RETURNING text) FORMAT JSON); + +SELECT JSON_ARRAY(SELECT i FROM (VALUES (1), (2), (NULL), (4)) foo(i)); +SELECT JSON_ARRAY(SELECT i FROM (VALUES (NULL::int[]), ('{1,2}'), (NULL), (NULL), ('{3,4}'), (NULL)) foo(i)); +SELECT JSON_ARRAY(SELECT i FROM (VALUES (NULL::int[]), ('{1,2}'), (NULL), (NULL), ('{3,4}'), (NULL)) foo(i) RETURNING jsonb); +--SELECT JSON_ARRAY(SELECT i FROM (VALUES (NULL::int[]), ('{1,2}'), (NULL), (NULL), ('{3,4}'), (NULL)) foo(i) NULL ON NULL); +--SELECT JSON_ARRAY(SELECT i FROM (VALUES (NULL::int[]), ('{1,2}'), (NULL), (NULL), ('{3,4}'), (NULL)) foo(i) NULL ON NULL RETURNING jsonb); +SELECT JSON_ARRAY(SELECT i FROM (VALUES (3), (1), (NULL), (2)) foo(i) ORDER BY i); +-- Should fail +SELECT JSON_ARRAY(SELECT FROM (VALUES (1)) foo(i)); +SELECT JSON_ARRAY(SELECT i, i FROM (VALUES (1)) foo(i)); +SELECT JSON_ARRAY(SELECT * FROM (VALUES (1, 2)) foo(i, j)); + +-- JSON_ARRAYAGG() +SELECT JSON_ARRAYAGG(i) IS NULL, + JSON_ARRAYAGG(i RETURNING jsonb) IS NULL +FROM generate_series(1, 0) i; + +SELECT JSON_ARRAYAGG(i), + JSON_ARRAYAGG(i RETURNING jsonb) +FROM generate_series(1, 5) i; + +SELECT JSON_ARRAYAGG(i ORDER BY i DESC) +FROM generate_series(1, 5) i; + +SELECT JSON_ARRAYAGG(i::text::json) +FROM generate_series(1, 5) i; + +SELECT JSON_ARRAYAGG(JSON_ARRAY(i, i + 1 RETURNING text) FORMAT JSON) +FROM generate_series(1, 5) i; + +SELECT JSON_ARRAYAGG(NULL), + JSON_ARRAYAGG(NULL RETURNING jsonb) +FROM generate_series(1, 5); + +SELECT JSON_ARRAYAGG(NULL NULL ON NULL), + JSON_ARRAYAGG(NULL NULL ON NULL RETURNING jsonb) +FROM generate_series(1, 5); + +SELECT + JSON_ARRAYAGG(bar), + JSON_ARRAYAGG(bar RETURNING jsonb), + JSON_ARRAYAGG(bar ABSENT ON NULL), + JSON_ARRAYAGG(bar ABSENT ON NULL RETURNING jsonb), + JSON_ARRAYAGG(bar NULL ON NULL), + JSON_ARRAYAGG(bar NULL ON NULL RETURNING jsonb), + JSON_ARRAYAGG(foo), + JSON_ARRAYAGG(foo RETURNING jsonb), + JSON_ARRAYAGG(foo ORDER BY bar) FILTER (WHERE bar > 2), + JSON_ARRAYAGG(foo ORDER BY bar RETURNING jsonb) FILTER (WHERE bar > 2) +FROM + (VALUES (NULL), (3), (1), (NULL), (NULL), (5), (2), (4), (NULL)) foo(bar); + +SELECT + bar, JSON_ARRAYAGG(bar) FILTER (WHERE bar > 2) OVER (PARTITION BY foo.bar % 2) +FROM + (VALUES (NULL), (3), (1), (NULL), (NULL), (5), (2), (4), (NULL), (5), (4)) foo(bar); + +-- JSON_OBJECTAGG() +SELECT JSON_OBJECTAGG('key': 1) IS NULL, + JSON_OBJECTAGG('key': 1 RETURNING jsonb) IS NULL +WHERE FALSE; + +SELECT JSON_OBJECTAGG(NULL: 1); + +SELECT JSON_OBJECTAGG(NULL: 1 RETURNING jsonb); + +SELECT + JSON_OBJECTAGG(i: i), +-- JSON_OBJECTAGG(i VALUE i), +-- JSON_OBJECTAGG(KEY i VALUE i), + JSON_OBJECTAGG(i: i RETURNING jsonb) +FROM + generate_series(1, 5) i; + +SELECT + JSON_OBJECTAGG(k: v), + JSON_OBJECTAGG(k: v NULL ON NULL), + JSON_OBJECTAGG(k: v ABSENT ON NULL), + JSON_OBJECTAGG(k: v RETURNING jsonb), + JSON_OBJECTAGG(k: v NULL ON NULL RETURNING jsonb), + JSON_OBJECTAGG(k: v ABSENT ON NULL RETURNING jsonb) +FROM + (VALUES (1, 1), (1, NULL), (2, NULL), (3, 3)) foo(k, v); + +SELECT JSON_OBJECTAGG(k: v WITH UNIQUE KEYS) +FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); + +SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS) +FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); + +SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS) +FROM (VALUES (1, 1), (0, NULL), (3, NULL), (2, 2), (4, NULL)) foo(k, v); + +SELECT JSON_OBJECTAGG(k: v WITH UNIQUE KEYS RETURNING jsonb) +FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); + +SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb) +FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); + +-- Test JSON_OBJECT deparsing +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_OBJECT('foo' : '1' FORMAT JSON, 'bar' : 'baz' RETURNING json); + +CREATE VIEW json_object_view AS +SELECT JSON_OBJECT('foo' : '1' FORMAT JSON, 'bar' : 'baz' RETURNING json); + +\sv json_object_view + +DROP VIEW json_object_view; + +-- Test JSON_ARRAY deparsing +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_ARRAY('1' FORMAT JSON, 2 RETURNING json); + +CREATE VIEW json_array_view AS +SELECT JSON_ARRAY('1' FORMAT JSON, 2 RETURNING json); + +\sv json_array_view + +DROP VIEW json_array_view; + +-- Test JSON_OBJECTAGG deparsing +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_OBJECTAGG(i: ('111' || i)::bytea FORMAT JSON WITH UNIQUE RETURNING text) FILTER (WHERE i > 3) +FROM generate_series(1,5) i; + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_OBJECTAGG(i: ('111' || i)::bytea FORMAT JSON WITH UNIQUE RETURNING text) OVER (PARTITION BY i % 2) +FROM generate_series(1,5) i; + +CREATE VIEW json_objectagg_view AS +SELECT JSON_OBJECTAGG(i: ('111' || i)::bytea FORMAT JSON WITH UNIQUE RETURNING text) FILTER (WHERE i > 3) +FROM generate_series(1,5) i; + +\sv json_objectagg_view + +DROP VIEW json_objectagg_view; + +-- Test JSON_ARRAYAGG deparsing +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_ARRAYAGG(('111' || i)::bytea FORMAT JSON NULL ON NULL RETURNING text) FILTER (WHERE i > 3) +FROM generate_series(1,5) i; + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_ARRAYAGG(('111' || i)::bytea FORMAT JSON NULL ON NULL RETURNING text) OVER (PARTITION BY i % 2) +FROM generate_series(1,5) i; + +CREATE VIEW json_arrayagg_view AS +SELECT JSON_ARRAYAGG(('111' || i)::bytea FORMAT JSON NULL ON NULL RETURNING text) FILTER (WHERE i > 3) +FROM generate_series(1,5) i; + +\sv json_arrayagg_view + +DROP VIEW json_arrayagg_view; + +-- Test JSON_ARRAY(subquery) deparsing +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_ARRAY(SELECT i FROM (VALUES (1), (2), (NULL), (4)) foo(i) RETURNING jsonb); + +CREATE VIEW json_array_subquery_view AS +SELECT JSON_ARRAY(SELECT i FROM (VALUES (1), (2), (NULL), (4)) foo(i) RETURNING jsonb); + +\sv json_array_subquery_view + +DROP VIEW json_array_subquery_view; From cc7401d5ca498a84d9b47fd2e01cebd8e830e558 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 27 Mar 2022 18:32:40 -0400 Subject: [PATCH 273/772] Fix up compiler warnings/errors from f4fb45d15. Per early buildfarm returns. --- src/backend/parser/parse_expr.c | 4 ---- src/backend/utils/adt/ruleutils.c | 24 +++++++++++++----------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 6b93a76bca..781c9709e6 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -3415,7 +3415,6 @@ transformJsonConstructorOutput(ParseState *pstate, JsonOutput *output, if (!OidIsValid(returning->typid)) { ListCell *lc; - bool have_json = false; bool have_jsonb = false; foreach(lc, args) @@ -3423,7 +3422,6 @@ transformJsonConstructorOutput(ParseState *pstate, JsonOutput *output, Node *expr = lfirst(lc); Oid typid = exprType(expr); - have_json |= typid == JSONOID; have_jsonb |= typid == JSONBOID; if (have_jsonb) @@ -3437,8 +3435,6 @@ transformJsonConstructorOutput(ParseState *pstate, JsonOutput *output, } else { - /* Note: this includes the have_json case */ - /* XXX TEXT is default by the standard, but we return JSON */ returning->typid = JSONOID; returning->format->format_type = JS_FORMAT_JSON; diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 6db6c008dd..df5c486501 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -9907,9 +9907,11 @@ get_json_constructor(JsonConstructorExpr *ctor, deparse_context *context, funcname = "JSON_ARRAY"; break; case JSCTOR_JSON_OBJECTAGG: - return get_json_agg_constructor(ctor, context, "JSON_OBJECTAGG", true); + get_json_agg_constructor(ctor, context, "JSON_OBJECTAGG", true); + return; case JSCTOR_JSON_ARRAYAGG: - return get_json_agg_constructor(ctor, context, "JSON_ARRAYAGG", false); + get_json_agg_constructor(ctor, context, "JSON_ARRAYAGG", false); + return; default: elog(ERROR, "invalid JsonConstructorExprType %d", ctor->type); } @@ -10064,8 +10066,8 @@ get_agg_expr_helper(Aggref *aggref, deparse_context *context, static void get_agg_expr(Aggref *aggref, deparse_context *context, Aggref *original_aggref) { - return get_agg_expr_helper(aggref, context, original_aggref, NULL, NULL, - false); + get_agg_expr_helper(aggref, context, original_aggref, NULL, NULL, + false); } /* @@ -10182,7 +10184,7 @@ get_windowfunc_expr_helper(WindowFunc *wfunc, deparse_context *context, static void get_windowfunc_expr(WindowFunc *wfunc, deparse_context *context) { - return get_windowfunc_expr_helper(wfunc, context, NULL, NULL, false); + get_windowfunc_expr_helper(wfunc, context, NULL, NULL, false); } /* @@ -10438,13 +10440,13 @@ get_json_agg_constructor(JsonConstructorExpr *ctor, deparse_context *context, get_json_constructor_options(ctor, &options); if (IsA(ctor->func, Aggref)) - return get_agg_expr_helper((Aggref *) ctor->func, context, - (Aggref *) ctor->func, - funcname, options.data, is_json_objectagg); + get_agg_expr_helper((Aggref *) ctor->func, context, + (Aggref *) ctor->func, + funcname, options.data, is_json_objectagg); else if (IsA(ctor->func, WindowFunc)) - return get_windowfunc_expr_helper((WindowFunc *) ctor->func, context, - funcname, options.data, - is_json_objectagg); + get_windowfunc_expr_helper((WindowFunc *) ctor->func, context, + funcname, options.data, + is_json_objectagg); else elog(ERROR, "invalid JsonConstructorExpr underlying node type: %d", nodeTag(ctor->func)); From 264d284929e0d5a419821f94f16f766b5497c87a Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 23 Mar 2022 16:38:43 -0700 Subject: [PATCH 274/772] waldump: fix use-after-free in search_directory(). After closedir() dirent->d_name is not valid anymore. As there alerady are a few places relying on the limited lifetime of pg_waldump, do so here as well, and just pg_strdup() the string. The bug was introduced in fc49e24fa69a. Found by UBSan, run locally. Backpatch: 11-, like fc49e24fa69 itself. --- src/bin/pg_waldump/pg_waldump.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 9ffe9e55bd..4cb40d068a 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -204,7 +204,7 @@ search_directory(const char *directory, const char *fname) if (IsXLogFileName(xlde->d_name)) { fd = open_file_in_directory(directory, xlde->d_name); - fname = xlde->d_name; + fname = pg_strdup(xlde->d_name); break; } } From 8af36427d4cc783a9efe8781889ea0936f1d48dd Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Mon, 28 Mar 2022 16:21:12 +1300 Subject: [PATCH 275/772] Fix pg_waldump docs. Before 52b5568, the recently added -l option was short for --relation. We changed it to -R, but we forgot to update one place in the documentation. Author: Japin Li Discussion: https://postgr.es/m/MEYP282MB1669435CFBE57CBBA5116C66B61D9%40MEYP282MB1669.AUSP282.PROD.OUTLOOK.COM --- doc/src/sgml/ref/pg_waldump.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/pg_waldump.sgml b/doc/src/sgml/ref/pg_waldump.sgml index 4e86f44c5b..1a05af5d97 100644 --- a/doc/src/sgml/ref/pg_waldump.sgml +++ b/doc/src/sgml/ref/pg_waldump.sgml @@ -85,7 +85,7 @@ PostgreSQL documentation Only display records that modify the given block. The relation must also be provided with or - . + . From 43a7dc96eb363f87286494223861301361ce766c Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sun, 27 Mar 2022 21:39:43 -0700 Subject: [PATCH 276/772] Fix NULL input behaviour of pg_stat_get_replication_slot(). pg_stat_get_replication_slot() accidentally was marked as non-strict, crashing when called with NULL input. As it's already released, introduce an explicit NULL check in 14, fix the catalog in HEAD. Bumps catversion in HEAD. Discussion: https://postgr.es/m/20220326212432.s5n2maw6kugnpyxw@alap3.anarazel.de Backpatch: 14-, where replication slot stats were introduced --- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.dat | 2 +- src/test/regress/expected/stats.out | 7 +++++++ src/test/regress/sql/stats.sql | 4 ++++ 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index a3a49d3938..706475dfa8 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202203241 +#define CATALOG_VERSION_NO 202203271 #endif diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 5e612a6b67..a26625f823 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -5370,7 +5370,7 @@ proargnames => '{pid,status,receive_start_lsn,receive_start_tli,written_lsn,flushed_lsn,received_tli,last_msg_send_time,last_msg_receipt_time,latest_end_lsn,latest_end_time,slot_name,sender_host,sender_port,conninfo}', prosrc => 'pg_stat_get_wal_receiver' }, { oid => '6169', descr => 'statistics: information about replication slot', - proname => 'pg_stat_get_replication_slot', proisstrict => 'f', provolatile => 's', + proname => 'pg_stat_get_replication_slot', provolatile => 's', proparallel => 'r', prorettype => 'record', proargtypes => 'text', proallargtypes => '{text,text,int8,int8,int8,int8,int8,int8,int8,int8,timestamptz}', proargmodes => '{i,o,o,o,o,o,o,o,o,o,o}', diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index b7416c8f8f..dcf48112f6 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -255,4 +255,11 @@ SELECT pg_stat_get_tuples_hot_updated('brin_hot'::regclass::oid); DROP TABLE brin_hot; DROP FUNCTION wait_for_hot_stats(); +-- ensure that stats accessors handle NULL input correctly +SELECT pg_stat_get_replication_slot(NULL); + pg_stat_get_replication_slot +------------------------------ + +(1 row) + -- End of Stats Test diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index dbc2dd28b6..076c763451 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -229,4 +229,8 @@ DROP TABLE brin_hot; DROP FUNCTION wait_for_hot_stats(); +-- ensure that stats accessors handle NULL input correctly +SELECT pg_stat_get_replication_slot(NULL); + + -- End of Stats Test From da4b56662f2cda3ef97847307aaec8e8f66ffb15 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sun, 27 Mar 2022 21:47:26 -0700 Subject: [PATCH 277/772] Mark pg_stat_get_subscription_stats() strict. It accidentally was marked as non-strict. As it was introduced only in HEAD, we can just fix the catalog. Bumps catversion. Discussion: https://postgr.es/m/20220326212432.s5n2maw6kugnpyxw@alap3.anarazel.de --- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.dat | 2 +- src/test/regress/expected/stats.out | 6 ++++++ src/test/regress/sql/stats.sql | 1 + 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 706475dfa8..05c677e816 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202203271 +#define CATALOG_VERSION_NO 202203272 #endif diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index a26625f823..deb00307f6 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -5377,7 +5377,7 @@ proargnames => '{slot_name,slot_name,spill_txns,spill_count,spill_bytes,stream_txns,stream_count,stream_bytes,total_txns,total_bytes,stats_reset}', prosrc => 'pg_stat_get_replication_slot' }, { oid => '8523', descr => 'statistics: information about subscription stats', - proname => 'pg_stat_get_subscription_stats', proisstrict => 'f', + proname => 'pg_stat_get_subscription_stats', provolatile => 's', proparallel => 'r', prorettype => 'record', proargtypes => 'oid', proallargtypes => '{oid,oid,int8,int8,timestamptz}', diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index dcf48112f6..06a1d2f229 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -262,4 +262,10 @@ SELECT pg_stat_get_replication_slot(NULL); (1 row) +SELECT pg_stat_get_subscription_stats(NULL); + pg_stat_get_subscription_stats +-------------------------------- + +(1 row) + -- End of Stats Test diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index 076c763451..ae1ec173e3 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -231,6 +231,7 @@ DROP FUNCTION wait_for_hot_stats(); -- ensure that stats accessors handle NULL input correctly SELECT pg_stat_get_replication_slot(NULL); +SELECT pg_stat_get_subscription_stats(NULL); -- End of Stats Test From 91c0570a791180aa3ff01d70eb16ed6c0d8283a3 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sun, 27 Mar 2022 22:29:19 -0700 Subject: [PATCH 278/772] Don't fail for > 1 walsenders in 019_replslot_limit, add debug messages. So far the first of the retries introduced in f28bf667f60 resolves the issue. But I (Andres) am still suspicious that the start of the failures might indicate a problem. To reduce noise, stop reporting a failure if a retry resolves the problem. To allow figuring out what causes the slow slot drop, add a few more debug messages to ReplicationSlotDropPtr. See also commit afdeff10526, fe0972ee5e6 and f28bf667f60. Discussion: https://postgr.es/m/20220327213219.smdvfkq2fl74flow@alap3.anarazel.de --- src/backend/replication/slot.c | 9 +++++++++ src/test/recovery/t/019_replslot_limit.pl | 10 +++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index caa6b29756..ed4c8b3ad5 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -702,8 +702,13 @@ ReplicationSlotDropPtr(ReplicationSlot *slot) slot->active_pid = 0; slot->in_use = false; LWLockRelease(ReplicationSlotControlLock); + + elog(DEBUG3, "replication slot drop: %s: marked as not in use", NameStr(slot->data.name)); + ConditionVariableBroadcast(&slot->active_cv); + elog(DEBUG3, "replication slot drop: %s: notified others", NameStr(slot->data.name)); + /* * Slot is dead and doesn't prevent resource removal anymore, recompute * limits. @@ -711,6 +716,8 @@ ReplicationSlotDropPtr(ReplicationSlot *slot) ReplicationSlotsComputeRequiredXmin(false); ReplicationSlotsComputeRequiredLSN(); + elog(DEBUG3, "replication slot drop: %s: computed required", NameStr(slot->data.name)); + /* * If removing the directory fails, the worst thing that will happen is * that the user won't be able to create a new slot with the same name @@ -720,6 +727,8 @@ ReplicationSlotDropPtr(ReplicationSlot *slot) ereport(WARNING, (errmsg("could not remove directory \"%s\"", tmppath))); + elog(DEBUG3, "replication slot drop: %s: removed directory", NameStr(slot->data.name)); + /* * Send a message to drop the replication slot to the stats collector. * Since there is no guarantee of the order of message transfer on a UDP diff --git a/src/test/recovery/t/019_replslot_limit.pl b/src/test/recovery/t/019_replslot_limit.pl index 77bb401bc5..5654f3b545 100644 --- a/src/test/recovery/t/019_replslot_limit.pl +++ b/src/test/recovery/t/019_replslot_limit.pl @@ -339,8 +339,8 @@ # We've seen occasional cases where multiple walsender pids are active. It # could be that we're just observing process shutdown being slow. To collect # more information, retry a couple times, print a bit of debugging information -# each iteration. For now report a test failure even if later iterations -# succeed. +# each iteration. Don't fail the test if retries find just one pid, the +# buildfarm failures are too noisy. my $i = 0; while (1) { @@ -349,7 +349,9 @@ $senderpid = $node_primary3->safe_psql('postgres', "SELECT pid FROM pg_stat_activity WHERE backend_type = 'walsender'"); - last if like($senderpid, qr/^[0-9]+$/, "have walsender pid $senderpid"); + last if $senderpid =~ qr/^[0-9]+$/; + + diag "multiple walsenders active in iteration $i"; # show information about all active connections $node_primary3->psql('postgres', @@ -370,6 +372,8 @@ usleep(100_000); } +like($senderpid, qr/^[0-9]+$/, "have walsender pid $senderpid"); + my $receiverpid = $node_standby3->safe_psql('postgres', "SELECT pid FROM pg_stat_activity WHERE backend_type = 'walreceiver'"); like($receiverpid, qr/^[0-9]+$/, "have walreceiver pid $receiverpid"); From e26114c817b610424010cfbe91a743f591246ff1 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 28 Mar 2022 10:41:43 +0200 Subject: [PATCH 279/772] Make JSON path numeric literals more correct Per ECMAScript standard (ECMA-262, referenced by SQL standard), the syntax forms .1 1. should be allowed for decimal numeric literals, but the existing implementation rejected them. Also, by the same standard, reject trailing junk after numeric literals. Note that the ECMAScript standard for numeric literals is in respects like these slightly different from the JSON standard, which might be the original cause for this discrepancy. A change is that this kind of syntax is now rejected: 1.type() This needs to be written as (1).type() This is correct; normal JavaScript also does not accept this syntax. We also need to fix up the jsonpath output function for this case. We put parentheses around numeric items if they are followed by another path item. Reviewed-by: Nikita Glukhov Discussion: https://www.postgresql.org/message-id/flat/50a828cc-0a00-7791-7883-2ed06dfb2dbb@enterprisedb.com --- src/backend/utils/adt/jsonpath.c | 4 + src/backend/utils/adt/jsonpath_scan.l | 24 ++- src/test/regress/expected/jsonpath.out | 238 ++++++++++++++++--------- src/test/regress/sql/jsonpath.sql | 8 + 4 files changed, 176 insertions(+), 98 deletions(-) diff --git a/src/backend/utils/adt/jsonpath.c b/src/backend/utils/adt/jsonpath.c index 9be4e305ff..91af030095 100644 --- a/src/backend/utils/adt/jsonpath.c +++ b/src/backend/utils/adt/jsonpath.c @@ -500,9 +500,13 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, escape_json(buf, jspGetString(v, NULL)); break; case jpiNumeric: + if (jspHasNext(v)) + appendStringInfoChar(buf, '('); appendStringInfoString(buf, DatumGetCString(DirectFunctionCall1(numeric_out, NumericGetDatum(jspGetNumeric(v))))); + if (jspHasNext(v)) + appendStringInfoChar(buf, ')'); break; case jpiBool: if (jspGetBool(v)) diff --git a/src/backend/utils/adt/jsonpath_scan.l b/src/backend/utils/adt/jsonpath_scan.l index 827a9e44cb..1f08e7c51f 100644 --- a/src/backend/utils/adt/jsonpath_scan.l +++ b/src/backend/utils/adt/jsonpath_scan.l @@ -82,11 +82,13 @@ other [^\?\%\$\.\[\]\{\}\(\)\|\&\!\=\<\>\@\#\,\*:\-\+\/\\\" \t\n\r\f] digit [0-9] integer (0|[1-9]{digit}*) -decimal {integer}\.{digit}+ -decimalfail {integer}\. +decimal ({integer}\.{digit}*|\.{digit}+) real ({integer}|{decimal})[Ee][-+]?{digit}+ -realfail1 ({integer}|{decimal})[Ee] -realfail2 ({integer}|{decimal})[Ee][-+] +realfail ({integer}|{decimal})[Ee][-+] + +integer_junk {integer}{other} +decimal_junk {decimal}{other} +real_junk {real}{other} hex_dig [0-9A-Fa-f] unicode \\u({hex_dig}{4}|\{{hex_dig}{1,6}\}) @@ -242,16 +244,10 @@ hex_fail \\x{hex_dig}{0,1} return INT_P; } -{decimalfail} { - /* throw back the ., and treat as integer */ - yyless(yyleng - 1); - addstring(true, yytext, yyleng); - addchar(false, '\0'); - yylval->str = scanstring; - return INT_P; - } - -({realfail1}|{realfail2}) { yyerror(NULL, "invalid floating point number"); } +{realfail} { yyerror(NULL, "invalid numeric literal"); } +{integer_junk} { yyerror(NULL, "trailing junk after numeric literal"); } +{decimal_junk} { yyerror(NULL, "trailing junk after numeric literal"); } +{real_junk} { yyerror(NULL, "trailing junk after numeric literal"); } \" { addchar(true, '\0'); diff --git a/src/test/regress/expected/jsonpath.out b/src/test/regress/expected/jsonpath.out index e399fa9631..88eb22a4e9 100644 --- a/src/test/regress/expected/jsonpath.out +++ b/src/test/regress/expected/jsonpath.out @@ -354,21 +354,19 @@ select 'null.type()'::jsonpath; (1 row) select '1.type()'::jsonpath; - jsonpath ----------- - 1.type() -(1 row) - +ERROR: trailing junk after numeric literal at or near "1.t" of jsonpath input +LINE 1: select '1.type()'::jsonpath; + ^ select '(1).type()'::jsonpath; - jsonpath ----------- - 1.type() + jsonpath +------------ + (1).type() (1 row) select '1.2.type()'::jsonpath; - jsonpath ------------- - 1.2.type() + jsonpath +-------------- + (1.2).type() (1 row) select '"aaa".type()'::jsonpath; @@ -545,9 +543,9 @@ select '(($))'::jsonpath; (1 row) select '((($ + 1)).a + ((2)).b ? ((((@ > 1)) || (exists(@.c)))))'::jsonpath; - jsonpath -------------------------------------------------- - (($ + 1)."a" + 2."b"?(@ > 1 || exists (@."c"))) + jsonpath +--------------------------------------------------- + (($ + 1)."a" + (2)."b"?(@ > 1 || exists (@."c"))) (1 row) select '$ ? (@.a < 1)'::jsonpath; @@ -569,17 +567,23 @@ select '$ ? (@.a < +1)'::jsonpath; (1 row) select '$ ? (@.a < .1)'::jsonpath; -ERROR: syntax error, unexpected '.' at or near "." of jsonpath input -LINE 1: select '$ ? (@.a < .1)'::jsonpath; - ^ + jsonpath +----------------- + $?(@."a" < 0.1) +(1 row) + select '$ ? (@.a < -.1)'::jsonpath; -ERROR: syntax error, unexpected '.' at or near "." of jsonpath input -LINE 1: select '$ ? (@.a < -.1)'::jsonpath; - ^ + jsonpath +------------------ + $?(@."a" < -0.1) +(1 row) + select '$ ? (@.a < +.1)'::jsonpath; -ERROR: syntax error, unexpected '.' at or near "." of jsonpath input -LINE 1: select '$ ? (@.a < +.1)'::jsonpath; - ^ + jsonpath +----------------- + $?(@."a" < 0.1) +(1 row) + select '$ ? (@.a < 0.1)'::jsonpath; jsonpath ----------------- @@ -635,17 +639,23 @@ select '$ ? (@.a < +1e1)'::jsonpath; (1 row) select '$ ? (@.a < .1e1)'::jsonpath; -ERROR: syntax error, unexpected '.' at or near "." of jsonpath input -LINE 1: select '$ ? (@.a < .1e1)'::jsonpath; - ^ + jsonpath +--------------- + $?(@."a" < 1) +(1 row) + select '$ ? (@.a < -.1e1)'::jsonpath; -ERROR: syntax error, unexpected '.' at or near "." of jsonpath input -LINE 1: select '$ ? (@.a < -.1e1)'::jsonpath; - ^ + jsonpath +---------------- + $?(@."a" < -1) +(1 row) + select '$ ? (@.a < +.1e1)'::jsonpath; -ERROR: syntax error, unexpected '.' at or near "." of jsonpath input -LINE 1: select '$ ? (@.a < +.1e1)'::jsonpath; - ^ + jsonpath +--------------- + $?(@."a" < 1) +(1 row) + select '$ ? (@.a < 0.1e1)'::jsonpath; jsonpath --------------- @@ -701,17 +711,23 @@ select '$ ? (@.a < +1e-1)'::jsonpath; (1 row) select '$ ? (@.a < .1e-1)'::jsonpath; -ERROR: syntax error, unexpected '.' at or near "." of jsonpath input -LINE 1: select '$ ? (@.a < .1e-1)'::jsonpath; - ^ + jsonpath +------------------ + $?(@."a" < 0.01) +(1 row) + select '$ ? (@.a < -.1e-1)'::jsonpath; -ERROR: syntax error, unexpected '.' at or near "." of jsonpath input -LINE 1: select '$ ? (@.a < -.1e-1)'::jsonpath; - ^ + jsonpath +------------------- + $?(@."a" < -0.01) +(1 row) + select '$ ? (@.a < +.1e-1)'::jsonpath; -ERROR: syntax error, unexpected '.' at or near "." of jsonpath input -LINE 1: select '$ ? (@.a < +.1e-1)'::jsonpath; - ^ + jsonpath +------------------ + $?(@."a" < 0.01) +(1 row) + select '$ ? (@.a < 0.1e-1)'::jsonpath; jsonpath ------------------ @@ -767,17 +783,23 @@ select '$ ? (@.a < +1e+1)'::jsonpath; (1 row) select '$ ? (@.a < .1e+1)'::jsonpath; -ERROR: syntax error, unexpected '.' at or near "." of jsonpath input -LINE 1: select '$ ? (@.a < .1e+1)'::jsonpath; - ^ + jsonpath +--------------- + $?(@."a" < 1) +(1 row) + select '$ ? (@.a < -.1e+1)'::jsonpath; -ERROR: syntax error, unexpected '.' at or near "." of jsonpath input -LINE 1: select '$ ? (@.a < -.1e+1)'::jsonpath; - ^ + jsonpath +---------------- + $?(@."a" < -1) +(1 row) + select '$ ? (@.a < +.1e+1)'::jsonpath; -ERROR: syntax error, unexpected '.' at or near "." of jsonpath input -LINE 1: select '$ ? (@.a < +.1e+1)'::jsonpath; - ^ + jsonpath +--------------- + $?(@."a" < 1) +(1 row) + select '$ ? (@.a < 0.1e+1)'::jsonpath; jsonpath --------------- @@ -821,7 +843,7 @@ select '0'::jsonpath; (1 row) select '00'::jsonpath; -ERROR: syntax error, unexpected IDENT_P at end of jsonpath input +ERROR: trailing junk after numeric literal at or near "00" of jsonpath input LINE 1: select '00'::jsonpath; ^ select '0.0'::jsonpath; @@ -878,30 +900,60 @@ select '0.0010e+2'::jsonpath; 0.10 (1 row) -select '1e'::jsonpath; -ERROR: invalid floating point number at or near "1e" of jsonpath input -LINE 1: select '1e'::jsonpath; - ^ -select '1.e'::jsonpath; +select '.001'::jsonpath; + jsonpath +---------- + 0.001 +(1 row) + +select '.001e1'::jsonpath; + jsonpath +---------- + 0.01 +(1 row) + +select '1.'::jsonpath; + jsonpath +---------- + 1 +(1 row) + +select '1.e1'::jsonpath; jsonpath ---------- - 1."e" + 10 (1 row) +select '1a'::jsonpath; +ERROR: trailing junk after numeric literal at or near "1a" of jsonpath input +LINE 1: select '1a'::jsonpath; + ^ +select '1e'::jsonpath; +ERROR: trailing junk after numeric literal at or near "1e" of jsonpath input +LINE 1: select '1e'::jsonpath; + ^ +select '1.e'::jsonpath; +ERROR: trailing junk after numeric literal at or near "1.e" of jsonpath input +LINE 1: select '1.e'::jsonpath; + ^ +select '1.2a'::jsonpath; +ERROR: trailing junk after numeric literal at or near "1.2a" of jsonpath input +LINE 1: select '1.2a'::jsonpath; + ^ select '1.2e'::jsonpath; -ERROR: invalid floating point number at or near "1.2e" of jsonpath input +ERROR: trailing junk after numeric literal at or near "1.2e" of jsonpath input LINE 1: select '1.2e'::jsonpath; ^ select '1.2.e'::jsonpath; - jsonpath ----------- - 1.2."e" + jsonpath +----------- + (1.2)."e" (1 row) select '(1.2).e'::jsonpath; - jsonpath ----------- - 1.2."e" + jsonpath +----------- + (1.2)."e" (1 row) select '1e3'::jsonpath; @@ -913,19 +965,19 @@ select '1e3'::jsonpath; select '1.e3'::jsonpath; jsonpath ---------- - 1."e3" + 1000 (1 row) select '1.e3.e'::jsonpath; jsonpath ------------ - 1."e3"."e" + (1000)."e" (1 row) select '1.e3.e4'::jsonpath; jsonpath ------------- - 1."e3"."e4" + (1000)."e4" (1 row) select '1.2e3'::jsonpath; @@ -934,31 +986,49 @@ select '1.2e3'::jsonpath; 1200 (1 row) +select '1.2e3a'::jsonpath; +ERROR: trailing junk after numeric literal at or near "1.2e3a" of jsonpath input +LINE 1: select '1.2e3a'::jsonpath; + ^ select '1.2.e3'::jsonpath; - jsonpath ----------- - 1.2."e3" + jsonpath +------------ + (1.2)."e3" (1 row) select '(1.2).e3'::jsonpath; + jsonpath +------------ + (1.2)."e3" +(1 row) + +select '1..e'::jsonpath; jsonpath ---------- - 1.2."e3" + (1)."e" (1 row) -select '1..e'::jsonpath; -ERROR: syntax error, unexpected '.' at or near "." of jsonpath input -LINE 1: select '1..e'::jsonpath; - ^ select '1..e3'::jsonpath; -ERROR: syntax error, unexpected '.' at or near "." of jsonpath input -LINE 1: select '1..e3'::jsonpath; - ^ + jsonpath +---------- + (1)."e3" +(1 row) + select '(1.).e'::jsonpath; -ERROR: syntax error, unexpected ')' at or near ")" of jsonpath input -LINE 1: select '(1.).e'::jsonpath; - ^ + jsonpath +---------- + (1)."e" +(1 row) + select '(1.).e3'::jsonpath; -ERROR: syntax error, unexpected ')' at or near ")" of jsonpath input -LINE 1: select '(1.).e3'::jsonpath; - ^ + jsonpath +---------- + (1)."e3" +(1 row) + +select '1?(2>3)'::jsonpath; + jsonpath +------------- + (1)?(2 > 3) +(1 row) + diff --git a/src/test/regress/sql/jsonpath.sql b/src/test/regress/sql/jsonpath.sql index 17ab775783..d491714614 100644 --- a/src/test/regress/sql/jsonpath.sql +++ b/src/test/regress/sql/jsonpath.sql @@ -163,8 +163,14 @@ select '0.0010'::jsonpath; select '0.0010e-1'::jsonpath; select '0.0010e+1'::jsonpath; select '0.0010e+2'::jsonpath; +select '.001'::jsonpath; +select '.001e1'::jsonpath; +select '1.'::jsonpath; +select '1.e1'::jsonpath; +select '1a'::jsonpath; select '1e'::jsonpath; select '1.e'::jsonpath; +select '1.2a'::jsonpath; select '1.2e'::jsonpath; select '1.2.e'::jsonpath; select '(1.2).e'::jsonpath; @@ -173,9 +179,11 @@ select '1.e3'::jsonpath; select '1.e3.e'::jsonpath; select '1.e3.e4'::jsonpath; select '1.2e3'::jsonpath; +select '1.2e3a'::jsonpath; select '1.2.e3'::jsonpath; select '(1.2).e3'::jsonpath; select '1..e'::jsonpath; select '1..e3'::jsonpath; select '(1.).e'::jsonpath; select '(1.).e3'::jsonpath; +select '1?(2>3)'::jsonpath; From 61fa6ca79b3c566f44831a33bb226f7358ed4511 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Mon, 28 Mar 2022 14:27:36 +0200 Subject: [PATCH 280/772] Document autoanalyze limitations for partitioned tables When dealing with partitioned tables, counters for partitioned tables are not updated when modifying child tables. This means autoanalyze may not update optimizer statistics for the parent relations, which can result in poor plans for some queries. It's worth documenting this limitation, so that people are aware of it and can take steps to mitigate it (e.g. by setting up a script executing ANALYZE regularly). Backpatch to v10. Older branches are affected too, of couse, but we no longer maintain those. Author: Justin Pryzby Reviewed-by: Zhihong Yu, Tomas Vondra Backpatch-through: 10 Discussion: https://postgr.es/m/20210913035409.GA10647%40telsasoft.com --- doc/src/sgml/maintenance.sgml | 29 +++++++++++++++++++++++++++++ doc/src/sgml/ref/analyze.sgml | 32 +++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml index 36f975b1e5..34d72dba78 100644 --- a/doc/src/sgml/maintenance.sgml +++ b/doc/src/sgml/maintenance.sgml @@ -290,6 +290,15 @@ to meaningful statistical changes. + + Tuples changed in partitions and inheritance children do not trigger + analyze on the parent table. If the parent table is empty or rarely + changed, it may never be processed by autovacuum, and the statistics for + the inheritance tree as a whole won't be collected. It is necessary to + run ANALYZE on the parent table manually in order to + keep the statistics up to date. + + As with vacuuming for space recovery, frequent updates of statistics are more useful for heavily-updated tables than for seldom-updated @@ -347,6 +356,19 @@ ANALYZE commands on those tables on a suitable schedule. + + + + The autovacuum daemon does not issue ANALYZE commands + for partitioned tables. Inheritance parents will only be analyzed if the + parent itself is changed - changes to child tables do not trigger + autoanalyze on the parent table. If your queries require statistics on + parent tables for proper planning, it is necessary to periodically run + a manual ANALYZE on those tables to keep the statistics + up to date. + + + @@ -819,6 +841,13 @@ analyze threshold = analyze base threshold + analyze scale factor * number of tu since the last ANALYZE. + + Partitioned tables are not processed by autovacuum. Statistics + should be collected by running a manual ANALYZE when it is + first populated, and again whenever the distribution of data in its + partitions changes significantly. + + Temporary tables cannot be accessed by autovacuum. Therefore, appropriate vacuum and analyze operations should be performed via diff --git a/doc/src/sgml/ref/analyze.sgml b/doc/src/sgml/ref/analyze.sgml index c8fcebc161..fe5461768e 100644 --- a/doc/src/sgml/ref/analyze.sgml +++ b/doc/src/sgml/ref/analyze.sgml @@ -263,9 +263,35 @@ ANALYZE [ VERBOSE ] [ table_and_columns - If any of the child tables are foreign tables whose foreign data wrappers - do not support ANALYZE, those child tables are ignored while - gathering inheritance statistics. + For partitioned tables, ANALYZE gathers statistics by + sampling rows from all partitions; in addition, it will recurse into each + partition and update its statistics. Each leaf partition is analyzed only + once, even with multi-level partitioning. No statistics are collected for + only the parent table (without data from its partitions), because with + partitioning it's guaranteed to be empty. + + + + By constrast, if the table being analyzed has inheritance children, + ANALYZE gathers two sets of statistics: one on the rows + of the parent table only, and a second including rows of both the parent + table and all of its children. This second set of statistics is needed when + planning queries that process the inheritance tree as a whole. The child + tables themselves are not individually analyzed in this case. + + + + The autovacuum daemon does not process partitioned tables, nor does it + process inheritance parents if only the children are ever modified. + It is usually necessary to periodically run a manual + ANALYZE to keep the statistics of the table hierarchy + up to date. + + + + If any child tables or partitions are foreign tables whose foreign + data wrappers do not support ANALYZE, those tables are + ignored while gathering inheritance statistics. From ae63017bdb316b16a9f201b10f1221598111d6c5 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 28 Mar 2022 15:22:34 +0200 Subject: [PATCH 281/772] Preparatory test cleanup Add a little bit of explanation, clarity, and space. Extraced from a larger patch so that the changes from that patch would be easier to identify. Discussion: https://www.postgresql.org/message-id/flat/04e12818-2f98-257c-b926-2845d74ed04f%402ndquadrant.com --- src/test/regress/expected/alter_table.out | 76 +++++++++++------------ src/test/regress/sql/alter_table.sql | 21 ++++--- 2 files changed, 49 insertions(+), 48 deletions(-) diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index aabc564e2c..07473dd660 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -3448,21 +3448,21 @@ ALTER TABLE old_system_table DROP CONSTRAINT new_system_table_pkey; ALTER TABLE old_system_table DROP COLUMN othercol; DROP TABLE old_system_table; -- set logged -CREATE UNLOGGED TABLE unlogged1(f1 SERIAL PRIMARY KEY, f2 TEXT); +CREATE UNLOGGED TABLE unlogged1(f1 SERIAL PRIMARY KEY, f2 TEXT); -- has sequence, toast -- check relpersistence of an unlogged table SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged1' UNION ALL -SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^unlogged1' +SELECT r.relname || ' toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^unlogged1' UNION ALL -SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^unlogged1' +SELECT r.relname || ' toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^unlogged1' ORDER BY relname; - relname | relkind | relpersistence -------------------+---------+---------------- - toast index | i | u - toast table | t | u - unlogged1 | r | u - unlogged1_f1_seq | S | p - unlogged1_pkey | i | u + relname | relkind | relpersistence +-----------------------+---------+---------------- + unlogged1 | r | u + unlogged1 toast index | i | u + unlogged1 toast table | t | u + unlogged1_f1_seq | S | p + unlogged1_pkey | i | u (5 rows) CREATE UNLOGGED TABLE unlogged2(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES unlogged1); -- foreign key @@ -3474,17 +3474,17 @@ ALTER TABLE unlogged1 SET LOGGED; -- check relpersistence of an unlogged table after changing to permanent SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged1' UNION ALL -SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^unlogged1' +SELECT r.relname || ' toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^unlogged1' UNION ALL -SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^unlogged1' +SELECT r.relname || ' toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^unlogged1' ORDER BY relname; - relname | relkind | relpersistence -------------------+---------+---------------- - toast index | i | p - toast table | t | p - unlogged1 | r | p - unlogged1_f1_seq | S | p - unlogged1_pkey | i | p + relname | relkind | relpersistence +-----------------------+---------+---------------- + unlogged1 | r | p + unlogged1 toast index | i | p + unlogged1 toast table | t | p + unlogged1_f1_seq | S | p + unlogged1_pkey | i | p (5 rows) ALTER TABLE unlogged1 SET LOGGED; -- silently do nothing @@ -3492,21 +3492,21 @@ DROP TABLE unlogged3; DROP TABLE unlogged2; DROP TABLE unlogged1; -- set unlogged -CREATE TABLE logged1(f1 SERIAL PRIMARY KEY, f2 TEXT); +CREATE TABLE logged1(f1 SERIAL PRIMARY KEY, f2 TEXT); -- has sequence, toast -- check relpersistence of a permanent table SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^logged1' UNION ALL -SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^logged1' +SELECT r.relname || ' toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^logged1' UNION ALL -SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^logged1' +SELECT r.relname ||' toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^logged1' ORDER BY relname; - relname | relkind | relpersistence -----------------+---------+---------------- - logged1 | r | p - logged1_f1_seq | S | p - logged1_pkey | i | p - toast index | i | p - toast table | t | p + relname | relkind | relpersistence +---------------------+---------+---------------- + logged1 | r | p + logged1 toast index | i | p + logged1 toast table | t | p + logged1_f1_seq | S | p + logged1_pkey | i | p (5 rows) CREATE TABLE logged2(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES logged1); -- foreign key @@ -3519,17 +3519,17 @@ ALTER TABLE logged1 SET UNLOGGED; -- check relpersistence of a permanent table after changing to unlogged SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^logged1' UNION ALL -SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^logged1' +SELECT r.relname || ' toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^logged1' UNION ALL -SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^logged1' +SELECT r.relname || ' toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^logged1' ORDER BY relname; - relname | relkind | relpersistence -----------------+---------+---------------- - logged1 | r | u - logged1_f1_seq | S | p - logged1_pkey | i | u - toast index | i | u - toast table | t | u + relname | relkind | relpersistence +---------------------+---------+---------------- + logged1 | r | u + logged1 toast index | i | u + logged1 toast table | t | u + logged1_f1_seq | S | p + logged1_pkey | i | u (5 rows) ALTER TABLE logged1 SET UNLOGGED; -- silently do nothing diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index cce1cb1dd3..52001e3135 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -2180,13 +2180,13 @@ ALTER TABLE old_system_table DROP COLUMN othercol; DROP TABLE old_system_table; -- set logged -CREATE UNLOGGED TABLE unlogged1(f1 SERIAL PRIMARY KEY, f2 TEXT); +CREATE UNLOGGED TABLE unlogged1(f1 SERIAL PRIMARY KEY, f2 TEXT); -- has sequence, toast -- check relpersistence of an unlogged table SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged1' UNION ALL -SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^unlogged1' +SELECT r.relname || ' toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^unlogged1' UNION ALL -SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^unlogged1' +SELECT r.relname || ' toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^unlogged1' ORDER BY relname; CREATE UNLOGGED TABLE unlogged2(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES unlogged1); -- foreign key CREATE UNLOGGED TABLE unlogged3(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES unlogged3); -- self-referencing foreign key @@ -2196,22 +2196,23 @@ ALTER TABLE unlogged1 SET LOGGED; -- check relpersistence of an unlogged table after changing to permanent SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^unlogged1' UNION ALL -SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^unlogged1' +SELECT r.relname || ' toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^unlogged1' UNION ALL -SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^unlogged1' +SELECT r.relname || ' toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^unlogged1' ORDER BY relname; ALTER TABLE unlogged1 SET LOGGED; -- silently do nothing DROP TABLE unlogged3; DROP TABLE unlogged2; DROP TABLE unlogged1; + -- set unlogged -CREATE TABLE logged1(f1 SERIAL PRIMARY KEY, f2 TEXT); +CREATE TABLE logged1(f1 SERIAL PRIMARY KEY, f2 TEXT); -- has sequence, toast -- check relpersistence of a permanent table SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^logged1' UNION ALL -SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^logged1' +SELECT r.relname || ' toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^logged1' UNION ALL -SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^logged1' +SELECT r.relname ||' toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^logged1' ORDER BY relname; CREATE TABLE logged2(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES logged1); -- foreign key CREATE TABLE logged3(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES logged3); -- self-referencing foreign key @@ -2222,9 +2223,9 @@ ALTER TABLE logged1 SET UNLOGGED; -- check relpersistence of a permanent table after changing to unlogged SELECT relname, relkind, relpersistence FROM pg_class WHERE relname ~ '^logged1' UNION ALL -SELECT 'toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^logged1' +SELECT r.relname || ' toast table', t.relkind, t.relpersistence FROM pg_class r JOIN pg_class t ON t.oid = r.reltoastrelid WHERE r.relname ~ '^logged1' UNION ALL -SELECT 'toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^logged1' +SELECT r.relname || ' toast index', ri.relkind, ri.relpersistence FROM pg_class r join pg_class t ON t.oid = r.reltoastrelid JOIN pg_index i ON i.indrelid = t.oid JOIN pg_class ri ON ri.oid = i.indexrelid WHERE r.relname ~ '^logged1' ORDER BY relname; ALTER TABLE logged1 SET UNLOGGED; -- silently do nothing DROP TABLE logged3; From 7103ebb7aae8ab8076b7e85f335ceb8fe799097c Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Mon, 28 Mar 2022 16:45:58 +0200 Subject: [PATCH 282/772] Add support for MERGE SQL command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MERGE performs actions that modify rows in the target table using a source table or query. MERGE provides a single SQL statement that can conditionally INSERT/UPDATE/DELETE rows -- a task that would otherwise require multiple PL statements. For example, MERGE INTO target AS t USING source AS s ON t.tid = s.sid WHEN MATCHED AND t.balance > s.delta THEN UPDATE SET balance = t.balance - s.delta WHEN MATCHED THEN DELETE WHEN NOT MATCHED AND s.delta > 0 THEN INSERT VALUES (s.sid, s.delta) WHEN NOT MATCHED THEN DO NOTHING; MERGE works with regular tables, partitioned tables and inheritance hierarchies, including column and row security enforcement, as well as support for row and statement triggers and transition tables therein. MERGE is optimized for OLTP and is parameterizable, though also useful for large scale ETL/ELT. MERGE is not intended to be used in preference to existing single SQL commands for INSERT, UPDATE or DELETE since there is some overhead. MERGE can be used from PL/pgSQL. MERGE does not support targetting updatable views or foreign tables, and RETURNING clauses are not allowed either. These limitations are likely fixable with sufficient effort. Rewrite rules are also not supported, but it's not clear that we'd want to support them. Author: Pavan Deolasee Author: Álvaro Herrera Author: Amit Langote Author: Simon Riggs Reviewed-by: Peter Eisentraut Reviewed-by: Andres Freund (earlier versions) Reviewed-by: Peter Geoghegan (earlier versions) Reviewed-by: Robert Haas (earlier versions) Reviewed-by: Japin Li Reviewed-by: Justin Pryzby Reviewed-by: Tomas Vondra Reviewed-by: Zhihong Yu Discussion: https://postgr.es/m/CANP8+jKitBSrB7oTgT9CY2i1ObfOt36z0XMraQc+Xrz8QB0nXA@mail.gmail.com Discussion: https://postgr.es/m/CAH2-WzkJdBuxj9PO=2QaO9-3h3xGbQPZ34kJH=HukRekwM-GZg@mail.gmail.com Discussion: https://postgr.es/m/20201231134736.GA25392@alvherre.pgsql --- contrib/test_decoding/expected/ddl.out | 46 + contrib/test_decoding/sql/ddl.sql | 16 + doc/src/sgml/libpq.sgml | 8 +- doc/src/sgml/mvcc.sgml | 34 +- doc/src/sgml/plpgsql.sgml | 5 +- doc/src/sgml/ref/allfiles.sgml | 1 + doc/src/sgml/ref/create_policy.sgml | 23 +- doc/src/sgml/ref/insert.sgml | 11 +- doc/src/sgml/ref/merge.sgml | 620 ++++++ doc/src/sgml/reference.sgml | 1 + doc/src/sgml/trigger.sgml | 22 + src/backend/catalog/sql_features.txt | 6 +- src/backend/commands/explain.c | 35 + src/backend/commands/trigger.c | 126 +- src/backend/executor/README | 41 +- src/backend/executor/execMain.c | 16 + src/backend/executor/execPartition.c | 113 +- src/backend/executor/execReplication.c | 2 +- src/backend/executor/nodeModifyTable.c | 936 +++++++- src/backend/executor/spi.c | 3 + src/backend/nodes/copyfuncs.c | 55 + src/backend/nodes/equalfuncs.c | 49 + src/backend/nodes/nodeFuncs.c | 59 +- src/backend/nodes/outfuncs.c | 36 + src/backend/nodes/readfuncs.c | 43 + src/backend/optimizer/plan/createplan.c | 15 +- src/backend/optimizer/plan/planner.c | 64 +- src/backend/optimizer/plan/setrefs.c | 64 +- src/backend/optimizer/prep/prepjointree.c | 91 + src/backend/optimizer/prep/preptlist.c | 37 + src/backend/optimizer/util/appendinfo.c | 19 +- src/backend/optimizer/util/pathnode.c | 11 +- src/backend/optimizer/util/plancat.c | 4 + src/backend/parser/Makefile | 1 + src/backend/parser/analyze.c | 20 +- src/backend/parser/gram.y | 180 +- src/backend/parser/parse_agg.c | 10 + src/backend/parser/parse_collate.c | 1 + src/backend/parser/parse_expr.c | 4 + src/backend/parser/parse_func.c | 3 + src/backend/parser/parse_merge.c | 415 ++++ src/backend/parser/parse_relation.c | 23 +- src/backend/parser/parse_target.c | 3 +- src/backend/rewrite/rewriteHandler.c | 41 +- src/backend/rewrite/rowsecurity.c | 106 +- src/backend/tcop/pquery.c | 3 + src/backend/tcop/utility.c | 16 + src/backend/utils/adt/ruleutils.c | 9 +- src/bin/psql/tab-complete.c | 69 +- src/include/commands/trigger.h | 4 +- src/include/executor/nodeModifyTable.h | 3 + src/include/executor/spi.h | 1 + src/include/nodes/execnodes.h | 36 +- src/include/nodes/nodes.h | 7 +- src/include/nodes/parsenodes.h | 61 +- src/include/nodes/pathnodes.h | 6 +- src/include/nodes/plannodes.h | 7 +- src/include/optimizer/pathnode.h | 2 +- src/include/optimizer/prep.h | 1 + src/include/parser/analyze.h | 5 + src/include/parser/kwlist.h | 2 + src/include/parser/parse_merge.h | 21 + src/include/parser/parse_node.h | 5 +- src/include/parser/parse_relation.h | 3 +- src/include/tcop/cmdtaglist.h | 1 + src/interfaces/libpq/fe-exec.c | 9 +- src/pl/plpgsql/src/pl_exec.c | 7 +- src/pl/plpgsql/src/pl_gram.y | 8 + src/pl/plpgsql/src/pl_unreserved_kwlist.h | 1 + src/pl/plpgsql/src/plpgsql.h | 2 +- src/test/isolation/expected/merge-delete.out | 117 + .../expected/merge-insert-update.out | 94 + .../expected/merge-match-recheck.out | 116 + src/test/isolation/expected/merge-update.out | 314 +++ src/test/isolation/isolation_schedule | 4 + src/test/isolation/specs/merge-delete.spec | 50 + .../isolation/specs/merge-insert-update.spec | 51 + .../isolation/specs/merge-match-recheck.spec | 77 + src/test/isolation/specs/merge-update.spec | 156 ++ src/test/regress/expected/identity.out | 54 + src/test/regress/expected/merge.out | 1934 +++++++++++++++++ src/test/regress/expected/privileges.out | 98 + src/test/regress/expected/rowsecurity.out | 182 ++ src/test/regress/expected/rules.out | 32 + src/test/regress/expected/triggers.out | 48 + src/test/regress/expected/with.out | 133 ++ src/test/regress/parallel_schedule | 2 +- src/test/regress/sql/identity.sql | 46 + src/test/regress/sql/merge.sql | 1273 +++++++++++ src/test/regress/sql/privileges.sql | 108 + src/test/regress/sql/rowsecurity.sql | 156 ++ src/test/regress/sql/rules.sql | 33 + src/test/regress/sql/triggers.sql | 47 + src/test/regress/sql/with.sql | 56 + src/tools/pgindent/typedefs.list | 4 + 95 files changed, 8726 insertions(+), 167 deletions(-) create mode 100644 doc/src/sgml/ref/merge.sgml create mode 100644 src/backend/parser/parse_merge.c create mode 100644 src/include/parser/parse_merge.h create mode 100644 src/test/isolation/expected/merge-delete.out create mode 100644 src/test/isolation/expected/merge-insert-update.out create mode 100644 src/test/isolation/expected/merge-match-recheck.out create mode 100644 src/test/isolation/expected/merge-update.out create mode 100644 src/test/isolation/specs/merge-delete.spec create mode 100644 src/test/isolation/specs/merge-insert-update.spec create mode 100644 src/test/isolation/specs/merge-match-recheck.spec create mode 100644 src/test/isolation/specs/merge-update.spec create mode 100644 src/test/regress/expected/merge.out create mode 100644 src/test/regress/sql/merge.sql diff --git a/contrib/test_decoding/expected/ddl.out b/contrib/test_decoding/expected/ddl.out index 8bb52b559f..1e37c8c897 100644 --- a/contrib/test_decoding/expected/ddl.out +++ b/contrib/test_decoding/expected/ddl.out @@ -192,6 +192,52 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc COMMIT (33 rows) +-- MERGE support +BEGIN; +MERGE INTO replication_example t + USING (SELECT i as id, i as data, i as num FROM generate_series(-20, 5) i) s + ON t.id = s.id + WHEN MATCHED AND t.id < 0 THEN + UPDATE SET somenum = somenum + 1 + WHEN MATCHED AND t.id >= 0 THEN + DELETE + WHEN NOT MATCHED THEN + INSERT VALUES (s.*); +COMMIT; +/* display results */ +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); + data +-------------------------------------------------------------------------------------------------------------------------------------------------- + BEGIN + table public.replication_example: INSERT: id[integer]:-20 somedata[integer]:-20 somenum[integer]:-20 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: INSERT: id[integer]:-19 somedata[integer]:-19 somenum[integer]:-19 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: INSERT: id[integer]:-18 somedata[integer]:-18 somenum[integer]:-18 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: INSERT: id[integer]:-17 somedata[integer]:-17 somenum[integer]:-17 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: INSERT: id[integer]:-16 somedata[integer]:-16 somenum[integer]:-16 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-15 somedata[integer]:-15 somenum[integer]:-14 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-14 somedata[integer]:-14 somenum[integer]:-13 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-13 somedata[integer]:-13 somenum[integer]:-12 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-12 somedata[integer]:-12 somenum[integer]:-11 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-11 somedata[integer]:-11 somenum[integer]:-10 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-10 somedata[integer]:-10 somenum[integer]:-9 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-9 somedata[integer]:-9 somenum[integer]:-8 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-8 somedata[integer]:-8 somenum[integer]:-7 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-7 somedata[integer]:-7 somenum[integer]:-6 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-6 somedata[integer]:-6 somenum[integer]:-5 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-5 somedata[integer]:-5 somenum[integer]:-4 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-4 somedata[integer]:-4 somenum[integer]:-3 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-3 somedata[integer]:-3 somenum[integer]:-2 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-2 somedata[integer]:-2 somenum[integer]:-1 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: UPDATE: id[integer]:-1 somedata[integer]:-1 somenum[integer]:0 zaphod1[integer]:null zaphod2[integer]:null + table public.replication_example: DELETE: id[integer]:0 + table public.replication_example: DELETE: id[integer]:1 + table public.replication_example: DELETE: id[integer]:2 + table public.replication_example: DELETE: id[integer]:3 + table public.replication_example: DELETE: id[integer]:4 + table public.replication_example: DELETE: id[integer]:5 + COMMIT +(28 rows) + CREATE TABLE tr_unique(id2 serial unique NOT NULL, data int); INSERT INTO tr_unique(data) VALUES(10); ALTER TABLE tr_unique RENAME TO tr_pkey; diff --git a/contrib/test_decoding/sql/ddl.sql b/contrib/test_decoding/sql/ddl.sql index ea406b1303..807bc56a45 100644 --- a/contrib/test_decoding/sql/ddl.sql +++ b/contrib/test_decoding/sql/ddl.sql @@ -93,6 +93,22 @@ COMMIT; /* display results */ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +-- MERGE support +BEGIN; +MERGE INTO replication_example t + USING (SELECT i as id, i as data, i as num FROM generate_series(-20, 5) i) s + ON t.id = s.id + WHEN MATCHED AND t.id < 0 THEN + UPDATE SET somenum = somenum + 1 + WHEN MATCHED AND t.id >= 0 THEN + DELETE + WHEN NOT MATCHED THEN + INSERT VALUES (s.*); +COMMIT; + +/* display results */ +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); + CREATE TABLE tr_unique(id2 serial unique NOT NULL, data int); INSERT INTO tr_unique(data) VALUES(10); ALTER TABLE tr_unique RENAME TO tr_pkey; diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index 3998b1781b..70233aa872 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -4125,9 +4125,11 @@ char *PQcmdTuples(PGresult *res); PGresult. This function can only be used following the execution of a SELECT, CREATE TABLE AS, INSERT, UPDATE, DELETE, - MOVE, FETCH, or COPY statement, - or an EXECUTE of a prepared query that contains an - INSERT, UPDATE, or DELETE statement. + MERGE, MOVE, FETCH, + or COPY statement, or an EXECUTE of a + prepared query that contains an INSERT, + UPDATE, DELETE, + or MERGE statement. If the command that generated the PGresult was anything else, returns an empty string. The caller should not free the return value directly. It will be freed when diff --git a/doc/src/sgml/mvcc.sgml b/doc/src/sgml/mvcc.sgml index b4d1e57170..905460723c 100644 --- a/doc/src/sgml/mvcc.sgml +++ b/doc/src/sgml/mvcc.sgml @@ -422,6 +422,37 @@ COMMIT; 11, which no longer matches the criteria. + + MERGE allows the user to specify various + combinations of INSERT, UPDATE + or DELETE subcommands. A MERGE + command with both INSERT and UPDATE + subcommands looks similar to INSERT with an + ON CONFLICT DO UPDATE clause but does not + guarantee that either INSERT or + UPDATE will occur. + If MERGE attempts an UPDATE or + DELETE and the row is concurrently updated but + the join condition still passes for the current target and the + current source tuple, then MERGE will behave + the same as the UPDATE or + DELETE commands and perform its action on the + updated version of the row. However, because MERGE + can specify several actions and they can be conditional, the + conditions for each action are re-evaluated on the updated version of + the row, starting from the first action, even if the action that had + originally matched appears later in the list of actions. + On the other hand, if the row is concurrently updated or deleted so + that the join condition fails, then MERGE will + evaluate the condition's NOT MATCHED actions next, + and execute the first one that succeeds. + If MERGE attempts an INSERT + and a unique index is present and a duplicate row is concurrently + inserted, then a uniqueness violation is raised. + MERGE does not attempt to avoid the + error by executing an UPDATE. + + Because Read Committed mode starts each command with a new snapshot that includes all transactions committed up to that instant, @@ -924,7 +955,8 @@ ERROR: could not serialize access due to read/write dependencies among transact The commands UPDATE, - DELETE, and INSERT + DELETE, INSERT, and + MERGE acquire this lock mode on the target table (in addition to ACCESS SHARE locks on any other referenced tables). In general, this lock mode will be acquired by any diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml index e5c1356d8c..7ebc6593f1 100644 --- a/doc/src/sgml/plpgsql.sgml +++ b/doc/src/sgml/plpgsql.sgml @@ -1388,7 +1388,7 @@ EXECUTE format('SELECT count(*) FROM %I ' Another restriction on parameter symbols is that they only work in optimizable SQL commands (SELECT, INSERT, UPDATE, - DELETE, and certain commands containing one of these). + DELETE, MERGE, and certain commands containing one of these). In other statement types (generically called utility statements), you must insert values textually even if they are just data values. @@ -1666,7 +1666,8 @@ GET DIAGNOSTICS integer_var = ROW_COUNT; - UPDATE, INSERT, and DELETE + UPDATE, INSERT, DELETE, + and MERGE statements set FOUND true if at least one row is affected, false if no row is affected. diff --git a/doc/src/sgml/ref/allfiles.sgml b/doc/src/sgml/ref/allfiles.sgml index d67270ccc3..e90a0e1f83 100644 --- a/doc/src/sgml/ref/allfiles.sgml +++ b/doc/src/sgml/ref/allfiles.sgml @@ -158,6 +158,7 @@ Complete list of usable sgml source files in this directory. + diff --git a/doc/src/sgml/ref/create_policy.sgml b/doc/src/sgml/ref/create_policy.sgml index f898b7a218..e76c342d3d 100644 --- a/doc/src/sgml/ref/create_policy.sgml +++ b/doc/src/sgml/ref/create_policy.sgml @@ -55,7 +55,8 @@ CREATE POLICY name ON - For INSERT and UPDATE statements, + For INSERT, UPDATE, and + MERGE statements, WITH CHECK expressions are enforced after BEFORE triggers are fired, and before any actual data modifications are made. Thus a BEFORE ROW trigger may @@ -281,7 +282,9 @@ CREATE POLICY name ON Using INSERT for a policy means that it will apply - to INSERT commands. Rows being inserted that do + to INSERT commands and MERGE + commands that contain INSERT actions. + Rows being inserted that do not pass this policy will result in a policy violation error, and the entire INSERT command will be aborted. An INSERT policy cannot have @@ -305,7 +308,9 @@ CREATE POLICY name ON UPDATE, SELECT FOR UPDATE and SELECT FOR SHARE commands, as well as auxiliary ON CONFLICT DO UPDATE clauses of - INSERT commands. Since UPDATE + INSERT commands. + MERGE commands containing UPDATE + actions are affected as well. Since UPDATE involves pulling an existing record and replacing it with a new modified record, UPDATE policies accept both a USING expression and @@ -435,7 +440,7 @@ CREATE POLICY name ON - INSERT + INSERT / MERGE ... THEN INSERT New row @@ -459,7 +464,7 @@ CREATE POLICY name ON - UPDATE + UPDATE / MERGE ... THEN UPDATE Existing & new rows @@ -613,6 +618,14 @@ AND (see CREATE VIEW). + + No separate policy exists for MERGE. Instead, the policies + defined for SELECT, INSERT, + UPDATE, and DELETE are applied + while executing MERGE, depending on the actions that are + performed. + + Additional discussion and practical examples can be found in . diff --git a/doc/src/sgml/ref/insert.sgml b/doc/src/sgml/ref/insert.sgml index 2973b72b81..a9af9959c0 100644 --- a/doc/src/sgml/ref/insert.sgml +++ b/doc/src/sgml/ref/insert.sgml @@ -589,6 +589,13 @@ INSERT oid count + + + You may also wish to consider using MERGE, since that + allows mixing INSERT, UPDATE, and + DELETE within a single statement. + See . + @@ -759,7 +766,9 @@ INSERT INTO distributors (did, dname) VALUES (10, 'Conrad International') Also, the case in which a column name list is omitted, but not all the columns are filled from the VALUES clause or query, - is disallowed by the standard. + is disallowed by the standard. If you prefer a more SQL standard + conforming statement than ON CONFLICT, see + . diff --git a/doc/src/sgml/ref/merge.sgml b/doc/src/sgml/ref/merge.sgml new file mode 100644 index 0000000000..c547122c9b --- /dev/null +++ b/doc/src/sgml/ref/merge.sgml @@ -0,0 +1,620 @@ + + + + + + MERGE + 7 + SQL - Language Statements + + + + MERGE + conditionally insert, update, or delete rows of a table + + + + +[ WITH with_query [, ...] ] +MERGE INTO target_table_name [ [ AS ] target_alias ] +USING data_source ON join_condition +when_clause [...] + +where data_source is + +{ source_table_name | ( source_query ) } [ [ AS ] source_alias ] + +and when_clause is + +{ WHEN MATCHED [ AND condition ] THEN { merge_update | merge_delete | DO NOTHING } | + WHEN NOT MATCHED [ AND condition ] THEN { merge_insert | DO NOTHING } } + +and merge_insert is + +INSERT [( column_name [, ...] )] +[ OVERRIDING { SYSTEM | USER } VALUE ] +{ VALUES ( { expression | DEFAULT } [, ...] ) | DEFAULT VALUES } + +and merge_update is + +UPDATE SET { column_name = { expression | DEFAULT } | + ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...] + +and merge_delete is + +DELETE + + + + + Description + + + MERGE performs actions that modify rows in the + target_table_name, + using the data_source. + MERGE provides a single SQL + statement that can conditionally INSERT, + UPDATE or DELETE rows, a task + that would otherwise require multiple procedural language statements. + + + + First, the MERGE command performs a join + from data_source to + target_table_name + producing zero or more candidate change rows. For each candidate change + row, the status of MATCHED or NOT MATCHED + is set just once, after which WHEN clauses are evaluated + in the order specified. For each candidate change row, the first clause to + evaluate as true is executed. No more than one WHEN + clause is executed for any candidate change row. + + + + MERGE actions have the same effect as + regular UPDATE, INSERT, or + DELETE commands of the same names. The syntax of + those commands is different, notably that there is no WHERE + clause and no table name is specified. All actions refer to the + target_table_name, + though modifications to other tables may be made using triggers. + + + + When DO NOTHING is specified, the source row is + skipped. Since actions are evaluated in their specified order, DO + NOTHING can be handy to skip non-interesting source rows before + more fine-grained handling. + + + + There is no separate MERGE privilege. + If you specify an update action, you must have the + UPDATE privilege on the column(s) + of the target_table_name + that are referred to in the SET clause. + If you specify an insert action, you must have the INSERT + privilege on the target_table_name. + If you specify an delete action, you must have the DELETE + privilege on the target_table_name. + Privileges are tested once at statement start and are checked + whether or not particular WHEN clauses are executed. + You will require the SELECT privilege on the + data_source and any column(s) + of the target_table_name + referred to in a condition. + + + + MERGE is not supported if the + target_table_name is a + materialized view, foreign table, or if it has any + rules defined on it. + + + + + Parameters + + + + target_table_name + + + The name (optionally schema-qualified) of the target table to merge into. + + + + + + target_alias + + + A substitute name for the target table. When an alias is + provided, it completely hides the actual name of the table. For + example, given MERGE INTO foo AS f, the remainder of the + MERGE statement must refer to this table as + f not foo. + + + + + + source_table_name + + + The name (optionally schema-qualified) of the source table, view, or + transition table. + + + + + + source_query + + + A query (SELECT statement or VALUES + statement) that supplies the rows to be merged into the + target_table_name. + Refer to the + statement or + statement for a description of the syntax. + + + + + + source_alias + + + A substitute name for the data source. When an alias is + provided, it completely hides the actual name of the table or the fact + that a query was issued. + + + + + + join_condition + + + join_condition is + an expression resulting in a value of type + boolean (similar to a WHERE + clause) that specifies which rows in the + data_source + match rows in the + target_table_name. + + + + Only columns from target_table_name + that attempt to match data_source + rows should appear in join_condition. + join_condition subexpressions that + only reference target_table_name + columns can affect which action is taken, often in surprising ways. + + + + + + + when_clause + + + At least one WHEN clause is required. + + + If the WHEN clause specifies WHEN MATCHED + and the candidate change row matches a row in the + target_table_name, + the WHEN clause is executed if the + condition is + absent or it evaluates to true. + + + Conversely, if the WHEN clause specifies + WHEN NOT MATCHED + and the candidate change row does not match a row in the + target_table_name, + the WHEN clause is executed if the + condition is + absent or it evaluates to true. + + + + + + condition + + + An expression that returns a value of type boolean. + If this expression for a WHEN clause + returns true, then the action for that clause + is executed for that row. + + + A condition on a WHEN MATCHED clause can refer to columns + in both the source and the target relations. A condition on a + WHEN NOT MATCHED clause can only refer to columns from + the source relation, since by definition there is no matching target row. + Only the system attributes from the target table are accessible. + + + + + + merge_insert + + + The specification of an INSERT action that inserts + one row into the target table. + The target column names can be listed in any order. If no list of + column names is given at all, the default is all the columns of the + table in their declared order. + + + Each column not present in the explicit or implicit column list will be + filled with a default value, either its declared default value + or null if there is none. + + + If the expression for any column is not of the correct data type, + automatic type conversion will be attempted. + + + If target_table_name + is a partitioned table, each row is routed to the appropriate partition + and inserted into it. + If target_table_name + is a partition, an error will occur if any input row violates the + partition constraint. + + + Column names may not be specified more than once. + INSERT actions cannot contain sub-selects. + + + Only one VALUES clause can be specified. + The VALUES clause can only refer to columns from + the source relation, since by definition there is no matching target row. + + + + + + merge_update + + + The specification of an UPDATE action that updates + the current row of the target_table_name. + Column names may not be specified more than once. + + + Neither a table name nor a WHERE clause are allowed. + + + + + + merge_delete + + + Specifies a DELETE action that deletes the current row + of the target_table_name. + Do not include the table name or any other clauses, as you would normally + do with a command. + + + + + + column_name + + + The name of a column in the target_table_name. The column name + can be qualified with a subfield name or array subscript, if + needed. (Inserting into only some fields of a composite + column leaves the other fields null.) + Do not include the table's name in the specification + of a target column. + + + + + + OVERRIDING SYSTEM VALUE + + + Without this clause, it is an error to specify an explicit value + (other than DEFAULT) for an identity column defined + as GENERATED ALWAYS. This clause overrides that + restriction. + + + + + + OVERRIDING USER VALUE + + + If this clause is specified, then any values supplied for identity + columns defined as GENERATED BY DEFAULT are ignored + and the default sequence-generated values are applied. + + + + + + DEFAULT VALUES + + + All columns will be filled with their default values. + (An OVERRIDING clause is not permitted in this + form.) + + + + + + expression + + + An expression to assign to the column. If used in a + WHEN MATCHED clause, the expression can use values + from the original row in the target table, and values from the + data_source row. + If used in a WHEN NOT MATCHED clause, the + expression can use values from the data_source. + + + + + + DEFAULT + + + Set the column to its default value (which will be NULL + if no specific default expression has been assigned to it). + + + + + + with_query + + + The WITH clause allows you to specify one or more + subqueries that can be referenced by name in the MERGE + query. See and + for details. + + + + + + + + + Outputs + + + On successful completion, a MERGE command returns a command + tag of the form + +MERGE total_count + + The total_count is the total + number of rows changed (whether inserted, updated, or deleted). + If total_count is 0, no rows + were changed in any way. + + + + + + Notes + + + The following steps take place during the execution of + MERGE. + + + + Perform any BEFORE STATEMENT triggers for all + actions specified, whether or not their WHEN + clauses match. + + + + + Perform a join from source to target table. + The resulting query will be optimized normally and will produce + a set of candidate change rows. For each candidate change row, + + + + Evaluate whether each row is MATCHED or + NOT MATCHED. + + + + + Test each WHEN condition in the order + specified until one returns true. + + + + + When a condition returns true, perform the following actions: + + + + Perform any BEFORE ROW triggers that fire + for the action's event type. + + + + + Perform the specified action, invoking any check constraints on the + target table. + + + + + Perform any AFTER ROW triggers that fire for + the action's event type. + + + + + + + + + + + Perform any AFTER STATEMENT triggers for actions + specified, whether or not they actually occur. This is similar to the + behavior of an UPDATE statement that modifies no rows. + + + + In summary, statement triggers for an event type (say, + INSERT) will be fired whenever we + specify an action of that kind. + In contrast, row-level triggers will fire only for the specific event type + being executed. + So a MERGE command might fire statement triggers for both + UPDATE and INSERT, even though only + UPDATE row triggers were fired. + + + + You should ensure that the join produces at most one candidate change row + for each target row. In other words, a target row shouldn't join to more + than one data source row. If it does, then only one of the candidate change + rows will be used to modify the target row; later attempts to modify the + row will cause an error. + This can also occur if row triggers make changes to the target table + and the rows so modified are then subsequently also modified by + MERGE. + If the repeated action is an INSERT, this will + cause a uniqueness violation, while a repeated UPDATE + or DELETE will cause a cardinality violation; the + latter behavior is required by the SQL standard. + This differs from historical PostgreSQL + behavior of joins in UPDATE and + DELETE statements where second and subsequent + attempts to modify the same row are simply ignored. + + + + If a WHEN clause omits an AND + sub-clause, it becomes the final reachable clause of that + kind (MATCHED or NOT MATCHED). + If a later WHEN clause of that kind + is specified it would be provably unreachable and an error is raised. + If no final reachable clause is specified of either kind, it is + possible that no action will be taken for a candidate change row. + + + + The order in which rows are generated from the data source is + indeterminate by default. + A source_query can be + used to specify a consistent ordering, if required, which might be + needed to avoid deadlocks between concurrent transactions. + + + + There is no RETURNING clause with + MERGE. Actions of INSERT, + UPDATE and DELETE cannot contain + RETURNING or WITH clauses. + + + + You may also wish to consider using INSERT ... ON CONFLICT + as an alternative statement which offers the ability to run an + UPDATE if a concurrent INSERT + occurs. There are a variety of differences and restrictions between + the two statement types and they are not interchangeable. + + + + + Examples + + + Perform maintenance on CustomerAccounts based + upon new Transactions. + + +MERGE INTO CustomerAccount CA +USING RecentTransactions T +ON T.CustomerId = CA.CustomerId +WHEN MATCHED THEN + UPDATE SET Balance = Balance + TransactionValue +WHEN NOT MATCHED THEN + INSERT (CustomerId, Balance) + VALUES (T.CustomerId, T.TransactionValue); + + + + + Notice that this would be exactly equivalent to the following + statement because the MATCHED result does not change + during execution. + + +MERGE INTO CustomerAccount CA +USING (Select CustomerId, TransactionValue From RecentTransactions) AS T +ON CA.CustomerId = T.CustomerId +WHEN NOT MATCHED THEN + INSERT (CustomerId, Balance) + VALUES (T.CustomerId, T.TransactionValue) +WHEN MATCHED THEN + UPDATE SET Balance = Balance + TransactionValue; + + + + + Attempt to insert a new stock item along with the quantity of stock. If + the item already exists, instead update the stock count of the existing + item. Don't allow entries that have zero stock. + +MERGE INTO wines w +USING wine_stock_changes s +ON s.winename = w.winename +WHEN NOT MATCHED AND s.stock_delta > 0 THEN + INSERT VALUES(s.winename, s.stock_delta) +WHEN MATCHED AND w.stock + s.stock_delta > 0 THEN + UPDATE SET stock = w.stock + s.stock_delta; +WHEN MATCHED THEN + DELETE; + + + The wine_stock_changes table might be, for example, a + temporary table recently loaded into the database. + + + + + + Compatibility + + This command conforms to the SQL standard. + + + The WITH clause and DO NOTHING action are extensions to + the SQL standard. + + + diff --git a/doc/src/sgml/reference.sgml b/doc/src/sgml/reference.sgml index da421ff24e..a3b743e8c1 100644 --- a/doc/src/sgml/reference.sgml +++ b/doc/src/sgml/reference.sgml @@ -186,6 +186,7 @@ &listen; &load; &lock; + &merge; &move; ¬ify; &prepare; diff --git a/doc/src/sgml/trigger.sgml b/doc/src/sgml/trigger.sgml index 7e2654493b..04e702a795 100644 --- a/doc/src/sgml/trigger.sgml +++ b/doc/src/sgml/trigger.sgml @@ -192,6 +192,28 @@ will be fired. + + No separate triggers are defined for MERGE. Instead, + statement-level or row-level UPDATE, + DELETE, and INSERT triggers are fired + depending on (for statement-level triggers) what actions are specified in + the MERGE query and (for row-level triggers) what + actions are performed. + + + + While running a MERGE command, statement-level + BEFORE and AFTER triggers are + fired for events specified in the actions of the MERGE + command, irrespective of whether or not the action is ultimately performed. + This is the same as an UPDATE statement that updates + no rows, yet statement-level triggers are fired. + The row-level triggers are fired only when a row is actually updated, + inserted or deleted. So it's perfectly legal that while statement-level + triggers are fired for certain types of action, no row-level triggers + are fired for the same kind of action. + + Trigger functions invoked by per-statement triggers should always return NULL. Trigger functions invoked by per-row diff --git a/src/backend/catalog/sql_features.txt b/src/backend/catalog/sql_features.txt index 097d9c4784..4c3e29111d 100644 --- a/src/backend/catalog/sql_features.txt +++ b/src/backend/catalog/sql_features.txt @@ -240,9 +240,9 @@ F311 Schema definition statement 02 CREATE TABLE for persistent base tables YES F311 Schema definition statement 03 CREATE VIEW YES F311 Schema definition statement 04 CREATE VIEW: WITH CHECK OPTION YES F311 Schema definition statement 05 GRANT statement YES -F312 MERGE statement NO consider INSERT ... ON CONFLICT DO UPDATE -F313 Enhanced MERGE statement NO -F314 MERGE statement with DELETE branch NO +F312 MERGE statement YES +F313 Enhanced MERGE statement YES +F314 MERGE statement with DELETE branch YES F321 User authorization YES F341 Usage tables YES F361 Subprogram support YES diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 9f632285b6..cb13227db1 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -1188,6 +1188,9 @@ ExplainNode(PlanState *planstate, List *ancestors, case CMD_DELETE: pname = operation = "Delete"; break; + case CMD_MERGE: + pname = operation = "Merge"; + break; default: pname = "???"; break; @@ -3877,6 +3880,11 @@ show_modifytable_info(ModifyTableState *mtstate, List *ancestors, operation = "Delete"; foperation = "Foreign Delete"; break; + case CMD_MERGE: + operation = "Merge"; + /* XXX unsupported for now, but avoid compiler noise */ + foperation = "Foreign Merge"; + break; default: operation = "???"; foperation = "Foreign ???"; @@ -3999,6 +4007,33 @@ show_modifytable_info(ModifyTableState *mtstate, List *ancestors, other_path, 0, es); } } + else if (node->operation == CMD_MERGE) + { + /* EXPLAIN ANALYZE display of tuples processed */ + if (es->analyze && mtstate->ps.instrument) + { + double total; + double insert_path; + double update_path; + double delete_path; + double skipped_path; + + InstrEndLoop(outerPlanState(mtstate)->instrument); + + /* count the number of source rows */ + total = outerPlanState(mtstate)->instrument->ntuples; + insert_path = mtstate->mt_merge_inserted; + update_path = mtstate->mt_merge_updated; + delete_path = mtstate->mt_merge_deleted; + skipped_path = total - insert_path - update_path - delete_path; + Assert(skipped_path >= 0); + + ExplainPropertyFloat("Tuples Inserted", NULL, insert_path, 0, es); + ExplainPropertyFloat("Tuples Updated", NULL, update_path, 0, es); + ExplainPropertyFloat("Tuples Deleted", NULL, delete_path, 0, es); + ExplainPropertyFloat("Tuples Skipped", NULL, skipped_path, 0, es); + } + } if (labeltargets) ExplainCloseGroup("Target Tables", "Target Tables", false, es); diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index fce79b02a5..13cb516752 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -84,7 +84,8 @@ static bool GetTupleForTrigger(EState *estate, ItemPointer tid, LockTupleMode lockmode, TupleTableSlot *oldslot, - TupleTableSlot **newSlot); + TupleTableSlot **newSlot, + TM_FailureData *tmfpd); static bool TriggerEnabled(EState *estate, ResultRelInfo *relinfo, Trigger *trigger, TriggerEvent event, Bitmapset *modifiedCols, @@ -2713,7 +2714,8 @@ ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, TupleTableSlot *epqslot_candidate = NULL; if (!GetTupleForTrigger(estate, epqstate, relinfo, tupleid, - LockTupleExclusive, slot, &epqslot_candidate)) + LockTupleExclusive, slot, &epqslot_candidate, + NULL)) return false; /* @@ -2728,7 +2730,6 @@ ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, } trigtuple = ExecFetchSlotHeapTuple(slot, true, &should_free); - } else { @@ -2804,6 +2805,7 @@ ExecARDeleteTriggers(EState *estate, tupleid, LockTupleExclusive, slot, + NULL, NULL); else ExecForceStoreHeapTuple(fdw_trigtuple, slot, false); @@ -2944,7 +2946,8 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, ResultRelInfo *relinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, - TupleTableSlot *newslot) + TupleTableSlot *newslot, + TM_FailureData *tmfd) { TriggerDesc *trigdesc = relinfo->ri_TrigDesc; TupleTableSlot *oldslot = ExecGetTriggerOldSlot(estate, relinfo); @@ -2967,7 +2970,8 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, /* get a copy of the on-disk tuple we are planning to update */ if (!GetTupleForTrigger(estate, epqstate, relinfo, tupleid, - lockmode, oldslot, &epqslot_candidate)) + lockmode, oldslot, &epqslot_candidate, + tmfd)) return false; /* cancel the update action */ /* @@ -3121,6 +3125,7 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, tupleid, LockTupleExclusive, oldslot, + NULL, NULL); else if (fdw_trigtuple != NULL) ExecForceStoreHeapTuple(fdw_trigtuple, oldslot, false); @@ -3275,7 +3280,8 @@ GetTupleForTrigger(EState *estate, ItemPointer tid, LockTupleMode lockmode, TupleTableSlot *oldslot, - TupleTableSlot **epqslot) + TupleTableSlot **epqslot, + TM_FailureData *tmfdp) { Relation relation = relinfo->ri_RelationDesc; @@ -3301,6 +3307,10 @@ GetTupleForTrigger(EState *estate, lockflags, &tmfd); + /* Let the caller know about the status of this operation */ + if (tmfdp) + *tmfdp = tmfd; + switch (test) { case TM_SelfModified: @@ -3821,8 +3831,23 @@ struct AfterTriggersTableData bool before_trig_done; /* did we already queue BS triggers? */ bool after_trig_done; /* did we already queue AS triggers? */ AfterTriggerEventList after_trig_events; /* if so, saved list pointer */ - Tuplestorestate *old_tuplestore; /* "old" transition table, if any */ - Tuplestorestate *new_tuplestore; /* "new" transition table, if any */ + + /* + * We maintain separate transition tables for UPDATE/INSERT/DELETE since + * MERGE can run all three actions in a single statement. Note that UPDATE + * needs both old and new transition tables whereas INSERT needs only new, + * and DELETE needs only old. + */ + + /* "old" transition table for UPDATE, if any */ + Tuplestorestate *old_upd_tuplestore; + /* "new" transition table for UPDATE, if any */ + Tuplestorestate *new_upd_tuplestore; + /* "old" transition table for DELETE, if any */ + Tuplestorestate *old_del_tuplestore; + /* "new" transition table for INSERT, if any */ + Tuplestorestate *new_ins_tuplestore; + TupleTableSlot *storeslot; /* for converting to tuplestore's format */ }; @@ -4374,13 +4399,19 @@ AfterTriggerExecute(EState *estate, { if (LocTriggerData.tg_trigger->tgoldtable) { - LocTriggerData.tg_oldtable = evtshared->ats_table->old_tuplestore; + if (TRIGGER_FIRED_BY_UPDATE(evtshared->ats_event)) + LocTriggerData.tg_oldtable = evtshared->ats_table->old_upd_tuplestore; + else + LocTriggerData.tg_oldtable = evtshared->ats_table->old_del_tuplestore; evtshared->ats_table->closed = true; } if (LocTriggerData.tg_trigger->tgnewtable) { - LocTriggerData.tg_newtable = evtshared->ats_table->new_tuplestore; + if (TRIGGER_FIRED_BY_INSERT(evtshared->ats_event)) + LocTriggerData.tg_newtable = evtshared->ats_table->new_ins_tuplestore; + else + LocTriggerData.tg_newtable = evtshared->ats_table->new_upd_tuplestore; evtshared->ats_table->closed = true; } } @@ -4794,8 +4825,10 @@ TransitionCaptureState * MakeTransitionCaptureState(TriggerDesc *trigdesc, Oid relid, CmdType cmdType) { TransitionCaptureState *state; - bool need_old, - need_new; + bool need_old_upd, + need_new_upd, + need_old_del, + need_new_ins; AfterTriggersTableData *table; MemoryContext oldcxt; ResourceOwner saveResourceOwner; @@ -4807,23 +4840,31 @@ MakeTransitionCaptureState(TriggerDesc *trigdesc, Oid relid, CmdType cmdType) switch (cmdType) { case CMD_INSERT: - need_old = false; - need_new = trigdesc->trig_insert_new_table; + need_old_upd = need_old_del = need_new_upd = false; + need_new_ins = trigdesc->trig_insert_new_table; break; case CMD_UPDATE: - need_old = trigdesc->trig_update_old_table; - need_new = trigdesc->trig_update_new_table; + need_old_upd = trigdesc->trig_update_old_table; + need_new_upd = trigdesc->trig_update_new_table; + need_old_del = need_new_ins = false; break; case CMD_DELETE: - need_old = trigdesc->trig_delete_old_table; - need_new = false; + need_old_del = trigdesc->trig_delete_old_table; + need_old_upd = need_new_upd = need_new_ins = false; + break; + case CMD_MERGE: + need_old_upd = trigdesc->trig_update_old_table; + need_new_upd = trigdesc->trig_update_new_table; + need_old_del = trigdesc->trig_delete_old_table; + need_new_ins = trigdesc->trig_insert_new_table; break; default: elog(ERROR, "unexpected CmdType: %d", (int) cmdType); - need_old = need_new = false; /* keep compiler quiet */ + /* keep compiler quiet */ + need_old_upd = need_new_upd = need_old_del = need_new_ins = false; break; } - if (!need_old && !need_new) + if (!need_old_upd && !need_new_upd && !need_new_ins && !need_old_del) return NULL; /* Check state, like AfterTriggerSaveEvent. */ @@ -4853,10 +4894,14 @@ MakeTransitionCaptureState(TriggerDesc *trigdesc, Oid relid, CmdType cmdType) saveResourceOwner = CurrentResourceOwner; CurrentResourceOwner = CurTransactionResourceOwner; - if (need_old && table->old_tuplestore == NULL) - table->old_tuplestore = tuplestore_begin_heap(false, false, work_mem); - if (need_new && table->new_tuplestore == NULL) - table->new_tuplestore = tuplestore_begin_heap(false, false, work_mem); + if (need_old_upd && table->old_upd_tuplestore == NULL) + table->old_upd_tuplestore = tuplestore_begin_heap(false, false, work_mem); + if (need_new_upd && table->new_upd_tuplestore == NULL) + table->new_upd_tuplestore = tuplestore_begin_heap(false, false, work_mem); + if (need_old_del && table->old_del_tuplestore == NULL) + table->old_del_tuplestore = tuplestore_begin_heap(false, false, work_mem); + if (need_new_ins && table->new_ins_tuplestore == NULL) + table->new_ins_tuplestore = tuplestore_begin_heap(false, false, work_mem); CurrentResourceOwner = saveResourceOwner; MemoryContextSwitchTo(oldcxt); @@ -5045,12 +5090,20 @@ AfterTriggerFreeQuery(AfterTriggersQueryData *qs) { AfterTriggersTableData *table = (AfterTriggersTableData *) lfirst(lc); - ts = table->old_tuplestore; - table->old_tuplestore = NULL; + ts = table->old_upd_tuplestore; + table->old_upd_tuplestore = NULL; + if (ts) + tuplestore_end(ts); + ts = table->new_upd_tuplestore; + table->new_upd_tuplestore = NULL; + if (ts) + tuplestore_end(ts); + ts = table->old_del_tuplestore; + table->old_del_tuplestore = NULL; if (ts) tuplestore_end(ts); - ts = table->new_tuplestore; - table->new_tuplestore = NULL; + ts = table->new_ins_tuplestore; + table->new_ins_tuplestore = NULL; if (ts) tuplestore_end(ts); if (table->storeslot) @@ -5356,17 +5409,17 @@ GetAfterTriggersTransitionTable(int event, { Assert(TupIsNull(newslot)); if (event == TRIGGER_EVENT_DELETE && delete_old_table) - tuplestore = transition_capture->tcs_private->old_tuplestore; + tuplestore = transition_capture->tcs_private->old_del_tuplestore; else if (event == TRIGGER_EVENT_UPDATE && update_old_table) - tuplestore = transition_capture->tcs_private->old_tuplestore; + tuplestore = transition_capture->tcs_private->old_upd_tuplestore; } else if (!TupIsNull(newslot)) { Assert(TupIsNull(oldslot)); if (event == TRIGGER_EVENT_INSERT && insert_new_table) - tuplestore = transition_capture->tcs_private->new_tuplestore; + tuplestore = transition_capture->tcs_private->new_ins_tuplestore; else if (event == TRIGGER_EVENT_UPDATE && update_new_table) - tuplestore = transition_capture->tcs_private->new_tuplestore; + tuplestore = transition_capture->tcs_private->new_upd_tuplestore; } return tuplestore; @@ -5980,6 +6033,7 @@ AfterTriggerSaveEvent(EState *estate, ResultRelInfo *relinfo, */ if (row_trigger && transition_capture != NULL) { + TupleTableSlot *original_insert_tuple = transition_capture->tcs_original_insert_tuple; /* * Capture the old tuple in the appropriate transition table based on @@ -6010,17 +6064,15 @@ AfterTriggerSaveEvent(EState *estate, ResultRelInfo *relinfo, newslot, transition_capture); TransitionTableAddTuple(estate, transition_capture, relinfo, - newslot, - transition_capture->tcs_original_insert_tuple, - new_tuplestore); + newslot, original_insert_tuple, new_tuplestore); } /* * If transition tables are the only reason we're here, return. As * mentioned above, we can also be here during update tuple routing in * presence of transition tables, in which case this function is - * called separately for oldtup and newtup, so we expect exactly one - * of them to be NULL. + * called separately for OLD and NEW, so we expect exactly one of them + * to be NULL. */ if (trigdesc == NULL || (event == TRIGGER_EVENT_DELETE && !trigdesc->trig_delete_after_row) || diff --git a/src/backend/executor/README b/src/backend/executor/README index bf5e70860d..0b5183fc4a 100644 --- a/src/backend/executor/README +++ b/src/backend/executor/README @@ -39,7 +39,7 @@ columns, combine the values into a new row, and apply the update. (For a heap table, the row-identity junk column is a CTID, but other things may be used for other table types.) For DELETE, the plan tree need only deliver junk row-identity column(s), and the ModifyTable node visits each of those -rows and marks the row deleted. +rows and marks the row deleted. MERGE is described below. XXX a great deal more documentation needs to be written here... @@ -223,6 +223,45 @@ fast-path step types (EEOP_ASSIGN_*_VAR) to handle targetlist entries that are simple Vars using only one step instead of two. +MERGE +----- + +MERGE is a multiple-table, multiple-action command: It specifies a target +table and a source relation, and can contain multiple WHEN MATCHED and +WHEN NOT MATCHED clauses, each of which specifies one UPDATE, INSERT, +UPDATE, or DO NOTHING actions. The target table is modified by MERGE, +and the source relation supplies additional data for the actions. Each action +optionally specifies a qualifying expression that is evaluated for each tuple. + +In the planner, transform_MERGE_to_join constructs a join between the target +table and the source relation, with row-identifying junk columns from the target +table. This join is an outer join if the MERGE command contains any WHEN NOT +MATCHED clauses; the ModifyTable node fetches tuples from the plan tree of that +join. If the row-identifying columns in the fetched tuple are NULL, then the +source relation contains a tuple that is not matched by any tuples in the +target table, so the qualifying expression for each WHEN NOT MATCHED clause is +evaluated given that tuple as returned by the plan. If the expression returns +true, the action indicated by the clause is executed, and no further clauses +are evaluated. On the other hand, if the row-identifying columns are not +NULL, then the matching tuple from the target table can be fetched; qualifying +expression of each WHEN MATCHED clause is evaluated given both the fetched +tuple and the tuple returned by the plan. + +If no WHEN NOT MATCHED clauses are present, then the join constructed by +the planner is an inner join, and the row-identifying junk columns are +always non NULL. + +If WHEN MATCHED ends up processing a row that is concurrently updated or deleted, +EvalPlanQual (see below) is used to find the latest version of the row, and +that is re-fetched; if it exists, the search for a matching WHEN MATCHED clause +to use starts at the top. + +MERGE does not allow its own type of triggers, but instead fires UPDATE, DELETE, +and INSERT triggers: row triggers are fired for each row when an action is +executed for that row. Statement triggers are fired always, regardless of +whether any rows match the corresponding clauses. + + Memory Management ----------------- diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 473d2e00a2..ef2fd46092 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -233,6 +233,7 @@ standard_ExecutorStart(QueryDesc *queryDesc, int eflags) case CMD_INSERT: case CMD_DELETE: case CMD_UPDATE: + case CMD_MERGE: estate->es_output_cid = GetCurrentCommandId(true); break; @@ -1244,6 +1245,8 @@ InitResultRelInfo(ResultRelInfo *resultRelInfo, resultRelInfo->ri_ReturningSlot = NULL; resultRelInfo->ri_TrigOldSlot = NULL; resultRelInfo->ri_TrigNewSlot = NULL; + resultRelInfo->ri_matchedMergeAction = NIL; + resultRelInfo->ri_notMatchedMergeAction = NIL; /* * Only ExecInitPartitionInfo() and ExecInitPartitionDispatchInfo() pass @@ -2142,6 +2145,19 @@ ExecWithCheckOptions(WCOKind kind, ResultRelInfo *resultRelInfo, errmsg("new row violates row-level security policy for table \"%s\"", wco->relname))); break; + case WCO_RLS_MERGE_UPDATE_CHECK: + case WCO_RLS_MERGE_DELETE_CHECK: + if (wco->polname != NULL) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"", + wco->polname, wco->relname))); + else + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("target row violates row-level security policy (USING expression) for table \"%s\"", + wco->relname))); + break; case WCO_RLS_CONFLICT_CHECK: if (wco->polname != NULL) ereport(ERROR, diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c index 90ed1485d1..aca42ca5b8 100644 --- a/src/backend/executor/execPartition.c +++ b/src/backend/executor/execPartition.c @@ -20,6 +20,7 @@ #include "catalog/pg_type.h" #include "executor/execPartition.h" #include "executor/executor.h" +#include "executor/nodeModifyTable.h" #include "foreign/fdwapi.h" #include "mb/pg_wchar.h" #include "miscadmin.h" @@ -182,6 +183,7 @@ static char *ExecBuildSlotPartitionKeyDescription(Relation rel, bool *isnull, int maxfieldlen); static List *adjust_partition_colnos(List *colnos, ResultRelInfo *leaf_part_rri); +static List *adjust_partition_colnos_using_map(List *colnos, AttrMap *attrMap); static void ExecInitPruningContext(PartitionPruneContext *context, List *pruning_steps, PartitionDesc partdesc, @@ -853,6 +855,99 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, lappend(estate->es_tuple_routing_result_relations, leaf_part_rri); + /* + * Initialize information about this partition that's needed to handle + * MERGE. We take the "first" result relation's mergeActionList as + * reference and make copy for this relation, converting stuff that + * references attribute numbers to match this relation's. + * + * This duplicates much of the logic in ExecInitMerge(), so something + * changes there, look here too. + */ + if (node && node->operation == CMD_MERGE) + { + List *firstMergeActionList = linitial(node->mergeActionLists); + ListCell *lc; + ExprContext *econtext = mtstate->ps.ps_ExprContext; + + if (part_attmap == NULL) + part_attmap = + build_attrmap_by_name(RelationGetDescr(partrel), + RelationGetDescr(firstResultRel)); + + if (unlikely(!leaf_part_rri->ri_projectNewInfoValid)) + ExecInitMergeTupleSlots(mtstate, leaf_part_rri); + + foreach(lc, firstMergeActionList) + { + /* Make a copy for this relation to be safe. */ + MergeAction *action = copyObject(lfirst(lc)); + MergeActionState *action_state; + List **list; + + /* Generate the action's state for this relation */ + action_state = makeNode(MergeActionState); + action_state->mas_action = action; + + /* And put the action in the appropriate list */ + if (action->matched) + list = &leaf_part_rri->ri_matchedMergeAction; + else + list = &leaf_part_rri->ri_notMatchedMergeAction; + *list = lappend(*list, action_state); + + switch (action->commandType) + { + case CMD_INSERT: + + /* + * ExecCheckPlanOutput() already done on the targetlist + * when "first" result relation initialized and it is same + * for all result relations. + */ + action_state->mas_proj = + ExecBuildProjectionInfo(action->targetList, econtext, + leaf_part_rri->ri_newTupleSlot, + &mtstate->ps, + RelationGetDescr(partrel)); + break; + case CMD_UPDATE: + + /* + * Convert updateColnos from "first" result relation + * attribute numbers to this result rel's. + */ + if (part_attmap) + action->updateColnos = + adjust_partition_colnos_using_map(action->updateColnos, + part_attmap); + action_state->mas_proj = + ExecBuildUpdateProjection(action->targetList, + true, + action->updateColnos, + RelationGetDescr(leaf_part_rri->ri_RelationDesc), + econtext, + leaf_part_rri->ri_newTupleSlot, + NULL); + break; + case CMD_DELETE: + break; + + default: + elog(ERROR, "unknown action in MERGE WHEN clause"); + } + + /* found_whole_row intentionally ignored. */ + action->qual = + map_variable_attnos(action->qual, + firstVarno, 0, + part_attmap, + RelationGetForm(partrel)->reltype, + &found_whole_row); + action_state->mas_whenqual = + ExecInitQual((List *) action->qual, &mtstate->ps); + } + } MemoryContextSwitchTo(oldcxt); return leaf_part_rri; @@ -1433,13 +1528,23 @@ ExecBuildSlotPartitionKeyDescription(Relation rel, static List * adjust_partition_colnos(List *colnos, ResultRelInfo *leaf_part_rri) { - List *new_colnos = NIL; TupleConversionMap *map = ExecGetChildToRootMap(leaf_part_rri); - AttrMap *attrMap; + + return adjust_partition_colnos_using_map(colnos, map->attrMap); +} + +/* + * adjust_partition_colnos_using_map + * Like adjust_partition_colnos, but uses a caller-supplied map instead + * of assuming to map from the "root" result relation. + */ +static List * +adjust_partition_colnos_using_map(List *colnos, AttrMap *attrMap) +{ + List *new_colnos = NIL; ListCell *lc; - Assert(map != NULL); /* else we shouldn't be here */ - attrMap = map->attrMap; + Assert(attrMap != NULL); /* else we shouldn't be here */ foreach(lc, colnos) { diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c index 1a4fbdc38c..228e354701 100644 --- a/src/backend/executor/execReplication.c +++ b/src/backend/executor/execReplication.c @@ -486,7 +486,7 @@ ExecSimpleRelationUpdate(ResultRelInfo *resultRelInfo, resultRelInfo->ri_TrigDesc->trig_update_before_row) { if (!ExecBRUpdateTriggers(estate, epqstate, resultRelInfo, - tid, NULL, slot)) + tid, NULL, slot, NULL)) skip_tuple = true; /* "do nothing" */ } diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 701fe05296..171575cd73 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -24,11 +24,20 @@ * values plus row-locating info for UPDATE and MERGE cases, or just the * row-locating info for DELETE cases. * + * MERGE runs a join between the source relation and the target + * table; if any WHEN NOT MATCHED clauses are present, then the + * join is an outer join. In this case, any unmatched tuples will + * have NULL row-locating info, and only INSERT can be run. But for + * matched tuples, then row-locating info is used to determine the + * tuple to UPDATE or DELETE. When all clauses are WHEN MATCHED, + * then an inner join is used, so all tuples contain row-locating info. + * * If the query specifies RETURNING, then the ModifyTable returns a * RETURNING tuple after completing each row insert, update, or delete. * It must be called again to continue the operation. Without RETURNING, * we just loop within the node until all the work is done, then - * return NULL. This avoids useless call/return overhead. + * return NULL. This avoids useless call/return overhead. (MERGE does + * not support RETURNING.) */ #include "postgres.h" @@ -78,6 +87,17 @@ typedef struct ModifyTableContext */ TupleTableSlot *planSlot; + /* + * During EvalPlanQual, project and return the new version of the new + * tuple + */ + TupleTableSlot *(*GetUpdateNewTuple) (ResultRelInfo *resultRelInfo, + TupleTableSlot *epqslot, + TupleTableSlot *oldSlot, + MergeActionState *relaction); + + /* MERGE specific */ + MergeActionState *relaction; /* MERGE action in progress */ /* * Information about the changes that were made concurrently to a tuple @@ -140,6 +160,28 @@ static TupleTableSlot *ExecPrepareTupleRouting(ModifyTableState *mtstate, ResultRelInfo *targetRelInfo, TupleTableSlot *slot, ResultRelInfo **partRelInfo); +static TupleTableSlot *internalGetUpdateNewTuple(ResultRelInfo *relinfo, + TupleTableSlot *planSlot, + TupleTableSlot *oldSlot, + MergeActionState *relaction); + +static TupleTableSlot *ExecMerge(ModifyTableContext *context, + ResultRelInfo *resultRelInfo, + ItemPointer tupleid, + bool canSetTag); +static void ExecInitMerge(ModifyTableState *mtstate, EState *estate); +static bool ExecMergeMatched(ModifyTableContext *context, + ResultRelInfo *resultRelInfo, + ItemPointer tupleid, + bool canSetTag); +static void ExecMergeNotMatched(ModifyTableContext *context, + ResultRelInfo *resultRelInfo, + bool canSetTag); +static TupleTableSlot *mergeGetUpdateNewTuple(ResultRelInfo *relinfo, + TupleTableSlot *planSlot, + TupleTableSlot *oldSlot, + MergeActionState *relaction); + /* * Verify that the tuples to be produced by INSERT match the @@ -616,21 +658,32 @@ ExecGetUpdateNewTuple(ResultRelInfo *relinfo, TupleTableSlot *planSlot, TupleTableSlot *oldSlot) { - ProjectionInfo *newProj = relinfo->ri_projectNew; - ExprContext *econtext; - /* Use a few extra Asserts to protect against outside callers */ Assert(relinfo->ri_projectNewInfoValid); Assert(planSlot != NULL && !TTS_EMPTY(planSlot)); Assert(oldSlot != NULL && !TTS_EMPTY(oldSlot)); + return internalGetUpdateNewTuple(relinfo, planSlot, oldSlot, NULL); +} + +/* + * Callback for ModifyTableState->GetUpdateNewTuple for use by regular UPDATE. + */ +static TupleTableSlot * +internalGetUpdateNewTuple(ResultRelInfo *relinfo, + TupleTableSlot *planSlot, + TupleTableSlot *oldSlot, + MergeActionState *relaction) +{ + ProjectionInfo *newProj = relinfo->ri_projectNew; + ExprContext *econtext; + econtext = newProj->pi_exprContext; econtext->ecxt_outertuple = planSlot; econtext->ecxt_scantuple = oldSlot; return ExecProject(newProj); } - /* ---------------------------------------------------------------- * ExecInsert * @@ -847,9 +900,17 @@ ExecInsert(ModifyTableContext *context, * partition, we should instead check UPDATE policies, because we are * executing policies defined on the target table, and not those * defined on the child partitions. + * + * If we're running MERGE, we refer to the action that we're executing + * to know if we're doing an INSERT or UPDATE to a partition table. */ - wco_kind = (mtstate->operation == CMD_UPDATE) ? - WCO_RLS_UPDATE_CHECK : WCO_RLS_INSERT_CHECK; + if (mtstate->operation == CMD_UPDATE) + wco_kind = WCO_RLS_UPDATE_CHECK; + else if (mtstate->operation == CMD_MERGE) + wco_kind = (context->relaction->mas_action->commandType == CMD_UPDATE) ? + WCO_RLS_UPDATE_CHECK : WCO_RLS_INSERT_CHECK; + else + wco_kind = WCO_RLS_INSERT_CHECK; /* * ExecWithCheckOptions() will skip any WCOs which are not of the kind @@ -1453,7 +1514,13 @@ ldelete:; ereport(ERROR, (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), errmsg("could not serialize access due to concurrent delete"))); - /* tuple already deleted; nothing to do */ + + /* + * tuple already deleted; nothing to do. But MERGE might want + * to handle it differently. We've already filled-in + * actionInfo with sufficient information for MERGE to look + * at. + */ return NULL; default: @@ -1659,7 +1726,8 @@ ExecCrossPartitionUpdate(ModifyTableContext *context, elog(ERROR, "failed to fetch tuple being updated"); /* and project the new tuple to retry the UPDATE with */ context->cpUpdateRetrySlot = - ExecGetUpdateNewTuple(resultRelInfo, epqslot, oldSlot); + context->GetUpdateNewTuple(resultRelInfo, epqslot, oldSlot, + context->relaction); return false; } } @@ -1718,7 +1786,8 @@ ExecUpdatePrologue(ModifyTableContext *context, ResultRelInfo *resultRelInfo, if (resultRelInfo->ri_TrigDesc && resultRelInfo->ri_TrigDesc->trig_update_before_row) return ExecBRUpdateTriggers(context->estate, context->epqstate, - resultRelInfo, tupleid, oldtuple, slot); + resultRelInfo, tupleid, oldtuple, slot, + &context->tmfd); return true; } @@ -1864,6 +1933,13 @@ lreplace:; return TM_Ok; } + /* + * No luck, a retry is needed. If running MERGE, we do not do so + * here; instead let it handle that on its own rules. + */ + if (context->relaction != NULL) + return TM_Updated; + /* * ExecCrossPartitionUpdate installed an updated version of the new * tuple in the retry slot; start over. @@ -2109,8 +2185,8 @@ ExecUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, /* * If ExecUpdateAct reports that a cross-partition update was done, - * then the returning tuple has been projected and there's nothing - * else for us to do. + * then the RETURNING tuple (if any) has been projected and there's + * nothing else for us to do. */ if (updateCxt.crossPartUpdate) return context->cpUpdateReturningSlot; @@ -2337,9 +2413,9 @@ ExecOnConflictUpdate(ModifyTableContext *context, * to break. * * It is the user's responsibility to prevent this situation from - * occurring. These problems are why SQL-2003 similarly specifies - * that for SQL MERGE, an exception must be raised in the event of - * an attempt to update the same row twice. + * occurring. These problems are why the SQL standard similarly + * specifies that for SQL MERGE, an exception must be raised in + * the event of an attempt to update the same row twice. */ xminDatum = slot_getsysattr(existing, MinTransactionIdAttributeNumber, @@ -2350,7 +2426,9 @@ ExecOnConflictUpdate(ModifyTableContext *context, if (TransactionIdIsCurrentTransactionId(xmin)) ereport(ERROR, (errcode(ERRCODE_CARDINALITY_VIOLATION), - errmsg("ON CONFLICT DO UPDATE command cannot affect row a second time"), + /* translator: %s is a SQL command name */ + errmsg("%s command cannot affect row a second time", + "ON CONFLICT DO UPDATE"), errhint("Ensure that no rows proposed for insertion within the same command have duplicate constrained values."))); /* This shouldn't happen */ @@ -2490,6 +2568,705 @@ ExecOnConflictUpdate(ModifyTableContext *context, return true; } +/* + * Perform MERGE. + */ +static TupleTableSlot * +ExecMerge(ModifyTableContext *context, ResultRelInfo *resultRelInfo, + ItemPointer tupleid, bool canSetTag) +{ + bool matched; + + /*----- + * If we are dealing with a WHEN MATCHED case (tupleid is valid), we + * execute the first action for which the additional WHEN MATCHED AND + * quals pass. If an action without quals is found, that action is + * executed. + * + * Similarly, if we are dealing with WHEN NOT MATCHED case, we look at + * the given WHEN NOT MATCHED actions in sequence until one passes. + * + * Things get interesting in case of concurrent update/delete of the + * target tuple. Such concurrent update/delete is detected while we are + * executing a WHEN MATCHED action. + * + * A concurrent update can: + * + * 1. modify the target tuple so that it no longer satisfies the + * additional quals attached to the current WHEN MATCHED action + * + * In this case, we are still dealing with a WHEN MATCHED case. + * We recheck the list of WHEN MATCHED actions from the start and + * choose the first one that satisfies the new target tuple. + * + * 2. modify the target tuple so that the join quals no longer pass and + * hence the source tuple no longer has a match. + * + * In this case, the source tuple no longer matches the target tuple, + * so we now instead find a qualifying WHEN NOT MATCHED action to + * execute. + * + * XXX Hmmm, what if the updated tuple would now match one that was + * considered NOT MATCHED so far? + * + * A concurrent delete changes a WHEN MATCHED case to WHEN NOT MATCHED. + * + * ExecMergeMatched takes care of following the update chain and + * re-finding the qualifying WHEN MATCHED action, as long as the updated + * target tuple still satisfies the join quals, i.e., it remains a WHEN + * MATCHED case. If the tuple gets deleted or the join quals fail, it + * returns and we try ExecMergeNotMatched. Given that ExecMergeMatched + * always make progress by following the update chain and we never switch + * from ExecMergeNotMatched to ExecMergeMatched, there is no risk of a + * livelock. + */ + matched = tupleid != NULL; + if (matched) + matched = ExecMergeMatched(context, resultRelInfo, tupleid, canSetTag); + + /* + * Either we were dealing with a NOT MATCHED tuple or ExecMergeMatched() + * returned "false", indicating the previously MATCHED tuple no longer + * matches. + */ + if (!matched) + ExecMergeNotMatched(context, resultRelInfo, canSetTag); + + /* No RETURNING support yet */ + return NULL; +} + +/* + * Check and execute the first qualifying MATCHED action. The current target + * tuple is identified by tupleid. + * + * We start from the first WHEN MATCHED action and check if the WHEN quals + * pass, if any. If the WHEN quals for the first action do not pass, we + * check the second, then the third and so on. If we reach to the end, no + * action is taken and we return true, indicating that no further action is + * required for this tuple. + * + * If we do find a qualifying action, then we attempt to execute the action. + * + * If the tuple is concurrently updated, EvalPlanQual is run with the updated + * tuple to recheck the join quals. Note that the additional quals associated + * with individual actions are evaluated by this routine via ExecQual, while + * EvalPlanQual checks for the join quals. If EvalPlanQual tells us that the + * updated tuple still passes the join quals, then we restart from the first + * action to look for a qualifying action. Otherwise, we return false -- + * meaning that a NOT MATCHED action must now be executed for the current + * source tuple. + */ +static bool +ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, + ItemPointer tupleid, bool canSetTag) +{ + ModifyTableState *mtstate = context->mtstate; + TupleTableSlot *newslot; + EState *estate = context->estate; + ExprContext *econtext = mtstate->ps.ps_ExprContext; + bool isNull; + EPQState *epqstate = &mtstate->mt_epqstate; + ListCell *l; + + /* + * If there are no WHEN MATCHED actions, we are done. + */ + if (resultRelInfo->ri_matchedMergeAction == NIL) + return true; + + /* + * Make tuple and any needed join variables available to ExecQual and + * ExecProject. The target's existing tuple is installed in the scantuple. + * Again, this target relation's slot is required only in the case of a + * MATCHED tuple and UPDATE/DELETE actions. + */ + econtext->ecxt_scantuple = resultRelInfo->ri_oldTupleSlot; + econtext->ecxt_innertuple = context->planSlot; + econtext->ecxt_outertuple = NULL; + +lmerge_matched:; + + /* + * This routine is only invoked for matched rows, and we must have found + * the tupleid of the target row in that case; fetch that tuple. + * + * We use SnapshotAny for this because we might get called again after + * EvalPlanQual returns us a new tuple, which may not be visible to our + * MVCC snapshot. + */ + + if (!table_tuple_fetch_row_version(resultRelInfo->ri_RelationDesc, + tupleid, + SnapshotAny, + resultRelInfo->ri_oldTupleSlot)) + elog(ERROR, "failed to fetch the target tuple"); + + foreach(l, resultRelInfo->ri_matchedMergeAction) + { + MergeActionState *relaction = (MergeActionState *) lfirst(l); + CmdType commandType = relaction->mas_action->commandType; + List *recheckIndexes = NIL; + TM_Result result; + UpdateContext updateCxt = {0}; + + /* + * Test condition, if any. + * + * In the absence of any condition, we perform the action + * unconditionally (no need to check separately since ExecQual() will + * return true if there are no conditions to evaluate). + */ + if (!ExecQual(relaction->mas_whenqual, econtext)) + continue; + + /* + * Check if the existing target tuple meets the USING checks of + * UPDATE/DELETE RLS policies. If those checks fail, we throw an + * error. + * + * The WITH CHECK quals are applied in ExecUpdate() and hence we need + * not do anything special to handle them. + * + * NOTE: We must do this after WHEN quals are evaluated, so that we + * check policies only when they matter. + */ + if (resultRelInfo->ri_WithCheckOptions) + { + ExecWithCheckOptions(commandType == CMD_UPDATE ? + WCO_RLS_MERGE_UPDATE_CHECK : WCO_RLS_MERGE_DELETE_CHECK, + resultRelInfo, + resultRelInfo->ri_oldTupleSlot, + context->mtstate->ps.state); + } + + /* Perform stated action */ + switch (commandType) + { + case CMD_UPDATE: + + /* + * Project the output tuple, and use that to update the table. + * We don't need to filter out junk attributes, because the + * UPDATE action's targetlist doesn't have any. + */ + newslot = ExecProject(relaction->mas_proj); + + context->relaction = relaction; + context->GetUpdateNewTuple = mergeGetUpdateNewTuple; + context->cpUpdateRetrySlot = NULL; + + if (!ExecUpdatePrologue(context, resultRelInfo, + tupleid, NULL, newslot)) + { + result = TM_Ok; + break; + } + ExecUpdatePrepareSlot(resultRelInfo, newslot, context->estate); + result = ExecUpdateAct(context, resultRelInfo, tupleid, NULL, + newslot, mtstate->canSetTag, &updateCxt); + if (result == TM_Ok && updateCxt.updated) + { + ExecUpdateEpilogue(context, &updateCxt, resultRelInfo, + tupleid, NULL, newslot, recheckIndexes); + mtstate->mt_merge_updated += 1; + } + + break; + + case CMD_DELETE: + context->relaction = relaction; + if (!ExecDeletePrologue(context, resultRelInfo, tupleid, + NULL, NULL)) + { + result = TM_Ok; + break; + } + result = ExecDeleteAct(context, resultRelInfo, tupleid, false); + if (result == TM_Ok) + { + ExecDeleteEpilogue(context, resultRelInfo, tupleid, NULL, + false); + mtstate->mt_merge_deleted += 1; + } + break; + + case CMD_NOTHING: + /* Doing nothing is always OK */ + result = TM_Ok; + break; + + default: + elog(ERROR, "unknown action in MERGE WHEN MATCHED clause"); + } + + switch (result) + { + case TM_Ok: + /* all good; perform final actions */ + if (canSetTag) + (estate->es_processed)++; + + break; + + case TM_SelfModified: + + /* + * The SQL standard disallows this for MERGE. + */ + if (TransactionIdIsCurrentTransactionId(context->tmfd.xmax)) + ereport(ERROR, + (errcode(ERRCODE_CARDINALITY_VIOLATION), + /* translator: %s is a SQL command name */ + errmsg("%s command cannot affect row a second time", + "MERGE"), + errhint("Ensure that not more than one source row matches any one target row."))); + /* This shouldn't happen */ + elog(ERROR, "attempted to update or delete invisible tuple"); + break; + + case TM_Deleted: + if (IsolationUsesXactSnapshot()) + ereport(ERROR, + (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), + errmsg("could not serialize access due to concurrent delete"))); + + /* + * If the tuple was already deleted, return to let caller + * handle it under NOT MATCHED clauses. + */ + return false; + + case TM_Updated: + { + Relation resultRelationDesc; + TupleTableSlot *epqslot, + *inputslot; + LockTupleMode lockmode; + + /* + * The target tuple was concurrently updated by some other + * transaction. + */ + + /* + * If cpUpdateRetrySlot is set, ExecCrossPartitionUpdate() + * must have detected that the tuple was concurrently + * updated, so we restart the search for an appropriate + * WHEN MATCHED clause to process the updated tuple. + * + * In this case, ExecDelete() would already have performed + * EvalPlanQual() on the latest version of the tuple, + * which in turn would already have been loaded into + * ri_oldTupleSlot, so no need to do either of those + * things. + * + * XXX why do we not check the WHEN NOT MATCHED list in + * this case? + */ + if (!TupIsNull(context->cpUpdateRetrySlot)) + goto lmerge_matched; + + /* + * Otherwise, we run the EvalPlanQual() with the new + * version of the tuple. If EvalPlanQual() does not return + * a tuple, then we switch to the NOT MATCHED list of + * actions. If it does return a tuple and the join qual is + * still satisfied, then we just need to recheck the + * MATCHED actions, starting from the top, and execute the + * first qualifying action. + */ + resultRelationDesc = resultRelInfo->ri_RelationDesc; + lockmode = ExecUpdateLockMode(estate, resultRelInfo); + + inputslot = EvalPlanQualSlot(epqstate, resultRelationDesc, + resultRelInfo->ri_RangeTableIndex); + + result = table_tuple_lock(resultRelationDesc, tupleid, + estate->es_snapshot, + inputslot, estate->es_output_cid, + lockmode, LockWaitBlock, + TUPLE_LOCK_FLAG_FIND_LAST_VERSION, + &context->tmfd); + switch (result) + { + case TM_Ok: + epqslot = EvalPlanQual(epqstate, + resultRelationDesc, + resultRelInfo->ri_RangeTableIndex, + inputslot); + + /* + * If we got no tuple, or the tuple we get has a + * NULL ctid, go back to caller: this one is not a + * MATCHED tuple anymore, so they can retry with + * NOT MATCHED actions. + */ + if (TupIsNull(epqslot)) + return false; + + (void) ExecGetJunkAttribute(epqslot, + resultRelInfo->ri_RowIdAttNo, + &isNull); + if (isNull) + return false; + + /* + * When a tuple was updated and migrated to + * another partition concurrently, the current + * MERGE implementation can't follow. There's + * probably a better way to handle this case, but + * it'd require recognizing the relation to which + * the tuple moved, and setting our current + * resultRelInfo to that. + */ + if (ItemPointerIndicatesMovedPartitions(&context->tmfd.ctid)) + ereport(ERROR, + (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), + errmsg("tuple to be deleted was already moved to another partition due to concurrent update"))); + + /* + * A non-NULL ctid means that we are still dealing + * with MATCHED case. Restart the loop so that we + * apply all the MATCHED rules again, to ensure + * that the first qualifying WHEN MATCHED action + * is executed. + * + * Update tupleid to that of the new tuple, for + * the refetch we do at the top. + */ + ItemPointerCopy(&context->tmfd.ctid, tupleid); + goto lmerge_matched; + + case TM_Deleted: + + /* + * tuple already deleted; tell caller to run NOT + * MATCHED actions + */ + return false; + + case TM_SelfModified: + + /* + * This can be reached when following an update + * chain from a tuple updated by another session, + * reaching a tuple that was already updated in + * this transaction. If previously modified by + * this command, ignore the redundant update, + * otherwise error out. + * + * See also response to TM_SelfModified in + * ExecUpdate(). + */ + if (context->tmfd.cmax != estate->es_output_cid) + ereport(ERROR, + (errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION), + errmsg("tuple to be updated or deleted was already modified by an operation triggered by the current command"), + errhint("Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows."))); + return false; + + default: + /* see table_tuple_lock call in ExecDelete() */ + elog(ERROR, "unexpected table_tuple_lock status: %u", + result); + return false; + } + } + + case TM_Invisible: + case TM_WouldBlock: + case TM_BeingModified: + /* these should not occur */ + elog(ERROR, "unexpected tuple operation result: %d", result); + break; + } + + /* + * We've activated one of the WHEN clauses, so we don't search + * further. This is required behaviour, not an optimization. + */ + break; + } + + /* + * Successfully executed an action or no qualifying action was found. + */ + return true; +} + +/* + * Execute the first qualifying NOT MATCHED action. + */ +static void +ExecMergeNotMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, + bool canSetTag) +{ + ModifyTableState *mtstate = context->mtstate; + ExprContext *econtext = mtstate->ps.ps_ExprContext; + List *actionStates = NIL; + ListCell *l; + + /* + * For INSERT actions, the root relation's merge action is OK since the + * INSERT's targetlist and the WHEN conditions can only refer to the + * source relation and hence it does not matter which result relation we + * work with. + * + * XXX does this mean that we can avoid creating copies of actionStates on + * partitioned tables, for not-matched actions? + */ + actionStates = resultRelInfo->ri_notMatchedMergeAction; + + /* + * Make source tuple available to ExecQual and ExecProject. We don't need + * the target tuple, since the WHEN quals and targetlist can't refer to + * the target columns. + */ + econtext->ecxt_scantuple = NULL; + econtext->ecxt_innertuple = context->planSlot; + econtext->ecxt_outertuple = NULL; + + foreach(l, actionStates) + { + MergeActionState *action = (MergeActionState *) lfirst(l); + CmdType commandType = action->mas_action->commandType; + TupleTableSlot *newslot; + + /* + * Test condition, if any. + * + * In the absence of any condition, we perform the action + * unconditionally (no need to check separately since ExecQual() will + * return true if there are no conditions to evaluate). + */ + if (!ExecQual(action->mas_whenqual, econtext)) + continue; + + /* Perform stated action */ + switch (commandType) + { + case CMD_INSERT: + + /* + * Project the tuple. In case of a partitioned table, the + * projection was already built to use the root's descriptor, + * so we don't need to map the tuple here. + */ + newslot = ExecProject(action->mas_proj); + context->relaction = action; + + (void) ExecInsert(context, mtstate->rootResultRelInfo, newslot, + canSetTag, NULL, NULL); + mtstate->mt_merge_inserted += 1; + break; + case CMD_NOTHING: + /* Do nothing */ + break; + default: + elog(ERROR, "unknown action in MERGE WHEN NOT MATCHED clause"); + } + + /* + * We've activated one of the WHEN clauses, so we don't search + * further. This is required behaviour, not an optimization. + */ + break; + } +} + +/* + * Initialize state for execution of MERGE. + */ +void +ExecInitMerge(ModifyTableState *mtstate, EState *estate) +{ + ModifyTable *node = (ModifyTable *) mtstate->ps.plan; + ResultRelInfo *rootRelInfo = mtstate->rootResultRelInfo; + ResultRelInfo *resultRelInfo; + ExprContext *econtext; + ListCell *lc; + int i; + + if (node->mergeActionLists == NIL) + return; + + mtstate->mt_merge_subcommands = 0; + + if (mtstate->ps.ps_ExprContext == NULL) + ExecAssignExprContext(estate, &mtstate->ps); + econtext = mtstate->ps.ps_ExprContext; + + /* + * Create a MergeActionState for each action on the mergeActionList and + * add it to either a list of matched actions or not-matched actions. + * + * Similar logic appears in ExecInitPartitionInfo(), so if changing + * anything here, do so there too. + */ + i = 0; + foreach(lc, node->mergeActionLists) + { + List *mergeActionList = lfirst(lc); + TupleDesc relationDesc; + ListCell *l; + + resultRelInfo = mtstate->resultRelInfo + i; + i++; + relationDesc = RelationGetDescr(resultRelInfo->ri_RelationDesc); + + /* initialize slots for MERGE fetches from this rel */ + if (unlikely(!resultRelInfo->ri_projectNewInfoValid)) + ExecInitMergeTupleSlots(mtstate, resultRelInfo); + + foreach(l, mergeActionList) + { + MergeAction *action = (MergeAction *) lfirst(l); + MergeActionState *action_state; + TupleTableSlot *tgtslot; + TupleDesc tgtdesc; + List **list; + + /* + * Build action merge state for this rel. (For partitions, + * equivalent code exists in ExecInitPartitionInfo.) + */ + action_state = makeNode(MergeActionState); + action_state->mas_action = action; + action_state->mas_whenqual = ExecInitQual((List *) action->qual, + &mtstate->ps); + + /* + * We create two lists - one for WHEN MATCHED actions and one for + * WHEN NOT MATCHED actions - and stick the MergeActionState into + * the appropriate list. + */ + if (action_state->mas_action->matched) + list = &resultRelInfo->ri_matchedMergeAction; + else + list = &resultRelInfo->ri_notMatchedMergeAction; + *list = lappend(*list, action_state); + + switch (action->commandType) + { + case CMD_INSERT: + ExecCheckPlanOutput(rootRelInfo->ri_RelationDesc, + action->targetList); + + /* + * If the MERGE targets a partitioned table, any INSERT + * actions must be routed through it, not the child + * relations. Initialize the routing struct and the root + * table's "new" tuple slot for that, if not already done. + * The projection we prepare, for all relations, uses the + * root relation descriptor, and targets the plan's root + * slot. (This is consistent with the fact that we + * checked the plan output to match the root relation, + * above.) + */ + if (rootRelInfo->ri_RelationDesc->rd_rel->relkind == + RELKIND_PARTITIONED_TABLE) + { + if (mtstate->mt_partition_tuple_routing == NULL) + { + /* + * Initialize planstate for routing if not already + * done. + * + * Note that the slot is managed as a standalone + * slot belonging to ModifyTableState, so we pass + * NULL for the 2nd argument. + */ + mtstate->mt_root_tuple_slot = + table_slot_create(rootRelInfo->ri_RelationDesc, + NULL); + mtstate->mt_partition_tuple_routing = + ExecSetupPartitionTupleRouting(estate, + rootRelInfo->ri_RelationDesc); + } + tgtslot = mtstate->mt_root_tuple_slot; + tgtdesc = RelationGetDescr(rootRelInfo->ri_RelationDesc); + } + else + { + /* not partitioned? use the stock relation and slot */ + tgtslot = resultRelInfo->ri_newTupleSlot; + tgtdesc = RelationGetDescr(resultRelInfo->ri_RelationDesc); + } + + action_state->mas_proj = + ExecBuildProjectionInfo(action->targetList, econtext, + tgtslot, + &mtstate->ps, + tgtdesc); + + mtstate->mt_merge_subcommands |= MERGE_INSERT; + break; + case CMD_UPDATE: + action_state->mas_proj = + ExecBuildUpdateProjection(action->targetList, + true, + action->updateColnos, + relationDesc, + econtext, + resultRelInfo->ri_newTupleSlot, + &mtstate->ps); + mtstate->mt_merge_subcommands |= MERGE_UPDATE; + break; + case CMD_DELETE: + mtstate->mt_merge_subcommands |= MERGE_DELETE; + break; + case CMD_NOTHING: + break; + default: + elog(ERROR, "unknown operation"); + break; + } + } + } +} + +/* + * Initializes the tuple slots in a ResultRelInfo for any MERGE action. + * + * We mark 'projectNewInfoValid' even though the projections themselves + * are not initialized here. + */ +void +ExecInitMergeTupleSlots(ModifyTableState *mtstate, + ResultRelInfo *resultRelInfo) +{ + EState *estate = mtstate->ps.state; + + Assert(!resultRelInfo->ri_projectNewInfoValid); + + resultRelInfo->ri_oldTupleSlot = + table_slot_create(resultRelInfo->ri_RelationDesc, + &estate->es_tupleTable); + resultRelInfo->ri_newTupleSlot = + table_slot_create(resultRelInfo->ri_RelationDesc, + &estate->es_tupleTable); + resultRelInfo->ri_projectNewInfoValid = true; +} + +/* + * Callback for ModifyTableContext->GetUpdateNewTuple for use by MERGE. It + * computes the updated tuple by projecting from the current merge action's + * projection. + */ +static TupleTableSlot * +mergeGetUpdateNewTuple(ResultRelInfo *relinfo, + TupleTableSlot *planSlot, + TupleTableSlot *oldSlot, + MergeActionState *relaction) +{ + ExprContext *econtext = relaction->mas_proj->pi_exprContext; + + econtext->ecxt_scantuple = oldSlot; + econtext->ecxt_innertuple = planSlot; + + return ExecProject(relaction->mas_proj); +} /* * Process BEFORE EACH STATEMENT triggers @@ -2514,6 +3291,14 @@ fireBSTriggers(ModifyTableState *node) case CMD_DELETE: ExecBSDeleteTriggers(node->ps.state, resultRelInfo); break; + case CMD_MERGE: + if (node->mt_merge_subcommands & MERGE_INSERT) + ExecBSInsertTriggers(node->ps.state, resultRelInfo); + if (node->mt_merge_subcommands & MERGE_UPDATE) + ExecBSUpdateTriggers(node->ps.state, resultRelInfo); + if (node->mt_merge_subcommands & MERGE_DELETE) + ExecBSDeleteTriggers(node->ps.state, resultRelInfo); + break; default: elog(ERROR, "unknown operation"); break; @@ -2547,6 +3332,17 @@ fireASTriggers(ModifyTableState *node) ExecASDeleteTriggers(node->ps.state, resultRelInfo, node->mt_transition_capture); break; + case CMD_MERGE: + if (node->mt_merge_subcommands & MERGE_DELETE) + ExecASDeleteTriggers(node->ps.state, resultRelInfo, + node->mt_transition_capture); + if (node->mt_merge_subcommands & MERGE_UPDATE) + ExecASUpdateTriggers(node->ps.state, resultRelInfo, + node->mt_transition_capture); + if (node->mt_merge_subcommands & MERGE_INSERT) + ExecASInsertTriggers(node->ps.state, resultRelInfo, + node->mt_transition_capture); + break; default: elog(ERROR, "unknown operation"); break; @@ -2749,7 +3545,28 @@ ExecModifyTable(PlanState *pstate) datum = ExecGetJunkAttribute(planSlot, node->mt_resultOidAttno, &isNull); if (isNull) + { + /* + * For commands other than MERGE, any tuples having InvalidOid + * for tableoid are errors. For MERGE, we may need to handle + * them as WHEN NOT MATCHED clauses if any, so do that. + * + * Note that we use the node's toplevel resultRelInfo, not any + * specific partition's. + */ + if (operation == CMD_MERGE) + { + EvalPlanQualSetSlot(&node->mt_epqstate, planSlot); + + context.planSlot = planSlot; + context.lockmode = 0; + + ExecMerge(&context, node->resultRelInfo, NULL, node->canSetTag); + continue; /* no RETURNING support yet */ + } + elog(ERROR, "tableoid is NULL"); + } resultoid = DatumGetObjectId(datum); /* If it's not the same as last time, we need to locate the rel */ @@ -2784,13 +3601,14 @@ ExecModifyTable(PlanState *pstate) oldtuple = NULL; /* - * For UPDATE/DELETE, fetch the row identity info for the tuple to be - * updated/deleted. For a heap relation, that's a TID; otherwise we - * may have a wholerow junk attr that carries the old tuple in toto. - * Keep this in step with the part of ExecInitModifyTable that sets up - * ri_RowIdAttNo. + * For UPDATE/DELETE/MERGE, fetch the row identity info for the tuple + * to be updated/deleted/merged. For a heap relation, that's a TID; + * otherwise we may have a wholerow junk attr that carries the old + * tuple in toto. Keep this in step with the part of + * ExecInitModifyTable that sets up ri_RowIdAttNo. */ - if (operation == CMD_UPDATE || operation == CMD_DELETE) + if (operation == CMD_UPDATE || operation == CMD_DELETE || + operation == CMD_MERGE) { char relkind; Datum datum; @@ -2806,9 +3624,30 @@ ExecModifyTable(PlanState *pstate) datum = ExecGetJunkAttribute(slot, resultRelInfo->ri_RowIdAttNo, &isNull); - /* shouldn't ever get a null result... */ + + /* + * For commands other than MERGE, any tuples having a null row + * identifier are errors. For MERGE, we may need to handle + * them as WHEN NOT MATCHED clauses if any, so do that. + * + * Note that we use the node's toplevel resultRelInfo, not any + * specific partition's. + */ if (isNull) + { + if (operation == CMD_MERGE) + { + EvalPlanQualSetSlot(&node->mt_epqstate, planSlot); + + context.planSlot = planSlot; + context.lockmode = 0; + + ExecMerge(&context, node->resultRelInfo, NULL, node->canSetTag); + continue; /* no RETURNING support yet */ + } + elog(ERROR, "ctid is NULL"); + } tupleid = (ItemPointer) DatumGetPointer(datum); tuple_ctid = *tupleid; /* be sure we don't free ctid!! */ @@ -2898,8 +3737,10 @@ ExecModifyTable(PlanState *pstate) oldSlot)) elog(ERROR, "failed to fetch tuple being updated"); } - slot = ExecGetUpdateNewTuple(resultRelInfo, planSlot, - oldSlot); + slot = internalGetUpdateNewTuple(resultRelInfo, planSlot, + oldSlot, NULL); + context.GetUpdateNewTuple = internalGetUpdateNewTuple; + context.relaction = NULL; /* Now apply the update. */ slot = ExecUpdate(&context, resultRelInfo, tupleid, oldtuple, @@ -2911,6 +3752,10 @@ ExecModifyTable(PlanState *pstate) true, false, node->canSetTag, NULL, NULL); break; + case CMD_MERGE: + slot = ExecMerge(&context, resultRelInfo, tupleid, node->canSetTag); + break; + default: elog(ERROR, "unknown operation"); break; @@ -3044,6 +3889,10 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) mtstate->resultRelInfo = (ResultRelInfo *) palloc(nrels * sizeof(ResultRelInfo)); + mtstate->mt_merge_inserted = 0; + mtstate->mt_merge_updated = 0; + mtstate->mt_merge_deleted = 0; + /*---------- * Resolve the target relation. This is the same as: * @@ -3147,12 +3996,13 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) } /* - * For UPDATE/DELETE, find the appropriate junk attr now, either a - * 'ctid' or 'wholerow' attribute depending on relkind. For foreign + * For UPDATE/DELETE/MERGE, find the appropriate junk attr now, either + * a 'ctid' or 'wholerow' attribute depending on relkind. For foreign * tables, the FDW might have created additional junk attr(s), but * those are no concern of ours. */ - if (operation == CMD_UPDATE || operation == CMD_DELETE) + if (operation == CMD_UPDATE || operation == CMD_DELETE || + operation == CMD_MERGE) { char relkind; @@ -3168,20 +4018,29 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) } else if (relkind == RELKIND_FOREIGN_TABLE) { + /* + * We don't support MERGE with foreign tables for now. (It's + * problematic because the implementation uses CTID.) + */ + Assert(operation != CMD_MERGE); + /* * When there is a row-level trigger, there should be a * wholerow attribute. We also require it to be present in - * UPDATE, so we can get the values of unchanged columns. + * UPDATE and MERGE, so we can get the values of unchanged + * columns. */ resultRelInfo->ri_RowIdAttNo = ExecFindJunkAttributeInTlist(subplan->targetlist, "wholerow"); - if (mtstate->operation == CMD_UPDATE && + if ((mtstate->operation == CMD_UPDATE || mtstate->operation == CMD_MERGE) && !AttributeNumberIsValid(resultRelInfo->ri_RowIdAttNo)) elog(ERROR, "could not find junk wholerow column"); } else { + /* No support for MERGE */ + Assert(operation != CMD_MERGE); /* Other valid target relkinds must provide wholerow */ resultRelInfo->ri_RowIdAttNo = ExecFindJunkAttributeInTlist(subplan->targetlist, @@ -3193,10 +4052,10 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) } /* - * If this is an inherited update/delete, there will be a junk attribute - * named "tableoid" present in the subplan's targetlist. It will be used - * to identify the result relation for a given tuple to be - * updated/deleted. + * If this is an inherited update/delete/merge, there will be a junk + * attribute named "tableoid" present in the subplan's targetlist. It + * will be used to identify the result relation for a given tuple to be + * updated/deleted/merged. */ mtstate->mt_resultOidAttno = ExecFindJunkAttributeInTlist(subplan->targetlist, "tableoid"); @@ -3209,8 +4068,9 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) /* * Build state for tuple routing if it's a partitioned INSERT. An UPDATE - * might need this too, but only if it actually moves tuples between - * partitions; in that case setup is done by ExecCrossPartitionUpdate. + * or MERGE might need this too, but only if it actually moves tuples + * between partitions; in that case setup is done by + * ExecCrossPartitionUpdate. */ if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE && operation == CMD_INSERT) @@ -3379,6 +4239,10 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) arowmarks = lappend(arowmarks, aerm); } + /* For a MERGE command, initialize its state */ + if (mtstate->operation == CMD_MERGE) + ExecInitMerge(mtstate, estate); + EvalPlanQualSetPlan(&mtstate->mt_epqstate, subplan, arowmarks); /* diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index a82e986667..042a5f8b0a 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -2881,6 +2881,9 @@ _SPI_pquery(QueryDesc *queryDesc, bool fire_triggers, uint64 tcount) else res = SPI_OK_UPDATE; break; + case CMD_MERGE: + res = SPI_OK_MERGE; + break; default: return SPI_ERROR_OPUNKNOWN; } diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 2cbd8aa0df..c09172164b 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -228,6 +228,7 @@ _copyModifyTable(const ModifyTable *from) COPY_NODE_FIELD(onConflictWhere); COPY_SCALAR_FIELD(exclRelRTI); COPY_NODE_FIELD(exclRelTlist); + COPY_NODE_FIELD(mergeActionLists); return newnode; } @@ -2888,6 +2889,35 @@ _copyCommonTableExpr(const CommonTableExpr *from) return newnode; } +static MergeWhenClause * +_copyMergeWhenClause(const MergeWhenClause *from) +{ + MergeWhenClause *newnode = makeNode(MergeWhenClause); + + COPY_SCALAR_FIELD(matched); + COPY_SCALAR_FIELD(commandType); + COPY_SCALAR_FIELD(override); + COPY_NODE_FIELD(condition); + COPY_NODE_FIELD(targetList); + COPY_NODE_FIELD(values); + return newnode; +} + +static MergeAction * +_copyMergeAction(const MergeAction *from) +{ + MergeAction *newnode = makeNode(MergeAction); + + COPY_SCALAR_FIELD(matched); + COPY_SCALAR_FIELD(commandType); + COPY_SCALAR_FIELD(override); + COPY_NODE_FIELD(qual); + COPY_NODE_FIELD(targetList); + COPY_NODE_FIELD(updateColnos); + + return newnode; +} + static A_Expr * _copyA_Expr(const A_Expr *from) { @@ -3394,6 +3424,8 @@ _copyQuery(const Query *from) COPY_NODE_FIELD(setOperations); COPY_NODE_FIELD(constraintDeps); COPY_NODE_FIELD(withCheckOptions); + COPY_NODE_FIELD(mergeActionList); + COPY_SCALAR_FIELD(mergeUseOuterJoin); COPY_LOCATION_FIELD(stmt_location); COPY_SCALAR_FIELD(stmt_len); @@ -3457,6 +3489,20 @@ _copyUpdateStmt(const UpdateStmt *from) return newnode; } +static MergeStmt * +_copyMergeStmt(const MergeStmt *from) +{ + MergeStmt *newnode = makeNode(MergeStmt); + + COPY_NODE_FIELD(relation); + COPY_NODE_FIELD(sourceRelation); + COPY_NODE_FIELD(joinCondition); + COPY_NODE_FIELD(mergeWhenClauses); + COPY_NODE_FIELD(withClause); + + return newnode; +} + static SelectStmt * _copySelectStmt(const SelectStmt *from) { @@ -5662,6 +5708,9 @@ copyObjectImpl(const void *from) case T_UpdateStmt: retval = _copyUpdateStmt(from); break; + case T_MergeStmt: + retval = _copyMergeStmt(from); + break; case T_SelectStmt: retval = _copySelectStmt(from); break; @@ -6136,6 +6185,12 @@ copyObjectImpl(const void *from) case T_CommonTableExpr: retval = _copyCommonTableExpr(from); break; + case T_MergeWhenClause: + retval = _copyMergeWhenClause(from); + break; + case T_MergeAction: + retval = _copyMergeAction(from); + break; case T_ObjectWithArgs: retval = _copyObjectWithArgs(from); break; diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 9f17e15e15..3fb423be47 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -1146,6 +1146,8 @@ _equalQuery(const Query *a, const Query *b) COMPARE_NODE_FIELD(setOperations); COMPARE_NODE_FIELD(constraintDeps); COMPARE_NODE_FIELD(withCheckOptions); + COMPARE_NODE_FIELD(mergeActionList); + COMPARE_SCALAR_FIELD(mergeUseOuterJoin); COMPARE_LOCATION_FIELD(stmt_location); COMPARE_SCALAR_FIELD(stmt_len); @@ -1201,6 +1203,18 @@ _equalUpdateStmt(const UpdateStmt *a, const UpdateStmt *b) return true; } +static bool +_equalMergeStmt(const MergeStmt *a, const MergeStmt *b) +{ + COMPARE_NODE_FIELD(relation); + COMPARE_NODE_FIELD(sourceRelation); + COMPARE_NODE_FIELD(joinCondition); + COMPARE_NODE_FIELD(mergeWhenClauses); + COMPARE_NODE_FIELD(withClause); + + return true; +} + static bool _equalSelectStmt(const SelectStmt *a, const SelectStmt *b) { @@ -3118,6 +3132,32 @@ _equalCommonTableExpr(const CommonTableExpr *a, const CommonTableExpr *b) return true; } +static bool +_equalMergeWhenClause(const MergeWhenClause *a, const MergeWhenClause *b) +{ + COMPARE_SCALAR_FIELD(matched); + COMPARE_SCALAR_FIELD(commandType); + COMPARE_SCALAR_FIELD(override); + COMPARE_NODE_FIELD(condition); + COMPARE_NODE_FIELD(targetList); + COMPARE_NODE_FIELD(values); + + return true; +} + +static bool +_equalMergeAction(const MergeAction *a, const MergeAction *b) +{ + COMPARE_SCALAR_FIELD(matched); + COMPARE_SCALAR_FIELD(commandType); + COMPARE_SCALAR_FIELD(override); + COMPARE_NODE_FIELD(qual); + COMPARE_NODE_FIELD(targetList); + COMPARE_NODE_FIELD(updateColnos); + + return true; +} + static bool _equalXmlSerialize(const XmlSerialize *a, const XmlSerialize *b) { @@ -3576,6 +3616,9 @@ equal(const void *a, const void *b) case T_UpdateStmt: retval = _equalUpdateStmt(a, b); break; + case T_MergeStmt: + retval = _equalMergeStmt(a, b); + break; case T_SelectStmt: retval = _equalSelectStmt(a, b); break; @@ -4050,6 +4093,12 @@ equal(const void *a, const void *b) case T_CommonTableExpr: retval = _equalCommonTableExpr(a, b); break; + case T_MergeWhenClause: + retval = _equalMergeWhenClause(a, b); + break; + case T_MergeAction: + retval = _equalMergeAction(a, b); + break; case T_ObjectWithArgs: retval = _equalObjectWithArgs(a, b); break; diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index 25cf282aab..50898246f9 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -2303,6 +2303,16 @@ expression_tree_walker(Node *node, return true; } break; + case T_MergeAction: + { + MergeAction *action = (MergeAction *) node; + + if (walker(action->targetList, context)) + return true; + if (walker(action->qual, context)) + return true; + } + break; case T_PartitionPruneStepOp: { PartitionPruneStepOp *opstep = (PartitionPruneStepOp *) node; @@ -2463,6 +2473,8 @@ query_tree_walker(Query *query, return true; if (walker((Node *) query->onConflict, context)) return true; + if (walker((Node *) query->mergeActionList, context)) + return true; if (walker((Node *) query->returningList, context)) return true; if (walker((Node *) query->jointree, context)) @@ -3252,6 +3264,18 @@ expression_tree_mutator(Node *node, return (Node *) newnode; } break; + case T_MergeAction: + { + MergeAction *action = (MergeAction *) node; + MergeAction *newnode; + + FLATCOPY(newnode, action, MergeAction); + MUTATE(newnode->qual, action->qual, Node *); + MUTATE(newnode->targetList, action->targetList, List *); + + return (Node *) newnode; + } + break; case T_PartitionPruneStepOp: { PartitionPruneStepOp *opstep = (PartitionPruneStepOp *) node; @@ -3464,6 +3488,7 @@ query_tree_mutator(Query *query, MUTATE(query->targetList, query->targetList, List *); MUTATE(query->withCheckOptions, query->withCheckOptions, List *); MUTATE(query->onConflict, query->onConflict, OnConflictExpr *); + MUTATE(query->mergeActionList, query->mergeActionList, List *); MUTATE(query->returningList, query->returningList, List *); MUTATE(query->jointree, query->jointree, FromExpr *); MUTATE(query->setOperations, query->setOperations, Node *); @@ -3656,9 +3681,9 @@ query_or_expression_tree_mutator(Node *node, * boundaries: we descend to everything that's possibly interesting. * * Currently, the node type coverage here extends only to DML statements - * (SELECT/INSERT/UPDATE/DELETE) and nodes that can appear in them, because - * this is used mainly during analysis of CTEs, and only DML statements can - * appear in CTEs. + * (SELECT/INSERT/UPDATE/DELETE/MERGE) and nodes that can appear in them, + * because this is used mainly during analysis of CTEs, and only DML + * statements can appear in CTEs. */ bool raw_expression_tree_walker(Node *node, @@ -3839,6 +3864,34 @@ raw_expression_tree_walker(Node *node, return true; } break; + case T_MergeStmt: + { + MergeStmt *stmt = (MergeStmt *) node; + + if (walker(stmt->relation, context)) + return true; + if (walker(stmt->sourceRelation, context)) + return true; + if (walker(stmt->joinCondition, context)) + return true; + if (walker(stmt->mergeWhenClauses, context)) + return true; + if (walker(stmt->withClause, context)) + return true; + } + break; + case T_MergeWhenClause: + { + MergeWhenClause *mergeWhenClause = (MergeWhenClause *) node; + + if (walker(mergeWhenClause->condition, context)) + return true; + if (walker(mergeWhenClause->targetList, context)) + return true; + if (walker(mergeWhenClause->values, context)) + return true; + } + break; case T_SelectStmt: { SelectStmt *stmt = (SelectStmt *) node; diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index c25f0bd684..0c01f35086 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -429,6 +429,7 @@ _outModifyTable(StringInfo str, const ModifyTable *node) WRITE_NODE_FIELD(onConflictWhere); WRITE_UINT_FIELD(exclRelRTI); WRITE_NODE_FIELD(exclRelTlist); + WRITE_NODE_FIELD(mergeActionLists); } static void @@ -2250,6 +2251,7 @@ _outModifyTablePath(StringInfo str, const ModifyTablePath *node) WRITE_NODE_FIELD(rowMarks); WRITE_NODE_FIELD(onconflict); WRITE_INT_FIELD(epqParam); + WRITE_NODE_FIELD(mergeActionLists); } static void @@ -3143,6 +3145,8 @@ _outQuery(StringInfo str, const Query *node) WRITE_NODE_FIELD(setOperations); WRITE_NODE_FIELD(constraintDeps); WRITE_NODE_FIELD(withCheckOptions); + WRITE_NODE_FIELD(mergeActionList); + WRITE_BOOL_FIELD(mergeUseOuterJoin); WRITE_LOCATION_FIELD(stmt_location); WRITE_INT_FIELD(stmt_len); } @@ -3271,6 +3275,32 @@ _outCommonTableExpr(StringInfo str, const CommonTableExpr *node) WRITE_NODE_FIELD(ctecolcollations); } +static void +_outMergeWhenClause(StringInfo str, const MergeWhenClause *node) +{ + WRITE_NODE_TYPE("MERGEWHENCLAUSE"); + + WRITE_BOOL_FIELD(matched); + WRITE_ENUM_FIELD(commandType, CmdType); + WRITE_ENUM_FIELD(override, OverridingKind); + WRITE_NODE_FIELD(condition); + WRITE_NODE_FIELD(targetList); + WRITE_NODE_FIELD(values); +} + +static void +_outMergeAction(StringInfo str, const MergeAction *node) +{ + WRITE_NODE_TYPE("MERGEACTION"); + + WRITE_BOOL_FIELD(matched); + WRITE_ENUM_FIELD(commandType, CmdType); + WRITE_ENUM_FIELD(override, OverridingKind); + WRITE_NODE_FIELD(qual); + WRITE_NODE_FIELD(targetList); + WRITE_NODE_FIELD(updateColnos); +} + static void _outSetOperationStmt(StringInfo str, const SetOperationStmt *node) { @@ -4480,6 +4510,12 @@ outNode(StringInfo str, const void *obj) case T_CommonTableExpr: _outCommonTableExpr(str, obj); break; + case T_MergeWhenClause: + _outMergeWhenClause(str, obj); + break; + case T_MergeAction: + _outMergeAction(str, obj); + break; case T_SetOperationStmt: _outSetOperationStmt(str, obj); break; diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index e0b3ad1ed2..3ee8ba6f15 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -283,6 +283,8 @@ _readQuery(void) READ_NODE_FIELD(setOperations); READ_NODE_FIELD(constraintDeps); READ_NODE_FIELD(withCheckOptions); + READ_NODE_FIELD(mergeActionList); + READ_BOOL_FIELD(mergeUseOuterJoin); READ_LOCATION_FIELD(stmt_location); READ_INT_FIELD(stmt_len); @@ -472,6 +474,42 @@ _readCommonTableExpr(void) READ_DONE(); } +/* + * _readMergeWhenClause + */ +static MergeWhenClause * +_readMergeWhenClause(void) +{ + READ_LOCALS(MergeWhenClause); + + READ_BOOL_FIELD(matched); + READ_ENUM_FIELD(commandType, CmdType); + READ_NODE_FIELD(condition); + READ_NODE_FIELD(targetList); + READ_NODE_FIELD(values); + READ_ENUM_FIELD(override, OverridingKind); + + READ_DONE(); +} + +/* + * _readMergeAction + */ +static MergeAction * +_readMergeAction(void) +{ + READ_LOCALS(MergeAction); + + READ_BOOL_FIELD(matched); + READ_ENUM_FIELD(commandType, CmdType); + READ_ENUM_FIELD(override, OverridingKind); + READ_NODE_FIELD(qual); + READ_NODE_FIELD(targetList); + READ_NODE_FIELD(updateColnos); + + READ_DONE(); +} + /* * _readSetOperationStmt */ @@ -1765,6 +1803,7 @@ _readModifyTable(void) READ_NODE_FIELD(onConflictWhere); READ_UINT_FIELD(exclRelRTI); READ_NODE_FIELD(exclRelTlist); + READ_NODE_FIELD(mergeActionLists); READ_DONE(); } @@ -2809,6 +2848,10 @@ parseNodeString(void) return_value = _readCTECycleClause(); else if (MATCH("COMMONTABLEEXPR", 15)) return_value = _readCommonTableExpr(); + else if (MATCH("MERGEWHENCLAUSE", 15)) + return_value = _readMergeWhenClause(); + else if (MATCH("MERGEACTION", 11)) + return_value = _readMergeAction(); else if (MATCH("SETOPERATIONSTMT", 16)) return_value = _readSetOperationStmt(); else if (MATCH("ALIAS", 5)) diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index fa069a217c..179c87c671 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -310,7 +310,8 @@ static ModifyTable *make_modifytable(PlannerInfo *root, Plan *subplan, List *resultRelations, List *updateColnosLists, List *withCheckOptionLists, List *returningLists, - List *rowMarks, OnConflictExpr *onconflict, int epqParam); + List *rowMarks, OnConflictExpr *onconflict, + List *mergeActionList, int epqParam); static GatherMerge *create_gather_merge_plan(PlannerInfo *root, GatherMergePath *best_path); @@ -2775,6 +2776,7 @@ create_modifytable_plan(PlannerInfo *root, ModifyTablePath *best_path) best_path->returningLists, best_path->rowMarks, best_path->onconflict, + best_path->mergeActionLists, best_path->epqParam); copy_generic_path_info(&plan->plan, &best_path->path); @@ -6924,7 +6926,8 @@ make_modifytable(PlannerInfo *root, Plan *subplan, List *resultRelations, List *updateColnosLists, List *withCheckOptionLists, List *returningLists, - List *rowMarks, OnConflictExpr *onconflict, int epqParam) + List *rowMarks, OnConflictExpr *onconflict, + List *mergeActionLists, int epqParam) { ModifyTable *node = makeNode(ModifyTable); List *fdw_private_list; @@ -6932,9 +6935,10 @@ make_modifytable(PlannerInfo *root, Plan *subplan, ListCell *lc; int i; - Assert(operation == CMD_UPDATE ? - list_length(resultRelations) == list_length(updateColnosLists) : - updateColnosLists == NIL); + Assert(operation == CMD_MERGE || + (operation == CMD_UPDATE ? + list_length(resultRelations) == list_length(updateColnosLists) : + updateColnosLists == NIL)); Assert(withCheckOptionLists == NIL || list_length(resultRelations) == list_length(withCheckOptionLists)); Assert(returningLists == NIL || @@ -6992,6 +6996,7 @@ make_modifytable(PlannerInfo *root, Plan *subplan, node->withCheckOptionLists = withCheckOptionLists; node->returningLists = returningLists; node->rowMarks = rowMarks; + node->mergeActionLists = mergeActionLists; node->epqParam = epqParam; /* diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index bd09f85aea..547fda20a2 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -649,6 +649,11 @@ subquery_planner(PlannerGlobal *glob, Query *parse, if (parse->cteList) SS_process_ctes(root); + /* + * If it's a MERGE command, transform the joinlist as appropriate. + */ + transform_MERGE_to_join(parse); + /* * If the FROM clause is empty, replace it with a dummy RTE_RESULT RTE, so * that we don't need so many special cases to deal with that situation. @@ -849,6 +854,20 @@ subquery_planner(PlannerGlobal *glob, Query *parse, /* exclRelTlist contains only Vars, so no preprocessing needed */ } + foreach(l, parse->mergeActionList) + { + MergeAction *action = (MergeAction *) lfirst(l); + + action->targetList = (List *) + preprocess_expression(root, + (Node *) action->targetList, + EXPRKIND_TARGET); + action->qual = + preprocess_expression(root, + (Node *) action->qual, + EXPRKIND_QUAL); + } + root->append_rel_list = (List *) preprocess_expression(root, (Node *) root->append_rel_list, EXPRKIND_APPINFO); @@ -1714,7 +1733,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) } /* - * If this is an INSERT/UPDATE/DELETE, add the ModifyTable node. + * If this is an INSERT/UPDATE/DELETE/MERGE, add the ModifyTable node. */ if (parse->commandType != CMD_SELECT) { @@ -1723,6 +1742,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) List *updateColnosLists = NIL; List *withCheckOptionLists = NIL; List *returningLists = NIL; + List *mergeActionLists = NIL; List *rowMarks; if (bms_membership(root->all_result_relids) == BMS_MULTIPLE) @@ -1789,6 +1809,43 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) returningLists = lappend(returningLists, returningList); } + if (parse->mergeActionList) + { + ListCell *l; + List *mergeActionList = NIL; + + /* + * Copy MergeActions and translate stuff that + * references attribute numbers. + */ + foreach(l, parse->mergeActionList) + { + MergeAction *action = lfirst(l), + *leaf_action = copyObject(action); + + leaf_action->qual = + adjust_appendrel_attrs_multilevel(root, + (Node *) action->qual, + this_result_rel->relids, + top_result_rel->relids); + leaf_action->targetList = (List *) + adjust_appendrel_attrs_multilevel(root, + (Node *) action->targetList, + this_result_rel->relids, + top_result_rel->relids); + if (leaf_action->commandType == CMD_UPDATE) + leaf_action->updateColnos = + adjust_inherited_attnums_multilevel(root, + action->updateColnos, + this_result_rel->relid, + top_result_rel->relid); + mergeActionList = lappend(mergeActionList, + leaf_action); + } + + mergeActionLists = lappend(mergeActionLists, + mergeActionList); + } } if (resultRelations == NIL) @@ -1811,6 +1868,8 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) withCheckOptionLists = list_make1(parse->withCheckOptions); if (parse->returningList) returningLists = list_make1(parse->returningList); + if (parse->mergeActionList) + mergeActionLists = list_make1(parse->mergeActionList); } } else @@ -1823,6 +1882,8 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) withCheckOptionLists = list_make1(parse->withCheckOptions); if (parse->returningList) returningLists = list_make1(parse->returningList); + if (parse->mergeActionList) + mergeActionLists = list_make1(parse->mergeActionList); } /* @@ -1859,6 +1920,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) returningLists, rowMarks, parse->onConflict, + mergeActionLists, assign_special_exec_param(root)); } diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index a7b11b7f03..bf4c722c02 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -952,6 +952,7 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset) case T_ModifyTable: { ModifyTable *splan = (ModifyTable *) plan; + Plan *subplan = outerPlan(splan); Assert(splan->plan.targetlist == NIL); Assert(splan->plan.qual == NIL); @@ -963,7 +964,6 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset) if (splan->returningLists) { List *newRL = NIL; - Plan *subplan = outerPlan(splan); ListCell *lcrl, *lcrr; @@ -1030,6 +1030,68 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset) fix_scan_list(root, splan->exclRelTlist, rtoffset, 1); } + /* + * The MERGE statement produces the target rows by performing + * a right join between the target relation and the source + * relation (which could be a plain relation or a subquery). + * The INSERT and UPDATE actions of the MERGE statement + * require access to the columns from the source relation. We + * arrange things so that the source relation attributes are + * available as INNER_VAR and the target relation attributes + * are available from the scan tuple. + */ + if (splan->mergeActionLists != NIL) + { + ListCell *lca, + *lcr; + + /* + * Fix the targetList of individual action nodes so that + * the so-called "source relation" Vars are referenced as + * INNER_VAR. Note that for this to work correctly during + * execution, the ecxt_innertuple must be set to the tuple + * obtained by executing the subplan, which is what + * constitutes the "source relation". + * + * We leave the Vars from the result relation (i.e. the + * target relation) unchanged i.e. those Vars would be + * picked from the scan slot. So during execution, we must + * ensure that ecxt_scantuple is setup correctly to refer + * to the tuple from the target relation. + */ + indexed_tlist *itlist; + + itlist = build_tlist_index(subplan->targetlist); + + forboth(lca, splan->mergeActionLists, + lcr, splan->resultRelations) + { + List *mergeActionList = lfirst(lca); + Index resultrel = lfirst_int(lcr); + + foreach(l, mergeActionList) + { + MergeAction *action = (MergeAction *) lfirst(l); + + /* Fix targetList of each action. */ + action->targetList = fix_join_expr(root, + action->targetList, + NULL, itlist, + resultrel, + rtoffset, + NUM_EXEC_TLIST(plan)); + + /* Fix quals too. */ + action->qual = (Node *) fix_join_expr(root, + (List *) action->qual, + NULL, itlist, + resultrel, + rtoffset, + NUM_EXEC_QUAL(plan)); + } + } + } + splan->nominalRelation += rtoffset; if (splan->rootRelation) splan->rootRelation += rtoffset; diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c index 74823e8437..0bd99acf83 100644 --- a/src/backend/optimizer/prep/prepjointree.c +++ b/src/backend/optimizer/prep/prepjointree.c @@ -132,6 +132,86 @@ static void fix_append_rel_relids(List *append_rel_list, int varno, static Node *find_jointree_node_for_rel(Node *jtnode, int relid); +/* + * transform_MERGE_to_join + * Replace a MERGE's jointree to also include the target relation. + */ +void +transform_MERGE_to_join(Query *parse) +{ + RangeTblEntry *joinrte; + JoinExpr *joinexpr; + JoinType jointype; + int joinrti; + List *vars; + + if (parse->commandType != CMD_MERGE) + return; + + /* XXX probably bogus */ + vars = NIL; + + /* + * When any WHEN NOT MATCHED THEN INSERT clauses exist, we need to use an + * outer join so that we process all unmatched tuples from the source + * relation. If none exist, we can use an inner join. + */ + if (parse->mergeUseOuterJoin) + jointype = JOIN_RIGHT; + else + jointype = JOIN_INNER; + + /* Manufacture a join RTE to use. */ + joinrte = makeNode(RangeTblEntry); + joinrte->rtekind = RTE_JOIN; + joinrte->jointype = jointype; + joinrte->joinmergedcols = 0; + joinrte->joinaliasvars = vars; + joinrte->joinleftcols = NIL; /* MERGE does not allow JOIN USING */ + joinrte->joinrightcols = NIL; /* ditto */ + joinrte->join_using_alias = NULL; + + joinrte->alias = NULL; + joinrte->eref = makeAlias("*MERGE*", NIL); + joinrte->lateral = false; + joinrte->inh = false; + joinrte->inFromCl = true; + joinrte->requiredPerms = 0; + joinrte->checkAsUser = InvalidOid; + joinrte->selectedCols = NULL; + joinrte->insertedCols = NULL; + joinrte->updatedCols = NULL; + joinrte->extraUpdatedCols = NULL; + joinrte->securityQuals = NIL; + + /* + * Add completed RTE to pstate's range table list, so that we know its + * index. + */ + parse->rtable = lappend(parse->rtable, joinrte); + joinrti = list_length(parse->rtable); + + /* + * Create a JOIN between the target and the source relation. + */ + joinexpr = makeNode(JoinExpr); + joinexpr->jointype = jointype; + joinexpr->isNatural = false; + joinexpr->larg = (Node *) makeNode(RangeTblRef); + ((RangeTblRef *) joinexpr->larg)->rtindex = parse->resultRelation; + joinexpr->rarg = linitial(parse->jointree->fromlist); /* original join */ + joinexpr->usingClause = NIL; + joinexpr->join_using_alias = NULL; + /* The quals are removed from the jointree and into this specific join */ + joinexpr->quals = parse->jointree->quals; + joinexpr->alias = NULL; + joinexpr->rtindex = joinrti; + + /* Make the new join be the sole entry in the query's jointree */ + parse->jointree->fromlist = list_make1(joinexpr); + parse->jointree->quals = NULL; +} + /* * replace_empty_jointree * If the Query's jointree is empty, replace it with a dummy RTE_RESULT @@ -2058,6 +2138,17 @@ perform_pullup_replace_vars(PlannerInfo *root, * can't contain any references to a subquery. */ } + if (parse->mergeActionList) + { + foreach(lc, parse->mergeActionList) + { + MergeAction *action = lfirst(lc); + + action->qual = pullup_replace_vars(action->qual, rvcontext); + action->targetList = (List *) + pullup_replace_vars((Node *) action->targetList, rvcontext); + } + } replace_vars_in_jointree((Node *) parse->jointree, rvcontext, lowest_nulling_outer_join); Assert(parse->setOperations == NULL); diff --git a/src/backend/optimizer/prep/preptlist.c b/src/backend/optimizer/prep/preptlist.c index 95e82cf958..99ab3d7559 100644 --- a/src/backend/optimizer/prep/preptlist.c +++ b/src/backend/optimizer/prep/preptlist.c @@ -124,6 +124,43 @@ preprocess_targetlist(PlannerInfo *root) tlist = root->processed_tlist; } + /* + * For MERGE we need to handle the target list for the target relation, + * and also target list for each action (only INSERT/UPDATE matter). + */ + if (command_type == CMD_MERGE) + { + ListCell *l; + + /* + * For MERGE, add any junk column(s) needed to allow the executor to + * identify the rows to be inserted or updated. + */ + root->processed_tlist = tlist; + add_row_identity_columns(root, result_relation, + target_rte, target_relation); + + tlist = root->processed_tlist; + + /* + * For MERGE, handle targetlist of each MergeAction separately. Give + * the same treatment to MergeAction->targetList as we would have + * given to a regular INSERT. For UPDATE, collect the column numbers + * being modified. + */ + foreach(l, parse->mergeActionList) + { + MergeAction *action = (MergeAction *) lfirst(l); + + if (action->commandType == CMD_INSERT) + action->targetList = expand_insert_targetlist(action->targetList, + target_relation); + else if (action->commandType == CMD_UPDATE) + action->updateColnos = + extract_update_targetlist_colnos(action->targetList); + } + } + /* * Add necessary junk columns for rowmarked rels. These values are needed * for locking of rels selected FOR UPDATE/SHARE, and to do EvalPlanQual diff --git a/src/backend/optimizer/util/appendinfo.c b/src/backend/optimizer/util/appendinfo.c index 2f06fa743c..9d4bb47027 100644 --- a/src/backend/optimizer/util/appendinfo.c +++ b/src/backend/optimizer/util/appendinfo.c @@ -774,8 +774,8 @@ add_row_identity_var(PlannerInfo *root, Var *orig_var, Assert(orig_var->varlevelsup == 0); /* - * If we're doing non-inherited UPDATE/DELETE, there's little need for - * ROWID_VAR shenanigans. Just shove the presented Var into the + * If we're doing non-inherited UPDATE/DELETE/MERGE, there's little need + * for ROWID_VAR shenanigans. Just shove the presented Var into the * processed_tlist, and we're done. */ if (rtindex == root->parse->resultRelation) @@ -862,14 +862,16 @@ add_row_identity_columns(PlannerInfo *root, Index rtindex, char relkind = target_relation->rd_rel->relkind; Var *var; - Assert(commandType == CMD_UPDATE || commandType == CMD_DELETE); + Assert(commandType == CMD_UPDATE || commandType == CMD_DELETE || commandType == CMD_MERGE); - if (relkind == RELKIND_RELATION || + if (commandType == CMD_MERGE || + relkind == RELKIND_RELATION || relkind == RELKIND_MATVIEW || relkind == RELKIND_PARTITIONED_TABLE) { /* - * Emit CTID so that executor can find the row to update or delete. + * Emit CTID so that executor can find the row to merge, update or + * delete. */ var = makeVar(rtindex, SelfItemPointerAttributeNumber, @@ -942,8 +944,11 @@ distribute_row_identity_vars(PlannerInfo *root) RelOptInfo *target_rel; ListCell *lc; - /* There's nothing to do if this isn't an inherited UPDATE/DELETE. */ - if (parse->commandType != CMD_UPDATE && parse->commandType != CMD_DELETE) + /* + * There's nothing to do if this isn't an inherited UPDATE/DELETE/MERGE. + */ + if (parse->commandType != CMD_UPDATE && parse->commandType != CMD_DELETE && + parse->commandType != CMD_MERGE) { Assert(root->row_identity_vars == NIL); return; diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c index 5c32c96b71..99df76b6b7 100644 --- a/src/backend/optimizer/util/pathnode.c +++ b/src/backend/optimizer/util/pathnode.c @@ -3620,6 +3620,7 @@ create_lockrows_path(PlannerInfo *root, RelOptInfo *rel, * 'rowMarks' is a list of PlanRowMarks (non-locking only) * 'onconflict' is the ON CONFLICT clause, or NULL * 'epqParam' is the ID of Param for EvalPlanQual re-eval + * 'mergeActionLists' is a list of lists of MERGE actions (one per rel) */ ModifyTablePath * create_modifytable_path(PlannerInfo *root, RelOptInfo *rel, @@ -3631,13 +3632,14 @@ create_modifytable_path(PlannerInfo *root, RelOptInfo *rel, List *updateColnosLists, List *withCheckOptionLists, List *returningLists, List *rowMarks, OnConflictExpr *onconflict, - int epqParam) + List *mergeActionLists, int epqParam) { ModifyTablePath *pathnode = makeNode(ModifyTablePath); - Assert(operation == CMD_UPDATE ? - list_length(resultRelations) == list_length(updateColnosLists) : - updateColnosLists == NIL); + Assert(operation == CMD_MERGE || + (operation == CMD_UPDATE ? + list_length(resultRelations) == list_length(updateColnosLists) : + updateColnosLists == NIL)); Assert(withCheckOptionLists == NIL || list_length(resultRelations) == list_length(withCheckOptionLists)); Assert(returningLists == NIL || @@ -3697,6 +3699,7 @@ create_modifytable_path(PlannerInfo *root, RelOptInfo *rel, pathnode->rowMarks = rowMarks; pathnode->onconflict = onconflict; pathnode->epqParam = epqParam; + pathnode->mergeActionLists = mergeActionLists; return pathnode; } diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index a5002ad895..df97b79917 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -2167,6 +2167,10 @@ has_row_triggers(PlannerInfo *root, Index rti, CmdType event) trigDesc->trig_delete_before_row)) result = true; break; + /* There is no separate event for MERGE, only INSERT/UPDATE/DELETE */ + case CMD_MERGE: + result = false; + break; default: elog(ERROR, "unrecognized CmdType: %d", (int) event); break; diff --git a/src/backend/parser/Makefile b/src/backend/parser/Makefile index 5ddb9a92f0..9f1c4022bb 100644 --- a/src/backend/parser/Makefile +++ b/src/backend/parser/Makefile @@ -23,6 +23,7 @@ OBJS = \ parse_enr.o \ parse_expr.o \ parse_func.o \ + parse_merge.o \ parse_node.o \ parse_oper.o \ parse_param.o \ diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 61026753a3..0144284aa3 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -39,6 +39,7 @@ #include "parser/parse_cte.h" #include "parser/parse_expr.h" #include "parser/parse_func.h" +#include "parser/parse_merge.h" #include "parser/parse_oper.h" #include "parser/parse_param.h" #include "parser/parse_relation.h" @@ -60,9 +61,6 @@ post_parse_analyze_hook_type post_parse_analyze_hook = NULL; static Query *transformOptionalSelectInto(ParseState *pstate, Node *parseTree); static Query *transformDeleteStmt(ParseState *pstate, DeleteStmt *stmt); static Query *transformInsertStmt(ParseState *pstate, InsertStmt *stmt); -static List *transformInsertRow(ParseState *pstate, List *exprlist, - List *stmtcols, List *icolumns, List *attrnos, - bool strip_indirection); static OnConflictExpr *transformOnConflictClause(ParseState *pstate, OnConflictClause *onConflictClause); static int count_rowexpr_columns(ParseState *pstate, Node *expr); @@ -76,8 +74,6 @@ static void determineRecursiveColTypes(ParseState *pstate, static Query *transformReturnStmt(ParseState *pstate, ReturnStmt *stmt); static Query *transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt); static List *transformReturningList(ParseState *pstate, List *returningList); -static List *transformUpdateTargetList(ParseState *pstate, - List *targetList); static Query *transformPLAssignStmt(ParseState *pstate, PLAssignStmt *stmt); static Query *transformDeclareCursorStmt(ParseState *pstate, @@ -330,6 +326,7 @@ transformStmt(ParseState *pstate, Node *parseTree) case T_InsertStmt: case T_UpdateStmt: case T_DeleteStmt: + case T_MergeStmt: (void) test_raw_expression_coverage(parseTree, NULL); break; default: @@ -354,6 +351,10 @@ transformStmt(ParseState *pstate, Node *parseTree) result = transformUpdateStmt(pstate, (UpdateStmt *) parseTree); break; + case T_MergeStmt: + result = transformMergeStmt(pstate, (MergeStmt *) parseTree); + break; + case T_SelectStmt: { SelectStmt *n = (SelectStmt *) parseTree; @@ -438,6 +439,7 @@ analyze_requires_snapshot(RawStmt *parseTree) case T_InsertStmt: case T_DeleteStmt: case T_UpdateStmt: + case T_MergeStmt: case T_SelectStmt: case T_PLAssignStmt: result = true; @@ -956,7 +958,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt) * attrnos: integer column numbers (must be same length as icolumns) * strip_indirection: if true, remove any field/array assignment nodes */ -static List * +List * transformInsertRow(ParseState *pstate, List *exprlist, List *stmtcols, List *icolumns, List *attrnos, bool strip_indirection) @@ -1593,7 +1595,7 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) * Generate a targetlist as though expanding "*" */ Assert(pstate->p_next_resno == 1); - qry->targetList = expandNSItemAttrs(pstate, nsitem, 0, -1); + qry->targetList = expandNSItemAttrs(pstate, nsitem, 0, true, -1); /* * The grammar allows attaching ORDER BY, LIMIT, and FOR UPDATE to a @@ -2418,9 +2420,9 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt) /* * transformUpdateTargetList - - * handle SET clause in UPDATE/INSERT ... ON CONFLICT UPDATE + * handle SET clause in UPDATE/MERGE/INSERT ... ON CONFLICT UPDATE */ -static List * +List * transformUpdateTargetList(ParseState *pstate, List *origTlist) { List *tlist = NIL; diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index c6613af9fe..9399fff610 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -278,6 +278,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); struct SelectLimit *selectlimit; SetQuantifier setquantifier; struct GroupClause *groupclause; + MergeWhenClause *mergewhen; struct KeyActions *keyactions; struct KeyAction *keyaction; } @@ -307,7 +308,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); DropTransformStmt DropUserMappingStmt ExplainStmt FetchStmt GrantStmt GrantRoleStmt ImportForeignSchemaStmt IndexStmt InsertStmt - ListenStmt LoadStmt LockStmt NotifyStmt ExplainableStmt PreparableStmt + ListenStmt LoadStmt LockStmt MergeStmt NotifyStmt ExplainableStmt PreparableStmt CreateFunctionStmt AlterFunctionStmt ReindexStmt RemoveAggrStmt RemoveFuncStmt RemoveOperStmt RenameStmt ReturnStmt RevokeStmt RevokeRoleStmt RuleActionStmt RuleActionStmtOrEmpty RuleStmt @@ -433,6 +434,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); any_operator expr_list attrs distinct_clause opt_distinct_clause target_list opt_target_list insert_column_list set_target_list + merge_values_clause set_clause_list set_clause def_list operator_def_list indirection opt_indirection reloption_list TriggerFuncArgs opclass_item_list opclass_drop_list @@ -506,6 +508,10 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type insert_rest %type opt_conf_expr %type opt_on_conflict +%type merge_insert merge_update merge_delete + +%type merge_when_clause opt_merge_when_condition +%type merge_when_list %type generic_set set_rest set_rest_more generic_reset reset_rest SetResetClause FunctionSetResetClause @@ -734,7 +740,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); LEADING LEAKPROOF LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOCKED LOGGED - MAPPING MATCH MATERIALIZED MAXVALUE METHOD MINUTE_P MINVALUE MODE MONTH_P MOVE + MAPPING MATCH MATCHED MATERIALIZED MAXVALUE MERGE METHOD + MINUTE_P MINVALUE MODE MONTH_P MOVE NAME_P NAMES NATIONAL NATURAL NCHAR NEW NEXT NFC NFD NFKC NFKD NO NONE NORMALIZE NORMALIZED @@ -1061,6 +1068,7 @@ stmt: | RefreshMatViewStmt | LoadStmt | LockStmt + | MergeStmt | NotifyStmt | PrepareStmt | ReassignOwnedStmt @@ -11123,6 +11131,7 @@ ExplainableStmt: | InsertStmt | UpdateStmt | DeleteStmt + | MergeStmt | DeclareCursorStmt | CreateAsStmt | CreateMatViewStmt @@ -11155,7 +11164,8 @@ PreparableStmt: SelectStmt | InsertStmt | UpdateStmt - | DeleteStmt /* by default all are $$=$1 */ + | DeleteStmt + | MergeStmt /* by default all are $$=$1 */ ; /***************************************************************************** @@ -11540,6 +11550,166 @@ set_target_list: ; +/***************************************************************************** + * + * QUERY: + * MERGE + * + *****************************************************************************/ + +MergeStmt: + opt_with_clause MERGE INTO relation_expr_opt_alias + USING table_ref + ON a_expr + merge_when_list + { + MergeStmt *m = makeNode(MergeStmt); + + m->withClause = $1; + m->relation = $4; + m->sourceRelation = $6; + m->joinCondition = $8; + m->mergeWhenClauses = $9; + + $$ = (Node *)m; + } + ; + +merge_when_list: + merge_when_clause { $$ = list_make1($1); } + | merge_when_list merge_when_clause { $$ = lappend($1,$2); } + ; + +merge_when_clause: + WHEN MATCHED opt_merge_when_condition THEN merge_update + { + $5->matched = true; + $5->condition = $3; + + $$ = (Node *) $5; + } + | WHEN MATCHED opt_merge_when_condition THEN merge_delete + { + $5->matched = true; + $5->condition = $3; + + $$ = (Node *) $5; + } + | WHEN NOT MATCHED opt_merge_when_condition THEN merge_insert + { + $6->matched = false; + $6->condition = $4; + + $$ = (Node *) $6; + } + | WHEN MATCHED opt_merge_when_condition THEN DO NOTHING + { + MergeWhenClause *m = makeNode(MergeWhenClause); + + m->matched = true; + m->commandType = CMD_NOTHING; + m->condition = $3; + + $$ = (Node *)m; + } + | WHEN NOT MATCHED opt_merge_when_condition THEN DO NOTHING + { + MergeWhenClause *m = makeNode(MergeWhenClause); + + m->matched = false; + m->commandType = CMD_NOTHING; + m->condition = $4; + + $$ = (Node *)m; + } + ; + +opt_merge_when_condition: + AND a_expr { $$ = $2; } + | { $$ = NULL; } + ; + +merge_update: + UPDATE SET set_clause_list + { + MergeWhenClause *n = makeNode(MergeWhenClause); + n->commandType = CMD_UPDATE; + n->override = OVERRIDING_NOT_SET; + n->targetList = $3; + n->values = NIL; + + $$ = n; + } + ; + +merge_delete: + DELETE_P + { + MergeWhenClause *n = makeNode(MergeWhenClause); + n->commandType = CMD_DELETE; + n->override = OVERRIDING_NOT_SET; + n->targetList = NIL; + n->values = NIL; + + $$ = n; + } + ; + +merge_insert: + INSERT merge_values_clause + { + MergeWhenClause *n = makeNode(MergeWhenClause); + n->commandType = CMD_INSERT; + n->override = OVERRIDING_NOT_SET; + n->targetList = NIL; + n->values = $2; + $$ = n; + } + | INSERT OVERRIDING override_kind VALUE_P merge_values_clause + { + MergeWhenClause *n = makeNode(MergeWhenClause); + n->commandType = CMD_INSERT; + n->override = $3; + n->targetList = NIL; + n->values = $5; + $$ = n; + } + | INSERT '(' insert_column_list ')' merge_values_clause + { + MergeWhenClause *n = makeNode(MergeWhenClause); + n->commandType = CMD_INSERT; + n->override = OVERRIDING_NOT_SET; + n->targetList = $3; + n->values = $5; + $$ = n; + } + | INSERT '(' insert_column_list ')' OVERRIDING override_kind VALUE_P merge_values_clause + { + MergeWhenClause *n = makeNode(MergeWhenClause); + n->commandType = CMD_INSERT; + n->override = $6; + n->targetList = $3; + n->values = $8; + $$ = n; + } + | INSERT DEFAULT VALUES + { + MergeWhenClause *n = makeNode(MergeWhenClause); + n->commandType = CMD_INSERT; + n->override = OVERRIDING_NOT_SET; + n->targetList = NIL; + n->values = NIL; + $$ = n; + } + ; + +merge_values_clause: + VALUES '(' expr_list ')' + { + $$ = $3; + } + ; + /***************************************************************************** * * QUERY: @@ -16155,8 +16325,10 @@ unreserved_keyword: | LOGGED | MAPPING | MATCH + | MATCHED | MATERIALIZED | MAXVALUE + | MERGE | METHOD | MINUTE_P | MINVALUE @@ -16734,8 +16906,10 @@ bare_label_keyword: | LOGGED | MAPPING | MATCH + | MATCHED | MATERIALIZED | MAXVALUE + | MERGE | METHOD | MINVALUE | MODE diff --git a/src/backend/parser/parse_agg.c b/src/backend/parser/parse_agg.c index ded0a14d72..3ef9e8ee5e 100644 --- a/src/backend/parser/parse_agg.c +++ b/src/backend/parser/parse_agg.c @@ -433,6 +433,13 @@ check_agglevels_and_constraints(ParseState *pstate, Node *expr) case EXPR_KIND_UPDATE_SOURCE: case EXPR_KIND_UPDATE_TARGET: errkind = true; + break; + case EXPR_KIND_MERGE_WHEN: + if (isAgg) + err = _("aggregate functions are not allowed in MERGE WHEN conditions"); + else + err = _("grouping operations are not allowed in MERGE WHEN conditions"); + break; case EXPR_KIND_GROUP_BY: errkind = true; @@ -879,6 +886,9 @@ transformWindowFuncCall(ParseState *pstate, WindowFunc *wfunc, case EXPR_KIND_UPDATE_TARGET: errkind = true; break; + case EXPR_KIND_MERGE_WHEN: + err = _("window functions are not allowed in MERGE WHEN conditions"); + break; case EXPR_KIND_GROUP_BY: errkind = true; break; diff --git a/src/backend/parser/parse_collate.c b/src/backend/parser/parse_collate.c index 6c793b72ec..7582faabb3 100644 --- a/src/backend/parser/parse_collate.c +++ b/src/backend/parser/parse_collate.c @@ -485,6 +485,7 @@ assign_collations_walker(Node *node, assign_collations_context *context) case T_FromExpr: case T_OnConflictExpr: case T_SortGroupClause: + case T_MergeAction: (void) expression_tree_walker(node, assign_collations_walker, (void *) &loccontext); diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 781c9709e6..84be354f71 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -513,6 +513,7 @@ transformColumnRef(ParseState *pstate, ColumnRef *cref) case EXPR_KIND_INSERT_TARGET: case EXPR_KIND_UPDATE_SOURCE: case EXPR_KIND_UPDATE_TARGET: + case EXPR_KIND_MERGE_WHEN: case EXPR_KIND_GROUP_BY: case EXPR_KIND_ORDER_BY: case EXPR_KIND_DISTINCT_ON: @@ -1748,6 +1749,7 @@ transformSubLink(ParseState *pstate, SubLink *sublink) case EXPR_KIND_INSERT_TARGET: case EXPR_KIND_UPDATE_SOURCE: case EXPR_KIND_UPDATE_TARGET: + case EXPR_KIND_MERGE_WHEN: case EXPR_KIND_GROUP_BY: case EXPR_KIND_ORDER_BY: case EXPR_KIND_DISTINCT_ON: @@ -3075,6 +3077,8 @@ ParseExprKindName(ParseExprKind exprKind) case EXPR_KIND_UPDATE_SOURCE: case EXPR_KIND_UPDATE_TARGET: return "UPDATE"; + case EXPR_KIND_MERGE_WHEN: + return "MERGE WHEN"; case EXPR_KIND_GROUP_BY: return "GROUP BY"; case EXPR_KIND_ORDER_BY: diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index d91951e1f6..f71a682cd6 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -2611,6 +2611,9 @@ check_srf_call_placement(ParseState *pstate, Node *last_srf, int location) /* okay, since we process this like a SELECT tlist */ pstate->p_hasTargetSRFs = true; break; + case EXPR_KIND_MERGE_WHEN: + err = _("set-returning functions are not allowed in MERGE WHEN conditions"); + break; case EXPR_KIND_CHECK_CONSTRAINT: case EXPR_KIND_DOMAIN_CHECK: err = _("set-returning functions are not allowed in check constraints"); diff --git a/src/backend/parser/parse_merge.c b/src/backend/parser/parse_merge.c new file mode 100644 index 0000000000..5d0035a12b --- /dev/null +++ b/src/backend/parser/parse_merge.c @@ -0,0 +1,415 @@ +/*------------------------------------------------------------------------- + * + * parse_merge.c + * handle merge-statement in parser + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/parser/parse_merge.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "access/sysattr.h" +#include "miscadmin.h" +#include "nodes/makefuncs.h" +#include "nodes/nodeFuncs.h" +#include "parser/analyze.h" +#include "parser/parse_collate.h" +#include "parser/parsetree.h" +#include "parser/parser.h" +#include "parser/parse_clause.h" +#include "parser/parse_cte.h" +#include "parser/parse_expr.h" +#include "parser/parse_merge.h" +#include "parser/parse_relation.h" +#include "parser/parse_target.h" +#include "utils/rel.h" +#include "utils/relcache.h" + +static void setNamespaceForMergeWhen(ParseState *pstate, + MergeWhenClause *mergeWhenClause, + Index targetRTI, + Index sourceRTI); +static void setNamespaceVisibilityForRTE(List *namespace, RangeTblEntry *rte, + bool rel_visible, + bool cols_visible); + +/* + * Make appropriate changes to the namespace visibility while transforming + * individual action's quals and targetlist expressions. In particular, for + * INSERT actions we must only see the source relation (since INSERT action is + * invoked for NOT MATCHED tuples and hence there is no target tuple to deal + * with). On the other hand, UPDATE and DELETE actions can see both source and + * target relations. + * + * Also, since the internal join node can hide the source and target + * relations, we must explicitly make the respective relation as visible so + * that columns can be referenced unqualified from these relations. + */ +static void +setNamespaceForMergeWhen(ParseState *pstate, MergeWhenClause *mergeWhenClause, + Index targetRTI, Index sourceRTI) +{ + RangeTblEntry *targetRelRTE, + *sourceRelRTE; + + targetRelRTE = rt_fetch(targetRTI, pstate->p_rtable); + sourceRelRTE = rt_fetch(sourceRTI, pstate->p_rtable); + + if (mergeWhenClause->matched) + { + Assert(mergeWhenClause->commandType == CMD_UPDATE || + mergeWhenClause->commandType == CMD_DELETE || + mergeWhenClause->commandType == CMD_NOTHING); + + /* MATCHED actions can see both target and source relations. */ + setNamespaceVisibilityForRTE(pstate->p_namespace, + targetRelRTE, true, true); + setNamespaceVisibilityForRTE(pstate->p_namespace, + sourceRelRTE, true, true); + } + else + { + /* + * NOT MATCHED actions can't see target relation, but they can see + * source relation. + */ + Assert(mergeWhenClause->commandType == CMD_INSERT || + mergeWhenClause->commandType == CMD_NOTHING); + setNamespaceVisibilityForRTE(pstate->p_namespace, + targetRelRTE, false, false); + setNamespaceVisibilityForRTE(pstate->p_namespace, + sourceRelRTE, true, true); + } +} + +/* + * transformMergeStmt - + * transforms a MERGE statement + */ +Query * +transformMergeStmt(ParseState *pstate, MergeStmt *stmt) +{ + Query *qry = makeNode(Query); + ListCell *l; + AclMode targetPerms = ACL_NO_RIGHTS; + bool is_terminal[2]; + Index sourceRTI; + List *mergeActionList; + Node *joinExpr; + ParseNamespaceItem *nsitem; + + /* There can't be any outer WITH to worry about */ + Assert(pstate->p_ctenamespace == NIL); + + qry->commandType = CMD_MERGE; + qry->hasRecursive = false; + + /* process the WITH clause independently of all else */ + if (stmt->withClause) + { + if (stmt->withClause->recursive) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("WITH RECURSIVE is not supported for MERGE statement"))); + + qry->cteList = transformWithClause(pstate, stmt->withClause); + qry->hasModifyingCTE = pstate->p_hasModifyingCTE; + } + + /* + * Check WHEN clauses for permissions and sanity + */ + is_terminal[0] = false; + is_terminal[1] = false; + foreach(l, stmt->mergeWhenClauses) + { + MergeWhenClause *mergeWhenClause = (MergeWhenClause *) lfirst(l); + int when_type = (mergeWhenClause->matched ? 0 : 1); + + /* + * Collect action types so we can check target permissions + */ + switch (mergeWhenClause->commandType) + { + case CMD_INSERT: + targetPerms |= ACL_INSERT; + break; + case CMD_UPDATE: + targetPerms |= ACL_UPDATE; + break; + case CMD_DELETE: + targetPerms |= ACL_DELETE; + break; + case CMD_NOTHING: + break; + default: + elog(ERROR, "unknown action in MERGE WHEN clause"); + } + + /* + * Check for unreachable WHEN clauses + */ + if (mergeWhenClause->condition == NULL) + is_terminal[when_type] = true; + else if (is_terminal[when_type]) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("unreachable WHEN clause specified after unconditional WHEN clause"))); + } + + /* Set up the MERGE target table. */ + qry->resultRelation = setTargetTable(pstate, stmt->relation, + stmt->relation->inh, + false, targetPerms); + + /* + * MERGE is unsupported in various cases + */ + if (pstate->p_target_relation->rd_rel->relkind != RELKIND_RELATION && + pstate->p_target_relation->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot execute MERGE on relation \"%s\"", + RelationGetRelationName(pstate->p_target_relation)), + errdetail_relkind_not_supported(pstate->p_target_relation->rd_rel->relkind))); + if (pstate->p_target_relation->rd_rel->relhasrules) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot execute MERGE on relation \"%s\"", + RelationGetRelationName(pstate->p_target_relation)), + errdetail("MERGE is not supported for relations with rules."))); + + /* Now transform the source relation to produce the source RTE. */ + transformFromClause(pstate, + list_make1(stmt->sourceRelation)); + sourceRTI = list_length(pstate->p_rtable); + nsitem = GetNSItemByRangeTablePosn(pstate, sourceRTI, 0); + + /* + * Check that the target table doesn't conflict with the source table. + * This would typically be a checkNameSpaceConflicts call, but we want a + * more specific error message. + */ + if (strcmp(pstate->p_target_nsitem->p_names->aliasname, + nsitem->p_names->aliasname) == 0) + ereport(ERROR, + errcode(ERRCODE_DUPLICATE_ALIAS), + errmsg("name \"%s\" specified more than once", + pstate->p_target_nsitem->p_names->aliasname), + errdetail("The name is used both as MERGE target table and data source.")); + + qry->targetList = expandNSItemAttrs(pstate, nsitem, 0, false, + exprLocation(stmt->sourceRelation)); + + qry->rtable = pstate->p_rtable; + + /* + * Transform the join condition. This includes references to the target + * side, so add that to the namespace. + */ + addNSItemToQuery(pstate, pstate->p_target_nsitem, false, true, true); + joinExpr = transformExpr(pstate, stmt->joinCondition, + EXPR_KIND_JOIN_ON); + + /* + * Create the temporary query's jointree using the joinlist we built using + * just the source relation; the target relation is not included. The + * quals we use are the join conditions to the merge target. The join + * will be constructed fully by transform_MERGE_to_join. + */ + qry->jointree = makeFromExpr(pstate->p_joinlist, joinExpr); + + /* + * We now have a good query shape, so now look at the WHEN conditions and + * action targetlists. + * + * Overall, the MERGE Query's targetlist is NIL. + * + * Each individual action has its own targetlist that needs separate + * transformation. These transforms don't do anything to the overall + * targetlist, since that is only used for resjunk columns. + * + * We can reference any column in Target or Source, which is OK because + * both of those already have RTEs. There is nothing like the EXCLUDED + * pseudo-relation for INSERT ON CONFLICT. + */ + mergeActionList = NIL; + foreach(l, stmt->mergeWhenClauses) + { + MergeWhenClause *mergeWhenClause = lfirst_node(MergeWhenClause, l); + MergeAction *action; + + action = makeNode(MergeAction); + action->commandType = mergeWhenClause->commandType; + action->matched = mergeWhenClause->matched; + + /* Use an outer join if any INSERT actions exist in the command. */ + if (action->commandType == CMD_INSERT) + qry->mergeUseOuterJoin = true; + + /* + * Set namespace for the specific action. This must be done before + * analyzing the WHEN quals and the action targetlist. + */ + setNamespaceForMergeWhen(pstate, mergeWhenClause, + qry->resultRelation, + sourceRTI); + + /* + * Transform the WHEN condition. + * + * Note that these quals are NOT added to the join quals; instead they + * are evaluated separately during execution to decide which of the + * WHEN MATCHED or WHEN NOT MATCHED actions to execute. + */ + action->qual = transformWhereClause(pstate, mergeWhenClause->condition, + EXPR_KIND_MERGE_WHEN, "WHEN"); + + /* + * Transform target lists for each INSERT and UPDATE action stmt + */ + switch (action->commandType) + { + case CMD_INSERT: + { + List *exprList = NIL; + ListCell *lc; + RangeTblEntry *rte; + ListCell *icols; + ListCell *attnos; + List *icolumns; + List *attrnos; + + pstate->p_is_insert = true; + + icolumns = checkInsertTargets(pstate, + mergeWhenClause->targetList, + &attrnos); + Assert(list_length(icolumns) == list_length(attrnos)); + + action->override = mergeWhenClause->override; + + /* + * Handle INSERT much like in transformInsertStmt + */ + if (mergeWhenClause->values == NIL) + { + /* + * We have INSERT ... DEFAULT VALUES. We can handle + * this case by emitting an empty targetlist --- all + * columns will be defaulted when the planner expands + * the targetlist. + */ + exprList = NIL; + } + else + { + /* + * Process INSERT ... VALUES with a single VALUES + * sublist. We treat this case separately for + * efficiency. The sublist is just computed directly + * as the Query's targetlist, with no VALUES RTE. So + * it works just like a SELECT without any FROM. + */ + + /* + * Do basic expression transformation (same as a ROW() + * expr, but allow SetToDefault at top level) + */ + exprList = transformExpressionList(pstate, + mergeWhenClause->values, + EXPR_KIND_VALUES_SINGLE, + true); + + /* Prepare row for assignment to target table */ + exprList = transformInsertRow(pstate, exprList, + mergeWhenClause->targetList, + icolumns, attrnos, + false); + } + + /* + * Generate action's target list using the computed list + * of expressions. Also, mark all the target columns as + * needing insert permissions. + */ + rte = pstate->p_target_nsitem->p_rte; + forthree(lc, exprList, icols, icolumns, attnos, attrnos) + { + Expr *expr = (Expr *) lfirst(lc); + ResTarget *col = lfirst_node(ResTarget, icols); + AttrNumber attr_num = (AttrNumber) lfirst_int(attnos); + TargetEntry *tle; + + tle = makeTargetEntry(expr, + attr_num, + col->name, + false); + action->targetList = lappend(action->targetList, tle); + + rte->insertedCols = + bms_add_member(rte->insertedCols, + attr_num - FirstLowInvalidHeapAttributeNumber); + } + } + break; + case CMD_UPDATE: + { + pstate->p_is_insert = false; + action->targetList = + transformUpdateTargetList(pstate, + mergeWhenClause->targetList); + } + break; + case CMD_DELETE: + break; + + case CMD_NOTHING: + action->targetList = NIL; + break; + default: + elog(ERROR, "unknown action in MERGE WHEN clause"); + } + + mergeActionList = lappend(mergeActionList, action); + } + + qry->mergeActionList = mergeActionList; + + /* RETURNING could potentially be added in the future, but not in SQL std */ + qry->returningList = NULL; + + qry->hasTargetSRFs = false; + qry->hasSubLinks = pstate->p_hasSubLinks; + + assign_query_collations(pstate, qry); + + return qry; +} + +static void +setNamespaceVisibilityForRTE(List *namespace, RangeTblEntry *rte, + bool rel_visible, + bool cols_visible) +{ + ListCell *lc; + + foreach(lc, namespace) + { + ParseNamespaceItem *nsitem = (ParseNamespaceItem *) lfirst(lc); + + if (nsitem->p_rte == rte) + { + nsitem->p_rel_visible = rel_visible; + nsitem->p_cols_visible = cols_visible; + break; + } + } +} diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index cb9e177b5e..7efa5f15d7 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -701,6 +701,17 @@ scanNSItemForColumn(ParseState *pstate, ParseNamespaceItem *nsitem, colname), parser_errposition(pstate, location))); + /* + * In a MERGE WHEN condition, no system column is allowed except tableOid + */ + if (pstate->p_expr_kind == EXPR_KIND_MERGE_WHEN && + attnum < InvalidAttrNumber && attnum != TableOidAttributeNumber) + ereport(ERROR, + (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), + errmsg("cannot use system column \"%s\" in MERGE WHEN condition", + colname), + parser_errposition(pstate, location))); + /* Found a valid match, so build a Var */ if (attnum > InvalidAttrNumber) { @@ -3095,11 +3106,12 @@ expandNSItemVars(ParseNamespaceItem *nsitem, * for the attributes of the nsitem * * pstate->p_next_resno determines the resnos assigned to the TLEs. - * The referenced columns are marked as requiring SELECT access. + * The referenced columns are marked as requiring SELECT access, if + * caller requests that. */ List * expandNSItemAttrs(ParseState *pstate, ParseNamespaceItem *nsitem, - int sublevels_up, int location) + int sublevels_up, bool require_col_privs, int location) { RangeTblEntry *rte = nsitem->p_rte; List *names, @@ -3133,8 +3145,11 @@ expandNSItemAttrs(ParseState *pstate, ParseNamespaceItem *nsitem, false); te_list = lappend(te_list, te); - /* Require read access to each column */ - markVarForSelectPriv(pstate, varnode); + if (require_col_privs) + { + /* Require read access to each column */ + markVarForSelectPriv(pstate, varnode); + } } Assert(name == NULL && var == NULL); /* lists not the same length? */ diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index 204d285773..e6445c7baf 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -1308,6 +1308,7 @@ ExpandAllTables(ParseState *pstate, int location) expandNSItemAttrs(pstate, nsitem, 0, + true, location)); } @@ -1370,7 +1371,7 @@ ExpandSingleTable(ParseState *pstate, ParseNamespaceItem *nsitem, if (make_target_entry) { /* expandNSItemAttrs handles permissions marking */ - return expandNSItemAttrs(pstate, nsitem, sublevels_up, location); + return expandNSItemAttrs(pstate, nsitem, sublevels_up, true, location); } else { diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index 4eeed580b1..29ae27e5e3 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -1643,6 +1643,10 @@ matchLocks(CmdType event, if (rulelocks == NULL) return NIL; + /* No rule support for MERGE */ + if (parsetree->commandType == CMD_MERGE) + return NIL; + if (parsetree->commandType != CMD_SELECT) { if (parsetree->resultRelation != varno) @@ -3671,8 +3675,8 @@ RewriteQuery(Query *parsetree, List *rewrite_events) } /* - * If the statement is an insert, update, or delete, adjust its targetlist - * as needed, and then fire INSERT/UPDATE/DELETE rules on it. + * If the statement is an insert, update, delete, or merge, adjust its + * targetlist as needed, and then fire INSERT/UPDATE/DELETE rules on it. * * SELECT rules are handled later when we have all the queries that should * get executed. Also, utilities aren't rewritten at all (do we still @@ -3770,6 +3774,7 @@ RewriteQuery(Query *parsetree, List *rewrite_events) } else if (event == CMD_UPDATE) { + Assert(parsetree->override == OVERRIDING_NOT_SET); parsetree->targetList = rewriteTargetListIU(parsetree->targetList, parsetree->commandType, @@ -3780,6 +3785,38 @@ RewriteQuery(Query *parsetree, List *rewrite_events) /* Also populate extraUpdatedCols (for generated columns) */ fill_extraUpdatedCols(rt_entry, rt_entry_relation); } + else if (event == CMD_MERGE) + { + Assert(parsetree->override == OVERRIDING_NOT_SET); + + /* + * Rewrite each action targetlist separately + */ + foreach(lc1, parsetree->mergeActionList) + { + MergeAction *action = (MergeAction *) lfirst(lc1); + + switch (action->commandType) + { + case CMD_NOTHING: + case CMD_DELETE: /* Nothing to do here */ + break; + case CMD_UPDATE: + case CMD_INSERT: + /* XXX is it possible to have a VALUES clause? */ + action->targetList = + rewriteTargetListIU(action->targetList, + action->commandType, + action->override, + rt_entry_relation, + NULL, 0, NULL); + break; + default: + elog(ERROR, "unrecognized commandType: %d", action->commandType); + break; + } + } + } else if (event == CMD_DELETE) { /* Nothing to do here */ diff --git a/src/backend/rewrite/rowsecurity.c b/src/backend/rewrite/rowsecurity.c index f0a046d65a..a233dd4758 100644 --- a/src/backend/rewrite/rowsecurity.c +++ b/src/backend/rewrite/rowsecurity.c @@ -232,15 +232,17 @@ get_row_security_policies(Query *root, RangeTblEntry *rte, int rt_index, hasSubLinks); /* - * Similar to above, during an UPDATE or DELETE, if SELECT rights are also - * required (eg: when a RETURNING clause exists, or the user has provided - * a WHERE clause which involves columns from the relation), we collect up - * CMD_SELECT policies and add them via add_security_quals first. + * Similar to above, during an UPDATE, DELETE, or MERGE, if SELECT rights + * are also required (eg: when a RETURNING clause exists, or the user has + * provided a WHERE clause which involves columns from the relation), we + * collect up CMD_SELECT policies and add them via add_security_quals + * first. * * This way, we filter out any records which are not visible through an * ALL or SELECT USING policy. */ - if ((commandType == CMD_UPDATE || commandType == CMD_DELETE) && + if ((commandType == CMD_UPDATE || commandType == CMD_DELETE || + commandType == CMD_MERGE) && rte->requiredPerms & ACL_SELECT) { List *select_permissive_policies; @@ -380,6 +382,92 @@ get_row_security_policies(Query *root, RangeTblEntry *rte, int rt_index, } } + /* + * FOR MERGE, we fetch policies for UPDATE, DELETE and INSERT (and ALL) + * and set them up so that we can enforce the appropriate policy depending + * on the final action we take. + * + * We already fetched the SELECT policies above. + * + * We don't push the UPDATE/DELETE USING quals to the RTE because we don't + * really want to apply them while scanning the relation since we don't + * know whether we will be doing an UPDATE or a DELETE at the end. We + * apply the respective policy once we decide the final action on the + * target tuple. + * + * XXX We are setting up USING quals as WITH CHECK. If RLS prohibits + * UPDATE/DELETE on the target row, we shall throw an error instead of + * silently ignoring the row. This is different than how normal + * UPDATE/DELETE works and more in line with INSERT ON CONFLICT DO UPDATE + * handling. + */ + if (commandType == CMD_MERGE) + { + List *merge_permissive_policies; + List *merge_restrictive_policies; + + /* + * Fetch the UPDATE policies and set them up to execute on the + * existing target row before doing UPDATE. + */ + get_policies_for_relation(rel, CMD_UPDATE, user_id, + &merge_permissive_policies, + &merge_restrictive_policies); + + /* + * WCO_RLS_MERGE_UPDATE_CHECK is used to check UPDATE USING quals on + * the existing target row. + */ + add_with_check_options(rel, rt_index, + WCO_RLS_MERGE_UPDATE_CHECK, + merge_permissive_policies, + merge_restrictive_policies, + withCheckOptions, + hasSubLinks, + true); + + /* + * Same with DELETE policies. + */ + get_policies_for_relation(rel, CMD_DELETE, user_id, + &merge_permissive_policies, + &merge_restrictive_policies); + + add_with_check_options(rel, rt_index, + WCO_RLS_MERGE_DELETE_CHECK, + merge_permissive_policies, + merge_restrictive_policies, + withCheckOptions, + hasSubLinks, + true); + + /* + * No special handling is required for INSERT policies. They will be + * checked and enforced during ExecInsert(). But we must add them to + * withCheckOptions. + */ + get_policies_for_relation(rel, CMD_INSERT, user_id, + &merge_permissive_policies, + &merge_restrictive_policies); + + add_with_check_options(rel, rt_index, + WCO_RLS_INSERT_CHECK, + merge_permissive_policies, + merge_restrictive_policies, + withCheckOptions, + hasSubLinks, + false); + + /* Enforce the WITH CHECK clauses of the UPDATE policies */ + add_with_check_options(rel, rt_index, + WCO_RLS_UPDATE_CHECK, + merge_permissive_policies, + merge_restrictive_policies, + withCheckOptions, + hasSubLinks, + false); + } + table_close(rel, NoLock); /* @@ -444,6 +532,14 @@ get_policies_for_relation(Relation relation, CmdType cmd, Oid user_id, if (policy->polcmd == ACL_DELETE_CHR) cmd_matches = true; break; + case CMD_MERGE: + + /* + * We do not support a separate policy for MERGE command. + * Instead it derives from the policies defined for other + * commands. + */ + break; default: elog(ERROR, "unrecognized policy command type %d", (int) cmd); diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c index 5f907831a3..5aa5a350f3 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -178,6 +178,9 @@ ProcessQuery(PlannedStmt *plan, case CMD_DELETE: SetQueryCompletion(qc, CMDTAG_DELETE, queryDesc->estate->es_processed); break; + case CMD_MERGE: + SetQueryCompletion(qc, CMDTAG_MERGE, queryDesc->estate->es_processed); + break; default: SetQueryCompletion(qc, CMDTAG_UNKNOWN, queryDesc->estate->es_processed); break; diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 3780c6e812..f364a9b88a 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -113,6 +113,7 @@ CommandIsReadOnly(PlannedStmt *pstmt) case CMD_UPDATE: case CMD_INSERT: case CMD_DELETE: + case CMD_MERGE: return false; case CMD_UTILITY: /* For now, treat all utility commands as read/write */ @@ -2124,6 +2125,8 @@ QueryReturnsTuples(Query *parsetree) case CMD_SELECT: /* returns tuples */ return true; + case CMD_MERGE: + return false; case CMD_INSERT: case CMD_UPDATE: case CMD_DELETE: @@ -2365,6 +2368,10 @@ CreateCommandTag(Node *parsetree) tag = CMDTAG_UPDATE; break; + case T_MergeStmt: + tag = CMDTAG_MERGE; + break; + case T_SelectStmt: tag = CMDTAG_SELECT; break; @@ -3125,6 +3132,9 @@ CreateCommandTag(Node *parsetree) case CMD_DELETE: tag = CMDTAG_DELETE; break; + case CMD_MERGE: + tag = CMDTAG_MERGE; + break; case CMD_UTILITY: tag = CreateCommandTag(stmt->utilityStmt); break; @@ -3185,6 +3195,9 @@ CreateCommandTag(Node *parsetree) case CMD_DELETE: tag = CMDTAG_DELETE; break; + case CMD_MERGE: + tag = CMDTAG_MERGE; + break; case CMD_UTILITY: tag = CreateCommandTag(stmt->utilityStmt); break; @@ -3233,6 +3246,7 @@ GetCommandLogLevel(Node *parsetree) case T_InsertStmt: case T_DeleteStmt: case T_UpdateStmt: + case T_MergeStmt: lev = LOGSTMT_MOD; break; @@ -3682,6 +3696,7 @@ GetCommandLogLevel(Node *parsetree) case CMD_UPDATE: case CMD_INSERT: case CMD_DELETE: + case CMD_MERGE: lev = LOGSTMT_MOD; break; @@ -3712,6 +3727,7 @@ GetCommandLogLevel(Node *parsetree) case CMD_UPDATE: case CMD_INSERT: case CMD_DELETE: + case CMD_MERGE: lev = LOGSTMT_MOD; break; diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index df5c486501..82dc849a30 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -4940,6 +4940,8 @@ set_deparse_plan(deparse_namespace *dpns, Plan *plan) * For a WorkTableScan, locate the parent RecursiveUnion plan node and use * that as INNER referent. * + * For MERGE, make the inner tlist point to the merge source tlist, which + * is same as the targetlist that the ModifyTable's source plan provides. * For ON CONFLICT .. UPDATE we just need the inner tlist to point to the * excluded expression's tlist. (Similar to the SubqueryScan we don't want * to reuse OUTER, it's used for RETURNING in some modify table cases, @@ -4959,7 +4961,12 @@ set_deparse_plan(deparse_namespace *dpns, Plan *plan) dpns->inner_plan = innerPlan(plan); if (IsA(plan, ModifyTable)) - dpns->inner_tlist = ((ModifyTable *) plan)->exclRelTlist; + { + if (((ModifyTable *) plan)->operation == CMD_MERGE) + dpns->inner_tlist = dpns->outer_plan->targetlist; + else + dpns->inner_tlist = ((ModifyTable *) plan)->exclRelTlist; + } else if (dpns->inner_plan) dpns->inner_tlist = dpns->inner_plan->targetlist; else diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 63bfdf11c6..c97d3e87f0 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -820,6 +820,17 @@ static const SchemaQuery Query_for_list_of_updatables = { .result = "c.relname", }; +/* Relations supporting MERGE */ +static const SchemaQuery Query_for_list_of_mergetargets = { + .catname = "pg_catalog.pg_class c", + .selcondition = + "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", " + CppAsString2(RELKIND_PARTITIONED_TABLE) ") ", + .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", + .namespace = "c.relnamespace", + .result = "c.relname", +}; + /* Relations supporting SELECT */ static const SchemaQuery Query_for_list_of_selectables = { .catname = "pg_catalog.pg_class c", @@ -1664,7 +1675,7 @@ psql_completion(const char *text, int start, int end) "COMMENT", "COMMIT", "COPY", "CREATE", "DEALLOCATE", "DECLARE", "DELETE FROM", "DISCARD", "DO", "DROP", "END", "EXECUTE", "EXPLAIN", "FETCH", "GRANT", "IMPORT FOREIGN SCHEMA", "INSERT INTO", "LISTEN", "LOAD", "LOCK", - "MOVE", "NOTIFY", "PREPARE", + "MERGE", "MOVE", "NOTIFY", "PREPARE", "REASSIGN", "REFRESH MATERIALIZED VIEW", "REINDEX", "RELEASE", "RESET", "REVOKE", "ROLLBACK", "SAVEPOINT", "SECURITY LABEL", "SELECT", "SET", "SHOW", "START", @@ -3627,7 +3638,7 @@ psql_completion(const char *text, int start, int end) */ else if (Matches("EXPLAIN")) COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE", - "EXECUTE", "ANALYZE", "VERBOSE"); + "MERGE", "EXECUTE", "ANALYZE", "VERBOSE"); else if (HeadMatches("EXPLAIN", "(*") && !HeadMatches("EXPLAIN", "(*)")) { @@ -3646,12 +3657,12 @@ psql_completion(const char *text, int start, int end) } else if (Matches("EXPLAIN", "ANALYZE")) COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE", - "EXECUTE", "VERBOSE"); + "MERGE", "EXECUTE", "VERBOSE"); else if (Matches("EXPLAIN", "(*)") || Matches("EXPLAIN", "VERBOSE") || Matches("EXPLAIN", "ANALYZE", "VERBOSE")) COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE", - "EXECUTE"); + "MERGE", "EXECUTE"); /* FETCH && MOVE */ @@ -3913,6 +3924,9 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("OPTIONS ("); /* INSERT --- can be inside EXPLAIN, RULE, etc */ + /* Complete NOT MATCHED THEN INSERT */ + else if (TailMatches("NOT", "MATCHED", "THEN", "INSERT")) + COMPLETE_WITH("VALUES", "("); /* Complete INSERT with "INTO" */ else if (TailMatches("INSERT")) COMPLETE_WITH("INTO"); @@ -3988,6 +4002,53 @@ psql_completion(const char *text, int start, int end) else if (HeadMatches("LOCK") && TailMatches("IN", "SHARE")) COMPLETE_WITH("MODE", "ROW EXCLUSIVE MODE", "UPDATE EXCLUSIVE MODE"); +/* MERGE --- can be inside EXPLAIN */ + else if (TailMatches("MERGE")) + COMPLETE_WITH("INTO"); + else if (TailMatches("MERGE", "INTO")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_mergetargets); + else if (TailMatches("MERGE", "INTO", MatchAny)) + COMPLETE_WITH("USING", "AS"); + else if (TailMatches("MERGE", "INTO", MatchAny, "USING")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); + /* with [AS] alias */ + else if (TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny)) + COMPLETE_WITH("USING"); + else if (TailMatches("MERGE", "INTO", MatchAny, MatchAny)) + COMPLETE_WITH("USING"); + else if (TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); + else if (TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); + /* ON */ + else if (TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny)) + COMPLETE_WITH("ON"); + else if (TailMatches("INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny)) + COMPLETE_WITH("ON"); + else if (TailMatches("INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAny)) + COMPLETE_WITH("ON"); + /* ON condition */ + else if (TailMatches("INTO", MatchAny, "USING", MatchAny, "ON")) + COMPLETE_WITH_ATTR(prev4_wd); + else if (TailMatches("INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny, "ON")) + COMPLETE_WITH_ATTR(prev8_wd); + else if (TailMatches("INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAny, "ON")) + COMPLETE_WITH_ATTR(prev6_wd); + /* WHEN [NOT] MATCHED */ + else if (TailMatches("USING", MatchAny, "ON", MatchAny)) + COMPLETE_WITH("WHEN MATCHED", "WHEN NOT MATCHED"); + else if (TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny)) + COMPLETE_WITH("WHEN MATCHED", "WHEN NOT MATCHED"); + else if (TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny)) + COMPLETE_WITH("WHEN MATCHED", "WHEN NOT MATCHED"); + else if (TailMatches("WHEN", "MATCHED")) + COMPLETE_WITH("THEN", "AND"); + else if (TailMatches("WHEN", "NOT", "MATCHED")) + COMPLETE_WITH("THEN", "AND"); + else if (TailMatches("WHEN", "MATCHED", "THEN")) + COMPLETE_WITH("UPDATE", "DELETE"); + else if (TailMatches("WHEN", "NOT", "MATCHED", "THEN")) + COMPLETE_WITH("INSERT", "DO NOTHING"); /* Complete LOCK [TABLE] [ONLY] [IN lockmode MODE] with "NOWAIT" */ else if (HeadMatches("LOCK") && TailMatches("MODE")) diff --git a/src/include/commands/trigger.h b/src/include/commands/trigger.h index 66bf6c16e3..194e8d5bc1 100644 --- a/src/include/commands/trigger.h +++ b/src/include/commands/trigger.h @@ -13,6 +13,7 @@ #ifndef TRIGGER_H #define TRIGGER_H +#include "access/tableam.h" #include "catalog/objectaddress.h" #include "nodes/execnodes.h" #include "nodes/parsenodes.h" @@ -229,7 +230,8 @@ extern bool ExecBRUpdateTriggers(EState *estate, ResultRelInfo *relinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, - TupleTableSlot *slot); + TupleTableSlot *slot, + TM_FailureData *tmfdp); extern void ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, ResultRelInfo *src_partinfo, diff --git a/src/include/executor/nodeModifyTable.h b/src/include/executor/nodeModifyTable.h index 1d225bc88d..c318681b9a 100644 --- a/src/include/executor/nodeModifyTable.h +++ b/src/include/executor/nodeModifyTable.h @@ -23,4 +23,7 @@ extern ModifyTableState *ExecInitModifyTable(ModifyTable *node, EState *estate, extern void ExecEndModifyTable(ModifyTableState *node); extern void ExecReScanModifyTable(ModifyTableState *node); +extern void ExecInitMergeTupleSlots(ModifyTableState *mtstate, + ResultRelInfo *resultRelInfo); + #endif /* NODEMODIFYTABLE_H */ diff --git a/src/include/executor/spi.h b/src/include/executor/spi.h index 6ec3851444..b2c0c7486c 100644 --- a/src/include/executor/spi.h +++ b/src/include/executor/spi.h @@ -96,6 +96,7 @@ typedef struct _SPI_plan *SPIPlanPtr; #define SPI_OK_REL_REGISTER 15 #define SPI_OK_REL_UNREGISTER 16 #define SPI_OK_TD_REGISTER 17 +#define SPI_OK_MERGE 18 #define SPI_OPT_NONATOMIC (1 << 0) diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index 44dd73fc80..cbbcff81d2 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -389,6 +389,22 @@ typedef struct OnConflictSetState ExprState *oc_WhereClause; /* state for the WHERE clause */ } OnConflictSetState; +/* ---------------- + * MergeActionState information + * + * Executor state for a MERGE action. + * ---------------- + */ +typedef struct MergeActionState +{ + NodeTag type; + + MergeAction *mas_action; /* associated MergeAction node */ + ProjectionInfo *mas_proj; /* projection of the action's targetlist for + * this rel */ + ExprState *mas_whenqual; /* WHEN [NOT] MATCHED AND conditions */ +} MergeActionState; + /* * ResultRelInfo * @@ -500,6 +516,10 @@ typedef struct ResultRelInfo /* ON CONFLICT evaluation state */ OnConflictSetState *ri_onConflict; + /* for MERGE, lists of MergeActionState */ + List *ri_matchedMergeAction; + List *ri_notMatchedMergeAction; + /* partition check expression state (NULL if not set up yet) */ ExprState *ri_PartitionCheckExpr; @@ -1190,6 +1210,12 @@ typedef struct ProjectSetState MemoryContext argcontext; /* context for SRF arguments */ } ProjectSetState; + +/* flags for mt_merge_subcommands */ +#define MERGE_INSERT 0x01 +#define MERGE_UPDATE 0x02 +#define MERGE_DELETE 0x04 + /* ---------------- * ModifyTableState information * ---------------- @@ -1197,7 +1223,7 @@ typedef struct ProjectSetState typedef struct ModifyTableState { PlanState ps; /* its first field is NodeTag */ - CmdType operation; /* INSERT, UPDATE, or DELETE */ + CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */ bool canSetTag; /* do we set the command tag/es_processed? */ bool mt_done; /* are we done? */ int mt_nrels; /* number of entries in resultRelInfo[] */ @@ -1239,6 +1265,14 @@ typedef struct ModifyTableState /* controls transition table population for INSERT...ON CONFLICT UPDATE */ struct TransitionCaptureState *mt_oc_transition_capture; + + /* Flags showing which subcommands are present INS/UPD/DEL/DO NOTHING */ + int mt_merge_subcommands; + + /* tuple counters for MERGE */ + double mt_merge_inserted; + double mt_merge_updated; + double mt_merge_deleted; } ModifyTableState; /* ---------------- diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index 05f0b79e82..ca440eb75f 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -35,6 +35,7 @@ typedef enum NodeTag T_ProjectionInfo, T_JunkFilter, T_OnConflictSetState, + T_MergeActionState, T_ResultRelInfo, T_EState, T_TupleTableSlot, @@ -283,6 +284,7 @@ typedef enum NodeTag T_RollupData, T_GroupingSetData, T_StatisticExtInfo, + T_MergeAction, /* * TAGS FOR MEMORY NODES (memnodes.h) @@ -321,6 +323,7 @@ typedef enum NodeTag T_InsertStmt, T_DeleteStmt, T_UpdateStmt, + T_MergeStmt, T_SelectStmt, T_ReturnStmt, T_PLAssignStmt, @@ -485,6 +488,7 @@ typedef enum NodeTag T_CTESearchClause, T_CTECycleClause, T_CommonTableExpr, + T_MergeWhenClause, T_RoleSpec, T_TriggerTransition, T_PartitionElem, @@ -698,7 +702,8 @@ typedef enum CmdType CMD_SELECT, /* select stmt */ CMD_UPDATE, /* update stmt */ CMD_INSERT, /* insert stmt */ - CMD_DELETE, + CMD_DELETE, /* delete stmt */ + CMD_MERGE, /* merge stmt */ CMD_UTILITY, /* cmds like create, destroy, copy, vacuum, * etc. */ CMD_NOTHING /* dummy command for instead nothing rules diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 3b12a708ec..6bf212b01a 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -119,7 +119,7 @@ typedef struct Query { NodeTag type; - CmdType commandType; /* select|insert|update|delete|utility */ + CmdType commandType; /* select|insert|update|delete|merge|utility */ QuerySource querySource; /* where did I come from? */ @@ -130,7 +130,7 @@ typedef struct Query Node *utilityStmt; /* non-null if commandType == CMD_UTILITY */ int resultRelation; /* rtable index of target relation for - * INSERT/UPDATE/DELETE; 0 for SELECT */ + * INSERT/UPDATE/DELETE/MERGE; 0 for SELECT */ bool hasAggs; /* has aggregates in tlist or havingQual */ bool hasWindowFuncs; /* has window functions in tlist */ @@ -147,7 +147,11 @@ typedef struct Query List *cteList; /* WITH list (of CommonTableExpr's) */ List *rtable; /* list of range table entries */ - FromExpr *jointree; /* table join tree (FROM and WHERE clauses) */ + FromExpr *jointree; /* table join tree (FROM and WHERE clauses); + * also USING clause for MERGE */ + + List *mergeActionList; /* list of actions for MERGE (only) */ + bool mergeUseOuterJoin; /* whether to use outer join */ List *targetList; /* target list (of TargetEntry) */ @@ -1221,7 +1225,9 @@ typedef enum WCOKind WCO_VIEW_CHECK, /* WCO on an auto-updatable view */ WCO_RLS_INSERT_CHECK, /* RLS INSERT WITH CHECK policy */ WCO_RLS_UPDATE_CHECK, /* RLS UPDATE WITH CHECK policy */ - WCO_RLS_CONFLICT_CHECK /* RLS ON CONFLICT DO UPDATE USING policy */ + WCO_RLS_CONFLICT_CHECK, /* RLS ON CONFLICT DO UPDATE USING policy */ + WCO_RLS_MERGE_UPDATE_CHECK, /* RLS MERGE UPDATE USING policy */ + WCO_RLS_MERGE_DELETE_CHECK /* RLS MERGE DELETE USING policy */ } WCOKind; typedef struct WithCheckOption @@ -1537,6 +1543,39 @@ typedef struct CommonTableExpr ((Query *) (cte)->ctequery)->targetList : \ ((Query *) (cte)->ctequery)->returningList) +/* + * MergeWhenClause - + * raw parser representation of a WHEN clause in a MERGE statement + * + * This is transformed into MergeAction by parse analysis + */ +typedef struct MergeWhenClause +{ + NodeTag type; + bool matched; /* true=MATCHED, false=NOT MATCHED */ + CmdType commandType; /* INSERT/UPDATE/DELETE/DO NOTHING */ + OverridingKind override; /* OVERRIDING clause */ + Node *condition; /* WHEN conditions (raw parser) */ + List *targetList; /* INSERT/UPDATE targetlist */ + /* the following members are only used in INSERT actions */ + List *values; /* VALUES to INSERT, or NULL */ +} MergeWhenClause; + +/* + * MergeAction - + * Transformed representation of a WHEN clause in a MERGE statement + */ +typedef struct MergeAction +{ + NodeTag type; + bool matched; /* true=MATCHED, false=NOT MATCHED */ + CmdType commandType; /* INSERT/UPDATE/DELETE/DO NOTHING */ + OverridingKind override; /* OVERRIDING clause */ + Node *qual; /* transformed WHEN conditions */ + List *targetList; /* the target list (of TargetEntry) */ + List *updateColnos; /* target attribute numbers of an UPDATE */ +} MergeAction; + /* * TriggerTransition - * representation of transition row or table naming clause @@ -1737,6 +1776,20 @@ typedef struct UpdateStmt WithClause *withClause; /* WITH clause */ } UpdateStmt; +/* ---------------------- + * Merge Statement + * ---------------------- + */ +typedef struct MergeStmt +{ + NodeTag type; + RangeVar *relation; /* target relation to merge into */ + Node *sourceRelation; /* source relation */ + Node *joinCondition; /* join condition between source and target */ + List *mergeWhenClauses; /* list of MergeWhenClause(es) */ + WithClause *withClause; /* WITH clause */ +} MergeStmt; + /* ---------------------- * Select Statement * diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h index 1f3845b3fe..365000bdcd 100644 --- a/src/include/nodes/pathnodes.h +++ b/src/include/nodes/pathnodes.h @@ -1875,7 +1875,7 @@ typedef struct LockRowsPath } LockRowsPath; /* - * ModifyTablePath represents performing INSERT/UPDATE/DELETE modifications + * ModifyTablePath represents performing INSERT/UPDATE/DELETE/MERGE * * We represent most things that will be in the ModifyTable plan node * literally, except we have a child Path not Plan. But analysis of the @@ -1885,7 +1885,7 @@ typedef struct ModifyTablePath { Path path; Path *subpath; /* Path producing source data */ - CmdType operation; /* INSERT, UPDATE, or DELETE */ + CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */ bool canSetTag; /* do we set the command tag/es_processed? */ Index nominalRelation; /* Parent RT index for use of EXPLAIN */ Index rootRelation; /* Root RT index, if target is partitioned */ @@ -1897,6 +1897,8 @@ typedef struct ModifyTablePath List *rowMarks; /* PlanRowMarks (non-locking only) */ OnConflictExpr *onconflict; /* ON CONFLICT clause, or NULL */ int epqParam; /* ID of Param for EvalPlanQual re-eval */ + List *mergeActionLists; /* per-target-table lists of actions for + * MERGE */ } ModifyTablePath; /* diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h index 0b518ce6b2..50ef3dda05 100644 --- a/src/include/nodes/plannodes.h +++ b/src/include/nodes/plannodes.h @@ -19,6 +19,7 @@ #include "lib/stringinfo.h" #include "nodes/bitmapset.h" #include "nodes/lockoptions.h" +#include "nodes/parsenodes.h" #include "nodes/primnodes.h" @@ -43,7 +44,7 @@ typedef struct PlannedStmt { NodeTag type; - CmdType commandType; /* select|insert|update|delete|utility */ + CmdType commandType; /* select|insert|update|delete|merge|utility */ uint64 queryId; /* query identifier (copied from Query) */ @@ -217,7 +218,7 @@ typedef struct ProjectSet typedef struct ModifyTable { Plan plan; - CmdType operation; /* INSERT, UPDATE, or DELETE */ + CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */ bool canSetTag; /* do we set the command tag/es_processed? */ Index nominalRelation; /* Parent RT index for use of EXPLAIN */ Index rootRelation; /* Root RT index, if target is partitioned */ @@ -237,6 +238,8 @@ typedef struct ModifyTable Node *onConflictWhere; /* WHERE for ON CONFLICT UPDATE */ Index exclRelRTI; /* RTI of the EXCLUDED pseudo relation */ List *exclRelTlist; /* tlist of the EXCLUDED pseudo relation */ + List *mergeActionLists; /* per-target-table lists of actions for + * MERGE */ } ModifyTable; struct PartitionPruneInfo; /* forward reference to struct below */ diff --git a/src/include/optimizer/pathnode.h b/src/include/optimizer/pathnode.h index 620eeda2d6..6eca547af8 100644 --- a/src/include/optimizer/pathnode.h +++ b/src/include/optimizer/pathnode.h @@ -276,7 +276,7 @@ extern ModifyTablePath *create_modifytable_path(PlannerInfo *root, List *updateColnosLists, List *withCheckOptionLists, List *returningLists, List *rowMarks, OnConflictExpr *onconflict, - int epqParam); + List *mergeActionLists, int epqParam); extern LimitPath *create_limit_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, Node *limitOffset, Node *limitCount, diff --git a/src/include/optimizer/prep.h b/src/include/optimizer/prep.h index 006b4d02c3..2b11ff1d1f 100644 --- a/src/include/optimizer/prep.h +++ b/src/include/optimizer/prep.h @@ -21,6 +21,7 @@ /* * prototypes for prepjointree.c */ +extern void transform_MERGE_to_join(Query *parse); extern void replace_empty_jointree(Query *parse); extern void pull_up_sublinks(PlannerInfo *root); extern void preprocess_function_rtes(PlannerInfo *root); diff --git a/src/include/parser/analyze.h b/src/include/parser/analyze.h index b30cbd26bf..c69920d108 100644 --- a/src/include/parser/analyze.h +++ b/src/include/parser/analyze.h @@ -39,6 +39,11 @@ extern Query *parse_sub_analyze(Node *parseTree, ParseState *parentParseState, bool locked_from_parent, bool resolve_unknowns); +extern List *transformInsertRow(ParseState *pstate, List *exprlist, + List *stmtcols, List *icolumns, List *attrnos, + bool strip_indirection); +extern List *transformUpdateTargetList(ParseState *pstate, + List *targetList); extern Query *transformTopLevelStmt(ParseState *pstate, RawStmt *parseTree); extern Query *transformStmt(ParseState *pstate, Node *parseTree); diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index f44440d4a9..10829941e0 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -259,8 +259,10 @@ PG_KEYWORD("locked", LOCKED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("logged", LOGGED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("mapping", MAPPING, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("match", MATCH, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("matched", MATCHED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("materialized", MATERIALIZED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("maxvalue", MAXVALUE, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("merge", MERGE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("method", METHOD, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("minute", MINUTE_P, UNRESERVED_KEYWORD, AS_LABEL) PG_KEYWORD("minvalue", MINVALUE, UNRESERVED_KEYWORD, BARE_LABEL) diff --git a/src/include/parser/parse_merge.h b/src/include/parser/parse_merge.h new file mode 100644 index 0000000000..1a1baa1f48 --- /dev/null +++ b/src/include/parser/parse_merge.h @@ -0,0 +1,21 @@ +/*------------------------------------------------------------------------- + * + * parse_merge.h + * handle MERGE statement in parser + * + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/parser/parse_merge.h + * + *------------------------------------------------------------------------- + */ +#ifndef PARSE_MERGE_H +#define PARSE_MERGE_H + +#include "parser/parse_node.h" + +extern Query *transformMergeStmt(ParseState *pstate, MergeStmt *stmt); + +#endif /* PARSE_MERGE_H */ diff --git a/src/include/parser/parse_node.h b/src/include/parser/parse_node.h index 8c859d0d0e..cf9c759025 100644 --- a/src/include/parser/parse_node.h +++ b/src/include/parser/parse_node.h @@ -55,6 +55,7 @@ typedef enum ParseExprKind EXPR_KIND_INSERT_TARGET, /* INSERT target list item */ EXPR_KIND_UPDATE_SOURCE, /* UPDATE assignment source item */ EXPR_KIND_UPDATE_TARGET, /* UPDATE assignment target item */ + EXPR_KIND_MERGE_WHEN, /* MERGE WHEN [NOT] MATCHED condition */ EXPR_KIND_GROUP_BY, /* GROUP BY */ EXPR_KIND_ORDER_BY, /* ORDER BY */ EXPR_KIND_DISTINCT_ON, /* DISTINCT ON */ @@ -135,7 +136,7 @@ typedef Node *(*CoerceParamHook) (ParseState *pstate, Param *param, * p_parent_cte: CommonTableExpr that immediately contains the current query, * if any. * - * p_target_relation: target relation, if query is INSERT, UPDATE, or DELETE. + * p_target_relation: target relation, if query is INSERT/UPDATE/DELETE/MERGE * * p_target_nsitem: target relation's ParseNamespaceItem. * @@ -189,7 +190,7 @@ struct ParseState List *p_ctenamespace; /* current namespace for common table exprs */ List *p_future_ctes; /* common table exprs not yet in namespace */ CommonTableExpr *p_parent_cte; /* this query's containing CTE */ - Relation p_target_relation; /* INSERT/UPDATE/DELETE target rel */ + Relation p_target_relation; /* INSERT/UPDATE/DELETE/MERGE target rel */ ParseNamespaceItem *p_target_nsitem; /* target rel's NSItem, or NULL */ bool p_is_insert; /* process assignment like INSERT not UPDATE */ List *p_windowdefs; /* raw representations of window clauses */ diff --git a/src/include/parser/parse_relation.h b/src/include/parser/parse_relation.h index 06dc27995b..de21c3c649 100644 --- a/src/include/parser/parse_relation.h +++ b/src/include/parser/parse_relation.h @@ -113,7 +113,8 @@ extern List *expandNSItemVars(ParseNamespaceItem *nsitem, int sublevels_up, int location, List **colnames); extern List *expandNSItemAttrs(ParseState *pstate, ParseNamespaceItem *nsitem, - int sublevels_up, int location); + int sublevels_up, bool require_col_privs, + int location); extern int attnameAttNum(Relation rd, const char *attname, bool sysColOK); extern const NameData *attnumAttName(Relation rd, int attid); extern Oid attnumTypeId(Relation rd, int attid); diff --git a/src/include/tcop/cmdtaglist.h b/src/include/tcop/cmdtaglist.h index 4bc7ddf410..2b1163ce33 100644 --- a/src/include/tcop/cmdtaglist.h +++ b/src/include/tcop/cmdtaglist.h @@ -186,6 +186,7 @@ PG_CMDTAG(CMDTAG_INSERT, "INSERT", false, false, true) PG_CMDTAG(CMDTAG_LISTEN, "LISTEN", false, false, false) PG_CMDTAG(CMDTAG_LOAD, "LOAD", false, false, false) PG_CMDTAG(CMDTAG_LOCK_TABLE, "LOCK TABLE", false, false, false) +PG_CMDTAG(CMDTAG_MERGE, "MERGE", false, false, true) PG_CMDTAG(CMDTAG_MOVE, "MOVE", false, false, true) PG_CMDTAG(CMDTAG_NOTIFY, "NOTIFY", false, false, false) PG_CMDTAG(CMDTAG_PREPARE, "PREPARE", false, false, false) diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index 0c39bc9abf..78cff4475c 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -3670,9 +3670,9 @@ PQoidValue(const PGresult *res) /* * PQcmdTuples - - * If the last command was INSERT/UPDATE/DELETE/MOVE/FETCH/COPY, return - * a string containing the number of inserted/affected tuples. If not, - * return "". + * If the last command was INSERT/UPDATE/DELETE/MERGE/MOVE/FETCH/COPY, + * return a string containing the number of inserted/affected tuples. + * If not, return "". * * XXX: this should probably return an int */ @@ -3699,7 +3699,8 @@ PQcmdTuples(PGresult *res) strncmp(res->cmdStatus, "DELETE ", 7) == 0 || strncmp(res->cmdStatus, "UPDATE ", 7) == 0) p = res->cmdStatus + 7; - else if (strncmp(res->cmdStatus, "FETCH ", 6) == 0) + else if (strncmp(res->cmdStatus, "FETCH ", 6) == 0 || + strncmp(res->cmdStatus, "MERGE ", 6) == 0) p = res->cmdStatus + 6; else if (strncmp(res->cmdStatus, "MOVE ", 5) == 0 || strncmp(res->cmdStatus, "COPY ", 5) == 0) diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 915139378e..00328fddcf 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -4194,7 +4194,7 @@ exec_stmt_execsql(PLpgSQL_execstate *estate, /* * On the first call for this statement generate the plan, and detect - * whether the statement is INSERT/UPDATE/DELETE + * whether the statement is INSERT/UPDATE/DELETE/MERGE */ if (expr->plan == NULL) exec_prepare_plan(estate, expr, CURSOR_OPT_PARALLEL_OK); @@ -4216,7 +4216,8 @@ exec_stmt_execsql(PLpgSQL_execstate *estate, */ if (plansource->commandTag == CMDTAG_INSERT || plansource->commandTag == CMDTAG_UPDATE || - plansource->commandTag == CMDTAG_DELETE) + plansource->commandTag == CMDTAG_DELETE || + plansource->commandTag == CMDTAG_MERGE) { stmt->mod_stmt = true; break; @@ -4276,6 +4277,7 @@ exec_stmt_execsql(PLpgSQL_execstate *estate, case SPI_OK_INSERT_RETURNING: case SPI_OK_UPDATE_RETURNING: case SPI_OK_DELETE_RETURNING: + case SPI_OK_MERGE: Assert(stmt->mod_stmt); exec_set_found(estate, (SPI_processed != 0)); break; @@ -4457,6 +4459,7 @@ exec_stmt_dynexecute(PLpgSQL_execstate *estate, case SPI_OK_INSERT_RETURNING: case SPI_OK_UPDATE_RETURNING: case SPI_OK_DELETE_RETURNING: + case SPI_OK_MERGE: case SPI_OK_UTILITY: case SPI_OK_REWRITTEN: break; diff --git a/src/pl/plpgsql/src/pl_gram.y b/src/pl/plpgsql/src/pl_gram.y index 954c2df331..11e86c1609 100644 --- a/src/pl/plpgsql/src/pl_gram.y +++ b/src/pl/plpgsql/src/pl_gram.y @@ -306,6 +306,7 @@ static void check_raise_parameters(PLpgSQL_stmt_raise *stmt); %token K_LAST %token K_LOG %token K_LOOP +%token K_MERGE %token K_MESSAGE %token K_MESSAGE_TEXT %token K_MOVE @@ -2000,6 +2001,10 @@ stmt_execsql : K_IMPORT { $$ = make_execsql_stmt(K_INSERT, @1); } + | K_MERGE + { + $$ = make_execsql_stmt(K_MERGE, @1); + } | T_WORD { int tok; @@ -2537,6 +2542,7 @@ unreserved_keyword : | K_IS | K_LAST | K_LOG + | K_MERGE | K_MESSAGE | K_MESSAGE_TEXT | K_MOVE @@ -3000,6 +3006,8 @@ make_execsql_stmt(int firsttoken, int location) { if (prev_tok == K_INSERT) continue; /* INSERT INTO is not an INTO-target */ + if (prev_tok == K_MERGE) + continue; /* MERGE INTO is not an INTO-target */ if (firsttoken == K_IMPORT) continue; /* IMPORT ... INTO is not an INTO-target */ if (have_into) diff --git a/src/pl/plpgsql/src/pl_unreserved_kwlist.h b/src/pl/plpgsql/src/pl_unreserved_kwlist.h index 1c68420331..ee2be1b212 100644 --- a/src/pl/plpgsql/src/pl_unreserved_kwlist.h +++ b/src/pl/plpgsql/src/pl_unreserved_kwlist.h @@ -70,6 +70,7 @@ PG_KEYWORD("insert", K_INSERT) PG_KEYWORD("is", K_IS) PG_KEYWORD("last", K_LAST) PG_KEYWORD("log", K_LOG) +PG_KEYWORD("merge", K_MERGE) PG_KEYWORD("message", K_MESSAGE) PG_KEYWORD("message_text", K_MESSAGE_TEXT) PG_KEYWORD("move", K_MOVE) diff --git a/src/pl/plpgsql/src/plpgsql.h b/src/pl/plpgsql/src/plpgsql.h index 18a4f6c7d3..813c32c70f 100644 --- a/src/pl/plpgsql/src/plpgsql.h +++ b/src/pl/plpgsql/src/plpgsql.h @@ -893,7 +893,7 @@ typedef struct PLpgSQL_stmt_execsql int lineno; unsigned int stmtid; PLpgSQL_expr *sqlstmt; - bool mod_stmt; /* is the stmt INSERT/UPDATE/DELETE? */ + bool mod_stmt; /* is the stmt INSERT/UPDATE/DELETE/MERGE? */ bool mod_stmt_set; /* is mod_stmt valid yet? */ bool into; /* INTO supplied? */ bool strict; /* INTO STRICT flag */ diff --git a/src/test/isolation/expected/merge-delete.out b/src/test/isolation/expected/merge-delete.out new file mode 100644 index 0000000000..b2befa8e16 --- /dev/null +++ b/src/test/isolation/expected/merge-delete.out @@ -0,0 +1,117 @@ +Parsed test spec with 2 sessions + +starting permutation: delete c1 select2 c2 +step delete: DELETE FROM target t WHERE t.key = 1; +step c1: COMMIT; +step select2: SELECT * FROM target; +key|val +---+--- +(0 rows) + +step c2: COMMIT; + +starting permutation: merge_delete c1 select2 c2 +step merge_delete: MERGE INTO target t USING (SELECT 1 as key) s ON s.key = t.key WHEN MATCHED THEN DELETE; +step c1: COMMIT; +step select2: SELECT * FROM target; +key|val +---+--- +(0 rows) + +step c2: COMMIT; + +starting permutation: delete c1 update1 select2 c2 +step delete: DELETE FROM target t WHERE t.key = 1; +step c1: COMMIT; +step update1: UPDATE target t SET val = t.val || ' updated by update1' WHERE t.key = 1; +step select2: SELECT * FROM target; +key|val +---+--- +(0 rows) + +step c2: COMMIT; + +starting permutation: merge_delete c1 update1 select2 c2 +step merge_delete: MERGE INTO target t USING (SELECT 1 as key) s ON s.key = t.key WHEN MATCHED THEN DELETE; +step c1: COMMIT; +step update1: UPDATE target t SET val = t.val || ' updated by update1' WHERE t.key = 1; +step select2: SELECT * FROM target; +key|val +---+--- +(0 rows) + +step c2: COMMIT; + +starting permutation: delete c1 merge2 select2 c2 +step delete: DELETE FROM target t WHERE t.key = 1; +step c1: COMMIT; +step merge2: MERGE INTO target t USING (SELECT 1 as key, 'merge2a' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; +step select2: SELECT * FROM target; +key|val +---+------- + 1|merge2a +(1 row) + +step c2: COMMIT; + +starting permutation: merge_delete c1 merge2 select2 c2 +step merge_delete: MERGE INTO target t USING (SELECT 1 as key) s ON s.key = t.key WHEN MATCHED THEN DELETE; +step c1: COMMIT; +step merge2: MERGE INTO target t USING (SELECT 1 as key, 'merge2a' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; +step select2: SELECT * FROM target; +key|val +---+------- + 1|merge2a +(1 row) + +step c2: COMMIT; + +starting permutation: delete update1 c1 select2 c2 +step delete: DELETE FROM target t WHERE t.key = 1; +step update1: UPDATE target t SET val = t.val || ' updated by update1' WHERE t.key = 1; +step c1: COMMIT; +step update1: <... completed> +step select2: SELECT * FROM target; +key|val +---+--- +(0 rows) + +step c2: COMMIT; + +starting permutation: merge_delete update1 c1 select2 c2 +step merge_delete: MERGE INTO target t USING (SELECT 1 as key) s ON s.key = t.key WHEN MATCHED THEN DELETE; +step update1: UPDATE target t SET val = t.val || ' updated by update1' WHERE t.key = 1; +step c1: COMMIT; +step update1: <... completed> +step select2: SELECT * FROM target; +key|val +---+--- +(0 rows) + +step c2: COMMIT; + +starting permutation: delete merge2 c1 select2 c2 +step delete: DELETE FROM target t WHERE t.key = 1; +step merge2: MERGE INTO target t USING (SELECT 1 as key, 'merge2a' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; +step c1: COMMIT; +step merge2: <... completed> +step select2: SELECT * FROM target; +key|val +---+------- + 1|merge2a +(1 row) + +step c2: COMMIT; + +starting permutation: merge_delete merge2 c1 select2 c2 +step merge_delete: MERGE INTO target t USING (SELECT 1 as key) s ON s.key = t.key WHEN MATCHED THEN DELETE; +step merge2: MERGE INTO target t USING (SELECT 1 as key, 'merge2a' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; +step c1: COMMIT; +step merge2: <... completed> +step select2: SELECT * FROM target; +key|val +---+------- + 1|merge2a +(1 row) + +step c2: COMMIT; diff --git a/src/test/isolation/expected/merge-insert-update.out b/src/test/isolation/expected/merge-insert-update.out new file mode 100644 index 0000000000..ee8b3c4e9f --- /dev/null +++ b/src/test/isolation/expected/merge-insert-update.out @@ -0,0 +1,94 @@ +Parsed test spec with 2 sessions + +starting permutation: merge1 c1 select2 c2 +step merge1: MERGE INTO target t USING (SELECT 1 as key, 'merge1' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set val = t.val || ' updated by merge1'; +step c1: COMMIT; +step select2: SELECT * FROM target; +key|val +---+------ + 1|merge1 +(1 row) + +step c2: COMMIT; + +starting permutation: merge1 c1 merge2 select2 c2 +step merge1: MERGE INTO target t USING (SELECT 1 as key, 'merge1' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set val = t.val || ' updated by merge1'; +step c1: COMMIT; +step merge2: MERGE INTO target t USING (SELECT 1 as key, 'merge2' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set val = t.val || ' updated by merge2'; +step select2: SELECT * FROM target; +key|val +---+------------------------ + 1|merge1 updated by merge2 +(1 row) + +step c2: COMMIT; + +starting permutation: insert1 merge2 c1 select2 c2 +step insert1: INSERT INTO target VALUES (1, 'insert1'); +step merge2: MERGE INTO target t USING (SELECT 1 as key, 'merge2' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set val = t.val || ' updated by merge2'; +step c1: COMMIT; +step merge2: <... completed> +ERROR: duplicate key value violates unique constraint "target_pkey" +step select2: SELECT * FROM target; +ERROR: current transaction is aborted, commands ignored until end of transaction block +step c2: COMMIT; + +starting permutation: merge1 merge2 c1 select2 c2 +step merge1: MERGE INTO target t USING (SELECT 1 as key, 'merge1' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set val = t.val || ' updated by merge1'; +step merge2: MERGE INTO target t USING (SELECT 1 as key, 'merge2' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set val = t.val || ' updated by merge2'; +step c1: COMMIT; +step merge2: <... completed> +ERROR: duplicate key value violates unique constraint "target_pkey" +step select2: SELECT * FROM target; +ERROR: current transaction is aborted, commands ignored until end of transaction block +step c2: COMMIT; + +starting permutation: merge1 merge2 a1 select2 c2 +step merge1: MERGE INTO target t USING (SELECT 1 as key, 'merge1' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set val = t.val || ' updated by merge1'; +step merge2: MERGE INTO target t USING (SELECT 1 as key, 'merge2' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set val = t.val || ' updated by merge2'; +step a1: ABORT; +step merge2: <... completed> +step select2: SELECT * FROM target; +key|val +---+------ + 1|merge2 +(1 row) + +step c2: COMMIT; + +starting permutation: delete1 insert1 c1 merge2 select2 c2 +step delete1: DELETE FROM target WHERE key = 1; +step insert1: INSERT INTO target VALUES (1, 'insert1'); +step c1: COMMIT; +step merge2: MERGE INTO target t USING (SELECT 1 as key, 'merge2' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set val = t.val || ' updated by merge2'; +step select2: SELECT * FROM target; +key|val +---+------------------------- + 1|insert1 updated by merge2 +(1 row) + +step c2: COMMIT; + +starting permutation: delete1 insert1 merge2 c1 select2 c2 +step delete1: DELETE FROM target WHERE key = 1; +step insert1: INSERT INTO target VALUES (1, 'insert1'); +step merge2: MERGE INTO target t USING (SELECT 1 as key, 'merge2' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set val = t.val || ' updated by merge2'; +step c1: COMMIT; +step merge2: <... completed> +ERROR: duplicate key value violates unique constraint "target_pkey" +step select2: SELECT * FROM target; +ERROR: current transaction is aborted, commands ignored until end of transaction block +step c2: COMMIT; + +starting permutation: delete1 insert1 merge2i c1 select2 c2 +step delete1: DELETE FROM target WHERE key = 1; +step insert1: INSERT INTO target VALUES (1, 'insert1'); +step merge2i: MERGE INTO target t USING (SELECT 1 as key, 'merge2' as val) s ON s.key = t.key WHEN MATCHED THEN UPDATE set val = t.val || ' updated by merge2'; +step c1: COMMIT; +step select2: SELECT * FROM target; +key|val +---+------- + 1|insert1 +(1 row) + +step c2: COMMIT; diff --git a/src/test/isolation/expected/merge-match-recheck.out b/src/test/isolation/expected/merge-match-recheck.out new file mode 100644 index 0000000000..8183f52ce0 --- /dev/null +++ b/src/test/isolation/expected/merge-match-recheck.out @@ -0,0 +1,116 @@ +Parsed test spec with 2 sessions + +starting permutation: update1 merge_status c2 select1 c1 +step update1: UPDATE target t SET balance = balance + 10, val = t.val || ' updated by update1' WHERE t.key = 1; +step merge_status: + MERGE INTO target t + USING (SELECT 1 as key) s + ON s.key = t.key + WHEN MATCHED AND status = 's1' THEN + UPDATE SET status = 's2', val = t.val || ' when1' + WHEN MATCHED AND status = 's2' THEN + UPDATE SET status = 's3', val = t.val || ' when2' + WHEN MATCHED AND status = 's3' THEN + UPDATE SET status = 's4', val = t.val || ' when3'; + +step c2: COMMIT; +step merge_status: <... completed> +step select1: SELECT * FROM target; +key|balance|status|val +---+-------+------+------------------------------ + 1| 170|s2 |setup updated by update1 when1 +(1 row) + +step c1: COMMIT; + +starting permutation: update2 merge_status c2 select1 c1 +step update2: UPDATE target t SET status = 's2', val = t.val || ' updated by update2' WHERE t.key = 1; +step merge_status: + MERGE INTO target t + USING (SELECT 1 as key) s + ON s.key = t.key + WHEN MATCHED AND status = 's1' THEN + UPDATE SET status = 's2', val = t.val || ' when1' + WHEN MATCHED AND status = 's2' THEN + UPDATE SET status = 's3', val = t.val || ' when2' + WHEN MATCHED AND status = 's3' THEN + UPDATE SET status = 's4', val = t.val || ' when3'; + +step c2: COMMIT; +step merge_status: <... completed> +step select1: SELECT * FROM target; +key|balance|status|val +---+-------+------+------------------------------ + 1| 160|s3 |setup updated by update2 when2 +(1 row) + +step c1: COMMIT; + +starting permutation: update3 merge_status c2 select1 c1 +step update3: UPDATE target t SET status = 's3', val = t.val || ' updated by update3' WHERE t.key = 1; +step merge_status: + MERGE INTO target t + USING (SELECT 1 as key) s + ON s.key = t.key + WHEN MATCHED AND status = 's1' THEN + UPDATE SET status = 's2', val = t.val || ' when1' + WHEN MATCHED AND status = 's2' THEN + UPDATE SET status = 's3', val = t.val || ' when2' + WHEN MATCHED AND status = 's3' THEN + UPDATE SET status = 's4', val = t.val || ' when3'; + +step c2: COMMIT; +step merge_status: <... completed> +step select1: SELECT * FROM target; +key|balance|status|val +---+-------+------+------------------------------ + 1| 160|s4 |setup updated by update3 when3 +(1 row) + +step c1: COMMIT; + +starting permutation: update5 merge_status c2 select1 c1 +step update5: UPDATE target t SET status = 's5', val = t.val || ' updated by update5' WHERE t.key = 1; +step merge_status: + MERGE INTO target t + USING (SELECT 1 as key) s + ON s.key = t.key + WHEN MATCHED AND status = 's1' THEN + UPDATE SET status = 's2', val = t.val || ' when1' + WHEN MATCHED AND status = 's2' THEN + UPDATE SET status = 's3', val = t.val || ' when2' + WHEN MATCHED AND status = 's3' THEN + UPDATE SET status = 's4', val = t.val || ' when3'; + +step c2: COMMIT; +step merge_status: <... completed> +step select1: SELECT * FROM target; +key|balance|status|val +---+-------+------+------------------------ + 1| 160|s5 |setup updated by update5 +(1 row) + +step c1: COMMIT; + +starting permutation: update_bal1 merge_bal c2 select1 c1 +step update_bal1: UPDATE target t SET balance = 50, val = t.val || ' updated by update_bal1' WHERE t.key = 1; +step merge_bal: + MERGE INTO target t + USING (SELECT 1 as key) s + ON s.key = t.key + WHEN MATCHED AND balance < 100 THEN + UPDATE SET balance = balance * 2, val = t.val || ' when1' + WHEN MATCHED AND balance < 200 THEN + UPDATE SET balance = balance * 4, val = t.val || ' when2' + WHEN MATCHED AND balance < 300 THEN + UPDATE SET balance = balance * 8, val = t.val || ' when3'; + +step c2: COMMIT; +step merge_bal: <... completed> +step select1: SELECT * FROM target; +key|balance|status|val +---+-------+------+---------------------------------- + 1| 100|s1 |setup updated by update_bal1 when1 +(1 row) + +step c1: COMMIT; diff --git a/src/test/isolation/expected/merge-update.out b/src/test/isolation/expected/merge-update.out new file mode 100644 index 0000000000..55b1f908fd --- /dev/null +++ b/src/test/isolation/expected/merge-update.out @@ -0,0 +1,314 @@ +Parsed test spec with 2 sessions + +starting permutation: merge1 c1 select2 c2 +step merge1: + MERGE INTO target t + USING (SELECT 1 as key, 'merge1' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step c1: COMMIT; +step select2: SELECT * FROM target; +key|val +---+------------------------ + 2|setup1 updated by merge1 +(1 row) + +step c2: COMMIT; + +starting permutation: merge1 c1 merge2a select2 c2 +step merge1: + MERGE INTO target t + USING (SELECT 1 as key, 'merge1' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step c1: COMMIT; +step merge2a: + MERGE INTO target t + USING (SELECT 1 as key, 'merge2a' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step select2: SELECT * FROM target; +key|val +---+------------------------ + 2|setup1 updated by merge1 + 1|merge2a +(2 rows) + +step c2: COMMIT; + +starting permutation: merge1 merge2a c1 select2 c2 +step merge1: + MERGE INTO target t + USING (SELECT 1 as key, 'merge1' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step merge2a: + MERGE INTO target t + USING (SELECT 1 as key, 'merge2a' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step c1: COMMIT; +step merge2a: <... completed> +step select2: SELECT * FROM target; +key|val +---+------------------------ + 2|setup1 updated by merge1 + 1|merge2a +(2 rows) + +step c2: COMMIT; + +starting permutation: merge1 merge2a a1 select2 c2 +step merge1: + MERGE INTO target t + USING (SELECT 1 as key, 'merge1' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step merge2a: + MERGE INTO target t + USING (SELECT 1 as key, 'merge2a' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step a1: ABORT; +step merge2a: <... completed> +step select2: SELECT * FROM target; +key|val +---+------------------------- + 2|setup1 updated by merge2a +(1 row) + +step c2: COMMIT; + +starting permutation: merge1 merge2b c1 select2 c2 +step merge1: + MERGE INTO target t + USING (SELECT 1 as key, 'merge1' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step merge2b: + MERGE INTO target t + USING (SELECT 1 as key, 'merge2b' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED AND t.key < 2 THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step c1: COMMIT; +step merge2b: <... completed> +step select2: SELECT * FROM target; +key|val +---+------------------------ + 2|setup1 updated by merge1 + 1|merge2b +(2 rows) + +step c2: COMMIT; + +starting permutation: merge1 merge2c c1 select2 c2 +step merge1: + MERGE INTO target t + USING (SELECT 1 as key, 'merge1' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step merge2c: + MERGE INTO target t + USING (SELECT 1 as key, 'merge2c' as val) s + ON s.key = t.key AND t.key < 2 + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step c1: COMMIT; +step merge2c: <... completed> +step select2: SELECT * FROM target; +key|val +---+------------------------ + 2|setup1 updated by merge1 + 1|merge2c +(2 rows) + +step c2: COMMIT; + +starting permutation: pa_merge1 pa_merge2a c1 pa_select2 c2 +step pa_merge1: + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge1' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set val = t.val || ' updated by ' || s.val; + +step pa_merge2a: + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge2a' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step c1: COMMIT; +step pa_merge2a: <... completed> +step pa_select2: SELECT * FROM pa_target; +key|val +---+-------------------------------------------------- + 2|initial + 2|initial updated by pa_merge1 updated by pa_merge2a +(2 rows) + +step c2: COMMIT; + +starting permutation: pa_merge2 pa_merge2a c1 pa_select2 c2 +step pa_merge2: + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge2' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step pa_merge2a: + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge2a' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step c1: COMMIT; +step pa_merge2a: <... completed> +ERROR: tuple to be locked was already moved to another partition due to concurrent update +step pa_select2: SELECT * FROM pa_target; +ERROR: current transaction is aborted, commands ignored until end of transaction block +step c2: COMMIT; + +starting permutation: pa_merge2 c1 pa_merge2a pa_select2 c2 +step pa_merge2: + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge2' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step c1: COMMIT; +step pa_merge2a: + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge2a' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step pa_select2: SELECT * FROM pa_target; +key|val +---+---------------------------- + 1|pa_merge2a + 2|initial + 2|initial updated by pa_merge2 +(3 rows) + +step c2: COMMIT; + +starting permutation: pa_merge3 pa_merge2b_when c1 pa_select2 c2 +step pa_merge3: + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge2' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set val = 'prefix ' || t.val; + +step pa_merge2b_when: + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge2b_when' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED AND t.val like 'initial%' THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step c1: COMMIT; +step pa_merge2b_when: <... completed> +step pa_select2: SELECT * FROM pa_target; +key|val +---+-------------- + 1|prefix initial + 2|initial +(2 rows) + +step c2: COMMIT; + +starting permutation: pa_merge1 pa_merge2b_when c1 pa_select2 c2 +step pa_merge1: + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge1' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set val = t.val || ' updated by ' || s.val; + +step pa_merge2b_when: + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge2b_when' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED AND t.val like 'initial%' THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + +step c1: COMMIT; +step pa_merge2b_when: <... completed> +step pa_select2: SELECT * FROM pa_target; +key|val +---+------------------------------------------------------- + 2|initial + 2|initial updated by pa_merge1 updated by pa_merge2b_when +(2 rows) + +step c2: COMMIT; diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule index 8e87098150..00749a40bd 100644 --- a/src/test/isolation/isolation_schedule +++ b/src/test/isolation/isolation_schedule @@ -45,6 +45,10 @@ test: insert-conflict-do-update test: insert-conflict-do-update-2 test: insert-conflict-do-update-3 test: insert-conflict-specconflict +test: merge-insert-update +test: merge-delete +test: merge-update +test: merge-match-recheck test: delete-abort-savept test: delete-abort-savept-2 test: aborted-keyrevoke diff --git a/src/test/isolation/specs/merge-delete.spec b/src/test/isolation/specs/merge-delete.spec new file mode 100644 index 0000000000..0e7053270e --- /dev/null +++ b/src/test/isolation/specs/merge-delete.spec @@ -0,0 +1,50 @@ +# MERGE DELETE +# +# This test looks at the interactions involving concurrent deletes +# comparing the behavior of MERGE, DELETE and UPDATE + +setup +{ + CREATE TABLE target (key int primary key, val text); + INSERT INTO target VALUES (1, 'setup1'); +} + +teardown +{ + DROP TABLE target; +} + +session "s1" +setup +{ + BEGIN ISOLATION LEVEL READ COMMITTED; +} +step "delete" { DELETE FROM target t WHERE t.key = 1; } +step "merge_delete" { MERGE INTO target t USING (SELECT 1 as key) s ON s.key = t.key WHEN MATCHED THEN DELETE; } +step "c1" { COMMIT; } + +session "s2" +setup +{ + BEGIN ISOLATION LEVEL READ COMMITTED; +} +step "update1" { UPDATE target t SET val = t.val || ' updated by update1' WHERE t.key = 1; } +step "merge2" { MERGE INTO target t USING (SELECT 1 as key, 'merge2a' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; } +step "select2" { SELECT * FROM target; } +step "c2" { COMMIT; } + +# Basic effects +permutation "delete" "c1" "select2" "c2" +permutation "merge_delete" "c1" "select2" "c2" + +# One after the other, no concurrency +permutation "delete" "c1" "update1" "select2" "c2" +permutation "merge_delete" "c1" "update1" "select2" "c2" +permutation "delete" "c1" "merge2" "select2" "c2" +permutation "merge_delete" "c1" "merge2" "select2" "c2" + +# Now with concurrency +permutation "delete" "update1" "c1" "select2" "c2" +permutation "merge_delete" "update1" "c1" "select2" "c2" +permutation "delete" "merge2" "c1" "select2" "c2" +permutation "merge_delete" "merge2" "c1" "select2" "c2" diff --git a/src/test/isolation/specs/merge-insert-update.spec b/src/test/isolation/specs/merge-insert-update.spec new file mode 100644 index 0000000000..1bf1ed461d --- /dev/null +++ b/src/test/isolation/specs/merge-insert-update.spec @@ -0,0 +1,51 @@ +# MERGE INSERT UPDATE +# +# This looks at how we handle concurrent INSERTs, illustrating how the +# behavior differs from INSERT ... ON CONFLICT + +setup +{ + CREATE TABLE target (key int primary key, val text); +} + +teardown +{ + DROP TABLE target; +} + +session "s1" +setup +{ + BEGIN ISOLATION LEVEL READ COMMITTED; +} +step "merge1" { MERGE INTO target t USING (SELECT 1 as key, 'merge1' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set val = t.val || ' updated by merge1'; } +step "delete1" { DELETE FROM target WHERE key = 1; } +step "insert1" { INSERT INTO target VALUES (1, 'insert1'); } +step "c1" { COMMIT; } +step "a1" { ABORT; } + +session "s2" +setup +{ + BEGIN ISOLATION LEVEL READ COMMITTED; +} +step "merge2" { MERGE INTO target t USING (SELECT 1 as key, 'merge2' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN UPDATE set val = t.val || ' updated by merge2'; } + +step "merge2i" { MERGE INTO target t USING (SELECT 1 as key, 'merge2' as val) s ON s.key = t.key WHEN MATCHED THEN UPDATE set val = t.val || ' updated by merge2'; } + +step "select2" { SELECT * FROM target; } +step "c2" { COMMIT; } + +# Basic effects +permutation "merge1" "c1" "select2" "c2" +permutation "merge1" "c1" "merge2" "select2" "c2" + +# check concurrent inserts +permutation "insert1" "merge2" "c1" "select2" "c2" +permutation "merge1" "merge2" "c1" "select2" "c2" +permutation "merge1" "merge2" "a1" "select2" "c2" + +# check how we handle when visible row has been concurrently deleted, then same key re-inserted +permutation "delete1" "insert1" "c1" "merge2" "select2" "c2" +permutation "delete1" "insert1" "merge2" "c1" "select2" "c2" +permutation "delete1" "insert1" "merge2i" "c1" "select2" "c2" diff --git a/src/test/isolation/specs/merge-match-recheck.spec b/src/test/isolation/specs/merge-match-recheck.spec new file mode 100644 index 0000000000..d56400a6a2 --- /dev/null +++ b/src/test/isolation/specs/merge-match-recheck.spec @@ -0,0 +1,77 @@ +# MERGE MATCHED RECHECK +# +# This test looks at what happens when we have complex +# WHEN MATCHED AND conditions and a concurrent UPDATE causes a +# recheck of the AND condition on the new row + +setup +{ + CREATE TABLE target (key int primary key, balance integer, status text, val text); + INSERT INTO target VALUES (1, 160, 's1', 'setup'); +} + +teardown +{ + DROP TABLE target; +} + +session "s1" +setup +{ + BEGIN ISOLATION LEVEL READ COMMITTED; +} +step "merge_status" +{ + MERGE INTO target t + USING (SELECT 1 as key) s + ON s.key = t.key + WHEN MATCHED AND status = 's1' THEN + UPDATE SET status = 's2', val = t.val || ' when1' + WHEN MATCHED AND status = 's2' THEN + UPDATE SET status = 's3', val = t.val || ' when2' + WHEN MATCHED AND status = 's3' THEN + UPDATE SET status = 's4', val = t.val || ' when3'; +} + +step "merge_bal" +{ + MERGE INTO target t + USING (SELECT 1 as key) s + ON s.key = t.key + WHEN MATCHED AND balance < 100 THEN + UPDATE SET balance = balance * 2, val = t.val || ' when1' + WHEN MATCHED AND balance < 200 THEN + UPDATE SET balance = balance * 4, val = t.val || ' when2' + WHEN MATCHED AND balance < 300 THEN + UPDATE SET balance = balance * 8, val = t.val || ' when3'; +} + +step "select1" { SELECT * FROM target; } +step "c1" { COMMIT; } + +session "s2" +setup +{ + BEGIN ISOLATION LEVEL READ COMMITTED; +} +step "update1" { UPDATE target t SET balance = balance + 10, val = t.val || ' updated by update1' WHERE t.key = 1; } +step "update2" { UPDATE target t SET status = 's2', val = t.val || ' updated by update2' WHERE t.key = 1; } +step "update3" { UPDATE target t SET status = 's3', val = t.val || ' updated by update3' WHERE t.key = 1; } +step "update5" { UPDATE target t SET status = 's5', val = t.val || ' updated by update5' WHERE t.key = 1; } +step "update_bal1" { UPDATE target t SET balance = 50, val = t.val || ' updated by update_bal1' WHERE t.key = 1; } +step "c2" { COMMIT; } + +# merge_status sees concurrently updated row and rechecks WHEN conditions, but recheck passes and final status = 's2' +permutation "update1" "merge_status" "c2" "select1" "c1" + +# merge_status sees concurrently updated row and rechecks WHEN conditions, recheck fails, so final status = 's3' not 's2' +permutation "update2" "merge_status" "c2" "select1" "c1" + +# merge_status sees concurrently updated row and rechecks WHEN conditions, recheck fails, so final status = 's4' not 's2' +permutation "update3" "merge_status" "c2" "select1" "c1" + +# merge_status sees concurrently updated row and rechecks WHEN conditions, recheck fails, but we skip update and MERGE does nothing +permutation "update5" "merge_status" "c2" "select1" "c1" + +# merge_bal sees concurrently updated row and rechecks WHEN conditions, recheck fails, so final balance = 100 not 640 +permutation "update_bal1" "merge_bal" "c2" "select1" "c1" diff --git a/src/test/isolation/specs/merge-update.spec b/src/test/isolation/specs/merge-update.spec new file mode 100644 index 0000000000..e8d01666fe --- /dev/null +++ b/src/test/isolation/specs/merge-update.spec @@ -0,0 +1,156 @@ +# MERGE UPDATE +# +# This test exercises atypical cases +# 1. UPDATEs of PKs that change the join in the ON clause +# 2. UPDATEs with WHEN conditions that would fail after concurrent update +# 3. UPDATEs with extra ON conditions that would fail after concurrent update + +setup +{ + CREATE TABLE target (key int primary key, val text); + INSERT INTO target VALUES (1, 'setup1'); + + CREATE TABLE pa_target (key integer, val text) + PARTITION BY LIST (key); + CREATE TABLE part1 (key integer, val text); + CREATE TABLE part2 (val text, key integer); + CREATE TABLE part3 (key integer, val text); + + ALTER TABLE pa_target ATTACH PARTITION part1 FOR VALUES IN (1,4); + ALTER TABLE pa_target ATTACH PARTITION part2 FOR VALUES IN (2,5,6); + ALTER TABLE pa_target ATTACH PARTITION part3 DEFAULT; + + INSERT INTO pa_target VALUES (1, 'initial'); + INSERT INTO pa_target VALUES (2, 'initial'); +} + +teardown +{ + DROP TABLE target; + DROP TABLE pa_target CASCADE; +} + +session "s1" +setup +{ + BEGIN ISOLATION LEVEL READ COMMITTED; +} +step "merge1" +{ + MERGE INTO target t + USING (SELECT 1 as key, 'merge1' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; +} +step "pa_merge1" +{ + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge1' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set val = t.val || ' updated by ' || s.val; +} +step "pa_merge2" +{ + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge2' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; +} +step "pa_merge3" +{ + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge2' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set val = 'prefix ' || t.val; +} +step "c1" { COMMIT; } +step "a1" { ABORT; } + +session "s2" +setup +{ + BEGIN ISOLATION LEVEL READ COMMITTED; +} +step "merge2a" +{ + MERGE INTO target t + USING (SELECT 1 as key, 'merge2a' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; +} +step "merge2b" +{ + MERGE INTO target t + USING (SELECT 1 as key, 'merge2b' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED AND t.key < 2 THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; +} +step "merge2c" +{ + MERGE INTO target t + USING (SELECT 1 as key, 'merge2c' as val) s + ON s.key = t.key AND t.key < 2 + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; +} +step "pa_merge2a" +{ + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge2a' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; +} +# MERGE proceeds only if 'val' unchanged +step "pa_merge2b_when" +{ + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge2b_when' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED AND t.val like 'initial%' THEN + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; +} +step "select2" { SELECT * FROM target; } +step "pa_select2" { SELECT * FROM pa_target; } +step "c2" { COMMIT; } + +# Basic effects +permutation "merge1" "c1" "select2" "c2" + +# One after the other, no concurrency +permutation "merge1" "c1" "merge2a" "select2" "c2" + +# Now with concurrency +permutation "merge1" "merge2a" "c1" "select2" "c2" +permutation "merge1" "merge2a" "a1" "select2" "c2" +permutation "merge1" "merge2b" "c1" "select2" "c2" +permutation "merge1" "merge2c" "c1" "select2" "c2" +permutation "pa_merge1" "pa_merge2a" "c1" "pa_select2" "c2" +permutation "pa_merge2" "pa_merge2a" "c1" "pa_select2" "c2" # fails +permutation "pa_merge2" "c1" "pa_merge2a" "pa_select2" "c2" # succeeds +permutation "pa_merge3" "pa_merge2b_when" "c1" "pa_select2" "c2" # WHEN not satisfied by updated tuple +permutation "pa_merge1" "pa_merge2b_when" "c1" "pa_select2" "c2" # WHEN satisfied by updated tuple diff --git a/src/test/regress/expected/identity.out b/src/test/regress/expected/identity.out index 99811570b7..5f03d8e14f 100644 --- a/src/test/regress/expected/identity.out +++ b/src/test/regress/expected/identity.out @@ -560,3 +560,57 @@ CREATE TABLE itest15 (id integer GENERATED ALWAYS AS IDENTITY NOT NULL); DROP TABLE itest15; CREATE TABLE itest15 (id integer NOT NULL GENERATED ALWAYS AS IDENTITY); DROP TABLE itest15; +-- MERGE tests +CREATE TABLE itest15 (a int GENERATED ALWAYS AS IDENTITY, b text); +CREATE TABLE itest16 (a int GENERATED BY DEFAULT AS IDENTITY, b text); +MERGE INTO itest15 t +USING (SELECT 10 AS s_a, 'inserted by merge' AS s_b) s +ON t.a = s.s_a +WHEN NOT MATCHED THEN + INSERT (a, b) VALUES (s.s_a, s.s_b); +ERROR: cannot insert a non-DEFAULT value into column "a" +DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS. +HINT: Use OVERRIDING SYSTEM VALUE to override. +-- Used to fail, but now it works and ignores the user supplied value +MERGE INTO itest15 t +USING (SELECT 20 AS s_a, 'inserted by merge' AS s_b) s +ON t.a = s.s_a +WHEN NOT MATCHED THEN + INSERT (a, b) OVERRIDING USER VALUE VALUES (s.s_a, s.s_b); +MERGE INTO itest15 t +USING (SELECT 30 AS s_a, 'inserted by merge' AS s_b) s +ON t.a = s.s_a +WHEN NOT MATCHED THEN + INSERT (a, b) OVERRIDING SYSTEM VALUE VALUES (s.s_a, s.s_b); +MERGE INTO itest16 t +USING (SELECT 10 AS s_a, 'inserted by merge' AS s_b) s +ON t.a = s.s_a +WHEN NOT MATCHED THEN + INSERT (a, b) VALUES (s.s_a, s.s_b); +MERGE INTO itest16 t +USING (SELECT 20 AS s_a, 'inserted by merge' AS s_b) s +ON t.a = s.s_a +WHEN NOT MATCHED THEN + INSERT (a, b) OVERRIDING USER VALUE VALUES (s.s_a, s.s_b); +MERGE INTO itest16 t +USING (SELECT 30 AS s_a, 'inserted by merge' AS s_b) s +ON t.a = s.s_a +WHEN NOT MATCHED THEN + INSERT (a, b) OVERRIDING SYSTEM VALUE VALUES (s.s_a, s.s_b); +SELECT * FROM itest15; + a | b +----+------------------- + 1 | inserted by merge + 30 | inserted by merge +(2 rows) + +SELECT * FROM itest16; + a | b +----+------------------- + 10 | inserted by merge + 1 | inserted by merge + 30 | inserted by merge +(3 rows) + +DROP TABLE itest15; +DROP TABLE itest16; diff --git a/src/test/regress/expected/merge.out b/src/test/regress/expected/merge.out new file mode 100644 index 0000000000..da8796986f --- /dev/null +++ b/src/test/regress/expected/merge.out @@ -0,0 +1,1934 @@ +-- +-- MERGE +-- +--\set VERBOSITY verbose +--set debug_print_rewritten = true; +--set debug_print_parse = true; +--set debug_print_pretty = true; +CREATE USER merge_privs; +CREATE USER merge_no_privs; +DROP TABLE IF EXISTS target; +NOTICE: table "target" does not exist, skipping +DROP TABLE IF EXISTS source; +NOTICE: table "source" does not exist, skipping +CREATE TABLE target (tid integer, balance integer); +CREATE TABLE source (sid integer, delta integer); --no index +INSERT INTO target VALUES (1, 10); +INSERT INTO target VALUES (2, 20); +INSERT INTO target VALUES (3, 30); +SELECT t.ctid is not null as matched, t.*, s.* FROM source s FULL OUTER JOIN target t ON s.sid = t.tid ORDER BY t.tid, s.sid; + matched | tid | balance | sid | delta +---------+-----+---------+-----+------- + t | 1 | 10 | | + t | 2 | 20 | | + t | 3 | 30 | | +(3 rows) + +ALTER TABLE target OWNER TO merge_privs; +ALTER TABLE source OWNER TO merge_privs; +CREATE TABLE target2 (tid integer, balance integer); +CREATE TABLE source2 (sid integer, delta integer); +ALTER TABLE target2 OWNER TO merge_no_privs; +ALTER TABLE source2 OWNER TO merge_no_privs; +GRANT INSERT ON target TO merge_no_privs; +SET SESSION AUTHORIZATION merge_privs; +EXPLAIN (COSTS OFF) +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + DELETE; + QUERY PLAN +---------------------------------------- + Merge on target t + -> Merge Join + Merge Cond: (t.tid = s.sid) + -> Sort + Sort Key: t.tid + -> Seq Scan on target t + -> Sort + Sort Key: s.sid + -> Seq Scan on source s +(9 rows) + +-- +-- Errors +-- +MERGE INTO target t RANDOMWORD +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; +ERROR: syntax error at or near "RANDOMWORD" +LINE 1: MERGE INTO target t RANDOMWORD + ^ +-- MATCHED/INSERT error +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + INSERT DEFAULT VALUES; +ERROR: syntax error at or near "INSERT" +LINE 5: INSERT DEFAULT VALUES; + ^ +-- incorrectly specifying INTO target +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT INTO target DEFAULT VALUES; +ERROR: syntax error at or near "INTO" +LINE 5: INSERT INTO target DEFAULT VALUES; + ^ +-- Multiple VALUES clause +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT VALUES (1,1), (2,2); +ERROR: syntax error at or near "," +LINE 5: INSERT VALUES (1,1), (2,2); + ^ +-- SELECT query for INSERT +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT SELECT (1, 1); +ERROR: syntax error at or near "SELECT" +LINE 5: INSERT SELECT (1, 1); + ^ +-- NOT MATCHED/UPDATE +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + UPDATE SET balance = 0; +ERROR: syntax error at or near "UPDATE" +LINE 5: UPDATE SET balance = 0; + ^ +-- UPDATE tablename +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE target SET balance = 0; +ERROR: syntax error at or near "target" +LINE 5: UPDATE target SET balance = 0; + ^ +-- source and target names the same +MERGE INTO target +USING target +ON tid = tid +WHEN MATCHED THEN DO NOTHING; +ERROR: name "target" specified more than once +DETAIL: The name is used both as MERGE target table and data source. +-- unsupported relation types +-- view +CREATE VIEW tv AS SELECT * FROM target; +MERGE INTO tv t +USING source s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT DEFAULT VALUES; +ERROR: cannot execute MERGE on relation "tv" +DETAIL: This operation is not supported for views. +DROP VIEW tv; +-- materialized view +CREATE MATERIALIZED VIEW mv AS SELECT * FROM target; +MERGE INTO mv t +USING source s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT DEFAULT VALUES; +ERROR: cannot execute MERGE on relation "mv" +DETAIL: This operation is not supported for materialized views. +DROP MATERIALIZED VIEW mv; +-- permissions +MERGE INTO target +USING source2 +ON target.tid = source2.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; +ERROR: permission denied for table source2 +GRANT INSERT ON target TO merge_no_privs; +SET SESSION AUTHORIZATION merge_no_privs; +MERGE INTO target +USING source2 +ON target.tid = source2.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; +ERROR: permission denied for table target +GRANT UPDATE ON target2 TO merge_privs; +SET SESSION AUTHORIZATION merge_privs; +MERGE INTO target2 +USING source +ON target2.tid = source.sid +WHEN MATCHED THEN + DELETE; +ERROR: permission denied for table target2 +MERGE INTO target2 +USING source +ON target2.tid = source.sid +WHEN NOT MATCHED THEN + INSERT DEFAULT VALUES; +ERROR: permission denied for table target2 +-- check if the target can be accessed from source relation subquery; we should +-- not be able to do so +MERGE INTO target t +USING (SELECT * FROM source WHERE t.tid > sid) s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT DEFAULT VALUES; +ERROR: invalid reference to FROM-clause entry for table "t" +LINE 2: USING (SELECT * FROM source WHERE t.tid > sid) s + ^ +HINT: There is an entry for table "t", but it cannot be referenced from this part of the query. +-- +-- initial tests +-- +-- zero rows in source has no effect +MERGE INTO target +USING source +ON target.tid = source.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + DELETE; +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT DEFAULT VALUES; +ROLLBACK; +-- insert some non-matching source rows to work from +INSERT INTO source VALUES (4, 40); +SELECT * FROM source ORDER BY sid; + sid | delta +-----+------- + 4 | 40 +(1 row) + +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 +(3 rows) + +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + DO NOTHING; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + DELETE; +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT DEFAULT VALUES; +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 + | +(4 rows) + +ROLLBACK; +-- index plans +INSERT INTO target SELECT generate_series(1000,2500), 0; +ALTER TABLE target ADD PRIMARY KEY (tid); +ANALYZE target; +EXPLAIN (COSTS OFF) +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; + QUERY PLAN +---------------------------------------- + Merge on target t + -> Hash Join + Hash Cond: (s.sid = t.tid) + -> Seq Scan on source s + -> Hash + -> Seq Scan on target t +(6 rows) + +EXPLAIN (COSTS OFF) +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + DELETE; + QUERY PLAN +---------------------------------------- + Merge on target t + -> Hash Join + Hash Cond: (s.sid = t.tid) + -> Seq Scan on source s + -> Hash + -> Seq Scan on target t +(6 rows) + +EXPLAIN (COSTS OFF) +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT VALUES (4, NULL); + QUERY PLAN +---------------------------------------- + Merge on target t + -> Hash Left Join + Hash Cond: (s.sid = t.tid) + -> Seq Scan on source s + -> Hash + -> Seq Scan on target t +(6 rows) + +DELETE FROM target WHERE tid > 100; +ANALYZE target; +-- insert some matching source rows to work from +INSERT INTO source VALUES (2, 5); +INSERT INTO source VALUES (3, 20); +SELECT * FROM source ORDER BY sid; + sid | delta +-----+------- + 2 | 5 + 3 | 20 + 4 | 40 +(3 rows) + +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 +(3 rows) + +-- equivalent of an UPDATE join +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 0 + 3 | 0 +(3 rows) + +ROLLBACK; +-- equivalent of a DELETE join +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + DELETE; +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 +(1 row) + +ROLLBACK; +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + DO NOTHING; +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 +(3 rows) + +ROLLBACK; +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT VALUES (4, NULL); +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 + 4 | +(4 rows) + +ROLLBACK; +-- duplicate source row causes multiple target row update ERROR +INSERT INTO source VALUES (2, 5); +SELECT * FROM source ORDER BY sid; + sid | delta +-----+------- + 2 | 5 + 2 | 5 + 3 | 20 + 4 | 40 +(4 rows) + +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 +(3 rows) + +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; +ERROR: MERGE command cannot affect row a second time +HINT: Ensure that not more than one source row matches any one target row. +ROLLBACK; +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + DELETE; +ERROR: MERGE command cannot affect row a second time +HINT: Ensure that not more than one source row matches any one target row. +ROLLBACK; +-- remove duplicate MATCHED data from source data +DELETE FROM source WHERE sid = 2; +INSERT INTO source VALUES (2, 5); +SELECT * FROM source ORDER BY sid; + sid | delta +-----+------- + 2 | 5 + 3 | 20 + 4 | 40 +(3 rows) + +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 +(3 rows) + +-- duplicate source row on INSERT should fail because of target_pkey +INSERT INTO source VALUES (4, 40); +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT VALUES (4, NULL); +ERROR: duplicate key value violates unique constraint "target_pkey" +DETAIL: Key (tid)=(4) already exists. +SELECT * FROM target ORDER BY tid; +ERROR: current transaction is aborted, commands ignored until end of transaction block +ROLLBACK; +-- remove duplicate NOT MATCHED data from source data +DELETE FROM source WHERE sid = 4; +INSERT INTO source VALUES (4, 40); +SELECT * FROM source ORDER BY sid; + sid | delta +-----+------- + 2 | 5 + 3 | 20 + 4 | 40 +(3 rows) + +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 +(3 rows) + +-- remove constraints +alter table target drop CONSTRAINT target_pkey; +alter table target alter column tid drop not null; +-- multiple actions +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT VALUES (4, 4) +WHEN MATCHED THEN + UPDATE SET balance = 0; +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 0 + 3 | 0 + 4 | 4 +(4 rows) + +ROLLBACK; +-- should be equivalent +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = 0 +WHEN NOT MATCHED THEN + INSERT VALUES (4, 4); +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 0 + 3 | 0 + 4 | 4 +(4 rows) + +ROLLBACK; +-- column references +-- do a simple equivalent of an UPDATE join +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = t.balance + s.delta; +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 25 + 3 | 50 +(3 rows) + +ROLLBACK; +-- do a simple equivalent of an INSERT SELECT +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT VALUES (s.sid, s.delta); +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 + 4 | 40 +(4 rows) + +ROLLBACK; +-- and again with duplicate source rows +INSERT INTO source VALUES (5, 50); +INSERT INTO source VALUES (5, 50); +-- do a simple equivalent of an INSERT SELECT +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT VALUES (s.sid, s.delta); +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 + 4 | 40 + 5 | 50 + 5 | 50 +(6 rows) + +ROLLBACK; +-- removing duplicate source rows +DELETE FROM source WHERE sid = 5; +-- and again with explicitly identified column list +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (s.sid, s.delta); +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 + 4 | 40 +(4 rows) + +ROLLBACK; +-- and again with a subtle error: referring to non-existent target row for NOT MATCHED +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (t.tid, s.delta); +ERROR: invalid reference to FROM-clause entry for table "t" +LINE 5: INSERT (tid, balance) VALUES (t.tid, s.delta); + ^ +HINT: There is an entry for table "t", but it cannot be referenced from this part of the query. +-- and again with a constant ON clause +BEGIN; +MERGE INTO target t +USING source AS s +ON (SELECT true) +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (t.tid, s.delta); +ERROR: invalid reference to FROM-clause entry for table "t" +LINE 5: INSERT (tid, balance) VALUES (t.tid, s.delta); + ^ +HINT: There is an entry for table "t", but it cannot be referenced from this part of the query. +SELECT * FROM target ORDER BY tid; +ERROR: current transaction is aborted, commands ignored until end of transaction block +ROLLBACK; +-- now the classic UPSERT +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = t.balance + s.delta +WHEN NOT MATCHED THEN + INSERT VALUES (s.sid, s.delta); +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 25 + 3 | 50 + 4 | 40 +(4 rows) + +ROLLBACK; +-- unreachable WHEN clause should ERROR +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN /* Terminal WHEN clause for MATCHED */ + DELETE +WHEN MATCHED AND s.delta > 0 THEN + UPDATE SET balance = t.balance - s.delta; +ERROR: unreachable WHEN clause specified after unconditional WHEN clause +ROLLBACK; +-- conditional WHEN clause +CREATE TABLE wq_target (tid integer not null, balance integer DEFAULT -1); +CREATE TABLE wq_source (balance integer, sid integer); +INSERT INTO wq_source (sid, balance) VALUES (1, 100); +BEGIN; +-- try a simple INSERT with default values first +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid) VALUES (s.sid); +SELECT * FROM wq_target; + tid | balance +-----+--------- + 1 | -1 +(1 row) + +ROLLBACK; +-- this time with a FALSE condition +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED AND FALSE THEN + INSERT (tid) VALUES (s.sid); +SELECT * FROM wq_target; + tid | balance +-----+--------- +(0 rows) + +-- this time with an actual condition which returns false +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED AND s.balance <> 100 THEN + INSERT (tid) VALUES (s.sid); +SELECT * FROM wq_target; + tid | balance +-----+--------- +(0 rows) + +BEGIN; +-- and now with a condition which returns true +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED AND s.balance = 100 THEN + INSERT (tid) VALUES (s.sid); +SELECT * FROM wq_target; + tid | balance +-----+--------- + 1 | -1 +(1 row) + +ROLLBACK; +-- conditions in the NOT MATCHED clause can only refer to source columns +BEGIN; +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED AND t.balance = 100 THEN + INSERT (tid) VALUES (s.sid); +ERROR: invalid reference to FROM-clause entry for table "t" +LINE 3: WHEN NOT MATCHED AND t.balance = 100 THEN + ^ +HINT: There is an entry for table "t", but it cannot be referenced from this part of the query. +SELECT * FROM wq_target; +ERROR: current transaction is aborted, commands ignored until end of transaction block +ROLLBACK; +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED AND s.balance = 100 THEN + INSERT (tid) VALUES (s.sid); +SELECT * FROM wq_target; + tid | balance +-----+--------- + 1 | -1 +(1 row) + +-- conditions in MATCHED clause can refer to both source and target +SELECT * FROM wq_source; + balance | sid +---------+----- + 100 | 1 +(1 row) + +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND s.balance = 100 THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + tid | balance +-----+--------- + 1 | 99 +(1 row) + +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.balance = 100 THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + tid | balance +-----+--------- + 1 | 99 +(1 row) + +-- check if AND works +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.balance = 99 AND s.balance > 100 THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + tid | balance +-----+--------- + 1 | 99 +(1 row) + +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.balance = 99 AND s.balance = 100 THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + tid | balance +-----+--------- + 1 | 199 +(1 row) + +-- check if OR works +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.balance = 99 OR s.balance > 100 THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + tid | balance +-----+--------- + 1 | 199 +(1 row) + +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.balance = 199 OR s.balance > 100 THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + tid | balance +-----+--------- + 1 | 299 +(1 row) + +-- check if subqueries work in the conditions? +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.balance > (SELECT max(balance) FROM target) THEN + UPDATE SET balance = t.balance + s.balance; +-- check if we can access system columns in the conditions +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.xmin = t.xmax THEN + UPDATE SET balance = t.balance + s.balance; +ERROR: cannot use system column "xmin" in MERGE WHEN condition +LINE 3: WHEN MATCHED AND t.xmin = t.xmax THEN + ^ +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.tableoid >= 0 THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + tid | balance +-----+--------- + 1 | 499 +(1 row) + +-- test preventing WHEN conditions from writing to the database +create or replace function merge_when_and_write() returns boolean +language plpgsql as +$$ +BEGIN + INSERT INTO target VALUES (100, 100); + RETURN TRUE; +END; +$$; +BEGIN; +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND (merge_when_and_write()) THEN + UPDATE SET balance = t.balance + s.balance; +ROLLBACK; +drop function merge_when_and_write(); +DROP TABLE wq_target, wq_source; +-- test triggers +create or replace function merge_trigfunc () returns trigger +language plpgsql as +$$ +DECLARE + line text; +BEGIN + SELECT INTO line format('%s %s %s trigger%s', + TG_WHEN, TG_OP, TG_LEVEL, CASE + WHEN TG_OP = 'INSERT' AND TG_LEVEL = 'ROW' + THEN format(' row: %s', NEW) + WHEN TG_OP = 'UPDATE' AND TG_LEVEL = 'ROW' + THEN format(' row: %s -> %s', OLD, NEW) + WHEN TG_OP = 'DELETE' AND TG_LEVEL = 'ROW' + THEN format(' row: %s', OLD) + END); + + RAISE NOTICE '%', line; + IF (TG_WHEN = 'BEFORE' AND TG_LEVEL = 'ROW') THEN + IF (TG_OP = 'DELETE') THEN + RETURN OLD; + ELSE + RETURN NEW; + END IF; + ELSE + RETURN NULL; + END IF; +END; +$$; +CREATE TRIGGER merge_bsi BEFORE INSERT ON target FOR EACH STATEMENT EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_bsu BEFORE UPDATE ON target FOR EACH STATEMENT EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_bsd BEFORE DELETE ON target FOR EACH STATEMENT EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_asi AFTER INSERT ON target FOR EACH STATEMENT EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_asu AFTER UPDATE ON target FOR EACH STATEMENT EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_asd AFTER DELETE ON target FOR EACH STATEMENT EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_bri BEFORE INSERT ON target FOR EACH ROW EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_bru BEFORE UPDATE ON target FOR EACH ROW EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_brd BEFORE DELETE ON target FOR EACH ROW EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_ari AFTER INSERT ON target FOR EACH ROW EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_aru AFTER UPDATE ON target FOR EACH ROW EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_ard AFTER DELETE ON target FOR EACH ROW EXECUTE PROCEDURE merge_trigfunc (); +-- now the classic UPSERT, with a DELETE +BEGIN; +UPDATE target SET balance = 0 WHERE tid = 3; +NOTICE: BEFORE UPDATE STATEMENT trigger +NOTICE: BEFORE UPDATE ROW trigger row: (3,30) -> (3,0) +NOTICE: AFTER UPDATE ROW trigger row: (3,30) -> (3,0) +NOTICE: AFTER UPDATE STATEMENT trigger +--EXPLAIN (ANALYZE ON, COSTS OFF, SUMMARY OFF, TIMING OFF) +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED AND t.balance > s.delta THEN + UPDATE SET balance = t.balance - s.delta +WHEN MATCHED THEN + DELETE +WHEN NOT MATCHED THEN + INSERT VALUES (s.sid, s.delta); +NOTICE: BEFORE INSERT STATEMENT trigger +NOTICE: BEFORE UPDATE STATEMENT trigger +NOTICE: BEFORE DELETE STATEMENT trigger +NOTICE: BEFORE DELETE ROW trigger row: (3,0) +NOTICE: BEFORE UPDATE ROW trigger row: (2,20) -> (2,15) +NOTICE: BEFORE INSERT ROW trigger row: (4,40) +NOTICE: AFTER DELETE ROW trigger row: (3,0) +NOTICE: AFTER UPDATE ROW trigger row: (2,20) -> (2,15) +NOTICE: AFTER INSERT ROW trigger row: (4,40) +NOTICE: AFTER DELETE STATEMENT trigger +NOTICE: AFTER UPDATE STATEMENT trigger +NOTICE: AFTER INSERT STATEMENT trigger +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 15 + 4 | 40 +(3 rows) + +ROLLBACK; +-- Test behavior of triggers that turn UPDATE/DELETE into no-ops +create or replace function skip_merge_op() returns trigger +language plpgsql as +$$ +BEGIN + RETURN NULL; +END; +$$; +SELECT * FROM target full outer join source on (sid = tid); + tid | balance | sid | delta +-----+---------+-----+------- + 3 | 30 | 3 | 20 + 2 | 20 | 2 | 5 + | | 4 | 40 + 1 | 10 | | +(4 rows) + +create trigger merge_skip BEFORE INSERT OR UPDATE or DELETE + ON target FOR EACH ROW EXECUTE FUNCTION skip_merge_op(); +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED AND s.sid = 3 THEN UPDATE SET balance = t.balance + s.delta +WHEN MATCHED THEN DELETE +WHEN NOT MATCHED THEN INSERT VALUES (sid, delta); +NOTICE: BEFORE INSERT STATEMENT trigger +NOTICE: BEFORE UPDATE STATEMENT trigger +NOTICE: BEFORE DELETE STATEMENT trigger +NOTICE: BEFORE UPDATE ROW trigger row: (3,30) -> (3,50) +NOTICE: BEFORE DELETE ROW trigger row: (2,20) +NOTICE: BEFORE INSERT ROW trigger row: (4,40) +NOTICE: AFTER DELETE STATEMENT trigger +NOTICE: AFTER UPDATE STATEMENT trigger +NOTICE: AFTER INSERT STATEMENT trigger +SELECT * FROM target FULL OUTER JOIN source ON (sid = tid); + tid | balance | sid | delta +-----+---------+-----+------- + 3 | 30 | 3 | 20 + 2 | 20 | 2 | 5 + | | 4 | 40 + 1 | 10 | | +(4 rows) + +DROP TRIGGER merge_skip ON target; +DROP FUNCTION skip_merge_op(); +-- test from PL/pgSQL +-- make sure MERGE INTO isn't interpreted to mean returning variables like SELECT INTO +BEGIN; +DO LANGUAGE plpgsql $$ +BEGIN +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED AND t.balance > s.delta THEN + UPDATE SET balance = t.balance - s.delta; +END; +$$; +NOTICE: BEFORE UPDATE STATEMENT trigger +NOTICE: BEFORE UPDATE ROW trigger row: (3,30) -> (3,10) +NOTICE: BEFORE UPDATE ROW trigger row: (2,20) -> (2,15) +NOTICE: AFTER UPDATE ROW trigger row: (3,30) -> (3,10) +NOTICE: AFTER UPDATE ROW trigger row: (2,20) -> (2,15) +NOTICE: AFTER UPDATE STATEMENT trigger +ROLLBACK; +--source constants +BEGIN; +MERGE INTO target t +USING (SELECT 9 AS sid, 57 AS delta) AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (s.sid, s.delta); +NOTICE: BEFORE INSERT STATEMENT trigger +NOTICE: BEFORE INSERT ROW trigger row: (9,57) +NOTICE: AFTER INSERT ROW trigger row: (9,57) +NOTICE: AFTER INSERT STATEMENT trigger +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 + 9 | 57 +(4 rows) + +ROLLBACK; +--source query +BEGIN; +MERGE INTO target t +USING (SELECT sid, delta FROM source WHERE delta > 0) AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (s.sid, s.delta); +NOTICE: BEFORE INSERT STATEMENT trigger +NOTICE: BEFORE INSERT ROW trigger row: (4,40) +NOTICE: AFTER INSERT ROW trigger row: (4,40) +NOTICE: AFTER INSERT STATEMENT trigger +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 + 4 | 40 +(4 rows) + +ROLLBACK; +BEGIN; +MERGE INTO target t +USING (SELECT sid, delta as newname FROM source WHERE delta > 0) AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (s.sid, s.newname); +NOTICE: BEFORE INSERT STATEMENT trigger +NOTICE: BEFORE INSERT ROW trigger row: (4,40) +NOTICE: AFTER INSERT ROW trigger row: (4,40) +NOTICE: AFTER INSERT STATEMENT trigger +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 + 4 | 40 +(4 rows) + +ROLLBACK; +--self-merge +BEGIN; +MERGE INTO target t1 +USING target t2 +ON t1.tid = t2.tid +WHEN MATCHED THEN + UPDATE SET balance = t1.balance + t2.balance +WHEN NOT MATCHED THEN + INSERT VALUES (t2.tid, t2.balance); +NOTICE: BEFORE INSERT STATEMENT trigger +NOTICE: BEFORE UPDATE STATEMENT trigger +NOTICE: BEFORE UPDATE ROW trigger row: (1,10) -> (1,20) +NOTICE: BEFORE UPDATE ROW trigger row: (2,20) -> (2,40) +NOTICE: BEFORE UPDATE ROW trigger row: (3,30) -> (3,60) +NOTICE: AFTER UPDATE ROW trigger row: (1,10) -> (1,20) +NOTICE: AFTER UPDATE ROW trigger row: (2,20) -> (2,40) +NOTICE: AFTER UPDATE ROW trigger row: (3,30) -> (3,60) +NOTICE: AFTER UPDATE STATEMENT trigger +NOTICE: AFTER INSERT STATEMENT trigger +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 20 + 2 | 40 + 3 | 60 +(3 rows) + +ROLLBACK; +BEGIN; +MERGE INTO target t +USING (SELECT tid as sid, balance as delta FROM target WHERE balance > 0) AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (s.sid, s.delta); +NOTICE: BEFORE INSERT STATEMENT trigger +NOTICE: AFTER INSERT STATEMENT trigger +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 +(3 rows) + +ROLLBACK; +BEGIN; +MERGE INTO target t +USING +(SELECT sid, max(delta) AS delta + FROM source + GROUP BY sid + HAVING count(*) = 1 + ORDER BY sid ASC) AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (s.sid, s.delta); +NOTICE: BEFORE INSERT STATEMENT trigger +NOTICE: BEFORE INSERT ROW trigger row: (4,40) +NOTICE: AFTER INSERT ROW trigger row: (4,40) +NOTICE: AFTER INSERT STATEMENT trigger +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 30 + 4 | 40 +(4 rows) + +ROLLBACK; +-- plpgsql parameters and results +BEGIN; +CREATE FUNCTION merge_func (p_id integer, p_bal integer) +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + result integer; +BEGIN +MERGE INTO target t +USING (SELECT p_id AS sid) AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = t.balance - p_bal; +IF FOUND THEN + GET DIAGNOSTICS result := ROW_COUNT; +END IF; +RETURN result; +END; +$$; +SELECT merge_func(3, 4); +NOTICE: BEFORE UPDATE STATEMENT trigger +NOTICE: BEFORE UPDATE ROW trigger row: (3,30) -> (3,26) +NOTICE: AFTER UPDATE ROW trigger row: (3,30) -> (3,26) +NOTICE: AFTER UPDATE STATEMENT trigger + merge_func +------------ + 1 +(1 row) + +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 10 + 2 | 20 + 3 | 26 +(3 rows) + +ROLLBACK; +-- PREPARE +BEGIN; +prepare foom as merge into target t using (select 1 as sid) s on (t.tid = s.sid) when matched then update set balance = 1; +execute foom; +NOTICE: BEFORE UPDATE STATEMENT trigger +NOTICE: BEFORE UPDATE ROW trigger row: (1,10) -> (1,1) +NOTICE: AFTER UPDATE ROW trigger row: (1,10) -> (1,1) +NOTICE: AFTER UPDATE STATEMENT trigger +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 1 + 2 | 20 + 3 | 30 +(3 rows) + +ROLLBACK; +BEGIN; +PREPARE foom2 (integer, integer) AS +MERGE INTO target t +USING (SELECT 1) s +ON t.tid = $1 +WHEN MATCHED THEN +UPDATE SET balance = $2; +--EXPLAIN (ANALYZE ON, COSTS OFF, SUMMARY OFF, TIMING OFF) +execute foom2 (1, 1); +NOTICE: BEFORE UPDATE STATEMENT trigger +NOTICE: BEFORE UPDATE ROW trigger row: (1,10) -> (1,1) +NOTICE: AFTER UPDATE ROW trigger row: (1,10) -> (1,1) +NOTICE: AFTER UPDATE STATEMENT trigger +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 1 + 2 | 20 + 3 | 30 +(3 rows) + +ROLLBACK; +-- subqueries in source relation +CREATE TABLE sq_target (tid integer NOT NULL, balance integer); +CREATE TABLE sq_source (delta integer, sid integer, balance integer DEFAULT 0); +INSERT INTO sq_target(tid, balance) VALUES (1,100), (2,200), (3,300); +INSERT INTO sq_source(sid, delta) VALUES (1,10), (2,20), (4,40); +BEGIN; +MERGE INTO sq_target t +USING (SELECT * FROM sq_source) s +ON tid = sid +WHEN MATCHED AND t.balance > delta THEN + UPDATE SET balance = t.balance + delta; +SELECT * FROM sq_target; + tid | balance +-----+--------- + 3 | 300 + 1 | 110 + 2 | 220 +(3 rows) + +ROLLBACK; +-- try a view +CREATE VIEW v AS SELECT * FROM sq_source WHERE sid < 2; +BEGIN; +MERGE INTO sq_target +USING v +ON tid = sid +WHEN MATCHED THEN + UPDATE SET balance = v.balance + delta; +SELECT * FROM sq_target; + tid | balance +-----+--------- + 2 | 200 + 3 | 300 + 1 | 10 +(3 rows) + +ROLLBACK; +-- ambiguous reference to a column +BEGIN; +MERGE INTO sq_target +USING v +ON tid = sid +WHEN MATCHED AND tid > 2 THEN + UPDATE SET balance = balance + delta +WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (balance + delta, sid) +WHEN MATCHED AND tid < 2 THEN + DELETE; +ERROR: column reference "balance" is ambiguous +LINE 5: UPDATE SET balance = balance + delta + ^ +ROLLBACK; +BEGIN; +INSERT INTO sq_source (sid, balance, delta) VALUES (-1, -1, -10); +MERGE INTO sq_target t +USING v +ON tid = sid +WHEN MATCHED AND tid > 2 THEN + UPDATE SET balance = t.balance + delta +WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (balance + delta, sid) +WHEN MATCHED AND tid < 2 THEN + DELETE; +SELECT * FROM sq_target; + tid | balance +-----+--------- + 2 | 200 + 3 | 300 + -1 | -11 +(3 rows) + +ROLLBACK; +-- CTEs +BEGIN; +INSERT INTO sq_source (sid, balance, delta) VALUES (-1, -1, -10); +WITH targq AS ( + SELECT * FROM v +) +MERGE INTO sq_target t +USING v +ON tid = sid +WHEN MATCHED AND tid > 2 THEN + UPDATE SET balance = t.balance + delta +WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (balance + delta, sid) +WHEN MATCHED AND tid < 2 THEN + DELETE; +ROLLBACK; +-- RETURNING +BEGIN; +INSERT INTO sq_source (sid, balance, delta) VALUES (-1, -1, -10); +MERGE INTO sq_target t +USING v +ON tid = sid +WHEN MATCHED AND tid > 2 THEN + UPDATE SET balance = t.balance + delta +WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (balance + delta, sid) +WHEN MATCHED AND tid < 2 THEN + DELETE +RETURNING *; +ERROR: syntax error at or near "RETURNING" +LINE 10: RETURNING *; + ^ +ROLLBACK; +-- EXPLAIN +CREATE TABLE ex_mtarget (a int, b int); +CREATE TABLE ex_msource (a int, b int); +INSERT INTO ex_mtarget SELECT i, i*10 FROM generate_series(1,100,2) i; +INSERT INTO ex_msource SELECT i, i*10 FROM generate_series(1,100,1) i; +CREATE FUNCTION explain_merge(query text) RETURNS SETOF text +LANGUAGE plpgsql AS +$$ +DECLARE ln text; +BEGIN + FOR ln IN + EXECUTE 'explain (analyze, timing off, summary off, costs off) ' || + query + LOOP + ln := regexp_replace(ln, 'Memory: \S*', 'Memory: xxx'); + RETURN NEXT ln; + END LOOP; +END; +$$; +-- only updates +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = t.b + 1'); + explain_merge +---------------------------------------------------------------------- + Merge on ex_mtarget t (actual rows=0 loops=1) + Tuples Inserted: 0 + Tuples Updated: 50 + Tuples Deleted: 0 + Tuples Skipped: 0 + -> Merge Join (actual rows=50 loops=1) + Merge Cond: (t.a = s.a) + -> Sort (actual rows=50 loops=1) + Sort Key: t.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_mtarget t (actual rows=50 loops=1) + -> Sort (actual rows=100 loops=1) + Sort Key: s.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_msource s (actual rows=100 loops=1) +(15 rows) + +-- only updates to selected tuples +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a +WHEN MATCHED AND t.a < 10 THEN + UPDATE SET b = t.b + 1'); + explain_merge +---------------------------------------------------------------------- + Merge on ex_mtarget t (actual rows=0 loops=1) + Tuples Inserted: 0 + Tuples Updated: 5 + Tuples Deleted: 0 + Tuples Skipped: 45 + -> Merge Join (actual rows=50 loops=1) + Merge Cond: (t.a = s.a) + -> Sort (actual rows=50 loops=1) + Sort Key: t.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_mtarget t (actual rows=50 loops=1) + -> Sort (actual rows=100 loops=1) + Sort Key: s.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_msource s (actual rows=100 loops=1) +(15 rows) + +-- updates + deletes +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a +WHEN MATCHED AND t.a < 10 THEN + UPDATE SET b = t.b + 1 +WHEN MATCHED AND t.a >= 10 AND t.a <= 20 THEN + DELETE'); + explain_merge +---------------------------------------------------------------------- + Merge on ex_mtarget t (actual rows=0 loops=1) + Tuples Inserted: 0 + Tuples Updated: 5 + Tuples Deleted: 5 + Tuples Skipped: 40 + -> Merge Join (actual rows=50 loops=1) + Merge Cond: (t.a = s.a) + -> Sort (actual rows=50 loops=1) + Sort Key: t.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_mtarget t (actual rows=50 loops=1) + -> Sort (actual rows=100 loops=1) + Sort Key: s.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_msource s (actual rows=100 loops=1) +(15 rows) + +-- only inserts +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a +WHEN NOT MATCHED AND s.a < 10 THEN + INSERT VALUES (a, b)'); + explain_merge +---------------------------------------------------------------------- + Merge on ex_mtarget t (actual rows=0 loops=1) + Tuples Inserted: 4 + Tuples Updated: 0 + Tuples Deleted: 0 + Tuples Skipped: 96 + -> Merge Left Join (actual rows=100 loops=1) + Merge Cond: (s.a = t.a) + -> Sort (actual rows=100 loops=1) + Sort Key: s.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_msource s (actual rows=100 loops=1) + -> Sort (actual rows=45 loops=1) + Sort Key: t.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_mtarget t (actual rows=45 loops=1) +(15 rows) + +-- all three +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a +WHEN MATCHED AND t.a < 10 THEN + UPDATE SET b = t.b + 1 +WHEN MATCHED AND t.a >= 30 AND t.a <= 40 THEN + DELETE +WHEN NOT MATCHED AND s.a < 20 THEN + INSERT VALUES (a, b)'); + explain_merge +---------------------------------------------------------------------- + Merge on ex_mtarget t (actual rows=0 loops=1) + Tuples Inserted: 10 + Tuples Updated: 9 + Tuples Deleted: 5 + Tuples Skipped: 76 + -> Merge Left Join (actual rows=100 loops=1) + Merge Cond: (s.a = t.a) + -> Sort (actual rows=100 loops=1) + Sort Key: s.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_msource s (actual rows=100 loops=1) + -> Sort (actual rows=49 loops=1) + Sort Key: t.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_mtarget t (actual rows=49 loops=1) +(15 rows) + +DROP TABLE ex_msource, ex_mtarget; +DROP FUNCTION explain_merge(text); +-- Subqueries +BEGIN; +MERGE INTO sq_target t +USING v +ON tid = sid +WHEN MATCHED THEN + UPDATE SET balance = (SELECT count(*) FROM sq_target); +SELECT * FROM sq_target WHERE tid = 1; + tid | balance +-----+--------- + 1 | 3 +(1 row) + +ROLLBACK; +BEGIN; +MERGE INTO sq_target t +USING v +ON tid = sid +WHEN MATCHED AND (SELECT count(*) > 0 FROM sq_target) THEN + UPDATE SET balance = 42; +SELECT * FROM sq_target WHERE tid = 1; + tid | balance +-----+--------- + 1 | 42 +(1 row) + +ROLLBACK; +BEGIN; +MERGE INTO sq_target t +USING v +ON tid = sid AND (SELECT count(*) > 0 FROM sq_target) +WHEN MATCHED THEN + UPDATE SET balance = 42; +SELECT * FROM sq_target WHERE tid = 1; + tid | balance +-----+--------- + 1 | 42 +(1 row) + +ROLLBACK; +DROP TABLE sq_target, sq_source CASCADE; +NOTICE: drop cascades to view v +CREATE TABLE pa_target (tid integer, balance float, val text) + PARTITION BY LIST (tid); +CREATE TABLE part1 PARTITION OF pa_target FOR VALUES IN (1,4); +CREATE TABLE part2 PARTITION OF pa_target FOR VALUES IN (2,5,6); +CREATE TABLE part3 PARTITION OF pa_target FOR VALUES IN (3,8,9); +CREATE TABLE part4 PARTITION OF pa_target DEFAULT; +CREATE TABLE pa_source (sid integer, delta float); +-- insert many rows to the source table +INSERT INTO pa_source SELECT id, id * 10 FROM generate_series(1,14) AS id; +-- insert a few rows in the target table (odd numbered tid) +INSERT INTO pa_target SELECT id, id * 100, 'initial' FROM generate_series(1,14,2) AS id; +-- try simple MERGE +BEGIN; +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid + WHEN MATCHED THEN + UPDATE SET balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge'); +SELECT * FROM pa_target ORDER BY tid; + tid | balance | val +-----+---------+-------------------------- + 1 | 110 | initial updated by merge + 2 | 20 | inserted by merge + 3 | 330 | initial updated by merge + 4 | 40 | inserted by merge + 5 | 550 | initial updated by merge + 6 | 60 | inserted by merge + 7 | 770 | initial updated by merge + 8 | 80 | inserted by merge + 9 | 990 | initial updated by merge + 10 | 100 | inserted by merge + 11 | 1210 | initial updated by merge + 12 | 120 | inserted by merge + 13 | 1430 | initial updated by merge + 14 | 140 | inserted by merge +(14 rows) + +ROLLBACK; +-- same with a constant qual +BEGIN; +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid AND tid = 1 + WHEN MATCHED THEN + UPDATE SET balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge'); +SELECT * FROM pa_target ORDER BY tid; + tid | balance | val +-----+---------+-------------------------- + 1 | 110 | initial updated by merge + 2 | 20 | inserted by merge + 3 | 30 | inserted by merge + 3 | 300 | initial + 4 | 40 | inserted by merge + 5 | 500 | initial + 5 | 50 | inserted by merge + 6 | 60 | inserted by merge + 7 | 700 | initial + 7 | 70 | inserted by merge + 8 | 80 | inserted by merge + 9 | 90 | inserted by merge + 9 | 900 | initial + 10 | 100 | inserted by merge + 11 | 1100 | initial + 11 | 110 | inserted by merge + 12 | 120 | inserted by merge + 13 | 1300 | initial + 13 | 130 | inserted by merge + 14 | 140 | inserted by merge +(20 rows) + +ROLLBACK; +-- try updating the partition key column +BEGIN; +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid + WHEN MATCHED THEN + UPDATE SET tid = tid + 1, balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge'); +SELECT * FROM pa_target ORDER BY tid; + tid | balance | val +-----+---------+-------------------------- + 2 | 110 | initial updated by merge + 2 | 20 | inserted by merge + 4 | 40 | inserted by merge + 4 | 330 | initial updated by merge + 6 | 550 | initial updated by merge + 6 | 60 | inserted by merge + 8 | 80 | inserted by merge + 8 | 770 | initial updated by merge + 10 | 990 | initial updated by merge + 10 | 100 | inserted by merge + 12 | 1210 | initial updated by merge + 12 | 120 | inserted by merge + 14 | 1430 | initial updated by merge + 14 | 140 | inserted by merge +(14 rows) + +ROLLBACK; +DROP TABLE pa_target CASCADE; +-- The target table is partitioned in the same way, but this time by attaching +-- partitions which have columns in different order, dropped columns etc. +CREATE TABLE pa_target (tid integer, balance float, val text) + PARTITION BY LIST (tid); +CREATE TABLE part1 (tid integer, balance float, val text); +CREATE TABLE part2 (balance float, tid integer, val text); +CREATE TABLE part3 (tid integer, balance float, val text); +CREATE TABLE part4 (extraid text, tid integer, balance float, val text); +ALTER TABLE part4 DROP COLUMN extraid; +ALTER TABLE pa_target ATTACH PARTITION part1 FOR VALUES IN (1,4); +ALTER TABLE pa_target ATTACH PARTITION part2 FOR VALUES IN (2,5,6); +ALTER TABLE pa_target ATTACH PARTITION part3 FOR VALUES IN (3,8,9); +ALTER TABLE pa_target ATTACH PARTITION part4 DEFAULT; +-- insert a few rows in the target table (odd numbered tid) +INSERT INTO pa_target SELECT id, id * 100, 'initial' FROM generate_series(1,14,2) AS id; +-- try simple MERGE +BEGIN; +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid + WHEN MATCHED THEN + UPDATE SET balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge'); +SELECT * FROM pa_target ORDER BY tid; + tid | balance | val +-----+---------+-------------------------- + 1 | 110 | initial updated by merge + 2 | 20 | inserted by merge + 3 | 330 | initial updated by merge + 4 | 40 | inserted by merge + 5 | 550 | initial updated by merge + 6 | 60 | inserted by merge + 7 | 770 | initial updated by merge + 8 | 80 | inserted by merge + 9 | 990 | initial updated by merge + 10 | 100 | inserted by merge + 11 | 1210 | initial updated by merge + 12 | 120 | inserted by merge + 13 | 1430 | initial updated by merge + 14 | 140 | inserted by merge +(14 rows) + +ROLLBACK; +-- same with a constant qual +BEGIN; +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid AND tid IN (1, 5) + WHEN MATCHED AND tid % 5 = 0 THEN DELETE + WHEN MATCHED THEN + UPDATE SET balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge'); +SELECT * FROM pa_target ORDER BY tid; + tid | balance | val +-----+---------+-------------------------- + 1 | 110 | initial updated by merge + 2 | 20 | inserted by merge + 3 | 30 | inserted by merge + 3 | 300 | initial + 4 | 40 | inserted by merge + 6 | 60 | inserted by merge + 7 | 700 | initial + 7 | 70 | inserted by merge + 8 | 80 | inserted by merge + 9 | 900 | initial + 9 | 90 | inserted by merge + 10 | 100 | inserted by merge + 11 | 110 | inserted by merge + 11 | 1100 | initial + 12 | 120 | inserted by merge + 13 | 1300 | initial + 13 | 130 | inserted by merge + 14 | 140 | inserted by merge +(18 rows) + +ROLLBACK; +-- try updating the partition key column +BEGIN; +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid + WHEN MATCHED THEN + UPDATE SET tid = tid + 1, balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge'); +SELECT * FROM pa_target ORDER BY tid; + tid | balance | val +-----+---------+-------------------------- + 2 | 110 | initial updated by merge + 2 | 20 | inserted by merge + 4 | 40 | inserted by merge + 4 | 330 | initial updated by merge + 6 | 550 | initial updated by merge + 6 | 60 | inserted by merge + 8 | 80 | inserted by merge + 8 | 770 | initial updated by merge + 10 | 990 | initial updated by merge + 10 | 100 | inserted by merge + 12 | 1210 | initial updated by merge + 12 | 120 | inserted by merge + 14 | 1430 | initial updated by merge + 14 | 140 | inserted by merge +(14 rows) + +ROLLBACK; +DROP TABLE pa_source; +DROP TABLE pa_target CASCADE; +-- Sub-partitioning +CREATE TABLE pa_target (logts timestamp, tid integer, balance float, val text) + PARTITION BY RANGE (logts); +CREATE TABLE part_m01 PARTITION OF pa_target + FOR VALUES FROM ('2017-01-01') TO ('2017-02-01') + PARTITION BY LIST (tid); +CREATE TABLE part_m01_odd PARTITION OF part_m01 + FOR VALUES IN (1,3,5,7,9); +CREATE TABLE part_m01_even PARTITION OF part_m01 + FOR VALUES IN (2,4,6,8); +CREATE TABLE part_m02 PARTITION OF pa_target + FOR VALUES FROM ('2017-02-01') TO ('2017-03-01') + PARTITION BY LIST (tid); +CREATE TABLE part_m02_odd PARTITION OF part_m02 + FOR VALUES IN (1,3,5,7,9); +CREATE TABLE part_m02_even PARTITION OF part_m02 + FOR VALUES IN (2,4,6,8); +CREATE TABLE pa_source (sid integer, delta float); +-- insert many rows to the source table +INSERT INTO pa_source SELECT id, id * 10 FROM generate_series(1,14) AS id; +-- insert a few rows in the target table (odd numbered tid) +INSERT INTO pa_target SELECT '2017-01-31', id, id * 100, 'initial' FROM generate_series(1,9,3) AS id; +INSERT INTO pa_target SELECT '2017-02-28', id, id * 100, 'initial' FROM generate_series(2,9,3) AS id; +-- try simple MERGE +BEGIN; +MERGE INTO pa_target t + USING (SELECT '2017-01-15' AS slogts, * FROM pa_source WHERE sid < 10) s + ON t.tid = s.sid + WHEN MATCHED THEN + UPDATE SET balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (slogts::timestamp, sid, delta, 'inserted by merge'); +SELECT * FROM pa_target ORDER BY tid; + logts | tid | balance | val +--------------------------+-----+---------+-------------------------- + Tue Jan 31 00:00:00 2017 | 1 | 110 | initial updated by merge + Tue Feb 28 00:00:00 2017 | 2 | 220 | initial updated by merge + Sun Jan 15 00:00:00 2017 | 3 | 30 | inserted by merge + Tue Jan 31 00:00:00 2017 | 4 | 440 | initial updated by merge + Tue Feb 28 00:00:00 2017 | 5 | 550 | initial updated by merge + Sun Jan 15 00:00:00 2017 | 6 | 60 | inserted by merge + Tue Jan 31 00:00:00 2017 | 7 | 770 | initial updated by merge + Tue Feb 28 00:00:00 2017 | 8 | 880 | initial updated by merge + Sun Jan 15 00:00:00 2017 | 9 | 90 | inserted by merge +(9 rows) + +ROLLBACK; +DROP TABLE pa_source; +DROP TABLE pa_target CASCADE; +-- some complex joins on the source side +CREATE TABLE cj_target (tid integer, balance float, val text); +CREATE TABLE cj_source1 (sid1 integer, scat integer, delta integer); +CREATE TABLE cj_source2 (sid2 integer, sval text); +INSERT INTO cj_source1 VALUES (1, 10, 100); +INSERT INTO cj_source1 VALUES (1, 20, 200); +INSERT INTO cj_source1 VALUES (2, 20, 300); +INSERT INTO cj_source1 VALUES (3, 10, 400); +INSERT INTO cj_source2 VALUES (1, 'initial source2'); +INSERT INTO cj_source2 VALUES (2, 'initial source2'); +INSERT INTO cj_source2 VALUES (3, 'initial source2'); +-- source relation is an unaliased join +MERGE INTO cj_target t +USING cj_source1 s1 + INNER JOIN cj_source2 s2 ON sid1 = sid2 +ON t.tid = sid1 +WHEN NOT MATCHED THEN + INSERT VALUES (sid1, delta, sval); +-- try accessing columns from either side of the source join +MERGE INTO cj_target t +USING cj_source2 s2 + INNER JOIN cj_source1 s1 ON sid1 = sid2 AND scat = 20 +ON t.tid = sid1 +WHEN NOT MATCHED THEN + INSERT VALUES (sid2, delta, sval) +WHEN MATCHED THEN + DELETE; +-- some simple expressions in INSERT targetlist +MERGE INTO cj_target t +USING cj_source2 s2 + INNER JOIN cj_source1 s1 ON sid1 = sid2 +ON t.tid = sid1 +WHEN NOT MATCHED THEN + INSERT VALUES (sid2, delta + scat, sval) +WHEN MATCHED THEN + UPDATE SET val = val || ' updated by merge'; +MERGE INTO cj_target t +USING cj_source2 s2 + INNER JOIN cj_source1 s1 ON sid1 = sid2 AND scat = 20 +ON t.tid = sid1 +WHEN MATCHED THEN + UPDATE SET val = val || ' ' || delta::text; +SELECT * FROM cj_target; + tid | balance | val +-----+---------+---------------------------------- + 3 | 400 | initial source2 updated by merge + 1 | 220 | initial source2 200 + 1 | 110 | initial source2 200 + 2 | 320 | initial source2 300 +(4 rows) + +ALTER TABLE cj_source1 RENAME COLUMN sid1 TO sid; +ALTER TABLE cj_source2 RENAME COLUMN sid2 TO sid; +TRUNCATE cj_target; +MERGE INTO cj_target t +USING cj_source1 s1 + INNER JOIN cj_source2 s2 ON s1.sid = s2.sid +ON t.tid = s1.sid +WHEN NOT MATCHED THEN + INSERT VALUES (s2.sid, delta, sval); +DROP TABLE cj_source2, cj_source1, cj_target; +-- Function scans +CREATE TABLE fs_target (a int, b int, c text); +MERGE INTO fs_target t +USING generate_series(1,100,1) AS id +ON t.a = id +WHEN MATCHED THEN + UPDATE SET b = b + id +WHEN NOT MATCHED THEN + INSERT VALUES (id, -1); +MERGE INTO fs_target t +USING generate_series(1,100,2) AS id +ON t.a = id +WHEN MATCHED THEN + UPDATE SET b = b + id, c = 'updated '|| id.*::text +WHEN NOT MATCHED THEN + INSERT VALUES (id, -1, 'inserted ' || id.*::text); +SELECT count(*) FROM fs_target; + count +------- + 100 +(1 row) + +DROP TABLE fs_target; +-- SERIALIZABLE test +-- handled in isolation tests +-- Inheritance-based partitioning +CREATE TABLE measurement ( + city_id int not null, + logdate date not null, + peaktemp int, + unitsales int +); +CREATE TABLE measurement_y2006m02 ( + CHECK ( logdate >= DATE '2006-02-01' AND logdate < DATE '2006-03-01' ) +) INHERITS (measurement); +CREATE TABLE measurement_y2006m03 ( + CHECK ( logdate >= DATE '2006-03-01' AND logdate < DATE '2006-04-01' ) +) INHERITS (measurement); +CREATE TABLE measurement_y2007m01 ( + filler text, + peaktemp int, + logdate date not null, + city_id int not null, + unitsales int + CHECK ( logdate >= DATE '2007-01-01' AND logdate < DATE '2007-02-01') +); +ALTER TABLE measurement_y2007m01 DROP COLUMN filler; +ALTER TABLE measurement_y2007m01 INHERIT measurement; +CREATE OR REPLACE FUNCTION measurement_insert_trigger() +RETURNS TRIGGER AS $$ +BEGIN + IF ( NEW.logdate >= DATE '2006-02-01' AND + NEW.logdate < DATE '2006-03-01' ) THEN + INSERT INTO measurement_y2006m02 VALUES (NEW.*); + ELSIF ( NEW.logdate >= DATE '2006-03-01' AND + NEW.logdate < DATE '2006-04-01' ) THEN + INSERT INTO measurement_y2006m03 VALUES (NEW.*); + ELSIF ( NEW.logdate >= DATE '2007-01-01' AND + NEW.logdate < DATE '2007-02-01' ) THEN + INSERT INTO measurement_y2007m01 (city_id, logdate, peaktemp, unitsales) + VALUES (NEW.*); + ELSE + RAISE EXCEPTION 'Date out of range. Fix the measurement_insert_trigger() function!'; + END IF; + RETURN NULL; +END; +$$ LANGUAGE plpgsql ; +CREATE TRIGGER insert_measurement_trigger + BEFORE INSERT ON measurement + FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger(); +INSERT INTO measurement VALUES (1, '2006-02-10', 35, 10); +INSERT INTO measurement VALUES (1, '2006-02-16', 45, 20); +INSERT INTO measurement VALUES (1, '2006-03-17', 25, 10); +INSERT INTO measurement VALUES (1, '2006-03-27', 15, 40); +INSERT INTO measurement VALUES (1, '2007-01-15', 10, 10); +INSERT INTO measurement VALUES (1, '2007-01-17', 10, 10); +SELECT tableoid::regclass, * FROM measurement ORDER BY city_id, logdate; + tableoid | city_id | logdate | peaktemp | unitsales +----------------------+---------+------------+----------+----------- + measurement_y2006m02 | 1 | 02-10-2006 | 35 | 10 + measurement_y2006m02 | 1 | 02-16-2006 | 45 | 20 + measurement_y2006m03 | 1 | 03-17-2006 | 25 | 10 + measurement_y2006m03 | 1 | 03-27-2006 | 15 | 40 + measurement_y2007m01 | 1 | 01-15-2007 | 10 | 10 + measurement_y2007m01 | 1 | 01-17-2007 | 10 | 10 +(6 rows) + +CREATE TABLE new_measurement (LIKE measurement); +INSERT INTO new_measurement VALUES (1, '2006-03-01', 20, 10); +INSERT INTO new_measurement VALUES (1, '2006-02-16', 50, 10); +INSERT INTO new_measurement VALUES (2, '2006-02-10', 20, 20); +INSERT INTO new_measurement VALUES (1, '2006-03-27', NULL, NULL); +INSERT INTO new_measurement VALUES (1, '2007-01-17', NULL, NULL); +INSERT INTO new_measurement VALUES (1, '2007-01-15', 5, NULL); +INSERT INTO new_measurement VALUES (1, '2007-01-16', 10, 10); +MERGE into measurement m + USING new_measurement nm ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN MATCHED AND nm.peaktemp IS NULL THEN DELETE +WHEN MATCHED THEN UPDATE + SET peaktemp = greatest(m.peaktemp, nm.peaktemp), + unitsales = m.unitsales + coalesce(nm.unitsales, 0) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id, logdate, peaktemp, unitsales); +SELECT tableoid::regclass, * FROM measurement ORDER BY city_id, logdate; + tableoid | city_id | logdate | peaktemp | unitsales +----------------------+---------+------------+----------+----------- + measurement_y2006m02 | 1 | 02-10-2006 | 35 | 10 + measurement_y2006m02 | 1 | 02-16-2006 | 50 | 30 + measurement_y2006m03 | 1 | 03-01-2006 | 20 | 10 + measurement_y2006m03 | 1 | 03-17-2006 | 25 | 10 + measurement_y2007m01 | 1 | 01-15-2007 | 10 | 10 + measurement_y2007m01 | 1 | 01-16-2007 | 10 | 10 + measurement_y2006m02 | 2 | 02-10-2006 | 20 | 20 +(7 rows) + +DROP TABLE measurement, new_measurement CASCADE; +NOTICE: drop cascades to 3 other objects +DETAIL: drop cascades to table measurement_y2006m02 +drop cascades to table measurement_y2006m03 +drop cascades to table measurement_y2007m01 +DROP FUNCTION measurement_insert_trigger(); +-- prepare +RESET SESSION AUTHORIZATION; +DROP TABLE target, target2; +DROP TABLE source, source2; +DROP FUNCTION merge_trigfunc(); +DROP USER merge_privs; +DROP USER merge_no_privs; diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out index 291e21d7a6..8b4b039c6a 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -699,6 +699,104 @@ SELECT atest6 FROM atest6; -- ok (0 rows) COPY atest6 TO stdout; -- ok +-- test column privileges with MERGE +SET SESSION AUTHORIZATION regress_priv_user1; +CREATE TABLE mtarget (a int, b text); +CREATE TABLE msource (a int, b text); +INSERT INTO mtarget VALUES (1, 'init1'), (2, 'init2'); +INSERT INTO msource VALUES (1, 'source1'), (2, 'source2'), (3, 'source3'); +GRANT SELECT (a) ON msource TO regress_priv_user4; +GRANT SELECT (a) ON mtarget TO regress_priv_user4; +GRANT INSERT (a,b) ON mtarget TO regress_priv_user4; +GRANT UPDATE (b) ON mtarget TO regress_priv_user4; +SET SESSION AUTHORIZATION regress_priv_user4; +-- +-- test source privileges +-- +-- fail (no SELECT priv on s.b) +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = s.b +WHEN NOT MATCHED THEN + INSERT VALUES (a, NULL); +ERROR: permission denied for table msource +-- fail (s.b used in the INSERTed values) +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = 'x' +WHEN NOT MATCHED THEN + INSERT VALUES (a, b); +ERROR: permission denied for table msource +-- fail (s.b used in the WHEN quals) +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED AND s.b = 'x' THEN + UPDATE SET b = 'x' +WHEN NOT MATCHED THEN + INSERT VALUES (a, NULL); +ERROR: permission denied for table msource +-- this should be ok since only s.a is accessed +BEGIN; +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = 'ok' +WHEN NOT MATCHED THEN + INSERT VALUES (a, NULL); +ROLLBACK; +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT (b) ON msource TO regress_priv_user4; +SET SESSION AUTHORIZATION regress_priv_user4; +-- should now be ok +BEGIN; +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = s.b +WHEN NOT MATCHED THEN + INSERT VALUES (a, b); +ROLLBACK; +-- +-- test target privileges +-- +-- fail (no SELECT priv on t.b) +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = t.b +WHEN NOT MATCHED THEN + INSERT VALUES (a, NULL); +ERROR: permission denied for table mtarget +-- fail (no UPDATE on t.a) +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = s.b, a = t.a + 1 +WHEN NOT MATCHED THEN + INSERT VALUES (a, b); +ERROR: permission denied for table mtarget +-- fail (no SELECT on t.b) +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED AND t.b IS NOT NULL THEN + UPDATE SET b = s.b +WHEN NOT MATCHED THEN + INSERT VALUES (a, b); +ERROR: permission denied for table mtarget +-- ok +BEGIN; +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = s.b; +ROLLBACK; +-- fail (no DELETE) +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED AND t.b IS NOT NULL THEN + DELETE; +ERROR: permission denied for table mtarget +-- grant delete privileges +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT DELETE ON mtarget TO regress_priv_user4; +-- should be ok now +BEGIN; +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED AND t.b IS NOT NULL THEN + DELETE; +ROLLBACK; -- check error reporting with column privs SET SESSION AUTHORIZATION regress_priv_user1; CREATE TABLE t1 (c1 int, c2 int, c3 int check (c3 < 5), primary key (c1, c2)); diff --git a/src/test/regress/expected/rowsecurity.out b/src/test/regress/expected/rowsecurity.out index d32a40ede3..b5f6eecba1 100644 --- a/src/test/regress/expected/rowsecurity.out +++ b/src/test/regress/expected/rowsecurity.out @@ -2117,6 +2117,188 @@ ERROR: new row violates row-level security policy (USING expression) for table INSERT INTO document VALUES (1, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'my first novel') ON CONFLICT (did) DO UPDATE SET dauthor = 'regress_rls_carol'; ERROR: new row violates row-level security policy for table "document" +-- +-- MERGE +-- +RESET SESSION AUTHORIZATION; +DROP POLICY p3_with_all ON document; +ALTER TABLE document ADD COLUMN dnotes text DEFAULT ''; +-- all documents are readable +CREATE POLICY p1 ON document FOR SELECT USING (true); +-- one may insert documents only authored by them +CREATE POLICY p2 ON document FOR INSERT WITH CHECK (dauthor = current_user); +-- one may only update documents in 'novel' category +CREATE POLICY p3 ON document FOR UPDATE + USING (cid = (SELECT cid from category WHERE cname = 'novel')) + WITH CHECK (dauthor = current_user); +-- one may only delete documents in 'manga' category +CREATE POLICY p4 ON document FOR DELETE + USING (cid = (SELECT cid from category WHERE cname = 'manga')); +SELECT * FROM document; + did | cid | dlevel | dauthor | dtitle | dnotes +-----+-----+--------+-------------------+----------------------------------+-------- + 1 | 11 | 1 | regress_rls_bob | my first novel | + 3 | 22 | 2 | regress_rls_bob | my science fiction | + 4 | 44 | 1 | regress_rls_bob | my first manga | + 5 | 44 | 2 | regress_rls_bob | my second manga | + 6 | 22 | 1 | regress_rls_carol | great science fiction | + 7 | 33 | 2 | regress_rls_carol | great technology book | + 8 | 44 | 1 | regress_rls_carol | great manga | + 9 | 22 | 1 | regress_rls_dave | awesome science fiction | + 10 | 33 | 2 | regress_rls_dave | awesome technology book | + 11 | 33 | 1 | regress_rls_carol | hoge | + 33 | 22 | 1 | regress_rls_bob | okay science fiction | + 2 | 11 | 2 | regress_rls_bob | my first novel | + 78 | 33 | 1 | regress_rls_bob | some technology novel | + 79 | 33 | 1 | regress_rls_bob | technology book, can only insert | +(14 rows) + +SET SESSION AUTHORIZATION regress_rls_bob; +-- Fails, since update violates WITH CHECK qual on dauthor +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge1 ', dauthor = 'regress_rls_alice'; +ERROR: new row violates row-level security policy for table "document" +-- Should be OK since USING and WITH CHECK quals pass +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge2 '; +-- Even when dauthor is updated explicitly, but to the existing value +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge3 ', dauthor = 'regress_rls_bob'; +-- There is a MATCH for did = 3, but UPDATE's USING qual does not allow +-- updating an item in category 'science fiction' +MERGE INTO document d +USING (SELECT 3 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge '; +ERROR: target row violates row-level security policy (USING expression) for table "document" +-- The same thing with DELETE action, but fails again because no permissions +-- to delete items in 'science fiction' category that did 3 belongs to. +MERGE INTO document d +USING (SELECT 3 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + DELETE; +ERROR: target row violates row-level security policy (USING expression) for table "document" +-- Document with did 4 belongs to 'manga' category which is allowed for +-- deletion. But this fails because the UPDATE action is matched first and +-- UPDATE policy does not allow updation in the category. +MERGE INTO document d +USING (SELECT 4 as sdid) s +ON did = s.sdid +WHEN MATCHED AND dnotes = '' THEN + UPDATE SET dnotes = dnotes || ' notes added by merge ' +WHEN MATCHED THEN + DELETE; +ERROR: target row violates row-level security policy (USING expression) for table "document" +-- UPDATE action is not matched this time because of the WHEN qual. +-- DELETE still fails because role regress_rls_bob does not have SELECT +-- privileges on 'manga' category row in the category table. +MERGE INTO document d +USING (SELECT 4 as sdid) s +ON did = s.sdid +WHEN MATCHED AND dnotes <> '' THEN + UPDATE SET dnotes = dnotes || ' notes added by merge ' +WHEN MATCHED THEN + DELETE; +ERROR: target row violates row-level security policy (USING expression) for table "document" +SELECT * FROM document WHERE did = 4; + did | cid | dlevel | dauthor | dtitle | dnotes +-----+-----+--------+-----------------+----------------+-------- + 4 | 44 | 1 | regress_rls_bob | my first manga | +(1 row) + +-- Switch to regress_rls_carol role and try the DELETE again. It should succeed +-- this time +RESET SESSION AUTHORIZATION; +SET SESSION AUTHORIZATION regress_rls_carol; +MERGE INTO document d +USING (SELECT 4 as sdid) s +ON did = s.sdid +WHEN MATCHED AND dnotes <> '' THEN + UPDATE SET dnotes = dnotes || ' notes added by merge ' +WHEN MATCHED THEN + DELETE; +-- Switch back to regress_rls_bob role +RESET SESSION AUTHORIZATION; +SET SESSION AUTHORIZATION regress_rls_bob; +-- Try INSERT action. This fails because we are trying to insert +-- dauthor = regress_rls_dave and INSERT's WITH CHECK does not allow +-- that +MERGE INTO document d +USING (SELECT 12 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + DELETE +WHEN NOT MATCHED THEN + INSERT VALUES (12, 11, 1, 'regress_rls_dave', 'another novel'); +ERROR: new row violates row-level security policy for table "document" +-- This should be fine +MERGE INTO document d +USING (SELECT 12 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + DELETE +WHEN NOT MATCHED THEN + INSERT VALUES (12, 11, 1, 'regress_rls_bob', 'another novel'); +-- ok +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge4 ' +WHEN NOT MATCHED THEN + INSERT VALUES (12, 11, 1, 'regress_rls_bob', 'another novel'); +-- drop and create a new SELECT policy which prevents us from reading +-- any document except with category 'magna' +RESET SESSION AUTHORIZATION; +DROP POLICY p1 ON document; +CREATE POLICY p1 ON document FOR SELECT + USING (cid = (SELECT cid from category WHERE cname = 'manga')); +SET SESSION AUTHORIZATION regress_rls_bob; +-- MERGE can no longer see the matching row and hence attempts the +-- NOT MATCHED action, which results in unique key violation +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge5 ' +WHEN NOT MATCHED THEN + INSERT VALUES (12, 11, 1, 'regress_rls_bob', 'another novel'); +ERROR: duplicate key value violates unique constraint "document_pkey" +RESET SESSION AUTHORIZATION; +-- drop the restrictive SELECT policy so that we can look at the +-- final state of the table +DROP POLICY p1 ON document; +-- Just check everything went per plan +SELECT * FROM document; + did | cid | dlevel | dauthor | dtitle | dnotes +-----+-----+--------+-------------------+----------------------------------+----------------------------------------------------------------------- + 3 | 22 | 2 | regress_rls_bob | my science fiction | + 5 | 44 | 2 | regress_rls_bob | my second manga | + 6 | 22 | 1 | regress_rls_carol | great science fiction | + 7 | 33 | 2 | regress_rls_carol | great technology book | + 8 | 44 | 1 | regress_rls_carol | great manga | + 9 | 22 | 1 | regress_rls_dave | awesome science fiction | + 10 | 33 | 2 | regress_rls_dave | awesome technology book | + 11 | 33 | 1 | regress_rls_carol | hoge | + 33 | 22 | 1 | regress_rls_bob | okay science fiction | + 2 | 11 | 2 | regress_rls_bob | my first novel | + 78 | 33 | 1 | regress_rls_bob | some technology novel | + 79 | 33 | 1 | regress_rls_bob | technology book, can only insert | + 12 | 11 | 1 | regress_rls_bob | another novel | + 1 | 11 | 1 | regress_rls_bob | my first novel | notes added by merge2 notes added by merge3 notes added by merge4 +(14 rows) + -- -- ROLE/GROUP -- diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 27d19b4bf1..92e1a2f6d8 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -3476,6 +3476,38 @@ CREATE RULE rules_parted_table_insert AS ON INSERT to rules_parted_table ALTER RULE rules_parted_table_insert ON rules_parted_table RENAME TO rules_parted_table_insert_redirect; DROP TABLE rules_parted_table; -- +-- test MERGE +-- +CREATE TABLE rule_merge1 (a int, b text); +CREATE TABLE rule_merge2 (a int, b text); +CREATE RULE rule1 AS ON INSERT TO rule_merge1 + DO INSTEAD INSERT INTO rule_merge2 VALUES (NEW.*); +CREATE RULE rule2 AS ON UPDATE TO rule_merge1 + DO INSTEAD UPDATE rule_merge2 SET a = NEW.a, b = NEW.b + WHERE a = OLD.a; +CREATE RULE rule3 AS ON DELETE TO rule_merge1 + DO INSTEAD DELETE FROM rule_merge2 WHERE a = OLD.a; +-- MERGE not supported for table with rules +MERGE INTO rule_merge1 t USING (SELECT 1 AS a) s + ON t.a = s.a + WHEN MATCHED AND t.a < 2 THEN + UPDATE SET b = b || ' updated by merge' + WHEN MATCHED AND t.a > 2 THEN + DELETE + WHEN NOT MATCHED THEN + INSERT VALUES (s.a, ''); +ERROR: cannot execute MERGE on relation "rule_merge1" +DETAIL: MERGE is not supported for relations with rules. +-- should be ok with the other table though +MERGE INTO rule_merge2 t USING (SELECT 1 AS a) s + ON t.a = s.a + WHEN MATCHED AND t.a < 2 THEN + UPDATE SET b = b || ' updated by merge' + WHEN MATCHED AND t.a > 2 THEN + DELETE + WHEN NOT MATCHED THEN + INSERT VALUES (s.a, ''); +-- -- Test enabling/disabling -- CREATE TABLE ruletest1 (a int); diff --git a/src/test/regress/expected/triggers.out b/src/test/regress/expected/triggers.out index d3e02ca63b..cd812336f2 100644 --- a/src/test/regress/expected/triggers.out +++ b/src/test/regress/expected/triggers.out @@ -3284,6 +3284,54 @@ delete from self_ref where a = 1; NOTICE: trigger_func(self_ref) called: action = DELETE, when = BEFORE, level = STATEMENT NOTICE: trigger = self_ref_s_trig, old table = (1,), (2,1), (3,2), (4,3) drop table self_ref; +-- +-- test transition tables with MERGE +-- +create table merge_target_table (a int primary key, b text); +create trigger merge_target_table_insert_trig + after insert on merge_target_table referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger merge_target_table_update_trig + after update on merge_target_table referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +create trigger merge_target_table_delete_trig + after delete on merge_target_table referencing old table as old_table + for each statement execute procedure dump_delete(); +create table merge_source_table (a int, b text); +insert into merge_source_table + values (1, 'initial1'), (2, 'initial2'), + (3, 'initial3'), (4, 'initial4'); +merge into merge_target_table t +using merge_source_table s +on t.a = s.a +when not matched then + insert values (a, b); +NOTICE: trigger = merge_target_table_insert_trig, new table = (1,initial1), (2,initial2), (3,initial3), (4,initial4) +merge into merge_target_table t +using merge_source_table s +on t.a = s.a +when matched and s.a <= 2 then + update set b = t.b || ' updated by merge' +when matched and s.a > 2 then + delete +when not matched then + insert values (a, b); +NOTICE: trigger = merge_target_table_delete_trig, old table = (3,initial3), (4,initial4) +NOTICE: trigger = merge_target_table_update_trig, old table = (1,initial1), (2,initial2), new table = (1,"initial1 updated by merge"), (2,"initial2 updated by merge") +NOTICE: trigger = merge_target_table_insert_trig, new table = +merge into merge_target_table t +using merge_source_table s +on t.a = s.a +when matched and s.a <= 2 then + update set b = t.b || ' updated again by merge' +when matched and s.a > 2 then + delete +when not matched then + insert values (a, b); +NOTICE: trigger = merge_target_table_delete_trig, old table = +NOTICE: trigger = merge_target_table_update_trig, old table = (1,"initial1 updated by merge"), (2,"initial2 updated by merge"), new table = (1,"initial1 updated by merge updated again by merge"), (2,"initial2 updated by merge updated again by merge") +NOTICE: trigger = merge_target_table_insert_trig, new table = (3,initial3), (4,initial4) +drop table merge_source_table, merge_target_table; -- cleanup drop function dump_insert(); drop function dump_update(); diff --git a/src/test/regress/expected/with.out b/src/test/regress/expected/with.out index ff76ad4d6e..7c6de7cc07 100644 --- a/src/test/regress/expected/with.out +++ b/src/test/regress/expected/with.out @@ -2767,6 +2767,139 @@ RETURNING k, v; (0 rows) DROP TABLE withz; +-- WITH referenced by MERGE statement +CREATE TABLE m AS SELECT i AS k, (i || ' v')::text v FROM generate_series(1, 16, 3) i; +ALTER TABLE m ADD UNIQUE (k); +WITH RECURSIVE cte_basic AS (SELECT 1 a, 'cte_basic val' b) +MERGE INTO m USING (select 0 k, 'merge source SubPlan' v) o ON m.k=o.k +WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_basic WHERE cte_basic.a = m.k LIMIT 1) +WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v); +ERROR: WITH RECURSIVE is not supported for MERGE statement +-- Basic: +WITH cte_basic AS MATERIALIZED (SELECT 1 a, 'cte_basic val' b) +MERGE INTO m USING (select 0 k, 'merge source SubPlan' v offset 0) o ON m.k=o.k +WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_basic WHERE cte_basic.a = m.k LIMIT 1) +WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v); +-- Examine +SELECT * FROM m where k = 0; + k | v +---+---------------------- + 0 | merge source SubPlan +(1 row) + +-- See EXPLAIN output for same query: +EXPLAIN (VERBOSE, COSTS OFF) +WITH cte_basic AS MATERIALIZED (SELECT 1 a, 'cte_basic val' b) +MERGE INTO m USING (select 0 k, 'merge source SubPlan' v offset 0) o ON m.k=o.k +WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_basic WHERE cte_basic.a = m.k LIMIT 1) +WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v); + QUERY PLAN +---------------------------------------------------------------- + Merge on public.m + CTE cte_basic + -> Result + Output: 1, 'cte_basic val'::text + -> Hash Right Join + Output: (0), ('merge source SubPlan'::text), m.ctid + Hash Cond: (m.k = (0)) + -> Seq Scan on public.m + Output: m.ctid, m.k + -> Hash + Output: (0), ('merge source SubPlan'::text) + -> Result + Output: 0, 'merge source SubPlan'::text + SubPlan 2 + -> Limit + Output: ((cte_basic.b || ' merge update'::text)) + -> CTE Scan on cte_basic + Output: (cte_basic.b || ' merge update'::text) + Filter: (cte_basic.a = m.k) +(19 rows) + +-- InitPlan +WITH cte_init AS MATERIALIZED (SELECT 1 a, 'cte_init val' b) +MERGE INTO m USING (select 1 k, 'merge source InitPlan' v offset 0) o ON m.k=o.k +WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_init WHERE a = 1 LIMIT 1) +WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v); +-- Examine +SELECT * FROM m where k = 1; + k | v +---+--------------------------- + 1 | cte_init val merge update +(1 row) + +-- See EXPLAIN output for same query: +EXPLAIN (VERBOSE, COSTS OFF) +WITH cte_init AS MATERIALIZED (SELECT 1 a, 'cte_init val' b) +MERGE INTO m USING (select 1 k, 'merge source InitPlan' v offset 0) o ON m.k=o.k +WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_init WHERE a = 1 LIMIT 1) +WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v); + QUERY PLAN +--------------------------------------------------------------- + Merge on public.m + CTE cte_init + -> Result + Output: 1, 'cte_init val'::text + InitPlan 2 (returns $1) + -> Limit + Output: ((cte_init.b || ' merge update'::text)) + -> CTE Scan on cte_init + Output: (cte_init.b || ' merge update'::text) + Filter: (cte_init.a = 1) + -> Hash Right Join + Output: (1), ('merge source InitPlan'::text), m.ctid + Hash Cond: (m.k = (1)) + -> Seq Scan on public.m + Output: m.ctid, m.k + -> Hash + Output: (1), ('merge source InitPlan'::text) + -> Result + Output: 1, 'merge source InitPlan'::text +(19 rows) + +-- MERGE source comes from CTE: +WITH merge_source_cte AS MATERIALIZED (SELECT 15 a, 'merge_source_cte val' b) +MERGE INTO m USING (select * from merge_source_cte) o ON m.k=o.a +WHEN MATCHED THEN UPDATE SET v = (SELECT b || merge_source_cte.*::text || ' merge update' FROM merge_source_cte WHERE a = 15) +WHEN NOT MATCHED THEN INSERT VALUES(o.a, o.b || (SELECT merge_source_cte.*::text || ' merge insert' FROM merge_source_cte)); +-- Examine +SELECT * FROM m where k = 15; + k | v +----+-------------------------------------------------------------- + 15 | merge_source_cte val(15,"merge_source_cte val") merge insert +(1 row) + +-- See EXPLAIN output for same query: +EXPLAIN (VERBOSE, COSTS OFF) +WITH merge_source_cte AS MATERIALIZED (SELECT 15 a, 'merge_source_cte val' b) +MERGE INTO m USING (select * from merge_source_cte) o ON m.k=o.a +WHEN MATCHED THEN UPDATE SET v = (SELECT b || merge_source_cte.*::text || ' merge update' FROM merge_source_cte WHERE a = 15) +WHEN NOT MATCHED THEN INSERT VALUES(o.a, o.b || (SELECT merge_source_cte.*::text || ' merge insert' FROM merge_source_cte)); + QUERY PLAN +----------------------------------------------------------------------------------------------------- + Merge on public.m + CTE merge_source_cte + -> Result + Output: 15, 'merge_source_cte val'::text + InitPlan 2 (returns $1) + -> CTE Scan on merge_source_cte merge_source_cte_1 + Output: ((merge_source_cte_1.b || (merge_source_cte_1.*)::text) || ' merge update'::text) + Filter: (merge_source_cte_1.a = 15) + InitPlan 3 (returns $2) + -> CTE Scan on merge_source_cte merge_source_cte_2 + Output: ((merge_source_cte_2.*)::text || ' merge insert'::text) + -> Hash Right Join + Output: merge_source_cte.a, merge_source_cte.b, m.ctid + Hash Cond: (m.k = merge_source_cte.a) + -> Seq Scan on public.m + Output: m.ctid, m.k + -> Hash + Output: merge_source_cte.a, merge_source_cte.b + -> CTE Scan on merge_source_cte + Output: merge_source_cte.a, merge_source_cte.b +(20 rows) + +DROP TABLE m; -- check that run to completion happens in proper ordering TRUNCATE TABLE y; INSERT INTO y SELECT generate_series(1, 3); diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 3ce701a588..58fab1de1a 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -86,7 +86,7 @@ test: brin_bloom brin_multi # psql depends on create_am # amutils depends on geometry, create_index_spgist, hash_index, brin # ---------- -test: create_table_like alter_generic alter_operator misc async dbsize misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort create_role +test: create_table_like alter_generic alter_operator misc async dbsize merge misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort create_role # collate.*.utf8 tests cannot be run in parallel with each other test: rules psql psql_crosstab amutils stats_ext collate.linux.utf8 diff --git a/src/test/regress/sql/identity.sql b/src/test/regress/sql/identity.sql index 52800f265c..9b8db2e4a3 100644 --- a/src/test/regress/sql/identity.sql +++ b/src/test/regress/sql/identity.sql @@ -355,3 +355,49 @@ CREATE TABLE itest15 (id integer GENERATED ALWAYS AS IDENTITY NOT NULL); DROP TABLE itest15; CREATE TABLE itest15 (id integer NOT NULL GENERATED ALWAYS AS IDENTITY); DROP TABLE itest15; + +-- MERGE tests +CREATE TABLE itest15 (a int GENERATED ALWAYS AS IDENTITY, b text); +CREATE TABLE itest16 (a int GENERATED BY DEFAULT AS IDENTITY, b text); + +MERGE INTO itest15 t +USING (SELECT 10 AS s_a, 'inserted by merge' AS s_b) s +ON t.a = s.s_a +WHEN NOT MATCHED THEN + INSERT (a, b) VALUES (s.s_a, s.s_b); + +-- Used to fail, but now it works and ignores the user supplied value +MERGE INTO itest15 t +USING (SELECT 20 AS s_a, 'inserted by merge' AS s_b) s +ON t.a = s.s_a +WHEN NOT MATCHED THEN + INSERT (a, b) OVERRIDING USER VALUE VALUES (s.s_a, s.s_b); + +MERGE INTO itest15 t +USING (SELECT 30 AS s_a, 'inserted by merge' AS s_b) s +ON t.a = s.s_a +WHEN NOT MATCHED THEN + INSERT (a, b) OVERRIDING SYSTEM VALUE VALUES (s.s_a, s.s_b); + +MERGE INTO itest16 t +USING (SELECT 10 AS s_a, 'inserted by merge' AS s_b) s +ON t.a = s.s_a +WHEN NOT MATCHED THEN + INSERT (a, b) VALUES (s.s_a, s.s_b); + +MERGE INTO itest16 t +USING (SELECT 20 AS s_a, 'inserted by merge' AS s_b) s +ON t.a = s.s_a +WHEN NOT MATCHED THEN + INSERT (a, b) OVERRIDING USER VALUE VALUES (s.s_a, s.s_b); + +MERGE INTO itest16 t +USING (SELECT 30 AS s_a, 'inserted by merge' AS s_b) s +ON t.a = s.s_a +WHEN NOT MATCHED THEN + INSERT (a, b) OVERRIDING SYSTEM VALUE VALUES (s.s_a, s.s_b); + +SELECT * FROM itest15; +SELECT * FROM itest16; +DROP TABLE itest15; +DROP TABLE itest16; diff --git a/src/test/regress/sql/merge.sql b/src/test/regress/sql/merge.sql new file mode 100644 index 0000000000..34282e0794 --- /dev/null +++ b/src/test/regress/sql/merge.sql @@ -0,0 +1,1273 @@ +-- +-- MERGE +-- +--\set VERBOSITY verbose + +--set debug_print_rewritten = true; +--set debug_print_parse = true; +--set debug_print_pretty = true; + + +CREATE USER merge_privs; +CREATE USER merge_no_privs; +DROP TABLE IF EXISTS target; +DROP TABLE IF EXISTS source; +CREATE TABLE target (tid integer, balance integer); +CREATE TABLE source (sid integer, delta integer); --no index +INSERT INTO target VALUES (1, 10); +INSERT INTO target VALUES (2, 20); +INSERT INTO target VALUES (3, 30); +SELECT t.ctid is not null as matched, t.*, s.* FROM source s FULL OUTER JOIN target t ON s.sid = t.tid ORDER BY t.tid, s.sid; + +ALTER TABLE target OWNER TO merge_privs; +ALTER TABLE source OWNER TO merge_privs; + +CREATE TABLE target2 (tid integer, balance integer); +CREATE TABLE source2 (sid integer, delta integer); + +ALTER TABLE target2 OWNER TO merge_no_privs; +ALTER TABLE source2 OWNER TO merge_no_privs; + +GRANT INSERT ON target TO merge_no_privs; + +SET SESSION AUTHORIZATION merge_privs; + +EXPLAIN (COSTS OFF) +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + DELETE; + +-- +-- Errors +-- +MERGE INTO target t RANDOMWORD +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; +-- MATCHED/INSERT error +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + INSERT DEFAULT VALUES; +-- incorrectly specifying INTO target +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT INTO target DEFAULT VALUES; +-- Multiple VALUES clause +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT VALUES (1,1), (2,2); +-- SELECT query for INSERT +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT SELECT (1, 1); +-- NOT MATCHED/UPDATE +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + UPDATE SET balance = 0; +-- UPDATE tablename +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE target SET balance = 0; +-- source and target names the same +MERGE INTO target +USING target +ON tid = tid +WHEN MATCHED THEN DO NOTHING; + +-- unsupported relation types +-- view +CREATE VIEW tv AS SELECT * FROM target; +MERGE INTO tv t +USING source s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT DEFAULT VALUES; +DROP VIEW tv; + +-- materialized view +CREATE MATERIALIZED VIEW mv AS SELECT * FROM target; +MERGE INTO mv t +USING source s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT DEFAULT VALUES; +DROP MATERIALIZED VIEW mv; + +-- permissions + +MERGE INTO target +USING source2 +ON target.tid = source2.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; + +GRANT INSERT ON target TO merge_no_privs; +SET SESSION AUTHORIZATION merge_no_privs; + +MERGE INTO target +USING source2 +ON target.tid = source2.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; + +GRANT UPDATE ON target2 TO merge_privs; +SET SESSION AUTHORIZATION merge_privs; + +MERGE INTO target2 +USING source +ON target2.tid = source.sid +WHEN MATCHED THEN + DELETE; + +MERGE INTO target2 +USING source +ON target2.tid = source.sid +WHEN NOT MATCHED THEN + INSERT DEFAULT VALUES; + +-- check if the target can be accessed from source relation subquery; we should +-- not be able to do so +MERGE INTO target t +USING (SELECT * FROM source WHERE t.tid > sid) s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT DEFAULT VALUES; + +-- +-- initial tests +-- +-- zero rows in source has no effect +MERGE INTO target +USING source +ON target.tid = source.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; + +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + DELETE; +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT DEFAULT VALUES; +ROLLBACK; + +-- insert some non-matching source rows to work from +INSERT INTO source VALUES (4, 40); +SELECT * FROM source ORDER BY sid; +SELECT * FROM target ORDER BY tid; + +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + DO NOTHING; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + DELETE; +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT DEFAULT VALUES; +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- index plans +INSERT INTO target SELECT generate_series(1000,2500), 0; +ALTER TABLE target ADD PRIMARY KEY (tid); +ANALYZE target; + +EXPLAIN (COSTS OFF) +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; +EXPLAIN (COSTS OFF) +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + DELETE; +EXPLAIN (COSTS OFF) +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT VALUES (4, NULL); +DELETE FROM target WHERE tid > 100; +ANALYZE target; + +-- insert some matching source rows to work from +INSERT INTO source VALUES (2, 5); +INSERT INTO source VALUES (3, 20); +SELECT * FROM source ORDER BY sid; +SELECT * FROM target ORDER BY tid; + +-- equivalent of an UPDATE join +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- equivalent of a DELETE join +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + DELETE; +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + DO NOTHING; +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT VALUES (4, NULL); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- duplicate source row causes multiple target row update ERROR +INSERT INTO source VALUES (2, 5); +SELECT * FROM source ORDER BY sid; +SELECT * FROM target ORDER BY tid; +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = 0; +ROLLBACK; + +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + DELETE; +ROLLBACK; + +-- remove duplicate MATCHED data from source data +DELETE FROM source WHERE sid = 2; +INSERT INTO source VALUES (2, 5); +SELECT * FROM source ORDER BY sid; +SELECT * FROM target ORDER BY tid; + +-- duplicate source row on INSERT should fail because of target_pkey +INSERT INTO source VALUES (4, 40); +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT VALUES (4, NULL); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- remove duplicate NOT MATCHED data from source data +DELETE FROM source WHERE sid = 4; +INSERT INTO source VALUES (4, 40); +SELECT * FROM source ORDER BY sid; +SELECT * FROM target ORDER BY tid; + +-- remove constraints +alter table target drop CONSTRAINT target_pkey; +alter table target alter column tid drop not null; + +-- multiple actions +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT VALUES (4, 4) +WHEN MATCHED THEN + UPDATE SET balance = 0; +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- should be equivalent +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = 0 +WHEN NOT MATCHED THEN + INSERT VALUES (4, 4); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- column references +-- do a simple equivalent of an UPDATE join +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = t.balance + s.delta; +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- do a simple equivalent of an INSERT SELECT +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT VALUES (s.sid, s.delta); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- and again with duplicate source rows +INSERT INTO source VALUES (5, 50); +INSERT INTO source VALUES (5, 50); + +-- do a simple equivalent of an INSERT SELECT +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT VALUES (s.sid, s.delta); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- removing duplicate source rows +DELETE FROM source WHERE sid = 5; + +-- and again with explicitly identified column list +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (s.sid, s.delta); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- and again with a subtle error: referring to non-existent target row for NOT MATCHED +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (t.tid, s.delta); + +-- and again with a constant ON clause +BEGIN; +MERGE INTO target t +USING source AS s +ON (SELECT true) +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (t.tid, s.delta); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- now the classic UPSERT +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = t.balance + s.delta +WHEN NOT MATCHED THEN + INSERT VALUES (s.sid, s.delta); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- unreachable WHEN clause should ERROR +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED THEN /* Terminal WHEN clause for MATCHED */ + DELETE +WHEN MATCHED AND s.delta > 0 THEN + UPDATE SET balance = t.balance - s.delta; +ROLLBACK; + +-- conditional WHEN clause +CREATE TABLE wq_target (tid integer not null, balance integer DEFAULT -1); +CREATE TABLE wq_source (balance integer, sid integer); + +INSERT INTO wq_source (sid, balance) VALUES (1, 100); + +BEGIN; +-- try a simple INSERT with default values first +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid) VALUES (s.sid); +SELECT * FROM wq_target; +ROLLBACK; + +-- this time with a FALSE condition +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED AND FALSE THEN + INSERT (tid) VALUES (s.sid); +SELECT * FROM wq_target; + +-- this time with an actual condition which returns false +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED AND s.balance <> 100 THEN + INSERT (tid) VALUES (s.sid); +SELECT * FROM wq_target; + +BEGIN; +-- and now with a condition which returns true +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED AND s.balance = 100 THEN + INSERT (tid) VALUES (s.sid); +SELECT * FROM wq_target; +ROLLBACK; + +-- conditions in the NOT MATCHED clause can only refer to source columns +BEGIN; +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED AND t.balance = 100 THEN + INSERT (tid) VALUES (s.sid); +SELECT * FROM wq_target; +ROLLBACK; + +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED AND s.balance = 100 THEN + INSERT (tid) VALUES (s.sid); +SELECT * FROM wq_target; + +-- conditions in MATCHED clause can refer to both source and target +SELECT * FROM wq_source; +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND s.balance = 100 THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.balance = 100 THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + +-- check if AND works +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.balance = 99 AND s.balance > 100 THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.balance = 99 AND s.balance = 100 THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + +-- check if OR works +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.balance = 99 OR s.balance > 100 THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.balance = 199 OR s.balance > 100 THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + +-- check if subqueries work in the conditions? +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.balance > (SELECT max(balance) FROM target) THEN + UPDATE SET balance = t.balance + s.balance; + +-- check if we can access system columns in the conditions +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.xmin = t.xmax THEN + UPDATE SET balance = t.balance + s.balance; + +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND t.tableoid >= 0 THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + +-- test preventing WHEN conditions from writing to the database +create or replace function merge_when_and_write() returns boolean +language plpgsql as +$$ +BEGIN + INSERT INTO target VALUES (100, 100); + RETURN TRUE; +END; +$$; + +BEGIN; +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN MATCHED AND (merge_when_and_write()) THEN + UPDATE SET balance = t.balance + s.balance; +ROLLBACK; +drop function merge_when_and_write(); + +DROP TABLE wq_target, wq_source; + +-- test triggers +create or replace function merge_trigfunc () returns trigger +language plpgsql as +$$ +DECLARE + line text; +BEGIN + SELECT INTO line format('%s %s %s trigger%s', + TG_WHEN, TG_OP, TG_LEVEL, CASE + WHEN TG_OP = 'INSERT' AND TG_LEVEL = 'ROW' + THEN format(' row: %s', NEW) + WHEN TG_OP = 'UPDATE' AND TG_LEVEL = 'ROW' + THEN format(' row: %s -> %s', OLD, NEW) + WHEN TG_OP = 'DELETE' AND TG_LEVEL = 'ROW' + THEN format(' row: %s', OLD) + END); + + RAISE NOTICE '%', line; + IF (TG_WHEN = 'BEFORE' AND TG_LEVEL = 'ROW') THEN + IF (TG_OP = 'DELETE') THEN + RETURN OLD; + ELSE + RETURN NEW; + END IF; + ELSE + RETURN NULL; + END IF; +END; +$$; +CREATE TRIGGER merge_bsi BEFORE INSERT ON target FOR EACH STATEMENT EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_bsu BEFORE UPDATE ON target FOR EACH STATEMENT EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_bsd BEFORE DELETE ON target FOR EACH STATEMENT EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_asi AFTER INSERT ON target FOR EACH STATEMENT EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_asu AFTER UPDATE ON target FOR EACH STATEMENT EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_asd AFTER DELETE ON target FOR EACH STATEMENT EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_bri BEFORE INSERT ON target FOR EACH ROW EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_bru BEFORE UPDATE ON target FOR EACH ROW EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_brd BEFORE DELETE ON target FOR EACH ROW EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_ari AFTER INSERT ON target FOR EACH ROW EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_aru AFTER UPDATE ON target FOR EACH ROW EXECUTE PROCEDURE merge_trigfunc (); +CREATE TRIGGER merge_ard AFTER DELETE ON target FOR EACH ROW EXECUTE PROCEDURE merge_trigfunc (); + +-- now the classic UPSERT, with a DELETE +BEGIN; +UPDATE target SET balance = 0 WHERE tid = 3; +--EXPLAIN (ANALYZE ON, COSTS OFF, SUMMARY OFF, TIMING OFF) +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED AND t.balance > s.delta THEN + UPDATE SET balance = t.balance - s.delta +WHEN MATCHED THEN + DELETE +WHEN NOT MATCHED THEN + INSERT VALUES (s.sid, s.delta); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- Test behavior of triggers that turn UPDATE/DELETE into no-ops +create or replace function skip_merge_op() returns trigger +language plpgsql as +$$ +BEGIN + RETURN NULL; +END; +$$; + +SELECT * FROM target full outer join source on (sid = tid); +create trigger merge_skip BEFORE INSERT OR UPDATE or DELETE + ON target FOR EACH ROW EXECUTE FUNCTION skip_merge_op(); +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED AND s.sid = 3 THEN UPDATE SET balance = t.balance + s.delta +WHEN MATCHED THEN DELETE +WHEN NOT MATCHED THEN INSERT VALUES (sid, delta); +SELECT * FROM target FULL OUTER JOIN source ON (sid = tid); +DROP TRIGGER merge_skip ON target; +DROP FUNCTION skip_merge_op(); + +-- test from PL/pgSQL +-- make sure MERGE INTO isn't interpreted to mean returning variables like SELECT INTO +BEGIN; +DO LANGUAGE plpgsql $$ +BEGIN +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED AND t.balance > s.delta THEN + UPDATE SET balance = t.balance - s.delta; +END; +$$; +ROLLBACK; + +--source constants +BEGIN; +MERGE INTO target t +USING (SELECT 9 AS sid, 57 AS delta) AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (s.sid, s.delta); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +--source query +BEGIN; +MERGE INTO target t +USING (SELECT sid, delta FROM source WHERE delta > 0) AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (s.sid, s.delta); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +BEGIN; +MERGE INTO target t +USING (SELECT sid, delta as newname FROM source WHERE delta > 0) AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (s.sid, s.newname); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +--self-merge +BEGIN; +MERGE INTO target t1 +USING target t2 +ON t1.tid = t2.tid +WHEN MATCHED THEN + UPDATE SET balance = t1.balance + t2.balance +WHEN NOT MATCHED THEN + INSERT VALUES (t2.tid, t2.balance); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +BEGIN; +MERGE INTO target t +USING (SELECT tid as sid, balance as delta FROM target WHERE balance > 0) AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (s.sid, s.delta); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +BEGIN; +MERGE INTO target t +USING +(SELECT sid, max(delta) AS delta + FROM source + GROUP BY sid + HAVING count(*) = 1 + ORDER BY sid ASC) AS s +ON t.tid = s.sid +WHEN NOT MATCHED THEN + INSERT (tid, balance) VALUES (s.sid, s.delta); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- plpgsql parameters and results +BEGIN; +CREATE FUNCTION merge_func (p_id integer, p_bal integer) +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + result integer; +BEGIN +MERGE INTO target t +USING (SELECT p_id AS sid) AS s +ON t.tid = s.sid +WHEN MATCHED THEN + UPDATE SET balance = t.balance - p_bal; +IF FOUND THEN + GET DIAGNOSTICS result := ROW_COUNT; +END IF; +RETURN result; +END; +$$; +SELECT merge_func(3, 4); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- PREPARE +BEGIN; +prepare foom as merge into target t using (select 1 as sid) s on (t.tid = s.sid) when matched then update set balance = 1; +execute foom; +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +BEGIN; +PREPARE foom2 (integer, integer) AS +MERGE INTO target t +USING (SELECT 1) s +ON t.tid = $1 +WHEN MATCHED THEN +UPDATE SET balance = $2; +--EXPLAIN (ANALYZE ON, COSTS OFF, SUMMARY OFF, TIMING OFF) +execute foom2 (1, 1); +SELECT * FROM target ORDER BY tid; +ROLLBACK; + +-- subqueries in source relation + +CREATE TABLE sq_target (tid integer NOT NULL, balance integer); +CREATE TABLE sq_source (delta integer, sid integer, balance integer DEFAULT 0); + +INSERT INTO sq_target(tid, balance) VALUES (1,100), (2,200), (3,300); +INSERT INTO sq_source(sid, delta) VALUES (1,10), (2,20), (4,40); + +BEGIN; +MERGE INTO sq_target t +USING (SELECT * FROM sq_source) s +ON tid = sid +WHEN MATCHED AND t.balance > delta THEN + UPDATE SET balance = t.balance + delta; +SELECT * FROM sq_target; +ROLLBACK; + +-- try a view +CREATE VIEW v AS SELECT * FROM sq_source WHERE sid < 2; + +BEGIN; +MERGE INTO sq_target +USING v +ON tid = sid +WHEN MATCHED THEN + UPDATE SET balance = v.balance + delta; +SELECT * FROM sq_target; +ROLLBACK; + +-- ambiguous reference to a column +BEGIN; +MERGE INTO sq_target +USING v +ON tid = sid +WHEN MATCHED AND tid > 2 THEN + UPDATE SET balance = balance + delta +WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (balance + delta, sid) +WHEN MATCHED AND tid < 2 THEN + DELETE; +ROLLBACK; + +BEGIN; +INSERT INTO sq_source (sid, balance, delta) VALUES (-1, -1, -10); +MERGE INTO sq_target t +USING v +ON tid = sid +WHEN MATCHED AND tid > 2 THEN + UPDATE SET balance = t.balance + delta +WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (balance + delta, sid) +WHEN MATCHED AND tid < 2 THEN + DELETE; +SELECT * FROM sq_target; +ROLLBACK; + +-- CTEs +BEGIN; +INSERT INTO sq_source (sid, balance, delta) VALUES (-1, -1, -10); +WITH targq AS ( + SELECT * FROM v +) +MERGE INTO sq_target t +USING v +ON tid = sid +WHEN MATCHED AND tid > 2 THEN + UPDATE SET balance = t.balance + delta +WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (balance + delta, sid) +WHEN MATCHED AND tid < 2 THEN + DELETE; +ROLLBACK; + +-- RETURNING +BEGIN; +INSERT INTO sq_source (sid, balance, delta) VALUES (-1, -1, -10); +MERGE INTO sq_target t +USING v +ON tid = sid +WHEN MATCHED AND tid > 2 THEN + UPDATE SET balance = t.balance + delta +WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (balance + delta, sid) +WHEN MATCHED AND tid < 2 THEN + DELETE +RETURNING *; +ROLLBACK; + +-- EXPLAIN +CREATE TABLE ex_mtarget (a int, b int); +CREATE TABLE ex_msource (a int, b int); +INSERT INTO ex_mtarget SELECT i, i*10 FROM generate_series(1,100,2) i; +INSERT INTO ex_msource SELECT i, i*10 FROM generate_series(1,100,1) i; + +CREATE FUNCTION explain_merge(query text) RETURNS SETOF text +LANGUAGE plpgsql AS +$$ +DECLARE ln text; +BEGIN + FOR ln IN + EXECUTE 'explain (analyze, timing off, summary off, costs off) ' || + query + LOOP + ln := regexp_replace(ln, 'Memory: \S*', 'Memory: xxx'); + RETURN NEXT ln; + END LOOP; +END; +$$; + +-- only updates +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = t.b + 1'); + +-- only updates to selected tuples +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a +WHEN MATCHED AND t.a < 10 THEN + UPDATE SET b = t.b + 1'); + +-- updates + deletes +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a +WHEN MATCHED AND t.a < 10 THEN + UPDATE SET b = t.b + 1 +WHEN MATCHED AND t.a >= 10 AND t.a <= 20 THEN + DELETE'); + +-- only inserts +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a +WHEN NOT MATCHED AND s.a < 10 THEN + INSERT VALUES (a, b)'); + +-- all three +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a +WHEN MATCHED AND t.a < 10 THEN + UPDATE SET b = t.b + 1 +WHEN MATCHED AND t.a >= 30 AND t.a <= 40 THEN + DELETE +WHEN NOT MATCHED AND s.a < 20 THEN + INSERT VALUES (a, b)'); + +DROP TABLE ex_msource, ex_mtarget; +DROP FUNCTION explain_merge(text); + +-- Subqueries +BEGIN; +MERGE INTO sq_target t +USING v +ON tid = sid +WHEN MATCHED THEN + UPDATE SET balance = (SELECT count(*) FROM sq_target); +SELECT * FROM sq_target WHERE tid = 1; +ROLLBACK; + +BEGIN; +MERGE INTO sq_target t +USING v +ON tid = sid +WHEN MATCHED AND (SELECT count(*) > 0 FROM sq_target) THEN + UPDATE SET balance = 42; +SELECT * FROM sq_target WHERE tid = 1; +ROLLBACK; + +BEGIN; +MERGE INTO sq_target t +USING v +ON tid = sid AND (SELECT count(*) > 0 FROM sq_target) +WHEN MATCHED THEN + UPDATE SET balance = 42; +SELECT * FROM sq_target WHERE tid = 1; +ROLLBACK; + +DROP TABLE sq_target, sq_source CASCADE; + +CREATE TABLE pa_target (tid integer, balance float, val text) + PARTITION BY LIST (tid); + +CREATE TABLE part1 PARTITION OF pa_target FOR VALUES IN (1,4); +CREATE TABLE part2 PARTITION OF pa_target FOR VALUES IN (2,5,6); +CREATE TABLE part3 PARTITION OF pa_target FOR VALUES IN (3,8,9); +CREATE TABLE part4 PARTITION OF pa_target DEFAULT; + +CREATE TABLE pa_source (sid integer, delta float); +-- insert many rows to the source table +INSERT INTO pa_source SELECT id, id * 10 FROM generate_series(1,14) AS id; +-- insert a few rows in the target table (odd numbered tid) +INSERT INTO pa_target SELECT id, id * 100, 'initial' FROM generate_series(1,14,2) AS id; + +-- try simple MERGE +BEGIN; +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid + WHEN MATCHED THEN + UPDATE SET balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge'); +SELECT * FROM pa_target ORDER BY tid; +ROLLBACK; + +-- same with a constant qual +BEGIN; +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid AND tid = 1 + WHEN MATCHED THEN + UPDATE SET balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge'); +SELECT * FROM pa_target ORDER BY tid; +ROLLBACK; + +-- try updating the partition key column +BEGIN; +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid + WHEN MATCHED THEN + UPDATE SET tid = tid + 1, balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge'); +SELECT * FROM pa_target ORDER BY tid; +ROLLBACK; + +DROP TABLE pa_target CASCADE; + +-- The target table is partitioned in the same way, but this time by attaching +-- partitions which have columns in different order, dropped columns etc. +CREATE TABLE pa_target (tid integer, balance float, val text) + PARTITION BY LIST (tid); + +CREATE TABLE part1 (tid integer, balance float, val text); +CREATE TABLE part2 (balance float, tid integer, val text); +CREATE TABLE part3 (tid integer, balance float, val text); +CREATE TABLE part4 (extraid text, tid integer, balance float, val text); +ALTER TABLE part4 DROP COLUMN extraid; + +ALTER TABLE pa_target ATTACH PARTITION part1 FOR VALUES IN (1,4); +ALTER TABLE pa_target ATTACH PARTITION part2 FOR VALUES IN (2,5,6); +ALTER TABLE pa_target ATTACH PARTITION part3 FOR VALUES IN (3,8,9); +ALTER TABLE pa_target ATTACH PARTITION part4 DEFAULT; + +-- insert a few rows in the target table (odd numbered tid) +INSERT INTO pa_target SELECT id, id * 100, 'initial' FROM generate_series(1,14,2) AS id; + +-- try simple MERGE +BEGIN; +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid + WHEN MATCHED THEN + UPDATE SET balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge'); +SELECT * FROM pa_target ORDER BY tid; +ROLLBACK; + +-- same with a constant qual +BEGIN; +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid AND tid IN (1, 5) + WHEN MATCHED AND tid % 5 = 0 THEN DELETE + WHEN MATCHED THEN + UPDATE SET balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge'); +SELECT * FROM pa_target ORDER BY tid; +ROLLBACK; + +-- try updating the partition key column +BEGIN; +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid + WHEN MATCHED THEN + UPDATE SET tid = tid + 1, balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge'); +SELECT * FROM pa_target ORDER BY tid; +ROLLBACK; + +DROP TABLE pa_source; +DROP TABLE pa_target CASCADE; + +-- Sub-partitioning +CREATE TABLE pa_target (logts timestamp, tid integer, balance float, val text) + PARTITION BY RANGE (logts); + +CREATE TABLE part_m01 PARTITION OF pa_target + FOR VALUES FROM ('2017-01-01') TO ('2017-02-01') + PARTITION BY LIST (tid); +CREATE TABLE part_m01_odd PARTITION OF part_m01 + FOR VALUES IN (1,3,5,7,9); +CREATE TABLE part_m01_even PARTITION OF part_m01 + FOR VALUES IN (2,4,6,8); +CREATE TABLE part_m02 PARTITION OF pa_target + FOR VALUES FROM ('2017-02-01') TO ('2017-03-01') + PARTITION BY LIST (tid); +CREATE TABLE part_m02_odd PARTITION OF part_m02 + FOR VALUES IN (1,3,5,7,9); +CREATE TABLE part_m02_even PARTITION OF part_m02 + FOR VALUES IN (2,4,6,8); + +CREATE TABLE pa_source (sid integer, delta float); +-- insert many rows to the source table +INSERT INTO pa_source SELECT id, id * 10 FROM generate_series(1,14) AS id; +-- insert a few rows in the target table (odd numbered tid) +INSERT INTO pa_target SELECT '2017-01-31', id, id * 100, 'initial' FROM generate_series(1,9,3) AS id; +INSERT INTO pa_target SELECT '2017-02-28', id, id * 100, 'initial' FROM generate_series(2,9,3) AS id; + +-- try simple MERGE +BEGIN; +MERGE INTO pa_target t + USING (SELECT '2017-01-15' AS slogts, * FROM pa_source WHERE sid < 10) s + ON t.tid = s.sid + WHEN MATCHED THEN + UPDATE SET balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (slogts::timestamp, sid, delta, 'inserted by merge'); +SELECT * FROM pa_target ORDER BY tid; +ROLLBACK; + +DROP TABLE pa_source; +DROP TABLE pa_target CASCADE; + +-- some complex joins on the source side + +CREATE TABLE cj_target (tid integer, balance float, val text); +CREATE TABLE cj_source1 (sid1 integer, scat integer, delta integer); +CREATE TABLE cj_source2 (sid2 integer, sval text); +INSERT INTO cj_source1 VALUES (1, 10, 100); +INSERT INTO cj_source1 VALUES (1, 20, 200); +INSERT INTO cj_source1 VALUES (2, 20, 300); +INSERT INTO cj_source1 VALUES (3, 10, 400); +INSERT INTO cj_source2 VALUES (1, 'initial source2'); +INSERT INTO cj_source2 VALUES (2, 'initial source2'); +INSERT INTO cj_source2 VALUES (3, 'initial source2'); + +-- source relation is an unaliased join +MERGE INTO cj_target t +USING cj_source1 s1 + INNER JOIN cj_source2 s2 ON sid1 = sid2 +ON t.tid = sid1 +WHEN NOT MATCHED THEN + INSERT VALUES (sid1, delta, sval); + +-- try accessing columns from either side of the source join +MERGE INTO cj_target t +USING cj_source2 s2 + INNER JOIN cj_source1 s1 ON sid1 = sid2 AND scat = 20 +ON t.tid = sid1 +WHEN NOT MATCHED THEN + INSERT VALUES (sid2, delta, sval) +WHEN MATCHED THEN + DELETE; + +-- some simple expressions in INSERT targetlist +MERGE INTO cj_target t +USING cj_source2 s2 + INNER JOIN cj_source1 s1 ON sid1 = sid2 +ON t.tid = sid1 +WHEN NOT MATCHED THEN + INSERT VALUES (sid2, delta + scat, sval) +WHEN MATCHED THEN + UPDATE SET val = val || ' updated by merge'; + +MERGE INTO cj_target t +USING cj_source2 s2 + INNER JOIN cj_source1 s1 ON sid1 = sid2 AND scat = 20 +ON t.tid = sid1 +WHEN MATCHED THEN + UPDATE SET val = val || ' ' || delta::text; + +SELECT * FROM cj_target; + +ALTER TABLE cj_source1 RENAME COLUMN sid1 TO sid; +ALTER TABLE cj_source2 RENAME COLUMN sid2 TO sid; + +TRUNCATE cj_target; + +MERGE INTO cj_target t +USING cj_source1 s1 + INNER JOIN cj_source2 s2 ON s1.sid = s2.sid +ON t.tid = s1.sid +WHEN NOT MATCHED THEN + INSERT VALUES (s2.sid, delta, sval); + +DROP TABLE cj_source2, cj_source1, cj_target; + +-- Function scans +CREATE TABLE fs_target (a int, b int, c text); +MERGE INTO fs_target t +USING generate_series(1,100,1) AS id +ON t.a = id +WHEN MATCHED THEN + UPDATE SET b = b + id +WHEN NOT MATCHED THEN + INSERT VALUES (id, -1); + +MERGE INTO fs_target t +USING generate_series(1,100,2) AS id +ON t.a = id +WHEN MATCHED THEN + UPDATE SET b = b + id, c = 'updated '|| id.*::text +WHEN NOT MATCHED THEN + INSERT VALUES (id, -1, 'inserted ' || id.*::text); + +SELECT count(*) FROM fs_target; +DROP TABLE fs_target; + +-- SERIALIZABLE test +-- handled in isolation tests + +-- Inheritance-based partitioning +CREATE TABLE measurement ( + city_id int not null, + logdate date not null, + peaktemp int, + unitsales int +); +CREATE TABLE measurement_y2006m02 ( + CHECK ( logdate >= DATE '2006-02-01' AND logdate < DATE '2006-03-01' ) +) INHERITS (measurement); +CREATE TABLE measurement_y2006m03 ( + CHECK ( logdate >= DATE '2006-03-01' AND logdate < DATE '2006-04-01' ) +) INHERITS (measurement); +CREATE TABLE measurement_y2007m01 ( + filler text, + peaktemp int, + logdate date not null, + city_id int not null, + unitsales int + CHECK ( logdate >= DATE '2007-01-01' AND logdate < DATE '2007-02-01') +); +ALTER TABLE measurement_y2007m01 DROP COLUMN filler; +ALTER TABLE measurement_y2007m01 INHERIT measurement; + +CREATE OR REPLACE FUNCTION measurement_insert_trigger() +RETURNS TRIGGER AS $$ +BEGIN + IF ( NEW.logdate >= DATE '2006-02-01' AND + NEW.logdate < DATE '2006-03-01' ) THEN + INSERT INTO measurement_y2006m02 VALUES (NEW.*); + ELSIF ( NEW.logdate >= DATE '2006-03-01' AND + NEW.logdate < DATE '2006-04-01' ) THEN + INSERT INTO measurement_y2006m03 VALUES (NEW.*); + ELSIF ( NEW.logdate >= DATE '2007-01-01' AND + NEW.logdate < DATE '2007-02-01' ) THEN + INSERT INTO measurement_y2007m01 (city_id, logdate, peaktemp, unitsales) + VALUES (NEW.*); + ELSE + RAISE EXCEPTION 'Date out of range. Fix the measurement_insert_trigger() function!'; + END IF; + RETURN NULL; +END; +$$ LANGUAGE plpgsql ; +CREATE TRIGGER insert_measurement_trigger + BEFORE INSERT ON measurement + FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger(); +INSERT INTO measurement VALUES (1, '2006-02-10', 35, 10); +INSERT INTO measurement VALUES (1, '2006-02-16', 45, 20); +INSERT INTO measurement VALUES (1, '2006-03-17', 25, 10); +INSERT INTO measurement VALUES (1, '2006-03-27', 15, 40); +INSERT INTO measurement VALUES (1, '2007-01-15', 10, 10); +INSERT INTO measurement VALUES (1, '2007-01-17', 10, 10); + +SELECT tableoid::regclass, * FROM measurement ORDER BY city_id, logdate; + +CREATE TABLE new_measurement (LIKE measurement); +INSERT INTO new_measurement VALUES (1, '2006-03-01', 20, 10); +INSERT INTO new_measurement VALUES (1, '2006-02-16', 50, 10); +INSERT INTO new_measurement VALUES (2, '2006-02-10', 20, 20); +INSERT INTO new_measurement VALUES (1, '2006-03-27', NULL, NULL); +INSERT INTO new_measurement VALUES (1, '2007-01-17', NULL, NULL); +INSERT INTO new_measurement VALUES (1, '2007-01-15', 5, NULL); +INSERT INTO new_measurement VALUES (1, '2007-01-16', 10, 10); + +MERGE into measurement m + USING new_measurement nm ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN MATCHED AND nm.peaktemp IS NULL THEN DELETE +WHEN MATCHED THEN UPDATE + SET peaktemp = greatest(m.peaktemp, nm.peaktemp), + unitsales = m.unitsales + coalesce(nm.unitsales, 0) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id, logdate, peaktemp, unitsales); + +SELECT tableoid::regclass, * FROM measurement ORDER BY city_id, logdate; +DROP TABLE measurement, new_measurement CASCADE; +DROP FUNCTION measurement_insert_trigger(); + +-- prepare + +RESET SESSION AUTHORIZATION; +DROP TABLE target, target2; +DROP TABLE source, source2; +DROP FUNCTION merge_trigfunc(); +DROP USER merge_privs; +DROP USER merge_no_privs; diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql index c8c545b64c..3228572880 100644 --- a/src/test/regress/sql/privileges.sql +++ b/src/test/regress/sql/privileges.sql @@ -459,6 +459,114 @@ UPDATE atest5 SET one = 1; -- fail SELECT atest6 FROM atest6; -- ok COPY atest6 TO stdout; -- ok +-- test column privileges with MERGE +SET SESSION AUTHORIZATION regress_priv_user1; +CREATE TABLE mtarget (a int, b text); +CREATE TABLE msource (a int, b text); +INSERT INTO mtarget VALUES (1, 'init1'), (2, 'init2'); +INSERT INTO msource VALUES (1, 'source1'), (2, 'source2'), (3, 'source3'); + +GRANT SELECT (a) ON msource TO regress_priv_user4; +GRANT SELECT (a) ON mtarget TO regress_priv_user4; +GRANT INSERT (a,b) ON mtarget TO regress_priv_user4; +GRANT UPDATE (b) ON mtarget TO regress_priv_user4; + +SET SESSION AUTHORIZATION regress_priv_user4; + +-- +-- test source privileges +-- + +-- fail (no SELECT priv on s.b) +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = s.b +WHEN NOT MATCHED THEN + INSERT VALUES (a, NULL); + +-- fail (s.b used in the INSERTed values) +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = 'x' +WHEN NOT MATCHED THEN + INSERT VALUES (a, b); + +-- fail (s.b used in the WHEN quals) +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED AND s.b = 'x' THEN + UPDATE SET b = 'x' +WHEN NOT MATCHED THEN + INSERT VALUES (a, NULL); + +-- this should be ok since only s.a is accessed +BEGIN; +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = 'ok' +WHEN NOT MATCHED THEN + INSERT VALUES (a, NULL); +ROLLBACK; + +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT (b) ON msource TO regress_priv_user4; +SET SESSION AUTHORIZATION regress_priv_user4; + +-- should now be ok +BEGIN; +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = s.b +WHEN NOT MATCHED THEN + INSERT VALUES (a, b); +ROLLBACK; + +-- +-- test target privileges +-- + +-- fail (no SELECT priv on t.b) +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = t.b +WHEN NOT MATCHED THEN + INSERT VALUES (a, NULL); + +-- fail (no UPDATE on t.a) +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = s.b, a = t.a + 1 +WHEN NOT MATCHED THEN + INSERT VALUES (a, b); + +-- fail (no SELECT on t.b) +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED AND t.b IS NOT NULL THEN + UPDATE SET b = s.b +WHEN NOT MATCHED THEN + INSERT VALUES (a, b); + +-- ok +BEGIN; +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED THEN + UPDATE SET b = s.b; +ROLLBACK; + +-- fail (no DELETE) +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED AND t.b IS NOT NULL THEN + DELETE; + +-- grant delete privileges +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT DELETE ON mtarget TO regress_priv_user4; +-- should be ok now +BEGIN; +MERGE INTO mtarget t USING msource s ON t.a = s.a +WHEN MATCHED AND t.b IS NOT NULL THEN + DELETE; +ROLLBACK; + -- check error reporting with column privs SET SESSION AUTHORIZATION regress_priv_user1; CREATE TABLE t1 (c1 int, c2 int, c3 int check (c3 < 5), primary key (c1, c2)); diff --git a/src/test/regress/sql/rowsecurity.sql b/src/test/regress/sql/rowsecurity.sql index b310acdd27..febf3cc4cf 100644 --- a/src/test/regress/sql/rowsecurity.sql +++ b/src/test/regress/sql/rowsecurity.sql @@ -810,6 +810,162 @@ INSERT INTO document VALUES (4, (SELECT cid from category WHERE cname = 'novel') INSERT INTO document VALUES (1, (SELECT cid from category WHERE cname = 'novel'), 1, 'regress_rls_bob', 'my first novel') ON CONFLICT (did) DO UPDATE SET dauthor = 'regress_rls_carol'; +-- +-- MERGE +-- +RESET SESSION AUTHORIZATION; +DROP POLICY p3_with_all ON document; + +ALTER TABLE document ADD COLUMN dnotes text DEFAULT ''; +-- all documents are readable +CREATE POLICY p1 ON document FOR SELECT USING (true); +-- one may insert documents only authored by them +CREATE POLICY p2 ON document FOR INSERT WITH CHECK (dauthor = current_user); +-- one may only update documents in 'novel' category +CREATE POLICY p3 ON document FOR UPDATE + USING (cid = (SELECT cid from category WHERE cname = 'novel')) + WITH CHECK (dauthor = current_user); +-- one may only delete documents in 'manga' category +CREATE POLICY p4 ON document FOR DELETE + USING (cid = (SELECT cid from category WHERE cname = 'manga')); + +SELECT * FROM document; + +SET SESSION AUTHORIZATION regress_rls_bob; + +-- Fails, since update violates WITH CHECK qual on dauthor +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge1 ', dauthor = 'regress_rls_alice'; + +-- Should be OK since USING and WITH CHECK quals pass +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge2 '; + +-- Even when dauthor is updated explicitly, but to the existing value +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge3 ', dauthor = 'regress_rls_bob'; + +-- There is a MATCH for did = 3, but UPDATE's USING qual does not allow +-- updating an item in category 'science fiction' +MERGE INTO document d +USING (SELECT 3 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge '; + +-- The same thing with DELETE action, but fails again because no permissions +-- to delete items in 'science fiction' category that did 3 belongs to. +MERGE INTO document d +USING (SELECT 3 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + DELETE; + +-- Document with did 4 belongs to 'manga' category which is allowed for +-- deletion. But this fails because the UPDATE action is matched first and +-- UPDATE policy does not allow updation in the category. +MERGE INTO document d +USING (SELECT 4 as sdid) s +ON did = s.sdid +WHEN MATCHED AND dnotes = '' THEN + UPDATE SET dnotes = dnotes || ' notes added by merge ' +WHEN MATCHED THEN + DELETE; + +-- UPDATE action is not matched this time because of the WHEN qual. +-- DELETE still fails because role regress_rls_bob does not have SELECT +-- privileges on 'manga' category row in the category table. +MERGE INTO document d +USING (SELECT 4 as sdid) s +ON did = s.sdid +WHEN MATCHED AND dnotes <> '' THEN + UPDATE SET dnotes = dnotes || ' notes added by merge ' +WHEN MATCHED THEN + DELETE; + +SELECT * FROM document WHERE did = 4; + +-- Switch to regress_rls_carol role and try the DELETE again. It should succeed +-- this time +RESET SESSION AUTHORIZATION; +SET SESSION AUTHORIZATION regress_rls_carol; + +MERGE INTO document d +USING (SELECT 4 as sdid) s +ON did = s.sdid +WHEN MATCHED AND dnotes <> '' THEN + UPDATE SET dnotes = dnotes || ' notes added by merge ' +WHEN MATCHED THEN + DELETE; + +-- Switch back to regress_rls_bob role +RESET SESSION AUTHORIZATION; +SET SESSION AUTHORIZATION regress_rls_bob; + +-- Try INSERT action. This fails because we are trying to insert +-- dauthor = regress_rls_dave and INSERT's WITH CHECK does not allow +-- that +MERGE INTO document d +USING (SELECT 12 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + DELETE +WHEN NOT MATCHED THEN + INSERT VALUES (12, 11, 1, 'regress_rls_dave', 'another novel'); + +-- This should be fine +MERGE INTO document d +USING (SELECT 12 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + DELETE +WHEN NOT MATCHED THEN + INSERT VALUES (12, 11, 1, 'regress_rls_bob', 'another novel'); + +-- ok +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge4 ' +WHEN NOT MATCHED THEN + INSERT VALUES (12, 11, 1, 'regress_rls_bob', 'another novel'); + +-- drop and create a new SELECT policy which prevents us from reading +-- any document except with category 'magna' +RESET SESSION AUTHORIZATION; +DROP POLICY p1 ON document; +CREATE POLICY p1 ON document FOR SELECT + USING (cid = (SELECT cid from category WHERE cname = 'manga')); + +SET SESSION AUTHORIZATION regress_rls_bob; + +-- MERGE can no longer see the matching row and hence attempts the +-- NOT MATCHED action, which results in unique key violation +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge5 ' +WHEN NOT MATCHED THEN + INSERT VALUES (12, 11, 1, 'regress_rls_bob', 'another novel'); + +RESET SESSION AUTHORIZATION; +-- drop the restrictive SELECT policy so that we can look at the +-- final state of the table +DROP POLICY p1 ON document; +-- Just check everything went per plan +SELECT * FROM document; + -- -- ROLE/GROUP -- diff --git a/src/test/regress/sql/rules.sql b/src/test/regress/sql/rules.sql index aae2ba32e8..aee6abed86 100644 --- a/src/test/regress/sql/rules.sql +++ b/src/test/regress/sql/rules.sql @@ -1232,6 +1232,39 @@ CREATE RULE rules_parted_table_insert AS ON INSERT to rules_parted_table ALTER RULE rules_parted_table_insert ON rules_parted_table RENAME TO rules_parted_table_insert_redirect; DROP TABLE rules_parted_table; +-- +-- test MERGE +-- +CREATE TABLE rule_merge1 (a int, b text); +CREATE TABLE rule_merge2 (a int, b text); +CREATE RULE rule1 AS ON INSERT TO rule_merge1 + DO INSTEAD INSERT INTO rule_merge2 VALUES (NEW.*); +CREATE RULE rule2 AS ON UPDATE TO rule_merge1 + DO INSTEAD UPDATE rule_merge2 SET a = NEW.a, b = NEW.b + WHERE a = OLD.a; +CREATE RULE rule3 AS ON DELETE TO rule_merge1 + DO INSTEAD DELETE FROM rule_merge2 WHERE a = OLD.a; + +-- MERGE not supported for table with rules +MERGE INTO rule_merge1 t USING (SELECT 1 AS a) s + ON t.a = s.a + WHEN MATCHED AND t.a < 2 THEN + UPDATE SET b = b || ' updated by merge' + WHEN MATCHED AND t.a > 2 THEN + DELETE + WHEN NOT MATCHED THEN + INSERT VALUES (s.a, ''); + +-- should be ok with the other table though +MERGE INTO rule_merge2 t USING (SELECT 1 AS a) s + ON t.a = s.a + WHEN MATCHED AND t.a < 2 THEN + UPDATE SET b = b || ' updated by merge' + WHEN MATCHED AND t.a > 2 THEN + DELETE + WHEN NOT MATCHED THEN + INSERT VALUES (s.a, ''); + -- -- Test enabling/disabling -- diff --git a/src/test/regress/sql/triggers.sql b/src/test/regress/sql/triggers.sql index 4cc096265d..83cd00f54f 100644 --- a/src/test/regress/sql/triggers.sql +++ b/src/test/regress/sql/triggers.sql @@ -2439,6 +2439,53 @@ delete from self_ref where a = 1; drop table self_ref; +-- +-- test transition tables with MERGE +-- +create table merge_target_table (a int primary key, b text); +create trigger merge_target_table_insert_trig + after insert on merge_target_table referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger merge_target_table_update_trig + after update on merge_target_table referencing old table as old_table new table as new_table + for each statement execute procedure dump_update(); +create trigger merge_target_table_delete_trig + after delete on merge_target_table referencing old table as old_table + for each statement execute procedure dump_delete(); + +create table merge_source_table (a int, b text); +insert into merge_source_table + values (1, 'initial1'), (2, 'initial2'), + (3, 'initial3'), (4, 'initial4'); + +merge into merge_target_table t +using merge_source_table s +on t.a = s.a +when not matched then + insert values (a, b); + +merge into merge_target_table t +using merge_source_table s +on t.a = s.a +when matched and s.a <= 2 then + update set b = t.b || ' updated by merge' +when matched and s.a > 2 then + delete +when not matched then + insert values (a, b); + +merge into merge_target_table t +using merge_source_table s +on t.a = s.a +when matched and s.a <= 2 then + update set b = t.b || ' updated again by merge' +when matched and s.a > 2 then + delete +when not matched then + insert values (a, b); + +drop table merge_source_table, merge_target_table; + -- cleanup drop function dump_insert(); drop function dump_update(); diff --git a/src/test/regress/sql/with.sql b/src/test/regress/sql/with.sql index e482177557..f1ea3ae22e 100644 --- a/src/test/regress/sql/with.sql +++ b/src/test/regress/sql/with.sql @@ -1270,6 +1270,62 @@ RETURNING k, v; DROP TABLE withz; +-- WITH referenced by MERGE statement +CREATE TABLE m AS SELECT i AS k, (i || ' v')::text v FROM generate_series(1, 16, 3) i; +ALTER TABLE m ADD UNIQUE (k); + +WITH RECURSIVE cte_basic AS (SELECT 1 a, 'cte_basic val' b) +MERGE INTO m USING (select 0 k, 'merge source SubPlan' v) o ON m.k=o.k +WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_basic WHERE cte_basic.a = m.k LIMIT 1) +WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v); + +-- Basic: +WITH cte_basic AS MATERIALIZED (SELECT 1 a, 'cte_basic val' b) +MERGE INTO m USING (select 0 k, 'merge source SubPlan' v offset 0) o ON m.k=o.k +WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_basic WHERE cte_basic.a = m.k LIMIT 1) +WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v); +-- Examine +SELECT * FROM m where k = 0; + +-- See EXPLAIN output for same query: +EXPLAIN (VERBOSE, COSTS OFF) +WITH cte_basic AS MATERIALIZED (SELECT 1 a, 'cte_basic val' b) +MERGE INTO m USING (select 0 k, 'merge source SubPlan' v offset 0) o ON m.k=o.k +WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_basic WHERE cte_basic.a = m.k LIMIT 1) +WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v); + +-- InitPlan +WITH cte_init AS MATERIALIZED (SELECT 1 a, 'cte_init val' b) +MERGE INTO m USING (select 1 k, 'merge source InitPlan' v offset 0) o ON m.k=o.k +WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_init WHERE a = 1 LIMIT 1) +WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v); +-- Examine +SELECT * FROM m where k = 1; + +-- See EXPLAIN output for same query: +EXPLAIN (VERBOSE, COSTS OFF) +WITH cte_init AS MATERIALIZED (SELECT 1 a, 'cte_init val' b) +MERGE INTO m USING (select 1 k, 'merge source InitPlan' v offset 0) o ON m.k=o.k +WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_init WHERE a = 1 LIMIT 1) +WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v); + +-- MERGE source comes from CTE: +WITH merge_source_cte AS MATERIALIZED (SELECT 15 a, 'merge_source_cte val' b) +MERGE INTO m USING (select * from merge_source_cte) o ON m.k=o.a +WHEN MATCHED THEN UPDATE SET v = (SELECT b || merge_source_cte.*::text || ' merge update' FROM merge_source_cte WHERE a = 15) +WHEN NOT MATCHED THEN INSERT VALUES(o.a, o.b || (SELECT merge_source_cte.*::text || ' merge insert' FROM merge_source_cte)); +-- Examine +SELECT * FROM m where k = 15; + +-- See EXPLAIN output for same query: +EXPLAIN (VERBOSE, COSTS OFF) +WITH merge_source_cte AS MATERIALIZED (SELECT 15 a, 'merge_source_cte val' b) +MERGE INTO m USING (select * from merge_source_cte) o ON m.k=o.a +WHEN MATCHED THEN UPDATE SET v = (SELECT b || merge_source_cte.*::text || ' merge update' FROM merge_source_cte WHERE a = 15) +WHEN NOT MATCHED THEN INSERT VALUES(o.a, o.b || (SELECT merge_source_cte.*::text || ' merge insert' FROM merge_source_cte)); + +DROP TABLE m; + -- check that run to completion happens in proper ordering TRUNCATE TABLE y; diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 85c808af90..182b233b4c 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1441,6 +1441,8 @@ MemoryContextCounters MemoryContextData MemoryContextMethods MemoryStatsPrintFunc +MergeAction +MergeActionState MergeAppend MergeAppendPath MergeAppendState @@ -1449,6 +1451,8 @@ MergeJoinClause MergeJoinState MergePath MergeScanSelCache +MergeStmt +MergeWhenClause MetaCommand MinMaxAggInfo MinMaxAggPath From 386ca0abf4107721a363f1c152cd026041b609ea Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Mon, 28 Mar 2022 17:10:36 +0200 Subject: [PATCH 283/772] Fix role names in merge.sql regress file These names need to be prefixed with "regress_". Per buildfarm. --- src/test/regress/expected/merge.out | 28 ++++++++++++++-------------- src/test/regress/sql/merge.sql | 28 ++++++++++++++-------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/test/regress/expected/merge.out b/src/test/regress/expected/merge.out index da8796986f..5954f10b8f 100644 --- a/src/test/regress/expected/merge.out +++ b/src/test/regress/expected/merge.out @@ -5,8 +5,8 @@ --set debug_print_rewritten = true; --set debug_print_parse = true; --set debug_print_pretty = true; -CREATE USER merge_privs; -CREATE USER merge_no_privs; +CREATE USER regress_merge_privs; +CREATE USER regress_merge_no_privs; DROP TABLE IF EXISTS target; NOTICE: table "target" does not exist, skipping DROP TABLE IF EXISTS source; @@ -24,14 +24,14 @@ SELECT t.ctid is not null as matched, t.*, s.* FROM source s FULL OUTER JOIN tar t | 3 | 30 | | (3 rows) -ALTER TABLE target OWNER TO merge_privs; -ALTER TABLE source OWNER TO merge_privs; +ALTER TABLE target OWNER TO regress_merge_privs; +ALTER TABLE source OWNER TO regress_merge_privs; CREATE TABLE target2 (tid integer, balance integer); CREATE TABLE source2 (sid integer, delta integer); -ALTER TABLE target2 OWNER TO merge_no_privs; -ALTER TABLE source2 OWNER TO merge_no_privs; -GRANT INSERT ON target TO merge_no_privs; -SET SESSION AUTHORIZATION merge_privs; +ALTER TABLE target2 OWNER TO regress_merge_no_privs; +ALTER TABLE source2 OWNER TO regress_merge_no_privs; +GRANT INSERT ON target TO regress_merge_no_privs; +SET SESSION AUTHORIZATION regress_merge_privs; EXPLAIN (COSTS OFF) MERGE INTO target t USING source AS s @@ -151,16 +151,16 @@ ON target.tid = source2.sid WHEN MATCHED THEN UPDATE SET balance = 0; ERROR: permission denied for table source2 -GRANT INSERT ON target TO merge_no_privs; -SET SESSION AUTHORIZATION merge_no_privs; +GRANT INSERT ON target TO regress_merge_no_privs; +SET SESSION AUTHORIZATION regress_merge_no_privs; MERGE INTO target USING source2 ON target.tid = source2.sid WHEN MATCHED THEN UPDATE SET balance = 0; ERROR: permission denied for table target -GRANT UPDATE ON target2 TO merge_privs; -SET SESSION AUTHORIZATION merge_privs; +GRANT UPDATE ON target2 TO regress_merge_privs; +SET SESSION AUTHORIZATION regress_merge_privs; MERGE INTO target2 USING source ON target2.tid = source.sid @@ -1930,5 +1930,5 @@ RESET SESSION AUTHORIZATION; DROP TABLE target, target2; DROP TABLE source, source2; DROP FUNCTION merge_trigfunc(); -DROP USER merge_privs; -DROP USER merge_no_privs; +DROP USER regress_merge_privs; +DROP USER regress_merge_no_privs; diff --git a/src/test/regress/sql/merge.sql b/src/test/regress/sql/merge.sql index 34282e0794..6d05a2f39c 100644 --- a/src/test/regress/sql/merge.sql +++ b/src/test/regress/sql/merge.sql @@ -8,8 +8,8 @@ --set debug_print_pretty = true; -CREATE USER merge_privs; -CREATE USER merge_no_privs; +CREATE USER regress_merge_privs; +CREATE USER regress_merge_no_privs; DROP TABLE IF EXISTS target; DROP TABLE IF EXISTS source; CREATE TABLE target (tid integer, balance integer); @@ -19,18 +19,18 @@ INSERT INTO target VALUES (2, 20); INSERT INTO target VALUES (3, 30); SELECT t.ctid is not null as matched, t.*, s.* FROM source s FULL OUTER JOIN target t ON s.sid = t.tid ORDER BY t.tid, s.sid; -ALTER TABLE target OWNER TO merge_privs; -ALTER TABLE source OWNER TO merge_privs; +ALTER TABLE target OWNER TO regress_merge_privs; +ALTER TABLE source OWNER TO regress_merge_privs; CREATE TABLE target2 (tid integer, balance integer); CREATE TABLE source2 (sid integer, delta integer); -ALTER TABLE target2 OWNER TO merge_no_privs; -ALTER TABLE source2 OWNER TO merge_no_privs; +ALTER TABLE target2 OWNER TO regress_merge_no_privs; +ALTER TABLE source2 OWNER TO regress_merge_no_privs; -GRANT INSERT ON target TO merge_no_privs; +GRANT INSERT ON target TO regress_merge_no_privs; -SET SESSION AUTHORIZATION merge_privs; +SET SESSION AUTHORIZATION regress_merge_privs; EXPLAIN (COSTS OFF) MERGE INTO target t @@ -116,8 +116,8 @@ ON target.tid = source2.sid WHEN MATCHED THEN UPDATE SET balance = 0; -GRANT INSERT ON target TO merge_no_privs; -SET SESSION AUTHORIZATION merge_no_privs; +GRANT INSERT ON target TO regress_merge_no_privs; +SET SESSION AUTHORIZATION regress_merge_no_privs; MERGE INTO target USING source2 @@ -125,8 +125,8 @@ ON target.tid = source2.sid WHEN MATCHED THEN UPDATE SET balance = 0; -GRANT UPDATE ON target2 TO merge_privs; -SET SESSION AUTHORIZATION merge_privs; +GRANT UPDATE ON target2 TO regress_merge_privs; +SET SESSION AUTHORIZATION regress_merge_privs; MERGE INTO target2 USING source @@ -1269,5 +1269,5 @@ RESET SESSION AUTHORIZATION; DROP TABLE target, target2; DROP TABLE source, source2; DROP FUNCTION merge_trigfunc(); -DROP USER merge_privs; -DROP USER merge_no_privs; +DROP USER regress_merge_privs; +DROP USER regress_merge_no_privs; From d22646922d66012705e0e2948cfb5b4a07092a29 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 28 Mar 2022 11:19:29 -0400 Subject: [PATCH 284/772] Add public ruleutils.c entry point to deparse a Query. This has no in-core callers but will be wanted by extensions. It's just a thin wrapper around get_query_def, so it adds little code. Also, fix get_from_clause_item() to force insertion of an alias for a SUBQUERY RTE item. This is irrelevant to existing uses because RTE_SUBQUERY items made by the parser always have aliases already. However, if one tried to use pg_get_querydef() to inspect a post-rewrite Query, it could be an issue. In any case, get_from_clause_item already contained logic to force alias insertion for VALUES items, so the lack of the same for SUBQUERY is a pretty clear oversight. In passing, replace duplicated code for selection of pretty-print options with a common macro. Julien Rouhaud, reviewed by Pavel Stehule, Gilles Darold, and myself Discussion: https://postgr.es/m/20210627041138.zklczwmu3ms4ufnk@nol --- src/backend/utils/adt/ruleutils.c | 54 ++++++++++++++++++++++++------- src/include/utils/ruleutils.h | 1 + 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 82dc849a30..38da269519 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -90,6 +90,11 @@ #define PRETTYFLAG_INDENT 0x0002 #define PRETTYFLAG_SCHEMA 0x0004 +/* Standard conversion of a "bool pretty" option to detailed flags */ +#define GET_PRETTY_FLAGS(pretty) \ + ((pretty) ? (PRETTYFLAG_PAREN | PRETTYFLAG_INDENT | PRETTYFLAG_SCHEMA) \ + : PRETTYFLAG_INDENT) + /* Default line length for pretty-print wrapping: 0 means wrap always */ #define WRAP_COLUMN_DEFAULT 0 @@ -532,7 +537,7 @@ pg_get_ruledef_ext(PG_FUNCTION_ARGS) int prettyFlags; char *res; - prettyFlags = pretty ? (PRETTYFLAG_PAREN | PRETTYFLAG_INDENT | PRETTYFLAG_SCHEMA) : PRETTYFLAG_INDENT; + prettyFlags = GET_PRETTY_FLAGS(pretty); res = pg_get_ruledef_worker(ruleoid, prettyFlags); @@ -653,7 +658,7 @@ pg_get_viewdef_ext(PG_FUNCTION_ARGS) int prettyFlags; char *res; - prettyFlags = pretty ? (PRETTYFLAG_PAREN | PRETTYFLAG_INDENT | PRETTYFLAG_SCHEMA) : PRETTYFLAG_INDENT; + prettyFlags = GET_PRETTY_FLAGS(pretty); res = pg_get_viewdef_worker(viewoid, prettyFlags, WRAP_COLUMN_DEFAULT); @@ -673,7 +678,7 @@ pg_get_viewdef_wrap(PG_FUNCTION_ARGS) char *res; /* calling this implies we want pretty printing */ - prettyFlags = PRETTYFLAG_PAREN | PRETTYFLAG_INDENT | PRETTYFLAG_SCHEMA; + prettyFlags = GET_PRETTY_FLAGS(true); res = pg_get_viewdef_worker(viewoid, prettyFlags, wrap); @@ -719,7 +724,7 @@ pg_get_viewdef_name_ext(PG_FUNCTION_ARGS) Oid viewoid; char *res; - prettyFlags = pretty ? (PRETTYFLAG_PAREN | PRETTYFLAG_INDENT | PRETTYFLAG_SCHEMA) : PRETTYFLAG_INDENT; + prettyFlags = GET_PRETTY_FLAGS(pretty); /* Look up view name. Can't lock it - we might not have privileges. */ viewrel = makeRangeVarFromNameList(textToQualifiedNameList(viewname)); @@ -1062,7 +1067,7 @@ pg_get_triggerdef_worker(Oid trigid, bool pretty) context.windowClause = NIL; context.windowTList = NIL; context.varprefix = true; - context.prettyFlags = pretty ? (PRETTYFLAG_PAREN | PRETTYFLAG_INDENT | PRETTYFLAG_SCHEMA) : PRETTYFLAG_INDENT; + context.prettyFlags = GET_PRETTY_FLAGS(pretty); context.wrapColumn = WRAP_COLUMN_DEFAULT; context.indentLevel = PRETTYINDENT_STD; context.special_exprkind = EXPR_KIND_NONE; @@ -1152,7 +1157,7 @@ pg_get_indexdef_ext(PG_FUNCTION_ARGS) int prettyFlags; char *res; - prettyFlags = pretty ? (PRETTYFLAG_PAREN | PRETTYFLAG_INDENT | PRETTYFLAG_SCHEMA) : PRETTYFLAG_INDENT; + prettyFlags = GET_PRETTY_FLAGS(pretty); res = pg_get_indexdef_worker(indexrelid, colno, NULL, colno != 0, false, @@ -1185,7 +1190,7 @@ pg_get_indexdef_columns(Oid indexrelid, bool pretty) { int prettyFlags; - prettyFlags = pretty ? (PRETTYFLAG_PAREN | PRETTYFLAG_INDENT | PRETTYFLAG_SCHEMA) : PRETTYFLAG_INDENT; + prettyFlags = GET_PRETTY_FLAGS(pretty); return pg_get_indexdef_worker(indexrelid, 0, NULL, true, true, @@ -1516,6 +1521,30 @@ pg_get_indexdef_worker(Oid indexrelid, int colno, return buf.data; } +/* ---------- + * pg_get_querydef + * + * Public entry point to deparse one query parsetree. + * The pretty flags are determined by GET_PRETTY_FLAGS(pretty). + * + * The result is a palloc'd C string. + * ---------- + */ +char * +pg_get_querydef(Query *query, bool pretty) +{ + StringInfoData buf; + int prettyFlags; + + prettyFlags = GET_PRETTY_FLAGS(pretty); + + initStringInfo(&buf); + + get_query_def(query, &buf, NIL, NULL, prettyFlags, WRAP_COLUMN_DEFAULT, 0); + + return buf.data; +} + /* * pg_get_statisticsobjdef * Get the definition of an extended statistics object @@ -1848,7 +1877,7 @@ pg_get_partkeydef_columns(Oid relid, bool pretty) { int prettyFlags; - prettyFlags = pretty ? (PRETTYFLAG_PAREN | PRETTYFLAG_INDENT | PRETTYFLAG_SCHEMA) : PRETTYFLAG_INDENT; + prettyFlags = GET_PRETTY_FLAGS(pretty); return pg_get_partkeydef_worker(relid, prettyFlags, true, false); } @@ -2095,7 +2124,7 @@ pg_get_constraintdef_ext(PG_FUNCTION_ARGS) int prettyFlags; char *res; - prettyFlags = pretty ? (PRETTYFLAG_PAREN | PRETTYFLAG_INDENT | PRETTYFLAG_SCHEMA) : PRETTYFLAG_INDENT; + prettyFlags = GET_PRETTY_FLAGS(pretty); res = pg_get_constraintdef_worker(constraintId, false, prettyFlags, true); @@ -2625,7 +2654,7 @@ pg_get_expr_ext(PG_FUNCTION_ARGS) int prettyFlags; char *relname; - prettyFlags = pretty ? (PRETTYFLAG_PAREN | PRETTYFLAG_INDENT | PRETTYFLAG_SCHEMA) : PRETTYFLAG_INDENT; + prettyFlags = GET_PRETTY_FLAGS(pretty); if (OidIsValid(relid)) { @@ -11210,9 +11239,10 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context) */ printalias = true; } - else if (rte->rtekind == RTE_VALUES) + else if (rte->rtekind == RTE_SUBQUERY || + rte->rtekind == RTE_VALUES) { - /* Alias is syntactically required for VALUES */ + /* Alias is syntactically required for SUBQUERY and VALUES */ printalias = true; } else if (rte->rtekind == RTE_CTE) diff --git a/src/include/utils/ruleutils.h b/src/include/utils/ruleutils.h index e8090c96d7..7d489718a3 100644 --- a/src/include/utils/ruleutils.h +++ b/src/include/utils/ruleutils.h @@ -23,6 +23,7 @@ struct PlannedStmt; extern char *pg_get_indexdef_string(Oid indexrelid); extern char *pg_get_indexdef_columns(Oid indexrelid, bool pretty); +extern char *pg_get_querydef(Query *query, bool pretty); extern char *pg_get_partkeydef_columns(Oid relid, bool pretty); extern char *pg_get_partconstrdef_string(Oid partitionId, char *aliasname); From 61762426e6edbe87100dd5a4f107e8c06a11ec02 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 28 Mar 2022 12:19:05 -0400 Subject: [PATCH 285/772] Fix a few goofs in new backup compression code. When we try to set the zstd compression level either on the client or on the server, check for errors. For any algorithm, on the client side, don't try to set the compression level unless the user specified one. This was visibly broken for zstd, which managed to set -1 rather than 0 in this case, but tidy up the code for the other methods, too. On the client side, if we fail to create a ZSTD_CCtx, exit after reporting the error. Otherwise we'll dereference a null pointer. Patch by me, reviewed by Dipesh Pandit. Discussion: http://postgr.es/m/CA+TgmoZK3zLQUCGi1h4XZw4jHiAWtcACc+GsdJR1_Mc19jUjXA@mail.gmail.com --- src/backend/replication/basebackup_zstd.c | 8 ++++++-- src/bin/pg_basebackup/bbstreamer_gzip.c | 3 ++- src/bin/pg_basebackup/bbstreamer_lz4.c | 3 ++- src/bin/pg_basebackup/bbstreamer_zstd.c | 19 +++++++++++++++++-- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/backend/replication/basebackup_zstd.c b/src/backend/replication/basebackup_zstd.c index bb5b668c2a..5496eaa72b 100644 --- a/src/backend/replication/basebackup_zstd.c +++ b/src/backend/replication/basebackup_zstd.c @@ -98,13 +98,17 @@ bbsink_zstd_begin_backup(bbsink *sink) { bbsink_zstd *mysink = (bbsink_zstd *) sink; size_t output_buffer_bound; + size_t ret; mysink->cctx = ZSTD_createCCtx(); if (!mysink->cctx) elog(ERROR, "could not create zstd compression context"); - ZSTD_CCtx_setParameter(mysink->cctx, ZSTD_c_compressionLevel, - mysink->compresslevel); + ret = ZSTD_CCtx_setParameter(mysink->cctx, ZSTD_c_compressionLevel, + mysink->compresslevel); + if (ZSTD_isError(ret)) + elog(ERROR, "could not set zstd compression level to %d: %s", + mysink->compresslevel, ZSTD_getErrorName(ret)); /* * We need our own buffer, because we're going to pass different data to diff --git a/src/bin/pg_basebackup/bbstreamer_gzip.c b/src/bin/pg_basebackup/bbstreamer_gzip.c index 1979e95639..760619fcd7 100644 --- a/src/bin/pg_basebackup/bbstreamer_gzip.c +++ b/src/bin/pg_basebackup/bbstreamer_gzip.c @@ -116,7 +116,8 @@ bbstreamer_gzip_writer_new(char *pathname, FILE *file, } } - if (gzsetparams(streamer->gzfile, compress->level, + if ((compress->options & BACKUP_COMPRESSION_OPTION_LEVEL) != 0 && + gzsetparams(streamer->gzfile, compress->level, Z_DEFAULT_STRATEGY) != Z_OK) { pg_log_error("could not set compression level %d: %s", diff --git a/src/bin/pg_basebackup/bbstreamer_lz4.c b/src/bin/pg_basebackup/bbstreamer_lz4.c index a6ec317e2b..67f841d96a 100644 --- a/src/bin/pg_basebackup/bbstreamer_lz4.c +++ b/src/bin/pg_basebackup/bbstreamer_lz4.c @@ -89,7 +89,8 @@ bbstreamer_lz4_compressor_new(bbstreamer *next, bc_specification *compress) prefs = &streamer->prefs; memset(prefs, 0, sizeof(LZ4F_preferences_t)); prefs->frameInfo.blockSizeID = LZ4F_max256KB; - prefs->compressionLevel = compress->level; + if ((compress->options & BACKUP_COMPRESSION_OPTION_LEVEL) != 0) + prefs->compressionLevel = compress->level; /* * Find out the compression bound, it specifies the minimum destination diff --git a/src/bin/pg_basebackup/bbstreamer_zstd.c b/src/bin/pg_basebackup/bbstreamer_zstd.c index caa5edcaf1..7946b6350b 100644 --- a/src/bin/pg_basebackup/bbstreamer_zstd.c +++ b/src/bin/pg_basebackup/bbstreamer_zstd.c @@ -67,6 +67,8 @@ bbstreamer_zstd_compressor_new(bbstreamer *next, bc_specification *compress) { #ifdef USE_ZSTD bbstreamer_zstd_frame *streamer; + int compresslevel; + size_t ret; Assert(next != NULL); @@ -81,11 +83,24 @@ bbstreamer_zstd_compressor_new(bbstreamer *next, bc_specification *compress) streamer->cctx = ZSTD_createCCtx(); if (!streamer->cctx) + { pg_log_error("could not create zstd compression context"); + exit(1); + } /* Initialize stream compression preferences */ - ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_compressionLevel, - compress->level); + if ((compress->options & BACKUP_COMPRESSION_OPTION_LEVEL) == 0) + compresslevel = 0; + else + compresslevel = compress->level; + ret = ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_compressionLevel, + compresslevel); + if (ZSTD_isError(ret)) + { + pg_log_error("could not set zstd compression level to %d: %s", + compresslevel, ZSTD_getErrorName(ret)); + exit(1); + } /* Initialize the ZSTD output buffer. */ streamer->zstd_outBuf.dst = streamer->base.bbs_buffer.data; From 79de9842ab03259325ee4055fb0a7ebd2e4372ff Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 28 Mar 2022 13:38:13 -0400 Subject: [PATCH 286/772] Remove the ability of a role to administer itself. Commit f9fd1764615ed5d85fab703b0ffb0c323fe7dfd5 effectively gave every role ADMIN OPTION on itself. However, this appears to be something that happened accidentally as a result of refactoring work rather than an intentional decision. Almost a decade later, it was discovered that this was a security vulnerability. As a result, commit fea164a72a7bfd50d77ba5fb418d357f8f2bb7d0 restricted this implicit ADMIN OPTION privilege to be exercisable only when the role being administered is the same as the session user and when no security-restricted operation is in progress. That commit also documented the existence of this implicit privilege for what seems to be the first time. The effect of the privilege is to allow a login role to grant the privileges of that role, and optionally ADMIN OPTION on it, to some other role. That's an unusual thing to do, because generally membership is granted in roles used as groups, rather than roles used as users. Therefore, it does not seem likely that removing the privilege will break things for many PostgreSQL users. However, it will make it easier to reason about the permissions system. This is the only case where a user who has not been given any special permission (superuser, or ADMIN OPTION on some role) can modify role membership, so removing it makes things more consistent. For example, if a superuser sets up role A and B and grants A to B but no other privileges to anyone, she can now be sure that no one else will be able to revoke that grant. Without this change, that would have been true only if A was a non-login role. Patch by me. Reviewed by Tom Lane and Stephen Frost. Discussion: http://postgr.es/m/CA+Tgmoawdt03kbA+dNyBcNWJpRxu0f4X=69Y3+DkXXZqmwMDLg@mail.gmail.com --- doc/src/sgml/ref/grant.sgml | 9 +++--- src/backend/commands/user.c | 5 ---- src/backend/utils/adt/acl.c | 38 ++---------------------- src/test/regress/expected/privileges.out | 8 +---- src/test/regress/sql/privileges.sql | 6 +--- 5 files changed, 8 insertions(+), 58 deletions(-) diff --git a/doc/src/sgml/ref/grant.sgml b/doc/src/sgml/ref/grant.sgml index a897712de2..8c4edd9b0a 100644 --- a/doc/src/sgml/ref/grant.sgml +++ b/doc/src/sgml/ref/grant.sgml @@ -251,11 +251,10 @@ GRANT role_name [, ...] TO WITH ADMIN - OPTION on itself, but it may grant or revoke membership in - itself from a database session where the session user matches the - role. Database superusers can grant or revoke membership in any role - to anyone. Roles having CREATEROLE privilege can grant - or revoke membership in any role that is not a superuser. + OPTION on itself. Database superusers can grant or revoke + membership in any role to anyone. Roles having + CREATEROLE privilege can grant or revoke membership + in any role that is not a superuser. diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index f9d3c1246b..c263f6c8b9 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -1425,11 +1425,6 @@ AddRoleMems(const char *rolename, Oid roleid, * The role membership grantor of record has little significance at * present. Nonetheless, inasmuch as users might look to it for a crude * audit trail, let only superusers impute the grant to a third party. - * - * Before lifting this restriction, give the member == role case of - * is_admin_of_role() a fresh look. Ensure that the current role cannot - * use an explicit grantor specification to take advantage of the session - * user's self-admin right. */ if (grantorId != GetUserId() && !superuser()) ereport(ERROR, diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index 0a16f8156c..5d939de3da 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -4619,11 +4619,6 @@ pg_role_aclcheck(Oid role_oid, Oid roleid, AclMode mode) { if (mode & ACL_GRANT_OPTION_FOR(ACL_CREATE)) { - /* - * XXX For roleid == role_oid, is_admin_of_role() also examines the - * session and call stack. That suits two-argument pg_has_role(), but - * it gives the three-argument version a lamentable whimsy. - */ if (is_admin_of_role(roleid, role_oid)) return ACLCHECK_OK; } @@ -4935,38 +4930,9 @@ is_admin_of_role(Oid member, Oid role) if (superuser_arg(member)) return true; + /* By policy, a role cannot have WITH ADMIN OPTION on itself. */ if (member == role) - - /* - * A role can admin itself when it matches the session user and we're - * outside any security-restricted operation, SECURITY DEFINER or - * similar context. SQL-standard roles cannot self-admin. However, - * SQL-standard users are distinct from roles, and they are not - * grantable like roles: PostgreSQL's role-user duality extends the - * standard. Checking for a session user match has the effect of - * letting a role self-admin only when it's conspicuously behaving - * like a user. Note that allowing self-admin under a mere SET ROLE - * would make WITH ADMIN OPTION largely irrelevant; any member could - * SET ROLE to issue the otherwise-forbidden command. - * - * Withholding self-admin in a security-restricted operation prevents - * object owners from harnessing the session user identity during - * administrative maintenance. Suppose Alice owns a database, has - * issued "GRANT alice TO bob", and runs a daily ANALYZE. Bob creates - * an alice-owned SECURITY DEFINER function that issues "REVOKE alice - * FROM carol". If he creates an expression index calling that - * function, Alice will attempt the REVOKE during each ANALYZE. - * Checking InSecurityRestrictedOperation() thwarts that attack. - * - * Withholding self-admin in SECURITY DEFINER functions makes their - * behavior independent of the calling user. There's no security or - * SQL-standard-conformance need for that restriction, though. - * - * A role cannot have actual WITH ADMIN OPTION on itself, because that - * would imply a membership loop. Therefore, we're done either way. - */ - return member == GetSessionUserId() && - !InLocalUserIdChange() && !InSecurityRestrictedOperation(); + return false; (void) roles_is_member_of(member, ROLERECURSE_MEMBERS, role, &result); return result; diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out index 8b4b039c6a..14bc497c21 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -1653,14 +1653,8 @@ SET ROLE regress_priv_group2; GRANT regress_priv_group2 TO regress_priv_user5; -- fails: SET ROLE did not help ERROR: must have admin option on role "regress_priv_group2" SET SESSION AUTHORIZATION regress_priv_group2; -GRANT regress_priv_group2 TO regress_priv_user5; -- ok: a role can self-admin -NOTICE: role "regress_priv_user5" is already a member of role "regress_priv_group2" -CREATE FUNCTION dogrant_fails() RETURNS void LANGUAGE sql SECURITY DEFINER AS - 'GRANT regress_priv_group2 TO regress_priv_user5'; -SELECT dogrant_fails(); -- fails: no self-admin in SECURITY DEFINER +GRANT regress_priv_group2 TO regress_priv_user5; -- fails: no self-admin ERROR: must have admin option on role "regress_priv_group2" -CONTEXT: SQL function "dogrant_fails" statement 1 -DROP FUNCTION dogrant_fails(); SET SESSION AUTHORIZATION regress_priv_user4; DROP FUNCTION dogrant_ok(); REVOKE regress_priv_group2 FROM regress_priv_user5; diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql index 3228572880..a26c0e17fc 100644 --- a/src/test/regress/sql/privileges.sql +++ b/src/test/regress/sql/privileges.sql @@ -1089,11 +1089,7 @@ SET ROLE regress_priv_group2; GRANT regress_priv_group2 TO regress_priv_user5; -- fails: SET ROLE did not help SET SESSION AUTHORIZATION regress_priv_group2; -GRANT regress_priv_group2 TO regress_priv_user5; -- ok: a role can self-admin -CREATE FUNCTION dogrant_fails() RETURNS void LANGUAGE sql SECURITY DEFINER AS - 'GRANT regress_priv_group2 TO regress_priv_user5'; -SELECT dogrant_fails(); -- fails: no self-admin in SECURITY DEFINER -DROP FUNCTION dogrant_fails(); +GRANT regress_priv_group2 TO regress_priv_user5; -- fails: no self-admin SET SESSION AUTHORIZATION regress_priv_user4; DROP FUNCTION dogrant_ok(); From 6198420ad8a72e37f4fe4964616b17e0fd33b808 Mon Sep 17 00:00:00 2001 From: Joe Conway Date: Mon, 28 Mar 2022 15:10:04 -0400 Subject: [PATCH 287/772] Use has_privs_for_roles for predefined role checks Generally if a role is granted membership to another role with NOINHERIT they must use SET ROLE to access the privileges of that role, however with predefined roles the membership and privilege is conflated. Fix that by replacing is_member_of_role with has_privs_for_role for predefined roles. Patch does not remove is_member_of_role from acl.h, but it does add a warning not to use that function for privilege checking. Not backpatched based on hackers list discussion. Author: Joshua Brindle Reviewed-by: Stephen Frost, Nathan Bossart, Joe Conway Discussion: https://postgr.es/m/flat/CAGB+Vh4Zv_TvKt2tv3QNS6tUM_F_9icmuj0zjywwcgVi4PAhFA@mail.gmail.com --- contrib/adminpack/adminpack.c | 2 +- contrib/file_fdw/expected/file_fdw.out | 2 +- contrib/file_fdw/file_fdw.c | 8 ++++---- .../pg_stat_statements/pg_stat_statements.c | 4 ++-- contrib/pgrowlocks/pgrowlocks.c | 2 +- doc/src/sgml/adminpack.sgml | 6 +++--- doc/src/sgml/catalogs.sgml | 12 +++++------ doc/src/sgml/func.sgml | 12 +++++------ doc/src/sgml/monitoring.sgml | 2 +- doc/src/sgml/pgbuffercache.sgml | 2 +- doc/src/sgml/pgfreespacemap.sgml | 2 +- doc/src/sgml/pgrowlocks.sgml | 2 +- doc/src/sgml/pgstatstatements.sgml | 2 +- doc/src/sgml/pgvisibility.sgml | 4 ++-- src/backend/commands/copy.c | 12 +++++------ src/backend/replication/walreceiver.c | 8 ++++---- src/backend/replication/walsender.c | 8 ++++---- src/backend/utils/adt/acl.c | 4 ++++ src/backend/utils/adt/dbsize.c | 8 ++++---- src/backend/utils/adt/genfile.c | 6 +++--- src/backend/utils/adt/pgstatfuncs.c | 2 +- src/backend/utils/misc/guc.c | 20 +++++++++---------- .../unsafe_tests/expected/rolenames.out | 2 +- 23 files changed, 68 insertions(+), 64 deletions(-) diff --git a/contrib/adminpack/adminpack.c b/contrib/adminpack/adminpack.c index d7d84d096f..03addf1dc5 100644 --- a/contrib/adminpack/adminpack.c +++ b/contrib/adminpack/adminpack.c @@ -79,7 +79,7 @@ convert_and_check_filename(text *arg) * files on the server as the PG user, so no need to do any further checks * here. */ - if (is_member_of_role(GetUserId(), ROLE_PG_WRITE_SERVER_FILES)) + if (has_privs_of_role(GetUserId(), ROLE_PG_WRITE_SERVER_FILES)) return filename; /* diff --git a/contrib/file_fdw/expected/file_fdw.out b/contrib/file_fdw/expected/file_fdw.out index 0ac6e4e0d7..14acdb27e5 100644 --- a/contrib/file_fdw/expected/file_fdw.out +++ b/contrib/file_fdw/expected/file_fdw.out @@ -459,7 +459,7 @@ ALTER FOREIGN TABLE agg_text OWNER TO regress_file_fdw_user; ALTER FOREIGN TABLE agg_text OPTIONS (SET format 'text'); SET ROLE regress_file_fdw_user; ALTER FOREIGN TABLE agg_text OPTIONS (SET format 'text'); -ERROR: only superuser or a member of the pg_read_server_files role may specify the filename option of a file_fdw foreign table +ERROR: only superuser or a role with privileges of the pg_read_server_files role may specify the filename option of a file_fdw foreign table SET ROLE regress_file_fdw_superuser; -- cleanup RESET ROLE; diff --git a/contrib/file_fdw/file_fdw.c b/contrib/file_fdw/file_fdw.c index db08593d97..4773cadec0 100644 --- a/contrib/file_fdw/file_fdw.c +++ b/contrib/file_fdw/file_fdw.c @@ -269,16 +269,16 @@ file_fdw_validator(PG_FUNCTION_ARGS) * otherwise there'd still be a security hole. */ if (strcmp(def->defname, "filename") == 0 && - !is_member_of_role(GetUserId(), ROLE_PG_READ_SERVER_FILES)) + !has_privs_of_role(GetUserId(), ROLE_PG_READ_SERVER_FILES)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("only superuser or a member of the pg_read_server_files role may specify the filename option of a file_fdw foreign table"))); + errmsg("only superuser or a role with privileges of the pg_read_server_files role may specify the filename option of a file_fdw foreign table"))); if (strcmp(def->defname, "program") == 0 && - !is_member_of_role(GetUserId(), ROLE_PG_EXECUTE_SERVER_PROGRAM)) + !has_privs_of_role(GetUserId(), ROLE_PG_EXECUTE_SERVER_PROGRAM)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("only superuser or a member of the pg_execute_server_program role may specify the program option of a file_fdw foreign table"))); + errmsg("only superuser or a role with privileges of the pg_execute_server_program role may specify the program option of a file_fdw foreign table"))); filename = defGetString(def); } diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 9e525a6ad3..55786ae84f 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -1503,8 +1503,8 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, HASH_SEQ_STATUS hash_seq; pgssEntry *entry; - /* Superusers or members of pg_read_all_stats members are allowed */ - is_allowed_role = is_member_of_role(userid, ROLE_PG_READ_ALL_STATS); + /* Superusers or roles with the privileges of pg_read_all_stats members are allowed */ + is_allowed_role = has_privs_of_role(userid, ROLE_PG_READ_ALL_STATS); /* hash table must exist already */ if (!pgss || !pgss_hash) diff --git a/contrib/pgrowlocks/pgrowlocks.c b/contrib/pgrowlocks/pgrowlocks.c index 713a165203..1d4d4965ac 100644 --- a/contrib/pgrowlocks/pgrowlocks.c +++ b/contrib/pgrowlocks/pgrowlocks.c @@ -104,7 +104,7 @@ pgrowlocks(PG_FUNCTION_ARGS) aclresult = pg_class_aclcheck(RelationGetRelid(rel), GetUserId(), ACL_SELECT); if (aclresult != ACLCHECK_OK) - aclresult = is_member_of_role(GetUserId(), ROLE_PG_STAT_SCAN_TABLES) ? ACLCHECK_OK : ACLCHECK_NO_PRIV; + aclresult = has_privs_of_role(GetUserId(), ROLE_PG_STAT_SCAN_TABLES) ? ACLCHECK_OK : ACLCHECK_NO_PRIV; if (aclresult != ACLCHECK_OK) aclcheck_error(aclresult, get_relkind_objtype(rel->rd_rel->relkind), diff --git a/doc/src/sgml/adminpack.sgml b/doc/src/sgml/adminpack.sgml index 0dd89be353..5702456cd2 100644 --- a/doc/src/sgml/adminpack.sgml +++ b/doc/src/sgml/adminpack.sgml @@ -22,9 +22,9 @@ functions in , which provide read-only access.) Only files within the database cluster directory can be accessed, unless the - user is a superuser or given one of the pg_read_server_files, or pg_write_server_files - roles, as appropriate for the function, but either a relative or absolute path is - allowable. + user is a superuser or given privileges of one of the pg_read_server_files, + or pg_write_server_files roles, as appropriate for the function, but either a + relative or absolute path is allowable.
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 94f01e4099..23e06b81a4 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -10044,8 +10044,8 @@ SCRAM-SHA-256$<iteration count>:&l By default, the pg_backend_memory_contexts view can be - read only by superusers or members of the pg_read_all_stats - role. + read only by superusers or roles with the privileges of the + pg_read_all_stats role. @@ -12552,7 +12552,7 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx Configuration file the current value was set in (null for values set from sources other than configuration files, or when - examined by a user who is neither a superuser or a member of + examined by a user who neither is a superuser nor has privileges of pg_read_all_settings); helpful when using include directives in configuration files @@ -12565,7 +12565,7 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx Line number within the configuration file the current value was set at (null for values set from sources other than configuration files, - or when examined by a user who is neither a superuser or a member of + or when examined by a user who neither is a superuser nor has privileges of pg_read_all_settings). @@ -12941,8 +12941,8 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx By default, the pg_shmem_allocations view can be - read only by superusers or members of the pg_read_all_stats - role. + read only by superusers or roles with privileges of the + pg_read_all_stats role. diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 8a802fb225..3a9d62b408 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -25435,7 +25435,7 @@ SELECT collation for ('foo' COLLATE "de_DE"); Cancels the current query of the session whose backend process has the specified process ID. This is also allowed if the calling role is a member of the role whose backend is being canceled or - the calling role has been granted pg_signal_backend, + the calling role has privileges of pg_signal_backend, however only superusers can cancel superuser backends. @@ -25508,7 +25508,7 @@ SELECT collation for ('foo' COLLATE "de_DE"); Terminates the session whose backend process has the specified process ID. This is also allowed if the calling role is a member of the role whose backend is being terminated or the - calling role has been granted pg_signal_backend, + calling role has privileges of pg_signal_backend, however only superusers can terminate superuser backends. @@ -26783,7 +26783,7 @@ postgres=# SELECT * FROM pg_walfile_name_offset(pg_stop_backup()); Computes the total disk space used by the database with the specified name or OID. To use this function, you must have CONNECT privilege on the specified database - (which is granted by default) or be a member of + (which is granted by default) or have privileges of the pg_read_all_stats role. @@ -26913,7 +26913,7 @@ postgres=# SELECT * FROM pg_walfile_name_offset(pg_stop_backup()); Computes the total disk space used in the tablespace with the specified name or OID. To use this function, you must have CREATE privilege on the specified tablespace - or be a member of the pg_read_all_stats role, + or have privileges of the pg_read_all_stats role, unless it is the default tablespace for the current database. @@ -27392,7 +27392,7 @@ SELECT pg_size_pretty(sum(pg_relation_size(relid))) AS total_size a dot, directories, and other special files are excluded. - This function is restricted to superusers and members of + This function is restricted to superusers and roles with privileges of the pg_monitor role by default, but other users can be granted EXECUTE to run the function. @@ -27416,7 +27416,7 @@ SELECT pg_size_pretty(sum(pg_relation_size(relid))) AS total_size are excluded. - This function is restricted to superusers and members of + This function is restricted to superusers and roles with privileges of the pg_monitor role by default, but other users can be granted EXECUTE to run the function. diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 35b2923c5e..6a6b09dc45 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -280,7 +280,7 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser (sessions belonging to a role that they are a member of). In rows about other sessions, many columns will be null. Note, however, that the existence of a session and its general properties such as its sessions user - and database are visible to all users. Superusers and members of the + and database are visible to all users. Superusers and roles with privileges of built-in role pg_read_all_stats (see also ) can see all the information about all sessions. diff --git a/doc/src/sgml/pgbuffercache.sgml b/doc/src/sgml/pgbuffercache.sgml index e68d159d30..a06fd3e26d 100644 --- a/doc/src/sgml/pgbuffercache.sgml +++ b/doc/src/sgml/pgbuffercache.sgml @@ -24,7 +24,7 @@ - By default, use is restricted to superusers and members of the + By default, use is restricted to superusers and roles with privileges of the pg_monitor role. Access may be granted to others using GRANT. diff --git a/doc/src/sgml/pgfreespacemap.sgml b/doc/src/sgml/pgfreespacemap.sgml index 1f7867d9b9..3063885c2c 100644 --- a/doc/src/sgml/pgfreespacemap.sgml +++ b/doc/src/sgml/pgfreespacemap.sgml @@ -16,7 +16,7 @@ - By default use is restricted to superusers and members of the + By default use is restricted to superusers and roles with privileges of the pg_stat_scan_tables role. Access may be granted to others using GRANT. diff --git a/doc/src/sgml/pgrowlocks.sgml b/doc/src/sgml/pgrowlocks.sgml index 392d5f1f9a..2914bf6e6d 100644 --- a/doc/src/sgml/pgrowlocks.sgml +++ b/doc/src/sgml/pgrowlocks.sgml @@ -13,7 +13,7 @@ - By default use is restricted to superusers, members of the + By default use is restricted to superusers, roles with privileges of the pg_stat_scan_tables role, and users with SELECT permissions on the table. diff --git a/doc/src/sgml/pgstatstatements.sgml b/doc/src/sgml/pgstatstatements.sgml index bc9d5bdbe3..3a7e36bd13 100644 --- a/doc/src/sgml/pgstatstatements.sgml +++ b/doc/src/sgml/pgstatstatements.sgml @@ -384,7 +384,7 @@
- For security reasons, only superusers and members of the + For security reasons, only superusers and roles with privileges of the pg_read_all_stats role are allowed to see the SQL text and queryid of queries executed by other users. Other users can see the statistics, however, if the view has been installed diff --git a/doc/src/sgml/pgvisibility.sgml b/doc/src/sgml/pgvisibility.sgml index 75336946a6..8090aa5207 100644 --- a/doc/src/sgml/pgvisibility.sgml +++ b/doc/src/sgml/pgvisibility.sgml @@ -140,8 +140,8 @@
- By default, these functions are executable only by superusers and members of the - pg_stat_scan_tables role, with the exception of + By default, these functions are executable only by superusers and roles with privileges + of the pg_stat_scan_tables role, with the exception of pg_truncate_visibility_map(relation regclass) which can only be executed by superusers. diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 7da7105d44..7a0c897cc9 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -80,26 +80,26 @@ DoCopy(ParseState *pstate, const CopyStmt *stmt, { if (stmt->is_program) { - if (!is_member_of_role(GetUserId(), ROLE_PG_EXECUTE_SERVER_PROGRAM)) + if (!has_privs_of_role(GetUserId(), ROLE_PG_EXECUTE_SERVER_PROGRAM)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser or a member of the pg_execute_server_program role to COPY to or from an external program"), + errmsg("must be superuser or have privileges of the pg_execute_server_program role to COPY to or from an external program"), errhint("Anyone can COPY to stdout or from stdin. " "psql's \\copy command also works for anyone."))); } else { - if (is_from && !is_member_of_role(GetUserId(), ROLE_PG_READ_SERVER_FILES)) + if (is_from && !has_privs_of_role(GetUserId(), ROLE_PG_READ_SERVER_FILES)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser or a member of the pg_read_server_files role to COPY from a file"), + errmsg("must be superuser or have privileges of the pg_read_server_files role to COPY from a file"), errhint("Anyone can COPY to stdout or from stdin. " "psql's \\copy command also works for anyone."))); - if (!is_from && !is_member_of_role(GetUserId(), ROLE_PG_WRITE_SERVER_FILES)) + if (!is_from && !has_privs_of_role(GetUserId(), ROLE_PG_WRITE_SERVER_FILES)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser or a member of the pg_write_server_files role to COPY to a file"), + errmsg("must be superuser or have privileges of the pg_write_server_files role to COPY to a file"), errhint("Anyone can COPY to stdout or from stdin. " "psql's \\copy command also works for anyone."))); } diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c index ceaff097b9..3c9411e221 100644 --- a/src/backend/replication/walreceiver.c +++ b/src/backend/replication/walreceiver.c @@ -1403,12 +1403,12 @@ pg_stat_get_wal_receiver(PG_FUNCTION_ARGS) /* Fetch values */ values[0] = Int32GetDatum(pid); - if (!is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS)) + if (!has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS)) { /* - * Only superusers and members of pg_read_all_stats can see details. - * Other users only get the pid value to know whether it is a WAL - * receiver, but no details. + * Only superusers and roles with privileges of pg_read_all_stats + * can see details. Other users only get the pid value to know whether + * it is a WAL receiver, but no details. */ MemSet(&nulls[1], true, sizeof(bool) * (tupdesc->natts - 1)); } diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 2d0292a092..cffb3482ad 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -3473,12 +3473,12 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS) memset(nulls, 0, sizeof(nulls)); values[0] = Int32GetDatum(pid); - if (!is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS)) + if (!has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS)) { /* - * Only superusers and members of pg_read_all_stats can see - * details. Other users only get the pid value to know it's a - * walsender, but no details. + * Only superusers and roles with privileges of pg_read_all_stats + * can see details. Other users only get the pid value to know + * it's a walsender, but no details. */ MemSet(&nulls[1], true, PG_STAT_GET_WAL_SENDERS_COLS - 1); } diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index 5d939de3da..83cf7ac9ff 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -4859,6 +4859,8 @@ has_privs_of_role(Oid member, Oid role) * Is member a member of role (directly or indirectly)? * * This is defined to recurse through roles regardless of rolinherit. + * + * Do not use this for privilege checking, instead use has_privs_of_role() */ bool is_member_of_role(Oid member, Oid role) @@ -4899,6 +4901,8 @@ check_is_member_of_role(Oid member, Oid role) * * This is identical to is_member_of_role except we ignore superuser * status. + * + * Do not use this for privilege checking, instead use has_privs_of_role() */ bool is_member_of_role_nosuper(Oid member, Oid role) diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c index 3a2f2e1f99..0576764ac4 100644 --- a/src/backend/utils/adt/dbsize.c +++ b/src/backend/utils/adt/dbsize.c @@ -112,12 +112,12 @@ calculate_database_size(Oid dbOid) AclResult aclresult; /* - * User must have connect privilege for target database or be a member of + * User must have connect privilege for target database or have privileges of * pg_read_all_stats */ aclresult = pg_database_aclcheck(dbOid, GetUserId(), ACL_CONNECT); if (aclresult != ACLCHECK_OK && - !is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS)) + !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS)) { aclcheck_error(aclresult, OBJECT_DATABASE, get_database_name(dbOid)); @@ -196,12 +196,12 @@ calculate_tablespace_size(Oid tblspcOid) AclResult aclresult; /* - * User must be a member of pg_read_all_stats or have CREATE privilege for + * User must have privileges of pg_read_all_stats or have CREATE privilege for * target tablespace, either explicitly granted or implicitly because it * is default for current database. */ if (tblspcOid != MyDatabaseTableSpace && - !is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS)) + !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS)) { aclresult = pg_tablespace_aclcheck(tblspcOid, GetUserId(), ACL_CREATE); if (aclresult != ACLCHECK_OK) diff --git a/src/backend/utils/adt/genfile.c b/src/backend/utils/adt/genfile.c index 1ed01620a1..88f279d1b3 100644 --- a/src/backend/utils/adt/genfile.c +++ b/src/backend/utils/adt/genfile.c @@ -59,11 +59,11 @@ convert_and_check_filename(text *arg) canonicalize_path(filename); /* filename can change length here */ /* - * Members of the 'pg_read_server_files' role are allowed to access any - * files on the server as the PG user, so no need to do any further checks + * Roles with privleges of the 'pg_read_server_files' role are allowed to access + * any files on the server as the PG user, so no need to do any further checks * here. */ - if (is_member_of_role(GetUserId(), ROLE_PG_READ_SERVER_FILES)) + if (has_privs_of_role(GetUserId(), ROLE_PG_READ_SERVER_FILES)) return filename; /* diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index eff45b16f2..ce84525d40 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -34,7 +34,7 @@ #define UINT32_ACCESS_ONCE(var) ((uint32)(*((volatile uint32 *)&(var)))) -#define HAS_PGSTAT_PERMISSIONS(role) (is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS) || has_privs_of_role(GetUserId(), role)) +#define HAS_PGSTAT_PERMISSIONS(role) (has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS) || has_privs_of_role(GetUserId(), role)) Datum pg_stat_get_numscans(PG_FUNCTION_ARGS) diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index b86137dc38..eb3a03b976 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -8228,10 +8228,10 @@ GetConfigOption(const char *name, bool missing_ok, bool restrict_privileged) return NULL; if (restrict_privileged && (record->flags & GUC_SUPERUSER_ONLY) && - !is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS)) + !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser or a member of pg_read_all_settings to examine \"%s\"", + errmsg("must be superuser or have privileges of pg_read_all_settings to examine \"%s\"", name))); switch (record->vartype) @@ -8275,10 +8275,10 @@ GetConfigOptionResetString(const char *name) record = find_option(name, false, false, ERROR); Assert(record != NULL); if ((record->flags & GUC_SUPERUSER_ONLY) && - !is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS)) + !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser or a member of pg_read_all_settings to examine \"%s\"", + errmsg("must be superuser or have privileges of pg_read_all_settings to examine \"%s\"", name))); switch (record->vartype) @@ -9566,7 +9566,7 @@ ShowAllGUCConfig(DestReceiver *dest) if ((conf->flags & GUC_NO_SHOW_ALL) || ((conf->flags & GUC_SUPERUSER_ONLY) && - !is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS))) + !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS))) continue; /* assign to the values array */ @@ -9633,7 +9633,7 @@ get_explain_guc_options(int *num) /* return only options visible to the current user */ if ((conf->flags & GUC_NO_SHOW_ALL) || ((conf->flags & GUC_SUPERUSER_ONLY) && - !is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS))) + !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS))) continue; /* return only options that are different from their boot values */ @@ -9715,10 +9715,10 @@ GetConfigOptionByName(const char *name, const char **varname, bool missing_ok) } if ((record->flags & GUC_SUPERUSER_ONLY) && - !is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS)) + !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser or a member of pg_read_all_settings to examine \"%s\"", + errmsg("must be superuser or have privileges of pg_read_all_settings to examine \"%s\"", name))); if (varname) @@ -9785,7 +9785,7 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow) { if ((conf->flags & GUC_NO_SHOW_ALL) || ((conf->flags & GUC_SUPERUSER_ONLY) && - !is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS))) + !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS))) *noshow = true; else *noshow = false; @@ -9980,7 +9980,7 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow) * insufficiently-privileged users. */ if (conf->source == PGC_S_FILE && - is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS)) + has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS)) { values[14] = conf->sourcefile; snprintf(buffer, sizeof(buffer), "%d", conf->sourceline); diff --git a/src/test/modules/unsafe_tests/expected/rolenames.out b/src/test/modules/unsafe_tests/expected/rolenames.out index eb608fdc2e..88b1ff843b 100644 --- a/src/test/modules/unsafe_tests/expected/rolenames.out +++ b/src/test/modules/unsafe_tests/expected/rolenames.out @@ -1077,7 +1077,7 @@ SHOW session_preload_libraries; SET SESSION AUTHORIZATION regress_role_nopriv; -- fails with role not member of pg_read_all_settings SHOW session_preload_libraries; -ERROR: must be superuser or a member of pg_read_all_settings to examine "session_preload_libraries" +ERROR: must be superuser or have privileges of pg_read_all_settings to examine "session_preload_libraries" RESET SESSION AUTHORIZATION; ERROR: current transaction is aborted, commands ignored until end of transaction block ROLLBACK; From 33a377608fc29cdd1f6b63be561eab0aee5c81f0 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 3 Mar 2022 13:02:53 -0500 Subject: [PATCH 288/772] IS JSON predicate This patch intrdocuces the SQL standard IS JSON predicate. It operates on text and bytea values representing JSON as well as on the json and jsonb types. Each test has an IS and IS NOT variant. The tests are: IS JSON [VALUE] IS JSON ARRAY IS JSON OBJECT IS JSON SCALAR IS JSON WITH | WITHOUT UNIQUE KEYS These are mostly self-explanatory, but note that IS JSON WITHOUT UNIQUE KEYS is true whenever IS JSON is true, and IS JSON WITH UNIQUE KEYS is true whenever IS JSON is true except it IS JSON OBJECT is true and there are duplicate keys (which is never the case when applied to jsonb values). Nikita Glukhov Reviewers have included (in no particular order) Andres Freund, Alexander Korotkov, Pavel Stehule, Andrew Alsup, Erik Rijkers, Zihong Yu, Himanshu Upadhyaya, Daniel Gustafsson, Justin Pryzby. Discussion: https://postgr.es/m/cd0bb935-0158-78a7-08b5-904886deac4b@postgrespro.ru --- src/backend/executor/execExpr.c | 13 ++ src/backend/executor/execExprInterp.c | 95 ++++++++++++ src/backend/jit/llvm/llvmjit_expr.c | 6 + src/backend/jit/llvm/llvmjit_types.c | 1 + src/backend/nodes/copyfuncs.c | 20 +++ src/backend/nodes/equalfuncs.c | 15 ++ src/backend/nodes/makefuncs.c | 19 +++ src/backend/nodes/nodeFuncs.c | 26 ++++ src/backend/nodes/outfuncs.c | 14 ++ src/backend/nodes/readfuncs.c | 18 +++ src/backend/parser/gram.y | 63 +++++++- src/backend/parser/parse_expr.c | 76 ++++++++++ src/backend/utils/adt/json.c | 105 ++++++++++++-- src/backend/utils/adt/jsonfuncs.c | 20 +++ src/backend/utils/adt/ruleutils.c | 35 +++++ src/backend/utils/misc/queryjumble.c | 10 ++ src/include/executor/execExpr.h | 8 ++ src/include/nodes/makefuncs.h | 3 + src/include/nodes/nodes.h | 1 + src/include/nodes/primnodes.h | 26 ++++ src/include/parser/kwlist.h | 1 + src/include/utils/json.h | 1 + src/include/utils/jsonfuncs.h | 3 + src/test/regress/expected/sqljson.out | 198 ++++++++++++++++++++++++++ src/test/regress/sql/sqljson.sql | 96 +++++++++++++ 25 files changed, 856 insertions(+), 17 deletions(-) diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index a9547aaef1..acd3ea6134 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -2513,6 +2513,19 @@ ExecInitExprRec(Expr *node, ExprState *state, } break; + case T_JsonIsPredicate: + { + JsonIsPredicate *pred = (JsonIsPredicate *) node; + + ExecInitExprRec((Expr *) pred->expr, state, resv, resnull); + + scratch.opcode = EEOP_IS_JSON; + scratch.d.is_json.pred = pred; + + ExprEvalPushStep(state, &scratch); + break; + } + default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index f2a0821a7a..c0bd955620 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -73,6 +73,7 @@ #include "utils/expandedrecord.h" #include "utils/json.h" #include "utils/jsonb.h" +#include "utils/jsonfuncs.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/timestamp.h" @@ -480,6 +481,7 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) &&CASE_EEOP_WINDOW_FUNC, &&CASE_EEOP_SUBPLAN, &&CASE_EEOP_JSON_CONSTRUCTOR, + &&CASE_EEOP_IS_JSON, &&CASE_EEOP_AGG_STRICT_DESERIALIZE, &&CASE_EEOP_AGG_DESERIALIZE, &&CASE_EEOP_AGG_STRICT_INPUT_CHECK_ARGS, @@ -1799,6 +1801,14 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) EEO_NEXT(); } + EEO_CASE(EEOP_IS_JSON) + { + /* too complex for an inline implementation */ + ExecEvalJsonIsPredicate(state, op); + + EEO_NEXT(); + } + EEO_CASE(EEOP_LAST) { /* unreachable */ @@ -3909,6 +3919,91 @@ ExecEvalXmlExpr(ExprState *state, ExprEvalStep *op) } } +void +ExecEvalJsonIsPredicate(ExprState *state, ExprEvalStep *op) +{ + JsonIsPredicate *pred = op->d.is_json.pred; + Datum js = *op->resvalue; + Oid exprtype; + bool res; + + if (*op->resnull) + { + *op->resvalue = BoolGetDatum(false); + return; + } + + exprtype = exprType(pred->expr); + + if (exprtype == TEXTOID || exprtype == JSONOID) + { + text *json = DatumGetTextP(js); + + if (pred->value_type == JS_TYPE_ANY) + res = true; + else + { + switch (json_get_first_token(json, false)) + { + case JSON_TOKEN_OBJECT_START: + res = pred->value_type == JS_TYPE_OBJECT; + break; + case JSON_TOKEN_ARRAY_START: + res = pred->value_type == JS_TYPE_ARRAY; + break; + case JSON_TOKEN_STRING: + case JSON_TOKEN_NUMBER: + case JSON_TOKEN_TRUE: + case JSON_TOKEN_FALSE: + case JSON_TOKEN_NULL: + res = pred->value_type == JS_TYPE_SCALAR; + break; + default: + res = false; + break; + } + } + + /* + * Do full parsing pass only for uniqueness check or for + * JSON text validation. + */ + if (res && (pred->unique_keys || exprtype == TEXTOID)) + res = json_validate(json, pred->unique_keys); + } + else if (exprtype == JSONBOID) + { + if (pred->value_type == JS_TYPE_ANY) + res = true; + else + { + Jsonb *jb = DatumGetJsonbP(js); + + switch (pred->value_type) + { + case JS_TYPE_OBJECT: + res = JB_ROOT_IS_OBJECT(jb); + break; + case JS_TYPE_ARRAY: + res = JB_ROOT_IS_ARRAY(jb) && !JB_ROOT_IS_SCALAR(jb); + break; + case JS_TYPE_SCALAR: + res = JB_ROOT_IS_ARRAY(jb) && JB_ROOT_IS_SCALAR(jb); + break; + default: + res = false; + break; + } + } + + /* Key uniqueness check is redundant for jsonb */ + } + else + res = false; + + *op->resvalue = BoolGetDatum(res); +} + /* * ExecEvalGroupingFunc * diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c index d0c26cf58b..02511c6aec 100644 --- a/src/backend/jit/llvm/llvmjit_expr.c +++ b/src/backend/jit/llvm/llvmjit_expr.c @@ -2354,6 +2354,12 @@ llvm_compile_expr(ExprState *state) LLVMBuildBr(b, opblocks[opno + 1]); break; + case EEOP_IS_JSON: + build_EvalXFunc(b, mod, "ExecEvalJsonIsPredicate", + v_state, op); + LLVMBuildBr(b, opblocks[opno + 1]); + break; + case EEOP_LAST: Assert(false); break; diff --git a/src/backend/jit/llvm/llvmjit_types.c b/src/backend/jit/llvm/llvmjit_types.c index 53c75dd9d6..4d7029a27f 100644 --- a/src/backend/jit/llvm/llvmjit_types.c +++ b/src/backend/jit/llvm/llvmjit_types.c @@ -132,6 +132,7 @@ void *referenced_functions[] = ExecEvalWholeRowVar, ExecEvalXmlExpr, ExecEvalJsonConstructor, + ExecEvalJsonIsPredicate, MakeExpandedObjectReadOnlyInternal, slot_getmissingattrs, slot_getsomeattrs_int, diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index c09172164b..cb4b4d01f8 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -2491,6 +2491,23 @@ _copyJsonArrayQueryConstructor(const JsonArrayQueryConstructor *from) return newnode; } +/* + * _copyJsonIsPredicate + */ +static JsonIsPredicate * +_copyJsonIsPredicate(const JsonIsPredicate *from) +{ + JsonIsPredicate *newnode = makeNode(JsonIsPredicate); + + COPY_NODE_FIELD(expr); + COPY_SCALAR_FIELD(format); + COPY_SCALAR_FIELD(value_type); + COPY_SCALAR_FIELD(unique_keys); + COPY_LOCATION_FIELD(location); + + return newnode; +} + /* **************************************************************** * pathnodes.h copy functions * @@ -5625,6 +5642,9 @@ copyObjectImpl(const void *from) case T_JsonArrayAgg: retval = _copyJsonArrayAgg(from); break; + case T_JsonIsPredicate: + retval = _copyJsonIsPredicate(from); + break; /* * RELATION NODES diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 3fb423be47..084d98b34c 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -976,6 +976,18 @@ _equalJsonArrayQueryConstructor(const JsonArrayQueryConstructor *a, return true; } +static bool +_equalJsonIsPredicate(const JsonIsPredicate *a, + const JsonIsPredicate *b) +{ + COMPARE_NODE_FIELD(expr); + COMPARE_SCALAR_FIELD(value_type); + COMPARE_SCALAR_FIELD(unique_keys); + COMPARE_LOCATION_FIELD(location); + + return true; +} + /* * Stuff from pathnodes.h */ @@ -3546,6 +3558,9 @@ equal(const void *a, const void *b) case T_JsonConstructorExpr: retval = _equalJsonConstructorExpr(a, b); break; + case T_JsonIsPredicate: + retval = _equalJsonIsPredicate(a, b); + break; /* * RELATION NODES diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c index 7b4f7972e6..b67e7c5297 100644 --- a/src/backend/nodes/makefuncs.c +++ b/src/backend/nodes/makefuncs.c @@ -887,3 +887,22 @@ makeJsonKeyValue(Node *key, Node *value) return (Node *) n; } + +/* + * makeJsonIsPredicate - + * creates a JsonIsPredicate node + */ +Node * +makeJsonIsPredicate(Node *expr, JsonFormat *format, JsonValueType value_type, + bool unique_keys, int location) +{ + JsonIsPredicate *n = makeNode(JsonIsPredicate); + + n->expr = expr; + n->format = format; + n->value_type = value_type; + n->unique_keys = unique_keys; + n->location = location; + + return (Node *) n; +} diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index 50898246f9..d697c7abd8 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -260,6 +260,9 @@ exprType(const Node *expr) case T_JsonConstructorExpr: type = ((const JsonConstructorExpr *) expr)->returning->typid; break; + case T_JsonIsPredicate: + type = BOOLOID; + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); type = InvalidOid; /* keep compiler quiet */ @@ -985,6 +988,9 @@ exprCollation(const Node *expr) coll = InvalidOid; } break; + case T_JsonIsPredicate: + coll = InvalidOid; /* result is always an boolean type */ + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); coll = InvalidOid; /* keep compiler quiet */ @@ -1211,6 +1217,9 @@ exprSetCollation(Node *expr, Oid collation) Assert(!OidIsValid(collation)); /* result is always a json[b] type */ } break; + case T_JsonIsPredicate: + Assert(!OidIsValid(collation)); /* result is always boolean */ + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); break; @@ -1663,6 +1672,9 @@ exprLocation(const Node *expr) case T_JsonConstructorExpr: loc = ((const JsonConstructorExpr *) expr)->location; break; + case T_JsonIsPredicate: + loc = ((const JsonIsPredicate *) expr)->location; + break; default: /* for any other node type it's just unknown... */ loc = -1; @@ -2429,6 +2441,8 @@ expression_tree_walker(Node *node, return true; } break; + case T_JsonIsPredicate: + return walker(((JsonIsPredicate *) node)->expr, context); default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); @@ -3438,6 +3452,16 @@ expression_tree_mutator(Node *node, MUTATE(newnode->coercion, jve->coercion, Expr *); MUTATE(newnode->returning, jve->returning, JsonReturning *); + return (Node *) newnode; + } + case T_JsonIsPredicate: + { + JsonIsPredicate *pred = (JsonIsPredicate *) node; + JsonIsPredicate *newnode; + + FLATCOPY(newnode, pred, JsonIsPredicate); + MUTATE(newnode->expr, pred->expr, Node *); + return (Node *) newnode; } default: @@ -4290,6 +4314,8 @@ raw_expression_tree_walker(Node *node, return true; } break; + case T_JsonIsPredicate: + return walker(((JsonIsPredicate *) node)->expr, context); default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 0c01f35086..278e87259d 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1797,6 +1797,17 @@ _outJsonConstructorExpr(StringInfo str, const JsonConstructorExpr *node) WRITE_LOCATION_FIELD(location); } +static void +_outJsonIsPredicate(StringInfo str, const JsonIsPredicate *node) +{ + WRITE_NODE_TYPE("JSONISPREDICATE"); + + WRITE_NODE_FIELD(expr); + WRITE_ENUM_FIELD(value_type, JsonValueType); + WRITE_BOOL_FIELD(unique_keys); + WRITE_LOCATION_FIELD(location); +} + /***************************************************************************** * * Stuff from pathnodes.h. @@ -4630,6 +4641,9 @@ outNode(StringInfo str, const void *obj) case T_JsonConstructorExpr: _outJsonConstructorExpr(str, obj); break; + case T_JsonIsPredicate: + _outJsonIsPredicate(str, obj); + break; default: diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 3ee8ba6f15..5b9e235e9a 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -1492,6 +1492,22 @@ _readJsonConstructorExpr(void) READ_DONE(); } +/* + * _readJsonIsPredicate + */ +static JsonIsPredicate * +_readJsonIsPredicate() +{ + READ_LOCALS(JsonIsPredicate); + + READ_NODE_FIELD(expr); + READ_ENUM_FIELD(value_type, JsonValueType); + READ_BOOL_FIELD(unique_keys); + READ_LOCATION_FIELD(location); + + READ_DONE(); +} + /* * Stuff from pathnodes.h. * @@ -3090,6 +3106,8 @@ parseNodeString(void) return_value = _readJsonValueExpr(); else if (MATCH("JSONCTOREXPR", 12)) return_value = _readJsonConstructorExpr(); + else if (MATCH("JSONISPREDICATE", 15)) + return_value = _readJsonIsPredicate(); else { elog(ERROR, "badly formatted node string \"%.32s\"...", token); diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 9399fff610..b658bcc182 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -665,6 +665,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type json_encoding json_encoding_clause_opt + json_predicate_type_constraint_opt %type json_key_uniqueness_constraint_opt json_object_constructor_null_clause_opt @@ -734,7 +735,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); JOIN JSON JSON_ARRAY JSON_ARRAYAGG JSON_OBJECT JSON_OBJECTAGG - KEY KEYS + KEY KEYS KEEP LABEL LANGUAGE LARGE_P LAST_P LATERAL_P LEADING LEAKPROOF LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL @@ -763,9 +764,9 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); RESET RESTART RESTRICT RETURN RETURNING RETURNS REVOKE RIGHT ROLE ROLLBACK ROLLUP ROUTINE ROUTINES ROW ROWS RULE - SAVEPOINT SCHEMA SCHEMAS SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE SEQUENCES - SERIALIZABLE SERVER SESSION SESSION_USER SET SETS SETOF SHARE SHOW - SIMILAR SIMPLE SKIP SMALLINT SNAPSHOT SOME SQL_P STABLE STANDALONE_P + SAVEPOINT SCALAR SCHEMA SCHEMAS SCROLL SEARCH SECOND_P SECURITY SELECT + SEQUENCE SEQUENCES SERIALIZABLE SERVER SESSION SESSION_USER SET SETS SETOF + SHARE SHOW SIMILAR SIMPLE SKIP SMALLINT SNAPSHOT SOME SQL_P STABLE STANDALONE_P START STATEMENT STATISTICS STDIN STDOUT STORAGE STORED STRICT_P STRIP_P SUBSCRIPTION SUBSTRING SUPPORT SYMMETRIC SYSID SYSTEM_P @@ -853,13 +854,14 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); * Using the same precedence as IDENT seems right for the reasons given above. */ %nonassoc UNBOUNDED /* ideally would have same precedence as IDENT */ -%nonassoc ABSENT UNIQUE +%nonassoc ABSENT UNIQUE JSON %nonassoc IDENT PARTITION RANGE ROWS GROUPS PRECEDING FOLLOWING CUBE ROLLUP %left Op OPERATOR /* multi-character ops and user-defined operators */ %left '+' '-' %left '*' '/' '%' %left '^' %left KEYS /* UNIQUE [ KEYS ] */ +%left OBJECT_P SCALAR VALUE_P /* JSON [ OBJECT | SCALAR | VALUE ] */ /* Unary Operators */ %left AT /* sets precedence for AT TIME ZONE */ %left COLLATE @@ -14141,6 +14143,46 @@ a_expr: c_expr { $$ = $1; } @2), @2); } + | a_expr + IS json_predicate_type_constraint_opt + json_key_uniqueness_constraint_opt %prec IS + { + JsonFormat *format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1); + $$ = makeJsonIsPredicate($1, format, $3, $4, @1); + } + /* + * Required by standard, but it would conflict with expressions + * like: 'str' || format(...) + | a_expr + FORMAT json_representation + IS json_predicate_type_constraint_opt + json_key_uniqueness_constraint_opt %prec FORMAT + { + $3.location = @2; + $$ = makeJsonIsPredicate($1, $3, $5, $6, @1); + } + */ + | a_expr + IS NOT + json_predicate_type_constraint_opt + json_key_uniqueness_constraint_opt %prec IS + { + JsonFormat *format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1); + $$ = makeNotExpr(makeJsonIsPredicate($1, format, $4, $5, @1), @1); + } + /* + * Required by standard, but it would conflict with expressions + * like: 'str' || format(...) + | a_expr + FORMAT json_representation + IS NOT + json_predicate_type_constraint_opt + json_key_uniqueness_constraint_opt %prec FORMAT + { + $3.location = @2; + $$ = makeNotExpr(makeJsonIsPredicate($1, $3, $6, $7, @1), @1); + } + */ | DEFAULT { /* @@ -14223,6 +14265,14 @@ b_expr: c_expr } ; +json_predicate_type_constraint_opt: + JSON { $$ = JS_TYPE_ANY; } + | JSON VALUE_P { $$ = JS_TYPE_ANY; } + | JSON ARRAY { $$ = JS_TYPE_ARRAY; } + | JSON OBJECT_P { $$ = JS_TYPE_OBJECT; } + | JSON SCALAR { $$ = JS_TYPE_SCALAR; } + ; + json_key_uniqueness_constraint_opt: WITH_LA_UNIQUE unique_keys { $$ = true; } | WITHOUT unique_keys { $$ = false; } @@ -16412,6 +16462,7 @@ unreserved_keyword: | ROWS | RULE | SAVEPOINT + | SCALAR | SCHEMA | SCHEMAS | SCROLL @@ -16882,6 +16933,7 @@ bare_label_keyword: | JSON_ARRAYAGG | JSON_OBJECT | JSON_OBJECTAGG + | KEEP | KEY | KEYS | LABEL @@ -17011,6 +17063,7 @@ bare_label_keyword: | ROWS | RULE | SAVEPOINT + | SCALAR | SCHEMA | SCHEMAS | SCROLL diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 84be354f71..0b972ea632 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -85,6 +85,7 @@ static Node *transformJsonArrayQueryConstructor(ParseState *pstate, JsonArrayQueryConstructor *ctor); static Node *transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg); static Node *transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg); +static Node *transformJsonIsPredicate(ParseState *pstate, JsonIsPredicate *p); static Node *make_row_comparison_op(ParseState *pstate, List *opname, List *largs, List *rargs, int location); static Node *make_row_distinct_op(ParseState *pstate, List *opname, @@ -332,6 +333,10 @@ transformExprRecurse(ParseState *pstate, Node *expr) result = transformJsonArrayAgg(pstate, (JsonArrayAgg *) expr); break; + case T_JsonIsPredicate: + result = transformJsonIsPredicate(pstate, (JsonIsPredicate *) expr); + break; + default: /* should not reach here */ elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); @@ -3869,3 +3874,74 @@ transformJsonArrayConstructor(ParseState *pstate, JsonArrayConstructor *ctor) returning, false, ctor->absent_on_null, ctor->location); } + +static Node * +transformJsonParseArg(ParseState *pstate, Node *jsexpr, JsonFormat *format, + Oid *exprtype) +{ + Node *raw_expr = transformExprRecurse(pstate, jsexpr); + Node *expr = raw_expr; + + *exprtype = exprType(expr); + + /* prepare input document */ + if (*exprtype == BYTEAOID) + { + JsonValueExpr *jve; + + expr = makeCaseTestExpr(raw_expr); + expr = makeJsonByteaToTextConversion(expr, format, exprLocation(expr)); + *exprtype = TEXTOID; + + jve = makeJsonValueExpr((Expr *) raw_expr, format); + + jve->formatted_expr = (Expr *) expr; + expr = (Node *) jve; + } + else + { + char typcategory; + bool typispreferred; + + get_type_category_preferred(*exprtype, &typcategory, &typispreferred); + + if (*exprtype == UNKNOWNOID || typcategory == TYPCATEGORY_STRING) + { + expr = coerce_to_target_type(pstate, (Node *) expr, *exprtype, + TEXTOID, -1, + COERCION_IMPLICIT, + COERCE_IMPLICIT_CAST, -1); + *exprtype = TEXTOID; + } + + if (format->encoding != JS_ENC_DEFAULT) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + parser_errposition(pstate, format->location), + errmsg("cannot use JSON FORMAT ENCODING clause for non-bytea input types"))); + } + + return expr; +} + +/* + * Transform IS JSON predicate into + * json[b]_is_valid(json, value_type [, check_key_uniqueness]) call. + */ +static Node * +transformJsonIsPredicate(ParseState *pstate, JsonIsPredicate *pred) +{ + Oid exprtype; + Node *expr = transformJsonParseArg(pstate, pred->expr, pred->format, + &exprtype); + + /* make resulting expression */ + if (exprtype != TEXTOID && exprtype != JSONOID && exprtype != JSONBOID) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("cannot use type %s in IS JSON predicate", + format_type_be(exprtype)))); + + return makeJsonIsPredicate(expr, NULL, pred->value_type, + pred->unique_keys, pred->location); +} diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c index d088fafc56..5edcb8bb60 100644 --- a/src/backend/utils/adt/json.c +++ b/src/backend/utils/adt/json.c @@ -13,6 +13,7 @@ */ #include "postgres.h" +#include "access/hash.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "common/hashfn.h" @@ -1655,6 +1656,94 @@ escape_json(StringInfo buf, const char *str) appendStringInfoCharMacro(buf, '"'); } +/* Semantic actions for key uniqueness check */ +static void +json_unique_object_start(void *_state) +{ + JsonUniqueParsingState *state = _state; + JsonUniqueStackEntry *entry; + + if (!state->unique) + return; + + /* push object entry to stack */ + entry = palloc(sizeof(*entry)); + entry->object_id = state->id_counter++; + entry->parent = state->stack; + state->stack = entry; +} + +static void +json_unique_object_end(void *_state) +{ + JsonUniqueParsingState *state = _state; + JsonUniqueStackEntry *entry; + + if (!state->unique) + return; + + entry = state->stack; + state->stack = entry->parent; /* pop object from stack */ + pfree(entry); +} + +static void +json_unique_object_field_start(void *_state, char *field, bool isnull) +{ + JsonUniqueParsingState *state = _state; + JsonUniqueStackEntry *entry; + + if (!state->unique) + return; + + /* find key collision in the current object */ + if (json_unique_check_key(&state->check, field, state->stack->object_id)) + return; + + state->unique = false; + + /* pop all objects entries */ + while ((entry = state->stack)) + { + state->stack = entry->parent; + pfree(entry); + } +} + +/* Validate JSON text and additionally check key uniqueness */ +bool +json_validate(text *json, bool check_unique_keys) +{ + JsonLexContext *lex = makeJsonLexContext(json, check_unique_keys); + JsonSemAction uniqueSemAction = {0}; + JsonUniqueParsingState state; + JsonParseErrorType result; + + if (check_unique_keys) + { + state.lex = lex; + state.stack = NULL; + state.id_counter = 0; + state.unique = true; + json_unique_check_init(&state.check); + + uniqueSemAction.semstate = &state; + uniqueSemAction.object_start = json_unique_object_start; + uniqueSemAction.object_field_start = json_unique_object_field_start; + uniqueSemAction.object_end = json_unique_object_end; + } + + result = pg_parse_json(lex, check_unique_keys ? &uniqueSemAction : &nullSemAction); + + if (result != JSON_SUCCESS) + return false; /* invalid json */ + + if (check_unique_keys && !state.unique) + return false; /* not unique keys */ + + return true; /* ok */ +} + /* * SQL function json_typeof(json) -> text * @@ -1670,21 +1759,13 @@ escape_json(StringInfo buf, const char *str) Datum json_typeof(PG_FUNCTION_ARGS) { - text *json; - - JsonLexContext *lex; - JsonTokenType tok; + text *json = PG_GETARG_TEXT_PP(0); char *type; - JsonParseErrorType result; - - json = PG_GETARG_TEXT_PP(0); - lex = makeJsonLexContext(json, false); + JsonTokenType tok; /* Lex exactly one token from the input and check its type. */ - result = json_lex(lex); - if (result != JSON_SUCCESS) - json_ereport_error(result, lex); - tok = lex->token_type; + tok = json_get_first_token(json, true); + switch (tok) { case JSON_TOKEN_OBJECT_START: diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index 29664aa6e4..a24d498b06 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -5528,3 +5528,23 @@ transform_string_values_scalar(void *state, char *token, JsonTokenType tokentype else appendStringInfoString(_state->strval, token); } + +JsonTokenType +json_get_first_token(text *json, bool throw_error) +{ + JsonLexContext *lex; + JsonParseErrorType result; + + lex = makeJsonLexContext(json, false); + + /* Lex exactly one token from the input and check its type. */ + result = json_lex(lex); + + if (result == JSON_SUCCESS) + return lex->token_type; + + if (throw_error) + json_ereport_error(result, lex); + + return JSON_TOKEN_INVALID; /* invalid json */ +} diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 38da269519..0ed774f6e6 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -8230,6 +8230,7 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags) case T_NullTest: case T_BooleanTest: case T_DistinctExpr: + case T_JsonIsPredicate: switch (nodeTag(parentNode)) { case T_FuncExpr: @@ -9635,6 +9636,40 @@ get_rule_expr(Node *node, deparse_context *context, get_json_constructor((JsonConstructorExpr *) node, context, false); break; + case T_JsonIsPredicate: + { + JsonIsPredicate *pred = (JsonIsPredicate *) node; + + if (!PRETTY_PAREN(context)) + appendStringInfoChar(context->buf, '('); + + get_rule_expr_paren(pred->expr, context, true, node); + + appendStringInfoString(context->buf, " IS JSON"); + + switch (pred->value_type) + { + case JS_TYPE_SCALAR: + appendStringInfoString(context->buf, " SCALAR"); + break; + case JS_TYPE_ARRAY: + appendStringInfoString(context->buf, " ARRAY"); + break; + case JS_TYPE_OBJECT: + appendStringInfoString(context->buf, " OBJECT"); + break; + default: + break; + } + + if (pred->unique_keys) + appendStringInfoString(context->buf, " WITH UNIQUE KEYS"); + + if (!PRETTY_PAREN(context)) + appendStringInfoChar(context->buf, ')'); + } + break; + case T_List: { char *sep; diff --git a/src/backend/utils/misc/queryjumble.c b/src/backend/utils/misc/queryjumble.c index d14b751058..8315812793 100644 --- a/src/backend/utils/misc/queryjumble.c +++ b/src/backend/utils/misc/queryjumble.c @@ -775,6 +775,16 @@ JumbleExpr(JumbleState *jstate, Node *node) APP_JUMB(ctor->absent_on_null); } break; + case T_JsonIsPredicate: + { + JsonIsPredicate *pred = (JsonIsPredicate *) node; + + JumbleExpr(jstate, (Node *) pred->expr); + JumbleExpr(jstate, (Node *) pred->format); + APP_JUMB(pred->unique_keys); + APP_JUMB(pred->value_type); + } + break; case T_List: foreach(temp, (List *) node) { diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h index c830fcf726..a41722ae1e 100644 --- a/src/include/executor/execExpr.h +++ b/src/include/executor/execExpr.h @@ -240,6 +240,7 @@ typedef enum ExprEvalOp EEOP_WINDOW_FUNC, EEOP_SUBPLAN, EEOP_JSON_CONSTRUCTOR, + EEOP_IS_JSON, /* aggregation related nodes */ EEOP_AGG_STRICT_DESERIALIZE, @@ -680,6 +681,12 @@ typedef struct ExprEvalStep int nargs; } json_constructor; + /* for EEOP_IS_JSON */ + struct + { + JsonIsPredicate *pred; /* original expression node */ + } is_json; + } d; } ExprEvalStep; @@ -774,6 +781,7 @@ extern void ExecEvalHashedScalarArrayOp(ExprState *state, ExprEvalStep *op, extern void ExecEvalConstraintNotNull(ExprState *state, ExprEvalStep *op); extern void ExecEvalConstraintCheck(ExprState *state, ExprEvalStep *op); extern void ExecEvalXmlExpr(ExprState *state, ExprEvalStep *op); +extern void ExecEvalJsonIsPredicate(ExprState *state, ExprEvalStep *op); extern void ExecEvalGroupingFunc(ExprState *state, ExprEvalStep *op); extern void ExecEvalSubPlan(ExprState *state, ExprEvalStep *op, ExprContext *econtext); diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h index e50b933288..380940968b 100644 --- a/src/include/nodes/makefuncs.h +++ b/src/include/nodes/makefuncs.h @@ -110,6 +110,9 @@ extern JsonFormat *makeJsonFormat(JsonFormatType type, JsonEncoding encoding, int location); extern JsonValueExpr *makeJsonValueExpr(Expr *expr, JsonFormat *format); extern Node *makeJsonKeyValue(Node *key, Node *value); +extern Node *makeJsonIsPredicate(Node *expr, JsonFormat *format, + JsonValueType vtype, bool unique_keys, + int location); extern JsonEncoding makeJsonEncoding(char *name); #endif /* MAKEFUNC_H */ diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index ca440eb75f..e8f30367a4 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -505,6 +505,7 @@ typedef enum NodeTag T_JsonAggConstructor, T_JsonObjectAgg, T_JsonArrayAgg, + T_JsonIsPredicate, T_JsonKeyValue, T_JsonOutput, diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index c48527e998..f4a39653ac 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -1317,6 +1317,32 @@ typedef struct JsonConstructorExpr int location; } JsonConstructorExpr; +/* + * JsonValueType - + * representation of JSON item type in IS JSON predicate + */ +typedef enum JsonValueType +{ + JS_TYPE_ANY, /* IS JSON [VALUE] */ + JS_TYPE_OBJECT, /* IS JSON OBJECT */ + JS_TYPE_ARRAY, /* IS JSON ARRAY*/ + JS_TYPE_SCALAR /* IS JSON SCALAR */ +} JsonValueType; + +/* + * JsonIsPredicate - + * untransformed representation of IS JSON predicate + */ +typedef struct JsonIsPredicate +{ + NodeTag type; + Node *expr; /* untransformed expression */ + JsonFormat *format; /* FORMAT clause, if specified */ + JsonValueType value_type; /* JSON item type */ + bool unique_keys; /* check key uniqueness? */ + int location; /* token location, or -1 if unknown */ +} JsonIsPredicate; + /* ---------------- * NullTest * diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index 10829941e0..c0ffa516d0 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -374,6 +374,7 @@ PG_KEYWORD("row", ROW, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("rows", ROWS, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("rule", RULE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("savepoint", SAVEPOINT, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("scalar", SCALAR, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("schema", SCHEMA, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("schemas", SCHEMAS, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("scroll", SCROLL, UNRESERVED_KEYWORD, BARE_LABEL) diff --git a/src/include/utils/json.h b/src/include/utils/json.h index 63d83b815f..bfe5b21591 100644 --- a/src/include/utils/json.h +++ b/src/include/utils/json.h @@ -26,5 +26,6 @@ extern Datum json_build_object_worker(int nargs, Datum *args, bool *nulls, bool unique_keys); extern Datum json_build_array_worker(int nargs, Datum *args, bool *nulls, Oid *types, bool absent_on_null); +extern bool json_validate(text *json, bool check_unique_keys); #endif /* JSON_H */ diff --git a/src/include/utils/jsonfuncs.h b/src/include/utils/jsonfuncs.h index 865b2ff7c1..cd16b6c0c8 100644 --- a/src/include/utils/jsonfuncs.h +++ b/src/include/utils/jsonfuncs.h @@ -45,6 +45,9 @@ extern void pg_parse_json_or_ereport(JsonLexContext *lex, JsonSemAction *sem); /* report an error during json lexing or parsing */ extern void json_ereport_error(JsonParseErrorType error, JsonLexContext *lex); +/* get first JSON token */ +extern JsonTokenType json_get_first_token(text *json, bool throw_error); + extern uint32 parse_jsonb_index_flags(Jsonb *jb); extern void iterate_jsonb_values(Jsonb *jb, uint32 flags, void *state, JsonIterateStringValuesAction action); diff --git a/src/test/regress/expected/sqljson.out b/src/test/regress/expected/sqljson.out index 7dca5a8a30..27dca7815a 100644 --- a/src/test/regress/expected/sqljson.out +++ b/src/test/regress/expected/sqljson.out @@ -744,3 +744,201 @@ CREATE OR REPLACE VIEW public.json_array_subquery_view AS FROM ( SELECT foo.i FROM ( VALUES (1), (2), (NULL::integer), (4)) foo(i)) q(a)) AS "json_array" DROP VIEW json_array_subquery_view; +-- IS JSON predicate +SELECT NULL IS JSON; + ?column? +---------- + +(1 row) + +SELECT NULL IS NOT JSON; + ?column? +---------- + +(1 row) + +SELECT NULL::json IS JSON; + ?column? +---------- + +(1 row) + +SELECT NULL::jsonb IS JSON; + ?column? +---------- + +(1 row) + +SELECT NULL::text IS JSON; + ?column? +---------- + +(1 row) + +SELECT NULL::bytea IS JSON; + ?column? +---------- + +(1 row) + +SELECT NULL::int IS JSON; +ERROR: cannot use type integer in IS JSON predicate +SELECT '' IS JSON; + ?column? +---------- + f +(1 row) + +SELECT bytea '\x00' IS JSON; +ERROR: invalid byte sequence for encoding "UTF8": 0x00 +CREATE TABLE test_is_json (js text); +INSERT INTO test_is_json VALUES + (NULL), + (''), + ('123'), + ('"aaa "'), + ('true'), + ('null'), + ('[]'), + ('[1, "2", {}]'), + ('{}'), + ('{ "a": 1, "b": null }'), + ('{ "a": 1, "a": null }'), + ('{ "a": 1, "b": [{ "a": 1 }, { "a": 2 }] }'), + ('{ "a": 1, "b": [{ "a": 1, "b": 0, "a": 2 }] }'), + ('aaa'), + ('{a:1}'), + ('["a",]'); +SELECT + js, + js IS JSON "IS JSON", + js IS NOT JSON "IS NOT JSON", + js IS JSON VALUE "IS VALUE", + js IS JSON OBJECT "IS OBJECT", + js IS JSON ARRAY "IS ARRAY", + js IS JSON SCALAR "IS SCALAR", + js IS JSON WITHOUT UNIQUE KEYS "WITHOUT UNIQUE", + js IS JSON WITH UNIQUE KEYS "WITH UNIQUE" +FROM + test_is_json; + js | IS JSON | IS NOT JSON | IS VALUE | IS OBJECT | IS ARRAY | IS SCALAR | WITHOUT UNIQUE | WITH UNIQUE +-----------------------------------------------+---------+-------------+----------+-----------+----------+-----------+----------------+------------- + | | | | | | | | + | f | t | f | f | f | f | f | f + 123 | t | f | t | f | f | t | t | t + "aaa " | t | f | t | f | f | t | t | t + true | t | f | t | f | f | t | t | t + null | t | f | t | f | f | t | t | t + [] | t | f | t | f | t | f | t | t + [1, "2", {}] | t | f | t | f | t | f | t | t + {} | t | f | t | t | f | f | t | t + { "a": 1, "b": null } | t | f | t | t | f | f | t | t + { "a": 1, "a": null } | t | f | t | t | f | f | t | f + { "a": 1, "b": [{ "a": 1 }, { "a": 2 }] } | t | f | t | t | f | f | t | t + { "a": 1, "b": [{ "a": 1, "b": 0, "a": 2 }] } | t | f | t | t | f | f | t | f + aaa | f | t | f | f | f | f | f | f + {a:1} | f | t | f | f | f | f | f | f + ["a",] | f | t | f | f | f | f | f | f +(16 rows) + +SELECT + js, + js IS JSON "IS JSON", + js IS NOT JSON "IS NOT JSON", + js IS JSON VALUE "IS VALUE", + js IS JSON OBJECT "IS OBJECT", + js IS JSON ARRAY "IS ARRAY", + js IS JSON SCALAR "IS SCALAR", + js IS JSON WITHOUT UNIQUE KEYS "WITHOUT UNIQUE", + js IS JSON WITH UNIQUE KEYS "WITH UNIQUE" +FROM + (SELECT js::json FROM test_is_json WHERE js IS JSON) foo(js); + js | IS JSON | IS NOT JSON | IS VALUE | IS OBJECT | IS ARRAY | IS SCALAR | WITHOUT UNIQUE | WITH UNIQUE +-----------------------------------------------+---------+-------------+----------+-----------+----------+-----------+----------------+------------- + 123 | t | f | t | f | f | t | t | t + "aaa " | t | f | t | f | f | t | t | t + true | t | f | t | f | f | t | t | t + null | t | f | t | f | f | t | t | t + [] | t | f | t | f | t | f | t | t + [1, "2", {}] | t | f | t | f | t | f | t | t + {} | t | f | t | t | f | f | t | t + { "a": 1, "b": null } | t | f | t | t | f | f | t | t + { "a": 1, "a": null } | t | f | t | t | f | f | t | f + { "a": 1, "b": [{ "a": 1 }, { "a": 2 }] } | t | f | t | t | f | f | t | t + { "a": 1, "b": [{ "a": 1, "b": 0, "a": 2 }] } | t | f | t | t | f | f | t | f +(11 rows) + +SELECT + js0, + js IS JSON "IS JSON", + js IS NOT JSON "IS NOT JSON", + js IS JSON VALUE "IS VALUE", + js IS JSON OBJECT "IS OBJECT", + js IS JSON ARRAY "IS ARRAY", + js IS JSON SCALAR "IS SCALAR", + js IS JSON WITHOUT UNIQUE KEYS "WITHOUT UNIQUE", + js IS JSON WITH UNIQUE KEYS "WITH UNIQUE" +FROM + (SELECT js, js::bytea FROM test_is_json WHERE js IS JSON) foo(js0, js); + js0 | IS JSON | IS NOT JSON | IS VALUE | IS OBJECT | IS ARRAY | IS SCALAR | WITHOUT UNIQUE | WITH UNIQUE +-----------------------------------------------+---------+-------------+----------+-----------+----------+-----------+----------------+------------- + 123 | t | f | t | f | f | t | t | t + "aaa " | t | f | t | f | f | t | t | t + true | t | f | t | f | f | t | t | t + null | t | f | t | f | f | t | t | t + [] | t | f | t | f | t | f | t | t + [1, "2", {}] | t | f | t | f | t | f | t | t + {} | t | f | t | t | f | f | t | t + { "a": 1, "b": null } | t | f | t | t | f | f | t | t + { "a": 1, "a": null } | t | f | t | t | f | f | t | f + { "a": 1, "b": [{ "a": 1 }, { "a": 2 }] } | t | f | t | t | f | f | t | t + { "a": 1, "b": [{ "a": 1, "b": 0, "a": 2 }] } | t | f | t | t | f | f | t | f +(11 rows) + +SELECT + js, + js IS JSON "IS JSON", + js IS NOT JSON "IS NOT JSON", + js IS JSON VALUE "IS VALUE", + js IS JSON OBJECT "IS OBJECT", + js IS JSON ARRAY "IS ARRAY", + js IS JSON SCALAR "IS SCALAR", + js IS JSON WITHOUT UNIQUE KEYS "WITHOUT UNIQUE", + js IS JSON WITH UNIQUE KEYS "WITH UNIQUE" +FROM + (SELECT js::jsonb FROM test_is_json WHERE js IS JSON) foo(js); + js | IS JSON | IS NOT JSON | IS VALUE | IS OBJECT | IS ARRAY | IS SCALAR | WITHOUT UNIQUE | WITH UNIQUE +-------------------------------------+---------+-------------+----------+-----------+----------+-----------+----------------+------------- + 123 | t | f | t | f | f | t | t | t + "aaa " | t | f | t | f | f | t | t | t + true | t | f | t | f | f | t | t | t + null | t | f | t | f | f | t | t | t + [] | t | f | t | f | t | f | t | t + [1, "2", {}] | t | f | t | f | t | f | t | t + {} | t | f | t | t | f | f | t | t + {"a": 1, "b": null} | t | f | t | t | f | f | t | t + {"a": null} | t | f | t | t | f | f | t | t + {"a": 1, "b": [{"a": 1}, {"a": 2}]} | t | f | t | t | f | f | t | t + {"a": 1, "b": [{"a": 2, "b": 0}]} | t | f | t | t | f | f | t | t +(11 rows) + +-- Test IS JSON deparsing +EXPLAIN (VERBOSE, COSTS OFF) +SELECT '1' IS JSON AS "any", ('1' || i) IS JSON SCALAR AS "scalar", '[]' IS NOT JSON ARRAY AS "array", '{}' IS JSON OBJECT WITH UNIQUE AS "object" FROM generate_series(1, 3) i; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------------------------------- + Function Scan on pg_catalog.generate_series i + Output: ('1'::text IS JSON), (('1'::text || (i)::text) IS JSON SCALAR), (NOT ('[]'::text IS JSON ARRAY)), ('{}'::text IS JSON OBJECT WITH UNIQUE KEYS) + Function Call: generate_series(1, 3) +(3 rows) + +CREATE VIEW is_json_view AS +SELECT '1' IS JSON AS "any", ('1' || i) IS JSON SCALAR AS "scalar", '[]' IS NOT JSON ARRAY AS "array", '{}' IS JSON OBJECT WITH UNIQUE AS "object" FROM generate_series(1, 3) i; +\sv is_json_view +CREATE OR REPLACE VIEW public.is_json_view AS + SELECT '1'::text IS JSON AS "any", + ('1'::text || i.i) IS JSON SCALAR AS scalar, + NOT '[]'::text IS JSON ARRAY AS "array", + '{}'::text IS JSON OBJECT WITH UNIQUE KEYS AS object + FROM generate_series(1, 3) i(i) +DROP VIEW is_json_view; diff --git a/src/test/regress/sql/sqljson.sql b/src/test/regress/sql/sqljson.sql index aaef2d8aab..4f3c06dcb3 100644 --- a/src/test/regress/sql/sqljson.sql +++ b/src/test/regress/sql/sqljson.sql @@ -280,3 +280,99 @@ SELECT JSON_ARRAY(SELECT i FROM (VALUES (1), (2), (NULL), (4)) foo(i) RETURNING \sv json_array_subquery_view DROP VIEW json_array_subquery_view; + +-- IS JSON predicate +SELECT NULL IS JSON; +SELECT NULL IS NOT JSON; +SELECT NULL::json IS JSON; +SELECT NULL::jsonb IS JSON; +SELECT NULL::text IS JSON; +SELECT NULL::bytea IS JSON; +SELECT NULL::int IS JSON; + +SELECT '' IS JSON; + +SELECT bytea '\x00' IS JSON; + +CREATE TABLE test_is_json (js text); + +INSERT INTO test_is_json VALUES + (NULL), + (''), + ('123'), + ('"aaa "'), + ('true'), + ('null'), + ('[]'), + ('[1, "2", {}]'), + ('{}'), + ('{ "a": 1, "b": null }'), + ('{ "a": 1, "a": null }'), + ('{ "a": 1, "b": [{ "a": 1 }, { "a": 2 }] }'), + ('{ "a": 1, "b": [{ "a": 1, "b": 0, "a": 2 }] }'), + ('aaa'), + ('{a:1}'), + ('["a",]'); + +SELECT + js, + js IS JSON "IS JSON", + js IS NOT JSON "IS NOT JSON", + js IS JSON VALUE "IS VALUE", + js IS JSON OBJECT "IS OBJECT", + js IS JSON ARRAY "IS ARRAY", + js IS JSON SCALAR "IS SCALAR", + js IS JSON WITHOUT UNIQUE KEYS "WITHOUT UNIQUE", + js IS JSON WITH UNIQUE KEYS "WITH UNIQUE" +FROM + test_is_json; + +SELECT + js, + js IS JSON "IS JSON", + js IS NOT JSON "IS NOT JSON", + js IS JSON VALUE "IS VALUE", + js IS JSON OBJECT "IS OBJECT", + js IS JSON ARRAY "IS ARRAY", + js IS JSON SCALAR "IS SCALAR", + js IS JSON WITHOUT UNIQUE KEYS "WITHOUT UNIQUE", + js IS JSON WITH UNIQUE KEYS "WITH UNIQUE" +FROM + (SELECT js::json FROM test_is_json WHERE js IS JSON) foo(js); + +SELECT + js0, + js IS JSON "IS JSON", + js IS NOT JSON "IS NOT JSON", + js IS JSON VALUE "IS VALUE", + js IS JSON OBJECT "IS OBJECT", + js IS JSON ARRAY "IS ARRAY", + js IS JSON SCALAR "IS SCALAR", + js IS JSON WITHOUT UNIQUE KEYS "WITHOUT UNIQUE", + js IS JSON WITH UNIQUE KEYS "WITH UNIQUE" +FROM + (SELECT js, js::bytea FROM test_is_json WHERE js IS JSON) foo(js0, js); + +SELECT + js, + js IS JSON "IS JSON", + js IS NOT JSON "IS NOT JSON", + js IS JSON VALUE "IS VALUE", + js IS JSON OBJECT "IS OBJECT", + js IS JSON ARRAY "IS ARRAY", + js IS JSON SCALAR "IS SCALAR", + js IS JSON WITHOUT UNIQUE KEYS "WITHOUT UNIQUE", + js IS JSON WITH UNIQUE KEYS "WITH UNIQUE" +FROM + (SELECT js::jsonb FROM test_is_json WHERE js IS JSON) foo(js); + +-- Test IS JSON deparsing +EXPLAIN (VERBOSE, COSTS OFF) +SELECT '1' IS JSON AS "any", ('1' || i) IS JSON SCALAR AS "scalar", '[]' IS NOT JSON ARRAY AS "array", '{}' IS JSON OBJECT WITH UNIQUE AS "object" FROM generate_series(1, 3) i; + +CREATE VIEW is_json_view AS +SELECT '1' IS JSON AS "any", ('1' || i) IS JSON SCALAR AS "scalar", '[]' IS NOT JSON ARRAY AS "array", '{}' IS JSON OBJECT WITH UNIQUE AS "object" FROM generate_series(1, 3) i; + +\sv is_json_view + +DROP VIEW is_json_view; From 091a971bb59ca9751f32a4aa5aee969c5a915754 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 29 Mar 2022 09:06:51 +0900 Subject: [PATCH 289/772] Modify query on pg_hba_file_rules to check for errors in regression tests The regression tests include a query to check the execution path of pg_hba_file_rules, but it has never checked that a given cluster has correct contents in pg_hba.conf. This commit extends the query of pg_hba_file_rules to report any errors if anything bad is found. For EXEC_BACKEND builds, any connection attempt would fail when loading pg_hba.conf if any incorrect content is found when parsed, so a failure would be detected before even running this query. However, this can become handy for clusters where pg_hba.conf can be reloaded, where new connection attempts are not subject to a fresh loading of pg_hba.conf. Author: Julien Rouhaud, based on an idea from me Discussion: https://postgr.es/m/YkFhpydhyeNNo3Xl@paquier.xyz --- src/test/regress/expected/sysviews.out | 11 ++++++----- src/test/regress/sql/sysviews.sql | 5 +++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/test/regress/expected/sysviews.out b/src/test/regress/expected/sysviews.out index 442eeb1e3f..92b48502dd 100644 --- a/src/test/regress/expected/sysviews.out +++ b/src/test/regress/expected/sysviews.out @@ -48,11 +48,12 @@ select count(*) >= 0 as ok from pg_file_settings; t (1 row) --- There will surely be at least one rule -select count(*) > 0 as ok from pg_hba_file_rules; - ok ----- - t +-- There will surely be at least one rule, with no errors. +select count(*) > 0 as ok, count(*) FILTER (WHERE error IS NOT NULL) = 0 AS no_err + from pg_hba_file_rules; + ok | no_err +----+-------- + t | t (1 row) -- There will surely be at least one active lock diff --git a/src/test/regress/sql/sysviews.sql b/src/test/regress/sql/sysviews.sql index 4980f07be2..77e48ef7cc 100644 --- a/src/test/regress/sql/sysviews.sql +++ b/src/test/regress/sql/sysviews.sql @@ -25,8 +25,9 @@ select count(*) = 0 as ok from pg_cursors; select count(*) >= 0 as ok from pg_file_settings; --- There will surely be at least one rule -select count(*) > 0 as ok from pg_hba_file_rules; +-- There will surely be at least one rule, with no errors. +select count(*) > 0 as ok, count(*) FILTER (WHERE error IS NOT NULL) = 0 AS no_err + from pg_hba_file_rules; -- There will surely be at least one active lock select count(*) > 0 as ok from pg_locks; From a2c84990bea7beadb599d02328190e2a763dcb86 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 29 Mar 2022 10:15:48 +0900 Subject: [PATCH 290/772] Add system view pg_ident_file_mappings This view is similar to pg_hba_file_rules view, except that it is associated with the parsing of pg_ident.conf. Similarly to its cousin, this view is useful to check via SQL if changes planned in pg_ident.conf would work upon reload or restart, or to diagnose a previous failure. Bumps catalog version. Author: Julien Rouhaud Reviewed-by: Aleksander Alekseev, Michael Paquier Discussion: https://postgr.es/m/20220223045959.35ipdsvbxcstrhya@jrouhaud --- doc/src/sgml/catalogs.sgml | 107 +++++++++++++++++++ doc/src/sgml/client-auth.sgml | 10 ++ doc/src/sgml/func.sgml | 5 +- src/backend/catalog/system_views.sql | 6 ++ src/backend/libpq/hba.c | 31 +++--- src/backend/utils/adt/hbafuncs.c | 136 +++++++++++++++++++++++++ src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.dat | 6 ++ src/include/libpq/hba.h | 1 + src/test/regress/expected/rules.out | 6 ++ src/test/regress/expected/sysviews.out | 8 ++ src/test/regress/sql/sysviews.sql | 4 + 12 files changed, 305 insertions(+), 17 deletions(-) diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 23e06b81a4..7f4f79d1b5 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -9591,6 +9591,11 @@ SCRAM-SHA-256$<iteration count>:&l summary of client authentication configuration file contents + + pg_ident_file_mappings + summary of client user name mapping configuration file contents + + pg_indexes indexes @@ -10589,6 +10594,108 @@ SCRAM-SHA-256$<iteration count>:&l
+ + <structname>pg_ident_file_mappings</structname> + + + pg_ident_file_mappings + + + + The view pg_ident_file_mappings provides a summary + of the contents of the client user name mapping configuration file, + pg_ident.conf. + A row appears in this view for each non-empty, non-comment line in the file, + with annotations indicating whether the rule could be applied successfully. + + + + This view can be helpful for checking whether planned changes in the + authentication configuration file will work, or for diagnosing a previous + failure. Note that this view reports on the current + contents of the file, not on what was last loaded by the server. + + + + By default, the pg_ident_file_mappings view can be + read only by superusers. + + + + <structname>pg_ident_file_mappings</structname> Columns + + + + Column Type + + + Description + + + + + + + + line_number int4 + + + Line number of this rule in pg_ident.conf + + + + + + map_name text + + + Name of the map + + + + + + sys_name text + + + Detected user name of the client + + + + + + pg_username text + + + Requested PostgreSQL user name + + + + + + error text + + + If not NULL, an error message indicating why this + line could not be processed + + + + +
+ + + Usually, a row reflecting an incorrect entry will have values for only + the line_number and error fields. + + + + See for more information about + client authentication configuration. + +
+ <structname>pg_indexes</structname> diff --git a/doc/src/sgml/client-auth.sgml b/doc/src/sgml/client-auth.sgml index 02f0489112..142b0affcb 100644 --- a/doc/src/sgml/client-auth.sgml +++ b/doc/src/sgml/client-auth.sgml @@ -896,6 +896,16 @@ mymap /^(.*)@otherdomain\.com$ guest -HUP) to make it re-read the file. + + The system view + pg_ident_file_mappings + can be helpful for pre-testing changes to the + pg_ident.conf file, or for diagnosing problems if + loading of the file did not have the desired effects. Rows in the view with + non-null error fields indicate problems in the + corresponding lines of the file. + + A pg_ident.conf file that could be used in conjunction with the pg_hba.conf file in SIGHUP signal to the postmaster process, which in turn sends SIGHUP to each of its children.) You can use the - pg_file_settings and - pg_hba_file_rules views + pg_file_settings, + pg_hba_file_rules and + pg_ident_file_mappings views to check the configuration files for possible errors, before reloading. diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 9570a53e7b..9eaa51df29 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -617,6 +617,12 @@ CREATE VIEW pg_hba_file_rules AS REVOKE ALL ON pg_hba_file_rules FROM PUBLIC; REVOKE EXECUTE ON FUNCTION pg_hba_file_rules() FROM PUBLIC; +CREATE VIEW pg_ident_file_mappings AS + SELECT * FROM pg_ident_file_mappings() AS A; + +REVOKE ALL ON pg_ident_file_mappings FROM PUBLIC; +REVOKE EXECUTE ON FUNCTION pg_ident_file_mappings() FROM PUBLIC; + CREATE VIEW pg_timezone_abbrevs AS SELECT * FROM pg_timezone_abbrevs(); diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index 673135144d..f8393ca8ed 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -887,25 +887,22 @@ do { \ } while (0) /* - * Macros for handling pg_ident problems. - * Much as above, but currently the message level is hardwired as LOG - * and there is no provision for an err_msg string. + * Macros for handling pg_ident problems, similar as above. * * IDENT_FIELD_ABSENT: - * Log a message and exit the function if the given ident field ListCell is - * not populated. + * Reports when the given ident field ListCell is not populated. * * IDENT_MULTI_VALUE: - * Log a message and exit the function if the given ident token List has more - * than one element. + * Reports when the given ident token List has more than one element. */ #define IDENT_FIELD_ABSENT(field) \ do { \ if (!field) { \ - ereport(LOG, \ + ereport(elevel, \ (errcode(ERRCODE_CONFIG_FILE_ERROR), \ errmsg("missing entry in file \"%s\" at end of line %d", \ IdentFileName, line_num))); \ + *err_msg = psprintf("missing entry at end of line"); \ return NULL; \ } \ } while (0) @@ -913,11 +910,12 @@ do { \ #define IDENT_MULTI_VALUE(tokens) \ do { \ if (tokens->length > 1) { \ - ereport(LOG, \ + ereport(elevel, \ (errcode(ERRCODE_CONFIG_FILE_ERROR), \ errmsg("multiple values in ident field"), \ errcontext("line %d of configuration file \"%s\"", \ line_num, IdentFileName))); \ + *err_msg = psprintf("multiple values in ident field"); \ return NULL; \ } \ } while (0) @@ -2306,7 +2304,8 @@ load_hba(void) * Parse one tokenised line from the ident config file and store the result in * an IdentLine structure. * - * If parsing fails, log a message and return NULL. + * If parsing fails, log a message at ereport level elevel, store an error + * string in tok_line->err_msg and return NULL. * * If ident_user is a regular expression (ie. begins with a slash), it is * compiled and stored in IdentLine structure. @@ -2315,10 +2314,11 @@ load_hba(void) * to have set a memory context that will be reset if this function returns * NULL. */ -static IdentLine * -parse_ident_line(TokenizedAuthLine *tok_line) +IdentLine * +parse_ident_line(TokenizedAuthLine *tok_line, int elevel) { int line_num = tok_line->line_num; + char **err_msg = &tok_line->err_msg; ListCell *field; List *tokens; AuthToken *token; @@ -2372,11 +2372,14 @@ parse_ident_line(TokenizedAuthLine *tok_line) char errstr[100]; pg_regerror(r, &parsedline->re, errstr, sizeof(errstr)); - ereport(LOG, + ereport(elevel, (errcode(ERRCODE_INVALID_REGULAR_EXPRESSION), errmsg("invalid regular expression \"%s\": %s", parsedline->ident_user + 1, errstr))); + *err_msg = psprintf("invalid regular expression \"%s\": %s", + parsedline->ident_user + 1, errstr); + pfree(wstr); return NULL; } @@ -2627,7 +2630,7 @@ load_ident(void) continue; } - if ((newline = parse_ident_line(tok_line)) == NULL) + if ((newline = parse_ident_line(tok_line, LOG)) == NULL) { /* Parse error; remember there's trouble */ ok = false; diff --git a/src/backend/utils/adt/hbafuncs.c b/src/backend/utils/adt/hbafuncs.c index f46cd935a1..9fe7b62c9a 100644 --- a/src/backend/utils/adt/hbafuncs.c +++ b/src/backend/utils/adt/hbafuncs.c @@ -28,6 +28,9 @@ static ArrayType *get_hba_options(HbaLine *hba); static void fill_hba_line(Tuplestorestate *tuple_store, TupleDesc tupdesc, int lineno, HbaLine *hba, const char *err_msg); static void fill_hba_view(Tuplestorestate *tuple_store, TupleDesc tupdesc); +static void fill_ident_line(Tuplestorestate *tuple_store, TupleDesc tupdesc, + int lineno, IdentLine *ident, const char *err_msg); +static void fill_ident_view(Tuplestorestate *tuple_store, TupleDesc tupdesc); /* @@ -426,3 +429,136 @@ pg_hba_file_rules(PG_FUNCTION_ARGS) PG_RETURN_NULL(); } + +/* Number of columns in pg_ident_file_mappings view */ +#define NUM_PG_IDENT_FILE_MAPPINGS_ATTS 5 + +/* + * fill_ident_line: build one row of pg_ident_file_mappings view, add it to + * tuplestore + * + * tuple_store: where to store data + * tupdesc: tuple descriptor for the view + * lineno: pg_ident.conf line number (must always be valid) + * ident: parsed line data (can be NULL, in which case err_msg should be set) + * err_msg: error message (NULL if none) + * + * Note: leaks memory, but we don't care since this is run in a short-lived + * memory context. + */ +static void +fill_ident_line(Tuplestorestate *tuple_store, TupleDesc tupdesc, + int lineno, IdentLine *ident, const char *err_msg) +{ + Datum values[NUM_PG_IDENT_FILE_MAPPINGS_ATTS]; + bool nulls[NUM_PG_IDENT_FILE_MAPPINGS_ATTS]; + HeapTuple tuple; + int index; + + Assert(tupdesc->natts == NUM_PG_IDENT_FILE_MAPPINGS_ATTS); + + memset(values, 0, sizeof(values)); + memset(nulls, 0, sizeof(nulls)); + index = 0; + + /* line_number */ + values[index++] = Int32GetDatum(lineno); + + if (ident != NULL) + { + values[index++] = CStringGetTextDatum(ident->usermap); + values[index++] = CStringGetTextDatum(ident->ident_user); + values[index++] = CStringGetTextDatum(ident->pg_role); + } + else + { + /* no parsing result, so set relevant fields to nulls */ + memset(&nulls[1], true, (NUM_PG_IDENT_FILE_MAPPINGS_ATTS - 2) * sizeof(bool)); + } + + /* error */ + if (err_msg) + values[NUM_PG_IDENT_FILE_MAPPINGS_ATTS - 1] = CStringGetTextDatum(err_msg); + else + nulls[NUM_PG_IDENT_FILE_MAPPINGS_ATTS - 1] = true; + + tuple = heap_form_tuple(tupdesc, values, nulls); + tuplestore_puttuple(tuple_store, tuple); +} + +/* + * Read the pg_ident.conf file and fill the tuplestore with view records. + */ +static void +fill_ident_view(Tuplestorestate *tuple_store, TupleDesc tupdesc) +{ + FILE *file; + List *ident_lines = NIL; + ListCell *line; + MemoryContext linecxt; + MemoryContext identcxt; + MemoryContext oldcxt; + + /* + * In the unlikely event that we can't open pg_ident.conf, we throw an + * error, rather than trying to report it via some sort of view entry. + * (Most other error conditions should result in a message in a view + * entry.) + */ + file = AllocateFile(IdentFileName, "r"); + if (file == NULL) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open usermap file \"%s\": %m", + IdentFileName))); + + linecxt = tokenize_auth_file(HbaFileName, file, &ident_lines, DEBUG3); + FreeFile(file); + + /* Now parse all the lines */ + identcxt = AllocSetContextCreate(CurrentMemoryContext, + "ident parser context", + ALLOCSET_SMALL_SIZES); + oldcxt = MemoryContextSwitchTo(identcxt); + foreach(line, ident_lines) + { + TokenizedAuthLine *tok_line = (TokenizedAuthLine *) lfirst(line); + IdentLine *identline = NULL; + + /* don't parse lines that already have errors */ + if (tok_line->err_msg == NULL) + identline = parse_ident_line(tok_line, DEBUG3); + + fill_ident_line(tuple_store, tupdesc, tok_line->line_num, identline, + tok_line->err_msg); + } + + /* Free tokenizer memory */ + MemoryContextDelete(linecxt); + /* Free parse_ident_line memory */ + MemoryContextSwitchTo(oldcxt); + MemoryContextDelete(identcxt); +} + +/* + * SQL-accessible SRF to return all the entries in the pg_ident.conf file. + */ +Datum +pg_ident_file_mappings(PG_FUNCTION_ARGS) +{ + ReturnSetInfo *rsi; + + /* + * Build tuplestore to hold the result rows. We must use the Materialize + * mode to be safe against HBA file changes while the cursor is open. It's + * also more efficient than having to look up our current position in the + * parsed list every time. + */ + SetSingleFuncCall(fcinfo, 0); + + /* Fill the tuplestore */ + rsi = (ReturnSetInfo *) fcinfo->resultinfo; + fill_ident_view(rsi->setResult, rsi->setDesc); + + PG_RETURN_NULL(); +} diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 05c677e816..96649193d9 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202203272 +#define CATALOG_VERSION_NO 202203291 #endif diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index deb00307f6..01e1dd4d6d 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -6115,6 +6115,12 @@ proargmodes => '{o,o,o,o,o,o,o,o,o}', proargnames => '{line_number,type,database,user_name,address,netmask,auth_method,options,error}', prosrc => 'pg_hba_file_rules' }, +{ oid => '9556', descr => 'show pg_ident.conf mappings', + proname => 'pg_ident_file_mappings', prorows => '1000', proretset => 't', + provolatile => 'v', prorettype => 'record', proargtypes => '', + proallargtypes => '{int4,text,text,text,text}', proargmodes => '{o,o,o,o,o}', + proargnames => '{line_number,map_name,sys_name,pg_username,error}', + prosrc => 'pg_ident_file_mappings' }, { oid => '1371', descr => 'view system lock information', proname => 'pg_lock_status', prorows => '1000', proretset => 't', provolatile => 'v', prorettype => 'record', proargtypes => '', diff --git a/src/include/libpq/hba.h b/src/include/libpq/hba.h index 13ecb329f8..90036f7bcd 100644 --- a/src/include/libpq/hba.h +++ b/src/include/libpq/hba.h @@ -171,6 +171,7 @@ extern int check_usermap(const char *usermap_name, const char *pg_role, const char *auth_user, bool case_sensitive); extern HbaLine *parse_hba_line(TokenizedAuthLine *tok_line, int elevel); +extern IdentLine *parse_ident_line(TokenizedAuthLine *tok_line, int elevel); extern bool pg_isblank(const char c); extern MemoryContext tokenize_auth_file(const char *filename, FILE *file, List **tok_lines, int elevel); diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 92e1a2f6d8..423b9b99fb 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -1347,6 +1347,12 @@ pg_hba_file_rules| SELECT a.line_number, a.options, a.error FROM pg_hba_file_rules() a(line_number, type, database, user_name, address, netmask, auth_method, options, error); +pg_ident_file_mappings| SELECT a.line_number, + a.map_name, + a.sys_name, + a.pg_username, + a.error + FROM pg_ident_file_mappings() a(line_number, map_name, sys_name, pg_username, error); pg_indexes| SELECT n.nspname AS schemaname, c.relname AS tablename, i.relname AS indexname, diff --git a/src/test/regress/expected/sysviews.out b/src/test/regress/expected/sysviews.out index 92b48502dd..579b861d84 100644 --- a/src/test/regress/expected/sysviews.out +++ b/src/test/regress/expected/sysviews.out @@ -56,6 +56,14 @@ select count(*) > 0 as ok, count(*) FILTER (WHERE error IS NOT NULL) = 0 AS no_e t | t (1 row) +-- There may be no rules, and there should be no errors. +select count(*) >= 0 as ok, count(*) FILTER (WHERE error IS NOT NULL) = 0 AS no_err + from pg_ident_file_mappings; + ok | no_err +----+-------- + t | t +(1 row) + -- There will surely be at least one active lock select count(*) > 0 as ok from pg_locks; ok diff --git a/src/test/regress/sql/sysviews.sql b/src/test/regress/sql/sysviews.sql index 77e48ef7cc..351e469c77 100644 --- a/src/test/regress/sql/sysviews.sql +++ b/src/test/regress/sql/sysviews.sql @@ -29,6 +29,10 @@ select count(*) >= 0 as ok from pg_file_settings; select count(*) > 0 as ok, count(*) FILTER (WHERE error IS NOT NULL) = 0 AS no_err from pg_hba_file_rules; +-- There may be no rules, and there should be no errors. +select count(*) >= 0 as ok, count(*) FILTER (WHERE error IS NOT NULL) = 0 AS no_err + from pg_ident_file_mappings; + -- There will surely be at least one active lock select count(*) > 0 as ok from pg_locks; From c14a9eeec4797358922f8696d76716501b86c57d Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 29 Mar 2022 13:52:49 +0900 Subject: [PATCH 291/772] Avoid instabilities with the regression tests of pg_freespacemap It was possible to run those tests with installcheck, but they are actually unstable as concurrent autovacuum jobs could prevent the truncation of the filespace map to happen (aka the scan of pg_database when building the list of relations to clean), an assumption we rely on when checking that the FSM of the relation gets truncated during a manual vacuum after deleting all the relation's data. This commit adds a NO_INSTALLCHECK to disallow installcheck, and introduces the use of a custom configuration file with autovacuum disabled. It happens that we already do that in the recovery test 008_fsm_truncation, for example. Reported-by: Tom Lane, via buildfarm member skink Discussion: https://postgr.es/m/381910.1648401526@sss.pgh.pa.us --- contrib/pg_freespacemap/Makefile | 5 +++++ contrib/pg_freespacemap/pg_freespacemap.conf | 1 + 2 files changed, 6 insertions(+) create mode 100644 contrib/pg_freespacemap/pg_freespacemap.conf diff --git a/contrib/pg_freespacemap/Makefile b/contrib/pg_freespacemap/Makefile index 2d525a1284..b48e4b255b 100644 --- a/contrib/pg_freespacemap/Makefile +++ b/contrib/pg_freespacemap/Makefile @@ -10,8 +10,13 @@ DATA = pg_freespacemap--1.1.sql pg_freespacemap--1.1--1.2.sql \ pg_freespacemap--1.0--1.1.sql PGFILEDESC = "pg_freespacemap - monitoring of free space map" +REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/pg_freespacemap/pg_freespacemap.conf REGRESS = pg_freespacemap +# Disabled because these tests require "autovacuum=off", which +# typical installcheck users do not have (e.g. buildfarm clients). +NO_INSTALLCHECK = 1 + ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) diff --git a/contrib/pg_freespacemap/pg_freespacemap.conf b/contrib/pg_freespacemap/pg_freespacemap.conf new file mode 100644 index 0000000000..96b1ed833d --- /dev/null +++ b/contrib/pg_freespacemap/pg_freespacemap.conf @@ -0,0 +1 @@ +autovacuum = off From 8cd7627c7b19c5a1bb235e7ad91b53856b101e65 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 29 Mar 2022 08:58:54 +0200 Subject: [PATCH 292/772] psql: Add test for psql behavior on server crash Author: Fabien COELHO Discussion: https://www.postgresql.org/message-id/flat/alpine.DEB.2.21.1904132231510.8961@lancre --- src/bin/psql/t/001_basic.pl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl index 44ecd05add..02a84543fd 100644 --- a/src/bin/psql/t/001_basic.pl +++ b/src/bin/psql/t/001_basic.pl @@ -115,4 +115,21 @@ sub psql_fails_like qr/^Asynchronous notification "foo" with payload "bar" received from server process with PID \d+\.$/, 'notification with payload'); +# test behavior and output on server crash +my ($ret, $out, $err) = $node->psql( + 'postgres', + "SELECT 'before' AS running;\n" . + "SELECT pg_terminate_backend(pg_backend_pid());\n" . + "SELECT 'AFTER' AS not_running;\n"); + +is($ret, 2, 'server crash: psql exit code'); +like($out, qr/before/, 'server crash: output before crash'); +ok($out !~ qr/AFTER/, 'server crash: no output after crash'); +is($err, 'psql::2: FATAL: terminating connection due to administrator command +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +psql::2: fatal: connection to server was lost', + 'server crash: error message'); + done_testing(); From ebc8b7d4416d8e0dfb7c05132ef6182fd3daf885 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Tue, 29 Mar 2022 14:02:45 +0200 Subject: [PATCH 293/772] Enable SSL library detection via PQsslAttribute() Currently, libpq client code must have a connection handle before it can query the "library" SSL attribute. This poses problems if the client needs to know what SSL library is in use before constructing a connection string. Allow PQsslAttribute(NULL, "library") to return the library in use -- currently, just "OpenSSL" or NULL. The new behavior is announced with the LIBPQ_HAS_SSL_LIBRARY_DETECTION feature macro, allowing clients to differentiate between a libpq that was compiled without SSL support and a libpq that's just too old to tell. Author: Jacob Champion Reviewed-by: Robert Haas Reviewed-by: Daniel Gustafsson Discussion: https://postgr.es/m/4c8b76ef434a96627170a31c3acd33cbfd6e41f1.camel@vmware.com --- doc/src/sgml/libpq.sgml | 10 +++++++ src/interfaces/libpq/Makefile | 1 + src/interfaces/libpq/fe-secure-openssl.c | 6 ++-- src/interfaces/libpq/libpq-fe.h | 2 ++ src/interfaces/libpq/t/002_api.pl | 20 +++++++++++++ src/interfaces/libpq/test/.gitignore | 1 + src/interfaces/libpq/test/Makefile | 2 +- src/interfaces/libpq/test/testclient.c | 37 ++++++++++++++++++++++++ 8 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 src/interfaces/libpq/t/002_api.pl create mode 100644 src/interfaces/libpq/test/testclient.c diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index 70233aa872..eac5dee9f7 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -2581,6 +2581,16 @@ const char *PQsslAttribute(const PGconn *conn, const char *attribute_name); + + + As a special case, the library attribute may be + queried without an existing connection by passing NULL as the + conn argument. The historical behavior was to return + NULL for any attribute when a NULL conn was provided; + client programs needing to differentiate between the newer and older + implementations may check the + LIBPQ_HAS_SSL_LIBRARY_DETECTION feature macro. + diff --git a/src/interfaces/libpq/Makefile b/src/interfaces/libpq/Makefile index 3c53393fa4..89bf5e0126 100644 --- a/src/interfaces/libpq/Makefile +++ b/src/interfaces/libpq/Makefile @@ -13,6 +13,7 @@ subdir = src/interfaces/libpq top_builddir = ../../.. include $(top_builddir)/src/Makefile.global +export with_ssl PGFILEDESC = "PostgreSQL Access Library" diff --git a/src/interfaces/libpq/fe-secure-openssl.c b/src/interfaces/libpq/fe-secure-openssl.c index d81218a4cc..d3bf57b850 100644 --- a/src/interfaces/libpq/fe-secure-openssl.c +++ b/src/interfaces/libpq/fe-secure-openssl.c @@ -1631,14 +1631,14 @@ PQsslAttributeNames(PGconn *conn) const char * PQsslAttribute(PGconn *conn, const char *attribute_name) { + if (strcmp(attribute_name, "library") == 0) + return "OpenSSL"; + if (!conn) return NULL; if (conn->ssl == NULL) return NULL; - if (strcmp(attribute_name, "library") == 0) - return "OpenSSL"; - if (strcmp(attribute_name, "key_bits") == 0) { static char sslbits_str[12]; diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h index 20eb855abc..7986445f1a 100644 --- a/src/interfaces/libpq/libpq-fe.h +++ b/src/interfaces/libpq/libpq-fe.h @@ -36,6 +36,8 @@ extern "C" #define LIBPQ_HAS_PIPELINING 1 /* Indicates presence of PQsetTraceFlags; also new PQtrace output format */ #define LIBPQ_HAS_TRACE_FLAGS 1 +/* Indicates that PQsslAttribute(NULL, "library") is useful */ +#define LIBPQ_HAS_SSL_LIBRARY_DETECTION 1 /* * Option flags for PQcopyResult diff --git a/src/interfaces/libpq/t/002_api.pl b/src/interfaces/libpq/t/002_api.pl new file mode 100644 index 0000000000..7c6c5788a0 --- /dev/null +++ b/src/interfaces/libpq/t/002_api.pl @@ -0,0 +1,20 @@ +# Copyright (c) 2022, PostgreSQL Global Development Group +use strict; +use warnings; + +use PostgreSQL::Test::Utils; +use Test::More; + +# Test PQsslAttribute(NULL, "library") +my ($out, $err) = run_command(['testclient', '--ssl']); + +if ($ENV{with_ssl} eq 'openssl') +{ + is($out, 'OpenSSL', 'PQsslAttribute(NULL, "library") returns "OpenSSL"'); +} +else +{ + is($err, 'SSL is not enabled', 'PQsslAttribute(NULL, "library") returns NULL'); +} + +done_testing(); diff --git a/src/interfaces/libpq/test/.gitignore b/src/interfaces/libpq/test/.gitignore index 5e803d8816..4b17210483 100644 --- a/src/interfaces/libpq/test/.gitignore +++ b/src/interfaces/libpq/test/.gitignore @@ -1 +1,2 @@ +/testclient /uri-regress diff --git a/src/interfaces/libpq/test/Makefile b/src/interfaces/libpq/test/Makefile index 5421215906..1d45be0c37 100644 --- a/src/interfaces/libpq/test/Makefile +++ b/src/interfaces/libpq/test/Makefile @@ -11,7 +11,7 @@ endif override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) LDFLAGS_INTERNAL += $(libpq_pgport) -PROGS = uri-regress +PROGS = testclient uri-regress all: $(PROGS) diff --git a/src/interfaces/libpq/test/testclient.c b/src/interfaces/libpq/test/testclient.c new file mode 100644 index 0000000000..2c730d83fa --- /dev/null +++ b/src/interfaces/libpq/test/testclient.c @@ -0,0 +1,37 @@ +/* + * testclient.c + * A test program for the libpq public API + * + * Copyright (c) 2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/interfaces/libpq/test/testclient.c + */ + +#include "postgres_fe.h" + +#include "libpq-fe.h" + +static void +print_ssl_library() +{ + const char *lib = PQsslAttribute(NULL, "library"); + + if (!lib) + fprintf(stderr, "SSL is not enabled\n"); + else + printf("%s\n", lib); +} + +int +main(int argc, char *argv[]) +{ + if ((argc > 1) && !strcmp(argv[1], "--ssl")) + { + print_ssl_library(); + return 0; + } + + printf("currently only --ssl is supported\n"); + return 1; +} From 3785d8e98b741749d09f1cfe119ec04961ed07b2 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Tue, 29 Mar 2022 14:53:20 +0200 Subject: [PATCH 294/772] doc: Make UPDATE FROM examples consistent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The original first half of the example used an employees table and an accounts.sales_person foreign key column, while the second half (added in commit 8f889b1083f) used a salesmen table and accounts.sales_id for the foreign key. This makes everything use the original names. Author: Dagfinn Ilmari Mannsåker Discussion: https://postgr.es/m/87o81vqjw0.fsf@wibble.ilmari.org --- doc/src/sgml/ref/update.sgml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/src/sgml/ref/update.sgml b/doc/src/sgml/ref/update.sgml index 3a0285df79..2ab24b0523 100644 --- a/doc/src/sgml/ref/update.sgml +++ b/doc/src/sgml/ref/update.sgml @@ -387,23 +387,23 @@ UPDATE employees SET sales_count = sales_count + 1 WHERE id = Update contact names in an accounts table to match the currently assigned - salesmen: + salespeople: UPDATE accounts SET (contact_first_name, contact_last_name) = - (SELECT first_name, last_name FROM salesmen - WHERE salesmen.id = accounts.sales_id); + (SELECT first_name, last_name FROM employees + WHERE employees.id = accounts.sales_person); A similar result could be accomplished with a join: UPDATE accounts SET contact_first_name = first_name, contact_last_name = last_name - FROM salesmen WHERE salesmen.id = accounts.sales_id; + FROM employees WHERE employees.id = accounts.sales_person; However, the second query may give unexpected results - if salesmen.id is not a unique key, whereas + if employees.id is not a unique key, whereas the first query is guaranteed to raise an error if there are multiple id matches. Also, if there is no match for a particular - accounts.sales_id entry, the first query + accounts.sales_person entry, the first query will set the corresponding name fields to NULL, whereas the second query will not update that row at all. From edea649afbcedd431802a5255cd153538e43ee1d Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 29 Mar 2022 09:24:24 -0400 Subject: [PATCH 295/772] Explain why the startup process can't cause a shortage of sinval slots. Bharath Rupireddy, reviewed by Fujii Masao and Yura Sokolov. Lightly edited by me. Discussion: http://postgr.es/m/CALj2ACU=3_frMkDp9UUeuZoAMjaK1y0Z_q5RFNbGvwi8NM==AA@mail.gmail.com --- src/backend/storage/ipc/sinvaladt.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/backend/storage/ipc/sinvaladt.c b/src/backend/storage/ipc/sinvaladt.c index 68e7160b30..2dec668bbc 100644 --- a/src/backend/storage/ipc/sinvaladt.c +++ b/src/backend/storage/ipc/sinvaladt.c @@ -205,6 +205,14 @@ SInvalShmemSize(void) Size size; size = offsetof(SISeg, procState); + + /* + * In Hot Standby mode, the startup process requests a procState array + * slot using InitRecoveryTransactionEnvironment(). Even though MaxBackends + * doesn't account for the startup process, it is guaranteed to get a + * free slot. This is because the autovacuum launcher and worker processes, + * which are included in MaxBackends, are not started in Hot Standby mode. + */ size = add_size(size, mul_size(sizeof(ProcState), GetMaxBackends())); return size; From bf902c13930c268388644100663f2998868b6e85 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Tue, 29 Mar 2022 15:36:21 +0200 Subject: [PATCH 296/772] Revert "Fix replay of create database records on standby" This reverts commit 49d9cfc68bf4. The approach taken by this patch has problems, so we'll come up with a radically different fix. Discussion: https://postgr.es/m/CA+TgmoYcUPL+WOJL2ZzhH=zmrhj0iOQ=iCFM0SuYqBbqZEamEg@mail.gmail.com --- src/backend/access/transam/xlogrecovery.c | 6 - src/backend/access/transam/xlogutils.c | 159 +------------------- src/backend/commands/dbcommands.c | 57 ------- src/backend/commands/tablespace.c | 17 --- src/include/access/xlogutils.h | 4 - src/test/recovery/t/029_replay_tsp_drops.pl | 67 --------- src/tools/pgindent/typedefs.list | 2 - 7 files changed, 1 insertion(+), 311 deletions(-) delete mode 100644 src/test/recovery/t/029_replay_tsp_drops.pl diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 8b22c4e634..8d2395dae2 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -2047,12 +2047,6 @@ CheckRecoveryConsistency(void) */ XLogCheckInvalidPages(); - /* - * Check if the XLOG sequence contained any unresolved references to - * missing directories. - */ - XLogCheckMissingDirs(); - reachedConsistency = true; ereport(LOG, (errmsg("consistent recovery state reached at %X/%X", diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index 8c1b8216be..511f2f186f 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -54,164 +54,6 @@ bool InRecovery = false; /* Are we in Hot Standby mode? Only valid in startup process, see xlogutils.h */ HotStandbyState standbyState = STANDBY_DISABLED; - -/* - * If a create database WAL record is being replayed more than once during - * crash recovery on a standby, it is possible that either the tablespace - * directory or the template database directory is missing. This happens when - * the directories are removed by replay of subsequent drop records. Note - * that this problem happens only on standby and not on master. On master, a - * checkpoint is created at the end of create database operation. On standby, - * however, such a strategy (creating restart points during replay) is not - * viable because it will slow down WAL replay. - * - * The alternative is to track references to each missing directory - * encountered when performing crash recovery in the following hash table. - * Similar to invalid page table above, the expectation is that each missing - * directory entry should be matched with a drop database or drop tablespace - * WAL record by the end of crash recovery. - */ -typedef struct xl_missing_dir_key -{ - Oid spcNode; - Oid dbNode; -} xl_missing_dir_key; - -typedef struct xl_missing_dir -{ - xl_missing_dir_key key; - char path[MAXPGPATH]; -} xl_missing_dir; - -static HTAB *missing_dir_tab = NULL; - - -/* - * Keep track of a directory that wasn't found while replaying database - * creation records. These should match up with tablespace removal records - * later in the WAL stream; we verify that before reaching consistency. - */ -void -XLogRememberMissingDir(Oid spcNode, Oid dbNode, char *path) -{ - xl_missing_dir_key key; - bool found; - xl_missing_dir *entry; - - /* - * Database OID may be invalid but tablespace OID must be valid. If - * dbNode is InvalidOid, we are logging a missing tablespace directory, - * otherwise we are logging a missing database directory. - */ - Assert(OidIsValid(spcNode)); - - if (missing_dir_tab == NULL) - { - /* create hash table when first needed */ - HASHCTL ctl; - - memset(&ctl, 0, sizeof(ctl)); - ctl.keysize = sizeof(xl_missing_dir_key); - ctl.entrysize = sizeof(xl_missing_dir); - - missing_dir_tab = hash_create("XLOG missing directory table", - 100, - &ctl, - HASH_ELEM | HASH_BLOBS); - } - - key.spcNode = spcNode; - key.dbNode = dbNode; - - entry = hash_search(missing_dir_tab, &key, HASH_ENTER, &found); - - if (found) - { - if (dbNode == InvalidOid) - elog(DEBUG1, "missing directory %s (tablespace %u) already exists: %s", - path, spcNode, entry->path); - else - elog(DEBUG1, "missing directory %s (tablespace %u database %u) already exists: %s", - path, spcNode, dbNode, entry->path); - } - else - { - strlcpy(entry->path, path, sizeof(entry->path)); - if (dbNode == InvalidOid) - elog(DEBUG1, "logged missing dir %s (tablespace %u)", - path, spcNode); - else - elog(DEBUG1, "logged missing dir %s (tablespace %u database %u)", - path, spcNode, dbNode); - } -} - -/* - * Remove an entry from the list of directories not found. This is to be done - * when the matching tablespace removal WAL record is found. - */ -void -XLogForgetMissingDir(Oid spcNode, Oid dbNode) -{ - xl_missing_dir_key key; - - key.spcNode = spcNode; - key.dbNode = dbNode; - - /* Database OID may be invalid but tablespace OID must be valid. */ - Assert(OidIsValid(spcNode)); - - if (missing_dir_tab == NULL) - return; - - if (hash_search(missing_dir_tab, &key, HASH_REMOVE, NULL) != NULL) - { - if (dbNode == InvalidOid) - { - elog(DEBUG2, "forgot missing dir (tablespace %u)", spcNode); - } - else - { - char *path = GetDatabasePath(dbNode, spcNode); - - elog(DEBUG2, "forgot missing dir %s (tablespace %u database %u)", - path, spcNode, dbNode); - pfree(path); - } - } -} - -/* - * This is called at the end of crash recovery, before entering archive - * recovery on a standby. PANIC if the hash table is not empty. - */ -void -XLogCheckMissingDirs(void) -{ - HASH_SEQ_STATUS status; - xl_missing_dir *hentry; - bool foundone = false; - - if (missing_dir_tab == NULL) - return; /* nothing to do */ - - hash_seq_init(&status, missing_dir_tab); - - while ((hentry = (xl_missing_dir *) hash_seq_search(&status)) != NULL) - { - elog(WARNING, "missing directory \"%s\" tablespace %u database %u", - hentry->path, hentry->key.spcNode, hentry->key.dbNode); - foundone = true; - } - - if (foundone) - elog(PANIC, "WAL contains references to missing directories"); - - hash_destroy(missing_dir_tab); - missing_dir_tab = NULL; -} - - /* * During XLOG replay, we may see XLOG records for incremental updates of * pages that no longer exist, because their relation was later dropped or @@ -237,6 +79,7 @@ typedef struct xl_invalid_page static HTAB *invalid_page_tab = NULL; + /* Report a reference to an invalid page */ static void report_invalid_page(int elevel, RelFileNode node, ForkNumber forkno, diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 95771b06a2..623e5ec778 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -30,7 +30,6 @@ #include "access/tableam.h" #include "access/xact.h" #include "access/xloginsert.h" -#include "access/xlogrecovery.h" #include "access/xlogutils.h" #include "catalog/catalog.h" #include "catalog/dependency.h" @@ -2484,9 +2483,7 @@ dbase_redo(XLogReaderState *record) xl_dbase_create_rec *xlrec = (xl_dbase_create_rec *) XLogRecGetData(record); char *src_path; char *dst_path; - char *parent_path; struct stat st; - bool skip = false; src_path = GetDatabasePath(xlrec->src_db_id, xlrec->src_tablespace_id); dst_path = GetDatabasePath(xlrec->db_id, xlrec->tablespace_id); @@ -2504,56 +2501,6 @@ dbase_redo(XLogReaderState *record) (errmsg("some useless files may be left behind in old database directory \"%s\"", dst_path))); } - else if (!reachedConsistency) - { - /* - * It is possible that a drop tablespace record appearing later in - * WAL has already been replayed -- in other words, that we are - * replaying the database creation record a second time with no - * intervening checkpoint. In that case, the tablespace directory - * has already been removed and the create database operation - * cannot be replayed. Skip the replay itself, but remember the - * fact that the tablespace directory is missing, to be matched - * with the expected tablespace drop record later. - */ - parent_path = pstrdup(dst_path); - get_parent_directory(parent_path); - if (!(stat(parent_path, &st) == 0 && S_ISDIR(st.st_mode))) - { - XLogRememberMissingDir(xlrec->tablespace_id, InvalidOid, parent_path); - skip = true; - ereport(WARNING, - (errmsg("skipping replay of database creation WAL record"), - errdetail("The target tablespace \"%s\" directory was not found.", - parent_path), - errhint("A future WAL record that removes the directory before reaching consistent mode is expected."))); - } - pfree(parent_path); - } - - /* - * If the source directory is missing, skip the copy and make a note of - * it for later. - * - * One possible reason for this is that the template database used for - * creating this database may have been dropped, as noted above. - * Moving a database from one tablespace may also be a partner in the - * crime. - */ - if (!(stat(src_path, &st) == 0 && S_ISDIR(st.st_mode)) && - !reachedConsistency) - { - XLogRememberMissingDir(xlrec->src_tablespace_id, xlrec->src_db_id, src_path); - skip = true; - ereport(WARNING, - (errmsg("skipping replay of database creation WAL record"), - errdetail("The source database directory \"%s\" was not found.", - src_path), - errhint("A future WAL record that removes the directory before reaching consistent mode is expected."))); - } - - if (skip) - return; /* * Force dirty buffers out to disk, to ensure source database is @@ -2616,10 +2563,6 @@ dbase_redo(XLogReaderState *record) ereport(WARNING, (errmsg("some useless files may be left behind in old database directory \"%s\"", dst_path))); - - if (!reachedConsistency) - XLogForgetMissingDir(xlrec->tablespace_ids[i], xlrec->db_id); - pfree(dst_path); } diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c index 55f40831da..40514ab550 100644 --- a/src/backend/commands/tablespace.c +++ b/src/backend/commands/tablespace.c @@ -57,7 +57,6 @@ #include "access/tableam.h" #include "access/xact.h" #include "access/xloginsert.h" -#include "access/xlogrecovery.h" #include "access/xlogutils.h" #include "catalog/catalog.h" #include "catalog/dependency.h" @@ -1575,22 +1574,6 @@ tblspc_redo(XLogReaderState *record) { xl_tblspc_drop_rec *xlrec = (xl_tblspc_drop_rec *) XLogRecGetData(record); - if (!reachedConsistency) - XLogForgetMissingDir(xlrec->ts_id, InvalidOid); - - /* - * Before we remove the tablespace directory, update minimum recovery - * point to cover this WAL record. Once the tablespace is removed, - * there's no going back. This manually enforces the WAL-first rule. - * Doing this before the removal means that if the removal fails for - * some reason, the directory is left alone and needs to be manually - * removed. Alternatively we could update the minimum recovery point - * after removal, but that would leave a small window where the - * WAL-first rule could be violated. - */ - if (!reachedConsistency) - XLogFlush(record->EndRecPtr); - /* * If we issued a WAL record for a drop tablespace it implies that * there were no files in it at all when the DROP was done. That means diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 8d48f003b0..64708949db 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -65,10 +65,6 @@ extern void XLogDropDatabase(Oid dbid); extern void XLogTruncateRelation(RelFileNode rnode, ForkNumber forkNum, BlockNumber nblocks); -extern void XLogRememberMissingDir(Oid spcNode, Oid dbNode, char *path); -extern void XLogForgetMissingDir(Oid spcNode, Oid dbNode); -extern void XLogCheckMissingDirs(void); - /* Result codes for XLogReadBufferForRedo[Extended] */ typedef enum { diff --git a/src/test/recovery/t/029_replay_tsp_drops.pl b/src/test/recovery/t/029_replay_tsp_drops.pl deleted file mode 100644 index 90a72be489..0000000000 --- a/src/test/recovery/t/029_replay_tsp_drops.pl +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright (c) 2022, PostgreSQL Global Development Group - -# Test recovery involving tablespace removal. If recovery stops -# after once tablespace is removed, the next recovery should properly -# ignore the operations within the removed tablespaces. - -use strict; -use warnings; - -use PostgreSQL::Test::Cluster; -use PostgreSQL::Test::Utils; -use Test::More; - -my $node_primary = PostgreSQL::Test::Cluster->new('primary1'); -$node_primary->init(allows_streaming => 1); -$node_primary->start; -$node_primary->psql('postgres', -qq[ - SET allow_in_place_tablespaces=on; - CREATE TABLESPACE dropme_ts1 LOCATION ''; - CREATE TABLESPACE dropme_ts2 LOCATION ''; - CREATE TABLESPACE source_ts LOCATION ''; - CREATE TABLESPACE target_ts LOCATION ''; - CREATE DATABASE template_db IS_TEMPLATE = true; -]); -my $backup_name = 'my_backup'; -$node_primary->backup($backup_name); - -my $node_standby = PostgreSQL::Test::Cluster->new('standby1'); -$node_standby->init_from_backup($node_primary, $backup_name, has_streaming => 1); -$node_standby->start; - -# Make sure connection is made -$node_primary->poll_query_until( - 'postgres', 'SELECT count(*) = 1 FROM pg_stat_replication'); - -$node_standby->safe_psql('postgres', 'CHECKPOINT'); - -# Do immediate shutdown just after a sequence of CREATE DATABASE / DROP -# DATABASE / DROP TABLESPACE. This causes CREATE DATABASE WAL records -# to be applied to already-removed directories. -$node_primary->safe_psql('postgres', - q[CREATE DATABASE dropme_db1 WITH TABLESPACE dropme_ts1; - CREATE DATABASE dropme_db2 WITH TABLESPACE dropme_ts2; - CREATE DATABASE moveme_db TABLESPACE source_ts; - ALTER DATABASE moveme_db SET TABLESPACE target_ts; - CREATE DATABASE newdb TEMPLATE template_db; - ALTER DATABASE template_db IS_TEMPLATE = false; - DROP DATABASE dropme_db1; - DROP DATABASE dropme_db2; DROP TABLESPACE dropme_ts2; - DROP TABLESPACE source_ts; - DROP DATABASE template_db;]); - -$node_primary->wait_for_catchup($node_standby, 'replay', - $node_primary->lsn('replay')); -$node_standby->stop('immediate'); - -# Should restart ignoring directory creation error. -is($node_standby->start, 1, "standby started successfully"); - -my $log = PostgreSQL::Test::Utils::slurp_file($node_standby->logfile); -like( - $log, - qr[WARNING: skipping replay of database creation WAL record], - "warning message is logged"); - -done_testing(); diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 182b233b4c..410c9f6b0d 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -3740,8 +3740,6 @@ xl_invalid_page xl_invalid_page_key xl_invalidations xl_logical_message -xl_missing_dir_key -xl_missing_dir xl_multi_insert_tuple xl_multixact_create xl_multixact_truncate From 9c08aea6a3090a396be334cc58c511edab05776a Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 29 Mar 2022 11:31:43 -0400 Subject: [PATCH 297/772] Add new block-by-block strategy for CREATE DATABASE. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Because this strategy logs changes on a block-by-block basis, it avoids the need to checkpoint before and after the operation. However, because it logs each changed block individually, it might generate a lot of extra write-ahead logging if the template database is large. Therefore, the older strategy remains available via a new STRATEGY parameter to CREATE DATABASE, and a corresponding --strategy option to createdb. Somewhat controversially, this patch assembles the list of relations to be copied to the new database by reading the pg_class relation of the template database. Cross-database access like this isn't normally possible, but it can be made to work here because there can't be any connections to the database being copied, nor can it contain any in-doubt transactions. Even so, we have to use lower-level interfaces than normal, since the table scan and relcache interfaces will not work for a database to which we're not connected. The advantage of this approach is that we do not need to rely on the filesystem to determine what ought to be copied, but instead on PostgreSQL's own knowledge of the database structure. This avoids, for example, copying stray files that happen to be located in the source database directory. Dilip Kumar, with a fairly large number of cosmetic changes by me. Reviewed and tested by Ashutosh Sharma, Andres Freund, John Naylor, Greg Nancarrow, Neha Sharma. Additional feedback from Bruce Momjian, Heikki Linnakangas, Julien Rouhaud, Adam Brusselback, Kyotaro Horiguchi, Tomas Vondra, Andrew Dunstan, Álvaro Herrera, and others. Discussion: http://postgr.es/m/CA+TgmoYtcdxBjLh31DLxUXHxFVMPGzrU5_T=CYCvRyFHywSBUQ@mail.gmail.com --- contrib/bloom/blinsert.c | 2 +- doc/src/sgml/monitoring.sgml | 4 + doc/src/sgml/ref/create_database.sgml | 22 + doc/src/sgml/ref/createdb.sgml | 11 + src/backend/access/heap/heapam_handler.c | 6 +- src/backend/access/nbtree/nbtree.c | 2 +- src/backend/access/rmgrdesc/dbasedesc.c | 20 +- src/backend/access/transam/xlogutils.c | 6 +- src/backend/catalog/heap.c | 2 +- src/backend/catalog/storage.c | 34 +- src/backend/commands/dbcommands.c | 769 +++++++++++++++++++---- src/backend/commands/tablecmds.c | 2 +- src/backend/storage/buffer/bufmgr.c | 172 ++++- src/backend/storage/lmgr/lmgr.c | 28 + src/backend/utils/activity/wait_event.c | 3 + src/backend/utils/cache/relcache.c | 2 +- src/backend/utils/cache/relmapper.c | 64 ++ src/bin/pg_rewind/parsexlog.c | 9 +- src/bin/psql/tab-complete.c | 4 +- src/bin/scripts/createdb.c | 10 +- src/bin/scripts/t/020_createdb.pl | 20 + src/include/catalog/storage.h | 4 +- src/include/commands/dbcommands_xlog.h | 25 +- src/include/storage/bufmgr.h | 6 +- src/include/storage/lmgr.h | 1 + src/include/utils/relmapper.h | 4 +- src/include/utils/wait_event.h | 1 + src/tools/pgindent/typedefs.list | 5 +- 28 files changed, 1081 insertions(+), 157 deletions(-) diff --git a/contrib/bloom/blinsert.c b/contrib/bloom/blinsert.c index c94cf34e69..82378db441 100644 --- a/contrib/bloom/blinsert.c +++ b/contrib/bloom/blinsert.c @@ -173,7 +173,7 @@ blbuildempty(Relation index) * Write the page and log it. It might seem that an immediate sync would * be sufficient to guarantee that the file exists on disk, but recovery * itself might remove it while replaying, for example, an - * XLOG_DBASE_CREATE or XLOG_TBLSPC_CREATE record. Therefore, we need + * XLOG_DBASE_CREATE* or XLOG_TBLSPC_CREATE record. Therefore, we need * this even when wal_level=minimal. */ PageSetChecksumInplace(metapage, BLOOM_METAPAGE_BLKNO); diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 6a6b09dc45..3b9172f65b 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -1502,6 +1502,10 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser TwophaseFileWrite Waiting for a write of a two phase state file. + + VersionFileWrite + Waiting for the version file to be written while creating a database. + WALBootstrapSync Waiting for WAL to reach durable storage during diff --git a/doc/src/sgml/ref/create_database.sgml b/doc/src/sgml/ref/create_database.sgml index 5ae785ab95..255ad3a1ce 100644 --- a/doc/src/sgml/ref/create_database.sgml +++ b/doc/src/sgml/ref/create_database.sgml @@ -25,6 +25,7 @@ CREATE DATABASE name [ [ WITH ] [ OWNER [=] user_name ] [ TEMPLATE [=] template ] [ ENCODING [=] encoding ] + [ STRATEGY [=] strategy ] ] [ LOCALE [=] locale ] [ LC_COLLATE [=] lc_collate ] [ LC_CTYPE [=] lc_ctype ] @@ -118,6 +119,27 @@ CREATE DATABASE name + + strategy + + + Strategy to be used in creating the new database. If + the WAL_LOG strategy is used, the database will be + copied block by block and each block will be separately written + to the write-ahead log. This is the most efficient strategy in + cases where the template database is small, and therefore it is the + default. The older FILE_COPY strategy is also + available. This strategy writes a small record to the write-ahead log + for each tablespace used by the target database. Each such record + represents copying an entire directory to a new location at the + filesystem level. While this does reduce the write-ahed + log volume substantially, especially if the template database is large, + it also forces the system to perform a checkpoint both before and + after the creation of the new database. In some situations, this may + have a noticeable negative impact on overall system performance. + + + locale diff --git a/doc/src/sgml/ref/createdb.sgml b/doc/src/sgml/ref/createdb.sgml index be42e502d6..671cd362d9 100644 --- a/doc/src/sgml/ref/createdb.sgml +++ b/doc/src/sgml/ref/createdb.sgml @@ -177,6 +177,17 @@ PostgreSQL documentation + + + + + + Specifies the database creation strategy. See + for more details. + + + + diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 39ef8a0b77..dee264e859 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -593,7 +593,7 @@ heapam_relation_set_new_filenode(Relation rel, */ *minmulti = GetOldestMultiXactId(); - srel = RelationCreateStorage(*newrnode, persistence); + srel = RelationCreateStorage(*newrnode, persistence, true); /* * If required, set up an init fork for an unlogged table so that it can @@ -601,7 +601,7 @@ heapam_relation_set_new_filenode(Relation rel, * even if the page has been logged, because the write did not go through * shared_buffers and therefore a concurrent checkpoint may have moved the * redo pointer past our xlog record. Recovery may as well remove it - * while replaying, for example, XLOG_DBASE_CREATE or XLOG_TBLSPC_CREATE + * while replaying, for example, XLOG_DBASE_CREATE* or XLOG_TBLSPC_CREATE * record. Therefore, logging is necessary even if wal_level=minimal. */ if (persistence == RELPERSISTENCE_UNLOGGED) @@ -645,7 +645,7 @@ heapam_relation_copy_data(Relation rel, const RelFileNode *newrnode) * NOTE: any conflict in relfilenode value will be caught in * RelationCreateStorage(). */ - RelationCreateStorage(*newrnode, rel->rd_rel->relpersistence); + RelationCreateStorage(*newrnode, rel->rd_rel->relpersistence, true); /* copy main fork */ RelationCopyStorage(RelationGetSmgr(rel), dstrel, MAIN_FORKNUM, diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c index c9b4964c1e..dacf3f7a58 100644 --- a/src/backend/access/nbtree/nbtree.c +++ b/src/backend/access/nbtree/nbtree.c @@ -161,7 +161,7 @@ btbuildempty(Relation index) * Write the page and log it. It might seem that an immediate sync would * be sufficient to guarantee that the file exists on disk, but recovery * itself might remove it while replaying, for example, an - * XLOG_DBASE_CREATE or XLOG_TBLSPC_CREATE record. Therefore, we need + * XLOG_DBASE_CREATE* or XLOG_TBLSPC_CREATE record. Therefore, we need * this even when wal_level=minimal. */ PageSetChecksumInplace(metapage, BTREE_METAPAGE); diff --git a/src/backend/access/rmgrdesc/dbasedesc.c b/src/backend/access/rmgrdesc/dbasedesc.c index 03af3fdbcf..523d0b3c1d 100644 --- a/src/backend/access/rmgrdesc/dbasedesc.c +++ b/src/backend/access/rmgrdesc/dbasedesc.c @@ -24,14 +24,23 @@ dbase_desc(StringInfo buf, XLogReaderState *record) char *rec = XLogRecGetData(record); uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; - if (info == XLOG_DBASE_CREATE) + if (info == XLOG_DBASE_CREATE_FILE_COPY) { - xl_dbase_create_rec *xlrec = (xl_dbase_create_rec *) rec; + xl_dbase_create_file_copy_rec *xlrec = + (xl_dbase_create_file_copy_rec *) rec; appendStringInfo(buf, "copy dir %u/%u to %u/%u", xlrec->src_tablespace_id, xlrec->src_db_id, xlrec->tablespace_id, xlrec->db_id); } + else if (info == XLOG_DBASE_CREATE_WAL_LOG) + { + xl_dbase_create_wal_log_rec *xlrec = + (xl_dbase_create_wal_log_rec *) rec; + + appendStringInfo(buf, "create dir %u/%u", + xlrec->tablespace_id, xlrec->db_id); + } else if (info == XLOG_DBASE_DROP) { xl_dbase_drop_rec *xlrec = (xl_dbase_drop_rec *) rec; @@ -51,8 +60,11 @@ dbase_identify(uint8 info) switch (info & ~XLR_INFO_MASK) { - case XLOG_DBASE_CREATE: - id = "CREATE"; + case XLOG_DBASE_CREATE_FILE_COPY: + id = "CREATE_FILE_COPY"; + break; + case XLOG_DBASE_CREATE_WAL_LOG: + id = "CREATE_WAL_LOG"; break; case XLOG_DBASE_DROP: id = "DROP"; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index 511f2f186f..a4dedc58b7 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -484,7 +484,7 @@ XLogReadBufferExtended(RelFileNode rnode, ForkNumber forknum, { /* page exists in file */ buffer = ReadBufferWithoutRelcache(rnode, forknum, blkno, - mode, NULL); + mode, NULL, true); } else { @@ -509,7 +509,7 @@ XLogReadBufferExtended(RelFileNode rnode, ForkNumber forknum, ReleaseBuffer(buffer); } buffer = ReadBufferWithoutRelcache(rnode, forknum, - P_NEW, mode, NULL); + P_NEW, mode, NULL, true); } while (BufferGetBlockNumber(buffer) < blkno); /* Handle the corner case that P_NEW returns non-consecutive pages */ @@ -519,7 +519,7 @@ XLogReadBufferExtended(RelFileNode rnode, ForkNumber forknum, LockBuffer(buffer, BUFFER_LOCK_UNLOCK); ReleaseBuffer(buffer); buffer = ReadBufferWithoutRelcache(rnode, forknum, blkno, - mode, NULL); + mode, NULL, true); } } diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 696fd5977e..6eb78a9c0f 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -387,7 +387,7 @@ heap_create(const char *relname, relpersistence, relfrozenxid, relminmxid); else if (RELKIND_HAS_STORAGE(rel->rd_rel->relkind)) - RelationCreateStorage(rel->rd_node, relpersistence); + RelationCreateStorage(rel->rd_node, relpersistence, true); else Assert(false); } diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index ce5568ff08..9898701a43 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -112,12 +112,14 @@ AddPendingSync(const RelFileNode *rnode) * modules that need them. * * This function is transactional. The creation is WAL-logged, and if the - * transaction aborts later on, the storage will be destroyed. + * transaction aborts later on, the storage will be destroyed. A caller + * that does not want the storage to be destroyed in case of an abort may + * pass register_delete = false. */ SMgrRelation -RelationCreateStorage(RelFileNode rnode, char relpersistence) +RelationCreateStorage(RelFileNode rnode, char relpersistence, + bool register_delete) { - PendingRelDelete *pending; SMgrRelation srel; BackendId backend; bool needs_wal; @@ -149,15 +151,23 @@ RelationCreateStorage(RelFileNode rnode, char relpersistence) if (needs_wal) log_smgrcreate(&srel->smgr_rnode.node, MAIN_FORKNUM); - /* Add the relation to the list of stuff to delete at abort */ - pending = (PendingRelDelete *) - MemoryContextAlloc(TopMemoryContext, sizeof(PendingRelDelete)); - pending->relnode = rnode; - pending->backend = backend; - pending->atCommit = false; /* delete if abort */ - pending->nestLevel = GetCurrentTransactionNestLevel(); - pending->next = pendingDeletes; - pendingDeletes = pending; + /* + * Add the relation to the list of stuff to delete at abort, if we are + * asked to do so. + */ + if (register_delete) + { + PendingRelDelete *pending; + + pending = (PendingRelDelete *) + MemoryContextAlloc(TopMemoryContext, sizeof(PendingRelDelete)); + pending->relnode = rnode; + pending->backend = backend; + pending->atCommit = false; /* delete if abort */ + pending->nestLevel = GetCurrentTransactionNestLevel(); + pending->next = pendingDeletes; + pendingDeletes = pending; + } if (relpersistence == RELPERSISTENCE_PERMANENT && !XLogIsNeeded()) { diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 623e5ec778..df16533901 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -63,13 +63,31 @@ #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/pg_locale.h" +#include "utils/relmapper.h" #include "utils/snapmgr.h" #include "utils/syscache.h" +/* + * Create database strategy. + * + * CREATEDB_WAL_LOG will copy the database at the block level and WAL log each + * copied block. + * + * CREATEDB_FILE_COPY will simply perform a file system level copy of the + * database and log a single record for each tablespace copied. To make this + * safe, it also triggers checkpoints before and after the operation. + */ +typedef enum CreateDBStrategy +{ + CREATEDB_WAL_LOG, + CREATEDB_FILE_COPY +} CreateDBStrategy; + typedef struct { Oid src_dboid; /* source (template) DB */ Oid dest_dboid; /* DB we are trying to create */ + CreateDBStrategy strategy; /* create db strategy */ } createdb_failure_params; typedef struct @@ -78,6 +96,17 @@ typedef struct Oid dest_tsoid; /* tablespace we are trying to move to */ } movedb_failure_params; +/* + * Information about a relation to be copied when creating a database. + */ +typedef struct CreateDBRelInfo +{ + RelFileNode rnode; /* physical relation identifier */ + Oid reloid; /* relation oid */ + bool permanent; /* relation is permanent or unlogged */ +} CreateDBRelInfo; + + /* non-export function prototypes */ static void createdb_failure_callback(int code, Datum arg); static void movedb(const char *dbname, const char *tblspcname); @@ -93,7 +122,546 @@ static bool have_createdb_privilege(void); static void remove_dbtablespaces(Oid db_id); static bool check_db_file_conflict(Oid db_id); static int errdetail_busy_db(int notherbackends, int npreparedxacts); +static void CreateDatabaseUsingWalLog(Oid src_dboid, Oid dboid, Oid src_tsid, + Oid dst_tsid); +static List *ScanSourceDatabasePgClass(Oid srctbid, Oid srcdbid, char *srcpath); +static List *ScanSourceDatabasePgClassPage(Page page, Buffer buf, Oid tbid, + Oid dbid, char *srcpath, + List *rnodelist, Snapshot snapshot); +static CreateDBRelInfo *ScanSourceDatabasePgClassTuple(HeapTupleData *tuple, + Oid tbid, Oid dbid, + char *srcpath); +static void CreateDirAndVersionFile(char *dbpath, Oid dbid, Oid tsid, + bool isRedo); +static void CreateDatabaseUsingFileCopy(Oid src_dboid, Oid dboid, Oid src_tsid, + Oid dst_tsid); + +/* + * Create a new database using the WAL_LOG strategy. + * + * Each copied block is separately written to the write-ahead log. + */ +static void +CreateDatabaseUsingWalLog(Oid src_dboid, Oid dst_dboid, + Oid src_tsid, Oid dst_tsid) +{ + char *srcpath; + char *dstpath; + List *rnodelist = NULL; + ListCell *cell; + LockRelId srcrelid; + LockRelId dstrelid; + RelFileNode srcrnode; + RelFileNode dstrnode; + CreateDBRelInfo *relinfo; + + /* Get source and destination database paths. */ + srcpath = GetDatabasePath(src_dboid, src_tsid); + dstpath = GetDatabasePath(dst_dboid, dst_tsid); + + /* Create database directory and write PG_VERSION file. */ + CreateDirAndVersionFile(dstpath, dst_dboid, dst_tsid, false); + + /* Copy relmap file from source database to the destination database. */ + RelationMapCopy(dst_dboid, dst_tsid, srcpath, dstpath); + + /* Get list of relfilenodes to copy from the source database. */ + rnodelist = ScanSourceDatabasePgClass(src_tsid, src_dboid, srcpath); + Assert(rnodelist != NIL); + + /* + * Database IDs will be the same for all relations so set them before + * entering the loop. + */ + srcrelid.dbId = src_dboid; + dstrelid.dbId = dst_dboid; + + /* Loop over our list of relfilenodes and copy each one. */ + foreach(cell, rnodelist) + { + relinfo = lfirst(cell); + srcrnode = relinfo->rnode; + + /* + * If the relation is from the source db's default tablespace then we + * need to create it in the destinations db's default tablespace. + * Otherwise, we need to create in the same tablespace as it is in the + * source database. + */ + if (srcrnode.spcNode == src_tsid) + dstrnode.spcNode = dst_tsid; + else + dstrnode.spcNode = srcrnode.spcNode; + + dstrnode.dbNode = dst_dboid; + dstrnode.relNode = srcrnode.relNode; + + /* + * Acquire locks on source and target relations before copying. + * + * We typically do not read relation data into shared_buffers without + * holding a relation lock. It's unclear what could go wrong if we + * skipped it in this case, because nobody can be modifying either + * the source or destination database at this point, and we have locks + * on both databases, too, but let's take the conservative route. + */ + dstrelid.relId = srcrelid.relId = relinfo->reloid; + LockRelationId(&srcrelid, AccessShareLock); + LockRelationId(&dstrelid, AccessShareLock); + + /* Copy relation storage from source to the destination. */ + CreateAndCopyRelationData(srcrnode, dstrnode, relinfo->permanent); + + /* Release the relation locks. */ + UnlockRelationId(&srcrelid, AccessShareLock); + UnlockRelationId(&dstrelid, AccessShareLock); + } + + list_free_deep(rnodelist); +} + +/* + * Scan the pg_class table in the source database to identify the relations + * that need to be copied to the destination database. + * + * This is an exception to the usual rule that cross-database access is + * not possible. We can make it work here because we know that there are no + * connections to the source database and (since there can't be prepared + * transactions touching that database) no in-doubt tuples either. This + * means that we don't need to worry about pruning removing anything from + * under us, and we don't need to be too picky about our snapshot either. + * As long as it sees all previously-committed XIDs as committed and all + * aborted XIDs as aborted, we should be fine: nothing else is possible + * here. + * + * We can't rely on the relcache for anything here, because that only knows + * about the database to which we are connected, and can't handle access to + * other databases. That also means we can't rely on the heap scan + * infrastructure, which would be a bad idea anyway since it might try + * to do things like HOT pruning which we definitely can't do safely in + * a database to which we're not even connected. + */ +static List * +ScanSourceDatabasePgClass(Oid tbid, Oid dbid, char *srcpath) +{ + RelFileNode rnode; + BlockNumber nblocks; + BlockNumber blkno; + Buffer buf; + Oid relfilenode; + Page page; + List *rnodelist = NIL; + LockRelId relid; + Relation rel; + Snapshot snapshot; + BufferAccessStrategy bstrategy; + + /* Get pg_class relfilenode. */ + relfilenode = RelationMapOidToFilenodeForDatabase(srcpath, + RelationRelationId); + + /* Don't read data into shared_buffers without holding a relation lock. */ + relid.dbId = dbid; + relid.relId = RelationRelationId; + LockRelationId(&relid, AccessShareLock); + + /* Prepare a RelFileNode for the pg_class relation. */ + rnode.spcNode = tbid; + rnode.dbNode = dbid; + rnode.relNode = relfilenode; + + /* + * We can't use a real relcache entry for a relation in some other + * database, but since we're only going to access the fields related + * to physical storage, a fake one is good enough. If we didn't do this + * and used the smgr layer directly, we would have to worry about + * invalidations. + */ + rel = CreateFakeRelcacheEntry(rnode); + nblocks = smgrnblocks(RelationGetSmgr(rel), MAIN_FORKNUM); + FreeFakeRelcacheEntry(rel); + + /* Use a buffer access strategy since this is a bulk read operation. */ + bstrategy = GetAccessStrategy(BAS_BULKREAD); + + /* + * As explained in the function header comments, we need a snapshot that + * will see all committed transactions as committed, and our transaction + * snapshot - or the active snapshot - might not be new enough for that, + * but the return value of GetLatestSnapshot() should work fine. + */ + snapshot = GetLatestSnapshot(); + + /* Process the relation block by block. */ + for (blkno = 0; blkno < nblocks; blkno++) + { + CHECK_FOR_INTERRUPTS(); + + buf = ReadBufferWithoutRelcache(rnode, MAIN_FORKNUM, blkno, + RBM_NORMAL, bstrategy, false); + + LockBuffer(buf, BUFFER_LOCK_SHARE); + page = BufferGetPage(buf); + if (PageIsNew(page) || PageIsEmpty(page)) + { + UnlockReleaseBuffer(buf); + continue; + } + + /* Append relevant pg_class tuples for current page to rnodelist. */ + rnodelist = ScanSourceDatabasePgClassPage(page, buf, tbid, dbid, + srcpath, rnodelist, + snapshot); + + UnlockReleaseBuffer(buf); + } + + /* Release relation lock. */ + UnlockRelationId(&relid, AccessShareLock); + + return rnodelist; +} + +/* + * Scan one page of the source database's pg_class relation and add relevant + * entries to rnodelist. The return value is the updated list. + */ +static List * +ScanSourceDatabasePgClassPage(Page page, Buffer buf, Oid tbid, Oid dbid, + char *srcpath, List *rnodelist, + Snapshot snapshot) +{ + BlockNumber blkno = BufferGetBlockNumber(buf); + OffsetNumber offnum; + OffsetNumber maxoff; + HeapTupleData tuple; + + maxoff = PageGetMaxOffsetNumber(page); + + /* Loop over offsets. */ + for (offnum = FirstOffsetNumber; + offnum <= maxoff; + offnum = OffsetNumberNext(offnum)) + { + ItemId itemid; + + itemid = PageGetItemId(page, offnum); + + /* Nothing to do if slot is empty or already dead. */ + if (!ItemIdIsUsed(itemid) || ItemIdIsDead(itemid) || + ItemIdIsRedirected(itemid)) + continue; + + Assert(ItemIdIsNormal(itemid)); + ItemPointerSet(&(tuple.t_self), blkno, offnum); + + /* Initialize a HeapTupleData structure. */ + tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid); + tuple.t_len = ItemIdGetLength(itemid); + tuple.t_tableOid = RelationRelationId; + + /* Skip tuples that are not visible to this snapshot. */ + if (HeapTupleSatisfiesVisibility(&tuple, snapshot, buf)) + { + CreateDBRelInfo *relinfo; + + /* + * ScanSourceDatabasePgClassTuple is in charge of constructing + * a CreateDBRelInfo object for this tuple, but can also decide + * that this tuple isn't something we need to copy. If we do need + * to copy the relation, add it to the list. + */ + relinfo = ScanSourceDatabasePgClassTuple(&tuple, tbid, dbid, + srcpath); + if (relinfo != NULL) + rnodelist = lappend(rnodelist, relinfo); + } + } + return rnodelist; +} + +/* + * Decide whether a certain pg_class tuple represents something that + * needs to be copied from the source database to the destination database, + * and if so, construct a CreateDBRelInfo for it. + * + * Visbility checks are handled by the caller, so our job here is just + * to assess the data stored in the tuple. + */ +CreateDBRelInfo * +ScanSourceDatabasePgClassTuple(HeapTupleData *tuple, Oid tbid, Oid dbid, + char *srcpath) +{ + CreateDBRelInfo *relinfo; + Form_pg_class classForm; + Oid relfilenode = InvalidOid; + + classForm = (Form_pg_class) GETSTRUCT(tuple); + + /* + * Return NULL if this object does not need to be copied. + * + * Shared objects don't need to be copied, because they are shared. + * Objects without storage can't be copied, because there's nothing to + * copy. Temporary relations don't need to be copied either, because + * they are inaccessible outside of the session that created them, + * which must be gone already, and couldn't connect to a different database + * if it still existed. autovacuum will eventually remove the pg_class + * entries as well. + */ + if (classForm->reltablespace == GLOBALTABLESPACE_OID || + !RELKIND_HAS_STORAGE(classForm->relkind) || + classForm->relpersistence == RELPERSISTENCE_TEMP) + return NULL; + + /* + * If relfilenode is valid then directly use it. Otherwise, consult the + * relmap. + */ + if (OidIsValid(classForm->relfilenode)) + relfilenode = classForm->relfilenode; + else + relfilenode = RelationMapOidToFilenodeForDatabase(srcpath, + classForm->oid); + + /* We must have a valid relfilenode oid. */ + if (!OidIsValid(relfilenode)) + elog(ERROR, "relation with OID %u does not have a valid relfilenode", + classForm->oid); + + /* Prepare a rel info element and add it to the list. */ + relinfo = (CreateDBRelInfo *) palloc(sizeof(CreateDBRelInfo)); + if (OidIsValid(classForm->reltablespace)) + relinfo->rnode.spcNode = classForm->reltablespace; + else + relinfo->rnode.spcNode = tbid; + + relinfo->rnode.dbNode = dbid; + relinfo->rnode.relNode = relfilenode; + relinfo->reloid = classForm->oid; + + /* Temporary relations were rejected above. */ + Assert(classForm->relpersistence != RELPERSISTENCE_TEMP); + relinfo->permanent = + (classForm->relpersistence == RELPERSISTENCE_PERMANENT) ? true : false; + + return relinfo; +} + +/* + * Create database directory and write out the PG_VERSION file in the database + * path. If isRedo is true, it's okay for the database directory to exist + * already. + */ +static void +CreateDirAndVersionFile(char *dbpath, Oid dbid, Oid tsid, bool isRedo) +{ + int fd; + int nbytes; + char versionfile[MAXPGPATH]; + char buf[16]; + + /* + * Prepare version data before starting a critical section. + * + * Note that we don't have to copy this from the source database; there's + * only one legal value. + */ + sprintf(buf, "%s\n", PG_MAJORVERSION); + nbytes = strlen(PG_MAJORVERSION) + 1; + + /* If we are not in WAL replay then write the WAL. */ + if (!isRedo) + { + xl_dbase_create_wal_log_rec xlrec; + XLogRecPtr lsn; + + START_CRIT_SECTION(); + + xlrec.db_id = dbid; + xlrec.tablespace_id = tsid; + + XLogBeginInsert(); + XLogRegisterData((char *) (&xlrec), + sizeof(xl_dbase_create_wal_log_rec)); + + lsn = XLogInsert(RM_DBASE_ID, XLOG_DBASE_CREATE_WAL_LOG); + + /* As always, WAL must hit the disk before the data update does. */ + XLogFlush(lsn); + } + + /* Create database directory. */ + if (MakePGDirectory(dbpath) < 0) + { + /* Failure other than already exists or not in WAL replay? */ + if (errno != EEXIST || !isRedo) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not create directory \"%s\": %m", dbpath))); + } + + /* + * Create PG_VERSION file in the database path. If the file already + * exists and we are in WAL replay then try again to open it in write + * mode. + */ + snprintf(versionfile, sizeof(versionfile), "%s/%s", dbpath, "PG_VERSION"); + + fd = OpenTransientFile(versionfile, O_WRONLY | O_CREAT | O_EXCL | PG_BINARY); + if (fd < 0 && errno == EEXIST && isRedo) + fd = OpenTransientFile(versionfile, O_WRONLY | O_TRUNC | PG_BINARY); + + if (fd < 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not create file \"%s\": %m", versionfile))); + + /* Write PG_MAJORVERSION in the PG_VERSION file. */ + pgstat_report_wait_start(WAIT_EVENT_VERSION_FILE_WRITE); + errno = 0; + if ((int) write(fd, buf, nbytes) != nbytes) + { + /* If write didn't set errno, assume problem is no disk space. */ + if (errno == 0) + errno = ENOSPC; + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not write to file \"%s\": %m", versionfile))); + } + pgstat_report_wait_end(); + + /* Close the version file. */ + CloseTransientFile(fd); + + /* Critical section done. */ + if (!isRedo) + END_CRIT_SECTION(); +} + +/* + * Create a new database using the FILE_COPY strategy. + * + * Copy each tablespace at the filesystem level, and log a single WAL record + * for each tablespace copied. This requires a checkpoint before and after the + * copy, which may be expensive, but it does greatly reduce WAL generation + * if the copied database is large. + */ +static void +CreateDatabaseUsingFileCopy(Oid src_dboid, Oid dst_dboid, Oid src_tsid, + Oid dst_tsid) +{ + TableScanDesc scan; + Relation rel; + HeapTuple tuple; + + /* + * Force a checkpoint before starting the copy. This will force all dirty + * buffers, including those of unlogged tables, out to disk, to ensure + * source database is up-to-date on disk for the copy. + * FlushDatabaseBuffers() would suffice for that, but we also want to + * process any pending unlink requests. Otherwise, if a checkpoint + * happened while we're copying files, a file might be deleted just when + * we're about to copy it, causing the lstat() call in copydir() to fail + * with ENOENT. + */ + RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | + CHECKPOINT_WAIT | CHECKPOINT_FLUSH_ALL); + + /* + * Iterate through all tablespaces of the template database, and copy each + * one to the new database. + */ + rel = table_open(TableSpaceRelationId, AccessShareLock); + scan = table_beginscan_catalog(rel, 0, NULL); + while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL) + { + Form_pg_tablespace spaceform = (Form_pg_tablespace) GETSTRUCT(tuple); + Oid srctablespace = spaceform->oid; + Oid dsttablespace; + char *srcpath; + char *dstpath; + struct stat st; + + /* No need to copy global tablespace */ + if (srctablespace == GLOBALTABLESPACE_OID) + continue; + + srcpath = GetDatabasePath(src_dboid, srctablespace); + + if (stat(srcpath, &st) < 0 || !S_ISDIR(st.st_mode) || + directory_is_empty(srcpath)) + { + /* Assume we can ignore it */ + pfree(srcpath); + continue; + } + + if (srctablespace == src_tsid) + dsttablespace = dst_tsid; + else + dsttablespace = srctablespace; + + dstpath = GetDatabasePath(dst_dboid, dsttablespace); + + /* + * Copy this subdirectory to the new location + * + * We don't need to copy subdirectories + */ + copydir(srcpath, dstpath, false); + + /* Record the filesystem change in XLOG */ + { + xl_dbase_create_file_copy_rec xlrec; + + xlrec.db_id = dst_dboid; + xlrec.tablespace_id = dsttablespace; + xlrec.src_db_id = src_dboid; + xlrec.src_tablespace_id = srctablespace; + + XLogBeginInsert(); + XLogRegisterData((char *) &xlrec, + sizeof(xl_dbase_create_file_copy_rec)); + + (void) XLogInsert(RM_DBASE_ID, + XLOG_DBASE_CREATE_FILE_COPY | XLR_SPECIAL_REL_UPDATE); + } + } + table_endscan(scan); + table_close(rel, AccessShareLock); + + /* + * We force a checkpoint before committing. This effectively means that + * committed XLOG_DBASE_CREATE_FILE_COPY operations will never need to be + * replayed (at least not in ordinary crash recovery; we still have to + * make the XLOG entry for the benefit of PITR operations). This avoids + * two nasty scenarios: + * + * #1: When PITR is off, we don't XLOG the contents of newly created + * indexes; therefore the drop-and-recreate-whole-directory behavior of + * DBASE_CREATE replay would lose such indexes. + * + * #2: Since we have to recopy the source database during DBASE_CREATE + * replay, we run the risk of copying changes in it that were committed + * after the original CREATE DATABASE command but before the system crash + * that led to the replay. This is at least unexpected and at worst could + * lead to inconsistencies, eg duplicate table names. + * + * (Both of these were real bugs in releases 8.0 through 8.0.3.) + * + * In PITR replay, the first of these isn't an issue, and the second is + * only a risk if the CREATE DATABASE and subsequent template database + * change both occur while a base backup is being taken. There doesn't + * seem to be much we can do about that except document it as a + * limitation. + * + * See CreateDatabaseUsingWalLog() for a less cheesy CREATE DATABASE + * strategy that avoids these problems. + */ + RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | CHECKPOINT_WAIT); +} /* * CREATE DATABASE @@ -101,8 +669,6 @@ static int errdetail_busy_db(int notherbackends, int npreparedxacts); Oid createdb(ParseState *pstate, const CreatedbStmt *stmt) { - TableScanDesc scan; - Relation rel; Oid src_dboid; Oid src_owner; int src_encoding = -1; @@ -137,6 +703,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) DefElem *dallowconnections = NULL; DefElem *dconnlimit = NULL; DefElem *dcollversion = NULL; + DefElem *dstrategy = NULL; char *dbname = stmt->dbname; char *dbowner = NULL; const char *dbtemplate = NULL; @@ -152,6 +719,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) char *dbcollversion = NULL; int notherbackends; int npreparedxacts; + CreateDBStrategy dbstrategy = CREATEDB_WAL_LOG; createdb_failure_params fparms; /* Extract options from the statement node tree */ @@ -269,6 +837,12 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) (errcode(ERRCODE_INVALID_PARAMETER_VALUE)), errmsg("OIDs less than %u are reserved for system objects", FirstNormalObjectId)); } + else if (strcmp(defel->defname, "strategy") == 0) + { + if (dstrategy) + errorConflictingDefElem(defel, pstate); + dstrategy = defel; + } else ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -413,6 +987,23 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) dbtemplate))); } + /* Validate the database creation strategy. */ + if (dstrategy && dstrategy->arg) + { + char *strategy; + + strategy = defGetString(dstrategy); + if (strcmp(strategy, "wal_log") == 0) + dbstrategy = CREATEDB_WAL_LOG; + else if (strcmp(strategy, "file_copy") == 0) + dbstrategy = CREATEDB_FILE_COPY; + else + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid create database strategy %s", strategy), + errhint("Valid strategies are \"wal_log\", and \"file_copy\"."))); + } + /* If encoding or locales are defaulted, use source's setting */ if (encoding < 0) encoding = src_encoding; @@ -753,17 +1344,18 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) InvokeObjectPostCreateHook(DatabaseRelationId, dboid, 0); /* - * Force a checkpoint before starting the copy. This will force all dirty - * buffers, including those of unlogged tables, out to disk, to ensure - * source database is up-to-date on disk for the copy. - * FlushDatabaseBuffers() would suffice for that, but we also want to - * process any pending unlink requests. Otherwise, if a checkpoint - * happened while we're copying files, a file might be deleted just when - * we're about to copy it, causing the lstat() call in copydir() to fail - * with ENOENT. + * If we're going to be reading data for the to-be-created database + * into shared_buffers, take a lock on it. Nobody should know that this + * database exists yet, but it's good to maintain the invariant that a + * lock an AccessExclusiveLock on the database is sufficient to drop all + * of its buffers without worrying about more being read later. + * + * Note that we need to do this before entering the PG_ENSURE_ERROR_CLEANUP + * block below, because createdb_failure_callback expects this lock to + * be held already. */ - RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | CHECKPOINT_WAIT - | CHECKPOINT_FLUSH_ALL); + if (dbstrategy == CREATEDB_WAL_LOG) + LockSharedObject(DatabaseRelationId, dboid, 0, AccessShareLock); /* * Once we start copying subdirectories, we need to be able to clean 'em @@ -774,101 +1366,24 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) */ fparms.src_dboid = src_dboid; fparms.dest_dboid = dboid; + fparms.strategy = dbstrategy; + PG_ENSURE_ERROR_CLEANUP(createdb_failure_callback, PointerGetDatum(&fparms)); { /* - * Iterate through all tablespaces of the template database, and copy - * each one to the new database. - */ - rel = table_open(TableSpaceRelationId, AccessShareLock); - scan = table_beginscan_catalog(rel, 0, NULL); - while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL) - { - Form_pg_tablespace spaceform = (Form_pg_tablespace) GETSTRUCT(tuple); - Oid srctablespace = spaceform->oid; - Oid dsttablespace; - char *srcpath; - char *dstpath; - struct stat st; - - /* No need to copy global tablespace */ - if (srctablespace == GLOBALTABLESPACE_OID) - continue; - - srcpath = GetDatabasePath(src_dboid, srctablespace); - - if (stat(srcpath, &st) < 0 || !S_ISDIR(st.st_mode) || - directory_is_empty(srcpath)) - { - /* Assume we can ignore it */ - pfree(srcpath); - continue; - } - - if (srctablespace == src_deftablespace) - dsttablespace = dst_deftablespace; - else - dsttablespace = srctablespace; - - dstpath = GetDatabasePath(dboid, dsttablespace); - - /* - * Copy this subdirectory to the new location - * - * We don't need to copy subdirectories - */ - copydir(srcpath, dstpath, false); - - /* Record the filesystem change in XLOG */ - { - xl_dbase_create_rec xlrec; - - xlrec.db_id = dboid; - xlrec.tablespace_id = dsttablespace; - xlrec.src_db_id = src_dboid; - xlrec.src_tablespace_id = srctablespace; - - XLogBeginInsert(); - XLogRegisterData((char *) &xlrec, sizeof(xl_dbase_create_rec)); - - (void) XLogInsert(RM_DBASE_ID, - XLOG_DBASE_CREATE | XLR_SPECIAL_REL_UPDATE); - } - } - table_endscan(scan); - table_close(rel, AccessShareLock); - - /* - * We force a checkpoint before committing. This effectively means - * that committed XLOG_DBASE_CREATE operations will never need to be - * replayed (at least not in ordinary crash recovery; we still have to - * make the XLOG entry for the benefit of PITR operations). This - * avoids two nasty scenarios: - * - * #1: When PITR is off, we don't XLOG the contents of newly created - * indexes; therefore the drop-and-recreate-whole-directory behavior - * of DBASE_CREATE replay would lose such indexes. - * - * #2: Since we have to recopy the source database during DBASE_CREATE - * replay, we run the risk of copying changes in it that were - * committed after the original CREATE DATABASE command but before the - * system crash that led to the replay. This is at least unexpected - * and at worst could lead to inconsistencies, eg duplicate table - * names. - * - * (Both of these were real bugs in releases 8.0 through 8.0.3.) - * - * In PITR replay, the first of these isn't an issue, and the second - * is only a risk if the CREATE DATABASE and subsequent template - * database change both occur while a base backup is being taken. - * There doesn't seem to be much we can do about that except document - * it as a limitation. - * - * Perhaps if we ever implement CREATE DATABASE in a less cheesy way, - * we can avoid this. + * If the user has asked to create a database with WAL_LOG strategy + * then call CreateDatabaseUsingWalLog, which will copy the database + * at the block level and it will WAL log each copied block. + * Otherwise, call CreateDatabaseUsingFileCopy that will copy the + * database file by file. */ - RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | CHECKPOINT_WAIT); + if (dbstrategy == CREATEDB_WAL_LOG) + CreateDatabaseUsingWalLog(src_dboid, dboid, src_deftablespace, + dst_deftablespace); + else + CreateDatabaseUsingFileCopy(src_dboid, dboid, src_deftablespace, + dst_deftablespace); /* * Close pg_database, but keep lock till commit. @@ -954,6 +1469,25 @@ createdb_failure_callback(int code, Datum arg) { createdb_failure_params *fparms = (createdb_failure_params *) DatumGetPointer(arg); + /* + * If we were copying database at block levels then drop pages for the + * destination database that are in the shared buffer cache. And tell + * checkpointer to forget any pending fsync and unlink requests for files + * in the database. The reasoning behind doing this is same as explained + * in dropdb function. But unlike dropdb we don't need to call + * pgstat_drop_database because this database is still not created so + * there should not be any stat for this. + */ + if (fparms->strategy == CREATEDB_WAL_LOG) + { + DropDatabaseBuffers(fparms->dest_dboid); + ForgetDatabaseSyncRequests(fparms->dest_dboid); + + /* Release lock on the target database. */ + UnlockSharedObject(DatabaseRelationId, fparms->dest_dboid, 0, + AccessShareLock); + } + /* * Release lock on source database before doing recursive remove. This is * not essential but it seems desirable to release the lock as soon as @@ -1478,7 +2012,7 @@ movedb(const char *dbname, const char *tblspcname) * Record the filesystem change in XLOG */ { - xl_dbase_create_rec xlrec; + xl_dbase_create_file_copy_rec xlrec; xlrec.db_id = db_id; xlrec.tablespace_id = dst_tblspcoid; @@ -1486,10 +2020,11 @@ movedb(const char *dbname, const char *tblspcname) xlrec.src_tablespace_id = src_tblspcoid; XLogBeginInsert(); - XLogRegisterData((char *) &xlrec, sizeof(xl_dbase_create_rec)); + XLogRegisterData((char *) &xlrec, + sizeof(xl_dbase_create_file_copy_rec)); (void) XLogInsert(RM_DBASE_ID, - XLOG_DBASE_CREATE | XLR_SPECIAL_REL_UPDATE); + XLOG_DBASE_CREATE_FILE_COPY | XLR_SPECIAL_REL_UPDATE); } /* @@ -1525,9 +2060,10 @@ movedb(const char *dbname, const char *tblspcname) /* * Force another checkpoint here. As in CREATE DATABASE, this is to - * ensure that we don't have to replay a committed XLOG_DBASE_CREATE - * operation, which would cause us to lose any unlogged operations - * done in the new DB tablespace before the next checkpoint. + * ensure that we don't have to replay a committed + * XLOG_DBASE_CREATE_FILE_COPY operation, which would cause us to lose + * any unlogged operations done in the new DB tablespace before the + * next checkpoint. */ RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | CHECKPOINT_WAIT); @@ -2478,9 +3014,10 @@ dbase_redo(XLogReaderState *record) /* Backup blocks are not used in dbase records */ Assert(!XLogRecHasAnyBlockRefs(record)); - if (info == XLOG_DBASE_CREATE) + if (info == XLOG_DBASE_CREATE_FILE_COPY) { - xl_dbase_create_rec *xlrec = (xl_dbase_create_rec *) XLogRecGetData(record); + xl_dbase_create_file_copy_rec *xlrec = + (xl_dbase_create_file_copy_rec *) XLogRecGetData(record); char *src_path; char *dst_path; struct stat st; @@ -2515,6 +3052,18 @@ dbase_redo(XLogReaderState *record) */ copydir(src_path, dst_path, false); } + else if (info == XLOG_DBASE_CREATE_WAL_LOG) + { + xl_dbase_create_wal_log_rec *xlrec = + (xl_dbase_create_wal_log_rec *) XLogRecGetData(record); + char *dbpath; + + dbpath = GetDatabasePath(xlrec->db_id, xlrec->tablespace_id); + + /* Create the database directory with the version file. */ + CreateDirAndVersionFile(dbpath, xlrec->db_id, xlrec->tablespace_id, + true); + } else if (info == XLOG_DBASE_DROP) { xl_dbase_drop_rec *xlrec = (xl_dbase_drop_rec *) XLogRecGetData(record); diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 124b9961dc..51b4a00d50 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -14626,7 +14626,7 @@ index_copy_data(Relation rel, RelFileNode newrnode) * NOTE: any conflict in relfilenode value will be caught in * RelationCreateStorage(). */ - RelationCreateStorage(newrnode, rel->rd_rel->relpersistence); + RelationCreateStorage(newrnode, rel->rd_rel->relpersistence, true); /* copy main fork */ RelationCopyStorage(RelationGetSmgr(rel), dstrel, MAIN_FORKNUM, diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 11005edc73..d73a40c1bc 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -38,6 +38,7 @@ #include "access/xlogutils.h" #include "catalog/catalog.h" #include "catalog/storage.h" +#include "catalog/storage_xlog.h" #include "executor/instrument.h" #include "lib/binaryheap.h" #include "miscadmin.h" @@ -486,6 +487,9 @@ static void FindAndDropRelFileNodeBuffers(RelFileNode rnode, ForkNumber forkNum, BlockNumber nForkBlock, BlockNumber firstDelBlock); +static void RelationCopyStorageUsingBuffer(Relation src, Relation dst, + ForkNumber forkNum, + bool isunlogged); static void AtProcExit_Buffers(int code, Datum arg); static void CheckForBufferLeaks(void); static int rnode_comparator(const void *p1, const void *p2); @@ -772,23 +776,23 @@ ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, * ReadBufferWithoutRelcache -- like ReadBufferExtended, but doesn't require * a relcache entry for the relation. * - * NB: At present, this function may only be used on permanent relations, which - * is OK, because we only use it during XLOG replay. If in the future we - * want to use it on temporary or unlogged relations, we could pass additional - * parameters. + * Pass permanent = true for a RELPERSISTENCE_PERMANENT relation, and + * permanent = false for a RELPERSISTENCE_UNLOGGED relation. This function + * cannot be used for temporary relations (and making that work might be + * difficult, unless we only want to read temporary relations for our own + * BackendId). */ Buffer ReadBufferWithoutRelcache(RelFileNode rnode, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, - BufferAccessStrategy strategy) + BufferAccessStrategy strategy, bool permanent) { bool hit; SMgrRelation smgr = smgropen(rnode, InvalidBackendId); - Assert(InRecovery); - - return ReadBuffer_common(smgr, RELPERSISTENCE_PERMANENT, forkNum, blockNum, + return ReadBuffer_common(smgr, permanent ? RELPERSISTENCE_PERMANENT : + RELPERSISTENCE_UNLOGGED, forkNum, blockNum, mode, strategy, &hit); } @@ -3676,6 +3680,158 @@ FlushRelationsAllBuffers(SMgrRelation *smgrs, int nrels) pfree(srels); } +/* --------------------------------------------------------------------- + * RelationCopyStorageUsingBuffer + * + * Copy fork's data using bufmgr. Same as RelationCopyStorage but instead + * of using smgrread and smgrextend this will copy using bufmgr APIs. + * + * Refer comments atop CreateAndCopyRelationData() for details about + * 'permanent' parameter. + * -------------------------------------------------------------------- + */ +static void +RelationCopyStorageUsingBuffer(Relation src, Relation dst, ForkNumber forkNum, + bool permanent) +{ + Buffer srcBuf; + Buffer dstBuf; + Page srcPage; + Page dstPage; + bool use_wal; + BlockNumber nblocks; + BlockNumber blkno; + BufferAccessStrategy bstrategy_src; + BufferAccessStrategy bstrategy_dst; + + /* + * In general, we want to write WAL whenever wal_level > 'minimal', but + * we can skip it when copying any fork of an unlogged relation other + * than the init fork. + */ + use_wal = XLogIsNeeded() && (permanent || forkNum == INIT_FORKNUM); + + /* Get number of blocks in the source relation. */ + nblocks = smgrnblocks(RelationGetSmgr(src), forkNum); + + /* Nothing to copy; just return. */ + if (nblocks == 0) + return; + + /* This is a bulk operation, so use buffer access strategies. */ + bstrategy_src = GetAccessStrategy(BAS_BULKREAD); + bstrategy_dst = GetAccessStrategy(BAS_BULKWRITE); + + /* Iterate over each block of the source relation file. */ + for (blkno = 0; blkno < nblocks; blkno++) + { + CHECK_FOR_INTERRUPTS(); + + /* Read block from source relation. */ + srcBuf = ReadBufferWithoutRelcache(src->rd_node, forkNum, blkno, + RBM_NORMAL, bstrategy_src, + permanent); + srcPage = BufferGetPage(srcBuf); + if (PageIsNew(srcPage) || PageIsEmpty(srcPage)) + { + ReleaseBuffer(srcBuf); + continue; + } + + /* Use P_NEW to extend the destination relation. */ + dstBuf = ReadBufferWithoutRelcache(dst->rd_node, forkNum, P_NEW, + RBM_NORMAL, bstrategy_dst, + permanent); + LockBuffer(dstBuf, BUFFER_LOCK_EXCLUSIVE); + + START_CRIT_SECTION(); + + /* Copy page data from the source to the destination. */ + dstPage = BufferGetPage(dstBuf); + memcpy(dstPage, srcPage, BLCKSZ); + MarkBufferDirty(dstBuf); + + /* WAL-log the copied page. */ + if (use_wal) + log_newpage_buffer(dstBuf, true); + + END_CRIT_SECTION(); + + UnlockReleaseBuffer(dstBuf); + ReleaseBuffer(srcBuf); + } +} + +/* --------------------------------------------------------------------- + * CreateAndCopyRelationData + * + * Create destination relation storage and copy all forks from the + * source relation to the destination. + * + * Pass permanent as true for permanent relations and false for + * unlogged relations. Currently this API is not supported for + * temporary relations. + * -------------------------------------------------------------------- + */ +void +CreateAndCopyRelationData(RelFileNode src_rnode, RelFileNode dst_rnode, + bool permanent) +{ + Relation src_rel; + Relation dst_rel; + char relpersistence; + + /* Set the relpersistence. */ + relpersistence = permanent ? + RELPERSISTENCE_PERMANENT : RELPERSISTENCE_UNLOGGED; + + /* + * We can't use a real relcache entry for a relation in some other + * database, but since we're only going to access the fields related + * to physical storage, a fake one is good enough. If we didn't do this + * and used the smgr layer directly, we would have to worry about + * invalidations. + */ + src_rel = CreateFakeRelcacheEntry(src_rnode); + dst_rel = CreateFakeRelcacheEntry(dst_rnode); + + /* + * Create and copy all forks of the relation. During create database we + * have a separate cleanup mechanism which deletes complete database + * directory. Therefore, each individual relation doesn't need to be + * registered for cleanup. + */ + RelationCreateStorage(dst_rnode, relpersistence, false); + + /* copy main fork. */ + RelationCopyStorageUsingBuffer(src_rel, dst_rel, MAIN_FORKNUM, permanent); + + /* copy those extra forks that exist */ + for (ForkNumber forkNum = MAIN_FORKNUM + 1; + forkNum <= MAX_FORKNUM; forkNum++) + { + if (smgrexists(RelationGetSmgr(src_rel), forkNum)) + { + smgrcreate(RelationGetSmgr(dst_rel), forkNum, false); + + /* + * WAL log creation if the relation is persistent, or this is the + * init fork of an unlogged relation. + */ + if (permanent || forkNum == INIT_FORKNUM) + log_smgrcreate(&dst_rnode, forkNum); + + /* Copy a fork's data, block by block. */ + RelationCopyStorageUsingBuffer(src_rel, dst_rel, forkNum, + permanent); + } + } + + /* Release fake relcache entries. */ + FreeFakeRelcacheEntry(src_rel); + FreeFakeRelcacheEntry(dst_rel); +} + /* --------------------------------------------------------------------- * FlushDatabaseBuffers * diff --git a/src/backend/storage/lmgr/lmgr.c b/src/backend/storage/lmgr/lmgr.c index 5ae52dd14d..1543da6162 100644 --- a/src/backend/storage/lmgr/lmgr.c +++ b/src/backend/storage/lmgr/lmgr.c @@ -175,6 +175,34 @@ ConditionalLockRelationOid(Oid relid, LOCKMODE lockmode) return true; } +/* + * LockRelationId + * + * Lock, given a LockRelId. Same as LockRelationOid but take LockRelId as an + * input. + */ +void +LockRelationId(LockRelId *relid, LOCKMODE lockmode) +{ + LOCKTAG tag; + LOCALLOCK *locallock; + LockAcquireResult res; + + SET_LOCKTAG_RELATION(tag, relid->dbId, relid->relId); + + res = LockAcquireExtended(&tag, lockmode, false, false, true, &locallock); + + /* + * Now that we have the lock, check for invalidation messages; see notes + * in LockRelationOid. + */ + if (res != LOCKACQUIRE_ALREADY_CLEAR) + { + AcceptInvalidationMessages(); + MarkLockClear(locallock); + } +} + /* * UnlockRelationId * diff --git a/src/backend/utils/activity/wait_event.c b/src/backend/utils/activity/wait_event.c index ff46a0e3c7..1c8aba4925 100644 --- a/src/backend/utils/activity/wait_event.c +++ b/src/backend/utils/activity/wait_event.c @@ -705,6 +705,9 @@ pgstat_get_wait_io(WaitEventIO w) case WAIT_EVENT_TWOPHASE_FILE_WRITE: event_name = "TwophaseFileWrite"; break; + case WAIT_EVENT_VERSION_FILE_WRITE: + event_name = "VersionFileWrite"; + break; case WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ: event_name = "WALSenderTimelineHistoryRead"; break; diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index d47fac7bb9..a15ce9edb1 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -3746,7 +3746,7 @@ RelationSetNewRelfilenode(Relation relation, char persistence) /* handle these directly, at least for now */ SMgrRelation srel; - srel = RelationCreateStorage(newrnode, persistence); + srel = RelationCreateStorage(newrnode, persistence, true); smgrclose(srel); } else diff --git a/src/backend/utils/cache/relmapper.c b/src/backend/utils/cache/relmapper.c index 4d0718f001..dee3387d02 100644 --- a/src/backend/utils/cache/relmapper.c +++ b/src/backend/utils/cache/relmapper.c @@ -251,6 +251,63 @@ RelationMapFilenodeToOid(Oid filenode, bool shared) return InvalidOid; } +/* + * RelationMapOidToFilenodeForDatabase + * + * Like RelationMapOidToFilenode, but reads the mapping from the indicated + * path instead of using the one for the current database. + */ +Oid +RelationMapOidToFilenodeForDatabase(char *dbpath, Oid relationId) +{ + RelMapFile map; + int i; + + /* Read the relmap file from the source database. */ + read_relmap_file(&map, dbpath, false, ERROR); + + /* Iterate over the relmap entries to find the input relation OID. */ + for (i = 0; i < map.num_mappings; i++) + { + if (relationId == map.mappings[i].mapoid) + return map.mappings[i].mapfilenode; + } + + return InvalidOid; +} + +/* + * RelationMapCopy + * + * Copy relmapfile from source db path to the destination db path and WAL log + * the operation. This is intended for use in creating a new relmap file + * for a database that doesn't have one yet, not for replacing an existing + * relmap file. + */ +void +RelationMapCopy(Oid dbid, Oid tsid, char *srcdbpath, char *dstdbpath) +{ + RelMapFile map; + + /* + * Read the relmap file from the source database. + */ + read_relmap_file(&map, srcdbpath, false, ERROR); + + /* + * Write the same data into the destination database's relmap file. + * + * No sinval is needed because no one can be connected to the destination + * database yet. For the same reason, there is no need to acquire + * RelationMappingLock. + * + * There's no point in trying to preserve files here. The new database + * isn't usable yet anyway, and won't ever be if we can't install a + * relmap file. + */ + write_relmap_file(&map, true, false, false, dbid, tsid, dstdbpath); +} + /* * RelationMapUpdateMap * @@ -1031,6 +1088,13 @@ relmap_redo(XLogReaderState *record) * * There shouldn't be anyone else updating relmaps during WAL replay, * but grab the lock to interlock against load_relmap_file(). + * + * Note that we use the same WAL record for updating the relmap of + * an existing database as we do for creating a new database. In + * the latter case, taking the relmap log and sending sinval messages + * is unnecessary, but harmless. If we wanted to avoid it, we could + * add a flag to the WAL record to indicate which opration is being + * performed. */ LWLockAcquire(RelationMappingLock, LW_EXCLUSIVE); write_relmap_file(&newmap, false, true, false, diff --git a/src/bin/pg_rewind/parsexlog.c b/src/bin/pg_rewind/parsexlog.c index 3ed2a2e811..49966e7b7f 100644 --- a/src/bin/pg_rewind/parsexlog.c +++ b/src/bin/pg_rewind/parsexlog.c @@ -372,7 +372,7 @@ extractPageInfo(XLogReaderState *record) /* Is this a special record type that I recognize? */ - if (rmid == RM_DBASE_ID && rminfo == XLOG_DBASE_CREATE) + if (rmid == RM_DBASE_ID && rminfo == XLOG_DBASE_CREATE_FILE_COPY) { /* * New databases can be safely ignored. It won't be present in the @@ -384,6 +384,13 @@ extractPageInfo(XLogReaderState *record) * overwriting the database created in the target system. */ } + else if (rmid == RM_DBASE_ID && rminfo == XLOG_DBASE_CREATE_WAL_LOG) + { + /* + * New databases can be safely ignored. It won't be present in the + * source system, so it will be deleted. + */ + } else if (rmid == RM_DBASE_ID && rminfo == XLOG_DBASE_DROP) { /* diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index c97d3e87f0..3f9dfffd57 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -2791,13 +2791,15 @@ psql_completion(const char *text, int start, int end) /* CREATE DATABASE */ else if (Matches("CREATE", "DATABASE", MatchAny)) COMPLETE_WITH("OWNER", "TEMPLATE", "ENCODING", "TABLESPACE", - "IS_TEMPLATE", + "IS_TEMPLATE", "STRATEGY", "ALLOW_CONNECTIONS", "CONNECTION LIMIT", "LC_COLLATE", "LC_CTYPE", "LOCALE", "OID", "LOCALE_PROVIDER", "ICU_LOCALE"); else if (Matches("CREATE", "DATABASE", MatchAny, "TEMPLATE")) COMPLETE_WITH_QUERY(Query_for_list_of_template_databases); + else if (Matches("CREATE", "DATABASE", MatchAny, "STRATEGY")) + COMPLETE_WITH("WAL_LOG", "FILE_COPY"); /* CREATE DOMAIN */ else if (Matches("CREATE", "DOMAIN", MatchAny)) diff --git a/src/bin/scripts/createdb.c b/src/bin/scripts/createdb.c index 6f612abf7c..0bffa2f3ee 100644 --- a/src/bin/scripts/createdb.c +++ b/src/bin/scripts/createdb.c @@ -34,6 +34,7 @@ main(int argc, char *argv[]) {"tablespace", required_argument, NULL, 'D'}, {"template", required_argument, NULL, 'T'}, {"encoding", required_argument, NULL, 'E'}, + {"strategy", required_argument, NULL, 'S'}, {"lc-collate", required_argument, NULL, 1}, {"lc-ctype", required_argument, NULL, 2}, {"locale", required_argument, NULL, 'l'}, @@ -60,6 +61,7 @@ main(int argc, char *argv[]) char *tablespace = NULL; char *template = NULL; char *encoding = NULL; + char *strategy = NULL; char *lc_collate = NULL; char *lc_ctype = NULL; char *locale = NULL; @@ -77,7 +79,7 @@ main(int argc, char *argv[]) handle_help_version_opts(argc, argv, "createdb", help); - while ((c = getopt_long(argc, argv, "h:p:U:wWeO:D:T:E:l:", long_options, &optindex)) != -1) + while ((c = getopt_long(argc, argv, "h:p:U:wWeO:D:T:E:l:S:", long_options, &optindex)) != -1) { switch (c) { @@ -111,6 +113,9 @@ main(int argc, char *argv[]) case 'E': encoding = pg_strdup(optarg); break; + case 'S': + strategy = pg_strdup(optarg); + break; case 1: lc_collate = pg_strdup(optarg); break; @@ -215,6 +220,8 @@ main(int argc, char *argv[]) appendPQExpBufferStr(&sql, " ENCODING "); appendStringLiteralConn(&sql, encoding, conn); } + if (strategy) + appendPQExpBuffer(&sql, " STRATEGY %s", fmtId(strategy)); if (template) appendPQExpBuffer(&sql, " TEMPLATE %s", fmtId(template)); if (lc_collate) @@ -294,6 +301,7 @@ help(const char *progname) printf(_(" --locale-provider={libc|icu}\n" " locale provider for the database's default collation\n")); printf(_(" -O, --owner=OWNER database user to own the new database\n")); + printf(_(" -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n")); printf(_(" -T, --template=TEMPLATE template database to copy\n")); printf(_(" -V, --version output version information, then exit\n")); printf(_(" -?, --help show this help, then exit\n")); diff --git a/src/bin/scripts/t/020_createdb.pl b/src/bin/scripts/t/020_createdb.pl index 35deec9a92..14d3a9563d 100644 --- a/src/bin/scripts/t/020_createdb.pl +++ b/src/bin/scripts/t/020_createdb.pl @@ -104,4 +104,24 @@ ], 'createdb with incorrect --lc-ctype'); +$node->command_checks_all( + [ 'createdb', '--strategy', "foo", 'foobar2' ], + 1, + [qr/^$/], + [ + qr/^createdb: error: database creation failed: ERROR: invalid create database strategy|^createdb: error: database creation failed: ERROR: invalid create database strategy foo/s + ], + 'createdb with incorrect --strategy'); + +# Check database creation strategy +$node->issues_sql_like( + [ 'createdb', '-T', 'foobar2', 'foobar6', '-S', 'wal_log'], + qr/statement: CREATE DATABASE foobar6 STRATEGY wal_log TEMPLATE foobar2/, + 'create database with WAL_LOG strategy'); + +$node->issues_sql_like( + [ 'createdb', '-T', 'foobar2', 'foobar7', '-S', 'file_copy'], + qr/statement: CREATE DATABASE foobar7 STRATEGY file_copy TEMPLATE foobar2/, + 'create database with FILE_COPY strategy'); + done_testing(); diff --git a/src/include/catalog/storage.h b/src/include/catalog/storage.h index 9ffc741913..844a023b2c 100644 --- a/src/include/catalog/storage.h +++ b/src/include/catalog/storage.h @@ -22,7 +22,9 @@ /* GUC variables */ extern int wal_skip_threshold; -extern SMgrRelation RelationCreateStorage(RelFileNode rnode, char relpersistence); +extern SMgrRelation RelationCreateStorage(RelFileNode rnode, + char relpersistence, + bool register_delete); extern void RelationDropStorage(Relation rel); extern void RelationPreserveStorage(RelFileNode rnode, bool atCommit); extern void RelationPreTruncate(Relation rel); diff --git a/src/include/commands/dbcommands_xlog.h b/src/include/commands/dbcommands_xlog.h index 593a8578a4..0ee2452feb 100644 --- a/src/include/commands/dbcommands_xlog.h +++ b/src/include/commands/dbcommands_xlog.h @@ -18,17 +18,32 @@ #include "lib/stringinfo.h" /* record types */ -#define XLOG_DBASE_CREATE 0x00 -#define XLOG_DBASE_DROP 0x10 +#define XLOG_DBASE_CREATE_FILE_COPY 0x00 +#define XLOG_DBASE_CREATE_WAL_LOG 0x10 +#define XLOG_DBASE_DROP 0x20 -typedef struct xl_dbase_create_rec +/* + * Single WAL record for an entire CREATE DATABASE operation. This is used + * by the FILE_COPY strategy. + */ +typedef struct xl_dbase_create_file_copy_rec { - /* Records copying of a single subdirectory incl. contents */ Oid db_id; Oid tablespace_id; Oid src_db_id; Oid src_tablespace_id; -} xl_dbase_create_rec; +} xl_dbase_create_file_copy_rec; + +/* + * WAL record for the beginning of a CREATE DATABASE operation, when the + * WAL_LOG strategy is used. Each individual block will be logged separately + * afterward. + */ +typedef struct xl_dbase_create_wal_log_rec +{ + Oid db_id; + Oid tablespace_id; +} xl_dbase_create_wal_log_rec; typedef struct xl_dbase_drop_rec { diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h index dd01841c30..a6b657f0ba 100644 --- a/src/include/storage/bufmgr.h +++ b/src/include/storage/bufmgr.h @@ -184,7 +184,8 @@ extern Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BufferAccessStrategy strategy); extern Buffer ReadBufferWithoutRelcache(RelFileNode rnode, ForkNumber forkNum, BlockNumber blockNum, - ReadBufferMode mode, BufferAccessStrategy strategy); + ReadBufferMode mode, BufferAccessStrategy strategy, + bool permanent); extern void ReleaseBuffer(Buffer buffer); extern void UnlockReleaseBuffer(Buffer buffer); extern void MarkBufferDirty(Buffer buffer); @@ -203,6 +204,9 @@ extern BlockNumber RelationGetNumberOfBlocksInFork(Relation relation, extern void FlushOneBuffer(Buffer buffer); extern void FlushRelationBuffers(Relation rel); extern void FlushRelationsAllBuffers(struct SMgrRelationData **smgrs, int nrels); +extern void CreateAndCopyRelationData(RelFileNode src_rnode, + RelFileNode dst_rnode, + bool permanent); extern void FlushDatabaseBuffers(Oid dbid); extern void DropRelFileNodeBuffers(struct SMgrRelationData *smgr_reln, ForkNumber *forkNum, int nforks, BlockNumber *firstDelBlock); diff --git a/src/include/storage/lmgr.h b/src/include/storage/lmgr.h index 49edbcc81b..be1d2c99a9 100644 --- a/src/include/storage/lmgr.h +++ b/src/include/storage/lmgr.h @@ -38,6 +38,7 @@ extern void RelationInitLockInfo(Relation relation); /* Lock a relation */ extern void LockRelationOid(Oid relid, LOCKMODE lockmode); +extern void LockRelationId(LockRelId *relid, LOCKMODE lockmode); extern bool ConditionalLockRelationOid(Oid relid, LOCKMODE lockmode); extern void UnlockRelationId(LockRelId *relid, LOCKMODE lockmode); extern void UnlockRelationOid(Oid relid, LOCKMODE lockmode); diff --git a/src/include/utils/relmapper.h b/src/include/utils/relmapper.h index 9fbb5a7f9b..f10353e139 100644 --- a/src/include/utils/relmapper.h +++ b/src/include/utils/relmapper.h @@ -38,7 +38,9 @@ typedef struct xl_relmap_update extern Oid RelationMapOidToFilenode(Oid relationId, bool shared); extern Oid RelationMapFilenodeToOid(Oid relationId, bool shared); - +extern Oid RelationMapOidToFilenodeForDatabase(char *dbpath, Oid relationId); +extern void RelationMapCopy(Oid dbid, Oid tsid, char *srcdbpath, + char *dstdbpath); extern void RelationMapUpdateMap(Oid relationId, Oid fileNode, bool shared, bool immediate); diff --git a/src/include/utils/wait_event.h b/src/include/utils/wait_event.h index 1c39ce031a..d870c59263 100644 --- a/src/include/utils/wait_event.h +++ b/src/include/utils/wait_event.h @@ -218,6 +218,7 @@ typedef enum WAIT_EVENT_TWOPHASE_FILE_READ, WAIT_EVENT_TWOPHASE_FILE_SYNC, WAIT_EVENT_TWOPHASE_FILE_WRITE, + WAIT_EVENT_VERSION_FILE_WRITE, WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ, WAIT_EVENT_WAL_BOOTSTRAP_SYNC, WAIT_EVENT_WAL_BOOTSTRAP_WRITE, diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 410c9f6b0d..6b77cc64ef 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -461,6 +461,8 @@ CoverPos CreateAmStmt CreateCastStmt CreateConversionStmt +CreateDBRelInfo +CreateDBStrategy CreateDomainStmt CreateEnumStmt CreateEventTrigStmt @@ -3705,7 +3707,8 @@ xl_btree_update xl_btree_vacuum xl_clog_truncate xl_commit_ts_truncate -xl_dbase_create_rec +xl_dbase_create_file_copy_rec +xl_dbase_create_wal_log_rec xl_dbase_drop_rec xl_end_of_recovery xl_hash_add_ovfl_page From 3d067c53b26dfeb95da0d75a65614b4d7b45c317 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 29 Mar 2022 13:48:39 -0400 Subject: [PATCH 298/772] In 020_createdb.pl, change order of command-line arguments. Linux thinks that something like "createdb foo -S bar" is perfectly fine, but Windows wants the options to precede any bare arguments, so we must write "createdb -S bar foo" for portability. Per reports from CI, the buildfarm, and Andres. Discussion: http://postgr.es/m/20220329173536.7d2ywdatsprxl4x6@alap3.anarazel.de --- src/bin/scripts/t/020_createdb.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/scripts/t/020_createdb.pl b/src/bin/scripts/t/020_createdb.pl index 14d3a9563d..b81f06a251 100644 --- a/src/bin/scripts/t/020_createdb.pl +++ b/src/bin/scripts/t/020_createdb.pl @@ -115,12 +115,12 @@ # Check database creation strategy $node->issues_sql_like( - [ 'createdb', '-T', 'foobar2', 'foobar6', '-S', 'wal_log'], + [ 'createdb', '-T', 'foobar2', '-S', 'wal_log', 'foobar6' ], qr/statement: CREATE DATABASE foobar6 STRATEGY wal_log TEMPLATE foobar2/, 'create database with WAL_LOG strategy'); $node->issues_sql_like( - [ 'createdb', '-T', 'foobar2', 'foobar7', '-S', 'file_copy'], + [ 'createdb', '-T', 'foobar2', '-S', 'file_copy', 'foobar7' ], qr/statement: CREATE DATABASE foobar7 STRATEGY file_copy TEMPLATE foobar2/, 'create database with FILE_COPY strategy'); From 1a36bc9dba8eae90963a586d37b6457b32b2fed4 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 3 Mar 2022 13:11:14 -0500 Subject: [PATCH 299/772] SQL/JSON query functions This introduces the SQL/JSON functions for querying JSON data using jsonpath expressions. The functions are: JSON_EXISTS() JSON_QUERY() JSON_VALUE() All of these functions only operate on jsonb. The workaround for now is to cast the argument to jsonb. JSON_EXISTS() tests if the jsonpath expression applied to the jsonb value yields any values. JSON_VALUE() must return a single value, and an error occurs if it tries to return multiple values. JSON_QUERY() must return a json object or array, and there are various WRAPPER options for handling scalar or multi-value results. Both these functions have options for handling EMPTY and ERROR conditions. Nikita Glukhov Reviewers have included (in no particular order) Andres Freund, Alexander Korotkov, Pavel Stehule, Andrew Alsup, Erik Rijkers, Zihong Yu, Himanshu Upadhyaya, Daniel Gustafsson, Justin Pryzby. Discussion: https://postgr.es/m/cd0bb935-0158-78a7-08b5-904886deac4b@postgrespro.ru --- src/backend/executor/execExpr.c | 206 +++- src/backend/executor/execExprInterp.c | 543 ++++++++++ src/backend/jit/llvm/llvmjit_expr.c | 6 + src/backend/jit/llvm/llvmjit_types.c | 1 + src/backend/nodes/copyfuncs.c | 150 +++ src/backend/nodes/equalfuncs.c | 127 +++ src/backend/nodes/makefuncs.c | 15 + src/backend/nodes/nodeFuncs.c | 186 +++- src/backend/nodes/outfuncs.c | 70 ++ src/backend/nodes/readfuncs.c | 86 ++ src/backend/optimizer/path/costsize.c | 3 +- src/backend/optimizer/util/clauses.c | 32 + src/backend/parser/gram.y | 333 +++++- src/backend/parser/parse_collate.c | 4 + src/backend/parser/parse_expr.c | 490 ++++++++- src/backend/parser/parse_target.c | 15 + src/backend/utils/adt/formatting.c | 45 +- src/backend/utils/adt/jsonb.c | 62 ++ src/backend/utils/adt/jsonfuncs.c | 50 +- src/backend/utils/adt/jsonpath.c | 257 +++++ src/backend/utils/adt/jsonpath_exec.c | 350 ++++++- src/backend/utils/adt/ruleutils.c | 135 +++ src/backend/utils/misc/queryjumble.c | 21 + src/include/executor/execExpr.h | 54 + src/include/executor/executor.h | 2 + src/include/nodes/makefuncs.h | 1 + src/include/nodes/nodes.h | 7 + src/include/nodes/parsenodes.h | 59 ++ src/include/nodes/primnodes.h | 109 ++ src/include/parser/kwlist.h | 11 + src/include/utils/formatting.h | 4 + src/include/utils/jsonb.h | 3 + src/include/utils/jsonfuncs.h | 4 + src/include/utils/jsonpath.h | 33 + src/test/regress/expected/json_sqljson.out | 15 + src/test/regress/expected/jsonb_sqljson.out | 1018 +++++++++++++++++++ src/test/regress/parallel_schedule | 2 +- src/test/regress/sql/json_sqljson.sql | 11 + src/test/regress/sql/jsonb_sqljson.sql | 317 ++++++ 39 files changed, 4716 insertions(+), 121 deletions(-) create mode 100644 src/test/regress/expected/json_sqljson.out create mode 100644 src/test/regress/expected/jsonb_sqljson.out create mode 100644 src/test/regress/sql/json_sqljson.sql create mode 100644 src/test/regress/sql/jsonb_sqljson.sql diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index acd3ea6134..1c364a7f4c 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -47,6 +47,7 @@ #include "utils/array.h" #include "utils/builtins.h" #include "utils/datum.h" +#include "utils/jsonpath.h" #include "utils/lsyscache.h" #include "utils/typcache.h" @@ -85,6 +86,40 @@ static void ExecBuildAggTransCall(ExprState *state, AggState *aggstate, bool nullcheck); +static ExprState * +ExecInitExprInternal(Expr *node, PlanState *parent, ParamListInfo ext_params, + Datum *caseval, bool *casenull) +{ + ExprState *state; + ExprEvalStep scratch = {0}; + + /* Special case: NULL expression produces a NULL ExprState pointer */ + if (node == NULL) + return NULL; + + /* Initialize ExprState with empty step list */ + state = makeNode(ExprState); + state->expr = node; + state->parent = parent; + state->ext_params = ext_params; + state->innermost_caseval = caseval; + state->innermost_casenull = casenull; + + /* Insert EEOP_*_FETCHSOME steps as needed */ + ExecInitExprSlots(state, (Node *) node); + + /* Compile the expression proper */ + ExecInitExprRec(node, state, &state->resvalue, &state->resnull); + + /* Finally, append a DONE step */ + scratch.opcode = EEOP_DONE; + ExprEvalPushStep(state, &scratch); + + ExecReadyExpr(state); + + return state; +} + /* * ExecInitExpr: prepare an expression tree for execution * @@ -122,32 +157,7 @@ static void ExecBuildAggTransCall(ExprState *state, AggState *aggstate, ExprState * ExecInitExpr(Expr *node, PlanState *parent) { - ExprState *state; - ExprEvalStep scratch = {0}; - - /* Special case: NULL expression produces a NULL ExprState pointer */ - if (node == NULL) - return NULL; - - /* Initialize ExprState with empty step list */ - state = makeNode(ExprState); - state->expr = node; - state->parent = parent; - state->ext_params = NULL; - - /* Insert EEOP_*_FETCHSOME steps as needed */ - ExecInitExprSlots(state, (Node *) node); - - /* Compile the expression proper */ - ExecInitExprRec(node, state, &state->resvalue, &state->resnull); - - /* Finally, append a DONE step */ - scratch.opcode = EEOP_DONE; - ExprEvalPushStep(state, &scratch); - - ExecReadyExpr(state); - - return state; + return ExecInitExprInternal(node, parent, NULL, NULL, NULL); } /* @@ -159,32 +169,20 @@ ExecInitExpr(Expr *node, PlanState *parent) ExprState * ExecInitExprWithParams(Expr *node, ParamListInfo ext_params) { - ExprState *state; - ExprEvalStep scratch = {0}; - - /* Special case: NULL expression produces a NULL ExprState pointer */ - if (node == NULL) - return NULL; - - /* Initialize ExprState with empty step list */ - state = makeNode(ExprState); - state->expr = node; - state->parent = NULL; - state->ext_params = ext_params; - - /* Insert EEOP_*_FETCHSOME steps as needed */ - ExecInitExprSlots(state, (Node *) node); - - /* Compile the expression proper */ - ExecInitExprRec(node, state, &state->resvalue, &state->resnull); - - /* Finally, append a DONE step */ - scratch.opcode = EEOP_DONE; - ExprEvalPushStep(state, &scratch); - - ExecReadyExpr(state); + return ExecInitExprInternal(node, NULL, ext_params, NULL, NULL); +} - return state; +/* + * ExecInitExprWithCaseValue: prepare an expression tree for execution + * + * This is the same as ExecInitExpr, except that a pointer to the value for + * CasTestExpr is passed here. + */ +ExprState * +ExecInitExprWithCaseValue(Expr *node, PlanState *parent, + Datum *caseval, bool *casenull) +{ + return ExecInitExprInternal(node, parent, NULL, caseval, casenull); } /* @@ -2526,6 +2524,112 @@ ExecInitExprRec(Expr *node, ExprState *state, break; } + case T_JsonExpr: + { + JsonExpr *jexpr = castNode(JsonExpr, node); + ListCell *argexprlc; + ListCell *argnamelc; + + scratch.opcode = EEOP_JSONEXPR; + scratch.d.jsonexpr.jsexpr = jexpr; + + scratch.d.jsonexpr.formatted_expr = + palloc(sizeof(*scratch.d.jsonexpr.formatted_expr)); + + ExecInitExprRec((Expr *) jexpr->formatted_expr, state, + &scratch.d.jsonexpr.formatted_expr->value, + &scratch.d.jsonexpr.formatted_expr->isnull); + + scratch.d.jsonexpr.pathspec = + palloc(sizeof(*scratch.d.jsonexpr.pathspec)); + + ExecInitExprRec((Expr *) jexpr->path_spec, state, + &scratch.d.jsonexpr.pathspec->value, + &scratch.d.jsonexpr.pathspec->isnull); + + scratch.d.jsonexpr.res_expr = + palloc(sizeof(*scratch.d.jsonexpr.res_expr)); + + scratch.d.jsonexpr.result_expr = jexpr->result_coercion + ? ExecInitExprWithCaseValue((Expr *) jexpr->result_coercion->expr, + state->parent, + &scratch.d.jsonexpr.res_expr->value, + &scratch.d.jsonexpr.res_expr->isnull) + : NULL; + + scratch.d.jsonexpr.default_on_empty = !jexpr->on_empty ? NULL : + ExecInitExpr((Expr *) jexpr->on_empty->default_expr, + state->parent); + + scratch.d.jsonexpr.default_on_error = + ExecInitExpr((Expr *) jexpr->on_error->default_expr, + state->parent); + + if (jexpr->omit_quotes || + (jexpr->result_coercion && jexpr->result_coercion->via_io)) + { + Oid typinput; + + /* lookup the result type's input function */ + getTypeInputInfo(jexpr->returning->typid, &typinput, + &scratch.d.jsonexpr.input.typioparam); + fmgr_info(typinput, &scratch.d.jsonexpr.input.func); + } + + scratch.d.jsonexpr.args = NIL; + + forboth(argexprlc, jexpr->passing_values, + argnamelc, jexpr->passing_names) + { + Expr *argexpr = (Expr *) lfirst(argexprlc); + String *argname = lfirst_node(String, argnamelc); + JsonPathVariableEvalContext *var = palloc(sizeof(*var)); + + var->name = pstrdup(argname->sval); + var->typid = exprType((Node *) argexpr); + var->typmod = exprTypmod((Node *) argexpr); + var->estate = ExecInitExpr(argexpr, state->parent); + var->econtext = NULL; + var->evaluated = false; + var->value = (Datum) 0; + var->isnull = true; + + scratch.d.jsonexpr.args = + lappend(scratch.d.jsonexpr.args, var); + } + + scratch.d.jsonexpr.cache = NULL; + + if (jexpr->coercions) + { + JsonCoercion **coercion; + struct JsonCoercionState *cstate; + Datum *caseval; + bool *casenull; + + scratch.d.jsonexpr.coercion_expr = + palloc(sizeof(*scratch.d.jsonexpr.coercion_expr)); + + caseval = &scratch.d.jsonexpr.coercion_expr->value; + casenull = &scratch.d.jsonexpr.coercion_expr->isnull; + + for (cstate = &scratch.d.jsonexpr.coercions.null, + coercion = &jexpr->coercions->null; + coercion <= &jexpr->coercions->composite; + coercion++, cstate++) + { + cstate->coercion = *coercion; + cstate->estate = *coercion ? + ExecInitExprWithCaseValue((Expr *)(*coercion)->expr, + state->parent, + caseval, casenull) : NULL; + } + } + + ExprEvalPushStep(state, &scratch); + break; + } + default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index c0bd955620..1215f707e2 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -57,14 +57,18 @@ #include "postgres.h" #include "access/heaptoast.h" +#include "access/xact.h" +#include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "commands/sequence.h" #include "executor/execExpr.h" #include "executor/nodeSubplan.h" #include "funcapi.h" #include "miscadmin.h" +#include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "parser/parsetree.h" +#include "parser/parse_expr.h" #include "pgstat.h" #include "utils/array.h" #include "utils/builtins.h" @@ -74,8 +78,10 @@ #include "utils/json.h" #include "utils/jsonb.h" #include "utils/jsonfuncs.h" +#include "utils/jsonpath.h" #include "utils/lsyscache.h" #include "utils/memutils.h" +#include "utils/resowner.h" #include "utils/timestamp.h" #include "utils/typcache.h" #include "utils/xml.h" @@ -482,6 +488,7 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) &&CASE_EEOP_SUBPLAN, &&CASE_EEOP_JSON_CONSTRUCTOR, &&CASE_EEOP_IS_JSON, + &&CASE_EEOP_JSONEXPR, &&CASE_EEOP_AGG_STRICT_DESERIALIZE, &&CASE_EEOP_AGG_DESERIALIZE, &&CASE_EEOP_AGG_STRICT_INPUT_CHECK_ARGS, @@ -1805,7 +1812,13 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) { /* too complex for an inline implementation */ ExecEvalJsonIsPredicate(state, op); + EEO_NEXT(); + } + EEO_CASE(EEOP_JSONEXPR) + { + /* too complex for an inline implementation */ + ExecEvalJson(state, op, econtext); EEO_NEXT(); } @@ -4523,3 +4536,533 @@ ExecEvalJsonConstructor(ExprState *state, ExprEvalStep *op, *op->resvalue = res; *op->resnull = isnull; } + +/* + * Evaluate a JSON error/empty behavior result. + */ +static Datum +ExecEvalJsonBehavior(ExprContext *econtext, JsonBehavior *behavior, + ExprState *default_estate, bool *is_null) +{ + *is_null = false; + + switch (behavior->btype) + { + case JSON_BEHAVIOR_EMPTY_ARRAY: + return JsonbPGetDatum(JsonbMakeEmptyArray()); + + case JSON_BEHAVIOR_EMPTY_OBJECT: + return JsonbPGetDatum(JsonbMakeEmptyObject()); + + case JSON_BEHAVIOR_TRUE: + return BoolGetDatum(true); + + case JSON_BEHAVIOR_FALSE: + return BoolGetDatum(false); + + case JSON_BEHAVIOR_NULL: + case JSON_BEHAVIOR_UNKNOWN: + *is_null = true; + return (Datum) 0; + + case JSON_BEHAVIOR_DEFAULT: + return ExecEvalExpr(default_estate, econtext, is_null); + + default: + elog(ERROR, "unrecognized SQL/JSON behavior %d", behavior->btype); + return (Datum) 0; + } +} + +/* + * Evaluate a coercion of a JSON item to the target type. + */ +static Datum +ExecEvalJsonExprCoercion(ExprEvalStep *op, ExprContext *econtext, + Datum res, bool *isNull, void *p, bool *error) +{ + ExprState *estate = p; + + if (estate) /* coerce using specified expression */ + return ExecEvalExpr(estate, econtext, isNull); + + if (op->d.jsonexpr.jsexpr->op != JSON_EXISTS_OP) + { + JsonCoercion *coercion = op->d.jsonexpr.jsexpr->result_coercion; + JsonExpr *jexpr = op->d.jsonexpr.jsexpr; + Jsonb *jb = *isNull ? NULL : DatumGetJsonbP(res); + + if ((coercion && coercion->via_io) || + (jexpr->omit_quotes && !*isNull && + JB_ROOT_IS_SCALAR(jb))) + { + /* strip quotes and call typinput function */ + char *str = *isNull ? NULL : JsonbUnquote(jb); + + return InputFunctionCall(&op->d.jsonexpr.input.func, str, + op->d.jsonexpr.input.typioparam, + jexpr->returning->typmod); + } + else if (coercion && coercion->via_populate) + return json_populate_type(res, JSONBOID, + jexpr->returning->typid, + jexpr->returning->typmod, + &op->d.jsonexpr.cache, + econtext->ecxt_per_query_memory, + isNull); + } + + if (op->d.jsonexpr.result_expr) + { + op->d.jsonexpr.res_expr->value = res; + op->d.jsonexpr.res_expr->isnull = *isNull; + + res = ExecEvalExpr(op->d.jsonexpr.result_expr, econtext, isNull); + } + + return res; +} + +/* + * Evaluate a JSON path variable caching computed value. + */ +int +EvalJsonPathVar(void *cxt, char *varName, int varNameLen, + JsonbValue *val, JsonbValue *baseObject) +{ + JsonPathVariableEvalContext *var = NULL; + List *vars = cxt; + ListCell *lc; + int id = 1; + + if (!varName) + return list_length(vars); + + foreach(lc, vars) + { + var = lfirst(lc); + + if (!strncmp(var->name, varName, varNameLen)) + break; + + var = NULL; + id++; + } + + if (!var) + return -1; + + if (!var->evaluated) + { + var->value = ExecEvalExpr(var->estate, var->econtext, &var->isnull); + var->evaluated = true; + } + + if (var->isnull) + { + val->type = jbvNull; + return 0; + } + + JsonItemFromDatum(var->value, var->typid, var->typmod, val); + + *baseObject = *val; + return id; +} + +/* + * Prepare SQL/JSON item coercion to the output type. Returned a datum of the + * corresponding SQL type and a pointer to the coercion state. + */ +Datum +ExecPrepareJsonItemCoercion(JsonbValue *item, + JsonReturning *returning, + struct JsonCoercionsState *coercions, + struct JsonCoercionState **pcoercion) +{ + struct JsonCoercionState *coercion; + Datum res; + JsonbValue buf; + + if (item->type == jbvBinary && + JsonContainerIsScalar(item->val.binary.data)) + { + bool res PG_USED_FOR_ASSERTS_ONLY; + + res = JsonbExtractScalar(item->val.binary.data, &buf); + item = &buf; + Assert(res); + } + + /* get coercion state reference and datum of the corresponding SQL type */ + switch (item->type) + { + case jbvNull: + coercion = &coercions->null; + res = (Datum) 0; + break; + + case jbvString: + coercion = &coercions->string; + res = PointerGetDatum( + cstring_to_text_with_len(item->val.string.val, + item->val.string.len)); + break; + + case jbvNumeric: + coercion = &coercions->numeric; + res = NumericGetDatum(item->val.numeric); + break; + + case jbvBool: + coercion = &coercions->boolean; + res = BoolGetDatum(item->val.boolean); + break; + + case jbvDatetime: + res = item->val.datetime.value; + switch (item->val.datetime.typid) + { + case DATEOID: + coercion = &coercions->date; + break; + case TIMEOID: + coercion = &coercions->time; + break; + case TIMETZOID: + coercion = &coercions->timetz; + break; + case TIMESTAMPOID: + coercion = &coercions->timestamp; + break; + case TIMESTAMPTZOID: + coercion = &coercions->timestamptz; + break; + default: + elog(ERROR, "unexpected jsonb datetime type oid %d", + item->val.datetime.typid); + return (Datum) 0; + } + break; + + case jbvArray: + case jbvObject: + case jbvBinary: + coercion = &coercions->composite; + res = JsonbPGetDatum(JsonbValueToJsonb(item)); + break; + + default: + elog(ERROR, "unexpected jsonb value type %d", item->type); + return (Datum) 0; + } + + *pcoercion = coercion; + + return res; +} + +typedef Datum (*JsonFunc)(ExprEvalStep *op, ExprContext *econtext, + Datum item, bool *resnull, void *p, bool *error); + +static Datum +ExecEvalJsonExprSubtrans(JsonFunc func, ExprEvalStep *op, + ExprContext *econtext, + Datum res, bool *resnull, + void *p, bool *error, bool subtrans) +{ + MemoryContext oldcontext; + ResourceOwner oldowner; + + if (!subtrans) + /* No need to use subtransactions. */ + return func(op, econtext, res, resnull, p, error); + + /* + * We should catch exceptions of category ERRCODE_DATA_EXCEPTION + * and execute the corresponding ON ERROR behavior then. + */ + oldcontext = CurrentMemoryContext; + oldowner = CurrentResourceOwner; + + Assert(error); + + BeginInternalSubTransaction(NULL); + /* Want to execute expressions inside function's memory context */ + MemoryContextSwitchTo(oldcontext); + + PG_TRY(); + { + res = func(op, econtext, res, resnull, p, error); + + /* Commit the inner transaction, return to outer xact context */ + ReleaseCurrentSubTransaction(); + MemoryContextSwitchTo(oldcontext); + CurrentResourceOwner = oldowner; + } + PG_CATCH(); + { + ErrorData *edata; + + /* Save error info in oldcontext */ + MemoryContextSwitchTo(oldcontext); + edata = CopyErrorData(); + FlushErrorState(); + + /* Abort the inner transaction */ + RollbackAndReleaseCurrentSubTransaction(); + MemoryContextSwitchTo(oldcontext); + CurrentResourceOwner = oldowner; + + if (ERRCODE_TO_CATEGORY(edata->sqlerrcode) != + ERRCODE_DATA_EXCEPTION) + ReThrowError(edata); + + res = (Datum) 0; + *error = true; + } + PG_END_TRY(); + + return res; +} + + +typedef struct +{ + JsonPath *path; + bool *error; + bool coercionInSubtrans; +} ExecEvalJsonExprContext; + +static Datum +ExecEvalJsonExpr(ExprEvalStep *op, ExprContext *econtext, + Datum item, bool *resnull, void *pcxt, + bool *error) +{ + ExecEvalJsonExprContext *cxt = pcxt; + JsonPath *path = cxt->path; + JsonExpr *jexpr = op->d.jsonexpr.jsexpr; + ExprState *estate = NULL; + bool empty = false; + Datum res = (Datum) 0; + + switch (jexpr->op) + { + case JSON_QUERY_OP: + res = JsonPathQuery(item, path, jexpr->wrapper, &empty, error, + op->d.jsonexpr.args); + if (error && *error) + { + *resnull = true; + return (Datum) 0; + } + *resnull = !DatumGetPointer(res); + break; + + case JSON_VALUE_OP: + { + struct JsonCoercionState *jcstate; + JsonbValue *jbv = JsonPathValue(item, path, &empty, error, + op->d.jsonexpr.args); + + if (error && *error) + return (Datum) 0; + + if (!jbv) /* NULL or empty */ + break; + + Assert(!empty); + + *resnull = false; + + /* coerce scalar item to the output type */ + if (jexpr->returning->typid == JSONOID || + jexpr->returning->typid == JSONBOID) + { + /* Use result coercion from json[b] to the output type */ + res = JsonbPGetDatum(JsonbValueToJsonb(jbv)); + break; + } + + /* Use coercion from SQL/JSON item type to the output type */ + res = ExecPrepareJsonItemCoercion(jbv, + op->d.jsonexpr.jsexpr->returning, + &op->d.jsonexpr.coercions, + &jcstate); + + if (jcstate->coercion && + (jcstate->coercion->via_io || + jcstate->coercion->via_populate)) + { + if (error) + { + *error = true; + return (Datum) 0; + } + /* + * Coercion via I/O means here that the cast to the target + * type simply does not exist. + */ + ereport(ERROR, + /* + * XXX Standard says about a separate error code + * ERRCODE_SQL_JSON_ITEM_CANNOT_BE_CAST_TO_TARGET_TYPE + * but does not define its number. + */ + (errcode(ERRCODE_SQL_JSON_SCALAR_REQUIRED), + errmsg("SQL/JSON item cannot be cast to target type"))); + } + else if (!jcstate->estate) + return res; /* no coercion */ + + /* coerce using specific expression */ + estate = jcstate->estate; + op->d.jsonexpr.coercion_expr->value = res; + op->d.jsonexpr.coercion_expr->isnull = *resnull; + break; + } + + case JSON_EXISTS_OP: + { + bool exists = JsonPathExists(item, path, + op->d.jsonexpr.args, + error); + + *resnull = error && *error; + res = BoolGetDatum(exists); + + if (!op->d.jsonexpr.result_expr) + return res; + + /* coerce using result expression */ + estate = op->d.jsonexpr.result_expr; + op->d.jsonexpr.res_expr->value = res; + op->d.jsonexpr.res_expr->isnull = *resnull; + break; + } + + default: + elog(ERROR, "unrecognized SQL/JSON expression op %d", jexpr->op); + return (Datum) 0; + } + + if (empty) + { + Assert(jexpr->on_empty); /* it is not JSON_EXISTS */ + + if (jexpr->on_empty->btype == JSON_BEHAVIOR_ERROR) + { + if (error) + { + *error = true; + return (Datum) 0; + } + + ereport(ERROR, + (errcode(ERRCODE_NO_SQL_JSON_ITEM), + errmsg("no SQL/JSON item"))); + } + + if (jexpr->on_empty->btype == JSON_BEHAVIOR_DEFAULT) + /* + * Execute DEFAULT expression as a coercion expression, because + * its result is already coerced to the target type. + */ + estate = op->d.jsonexpr.default_on_empty; + else + /* Execute ON EMPTY behavior */ + res = ExecEvalJsonBehavior(econtext, jexpr->on_empty, + op->d.jsonexpr.default_on_empty, + resnull); + } + + return ExecEvalJsonExprSubtrans(ExecEvalJsonExprCoercion, op, econtext, + res, resnull, estate, error, + cxt->coercionInSubtrans); +} + +bool +ExecEvalJsonNeedsSubTransaction(JsonExpr *jsexpr, + struct JsonCoercionsState *coercions) +{ + if (jsexpr->on_error->btype == JSON_BEHAVIOR_ERROR) + return false; + + if (jsexpr->op == JSON_EXISTS_OP && !jsexpr->result_coercion) + return false; + + if (!coercions) + return true; + + return false; +} + +/* ---------------------------------------------------------------- + * ExecEvalJson + * ---------------------------------------------------------------- + */ +void +ExecEvalJson(ExprState *state, ExprEvalStep *op, ExprContext *econtext) +{ + ExecEvalJsonExprContext cxt; + JsonExpr *jexpr = op->d.jsonexpr.jsexpr; + Datum item; + Datum res = (Datum) 0; + JsonPath *path; + ListCell *lc; + bool error = false; + bool needSubtrans; + bool throwErrors = jexpr->on_error->btype == JSON_BEHAVIOR_ERROR; + + *op->resnull = true; /* until we get a result */ + *op->resvalue = (Datum) 0; + + if (op->d.jsonexpr.formatted_expr->isnull || op->d.jsonexpr.pathspec->isnull) + { + /* execute domain checks for NULLs */ + (void) ExecEvalJsonExprCoercion(op, econtext, res, op->resnull, + NULL, NULL); + + Assert(*op->resnull); + return; + } + + item = op->d.jsonexpr.formatted_expr->value; + path = DatumGetJsonPathP(op->d.jsonexpr.pathspec->value); + + /* reset JSON path variable contexts */ + foreach(lc, op->d.jsonexpr.args) + { + JsonPathVariableEvalContext *var = lfirst(lc); + + var->econtext = econtext; + var->evaluated = false; + } + + needSubtrans = ExecEvalJsonNeedsSubTransaction(jexpr, &op->d.jsonexpr.coercions); + + cxt.path = path; + cxt.error = throwErrors ? NULL : &error; + cxt.coercionInSubtrans = !needSubtrans && !throwErrors; + Assert(!needSubtrans || cxt.error); + + res = ExecEvalJsonExprSubtrans(ExecEvalJsonExpr, op, econtext, item, + op->resnull, &cxt, cxt.error, + needSubtrans); + + if (error) + { + /* Execute ON ERROR behavior */ + res = ExecEvalJsonBehavior(econtext, jexpr->on_error, + op->d.jsonexpr.default_on_error, + op->resnull); + + /* result is already coerced in DEFAULT behavior case */ + if (jexpr->on_error->btype != JSON_BEHAVIOR_DEFAULT) + res = ExecEvalJsonExprCoercion(op, econtext, res, + op->resnull, + NULL, NULL); + } + + *op->resvalue = res; +} diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c index 02511c6aec..9c8f341d96 100644 --- a/src/backend/jit/llvm/llvmjit_expr.c +++ b/src/backend/jit/llvm/llvmjit_expr.c @@ -2360,6 +2360,12 @@ llvm_compile_expr(ExprState *state) LLVMBuildBr(b, opblocks[opno + 1]); break; + case EEOP_JSONEXPR: + build_EvalXFunc(b, mod, "ExecEvalJson", + v_state, op, v_econtext); + LLVMBuildBr(b, opblocks[opno + 1]); + break; + case EEOP_LAST: Assert(false); break; diff --git a/src/backend/jit/llvm/llvmjit_types.c b/src/backend/jit/llvm/llvmjit_types.c index 4d7029a27f..b2bda86889 100644 --- a/src/backend/jit/llvm/llvmjit_types.c +++ b/src/backend/jit/llvm/llvmjit_types.c @@ -133,6 +133,7 @@ void *referenced_functions[] = ExecEvalXmlExpr, ExecEvalJsonConstructor, ExecEvalJsonIsPredicate, + ExecEvalJson, MakeExpandedObjectReadOnlyInternal, slot_getmissingattrs, slot_getsomeattrs_int, diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index cb4b4d01f8..c42d2ed814 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -2491,6 +2491,90 @@ _copyJsonArrayQueryConstructor(const JsonArrayQueryConstructor *from) return newnode; } +/* + * _copyJsonExpr + */ +static JsonExpr * +_copyJsonExpr(const JsonExpr *from) +{ + JsonExpr *newnode = makeNode(JsonExpr); + + COPY_SCALAR_FIELD(op); + COPY_NODE_FIELD(formatted_expr); + COPY_NODE_FIELD(result_coercion); + COPY_NODE_FIELD(format); + COPY_NODE_FIELD(path_spec); + COPY_NODE_FIELD(passing_values); + COPY_NODE_FIELD(passing_names); + COPY_NODE_FIELD(returning); + COPY_NODE_FIELD(on_error); + COPY_NODE_FIELD(on_empty); + COPY_NODE_FIELD(coercions); + COPY_SCALAR_FIELD(wrapper); + COPY_SCALAR_FIELD(omit_quotes); + COPY_LOCATION_FIELD(location); + + return newnode; +} + +/* + * _copyJsonCoercion + */ +static JsonCoercion * +_copyJsonCoercion(const JsonCoercion *from) +{ + JsonCoercion *newnode = makeNode(JsonCoercion); + + COPY_NODE_FIELD(expr); + COPY_SCALAR_FIELD(via_populate); + COPY_SCALAR_FIELD(via_io); + COPY_SCALAR_FIELD(collation); + + return newnode; +} + +/* + * _copyJsonItemCoercions + */ +static JsonItemCoercions * +_copyJsonItemCoercions(const JsonItemCoercions *from) +{ + JsonItemCoercions *newnode = makeNode(JsonItemCoercions); + + COPY_NODE_FIELD(null); + COPY_NODE_FIELD(string); + COPY_NODE_FIELD(numeric); + COPY_NODE_FIELD(boolean); + COPY_NODE_FIELD(date); + COPY_NODE_FIELD(time); + COPY_NODE_FIELD(timetz); + COPY_NODE_FIELD(timestamp); + COPY_NODE_FIELD(timestamptz); + COPY_NODE_FIELD(composite); + + return newnode; +} + +/* + * _copyJsonFuncExpr + */ +static JsonFuncExpr * +_copyJsonFuncExpr(const JsonFuncExpr *from) +{ + JsonFuncExpr *newnode = makeNode(JsonFuncExpr); + + COPY_SCALAR_FIELD(op); + COPY_NODE_FIELD(common); + COPY_NODE_FIELD(output); + COPY_NODE_FIELD(on_empty); + COPY_NODE_FIELD(on_error); + COPY_SCALAR_FIELD(wrapper); + COPY_SCALAR_FIELD(omit_quotes); + COPY_LOCATION_FIELD(location); + + return newnode; +} + /* * _copyJsonIsPredicate */ @@ -2508,6 +2592,51 @@ _copyJsonIsPredicate(const JsonIsPredicate *from) return newnode; } +/* + * _copyJsonBehavior + */ +static JsonBehavior * +_copyJsonBehavior(const JsonBehavior *from) +{ + JsonBehavior *newnode = makeNode(JsonBehavior); + + COPY_SCALAR_FIELD(btype); + COPY_NODE_FIELD(default_expr); + + return newnode; +} + +/* + * _copyJsonCommon + */ +static JsonCommon * +_copyJsonCommon(const JsonCommon *from) +{ + JsonCommon *newnode = makeNode(JsonCommon); + + COPY_NODE_FIELD(expr); + COPY_NODE_FIELD(pathspec); + COPY_STRING_FIELD(pathname); + COPY_NODE_FIELD(passing); + COPY_LOCATION_FIELD(location); + + return newnode; +} + +/* + * _copyJsonArgument + */ +static JsonArgument * +_copyJsonArgument(const JsonArgument *from) +{ + JsonArgument *newnode = makeNode(JsonArgument); + + COPY_NODE_FIELD(val); + COPY_STRING_FIELD(name); + + return newnode; +} + /* **************************************************************** * pathnodes.h copy functions * @@ -5645,6 +5774,27 @@ copyObjectImpl(const void *from) case T_JsonIsPredicate: retval = _copyJsonIsPredicate(from); break; + case T_JsonFuncExpr: + retval = _copyJsonFuncExpr(from); + break; + case T_JsonExpr: + retval = _copyJsonExpr(from); + break; + case T_JsonCommon: + retval = _copyJsonCommon(from); + break; + case T_JsonBehavior: + retval = _copyJsonBehavior(from); + break; + case T_JsonArgument: + retval = _copyJsonArgument(from); + break; + case T_JsonCoercion: + retval = _copyJsonCoercion(from); + break; + case T_JsonItemCoercions: + retval = _copyJsonItemCoercions(from); + break; /* * RELATION NODES diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 084d98b34c..f6dd61370c 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -976,6 +976,42 @@ _equalJsonArrayQueryConstructor(const JsonArrayQueryConstructor *a, return true; } +static bool +_equalJsonFuncExpr(const JsonFuncExpr *a, const JsonFuncExpr *b) +{ + COMPARE_SCALAR_FIELD(op); + COMPARE_NODE_FIELD(common); + COMPARE_NODE_FIELD(output); + COMPARE_NODE_FIELD(on_empty); + COMPARE_NODE_FIELD(on_error); + COMPARE_SCALAR_FIELD(wrapper); + COMPARE_SCALAR_FIELD(omit_quotes); + COMPARE_LOCATION_FIELD(location); + + return true; +} + +static bool +_equalJsonCommon(const JsonCommon *a, const JsonCommon *b) +{ + COMPARE_NODE_FIELD(expr); + COMPARE_NODE_FIELD(pathspec); + COMPARE_STRING_FIELD(pathname); + COMPARE_NODE_FIELD(passing); + COMPARE_LOCATION_FIELD(location); + + return true; +} + +static bool +_equalJsonArgument(const JsonArgument *a, const JsonArgument *b) +{ + COMPARE_NODE_FIELD(val); + COMPARE_STRING_FIELD(name); + + return true; +} + static bool _equalJsonIsPredicate(const JsonIsPredicate *a, const JsonIsPredicate *b) @@ -988,6 +1024,76 @@ _equalJsonIsPredicate(const JsonIsPredicate *a, return true; } +/* + * _equalJsonBehavior + */ +static bool +_equalJsonBehavior(const JsonBehavior *a, const JsonBehavior *b) +{ + COMPARE_SCALAR_FIELD(btype); + COMPARE_NODE_FIELD(default_expr); + + return true; +} + +/* + * _equalJsonExpr + */ +static bool +_equalJsonExpr(const JsonExpr *a, const JsonExpr *b) +{ + COMPARE_SCALAR_FIELD(op); + COMPARE_NODE_FIELD(formatted_expr); + COMPARE_NODE_FIELD(result_coercion); + COMPARE_NODE_FIELD(format); + COMPARE_NODE_FIELD(path_spec); + COMPARE_NODE_FIELD(passing_values); + COMPARE_NODE_FIELD(passing_names); + COMPARE_NODE_FIELD(returning); + COMPARE_NODE_FIELD(on_error); + COMPARE_NODE_FIELD(on_empty); + COMPARE_NODE_FIELD(coercions); + COMPARE_SCALAR_FIELD(wrapper); + COMPARE_SCALAR_FIELD(omit_quotes); + COMPARE_LOCATION_FIELD(location); + + return true; +} + +/* + * _equalJsonCoercion + */ +static bool +_equalJsonCoercion(const JsonCoercion *a, const JsonCoercion *b) +{ + COMPARE_NODE_FIELD(expr); + COMPARE_SCALAR_FIELD(via_populate); + COMPARE_SCALAR_FIELD(via_io); + COMPARE_SCALAR_FIELD(collation); + + return true; +} + +/* + * _equalJsonItemCoercions + */ +static bool +_equalJsonItemCoercions(const JsonItemCoercions *a, const JsonItemCoercions *b) +{ + COMPARE_NODE_FIELD(null); + COMPARE_NODE_FIELD(string); + COMPARE_NODE_FIELD(numeric); + COMPARE_NODE_FIELD(boolean); + COMPARE_NODE_FIELD(date); + COMPARE_NODE_FIELD(time); + COMPARE_NODE_FIELD(timetz); + COMPARE_NODE_FIELD(timestamp); + COMPARE_NODE_FIELD(timestamptz); + COMPARE_NODE_FIELD(composite); + + return true; +} + /* * Stuff from pathnodes.h */ @@ -3561,6 +3667,18 @@ equal(const void *a, const void *b) case T_JsonIsPredicate: retval = _equalJsonIsPredicate(a, b); break; + case T_JsonBehavior: + retval = _equalJsonBehavior(a, b); + break; + case T_JsonExpr: + retval = _equalJsonExpr(a, b); + break; + case T_JsonCoercion: + retval = _equalJsonCoercion(a, b); + break; + case T_JsonItemCoercions: + retval = _equalJsonItemCoercions(a, b); + break; /* * RELATION NODES @@ -4174,6 +4292,15 @@ equal(const void *a, const void *b) case T_JsonArrayAgg: retval = _equalJsonArrayAgg(a, b); break; + case T_JsonFuncExpr: + retval = _equalJsonFuncExpr(a, b); + break; + case T_JsonCommon: + retval = _equalJsonCommon(a, b); + break; + case T_JsonArgument: + retval = _equalJsonArgument(a, b); + break; default: elog(ERROR, "unrecognized node type: %d", diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c index b67e7c5297..cd6c300e7b 100644 --- a/src/backend/nodes/makefuncs.c +++ b/src/backend/nodes/makefuncs.c @@ -852,6 +852,21 @@ makeJsonValueExpr(Expr *expr, JsonFormat *format) return jve; } +/* + * makeJsonBehavior - + * creates a JsonBehavior node + */ +JsonBehavior * +makeJsonBehavior(JsonBehaviorType type, Node *default_expr) +{ + JsonBehavior *behavior = makeNode(JsonBehavior); + + behavior->btype = type; + behavior->default_expr = default_expr; + + return behavior; +} + /* * makeJsonEncoding - * converts JSON encoding name to enum JsonEncoding diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index d697c7abd8..c0a83471e1 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -263,6 +263,12 @@ exprType(const Node *expr) case T_JsonIsPredicate: type = BOOLOID; break; + case T_JsonExpr: + type = ((const JsonExpr *) expr)->returning->typid; + break; + case T_JsonCoercion: + type = exprType(((const JsonCoercion *) expr)->expr); + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); type = InvalidOid; /* keep compiler quiet */ @@ -498,7 +504,11 @@ exprTypmod(const Node *expr) case T_JsonValueExpr: return exprTypmod((Node *) ((const JsonValueExpr *) expr)->formatted_expr); case T_JsonConstructorExpr: - return -1; /* ((const JsonConstructorExpr *) expr)->returning->typmod; */ + return ((const JsonConstructorExpr *) expr)->returning->typmod; + case T_JsonExpr: + return ((JsonExpr *) expr)->returning->typmod; + case T_JsonCoercion: + return exprTypmod(((const JsonCoercion *) expr)->expr); default: break; } @@ -991,6 +1001,21 @@ exprCollation(const Node *expr) case T_JsonIsPredicate: coll = InvalidOid; /* result is always an boolean type */ break; + case T_JsonExpr: + { + JsonExpr *jexpr = (JsonExpr *) expr; + JsonCoercion *coercion = jexpr->result_coercion; + + if (!coercion) + coll = InvalidOid; + else if (coercion->expr) + coll = exprCollation(coercion->expr); + else if (coercion->via_io || coercion->via_populate) + coll = coercion->collation; + else + coll = InvalidOid; + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); coll = InvalidOid; /* keep compiler quiet */ @@ -1220,6 +1245,21 @@ exprSetCollation(Node *expr, Oid collation) case T_JsonIsPredicate: Assert(!OidIsValid(collation)); /* result is always boolean */ break; + case T_JsonExpr: + { + JsonExpr *jexpr = (JsonExpr *) expr; + JsonCoercion *coercion = jexpr->result_coercion; + + if (!coercion) + Assert(!OidIsValid(collation)); + else if (coercion->expr) + exprSetCollation(coercion->expr, collation); + else if (coercion->via_io || coercion->via_populate) + coercion->collation = collation; + else + Assert(!OidIsValid(collation)); + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); break; @@ -1675,6 +1715,15 @@ exprLocation(const Node *expr) case T_JsonIsPredicate: loc = ((const JsonIsPredicate *) expr)->location; break; + case T_JsonExpr: + { + const JsonExpr *jsexpr = (const JsonExpr *) expr; + + /* consider both function name and leftmost arg */ + loc = leftmostLoc(jsexpr->location, + exprLocation(jsexpr->formatted_expr)); + } + break; default: /* for any other node type it's just unknown... */ loc = -1; @@ -2443,6 +2492,54 @@ expression_tree_walker(Node *node, break; case T_JsonIsPredicate: return walker(((JsonIsPredicate *) node)->expr, context); + case T_JsonExpr: + { + JsonExpr *jexpr = (JsonExpr *) node; + + if (walker(jexpr->formatted_expr, context)) + return true; + if (walker(jexpr->result_coercion, context)) + return true; + if (walker(jexpr->passing_values, context)) + return true; + /* we assume walker doesn't care about passing_names */ + if (jexpr->on_empty && + walker(jexpr->on_empty->default_expr, context)) + return true; + if (walker(jexpr->on_error->default_expr, context)) + return true; + if (walker(jexpr->coercions, context)) + return true; + } + break; + case T_JsonCoercion: + return walker(((JsonCoercion *) node)->expr, context); + case T_JsonItemCoercions: + { + JsonItemCoercions *coercions = (JsonItemCoercions *) node; + + if (walker(coercions->null, context)) + return true; + if (walker(coercions->string, context)) + return true; + if (walker(coercions->numeric, context)) + return true; + if (walker(coercions->boolean, context)) + return true; + if (walker(coercions->date, context)) + return true; + if (walker(coercions->time, context)) + return true; + if (walker(coercions->timetz, context)) + return true; + if (walker(coercions->timestamp, context)) + return true; + if (walker(coercions->timestamptz, context)) + return true; + if (walker(coercions->composite, context)) + return true; + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); @@ -3454,6 +3551,7 @@ expression_tree_mutator(Node *node, return (Node *) newnode; } + break; case T_JsonIsPredicate: { JsonIsPredicate *pred = (JsonIsPredicate *) node; @@ -3464,6 +3562,55 @@ expression_tree_mutator(Node *node, return (Node *) newnode; } + break; + case T_JsonExpr: + { + JsonExpr *jexpr = (JsonExpr *) node; + JsonExpr *newnode; + + FLATCOPY(newnode, jexpr, JsonExpr); + MUTATE(newnode->path_spec, jexpr->path_spec, Node *); + MUTATE(newnode->formatted_expr, jexpr->formatted_expr, Node *); + MUTATE(newnode->result_coercion, jexpr->result_coercion, JsonCoercion *); + MUTATE(newnode->passing_values, jexpr->passing_values, List *); + /* assume mutator does not care about passing_names */ + if (newnode->on_empty) + MUTATE(newnode->on_empty->default_expr, + jexpr->on_empty->default_expr, Node *); + MUTATE(newnode->on_error->default_expr, + jexpr->on_error->default_expr, Node *); + return (Node *) newnode; + } + break; + case T_JsonCoercion: + { + JsonCoercion *coercion = (JsonCoercion *) node; + JsonCoercion *newnode; + + FLATCOPY(newnode, coercion, JsonCoercion); + MUTATE(newnode->expr, coercion->expr, Node *); + return (Node *) newnode; + } + break; + case T_JsonItemCoercions: + { + JsonItemCoercions *coercions = (JsonItemCoercions *) node; + JsonItemCoercions *newnode; + + FLATCOPY(newnode, coercions, JsonItemCoercions); + MUTATE(newnode->null, coercions->null, JsonCoercion *); + MUTATE(newnode->string, coercions->string, JsonCoercion *); + MUTATE(newnode->numeric, coercions->numeric, JsonCoercion *); + MUTATE(newnode->boolean, coercions->boolean, JsonCoercion *); + MUTATE(newnode->date, coercions->date, JsonCoercion *); + MUTATE(newnode->time, coercions->time, JsonCoercion *); + MUTATE(newnode->timetz, coercions->timetz, JsonCoercion *); + MUTATE(newnode->timestamp, coercions->timestamp, JsonCoercion *); + MUTATE(newnode->timestamptz, coercions->timestamptz, JsonCoercion *); + MUTATE(newnode->composite, coercions->composite, JsonCoercion *); + return (Node *) newnode; + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); @@ -4316,6 +4463,43 @@ raw_expression_tree_walker(Node *node, break; case T_JsonIsPredicate: return walker(((JsonIsPredicate *) node)->expr, context); + case T_JsonArgument: + return walker(((JsonArgument *) node)->val, context); + case T_JsonCommon: + { + JsonCommon *jc = (JsonCommon *) node; + + if (walker(jc->expr, context)) + return true; + if (walker(jc->pathspec, context)) + return true; + if (walker(jc->passing, context)) + return true; + } + break; + case T_JsonBehavior: + { + JsonBehavior *jb = (JsonBehavior *) node; + + if (jb->btype == JSON_BEHAVIOR_DEFAULT && + walker(jb->default_expr, context)) + return true; + } + break; + case T_JsonFuncExpr: + { + JsonFuncExpr *jfe = (JsonFuncExpr *) node; + + if (walker(jfe->common, context)) + return true; + if (jfe->output && walker(jfe->output, context)) + return true; + if (walker(jfe->on_empty, context)) + return true; + if (walker(jfe->on_error, context)) + return true; + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 278e87259d..6e39590730 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1808,6 +1808,64 @@ _outJsonIsPredicate(StringInfo str, const JsonIsPredicate *node) WRITE_LOCATION_FIELD(location); } +static void +_outJsonBehavior(StringInfo str, const JsonBehavior *node) +{ + WRITE_NODE_TYPE("JSONBEHAVIOR"); + + WRITE_ENUM_FIELD(btype, JsonBehaviorType); + WRITE_NODE_FIELD(default_expr); +} + +static void +_outJsonExpr(StringInfo str, const JsonExpr *node) +{ + WRITE_NODE_TYPE("JSONEXPR"); + + WRITE_ENUM_FIELD(op, JsonExprOp); + WRITE_NODE_FIELD(formatted_expr); + WRITE_NODE_FIELD(result_coercion); + WRITE_NODE_FIELD(format); + WRITE_NODE_FIELD(path_spec); + WRITE_NODE_FIELD(passing_values); + WRITE_NODE_FIELD(passing_names); + WRITE_NODE_FIELD(returning); + WRITE_NODE_FIELD(on_error); + WRITE_NODE_FIELD(on_empty); + WRITE_NODE_FIELD(coercions); + WRITE_ENUM_FIELD(wrapper, JsonWrapper); + WRITE_BOOL_FIELD(omit_quotes); + WRITE_LOCATION_FIELD(location); +} + +static void +_outJsonCoercion(StringInfo str, const JsonCoercion *node) +{ + WRITE_NODE_TYPE("JSONCOERCION"); + + WRITE_NODE_FIELD(expr); + WRITE_BOOL_FIELD(via_populate); + WRITE_BOOL_FIELD(via_io); + WRITE_OID_FIELD(collation); +} + +static void +_outJsonItemCoercions(StringInfo str, const JsonItemCoercions *node) +{ + WRITE_NODE_TYPE("JSONITEMCOERCIONS"); + + WRITE_NODE_FIELD(null); + WRITE_NODE_FIELD(string); + WRITE_NODE_FIELD(numeric); + WRITE_NODE_FIELD(boolean); + WRITE_NODE_FIELD(date); + WRITE_NODE_FIELD(time); + WRITE_NODE_FIELD(timetz); + WRITE_NODE_FIELD(timestamp); + WRITE_NODE_FIELD(timestamptz); + WRITE_NODE_FIELD(composite); +} + /***************************************************************************** * * Stuff from pathnodes.h. @@ -4644,6 +4702,18 @@ outNode(StringInfo str, const void *obj) case T_JsonIsPredicate: _outJsonIsPredicate(str, obj); break; + case T_JsonBehavior: + _outJsonBehavior(str, obj); + break; + case T_JsonExpr: + _outJsonExpr(str, obj); + break; + case T_JsonCoercion: + _outJsonCoercion(str, obj); + break; + case T_JsonItemCoercions: + _outJsonItemCoercions(str, obj); + break; default: diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 5b9e235e9a..c94b2561f0 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -1492,6 +1492,84 @@ _readJsonConstructorExpr(void) READ_DONE(); } +/* + * _readJsonBehavior + */ +static JsonBehavior * +_readJsonBehavior(void) +{ + READ_LOCALS(JsonBehavior); + + READ_ENUM_FIELD(btype, JsonBehaviorType); + READ_NODE_FIELD(default_expr); + + READ_DONE(); +} + +/* + * _readJsonExpr + */ +static JsonExpr * +_readJsonExpr(void) +{ + READ_LOCALS(JsonExpr); + + READ_ENUM_FIELD(op, JsonExprOp); + READ_NODE_FIELD(formatted_expr); + READ_NODE_FIELD(result_coercion); + READ_NODE_FIELD(format); + READ_NODE_FIELD(path_spec); + READ_NODE_FIELD(passing_values); + READ_NODE_FIELD(passing_names); + READ_NODE_FIELD(returning); + READ_NODE_FIELD(on_error); + READ_NODE_FIELD(on_empty); + READ_NODE_FIELD(coercions); + READ_ENUM_FIELD(wrapper, JsonWrapper); + READ_BOOL_FIELD(omit_quotes); + READ_LOCATION_FIELD(location); + + READ_DONE(); +} + +/* + * _readJsonCoercion + */ +static JsonCoercion * +_readJsonCoercion(void) +{ + READ_LOCALS(JsonCoercion); + + READ_NODE_FIELD(expr); + READ_BOOL_FIELD(via_populate); + READ_BOOL_FIELD(via_io); + READ_OID_FIELD(collation); + + READ_DONE(); +} + +/* + * _readJsonItemCoercions + */ +static JsonItemCoercions * +_readJsonItemCoercions(void) +{ + READ_LOCALS(JsonItemCoercions); + + READ_NODE_FIELD(null); + READ_NODE_FIELD(string); + READ_NODE_FIELD(numeric); + READ_NODE_FIELD(boolean); + READ_NODE_FIELD(date); + READ_NODE_FIELD(time); + READ_NODE_FIELD(timetz); + READ_NODE_FIELD(timestamp); + READ_NODE_FIELD(timestamptz); + READ_NODE_FIELD(composite); + + READ_DONE(); +} + /* * _readJsonIsPredicate */ @@ -3108,6 +3186,14 @@ parseNodeString(void) return_value = _readJsonConstructorExpr(); else if (MATCH("JSONISPREDICATE", 15)) return_value = _readJsonIsPredicate(); + else if (MATCH("JSONBEHAVIOR", 12)) + return_value = _readJsonBehavior(); + else if (MATCH("JSONEXPR", 8)) + return_value = _readJsonExpr(); + else if (MATCH("JSONCOERCION", 12)) + return_value = _readJsonCoercion(); + else if (MATCH("JSONITEMCOERCIONS", 17)) + return_value = _readJsonItemCoercions(); else { elog(ERROR, "badly formatted node string \"%.32s\"...", token); diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 1b07ea392d..679d8ed597 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -4547,7 +4547,8 @@ cost_qual_eval_walker(Node *node, cost_qual_eval_context *context) IsA(node, SQLValueFunction) || IsA(node, XmlExpr) || IsA(node, CoerceToDomain) || - IsA(node, NextValueExpr)) + IsA(node, NextValueExpr) || + IsA(node, JsonExpr)) { /* Treat all these as having cost 1 */ context->total.per_tuple += cpu_operator_cost; diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index e1147c431e..e381ae512a 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -28,6 +28,7 @@ #include "catalog/pg_type.h" #include "executor/executor.h" #include "executor/functions.h" +#include "executor/execExpr.h" #include "funcapi.h" #include "miscadmin.h" #include "nodes/makefuncs.h" @@ -52,6 +53,7 @@ #include "utils/fmgroids.h" #include "utils/json.h" #include "utils/jsonb.h" +#include "utils/jsonpath.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/syscache.h" @@ -405,6 +407,24 @@ contain_mutable_functions_walker(Node *node, void *context) /* Check all subnodes */ } + if (IsA(node, JsonExpr)) + { + JsonExpr *jexpr = castNode(JsonExpr, node); + Const *cnst; + + if (!IsA(jexpr->path_spec, Const)) + return true; + + cnst = castNode(Const, jexpr->path_spec); + + Assert(cnst->consttype == JSONPATHOID); + if (cnst->constisnull) + return false; + + return jspIsMutable(DatumGetJsonPathP(cnst->constvalue), + jexpr->passing_names, jexpr->passing_values); + } + if (IsA(node, SQLValueFunction)) { /* all variants of SQLValueFunction are stable */ @@ -876,6 +896,18 @@ max_parallel_hazard_walker(Node *node, max_parallel_hazard_context *context) context, 0); } + /* JsonExpr is parallel-unsafe if subtransactions can be used. */ + else if (IsA(node, JsonExpr)) + { + JsonExpr *jsexpr = (JsonExpr *) node; + + if (ExecEvalJsonNeedsSubTransaction(jsexpr, NULL)) + { + context->max_hazard = PROPARALLEL_UNSAFE; + return true; + } + } + /* Recurse to check arguments */ return expression_tree_walker(node, max_parallel_hazard_walker, diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index b658bcc182..8ad8512e4c 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -281,6 +281,13 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); MergeWhenClause *mergewhen; struct KeyActions *keyactions; struct KeyAction *keyaction; + JsonBehavior *jsbehavior; + struct + { + JsonBehavior *on_empty; + JsonBehavior *on_error; + } on_behavior; + JsonQuotes js_quotes; } %type stmt toplevel_stmt schema_stmt routine_body_stmt @@ -646,7 +653,14 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); json_representation json_value_expr json_func_expr + json_value_func_expr + json_query_expr + json_exists_predicate + json_api_common_syntax + json_context_item + json_argument json_output_clause_opt + json_returning_clause_opt json_value_constructor json_object_constructor json_object_constructor_args @@ -658,15 +672,43 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); json_aggregate_func json_object_aggregate_constructor json_array_aggregate_constructor + json_path_specification %type json_name_and_value_list json_value_expr_list json_array_aggregate_order_by_clause_opt + json_arguments + json_passing_clause_opt + +%type json_table_path_name + json_as_path_name_clause_opt %type json_encoding json_encoding_clause_opt + json_wrapper_clause_opt + json_wrapper_behavior + json_conditional_or_unconditional_opt json_predicate_type_constraint_opt +%type json_behavior_error + json_behavior_null + json_behavior_true + json_behavior_false + json_behavior_unknown + json_behavior_empty_array + json_behavior_empty_object + json_behavior_default + json_value_behavior + json_query_behavior + json_exists_error_behavior + json_exists_error_clause_opt + +%type json_value_on_behavior_clause_opt + json_query_on_behavior_clause_opt + +%type json_quotes_behavior + json_quotes_clause_opt + %type json_key_uniqueness_constraint_opt json_object_constructor_null_clause_opt json_array_constructor_null_clause_opt @@ -706,7 +748,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); CACHE CALL CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE CLUSTER COALESCE COLLATE COLLATION COLUMN COLUMNS COMMENT COMMENTS COMMIT - COMMITTED COMPRESSION CONCURRENTLY CONFIGURATION CONFLICT + COMMITTED COMPRESSION CONCURRENTLY CONDITIONAL CONFIGURATION CONFLICT CONNECTION CONSTRAINT CONSTRAINTS CONTENT_P CONTINUE_P CONVERSION_P COPY COST CREATE CROSS CSV CUBE CURRENT_P CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA @@ -717,8 +759,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P DOUBLE_P DROP - EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT - EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION + EACH ELSE EMPTY_P ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ERROR_P ESCAPE + EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION EXTENSION EXTERNAL EXTRACT FALSE_P FAMILY FETCH FILTER FINALIZE FIRST_P FLOAT_P FOLLOWING FOR @@ -733,7 +775,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION - JOIN JSON JSON_ARRAY JSON_ARRAYAGG JSON_OBJECT JSON_OBJECTAGG + JOIN JSON JSON_ARRAY JSON_ARRAYAGG JSON_EXISTS JSON_OBJECT JSON_OBJECTAGG + JSON_QUERY JSON_VALUE KEY KEYS KEEP @@ -749,7 +792,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF NULLS_P NUMERIC - OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OPTIONS OR + OBJECT_P OF OFF OFFSET OIDS OLD OMIT ON ONLY OPERATOR OPTION OPTIONS OR ORDER ORDINALITY OTHERS OUT_P OUTER_P OVER OVERLAPS OVERLAY OVERRIDING OWNED OWNER @@ -757,7 +800,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); POSITION PRECEDING PRECISION PRESERVE PREPARE PREPARED PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE PROCEDURES PROGRAM PUBLICATION - QUOTE + QUOTE QUOTES RANGE READ REAL REASSIGN RECHECK RECURSIVE REF REFERENCES REFERENCING REFRESH REINDEX RELATIVE_P RELEASE RENAME REPEATABLE REPLACE REPLICA @@ -767,7 +810,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); SAVEPOINT SCALAR SCHEMA SCHEMAS SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE SEQUENCES SERIALIZABLE SERVER SESSION SESSION_USER SET SETS SETOF SHARE SHOW SIMILAR SIMPLE SKIP SMALLINT SNAPSHOT SOME SQL_P STABLE STANDALONE_P - START STATEMENT STATISTICS STDIN STDOUT STORAGE STORED STRICT_P STRIP_P + START STATEMENT STATISTICS STDIN STDOUT STORAGE STORED STRICT_P STRING STRIP_P SUBSCRIPTION SUBSTRING SUPPORT SYMMETRIC SYSID SYSTEM_P TABLE TABLES TABLESAMPLE TABLESPACE TEMP TEMPLATE TEMPORARY TEXT_P THEN @@ -775,7 +818,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); TREAT TRIGGER TRIM TRUE_P TRUNCATE TRUSTED TYPE_P TYPES_P - UESCAPE UNBOUNDED UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN + UESCAPE UNBOUNDED UNCONDITIONAL UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNLOGGED UNTIL UPDATE USER USING VACUUM VALID VALIDATE VALIDATOR VALUE_P VALUES VARCHAR VARIADIC VARYING @@ -854,7 +897,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); * Using the same precedence as IDENT seems right for the reasons given above. */ %nonassoc UNBOUNDED /* ideally would have same precedence as IDENT */ -%nonassoc ABSENT UNIQUE JSON +%nonassoc ERROR_P EMPTY_P DEFAULT ABSENT /* JSON error/empty behavior */ +%nonassoc FALSE_P KEEP OMIT PASSING TRUE_P UNKNOWN UNIQUE JSON %nonassoc IDENT PARTITION RANGE ROWS GROUPS PRECEDING FOLLOWING CUBE ROLLUP %left Op OPERATOR /* multi-character ops and user-defined operators */ %left '+' '-' @@ -15549,6 +15593,80 @@ opt_asymmetric: ASYMMETRIC /* SQL/JSON support */ json_func_expr: json_value_constructor + | json_value_func_expr + | json_query_expr + | json_exists_predicate + ; + + +json_value_func_expr: + JSON_VALUE '(' + json_api_common_syntax + json_returning_clause_opt + json_value_on_behavior_clause_opt + ')' + { + JsonFuncExpr *n = makeNode(JsonFuncExpr); + n->op = JSON_VALUE_OP; + n->common = (JsonCommon *) $3; + n->output = (JsonOutput *) $4; + n->on_empty = $5.on_empty; + n->on_error = $5.on_error; + n->location = @1; + $$ = (Node *) n; + } + ; + +json_api_common_syntax: + json_context_item ',' json_path_specification + json_as_path_name_clause_opt + json_passing_clause_opt + { + JsonCommon *n = makeNode(JsonCommon); + n->expr = (JsonValueExpr *) $1; + n->pathspec = $3; + n->pathname = $4; + n->passing = $5; + n->location = @1; + $$ = (Node *) n; + } + ; + +json_context_item: + json_value_expr { $$ = $1; } + ; + +json_path_specification: + a_expr { $$ = $1; } + ; + +json_as_path_name_clause_opt: + AS json_table_path_name { $$ = $2; } + | /* EMPTY */ { $$ = NULL; } + ; + +json_table_path_name: + name { $$ = $1; } + ; + +json_passing_clause_opt: + PASSING json_arguments { $$ = $2; } + | /* EMPTY */ { $$ = NIL; } + ; + +json_arguments: + json_argument { $$ = list_make1($1); } + | json_arguments ',' json_argument { $$ = lappend($1, $3); } + ; + +json_argument: + json_value_expr AS ColLabel + { + JsonArgument *n = makeNode(JsonArgument); + n->val = (JsonValueExpr *) $1; + n->name = $3; + $$ = (Node *) n; + } ; json_value_expr: @@ -15587,6 +15705,153 @@ json_encoding: name { $$ = makeJsonEncoding($1); } ; +json_behavior_error: + ERROR_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_ERROR, NULL); } + ; + +json_behavior_null: + NULL_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_NULL, NULL); } + ; + +json_behavior_true: + TRUE_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_TRUE, NULL); } + ; + +json_behavior_false: + FALSE_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_FALSE, NULL); } + ; + +json_behavior_unknown: + UNKNOWN { $$ = makeJsonBehavior(JSON_BEHAVIOR_UNKNOWN, NULL); } + ; + +json_behavior_empty_array: + EMPTY_P ARRAY { $$ = makeJsonBehavior(JSON_BEHAVIOR_EMPTY_ARRAY, NULL); } + /* non-standard, for Oracle compatibility only */ + | EMPTY_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_EMPTY_ARRAY, NULL); } + ; + +json_behavior_empty_object: + EMPTY_P OBJECT_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_EMPTY_OBJECT, NULL); } + ; + +json_behavior_default: + DEFAULT a_expr { $$ = makeJsonBehavior(JSON_BEHAVIOR_DEFAULT, $2); } + ; + + +json_value_behavior: + json_behavior_null + | json_behavior_error + | json_behavior_default + ; + +json_value_on_behavior_clause_opt: + json_value_behavior ON EMPTY_P + { $$.on_empty = $1; $$.on_error = NULL; } + | json_value_behavior ON EMPTY_P json_value_behavior ON ERROR_P + { $$.on_empty = $1; $$.on_error = $4; } + | json_value_behavior ON ERROR_P + { $$.on_empty = NULL; $$.on_error = $1; } + | /* EMPTY */ + { $$.on_empty = NULL; $$.on_error = NULL; } + ; + +json_query_expr: + JSON_QUERY '(' + json_api_common_syntax + json_output_clause_opt + json_wrapper_clause_opt + json_quotes_clause_opt + json_query_on_behavior_clause_opt + ')' + { + JsonFuncExpr *n = makeNode(JsonFuncExpr); + n->op = JSON_QUERY_OP; + n->common = (JsonCommon *) $3; + n->output = (JsonOutput *) $4; + n->wrapper = $5; + if (n->wrapper != JSW_NONE && $6 != JS_QUOTES_UNSPEC) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used"), + parser_errposition(@6))); + n->omit_quotes = $6 == JS_QUOTES_OMIT; + n->on_empty = $7.on_empty; + n->on_error = $7.on_error; + n->location = @1; + $$ = (Node *) n; + } + ; + +json_wrapper_clause_opt: + json_wrapper_behavior WRAPPER { $$ = $1; } + | /* EMPTY */ { $$ = 0; } + ; + +json_wrapper_behavior: + WITHOUT array_opt { $$ = JSW_NONE; } + | WITH json_conditional_or_unconditional_opt array_opt { $$ = $2; } + ; + +array_opt: + ARRAY { } + | /* EMPTY */ { } + ; + +json_conditional_or_unconditional_opt: + CONDITIONAL { $$ = JSW_CONDITIONAL; } + | UNCONDITIONAL { $$ = JSW_UNCONDITIONAL; } + | /* EMPTY */ { $$ = JSW_UNCONDITIONAL; } + ; + +json_quotes_clause_opt: + json_quotes_behavior QUOTES json_on_scalar_string_opt { $$ = $1; } + | /* EMPTY */ { $$ = JS_QUOTES_UNSPEC; } + ; + +json_quotes_behavior: + KEEP { $$ = JS_QUOTES_KEEP; } + | OMIT { $$ = JS_QUOTES_OMIT; } + ; + +json_on_scalar_string_opt: + ON SCALAR STRING { } + | /* EMPTY */ { } + ; + +json_query_behavior: + json_behavior_error + | json_behavior_null + | json_behavior_empty_array + | json_behavior_empty_object + | json_behavior_default + ; + +json_query_on_behavior_clause_opt: + json_query_behavior ON EMPTY_P + { $$.on_empty = $1; $$.on_error = NULL; } + | json_query_behavior ON EMPTY_P json_query_behavior ON ERROR_P + { $$.on_empty = $1; $$.on_error = $4; } + | json_query_behavior ON ERROR_P + { $$.on_empty = NULL; $$.on_error = $1; } + | /* EMPTY */ + { $$.on_empty = NULL; $$.on_error = NULL; } + ; + +json_returning_clause_opt: + RETURNING Typename + { + JsonOutput *n = makeNode(JsonOutput); + n->typeName = $2; + n->returning = makeNode(JsonReturning); + n->returning->format = + makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, @2); + $$ = (Node *) n; + } + | /* EMPTY */ { $$ = NULL; } + ; + json_output_clause_opt: RETURNING Typename json_format_clause_opt { @@ -15599,6 +15864,35 @@ json_output_clause_opt: | /* EMPTY */ { $$ = NULL; } ; +json_exists_predicate: + JSON_EXISTS '(' + json_api_common_syntax + json_returning_clause_opt + json_exists_error_clause_opt + ')' + { + JsonFuncExpr *p = makeNode(JsonFuncExpr); + p->op = JSON_EXISTS_OP; + p->common = (JsonCommon *) $3; + p->output = (JsonOutput *) $4; + p->on_error = $5; + p->location = @1; + $$ = (Node *) p; + } + ; + +json_exists_error_clause_opt: + json_exists_error_behavior ON ERROR_P { $$ = $1; } + | /* EMPTY */ { $$ = NULL; } + ; + +json_exists_error_behavior: + json_behavior_error + | json_behavior_true + | json_behavior_false + | json_behavior_unknown + ; + json_value_constructor: json_object_constructor | json_array_constructor @@ -16269,6 +16563,7 @@ unreserved_keyword: | COMMIT | COMMITTED | COMPRESSION + | CONDITIONAL | CONFIGURATION | CONFLICT | CONNECTION @@ -16305,10 +16600,12 @@ unreserved_keyword: | DOUBLE_P | DROP | EACH + | EMPTY_P | ENABLE_P | ENCODING | ENCRYPTED | ENUM_P + | ERROR_P | ESCAPE | EVENT | EXCLUDE @@ -16358,6 +16655,7 @@ unreserved_keyword: | INVOKER | ISOLATION | JSON + | KEEP | KEY | KEYS | LABEL @@ -16404,6 +16702,7 @@ unreserved_keyword: | OFF | OIDS | OLD + | OMIT | OPERATOR | OPTION | OPTIONS @@ -16433,6 +16732,7 @@ unreserved_keyword: | PROGRAM | PUBLICATION | QUOTE + | QUOTES | RANGE | READ | REASSIGN @@ -16514,6 +16814,7 @@ unreserved_keyword: | UESCAPE | UNBOUNDED | UNCOMMITTED + | UNCONDITIONAL | UNENCRYPTED | UNKNOWN | UNLISTEN @@ -16573,8 +16874,11 @@ col_name_keyword: | INTERVAL | JSON_ARRAY | JSON_ARRAYAGG + | JSON_EXISTS | JSON_OBJECT | JSON_OBJECTAGG + | JSON_QUERY + | JSON_VALUE | LEAST | NATIONAL | NCHAR @@ -16642,6 +16946,7 @@ type_func_name_keyword: | OVERLAPS | RIGHT | SIMILAR + | STRING | TABLESAMPLE | VERBOSE ; @@ -16806,6 +17111,7 @@ bare_label_keyword: | COMMITTED | COMPRESSION | CONCURRENTLY + | CONDITIONAL | CONFIGURATION | CONFLICT | CONNECTION @@ -16858,11 +17164,13 @@ bare_label_keyword: | DROP | EACH | ELSE + | EMPTY_P | ENABLE_P | ENCODING | ENCRYPTED | END_P | ENUM_P + | ERROR_P | ESCAPE | EVENT | EXCLUDE @@ -16931,8 +17239,11 @@ bare_label_keyword: | JSON | JSON_ARRAY | JSON_ARRAYAGG + | JSON_EXISTS | JSON_OBJECT | JSON_OBJECTAGG + | JSON_QUERY + | JSON_VALUE | KEEP | KEY | KEYS @@ -16994,6 +17305,7 @@ bare_label_keyword: | OFF | OIDS | OLD + | OMIT | ONLY | OPERATOR | OPTION @@ -17030,6 +17342,7 @@ bare_label_keyword: | PROGRAM | PUBLICATION | QUOTE + | QUOTES | RANGE | READ | REAL @@ -17098,6 +17411,7 @@ bare_label_keyword: | STORAGE | STORED | STRICT_P + | STRING | STRIP_P | SUBSCRIPTION | SUBSTRING @@ -17131,6 +17445,7 @@ bare_label_keyword: | UESCAPE | UNBOUNDED | UNCOMMITTED + | UNCONDITIONAL | UNENCRYPTED | UNIQUE | UNKNOWN diff --git a/src/backend/parser/parse_collate.c b/src/backend/parser/parse_collate.c index 7582faabb3..45dacc6c4c 100644 --- a/src/backend/parser/parse_collate.c +++ b/src/backend/parser/parse_collate.c @@ -691,6 +691,10 @@ assign_collations_walker(Node *node, assign_collations_context *context) &loccontext); } break; + case T_JsonExpr: + /* Context item and PASSING arguments are already + * marked with collations in parse_expr.c. */ + break; default: /* diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 0b972ea632..ee316a9197 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -86,6 +86,8 @@ static Node *transformJsonArrayQueryConstructor(ParseState *pstate, static Node *transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg); static Node *transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg); static Node *transformJsonIsPredicate(ParseState *pstate, JsonIsPredicate *p); +static Node *transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *p); +static Node *transformJsonValueExpr(ParseState *pstate, JsonValueExpr *jve); static Node *make_row_comparison_op(ParseState *pstate, List *opname, List *largs, List *rargs, int location); static Node *make_row_distinct_op(ParseState *pstate, List *opname, @@ -337,6 +339,14 @@ transformExprRecurse(ParseState *pstate, Node *expr) result = transformJsonIsPredicate(pstate, (JsonIsPredicate *) expr); break; + case T_JsonFuncExpr: + result = transformJsonFuncExpr(pstate, (JsonFuncExpr *) expr); + break; + + case T_JsonValueExpr: + result = transformJsonValueExpr(pstate, (JsonValueExpr *) expr); + break; + default: /* should not reach here */ elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); @@ -3218,8 +3228,8 @@ makeCaseTestExpr(Node *expr) * default format otherwise. */ static Node * -transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, - JsonFormatType default_format) +transformJsonValueExprExt(ParseState *pstate, JsonValueExpr *ve, + JsonFormatType default_format, bool isarg) { Node *expr = transformExprRecurse(pstate, (Node *) ve->raw_expr); Node *rawexpr; @@ -3238,6 +3248,8 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, get_type_category_preferred(exprtype, &typcategory, &typispreferred); + rawexpr = expr; + if (ve->format->format_type != JS_FORMAT_DEFAULT) { if (ve->format->encoding != JS_ENC_DEFAULT && exprtype != BYTEAOID) @@ -3256,12 +3268,44 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, else format = ve->format->format_type; } + else if (isarg) + { + /* Pass SQL/JSON item types directly without conversion to json[b]. */ + switch (exprtype) + { + case TEXTOID: + case NUMERICOID: + case BOOLOID: + case INT2OID: + case INT4OID: + case INT8OID: + case FLOAT4OID: + case FLOAT8OID: + case DATEOID: + case TIMEOID: + case TIMETZOID: + case TIMESTAMPOID: + case TIMESTAMPTZOID: + return expr; + + default: + if (typcategory == TYPCATEGORY_STRING) + return coerce_to_specific_type(pstate, expr, TEXTOID, + "JSON_VALUE_EXPR"); + /* else convert argument to json[b] type */ + break; + } + + format = default_format; + } else if (exprtype == JSONOID || exprtype == JSONBOID) format = JS_FORMAT_DEFAULT; /* do not format json[b] types */ else format = default_format; - if (format != JS_FORMAT_DEFAULT) + if (format == JS_FORMAT_DEFAULT) + expr = rawexpr; + else { Oid targettype = format == JS_FORMAT_JSONB ? JSONBOID : JSONOID; Node *orig = makeCaseTestExpr(expr); @@ -3269,7 +3313,7 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, expr = orig; - if (exprtype != BYTEAOID && typcategory != TYPCATEGORY_STRING) + if (!isarg && exprtype != BYTEAOID && typcategory != TYPCATEGORY_STRING) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg(ve->format->format_type == JS_FORMAT_DEFAULT ? @@ -3320,6 +3364,24 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, return expr; } +/* + * Transform JSON value expression using FORMAT JSON by default. + */ +static Node * +transformJsonValueExpr(ParseState *pstate, JsonValueExpr *jve) +{ + return transformJsonValueExprExt(pstate, jve, JS_FORMAT_JSON, false); +} + +/* + * Transform JSON value expression using unspecified format by default. + */ +static Node * +transformJsonValueExprDefault(ParseState *pstate, JsonValueExpr *jve) +{ + return transformJsonValueExprExt(pstate, jve, JS_FORMAT_DEFAULT, false); +} + /* * Checks specified output format for its applicability to the target type. */ @@ -3576,8 +3638,7 @@ transformJsonObjectConstructor(ParseState *pstate, JsonObjectConstructor *ctor) { JsonKeyValue *kv = castNode(JsonKeyValue, lfirst(lc)); Node *key = transformExprRecurse(pstate, (Node *) kv->key); - Node *val = transformJsonValueExpr(pstate, kv->value, - JS_FORMAT_DEFAULT); + Node *val = transformJsonValueExprDefault(pstate, kv->value); args = lappend(args, key); args = lappend(args, val); @@ -3755,7 +3816,7 @@ transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg) Oid aggtype; key = transformExprRecurse(pstate, (Node *) agg->arg->key); - val = transformJsonValueExpr(pstate, agg->arg->value, JS_FORMAT_DEFAULT); + val = transformJsonValueExprDefault(pstate, agg->arg->value); args = list_make2(key, val); returning = transformJsonConstructorOutput(pstate, agg->constructor->output, @@ -3813,7 +3874,7 @@ transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg) const char *aggfnname; Oid aggtype; - arg = transformJsonValueExpr(pstate, agg->arg, JS_FORMAT_DEFAULT); + arg = transformJsonValueExprDefault(pstate, agg->arg); returning = transformJsonConstructorOutput(pstate, agg->constructor->output, list_make1(arg)); @@ -3861,8 +3922,7 @@ transformJsonArrayConstructor(ParseState *pstate, JsonArrayConstructor *ctor) foreach(lc, ctor->exprs) { JsonValueExpr *jsval = castNode(JsonValueExpr, lfirst(lc)); - Node *val = transformJsonValueExpr(pstate, jsval, - JS_FORMAT_DEFAULT); + Node *val = transformJsonValueExprDefault(pstate, jsval); args = lappend(args, val); } @@ -3945,3 +4005,413 @@ transformJsonIsPredicate(ParseState *pstate, JsonIsPredicate *pred) return makeJsonIsPredicate(expr, NULL, pred->value_type, pred->unique_keys, pred->location); } + +/* + * Transform a JSON PASSING clause. + */ +static void +transformJsonPassingArgs(ParseState *pstate, JsonFormatType format, List *args, + List **passing_values, List **passing_names) +{ + ListCell *lc; + + *passing_values = NIL; + *passing_names = NIL; + + foreach(lc, args) + { + JsonArgument *arg = castNode(JsonArgument, lfirst(lc)); + Node *expr = transformJsonValueExprExt(pstate, arg->val, + format, true); + + assign_expr_collations(pstate, expr); + + *passing_values = lappend(*passing_values, expr); + *passing_names = lappend(*passing_names, makeString(arg->name)); + } +} + +/* + * Transform a JSON BEHAVIOR clause. + */ +static JsonBehavior * +transformJsonBehavior(ParseState *pstate, JsonBehavior *behavior, + JsonBehaviorType default_behavior) +{ + JsonBehaviorType behavior_type; + Node *default_expr; + + behavior_type = behavior ? behavior->btype : default_behavior; + default_expr = behavior_type != JSON_BEHAVIOR_DEFAULT ? NULL : + transformExprRecurse(pstate, behavior->default_expr); + + return makeJsonBehavior(behavior_type, default_expr); +} + +/* + * Common code for JSON_VALUE, JSON_QUERY, JSON_EXISTS transformation + * into a JsonExpr node. + */ +static JsonExpr * +transformJsonExprCommon(ParseState *pstate, JsonFuncExpr *func) +{ + JsonExpr *jsexpr = makeNode(JsonExpr); + Node *pathspec; + JsonFormatType format; + + if (func->common->pathname) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("JSON_TABLE path name is not allowed here"), + parser_errposition(pstate, func->location))); + + jsexpr->location = func->location; + jsexpr->op = func->op; + jsexpr->formatted_expr = transformJsonValueExpr(pstate, func->common->expr); + + assign_expr_collations(pstate, jsexpr->formatted_expr); + + /* format is determined by context item type */ + format = exprType(jsexpr->formatted_expr) == JSONBOID ? JS_FORMAT_JSONB : JS_FORMAT_JSON; + + jsexpr->result_coercion = NULL; + jsexpr->omit_quotes = false; + + jsexpr->format = func->common->expr->format; + + pathspec = transformExprRecurse(pstate, func->common->pathspec); + + jsexpr->path_spec = + coerce_to_target_type(pstate, pathspec, exprType(pathspec), + JSONPATHOID, -1, + COERCION_EXPLICIT, COERCE_IMPLICIT_CAST, + exprLocation(pathspec)); + if (!jsexpr->path_spec) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("JSON path expression must be type %s, not type %s", + "jsonpath", format_type_be(exprType(pathspec))), + parser_errposition(pstate, exprLocation(pathspec)))); + + /* transform and coerce to json[b] passing arguments */ + transformJsonPassingArgs(pstate, format, func->common->passing, + &jsexpr->passing_values, &jsexpr->passing_names); + + if (func->op != JSON_EXISTS_OP) + jsexpr->on_empty = transformJsonBehavior(pstate, func->on_empty, + JSON_BEHAVIOR_NULL); + + jsexpr->on_error = transformJsonBehavior(pstate, func->on_error, + func->op == JSON_EXISTS_OP ? + JSON_BEHAVIOR_FALSE : + JSON_BEHAVIOR_NULL); + + return jsexpr; +} + +/* + * Assign default JSON returning type from the specified format or from + * the context item type. + */ +static void +assignDefaultJsonReturningType(Node *context_item, JsonFormat *context_format, + JsonReturning *ret) +{ + bool is_jsonb; + + ret->format = copyObject(context_format); + + if (ret->format->format_type == JS_FORMAT_DEFAULT) + is_jsonb = exprType(context_item) == JSONBOID; + else + is_jsonb = ret->format->format_type == JS_FORMAT_JSONB; + + ret->typid = is_jsonb ? JSONBOID : JSONOID; + ret->typmod = -1; +} + +/* + * Try to coerce expression to the output type or + * use json_populate_type() for composite, array and domain types or + * use coercion via I/O. + */ +static JsonCoercion * +coerceJsonExpr(ParseState *pstate, Node *expr, const JsonReturning *returning) +{ + char typtype; + JsonCoercion *coercion = makeNode(JsonCoercion); + + coercion->expr = coerceJsonFuncExpr(pstate, expr, returning, false); + + if (coercion->expr) + { + if (coercion->expr == expr) + coercion->expr = NULL; + + return coercion; + } + + typtype = get_typtype(returning->typid); + + if (returning->typid == RECORDOID || + typtype == TYPTYPE_COMPOSITE || + typtype == TYPTYPE_DOMAIN || + type_is_array(returning->typid)) + coercion->via_populate = true; + else + coercion->via_io = true; + + return coercion; +} + +/* + * Transform a JSON output clause of JSON_VALUE and JSON_QUERY. + */ +static void +transformJsonFuncExprOutput(ParseState *pstate, JsonFuncExpr *func, + JsonExpr *jsexpr) +{ + Node *expr = jsexpr->formatted_expr; + + jsexpr->returning = transformJsonOutput(pstate, func->output, false); + + /* JSON_VALUE returns text by default */ + if (func->op == JSON_VALUE_OP && !OidIsValid(jsexpr->returning->typid)) + { + jsexpr->returning->typid = TEXTOID; + jsexpr->returning->typmod = -1; + } + + if (OidIsValid(jsexpr->returning->typid)) + { + JsonReturning ret; + + if (func->op == JSON_VALUE_OP && + jsexpr->returning->typid != JSONOID && + jsexpr->returning->typid != JSONBOID) + { + /* Forced coercion via I/O for JSON_VALUE for non-JSON types */ + jsexpr->result_coercion = makeNode(JsonCoercion); + jsexpr->result_coercion->expr = NULL; + jsexpr->result_coercion->via_io = true; + return; + } + + assignDefaultJsonReturningType(jsexpr->formatted_expr, jsexpr->format, &ret); + + if (ret.typid != jsexpr->returning->typid || + ret.typmod != jsexpr->returning->typmod) + { + Node *placeholder = makeCaseTestExpr(expr); + + Assert(((CaseTestExpr *) placeholder)->typeId == ret.typid); + Assert(((CaseTestExpr *) placeholder)->typeMod == ret.typmod); + + jsexpr->result_coercion = coerceJsonExpr(pstate, placeholder, + jsexpr->returning); + } + } + else + assignDefaultJsonReturningType(jsexpr->formatted_expr, jsexpr->format, + jsexpr->returning); +} + +/* + * Coerce a expression in JSON DEFAULT behavior to the target output type. + */ +static Node * +coerceDefaultJsonExpr(ParseState *pstate, JsonExpr *jsexpr, Node *defexpr) +{ + int location; + Oid exprtype; + + if (!defexpr) + return NULL; + + exprtype = exprType(defexpr); + location = exprLocation(defexpr); + + if (location < 0) + location = jsexpr->location; + + defexpr = coerce_to_target_type(pstate, + defexpr, + exprtype, + jsexpr->returning->typid, + jsexpr->returning->typmod, + COERCION_EXPLICIT, + COERCE_IMPLICIT_CAST, + location); + + if (!defexpr) + ereport(ERROR, + (errcode(ERRCODE_CANNOT_COERCE), + errmsg("cannot cast DEFAULT expression type %s to %s", + format_type_be(exprtype), + format_type_be(jsexpr->returning->typid)), + parser_errposition(pstate, location))); + + return defexpr; +} + +/* + * Initialize SQL/JSON item coercion from the SQL type "typid" to the target + * "returning" type. + */ +static JsonCoercion * +initJsonItemCoercion(ParseState *pstate, Oid typid, + const JsonReturning *returning) +{ + Node *expr; + + if (typid == UNKNOWNOID) + { + expr = (Node *) makeNullConst(UNKNOWNOID, -1, InvalidOid); + } + else + { + CaseTestExpr *placeholder = makeNode(CaseTestExpr); + + placeholder->typeId = typid; + placeholder->typeMod = -1; + placeholder->collation = InvalidOid; + + expr = (Node *) placeholder; + } + + return coerceJsonExpr(pstate, expr, returning); +} + +static void +initJsonItemCoercions(ParseState *pstate, JsonItemCoercions *coercions, + const JsonReturning *returning, Oid contextItemTypeId) +{ + struct + { + JsonCoercion **coercion; + Oid typid; + } *p, + coercionTypids[] = + { + { &coercions->null, UNKNOWNOID }, + { &coercions->string, TEXTOID }, + { &coercions->numeric, NUMERICOID }, + { &coercions->boolean, BOOLOID }, + { &coercions->date, DATEOID }, + { &coercions->time, TIMEOID }, + { &coercions->timetz, TIMETZOID }, + { &coercions->timestamp, TIMESTAMPOID }, + { &coercions->timestamptz, TIMESTAMPTZOID }, + { &coercions->composite, contextItemTypeId }, + { NULL, InvalidOid } + }; + + for (p = coercionTypids; p->coercion; p++) + *p->coercion = initJsonItemCoercion(pstate, p->typid, returning); +} + +/* + * Transform JSON_VALUE, JSON_QUERY, JSON_EXISTS functions into a JsonExpr node. + */ +static Node * +transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func) +{ + JsonExpr *jsexpr = transformJsonExprCommon(pstate, func); + const char *func_name = NULL; + Node *contextItemExpr = jsexpr->formatted_expr; + + switch (func->op) + { + case JSON_VALUE_OP: + func_name = "JSON_VALUE"; + + transformJsonFuncExprOutput(pstate, func, jsexpr); + + jsexpr->returning->format->format_type = JS_FORMAT_DEFAULT; + jsexpr->returning->format->encoding = JS_ENC_DEFAULT; + + jsexpr->on_empty->default_expr = + coerceDefaultJsonExpr(pstate, jsexpr, + jsexpr->on_empty->default_expr); + + jsexpr->on_error->default_expr = + coerceDefaultJsonExpr(pstate, jsexpr, + jsexpr->on_error->default_expr); + + jsexpr->coercions = makeNode(JsonItemCoercions); + initJsonItemCoercions(pstate, jsexpr->coercions, jsexpr->returning, + exprType(contextItemExpr)); + + break; + + case JSON_QUERY_OP: + func_name = "JSON_QUERY"; + + transformJsonFuncExprOutput(pstate, func, jsexpr); + + jsexpr->on_empty->default_expr = + coerceDefaultJsonExpr(pstate, jsexpr, + jsexpr->on_empty->default_expr); + + jsexpr->on_error->default_expr = + coerceDefaultJsonExpr(pstate, jsexpr, + jsexpr->on_error->default_expr); + + jsexpr->wrapper = func->wrapper; + jsexpr->omit_quotes = func->omit_quotes; + + break; + + case JSON_EXISTS_OP: + func_name = "JSON_EXISTS"; + + jsexpr->returning = transformJsonOutput(pstate, func->output, false); + + jsexpr->returning->format->format_type = JS_FORMAT_DEFAULT; + jsexpr->returning->format->encoding = JS_ENC_DEFAULT; + + if (!OidIsValid(jsexpr->returning->typid)) + { + jsexpr->returning->typid = BOOLOID; + jsexpr->returning->typmod = -1; + } + else if (jsexpr->returning->typid != BOOLOID) + { + CaseTestExpr *placeholder = makeNode(CaseTestExpr); + int location = exprLocation((Node *) jsexpr); + + placeholder->typeId = BOOLOID; + placeholder->typeMod = -1; + placeholder->collation = InvalidOid; + + jsexpr->result_coercion = makeNode(JsonCoercion); + jsexpr->result_coercion->expr = + coerce_to_target_type(pstate, (Node *) placeholder, BOOLOID, + jsexpr->returning->typid, + jsexpr->returning->typmod, + COERCION_EXPLICIT, + COERCE_IMPLICIT_CAST, + location); + + if (!jsexpr->result_coercion->expr) + ereport(ERROR, + (errcode(ERRCODE_CANNOT_COERCE), + errmsg("cannot cast type %s to %s", + format_type_be(BOOLOID), + format_type_be(jsexpr->returning->typid)), + parser_coercion_errposition(pstate, location, (Node *) jsexpr))); + + if (jsexpr->result_coercion->expr == (Node *) placeholder) + jsexpr->result_coercion->expr = NULL; + } + break; + } + + if (exprType(contextItemExpr) != JSONBOID) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("%s() is not yet implemented for json type", func_name), + parser_errposition(pstate, func->location))); + + return (Node *) jsexpr; +} diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index e6445c7baf..62d5d7d439 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -1971,6 +1971,21 @@ FigureColnameInternal(Node *node, char **name) case T_JsonArrayAgg: *name = "json_arrayagg"; return 2; + case T_JsonFuncExpr: + /* make SQL/JSON functions act like a regular function */ + switch (((JsonFuncExpr *) node)->op) + { + case JSON_QUERY_OP: + *name = "json_query"; + return 2; + case JSON_VALUE_OP: + *name = "json_value"; + return 2; + case JSON_EXISTS_OP: + *name = "json_exists"; + return 2; + } + break; default: break; } diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index ed698f788d..ac74333be5 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -1023,11 +1023,6 @@ typedef struct NUMProc *L_currency_symbol; } NUMProc; -/* Return flags for DCH_from_char() */ -#define DCH_DATED 0x01 -#define DCH_TIMED 0x02 -#define DCH_ZONED 0x04 - /* ---------- * Functions * ---------- @@ -6672,3 +6667,43 @@ float8_to_char(PG_FUNCTION_ARGS) NUM_TOCHAR_finish; PG_RETURN_TEXT_P(result); } + +int +datetime_format_flags(const char *fmt_str, bool *have_error) +{ + bool incache; + int fmt_len = strlen(fmt_str); + int result; + FormatNode *format; + + if (fmt_len > DCH_CACHE_SIZE) + { + /* + * Allocate new memory if format picture is bigger than static cache + * and do not use cache (call parser always) + */ + incache = false; + + format = (FormatNode *) palloc((fmt_len + 1) * sizeof(FormatNode)); + + parse_format(format, fmt_str, DCH_keywords, + DCH_suff, DCH_index, DCH_FLAG, NULL); + } + else + { + /* + * Use cache buffers + */ + DCHCacheEntry *ent = DCH_cache_fetch(fmt_str, false); + + incache = true; + format = ent->format; + } + + result = DCH_datetime_type(format, have_error); + + if (!incache) + pfree(format); + + return result; +} diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c index a103cbc7c6..d383cbdfed 100644 --- a/src/backend/utils/adt/jsonb.c +++ b/src/backend/utils/adt/jsonb.c @@ -2227,3 +2227,65 @@ jsonb_float8(PG_FUNCTION_ARGS) PG_RETURN_DATUM(retValue); } + +/* + * Construct an empty array jsonb. + */ +Jsonb * +JsonbMakeEmptyArray(void) +{ + JsonbValue jbv; + + jbv.type = jbvArray; + jbv.val.array.elems = NULL; + jbv.val.array.nElems = 0; + jbv.val.array.rawScalar = false; + + return JsonbValueToJsonb(&jbv); +} + +/* + * Construct an empty object jsonb. + */ +Jsonb * +JsonbMakeEmptyObject(void) +{ + JsonbValue jbv; + + jbv.type = jbvObject; + jbv.val.object.pairs = NULL; + jbv.val.object.nPairs = 0; + + return JsonbValueToJsonb(&jbv); +} + +/* + * Convert jsonb to a C-string stripping quotes from scalar strings. + */ +char * +JsonbUnquote(Jsonb *jb) +{ + if (JB_ROOT_IS_SCALAR(jb)) + { + JsonbValue v; + + JsonbExtractScalar(&jb->root, &v); + + if (v.type == jbvString) + return pnstrdup(v.val.string.val, v.val.string.len); + else if (v.type == jbvBool) + return pstrdup(v.val.boolean ? "true" : "false"); + else if (v.type == jbvNumeric) + return DatumGetCString(DirectFunctionCall1(numeric_out, + PointerGetDatum(v.val.numeric))); + else if (v.type == jbvNull) + return pstrdup("null"); + else + { + elog(ERROR, "unrecognized jsonb value type %d", v.type); + return NULL; + } + } + else + return JsonbToCString(NULL, &jb->root, VARSIZE(jb)); +} diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index a24d498b06..a682d9c973 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -2658,11 +2658,11 @@ populate_array_dim_jsonb(PopulateArrayContext *ctx, /* context */ check_stack_depth(); - if (jbv->type != jbvBinary || !JsonContainerIsArray(jbc)) + if (jbv->type != jbvBinary || + !JsonContainerIsArray(jbc) || + JsonContainerIsScalar(jbc)) populate_array_report_expected_array(ctx, ndim - 1); - Assert(!JsonContainerIsScalar(jbc)); - it = JsonbIteratorInit(jbc); tok = JsonbIteratorNext(&it, &val, true); @@ -3134,6 +3134,50 @@ populate_record_field(ColumnIOData *col, } } +/* recursively populate specified type from a json/jsonb value */ +Datum +json_populate_type(Datum json_val, Oid json_type, Oid typid, int32 typmod, + void **cache, MemoryContext mcxt, bool *isnull) +{ + JsValue jsv = { 0 }; + JsonbValue jbv; + + jsv.is_json = json_type == JSONOID; + + if (*isnull) + { + if (jsv.is_json) + jsv.val.json.str = NULL; + else + jsv.val.jsonb = NULL; + } + else if (jsv.is_json) + { + text *json = DatumGetTextPP(json_val); + + jsv.val.json.str = VARDATA_ANY(json); + jsv.val.json.len = VARSIZE_ANY_EXHDR(json); + jsv.val.json.type = JSON_TOKEN_INVALID; /* not used in populate_composite() */ + } + else + { + Jsonb *jsonb = DatumGetJsonbP(json_val); + + jsv.val.jsonb = &jbv; + + /* fill binary jsonb value pointing to jb */ + jbv.type = jbvBinary; + jbv.val.binary.data = &jsonb->root; + jbv.val.binary.len = VARSIZE(jsonb) - VARHDRSZ; + } + + if (!*cache) + *cache = MemoryContextAllocZero(mcxt, sizeof(ColumnIOData)); + + return populate_record_field(*cache , typid, typmod, NULL, mcxt, + PointerGetDatum(NULL), &jsv, isnull); +} + static RecordIOData * allocate_record_info(MemoryContext mcxt, int ncolumns) { diff --git a/src/backend/utils/adt/jsonpath.c b/src/backend/utils/adt/jsonpath.c index 91af030095..0ac14153aa 100644 --- a/src/backend/utils/adt/jsonpath.c +++ b/src/backend/utils/adt/jsonpath.c @@ -67,7 +67,9 @@ #include "lib/stringinfo.h" #include "libpq/pqformat.h" #include "miscadmin.h" +#include "nodes/nodeFuncs.h" #include "utils/builtins.h" +#include "utils/formatting.h" #include "utils/json.h" #include "utils/jsonpath.h" @@ -1077,3 +1079,258 @@ jspGetArraySubscript(JsonPathItem *v, JsonPathItem *from, JsonPathItem *to, return true; } + +/* SQL/JSON datatype status: */ +typedef enum JsonPathDatatypeStatus +{ + jpdsNonDateTime, /* null, bool, numeric, string, array, object */ + jpdsUnknownDateTime, /* unknown datetime type */ + jpdsDateTimeZoned, /* timetz, timestamptz */ + jpdsDateTimeNonZoned /* time, timestamp, date */ +} JsonPathDatatypeStatus; + +/* Context for jspIsMutableWalker() */ +typedef struct JsonPathMutableContext +{ + List *varnames; /* list of variable names */ + List *varexprs; /* list of variable expressions */ + JsonPathDatatypeStatus current; /* status of @ item */ + bool lax; /* jsonpath is lax or strict */ + bool mutable; /* resulting mutability status */ +} JsonPathMutableContext; + +/* + * Recursive walker for jspIsMutable() + */ +static JsonPathDatatypeStatus +jspIsMutableWalker(JsonPathItem *jpi, JsonPathMutableContext *cxt) +{ + JsonPathItem next; + JsonPathDatatypeStatus status = jpdsNonDateTime; + + while (!cxt->mutable) + { + JsonPathItem arg; + JsonPathDatatypeStatus leftStatus; + JsonPathDatatypeStatus rightStatus; + + switch (jpi->type) + { + case jpiRoot: + Assert(status == jpdsNonDateTime); + break; + + case jpiCurrent: + Assert(status == jpdsNonDateTime); + status = cxt->current; + break; + + case jpiFilter: + { + JsonPathDatatypeStatus prevStatus = cxt->current; + + cxt->current = status; + jspGetArg(jpi, &arg); + jspIsMutableWalker(&arg, cxt); + + cxt->current = prevStatus; + break; + } + + case jpiVariable: + { + int32 len; + const char *name = jspGetString(jpi, &len); + ListCell *lc1; + ListCell *lc2; + + Assert(status == jpdsNonDateTime); + + forboth(lc1, cxt->varnames, lc2, cxt->varexprs) + { + String *varname = lfirst_node(String, lc1); + Node *varexpr = lfirst(lc2); + + if (strncmp(varname->sval, name, len)) + continue; + + switch (exprType(varexpr)) + { + case DATEOID: + case TIMEOID: + case TIMESTAMPOID: + status = jpdsDateTimeNonZoned; + break; + + case TIMETZOID: + case TIMESTAMPTZOID: + status = jpdsDateTimeZoned; + break; + + default: + status = jpdsNonDateTime; + break; + } + + break; + } + break; + } + + case jpiEqual: + case jpiNotEqual: + case jpiLess: + case jpiGreater: + case jpiLessOrEqual: + case jpiGreaterOrEqual: + Assert(status == jpdsNonDateTime); + jspGetLeftArg(jpi, &arg); + leftStatus = jspIsMutableWalker(&arg, cxt); + + jspGetRightArg(jpi, &arg); + rightStatus = jspIsMutableWalker(&arg, cxt); + + /* + * Comparison of datetime type with different timezone status + * is mutable. + */ + if (leftStatus != jpdsNonDateTime && + rightStatus != jpdsNonDateTime && + (leftStatus == jpdsUnknownDateTime || + rightStatus == jpdsUnknownDateTime || + leftStatus != rightStatus)) + cxt->mutable = true; + break; + + case jpiNot: + case jpiIsUnknown: + case jpiExists: + case jpiPlus: + case jpiMinus: + Assert(status == jpdsNonDateTime); + jspGetArg(jpi, &arg); + jspIsMutableWalker(&arg, cxt); + break; + + case jpiAnd: + case jpiOr: + case jpiAdd: + case jpiSub: + case jpiMul: + case jpiDiv: + case jpiMod: + case jpiStartsWith: + Assert(status == jpdsNonDateTime); + jspGetLeftArg(jpi, &arg); + jspIsMutableWalker(&arg, cxt); + jspGetRightArg(jpi, &arg); + jspIsMutableWalker(&arg, cxt); + break; + + case jpiIndexArray: + for (int i = 0; i < jpi->content.array.nelems; i++) + { + JsonPathItem from; + JsonPathItem to; + + if (jspGetArraySubscript(jpi, &from, &to, i)) + jspIsMutableWalker(&to, cxt); + + jspIsMutableWalker(&from, cxt); + } + /* FALLTHROUGH */ + + case jpiAnyArray: + if (!cxt->lax) + status = jpdsNonDateTime; + break; + + case jpiAny: + if (jpi->content.anybounds.first > 0) + status = jpdsNonDateTime; + break; + + case jpiDatetime: + if (jpi->content.arg) + { + char *template; + int flags; + + jspGetArg(jpi, &arg); + if (arg.type != jpiString) + { + status = jpdsNonDateTime; + break; /* there will be runtime error */ + } + + template = jspGetString(&arg, NULL); + flags = datetime_format_flags(template, NULL); + if (flags & DCH_ZONED) + status = jpdsDateTimeZoned; + else + status = jpdsDateTimeNonZoned; + } + else + { + status = jpdsUnknownDateTime; + } + break; + + case jpiLikeRegex: + Assert(status == jpdsNonDateTime); + jspInitByBuffer(&arg, jpi->base, jpi->content.like_regex.expr); + jspIsMutableWalker(&arg, cxt); + break; + + /* literals */ + case jpiNull: + case jpiString: + case jpiNumeric: + case jpiBool: + /* accessors */ + case jpiKey: + case jpiAnyKey: + /* special items */ + case jpiSubscript: + case jpiLast: + /* item methods */ + case jpiType: + case jpiSize: + case jpiAbs: + case jpiFloor: + case jpiCeiling: + case jpiDouble: + case jpiKeyValue: + status = jpdsNonDateTime; + break; + } + + if (!jspGetNext(jpi, &next)) + break; + + jpi = &next; + } + + return status; +} + +/* + * Check whether jsonpath expression is immutable or not. + */ +bool +jspIsMutable(JsonPath *path, List *varnames, List *varexprs) +{ + JsonPathMutableContext cxt; + JsonPathItem jpi; + + cxt.varnames = varnames; + cxt.varexprs = varexprs; + cxt.current = jpdsNonDateTime; + cxt.lax = (path->header & JSONPATH_LAX) != 0; + cxt.mutable = false; + + jspInit(&jpi, path); + jspIsMutableWalker(&jpi, &cxt); + + return cxt.mutable; +} diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c index eff3734b6a..7811fa31e0 100644 --- a/src/backend/utils/adt/jsonpath_exec.c +++ b/src/backend/utils/adt/jsonpath_exec.c @@ -86,12 +86,16 @@ typedef struct JsonBaseObjectInfo int id; } JsonBaseObjectInfo; +typedef int (*JsonPathVarCallback) (void *vars, char *varName, int varNameLen, + JsonbValue *val, JsonbValue *baseObject); + /* * Context of jsonpath execution. */ typedef struct JsonPathExecContext { - Jsonb *vars; /* variables to substitute into jsonpath */ + void *vars; /* variables to substitute into jsonpath */ + JsonPathVarCallback getVar; JsonbValue *root; /* for $ evaluation */ JsonbValue *current; /* for @ evaluation */ JsonBaseObjectInfo baseObject; /* "base object" for .keyvalue() @@ -173,7 +177,8 @@ typedef JsonPathBool (*JsonPathPredicateCallback) (JsonPathItem *jsp, void *param); typedef Numeric (*BinaryArithmFunc) (Numeric num1, Numeric num2, bool *error); -static JsonPathExecResult executeJsonPath(JsonPath *path, Jsonb *vars, +static JsonPathExecResult executeJsonPath(JsonPath *path, void *vars, + JsonPathVarCallback getVar, Jsonb *json, bool throwErrors, JsonValueList *result, bool useTz); static JsonPathExecResult executeItem(JsonPathExecContext *cxt, @@ -225,7 +230,10 @@ static JsonPathExecResult appendBoolResult(JsonPathExecContext *cxt, static void getJsonPathItem(JsonPathExecContext *cxt, JsonPathItem *item, JsonbValue *value); static void getJsonPathVariable(JsonPathExecContext *cxt, - JsonPathItem *variable, Jsonb *vars, JsonbValue *value); + JsonPathItem *variable, JsonbValue *value); +static int getJsonPathVariableFromJsonb(void *varsJsonb, char *varName, + int varNameLen, JsonbValue *val, + JsonbValue *baseObject); static int JsonbArraySize(JsonbValue *jb); static JsonPathBool executeComparison(JsonPathItem *cmp, JsonbValue *lv, JsonbValue *rv, void *p); @@ -283,7 +291,8 @@ jsonb_path_exists_internal(FunctionCallInfo fcinfo, bool tz) silent = PG_GETARG_BOOL(3); } - res = executeJsonPath(jp, vars, jb, !silent, NULL, tz); + res = executeJsonPath(jp, vars, getJsonPathVariableFromJsonb, + jb, !silent, NULL, tz); PG_FREE_IF_COPY(jb, 0); PG_FREE_IF_COPY(jp, 1); @@ -338,7 +347,8 @@ jsonb_path_match_internal(FunctionCallInfo fcinfo, bool tz) silent = PG_GETARG_BOOL(3); } - (void) executeJsonPath(jp, vars, jb, !silent, &found, tz); + (void) executeJsonPath(jp, vars, getJsonPathVariableFromJsonb, + jb, !silent, &found, tz); PG_FREE_IF_COPY(jb, 0); PG_FREE_IF_COPY(jp, 1); @@ -416,7 +426,8 @@ jsonb_path_query_internal(FunctionCallInfo fcinfo, bool tz) vars = PG_GETARG_JSONB_P_COPY(2); silent = PG_GETARG_BOOL(3); - (void) executeJsonPath(jp, vars, jb, !silent, &found, tz); + (void) executeJsonPath(jp, vars, getJsonPathVariableFromJsonb, + jb, !silent, &found, tz); funcctx->user_fctx = JsonValueListGetList(&found); @@ -463,7 +474,8 @@ jsonb_path_query_array_internal(FunctionCallInfo fcinfo, bool tz) Jsonb *vars = PG_GETARG_JSONB_P(2); bool silent = PG_GETARG_BOOL(3); - (void) executeJsonPath(jp, vars, jb, !silent, &found, tz); + (void) executeJsonPath(jp, vars, getJsonPathVariableFromJsonb, + jb, !silent, &found, tz); PG_RETURN_JSONB_P(JsonbValueToJsonb(wrapItemsInArray(&found))); } @@ -494,7 +506,8 @@ jsonb_path_query_first_internal(FunctionCallInfo fcinfo, bool tz) Jsonb *vars = PG_GETARG_JSONB_P(2); bool silent = PG_GETARG_BOOL(3); - (void) executeJsonPath(jp, vars, jb, !silent, &found, tz); + (void) executeJsonPath(jp, vars, getJsonPathVariableFromJsonb, + jb, !silent, &found, tz); if (JsonValueListLength(&found) >= 1) PG_RETURN_JSONB_P(JsonbValueToJsonb(JsonValueListHead(&found))); @@ -536,8 +549,9 @@ jsonb_path_query_first_tz(PG_FUNCTION_ARGS) * In other case it tries to find all the satisfied result items. */ static JsonPathExecResult -executeJsonPath(JsonPath *path, Jsonb *vars, Jsonb *json, bool throwErrors, - JsonValueList *result, bool useTz) +executeJsonPath(JsonPath *path, void *vars, JsonPathVarCallback getVar, + Jsonb *json, bool throwErrors, JsonValueList *result, + bool useTz) { JsonPathExecContext cxt; JsonPathExecResult res; @@ -549,22 +563,16 @@ executeJsonPath(JsonPath *path, Jsonb *vars, Jsonb *json, bool throwErrors, if (!JsonbExtractScalar(&json->root, &jbv)) JsonbInitBinary(&jbv, json); - if (vars && !JsonContainerIsObject(&vars->root)) - { - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("\"vars\" argument is not an object"), - errdetail("Jsonpath parameters should be encoded as key-value pairs of \"vars\" object."))); - } - cxt.vars = vars; + cxt.getVar = getVar; cxt.laxMode = (path->header & JSONPATH_LAX) != 0; cxt.ignoreStructuralErrors = cxt.laxMode; cxt.root = &jbv; cxt.current = &jbv; cxt.baseObject.jbc = NULL; cxt.baseObject.id = 0; - cxt.lastGeneratedObjectId = vars ? 2 : 1; + /* 1 + number of base objects in vars */ + cxt.lastGeneratedObjectId = 1 + getVar(vars, NULL, 0, NULL, NULL); cxt.innermostArraySize = -1; cxt.throwErrors = throwErrors; cxt.useTz = useTz; @@ -2093,7 +2101,7 @@ getJsonPathItem(JsonPathExecContext *cxt, JsonPathItem *item, &value->val.string.len); break; case jpiVariable: - getJsonPathVariable(cxt, item, cxt->vars, value); + getJsonPathVariable(cxt, item, value); return; default: elog(ERROR, "unexpected jsonpath item type"); @@ -2105,42 +2113,63 @@ getJsonPathItem(JsonPathExecContext *cxt, JsonPathItem *item, */ static void getJsonPathVariable(JsonPathExecContext *cxt, JsonPathItem *variable, - Jsonb *vars, JsonbValue *value) + JsonbValue *value) { char *varName; int varNameLength; + JsonbValue baseObject; + int baseObjectId; + + Assert(variable->type == jpiVariable); + varName = jspGetString(variable, &varNameLength); + + if (!cxt->vars || + (baseObjectId = cxt->getVar(cxt->vars, varName, varNameLength, value, + &baseObject)) < 0) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("could not find jsonpath variable \"%s\"", + pnstrdup(varName, varNameLength)))); + + if (baseObjectId > 0) + setBaseObject(cxt, &baseObject, baseObjectId); +} + +static int +getJsonPathVariableFromJsonb(void *varsJsonb, char *varName, int varNameLength, + JsonbValue *value, JsonbValue *baseObject) +{ + Jsonb *vars = varsJsonb; JsonbValue tmp; JsonbValue *v; - if (!vars) + if (!varName) { - value->type = jbvNull; - return; + if (vars && !JsonContainerIsObject(&vars->root)) + { + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("\"vars\" argument is not an object"), + errdetail("Jsonpath parameters should be encoded as key-value pairs of \"vars\" object."))); + } + + return vars ? 1 : 0; /* count of base objects */ } - Assert(variable->type == jpiVariable); - varName = jspGetString(variable, &varNameLength); tmp.type = jbvString; tmp.val.string.val = varName; tmp.val.string.len = varNameLength; v = findJsonbValueFromContainer(&vars->root, JB_FOBJECT, &tmp); - if (v) - { - *value = *v; - pfree(v); - } - else - { - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("could not find jsonpath variable \"%s\"", - pnstrdup(varName, varNameLength)))); - } + if (!v) + return -1; - JsonbInitBinary(&tmp, vars); - setBaseObject(cxt, &tmp, 1); + *value = *v; + pfree(v); + + JsonbInitBinary(baseObject, vars); + return 1; } /**************** Support functions for JsonPath execution *****************/ @@ -2797,3 +2826,244 @@ compareDatetime(Datum val1, Oid typid1, Datum val2, Oid typid2, return DatumGetInt32(DirectFunctionCall2(cmpfunc, val1, val2)); } + +/********************Interface to pgsql's executor***************************/ + +bool +JsonPathExists(Datum jb, JsonPath *jp, List *vars, bool *error) +{ + JsonPathExecResult res = executeJsonPath(jp, vars, EvalJsonPathVar, + DatumGetJsonbP(jb), !error, NULL, + true); + + Assert(error || !jperIsError(res)); + + if (error && jperIsError(res)) + *error = true; + + return res == jperOk; +} + +Datum +JsonPathQuery(Datum jb, JsonPath *jp, JsonWrapper wrapper, bool *empty, + bool *error, List *vars) +{ + JsonbValue *first; + bool wrap; + JsonValueList found = {0}; + JsonPathExecResult res PG_USED_FOR_ASSERTS_ONLY; + int count; + + res = executeJsonPath(jp, vars, EvalJsonPathVar, DatumGetJsonbP(jb), !error, + &found, true); + + Assert(error || !jperIsError(res)); + + if (error && jperIsError(res)) + { + *error = true; + *empty = false; + return (Datum) 0; + } + + count = JsonValueListLength(&found); + + first = count ? JsonValueListHead(&found) : NULL; + + if (!first) + wrap = false; + else if (wrapper == JSW_NONE) + wrap = false; + else if (wrapper == JSW_UNCONDITIONAL) + wrap = true; + else if (wrapper == JSW_CONDITIONAL) + wrap = count > 1 || + IsAJsonbScalar(first) || + (first->type == jbvBinary && + JsonContainerIsScalar(first->val.binary.data)); + else + { + elog(ERROR, "unrecognized json wrapper %d", wrapper); + wrap = false; + } + + if (wrap) + return JsonbPGetDatum(JsonbValueToJsonb(wrapItemsInArray(&found))); + + if (count > 1) + { + if (error) + { + *error = true; + return (Datum) 0; + } + + ereport(ERROR, + (errcode(ERRCODE_MORE_THAN_ONE_SQL_JSON_ITEM), + errmsg("JSON path expression in JSON_QUERY should return " + "singleton item without wrapper"), + errhint("use WITH WRAPPER clause to wrap SQL/JSON item " + "sequence into array"))); + } + + if (first) + return JsonbPGetDatum(JsonbValueToJsonb(first)); + + *empty = true; + return PointerGetDatum(NULL); +} + +JsonbValue * +JsonPathValue(Datum jb, JsonPath *jp, bool *empty, bool *error, List *vars) +{ + JsonbValue *res; + JsonValueList found = { 0 }; + JsonPathExecResult jper PG_USED_FOR_ASSERTS_ONLY; + int count; + + jper = executeJsonPath(jp, vars, EvalJsonPathVar, DatumGetJsonbP(jb), !error, + &found, true); + + Assert(error || !jperIsError(jper)); + + if (error && jperIsError(jper)) + { + *error = true; + *empty = false; + return NULL; + } + + count = JsonValueListLength(&found); + + *empty = !count; + + if (*empty) + return NULL; + + if (count > 1) + { + if (error) + { + *error = true; + return NULL; + } + + ereport(ERROR, + (errcode(ERRCODE_MORE_THAN_ONE_SQL_JSON_ITEM), + errmsg("JSON path expression in JSON_VALUE should return " + "singleton scalar item"))); + } + + res = JsonValueListHead(&found); + + if (res->type == jbvBinary && + JsonContainerIsScalar(res->val.binary.data)) + JsonbExtractScalar(res->val.binary.data, res); + + if (!IsAJsonbScalar(res)) + { + if (error) + { + *error = true; + return NULL; + } + + ereport(ERROR, + (errcode(ERRCODE_SQL_JSON_SCALAR_REQUIRED), + errmsg("JSON path expression in JSON_VALUE should return " + "singleton scalar item"))); + } + + if (res->type == jbvNull) + return NULL; + + return res; +} + +static void +JsonbValueInitNumericDatum(JsonbValue *jbv, Datum num) +{ + jbv->type = jbvNumeric; + jbv->val.numeric = DatumGetNumeric(num); +} + +void +JsonItemFromDatum(Datum val, Oid typid, int32 typmod, JsonbValue *res) +{ + switch (typid) + { + case BOOLOID: + res->type = jbvBool; + res->val.boolean = DatumGetBool(val); + break; + case NUMERICOID: + JsonbValueInitNumericDatum(res, val); + break; + case INT2OID: + JsonbValueInitNumericDatum(res, DirectFunctionCall1(int2_numeric, val)); + break; + case INT4OID: + JsonbValueInitNumericDatum(res, DirectFunctionCall1(int4_numeric, val)); + break; + case INT8OID: + JsonbValueInitNumericDatum(res, DirectFunctionCall1(int8_numeric, val)); + break; + case FLOAT4OID: + JsonbValueInitNumericDatum(res, DirectFunctionCall1(float4_numeric, val)); + break; + case FLOAT8OID: + JsonbValueInitNumericDatum(res, DirectFunctionCall1(float8_numeric, val)); + break; + case TEXTOID: + case VARCHAROID: + res->type = jbvString; + res->val.string.val = VARDATA_ANY(val); + res->val.string.len = VARSIZE_ANY_EXHDR(val); + break; + case DATEOID: + case TIMEOID: + case TIMETZOID: + case TIMESTAMPOID: + case TIMESTAMPTZOID: + res->type = jbvDatetime; + res->val.datetime.value = val; + res->val.datetime.typid = typid; + res->val.datetime.typmod = typmod; + res->val.datetime.tz = 0; + break; + case JSONBOID: + { + JsonbValue *jbv = res; + Jsonb *jb = DatumGetJsonbP(val); + + if (JsonContainerIsScalar(&jb->root)) + { + bool res PG_USED_FOR_ASSERTS_ONLY; + + res = JsonbExtractScalar(&jb->root, jbv); + Assert(res); + } + else + JsonbInitBinary(jbv, jb); + break; + } + case JSONOID: + { + text *txt = DatumGetTextP(val); + char *str = text_to_cstring(txt); + Jsonb *jb = + DatumGetJsonbP(DirectFunctionCall1(jsonb_in, + CStringGetDatum(str))); + + pfree(str); + + JsonItemFromDatum(JsonbPGetDatum(jb), JSONBOID, -1, res); + break; + } + default: + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("only bool, numeric and text types could be " + "casted to supported jsonpath types."))); + } +} diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 0ed774f6e6..c2484fbcea 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -501,6 +501,8 @@ static char *generate_qualified_type_name(Oid typid); static text *string_to_text(char *str); static char *flatten_reloptions(Oid relid); static void get_reloptions(StringInfo buf, Datum reloptions); +static void get_json_path_spec(Node *path_spec, deparse_context *context, + bool showimplicit); #define only_marker(rte) ((rte)->inh ? "" : "ONLY ") @@ -8137,6 +8139,7 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags) case T_WindowFunc: case T_FuncExpr: case T_JsonConstructorExpr: + case T_JsonExpr: /* function-like: name(..) or name[..] */ return true; @@ -8255,6 +8258,7 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags) case T_GroupingFunc: /* own parentheses */ case T_WindowFunc: /* own parentheses */ case T_CaseExpr: /* other separators */ + case T_JsonExpr: /* own parentheses */ return true; default: return false; @@ -8421,6 +8425,19 @@ get_rule_expr_paren(Node *node, deparse_context *context, appendStringInfoChar(context->buf, ')'); } + +/* + * get_json_path_spec - Parse back a JSON path specification + */ +static void +get_json_path_spec(Node *path_spec, deparse_context *context, bool showimplicit) +{ + if (IsA(path_spec, Const)) + get_const_expr((Const *) path_spec, context, -1); + else + get_rule_expr(path_spec, context, showimplicit); +} + /* * get_json_format - Parse back a JsonFormat node */ @@ -8464,6 +8481,66 @@ get_json_returning(JsonReturning *returning, StringInfo buf, get_json_format(returning->format, buf); } +static void +get_json_behavior(JsonBehavior *behavior, deparse_context *context, + const char *on) +{ + /* + * The order of array elements must correspond to the order of + * JsonBehaviorType members. + */ + const char *behavior_names[] = + { + " NULL", + " ERROR", + " EMPTY", + " TRUE", + " FALSE", + " UNKNOWN", + " EMPTY ARRAY", + " EMPTY OBJECT", + " DEFAULT " + }; + + if ((int) behavior->btype < 0 || behavior->btype >= lengthof(behavior_names)) + elog(ERROR, "invalid json behavior type: %d", behavior->btype); + + appendStringInfoString(context->buf, behavior_names[behavior->btype]); + + if (behavior->btype == JSON_BEHAVIOR_DEFAULT) + get_rule_expr(behavior->default_expr, context, false); + + appendStringInfo(context->buf, " ON %s", on); +} + +/* + * get_json_expr_options + * + * Parse back common options for JSON_QUERY, JSON_VALUE, JSON_EXISTS. + */ +static void +get_json_expr_options(JsonExpr *jsexpr, deparse_context *context, + JsonBehaviorType default_behavior) +{ + if (jsexpr->op == JSON_QUERY_OP) + { + if (jsexpr->wrapper == JSW_CONDITIONAL) + appendStringInfo(context->buf, " WITH CONDITIONAL WRAPPER"); + else if (jsexpr->wrapper == JSW_UNCONDITIONAL) + appendStringInfo(context->buf, " WITH UNCONDITIONAL WRAPPER"); + + if (jsexpr->omit_quotes) + appendStringInfo(context->buf, " OMIT QUOTES"); + } + + if (jsexpr->op != JSON_EXISTS_OP && + jsexpr->on_empty->btype != default_behavior) + get_json_behavior(jsexpr->on_empty, context, "EMPTY"); + + if (jsexpr->on_error->btype != default_behavior) + get_json_behavior(jsexpr->on_error, context, "ERROR"); +} + /* ---------- * get_rule_expr - Parse back an expression * @@ -9623,6 +9700,7 @@ get_rule_expr(Node *node, deparse_context *context, } break; + case T_JsonValueExpr: { JsonValueExpr *jve = (JsonValueExpr *) node; @@ -9670,6 +9748,62 @@ get_rule_expr(Node *node, deparse_context *context, } break; + case T_JsonExpr: + { + JsonExpr *jexpr = (JsonExpr *) node; + + switch (jexpr->op) + { + case JSON_QUERY_OP: + appendStringInfoString(buf, "JSON_QUERY("); + break; + case JSON_VALUE_OP: + appendStringInfoString(buf, "JSON_VALUE("); + break; + case JSON_EXISTS_OP: + appendStringInfoString(buf, "JSON_EXISTS("); + break; + } + + get_rule_expr(jexpr->formatted_expr, context, showimplicit); + + appendStringInfoString(buf, ", "); + + get_json_path_spec(jexpr->path_spec, context, showimplicit); + + if (jexpr->passing_values) + { + ListCell *lc1, *lc2; + bool needcomma = false; + + appendStringInfoString(buf, " PASSING "); + + forboth(lc1, jexpr->passing_names, + lc2, jexpr->passing_values) + { + if (needcomma) + appendStringInfoString(buf, ", "); + needcomma = true; + + get_rule_expr((Node *) lfirst(lc2), context, showimplicit); + appendStringInfo(buf, " AS %s", + ((String *) lfirst_node(String, lc1))->sval); + } + } + + if (jexpr->op != JSON_EXISTS_OP || + jexpr->returning->typid != BOOLOID) + get_json_returning(jexpr->returning, context->buf, + jexpr->op == JSON_QUERY_OP); + + get_json_expr_options(jexpr, context, + jexpr->op == JSON_EXISTS_OP ? + JSON_BEHAVIOR_FALSE : JSON_BEHAVIOR_NULL); + + appendStringInfoString(buf, ")"); + } + break; + case T_List: { char *sep; @@ -9793,6 +9927,7 @@ looks_like_function(Node *node) case T_MinMaxExpr: case T_SQLValueFunction: case T_XmlExpr: + case T_JsonExpr: /* these are all accepted by func_expr_common_subexpr */ return true; default: diff --git a/src/backend/utils/misc/queryjumble.c b/src/backend/utils/misc/queryjumble.c index 8315812793..7120836c70 100644 --- a/src/backend/utils/misc/queryjumble.c +++ b/src/backend/utils/misc/queryjumble.c @@ -785,6 +785,27 @@ JumbleExpr(JumbleState *jstate, Node *node) APP_JUMB(pred->value_type); } break; + case T_JsonExpr: + { + JsonExpr *jexpr = (JsonExpr *) node; + + APP_JUMB(jexpr->op); + JumbleExpr(jstate, jexpr->formatted_expr); + JumbleExpr(jstate, jexpr->path_spec); + foreach(temp, jexpr->passing_names) + { + APP_JUMB_STRING(lfirst_node(String, temp)->sval); + } + JumbleExpr(jstate, (Node *) jexpr->passing_values); + if (jexpr->on_empty) + { + APP_JUMB(jexpr->on_empty->btype); + JumbleExpr(jstate, jexpr->on_empty->default_expr); + } + APP_JUMB(jexpr->on_error->btype); + JumbleExpr(jstate, jexpr->on_error->default_expr); + } + break; case T_List: foreach(temp, (List *) node) { diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h index a41722ae1e..240d07982a 100644 --- a/src/include/executor/execExpr.h +++ b/src/include/executor/execExpr.h @@ -21,6 +21,7 @@ struct ExprEvalStep; struct SubscriptingRefState; struct ScalarArrayOpExprHashTable; +struct JsonbValue; /* Bits in ExprState->flags (see also execnodes.h for public flag bits): */ /* expression's interpreter has been initialized */ @@ -241,6 +242,7 @@ typedef enum ExprEvalOp EEOP_SUBPLAN, EEOP_JSON_CONSTRUCTOR, EEOP_IS_JSON, + EEOP_JSONEXPR, /* aggregation related nodes */ EEOP_AGG_STRICT_DESERIALIZE, @@ -687,6 +689,50 @@ typedef struct ExprEvalStep JsonIsPredicate *pred; /* original expression node */ } is_json; + /* for EEOP_JSONEXPR */ + struct + { + JsonExpr *jsexpr; /* original expression node */ + + struct + { + FmgrInfo func; /* typinput function for output type */ + Oid typioparam; + } input; /* I/O info for output type */ + + NullableDatum + *formatted_expr, /* formatted context item value */ + *res_expr, /* result item */ + *coercion_expr, /* input for JSON item coercion */ + *pathspec; /* path specification value */ + + ExprState *result_expr; /* coerced to output type */ + ExprState *default_on_empty; /* ON EMPTY DEFAULT expression */ + ExprState *default_on_error; /* ON ERROR DEFAULT expression */ + List *args; /* passing arguments */ + + void *cache; /* cache for json_populate_type() */ + + struct JsonCoercionsState + { + struct JsonCoercionState + { + JsonCoercion *coercion; /* coercion expression */ + ExprState *estate; /* coercion expression state */ + } null, + string, + numeric, + boolean, + date, + time, + timetz, + timestamp, + timestamptz, + composite; + } coercions; /* states for coercion from SQL/JSON item + * types directly to the output type */ + } jsonexpr; + } d; } ExprEvalStep; @@ -791,6 +837,14 @@ extern void ExecEvalSysVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext, TupleTableSlot *slot); extern void ExecEvalJsonConstructor(ExprState *state, ExprEvalStep *op, ExprContext *econtext); +extern void ExecEvalJson(ExprState *state, ExprEvalStep *op, + ExprContext *econtext); +extern Datum ExecPrepareJsonItemCoercion(struct JsonbValue *item, + JsonReturning *returning, + struct JsonCoercionsState *coercions, + struct JsonCoercionState **pjcstate); +extern bool ExecEvalJsonNeedsSubTransaction(JsonExpr *jsexpr, + struct JsonCoercionsState *); extern void ExecAggInitGroup(AggState *aggstate, AggStatePerTrans pertrans, AggStatePerGroup pergroup, ExprContext *aggcontext); diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index 82925b4b63..873772f188 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -265,6 +265,8 @@ ExecProcNode(PlanState *node) */ extern ExprState *ExecInitExpr(Expr *node, PlanState *parent); extern ExprState *ExecInitExprWithParams(Expr *node, ParamListInfo ext_params); +extern ExprState *ExecInitExprWithCaseValue(Expr *node, PlanState *parent, + Datum *caseval, bool *casenull); extern ExprState *ExecInitQual(List *qual, PlanState *parent); extern ExprState *ExecInitCheck(List *qual, PlanState *parent); extern List *ExecInitExprList(List *nodes, PlanState *parent); diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h index 380940968b..872f2f0828 100644 --- a/src/include/nodes/makefuncs.h +++ b/src/include/nodes/makefuncs.h @@ -109,6 +109,7 @@ extern VacuumRelation *makeVacuumRelation(RangeVar *relation, Oid oid, List *va_ extern JsonFormat *makeJsonFormat(JsonFormatType type, JsonEncoding encoding, int location); extern JsonValueExpr *makeJsonValueExpr(Expr *expr, JsonFormat *format); +extern JsonBehavior *makeJsonBehavior(JsonBehaviorType type, Node *expr); extern Node *makeJsonKeyValue(Node *key, Node *value); extern Node *makeJsonIsPredicate(Node *expr, JsonFormat *format, JsonValueType vtype, bool unique_keys, diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index e8f30367a4..d48147abee 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -206,6 +206,9 @@ typedef enum NodeTag T_JsonReturning, T_JsonValueExpr, T_JsonConstructorExpr, + T_JsonExpr, + T_JsonCoercion, + T_JsonItemCoercions, /* * TAGS FOR EXPRESSION STATE NODES (execnodes.h) @@ -505,8 +508,12 @@ typedef enum NodeTag T_JsonAggConstructor, T_JsonObjectAgg, T_JsonArrayAgg, + T_JsonFuncExpr, T_JsonIsPredicate, + T_JsonCommon, + T_JsonArgument, T_JsonKeyValue, + T_JsonBehavior, T_JsonOutput, /* diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 6bf212b01a..0ff4ba0884 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1594,6 +1594,23 @@ typedef struct TriggerTransition /* Nodes for SQL/JSON support */ +/* + * JsonQuotes - + * representation of [KEEP|OMIT] QUOTES clause for JSON_QUERY() + */ +typedef enum JsonQuotes +{ + JS_QUOTES_UNSPEC, /* unspecified */ + JS_QUOTES_KEEP, /* KEEP QUOTES */ + JS_QUOTES_OMIT /* OMIT QUOTES */ +} JsonQuotes; + +/* + * JsonPathSpec - + * representation of JSON path constant + */ +typedef char *JsonPathSpec; + /* * JsonOutput - * representation of JSON output clause (RETURNING type [FORMAT format]) @@ -1605,6 +1622,48 @@ typedef struct JsonOutput JsonReturning *returning; /* RETURNING FORMAT clause and type Oids */ } JsonOutput; +/* + * JsonArgument - + * representation of argument from JSON PASSING clause + */ +typedef struct JsonArgument +{ + NodeTag type; + JsonValueExpr *val; /* argument value expression */ + char *name; /* argument name */ +} JsonArgument; + +/* + * JsonCommon - + * representation of common syntax of functions using JSON path + */ +typedef struct JsonCommon +{ + NodeTag type; + JsonValueExpr *expr; /* context item expression */ + Node *pathspec; /* JSON path specification expression */ + char *pathname; /* path name, if any */ + List *passing; /* list of PASSING clause arguments, if any */ + int location; /* token location, or -1 if unknown */ +} JsonCommon; + +/* + * JsonFuncExpr - + * untransformed representation of JSON function expressions + */ +typedef struct JsonFuncExpr +{ + NodeTag type; + JsonExprOp op; /* expression type */ + JsonCommon *common; /* common syntax */ + JsonOutput *output; /* output clause, if specified */ + JsonBehavior *on_empty; /* ON EMPTY behavior, if specified */ + JsonBehavior *on_error; /* ON ERROR behavior, if specified */ + JsonWrapper wrapper; /* array wrapper behavior (JSON_QUERY only) */ + bool omit_quotes; /* omit or keep quotes? (JSON_QUERY only) */ + int location; /* token location, or -1 if unknown */ +} JsonFuncExpr; + /* * JsonKeyValue - * untransformed representation of JSON object key-value pair for diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index f4a39653ac..7ebe868af9 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -1233,6 +1233,17 @@ typedef struct XmlExpr int location; /* token location, or -1 if unknown */ } XmlExpr; +/* + * JsonExprOp - + * enumeration of JSON functions using JSON path + */ +typedef enum JsonExprOp +{ + JSON_VALUE_OP, /* JSON_VALUE() */ + JSON_QUERY_OP, /* JSON_QUERY() */ + JSON_EXISTS_OP /* JSON_EXISTS() */ +} JsonExprOp; + /* * JsonEncoding - * representation of JSON ENCODING clause @@ -1256,6 +1267,37 @@ typedef enum JsonFormatType JS_FORMAT_JSONB /* implicit internal format for RETURNING jsonb */ } JsonFormatType; +/* + * JsonBehaviorType - + * enumeration of behavior types used in JSON ON ... BEHAVIOR clause + * + * If enum members are reordered, get_json_behavior() from ruleutils.c + * must be updated accordingly. + */ +typedef enum JsonBehaviorType +{ + JSON_BEHAVIOR_NULL = 0, + JSON_BEHAVIOR_ERROR, + JSON_BEHAVIOR_EMPTY, + JSON_BEHAVIOR_TRUE, + JSON_BEHAVIOR_FALSE, + JSON_BEHAVIOR_UNKNOWN, + JSON_BEHAVIOR_EMPTY_ARRAY, + JSON_BEHAVIOR_EMPTY_OBJECT, + JSON_BEHAVIOR_DEFAULT +} JsonBehaviorType; + +/* + * JsonWrapper - + * representation of WRAPPER clause for JSON_QUERY() + */ +typedef enum JsonWrapper +{ + JSW_NONE, + JSW_CONDITIONAL, + JSW_UNCONDITIONAL, +} JsonWrapper; + /* * JsonFormat - * representation of JSON FORMAT clause @@ -1343,6 +1385,73 @@ typedef struct JsonIsPredicate int location; /* token location, or -1 if unknown */ } JsonIsPredicate; +/* + * JsonBehavior - + * representation of JSON ON ... BEHAVIOR clause + */ +typedef struct JsonBehavior +{ + NodeTag type; + JsonBehaviorType btype; /* behavior type */ + Node *default_expr; /* default expression, if any */ +} JsonBehavior; + +/* + * JsonCoercion - + * coercion from SQL/JSON item types to SQL types + */ +typedef struct JsonCoercion +{ + NodeTag type; + Node *expr; /* resulting expression coerced to target type */ + bool via_populate; /* coerce result using json_populate_type()? */ + bool via_io; /* coerce result using type input function? */ + Oid collation; /* collation for coercion via I/O or populate */ +} JsonCoercion; + +/* + * JsonItemCoercions - + * expressions for coercion from SQL/JSON item types directly to the + * output SQL type + */ +typedef struct JsonItemCoercions +{ + NodeTag type; + JsonCoercion *null; + JsonCoercion *string; + JsonCoercion *numeric; + JsonCoercion *boolean; + JsonCoercion *date; + JsonCoercion *time; + JsonCoercion *timetz; + JsonCoercion *timestamp; + JsonCoercion *timestamptz; + JsonCoercion *composite; /* arrays and objects */ +} JsonItemCoercions; + +/* + * JsonExpr - + * transformed representation of JSON_VALUE(), JSON_QUERY(), JSON_EXISTS() + */ +typedef struct JsonExpr +{ + Expr xpr; + JsonExprOp op; /* json function ID */ + Node *formatted_expr; /* formatted context item expression */ + JsonCoercion *result_coercion; /* resulting coercion to RETURNING type */ + JsonFormat *format; /* context item format (JSON/JSONB) */ + Node *path_spec; /* JSON path specification expression */ + List *passing_names; /* PASSING argument names */ + List *passing_values; /* PASSING argument values */ + JsonReturning *returning; /* RETURNING clause type/format info */ + JsonBehavior *on_empty; /* ON EMPTY behavior */ + JsonBehavior *on_error; /* ON ERROR behavior */ + JsonItemCoercions *coercions; /* coercions for JSON_VALUE */ + JsonWrapper wrapper; /* WRAPPER for JSON_QUERY */ + bool omit_quotes; /* KEEP/OMIT QUOTES for JSON_QUERY */ + int location; /* token location, or -1 if unknown */ +} JsonExpr; + /* ---------------- * NullTest * diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index c0ffa516d0..5f3834ddf3 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -93,6 +93,7 @@ PG_KEYWORD("commit", COMMIT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("committed", COMMITTED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("compression", COMPRESSION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("concurrently", CONCURRENTLY, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("conditional", CONDITIONAL, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("configuration", CONFIGURATION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("conflict", CONFLICT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("connection", CONNECTION, UNRESERVED_KEYWORD, BARE_LABEL) @@ -147,11 +148,13 @@ PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("empty", EMPTY_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("encrypted", ENCRYPTED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("end", END_P, RESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("enum", ENUM_P, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("error", ERROR_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("escape", ESCAPE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("event", EVENT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("except", EXCEPT, RESERVED_KEYWORD, AS_LABEL) @@ -232,8 +235,12 @@ PG_KEYWORD("join", JOIN, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json", JSON, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("json_array", JSON_ARRAY, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_arrayagg", JSON_ARRAYAGG, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_exists", JSON_EXISTS, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_object", JSON_OBJECT, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_objectagg", JSON_OBJECTAGG, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_query", JSON_QUERY, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_value", JSON_VALUE, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("keep", KEEP, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("key", KEY, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("keys", KEYS, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("label", LABEL, UNRESERVED_KEYWORD, BARE_LABEL) @@ -299,6 +306,7 @@ PG_KEYWORD("off", OFF, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("offset", OFFSET, RESERVED_KEYWORD, AS_LABEL) PG_KEYWORD("oids", OIDS, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("old", OLD, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("omit", OMIT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("on", ON, RESERVED_KEYWORD, AS_LABEL) PG_KEYWORD("only", ONLY, RESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("operator", OPERATOR, UNRESERVED_KEYWORD, BARE_LABEL) @@ -340,6 +348,7 @@ PG_KEYWORD("procedures", PROCEDURES, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("program", PROGRAM, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("publication", PUBLICATION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("quote", QUOTE, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("quotes", QUOTES, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("range", RANGE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("read", READ, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("real", REAL, COL_NAME_KEYWORD, BARE_LABEL) @@ -410,6 +419,7 @@ PG_KEYWORD("stdout", STDOUT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("storage", STORAGE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("stored", STORED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("strict", STRICT_P, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("string", STRING, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("strip", STRIP_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("subscription", SUBSCRIPTION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("substring", SUBSTRING, COL_NAME_KEYWORD, BARE_LABEL) @@ -444,6 +454,7 @@ PG_KEYWORD("types", TYPES_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("uescape", UESCAPE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("unbounded", UNBOUNDED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("uncommitted", UNCOMMITTED, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("unconditional", UNCONDITIONAL, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("unencrypted", UNENCRYPTED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("union", UNION, RESERVED_KEYWORD, AS_LABEL) PG_KEYWORD("unique", UNIQUE, RESERVED_KEYWORD, BARE_LABEL) diff --git a/src/include/utils/formatting.h b/src/include/utils/formatting.h index 851e787bfd..0a22af80a2 100644 --- a/src/include/utils/formatting.h +++ b/src/include/utils/formatting.h @@ -17,6 +17,9 @@ #ifndef _FORMATTING_H_ #define _FORMATTING_H_ +#define DCH_DATED 0x01 +#define DCH_TIMED 0x02 +#define DCH_ZONED 0x04 extern char *str_tolower(const char *buff, size_t nbytes, Oid collid); extern char *str_toupper(const char *buff, size_t nbytes, Oid collid); @@ -29,5 +32,6 @@ extern char *asc_initcap(const char *buff, size_t nbytes); extern Datum parse_datetime(text *date_txt, text *fmt, Oid collid, bool strict, Oid *typid, int32 *typmod, int *tz, bool *have_error); +extern int datetime_format_flags(const char *fmt_str, bool *have_error); #endif diff --git a/src/include/utils/jsonb.h b/src/include/utils/jsonb.h index 6bcf35dd0a..3fdff445cf 100644 --- a/src/include/utils/jsonb.h +++ b/src/include/utils/jsonb.h @@ -407,6 +407,9 @@ extern char *JsonbToCString(StringInfo out, JsonbContainer *in, int estimated_len); extern char *JsonbToCStringIndent(StringInfo out, JsonbContainer *in, int estimated_len); +extern Jsonb *JsonbMakeEmptyArray(void); +extern Jsonb *JsonbMakeEmptyObject(void); +extern char *JsonbUnquote(Jsonb *jb); extern bool JsonbExtractScalar(JsonbContainer *jbc, JsonbValue *res); extern const char *JsonbTypeName(JsonbValue *jb); diff --git a/src/include/utils/jsonfuncs.h b/src/include/utils/jsonfuncs.h index cd16b6c0c8..62dc3d88a4 100644 --- a/src/include/utils/jsonfuncs.h +++ b/src/include/utils/jsonfuncs.h @@ -58,4 +58,8 @@ extern Jsonb *transform_jsonb_string_values(Jsonb *jsonb, void *action_state, extern text *transform_json_string_values(text *json, void *action_state, JsonTransformStringValuesAction transform_action); +extern Datum json_populate_type(Datum json_val, Oid json_type, + Oid typid, int32 typmod, + void **cache, MemoryContext mcxt, bool *isnull); + #endif diff --git a/src/include/utils/jsonpath.h b/src/include/utils/jsonpath.h index cd0b5d5b61..98a61d7f72 100644 --- a/src/include/utils/jsonpath.h +++ b/src/include/utils/jsonpath.h @@ -16,7 +16,9 @@ #include "fmgr.h" #include "nodes/pg_list.h" +#include "nodes/primnodes.h" #include "utils/jsonb.h" +#include "utils/jsonfuncs.h" typedef struct { @@ -174,6 +176,7 @@ extern bool jspGetBool(JsonPathItem *v); extern char *jspGetString(JsonPathItem *v, int32 *len); extern bool jspGetArraySubscript(JsonPathItem *v, JsonPathItem *from, JsonPathItem *to, int i); +extern bool jspIsMutable(JsonPath *path, List *varnames, List *varexprs); extern const char *jspOperationName(JsonPathItemType type); @@ -248,4 +251,34 @@ extern JsonPathParseResult *parsejsonpath(const char *str, int len); extern int jspConvertRegexFlags(uint32 xflags); +/* + * Evaluation of jsonpath + */ + +/* External variable passed into jsonpath. */ +typedef struct JsonPathVariableEvalContext +{ + char *name; + Oid typid; + int32 typmod; + struct ExprContext *econtext; + struct ExprState *estate; + Datum value; + bool isnull; + bool evaluated; +} JsonPathVariableEvalContext; + +/* SQL/JSON item */ +extern void JsonItemFromDatum(Datum val, Oid typid, int32 typmod, + JsonbValue *res); + +extern bool JsonPathExists(Datum jb, JsonPath *path, List *vars, bool *error); +extern Datum JsonPathQuery(Datum jb, JsonPath *jp, JsonWrapper wrapper, + bool *empty, bool *error, List *vars); +extern JsonbValue *JsonPathValue(Datum jb, JsonPath *jp, bool *empty, + bool *error, List *vars); + +extern int EvalJsonPathVar(void *vars, char *varName, int varNameLen, + JsonbValue *val, JsonbValue *baseObject); + #endif diff --git a/src/test/regress/expected/json_sqljson.out b/src/test/regress/expected/json_sqljson.out new file mode 100644 index 0000000000..bb62634314 --- /dev/null +++ b/src/test/regress/expected/json_sqljson.out @@ -0,0 +1,15 @@ +-- JSON_EXISTS +SELECT JSON_EXISTS(NULL FORMAT JSON, '$'); +ERROR: JSON_EXISTS() is not yet implemented for json type +LINE 1: SELECT JSON_EXISTS(NULL FORMAT JSON, '$'); + ^ +-- JSON_VALUE +SELECT JSON_VALUE(NULL FORMAT JSON, '$'); +ERROR: JSON_VALUE() is not yet implemented for json type +LINE 1: SELECT JSON_VALUE(NULL FORMAT JSON, '$'); + ^ +-- JSON_QUERY +SELECT JSON_QUERY(NULL FORMAT JSON, '$'); +ERROR: JSON_QUERY() is not yet implemented for json type +LINE 1: SELECT JSON_QUERY(NULL FORMAT JSON, '$'); + ^ diff --git a/src/test/regress/expected/jsonb_sqljson.out b/src/test/regress/expected/jsonb_sqljson.out new file mode 100644 index 0000000000..1126d7caf5 --- /dev/null +++ b/src/test/regress/expected/jsonb_sqljson.out @@ -0,0 +1,1018 @@ +-- JSON_EXISTS +SELECT JSON_EXISTS(NULL::jsonb, '$'); + json_exists +------------- + +(1 row) + +SELECT JSON_EXISTS(jsonb '[]', '$'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(JSON_OBJECT(RETURNING jsonb), '$'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '1', '$'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb 'null', '$'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '[]', '$'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '1', '$.a'); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '1', 'strict $.a'); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '1', 'strict $.a' ERROR ON ERROR); +ERROR: jsonpath member accessor can only be applied to an object +SELECT JSON_EXISTS(jsonb 'null', '$.a'); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '[]', '$.a'); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '[1, "aaa", {"a": 1}]', 'strict $.a'); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '[1, "aaa", {"a": 1}]', 'lax $.a'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '{}', '$.a'); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '{"b": 1, "a": 2}', '$.a'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '1', '$.a.b'); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '{"a": {"b": 1}}', '$.a.b'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.a.b'); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x)' PASSING 1 AS x); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x)' PASSING '1' AS x); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x && @ < $y)' PASSING 0 AS x, 2 AS y); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x && @ < $y)' PASSING 0 AS x, 1 AS y); + json_exists +------------- + f +(1 row) + +-- extension: boolean expressions +SELECT JSON_EXISTS(jsonb '1', '$ > 2'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '1', '$.a > 2' ERROR ON ERROR); + json_exists +------------- + t +(1 row) + +-- extension: RETURNING clause +SELECT JSON_EXISTS(jsonb '1', '$[0]' RETURNING bool); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '1', '$[1]' RETURNING bool); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '1', '$[0]' RETURNING int); + json_exists +------------- + 1 +(1 row) + +SELECT JSON_EXISTS(jsonb '1', '$[1]' RETURNING int); + json_exists +------------- + 0 +(1 row) + +SELECT JSON_EXISTS(jsonb '1', '$[0]' RETURNING text); + json_exists +------------- + true +(1 row) + +SELECT JSON_EXISTS(jsonb '1', '$[1]' RETURNING text); + json_exists +------------- + false +(1 row) + +SELECT JSON_EXISTS(jsonb '1', 'strict $[1]' RETURNING text FALSE ON ERROR); + json_exists +------------- + false +(1 row) + +SELECT JSON_EXISTS(jsonb '1', '$[0]' RETURNING jsonb); +ERROR: cannot cast type boolean to jsonb +LINE 1: SELECT JSON_EXISTS(jsonb '1', '$[0]' RETURNING jsonb); + ^ +SELECT JSON_EXISTS(jsonb '1', '$[0]' RETURNING float4); +ERROR: cannot cast type boolean to real +LINE 1: SELECT JSON_EXISTS(jsonb '1', '$[0]' RETURNING float4); + ^ +-- JSON_VALUE +SELECT JSON_VALUE(NULL::jsonb, '$'); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$'); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$' RETURNING int); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb 'true', '$'); + json_value +------------ + true +(1 row) + +SELECT JSON_VALUE(jsonb 'true', '$' RETURNING bool); + json_value +------------ + t +(1 row) + +SELECT JSON_VALUE(jsonb '123', '$'); + json_value +------------ + 123 +(1 row) + +SELECT JSON_VALUE(jsonb '123', '$' RETURNING int) + 234; + ?column? +---------- + 357 +(1 row) + +SELECT JSON_VALUE(jsonb '123', '$' RETURNING text); + json_value +------------ + 123 +(1 row) + +/* jsonb bytea ??? */ +SELECT JSON_VALUE(jsonb '123', '$' RETURNING bytea ERROR ON ERROR); +ERROR: SQL/JSON item cannot be cast to target type +SELECT JSON_VALUE(jsonb '1.23', '$'); + json_value +------------ + 1.23 +(1 row) + +SELECT JSON_VALUE(jsonb '1.23', '$' RETURNING int); + json_value +------------ + 1 +(1 row) + +SELECT JSON_VALUE(jsonb '"1.23"', '$' RETURNING numeric); + json_value +------------ + 1.23 +(1 row) + +SELECT JSON_VALUE(jsonb '"1.23"', '$' RETURNING int ERROR ON ERROR); +ERROR: invalid input syntax for type integer: "1.23" +SELECT JSON_VALUE(jsonb '"aaa"', '$'); + json_value +------------ + aaa +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING text); + json_value +------------ + aaa +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING char(5)); + json_value +------------ + aaa +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING char(2)); + json_value +------------ + aa +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING json); + json_value +------------ + "aaa" +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING jsonb); + json_value +------------ + "aaa" +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING json ERROR ON ERROR); + json_value +------------ + "aaa" +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING jsonb ERROR ON ERROR); + json_value +------------ + "aaa" +(1 row) + +SELECT JSON_VALUE(jsonb '"\"aaa\""', '$' RETURNING json); + json_value +------------ + "\"aaa\"" +(1 row) + +SELECT JSON_VALUE(jsonb '"\"aaa\""', '$' RETURNING jsonb); + json_value +------------ + "\"aaa\"" +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING int); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING int ERROR ON ERROR); +ERROR: invalid input syntax for type integer: "aaa" +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING int DEFAULT 111 ON ERROR); + json_value +------------ + 111 +(1 row) + +SELECT JSON_VALUE(jsonb '"123"', '$' RETURNING int) + 234; + ?column? +---------- + 357 +(1 row) + +SELECT JSON_VALUE(jsonb '"2017-02-20"', '$' RETURNING date) + 9; + ?column? +------------ + 03-01-2017 +(1 row) + +-- Test NULL checks execution in domain types +CREATE DOMAIN sqljsonb_int_not_null AS int NOT NULL; +SELECT JSON_VALUE(jsonb '1', '$.a' RETURNING sqljsonb_int_not_null); +ERROR: domain sqljsonb_int_not_null does not allow null values +SELECT JSON_VALUE(jsonb '1', '$.a' RETURNING sqljsonb_int_not_null NULL ON ERROR); +ERROR: domain sqljsonb_int_not_null does not allow null values +SELECT JSON_VALUE(jsonb '1', '$.a' RETURNING sqljsonb_int_not_null DEFAULT NULL ON ERROR); +ERROR: domain sqljsonb_int_not_null does not allow null values +SELECT JSON_VALUE(jsonb '[]', '$'); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '[]', '$' ERROR ON ERROR); +ERROR: JSON path expression in JSON_VALUE should return singleton scalar item +SELECT JSON_VALUE(jsonb '{}', '$'); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '{}', '$' ERROR ON ERROR); +ERROR: JSON path expression in JSON_VALUE should return singleton scalar item +SELECT JSON_VALUE(jsonb '1', '$.a'); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'strict $.a' ERROR ON ERROR); +ERROR: jsonpath member accessor can only be applied to an object +SELECT JSON_VALUE(jsonb '1', 'strict $.a' DEFAULT 'error' ON ERROR); + json_value +------------ + error +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'lax $.a' ERROR ON ERROR); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'lax $.a' ERROR ON EMPTY ERROR ON ERROR); +ERROR: no SQL/JSON item +SELECT JSON_VALUE(jsonb '1', 'strict $.a' DEFAULT 2 ON ERROR); + json_value +------------ + 2 +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'lax $.a' DEFAULT 2 ON ERROR); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'lax $.a' DEFAULT '2' ON ERROR); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'lax $.a' NULL ON EMPTY DEFAULT '2' ON ERROR); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'lax $.a' DEFAULT '2' ON EMPTY DEFAULT '3' ON ERROR); + json_value +------------ + 2 +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'lax $.a' ERROR ON EMPTY DEFAULT '3' ON ERROR); + json_value +------------ + 3 +(1 row) + +SELECT JSON_VALUE(jsonb '[1,2]', '$[*]' ERROR ON ERROR); +ERROR: JSON path expression in JSON_VALUE should return singleton scalar item +SELECT JSON_VALUE(jsonb '[1,2]', '$[*]' DEFAULT '0' ON ERROR); + json_value +------------ + 0 +(1 row) + +SELECT JSON_VALUE(jsonb '[" "]', '$[*]' RETURNING int ERROR ON ERROR); +ERROR: invalid input syntax for type integer: " " +SELECT JSON_VALUE(jsonb '[" "]', '$[*]' RETURNING int DEFAULT 2 + 3 ON ERROR); + json_value +------------ + 5 +(1 row) + +SELECT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING int DEFAULT 2 + 3 ON ERROR); + json_value +------------ + 1 +(1 row) + +SELECT + x, + JSON_VALUE( + jsonb '{"a": 1, "b": 2}', + '$.* ? (@ > $x)' PASSING x AS x + RETURNING int + DEFAULT -1 ON EMPTY + DEFAULT -2 ON ERROR + ) y +FROM + generate_series(0, 2) x; + x | y +---+---- + 0 | -2 + 1 | 2 + 2 | -1 +(3 rows) + +SELECT JSON_VALUE(jsonb 'null', '$a' PASSING point ' (1, 2 )' AS a); + json_value +------------ + (1,2) +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$a' PASSING point ' (1, 2 )' AS a RETURNING point); + json_value +------------ + (1,2) +(1 row) + +-- Test timestamptz passing and output +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts); + json_value +------------------------------ + Tue Feb 20 18:34:56 2018 PST +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING timestamptz); + json_value +------------------------------ + Tue Feb 20 18:34:56 2018 PST +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING timestamp); + json_value +-------------------------- + Tue Feb 20 18:34:56 2018 +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING json); + json_value +----------------------------- + "2018-02-21T02:34:56+00:00" +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING jsonb); + json_value +----------------------------- + "2018-02-21T02:34:56+00:00" +(1 row) + +-- JSON_QUERY +SELECT + JSON_QUERY(js, '$'), + JSON_QUERY(js, '$' WITHOUT WRAPPER), + JSON_QUERY(js, '$' WITH CONDITIONAL WRAPPER), + JSON_QUERY(js, '$' WITH UNCONDITIONAL ARRAY WRAPPER), + JSON_QUERY(js, '$' WITH ARRAY WRAPPER) +FROM + (VALUES + (jsonb 'null'), + ('12.3'), + ('true'), + ('"aaa"'), + ('[1, null, "2"]'), + ('{"a": 1, "b": [2]}') + ) foo(js); + json_query | json_query | json_query | json_query | json_query +--------------------+--------------------+--------------------+----------------------+---------------------- + null | null | [null] | [null] | [null] + 12.3 | 12.3 | [12.3] | [12.3] | [12.3] + true | true | [true] | [true] | [true] + "aaa" | "aaa" | ["aaa"] | ["aaa"] | ["aaa"] + [1, null, "2"] | [1, null, "2"] | [1, null, "2"] | [[1, null, "2"]] | [[1, null, "2"]] + {"a": 1, "b": [2]} | {"a": 1, "b": [2]} | {"a": 1, "b": [2]} | [{"a": 1, "b": [2]}] | [{"a": 1, "b": [2]}] +(6 rows) + +SELECT + JSON_QUERY(js, 'strict $[*]') AS "unspec", + JSON_QUERY(js, 'strict $[*]' WITHOUT WRAPPER) AS "without", + JSON_QUERY(js, 'strict $[*]' WITH CONDITIONAL WRAPPER) AS "with cond", + JSON_QUERY(js, 'strict $[*]' WITH UNCONDITIONAL ARRAY WRAPPER) AS "with uncond", + JSON_QUERY(js, 'strict $[*]' WITH ARRAY WRAPPER) AS "with" +FROM + (VALUES + (jsonb '1'), + ('[]'), + ('[null]'), + ('[12.3]'), + ('[true]'), + ('["aaa"]'), + ('[[1, 2, 3]]'), + ('[{"a": 1, "b": [2]}]'), + ('[1, "2", null, [3]]') + ) foo(js); + unspec | without | with cond | with uncond | with +--------------------+--------------------+---------------------+----------------------+---------------------- + | | | | + | | | | + null | null | [null] | [null] | [null] + 12.3 | 12.3 | [12.3] | [12.3] | [12.3] + true | true | [true] | [true] | [true] + "aaa" | "aaa" | ["aaa"] | ["aaa"] | ["aaa"] + [1, 2, 3] | [1, 2, 3] | [1, 2, 3] | [[1, 2, 3]] | [[1, 2, 3]] + {"a": 1, "b": [2]} | {"a": 1, "b": [2]} | {"a": 1, "b": [2]} | [{"a": 1, "b": [2]}] | [{"a": 1, "b": [2]}] + | | [1, "2", null, [3]] | [1, "2", null, [3]] | [1, "2", null, [3]] +(9 rows) + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text); + json_query +------------ + "aaa" +(1 row) + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text KEEP QUOTES); + json_query +------------ + "aaa" +(1 row) + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text KEEP QUOTES ON SCALAR STRING); + json_query +------------ + "aaa" +(1 row) + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text OMIT QUOTES); + json_query +------------ + aaa +(1 row) + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text OMIT QUOTES ON SCALAR STRING); + json_query +------------ + aaa +(1 row) + +SELECT JSON_QUERY(jsonb '"aaa"', '$' OMIT QUOTES ERROR ON ERROR); +ERROR: invalid input syntax for type json +DETAIL: Token "aaa" is invalid. +CONTEXT: JSON data, line 1: aaa +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING json OMIT QUOTES ERROR ON ERROR); +ERROR: invalid input syntax for type json +DETAIL: Token "aaa" is invalid. +CONTEXT: JSON data, line 1: aaa +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING bytea FORMAT JSON OMIT QUOTES ERROR ON ERROR); + json_query +------------ + \x616161 +(1 row) + +-- QUOTES behavior should not be specified when WITH WRAPPER used: +-- Should fail +SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER OMIT QUOTES); +ERROR: SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used +LINE 1: SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER OMIT QUOTES)... + ^ +SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER KEEP QUOTES); +ERROR: SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used +LINE 1: SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER KEEP QUOTES)... + ^ +SELECT JSON_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER KEEP QUOTES); +ERROR: SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used +LINE 1: ...N_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER KEEP QUOTE... + ^ +SELECT JSON_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER OMIT QUOTES); +ERROR: SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used +LINE 1: ...N_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER OMIT QUOTE... + ^ +-- Should succeed +SELECT JSON_QUERY(jsonb '[1]', '$' WITHOUT WRAPPER OMIT QUOTES); + json_query +------------ + [1] +(1 row) + +SELECT JSON_QUERY(jsonb '[1]', '$' WITHOUT WRAPPER KEEP QUOTES); + json_query +------------ + [1] +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]'); + json_query +------------ + +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' NULL ON EMPTY); + json_query +------------ + +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' EMPTY ON EMPTY); + json_query +------------ + [] +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' EMPTY ARRAY ON EMPTY); + json_query +------------ + [] +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' EMPTY OBJECT ON EMPTY); + json_query +------------ + {} +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY); + json_query +------------ + +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' DEFAULT '"empty"' ON EMPTY); + json_query +------------ + "empty" +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY NULL ON ERROR); + json_query +------------ + +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY EMPTY ARRAY ON ERROR); + json_query +------------ + [] +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY EMPTY OBJECT ON ERROR); + json_query +------------ + {} +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY ERROR ON ERROR); +ERROR: no SQL/JSON item +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON ERROR); + json_query +------------ + +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' ERROR ON ERROR); +ERROR: JSON path expression in JSON_QUERY should return singleton item without wrapper +HINT: use WITH WRAPPER clause to wrap SQL/JSON item sequence into array +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' DEFAULT '"empty"' ON ERROR); + json_query +------------ + "empty" +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING json); + json_query +------------ + [1, 2] +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING json FORMAT JSON); + json_query +------------ + [1, 2] +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING jsonb); + json_query +------------ + [1, 2] +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING jsonb FORMAT JSON); + json_query +------------ + [1, 2] +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING text); + json_query +------------ + [1, 2] +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING char(10)); + json_query +------------ + [1, 2] +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING char(3)); + json_query +------------ + [1, +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING text FORMAT JSON); + json_query +------------ + [1, 2] +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING bytea); + json_query +---------------- + \x5b312c20325d +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING bytea FORMAT JSON); + json_query +---------------- + \x5b312c20325d +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING bytea EMPTY OBJECT ON ERROR); + json_query +------------ + \x7b7d +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING bytea FORMAT JSON EMPTY OBJECT ON ERROR); + json_query +------------ + \x7b7d +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING json EMPTY OBJECT ON ERROR); + json_query +------------ + {} +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING jsonb EMPTY OBJECT ON ERROR); + json_query +------------ + {} +(1 row) + +SELECT + x, y, + JSON_QUERY( + jsonb '[1,2,3,4,5,null]', + '$[*] ? (@ >= $x && @ <= $y)' + PASSING x AS x, y AS y + WITH CONDITIONAL WRAPPER + EMPTY ARRAY ON EMPTY + ) list +FROM + generate_series(0, 4) x, + generate_series(0, 4) y; + x | y | list +---+---+-------------- + 0 | 0 | [] + 0 | 1 | [1] + 0 | 2 | [1, 2] + 0 | 3 | [1, 2, 3] + 0 | 4 | [1, 2, 3, 4] + 1 | 0 | [] + 1 | 1 | [1] + 1 | 2 | [1, 2] + 1 | 3 | [1, 2, 3] + 1 | 4 | [1, 2, 3, 4] + 2 | 0 | [] + 2 | 1 | [] + 2 | 2 | [2] + 2 | 3 | [2, 3] + 2 | 4 | [2, 3, 4] + 3 | 0 | [] + 3 | 1 | [] + 3 | 2 | [] + 3 | 3 | [3] + 3 | 4 | [3, 4] + 4 | 0 | [] + 4 | 1 | [] + 4 | 2 | [] + 4 | 3 | [] + 4 | 4 | [4] +(25 rows) + +-- Extension: record types returning +CREATE TYPE sqljsonb_rec AS (a int, t text, js json, jb jsonb, jsa json[]); +CREATE TYPE sqljsonb_reca AS (reca sqljsonb_rec[]); +SELECT JSON_QUERY(jsonb '[{"a": 1, "b": "foo", "t": "aaa", "js": [1, "2", {}], "jb": {"x": [1, "2", {}]}}, {"a": 2}]', '$[0]' RETURNING sqljsonb_rec); + json_query +----------------------------------------------------- + (1,aaa,"[1, ""2"", {}]","{""x"": [1, ""2"", {}]}",) +(1 row) + +SELECT * FROM unnest((JSON_QUERY(jsonb '{"jsa": [{"a": 1, "b": ["foo"]}, {"a": 2, "c": {}}, 123]}', '$' RETURNING sqljsonb_rec)).jsa); + unnest +------------------------ + {"a": 1, "b": ["foo"]} + {"a": 2, "c": {}} + 123 +(3 rows) + +SELECT * FROM unnest((JSON_QUERY(jsonb '{"reca": [{"a": 1, "t": ["foo", []]}, {"a": 2, "jb": [{}, true]}]}', '$' RETURNING sqljsonb_reca)).reca); + a | t | js | jb | jsa +---+-------------+----+------------+----- + 1 | ["foo", []] | | | + 2 | | | [{}, true] | +(2 rows) + +-- Extension: array types returning +SELECT JSON_QUERY(jsonb '[1,2,null,"3"]', '$[*]' RETURNING int[] WITH WRAPPER); + json_query +-------------- + {1,2,NULL,3} +(1 row) + +SELECT * FROM unnest(JSON_QUERY(jsonb '[{"a": 1, "t": ["foo", []]}, {"a": 2, "jb": [{}, true]}]', '$' RETURNING sqljsonb_rec[])); + a | t | js | jb | jsa +---+-------------+----+------------+----- + 1 | ["foo", []] | | | + 2 | | | [{}, true] | +(2 rows) + +-- Extension: domain types returning +SELECT JSON_QUERY(jsonb '{"a": 1}', '$.a' RETURNING sqljsonb_int_not_null); + json_query +------------ + 1 +(1 row) + +SELECT JSON_QUERY(jsonb '{"a": 1}', '$.b' RETURNING sqljsonb_int_not_null); +ERROR: domain sqljsonb_int_not_null does not allow null values +-- Test timestamptz passing and output +SELECT JSON_QUERY(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts); + json_query +----------------------------- + "2018-02-21T02:34:56+00:00" +(1 row) + +SELECT JSON_QUERY(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING json); + json_query +----------------------------- + "2018-02-21T02:34:56+00:00" +(1 row) + +SELECT JSON_QUERY(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING jsonb); + json_query +----------------------------- + "2018-02-21T02:34:56+00:00" +(1 row) + +-- Test constraints +CREATE TABLE test_jsonb_constraints ( + js text, + i int, + x jsonb DEFAULT JSON_QUERY(jsonb '[1,2]', '$[*]' WITH WRAPPER) + CONSTRAINT test_jsonb_constraint1 + CHECK (js IS JSON) + CONSTRAINT test_jsonb_constraint2 + CHECK (JSON_EXISTS(js::jsonb, '$.a' PASSING i + 5 AS int, i::text AS txt, array[1,2,3] as arr)) + CONSTRAINT test_jsonb_constraint3 + CHECK (JSON_VALUE(js::jsonb, '$.a' RETURNING int DEFAULT ('12' || i)::int ON EMPTY ERROR ON ERROR) > i) + CONSTRAINT test_jsonb_constraint4 + CHECK (JSON_QUERY(js::jsonb, '$.a' WITH CONDITIONAL WRAPPER EMPTY OBJECT ON ERROR) < jsonb '[10]') + CONSTRAINT test_jsonb_constraint5 + CHECK (JSON_QUERY(js::jsonb, '$.a' RETURNING char(5) OMIT QUOTES EMPTY ARRAY ON EMPTY) > 'a' COLLATE "C") + CONSTRAINT test_jsonb_constraint6 + CHECK (JSON_EXISTS(js::jsonb, 'strict $.a' RETURNING int TRUE ON ERROR) < 2) +); +\d test_jsonb_constraints + Table "public.test_jsonb_constraints" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+-------------------------------------------------------------------------------- + js | text | | | + i | integer | | | + x | jsonb | | | JSON_QUERY('[1, 2]'::jsonb, '$[*]' RETURNING jsonb WITH UNCONDITIONAL WRAPPER) +Check constraints: + "test_jsonb_constraint1" CHECK (js IS JSON) + "test_jsonb_constraint2" CHECK (JSON_EXISTS(js::jsonb, '$."a"' PASSING i + 5 AS int, i::text AS txt, ARRAY[1, 2, 3] AS arr)) + "test_jsonb_constraint3" CHECK (JSON_VALUE(js::jsonb, '$."a"' RETURNING integer DEFAULT ('12'::text || i)::integer ON EMPTY ERROR ON ERROR) > i) + "test_jsonb_constraint4" CHECK (JSON_QUERY(js::jsonb, '$."a"' RETURNING jsonb WITH CONDITIONAL WRAPPER EMPTY OBJECT ON ERROR) < '[10]'::jsonb) + "test_jsonb_constraint5" CHECK (JSON_QUERY(js::jsonb, '$."a"' RETURNING character(5) OMIT QUOTES EMPTY ARRAY ON EMPTY) > ('a'::bpchar COLLATE "C")) + "test_jsonb_constraint6" CHECK (JSON_EXISTS(js::jsonb, 'strict $."a"' RETURNING integer TRUE ON ERROR) < 2) + +SELECT check_clause +FROM information_schema.check_constraints +WHERE constraint_name LIKE 'test_jsonb_constraint%'; + check_clause +-------------------------------------------------------------------------------------------------------------------------- + ((js IS JSON)) + (JSON_EXISTS((js)::jsonb, '$."a"' PASSING (i + 5) AS int, (i)::text AS txt, ARRAY[1, 2, 3] AS arr)) + ((JSON_VALUE((js)::jsonb, '$."a"' RETURNING integer DEFAULT (('12'::text || i))::integer ON EMPTY ERROR ON ERROR) > i)) + ((JSON_QUERY((js)::jsonb, '$."a"' RETURNING jsonb WITH CONDITIONAL WRAPPER EMPTY OBJECT ON ERROR) < '[10]'::jsonb)) + ((JSON_QUERY((js)::jsonb, '$."a"' RETURNING character(5) OMIT QUOTES EMPTY ARRAY ON EMPTY) > ('a'::bpchar COLLATE "C"))) + ((JSON_EXISTS((js)::jsonb, 'strict $."a"' RETURNING integer TRUE ON ERROR) < 2)) +(6 rows) + +SELECT pg_get_expr(adbin, adrelid) FROM pg_attrdef WHERE adrelid = 'test_jsonb_constraints'::regclass; + pg_get_expr +-------------------------------------------------------------------------------- + JSON_QUERY('[1, 2]'::jsonb, '$[*]' RETURNING jsonb WITH UNCONDITIONAL WRAPPER) +(1 row) + +INSERT INTO test_jsonb_constraints VALUES ('', 1); +ERROR: new row for relation "test_jsonb_constraints" violates check constraint "test_jsonb_constraint1" +DETAIL: Failing row contains (, 1, [1, 2]). +INSERT INTO test_jsonb_constraints VALUES ('1', 1); +ERROR: new row for relation "test_jsonb_constraints" violates check constraint "test_jsonb_constraint2" +DETAIL: Failing row contains (1, 1, [1, 2]). +INSERT INTO test_jsonb_constraints VALUES ('[]'); +ERROR: new row for relation "test_jsonb_constraints" violates check constraint "test_jsonb_constraint2" +DETAIL: Failing row contains ([], null, [1, 2]). +INSERT INTO test_jsonb_constraints VALUES ('{"b": 1}', 1); +ERROR: new row for relation "test_jsonb_constraints" violates check constraint "test_jsonb_constraint2" +DETAIL: Failing row contains ({"b": 1}, 1, [1, 2]). +INSERT INTO test_jsonb_constraints VALUES ('{"a": 1}', 1); +ERROR: new row for relation "test_jsonb_constraints" violates check constraint "test_jsonb_constraint3" +DETAIL: Failing row contains ({"a": 1}, 1, [1, 2]). +INSERT INTO test_jsonb_constraints VALUES ('{"a": 7}', 1); +ERROR: new row for relation "test_jsonb_constraints" violates check constraint "test_jsonb_constraint5" +DETAIL: Failing row contains ({"a": 7}, 1, [1, 2]). +INSERT INTO test_jsonb_constraints VALUES ('{"a": 10}', 1); +ERROR: new row for relation "test_jsonb_constraints" violates check constraint "test_jsonb_constraint4" +DETAIL: Failing row contains ({"a": 10}, 1, [1, 2]). +DROP TABLE test_jsonb_constraints; +-- Test mutabilily od query functions +CREATE TABLE test_jsonb_mutability(js jsonb); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a[0]')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime()')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@ < $.datetime())')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime() < $.datetime())')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime() < $.datetime("HH:MI TZH"))')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime("HH:MI TZH") < $.datetime("HH:MI TZH"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime("HH:MI") < $.datetime("YY-MM-DD HH:MI"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime("HH:MI TZH") < $.datetime("YY-MM-DD HH:MI"))')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime("HH:MI TZH") < $x' PASSING '12:34'::timetz AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime("HH:MI TZH") < $y' PASSING '12:34'::timetz AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime() < $x' PASSING '12:34'::timetz AS x)); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime() < $x' PASSING '1234'::int AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime() ? (@ == $x)' PASSING '12:34'::time AS x)); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime("YY-MM-DD") ? (@ == $x)' PASSING '2020-07-14'::date AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, $.a ? (@.datetime() == $x)]' PASSING '12:34'::time AS x)); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, 0 to $.a ? (@.datetime() == $x)]' PASSING '12:34'::time AS x)); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, $.a ? (@.datetime("HH:MI") == $x)]' PASSING '12:34'::time AS x)); +DROP TABLE test_jsonb_mutability; diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 58fab1de1a..5030d19c03 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -111,7 +111,7 @@ test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combo # ---------- # Another group of parallel tests (JSON related) # ---------- -test: json jsonb json_encoding jsonpath jsonpath_encoding jsonb_jsonpath sqljson +test: json jsonb json_encoding jsonpath jsonpath_encoding jsonb_jsonpath sqljson json_sqljson jsonb_sqljson # ---------- # Another group of parallel tests diff --git a/src/test/regress/sql/json_sqljson.sql b/src/test/regress/sql/json_sqljson.sql new file mode 100644 index 0000000000..4f30fa46b9 --- /dev/null +++ b/src/test/regress/sql/json_sqljson.sql @@ -0,0 +1,11 @@ +-- JSON_EXISTS + +SELECT JSON_EXISTS(NULL FORMAT JSON, '$'); + +-- JSON_VALUE + +SELECT JSON_VALUE(NULL FORMAT JSON, '$'); + +-- JSON_QUERY + +SELECT JSON_QUERY(NULL FORMAT JSON, '$'); diff --git a/src/test/regress/sql/jsonb_sqljson.sql b/src/test/regress/sql/jsonb_sqljson.sql new file mode 100644 index 0000000000..00a067a06a --- /dev/null +++ b/src/test/regress/sql/jsonb_sqljson.sql @@ -0,0 +1,317 @@ +-- JSON_EXISTS + +SELECT JSON_EXISTS(NULL::jsonb, '$'); + +SELECT JSON_EXISTS(jsonb '[]', '$'); +SELECT JSON_EXISTS(JSON_OBJECT(RETURNING jsonb), '$'); + +SELECT JSON_EXISTS(jsonb '1', '$'); +SELECT JSON_EXISTS(jsonb 'null', '$'); +SELECT JSON_EXISTS(jsonb '[]', '$'); + +SELECT JSON_EXISTS(jsonb '1', '$.a'); +SELECT JSON_EXISTS(jsonb '1', 'strict $.a'); +SELECT JSON_EXISTS(jsonb '1', 'strict $.a' ERROR ON ERROR); +SELECT JSON_EXISTS(jsonb 'null', '$.a'); +SELECT JSON_EXISTS(jsonb '[]', '$.a'); +SELECT JSON_EXISTS(jsonb '[1, "aaa", {"a": 1}]', 'strict $.a'); +SELECT JSON_EXISTS(jsonb '[1, "aaa", {"a": 1}]', 'lax $.a'); +SELECT JSON_EXISTS(jsonb '{}', '$.a'); +SELECT JSON_EXISTS(jsonb '{"b": 1, "a": 2}', '$.a'); + +SELECT JSON_EXISTS(jsonb '1', '$.a.b'); +SELECT JSON_EXISTS(jsonb '{"a": {"b": 1}}', '$.a.b'); +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.a.b'); + +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x)' PASSING 1 AS x); +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x)' PASSING '1' AS x); +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x && @ < $y)' PASSING 0 AS x, 2 AS y); +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x && @ < $y)' PASSING 0 AS x, 1 AS y); + +-- extension: boolean expressions +SELECT JSON_EXISTS(jsonb '1', '$ > 2'); +SELECT JSON_EXISTS(jsonb '1', '$.a > 2' ERROR ON ERROR); + +-- extension: RETURNING clause +SELECT JSON_EXISTS(jsonb '1', '$[0]' RETURNING bool); +SELECT JSON_EXISTS(jsonb '1', '$[1]' RETURNING bool); +SELECT JSON_EXISTS(jsonb '1', '$[0]' RETURNING int); +SELECT JSON_EXISTS(jsonb '1', '$[1]' RETURNING int); +SELECT JSON_EXISTS(jsonb '1', '$[0]' RETURNING text); +SELECT JSON_EXISTS(jsonb '1', '$[1]' RETURNING text); +SELECT JSON_EXISTS(jsonb '1', 'strict $[1]' RETURNING text FALSE ON ERROR); +SELECT JSON_EXISTS(jsonb '1', '$[0]' RETURNING jsonb); +SELECT JSON_EXISTS(jsonb '1', '$[0]' RETURNING float4); + + +-- JSON_VALUE + +SELECT JSON_VALUE(NULL::jsonb, '$'); + +SELECT JSON_VALUE(jsonb 'null', '$'); +SELECT JSON_VALUE(jsonb 'null', '$' RETURNING int); + +SELECT JSON_VALUE(jsonb 'true', '$'); +SELECT JSON_VALUE(jsonb 'true', '$' RETURNING bool); + +SELECT JSON_VALUE(jsonb '123', '$'); +SELECT JSON_VALUE(jsonb '123', '$' RETURNING int) + 234; +SELECT JSON_VALUE(jsonb '123', '$' RETURNING text); +/* jsonb bytea ??? */ +SELECT JSON_VALUE(jsonb '123', '$' RETURNING bytea ERROR ON ERROR); + +SELECT JSON_VALUE(jsonb '1.23', '$'); +SELECT JSON_VALUE(jsonb '1.23', '$' RETURNING int); +SELECT JSON_VALUE(jsonb '"1.23"', '$' RETURNING numeric); +SELECT JSON_VALUE(jsonb '"1.23"', '$' RETURNING int ERROR ON ERROR); + +SELECT JSON_VALUE(jsonb '"aaa"', '$'); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING text); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING char(5)); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING char(2)); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING json); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING jsonb); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING json ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING jsonb ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '"\"aaa\""', '$' RETURNING json); +SELECT JSON_VALUE(jsonb '"\"aaa\""', '$' RETURNING jsonb); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING int); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING int ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING int DEFAULT 111 ON ERROR); +SELECT JSON_VALUE(jsonb '"123"', '$' RETURNING int) + 234; + +SELECT JSON_VALUE(jsonb '"2017-02-20"', '$' RETURNING date) + 9; + +-- Test NULL checks execution in domain types +CREATE DOMAIN sqljsonb_int_not_null AS int NOT NULL; +SELECT JSON_VALUE(jsonb '1', '$.a' RETURNING sqljsonb_int_not_null); +SELECT JSON_VALUE(jsonb '1', '$.a' RETURNING sqljsonb_int_not_null NULL ON ERROR); +SELECT JSON_VALUE(jsonb '1', '$.a' RETURNING sqljsonb_int_not_null DEFAULT NULL ON ERROR); + +SELECT JSON_VALUE(jsonb '[]', '$'); +SELECT JSON_VALUE(jsonb '[]', '$' ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '{}', '$'); +SELECT JSON_VALUE(jsonb '{}', '$' ERROR ON ERROR); + +SELECT JSON_VALUE(jsonb '1', '$.a'); +SELECT JSON_VALUE(jsonb '1', 'strict $.a' ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'strict $.a' DEFAULT 'error' ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'lax $.a' ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'lax $.a' ERROR ON EMPTY ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'strict $.a' DEFAULT 2 ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'lax $.a' DEFAULT 2 ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'lax $.a' DEFAULT '2' ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'lax $.a' NULL ON EMPTY DEFAULT '2' ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'lax $.a' DEFAULT '2' ON EMPTY DEFAULT '3' ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'lax $.a' ERROR ON EMPTY DEFAULT '3' ON ERROR); + +SELECT JSON_VALUE(jsonb '[1,2]', '$[*]' ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '[1,2]', '$[*]' DEFAULT '0' ON ERROR); +SELECT JSON_VALUE(jsonb '[" "]', '$[*]' RETURNING int ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '[" "]', '$[*]' RETURNING int DEFAULT 2 + 3 ON ERROR); +SELECT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING int DEFAULT 2 + 3 ON ERROR); + +SELECT + x, + JSON_VALUE( + jsonb '{"a": 1, "b": 2}', + '$.* ? (@ > $x)' PASSING x AS x + RETURNING int + DEFAULT -1 ON EMPTY + DEFAULT -2 ON ERROR + ) y +FROM + generate_series(0, 2) x; + +SELECT JSON_VALUE(jsonb 'null', '$a' PASSING point ' (1, 2 )' AS a); +SELECT JSON_VALUE(jsonb 'null', '$a' PASSING point ' (1, 2 )' AS a RETURNING point); + +-- Test timestamptz passing and output +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts); +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING timestamptz); +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING timestamp); +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING json); +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING jsonb); + +-- JSON_QUERY + +SELECT + JSON_QUERY(js, '$'), + JSON_QUERY(js, '$' WITHOUT WRAPPER), + JSON_QUERY(js, '$' WITH CONDITIONAL WRAPPER), + JSON_QUERY(js, '$' WITH UNCONDITIONAL ARRAY WRAPPER), + JSON_QUERY(js, '$' WITH ARRAY WRAPPER) +FROM + (VALUES + (jsonb 'null'), + ('12.3'), + ('true'), + ('"aaa"'), + ('[1, null, "2"]'), + ('{"a": 1, "b": [2]}') + ) foo(js); + +SELECT + JSON_QUERY(js, 'strict $[*]') AS "unspec", + JSON_QUERY(js, 'strict $[*]' WITHOUT WRAPPER) AS "without", + JSON_QUERY(js, 'strict $[*]' WITH CONDITIONAL WRAPPER) AS "with cond", + JSON_QUERY(js, 'strict $[*]' WITH UNCONDITIONAL ARRAY WRAPPER) AS "with uncond", + JSON_QUERY(js, 'strict $[*]' WITH ARRAY WRAPPER) AS "with" +FROM + (VALUES + (jsonb '1'), + ('[]'), + ('[null]'), + ('[12.3]'), + ('[true]'), + ('["aaa"]'), + ('[[1, 2, 3]]'), + ('[{"a": 1, "b": [2]}]'), + ('[1, "2", null, [3]]') + ) foo(js); + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text); +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text KEEP QUOTES); +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text KEEP QUOTES ON SCALAR STRING); +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text OMIT QUOTES); +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text OMIT QUOTES ON SCALAR STRING); +SELECT JSON_QUERY(jsonb '"aaa"', '$' OMIT QUOTES ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING json OMIT QUOTES ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING bytea FORMAT JSON OMIT QUOTES ERROR ON ERROR); + +-- QUOTES behavior should not be specified when WITH WRAPPER used: +-- Should fail +SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER OMIT QUOTES); +SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER KEEP QUOTES); +SELECT JSON_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER KEEP QUOTES); +SELECT JSON_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER OMIT QUOTES); +-- Should succeed +SELECT JSON_QUERY(jsonb '[1]', '$' WITHOUT WRAPPER OMIT QUOTES); +SELECT JSON_QUERY(jsonb '[1]', '$' WITHOUT WRAPPER KEEP QUOTES); + +SELECT JSON_QUERY(jsonb '[]', '$[*]'); +SELECT JSON_QUERY(jsonb '[]', '$[*]' NULL ON EMPTY); +SELECT JSON_QUERY(jsonb '[]', '$[*]' EMPTY ON EMPTY); +SELECT JSON_QUERY(jsonb '[]', '$[*]' EMPTY ARRAY ON EMPTY); +SELECT JSON_QUERY(jsonb '[]', '$[*]' EMPTY OBJECT ON EMPTY); +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY); +SELECT JSON_QUERY(jsonb '[]', '$[*]' DEFAULT '"empty"' ON EMPTY); + +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY NULL ON ERROR); +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY EMPTY ARRAY ON ERROR); +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY EMPTY OBJECT ON ERROR); +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON ERROR); + +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' DEFAULT '"empty"' ON ERROR); + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING json); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING json FORMAT JSON); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING jsonb); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING jsonb FORMAT JSON); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING text); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING char(10)); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING char(3)); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING text FORMAT JSON); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING bytea); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING bytea FORMAT JSON); + +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING bytea EMPTY OBJECT ON ERROR); +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING bytea FORMAT JSON EMPTY OBJECT ON ERROR); +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING json EMPTY OBJECT ON ERROR); +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING jsonb EMPTY OBJECT ON ERROR); + +SELECT + x, y, + JSON_QUERY( + jsonb '[1,2,3,4,5,null]', + '$[*] ? (@ >= $x && @ <= $y)' + PASSING x AS x, y AS y + WITH CONDITIONAL WRAPPER + EMPTY ARRAY ON EMPTY + ) list +FROM + generate_series(0, 4) x, + generate_series(0, 4) y; + +-- Extension: record types returning +CREATE TYPE sqljsonb_rec AS (a int, t text, js json, jb jsonb, jsa json[]); +CREATE TYPE sqljsonb_reca AS (reca sqljsonb_rec[]); + +SELECT JSON_QUERY(jsonb '[{"a": 1, "b": "foo", "t": "aaa", "js": [1, "2", {}], "jb": {"x": [1, "2", {}]}}, {"a": 2}]', '$[0]' RETURNING sqljsonb_rec); +SELECT * FROM unnest((JSON_QUERY(jsonb '{"jsa": [{"a": 1, "b": ["foo"]}, {"a": 2, "c": {}}, 123]}', '$' RETURNING sqljsonb_rec)).jsa); +SELECT * FROM unnest((JSON_QUERY(jsonb '{"reca": [{"a": 1, "t": ["foo", []]}, {"a": 2, "jb": [{}, true]}]}', '$' RETURNING sqljsonb_reca)).reca); + +-- Extension: array types returning +SELECT JSON_QUERY(jsonb '[1,2,null,"3"]', '$[*]' RETURNING int[] WITH WRAPPER); +SELECT * FROM unnest(JSON_QUERY(jsonb '[{"a": 1, "t": ["foo", []]}, {"a": 2, "jb": [{}, true]}]', '$' RETURNING sqljsonb_rec[])); + +-- Extension: domain types returning +SELECT JSON_QUERY(jsonb '{"a": 1}', '$.a' RETURNING sqljsonb_int_not_null); +SELECT JSON_QUERY(jsonb '{"a": 1}', '$.b' RETURNING sqljsonb_int_not_null); + +-- Test timestamptz passing and output +SELECT JSON_QUERY(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts); +SELECT JSON_QUERY(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING json); +SELECT JSON_QUERY(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING jsonb); + +-- Test constraints + +CREATE TABLE test_jsonb_constraints ( + js text, + i int, + x jsonb DEFAULT JSON_QUERY(jsonb '[1,2]', '$[*]' WITH WRAPPER) + CONSTRAINT test_jsonb_constraint1 + CHECK (js IS JSON) + CONSTRAINT test_jsonb_constraint2 + CHECK (JSON_EXISTS(js::jsonb, '$.a' PASSING i + 5 AS int, i::text AS txt, array[1,2,3] as arr)) + CONSTRAINT test_jsonb_constraint3 + CHECK (JSON_VALUE(js::jsonb, '$.a' RETURNING int DEFAULT ('12' || i)::int ON EMPTY ERROR ON ERROR) > i) + CONSTRAINT test_jsonb_constraint4 + CHECK (JSON_QUERY(js::jsonb, '$.a' WITH CONDITIONAL WRAPPER EMPTY OBJECT ON ERROR) < jsonb '[10]') + CONSTRAINT test_jsonb_constraint5 + CHECK (JSON_QUERY(js::jsonb, '$.a' RETURNING char(5) OMIT QUOTES EMPTY ARRAY ON EMPTY) > 'a' COLLATE "C") + CONSTRAINT test_jsonb_constraint6 + CHECK (JSON_EXISTS(js::jsonb, 'strict $.a' RETURNING int TRUE ON ERROR) < 2) +); + +\d test_jsonb_constraints + +SELECT check_clause +FROM information_schema.check_constraints +WHERE constraint_name LIKE 'test_jsonb_constraint%'; + +SELECT pg_get_expr(adbin, adrelid) FROM pg_attrdef WHERE adrelid = 'test_jsonb_constraints'::regclass; + +INSERT INTO test_jsonb_constraints VALUES ('', 1); +INSERT INTO test_jsonb_constraints VALUES ('1', 1); +INSERT INTO test_jsonb_constraints VALUES ('[]'); +INSERT INTO test_jsonb_constraints VALUES ('{"b": 1}', 1); +INSERT INTO test_jsonb_constraints VALUES ('{"a": 1}', 1); +INSERT INTO test_jsonb_constraints VALUES ('{"a": 7}', 1); +INSERT INTO test_jsonb_constraints VALUES ('{"a": 10}', 1); + +DROP TABLE test_jsonb_constraints; + +-- Test mutabilily od query functions +CREATE TABLE test_jsonb_mutability(js jsonb); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a[0]')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime()')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@ < $.datetime())')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime() < $.datetime())')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime() < $.datetime("HH:MI TZH"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime("HH:MI TZH") < $.datetime("HH:MI TZH"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime("HH:MI") < $.datetime("YY-MM-DD HH:MI"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime("HH:MI TZH") < $.datetime("YY-MM-DD HH:MI"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime("HH:MI TZH") < $x' PASSING '12:34'::timetz AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime("HH:MI TZH") < $y' PASSING '12:34'::timetz AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime() < $x' PASSING '12:34'::timetz AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime() < $x' PASSING '1234'::int AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime() ? (@ == $x)' PASSING '12:34'::time AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime("YY-MM-DD") ? (@ == $x)' PASSING '2020-07-14'::date AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, $.a ? (@.datetime() == $x)]' PASSING '12:34'::time AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, 0 to $.a ? (@.datetime() == $x)]' PASSING '12:34'::time AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, $.a ? (@.datetime("HH:MI") == $x)]' PASSING '12:34'::time AS x)); +DROP TABLE test_jsonb_mutability; From ad4f2c47de440cdd5d58cf9ffea09afa0da04d6c Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 29 Mar 2022 16:29:49 -0400 Subject: [PATCH 300/772] Make PostgreSQL::Test::Cluster::run_log() return a useful value. Curently, some TAP test that directly call the underlying function PostgreSQL::Test::Utils::run_log() care about the return value, but none of those that call it via PostgreSQL::Test::Cluster::run_log() care. However, I'd like to add a test that will care, so adjust this function to return whatever it gets back from the underlying function, just as we do for a number of other functions in this module. Discussion: http://postgr.es/m/CA+Tgmobj6u-nWF-j=FemygUhobhryLxf9h-wJN7W-2rSsseHNA@mail.gmail.com --- src/test/perl/PostgreSQL/Test/Cluster.pm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index bee6aacf47..b6e3351611 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -2502,8 +2502,7 @@ sub run_log local %ENV = $self->_get_env(); - PostgreSQL::Test::Utils::run_log(@_); - return; + return PostgreSQL::Test::Utils::run_log(@_); } =pod From d5a9d86d8ffcadc52ff3729cd00fbd83bc38643c Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Wed, 30 Mar 2022 07:41:05 +0530 Subject: [PATCH 301/772] Skip empty transactions for logical replication. The current logical replication behavior is to send every transaction to subscriber even if the transaction is empty. This can happen because transaction doesn't contain changes from the selected publications or all the changes got filtered. It is a waste of CPU cycles and network bandwidth to build/transmit these empty transactions. This patch addresses the above problem by postponing the BEGIN message until the first change is sent. While processing a COMMIT message, if there was no other change for that transaction, do not send the COMMIT message. This allows us to skip sending BEGIN/COMMIT messages for empty transactions. When skipping empty transactions in synchronous replication mode, we send a keepalive message to avoid delaying such transactions. Author: Ajin Cherian, Hou Zhijie, Euler Taveira Reviewed-by: Peter Smith, Takamichi Osumi, Shi Yu, Masahiko Sawada, Greg Nancarrow, Vignesh C, Amit Kapila Discussion: https://postgr.es/m/CAMkU=1yohp9-dv48FLoSPrMqYEyyS5ZWkaZGD41RJr10xiNo_Q@mail.gmail.com --- src/backend/replication/logical/logical.c | 6 +- src/backend/replication/pgoutput/pgoutput.c | 141 ++++++++++++++++++-- src/backend/replication/walsender.c | 72 +++++++--- src/include/replication/logical.h | 3 +- src/include/replication/output_plugin.h | 2 +- src/test/subscription/t/001_rep_changes.pl | 28 ++++ src/test/subscription/t/020_messages.pl | 5 +- src/tools/pgindent/typedefs.list | 1 + 8 files changed, 228 insertions(+), 30 deletions(-) diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index 934aa13f2d..e1f14aeecb 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -683,12 +683,14 @@ OutputPluginWrite(struct LogicalDecodingContext *ctx, bool last_write) * Update progress tracking (if supported). */ void -OutputPluginUpdateProgress(struct LogicalDecodingContext *ctx) +OutputPluginUpdateProgress(struct LogicalDecodingContext *ctx, + bool skipped_xact) { if (!ctx->update_progress) return; - ctx->update_progress(ctx, ctx->write_location, ctx->write_xid); + ctx->update_progress(ctx, ctx->write_location, ctx->write_xid, + skipped_xact); } /* diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 893833ea83..20d0b1e125 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -183,6 +183,36 @@ typedef struct RelationSyncEntry MemoryContext entry_cxt; } RelationSyncEntry; +/* + * Maintain a per-transaction level variable to track whether the transaction + * has sent BEGIN. BEGIN is only sent when the first change in a transaction + * is processed. This makes it possible to skip sending a pair of BEGIN/COMMIT + * messages for empty transactions which saves network bandwidth. + * + * This optimization is not used for prepared transactions because if the + * WALSender restarts after prepare of a transaction and before commit prepared + * of the same transaction then we won't be able to figure out if we have + * skipped sending BEGIN/PREPARE of a transaction as it was empty. This is + * because we would have lost the in-memory txndata information that was + * present prior to the restart. This will result in sending a spurious + * COMMIT PREPARED without a corresponding prepared transaction at the + * downstream which would lead to an error when it tries to process it. + * + * XXX We could achieve this optimization by changing protocol to send + * additional information so that downstream can detect that the corresponding + * prepare has not been sent. However, adding such a check for every + * transaction in the downstream could be costly so we might want to do it + * optionally. + * + * We also don't have this optimization for streamed transactions because + * they can contain prepared transactions. + */ +typedef struct PGOutputTxnData +{ + bool sent_begin_txn; /* flag indicating whether BEGIN has + * been sent */ +} PGOutputTxnData; + /* Map used to remember which relation schemas we sent. */ static HTAB *RelationSyncCache = NULL; @@ -488,15 +518,41 @@ pgoutput_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt, } /* - * BEGIN callback + * BEGIN callback. + * + * Don't send the BEGIN message here instead postpone it until the first + * change. In logical replication, a common scenario is to replicate a set of + * tables (instead of all tables) and transactions whose changes were on + * the table(s) that are not published will produce empty transactions. These + * empty transactions will send BEGIN and COMMIT messages to subscribers, + * using bandwidth on something with little/no use for logical replication. */ static void -pgoutput_begin_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn) +pgoutput_begin_txn(LogicalDecodingContext * ctx, ReorderBufferTXN * txn) +{ + PGOutputTxnData *txndata = MemoryContextAllocZero(ctx->context, + sizeof(PGOutputTxnData)); + + txn->output_plugin_private = txndata; +} + +/* + * Send BEGIN. + * + * This is called while processing the first change of the transaction. + */ +static void +pgoutput_send_begin(LogicalDecodingContext *ctx, ReorderBufferTXN *txn) { bool send_replication_origin = txn->origin_id != InvalidRepOriginId; + PGOutputTxnData *txndata = (PGOutputTxnData *) txn->output_plugin_private; + + Assert(txndata); + Assert(!txndata->sent_begin_txn); OutputPluginPrepareWrite(ctx, !send_replication_origin); logicalrep_write_begin(ctx->out, txn); + txndata->sent_begin_txn = true; send_repl_origin(ctx, txn->origin_id, txn->origin_lsn, send_replication_origin); @@ -511,7 +567,25 @@ static void pgoutput_commit_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr commit_lsn) { - OutputPluginUpdateProgress(ctx); + PGOutputTxnData *txndata = (PGOutputTxnData *) txn->output_plugin_private; + bool sent_begin_txn; + + Assert(txndata); + + /* + * We don't need to send the commit message unless some relevant change + * from this transaction has been sent to the downstream. + */ + sent_begin_txn = txndata->sent_begin_txn; + OutputPluginUpdateProgress(ctx, !sent_begin_txn); + pfree(txndata); + txn->output_plugin_private = NULL; + + if (!sent_begin_txn) + { + elog(DEBUG1, "skipped replication of an empty transaction with XID: %u", txn->xid); + return; + } OutputPluginPrepareWrite(ctx, true); logicalrep_write_commit(ctx->out, txn, commit_lsn); @@ -542,7 +616,7 @@ static void pgoutput_prepare_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr prepare_lsn) { - OutputPluginUpdateProgress(ctx); + OutputPluginUpdateProgress(ctx, false); OutputPluginPrepareWrite(ctx, true); logicalrep_write_prepare(ctx->out, txn, prepare_lsn); @@ -556,7 +630,7 @@ static void pgoutput_commit_prepared_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr commit_lsn) { - OutputPluginUpdateProgress(ctx); + OutputPluginUpdateProgress(ctx, false); OutputPluginPrepareWrite(ctx, true); logicalrep_write_commit_prepared(ctx->out, txn, commit_lsn); @@ -572,7 +646,7 @@ pgoutput_rollback_prepared_txn(LogicalDecodingContext *ctx, XLogRecPtr prepare_end_lsn, TimestampTz prepare_time) { - OutputPluginUpdateProgress(ctx); + OutputPluginUpdateProgress(ctx, false); OutputPluginPrepareWrite(ctx, true); logicalrep_write_rollback_prepared(ctx->out, txn, prepare_end_lsn, @@ -1295,6 +1369,7 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, Relation relation, ReorderBufferChange *change) { PGOutputData *data = (PGOutputData *) ctx->output_plugin_private; + PGOutputTxnData *txndata = (PGOutputTxnData *) txn->output_plugin_private; MemoryContext old; RelationSyncEntry *relentry; TransactionId xid = InvalidTransactionId; @@ -1370,6 +1445,16 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, &action)) break; + /* + * Send BEGIN if we haven't yet. + * + * We send the BEGIN message after ensuring that we will actually + * send the change. This avoids sending a pair of BEGIN/COMMIT + * messages for empty transactions. + */ + if (txndata && !txndata->sent_begin_txn) + pgoutput_send_begin(ctx, txn); + /* * Schema should be sent using the original relation because it * also sends the ancestor's relation. @@ -1420,6 +1505,10 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, relentry, &action)) break; + /* Send BEGIN if we haven't yet */ + if (txndata && !txndata->sent_begin_txn) + pgoutput_send_begin(ctx, txn); + maybe_send_schema(ctx, change, relation, relentry); OutputPluginPrepareWrite(ctx, true); @@ -1480,6 +1569,10 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, relentry, &action)) break; + /* Send BEGIN if we haven't yet */ + if (txndata && !txndata->sent_begin_txn) + pgoutput_send_begin(ctx, txn); + maybe_send_schema(ctx, change, relation, relentry); OutputPluginPrepareWrite(ctx, true); @@ -1510,6 +1603,7 @@ pgoutput_truncate(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, int nrelations, Relation relations[], ReorderBufferChange *change) { PGOutputData *data = (PGOutputData *) ctx->output_plugin_private; + PGOutputTxnData *txndata = (PGOutputTxnData *) txn->output_plugin_private; MemoryContext old; RelationSyncEntry *relentry; int i; @@ -1548,6 +1642,11 @@ pgoutput_truncate(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, continue; relids[nrelids++] = relid; + + /* Send BEGIN if we haven't yet */ + if (txndata && !txndata->sent_begin_txn) + pgoutput_send_begin(ctx, txn); + maybe_send_schema(ctx, change, relation, relentry); } @@ -1585,6 +1684,19 @@ pgoutput_message(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, if (in_streaming) xid = txn->xid; + /* + * Output BEGIN if we haven't yet. Avoid for non-transactional + * messages. + */ + if (transactional) + { + PGOutputTxnData *txndata = (PGOutputTxnData *) txn->output_plugin_private; + + /* Send BEGIN if we haven't yet */ + if (txndata && !txndata->sent_begin_txn) + pgoutput_send_begin(ctx, txn); + } + OutputPluginPrepareWrite(ctx, true); logicalrep_write_message(ctx->out, xid, @@ -1629,6 +1741,19 @@ pgoutput_sequence(LogicalDecodingContext *ctx, if (!relentry->pubactions.pubsequence) return; + /* + * Output BEGIN if we haven't yet. Avoid for non-transactional + * sequence changes. + */ + if (transactional) + { + PGOutputTxnData *txndata = (PGOutputTxnData *) txn->output_plugin_private; + + /* Send BEGIN if we haven't yet */ + if (txndata && !txndata->sent_begin_txn) + pgoutput_send_begin(ctx, txn); + } + OutputPluginPrepareWrite(ctx, true); logicalrep_write_sequence(ctx->out, relation, @@ -1799,7 +1924,7 @@ pgoutput_stream_commit(struct LogicalDecodingContext *ctx, Assert(!in_streaming); Assert(rbtxn_is_streamed(txn)); - OutputPluginUpdateProgress(ctx); + OutputPluginUpdateProgress(ctx, false); OutputPluginPrepareWrite(ctx, true); logicalrep_write_stream_commit(ctx->out, txn, commit_lsn); @@ -1820,7 +1945,7 @@ pgoutput_stream_prepare_txn(LogicalDecodingContext *ctx, { Assert(rbtxn_is_streamed(txn)); - OutputPluginUpdateProgress(ctx); + OutputPluginUpdateProgress(ctx, false); OutputPluginPrepareWrite(ctx, true); logicalrep_write_stream_prepare(ctx->out, txn, prepare_lsn); OutputPluginWrite(ctx, true); diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index cffb3482ad..75400a53f2 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -242,14 +242,16 @@ static void ProcessStandbyMessage(void); static void ProcessStandbyReplyMessage(void); static void ProcessStandbyHSFeedbackMessage(void); static void ProcessRepliesIfAny(void); -static void WalSndKeepalive(bool requestReply); +static void ProcessPendingWrites(void); +static void WalSndKeepalive(bool requestReply, XLogRecPtr writePtr); static void WalSndKeepaliveIfNecessary(void); static void WalSndCheckTimeOut(void); static long WalSndComputeSleeptime(TimestampTz now); static void WalSndWait(uint32 socket_events, long timeout, uint32 wait_event); static void WalSndPrepareWrite(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xid, bool last_write); static void WalSndWriteData(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xid, bool last_write); -static void WalSndUpdateProgress(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xid); +static void WalSndUpdateProgress(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xid, + bool skipped_xact); static XLogRecPtr WalSndWaitForWal(XLogRecPtr loc); static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); @@ -1399,6 +1401,16 @@ WalSndWriteData(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xid, } /* If we have pending write here, go to slow path */ + ProcessPendingWrites(); +} + +/* + * Wait until there is no pending write. Also process replies from the other + * side and check timeouts during that. + */ +static void +ProcessPendingWrites(void) +{ for (;;) { long sleeptime; @@ -1447,9 +1459,12 @@ WalSndWriteData(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xid, * LogicalDecodingContext 'update_progress' callback. * * Write the current position to the lag tracker (see XLogSendPhysical). + * + * When skipping empty transactions, send a keepalive message if necessary. */ static void -WalSndUpdateProgress(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xid) +WalSndUpdateProgress(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xid, + bool skipped_xact) { static TimestampTz sendTime = 0; TimestampTz now = GetCurrentTimestamp(); @@ -1459,12 +1474,35 @@ WalSndUpdateProgress(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId * avoid flooding the lag tracker when we commit frequently. */ #define WALSND_LOGICAL_LAG_TRACK_INTERVAL_MS 1000 - if (!TimestampDifferenceExceeds(sendTime, now, - WALSND_LOGICAL_LAG_TRACK_INTERVAL_MS)) - return; + if (TimestampDifferenceExceeds(sendTime, now, + WALSND_LOGICAL_LAG_TRACK_INTERVAL_MS)) + { + LagTrackerWrite(lsn, now); + sendTime = now; + } - LagTrackerWrite(lsn, now); - sendTime = now; + /* + * When skipping empty transactions in synchronous replication, we send a + * keepalive message to avoid delaying such transactions. + * + * It is okay to check sync_standbys_defined flag without lock here as + * in the worst case we will just send an extra keepalive message when it + * is really not required. + */ + if (skipped_xact && + SyncRepRequested() && + ((volatile WalSndCtlData *) WalSndCtl)->sync_standbys_defined) + { + WalSndKeepalive(false, lsn); + + /* Try to flush pending output to the client */ + if (pq_flush_if_writable() != 0) + WalSndShutdown(); + + /* If we have pending write here, make sure it's actually flushed */ + if (pq_is_send_pending()) + ProcessPendingWrites(); + } } /* @@ -1550,7 +1588,7 @@ WalSndWaitForWal(XLogRecPtr loc) if (MyWalSnd->flush < sentPtr && MyWalSnd->write < sentPtr && !waiting_for_ping_response) - WalSndKeepalive(false); + WalSndKeepalive(false, InvalidXLogRecPtr); /* check whether we're done */ if (loc <= RecentFlushPtr) @@ -2068,7 +2106,7 @@ ProcessStandbyReplyMessage(void) /* Send a reply if the standby requested one. */ if (replyRequested) - WalSndKeepalive(false); + WalSndKeepalive(false, InvalidXLogRecPtr); /* * Update shared state for this WalSender process based on reply data from @@ -3074,7 +3112,7 @@ WalSndDone(WalSndSendDataCallback send_data) proc_exit(0); } if (!waiting_for_ping_response) - WalSndKeepalive(true); + WalSndKeepalive(true, InvalidXLogRecPtr); } /* @@ -3563,18 +3601,22 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS) * * If requestReply is set, the message requests the other party to send * a message back to us, for heartbeat purposes. We also set a flag to - * let nearby code that we're waiting for that response, to avoid + * let nearby code know that we're waiting for that response, to avoid * repeated requests. + * + * writePtr is the location up to which the WAL is sent. It is essentially + * the same as sentPtr but in some cases, we need to send keep alive before + * sentPtr is updated like when skipping empty transactions. */ static void -WalSndKeepalive(bool requestReply) +WalSndKeepalive(bool requestReply, XLogRecPtr writePtr) { elog(DEBUG2, "sending replication keepalive"); /* construct the message... */ resetStringInfo(&output_message); pq_sendbyte(&output_message, 'k'); - pq_sendint64(&output_message, sentPtr); + pq_sendint64(&output_message, XLogRecPtrIsInvalid(writePtr) ? sentPtr : writePtr); pq_sendint64(&output_message, GetCurrentTimestamp()); pq_sendbyte(&output_message, requestReply ? 1 : 0); @@ -3613,7 +3655,7 @@ WalSndKeepaliveIfNecessary(void) wal_sender_timeout / 2); if (last_processing >= ping_time) { - WalSndKeepalive(true); + WalSndKeepalive(true, InvalidXLogRecPtr); /* Try to flush pending output to the client */ if (pq_flush_if_writable() != 0) diff --git a/src/include/replication/logical.h b/src/include/replication/logical.h index 1097cc9799..a6ef16ad5b 100644 --- a/src/include/replication/logical.h +++ b/src/include/replication/logical.h @@ -26,7 +26,8 @@ typedef LogicalOutputPluginWriterWrite LogicalOutputPluginWriterPrepareWrite; typedef void (*LogicalOutputPluginWriterUpdateProgress) (struct LogicalDecodingContext *lr, XLogRecPtr Ptr, - TransactionId xid + TransactionId xid, + bool skipped_xact ); typedef struct LogicalDecodingContext diff --git a/src/include/replication/output_plugin.h b/src/include/replication/output_plugin.h index a16bebf76c..fe85d49a03 100644 --- a/src/include/replication/output_plugin.h +++ b/src/include/replication/output_plugin.h @@ -270,6 +270,6 @@ typedef struct OutputPluginCallbacks /* Functions in replication/logical/logical.c */ extern void OutputPluginPrepareWrite(struct LogicalDecodingContext *ctx, bool last_write); extern void OutputPluginWrite(struct LogicalDecodingContext *ctx, bool last_write); -extern void OutputPluginUpdateProgress(struct LogicalDecodingContext *ctx); +extern void OutputPluginUpdateProgress(struct LogicalDecodingContext *ctx, bool skipped_xact); #endif /* OUTPUT_PLUGIN_H */ diff --git a/src/test/subscription/t/001_rep_changes.pl b/src/test/subscription/t/001_rep_changes.pl index eca1c63335..d35a133f15 100644 --- a/src/test/subscription/t/001_rep_changes.pl +++ b/src/test/subscription/t/001_rep_changes.pl @@ -473,6 +473,34 @@ $node_publisher->wait_for_catchup('tap_sub'); +# Check that we don't send BEGIN and COMMIT because of empty transaction +# optimization. We have to look for the DEBUG1 log messages about that, so +# temporarily bump up the log verbosity. +$node_publisher->append_conf('postgresql.conf', "log_min_messages = debug1"); +$node_publisher->reload; + +# Note that the current location of the log file is not grabbed immediately +# after reloading the configuration, but after sending one SQL command to +# the node so that we are sure that the reloading has taken effect. +$log_location = -s $node_publisher->logfile; + +$node_publisher->safe_psql('postgres', "INSERT INTO tab_notrep VALUES (11)"); + +$node_publisher->wait_for_catchup('tap_sub'); + +$logfile = slurp_file($node_publisher->logfile, $log_location); +ok( $logfile =~ + qr/skipped replication of an empty transaction with XID/, + 'empty transaction is skipped'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM tab_notrep"); +is($result, qq(0), 'check non-replicated table is empty on subscriber'); + +$node_publisher->append_conf('postgresql.conf', + "log_min_messages = warning"); +$node_publisher->reload; + # note that data are different on provider and subscriber $result = $node_subscriber->safe_psql('postgres', "SELECT count(*), min(a), max(a) FROM tab_ins"); diff --git a/src/test/subscription/t/020_messages.pl b/src/test/subscription/t/020_messages.pl index b5045ff3c4..d21d929c2d 100644 --- a/src/test/subscription/t/020_messages.pl +++ b/src/test/subscription/t/020_messages.pl @@ -87,9 +87,8 @@ 'publication_names', 'tap_pub') )); -# 66 67 == B C == BEGIN COMMIT -is( $result, qq(66 -67), +# no message and no BEGIN and COMMIT because of empty transaction optimization +is($result, qq(), 'option messages defaults to false so message (M) is not available on slot' ); diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 6b77cc64ef..72fafb795b 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1616,6 +1616,7 @@ PGMessageField PGModuleMagicFunction PGNoticeHooks PGOutputData +PGOutputTxnData PGPROC PGP_CFB PGP_Context From edcedcc2c7bb8390858bbccda9637318598f2473 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 30 Mar 2022 13:34:01 +0900 Subject: [PATCH 302/772] Add TAP test in pg_dump with --format=tar and --compress This combination of options has never been supported, and it has never been checked in the regression tests. When building the code without zlib support, pg_dump is allowed to run and it generates a warning to inform that any contents are dumped as uncompressed. The tests added by this commit check both behaviors. Author: Georgios Kokolatos, Rachel Heaton Discussion: https://postgr.es/m/faUNEOpts9vunEaLnmxmG-DldLSg_ql137OC3JYDmgrOMHm1RvvWY2IdBkv_CRxm5spCCb_OmKNk2T03TMm0fBEWveFF9wA1WizPuAgB7Ss=@protonmail.com --- src/bin/pg_dump/t/001_basic.pl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/bin/pg_dump/t/001_basic.pl b/src/bin/pg_dump/t/001_basic.pl index e0bf3eb032..65e6c01fed 100644 --- a/src/bin/pg_dump/t/001_basic.pl +++ b/src/bin/pg_dump/t/001_basic.pl @@ -125,6 +125,22 @@ qr/\Qpg_dump: error: -Z\/--compress must be in range 0..9\E/, 'pg_dump: -Z/--compress must be in range'); +if (check_pg_config("#define HAVE_LIBZ 1")) +{ + command_fails_like( + [ 'pg_dump', '--compress', '1', '--format', 'tar' ], + qr/\Qpg_dump: error: compression is not supported by tar archive format\E/, + 'pg_dump: compression is not supported by tar archive format'); +} +else +{ + # --jobs > 1 forces an error with tar format. + command_fails_like( + [ 'pg_dump', '--compress', '1', '--format', 'tar', '-j3' ], + qr/\Qpg_dump: warning: requested compression not available in this installation -- archive will be uncompressed\E/, + 'pg_dump: warning: compression not available in this installation'); +} + command_fails_like( [ 'pg_dump', '--extra-float-digits', '-16' ], qr/\Qpg_dump: error: --extra-float-digits must be in range\E/, From 072132f04e55c1c3b0f1a582318da78de7334379 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 30 Mar 2022 08:56:58 +0200 Subject: [PATCH 303/772] Add header matching mode to COPY FROM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit COPY FROM supports the HEADER option to silently discard the header line from a CSV or text file. It is possible to load by mistake a file that matches the expected format, for example, if two text columns have been swapped, resulting in garbage in the database. This adds a new option value HEADER MATCH that checks the column names in the header line against the actual column names and errors out if they do not match. Author: Rémi Lapeyre Reviewed-by: Daniel Verite Reviewed-by: Peter Eisentraut Discussion: https://www.postgresql.org/message-id/flat/CAF1-J-0PtCWMeLtswwGV2M70U26n4g33gpe1rcKQqe6wVQDrFA@mail.gmail.com --- contrib/file_fdw/expected/file_fdw.out | 19 +++++++- contrib/file_fdw/sql/file_fdw.sql | 9 ++++ doc/src/sgml/ref/copy.sgml | 8 +++- src/backend/commands/copy.c | 60 +++++++++++++++++++++++++- src/backend/commands/copyfromparse.c | 53 +++++++++++++++++++++-- src/include/commands/copy.h | 13 +++++- src/test/regress/expected/copy.out | 23 ++++++++++ src/test/regress/sql/copy.sql | 33 ++++++++++++++ 8 files changed, 210 insertions(+), 8 deletions(-) diff --git a/contrib/file_fdw/expected/file_fdw.out b/contrib/file_fdw/expected/file_fdw.out index 14acdb27e5..0029f36b35 100644 --- a/contrib/file_fdw/expected/file_fdw.out +++ b/contrib/file_fdw/expected/file_fdw.out @@ -113,6 +113,21 @@ CREATE FOREIGN TABLE agg_bad ( ) SERVER file_server OPTIONS (format 'csv', filename :'filename', header 'true', delimiter ';', quote '@', escape '"', null ''); ALTER FOREIGN TABLE agg_bad ADD CHECK (a >= 0); +-- test header matching +\set filename :abs_srcdir '/data/list1.csv' +CREATE FOREIGN TABLE header_match ("1" int, foo text) SERVER file_server +OPTIONS (format 'csv', filename :'filename', delimiter ',', header 'match'); +SELECT * FROM header_match; + 1 | foo +---+----- + 1 | bar +(1 row) + +CREATE FOREIGN TABLE header_doesnt_match (a int, foo text) SERVER file_server +OPTIONS (format 'csv', filename :'filename', delimiter ',', header 'match'); +SELECT * FROM header_doesnt_match; -- ERROR +ERROR: column name mismatch in header line field 1: got "1", expected "a" +CONTEXT: COPY header_doesnt_match, line 1: "1,foo" -- per-column options tests \set filename :abs_srcdir '/data/text.csv' CREATE FOREIGN TABLE text_csv ( @@ -464,12 +479,14 @@ SET ROLE regress_file_fdw_superuser; -- cleanup RESET ROLE; DROP EXTENSION file_fdw CASCADE; -NOTICE: drop cascades to 7 other objects +NOTICE: drop cascades to 9 other objects DETAIL: drop cascades to server file_server drop cascades to user mapping for regress_file_fdw_superuser on server file_server drop cascades to user mapping for regress_no_priv_user on server file_server drop cascades to foreign table agg_text drop cascades to foreign table agg_csv drop cascades to foreign table agg_bad +drop cascades to foreign table header_match +drop cascades to foreign table header_doesnt_match drop cascades to foreign table text_csv DROP ROLE regress_file_fdw_superuser, regress_file_fdw_user, regress_no_priv_user; diff --git a/contrib/file_fdw/sql/file_fdw.sql b/contrib/file_fdw/sql/file_fdw.sql index 86f876d565..563d824ccc 100644 --- a/contrib/file_fdw/sql/file_fdw.sql +++ b/contrib/file_fdw/sql/file_fdw.sql @@ -103,6 +103,15 @@ CREATE FOREIGN TABLE agg_bad ( OPTIONS (format 'csv', filename :'filename', header 'true', delimiter ';', quote '@', escape '"', null ''); ALTER FOREIGN TABLE agg_bad ADD CHECK (a >= 0); +-- test header matching +\set filename :abs_srcdir '/data/list1.csv' +CREATE FOREIGN TABLE header_match ("1" int, foo text) SERVER file_server +OPTIONS (format 'csv', filename :'filename', delimiter ',', header 'match'); +SELECT * FROM header_match; +CREATE FOREIGN TABLE header_doesnt_match (a int, foo text) SERVER file_server +OPTIONS (format 'csv', filename :'filename', delimiter ',', header 'match'); +SELECT * FROM header_doesnt_match; -- ERROR + -- per-column options tests \set filename :abs_srcdir '/data/text.csv' CREATE FOREIGN TABLE text_csv ( diff --git a/doc/src/sgml/ref/copy.sgml b/doc/src/sgml/ref/copy.sgml index 1b7d001963..e7a6676efd 100644 --- a/doc/src/sgml/ref/copy.sgml +++ b/doc/src/sgml/ref/copy.sgml @@ -36,7 +36,7 @@ COPY { table_name [ ( boolean ] DELIMITER 'delimiter_character' NULL 'null_string' - HEADER [ boolean ] + HEADER [ boolean | match ] QUOTE 'quote_character' ESCAPE 'escape_character' FORCE_QUOTE { ( column_name [, ...] ) | * } @@ -276,7 +276,11 @@ COPY { table_name [ ( Specifies that the file contains a header line with the names of each column in the file. On output, the first line contains the column - names from the table, and on input, the first line is ignored. + names from the table. On input, the first line is discarded when this + option is set to true (or equivalent Boolean value). + If this option is set to match, the number and names + of the columns in the header line must match the actual column names of + the table, otherwise an error is raised. This option is not allowed when using binary format. diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 7a0c897cc9..689713ea58 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -313,6 +313,64 @@ DoCopy(ParseState *pstate, const CopyStmt *stmt, table_close(rel, NoLock); } +/* + * Extract a CopyHeaderChoice value from a DefElem. This is like + * defGetBoolean() but also accepts the special value "match". + */ +static CopyHeaderChoice +defGetCopyHeaderChoice(DefElem *def) +{ + /* + * If no parameter given, assume "true" is meant. + */ + if (def->arg == NULL) + return COPY_HEADER_TRUE; + + /* + * Allow 0, 1, "true", "false", "on", "off", or "match". + */ + switch (nodeTag(def->arg)) + { + case T_Integer: + switch (intVal(def->arg)) + { + case 0: + return COPY_HEADER_FALSE; + case 1: + return COPY_HEADER_TRUE; + default: + /* otherwise, error out below */ + break; + } + break; + default: + { + char *sval = defGetString(def); + + /* + * The set of strings accepted here should match up with the + * grammar's opt_boolean_or_string production. + */ + if (pg_strcasecmp(sval, "true") == 0) + return COPY_HEADER_TRUE; + if (pg_strcasecmp(sval, "false") == 0) + return COPY_HEADER_FALSE; + if (pg_strcasecmp(sval, "on") == 0) + return COPY_HEADER_TRUE; + if (pg_strcasecmp(sval, "off") == 0) + return COPY_HEADER_FALSE; + if (pg_strcasecmp(sval, "match") == 0) + return COPY_HEADER_MATCH; + } + break; + } + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("%s requires a Boolean value or \"match\"", + def->defname))); + return COPY_HEADER_FALSE; /* keep compiler quiet */ +} + /* * Process the statement option list for COPY. * @@ -394,7 +452,7 @@ ProcessCopyOptions(ParseState *pstate, if (header_specified) errorConflictingDefElem(defel, pstate); header_specified = true; - opts_out->header_line = defGetBoolean(defel); + opts_out->header_line = defGetCopyHeaderChoice(defel); } else if (strcmp(defel->defname, "quote") == 0) { diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c index baf328b620..58017ec53b 100644 --- a/src/backend/commands/copyfromparse.c +++ b/src/backend/commands/copyfromparse.c @@ -72,6 +72,7 @@ #include "miscadmin.h" #include "pgstat.h" #include "port/pg_bswap.h" +#include "utils/builtins.h" #include "utils/memutils.h" #include "utils/rel.h" @@ -758,12 +759,58 @@ NextCopyFromRawFields(CopyFromState cstate, char ***fields, int *nfields) /* only available for text or csv input */ Assert(!cstate->opts.binary); - /* on input just throw the header line away */ + /* on input check that the header line is correct if needed */ if (cstate->cur_lineno == 0 && cstate->opts.header_line) { + ListCell *cur; + TupleDesc tupDesc; + + tupDesc = RelationGetDescr(cstate->rel); + cstate->cur_lineno++; - if (CopyReadLine(cstate)) - return false; /* done */ + done = CopyReadLine(cstate); + + if (cstate->opts.header_line == COPY_HEADER_MATCH) + { + int fldnum; + + if (cstate->opts.csv_mode) + fldct = CopyReadAttributesCSV(cstate); + else + fldct = CopyReadAttributesText(cstate); + + if (fldct != list_length(cstate->attnumlist)) + ereport(ERROR, + (errcode(ERRCODE_BAD_COPY_FILE_FORMAT), + errmsg("wrong number of fields in header line: field count is %d, expected %d", + fldct, list_length(cstate->attnumlist)))); + + fldnum = 0; + foreach(cur, cstate->attnumlist) + { + int attnum = lfirst_int(cur); + char *colName = cstate->raw_fields[attnum - 1]; + Form_pg_attribute attr = TupleDescAttr(tupDesc, attnum - 1); + + fldnum++; + + if (colName == NULL) + ereport(ERROR, + (errcode(ERRCODE_BAD_COPY_FILE_FORMAT), + errmsg("column name mismatch in header line field %d: got null value (\"%s\"), expected \"%s\"", + fldnum, cstate->opts.null_print, NameStr(attr->attname)))); + + if (namestrcmp(&attr->attname, colName) != 0) { + ereport(ERROR, + (errcode(ERRCODE_BAD_COPY_FILE_FORMAT), + errmsg("column name mismatch in header line field %d: got \"%s\", expected \"%s\"", + fldnum, colName, NameStr(attr->attname)))); + } + } + } + + if (done) + return false; } cstate->cur_lineno++; diff --git a/src/include/commands/copy.h b/src/include/commands/copy.h index 8694da5004..cb0096aeb6 100644 --- a/src/include/commands/copy.h +++ b/src/include/commands/copy.h @@ -19,6 +19,17 @@ #include "parser/parse_node.h" #include "tcop/dest.h" +/* + * Represents whether a header line should be present, and whether it must + * match the actual names (which implies "true"). + */ +typedef enum CopyHeaderChoice +{ + COPY_HEADER_FALSE = 0, + COPY_HEADER_TRUE, + COPY_HEADER_MATCH, +} CopyHeaderChoice; + /* * A struct to hold COPY options, in a parsed form. All of these are related * to formatting, except for 'freeze', which doesn't really belong here, but @@ -32,7 +43,7 @@ typedef struct CopyFormatOptions bool binary; /* binary format? */ bool freeze; /* freeze rows on loading? */ bool csv_mode; /* Comma Separated Value format? */ - bool header_line; /* header line? */ + CopyHeaderChoice header_line; /* header line? */ char *null_print; /* NULL marker string (server encoding!) */ int null_print_len; /* length of same */ char *null_print_client; /* same converted to file encoding */ diff --git a/src/test/regress/expected/copy.out b/src/test/regress/expected/copy.out index bec19dc44d..e8d6b4fc13 100644 --- a/src/test/regress/expected/copy.out +++ b/src/test/regress/expected/copy.out @@ -176,3 +176,26 @@ INFO: progress: {"type": "FILE", "command": "COPY FROM", "relname": "tab_progre drop trigger check_after_tab_progress_reporting on tab_progress_reporting; drop function notice_after_tab_progress_reporting(); drop table tab_progress_reporting; +-- Test header matching feature +create table header_copytest ( + a int, + b int, + c text +); +copy header_copytest from stdin with (header wrong_choice); +ERROR: header requires a Boolean value or "match" +copy header_copytest from stdin with (header match); +copy header_copytest from stdin with (header match); +ERROR: column name mismatch in header line field 3: got null value ("\N"), expected "c" +CONTEXT: COPY header_copytest, line 1: "a b \N" +copy header_copytest from stdin with (header match); +ERROR: wrong number of fields in header line: field count is 2, expected 3 +CONTEXT: COPY header_copytest, line 1: "a b" +copy header_copytest from stdin with (header match); +ERROR: wrong number of fields in header line: field count is 4, expected 3 +CONTEXT: COPY header_copytest, line 1: "a b c d" +copy header_copytest from stdin with (header match); +ERROR: column name mismatch in header line field 3: got "d", expected "c" +CONTEXT: COPY header_copytest, line 1: "a b d" +copy header_copytest from stdin with (header match, format csv); +drop table header_copytest; diff --git a/src/test/regress/sql/copy.sql b/src/test/regress/sql/copy.sql index eb302773ab..d72d226f34 100644 --- a/src/test/regress/sql/copy.sql +++ b/src/test/regress/sql/copy.sql @@ -197,3 +197,36 @@ copy tab_progress_reporting from :'filename' drop trigger check_after_tab_progress_reporting on tab_progress_reporting; drop function notice_after_tab_progress_reporting(); drop table tab_progress_reporting; + +-- Test header matching feature +create table header_copytest ( + a int, + b int, + c text +); +copy header_copytest from stdin with (header wrong_choice); +copy header_copytest from stdin with (header match); +a b c +1 2 foo +\. +copy header_copytest from stdin with (header match); +a b \N +1 2 foo +\. +copy header_copytest from stdin with (header match); +a b +1 2 +\. +copy header_copytest from stdin with (header match); +a b c d +1 2 foo bar +\. +copy header_copytest from stdin with (header match); +a b d +1 2 foo +\. +copy header_copytest from stdin with (header match, format csv); +a,b,c +1,2,foo +\. +drop table header_copytest; From f505bec711f602c6bd08a88e8ad894b611e7e8a1 Mon Sep 17 00:00:00 2001 From: Etsuro Fujita Date: Wed, 30 Mar 2022 19:00:00 +0900 Subject: [PATCH 304/772] Fix typo in comment. --- src/backend/commands/copyfrom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/commands/copyfrom.c b/src/backend/commands/copyfrom.c index db6eb6fae7..35a1d3a774 100644 --- a/src/backend/commands/copyfrom.c +++ b/src/backend/commands/copyfrom.c @@ -315,7 +315,7 @@ CopyMultiInsertBufferFlush(CopyMultiInsertInfo *miinfo, /* * Print error context information correctly, if one of the operations - * below fail. + * below fails. */ cstate->line_buf_valid = false; save_cur_lineno = cstate->cur_lineno; From 860ea46ba7be69c46c37a96983e1ddca9d630c2e Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Wed, 30 Mar 2022 13:07:30 +0200 Subject: [PATCH 305/772] doc: Clarify when SSL actually means TLS SSL has become the de facto term to mean an end-to-end encrypted channel regardless of protocol used, even though the SSL protocol is deprecated. Clarify what we mean with SSL in our documentation, especially for new users who might be looking for TLS. Reviewed-by: Robert Haas Discussion: https://postgr.es/m/D4ABB281-6CFD-46C6-A4E0-8EC23A2977BC@yesql.se --- doc/src/sgml/config.sgml | 8 +++++++- doc/src/sgml/libpq.sgml | 6 ++++-- doc/src/sgml/runtime.sgml | 15 ++++++++++++++- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 05df48131d..9788e831bc 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -1184,7 +1184,13 @@ include_dir 'conf.d' SSL - See for more information about setting up SSL. + See for more information about setting up + SSL. The configuration parameters for controlling + transfer encryption using TLS protocols are named + ssl for historic reasons, even though support for + the SSL protocol has been deprecated. + SSL is in this context used interchangeably with + TLS. diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index eac5dee9f7..0b2a8720f0 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -8292,12 +8292,14 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*) SSL + TLS PostgreSQL has native support for using SSL - connections to encrypt client/server communications for increased - security. See for details about the server-side + connections to encrypt client/server communications using + TLS protocols for increased security. + See for details about the server-side SSL functionality. diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml index 3a463f12d7..1f021ea116 100644 --- a/doc/src/sgml/runtime.sgml +++ b/doc/src/sgml/runtime.sgml @@ -2182,6 +2182,7 @@ pg_dumpall -p 5432 | psql -d postgres -p 5433 SSL + TLS @@ -2193,13 +2194,25 @@ pg_dumpall -p 5432 | psql -d postgres -p 5433 enabled at build time (see ). + + The terms SSL and TLS are often used + interchangeably to mean a secure encrypted connection using a + TLS protocol. SSL protocols are the + precursors to TLS protocols, and the term + SSL is still used for encrypted connections even though + SSL protocols are no longer supported. + SSL is used interchangeably with TLS + in PostgreSQL. + + Basic Setup With SSL support compiled in, the PostgreSQL server can be started with - SSL enabled by setting the parameter + support for encrypted connections using TLS protocols + enabled by by setting the parameter to on in postgresql.conf. The server will listen for both normal and SSL connections on the same TCP port, and will negotiate From c6863b85829149e2241faafa161b6c5af1f06cb9 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 30 Mar 2022 09:02:44 -0400 Subject: [PATCH 306/772] Simplify a needlessly-complicated regular expression. Dilip Kumar Discussion: https://postgr.es/m/CAFiTN-uV_u1LgBN_CAiGyfgPXp+bfBUVqG5mZ24Nqc8e_Yb0HQ@mail.gmail.com --- src/bin/scripts/t/020_createdb.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/scripts/t/020_createdb.pl b/src/bin/scripts/t/020_createdb.pl index b81f06a251..18f6e313d5 100644 --- a/src/bin/scripts/t/020_createdb.pl +++ b/src/bin/scripts/t/020_createdb.pl @@ -109,7 +109,7 @@ 1, [qr/^$/], [ - qr/^createdb: error: database creation failed: ERROR: invalid create database strategy|^createdb: error: database creation failed: ERROR: invalid create database strategy foo/s + qr/^createdb: error: database creation failed: ERROR: invalid create database strategy foo/s ], 'createdb with incorrect --strategy'); From 51c0d186d99a18e6aae53003f5138f20991e15a6 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 30 Mar 2022 09:35:14 -0400 Subject: [PATCH 307/772] Allow parallel zstd compression when taking a base backup. libzstd allows transparent parallel compression just by setting an option when creating the compression context, so permit that for both client and server-side backup compression. To use this, use something like pg_basebackup --compress WHERE-zstd:workers=N where WHERE is "client" or "server" and N is an integer. When compression is performed on the server side, this will spawn threads inside the PostgreSQL backend. While there is almost no PostgreSQL server code which is thread-safe, the threads here are used internally by libzstd and touch only data structures controlled by libzstd. Patch by me, based in part on earlier work by Dipesh Pandit and Jeevan Ladhe. Reviewed by Justin Pryzby. Discussion: http://postgr.es/m/CA+Tgmobj6u-nWF-j=FemygUhobhryLxf9h-wJN7W-2rSsseHNA@mail.gmail.com --- doc/src/sgml/protocol.sgml | 12 +++-- doc/src/sgml/ref/pg_basebackup.sgml | 4 +- src/backend/replication/basebackup_zstd.c | 45 ++++++++++++------- src/bin/pg_basebackup/bbstreamer_zstd.c | 40 ++++++++++++----- src/bin/pg_basebackup/t/010_pg_basebackup.pl | 5 +++ src/bin/pg_verifybackup/t/009_extract.pl | 29 +++++++++++- src/bin/pg_verifybackup/t/010_client_untar.pl | 33 ++++++++++++-- src/common/backup_compression.c | 16 +++++++ src/include/common/backup_compression.h | 2 + 9 files changed, 147 insertions(+), 39 deletions(-) diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 2fa3cedfe9..98f0bc3cc3 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -2739,17 +2739,23 @@ The commands accepted in replication mode are: option. If the value is an integer, it specifies the compression level. Otherwise, it should be a comma-separated list of items, each of the form keyword or - keyword=value. Currently, the only supported - keyword is level, which sets the compression - level. + keyword=value. Currently, the supported keywords + are level and workers. + The level keyword sets the compression level. For gzip the compression level should be an integer between 1 and 9, for lz4 an integer between 1 and 12, and for zstd an integer between 1 and 22. + + + The workers keyword sets the number of threads + that should be used for parallel compression. Parallel compression + is supported only for zstd. + diff --git a/doc/src/sgml/ref/pg_basebackup.sgml b/doc/src/sgml/ref/pg_basebackup.sgml index d9233beb8e..82f5f60625 100644 --- a/doc/src/sgml/ref/pg_basebackup.sgml +++ b/doc/src/sgml/ref/pg_basebackup.sgml @@ -424,8 +424,8 @@ PostgreSQL documentation integer, it specifies the compression level. Otherwise, it should be a comma-separated list of items, each of the form keyword or keyword=value. - Currently, the only supported keyword is level, - which sets the compression level. + Currently, the supported keywords are level + and workers. If no compression level is specified, the default compression level diff --git a/src/backend/replication/basebackup_zstd.c b/src/backend/replication/basebackup_zstd.c index 5496eaa72b..f6876f4811 100644 --- a/src/backend/replication/basebackup_zstd.c +++ b/src/backend/replication/basebackup_zstd.c @@ -25,8 +25,8 @@ typedef struct bbsink_zstd /* Common information for all types of sink. */ bbsink base; - /* Compression level */ - int compresslevel; + /* Compression options */ + bc_specification *compress; ZSTD_CCtx *cctx; ZSTD_outBuffer zstd_outBuf; @@ -67,22 +67,13 @@ bbsink_zstd_new(bbsink *next, bc_specification *compress) return NULL; /* keep compiler quiet */ #else bbsink_zstd *sink; - int compresslevel; Assert(next != NULL); - if ((compress->options & BACKUP_COMPRESSION_OPTION_LEVEL) == 0) - compresslevel = 0; - else - { - compresslevel = compress->level; - Assert(compresslevel >= 1 && compresslevel <= 22); - } - sink = palloc0(sizeof(bbsink_zstd)); *((const bbsink_ops **) &sink->base.bbs_ops) = &bbsink_zstd_ops; sink->base.bbs_next = next; - sink->compresslevel = compresslevel; + sink->compress = compress; return &sink->base; #endif @@ -99,16 +90,36 @@ bbsink_zstd_begin_backup(bbsink *sink) bbsink_zstd *mysink = (bbsink_zstd *) sink; size_t output_buffer_bound; size_t ret; + bc_specification *compress = mysink->compress; mysink->cctx = ZSTD_createCCtx(); if (!mysink->cctx) elog(ERROR, "could not create zstd compression context"); - ret = ZSTD_CCtx_setParameter(mysink->cctx, ZSTD_c_compressionLevel, - mysink->compresslevel); - if (ZSTD_isError(ret)) - elog(ERROR, "could not set zstd compression level to %d: %s", - mysink->compresslevel, ZSTD_getErrorName(ret)); + if ((compress->options & BACKUP_COMPRESSION_OPTION_LEVEL) != 0) + { + ret = ZSTD_CCtx_setParameter(mysink->cctx, ZSTD_c_compressionLevel, + compress->level); + if (ZSTD_isError(ret)) + elog(ERROR, "could not set zstd compression level to %d: %s", + compress->level, ZSTD_getErrorName(ret)); + } + + if ((compress->options & BACKUP_COMPRESSION_OPTION_WORKERS) != 0) + { + /* + * On older versions of libzstd, this option does not exist, and trying + * to set it will fail. Similarly for newer versions if they are + * compiled without threading support. + */ + ret = ZSTD_CCtx_setParameter(mysink->cctx, ZSTD_c_nbWorkers, + compress->workers); + if (ZSTD_isError(ret)) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("could not set compression worker count to %d: %s", + compress->workers, ZSTD_getErrorName(ret))); + } /* * We need our own buffer, because we're going to pass different data to diff --git a/src/bin/pg_basebackup/bbstreamer_zstd.c b/src/bin/pg_basebackup/bbstreamer_zstd.c index 7946b6350b..f94c5c041d 100644 --- a/src/bin/pg_basebackup/bbstreamer_zstd.c +++ b/src/bin/pg_basebackup/bbstreamer_zstd.c @@ -67,7 +67,6 @@ bbstreamer_zstd_compressor_new(bbstreamer *next, bc_specification *compress) { #ifdef USE_ZSTD bbstreamer_zstd_frame *streamer; - int compresslevel; size_t ret; Assert(next != NULL); @@ -88,18 +87,35 @@ bbstreamer_zstd_compressor_new(bbstreamer *next, bc_specification *compress) exit(1); } - /* Initialize stream compression preferences */ - if ((compress->options & BACKUP_COMPRESSION_OPTION_LEVEL) == 0) - compresslevel = 0; - else - compresslevel = compress->level; - ret = ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_compressionLevel, - compresslevel); - if (ZSTD_isError(ret)) + /* Set compression level, if specified */ + if ((compress->options & BACKUP_COMPRESSION_OPTION_LEVEL) != 0) { - pg_log_error("could not set zstd compression level to %d: %s", - compresslevel, ZSTD_getErrorName(ret)); - exit(1); + ret = ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_compressionLevel, + compress->level); + if (ZSTD_isError(ret)) + { + pg_log_error("could not set zstd compression level to %d: %s", + compress->level, ZSTD_getErrorName(ret)); + exit(1); + } + } + + /* Set # of workers, if specified */ + if ((compress->options & BACKUP_COMPRESSION_OPTION_WORKERS) != 0) + { + /* + * On older versions of libzstd, this option does not exist, and + * trying to set it will fail. Similarly for newer versions if they + * are compiled without threading support. + */ + ret = ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_nbWorkers, + compress->workers); + if (ZSTD_isError(ret)) + { + pg_log_error("could not set compression worker count to %d: %s", + compress->workers, ZSTD_getErrorName(ret)); + exit(1); + } } /* Initialize the ZSTD output buffer. */ diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 47f3d00ac4..5ba84c2250 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -130,6 +130,11 @@ 'invalid compression specification: found empty string where a compression option was expected', 'failure on extra, empty compression option' ], + [ + 'gzip:workers=3', + 'invalid compression specification: compression algorithm "gzip" does not accept a worker count', + 'failure on worker count for gzip' + ], ); for my $cft (@compression_failure_tests) { diff --git a/src/bin/pg_verifybackup/t/009_extract.pl b/src/bin/pg_verifybackup/t/009_extract.pl index 41a5b370cc..d6f11b9553 100644 --- a/src/bin/pg_verifybackup/t/009_extract.pl +++ b/src/bin/pg_verifybackup/t/009_extract.pl @@ -34,6 +34,12 @@ 'compression_method' => 'zstd', 'backup_flags' => ['--compress', 'server-zstd:5'], 'enabled' => check_pg_config("#define USE_ZSTD 1") + }, + { + 'compression_method' => 'parallel zstd', + 'backup_flags' => ['--compress', 'server-zstd:workers=3'], + 'enabled' => check_pg_config("#define USE_ZSTD 1"), + 'possibly_unsupported' => qr/could not set compression worker count to 3: Unsupported parameter/ } ); @@ -55,8 +61,27 @@ my @verify = ('pg_verifybackup', '-e', $backup_path); # A backup with a valid compression method should work. - $primary->command_ok(\@backup, - "backup done, compression method \"$method\""); + my $backup_stdout = ''; + my $backup_stderr = ''; + my $backup_result = $primary->run_log(\@backup, '>', \$backup_stdout, + '2>', \$backup_stderr); + if ($backup_stdout ne '') + { + print "# standard output was:\n$backup_stdout"; + } + if ($backup_stderr ne '') + { + print "# standard error was:\n$backup_stderr"; + } + if (! $backup_result && $tc->{'possibly_unsupported'} && + $backup_stderr =~ /$tc->{'possibly_unsupported'}/) + { + skip "compression with $method not supported by this build", 2; + } + else + { + ok($backup_result, "backup done, compression $method"); + } # Make sure that it verifies OK. $primary->command_ok(\@verify, diff --git a/src/bin/pg_verifybackup/t/010_client_untar.pl b/src/bin/pg_verifybackup/t/010_client_untar.pl index 488a6d1ede..c1cd12cb06 100644 --- a/src/bin/pg_verifybackup/t/010_client_untar.pl +++ b/src/bin/pg_verifybackup/t/010_client_untar.pl @@ -49,6 +49,15 @@ 'decompress_program' => $ENV{'ZSTD'}, 'decompress_flags' => [ '-d' ], 'enabled' => check_pg_config("#define USE_ZSTD 1") + }, + { + 'compression_method' => 'parallel zstd', + 'backup_flags' => ['--compress', 'client-zstd:workers=3'], + 'backup_archive' => 'base.tar.zst', + 'decompress_program' => $ENV{'ZSTD'}, + 'decompress_flags' => [ '-d' ], + 'enabled' => check_pg_config("#define USE_ZSTD 1"), + 'possibly_unsupported' => qr/could not set compression worker count to 3: Unsupported parameter/ } ); @@ -69,9 +78,27 @@ 'pg_basebackup', '-D', $backup_path, '-Xfetch', '--no-sync', '-cfast', '-Ft'); push @backup, @{$tc->{'backup_flags'}}; - $primary->command_ok(\@backup, - "client side backup, compression $method"); - + my $backup_stdout = ''; + my $backup_stderr = ''; + my $backup_result = $primary->run_log(\@backup, '>', \$backup_stdout, + '2>', \$backup_stderr); + if ($backup_stdout ne '') + { + print "# standard output was:\n$backup_stdout"; + } + if ($backup_stderr ne '') + { + print "# standard error was:\n$backup_stderr"; + } + if (! $backup_result && $tc->{'possibly_unsupported'} && + $backup_stderr =~ /$tc->{'possibly_unsupported'}/) + { + skip "compression with $method not supported by this build", 3; + } + else + { + ok($backup_result, "client side backup, compression $method"); + } # Verify that the we got the files we expected. my $backup_files = join(',', diff --git a/src/common/backup_compression.c b/src/common/backup_compression.c index 0650f975c4..969e08cca2 100644 --- a/src/common/backup_compression.c +++ b/src/common/backup_compression.c @@ -177,6 +177,11 @@ parse_bc_specification(bc_algorithm algorithm, char *specification, result->level = expect_integer_value(keyword, value, result); result->options |= BACKUP_COMPRESSION_OPTION_LEVEL; } + else if (strcmp(keyword, "workers") == 0) + { + result->workers = expect_integer_value(keyword, value, result); + result->options |= BACKUP_COMPRESSION_OPTION_WORKERS; + } else result->parse_error = psprintf(_("unknown compression option \"%s\""), keyword); @@ -266,5 +271,16 @@ validate_bc_specification(bc_specification *spec) min_level, max_level); } + /* + * Of the compression algorithms that we currently support, only zstd + * allows parallel workers. + */ + if ((spec->options & BACKUP_COMPRESSION_OPTION_WORKERS) != 0 && + (spec->algorithm != BACKUP_COMPRESSION_ZSTD)) + { + return psprintf(_("compression algorithm \"%s\" does not accept a worker count"), + get_bc_algorithm_name(spec->algorithm)); + } + return NULL; } diff --git a/src/include/common/backup_compression.h b/src/include/common/backup_compression.h index 0565cbc657..6a0ecaa99c 100644 --- a/src/include/common/backup_compression.h +++ b/src/include/common/backup_compression.h @@ -23,12 +23,14 @@ typedef enum bc_algorithm } bc_algorithm; #define BACKUP_COMPRESSION_OPTION_LEVEL (1 << 0) +#define BACKUP_COMPRESSION_OPTION_WORKERS (1 << 1) typedef struct bc_specification { bc_algorithm algorithm; unsigned options; /* OR of BACKUP_COMPRESSION_OPTION constants */ int level; + int workers; char *parse_error; /* NULL if parsing was OK, else message */ } bc_specification; From b21c4cf95103fae63aeb534f8ee37fbf90a1f907 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 30 Mar 2022 17:08:24 +0200 Subject: [PATCH 308/772] doc: Document range_intersect_agg(anymultirange) It already existed but was not mentioned in the documentation. (Only the anyrange variant was listed.) Author: Paul Jungwirth Reviewed-by: Chapman Flack Discussion: https://www.postgresql.org/message-id/flat/007ef255-35ef-fd26-679c-f97e7a7f30c2@illuminatedcomputing.com --- doc/src/sgml/func.sgml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 93f11faada..8a5cc253f3 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -20022,6 +20022,11 @@ SELECT NULLIF(value, '(none)') ... anyrange ) anymultirange + + range_intersect_agg ( value + anymultirange ) + anymultirange + Computes the intersection of the non-null input values. From cd7ea75e4b1b0c44476bef4f00075b9a4b07733e Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 30 Mar 2022 17:23:13 +0200 Subject: [PATCH 309/772] Additional tests for range_intersect_agg(anymultirange) Author: Paul Jungwirth Reviewed-by: Chapman Flack Discussion: https://www.postgresql.org/message-id/flat/007ef255-35ef-fd26-679c-f97e7a7f30c2@illuminatedcomputing.com --- src/test/regress/expected/multirangetypes.out | 39 +++++++++++++++++++ src/test/regress/sql/multirangetypes.sql | 9 +++++ 2 files changed, 48 insertions(+) diff --git a/src/test/regress/expected/multirangetypes.out b/src/test/regress/expected/multirangetypes.out index bde3f248a7..84c3e7c9f3 100644 --- a/src/test/regress/expected/multirangetypes.out +++ b/src/test/regress/expected/multirangetypes.out @@ -2784,6 +2784,9 @@ FROM (VALUES {[a,f],[g,j)} (1 row) +-- +-- range_intersect_agg function +-- select range_intersect_agg(nmr) from nummultirange_test; range_intersect_agg --------------------- @@ -2796,13 +2799,49 @@ select range_intersect_agg(nmr) from nummultirange_test where false; (1 row) +select range_intersect_agg(null::nummultirange) from nummultirange_test; + range_intersect_agg +--------------------- + +(1 row) + +select range_intersect_agg(nmr) from (values ('{[1,3]}'::nummultirange), ('{[6,12]}'::nummultirange)) t(nmr); + range_intersect_agg +--------------------- + {} +(1 row) + +select range_intersect_agg(nmr) from (values ('{[1,6]}'::nummultirange), ('{[3,12]}'::nummultirange)) t(nmr); + range_intersect_agg +--------------------- + {[3,6]} +(1 row) + +select range_intersect_agg(nmr) from (values ('{[1,6], [10,12]}'::nummultirange), ('{[4,14]}'::nummultirange)) t(nmr); + range_intersect_agg +--------------------- + {[4,6],[10,12]} +(1 row) + -- test with just one input: +select range_intersect_agg(nmr) from (values ('{}'::nummultirange)) t(nmr); + range_intersect_agg +--------------------- + {} +(1 row) + select range_intersect_agg(nmr) from (values ('{[1,2]}'::nummultirange)) t(nmr); range_intersect_agg --------------------- {[1,2]} (1 row) +select range_intersect_agg(nmr) from (values ('{[1,6], [10,12]}'::nummultirange)) t(nmr); + range_intersect_agg +--------------------- + {[1,6],[10,12]} +(1 row) + select range_intersect_agg(nmr) from nummultirange_test where nmr @> 4.0; range_intersect_agg --------------------- diff --git a/src/test/regress/sql/multirangetypes.sql b/src/test/regress/sql/multirangetypes.sql index df1edb4d31..fbc1b9282b 100644 --- a/src/test/regress/sql/multirangetypes.sql +++ b/src/test/regress/sql/multirangetypes.sql @@ -572,10 +572,19 @@ FROM (VALUES ('[h,j)'::textrange) ) t(r); +-- +-- range_intersect_agg function +-- select range_intersect_agg(nmr) from nummultirange_test; select range_intersect_agg(nmr) from nummultirange_test where false; +select range_intersect_agg(null::nummultirange) from nummultirange_test; +select range_intersect_agg(nmr) from (values ('{[1,3]}'::nummultirange), ('{[6,12]}'::nummultirange)) t(nmr); +select range_intersect_agg(nmr) from (values ('{[1,6]}'::nummultirange), ('{[3,12]}'::nummultirange)) t(nmr); +select range_intersect_agg(nmr) from (values ('{[1,6], [10,12]}'::nummultirange), ('{[4,14]}'::nummultirange)) t(nmr); -- test with just one input: +select range_intersect_agg(nmr) from (values ('{}'::nummultirange)) t(nmr); select range_intersect_agg(nmr) from (values ('{[1,2]}'::nummultirange)) t(nmr); +select range_intersect_agg(nmr) from (values ('{[1,6], [10,12]}'::nummultirange)) t(nmr); select range_intersect_agg(nmr) from nummultirange_test where nmr @> 4.0; create table nummultirange_test2(nmr nummultirange); From fb16d2c6588446b00534d90958e6dc312ae52a2f Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Wed, 30 Mar 2022 11:07:05 -0400 Subject: [PATCH 310/772] Make PostgreSQL::Test::Cluster compatible with all live branches MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We do this via a subclass for any branch older than the minimum known to be compatible with the main package (currently release 12). This should be useful for constructing cross-version tests. In theory this could be extended back any number of versions, with varying degrees of compatibility. Reviewed by Michael Paquier and Dagfinn Ilmari Mannsåker Discussion: https://postgr.es/m/a3efd19a-d5c9-fdf2-6094-4cde056a2708@dunslane.net --- src/test/perl/PostgreSQL/Test/Cluster.pm | 79 +++++++++++++++++++++--- 1 file changed, 70 insertions(+), 9 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index b6e3351611..fa0ef12d72 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -111,6 +111,10 @@ use Scalar::Util qw(blessed); our ($use_tcp, $test_localhost, $test_pghost, $last_host_assigned, $last_port_assigned, @all_nodes, $died); +# the minimum version we believe to be compatible with this package without +# subclassing. +our $min_compat = 12; + INIT { @@ -1063,7 +1067,7 @@ sub enable_streaming print "### Enabling streaming replication for node \"$name\"\n"; $self->append_conf( - 'postgresql.conf', qq( + $self->_recovery_file, qq( primary_conninfo='$root_connstr' )); $self->set_standby_mode(); @@ -1092,7 +1096,7 @@ sub enable_restoring : qq{cp "$path/%f" "%p"}; $self->append_conf( - 'postgresql.conf', qq( + $self->_recovery_file, qq( restore_command = '$copy_command' )); if ($standby) @@ -1106,6 +1110,8 @@ restore_command = '$copy_command' return; } +sub _recovery_file { return "postgresql.conf"; } + =pod =item $node->set_recovery_mode() @@ -1305,15 +1311,29 @@ sub new $node->dump_info; - # Add node to list of nodes - push(@all_nodes, $node); - $node->_set_pg_version; - my $v = $node->{_pg_version}; + my $ver = $node->{_pg_version}; - carp("PostgreSQL::Test::Cluster isn't fully compatible with version " . $v) - if $v < 12; + # Use a subclass as defined below (or elsewhere) if this version + # isn't fully compatible. Warn if the version is too old and thus we don't + # have a subclass of this class. + if (ref $ver && $ver < $min_compat) + { + my $maj = $ver->major(separator => '_'); + my $subclass = $class . "::V_$maj"; + if ($subclass->isa($class)) + { + bless $node, $subclass; + } + else + { + carp "PostgreSQL::Test::Cluster isn't fully compatible with version $ver"; + } + } + + # Add node to list of nodes + push(@all_nodes, $node); return $node; } @@ -2602,8 +2622,12 @@ sub wait_for_catchup . "_lsn to pass " . $target_lsn . " on " . $self->name . "\n"; + # Before release 12 walreceiver just set the application name to + # "walreceiver" my $query = - qq[SELECT '$target_lsn' <= ${mode}_lsn AND state = 'streaming' FROM pg_catalog.pg_stat_replication WHERE application_name = '$standby_name';]; + qq[SELECT '$target_lsn' <= ${mode}_lsn AND state = 'streaming' + FROM pg_catalog.pg_stat_replication + WHERE application_name IN ('$standby_name', 'walreceiver')]; $self->poll_query_until('postgres', $query) or croak "timed out waiting for catchup"; print "done\n"; @@ -2890,4 +2914,41 @@ sub corrupt_page_checksum =cut +########################################################################## + +package PostgreSQL::Test::Cluster::V_11; ## no critic (ProhibitMultiplePackages) + +use parent -norequire, qw(PostgreSQL::Test::Cluster); + +# https://www.postgresql.org/docs/11/release-11.html + +# max_wal_senders + superuser_reserved_connections must be < max_connections +# uses recovery.conf + +sub _recovery_file { return "recovery.conf"; } + +sub set_standby_mode +{ + my $self = shift; + $self->append_conf("recovery.conf", "standby_mode = on\n"); +} + +sub init +{ + my ($self, %params) = @_; + $self->SUPER::init(%params); + $self->adjust_conf('postgresql.conf', 'max_wal_senders', + $params{allows_streaming} ? 5 : 0); +} + +########################################################################## + +package PostgreSQL::Test::Cluster::V_10; ## no critic (ProhibitMultiplePackages) + +use parent -norequire, qw(PostgreSQL::Test::Cluster::V_11); + +# https://www.postgresql.org/docs/10/release-10.html + +######################################################################## + 1; From f453d684ecf9f6cd872d4bb43fe385c2c56126bd Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 30 Mar 2022 17:48:56 +0200 Subject: [PATCH 311/772] Change some internal error messages to elogs Author: Paul Jungwirth Reviewed-by: Chapman Flack Discussion: https://www.postgresql.org/message-id/flat/007ef255-35ef-fd26-679c-f97e7a7f30c2@illuminatedcomputing.com --- src/backend/utils/adt/multirangetypes.c | 8 ++------ src/backend/utils/adt/rangetypes.c | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/backend/utils/adt/multirangetypes.c b/src/backend/utils/adt/multirangetypes.c index c474b24431..2fa779998e 100644 --- a/src/backend/utils/adt/multirangetypes.c +++ b/src/backend/utils/adt/multirangetypes.c @@ -1345,9 +1345,7 @@ range_agg_transfn(PG_FUNCTION_ARGS) rngtypoid = get_fn_expr_argtype(fcinfo->flinfo, 1); if (!type_is_range(rngtypoid)) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("range_agg must be called with a range"))); + elog(ERROR, "range_agg must be called with a range"); if (PG_ARGISNULL(0)) state = initArrayResult(rngtypoid, aggContext, false); @@ -1416,9 +1414,7 @@ multirange_intersect_agg_transfn(PG_FUNCTION_ARGS) mltrngtypoid = get_fn_expr_argtype(fcinfo->flinfo, 1); if (!type_is_multirange(mltrngtypoid)) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("range_intersect_agg must be called with a multirange"))); + elog(ERROR, "range_intersect_agg must be called with a multirange"); typcache = multirange_get_typcache(fcinfo, mltrngtypoid); diff --git a/src/backend/utils/adt/rangetypes.c b/src/backend/utils/adt/rangetypes.c index cbff4e93d5..aa4c53e0ae 100644 --- a/src/backend/utils/adt/rangetypes.c +++ b/src/backend/utils/adt/rangetypes.c @@ -1211,7 +1211,7 @@ range_intersect_agg_transfn(PG_FUNCTION_ARGS) rngtypoid = get_fn_expr_argtype(fcinfo->flinfo, 1); if (!type_is_range(rngtypoid)) - ereport(ERROR, (errmsg("range_intersect_agg must be called with a range"))); + elog(ERROR, "range_intersect_agg must be called with a range"); typcache = range_get_typcache(fcinfo, rngtypoid); From ff50baec65bba1a839322ba8bcb3efcd08f40621 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 30 Mar 2022 09:33:28 -0700 Subject: [PATCH 312/772] ci: enable zstd where available. Since zstd is now used in a bunch of places, enable it in CI. The windows image unfortunately doesn't yet contain zstd, so it's not enabled there. Discussion: https://postgr.es/m/20220330155017.lfnlzt3m42nk7kff@alap3.anarazel.de --- .cirrus.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 171bd29cf0..7b883b462a 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -101,6 +101,7 @@ task: --with-ssl=openssl \ --with-tcl --with-tclconfig=/usr/local/lib/tcl8.6/ \ --with-uuid=bsd \ + --with-zstd \ \ --with-includes=/usr/local/include \ --with-libs=/usr/local/lib \ @@ -142,6 +143,7 @@ LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >- --with-systemd --with-tcl --with-tclconfig=/usr/lib/tcl8.6/ --with-uuid=ossp + --with-zstd task: @@ -270,7 +272,8 @@ task: openldap \ openssl \ python \ - tcl-tk + tcl-tk \ + zstd brew cleanup -s # to reduce cache size upload_caches: homebrew @@ -282,7 +285,7 @@ task: INCLUDES="${brewpath}/include:${INCLUDES}" LIBS="${brewpath}/lib:${LIBS}" - for pkg in icu4c krb5 openldap openssl ; do + for pkg in icu4c krb5 openldap openssl zstd ; do pkgpath="${brewpath}/opt/${pkg}" INCLUDES="${pkgpath}/include:${INCLUDES}" LIBS="${pkgpath}/lib:${LIBS}" @@ -307,6 +310,7 @@ task: --with-ssl=openssl \ --with-tcl --with-tclconfig=${brewpath}/opt/tcl-tk/lib/ \ --with-uuid=e2fs \ + --with-zstd \ \ --prefix=${HOME}/install \ --with-includes="${INCLUDES}" \ From 7ae1619bc5b1794938c7387a766b8cae34e38d8a Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 30 Mar 2022 20:12:53 +0200 Subject: [PATCH 313/772] Add range_agg with multirange inputs range_agg for normal ranges already existed. A lot of code can be shared. Author: Paul Jungwirth Reviewed-by: Chapman Flack Discussion: https://www.postgresql.org/message-id/flat/007ef255-35ef-fd26-679c-f97e7a7f30c2@illuminatedcomputing.com --- doc/src/sgml/func.sgml | 5 ++ src/backend/utils/adt/multirangetypes.c | 61 +++++++++++++++++++ src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_aggregate.dat | 3 + src/include/catalog/pg_proc.dat | 11 ++++ src/test/regress/expected/multirangetypes.out | 61 +++++++++++++++++++ src/test/regress/expected/opr_sanity.out | 3 +- src/test/regress/sql/multirangetypes.sql | 12 ++++ 8 files changed, 156 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 8a5cc253f3..4001cb2bda 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -20007,6 +20007,11 @@ SELECT NULLIF(value, '(none)') ... anyrange ) anymultirange + + range_agg ( value + anymultirange ) + anymultirange + Computes the union of the non-null input values. diff --git a/src/backend/utils/adt/multirangetypes.c b/src/backend/utils/adt/multirangetypes.c index 2fa779998e..efd8584a3d 100644 --- a/src/backend/utils/adt/multirangetypes.c +++ b/src/backend/utils/adt/multirangetypes.c @@ -1361,6 +1361,9 @@ range_agg_transfn(PG_FUNCTION_ARGS) /* * range_agg_finalfn: use our internal array to merge touching ranges. + * + * Shared by range_agg_finalfn(anyrange) and + * multirange_agg_finalfn(anymultirange). */ Datum range_agg_finalfn(PG_FUNCTION_ARGS) @@ -1396,6 +1399,64 @@ range_agg_finalfn(PG_FUNCTION_ARGS) PG_RETURN_MULTIRANGE_P(make_multirange(mltrngtypoid, typcache->rngtype, range_count, ranges)); } +/* + * multirange_agg_transfn: combine adjacent/overlapping multiranges. + * + * All we do here is gather the input multiranges' ranges into an array so + * that the finalfn can sort and combine them. + */ +Datum +multirange_agg_transfn(PG_FUNCTION_ARGS) +{ + MemoryContext aggContext; + Oid mltrngtypoid; + TypeCacheEntry *typcache; + TypeCacheEntry *rngtypcache; + ArrayBuildState *state; + + if (!AggCheckCallContext(fcinfo, &aggContext)) + elog(ERROR, "multirange_agg_transfn called in non-aggregate context"); + + mltrngtypoid = get_fn_expr_argtype(fcinfo->flinfo, 1); + if (!type_is_multirange(mltrngtypoid)) + elog(ERROR, "range_agg must be called with a multirange"); + + typcache = multirange_get_typcache(fcinfo, mltrngtypoid); + rngtypcache = typcache->rngtype; + + if (PG_ARGISNULL(0)) + state = initArrayResult(rngtypcache->type_id, aggContext, false); + else + state = (ArrayBuildState *) PG_GETARG_POINTER(0); + + /* skip NULLs */ + if (!PG_ARGISNULL(1)) + { + MultirangeType *current; + int32 range_count; + RangeType **ranges; + + current = PG_GETARG_MULTIRANGE_P(1); + multirange_deserialize(rngtypcache, current, &range_count, &ranges); + if (range_count == 0) + { + /* + * Add an empty range so we get an empty result (not a null result). + */ + accumArrayResult(state, + RangeTypePGetDatum(make_empty_range(rngtypcache)), + false, rngtypcache->type_id, aggContext); + } + else + { + for (int32 i = 0; i < range_count; i++) + accumArrayResult(state, RangeTypePGetDatum(ranges[i]), false, rngtypcache->type_id, aggContext); + } + } + + PG_RETURN_POINTER(state); +} + Datum multirange_intersect_agg_transfn(PG_FUNCTION_ARGS) { diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 96649193d9..cb26c967ad 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202203291 +#define CATALOG_VERSION_NO 202203301 #endif diff --git a/src/include/catalog/pg_aggregate.dat b/src/include/catalog/pg_aggregate.dat index 1934f19335..62156346cf 100644 --- a/src/include/catalog/pg_aggregate.dat +++ b/src/include/catalog/pg_aggregate.dat @@ -563,6 +563,9 @@ { aggfnoid => 'range_agg(anyrange)', aggtransfn => 'range_agg_transfn', aggfinalfn => 'range_agg_finalfn', aggfinalextra => 't', aggtranstype => 'internal' }, +{ aggfnoid => 'range_agg(anymultirange)', aggtransfn => 'multirange_agg_transfn', + aggfinalfn => 'multirange_agg_finalfn', aggfinalextra => 't', + aggtranstype => 'internal' }, # json { aggfnoid => 'json_agg', aggtransfn => 'json_agg_transfn', diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 01e1dd4d6d..25304430f4 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -10688,6 +10688,17 @@ proname => 'range_agg', prokind => 'a', proisstrict => 'f', prorettype => 'anymultirange', proargtypes => 'anyrange', prosrc => 'aggregate_dummy' }, +{ oid => '8205', descr => 'aggregate transition function', + proname => 'multirange_agg_transfn', proisstrict => 'f', prorettype => 'internal', + proargtypes => 'internal anymultirange', prosrc => 'multirange_agg_transfn' }, +{ oid => '8206', descr => 'aggregate final function', + proname => 'multirange_agg_finalfn', proisstrict => 'f', + prorettype => 'anymultirange', proargtypes => 'internal anymultirange', + prosrc => 'range_agg_finalfn' }, +{ oid => '8207', descr => 'combine aggregate input into a multirange', + proname => 'range_agg', prokind => 'a', proisstrict => 'f', + prorettype => 'anymultirange', proargtypes => 'anymultirange', + prosrc => 'aggregate_dummy' }, { oid => '4388', descr => 'range aggregate by intersecting', proname => 'multirange_intersect_agg_transfn', prorettype => 'anymultirange', proargtypes => 'anymultirange anymultirange', diff --git a/src/test/regress/expected/multirangetypes.out b/src/test/regress/expected/multirangetypes.out index 84c3e7c9f3..ac2eb84c3a 100644 --- a/src/test/regress/expected/multirangetypes.out +++ b/src/test/regress/expected/multirangetypes.out @@ -2784,6 +2784,67 @@ FROM (VALUES {[a,f],[g,j)} (1 row) +-- range_agg with multirange inputs +select range_agg(nmr) from nummultirange_test; + range_agg +----------- + {(,)} +(1 row) + +select range_agg(nmr) from nummultirange_test where false; + range_agg +----------- + +(1 row) + +select range_agg(null::nummultirange) from nummultirange_test; + range_agg +----------- + +(1 row) + +select range_agg(nmr) from (values ('{}'::nummultirange)) t(nmr); + range_agg +----------- + {} +(1 row) + +select range_agg(nmr) from (values ('{}'::nummultirange), ('{}'::nummultirange)) t(nmr); + range_agg +----------- + {} +(1 row) + +select range_agg(nmr) from (values ('{[1,2]}'::nummultirange)) t(nmr); + range_agg +----------- + {[1,2]} +(1 row) + +select range_agg(nmr) from (values ('{[1,2], [5,6]}'::nummultirange)) t(nmr); + range_agg +--------------- + {[1,2],[5,6]} +(1 row) + +select range_agg(nmr) from (values ('{[1,2], [2,3]}'::nummultirange)) t(nmr); + range_agg +----------- + {[1,3]} +(1 row) + +select range_agg(nmr) from (values ('{[1,2]}'::nummultirange), ('{[5,6]}'::nummultirange)) t(nmr); + range_agg +--------------- + {[1,2],[5,6]} +(1 row) + +select range_agg(nmr) from (values ('{[1,2]}'::nummultirange), ('{[2,3]}'::nummultirange)) t(nmr); + range_agg +----------- + {[1,3]} +(1 row) + -- -- range_intersect_agg function -- diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out index 15e4016836..86d755aa44 100644 --- a/src/test/regress/expected/opr_sanity.out +++ b/src/test/regress/expected/opr_sanity.out @@ -201,7 +201,8 @@ ORDER BY 1, 2; timestamp without time zone | timestamp with time zone bit | bit varying txid_snapshot | pg_snapshot -(4 rows) + anyrange | anymultirange +(5 rows) SELECT DISTINCT p1.proargtypes[2]::regtype, p2.proargtypes[2]::regtype FROM pg_proc AS p1, pg_proc AS p2 diff --git a/src/test/regress/sql/multirangetypes.sql b/src/test/regress/sql/multirangetypes.sql index fbc1b9282b..1abcaeddb5 100644 --- a/src/test/regress/sql/multirangetypes.sql +++ b/src/test/regress/sql/multirangetypes.sql @@ -572,6 +572,18 @@ FROM (VALUES ('[h,j)'::textrange) ) t(r); +-- range_agg with multirange inputs +select range_agg(nmr) from nummultirange_test; +select range_agg(nmr) from nummultirange_test where false; +select range_agg(null::nummultirange) from nummultirange_test; +select range_agg(nmr) from (values ('{}'::nummultirange)) t(nmr); +select range_agg(nmr) from (values ('{}'::nummultirange), ('{}'::nummultirange)) t(nmr); +select range_agg(nmr) from (values ('{[1,2]}'::nummultirange)) t(nmr); +select range_agg(nmr) from (values ('{[1,2], [5,6]}'::nummultirange)) t(nmr); +select range_agg(nmr) from (values ('{[1,2], [2,3]}'::nummultirange)) t(nmr); +select range_agg(nmr) from (values ('{[1,2]}'::nummultirange), ('{[5,6]}'::nummultirange)) t(nmr); +select range_agg(nmr) from (values ('{[1,2]}'::nummultirange), ('{[2,3]}'::nummultirange)) t(nmr); + -- -- range_intersect_agg function -- From 26a0c025e233c3d4333f071bde4ac970ba1ec643 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 29 Mar 2022 10:06:07 -0400 Subject: [PATCH 314/772] Document basebackup_to_shell.required_role. Omission noted by Joe Conway. Discussion: https://postgr.es/m/CA+Tgmoat+zbzzZQJ7poXyUwiqxQxTaUid=auB4FejZ15VvDh4Q@mail.gmail.com Discussion: https://postgr.es/m/744cf762-47d3-050f-5fa1-d4f9e8dbae2e@joeconway.com --- doc/src/sgml/basebackup-to-shell.sgml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/doc/src/sgml/basebackup-to-shell.sgml b/doc/src/sgml/basebackup-to-shell.sgml index f36f37e510..9f44071d50 100644 --- a/doc/src/sgml/basebackup-to-shell.sgml +++ b/doc/src/sgml/basebackup-to-shell.sgml @@ -55,6 +55,23 @@ + + + + basebackup_to_shell.required_role (string) + + basebackup_to_shell.required_role configuration parameter + + + + + A role which replication whose privileges users are required to possess + in order to make use of the shell backup target. + If this is not set, any replication user may make use of the + shell backup target. + + + From 027fa0fd72619a56d9d8877eedcb514331b63fa4 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 30 Mar 2022 15:47:02 -0400 Subject: [PATCH 315/772] basebackup_to_shell: Add TAP test. Per gripe from Andres Freund. Thanks to Andres Freund, Thomas Munro, and Andrew Dunstan for advice on how to make this test work even on Windows. Discussion: https://postgr.es/m/CA+Tgmoat+zbzzZQJ7poXyUwiqxQxTaUid=auB4FejZ15VvDh4Q@mail.gmail.com --- contrib/basebackup_to_shell/Makefile | 5 + contrib/basebackup_to_shell/t/001_basic.pl | 129 +++++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 contrib/basebackup_to_shell/t/001_basic.pl diff --git a/contrib/basebackup_to_shell/Makefile b/contrib/basebackup_to_shell/Makefile index f31dfaae9c..58bd26991a 100644 --- a/contrib/basebackup_to_shell/Makefile +++ b/contrib/basebackup_to_shell/Makefile @@ -7,6 +7,11 @@ OBJS = \ PGFILEDESC = "basebackup_to_shell - target basebackup to shell command" +TAP_TESTS = 1 + +export GZIP_PROGRAM=$(GZIP) +export TAR + ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) diff --git a/contrib/basebackup_to_shell/t/001_basic.pl b/contrib/basebackup_to_shell/t/001_basic.pl new file mode 100644 index 0000000000..57534b62c8 --- /dev/null +++ b/contrib/basebackup_to_shell/t/001_basic.pl @@ -0,0 +1,129 @@ +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +use strict; +use warnings; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# For testing purposes, we just want basebackup_to_shell to write standard +# input to a file. However, Windows doesn't have "cat" or any equivalent, so +# we use "gzip" for this purpose. +my $gzip = $ENV{'GZIP_PROGRAM'}; +if (!defined $gzip || $gzip eq '') +{ + plan skip_all => 'gzip not available'; +} + +my $node = PostgreSQL::Test::Cluster->new('primary'); +$node->init('allows_streaming' => 1); +$node->append_conf('postgresql.conf', + "shared_preload_libraries = 'basebackup_to_shell'"); +$node->start; +$node->safe_psql('postgres', 'CREATE USER backupuser REPLICATION'); +$node->safe_psql('postgres', 'CREATE ROLE trustworthy'); + +# For nearly all pg_basebackup invocations some options should be specified, +# to keep test times reasonable. Using @pg_basebackup_defs as the first +# element of the array passed to IPC::Run interpolate the array (as it is +# not a reference to an array)... +my @pg_basebackup_defs = ('pg_basebackup', '--no-sync', '-cfast'); + +# This particular test module generally wants to run with -Xfetch, because +# -Xstream is not supported with a backup target, and with -U backupuser. +my @pg_basebackup_cmd = (@pg_basebackup_defs, '-U', 'backupuser', '-Xfetch'); + +# Can't use this module without setting basebackup_to_shell.command. +$node->command_fails_like( + [ @pg_basebackup_cmd, '--target', 'shell' ], + qr/shell command for backup is not configured/, + 'fails if basebackup_to_shell.command is not set'); + +# Configure basebackup_to_shell.command and reload the configuation file. +my $backup_path = PostgreSQL::Test::Utils::tempdir; +my $escaped_backup_path = $backup_path; +$escaped_backup_path =~ s{\\}{\\\\}g if ($PostgreSQL::Test::Utils::windows_os); +my $shell_command = + $PostgreSQL::Test::Utils::windows_os + ? qq{$gzip --fast > "$escaped_backup_path\\\\%f.gz"} + : qq{$gzip --fast > "$escaped_backup_path/%f.gz"}; +$node->append_conf('postgresql.conf', + "basebackup_to_shell.command='$shell_command'"); +$node->reload(); + +# Should work now. +$node->command_ok( + [ @pg_basebackup_cmd, '--target', 'shell' ], + 'backup with no detail: pg_basebackup'); +verify_backup('', $backup_path, "backup with no detail"); + +# Should fail with a detail. +$node->command_fails_like( + [ @pg_basebackup_cmd, '--target', 'shell:foo' ], + qr/a target detail is not permitted because the configured command does not include %d/, + 'fails if detail provided without %d'); + +# Reconfigure to restrict access and require a detail. +$shell_command = + $PostgreSQL::Test::Utils::windows_os + ? qq{$gzip --fast > "$escaped_backup_path\\\\%d.%f.gz"} + : qq{$gzip --fast > "$escaped_backup_path/%d.%f.gz"}; +$node->append_conf('postgresql.conf', + "basebackup_to_shell.command='$shell_command'"); +$node->append_conf('postgresql.conf', + "basebackup_to_shell.required_role='trustworthy'"); +$node->reload(); + +# Should fail due to lack of permission. +$node->command_fails_like( + [ @pg_basebackup_cmd, '--target', 'shell' ], + qr/permission denied to use basebackup_to_shell/, + 'fails if required_role not granted'); + +# Should fail due to lack of a detail. +$node->safe_psql('postgres', 'GRANT trustworthy TO backupuser'); +$node->command_fails_like( + [ @pg_basebackup_cmd, '--target', 'shell' ], + qr/a target detail is required because the configured command includes %d/, + 'fails if %d is present and detail not given'); + +# Should work. +$node->command_ok( + [ @pg_basebackup_cmd, '--target', 'shell:bar' ], + 'backup with detail: pg_basebackup'); +verify_backup('bar.', $backup_path, "backup with detail"); + +done_testing(); + +sub verify_backup +{ + my ($prefix, $backup_dir, $test_name) = @_; + + ok(-f "$backup_dir/${prefix}backup_manifest.gz", + "$test_name: backup_manifest.gz was created"); + ok(-f "$backup_dir/${prefix}base.tar.gz", + "$test_name: base.tar.gz was created"); + + SKIP: { + my $tar = $ENV{TAR}; + skip "no tar program available", 1 if (!defined $tar || $tar eq ''); + + # Decompress. + system_or_bail($gzip, '-d', + $backup_dir . '/' . $prefix . 'backup_manifest.gz'); + system_or_bail($gzip, '-d', + $backup_dir . '/' . $prefix . 'base.tar.gz'); + + # Untar. + my $extract_path = PostgreSQL::Test::Utils::tempdir; + system_or_bail($tar, 'xf', $backup_dir . '/' . $prefix . 'base.tar', + '-C', $extract_path); + + # Verify. + $node->command_ok([ 'pg_verifybackup', '-n', + '-m', "${backup_dir}/${prefix}backup_manifest", + '-e', $extract_path ], + "$test_name: backup verifies ok"); + } +} From 8e053dc6dfbee4ae412e98ad73cfd4662d7453ac Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 30 Mar 2022 15:53:08 -0400 Subject: [PATCH 316/772] Fix possible NULL-pointer-deference in backup_compression.c. Per Coverity and Tom Lane. Reviewed by Tom Lane and Justin Pryzby. Discussion: http://postgr.es/m/384291.1648403267@sss.pgh.pa.us --- src/common/backup_compression.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/common/backup_compression.c b/src/common/backup_compression.c index 969e08cca2..867f2f2eb5 100644 --- a/src/common/backup_compression.c +++ b/src/common/backup_compression.c @@ -191,8 +191,16 @@ parse_bc_specification(bc_algorithm algorithm, char *specification, if (value != NULL) pfree(value); - /* If we got an error or have reached the end of the string, stop. */ - if (result->parse_error != NULL || *kwend == '\0' || *vend == '\0') + /* + * If we got an error or have reached the end of the string, stop. + * + * If there is no value, then the end of the keyword might have been + * the end of the string. If there is a value, then the end of the + * keyword cannot have been the end of the string, but the end of the + * value might have been. + */ + if (result->parse_error != NULL || + (vend == NULL ? *kwend == '\0' : *vend == '\0')) break; /* Advance to next entry and loop around. */ From 606948b058dc16bce494270eea577011a602810e Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 3 Mar 2022 13:15:13 -0500 Subject: [PATCH 317/772] SQL JSON functions This Patch introduces three SQL standard JSON functions: JSON() (incorrectly mentioned in my commit message for f4fb45d15c) JSON_SCALAR() JSON_SERIALIZE() JSON() produces json values from text, bytea, json or jsonb values, and has facilitites for handling duplicate keys. JSON_SCALAR() produces a json value from any scalar sql value, including json and jsonb. JSON_SERIALIZE() produces text or bytea from input which containis or represents json or jsonb; For the most part these functions don't add any significant new capabilities, but they will be of use to users wanting standard compliant JSON handling. Nikita Glukhov Reviewers have included (in no particular order) Andres Freund, Alexander Korotkov, Pavel Stehule, Andrew Alsup, Erik Rijkers, Zihong Yu, Himanshu Upadhyaya, Daniel Gustafsson, Justin Pryzby. Discussion: https://postgr.es/m/cd0bb935-0158-78a7-08b5-904886deac4b@postgrespro.ru --- doc/src/sgml/keywords/sql2016-02-reserved.txt | 3 + src/backend/executor/execExpr.c | 45 +++ src/backend/executor/execExprInterp.c | 42 ++- src/backend/nodes/copyfuncs.c | 53 ++++ src/backend/nodes/equalfuncs.c | 38 +++ src/backend/nodes/nodeFuncs.c | 14 + src/backend/parser/gram.y | 56 +++- src/backend/parser/parse_expr.c | 152 +++++++++- src/backend/parser/parse_target.c | 9 + src/backend/utils/adt/format_type.c | 4 + src/backend/utils/adt/json.c | 51 ++-- src/backend/utils/adt/jsonb.c | 64 ++--- src/backend/utils/adt/ruleutils.c | 13 +- src/include/executor/execExpr.h | 5 + src/include/nodes/nodes.h | 3 + src/include/nodes/parsenodes.h | 35 +++ src/include/nodes/primnodes.h | 5 +- src/include/parser/kwlist.h | 4 +- src/include/utils/json.h | 21 +- src/include/utils/jsonb.h | 21 ++ src/test/regress/expected/sqljson.out | 267 ++++++++++++++++++ src/test/regress/sql/sqljson.sql | 57 ++++ 22 files changed, 880 insertions(+), 82 deletions(-) diff --git a/doc/src/sgml/keywords/sql2016-02-reserved.txt b/doc/src/sgml/keywords/sql2016-02-reserved.txt index ae11012388..7ba4208398 100644 --- a/doc/src/sgml/keywords/sql2016-02-reserved.txt +++ b/doc/src/sgml/keywords/sql2016-02-reserved.txt @@ -156,12 +156,15 @@ INTERVAL INTO IS JOIN +JSON JSON_ARRAY JSON_ARRAYAGG JSON_EXISTS JSON_OBJECT JSON_OBJECTAGG JSON_QUERY +JSON_SCALAR +JSON_SERIALIZE JSON_TABLE JSON_TABLE_PRIMITIVE JSON_VALUE diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index 1c364a7f4c..d4d3850ec7 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -47,6 +47,8 @@ #include "utils/array.h" #include "utils/builtins.h" #include "utils/datum.h" +#include "utils/json.h" +#include "utils/jsonb.h" #include "utils/jsonpath.h" #include "utils/lsyscache.h" #include "utils/typcache.h" @@ -2460,6 +2462,12 @@ ExecInitExprRec(Expr *node, ExprState *state, { ExecInitExprRec(ctor->func, state, resv, resnull); } + else if ((ctor->type == JSCTOR_JSON_PARSE && !ctor->unique) || + ctor->type == JSCTOR_JSON_SERIALIZE) + { + /* Use the value of the first argument as a result */ + ExecInitExprRec(linitial(args), state, resv, resnull); + } else { scratch.opcode = EEOP_JSON_CONSTRUCTOR; @@ -2492,6 +2500,43 @@ ExecInitExprRec(Expr *node, ExprState *state, argno++; } + /* prepare type cache for datum_to_json[b]() */ + if (ctor->type == JSCTOR_JSON_SCALAR) + { + bool is_jsonb = + ctor->returning->format->format_type == JS_FORMAT_JSONB; + + scratch.d.json_constructor.arg_type_cache = + palloc(sizeof(*scratch.d.json_constructor.arg_type_cache) * nargs); + + for (int i = 0; i < nargs; i++) + { + int category; + Oid outfuncid; + Oid typid = scratch.d.json_constructor.arg_types[i]; + + if (is_jsonb) + { + JsonbTypeCategory jbcat; + + jsonb_categorize_type(typid, &jbcat, &outfuncid); + + category = (int) jbcat; + } + else + { + JsonTypeCategory jscat; + + json_categorize_type(typid, &jscat, &outfuncid); + + category = (int) jscat; + } + + scratch.d.json_constructor.arg_type_cache[i].outfuncid = outfuncid; + scratch.d.json_constructor.arg_type_cache[i].category = category; + } + } + ExprEvalPushStep(state, &scratch); } diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index 1215f707e2..7d4253d970 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -3982,7 +3982,7 @@ ExecEvalJsonIsPredicate(ExprState *state, ExprEvalStep *op) * JSON text validation. */ if (res && (pred->unique_keys || exprtype == TEXTOID)) - res = json_validate(json, pred->unique_keys); + res = json_validate(json, pred->unique_keys, false); } else if (exprtype == JSONBOID) { @@ -4527,6 +4527,46 @@ ExecEvalJsonConstructor(ExprState *state, ExprEvalStep *op, op->d.json_constructor.arg_types, op->d.json_constructor.constructor->absent_on_null, op->d.json_constructor.constructor->unique); + else if (ctor->type == JSCTOR_JSON_SCALAR) + { + if (op->d.json_constructor.arg_nulls[0]) + { + res = (Datum) 0; + isnull = true; + } + else + { + Datum value = op->d.json_constructor.arg_values[0]; + int category = op->d.json_constructor.arg_type_cache[0].category; + Oid outfuncid = op->d.json_constructor.arg_type_cache[0].outfuncid; + + if (is_jsonb) + res = to_jsonb_worker(value, category, outfuncid); + else + res = to_json_worker(value, category, outfuncid); + } + } + else if (ctor->type == JSCTOR_JSON_PARSE) + { + if (op->d.json_constructor.arg_nulls[0]) + { + res = (Datum) 0; + isnull = true; + } + else + { + Datum value = op->d.json_constructor.arg_values[0]; + text *js = DatumGetTextP(value); + + if (is_jsonb) + res = jsonb_from_text(js, true); + else + { + (void) json_validate(js, true, true); + res = value; + } + } + } else { res = (Datum) 0; diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index c42d2ed814..56505557bf 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -2345,6 +2345,50 @@ _copyJsonValueExpr(const JsonValueExpr *from) return newnode; } +/* + * _copyJsonParseExpr + */ +static JsonParseExpr * +_copyJsonParseExpr(const JsonParseExpr *from) +{ + JsonParseExpr *newnode = makeNode(JsonParseExpr); + + COPY_NODE_FIELD(expr); + COPY_SCALAR_FIELD(unique_keys); + COPY_LOCATION_FIELD(location); + + return newnode; +} + +/* + * _copyJsonScalarExpr + */ +static JsonScalarExpr * +_copyJsonScalarExpr(const JsonScalarExpr *from) +{ + JsonScalarExpr *newnode = makeNode(JsonScalarExpr); + + COPY_NODE_FIELD(expr); + COPY_LOCATION_FIELD(location); + + return newnode; +} + +/* + * _copyJsonSerializeExpr + */ +static JsonSerializeExpr * +_copyJsonSerializeExpr(const JsonSerializeExpr *from) +{ + JsonSerializeExpr *newnode = makeNode(JsonSerializeExpr); + + COPY_NODE_FIELD(expr); + COPY_NODE_FIELD(output); + COPY_LOCATION_FIELD(location); + + return newnode; +} + /* * _copyJsonConstructorExpr */ @@ -5744,6 +5788,15 @@ copyObjectImpl(const void *from) case T_JsonValueExpr: retval = _copyJsonValueExpr(from); break; + case T_JsonParseExpr: + retval = _copyJsonParseExpr(from); + break; + case T_JsonScalarExpr: + retval = _copyJsonScalarExpr(from); + break; + case T_JsonSerializeExpr: + retval = _copyJsonSerializeExpr(from); + break; case T_JsonKeyValue: retval = _copyJsonKeyValue(from); break; diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index f6dd61370c..9ea3c5abf2 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -871,6 +871,35 @@ _equalJsonValueExpr(const JsonValueExpr *a, const JsonValueExpr *b) return true; } +static bool +_equalJsonParseExpr(const JsonParseExpr *a, const JsonParseExpr *b) +{ + COMPARE_NODE_FIELD(expr); + COMPARE_SCALAR_FIELD(unique_keys); + COMPARE_LOCATION_FIELD(location); + + return true; +} + +static bool +_equalJsonScalarExpr(const JsonScalarExpr *a, const JsonScalarExpr *b) +{ + COMPARE_NODE_FIELD(expr); + COMPARE_LOCATION_FIELD(location); + + return true; +} + +static bool +_equalJsonSerializeExpr(const JsonSerializeExpr *a, const JsonSerializeExpr *b) +{ + COMPARE_NODE_FIELD(expr); + COMPARE_NODE_FIELD(output); + COMPARE_LOCATION_FIELD(location); + + return true; +} + static bool _equalJsonConstructorExpr(const JsonConstructorExpr *a, const JsonConstructorExpr *b) { @@ -3661,6 +3690,15 @@ equal(const void *a, const void *b) case T_JsonValueExpr: retval = _equalJsonValueExpr(a, b); break; + case T_JsonParseExpr: + retval = _equalJsonParseExpr(a, b); + break; + case T_JsonScalarExpr: + retval = _equalJsonScalarExpr(a, b); + break; + case T_JsonSerializeExpr: + retval = _equalJsonSerializeExpr(a, b); + break; case T_JsonConstructorExpr: retval = _equalJsonConstructorExpr(a, b); break; diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index c0a83471e1..4789ba6911 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -4363,6 +4363,20 @@ raw_expression_tree_walker(Node *node, return true; } break; + case T_JsonParseExpr: + return walker(((JsonParseExpr *) node)->expr, context); + case T_JsonScalarExpr: + return walker(((JsonScalarExpr *) node)->expr, context); + case T_JsonSerializeExpr: + { + JsonSerializeExpr *jse = (JsonSerializeExpr *) node; + + if (walker(jse->expr, context)) + return true; + if (walker(jse->output, context)) + return true; + } + break; case T_JsonConstructorExpr: { JsonConstructorExpr *ctor = (JsonConstructorExpr *) node; diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 8ad8512e4c..eefcf90187 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -568,7 +568,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type copy_options %type Typename SimpleTypename ConstTypename - GenericType Numeric opt_float + GenericType Numeric opt_float JsonType Character ConstCharacter CharacterWithLength CharacterWithoutLength ConstDatetime ConstInterval @@ -656,6 +656,9 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); json_value_func_expr json_query_expr json_exists_predicate + json_parse_expr + json_scalar_expr + json_serialize_expr json_api_common_syntax json_context_item json_argument @@ -776,7 +779,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION JOIN JSON JSON_ARRAY JSON_ARRAYAGG JSON_EXISTS JSON_OBJECT JSON_OBJECTAGG - JSON_QUERY JSON_VALUE + JSON_QUERY JSON_SCALAR JSON_SERIALIZE JSON_VALUE KEY KEYS KEEP @@ -13345,6 +13348,7 @@ SimpleTypename: $$->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1), makeIntConst($3, @3)); } + | JsonType { $$ = $1; } ; /* We have a separate ConstTypename to allow defaulting fixed-length @@ -13363,6 +13367,7 @@ ConstTypename: | ConstBit { $$ = $1; } | ConstCharacter { $$ = $1; } | ConstDatetime { $$ = $1; } + | JsonType { $$ = $1; } ; /* @@ -13731,6 +13736,13 @@ interval_second: } ; +JsonType: + JSON + { + $$ = SystemTypeName("json"); + $$->location = @1; + } + ; /***************************************************************************** * @@ -15596,8 +15608,42 @@ json_func_expr: | json_value_func_expr | json_query_expr | json_exists_predicate + | json_parse_expr + | json_scalar_expr + | json_serialize_expr + ; + +json_parse_expr: + JSON '(' json_value_expr json_key_uniqueness_constraint_opt ')' + { + JsonParseExpr *n = makeNode(JsonParseExpr); + n->expr = (JsonValueExpr *) $3; + n->unique_keys = $4; + n->location = @1; + $$ = (Node *) n; + } + ; + +json_scalar_expr: + JSON_SCALAR '(' a_expr ')' + { + JsonScalarExpr *n = makeNode(JsonScalarExpr); + n->expr = (Expr *) $3; + n->location = @1; + $$ = (Node *) n; + } ; +json_serialize_expr: + JSON_SERIALIZE '(' json_value_expr json_output_clause_opt ')' + { + JsonSerializeExpr *n = makeNode(JsonSerializeExpr); + n->expr = (JsonValueExpr *) $3; + n->output = (JsonOutput *) $4; + n->location = @1; + $$ = (Node *) n; + } + ; json_value_func_expr: JSON_VALUE '(' @@ -16654,7 +16700,6 @@ unreserved_keyword: | INSTEAD | INVOKER | ISOLATION - | JSON | KEEP | KEY | KEYS @@ -16872,12 +16917,15 @@ col_name_keyword: | INT_P | INTEGER | INTERVAL + | JSON | JSON_ARRAY | JSON_ARRAYAGG | JSON_EXISTS | JSON_OBJECT | JSON_OBJECTAGG | JSON_QUERY + | JSON_SCALAR + | JSON_SERIALIZE | JSON_VALUE | LEAST | NATIONAL @@ -17243,6 +17291,8 @@ bare_label_keyword: | JSON_OBJECT | JSON_OBJECTAGG | JSON_QUERY + | JSON_SCALAR + | JSON_SERIALIZE | JSON_VALUE | KEEP | KEY diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index ee316a9197..e140007250 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -88,6 +88,10 @@ static Node *transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg); static Node *transformJsonIsPredicate(ParseState *pstate, JsonIsPredicate *p); static Node *transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *p); static Node *transformJsonValueExpr(ParseState *pstate, JsonValueExpr *jve); +static Node *transformJsonParseExpr(ParseState *pstate, JsonParseExpr *expr); +static Node *transformJsonScalarExpr(ParseState *pstate, JsonScalarExpr *expr); +static Node *transformJsonSerializeExpr(ParseState *pstate, + JsonSerializeExpr *expr); static Node *make_row_comparison_op(ParseState *pstate, List *opname, List *largs, List *rargs, int location); static Node *make_row_distinct_op(ParseState *pstate, List *opname, @@ -347,6 +351,18 @@ transformExprRecurse(ParseState *pstate, Node *expr) result = transformJsonValueExpr(pstate, (JsonValueExpr *) expr); break; + case T_JsonParseExpr: + result = transformJsonParseExpr(pstate, (JsonParseExpr *) expr); + break; + + case T_JsonScalarExpr: + result = transformJsonScalarExpr(pstate, (JsonScalarExpr *) expr); + break; + + case T_JsonSerializeExpr: + result = transformJsonSerializeExpr(pstate, (JsonSerializeExpr *) expr); + break; + default: /* should not reach here */ elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); @@ -3229,7 +3245,8 @@ makeCaseTestExpr(Node *expr) */ static Node * transformJsonValueExprExt(ParseState *pstate, JsonValueExpr *ve, - JsonFormatType default_format, bool isarg) + JsonFormatType default_format, bool isarg, + Oid targettype) { Node *expr = transformExprRecurse(pstate, (Node *) ve->raw_expr); Node *rawexpr; @@ -3303,17 +3320,17 @@ transformJsonValueExprExt(ParseState *pstate, JsonValueExpr *ve, else format = default_format; - if (format == JS_FORMAT_DEFAULT) + if (format == JS_FORMAT_DEFAULT && + (!OidIsValid(targettype) || exprtype == targettype)) expr = rawexpr; else { - Oid targettype = format == JS_FORMAT_JSONB ? JSONBOID : JSONOID; Node *orig = makeCaseTestExpr(expr); Node *coerced; + bool cast_is_needed = OidIsValid(targettype); - expr = orig; - - if (!isarg && exprtype != BYTEAOID && typcategory != TYPCATEGORY_STRING) + if (!isarg && !cast_is_needed && + exprtype != BYTEAOID && typcategory != TYPCATEGORY_STRING) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg(ve->format->format_type == JS_FORMAT_DEFAULT ? @@ -3322,6 +3339,8 @@ transformJsonValueExprExt(ParseState *pstate, JsonValueExpr *ve, parser_errposition(pstate, ve->format->location >= 0 ? ve->format->location : location))); + expr = orig; + /* Convert encoded JSON text from bytea. */ if (format == JS_FORMAT_JSON && exprtype == BYTEAOID) { @@ -3329,6 +3348,9 @@ transformJsonValueExprExt(ParseState *pstate, JsonValueExpr *ve, exprtype = TEXTOID; } + if (!OidIsValid(targettype)) + targettype = format == JS_FORMAT_JSONB ? JSONBOID : JSONOID; + /* Try to coerce to the target type. */ coerced = coerce_to_target_type(pstate, expr, exprtype, targettype, -1, @@ -3339,11 +3361,21 @@ transformJsonValueExprExt(ParseState *pstate, JsonValueExpr *ve, if (!coerced) { /* If coercion failed, use to_json()/to_jsonb() functions. */ - Oid fnoid = targettype == JSONOID ? F_TO_JSON : F_TO_JSONB; - FuncExpr *fexpr = makeFuncExpr(fnoid, targettype, - list_make1(expr), - InvalidOid, InvalidOid, - COERCE_EXPLICIT_CALL); + FuncExpr *fexpr; + Oid fnoid; + + if (cast_is_needed) /* only CAST is allowed */ + ereport(ERROR, + (errcode(ERRCODE_CANNOT_COERCE), + errmsg("cannot cast type %s to %s", + format_type_be(exprtype), + format_type_be(targettype)), + parser_errposition(pstate, location))); + + fnoid = targettype == JSONOID ? F_TO_JSON : F_TO_JSONB; + fexpr = makeFuncExpr(fnoid, targettype, list_make1(expr), + InvalidOid, InvalidOid, COERCE_EXPLICIT_CALL); + fexpr->location = location; coerced = (Node *) fexpr; @@ -3370,7 +3402,8 @@ transformJsonValueExprExt(ParseState *pstate, JsonValueExpr *ve, static Node * transformJsonValueExpr(ParseState *pstate, JsonValueExpr *jve) { - return transformJsonValueExprExt(pstate, jve, JS_FORMAT_JSON, false); + return transformJsonValueExprExt(pstate, jve, JS_FORMAT_JSON, false, + InvalidOid); } /* @@ -3379,7 +3412,8 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *jve) static Node * transformJsonValueExprDefault(ParseState *pstate, JsonValueExpr *jve) { - return transformJsonValueExprExt(pstate, jve, JS_FORMAT_DEFAULT, false); + return transformJsonValueExprExt(pstate, jve, JS_FORMAT_DEFAULT, false, + InvalidOid); } /* @@ -4022,7 +4056,7 @@ transformJsonPassingArgs(ParseState *pstate, JsonFormatType format, List *args, { JsonArgument *arg = castNode(JsonArgument, lfirst(lc)); Node *expr = transformJsonValueExprExt(pstate, arg->val, - format, true); + format, true, InvalidOid); assign_expr_collations(pstate, expr); @@ -4415,3 +4449,93 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func) return (Node *) jsexpr; } + +/* + * Transform a JSON() expression. + */ +static Node * +transformJsonParseExpr(ParseState *pstate, JsonParseExpr *jsexpr) +{ + JsonReturning *returning = makeNode(JsonReturning); + Node *arg; + + returning->format = makeJsonFormat(JS_FORMAT_JSON, JS_ENC_DEFAULT, -1); + returning->typid = JSONOID; + returning->typmod = -1; + + if (jsexpr->unique_keys) + { + /* + * Coerce string argument to text and then to json[b] in the executor + * node with key uniqueness check. + */ + JsonValueExpr *jve = jsexpr->expr; + Oid arg_type; + + arg = transformJsonParseArg(pstate, (Node *) jve->raw_expr, jve->format, + &arg_type); + + if (arg_type != TEXTOID) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("cannot use non-string types with WITH UNIQUE KEYS clause"), + parser_errposition(pstate, jsexpr->location))); + } + else + { + /* + * Coerce argument to target type using CAST for compatibilty with PG + * function-like CASTs. + */ + arg = transformJsonValueExprExt(pstate, jsexpr->expr, JS_FORMAT_JSON, + false, returning->typid); + } + + return makeJsonConstructorExpr(pstate, JSCTOR_JSON_PARSE, list_make1(arg), NULL, + returning, jsexpr->unique_keys, false, + jsexpr->location); +} + +/* + * Transform a JSON_SCALAR() expression. + */ +static Node * +transformJsonScalarExpr(ParseState *pstate, JsonScalarExpr *jsexpr) +{ + JsonReturning *returning = makeNode(JsonReturning); + Node *arg = transformExprRecurse(pstate, (Node *) jsexpr->expr); + + returning->format = makeJsonFormat(JS_FORMAT_JSON, JS_ENC_DEFAULT, -1); + returning->typid = JSONOID; + returning->typmod = -1; + + if (exprType(arg) == UNKNOWNOID) + arg = coerce_to_specific_type(pstate, arg, TEXTOID, "JSON_SCALAR"); + + return makeJsonConstructorExpr(pstate, JSCTOR_JSON_SCALAR, list_make1(arg), NULL, + returning, false, false, jsexpr->location); +} + +/* + * Transform a JSON_SERIALIZE() expression. + */ +static Node * +transformJsonSerializeExpr(ParseState *pstate, JsonSerializeExpr *expr) +{ + Node *arg = transformJsonValueExpr(pstate, expr->expr); + JsonReturning *returning; + + if (expr->output) + returning = transformJsonOutput(pstate, expr->output, true); + else + { + /* RETURNING TEXT FORMAT JSON is by default */ + returning = makeNode(JsonReturning); + returning->format = makeJsonFormat(JS_FORMAT_JSON, JS_ENC_DEFAULT, -1); + returning->typid = TEXTOID; + returning->typmod = -1; + } + + return makeJsonConstructorExpr(pstate, JSCTOR_JSON_SERIALIZE, list_make1(arg), + NULL, returning, false, false, expr->location); +} diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index 62d5d7d439..31c576cfec 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -1958,6 +1958,15 @@ FigureColnameInternal(Node *node, char **name) case T_XmlSerialize: *name = "xmlserialize"; return 2; + case T_JsonParseExpr: + *name = "json"; + return 2; + case T_JsonScalarExpr: + *name = "json_scalar"; + return 2; + case T_JsonSerializeExpr: + *name = "json_serialize"; + return 2; case T_JsonObjectConstructor: *name = "json_object"; return 2; diff --git a/src/backend/utils/adt/format_type.c b/src/backend/utils/adt/format_type.c index 2918fdbfb6..060fd7e183 100644 --- a/src/backend/utils/adt/format_type.c +++ b/src/backend/utils/adt/format_type.c @@ -294,6 +294,10 @@ format_type_extended(Oid type_oid, int32 typemod, bits16 flags) else buf = pstrdup("character varying"); break; + + case JSONOID: + buf = pstrdup("json"); + break; } if (buf == NULL) diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c index 5edcb8bb60..492796eb83 100644 --- a/src/backend/utils/adt/json.c +++ b/src/backend/utils/adt/json.c @@ -30,21 +30,6 @@ #include "utils/lsyscache.h" #include "utils/typcache.h" -typedef enum /* type categories for datum_to_json */ -{ - JSONTYPE_NULL, /* null, so we didn't bother to identify */ - JSONTYPE_BOOL, /* boolean (built-in types only) */ - JSONTYPE_NUMERIC, /* numeric (ditto) */ - JSONTYPE_DATE, /* we use special formatting for datetimes */ - JSONTYPE_TIMESTAMP, - JSONTYPE_TIMESTAMPTZ, - JSONTYPE_JSON, /* JSON itself (and JSONB) */ - JSONTYPE_ARRAY, /* array */ - JSONTYPE_COMPOSITE, /* composite */ - JSONTYPE_CAST, /* something with an explicit cast to JSON */ - JSONTYPE_OTHER /* all else */ -} JsonTypeCategory; - /* Common context for key uniqueness check */ typedef struct HTAB *JsonUniqueCheckState; /* hash table for key names */ @@ -99,9 +84,6 @@ static void array_dim_to_json(StringInfo result, int dim, int ndims, int *dims, bool use_line_feeds); static void array_to_json_internal(Datum array, StringInfo result, bool use_line_feeds); -static void json_categorize_type(Oid typoid, - JsonTypeCategory *tcategory, - Oid *outfuncoid); static void datum_to_json(Datum val, bool is_null, StringInfo result, JsonTypeCategory tcategory, Oid outfuncoid, bool key_scalar); @@ -180,7 +162,7 @@ json_recv(PG_FUNCTION_ARGS) * output function OID. If the returned category is JSONTYPE_CAST, we * return the OID of the type->JSON cast function instead. */ -static void +void json_categorize_type(Oid typoid, JsonTypeCategory *tcategory, Oid *outfuncoid) @@ -762,6 +744,16 @@ row_to_json_pretty(PG_FUNCTION_ARGS) PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len)); } +Datum +to_json_worker(Datum val, JsonTypeCategory tcategory, Oid outfuncoid) +{ + StringInfo result = makeStringInfo(); + + datum_to_json(val, false, result, tcategory, outfuncoid, false); + + return PointerGetDatum(cstring_to_text_with_len(result->data, result->len)); +} + bool to_json_is_immutable(Oid typoid) { @@ -802,7 +794,6 @@ to_json(PG_FUNCTION_ARGS) { Datum val = PG_GETARG_DATUM(0); Oid val_type = get_fn_expr_argtype(fcinfo->flinfo, 0); - StringInfo result; JsonTypeCategory tcategory; Oid outfuncoid; @@ -814,11 +805,7 @@ to_json(PG_FUNCTION_ARGS) json_categorize_type(val_type, &tcategory, &outfuncoid); - result = makeStringInfo(); - - datum_to_json(val, false, result, tcategory, outfuncoid, false); - - PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len)); + PG_RETURN_DATUM(to_json_worker(val, tcategory, outfuncoid)); } /* @@ -1712,7 +1699,7 @@ json_unique_object_field_start(void *_state, char *field, bool isnull) /* Validate JSON text and additionally check key uniqueness */ bool -json_validate(text *json, bool check_unique_keys) +json_validate(text *json, bool check_unique_keys, bool throw_error) { JsonLexContext *lex = makeJsonLexContext(json, check_unique_keys); JsonSemAction uniqueSemAction = {0}; @@ -1736,10 +1723,22 @@ json_validate(text *json, bool check_unique_keys) result = pg_parse_json(lex, check_unique_keys ? &uniqueSemAction : &nullSemAction); if (result != JSON_SUCCESS) + { + if (throw_error) + json_ereport_error(result, lex); + return false; /* invalid json */ + } if (check_unique_keys && !state.unique) + { + if (throw_error) + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE), + errmsg("duplicate JSON object key value"))); + return false; /* not unique keys */ + } return true; /* ok */ } diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c index d383cbdfed..2043f2e74a 100644 --- a/src/backend/utils/adt/jsonb.c +++ b/src/backend/utils/adt/jsonb.c @@ -34,25 +34,9 @@ typedef struct JsonbInState { JsonbParseState *parseState; JsonbValue *res; + bool unique_keys; } JsonbInState; -/* unlike with json categories, we need to treat json and jsonb differently */ -typedef enum /* type categories for datum_to_jsonb */ -{ - JSONBTYPE_NULL, /* null, so we didn't bother to identify */ - JSONBTYPE_BOOL, /* boolean (built-in types only) */ - JSONBTYPE_NUMERIC, /* numeric (ditto) */ - JSONBTYPE_DATE, /* we use special formatting for datetimes */ - JSONBTYPE_TIMESTAMP, /* we use special formatting for timestamp */ - JSONBTYPE_TIMESTAMPTZ, /* ... and timestamptz */ - JSONBTYPE_JSON, /* JSON */ - JSONBTYPE_JSONB, /* JSONB */ - JSONBTYPE_ARRAY, /* array */ - JSONBTYPE_COMPOSITE, /* composite */ - JSONBTYPE_JSONCAST, /* something with an explicit cast to JSON */ - JSONBTYPE_OTHER /* all else */ -} JsonbTypeCategory; - typedef struct JsonbAggState { JsonbInState *res; @@ -62,7 +46,7 @@ typedef struct JsonbAggState Oid val_output_func; } JsonbAggState; -static inline Datum jsonb_from_cstring(char *json, int len); +static inline Datum jsonb_from_cstring(char *json, int len, bool unique_keys); static size_t checkStringLen(size_t len); static void jsonb_in_object_start(void *pstate); static void jsonb_in_object_end(void *pstate); @@ -71,17 +55,11 @@ static void jsonb_in_array_end(void *pstate); static void jsonb_in_object_field_start(void *pstate, char *fname, bool isnull); static void jsonb_put_escaped_value(StringInfo out, JsonbValue *scalarVal); static void jsonb_in_scalar(void *pstate, char *token, JsonTokenType tokentype); -static void jsonb_categorize_type(Oid typoid, - JsonbTypeCategory *tcategory, - Oid *outfuncoid); static void composite_to_jsonb(Datum composite, JsonbInState *result); static void array_dim_to_jsonb(JsonbInState *result, int dim, int ndims, int *dims, Datum *vals, bool *nulls, int *valcount, JsonbTypeCategory tcategory, Oid outfuncoid); static void array_to_jsonb_internal(Datum array, JsonbInState *result); -static void jsonb_categorize_type(Oid typoid, - JsonbTypeCategory *tcategory, - Oid *outfuncoid); static void datum_to_jsonb(Datum val, bool is_null, JsonbInState *result, JsonbTypeCategory tcategory, Oid outfuncoid, bool key_scalar); @@ -99,7 +77,7 @@ jsonb_in(PG_FUNCTION_ARGS) { char *json = PG_GETARG_CSTRING(0); - return jsonb_from_cstring(json, strlen(json)); + return jsonb_from_cstring(json, strlen(json), false); } /* @@ -123,7 +101,7 @@ jsonb_recv(PG_FUNCTION_ARGS) else elog(ERROR, "unsupported jsonb version number %d", version); - return jsonb_from_cstring(str, nbytes); + return jsonb_from_cstring(str, nbytes, false); } /* @@ -164,6 +142,14 @@ jsonb_send(PG_FUNCTION_ARGS) PG_RETURN_BYTEA_P(pq_endtypsend(&buf)); } +Datum +jsonb_from_text(text *js, bool unique_keys) +{ + return jsonb_from_cstring(VARDATA_ANY(js), + VARSIZE_ANY_EXHDR(js), + unique_keys); +} + /* * Get the type name of a jsonb container. */ @@ -254,7 +240,7 @@ jsonb_typeof(PG_FUNCTION_ARGS) * Uses the json parser (with hooks) to construct a jsonb. */ static inline Datum -jsonb_from_cstring(char *json, int len) +jsonb_from_cstring(char *json, int len, bool unique_keys) { JsonLexContext *lex; JsonbInState state; @@ -264,6 +250,8 @@ jsonb_from_cstring(char *json, int len) memset(&sem, 0, sizeof(sem)); lex = makeJsonLexContextCstringLen(json, len, GetDatabaseEncoding(), true); + state.unique_keys = unique_keys; + sem.semstate = (void *) &state; sem.object_start = jsonb_in_object_start; @@ -298,6 +286,7 @@ jsonb_in_object_start(void *pstate) JsonbInState *_state = (JsonbInState *) pstate; _state->res = pushJsonbValue(&_state->parseState, WJB_BEGIN_OBJECT, NULL); + _state->parseState->unique_keys = _state->unique_keys; } static void @@ -620,7 +609,7 @@ add_indent(StringInfo out, bool indent, int level) * output function OID. If the returned category is JSONBTYPE_JSONCAST, * we return the OID of the relevant cast function instead. */ -static void +void jsonb_categorize_type(Oid typoid, JsonbTypeCategory *tcategory, Oid *outfuncoid) @@ -1127,6 +1116,18 @@ add_jsonb(Datum val, bool is_null, JsonbInState *result, datum_to_jsonb(val, is_null, result, tcategory, outfuncoid, key_scalar); } +Datum +to_jsonb_worker(Datum val, JsonbTypeCategory tcategory, Oid outfuncoid) +{ + JsonbInState result; + + memset(&result, 0, sizeof(JsonbInState)); + + datum_to_jsonb(val, false, &result, tcategory, outfuncoid, false); + + return JsonbPGetDatum(JsonbValueToJsonb(result.res)); +} + bool to_jsonb_is_immutable(Oid typoid) { @@ -1168,7 +1169,6 @@ to_jsonb(PG_FUNCTION_ARGS) { Datum val = PG_GETARG_DATUM(0); Oid val_type = get_fn_expr_argtype(fcinfo->flinfo, 0); - JsonbInState result; JsonbTypeCategory tcategory; Oid outfuncoid; @@ -1180,11 +1180,7 @@ to_jsonb(PG_FUNCTION_ARGS) jsonb_categorize_type(val_type, &tcategory, &outfuncoid); - memset(&result, 0, sizeof(JsonbInState)); - - datum_to_jsonb(val, false, &result, tcategory, outfuncoid, false); - - PG_RETURN_POINTER(JsonbValueToJsonb(result.res)); + PG_RETURN_DATUM(to_jsonb_worker(val, tcategory, outfuncoid)); } Datum diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index c2484fbcea..010d5a7a75 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -10092,7 +10092,9 @@ get_json_constructor_options(JsonConstructorExpr *ctor, StringInfo buf) if (ctor->unique) appendStringInfoString(buf, " WITH UNIQUE KEYS"); - get_json_returning(ctor->returning, buf, true); + if (ctor->type != JSCTOR_JSON_PARSE && + ctor->type != JSCTOR_JSON_SCALAR) + get_json_returning(ctor->returning, buf, true); } static void @@ -10106,6 +10108,15 @@ get_json_constructor(JsonConstructorExpr *ctor, deparse_context *context, switch (ctor->type) { + case JSCTOR_JSON_PARSE: + funcname = "JSON"; + break; + case JSCTOR_JSON_SCALAR: + funcname = "JSON_SCALAR"; + break; + case JSCTOR_JSON_SERIALIZE: + funcname = "JSON_SERIALIZE"; + break; case JSCTOR_JSON_OBJECT: funcname = "JSON_OBJECT"; break; diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h index 240d07982a..9ce8df17e5 100644 --- a/src/include/executor/execExpr.h +++ b/src/include/executor/execExpr.h @@ -680,6 +680,11 @@ typedef struct ExprEvalStep Datum *arg_values; bool *arg_nulls; Oid *arg_types; + struct + { + int category; + Oid outfuncid; + } *arg_type_cache; /* cache for datum_to_json[b]() */ int nargs; } json_constructor; diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index d48147abee..a56b85fe74 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -205,6 +205,9 @@ typedef enum NodeTag T_JsonFormat, T_JsonReturning, T_JsonValueExpr, + T_JsonParseExpr, + T_JsonScalarExpr, + T_JsonSerializeExpr, T_JsonConstructorExpr, T_JsonExpr, T_JsonCoercion, diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 0ff4ba0884..c24fc26da1 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1676,6 +1676,41 @@ typedef struct JsonKeyValue JsonValueExpr *value; /* JSON value expression */ } JsonKeyValue; +/* + * JsonParseExpr - + * untransformed representation of JSON() + */ +typedef struct JsonParseExpr +{ + NodeTag type; + JsonValueExpr *expr; /* string expression */ + bool unique_keys; /* WITH UNIQUE KEYS? */ + int location; /* token location, or -1 if unknown */ +} JsonParseExpr; + +/* + * JsonScalarExpr - + * untransformed representation of JSON_SCALAR() + */ +typedef struct JsonScalarExpr +{ + NodeTag type; + Expr *expr; /* scalar expression */ + int location; /* token location, or -1 if unknown */ +} JsonScalarExpr; + +/* + * JsonSerializeExpr - + * untransformed representation of JSON_SERIALIZE() function + */ +typedef struct JsonSerializeExpr +{ + NodeTag type; + JsonValueExpr *expr; /* json value expression */ + JsonOutput *output; /* RETURNING clause, if specified */ + int location; /* token location, or -1 if unknown */ +} JsonSerializeExpr; + /* * JsonObjectConstructor - * untransformed representation of JSON_OBJECT() constructor diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index 7ebe868af9..439a16aa62 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -1339,7 +1339,10 @@ typedef enum JsonConstructorType JSCTOR_JSON_OBJECT = 1, JSCTOR_JSON_ARRAY = 2, JSCTOR_JSON_OBJECTAGG = 3, - JSCTOR_JSON_ARRAYAGG = 4 + JSCTOR_JSON_ARRAYAGG = 4, + JSCTOR_JSON_SCALAR = 5, + JSCTOR_JSON_SERIALIZE = 6, + JSCTOR_JSON_PARSE = 7 } JsonConstructorType; /* diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index 5f3834ddf3..a73032b319 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -232,13 +232,15 @@ PG_KEYWORD("is", IS, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("isnull", ISNULL, TYPE_FUNC_NAME_KEYWORD, AS_LABEL) PG_KEYWORD("isolation", ISOLATION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("join", JOIN, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) -PG_KEYWORD("json", JSON, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("json", JSON, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_array", JSON_ARRAY, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_arrayagg", JSON_ARRAYAGG, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_exists", JSON_EXISTS, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_object", JSON_OBJECT, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_objectagg", JSON_OBJECTAGG, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_query", JSON_QUERY, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_scalar", JSON_SCALAR, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_serialize", JSON_SERIALIZE, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_value", JSON_VALUE, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("keep", KEEP, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("key", KEY, UNRESERVED_KEYWORD, BARE_LABEL) diff --git a/src/include/utils/json.h b/src/include/utils/json.h index bfe5b21591..da4a9257b3 100644 --- a/src/include/utils/json.h +++ b/src/include/utils/json.h @@ -16,16 +16,35 @@ #include "lib/stringinfo.h" +typedef enum /* type categories for datum_to_json */ +{ + JSONTYPE_NULL, /* null, so we didn't bother to identify */ + JSONTYPE_BOOL, /* boolean (built-in types only) */ + JSONTYPE_NUMERIC, /* numeric (ditto) */ + JSONTYPE_DATE, /* we use special formatting for datetimes */ + JSONTYPE_TIMESTAMP, + JSONTYPE_TIMESTAMPTZ, + JSONTYPE_JSON, /* JSON itself (and JSONB) */ + JSONTYPE_ARRAY, /* array */ + JSONTYPE_COMPOSITE, /* composite */ + JSONTYPE_CAST, /* something with an explicit cast to JSON */ + JSONTYPE_OTHER /* all else */ +} JsonTypeCategory; + /* functions in json.c */ extern void escape_json(StringInfo buf, const char *str); extern char *JsonEncodeDateTime(char *buf, Datum value, Oid typid, const int *tzp); extern bool to_json_is_immutable(Oid typoid); +extern void json_categorize_type(Oid typoid, JsonTypeCategory *tcategory, + Oid *outfuncoid); +extern Datum to_json_worker(Datum val, JsonTypeCategory tcategory, + Oid outfuncoid); extern Datum json_build_object_worker(int nargs, Datum *args, bool *nulls, Oid *types, bool absent_on_null, bool unique_keys); extern Datum json_build_array_worker(int nargs, Datum *args, bool *nulls, Oid *types, bool absent_on_null); -extern bool json_validate(text *json, bool check_unique_keys); +extern bool json_validate(text *json, bool check_unique_keys, bool throw_error); #endif /* JSON_H */ diff --git a/src/include/utils/jsonb.h b/src/include/utils/jsonb.h index 3fdff445cf..bae466b523 100644 --- a/src/include/utils/jsonb.h +++ b/src/include/utils/jsonb.h @@ -376,6 +376,22 @@ typedef struct JsonbIterator struct JsonbIterator *parent; } JsonbIterator; +/* unlike with json categories, we need to treat json and jsonb differently */ +typedef enum /* type categories for datum_to_jsonb */ +{ + JSONBTYPE_NULL, /* null, so we didn't bother to identify */ + JSONBTYPE_BOOL, /* boolean (built-in types only) */ + JSONBTYPE_NUMERIC, /* numeric (ditto) */ + JSONBTYPE_DATE, /* we use special formatting for datetimes */ + JSONBTYPE_TIMESTAMP, /* we use special formatting for timestamp */ + JSONBTYPE_TIMESTAMPTZ, /* ... and timestamptz */ + JSONBTYPE_JSON, /* JSON */ + JSONBTYPE_JSONB, /* JSONB */ + JSONBTYPE_ARRAY, /* array */ + JSONBTYPE_COMPOSITE, /* composite */ + JSONBTYPE_JSONCAST, /* something with an explicit cast to JSON */ + JSONBTYPE_OTHER /* all else */ +} JsonbTypeCategory; /* Support functions */ extern uint32 getJsonbOffset(const JsonbContainer *jc, int index); @@ -403,6 +419,7 @@ extern void JsonbHashScalarValueExtended(const JsonbValue *scalarVal, uint64 *hash, uint64 seed); /* jsonb.c support functions */ +extern Datum jsonb_from_text(text *js, bool unique_keys); extern char *JsonbToCString(StringInfo out, JsonbContainer *in, int estimated_len); extern char *JsonbToCStringIndent(StringInfo out, JsonbContainer *in, @@ -418,6 +435,10 @@ extern Datum jsonb_set_element(Jsonb *jb, Datum *path, int path_len, extern Datum jsonb_get_element(Jsonb *jb, Datum *path, int npath, bool *isnull, bool as_text); extern bool to_jsonb_is_immutable(Oid typoid); +extern void jsonb_categorize_type(Oid typoid, JsonbTypeCategory *tcategory, + Oid *outfuncoid); +extern Datum to_jsonb_worker(Datum val, JsonbTypeCategory tcategory, + Oid outfuncoid); extern Datum jsonb_build_object_worker(int nargs, Datum *args, bool *nulls, Oid *types, bool absent_on_null, bool unique_keys); diff --git a/src/test/regress/expected/sqljson.out b/src/test/regress/expected/sqljson.out index 27dca7815a..11f5eb2d2c 100644 --- a/src/test/regress/expected/sqljson.out +++ b/src/test/regress/expected/sqljson.out @@ -1,3 +1,270 @@ +-- JSON() +SELECT JSON(); +ERROR: syntax error at or near ")" +LINE 1: SELECT JSON(); + ^ +SELECT JSON(NULL); + json +------ + +(1 row) + +SELECT JSON('{ "a" : 1 } '); + json +-------------- + { "a" : 1 } +(1 row) + +SELECT JSON('{ "a" : 1 } ' FORMAT JSON); + json +-------------- + { "a" : 1 } +(1 row) + +SELECT JSON('{ "a" : 1 } ' FORMAT JSON ENCODING UTF8); +ERROR: JSON ENCODING clause is only allowed for bytea input type +LINE 1: SELECT JSON('{ "a" : 1 } ' FORMAT JSON ENCODING UTF8); + ^ +SELECT JSON('{ "a" : 1 } '::bytea FORMAT JSON ENCODING UTF8); + json +-------------- + { "a" : 1 } +(1 row) + +SELECT pg_typeof(JSON('{ "a" : 1 } ')); + pg_typeof +----------- + json +(1 row) + +SELECT JSON(' 1 '::json); + json +--------- + 1 +(1 row) + +SELECT JSON(' 1 '::jsonb); + json +------ + 1 +(1 row) + +SELECT JSON(' 1 '::json WITH UNIQUE KEYS); +ERROR: cannot use non-string types with WITH UNIQUE KEYS clause +LINE 1: SELECT JSON(' 1 '::json WITH UNIQUE KEYS); + ^ +SELECT JSON(123); +ERROR: cannot cast type integer to json +LINE 1: SELECT JSON(123); + ^ +SELECT JSON('{"a": 1, "a": 2}'); + json +------------------ + {"a": 1, "a": 2} +(1 row) + +SELECT JSON('{"a": 1, "a": 2}' WITH UNIQUE KEYS); +ERROR: duplicate JSON object key value +SELECT JSON('{"a": 1, "a": 2}' WITHOUT UNIQUE KEYS); + json +------------------ + {"a": 1, "a": 2} +(1 row) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'); + QUERY PLAN +----------------------------- + Result + Output: JSON('123'::json) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' FORMAT JSON); + QUERY PLAN +----------------------------- + Result + Output: JSON('123'::json) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'::bytea FORMAT JSON); + QUERY PLAN +----------------------------------------------- + Result + Output: JSON('\x313233'::bytea FORMAT JSON) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'::bytea FORMAT JSON ENCODING UTF8); + QUERY PLAN +------------------------------------------------------------- + Result + Output: JSON('\x313233'::bytea FORMAT JSON ENCODING UTF8) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' WITH UNIQUE KEYS); + QUERY PLAN +---------------------------------------------- + Result + Output: JSON('123'::text WITH UNIQUE KEYS) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' WITHOUT UNIQUE KEYS); + QUERY PLAN +----------------------------- + Result + Output: JSON('123'::json) +(2 rows) + +-- JSON_SCALAR() +SELECT JSON_SCALAR(); +ERROR: syntax error at or near ")" +LINE 1: SELECT JSON_SCALAR(); + ^ +SELECT JSON_SCALAR(NULL); + json_scalar +------------- + +(1 row) + +SELECT JSON_SCALAR(NULL::int); + json_scalar +------------- + +(1 row) + +SELECT JSON_SCALAR(123); + json_scalar +------------- + 123 +(1 row) + +SELECT JSON_SCALAR(123.45); + json_scalar +------------- + 123.45 +(1 row) + +SELECT JSON_SCALAR(123.45::numeric); + json_scalar +------------- + 123.45 +(1 row) + +SELECT JSON_SCALAR(true); + json_scalar +------------- + true +(1 row) + +SELECT JSON_SCALAR(false); + json_scalar +------------- + false +(1 row) + +SELECT JSON_SCALAR(' 123.45'); + json_scalar +------------- + " 123.45" +(1 row) + +SELECT JSON_SCALAR('2020-06-07'::date); + json_scalar +-------------- + "2020-06-07" +(1 row) + +SELECT JSON_SCALAR('2020-06-07 01:02:03'::timestamp); + json_scalar +----------------------- + "2020-06-07T01:02:03" +(1 row) + +SELECT JSON_SCALAR('{}'::json); + json_scalar +------------- + {} +(1 row) + +SELECT JSON_SCALAR('{}'::jsonb); + json_scalar +------------- + {} +(1 row) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR(123); + QUERY PLAN +---------------------------- + Result + Output: JSON_SCALAR(123) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR('123'); + QUERY PLAN +------------------------------------ + Result + Output: JSON_SCALAR('123'::text) +(2 rows) + +-- JSON_SERIALIZE() +SELECT JSON_SERIALIZE(); +ERROR: syntax error at or near ")" +LINE 1: SELECT JSON_SERIALIZE(); + ^ +SELECT JSON_SERIALIZE(NULL); + json_serialize +---------------- + +(1 row) + +SELECT JSON_SERIALIZE(JSON('{ "a" : 1 } ')); + json_serialize +---------------- + { "a" : 1 } +(1 row) + +SELECT JSON_SERIALIZE('{ "a" : 1 } '); + json_serialize +---------------- + { "a" : 1 } +(1 row) + +SELECT JSON_SERIALIZE('1'); + json_serialize +---------------- + 1 +(1 row) + +SELECT JSON_SERIALIZE('1' FORMAT JSON); + json_serialize +---------------- + 1 +(1 row) + +SELECT JSON_SERIALIZE('{ "a" : 1 } ' RETURNING bytea); + json_serialize +---------------------------- + \x7b20226122203a2031207d20 +(1 row) + +SELECT pg_typeof(JSON_SERIALIZE(NULL)); + pg_typeof +----------- + text +(1 row) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SERIALIZE('{}'); + QUERY PLAN +----------------------------------------------------- + Result + Output: JSON_SERIALIZE('{}'::json RETURNING text) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SERIALIZE('{}' RETURNING bytea); + QUERY PLAN +------------------------------------------------------ + Result + Output: JSON_SERIALIZE('{}'::json RETURNING bytea) +(2 rows) + -- JSON_OBJECT() SELECT JSON_OBJECT(); json_object diff --git a/src/test/regress/sql/sqljson.sql b/src/test/regress/sql/sqljson.sql index 4f3c06dcb3..98bd93c110 100644 --- a/src/test/regress/sql/sqljson.sql +++ b/src/test/regress/sql/sqljson.sql @@ -1,3 +1,60 @@ +-- JSON() +SELECT JSON(); +SELECT JSON(NULL); +SELECT JSON('{ "a" : 1 } '); +SELECT JSON('{ "a" : 1 } ' FORMAT JSON); +SELECT JSON('{ "a" : 1 } ' FORMAT JSON ENCODING UTF8); +SELECT JSON('{ "a" : 1 } '::bytea FORMAT JSON ENCODING UTF8); +SELECT pg_typeof(JSON('{ "a" : 1 } ')); + +SELECT JSON(' 1 '::json); +SELECT JSON(' 1 '::jsonb); +SELECT JSON(' 1 '::json WITH UNIQUE KEYS); +SELECT JSON(123); + +SELECT JSON('{"a": 1, "a": 2}'); +SELECT JSON('{"a": 1, "a": 2}' WITH UNIQUE KEYS); +SELECT JSON('{"a": 1, "a": 2}' WITHOUT UNIQUE KEYS); + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' FORMAT JSON); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'::bytea FORMAT JSON); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'::bytea FORMAT JSON ENCODING UTF8); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' WITH UNIQUE KEYS); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' WITHOUT UNIQUE KEYS); + + +-- JSON_SCALAR() +SELECT JSON_SCALAR(); +SELECT JSON_SCALAR(NULL); +SELECT JSON_SCALAR(NULL::int); +SELECT JSON_SCALAR(123); +SELECT JSON_SCALAR(123.45); +SELECT JSON_SCALAR(123.45::numeric); +SELECT JSON_SCALAR(true); +SELECT JSON_SCALAR(false); +SELECT JSON_SCALAR(' 123.45'); +SELECT JSON_SCALAR('2020-06-07'::date); +SELECT JSON_SCALAR('2020-06-07 01:02:03'::timestamp); +SELECT JSON_SCALAR('{}'::json); +SELECT JSON_SCALAR('{}'::jsonb); + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR(123); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR('123'); + +-- JSON_SERIALIZE() +SELECT JSON_SERIALIZE(); +SELECT JSON_SERIALIZE(NULL); +SELECT JSON_SERIALIZE(JSON('{ "a" : 1 } ')); +SELECT JSON_SERIALIZE('{ "a" : 1 } '); +SELECT JSON_SERIALIZE('1'); +SELECT JSON_SERIALIZE('1' FORMAT JSON); +SELECT JSON_SERIALIZE('{ "a" : 1 } ' RETURNING bytea); +SELECT pg_typeof(JSON_SERIALIZE(NULL)); + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SERIALIZE('{}'); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SERIALIZE('{}' RETURNING bytea); + -- JSON_OBJECT() SELECT JSON_OBJECT(); SELECT JSON_OBJECT(RETURNING json); From db0d67db2401eb6238ccc04c6407a4fd4f985832 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Thu, 31 Mar 2022 00:09:11 +0200 Subject: [PATCH 318/772] Optimize order of GROUP BY keys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When evaluating a query with a multi-column GROUP BY clause using sort, the cost may be heavily dependent on the order in which the keys are compared when building the groups. Grouping does not imply any ordering, so we're allowed to compare the keys in arbitrary order, and a Hash Agg leverages this. But for Group Agg, we simply compared keys in the order as specified in the query. This commit explores alternative ordering of the keys, trying to find a cheaper one. In principle, we might generate grouping paths for all permutations of the keys, and leave the rest to the optimizer. But that might get very expensive, so we try to pick only a couple interesting orderings based on both local and global information. When planning the grouping path, we explore statistics (number of distinct values, cost of the comparison function) for the keys and reorder them to minimize comparison costs. Intuitively, it may be better to perform more expensive comparisons (for complex data types etc.) last, because maybe the cheaper comparisons will be enough. Similarly, the higher the cardinality of a key, the lower the probability we’ll need to compare more keys. The patch generates and costs various orderings, picking the cheapest ones. The ordering of group keys may interact with other parts of the query, some of which may not be known while planning the grouping. E.g. there may be an explicit ORDER BY clause, or some other ordering-dependent operation, higher up in the query, and using the same ordering may allow using either incremental sort or even eliminate the sort entirely. The patch generates orderings and picks those minimizing the comparison cost (for various pathkeys), and then adds orderings that might be useful for operations higher up in the plan (ORDER BY, etc.). Finally, it always keeps the ordering specified in the query, on the assumption the user might have additional insights. This introduces a new GUC enable_group_by_reordering, so that the optimization may be disabled if needed. The original patch was proposed by Teodor Sigaev, and later improved and reworked by Dmitry Dolgov. Reviews by a number of people, including me, Andrey Lepikhov, Claudio Freire, Ibrar Ahmed and Zhihong Yu. Author: Dmitry Dolgov, Teodor Sigaev, Tomas Vondra Reviewed-by: Tomas Vondra, Andrey Lepikhov, Claudio Freire, Ibrar Ahmed, Zhihong Yu Discussion: https://postgr.es/m/7c79e6a5-8597-74e8-0671-1c39d124c9d6%40sigaev.ru Discussion: https://postgr.es/m/CA%2Bq6zcW_4o2NC0zutLkOJPsFt80megSpX_dVRo6GK9PC-Jx_Ag%40mail.gmail.com --- .../postgres_fdw/expected/postgres_fdw.out | 15 +- doc/src/sgml/config.sgml | 14 + src/backend/optimizer/path/costsize.c | 366 +++++++++- src/backend/optimizer/path/equivclass.c | 13 +- src/backend/optimizer/path/pathkeys.c | 569 +++++++++++++++ src/backend/optimizer/plan/planner.c | 649 ++++++++++-------- src/backend/optimizer/util/pathnode.c | 2 +- src/backend/utils/adt/selfuncs.c | 38 +- src/backend/utils/misc/guc.c | 10 + src/backend/utils/misc/postgresql.conf.sample | 1 + src/include/nodes/nodes.h | 1 + src/include/nodes/pathnodes.h | 10 + src/include/optimizer/cost.h | 4 +- src/include/optimizer/paths.h | 7 + src/include/utils/selfuncs.h | 5 + src/test/regress/expected/aggregates.out | 244 ++++++- .../regress/expected/incremental_sort.out | 2 +- src/test/regress/expected/join.out | 51 +- .../regress/expected/partition_aggregate.out | 136 ++-- src/test/regress/expected/partition_join.out | 75 +- src/test/regress/expected/sysviews.out | 3 +- src/test/regress/expected/union.out | 60 +- src/test/regress/sql/aggregates.sql | 99 +++ src/test/regress/sql/incremental_sort.sql | 2 +- 24 files changed, 1882 insertions(+), 494 deletions(-) diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index f210f91188..2ffc836824 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -2741,16 +2741,13 @@ select c2 * (random() <= 1)::int as c2 from ft2 group by c2 * (random() <= 1)::i -- GROUP BY clause in various forms, cardinal, alias and constant expression explain (verbose, costs off) select count(c2) w, c2 x, 5 y, 7.0 z from ft1 group by 2, y, 9.0::int order by 2; - QUERY PLAN ---------------------------------------------------------------------------------------- - Sort + QUERY PLAN +------------------------------------------------------------------------------------------------------------ + Foreign Scan Output: (count(c2)), c2, 5, 7.0, 9 - Sort Key: ft1.c2 - -> Foreign Scan - Output: (count(c2)), c2, 5, 7.0, 9 - Relations: Aggregate on (public.ft1) - Remote SQL: SELECT count(c2), c2, 5, 7.0, 9 FROM "S 1"."T 1" GROUP BY 2, 3, 5 -(7 rows) + Relations: Aggregate on (public.ft1) + Remote SQL: SELECT count(c2), c2, 5, 7.0, 9 FROM "S 1"."T 1" GROUP BY 2, 3, 5 ORDER BY c2 ASC NULLS LAST +(4 rows) select count(c2) w, c2 x, 5 y, 7.0 z from ft1 group by 2, y, 9.0::int order by 2; w | x | y | z diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 9788e831bc..43e4ade83e 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -4967,6 +4967,20 @@ ANY num_sync ( + enable_group_by_reordering (boolean) + + enable_group_by_reordering configuration parameter + + + + + Enables or disables reodering of keys in GROUP BY + clause. The default is on. + + + + enable_hashagg (boolean) diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 679d8ed597..ec3c23013a 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -1755,6 +1755,322 @@ cost_recursive_union(Path *runion, Path *nrterm, Path *rterm) rterm->pathtarget->width); } +/* + * is_fake_var + * Workaround for generate_append_tlist() which generates fake Vars with + * varno == 0, that will cause a fail of estimate_num_group() call + * + * XXX Ummm, why would estimate_num_group fail with this? + */ +static bool +is_fake_var(Expr *expr) +{ + if (IsA(expr, RelabelType)) + expr = (Expr *) ((RelabelType *) expr)->arg; + + return (IsA(expr, Var) && ((Var *) expr)->varno == 0); +} + +/* + * get_width_cost_multiplier + * Returns relative complexity of comparing two values based on its width. + * The idea behind is that the comparison becomes more expensive the longer the + * value is. Return value is in cpu_operator_cost units. + */ +static double +get_width_cost_multiplier(PlannerInfo *root, Expr *expr) +{ + double width = -1.0; /* fake value */ + + if (IsA(expr, RelabelType)) + expr = (Expr *) ((RelabelType *) expr)->arg; + + /* Try to find actual stat in corresponding relation */ + if (IsA(expr, Var)) + { + Var *var = (Var *) expr; + + if (var->varno > 0 && var->varno < root->simple_rel_array_size) + { + RelOptInfo *rel = root->simple_rel_array[var->varno]; + + if (rel != NULL && + var->varattno >= rel->min_attr && + var->varattno <= rel->max_attr) + { + int ndx = var->varattno - rel->min_attr; + + if (rel->attr_widths[ndx] > 0) + width = rel->attr_widths[ndx]; + } + } + } + + /* Didn't find any actual stats, try using type width instead. */ + if (width < 0.0) + { + Node *node = (Node*) expr; + + width = get_typavgwidth(exprType(node), exprTypmod(node)); + } + + /* + * Values are passed as Datum type, so comparisons can't be cheaper than + * comparing a Datum value. + * + * FIXME I find this reasoning questionable. We may pass int2, and comparing + * it is probably a bit cheaper than comparing a bigint. + */ + if (width <= sizeof(Datum)) + return 1.0; + + /* + * We consider the cost of a comparison not to be directly proportional to + * width of the argument, because widths of the arguments could be slightly + * different (we only know the average width for the whole column). So we + * use log16(width) as an estimate. + */ + return 1.0 + 0.125 * LOG2(width / sizeof(Datum)); +} + +/* + * compute_cpu_sort_cost + * compute CPU cost of sort (i.e. in-memory) + * + * The main thing we need to calculate to estimate sort CPU costs is the number + * of calls to the comparator functions. The difficulty is that for multi-column + * sorts there may be different data types involved (for some of which the calls + * may be much more expensive). Furthermore, columns may have a very different + * number of distinct values - the higher the number, the fewer comparisons will + * be needed for the following columns. + * + * The algorithm is incremental - we add pathkeys one by one, and at each step we + * estimate the number of necessary comparisons (based on the number of distinct + * groups in the current pathkey prefix and the new pathkey), and the comparison + * costs (which is data type specific). + * + * Estimation of the number of comparisons is based on ideas from: + * + * "Quicksort Is Optimal", Robert Sedgewick, Jon Bentley, 2002 + * [https://www.cs.princeton.edu/~rs/talks/QuicksortIsOptimal.pdf] + * + * In term of that paper, let N - number of tuples, Xi - number of identical + * tuples with value Ki, then the estimate of number of comparisons is: + * + * log(N! / (X1! * X2! * ..)) ~ sum(Xi * log(N/Xi)) + * + * We assume all Xi the same because now we don't have any estimation of + * group sizes, we have only know the estimate of number of groups (distinct + * values). In that case, formula becomes: + * + * N * log(NumberOfGroups) + * + * For multi-column sorts we need to estimate the number of comparisons for + * each individual column - for example with columns (c1, c2, ..., ck) we + * can estimate that number of comparisons on ck is roughly + * + * ncomparisons(c1, c2, ..., ck) / ncomparisons(c1, c2, ..., c(k-1)) + * + * Let k be a column number, Gk - number of groups defined by k columns, and Fk + * the cost of the comparison is + * + * N * sum( Fk * log(Gk) ) + * + * Note: We also consider column width, not just the comparator cost. + * + * NOTE: some callers currently pass NIL for pathkeys because they + * can't conveniently supply the sort keys. In this case, it will fallback to + * simple comparison cost estimate. + */ +static Cost +compute_cpu_sort_cost(PlannerInfo *root, List *pathkeys, int nPresortedKeys, + Cost comparison_cost, double tuples, double output_tuples, + bool heapSort) +{ + Cost per_tuple_cost = 0.0; + ListCell *lc; + List *pathkeyExprs = NIL; + double tuplesPerPrevGroup = tuples; + double totalFuncCost = 1.0; + bool has_fake_var = false; + int i = 0; + Oid prev_datatype = InvalidOid; + List *cache_varinfos = NIL; + + /* fallback if pathkeys is unknown */ + if (list_length(pathkeys) == 0) + { + /* + * If we'll use a bounded heap-sort keeping just K tuples in memory, for + * a total number of tuple comparisons of N log2 K; but the constant + * factor is a bit higher than for quicksort. Tweak it so that the cost + * curve is continuous at the crossover point. + */ + output_tuples = (heapSort) ? 2.0 * output_tuples : tuples; + per_tuple_cost += 2.0 * cpu_operator_cost * LOG2(output_tuples); + + /* add cost provided by caller */ + per_tuple_cost += comparison_cost; + + return per_tuple_cost * tuples; + } + + /* + * Computing total cost of sorting takes into account: + * - per column comparison function cost + * - we try to compute needed number of comparison per column + */ + foreach(lc, pathkeys) + { + PathKey *pathkey = (PathKey*) lfirst(lc); + EquivalenceMember *em; + double nGroups, + correctedNGroups; + Cost funcCost = 1.0; + + /* + * We believe that equivalence members aren't very different, so, to + * estimate cost we consider just the first member. + */ + em = (EquivalenceMember *) linitial(pathkey->pk_eclass->ec_members); + + if (em->em_datatype != InvalidOid) + { + /* do not lookup funcCost if the data type is the same */ + if (prev_datatype != em->em_datatype) + { + Oid sortop; + QualCost cost; + + sortop = get_opfamily_member(pathkey->pk_opfamily, + em->em_datatype, em->em_datatype, + pathkey->pk_strategy); + + cost.startup = 0; + cost.per_tuple = 0; + add_function_cost(root, get_opcode(sortop), NULL, &cost); + + /* + * add_function_cost returns the product of cpu_operator_cost + * and procost, but we need just procost, co undo that. + */ + funcCost = cost.per_tuple / cpu_operator_cost; + + prev_datatype = em->em_datatype; + } + } + + /* factor in the width of the values in this column */ + funcCost *= get_width_cost_multiplier(root, em->em_expr); + + /* now we have per-key cost, so add to the running total */ + totalFuncCost += funcCost; + + /* remember if we have found a fake Var in pathkeys */ + has_fake_var |= is_fake_var(em->em_expr); + pathkeyExprs = lappend(pathkeyExprs, em->em_expr); + + /* + * We need to calculate the number of comparisons for this column, which + * requires knowing the group size. So we estimate the number of groups + * by calling estimate_num_groups_incremental(), which estimates the + * group size for "new" pathkeys. + * + * Note: estimate_num_groups_incremntal does not handle fake Vars, so use + * a default estimate otherwise. + */ + if (!has_fake_var) + nGroups = estimate_num_groups_incremental(root, pathkeyExprs, + tuplesPerPrevGroup, NULL, NULL, + &cache_varinfos, + list_length(pathkeyExprs) - 1); + else if (tuples > 4.0) + /* + * Use geometric mean as estimation if there are no stats. + * + * We don't use DEFAULT_NUM_DISTINCT here, because that’s used for + * a single column, but here we’re dealing with multiple columns. + */ + nGroups = ceil(2.0 + sqrt(tuples) * (i + 1) / list_length(pathkeys)); + else + nGroups = tuples; + + /* + * Presorted keys are not considered in the cost above, but we still do + * have to compare them in the qsort comparator. So make sure to factor + * in the cost in that case. + */ + if (i >= nPresortedKeys) + { + if (heapSort) + { + /* have to keep at least one group, and a multiple of group size */ + correctedNGroups = ceil(output_tuples / tuplesPerPrevGroup); + } + else + /* all groups in the input */ + correctedNGroups = nGroups; + + correctedNGroups = Max(1.0, ceil(correctedNGroups)); + + per_tuple_cost += totalFuncCost * LOG2(correctedNGroups); + } + + i++; + + /* + * Uniform distributions with all groups being of the same size are the + * best case, with nice smooth behavior. Real-world distributions tend + * not to be uniform, though, and we don’t have any reliable easy-to-use + * information. As a basic defense against skewed distributions, we use + * a 1.5 factor to make the expected group a bit larger, but we need to + * be careful not to make the group larger than in the preceding step. + */ + tuplesPerPrevGroup = Min(tuplesPerPrevGroup, + ceil(1.5 * tuplesPerPrevGroup / nGroups)); + + /* + * Once we get single-row group, it means tuples in the group are unique + * and we can skip all remaining columns. + */ + if (tuplesPerPrevGroup <= 1.0) + break; + } + + list_free(pathkeyExprs); + + /* per_tuple_cost is in cpu_operator_cost units */ + per_tuple_cost *= cpu_operator_cost; + + /* + * Accordingly to "Introduction to algorithms", Thomas H. Cormen, Charles E. + * Leiserson, Ronald L. Rivest, ISBN 0-07-013143-0, quicksort estimation + * formula has additional term proportional to number of tuples (See Chapter + * 8.2 and Theorem 4.1). That affects cases with a low number of tuples, + * approximately less than 1e4. We could implement it as an additional + * multiplier under the logarithm, but we use a bit more complex formula + * which takes into account the number of unique tuples and it’s not clear + * how to combine the multiplier with the number of groups. Estimate it as + * 10 in cpu_operator_cost unit. + */ + per_tuple_cost += 10 * cpu_operator_cost; + + per_tuple_cost += comparison_cost; + + return tuples * per_tuple_cost; +} + +/* + * simple wrapper just to estimate best sort path + */ +Cost +cost_sort_estimate(PlannerInfo *root, List *pathkeys, int nPresortedKeys, + double tuples) +{ + return compute_cpu_sort_cost(root, pathkeys, nPresortedKeys, + 0, tuples, tuples, false); +} + /* * cost_tuplesort * Determines and returns the cost of sorting a relation using tuplesort, @@ -1771,7 +2087,7 @@ cost_recursive_union(Path *runion, Path *nrterm, Path *rterm) * number of initial runs formed and M is the merge order used by tuplesort.c. * Since the average initial run should be about sort_mem, we have * disk traffic = 2 * relsize * ceil(logM(p / sort_mem)) - * cpu = comparison_cost * t * log2(t) + * and cpu cost (computed by compute_cpu_sort_cost()). * * If the sort is bounded (i.e., only the first k result tuples are needed) * and k tuples can fit into sort_mem, we use a heap method that keeps only @@ -1790,9 +2106,11 @@ cost_recursive_union(Path *runion, Path *nrterm, Path *rterm) * 'comparison_cost' is the extra cost per comparison, if any * 'sort_mem' is the number of kilobytes of work memory allowed for the sort * 'limit_tuples' is the bound on the number of output tuples; -1 if no bound + * 'startup_cost' is expected to be 0 at input. If there is "input cost" it should + * be added by caller later */ static void -cost_tuplesort(Cost *startup_cost, Cost *run_cost, +cost_tuplesort(PlannerInfo *root, List *pathkeys, Cost *startup_cost, Cost *run_cost, double tuples, int width, Cost comparison_cost, int sort_mem, double limit_tuples) @@ -1809,9 +2127,6 @@ cost_tuplesort(Cost *startup_cost, Cost *run_cost, if (tuples < 2.0) tuples = 2.0; - /* Include the default cost-per-comparison */ - comparison_cost += 2.0 * cpu_operator_cost; - /* Do we have a useful LIMIT? */ if (limit_tuples > 0 && limit_tuples < tuples) { @@ -1835,12 +2150,10 @@ cost_tuplesort(Cost *startup_cost, Cost *run_cost, double log_runs; double npageaccesses; - /* - * CPU costs - * - * Assume about N log2 N comparisons - */ - *startup_cost = comparison_cost * tuples * LOG2(tuples); + /* CPU costs */ + *startup_cost = compute_cpu_sort_cost(root, pathkeys, 0, + comparison_cost, tuples, + tuples, false); /* Disk costs */ @@ -1856,18 +2169,17 @@ cost_tuplesort(Cost *startup_cost, Cost *run_cost, } else if (tuples > 2 * output_tuples || input_bytes > sort_mem_bytes) { - /* - * We'll use a bounded heap-sort keeping just K tuples in memory, for - * a total number of tuple comparisons of N log2 K; but the constant - * factor is a bit higher than for quicksort. Tweak it so that the - * cost curve is continuous at the crossover point. - */ - *startup_cost = comparison_cost * tuples * LOG2(2.0 * output_tuples); + /* We'll use a bounded heap-sort keeping just K tuples in memory. */ + *startup_cost = compute_cpu_sort_cost(root, pathkeys, 0, + comparison_cost, tuples, + output_tuples, true); } else { /* We'll use plain quicksort on all the input tuples */ - *startup_cost = comparison_cost * tuples * LOG2(tuples); + *startup_cost = compute_cpu_sort_cost(root, pathkeys, 0, + comparison_cost, tuples, + tuples, false); } /* @@ -1900,8 +2212,8 @@ cost_incremental_sort(Path *path, double input_tuples, int width, Cost comparison_cost, int sort_mem, double limit_tuples) { - Cost startup_cost = 0, - run_cost = 0, + Cost startup_cost, + run_cost, input_run_cost = input_total_cost - input_startup_cost; double group_tuples, input_groups; @@ -1986,7 +2298,7 @@ cost_incremental_sort(Path *path, * pessimistic about incremental sort performance and increase its average * group size by half. */ - cost_tuplesort(&group_startup_cost, &group_run_cost, + cost_tuplesort(root, pathkeys, &group_startup_cost, &group_run_cost, 1.5 * group_tuples, width, comparison_cost, sort_mem, limit_tuples); @@ -1994,7 +2306,7 @@ cost_incremental_sort(Path *path, * Startup cost of incremental sort is the startup cost of its first group * plus the cost of its input. */ - startup_cost += group_startup_cost + startup_cost = group_startup_cost + input_startup_cost + group_input_run_cost; /* @@ -2003,7 +2315,7 @@ cost_incremental_sort(Path *path, * group, plus the total cost to process the remaining groups, plus the * remaining cost of input. */ - run_cost += group_run_cost + run_cost = group_run_cost + (group_run_cost + group_startup_cost) * (input_groups - 1) + group_input_run_cost * (input_groups - 1); @@ -2043,7 +2355,7 @@ cost_sort(Path *path, PlannerInfo *root, Cost startup_cost; Cost run_cost; - cost_tuplesort(&startup_cost, &run_cost, + cost_tuplesort(root, pathkeys, &startup_cost, &run_cost, tuples, width, comparison_cost, sort_mem, limit_tuples); @@ -2141,7 +2453,7 @@ append_nonpartial_cost(List *subpaths, int numpaths, int parallel_workers) * Determines and returns the cost of an Append node. */ void -cost_append(AppendPath *apath) +cost_append(AppendPath *apath, PlannerInfo *root) { ListCell *l; @@ -2209,7 +2521,7 @@ cost_append(AppendPath *apath) * any child. */ cost_sort(&sort_path, - NULL, /* doesn't currently need root */ + root, pathkeys, subpath->total_cost, subpath->rows, diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c index 8c6770de97..258302840f 100644 --- a/src/backend/optimizer/path/equivclass.c +++ b/src/backend/optimizer/path/equivclass.c @@ -681,7 +681,18 @@ get_eclass_for_sort_expr(PlannerInfo *root, if (opcintype == cur_em->em_datatype && equal(expr, cur_em->em_expr)) - return cur_ec; /* Match! */ + { + /* + * Match! + * + * Copy the sortref if it wasn't set yet. That may happen if the + * ec was constructed from WHERE clause, i.e. it doesn't have a + * target reference at all. + */ + if (cur_ec->ec_sortref == 0 && sortref > 0) + cur_ec->ec_sortref = sortref; + return cur_ec; + } } } diff --git a/src/backend/optimizer/path/pathkeys.c b/src/backend/optimizer/path/pathkeys.c index 86a35cdef1..75fe03fd04 100644 --- a/src/backend/optimizer/path/pathkeys.c +++ b/src/backend/optimizer/path/pathkeys.c @@ -17,17 +17,22 @@ */ #include "postgres.h" +#include "miscadmin.h" #include "access/stratnum.h" #include "catalog/pg_opfamily.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "nodes/plannodes.h" +#include "optimizer/cost.h" #include "optimizer/optimizer.h" #include "optimizer/pathnode.h" #include "optimizer/paths.h" #include "partitioning/partbounds.h" #include "utils/lsyscache.h" +#include "utils/selfuncs.h" +/* Consider reordering of GROUP BY keys? */ +bool enable_group_by_reordering = true; static bool pathkey_is_redundant(PathKey *new_pathkey, List *pathkeys); static bool matches_boolean_partition_clause(RestrictInfo *rinfo, @@ -334,6 +339,517 @@ pathkeys_contained_in(List *keys1, List *keys2) return false; } +/* + * group_keys_reorder_by_pathkeys + * Reorder GROUP BY keys to match pathkeys of input path. + * + * Function returns new lists (pathkeys and clauses), original GROUP BY lists + * stay untouched. + * + * Returns the number of GROUP BY keys with a matching pathkey. + */ +int +group_keys_reorder_by_pathkeys(List *pathkeys, List **group_pathkeys, + List **group_clauses) +{ + List *new_group_pathkeys= NIL, + *new_group_clauses = NIL; + ListCell *lc; + int n; + + if (pathkeys == NIL || *group_pathkeys == NIL) + return 0; + + /* + * Walk the pathkeys (determining ordering of the input path) and see if + * there's a matching GROUP BY key. If we find one, we append it to the + * list, and do the same for the clauses. + * + * Once we find the first pathkey without a matching GROUP BY key, the rest + * of the pathkeys are useless and can't be used to evaluate the grouping, + * so we abort the loop and ignore the remaining pathkeys. + * + * XXX Pathkeys are built in a way to allow simply comparing pointers. + */ + foreach(lc, pathkeys) + { + PathKey *pathkey = (PathKey *) lfirst(lc); + SortGroupClause *sgc; + + /* abort on first mismatch */ + if (!list_member_ptr(*group_pathkeys, pathkey)) + break; + + new_group_pathkeys = lappend(new_group_pathkeys, pathkey); + + sgc = get_sortgroupref_clause(pathkey->pk_eclass->ec_sortref, + *group_clauses); + + new_group_clauses = lappend(new_group_clauses, sgc); + } + + /* remember the number of pathkeys with a matching GROUP BY key */ + n = list_length(new_group_pathkeys); + + /* append the remaining group pathkeys (will be treated as not sorted) */ + *group_pathkeys = list_concat_unique_ptr(new_group_pathkeys, + *group_pathkeys); + *group_clauses = list_concat_unique_ptr(new_group_clauses, + *group_clauses); + + return n; +} + +/* + * Used to generate all permutations of a pathkey list. + */ +typedef struct PathkeyMutatorState { + List *elemsList; + ListCell **elemCells; + void **elems; + int *positions; + int mutatorNColumns; + int count; +} PathkeyMutatorState; + + +/* + * PathkeyMutatorInit + * Initialize state of the permutation generator. + * + * We want to generate permutations of elements in the "elems" list. We may want + * to skip some number of elements at the beginning (when treating as presorted) + * or at the end (we only permute a limited number of group keys). + * + * The list is decomposed into elements, and we also keep pointers to individual + * cells. This allows us to build the permuted list quickly and cheaply, without + * creating any copies. + */ +static void +PathkeyMutatorInit(PathkeyMutatorState *state, List *elems, int start, int end) +{ + int i; + int n = end - start; + ListCell *lc; + + memset(state, 0, sizeof(*state)); + + state->mutatorNColumns = n; + + state->elemsList = list_copy(elems); + + state->elems = palloc(sizeof(void*) * n); + state->elemCells = palloc(sizeof(ListCell*) * n); + state->positions = palloc(sizeof(int) * n); + + i = 0; + for_each_cell(lc, state->elemsList, list_nth_cell(state->elemsList, start)) + { + state->elemCells[i] = lc; + state->elems[i] = lfirst(lc); + state->positions[i] = i + 1; + i++; + + if (i >= n) + break; + } +} + +/* Swap two elements of an array. */ +static void +PathkeyMutatorSwap(int *a, int i, int j) +{ + int s = a[i]; + + a[i] = a[j]; + a[j] = s; +} + +/* + * Generate the next permutation of elements. + */ +static bool +PathkeyMutatorNextSet(int *a, int n) +{ + int j, k, l, r; + + j = n - 2; + + while (j >= 0 && a[j] >= a[j + 1]) + j--; + + if (j < 0) + return false; + + k = n - 1; + + while (k >= 0 && a[j] >= a[k]) + k--; + + PathkeyMutatorSwap(a, j, k); + + l = j + 1; + r = n - 1; + + while (l < r) + PathkeyMutatorSwap(a, l++, r--); + + return true; +} + +/* + * PathkeyMutatorNext + * Generate the next permutation of list of elements. + * + * Returns the next permutation (as a list of elements) or NIL if there are no + * more permutations. + */ +static List * +PathkeyMutatorNext(PathkeyMutatorState *state) +{ + int i; + + state->count++; + + /* first permutation is original list */ + if (state->count == 1) + return state->elemsList; + + /* when there are no more permutations, return NIL */ + if (!PathkeyMutatorNextSet(state->positions, state->mutatorNColumns)) + { + pfree(state->elems); + pfree(state->elemCells); + pfree(state->positions); + + list_free(state->elemsList); + + return NIL; + } + + /* update the list cells to point to the right elements */ + for(i = 0; i < state->mutatorNColumns; i++) + lfirst(state->elemCells[i]) = + (void *) state->elems[ state->positions[i] - 1 ]; + + return state->elemsList; +} + +/* + * Cost of comparing pathkeys. + */ +typedef struct PathkeySortCost +{ + Cost cost; + PathKey *pathkey; +} PathkeySortCost; + +static int +pathkey_sort_cost_comparator(const void *_a, const void *_b) +{ + const PathkeySortCost *a = (PathkeySortCost *) _a; + const PathkeySortCost *b = (PathkeySortCost *) _b; + + if (a->cost < b->cost) + return -1; + else if (a->cost == b->cost) + return 0; + return 1; +} + +/* + * get_cheapest_group_keys_order + * Reorders the group pathkeys/clauses to minimize the comparison cost. + * + * Given a list of pathkeys, we try to reorder them in a way that minimizes + * the CPU cost of sorting. This depends mainly on the cost of comparator + * function (the pathkeys may use different data types) and the number of + * distinct values in each column (which affects the number of comparator + * calls for the following pathkeys). + * + * In case the input is partially sorted, only the remaining pathkeys are + * considered. + * + * Returns true if the keys/clauses have been reordered (or might have been), + * and a new list is returned through an argument. The list is a new copy + * and may be freed using list_free. + * + * Returns false if no reordering was possible. + */ +static bool +get_cheapest_group_keys_order(PlannerInfo *root, double nrows, + List **group_pathkeys, List **group_clauses, + int n_preordered) +{ + List *new_group_pathkeys = NIL, + *new_group_clauses = NIL, + *var_group_pathkeys; + + ListCell *cell; + PathkeyMutatorState mstate; + double cheapest_sort_cost = -1.0; + + int nFreeKeys; + int nToPermute; + + /* If there are less than 2 unsorted pathkeys, we're done. */ + if (list_length(*group_pathkeys) - n_preordered < 2) + return false; + + /* + * We could exhaustively cost all possible orderings of the pathkeys, but for + * a large number of pathkeys it might be prohibitively expensive. So we try + * to apply simple cheap heuristics first - we sort the pathkeys by sort cost + * (as if the pathkey was sorted independently) and then check only the four + * cheapest pathkeys. The remaining pathkeys are kept ordered by cost. + * + * XXX This is a very simple heuristics, but likely to work fine for most + * cases (because the number of GROUP BY clauses tends to be lower than 4). + * But it ignores how the number of distinct values in each pathkey affects + * the following steps. It might be better to use "more expensive" pathkey + * first if it has many distinct values, because it then limits the number + * of comparisons for the remaining pathkeys. But evaluating that is likely + * quite the expensive. + */ + nFreeKeys = list_length(*group_pathkeys) - n_preordered; + nToPermute = 4; + if (nFreeKeys > nToPermute) + { + int i; + PathkeySortCost *costs = palloc(sizeof(PathkeySortCost) * nFreeKeys); + + /* skip the pre-ordered pathkeys */ + cell = list_nth_cell(*group_pathkeys, n_preordered); + + /* estimate cost for sorting individual pathkeys */ + for (i = 0; cell != NULL; i++, (cell = lnext(*group_pathkeys, cell))) + { + List *to_cost = list_make1(lfirst(cell)); + + Assert(i < nFreeKeys); + + costs[i].pathkey = lfirst(cell); + costs[i].cost = cost_sort_estimate(root, to_cost, 0, nrows); + + pfree(to_cost); + } + + /* sort the pathkeys by sort cost in ascending order */ + qsort(costs, nFreeKeys, sizeof(*costs), pathkey_sort_cost_comparator); + + /* + * Rebuild the list of pathkeys - first the preordered ones, then the + * rest ordered by cost. + */ + new_group_pathkeys = list_truncate(list_copy(*group_pathkeys), n_preordered); + + for (i = 0; i < nFreeKeys; i++) + new_group_pathkeys = lappend(new_group_pathkeys, costs[i].pathkey); + + pfree(costs); + } + else + { + /* Copy the list, so that we can free the new list by list_free. */ + new_group_pathkeys = list_copy(*group_pathkeys); + nToPermute = nFreeKeys; + } + + Assert(list_length(new_group_pathkeys) == list_length(*group_pathkeys)); + + /* + * Generate pathkey lists with permutations of the first nToPermute pathkeys. + * + * XXX We simply calculate sort cost for each individual pathkey list, but + * there's room for two dynamic programming optimizations here. Firstly, we + * may pass the current "best" cost to cost_sort_estimate so that it can + * "abort" if the estimated pathkeys list exceeds it. Secondly, it could pass + * the return information about the position when it exceeded the cost, and + * we could skip all permutations with the same prefix. + * + * Imagine we've already found ordering with cost C1, and we're evaluating + * another ordering - cost_sort_estimate() calculates cost by adding the + * pathkeys one by one (more or less), and the cost only grows. If at any + * point it exceeds C1, it can't possibly be "better" so we can discard it. + * But we also know that we can discard all ordering with the same prefix, + * because if we're estimating (a,b,c,d) and we exceed C1 at (a,b) then the + * same thing will happen for any ordering with this prefix. + */ + PathkeyMutatorInit(&mstate, new_group_pathkeys, n_preordered, n_preordered + nToPermute); + + while((var_group_pathkeys = PathkeyMutatorNext(&mstate)) != NIL) + { + Cost cost; + + cost = cost_sort_estimate(root, var_group_pathkeys, n_preordered, nrows); + + if (cost < cheapest_sort_cost || cheapest_sort_cost < 0) + { + list_free(new_group_pathkeys); + new_group_pathkeys = list_copy(var_group_pathkeys); + cheapest_sort_cost = cost; + } + } + + /* Reorder the group clauses according to the reordered pathkeys. */ + foreach(cell, new_group_pathkeys) + { + PathKey *pathkey = (PathKey *) lfirst(cell); + + new_group_clauses = lappend(new_group_clauses, + get_sortgroupref_clause(pathkey->pk_eclass->ec_sortref, + *group_clauses)); + } + + /* Just append the rest GROUP BY clauses */ + new_group_clauses = list_concat_unique_ptr(new_group_clauses, + *group_clauses); + + *group_pathkeys = new_group_pathkeys; + *group_clauses = new_group_clauses; + + return true; +} + +/* + * get_useful_group_keys_orderings + * Determine which orderings of GROUP BY keys are potentially interesting. + * + * Returns list of PathKeyInfo items, each representing an interesting ordering + * of GROUP BY keys. Each item stores pathkeys and clauses in matching order. + * + * The function considers (and keeps) multiple group by orderings: + * + * - the original ordering, as specified by the GROUP BY clause + * + * - GROUP BY keys reordered to minimize the sort cost + * + * - GROUP BY keys reordered to match path ordering (as much as possible), with + * the tail reordered to minimize the sort cost + * + * - GROUP BY keys to match target ORDER BY clause (as much as possible), with + * the tail reordered to minimize the sort cost + * + * There are other potentially interesting orderings (e.g. it might be best to + * match the first ORDER BY key, order the remaining keys differently and then + * rely on the incremental sort to fix this), but we ignore those for now. To + * make this work we'd have to pretty much generate all possible permutations. + */ +List * +get_useful_group_keys_orderings(PlannerInfo *root, double nrows, + List *path_pathkeys, + List *group_pathkeys, List *group_clauses) +{ + Query *parse = root->parse; + List *infos = NIL; + PathKeyInfo *info; + int n_preordered = 0; + + List *pathkeys = group_pathkeys; + List *clauses = group_clauses; + + /* always return at least the original pathkeys/clauses */ + info = makeNode(PathKeyInfo); + info->pathkeys = pathkeys; + info->clauses = clauses; + + infos = lappend(infos, info); + + /* + * Should we try generating alternative orderings of the group keys? If not, + * we produce only the order specified in the query, i.e. the optimization + * is effectively disabled. + */ + if (!enable_group_by_reordering) + return infos; + + /* for grouping sets we can't do any reordering */ + if (parse->groupingSets) + return infos; + + /* + * Try reordering pathkeys to minimize the sort cost, ignoring both the + * target ordering (ORDER BY) and ordering of the input path. + */ + if (get_cheapest_group_keys_order(root, nrows, &pathkeys, &clauses, + n_preordered)) + { + info = makeNode(PathKeyInfo); + info->pathkeys = pathkeys; + info->clauses = clauses; + + infos = lappend(infos, info); + } + + /* + * If the path is sorted in some way, try reordering the group keys to match + * as much of the ordering as possible - we get this sort for free (mostly). + * + * We must not do this when there are no grouping sets, because those use + * more complex logic to decide the ordering. + * + * XXX Isn't this somewhat redundant with presorted_keys? Actually, it's + * more a complement, because it allows benefiting from incremental sort + * as much as possible. + * + * XXX This does nothing if (n_preordered == 0). We shouldn't create the + * info in this case. + */ + if (path_pathkeys) + { + n_preordered = group_keys_reorder_by_pathkeys(path_pathkeys, + &pathkeys, + &clauses); + + /* reorder the tail to minimize sort cost */ + get_cheapest_group_keys_order(root, nrows, &pathkeys, &clauses, + n_preordered); + + /* + * reorder the tail to minimize sort cost + * + * XXX Ignore the return value - there may be nothing to reorder, in + * which case get_cheapest_group_keys_order returns false. But we + * still want to keep the keys reordered to path_pathkeys. + */ + info = makeNode(PathKeyInfo); + info->pathkeys = pathkeys; + info->clauses = clauses; + + infos = lappend(infos, info); + } + + /* + * Try reordering pathkeys to minimize the sort cost (this time consider + * the ORDER BY clause, but only if set debug_group_by_match_order_by). + */ + if (root->sort_pathkeys) + { + n_preordered = group_keys_reorder_by_pathkeys(root->sort_pathkeys, + &pathkeys, + &clauses); + + /* + * reorder the tail to minimize sort cost + * + * XXX Ignore the return value - there may be nothing to reorder, in + * which case get_cheapest_group_keys_order returns false. But we + * still want to keep the keys reordered to sort_pathkeys. + */ + get_cheapest_group_keys_order(root, nrows, &pathkeys, &clauses, + n_preordered); + + /* keep the group keys reordered to match ordering of input path */ + info = makeNode(PathKeyInfo); + info->pathkeys = pathkeys; + info->clauses = clauses; + + infos = lappend(infos, info); + } + + return infos; +} + /* * pathkeys_count_contained_in * Same as pathkeys_contained_in, but also sets length of longest @@ -1862,6 +2378,54 @@ pathkeys_useful_for_ordering(PlannerInfo *root, List *pathkeys) return n_common_pathkeys; } +/* + * pathkeys_useful_for_grouping + * Count the number of pathkeys that are useful for grouping (instead of + * explicit sort) + * + * Group pathkeys could be reordered to benefit from the odering. The ordering + * may not be "complete" and may require incremental sort, but that's fine. So + * we simply count prefix pathkeys with a matching group key, and stop once we + * find the first pathkey without a match. + * + * So e.g. with pathkeys (a,b,c) and group keys (a,b,e) this determines (a,b) + * pathkeys are useful for grouping, and we might do incremental sort to get + * path ordered by (a,b,e). + * + * This logic is necessary to retain paths with ordeding not matching grouping + * keys directly, without the reordering. + * + * Returns the length of pathkey prefix with matching group keys. + */ +static int +pathkeys_useful_for_grouping(PlannerInfo *root, List *pathkeys) +{ + ListCell *key; + int n = 0; + + /* no special ordering requested for grouping */ + if (root->group_pathkeys == NIL) + return 0; + + /* unordered path */ + if (pathkeys == NIL) + return 0; + + /* walk the pathkeys and search for matching group key */ + foreach(key, pathkeys) + { + PathKey *pathkey = (PathKey *) lfirst(key); + + /* no matching group key, we're done */ + if (!list_member_ptr(root->group_pathkeys, pathkey)) + break; + + n++; + } + + return n; +} + /* * truncate_useless_pathkeys * Shorten the given pathkey list to just the useful pathkeys. @@ -1876,6 +2440,9 @@ truncate_useless_pathkeys(PlannerInfo *root, nuseful = pathkeys_useful_for_merging(root, rel, pathkeys); nuseful2 = pathkeys_useful_for_ordering(root, pathkeys); + if (nuseful2 > nuseful) + nuseful = nuseful2; + nuseful2 = pathkeys_useful_for_grouping(root, pathkeys); if (nuseful2 > nuseful) nuseful = nuseful2; @@ -1911,6 +2478,8 @@ has_useful_pathkeys(PlannerInfo *root, RelOptInfo *rel) { if (rel->joininfo != NIL || rel->has_eclass_joins) return true; /* might be able to use pathkeys for merging */ + if (root->group_pathkeys != NIL) + return true; /* might be able to use pathkeys for grouping */ if (root->query_pathkeys != NIL) return true; /* might be able to use them for ordering */ return false; /* definitely useless */ diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 547fda20a2..b2569c5d0c 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -6218,24 +6218,121 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, */ foreach(lc, input_rel->pathlist) { + ListCell *lc2; Path *path = (Path *) lfirst(lc); Path *path_original = path; - bool is_sorted; - int presorted_keys; - is_sorted = pathkeys_count_contained_in(root->group_pathkeys, - path->pathkeys, - &presorted_keys); + List *pathkey_orderings = NIL; + + List *group_pathkeys = root->group_pathkeys; + List *group_clauses = parse->groupClause; + + /* generate alternative group orderings that might be useful */ + pathkey_orderings = get_useful_group_keys_orderings(root, + path->rows, + path->pathkeys, + group_pathkeys, + group_clauses); - if (path == cheapest_path || is_sorted) + Assert(list_length(pathkey_orderings) > 0); + + /* process all potentially interesting grouping reorderings */ + foreach (lc2, pathkey_orderings) { - /* Sort the cheapest-total path if it isn't already sorted */ - if (!is_sorted) - path = (Path *) create_sort_path(root, - grouped_rel, - path, - root->group_pathkeys, - -1.0); + bool is_sorted; + int presorted_keys = 0; + PathKeyInfo *info = (PathKeyInfo *) lfirst(lc2); + + /* restore the path (we replace it in the loop) */ + path = path_original; + + is_sorted = pathkeys_count_contained_in(info->pathkeys, + path->pathkeys, + &presorted_keys); + + if (path == cheapest_path || is_sorted) + { + /* Sort the cheapest-total path if it isn't already sorted */ + if (!is_sorted) + path = (Path *) create_sort_path(root, + grouped_rel, + path, + info->pathkeys, + -1.0); + + /* Now decide what to stick atop it */ + if (parse->groupingSets) + { + consider_groupingsets_paths(root, grouped_rel, + path, true, can_hash, + gd, agg_costs, dNumGroups); + } + else if (parse->hasAggs) + { + /* + * We have aggregation, possibly with plain GROUP BY. Make + * an AggPath. + */ + add_path(grouped_rel, (Path *) + create_agg_path(root, + grouped_rel, + path, + grouped_rel->reltarget, + info->clauses ? AGG_SORTED : AGG_PLAIN, + AGGSPLIT_SIMPLE, + info->clauses, + havingQual, + agg_costs, + dNumGroups)); + } + else if (group_clauses) + { + /* + * We have GROUP BY without aggregation or grouping sets. + * Make a GroupPath. + */ + add_path(grouped_rel, (Path *) + create_group_path(root, + grouped_rel, + path, + info->clauses, + havingQual, + dNumGroups)); + } + else + { + /* Other cases should have been handled above */ + Assert(false); + } + } + + /* + * Now we may consider incremental sort on this path, but only + * when the path is not already sorted and when incremental sort + * is enabled. + */ + if (is_sorted || !enable_incremental_sort) + continue; + + /* Restore the input path (we might have added Sort on top). */ + path = path_original; + + /* no shared prefix, no point in building incremental sort */ + if (presorted_keys == 0) + continue; + + /* + * We should have already excluded pathkeys of length 1 because + * then presorted_keys > 0 would imply is_sorted was true. + */ + Assert(list_length(root->group_pathkeys) != 1); + + path = (Path *) create_incremental_sort_path(root, + grouped_rel, + path, + info->pathkeys, + presorted_keys, + -1.0); /* Now decide what to stick atop it */ if (parse->groupingSets) @@ -6247,17 +6344,17 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, else if (parse->hasAggs) { /* - * We have aggregation, possibly with plain GROUP BY. Make - * an AggPath. + * We have aggregation, possibly with plain GROUP BY. Make an + * AggPath. */ add_path(grouped_rel, (Path *) create_agg_path(root, grouped_rel, path, grouped_rel->reltarget, - parse->groupClause ? AGG_SORTED : AGG_PLAIN, + info->clauses ? AGG_SORTED : AGG_PLAIN, AGGSPLIT_SIMPLE, - parse->groupClause, + info->clauses, havingQual, agg_costs, dNumGroups)); @@ -6265,14 +6362,14 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, else if (parse->groupClause) { /* - * We have GROUP BY without aggregation or grouping sets. - * Make a GroupPath. + * We have GROUP BY without aggregation or grouping sets. Make + * a GroupPath. */ add_path(grouped_rel, (Path *) create_group_path(root, grouped_rel, path, - parse->groupClause, + info->clauses, havingQual, dNumGroups)); } @@ -6282,79 +6379,6 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, Assert(false); } } - - /* - * Now we may consider incremental sort on this path, but only - * when the path is not already sorted and when incremental sort - * is enabled. - */ - if (is_sorted || !enable_incremental_sort) - continue; - - /* Restore the input path (we might have added Sort on top). */ - path = path_original; - - /* no shared prefix, no point in building incremental sort */ - if (presorted_keys == 0) - continue; - - /* - * We should have already excluded pathkeys of length 1 because - * then presorted_keys > 0 would imply is_sorted was true. - */ - Assert(list_length(root->group_pathkeys) != 1); - - path = (Path *) create_incremental_sort_path(root, - grouped_rel, - path, - root->group_pathkeys, - presorted_keys, - -1.0); - - /* Now decide what to stick atop it */ - if (parse->groupingSets) - { - consider_groupingsets_paths(root, grouped_rel, - path, true, can_hash, - gd, agg_costs, dNumGroups); - } - else if (parse->hasAggs) - { - /* - * We have aggregation, possibly with plain GROUP BY. Make an - * AggPath. - */ - add_path(grouped_rel, (Path *) - create_agg_path(root, - grouped_rel, - path, - grouped_rel->reltarget, - parse->groupClause ? AGG_SORTED : AGG_PLAIN, - AGGSPLIT_SIMPLE, - parse->groupClause, - havingQual, - agg_costs, - dNumGroups)); - } - else if (parse->groupClause) - { - /* - * We have GROUP BY without aggregation or grouping sets. Make - * a GroupPath. - */ - add_path(grouped_rel, (Path *) - create_group_path(root, - grouped_rel, - path, - parse->groupClause, - havingQual, - dNumGroups)); - } - else - { - /* Other cases should have been handled above */ - Assert(false); - } } /* @@ -6365,100 +6389,124 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, { foreach(lc, partially_grouped_rel->pathlist) { + ListCell *lc2; Path *path = (Path *) lfirst(lc); Path *path_original = path; - bool is_sorted; - int presorted_keys; - is_sorted = pathkeys_count_contained_in(root->group_pathkeys, - path->pathkeys, - &presorted_keys); + List *pathkey_orderings = NIL; - /* - * Insert a Sort node, if required. But there's no point in - * sorting anything but the cheapest path. - */ - if (!is_sorted) + List *group_pathkeys = root->group_pathkeys; + List *group_clauses = parse->groupClause; + + /* generate alternative group orderings that might be useful */ + pathkey_orderings = get_useful_group_keys_orderings(root, + path->rows, + path->pathkeys, + group_pathkeys, + group_clauses); + + Assert(list_length(pathkey_orderings) > 0); + + /* process all potentially interesting grouping reorderings */ + foreach (lc2, pathkey_orderings) { - if (path != partially_grouped_rel->cheapest_total_path) - continue; - path = (Path *) create_sort_path(root, - grouped_rel, - path, - root->group_pathkeys, - -1.0); - } + bool is_sorted; + int presorted_keys = 0; + PathKeyInfo *info = (PathKeyInfo *) lfirst(lc2); - if (parse->hasAggs) - add_path(grouped_rel, (Path *) - create_agg_path(root, - grouped_rel, - path, - grouped_rel->reltarget, - parse->groupClause ? AGG_SORTED : AGG_PLAIN, - AGGSPLIT_FINAL_DESERIAL, - parse->groupClause, - havingQual, - agg_final_costs, - dNumGroups)); - else - add_path(grouped_rel, (Path *) - create_group_path(root, - grouped_rel, - path, - parse->groupClause, - havingQual, - dNumGroups)); + /* restore the path (we replace it in the loop) */ + path = path_original; - /* - * Now we may consider incremental sort on this path, but only - * when the path is not already sorted and when incremental - * sort is enabled. - */ - if (is_sorted || !enable_incremental_sort) - continue; + is_sorted = pathkeys_count_contained_in(info->pathkeys, + path->pathkeys, + &presorted_keys); - /* Restore the input path (we might have added Sort on top). */ - path = path_original; + /* + * Insert a Sort node, if required. But there's no point in + * sorting anything but the cheapest path. + */ + if (!is_sorted) + { + if (path != partially_grouped_rel->cheapest_total_path) + continue; + path = (Path *) create_sort_path(root, + grouped_rel, + path, + info->pathkeys, + -1.0); + } - /* no shared prefix, not point in building incremental sort */ - if (presorted_keys == 0) - continue; + if (parse->hasAggs) + add_path(grouped_rel, (Path *) + create_agg_path(root, + grouped_rel, + path, + grouped_rel->reltarget, + info->clauses ? AGG_SORTED : AGG_PLAIN, + AGGSPLIT_FINAL_DESERIAL, + info->clauses, + havingQual, + agg_final_costs, + dNumGroups)); + else + add_path(grouped_rel, (Path *) + create_group_path(root, + grouped_rel, + path, + info->clauses, + havingQual, + dNumGroups)); - /* - * We should have already excluded pathkeys of length 1 - * because then presorted_keys > 0 would imply is_sorted was - * true. - */ - Assert(list_length(root->group_pathkeys) != 1); + /* + * Now we may consider incremental sort on this path, but only + * when the path is not already sorted and when incremental + * sort is enabled. + */ + if (is_sorted || !enable_incremental_sort) + continue; - path = (Path *) create_incremental_sort_path(root, - grouped_rel, - path, - root->group_pathkeys, - presorted_keys, - -1.0); + /* Restore the input path (we might have added Sort on top). */ + path = path_original; - if (parse->hasAggs) - add_path(grouped_rel, (Path *) - create_agg_path(root, - grouped_rel, - path, - grouped_rel->reltarget, - parse->groupClause ? AGG_SORTED : AGG_PLAIN, - AGGSPLIT_FINAL_DESERIAL, - parse->groupClause, - havingQual, - agg_final_costs, - dNumGroups)); - else - add_path(grouped_rel, (Path *) - create_group_path(root, - grouped_rel, - path, - parse->groupClause, - havingQual, - dNumGroups)); + /* no shared prefix, not point in building incremental sort */ + if (presorted_keys == 0) + continue; + + /* + * We should have already excluded pathkeys of length 1 + * because then presorted_keys > 0 would imply is_sorted was + * true. + */ + Assert(list_length(root->group_pathkeys) != 1); + + path = (Path *) create_incremental_sort_path(root, + grouped_rel, + path, + info->pathkeys, + presorted_keys, + -1.0); + + if (parse->hasAggs) + add_path(grouped_rel, (Path *) + create_agg_path(root, + grouped_rel, + path, + grouped_rel->reltarget, + info->clauses ? AGG_SORTED : AGG_PLAIN, + AGGSPLIT_FINAL_DESERIAL, + info->clauses, + havingQual, + agg_final_costs, + dNumGroups)); + else + add_path(grouped_rel, (Path *) + create_group_path(root, + grouped_rel, + path, + info->clauses, + havingQual, + dNumGroups)); + } } } } @@ -6661,41 +6709,71 @@ create_partial_grouping_paths(PlannerInfo *root, */ foreach(lc, input_rel->pathlist) { + ListCell *lc2; Path *path = (Path *) lfirst(lc); - bool is_sorted; + Path *path_save = path; - is_sorted = pathkeys_contained_in(root->group_pathkeys, - path->pathkeys); - if (path == cheapest_total_path || is_sorted) + List *pathkey_orderings = NIL; + + List *group_pathkeys = root->group_pathkeys; + List *group_clauses = parse->groupClause; + + /* generate alternative group orderings that might be useful */ + pathkey_orderings = get_useful_group_keys_orderings(root, + path->rows, + path->pathkeys, + group_pathkeys, + group_clauses); + + Assert(list_length(pathkey_orderings) > 0); + + /* process all potentially interesting grouping reorderings */ + foreach (lc2, pathkey_orderings) { - /* Sort the cheapest partial path, if it isn't already */ - if (!is_sorted) - path = (Path *) create_sort_path(root, - partially_grouped_rel, - path, - root->group_pathkeys, - -1.0); + bool is_sorted; + int presorted_keys = 0; + PathKeyInfo *info = (PathKeyInfo *) lfirst(lc2); - if (parse->hasAggs) - add_path(partially_grouped_rel, (Path *) - create_agg_path(root, - partially_grouped_rel, - path, - partially_grouped_rel->reltarget, - parse->groupClause ? AGG_SORTED : AGG_PLAIN, - AGGSPLIT_INITIAL_SERIAL, - parse->groupClause, - NIL, - agg_partial_costs, - dNumPartialGroups)); - else - add_path(partially_grouped_rel, (Path *) - create_group_path(root, - partially_grouped_rel, - path, - parse->groupClause, - NIL, - dNumPartialGroups)); + /* restore the path (we replace it in the loop) */ + path = path_save; + + is_sorted = pathkeys_count_contained_in(info->pathkeys, + path->pathkeys, + &presorted_keys); + + if (path == cheapest_total_path || is_sorted) + { + /* Sort the cheapest partial path, if it isn't already */ + if (!is_sorted) + { + path = (Path *) create_sort_path(root, + partially_grouped_rel, + path, + info->pathkeys, + -1.0); + } + + if (parse->hasAggs) + add_path(partially_grouped_rel, (Path *) + create_agg_path(root, + partially_grouped_rel, + path, + partially_grouped_rel->reltarget, + info->clauses ? AGG_SORTED : AGG_PLAIN, + AGGSPLIT_INITIAL_SERIAL, + info->clauses, + NIL, + agg_partial_costs, + dNumPartialGroups)); + else + add_path(partially_grouped_rel, (Path *) + create_group_path(root, + partially_grouped_rel, + path, + info->clauses, + NIL, + dNumPartialGroups)); + } } } @@ -6705,6 +6783,8 @@ create_partial_grouping_paths(PlannerInfo *root, * We can also skip the entire loop when we only have a single-item * group_pathkeys because then we can't possibly have a presorted * prefix of the list without having the list be fully sorted. + * + * XXX Shouldn't this also consider the group-key-reordering? */ if (enable_incremental_sort && list_length(root->group_pathkeys) > 1) { @@ -6763,24 +6843,100 @@ create_partial_grouping_paths(PlannerInfo *root, /* Similar to above logic, but for partial paths. */ foreach(lc, input_rel->partial_pathlist) { + ListCell *lc2; Path *path = (Path *) lfirst(lc); Path *path_original = path; - bool is_sorted; - int presorted_keys; - is_sorted = pathkeys_count_contained_in(root->group_pathkeys, - path->pathkeys, - &presorted_keys); + List *pathkey_orderings = NIL; + + List *group_pathkeys = root->group_pathkeys; + List *group_clauses = parse->groupClause; - if (path == cheapest_partial_path || is_sorted) + /* generate alternative group orderings that might be useful */ + pathkey_orderings = get_useful_group_keys_orderings(root, + path->rows, + path->pathkeys, + group_pathkeys, + group_clauses); + + Assert(list_length(pathkey_orderings) > 0); + + /* process all potentially interesting grouping reorderings */ + foreach (lc2, pathkey_orderings) { - /* Sort the cheapest partial path, if it isn't already */ - if (!is_sorted) - path = (Path *) create_sort_path(root, - partially_grouped_rel, - path, - root->group_pathkeys, - -1.0); + bool is_sorted; + int presorted_keys = 0; + PathKeyInfo *info = (PathKeyInfo *) lfirst(lc2); + + /* restore the path (we replace it in the loop) */ + path = path_original; + + is_sorted = pathkeys_count_contained_in(info->pathkeys, + path->pathkeys, + &presorted_keys); + + if (path == cheapest_partial_path || is_sorted) + { + + /* Sort the cheapest partial path, if it isn't already */ + if (!is_sorted) + { + path = (Path *) create_sort_path(root, + partially_grouped_rel, + path, + info->pathkeys, + -1.0); + } + + if (parse->hasAggs) + add_partial_path(partially_grouped_rel, (Path *) + create_agg_path(root, + partially_grouped_rel, + path, + partially_grouped_rel->reltarget, + info->clauses ? AGG_SORTED : AGG_PLAIN, + AGGSPLIT_INITIAL_SERIAL, + info->clauses, + NIL, + agg_partial_costs, + dNumPartialPartialGroups)); + else + add_partial_path(partially_grouped_rel, (Path *) + create_group_path(root, + partially_grouped_rel, + path, + info->clauses, + NIL, + dNumPartialPartialGroups)); + } + + /* + * Now we may consider incremental sort on this path, but only + * when the path is not already sorted and when incremental sort + * is enabled. + */ + if (is_sorted || !enable_incremental_sort) + continue; + + /* Restore the input path (we might have added Sort on top). */ + path = path_original; + + /* no shared prefix, not point in building incremental sort */ + if (presorted_keys == 0) + continue; + + /* + * We should have already excluded pathkeys of length 1 because + * then presorted_keys > 0 would imply is_sorted was true. + */ + Assert(list_length(root->group_pathkeys) != 1); + + path = (Path *) create_incremental_sort_path(root, + partially_grouped_rel, + path, + info->pathkeys, + presorted_keys, + -1.0); if (parse->hasAggs) add_partial_path(partially_grouped_rel, (Path *) @@ -6788,9 +6944,9 @@ create_partial_grouping_paths(PlannerInfo *root, partially_grouped_rel, path, partially_grouped_rel->reltarget, - parse->groupClause ? AGG_SORTED : AGG_PLAIN, + info->clauses ? AGG_SORTED : AGG_PLAIN, AGGSPLIT_INITIAL_SERIAL, - parse->groupClause, + info->clauses, NIL, agg_partial_costs, dNumPartialPartialGroups)); @@ -6799,59 +6955,10 @@ create_partial_grouping_paths(PlannerInfo *root, create_group_path(root, partially_grouped_rel, path, - parse->groupClause, + info->clauses, NIL, dNumPartialPartialGroups)); } - - /* - * Now we may consider incremental sort on this path, but only - * when the path is not already sorted and when incremental sort - * is enabled. - */ - if (is_sorted || !enable_incremental_sort) - continue; - - /* Restore the input path (we might have added Sort on top). */ - path = path_original; - - /* no shared prefix, not point in building incremental sort */ - if (presorted_keys == 0) - continue; - - /* - * We should have already excluded pathkeys of length 1 because - * then presorted_keys > 0 would imply is_sorted was true. - */ - Assert(list_length(root->group_pathkeys) != 1); - - path = (Path *) create_incremental_sort_path(root, - partially_grouped_rel, - path, - root->group_pathkeys, - presorted_keys, - -1.0); - - if (parse->hasAggs) - add_partial_path(partially_grouped_rel, (Path *) - create_agg_path(root, - partially_grouped_rel, - path, - partially_grouped_rel->reltarget, - parse->groupClause ? AGG_SORTED : AGG_PLAIN, - AGGSPLIT_INITIAL_SERIAL, - parse->groupClause, - NIL, - agg_partial_costs, - dNumPartialPartialGroups)); - else - add_partial_path(partially_grouped_rel, (Path *) - create_group_path(root, - partially_grouped_rel, - path, - parse->groupClause, - NIL, - dNumPartialPartialGroups)); } } diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c index 99df76b6b7..1670e54644 100644 --- a/src/backend/optimizer/util/pathnode.c +++ b/src/backend/optimizer/util/pathnode.c @@ -1342,7 +1342,7 @@ create_append_path(PlannerInfo *root, pathnode->path.pathkeys = child->pathkeys; } else - cost_append(pathnode); + cost_append(pathnode, root); /* If the caller provided a row estimate, override the computed value. */ if (rows >= 0) diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 1fbb0b28c3..fb4fb987e7 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -3368,11 +3368,28 @@ double estimate_num_groups(PlannerInfo *root, List *groupExprs, double input_rows, List **pgset, EstimationInfo *estinfo) { - List *varinfos = NIL; + return estimate_num_groups_incremental(root, groupExprs, + input_rows, pgset, estinfo, + NULL, 0); +} + +/* + * estimate_num_groups_incremental + * An estimate_num_groups variant, optimized for cases that are adding the + * expressions incrementally (e.g. one by one). + */ +double +estimate_num_groups_incremental(PlannerInfo *root, List *groupExprs, + double input_rows, + List **pgset, EstimationInfo *estinfo, + List **cache_varinfos, int prevNExprs) +{ + List *varinfos = (cache_varinfos) ? *cache_varinfos : NIL; double srf_multiplier = 1.0; double numdistinct; ListCell *l; - int i; + int i, + j; /* Zero the estinfo output parameter, if non-NULL */ if (estinfo != NULL) @@ -3403,7 +3420,7 @@ estimate_num_groups(PlannerInfo *root, List *groupExprs, double input_rows, */ numdistinct = 1.0; - i = 0; + i = j = 0; foreach(l, groupExprs) { Node *groupexpr = (Node *) lfirst(l); @@ -3412,6 +3429,14 @@ estimate_num_groups(PlannerInfo *root, List *groupExprs, double input_rows, List *varshere; ListCell *l2; + /* was done on previous call */ + if (cache_varinfos && j++ < prevNExprs) + { + if (pgset) + i++; /* to keep in sync with lines below */ + continue; + } + /* is expression in this grouping set? */ if (pgset && !list_member_int(*pgset, i++)) continue; @@ -3481,7 +3506,11 @@ estimate_num_groups(PlannerInfo *root, List *groupExprs, double input_rows, if (varshere == NIL) { if (contain_volatile_functions(groupexpr)) + { + if (cache_varinfos) + *cache_varinfos = varinfos; return input_rows; + } continue; } @@ -3498,6 +3527,9 @@ estimate_num_groups(PlannerInfo *root, List *groupExprs, double input_rows, } } + if (cache_varinfos) + *cache_varinfos = varinfos; + /* * If now no Vars, we must have an all-constant or all-boolean GROUP BY * list. diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index eb3a03b976..9e8ab1420d 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -1182,6 +1182,16 @@ static struct config_bool ConfigureNamesBool[] = true, NULL, NULL, NULL }, + { + {"enable_group_by_reordering", PGC_USERSET, QUERY_TUNING_METHOD, + gettext_noop("enable reordering of GROUP BY key"), + NULL, + GUC_EXPLAIN + }, + &enable_group_by_reordering, + true, + NULL, NULL, NULL + }, { {"geqo", PGC_USERSET, QUERY_TUNING_GEQO, gettext_noop("Enables genetic query optimization."), diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index b933fade8c..93d221a37b 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -382,6 +382,7 @@ #enable_seqscan = on #enable_sort = on #enable_tidscan = on +#enable_group_by_reordering = on # - Planner Cost Constants - diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index a56b85fe74..53f6b05a3f 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -277,6 +277,7 @@ typedef enum NodeTag T_EquivalenceClass, T_EquivalenceMember, T_PathKey, + T_PathKeyInfo, T_PathTarget, T_RestrictInfo, T_IndexClause, diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h index 365000bdcd..6cbcb67bdf 100644 --- a/src/include/nodes/pathnodes.h +++ b/src/include/nodes/pathnodes.h @@ -1070,6 +1070,16 @@ typedef struct PathKey bool pk_nulls_first; /* do NULLs come before normal values? */ } PathKey; +/* + * Combines information about pathkeys and the associated clauses. + */ +typedef struct PathKeyInfo +{ + NodeTag type; + List *pathkeys; + List *clauses; +} PathKeyInfo; + /* * VolatileFunctionStatus -- allows nodes to cache their * contain_volatile_functions properties. VOLATILITY_UNKNOWN means not yet diff --git a/src/include/optimizer/cost.h b/src/include/optimizer/cost.h index bc12071af6..dc7fc17411 100644 --- a/src/include/optimizer/cost.h +++ b/src/include/optimizer/cost.h @@ -114,7 +114,9 @@ extern void cost_incremental_sort(Path *path, Cost input_startup_cost, Cost input_total_cost, double input_tuples, int width, Cost comparison_cost, int sort_mem, double limit_tuples); -extern void cost_append(AppendPath *path); +extern Cost cost_sort_estimate(PlannerInfo *root, List *pathkeys, + int nPresortedKeys, double tuples); +extern void cost_append(AppendPath *path, PlannerInfo *root); extern void cost_merge_append(Path *path, PlannerInfo *root, List *pathkeys, int n_streams, Cost input_startup_cost, Cost input_total_cost, diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h index 0c3a0b90c8..2ffa24aa89 100644 --- a/src/include/optimizer/paths.h +++ b/src/include/optimizer/paths.h @@ -24,6 +24,7 @@ extern PGDLLIMPORT bool enable_geqo; extern PGDLLIMPORT int geqo_threshold; extern PGDLLIMPORT int min_parallel_table_scan_size; extern PGDLLIMPORT int min_parallel_index_scan_size; +extern PGDLLIMPORT bool enable_group_by_reordering; /* Hook for plugins to get control in set_rel_pathlist() */ typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, @@ -203,6 +204,12 @@ typedef enum extern PathKeysComparison compare_pathkeys(List *keys1, List *keys2); extern bool pathkeys_contained_in(List *keys1, List *keys2); extern bool pathkeys_count_contained_in(List *keys1, List *keys2, int *n_common); +extern int group_keys_reorder_by_pathkeys(List *pathkeys, + List **group_pathkeys, + List **group_clauses); +extern List *get_useful_group_keys_orderings(PlannerInfo *root, double nrows, + List *path_pathkeys, + List *pathkeys, List *clauses); extern Path *get_cheapest_path_for_pathkeys(List *paths, List *pathkeys, Relids required_outer, CostSelector cost_criterion, diff --git a/src/include/utils/selfuncs.h b/src/include/utils/selfuncs.h index 8f3d73edfb..c313a08d54 100644 --- a/src/include/utils/selfuncs.h +++ b/src/include/utils/selfuncs.h @@ -214,6 +214,11 @@ extern double estimate_num_groups(PlannerInfo *root, List *groupExprs, double input_rows, List **pgset, EstimationInfo *estinfo); +extern double estimate_num_groups_incremental(PlannerInfo *root, List *groupExprs, + double input_rows, List **pgset, + EstimationInfo *estinfo, + List **cache_varinfos, int prevNExprs); + extern void estimate_hash_bucket_stats(PlannerInfo *root, Node *hashkey, double nbuckets, Selectivity *mcv_freq, diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out index 0a23a39aa2..601047fa3d 100644 --- a/src/test/regress/expected/aggregates.out +++ b/src/test/regress/expected/aggregates.out @@ -1210,7 +1210,8 @@ explain (costs off) select distinct min(f1), max(f1) from minmaxtest; QUERY PLAN --------------------------------------------------------------------------------------------- - Unique + HashAggregate + Group Key: $0, $1 InitPlan 1 (returns $0) -> Limit -> Merge Append @@ -1233,10 +1234,8 @@ explain (costs off) -> Index Only Scan using minmaxtest2i on minmaxtest2 minmaxtest_8 Index Cond: (f1 IS NOT NULL) -> Index Only Scan Backward using minmaxtest3i on minmaxtest3 minmaxtest_9 - -> Sort - Sort Key: ($0), ($1) - -> Result -(26 rows) + -> Result +(25 rows) select distinct min(f1), max(f1) from minmaxtest; min | max @@ -2448,6 +2447,241 @@ SELECT balk(hundred) FROM tenk1; (1 row) ROLLBACK; +-- GROUP BY optimization by reorder columns +SELECT + i AS id, + i/2 AS p, + format('%60s', i%2) AS v, + i/4 AS c, + i/8 AS d, + (random() * (10000/8))::int as e --the same as d but no correlation with p + INTO btg +FROM + generate_series(1, 10000) i; +VACUUM btg; +ANALYZE btg; +-- GROUP BY optimization by reorder columns by frequency +SET enable_hashagg=off; +SET max_parallel_workers= 0; +SET max_parallel_workers_per_gather = 0; +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY p, v; + QUERY PLAN +----------------------------- + GroupAggregate + Group Key: p, v + -> Sort + Sort Key: p, v + -> Seq Scan on btg +(5 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p; + QUERY PLAN +----------------------------- + GroupAggregate + Group Key: p, v + -> Sort + Sort Key: p, v + -> Seq Scan on btg +(5 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p, c; + QUERY PLAN +----------------------------- + GroupAggregate + Group Key: p, c, v + -> Sort + Sort Key: p, c, v + -> Seq Scan on btg +(5 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p, c ORDER BY v, p, c; + QUERY PLAN +----------------------------- + GroupAggregate + Group Key: v, p, c + -> Sort + Sort Key: v, p, c + -> Seq Scan on btg +(5 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p, d, c; + QUERY PLAN +------------------------------ + GroupAggregate + Group Key: p, d, c, v + -> Sort + Sort Key: p, d, c, v + -> Seq Scan on btg +(5 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p, d, c ORDER BY v, p, d ,c; + QUERY PLAN +------------------------------ + GroupAggregate + Group Key: v, p, d, c + -> Sort + Sort Key: v, p, d, c + -> Seq Scan on btg +(5 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p, d, c ORDER BY p, v, d ,c; + QUERY PLAN +------------------------------ + GroupAggregate + Group Key: p, v, d, c + -> Sort + Sort Key: p, v, d, c + -> Seq Scan on btg +(5 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY p, d, e; + QUERY PLAN +----------------------------- + GroupAggregate + Group Key: p, d, e + -> Sort + Sort Key: p, d, e + -> Seq Scan on btg +(5 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY p, e, d; + QUERY PLAN +----------------------------- + GroupAggregate + Group Key: p, e, d + -> Sort + Sort Key: p, e, d + -> Seq Scan on btg +(5 rows) + +CREATE STATISTICS btg_dep ON d, e, p FROM btg; +ANALYZE btg; +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY p, d, e; + QUERY PLAN +----------------------------- + GroupAggregate + Group Key: p, d, e + -> Sort + Sort Key: p, d, e + -> Seq Scan on btg +(5 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY p, e, d; + QUERY PLAN +----------------------------- + GroupAggregate + Group Key: p, e, d + -> Sort + Sort Key: p, e, d + -> Seq Scan on btg +(5 rows) + +-- GROUP BY optimization by reorder columns by index scan +CREATE INDEX ON btg(p, v); +SET enable_seqscan=off; +SET enable_bitmapscan=off; +VACUUM btg; +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY p, v; + QUERY PLAN +------------------------------------------------ + GroupAggregate + Group Key: p, v + -> Index Only Scan using btg_p_v_idx on btg +(3 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY p, v ORDER BY p, v; + QUERY PLAN +------------------------------------------------ + GroupAggregate + Group Key: p, v + -> Index Only Scan using btg_p_v_idx on btg +(3 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p; + QUERY PLAN +------------------------------------------------ + GroupAggregate + Group Key: p, v + -> Index Only Scan using btg_p_v_idx on btg +(3 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p ORDER BY p, v; + QUERY PLAN +------------------------------------------------ + GroupAggregate + Group Key: p, v + -> Index Only Scan using btg_p_v_idx on btg +(3 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p, c; + QUERY PLAN +------------------------------------------------- + GroupAggregate + Group Key: p, c, v + -> Incremental Sort + Sort Key: p, c, v + Presorted Key: p + -> Index Scan using btg_p_v_idx on btg +(6 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p, c ORDER BY p, v; + QUERY PLAN +------------------------------------------------- + GroupAggregate + Group Key: p, v, c + -> Incremental Sort + Sort Key: p, v, c + Presorted Key: p, v + -> Index Scan using btg_p_v_idx on btg +(6 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, c, p, d; + QUERY PLAN +------------------------------------------------- + GroupAggregate + Group Key: p, c, d, v + -> Incremental Sort + Sort Key: p, c, d, v + Presorted Key: p + -> Index Scan using btg_p_v_idx on btg +(6 rows) + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, c, p, d ORDER BY p, v; + QUERY PLAN +------------------------------------------------- + GroupAggregate + Group Key: p, v, c, d + -> Incremental Sort + Sort Key: p, v, c, d + Presorted Key: p, v + -> Index Scan using btg_p_v_idx on btg +(6 rows) + +DROP TABLE btg; +RESET enable_hashagg; +RESET max_parallel_workers; +RESET max_parallel_workers_per_gather; +RESET enable_seqscan; +RESET enable_bitmapscan; -- Secondly test the case of a parallel aggregate combiner function -- returning NULL. For that use normal transition function, but a -- combiner function returning NULL. diff --git a/src/test/regress/expected/incremental_sort.out b/src/test/regress/expected/incremental_sort.out index 545e301e48..21c429226f 100644 --- a/src/test/regress/expected/incremental_sort.out +++ b/src/test/regress/expected/incremental_sort.out @@ -1439,7 +1439,7 @@ set parallel_setup_cost = 0; set parallel_tuple_cost = 0; set max_parallel_workers_per_gather = 2; create table t (a int, b int, c int); -insert into t select mod(i,10),mod(i,10),i from generate_series(1,10000) s(i); +insert into t select mod(i,10),mod(i,10),i from generate_series(1,60000) s(i); create index on t (a); analyze t; set enable_incremental_sort = off; diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out index 19caebabd0..bf1a2db2cf 100644 --- a/src/test/regress/expected/join.out +++ b/src/test/regress/expected/join.out @@ -1984,8 +1984,8 @@ USING (name); ------+----+---- bb | 12 | 13 cc | 22 | 23 - dd | | 33 ee | 42 | + dd | | 33 (4 rows) -- Cases with non-nullable expressions in subquery results; @@ -2019,8 +2019,8 @@ NATURAL FULL JOIN ------+------+------+------+------ bb | 12 | 2 | 13 | 3 cc | 22 | 2 | 23 | 3 - dd | | | 33 | 3 ee | 42 | 2 | | + dd | | | 33 | 3 (4 rows) SELECT * FROM @@ -4618,18 +4618,20 @@ select d.* from d left join (select * from b group by b.id, b.c_id) s explain (costs off) select d.* from d left join (select distinct * from b) s on d.a = s.id; - QUERY PLAN --------------------------------------- - Merge Right Join - Merge Cond: (b.id = d.a) - -> Unique - -> Sort - Sort Key: b.id, b.c_id - -> Seq Scan on b + QUERY PLAN +--------------------------------------------- + Merge Left Join + Merge Cond: (d.a = s.id) -> Sort Sort Key: d.a -> Seq Scan on d -(9 rows) + -> Sort + Sort Key: s.id + -> Subquery Scan on s + -> HashAggregate + Group Key: b.id, b.c_id + -> Seq Scan on b +(11 rows) -- check join removal works when uniqueness of the join condition is enforced -- by a UNION @@ -6336,44 +6338,39 @@ select * from j1 natural join j2; explain (verbose, costs off) select * from j1 inner join (select distinct id from j3) j3 on j1.id = j3.id; - QUERY PLAN ------------------------------------------ + QUERY PLAN +----------------------------------- Nested Loop Output: j1.id, j3.id Inner Unique: true Join Filter: (j1.id = j3.id) - -> Unique + -> HashAggregate Output: j3.id - -> Sort + Group Key: j3.id + -> Seq Scan on public.j3 Output: j3.id - Sort Key: j3.id - -> Seq Scan on public.j3 - Output: j3.id -> Seq Scan on public.j1 Output: j1.id -(13 rows) +(11 rows) -- ensure group by clause allows the inner to become unique explain (verbose, costs off) select * from j1 inner join (select id from j3 group by id) j3 on j1.id = j3.id; - QUERY PLAN ------------------------------------------ + QUERY PLAN +----------------------------------- Nested Loop Output: j1.id, j3.id Inner Unique: true Join Filter: (j1.id = j3.id) - -> Group + -> HashAggregate Output: j3.id Group Key: j3.id - -> Sort + -> Seq Scan on public.j3 Output: j3.id - Sort Key: j3.id - -> Seq Scan on public.j3 - Output: j3.id -> Seq Scan on public.j1 Output: j1.id -(14 rows) +(11 rows) drop table j1; drop table j2; diff --git a/src/test/regress/expected/partition_aggregate.out b/src/test/regress/expected/partition_aggregate.out index dfa4b036b5..a08a3825ff 100644 --- a/src/test/regress/expected/partition_aggregate.out +++ b/src/test/regress/expected/partition_aggregate.out @@ -952,32 +952,30 @@ SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HA -------------------------------------------------------------------------------------- Sort Sort Key: pagg_tab_ml.a, (sum(pagg_tab_ml.b)), (array_agg(DISTINCT pagg_tab_ml.c)) - -> Gather - Workers Planned: 2 - -> Parallel Append - -> GroupAggregate - Group Key: pagg_tab_ml.a - Filter: (avg(pagg_tab_ml.b) < '3'::numeric) - -> Sort - Sort Key: pagg_tab_ml.a - -> Seq Scan on pagg_tab_ml_p1 pagg_tab_ml - -> GroupAggregate - Group Key: pagg_tab_ml_5.a - Filter: (avg(pagg_tab_ml_5.b) < '3'::numeric) - -> Sort - Sort Key: pagg_tab_ml_5.a - -> Append - -> Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_5 - -> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_6 - -> GroupAggregate - Group Key: pagg_tab_ml_2.a - Filter: (avg(pagg_tab_ml_2.b) < '3'::numeric) - -> Sort - Sort Key: pagg_tab_ml_2.a - -> Append - -> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_2 - -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_3 -(27 rows) + -> Append + -> GroupAggregate + Group Key: pagg_tab_ml.a + Filter: (avg(pagg_tab_ml.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml.a + -> Seq Scan on pagg_tab_ml_p1 pagg_tab_ml + -> GroupAggregate + Group Key: pagg_tab_ml_2.a + Filter: (avg(pagg_tab_ml_2.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml_2.a + -> Append + -> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_2 + -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_3 + -> GroupAggregate + Group Key: pagg_tab_ml_5.a + Filter: (avg(pagg_tab_ml_5.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml_5.a + -> Append + -> Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_5 + -> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_6 +(25 rows) SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3 ORDER BY 1, 2, 3; a | sum | array_agg | count @@ -996,34 +994,32 @@ SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HA -- Without ORDER BY clause, to test Gather at top-most path EXPLAIN (COSTS OFF) SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3; - QUERY PLAN ---------------------------------------------------------------------------- - Gather - Workers Planned: 2 - -> Parallel Append - -> GroupAggregate - Group Key: pagg_tab_ml.a - Filter: (avg(pagg_tab_ml.b) < '3'::numeric) - -> Sort - Sort Key: pagg_tab_ml.a - -> Seq Scan on pagg_tab_ml_p1 pagg_tab_ml - -> GroupAggregate - Group Key: pagg_tab_ml_5.a - Filter: (avg(pagg_tab_ml_5.b) < '3'::numeric) - -> Sort - Sort Key: pagg_tab_ml_5.a - -> Append - -> Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_5 - -> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_6 - -> GroupAggregate - Group Key: pagg_tab_ml_2.a - Filter: (avg(pagg_tab_ml_2.b) < '3'::numeric) - -> Sort - Sort Key: pagg_tab_ml_2.a - -> Append - -> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_2 - -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_3 -(25 rows) + QUERY PLAN +--------------------------------------------------------------------- + Append + -> GroupAggregate + Group Key: pagg_tab_ml.a + Filter: (avg(pagg_tab_ml.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml.a + -> Seq Scan on pagg_tab_ml_p1 pagg_tab_ml + -> GroupAggregate + Group Key: pagg_tab_ml_2.a + Filter: (avg(pagg_tab_ml_2.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml_2.a + -> Append + -> Seq Scan on pagg_tab_ml_p2_s1 pagg_tab_ml_2 + -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_3 + -> GroupAggregate + Group Key: pagg_tab_ml_5.a + Filter: (avg(pagg_tab_ml_5.b) < '3'::numeric) + -> Sort + Sort Key: pagg_tab_ml_5.a + -> Append + -> Seq Scan on pagg_tab_ml_p3_s1 pagg_tab_ml_5 + -> Seq Scan on pagg_tab_ml_p3_s2 pagg_tab_ml_6 +(23 rows) -- Full aggregation at level 1 as GROUP BY clause matches with PARTITION KEY -- for level 1 only. For subpartitions, GROUP BY clause does not match with @@ -1379,28 +1375,26 @@ SELECT x, sum(y), avg(y), count(*) FROM pagg_tab_para GROUP BY x HAVING avg(y) < -- When GROUP BY clause does not match; partial aggregation is performed for each partition. EXPLAIN (COSTS OFF) SELECT y, sum(x), avg(x), count(*) FROM pagg_tab_para GROUP BY y HAVING avg(x) < 12 ORDER BY 1, 2, 3; - QUERY PLAN -------------------------------------------------------------------------------------------- + QUERY PLAN +------------------------------------------------------------------------------------- Sort Sort Key: pagg_tab_para.y, (sum(pagg_tab_para.x)), (avg(pagg_tab_para.x)) - -> Finalize GroupAggregate + -> Finalize HashAggregate Group Key: pagg_tab_para.y Filter: (avg(pagg_tab_para.x) < '12'::numeric) - -> Gather Merge + -> Gather Workers Planned: 2 - -> Sort - Sort Key: pagg_tab_para.y - -> Parallel Append - -> Partial HashAggregate - Group Key: pagg_tab_para.y - -> Parallel Seq Scan on pagg_tab_para_p1 pagg_tab_para - -> Partial HashAggregate - Group Key: pagg_tab_para_1.y - -> Parallel Seq Scan on pagg_tab_para_p2 pagg_tab_para_1 - -> Partial HashAggregate - Group Key: pagg_tab_para_2.y - -> Parallel Seq Scan on pagg_tab_para_p3 pagg_tab_para_2 -(19 rows) + -> Parallel Append + -> Partial HashAggregate + Group Key: pagg_tab_para.y + -> Parallel Seq Scan on pagg_tab_para_p1 pagg_tab_para + -> Partial HashAggregate + Group Key: pagg_tab_para_1.y + -> Parallel Seq Scan on pagg_tab_para_p2 pagg_tab_para_1 + -> Partial HashAggregate + Group Key: pagg_tab_para_2.y + -> Parallel Seq Scan on pagg_tab_para_p3 pagg_tab_para_2 +(17 rows) SELECT y, sum(x), avg(x), count(*) FROM pagg_tab_para GROUP BY y HAVING avg(x) < 12 ORDER BY 1, 2, 3; y | sum | avg | count diff --git a/src/test/regress/expected/partition_join.out b/src/test/regress/expected/partition_join.out index bb5b7c47a4..03926a8413 100644 --- a/src/test/regress/expected/partition_join.out +++ b/src/test/regress/expected/partition_join.out @@ -466,52 +466,41 @@ EXPLAIN (COSTS OFF) SELECT a, b FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) WHERE a BETWEEN 490 AND 510 GROUP BY 1, 2 ORDER BY 1, 2; - QUERY PLAN ------------------------------------------------------------------------------------------------------------------ + QUERY PLAN +----------------------------------------------------------------------------------------------------------- Group Group Key: (COALESCE(prt1.a, p2.a)), (COALESCE(prt1.b, p2.b)) - -> Merge Append + -> Sort Sort Key: (COALESCE(prt1.a, p2.a)), (COALESCE(prt1.b, p2.b)) - -> Group - Group Key: (COALESCE(prt1.a, p2.a)), (COALESCE(prt1.b, p2.b)) - -> Sort - Sort Key: (COALESCE(prt1.a, p2.a)), (COALESCE(prt1.b, p2.b)) - -> Merge Full Join - Merge Cond: ((prt1.a = p2.a) AND (prt1.b = p2.b)) - Filter: ((COALESCE(prt1.a, p2.a) >= 490) AND (COALESCE(prt1.a, p2.a) <= 510)) - -> Sort - Sort Key: prt1.a, prt1.b - -> Seq Scan on prt1_p1 prt1 - -> Sort - Sort Key: p2.a, p2.b - -> Seq Scan on prt2_p1 p2 - -> Group - Group Key: (COALESCE(prt1_1.a, p2_1.a)), (COALESCE(prt1_1.b, p2_1.b)) - -> Sort - Sort Key: (COALESCE(prt1_1.a, p2_1.a)), (COALESCE(prt1_1.b, p2_1.b)) - -> Merge Full Join - Merge Cond: ((prt1_1.a = p2_1.a) AND (prt1_1.b = p2_1.b)) - Filter: ((COALESCE(prt1_1.a, p2_1.a) >= 490) AND (COALESCE(prt1_1.a, p2_1.a) <= 510)) - -> Sort - Sort Key: prt1_1.a, prt1_1.b - -> Seq Scan on prt1_p2 prt1_1 - -> Sort - Sort Key: p2_1.a, p2_1.b - -> Seq Scan on prt2_p2 p2_1 - -> Group - Group Key: (COALESCE(prt1_2.a, p2_2.a)), (COALESCE(prt1_2.b, p2_2.b)) - -> Sort - Sort Key: (COALESCE(prt1_2.a, p2_2.a)), (COALESCE(prt1_2.b, p2_2.b)) - -> Merge Full Join - Merge Cond: ((prt1_2.a = p2_2.a) AND (prt1_2.b = p2_2.b)) - Filter: ((COALESCE(prt1_2.a, p2_2.a) >= 490) AND (COALESCE(prt1_2.a, p2_2.a) <= 510)) - -> Sort - Sort Key: prt1_2.a, prt1_2.b - -> Seq Scan on prt1_p3 prt1_2 - -> Sort - Sort Key: p2_2.a, p2_2.b - -> Seq Scan on prt2_p3 p2_2 -(43 rows) + -> Append + -> Merge Full Join + Merge Cond: ((prt1_1.a = p2_1.a) AND (prt1_1.b = p2_1.b)) + Filter: ((COALESCE(prt1_1.a, p2_1.a) >= 490) AND (COALESCE(prt1_1.a, p2_1.a) <= 510)) + -> Sort + Sort Key: prt1_1.a, prt1_1.b + -> Seq Scan on prt1_p1 prt1_1 + -> Sort + Sort Key: p2_1.a, p2_1.b + -> Seq Scan on prt2_p1 p2_1 + -> Merge Full Join + Merge Cond: ((prt1_2.a = p2_2.a) AND (prt1_2.b = p2_2.b)) + Filter: ((COALESCE(prt1_2.a, p2_2.a) >= 490) AND (COALESCE(prt1_2.a, p2_2.a) <= 510)) + -> Sort + Sort Key: prt1_2.a, prt1_2.b + -> Seq Scan on prt1_p2 prt1_2 + -> Sort + Sort Key: p2_2.a, p2_2.b + -> Seq Scan on prt2_p2 p2_2 + -> Merge Full Join + Merge Cond: ((prt1_3.b = p2_3.b) AND (prt1_3.a = p2_3.a)) + Filter: ((COALESCE(prt1_3.a, p2_3.a) >= 490) AND (COALESCE(prt1_3.a, p2_3.a) <= 510)) + -> Sort + Sort Key: prt1_3.b, prt1_3.a + -> Seq Scan on prt1_p3 prt1_3 + -> Sort + Sort Key: p2_3.b, p2_3.a + -> Seq Scan on prt2_p3 p2_3 +(32 rows) SELECT a, b FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) WHERE a BETWEEN 490 AND 510 diff --git a/src/test/regress/expected/sysviews.out b/src/test/regress/expected/sysviews.out index 579b861d84..4e775af175 100644 --- a/src/test/regress/expected/sysviews.out +++ b/src/test/regress/expected/sysviews.out @@ -114,6 +114,7 @@ select name, setting from pg_settings where name like 'enable%'; enable_async_append | on enable_bitmapscan | on enable_gathermerge | on + enable_group_by_reordering | on enable_hashagg | on enable_hashjoin | on enable_incremental_sort | on @@ -131,7 +132,7 @@ select name, setting from pg_settings where name like 'enable%'; enable_seqscan | on enable_sort | on enable_tidscan | on -(20 rows) +(21 rows) -- Test that the pg_timezone_names and pg_timezone_abbrevs views are -- more-or-less working. We can't test their contents in any great detail diff --git a/src/test/regress/expected/union.out b/src/test/regress/expected/union.out index dece7310cf..7ac4a9380e 100644 --- a/src/test/regress/expected/union.out +++ b/src/test/regress/expected/union.out @@ -1303,24 +1303,22 @@ select distinct q1 from union all select distinct * from int8_tbl i82) ss where q2 = q2; - QUERY PLAN ----------------------------------------------------------- - Unique - -> Merge Append - Sort Key: "*SELECT* 1".q1 + QUERY PLAN +---------------------------------------------------- + HashAggregate + Group Key: "*SELECT* 1".q1 + -> Append -> Subquery Scan on "*SELECT* 1" - -> Unique - -> Sort - Sort Key: i81.q1, i81.q2 - -> Seq Scan on int8_tbl i81 - Filter: (q2 IS NOT NULL) + -> HashAggregate + Group Key: i81.q1, i81.q2 + -> Seq Scan on int8_tbl i81 + Filter: (q2 IS NOT NULL) -> Subquery Scan on "*SELECT* 2" - -> Unique - -> Sort - Sort Key: i82.q1, i82.q2 - -> Seq Scan on int8_tbl i82 - Filter: (q2 IS NOT NULL) -(15 rows) + -> HashAggregate + Group Key: i82.q1, i82.q2 + -> Seq Scan on int8_tbl i82 + Filter: (q2 IS NOT NULL) +(13 rows) select distinct q1 from (select distinct * from int8_tbl i81 @@ -1339,24 +1337,22 @@ select distinct q1 from union all select distinct * from int8_tbl i82) ss where -q1 = q2; - QUERY PLAN --------------------------------------------------------- - Unique - -> Merge Append - Sort Key: "*SELECT* 1".q1 + QUERY PLAN +-------------------------------------------------- + HashAggregate + Group Key: "*SELECT* 1".q1 + -> Append -> Subquery Scan on "*SELECT* 1" - -> Unique - -> Sort - Sort Key: i81.q1, i81.q2 - -> Seq Scan on int8_tbl i81 - Filter: ((- q1) = q2) + -> HashAggregate + Group Key: i81.q1, i81.q2 + -> Seq Scan on int8_tbl i81 + Filter: ((- q1) = q2) -> Subquery Scan on "*SELECT* 2" - -> Unique - -> Sort - Sort Key: i82.q1, i82.q2 - -> Seq Scan on int8_tbl i82 - Filter: ((- q1) = q2) -(15 rows) + -> HashAggregate + Group Key: i82.q1, i82.q2 + -> Seq Scan on int8_tbl i82 + Filter: ((- q1) = q2) +(13 rows) select distinct q1 from (select distinct * from int8_tbl i81 diff --git a/src/test/regress/sql/aggregates.sql b/src/test/regress/sql/aggregates.sql index 2f5d0e00f3..c6e0d7ba2b 100644 --- a/src/test/regress/sql/aggregates.sql +++ b/src/test/regress/sql/aggregates.sql @@ -1025,6 +1025,105 @@ SELECT balk(hundred) FROM tenk1; ROLLBACK; +-- GROUP BY optimization by reorder columns + +SELECT + i AS id, + i/2 AS p, + format('%60s', i%2) AS v, + i/4 AS c, + i/8 AS d, + (random() * (10000/8))::int as e --the same as d but no correlation with p + INTO btg +FROM + generate_series(1, 10000) i; + +VACUUM btg; +ANALYZE btg; + +-- GROUP BY optimization by reorder columns by frequency + +SET enable_hashagg=off; +SET max_parallel_workers= 0; +SET max_parallel_workers_per_gather = 0; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY p, v; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p, c; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p, c ORDER BY v, p, c; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p, d, c; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p, d, c ORDER BY v, p, d ,c; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p, d, c ORDER BY p, v, d ,c; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY p, d, e; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY p, e, d; + +CREATE STATISTICS btg_dep ON d, e, p FROM btg; +ANALYZE btg; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY p, d, e; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY p, e, d; + + +-- GROUP BY optimization by reorder columns by index scan + +CREATE INDEX ON btg(p, v); +SET enable_seqscan=off; +SET enable_bitmapscan=off; +VACUUM btg; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY p, v; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY p, v ORDER BY p, v; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p ORDER BY p, v; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p, c; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, p, c ORDER BY p, v; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, c, p, d; + +EXPLAIN (COSTS off) +SELECT count(*) FROM btg GROUP BY v, c, p, d ORDER BY p, v; + +DROP TABLE btg; + +RESET enable_hashagg; +RESET max_parallel_workers; +RESET max_parallel_workers_per_gather; +RESET enable_seqscan; +RESET enable_bitmapscan; + + -- Secondly test the case of a parallel aggregate combiner function -- returning NULL. For that use normal transition function, but a -- combiner function returning NULL. diff --git a/src/test/regress/sql/incremental_sort.sql b/src/test/regress/sql/incremental_sort.sql index d8768a6b54..1de163e039 100644 --- a/src/test/regress/sql/incremental_sort.sql +++ b/src/test/regress/sql/incremental_sort.sql @@ -213,7 +213,7 @@ set parallel_tuple_cost = 0; set max_parallel_workers_per_gather = 2; create table t (a int, b int, c int); -insert into t select mod(i,10),mod(i,10),i from generate_series(1,10000) s(i); +insert into t select mod(i,10),mod(i,10),i from generate_series(1,60000) s(i); create index on t (a); analyze t; From f8e0d900afed933d8f5d3f189fdb141924a8e518 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 30 Mar 2022 19:59:33 -0400 Subject: [PATCH 319/772] Add .gitignore for basebackup_to_shell. Nathan Bossart Discussion: https://postgr.es/m/20220330223531.GA134543@nathanxps13 --- contrib/basebackup_to_shell/.gitignore | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 contrib/basebackup_to_shell/.gitignore diff --git a/contrib/basebackup_to_shell/.gitignore b/contrib/basebackup_to_shell/.gitignore new file mode 100644 index 0000000000..5dcb3ff972 --- /dev/null +++ b/contrib/basebackup_to_shell/.gitignore @@ -0,0 +1,4 @@ +# Generated subdirectories +/log/ +/results/ +/tmp_check/ From 8ac4c25a05d1e491a51d5390aaae405600e8e466 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 31 Mar 2022 10:34:10 +0900 Subject: [PATCH 320/772] Clean up some dead code in pg_dump with tar format and gzip compression Compression with gzip has never been supported in the tar format of pg_dump since this code has been introduced in c3e18804, as the use of buffered I/O in gzdopen() changes the file positioning that tar requires. The original idea behind the use of compression with the tar mode is to be able to include compressed data files (named %u.dat.gz) and blob files (blob_%u.dat.gz) in the tarball generated by the dump, with toc.dat, that tracks down if compression is used in the dump, always uncompressed. Note that this commit removes the dump part of the code as well as the restore part, removing any dependency to zlib in pg_backup_tar.c. There could be an argument behind keeping around the restore part, but this would require one to change the internals of a tarball previously dumped so as data and blob files are compressed with toc.dat itself changed to track down if compression is enabled. However, the argument about gzdopen() still holds in the read case with pg_restore. Removing this code simplifies future additions related to compression in pg_dump. Author: Georgios Kokolatos, Rachel Heaton Discussion: https://postgr.es/m/faUNEOpts9vunEaLnmxmG-DldLSg_ql137OC3JYDmgrOMHm1RvvWY2IdBkv_CRxm5spCCb_OmKNk2T03TMm0fBEWveFF9wA1WizPuAgB7Ss=@protonmail.com --- src/bin/pg_dump/pg_backup_tar.c | 89 ++++----------------------------- 1 file changed, 11 insertions(+), 78 deletions(-) diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c index ccfbe346be..2491a091b9 100644 --- a/src/bin/pg_dump/pg_backup_tar.c +++ b/src/bin/pg_dump/pg_backup_tar.c @@ -65,11 +65,6 @@ static void _EndBlobs(ArchiveHandle *AH, TocEntry *te); typedef struct { -#ifdef HAVE_LIBZ - gzFile zFH; -#else - FILE *zFH; -#endif FILE *nFH; FILE *tarFH; FILE *tmpFH; @@ -248,14 +243,7 @@ _ArchiveEntry(ArchiveHandle *AH, TocEntry *te) ctx = (lclTocEntry *) pg_malloc0(sizeof(lclTocEntry)); if (te->dataDumper != NULL) { -#ifdef HAVE_LIBZ - if (AH->compression == 0) - sprintf(fn, "%d.dat", te->dumpId); - else - sprintf(fn, "%d.dat.gz", te->dumpId); -#else - sprintf(fn, "%d.dat", te->dumpId); -#endif + snprintf(fn, sizeof(fn), "%d.dat", te->dumpId); ctx->filename = pg_strdup(fn); } else @@ -320,10 +308,6 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode) lclContext *ctx = (lclContext *) AH->formatData; TAR_MEMBER *tm; -#ifdef HAVE_LIBZ - char fmode[14]; -#endif - if (mode == 'r') { tm = _tarPositionTo(AH, filename); @@ -344,16 +328,10 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode) } } -#ifdef HAVE_LIBZ - if (AH->compression == 0) tm->nFH = ctx->tarFH; else fatal("compression is not supported by tar archive format"); - /* tm->zFH = gzdopen(dup(fileno(ctx->tarFH)), "rb"); */ -#else - tm->nFH = ctx->tarFH; -#endif } else { @@ -405,21 +383,10 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode) umask(old_umask); -#ifdef HAVE_LIBZ - - if (AH->compression != 0) - { - sprintf(fmode, "wb%d", AH->compression); - tm->zFH = gzdopen(dup(fileno(tm->tmpFH)), fmode); - if (tm->zFH == NULL) - fatal("could not open temporary file"); - } - else + if (AH->compression == 0) tm->nFH = tm->tmpFH; -#else - - tm->nFH = tm->tmpFH; -#endif + else + fatal("compression is not supported by tar archive format"); tm->AH = AH; tm->targetFile = pg_strdup(filename); @@ -434,15 +401,8 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode) static void tarClose(ArchiveHandle *AH, TAR_MEMBER *th) { - /* - * Close the GZ file since we dup'd. This will flush the buffers. - */ if (AH->compression != 0) - { - errno = 0; /* in case gzclose() doesn't set it */ - if (GZCLOSE(th->zFH) != 0) - fatal("could not close tar member: %m"); - } + fatal("compression is not supported by tar archive format"); if (th->mode == 'w') _tarAddFile(AH, th); /* This will close the temp file */ @@ -456,7 +416,6 @@ tarClose(ArchiveHandle *AH, TAR_MEMBER *th) free(th->targetFile); th->nFH = NULL; - th->zFH = NULL; } #ifdef __NOT_USED__ @@ -542,29 +501,9 @@ _tarReadRaw(ArchiveHandle *AH, void *buf, size_t len, TAR_MEMBER *th, FILE *fh) } else if (th) { - if (th->zFH) - { - res = GZREAD(&((char *) buf)[used], 1, len, th->zFH); - if (res != len && !GZEOF(th->zFH)) - { -#ifdef HAVE_LIBZ - int errnum; - const char *errmsg = gzerror(th->zFH, &errnum); - - fatal("could not read from input file: %s", - errnum == Z_ERRNO ? strerror(errno) : errmsg); -#else - fatal("could not read from input file: %s", - strerror(errno)); -#endif - } - } - else - { - res = fread(&((char *) buf)[used], 1, len, th->nFH); - if (res != len && !feof(th->nFH)) - READ_ERROR_EXIT(th->nFH); - } + res = fread(&((char *) buf)[used], 1, len, th->nFH); + if (res != len && !feof(th->nFH)) + READ_ERROR_EXIT(th->nFH); } } @@ -596,10 +535,7 @@ tarWrite(const void *buf, size_t len, TAR_MEMBER *th) { size_t res; - if (th->zFH != NULL) - res = GZWRITE(buf, 1, len, th->zFH); - else - res = fwrite(buf, 1, len, th->nFH); + res = fwrite(buf, 1, len, th->nFH); th->pos += res; return res; @@ -949,17 +885,14 @@ _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid) lclContext *ctx = (lclContext *) AH->formatData; lclTocEntry *tctx = (lclTocEntry *) te->formatData; char fname[255]; - char *sfx; if (oid == 0) fatal("invalid OID for large object (%u)", oid); if (AH->compression != 0) - sfx = ".gz"; - else - sfx = ""; + fatal("compression is not supported by tar archive format"); - sprintf(fname, "blob_%u.dat%s", oid, sfx); + sprintf(fname, "blob_%u.dat", oid); tarPrintf(ctx->blobToc, "%u %s\n", oid, fname); From 8f2e2bbf145384784bad07a96d461c6bbd91f597 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Thu, 31 Mar 2022 08:24:19 +0530 Subject: [PATCH 321/772] Raise a WARNING for missing publications. When we create or alter a subscription to add publications raise a warning for non-existent publications. We don't want to give an error here because it is possible that users can later create the missing publications. Author: Vignesh C Reviewed-by: Bharath Rupireddy, Japin Li, Dilip Kumar, Euler Taveira, Ashutosh Sharma, Amit Kapila Discussion: https://postgr.es/m/CALDaNm0f4YujGW+q-Di0CbZpnQKFFrXntikaQQKuEmGG0=Zw=Q@mail.gmail.com --- doc/src/sgml/ref/alter_subscription.sgml | 4 +- doc/src/sgml/ref/create_subscription.sgml | 7 ++ src/backend/commands/subscriptioncmds.c | 133 ++++++++++++++++++---- src/test/subscription/t/007_ddl.pl | 37 ++++++ 4 files changed, 160 insertions(+), 21 deletions(-) diff --git a/doc/src/sgml/ref/alter_subscription.sgml b/doc/src/sgml/ref/alter_subscription.sgml index 3e46bbdb04..fe13ab9a2d 100644 --- a/doc/src/sgml/ref/alter_subscription.sgml +++ b/doc/src/sgml/ref/alter_subscription.sgml @@ -114,7 +114,9 @@ ALTER SUBSCRIPTION name RENAME TO < replaces the entire list of publications with a new list, ADD adds additional publications to the list of publications, and DROP removes the publications from - the list of publications. See + the list of publications. We allow non-existent publications to be + specified in ADD and SET variants + so that users can add those later. See for more information. By default, this command will also act like REFRESH PUBLICATION. diff --git a/doc/src/sgml/ref/create_subscription.sgml b/doc/src/sgml/ref/create_subscription.sgml index b701752fc9..ebf7db57c5 100644 --- a/doc/src/sgml/ref/create_subscription.sgml +++ b/doc/src/sgml/ref/create_subscription.sgml @@ -356,6 +356,13 @@ CREATE SUBSCRIPTION subscription_name + + We allow non-existent publications to be specified so that users can add + those later. This means + pg_subscription + can have non-existent publications. + + diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index abebffdf3b..85dacbe93d 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -375,6 +375,103 @@ parse_subscription_options(ParseState *pstate, List *stmt_options, } } +/* + * Add publication names from the list to a string. + */ +static void +get_publications_str(List *publications, StringInfo dest, bool quote_literal) +{ + ListCell *lc; + bool first = true; + + Assert(list_length(publications) > 0); + + foreach(lc, publications) + { + char *pubname = strVal(lfirst(lc)); + + if (first) + first = false; + else + appendStringInfoString(dest, ", "); + + if (quote_literal) + appendStringInfoString(dest, quote_literal_cstr(pubname)); + else + { + appendStringInfoChar(dest, '"'); + appendStringInfoString(dest, pubname); + appendStringInfoChar(dest, '"'); + } + } +} + +/* + * Check the specified publication(s) is(are) present in the publisher. + */ +static void +check_publications(WalReceiverConn *wrconn, List *publications) +{ + WalRcvExecResult *res; + StringInfo cmd; + TupleTableSlot *slot; + List *publicationsCopy = NIL; + Oid tableRow[1] = {TEXTOID}; + + cmd = makeStringInfo(); + appendStringInfoString(cmd, "SELECT t.pubname FROM\n" + " pg_catalog.pg_publication t WHERE\n" + " t.pubname IN ("); + get_publications_str(publications, cmd, true); + appendStringInfoChar(cmd, ')'); + + res = walrcv_exec(wrconn, cmd->data, 1, tableRow); + pfree(cmd->data); + pfree(cmd); + + if (res->status != WALRCV_OK_TUPLES) + ereport(ERROR, + errmsg_plural("could not receive publication from the publisher: %s", + "could not receive list of publications from the publisher: %s", + list_length(publications), + res->err)); + + publicationsCopy = list_copy(publications); + + /* Process publication(s). */ + slot = MakeSingleTupleTableSlot(res->tupledesc, &TTSOpsMinimalTuple); + while (tuplestore_gettupleslot(res->tuplestore, true, false, slot)) + { + char *pubname; + bool isnull; + + pubname = TextDatumGetCString(slot_getattr(slot, 1, &isnull)); + Assert(!isnull); + + /* Delete the publication present in publisher from the list. */ + publicationsCopy = list_delete(publicationsCopy, makeString(pubname)); + ExecClearTuple(slot); + } + + ExecDropSingleTupleTableSlot(slot); + + walrcv_clear_result(res); + + if (list_length(publicationsCopy)) + { + /* Prepare the list of non-existent publication(s) for error message. */ + StringInfo pubnames = makeStringInfo(); + + get_publications_str(publicationsCopy, pubnames, false); + ereport(WARNING, + errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg_plural("publication %s does not exist in the publisher", + "publications %s do not exist in the publisher", + list_length(publicationsCopy), + pubnames->data)); + } +} + /* * Auxiliary function to build a text array out of a list of String nodes. */ @@ -555,6 +652,8 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, PG_TRY(); { + check_publications(wrconn, publications); + /* * Set sync state based on if we were asked to do data copy or * not. @@ -650,7 +749,8 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, } static void -AlterSubscription_refresh(Subscription *sub, bool copy_data) +AlterSubscription_refresh(Subscription *sub, bool copy_data, + List *validate_publications) { char *err; List *pubrel_names; @@ -681,6 +781,9 @@ AlterSubscription_refresh(Subscription *sub, bool copy_data) PG_TRY(); { + if (validate_publications) + check_publications(wrconn, validate_publications); + /* Get the list of relations from publisher. */ pubrel_names = fetch_table_list(wrconn, sub->publications); pubrel_names = list_concat(pubrel_names, @@ -1048,7 +1151,8 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, /* Make sure refresh sees the new list of publications. */ sub->publications = stmt->publication; - AlterSubscription_refresh(sub, opts.copy_data); + AlterSubscription_refresh(sub, opts.copy_data, + stmt->publication); } break; @@ -1074,6 +1178,9 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, /* Refresh if user asked us to. */ if (opts.refresh) { + /* We only need to validate user specified publications. */ + List *validate_publications = (isadd) ? stmt->publication : NULL; + if (!sub->enabled) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), @@ -1096,7 +1203,8 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, /* Refresh the new list of publications. */ sub->publications = publist; - AlterSubscription_refresh(sub, opts.copy_data); + AlterSubscription_refresh(sub, opts.copy_data, + validate_publications); } break; @@ -1138,7 +1246,7 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, PreventInTransactionBlock(isTopLevel, "ALTER SUBSCRIPTION ... REFRESH"); - AlterSubscription_refresh(sub, opts.copy_data); + AlterSubscription_refresh(sub, opts.copy_data, NULL); break; } @@ -1659,28 +1767,13 @@ fetch_table_list(WalReceiverConn *wrconn, List *publications) StringInfoData cmd; TupleTableSlot *slot; Oid tableRow[2] = {TEXTOID, TEXTOID}; - ListCell *lc; - bool first; List *tablelist = NIL; - Assert(list_length(publications) > 0); - initStringInfo(&cmd); appendStringInfoString(&cmd, "SELECT DISTINCT t.schemaname, t.tablename\n" " FROM pg_catalog.pg_publication_tables t\n" " WHERE t.pubname IN ("); - first = true; - foreach(lc, publications) - { - char *pubname = strVal(lfirst(lc)); - - if (first) - first = false; - else - appendStringInfoString(&cmd, ", "); - - appendStringInfoString(&cmd, quote_literal_cstr(pubname)); - } + get_publications_str(publications, &cmd, true); appendStringInfoChar(&cmd, ')'); res = walrcv_exec(wrconn, cmd.data, 2, tableRow); diff --git a/src/test/subscription/t/007_ddl.pl b/src/test/subscription/t/007_ddl.pl index 1144b005f6..39c32eda44 100644 --- a/src/test/subscription/t/007_ddl.pl +++ b/src/test/subscription/t/007_ddl.pl @@ -41,6 +41,43 @@ pass "subscription disable and drop in same transaction did not hang"; +# One of the specified publications exists. +my ($ret, $stdout, $stderr) = $node_subscriber->psql('postgres', + "CREATE SUBSCRIPTION mysub1 CONNECTION '$publisher_connstr' PUBLICATION mypub, non_existent_pub" +); +ok( $stderr =~ + m/WARNING: publication "non_existent_pub" does not exist in the publisher/, + "Create subscription throws warning for non-existent publication"); + +$node_publisher->wait_for_catchup('mysub1'); + +# Also wait for initial table sync to finish. +my $synced_query = + "SELECT count(1) = 0 FROM pg_subscription_rel WHERE srsubstate NOT IN ('r', 's');"; +$node_subscriber->poll_query_until('postgres', $synced_query) + or die "Timed out while waiting for subscriber to synchronize data"; + +# Also wait for initial table sync to finish. +$node_subscriber->poll_query_until('postgres', $synced_query) + or die "Timed out while waiting for subscriber to synchronize data"; + +# Specifying non-existent publication along with add publication. +($ret, $stdout, $stderr) = $node_subscriber->psql( + 'postgres', + "ALTER SUBSCRIPTION mysub1 ADD PUBLICATION non_existent_pub1, non_existent_pub2" +); +ok( $stderr =~ + m/WARNING: publications "non_existent_pub1", "non_existent_pub2" do not exist in the publisher/, + "Alter subscription add publication throws warning for non-existent publications"); + +# Specifying non-existent publication along with set publication. +($ret, $stdout, $stderr) = $node_subscriber->psql('postgres', + "ALTER SUBSCRIPTION mysub1 SET PUBLICATION non_existent_pub" +); +ok( $stderr =~ + m/WARNING: publication "non_existent_pub" does not exist in the publisher/, + "Alter subscription set publication throws warning for non-existent publication"); + $node_subscriber->stop; $node_publisher->stop; From 2beb4acff1e83fef6766a5a7d5bbd952444a0b36 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Thu, 31 Mar 2022 11:16:16 +0200 Subject: [PATCH 322/772] Add diagnostic output on error in pump_until When pump_until was moved to Utils.pm in commit 6da65a3f9 the diag calls were removed, this puts them back. Per request from Andres Freund. Discussion: https://postgr.es/m/20220329225819.ahk5u2tax3ez6d2t@alap3.anarazel.de --- src/test/perl/PostgreSQL/Test/Utils.pm | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm index 15b314d1f8..dca1b3b17c 100644 --- a/src/test/perl/PostgreSQL/Test/Utils.pm +++ b/src/test/perl/PostgreSQL/Test/Utils.pm @@ -426,8 +426,16 @@ sub pump_until while (1) { last if $$stream =~ /$until/; - return 0 if ($timeout->is_expired); - return 0 if (not $proc->pumpable()); + if ($timeout->is_expired) + { + diag("pump_until: timeout expired when searching for \"$until\" with stream: \"$$stream\""); + return 0; + } + if (not $proc->pumpable()) + { + diag("pump_until: process terminated unexpectedly when searching for \"$until\" with stream: \"$$stream\""); + return 0; + } $proc->pump(); } return 1; From 4e31c46e1e7b7d3a34909ec872c4446711e86e7d Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Thu, 31 Mar 2022 12:03:33 +0200 Subject: [PATCH 323/772] doc: Fix typo in ANALYZE documentation Commit 61fa6ca79b3 accidentally wrote constrast instead of contrast. Backpatch-through: 10 Discussion: https://postgr.es/m/88903179-5ce2-3d4d-af43-7830372bdcb6@enterprisedb.com --- doc/src/sgml/ref/analyze.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/analyze.sgml b/doc/src/sgml/ref/analyze.sgml index fe5461768e..b968f740cb 100644 --- a/doc/src/sgml/ref/analyze.sgml +++ b/doc/src/sgml/ref/analyze.sgml @@ -272,7 +272,7 @@ ANALYZE [ VERBOSE ] [ table_and_columns - By constrast, if the table being analyzed has inheritance children, + By contrast, if the table being analyzed has inheritance children, ANALYZE gathers two sets of statistics: one on the rows of the parent table only, and a second including rows of both the parent table and all of its children. This second set of statistics is needed when From ddee016b342cddcfb97325afac0a65c502932e5f Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 31 Mar 2022 08:34:39 -0400 Subject: [PATCH 324/772] Fix comment typo in PotsgreSQL::Test::Cluster module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per Dagfinn Ilmari Mannsåker --- src/test/perl/PostgreSQL/Test/Cluster.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index fa0ef12d72..1cbf90c053 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -1388,7 +1388,7 @@ sub _set_pg_version # # Routines that call Postgres binaries need to call this routine like this: # -# local %ENV = $self->_get_env{[%extra_settings]); +# local %ENV = $self->_get_env([%extra_settings]); # # A copy of the environment is taken and node's host and port settings are # added as PGHOST and PGPORT, then the extra settings (if any) are applied. From d3ab618290543017402b3bec9d36dde881becb18 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 31 Mar 2022 16:09:44 +0200 Subject: [PATCH 325/772] psql: Add tests for \errverbose This is another piece of functionality that happens while a user query is being sent and which did not have any test coverage. --- src/bin/psql/t/001_basic.pl | 47 +++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl index 02a84543fd..66796f4978 100644 --- a/src/bin/psql/t/001_basic.pl +++ b/src/bin/psql/t/001_basic.pl @@ -132,4 +132,51 @@ sub psql_fails_like psql::2: fatal: connection to server was lost', 'server crash: error message'); +# test \errverbose +# +# (This is not in the regular regression tests because the output +# contains the source code location and we don't want to have to +# update that every time it changes.) + +psql_like( + $node, + 'SELECT 1; +\errverbose', + qr/^1\nThere is no previous error\.$/, + '\errverbose with no previous error'); + +# There are three main ways to run a query that might affect +# \errverbose: The normal way, using a cursor by setting FETCH_COUNT, +# and using \gdesc. Test them all. + +like(($node->psql('postgres', "SELECT error;\n\\errverbose", on_error_stop => 0))[2], + qr/\A^psql::1: ERROR: .*$ +^LINE 1: SELECT error;$ +^ *^.*$ +^psql::2: error: ERROR: [0-9A-Z]{5}: .*$ +^LINE 1: SELECT error;$ +^ *^.*$ +^LOCATION: .*$/m, + '\errverbose after normal query with error'); + +like(($node->psql('postgres', "\\set FETCH_COUNT 1\nSELECT error;\n\\errverbose", on_error_stop => 0))[2], + qr/\A^psql::2: ERROR: .*$ +^LINE 2: SELECT error;$ +^ *^.*$ +^psql::3: error: ERROR: [0-9A-Z]{5}: .*$ +^LINE 2: SELECT error;$ +^ *^.*$ +^LOCATION: .*$/m, + '\errverbose after FETCH_COUNT query with error'); + +like(($node->psql('postgres', "SELECT error\\gdesc\n\\errverbose", on_error_stop => 0))[2], + qr/\A^psql::1: ERROR: .*$ +^LINE 1: SELECT error$ +^ *^.*$ +^psql::2: error: ERROR: [0-9A-Z]{5}: .*$ +^LINE 1: SELECT error$ +^ *^.*$ +^LOCATION: .*$/m, + '\errverbose after \gdesc with error'); + done_testing(); From 878e64d0f8f6865943046ce88e597a5657e304c2 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 31 Mar 2022 11:24:26 -0400 Subject: [PATCH 326/772] Add missing newline in one libpq error message. Oversight in commit a59c79564. Back-patch, as that was. Noted by Peter Eisentraut. Discussion: https://postgr.es/m/7f85ef6d-250b-f5ec-9867-89f0b16d019f@enterprisedb.com --- src/interfaces/libpq/fe-secure-openssl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interfaces/libpq/fe-secure-openssl.c b/src/interfaces/libpq/fe-secure-openssl.c index d3bf57b850..0cba5c5cf2 100644 --- a/src/interfaces/libpq/fe-secure-openssl.c +++ b/src/interfaces/libpq/fe-secure-openssl.c @@ -1250,7 +1250,7 @@ initialize_SSL(PGconn *conn) if (!S_ISREG(buf.st_mode)) { appendPQExpBuffer(&conn->errorMessage, - libpq_gettext("private key file \"%s\" is not a regular file"), + libpq_gettext("private key file \"%s\" is not a regular file\n"), fnbuf); return -1; } From 8910a25fef3dc4aa7e10cfcebdc784650a4d256b Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 31 Mar 2022 19:57:21 +0200 Subject: [PATCH 327/772] psql: Refactor SendQuery() This breaks out the fetch-it-all-and-print case in SendQuery() into a separate function. This makes the code more similar to the other cases \gdesc and run query with FETCH_COUNT, and makes SendQuery() itself a bit smaller. Extracted from a larger patch with more changes in this area to follow. Author: Fabien COELHO Discussion: https://www.postgresql.org/message-id/flat/alpine.DEB.2.21.1904132231510.8961@lancre --- src/bin/psql/common.c | 104 ++++++++++++++++++++++++++---------------- 1 file changed, 64 insertions(+), 40 deletions(-) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index d65b9a124f..c9847c8f9a 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -32,6 +32,7 @@ static bool DescribeQuery(const char *query, double *elapsed_msec); static bool ExecQueryUsingCursor(const char *query, double *elapsed_msec); +static bool ExecQueryAndProcessResult(const char *query, double *elapsed_msec, bool *svpt_gone_p); static bool command_no_begin(const char *query); static bool is_select_command(const char *query); @@ -1195,12 +1196,12 @@ bool SendQuery(const char *query) { bool timing = pset.timing; - PGresult *result; PGTransactionStatusType transaction_status; double elapsed_msec = 0; bool OK = false; int i; bool on_error_rollback_savepoint = false; + bool svpt_gone = false; if (!pset.db) { @@ -1247,6 +1248,8 @@ SendQuery(const char *query) !pset.autocommit && !command_no_begin(query)) { + PGresult *result; + result = PQexec(pset.db, "BEGIN"); if (PQresultStatus(result) != PGRES_COMMAND_OK) { @@ -1264,6 +1267,8 @@ SendQuery(const char *query) (pset.cur_cmd_interactive || pset.on_error_rollback == PSQL_ERROR_ROLLBACK_ON)) { + PGresult *result; + result = PQexec(pset.db, "SAVEPOINT pg_psql_temporary_savepoint"); if (PQresultStatus(result) != PGRES_COMMAND_OK) { @@ -1281,41 +1286,18 @@ SendQuery(const char *query) /* Describe query's result columns, without executing it */ OK = DescribeQuery(query, &elapsed_msec); ResetCancelConn(); - result = NULL; /* PQclear(NULL) does nothing */ } else if (pset.fetch_count <= 0 || pset.gexec_flag || pset.crosstab_flag || !is_select_command(query)) { /* Default fetch-it-all-and-print mode */ - instr_time before, - after; - - if (timing) - INSTR_TIME_SET_CURRENT(before); - - result = PQexec(pset.db, query); - - /* these operations are included in the timing result: */ - ResetCancelConn(); - OK = ProcessResult(&result); - - if (timing) - { - INSTR_TIME_SET_CURRENT(after); - INSTR_TIME_SUBTRACT(after, before); - elapsed_msec = INSTR_TIME_GET_MILLISEC(after); - } - - /* but printing result isn't: */ - if (OK && result) - OK = PrintQueryResult(result); + OK = ExecQueryAndProcessResult(query, &elapsed_msec, &svpt_gone); } else { /* Fetch-in-segments mode */ OK = ExecQueryUsingCursor(query, &elapsed_msec); ResetCancelConn(); - result = NULL; /* PQclear(NULL) does nothing */ } if (!OK && pset.echo == PSQL_ECHO_ERRORS) @@ -1340,20 +1322,11 @@ SendQuery(const char *query) break; case PQTRANS_INTRANS: - /* - * Do nothing if they are messing with savepoints themselves: - * If the user did COMMIT AND CHAIN, RELEASE or ROLLBACK, our - * savepoint is gone. If they issued a SAVEPOINT, releasing - * ours would remove theirs. + * Release our savepoint, but do nothing if they are messing + * with savepoints themselves */ - if (result && - (strcmp(PQcmdStatus(result), "COMMIT") == 0 || - strcmp(PQcmdStatus(result), "SAVEPOINT") == 0 || - strcmp(PQcmdStatus(result), "RELEASE") == 0 || - strcmp(PQcmdStatus(result), "ROLLBACK") == 0)) - svptcmd = NULL; - else + if (!svpt_gone) svptcmd = "RELEASE pg_psql_temporary_savepoint"; break; @@ -1379,7 +1352,6 @@ SendQuery(const char *query) ClearOrSaveResult(svptres); OK = false; - PQclear(result); ResetCancelConn(); goto sendquery_cleanup; } @@ -1387,8 +1359,6 @@ SendQuery(const char *query) } } - ClearOrSaveResult(result); - /* Possible microtiming output */ if (timing) PrintTiming(elapsed_msec); @@ -1565,6 +1535,60 @@ DescribeQuery(const char *query, double *elapsed_msec) } +/* + * ExecQueryAndProcessResults: SendQuery() subroutine for the normal way to + * send a query + */ +static bool +ExecQueryAndProcessResult(const char *query, double *elapsed_msec, bool *svpt_gone_p) +{ + bool timing = pset.timing; + bool OK; + instr_time before, + after; + PGresult *result; + + if (timing) + INSTR_TIME_SET_CURRENT(before); + + result = PQexec(pset.db, query); + + /* these operations are included in the timing result: */ + ResetCancelConn(); + OK = ProcessResult(&result); + + if (timing) + { + INSTR_TIME_SET_CURRENT(after); + INSTR_TIME_SUBTRACT(after, before); + *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); + } + + /* but printing result isn't: */ + if (OK && result) + OK = PrintQueryResult(result); + + /* + * Check if the user ran any command that would destroy our internal + * savepoint: If the user did COMMIT AND CHAIN, RELEASE or ROLLBACK, our + * savepoint is gone. If they issued a SAVEPOINT, releasing ours would + * remove theirs. + */ + if (result && svpt_gone_p) + { + const char *cmd = PQcmdStatus(result); + *svpt_gone_p = (strcmp(cmd, "COMMIT") == 0 || + strcmp(cmd, "SAVEPOINT") == 0 || + strcmp(cmd, "RELEASE") == 0 || + strcmp(cmd, "ROLLBACK") == 0); + } + + ClearOrSaveResult(result); + + return OK; +} + + /* * ExecQueryUsingCursor: run a SELECT-like query using a cursor * From fea1cc49e4abca7eeb9bb9dd02d7d78abbd8d045 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Thu, 31 Mar 2022 14:06:17 -0400 Subject: [PATCH 328/772] In basebackup_to_shell tests, properly set up pg_hba.conf. Discussion: http://postgr.es/m/485495.1648692468@sss.pgh.pa.us --- contrib/basebackup_to_shell/t/001_basic.pl | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/contrib/basebackup_to_shell/t/001_basic.pl b/contrib/basebackup_to_shell/t/001_basic.pl index 57534b62c8..350d42079a 100644 --- a/contrib/basebackup_to_shell/t/001_basic.pl +++ b/contrib/basebackup_to_shell/t/001_basic.pl @@ -17,7 +17,12 @@ } my $node = PostgreSQL::Test::Cluster->new('primary'); -$node->init('allows_streaming' => 1); + +# Make sure pg_hba.conf is set up to allow connections from backupuser. +# This is only needed on Windows machines that don't use UNIX sockets. +$node->init('allows_streaming' => 1, + 'auth_extra' => [ '--create-role', 'backupuser' ]); + $node->append_conf('postgresql.conf', "shared_preload_libraries = 'basebackup_to_shell'"); $node->start; From d5f43a1a10f688e2437ffb7d454d0a2d57308bff Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 31 Mar 2022 14:10:47 -0400 Subject: [PATCH 329/772] Remove use of perl parent module in Cluster.pm Commit fb16d2c658 used the old but not quite old enough parent module, which dates to perl version 5.10.1 as a core module. We still have a dinosaur or two running older versions of perl, so rather than require an upgrade in those we simply do in place what parent.pm's import() would have done for us. Reviewed by Tom Lane Discussion: https://postgr.es/m/474104.1648685981@sss.pgh.pa.us --- src/test/perl/PostgreSQL/Test/Cluster.pm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index 1cbf90c053..b4ebc99935 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -2918,7 +2918,10 @@ sub corrupt_page_checksum package PostgreSQL::Test::Cluster::V_11; ## no critic (ProhibitMultiplePackages) -use parent -norequire, qw(PostgreSQL::Test::Cluster); +# parent.pm is not present in all perl versions before 5.10.1, so instead +# do directly what it would do for this: +# use parent -norequire, qw(PostgreSQL::Test::Cluster); +push @PostgreSQL::Test::Cluster::V_11::ISA, 'PostgreSQL::Test::Cluster'; # https://www.postgresql.org/docs/11/release-11.html @@ -2945,7 +2948,8 @@ sub init package PostgreSQL::Test::Cluster::V_10; ## no critic (ProhibitMultiplePackages) -use parent -norequire, qw(PostgreSQL::Test::Cluster::V_11); +# use parent -norequire, qw(PostgreSQL::Test::Cluster::V_11); +push @PostgreSQL::Test::Cluster::V_10::ISA, 'PostgreSQL::Test::Cluster::V_11'; # https://www.postgresql.org/docs/10/release-10.html From 28bdfa2adfc6afe4121614b500bfcb27b7c6b94c Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 31 Mar 2022 11:18:25 -0700 Subject: [PATCH 330/772] Print information about type of test and subdirectory before running tests. When testing check-world it's hard to know what the test the test failure output belongs to. The tap test output is especially problematic, partially due to our practice of reusing test names like 001_basic.pl. This isn't a real issue on the buildfarm, which invokes tests separately, but locally and for CI it's quite annoying. To fix, the test target provisos in Makefile.global.in now output echo "+++ (regress|isolation|tap) [install-]check in $(subdir) +++" before running the tests. Discussion: https://postgr.es/m/20220330165039.3zseuiraxfjkksf5@alap3.anarazel.de --- src/Makefile.global.in | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 0726b2020f..07a9e52a18 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -448,6 +448,7 @@ ifeq ($(enable_tap_tests),yes) ifndef PGXS define prove_installcheck +echo "+++ tap install-check in $(subdir) +++" && \ rm -rf '$(CURDIR)'/tmp_check && \ $(MKDIR_P) '$(CURDIR)'/tmp_check && \ cd $(srcdir) && \ @@ -458,6 +459,7 @@ cd $(srcdir) && \ endef else # PGXS case define prove_installcheck +echo "+++ tap install-check in $(subdir) +++" && \ rm -rf '$(CURDIR)'/tmp_check && \ $(MKDIR_P) '$(CURDIR)'/tmp_check && \ cd $(srcdir) && \ @@ -469,6 +471,7 @@ endef endif # PGXS define prove_check +echo "+++ tap check in $(subdir) +++" && \ rm -rf '$(CURDIR)'/tmp_check && \ $(MKDIR_P) '$(CURDIR)'/tmp_check && \ cd $(srcdir) && \ @@ -663,6 +666,7 @@ pg_regress_locale_flags = $(if $(ENCODING),--encoding=$(ENCODING)) $(NOLOCALE) pg_regress_clean_files = results/ regression.diffs regression.out tmp_check/ tmp_check_iso/ log/ output_iso/ pg_regress_check = \ + echo "+++ regress check in $(subdir) +++" && \ $(with_temp_install) \ $(top_builddir)/src/test/regress/pg_regress \ --temp-instance=./tmp_check \ @@ -671,12 +675,14 @@ pg_regress_check = \ $(TEMP_CONF) \ $(pg_regress_locale_flags) $(EXTRA_REGRESS_OPTS) pg_regress_installcheck = \ + echo "+++ regress install-check in $(subdir) +++" && \ $(top_builddir)/src/test/regress/pg_regress \ --inputdir=$(srcdir) \ --bindir='$(bindir)' \ $(pg_regress_locale_flags) $(EXTRA_REGRESS_OPTS) pg_isolation_regress_check = \ + echo "+++ isolation check in $(subdir) +++" && \ $(with_temp_install) \ $(top_builddir)/src/test/isolation/pg_isolation_regress \ --temp-instance=./tmp_check_iso \ @@ -685,6 +691,7 @@ pg_isolation_regress_check = \ $(TEMP_CONF) \ $(pg_regress_locale_flags) $(EXTRA_REGRESS_OPTS) pg_isolation_regress_installcheck = \ + echo "+++ isolation install-check in $(subdir) +++" && \ $(top_builddir)/src/test/isolation/pg_isolation_regress \ --inputdir=$(srcdir) --outputdir=output_iso \ --bindir='$(bindir)' \ From f3dd9fe1dd9254680591aa8d9891b90b8d735b2a Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 31 Mar 2022 14:29:24 -0400 Subject: [PATCH 331/772] Fix postgres_fdw to check shippability of sort clauses properly. postgres_fdw would push ORDER BY clauses to the remote side without verifying that the sort operator is safe to ship. Moreover, it failed to print a suitable USING clause if the sort operator isn't default for the sort expression's type. The net result of this is that the remote sort might not have anywhere near the semantics we expect, which'd be disastrous for locally-performed merge joins in particular. We addressed similar issues in the context of ORDER BY within an aggregate function call in commit 7012b132d, but failed to notice that query-level ORDER BY was broken. Thus, much of the necessary logic already existed, but it requires refactoring to be usable in both cases. Back-patch to all supported branches. In HEAD only, remove the core code's copy of find_em_expr_for_rel, which is no longer used and really should never have been pushed into equivclass.c in the first place. Ronan Dunklau, per report from David Rowley; reviews by David Rowley, Ranier Vilela, and myself Discussion: https://postgr.es/m/CAApHDvr4OeC2DBVY--zVP83-K=bYrTD7F8SZDhN4g+pj2f2S-A@mail.gmail.com --- contrib/postgres_fdw/deparse.c | 166 +++++++++++++----- .../postgres_fdw/expected/postgres_fdw.out | 23 +++ contrib/postgres_fdw/postgres_fdw.c | 103 ++++++++--- contrib/postgres_fdw/postgres_fdw.h | 13 +- contrib/postgres_fdw/sql/postgres_fdw.sql | 8 + src/backend/optimizer/path/equivclass.c | 29 --- src/include/optimizer/paths.h | 1 - 7 files changed, 234 insertions(+), 109 deletions(-) diff --git a/contrib/postgres_fdw/deparse.c b/contrib/postgres_fdw/deparse.c index bf12eac028..8f4d8a5022 100644 --- a/contrib/postgres_fdw/deparse.c +++ b/contrib/postgres_fdw/deparse.c @@ -40,6 +40,7 @@ #include "catalog/pg_collation.h" #include "catalog/pg_namespace.h" #include "catalog/pg_operator.h" +#include "catalog/pg_opfamily.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "commands/defrem.h" @@ -183,6 +184,8 @@ static void deparseRangeTblRef(StringInfo buf, PlannerInfo *root, Index ignore_rel, List **ignore_conds, List **params_list); static void deparseAggref(Aggref *node, deparse_expr_cxt *context); static void appendGroupByClause(List *tlist, deparse_expr_cxt *context); +static void appendOrderBySuffix(Oid sortop, Oid sortcoltype, bool nulls_first, + deparse_expr_cxt *context); static void appendAggOrderBy(List *orderList, List *targetList, deparse_expr_cxt *context); static void appendFunctionName(Oid funcid, deparse_expr_cxt *context); @@ -1038,6 +1041,33 @@ is_foreign_param(PlannerInfo *root, return false; } +/* + * Returns true if it's safe to push down the sort expression described by + * 'pathkey' to the foreign server. + */ +bool +is_foreign_pathkey(PlannerInfo *root, + RelOptInfo *baserel, + PathKey *pathkey) +{ + EquivalenceClass *pathkey_ec = pathkey->pk_eclass; + PgFdwRelationInfo *fpinfo = (PgFdwRelationInfo *) baserel->fdw_private; + + /* + * is_foreign_expr would detect volatile expressions as well, but checking + * ec_has_volatile here saves some cycles. + */ + if (pathkey_ec->ec_has_volatile) + return false; + + /* can't push down the sort if the pathkey's opfamily is not shippable */ + if (!is_shippable(pathkey->pk_opfamily, OperatorFamilyRelationId, fpinfo)) + return false; + + /* can push if a suitable EC member exists */ + return (find_em_for_rel(root, pathkey_ec, baserel) != NULL); +} + /* * Convert type OID + typmod info into a type name we can ship to the remote * server. Someplace else had better have verified that this type name is @@ -3445,44 +3475,59 @@ appendAggOrderBy(List *orderList, List *targetList, deparse_expr_cxt *context) { SortGroupClause *srt = (SortGroupClause *) lfirst(lc); Node *sortexpr; - Oid sortcoltype; - TypeCacheEntry *typentry; if (!first) appendStringInfoString(buf, ", "); first = false; + /* Deparse the sort expression proper. */ sortexpr = deparseSortGroupClause(srt->tleSortGroupRef, targetList, false, context); - sortcoltype = exprType(sortexpr); - /* See whether operator is default < or > for datatype */ - typentry = lookup_type_cache(sortcoltype, - TYPECACHE_LT_OPR | TYPECACHE_GT_OPR); - if (srt->sortop == typentry->lt_opr) - appendStringInfoString(buf, " ASC"); - else if (srt->sortop == typentry->gt_opr) - appendStringInfoString(buf, " DESC"); - else - { - HeapTuple opertup; - Form_pg_operator operform; - - appendStringInfoString(buf, " USING "); - - /* Append operator name. */ - opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(srt->sortop)); - if (!HeapTupleIsValid(opertup)) - elog(ERROR, "cache lookup failed for operator %u", srt->sortop); - operform = (Form_pg_operator) GETSTRUCT(opertup); - deparseOperatorName(buf, operform); - ReleaseSysCache(opertup); - } + /* Add decoration as needed. */ + appendOrderBySuffix(srt->sortop, exprType(sortexpr), srt->nulls_first, + context); + } +} - if (srt->nulls_first) - appendStringInfoString(buf, " NULLS FIRST"); - else - appendStringInfoString(buf, " NULLS LAST"); +/* + * Append the ASC, DESC, USING and NULLS FIRST / NULLS LAST parts + * of an ORDER BY clause. + */ +static void +appendOrderBySuffix(Oid sortop, Oid sortcoltype, bool nulls_first, + deparse_expr_cxt *context) +{ + StringInfo buf = context->buf; + TypeCacheEntry *typentry; + + /* See whether operator is default < or > for sort expr's datatype. */ + typentry = lookup_type_cache(sortcoltype, + TYPECACHE_LT_OPR | TYPECACHE_GT_OPR); + + if (sortop == typentry->lt_opr) + appendStringInfoString(buf, " ASC"); + else if (sortop == typentry->gt_opr) + appendStringInfoString(buf, " DESC"); + else + { + HeapTuple opertup; + Form_pg_operator operform; + + appendStringInfoString(buf, " USING "); + + /* Append operator name. */ + opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(sortop)); + if (!HeapTupleIsValid(opertup)) + elog(ERROR, "cache lookup failed for operator %u", sortop); + operform = (Form_pg_operator) GETSTRUCT(opertup); + deparseOperatorName(buf, operform); + ReleaseSysCache(opertup); } + + if (nulls_first) + appendStringInfoString(buf, " NULLS FIRST"); + else + appendStringInfoString(buf, " NULLS LAST"); } /* @@ -3565,9 +3610,13 @@ appendGroupByClause(List *tlist, deparse_expr_cxt *context) } /* - * Deparse ORDER BY clause according to the given pathkeys for given base - * relation. From given pathkeys expressions belonging entirely to the given - * base relation are obtained and deparsed. + * Deparse ORDER BY clause defined by the given pathkeys. + * + * The clause should use Vars from context->scanrel if !has_final_sort, + * or from context->foreignrel's targetlist if has_final_sort. + * + * We find a suitable pathkey expression (some earlier step + * should have verified that there is one) and deparse it. */ static void appendOrderByClause(List *pathkeys, bool has_final_sort, @@ -3575,8 +3624,7 @@ appendOrderByClause(List *pathkeys, bool has_final_sort, { ListCell *lcell; int nestlevel; - char *delim = " "; - RelOptInfo *baserel = context->scanrel; + const char *delim = " "; StringInfo buf = context->buf; /* Make sure any constants in the exprs are printed portably */ @@ -3586,7 +3634,9 @@ appendOrderByClause(List *pathkeys, bool has_final_sort, foreach(lcell, pathkeys) { PathKey *pathkey = lfirst(lcell); + EquivalenceMember *em; Expr *em_expr; + Oid oprid; if (has_final_sort) { @@ -3594,26 +3644,48 @@ appendOrderByClause(List *pathkeys, bool has_final_sort, * By construction, context->foreignrel is the input relation to * the final sort. */ - em_expr = find_em_expr_for_input_target(context->root, - pathkey->pk_eclass, - context->foreignrel->reltarget); + em = find_em_for_rel_target(context->root, + pathkey->pk_eclass, + context->foreignrel); } else - em_expr = find_em_expr_for_rel(pathkey->pk_eclass, baserel); + em = find_em_for_rel(context->root, + pathkey->pk_eclass, + context->scanrel); + + /* + * We don't expect any error here; it would mean that shippability + * wasn't verified earlier. For the same reason, we don't recheck + * shippability of the sort operator. + */ + if (em == NULL) + elog(ERROR, "could not find pathkey item to sort"); + + em_expr = em->em_expr; - Assert(em_expr != NULL); + /* + * Lookup the operator corresponding to the strategy in the opclass. + * The datatype used by the opfamily is not necessarily the same as + * the expression type (for array types for example). + */ + oprid = get_opfamily_member(pathkey->pk_opfamily, + em->em_datatype, + em->em_datatype, + pathkey->pk_strategy); + if (!OidIsValid(oprid)) + elog(ERROR, "missing operator %d(%u,%u) in opfamily %u", + pathkey->pk_strategy, em->em_datatype, em->em_datatype, + pathkey->pk_opfamily); appendStringInfoString(buf, delim); deparseExpr(em_expr, context); - if (pathkey->pk_strategy == BTLessStrategyNumber) - appendStringInfoString(buf, " ASC"); - else - appendStringInfoString(buf, " DESC"); - if (pathkey->pk_nulls_first) - appendStringInfoString(buf, " NULLS FIRST"); - else - appendStringInfoString(buf, " NULLS LAST"); + /* + * Here we need to use the expression's actual type to discover + * whether the desired operator will be the default or not. + */ + appendOrderBySuffix(oprid, exprType((Node *) em_expr), + pathkey->pk_nulls_first, context); delim = ", "; } diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index 2ffc836824..11e9b4e8cc 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -3262,6 +3262,19 @@ select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 Remote SQL: SELECT "C 1", c2 FROM "S 1"."T 1" WHERE (("C 1" < 100)) AND ((c2 = 6)) (6 rows) +-- This should not be pushed either. +explain (verbose, costs off) +select * from ft2 order by c1 using operator(public.<^); + QUERY PLAN +------------------------------------------------------------------------------- + Sort + Output: c1, c2, c3, c4, c5, c6, c7, c8 + Sort Key: ft2.c1 USING <^ + -> Foreign Scan on public.ft2 + Output: c1, c2, c3, c4, c5, c6, c7, c8 + Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" +(6 rows) + -- Update local stats on ft2 ANALYZE ft2; -- Add into extension @@ -3289,6 +3302,16 @@ select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 {6,16,26,36,46,56,66,76,86,96} (1 row) +-- This should be pushed too. +explain (verbose, costs off) +select * from ft2 order by c1 using operator(public.<^); + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------- + Foreign Scan on public.ft2 + Output: c1, c2, c3, c4, c5, c6, c7, c8 + Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" ORDER BY "C 1" USING OPERATOR(public.<^) NULLS LAST +(3 rows) + -- Remove from extension alter extension postgres_fdw drop operator class my_op_class using btree; alter extension postgres_fdw drop function my_op_cmp(a int, b int); diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c index 56654844e8..c51dd68722 100644 --- a/contrib/postgres_fdw/postgres_fdw.c +++ b/contrib/postgres_fdw/postgres_fdw.c @@ -18,6 +18,7 @@ #include "access/sysattr.h" #include "access/table.h" #include "catalog/pg_class.h" +#include "catalog/pg_opfamily.h" #include "commands/defrem.h" #include "commands/explain.h" #include "commands/vacuum.h" @@ -918,8 +919,6 @@ get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel) foreach(lc, root->query_pathkeys) { PathKey *pathkey = (PathKey *) lfirst(lc); - EquivalenceClass *pathkey_ec = pathkey->pk_eclass; - Expr *em_expr; /* * The planner and executor don't have any clever strategy for @@ -927,13 +926,8 @@ get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel) * getting it to be sorted by all of those pathkeys. We'll just * end up resorting the entire data set. So, unless we can push * down all of the query pathkeys, forget it. - * - * is_foreign_expr would detect volatile expressions as well, but - * checking ec_has_volatile here saves some cycles. */ - if (pathkey_ec->ec_has_volatile || - !(em_expr = find_em_expr_for_rel(pathkey_ec, rel)) || - !is_foreign_expr(root, rel, em_expr)) + if (!is_foreign_pathkey(root, rel, pathkey)) { query_pathkeys_ok = false; break; @@ -980,16 +974,19 @@ get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel) foreach(lc, useful_eclass_list) { EquivalenceClass *cur_ec = lfirst(lc); - Expr *em_expr; PathKey *pathkey; /* If redundant with what we did above, skip it. */ if (cur_ec == query_ec) continue; + /* Can't push down the sort if the EC's opfamily is not shippable. */ + if (!is_shippable(linitial_oid(cur_ec->ec_opfamilies), + OperatorFamilyRelationId, fpinfo)) + continue; + /* If no pushable expression for this rel, skip it. */ - em_expr = find_em_expr_for_rel(cur_ec, rel); - if (em_expr == NULL || !is_foreign_expr(root, rel, em_expr)) + if (find_em_for_rel(root, cur_ec, rel) == NULL) continue; /* Looks like we can generate a pathkey, so let's do it. */ @@ -6543,7 +6540,6 @@ add_foreign_ordered_paths(PlannerInfo *root, RelOptInfo *input_rel, { PathKey *pathkey = (PathKey *) lfirst(lc); EquivalenceClass *pathkey_ec = pathkey->pk_eclass; - Expr *sort_expr; /* * is_foreign_expr would detect volatile expressions as well, but @@ -6552,13 +6548,20 @@ add_foreign_ordered_paths(PlannerInfo *root, RelOptInfo *input_rel, if (pathkey_ec->ec_has_volatile) return; - /* Get the sort expression for the pathkey_ec */ - sort_expr = find_em_expr_for_input_target(root, - pathkey_ec, - input_rel->reltarget); + /* + * Can't push down the sort if pathkey's opfamily is not shippable. + */ + if (!is_shippable(pathkey->pk_opfamily, OperatorFamilyRelationId, + fpinfo)) + return; - /* If it's unsafe to remote, we cannot push down the final sort */ - if (!is_foreign_expr(root, input_rel, sort_expr)) + /* + * The EC must contain a shippable EM that is computed in input_rel's + * reltarget, else we can't push down the sort. + */ + if (find_em_for_rel_target(root, + pathkey_ec, + input_rel) == NULL) return; } @@ -7384,14 +7387,55 @@ conversion_error_callback(void *arg) } /* - * Find an equivalence class member expression to be computed as a sort column - * in the given target. + * Given an EquivalenceClass and a foreign relation, find an EC member + * that can be used to sort the relation remotely according to a pathkey + * using this EC. + * + * If there is more than one suitable candidate, return an arbitrary + * one of them. If there is none, return NULL. + * + * This checks that the EC member expression uses only Vars from the given + * rel and is shippable. Caller must separately verify that the pathkey's + * ordering operator is shippable. + */ +EquivalenceMember * +find_em_for_rel(PlannerInfo *root, EquivalenceClass *ec, RelOptInfo *rel) +{ + ListCell *lc; + + foreach(lc, ec->ec_members) + { + EquivalenceMember *em = (EquivalenceMember *) lfirst(lc); + + /* + * Note we require !bms_is_empty, else we'd accept constant + * expressions which are not suitable for the purpose. + */ + if (bms_is_subset(em->em_relids, rel->relids) && + !bms_is_empty(em->em_relids) && + is_foreign_expr(root, rel, em->em_expr)) + return em; + } + + return NULL; +} + +/* + * Find an EquivalenceClass member that is to be computed as a sort column + * in the given rel's reltarget, and is shippable. + * + * If there is more than one suitable candidate, return an arbitrary + * one of them. If there is none, return NULL. + * + * This checks that the EC member expression uses only Vars from the given + * rel and is shippable. Caller must separately verify that the pathkey's + * ordering operator is shippable. */ -Expr * -find_em_expr_for_input_target(PlannerInfo *root, - EquivalenceClass *ec, - PathTarget *target) +EquivalenceMember * +find_em_for_rel_target(PlannerInfo *root, EquivalenceClass *ec, + RelOptInfo *rel) { + PathTarget *target = rel->reltarget; ListCell *lc1; int i; @@ -7434,15 +7478,18 @@ find_em_expr_for_input_target(PlannerInfo *root, while (em_expr && IsA(em_expr, RelabelType)) em_expr = ((RelabelType *) em_expr)->arg; - if (equal(em_expr, expr)) - return em->em_expr; + if (!equal(em_expr, expr)) + continue; + + /* Check that expression (including relabels!) is shippable */ + if (is_foreign_expr(root, rel, em->em_expr)) + return em; } i++; } - elog(ERROR, "could not find pathkey item to sort"); - return NULL; /* keep compiler quiet */ + return NULL; } /* diff --git a/contrib/postgres_fdw/postgres_fdw.h b/contrib/postgres_fdw/postgres_fdw.h index 8ae79e97e4..21f2b20ce8 100644 --- a/contrib/postgres_fdw/postgres_fdw.h +++ b/contrib/postgres_fdw/postgres_fdw.h @@ -173,6 +173,9 @@ extern bool is_foreign_expr(PlannerInfo *root, extern bool is_foreign_param(PlannerInfo *root, RelOptInfo *baserel, Expr *expr); +extern bool is_foreign_pathkey(PlannerInfo *root, + RelOptInfo *baserel, + PathKey *pathkey); extern void deparseInsertSql(StringInfo buf, RangeTblEntry *rte, Index rtindex, Relation rel, List *targetAttrs, bool doNothing, @@ -215,10 +218,12 @@ extern void deparseTruncateSql(StringInfo buf, DropBehavior behavior, bool restart_seqs); extern void deparseStringLiteral(StringInfo buf, const char *val); -extern Expr *find_em_expr_for_rel(EquivalenceClass *ec, RelOptInfo *rel); -extern Expr *find_em_expr_for_input_target(PlannerInfo *root, - EquivalenceClass *ec, - PathTarget *target); +extern EquivalenceMember *find_em_for_rel(PlannerInfo *root, + EquivalenceClass *ec, + RelOptInfo *rel); +extern EquivalenceMember *find_em_for_rel_target(PlannerInfo *root, + EquivalenceClass *ec, + RelOptInfo *rel); extern List *build_tlist_to_deparse(RelOptInfo *foreignrel); extern void deparseSelectStmtForRel(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, List *tlist, diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index 95b6b7192e..6b5de89e14 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -907,6 +907,10 @@ create operator class my_op_class for type int using btree family my_op_family a explain (verbose, costs off) select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2; +-- This should not be pushed either. +explain (verbose, costs off) +select * from ft2 order by c1 using operator(public.<^); + -- Update local stats on ft2 ANALYZE ft2; @@ -924,6 +928,10 @@ explain (verbose, costs off) select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2; select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2; +-- This should be pushed too. +explain (verbose, costs off) +select * from ft2 order by c1 using operator(public.<^); + -- Remove from extension alter extension postgres_fdw drop operator class my_op_class using btree; alter extension postgres_fdw drop function my_op_cmp(a int, b int); diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c index 258302840f..1681a55c3d 100644 --- a/src/backend/optimizer/path/equivclass.c +++ b/src/backend/optimizer/path/equivclass.c @@ -942,35 +942,6 @@ is_exprlist_member(Expr *node, List *exprs) return false; } -/* - * Find an equivalence class member expression, all of whose Vars, come from - * the indicated relation. - */ -Expr * -find_em_expr_for_rel(EquivalenceClass *ec, RelOptInfo *rel) -{ - ListCell *lc_em; - - foreach(lc_em, ec->ec_members) - { - EquivalenceMember *em = lfirst(lc_em); - - if (bms_is_subset(em->em_relids, rel->relids) && - !bms_is_empty(em->em_relids)) - { - /* - * If there is more than one equivalence member whose Vars are - * taken entirely from this relation, we'll be content to choose - * any one of those. - */ - return em->em_expr; - } - } - - /* We didn't find any suitable equivalence class expression */ - return NULL; -} - /* * relation_can_be_sorted_early * Can this relation be sorted on this EC before the final output step? diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h index 2ffa24aa89..3d95e6bfc8 100644 --- a/src/include/optimizer/paths.h +++ b/src/include/optimizer/paths.h @@ -144,7 +144,6 @@ extern EquivalenceMember *find_computable_ec_member(PlannerInfo *root, List *exprs, Relids relids, bool require_parallel_safe); -extern Expr *find_em_expr_for_rel(EquivalenceClass *ec, RelOptInfo *rel); extern bool relation_can_be_sorted_early(PlannerInfo *root, RelOptInfo *rel, EquivalenceClass *ec, bool require_parallel_safe); From ad43a413c4f7f5d024a5b2f51e00d280a22f1874 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Thu, 31 Mar 2022 15:15:11 -0400 Subject: [PATCH 332/772] initdb: When running CREATE DATABASE, use STRATEGY = WAL_COPY. Dilip Kumar, reviewed by Andres Freund and by me. Discussion: http://postgr.es/m/20220330011757.wr544o5y5my7ssoa@alap3.anarazel.de --- src/bin/initdb/initdb.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 5e36943ef3..9dd4a8de9a 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -1860,10 +1860,15 @@ make_template0(FILE *cmdfd) * objects in the old cluster, the problem scenario only exists if the OID * that is in use in the old cluster is also used in the new cluster - and * the new cluster should be the result of a fresh initdb.) + * + * We use "STRATEGY = file_copy" here because checkpoints during initdb + * are cheap. "STRATEGY = wal_log" would generate more WAL, which would + * be a little bit slower and make the new cluster a little bit bigger. */ static const char *const template0_setup[] = { "CREATE DATABASE template0 IS_TEMPLATE = true ALLOW_CONNECTIONS = false OID = " - CppAsString2(Template0ObjectId) ";\n\n", + CppAsString2(Template0ObjectId) + " STRATEGY = file_copy;\n\n", /* * template0 shouldn't have any collation-dependent objects, so unset @@ -1906,9 +1911,12 @@ make_postgres(FILE *cmdfd) { const char *const *line; - /* Assign a fixed OID to postgres, for the same reasons as template0 */ + /* + * Just as we did for template0, and for the same reasons, assign a fixed + * OID to postgres and select the file_copy strategy. + */ static const char *const postgres_setup[] = { - "CREATE DATABASE postgres OID = " CppAsString2(PostgresObjectId) ";\n\n", + "CREATE DATABASE postgres OID = " CppAsString2(PostgresObjectId) " STRATEGY = file_copy;\n\n", "COMMENT ON DATABASE postgres IS 'default administrative connection database';\n\n", NULL }; From 49082c2cc3d8167cca70cfe697afb064710828ca Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Sat, 5 Mar 2022 08:07:15 -0500 Subject: [PATCH 333/772] RETURNING clause for JSON() and JSON_SCALAR() This patch is extracted from a larger patch that allowed setting the default returned value from these functions to json or jsonb. That had problems, but this piece of it is fine. For these functions only json or jsonb can be specified in the RETURNING clause. Extracted from an original patch from Nikita Glukhov Reviewers have included (in no particular order) Andres Freund, Alexander Korotkov, Pavel Stehule, Andrew Alsup, Erik Rijkers, Zihong Yu, Himanshu Upadhyaya, Daniel Gustafsson, Justin Pryzby. Discussion: https://postgr.es/m/cd0bb935-0158-78a7-08b5-904886deac4b@postgrespro.ru --- src/backend/nodes/copyfuncs.c | 2 + src/backend/nodes/equalfuncs.c | 2 + src/backend/nodes/nodeFuncs.c | 20 +++++++++- src/backend/parser/gram.y | 7 +++- src/backend/parser/parse_expr.c | 46 ++++++++++++++++----- src/backend/utils/adt/ruleutils.c | 5 ++- src/include/nodes/parsenodes.h | 2 + src/test/regress/expected/sqljson.out | 57 +++++++++++++++++++++++++++ src/test/regress/sql/sqljson.sql | 10 +++++ 9 files changed, 135 insertions(+), 16 deletions(-) diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 56505557bf..11c016495e 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -2354,6 +2354,7 @@ _copyJsonParseExpr(const JsonParseExpr *from) JsonParseExpr *newnode = makeNode(JsonParseExpr); COPY_NODE_FIELD(expr); + COPY_NODE_FIELD(output); COPY_SCALAR_FIELD(unique_keys); COPY_LOCATION_FIELD(location); @@ -2369,6 +2370,7 @@ _copyJsonScalarExpr(const JsonScalarExpr *from) JsonScalarExpr *newnode = makeNode(JsonScalarExpr); COPY_NODE_FIELD(expr); + COPY_NODE_FIELD(output); COPY_LOCATION_FIELD(location); return newnode; diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 9ea3c5abf2..722dbe6a0d 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -875,6 +875,7 @@ static bool _equalJsonParseExpr(const JsonParseExpr *a, const JsonParseExpr *b) { COMPARE_NODE_FIELD(expr); + COMPARE_NODE_FIELD(output); COMPARE_SCALAR_FIELD(unique_keys); COMPARE_LOCATION_FIELD(location); @@ -885,6 +886,7 @@ static bool _equalJsonScalarExpr(const JsonScalarExpr *a, const JsonScalarExpr *b) { COMPARE_NODE_FIELD(expr); + COMPARE_NODE_FIELD(output); COMPARE_LOCATION_FIELD(location); return true; diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index 4789ba6911..a094317bfc 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -4364,9 +4364,25 @@ raw_expression_tree_walker(Node *node, } break; case T_JsonParseExpr: - return walker(((JsonParseExpr *) node)->expr, context); + { + JsonParseExpr *jpe = (JsonParseExpr *) node; + + if (walker(jpe->expr, context)) + return true; + if (walker(jpe->output, context)) + return true; + } + break; case T_JsonScalarExpr: - return walker(((JsonScalarExpr *) node)->expr, context); + { + JsonScalarExpr *jse = (JsonScalarExpr *) node; + + if (walker(jse->expr, context)) + return true; + if (walker(jse->output, context)) + return true; + } + break; case T_JsonSerializeExpr: { JsonSerializeExpr *jse = (JsonSerializeExpr *) node; diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index eefcf90187..e5a3c528aa 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -15614,21 +15614,24 @@ json_func_expr: ; json_parse_expr: - JSON '(' json_value_expr json_key_uniqueness_constraint_opt ')' + JSON '(' json_value_expr json_key_uniqueness_constraint_opt + json_returning_clause_opt ')' { JsonParseExpr *n = makeNode(JsonParseExpr); n->expr = (JsonValueExpr *) $3; n->unique_keys = $4; + n->output = (JsonOutput *) $5; n->location = @1; $$ = (Node *) n; } ; json_scalar_expr: - JSON_SCALAR '(' a_expr ')' + JSON_SCALAR '(' a_expr json_returning_clause_opt ')' { JsonScalarExpr *n = makeNode(JsonScalarExpr); n->expr = (Expr *) $3; + n->output = (JsonOutput *) $4; n->location = @1; $$ = (Node *) n; } diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index e140007250..31f0c9f693 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -4450,19 +4450,48 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func) return (Node *) jsexpr; } +static JsonReturning * +transformJsonConstructorRet(ParseState *pstate, JsonOutput *output, const char *fname) +{ + JsonReturning *returning; + + if (output) + { + returning = transformJsonOutput(pstate, output, false); + + Assert(OidIsValid(returning->typid)); + + if (returning->typid != JSONOID && returning->typid != JSONBOID) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("cannot use RETURNING type %s in %s", + format_type_be(returning->typid), fname), + parser_errposition(pstate, output->typeName->location))); + } + else + { + Oid targettype = JSONOID; + JsonFormatType format = JS_FORMAT_JSON; + + returning = makeNode(JsonReturning); + returning->format = makeJsonFormat(format, JS_ENC_DEFAULT, -1); + returning->typid = targettype; + returning->typmod = -1; + } + + return returning; +} + /* * Transform a JSON() expression. */ static Node * transformJsonParseExpr(ParseState *pstate, JsonParseExpr *jsexpr) { - JsonReturning *returning = makeNode(JsonReturning); + JsonReturning *returning = transformJsonConstructorRet(pstate, jsexpr->output, + "JSON()"); Node *arg; - returning->format = makeJsonFormat(JS_FORMAT_JSON, JS_ENC_DEFAULT, -1); - returning->typid = JSONOID; - returning->typmod = -1; - if (jsexpr->unique_keys) { /* @@ -4502,12 +4531,9 @@ transformJsonParseExpr(ParseState *pstate, JsonParseExpr *jsexpr) static Node * transformJsonScalarExpr(ParseState *pstate, JsonScalarExpr *jsexpr) { - JsonReturning *returning = makeNode(JsonReturning); Node *arg = transformExprRecurse(pstate, (Node *) jsexpr->expr); - - returning->format = makeJsonFormat(JS_FORMAT_JSON, JS_ENC_DEFAULT, -1); - returning->typid = JSONOID; - returning->typmod = -1; + JsonReturning *returning = transformJsonConstructorRet(pstate, jsexpr->output, + "JSON_SCALAR()"); if (exprType(arg) == UNKNOWNOID) arg = coerce_to_specific_type(pstate, arg, TEXTOID, "JSON_SCALAR"); diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 010d5a7a75..4458d2ff90 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -10092,8 +10092,9 @@ get_json_constructor_options(JsonConstructorExpr *ctor, StringInfo buf) if (ctor->unique) appendStringInfoString(buf, " WITH UNIQUE KEYS"); - if (ctor->type != JSCTOR_JSON_PARSE && - ctor->type != JSCTOR_JSON_SCALAR) + if (!((ctor->type == JSCTOR_JSON_PARSE || + ctor->type == JSCTOR_JSON_SCALAR) && + ctor->returning->typid == JSONOID)) get_json_returning(ctor->returning, buf, true); } diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index c24fc26da1..8a9ccf6221 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1684,6 +1684,7 @@ typedef struct JsonParseExpr { NodeTag type; JsonValueExpr *expr; /* string expression */ + JsonOutput *output; /* RETURNING clause, if specified */ bool unique_keys; /* WITH UNIQUE KEYS? */ int location; /* token location, or -1 if unknown */ } JsonParseExpr; @@ -1696,6 +1697,7 @@ typedef struct JsonScalarExpr { NodeTag type; Expr *expr; /* scalar expression */ + JsonOutput *output; /* RETURNING clause, if specified */ int location; /* token location, or -1 if unknown */ } JsonScalarExpr; diff --git a/src/test/regress/expected/sqljson.out b/src/test/regress/expected/sqljson.out index 11f5eb2d2c..6cadd87868 100644 --- a/src/test/regress/expected/sqljson.out +++ b/src/test/regress/expected/sqljson.out @@ -113,6 +113,49 @@ EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' WITHOUT UNIQUE KEYS); Output: JSON('123'::json) (2 rows) +SELECT JSON('123' RETURNING text); +ERROR: cannot use RETURNING type text in JSON() +LINE 1: SELECT JSON('123' RETURNING text); + ^ +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'); + QUERY PLAN +----------------------------- + Result + Output: JSON('123'::json) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' RETURNING json); + QUERY PLAN +----------------------------- + Result + Output: JSON('123'::json) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' RETURNING jsonb); + QUERY PLAN +---------------------------------------------- + Result + Output: JSON('123'::jsonb RETURNING jsonb) +(2 rows) + +SELECT pg_typeof(JSON('123')); + pg_typeof +----------- + json +(1 row) + +SELECT pg_typeof(JSON('123' RETURNING json)); + pg_typeof +----------- + json +(1 row) + +SELECT pg_typeof(JSON('123' RETURNING jsonb)); + pg_typeof +----------- + jsonb +(1 row) + -- JSON_SCALAR() SELECT JSON_SCALAR(); ERROR: syntax error at or near ")" @@ -204,6 +247,20 @@ EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR('123'); Output: JSON_SCALAR('123'::text) (2 rows) +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR(123 RETURNING json); + QUERY PLAN +---------------------------- + Result + Output: JSON_SCALAR(123) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR(123 RETURNING jsonb); + QUERY PLAN +-------------------------------------------- + Result + Output: JSON_SCALAR(123 RETURNING jsonb) +(2 rows) + -- JSON_SERIALIZE() SELECT JSON_SERIALIZE(); ERROR: syntax error at or near ")" diff --git a/src/test/regress/sql/sqljson.sql b/src/test/regress/sql/sqljson.sql index 98bd93c110..51fc659b58 100644 --- a/src/test/regress/sql/sqljson.sql +++ b/src/test/regress/sql/sqljson.sql @@ -23,6 +23,14 @@ EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'::bytea FORMAT JSON ENCODING UTF8) EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' WITH UNIQUE KEYS); EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' WITHOUT UNIQUE KEYS); +SELECT JSON('123' RETURNING text); + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' RETURNING json); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' RETURNING jsonb); +SELECT pg_typeof(JSON('123')); +SELECT pg_typeof(JSON('123' RETURNING json)); +SELECT pg_typeof(JSON('123' RETURNING jsonb)); -- JSON_SCALAR() SELECT JSON_SCALAR(); @@ -41,6 +49,8 @@ SELECT JSON_SCALAR('{}'::jsonb); EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR(123); EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR('123'); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR(123 RETURNING json); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR(123 RETURNING jsonb); -- JSON_SERIALIZE() SELECT JSON_SERIALIZE(); From 9f91344223aad903ff70301f40183691a89f6cd4 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 31 Mar 2022 15:27:09 -0400 Subject: [PATCH 334/772] Fix comments with "a expression" --- src/backend/optimizer/path/equivclass.c | 2 +- src/backend/parser/parse_expr.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c index 1681a55c3d..34c5ab1cb6 100644 --- a/src/backend/optimizer/path/equivclass.c +++ b/src/backend/optimizer/path/equivclass.c @@ -1001,7 +1001,7 @@ relation_can_be_sorted_early(PlannerInfo *root, RelOptInfo *rel, } /* - * Try to find a expression computable from the reltarget. + * Try to find an expression computable from the reltarget. */ em = find_computable_ec_member(root, ec, target->exprs, rel->relids, require_parallel_safe); diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 31f0c9f693..911f355460 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -4251,7 +4251,7 @@ transformJsonFuncExprOutput(ParseState *pstate, JsonFuncExpr *func, } /* - * Coerce a expression in JSON DEFAULT behavior to the target output type. + * Coerce an expression in JSON DEFAULT behavior to the target output type. */ static Node * coerceDefaultJsonExpr(ParseState *pstate, JsonExpr *jsexpr, Node *defexpr) From 53ef6c40f1e7ff6c9ad9a221cd9999dd147ec3a2 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 31 Mar 2022 17:05:47 -0400 Subject: [PATCH 335/772] Expose a few more PL/pgSQL functions to debugger plugins. Add exec_assign_value, exec_eval_datum, and exec_cast_value to the set of functions a PL/pgSQL debugger plugin can conveniently call. This allows more convenient manipulation of the values of PL/pgSQL function variables. Pavel Stehule, reviewed by Aleksander Alekseev and myself Discussion: https://postgr.es/m/CAFj8pRD+dBPU0T-KrkP7ef6QNPDEsjYCejEsBe07NDq8TybOkA@mail.gmail.com --- src/pl/plpgsql/src/pl_exec.c | 11 +++++++---- src/pl/plpgsql/src/plpgsql.h | 28 ++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 00328fddcf..ceb011810d 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -4077,15 +4077,18 @@ plpgsql_estate_setup(PLpgSQL_execstate *estate, plpgsql_create_econtext(estate); /* - * Let the plugin see this function before we initialize any local - * PL/pgSQL variables - note that we also give the plugin a few function - * pointers so it can call back into PL/pgSQL for doing things like - * variable assignments and stack traces + * Let the plugin, if any, see this function before we initialize local + * PL/pgSQL variables. Note that we also give the plugin a few function + * pointers, so it can call back into PL/pgSQL for doing things like + * variable assignments and stack traces. */ if (*plpgsql_plugin_ptr) { (*plpgsql_plugin_ptr)->error_callback = plpgsql_exec_error_callback; (*plpgsql_plugin_ptr)->assign_expr = exec_assign_expr; + (*plpgsql_plugin_ptr)->assign_value = exec_assign_value; + (*plpgsql_plugin_ptr)->eval_datum = exec_eval_datum; + (*plpgsql_plugin_ptr)->cast_value = exec_cast_value; if ((*plpgsql_plugin_ptr)->func_setup) ((*plpgsql_plugin_ptr)->func_setup) (estate, func); diff --git a/src/pl/plpgsql/src/plpgsql.h b/src/pl/plpgsql/src/plpgsql.h index 813c32c70f..cc8d782217 100644 --- a/src/pl/plpgsql/src/plpgsql.h +++ b/src/pl/plpgsql/src/plpgsql.h @@ -1120,9 +1120,17 @@ typedef struct PLpgSQL_execstate * statement. * * Also, immediately before any call to func_setup, PL/pgSQL fills in the - * error_callback and assign_expr fields with pointers to its own - * plpgsql_exec_error_callback and exec_assign_expr functions. This is - * a somewhat ad-hoc expedient to simplify life for debugger plugins. + * remaining fields with pointers to some of its own functions, allowing the + * plugin to invoke those functions conveniently. The exposed functions are: + * plpgsql_exec_error_callback + * exec_assign_expr + * exec_assign_value + * exec_eval_datum + * exec_cast_value + * (plpgsql_exec_error_callback is not actually meant to be called by the + * plugin, but rather to allow it to identify PL/pgSQL error context stack + * frames. The others are useful for debugger-like plugins to examine and + * set variables.) */ typedef struct PLpgSQL_plugin { @@ -1135,8 +1143,20 @@ typedef struct PLpgSQL_plugin /* Function pointers set by PL/pgSQL itself */ void (*error_callback) (void *arg); - void (*assign_expr) (PLpgSQL_execstate *estate, PLpgSQL_datum *target, + void (*assign_expr) (PLpgSQL_execstate *estate, + PLpgSQL_datum *target, PLpgSQL_expr *expr); + void (*assign_value) (PLpgSQL_execstate *estate, + PLpgSQL_datum *target, + Datum value, bool isNull, + Oid valtype, int32 valtypmod); + void (*eval_datum) (PLpgSQL_execstate *estate, PLpgSQL_datum *datum, + Oid *typeid, int32 *typetypmod, + Datum *value, bool *isnull); + Datum (*cast_value) (PLpgSQL_execstate *estate, + Datum value, bool *isnull, + Oid valtype, int32 valtypmod, + Oid reqtype, int32 reqtypmod); } PLpgSQL_plugin; /* From fb691bbb4c8d729e6701f708edbb003b73efb16b Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 31 Mar 2022 18:29:10 -0400 Subject: [PATCH 336/772] Keep plpgsql.h C++-clean. I forgot that "typeid" is a C++ keyword. Per buildfarm. --- src/pl/plpgsql/src/plpgsql.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pl/plpgsql/src/plpgsql.h b/src/pl/plpgsql/src/plpgsql.h index cc8d782217..6444347ce9 100644 --- a/src/pl/plpgsql/src/plpgsql.h +++ b/src/pl/plpgsql/src/plpgsql.h @@ -1151,7 +1151,7 @@ typedef struct PLpgSQL_plugin Datum value, bool isNull, Oid valtype, int32 valtypmod); void (*eval_datum) (PLpgSQL_execstate *estate, PLpgSQL_datum *datum, - Oid *typeid, int32 *typetypmod, + Oid *typeId, int32 *typetypmod, Datum *value, bool *isnull); Datum (*cast_value) (PLpgSQL_execstate *estate, Datum value, bool *isnull, From 322becb6085cb92d3708635eea61b45776bf27b6 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 1 Apr 2022 10:13:50 +0900 Subject: [PATCH 337/772] Switch the regression tests of pg_upgrade to use TAP tests This simplifies a lot of code in the tests of pg_upgrade without sacrificing its coverage: - Removal of test.sh used for builds with make, that has accumulated over the years tweaks for problems that are solved in a duplicated way by the centralized TAP framework (initialization of the various environment variables PG*, port selection). - Removal of the code in MSVC to test pg_upgrade. This was roughly a duplicate of test.sh adapted for Windows, with an extra footprint of a pg_regress command and all the assumptions behind it. Support for upgrades with older versions is changed, not removed. test.sh was able to set up the regression database on the old instance by launching itself the pg_regress command and a dependency to the source tree of thd old cluster, with tweaks on the command arguments to adapt across the versions used. This created a backward-compatibility dependency with older pg_regress commands, and recent changes like d1029bb have made that much more complicated. Instead, this commit allows tests with older major versions by specifying a path to a SQL dump (taken with pg_dumpall from the old cluster's installation) that will be loaded into the old instance to upgrade instead of running pg_regress, through an optional environment variable called $olddump. This requires a second variable called $oldinstall to point to the base path of the installation of the old cluster. This method is more in line with the buildfarm client that uses a set of static dumps to set up an old instance, so hopefully we will be able to reuse what is introduced in this commit there. The last step of the tests that checks for differences between the two dumps taken still needs to be improved as it can fail, requiring a manual lookup at the dumps. This is not different from the old way of testing where things could fail at the last step. Support for EXTRA_REGRESS_OPTS is kept. vcregress.pl in the MSVC scripts still handles the test of pg_upgrade with its upgradecheck, and bincheck is changed to skip pg_upgrade. Author: Michael Paquier Reviewed-by: Andrew Dunstan, Andres Freund, Rachel Heaton, Tom Lane, Discussion: https://postgr.es/m/YJ8xTmLQkotVLpN5@paquier.xyz --- src/bin/pg_upgrade/Makefile | 21 +- src/bin/pg_upgrade/TESTING | 86 +++----- src/bin/pg_upgrade/t/001_basic.pl | 11 + src/bin/pg_upgrade/t/002_pg_upgrade.pl | 237 +++++++++++++++++++++ src/bin/pg_upgrade/test.sh | 279 ------------------------- src/tools/msvc/vcregress.pl | 92 +------- 6 files changed, 290 insertions(+), 436 deletions(-) create mode 100644 src/bin/pg_upgrade/t/001_basic.pl create mode 100644 src/bin/pg_upgrade/t/002_pg_upgrade.pl delete mode 100644 src/bin/pg_upgrade/test.sh diff --git a/src/bin/pg_upgrade/Makefile b/src/bin/pg_upgrade/Makefile index 7a3225b27c..587793e815 100644 --- a/src/bin/pg_upgrade/Makefile +++ b/src/bin/pg_upgrade/Makefile @@ -28,6 +28,10 @@ OBJS = \ override CPPFLAGS := -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS) LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) +# required for 002_pg_upgrade.pl +REGRESS_SHLIB=$(abs_top_builddir)/src/test/regress/regress$(DLSUFFIX) +export REGRESS_SHLIB + all: pg_upgrade pg_upgrade: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils @@ -47,17 +51,8 @@ clean distclean maintainer-clean: rm -rf delete_old_cluster.sh log/ tmp_check/ \ reindex_hash.sql -# When $(MAKE) is present, make automatically infers that this is a -# recursive make. which is not actually what we want here, as that -# e.g. prevents output synchronization from working (as make thinks -# that the subsidiary make knows how to deal with that itself, but -# we're invoking a shell script that doesn't know). Referencing -# $(MAKE) indirectly avoids that behaviour. -# See https://www.gnu.org/software/make/manual/html_node/MAKE-Variable.html#MAKE-Variable -NOTSUBMAKEMAKE=$(MAKE) - -check: test.sh all temp-install - MAKE=$(NOTSUBMAKEMAKE) $(with_temp_install) bindir=$(abs_top_builddir)/tmp_install/$(bindir) EXTRA_REGRESS_OPTS="$(EXTRA_REGRESS_OPTS)" $(SHELL) $< +check: + $(prove_check) -# installcheck is not supported because there's no meaningful way to test -# pg_upgrade against a single already-running server +installcheck: + $(prove_installcheck) diff --git a/src/bin/pg_upgrade/TESTING b/src/bin/pg_upgrade/TESTING index 78b9747908..200ce9d92b 100644 --- a/src/bin/pg_upgrade/TESTING +++ b/src/bin/pg_upgrade/TESTING @@ -2,25 +2,22 @@ THE SHORT VERSION ----------------- On non-Windows machines, you can execute the testing process -described below by running +described below by running the following command in this directory: make check -in this directory. This will run the shell script test.sh, performing -an upgrade from the version in this source tree to a new instance of -the same version. -To test an upgrade from a different version, you must have a built -source tree for the old version as well as this version, and you -must have done "make install" for both versions. Then do: +This will run the TAP tests to run pg_upgrade, performing an upgrade +from the version in this source tree to a new instance of the same +version. -export oldsrc=...somewhere/postgresql (old version's source tree) -export oldbindir=...otherversion/bin (old version's installed bin dir) -export bindir=...thisversion/bin (this version's installed bin dir) -export libdir=...thisversion/lib (this version's installed lib dir) -sh test.sh - -In this case, you will have to manually eyeball the resulting dump -diff for version-specific differences, as explained below. +Testing an upgrade from a different version requires a dump to set up +the contents of this instance, with its set of binaries. The following +variables are available to control the test (see DETAILS below about +the creation of the dump): +export olddump=...somewhere/dump.sql (old version's dump) +export oldinstall=...otherversion/ (old version's install base path) +Finally, the tests can be done by running + make check DETAILS ------- @@ -29,51 +26,22 @@ The most effective way to test pg_upgrade, aside from testing on user data, is by upgrading the PostgreSQL regression database. This testing process first requires the creation of a valid regression -database dump. Such files contain most database features and are -specific to each major version of Postgres. +database dump that can be then used for $olddump. Such files contain +most database features and are specific to each major version of Postgres. -Here are the steps needed to create a regression database dump file: +Here are the steps needed to create a dump file: 1) Create and populate the regression database in the old cluster. This database can be created by running 'make installcheck' from - src/test/regress. - -2) Use pg_dump to dump out the regression database. Use the new - cluster's pg_dump on the old database to minimize whitespace - differences in the diff. - -3) Adjust the regression database dump file - - a) Perform the load/dump twice - This fixes problems with the ordering of COPY columns for - inherited tables. - - b) Change CREATE FUNCTION shared object paths to use '$libdir' - The old and new cluster will have different shared object paths. - - c) Fix any wrapping format differences - Commands like CREATE TRIGGER and ALTER TABLE sometimes have - differences. - -Once the dump is created, it can be repeatedly loaded into the old -database, upgraded, and dumped out of the new database, and then -compared to the original version. To test the dump file, perform these -steps: - -1) Create the old and new clusters in different directories. - -2) Copy the regression shared object files into the appropriate /lib - directory for old and new clusters. - -3) Create the regression database in the old server. - -4) Load the dump file created above into the regression database; - check for errors while loading. - -5) Upgrade the old database to the new major version, as outlined in - the pg_upgrade manual section. - -6) Use pg_dump to dump out the regression database in the new cluster. - -7) Diff the regression database dump file with the regression dump - file loaded into the old server. + src/test/regress using its source code tree. + +2) Use pg_dumpall to dump out the contents of the instance, including the + regression database, in the shape of a SQL file. This requires the *old* + cluster's pg_dumpall so as the dump created is compatible with the + version of the cluster it is dumped into. + +Once the dump is created, it can be repeatedly used with $olddump and +`make check`, that automates the dump of the old database, its upgrade, +the dump out of the new database and the comparison of the dumps between +the old and new databases. The contents of the dumps can also be manually +compared. diff --git a/src/bin/pg_upgrade/t/001_basic.pl b/src/bin/pg_upgrade/t/001_basic.pl new file mode 100644 index 0000000000..40458f10b6 --- /dev/null +++ b/src/bin/pg_upgrade/t/001_basic.pl @@ -0,0 +1,11 @@ +use strict; +use warnings; + +use PostgreSQL::Test::Utils; +use Test::More; + +program_help_ok('pg_upgrade'); +program_version_ok('pg_upgrade'); +program_options_handling_ok('pg_upgrade'); + +done_testing(); diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl new file mode 100644 index 0000000000..36b560bd0c --- /dev/null +++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl @@ -0,0 +1,237 @@ +# Set of tests for pg_upgrade, including cross-version checks. +use strict; +use warnings; + +use Cwd qw(abs_path getcwd); +use File::Basename qw(dirname); + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Generate a database with a name made of a range of ASCII characters. +sub generate_db +{ + my ($node, $from_char, $to_char) = @_; + + my $dbname = ''; + for my $i ($from_char .. $to_char) + { + next if $i == 7 || $i == 10 || $i == 13; # skip BEL, LF, and CR + $dbname = $dbname . sprintf('%c', $i); + } + $node->run_log( + [ 'createdb', '--host', $node->host, '--port', $node->port, $dbname ] + ); +} + +# The test of pg_upgrade requires two clusters, an old one and a new one +# that gets upgraded. Before running the upgrade, a logical dump of the +# old cluster is taken, and a second logical dump of the new one is taken +# after the upgrade. The upgrade test passes if there are no differences +# in these two dumps. + +# Testing upgrades with an older version of PostgreSQL requires setting up +# two environment variables, as of: +# - "olddump", to point to a dump file that will be used to set up the old +# instance to upgrade from. +# - "oldinstall", to point to the installation path of the old cluster. +if ( (defined($ENV{olddump}) && !defined($ENV{oldinstall})) + || (!defined($ENV{olddump}) && defined($ENV{oldinstall}))) +{ + # Not all variables are defined, so leave and die if test is + # done with an older installation. + die "olddump or oldinstall is undefined"; +} + +# Temporary location for the dumps taken +my $tempdir = PostgreSQL::Test::Utils::tempdir; + +# Initialize node to upgrade +my $oldnode = PostgreSQL::Test::Cluster->new('old_node', + install_path => $ENV{oldinstall}); + +# To increase coverage of non-standard segment size and group access without +# increasing test runtime, run these tests with a custom setting. +# --allow-group-access and --wal-segsize have been added in v11. +$oldnode->init(extra => [ '--wal-segsize', '1', '--allow-group-access' ]); +$oldnode->start; + +# The default location of the source code is the root of this directory. +my $srcdir = abs_path("../../.."); + +# Set up the data of the old instance with a dump or pg_regress. +if (defined($ENV{olddump})) +{ + # Use the dump specified. + my $olddumpfile = $ENV{olddump}; + die "no dump file found!" unless -e $olddumpfile; + + # Load the dump using the "postgres" database as "regression" does + # not exist yet, and we are done here. + $oldnode->command_ok( + [ + 'psql', '-X', '-f', $olddumpfile, + '--port', $oldnode->port, '--host', $oldnode->host, + 'postgres' + ]); +} +else +{ + # Default is to use pg_regress to set up the old instance. + + # Create databases with names covering most ASCII bytes + generate_db($oldnode, 1, 45); + generate_db($oldnode, 46, 90); + generate_db($oldnode, 91, 127); + + # Grab any regression options that may be passed down by caller. + my $extra_opts_val = $ENV{EXTRA_REGRESS_OPT} || ""; + my @extra_opts = split(/\s+/, $extra_opts_val); + + # --dlpath is needed to be able to find the location of regress.so + # and any libraries the regression tests require. + my $dlpath = dirname($ENV{REGRESS_SHLIB}); + + # --outputdir points to the path where to place the output files. + my $outputdir = $PostgreSQL::Test::Utils::tmp_check; + + # --inputdir points to the path of the input files. + my $inputdir = "$srcdir/src/test/regress"; + + my @regress_command = [ + $ENV{PG_REGRESS}, @extra_opts, + '--dlpath', $dlpath, + '--max-concurrent-tests', '20', + '--bindir=', '--host', + $oldnode->host, '--port', + $oldnode->port, '--schedule', + "$srcdir/src/test/regress/parallel_schedule", '--outputdir', + $outputdir, '--inputdir', + $inputdir + ]; + + $oldnode->command_ok(@regress_command, + 'regression test run on old instance'); +} + +# Before dumping, get rid of objects not existing or not supported in later +# versions. This depends on the version of the old server used, and matters +# only if different major versions are used for the dump. +if (defined($ENV{oldinstall})) +{ + # Note that upgrade_adapt.sql from the new version is used, to + # cope with an upgrade to this version. + $oldnode->run_log( + [ + 'psql', '-X', + '-f', "$srcdir/src/bin/pg_upgrade/upgrade_adapt.sql", + '--port', $oldnode->port, + '--host', $oldnode->host, + 'regression' + ]); +} + +# Initialize a new node for the upgrade. +my $newnode = PostgreSQL::Test::Cluster->new('new_node'); +$newnode->init(extra => [ '--wal-segsize', '1', '--allow-group-access' ]); +my $newbindir = $newnode->config_data('--bindir'); +my $oldbindir = $oldnode->config_data('--bindir'); + +# Take a dump before performing the upgrade as a base comparison. Note +# that we need to use pg_dumpall from the new node here. +$newnode->command_ok( + [ + 'pg_dumpall', '--no-sync', + '-d', $oldnode->connstr('postgres'), + '-f', "$tempdir/dump1.sql" + ], + 'dump before running pg_upgrade'); + +# After dumping, update references to the old source tree's regress.so +# to point to the new tree. +if (defined($ENV{oldinstall})) +{ + # First, fetch all the references to libraries that are not part + # of the default path $libdir. + my $output = $oldnode->safe_psql('regression', + "SELECT DISTINCT probin::text FROM pg_proc WHERE probin NOT LIKE '\$libdir%';" + ); + chomp($output); + my @libpaths = split("\n", $output); + + my $dump_data = slurp_file("$tempdir/dump1.sql"); + + my $newregresssrc = "$srcdir/src/test/regress"; + foreach (@libpaths) + { + my $libpath = $_; + $libpath = dirname($libpath); + $dump_data =~ s/$libpath/$newregresssrc/g; + } + + open my $fh, ">", "$tempdir/dump1.sql" or die "could not open dump file"; + print $fh $dump_data; + close $fh; + + # This replaces any references to the old tree's regress.so + # the new tree's regress.so. Any references that do *not* + # match $libdir are switched so as this request does not + # depend on the path of the old source tree. This is useful + # when using an old dump. Do the operation on all the databases + # that allow connections so as this includes the regression + # database and anything the user has set up. + $output = $oldnode->safe_psql('postgres', + "SELECT datname FROM pg_database WHERE datallowconn;"); + chomp($output); + my @datnames = split("\n", $output); + foreach (@datnames) + { + my $datname = $_; + $oldnode->safe_psql( + $datname, "UPDATE pg_proc SET probin = + regexp_replace(probin, '.*/', '$newregresssrc/') + WHERE probin NOT LIKE '\$libdir/%'"); + } +} + +# Upgrade the instance. +$oldnode->stop; +command_ok( + [ + 'pg_upgrade', '--no-sync', '-d', $oldnode->data_dir, + '-D', $newnode->data_dir, '-b', $oldbindir, + '-B', $newbindir, '-p', $oldnode->port, + '-P', $newnode->port + ], + 'run of pg_upgrade for new instance'); +$newnode->start; + +# Check if there are any logs coming from pg_upgrade, that would only be +# retained on failure. +my $log_path = $newnode->data_dir . "/pg_upgrade_output.d/log"; +if (-d $log_path) +{ + foreach my $log (glob("$log_path/*")) + { + note "###########################"; + note "Contents of log file $log"; + note "###########################"; + my $log_contents = slurp_file($log); + print "$log_contents\n"; + } +} + +# Second dump from the upgraded instance. +$newnode->run_log( + [ + 'pg_dumpall', '--no-sync', + '-d', $newnode->connstr('postgres'), + '-f', "$tempdir/dump2.sql" + ]); + +# Compare the two dumps, there should be no differences. +command_ok([ 'diff', '-q', "$tempdir/dump1.sql", "$tempdir/dump2.sql" ], + 'old and new dump match after pg_upgrade'); + +done_testing(); diff --git a/src/bin/pg_upgrade/test.sh b/src/bin/pg_upgrade/test.sh deleted file mode 100644 index ef328b3062..0000000000 --- a/src/bin/pg_upgrade/test.sh +++ /dev/null @@ -1,279 +0,0 @@ -#!/bin/sh - -# src/bin/pg_upgrade/test.sh -# -# Test driver for pg_upgrade. Initializes a new database cluster, -# runs the regression tests (to put in some data), runs pg_dumpall, -# runs pg_upgrade, runs pg_dumpall again, compares the dumps. -# -# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group -# Portions Copyright (c) 1994, Regents of the University of California - -set -e - -: ${MAKE=make} - -# Guard against parallel make issues (see comments in pg_regress.c) -unset MAKEFLAGS -unset MAKELEVEL - -# Run a given "initdb" binary and overlay the regression testing -# authentication configuration. -standard_initdb() { - # To increase coverage of non-standard segment size and group access - # without increasing test runtime, run these tests with a custom setting. - # Also, specify "-A trust" explicitly to suppress initdb's warning. - # --allow-group-access and --wal-segsize have been added in v11. - "$1" -N --wal-segsize 1 --allow-group-access -A trust - if [ -n "$TEMP_CONFIG" -a -r "$TEMP_CONFIG" ] - then - cat "$TEMP_CONFIG" >> "$PGDATA/postgresql.conf" - fi - ../../test/regress/pg_regress --config-auth "$PGDATA" -} - -# What flavor of host are we on? -# Treat MINGW* (msys1) and MSYS* (msys2) the same. -testhost=`uname -s | sed 's/^MSYS/MINGW/'` - -# Establish how the server will listen for connections -case $testhost in - MINGW*) - LISTEN_ADDRESSES="localhost" - PG_REGRESS_SOCKET_DIR="" - PGHOST=localhost - ;; - *) - LISTEN_ADDRESSES="" - # Select a socket directory. The algorithm is from the "configure" - # script; the outcome mimics pg_regress.c:make_temp_sockdir(). - if [ x"$PG_REGRESS_SOCKET_DIR" = x ]; then - set +e - dir=`(umask 077 && - mktemp -d /tmp/pg_upgrade_check-XXXXXX) 2>/dev/null` - if [ ! -d "$dir" ]; then - dir=/tmp/pg_upgrade_check-$$-$RANDOM - (umask 077 && mkdir "$dir") - if [ ! -d "$dir" ]; then - echo "could not create socket temporary directory in \"/tmp\"" - exit 1 - fi - fi - set -e - PG_REGRESS_SOCKET_DIR=$dir - trap 'rm -rf "$PG_REGRESS_SOCKET_DIR"' 0 - trap 'exit 3' 1 2 13 15 - fi - PGHOST=$PG_REGRESS_SOCKET_DIR - ;; -esac - -POSTMASTER_OPTS="-F -c listen_addresses=\"$LISTEN_ADDRESSES\" -k \"$PG_REGRESS_SOCKET_DIR\"" -export PGHOST - -# don't rely on $PWD here, as old shells don't set it -temp_root=`pwd`/tmp_check -rm -rf "$temp_root" -mkdir "$temp_root" - -: ${oldbindir=$bindir} - -: ${oldsrc=../../..} -oldsrc=`cd "$oldsrc" && pwd` -newsrc=`cd ../../.. && pwd` - -# We need to make pg_regress use psql from the desired installation -# (likely a temporary one), because otherwise the installcheck run -# below would try to use psql from the proper installation directory -# of the target version, which might be outdated or not exist. But -# don't override anything else that's already in EXTRA_REGRESS_OPTS. -EXTRA_REGRESS_OPTS="$EXTRA_REGRESS_OPTS --bindir='$oldbindir'" -export EXTRA_REGRESS_OPTS - -# While in normal cases this will already be set up, adding bindir to -# path allows test.sh to be invoked with different versions as -# described in ./TESTING -PATH=$bindir:$PATH -export PATH - -BASE_PGDATA="$temp_root/data" -PGDATA="${BASE_PGDATA}.old" -export PGDATA - -# Send installcheck outputs to a private directory. This avoids conflict when -# check-world runs pg_upgrade check concurrently with src/test/regress check. -# To retrieve interesting files after a run, use pattern tmp_check/*/*.diffs. -outputdir="$temp_root/regress" -EXTRA_REGRESS_OPTS="$EXTRA_REGRESS_OPTS --outputdir=$outputdir" -export EXTRA_REGRESS_OPTS -mkdir "$outputdir" - -# pg_regress --make-tablespacedir would take care of that in 14~, but this is -# still required for older versions where this option is not supported. -if [ "$newsrc" != "$oldsrc" ]; then - mkdir "$outputdir"/testtablespace - mkdir "$outputdir"/sql - mkdir "$outputdir"/expected -fi - -logdir=`pwd`/log -rm -rf "$logdir" -mkdir "$logdir" - -# Clear out any environment vars that might cause libpq to connect to -# the wrong postmaster (cf pg_regress.c) -# -# Some shells, such as NetBSD's, return non-zero from unset if the variable -# is already unset. Since we are operating under 'set -e', this causes the -# script to fail. To guard against this, set them all to an empty string first. -PGDATABASE=""; unset PGDATABASE -PGUSER=""; unset PGUSER -PGSERVICE=""; unset PGSERVICE -PGSSLMODE=""; unset PGSSLMODE -PGREQUIRESSL=""; unset PGREQUIRESSL -PGCONNECT_TIMEOUT=""; unset PGCONNECT_TIMEOUT -PGHOSTADDR=""; unset PGHOSTADDR - -# Select a non-conflicting port number, similarly to pg_regress.c -PG_VERSION_NUM=`grep '#define PG_VERSION_NUM' "$newsrc"/src/include/pg_config.h | awk '{print $3}'` -PGPORT=`expr $PG_VERSION_NUM % 16384 + 49152` -export PGPORT - -i=0 -while psql -X postgres /dev/null -do - i=`expr $i + 1` - if [ $i -eq 16 ] - then - echo port $PGPORT apparently in use - exit 1 - fi - PGPORT=`expr $PGPORT + 1` - export PGPORT -done - -# buildfarm may try to override port via EXTRA_REGRESS_OPTS ... -EXTRA_REGRESS_OPTS="$EXTRA_REGRESS_OPTS --port=$PGPORT" -export EXTRA_REGRESS_OPTS - -standard_initdb "$oldbindir"/initdb -"$oldbindir"/pg_ctl start -l "$logdir/postmaster1.log" -o "$POSTMASTER_OPTS" -w - -# Create databases with names covering the ASCII bytes other than NUL, BEL, -# LF, or CR. BEL would ring the terminal bell in the course of this test, and -# it is not otherwise a special case. PostgreSQL doesn't support the rest. -dbname1=`awk 'BEGIN { for (i= 1; i < 46; i++) - if (i != 7 && i != 10 && i != 13) printf "%c", i }' "$temp_root"/dump1.sql - fi -else - make_installcheck_status=$? -fi -"$oldbindir"/pg_ctl -m fast stop -if [ -n "$createdb_status" ]; then - exit 1 -fi -if [ -n "$make_installcheck_status" ]; then - exit 1 -fi -if [ -n "$psql_fix_sql_status" ]; then - exit 1 -fi -if [ -n "$pg_dumpall1_status" ]; then - echo "pg_dumpall of pre-upgrade database cluster failed" - exit 1 -fi - -PGDATA="$BASE_PGDATA" - -standard_initdb 'initdb' - -pg_upgrade $PG_UPGRADE_OPTS --no-sync -d "${PGDATA}.old" -D "$PGDATA" -b "$oldbindir" -p "$PGPORT" -P "$PGPORT" - -# make sure all directories and files have group permissions, on Unix hosts -# Windows hosts don't support Unix-y permissions. -case $testhost in - MINGW*|CYGWIN*) ;; - *) if [ `find "$PGDATA" -type f ! -perm 640 | wc -l` -ne 0 ]; then - echo "files in PGDATA with permission != 640"; - exit 1; - fi ;; -esac - -case $testhost in - MINGW*|CYGWIN*) ;; - *) if [ `find "$PGDATA" -type d ! -perm 750 | wc -l` -ne 0 ]; then - echo "directories in PGDATA with permission != 750"; - exit 1; - fi ;; -esac - -pg_ctl start -l "$logdir/postmaster2.log" -o "$POSTMASTER_OPTS" -w - -pg_dumpall $extra_dump_options --no-sync \ - -f "$temp_root"/dump2.sql || pg_dumpall2_status=$? -pg_ctl -m fast stop - -if [ -n "$pg_dumpall2_status" ]; then - echo "pg_dumpall of post-upgrade database cluster failed" - exit 1 -fi - -case $testhost in - MINGW*) MSYS2_ARG_CONV_EXCL=/c cmd /c delete_old_cluster.bat ;; - *) sh ./delete_old_cluster.sh ;; -esac - -if diff "$temp_root"/dump1.sql "$temp_root"/dump2.sql >/dev/null; then - echo PASSED - exit 0 -else - echo "Files $temp_root/dump1.sql and $temp_root/dump2.sql differ" - echo "dumps were not identical" - exit 1 -fi diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl index 625f6fb88a..e896820ac5 100644 --- a/src/tools/msvc/vcregress.pl +++ b/src/tools/msvc/vcregress.pl @@ -286,6 +286,10 @@ sub bincheck foreach my $dir (@bin_dirs) { next unless -d "$dir/t"; + # Do not consider pg_upgrade, as it is handled by + # upgradecheck. + next if ($dir =~ "/pg_upgrade/"); + my $status = tap_check($dir); $mstat ||= $status; } @@ -516,91 +520,9 @@ sub generate_db sub upgradecheck { - my $status; - my $cwd = getcwd(); - - # Much of this comes from the pg_upgrade test.sh script, - # but it only covers the --install case, and not the case - # where the old and new source or bin dirs are different. - # i.e. only this version to this version check. That's - # what pg_upgrade's "make check" does. - - $ENV{PGHOST} = 'localhost'; - $ENV{PGPORT} ||= 50432; - my $tmp_root = "$topdir/src/bin/pg_upgrade/tmp_check"; - rmtree($tmp_root); - mkdir $tmp_root || die $!; - my $upg_tmp_install = "$tmp_root/install"; # unshared temp install - print "Setting up temp install\n\n"; - Install($upg_tmp_install, "all", $config); - - # Install does a chdir, so change back after that - chdir $cwd; - my ($bindir, $libdir, $oldsrc, $newsrc) = - ("$upg_tmp_install/bin", "$upg_tmp_install/lib", $topdir, $topdir); - $ENV{PATH} = "$bindir;$ENV{PATH}"; - my $data = "$tmp_root/data"; - $ENV{PGDATA} = "$data.old"; - my $outputdir = "$tmp_root/regress"; - my @EXTRA_REGRESS_OPTS = ("--outputdir=$outputdir"); - mkdir "$outputdir" || die $!; - - my $logdir = "$topdir/src/bin/pg_upgrade/log"; - rmtree($logdir); - mkdir $logdir || die $!; - print "\nRunning initdb on old cluster\n\n"; - standard_initdb() or exit 1; - print "\nStarting old cluster\n\n"; - my @args = ('pg_ctl', 'start', '-l', "$logdir/postmaster1.log"); - system(@args) == 0 or exit 1; - - print "\nCreating databases with names covering most ASCII bytes\n\n"; - generate_db("\\\"\\", 1, 45, "\\\\\"\\\\\\"); - generate_db('', 46, 90, ''); - generate_db('', 91, 127, ''); - - print "\nSetting up data for upgrading\n\n"; - installcheck_internal('parallel', @EXTRA_REGRESS_OPTS); - - # now we can chdir into the source dir - chdir "$topdir/src/bin/pg_upgrade"; - print "\nDumping old cluster\n\n"; - @args = ('pg_dumpall', '-f', "$tmp_root/dump1.sql"); - system(@args) == 0 or exit 1; - print "\nStopping old cluster\n\n"; - system("pg_ctl stop") == 0 or exit 1; - $ENV{PGDATA} = "$data"; - print "\nSetting up new cluster\n\n"; - standard_initdb() or exit 1; - print "\nRunning pg_upgrade\n\n"; - @args = ( - 'pg_upgrade', '-d', "$data.old", '-D', $data, '-b', $bindir, - '--no-sync'); - system(@args) == 0 or exit 1; - print "\nStarting new cluster\n\n"; - @args = ('pg_ctl', '-l', "$logdir/postmaster2.log", 'start'); - system(@args) == 0 or exit 1; - print "\nDumping new cluster\n\n"; - @args = ('pg_dumpall', '-f', "$tmp_root/dump2.sql"); - system(@args) == 0 or exit 1; - print "\nStopping new cluster\n\n"; - system("pg_ctl stop") == 0 or exit 1; - print "\nDeleting old cluster\n\n"; - system(".\\delete_old_cluster.bat") == 0 or exit 1; - print "\nComparing old and new cluster dumps\n\n"; - - @args = ('diff', '-q', "$tmp_root/dump1.sql", "$tmp_root/dump2.sql"); - system(@args); - $status = $?; - if (!$status) - { - print "PASSED\n"; - } - else - { - print "dumps not identical!\n"; - exit(1); - } + InstallTemp(); + my $mstat = tap_check("$topdir/src/bin/pg_upgrade"); + exit $mstat if $mstat; return; } From 73db8f4d17ed4efb7709f1cafd5b1dd0285b0842 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 1 Apr 2022 12:45:40 +0900 Subject: [PATCH 338/772] Improve handling and logging of TAP tests for pg_upgrade This commit includes a set of improvements to help with the debugging of failures in these new TAP tests: - Instead of a plain diff command to compare the dumps generated, use File::Compare::compare for the same effect. diff is still used to provide more context in the event of an error. - Log the contents of regression.diffs if the pg_regress command fails. - Unify the format of the logs generated, getting inspiration from the style used in 027_stream_regress.pl. wrasse is the only buildfarm member that has reported a failure until now after the introduction of 322becb, complaining that the dumps generated do not match, and I am lacking information to understand what is going in this environment. --- src/bin/pg_upgrade/t/002_pg_upgrade.pl | 40 ++++++++++++++++++++------ 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl index 36b560bd0c..05bf161843 100644 --- a/src/bin/pg_upgrade/t/002_pg_upgrade.pl +++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl @@ -4,6 +4,7 @@ use Cwd qw(abs_path getcwd); use File::Basename qw(dirname); +use File::Compare; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -111,8 +112,18 @@ sub generate_db $inputdir ]; - $oldnode->command_ok(@regress_command, - 'regression test run on old instance'); + my $rc = run_log(@regress_command); + if ($rc != 0) + { + # Dump out the regression diffs file, if there is one + my $diffs = "$outputdir/regression.diffs"; + if (-e $diffs) + { + print "=== dumping $diffs ===\n"; + print slurp_file($diffs); + print "=== EOF ===\n"; + } + } } # Before dumping, get rid of objects not existing or not supported in later @@ -214,11 +225,9 @@ sub generate_db { foreach my $log (glob("$log_path/*")) { - note "###########################"; - note "Contents of log file $log"; - note "###########################"; - my $log_contents = slurp_file($log); - print "$log_contents\n"; + note "=== contents of $log ===\n"; + print slurp_file($log); + print "=== EOF ===\n"; } } @@ -231,7 +240,20 @@ sub generate_db ]); # Compare the two dumps, there should be no differences. -command_ok([ 'diff', '-q', "$tempdir/dump1.sql", "$tempdir/dump2.sql" ], - 'old and new dump match after pg_upgrade'); +my $compare_res = compare("$tempdir/dump1.sql", "$tempdir/dump2.sql"); +is($compare_res, 0, 'old and new dumps match after pg_upgrade'); + +# Provide more context if the dumps do not match. +if ($compare_res != 0) +{ + my ($stdout, $stderr) = + run_command([ 'diff', "$tempdir/dump1.sql", "$tempdir/dump2.sql" ]); + print "=== diff of $tempdir/dump1.sql and $tempdir/dump2.sql\n"; + print "=== stdout ===\n"; + print $stdout; + print "=== stderr ===\n"; + print $stderr; + print "=== EOF ===\n"; +} done_testing(); From d16773cdc86210493a2874cb0cf93f3883fcda73 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 1 Apr 2022 13:24:50 +0900 Subject: [PATCH 339/772] Add macros in hash and btree AMs to get the special area of their pages This makes the code more consistent with SpGiST, GiST and GIN, that already use this style, and the idea is to make easier the introduction of more sanity checks for each of these AM-specific macros. BRIN uses a different set of macros to get a page's type and flags, so it has no need for something similar. Author: Matthias van de Meent Discussion: https://postgr.es/m/CAEze2WjE3+tGO9Fs9+iZMU+z6mMZKo54W1Zt98WKqbEUHbHOBg@mail.gmail.com --- contrib/amcheck/verify_nbtree.c | 32 +++++++------- contrib/pageinspect/btreefuncs.c | 6 +-- contrib/pageinspect/hashfuncs.c | 6 +-- contrib/pgstattuple/pgstatindex.c | 4 +- contrib/pgstattuple/pgstattuple.c | 4 +- src/backend/access/hash/hash.c | 6 +-- src/backend/access/hash/hash_xlog.c | 26 +++++------ src/backend/access/hash/hashinsert.c | 6 +-- src/backend/access/hash/hashovfl.c | 22 +++++----- src/backend/access/hash/hashpage.c | 30 ++++++------- src/backend/access/hash/hashsearch.c | 12 ++--- src/backend/access/hash/hashutil.c | 4 +- src/backend/access/nbtree/nbtdedup.c | 6 +-- src/backend/access/nbtree/nbtinsert.c | 46 ++++++++++---------- src/backend/access/nbtree/nbtpage.c | 58 ++++++++++++------------- src/backend/access/nbtree/nbtree.c | 2 +- src/backend/access/nbtree/nbtsearch.c | 34 +++++++-------- src/backend/access/nbtree/nbtsort.c | 12 ++--- src/backend/access/nbtree/nbtsplitloc.c | 2 +- src/backend/access/nbtree/nbtutils.c | 6 +-- src/backend/access/nbtree/nbtxlog.c | 34 +++++++-------- src/include/access/hash.h | 2 + src/include/access/nbtree.h | 8 ++-- 23 files changed, 186 insertions(+), 182 deletions(-) diff --git a/contrib/amcheck/verify_nbtree.c b/contrib/amcheck/verify_nbtree.c index d2510ee648..70278c4f93 100644 --- a/contrib/amcheck/verify_nbtree.c +++ b/contrib/amcheck/verify_nbtree.c @@ -691,7 +691,7 @@ bt_check_level_from_leftmost(BtreeCheckState *state, BtreeLevel level) state->target = palloc_btree_page(state, state->targetblock); state->targetlsn = PageGetLSN(state->target); - opaque = (BTPageOpaque) PageGetSpecialPointer(state->target); + opaque = BTPageGetOpaque(state->target); if (P_IGNORE(opaque)) { @@ -927,7 +927,7 @@ bt_recheck_sibling_links(BtreeCheckState *state, LockBuffer(lbuf, BT_READ); _bt_checkpage(state->rel, lbuf); page = BufferGetPage(lbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (P_ISDELETED(opaque)) { /* @@ -951,7 +951,7 @@ bt_recheck_sibling_links(BtreeCheckState *state, LockBuffer(newtargetbuf, BT_READ); _bt_checkpage(state->rel, newtargetbuf); page = BufferGetPage(newtargetbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* btpo_prev_from_target may have changed; update it */ btpo_prev_from_target = opaque->btpo_prev; } @@ -1049,7 +1049,7 @@ bt_target_page_check(BtreeCheckState *state) OffsetNumber max; BTPageOpaque topaque; - topaque = (BTPageOpaque) PageGetSpecialPointer(state->target); + topaque = BTPageGetOpaque(state->target); max = PageGetMaxOffsetNumber(state->target); elog(DEBUG2, "verifying %u items on %s block %u", max, @@ -1478,7 +1478,7 @@ bt_target_page_check(BtreeCheckState *state) /* Get fresh copy of target page */ state->target = palloc_btree_page(state, state->targetblock); /* Note that we deliberately do not update target LSN */ - topaque = (BTPageOpaque) PageGetSpecialPointer(state->target); + topaque = BTPageGetOpaque(state->target); /* * All !readonly checks now performed; just return @@ -1552,7 +1552,7 @@ bt_right_page_check_scankey(BtreeCheckState *state) OffsetNumber nline; /* Determine target's next block number */ - opaque = (BTPageOpaque) PageGetSpecialPointer(state->target); + opaque = BTPageGetOpaque(state->target); /* If target is already rightmost, no right sibling; nothing to do here */ if (P_RIGHTMOST(opaque)) @@ -1588,7 +1588,7 @@ bt_right_page_check_scankey(BtreeCheckState *state) CHECK_FOR_INTERRUPTS(); rightpage = palloc_btree_page(state, targetnext); - opaque = (BTPageOpaque) PageGetSpecialPointer(rightpage); + opaque = BTPageGetOpaque(rightpage); if (!P_IGNORE(opaque) || P_RIGHTMOST(opaque)) break; @@ -1893,7 +1893,7 @@ bt_child_highkey_check(BtreeCheckState *state, else page = palloc_btree_page(state, blkno); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* The first page we visit at the level should be leftmost */ if (first && !BlockNumberIsValid(state->prevrightlink) && !P_LEFTMOST(opaque)) @@ -1971,7 +1971,7 @@ bt_child_highkey_check(BtreeCheckState *state, else pivotkey_offset = target_downlinkoffnum; - topaque = (BTPageOpaque) PageGetSpecialPointer(state->target); + topaque = BTPageGetOpaque(state->target); if (!offset_is_negative_infinity(topaque, pivotkey_offset)) { @@ -2128,9 +2128,9 @@ bt_child_check(BtreeCheckState *state, BTScanInsert targetkey, * Check all items, rather than checking just the first and trusting that * the operator class obeys the transitive law. */ - topaque = (BTPageOpaque) PageGetSpecialPointer(state->target); + topaque = BTPageGetOpaque(state->target); child = palloc_btree_page(state, childblock); - copaque = (BTPageOpaque) PageGetSpecialPointer(child); + copaque = BTPageGetOpaque(child); maxoffset = PageGetMaxOffsetNumber(child); /* @@ -2235,7 +2235,7 @@ static void bt_downlink_missing_check(BtreeCheckState *state, bool rightsplit, BlockNumber blkno, Page page) { - BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); + BTPageOpaque opaque = BTPageGetOpaque(page); ItemId itemid; IndexTuple itup; Page child; @@ -2319,7 +2319,7 @@ bt_downlink_missing_check(BtreeCheckState *state, bool rightsplit, CHECK_FOR_INTERRUPTS(); child = palloc_btree_page(state, childblk); - copaque = (BTPageOpaque) PageGetSpecialPointer(child); + copaque = BTPageGetOpaque(child); if (P_ISLEAF(copaque)) break; @@ -2780,7 +2780,7 @@ invariant_l_offset(BtreeCheckState *state, BTScanInsert key, bool nonpivot; ritup = (IndexTuple) PageGetItem(state->target, itemid); - topaque = (BTPageOpaque) PageGetSpecialPointer(state->target); + topaque = BTPageGetOpaque(state->target); nonpivot = P_ISLEAF(topaque) && upperbound >= P_FIRSTDATAKEY(topaque); /* Get number of keys + heap TID for item to the right */ @@ -2895,7 +2895,7 @@ invariant_l_nontarget_offset(BtreeCheckState *state, BTScanInsert key, bool nonpivot; child = (IndexTuple) PageGetItem(nontarget, itemid); - copaque = (BTPageOpaque) PageGetSpecialPointer(nontarget); + copaque = BTPageGetOpaque(nontarget); nonpivot = P_ISLEAF(copaque) && upperbound >= P_FIRSTDATAKEY(copaque); /* Get number of keys + heap TID for child/non-target item */ @@ -2954,7 +2954,7 @@ palloc_btree_page(BtreeCheckState *state, BlockNumber blocknum) memcpy(page, BufferGetPage(buffer), BLCKSZ); UnlockReleaseBuffer(buffer); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (P_ISMETA(opaque) && blocknum != BTREE_METAPAGE) ereport(ERROR, diff --git a/contrib/pageinspect/btreefuncs.c b/contrib/pageinspect/btreefuncs.c index 7651c59bbf..3daa31c84d 100644 --- a/contrib/pageinspect/btreefuncs.c +++ b/contrib/pageinspect/btreefuncs.c @@ -93,7 +93,7 @@ GetBTPageStatistics(BlockNumber blkno, Buffer buffer, BTPageStat *stat) Page page = BufferGetPage(buffer); PageHeader phdr = (PageHeader) page; OffsetNumber maxoff = PageGetMaxOffsetNumber(page); - BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); + BTPageOpaque opaque = BTPageGetOpaque(page); int item_size = 0; int off; @@ -525,7 +525,7 @@ bt_page_items_internal(PG_FUNCTION_ARGS, enum pageinspect_version ext_version) uargs->offset = FirstOffsetNumber; - opaque = (BTPageOpaque) PageGetSpecialPointer(uargs->page); + opaque = BTPageGetOpaque(uargs->page); if (!P_ISDELETED(opaque)) fctx->max_calls = PageGetMaxOffsetNumber(uargs->page); @@ -622,7 +622,7 @@ bt_page_items_bytea(PG_FUNCTION_ARGS) (int) MAXALIGN(sizeof(BTPageOpaqueData)), (int) PageGetSpecialSize(uargs->page)))); - opaque = (BTPageOpaque) PageGetSpecialPointer(uargs->page); + opaque = BTPageGetOpaque(uargs->page); if (P_ISMETA(opaque)) ereport(ERROR, diff --git a/contrib/pageinspect/hashfuncs.c b/contrib/pageinspect/hashfuncs.c index 6de21d6608..69af7b962f 100644 --- a/contrib/pageinspect/hashfuncs.c +++ b/contrib/pageinspect/hashfuncs.c @@ -72,7 +72,7 @@ verify_hash_page(bytea *raw_page, int flags) (int) MAXALIGN(sizeof(HashPageOpaqueData)), (int) PageGetSpecialSize(page)))); - pageopaque = (HashPageOpaque) PageGetSpecialPointer(page); + pageopaque = HashPageGetOpaque(page); if (pageopaque->hasho_page_id != HASHO_PAGE_ID) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -154,7 +154,7 @@ static void GetHashPageStatistics(Page page, HashPageStat *stat) { OffsetNumber maxoff = PageGetMaxOffsetNumber(page); - HashPageOpaque opaque = (HashPageOpaque) PageGetSpecialPointer(page); + HashPageOpaque opaque = HashPageGetOpaque(page); int off; stat->dead_items = stat->live_items = 0; @@ -206,7 +206,7 @@ hash_page_type(PG_FUNCTION_ARGS) type = "unused"; else { - opaque = (HashPageOpaque) PageGetSpecialPointer(page); + opaque = HashPageGetOpaque(page); /* page type (flags) */ pagetype = opaque->hasho_flag & LH_PAGE_TYPE; diff --git a/contrib/pgstattuple/pgstatindex.c b/contrib/pgstattuple/pgstatindex.c index 6c4b053dd0..e1048e47ff 100644 --- a/contrib/pgstattuple/pgstatindex.c +++ b/contrib/pgstattuple/pgstatindex.c @@ -281,7 +281,7 @@ pgstatindex_impl(Relation rel, FunctionCallInfo fcinfo) LockBuffer(buffer, BUFFER_LOCK_SHARE); page = BufferGetPage(buffer); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* * Determine page type, and update totals. @@ -641,7 +641,7 @@ pgstathashindex(PG_FUNCTION_ARGS) HashPageOpaque opaque; int pagetype; - opaque = (HashPageOpaque) PageGetSpecialPointer(page); + opaque = HashPageGetOpaque(page); pagetype = opaque->hasho_flag & LH_PAGE_TYPE; if (pagetype == LH_BUCKET_PAGE) diff --git a/contrib/pgstattuple/pgstattuple.c b/contrib/pgstattuple/pgstattuple.c index c9b8f01f9b..3094566908 100644 --- a/contrib/pgstattuple/pgstattuple.c +++ b/contrib/pgstattuple/pgstattuple.c @@ -415,7 +415,7 @@ pgstat_btree_page(pgstattuple_type *stat, Relation rel, BlockNumber blkno, { BTPageOpaque opaque; - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (P_IGNORE(opaque)) { /* deleted or half-dead page */ @@ -452,7 +452,7 @@ pgstat_hash_page(pgstattuple_type *stat, Relation rel, BlockNumber blkno, { HashPageOpaque opaque; - opaque = (HashPageOpaque) PageGetSpecialPointer(page); + opaque = HashPageGetOpaque(page); switch (opaque->hasho_flag & LH_PAGE_TYPE) { case LH_UNUSED_PAGE: diff --git a/src/backend/access/hash/hash.c b/src/backend/access/hash/hash.c index a259a301fa..fd1a7119b6 100644 --- a/src/backend/access/hash/hash.c +++ b/src/backend/access/hash/hash.c @@ -515,7 +515,7 @@ hashbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, _hash_checkpage(rel, buf, LH_BUCKET_PAGE); page = BufferGetPage(buf); - bucket_opaque = (HashPageOpaque) PageGetSpecialPointer(page); + bucket_opaque = HashPageGetOpaque(page); /* * If the bucket contains tuples that are moved by split, then we need @@ -717,7 +717,7 @@ hashbucketcleanup(Relation rel, Bucket cur_bucket, Buffer bucket_buf, vacuum_delay_point(); page = BufferGetPage(buf); - opaque = (HashPageOpaque) PageGetSpecialPointer(page); + opaque = HashPageGetOpaque(page); /* Scan each tuple in page */ maxoffno = PageGetMaxOffsetNumber(page); @@ -884,7 +884,7 @@ hashbucketcleanup(Relation rel, Bucket cur_bucket, Buffer bucket_buf, Page page; page = BufferGetPage(bucket_buf); - bucket_opaque = (HashPageOpaque) PageGetSpecialPointer(page); + bucket_opaque = HashPageGetOpaque(page); /* No ereport(ERROR) until changes are logged */ START_CRIT_SECTION(); diff --git a/src/backend/access/hash/hash_xlog.c b/src/backend/access/hash/hash_xlog.c index 55937b9a68..62dbfc3a5d 100644 --- a/src/backend/access/hash/hash_xlog.c +++ b/src/backend/access/hash/hash_xlog.c @@ -203,7 +203,7 @@ hash_xlog_add_ovfl_page(XLogReaderState *record) true); /* update backlink */ ovflpage = BufferGetPage(ovflbuf); - ovflopaque = (HashPageOpaque) PageGetSpecialPointer(ovflpage); + ovflopaque = HashPageGetOpaque(ovflpage); ovflopaque->hasho_prevblkno = leftblk; PageSetLSN(ovflpage, lsn); @@ -215,7 +215,7 @@ hash_xlog_add_ovfl_page(XLogReaderState *record) HashPageOpaque leftopaque; leftpage = BufferGetPage(leftbuf); - leftopaque = (HashPageOpaque) PageGetSpecialPointer(leftpage); + leftopaque = HashPageGetOpaque(leftpage); leftopaque->hasho_nextblkno = rightblk; PageSetLSN(leftpage, lsn); @@ -342,7 +342,7 @@ hash_xlog_split_allocate_page(XLogReaderState *record) HashPageOpaque oldopaque; oldpage = BufferGetPage(oldbuf); - oldopaque = (HashPageOpaque) PageGetSpecialPointer(oldpage); + oldopaque = HashPageGetOpaque(oldpage); oldopaque->hasho_flag = xlrec->old_bucket_flag; oldopaque->hasho_prevblkno = xlrec->new_bucket; @@ -465,7 +465,7 @@ hash_xlog_split_complete(XLogReaderState *record) HashPageOpaque oldopaque; oldpage = BufferGetPage(oldbuf); - oldopaque = (HashPageOpaque) PageGetSpecialPointer(oldpage); + oldopaque = HashPageGetOpaque(oldpage); oldopaque->hasho_flag = xlrec->old_bucket_flag; @@ -488,7 +488,7 @@ hash_xlog_split_complete(XLogReaderState *record) HashPageOpaque nopaque; newpage = BufferGetPage(newbuf); - nopaque = (HashPageOpaque) PageGetSpecialPointer(newpage); + nopaque = HashPageGetOpaque(newpage); nopaque->hasho_flag = xlrec->new_bucket_flag; @@ -710,7 +710,7 @@ hash_xlog_squeeze_page(XLogReaderState *record) */ if (xldata->is_prev_bucket_same_wrt) { - HashPageOpaque writeopaque = (HashPageOpaque) PageGetSpecialPointer(writepage); + HashPageOpaque writeopaque = HashPageGetOpaque(writepage); writeopaque->hasho_nextblkno = xldata->nextblkno; } @@ -729,7 +729,7 @@ hash_xlog_squeeze_page(XLogReaderState *record) _hash_pageinit(ovflpage, BufferGetPageSize(ovflbuf)); - ovflopaque = (HashPageOpaque) PageGetSpecialPointer(ovflpage); + ovflopaque = HashPageGetOpaque(ovflpage); ovflopaque->hasho_prevblkno = InvalidBlockNumber; ovflopaque->hasho_nextblkno = InvalidBlockNumber; @@ -748,7 +748,7 @@ hash_xlog_squeeze_page(XLogReaderState *record) XLogReadBufferForRedo(record, 3, &prevbuf) == BLK_NEEDS_REDO) { Page prevpage = BufferGetPage(prevbuf); - HashPageOpaque prevopaque = (HashPageOpaque) PageGetSpecialPointer(prevpage); + HashPageOpaque prevopaque = HashPageGetOpaque(prevpage); prevopaque->hasho_nextblkno = xldata->nextblkno; @@ -766,7 +766,7 @@ hash_xlog_squeeze_page(XLogReaderState *record) if (XLogReadBufferForRedo(record, 4, &nextbuf) == BLK_NEEDS_REDO) { Page nextpage = BufferGetPage(nextbuf); - HashPageOpaque nextopaque = (HashPageOpaque) PageGetSpecialPointer(nextpage); + HashPageOpaque nextopaque = HashPageGetOpaque(nextpage); nextopaque->hasho_prevblkno = xldata->prevblkno; @@ -903,7 +903,7 @@ hash_xlog_delete(XLogReaderState *record) { HashPageOpaque pageopaque; - pageopaque = (HashPageOpaque) PageGetSpecialPointer(page); + pageopaque = HashPageGetOpaque(page); pageopaque->hasho_flag &= ~LH_PAGE_HAS_DEAD_TUPLES; } @@ -933,7 +933,7 @@ hash_xlog_split_cleanup(XLogReaderState *record) page = (Page) BufferGetPage(buffer); - bucket_opaque = (HashPageOpaque) PageGetSpecialPointer(page); + bucket_opaque = HashPageGetOpaque(page); bucket_opaque->hasho_flag &= ~LH_BUCKET_NEEDS_SPLIT_CLEANUP; PageSetLSN(page, lsn); MarkBufferDirty(buffer); @@ -1024,7 +1024,7 @@ hash_xlog_vacuum_one_page(XLogReaderState *record) * Mark the page as not containing any LP_DEAD items. See comments in * _hash_vacuum_one_page() for details. */ - pageopaque = (HashPageOpaque) PageGetSpecialPointer(page); + pageopaque = HashPageGetOpaque(page); pageopaque->hasho_flag &= ~LH_PAGE_HAS_DEAD_TUPLES; PageSetLSN(page, lsn); @@ -1116,7 +1116,7 @@ hash_mask(char *pagedata, BlockNumber blkno) mask_page_hint_bits(page); mask_unused_space(page); - opaque = (HashPageOpaque) PageGetSpecialPointer(page); + opaque = HashPageGetOpaque(page); pagetype = opaque->hasho_flag & LH_PAGE_TYPE; if (pagetype == LH_UNUSED_PAGE) diff --git a/src/backend/access/hash/hashinsert.c b/src/backend/access/hash/hashinsert.c index faf609c157..4f2fecb908 100644 --- a/src/backend/access/hash/hashinsert.c +++ b/src/backend/access/hash/hashinsert.c @@ -95,7 +95,7 @@ _hash_doinsert(Relation rel, IndexTuple itup, Relation heapRel) bucket_buf = buf; page = BufferGetPage(buf); - pageopaque = (HashPageOpaque) PageGetSpecialPointer(page); + pageopaque = HashPageGetOpaque(page); bucket = pageopaque->hasho_bucket; /* @@ -183,7 +183,7 @@ _hash_doinsert(Relation rel, IndexTuple itup, Relation heapRel) /* should fit now, given test above */ Assert(PageGetFreeSpace(page) >= itemsz); } - pageopaque = (HashPageOpaque) PageGetSpecialPointer(page); + pageopaque = HashPageGetOpaque(page); Assert((pageopaque->hasho_flag & LH_PAGE_TYPE) == LH_OVERFLOW_PAGE); Assert(pageopaque->hasho_bucket == bucket); } @@ -384,7 +384,7 @@ _hash_vacuum_one_page(Relation rel, Relation hrel, Buffer metabuf, Buffer buf) * check it. Remember that LH_PAGE_HAS_DEAD_TUPLES is only a hint * anyway. */ - pageopaque = (HashPageOpaque) PageGetSpecialPointer(page); + pageopaque = HashPageGetOpaque(page); pageopaque->hasho_flag &= ~LH_PAGE_HAS_DEAD_TUPLES; metap = HashPageGetMeta(BufferGetPage(metabuf)); diff --git a/src/backend/access/hash/hashovfl.c b/src/backend/access/hash/hashovfl.c index 4836875196..e34cfc302d 100644 --- a/src/backend/access/hash/hashovfl.c +++ b/src/backend/access/hash/hashovfl.c @@ -159,7 +159,7 @@ _hash_addovflpage(Relation rel, Buffer metabuf, Buffer buf, bool retain_pin) BlockNumber nextblkno; page = BufferGetPage(buf); - pageopaque = (HashPageOpaque) PageGetSpecialPointer(page); + pageopaque = HashPageGetOpaque(page); nextblkno = pageopaque->hasho_nextblkno; if (!BlockNumberIsValid(nextblkno)) @@ -364,7 +364,7 @@ _hash_addovflpage(Relation rel, Buffer metabuf, Buffer buf, bool retain_pin) /* initialize new overflow page */ ovflpage = BufferGetPage(ovflbuf); - ovflopaque = (HashPageOpaque) PageGetSpecialPointer(ovflpage); + ovflopaque = HashPageGetOpaque(ovflpage); ovflopaque->hasho_prevblkno = BufferGetBlockNumber(buf); ovflopaque->hasho_nextblkno = InvalidBlockNumber; ovflopaque->hasho_bucket = pageopaque->hasho_bucket; @@ -516,7 +516,7 @@ _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf, _hash_checkpage(rel, ovflbuf, LH_OVERFLOW_PAGE); ovflblkno = BufferGetBlockNumber(ovflbuf); ovflpage = BufferGetPage(ovflbuf); - ovflopaque = (HashPageOpaque) PageGetSpecialPointer(ovflpage); + ovflopaque = HashPageGetOpaque(ovflpage); nextblkno = ovflopaque->hasho_nextblkno; prevblkno = ovflopaque->hasho_prevblkno; writeblkno = BufferGetBlockNumber(wbuf); @@ -600,7 +600,7 @@ _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf, */ _hash_pageinit(ovflpage, BufferGetPageSize(ovflbuf)); - ovflopaque = (HashPageOpaque) PageGetSpecialPointer(ovflpage); + ovflopaque = HashPageGetOpaque(ovflpage); ovflopaque->hasho_prevblkno = InvalidBlockNumber; ovflopaque->hasho_nextblkno = InvalidBlockNumber; @@ -613,7 +613,7 @@ _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf, if (BufferIsValid(prevbuf)) { Page prevpage = BufferGetPage(prevbuf); - HashPageOpaque prevopaque = (HashPageOpaque) PageGetSpecialPointer(prevpage); + HashPageOpaque prevopaque = HashPageGetOpaque(prevpage); Assert(prevopaque->hasho_bucket == bucket); prevopaque->hasho_nextblkno = nextblkno; @@ -622,7 +622,7 @@ _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf, if (BufferIsValid(nextbuf)) { Page nextpage = BufferGetPage(nextbuf); - HashPageOpaque nextopaque = (HashPageOpaque) PageGetSpecialPointer(nextpage); + HashPageOpaque nextopaque = HashPageGetOpaque(nextpage); Assert(nextopaque->hasho_bucket == bucket); nextopaque->hasho_prevblkno = prevblkno; @@ -751,7 +751,7 @@ _hash_initbitmapbuffer(Buffer buf, uint16 bmsize, bool initpage) _hash_pageinit(pg, BufferGetPageSize(buf)); /* initialize the page's special space */ - op = (HashPageOpaque) PageGetSpecialPointer(pg); + op = HashPageGetOpaque(pg); op->hasho_prevblkno = InvalidBlockNumber; op->hasho_nextblkno = InvalidBlockNumber; op->hasho_bucket = InvalidBucket; @@ -824,7 +824,7 @@ _hash_squeezebucket(Relation rel, wblkno = bucket_blkno; wbuf = bucket_buf; wpage = BufferGetPage(wbuf); - wopaque = (HashPageOpaque) PageGetSpecialPointer(wpage); + wopaque = HashPageGetOpaque(wpage); /* * if there aren't any overflow pages, there's nothing to squeeze. caller @@ -855,7 +855,7 @@ _hash_squeezebucket(Relation rel, LH_OVERFLOW_PAGE, bstrategy); rpage = BufferGetPage(rbuf); - ropaque = (HashPageOpaque) PageGetSpecialPointer(rpage); + ropaque = HashPageGetOpaque(rpage); Assert(ropaque->hasho_bucket == bucket); } while (BlockNumberIsValid(ropaque->hasho_nextblkno)); @@ -1005,7 +1005,7 @@ _hash_squeezebucket(Relation rel, wbuf = next_wbuf; wpage = BufferGetPage(wbuf); - wopaque = (HashPageOpaque) PageGetSpecialPointer(wpage); + wopaque = HashPageGetOpaque(wpage); Assert(wopaque->hasho_bucket == bucket); retain_pin = false; @@ -1076,7 +1076,7 @@ _hash_squeezebucket(Relation rel, LH_OVERFLOW_PAGE, bstrategy); rpage = BufferGetPage(rbuf); - ropaque = (HashPageOpaque) PageGetSpecialPointer(rpage); + ropaque = HashPageGetOpaque(rpage); Assert(ropaque->hasho_bucket == bucket); } diff --git a/src/backend/access/hash/hashpage.c b/src/backend/access/hash/hashpage.c index 28c5297a1d..39206d1942 100644 --- a/src/backend/access/hash/hashpage.c +++ b/src/backend/access/hash/hashpage.c @@ -166,7 +166,7 @@ _hash_initbuf(Buffer buf, uint32 max_bucket, uint32 num_bucket, uint32 flag, if (initpage) _hash_pageinit(page, BufferGetPageSize(buf)); - pageopaque = (HashPageOpaque) PageGetSpecialPointer(page); + pageopaque = HashPageGetOpaque(page); /* * Set hasho_prevblkno with current hashm_maxbucket. This value will be @@ -529,7 +529,7 @@ _hash_init_metabuffer(Buffer buf, double num_tuples, RegProcedure procid, if (initpage) _hash_pageinit(page, BufferGetPageSize(buf)); - pageopaque = (HashPageOpaque) PageGetSpecialPointer(page); + pageopaque = HashPageGetOpaque(page); pageopaque->hasho_prevblkno = InvalidBlockNumber; pageopaque->hasho_nextblkno = InvalidBlockNumber; pageopaque->hasho_bucket = InvalidBucket; @@ -693,7 +693,7 @@ _hash_expandtable(Relation rel, Buffer metabuf) goto fail; opage = BufferGetPage(buf_oblkno); - oopaque = (HashPageOpaque) PageGetSpecialPointer(opage); + oopaque = HashPageGetOpaque(opage); /* * We want to finish the split from a bucket as there is no apparent @@ -864,7 +864,7 @@ _hash_expandtable(Relation rel, Buffer metabuf) lowmask = metap->hashm_lowmask; opage = BufferGetPage(buf_oblkno); - oopaque = (HashPageOpaque) PageGetSpecialPointer(opage); + oopaque = HashPageGetOpaque(opage); /* * Mark the old bucket to indicate that split is in progress. (At @@ -883,7 +883,7 @@ _hash_expandtable(Relation rel, Buffer metabuf) * initialize the new bucket's primary page and mark it to indicate that * split is in progress. */ - nopaque = (HashPageOpaque) PageGetSpecialPointer(npage); + nopaque = HashPageGetOpaque(npage); nopaque->hasho_prevblkno = maxbucket; nopaque->hasho_nextblkno = InvalidBlockNumber; nopaque->hasho_bucket = new_bucket; @@ -1010,7 +1010,7 @@ _hash_alloc_buckets(Relation rel, BlockNumber firstblock, uint32 nblocks) */ _hash_pageinit(page, BLCKSZ); - ovflopaque = (HashPageOpaque) PageGetSpecialPointer(page); + ovflopaque = HashPageGetOpaque(page); ovflopaque->hasho_prevblkno = InvalidBlockNumber; ovflopaque->hasho_nextblkno = InvalidBlockNumber; @@ -1091,11 +1091,11 @@ _hash_splitbucket(Relation rel, bucket_obuf = obuf; opage = BufferGetPage(obuf); - oopaque = (HashPageOpaque) PageGetSpecialPointer(opage); + oopaque = HashPageGetOpaque(opage); bucket_nbuf = nbuf; npage = BufferGetPage(nbuf); - nopaque = (HashPageOpaque) PageGetSpecialPointer(npage); + nopaque = HashPageGetOpaque(npage); /* Copy the predicate locks from old bucket to new bucket. */ PredicateLockPageSplit(rel, @@ -1198,7 +1198,7 @@ _hash_splitbucket(Relation rel, /* chain to a new overflow page */ nbuf = _hash_addovflpage(rel, metabuf, nbuf, (nbuf == bucket_nbuf)); npage = BufferGetPage(nbuf); - nopaque = (HashPageOpaque) PageGetSpecialPointer(npage); + nopaque = HashPageGetOpaque(npage); } itups[nitups++] = new_itup; @@ -1251,7 +1251,7 @@ _hash_splitbucket(Relation rel, /* Else, advance to next old page */ obuf = _hash_getbuf(rel, oblkno, HASH_READ, LH_OVERFLOW_PAGE); opage = BufferGetPage(obuf); - oopaque = (HashPageOpaque) PageGetSpecialPointer(opage); + oopaque = HashPageGetOpaque(opage); } /* @@ -1264,11 +1264,11 @@ _hash_splitbucket(Relation rel, */ LockBuffer(bucket_obuf, BUFFER_LOCK_EXCLUSIVE); opage = BufferGetPage(bucket_obuf); - oopaque = (HashPageOpaque) PageGetSpecialPointer(opage); + oopaque = HashPageGetOpaque(opage); LockBuffer(bucket_nbuf, BUFFER_LOCK_EXCLUSIVE); npage = BufferGetPage(bucket_nbuf); - nopaque = (HashPageOpaque) PageGetSpecialPointer(npage); + nopaque = HashPageGetOpaque(npage); START_CRIT_SECTION(); @@ -1392,7 +1392,7 @@ _hash_finish_split(Relation rel, Buffer metabuf, Buffer obuf, Bucket obucket, bucket_nbuf = nbuf; npage = BufferGetPage(nbuf); - npageopaque = (HashPageOpaque) PageGetSpecialPointer(npage); + npageopaque = HashPageGetOpaque(npage); /* Scan each tuple in new page */ nmaxoffnum = PageGetMaxOffsetNumber(npage); @@ -1446,7 +1446,7 @@ _hash_finish_split(Relation rel, Buffer metabuf, Buffer obuf, Bucket obucket, } npage = BufferGetPage(bucket_nbuf); - npageopaque = (HashPageOpaque) PageGetSpecialPointer(npage); + npageopaque = HashPageGetOpaque(npage); nbucket = npageopaque->hasho_bucket; _hash_splitbucket(rel, metabuf, obucket, @@ -1587,7 +1587,7 @@ _hash_getbucketbuf_from_hashkey(Relation rel, uint32 hashkey, int access, /* Fetch the primary bucket page for the bucket */ buf = _hash_getbuf(rel, blkno, access, LH_BUCKET_PAGE); page = BufferGetPage(buf); - opaque = (HashPageOpaque) PageGetSpecialPointer(page); + opaque = HashPageGetOpaque(page); Assert(opaque->hasho_bucket == bucket); Assert(opaque->hasho_prevblkno != InvalidBlockNumber); diff --git a/src/backend/access/hash/hashsearch.c b/src/backend/access/hash/hashsearch.c index 7ca542a3fb..524af27409 100644 --- a/src/backend/access/hash/hashsearch.c +++ b/src/backend/access/hash/hashsearch.c @@ -187,7 +187,7 @@ _hash_readnext(IndexScanDesc scan, { *pagep = BufferGetPage(*bufp); TestForOldSnapshot(scan->xs_snapshot, rel, *pagep); - *opaquep = (HashPageOpaque) PageGetSpecialPointer(*pagep); + *opaquep = HashPageGetOpaque(*pagep); } } @@ -233,7 +233,7 @@ _hash_readprev(IndexScanDesc scan, LH_BUCKET_PAGE | LH_OVERFLOW_PAGE); *pagep = BufferGetPage(*bufp); TestForOldSnapshot(scan->xs_snapshot, rel, *pagep); - *opaquep = (HashPageOpaque) PageGetSpecialPointer(*pagep); + *opaquep = HashPageGetOpaque(*pagep); /* * We always maintain the pin on bucket page for whole scan operation, @@ -258,7 +258,7 @@ _hash_readprev(IndexScanDesc scan, LockBuffer(*bufp, BUFFER_LOCK_SHARE); *pagep = BufferGetPage(*bufp); - *opaquep = (HashPageOpaque) PageGetSpecialPointer(*pagep); + *opaquep = HashPageGetOpaque(*pagep); /* move to the end of bucket chain */ while (BlockNumberIsValid((*opaquep)->hasho_nextblkno)) @@ -352,7 +352,7 @@ _hash_first(IndexScanDesc scan, ScanDirection dir) PredicateLockPage(rel, BufferGetBlockNumber(buf), scan->xs_snapshot); page = BufferGetPage(buf); TestForOldSnapshot(scan->xs_snapshot, rel, page); - opaque = (HashPageOpaque) PageGetSpecialPointer(page); + opaque = HashPageGetOpaque(page); bucket = opaque->hasho_bucket; so->hashso_bucket_buf = buf; @@ -398,7 +398,7 @@ _hash_first(IndexScanDesc scan, ScanDirection dir) LockBuffer(buf, BUFFER_LOCK_SHARE); page = BufferGetPage(buf); - opaque = (HashPageOpaque) PageGetSpecialPointer(page); + opaque = HashPageGetOpaque(page); Assert(opaque->hasho_bucket == bucket); if (H_BUCKET_BEING_POPULATED(opaque)) @@ -463,7 +463,7 @@ _hash_readpage(IndexScanDesc scan, Buffer *bufP, ScanDirection dir) Assert(BufferIsValid(buf)); _hash_checkpage(rel, buf, LH_BUCKET_PAGE | LH_OVERFLOW_PAGE); page = BufferGetPage(buf); - opaque = (HashPageOpaque) PageGetSpecialPointer(page); + opaque = HashPageGetOpaque(page); so->currPos.buf = buf; so->currPos.currPage = BufferGetBlockNumber(buf); diff --git a/src/backend/access/hash/hashutil.c b/src/backend/access/hash/hashutil.c index edb6fa968f..fe37bc47cb 100644 --- a/src/backend/access/hash/hashutil.c +++ b/src/backend/access/hash/hashutil.c @@ -239,7 +239,7 @@ _hash_checkpage(Relation rel, Buffer buf, int flags) if (flags) { - HashPageOpaque opaque = (HashPageOpaque) PageGetSpecialPointer(page); + HashPageOpaque opaque = HashPageGetOpaque(page); if ((opaque->hasho_flag & flags) == 0) ereport(ERROR, @@ -574,7 +574,7 @@ _hash_kill_items(IndexScanDesc scan) buf = _hash_getbuf(rel, blkno, HASH_READ, LH_OVERFLOW_PAGE); page = BufferGetPage(buf); - opaque = (HashPageOpaque) PageGetSpecialPointer(page); + opaque = HashPageGetOpaque(page); maxoff = PageGetMaxOffsetNumber(page); for (i = 0; i < numKilled; i++) diff --git a/src/backend/access/nbtree/nbtdedup.c b/src/backend/access/nbtree/nbtdedup.c index 4c48554aec..3e11805293 100644 --- a/src/backend/access/nbtree/nbtdedup.c +++ b/src/backend/access/nbtree/nbtdedup.c @@ -62,7 +62,7 @@ _bt_dedup_pass(Relation rel, Buffer buf, Relation heapRel, IndexTuple newitem, minoff, maxoff; Page page = BufferGetPage(buf); - BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); + BTPageOpaque opaque = BTPageGetOpaque(page); Page newpage; BTDedupState state; Size pagesaving = 0; @@ -231,7 +231,7 @@ _bt_dedup_pass(Relation rel, Buffer buf, Relation heapRel, IndexTuple newitem, */ if (P_HAS_GARBAGE(opaque)) { - BTPageOpaque nopaque = (BTPageOpaque) PageGetSpecialPointer(newpage); + BTPageOpaque nopaque = BTPageGetOpaque(newpage); nopaque->btpo_flags &= ~BTP_HAS_GARBAGE; } @@ -310,7 +310,7 @@ _bt_bottomupdel_pass(Relation rel, Buffer buf, Relation heapRel, minoff, maxoff; Page page = BufferGetPage(buf); - BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); + BTPageOpaque opaque = BTPageGetOpaque(page); BTDedupState state; TM_IndexDeleteOp delstate; bool neverdedup; diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c index 68628ec000..f6f4af8bfe 100644 --- a/src/backend/access/nbtree/nbtinsert.c +++ b/src/backend/access/nbtree/nbtinsert.c @@ -329,7 +329,7 @@ _bt_search_insert(Relation rel, BTInsertState insertstate) _bt_checkpage(rel, insertstate->buf); page = BufferGetPage(insertstate->buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* * Check if the page is still the rightmost leaf page and has @@ -428,7 +428,7 @@ _bt_check_unique(Relation rel, BTInsertState insertstate, Relation heapRel, InitDirtySnapshot(SnapshotDirty); page = BufferGetPage(insertstate->buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); maxoff = PageGetMaxOffsetNumber(page); /* @@ -733,7 +733,7 @@ _bt_check_unique(Relation rel, BTInsertState insertstate, Relation heapRel, nbuf = _bt_relandgetbuf(rel, nbuf, nblkno, BT_READ); page = BufferGetPage(nbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (!P_IGNORE(opaque)) break; if (P_RIGHTMOST(opaque)) @@ -822,7 +822,7 @@ _bt_findinsertloc(Relation rel, BTPageOpaque opaque; OffsetNumber newitemoff; - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* Check 1/3 of a page restriction */ if (unlikely(insertstate->itemsz > BTMaxItemSize(page))) @@ -888,7 +888,7 @@ _bt_findinsertloc(Relation rel, _bt_stepright(rel, insertstate, stack); /* Update local state after stepping right */ page = BufferGetPage(insertstate->buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* Assume duplicates (if checkingunique) */ uniquedup = true; } @@ -972,7 +972,7 @@ _bt_findinsertloc(Relation rel, _bt_stepright(rel, insertstate, stack); /* Update local state after stepping right */ page = BufferGetPage(insertstate->buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); } } @@ -1030,7 +1030,7 @@ _bt_stepright(Relation rel, BTInsertState insertstate, BTStack stack) BlockNumber rblkno; page = BufferGetPage(insertstate->buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); rbuf = InvalidBuffer; rblkno = opaque->btpo_next; @@ -1038,7 +1038,7 @@ _bt_stepright(Relation rel, BTInsertState insertstate, BTStack stack) { rbuf = _bt_relandgetbuf(rel, rbuf, rblkno, BT_WRITE); page = BufferGetPage(rbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* * If this page was incompletely split, finish the split now. We do @@ -1120,7 +1120,7 @@ _bt_insertonpg(Relation rel, IndexTuple nposting = NULL; page = BufferGetPage(buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); isleaf = P_ISLEAF(opaque); isroot = P_ISROOT(opaque); isrightmost = P_RIGHTMOST(opaque); @@ -1296,7 +1296,7 @@ _bt_insertonpg(Relation rel, if (!isleaf) { Page cpage = BufferGetPage(cbuf); - BTPageOpaque cpageop = (BTPageOpaque) PageGetSpecialPointer(cpage); + BTPageOpaque cpageop = BTPageGetOpaque(cpage); Assert(P_INCOMPLETE_SPLIT(cpageop)); cpageop->btpo_flags &= ~BTP_INCOMPLETE_SPLIT; @@ -1504,7 +1504,7 @@ _bt_split(Relation rel, BTScanInsert itup_key, Buffer buf, Buffer cbuf, * only workspace. */ origpage = BufferGetPage(buf); - oopaque = (BTPageOpaque) PageGetSpecialPointer(origpage); + oopaque = BTPageGetOpaque(origpage); isleaf = P_ISLEAF(oopaque); isrightmost = P_RIGHTMOST(oopaque); maxoff = PageGetMaxOffsetNumber(origpage); @@ -1540,7 +1540,7 @@ _bt_split(Relation rel, BTScanInsert itup_key, Buffer buf, Buffer cbuf, /* Allocate temp buffer for leftpage */ leftpage = PageGetTempPage(origpage); _bt_pageinit(leftpage, BufferGetPageSize(buf)); - lopaque = (BTPageOpaque) PageGetSpecialPointer(leftpage); + lopaque = BTPageGetOpaque(leftpage); /* * leftpage won't be the root when we're done. Also, clear the SPLIT_END @@ -1716,7 +1716,7 @@ _bt_split(Relation rel, BTScanInsert itup_key, Buffer buf, Buffer cbuf, rightpage = BufferGetPage(rbuf); rightpagenumber = BufferGetBlockNumber(rbuf); /* rightpage was initialized by _bt_getbuf */ - ropaque = (BTPageOpaque) PageGetSpecialPointer(rightpage); + ropaque = BTPageGetOpaque(rightpage); /* * Finish off remaining leftpage special area fields. They cannot be set @@ -1887,7 +1887,7 @@ _bt_split(Relation rel, BTScanInsert itup_key, Buffer buf, Buffer cbuf, { sbuf = _bt_getbuf(rel, oopaque->btpo_next, BT_WRITE); spage = BufferGetPage(sbuf); - sopaque = (BTPageOpaque) PageGetSpecialPointer(spage); + sopaque = BTPageGetOpaque(spage); if (sopaque->btpo_prev != origpagenumber) { memset(rightpage, 0, BufferGetPageSize(rbuf)); @@ -1952,7 +1952,7 @@ _bt_split(Relation rel, BTScanInsert itup_key, Buffer buf, Buffer cbuf, if (!isleaf) { Page cpage = BufferGetPage(cbuf); - BTPageOpaque cpageop = (BTPageOpaque) PageGetSpecialPointer(cpage); + BTPageOpaque cpageop = BTPageGetOpaque(cpage); cpageop->btpo_flags &= ~BTP_INCOMPLETE_SPLIT; MarkBufferDirty(cbuf); @@ -2139,7 +2139,7 @@ _bt_insert_parent(Relation rel, BTPageOpaque opaque; elog(DEBUG2, "concurrent ROOT page split"); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* * We should never reach here when a leaf page split takes place @@ -2230,7 +2230,7 @@ void _bt_finish_split(Relation rel, Buffer lbuf, BTStack stack) { Page lpage = BufferGetPage(lbuf); - BTPageOpaque lpageop = (BTPageOpaque) PageGetSpecialPointer(lpage); + BTPageOpaque lpageop = BTPageGetOpaque(lpage); Buffer rbuf; Page rpage; BTPageOpaque rpageop; @@ -2242,7 +2242,7 @@ _bt_finish_split(Relation rel, Buffer lbuf, BTStack stack) /* Lock right sibling, the one missing the downlink */ rbuf = _bt_getbuf(rel, lpageop->btpo_next, BT_WRITE); rpage = BufferGetPage(rbuf); - rpageop = (BTPageOpaque) PageGetSpecialPointer(rpage); + rpageop = BTPageGetOpaque(rpage); /* Could this be a root split? */ if (!stack) @@ -2320,7 +2320,7 @@ _bt_getstackbuf(Relation rel, BTStack stack, BlockNumber child) buf = _bt_getbuf(rel, blkno, BT_WRITE); page = BufferGetPage(buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (P_INCOMPLETE_SPLIT(opaque)) { @@ -2451,7 +2451,7 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf) lbkno = BufferGetBlockNumber(lbuf); rbkno = BufferGetBlockNumber(rbuf); lpage = BufferGetPage(lbuf); - lopaque = (BTPageOpaque) PageGetSpecialPointer(lpage); + lopaque = BTPageGetOpaque(lpage); /* get a new root page */ rootbuf = _bt_getbuf(rel, P_NEW, BT_WRITE); @@ -2492,11 +2492,11 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf) _bt_upgrademetapage(metapg); /* set btree special data */ - rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpage); + rootopaque = BTPageGetOpaque(rootpage); rootopaque->btpo_prev = rootopaque->btpo_next = P_NONE; rootopaque->btpo_flags = BTP_ROOT; rootopaque->btpo_level = - ((BTPageOpaque) PageGetSpecialPointer(lpage))->btpo_level + 1; + (BTPageGetOpaque(lpage))->btpo_level + 1; rootopaque->btpo_cycleid = 0; /* update metapage data */ @@ -2680,7 +2680,7 @@ _bt_delete_or_dedup_one_page(Relation rel, Relation heapRel, Buffer buffer = insertstate->buf; BTScanInsert itup_key = insertstate->itup_key; Page page = BufferGetPage(buffer); - BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); + BTPageOpaque opaque = BTPageGetOpaque(page); Assert(P_ISLEAF(opaque)); Assert(simpleonly || itup_key->heapkeyspace); diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c index 6b5f01e1d0..20adb602a4 100644 --- a/src/backend/access/nbtree/nbtpage.c +++ b/src/backend/access/nbtree/nbtpage.c @@ -85,7 +85,7 @@ _bt_initmetapage(Page page, BlockNumber rootbknum, uint32 level, metad->btm_last_cleanup_num_heap_tuples = -1.0; metad->btm_allequalimage = allequalimage; - metaopaque = (BTPageOpaque) PageGetSpecialPointer(page); + metaopaque = BTPageGetOpaque(page); metaopaque->btpo_flags = BTP_META; /* @@ -112,7 +112,7 @@ _bt_upgrademetapage(Page page) BTPageOpaque metaopaque PG_USED_FOR_ASSERTS_ONLY; metad = BTPageGetMeta(page); - metaopaque = (BTPageOpaque) PageGetSpecialPointer(page); + metaopaque = BTPageGetOpaque(page); /* It must be really a meta page of upgradable version */ Assert(metaopaque->btpo_flags & BTP_META); @@ -148,7 +148,7 @@ _bt_getmeta(Relation rel, Buffer metabuf) BTMetaPageData *metad; metapg = BufferGetPage(metabuf); - metaopaque = (BTPageOpaque) PageGetSpecialPointer(metapg); + metaopaque = BTPageGetOpaque(metapg); metad = BTPageGetMeta(metapg); /* sanity-check the metapage */ @@ -372,7 +372,7 @@ _bt_getroot(Relation rel, int access) rootbuf = _bt_getbuf(rel, rootblkno, BT_READ); rootpage = BufferGetPage(rootbuf); - rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpage); + rootopaque = BTPageGetOpaque(rootpage); /* * Since the cache might be stale, we check the page more carefully @@ -440,7 +440,7 @@ _bt_getroot(Relation rel, int access) rootbuf = _bt_getbuf(rel, P_NEW, BT_WRITE); rootblkno = BufferGetBlockNumber(rootbuf); rootpage = BufferGetPage(rootbuf); - rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpage); + rootopaque = BTPageGetOpaque(rootpage); rootopaque->btpo_prev = rootopaque->btpo_next = P_NONE; rootopaque->btpo_flags = (BTP_LEAF | BTP_ROOT); rootopaque->btpo_level = 0; @@ -534,7 +534,7 @@ _bt_getroot(Relation rel, int access) { rootbuf = _bt_relandgetbuf(rel, rootbuf, rootblkno, BT_READ); rootpage = BufferGetPage(rootbuf); - rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpage); + rootopaque = BTPageGetOpaque(rootpage); if (!P_IGNORE(rootopaque)) break; @@ -598,7 +598,7 @@ _bt_gettrueroot(Relation rel) metabuf = _bt_getbuf(rel, BTREE_METAPAGE, BT_READ); metapg = BufferGetPage(metabuf); - metaopaque = (BTPageOpaque) PageGetSpecialPointer(metapg); + metaopaque = BTPageGetOpaque(metapg); metad = BTPageGetMeta(metapg); if (!P_ISMETA(metaopaque) || @@ -637,7 +637,7 @@ _bt_gettrueroot(Relation rel) { rootbuf = _bt_relandgetbuf(rel, rootbuf, rootblkno, BT_READ); rootpage = BufferGetPage(rootbuf); - rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpage); + rootopaque = BTPageGetOpaque(rootpage); if (!P_IGNORE(rootopaque)) break; @@ -1220,7 +1220,7 @@ _bt_delitems_vacuum(Relation rel, Buffer buf, * We can clear the vacuum cycle ID since this page has certainly been * processed by the current vacuum scan. */ - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); opaque->btpo_cycleid = 0; /* @@ -1338,7 +1338,7 @@ _bt_delitems_delete(Relation rel, Buffer buf, TransactionId latestRemovedXid, * Unlike _bt_delitems_vacuum, we *must not* clear the vacuum cycle ID at * this point. The VACUUM command alone controls vacuum cycle IDs. */ - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* * Clear the BTP_HAS_GARBAGE page flag. @@ -1718,7 +1718,7 @@ _bt_leftsib_splitflag(Relation rel, BlockNumber leftsib, BlockNumber target) buf = _bt_getbuf(rel, leftsib, BT_READ); page = BufferGetPage(buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* * If the left sibling was concurrently split, so that its next-pointer @@ -1773,7 +1773,7 @@ _bt_rightsib_halfdeadflag(Relation rel, BlockNumber leafrightsib) buf = _bt_getbuf(rel, leafrightsib, BT_READ); page = BufferGetPage(buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); Assert(P_ISLEAF(opaque) && !P_ISDELETED(opaque)); result = P_ISHALFDEAD(opaque); @@ -1842,7 +1842,7 @@ _bt_pagedel(Relation rel, Buffer leafbuf, BTVacState *vstate) for (;;) { page = BufferGetPage(leafbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* * Internal pages are never deleted directly, only as part of deleting @@ -2099,7 +2099,7 @@ _bt_mark_page_halfdead(Relation rel, Buffer leafbuf, BTStack stack) IndexTupleData trunctuple; page = BufferGetPage(leafbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); Assert(!P_RIGHTMOST(opaque) && !P_ISROOT(opaque) && P_ISLEAF(opaque) && !P_IGNORE(opaque) && @@ -2154,7 +2154,7 @@ _bt_mark_page_halfdead(Relation rel, Buffer leafbuf, BTStack stack) * before entering the critical section --- otherwise it'd be a PANIC. */ page = BufferGetPage(subtreeparent); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); #ifdef USE_ASSERT_CHECKING @@ -2201,7 +2201,7 @@ _bt_mark_page_halfdead(Relation rel, Buffer leafbuf, BTStack stack) * nbtree/README. */ page = BufferGetPage(subtreeparent); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); itemid = PageGetItemId(page, poffset); itup = (IndexTuple) PageGetItem(page, itemid); @@ -2216,7 +2216,7 @@ _bt_mark_page_halfdead(Relation rel, Buffer leafbuf, BTStack stack) * is set to InvalidBlockNumber. */ page = BufferGetPage(leafbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); opaque->btpo_flags |= BTP_HALF_DEAD; Assert(PageGetMaxOffsetNumber(page) == P_HIKEY); @@ -2253,7 +2253,7 @@ _bt_mark_page_halfdead(Relation rel, Buffer leafbuf, BTStack stack) XLogRegisterBuffer(1, subtreeparent, REGBUF_STANDARD); page = BufferGetPage(leafbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); xlrec.leftblk = opaque->btpo_prev; xlrec.rightblk = opaque->btpo_next; @@ -2325,7 +2325,7 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, BlockNumber scanblkno, BlockNumber leaftopparent; page = BufferGetPage(leafbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); Assert(P_ISLEAF(opaque) && !P_ISDELETED(opaque) && P_ISHALFDEAD(opaque)); @@ -2364,7 +2364,7 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, BlockNumber scanblkno, /* Fetch the block number of the target's left sibling */ buf = _bt_getbuf(rel, target, BT_READ); page = BufferGetPage(buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); leftsib = opaque->btpo_prev; targetlevel = opaque->btpo_level; Assert(targetlevel > 0); @@ -2391,7 +2391,7 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, BlockNumber scanblkno, { lbuf = _bt_getbuf(rel, leftsib, BT_WRITE); page = BufferGetPage(lbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); while (P_ISDELETED(opaque) || opaque->btpo_next != target) { bool leftsibvalid = true; @@ -2441,7 +2441,7 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, BlockNumber scanblkno, /* step right one page */ lbuf = _bt_getbuf(rel, leftsib, BT_WRITE); page = BufferGetPage(lbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); } } else @@ -2450,7 +2450,7 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, BlockNumber scanblkno, /* Next write-lock the target page itself */ _bt_lockbuf(rel, buf, BT_WRITE); page = BufferGetPage(buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* * Check page is still empty etc, else abandon deletion. This is just for @@ -2505,7 +2505,7 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, BlockNumber scanblkno, rightsib = opaque->btpo_next; rbuf = _bt_getbuf(rel, rightsib, BT_WRITE); page = BufferGetPage(rbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (opaque->btpo_prev != target) ereport(ERROR, (errcode(ERRCODE_INDEX_CORRUPTED), @@ -2528,7 +2528,7 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, BlockNumber scanblkno, if (leftsib == P_NONE && rightsib_is_rightmost) { page = BufferGetPage(rbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (P_RIGHTMOST(opaque)) { /* rightsib will be the only one left on the level */ @@ -2565,12 +2565,12 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, BlockNumber scanblkno, if (BufferIsValid(lbuf)) { page = BufferGetPage(lbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); Assert(opaque->btpo_next == target); opaque->btpo_next = rightsib; } page = BufferGetPage(rbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); Assert(opaque->btpo_prev == target); opaque->btpo_prev = leftsib; @@ -2599,7 +2599,7 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, BlockNumber scanblkno, * of that scan. */ page = BufferGetPage(buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); Assert(P_ISHALFDEAD(opaque) || !P_ISLEAF(opaque)); /* @@ -2814,7 +2814,7 @@ _bt_lock_subtree_parent(Relation rel, BlockNumber child, BTStack stack, parentoffset = stack->bts_offset; page = BufferGetPage(pbuf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); maxoff = PageGetMaxOffsetNumber(page); leftsibparent = opaque->btpo_prev; diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c index dacf3f7a58..06131f23d4 100644 --- a/src/backend/access/nbtree/nbtree.c +++ b/src/backend/access/nbtree/nbtree.c @@ -1070,7 +1070,7 @@ btvacuumpage(BTVacState *vstate, BlockNumber scanblkno) if (!PageIsNew(page)) { _bt_checkpage(rel, buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); } Assert(blkno <= scanblkno); diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c index 9d82d4904d..c74543bfde 100644 --- a/src/backend/access/nbtree/nbtsearch.c +++ b/src/backend/access/nbtree/nbtsearch.c @@ -134,7 +134,7 @@ _bt_search(Relation rel, BTScanInsert key, Buffer *bufP, int access, /* if this is a leaf page, we're done */ page = BufferGetPage(*bufP); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (P_ISLEAF(opaque)) break; @@ -268,7 +268,7 @@ _bt_moveright(Relation rel, { page = BufferGetPage(buf); TestForOldSnapshot(snapshot, rel, page); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (P_RIGHTMOST(opaque)) break; @@ -347,7 +347,7 @@ _bt_binsrch(Relation rel, cmpval; page = BufferGetPage(buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* Requesting nextkey semantics while using scantid seems nonsensical */ Assert(!key->nextkey || key->scantid == NULL); @@ -451,7 +451,7 @@ _bt_binsrch_insert(Relation rel, BTInsertState insertstate) cmpval; page = BufferGetPage(insertstate->buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); Assert(P_ISLEAF(opaque)); Assert(!key->nextkey); @@ -659,7 +659,7 @@ _bt_compare(Relation rel, OffsetNumber offnum) { TupleDesc itupdesc = RelationGetDescr(rel); - BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); + BTPageOpaque opaque = BTPageGetOpaque(page); IndexTuple itup; ItemPointer heapTid; ScanKey scankey; @@ -1536,7 +1536,7 @@ _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum) Assert(BufferIsValid(so->currPos.buf)); page = BufferGetPage(so->currPos.buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* allow next page be processed by parallel worker */ if (scan->parallel_scan) @@ -2007,7 +2007,7 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir) so->currPos.buf = _bt_getbuf(rel, blkno, BT_READ); page = BufferGetPage(so->currPos.buf); TestForOldSnapshot(scan->xs_snapshot, rel, page); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* check for deleted page */ if (!P_IGNORE(opaque)) { @@ -2110,7 +2110,7 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir) */ page = BufferGetPage(so->currPos.buf); TestForOldSnapshot(scan->xs_snapshot, rel, page); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (!P_IGNORE(opaque)) { PredicateLockPage(rel, BufferGetBlockNumber(so->currPos.buf), scan->xs_snapshot); @@ -2191,7 +2191,7 @@ _bt_walk_left(Relation rel, Buffer buf, Snapshot snapshot) BTPageOpaque opaque; page = BufferGetPage(buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); for (;;) { @@ -2216,7 +2216,7 @@ _bt_walk_left(Relation rel, Buffer buf, Snapshot snapshot) buf = _bt_getbuf(rel, blkno, BT_READ); page = BufferGetPage(buf); TestForOldSnapshot(snapshot, rel, page); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); /* * If this isn't the page we want, walk right till we find what we @@ -2243,14 +2243,14 @@ _bt_walk_left(Relation rel, Buffer buf, Snapshot snapshot) buf = _bt_relandgetbuf(rel, buf, blkno, BT_READ); page = BufferGetPage(buf); TestForOldSnapshot(snapshot, rel, page); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); } /* Return to the original page to see what's up */ buf = _bt_relandgetbuf(rel, buf, obknum, BT_READ); page = BufferGetPage(buf); TestForOldSnapshot(snapshot, rel, page); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (P_ISDELETED(opaque)) { /* @@ -2268,7 +2268,7 @@ _bt_walk_left(Relation rel, Buffer buf, Snapshot snapshot) buf = _bt_relandgetbuf(rel, buf, blkno, BT_READ); page = BufferGetPage(buf); TestForOldSnapshot(snapshot, rel, page); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (!P_ISDELETED(opaque)) break; } @@ -2329,7 +2329,7 @@ _bt_get_endpoint(Relation rel, uint32 level, bool rightmost, page = BufferGetPage(buf); TestForOldSnapshot(snapshot, rel, page); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); for (;;) { @@ -2349,7 +2349,7 @@ _bt_get_endpoint(Relation rel, uint32 level, bool rightmost, buf = _bt_relandgetbuf(rel, buf, blkno, BT_READ); page = BufferGetPage(buf); TestForOldSnapshot(snapshot, rel, page); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); } /* Done? */ @@ -2372,7 +2372,7 @@ _bt_get_endpoint(Relation rel, uint32 level, bool rightmost, buf = _bt_relandgetbuf(rel, buf, blkno, BT_READ); page = BufferGetPage(buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); } return buf; @@ -2418,7 +2418,7 @@ _bt_endpoint(IndexScanDesc scan, ScanDirection dir) PredicateLockPage(rel, BufferGetBlockNumber(buf), scan->xs_snapshot); page = BufferGetPage(buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); Assert(P_ISLEAF(opaque)); if (ScanDirectionIsForward(dir)) diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c index 8a19de2f66..c074513efa 100644 --- a/src/backend/access/nbtree/nbtsort.c +++ b/src/backend/access/nbtree/nbtsort.c @@ -625,7 +625,7 @@ _bt_blnewpage(uint32 level) _bt_pageinit(page, BLCKSZ); /* Initialize BT opaque state */ - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); opaque->btpo_prev = opaque->btpo_next = P_NONE; opaque->btpo_level = level; opaque->btpo_flags = (level > 0) ? 0 : BTP_LEAF; @@ -1000,9 +1000,9 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup, Assert((BTreeTupleGetNAtts(state->btps_lowkey, wstate->index) <= IndexRelationGetNumberOfKeyAttributes(wstate->index) && BTreeTupleGetNAtts(state->btps_lowkey, wstate->index) > 0) || - P_LEFTMOST((BTPageOpaque) PageGetSpecialPointer(opage))); + P_LEFTMOST(BTPageGetOpaque(opage))); Assert(BTreeTupleGetNAtts(state->btps_lowkey, wstate->index) == 0 || - !P_LEFTMOST((BTPageOpaque) PageGetSpecialPointer(opage))); + !P_LEFTMOST(BTPageGetOpaque(opage))); BTreeTupleSetDownLink(state->btps_lowkey, oblkno); _bt_buildadd(wstate, state->btps_next, state->btps_lowkey, 0); pfree(state->btps_lowkey); @@ -1017,8 +1017,8 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup, * Set the sibling links for both pages. */ { - BTPageOpaque oopaque = (BTPageOpaque) PageGetSpecialPointer(opage); - BTPageOpaque nopaque = (BTPageOpaque) PageGetSpecialPointer(npage); + BTPageOpaque oopaque = BTPageGetOpaque(opage); + BTPageOpaque nopaque = BTPageGetOpaque(npage); oopaque->btpo_next = nblkno; nopaque->btpo_prev = oblkno; @@ -1125,7 +1125,7 @@ _bt_uppershutdown(BTWriteState *wstate, BTPageState *state) BTPageOpaque opaque; blkno = s->btps_blkno; - opaque = (BTPageOpaque) PageGetSpecialPointer(s->btps_page); + opaque = BTPageGetOpaque(s->btps_page); /* * We have to link the last page on this level to somewhere. diff --git a/src/backend/access/nbtree/nbtsplitloc.c b/src/backend/access/nbtree/nbtsplitloc.c index c46594e1a2..ee01ceafda 100644 --- a/src/backend/access/nbtree/nbtsplitloc.c +++ b/src/backend/access/nbtree/nbtsplitloc.c @@ -152,7 +152,7 @@ _bt_findsplitloc(Relation rel, SplitPoint leftpage, rightpage; - opaque = (BTPageOpaque) PageGetSpecialPointer(origpage); + opaque = BTPageGetOpaque(origpage); maxoff = PageGetMaxOffsetNumber(origpage); /* Total free space available on a btree page, after fixed overhead */ diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c index 84164748b3..96c72fc432 100644 --- a/src/backend/access/nbtree/nbtutils.c +++ b/src/backend/access/nbtree/nbtutils.c @@ -1774,7 +1774,7 @@ _bt_killitems(IndexScanDesc scan) } } - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); minoff = P_FIRSTDATAKEY(opaque); maxoff = PageGetMaxOffsetNumber(page); @@ -2474,7 +2474,7 @@ _bt_check_natts(Relation rel, bool heapkeyspace, Page page, OffsetNumber offnum) { int16 natts = IndexRelationGetNumberOfAttributes(rel); int16 nkeyatts = IndexRelationGetNumberOfKeyAttributes(rel); - BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); + BTPageOpaque opaque = BTPageGetOpaque(page); IndexTuple itup; int tupnatts; @@ -2662,7 +2662,7 @@ _bt_check_third_page(Relation rel, Relation heap, bool needheaptidspace, * Internal page insertions cannot fail here, because that would mean that * an earlier leaf level insertion that should have failed didn't */ - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (!P_ISLEAF(opaque)) elog(ERROR, "cannot insert oversized tuple of size %zu on internal page of index \"%s\"", itemsz, RelationGetRelationName(rel)); diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c index 611f412ba8..fba124b940 100644 --- a/src/backend/access/nbtree/nbtxlog.c +++ b/src/backend/access/nbtree/nbtxlog.c @@ -115,7 +115,7 @@ _bt_restore_meta(XLogReaderState *record, uint8 block_id) md->btm_last_cleanup_num_heap_tuples = -1.0; md->btm_allequalimage = xlrec->allequalimage; - pageop = (BTPageOpaque) PageGetSpecialPointer(metapg); + pageop = BTPageGetOpaque(metapg); pageop->btpo_flags = BTP_META; /* @@ -146,7 +146,7 @@ _bt_clear_incomplete_split(XLogReaderState *record, uint8 block_id) if (XLogReadBufferForRedo(record, block_id, &buf) == BLK_NEEDS_REDO) { Page page = (Page) BufferGetPage(buf); - BTPageOpaque pageop = (BTPageOpaque) PageGetSpecialPointer(page); + BTPageOpaque pageop = BTPageGetOpaque(page); Assert(P_INCOMPLETE_SPLIT(pageop)); pageop->btpo_flags &= ~BTP_INCOMPLETE_SPLIT; @@ -292,7 +292,7 @@ btree_xlog_split(bool newitemonleft, XLogReaderState *record) rpage = (Page) BufferGetPage(rbuf); _bt_pageinit(rpage, BufferGetPageSize(rbuf)); - ropaque = (BTPageOpaque) PageGetSpecialPointer(rpage); + ropaque = BTPageGetOpaque(rpage); ropaque->btpo_prev = origpagenumber; ropaque->btpo_next = spagenumber; @@ -317,7 +317,7 @@ btree_xlog_split(bool newitemonleft, XLogReaderState *record) * same for the right page. */ Page origpage = (Page) BufferGetPage(buf); - BTPageOpaque oopaque = (BTPageOpaque) PageGetSpecialPointer(origpage); + BTPageOpaque oopaque = BTPageGetOpaque(origpage); OffsetNumber off; IndexTuple newitem = NULL, left_hikey = NULL, @@ -442,7 +442,7 @@ btree_xlog_split(bool newitemonleft, XLogReaderState *record) if (XLogReadBufferForRedo(record, 2, &sbuf) == BLK_NEEDS_REDO) { Page spage = (Page) BufferGetPage(sbuf); - BTPageOpaque spageop = (BTPageOpaque) PageGetSpecialPointer(spage); + BTPageOpaque spageop = BTPageGetOpaque(spage); spageop->btpo_prev = rightpagenumber; @@ -473,7 +473,7 @@ btree_xlog_dedup(XLogReaderState *record) { char *ptr = XLogRecGetBlockData(record, 0, NULL); Page page = (Page) BufferGetPage(buf); - BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); + BTPageOpaque opaque = BTPageGetOpaque(page); OffsetNumber offnum, minoff, maxoff; @@ -541,7 +541,7 @@ btree_xlog_dedup(XLogReaderState *record) if (P_HAS_GARBAGE(opaque)) { - BTPageOpaque nopaque = (BTPageOpaque) PageGetSpecialPointer(newpage); + BTPageOpaque nopaque = BTPageGetOpaque(newpage); nopaque->btpo_flags &= ~BTP_HAS_GARBAGE; } @@ -639,7 +639,7 @@ btree_xlog_vacuum(XLogReaderState *record) * Mark the page as not containing any LP_DEAD items --- see comments * in _bt_delitems_vacuum(). */ - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); opaque->btpo_flags &= ~BTP_HAS_GARBAGE; PageSetLSN(page, lsn); @@ -699,7 +699,7 @@ btree_xlog_delete(XLogReaderState *record) PageIndexMultiDelete(page, (OffsetNumber *) ptr, xlrec->ndeleted); /* Mark the page as not containing any LP_DEAD items */ - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); opaque->btpo_flags &= ~BTP_HAS_GARBAGE; PageSetLSN(page, lsn); @@ -737,7 +737,7 @@ btree_xlog_mark_page_halfdead(uint8 info, XLogReaderState *record) BlockNumber rightsib; page = (Page) BufferGetPage(buffer); - pageop = (BTPageOpaque) PageGetSpecialPointer(page); + pageop = BTPageGetOpaque(page); poffset = xlrec->poffset; @@ -768,7 +768,7 @@ btree_xlog_mark_page_halfdead(uint8 info, XLogReaderState *record) page = (Page) BufferGetPage(buffer); _bt_pageinit(page, BufferGetPageSize(buffer)); - pageop = (BTPageOpaque) PageGetSpecialPointer(page); + pageop = BTPageGetOpaque(page); pageop->btpo_prev = xlrec->leftblk; pageop->btpo_next = xlrec->rightblk; @@ -833,7 +833,7 @@ btree_xlog_unlink_page(uint8 info, XLogReaderState *record) if (XLogReadBufferForRedo(record, 1, &leftbuf) == BLK_NEEDS_REDO) { page = (Page) BufferGetPage(leftbuf); - pageop = (BTPageOpaque) PageGetSpecialPointer(page); + pageop = BTPageGetOpaque(page); pageop->btpo_next = rightsib; PageSetLSN(page, lsn); @@ -848,7 +848,7 @@ btree_xlog_unlink_page(uint8 info, XLogReaderState *record) page = (Page) BufferGetPage(target); _bt_pageinit(page, BufferGetPageSize(target)); - pageop = (BTPageOpaque) PageGetSpecialPointer(page); + pageop = BTPageGetOpaque(page); pageop->btpo_prev = leftsib; pageop->btpo_next = rightsib; @@ -865,7 +865,7 @@ btree_xlog_unlink_page(uint8 info, XLogReaderState *record) if (XLogReadBufferForRedo(record, 2, &rightbuf) == BLK_NEEDS_REDO) { page = (Page) BufferGetPage(rightbuf); - pageop = (BTPageOpaque) PageGetSpecialPointer(page); + pageop = BTPageGetOpaque(page); pageop->btpo_prev = leftsib; PageSetLSN(page, lsn); @@ -906,7 +906,7 @@ btree_xlog_unlink_page(uint8 info, XLogReaderState *record) page = (Page) BufferGetPage(leafbuf); _bt_pageinit(page, BufferGetPageSize(leafbuf)); - pageop = (BTPageOpaque) PageGetSpecialPointer(page); + pageop = BTPageGetOpaque(page); pageop->btpo_flags = BTP_HALF_DEAD | BTP_LEAF; pageop->btpo_prev = xlrec->leafleftsib; @@ -948,7 +948,7 @@ btree_xlog_newroot(XLogReaderState *record) page = (Page) BufferGetPage(buffer); _bt_pageinit(page, BufferGetPageSize(buffer)); - pageop = (BTPageOpaque) PageGetSpecialPointer(page); + pageop = BTPageGetOpaque(page); pageop->btpo_flags = BTP_ROOT; pageop->btpo_prev = pageop->btpo_next = P_NONE; @@ -1097,7 +1097,7 @@ btree_mask(char *pagedata, BlockNumber blkno) mask_page_hint_bits(page); mask_unused_space(page); - maskopaq = (BTPageOpaque) PageGetSpecialPointer(page); + maskopaq = BTPageGetOpaque(page); if (P_ISLEAF(maskopaq)) { diff --git a/src/include/access/hash.h b/src/include/access/hash.h index cd7b2a53d8..da372841c4 100644 --- a/src/include/access/hash.h +++ b/src/include/access/hash.h @@ -85,6 +85,8 @@ typedef struct HashPageOpaqueData typedef HashPageOpaqueData *HashPageOpaque; +#define HashPageGetOpaque(page) ((HashPageOpaque) PageGetSpecialPointer(page)) + #define H_NEEDS_SPLIT_CLEANUP(opaque) (((opaque)->hasho_flag & LH_BUCKET_NEEDS_SPLIT_CLEANUP) != 0) #define H_BUCKET_BEING_SPLIT(opaque) (((opaque)->hasho_flag & LH_BUCKET_BEING_SPLIT) != 0) #define H_BUCKET_BEING_POPULATED(opaque) (((opaque)->hasho_flag & LH_BUCKET_BEING_POPULATED) != 0) diff --git a/src/include/access/nbtree.h b/src/include/access/nbtree.h index 9fec6fb1a8..93f8267b48 100644 --- a/src/include/access/nbtree.h +++ b/src/include/access/nbtree.h @@ -70,6 +70,8 @@ typedef struct BTPageOpaqueData typedef BTPageOpaqueData *BTPageOpaque; +#define BTPageGetOpaque(page) ((BTPageOpaque) PageGetSpecialPointer(page)) + /* Bits defined in btpo_flags */ #define BTP_LEAF (1 << 0) /* leaf page, i.e. not internal page */ #define BTP_ROOT (1 << 1) /* root page (has no parent) */ @@ -241,7 +243,7 @@ BTPageSetDeleted(Page page, FullTransactionId safexid) PageHeader header; BTDeletedPageData *contents; - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); header = ((PageHeader) page); opaque->btpo_flags &= ~BTP_HALF_DEAD; @@ -263,7 +265,7 @@ BTPageGetDeleteXid(Page page) /* We only expect to be called with a deleted page */ Assert(!PageIsNew(page)); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); Assert(P_ISDELETED(opaque)); /* pg_upgrade'd deleted page -- must be safe to delete now */ @@ -294,7 +296,7 @@ BTPageIsRecyclable(Page page) Assert(!PageIsNew(page)); /* Recycling okay iff page is deleted and safexid is old enough */ - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (P_ISDELETED(opaque)) { /* From 5519d5affdfae4f5ea4b5faca65348cc14c5d279 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 1 Apr 2022 13:00:43 +0200 Subject: [PATCH 340/772] psql: Refactor ProcessResult() Separate HandleCopyResult() from ProcessResult() in preparation for a subsequent patch. Author: Fabien COELHO Discussion: https://www.postgresql.org/message-id/flat/alpine.DEB.2.21.1904132231510.8961@lancre --- src/bin/psql/common.c | 204 +++++++++++++++++++++++------------------- 1 file changed, 111 insertions(+), 93 deletions(-) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index c9847c8f9a..f6777bbfc4 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -892,6 +892,116 @@ ExecQueryTuples(const PGresult *result) } +/* + * Marshal the COPY data. Either subroutine will get the + * connection out of its COPY state, then call PQresultStatus() + * once and report any error. Return whether all was ok. + * + * For COPY OUT, direct the output to pset.copyStream if it's set, + * otherwise to pset.gfname if it's set, otherwise to queryFout. + * For COPY IN, use pset.copyStream as data source if it's set, + * otherwise cur_cmd_source. + * + * Update result if further processing is necessary, or NULL otherwise. + * Return a result when queryFout can safely output a result status: on COPY + * IN, or on COPY OUT if written to something other than pset.queryFout. + * Returning NULL prevents the command status from being printed, which we + * want if the status line doesn't get taken as part of the COPY data. + */ +static bool +HandleCopyResult(PGresult **resultp) +{ + bool success; + FILE *copystream; + PGresult *copy_result; + ExecStatusType result_status = PQresultStatus(*resultp); + + Assert(result_status == PGRES_COPY_OUT || + result_status == PGRES_COPY_IN); + + SetCancelConn(pset.db); + + if (result_status == PGRES_COPY_OUT) + { + bool need_close = false; + bool is_pipe = false; + + if (pset.copyStream) + { + /* invoked by \copy */ + copystream = pset.copyStream; + } + else if (pset.gfname) + { + /* invoked by \g */ + if (openQueryOutputFile(pset.gfname, + ©stream, &is_pipe)) + { + need_close = true; + if (is_pipe) + disable_sigpipe_trap(); + } + else + copystream = NULL; /* discard COPY data entirely */ + } + else + { + /* fall back to the generic query output stream */ + copystream = pset.queryFout; + } + + success = handleCopyOut(pset.db, + copystream, + ©_result) + && (copystream != NULL); + + /* + * Suppress status printing if the report would go to the same + * place as the COPY data just went. Note this doesn't + * prevent error reporting, since handleCopyOut did that. + */ + if (copystream == pset.queryFout) + { + PQclear(copy_result); + copy_result = NULL; + } + + if (need_close) + { + /* close \g argument file/pipe */ + if (is_pipe) + { + pclose(copystream); + restore_sigpipe_trap(); + } + else + { + fclose(copystream); + } + } + } + else + { + /* COPY IN */ + copystream = pset.copyStream ? pset.copyStream : pset.cur_cmd_source; + success = handleCopyIn(pset.db, + copystream, + PQbinaryTuples(*resultp), + ©_result); + } + ResetCancelConn(); + + /* + * Replace the PGRES_COPY_OUT/IN result with COPY command's exit + * status, or with NULL if we want to suppress printing anything. + */ + PQclear(*resultp); + *resultp = copy_result; + + return success; +} + + /* * ProcessResult: utility function for use by SendQuery() only * @@ -957,99 +1067,7 @@ ProcessResult(PGresult **resultp) } if (is_copy) - { - /* - * Marshal the COPY data. Either subroutine will get the - * connection out of its COPY state, then call PQresultStatus() - * once and report any error. - * - * For COPY OUT, direct the output to pset.copyStream if it's set, - * otherwise to pset.gfname if it's set, otherwise to queryFout. - * For COPY IN, use pset.copyStream as data source if it's set, - * otherwise cur_cmd_source. - */ - FILE *copystream; - PGresult *copy_result; - - SetCancelConn(pset.db); - if (result_status == PGRES_COPY_OUT) - { - bool need_close = false; - bool is_pipe = false; - - if (pset.copyStream) - { - /* invoked by \copy */ - copystream = pset.copyStream; - } - else if (pset.gfname) - { - /* invoked by \g */ - if (openQueryOutputFile(pset.gfname, - ©stream, &is_pipe)) - { - need_close = true; - if (is_pipe) - disable_sigpipe_trap(); - } - else - copystream = NULL; /* discard COPY data entirely */ - } - else - { - /* fall back to the generic query output stream */ - copystream = pset.queryFout; - } - - success = handleCopyOut(pset.db, - copystream, - ©_result) - && success - && (copystream != NULL); - - /* - * Suppress status printing if the report would go to the same - * place as the COPY data just went. Note this doesn't - * prevent error reporting, since handleCopyOut did that. - */ - if (copystream == pset.queryFout) - { - PQclear(copy_result); - copy_result = NULL; - } - - if (need_close) - { - /* close \g argument file/pipe */ - if (is_pipe) - { - pclose(copystream); - restore_sigpipe_trap(); - } - else - { - fclose(copystream); - } - } - } - else - { - /* COPY IN */ - copystream = pset.copyStream ? pset.copyStream : pset.cur_cmd_source; - success = handleCopyIn(pset.db, - copystream, - PQbinaryTuples(*resultp), - ©_result) && success; - } - ResetCancelConn(); - - /* - * Replace the PGRES_COPY_OUT/IN result with COPY command's exit - * status, or with NULL if we want to suppress printing anything. - */ - PQclear(*resultp); - *resultp = copy_result; - } + success = HandleCopyResult(resultp); else if (first_cycle) { /* fast path: no COPY commands; PQexec visited all results */ From af9e180495507a2b01f1bc31b7ea5125b8385903 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 1 Apr 2022 14:06:23 +0200 Subject: [PATCH 341/772] Add SSL tests for IP addresses in certificates This tests some scenarios that already work. A subsequent patch will introduce more functionality. Author: Jacob Champion Co-authored-by: Kyotaro Horiguchi Co-authored-by: Daniel Gustafsson Discussion: https://www.postgresql.org/message-id/flat/9f5f20974cd3a4091a788cf7f00ab663d5fcdffe.camel@vmware.com --- src/test/ssl/conf/server-ip-cn-only.config | 12 +++++++++ src/test/ssl/conf/server-ip-in-dnsname.config | 18 +++++++++++++ src/test/ssl/ssl/server-ip-cn-only.crt | 18 +++++++++++++ src/test/ssl/ssl/server-ip-cn-only.key | 27 +++++++++++++++++++ src/test/ssl/ssl/server-ip-in-dnsname.crt | 18 +++++++++++++ src/test/ssl/ssl/server-ip-in-dnsname.key | 27 +++++++++++++++++++ src/test/ssl/sslfiles.mk | 2 ++ src/test/ssl/t/001_ssltests.pl | 26 +++++++++++++++++- 8 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 src/test/ssl/conf/server-ip-cn-only.config create mode 100644 src/test/ssl/conf/server-ip-in-dnsname.config create mode 100644 src/test/ssl/ssl/server-ip-cn-only.crt create mode 100644 src/test/ssl/ssl/server-ip-cn-only.key create mode 100644 src/test/ssl/ssl/server-ip-in-dnsname.crt create mode 100644 src/test/ssl/ssl/server-ip-in-dnsname.key diff --git a/src/test/ssl/conf/server-ip-cn-only.config b/src/test/ssl/conf/server-ip-cn-only.config new file mode 100644 index 0000000000..585d8bdae8 --- /dev/null +++ b/src/test/ssl/conf/server-ip-cn-only.config @@ -0,0 +1,12 @@ +# An OpenSSL format CSR config file for creating a server certificate. +# + +[ req ] +distinguished_name = req_distinguished_name +prompt = no + +[ req_distinguished_name ] +CN = 192.0.2.1 +OU = PostgreSQL test suite + +# No Subject Alternative Names diff --git a/src/test/ssl/conf/server-ip-in-dnsname.config b/src/test/ssl/conf/server-ip-in-dnsname.config new file mode 100644 index 0000000000..b15649aef7 --- /dev/null +++ b/src/test/ssl/conf/server-ip-in-dnsname.config @@ -0,0 +1,18 @@ +# An OpenSSL format CSR config file for creating a server certificate. +# + +[ req ] +distinguished_name = req_distinguished_name +req_extensions = v3_req +prompt = no + +[ req_distinguished_name ] +OU = PostgreSQL test suite + +# For Subject Alternative Names +[ v3_req ] +subjectAltName = @alt_names + +# Normally IP addresses should not go into a dNSName. +[ alt_names ] +DNS.1 = 192.0.2.1 diff --git a/src/test/ssl/ssl/server-ip-cn-only.crt b/src/test/ssl/ssl/server-ip-cn-only.crt new file mode 100644 index 0000000000..9bf015cf18 --- /dev/null +++ b/src/test/ssl/ssl/server-ip-cn-only.crt @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC8TCCAdkCCCAhESkRN1IAMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzZXJ2ZXIg +Y2VydHMwHhcNMjExMTI5MTkzNzUyWhcNNDkwNDE2MTkzNzUyWjA0MR4wHAYDVQQL +DBVQb3N0Z3JlU1FMIHRlc3Qgc3VpdGUxEjAQBgNVBAMMCTE5Mi4wLjIuMTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANWs1uUL71nHYF9Zj6p+M3MpYDvx +32iCjVdtH5a2qpSWHXTg0rR8dLX0y92cvOYvMXHRajZT1avpHr8dooPYSVaXpGMK +NvF/Qi+WFYovRbP2vmd1yv1cgW/FggbwJFWVobizIz4seyA4d0B2j9fqoi2OFBNP +huW664SjF0u3p21tDy+43i2LNUMAKf6dnRR5Vqenath87LEU41tSLudu6NXgbFMk +jvfNkl4d0w7YCzeXmklmSI+uaX3PlJJ4NzQO2j8w5BvnKVhNVD0KjgrXZ6nB/8F7 +Pg3XY+d7rJlwRgXemU6resWQDJ7+UaC9u7I4EIP+9lzCR/nNBqUktpHRmHUCAwEA +ATANBgkqhkiG9w0BAQsFAAOCAQEAos1JncV8Yf4UaKl6h1GdYtcVtzFyJvBEnhRD +07ldL+TYnfZiX8wK2ssBtM3cg/C78y5bzdUa5XGS83ZKQJFFdhE7PSnrvyNqyIqY +ZgNBxto3gyvir+EjO1u9BAB0NP3r3gYoHRDZS1xOPPzt4WgjuUgTLM9k82GsqAbO +UrOTOdRnkIqC5xLpa05EnRyJPRsR1w1PRJC2XXKnHIuFjMb4v7UuPwyCcX1P5ioc +rQszQcORy/L+k0ezCkyweORg68htjYbBHuwOuiGfok6yKKDMzrTvD3lIslls6eX7 +4sI3XWqzkPmG9Vsxm9Vu9/Ma+PRO76VyCoIwBd+Ufg5vNXhMmw== +-----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-ip-cn-only.key b/src/test/ssl/ssl/server-ip-cn-only.key new file mode 100644 index 0000000000..1966530e72 --- /dev/null +++ b/src/test/ssl/ssl/server-ip-cn-only.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEA1azW5QvvWcdgX1mPqn4zcylgO/HfaIKNV20flraqlJYddODS +tHx0tfTL3Zy85i8xcdFqNlPVq+kevx2ig9hJVpekYwo28X9CL5YVii9Fs/a+Z3XK +/VyBb8WCBvAkVZWhuLMjPix7IDh3QHaP1+qiLY4UE0+G5brrhKMXS7enbW0PL7je +LYs1QwAp/p2dFHlWp6dq2HzssRTjW1Iu527o1eBsUySO982SXh3TDtgLN5eaSWZI +j65pfc+Ukng3NA7aPzDkG+cpWE1UPQqOCtdnqcH/wXs+Dddj53usmXBGBd6ZTqt6 +xZAMnv5RoL27sjgQg/72XMJH+c0GpSS2kdGYdQIDAQABAoIBAQDNXviU4WnF8rmQ +K7bH+dBdqbETLKC8BG7xTrMD2sINWlMpmUUrsEtE7+paMGHnJAj0CoF5gg5m0wN4 +UXV4H5QtpEad4p14dAYbUreVP2ZRWKEdM7xM1HKcCUu2e22QzObJbXQ8N+iHyX3k ++Y+7yYrjGiH1hYR0nbnsnAyx++zyYBSQeqzpdQwf/BLY5xZmyYWNfqbckiMpEqMs +EmZmGXnCjIipzEC0LQHoSW9PNa92Z9bvuxOKYl8iHYDDXjvMRFoZBSiMXpzHQocb +QlQ5F4ayfW2OrOhpNbY7niYM9GN3Bk9TgMP+0BkJE6uuktLYW35LY1M78CCPWcWb +npJNK3QBAoGBAOxkGrhAHAysSmtirIyMdvySb76wb/Ukfi+AULKz20FI5j4/GXm9 +qCb2GeT+FFSUHeSC8f0EFnosRYkdBGruqeZioI+5rUkboYFJPspAHAuvg9kgtfF+ +kvphD4O4P/foYsEZRx66FHozDbhrrR5UXc7KzqRIASc/D3FOx2UFJLb1AoGBAOdm +WcaMvYygl9ZW+ThWAR1xG1X70AGKwrlrpF2hBkWYxSurxSMXnD0DUzC9Nb4EyCaM +c2uSqEZOKdW+XfXtK2DnqXKfb3YCVEoGN4gVfyuW/vxii/+ZxLo3md/b3vrkZEVp +pfkXy/HoZ71YN7bNpcDpOnhml6vvuCRCYFnI1WuBAoGAC0shB6pwbJ6Sk5zMN47C +ZICufAK75o9OxAAyWsdC81SDQ3gKRImuDeZ2CD2nRP8qim9DFl5qoH2a+Nj9DArI +7SvLFfK9958tURrpuAnmDRzehLIOXzI33WRjtFxKGhLtHOKTRkGHlur3fdcPF0La +lHWV971E6NYXa8diuU3Mmj0CgYBYd+ka3/QYL83dRKNDxp3mg7fPx9ZewI5yFZVh +to6PTTkU2Tclk4FIUl0b5TsGyw06r7fxCMENIBUegwmpXGOZSPifuhUDKSDQrE/O +12knYTNbitG7hy6Pg3JxA77cbTVo1FuAQHjYo+IFohSq7zTP7FtObOrP8XaVZksw +CHiQAQKBgBW4EiA9AAnZ1LOpifAvM7bs0NHg95qTwtAL52WKom2ga2H+lMhxeu6Y +hUSytC/f9kALVcYloZhkLYpO07x1gXmy7f4parMjA4Ex+4vfu3kPd8GiNGZ+AUJD +nnJ1OINY9ziXJZfju7FpVWpkiuPzWCh6y/o3gZ/veq5mIUxuDMVa +-----END RSA PRIVATE KEY----- diff --git a/src/test/ssl/ssl/server-ip-in-dnsname.crt b/src/test/ssl/ssl/server-ip-in-dnsname.crt new file mode 100644 index 0000000000..78ad8d99c8 --- /dev/null +++ b/src/test/ssl/ssl/server-ip-in-dnsname.crt @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC/DCCAeSgAwIBAgIIICIDFRVYUgAwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl +cnZlciBjZXJ0czAeFw0yMjAzMTUyMjU4NTJaFw00OTA3MzEyMjU4NTJaMCAxHjAc +BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMpn5bP1/OfBQR/yvOkOBzxArE1j1YShVa2pcj896+CVDEgV +N5Hluz7KHU/JYzNZCAHb5WAHuvXxKeoj4Ti5be1KsqO0mN1p+RMN7VlCpCpb0AWT +z4z+I8TUhSZnmgghHvfW4RfcZMCcHq1vevVTDxR/cAbDPYpgBCD5F/SZMRyMDw5B +7ILLmft0eqA1nCqavyqBCGZvx1ol8N5BfVdrDXp/rN5997khBWQRZ8g84FZyFZXf +pwp57eu0OGQDzZFXoEL2t4OVld67K5jcclWVxHY6FGcHjCvyqs48PCPOR84anZwj +GsqVOS6250/DWKBQO4KyhkTVf0AW/ICGSMOKkAkCAwEAAaMYMBYwFAYDVR0RBA0w +C4IJMTkyLjAuMi4xMA0GCSqGSIb3DQEBCwUAA4IBAQDIAAH0WJKEpbPN0QihN6SF +UA5WL4ixsBACo9OIAGkSnKeOeVEG5vvgOna0hjQcOcgtI1oCDLhULcjCuwxiIW6y +QntOazyo0sooJr0hEm2WfipvIpQs6W9E1OTcs624BAVfkAwr6WT2VwoIAPcQD2nR +tIQhSUIR9J7Q5WbzuQw7pthQhBfW/UPWw7vajel0r1dflbe0Cgp5WGNfp1kYy+Qf +XW/YjkstZEP1KFm+TF58uxrIDmYboS8EerUREGQixijbI0AfXjShxtiyS63rbdpo +3C0BPj9Yx2VtWi4U0qoef/iLJxJBCLvE/97+duPdKx0AkkOWA9VuenkWLp797UM8 +-----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-ip-in-dnsname.key b/src/test/ssl/ssl/server-ip-in-dnsname.key new file mode 100644 index 0000000000..ba319b001e --- /dev/null +++ b/src/test/ssl/ssl/server-ip-in-dnsname.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAymfls/X858FBH/K86Q4HPECsTWPVhKFVralyPz3r4JUMSBU3 +keW7PsodT8ljM1kIAdvlYAe69fEp6iPhOLlt7Uqyo7SY3Wn5Ew3tWUKkKlvQBZPP +jP4jxNSFJmeaCCEe99bhF9xkwJwerW969VMPFH9wBsM9imAEIPkX9JkxHIwPDkHs +gsuZ+3R6oDWcKpq/KoEIZm/HWiXw3kF9V2sNen+s3n33uSEFZBFnyDzgVnIVld+n +Cnnt67Q4ZAPNkVegQva3g5WV3rsrmNxyVZXEdjoUZweMK/Kqzjw8I85HzhqdnCMa +ypU5LrbnT8NYoFA7grKGRNV/QBb8gIZIw4qQCQIDAQABAoIBAA2kPP4JCTeRddMy +Z/sJIAG2liZNITnkKcMflXyfrsMfKIm/LFSf+CO+OYWEHDR8vqZpbKcxPi+PRnTq +YCaTkM4aZ7nS1S6vEsNu/90xOaFFONr3YFivVDfS3vp8pwv/N3gaumcCSqQUoZis +18urAmwuPp2mEQK/f+e9AhlRLdcvlqDyKm+zMrVixK77Hj5JiEkh3rfZ3onHHKGE +B7T2XRRqnZ4FCN9qLH2pMGUknZ4MGC9SlCyoerXFodb4DhKWQhJDRLjb8qP96r/E +FGSg5WUiAERU/OgODoqZNTeIwIDB/f9NK45dEY3Hw6BsSFfU2VChrlNoVlzFUx2k +yaH5Y4ECgYEA8rht3crh3GTy0jBJjNqB2iul8fkG/uiaiSvERWT/+KZnmV1+JGAW +h2/wvd5apagOJjqKY0bCHMei/qYF9r4yJnkIy4qNper3QUz7TMCjsWduCm8S834A +Z+Vwi3RBGJiQQH9Dfexko5sDjo+w5g4RsH52INCeReInNdxHOv06jZECgYEA1XrR +QNwZlxHt3H93YKmKDZXikqW12Cuq6RSwf5VVdeuzV+pUN+/JaSgEuYsBilW7Q5p2 +gPROi0l8/eUPsBJb+dh1BcGzSjI2Kkzf66QOTG83S7tCPwQhwJUAylFuADvURjPQ +qvqNjbQUomdm2QjBzyWtiFbolqxBgM3dnE6R/vkCgYBYGqQexx83LhmKPGbmTwal +mARzkg59BxfZRN7IxcG4k0a1v98i+xISdYqwkP7cdOU18Tf8k1mwsrKytrcheqaf +mn2bzJ5gJKs9s+DgWmjQ45dpCCqb4hfpnro8lKVwdSifkNKB6gYZ8RHYdMYkq+S1 +6SGeBbv95/qNrXjZq8POUQKBgHyaDwD4dsdCY79LdvYofrenQHOv3Q+rjTo2JT6S +fysww6EQ2M89WiXSgc96Xw/LMl4nDfv+nMmXvyjCRgHS9XRC7yrJAEjSPeM6s4fq +XZ4nW/ML/YKiesDZN3jfRoFEaoX/QFBLpcuLzG9uQw1ymwy5RSxK7b7kE+eGQU82 +XOihAoGBAI3xvT9fG3jRsSuw/8OQBlmDUFZcT0fRPRZ3pg8XlSreAam4b607d2WY +u/bBHIclG3CLJ2EFqBtxl9AQeM0OTweF0KmV3dbtdBmaTbnhbK8/NLYnl5+aosEJ +YrFKD8k8z6z+mYQs+7bAnfRa53TjfC7f24BpgEQyEfKL2fa3PF+J +-----END RSA PRIVATE KEY----- diff --git a/src/test/ssl/sslfiles.mk b/src/test/ssl/sslfiles.mk index 7ed3a30f5c..7a28d82f95 100644 --- a/src/test/ssl/sslfiles.mk +++ b/src/test/ssl/sslfiles.mk @@ -23,6 +23,8 @@ # SERVERS := server-cn-and-alt-names \ server-cn-only \ + server-ip-cn-only \ + server-ip-in-dnsname \ server-single-alt-name \ server-multiple-alt-names \ server-no-names \ diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl index d8eeb085da..fabbe1570a 100644 --- a/src/test/ssl/t/001_ssltests.pl +++ b/src/test/ssl/t/001_ssltests.pl @@ -229,6 +229,30 @@ sub switch_server_cert qr/\Qserver certificate for "common-name.pg-ssltest.test" does not match host name "wronghost.test"\E/ ); +# Test with an IP address in the Common Name. This is a strange corner case that +# nevertheless is supported, as long as the address string matches exactly. +switch_server_cert($node, certfile => 'server-ip-cn-only'); + +$common_connstr = + "$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full"; + +$node->connect_ok("$common_connstr host=192.0.2.1", + "IP address in the Common Name"); + +$node->connect_fails( + "$common_connstr host=192.000.002.001", + "mismatch between host name and server certificate IP address", + expected_stderr => + qr/\Qserver certificate for "192.0.2.1" does not match host name "192.000.002.001"\E/ +); + +# Similarly, we'll also match an IP address in a dNSName SAN. (This is +# long-standing behavior.) +switch_server_cert($node, certfile => 'server-ip-in-dnsname'); + +$node->connect_ok("$common_connstr host=192.0.2.1", + "IP address in a dNSName"); + # Test Subject Alternative Names. switch_server_cert($node, certfile => 'server-multiple-alt-names'); @@ -281,7 +305,7 @@ sub switch_server_cert qr/\Qserver certificate for "single.alt-name.pg-ssltest.test" does not match host name "deep.subdomain.wildcard.pg-ssltest.test"\E/ ); -# Test server certificate with a CN and SANs. Per RFCs 2818 and 6125, the CN +# Test server certificate with a CN and DNS SANs. Per RFCs 2818 and 6125, the CN # should be ignored when the certificate has both. switch_server_cert($node, certfile => 'server-cn-and-alt-names'); From fa25bebb827a8cc4d62f15d564b0093f40b9d44d Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 1 Apr 2022 08:48:44 -0400 Subject: [PATCH 342/772] docs: Changing column type doesn't always require an index rebuild. James Coleman and Robert Haas, reviewed by Matthias van de Meent. Discussion: https://postgr.es/m/CAAaqYe90Ea3RG=A7H-ONvTcx549-oQhp07BrHErwM=AyH2ximg@mail.gmail.com --- doc/src/sgml/ref/alter_table.sgml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/alter_table.sgml b/doc/src/sgml/ref/alter_table.sgml index 5c0735e08a..e610cbbc0e 100644 --- a/doc/src/sgml/ref/alter_table.sgml +++ b/doc/src/sgml/ref/alter_table.sgml @@ -1366,7 +1366,13 @@ WITH ( MODULUS numeric_literal, REM existing column, if the USING clause does not change the column contents and the old type is either binary coercible to the new type or an unconstrained domain over the new type, a table rewrite is not - needed; but any indexes on the affected columns must still be rebuilt. + needed. However, indexes must always be rebuilt unless the system can + verify that the new index would be logically equivalent to the existing + one. For example, if the collation for a column has been changed an index + rebuild is always required because the new sort order might be different. + However, in the absence of a collation change, a column can be changed + from text to varchar (or vice versa) without + rebuilding the indexes because these data types sort identically. Table and/or index rebuilds may take a significant amount of time for a large table; and will temporarily require as much as double the disk space. From c1932e542863f0f646f005b3492452acc57c7e66 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 1 Apr 2022 15:41:44 +0200 Subject: [PATCH 343/772] libpq: Allow IP address SANs in server certificates The current implementation supports exactly one IP address in a server certificate's Common Name, which is brittle (the strings must match exactly). This patch adds support for IPv4 and IPv6 addresses in a server's Subject Alternative Names. Per discussion on-list: - If the client's expected host is an IP address, we allow fallback to the Subject Common Name if an iPAddress SAN is not present, even if a dNSName is present. This matches the behavior of NSS, in violation of the relevant RFCs. - We also, counter-intuitively, match IP addresses embedded in dNSName SANs. From inspection this appears to have been the behavior since the SAN matching feature was introduced in acd08d76. - Unlike NSS, we don't map IPv4 to IPv6 addresses, or vice-versa. Author: Jacob Champion Co-authored-by: Kyotaro Horiguchi Co-authored-by: Daniel Gustafsson Discussion: https://www.postgresql.org/message-id/flat/9f5f20974cd3a4091a788cf7f00ab663d5fcdffe.camel@vmware.com --- configure | 2 +- configure.ac | 1 + doc/src/sgml/libpq.sgml | 21 ++- src/include/pg_config.h.in | 3 + src/interfaces/libpq/fe-secure-common.c | 104 +++++++++++++ src/interfaces/libpq/fe-secure-common.h | 4 + src/interfaces/libpq/fe-secure-openssl.c | 143 ++++++++++++++++-- .../conf/server-cn-and-ip-alt-names.config | 24 +++ src/test/ssl/conf/server-ip-alt-names.config | 19 +++ .../conf/server-ip-cn-and-alt-names.config | 21 +++ .../server-ip-cn-and-dns-alt-names.config | 21 +++ .../ssl/ssl/server-cn-and-ip-alt-names.crt | 20 +++ .../ssl/ssl/server-cn-and-ip-alt-names.key | 27 ++++ src/test/ssl/ssl/server-ip-alt-names.crt | 19 +++ src/test/ssl/ssl/server-ip-alt-names.key | 27 ++++ .../ssl/ssl/server-ip-cn-and-alt-names.crt | 19 +++ .../ssl/ssl/server-ip-cn-and-alt-names.key | 27 ++++ .../ssl/server-ip-cn-and-dns-alt-names.crt | 20 +++ .../ssl/server-ip-cn-and-dns-alt-names.key | 27 ++++ src/test/ssl/sslfiles.mk | 4 + src/test/ssl/t/001_ssltests.pl | 98 ++++++++++++ src/tools/msvc/Solution.pm | 1 + 22 files changed, 635 insertions(+), 17 deletions(-) create mode 100644 src/test/ssl/conf/server-cn-and-ip-alt-names.config create mode 100644 src/test/ssl/conf/server-ip-alt-names.config create mode 100644 src/test/ssl/conf/server-ip-cn-and-alt-names.config create mode 100644 src/test/ssl/conf/server-ip-cn-and-dns-alt-names.config create mode 100644 src/test/ssl/ssl/server-cn-and-ip-alt-names.crt create mode 100644 src/test/ssl/ssl/server-cn-and-ip-alt-names.key create mode 100644 src/test/ssl/ssl/server-ip-alt-names.crt create mode 100644 src/test/ssl/ssl/server-ip-alt-names.key create mode 100644 src/test/ssl/ssl/server-ip-cn-and-alt-names.crt create mode 100644 src/test/ssl/ssl/server-ip-cn-and-alt-names.key create mode 100644 src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.crt create mode 100644 src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.key diff --git a/configure b/configure index 8b361e211b..c5e2769701 100755 --- a/configure +++ b/configure @@ -15982,7 +15982,7 @@ fi LIBS_including_readline="$LIBS" LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'` -for ac_func in backtrace_symbols clock_gettime copyfile fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memset_s poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink readv setproctitle setproctitle_fast setsid shm_open strchrnul strsignal symlink syncfs sync_file_range uselocale wcstombs_l writev +for ac_func in backtrace_symbols clock_gettime copyfile fdatasync getifaddrs getpeerucred getrlimit inet_pton kqueue mbstowcs_l memset_s poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink readv setproctitle setproctitle_fast setsid shm_open strchrnul strsignal symlink syncfs sync_file_range uselocale wcstombs_l writev do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" diff --git a/configure.ac b/configure.ac index 68ade8f7a6..6a48982c23 100644 --- a/configure.ac +++ b/configure.ac @@ -1787,6 +1787,7 @@ AC_CHECK_FUNCS(m4_normalize([ getifaddrs getpeerucred getrlimit + inet_pton kqueue mbstowcs_l memset_s diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index 0b2a8720f0..1c20901c3c 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -8356,16 +8356,31 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*) In verify-full mode, the host name is matched against the - certificate's Subject Alternative Name attribute(s), or against the - Common Name attribute if no Subject Alternative Name of type dNSName is + certificate's Subject Alternative Name attribute(s) (SAN), or against the + Common Name attribute if no SAN of type dNSName is present. If the certificate's name attribute starts with an asterisk (*), the asterisk will be treated as a wildcard, which will match all characters except a dot (.). This means the certificate will not match subdomains. If the connection is made using an IP address instead of a host name, the - IP address will be matched (without doing any DNS lookups). + IP address will be matched (without doing any DNS lookups) against SANs of + type iPAddress or dNSName. If no + iPAddress SAN is present and no + matching dNSName SAN is present, the host IP address is + matched against the Common Name attribute. + + + For backward compatibility with earlier versions of PostgreSQL, the host + IP address is verified in a manner different + from RFC 6125. + The host IP address is always matched against dNSName + SANs as well as iPAddress SANs, and can be matched + against the Common Name attribute if no relevant SANs exist. + + + To allow server certificate verification, one or more root certificates must be placed in the file ~/.postgresql/root.crt diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 9e2ca83993..13a2049df4 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -283,6 +283,9 @@ /* Define to 1 if you have the `inet_aton' function. */ #undef HAVE_INET_ATON +/* Define to 1 if you have the `inet_pton' function. */ +#undef HAVE_INET_PTON + /* Define to 1 if the system has the type `int64'. */ #undef HAVE_INT64 diff --git a/src/interfaces/libpq/fe-secure-common.c b/src/interfaces/libpq/fe-secure-common.c index bd46f08fae..165a6ed9b7 100644 --- a/src/interfaces/libpq/fe-secure-common.c +++ b/src/interfaces/libpq/fe-secure-common.c @@ -19,6 +19,8 @@ #include "postgres_fe.h" +#include + #include "fe-secure-common.h" #include "libpq-int.h" @@ -144,6 +146,108 @@ pq_verify_peer_name_matches_certificate_name(PGconn *conn, return result; } +/* + * Check if an IP address from a server's certificate matches the peer's + * hostname (which must itself be an IPv4/6 address). + * + * Returns 1 if the address matches, and 0 if it does not. On error, returns + * -1, and sets the libpq error message. + * + * A string representation of the certificate's IP address is returned in + * *store_name. The caller is responsible for freeing it. + */ +int +pq_verify_peer_name_matches_certificate_ip(PGconn *conn, + const unsigned char *ipdata, + size_t iplen, + char **store_name) +{ + char *addrstr; + int match = 0; + char *host = conn->connhost[conn->whichhost].host; + int family; + char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"]; + char sebuf[PG_STRERROR_R_BUFLEN]; + + *store_name = NULL; + + if (!(host && host[0] != '\0')) + { + appendPQExpBufferStr(&conn->errorMessage, + libpq_gettext("host name must be specified\n")); + return -1; + } + + /* + * The data from the certificate is in network byte order. Convert our + * host string to network-ordered bytes as well, for comparison. (The host + * string isn't guaranteed to actually be an IP address, so if this + * conversion fails we need to consider it a mismatch rather than an + * error.) + */ + if (iplen == 4) + { + /* IPv4 */ + struct in_addr addr; + + family = AF_INET; + + /* + * The use of inet_aton() is deliberate; we accept alternative IPv4 + * address notations that are accepted by inet_aton() but not + * inet_pton() as server addresses. + */ + if (inet_aton(host, &addr)) + { + if (memcmp(ipdata, &addr.s_addr, iplen) == 0) + match = 1; + } + } + /* + * If they don't have inet_pton(), skip this. Then, an IPv6 address in a + * certificate will cause an error. + */ +#ifdef HAVE_INET_PTON + else if (iplen == 16) + { + /* IPv6 */ + struct in6_addr addr; + + family = AF_INET6; + + if (inet_pton(AF_INET6, host, &addr) == 1) + { + if (memcmp(ipdata, &addr.s6_addr, iplen) == 0) + match = 1; + } + } +#endif + else + { + /* + * Not IPv4 or IPv6. We could ignore the field, but leniency seems + * wrong given the subject matter. + */ + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("certificate contains IP address with invalid length %lu\n"), + (unsigned long) iplen); + return -1; + } + + /* Generate a human-readable representation of the certificate's IP. */ + addrstr = pg_inet_net_ntop(family, ipdata, 8 * iplen, tmp, sizeof(tmp)); + if (!addrstr) + { + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("could not convert certificate's IP address to string: %s\n"), + strerror_r(errno, sebuf, sizeof(sebuf))); + return -1; + } + + *store_name = strdup(addrstr); + return match; +} + /* * Verify that the server certificate matches the hostname we connected to. * diff --git a/src/interfaces/libpq/fe-secure-common.h b/src/interfaces/libpq/fe-secure-common.h index 1cca6d785a..d18db7138c 100644 --- a/src/interfaces/libpq/fe-secure-common.h +++ b/src/interfaces/libpq/fe-secure-common.h @@ -21,6 +21,10 @@ extern int pq_verify_peer_name_matches_certificate_name(PGconn *conn, const char *namedata, size_t namelen, char **store_name); +extern int pq_verify_peer_name_matches_certificate_ip(PGconn *conn, + const unsigned char *addrdata, + size_t addrlen, + char **store_name); extern bool pq_verify_peer_name_matches_certificate(PGconn *conn); #endif /* FE_SECURE_COMMON_H */ diff --git a/src/interfaces/libpq/fe-secure-openssl.c b/src/interfaces/libpq/fe-secure-openssl.c index 0cba5c5cf2..24a598b6e4 100644 --- a/src/interfaces/libpq/fe-secure-openssl.c +++ b/src/interfaces/libpq/fe-secure-openssl.c @@ -72,6 +72,9 @@ static int verify_cb(int ok, X509_STORE_CTX *ctx); static int openssl_verify_peer_name_matches_certificate_name(PGconn *conn, ASN1_STRING *name, char **store_name); +static int openssl_verify_peer_name_matches_certificate_ip(PGconn *conn, + ASN1_OCTET_STRING *addr_entry, + char **store_name); static void destroy_ssl_system(void); static int initialize_SSL(PGconn *conn); static PostgresPollingStatusType open_client_SSL(PGconn *); @@ -509,6 +512,56 @@ openssl_verify_peer_name_matches_certificate_name(PGconn *conn, ASN1_STRING *nam return pq_verify_peer_name_matches_certificate_name(conn, (const char *) namedata, len, store_name); } +/* + * OpenSSL-specific wrapper around + * pq_verify_peer_name_matches_certificate_ip(), converting the + * ASN1_OCTET_STRING into a plain C string. + */ +static int +openssl_verify_peer_name_matches_certificate_ip(PGconn *conn, + ASN1_OCTET_STRING *addr_entry, + char **store_name) +{ + int len; + const unsigned char *addrdata; + + /* Should not happen... */ + if (addr_entry == NULL) + { + appendPQExpBufferStr(&conn->errorMessage, + libpq_gettext("SSL certificate's address entry is missing\n")); + return -1; + } + + /* + * GEN_IPADD is an OCTET STRING containing an IP address in network byte + * order. + */ +#ifdef HAVE_ASN1_STRING_GET0_DATA + addrdata = ASN1_STRING_get0_data(addr_entry); +#else + addrdata = ASN1_STRING_data(addr_entry); +#endif + len = ASN1_STRING_length(addr_entry); + + return pq_verify_peer_name_matches_certificate_ip(conn, addrdata, len, store_name); +} + +static bool +is_ip_address(const char *host) +{ + struct in_addr dummy4; +#ifdef HAVE_INET_PTON + struct in6_addr dummy6; +#endif + + return inet_aton(host, &dummy4) +#ifdef HAVE_INET_PTON + || (inet_pton(AF_INET6, host, &dummy6) == 1) +#endif + ; +} + /* * Verify that the server certificate matches the hostname we connected to. * @@ -522,6 +575,36 @@ pgtls_verify_peer_name_matches_certificate_guts(PGconn *conn, STACK_OF(GENERAL_NAME) * peer_san; int i; int rc = 0; + char *host = conn->connhost[conn->whichhost].host; + int host_type; + bool check_cn = true; + + Assert(host && host[0]); /* should be guaranteed by caller */ + + /* + * We try to match the NSS behavior here, which is a slight departure from + * the spec but seems to make more intuitive sense: + * + * If connhost contains a DNS name, and the certificate's SANs contain any + * dNSName entries, then we'll ignore the Subject Common Name entirely; + * otherwise, we fall back to checking the CN. (This behavior matches the + * RFC.) + * + * If connhost contains an IP address, and the SANs contain iPAddress + * entries, we again ignore the CN. Otherwise, we allow the CN to match, + * EVEN IF there is a dNSName in the SANs. (RFC 6125 prohibits this: "A + * client MUST NOT seek a match for a reference identifier of CN-ID if the + * presented identifiers include a DNS-ID, SRV-ID, URI-ID, or any + * application-specific identifier types supported by the client.") + * + * NOTE: Prior versions of libpq did not consider iPAddress entries at + * all, so this new behavior might break a certificate that has different + * IP addresses in the Subject CN and the SANs. + */ + if (is_ip_address(host)) + host_type = GEN_IPADD; + else + host_type = GEN_DNS; /* * First, get the Subject Alternative Names (SANs) from the certificate, @@ -537,38 +620,62 @@ pgtls_verify_peer_name_matches_certificate_guts(PGconn *conn, for (i = 0; i < san_len; i++) { const GENERAL_NAME *name = sk_GENERAL_NAME_value(peer_san, i); + char *alt_name = NULL; - if (name->type == GEN_DNS) + if (name->type == host_type) { - char *alt_name; + /* + * This SAN is of the same type (IP or DNS) as our host name, + * so don't allow a fallback check of the CN. + */ + check_cn = false; + } + if (name->type == GEN_DNS) + { (*names_examined)++; rc = openssl_verify_peer_name_matches_certificate_name(conn, name->d.dNSName, &alt_name); + } + else if (name->type == GEN_IPADD) + { + (*names_examined)++; + rc = openssl_verify_peer_name_matches_certificate_ip(conn, + name->d.iPAddress, + &alt_name); + } - if (alt_name) - { - if (!*first_name) - *first_name = alt_name; - else - free(alt_name); - } + if (alt_name) + { + if (!*first_name) + *first_name = alt_name; + else + free(alt_name); } + if (rc != 0) + { + /* + * Either we hit an error or a match, and either way we should + * not fall back to the CN. + */ + check_cn = false; break; + } } sk_GENERAL_NAME_pop_free(peer_san, GENERAL_NAME_free); } /* - * If there is no subjectAltName extension of type dNSName, check the + * If there is no subjectAltName extension of the matching type, check the * Common Name. * * (Per RFC 2818 and RFC 6125, if the subjectAltName extension of type - * dNSName is present, the CN must be ignored.) + * dNSName is present, the CN must be ignored. We break this rule if host + * is an IP address; see the comment above.) */ - if (*names_examined == 0) + if (check_cn) { X509_NAME *subject_name; @@ -581,10 +688,20 @@ pgtls_verify_peer_name_matches_certificate_guts(PGconn *conn, NID_commonName, -1); if (cn_index >= 0) { + char *common_name = NULL; + (*names_examined)++; rc = openssl_verify_peer_name_matches_certificate_name(conn, X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subject_name, cn_index)), - first_name); + &common_name); + + if (common_name) + { + if (!*first_name) + *first_name = common_name; + else + free(common_name); + } } } } diff --git a/src/test/ssl/conf/server-cn-and-ip-alt-names.config b/src/test/ssl/conf/server-cn-and-ip-alt-names.config new file mode 100644 index 0000000000..a6fa09bad3 --- /dev/null +++ b/src/test/ssl/conf/server-cn-and-ip-alt-names.config @@ -0,0 +1,24 @@ +# An OpenSSL format CSR config file for creating a server certificate. +# +# This certificate contains a CN and SANs for both IPv4 and IPv6. + + +[ req ] +distinguished_name = req_distinguished_name +req_extensions = v3_req +prompt = no + +[ req_distinguished_name ] +# Note: According to RFC 2818 and 6125, the CN is ignored, when DNS names are +# present in the SANs. But they are silent on whether the CN is checked when IP +# addresses are present. +CN = common-name.pg-ssltest.test +OU = PostgreSQL test suite + +# For Subject Alternative Names +[ v3_req ] +subjectAltName = @alt_names + +[ alt_names ] +IP.1 = 192.0.2.1 +IP.2 = 2001:DB8::1 diff --git a/src/test/ssl/conf/server-ip-alt-names.config b/src/test/ssl/conf/server-ip-alt-names.config new file mode 100644 index 0000000000..c22f22951a --- /dev/null +++ b/src/test/ssl/conf/server-ip-alt-names.config @@ -0,0 +1,19 @@ +# An OpenSSL format CSR config file for creating a server certificate. +# +# This certificate has a two IP-address SANs, and no CN. + +[ req ] +distinguished_name = req_distinguished_name +req_extensions = v3_req +prompt = no + +[ req_distinguished_name ] +OU = PostgreSQL test suite + +# For Subject Alternative Names +[ v3_req ] +subjectAltName = @alt_names + +[ alt_names ] +IP.1 = 192.0.2.1 +IP.2 = 2001:DB8::1 diff --git a/src/test/ssl/conf/server-ip-cn-and-alt-names.config b/src/test/ssl/conf/server-ip-cn-and-alt-names.config new file mode 100644 index 0000000000..a4087f0a18 --- /dev/null +++ b/src/test/ssl/conf/server-ip-cn-and-alt-names.config @@ -0,0 +1,21 @@ +# An OpenSSL format CSR config file for creating a server certificate. +# +# This certificate contains both a CN and SANs in IP address format. + + +[ req ] +distinguished_name = req_distinguished_name +req_extensions = v3_req +prompt = no + +[ req_distinguished_name ] +CN = 192.0.2.1 +OU = PostgreSQL test suite + +# For Subject Alternative Names +[ v3_req ] +subjectAltName = @alt_names + +[ alt_names ] +IP.1 = 192.0.2.2 +IP.2 = 2001:DB8::1 diff --git a/src/test/ssl/conf/server-ip-cn-and-dns-alt-names.config b/src/test/ssl/conf/server-ip-cn-and-dns-alt-names.config new file mode 100644 index 0000000000..7121803b49 --- /dev/null +++ b/src/test/ssl/conf/server-ip-cn-and-dns-alt-names.config @@ -0,0 +1,21 @@ +# An OpenSSL format CSR config file for creating a server certificate. +# +# This certificate contains both a CN and SANs in IP address format. + + +[ req ] +distinguished_name = req_distinguished_name +req_extensions = v3_req +prompt = no + +[ req_distinguished_name ] +CN = 192.0.2.1 +OU = PostgreSQL test suite + +# For Subject Alternative Names +[ v3_req ] +subjectAltName = @alt_names + +[ alt_names ] +DNS.1 = dns1.alt-name.pg-ssltest.test +DNS.2 = dns2.alt-name.pg-ssltest.test diff --git a/src/test/ssl/ssl/server-cn-and-ip-alt-names.crt b/src/test/ssl/ssl/server-cn-and-ip-alt-names.crt new file mode 100644 index 0000000000..4e58c85ccb --- /dev/null +++ b/src/test/ssl/ssl/server-cn-and-ip-alt-names.crt @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDLzCCAhegAwIBAgIIICERKRE1UQAwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl +cnZlciBjZXJ0czAeFw0yMTExMjkxOTM1NTFaFw00OTA0MTYxOTM1NTFaMEYxHjAc +BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTEkMCIGA1UEAwwbY29tbW9uLW5h +bWUucGctc3NsdGVzdC50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA6+8IYKAFnZ7V+fDo1cyMpbGBLzCfJOQ/1o2jOGP4+GjpsZgv6S6UT2MheC8M +iiEFrYwdsSIZyYc3jEZrluy/UuR0bCGtqU92BCqa0iBLhvHOgjR588u253eLxQtQ +8iJn11QPrKMk35nMkmY8GfHt4sGFbvBL6+GpipHq7a6cde3Z+v4kCB5dKMYDUDtm +3mJmviuGNAu5wOqItk2Yi5dwJs1054007KNH0Il43urxiOfnkLS0cG5kehboPf86 +vxBt3iHByrU/9/DY5IvQCfSXVNa6rb5w5/pGja9aCei6Mv1jQY/V8SMQTga+MOsA +0WB9akxMi2NxwS2+BQ4k/McPlwIDAQABoyUwIzAhBgNVHREEGjAYhwTAAAIBhxAg +AQ24AAAAAAAAAAAAAAABMA0GCSqGSIb3DQEBCwUAA4IBAQAQLo2RzC07dG9p+J3A +W6C0p3Y+Os/YE2D9wfp4TIDTZxcRUQZ0S6ahF1N6sp8l9KHBJHPU1cUpRAU1oD+Y +SqmnP/VJRRDTTj9Ytdc/Vuo2jeLpSYhVKrCqtjqIrCwYJFoYRmMoxTtJGlwA0hSd +kwo3XYrALPUQWUErTYPvNfDNIuUwqUXNfS0CXuIOVN3LJ+shegg6Pwbh9B5T9NHx +kH+HswajhdpdnZIgh0FYTlTCPILDrB49aOWwqLa54AUA6WXa35hPsP8SoqL9Eucq +ifPhBYyadsjOb+70N8GbbAsDPN1jCX9L8RuNcEkxSCKCYx91cWXh7K5KMPuGlzB7 +j8xB +-----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-cn-and-ip-alt-names.key b/src/test/ssl/ssl/server-cn-and-ip-alt-names.key new file mode 100644 index 0000000000..837eef996d --- /dev/null +++ b/src/test/ssl/ssl/server-cn-and-ip-alt-names.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA6+8IYKAFnZ7V+fDo1cyMpbGBLzCfJOQ/1o2jOGP4+GjpsZgv +6S6UT2MheC8MiiEFrYwdsSIZyYc3jEZrluy/UuR0bCGtqU92BCqa0iBLhvHOgjR5 +88u253eLxQtQ8iJn11QPrKMk35nMkmY8GfHt4sGFbvBL6+GpipHq7a6cde3Z+v4k +CB5dKMYDUDtm3mJmviuGNAu5wOqItk2Yi5dwJs1054007KNH0Il43urxiOfnkLS0 +cG5kehboPf86vxBt3iHByrU/9/DY5IvQCfSXVNa6rb5w5/pGja9aCei6Mv1jQY/V +8SMQTga+MOsA0WB9akxMi2NxwS2+BQ4k/McPlwIDAQABAoIBAQCuNFKVNdKvrUYF +RLJGmsAG3+eo9lern7TbML2ht39vu9dBwEMwA6qSa3mdCfBSVUuh9uE9lxY/TU3g +j2aFi81A4VptNPjLGNblAKhMGnhp7UUzspeRQYuNoSFcnpxoDKtrvK/OIq/pQeBh +AIfECHRDh+yEG32Tb44FuPQkB1eTYl8xbMEImrhNUaSjJk7tTsmydHy0DjmqHVKX +HUj0TREfDBDOBiHtY0XV6Pu3bnqDH/TKLTfUf3UdfTuay3Yai9aEcRPWp9GrMO7G +axsKCifTz6177gyr6Fv8HLeMZMh9rMZRn3e0zfaF6vrH1QnZZOts5jpUa0KugSCd +//uC0iNxAoGBAPXVc3b+o3hY5gcwwpaW6JtsarDrmNRxrizqIDG7NgpqwdFXgTi6 +6q0t2pjv81ATqij69IcPkNSissyR4OEKnu/OFJWzreg8yLi75WHKi0E/6msHpwRk +d1yP0Zgd05ots/yOjDSp593RagaPVvHBxMECZ/Tm3B+Tq55Azudd/zvLAoGBAPWw +xf0oUEJl6NdUZD6K7eFc6jf8yrpD85dldeko6LeN8x0XlKKWvUDJ2+3oizXoQvCm +8by6KOYEIo4MrtXuy9MmtPWfNvRBr+hsUHchIj7IgFa9bKXyK2FnJqu/8CbEymli +eZu7hoOhelurhnFy1zSqwNO4GC+kw60Y/BO3Z1nlAoGAVOyYJtNwxXJwhKtjjYI0 +ePzLHrNE6J8c/Ick+AkkchTPP/JqwZ5Q0+KzUYITG+avMdkAAGhwMATEn8cFWLjC +jzUyB0U7Hq9g5/CBHXdLBA+Ae9j46ZuLYH6OeW5UWz7OnsDfzpGjeA2QAxQhhQLb +ZZHfN8tI39+zucfJskPWmGECgYEAg9guF1Fn6InJrqwR82IYj6SN6CeXHufSM392 +C/4xDDd3rDf4QlwECV2J0RzGf9I5Ae2EshNwWScE6Be0RweTh6cw2tJq6h7J6D8f +2x4Dw49TF7klMdRIJUf2f5pLpHJccLswqTqzz7V69PCSABVxmUi8m6EiEYconp5W +v7nfE2UCgYALrEqzncuSIX3q6TVAjnzT7gO4h8h2TUekIWdHQFldFx8R7Kncggnd +48gQqhewchNR83UCcd7pPsCcTqu6UR1QRdq/DV5P6J3xdZ2iS/2gCM6hvWIvKZEv +/ClnkyFCOW7zX6RKIXtRYZTV1kz3TajApi34RTIeIMTieaCarnBJbA== +-----END RSA PRIVATE KEY----- diff --git a/src/test/ssl/ssl/server-ip-alt-names.crt b/src/test/ssl/ssl/server-ip-alt-names.crt new file mode 100644 index 0000000000..8a1bc620bb --- /dev/null +++ b/src/test/ssl/ssl/server-ip-alt-names.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDCTCCAfGgAwIBAgIIICERKREEUAAwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl +cnZlciBjZXJ0czAeFw0yMTExMjkxOTA0NTBaFw00OTA0MTYxOTA0NTBaMCAxHjAc +BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAOM8yB6aVWb17ujr3ayU62mxHQoqn4CvG9yXlJvGOGv/ursW +Vs0UYJdc96LsNZN1szdm9ayNzCIw3eja+ULsjxCi6+3LM4pO76IORL/XFamlTPYb +BZ4pHdZVB0nnZAAnWCZPyXdnjOKQ5+8unVXkfibkjj8UELBJ2snehsOa+CTkOBez +zxYMqxAgbywLIYsW448brun7UXpWmqbGK+SsdGaIZ5Sb7Zezc5lt6CrLemTZTHHK +7l4WZFCCEi4t3sgO8o1vDELD/IE5G8lyXvIdgJg6t8ssper7iCw6S8x+okhjiSjT +vDLU2g4AanqZRZB49aPwTo0QUcJA2BCJxL9xLy8CAwEAAaMlMCMwIQYDVR0RBBow +GIcEwAACAYcQIAENuAAAAAAAAAAAAAAAATANBgkqhkiG9w0BAQsFAAOCAQEAwZJ+ +8KpABTlMEgKnHIYb35ItGhtFiTLQta9RkXx7vaeDwpOdPP/IvuvpjpQZkobRgBsk +bNM0KuJpd2mSTphQAt6eKQIdcPrkzvc/Yh9OK3YNLUAbu/ZhBUnBvFnUL4wn2f1U +mfO+m8P/LxybwqKx7r1mbaB+tP3RTxxLcIMvm9ECPQEoBntfEL325Wdoj+WuQH5Y +IvcM6FaCTkQsNIPbaBD5l5MhMLHRULZujbDjXqGSvRMQfns6np/biMjNdQA8NZ5z +STeUFvkQbCxoA0YYLgoSHL5KhZjXrg2g+T+2TUyCTR/91xf9OoOjBZdixR0S0DzJ +B1+5vnUjZaCfnSEA7A== +-----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-ip-alt-names.key b/src/test/ssl/ssl/server-ip-alt-names.key new file mode 100644 index 0000000000..b210b3a991 --- /dev/null +++ b/src/test/ssl/ssl/server-ip-alt-names.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEA4zzIHppVZvXu6OvdrJTrabEdCiqfgK8b3JeUm8Y4a/+6uxZW +zRRgl1z3ouw1k3WzN2b1rI3MIjDd6Nr5QuyPEKLr7cszik7vog5Ev9cVqaVM9hsF +nikd1lUHSedkACdYJk/Jd2eM4pDn7y6dVeR+JuSOPxQQsEnayd6Gw5r4JOQ4F7PP +FgyrECBvLAshixbjjxuu6ftRelaapsYr5Kx0ZohnlJvtl7NzmW3oKst6ZNlMccru +XhZkUIISLi3eyA7yjW8MQsP8gTkbyXJe8h2AmDq3yyyl6vuILDpLzH6iSGOJKNO8 +MtTaDgBqeplFkHj1o/BOjRBRwkDYEInEv3EvLwIDAQABAoIBACp3uY6+mSdc3wF4 +0zzlt/lQuHSl8plCIJrhWUyjhvfoGyXLzv0Uydh/72frbTfZz1yTSWauOXBKYa6a +/eqb+0DIsf8G8uLuTaqjsAWKVOoXkoKMGkistn7P9UTCkdXVhIvkbWp7V8EgA7iX +pZ/fzBPIsyzmuxe3NcR0ags0cxuxkNuu+YXDv1oTedmT2wS3CZq1d/T1Y/EOVIf8 +Iznd2aOverlsnt6iiQ3ZWdG/W5F8FhnrR/rrBdYsdCv6TH/KUYexnDOUYpayjDbu +oAKnifPp6UqiOM4SuBL83OAz19jptp5vpF370BEVRs3eK0q+zo/mETjv9HsXdolZ +lfoXA0ECgYEA/7nb2azbq/2muvXCh1ZxCEbn3mt8KXoJP/xkx/v9eEc/cc5Q9e0V +2oGfjC2hSE+bjOWMwiUMD6uU+iRjhz5A3IvUxnoSdoL7H9p0hTqLMyP7dTDkoVF5 +aEuLMaiI5YEnfAFu9L5h8ZKieoQTBoscT06wnGjh9pBV9bthfTKA7ksCgYEA43sb +55m9WL4kWCPwOAp3vdEAFyxzmZHlO26sEQOU/m5aN01pumYybBruziEXMI96yfTj +VmXKReeYb6XUiCcs3fLSipD/+8/8CsjO4uMORtxWumXe8AbKZfysGFzL7wJlByGT +38AGQwIG/XD8cKnaiEMX4E/3Owbcoxwixo3WZC0CgYEAovaqJ9mEU+Jc8h/TS7PG +bGPjN1Z/1V6zrlcFUnw/Vvrwb3HvHglsN8cLCaW6df5lPjC6tq4tNX8+fPnbg0Ak +zWc+vQzl3ygxKGdqgcyBEKIJiPETgcoN+GzL02V3d+oKY3f2YXlBqVSsvi6UgUL9 +U3zuB36/IQVyAhrbUZFxoGkCgYEAnaFAO+Nvrp/LhXwZyGuQf+rkmipGTIMpil5t +QzjtNMV5JFszSWPpyrl7A0Ew1YiG+I0GP2c3m+sY2TzbIiGrWH0b4cMKbw63Qy3V +FqlpyjaCrpVKv56k/7jv883RzuQk56Uf1+szK5mrCFITy2oXsVZ0pA4lbjSaDTjA +7D968V0CgYEA+qKqXKL98+c5CMPnpf+0B1x2zgyUym1ouPfon2x5fhK84T53zDMA +zfdUJ/SOZw6/c9vRF7RL8h+ZfFdIyoAXv4Tt6mIiZe7P+AUVg6XgJ0ce2MUSeWjI +W8D4WdSi0jyqr99TuVBWhbTZJviMB3pHqKaHQ07hnd/lPtvzsiH12qk= +-----END RSA PRIVATE KEY----- diff --git a/src/test/ssl/ssl/server-ip-cn-and-alt-names.crt b/src/test/ssl/ssl/server-ip-cn-and-alt-names.crt new file mode 100644 index 0000000000..2be02feb03 --- /dev/null +++ b/src/test/ssl/ssl/server-ip-cn-and-alt-names.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDHTCCAgWgAwIBAgIIICIBBBQ2MQAwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl +cnZlciBjZXJ0czAeFw0yMjAxMDQyMjM2MzFaFw00OTA1MjIyMjM2MzFaMDQxHjAc +BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTESMBAGA1UEAwwJMTkyLjAuMi4x +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwmqTdQJfs2Ti9tPitYp2 +27I0HvL/kNSgA6egFr0foRo0BorwJNIzdbV0+EnsfiBNTWL5It26gqO7UP3ms8t2 +vHD5gkXfT+f6ts0lVJEcIOkUD/8ws4Ic9Y4uPqb4gN+pUKqcxtmLW1TYk84MBK59 +Xz4yPPS6N+G/DMMeFHTNkM9EQwn/+DC3fDsWdGYM2GRWDTJGg1A5tSUcF+seu7i1 +Vg7XajBfsvgAUAsrAxV+X/sLZh94HY+paD6wfaI99mY2OXVc/XW/z1r9WQznor65 +ZkonNCaPfavqPG5vqnab9AyQcqPqmX8hf/xrniASBAkqNCctbASrFCIYvCJfGfmX +EQIDAQABoyUwIzAhBgNVHREEGjAYhwTAAAIChxAgAQ24AAAAAAAAAAAAAAABMA0G +CSqGSIb3DQEBCwUAA4IBAQBf7kmYfRYfnWk1OUfY3N1kaNg9piBBlFr9g+OQn9KU +zirkN7s0ZQbCGxV1uJQBKS58NyE414Vorau77379emgYDcCBpDIYpkLiNujVrIOr +ggRFKsFRgxu4/mw0BSgCcV8RPe9SWHZ90Mos7TMCnW/PdxOCD1wD0YMkcs0rwB3l +0Kzc7jDnfOEvmgw/Ysm7v67ps+05Uq5VskQ6WrpSAw6kPD/QMuuBAX8ATPczIaox +zAMyncq1IiSIwG93f3EoQQThdQ70C6G9vLcu9TtL6JAsEMFEzR99gt1Wsqvmgl9W +kStzj1yjIWeo5gIsa4Jgcke1lZviWyrTxHDfyunYE5i5 +-----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-ip-cn-and-alt-names.key b/src/test/ssl/ssl/server-ip-cn-and-alt-names.key new file mode 100644 index 0000000000..54fe80fc68 --- /dev/null +++ b/src/test/ssl/ssl/server-ip-cn-and-alt-names.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAwmqTdQJfs2Ti9tPitYp227I0HvL/kNSgA6egFr0foRo0Borw +JNIzdbV0+EnsfiBNTWL5It26gqO7UP3ms8t2vHD5gkXfT+f6ts0lVJEcIOkUD/8w +s4Ic9Y4uPqb4gN+pUKqcxtmLW1TYk84MBK59Xz4yPPS6N+G/DMMeFHTNkM9EQwn/ ++DC3fDsWdGYM2GRWDTJGg1A5tSUcF+seu7i1Vg7XajBfsvgAUAsrAxV+X/sLZh94 +HY+paD6wfaI99mY2OXVc/XW/z1r9WQznor65ZkonNCaPfavqPG5vqnab9AyQcqPq +mX8hf/xrniASBAkqNCctbASrFCIYvCJfGfmXEQIDAQABAoIBAB6GgVST5NbT9lbu ++d+rN/JSzqA1Yy8oU19/iEFJvJec96I3WnFNl8rZjN4XLUy4YarO6XMyAUDV2Gll +FD4Sqjf4PRTZR7DSKaleGIhoqFP6hK3mUY091rIves9XhBkoBPunbipCqgDTF5ZN +edGaXBECQP0VJ8/yX/7u++AWXthnjDis9X0taZfFg/PYbV7SCJ1Hg1O/wEsgXlnC +7mbL6wkCW0f6700B0x1kKbZqJY95xRqp6Ipq2lIQbJDdGywoj0WzKqNltf9cer+r +cXl8WjeiMvvvpl4uGhckAbzUifUzxN6A3f1fu/XKtOmabMi9t7J4MRfgOgedgtQB +0jaZGSkCgYEA+lBLnNY6M48HX2mdtr86+n41gh69v8Z7oNikJFDZkodrvI8uqE0i +0XwnYPFddt8NbmuUhhuzI2M8RKhGLgdlbKpkSSVafnMfcxRmX2EAtWQgdvX1Iult +752LWdBgSuw2vlzvy3T/GYnjMrXSCGput4amqojMEbvUGvIdSUMdHGMCgYEAxtU1 +WixKPL6aEnYy1f4bybzcNgGtl8PBRz9xw+P46g+ijOPoaG9O73Tr7An11AO003Ot +DHhMW+b8yHLyxoKwS2sU2cN/lKB8xNQYZc1D61RNJlzgnHMXnA0lcH0I3M35fqKr +/71pD1ZP40SSJS+od/KEjW80XzuOdyiXg8q81vsCgYEAnUPLbbsuj+whzrFVlFZr +IKwgxCK6Rn3WeIUEA4kEWUpZxvsSbk0gPgtJ1l9uwFt9Xc2bX/KRRv93Aw/SH+Mn +tvEK1uXwCBgePzgm5W/VeSFyQCthm1CbcHtD7Oa9SPVFo65SPjrAd3QpWVfgoMb1 +zrp7hhMyW0XuCgvpmHjhFk8CgYEAxq/thXM2p+bLLWGhwQcRG5G299zLbBl4PUsf +0uEvLi17gJCKADoiRdSvoAn/9eHSQ26XYRuhKkDzHxcGlOmpY2PYzRa3mXyZ0VIk +Iy5wDWwLQCeVZ6D22cClRfgb8BF/nFTPzVmn72SPpgoyhChQj7PvUynpyrRH07jj +VxYziBsCgYAFr37Xbl0VnXVK+XU+vMwUZjcF4jpoCr7SFZqgRbW2GbYSUoMuPXns +RnJh+Fvi1NUei+E5s1H4P1pVq4p0jFxP4GvH/qvNjnIn/Er3bbqvpox6dWUJXprq +qTQSDIeoDC/V8cyRoIfqPvTVqY8Rgew6GEkv0bAImdxhoSng7vIseg== +-----END RSA PRIVATE KEY----- diff --git a/src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.crt b/src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.crt new file mode 100644 index 0000000000..23c06da01c --- /dev/null +++ b/src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.crt @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDQzCCAiugAwIBAgIIICIBBBQ2MQEwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl +cnZlciBjZXJ0czAeFw0yMjAxMDQyMjM2MzFaFw00OTA1MjIyMjM2MzFaMDQxHjAc +BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTESMBAGA1UEAwwJMTkyLjAuMi4x +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8xddbo/x2TOSIa/br8BN +o/URdTr9+l2R5YojiZKDuLxiQVkgC30PJ2/CNFKIh2nHhRrzknI6sETVtrxZ+9V2 +qRc1yShVu462u0DHPRMIZnZIOZg3hlNB0cRWbOglUKlttIARNEQUcTUyPOtyo4/v ++u0Ej5NTNcHFbFT01vdD9MjQiCO3jKdAwPIb14jTg4C71EpZ+LuelDo4DzF2/XgG +WqUTrgD/XnBU/60PU9Iy3G0nVpx21q6ppn9G7a9R+i8FjBcwW1T+cfsBDWhAv+bi +RmSAkENf8L8TwOlDQUwROkfz3Hz36vuJjdkreQJsiqL0HnrnH5T5G9UzJO86FvZQ +5wIDAQABo0swSTBHBgNVHREEQDA+gh1kbnMxLmFsdC1uYW1lLnBnLXNzbHRlc3Qu +dGVzdIIdZG5zMi5hbHQtbmFtZS5wZy1zc2x0ZXN0LnRlc3QwDQYJKoZIhvcNAQEL +BQADggEBAF+mfaw6iBPzpCgqq830pHRa3Yzm1aezt8SkeRohUYHNv/yCnDSRaqtj +xbENih3lJMSTBL3g0wtTOHfH8ViC/h+lvYELHzXKic7gkjV7H5XETKGr0ZsjBBT2 +4cZQKbD9e0x0HrENXMYgGpBf747qL6uTOVJdG0s15hwpLq47bY5WUjXathejbpxW +prmF8F+xaC52N9P/1VnqguQB909F4x1pyOK7D7tjFu+Y8Je7PHKbb6WY5K6xAv6t +R17CY0749/FotlphquElUR2bs5Zzv5YrjUHPTcbwKvcH5cdNi93/u6NJt2xNAoYf +aZERhX5TA9DYk4gC8OY0yGaYCIj3Dd4= +-----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.key b/src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.key new file mode 100644 index 0000000000..0ace41e0a1 --- /dev/null +++ b/src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEA8xddbo/x2TOSIa/br8BNo/URdTr9+l2R5YojiZKDuLxiQVkg +C30PJ2/CNFKIh2nHhRrzknI6sETVtrxZ+9V2qRc1yShVu462u0DHPRMIZnZIOZg3 +hlNB0cRWbOglUKlttIARNEQUcTUyPOtyo4/v+u0Ej5NTNcHFbFT01vdD9MjQiCO3 +jKdAwPIb14jTg4C71EpZ+LuelDo4DzF2/XgGWqUTrgD/XnBU/60PU9Iy3G0nVpx2 +1q6ppn9G7a9R+i8FjBcwW1T+cfsBDWhAv+biRmSAkENf8L8TwOlDQUwROkfz3Hz3 +6vuJjdkreQJsiqL0HnrnH5T5G9UzJO86FvZQ5wIDAQABAoIBAGv0BFoFMrHyZQLw +xe7Wx6P4QTh+aiu1QgVdw0pk9nojrr62hbSUZRZuWyBBRsBcCW7i+Sgf8lA1QXNV +UeC0e228EPa0It6YEi42JkTJHwHhpVFud7n/X0t4lajnryqTE1UFSp6bXTipFxZW +uSJJ2ZjliRD5rApDcxkY4WJVjKg3aEt7P/DiM8iKGfyE6stq72VjEbJjdViMEcOP +BNf0TiREZz5Mp7jAVWhpen0ebbLOBVWV4/ONNcL+yqR4mCEDUSFGewrTVX4zHL0A +hYk198C5F8sFvEDnFkPco9sXMVanmLoI8sbhP4IIz9g4+GU6kFuj7fUKp11Azqv+ +3WQDKYECgYEA/XG4mmG/g8FG44y42mfZpUXWi1pwU4CQIrhkoU5j7EPQrvRboOOE +Rv95jSwyZu4vCqjyI5FN1jCGTdhmt++R1e//zH6Hqa9Smo+jw7DtAFrCYd1JnCf1 +ToOwsYPHv4P7A8q8kc5vCNIv+AQSlP/wqdVNo3grdf7cGXkMtEY4F9UCgYEA9Yrq +zWdnNGPATuSBqL6TSjQ37oR+dBD6WnGsiDenQkOzyDPFZ3CT1DjJghjEtxc8EfNf +Oo8dMMR2q+5FZQo7WuqONEgyzKePiNR8RK2gOYpgdjN9bih1sAhHR10D26cpwlDJ +bx7D5ZzENLbdZmfEiWwKswnaIhN4yMalgE0mP8sCgYAhzJy12ftUct4lUosEdX0N +EXc/NlxshmSyfKzO5kllJNYbvvLJTg5B+agYL6C5IWKcpVNFcwdSXT5L+2QXe5eT +VGJkvysQchUuD6HjYyD4PyJVMtGyRZHtWpqh0dU9sTg0lUD4oPMl1gIXrVNdE5Tg +0VV9S3VgUxC/ROlw0TyB0QKBgGsVE0NS9hJF8mc1hko2GnwA++d8Rr2NbfElo+2f +/8SJTA1ibpOm6AFkZpTjAl8qtdrKPVyHb16GP47Jkd/3r1z979hjKCxSYul0aWF2 +KusNKvZBjFEPOgv0AEniCb2wUCjbHI3mZ95qGLM4kKOJW4/m21+rS0MTJNjCsQic +HLMzAoGAeCsY09d3m8xGeU+DuTPC6GH7Sgy/NBYqS5VaVNjb2jnuZlW2SSW2oiID +4tXTi4ruKmHC898BfyFxhSMqub+tg3pVqIYADC71rnJLrVyc1SzoWzL7yMT3qFj7 +C7ZYZYmfG9agcZb5NkqKPTfCxkBhWbdgTTgBKVO/xQst8EUgko8= +-----END RSA PRIVATE KEY----- diff --git a/src/test/ssl/sslfiles.mk b/src/test/ssl/sslfiles.mk index 7a28d82f95..cc023667af 100644 --- a/src/test/ssl/sslfiles.mk +++ b/src/test/ssl/sslfiles.mk @@ -22,8 +22,12 @@ # key/certificate pair will be generated for you, signed by the appropriate CA. # SERVERS := server-cn-and-alt-names \ + server-cn-and-ip-alt-names \ server-cn-only \ + server-ip-alt-names \ server-ip-cn-only \ + server-ip-cn-and-alt-names \ + server-ip-cn-and-dns-alt-names \ server-ip-in-dnsname \ server-single-alt-name \ server-multiple-alt-names \ diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl index fabbe1570a..58d2bc336f 100644 --- a/src/test/ssl/t/001_ssltests.pl +++ b/src/test/ssl/t/001_ssltests.pl @@ -305,6 +305,64 @@ sub switch_server_cert qr/\Qserver certificate for "single.alt-name.pg-ssltest.test" does not match host name "deep.subdomain.wildcard.pg-ssltest.test"\E/ ); +SKIP: +{ + skip 'IPv6 addresses in certificates not support on this platform', 1 + unless check_pg_config('#define HAVE_INET_PTON 1'); + + # Test certificate with IP addresses in the SANs. + switch_server_cert($node, certfile => 'server-ip-alt-names'); + + $node->connect_ok("$common_connstr host=192.0.2.1", + "host matching an IPv4 address (Subject Alternative Name 1)"); + + $node->connect_ok( + "$common_connstr host=192.000.002.001", + "host matching an IPv4 address in alternate form (Subject Alternative Name 1)" + ); + + $node->connect_fails( + "$common_connstr host=192.0.2.2", + "host not matching an IPv4 address (Subject Alternative Name 1)", + expected_stderr => + qr/\Qserver certificate for "192.0.2.1" (and 1 other name) does not match host name "192.0.2.2"\E/ + ); + + $node->connect_fails( + "$common_connstr host=192.0.2.1/32", + "IPv4 host with CIDR mask does not match", + expected_stderr => + qr/\Qserver certificate for "192.0.2.1" (and 1 other name) does not match host name "192.0.2.1\/32"\E/ + ); + + $node->connect_ok("$common_connstr host=2001:DB8::1", + "host matching an IPv6 address (Subject Alternative Name 2)"); + + $node->connect_ok( + "$common_connstr host=2001:db8:0:0:0:0:0:1", + "host matching an IPv6 address in alternate form (Subject Alternative Name 2)" + ); + + $node->connect_ok( + "$common_connstr host=2001:db8::0.0.0.1", + "host matching an IPv6 address in mixed form (Subject Alternative Name 2)" + ); + + $node->connect_fails( + "$common_connstr host=::1", + "host not matching an IPv6 address (Subject Alternative Name 2)", + expected_stderr => + qr/\Qserver certificate for "192.0.2.1" (and 1 other name) does not match host name "::1"\E/ + ); + + $node->connect_fails( + "$common_connstr host=2001:DB8::1/128", + "IPv6 host with CIDR mask does not match", + expected_stderr => + qr/\Qserver certificate for "192.0.2.1" (and 1 other name) does not match host name "2001:DB8::1\/128"\E/ + ); +} + # Test server certificate with a CN and DNS SANs. Per RFCs 2818 and 6125, the CN # should be ignored when the certificate has both. switch_server_cert($node, certfile => 'server-cn-and-alt-names'); @@ -323,6 +381,46 @@ sub switch_server_cert qr/\Qserver certificate for "dns1.alt-name.pg-ssltest.test" (and 1 other name) does not match host name "common-name.pg-ssltest.test"\E/ ); +SKIP: +{ + skip 'IPv6 addresses in certificates not support on this platform', 1 + unless check_pg_config('#define HAVE_INET_PTON 1'); + + # But we will fall back to check the CN if the SANs contain only IP addresses. + switch_server_cert($node, certfile => 'server-cn-and-ip-alt-names'); + + $node->connect_ok( + "$common_connstr host=common-name.pg-ssltest.test", + "certificate with both a CN and IP SANs matches CN"); + $node->connect_ok("$common_connstr host=192.0.2.1", + "certificate with both a CN and IP SANs matches SAN 1"); + $node->connect_ok("$common_connstr host=2001:db8::1", + "certificate with both a CN and IP SANs matches SAN 2"); + + # And now the same tests, but with IP addresses and DNS names swapped. + switch_server_cert($node, certfile => 'server-ip-cn-and-alt-names'); + + $node->connect_ok("$common_connstr host=192.0.2.2", + "certificate with both an IP CN and IP SANs 1"); + $node->connect_ok("$common_connstr host=2001:db8::1", + "certificate with both an IP CN and IP SANs 2"); + $node->connect_fails( + "$common_connstr host=192.0.2.1", + "certificate with both an IP CN and IP SANs ignores CN", + expected_stderr => + qr/\Qserver certificate for "192.0.2.2" (and 1 other name) does not match host name "192.0.2.1"\E/ + ); +} + +switch_server_cert($node, certfile => 'server-ip-cn-and-dns-alt-names'); + +$node->connect_ok("$common_connstr host=192.0.2.1", + "certificate with both an IP CN and DNS SANs matches CN"); +$node->connect_ok("$common_connstr host=dns1.alt-name.pg-ssltest.test", + "certificate with both an IP CN and DNS SANs matches SAN 1"); +$node->connect_ok("$common_connstr host=dns2.alt-name.pg-ssltest.test", + "certificate with both an IP CN and DNS SANs matches SAN 2"); + # Finally, test a server certificate that has no CN or SANs. Of course, that's # not a very sensible certificate, but libpq should handle it gracefully. switch_server_cert($node, certfile => 'server-no-names'); diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index ef5476d034..cb2ad6cd29 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -288,6 +288,7 @@ sub GenerateFiles HAVE_HISTORY_TRUNCATE_FILE => undef, HAVE_IFADDRS_H => undef, HAVE_INET_ATON => undef, + HAVE_INET_PTON => 1, HAVE_INT_TIMEZONE => 1, HAVE_INT64 => undef, HAVE_INT8 => undef, From 479b69a4a551465614042bba00694001273d702f Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 1 Apr 2022 11:05:52 -0400 Subject: [PATCH 344/772] Set minimum required version of zstd as 1.4.0. It emerges that our new zstd code depends on features that were not present (or at least not enabled by default) in zstd before 1.4.0. That's already four years old, so there's little reason to try to make our code work with something older. Instead make configure check that zstd is at least 1.4.0, and document this requirement. Justin Pryzby (doc changes by me) Discussion: https://postgr.es/m/efbd94cd1102f99fd1300e44905ee4a994ee2ef6.camel@gunduz.org --- configure | 22 +++++++++++----------- configure.ac | 2 +- doc/src/sgml/installation.sgml | 7 ++++--- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/configure b/configure index c5e2769701..a4b654ad94 100755 --- a/configure +++ b/configure @@ -9092,19 +9092,19 @@ $as_echo "$with_zstd" >&6; } if test "$with_zstd" = yes; then pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libzstd" >&5 -$as_echo_n "checking for libzstd... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libzstd >= 1.4.0" >&5 +$as_echo_n "checking for libzstd >= 1.4.0... " >&6; } if test -n "$ZSTD_CFLAGS"; then pkg_cv_ZSTD_CFLAGS="$ZSTD_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd\""; } >&5 - ($PKG_CONFIG --exists --print-errors "libzstd") 2>&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd >= 1.4.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzstd >= 1.4.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_ZSTD_CFLAGS=`$PKG_CONFIG --cflags "libzstd" 2>/dev/null` + pkg_cv_ZSTD_CFLAGS=`$PKG_CONFIG --cflags "libzstd >= 1.4.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes @@ -9116,12 +9116,12 @@ if test -n "$ZSTD_LIBS"; then pkg_cv_ZSTD_LIBS="$ZSTD_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd\""; } >&5 - ($PKG_CONFIG --exists --print-errors "libzstd") 2>&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzstd >= 1.4.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzstd >= 1.4.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_ZSTD_LIBS=`$PKG_CONFIG --libs "libzstd" 2>/dev/null` + pkg_cv_ZSTD_LIBS=`$PKG_CONFIG --libs "libzstd >= 1.4.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes @@ -9142,14 +9142,14 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - ZSTD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libzstd" 2>&1` + ZSTD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libzstd >= 1.4.0" 2>&1` else - ZSTD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libzstd" 2>&1` + ZSTD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libzstd >= 1.4.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$ZSTD_PKG_ERRORS" >&5 - as_fn_error $? "Package requirements (libzstd) were not met: + as_fn_error $? "Package requirements (libzstd >= 1.4.0) were not met: $ZSTD_PKG_ERRORS diff --git a/configure.ac b/configure.ac index 6a48982c23..44d35e1b5a 100644 --- a/configure.ac +++ b/configure.ac @@ -1073,7 +1073,7 @@ AC_MSG_RESULT([$with_zstd]) AC_SUBST(with_zstd) if test "$with_zstd" = yes; then - PKG_CHECK_MODULES(ZSTD, libzstd) + PKG_CHECK_MODULES(ZSTD, libzstd >= 1.4.0) # We only care about -I, -D, and -L switches; # note that -lzstd will be added by AC_CHECK_LIB below. for pgac_option in $ZSTD_CFLAGS; do diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index dcd1e772c6..df32025a86 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -250,7 +250,7 @@ su - postgres encrypted client connections. OpenSSL is also required for random number generation on platforms that do not have /dev/urandom (except Windows). The minimum - version required is 1.0.1. + required version is 1.0.1. @@ -265,7 +265,7 @@ su - postgres You need LZ4, if you want to support - compression of data with this method; see + compression of data with that method; see and . @@ -274,8 +274,9 @@ su - postgres You need zstd, if you want to support - compression of data with this method; see + compression of data with that method; see . + The minimum required version is 1.4.0. From 465ab24296c27502c81c8c197725cba728b9b057 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 1 Apr 2022 17:12:56 +0200 Subject: [PATCH 345/772] libpq: Fix pkg-config without OpenSSL Do not add OpenSSL dependencies to libpq pkg-config file if OpenSSL is not enabled. Oversight in beff361bc1edc24ee5f8b2073a1e5e4c92ea66eb. Author: Fabrice Fontaine Discussion: https://www.postgresql.org/message-id/flat/20220331163759.32665-1-fontaine.fabrice%40gmail.com --- src/interfaces/libpq/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/interfaces/libpq/Makefile b/src/interfaces/libpq/Makefile index 89bf5e0126..b5fd72a4ac 100644 --- a/src/interfaces/libpq/Makefile +++ b/src/interfaces/libpq/Makefile @@ -95,7 +95,9 @@ SHLIB_PREREQS = submake-libpgport SHLIB_EXPORTS = exports.txt +ifeq ($(with_ssl),openssl) PKG_CONFIG_REQUIRES_PRIVATE = libssl libcrypto +endif all: all-lib libpq-refs-stamp From d43085d12e825ede628bafee1e5e6e0e3a3d5e67 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 2 Apr 2022 11:27:20 +0900 Subject: [PATCH 346/772] pageinspect: Use better macros to get special page area for GIN and GiST These five code paths are the last ones that made use of PageGetSpecialPointer() to get the special area of such pages, while those index AMs have already macros to do this job. Noticed while reviewing the use PageGetSpecialPointer() in the whole tree, in relation to the recent commit d16773c. --- contrib/pageinspect/ginfuncs.c | 6 +++--- contrib/pageinspect/gistfuncs.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contrib/pageinspect/ginfuncs.c b/contrib/pageinspect/ginfuncs.c index 7ad6d2d3bd..1c56fa18cd 100644 --- a/contrib/pageinspect/ginfuncs.c +++ b/contrib/pageinspect/ginfuncs.c @@ -57,7 +57,7 @@ gin_metapage_info(PG_FUNCTION_ARGS) (int) MAXALIGN(sizeof(GinPageOpaqueData)), (int) PageGetSpecialSize(page)))); - opaq = (GinPageOpaque) PageGetSpecialPointer(page); + opaq = GinPageGetOpaque(page); if (opaq->flags != GIN_META) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -123,7 +123,7 @@ gin_page_opaque_info(PG_FUNCTION_ARGS) (int) MAXALIGN(sizeof(GinPageOpaqueData)), (int) PageGetSpecialSize(page)))); - opaq = (GinPageOpaque) PageGetSpecialPointer(page); + opaq = GinPageGetOpaque(page); /* Build a tuple descriptor for our result type */ if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) @@ -208,7 +208,7 @@ gin_leafpage_items(PG_FUNCTION_ARGS) (int) MAXALIGN(sizeof(GinPageOpaqueData)), (int) PageGetSpecialSize(page)))); - opaq = (GinPageOpaque) PageGetSpecialPointer(page); + opaq = GinPageGetOpaque(page); if (opaq->flags != (GIN_DATA | GIN_LEAF | GIN_COMPRESSED)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c index 6bb81ffb84..b2bbf4f6cb 100644 --- a/contrib/pageinspect/gistfuncs.c +++ b/contrib/pageinspect/gistfuncs.c @@ -64,7 +64,7 @@ gist_page_opaque_info(PG_FUNCTION_ARGS) (int) MAXALIGN(sizeof(GISTPageOpaqueData)), (int) PageGetSpecialSize(page)))); - opaq = (GISTPageOpaque) PageGetSpecialPointer(page); + opaq = GistPageGetOpaque(page); if (opaq->gist_page_id != GIST_PAGE_ID) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -139,7 +139,7 @@ gist_page_items_bytea(PG_FUNCTION_ARGS) (int) MAXALIGN(sizeof(GISTPageOpaqueData)), (int) PageGetSpecialSize(page)))); - opaq = (GISTPageOpaque) PageGetSpecialPointer(page); + opaq = GistPageGetOpaque(page); if (opaq->gist_page_id != GIST_PAGE_ID) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), From d2a2ce4184b0038adb1d6d292f12685056e2ab7a Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 2 Apr 2022 12:06:11 +0900 Subject: [PATCH 347/772] Make upgradecheck a no-op in MSVC's vcregress.pl 322becb has changed upgradecheck to use the TAP tests, discarding pg_upgrade's tests in bincheck. However, this is proving to be a bad idea for the Windows buildfarm clients that use MSVC when TAP tests are disabled as this causes a hard failure at the pg_upgrade step. This commit disables upgradecheck, moving the execution of the tests of pg_upgrade to bincheck, as per an initial suggestion from Andres Freund, so as the buildfarm is able to live happily with those changes. While on it, remove the routine that was used by upgradecheck to create databases whose names are generated with a range of ASCII characters as it is not used since 322becb. upgradecheck is removed from the CI script for Windows, as bincheck takes care of that now. Per report from buildfarm member hamerkop (MSVC 2017 without a TAP setup). Reviewed-by: Justin Pryzby Discussion: https://postgr.es/m/YkbnpriYEAagZ2wH@paquier.xyz --- .cirrus.yml | 2 -- doc/src/sgml/install-windows.sgml | 1 - src/tools/msvc/vcregress.pl | 33 +++++-------------------------- 3 files changed, 5 insertions(+), 31 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 7b883b462a..f23d6cae55 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -443,8 +443,6 @@ task: %T_C% perl src/tools/msvc/vcregress.pl recoverycheck test_bin_script: | %T_C% perl src/tools/msvc/vcregress.pl bincheck - test_pg_upgrade_script: | - %T_C% perl src/tools/msvc/vcregress.pl upgradecheck test_ecpg_script: | rem tries to build additional stuff vcvarsall x64 diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index 43d05bde4e..18101e7a70 100644 --- a/doc/src/sgml/install-windows.sgml +++ b/doc/src/sgml/install-windows.sgml @@ -470,7 +470,6 @@ $ENV{CONFIG}="Debug"; vcregress isolationcheck vcregress bincheck vcregress recoverycheck -vcregress upgradecheck To change the schedule used (default is parallel), append it to the diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl index e896820ac5..fc7aa8b9a3 100644 --- a/src/tools/msvc/vcregress.pl +++ b/src/tools/msvc/vcregress.pl @@ -106,7 +106,7 @@ ISOLATIONCHECK => \&isolationcheck, BINCHECK => \&bincheck, RECOVERYCHECK => \&recoverycheck, - UPGRADECHECK => \&upgradecheck, + UPGRADECHECK => \&upgradecheck, # no-op TAPTEST => \&taptest,); my $proc = $command{$what}; @@ -286,9 +286,6 @@ sub bincheck foreach my $dir (@bin_dirs) { next unless -d "$dir/t"; - # Do not consider pg_upgrade, as it is handled by - # upgradecheck. - next if ($dir =~ "/pg_upgrade/"); my $status = tap_check($dir); $mstat ||= $status; @@ -498,31 +495,11 @@ sub quote_system_arg return "\"$arg\""; } -# Generate a database with a name made of a range of ASCII characters, useful -# for testing pg_upgrade. -sub generate_db -{ - my ($prefix, $from_char, $to_char, $suffix) = @_; - - my $dbname = $prefix; - for my $i ($from_char .. $to_char) - { - next if $i == 7 || $i == 10 || $i == 13; # skip BEL, LF, and CR - $dbname = $dbname . sprintf('%c', $i); - } - $dbname .= $suffix; - - system('createdb', quote_system_arg($dbname)); - my $status = $? >> 8; - exit $status if $status; - return; -} - sub upgradecheck { - InstallTemp(); - my $mstat = tap_check("$topdir/src/bin/pg_upgrade"); - exit $mstat if $mstat; + # pg_upgrade is now handled by bincheck, but keep this target for + # backward compatibility. + print "upgradecheck is a no-op, use bincheck instead.\n"; return; } @@ -640,7 +617,7 @@ sub usage " plcheck run tests of PL languages\n", " recoverycheck run recovery test suite\n", " taptest run an arbitrary TAP test set\n", - " upgradecheck run tests of pg_upgrade\n", + " upgradecheck run tests of pg_upgrade (no-op)\n", "\nOptions for : (used by check and installcheck)\n", " serial serial mode\n", " parallel parallel mode\n", From db086de5abe5d87b07cddd030092b1f81f99c5ea Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sat, 2 Apr 2022 07:27:26 +0200 Subject: [PATCH 348/772] Remove obsolete comment accidentally left behind by 4cb658af70027c3544fb843d77b2e84028762747 --- src/include/utils/rel.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 7a8ed943b7..121dbbc9a9 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -320,7 +320,6 @@ typedef struct StdRdOptions { int32 vl_len_; /* varlena header (do not touch directly!) */ int fillfactor; /* page fill factor in percent (0..100) */ - /* fraction of newly inserted tuples prior to trigger index cleanup */ int toast_tuple_target; /* target for tuple toasting */ AutoVacOpts autovacuum; /* autovacuum-related options */ bool user_catalog_table; /* use as an additional catalog relation */ From 6974924347c908335607a4a2f252213d58e21b7c Mon Sep 17 00:00:00 2001 From: John Naylor Date: Sat, 2 Apr 2022 15:22:25 +0700 Subject: [PATCH 349/772] Specialize tuplesort routines for different kinds of abbreviated keys Previously, the specialized tuplesort routine inlined handling for reverse-sort and NULLs-ordering but called the datum comparator via a pointer in the SortSupport struct parameter. Testing has showed that we can get a useful performance gain by specializing datum comparison for the different representations of abbreviated keys -- signed and unsigned 64-bit integers and signed 32-bit integers. Almost all abbreviatable data types will benefit -- the only exception for now is numeric, since the datum comparison is more complex. The performance gain depends on data type and input distribution, but often falls in the range of 10-20% faster. Thomas Munro Reviewed by Peter Geoghegan, review and performance testing by me Discussion: https://www.postgresql.org/message-id/CA%2BhUKGKKYttZZk-JMRQSVak%3DCXSJ5fiwtirFf%3Dn%3DPAbumvn1Ww%40mail.gmail.com --- src/backend/access/gist/gistproc.c | 18 +-- src/backend/access/nbtree/nbtcompare.c | 22 ++-- src/backend/utils/adt/date.c | 15 +-- src/backend/utils/adt/mac.c | 23 +--- src/backend/utils/adt/network.c | 17 +-- src/backend/utils/adt/timestamp.c | 11 ++ src/backend/utils/adt/uuid.c | 25 +--- src/backend/utils/adt/varlena.c | 34 +----- src/backend/utils/sort/tuplesort.c | 160 ++++++++++++++++++++++++- src/include/utils/sortsupport.h | 115 ++++++++++++++++++ 10 files changed, 308 insertions(+), 132 deletions(-) diff --git a/src/backend/access/gist/gistproc.c b/src/backend/access/gist/gistproc.c index 32fb32519e..22f2c18537 100644 --- a/src/backend/access/gist/gistproc.c +++ b/src/backend/access/gist/gistproc.c @@ -37,7 +37,6 @@ static uint64 part_bits32_by2(uint32 x); static uint32 ieee_float32_to_uint32(float f); static int gist_bbox_zorder_cmp(Datum a, Datum b, SortSupport ssup); static Datum gist_bbox_zorder_abbrev_convert(Datum original, SortSupport ssup); -static int gist_bbox_zorder_cmp_abbrev(Datum z1, Datum z2, SortSupport ssup); static bool gist_bbox_zorder_abbrev_abort(int memtupcount, SortSupport ssup); @@ -1726,21 +1725,6 @@ gist_bbox_zorder_abbrev_convert(Datum original, SortSupport ssup) #endif } -static int -gist_bbox_zorder_cmp_abbrev(Datum z1, Datum z2, SortSupport ssup) -{ - /* - * Compare the pre-computed Z-orders as unsigned integers. Datum is a - * typedef for 'uintptr_t', so no casting is required. - */ - if (z1 > z2) - return 1; - else if (z1 < z2) - return -1; - else - return 0; -} - /* * We never consider aborting the abbreviation. * @@ -1764,7 +1748,7 @@ gist_point_sortsupport(PG_FUNCTION_ARGS) if (ssup->abbreviate) { - ssup->comparator = gist_bbox_zorder_cmp_abbrev; + ssup->comparator = ssup_datum_unsigned_cmp; ssup->abbrev_converter = gist_bbox_zorder_abbrev_convert; ssup->abbrev_abort = gist_bbox_zorder_abbrev_abort; ssup->abbrev_full_comparator = gist_bbox_zorder_cmp; diff --git a/src/backend/access/nbtree/nbtcompare.c b/src/backend/access/nbtree/nbtcompare.c index da4ce7b4f1..40de3878fe 100644 --- a/src/backend/access/nbtree/nbtcompare.c +++ b/src/backend/access/nbtree/nbtcompare.c @@ -119,26 +119,12 @@ btint4cmp(PG_FUNCTION_ARGS) PG_RETURN_INT32(A_LESS_THAN_B); } -static int -btint4fastcmp(Datum x, Datum y, SortSupport ssup) -{ - int32 a = DatumGetInt32(x); - int32 b = DatumGetInt32(y); - - if (a > b) - return A_GREATER_THAN_B; - else if (a == b) - return 0; - else - return A_LESS_THAN_B; -} - Datum btint4sortsupport(PG_FUNCTION_ARGS) { SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0); - ssup->comparator = btint4fastcmp; + ssup->comparator = ssup_datum_int32_cmp; PG_RETURN_VOID(); } @@ -156,6 +142,7 @@ btint8cmp(PG_FUNCTION_ARGS) PG_RETURN_INT32(A_LESS_THAN_B); } +#ifndef USE_FLOAT8_BYVAL static int btint8fastcmp(Datum x, Datum y, SortSupport ssup) { @@ -169,13 +156,18 @@ btint8fastcmp(Datum x, Datum y, SortSupport ssup) else return A_LESS_THAN_B; } +#endif Datum btint8sortsupport(PG_FUNCTION_ARGS) { SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0); +#ifdef USE_FLOAT8_BYVAL + ssup->comparator = ssup_datum_signed_cmp; +#else ssup->comparator = btint8fastcmp; +#endif PG_RETURN_VOID(); } diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c index fee610916f..081dfa2450 100644 --- a/src/backend/utils/adt/date.c +++ b/src/backend/utils/adt/date.c @@ -439,25 +439,12 @@ date_cmp(PG_FUNCTION_ARGS) PG_RETURN_INT32(0); } -static int -date_fastcmp(Datum x, Datum y, SortSupport ssup) -{ - DateADT a = DatumGetDateADT(x); - DateADT b = DatumGetDateADT(y); - - if (a < b) - return -1; - else if (a > b) - return 1; - return 0; -} - Datum date_sortsupport(PG_FUNCTION_ARGS) { SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0); - ssup->comparator = date_fastcmp; + ssup->comparator = ssup_datum_int32_cmp; PG_RETURN_VOID(); } diff --git a/src/backend/utils/adt/mac.c b/src/backend/utils/adt/mac.c index 88a1698cf9..ac7342cfca 100644 --- a/src/backend/utils/adt/mac.c +++ b/src/backend/utils/adt/mac.c @@ -44,7 +44,6 @@ typedef struct static int macaddr_cmp_internal(macaddr *a1, macaddr *a2); static int macaddr_fast_cmp(Datum x, Datum y, SortSupport ssup); -static int macaddr_cmp_abbrev(Datum x, Datum y, SortSupport ssup); static bool macaddr_abbrev_abort(int memtupcount, SortSupport ssup); static Datum macaddr_abbrev_convert(Datum original, SortSupport ssup); @@ -381,7 +380,7 @@ macaddr_sortsupport(PG_FUNCTION_ARGS) ssup->ssup_extra = uss; - ssup->comparator = macaddr_cmp_abbrev; + ssup->comparator = ssup_datum_unsigned_cmp; ssup->abbrev_converter = macaddr_abbrev_convert; ssup->abbrev_abort = macaddr_abbrev_abort; ssup->abbrev_full_comparator = macaddr_fast_cmp; @@ -405,22 +404,6 @@ macaddr_fast_cmp(Datum x, Datum y, SortSupport ssup) return macaddr_cmp_internal(arg1, arg2); } -/* - * SortSupport abbreviated key comparison function. Compares two MAC addresses - * quickly by treating them like integers, and without having to go to the - * heap. - */ -static int -macaddr_cmp_abbrev(Datum x, Datum y, SortSupport ssup) -{ - if (x > y) - return 1; - else if (x == y) - return 0; - else - return -1; -} - /* * Callback for estimating effectiveness of abbreviated key optimization. * @@ -537,8 +520,8 @@ macaddr_abbrev_convert(Datum original, SortSupport ssup) /* * Byteswap on little-endian machines. * - * This is needed so that macaddr_cmp_abbrev() (an unsigned integer 3-way - * comparator) works correctly on all platforms. Without this, the + * This is needed so that ssup_datum_unsigned_cmp() (an unsigned integer + * 3-way comparator) works correctly on all platforms. Without this, the * comparator would have to call memcmp() with a pair of pointers to the * first byte of each abbreviated key, which is slower. */ diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c index 0ab54316f8..ea1c7390d0 100644 --- a/src/backend/utils/adt/network.c +++ b/src/backend/utils/adt/network.c @@ -53,7 +53,6 @@ typedef struct static int32 network_cmp_internal(inet *a1, inet *a2); static int network_fast_cmp(Datum x, Datum y, SortSupport ssup); -static int network_cmp_abbrev(Datum x, Datum y, SortSupport ssup); static bool network_abbrev_abort(int memtupcount, SortSupport ssup); static Datum network_abbrev_convert(Datum original, SortSupport ssup); static List *match_network_function(Node *leftop, @@ -456,7 +455,7 @@ network_sortsupport(PG_FUNCTION_ARGS) ssup->ssup_extra = uss; - ssup->comparator = network_cmp_abbrev; + ssup->comparator = ssup_datum_unsigned_cmp; ssup->abbrev_converter = network_abbrev_convert; ssup->abbrev_abort = network_abbrev_abort; ssup->abbrev_full_comparator = network_fast_cmp; @@ -479,20 +478,6 @@ network_fast_cmp(Datum x, Datum y, SortSupport ssup) return network_cmp_internal(arg1, arg2); } -/* - * Abbreviated key comparison func - */ -static int -network_cmp_abbrev(Datum x, Datum y, SortSupport ssup) -{ - if (x > y) - return 1; - else if (x == y) - return 0; - else - return -1; -} - /* * Callback for estimating effectiveness of abbreviated key optimization. * diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index ae36ff3328..2ba8d41284 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -37,6 +37,7 @@ #include "utils/datetime.h" #include "utils/float.h" #include "utils/numeric.h" +#include "utils/sortsupport.h" /* * gcc's -ffast-math switch breaks routines that expect exact results from @@ -2155,6 +2156,7 @@ timestamp_cmp(PG_FUNCTION_ARGS) PG_RETURN_INT32(timestamp_cmp_internal(dt1, dt2)); } +#ifndef USE_FLOAT8_BYVAL /* note: this is used for timestamptz also */ static int timestamp_fastcmp(Datum x, Datum y, SortSupport ssup) @@ -2164,13 +2166,22 @@ timestamp_fastcmp(Datum x, Datum y, SortSupport ssup) return timestamp_cmp_internal(a, b); } +#endif Datum timestamp_sortsupport(PG_FUNCTION_ARGS) { SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0); +#ifdef USE_FLOAT8_BYVAL + /* + * If this build has pass-by-value timestamps, then we can use a standard + * comparator function. + */ + ssup->comparator = ssup_datum_signed_cmp; +#else ssup->comparator = timestamp_fastcmp; +#endif PG_RETURN_VOID(); } diff --git a/src/backend/utils/adt/uuid.c b/src/backend/utils/adt/uuid.c index 9e06d9ba12..a157f864e1 100644 --- a/src/backend/utils/adt/uuid.c +++ b/src/backend/utils/adt/uuid.c @@ -34,7 +34,6 @@ typedef struct static void string_to_uuid(const char *source, pg_uuid_t *uuid); static int uuid_internal_cmp(const pg_uuid_t *arg1, const pg_uuid_t *arg2); static int uuid_fast_cmp(Datum x, Datum y, SortSupport ssup); -static int uuid_cmp_abbrev(Datum x, Datum y, SortSupport ssup); static bool uuid_abbrev_abort(int memtupcount, SortSupport ssup); static Datum uuid_abbrev_convert(Datum original, SortSupport ssup); @@ -255,7 +254,7 @@ uuid_sortsupport(PG_FUNCTION_ARGS) ssup->ssup_extra = uss; - ssup->comparator = uuid_cmp_abbrev; + ssup->comparator = ssup_datum_unsigned_cmp; ssup->abbrev_converter = uuid_abbrev_convert; ssup->abbrev_abort = uuid_abbrev_abort; ssup->abbrev_full_comparator = uuid_fast_cmp; @@ -278,20 +277,6 @@ uuid_fast_cmp(Datum x, Datum y, SortSupport ssup) return uuid_internal_cmp(arg1, arg2); } -/* - * Abbreviated key comparison func - */ -static int -uuid_cmp_abbrev(Datum x, Datum y, SortSupport ssup) -{ - if (x > y) - return 1; - else if (x == y) - return 0; - else - return -1; -} - /* * Callback for estimating effectiveness of abbreviated key optimization. * @@ -390,10 +375,10 @@ uuid_abbrev_convert(Datum original, SortSupport ssup) /* * Byteswap on little-endian machines. * - * This is needed so that uuid_cmp_abbrev() (an unsigned integer 3-way - * comparator) works correctly on all platforms. If we didn't do this, - * the comparator would have to call memcmp() with a pair of pointers to - * the first byte of each abbreviated key, which is slower. + * This is needed so that ssup_datum_unsigned_cmp() (an unsigned integer + * 3-way comparator) works correctly on all platforms. If we didn't do + * this, the comparator would have to call memcmp() with a pair of pointers + * to the first byte of each abbreviated key, which is slower. */ res = DatumBigEndianToNative(res); diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 22ab5a4329..cfc135c7be 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -126,7 +126,6 @@ static int namefastcmp_c(Datum x, Datum y, SortSupport ssup); static int varlenafastcmp_locale(Datum x, Datum y, SortSupport ssup); static int namefastcmp_locale(Datum x, Datum y, SortSupport ssup); static int varstrfastcmp_locale(char *a1p, int len1, char *a2p, int len2, SortSupport ssup); -static int varstrcmp_abbrev(Datum x, Datum y, SortSupport ssup); static Datum varstr_abbrev_convert(Datum original, SortSupport ssup); static bool varstr_abbrev_abort(int memtupcount, SortSupport ssup); static int32 text_length(Datum str); @@ -2159,7 +2158,7 @@ varstr_sortsupport(SortSupport ssup, Oid typid, Oid collid) initHyperLogLog(&sss->abbr_card, 10); initHyperLogLog(&sss->full_card, 10); ssup->abbrev_full_comparator = ssup->comparator; - ssup->comparator = varstrcmp_abbrev; + ssup->comparator = ssup_datum_unsigned_cmp; ssup->abbrev_converter = varstr_abbrev_convert; ssup->abbrev_abort = varstr_abbrev_abort; } @@ -2445,27 +2444,6 @@ varstrfastcmp_locale(char *a1p, int len1, char *a2p, int len2, SortSupport ssup) return result; } -/* - * Abbreviated key comparison func - */ -static int -varstrcmp_abbrev(Datum x, Datum y, SortSupport ssup) -{ - /* - * When 0 is returned, the core system will call varstrfastcmp_c() - * (bpcharfastcmp_c() in BpChar case) or varlenafastcmp_locale(). Even a - * strcmp() on two non-truncated strxfrm() blobs cannot indicate *equality* - * authoritatively, for the same reason that there is a strcoll() - * tie-breaker call to strcmp() in varstr_cmp(). - */ - if (x > y) - return 1; - else if (x == y) - return 0; - else - return -1; -} - /* * Conversion routine for sortsupport. Converts original to abbreviated key * representation. Our encoding strategy is simple -- pack the first 8 bytes @@ -2504,7 +2482,7 @@ varstr_abbrev_convert(Datum original, SortSupport ssup) * strings may contain NUL bytes. Besides, this should be faster, too. * * More generally, it's okay that bytea callers can have NUL bytes in - * strings because varstrcmp_abbrev() need not make a distinction between + * strings because abbreviated cmp need not make a distinction between * terminating NUL bytes, and NUL bytes representing actual NULs in the * authoritative representation. Hopefully a comparison at or past one * abbreviated key's terminating NUL byte will resolve the comparison @@ -2694,10 +2672,10 @@ varstr_abbrev_convert(Datum original, SortSupport ssup) /* * Byteswap on little-endian machines. * - * This is needed so that varstrcmp_abbrev() (an unsigned integer 3-way - * comparator) works correctly on all platforms. If we didn't do this, - * the comparator would have to call memcmp() with a pair of pointers to - * the first byte of each abbreviated key, which is slower. + * This is needed so that ssup_datum_unsigned_cmp() (an unsigned integer + * 3-way comparator) works correctly on all platforms. If we didn't do + * this, the comparator would have to call memcmp() with a pair of pointers + * to the first byte of each abbreviated key, which is slower. */ res = DatumBigEndianToNative(res); diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index 086e948fca..361527098f 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -669,14 +669,101 @@ static void free_sort_tuple(Tuplesortstate *state, SortTuple *stup); static void tuplesort_free(Tuplesortstate *state); static void tuplesort_updatemax(Tuplesortstate *state); +/* + * Specialized comparators that we can inline into specialized sorts. The goal + * is to try to sort two tuples without having to follow the pointers to the + * comparator or the tuple. + * + * XXX: For now, these fall back to comparator functions that will compare the + * leading datum a second time. + * + * XXX: For now, there is no specialization for cases where datum1 is + * authoritative and we don't even need to fall back to a callback at all (that + * would be true for types like int4/int8/timestamp/date, but not true for + * abbreviations of text or multi-key sorts. There could be! Is it worth it? + */ + +/* Used if first key's comparator is ssup_datum_unsigned_compare */ +static pg_attribute_always_inline int +qsort_tuple_unsigned_compare(SortTuple *a, SortTuple *b, Tuplesortstate *state) +{ + int compare; + + compare = ApplyUnsignedSortComparator(a->datum1, a->isnull1, + b->datum1, b->isnull1, + &state->sortKeys[0]); + if (compare != 0) + return compare; + + return state->comparetup(a, b, state); +} + +/* Used if first key's comparator is ssup_datum_signed_compare */ +static pg_attribute_always_inline int +qsort_tuple_signed_compare(SortTuple *a, SortTuple *b, Tuplesortstate *state) +{ + int compare; + + compare = ApplySignedSortComparator(a->datum1, a->isnull1, + b->datum1, b->isnull1, + &state->sortKeys[0]); + if (compare != 0) + return compare; + + return state->comparetup(a, b, state); +} + +/* Used if first key's comparator is ssup_datum_int32_compare */ +static pg_attribute_always_inline int +qsort_tuple_int32_compare(SortTuple *a, SortTuple *b, Tuplesortstate *state) +{ + int compare; + + compare = ApplyInt32SortComparator(a->datum1, a->isnull1, + b->datum1, b->isnull1, + &state->sortKeys[0]); + if (compare != 0) + return compare; + + return state->comparetup(a, b, state); +} + /* * Special versions of qsort just for SortTuple objects. qsort_tuple() sorts * any variant of SortTuples, using the appropriate comparetup function. * qsort_ssup() is specialized for the case where the comparetup function * reduces to ApplySortComparator(), that is single-key MinimalTuple sorts - * and Datum sorts. + * and Datum sorts. qsort_tuple_{unsigned,signed,int32} are specialized for + * common comparison functions on pass-by-value leading datums. */ +#define ST_SORT qsort_tuple_unsigned +#define ST_ELEMENT_TYPE SortTuple +#define ST_COMPARE(a, b, state) qsort_tuple_unsigned_compare(a, b, state) +#define ST_COMPARE_ARG_TYPE Tuplesortstate +#define ST_CHECK_FOR_INTERRUPTS +#define ST_SCOPE static +#define ST_DEFINE +#include "lib/sort_template.h" + +#define ST_SORT qsort_tuple_signed +#define ST_ELEMENT_TYPE SortTuple +#define ST_COMPARE(a, b, state) qsort_tuple_signed_compare(a, b, state) +#define ST_COMPARE_ARG_TYPE Tuplesortstate +#define ST_CHECK_FOR_INTERRUPTS +#define ST_SCOPE static +#define ST_DEFINE +#include "lib/sort_template.h" + +#define ST_SORT qsort_tuple_int32 +#define ST_ELEMENT_TYPE SortTuple +#define ST_COMPARE(a, b, state) qsort_tuple_int32_compare(a, b, state) +#define ST_COMPARE_ARG_TYPE Tuplesortstate +#define ST_CHECK_FOR_INTERRUPTS +#define ST_SCOPE static +#define ST_DEFINE +#include "lib/sort_template.h" + #define ST_SORT qsort_tuple #define ST_ELEMENT_TYPE SortTuple #define ST_COMPARE_RUNTIME_POINTER @@ -3506,15 +3593,40 @@ tuplesort_sort_memtuples(Tuplesortstate *state) if (state->memtupcount > 1) { + /* Do we have a specialization for the leading column's comparator? */ + if (state->sortKeys && + state->sortKeys[0].comparator == ssup_datum_unsigned_cmp) + { + elog(DEBUG1, "qsort_tuple_unsigned"); + qsort_tuple_unsigned(state->memtuples, state->memtupcount, state); + } + else if (state->sortKeys && + state->sortKeys[0].comparator == ssup_datum_signed_cmp) + { + elog(DEBUG1, "qsort_tuple_signed"); + qsort_tuple_signed(state->memtuples, state->memtupcount, state); + } + else if (state->sortKeys && + state->sortKeys[0].comparator == ssup_datum_int32_cmp) + { + elog(DEBUG1, "qsort_tuple_int32"); + qsort_tuple_int32(state->memtuples, state->memtupcount, state); + } /* Can we use the single-key sort function? */ - if (state->onlyKey != NULL) + else if (state->onlyKey != NULL) + { + elog(DEBUG1, "qsort_ssup"); qsort_ssup(state->memtuples, state->memtupcount, state->onlyKey); + } else + { + elog(DEBUG1, "qsort_tuple"); qsort_tuple(state->memtuples, state->memtupcount, state->comparetup, state); + } } } @@ -4700,3 +4812,47 @@ free_sort_tuple(Tuplesortstate *state, SortTuple *stup) stup->tuple = NULL; } } + +int +ssup_datum_unsigned_cmp(Datum x, Datum y, SortSupport ssup) +{ + if (x < y) + return -1; + else if (x > y) + return 1; + else + return 0; +} + +int +ssup_datum_signed_cmp(Datum x, Datum y, SortSupport ssup) +{ +#if SIZEOF_DATUM == 8 + int64 xx = (int64) x; + int64 yy = (int64) y; +#else + int32 xx = (int32) x; + int32 yy = (int32) y; +#endif + + if (xx < yy) + return -1; + else if (xx > yy) + return 1; + else + return 0; +} + +int +ssup_datum_int32_cmp(Datum x, Datum y, SortSupport ssup) +{ + int32 xx = (int32) x; + int32 yy = (int32) y; + + if (xx < yy) + return -1; + else if (xx > yy) + return 1; + else + return 0; +} diff --git a/src/include/utils/sortsupport.h b/src/include/utils/sortsupport.h index 6e3cab82d2..60e5f9940d 100644 --- a/src/include/utils/sortsupport.h +++ b/src/include/utils/sortsupport.h @@ -229,6 +229,112 @@ ApplySortComparator(Datum datum1, bool isNull1, return compare; } +static inline int +ApplyUnsignedSortComparator(Datum datum1, bool isNull1, + Datum datum2, bool isNull2, + SortSupport ssup) +{ + int compare; + + if (isNull1) + { + if (isNull2) + compare = 0; /* NULL "=" NULL */ + else if (ssup->ssup_nulls_first) + compare = -1; /* NULL "<" NOT_NULL */ + else + compare = 1; /* NULL ">" NOT_NULL */ + } + else if (isNull2) + { + if (ssup->ssup_nulls_first) + compare = 1; /* NOT_NULL ">" NULL */ + else + compare = -1; /* NOT_NULL "<" NULL */ + } + else + { + compare = datum1 < datum2 ? -1 : datum1 > datum2 ? 1 : 0; + if (ssup->ssup_reverse) + INVERT_COMPARE_RESULT(compare); + } + + return compare; +} + +static inline int +ApplySignedSortComparator(Datum datum1, bool isNull1, + Datum datum2, bool isNull2, + SortSupport ssup) +{ + int compare; + + if (isNull1) + { + if (isNull2) + compare = 0; /* NULL "=" NULL */ + else if (ssup->ssup_nulls_first) + compare = -1; /* NULL "<" NOT_NULL */ + else + compare = 1; /* NULL ">" NOT_NULL */ + } + else if (isNull2) + { + if (ssup->ssup_nulls_first) + compare = 1; /* NOT_NULL ">" NULL */ + else + compare = -1; /* NOT_NULL "<" NULL */ + } + else + { +#if SIZEOF_DATUM == 8 + compare = (int64) datum1 < (int64) datum2 ? -1 : + (int64) datum1 > (int64) datum2 ? 1 : 0; +#else + compare = (int32) datum1 < (int32) datum2 ? -1 : + (int32) datum1 > (int32) datum2 ? 1 : 0; +#endif + if (ssup->ssup_reverse) + INVERT_COMPARE_RESULT(compare); + } + + return compare; +} + +static inline int +ApplyInt32SortComparator(Datum datum1, bool isNull1, + Datum datum2, bool isNull2, + SortSupport ssup) +{ + int compare; + + if (isNull1) + { + if (isNull2) + compare = 0; /* NULL "=" NULL */ + else if (ssup->ssup_nulls_first) + compare = -1; /* NULL "<" NOT_NULL */ + else + compare = 1; /* NULL ">" NOT_NULL */ + } + else if (isNull2) + { + if (ssup->ssup_nulls_first) + compare = 1; /* NOT_NULL ">" NULL */ + else + compare = -1; /* NOT_NULL "<" NULL */ + } + else + { + compare = (int32) datum1 < (int32) datum2 ? -1 : + (int32) datum1 > (int32) datum2 ? 1 : 0; + if (ssup->ssup_reverse) + INVERT_COMPARE_RESULT(compare); + } + + return compare; +} + /* * Apply a sort comparator function and return a 3-way comparison using full, * authoritative comparator. This takes care of handling reverse-sort and @@ -267,6 +373,15 @@ ApplySortAbbrevFullComparator(Datum datum1, bool isNull1, return compare; } +/* + * Datum comparison functions that we have specialized sort routines for. + * Datatypes that install these as their comparator or abbrevated comparator + * are eligible for faster sorting. + */ +extern int ssup_datum_unsigned_cmp(Datum x, Datum y, SortSupport ssup); +extern int ssup_datum_signed_cmp(Datum x, Datum y, SortSupport ssup); +extern int ssup_datum_int32_cmp(Datum x, Datum y, SortSupport ssup); + /* Other functions in utils/sort/sortsupport.c */ extern void PrepareSortSupportComparisonShim(Oid cmpFunc, SortSupport ssup); extern void PrepareSortSupportFromOrderingOp(Oid orderingOp, SortSupport ssup); From c6dc6a0124fa130e1c083a870156c32ab4cf0ae2 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Sat, 2 Apr 2022 10:00:10 -0400 Subject: [PATCH 350/772] Use ORDER BY in catalog results in SQL/JSON tests The buildfarm has revealed some instability in results from catalog queries in tests from commit 1a36bc9dba8. Cure this by adding ORDER BY to such queries. --- src/test/regress/expected/jsonb_sqljson.out | 16 ++++++++++------ src/test/regress/sql/jsonb_sqljson.sql | 8 ++++++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/test/regress/expected/jsonb_sqljson.out b/src/test/regress/expected/jsonb_sqljson.out index 1126d7caf5..3661b7a810 100644 --- a/src/test/regress/expected/jsonb_sqljson.out +++ b/src/test/regress/expected/jsonb_sqljson.out @@ -949,18 +949,22 @@ Check constraints: SELECT check_clause FROM information_schema.check_constraints -WHERE constraint_name LIKE 'test_jsonb_constraint%'; +WHERE constraint_name LIKE 'test_jsonb_constraint%' +ORDER BY 1; check_clause -------------------------------------------------------------------------------------------------------------------------- + ((JSON_EXISTS((js)::jsonb, 'strict $."a"' RETURNING integer TRUE ON ERROR) < 2)) + ((JSON_QUERY((js)::jsonb, '$."a"' RETURNING character(5) OMIT QUOTES EMPTY ARRAY ON EMPTY) > ('a'::bpchar COLLATE "C"))) + ((JSON_QUERY((js)::jsonb, '$."a"' RETURNING jsonb WITH CONDITIONAL WRAPPER EMPTY OBJECT ON ERROR) < '[10]'::jsonb)) + ((JSON_VALUE((js)::jsonb, '$."a"' RETURNING integer DEFAULT (('12'::text || i))::integer ON EMPTY ERROR ON ERROR) > i)) ((js IS JSON)) (JSON_EXISTS((js)::jsonb, '$."a"' PASSING (i + 5) AS int, (i)::text AS txt, ARRAY[1, 2, 3] AS arr)) - ((JSON_VALUE((js)::jsonb, '$."a"' RETURNING integer DEFAULT (('12'::text || i))::integer ON EMPTY ERROR ON ERROR) > i)) - ((JSON_QUERY((js)::jsonb, '$."a"' RETURNING jsonb WITH CONDITIONAL WRAPPER EMPTY OBJECT ON ERROR) < '[10]'::jsonb)) - ((JSON_QUERY((js)::jsonb, '$."a"' RETURNING character(5) OMIT QUOTES EMPTY ARRAY ON EMPTY) > ('a'::bpchar COLLATE "C"))) - ((JSON_EXISTS((js)::jsonb, 'strict $."a"' RETURNING integer TRUE ON ERROR) < 2)) (6 rows) -SELECT pg_get_expr(adbin, adrelid) FROM pg_attrdef WHERE adrelid = 'test_jsonb_constraints'::regclass; +SELECT pg_get_expr(adbin, adrelid) +FROM pg_attrdef +WHERE adrelid = 'test_jsonb_constraints'::regclass +ORDER BY 1; pg_get_expr -------------------------------------------------------------------------------- JSON_QUERY('[1, 2]'::jsonb, '$[*]' RETURNING jsonb WITH UNCONDITIONAL WRAPPER) diff --git a/src/test/regress/sql/jsonb_sqljson.sql b/src/test/regress/sql/jsonb_sqljson.sql index 00a067a06a..697b8ed126 100644 --- a/src/test/regress/sql/jsonb_sqljson.sql +++ b/src/test/regress/sql/jsonb_sqljson.sql @@ -280,9 +280,13 @@ CREATE TABLE test_jsonb_constraints ( SELECT check_clause FROM information_schema.check_constraints -WHERE constraint_name LIKE 'test_jsonb_constraint%'; +WHERE constraint_name LIKE 'test_jsonb_constraint%' +ORDER BY 1; -SELECT pg_get_expr(adbin, adrelid) FROM pg_attrdef WHERE adrelid = 'test_jsonb_constraints'::regclass; +SELECT pg_get_expr(adbin, adrelid) +FROM pg_attrdef +WHERE adrelid = 'test_jsonb_constraints'::regclass +ORDER BY 1; INSERT INTO test_jsonb_constraints VALUES ('', 1); INSERT INTO test_jsonb_constraints VALUES ('1', 1); From 0af504733c6e9198067705822e7527dc4e60b4f6 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Sat, 2 Apr 2022 17:16:32 +0200 Subject: [PATCH 351/772] Remove excess semicolon in MERGE docs Author: Euler Taveira Discussion: https://postgr.es/m/01dea9ef-85ad-4e09-a783-a1eadeae7bbe@www.fastmail.com --- doc/src/sgml/ref/merge.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/merge.sgml b/doc/src/sgml/ref/merge.sgml index c547122c9b..ac1c0a83dd 100644 --- a/doc/src/sgml/ref/merge.sgml +++ b/doc/src/sgml/ref/merge.sgml @@ -596,7 +596,7 @@ ON s.winename = w.winename WHEN NOT MATCHED AND s.stock_delta > 0 THEN INSERT VALUES(s.winename, s.stock_delta) WHEN MATCHED AND w.stock + s.stock_delta > 0 THEN - UPDATE SET stock = w.stock + s.stock_delta; + UPDATE SET stock = w.stock + s.stock_delta WHEN MATCHED THEN DELETE; From b7c485fb93726cb04b858442d73043b56e603711 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Sat, 2 Apr 2022 09:49:08 -0700 Subject: [PATCH 352/772] Doc: Remove MultiXact wraparound section link. Remove circular "25.1.5.1. Multixacts And Wraparound" link that references the section that the link itself appears in. An explanation of MultiXactId age appears only a few sentences before the link, so there's no question that the link is superfluous at best. Oversight in commit d5409295. Author: Peter Geoghegan Backpatch: 14- --- doc/src/sgml/maintenance.sgml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml index 34d72dba78..693c92d9cb 100644 --- a/doc/src/sgml/maintenance.sgml +++ b/doc/src/sgml/maintenance.sgml @@ -720,8 +720,7 @@ HINT: Stop the postmaster and vacuum that database in single-user mode. As a safety device, an aggressive vacuum scan will - occur for any table whose multixact-age (see ) is greater than . Also, if the storage occupied by multixacts members exceeds 2GB, aggressive vacuum scans will occur more often for all tables, starting with those that From cfdd03f45e6afc632fbe70519250ec19167d6765 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Sat, 2 Apr 2022 19:08:34 +0200 Subject: [PATCH 353/772] Allow CLUSTER on partitioned tables This is essentially the same as applying VACUUM FULL to a partitioned table, which has been supported since commit 3c3bb99330aa (March 2017). While there's no great use case in applying CLUSTER to partitioned tables, we don't have any strong reason not to allow it either. For now, partitioned indexes cannot be marked clustered, so an index must always be specified. While at it, rename some variables that were RangeVars during the development that led to 8bc717cb8878 but never made it that way to the source tree; there's no need to perpetuate names that have always been more confusing than helpful. Author: Justin Pryzby Reviewed-by: Matthias van de Meent Discussion: https://postgr.es/m/20201028003312.GU9241@telsasoft.com Discussion: https://postgr.es/m/20200611153502.GT14879@telsasoft.com --- doc/src/sgml/ref/cluster.sgml | 7 + src/backend/commands/cluster.c | 249 +++++++++++++++++--------- src/backend/commands/tablecmds.c | 10 +- src/bin/psql/tab-complete.c | 1 + src/include/commands/cluster.h | 8 +- src/test/regress/expected/cluster.out | 47 ++++- src/test/regress/sql/cluster.sql | 24 ++- 7 files changed, 249 insertions(+), 97 deletions(-) diff --git a/doc/src/sgml/ref/cluster.sgml b/doc/src/sgml/ref/cluster.sgml index 86f5fdc469..c37f4236f1 100644 --- a/doc/src/sgml/ref/cluster.sgml +++ b/doc/src/sgml/ref/cluster.sgml @@ -196,6 +196,13 @@ CLUSTER [VERBOSE] in the pg_stat_progress_cluster view. See for details. + + + Clustering a partitioned table clusters each of its partitions using the + partition of the specified partitioned index. When clustering a partitioned + table, the index may not be omitted. + + diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 02a7e94bf9..cd19e35319 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -32,7 +32,9 @@ #include "catalog/index.h" #include "catalog/namespace.h" #include "catalog/objectaccess.h" +#include "catalog/partition.h" #include "catalog/pg_am.h" +#include "catalog/pg_inherits.h" #include "catalog/toasting.h" #include "commands/cluster.h" #include "commands/defrem.h" @@ -68,11 +70,14 @@ typedef struct } RelToCluster; +static void cluster_multiple_rels(List *rtcs, ClusterParams *params); static void rebuild_relation(Relation OldHeap, Oid indexOid, bool verbose); static void copy_table_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose, bool *pSwapToastByContent, TransactionId *pFreezeXid, MultiXactId *pCutoffMulti); static List *get_tables_to_cluster(MemoryContext cluster_context); +static List *get_tables_to_cluster_partitioned(MemoryContext cluster_context, + Oid indexOid); /*--------------------------------------------------------------------------- @@ -105,6 +110,10 @@ cluster(ParseState *pstate, ClusterStmt *stmt, bool isTopLevel) ListCell *lc; ClusterParams params = {0}; bool verbose = false; + Relation rel = NULL; + Oid indexOid = InvalidOid; + MemoryContext cluster_context; + List *rtcs; /* Parse option list */ foreach(lc, stmt->params) @@ -126,11 +135,13 @@ cluster(ParseState *pstate, ClusterStmt *stmt, bool isTopLevel) if (stmt->relation != NULL) { /* This is the single-relation case. */ - Oid tableOid, - indexOid = InvalidOid; - Relation rel; + Oid tableOid; - /* Find, lock, and check permissions on the table */ + /* + * Find, lock, and check permissions on the table. We obtain + * AccessExclusiveLock right away to avoid lock-upgrade hazard in the + * single-transaction case. + */ tableOid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, 0, @@ -146,14 +157,6 @@ cluster(ParseState *pstate, ClusterStmt *stmt, bool isTopLevel) (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot cluster temporary tables of other sessions"))); - /* - * Reject clustering a partitioned table. - */ - if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot cluster a partitioned table"))); - if (stmt->indexname == NULL) { ListCell *index; @@ -188,71 +191,101 @@ cluster(ParseState *pstate, ClusterStmt *stmt, bool isTopLevel) stmt->indexname, stmt->relation->relname))); } - /* close relation, keep lock till commit */ - table_close(rel, NoLock); + if (rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) + { + /* close relation, keep lock till commit */ + table_close(rel, NoLock); - /* Do the job. */ - cluster_rel(tableOid, indexOid, ¶ms); + /* Do the job. */ + cluster_rel(tableOid, indexOid, ¶ms); + + return; + } + } + + /* + * By here, we know we are in a multi-table situation. In order to avoid + * holding locks for too long, we want to process each table in its own + * transaction. This forces us to disallow running inside a user + * transaction block. + */ + PreventInTransactionBlock(isTopLevel, "CLUSTER"); + + /* Also, we need a memory context to hold our list of relations */ + cluster_context = AllocSetContextCreate(PortalContext, + "Cluster", + ALLOCSET_DEFAULT_SIZES); + + /* + * Either we're processing a partitioned table, or we were not given any + * table name at all. In either case, obtain a list of relations to + * process. + * + * In the former case, an index name must have been given, so we don't + * need to recheck its "indisclustered" bit, but we have to check that it + * is an index that we can cluster on. In the latter case, we set the + * option bit to have indisclustered verified. + * + * Rechecking the relation itself is necessary here in all cases. + */ + params.options |= CLUOPT_RECHECK; + if (rel != NULL) + { + Assert(rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE); + check_index_is_clusterable(rel, indexOid, true, AccessShareLock); + rtcs = get_tables_to_cluster_partitioned(cluster_context, indexOid); + + /* close relation, releasing lock on parent table */ + table_close(rel, AccessExclusiveLock); } else { - /* - * This is the "multi relation" case. We need to cluster all tables - * that have some index with indisclustered set. - */ - MemoryContext cluster_context; - List *rvs; - ListCell *rv; + rtcs = get_tables_to_cluster(cluster_context); + params.options |= CLUOPT_RECHECK_ISCLUSTERED; + } - /* - * We cannot run this form of CLUSTER inside a user transaction block; - * we'd be holding locks way too long. - */ - PreventInTransactionBlock(isTopLevel, "CLUSTER"); + /* Do the job. */ + cluster_multiple_rels(rtcs, ¶ms); - /* - * Create special memory context for cross-transaction storage. - * - * Since it is a child of PortalContext, it will go away even in case - * of error. - */ - cluster_context = AllocSetContextCreate(PortalContext, - "Cluster", - ALLOCSET_DEFAULT_SIZES); + /* Start a new transaction for the cleanup work. */ + StartTransactionCommand(); - /* - * Build the list of relations to cluster. Note that this lives in - * cluster_context. - */ - rvs = get_tables_to_cluster(cluster_context); + /* Clean up working storage */ + MemoryContextDelete(cluster_context); +} - /* Commit to get out of starting transaction */ - PopActiveSnapshot(); - CommitTransactionCommand(); +/* + * Given a list of relations to cluster, process each of them in a separate + * transaction. + * + * We expect to be in a transaction at start, but there isn't one when we + * return. + */ +static void +cluster_multiple_rels(List *rtcs, ClusterParams *params) +{ + ListCell *lc; - /* Ok, now that we've got them all, cluster them one by one */ - foreach(rv, rvs) - { - RelToCluster *rvtc = (RelToCluster *) lfirst(rv); - ClusterParams cluster_params = params; + /* Commit to get out of starting transaction */ + PopActiveSnapshot(); + CommitTransactionCommand(); - /* Start a new transaction for each relation. */ - StartTransactionCommand(); - /* functions in indexes may want a snapshot set */ - PushActiveSnapshot(GetTransactionSnapshot()); - /* Do the job. */ - cluster_params.options |= CLUOPT_RECHECK; - cluster_rel(rvtc->tableOid, rvtc->indexOid, - &cluster_params); - PopActiveSnapshot(); - CommitTransactionCommand(); - } + /* Cluster the tables, each in a separate transaction */ + foreach(lc, rtcs) + { + RelToCluster *rtc = (RelToCluster *) lfirst(lc); - /* Start a new transaction for the cleanup work. */ + /* Start a new transaction for each relation. */ StartTransactionCommand(); - /* Clean up working storage */ - MemoryContextDelete(cluster_context); + /* functions in indexes may want a snapshot set */ + PushActiveSnapshot(GetTransactionSnapshot()); + + /* Do the job. */ + cluster_rel(rtc->tableOid, rtc->indexOid, params); + + PopActiveSnapshot(); + CommitTransactionCommand(); } } @@ -327,10 +360,11 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) /* * Silently skip a temp table for a remote session. Only doing this * check in the "recheck" case is appropriate (which currently means - * somebody is executing a database-wide CLUSTER), because there is - * another check in cluster() which will stop any attempt to cluster - * remote temp tables by name. There is another check in cluster_rel - * which is redundant, but we leave it for extra safety. + * somebody is executing a database-wide CLUSTER or on a partitioned + * table), because there is another check in cluster() which will stop + * any attempt to cluster remote temp tables by name. There is + * another check in cluster_rel which is redundant, but we leave it + * for extra safety. */ if (RELATION_IS_OTHER_TEMP(OldHeap)) { @@ -352,9 +386,11 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) } /* - * Check that the index is still the one with indisclustered set. + * Check that the index is still the one with indisclustered set, + * if needed. */ - if (!get_index_isclustered(indexOid)) + if ((params->options & CLUOPT_RECHECK_ISCLUSTERED) != 0 && + !get_index_isclustered(indexOid)) { relation_close(OldHeap, AccessExclusiveLock); pgstat_progress_end_command(); @@ -415,6 +451,10 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) return; } + Assert(OldHeap->rd_rel->relkind == RELKIND_RELATION || + OldHeap->rd_rel->relkind == RELKIND_MATVIEW || + OldHeap->rd_rel->relkind == RELKIND_TOASTVALUE); + /* * All predicate locks on the tuples or pages are about to be made * invalid, because we move tuples around. Promote them to relation @@ -585,8 +625,8 @@ rebuild_relation(Relation OldHeap, Oid indexOid, bool verbose) TransactionId frozenXid; MultiXactId cutoffMulti; - /* Mark the correct index as clustered */ if (OidIsValid(indexOid)) + /* Mark the correct index as clustered */ mark_index_clustered(OldHeap, indexOid, true); /* Remember info about rel before closing OldHeap */ @@ -1528,8 +1568,8 @@ finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap, /* * Reset the relrewrite for the toast. The command-counter - * increment is required here as we are about to update - * the tuple that is updated as part of RenameRelationInternal. + * increment is required here as we are about to update the tuple + * that is updated as part of RenameRelationInternal. */ CommandCounterIncrement(); ResetRelRewrite(newrel->rd_rel->reltoastrelid); @@ -1564,8 +1604,7 @@ get_tables_to_cluster(MemoryContext cluster_context) HeapTuple indexTuple; Form_pg_index index; MemoryContext old_context; - RelToCluster *rvtc; - List *rvs = NIL; + List *rtcs = NIL; /* * Get all indexes that have indisclustered set and are owned by @@ -1579,21 +1618,20 @@ get_tables_to_cluster(MemoryContext cluster_context) scan = table_beginscan_catalog(indRelation, 1, &entry); while ((indexTuple = heap_getnext(scan, ForwardScanDirection)) != NULL) { + RelToCluster *rtc; + index = (Form_pg_index) GETSTRUCT(indexTuple); if (!pg_class_ownercheck(index->indrelid, GetUserId())) continue; - /* - * We have to build the list in a different memory context so it will - * survive the cross-transaction processing - */ + /* Use a permanent memory context for the result list */ old_context = MemoryContextSwitchTo(cluster_context); - rvtc = (RelToCluster *) palloc(sizeof(RelToCluster)); - rvtc->tableOid = index->indrelid; - rvtc->indexOid = index->indexrelid; - rvs = lappend(rvs, rvtc); + rtc = (RelToCluster *) palloc(sizeof(RelToCluster)); + rtc->tableOid = index->indrelid; + rtc->indexOid = index->indexrelid; + rtcs = lappend(rtcs, rtc); MemoryContextSwitchTo(old_context); } @@ -1601,5 +1639,48 @@ get_tables_to_cluster(MemoryContext cluster_context) relation_close(indRelation, AccessShareLock); - return rvs; + return rtcs; +} + +/* + * Given an index on a partitioned table, return a list of RelToCluster for + * all the children leaves tables/indexes. + * + * Caller must hold lock on the table containing the index. + * + * Like expand_vacuum_rel, but here caller must hold AccessExclusiveLock + * on the table already. + */ +static List * +get_tables_to_cluster_partitioned(MemoryContext cluster_context, Oid indexOid) +{ + List *inhoids; + ListCell *lc; + List *rtcs = NIL; + MemoryContext old_context; + + /* Do not lock the children until they're processed */ + inhoids = find_all_inheritors(indexOid, NoLock, NULL); + + /* Use a permanent memory context for the result list */ + old_context = MemoryContextSwitchTo(cluster_context); + + foreach(lc, inhoids) + { + Oid indexrelid = lfirst_oid(lc); + Oid relid = IndexGetRelation(indexrelid, false); + RelToCluster *rtc; + + /* consider only leaf indexes */ + if (get_rel_relkind(indexrelid) != RELKIND_INDEX) + continue; + + rtc = (RelToCluster *) palloc(sizeof(RelToCluster)); + rtc->tableOid = relid; + rtc->indexOid = indexrelid; + rtcs = lappend(rtcs, rtc); + } + + MemoryContextSwitchTo(old_context); + return rtcs; } diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 51b4a00d50..7febb5018f 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -16911,11 +16911,11 @@ AtEOSubXact_on_commit_actions(bool isCommit, SubTransactionId mySubid, /* * This is intended as a callback for RangeVarGetRelidExtended(). It allows - * the relation to be locked only if (1) it's a plain table, materialized - * view, or TOAST table and (2) the current user is the owner (or the - * superuser). This meets the permission-checking needs of CLUSTER, REINDEX - * TABLE, and REFRESH MATERIALIZED VIEW; we expose it here so that it can be - * used by all. + * the relation to be locked only if (1) it's a plain or partitioned table, + * materialized view, or TOAST table and (2) the current user is the owner (or + * the superuser). This meets the permission-checking needs of CLUSTER, + * REINDEX TABLE, and REFRESH MATERIALIZED VIEW; we expose it here so that it + * can be used by all. */ void RangeVarCallbackOwnsTable(const RangeVar *relation, diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 3f9dfffd57..6f040674a2 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -897,6 +897,7 @@ static const SchemaQuery Query_for_list_of_clusterables = { .catname = "pg_catalog.pg_class c", .selcondition = "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", " + CppAsString2(RELKIND_PARTITIONED_TABLE) ", " CppAsString2(RELKIND_MATVIEW) ")", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", diff --git a/src/include/commands/cluster.h b/src/include/commands/cluster.h index 3db375d7cc..3c279f6210 100644 --- a/src/include/commands/cluster.h +++ b/src/include/commands/cluster.h @@ -19,9 +19,11 @@ #include "utils/relcache.h" -/* flag bits for ClusterParams->flags */ -#define CLUOPT_RECHECK 0x01 /* recheck relation state */ -#define CLUOPT_VERBOSE 0x02 /* print progress info */ +/* flag bits for ClusterParams->options */ +#define CLUOPT_VERBOSE 0x01 /* print progress info */ +#define CLUOPT_RECHECK 0x02 /* recheck relation state */ +#define CLUOPT_RECHECK_ISCLUSTERED 0x04 /* recheck relation state for + * indisclustered */ /* options for CLUSTER */ typedef struct ClusterParams diff --git a/src/test/regress/expected/cluster.out b/src/test/regress/expected/cluster.out index e46a66952f..953818c74e 100644 --- a/src/test/regress/expected/cluster.out +++ b/src/test/regress/expected/cluster.out @@ -305,6 +305,8 @@ WHERE pg_class.oid=indexrelid --------- (0 rows) +-- Verify that toast tables are clusterable +CLUSTER pg_toast.pg_toast_826 USING pg_toast_826_index; -- Verify that clustering all tables does in fact cluster the right ones CREATE USER regress_clstr_user; CREATE TABLE clstr_1 (a INT PRIMARY KEY); @@ -444,13 +446,52 @@ DROP TABLE clustertest; CREATE TABLE clustertest (f1 int PRIMARY KEY); CLUSTER clustertest USING clustertest_pkey; CLUSTER clustertest; --- Check that partitioned tables cannot be clustered +-- Check that partitioned tables can be clustered CREATE TABLE clstrpart (a int) PARTITION BY RANGE (a); +CREATE TABLE clstrpart1 PARTITION OF clstrpart FOR VALUES FROM (1) TO (10) PARTITION BY RANGE (a); +CREATE TABLE clstrpart11 PARTITION OF clstrpart1 FOR VALUES FROM (1) TO (5); +CREATE TABLE clstrpart12 PARTITION OF clstrpart1 FOR VALUES FROM (5) TO (10) PARTITION BY RANGE (a); +CREATE TABLE clstrpart2 PARTITION OF clstrpart FOR VALUES FROM (10) TO (20); +CREATE TABLE clstrpart3 PARTITION OF clstrpart DEFAULT PARTITION BY RANGE (a); +CREATE TABLE clstrpart33 PARTITION OF clstrpart3 DEFAULT; +CREATE INDEX clstrpart_only_idx ON ONLY clstrpart (a); +CLUSTER clstrpart USING clstrpart_only_idx; -- fails +ERROR: cannot cluster on invalid index "clstrpart_only_idx" +DROP INDEX clstrpart_only_idx; CREATE INDEX clstrpart_idx ON clstrpart (a); +-- Check that clustering sets new relfilenodes: +CREATE TEMP TABLE old_cluster_info AS SELECT relname, level, relfilenode, relkind FROM pg_partition_tree('clstrpart'::regclass) AS tree JOIN pg_class c ON c.oid=tree.relid ; +CLUSTER clstrpart USING clstrpart_idx; +CREATE TEMP TABLE new_cluster_info AS SELECT relname, level, relfilenode, relkind FROM pg_partition_tree('clstrpart'::regclass) AS tree JOIN pg_class c ON c.oid=tree.relid ; +SELECT relname, old.level, old.relkind, old.relfilenode = new.relfilenode FROM old_cluster_info AS old JOIN new_cluster_info AS new USING (relname) ORDER BY relname COLLATE "C"; + relname | level | relkind | ?column? +-------------+-------+---------+---------- + clstrpart | 0 | p | t + clstrpart1 | 1 | p | t + clstrpart11 | 2 | r | f + clstrpart12 | 2 | p | t + clstrpart2 | 1 | r | f + clstrpart3 | 1 | p | t + clstrpart33 | 2 | r | f +(7 rows) + +-- Partitioned indexes aren't and can't be marked un/clustered: +\d clstrpart + Partitioned table "public.clstrpart" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | +Partition key: RANGE (a) +Indexes: + "clstrpart_idx" btree (a) +Number of partitions: 3 (Use \d+ to list them.) + +CLUSTER clstrpart; +ERROR: there is no previously clustered index for table "clstrpart" +ALTER TABLE clstrpart SET WITHOUT CLUSTER; +ERROR: cannot mark index clustered in partitioned table ALTER TABLE clstrpart CLUSTER ON clstrpart_idx; ERROR: cannot mark index clustered in partitioned table -CLUSTER clstrpart USING clstrpart_idx; -ERROR: cannot cluster a partitioned table DROP TABLE clstrpart; -- Test CLUSTER with external tuplesorting create table clstr_4 as select * from tenk1; diff --git a/src/test/regress/sql/cluster.sql b/src/test/regress/sql/cluster.sql index aee9cf83e0..5601684ee3 100644 --- a/src/test/regress/sql/cluster.sql +++ b/src/test/regress/sql/cluster.sql @@ -104,6 +104,9 @@ WHERE pg_class.oid=indexrelid AND pg_class_2.relname = 'clstr_tst' AND indisclustered; +-- Verify that toast tables are clusterable +CLUSTER pg_toast.pg_toast_826 USING pg_toast_826_index; + -- Verify that clustering all tables does in fact cluster the right ones CREATE USER regress_clstr_user; CREATE TABLE clstr_1 (a INT PRIMARY KEY); @@ -202,11 +205,28 @@ CREATE TABLE clustertest (f1 int PRIMARY KEY); CLUSTER clustertest USING clustertest_pkey; CLUSTER clustertest; --- Check that partitioned tables cannot be clustered +-- Check that partitioned tables can be clustered CREATE TABLE clstrpart (a int) PARTITION BY RANGE (a); +CREATE TABLE clstrpart1 PARTITION OF clstrpart FOR VALUES FROM (1) TO (10) PARTITION BY RANGE (a); +CREATE TABLE clstrpart11 PARTITION OF clstrpart1 FOR VALUES FROM (1) TO (5); +CREATE TABLE clstrpart12 PARTITION OF clstrpart1 FOR VALUES FROM (5) TO (10) PARTITION BY RANGE (a); +CREATE TABLE clstrpart2 PARTITION OF clstrpart FOR VALUES FROM (10) TO (20); +CREATE TABLE clstrpart3 PARTITION OF clstrpart DEFAULT PARTITION BY RANGE (a); +CREATE TABLE clstrpart33 PARTITION OF clstrpart3 DEFAULT; +CREATE INDEX clstrpart_only_idx ON ONLY clstrpart (a); +CLUSTER clstrpart USING clstrpart_only_idx; -- fails +DROP INDEX clstrpart_only_idx; CREATE INDEX clstrpart_idx ON clstrpart (a); -ALTER TABLE clstrpart CLUSTER ON clstrpart_idx; +-- Check that clustering sets new relfilenodes: +CREATE TEMP TABLE old_cluster_info AS SELECT relname, level, relfilenode, relkind FROM pg_partition_tree('clstrpart'::regclass) AS tree JOIN pg_class c ON c.oid=tree.relid ; CLUSTER clstrpart USING clstrpart_idx; +CREATE TEMP TABLE new_cluster_info AS SELECT relname, level, relfilenode, relkind FROM pg_partition_tree('clstrpart'::regclass) AS tree JOIN pg_class c ON c.oid=tree.relid ; +SELECT relname, old.level, old.relkind, old.relfilenode = new.relfilenode FROM old_cluster_info AS old JOIN new_cluster_info AS new USING (relname) ORDER BY relname COLLATE "C"; +-- Partitioned indexes aren't and can't be marked un/clustered: +\d clstrpart +CLUSTER clstrpart; +ALTER TABLE clstrpart SET WITHOUT CLUSTER; +ALTER TABLE clstrpart CLUSTER ON clstrpart_idx; DROP TABLE clstrpart; -- Test CLUSTER with external tuplesorting From 9752436f049430428464e22dcf837e9c6fa4e513 Mon Sep 17 00:00:00 2001 From: Joe Conway Date: Sat, 2 Apr 2022 13:24:38 -0400 Subject: [PATCH 354/772] Use has_privs_for_roles for predefined role checks: round 2 Similar to commit 6198420ad, replace is_member_of_role with has_privs_for_role for predefined role access checks in recently committed basebackup code. In passing fix a double-word error in a nearby comment. Discussion: https://postgr.es/m/flat/CAGB+Vh4Zv_TvKt2tv3QNS6tUM_F_9icmuj0zjywwcgVi4PAhFA@mail.gmail.com --- contrib/basebackup_to_shell/basebackup_to_shell.c | 4 ++-- doc/src/sgml/ref/pg_basebackup.sgml | 2 +- src/backend/replication/basebackup_server.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contrib/basebackup_to_shell/basebackup_to_shell.c b/contrib/basebackup_to_shell/basebackup_to_shell.c index d82cb6d13f..f0ddef1987 100644 --- a/contrib/basebackup_to_shell/basebackup_to_shell.c +++ b/contrib/basebackup_to_shell/basebackup_to_shell.c @@ -90,7 +90,7 @@ _PG_init(void) } /* - * We choose to defer sanity sanity checking until shell_get_sink(), and so + * We choose to defer sanity checking until shell_get_sink(), and so * just pass the target detail through without doing anything. However, we do * permissions checks here, before any real work has been done. */ @@ -103,7 +103,7 @@ shell_check_detail(char *target, char *target_detail) StartTransactionCommand(); roleid = get_role_oid(shell_required_role, true); - if (!is_member_of_role(GetUserId(), roleid)) + if (!has_privs_of_role(GetUserId(), roleid)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("permission denied to use basebackup_to_shell"))); diff --git a/doc/src/sgml/ref/pg_basebackup.sgml b/doc/src/sgml/ref/pg_basebackup.sgml index 82f5f60625..6468f45cf3 100644 --- a/doc/src/sgml/ref/pg_basebackup.sgml +++ b/doc/src/sgml/ref/pg_basebackup.sgml @@ -237,7 +237,7 @@ PostgreSQL documentation server:/some/path, the backup will be stored on the machine where the server is running in the /some/path directory. Storing a backup on the - server requires superuser privileges or being granted the + server requires superuser privileges or having privileges of the pg_write_server_files role. If the target is set to blackhole, the contents are discarded and not stored anywhere. This should only be used for testing purposes, as you diff --git a/src/backend/replication/basebackup_server.c b/src/backend/replication/basebackup_server.c index a878629668..bc16897b33 100644 --- a/src/backend/replication/basebackup_server.c +++ b/src/backend/replication/basebackup_server.c @@ -69,10 +69,10 @@ bbsink_server_new(bbsink *next, char *pathname) /* Replication permission is not sufficient in this case. */ StartTransactionCommand(); - if (!is_member_of_role(GetUserId(), ROLE_PG_WRITE_SERVER_FILES)) + if (!has_privs_of_role(GetUserId(), ROLE_PG_WRITE_SERVER_FILES)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser or a member of the pg_write_server_files role to create server backup"))); + errmsg("must be superuser or a role with privileges of the pg_write_server_files role to create server backup"))); CommitTransactionCommand(); /* From 14bf1e831356770cc61a5f43b9b816f0c0583f2b Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Sat, 2 Apr 2022 10:33:21 -0700 Subject: [PATCH 355/772] vacuumlazy.c: Clean up variable declarations. Move some of the heap_vacuum_rel() instrumentation related variables to the scope where they're actually needed. Also reorder some of the variable declarations at the start of heap_vacuum_rel() so that related variables appear together. --- src/backend/access/heap/vacuumlazy.c | 48 +++++++++++++--------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 87ab7775ae..06b523a01f 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -306,30 +306,24 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, { LVRelState *vacrel; bool verbose, - instrument; + instrument, + aggressive, + skipwithvm, + frozenxid_updated, + minmulti_updated; + TransactionId OldestXmin, + FreezeLimit; + MultiXactId MultiXactCutoff; + BlockNumber orig_rel_pages, + new_rel_pages, + new_rel_allvisible; PGRUsage ru0; TimestampTz starttime = 0; - WalUsage walusage_start = pgWalUsage; - WalUsage walusage = {0, 0, 0}; - long secs; - int usecs; - double read_rate, - write_rate; - bool aggressive, - skipwithvm; - bool frozenxid_updated, - minmulti_updated; - BlockNumber orig_rel_pages; - char **indnames = NULL; - BlockNumber new_rel_pages; - BlockNumber new_rel_allvisible; - double new_live_tuples; - ErrorContextCallback errcallback; PgStat_Counter startreadtime = 0; PgStat_Counter startwritetime = 0; - TransactionId OldestXmin; - TransactionId FreezeLimit; - MultiXactId MultiXactCutoff; + WalUsage walusage_start = pgWalUsage; + ErrorContextCallback errcallback; + char **indnames = NULL; verbose = (params->options & VACOPT_VERBOSE) != 0; instrument = (verbose || (IsAutoVacuumWorkerProcess() && @@ -557,7 +551,6 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, * relpages to. */ new_rel_pages = vacrel->rel_pages; /* After possible rel truncation */ - new_live_tuples = vacrel->new_live_tuples; visibilitymap_count(rel, &new_rel_allvisible, NULL); if (new_rel_allvisible > new_rel_pages) new_rel_allvisible = new_rel_pages; @@ -578,7 +571,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, /* Cannot advance relfrozenxid/relminmxid */ Assert(!aggressive); frozenxid_updated = minmulti_updated = false; - vac_update_relstats(rel, new_rel_pages, new_live_tuples, + vac_update_relstats(rel, new_rel_pages, vacrel->new_live_tuples, new_rel_allvisible, vacrel->nindexes > 0, InvalidTransactionId, InvalidMultiXactId, NULL, NULL, false); @@ -587,7 +580,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, { Assert(vacrel->scanned_pages + vacrel->frozenskipped_pages == orig_rel_pages); - vac_update_relstats(rel, new_rel_pages, new_live_tuples, + vac_update_relstats(rel, new_rel_pages, vacrel->new_live_tuples, new_rel_allvisible, vacrel->nindexes > 0, FreezeLimit, MultiXactCutoff, &frozenxid_updated, &minmulti_updated, false); @@ -605,7 +598,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, */ pgstat_report_vacuum(RelationGetRelid(rel), rel->rd_rel->relisshared, - Max(new_live_tuples, 0), + Max(vacrel->new_live_tuples, 0), vacrel->recently_dead_tuples + vacrel->missed_dead_tuples); pgstat_progress_end_command(); @@ -618,6 +611,11 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, TimestampDifferenceExceeds(starttime, endtime, params->log_min_duration)) { + long secs; + int usecs; + WalUsage walusage; + double read_rate, + write_rate; StringInfoData buf; char *msgfmt; int32 diff; @@ -674,7 +672,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, vacrel->num_index_scans); appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"), vacrel->removed_pages, - vacrel->rel_pages, + new_rel_pages, vacrel->scanned_pages, orig_rel_pages == 0 ? 100.0 : 100.0 * vacrel->scanned_pages / orig_rel_pages); From 1b208ebaf14e668a24c78ee42cf805431cd0f591 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 2 Apr 2022 13:49:39 -0400 Subject: [PATCH 356/772] Add a couple more tests for interval input decoding. Cover some cases that would have been broken by a proposed patch, but we failed to notice for lack of test coverage. I'm pushing this separately mainly to memorialize that it *is* our historical behavior. Discussion: https://postgr.es/m/1344498.1648920056@sss.pgh.pa.us --- src/test/regress/expected/interval.out | 20 ++++++++++++++++++++ src/test/regress/sql/interval.sql | 12 ++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/test/regress/expected/interval.out b/src/test/regress/expected/interval.out index 146f7c55d0..9a7e2852f2 100644 --- a/src/test/regress/expected/interval.out +++ b/src/test/regress/expected/interval.out @@ -826,6 +826,16 @@ SELECT interval '+1 -1:00:00', 1 day -01:00:00 | -1 days +01:00:00 | 1 year 2 mons -3 days +04:05:06.789 | -1 years -2 mons +3 days -04:05:06.789 (1 row) +-- cases that trigger sign-matching rules in the sql style +SELECT interval '-23 hours 45 min 12.34 sec', + interval '-1 day 23 hours 45 min 12.34 sec', + interval '-1 year 2 months 1 day 23 hours 45 min 12.34 sec', + interval '-1 year 2 months 1 day 23 hours 45 min +12.34 sec'; + interval | interval | interval | interval +--------------+----------------------+-----------------------------+----------------------------- + -22:14:47.66 | -1 days +23:45:12.34 | -10 mons +1 day 23:45:12.34 | -10 mons +1 day 23:45:12.34 +(1 row) + -- test output of couple non-standard interval values in the sql style SET IntervalStyle TO sql_standard; SELECT interval '1 day -1 hours', @@ -837,6 +847,16 @@ SELECT interval '1 day -1 hours', +0-0 +1 -1:00:00 | +0-0 -1 +1:00:00 | +1-2 -3 +4:05:06.789 | -1-2 +3 -4:05:06.789 (1 row) +-- cases that trigger sign-matching rules in the sql style +SELECT interval '-23 hours 45 min 12.34 sec', + interval '-1 day 23 hours 45 min 12.34 sec', + interval '-1 year 2 months 1 day 23 hours 45 min 12.34 sec', + interval '-1 year 2 months 1 day 23 hours 45 min +12.34 sec'; + interval | interval | interval | interval +--------------+----------------+----------------------+----------------------- + -23:45:12.34 | -1 23:45:12.34 | -1-2 -1 -23:45:12.34 | -0-10 +1 +23:45:12.34 +(1 row) + -- test outputting iso8601 intervals SET IntervalStyle to iso_8601; select interval '0' AS "zero", diff --git a/src/test/regress/sql/interval.sql b/src/test/regress/sql/interval.sql index c31f0eec05..811b581e09 100644 --- a/src/test/regress/sql/interval.sql +++ b/src/test/regress/sql/interval.sql @@ -258,6 +258,12 @@ SELECT interval '+1 -1:00:00', interval '+1-2 -3 +4:05:06.789', interval '-1-2 +3 -4:05:06.789'; +-- cases that trigger sign-matching rules in the sql style +SELECT interval '-23 hours 45 min 12.34 sec', + interval '-1 day 23 hours 45 min 12.34 sec', + interval '-1 year 2 months 1 day 23 hours 45 min 12.34 sec', + interval '-1 year 2 months 1 day 23 hours 45 min +12.34 sec'; + -- test output of couple non-standard interval values in the sql style SET IntervalStyle TO sql_standard; SELECT interval '1 day -1 hours', @@ -265,6 +271,12 @@ SELECT interval '1 day -1 hours', interval '1 years 2 months -3 days 4 hours 5 minutes 6.789 seconds', - interval '1 years 2 months -3 days 4 hours 5 minutes 6.789 seconds'; +-- cases that trigger sign-matching rules in the sql style +SELECT interval '-23 hours 45 min 12.34 sec', + interval '-1 day 23 hours 45 min 12.34 sec', + interval '-1 year 2 months 1 day 23 hours 45 min 12.34 sec', + interval '-1 year 2 months 1 day 23 hours 45 min +12.34 sec'; + -- test outputting iso8601 intervals SET IntervalStyle to iso_8601; select interval '0' AS "zero", From f7e4d5c64fb3977e3a773e7213472be1b59dab2f Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Sat, 2 Apr 2022 12:29:35 -0700 Subject: [PATCH 357/772] Doc: Clarify the role of aggressive VACUUMs. Adjust the documentation's coverage of aggressive VACUUMs to make it clearer that aggressive vacuuming isn't always strictly necessary. It's possible for non-aggressive VACUUMs to advance relfrozenxid/relminmxid without fail, given the right workload conditions. While this has always been true, it matters more with recent and pending improvements to VACUUM. These improvements make non-aggressive vacuuming more likely to advance relfrozenxid/relminmxid in practice. While this is an unrelated improvement to the docs, formally speaking, it still doesn't seem worth backpatching. So don't backpatch. --- doc/src/sgml/maintenance.sgml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml index 693c92d9cb..5f3b6720e4 100644 --- a/doc/src/sgml/maintenance.sgml +++ b/doc/src/sgml/maintenance.sgml @@ -493,16 +493,17 @@ will skip pages that don't have any dead row versions even if those pages might still have row versions with old XID values. Therefore, normal VACUUMs won't always freeze every old row version in the table. - Periodically, VACUUM will perform an aggressive - vacuum, skipping only those pages which contain neither dead rows nor - any unfrozen XID or MXID values. + When that happens, VACUUM will eventually need to perform an + aggressive vacuum, which will freeze all eligible unfrozen + XID and MXID values, including those from all-visible but not all-frozen pages. + In practice most tables require periodic aggressive vacuuming. controls when VACUUM does that: all-visible but not all-frozen pages are scanned if the number of transactions that have passed since the last such scan is greater than vacuum_freeze_table_age minus vacuum_freeze_min_age. Setting vacuum_freeze_table_age to 0 forces VACUUM to - use this more aggressive strategy for all scans. + always use its aggressive strategy. @@ -711,8 +712,9 @@ HINT: Stop the postmaster and vacuum that database in single-user mode. - Aggressive VACUUM scans, regardless of - what causes them, enable advancing the value for that table. + Aggressive VACUUMs, regardless of what causes + them, are guaranteed to be able to advance + the table's relminmxid. Eventually, as all tables in all databases are scanned and their oldest multixact values are advanced, on-disk storage for older multixacts can be removed. From e39f9904671082c5ad3a2c5acbdbd028fa93bf35 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 2 Apr 2022 16:12:26 -0400 Subject: [PATCH 358/772] Fix overflow hazards in interval input and output conversions. DecodeInterval (interval input) was careless about integer-overflow hazards, allowing bogus results to be obtained for sufficiently large input values. Also, since it initially converted the input to a "struct tm", it was impossible to produce the full range of representable interval values. Meanwhile, EncodeInterval (interval output) and a few other functions could suffer failures if asked to process sufficiently large interval values, because they also relied on being able to represent an interval in "struct tm" which is not designed to handle that. Fix all this stuff by introducing new struct types that are more fit for purpose. While this is clearly a bug fix, it's also an API break for any code that's calling these functions directly. So back-patching doesn't seem wise, especially in view of the lack of field complaints. Joe Koshakow, editorialized a bit by me Discussion: https://postgr.es/m/CAAvxfHff0JLYHwyBrtMx_=6wr=k2Xp+D+-X3vEhHjJYMj+mQcg@mail.gmail.com --- src/backend/utils/adt/datetime.c | 734 ++++++++++++++++--------- src/backend/utils/adt/formatting.c | 86 ++- src/backend/utils/adt/timestamp.c | 177 +++--- src/include/datatype/timestamp.h | 39 ++ src/include/pgtime.h | 3 + src/include/utils/datetime.h | 6 +- src/include/utils/timestamp.h | 5 +- src/test/regress/expected/interval.out | 611 ++++++++++++++++++++ src/test/regress/sql/interval.sql | 184 +++++++ 9 files changed, 1473 insertions(+), 372 deletions(-) diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index ba0ec35ac5..462f2ed7a8 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -21,6 +21,7 @@ #include "access/htup_details.h" #include "access/xact.h" #include "catalog/pg_type.h" +#include "common/int.h" #include "common/string.h" #include "funcapi.h" #include "miscadmin.h" @@ -37,17 +38,31 @@ static int DecodeNumber(int flen, char *field, bool haveTextMonth, static int DecodeNumberField(int len, char *str, int fmask, int *tmask, struct pg_tm *tm, fsec_t *fsec, bool *is2digits); +static int DecodeTimeCommon(char *str, int fmask, int range, + int *tmask, struct pg_itm *itm); static int DecodeTime(char *str, int fmask, int range, int *tmask, struct pg_tm *tm, fsec_t *fsec); +static int DecodeTimeForInterval(char *str, int fmask, int range, + int *tmask, struct pg_itm_in *itm_in); static const datetkn *datebsearch(const char *key, const datetkn *base, int nel); static int DecodeDate(char *str, int fmask, int *tmask, bool *is2digits, struct pg_tm *tm); static char *AppendSeconds(char *cp, int sec, fsec_t fsec, int precision, bool fillzeros); -static void AdjustFractSeconds(double frac, struct pg_tm *tm, fsec_t *fsec, - int scale); -static void AdjustFractDays(double frac, struct pg_tm *tm, fsec_t *fsec, - int scale); +static bool int64_multiply_add(int64 val, int64 multiplier, int64 *sum); +static bool AdjustFractMicroseconds(double frac, int64 scale, + struct pg_itm_in *itm_in); +static bool AdjustFractDays(double frac, int scale, + struct pg_itm_in *itm_in); +static bool AdjustFractYears(double frac, int scale, + struct pg_itm_in *itm_in); +static bool AdjustMicroseconds(int64 val, double fval, int64 scale, + struct pg_itm_in *itm_in); +static bool AdjustDays(int64 val, int scale, + struct pg_itm_in *itm_in); +static bool AdjustMonths(int64 val, struct pg_itm_in *itm_in); +static bool AdjustYears(int64 val, int scale, + struct pg_itm_in *itm_in); static int DetermineTimeZoneOffsetInternal(struct pg_tm *tm, pg_tz *tzp, pg_time_t *tp); static bool DetermineTimeZoneAbbrevOffsetInternal(pg_time_t t, @@ -425,7 +440,7 @@ GetCurrentTimeUsec(struct pg_tm *tm, fsec_t *fsec, int *tzp) * Returns a pointer to the new end of string. No NUL terminator is put * there; callers are responsible for NUL terminating str themselves. * - * Note that any sign is stripped from the input seconds values. + * Note that any sign is stripped from the input sec and fsec values. */ static char * AppendSeconds(char *cp, int sec, fsec_t fsec, int precision, bool fillzeros) @@ -471,7 +486,7 @@ AppendSeconds(char *cp, int sec, fsec_t fsec, int precision, bool fillzeros) /* * If we still have a non-zero value then precision must have not been - * enough to print the number. We punt the problem to pg_ltostr(), + * enough to print the number. We punt the problem to pg_ultostr(), * which will generate a correct answer in the minimum valid width. */ if (value) @@ -496,39 +511,163 @@ AppendTimestampSeconds(char *cp, struct pg_tm *tm, fsec_t fsec) return AppendSeconds(cp, tm->tm_sec, fsec, MAX_TIMESTAMP_PRECISION, true); } + +/* + * Add val * multiplier to *sum. + * Returns true if successful, false on overflow. + */ +static bool +int64_multiply_add(int64 val, int64 multiplier, int64 *sum) +{ + int64 product; + + if (pg_mul_s64_overflow(val, multiplier, &product) || + pg_add_s64_overflow(*sum, product, sum)) + return false; + return true; +} + /* - * Multiply frac by scale (to produce seconds) and add to *tm & *fsec. - * We assume the input frac is less than 1 so overflow is not an issue. + * Multiply frac by scale (to produce microseconds) and add to itm_in->tm_usec. + * Returns true if successful, false if itm_in overflows. */ -static void -AdjustFractSeconds(double frac, struct pg_tm *tm, fsec_t *fsec, int scale) +static bool +AdjustFractMicroseconds(double frac, int64 scale, + struct pg_itm_in *itm_in) { - int sec; + int64 usec; + /* Fast path for common case */ if (frac == 0) - return; + return true; + + /* + * We assume the input frac has abs value less than 1, so overflow of frac + * or usec is not an issue for interesting values of scale. + */ frac *= scale; - sec = (int) frac; - tm->tm_sec += sec; - frac -= sec; - *fsec += rint(frac * 1000000); + usec = (int64) frac; + + /* Round off any fractional microsecond */ + frac -= usec; + if (frac > 0.5) + usec++; + else if (frac < -0.5) + usec--; + + return !pg_add_s64_overflow(itm_in->tm_usec, usec, &itm_in->tm_usec); } -/* As above, but initial scale produces days */ -static void -AdjustFractDays(double frac, struct pg_tm *tm, fsec_t *fsec, int scale) +/* + * Multiply frac by scale (to produce days). Add the integral part of the + * result to itm_in->tm_mday, the fractional part to itm_in->tm_usec. + * Returns true if successful, false if itm_in overflows. + */ +static bool +AdjustFractDays(double frac, int scale, + struct pg_itm_in *itm_in) { int extra_days; + /* Fast path for common case */ if (frac == 0) - return; + return true; + + /* + * We assume the input frac has abs value less than 1, so overflow of frac + * or extra_days is not an issue. + */ frac *= scale; extra_days = (int) frac; - tm->tm_mday += extra_days; + + /* ... but this could overflow, if tm_mday is already nonzero */ + if (pg_add_s32_overflow(itm_in->tm_mday, extra_days, &itm_in->tm_mday)) + return false; + + /* Handle any fractional day */ frac -= extra_days; - AdjustFractSeconds(frac, tm, fsec, SECS_PER_DAY); + return AdjustFractMicroseconds(frac, USECS_PER_DAY, itm_in); +} + +/* + * Multiply frac by scale (to produce years), then further scale up to months. + * Add the integral part of the result to itm_in->tm_mon, discarding any + * fractional part. + * Returns true if successful, false if itm_in overflows. + */ +static bool +AdjustFractYears(double frac, int scale, + struct pg_itm_in *itm_in) +{ + /* + * As above, we assume abs(frac) < 1, so this can't overflow for any + * interesting value of scale. + */ + int extra_months = (int) rint(frac * scale * MONTHS_PER_YEAR); + + return !pg_add_s32_overflow(itm_in->tm_mon, extra_months, &itm_in->tm_mon); +} + +/* + * Add (val + fval) * scale to itm_in->tm_usec. + * Returns true if successful, false if itm_in overflows. + */ +static bool +AdjustMicroseconds(int64 val, double fval, int64 scale, + struct pg_itm_in *itm_in) +{ + /* Handle the integer part */ + if (!int64_multiply_add(val, scale, &itm_in->tm_usec)) + return false; + /* Handle the float part */ + return AdjustFractMicroseconds(fval, scale, itm_in); +} + +/* + * Multiply val by scale (to produce days) and add to itm_in->tm_mday. + * Returns true if successful, false if itm_in overflows. + */ +static bool +AdjustDays(int64 val, int scale, struct pg_itm_in *itm_in) +{ + int days; + + if (val < INT_MIN || val > INT_MAX) + return false; + return !pg_mul_s32_overflow((int32) val, scale, &days) && + !pg_add_s32_overflow(itm_in->tm_mday, days, &itm_in->tm_mday); +} + +/* + * Add val to itm_in->tm_mon (no need for scale here, as val is always + * in months already). + * Returns true if successful, false if itm_in overflows. + */ +static bool +AdjustMonths(int64 val, struct pg_itm_in *itm_in) +{ + if (val < INT_MIN || val > INT_MAX) + return false; + return !pg_add_s32_overflow(itm_in->tm_mon, (int32) val, &itm_in->tm_mon); } +/* + * Multiply val by scale (to produce years) and add to itm_in->tm_year. + * Returns true if successful, false if itm_in overflows. + */ +static bool +AdjustYears(int64 val, int scale, + struct pg_itm_in *itm_in) +{ + int years; + + if (val < INT_MIN || val > INT_MAX) + return false; + return !pg_mul_s32_overflow((int32) val, scale, &years) && + !pg_add_s32_overflow(itm_in->tm_year, years, &itm_in->tm_year); +} + + /* Fetch a fractional-second value with suitable error checking */ static int ParseFractionalSecond(char *cp, fsec_t *fsec) @@ -2548,79 +2687,143 @@ ValidateDate(int fmask, bool isjulian, bool is2digits, bool bc, } -/* DecodeTime() +/* DecodeTimeCommon() * Decode time string which includes delimiters. * Return 0 if okay, a DTERR code if not. + * tmask and itm are output parameters. * - * Only check the lower limit on hours, since this same code can be - * used to represent time spans. + * This code is shared between the timestamp and interval cases. + * We return a struct pg_itm (of which only the tm_usec, tm_sec, tm_min, + * and tm_hour fields are used) and let the wrapper functions below + * convert and range-check as necessary. */ static int -DecodeTime(char *str, int fmask, int range, - int *tmask, struct pg_tm *tm, fsec_t *fsec) +DecodeTimeCommon(char *str, int fmask, int range, + int *tmask, struct pg_itm *itm) { char *cp; int dterr; + fsec_t fsec = 0; *tmask = DTK_TIME_M; errno = 0; - tm->tm_hour = strtoint(str, &cp, 10); + itm->tm_hour = strtoi64(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (*cp != ':') return DTERR_BAD_FORMAT; errno = 0; - tm->tm_min = strtoint(cp + 1, &cp, 10); + itm->tm_min = strtoint(cp + 1, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (*cp == '\0') { - tm->tm_sec = 0; - *fsec = 0; + itm->tm_sec = 0; /* If it's a MINUTE TO SECOND interval, take 2 fields as being mm:ss */ if (range == (INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND))) { - tm->tm_sec = tm->tm_min; - tm->tm_min = tm->tm_hour; - tm->tm_hour = 0; + if (itm->tm_hour > INT_MAX || itm->tm_hour < INT_MIN) + return DTERR_FIELD_OVERFLOW; + itm->tm_sec = itm->tm_min; + itm->tm_min = (int) itm->tm_hour; + itm->tm_hour = 0; } } else if (*cp == '.') { /* always assume mm:ss.sss is MINUTE TO SECOND */ - dterr = ParseFractionalSecond(cp, fsec); + dterr = ParseFractionalSecond(cp, &fsec); if (dterr) return dterr; - tm->tm_sec = tm->tm_min; - tm->tm_min = tm->tm_hour; - tm->tm_hour = 0; + if (itm->tm_hour > INT_MAX || itm->tm_hour < INT_MIN) + return DTERR_FIELD_OVERFLOW; + itm->tm_sec = itm->tm_min; + itm->tm_min = (int) itm->tm_hour; + itm->tm_hour = 0; } else if (*cp == ':') { errno = 0; - tm->tm_sec = strtoint(cp + 1, &cp, 10); + itm->tm_sec = strtoint(cp + 1, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; - if (*cp == '\0') - *fsec = 0; - else if (*cp == '.') + if (*cp == '.') { - dterr = ParseFractionalSecond(cp, fsec); + dterr = ParseFractionalSecond(cp, &fsec); if (dterr) return dterr; } - else + else if (*cp != '\0') return DTERR_BAD_FORMAT; } else return DTERR_BAD_FORMAT; - /* do a sanity check */ - if (tm->tm_hour < 0 || tm->tm_min < 0 || tm->tm_min > MINS_PER_HOUR - 1 || - tm->tm_sec < 0 || tm->tm_sec > SECS_PER_MINUTE || - *fsec < INT64CONST(0) || - *fsec > USECS_PER_SEC) + /* do a sanity check; but caller must check the range of tm_hour */ + if (itm->tm_hour < 0 || + itm->tm_min < 0 || itm->tm_min > MINS_PER_HOUR - 1 || + itm->tm_sec < 0 || itm->tm_sec > SECS_PER_MINUTE || + fsec < 0 || fsec > USECS_PER_SEC) + return DTERR_FIELD_OVERFLOW; + + itm->tm_usec = (int) fsec; + + return 0; +} + +/* DecodeTime() + * Decode time string which includes delimiters. + * Return 0 if okay, a DTERR code if not. + * + * This version is used for timestamps. The results are returned into + * the tm_hour/tm_min/tm_sec fields of *tm, and microseconds into *fsec. + */ +static int +DecodeTime(char *str, int fmask, int range, + int *tmask, struct pg_tm *tm, fsec_t *fsec) +{ + struct pg_itm itm; + int dterr; + + dterr = DecodeTimeCommon(str, fmask, range, + tmask, &itm); + if (dterr) + return dterr; + + if (itm.tm_hour > INT_MAX) + return DTERR_FIELD_OVERFLOW; + tm->tm_hour = (int) itm.tm_hour; + tm->tm_min = itm.tm_min; + tm->tm_sec = itm.tm_sec; + *fsec = itm.tm_usec; + + return 0; +} + +/* DecodeTimeForInterval() + * Decode time string which includes delimiters. + * Return 0 if okay, a DTERR code if not. + * + * This version is used for intervals. The results are returned into + * itm_in->tm_usec. + */ +static int +DecodeTimeForInterval(char *str, int fmask, int range, + int *tmask, struct pg_itm_in *itm_in) +{ + struct pg_itm itm; + int dterr; + + dterr = DecodeTimeCommon(str, fmask, range, + tmask, &itm); + if (dterr) + return dterr; + + itm_in->tm_usec = itm.tm_usec; + if (!int64_multiply_add(itm.tm_hour, USECS_PER_HOUR, &itm_in->tm_usec) || + !int64_multiply_add(itm.tm_min, USECS_PER_MINUTE, &itm_in->tm_usec) || + !int64_multiply_add(itm.tm_sec, USECS_PER_SEC, &itm_in->tm_usec)) return DTERR_FIELD_OVERFLOW; return 0; @@ -3064,27 +3267,24 @@ DecodeSpecial(int field, char *lowtoken, int *val) } -/* ClearPgTm +/* ClearPgItmIn * - * Zero out a pg_tm and associated fsec_t + * Zero out a pg_itm_in */ static inline void -ClearPgTm(struct pg_tm *tm, fsec_t *fsec) +ClearPgItmIn(struct pg_itm_in *itm_in) { - tm->tm_year = 0; - tm->tm_mon = 0; - tm->tm_mday = 0; - tm->tm_hour = 0; - tm->tm_min = 0; - tm->tm_sec = 0; - *fsec = 0; + itm_in->tm_usec = 0; + itm_in->tm_mday = 0; + itm_in->tm_mon = 0; + itm_in->tm_year = 0; } /* DecodeInterval() * Interpret previously parsed fields for general time interval. * Returns 0 if successful, DTERR code if bogus input detected. - * dtype, tm, fsec are output parameters. + * dtype and itm_in are output parameters. * * Allow "date" field DTK_DATE since this could be just * an unsigned floating point number. - thomas 1997-11-16 @@ -3094,21 +3294,53 @@ ClearPgTm(struct pg_tm *tm, fsec_t *fsec) */ int DecodeInterval(char **field, int *ftype, int nf, int range, - int *dtype, struct pg_tm *tm, fsec_t *fsec) + int *dtype, struct pg_itm_in *itm_in) { + bool force_negative = false; bool is_before = false; char *cp; int fmask = 0, tmask, - type; + type, + uval; int i; int dterr; - int val; + int64 val; double fval; *dtype = DTK_DELTA; type = IGNORE_DTF; - ClearPgTm(tm, fsec); + ClearPgItmIn(itm_in); + + /*---------- + * The SQL standard defines the interval literal + * '-1 1:00:00' + * to mean "negative 1 days and negative 1 hours", while Postgres + * traditionally treats this as meaning "negative 1 days and positive + * 1 hours". In SQL_STANDARD intervalstyle, we apply the leading sign + * to all fields if there are no other explicit signs. + * + * We leave the signs alone if there are additional explicit signs. + * This protects us against misinterpreting postgres-style dump output, + * since the postgres-style output code has always put an explicit sign on + * all fields following a negative field. But note that SQL-spec output + * is ambiguous and can be misinterpreted on load! (So it's best practice + * to dump in postgres style, not SQL style.) + *---------- + */ + if (IntervalStyle == INTSTYLE_SQL_STANDARD && *field[0] == '-') + { + force_negative = true; + /* Check for additional explicit signs */ + for (i = 1; i < nf; i++) + { + if (*field[i] == '-' || *field[i] == '+') + { + force_negative = false; + break; + } + } + } /* read through list backwards to pick up units before values */ for (i = nf - 1; i >= 0; i--) @@ -3116,10 +3348,13 @@ DecodeInterval(char **field, int *ftype, int nf, int range, switch (ftype[i]) { case DTK_TIME: - dterr = DecodeTime(field[i], fmask, range, - &tmask, tm, fsec); + dterr = DecodeTimeForInterval(field[i], fmask, range, + &tmask, itm_in); if (dterr) return dterr; + if (force_negative && + itm_in->tm_usec > 0) + itm_in->tm_usec = -itm_in->tm_usec; type = DTK_DAY; break; @@ -3137,18 +3372,21 @@ DecodeInterval(char **field, int *ftype, int nf, int range, * like DTK_TIME case above, plus handling the sign. */ if (strchr(field[i] + 1, ':') != NULL && - DecodeTime(field[i] + 1, fmask, range, - &tmask, tm, fsec) == 0) + DecodeTimeForInterval(field[i] + 1, fmask, range, + &tmask, itm_in) == 0) { if (*field[i] == '-') { - /* flip the sign on all fields */ - tm->tm_hour = -tm->tm_hour; - tm->tm_min = -tm->tm_min; - tm->tm_sec = -tm->tm_sec; - *fsec = -(*fsec); + /* flip the sign on time field */ + if (itm_in->tm_usec == PG_INT64_MIN) + return DTERR_FIELD_OVERFLOW; + itm_in->tm_usec = -itm_in->tm_usec; } + if (force_negative && + itm_in->tm_usec > 0) + itm_in->tm_usec = -itm_in->tm_usec; + /* * Set the next type to be a day, if units are not * specified. This handles the case of '1 +02:03' since we @@ -3204,7 +3442,7 @@ DecodeInterval(char **field, int *ftype, int nf, int range, } errno = 0; - val = strtoint(field[i], &cp, 10); + val = strtoi64(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; @@ -3221,10 +3459,10 @@ DecodeInterval(char **field, int *ftype, int nf, int range, type = DTK_MONTH; if (*field[i] == '-') val2 = -val2; - if (((double) val * MONTHS_PER_YEAR + val2) > INT_MAX || - ((double) val * MONTHS_PER_YEAR + val2) < INT_MIN) + if (pg_mul_s64_overflow(val, MONTHS_PER_YEAR, &val)) + return DTERR_FIELD_OVERFLOW; + if (pg_add_s64_overflow(val, val2, &val)) return DTERR_FIELD_OVERFLOW; - val = val * MONTHS_PER_YEAR + val2; fval = 0; } else if (*cp == '.') @@ -3244,24 +3482,32 @@ DecodeInterval(char **field, int *ftype, int nf, int range, tmask = 0; /* DTK_M(type); */ + if (force_negative) + { + /* val and fval should be of same sign, but test anyway */ + if (val > 0) + val = -val; + if (fval > 0) + fval = -fval; + } + switch (type) { case DTK_MICROSEC: - *fsec += rint(val + fval); + if (!AdjustMicroseconds(val, fval, 1, itm_in)) + return DTERR_FIELD_OVERFLOW; tmask = DTK_M(MICROSECOND); break; case DTK_MILLISEC: - /* avoid overflowing the fsec field */ - tm->tm_sec += val / 1000; - val -= (val / 1000) * 1000; - *fsec += rint((val + fval) * 1000); + if (!AdjustMicroseconds(val, fval, 1000, itm_in)) + return DTERR_FIELD_OVERFLOW; tmask = DTK_M(MILLISECOND); break; case DTK_SECOND: - tm->tm_sec += val; - *fsec += rint(fval * 1000000); + if (!AdjustMicroseconds(val, fval, USECS_PER_SEC, itm_in)) + return DTERR_FIELD_OVERFLOW; /* * If any subseconds were specified, consider this @@ -3274,57 +3520,64 @@ DecodeInterval(char **field, int *ftype, int nf, int range, break; case DTK_MINUTE: - tm->tm_min += val; - AdjustFractSeconds(fval, tm, fsec, SECS_PER_MINUTE); + if (!AdjustMicroseconds(val, fval, USECS_PER_MINUTE, itm_in)) + return DTERR_FIELD_OVERFLOW; tmask = DTK_M(MINUTE); break; case DTK_HOUR: - tm->tm_hour += val; - AdjustFractSeconds(fval, tm, fsec, SECS_PER_HOUR); + if (!AdjustMicroseconds(val, fval, USECS_PER_HOUR, itm_in)) + return DTERR_FIELD_OVERFLOW; tmask = DTK_M(HOUR); type = DTK_DAY; /* set for next field */ break; case DTK_DAY: - tm->tm_mday += val; - AdjustFractSeconds(fval, tm, fsec, SECS_PER_DAY); + if (!AdjustDays(val, 1, itm_in) || + !AdjustFractMicroseconds(fval, USECS_PER_DAY, itm_in)) + return DTERR_FIELD_OVERFLOW; tmask = DTK_M(DAY); break; case DTK_WEEK: - tm->tm_mday += val * 7; - AdjustFractDays(fval, tm, fsec, 7); + if (!AdjustDays(val, 7, itm_in) || + !AdjustFractDays(fval, 7, itm_in)) + return DTERR_FIELD_OVERFLOW; tmask = DTK_M(WEEK); break; case DTK_MONTH: - tm->tm_mon += val; - AdjustFractDays(fval, tm, fsec, DAYS_PER_MONTH); + if (!AdjustMonths(val, itm_in) || + !AdjustFractDays(fval, DAYS_PER_MONTH, itm_in)) + return DTERR_FIELD_OVERFLOW; tmask = DTK_M(MONTH); break; case DTK_YEAR: - tm->tm_year += val; - tm->tm_mon += rint(fval * MONTHS_PER_YEAR); + if (!AdjustYears(val, 1, itm_in) || + !AdjustFractYears(fval, 1, itm_in)) + return DTERR_FIELD_OVERFLOW; tmask = DTK_M(YEAR); break; case DTK_DECADE: - tm->tm_year += val * 10; - tm->tm_mon += rint(fval * MONTHS_PER_YEAR * 10); + if (!AdjustYears(val, 10, itm_in) || + !AdjustFractYears(fval, 10, itm_in)) + return DTERR_FIELD_OVERFLOW; tmask = DTK_M(DECADE); break; case DTK_CENTURY: - tm->tm_year += val * 100; - tm->tm_mon += rint(fval * MONTHS_PER_YEAR * 100); + if (!AdjustYears(val, 100, itm_in) || + !AdjustFractYears(fval, 100, itm_in)) + return DTERR_FIELD_OVERFLOW; tmask = DTK_M(CENTURY); break; case DTK_MILLENNIUM: - tm->tm_year += val * 1000; - tm->tm_mon += rint(fval * MONTHS_PER_YEAR * 1000); + if (!AdjustYears(val, 1000, itm_in) || + !AdjustFractYears(fval, 1000, itm_in)) + return DTERR_FIELD_OVERFLOW; tmask = DTK_M(MILLENNIUM); break; @@ -3335,7 +3588,7 @@ DecodeInterval(char **field, int *ftype, int nf, int range, case DTK_STRING: case DTK_SPECIAL: - type = DecodeUnits(i, field[i], &val); + type = DecodeUnits(i, field[i], &uval); if (type == IGNORE_DTF) continue; @@ -3343,17 +3596,17 @@ DecodeInterval(char **field, int *ftype, int nf, int range, switch (type) { case UNITS: - type = val; + type = uval; break; case AGO: is_before = true; - type = val; + type = uval; break; case RESERV: tmask = (DTK_DATE_M | DTK_TIME_M); - *dtype = val; + *dtype = uval; break; default: @@ -3374,79 +3627,19 @@ DecodeInterval(char **field, int *ftype, int nf, int range, if (fmask == 0) return DTERR_BAD_FORMAT; - /* ensure fractional seconds are fractional */ - if (*fsec != 0) - { - int sec; - - sec = *fsec / USECS_PER_SEC; - *fsec -= sec * USECS_PER_SEC; - tm->tm_sec += sec; - } - - /*---------- - * The SQL standard defines the interval literal - * '-1 1:00:00' - * to mean "negative 1 days and negative 1 hours", while Postgres - * traditionally treats this as meaning "negative 1 days and positive - * 1 hours". In SQL_STANDARD intervalstyle, we apply the leading sign - * to all fields if there are no other explicit signs. - * - * We leave the signs alone if there are additional explicit signs. - * This protects us against misinterpreting postgres-style dump output, - * since the postgres-style output code has always put an explicit sign on - * all fields following a negative field. But note that SQL-spec output - * is ambiguous and can be misinterpreted on load! (So it's best practice - * to dump in postgres style, not SQL style.) - *---------- - */ - if (IntervalStyle == INTSTYLE_SQL_STANDARD && *field[0] == '-') - { - /* Check for additional explicit signs */ - bool more_signs = false; - - for (i = 1; i < nf; i++) - { - if (*field[i] == '-' || *field[i] == '+') - { - more_signs = true; - break; - } - } - - if (!more_signs) - { - /* - * Rather than re-determining which field was field[0], just force - * 'em all negative. - */ - if (*fsec > 0) - *fsec = -(*fsec); - if (tm->tm_sec > 0) - tm->tm_sec = -tm->tm_sec; - if (tm->tm_min > 0) - tm->tm_min = -tm->tm_min; - if (tm->tm_hour > 0) - tm->tm_hour = -tm->tm_hour; - if (tm->tm_mday > 0) - tm->tm_mday = -tm->tm_mday; - if (tm->tm_mon > 0) - tm->tm_mon = -tm->tm_mon; - if (tm->tm_year > 0) - tm->tm_year = -tm->tm_year; - } - } - /* finally, AGO negates everything */ if (is_before) { - *fsec = -(*fsec); - tm->tm_sec = -tm->tm_sec; - tm->tm_min = -tm->tm_min; - tm->tm_hour = -tm->tm_hour; - tm->tm_mday = -tm->tm_mday; - tm->tm_mon = -tm->tm_mon; - tm->tm_year = -tm->tm_year; + if (itm_in->tm_usec == PG_INT64_MIN || + itm_in->tm_mday == INT_MIN || + itm_in->tm_mon == INT_MIN || + itm_in->tm_year == INT_MIN) + return DTERR_FIELD_OVERFLOW; + + itm_in->tm_usec = -itm_in->tm_usec; + itm_in->tm_mday = -itm_in->tm_mday; + itm_in->tm_mon = -itm_in->tm_mon; + itm_in->tm_year = -itm_in->tm_year; } return 0; @@ -3460,26 +3653,35 @@ DecodeInterval(char **field, int *ftype, int nf, int range, * Returns 0 or DTERR code. */ static int -ParseISO8601Number(char *str, char **endptr, int *ipart, double *fpart) +ParseISO8601Number(char *str, char **endptr, int64 *ipart, double *fpart) { - double val; + int sign = 1; - if (!(isdigit((unsigned char) *str) || *str == '-' || *str == '.')) - return DTERR_BAD_FORMAT; + *ipart = 0; + *fpart = 0.0; + + /* Parse sign if there is any */ + if (*str == '-') + { + sign = -1; + str++; + } + + *endptr = str; errno = 0; - val = strtod(str, endptr); - /* did we not see anything that looks like a double? */ + + /* Parse int64 part if there is any */ + if (isdigit((unsigned char) **endptr)) + *ipart = strtoi64(*endptr, endptr, 10) * sign; + + /* Parse fractional part if there is any */ + if (**endptr == '.') + *fpart = strtod(*endptr, endptr) * sign; + + /* did we not see anything that looks like a number? */ if (*endptr == str || errno != 0) return DTERR_BAD_FORMAT; - /* watch out for overflow */ - if (val < INT_MIN || val > INT_MAX) - return DTERR_FIELD_OVERFLOW; - /* be very sure we truncate towards zero (cf dtrunc()) */ - if (val >= 0) - *ipart = (int) floor(val); - else - *ipart = (int) -floor(-val); - *fpart = val - *ipart; + return 0; } @@ -3508,7 +3710,7 @@ ISO8601IntegerWidth(char *fieldstart) * Returns 0 if successful, DTERR code if bogus input detected. * Note: error code should be DTERR_BAD_FORMAT if input doesn't look like * ISO8601, otherwise this could cause unexpected error messages. - * dtype, tm, fsec are output parameters. + * dtype and itm_in are output parameters. * * A couple exceptions from the spec: * - a week field ('W') may coexist with other units @@ -3516,13 +3718,13 @@ ISO8601IntegerWidth(char *fieldstart) */ int DecodeISO8601Interval(char *str, - int *dtype, struct pg_tm *tm, fsec_t *fsec) + int *dtype, struct pg_itm_in *itm_in) { bool datepart = true; bool havefield = false; *dtype = DTK_DELTA; - ClearPgTm(tm, fsec); + ClearPgItmIn(itm_in); if (strlen(str) < 2 || str[0] != 'P') return DTERR_BAD_FORMAT; @@ -3531,7 +3733,7 @@ DecodeISO8601Interval(char *str, while (*str) { char *fieldstart; - int val; + int64 val; double fval; char unit; int dterr; @@ -3560,29 +3762,34 @@ DecodeISO8601Interval(char *str, switch (unit) /* before T: Y M W D */ { case 'Y': - tm->tm_year += val; - tm->tm_mon += rint(fval * MONTHS_PER_YEAR); + if (!AdjustYears(val, 1, itm_in) || + !AdjustFractYears(fval, 1, itm_in)) + return DTERR_FIELD_OVERFLOW; break; case 'M': - tm->tm_mon += val; - AdjustFractDays(fval, tm, fsec, DAYS_PER_MONTH); + if (!AdjustMonths(val, itm_in) || + !AdjustFractDays(fval, DAYS_PER_MONTH, itm_in)) + return DTERR_FIELD_OVERFLOW; break; case 'W': - tm->tm_mday += val * 7; - AdjustFractDays(fval, tm, fsec, 7); + if (!AdjustDays(val, 7, itm_in) || + !AdjustFractDays(fval, 7, itm_in)) + return DTERR_FIELD_OVERFLOW; break; case 'D': - tm->tm_mday += val; - AdjustFractSeconds(fval, tm, fsec, SECS_PER_DAY); + if (!AdjustDays(val, 1, itm_in) || + !AdjustFractMicroseconds(fval, USECS_PER_DAY, itm_in)) + return DTERR_FIELD_OVERFLOW; break; case 'T': /* ISO 8601 4.4.3.3 Alternative Format / Basic */ case '\0': if (ISO8601IntegerWidth(fieldstart) == 8 && !havefield) { - tm->tm_year += val / 10000; - tm->tm_mon += (val / 100) % 100; - tm->tm_mday += val % 100; - AdjustFractSeconds(fval, tm, fsec, SECS_PER_DAY); + if (!AdjustYears(val / 10000, 1, itm_in) || + !AdjustMonths((val / 100) % 100, itm_in) || + !AdjustDays(val % 100, 1, itm_in) || + !AdjustFractMicroseconds(fval, USECS_PER_DAY, itm_in)) + return DTERR_FIELD_OVERFLOW; if (unit == '\0') return 0; datepart = false; @@ -3596,8 +3803,9 @@ DecodeISO8601Interval(char *str, if (havefield) return DTERR_BAD_FORMAT; - tm->tm_year += val; - tm->tm_mon += rint(fval * MONTHS_PER_YEAR); + if (!AdjustYears(val, 1, itm_in) || + !AdjustFractYears(fval, 1, itm_in)) + return DTERR_FIELD_OVERFLOW; if (unit == '\0') return 0; if (unit == 'T') @@ -3610,8 +3818,9 @@ DecodeISO8601Interval(char *str, dterr = ParseISO8601Number(str, &str, &val, &fval); if (dterr) return dterr; - tm->tm_mon += val; - AdjustFractDays(fval, tm, fsec, DAYS_PER_MONTH); + if (!AdjustMonths(val, itm_in) || + !AdjustFractDays(fval, DAYS_PER_MONTH, itm_in)) + return DTERR_FIELD_OVERFLOW; if (*str == '\0') return 0; if (*str == 'T') @@ -3627,8 +3836,9 @@ DecodeISO8601Interval(char *str, dterr = ParseISO8601Number(str, &str, &val, &fval); if (dterr) return dterr; - tm->tm_mday += val; - AdjustFractSeconds(fval, tm, fsec, SECS_PER_DAY); + if (!AdjustDays(val, 1, itm_in) || + !AdjustFractMicroseconds(fval, USECS_PER_DAY, itm_in)) + return DTERR_FIELD_OVERFLOW; if (*str == '\0') return 0; if (*str == 'T') @@ -3648,24 +3858,25 @@ DecodeISO8601Interval(char *str, switch (unit) /* after T: H M S */ { case 'H': - tm->tm_hour += val; - AdjustFractSeconds(fval, tm, fsec, SECS_PER_HOUR); + if (!AdjustMicroseconds(val, fval, USECS_PER_HOUR, itm_in)) + return DTERR_FIELD_OVERFLOW; break; case 'M': - tm->tm_min += val; - AdjustFractSeconds(fval, tm, fsec, SECS_PER_MINUTE); + if (!AdjustMicroseconds(val, fval, USECS_PER_MINUTE, itm_in)) + return DTERR_FIELD_OVERFLOW; break; case 'S': - tm->tm_sec += val; - AdjustFractSeconds(fval, tm, fsec, 1); + if (!AdjustMicroseconds(val, fval, USECS_PER_SEC, itm_in)) + return DTERR_FIELD_OVERFLOW; break; case '\0': /* ISO 8601 4.4.3.3 Alternative Format */ if (ISO8601IntegerWidth(fieldstart) == 6 && !havefield) { - tm->tm_hour += val / 10000; - tm->tm_min += (val / 100) % 100; - tm->tm_sec += val % 100; - AdjustFractSeconds(fval, tm, fsec, 1); + if (!AdjustMicroseconds(val / 10000, 0, USECS_PER_HOUR, itm_in) || + !AdjustMicroseconds((val / 100) % 100, 0, USECS_PER_MINUTE, itm_in) || + !AdjustMicroseconds(val % 100, 0, USECS_PER_SEC, itm_in) || + !AdjustFractMicroseconds(fval, 1, itm_in)) + return DTERR_FIELD_OVERFLOW; return 0; } /* Else fall through to extended alternative format */ @@ -3675,16 +3886,16 @@ DecodeISO8601Interval(char *str, if (havefield) return DTERR_BAD_FORMAT; - tm->tm_hour += val; - AdjustFractSeconds(fval, tm, fsec, SECS_PER_HOUR); + if (!AdjustMicroseconds(val, fval, USECS_PER_HOUR, itm_in)) + return DTERR_FIELD_OVERFLOW; if (unit == '\0') return 0; dterr = ParseISO8601Number(str, &str, &val, &fval); if (dterr) return dterr; - tm->tm_min += val; - AdjustFractSeconds(fval, tm, fsec, SECS_PER_MINUTE); + if (!AdjustMicroseconds(val, fval, USECS_PER_MINUTE, itm_in)) + return DTERR_FIELD_OVERFLOW; if (*str == '\0') return 0; if (*str != ':') @@ -3694,8 +3905,8 @@ DecodeISO8601Interval(char *str, dterr = ParseISO8601Number(str, &str, &val, &fval); if (dterr) return dterr; - tm->tm_sec += val; - AdjustFractSeconds(fval, tm, fsec, 1); + if (!AdjustMicroseconds(val, fval, USECS_PER_SEC, itm_in)) + return DTERR_FIELD_OVERFLOW; if (*str == '\0') return 0; return DTERR_BAD_FORMAT; @@ -4166,25 +4377,25 @@ EncodeDateTime(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, const char /* Append an ISO-8601-style interval field, but only if value isn't zero */ static char * -AddISO8601IntPart(char *cp, int value, char units) +AddISO8601IntPart(char *cp, int64 value, char units) { if (value == 0) return cp; - sprintf(cp, "%d%c", value, units); + sprintf(cp, "%lld%c", (long long) value, units); return cp + strlen(cp); } /* Append a postgres-style interval field, but only if value isn't zero */ static char * -AddPostgresIntPart(char *cp, int value, const char *units, +AddPostgresIntPart(char *cp, int64 value, const char *units, bool *is_zero, bool *is_before) { if (value == 0) return cp; - sprintf(cp, "%s%s%d %s%s", + sprintf(cp, "%s%s%lld %s%s", (!*is_zero) ? " " : "", (*is_before && value > 0) ? "+" : "", - value, + (long long) value, units, (value != 1) ? "s" : ""); @@ -4199,7 +4410,7 @@ AddPostgresIntPart(char *cp, int value, const char *units, /* Append a verbose-style interval field, but only if value isn't zero */ static char * -AddVerboseIntPart(char *cp, int value, const char *units, +AddVerboseIntPart(char *cp, int64 value, const char *units, bool *is_zero, bool *is_before) { if (value == 0) @@ -4208,11 +4419,11 @@ AddVerboseIntPart(char *cp, int value, const char *units, if (*is_zero) { *is_before = (value < 0); - value = abs(value); + value = Abs(value); } else if (*is_before) value = -value; - sprintf(cp, " %d %s%s", value, units, (value == 1) ? "" : "s"); + sprintf(cp, " %lld %s%s", (long long) value, units, (value == 1) ? "" : "s"); *is_zero = false; return cp + strlen(cp); } @@ -4238,15 +4449,16 @@ AddVerboseIntPart(char *cp, int value, const char *units, * "day-time literal"s (that look like ('4 5:6:7') */ void -EncodeInterval(struct pg_tm *tm, fsec_t fsec, int style, char *str) +EncodeInterval(struct pg_itm *itm, int style, char *str) { char *cp = str; - int year = tm->tm_year; - int mon = tm->tm_mon; - int mday = tm->tm_mday; - int hour = tm->tm_hour; - int min = tm->tm_min; - int sec = tm->tm_sec; + int year = itm->tm_year; + int mon = itm->tm_mon; + int64 mday = itm->tm_mday; /* tm_mday could be INT_MIN */ + int64 hour = itm->tm_hour; + int min = itm->tm_min; + int sec = itm->tm_sec; + int fsec = itm->tm_usec; bool is_before = false; bool is_zero = true; @@ -4306,10 +4518,10 @@ EncodeInterval(struct pg_tm *tm, fsec_t fsec, int style, char *str) char sec_sign = (hour < 0 || min < 0 || sec < 0 || fsec < 0) ? '-' : '+'; - sprintf(cp, "%c%d-%d %c%d %c%d:%02d:", + sprintf(cp, "%c%d-%d %c%lld %c%lld:%02d:", year_sign, abs(year), abs(mon), - day_sign, abs(mday), - sec_sign, abs(hour), abs(min)); + day_sign, (long long) Abs(mday), + sec_sign, (long long) Abs(hour), abs(min)); cp += strlen(cp); cp = AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true); *cp = '\0'; @@ -4320,14 +4532,15 @@ EncodeInterval(struct pg_tm *tm, fsec_t fsec, int style, char *str) } else if (has_day) { - sprintf(cp, "%d %d:%02d:", mday, hour, min); + sprintf(cp, "%lld %lld:%02d:", + (long long) mday, (long long) hour, min); cp += strlen(cp); cp = AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true); *cp = '\0'; } else { - sprintf(cp, "%d:%02d:", hour, min); + sprintf(cp, "%lld:%02d:", (long long) hour, min); cp += strlen(cp); cp = AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true); *cp = '\0'; @@ -4377,10 +4590,10 @@ EncodeInterval(struct pg_tm *tm, fsec_t fsec, int style, char *str) { bool minus = (hour < 0 || min < 0 || sec < 0 || fsec < 0); - sprintf(cp, "%s%s%02d:%02d:", + sprintf(cp, "%s%s%02lld:%02d:", is_zero ? "" : " ", (minus ? "-" : (is_before ? "+" : "")), - abs(hour), abs(min)); + (long long) Abs(hour), abs(min)); cp += strlen(cp); cp = AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true); *cp = '\0'; @@ -4668,7 +4881,7 @@ pg_timezone_abbrevs(PG_FUNCTION_ARGS) int gmtoffset; bool is_dst; unsigned char *p; - struct pg_tm tm; + struct pg_itm_in itm_in; Interval *resInterval; /* stuff done only on the first call of the function */ @@ -4761,11 +4974,11 @@ pg_timezone_abbrevs(PG_FUNCTION_ARGS) values[0] = CStringGetTextDatum(buffer); - /* Convert offset (in seconds) to an interval */ - MemSet(&tm, 0, sizeof(struct pg_tm)); - tm.tm_sec = gmtoffset; + /* Convert offset (in seconds) to an interval; can't overflow */ + MemSet(&itm_in, 0, sizeof(struct pg_itm_in)); + itm_in.tm_usec = (int64) gmtoffset * USECS_PER_SEC; resInterval = (Interval *) palloc(sizeof(Interval)); - tm2interval(&tm, 0, resInterval); + (void) itmin2interval(&itm_in, resInterval); values[1] = IntervalPGetDatum(resInterval); values[2] = BoolGetDatum(is_dst); @@ -4795,7 +5008,7 @@ pg_timezone_names(PG_FUNCTION_ARGS) fsec_t fsec; const char *tzn; Interval *resInterval; - struct pg_tm itm; + struct pg_itm_in itm_in; SetSingleFuncCall(fcinfo, 0); @@ -4831,10 +5044,11 @@ pg_timezone_names(PG_FUNCTION_ARGS) values[0] = CStringGetTextDatum(pg_get_timezone_name(tz)); values[1] = CStringGetTextDatum(tzn ? tzn : ""); - MemSet(&itm, 0, sizeof(struct pg_tm)); - itm.tm_sec = -tzoff; + /* Convert tzoff to an interval; can't overflow */ + MemSet(&itm_in, 0, sizeof(struct pg_itm_in)); + itm_in.tm_usec = (int64) -tzoff * USECS_PER_SEC; resInterval = (Interval *) palloc(sizeof(Interval)); - tm2interval(&itm, 0, resInterval); + (void) itmin2interval(&itm_in, resInterval); values[2] = IntervalPGetDatum(resInterval); values[3] = BoolGetDatum(tm.tm_isdst > 0); diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index ac74333be5..843b07d7d2 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -491,11 +491,28 @@ typedef struct /* ---------- * Datetime to char conversion + * + * To support intervals as well as timestamps, we use a custom "tm" struct + * that is almost like struct pg_tm, but has a 64-bit tm_hour field. + * We omit the tm_isdst and tm_zone fields, which are not used here. * ---------- */ +struct fmt_tm +{ + int tm_sec; + int tm_min; + int64 tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + long int tm_gmtoff; +}; + typedef struct TmToChar { - struct pg_tm tm; /* classic 'tm' struct */ + struct fmt_tm tm; /* almost the classic 'tm' struct */ fsec_t fsec; /* fractional seconds */ const char *tzn; /* timezone */ } TmToChar; @@ -504,12 +521,25 @@ typedef struct TmToChar #define tmtcTzn(_X) ((_X)->tzn) #define tmtcFsec(_X) ((_X)->fsec) +/* Note: this is used to copy pg_tm to fmt_tm, so not quite a bitwise copy */ +#define COPY_tm(_DST, _SRC) \ +do { \ + (_DST)->tm_sec = (_SRC)->tm_sec; \ + (_DST)->tm_min = (_SRC)->tm_min; \ + (_DST)->tm_hour = (_SRC)->tm_hour; \ + (_DST)->tm_mday = (_SRC)->tm_mday; \ + (_DST)->tm_mon = (_SRC)->tm_mon; \ + (_DST)->tm_year = (_SRC)->tm_year; \ + (_DST)->tm_wday = (_SRC)->tm_wday; \ + (_DST)->tm_yday = (_SRC)->tm_yday; \ + (_DST)->tm_gmtoff = (_SRC)->tm_gmtoff; \ +} while(0) + +/* Caution: this is used to zero both pg_tm and fmt_tm structs */ #define ZERO_tm(_X) \ do { \ - (_X)->tm_sec = (_X)->tm_year = (_X)->tm_min = (_X)->tm_wday = \ - (_X)->tm_hour = (_X)->tm_yday = (_X)->tm_isdst = 0; \ - (_X)->tm_mday = (_X)->tm_mon = 1; \ - (_X)->tm_zone = NULL; \ + memset(_X, 0, sizeof(*(_X))); \ + (_X)->tm_mday = (_X)->tm_mon = 1; \ } while(0) #define ZERO_tmtc(_X) \ @@ -2649,7 +2679,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col { FormatNode *n; char *s; - struct pg_tm *tm = &in->tm; + struct fmt_tm *tm = &in->tm; int i; /* cache localized days and months */ @@ -2698,16 +2728,17 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col * display time as shown on a 12-hour clock, even for * intervals */ - sprintf(s, "%0*d", S_FM(n->suffix) ? 0 : (tm->tm_hour >= 0) ? 2 : 3, - tm->tm_hour % (HOURS_PER_DAY / 2) == 0 ? HOURS_PER_DAY / 2 : - tm->tm_hour % (HOURS_PER_DAY / 2)); + sprintf(s, "%0*lld", S_FM(n->suffix) ? 0 : (tm->tm_hour >= 0) ? 2 : 3, + tm->tm_hour % (HOURS_PER_DAY / 2) == 0 ? + (long long) (HOURS_PER_DAY / 2) : + (long long) (tm->tm_hour % (HOURS_PER_DAY / 2))); if (S_THth(n->suffix)) str_numth(s, s, S_TH_TYPE(n->suffix)); s += strlen(s); break; case DCH_HH24: - sprintf(s, "%0*d", S_FM(n->suffix) ? 0 : (tm->tm_hour >= 0) ? 2 : 3, - tm->tm_hour); + sprintf(s, "%0*lld", S_FM(n->suffix) ? 0 : (tm->tm_hour >= 0) ? 2 : 3, + (long long) tm->tm_hour); if (S_THth(n->suffix)) str_numth(s, s, S_TH_TYPE(n->suffix)); s += strlen(s); @@ -2755,9 +2786,10 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col break; #undef DCH_to_char_fsec case DCH_SSSS: - sprintf(s, "%d", tm->tm_hour * SECS_PER_HOUR + - tm->tm_min * SECS_PER_MINUTE + - tm->tm_sec); + sprintf(s, "%lld", + (long long) (tm->tm_hour * SECS_PER_HOUR + + tm->tm_min * SECS_PER_MINUTE + + tm->tm_sec)); if (S_THth(n->suffix)) str_numth(s, s, S_TH_TYPE(n->suffix)); s += strlen(s); @@ -4088,7 +4120,8 @@ timestamp_to_char(PG_FUNCTION_ARGS) text *fmt = PG_GETARG_TEXT_PP(1), *res; TmToChar tmtc; - struct pg_tm *tm; + struct pg_tm tt; + struct fmt_tm *tm; int thisdate; if (VARSIZE_ANY_EXHDR(fmt) <= 0 || TIMESTAMP_NOT_FINITE(dt)) @@ -4097,10 +4130,11 @@ timestamp_to_char(PG_FUNCTION_ARGS) ZERO_tmtc(&tmtc); tm = tmtcTm(&tmtc); - if (timestamp2tm(dt, NULL, tm, &tmtcFsec(&tmtc), NULL, NULL) != 0) + if (timestamp2tm(dt, NULL, &tt, &tmtcFsec(&tmtc), NULL, NULL) != 0) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("timestamp out of range"))); + COPY_tm(tm, &tt); thisdate = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday); tm->tm_wday = (thisdate + 1) % 7; @@ -4120,7 +4154,8 @@ timestamptz_to_char(PG_FUNCTION_ARGS) *res; TmToChar tmtc; int tz; - struct pg_tm *tm; + struct pg_tm tt; + struct fmt_tm *tm; int thisdate; if (VARSIZE_ANY_EXHDR(fmt) <= 0 || TIMESTAMP_NOT_FINITE(dt)) @@ -4129,10 +4164,11 @@ timestamptz_to_char(PG_FUNCTION_ARGS) ZERO_tmtc(&tmtc); tm = tmtcTm(&tmtc); - if (timestamp2tm(dt, &tz, tm, &tmtcFsec(&tmtc), &tmtcTzn(&tmtc), NULL) != 0) + if (timestamp2tm(dt, &tz, &tt, &tmtcFsec(&tmtc), &tmtcTzn(&tmtc), NULL) != 0) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("timestamp out of range"))); + COPY_tm(tm, &tt); thisdate = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday); tm->tm_wday = (thisdate + 1) % 7; @@ -4156,7 +4192,9 @@ interval_to_char(PG_FUNCTION_ARGS) text *fmt = PG_GETARG_TEXT_PP(1), *res; TmToChar tmtc; - struct pg_tm *tm; + struct fmt_tm *tm; + struct pg_itm tt, + *itm = &tt; if (VARSIZE_ANY_EXHDR(fmt) <= 0) PG_RETURN_NULL(); @@ -4164,8 +4202,14 @@ interval_to_char(PG_FUNCTION_ARGS) ZERO_tmtc(&tmtc); tm = tmtcTm(&tmtc); - if (interval2tm(*it, tm, &tmtcFsec(&tmtc)) != 0) - PG_RETURN_NULL(); + interval2itm(*it, itm); + tmtc.fsec = itm->tm_usec; + tm->tm_sec = itm->tm_sec; + tm->tm_min = itm->tm_min; + tm->tm_hour = itm->tm_hour; + tm->tm_mday = itm->tm_mday; + tm->tm_mon = itm->tm_mon; + tm->tm_year = itm->tm_year; /* wday is meaningless, yday approximates the total span in days */ tm->tm_yday = (tm->tm_year * MONTHS_PER_YEAR + tm->tm_mon) * DAYS_PER_MONTH + tm->tm_mday; diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 2ba8d41284..70937eaa46 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -889,9 +889,8 @@ interval_in(PG_FUNCTION_ARGS) #endif int32 typmod = PG_GETARG_INT32(2); Interval *result; - fsec_t fsec; - struct pg_tm tt, - *tm = &tt; + struct pg_itm_in tt, + *itm_in = &tt; int dtype; int nf; int range; @@ -900,13 +899,10 @@ interval_in(PG_FUNCTION_ARGS) int ftype[MAXDATEFIELDS]; char workbuf[256]; - tm->tm_year = 0; - tm->tm_mon = 0; - tm->tm_mday = 0; - tm->tm_hour = 0; - tm->tm_min = 0; - tm->tm_sec = 0; - fsec = 0; + itm_in->tm_year = 0; + itm_in->tm_mon = 0; + itm_in->tm_mday = 0; + itm_in->tm_usec = 0; if (typmod >= 0) range = INTERVAL_RANGE(typmod); @@ -917,12 +913,12 @@ interval_in(PG_FUNCTION_ARGS) ftype, MAXDATEFIELDS, &nf); if (dterr == 0) dterr = DecodeInterval(field, ftype, nf, range, - &dtype, tm, &fsec); + &dtype, itm_in); /* if those functions think it's a bad format, try ISO8601 style */ if (dterr == DTERR_BAD_FORMAT) dterr = DecodeISO8601Interval(str, - &dtype, tm, &fsec); + &dtype, itm_in); if (dterr != 0) { @@ -936,7 +932,7 @@ interval_in(PG_FUNCTION_ARGS) switch (dtype) { case DTK_DELTA: - if (tm2interval(tm, fsec, result) != 0) + if (itmin2interval(itm_in, result) != 0) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("interval out of range"))); @@ -960,15 +956,12 @@ interval_out(PG_FUNCTION_ARGS) { Interval *span = PG_GETARG_INTERVAL_P(0); char *result; - struct pg_tm tt, - *tm = &tt; - fsec_t fsec; + struct pg_itm tt, + *itm = &tt; char buf[MAXDATELEN + 1]; - if (interval2tm(*span, tm, &fsec) != 0) - elog(ERROR, "could not convert interval to tm"); - - EncodeInterval(tm, fsec, IntervalStyle, buf); + interval2itm(*span, itm); + EncodeInterval(itm, IntervalStyle, buf); result = pstrdup(buf); PG_RETURN_CSTRING(result); @@ -1960,50 +1953,77 @@ tm2timestamp(struct pg_tm *tm, fsec_t fsec, int *tzp, Timestamp *result) } -/* interval2tm() - * Convert an interval data type to a tm structure. +/* interval2itm() + * Convert an Interval to a pg_itm structure. + * Note: overflow is not possible, because the pg_itm fields are + * wide enough for all possible conversion results. */ -int -interval2tm(Interval span, struct pg_tm *tm, fsec_t *fsec) +void +interval2itm(Interval span, struct pg_itm *itm) { TimeOffset time; TimeOffset tfrac; - tm->tm_year = span.month / MONTHS_PER_YEAR; - tm->tm_mon = span.month % MONTHS_PER_YEAR; - tm->tm_mday = span.day; + itm->tm_year = span.month / MONTHS_PER_YEAR; + itm->tm_mon = span.month % MONTHS_PER_YEAR; + itm->tm_mday = span.day; time = span.time; tfrac = time / USECS_PER_HOUR; time -= tfrac * USECS_PER_HOUR; - tm->tm_hour = tfrac; - if (!SAMESIGN(tm->tm_hour, tfrac)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); + itm->tm_hour = tfrac; tfrac = time / USECS_PER_MINUTE; time -= tfrac * USECS_PER_MINUTE; - tm->tm_min = tfrac; + itm->tm_min = (int) tfrac; tfrac = time / USECS_PER_SEC; - *fsec = time - (tfrac * USECS_PER_SEC); - tm->tm_sec = tfrac; + time -= tfrac * USECS_PER_SEC; + itm->tm_sec = (int) tfrac; + itm->tm_usec = (int) time; +} + +/* itm2interval() + * Convert a pg_itm structure to an Interval. + * Returns 0 if OK, -1 on overflow. + */ +int +itm2interval(struct pg_itm *itm, Interval *span) +{ + int64 total_months = (int64) itm->tm_year * MONTHS_PER_YEAR + itm->tm_mon; + if (total_months > INT_MAX || total_months < INT_MIN) + return -1; + span->month = (int32) total_months; + span->day = itm->tm_mday; + if (pg_mul_s64_overflow(itm->tm_hour, USECS_PER_HOUR, + &span->time)) + return -1; + /* tm_min, tm_sec are 32 bits, so intermediate products can't overflow */ + if (pg_add_s64_overflow(span->time, itm->tm_min * USECS_PER_MINUTE, + &span->time)) + return -1; + if (pg_add_s64_overflow(span->time, itm->tm_sec * USECS_PER_SEC, + &span->time)) + return -1; + if (pg_add_s64_overflow(span->time, itm->tm_usec, + &span->time)) + return -1; return 0; } +/* itmin2interval() + * Convert a pg_itm_in structure to an Interval. + * Returns 0 if OK, -1 on overflow. + */ int -tm2interval(struct pg_tm *tm, fsec_t fsec, Interval *span) +itmin2interval(struct pg_itm_in *itm_in, Interval *span) { - double total_months = (double) tm->tm_year * MONTHS_PER_YEAR + tm->tm_mon; + int64 total_months = (int64) itm_in->tm_year * MONTHS_PER_YEAR + itm_in->tm_mon; if (total_months > INT_MAX || total_months < INT_MIN) return -1; - span->month = total_months; - span->day = tm->tm_mday; - span->time = (((((tm->tm_hour * INT64CONST(60)) + - tm->tm_min) * INT64CONST(60)) + - tm->tm_sec) * USECS_PER_SEC) + fsec; - + span->month = (int32) total_months; + span->day = itm_in->tm_mday; + span->time = itm_in->tm_usec; return 0; } @@ -3612,10 +3632,9 @@ timestamp_age(PG_FUNCTION_ARGS) Timestamp dt1 = PG_GETARG_TIMESTAMP(0); Timestamp dt2 = PG_GETARG_TIMESTAMP(1); Interval *result; - fsec_t fsec, - fsec1, + fsec_t fsec1, fsec2; - struct pg_tm tt, + struct pg_itm tt, *tm = &tt; struct pg_tm tt1, *tm1 = &tt1; @@ -3628,7 +3647,7 @@ timestamp_age(PG_FUNCTION_ARGS) timestamp2tm(dt2, NULL, tm2, &fsec2, NULL, NULL) == 0) { /* form the symbolic difference */ - fsec = fsec1 - fsec2; + tm->tm_usec = fsec1 - fsec2; tm->tm_sec = tm1->tm_sec - tm2->tm_sec; tm->tm_min = tm1->tm_min - tm2->tm_min; tm->tm_hour = tm1->tm_hour - tm2->tm_hour; @@ -3639,7 +3658,7 @@ timestamp_age(PG_FUNCTION_ARGS) /* flip sign if necessary... */ if (dt1 < dt2) { - fsec = -fsec; + tm->tm_usec = -tm->tm_usec; tm->tm_sec = -tm->tm_sec; tm->tm_min = -tm->tm_min; tm->tm_hour = -tm->tm_hour; @@ -3649,9 +3668,9 @@ timestamp_age(PG_FUNCTION_ARGS) } /* propagate any negative fields into the next higher field */ - while (fsec < 0) + while (tm->tm_usec < 0) { - fsec += USECS_PER_SEC; + tm->tm_usec += USECS_PER_SEC; tm->tm_sec--; } @@ -3696,7 +3715,7 @@ timestamp_age(PG_FUNCTION_ARGS) /* recover sign if necessary... */ if (dt1 < dt2) { - fsec = -fsec; + tm->tm_usec = -tm->tm_usec; tm->tm_sec = -tm->tm_sec; tm->tm_min = -tm->tm_min; tm->tm_hour = -tm->tm_hour; @@ -3705,7 +3724,7 @@ timestamp_age(PG_FUNCTION_ARGS) tm->tm_year = -tm->tm_year; } - if (tm2interval(tm, fsec, result) != 0) + if (itm2interval(tm, result) != 0) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("interval out of range"))); @@ -3731,10 +3750,9 @@ timestamptz_age(PG_FUNCTION_ARGS) TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0); TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1); Interval *result; - fsec_t fsec, - fsec1, + fsec_t fsec1, fsec2; - struct pg_tm tt, + struct pg_itm tt, *tm = &tt; struct pg_tm tt1, *tm1 = &tt1; @@ -3749,7 +3767,7 @@ timestamptz_age(PG_FUNCTION_ARGS) timestamp2tm(dt2, &tz2, tm2, &fsec2, NULL, NULL) == 0) { /* form the symbolic difference */ - fsec = fsec1 - fsec2; + tm->tm_usec = fsec1 - fsec2; tm->tm_sec = tm1->tm_sec - tm2->tm_sec; tm->tm_min = tm1->tm_min - tm2->tm_min; tm->tm_hour = tm1->tm_hour - tm2->tm_hour; @@ -3760,7 +3778,7 @@ timestamptz_age(PG_FUNCTION_ARGS) /* flip sign if necessary... */ if (dt1 < dt2) { - fsec = -fsec; + tm->tm_usec = -tm->tm_usec; tm->tm_sec = -tm->tm_sec; tm->tm_min = -tm->tm_min; tm->tm_hour = -tm->tm_hour; @@ -3770,9 +3788,9 @@ timestamptz_age(PG_FUNCTION_ARGS) } /* propagate any negative fields into the next higher field */ - while (fsec < 0) + while (tm->tm_usec < 0) { - fsec += USECS_PER_SEC; + tm->tm_usec += USECS_PER_SEC; tm->tm_sec--; } @@ -3821,7 +3839,7 @@ timestamptz_age(PG_FUNCTION_ARGS) /* recover sign if necessary... */ if (dt1 < dt2) { - fsec = -fsec; + tm->tm_usec = -tm->tm_usec; tm->tm_sec = -tm->tm_sec; tm->tm_min = -tm->tm_min; tm->tm_hour = -tm->tm_hour; @@ -3830,7 +3848,7 @@ timestamptz_age(PG_FUNCTION_ARGS) tm->tm_year = -tm->tm_year; } - if (tm2interval(tm, fsec, result) != 0) + if (itm2interval(tm, result) != 0) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("interval out of range"))); @@ -4317,8 +4335,7 @@ interval_trunc(PG_FUNCTION_ARGS) int type, val; char *lowunits; - fsec_t fsec; - struct pg_tm tt, + struct pg_itm tt, *tm = &tt; result = (Interval *) palloc(sizeof(Interval)); @@ -4331,8 +4348,7 @@ interval_trunc(PG_FUNCTION_ARGS) if (type == UNITS) { - if (interval2tm(*interval, tm, &fsec) == 0) - { + interval2itm(*interval, tm); switch (val) { case DTK_MILLENNIUM: @@ -4366,10 +4382,10 @@ interval_trunc(PG_FUNCTION_ARGS) tm->tm_sec = 0; /* FALL THRU */ case DTK_SECOND: - fsec = 0; + tm->tm_usec = 0; break; case DTK_MILLISEC: - fsec = (fsec / 1000) * 1000; + tm->tm_usec = (tm->tm_usec / 1000) * 1000; break; case DTK_MICROSEC: break; @@ -4382,13 +4398,10 @@ interval_trunc(PG_FUNCTION_ARGS) (val == DTK_WEEK) ? errdetail("Months usually have fractional weeks.") : 0)); } - if (tm2interval(tm, fsec, result) != 0) + if (itm2interval(tm, result) != 0) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("interval out of range"))); - } - else - elog(ERROR, "could not convert interval to tm"); } else { @@ -5200,8 +5213,7 @@ interval_part_common(PG_FUNCTION_ARGS, bool retnumeric) int type, val; char *lowunits; - fsec_t fsec; - struct pg_tm tt, + struct pg_itm tt, *tm = &tt; lowunits = downcase_truncate_identifier(VARDATA_ANY(units), @@ -5214,12 +5226,11 @@ interval_part_common(PG_FUNCTION_ARGS, bool retnumeric) if (type == UNITS) { - if (interval2tm(*interval, tm, &fsec) == 0) - { + interval2itm(*interval, tm); switch (val) { case DTK_MICROSEC: - intresult = tm->tm_sec * INT64CONST(1000000) + fsec; + intresult = tm->tm_sec * INT64CONST(1000000) + tm->tm_usec; break; case DTK_MILLISEC: @@ -5228,9 +5239,9 @@ interval_part_common(PG_FUNCTION_ARGS, bool retnumeric) * tm->tm_sec * 1000 + fsec / 1000 * = (tm->tm_sec * 1'000'000 + fsec) / 1000 */ - PG_RETURN_NUMERIC(int64_div_fast_to_numeric(tm->tm_sec * INT64CONST(1000000) + fsec, 3)); + PG_RETURN_NUMERIC(int64_div_fast_to_numeric(tm->tm_sec * INT64CONST(1000000) + tm->tm_usec, 3)); else - PG_RETURN_FLOAT8(tm->tm_sec * 1000.0 + fsec / 1000.0); + PG_RETURN_FLOAT8(tm->tm_sec * 1000.0 + tm->tm_usec / 1000.0); break; case DTK_SECOND: @@ -5239,9 +5250,9 @@ interval_part_common(PG_FUNCTION_ARGS, bool retnumeric) * tm->tm_sec + fsec / 1'000'000 * = (tm->tm_sec * 1'000'000 + fsec) / 1'000'000 */ - PG_RETURN_NUMERIC(int64_div_fast_to_numeric(tm->tm_sec * INT64CONST(1000000) + fsec, 6)); + PG_RETURN_NUMERIC(int64_div_fast_to_numeric(tm->tm_sec * INT64CONST(1000000) + tm->tm_usec, 6)); else - PG_RETURN_FLOAT8(tm->tm_sec + fsec / 1000000.0); + PG_RETURN_FLOAT8(tm->tm_sec + tm->tm_usec / 1000000.0); break; case DTK_MINUTE: @@ -5290,12 +5301,6 @@ interval_part_common(PG_FUNCTION_ARGS, bool retnumeric) lowunits, format_type_be(INTERVALOID)))); intresult = 0; } - } - else - { - elog(ERROR, "could not convert interval to tm"); - intresult = 0; - } } else if (type == RESERV && val == DTK_EPOCH) { diff --git a/src/include/datatype/timestamp.h b/src/include/datatype/timestamp.h index 5fa38d20d8..d155f1b03b 100644 --- a/src/include/datatype/timestamp.h +++ b/src/include/datatype/timestamp.h @@ -40,6 +40,10 @@ typedef int64 TimestampTz; typedef int64 TimeOffset; typedef int32 fsec_t; /* fractional seconds (in microseconds) */ + +/* + * Storage format for type interval. + */ typedef struct { TimeOffset time; /* all time units other than days, months and @@ -48,6 +52,41 @@ typedef struct int32 month; /* months and years, after time for alignment */ } Interval; +/* + * Data structure representing a broken-down interval. + * + * For historical reasons, this is modeled on struct pg_tm for timestamps. + * Unlike the situation for timestamps, there's no magic interpretation + * needed for months or years: they're just zero or not. Note that fields + * can be negative; however, because of the divisions done while converting + * from struct Interval, only tm_mday could be INT_MIN. This is important + * because we may need to negate the values in some code paths. + */ +struct pg_itm +{ + int tm_usec; + int tm_sec; + int tm_min; + int64 tm_hour; /* needs to be wide */ + int tm_mday; + int tm_mon; + int tm_year; +}; + +/* + * Data structure for decoding intervals. We could just use struct pg_itm, + * but then the requirement for tm_usec to be 64 bits would propagate to + * places where it's not really needed. Also, omitting the fields that + * aren't used during decoding seems like a good error-prevention measure. + */ +struct pg_itm_in +{ + int64 tm_usec; /* needs to be wide */ + int tm_mday; + int tm_mon; + int tm_year; +}; + /* Limits on the "precision" option (typmod) for these data types */ #define MAX_TIMESTAMP_PRECISION 6 diff --git a/src/include/pgtime.h b/src/include/pgtime.h index 2977b13aab..441d7847c1 100644 --- a/src/include/pgtime.h +++ b/src/include/pgtime.h @@ -23,6 +23,8 @@ typedef int64 pg_time_t; /* + * Data structure representing a broken-down timestamp. + * * CAUTION: the IANA timezone library (src/timezone/) follows the POSIX * convention that tm_mon counts from 0 and tm_year is relative to 1900. * However, Postgres' datetime functions generally treat tm_mon as counting @@ -44,6 +46,7 @@ struct pg_tm const char *tm_zone; }; +/* These structs are opaque outside the timezone library */ typedef struct pg_tz pg_tz; typedef struct pg_tzenum pg_tzenum; diff --git a/src/include/utils/datetime.h b/src/include/utils/datetime.h index 0d158f3e4b..0801858d60 100644 --- a/src/include/utils/datetime.h +++ b/src/include/utils/datetime.h @@ -300,9 +300,9 @@ extern int DecodeTimeOnly(char **field, int *ftype, int nf, int *dtype, struct pg_tm *tm, fsec_t *fsec, int *tzp); extern int DecodeInterval(char **field, int *ftype, int nf, int range, - int *dtype, struct pg_tm *tm, fsec_t *fsec); + int *dtype, struct pg_itm_in *itm_in); extern int DecodeISO8601Interval(char *str, - int *dtype, struct pg_tm *tm, fsec_t *fsec); + int *dtype, struct pg_itm_in *itm_in); extern void DateTimeParseError(int dterr, const char *str, const char *datatype) pg_attribute_noreturn(); @@ -315,7 +315,7 @@ extern int DetermineTimeZoneAbbrevOffsetTS(TimestampTz ts, const char *abbr, extern void EncodeDateOnly(struct pg_tm *tm, int style, char *str); extern void EncodeTimeOnly(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, int style, char *str); extern void EncodeDateTime(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, const char *tzn, int style, char *str); -extern void EncodeInterval(struct pg_tm *tm, fsec_t fsec, int style, char *str); +extern void EncodeInterval(struct pg_itm *itm, int style, char *str); extern void EncodeSpecialTimestamp(Timestamp dt, char *str); extern int ValidateDate(int fmask, bool isjulian, bool is2digits, bool bc, diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h index c1a74f8e2b..d33421d380 100644 --- a/src/include/utils/timestamp.h +++ b/src/include/utils/timestamp.h @@ -88,8 +88,9 @@ extern int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm *tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone); extern void dt2time(Timestamp dt, int *hour, int *min, int *sec, fsec_t *fsec); -extern int interval2tm(Interval span, struct pg_tm *tm, fsec_t *fsec); -extern int tm2interval(struct pg_tm *tm, fsec_t fsec, Interval *span); +extern void interval2itm(Interval span, struct pg_itm *itm); +extern int itm2interval(struct pg_itm *itm, Interval *span); +extern int itmin2interval(struct pg_itm_in *itm_in, Interval *span); extern Timestamp SetEpochTimestamp(void); extern void GetEpochTime(struct pg_tm *tm); diff --git a/src/test/regress/expected/interval.out b/src/test/regress/expected/interval.out index 9a7e2852f2..86c8d4bc99 100644 --- a/src/test/regress/expected/interval.out +++ b/src/test/regress/expected/interval.out @@ -928,6 +928,617 @@ select interval '0:0:0.7', interval '@ 0.70 secs', interval '0.7 seconds'; @ 0.7 secs | @ 0.7 secs | @ 0.7 secs (1 row) +-- test time fields using entire 64 bit microseconds range +select interval '2562047788.01521550194 hours'; + interval +----------------------------------- + @ 2562047788 hours 54.775807 secs +(1 row) + +select interval '-2562047788.01521550222 hours'; + interval +--------------------------------------- + @ 2562047788 hours 54.775808 secs ago +(1 row) + +select interval '153722867280.912930117 minutes'; + interval +----------------------------------- + @ 2562047788 hours 54.775807 secs +(1 row) + +select interval '-153722867280.912930133 minutes'; + interval +--------------------------------------- + @ 2562047788 hours 54.775808 secs ago +(1 row) + +select interval '9223372036854.775807 seconds'; + interval +----------------------------------- + @ 2562047788 hours 54.775807 secs +(1 row) + +select interval '-9223372036854.775808 seconds'; + interval +--------------------------------------- + @ 2562047788 hours 54.775808 secs ago +(1 row) + +select interval '9223372036854775.807 milliseconds'; + interval +----------------------------------- + @ 2562047788 hours 54.775807 secs +(1 row) + +select interval '-9223372036854775.808 milliseconds'; + interval +--------------------------------------- + @ 2562047788 hours 54.775808 secs ago +(1 row) + +select interval '9223372036854775807 microseconds'; + interval +----------------------------------- + @ 2562047788 hours 54.775807 secs +(1 row) + +select interval '-9223372036854775808 microseconds'; + interval +--------------------------------------- + @ 2562047788 hours 54.775808 secs ago +(1 row) + +select interval 'PT2562047788H54.775807S'; + interval +----------------------------------- + @ 2562047788 hours 54.775807 secs +(1 row) + +select interval 'PT-2562047788H-54.775808S'; + interval +--------------------------------------- + @ 2562047788 hours 54.775808 secs ago +(1 row) + +select interval 'PT2562047788:00:54.775807'; + interval +----------------------------------- + @ 2562047788 hours 54.775807 secs +(1 row) + +select interval 'PT2562047788.0152155019444'; + interval +----------------------------------- + @ 2562047788 hours 54.775807 secs +(1 row) + +select interval 'PT-2562047788.0152155022222'; + interval +--------------------------------------- + @ 2562047788 hours 54.775808 secs ago +(1 row) + +-- overflow each date/time field +select interval '2147483648 years'; +ERROR: interval field value out of range: "2147483648 years" +LINE 1: select interval '2147483648 years'; + ^ +select interval '-2147483649 years'; +ERROR: interval field value out of range: "-2147483649 years" +LINE 1: select interval '-2147483649 years'; + ^ +select interval '2147483648 months'; +ERROR: interval field value out of range: "2147483648 months" +LINE 1: select interval '2147483648 months'; + ^ +select interval '-2147483649 months'; +ERROR: interval field value out of range: "-2147483649 months" +LINE 1: select interval '-2147483649 months'; + ^ +select interval '2147483648 days'; +ERROR: interval field value out of range: "2147483648 days" +LINE 1: select interval '2147483648 days'; + ^ +select interval '-2147483649 days'; +ERROR: interval field value out of range: "-2147483649 days" +LINE 1: select interval '-2147483649 days'; + ^ +select interval '2562047789 hours'; +ERROR: interval field value out of range: "2562047789 hours" +LINE 1: select interval '2562047789 hours'; + ^ +select interval '-2562047789 hours'; +ERROR: interval field value out of range: "-2562047789 hours" +LINE 1: select interval '-2562047789 hours'; + ^ +select interval '153722867281 minutes'; +ERROR: interval field value out of range: "153722867281 minutes" +LINE 1: select interval '153722867281 minutes'; + ^ +select interval '-153722867281 minutes'; +ERROR: interval field value out of range: "-153722867281 minutes" +LINE 1: select interval '-153722867281 minutes'; + ^ +select interval '9223372036855 seconds'; +ERROR: interval field value out of range: "9223372036855 seconds" +LINE 1: select interval '9223372036855 seconds'; + ^ +select interval '-9223372036855 seconds'; +ERROR: interval field value out of range: "-9223372036855 seconds" +LINE 1: select interval '-9223372036855 seconds'; + ^ +select interval '9223372036854777 millisecond'; +ERROR: interval field value out of range: "9223372036854777 millisecond" +LINE 1: select interval '9223372036854777 millisecond'; + ^ +select interval '-9223372036854777 millisecond'; +ERROR: interval field value out of range: "-9223372036854777 millisecond" +LINE 1: select interval '-9223372036854777 millisecond'; + ^ +select interval '9223372036854775808 microsecond'; +ERROR: interval field value out of range: "9223372036854775808 microsecond" +LINE 1: select interval '9223372036854775808 microsecond'; + ^ +select interval '-9223372036854775809 microsecond'; +ERROR: interval field value out of range: "-9223372036854775809 microsecond" +LINE 1: select interval '-9223372036854775809 microsecond'; + ^ +select interval 'P2147483648'; +ERROR: interval field value out of range: "P2147483648" +LINE 1: select interval 'P2147483648'; + ^ +select interval 'P-2147483649'; +ERROR: interval field value out of range: "P-2147483649" +LINE 1: select interval 'P-2147483649'; + ^ +select interval 'P1-2147483647-2147483647'; +ERROR: interval out of range +LINE 1: select interval 'P1-2147483647-2147483647'; + ^ +select interval 'PT2562047789'; +ERROR: interval field value out of range: "PT2562047789" +LINE 1: select interval 'PT2562047789'; + ^ +select interval 'PT-2562047789'; +ERROR: interval field value out of range: "PT-2562047789" +LINE 1: select interval 'PT-2562047789'; + ^ +-- overflow with date/time unit aliases +select interval '2147483647 weeks'; +ERROR: interval field value out of range: "2147483647 weeks" +LINE 1: select interval '2147483647 weeks'; + ^ +select interval '-2147483648 weeks'; +ERROR: interval field value out of range: "-2147483648 weeks" +LINE 1: select interval '-2147483648 weeks'; + ^ +select interval '2147483647 decades'; +ERROR: interval field value out of range: "2147483647 decades" +LINE 1: select interval '2147483647 decades'; + ^ +select interval '-2147483648 decades'; +ERROR: interval field value out of range: "-2147483648 decades" +LINE 1: select interval '-2147483648 decades'; + ^ +select interval '2147483647 centuries'; +ERROR: interval field value out of range: "2147483647 centuries" +LINE 1: select interval '2147483647 centuries'; + ^ +select interval '-2147483648 centuries'; +ERROR: interval field value out of range: "-2147483648 centuries" +LINE 1: select interval '-2147483648 centuries'; + ^ +select interval '2147483647 millennium'; +ERROR: interval field value out of range: "2147483647 millennium" +LINE 1: select interval '2147483647 millennium'; + ^ +select interval '-2147483648 millennium'; +ERROR: interval field value out of range: "-2147483648 millennium" +LINE 1: select interval '-2147483648 millennium'; + ^ +select interval '1 week 2147483647 days'; +ERROR: interval field value out of range: "1 week 2147483647 days" +LINE 1: select interval '1 week 2147483647 days'; + ^ +select interval '-1 week -2147483648 days'; +ERROR: interval field value out of range: "-1 week -2147483648 days" +LINE 1: select interval '-1 week -2147483648 days'; + ^ +select interval '2147483647 days 1 week'; +ERROR: interval field value out of range: "2147483647 days 1 week" +LINE 1: select interval '2147483647 days 1 week'; + ^ +select interval '-2147483648 days -1 week'; +ERROR: interval field value out of range: "-2147483648 days -1 week" +LINE 1: select interval '-2147483648 days -1 week'; + ^ +select interval 'P1W2147483647D'; +ERROR: interval field value out of range: "P1W2147483647D" +LINE 1: select interval 'P1W2147483647D'; + ^ +select interval 'P-1W-2147483648D'; +ERROR: interval field value out of range: "P-1W-2147483648D" +LINE 1: select interval 'P-1W-2147483648D'; + ^ +select interval 'P2147483647D1W'; +ERROR: interval field value out of range: "P2147483647D1W" +LINE 1: select interval 'P2147483647D1W'; + ^ +select interval 'P-2147483648D-1W'; +ERROR: interval field value out of range: "P-2147483648D-1W" +LINE 1: select interval 'P-2147483648D-1W'; + ^ +select interval '1 decade 2147483647 years'; +ERROR: interval field value out of range: "1 decade 2147483647 years" +LINE 1: select interval '1 decade 2147483647 years'; + ^ +select interval '1 century 2147483647 years'; +ERROR: interval field value out of range: "1 century 2147483647 years" +LINE 1: select interval '1 century 2147483647 years'; + ^ +select interval '1 millennium 2147483647 years'; +ERROR: interval field value out of range: "1 millennium 2147483647 years" +LINE 1: select interval '1 millennium 2147483647 years'; + ^ +select interval '-1 decade -2147483648 years'; +ERROR: interval field value out of range: "-1 decade -2147483648 years" +LINE 1: select interval '-1 decade -2147483648 years'; + ^ +select interval '-1 century -2147483648 years'; +ERROR: interval field value out of range: "-1 century -2147483648 years" +LINE 1: select interval '-1 century -2147483648 years'; + ^ +select interval '-1 millennium -2147483648 years'; +ERROR: interval field value out of range: "-1 millennium -2147483648 years" +LINE 1: select interval '-1 millennium -2147483648 years'; + ^ +select interval '2147483647 years 1 decade'; +ERROR: interval field value out of range: "2147483647 years 1 decade" +LINE 1: select interval '2147483647 years 1 decade'; + ^ +select interval '2147483647 years 1 century'; +ERROR: interval field value out of range: "2147483647 years 1 century" +LINE 1: select interval '2147483647 years 1 century'; + ^ +select interval '2147483647 years 1 millennium'; +ERROR: interval field value out of range: "2147483647 years 1 millennium" +LINE 1: select interval '2147483647 years 1 millennium'; + ^ +select interval '-2147483648 years -1 decade'; +ERROR: interval field value out of range: "-2147483648 years -1 decade" +LINE 1: select interval '-2147483648 years -1 decade'; + ^ +select interval '-2147483648 years -1 century'; +ERROR: interval field value out of range: "-2147483648 years -1 century" +LINE 1: select interval '-2147483648 years -1 century'; + ^ +select interval '-2147483648 years -1 millennium'; +ERROR: interval field value out of range: "-2147483648 years -1 millennium" +LINE 1: select interval '-2147483648 years -1 millennium'; + ^ +-- overflowing with fractional fields - postgres format +select interval '0.1 millennium 2147483647 months'; +ERROR: interval field value out of range: "0.1 millennium 2147483647 months" +LINE 1: select interval '0.1 millennium 2147483647 months'; + ^ +select interval '0.1 centuries 2147483647 months'; +ERROR: interval field value out of range: "0.1 centuries 2147483647 months" +LINE 1: select interval '0.1 centuries 2147483647 months'; + ^ +select interval '0.1 decades 2147483647 months'; +ERROR: interval field value out of range: "0.1 decades 2147483647 months" +LINE 1: select interval '0.1 decades 2147483647 months'; + ^ +select interval '0.1 yrs 2147483647 months'; +ERROR: interval field value out of range: "0.1 yrs 2147483647 months" +LINE 1: select interval '0.1 yrs 2147483647 months'; + ^ +select interval '-0.1 millennium -2147483648 months'; +ERROR: interval field value out of range: "-0.1 millennium -2147483648 months" +LINE 1: select interval '-0.1 millennium -2147483648 months'; + ^ +select interval '-0.1 centuries -2147483648 months'; +ERROR: interval field value out of range: "-0.1 centuries -2147483648 months" +LINE 1: select interval '-0.1 centuries -2147483648 months'; + ^ +select interval '-0.1 decades -2147483648 months'; +ERROR: interval field value out of range: "-0.1 decades -2147483648 months" +LINE 1: select interval '-0.1 decades -2147483648 months'; + ^ +select interval '-0.1 yrs -2147483648 months'; +ERROR: interval field value out of range: "-0.1 yrs -2147483648 months" +LINE 1: select interval '-0.1 yrs -2147483648 months'; + ^ +select interval '2147483647 months 0.1 millennium'; +ERROR: interval field value out of range: "2147483647 months 0.1 millennium" +LINE 1: select interval '2147483647 months 0.1 millennium'; + ^ +select interval '2147483647 months 0.1 centuries'; +ERROR: interval field value out of range: "2147483647 months 0.1 centuries" +LINE 1: select interval '2147483647 months 0.1 centuries'; + ^ +select interval '2147483647 months 0.1 decades'; +ERROR: interval field value out of range: "2147483647 months 0.1 decades" +LINE 1: select interval '2147483647 months 0.1 decades'; + ^ +select interval '2147483647 months 0.1 yrs'; +ERROR: interval field value out of range: "2147483647 months 0.1 yrs" +LINE 1: select interval '2147483647 months 0.1 yrs'; + ^ +select interval '-2147483648 months -0.1 millennium'; +ERROR: interval field value out of range: "-2147483648 months -0.1 millennium" +LINE 1: select interval '-2147483648 months -0.1 millennium'; + ^ +select interval '-2147483648 months -0.1 centuries'; +ERROR: interval field value out of range: "-2147483648 months -0.1 centuries" +LINE 1: select interval '-2147483648 months -0.1 centuries'; + ^ +select interval '-2147483648 months -0.1 decades'; +ERROR: interval field value out of range: "-2147483648 months -0.1 decades" +LINE 1: select interval '-2147483648 months -0.1 decades'; + ^ +select interval '-2147483648 months -0.1 yrs'; +ERROR: interval field value out of range: "-2147483648 months -0.1 yrs" +LINE 1: select interval '-2147483648 months -0.1 yrs'; + ^ +select interval '0.1 months 2147483647 days'; +ERROR: interval field value out of range: "0.1 months 2147483647 days" +LINE 1: select interval '0.1 months 2147483647 days'; + ^ +select interval '-0.1 months -2147483648 days'; +ERROR: interval field value out of range: "-0.1 months -2147483648 days" +LINE 1: select interval '-0.1 months -2147483648 days'; + ^ +select interval '2147483647 days 0.1 months'; +ERROR: interval field value out of range: "2147483647 days 0.1 months" +LINE 1: select interval '2147483647 days 0.1 months'; + ^ +select interval '-2147483648 days -0.1 months'; +ERROR: interval field value out of range: "-2147483648 days -0.1 months" +LINE 1: select interval '-2147483648 days -0.1 months'; + ^ +select interval '0.5 weeks 2147483647 days'; +ERROR: interval field value out of range: "0.5 weeks 2147483647 days" +LINE 1: select interval '0.5 weeks 2147483647 days'; + ^ +select interval '-0.5 weeks -2147483648 days'; +ERROR: interval field value out of range: "-0.5 weeks -2147483648 days" +LINE 1: select interval '-0.5 weeks -2147483648 days'; + ^ +select interval '2147483647 days 0.5 weeks'; +ERROR: interval field value out of range: "2147483647 days 0.5 weeks" +LINE 1: select interval '2147483647 days 0.5 weeks'; + ^ +select interval '-2147483648 days -0.5 weeks'; +ERROR: interval field value out of range: "-2147483648 days -0.5 weeks" +LINE 1: select interval '-2147483648 days -0.5 weeks'; + ^ +select interval '0.01 months 9223372036854775807 microseconds'; +ERROR: interval field value out of range: "0.01 months 9223372036854775807 microseconds" +LINE 1: select interval '0.01 months 9223372036854775807 microsecond... + ^ +select interval '-0.01 months -9223372036854775808 microseconds'; +ERROR: interval field value out of range: "-0.01 months -9223372036854775808 microseconds" +LINE 1: select interval '-0.01 months -9223372036854775808 microseco... + ^ +select interval '9223372036854775807 microseconds 0.01 months'; +ERROR: interval field value out of range: "9223372036854775807 microseconds 0.01 months" +LINE 1: select interval '9223372036854775807 microseconds 0.01 month... + ^ +select interval '-9223372036854775808 microseconds -0.01 months'; +ERROR: interval field value out of range: "-9223372036854775808 microseconds -0.01 months" +LINE 1: select interval '-9223372036854775808 microseconds -0.01 mon... + ^ +select interval '0.1 weeks 9223372036854775807 microseconds'; +ERROR: interval field value out of range: "0.1 weeks 9223372036854775807 microseconds" +LINE 1: select interval '0.1 weeks 9223372036854775807 microseconds'... + ^ +select interval '-0.1 weeks -9223372036854775808 microseconds'; +ERROR: interval field value out of range: "-0.1 weeks -9223372036854775808 microseconds" +LINE 1: select interval '-0.1 weeks -9223372036854775808 microsecond... + ^ +select interval '9223372036854775807 microseconds 0.1 weeks'; +ERROR: interval field value out of range: "9223372036854775807 microseconds 0.1 weeks" +LINE 1: select interval '9223372036854775807 microseconds 0.1 weeks'... + ^ +select interval '-9223372036854775808 microseconds -0.1 weeks'; +ERROR: interval field value out of range: "-9223372036854775808 microseconds -0.1 weeks" +LINE 1: select interval '-9223372036854775808 microseconds -0.1 week... + ^ +select interval '0.1 days 9223372036854775807 microseconds'; +ERROR: interval field value out of range: "0.1 days 9223372036854775807 microseconds" +LINE 1: select interval '0.1 days 9223372036854775807 microseconds'; + ^ +select interval '-0.1 days -9223372036854775808 microseconds'; +ERROR: interval field value out of range: "-0.1 days -9223372036854775808 microseconds" +LINE 1: select interval '-0.1 days -9223372036854775808 microseconds... + ^ +select interval '9223372036854775807 microseconds 0.1 days'; +ERROR: interval field value out of range: "9223372036854775807 microseconds 0.1 days" +LINE 1: select interval '9223372036854775807 microseconds 0.1 days'; + ^ +select interval '-9223372036854775808 microseconds -0.1 days'; +ERROR: interval field value out of range: "-9223372036854775808 microseconds -0.1 days" +LINE 1: select interval '-9223372036854775808 microseconds -0.1 days... + ^ +-- overflowing with fractional fields - ISO8601 format +select interval 'P0.1Y2147483647M'; +ERROR: interval field value out of range: "P0.1Y2147483647M" +LINE 1: select interval 'P0.1Y2147483647M'; + ^ +select interval 'P-0.1Y-2147483648M'; +ERROR: interval field value out of range: "P-0.1Y-2147483648M" +LINE 1: select interval 'P-0.1Y-2147483648M'; + ^ +select interval 'P2147483647M0.1Y'; +ERROR: interval field value out of range: "P2147483647M0.1Y" +LINE 1: select interval 'P2147483647M0.1Y'; + ^ +select interval 'P-2147483648M-0.1Y'; +ERROR: interval field value out of range: "P-2147483648M-0.1Y" +LINE 1: select interval 'P-2147483648M-0.1Y'; + ^ +select interval 'P0.1M2147483647D'; +ERROR: interval field value out of range: "P0.1M2147483647D" +LINE 1: select interval 'P0.1M2147483647D'; + ^ +select interval 'P-0.1M-2147483648D'; +ERROR: interval field value out of range: "P-0.1M-2147483648D" +LINE 1: select interval 'P-0.1M-2147483648D'; + ^ +select interval 'P2147483647D0.1M'; +ERROR: interval field value out of range: "P2147483647D0.1M" +LINE 1: select interval 'P2147483647D0.1M'; + ^ +select interval 'P-2147483648D-0.1M'; +ERROR: interval field value out of range: "P-2147483648D-0.1M" +LINE 1: select interval 'P-2147483648D-0.1M'; + ^ +select interval 'P0.5W2147483647D'; +ERROR: interval field value out of range: "P0.5W2147483647D" +LINE 1: select interval 'P0.5W2147483647D'; + ^ +select interval 'P-0.5W-2147483648D'; +ERROR: interval field value out of range: "P-0.5W-2147483648D" +LINE 1: select interval 'P-0.5W-2147483648D'; + ^ +select interval 'P2147483647D0.5W'; +ERROR: interval field value out of range: "P2147483647D0.5W" +LINE 1: select interval 'P2147483647D0.5W'; + ^ +select interval 'P-2147483648D-0.5W'; +ERROR: interval field value out of range: "P-2147483648D-0.5W" +LINE 1: select interval 'P-2147483648D-0.5W'; + ^ +select interval 'P0.01MT2562047788H54.775807S'; +ERROR: interval field value out of range: "P0.01MT2562047788H54.775807S" +LINE 1: select interval 'P0.01MT2562047788H54.775807S'; + ^ +select interval 'P-0.01MT-2562047788H-54.775808S'; +ERROR: interval field value out of range: "P-0.01MT-2562047788H-54.775808S" +LINE 1: select interval 'P-0.01MT-2562047788H-54.775808S'; + ^ +select interval 'P0.1DT2562047788H54.775807S'; +ERROR: interval field value out of range: "P0.1DT2562047788H54.775807S" +LINE 1: select interval 'P0.1DT2562047788H54.775807S'; + ^ +select interval 'P-0.1DT-2562047788H-54.775808S'; +ERROR: interval field value out of range: "P-0.1DT-2562047788H-54.775808S" +LINE 1: select interval 'P-0.1DT-2562047788H-54.775808S'; + ^ +select interval 'PT2562047788.1H54.775807S'; +ERROR: interval field value out of range: "PT2562047788.1H54.775807S" +LINE 1: select interval 'PT2562047788.1H54.775807S'; + ^ +select interval 'PT-2562047788.1H-54.775808S'; +ERROR: interval field value out of range: "PT-2562047788.1H-54.775808S" +LINE 1: select interval 'PT-2562047788.1H-54.775808S'; + ^ +select interval 'PT2562047788H0.1M54.775807S'; +ERROR: interval field value out of range: "PT2562047788H0.1M54.775807S" +LINE 1: select interval 'PT2562047788H0.1M54.775807S'; + ^ +select interval 'PT-2562047788H-0.1M-54.775808S'; +ERROR: interval field value out of range: "PT-2562047788H-0.1M-54.775808S" +LINE 1: select interval 'PT-2562047788H-0.1M-54.775808S'; + ^ +-- overflowing with fractional fields - ISO8601 alternative format +select interval 'P0.1-2147483647-00'; +ERROR: interval field value out of range: "P0.1-2147483647-00" +LINE 1: select interval 'P0.1-2147483647-00'; + ^ +select interval 'P00-0.1-2147483647'; +ERROR: interval field value out of range: "P00-0.1-2147483647" +LINE 1: select interval 'P00-0.1-2147483647'; + ^ +select interval 'P00-0.01-00T2562047788:00:54.775807'; +ERROR: interval field value out of range: "P00-0.01-00T2562047788:00:54.775807" +LINE 1: select interval 'P00-0.01-00T2562047788:00:54.775807'; + ^ +select interval 'P00-00-0.1T2562047788:00:54.775807'; +ERROR: interval field value out of range: "P00-00-0.1T2562047788:00:54.775807" +LINE 1: select interval 'P00-00-0.1T2562047788:00:54.775807'; + ^ +select interval 'PT2562047788.1:00:54.775807'; +ERROR: interval field value out of range: "PT2562047788.1:00:54.775807" +LINE 1: select interval 'PT2562047788.1:00:54.775807'; + ^ +select interval 'PT2562047788:01.:54.775807'; +ERROR: interval field value out of range: "PT2562047788:01.:54.775807" +LINE 1: select interval 'PT2562047788:01.:54.775807'; + ^ +-- overflowing with fractional fields - SQL standard format +select interval '0.1 2562047788:0:54.775807'; +ERROR: interval field value out of range: "0.1 2562047788:0:54.775807" +LINE 1: select interval '0.1 2562047788:0:54.775807'; + ^ +select interval '0.1 2562047788:0:54.775808 ago'; +ERROR: interval field value out of range: "0.1 2562047788:0:54.775808 ago" +LINE 1: select interval '0.1 2562047788:0:54.775808 ago'; + ^ +select interval '2562047788.1:0:54.775807'; +ERROR: interval field value out of range: "2562047788.1:0:54.775807" +LINE 1: select interval '2562047788.1:0:54.775807'; + ^ +select interval '2562047788.1:0:54.775808 ago'; +ERROR: interval field value out of range: "2562047788.1:0:54.775808 ago" +LINE 1: select interval '2562047788.1:0:54.775808 ago'; + ^ +select interval '2562047788:0.1:54.775807'; +ERROR: invalid input syntax for type interval: "2562047788:0.1:54.775807" +LINE 1: select interval '2562047788:0.1:54.775807'; + ^ +select interval '2562047788:0.1:54.775808 ago'; +ERROR: invalid input syntax for type interval: "2562047788:0.1:54.775808 ago" +LINE 1: select interval '2562047788:0.1:54.775808 ago'; + ^ +-- overflowing using AGO with INT_MIN +select interval '-2147483648 months ago'; +ERROR: interval field value out of range: "-2147483648 months ago" +LINE 1: select interval '-2147483648 months ago'; + ^ +select interval '-2147483648 days ago'; +ERROR: interval field value out of range: "-2147483648 days ago" +LINE 1: select interval '-2147483648 days ago'; + ^ +select interval '-9223372036854775808 microseconds ago'; +ERROR: interval field value out of range: "-9223372036854775808 microseconds ago" +LINE 1: select interval '-9223372036854775808 microseconds ago'; + ^ +select interval '-2147483648 months -2147483648 days -9223372036854775808 microseconds ago'; +ERROR: interval field value out of range: "-2147483648 months -2147483648 days -9223372036854775808 microseconds ago" +LINE 1: select interval '-2147483648 months -2147483648 days -922337... + ^ +-- test that INT_MIN number is formatted properly +SET IntervalStyle to postgres; +select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; + interval +-------------------------------------------------------------------- + -178956970 years -8 mons -2147483648 days -2562047788:00:54.775808 +(1 row) + +SET IntervalStyle to sql_standard; +select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; + interval +--------------------------------------------------- + -178956970-8 -2147483648 -2562047788:00:54.775808 +(1 row) + +SET IntervalStyle to iso_8601; +select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; + interval +----------------------------------------------------- + P-178956970Y-8M-2147483648DT-2562047788H-54.775808S +(1 row) + +SET IntervalStyle to postgres_verbose; +select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; + interval +------------------------------------------------------------------------------ + @ 178956970 years 8 mons 2147483648 days 2562047788 hours 54.775808 secs ago +(1 row) + -- check that '30 days' equals '1 month' according to the hash function select '30 days'::interval = '1 month'::interval as t; t diff --git a/src/test/regress/sql/interval.sql b/src/test/regress/sql/interval.sql index 811b581e09..f05055e03a 100644 --- a/src/test/regress/sql/interval.sql +++ b/src/test/regress/sql/interval.sql @@ -318,6 +318,190 @@ select interval '-10 mons -3 days +03:55:06.70'; select interval '1 year 2 mons 3 days 04:05:06.699999'; select interval '0:0:0.7', interval '@ 0.70 secs', interval '0.7 seconds'; +-- test time fields using entire 64 bit microseconds range +select interval '2562047788.01521550194 hours'; +select interval '-2562047788.01521550222 hours'; +select interval '153722867280.912930117 minutes'; +select interval '-153722867280.912930133 minutes'; +select interval '9223372036854.775807 seconds'; +select interval '-9223372036854.775808 seconds'; +select interval '9223372036854775.807 milliseconds'; +select interval '-9223372036854775.808 milliseconds'; +select interval '9223372036854775807 microseconds'; +select interval '-9223372036854775808 microseconds'; + +select interval 'PT2562047788H54.775807S'; +select interval 'PT-2562047788H-54.775808S'; + +select interval 'PT2562047788:00:54.775807'; + +select interval 'PT2562047788.0152155019444'; +select interval 'PT-2562047788.0152155022222'; + +-- overflow each date/time field +select interval '2147483648 years'; +select interval '-2147483649 years'; +select interval '2147483648 months'; +select interval '-2147483649 months'; +select interval '2147483648 days'; +select interval '-2147483649 days'; +select interval '2562047789 hours'; +select interval '-2562047789 hours'; +select interval '153722867281 minutes'; +select interval '-153722867281 minutes'; +select interval '9223372036855 seconds'; +select interval '-9223372036855 seconds'; +select interval '9223372036854777 millisecond'; +select interval '-9223372036854777 millisecond'; +select interval '9223372036854775808 microsecond'; +select interval '-9223372036854775809 microsecond'; + +select interval 'P2147483648'; +select interval 'P-2147483649'; +select interval 'P1-2147483647-2147483647'; +select interval 'PT2562047789'; +select interval 'PT-2562047789'; + +-- overflow with date/time unit aliases +select interval '2147483647 weeks'; +select interval '-2147483648 weeks'; +select interval '2147483647 decades'; +select interval '-2147483648 decades'; +select interval '2147483647 centuries'; +select interval '-2147483648 centuries'; +select interval '2147483647 millennium'; +select interval '-2147483648 millennium'; + +select interval '1 week 2147483647 days'; +select interval '-1 week -2147483648 days'; +select interval '2147483647 days 1 week'; +select interval '-2147483648 days -1 week'; + +select interval 'P1W2147483647D'; +select interval 'P-1W-2147483648D'; +select interval 'P2147483647D1W'; +select interval 'P-2147483648D-1W'; + +select interval '1 decade 2147483647 years'; +select interval '1 century 2147483647 years'; +select interval '1 millennium 2147483647 years'; +select interval '-1 decade -2147483648 years'; +select interval '-1 century -2147483648 years'; +select interval '-1 millennium -2147483648 years'; + +select interval '2147483647 years 1 decade'; +select interval '2147483647 years 1 century'; +select interval '2147483647 years 1 millennium'; +select interval '-2147483648 years -1 decade'; +select interval '-2147483648 years -1 century'; +select interval '-2147483648 years -1 millennium'; + +-- overflowing with fractional fields - postgres format +select interval '0.1 millennium 2147483647 months'; +select interval '0.1 centuries 2147483647 months'; +select interval '0.1 decades 2147483647 months'; +select interval '0.1 yrs 2147483647 months'; +select interval '-0.1 millennium -2147483648 months'; +select interval '-0.1 centuries -2147483648 months'; +select interval '-0.1 decades -2147483648 months'; +select interval '-0.1 yrs -2147483648 months'; + +select interval '2147483647 months 0.1 millennium'; +select interval '2147483647 months 0.1 centuries'; +select interval '2147483647 months 0.1 decades'; +select interval '2147483647 months 0.1 yrs'; +select interval '-2147483648 months -0.1 millennium'; +select interval '-2147483648 months -0.1 centuries'; +select interval '-2147483648 months -0.1 decades'; +select interval '-2147483648 months -0.1 yrs'; + +select interval '0.1 months 2147483647 days'; +select interval '-0.1 months -2147483648 days'; +select interval '2147483647 days 0.1 months'; +select interval '-2147483648 days -0.1 months'; + +select interval '0.5 weeks 2147483647 days'; +select interval '-0.5 weeks -2147483648 days'; +select interval '2147483647 days 0.5 weeks'; +select interval '-2147483648 days -0.5 weeks'; + +select interval '0.01 months 9223372036854775807 microseconds'; +select interval '-0.01 months -9223372036854775808 microseconds'; +select interval '9223372036854775807 microseconds 0.01 months'; +select interval '-9223372036854775808 microseconds -0.01 months'; + +select interval '0.1 weeks 9223372036854775807 microseconds'; +select interval '-0.1 weeks -9223372036854775808 microseconds'; +select interval '9223372036854775807 microseconds 0.1 weeks'; +select interval '-9223372036854775808 microseconds -0.1 weeks'; + +select interval '0.1 days 9223372036854775807 microseconds'; +select interval '-0.1 days -9223372036854775808 microseconds'; +select interval '9223372036854775807 microseconds 0.1 days'; +select interval '-9223372036854775808 microseconds -0.1 days'; + +-- overflowing with fractional fields - ISO8601 format +select interval 'P0.1Y2147483647M'; +select interval 'P-0.1Y-2147483648M'; +select interval 'P2147483647M0.1Y'; +select interval 'P-2147483648M-0.1Y'; + +select interval 'P0.1M2147483647D'; +select interval 'P-0.1M-2147483648D'; +select interval 'P2147483647D0.1M'; +select interval 'P-2147483648D-0.1M'; + +select interval 'P0.5W2147483647D'; +select interval 'P-0.5W-2147483648D'; +select interval 'P2147483647D0.5W'; +select interval 'P-2147483648D-0.5W'; + +select interval 'P0.01MT2562047788H54.775807S'; +select interval 'P-0.01MT-2562047788H-54.775808S'; + +select interval 'P0.1DT2562047788H54.775807S'; +select interval 'P-0.1DT-2562047788H-54.775808S'; + +select interval 'PT2562047788.1H54.775807S'; +select interval 'PT-2562047788.1H-54.775808S'; + +select interval 'PT2562047788H0.1M54.775807S'; +select interval 'PT-2562047788H-0.1M-54.775808S'; + +-- overflowing with fractional fields - ISO8601 alternative format +select interval 'P0.1-2147483647-00'; +select interval 'P00-0.1-2147483647'; +select interval 'P00-0.01-00T2562047788:00:54.775807'; +select interval 'P00-00-0.1T2562047788:00:54.775807'; +select interval 'PT2562047788.1:00:54.775807'; +select interval 'PT2562047788:01.:54.775807'; + +-- overflowing with fractional fields - SQL standard format +select interval '0.1 2562047788:0:54.775807'; +select interval '0.1 2562047788:0:54.775808 ago'; + +select interval '2562047788.1:0:54.775807'; +select interval '2562047788.1:0:54.775808 ago'; + +select interval '2562047788:0.1:54.775807'; +select interval '2562047788:0.1:54.775808 ago'; + +-- overflowing using AGO with INT_MIN +select interval '-2147483648 months ago'; +select interval '-2147483648 days ago'; +select interval '-9223372036854775808 microseconds ago'; +select interval '-2147483648 months -2147483648 days -9223372036854775808 microseconds ago'; + +-- test that INT_MIN number is formatted properly +SET IntervalStyle to postgres; +select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; +SET IntervalStyle to sql_standard; +select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; +SET IntervalStyle to iso_8601; +select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; +SET IntervalStyle to postgres_verbose; +select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; + -- check that '30 days' equals '1 month' according to the hash function select '30 days'::interval = '1 month'::interval as t; select interval_hash('30 days'::interval) = interval_hash('1 month'::interval) as t; From 05023a237c059c840380817abf079a9282a227b7 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Sat, 2 Apr 2022 13:34:57 -0700 Subject: [PATCH 359/772] Doc: Add relfrozenxid Tip to XID wraparound section. VACUUM VERBOSE and autovacuum log reports were taught to report the details of how VACUUM advanced relfrozenxid (and relminmxid) by commit 872770fd. Highlight this by adding a "Tip" to the documentation, next to related discussion of age(relfrozenxid) monitoring. Author: Peter Geoghegan Discussion: https://postgr.es/m/CAH2-Wzk0C1O-MKkOrj4YAfsGRru2=cA2VQpqM-9R1HNuG3nFaQ@mail.gmail.com --- doc/src/sgml/maintenance.sgml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml index 5f3b6720e4..84fba9dcb1 100644 --- a/doc/src/sgml/maintenance.sgml +++ b/doc/src/sgml/maintenance.sgml @@ -611,6 +611,19 @@ SELECT datname, age(datfrozenxid) FROM pg_database; cutoff XID to the current transaction's XID. + + + When the VACUUM command's VERBOSE + parameter is specified, VACUUM prints various + statistics about the table. This includes information about how + relfrozenxid and + relminmxid advanced. The same details appear + in the server log when autovacuum logging (controlled by ) reports on a + VACUUM operation executed by autovacuum. + + + VACUUM normally only scans pages that have been modified since the last vacuum, but relfrozenxid can only be From 0b018fabaaba77e39539ce7eb71e34a90ceb0825 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Sun, 3 Apr 2022 09:57:21 -0700 Subject: [PATCH 360/772] Set relfrozenxid to oldest extant XID seen by VACUUM. When VACUUM set relfrozenxid before now, it set it to whatever value was used to determine which tuples to freeze -- the FreezeLimit cutoff. This approach was very naive. The relfrozenxid invariant only requires that new relfrozenxid values be <= the oldest extant XID remaining in the table (at the point that the VACUUM operation ends), which in general might be much more recent than FreezeLimit. VACUUM now carefully tracks the oldest remaining XID/MultiXactId as it goes (the oldest remaining values _after_ lazy_scan_prune processing). The final values are set as the table's new relfrozenxid and new relminmxid in pg_class at the end of each VACUUM. The oldest XID might come from a tuple's xmin, xmax, or xvac fields. It might even come from one of the table's remaining MultiXacts. Final relfrozenxid values must still be >= FreezeLimit in an aggressive VACUUM (FreezeLimit still acts as a lower bound on the final value that aggressive VACUUM can set relfrozenxid to). Since standard VACUUMs still make no guarantees about advancing relfrozenxid, they might as well set relfrozenxid to a value from well before FreezeLimit when the opportunity presents itself. In general standard VACUUMs may now set relfrozenxid to any value > the original relfrozenxid and <= OldestXmin. Credit for the general idea of using the oldest extant XID to set pg_class.relfrozenxid at the end of VACUUM goes to Andres Freund. Author: Peter Geoghegan Reviewed-By: Andres Freund Reviewed-By: Robert Haas Discussion: https://postgr.es/m/CAH2-WzkymFbz6D_vL+jmqSn_5q1wsFvFrE+37yLgL_Rkfd6Gzg@mail.gmail.com --- doc/src/sgml/maintenance.sgml | 16 +- src/backend/access/heap/heapam.c | 332 +++++++++++++----- src/backend/access/heap/vacuumlazy.c | 156 ++++---- src/backend/commands/cluster.c | 11 +- src/backend/commands/vacuum.c | 39 +- src/include/access/heapam.h | 6 +- src/include/access/heapam_xlog.h | 4 +- src/include/commands/vacuum.h | 1 + .../expected/vacuum-no-cleanup-lock.out | 189 ++++++++++ .../isolation/expected/vacuum-reltuples.out | 67 ---- src/test/isolation/isolation_schedule | 2 +- .../specs/vacuum-no-cleanup-lock.spec | 150 ++++++++ .../isolation/specs/vacuum-reltuples.spec | 49 --- 13 files changed, 717 insertions(+), 305 deletions(-) create mode 100644 src/test/isolation/expected/vacuum-no-cleanup-lock.out delete mode 100644 src/test/isolation/expected/vacuum-reltuples.out create mode 100644 src/test/isolation/specs/vacuum-no-cleanup-lock.spec delete mode 100644 src/test/isolation/specs/vacuum-reltuples.spec diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml index 84fba9dcb1..2e09fee5ae 100644 --- a/doc/src/sgml/maintenance.sgml +++ b/doc/src/sgml/maintenance.sgml @@ -586,11 +586,11 @@ statistics in the system tables pg_class and pg_database. In particular, the relfrozenxid column of a table's - pg_class row contains the freeze cutoff XID that was used - by the last aggressive VACUUM for that table. All rows - inserted by transactions with XIDs older than this cutoff XID are - guaranteed to have been frozen. Similarly, - the datfrozenxid column of a database's + pg_class row contains the oldest remaining unfrozen + XID at the end of the most recent VACUUM that successfully + advanced relfrozenxid (typically the most recent + aggressive VACUUM). Similarly, the + datfrozenxid column of a database's pg_database row is a lower bound on the unfrozen XIDs appearing in that database — it is just the minimum of the per-table relfrozenxid values within the database. @@ -638,7 +638,11 @@ SELECT datname, age(datfrozenxid) FROM pg_database; set age(relfrozenxid) to a value just a little more than the vacuum_freeze_min_age setting that was used (more by the number of transactions started since the - VACUUM started). If no relfrozenxid-advancing + VACUUM started). VACUUM + will set relfrozenxid to the oldest XID + that remains in the table, so it's possible that the final value + will be much more recent than strictly required. + If no relfrozenxid-advancing VACUUM is issued on the table until autovacuum_freeze_max_age is reached, an autovacuum will soon be forced for the table. diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 74ad445e59..1ee985f633 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -6079,10 +6079,12 @@ heap_inplace_update(Relation relation, HeapTuple tuple) * Determine what to do during freezing when a tuple is marked by a * MultiXactId. * - * NB -- this might have the side-effect of creating a new MultiXactId! - * * "flags" is an output value; it's used to tell caller what to do on return. - * Possible flags are: + * + * "mxid_oldest_xid_out" is an output value; it's used to track the oldest + * extant Xid within any Multixact that will remain after freezing executes. + * + * Possible values that we can set in "flags": * FRM_NOOP * don't do anything -- keep existing Xmax * FRM_INVALIDATE_XMAX @@ -6094,12 +6096,17 @@ heap_inplace_update(Relation relation, HeapTuple tuple) * FRM_RETURN_IS_MULTI * The return value is a new MultiXactId to set as new Xmax. * (caller must obtain proper infomask bits using GetMultiXactIdHintBits) + * + * "mxid_oldest_xid_out" is only set when "flags" contains either FRM_NOOP or + * FRM_RETURN_IS_MULTI, since we only leave behind a MultiXactId for these. + * + * NB: Creates a _new_ MultiXactId when FRM_RETURN_IS_MULTI is set in "flags". */ static TransactionId FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, TransactionId relfrozenxid, TransactionId relminmxid, TransactionId cutoff_xid, MultiXactId cutoff_multi, - uint16 *flags) + uint16 *flags, TransactionId *mxid_oldest_xid_out) { TransactionId xid = InvalidTransactionId; int i; @@ -6111,6 +6118,7 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, bool has_lockers; TransactionId update_xid; bool update_committed; + TransactionId temp_xid_out; *flags = 0; @@ -6147,7 +6155,7 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, if (HEAP_XMAX_IS_LOCKED_ONLY(t_infomask)) { *flags |= FRM_INVALIDATE_XMAX; - xid = InvalidTransactionId; /* not strictly necessary */ + xid = InvalidTransactionId; } else { @@ -6174,7 +6182,7 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, (errcode(ERRCODE_DATA_CORRUPTED), errmsg_internal("cannot freeze committed update xid %u", xid))); *flags |= FRM_INVALIDATE_XMAX; - xid = InvalidTransactionId; /* not strictly necessary */ + xid = InvalidTransactionId; } else { @@ -6182,6 +6190,10 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, } } + /* + * Don't push back mxid_oldest_xid_out using FRM_RETURN_IS_XID Xid, or + * when no Xids will remain + */ return xid; } @@ -6205,6 +6217,7 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, /* is there anything older than the cutoff? */ need_replace = false; + temp_xid_out = *mxid_oldest_xid_out; /* init for FRM_NOOP */ for (i = 0; i < nmembers; i++) { if (TransactionIdPrecedes(members[i].xid, cutoff_xid)) @@ -6212,28 +6225,38 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, need_replace = true; break; } + if (TransactionIdPrecedes(members[i].xid, temp_xid_out)) + temp_xid_out = members[i].xid; } /* * In the simplest case, there is no member older than the cutoff; we can - * keep the existing MultiXactId as is. + * keep the existing MultiXactId as-is, avoiding a more expensive second + * pass over the multi */ if (!need_replace) { + /* + * When mxid_oldest_xid_out gets pushed back here it's likely that the + * update Xid was the oldest member, but we don't rely on that + */ *flags |= FRM_NOOP; + *mxid_oldest_xid_out = temp_xid_out; pfree(members); - return InvalidTransactionId; + return multi; } /* - * If the multi needs to be updated, figure out which members do we need - * to keep. + * Do a more thorough second pass over the multi to figure out which + * member XIDs actually need to be kept. Checking the precise status of + * individual members might even show that we don't need to keep anything. */ nnewmembers = 0; newmembers = palloc(sizeof(MultiXactMember) * nmembers); has_lockers = false; update_xid = InvalidTransactionId; update_committed = false; + temp_xid_out = *mxid_oldest_xid_out; /* init for FRM_RETURN_IS_MULTI */ for (i = 0; i < nmembers; i++) { @@ -6289,7 +6312,7 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, } /* - * Since the tuple wasn't marked HEAPTUPLE_DEAD by vacuum, the + * Since the tuple wasn't totally removed when vacuum pruned, the * update Xid cannot possibly be older than the xid cutoff. The * presence of such a tuple would cause corruption, so be paranoid * and check. @@ -6302,15 +6325,20 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, update_xid, cutoff_xid))); /* - * If we determined that it's an Xid corresponding to an update - * that must be retained, additionally add it to the list of - * members of the new Multi, in case we end up using that. (We - * might still decide to use only an update Xid and not a multi, - * but it's easier to maintain the list as we walk the old members - * list.) + * We determined that this is an Xid corresponding to an update + * that must be retained -- add it to new members list for later. + * + * Also consider pushing back temp_xid_out, which is needed when + * we later conclude that a new multi is required (i.e. when we go + * on to set FRM_RETURN_IS_MULTI for our caller because we also + * need to retain a locker that's still running). */ if (TransactionIdIsValid(update_xid)) + { newmembers[nnewmembers++] = members[i]; + if (TransactionIdPrecedes(members[i].xid, temp_xid_out)) + temp_xid_out = members[i].xid; + } } else { @@ -6318,8 +6346,18 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, if (TransactionIdIsCurrentTransactionId(members[i].xid) || TransactionIdIsInProgress(members[i].xid)) { - /* running locker cannot possibly be older than the cutoff */ + /* + * Running locker cannot possibly be older than the cutoff. + * + * The cutoff is <= VACUUM's OldestXmin, which is also the + * initial value used for top-level relfrozenxid_out tracking + * state. A running locker cannot be older than VACUUM's + * OldestXmin, either, so we don't need a temp_xid_out step. + */ + Assert(TransactionIdIsNormal(members[i].xid)); Assert(!TransactionIdPrecedes(members[i].xid, cutoff_xid)); + Assert(!TransactionIdPrecedes(members[i].xid, + *mxid_oldest_xid_out)); newmembers[nnewmembers++] = members[i]; has_lockers = true; } @@ -6328,11 +6366,16 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, pfree(members); + /* + * Determine what to do with caller's multi based on information gathered + * during our second pass + */ if (nnewmembers == 0) { /* nothing worth keeping!? Tell caller to remove the whole thing */ *flags |= FRM_INVALIDATE_XMAX; xid = InvalidTransactionId; + /* Don't push back mxid_oldest_xid_out -- no Xids will remain */ } else if (TransactionIdIsValid(update_xid) && !has_lockers) { @@ -6348,15 +6391,18 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, if (update_committed) *flags |= FRM_MARK_COMMITTED; xid = update_xid; + /* Don't push back mxid_oldest_xid_out using FRM_RETURN_IS_XID Xid */ } else { /* * Create a new multixact with the surviving members of the previous - * one, to set as new Xmax in the tuple. + * one, to set as new Xmax in the tuple. The oldest surviving member + * might push back mxid_oldest_xid_out. */ xid = MultiXactIdCreateFromMembers(nnewmembers, newmembers); *flags |= FRM_RETURN_IS_MULTI; + *mxid_oldest_xid_out = temp_xid_out; } pfree(newmembers); @@ -6375,31 +6421,41 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, * will be totally frozen after these operations are performed and false if * more freezing will eventually be required. * - * Caller is responsible for setting the offset field, if appropriate. + * Caller must set frz->offset itself, before heap_execute_freeze_tuple call. * * It is assumed that the caller has checked the tuple with * HeapTupleSatisfiesVacuum() and determined that it is not HEAPTUPLE_DEAD * (else we should be removing the tuple, not freezing it). * - * NB: cutoff_xid *must* be <= the current global xmin, to ensure that any + * The *relfrozenxid_out and *relminmxid_out arguments are the current target + * relfrozenxid and relminmxid for VACUUM caller's heap rel. Any and all + * unfrozen XIDs or MXIDs that remain in caller's rel after VACUUM finishes + * _must_ have values >= the final relfrozenxid/relminmxid values in pg_class. + * This includes XIDs that remain as MultiXact members from any tuple's xmax. + * Each call here pushes back *relfrozenxid_out and/or *relminmxid_out as + * needed to avoid unsafe final values in rel's authoritative pg_class tuple. + * + * NB: cutoff_xid *must* be <= VACUUM's OldestXmin, to ensure that any * XID older than it could neither be running nor seen as running by any * open transaction. This ensures that the replacement will not change * anyone's idea of the tuple state. - * Similarly, cutoff_multi must be less than or equal to the smallest - * MultiXactId used by any transaction currently open. + * Similarly, cutoff_multi must be <= VACUUM's OldestMxact. * - * If the tuple is in a shared buffer, caller must hold an exclusive lock on - * that buffer. + * NB: This function has side effects: it might allocate a new MultiXactId. + * It will be set as tuple's new xmax when our *frz output is processed within + * heap_execute_freeze_tuple later on. If the tuple is in a shared buffer + * then caller had better have an exclusive lock on it already. * - * NB: It is not enough to set hint bits to indicate something is - * committed/invalid -- they might not be set on a standby, or after crash - * recovery. We really need to remove old xids. + * NB: It is not enough to set hint bits to indicate an XID committed/aborted. + * The *frz WAL record we output completely removes all old XIDs during REDO. */ bool heap_prepare_freeze_tuple(HeapTupleHeader tuple, TransactionId relfrozenxid, TransactionId relminmxid, TransactionId cutoff_xid, TransactionId cutoff_multi, - xl_heap_freeze_tuple *frz, bool *totally_frozen) + xl_heap_freeze_tuple *frz, bool *totally_frozen, + TransactionId *relfrozenxid_out, + MultiXactId *relminmxid_out) { bool changed = false; bool xmax_already_frozen = false; @@ -6418,7 +6474,9 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple, * already a permanent value), while in the block below it is set true to * mean "xmin won't need freezing after what we do to it here" (false * otherwise). In both cases we're allowed to set totally_frozen, as far - * as xmin is concerned. + * as xmin is concerned. Both cases also don't require relfrozenxid_out + * handling, since either way the tuple's xmin will be a permanent value + * once we're done with it. */ xid = HeapTupleHeaderGetXmin(tuple); if (!TransactionIdIsNormal(xid)) @@ -6443,6 +6501,12 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple, frz->t_infomask |= HEAP_XMIN_FROZEN; changed = true; } + else + { + /* xmin to remain unfrozen. Could push back relfrozenxid_out. */ + if (TransactionIdPrecedes(xid, *relfrozenxid_out)) + *relfrozenxid_out = xid; + } } /* @@ -6452,7 +6516,7 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple, * freezing, too. Also, if a multi needs freezing, we cannot simply take * it out --- if there's a live updater Xid, it needs to be kept. * - * Make sure to keep heap_tuple_needs_freeze in sync with this. + * Make sure to keep heap_tuple_would_freeze in sync with this. */ xid = HeapTupleHeaderGetRawXmax(tuple); @@ -6460,15 +6524,28 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple, { TransactionId newxmax; uint16 flags; + TransactionId mxid_oldest_xid_out = *relfrozenxid_out; newxmax = FreezeMultiXactId(xid, tuple->t_infomask, relfrozenxid, relminmxid, - cutoff_xid, cutoff_multi, &flags); + cutoff_xid, cutoff_multi, + &flags, &mxid_oldest_xid_out); freeze_xmax = (flags & FRM_INVALIDATE_XMAX); if (flags & FRM_RETURN_IS_XID) { + /* + * xmax will become an updater Xid (original MultiXact's updater + * member Xid will be carried forward as a simple Xid in Xmax). + * Might have to ratchet back relfrozenxid_out here, though never + * relminmxid_out. + */ + Assert(!freeze_xmax); + Assert(TransactionIdIsValid(newxmax)); + if (TransactionIdPrecedes(newxmax, *relfrozenxid_out)) + *relfrozenxid_out = newxmax; + /* * NB -- some of these transformations are only valid because we * know the return Xid is a tuple updater (i.e. not merely a @@ -6487,6 +6564,19 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple, uint16 newbits; uint16 newbits2; + /* + * xmax is an old MultiXactId that we have to replace with a new + * MultiXactId, to carry forward two or more original member XIDs. + * Might have to ratchet back relfrozenxid_out here, though never + * relminmxid_out. + */ + Assert(!freeze_xmax); + Assert(MultiXactIdIsValid(newxmax)); + Assert(!MultiXactIdPrecedes(newxmax, *relminmxid_out)); + Assert(TransactionIdPrecedesOrEquals(mxid_oldest_xid_out, + *relfrozenxid_out)); + *relfrozenxid_out = mxid_oldest_xid_out; + /* * We can't use GetMultiXactIdHintBits directly on the new multi * here; that routine initializes the masks to all zeroes, which @@ -6503,6 +6593,30 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple, changed = true; } + else if (flags & FRM_NOOP) + { + /* + * xmax is a MultiXactId, and nothing about it changes for now. + * Might have to ratchet back relminmxid_out, relfrozenxid_out, or + * both together. + */ + Assert(!freeze_xmax); + Assert(MultiXactIdIsValid(newxmax) && xid == newxmax); + Assert(TransactionIdPrecedesOrEquals(mxid_oldest_xid_out, + *relfrozenxid_out)); + if (MultiXactIdPrecedes(xid, *relminmxid_out)) + *relminmxid_out = xid; + *relfrozenxid_out = mxid_oldest_xid_out; + } + else + { + /* + * Keeping nothing (neither an Xid nor a MultiXactId) in xmax. + * Won't have to ratchet back relminmxid_out or relfrozenxid_out. + */ + Assert(freeze_xmax); + Assert(!TransactionIdIsValid(newxmax)); + } } else if (TransactionIdIsNormal(xid)) { @@ -6527,15 +6641,21 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple, errmsg_internal("cannot freeze committed xmax %u", xid))); freeze_xmax = true; + /* No need for relfrozenxid_out handling, since we'll freeze xmax */ } else + { freeze_xmax = false; + if (TransactionIdPrecedes(xid, *relfrozenxid_out)) + *relfrozenxid_out = xid; + } } else if ((tuple->t_infomask & HEAP_XMAX_INVALID) || !TransactionIdIsValid(HeapTupleHeaderGetRawXmax(tuple))) { freeze_xmax = false; xmax_already_frozen = true; + /* No need for relfrozenxid_out handling for already-frozen xmax */ } else ereport(ERROR, @@ -6576,6 +6696,8 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple, * was removed in PostgreSQL 9.0. Note that if we were to respect * cutoff_xid here, we'd need to make surely to clear totally_frozen * when we skipped freezing on that basis. + * + * No need for relfrozenxid_out handling, since we always freeze xvac. */ if (TransactionIdIsNormal(xid)) { @@ -6653,11 +6775,14 @@ heap_freeze_tuple(HeapTupleHeader tuple, xl_heap_freeze_tuple frz; bool do_freeze; bool tuple_totally_frozen; + TransactionId relfrozenxid_out = cutoff_xid; + MultiXactId relminmxid_out = cutoff_multi; do_freeze = heap_prepare_freeze_tuple(tuple, relfrozenxid, relminmxid, cutoff_xid, cutoff_multi, - &frz, &tuple_totally_frozen); + &frz, &tuple_totally_frozen, + &relfrozenxid_out, &relminmxid_out); /* * Note that because this is not a WAL-logged operation, we don't need to @@ -7036,9 +7161,7 @@ ConditionalMultiXactIdWait(MultiXactId multi, MultiXactStatus status, * heap_tuple_needs_eventual_freeze * * Check to see whether any of the XID fields of a tuple (xmin, xmax, xvac) - * will eventually require freezing. Similar to heap_tuple_needs_freeze, - * but there's no cutoff, since we're trying to figure out whether freezing - * will ever be needed, not whether it's needed now. + * will eventually require freezing (if tuple isn't removed by pruning first). */ bool heap_tuple_needs_eventual_freeze(HeapTupleHeader tuple) @@ -7082,87 +7205,106 @@ heap_tuple_needs_eventual_freeze(HeapTupleHeader tuple) } /* - * heap_tuple_needs_freeze - * - * Check to see whether any of the XID fields of a tuple (xmin, xmax, xvac) - * are older than the specified cutoff XID or MultiXactId. If so, return true. + * heap_tuple_would_freeze * - * It doesn't matter whether the tuple is alive or dead, we are checking - * to see if a tuple needs to be removed or frozen to avoid wraparound. + * Return value indicates if heap_prepare_freeze_tuple sibling function would + * freeze any of the XID/XMID fields from the tuple, given the same cutoffs. + * We must also deal with dead tuples here, since (xmin, xmax, xvac) fields + * could be processed by pruning away the whole tuple instead of freezing. * - * NB: Cannot rely on hint bits here, they might not be set after a crash or - * on a standby. + * The *relfrozenxid_out and *relminmxid_out input/output arguments work just + * like the heap_prepare_freeze_tuple arguments that they're based on. We + * never freeze here, which makes tracking the oldest extant XID/MXID simple. */ bool -heap_tuple_needs_freeze(HeapTupleHeader tuple, TransactionId cutoff_xid, - MultiXactId cutoff_multi) +heap_tuple_would_freeze(HeapTupleHeader tuple, TransactionId cutoff_xid, + MultiXactId cutoff_multi, + TransactionId *relfrozenxid_out, + MultiXactId *relminmxid_out) { TransactionId xid; + MultiXactId multi; + bool would_freeze = false; + /* First deal with xmin */ xid = HeapTupleHeaderGetXmin(tuple); - if (TransactionIdIsNormal(xid) && - TransactionIdPrecedes(xid, cutoff_xid)) - return true; - - /* - * The considerations for multixacts are complicated; look at - * heap_prepare_freeze_tuple for justifications. This routine had better - * be in sync with that one! - */ - if (tuple->t_infomask & HEAP_XMAX_IS_MULTI) + if (TransactionIdIsNormal(xid)) { - MultiXactId multi; + if (TransactionIdPrecedes(xid, *relfrozenxid_out)) + *relfrozenxid_out = xid; + if (TransactionIdPrecedes(xid, cutoff_xid)) + would_freeze = true; + } + /* Now deal with xmax */ + xid = InvalidTransactionId; + multi = InvalidMultiXactId; + if (tuple->t_infomask & HEAP_XMAX_IS_MULTI) multi = HeapTupleHeaderGetRawXmax(tuple); - if (!MultiXactIdIsValid(multi)) - { - /* no xmax set, ignore */ - ; - } - else if (HEAP_LOCKED_UPGRADED(tuple->t_infomask)) - return true; - else if (MultiXactIdPrecedes(multi, cutoff_multi)) - return true; - else - { - MultiXactMember *members; - int nmembers; - int i; - - /* need to check whether any member of the mxact is too old */ - - nmembers = GetMultiXactIdMembers(multi, &members, false, - HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask)); + else + xid = HeapTupleHeaderGetRawXmax(tuple); - for (i = 0; i < nmembers; i++) - { - if (TransactionIdPrecedes(members[i].xid, cutoff_xid)) - { - pfree(members); - return true; - } - } - if (nmembers > 0) - pfree(members); - } + if (TransactionIdIsNormal(xid)) + { + /* xmax is a non-permanent XID */ + if (TransactionIdPrecedes(xid, *relfrozenxid_out)) + *relfrozenxid_out = xid; + if (TransactionIdPrecedes(xid, cutoff_xid)) + would_freeze = true; + } + else if (!MultiXactIdIsValid(multi)) + { + /* xmax is a permanent XID or invalid MultiXactId/XID */ + } + else if (HEAP_LOCKED_UPGRADED(tuple->t_infomask)) + { + /* xmax is a pg_upgrade'd MultiXact, which can't have updater XID */ + if (MultiXactIdPrecedes(multi, *relminmxid_out)) + *relminmxid_out = multi; + /* heap_prepare_freeze_tuple always freezes pg_upgrade'd xmax */ + would_freeze = true; } else { - xid = HeapTupleHeaderGetRawXmax(tuple); - if (TransactionIdIsNormal(xid) && - TransactionIdPrecedes(xid, cutoff_xid)) - return true; + /* xmax is a MultiXactId that may have an updater XID */ + MultiXactMember *members; + int nmembers; + + if (MultiXactIdPrecedes(multi, *relminmxid_out)) + *relminmxid_out = multi; + if (MultiXactIdPrecedes(multi, cutoff_multi)) + would_freeze = true; + + /* need to check whether any member of the mxact is old */ + nmembers = GetMultiXactIdMembers(multi, &members, false, + HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask)); + + for (int i = 0; i < nmembers; i++) + { + xid = members[i].xid; + Assert(TransactionIdIsNormal(xid)); + if (TransactionIdPrecedes(xid, *relfrozenxid_out)) + *relfrozenxid_out = xid; + if (TransactionIdPrecedes(xid, cutoff_xid)) + would_freeze = true; + } + if (nmembers > 0) + pfree(members); } if (tuple->t_infomask & HEAP_MOVED) { xid = HeapTupleHeaderGetXvac(tuple); - if (TransactionIdIsNormal(xid) && - TransactionIdPrecedes(xid, cutoff_xid)) - return true; + if (TransactionIdIsNormal(xid)) + { + if (TransactionIdPrecedes(xid, *relfrozenxid_out)) + *relfrozenxid_out = xid; + /* heap_prepare_freeze_tuple always freezes xvac */ + would_freeze = true; + } } - return false; + return would_freeze; } /* diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 06b523a01f..826982f70b 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -144,7 +144,7 @@ typedef struct LVRelState Relation *indrels; int nindexes; - /* Aggressive VACUUM (scan all unfrozen pages)? */ + /* Aggressive VACUUM? (must set relfrozenxid >= FreezeLimit) */ bool aggressive; /* Use visibility map to skip? (disabled by DISABLE_PAGE_SKIPPING) */ bool skipwithvm; @@ -173,8 +173,9 @@ typedef struct LVRelState /* VACUUM operation's target cutoffs for freezing XIDs and MultiXactIds */ TransactionId FreezeLimit; MultiXactId MultiXactCutoff; - /* Are FreezeLimit/MultiXactCutoff still valid? */ - bool freeze_cutoffs_valid; + /* Tracks oldest extant XID/MXID for setting relfrozenxid/relminmxid */ + TransactionId NewRelfrozenXid; + MultiXactId NewRelminMxid; /* Error reporting state */ char *relnamespace; @@ -313,7 +314,8 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, minmulti_updated; TransactionId OldestXmin, FreezeLimit; - MultiXactId MultiXactCutoff; + MultiXactId OldestMxact, + MultiXactCutoff; BlockNumber orig_rel_pages, new_rel_pages, new_rel_allvisible; @@ -345,20 +347,17 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, /* * Get OldestXmin cutoff, which is used to determine which deleted tuples * are considered DEAD, not just RECENTLY_DEAD. Also get related cutoffs - * used to determine which XIDs/MultiXactIds will be frozen. - * - * If this is an aggressive VACUUM, then we're strictly required to freeze - * any and all XIDs from before FreezeLimit, so that we will be able to - * safely advance relfrozenxid up to FreezeLimit below (we must be able to - * advance relminmxid up to MultiXactCutoff, too). + * used to determine which XIDs/MultiXactIds will be frozen. If this is + * an aggressive VACUUM then lazy_scan_heap cannot leave behind unfrozen + * XIDs < FreezeLimit (all MXIDs < MultiXactCutoff also need to go away). */ aggressive = vacuum_set_xid_limits(rel, params->freeze_min_age, params->freeze_table_age, params->multixact_freeze_min_age, params->multixact_freeze_table_age, - &OldestXmin, &FreezeLimit, - &MultiXactCutoff); + &OldestXmin, &OldestMxact, + &FreezeLimit, &MultiXactCutoff); skipwithvm = true; if (params->options & VACOPT_DISABLE_PAGE_SKIPPING) @@ -505,10 +504,11 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, vacrel->vistest = GlobalVisTestFor(rel); /* FreezeLimit controls XID freezing (always <= OldestXmin) */ vacrel->FreezeLimit = FreezeLimit; - /* MultiXactCutoff controls MXID freezing */ + /* MultiXactCutoff controls MXID freezing (always <= OldestMxact) */ vacrel->MultiXactCutoff = MultiXactCutoff; - /* Track if cutoffs became invalid (possible in !aggressive case only) */ - vacrel->freeze_cutoffs_valid = true; + /* Initialize state used to track oldest extant XID/XMID */ + vacrel->NewRelfrozenXid = OldestXmin; + vacrel->NewRelminMxid = OldestMxact; /* * Call lazy_scan_heap to perform all required heap pruning, index @@ -542,13 +542,33 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, /* * Prepare to update rel's pg_class entry. * - * In principle new_live_tuples could be -1 indicating that we (still) - * don't know the tuple count. In practice that probably can't happen, - * since we'd surely have scanned some pages if the table is new and - * nonempty. - * + * Aggressive VACUUMs must always be able to advance relfrozenxid to a + * value >= FreezeLimit, and relminmxid to a value >= MultiXactCutoff. + * Non-aggressive VACUUMs may advance them by any amount, or not at all. + */ + Assert(vacrel->NewRelfrozenXid == OldestXmin || + TransactionIdPrecedesOrEquals(aggressive ? FreezeLimit : + vacrel->relfrozenxid, + vacrel->NewRelfrozenXid)); + Assert(vacrel->NewRelminMxid == OldestMxact || + MultiXactIdPrecedesOrEquals(aggressive ? MultiXactCutoff : + vacrel->relminmxid, + vacrel->NewRelminMxid)); + if (vacrel->scanned_pages + vacrel->frozenskipped_pages < orig_rel_pages) + { + /* + * Must keep original relfrozenxid in a non-aggressive VACUUM that + * had to skip an all-visible page. The state that tracks new + * values will have missed unfrozen XIDs from the pages we skipped. + */ + Assert(!aggressive); + vacrel->NewRelfrozenXid = InvalidTransactionId; + vacrel->NewRelminMxid = InvalidMultiXactId; + } + + /* * For safety, clamp relallvisible to be not more than what we're setting - * relpages to. + * pg_class.relpages to */ new_rel_pages = vacrel->rel_pages; /* After possible rel truncation */ visibilitymap_count(rel, &new_rel_allvisible, NULL); @@ -558,33 +578,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, /* * Now actually update rel's pg_class entry. * - * Aggressive VACUUM must reliably advance relfrozenxid (and relminmxid). - * We are able to advance relfrozenxid in a non-aggressive VACUUM too, - * provided we didn't skip any all-visible (not all-frozen) pages using - * the visibility map, and assuming that we didn't fail to get a cleanup - * lock that made it unsafe with respect to FreezeLimit (or perhaps our - * MultiXactCutoff) established for VACUUM operation. + * In principle new_live_tuples could be -1 indicating that we (still) + * don't know the tuple count. In practice that can't happen, since we + * scan every page that isn't skipped using the visibility map. */ - if (vacrel->scanned_pages + vacrel->frozenskipped_pages < orig_rel_pages || - !vacrel->freeze_cutoffs_valid) - { - /* Cannot advance relfrozenxid/relminmxid */ - Assert(!aggressive); - frozenxid_updated = minmulti_updated = false; - vac_update_relstats(rel, new_rel_pages, vacrel->new_live_tuples, - new_rel_allvisible, vacrel->nindexes > 0, - InvalidTransactionId, InvalidMultiXactId, - NULL, NULL, false); - } - else - { - Assert(vacrel->scanned_pages + vacrel->frozenskipped_pages == - orig_rel_pages); - vac_update_relstats(rel, new_rel_pages, vacrel->new_live_tuples, - new_rel_allvisible, vacrel->nindexes > 0, - FreezeLimit, MultiXactCutoff, - &frozenxid_updated, &minmulti_updated, false); - } + vac_update_relstats(rel, new_rel_pages, vacrel->new_live_tuples, + new_rel_allvisible, vacrel->nindexes > 0, + vacrel->NewRelfrozenXid, vacrel->NewRelminMxid, + &frozenxid_updated, &minmulti_updated, false); /* * Report results to the stats collector, too. @@ -692,17 +693,17 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, OldestXmin, diff); if (frozenxid_updated) { - diff = (int32) (FreezeLimit - vacrel->relfrozenxid); + diff = (int32) (vacrel->NewRelfrozenXid - vacrel->relfrozenxid); appendStringInfo(&buf, _("new relfrozenxid: %u, which is %d xids ahead of previous value\n"), - FreezeLimit, diff); + vacrel->NewRelfrozenXid, diff); } if (minmulti_updated) { - diff = (int32) (MultiXactCutoff - vacrel->relminmxid); + diff = (int32) (vacrel->NewRelminMxid - vacrel->relminmxid); appendStringInfo(&buf, _("new relminmxid: %u, which is %d mxids ahead of previous value\n"), - MultiXactCutoff, diff); + vacrel->NewRelminMxid, diff); } if (orig_rel_pages > 0) { @@ -1582,6 +1583,8 @@ lazy_scan_prune(LVRelState *vacrel, recently_dead_tuples; int nnewlpdead; int nfrozen; + TransactionId NewRelfrozenXid; + MultiXactId NewRelminMxid; OffsetNumber deadoffsets[MaxHeapTuplesPerPage]; xl_heap_freeze_tuple frozen[MaxHeapTuplesPerPage]; @@ -1591,7 +1594,9 @@ lazy_scan_prune(LVRelState *vacrel, retry: - /* Initialize (or reset) page-level counters */ + /* Initialize (or reset) page-level state */ + NewRelfrozenXid = vacrel->NewRelfrozenXid; + NewRelminMxid = vacrel->NewRelminMxid; tuples_deleted = 0; lpdead_items = 0; live_tuples = 0; @@ -1798,8 +1803,8 @@ lazy_scan_prune(LVRelState *vacrel, vacrel->relminmxid, vacrel->FreezeLimit, vacrel->MultiXactCutoff, - &frozen[nfrozen], - &tuple_totally_frozen)) + &frozen[nfrozen], &tuple_totally_frozen, + &NewRelfrozenXid, &NewRelminMxid)) { /* Will execute freeze below */ frozen[nfrozen++].offset = offnum; @@ -1813,13 +1818,16 @@ lazy_scan_prune(LVRelState *vacrel, prunestate->all_frozen = false; } + vacrel->offnum = InvalidOffsetNumber; + /* * We have now divided every item on the page into either an LP_DEAD item * that will need to be vacuumed in indexes later, or a LP_NORMAL tuple * that remains and needs to be considered for freezing now (LP_UNUSED and * LP_REDIRECT items also remain, but are of no further interest to us). */ - vacrel->offnum = InvalidOffsetNumber; + vacrel->NewRelfrozenXid = NewRelfrozenXid; + vacrel->NewRelminMxid = NewRelminMxid; /* * Consider the need to freeze any items with tuple storage from the page @@ -1969,6 +1977,8 @@ lazy_scan_noprune(LVRelState *vacrel, recently_dead_tuples, missed_dead_tuples; HeapTupleHeader tupleheader; + TransactionId NewRelfrozenXid = vacrel->NewRelfrozenXid; + MultiXactId NewRelminMxid = vacrel->NewRelminMxid; OffsetNumber deadoffsets[MaxHeapTuplesPerPage]; Assert(BufferGetBlockNumber(buf) == blkno); @@ -2013,22 +2023,37 @@ lazy_scan_noprune(LVRelState *vacrel, *hastup = true; /* page prevents rel truncation */ tupleheader = (HeapTupleHeader) PageGetItem(page, itemid); - if (heap_tuple_needs_freeze(tupleheader, + if (heap_tuple_would_freeze(tupleheader, vacrel->FreezeLimit, - vacrel->MultiXactCutoff)) + vacrel->MultiXactCutoff, + &NewRelfrozenXid, &NewRelminMxid)) { + /* Tuple with XID < FreezeLimit (or MXID < MultiXactCutoff) */ if (vacrel->aggressive) { - /* Going to have to get cleanup lock for lazy_scan_prune */ + /* + * Aggressive VACUUMs must always be able to advance rel's + * relfrozenxid to a value >= FreezeLimit (and be able to + * advance rel's relminmxid to a value >= MultiXactCutoff). + * The ongoing aggressive VACUUM won't be able to do that + * unless it can freeze an XID (or XMID) from this tuple now. + * + * The only safe option is to have caller perform processing + * of this page using lazy_scan_prune. Caller might have to + * wait a while for a cleanup lock, but it can't be helped. + */ vacrel->offnum = InvalidOffsetNumber; return false; } /* - * Current non-aggressive VACUUM operation definitely won't be - * able to advance relfrozenxid or relminmxid + * Non-aggressive VACUUMs are under no obligation to advance + * relfrozenxid (even by one XID). We can be much laxer here. + * + * Currently we always just accept an older final relfrozenxid + * and/or relminmxid value. We never make caller wait or work a + * little harder, even when it likely makes sense to do so. */ - vacrel->freeze_cutoffs_valid = false; } ItemPointerSet(&(tuple.t_self), blkno, offnum); @@ -2078,9 +2103,14 @@ lazy_scan_noprune(LVRelState *vacrel, vacrel->offnum = InvalidOffsetNumber; /* - * Now save details of the LP_DEAD items from the page in vacrel (though - * only when VACUUM uses two-pass strategy) + * By here we know for sure that caller can put off freezing and pruning + * this particular page until the next VACUUM. Remember its details now. + * (lazy_scan_prune expects a clean slate, so we have to do this last.) */ + vacrel->NewRelfrozenXid = NewRelfrozenXid; + vacrel->NewRelminMxid = NewRelminMxid; + + /* Save any LP_DEAD items found on the page in dead_items array */ if (vacrel->nindexes == 0) { /* Using one-pass strategy (since table has no indexes) */ diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index cd19e35319..322d6bb2f1 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -806,9 +806,10 @@ copy_table_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose, Form_pg_class relform; TupleDesc oldTupDesc PG_USED_FOR_ASSERTS_ONLY; TupleDesc newTupDesc PG_USED_FOR_ASSERTS_ONLY; - TransactionId OldestXmin; - TransactionId FreezeXid; - MultiXactId MultiXactCutoff; + TransactionId OldestXmin, + FreezeXid; + MultiXactId OldestMxact, + MultiXactCutoff; bool use_sort; double num_tuples = 0, tups_vacuumed = 0, @@ -896,8 +897,8 @@ copy_table_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose, * Since we're going to rewrite the whole table anyway, there's no reason * not to be aggressive about this. */ - vacuum_set_xid_limits(OldHeap, 0, 0, 0, 0, - &OldestXmin, &FreezeXid, &MultiXactCutoff); + vacuum_set_xid_limits(OldHeap, 0, 0, 0, 0, &OldestXmin, &OldestMxact, + &FreezeXid, &MultiXactCutoff); /* * FreezeXid will become the table's new relfrozenxid, and that mustn't go diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 50a4a612e5..deec4887be 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -945,14 +945,22 @@ get_all_vacuum_rels(int options) * The output parameters are: * - oldestXmin is the Xid below which tuples deleted by any xact (that * committed) should be considered DEAD, not just RECENTLY_DEAD. - * - freezeLimit is the Xid below which all Xids are replaced by - * FrozenTransactionId during vacuum. - * - multiXactCutoff is the value below which all MultiXactIds are removed - * from Xmax. + * - oldestMxact is the Mxid below which MultiXacts are definitely not + * seen as visible by any running transaction. + * - freezeLimit is the Xid below which all Xids are definitely replaced by + * FrozenTransactionId during aggressive vacuums. + * - multiXactCutoff is the value below which all MultiXactIds are definitely + * removed from Xmax during aggressive vacuums. * * Return value indicates if vacuumlazy.c caller should make its VACUUM * operation aggressive. An aggressive VACUUM must advance relfrozenxid up to - * FreezeLimit, and relminmxid up to multiXactCutoff. + * FreezeLimit (at a minimum), and relminmxid up to multiXactCutoff (at a + * minimum). + * + * oldestXmin and oldestMxact are the most recent values that can ever be + * passed to vac_update_relstats() as frozenxid and minmulti arguments by our + * vacuumlazy.c caller later on. These values should be passed when it turns + * out that VACUUM will leave no unfrozen XIDs/XMIDs behind in the table. */ bool vacuum_set_xid_limits(Relation rel, @@ -961,6 +969,7 @@ vacuum_set_xid_limits(Relation rel, int multixact_freeze_min_age, int multixact_freeze_table_age, TransactionId *oldestXmin, + MultiXactId *oldestMxact, TransactionId *freezeLimit, MultiXactId *multiXactCutoff) { @@ -969,7 +978,6 @@ vacuum_set_xid_limits(Relation rel, int effective_multixact_freeze_max_age; TransactionId limit; TransactionId safeLimit; - MultiXactId oldestMxact; MultiXactId mxactLimit; MultiXactId safeMxactLimit; int freezetable; @@ -1065,9 +1073,11 @@ vacuum_set_xid_limits(Relation rel, effective_multixact_freeze_max_age / 2); Assert(mxid_freezemin >= 0); + /* Remember for caller */ + *oldestMxact = GetOldestMultiXactId(); + /* compute the cutoff multi, being careful to generate a valid value */ - oldestMxact = GetOldestMultiXactId(); - mxactLimit = oldestMxact - mxid_freezemin; + mxactLimit = *oldestMxact - mxid_freezemin; if (mxactLimit < FirstMultiXactId) mxactLimit = FirstMultiXactId; @@ -1082,8 +1092,8 @@ vacuum_set_xid_limits(Relation rel, (errmsg("oldest multixact is far in the past"), errhint("Close open transactions with multixacts soon to avoid wraparound problems."))); /* Use the safe limit, unless an older mxact is still running */ - if (MultiXactIdPrecedes(oldestMxact, safeMxactLimit)) - mxactLimit = oldestMxact; + if (MultiXactIdPrecedes(*oldestMxact, safeMxactLimit)) + mxactLimit = *oldestMxact; else mxactLimit = safeMxactLimit; } @@ -1390,12 +1400,9 @@ vac_update_relstats(Relation relation, * Update relfrozenxid, unless caller passed InvalidTransactionId * indicating it has no new data. * - * Ordinarily, we don't let relfrozenxid go backwards: if things are - * working correctly, the only way the new frozenxid could be older would - * be if a previous VACUUM was done with a tighter freeze_min_age, in - * which case we don't want to forget the work it already did. However, - * if the stored relfrozenxid is "in the future", then it must be corrupt - * and it seems best to overwrite it with the cutoff we used this time. + * Ordinarily, we don't let relfrozenxid go backwards. However, if the + * stored relfrozenxid is "in the future" then it seems best to assume + * it's corrupt, and overwrite with the oldest remaining XID in the table. * This should match vac_update_datfrozenxid() concerning what we consider * to be "in the future". */ diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index b46ab7d739..4403f01e13 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -167,8 +167,10 @@ extern void heap_inplace_update(Relation relation, HeapTuple tuple); extern bool heap_freeze_tuple(HeapTupleHeader tuple, TransactionId relfrozenxid, TransactionId relminmxid, TransactionId cutoff_xid, TransactionId cutoff_multi); -extern bool heap_tuple_needs_freeze(HeapTupleHeader tuple, TransactionId cutoff_xid, - MultiXactId cutoff_multi); +extern bool heap_tuple_would_freeze(HeapTupleHeader tuple, TransactionId cutoff_xid, + MultiXactId cutoff_multi, + TransactionId *relfrozenxid_out, + MultiXactId *relminmxid_out); extern bool heap_tuple_needs_eventual_freeze(HeapTupleHeader tuple); extern void simple_heap_insert(Relation relation, HeapTuple tup); diff --git a/src/include/access/heapam_xlog.h b/src/include/access/heapam_xlog.h index 5c47fdcec8..2d8a7f6270 100644 --- a/src/include/access/heapam_xlog.h +++ b/src/include/access/heapam_xlog.h @@ -410,7 +410,9 @@ extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple, TransactionId cutoff_xid, TransactionId cutoff_multi, xl_heap_freeze_tuple *frz, - bool *totally_frozen); + bool *totally_frozen, + TransactionId *relfrozenxid_out, + MultiXactId *relminmxid_out); extern void heap_execute_freeze_tuple(HeapTupleHeader tuple, xl_heap_freeze_tuple *xlrec_tp); extern XLogRecPtr log_heap_visible(RelFileNode rnode, Buffer heap_buffer, diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index d64f6268f2..ead88edda7 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -291,6 +291,7 @@ extern bool vacuum_set_xid_limits(Relation rel, int multixact_freeze_min_age, int multixact_freeze_table_age, TransactionId *oldestXmin, + MultiXactId *oldestMxact, TransactionId *freezeLimit, MultiXactId *multiXactCutoff); extern bool vacuum_xid_failsafe_check(TransactionId relfrozenxid, diff --git a/src/test/isolation/expected/vacuum-no-cleanup-lock.out b/src/test/isolation/expected/vacuum-no-cleanup-lock.out new file mode 100644 index 0000000000..f7bc93e8f1 --- /dev/null +++ b/src/test/isolation/expected/vacuum-no-cleanup-lock.out @@ -0,0 +1,189 @@ +Parsed test spec with 4 sessions + +starting permutation: vacuumer_pg_class_stats dml_insert vacuumer_nonaggressive_vacuum vacuumer_pg_class_stats +step vacuumer_pg_class_stats: + SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass; + +relpages|reltuples +--------+--------- + 1| 20 +(1 row) + +step dml_insert: + INSERT INTO smalltbl SELECT max(id) + 1 FROM smalltbl; + +step vacuumer_nonaggressive_vacuum: + VACUUM smalltbl; + +step vacuumer_pg_class_stats: + SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass; + +relpages|reltuples +--------+--------- + 1| 21 +(1 row) + + +starting permutation: vacuumer_pg_class_stats dml_insert pinholder_cursor vacuumer_nonaggressive_vacuum vacuumer_pg_class_stats pinholder_commit +step vacuumer_pg_class_stats: + SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass; + +relpages|reltuples +--------+--------- + 1| 20 +(1 row) + +step dml_insert: + INSERT INTO smalltbl SELECT max(id) + 1 FROM smalltbl; + +step pinholder_cursor: + BEGIN; + DECLARE c1 CURSOR FOR SELECT 1 AS dummy FROM smalltbl; + FETCH NEXT FROM c1; + +dummy +----- + 1 +(1 row) + +step vacuumer_nonaggressive_vacuum: + VACUUM smalltbl; + +step vacuumer_pg_class_stats: + SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass; + +relpages|reltuples +--------+--------- + 1| 21 +(1 row) + +step pinholder_commit: + COMMIT; + + +starting permutation: vacuumer_pg_class_stats pinholder_cursor dml_insert dml_delete dml_insert vacuumer_nonaggressive_vacuum vacuumer_pg_class_stats pinholder_commit +step vacuumer_pg_class_stats: + SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass; + +relpages|reltuples +--------+--------- + 1| 20 +(1 row) + +step pinholder_cursor: + BEGIN; + DECLARE c1 CURSOR FOR SELECT 1 AS dummy FROM smalltbl; + FETCH NEXT FROM c1; + +dummy +----- + 1 +(1 row) + +step dml_insert: + INSERT INTO smalltbl SELECT max(id) + 1 FROM smalltbl; + +step dml_delete: + DELETE FROM smalltbl WHERE id = (SELECT min(id) FROM smalltbl); + +step dml_insert: + INSERT INTO smalltbl SELECT max(id) + 1 FROM smalltbl; + +step vacuumer_nonaggressive_vacuum: + VACUUM smalltbl; + +step vacuumer_pg_class_stats: + SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass; + +relpages|reltuples +--------+--------- + 1| 21 +(1 row) + +step pinholder_commit: + COMMIT; + + +starting permutation: vacuumer_pg_class_stats dml_insert dml_delete pinholder_cursor dml_insert vacuumer_nonaggressive_vacuum vacuumer_pg_class_stats pinholder_commit +step vacuumer_pg_class_stats: + SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass; + +relpages|reltuples +--------+--------- + 1| 20 +(1 row) + +step dml_insert: + INSERT INTO smalltbl SELECT max(id) + 1 FROM smalltbl; + +step dml_delete: + DELETE FROM smalltbl WHERE id = (SELECT min(id) FROM smalltbl); + +step pinholder_cursor: + BEGIN; + DECLARE c1 CURSOR FOR SELECT 1 AS dummy FROM smalltbl; + FETCH NEXT FROM c1; + +dummy +----- + 1 +(1 row) + +step dml_insert: + INSERT INTO smalltbl SELECT max(id) + 1 FROM smalltbl; + +step vacuumer_nonaggressive_vacuum: + VACUUM smalltbl; + +step vacuumer_pg_class_stats: + SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass; + +relpages|reltuples +--------+--------- + 1| 21 +(1 row) + +step pinholder_commit: + COMMIT; + + +starting permutation: dml_begin dml_other_begin dml_key_share dml_other_key_share vacuumer_nonaggressive_vacuum pinholder_cursor dml_other_update dml_commit dml_other_commit vacuumer_nonaggressive_vacuum pinholder_commit vacuumer_nonaggressive_vacuum +step dml_begin: BEGIN; +step dml_other_begin: BEGIN; +step dml_key_share: SELECT id FROM smalltbl WHERE id = 3 FOR KEY SHARE; +id +-- + 3 +(1 row) + +step dml_other_key_share: SELECT id FROM smalltbl WHERE id = 3 FOR KEY SHARE; +id +-- + 3 +(1 row) + +step vacuumer_nonaggressive_vacuum: + VACUUM smalltbl; + +step pinholder_cursor: + BEGIN; + DECLARE c1 CURSOR FOR SELECT 1 AS dummy FROM smalltbl; + FETCH NEXT FROM c1; + +dummy +----- + 1 +(1 row) + +step dml_other_update: UPDATE smalltbl SET t = 'u' WHERE id = 3; +step dml_commit: COMMIT; +step dml_other_commit: COMMIT; +step vacuumer_nonaggressive_vacuum: + VACUUM smalltbl; + +step pinholder_commit: + COMMIT; + +step vacuumer_nonaggressive_vacuum: + VACUUM smalltbl; + diff --git a/src/test/isolation/expected/vacuum-reltuples.out b/src/test/isolation/expected/vacuum-reltuples.out deleted file mode 100644 index ce55376e7f..0000000000 --- a/src/test/isolation/expected/vacuum-reltuples.out +++ /dev/null @@ -1,67 +0,0 @@ -Parsed test spec with 2 sessions - -starting permutation: modify vac stats -step modify: - insert into smalltbl select max(id)+1 from smalltbl; - -step vac: - vacuum smalltbl; - -step stats: - select relpages, reltuples from pg_class - where oid='smalltbl'::regclass; - -relpages|reltuples ---------+--------- - 1| 21 -(1 row) - - -starting permutation: modify open fetch1 vac close stats -step modify: - insert into smalltbl select max(id)+1 from smalltbl; - -step open: - begin; - declare c1 cursor for select 1 as dummy from smalltbl; - -step fetch1: - fetch next from c1; - -dummy ------ - 1 -(1 row) - -step vac: - vacuum smalltbl; - -step close: - commit; - -step stats: - select relpages, reltuples from pg_class - where oid='smalltbl'::regclass; - -relpages|reltuples ---------+--------- - 1| 21 -(1 row) - - -starting permutation: modify vac stats -step modify: - insert into smalltbl select max(id)+1 from smalltbl; - -step vac: - vacuum smalltbl; - -step stats: - select relpages, reltuples from pg_class - where oid='smalltbl'::regclass; - -relpages|reltuples ---------+--------- - 1| 21 -(1 row) - diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule index 00749a40bd..a48caae228 100644 --- a/src/test/isolation/isolation_schedule +++ b/src/test/isolation/isolation_schedule @@ -84,7 +84,7 @@ test: alter-table-4 test: create-trigger test: sequence-ddl test: async-notify -test: vacuum-reltuples +test: vacuum-no-cleanup-lock test: timeouts test: vacuum-concurrent-drop test: vacuum-conflict diff --git a/src/test/isolation/specs/vacuum-no-cleanup-lock.spec b/src/test/isolation/specs/vacuum-no-cleanup-lock.spec new file mode 100644 index 0000000000..a88be66de5 --- /dev/null +++ b/src/test/isolation/specs/vacuum-no-cleanup-lock.spec @@ -0,0 +1,150 @@ +# Test for vacuum's reduced processing of heap pages (used for any heap page +# where a cleanup lock isn't immediately available) +# +# Debugging tip: Change VACUUM to VACUUM VERBOSE to get feedback on what's +# really going on + +# Use name type here to avoid TOAST table: +setup +{ + CREATE TABLE smalltbl AS SELECT i AS id, 't'::name AS t FROM generate_series(1,20) i; + ALTER TABLE smalltbl SET (autovacuum_enabled = off); + ALTER TABLE smalltbl ADD PRIMARY KEY (id); +} +setup +{ + VACUUM ANALYZE smalltbl; +} + +teardown +{ + DROP TABLE smalltbl; +} + +# This session holds a pin on smalltbl's only heap page: +session pinholder +step pinholder_cursor +{ + BEGIN; + DECLARE c1 CURSOR FOR SELECT 1 AS dummy FROM smalltbl; + FETCH NEXT FROM c1; +} +step pinholder_commit +{ + COMMIT; +} + +# This session inserts and deletes tuples, potentially affecting reltuples: +session dml +step dml_insert +{ + INSERT INTO smalltbl SELECT max(id) + 1 FROM smalltbl; +} +step dml_delete +{ + DELETE FROM smalltbl WHERE id = (SELECT min(id) FROM smalltbl); +} +step dml_begin { BEGIN; } +step dml_key_share { SELECT id FROM smalltbl WHERE id = 3 FOR KEY SHARE; } +step dml_commit { COMMIT; } + +# Needed for Multixact test: +session dml_other +step dml_other_begin { BEGIN; } +step dml_other_key_share { SELECT id FROM smalltbl WHERE id = 3 FOR KEY SHARE; } +step dml_other_update { UPDATE smalltbl SET t = 'u' WHERE id = 3; } +step dml_other_commit { COMMIT; } + +# This session runs non-aggressive VACUUM, but with maximally aggressive +# cutoffs for tuple freezing (e.g., FreezeLimit == OldestXmin): +session vacuumer +setup +{ + SET vacuum_freeze_min_age = 0; + SET vacuum_multixact_freeze_min_age = 0; +} +step vacuumer_nonaggressive_vacuum +{ + VACUUM smalltbl; +} +step vacuumer_pg_class_stats +{ + SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass; +} + +# Test VACUUM's reltuples counting mechanism. +# +# Final pg_class.reltuples should never be affected by VACUUM's inability to +# get a cleanup lock on any page, except to the extent that any cleanup lock +# contention changes the number of tuples that remain ("missed dead" tuples +# are counted in reltuples, much like "recently dead" tuples). + +# Easy case: +permutation + vacuumer_pg_class_stats # Start with 20 tuples + dml_insert + vacuumer_nonaggressive_vacuum + vacuumer_pg_class_stats # End with 21 tuples + +# Harder case -- count 21 tuples at the end (like last time), but with cleanup +# lock contention this time: +permutation + vacuumer_pg_class_stats # Start with 20 tuples + dml_insert + pinholder_cursor + vacuumer_nonaggressive_vacuum + vacuumer_pg_class_stats # End with 21 tuples + pinholder_commit # order doesn't matter + +# Same as "harder case", but vary the order, and delete an inserted row: +permutation + vacuumer_pg_class_stats # Start with 20 tuples + pinholder_cursor + dml_insert + dml_delete + dml_insert + vacuumer_nonaggressive_vacuum + # reltuples is 21 here again -- "recently dead" tuple won't be included in + # count here: + vacuumer_pg_class_stats + pinholder_commit # order doesn't matter + +# Same as "harder case", but initial insert and delete before cursor: +permutation + vacuumer_pg_class_stats # Start with 20 tuples + dml_insert + dml_delete + pinholder_cursor + dml_insert + vacuumer_nonaggressive_vacuum + # reltuples is 21 here again -- "missed dead" tuple ("recently dead" when + # concurrent activity held back VACUUM's OldestXmin) won't be included in + # count here: + vacuumer_pg_class_stats + pinholder_commit # order doesn't matter + +# Test VACUUM's mechanism for skipping MultiXact freezing. +# +# This provides test coverage for code paths that are only hit when we need to +# freeze, but inability to acquire a cleanup lock on a heap page makes +# freezing some XIDs/XMIDs < FreezeLimit/MultiXactCutoff impossible (without +# waiting for a cleanup lock, which non-aggressive VACUUM is unwilling to do). +permutation + dml_begin + dml_other_begin + dml_key_share + dml_other_key_share + # Will get cleanup lock, can't advance relminmxid yet: + # (though will usually advance relfrozenxid by ~2 XIDs) + vacuumer_nonaggressive_vacuum + pinholder_cursor + dml_other_update + dml_commit + dml_other_commit + # Can't cleanup lock, so still can't advance relminmxid here: + # (relfrozenxid held back by XIDs in MultiXact too) + vacuumer_nonaggressive_vacuum + pinholder_commit + # Pin was dropped, so will advance relminmxid, at long last: + # (ditto for relfrozenxid advancement) + vacuumer_nonaggressive_vacuum diff --git a/src/test/isolation/specs/vacuum-reltuples.spec b/src/test/isolation/specs/vacuum-reltuples.spec deleted file mode 100644 index a2a461f2f5..0000000000 --- a/src/test/isolation/specs/vacuum-reltuples.spec +++ /dev/null @@ -1,49 +0,0 @@ -# Test for vacuum's handling of reltuples when pages are skipped due -# to page pins. We absolutely need to avoid setting reltuples=0 in -# such cases, since that interferes badly with planning. -# -# Expected result for all three permutation is 21 tuples, including -# the second permutation. VACUUM is able to count the concurrently -# inserted tuple in its final reltuples, even when a cleanup lock -# cannot be acquired on the affected heap page. - -setup { - create table smalltbl - as select i as id from generate_series(1,20) i; - alter table smalltbl set (autovacuum_enabled = off); -} -setup { - vacuum analyze smalltbl; -} - -teardown { - drop table smalltbl; -} - -session worker -step open { - begin; - declare c1 cursor for select 1 as dummy from smalltbl; -} -step fetch1 { - fetch next from c1; -} -step close { - commit; -} -step stats { - select relpages, reltuples from pg_class - where oid='smalltbl'::regclass; -} - -session vacuumer -step vac { - vacuum smalltbl; -} -step modify { - insert into smalltbl select max(id)+1 from smalltbl; -} - -permutation modify vac stats -permutation modify open fetch1 vac close stats -permutation modify vac stats From f3c15cbe5065f8c4fb902af8f810a8061a802417 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Sun, 3 Apr 2022 13:35:43 -0700 Subject: [PATCH 361/772] Generalize how VACUUM skips all-frozen pages. Non-aggressive VACUUMs were at a gratuitous disadvantage (relative to aggressive VACUUMs) around advancing relfrozenxid and relminmxid before now. The issue only came up when concurrent activity unset some heap page's visibility map bit right as VACUUM was considering if the page should get counted in frozenskipped_pages. The non-aggressive case would recheck the all-frozen bit at this point. The aggressive case reasoned that the page (a skippable page) must have at least been all-frozen in the recent past, so skipping it won't make relfrozenxid advancement unsafe (which is never okay for aggressive VACUUMs). The recheck created a window for some other backend to confuse matters for VACUUM. If the page's VM bit turned out to be unset, VACUUM would conclude that the page was _never_ all-frozen. frozenskipped_pages was not incremented, and yet VACUUM couldn't back out of skipping at this late stage (it couldn't choose to scan the page instead). This made it unsafe to advance relfrozenxid later on. Consistently avoid the issue by generalizing how we skip frozen pages during aggressive VACUUMs: take the same approach when skipping any skippable page range during aggressive and non-aggressive VACUUMs alike. The new approach makes ranges (not individual pages) the fundamental unit of skipping using the visibility map. frozenskipped_pages is replaced with a boolean flag that represents whether some skippable range with one or more all-visible pages was actually skipped. It is safe for VACUUM to treat a page as all-frozen provided it at least had its all-frozen bit set after the OldestXmin cutoff was established. VACUUM is only required to scan pages that might have XIDs < OldestXmin (unfrozen XIDs) to be able to safely advance relfrozenxid. Tuples concurrently inserted on "skipped" pages can be thought of as equivalent to tuples concurrently inserted on a block >= rel_pages. It's possible that the issue this commit fixes hardly ever came up in practice. But we only had to be unlucky once to lose out on advancing relfrozenxid -- a single affected heap page was enough to throw VACUUM off. That seems like something to avoid on general principle. This is similar to an issue fixed by commit 44fa8488, which taught vacuumlazy.c to not give up on non-aggressive relfrozenxid advancement just because a cleanup lock wasn't immediately available on some heap page. Skipping an all-visible range is now explicitly structured as a choice made by non-aggressive VACUUMs, by weighing known costs (scanning extra skippable pages to freeze their tuples early) against known benefits (advancing relfrozenxid early). This works in essentially the same way as it always has (don't skip ranges < SKIP_PAGES_THRESHOLD). We could do much better here in the future by considering other relevant factors. Author: Peter Geoghegan Reviewed-By: Robert Haas Discussion: https://postgr.es/m/CAH2-Wzn6bGJGfOy3zSTJicKLw99PHJeSOQBOViKjSCinaxUKDQ@mail.gmail.com Discussion: https://postgr.es/m/CA%2BTgmoZiSOY6H7aadw5ZZGm7zYmfDzL6nwmL5V7GL4HgJgLF_w%40mail.gmail.com --- src/backend/access/heap/vacuumlazy.c | 309 +++++++++++++-------------- 1 file changed, 146 insertions(+), 163 deletions(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 826982f70b..9b7114c159 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -176,6 +176,7 @@ typedef struct LVRelState /* Tracks oldest extant XID/MXID for setting relfrozenxid/relminmxid */ TransactionId NewRelfrozenXid; MultiXactId NewRelminMxid; + bool skippedallvis; /* Error reporting state */ char *relnamespace; @@ -196,7 +197,6 @@ typedef struct LVRelState VacDeadItems *dead_items; /* TIDs whose index tuples we'll delete */ BlockNumber rel_pages; /* total number of pages */ BlockNumber scanned_pages; /* # pages examined (not skipped via VM) */ - BlockNumber frozenskipped_pages; /* # frozen pages skipped via VM */ BlockNumber removed_pages; /* # pages removed by relation truncation */ BlockNumber lpdead_item_pages; /* # pages with LP_DEAD items */ BlockNumber missed_dead_pages; /* # pages with missed dead tuples */ @@ -247,6 +247,10 @@ typedef struct LVSavedErrInfo /* non-export function prototypes */ static void lazy_scan_heap(LVRelState *vacrel, int nworkers); +static BlockNumber lazy_scan_skip(LVRelState *vacrel, Buffer *vmbuffer, + BlockNumber next_block, + bool *next_unskippable_allvis, + bool *skipping_current_range); static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno, Page page, bool sharelock, Buffer vmbuffer); @@ -462,7 +466,6 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, /* Initialize page counters explicitly (be tidy) */ vacrel->scanned_pages = 0; - vacrel->frozenskipped_pages = 0; vacrel->removed_pages = 0; vacrel->lpdead_item_pages = 0; vacrel->missed_dead_pages = 0; @@ -509,6 +512,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, /* Initialize state used to track oldest extant XID/XMID */ vacrel->NewRelfrozenXid = OldestXmin; vacrel->NewRelminMxid = OldestMxact; + vacrel->skippedallvis = false; /* * Call lazy_scan_heap to perform all required heap pruning, index @@ -554,11 +558,11 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, MultiXactIdPrecedesOrEquals(aggressive ? MultiXactCutoff : vacrel->relminmxid, vacrel->NewRelminMxid)); - if (vacrel->scanned_pages + vacrel->frozenskipped_pages < orig_rel_pages) + if (vacrel->skippedallvis) { /* * Must keep original relfrozenxid in a non-aggressive VACUUM that - * had to skip an all-visible page. The state that tracks new + * chose to skip an all-visible page range. The state that tracks new * values will have missed unfrozen XIDs from the pages we skipped. */ Assert(!aggressive); @@ -830,7 +834,8 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) next_failsafe_block, next_fsm_block_to_vacuum; Buffer vmbuffer = InvalidBuffer; - bool skipping_blocks; + bool next_unskippable_allvis, + skipping_current_range; const int initprog_index[] = { PROGRESS_VACUUM_PHASE, PROGRESS_VACUUM_TOTAL_HEAP_BLKS, @@ -861,179 +866,52 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) initprog_val[2] = dead_items->max_items; pgstat_progress_update_multi_param(3, initprog_index, initprog_val); - /* - * Set things up for skipping blocks using visibility map. - * - * Except when vacrel->aggressive is set, we want to skip pages that are - * all-visible according to the visibility map, but only when we can skip - * at least SKIP_PAGES_THRESHOLD consecutive pages. Since we're reading - * sequentially, the OS should be doing readahead for us, so there's no - * gain in skipping a page now and then; that's likely to disable - * readahead and so be counterproductive. Also, skipping even a single - * page means that we can't update relfrozenxid, so we only want to do it - * if we can skip a goodly number of pages. - * - * When vacrel->aggressive is set, we can't skip pages just because they - * are all-visible, but we can still skip pages that are all-frozen, since - * such pages do not need freezing and do not affect the value that we can - * safely set for relfrozenxid or relminmxid. - * - * Before entering the main loop, establish the invariant that - * next_unskippable_block is the next block number >= blkno that we can't - * skip based on the visibility map, either all-visible for a regular scan - * or all-frozen for an aggressive scan. We set it to rel_pages when - * there's no such block. We also set up the skipping_blocks flag - * correctly at this stage. - * - * Note: The value returned by visibilitymap_get_status could be slightly - * out-of-date, since we make this test before reading the corresponding - * heap page or locking the buffer. This is OK. If we mistakenly think - * that the page is all-visible or all-frozen when in fact the flag's just - * been cleared, we might fail to vacuum the page. It's easy to see that - * skipping a page when aggressive is not set is not a very big deal; we - * might leave some dead tuples lying around, but the next vacuum will - * find them. But even when aggressive *is* set, it's still OK if we miss - * a page whose all-frozen marking has just been cleared. Any new XIDs - * just added to that page are necessarily >= vacrel->OldestXmin, and so - * they'll have no effect on the value to which we can safely set - * relfrozenxid. A similar argument applies for MXIDs and relminmxid. - */ - next_unskippable_block = 0; - if (vacrel->skipwithvm) - { - while (next_unskippable_block < rel_pages) - { - uint8 vmstatus; - - vmstatus = visibilitymap_get_status(vacrel->rel, - next_unskippable_block, - &vmbuffer); - if (vacrel->aggressive) - { - if ((vmstatus & VISIBILITYMAP_ALL_FROZEN) == 0) - break; - } - else - { - if ((vmstatus & VISIBILITYMAP_ALL_VISIBLE) == 0) - break; - } - vacuum_delay_point(); - next_unskippable_block++; - } - } - - if (next_unskippable_block >= SKIP_PAGES_THRESHOLD) - skipping_blocks = true; - else - skipping_blocks = false; - + /* Set up an initial range of skippable blocks using the visibility map */ + next_unskippable_block = lazy_scan_skip(vacrel, &vmbuffer, 0, + &next_unskippable_allvis, + &skipping_current_range); for (blkno = 0; blkno < rel_pages; blkno++) { Buffer buf; Page page; - bool all_visible_according_to_vm = false; + bool all_visible_according_to_vm; LVPagePruneState prunestate; - pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno); - - update_vacuum_error_info(vacrel, NULL, VACUUM_ERRCB_PHASE_SCAN_HEAP, - blkno, InvalidOffsetNumber); - if (blkno == next_unskippable_block) { - /* Time to advance next_unskippable_block */ - next_unskippable_block++; - if (vacrel->skipwithvm) - { - while (next_unskippable_block < rel_pages) - { - uint8 vmskipflags; - - vmskipflags = visibilitymap_get_status(vacrel->rel, - next_unskippable_block, - &vmbuffer); - if (vacrel->aggressive) - { - if ((vmskipflags & VISIBILITYMAP_ALL_FROZEN) == 0) - break; - } - else - { - if ((vmskipflags & VISIBILITYMAP_ALL_VISIBLE) == 0) - break; - } - vacuum_delay_point(); - next_unskippable_block++; - } - } - /* - * We know we can't skip the current block. But set up - * skipping_blocks to do the right thing at the following blocks. + * Can't skip this page safely. Must scan the page. But + * determine the next skippable range after the page first. */ - if (next_unskippable_block - blkno > SKIP_PAGES_THRESHOLD) - skipping_blocks = true; - else - skipping_blocks = false; + all_visible_according_to_vm = next_unskippable_allvis; + next_unskippable_block = lazy_scan_skip(vacrel, &vmbuffer, + blkno + 1, + &next_unskippable_allvis, + &skipping_current_range); - /* - * Normally, the fact that we can't skip this block must mean that - * it's not all-visible. But in an aggressive vacuum we know only - * that it's not all-frozen, so it might still be all-visible. - */ - if (vacrel->aggressive && - VM_ALL_VISIBLE(vacrel->rel, blkno, &vmbuffer)) - all_visible_according_to_vm = true; + Assert(next_unskippable_block >= blkno + 1); } else { - /* - * The current page can be skipped if we've seen a long enough run - * of skippable blocks to justify skipping it -- provided it's not - * the last page in the relation (according to rel_pages). - * - * We always scan the table's last page to determine whether it - * has tuples or not, even if it would otherwise be skipped. This - * avoids having lazy_truncate_heap() take access-exclusive lock - * on the table to attempt a truncation that just fails - * immediately because there are tuples on the last page. - */ - if (skipping_blocks && blkno < rel_pages - 1) - { - /* - * Tricky, tricky. If this is in aggressive vacuum, the page - * must have been all-frozen at the time we checked whether it - * was skippable, but it might not be any more. We must be - * careful to count it as a skipped all-frozen page in that - * case, or else we'll think we can't update relfrozenxid and - * relminmxid. If it's not an aggressive vacuum, we don't - * know whether it was initially all-frozen, so we have to - * recheck. - */ - if (vacrel->aggressive || - VM_ALL_FROZEN(vacrel->rel, blkno, &vmbuffer)) - vacrel->frozenskipped_pages++; + /* Last page always scanned (may need to set nonempty_pages) */ + Assert(blkno < rel_pages - 1); + + if (skipping_current_range) continue; - } - /* - * SKIP_PAGES_THRESHOLD (threshold for skipping) was not - * crossed, or this is the last page. Scan the page, even - * though it's all-visible (and possibly even all-frozen). - */ + /* Current range is too small to skip -- just scan the page */ all_visible_according_to_vm = true; } - vacuum_delay_point(); - - /* - * We're not skipping this page using the visibility map, and so it is - * (by definition) a scanned page. Any tuples from this page are now - * guaranteed to be counted below, after some preparatory checks. - */ vacrel->scanned_pages++; + /* Report as block scanned, update error traceback information */ + pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno); + update_vacuum_error_info(vacrel, NULL, VACUUM_ERRCB_PHASE_SCAN_HEAP, + blkno, InvalidOffsetNumber); + + vacuum_delay_point(); + /* * Regularly check if wraparound failsafe should trigger. * @@ -1233,8 +1111,8 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) } /* - * Handle setting visibility map bit based on what the VM said about - * the page before pruning started, and using prunestate + * Handle setting visibility map bit based on information from the VM + * (as of last lazy_scan_skip() call), and from prunestate */ if (!all_visible_according_to_vm && prunestate.all_visible) { @@ -1266,9 +1144,8 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) /* * As of PostgreSQL 9.2, the visibility map bit should never be set if * the page-level bit is clear. However, it's possible that the bit - * got cleared after we checked it and before we took the buffer - * content lock, so we must recheck before jumping to the conclusion - * that something bad has happened. + * got cleared after lazy_scan_skip() was called, so we must recheck + * with buffer lock before concluding that the VM is corrupt. */ else if (all_visible_according_to_vm && !PageIsAllVisible(page) && VM_ALL_VISIBLE(vacrel->rel, blkno, &vmbuffer)) @@ -1307,7 +1184,7 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) /* * If the all-visible page is all-frozen but not marked as such yet, * mark it as all-frozen. Note that all_frozen is only valid if - * all_visible is true, so we must check both. + * all_visible is true, so we must check both prunestate fields. */ else if (all_visible_according_to_vm && prunestate.all_visible && prunestate.all_frozen && @@ -1413,6 +1290,112 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) Assert(!IsInParallelMode()); } +/* + * lazy_scan_skip() -- set up range of skippable blocks using visibility map. + * + * lazy_scan_heap() calls here every time it needs to set up a new range of + * blocks to skip via the visibility map. Caller passes the next block in + * line. We return a next_unskippable_block for this range. When there are + * no skippable blocks we just return caller's next_block. The all-visible + * status of the returned block is set in *next_unskippable_allvis for caller, + * too. Block usually won't be all-visible (since it's unskippable), but it + * can be during aggressive VACUUMs (as well as in certain edge cases). + * + * Sets *skipping_current_range to indicate if caller should skip this range. + * Costs and benefits drive our decision. Very small ranges won't be skipped. + * + * Note: our opinion of which blocks can be skipped can go stale immediately. + * It's okay if caller "misses" a page whose all-visible or all-frozen marking + * was concurrently cleared, though. All that matters is that caller scan all + * pages whose tuples might contain XIDs < OldestXmin, or XMIDs < OldestMxact. + * (Actually, non-aggressive VACUUMs can choose to skip all-visible pages with + * older XIDs/MXIDs. The vacrel->skippedallvis flag will be set here when the + * choice to skip such a range is actually made, making everything safe.) + */ +static BlockNumber +lazy_scan_skip(LVRelState *vacrel, Buffer *vmbuffer, BlockNumber next_block, + bool *next_unskippable_allvis, bool *skipping_current_range) +{ + BlockNumber rel_pages = vacrel->rel_pages, + next_unskippable_block = next_block, + nskippable_blocks = 0; + bool skipsallvis = false; + + *next_unskippable_allvis = true; + while (next_unskippable_block < rel_pages) + { + uint8 mapbits = visibilitymap_get_status(vacrel->rel, + next_unskippable_block, + vmbuffer); + + if ((mapbits & VISIBILITYMAP_ALL_VISIBLE) == 0) + { + Assert((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0); + *next_unskippable_allvis = false; + break; + } + + /* + * Caller must scan the last page to determine whether it has tuples + * (caller must have the opportunity to set vacrel->nonempty_pages). + * This rule avoids having lazy_truncate_heap() take access-exclusive + * lock on rel to attempt a truncation that fails anyway, just because + * there are tuples on the last page (it is likely that there will be + * tuples on other nearby pages as well, but those can be skipped). + * + * Implement this by always treating the last block as unsafe to skip. + */ + if (next_unskippable_block == rel_pages - 1) + break; + + /* DISABLE_PAGE_SKIPPING makes all skipping unsafe */ + if (!vacrel->skipwithvm) + break; + + /* + * Aggressive VACUUM caller can't skip pages just because they are + * all-visible. They may still skip all-frozen pages, which can't + * contain XIDs < OldestXmin (XIDs that aren't already frozen by now). + */ + if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0) + { + if (vacrel->aggressive) + break; + + /* + * All-visible block is safe to skip in non-aggressive case. But + * remember that the final range contains such a block for later. + */ + skipsallvis = true; + } + + vacuum_delay_point(); + next_unskippable_block++; + nskippable_blocks++; + } + + /* + * We only skip a range with at least SKIP_PAGES_THRESHOLD consecutive + * pages. Since we're reading sequentially, the OS should be doing + * readahead for us, so there's no gain in skipping a page now and then. + * Skipping such a range might even discourage sequential detection. + * + * This test also enables more frequent relfrozenxid advancement during + * non-aggressive VACUUMs. If the range has any all-visible pages then + * skipping makes updating relfrozenxid unsafe, which is a real downside. + */ + if (nskippable_blocks < SKIP_PAGES_THRESHOLD) + *skipping_current_range = false; + else + { + *skipping_current_range = true; + if (skipsallvis) + vacrel->skippedallvis = true; + } + + return next_unskippable_block; +} + /* * lazy_scan_new_or_empty() -- lazy_scan_heap() new/empty page handling. * From 591e088dd5b357796e136c13dfcdb1f06fd7a3c2 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 3 Apr 2022 17:04:21 -0400 Subject: [PATCH 362/772] Fix portability issues in datetime parsing. datetime.c's parsing logic has assumed that strtod() will accept a string that looks like ".", which it does in glibc, but not on some less-common platforms such as AIX. The result of this was that datetime fields like "123." would be accepted on some platforms but not others; which is a sufficiently odd case that it's not that surprising we've heard no field complaints. But commit e39f99046 extended that assumption to new places, and happened to add a test case that exposed the platform dependency. Remove this dependency by special-casing situations without any digits after the decimal point. (Again, this is in part a pre-existing bug but I don't feel a compulsion to back-patch.) Also, rearrange e39f99046's changes in formatting.c to avoid a Coverity complaint that we were copying an uninitialized field. Discussion: https://postgr.es/m/1592893.1648969747@sss.pgh.pa.us --- src/backend/utils/adt/datetime.c | 105 ++++++++++++++++++------- src/backend/utils/adt/formatting.c | 20 +++-- src/test/regress/expected/interval.out | 35 +++++++++ src/test/regress/sql/interval.sql | 8 ++ 4 files changed, 132 insertions(+), 36 deletions(-) diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 462f2ed7a8..4c12c4d663 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -668,19 +668,50 @@ AdjustYears(int64 val, int scale, } -/* Fetch a fractional-second value with suitable error checking */ +/* + * Parse the fractional part of a number (decimal point and optional digits, + * followed by end of string). Returns the fractional value into *frac. + * + * Returns 0 if successful, DTERR code if bogus input detected. + */ +static int +ParseFraction(char *cp, double *frac) +{ + /* Caller should always pass the start of the fraction part */ + Assert(*cp == '.'); + + /* + * We want to allow just "." with no digits, but some versions of strtod + * will report EINVAL for that, so special-case it. + */ + if (cp[1] == '\0') + { + *frac = 0; + } + else + { + errno = 0; + *frac = strtod(cp, &cp); + /* check for parse failure */ + if (*cp != '\0' || errno != 0) + return DTERR_BAD_FORMAT; + } + return 0; +} + +/* + * Fetch a fractional-second value with suitable error checking. + * Same as ParseFraction except we convert the result to integer microseconds. + */ static int ParseFractionalSecond(char *cp, fsec_t *fsec) { double frac; + int dterr; - /* Caller should always pass the start of the fraction part */ - Assert(*cp == '.'); - errno = 0; - frac = strtod(cp, &cp); - /* check for parse failure */ - if (*cp != '\0' || errno != 0) - return DTERR_BAD_FORMAT; + dterr = ParseFraction(cp, &frac); + if (dterr) + return dterr; *fsec = rint(frac * 1000000); return 0; } @@ -1248,10 +1279,9 @@ DecodeDateTime(char **field, int *ftype, int nf, { double time; - errno = 0; - time = strtod(cp, &cp); - if (*cp != '\0' || errno != 0) - return DTERR_BAD_FORMAT; + dterr = ParseFraction(cp, &time); + if (dterr) + return dterr; time *= USECS_PER_DAY; dt2time(time, &tm->tm_hour, &tm->tm_min, @@ -2146,10 +2176,9 @@ DecodeTimeOnly(char **field, int *ftype, int nf, { double time; - errno = 0; - time = strtod(cp, &cp); - if (*cp != '\0' || errno != 0) - return DTERR_BAD_FORMAT; + dterr = ParseFraction(cp, &time); + if (dterr) + return dterr; time *= USECS_PER_DAY; dt2time(time, &tm->tm_hour, &tm->tm_min, @@ -3035,13 +3064,21 @@ DecodeNumberField(int len, char *str, int fmask, * Can we use ParseFractionalSecond here? Not clear whether trailing * junk should be rejected ... */ - double frac; + if (cp[1] == '\0') + { + /* avoid assuming that strtod will accept "." */ + *fsec = 0; + } + else + { + double frac; - errno = 0; - frac = strtod(cp, NULL); - if (errno != 0) - return DTERR_BAD_FORMAT; - *fsec = rint(frac * 1000000); + errno = 0; + frac = strtod(cp, NULL); + if (errno != 0) + return DTERR_BAD_FORMAT; + *fsec = rint(frac * 1000000); + } /* Now truncate off the fraction for further processing */ *cp = '\0'; len = strlen(str); @@ -3467,11 +3504,9 @@ DecodeInterval(char **field, int *ftype, int nf, int range, } else if (*cp == '.') { - errno = 0; - fval = strtod(cp, &cp); - if (*cp != '\0' || errno != 0) - return DTERR_BAD_FORMAT; - + dterr = ParseFraction(cp, &fval); + if (dterr) + return dterr; if (*field[i] == '-') fval = -fval; } @@ -3650,6 +3685,7 @@ DecodeInterval(char **field, int *ftype, int nf, int range, * Helper functions to avoid duplicated code in DecodeISO8601Interval. * * Parse a decimal value and break it into integer and fractional parts. + * Set *endptr to end+1 of the parsed substring. * Returns 0 or DTERR code. */ static int @@ -3676,7 +3712,20 @@ ParseISO8601Number(char *str, char **endptr, int64 *ipart, double *fpart) /* Parse fractional part if there is any */ if (**endptr == '.') - *fpart = strtod(*endptr, endptr) * sign; + { + /* + * As in ParseFraction, some versions of strtod insist on seeing some + * digits after '.', but some don't. We want to allow zero digits + * after '.' as long as there were some before it. + */ + if (isdigit((unsigned char) *(*endptr + 1))) + *fpart = strtod(*endptr, endptr) * sign; + else + { + (*endptr)++; /* advance over '.' */ + str++; /* so next test will fail if no digits */ + } + } /* did we not see anything that looks like a number? */ if (*endptr == str || errno != 0) diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index 843b07d7d2..97a4544ffc 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -4134,11 +4134,13 @@ timestamp_to_char(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("timestamp out of range"))); - COPY_tm(tm, &tt); - thisdate = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday); - tm->tm_wday = (thisdate + 1) % 7; - tm->tm_yday = thisdate - date2j(tm->tm_year, 1, 1) + 1; + /* calculate wday and yday, because timestamp2tm doesn't */ + thisdate = date2j(tt.tm_year, tt.tm_mon, tt.tm_mday); + tt.tm_wday = (thisdate + 1) % 7; + tt.tm_yday = thisdate - date2j(tt.tm_year, 1, 1) + 1; + + COPY_tm(tm, &tt); if (!(res = datetime_to_char_body(&tmtc, fmt, false, PG_GET_COLLATION()))) PG_RETURN_NULL(); @@ -4168,11 +4170,13 @@ timestamptz_to_char(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("timestamp out of range"))); - COPY_tm(tm, &tt); - thisdate = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday); - tm->tm_wday = (thisdate + 1) % 7; - tm->tm_yday = thisdate - date2j(tm->tm_year, 1, 1) + 1; + /* calculate wday and yday, because timestamp2tm doesn't */ + thisdate = date2j(tt.tm_year, tt.tm_mon, tt.tm_mday); + tt.tm_wday = (thisdate + 1) % 7; + tt.tm_yday = thisdate - date2j(tt.tm_year, 1, 1) + 1; + + COPY_tm(tm, &tt); if (!(res = datetime_to_char_body(&tmtc, fmt, false, PG_GET_COLLATION()))) PG_RETURN_NULL(); diff --git a/src/test/regress/expected/interval.out b/src/test/regress/expected/interval.out index 86c8d4bc99..03f77c01dc 100644 --- a/src/test/regress/expected/interval.out +++ b/src/test/regress/expected/interval.out @@ -908,6 +908,41 @@ select interval 'P0002' AS "year only", 2 years | 2 years 10 mons | 2 years 10 mons 15 days | 2 years 00:00:01 | 2 years 10 mons 00:00:01 | 2 years 10 mons 15 days 00:00:01 | 10:00:00 | 10:30:00 (1 row) +-- Check handling of fractional fields in ISO8601 format. +select interval 'P1Y0M3DT4H5M6S'; + interval +------------------------ + 1 year 3 days 04:05:06 +(1 row) + +select interval 'P1.0Y0M3DT4H5M6S'; + interval +------------------------ + 1 year 3 days 04:05:06 +(1 row) + +select interval 'P1.1Y0M3DT4H5M6S'; + interval +------------------------------ + 1 year 1 mon 3 days 04:05:06 +(1 row) + +select interval 'P1.Y0M3DT4H5M6S'; + interval +------------------------ + 1 year 3 days 04:05:06 +(1 row) + +select interval 'P.1Y0M3DT4H5M6S'; + interval +----------------------- + 1 mon 3 days 04:05:06 +(1 row) + +select interval 'P.Y0M3DT4H5M6S'; -- error +ERROR: invalid input syntax for type interval: "P.Y0M3DT4H5M6S" +LINE 1: select interval 'P.Y0M3DT4H5M6S'; + ^ -- test a couple rounding cases that changed since 8.3 w/ HAVE_INT64_TIMESTAMP. SET IntervalStyle to postgres_verbose; select interval '-10 mons -3 days +03:55:06.70'; diff --git a/src/test/regress/sql/interval.sql b/src/test/regress/sql/interval.sql index f05055e03a..97d33a1323 100644 --- a/src/test/regress/sql/interval.sql +++ b/src/test/regress/sql/interval.sql @@ -312,6 +312,14 @@ select interval 'P0002' AS "year only", interval 'PT10' AS "hour only", interval 'PT10:30' AS "hour minute"; +-- Check handling of fractional fields in ISO8601 format. +select interval 'P1Y0M3DT4H5M6S'; +select interval 'P1.0Y0M3DT4H5M6S'; +select interval 'P1.1Y0M3DT4H5M6S'; +select interval 'P1.Y0M3DT4H5M6S'; +select interval 'P.1Y0M3DT4H5M6S'; +select interval 'P.Y0M3DT4H5M6S'; -- error + -- test a couple rounding cases that changed since 8.3 w/ HAVE_INT64_TIMESTAMP. SET IntervalStyle to postgres_verbose; select interval '-10 mons -3 days +03:55:06.70'; From cc58eecc5d75a9329a6d49a25a6499aea7ee6fd6 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Mon, 4 Apr 2022 10:52:02 +1200 Subject: [PATCH 363/772] Fix tuplesort optimization for CLUSTER-on-expression. When dispatching sort operations to specialized variants, commit 69749243 failed to handle the case where CLUSTER-sort decides not to initialize datum1 and isnull1. Fix by hoisting that decision up a level and advertising whether datum1 can be relied on, in the Tuplesortstate object. Per reports from UBsan and Valgrind build farm animals, while running the cluster.sql test. Reviewed-by: Andres Freund Discussion: https://postgr.es/m/CAFBsxsF1TeK5Fic0M%2BTSJXzbKsY6aBqJGNj6ptURuB09ZF6k_w%40mail.gmail.com --- src/backend/utils/sort/tuplesort.c | 78 +++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 22 deletions(-) diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index 361527098f..10676299dc 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -306,6 +306,12 @@ struct Tuplesortstate void (*readtup) (Tuplesortstate *state, SortTuple *stup, LogicalTape *tape, unsigned int len); + /* + * Whether SortTuple's datum1 and isnull1 members are maintained by the + * above routines. If not, some sort specializations are disabled. + */ + bool haveDatum1; + /* * This array holds the tuples now in sort memory. If we are in state * INITIAL, the tuples are in no particular order; if we are in state @@ -1016,6 +1022,7 @@ tuplesort_begin_heap(TupleDesc tupDesc, state->copytup = copytup_heap; state->writetup = writetup_heap; state->readtup = readtup_heap; + state->haveDatum1 = true; state->tupDesc = tupDesc; /* assume we need not copy tupDesc */ state->abbrevNext = 10; @@ -1095,6 +1102,15 @@ tuplesort_begin_cluster(TupleDesc tupDesc, state->indexInfo = BuildIndexInfo(indexRel); + /* + * If we don't have a simple leading attribute, we don't currently + * initialize datum1, so disable optimizations that require it. + */ + if (state->indexInfo->ii_IndexAttrNumbers[0] == 0) + state->haveDatum1 = false; + else + state->haveDatum1 = true; + state->tupDesc = tupDesc; /* assume we need not copy tupDesc */ indexScanKey = _bt_mkscankey(indexRel, NULL); @@ -1188,6 +1204,7 @@ tuplesort_begin_index_btree(Relation heapRel, state->writetup = writetup_index; state->readtup = readtup_index; state->abbrevNext = 10; + state->haveDatum1 = true; state->heapRel = heapRel; state->indexRel = indexRel; @@ -1262,6 +1279,7 @@ tuplesort_begin_index_hash(Relation heapRel, state->copytup = copytup_index; state->writetup = writetup_index; state->readtup = readtup_index; + state->haveDatum1 = true; state->heapRel = heapRel; state->indexRel = indexRel; @@ -1302,6 +1320,7 @@ tuplesort_begin_index_gist(Relation heapRel, state->copytup = copytup_index; state->writetup = writetup_index; state->readtup = readtup_index; + state->haveDatum1 = true; state->heapRel = heapRel; state->indexRel = indexRel; @@ -1366,6 +1385,7 @@ tuplesort_begin_datum(Oid datumType, Oid sortOperator, Oid sortCollation, state->writetup = writetup_datum; state->readtup = readtup_datum; state->abbrevNext = 10; + state->haveDatum1 = true; state->datumType = datumType; @@ -3593,27 +3613,40 @@ tuplesort_sort_memtuples(Tuplesortstate *state) if (state->memtupcount > 1) { - /* Do we have a specialization for the leading column's comparator? */ - if (state->sortKeys && - state->sortKeys[0].comparator == ssup_datum_unsigned_cmp) - { - elog(DEBUG1, "qsort_tuple_unsigned"); - qsort_tuple_unsigned(state->memtuples, state->memtupcount, state); - } - else if (state->sortKeys && - state->sortKeys[0].comparator == ssup_datum_signed_cmp) - { - elog(DEBUG1, "qsort_tuple_signed"); - qsort_tuple_signed(state->memtuples, state->memtupcount, state); - } - else if (state->sortKeys && - state->sortKeys[0].comparator == ssup_datum_int32_cmp) + /* + * Do we have the leading column's value or abbreviation in datum1, + * and is there a specialization for its comparator? + */ + if (state->haveDatum1 && state->sortKeys) { - elog(DEBUG1, "qsort_tuple_int32"); - qsort_tuple_int32(state->memtuples, state->memtupcount, state); + if (state->sortKeys[0].comparator == ssup_datum_unsigned_cmp) + { + elog(DEBUG1, "qsort_tuple_unsigned"); + qsort_tuple_unsigned(state->memtuples, + state->memtupcount, + state); + return; + } + else if (state->sortKeys[0].comparator == ssup_datum_signed_cmp) + { + elog(DEBUG1, "qsort_tuple_signed"); + qsort_tuple_signed(state->memtuples, + state->memtupcount, + state); + return; + } + else if (state->sortKeys[0].comparator == ssup_datum_int32_cmp) + { + elog(DEBUG1, "qsort_tuple_int32"); + qsort_tuple_int32(state->memtuples, + state->memtupcount, + state); + return; + } } + /* Can we use the single-key sort function? */ - else if (state->onlyKey != NULL) + if (state->onlyKey != NULL) { elog(DEBUG1, "qsort_ssup"); qsort_ssup(state->memtuples, state->memtupcount, @@ -4019,7 +4052,6 @@ comparetup_cluster(const SortTuple *a, const SortTuple *b, datum2; bool isnull1, isnull2; - AttrNumber leading = state->indexInfo->ii_IndexAttrNumbers[0]; /* Be prepared to compare additional sort keys */ ltup = (HeapTuple) a->tuple; @@ -4027,7 +4059,7 @@ comparetup_cluster(const SortTuple *a, const SortTuple *b, tupDesc = state->tupDesc; /* Compare the leading sort key, if it's simple */ - if (leading != 0) + if (state->haveDatum1) { compare = ApplySortComparator(a->datum1, a->isnull1, b->datum1, b->isnull1, @@ -4037,6 +4069,8 @@ comparetup_cluster(const SortTuple *a, const SortTuple *b, if (sortKey->abbrev_converter) { + AttrNumber leading = state->indexInfo->ii_IndexAttrNumbers[0]; + datum1 = heap_getattr(ltup, leading, tupDesc, &isnull1); datum2 = heap_getattr(rtup, leading, tupDesc, &isnull2); @@ -4134,7 +4168,7 @@ copytup_cluster(Tuplesortstate *state, SortTuple *stup, void *tup) * set up first-column key value, and potentially abbreviate, if it's a * simple column */ - if (state->indexInfo->ii_IndexAttrNumbers[0] == 0) + if (!state->haveDatum1) return; original = heap_getattr(tuple, @@ -4229,7 +4263,7 @@ readtup_cluster(Tuplesortstate *state, SortTuple *stup, LogicalTapeReadExact(tape, &tuplen, sizeof(tuplen)); stup->tuple = (void *) tuple; /* set up first-column key value, if it's a simple column */ - if (state->indexInfo->ii_IndexAttrNumbers[0] != 0) + if (state->haveDatum1) stup->datum1 = heap_getattr(tuple, state->indexInfo->ii_IndexAttrNumbers[0], state->tupDesc, From 1b0d9aa4f728edfdff64c3a13fc52bb95f7fb860 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Mon, 4 Apr 2022 20:53:13 +1200 Subject: [PATCH 364/772] Improve the generation memory allocator Here we make a series of improvements to the generation memory allocator, namely: 1. Allow generation contexts to have a minimum, initial and maximum block sizes. The standard allocator allows this already but when the generation context was added, it only allowed fixed-sized blocks. The problem with fixed-sized blocks is that it's difficult to choose how large to make the blocks. If the chosen size is too small then we'd end up with a large number of blocks and a large number of malloc calls. If the block size is made too large, then memory is wasted. 2. Add support for "keeper" blocks. This is a special block that is allocated along with the context itself but is never freed. Instead, when the last chunk in the keeper block is freed, we simply mark the block as empty to allow new allocations to make use of it. 3. Add facility to "recycle" newly empty blocks instead of freeing them and having to later malloc an entire new block again. We do this by recording a single GenerationBlock which has become empty of any chunks. When we run out of space in the current block, we check to see if there is a "freeblock" and use that if it contains enough space for the allocation. Author: David Rowley, Tomas Vondra Reviewed-by: Andy Fan Discussion: https://postgr.es/m/d987fd54-01f8-0f73-af6c-519f799a0ab8@enterprisedb.com --- src/backend/access/gist/gistvacuum.c | 6 + .../replication/logical/reorderbuffer.c | 7 + src/backend/utils/mmgr/generation.c | 385 ++++++++++++++---- src/include/utils/memutils.h | 4 +- 4 files changed, 325 insertions(+), 77 deletions(-) diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c index aac4afab8f..f190decdff 100644 --- a/src/backend/access/gist/gistvacuum.c +++ b/src/backend/access/gist/gistvacuum.c @@ -158,9 +158,15 @@ gistvacuumscan(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, * pages in page_set_context. Internally, the integer set will remember * this context so that the subsequent allocations for these integer sets * will be done from the same context. + * + * XXX the allocation sizes used below pre-date generation context's block + * growing code. These values should likely be benchmarked and set to + * more suitable values. */ vstate.page_set_context = GenerationContextCreate(CurrentMemoryContext, "GiST VACUUM page set context", + 16 * 1024, + 16 * 1024, 16 * 1024); oldctx = MemoryContextSwitchTo(vstate.page_set_context); vstate.internal_page_set = intset_create(); diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index c2d9be81fa..4702750a2e 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -370,8 +370,15 @@ ReorderBufferAllocate(void) SLAB_DEFAULT_BLOCK_SIZE, sizeof(ReorderBufferTXN)); + /* + * XXX the allocation sizes used below pre-date generation context's block + * growing code. These values should likely be benchmarked and set to + * more suitable values. + */ buffer->tup_context = GenerationContextCreate(new_ctx, "Tuples", + SLAB_LARGE_BLOCK_SIZE, + SLAB_LARGE_BLOCK_SIZE, SLAB_LARGE_BLOCK_SIZE); hash_ctl.keysize = sizeof(TransactionId); diff --git a/src/backend/utils/mmgr/generation.c b/src/backend/utils/mmgr/generation.c index 95c006f689..685688c155 100644 --- a/src/backend/utils/mmgr/generation.c +++ b/src/backend/utils/mmgr/generation.c @@ -20,18 +20,15 @@ * * The memory context uses a very simple approach to free space management. * Instead of a complex global freelist, each block tracks a number - * of allocated and freed chunks. Freed chunks are not reused, and once all - * chunks in a block are freed, the whole block is thrown away. When the - * chunks allocated in the same block have similar lifespan, this works - * very well and is very cheap. + * of allocated and freed chunks. The block is classed as empty when the + * number of free chunks is equal to the number of allocated chunks. When + * this occurs, instead of freeing the block, we try to "recycle" it, i.e. + * reuse it for new allocations. This is done by setting the block in the + * context's 'freeblock' field. If the freeblock field is already occupied + * by another free block we simply return the newly empty block to malloc. * - * The current implementation only uses a fixed block size - maybe it should - * adapt a min/max block size range, and grow the blocks automatically. - * It already uses dedicated blocks for oversized chunks. - * - * XXX It might be possible to improve this by keeping a small freelist for - * only a small number of recent blocks, but it's not clear it's worth the - * additional complexity. + * This approach to free blocks requires fewer malloc/free calls for truely + * first allocated, first free'd allocation patterns. * *------------------------------------------------------------------------- */ @@ -39,6 +36,7 @@ #include "postgres.h" #include "lib/ilist.h" +#include "port/pg_bitutils.h" #include "utils/memdebug.h" #include "utils/memutils.h" @@ -46,6 +44,8 @@ #define Generation_BLOCKHDRSZ MAXALIGN(sizeof(GenerationBlock)) #define Generation_CHUNKHDRSZ sizeof(GenerationChunk) +#define Generation_CHUNK_FRACTION 8 + typedef struct GenerationBlock GenerationBlock; /* forward reference */ typedef struct GenerationChunk GenerationChunk; @@ -60,20 +60,28 @@ typedef struct GenerationContext MemoryContextData header; /* Standard memory-context fields */ /* Generational context parameters */ - Size blockSize; /* standard block size */ - - GenerationBlock *block; /* current (most recently allocated) block */ + Size initBlockSize; /* initial block size */ + Size maxBlockSize; /* maximum block size */ + Size nextBlockSize; /* next block size to allocate */ + Size allocChunkLimit; /* effective chunk size limit */ + + GenerationBlock *block; /* current (most recently allocated) block, or + * NULL if we've just freed the most recent + * block */ + GenerationBlock *freeblock; /* pointer to a block that's being recycled, + * or NULL if there's no such block. */ + GenerationBlock *keeper; /* keep this block over resets */ dlist_head blocks; /* list of blocks */ } GenerationContext; /* * GenerationBlock * GenerationBlock is the unit of memory that is obtained by generation.c - * from malloc(). It contains one or more GenerationChunks, which are + * from malloc(). It contains zero or more GenerationChunks, which are * the units requested by palloc() and freed by pfree(). GenerationChunks * cannot be returned to malloc() individually, instead pfree() * updates the free counter of the block and when all chunks in a block - * are free the whole block is returned to malloc(). + * are free the whole block can be returned to malloc(). * * GenerationBlock is the header data for a block --- the usable space * within the block begins at the next alignment boundary. @@ -143,6 +151,14 @@ struct GenerationChunk #define GenerationChunkGetPointer(chk) \ ((GenerationPointer *)(((char *)(chk)) + Generation_CHUNKHDRSZ)) +/* Inlined helper functions */ +static inline void GenerationBlockInit(GenerationBlock *block, Size blksize); +static inline bool GenerationBlockIsEmpty(GenerationBlock *block); +static inline void GenerationBlockMarkEmpty(GenerationBlock *block); +static inline Size GenerationBlockFreeBytes(GenerationBlock *block); +static inline void GenerationBlockFree(GenerationContext *set, + GenerationBlock *block); + /* * These functions implement the MemoryContext API for Generation contexts. */ @@ -191,14 +207,21 @@ static const MemoryContextMethods GenerationMethods = { * * parent: parent context, or NULL if top-level context * name: name of context (must be statically allocated) - * blockSize: generation block size + * minContextSize: minimum context size + * initBlockSize: initial allocation block size + * maxBlockSize: maximum allocation block size */ MemoryContext GenerationContextCreate(MemoryContext parent, const char *name, - Size blockSize) + Size minContextSize, + Size initBlockSize, + Size maxBlockSize) { + Size firstBlockSize; + Size allocSize; GenerationContext *set; + GenerationBlock *block; /* Assert we padded GenerationChunk properly */ StaticAssertStmt(Generation_CHUNKHDRSZ == MAXALIGN(Generation_CHUNKHDRSZ), @@ -208,24 +231,33 @@ GenerationContextCreate(MemoryContext parent, "padding calculation in GenerationChunk is wrong"); /* - * First, validate allocation parameters. (If we're going to throw an - * error, we should do so before the context is created, not after.) We - * somewhat arbitrarily enforce a minimum 1K block size, mostly because - * that's what AllocSet does. + * First, validate allocation parameters. Asserts seem sufficient because + * nobody varies their parameters at runtime. We somewhat arbitrarily + * enforce a minimum 1K block size. */ - if (blockSize != MAXALIGN(blockSize) || - blockSize < 1024 || - !AllocHugeSizeIsValid(blockSize)) - elog(ERROR, "invalid blockSize for memory context: %zu", - blockSize); + Assert(initBlockSize == MAXALIGN(initBlockSize) && + initBlockSize >= 1024); + Assert(maxBlockSize == MAXALIGN(maxBlockSize) && + maxBlockSize >= initBlockSize && + AllocHugeSizeIsValid(maxBlockSize)); /* must be safe to double */ + Assert(minContextSize == 0 || + (minContextSize == MAXALIGN(minContextSize) && + minContextSize >= 1024 && + minContextSize <= maxBlockSize)); + + /* Determine size of initial block */ + allocSize = MAXALIGN(sizeof(GenerationContext)) + + Generation_BLOCKHDRSZ + Generation_CHUNKHDRSZ; + if (minContextSize != 0) + allocSize = Max(allocSize, minContextSize); + else + allocSize = Max(allocSize, initBlockSize); /* - * Allocate the context header. Unlike aset.c, we never try to combine - * this with the first regular block, since that would prevent us from - * freeing the first generation of allocations. + * Allocate the initial block. Unlike other generation.c blocks, it + * starts with the context header and its block header follows that. */ - - set = (GenerationContext *) malloc(MAXALIGN(sizeof(GenerationContext))); + set = (GenerationContext *) malloc(allocSize); if (set == NULL) { MemoryContextStats(TopMemoryContext); @@ -240,11 +272,40 @@ GenerationContextCreate(MemoryContext parent, * Avoid writing code that can fail between here and MemoryContextCreate; * we'd leak the header if we ereport in this stretch. */ + dlist_init(&set->blocks); + + /* Fill in the initial block's block header */ + block = (GenerationBlock *) (((char *) set) + MAXALIGN(sizeof(GenerationContext))); + /* determine the block size and initialize it */ + firstBlockSize = allocSize - MAXALIGN(sizeof(GenerationContext)); + GenerationBlockInit(block, firstBlockSize); + + /* add it to the doubly-linked list of blocks */ + dlist_push_head(&set->blocks, &block->node); + + /* use it as the current allocation block */ + set->block = block; + + /* No free block, yet */ + set->freeblock = NULL; + + /* Mark block as not to be released at reset time */ + set->keeper = block; /* Fill in GenerationContext-specific header fields */ - set->blockSize = blockSize; - set->block = NULL; - dlist_init(&set->blocks); + set->initBlockSize = initBlockSize; + set->maxBlockSize = maxBlockSize; + set->nextBlockSize = initBlockSize; + + /* + * Compute the allocation chunk size limit for this context. + * + * Follows similar ideas as AllocSet, see aset.c for details ... + */ + set->allocChunkLimit = maxBlockSize; + while ((Size) (set->allocChunkLimit + Generation_CHUNKHDRSZ) > + (Size) ((Size) (maxBlockSize - Generation_BLOCKHDRSZ) / Generation_CHUNK_FRACTION)) + set->allocChunkLimit >>= 1; /* Finally, do the type-independent part of context creation */ MemoryContextCreate((MemoryContext) set, @@ -253,6 +314,8 @@ GenerationContextCreate(MemoryContext parent, parent, name); + ((MemoryContext) set)->mem_allocated = firstBlockSize; + return (MemoryContext) set; } @@ -276,24 +339,32 @@ GenerationReset(MemoryContext context) GenerationCheck(context); #endif + /* + * NULLify the free block pointer. We must do this before calling + * GenerationBlockFree as that function never expects to free the + * freeblock. + */ + set->freeblock = NULL; + dlist_foreach_modify(miter, &set->blocks) { GenerationBlock *block = dlist_container(GenerationBlock, node, miter.cur); - dlist_delete(miter.cur); - - context->mem_allocated -= block->blksize; - -#ifdef CLOBBER_FREED_MEMORY - wipe_mem(block, block->blksize); -#endif - - free(block); + if (block == set->keeper) + GenerationBlockMarkEmpty(block); + else + GenerationBlockFree(set, block); } - set->block = NULL; + /* set it so new allocations to make use of the keeper block */ + set->block = set->keeper; + + /* Reset block size allocation sequence, too */ + set->nextBlockSize = set->initBlockSize; - Assert(dlist_is_empty(&set->blocks)); + /* Ensure there is only 1 item in the dlist */ + Assert(!dlist_is_empty(&set->blocks)); + Assert(!dlist_has_next(&set->blocks, dlist_head_node(&set->blocks))); } /* @@ -303,9 +374,9 @@ GenerationReset(MemoryContext context) static void GenerationDelete(MemoryContext context) { - /* Reset to release all the GenerationBlocks */ + /* Reset to release all releasable GenerationBlocks */ GenerationReset(context); - /* And free the context header */ + /* And free the context header and keeper block */ free(context); } @@ -329,11 +400,12 @@ GenerationAlloc(MemoryContext context, Size size) GenerationBlock *block; GenerationChunk *chunk; Size chunk_size = MAXALIGN(size); + Size required_size = chunk_size + Generation_CHUNKHDRSZ; /* is it an over-sized chunk? if yes, allocate special block */ - if (chunk_size > set->blockSize / 8) + if (chunk_size > set->allocChunkLimit) { - Size blksize = chunk_size + Generation_BLOCKHDRSZ + Generation_CHUNKHDRSZ; + Size blksize = required_size + Generation_BLOCKHDRSZ; block = (GenerationBlock *) malloc(blksize); if (block == NULL) @@ -379,36 +451,79 @@ GenerationAlloc(MemoryContext context, Size size) } /* - * Not an over-sized chunk. Is there enough space in the current block? If - * not, allocate a new "regular" block. + * Not an oversized chunk. We try to first make use of the current block, + * but if there's not enough space in it, instead of allocating a new + * block, we look to see if the freeblock is empty and has enough space. + * If not, we'll also try the same using the keeper block. The keeper + * block may have become empty and we have no other way to reuse it again + * if we don't try to use it explicitly here. + * + * We don't want to start filling the freeblock before the current block + * is full, otherwise we may cause fragmentation in FIFO type workloads. + * We only switch to using the freeblock or keeper block if those blocks + * are completely empty. If we didn't do that we could end up fragmenting + * consecutive allocations over multiple blocks which would be a problem + * that would compound over time. */ block = set->block; - if ((block == NULL) || - (block->endptr - block->freeptr) < Generation_CHUNKHDRSZ + chunk_size) + if (block == NULL || + GenerationBlockFreeBytes(block) < required_size) { - Size blksize = set->blockSize; + Size blksize; + GenerationBlock *freeblock = set->freeblock; - block = (GenerationBlock *) malloc(blksize); + if (freeblock != NULL && + GenerationBlockIsEmpty(freeblock) && + GenerationBlockFreeBytes(freeblock) >= required_size) + { + block = freeblock; - if (block == NULL) - return NULL; + /* + * Zero out the freeblock as we'll set this to the current block + * below + */ + set->freeblock = NULL; + } + else if (GenerationBlockIsEmpty(set->keeper) && + GenerationBlockFreeBytes(set->keeper) >= required_size) + { + block = set->keeper; + } + else + { + /* + * The first such block has size initBlockSize, and we double the + * space in each succeeding block, but not more than maxBlockSize. + */ + blksize = set->nextBlockSize; + set->nextBlockSize <<= 1; + if (set->nextBlockSize > set->maxBlockSize) + set->nextBlockSize = set->maxBlockSize; - context->mem_allocated += blksize; + /* we'll need a block hdr too, so add that to the required size */ + required_size += Generation_BLOCKHDRSZ; - block->blksize = blksize; - block->nchunks = 0; - block->nfree = 0; + /* round the size up to the next power of 2 */ + if (blksize < required_size) + blksize = pg_nextpower2_size_t(required_size); - block->freeptr = ((char *) block) + Generation_BLOCKHDRSZ; - block->endptr = ((char *) block) + blksize; + block = (GenerationBlock *) malloc(blksize); - /* Mark unallocated space NOACCESS. */ - VALGRIND_MAKE_MEM_NOACCESS(block->freeptr, - blksize - Generation_BLOCKHDRSZ); + if (block == NULL) + return NULL; - /* add it to the doubly-linked list of blocks */ - dlist_push_head(&set->blocks, &block->node); + context->mem_allocated += blksize; + + /* initialize the new block */ + GenerationBlockInit(block, blksize); + + /* add it to the doubly-linked list of blocks */ + dlist_push_head(&set->blocks, &block->node); + + /* Zero out the freeblock in case it's become full */ + set->freeblock = NULL; + } /* and also use it as the current allocation block */ set->block = block; @@ -453,6 +568,95 @@ GenerationAlloc(MemoryContext context, Size size) return GenerationChunkGetPointer(chunk); } +/* + * GenerationBlockInit + * Initializes 'block' assuming 'blksize'. Does not update the context's + * mem_allocated field. + */ +static inline void +GenerationBlockInit(GenerationBlock *block, Size blksize) +{ + block->blksize = blksize; + block->nchunks = 0; + block->nfree = 0; + + block->freeptr = ((char *) block) + Generation_BLOCKHDRSZ; + block->endptr = ((char *) block) + blksize; + + /* Mark unallocated space NOACCESS. */ + VALGRIND_MAKE_MEM_NOACCESS(block->freeptr, + blksize - Generation_BLOCKHDRSZ); +} + +/* + * GenerationBlockIsEmpty + * Returns true iif 'block' contains no chunks + */ +static inline bool +GenerationBlockIsEmpty(GenerationBlock *block) +{ + return (block->nchunks == 0); +} + +/* + * GenerationBlockMarkEmpty + * Set a block as empty. Does not free the block. + */ +static inline void +GenerationBlockMarkEmpty(GenerationBlock *block) +{ +#if defined(USE_VALGRIND) || defined(CLOBBER_FREED_MEMORY) + char *datastart = ((char *) block) + Generation_BLOCKHDRSZ; +#endif + +#ifdef CLOBBER_FREED_MEMORY + wipe_mem(datastart, block->freeptr - datastart); +#else + /* wipe_mem() would have done this */ + VALGRIND_MAKE_MEM_NOACCESS(datastart, block->freeptr - datastart); +#endif + + /* Reset the block, but don't return it to malloc */ + block->nchunks = 0; + block->nfree = 0; + block->freeptr = ((char *) block) + Generation_BLOCKHDRSZ; + +} + +/* + * GenerationBlockFreeBytes + * Returns the number of bytes free in 'block' + */ +static inline Size +GenerationBlockFreeBytes(GenerationBlock *block) +{ + return (block->endptr - block->freeptr); +} + +/* + * GenerationBlockFree + * Remove 'block' from 'set' and release the memory consumed by it. + */ +static inline void +GenerationBlockFree(GenerationContext *set, GenerationBlock *block) +{ + /* Make sure nobody tries to free the keeper block */ + Assert(block != set->keeper); + /* We shouldn't be freeing the freeblock either */ + Assert(block != set->freeblock); + + /* release the block from the list of blocks */ + dlist_delete(&block->node); + + ((MemoryContext) set)->mem_allocated -= block->blksize; + +#ifdef CLOBBER_FREED_MEMORY + wipe_mem(block, block->blksize); +#endif + + free(block); +} + /* * GenerationFree * Update number of chunks in the block, and if all chunks in the block @@ -499,16 +703,36 @@ GenerationFree(MemoryContext context, void *pointer) if (block->nfree < block->nchunks) return; + /* Don't try to free the keeper block, just mark it empty */ + if (block == set->keeper) + { + GenerationBlockMarkEmpty(block); + return; + } + /* - * The block is empty, so let's get rid of it. First remove it from the - * list of blocks, then return it to malloc(). + * If there is no freeblock set or if this is the freeblock then instead + * of freeing this memory, we keep it around so that new allocations have + * the option of recycling it. */ - dlist_delete(&block->node); + if (set->freeblock == NULL || set->freeblock == block) + { + /* XXX should we only recycle maxBlockSize sized blocks? */ + set->freeblock = block; + GenerationBlockMarkEmpty(block); + return; + } /* Also make sure the block is not marked as the current block. */ if (set->block == block) set->block = NULL; + /* + * The block is empty, so let's get rid of it. First remove it from the + * list of blocks, then return it to malloc(). + */ + dlist_delete(&block->node); + context->mem_allocated -= block->blksize; free(block); } @@ -655,8 +879,17 @@ static bool GenerationIsEmpty(MemoryContext context) { GenerationContext *set = (GenerationContext *) context; + dlist_iter iter; + + dlist_foreach(iter, &set->blocks) + { + GenerationBlock *block = dlist_container(GenerationBlock, node, iter.cur); + + if (block->nchunks > 0) + return false; + } - return dlist_is_empty(&set->blocks); + return true; } /* @@ -748,10 +981,10 @@ GenerationCheck(MemoryContext context) total_allocated += block->blksize; /* - * nfree > nchunks is surely wrong, and we don't expect to see - * equality either, because such a block should have gotten freed. + * nfree > nchunks is surely wrong. Equality is allowed as the block + * might completely empty if it's the freeblock. */ - if (block->nfree >= block->nchunks) + if (block->nfree > block->nchunks) elog(WARNING, "problem in Generation %s: number of free chunks %d in block %p exceeds %d allocated", name, block->nfree, block, block->nchunks); diff --git a/src/include/utils/memutils.h b/src/include/utils/memutils.h index 019700247a..495d1af201 100644 --- a/src/include/utils/memutils.h +++ b/src/include/utils/memutils.h @@ -183,7 +183,9 @@ extern MemoryContext SlabContextCreate(MemoryContext parent, /* generation.c */ extern MemoryContext GenerationContextCreate(MemoryContext parent, const char *name, - Size blockSize); + Size minContextSize, + Size initBlockSize, + Size maxBlockSize); /* * Recommended default alloc parameters, suitable for "ordinary" contexts From 77bae396df3f6f883f58f1877b7c08eb3ebb6b63 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Mon, 4 Apr 2022 22:24:59 +1200 Subject: [PATCH 365/772] Adjust tuplesort API to have bitwise option flags This replaces the bool flag for randomAccess. An upcoming patch requires adding another option, so instead of breaking the API for that, then breaking it again one day if we add more options, let's just break it once. Any boolean options we add in the future will just make use of an unused bit in the flags. Any extensions making use of tuplesorts will need to update their code to pass TUPLESORT_RANDOMACCESS instead of true for randomAccess. TUPLESORT_NONE can be used for a set of empty options. Author: David Rowley Reviewed-by: Justin Pryzby Discussion: https://postgr.es/m/CAApHDvoH4ASzsAOyHcxkuY01Qf%2B%2B8JJ0paw%2B03dk%2BW25tQEcNQ%40mail.gmail.com --- src/backend/access/gist/gistbuild.c | 2 +- src/backend/access/hash/hashsort.c | 2 +- src/backend/access/heap/heapam_handler.c | 2 +- src/backend/access/nbtree/nbtsort.c | 6 +- src/backend/catalog/index.c | 2 +- src/backend/executor/nodeAgg.c | 6 +- src/backend/executor/nodeIncrementalSort.c | 4 +- src/backend/executor/nodeSort.c | 8 +- src/backend/utils/adt/orderedsetaggs.c | 10 +- src/backend/utils/sort/tuplesort.c | 111 +++++++++++---------- src/include/utils/tuplesort.h | 19 ++-- 11 files changed, 99 insertions(+), 73 deletions(-) diff --git a/src/backend/access/gist/gistbuild.c b/src/backend/access/gist/gistbuild.c index e081e6571a..f5a5caff8e 100644 --- a/src/backend/access/gist/gistbuild.c +++ b/src/backend/access/gist/gistbuild.c @@ -271,7 +271,7 @@ gistbuild(Relation heap, Relation index, IndexInfo *indexInfo) index, maintenance_work_mem, NULL, - false); + TUPLESORT_NONE); /* Scan the table, adding all tuples to the tuplesort */ reltuples = table_index_build_scan(heap, index, indexInfo, true, true, diff --git a/src/backend/access/hash/hashsort.c b/src/backend/access/hash/hashsort.c index 6d8512283a..aa61e39f26 100644 --- a/src/backend/access/hash/hashsort.c +++ b/src/backend/access/hash/hashsort.c @@ -86,7 +86,7 @@ _h_spoolinit(Relation heap, Relation index, uint32 num_buckets) hspool->max_buckets, maintenance_work_mem, NULL, - false); + TUPLESORT_NONE); return hspool; } diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index dee264e859..3a9532cb4f 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -726,7 +726,7 @@ heapam_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap, if (use_sort) tuplesort = tuplesort_begin_cluster(oldTupDesc, OldIndex, maintenance_work_mem, - NULL, false); + NULL, TUPLESORT_NONE); else tuplesort = NULL; diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c index c074513efa..9f60fa9894 100644 --- a/src/backend/access/nbtree/nbtsort.c +++ b/src/backend/access/nbtree/nbtsort.c @@ -436,7 +436,7 @@ _bt_spools_heapscan(Relation heap, Relation index, BTBuildState *buildstate, tuplesort_begin_index_btree(heap, index, buildstate->isunique, buildstate->nulls_not_distinct, maintenance_work_mem, coordinate, - false); + TUPLESORT_NONE); /* * If building a unique index, put dead tuples in a second spool to keep @@ -475,7 +475,7 @@ _bt_spools_heapscan(Relation heap, Relation index, BTBuildState *buildstate, */ buildstate->spool2->sortstate = tuplesort_begin_index_btree(heap, index, false, false, work_mem, - coordinate2, false); + coordinate2, TUPLESORT_NONE); } /* Fill spool using either serial or parallel heap scan */ @@ -1939,7 +1939,7 @@ _bt_parallel_scan_and_sort(BTSpool *btspool, BTSpool *btspool2, btspool->isunique, btspool->nulls_not_distinct, sortmem, coordinate, - false); + TUPLESORT_NONE); /* * Just as with serial case, there may be a second spool. If so, a diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index dd715ca060..55800c9478 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -3364,7 +3364,7 @@ validate_index(Oid heapId, Oid indexId, Snapshot snapshot) state.tuplesort = tuplesort_begin_datum(INT8OID, Int8LessOperator, InvalidOid, false, maintenance_work_mem, - NULL, false); + NULL, TUPLESORT_NONE); state.htups = state.itups = state.tups_inserted = 0; /* ambulkdelete updates progress metrics */ diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 08cf569d8f..23030a32a5 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -530,7 +530,7 @@ initialize_phase(AggState *aggstate, int newphase) sortnode->collations, sortnode->nullsFirst, work_mem, - NULL, false); + NULL, TUPLESORT_NONE); } aggstate->current_phase = newphase; @@ -607,7 +607,7 @@ initialize_aggregate(AggState *aggstate, AggStatePerTrans pertrans, pertrans->sortOperators[0], pertrans->sortCollations[0], pertrans->sortNullsFirst[0], - work_mem, NULL, false); + work_mem, NULL, TUPLESORT_NONE); } else pertrans->sortstates[aggstate->current_set] = @@ -617,7 +617,7 @@ initialize_aggregate(AggState *aggstate, AggStatePerTrans pertrans, pertrans->sortOperators, pertrans->sortCollations, pertrans->sortNullsFirst, - work_mem, NULL, false); + work_mem, NULL, TUPLESORT_NONE); } /* diff --git a/src/backend/executor/nodeIncrementalSort.c b/src/backend/executor/nodeIncrementalSort.c index d6fb56dec7..4f50bc845d 100644 --- a/src/backend/executor/nodeIncrementalSort.c +++ b/src/backend/executor/nodeIncrementalSort.c @@ -315,7 +315,7 @@ switchToPresortedPrefixMode(PlanState *pstate) &(plannode->sort.nullsFirst[nPresortedCols]), work_mem, NULL, - false); + TUPLESORT_NONE); node->prefixsort_state = prefixsort_state; } else @@ -616,7 +616,7 @@ ExecIncrementalSort(PlanState *pstate) plannode->sort.nullsFirst, work_mem, NULL, - false); + TUPLESORT_NONE); node->fullsort_state = fullsort_state; } else diff --git a/src/backend/executor/nodeSort.c b/src/backend/executor/nodeSort.c index 9481a622bf..a113d73795 100644 --- a/src/backend/executor/nodeSort.c +++ b/src/backend/executor/nodeSort.c @@ -77,6 +77,7 @@ ExecSort(PlanState *pstate) Sort *plannode = (Sort *) node->ss.ps.plan; PlanState *outerNode; TupleDesc tupDesc; + int tuplesortopts = TUPLESORT_NONE; SO1_printf("ExecSort: %s\n", "sorting subplan"); @@ -96,6 +97,9 @@ ExecSort(PlanState *pstate) outerNode = outerPlanState(node); tupDesc = ExecGetResultType(outerNode); + if (node->randomAccess) + tuplesortopts |= TUPLESORT_RANDOMACCESS; + if (node->datumSort) tuplesortstate = tuplesort_begin_datum(TupleDescAttr(tupDesc, 0)->atttypid, plannode->sortOperators[0], @@ -103,7 +107,7 @@ ExecSort(PlanState *pstate) plannode->nullsFirst[0], work_mem, NULL, - node->randomAccess); + tuplesortopts); else tuplesortstate = tuplesort_begin_heap(tupDesc, plannode->numCols, @@ -113,7 +117,7 @@ ExecSort(PlanState *pstate) plannode->nullsFirst, work_mem, NULL, - node->randomAccess); + tuplesortopts); if (node->bounded) tuplesort_set_bound(tuplesortstate, node->bound); node->tuplesortstate = (void *) tuplesortstate; diff --git a/src/backend/utils/adt/orderedsetaggs.c b/src/backend/utils/adt/orderedsetaggs.c index 96dae6ec4a..6d4f6b7dca 100644 --- a/src/backend/utils/adt/orderedsetaggs.c +++ b/src/backend/utils/adt/orderedsetaggs.c @@ -118,6 +118,7 @@ ordered_set_startup(FunctionCallInfo fcinfo, bool use_tuples) OSAPerQueryState *qstate; MemoryContext gcontext; MemoryContext oldcontext; + int tuplesortopt; /* * Check we're called as aggregate (and not a window function), and get @@ -283,6 +284,11 @@ ordered_set_startup(FunctionCallInfo fcinfo, bool use_tuples) osastate->qstate = qstate; osastate->gcontext = gcontext; + tuplesortopt = TUPLESORT_NONE; + + if (qstate->rescan_needed) + tuplesortopt |= TUPLESORT_RANDOMACCESS; + /* * Initialize tuplesort object. */ @@ -295,7 +301,7 @@ ordered_set_startup(FunctionCallInfo fcinfo, bool use_tuples) qstate->sortNullsFirsts, work_mem, NULL, - qstate->rescan_needed); + tuplesortopt); else osastate->sortstate = tuplesort_begin_datum(qstate->sortColType, qstate->sortOperator, @@ -303,7 +309,7 @@ ordered_set_startup(FunctionCallInfo fcinfo, bool use_tuples) qstate->sortNullsFirst, work_mem, NULL, - qstate->rescan_needed); + tuplesortopt); osastate->number_of_rows = 0; osastate->sort_done = false; diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index 10676299dc..a8a5cc5204 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -246,7 +246,7 @@ struct Tuplesortstate { TupSortStatus status; /* enumerated value as shown above */ int nKeys; /* number of columns in sort key */ - bool randomAccess; /* did caller request random access? */ + int sortopt; /* Bitmask of flags used to setup sort */ bool bounded; /* did caller specify a maximum number of * tuples to return? */ bool boundUsed; /* true if we made use of a bounded heap */ @@ -564,12 +564,12 @@ struct Sharedsort * may or may not match the in-memory representation of the tuple --- * any conversion needed is the job of the writetup and readtup routines. * - * If state->randomAccess is true, then the stored representation of the - * tuple must be followed by another "unsigned int" that is a copy of the - * length --- so the total tape space used is actually sizeof(unsigned int) - * more than the stored length value. This allows read-backwards. When - * randomAccess is not true, the write/read routines may omit the extra - * length word. + * If state->sortopt contains TUPLESORT_RANDOMACCESS, then the stored + * representation of the tuple must be followed by another "unsigned int" that + * is a copy of the length --- so the total tape space used is actually + * sizeof(unsigned int) more than the stored length value. This allows + * read-backwards. When the random access flag was not specified, the + * write/read routines may omit the extra length word. * * writetup is expected to write both length words as well as the tuple * data. When readtup is called, the tape is positioned just after the @@ -614,7 +614,7 @@ struct Sharedsort static Tuplesortstate *tuplesort_begin_common(int workMem, SortCoordinate coordinate, - bool randomAccess); + int sortopt); static void tuplesort_begin_batch(Tuplesortstate *state); static void puttuple_common(Tuplesortstate *state, SortTuple *tuple); static bool consider_abort_common(Tuplesortstate *state); @@ -806,21 +806,20 @@ qsort_tuple_int32_compare(SortTuple *a, SortTuple *b, Tuplesortstate *state) * Each variant of tuplesort_begin has a workMem parameter specifying the * maximum number of kilobytes of RAM to use before spilling data to disk. * (The normal value of this parameter is work_mem, but some callers use - * other values.) Each variant also has a randomAccess parameter specifying - * whether the caller needs non-sequential access to the sort result. + * other values.) Each variant also has a sortopt which is a bitmask of + * sort options. See TUPLESORT_* definitions in tuplesort.h */ static Tuplesortstate * -tuplesort_begin_common(int workMem, SortCoordinate coordinate, - bool randomAccess) +tuplesort_begin_common(int workMem, SortCoordinate coordinate, int sortopt) { Tuplesortstate *state; MemoryContext maincontext; MemoryContext sortcontext; MemoryContext oldcontext; - /* See leader_takeover_tapes() remarks on randomAccess support */ - if (coordinate && randomAccess) + /* See leader_takeover_tapes() remarks on random access support */ + if (coordinate && (sortopt & TUPLESORT_RANDOMACCESS)) elog(ERROR, "random access disallowed under parallel sort"); /* @@ -857,7 +856,7 @@ tuplesort_begin_common(int workMem, SortCoordinate coordinate, pg_rusage_init(&state->ru_start); #endif - state->randomAccess = randomAccess; + state->sortopt = sortopt; state->tuples = true; /* @@ -991,10 +990,10 @@ tuplesort_begin_heap(TupleDesc tupDesc, int nkeys, AttrNumber *attNums, Oid *sortOperators, Oid *sortCollations, bool *nullsFirstFlags, - int workMem, SortCoordinate coordinate, bool randomAccess) + int workMem, SortCoordinate coordinate, int sortopt) { Tuplesortstate *state = tuplesort_begin_common(workMem, coordinate, - randomAccess); + sortopt); MemoryContext oldcontext; int i; @@ -1006,7 +1005,7 @@ tuplesort_begin_heap(TupleDesc tupDesc, if (trace_sort) elog(LOG, "begin tuple sort: nkeys = %d, workMem = %d, randomAccess = %c", - nkeys, workMem, randomAccess ? 't' : 'f'); + nkeys, workMem, sortopt & TUPLESORT_RANDOMACCESS ? 't' : 'f'); #endif state->nKeys = nkeys; @@ -1015,7 +1014,7 @@ tuplesort_begin_heap(TupleDesc tupDesc, false, /* no unique check */ nkeys, workMem, - randomAccess, + sortopt & TUPLESORT_RANDOMACCESS, PARALLEL_SORT(state)); state->comparetup = comparetup_heap; @@ -1065,10 +1064,10 @@ Tuplesortstate * tuplesort_begin_cluster(TupleDesc tupDesc, Relation indexRel, int workMem, - SortCoordinate coordinate, bool randomAccess) + SortCoordinate coordinate, int sortopt) { Tuplesortstate *state = tuplesort_begin_common(workMem, coordinate, - randomAccess); + sortopt); BTScanInsert indexScanKey; MemoryContext oldcontext; int i; @@ -1082,7 +1081,7 @@ tuplesort_begin_cluster(TupleDesc tupDesc, elog(LOG, "begin tuple sort: nkeys = %d, workMem = %d, randomAccess = %c", RelationGetNumberOfAttributes(indexRel), - workMem, randomAccess ? 't' : 'f'); + workMem, sortopt & TUPLESORT_RANDOMACCESS ? 't' : 'f'); #endif state->nKeys = IndexRelationGetNumberOfKeyAttributes(indexRel); @@ -1091,7 +1090,7 @@ tuplesort_begin_cluster(TupleDesc tupDesc, false, /* no unique check */ state->nKeys, workMem, - randomAccess, + sortopt & TUPLESORT_RANDOMACCESS, PARALLEL_SORT(state)); state->comparetup = comparetup_cluster; @@ -1172,10 +1171,10 @@ tuplesort_begin_index_btree(Relation heapRel, bool uniqueNullsNotDistinct, int workMem, SortCoordinate coordinate, - bool randomAccess) + int sortopt) { Tuplesortstate *state = tuplesort_begin_common(workMem, coordinate, - randomAccess); + sortopt); BTScanInsert indexScanKey; MemoryContext oldcontext; int i; @@ -1187,7 +1186,7 @@ tuplesort_begin_index_btree(Relation heapRel, elog(LOG, "begin index sort: unique = %c, workMem = %d, randomAccess = %c", enforceUnique ? 't' : 'f', - workMem, randomAccess ? 't' : 'f'); + workMem, sortopt & TUPLESORT_RANDOMACCESS ? 't' : 'f'); #endif state->nKeys = IndexRelationGetNumberOfKeyAttributes(indexRel); @@ -1196,7 +1195,7 @@ tuplesort_begin_index_btree(Relation heapRel, enforceUnique, state->nKeys, workMem, - randomAccess, + sortopt & TUPLESORT_RANDOMACCESS, PARALLEL_SORT(state)); state->comparetup = comparetup_index_btree; @@ -1254,10 +1253,10 @@ tuplesort_begin_index_hash(Relation heapRel, uint32 max_buckets, int workMem, SortCoordinate coordinate, - bool randomAccess) + int sortopt) { Tuplesortstate *state = tuplesort_begin_common(workMem, coordinate, - randomAccess); + sortopt); MemoryContext oldcontext; oldcontext = MemoryContextSwitchTo(state->maincontext); @@ -1270,7 +1269,8 @@ tuplesort_begin_index_hash(Relation heapRel, high_mask, low_mask, max_buckets, - workMem, randomAccess ? 't' : 'f'); + workMem, + sortopt & TUPLESORT_RANDOMACCESS ? 't' : 'f'); #endif state->nKeys = 1; /* Only one sort column, the hash code */ @@ -1298,10 +1298,10 @@ tuplesort_begin_index_gist(Relation heapRel, Relation indexRel, int workMem, SortCoordinate coordinate, - bool randomAccess) + int sortopt) { Tuplesortstate *state = tuplesort_begin_common(workMem, coordinate, - randomAccess); + sortopt); MemoryContext oldcontext; int i; @@ -1311,7 +1311,7 @@ tuplesort_begin_index_gist(Relation heapRel, if (trace_sort) elog(LOG, "begin index sort: workMem = %d, randomAccess = %c", - workMem, randomAccess ? 't' : 'f'); + workMem, sortopt & TUPLESORT_RANDOMACCESS ? 't' : 'f'); #endif state->nKeys = IndexRelationGetNumberOfKeyAttributes(indexRel); @@ -1354,10 +1354,10 @@ tuplesort_begin_index_gist(Relation heapRel, Tuplesortstate * tuplesort_begin_datum(Oid datumType, Oid sortOperator, Oid sortCollation, bool nullsFirstFlag, int workMem, - SortCoordinate coordinate, bool randomAccess) + SortCoordinate coordinate, int sortopt) { Tuplesortstate *state = tuplesort_begin_common(workMem, coordinate, - randomAccess); + sortopt); MemoryContext oldcontext; int16 typlen; bool typbyval; @@ -1368,7 +1368,7 @@ tuplesort_begin_datum(Oid datumType, Oid sortOperator, Oid sortCollation, if (trace_sort) elog(LOG, "begin datum sort: workMem = %d, randomAccess = %c", - workMem, randomAccess ? 't' : 'f'); + workMem, sortopt & TUPLESORT_RANDOMACCESS ? 't' : 'f'); #endif state->nKeys = 1; /* always a one-column sort */ @@ -1377,7 +1377,7 @@ tuplesort_begin_datum(Oid datumType, Oid sortOperator, Oid sortCollation, false, /* no unique check */ 1, workMem, - randomAccess, + sortopt & TUPLESORT_RANDOMACCESS, PARALLEL_SORT(state)); state->comparetup = comparetup_datum; @@ -2272,7 +2272,7 @@ tuplesort_gettuple_common(Tuplesortstate *state, bool forward, switch (state->status) { case TSS_SORTEDINMEM: - Assert(forward || state->randomAccess); + Assert(forward || state->sortopt & TUPLESORT_RANDOMACCESS); Assert(!state->slabAllocatorUsed); if (forward) { @@ -2316,7 +2316,7 @@ tuplesort_gettuple_common(Tuplesortstate *state, bool forward, break; case TSS_SORTEDONTAPE: - Assert(forward || state->randomAccess); + Assert(forward || state->sortopt & TUPLESORT_RANDOMACCESS); Assert(state->slabAllocatorUsed); /* @@ -3091,7 +3091,8 @@ mergeruns(Tuplesortstate *state) * sorted tape, we can stop at this point and do the final merge * on-the-fly. */ - if (!state->randomAccess && state->nInputRuns <= state->nInputTapes + if ((state->sortopt & TUPLESORT_RANDOMACCESS) == 0 + && state->nInputRuns <= state->nInputTapes && !WORKER(state)) { /* Tell logtape.c we won't be writing anymore */ @@ -3337,7 +3338,7 @@ tuplesort_rescan(Tuplesortstate *state) { MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext); - Assert(state->randomAccess); + Assert(state->sortopt & TUPLESORT_RANDOMACCESS); switch (state->status) { @@ -3370,7 +3371,7 @@ tuplesort_markpos(Tuplesortstate *state) { MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext); - Assert(state->randomAccess); + Assert(state->sortopt & TUPLESORT_RANDOMACCESS); switch (state->status) { @@ -3401,7 +3402,7 @@ tuplesort_restorepos(Tuplesortstate *state) { MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext); - Assert(state->randomAccess); + Assert(state->sortopt & TUPLESORT_RANDOMACCESS); switch (state->status) { @@ -3998,7 +3999,8 @@ writetup_heap(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup) LogicalTapeWrite(tape, (void *) &tuplen, sizeof(tuplen)); LogicalTapeWrite(tape, (void *) tupbody, tupbodylen); - if (state->randomAccess) /* need trailing length word? */ + if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length + * word? */ LogicalTapeWrite(tape, (void *) &tuplen, sizeof(tuplen)); if (!state->slabAllocatorUsed) @@ -4021,7 +4023,8 @@ readtup_heap(Tuplesortstate *state, SortTuple *stup, /* read in the tuple proper */ tuple->t_len = tuplen; LogicalTapeReadExact(tape, tupbody, tupbodylen); - if (state->randomAccess) /* need trailing length word? */ + if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length + * word? */ LogicalTapeReadExact(tape, &tuplen, sizeof(tuplen)); stup->tuple = (void *) tuple; /* set up first-column key value */ @@ -4233,7 +4236,8 @@ writetup_cluster(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup) LogicalTapeWrite(tape, &tuplen, sizeof(tuplen)); LogicalTapeWrite(tape, &tuple->t_self, sizeof(ItemPointerData)); LogicalTapeWrite(tape, tuple->t_data, tuple->t_len); - if (state->randomAccess) /* need trailing length word? */ + if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length + * word? */ LogicalTapeWrite(tape, &tuplen, sizeof(tuplen)); if (!state->slabAllocatorUsed) @@ -4259,7 +4263,8 @@ readtup_cluster(Tuplesortstate *state, SortTuple *stup, tuple->t_tableOid = InvalidOid; /* Read in the tuple body */ LogicalTapeReadExact(tape, tuple->t_data, tuple->t_len); - if (state->randomAccess) /* need trailing length word? */ + if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length + * word? */ LogicalTapeReadExact(tape, &tuplen, sizeof(tuplen)); stup->tuple = (void *) tuple; /* set up first-column key value, if it's a simple column */ @@ -4483,7 +4488,8 @@ writetup_index(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup) tuplen = IndexTupleSize(tuple) + sizeof(tuplen); LogicalTapeWrite(tape, (void *) &tuplen, sizeof(tuplen)); LogicalTapeWrite(tape, (void *) tuple, IndexTupleSize(tuple)); - if (state->randomAccess) /* need trailing length word? */ + if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length + * word? */ LogicalTapeWrite(tape, (void *) &tuplen, sizeof(tuplen)); if (!state->slabAllocatorUsed) @@ -4501,7 +4507,8 @@ readtup_index(Tuplesortstate *state, SortTuple *stup, IndexTuple tuple = (IndexTuple) readtup_alloc(state, tuplen); LogicalTapeReadExact(tape, tuple, tuplen); - if (state->randomAccess) /* need trailing length word? */ + if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length + * word? */ LogicalTapeReadExact(tape, &tuplen, sizeof(tuplen)); stup->tuple = (void *) tuple; /* set up first-column key value */ @@ -4571,7 +4578,8 @@ writetup_datum(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup) LogicalTapeWrite(tape, (void *) &writtenlen, sizeof(writtenlen)); LogicalTapeWrite(tape, waddr, tuplen); - if (state->randomAccess) /* need trailing length word? */ + if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length + * word? */ LogicalTapeWrite(tape, (void *) &writtenlen, sizeof(writtenlen)); if (!state->slabAllocatorUsed && stup->tuple) @@ -4611,7 +4619,8 @@ readtup_datum(Tuplesortstate *state, SortTuple *stup, stup->tuple = raddr; } - if (state->randomAccess) /* need trailing length word? */ + if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length + * word? */ LogicalTapeReadExact(tape, &tuplen, sizeof(tuplen)); } diff --git a/src/include/utils/tuplesort.h b/src/include/utils/tuplesort.h index da5ba59198..345f4ce802 100644 --- a/src/include/utils/tuplesort.h +++ b/src/include/utils/tuplesort.h @@ -86,6 +86,12 @@ typedef enum SORT_SPACE_TYPE_MEMORY } TuplesortSpaceType; +/* Bitwise option flags for tuple sorts */ +#define TUPLESORT_NONE 0 + +/* specifies whether non-sequential access to the sort result is required */ +#define TUPLESORT_RANDOMACCESS (1 << 0) + typedef struct TuplesortInstrumentation { TuplesortMethod sortMethod; /* sort algorithm used */ @@ -201,32 +207,33 @@ extern Tuplesortstate *tuplesort_begin_heap(TupleDesc tupDesc, Oid *sortOperators, Oid *sortCollations, bool *nullsFirstFlags, int workMem, SortCoordinate coordinate, - bool randomAccess); + int sortopt); extern Tuplesortstate *tuplesort_begin_cluster(TupleDesc tupDesc, Relation indexRel, int workMem, - SortCoordinate coordinate, bool randomAccess); + SortCoordinate coordinate, + int sortopt); extern Tuplesortstate *tuplesort_begin_index_btree(Relation heapRel, Relation indexRel, bool enforceUnique, bool uniqueNullsNotDistinct, int workMem, SortCoordinate coordinate, - bool randomAccess); + int sortopt); extern Tuplesortstate *tuplesort_begin_index_hash(Relation heapRel, Relation indexRel, uint32 high_mask, uint32 low_mask, uint32 max_buckets, int workMem, SortCoordinate coordinate, - bool randomAccess); + int sortopt); extern Tuplesortstate *tuplesort_begin_index_gist(Relation heapRel, Relation indexRel, int workMem, SortCoordinate coordinate, - bool randomAccess); + int sortopt); extern Tuplesortstate *tuplesort_begin_datum(Oid datumType, Oid sortOperator, Oid sortCollation, bool nullsFirstFlag, int workMem, SortCoordinate coordinate, - bool randomAccess); + int sortopt); extern void tuplesort_set_bound(Tuplesortstate *state, int64 bound); extern bool tuplesort_used_bound(Tuplesortstate *state); From 40af10b571bdabbab06839d090083c9f9c2091d2 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Mon, 4 Apr 2022 22:52:35 +1200 Subject: [PATCH 366/772] Use Generation memory contexts to store tuples in sorts The general usage pattern when we store tuples in tuplesort.c is that we store a series of tuples one by one then either perform a sort or spill them to disk. In the common case, there is no pfreeing of already stored tuples. For the common case since we do not individually pfree tuples, we have very little need for aset.c memory allocation behavior which maintains freelists and always rounds allocation sizes up to the next power of 2 size. Here we conditionally use generation.c contexts for storing tuples in tuplesort.c when the sort will never be bounded. Unfortunately, the memory context to store tuples is already created by the time any calls would be made to tuplesort_set_bound(), so here we add a new sort option that allows callers to specify if they're going to need a bounded sort or not. We'll use a standard aset.c allocator when this sort option is not set. Extension authors must ensure that the TUPLESORT_ALLOWBOUNDED flag is used when calling tuplesort_begin_* for any sorts that make a call to tuplesort_set_bound(). Author: David Rowley Reviewed-by: Andy Fan Discussion: https://postgr.es/m/CAApHDvoH4ASzsAOyHcxkuY01Qf++8JJ0paw+03dk+W25tQEcNQ@mail.gmail.com --- src/backend/executor/nodeIncrementalSort.c | 4 +++- src/backend/executor/nodeSort.c | 2 ++ src/backend/utils/sort/tuplesort.c | 20 ++++++++++++++++---- src/include/utils/tuplesort.h | 3 +++ 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/backend/executor/nodeIncrementalSort.c b/src/backend/executor/nodeIncrementalSort.c index 4f50bc845d..d1b97d46bc 100644 --- a/src/backend/executor/nodeIncrementalSort.c +++ b/src/backend/executor/nodeIncrementalSort.c @@ -315,7 +315,7 @@ switchToPresortedPrefixMode(PlanState *pstate) &(plannode->sort.nullsFirst[nPresortedCols]), work_mem, NULL, - TUPLESORT_NONE); + node->bounded ? TUPLESORT_ALLOWBOUNDED : TUPLESORT_NONE); node->prefixsort_state = prefixsort_state; } else @@ -616,6 +616,8 @@ ExecIncrementalSort(PlanState *pstate) plannode->sort.nullsFirst, work_mem, NULL, + node->bounded ? + TUPLESORT_ALLOWBOUNDED : TUPLESORT_NONE); node->fullsort_state = fullsort_state; } diff --git a/src/backend/executor/nodeSort.c b/src/backend/executor/nodeSort.c index a113d73795..3c28d60c3e 100644 --- a/src/backend/executor/nodeSort.c +++ b/src/backend/executor/nodeSort.c @@ -99,6 +99,8 @@ ExecSort(PlanState *pstate) if (node->randomAccess) tuplesortopts |= TUPLESORT_RANDOMACCESS; + if (node->bounded) + tuplesortopts |= TUPLESORT_ALLOWBOUNDED; if (node->datumSort) tuplesortstate = tuplesort_begin_datum(TupleDescAttr(tupDesc, 0)->atttypid, diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index a8a5cc5204..571fb95532 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -935,11 +935,21 @@ tuplesort_begin_batch(Tuplesortstate *state) * eases memory management. Resetting at key points reduces * fragmentation. Note that the memtuples array of SortTuples is allocated * in the parent context, not this context, because there is no need to - * free memtuples early. + * free memtuples early. For bounded sorts, tuples may be pfreed in any + * order, so we use a regular aset.c context so that it can make use of + * free'd memory. When the sort is not bounded, we make use of a + * generation.c context as this keeps allocations more compact with less + * wastage. Allocations are also slightly more CPU efficient. */ - state->tuplecontext = AllocSetContextCreate(state->sortcontext, - "Caller tuples", - ALLOCSET_DEFAULT_SIZES); + if (state->sortopt & TUPLESORT_ALLOWBOUNDED) + state->tuplecontext = AllocSetContextCreate(state->sortcontext, + "Caller tuples", + ALLOCSET_DEFAULT_SIZES); + else + state->tuplecontext = GenerationContextCreate(state->sortcontext, + "Caller tuples", + ALLOCSET_DEFAULT_SIZES); + state->status = TSS_INITIAL; state->bounded = false; @@ -1444,6 +1454,8 @@ tuplesort_set_bound(Tuplesortstate *state, int64 bound) { /* Assert we're called before loading any tuples */ Assert(state->status == TSS_INITIAL && state->memtupcount == 0); + /* Assert we allow bounded sorts */ + Assert(state->sortopt & TUPLESORT_ALLOWBOUNDED); /* Can't set the bound twice, either */ Assert(!state->bounded); /* Also, this shouldn't be called in a parallel worker */ diff --git a/src/include/utils/tuplesort.h b/src/include/utils/tuplesort.h index 345f4ce802..364cf132fc 100644 --- a/src/include/utils/tuplesort.h +++ b/src/include/utils/tuplesort.h @@ -92,6 +92,9 @@ typedef enum /* specifies whether non-sequential access to the sort result is required */ #define TUPLESORT_RANDOMACCESS (1 << 0) +/* specifies if the tuplesort is able to support bounded sorts */ +#define TUPLESORT_ALLOWBOUNDED (1 << 1) + typedef struct TuplesortInstrumentation { TuplesortMethod sortMethod; /* sort algorithm used */ From afb529e6772b4e2b065644a2204697eeaf6c9a96 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 4 Apr 2022 10:36:23 -0400 Subject: [PATCH 367/772] pg_basebackup: Fix code that thinks about LZ4 buffer size. Before this patch, there was some code that tried to make sure that the buffer was always big enough at the start, and then asserted that it didn't need to be enlarged later. However, the code to make sure it was big enough at the start doesn't actually work, and therefore it was possible to fail an assertion and crash later. Remove the code that tries to make sure the buffer is always big enough at the start in favor of enlarging the buffer as we go along whenever that is necessary. The mistake probably happened because, on the server side, we do actually need to guarantee that the buffer is big enough at the start to avoid subsequent resizings. However, in that case, the calling code makes promises about how much data it will provide at once, but here, that's not the case. Report by Justin Pryzby. Analysis by me. Patch by Dipesh Pandit. Discussion: http://postgr.es/m/20220330143536.GG28503@telsasoft.com --- src/bin/pg_basebackup/bbstreamer_lz4.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/bin/pg_basebackup/bbstreamer_lz4.c b/src/bin/pg_basebackup/bbstreamer_lz4.c index 67f841d96a..2ffe2241b4 100644 --- a/src/bin/pg_basebackup/bbstreamer_lz4.c +++ b/src/bin/pg_basebackup/bbstreamer_lz4.c @@ -73,7 +73,6 @@ bbstreamer_lz4_compressor_new(bbstreamer *next, bc_specification *compress) bbstreamer_lz4_frame *streamer; LZ4F_errorCode_t ctxError; LZ4F_preferences_t *prefs; - size_t compressed_bound; Assert(next != NULL); @@ -92,17 +91,6 @@ bbstreamer_lz4_compressor_new(bbstreamer *next, bc_specification *compress) if ((compress->options & BACKUP_COMPRESSION_OPTION_LEVEL) != 0) prefs->compressionLevel = compress->level; - /* - * Find out the compression bound, it specifies the minimum destination - * capacity required in worst case for the success of compression operation - * (LZ4F_compressUpdate) based on a given source size and preferences. - */ - compressed_bound = LZ4F_compressBound(streamer->base.bbs_buffer.maxlen, prefs); - - /* Enlarge buffer if it falls short of compression bound. */ - if (streamer->base.bbs_buffer.maxlen < compressed_bound) - enlargeStringInfo(&streamer->base.bbs_buffer, compressed_bound); - ctxError = LZ4F_createCompressionContext(&streamer->cctx, LZ4F_VERSION); if (LZ4F_isError(ctxError)) pg_log_error("could not create lz4 compression context: %s", @@ -170,7 +158,6 @@ bbstreamer_lz4_compressor_content(bbstreamer *streamer, * forward the content to next streamer and empty the buffer. */ out_bound = LZ4F_compressBound(len, &mystreamer->prefs); - Assert(mystreamer->base.bbs_buffer.maxlen >= out_bound); if (avail_out < out_bound) { bbstreamer_content(mystreamer->base.bbs_next, member, @@ -178,6 +165,10 @@ bbstreamer_lz4_compressor_content(bbstreamer *streamer, mystreamer->bytes_written, context); + /* Enlarge buffer if it falls short of out bound. */ + if (mystreamer->base.bbs_buffer.maxlen < out_bound) + enlargeStringInfo(&mystreamer->base.bbs_buffer, out_bound); + avail_out = mystreamer->base.bbs_buffer.maxlen; mystreamer->bytes_written = 0; next_out = (uint8 *) mystreamer->base.bbs_buffer.data; @@ -218,7 +209,6 @@ bbstreamer_lz4_compressor_finalize(bbstreamer *streamer) /* Find out the footer bound and update the output buffer. */ footer_bound = LZ4F_compressBound(0, &mystreamer->prefs); - Assert(mystreamer->base.bbs_buffer.maxlen >= footer_bound); if ((mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written) < footer_bound) { @@ -227,6 +217,10 @@ bbstreamer_lz4_compressor_finalize(bbstreamer *streamer) mystreamer->bytes_written, BBSTREAMER_UNKNOWN); + /* Enlarge buffer if it falls short of footer bound. */ + if (mystreamer->base.bbs_buffer.maxlen < footer_bound) + enlargeStringInfo(&mystreamer->base.bbs_buffer, footer_bound); + avail_out = mystreamer->base.bbs_buffer.maxlen; mystreamer->bytes_written = 0; next_out = (uint8 *) mystreamer->base.bbs_buffer.data; From 4eb9798879680dcc0e3ebb301cf6f925dfa69422 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Mon, 4 Apr 2022 10:12:30 -0400 Subject: [PATCH 368/772] Avoid freeing objects during json aggregate finalization Commit f4fb45d15c tried to free memory during aggregate finalization. This cause issues, particularly when used as a window function, so stop doing that. Per complaint by Jaime Casanova and diagnosis by Andres Freund Discussion: https://postgr.es/m/YkfeMNYRCGhySKyg@ahch-to --- src/backend/utils/adt/json.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c index 492796eb83..4cf01300d8 100644 --- a/src/backend/utils/adt/json.c +++ b/src/backend/utils/adt/json.c @@ -979,12 +979,6 @@ json_unique_check_init(JsonUniqueCheckState *cxt) HASH_ELEM | HASH_CONTEXT | HASH_FUNCTION | HASH_COMPARE); } -static void -json_unique_check_free(JsonUniqueCheckState *cxt) -{ - hash_destroy(*cxt); -} - static bool json_unique_check_key(JsonUniqueCheckState *cxt, const char *key, int object_id) { @@ -1009,12 +1003,10 @@ json_unique_builder_init(JsonUniqueBuilderState *cxt) } static void -json_unique_builder_free(JsonUniqueBuilderState *cxt) +json_unique_builder_clean(JsonUniqueBuilderState *cxt) { - json_unique_check_free(&cxt->check); - if (cxt->skipped_keys.data) - pfree(cxt->skipped_keys.data); + resetStringInfo(&cxt->skipped_keys); } /* On-demand initialization of skipped_keys StringInfo structure */ @@ -1224,7 +1216,7 @@ json_object_agg_finalfn(PG_FUNCTION_ARGS) if (state == NULL) PG_RETURN_NULL(); - json_unique_builder_free(&state->unique_check); + json_unique_builder_clean(&state->unique_check); /* Else return state with appropriate object terminator added */ PG_RETURN_TEXT_P(catenate_stringinfo_string(state->str, " }")); @@ -1333,7 +1325,7 @@ json_build_object_worker(int nargs, Datum *args, bool *nulls, Oid *types, appendStringInfoChar(result, '}'); if (unique_keys) - json_unique_builder_free(&unique_check); + json_unique_builder_clean(&unique_check); return PointerGetDatum(cstring_to_text_with_len(result->data, result->len)); } From cbf4177f2ca0b9bbfdb78a6ab51e3876e9ff6eac Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 4 Apr 2022 12:38:51 -0400 Subject: [PATCH 369/772] Disable synchronize_seqscans in 027_stream_regress.pl. This script runs the core regression tests with quite a small value of shared_buffers, making it prone to breakage due to synchronize_seqscans kicking in where the tests don't expect that. Disable that feature to stabilize the tests. Discussion: https://postgr.es/m/1258185.1648876239@sss.pgh.pa.us --- src/test/recovery/t/027_stream_regress.pl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/recovery/t/027_stream_regress.pl b/src/test/recovery/t/027_stream_regress.pl index aa972f8958..be9799c0a4 100644 --- a/src/test/recovery/t/027_stream_regress.pl +++ b/src/test/recovery/t/027_stream_regress.pl @@ -16,8 +16,14 @@ # Initialize primary node my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(allows_streaming => 1); + +# Increase some settings that Cluster->new makes too low by default. $node_primary->adjust_conf('postgresql.conf', 'max_connections', '25'); $node_primary->append_conf('postgresql.conf', 'max_prepared_transactions = 10'); +# We'll stick with Cluster->new's small default shared_buffers, but since that +# makes synchronized seqscans more probable, it risks changing the results of +# some test queries. Disable synchronized seqscans to prevent that. +$node_primary->append_conf('postgresql.conf', 'synchronize_seqscans = off'); # WAL consistency checking is resource intensive so require opt-in with the # PG_TEST_EXTRA environment variable. From 7844c9918a43b494adde3575891d217a37062378 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 4 Apr 2022 14:57:17 +0200 Subject: [PATCH 370/772] psql: Show all query results by default Previously, psql printed only the last result if a command string returned multiple result sets. Now it prints all of them. The previous behavior can be obtained by setting the psql variable SHOW_ALL_RESULTS to off. This is a significantly enhanced version of 3a5130672296ed4e682403a77a9a3ad3d21cef75 (that was later reverted). There is also much more test coverage for various psql features now. Author: Fabien COELHO Reviewed-by: Peter Eisentraut Reviewed-by: "Iwata, Aya" (earlier version) Reviewed-by: Daniel Verite (earlier version) Reviewed-by: Kyotaro Horiguchi (earlier version) Reviewed-by: vignesh C (earlier version) Discussion: https://www.postgresql.org/message-id/flat/alpine.DEB.2.21.1904132231510.8961@lancre --- .../expected/pg_stat_statements.out | 25 + doc/src/sgml/ref/psql-ref.sgml | 29 +- src/bin/psql/common.c | 524 ++++++++++-------- src/bin/psql/help.c | 2 + src/bin/psql/settings.h | 1 + src/bin/psql/startup.c | 10 + src/bin/psql/t/001_basic.pl | 2 +- src/bin/psql/tab-complete.c | 2 +- src/test/regress/expected/copyselect.out | 14 +- src/test/regress/expected/psql.out | 242 ++++++++ src/test/regress/expected/transactions.out | 58 +- src/test/regress/sql/copyselect.sql | 4 +- src/test/regress/sql/psql.sql | 141 +++++ src/test/regress/sql/transactions.sql | 2 +- 14 files changed, 801 insertions(+), 255 deletions(-) diff --git a/contrib/pg_stat_statements/expected/pg_stat_statements.out b/contrib/pg_stat_statements/expected/pg_stat_statements.out index e0abe34bb6..8f7f93172a 100644 --- a/contrib/pg_stat_statements/expected/pg_stat_statements.out +++ b/contrib/pg_stat_statements/expected/pg_stat_statements.out @@ -50,8 +50,28 @@ BEGIN \; SELECT 2.0 AS "float" \; SELECT 'world' AS "text" \; COMMIT; + float +------- + 2.0 +(1 row) + + text +------- + world +(1 row) + -- compound with empty statements and spurious leading spacing \;\; SELECT 3 + 3 \;\;\; SELECT ' ' || ' !' \;\; SELECT 1 + 4 \;; + ?column? +---------- + 6 +(1 row) + + ?column? +---------- + ! +(1 row) + ?column? ---------- 5 @@ -61,6 +81,11 @@ COMMIT; SELECT 1 + 1 + 1 AS "add" \gset SELECT :add + 1 + 1 AS "add" \; SELECT :add + 1 + 1 AS "add" \gset + add +----- + 5 +(1 row) + -- set operator SELECT 1 AS i UNION SELECT 2 ORDER BY i; i diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index caabb06c53..f01adb1fd2 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -127,18 +127,11 @@ echo '\x \\ SELECT * FROM foo;' | psql commands included in the string to divide it into multiple transactions. (See for more details about how the server handles multi-query strings.) - Also, psql only prints the - result of the last SQL command in the string. - This is different from the behavior when the same string is read from - a file or fed to psql's standard input, - because then psql sends - each SQL command separately. - Because of this behavior, putting more than one SQL command in a - single string often has unexpected results. - It's better to use repeated commands or feed - multiple commands to psql's standard input, + If having several commands executed in one transaction is not desired, + use repeated commands or feed multiple commands to + psql's standard input, either using echo as illustrated above, or via a shell here-document, for example: @@ -3570,10 +3563,6 @@ select 1\; select 2\; select 3; commands included in the string to divide it into multiple transactions. (See for more details about how the server handles multi-query strings.) - psql prints only the last query result - it receives for each request; in this example, although all - three SELECTs are indeed executed, psql - only prints the 3. @@ -4160,6 +4149,18 @@ bar + SHOW_ALL_RESULTS + + + When this variable is set to off, only the last + result of a combined query (\;) is shown instead of + all of them. The default is on. The off behavior + is for compatibility with older versions of psql. + + + + + SHOW_CONTEXT diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f6777bbfc4..5a707dab64 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -32,7 +32,8 @@ static bool DescribeQuery(const char *query, double *elapsed_msec); static bool ExecQueryUsingCursor(const char *query, double *elapsed_msec); -static bool ExecQueryAndProcessResult(const char *query, double *elapsed_msec, bool *svpt_gone_p); +static int ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_gone_p, + bool is_watch, const printQueryOpt *opt, FILE *printQueryFout); static bool command_no_begin(const char *query); static bool is_select_command(const char *query); @@ -355,7 +356,7 @@ CheckConnection(void) * Returns true for valid result, false for error state. */ static bool -AcceptResult(const PGresult *result) +AcceptResult(const PGresult *result, bool show_error) { bool OK; @@ -386,7 +387,7 @@ AcceptResult(const PGresult *result) break; } - if (!OK) + if (!OK && show_error) { const char *error = PQerrorMessage(pset.db); @@ -475,6 +476,19 @@ ClearOrSaveResult(PGresult *result) } +/* + * Consume all results + */ +static void +ClearOrSaveAllResults(void) +{ + PGresult *result; + + while ((result = PQgetResult(pset.db)) != NULL) + ClearOrSaveResult(result); +} + + /* * Print microtiming output. Always print raw milliseconds; if the interval * is >= 1 second, also break it down into days/hours/minutes/seconds. @@ -574,7 +588,7 @@ PSQLexec(const char *query) ResetCancelConn(); - if (!AcceptResult(res)) + if (!AcceptResult(res, true)) { ClearOrSaveResult(res); res = NULL; @@ -597,11 +611,8 @@ int PSQLexecWatch(const char *query, const printQueryOpt *opt, FILE *printQueryFout) { bool timing = pset.timing; - PGresult *res; double elapsed_msec = 0; - instr_time before; - instr_time after; - FILE *fout; + int res; if (!pset.db) { @@ -611,76 +622,15 @@ PSQLexecWatch(const char *query, const printQueryOpt *opt, FILE *printQueryFout) SetCancelConn(pset.db); - if (timing) - INSTR_TIME_SET_CURRENT(before); - - res = PQexec(pset.db, query); + res = ExecQueryAndProcessResults(query, &elapsed_msec, NULL, true, opt, printQueryFout); ResetCancelConn(); - if (!AcceptResult(res)) - { - ClearOrSaveResult(res); - return 0; - } - - if (timing) - { - INSTR_TIME_SET_CURRENT(after); - INSTR_TIME_SUBTRACT(after, before); - elapsed_msec = INSTR_TIME_GET_MILLISEC(after); - } - - /* - * If SIGINT is sent while the query is processing, the interrupt will be - * consumed. The user's intention, though, is to cancel the entire watch - * process, so detect a sent cancellation request and exit in this case. - */ - if (cancel_pressed) - { - PQclear(res); - return 0; - } - - fout = printQueryFout ? printQueryFout : pset.queryFout; - - switch (PQresultStatus(res)) - { - case PGRES_TUPLES_OK: - printQuery(res, opt, fout, false, pset.logfile); - break; - - case PGRES_COMMAND_OK: - fprintf(fout, "%s\n%s\n\n", opt->title, PQcmdStatus(res)); - break; - - case PGRES_EMPTY_QUERY: - pg_log_error("\\watch cannot be used with an empty query"); - PQclear(res); - return -1; - - case PGRES_COPY_OUT: - case PGRES_COPY_IN: - case PGRES_COPY_BOTH: - pg_log_error("\\watch cannot be used with COPY"); - PQclear(res); - return -1; - - default: - pg_log_error("unexpected result status for \\watch"); - PQclear(res); - return -1; - } - - PQclear(res); - - fflush(fout); - /* Possible microtiming output */ if (timing) PrintTiming(elapsed_msec); - return 1; + return res; } @@ -715,7 +665,7 @@ PrintNotifications(void) * Returns true if successful, false otherwise. */ static bool -PrintQueryTuples(const PGresult *result) +PrintQueryTuples(const PGresult *result, const printQueryOpt *opt, FILE *printQueryFout) { bool ok = true; @@ -747,8 +697,9 @@ PrintQueryTuples(const PGresult *result) } else { - printQuery(result, &pset.popt, pset.queryFout, false, pset.logfile); - if (ferror(pset.queryFout)) + FILE *fout = printQueryFout ? printQueryFout : pset.queryFout; + printQuery(result, opt ? opt : &pset.popt, fout, false, pset.logfile); + if (ferror(fout)) { pg_log_error("could not print result table: %m"); ok = false; @@ -1001,123 +952,27 @@ HandleCopyResult(PGresult **resultp) return success; } - -/* - * ProcessResult: utility function for use by SendQuery() only - * - * When our command string contained a COPY FROM STDIN or COPY TO STDOUT, - * PQexec() has stopped at the PGresult associated with the first such - * command. In that event, we'll marshal data for the COPY and then cycle - * through any subsequent PGresult objects. - * - * When the command string contained no such COPY command, this function - * degenerates to an AcceptResult() call. - * - * Changes its argument to point to the last PGresult of the command string, - * or NULL if that result was for a COPY TO STDOUT. (Returning NULL prevents - * the command status from being printed, which we want in that case so that - * the status line doesn't get taken as part of the COPY data.) - * - * Returns true on complete success, false otherwise. Possible failure modes - * include purely client-side problems; check the transaction status for the - * server-side opinion. - */ -static bool -ProcessResult(PGresult **resultp) -{ - bool success = true; - bool first_cycle = true; - - for (;;) - { - ExecStatusType result_status; - bool is_copy; - PGresult *next_result; - - if (!AcceptResult(*resultp)) - { - /* - * Failure at this point is always a server-side failure or a - * failure to submit the command string. Either way, we're - * finished with this command string. - */ - success = false; - break; - } - - result_status = PQresultStatus(*resultp); - switch (result_status) - { - case PGRES_EMPTY_QUERY: - case PGRES_COMMAND_OK: - case PGRES_TUPLES_OK: - is_copy = false; - break; - - case PGRES_COPY_OUT: - case PGRES_COPY_IN: - is_copy = true; - break; - - default: - /* AcceptResult() should have caught anything else. */ - is_copy = false; - pg_log_error("unexpected PQresultStatus: %d", result_status); - break; - } - - if (is_copy) - success = HandleCopyResult(resultp); - else if (first_cycle) - { - /* fast path: no COPY commands; PQexec visited all results */ - break; - } - - /* - * Check PQgetResult() again. In the typical case of a single-command - * string, it will return NULL. Otherwise, we'll have other results - * to process that may include other COPYs. We keep the last result. - */ - next_result = PQgetResult(pset.db); - if (!next_result) - break; - - PQclear(*resultp); - *resultp = next_result; - first_cycle = false; - } - - SetResultVariables(*resultp, success); - - /* may need this to recover from conn loss during COPY */ - if (!first_cycle && !CheckConnection()) - return false; - - return success; -} - - /* * PrintQueryStatus: report command status as required * * Note: Utility function for use by PrintQueryResult() only. */ static void -PrintQueryStatus(PGresult *result) +PrintQueryStatus(PGresult *result, FILE *printQueryFout) { char buf[16]; + FILE *fout = printQueryFout ? printQueryFout : pset.queryFout; if (!pset.quiet) { if (pset.popt.topt.format == PRINT_HTML) { - fputs("

", pset.queryFout); - html_escaped_print(PQcmdStatus(result), pset.queryFout); - fputs("

\n", pset.queryFout); + fputs("

", fout); + html_escaped_print(PQcmdStatus(result), fout); + fputs("

\n", fout); } else - fprintf(pset.queryFout, "%s\n", PQcmdStatus(result)); + fprintf(fout, "%s\n", PQcmdStatus(result)); } if (pset.logfile) @@ -1136,7 +991,7 @@ PrintQueryStatus(PGresult *result) * Returns true if the query executed successfully, false otherwise. */ static bool -PrintQueryResult(PGresult *result) +PrintQueryResult(PGresult *result, bool last, bool is_watch, const printQueryOpt *opt, FILE *printQueryFout) { bool success; const char *cmdstatus; @@ -1148,24 +1003,32 @@ PrintQueryResult(PGresult *result) { case PGRES_TUPLES_OK: /* store or execute or print the data ... */ - if (pset.gset_prefix) + if (last && pset.gset_prefix) success = StoreQueryTuple(result); - else if (pset.gexec_flag) + else if (last && pset.gexec_flag) success = ExecQueryTuples(result); - else if (pset.crosstab_flag) + else if (last && pset.crosstab_flag) success = PrintResultInCrosstab(result); + else if (last || pset.show_all_results) + success = PrintQueryTuples(result, opt, printQueryFout); else - success = PrintQueryTuples(result); + success = true; + /* if it's INSERT/UPDATE/DELETE RETURNING, also print status */ - cmdstatus = PQcmdStatus(result); - if (strncmp(cmdstatus, "INSERT", 6) == 0 || - strncmp(cmdstatus, "UPDATE", 6) == 0 || - strncmp(cmdstatus, "DELETE", 6) == 0) - PrintQueryStatus(result); + if (last || pset.show_all_results) + { + cmdstatus = PQcmdStatus(result); + if (strncmp(cmdstatus, "INSERT", 6) == 0 || + strncmp(cmdstatus, "UPDATE", 6) == 0 || + strncmp(cmdstatus, "DELETE", 6) == 0) + PrintQueryStatus(result, printQueryFout); + } + break; case PGRES_COMMAND_OK: - PrintQueryStatus(result); + if (last || pset.show_all_results) + PrintQueryStatus(result, printQueryFout); success = true; break; @@ -1175,7 +1038,7 @@ PrintQueryResult(PGresult *result) case PGRES_COPY_OUT: case PGRES_COPY_IN: - /* nothing to do here */ + /* nothing to do here: already processed */ success = true; break; @@ -1192,11 +1055,46 @@ PrintQueryResult(PGresult *result) break; } - fflush(pset.queryFout); + fflush(printQueryFout ? printQueryFout : pset.queryFout); return success; } +/* + * Data structure and functions to record notices while they are + * emitted, so that they can be shown later. + * + * We need to know which result is last, which requires to extract + * one result in advance, hence two buffers are needed. + */ +struct t_notice_messages +{ + PQExpBufferData messages[2]; + int current; +}; + +/* + * Store notices in appropriate buffer, for later display. + */ +static void +AppendNoticeMessage(void *arg, const char *msg) +{ + struct t_notice_messages *notices = arg; + appendPQExpBufferStr(¬ices->messages[notices->current], msg); +} + +/* + * Show notices stored in buffer, which is then reset. + */ +static void +ShowNoticeMessage(struct t_notice_messages *notices) +{ + PQExpBufferData *current = ¬ices->messages[notices->current]; + if (*current->data != '\0') + pg_log_info("%s", current->data); + resetPQExpBuffer(current); +} + /* * SendQuery: send the query string to the backend @@ -1273,7 +1171,6 @@ SendQuery(const char *query) { pg_log_info("%s", PQerrorMessage(pset.db)); ClearOrSaveResult(result); - ResetCancelConn(); goto sendquery_cleanup; } ClearOrSaveResult(result); @@ -1292,7 +1189,6 @@ SendQuery(const char *query) { pg_log_info("%s", PQerrorMessage(pset.db)); ClearOrSaveResult(result); - ResetCancelConn(); goto sendquery_cleanup; } ClearOrSaveResult(result); @@ -1303,19 +1199,17 @@ SendQuery(const char *query) { /* Describe query's result columns, without executing it */ OK = DescribeQuery(query, &elapsed_msec); - ResetCancelConn(); } else if (pset.fetch_count <= 0 || pset.gexec_flag || pset.crosstab_flag || !is_select_command(query)) { /* Default fetch-it-all-and-print mode */ - OK = ExecQueryAndProcessResult(query, &elapsed_msec, &svpt_gone); + OK = (ExecQueryAndProcessResults(query, &elapsed_msec, &svpt_gone, false, NULL, NULL) >= 0); } else { /* Fetch-in-segments mode */ OK = ExecQueryUsingCursor(query, &elapsed_msec); - ResetCancelConn(); } if (!OK && pset.echo == PSQL_ECHO_ERRORS) @@ -1370,7 +1264,6 @@ SendQuery(const char *query) ClearOrSaveResult(svptres); OK = false; - ResetCancelConn(); goto sendquery_cleanup; } PQclear(svptres); @@ -1399,6 +1292,9 @@ SendQuery(const char *query) sendquery_cleanup: + /* global cancellation reset */ + ResetCancelConn(); + /* reset \g's output-to-filename trigger */ if (pset.gfname) { @@ -1479,7 +1375,7 @@ DescribeQuery(const char *query, double *elapsed_msec) PQclear(result); result = PQdescribePrepared(pset.db, ""); - OK = AcceptResult(result) && + OK = AcceptResult(result, true) && (PQresultStatus(result) == PGRES_COMMAND_OK); if (OK && result) { @@ -1527,7 +1423,7 @@ DescribeQuery(const char *query, double *elapsed_msec) PQclear(result); result = PQexec(pset.db, buf.data); - OK = AcceptResult(result); + OK = AcceptResult(result, true); if (timing) { @@ -1537,7 +1433,7 @@ DescribeQuery(const char *query, double *elapsed_msec) } if (OK && result) - OK = PrintQueryResult(result); + OK = PrintQueryResult(result, true, false, NULL, NULL); termPQExpBuffer(&buf); } @@ -1554,56 +1450,218 @@ DescribeQuery(const char *query, double *elapsed_msec) /* - * ExecQueryAndProcessResults: SendQuery() subroutine for the normal way to - * send a query + * ExecQueryAndProcessResults: utility function for use by SendQuery() + * and PSQLexecWatch(). + * + * Sends query and cycles through PGresult objects. + * + * When not under \watch and if our command string contained a COPY FROM STDIN + * or COPY TO STDOUT, the PGresult associated with these commands must be + * processed by providing an input or output stream. In that event, we'll + * marshal data for the COPY. + * + * For other commands, the results are processed normally, depending on their + * status. + * + * Returns 1 on complete success, 0 on interrupt and -1 or errors. Possible + * failure modes include purely client-side problems; check the transaction + * status for the server-side opinion. + * + * Note that on a combined query, failure does not mean that nothing was + * committed. */ -static bool -ExecQueryAndProcessResult(const char *query, double *elapsed_msec, bool *svpt_gone_p) +static int +ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_gone_p, + bool is_watch, const printQueryOpt *opt, FILE *printQueryFout) { bool timing = pset.timing; - bool OK; + bool success; instr_time before, after; PGresult *result; + struct t_notice_messages notices; if (timing) INSTR_TIME_SET_CURRENT(before); - result = PQexec(pset.db, query); - - /* these operations are included in the timing result: */ - ResetCancelConn(); - OK = ProcessResult(&result); + success = PQsendQuery(pset.db, query); - if (timing) + if (!success) { - INSTR_TIME_SET_CURRENT(after); - INSTR_TIME_SUBTRACT(after, before); - *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); - } + const char *error = PQerrorMessage(pset.db); - /* but printing result isn't: */ - if (OK && result) - OK = PrintQueryResult(result); + if (strlen(error)) + pg_log_info("%s", error); + + CheckConnection(); + + return -1; + } /* - * Check if the user ran any command that would destroy our internal - * savepoint: If the user did COMMIT AND CHAIN, RELEASE or ROLLBACK, our - * savepoint is gone. If they issued a SAVEPOINT, releasing ours would - * remove theirs. + * If SIGINT is sent while the query is processing, the interrupt will be + * consumed. The user's intention, though, is to cancel the entire watch + * process, so detect a sent cancellation request and exit in this case. */ - if (result && svpt_gone_p) + if (is_watch && cancel_pressed) { - const char *cmd = PQcmdStatus(result); - *svpt_gone_p = (strcmp(cmd, "COMMIT") == 0 || - strcmp(cmd, "SAVEPOINT") == 0 || - strcmp(cmd, "RELEASE") == 0 || - strcmp(cmd, "ROLLBACK") == 0); + ClearOrSaveAllResults(); + return 0; } - ClearOrSaveResult(result); + /* intercept notices */ + notices.current = 0; + initPQExpBuffer(¬ices.messages[0]); + initPQExpBuffer(¬ices.messages[1]); + PQsetNoticeProcessor(pset.db, AppendNoticeMessage, ¬ices); - return OK; + /* first result */ + result = PQgetResult(pset.db); + + while (result != NULL) + { + ExecStatusType result_status; + PGresult *next_result; + bool last; + + if (!AcceptResult(result, false)) + { + /* + * Some error occured, either a server-side failure or + * a failure to submit the command string. Record that. + */ + const char *error = PQresultErrorMessage(result); + + ShowNoticeMessage(¬ices); + if (strlen(error)) + pg_log_info("%s", error); + + CheckConnection(); + if (!is_watch) + SetResultVariables(result, false); + + /* keep the result status before clearing it */ + result_status = PQresultStatus(result); + ClearOrSaveResult(result); + success = false; + + /* + * switch to next result + */ + if (result_status == PGRES_COPY_BOTH || + result_status == PGRES_COPY_OUT || + result_status == PGRES_COPY_IN) + /* + * For some obscure reason PQgetResult does *not* return a NULL in copy + * cases despite the result having been cleared, but keeps returning an + * "empty" result that we have to ignore manually. + */ + result = NULL; + else + result = PQgetResult(pset.db); + + continue; + } + else if (svpt_gone_p && !*svpt_gone_p) + { + /* + * Check if the user ran any command that would destroy our internal + * savepoint: If the user did COMMIT AND CHAIN, RELEASE or ROLLBACK, our + * savepoint is gone. If they issued a SAVEPOINT, releasing ours would + * remove theirs. + */ + const char *cmd = PQcmdStatus(result); + *svpt_gone_p = (strcmp(cmd, "COMMIT") == 0 || + strcmp(cmd, "SAVEPOINT") == 0 || + strcmp(cmd, "RELEASE") == 0 || + strcmp(cmd, "ROLLBACK") == 0); + } + + result_status = PQresultStatus(result); + + /* must handle COPY before changing the current result */ + Assert(result_status != PGRES_COPY_BOTH); + if (result_status == PGRES_COPY_IN || + result_status == PGRES_COPY_OUT) + { + ShowNoticeMessage(¬ices); + + if (is_watch) + { + ClearOrSaveAllResults(); + pg_log_error("\\watch cannot be used with COPY"); + return -1; + } + + /* use normal notice processor during COPY */ + PQsetNoticeProcessor(pset.db, NoticeProcessor, NULL); + + success &= HandleCopyResult(&result); + + PQsetNoticeProcessor(pset.db, AppendNoticeMessage, ¬ices); + } + + /* + * Check PQgetResult() again. In the typical case of a single-command + * string, it will return NULL. Otherwise, we'll have other results + * to process. We need to do that to check whether this is the last. + */ + notices.current ^= 1; + next_result = PQgetResult(pset.db); + notices.current ^= 1; + last = (next_result == NULL); + + /* + * Get timing measure before printing the last result. + * + * It will include the display of previous results, if any. + * This cannot be helped because the server goes on processing + * further queries anyway while the previous ones are being displayed. + * The parallel execution of the client display hides the server time + * when it is shorter. + * + * With combined queries, timing must be understood as an upper bound + * of the time spent processing them. + */ + if (last && timing) + { + INSTR_TIME_SET_CURRENT(after); + INSTR_TIME_SUBTRACT(after, before); + *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); + } + + /* notices already shown above for copy */ + ShowNoticeMessage(¬ices); + + /* this may or may not print something depending on settings */ + if (result != NULL) + success &= PrintQueryResult(result, last, false, opt, printQueryFout); + + /* set variables on last result if all went well */ + if (!is_watch && last && success) + SetResultVariables(result, true); + + ClearOrSaveResult(result); + notices.current ^= 1; + result = next_result; + + if (cancel_pressed) + { + ClearOrSaveAllResults(); + break; + } + } + + /* reset notice hook */ + PQsetNoticeProcessor(pset.db, NoticeProcessor, NULL); + termPQExpBuffer(¬ices.messages[0]); + termPQExpBuffer(¬ices.messages[1]); + + /* may need this to recover from conn loss during COPY */ + if (!CheckConnection()) + return -1; + + return cancel_pressed ? 0 : success ? 1 : -1; } @@ -1651,7 +1709,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) { result = PQexec(pset.db, "BEGIN"); - OK = AcceptResult(result) && + OK = AcceptResult(result, true) && (PQresultStatus(result) == PGRES_COMMAND_OK); ClearOrSaveResult(result); if (!OK) @@ -1665,7 +1723,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) query); result = PQexec(pset.db, buf.data); - OK = AcceptResult(result) && + OK = AcceptResult(result, true) && (PQresultStatus(result) == PGRES_COMMAND_OK); if (!OK) SetResultVariables(result, OK); @@ -1738,7 +1796,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) is_pager = false; } - OK = AcceptResult(result); + OK = AcceptResult(result, true); Assert(!OK); SetResultVariables(result, OK); ClearOrSaveResult(result); @@ -1847,7 +1905,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) result = PQexec(pset.db, "CLOSE _psql_cursor"); if (OK) { - OK = AcceptResult(result) && + OK = AcceptResult(result, true) && (PQresultStatus(result) == PGRES_COMMAND_OK); ClearOrSaveResult(result); } @@ -1857,7 +1915,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (started_txn) { result = PQexec(pset.db, OK ? "COMMIT" : "ROLLBACK"); - OK &= AcceptResult(result) && + OK &= AcceptResult(result, true) && (PQresultStatus(result) == PGRES_COMMAND_OK); ClearOrSaveResult(result); } diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index 56afa6817e..b3971bce64 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -413,6 +413,8 @@ helpVariables(unsigned short int pager) fprintf(output, _(" SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" " server's version (in short string or numeric format)\n")); + fprintf(output, _(" SHOW_ALL_RESULTS\n" + " show all results of a combined query (\\;) instead of only the last\n")); fprintf(output, _(" SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n")); fprintf(output, _(" SINGLELINE\n" diff --git a/src/bin/psql/settings.h b/src/bin/psql/settings.h index 80dbea9efd..2399cffa3f 100644 --- a/src/bin/psql/settings.h +++ b/src/bin/psql/settings.h @@ -148,6 +148,7 @@ typedef struct _psqlSettings const char *prompt2; const char *prompt3; PGVerbosity verbosity; /* current error verbosity level */ + bool show_all_results; PGContextVisibility show_context; /* current context display level */ } PsqlSettings; diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c index be9dec749d..d08b15886a 100644 --- a/src/bin/psql/startup.c +++ b/src/bin/psql/startup.c @@ -203,6 +203,7 @@ main(int argc, char *argv[]) SetVariable(pset.vars, "PROMPT1", DEFAULT_PROMPT1); SetVariable(pset.vars, "PROMPT2", DEFAULT_PROMPT2); SetVariable(pset.vars, "PROMPT3", DEFAULT_PROMPT3); + SetVariableBool(pset.vars, "SHOW_ALL_RESULTS"); parse_psql_options(argc, argv, &options); @@ -1150,6 +1151,12 @@ verbosity_hook(const char *newval) return true; } +static bool +show_all_results_hook(const char *newval) +{ + return ParseVariableBool(newval, "SHOW_ALL_RESULTS", &pset.show_all_results); +} + static char * show_context_substitute_hook(char *newval) { @@ -1251,6 +1258,9 @@ EstablishVariableSpace(void) SetVariableHooks(pset.vars, "VERBOSITY", verbosity_substitute_hook, verbosity_hook); + SetVariableHooks(pset.vars, "SHOW_ALL_RESULTS", + bool_substitute_hook, + show_all_results_hook); SetVariableHooks(pset.vars, "SHOW_CONTEXT", show_context_substitute_hook, show_context_hook); diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl index 66796f4978..8ecb9b2583 100644 --- a/src/bin/psql/t/001_basic.pl +++ b/src/bin/psql/t/001_basic.pl @@ -126,7 +126,7 @@ sub psql_fails_like like($out, qr/before/, 'server crash: output before crash'); ok($out !~ qr/AFTER/, 'server crash: no output after crash'); is($err, 'psql::2: FATAL: terminating connection due to administrator command -server closed the connection unexpectedly +psql::2: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. psql::2: fatal: connection to server was lost', diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 6f040674a2..645d46ab75 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -4628,7 +4628,7 @@ psql_completion(const char *text, int start, int end) matches = complete_from_variables(text, "", "", false); else if (TailMatchesCS("\\set", MatchAny)) { - if (TailMatchesCS("AUTOCOMMIT|ON_ERROR_STOP|QUIET|" + if (TailMatchesCS("AUTOCOMMIT|ON_ERROR_STOP|QUIET|SHOW_ALL_RESULTS|" "SINGLELINE|SINGLESTEP")) COMPLETE_WITH_CS("on", "off"); else if (TailMatchesCS("COMP_KEYWORD_CASE")) diff --git a/src/test/regress/expected/copyselect.out b/src/test/regress/expected/copyselect.out index 72865fe1eb..bb9e026f91 100644 --- a/src/test/regress/expected/copyselect.out +++ b/src/test/regress/expected/copyselect.out @@ -126,7 +126,7 @@ copy (select 1) to stdout\; select 1/0; -- row, then error ERROR: division by zero select 1/0\; copy (select 1) to stdout; -- error only ERROR: division by zero -copy (select 1) to stdout\; copy (select 2) to stdout\; select 0\; select 3; -- 1 2 3 +copy (select 1) to stdout\; copy (select 2) to stdout\; select 3\; select 4; -- 1 2 3 4 1 2 ?column? @@ -134,8 +134,18 @@ copy (select 1) to stdout\; copy (select 2) to stdout\; select 0\; select 3; -- 3 (1 row) + ?column? +---------- + 4 +(1 row) + create table test3 (c int); -select 0\; copy test3 from stdin\; copy test3 from stdin\; select 1; -- 1 +select 0\; copy test3 from stdin\; copy test3 from stdin\; select 1; -- 0 1 + ?column? +---------- + 0 +(1 row) + ?column? ---------- 1 diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out index 6428ebc507..185c505312 100644 --- a/src/test/regress/expected/psql.out +++ b/src/test/regress/expected/psql.out @@ -5290,3 +5290,245 @@ ERROR: relation "notexists" does not exist LINE 1: SELECT * FROM notexists; ^ STATEMENT: SELECT * FROM notexists; +-- +-- combined queries +-- +CREATE FUNCTION warn(msg TEXT) RETURNS BOOLEAN LANGUAGE plpgsql +AS $$ + BEGIN RAISE NOTICE 'warn %', msg ; RETURN TRUE ; END +$$; +-- show both +SELECT 1 AS one \; SELECT warn('1.5') \; SELECT 2 AS two ; + one +----- + 1 +(1 row) + +NOTICE: warn 1.5 +CONTEXT: PL/pgSQL function warn(text) line 2 at RAISE + warn +------ + t +(1 row) + + two +----- + 2 +(1 row) + +-- \gset applies to last query only +SELECT 3 AS three \; SELECT warn('3.5') \; SELECT 4 AS four \gset + three +------- + 3 +(1 row) + +NOTICE: warn 3.5 +CONTEXT: PL/pgSQL function warn(text) line 2 at RAISE + warn +------ + t +(1 row) + +\echo :three :four +:three 4 +-- syntax error stops all processing +SELECT 5 \; SELECT 6 + \; SELECT warn('6.5') \; SELECT 7 ; +ERROR: syntax error at or near ";" +LINE 1: SELECT 5 ; SELECT 6 + ; SELECT warn('6.5') ; SELECT 7 ; + ^ +-- with aborted transaction, stop on first error +BEGIN \; SELECT 8 AS eight \; SELECT 9/0 AS nine \; ROLLBACK \; SELECT 10 AS ten ; + eight +------- + 8 +(1 row) + +ERROR: division by zero +-- close previously aborted transaction +ROLLBACK; +-- miscellaneous SQL commands +-- (non SELECT output is sent to stderr, thus is not shown in expected results) +SELECT 'ok' AS "begin" \; +CREATE TABLE psql_comics(s TEXT) \; +INSERT INTO psql_comics VALUES ('Calvin'), ('hobbes') \; +COPY psql_comics FROM STDIN \; +UPDATE psql_comics SET s = 'Hobbes' WHERE s = 'hobbes' \; +DELETE FROM psql_comics WHERE s = 'Moe' \; +COPY psql_comics TO STDOUT \; +TRUNCATE psql_comics \; +DROP TABLE psql_comics \; +SELECT 'ok' AS "done" ; + begin +------- + ok +(1 row) + +Calvin +Susie +Hobbes + done +------ + ok +(1 row) + +\set SHOW_ALL_RESULTS off +SELECT 1 AS one \; SELECT warn('1.5') \; SELECT 2 AS two ; +NOTICE: warn 1.5 +CONTEXT: PL/pgSQL function warn(text) line 2 at RAISE + two +----- + 2 +(1 row) + +\set SHOW_ALL_RESULTS on +DROP FUNCTION warn(TEXT); +-- +-- AUTOCOMMIT and combined queries +-- +\set AUTOCOMMIT off +\echo '# AUTOCOMMIT:' :AUTOCOMMIT +# AUTOCOMMIT: off +-- BEGIN is now implicit +CREATE TABLE foo(s TEXT) \; +ROLLBACK; +CREATE TABLE foo(s TEXT) \; +INSERT INTO foo(s) VALUES ('hello'), ('world') \; +COMMIT; +DROP TABLE foo \; +ROLLBACK; +-- table foo is still there +SELECT * FROM foo ORDER BY 1 \; +DROP TABLE foo \; +COMMIT; + s +------- + hello + world +(2 rows) + +\set AUTOCOMMIT on +\echo '# AUTOCOMMIT:' :AUTOCOMMIT +# AUTOCOMMIT: on +-- BEGIN now explicit for multi-statement transactions +BEGIN \; +CREATE TABLE foo(s TEXT) \; +INSERT INTO foo(s) VALUES ('hello'), ('world') \; +COMMIT; +BEGIN \; +DROP TABLE foo \; +ROLLBACK \; +-- implicit transactions +SELECT * FROM foo ORDER BY 1 \; +DROP TABLE foo; + s +------- + hello + world +(2 rows) + +-- +-- test ON_ERROR_ROLLBACK and combined queries +-- +CREATE FUNCTION psql_error(msg TEXT) RETURNS BOOLEAN AS $$ + BEGIN + RAISE EXCEPTION 'error %', msg; + END; +$$ LANGUAGE plpgsql; +\set ON_ERROR_ROLLBACK on +\echo '# ON_ERROR_ROLLBACK:' :ON_ERROR_ROLLBACK +# ON_ERROR_ROLLBACK: on +\echo '# AUTOCOMMIT:' :AUTOCOMMIT +# AUTOCOMMIT: on +BEGIN; +CREATE TABLE bla(s NO_SUCH_TYPE); -- fails +ERROR: type "no_such_type" does not exist +LINE 1: CREATE TABLE bla(s NO_SUCH_TYPE); + ^ +CREATE TABLE bla(s TEXT); -- succeeds +SELECT psql_error('oops!'); -- fails +ERROR: error oops! +CONTEXT: PL/pgSQL function psql_error(text) line 3 at RAISE +INSERT INTO bla VALUES ('Calvin'), ('Hobbes'); +COMMIT; +SELECT * FROM bla ORDER BY 1; + s +-------- + Calvin + Hobbes +(2 rows) + +BEGIN; +INSERT INTO bla VALUES ('Susie'); -- succeeds +-- now with combined queries +INSERT INTO bla VALUES ('Rosalyn') \; -- will rollback +SELECT 'before error' AS show \; -- will show nevertheless! + SELECT psql_error('boum!') \; -- failure + SELECT 'after error' AS noshow; -- hidden by preceeding error + show +-------------- + before error +(1 row) + +ERROR: error boum! +CONTEXT: PL/pgSQL function psql_error(text) line 3 at RAISE +INSERT INTO bla(s) VALUES ('Moe') \; -- will rollback + SELECT psql_error('bam!'); +ERROR: error bam! +CONTEXT: PL/pgSQL function psql_error(text) line 3 at RAISE +INSERT INTO bla VALUES ('Miss Wormwood'); -- succeeds +COMMIT; +SELECT * FROM bla ORDER BY 1; + s +--------------- + Calvin + Hobbes + Miss Wormwood + Susie +(4 rows) + +-- some with autocommit off +\set AUTOCOMMIT off +\echo '# AUTOCOMMIT:' :AUTOCOMMIT +# AUTOCOMMIT: off +-- implicit BEGIN +INSERT INTO bla VALUES ('Dad'); -- succeeds +SELECT psql_error('bad!'); -- implicit partial rollback +ERROR: error bad! +CONTEXT: PL/pgSQL function psql_error(text) line 3 at RAISE +INSERT INTO bla VALUES ('Mum') \; -- will rollback +SELECT COUNT(*) AS "#mum" +FROM bla WHERE s = 'Mum' \; -- but be counted here +SELECT psql_error('bad!'); -- implicit partial rollback + #mum +------ + 1 +(1 row) + +ERROR: error bad! +CONTEXT: PL/pgSQL function psql_error(text) line 3 at RAISE +COMMIT; +SELECT COUNT(*) AS "#mum" +FROM bla WHERE s = 'Mum' \; -- no mum here +SELECT * FROM bla ORDER BY 1; + #mum +------ + 0 +(1 row) + + s +--------------- + Calvin + Dad + Hobbes + Miss Wormwood + Susie +(5 rows) + +-- reset all +\set AUTOCOMMIT on +\set ON_ERROR_ROLLBACK off +\echo '# final ON_ERROR_ROLLBACK:' :ON_ERROR_ROLLBACK +# final ON_ERROR_ROLLBACK: off +DROP TABLE bla; +DROP FUNCTION psql_error; diff --git a/src/test/regress/expected/transactions.out b/src/test/regress/expected/transactions.out index 599d511a67..a46fa5d48a 100644 --- a/src/test/regress/expected/transactions.out +++ b/src/test/regress/expected/transactions.out @@ -904,8 +904,18 @@ DROP TABLE abc; -- tests rely on the fact that psql will not break SQL commands apart at a -- backslash-quoted semicolon, but will send them as one Query. create temp table i_table (f1 int); --- psql will show only the last result in a multi-statement Query +-- psql will show all results of a multi-statement Query SELECT 1\; SELECT 2\; SELECT 3; + ?column? +---------- + 1 +(1 row) + + ?column? +---------- + 2 +(1 row) + ?column? ---------- 3 @@ -920,6 +930,12 @@ insert into i_table values(1)\; select * from i_table; -- 1/0 error will cause rolling back the whole implicit transaction insert into i_table values(2)\; select * from i_table\; select 1/0; + f1 +---- + 1 + 2 +(2 rows) + ERROR: division by zero select * from i_table; f1 @@ -939,8 +955,18 @@ WARNING: there is no transaction in progress -- begin converts implicit transaction into a regular one that -- can extend past the end of the Query select 1\; begin\; insert into i_table values(5); + ?column? +---------- + 1 +(1 row) + commit; select 1\; begin\; insert into i_table values(6); + ?column? +---------- + 1 +(1 row) + rollback; -- commit in implicit-transaction state commits but issues a warning. insert into i_table values(7)\; commit\; insert into i_table values(8)\; select 1/0; @@ -967,22 +993,52 @@ rollback; -- we are not in a transaction at this point WARNING: there is no transaction in progress -- implicit transaction block is still a transaction block, for e.g. VACUUM SELECT 1\; VACUUM; + ?column? +---------- + 1 +(1 row) + ERROR: VACUUM cannot run inside a transaction block SELECT 1\; COMMIT\; VACUUM; WARNING: there is no transaction in progress + ?column? +---------- + 1 +(1 row) + ERROR: VACUUM cannot run inside a transaction block -- we disallow savepoint-related commands in implicit-transaction state SELECT 1\; SAVEPOINT sp; + ?column? +---------- + 1 +(1 row) + ERROR: SAVEPOINT can only be used in transaction blocks SELECT 1\; COMMIT\; SAVEPOINT sp; WARNING: there is no transaction in progress + ?column? +---------- + 1 +(1 row) + ERROR: SAVEPOINT can only be used in transaction blocks ROLLBACK TO SAVEPOINT sp\; SELECT 2; ERROR: ROLLBACK TO SAVEPOINT can only be used in transaction blocks SELECT 2\; RELEASE SAVEPOINT sp\; SELECT 3; + ?column? +---------- + 2 +(1 row) + ERROR: RELEASE SAVEPOINT can only be used in transaction blocks -- but this is OK, because the BEGIN converts it to a regular xact SELECT 1\; BEGIN\; SAVEPOINT sp\; ROLLBACK TO SAVEPOINT sp\; COMMIT; + ?column? +---------- + 1 +(1 row) + -- Tests for AND CHAIN in implicit transaction blocks SET TRANSACTION READ ONLY\; COMMIT AND CHAIN; -- error ERROR: COMMIT AND CHAIN can only be used in transaction blocks diff --git a/src/test/regress/sql/copyselect.sql b/src/test/regress/sql/copyselect.sql index 1d98dad3c8..e32a4f8e38 100644 --- a/src/test/regress/sql/copyselect.sql +++ b/src/test/regress/sql/copyselect.sql @@ -84,10 +84,10 @@ drop table test1; -- psql handling of COPY in multi-command strings copy (select 1) to stdout\; select 1/0; -- row, then error select 1/0\; copy (select 1) to stdout; -- error only -copy (select 1) to stdout\; copy (select 2) to stdout\; select 0\; select 3; -- 1 2 3 +copy (select 1) to stdout\; copy (select 2) to stdout\; select 3\; select 4; -- 1 2 3 4 create table test3 (c int); -select 0\; copy test3 from stdin\; copy test3 from stdin\; select 1; -- 1 +select 0\; copy test3 from stdin\; copy test3 from stdin\; select 1; -- 0 1 1 \. 2 diff --git a/src/test/regress/sql/psql.sql b/src/test/regress/sql/psql.sql index 0f5287f77b..8f49a5f347 100644 --- a/src/test/regress/sql/psql.sql +++ b/src/test/regress/sql/psql.sql @@ -1316,3 +1316,144 @@ DROP TABLE oer_test; \set ECHO errors SELECT * FROM notexists; \set ECHO all + +-- +-- combined queries +-- +CREATE FUNCTION warn(msg TEXT) RETURNS BOOLEAN LANGUAGE plpgsql +AS $$ + BEGIN RAISE NOTICE 'warn %', msg ; RETURN TRUE ; END +$$; + +-- show both +SELECT 1 AS one \; SELECT warn('1.5') \; SELECT 2 AS two ; +-- \gset applies to last query only +SELECT 3 AS three \; SELECT warn('3.5') \; SELECT 4 AS four \gset +\echo :three :four +-- syntax error stops all processing +SELECT 5 \; SELECT 6 + \; SELECT warn('6.5') \; SELECT 7 ; +-- with aborted transaction, stop on first error +BEGIN \; SELECT 8 AS eight \; SELECT 9/0 AS nine \; ROLLBACK \; SELECT 10 AS ten ; +-- close previously aborted transaction +ROLLBACK; + +-- miscellaneous SQL commands +-- (non SELECT output is sent to stderr, thus is not shown in expected results) +SELECT 'ok' AS "begin" \; +CREATE TABLE psql_comics(s TEXT) \; +INSERT INTO psql_comics VALUES ('Calvin'), ('hobbes') \; +COPY psql_comics FROM STDIN \; +UPDATE psql_comics SET s = 'Hobbes' WHERE s = 'hobbes' \; +DELETE FROM psql_comics WHERE s = 'Moe' \; +COPY psql_comics TO STDOUT \; +TRUNCATE psql_comics \; +DROP TABLE psql_comics \; +SELECT 'ok' AS "done" ; +Moe +Susie +\. + +\set SHOW_ALL_RESULTS off +SELECT 1 AS one \; SELECT warn('1.5') \; SELECT 2 AS two ; + +\set SHOW_ALL_RESULTS on +DROP FUNCTION warn(TEXT); + +-- +-- AUTOCOMMIT and combined queries +-- +\set AUTOCOMMIT off +\echo '# AUTOCOMMIT:' :AUTOCOMMIT +-- BEGIN is now implicit + +CREATE TABLE foo(s TEXT) \; +ROLLBACK; + +CREATE TABLE foo(s TEXT) \; +INSERT INTO foo(s) VALUES ('hello'), ('world') \; +COMMIT; + +DROP TABLE foo \; +ROLLBACK; + +-- table foo is still there +SELECT * FROM foo ORDER BY 1 \; +DROP TABLE foo \; +COMMIT; + +\set AUTOCOMMIT on +\echo '# AUTOCOMMIT:' :AUTOCOMMIT +-- BEGIN now explicit for multi-statement transactions + +BEGIN \; +CREATE TABLE foo(s TEXT) \; +INSERT INTO foo(s) VALUES ('hello'), ('world') \; +COMMIT; + +BEGIN \; +DROP TABLE foo \; +ROLLBACK \; + +-- implicit transactions +SELECT * FROM foo ORDER BY 1 \; +DROP TABLE foo; + +-- +-- test ON_ERROR_ROLLBACK and combined queries +-- +CREATE FUNCTION psql_error(msg TEXT) RETURNS BOOLEAN AS $$ + BEGIN + RAISE EXCEPTION 'error %', msg; + END; +$$ LANGUAGE plpgsql; + +\set ON_ERROR_ROLLBACK on +\echo '# ON_ERROR_ROLLBACK:' :ON_ERROR_ROLLBACK +\echo '# AUTOCOMMIT:' :AUTOCOMMIT + +BEGIN; +CREATE TABLE bla(s NO_SUCH_TYPE); -- fails +CREATE TABLE bla(s TEXT); -- succeeds +SELECT psql_error('oops!'); -- fails +INSERT INTO bla VALUES ('Calvin'), ('Hobbes'); +COMMIT; + +SELECT * FROM bla ORDER BY 1; + +BEGIN; +INSERT INTO bla VALUES ('Susie'); -- succeeds +-- now with combined queries +INSERT INTO bla VALUES ('Rosalyn') \; -- will rollback +SELECT 'before error' AS show \; -- will show nevertheless! + SELECT psql_error('boum!') \; -- failure + SELECT 'after error' AS noshow; -- hidden by preceeding error +INSERT INTO bla(s) VALUES ('Moe') \; -- will rollback + SELECT psql_error('bam!'); +INSERT INTO bla VALUES ('Miss Wormwood'); -- succeeds +COMMIT; +SELECT * FROM bla ORDER BY 1; + +-- some with autocommit off +\set AUTOCOMMIT off +\echo '# AUTOCOMMIT:' :AUTOCOMMIT + +-- implicit BEGIN +INSERT INTO bla VALUES ('Dad'); -- succeeds +SELECT psql_error('bad!'); -- implicit partial rollback + +INSERT INTO bla VALUES ('Mum') \; -- will rollback +SELECT COUNT(*) AS "#mum" +FROM bla WHERE s = 'Mum' \; -- but be counted here +SELECT psql_error('bad!'); -- implicit partial rollback +COMMIT; + +SELECT COUNT(*) AS "#mum" +FROM bla WHERE s = 'Mum' \; -- no mum here +SELECT * FROM bla ORDER BY 1; + +-- reset all +\set AUTOCOMMIT on +\set ON_ERROR_ROLLBACK off +\echo '# final ON_ERROR_ROLLBACK:' :ON_ERROR_ROLLBACK +DROP TABLE bla; +DROP FUNCTION psql_error; diff --git a/src/test/regress/sql/transactions.sql b/src/test/regress/sql/transactions.sql index 0a716b506b..d71c3ce93e 100644 --- a/src/test/regress/sql/transactions.sql +++ b/src/test/regress/sql/transactions.sql @@ -506,7 +506,7 @@ DROP TABLE abc; create temp table i_table (f1 int); --- psql will show only the last result in a multi-statement Query +-- psql will show all results of a multi-statement Query SELECT 1\; SELECT 2\; SELECT 3; -- this implicitly commits: From c42a6fc41dc22b42e5417224440c02893996afb4 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Mon, 4 Apr 2022 11:53:33 -0700 Subject: [PATCH 371/772] vacuumlazy.c: Further consolidate resource allocation. Move remaining VACUUM resource allocation and deallocation code from lazy_scan_heap() to its caller, heap_vacuum_rel(). This finishes off work started by commit 73f6ec3d. Author: Peter Geoghegan Discussion: https://postgr.es/m/CAH2-Wzk3fNBa_S3Ngi+16GQiyJ=AmUu3oUY99syMDTMRxitfyQ@mail.gmail.com --- src/backend/access/heap/vacuumlazy.c | 72 ++++++++++++---------------- 1 file changed, 30 insertions(+), 42 deletions(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 9b7114c159..9cdc8008c1 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -246,7 +246,7 @@ typedef struct LVSavedErrInfo /* non-export function prototypes */ -static void lazy_scan_heap(LVRelState *vacrel, int nworkers); +static void lazy_scan_heap(LVRelState *vacrel); static BlockNumber lazy_scan_skip(LVRelState *vacrel, Buffer *vmbuffer, BlockNumber next_block, bool *next_unskippable_allvis, @@ -514,11 +514,28 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, vacrel->NewRelminMxid = OldestMxact; vacrel->skippedallvis = false; + /* + * Allocate dead_items array memory using dead_items_alloc. This handles + * parallel VACUUM initialization as part of allocating shared memory + * space used for dead_items. (But do a failsafe precheck first, to + * ensure that parallel VACUUM won't be attempted at all when relfrozenxid + * is already dangerously old.) + */ + lazy_check_wraparound_failsafe(vacrel); + dead_items_alloc(vacrel, params->nworkers); + /* * Call lazy_scan_heap to perform all required heap pruning, index * vacuuming, and heap vacuuming (plus related processing) */ - lazy_scan_heap(vacrel, params->nworkers); + lazy_scan_heap(vacrel); + + /* + * Free resources managed by dead_items_alloc. This ends parallel mode in + * passing when necessary. + */ + dead_items_cleanup(vacrel); + Assert(!IsInParallelMode()); /* * Update pg_class entries for each of rel's indexes where appropriate. @@ -825,14 +842,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, * supply. */ static void -lazy_scan_heap(LVRelState *vacrel, int nworkers) +lazy_scan_heap(LVRelState *vacrel) { - VacDeadItems *dead_items; BlockNumber rel_pages = vacrel->rel_pages, blkno, next_unskippable_block, - next_failsafe_block, - next_fsm_block_to_vacuum; + next_failsafe_block = 0, + next_fsm_block_to_vacuum = 0; + VacDeadItems *dead_items = vacrel->dead_items; Buffer vmbuffer = InvalidBuffer; bool next_unskippable_allvis, skipping_current_range; @@ -843,23 +860,6 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) }; int64 initprog_val[3]; - /* - * Do failsafe precheck before calling dead_items_alloc. This ensures - * that parallel VACUUM won't be attempted when relfrozenxid is already - * dangerously old. - */ - lazy_check_wraparound_failsafe(vacrel); - next_failsafe_block = 0; - - /* - * Allocate the space for dead_items. Note that this handles parallel - * VACUUM initialization as part of allocating shared memory space used - * for dead_items. - */ - dead_items_alloc(vacrel, nworkers); - dead_items = vacrel->dead_items; - next_fsm_block_to_vacuum = 0; - /* Report that we're scanning the heap, advertising total # of blocks */ initprog_val[0] = PROGRESS_VACUUM_PHASE_SCAN_HEAP; initprog_val[1] = rel_pages; @@ -1236,12 +1236,13 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) } } + vacrel->blkno = InvalidBlockNumber; + if (BufferIsValid(vmbuffer)) + ReleaseBuffer(vmbuffer); + /* report that everything is now scanned */ pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno); - /* Clear the block number information */ - vacrel->blkno = InvalidBlockNumber; - /* now we can compute the new value for pg_class.reltuples */ vacrel->new_live_tuples = vac_estimate_reltuples(vacrel->rel, rel_pages, vacrel->scanned_pages, @@ -1256,15 +1257,9 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) vacrel->missed_dead_tuples; /* - * Release any remaining pin on visibility map page. + * Do index vacuuming (call each index's ambulkdelete routine), then do + * related heap vacuuming */ - if (BufferIsValid(vmbuffer)) - { - ReleaseBuffer(vmbuffer); - vmbuffer = InvalidBuffer; - } - - /* Perform a final round of index and heap vacuuming */ if (dead_items->num_items > 0) lazy_vacuum(vacrel); @@ -1278,16 +1273,9 @@ lazy_scan_heap(LVRelState *vacrel, int nworkers) /* report all blocks vacuumed */ pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_VACUUMED, blkno); - /* Do post-vacuum cleanup */ + /* Do final index cleanup (call each index's amvacuumcleanup routine) */ if (vacrel->nindexes > 0 && vacrel->do_index_cleanup) lazy_cleanup_all_indexes(vacrel); - - /* - * Free resources managed by dead_items_alloc. This ends parallel mode in - * passing when necessary. - */ - dead_items_cleanup(vacrel); - Assert(!IsInParallelMode()); } /* From 4e34747c88a03ede6e9d731727815e37273d4bc9 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Mon, 4 Apr 2022 15:36:03 -0400 Subject: [PATCH 372/772] JSON_TABLE This feature allows jsonb data to be treated as a table and thus used in a FROM clause like other tabular data. Data can be selected from the jsonb using jsonpath expressions, and hoisted out of nested structures in the jsonb to form multiple rows, more or less like an outer join. Nikita Glukhov Reviewers have included (in no particular order) Andres Freund, Alexander Korotkov, Pavel Stehule, Andrew Alsup, Erik Rijkers, Zhihong Yu (whose name I previously misspelled), Himanshu Upadhyaya, Daniel Gustafsson, Justin Pryzby. Discussion: https://postgr.es/m/7e2cb85d-24cf-4abb-30a5-1a33715959bd@postgrespro.ru --- src/backend/commands/explain.c | 8 +- src/backend/executor/execExpr.c | 1 + src/backend/executor/execExprInterp.c | 18 +- src/backend/executor/nodeTableFuncscan.c | 23 +- src/backend/nodes/copyfuncs.c | 85 +++ src/backend/nodes/equalfuncs.c | 65 +++ src/backend/nodes/nodeFuncs.c | 27 + src/backend/nodes/outfuncs.c | 29 + src/backend/nodes/readfuncs.c | 31 ++ src/backend/parser/Makefile | 1 + src/backend/parser/gram.y | 199 ++++++- src/backend/parser/parse_clause.c | 12 +- src/backend/parser/parse_expr.c | 32 +- src/backend/parser/parse_jsontable.c | 466 ++++++++++++++++ src/backend/parser/parse_relation.c | 3 +- src/backend/parser/parse_target.c | 3 + src/backend/utils/adt/jsonpath_exec.c | 436 +++++++++++++++ src/backend/utils/adt/ruleutils.c | 228 +++++++- src/backend/utils/misc/queryjumble.c | 2 + src/include/executor/execExpr.h | 4 + src/include/nodes/nodes.h | 4 + src/include/nodes/parsenodes.h | 48 ++ src/include/nodes/primnodes.h | 39 +- src/include/parser/kwlist.h | 3 + src/include/parser/parse_clause.h | 3 + src/include/utils/jsonpath.h | 4 + src/test/regress/expected/json_sqljson.out | 6 + src/test/regress/expected/jsonb_sqljson.out | 562 ++++++++++++++++++++ src/test/regress/sql/json_sqljson.sql | 4 + src/test/regress/sql/jsonb_sqljson.sql | 284 ++++++++++ src/tools/pgindent/typedefs.list | 9 + 31 files changed, 2605 insertions(+), 34 deletions(-) create mode 100644 src/backend/parser/parse_jsontable.c diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index cb13227db1..1e5701b8eb 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -3796,7 +3796,13 @@ ExplainTargetRel(Plan *plan, Index rti, ExplainState *es) break; case T_TableFuncScan: Assert(rte->rtekind == RTE_TABLEFUNC); - objectname = "xmltable"; + if (rte->tablefunc) + if (rte->tablefunc->functype == TFT_XMLTABLE) + objectname = "xmltable"; + else /* Must be TFT_JSON_TABLE */ + objectname = "json_table"; + else + objectname = NULL; objecttag = "Table Function Name"; break; case T_ValuesScan: diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index d4d3850ec7..38b94c0276 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -2635,6 +2635,7 @@ ExecInitExprRec(Expr *node, ExprState *state, var->typmod = exprTypmod((Node *) argexpr); var->estate = ExecInitExpr(argexpr, state->parent); var->econtext = NULL; + var->mcxt = NULL; var->evaluated = false; var->value = (Datum) 0; var->isnull = true; diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index 7d4253d970..7094e7e3f6 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -4602,6 +4602,7 @@ ExecEvalJsonBehavior(ExprContext *econtext, JsonBehavior *behavior, case JSON_BEHAVIOR_NULL: case JSON_BEHAVIOR_UNKNOWN: + case JSON_BEHAVIOR_EMPTY: *is_null = true; return (Datum) 0; @@ -4694,8 +4695,14 @@ EvalJsonPathVar(void *cxt, char *varName, int varNameLen, if (!var->evaluated) { + MemoryContext oldcxt = var->mcxt ? + MemoryContextSwitchTo(var->mcxt) : NULL; + var->value = ExecEvalExpr(var->estate, var->econtext, &var->isnull); var->evaluated = true; + + if (oldcxt) + MemoryContextSwitchTo(oldcxt); } if (var->isnull) @@ -4843,6 +4850,7 @@ ExecEvalJsonExprSubtrans(JsonFunc func, ExprEvalStep *op, PG_CATCH(); { ErrorData *edata; + int ecategory; /* Save error info in oldcontext */ MemoryContextSwitchTo(oldcontext); @@ -4854,8 +4862,10 @@ ExecEvalJsonExprSubtrans(JsonFunc func, ExprEvalStep *op, MemoryContextSwitchTo(oldcontext); CurrentResourceOwner = oldowner; - if (ERRCODE_TO_CATEGORY(edata->sqlerrcode) != - ERRCODE_DATA_EXCEPTION) + ecategory = ERRCODE_TO_CATEGORY(edata->sqlerrcode); + + if (ecategory != ERRCODE_DATA_EXCEPTION && /* jsonpath and other data errors */ + ecategory != ERRCODE_INTEGRITY_CONSTRAINT_VIOLATION) /* domain errors */ ReThrowError(edata); res = (Datum) 0; @@ -4981,6 +4991,10 @@ ExecEvalJsonExpr(ExprEvalStep *op, ExprContext *econtext, break; } + case JSON_TABLE_OP: + *resnull = false; + return item; + default: elog(ERROR, "unrecognized SQL/JSON expression op %d", jexpr->op); return (Datum) 0; diff --git a/src/backend/executor/nodeTableFuncscan.c b/src/backend/executor/nodeTableFuncscan.c index 0db4ed0c2f..691c3e28ce 100644 --- a/src/backend/executor/nodeTableFuncscan.c +++ b/src/backend/executor/nodeTableFuncscan.c @@ -28,6 +28,7 @@ #include "miscadmin.h" #include "nodes/execnodes.h" #include "utils/builtins.h" +#include "utils/jsonpath.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/xml.h" @@ -161,8 +162,9 @@ ExecInitTableFuncScan(TableFuncScan *node, EState *estate, int eflags) scanstate->ss.ps.qual = ExecInitQual(node->scan.plan.qual, &scanstate->ss.ps); - /* Only XMLTABLE is supported currently */ - scanstate->routine = &XmlTableRoutine; + /* Only XMLTABLE and JSON_TABLE are supported currently */ + scanstate->routine = + tf->functype == TFT_XMLTABLE ? &XmlTableRoutine : &JsonbTableRoutine; scanstate->perTableCxt = AllocSetContextCreate(CurrentMemoryContext, @@ -381,14 +383,17 @@ tfuncInitialize(TableFuncScanState *tstate, ExprContext *econtext, Datum doc) routine->SetNamespace(tstate, ns_name, ns_uri); } - /* Install the row filter expression into the table builder context */ - value = ExecEvalExpr(tstate->rowexpr, econtext, &isnull); - if (isnull) - ereport(ERROR, - (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), - errmsg("row filter expression must not be null"))); + if (routine->SetRowFilter) + { + /* Install the row filter expression into the table builder context */ + value = ExecEvalExpr(tstate->rowexpr, econtext, &isnull); + if (isnull) + ereport(ERROR, + (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), + errmsg("row filter expression must not be null"))); - routine->SetRowFilter(tstate, TextDatumGetCString(value)); + routine->SetRowFilter(tstate, TextDatumGetCString(value)); + } /* * Install the column filter expressions into the table builder context. diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 11c016495e..1a74122f13 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -1394,6 +1394,7 @@ _copyTableFunc(const TableFunc *from) { TableFunc *newnode = makeNode(TableFunc); + COPY_SCALAR_FIELD(functype); COPY_NODE_FIELD(ns_uris); COPY_NODE_FIELD(ns_names); COPY_NODE_FIELD(docexpr); @@ -1404,7 +1405,9 @@ _copyTableFunc(const TableFunc *from) COPY_NODE_FIELD(colcollations); COPY_NODE_FIELD(colexprs); COPY_NODE_FIELD(coldefexprs); + COPY_NODE_FIELD(colvalexprs); COPY_BITMAPSET_FIELD(notnulls); + COPY_NODE_FIELD(plan); COPY_SCALAR_FIELD(ordinalitycol); COPY_LOCATION_FIELD(location); @@ -2683,6 +2686,76 @@ _copyJsonArgument(const JsonArgument *from) return newnode; } +/* + * _copyJsonTable + */ +static JsonTable * +_copyJsonTable(const JsonTable *from) +{ + JsonTable *newnode = makeNode(JsonTable); + + COPY_NODE_FIELD(common); + COPY_NODE_FIELD(columns); + COPY_NODE_FIELD(on_error); + COPY_NODE_FIELD(alias); + COPY_SCALAR_FIELD(location); + + return newnode; +} + +/* + * _copyJsonTableColumn + */ +static JsonTableColumn * +_copyJsonTableColumn(const JsonTableColumn *from) +{ + JsonTableColumn *newnode = makeNode(JsonTableColumn); + + COPY_SCALAR_FIELD(coltype); + COPY_STRING_FIELD(name); + COPY_NODE_FIELD(typeName); + COPY_STRING_FIELD(pathspec); + COPY_SCALAR_FIELD(format); + COPY_SCALAR_FIELD(wrapper); + COPY_SCALAR_FIELD(omit_quotes); + COPY_NODE_FIELD(columns); + COPY_NODE_FIELD(on_empty); + COPY_NODE_FIELD(on_error); + COPY_SCALAR_FIELD(location); + + return newnode; +} + +/* + * _copyJsonTableParent + */ +static JsonTableParent * +_copyJsonTableParent(const JsonTableParent *from) +{ + JsonTableParent *newnode = makeNode(JsonTableParent); + + COPY_NODE_FIELD(path); + COPY_NODE_FIELD(child); + COPY_SCALAR_FIELD(colMin); + COPY_SCALAR_FIELD(colMax); + + return newnode; +} + +/* + * _copyJsonTableSibling + */ +static JsonTableSibling * +_copyJsonTableSibling(const JsonTableSibling *from) +{ + JsonTableSibling *newnode = makeNode(JsonTableSibling); + + COPY_NODE_FIELD(larg); + COPY_NODE_FIELD(rarg); + + return newnode; +} + /* **************************************************************** * pathnodes.h copy functions * @@ -5850,6 +5923,18 @@ copyObjectImpl(const void *from) case T_JsonItemCoercions: retval = _copyJsonItemCoercions(from); break; + case T_JsonTable: + retval = _copyJsonTable(from); + break; + case T_JsonTableColumn: + retval = _copyJsonTableColumn(from); + break; + case T_JsonTableParent: + retval = _copyJsonTableParent(from); + break; + case T_JsonTableSibling: + retval = _copyJsonTableSibling(from); + break; /* * RELATION NODES diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 722dbe6a0d..5c21850c97 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -127,6 +127,7 @@ _equalRangeVar(const RangeVar *a, const RangeVar *b) static bool _equalTableFunc(const TableFunc *a, const TableFunc *b) { + COMPARE_SCALAR_FIELD(functype); COMPARE_NODE_FIELD(ns_uris); COMPARE_NODE_FIELD(ns_names); COMPARE_NODE_FIELD(docexpr); @@ -137,13 +138,65 @@ _equalTableFunc(const TableFunc *a, const TableFunc *b) COMPARE_NODE_FIELD(colcollations); COMPARE_NODE_FIELD(colexprs); COMPARE_NODE_FIELD(coldefexprs); + COMPARE_NODE_FIELD(colvalexprs); COMPARE_BITMAPSET_FIELD(notnulls); + COMPARE_NODE_FIELD(plan); COMPARE_SCALAR_FIELD(ordinalitycol); COMPARE_LOCATION_FIELD(location); return true; } +static bool +_equalJsonTable(const JsonTable *a, const JsonTable *b) +{ + COMPARE_NODE_FIELD(common); + COMPARE_NODE_FIELD(columns); + COMPARE_NODE_FIELD(on_error); + COMPARE_NODE_FIELD(alias); + COMPARE_SCALAR_FIELD(location); + + return true; +} + +static bool +_equalJsonTableColumn(const JsonTableColumn *a, const JsonTableColumn *b) +{ + COMPARE_SCALAR_FIELD(coltype); + COMPARE_STRING_FIELD(name); + COMPARE_NODE_FIELD(typeName); + COMPARE_STRING_FIELD(pathspec); + COMPARE_SCALAR_FIELD(format); + COMPARE_SCALAR_FIELD(wrapper); + COMPARE_SCALAR_FIELD(omit_quotes); + COMPARE_NODE_FIELD(columns); + COMPARE_NODE_FIELD(on_empty); + COMPARE_NODE_FIELD(on_error); + COMPARE_SCALAR_FIELD(location); + + return true; +} + +static bool +_equalJsonTableParent(const JsonTableParent *a, const JsonTableParent *b) +{ + COMPARE_NODE_FIELD(path); + COMPARE_NODE_FIELD(child); + COMPARE_SCALAR_FIELD(colMin); + COMPARE_SCALAR_FIELD(colMax); + + return true; +} + +static bool +_equalJsonTableSibling(const JsonTableSibling *a, const JsonTableSibling *b) +{ + COMPARE_NODE_FIELD(larg); + COMPARE_NODE_FIELD(rarg); + + return true; +} + static bool _equalIntoClause(const IntoClause *a, const IntoClause *b) { @@ -3719,6 +3772,12 @@ equal(const void *a, const void *b) case T_JsonItemCoercions: retval = _equalJsonItemCoercions(a, b); break; + case T_JsonTableParent: + retval = _equalJsonTableParent(a, b); + break; + case T_JsonTableSibling: + retval = _equalJsonTableSibling(a, b); + break; /* * RELATION NODES @@ -4341,6 +4400,12 @@ equal(const void *a, const void *b) case T_JsonArgument: retval = _equalJsonArgument(a, b); break; + case T_JsonTable: + retval = _equalJsonTable(a, b); + break; + case T_JsonTableColumn: + retval = _equalJsonTableColumn(a, b); + break; default: elog(ERROR, "unrecognized node type: %d", diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index a094317bfc..4ae5e5d4dd 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -2466,6 +2466,8 @@ expression_tree_walker(Node *node, return true; if (walker(tf->coldefexprs, context)) return true; + if (walker(tf->colvalexprs, context)) + return true; } break; case T_JsonValueExpr: @@ -3513,6 +3515,7 @@ expression_tree_mutator(Node *node, MUTATE(newnode->rowexpr, tf->rowexpr, Node *); MUTATE(newnode->colexprs, tf->colexprs, List *); MUTATE(newnode->coldefexprs, tf->coldefexprs, List *); + MUTATE(newnode->colvalexprs, tf->colvalexprs, List *); return (Node *) newnode; } break; @@ -4530,6 +4533,30 @@ raw_expression_tree_walker(Node *node, return true; } break; + case T_JsonTable: + { + JsonTable *jt = (JsonTable *) node; + + if (walker(jt->common, context)) + return true; + if (walker(jt->columns, context)) + return true; + } + break; + case T_JsonTableColumn: + { + JsonTableColumn *jtc = (JsonTableColumn *) node; + + if (walker(jtc->typeName, context)) + return true; + if (walker(jtc->on_empty, context)) + return true; + if (walker(jtc->on_error, context)) + return true; + if (jtc->coltype == JTC_NESTED && walker(jtc->columns, context)) + return true; + } + break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 6e39590730..213396f999 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1092,6 +1092,7 @@ _outTableFunc(StringInfo str, const TableFunc *node) { WRITE_NODE_TYPE("TABLEFUNC"); + WRITE_ENUM_FIELD(functype, TableFuncType); WRITE_NODE_FIELD(ns_uris); WRITE_NODE_FIELD(ns_names); WRITE_NODE_FIELD(docexpr); @@ -1102,7 +1103,9 @@ _outTableFunc(StringInfo str, const TableFunc *node) WRITE_NODE_FIELD(colcollations); WRITE_NODE_FIELD(colexprs); WRITE_NODE_FIELD(coldefexprs); + WRITE_NODE_FIELD(colvalexprs); WRITE_BITMAPSET_FIELD(notnulls); + WRITE_NODE_FIELD(plan); WRITE_INT_FIELD(ordinalitycol); WRITE_LOCATION_FIELD(location); } @@ -1866,6 +1869,26 @@ _outJsonItemCoercions(StringInfo str, const JsonItemCoercions *node) WRITE_NODE_FIELD(composite); } +static void +_outJsonTableParent(StringInfo str, const JsonTableParent *node) +{ + WRITE_NODE_TYPE("JSONTABPNODE"); + + WRITE_NODE_FIELD(path); + WRITE_NODE_FIELD(child); + WRITE_INT_FIELD(colMin); + WRITE_INT_FIELD(colMax); +} + +static void +_outJsonTableSibling(StringInfo str, const JsonTableSibling *node) +{ + WRITE_NODE_TYPE("JSONTABSNODE"); + + WRITE_NODE_FIELD(larg); + WRITE_NODE_FIELD(rarg); +} + /***************************************************************************** * * Stuff from pathnodes.h. @@ -4714,6 +4737,12 @@ outNode(StringInfo str, const void *obj) case T_JsonItemCoercions: _outJsonItemCoercions(str, obj); break; + case T_JsonTableParent: + _outJsonTableParent(str, obj); + break; + case T_JsonTableSibling: + _outJsonTableSibling(str, obj); + break; default: diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index c94b2561f0..19e257684c 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -571,6 +571,7 @@ _readTableFunc(void) { READ_LOCALS(TableFunc); + READ_ENUM_FIELD(functype, TableFuncType); READ_NODE_FIELD(ns_uris); READ_NODE_FIELD(ns_names); READ_NODE_FIELD(docexpr); @@ -581,7 +582,9 @@ _readTableFunc(void) READ_NODE_FIELD(colcollations); READ_NODE_FIELD(colexprs); READ_NODE_FIELD(coldefexprs); + READ_NODE_FIELD(colvalexprs); READ_BITMAPSET_FIELD(notnulls); + READ_NODE_FIELD(plan); READ_INT_FIELD(ordinalitycol); READ_LOCATION_FIELD(location); @@ -1532,6 +1535,30 @@ _readJsonExpr(void) READ_DONE(); } +static JsonTableParent * +_readJsonTableParent(void) +{ + READ_LOCALS(JsonTableParent); + + READ_NODE_FIELD(path); + READ_NODE_FIELD(child); + READ_INT_FIELD(colMin); + READ_INT_FIELD(colMax); + + READ_DONE(); +} + +static JsonTableSibling * +_readJsonTableSibling(void) +{ + READ_LOCALS(JsonTableSibling); + + READ_NODE_FIELD(larg); + READ_NODE_FIELD(rarg); + + READ_DONE(); +} + /* * _readJsonCoercion */ @@ -3194,6 +3221,10 @@ parseNodeString(void) return_value = _readJsonCoercion(); else if (MATCH("JSONITEMCOERCIONS", 17)) return_value = _readJsonItemCoercions(); + else if (MATCH("JSONTABPNODE", 12)) + return_value = _readJsonTableParent(); + else if (MATCH("JSONTABSNODE", 12)) + return_value = _readJsonTableSibling(); else { elog(ERROR, "badly formatted node string \"%.32s\"...", token); diff --git a/src/backend/parser/Makefile b/src/backend/parser/Makefile index 9f1c4022bb..f4c0cc7f10 100644 --- a/src/backend/parser/Makefile +++ b/src/backend/parser/Makefile @@ -23,6 +23,7 @@ OBJS = \ parse_enr.o \ parse_expr.o \ parse_func.o \ + parse_jsontable.o \ parse_merge.o \ parse_node.o \ parse_oper.o \ diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index e5a3c528aa..13fa5bea87 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -676,15 +676,25 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); json_object_aggregate_constructor json_array_aggregate_constructor json_path_specification + json_table + json_table_column_definition + json_table_ordinality_column_definition + json_table_regular_column_definition + json_table_formatted_column_definition + json_table_exists_column_definition + json_table_nested_columns %type json_name_and_value_list json_value_expr_list json_array_aggregate_order_by_clause_opt json_arguments json_passing_clause_opt + json_table_columns_clause + json_table_column_definition_list %type json_table_path_name json_as_path_name_clause_opt + json_table_column_path_specification_clause_opt %type json_encoding json_encoding_clause_opt @@ -698,6 +708,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); json_behavior_true json_behavior_false json_behavior_unknown + json_behavior_empty json_behavior_empty_array json_behavior_empty_object json_behavior_default @@ -705,6 +716,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); json_query_behavior json_exists_error_behavior json_exists_error_clause_opt + json_table_error_behavior + json_table_error_clause_opt %type json_value_on_behavior_clause_opt json_query_on_behavior_clause_opt @@ -779,7 +792,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION JOIN JSON JSON_ARRAY JSON_ARRAYAGG JSON_EXISTS JSON_OBJECT JSON_OBJECTAGG - JSON_QUERY JSON_SCALAR JSON_SERIALIZE JSON_VALUE + JSON_QUERY JSON_SCALAR JSON_SERIALIZE JSON_TABLE JSON_VALUE KEY KEYS KEEP @@ -790,8 +803,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); MAPPING MATCH MATCHED MATERIALIZED MAXVALUE MERGE METHOD MINUTE_P MINVALUE MODE MONTH_P MOVE - NAME_P NAMES NATIONAL NATURAL NCHAR NEW NEXT NFC NFD NFKC NFKD NO NONE - NORMALIZE NORMALIZED + NAME_P NAMES NATIONAL NATURAL NCHAR NESTED NEW NEXT NFC NFD NFKC NFKD NO + NONE NORMALIZE NORMALIZED NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF NULLS_P NUMERIC @@ -799,7 +812,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); ORDER ORDINALITY OTHERS OUT_P OUTER_P OVER OVERLAPS OVERLAY OVERRIDING OWNED OWNER - PARALLEL PARSER PARTIAL PARTITION PASSING PASSWORD PLACING PLANS POLICY + PARALLEL PARSER PARTIAL PARTITION PASSING PASSWORD PATH PLACING PLANS POLICY POSITION PRECEDING PRECISION PRESERVE PREPARE PREPARED PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE PROCEDURES PROGRAM PUBLICATION @@ -901,7 +914,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); */ %nonassoc UNBOUNDED /* ideally would have same precedence as IDENT */ %nonassoc ERROR_P EMPTY_P DEFAULT ABSENT /* JSON error/empty behavior */ -%nonassoc FALSE_P KEEP OMIT PASSING TRUE_P UNKNOWN UNIQUE JSON +%nonassoc FALSE_P KEEP OMIT PASSING TRUE_P UNKNOWN UNIQUE JSON COLUMNS %nonassoc IDENT PARTITION RANGE ROWS GROUPS PRECEDING FOLLOWING CUBE ROLLUP %left Op OPERATOR /* multi-character ops and user-defined operators */ %left '+' '-' @@ -926,6 +939,10 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); */ %left JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL +%nonassoc json_table_column +%nonassoc NESTED +%left PATH + %nonassoc empty_json_unique %left WITHOUT WITH_LA_UNIQUE @@ -12697,6 +12714,19 @@ table_ref: relation_expr opt_alias_clause $2->alias = $4; $$ = (Node *) $2; } + | json_table opt_alias_clause + { + JsonTable *jt = castNode(JsonTable, $1); + jt->alias = $2; + $$ = (Node *) jt; + } + | LATERAL_P json_table opt_alias_clause + { + JsonTable *jt = castNode(JsonTable, $2); + jt->alias = $3; + jt->lateral = true; + $$ = (Node *) jt; + } ; @@ -13248,6 +13278,8 @@ xmltable_column_option_el: { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(true), @1); } | NULL_P { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(false), @1); } + | PATH b_expr + { $$ = makeDefElem("path", $2, @1); } ; xml_namespace_list: @@ -15774,6 +15806,10 @@ json_behavior_unknown: UNKNOWN { $$ = makeJsonBehavior(JSON_BEHAVIOR_UNKNOWN, NULL); } ; +json_behavior_empty: + EMPTY_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_EMPTY_OBJECT, NULL); } + ; + json_behavior_empty_array: EMPTY_P ARRAY { $$ = makeJsonBehavior(JSON_BEHAVIOR_EMPTY_ARRAY, NULL); } /* non-standard, for Oracle compatibility only */ @@ -15888,6 +15924,153 @@ json_query_on_behavior_clause_opt: { $$.on_empty = NULL; $$.on_error = NULL; } ; +json_table: + JSON_TABLE '(' + json_api_common_syntax + json_table_columns_clause + json_table_error_clause_opt + ')' + { + JsonTable *n = makeNode(JsonTable); + n->common = (JsonCommon *) $3; + n->columns = $4; + n->on_error = $5; + n->location = @1; + $$ = (Node *) n; + } + ; + +json_table_columns_clause: + COLUMNS '(' json_table_column_definition_list ')' { $$ = $3; } + ; + +json_table_column_definition_list: + json_table_column_definition + { $$ = list_make1($1); } + | json_table_column_definition_list ',' json_table_column_definition + { $$ = lappend($1, $3); } + ; + +json_table_column_definition: + json_table_ordinality_column_definition %prec json_table_column + | json_table_regular_column_definition %prec json_table_column + | json_table_formatted_column_definition %prec json_table_column + | json_table_exists_column_definition %prec json_table_column + | json_table_nested_columns + ; + +json_table_ordinality_column_definition: + ColId FOR ORDINALITY + { + JsonTableColumn *n = makeNode(JsonTableColumn); + n->coltype = JTC_FOR_ORDINALITY; + n->name = $1; + n->location = @1; + $$ = (Node *) n; + } + ; + +json_table_regular_column_definition: + ColId Typename + json_table_column_path_specification_clause_opt + json_wrapper_clause_opt + json_quotes_clause_opt + json_value_on_behavior_clause_opt + { + JsonTableColumn *n = makeNode(JsonTableColumn); + n->coltype = JTC_REGULAR; + n->name = $1; + n->typeName = $2; + n->format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1); + n->wrapper = $4; /* JSW_NONE */ + n->omit_quotes = $5; /* false */ + n->pathspec = $3; + n->on_empty = $6.on_empty; + n->on_error = $6.on_error; + n->location = @1; + $$ = (Node *) n; + } + ; + +json_table_exists_column_definition: + ColId Typename + EXISTS json_table_column_path_specification_clause_opt + json_exists_error_clause_opt + { + JsonTableColumn *n = makeNode(JsonTableColumn); + n->coltype = JTC_EXISTS; + n->name = $1; + n->typeName = $2; + n->format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1); + n->wrapper = JSW_NONE; + n->omit_quotes = false; + n->pathspec = $4; + n->on_empty = NULL; + n->on_error = $5; + n->location = @1; + $$ = (Node *) n; + } + ; + +json_table_error_behavior: + json_behavior_error + | json_behavior_empty + ; + +json_table_error_clause_opt: + json_table_error_behavior ON ERROR_P { $$ = $1; } + | /* EMPTY */ { $$ = NULL; } + ; + +json_table_column_path_specification_clause_opt: + PATH Sconst { $$ = $2; } + | /* EMPTY */ %prec json_table_column { $$ = NULL; } + ; + +json_table_formatted_column_definition: + ColId Typename FORMAT json_representation + json_table_column_path_specification_clause_opt + json_wrapper_clause_opt + json_quotes_clause_opt + json_query_on_behavior_clause_opt + { + JsonTableColumn *n = makeNode(JsonTableColumn); + n->coltype = JTC_FORMATTED; + n->name = $1; + n->typeName = $2; + n->format = castNode(JsonFormat, $4); + n->pathspec = $5; + n->wrapper = $6; + if (n->wrapper != JSW_NONE && $7 != JS_QUOTES_UNSPEC) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used"), + parser_errposition(@7))); + n->omit_quotes = $7 == JS_QUOTES_OMIT; + n->on_empty = $8.on_empty; + n->on_error = $8.on_error; + n->location = @1; + $$ = (Node *) n; + } + ; + +json_table_nested_columns: + NESTED path_opt Sconst json_table_columns_clause + { + JsonTableColumn *n = makeNode(JsonTableColumn); + n->coltype = JTC_NESTED; + n->pathspec = $3; + n->columns = $4; + n->location = @1; + $$ = (Node *) n; + } + ; + +path_opt: + PATH { } + | /* EMPTY */ { } + ; + json_returning_clause_opt: RETURNING Typename { @@ -16733,6 +16916,7 @@ unreserved_keyword: | MOVE | NAME_P | NAMES + | NESTED | NEW | NEXT | NFC @@ -16766,6 +16950,7 @@ unreserved_keyword: | PARTITION | PASSING | PASSWORD + | PATH | PLANS | POLICY | PRECEDING @@ -16929,6 +17114,7 @@ col_name_keyword: | JSON_QUERY | JSON_SCALAR | JSON_SERIALIZE + | JSON_TABLE | JSON_VALUE | LEAST | NATIONAL @@ -17296,6 +17482,7 @@ bare_label_keyword: | JSON_QUERY | JSON_SCALAR | JSON_SERIALIZE + | JSON_TABLE | JSON_VALUE | KEEP | KEY @@ -17335,6 +17522,7 @@ bare_label_keyword: | NATIONAL | NATURAL | NCHAR + | NESTED | NEW | NEXT | NFC @@ -17378,6 +17566,7 @@ bare_label_keyword: | PARTITION | PASSING | PASSWORD + | PATH | PLACING | PLANS | POLICY diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index d8b14ba7cd..dafde68b20 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -696,7 +696,9 @@ transformRangeTableFunc(ParseState *pstate, RangeTableFunc *rtf) char **names; int colno; - /* Currently only XMLTABLE is supported */ + /* Currently only XMLTABLE and JSON_TABLE are supported */ + + tf->functype = TFT_XMLTABLE; constructName = "XMLTABLE"; docType = XMLOID; @@ -1100,13 +1102,17 @@ transformFromClauseItem(ParseState *pstate, Node *n, rtr->rtindex = nsitem->p_rtindex; return (Node *) rtr; } - else if (IsA(n, RangeTableFunc)) + else if (IsA(n, RangeTableFunc) || IsA(n, JsonTable)) { /* table function is like a plain relation */ RangeTblRef *rtr; ParseNamespaceItem *nsitem; - nsitem = transformRangeTableFunc(pstate, (RangeTableFunc *) n); + if (IsA(n, RangeTableFunc)) + nsitem = transformRangeTableFunc(pstate, (RangeTableFunc *) n); + else + nsitem = transformJsonTable(pstate, (JsonTable *) n); + *top_nsitem = nsitem; *namespace = list_make1(nsitem); rtr = makeNode(RangeTblRef); diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 911f355460..b6a2482f23 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -4093,7 +4093,7 @@ transformJsonExprCommon(ParseState *pstate, JsonFuncExpr *func) Node *pathspec; JsonFormatType format; - if (func->common->pathname) + if (func->common->pathname && func->op != JSON_TABLE_OP) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("JSON_TABLE path name is not allowed here"), @@ -4131,14 +4131,19 @@ transformJsonExprCommon(ParseState *pstate, JsonFuncExpr *func) transformJsonPassingArgs(pstate, format, func->common->passing, &jsexpr->passing_values, &jsexpr->passing_names); - if (func->op != JSON_EXISTS_OP) + if (func->op != JSON_EXISTS_OP && func->op != JSON_TABLE_OP) jsexpr->on_empty = transformJsonBehavior(pstate, func->on_empty, JSON_BEHAVIOR_NULL); - jsexpr->on_error = transformJsonBehavior(pstate, func->on_error, - func->op == JSON_EXISTS_OP ? - JSON_BEHAVIOR_FALSE : - JSON_BEHAVIOR_NULL); + if (func->op == JSON_EXISTS_OP) + jsexpr->on_error = transformJsonBehavior(pstate, func->on_error, + JSON_BEHAVIOR_FALSE); + else if (func->op == JSON_TABLE_OP) + jsexpr->on_error = transformJsonBehavior(pstate, func->on_error, + JSON_BEHAVIOR_EMPTY); + else + jsexpr->on_error = transformJsonBehavior(pstate, func->on_error, + JSON_BEHAVIOR_NULL); return jsexpr; } @@ -4439,6 +4444,21 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func) jsexpr->result_coercion->expr = NULL; } break; + + case JSON_TABLE_OP: + jsexpr->returning = makeNode(JsonReturning); + jsexpr->returning->format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1); + jsexpr->returning->typid = exprType(contextItemExpr); + jsexpr->returning->typmod = -1; + + if (jsexpr->returning->typid != JSONBOID) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("JSON_TABLE() is not yet implemented for json type"), + errhint("Try casting the argument to jsonb"), + parser_errposition(pstate, func->location))); + + break; } if (exprType(contextItemExpr) != JSONBOID) diff --git a/src/backend/parser/parse_jsontable.c b/src/backend/parser/parse_jsontable.c new file mode 100644 index 0000000000..dd75a40bf6 --- /dev/null +++ b/src/backend/parser/parse_jsontable.c @@ -0,0 +1,466 @@ +/*------------------------------------------------------------------------- + * + * parse_jsontable.c + * parsing of JSON_TABLE + * + * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/parser/parse_jsontable.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "catalog/pg_collation.h" +#include "catalog/pg_type.h" +#include "miscadmin.h" +#include "nodes/makefuncs.h" +#include "nodes/nodeFuncs.h" +#include "optimizer/optimizer.h" +#include "parser/parse_clause.h" +#include "parser/parse_collate.h" +#include "parser/parse_expr.h" +#include "parser/parse_relation.h" +#include "parser/parse_type.h" +#include "utils/builtins.h" +#include "utils/json.h" +#include "utils/lsyscache.h" + +/* Context for JSON_TABLE transformation */ +typedef struct JsonTableContext +{ + ParseState *pstate; /* parsing state */ + JsonTable *table; /* untransformed node */ + TableFunc *tablefunc; /* transformed node */ + List *pathNames; /* list of all path and columns names */ + Oid contextItemTypid; /* type oid of context item (json/jsonb) */ +} JsonTableContext; + +static JsonTableParent * transformJsonTableColumns(JsonTableContext *cxt, + List *columns, + char *pathSpec, + int location); + +static Node * +makeStringConst(char *str, int location) +{ + A_Const *n = makeNode(A_Const); + + n->val.node.type = T_String; + n->val.sval.sval = str; + n->location = location; + + return (Node *)n; +} + +/* + * Transform JSON_TABLE column + * - regular column into JSON_VALUE() + * - FORMAT JSON column into JSON_QUERY() + * - EXISTS column into JSON_EXISTS() + */ +static Node * +transformJsonTableColumn(JsonTableColumn *jtc, Node *contextItemExpr, + List *passingArgs, bool errorOnError) +{ + JsonFuncExpr *jfexpr = makeNode(JsonFuncExpr); + JsonCommon *common = makeNode(JsonCommon); + JsonOutput *output = makeNode(JsonOutput); + JsonPathSpec pathspec; + JsonFormat *default_format; + + jfexpr->op = + jtc->coltype == JTC_REGULAR ? JSON_VALUE_OP : + jtc->coltype == JTC_EXISTS ? JSON_EXISTS_OP : JSON_QUERY_OP; + jfexpr->common = common; + jfexpr->output = output; + jfexpr->on_empty = jtc->on_empty; + jfexpr->on_error = jtc->on_error; + if (!jfexpr->on_error && errorOnError) + jfexpr->on_error = makeJsonBehavior(JSON_BEHAVIOR_ERROR, NULL); + jfexpr->omit_quotes = jtc->omit_quotes; + jfexpr->wrapper = jtc->wrapper; + jfexpr->location = jtc->location; + + output->typeName = jtc->typeName; + output->returning = makeNode(JsonReturning); + output->returning->format = jtc->format; + + default_format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1); + + common->pathname = NULL; + common->expr = makeJsonValueExpr((Expr *) contextItemExpr, default_format); + common->passing = passingArgs; + + if (jtc->pathspec) + pathspec = jtc->pathspec; + else + { + /* Construct default path as '$."column_name"' */ + StringInfoData path; + + initStringInfo(&path); + + appendStringInfoString(&path, "$."); + escape_json(&path, jtc->name); + + pathspec = path.data; + } + + common->pathspec = makeStringConst(pathspec, -1); + + return (Node *) jfexpr; +} + +static bool +isJsonTablePathNameDuplicate(JsonTableContext *cxt, const char *pathname) +{ + ListCell *lc; + + foreach(lc, cxt->pathNames) + { + if (!strcmp(pathname, (const char *) lfirst(lc))) + return true; + } + + return false; +} + +/* Register the column name in the path name list. */ +static void +registerJsonTableColumn(JsonTableContext *cxt, char *colname) +{ + if (isJsonTablePathNameDuplicate(cxt, colname)) + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_ALIAS), + errmsg("duplicate JSON_TABLE column name: %s", colname), + errhint("JSON_TABLE column names must be distinct from one another"))); + + cxt->pathNames = lappend(cxt->pathNames, colname); +} + +/* Recursively register all nested column names in the path name list. */ +static void +registerAllJsonTableColumns(JsonTableContext *cxt, List *columns) +{ + ListCell *lc; + + foreach(lc, columns) + { + JsonTableColumn *jtc = castNode(JsonTableColumn, lfirst(lc)); + + if (jtc->coltype == JTC_NESTED) + registerAllJsonTableColumns(cxt, jtc->columns); + else + registerJsonTableColumn(cxt, jtc->name); + } +} + +static Node * +transformNestedJsonTableColumn(JsonTableContext *cxt, JsonTableColumn *jtc) +{ + JsonTableParent *node; + + node = transformJsonTableColumns(cxt, jtc->columns, jtc->pathspec, + jtc->location); + + return (Node *) node; +} + +static Node * +makeJsonTableSiblingJoin(Node *lnode, Node *rnode) +{ + JsonTableSibling *join = makeNode(JsonTableSibling); + + join->larg = lnode; + join->rarg = rnode; + + return (Node *) join; +} + +/* + * Recursively transform child (nested) JSON_TABLE columns. + * + * Child columns are transformed into a binary tree of union-joined + * JsonTableSiblings. + */ +static Node * +transformJsonTableChildColumns(JsonTableContext *cxt, List *columns) +{ + Node *res = NULL; + ListCell *lc; + + /* transform all nested columns into union join */ + foreach(lc, columns) + { + JsonTableColumn *jtc = castNode(JsonTableColumn, lfirst(lc)); + Node *node; + + if (jtc->coltype != JTC_NESTED) + continue; + + node = transformNestedJsonTableColumn(cxt, jtc); + + /* join transformed node with previous sibling nodes */ + res = res ? makeJsonTableSiblingJoin(res, node) : node; + } + + return res; +} + +/* Check whether type is json/jsonb, array, or record. */ +static bool +typeIsComposite(Oid typid) +{ + char typtype; + + if (typid == JSONOID || + typid == JSONBOID || + typid == RECORDOID || + type_is_array(typid)) + return true; + + typtype = get_typtype(typid); + + if (typtype == TYPTYPE_COMPOSITE) + return true; + + if (typtype == TYPTYPE_DOMAIN) + return typeIsComposite(getBaseType(typid)); + + return false; +} + +/* Append transformed non-nested JSON_TABLE columns to the TableFunc node */ +static void +appendJsonTableColumns(JsonTableContext *cxt, List *columns) +{ + ListCell *col; + ParseState *pstate = cxt->pstate; + JsonTable *jt = cxt->table; + TableFunc *tf = cxt->tablefunc; + bool errorOnError = jt->on_error && + jt->on_error->btype == JSON_BEHAVIOR_ERROR; + + foreach(col, columns) + { + JsonTableColumn *rawc = castNode(JsonTableColumn, lfirst(col)); + Oid typid; + int32 typmod; + Node *colexpr; + + if (rawc->name) + { + /* make sure column names are unique */ + ListCell *colname; + + foreach(colname, tf->colnames) + if (!strcmp((const char *) colname, rawc->name)) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("column name \"%s\" is not unique", + rawc->name), + parser_errposition(pstate, rawc->location))); + + tf->colnames = lappend(tf->colnames, + makeString(pstrdup(rawc->name))); + } + + /* + * Determine the type and typmod for the new column. FOR + * ORDINALITY columns are INTEGER by standard; the others are + * user-specified. + */ + switch (rawc->coltype) + { + case JTC_FOR_ORDINALITY: + colexpr = NULL; + typid = INT4OID; + typmod = -1; + break; + + case JTC_REGULAR: + typenameTypeIdAndMod(pstate, rawc->typeName, &typid, &typmod); + + /* + * Use implicit FORMAT JSON for composite types (arrays and + * records) + */ + if (typeIsComposite(typid)) + rawc->coltype = JTC_FORMATTED; + else if (rawc->wrapper != JSW_NONE) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("cannot use WITH WRAPPER clause with scalar columns"), + parser_errposition(pstate, rawc->location))); + else if (rawc->omit_quotes) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("cannot use OMIT QUOTES clause with scalar columns"), + parser_errposition(pstate, rawc->location))); + + /* FALLTHROUGH */ + case JTC_EXISTS: + case JTC_FORMATTED: + { + Node *je; + CaseTestExpr *param = makeNode(CaseTestExpr); + + param->collation = InvalidOid; + param->typeId = cxt->contextItemTypid; + param->typeMod = -1; + + je = transformJsonTableColumn(rawc, (Node *) param, + NIL, errorOnError); + + colexpr = transformExpr(pstate, je, EXPR_KIND_FROM_FUNCTION); + assign_expr_collations(pstate, colexpr); + + typid = exprType(colexpr); + typmod = exprTypmod(colexpr); + break; + } + + case JTC_NESTED: + continue; + + default: + elog(ERROR, "unknown JSON_TABLE column type: %d", rawc->coltype); + break; + } + + tf->coltypes = lappend_oid(tf->coltypes, typid); + tf->coltypmods = lappend_int(tf->coltypmods, typmod); + tf->colcollations = lappend_oid(tf->colcollations, + type_is_collatable(typid) + ? DEFAULT_COLLATION_OID + : InvalidOid); + tf->colvalexprs = lappend(tf->colvalexprs, colexpr); + } +} + +/* + * Create transformed JSON_TABLE parent plan node by appending all non-nested + * columns to the TableFunc node and remembering their indices in the + * colvalexprs list. + */ +static JsonTableParent * +makeParentJsonTableNode(JsonTableContext *cxt, char *pathSpec, List *columns) +{ + JsonTableParent *node = makeNode(JsonTableParent); + + node->path = makeConst(JSONPATHOID, -1, InvalidOid, -1, + DirectFunctionCall1(jsonpath_in, + CStringGetDatum(pathSpec)), + false, false); + + /* save start of column range */ + node->colMin = list_length(cxt->tablefunc->colvalexprs); + + appendJsonTableColumns(cxt, columns); + + /* save end of column range */ + node->colMax = list_length(cxt->tablefunc->colvalexprs) - 1; + + node->errorOnError = + cxt->table->on_error && + cxt->table->on_error->btype == JSON_BEHAVIOR_ERROR; + + return node; +} + +static JsonTableParent * +transformJsonTableColumns(JsonTableContext *cxt, List *columns, char *pathSpec, + int location) +{ + JsonTableParent *node; + + /* transform only non-nested columns */ + node = makeParentJsonTableNode(cxt, pathSpec, columns); + + /* transform recursively nested columns */ + node->child = transformJsonTableChildColumns(cxt, columns); + + return node; +} + +/* + * transformJsonTable - + * Transform a raw JsonTable into TableFunc. + * + * Transform the document-generating expression, the row-generating expression, + * the column-generating expressions, and the default value expressions. + */ +ParseNamespaceItem * +transformJsonTable(ParseState *pstate, JsonTable *jt) +{ + JsonTableContext cxt; + TableFunc *tf = makeNode(TableFunc); + JsonFuncExpr *jfe = makeNode(JsonFuncExpr); + JsonCommon *jscommon; + char *rootPath; + bool is_lateral; + + cxt.pstate = pstate; + cxt.table = jt; + cxt.tablefunc = tf; + cxt.pathNames = NIL; + + registerAllJsonTableColumns(&cxt, jt->columns); + + jscommon = copyObject(jt->common); + jscommon->pathspec = makeStringConst(pstrdup("$"), -1); + + jfe->op = JSON_TABLE_OP; + jfe->common = jscommon; + jfe->on_error = jt->on_error; + jfe->location = jt->common->location; + + /* + * We make lateral_only names of this level visible, whether or not the + * RangeTableFunc is explicitly marked LATERAL. This is needed for SQL + * spec compliance and seems useful on convenience grounds for all + * functions in FROM. + * + * (LATERAL can't nest within a single pstate level, so we don't need + * save/restore logic here.) + */ + Assert(!pstate->p_lateral_active); + pstate->p_lateral_active = true; + + tf->functype = TFT_JSON_TABLE; + tf->docexpr = transformExpr(pstate, (Node *) jfe, EXPR_KIND_FROM_FUNCTION); + + cxt.contextItemTypid = exprType(tf->docexpr); + + if (!IsA(jt->common->pathspec, A_Const) || + castNode(A_Const, jt->common->pathspec)->val.node.type != T_String) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("only string constants supported in JSON_TABLE path specification"), + parser_errposition(pstate, + exprLocation(jt->common->pathspec)))); + + rootPath = castNode(A_Const, jt->common->pathspec)->val.sval.sval; + + tf->plan = (Node *) transformJsonTableColumns(&cxt, jt->columns, rootPath, + jt->common->location); + + tf->ordinalitycol = -1; /* undefine ordinality column number */ + tf->location = jt->location; + + pstate->p_lateral_active = false; + + /* + * Mark the RTE as LATERAL if the user said LATERAL explicitly, or if + * there are any lateral cross-references in it. + */ + is_lateral = jt->lateral || contain_vars_of_level((Node *) tf, 0); + + return addRangeTableEntryForTableFunc(pstate, + tf, jt->alias, is_lateral, true); +} diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index 7efa5f15d7..5448cb01fa 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -1989,7 +1989,8 @@ addRangeTableEntryForTableFunc(ParseState *pstate, bool inFromCl) { RangeTblEntry *rte = makeNode(RangeTblEntry); - char *refname = alias ? alias->aliasname : pstrdup("xmltable"); + char *refname = alias ? alias->aliasname : + pstrdup(tf->functype == TFT_XMLTABLE ? "xmltable" : "json_table"); Alias *eref; int numaliases; diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index 31c576cfec..2a1d44b813 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -1993,6 +1993,9 @@ FigureColnameInternal(Node *node, char **name) case JSON_EXISTS_OP: *name = "json_exists"; return 2; + case JSON_TABLE_OP: + *name = "json_table"; + return 2; } break; default: diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c index 7811fa31e0..c55b3aae02 100644 --- a/src/backend/utils/adt/jsonpath_exec.c +++ b/src/backend/utils/adt/jsonpath_exec.c @@ -61,9 +61,11 @@ #include "catalog/pg_collation.h" #include "catalog/pg_type.h" +#include "executor/execExpr.h" #include "funcapi.h" #include "lib/stringinfo.h" #include "miscadmin.h" +#include "nodes/nodeFuncs.h" #include "regex/regex.h" #include "utils/builtins.h" #include "utils/date.h" @@ -74,6 +76,8 @@ #include "utils/guc.h" #include "utils/json.h" #include "utils/jsonpath.h" +#include "utils/lsyscache.h" +#include "utils/memutils.h" #include "utils/timestamp.h" #include "utils/varlena.h" @@ -155,6 +159,57 @@ typedef struct JsonValueListIterator ListCell *next; } JsonValueListIterator; +/* Structures for JSON_TABLE execution */ +typedef struct JsonTableScanState JsonTableScanState; +typedef struct JsonTableJoinState JsonTableJoinState; + +struct JsonTableScanState +{ + JsonTableScanState *parent; + JsonTableJoinState *nested; + MemoryContext mcxt; + JsonPath *path; + List *args; + JsonValueList found; + JsonValueListIterator iter; + Datum current; + int ordinal; + bool currentIsNull; + bool errorOnError; + bool advanceNested; + bool reset; +}; + +struct JsonTableJoinState +{ + union + { + struct + { + JsonTableJoinState *left; + JsonTableJoinState *right; + bool advanceRight; + } join; + JsonTableScanState scan; + } u; + bool is_join; +}; + +/* random number to identify JsonTableContext */ +#define JSON_TABLE_CONTEXT_MAGIC 418352867 + +typedef struct JsonTableContext +{ + int magic; + struct + { + ExprState *expr; + JsonTableScanState *scan; + } *colexprs; + JsonTableScanState root; + bool empty; +} JsonTableContext; + /* strict/lax flags is decomposed into four [un]wrap/error flags */ #define jspStrictAbsenseOfErrors(cxt) (!(cxt)->laxMode) #define jspAutoUnwrap(cxt) ((cxt)->laxMode) @@ -245,6 +300,7 @@ static JsonPathExecResult getArrayIndex(JsonPathExecContext *cxt, JsonPathItem *jsp, JsonbValue *jb, int32 *index); static JsonBaseObjectInfo setBaseObject(JsonPathExecContext *cxt, JsonbValue *jbv, int32 id); +static void JsonValueListClear(JsonValueList *jvl); static void JsonValueListAppend(JsonValueList *jvl, JsonbValue *jbv); static int JsonValueListLength(const JsonValueList *jvl); static bool JsonValueListIsEmpty(JsonValueList *jvl); @@ -262,6 +318,12 @@ static JsonbValue *wrapItemsInArray(const JsonValueList *items); static int compareDatetime(Datum val1, Oid typid1, Datum val2, Oid typid2, bool useTz, bool *have_error); + +static JsonTableJoinState *JsonTableInitPlanState(JsonTableContext *cxt, + Node *plan, JsonTableScanState *parent); +static bool JsonTableNextRow(JsonTableScanState *scan); + + /****************** User interface to JsonPath executor ********************/ /* @@ -2458,6 +2520,13 @@ setBaseObject(JsonPathExecContext *cxt, JsonbValue *jbv, int32 id) return baseObject; } +static void +JsonValueListClear(JsonValueList *jvl) +{ + jvl->singleton = NULL; + jvl->list = NULL; +} + static void JsonValueListAppend(JsonValueList *jvl, JsonbValue *jbv) { @@ -3067,3 +3136,370 @@ JsonItemFromDatum(Datum val, Oid typid, int32 typmod, JsonbValue *res) "casted to supported jsonpath types."))); } } + +/************************ JSON_TABLE functions ***************************/ + +/* + * Returns private data from executor state. Ensure validity by check with + * MAGIC number. + */ +static inline JsonTableContext * +GetJsonTableContext(TableFuncScanState *state, const char *fname) +{ + JsonTableContext *result; + + if (!IsA(state, TableFuncScanState)) + elog(ERROR, "%s called with invalid TableFuncScanState", fname); + result = (JsonTableContext *) state->opaque; + if (result->magic != JSON_TABLE_CONTEXT_MAGIC) + elog(ERROR, "%s called with invalid TableFuncScanState", fname); + + return result; +} + +/* Recursively initialize JSON_TABLE scan state */ +static void +JsonTableInitScanState(JsonTableContext *cxt, JsonTableScanState *scan, + JsonTableParent *node, JsonTableScanState *parent, + List *args, MemoryContext mcxt) +{ + int i; + + scan->parent = parent; + scan->errorOnError = node->errorOnError; + scan->path = DatumGetJsonPathP(node->path->constvalue); + scan->args = args; + scan->mcxt = AllocSetContextCreate(mcxt, "JsonTableContext", + ALLOCSET_DEFAULT_SIZES); + scan->nested = node->child ? + JsonTableInitPlanState(cxt, node->child, scan) : NULL; + scan->current = PointerGetDatum(NULL); + scan->currentIsNull = true; + + for (i = node->colMin; i <= node->colMax; i++) + cxt->colexprs[i].scan = scan; +} + +/* Recursively initialize JSON_TABLE scan state */ +static JsonTableJoinState * +JsonTableInitPlanState(JsonTableContext *cxt, Node *plan, + JsonTableScanState *parent) +{ + JsonTableJoinState *state = palloc0(sizeof(*state)); + + if (IsA(plan, JsonTableSibling)) + { + JsonTableSibling *join = castNode(JsonTableSibling, plan); + + state->is_join = true; + state->u.join.left = JsonTableInitPlanState(cxt, join->larg, parent); + state->u.join.right = JsonTableInitPlanState(cxt, join->rarg, parent); + } + else + { + JsonTableParent *node = castNode(JsonTableParent, plan); + + state->is_join = false; + + JsonTableInitScanState(cxt, &state->u.scan, node, parent, + parent->args, parent->mcxt); + } + + return state; +} + +/* + * JsonTableInitOpaque + * Fill in TableFuncScanState->opaque for JsonTable processor + */ +static void +JsonTableInitOpaque(TableFuncScanState *state, int natts) +{ + JsonTableContext *cxt; + PlanState *ps = &state->ss.ps; + TableFuncScan *tfs = castNode(TableFuncScan, ps->plan); + TableFunc *tf = tfs->tablefunc; + JsonExpr *ci = castNode(JsonExpr, tf->docexpr); + JsonTableParent *root = castNode(JsonTableParent, tf->plan); + List *args = NIL; + ListCell *lc; + int i; + + cxt = palloc0(sizeof(JsonTableContext)); + cxt->magic = JSON_TABLE_CONTEXT_MAGIC; + + if (ci->passing_values) + { + ListCell *exprlc; + ListCell *namelc; + + forboth(exprlc, ci->passing_values, + namelc, ci->passing_names) + { + Expr *expr = (Expr *) lfirst(exprlc); + String *name = lfirst_node(String, namelc); + JsonPathVariableEvalContext *var = palloc(sizeof(*var)); + + var->name = pstrdup(name->sval); + var->typid = exprType((Node *) expr); + var->typmod = exprTypmod((Node *) expr); + var->estate = ExecInitExpr(expr, ps); + var->econtext = ps->ps_ExprContext; + var->mcxt = CurrentMemoryContext; + var->evaluated = false; + var->value = (Datum) 0; + var->isnull = true; + + args = lappend(args, var); + } + } + + cxt->colexprs = palloc(sizeof(*cxt->colexprs) * + list_length(tf->colvalexprs)); + + JsonTableInitScanState(cxt, &cxt->root, root, NULL, args, + CurrentMemoryContext); + + i = 0; + + foreach(lc, tf->colvalexprs) + { + Expr *expr = lfirst(lc); + + cxt->colexprs[i].expr = + ExecInitExprWithCaseValue(expr, ps, + &cxt->colexprs[i].scan->current, + &cxt->colexprs[i].scan->currentIsNull); + + i++; + } + + state->opaque = cxt; +} + +/* Reset scan iterator to the beginning of the item list */ +static void +JsonTableRescan(JsonTableScanState *scan) +{ + JsonValueListInitIterator(&scan->found, &scan->iter); + scan->current = PointerGetDatum(NULL); + scan->currentIsNull = true; + scan->advanceNested = false; + scan->ordinal = 0; +} + +/* Reset context item of a scan, execute JSON path and reset a scan */ +static void +JsonTableResetContextItem(JsonTableScanState *scan, Datum item) +{ + MemoryContext oldcxt; + JsonPathExecResult res; + Jsonb *js = (Jsonb *) DatumGetJsonbP(item); + + JsonValueListClear(&scan->found); + + MemoryContextResetOnly(scan->mcxt); + + oldcxt = MemoryContextSwitchTo(scan->mcxt); + + res = executeJsonPath(scan->path, scan->args, EvalJsonPathVar, js, + scan->errorOnError, &scan->found, false /* FIXME */); + + MemoryContextSwitchTo(oldcxt); + + if (jperIsError(res)) + { + Assert(!scan->errorOnError); + JsonValueListClear(&scan->found); /* EMPTY ON ERROR case */ + } + + JsonTableRescan(scan); +} + +/* + * JsonTableSetDocument + * Install the input document + */ +static void +JsonTableSetDocument(TableFuncScanState *state, Datum value) +{ + JsonTableContext *cxt = GetJsonTableContext(state, "JsonTableSetDocument"); + + JsonTableResetContextItem(&cxt->root, value); +} + +/* + * Fetch next row from a union joined scan. + * + * Returns false at the end of a scan, true otherwise. + */ +static bool +JsonTableNextJoinRow(JsonTableJoinState *state) +{ + if (!state->is_join) + return JsonTableNextRow(&state->u.scan); + + if (!state->u.join.advanceRight) + { + /* fetch next outer row */ + if (JsonTableNextJoinRow(state->u.join.left)) + return true; + + state->u.join.advanceRight = true; /* next inner row */ + } + + /* fetch next inner row */ + return JsonTableNextJoinRow(state->u.join.right); +} + +/* Recursively set 'reset' flag of scan and its child nodes */ +static void +JsonTableJoinReset(JsonTableJoinState *state) +{ + if (state->is_join) + { + JsonTableJoinReset(state->u.join.left); + JsonTableJoinReset(state->u.join.right); + state->u.join.advanceRight = false; + } + else + { + state->u.scan.reset = true; + state->u.scan.advanceNested = false; + + if (state->u.scan.nested) + JsonTableJoinReset(state->u.scan.nested); + } +} + +/* + * Fetch next row from a simple scan with outer joined nested subscans. + * + * Returns false at the end of a scan, true otherwise. + */ +static bool +JsonTableNextRow(JsonTableScanState *scan) +{ + JsonbValue *jbv; + MemoryContext oldcxt; + + /* reset context item if requested */ + if (scan->reset) + { + Assert(!scan->parent->currentIsNull); + JsonTableResetContextItem(scan, scan->parent->current); + scan->reset = false; + } + + if (scan->advanceNested) + { + /* fetch next nested row */ + if (JsonTableNextJoinRow(scan->nested)) + return true; + + scan->advanceNested = false; + } + + /* fetch next row */ + jbv = JsonValueListNext(&scan->found, &scan->iter); + + if (!jbv) + { + scan->current = PointerGetDatum(NULL); + scan->currentIsNull = true; + return false; /* end of scan */ + } + + /* set current row item */ + oldcxt = MemoryContextSwitchTo(scan->mcxt); + scan->current = JsonbPGetDatum(JsonbValueToJsonb(jbv)); + scan->currentIsNull = false; + MemoryContextSwitchTo(oldcxt); + + scan->ordinal++; + + if (scan->nested) + { + JsonTableJoinReset(scan->nested); + scan->advanceNested = JsonTableNextJoinRow(scan->nested); + } + + return true; +} + +/* + * JsonTableFetchRow + * Prepare the next "current" tuple for upcoming GetValue calls. + * Returns FALSE if the row-filter expression returned no more rows. + */ +static bool +JsonTableFetchRow(TableFuncScanState *state) +{ + JsonTableContext *cxt = GetJsonTableContext(state, "JsonTableFetchRow"); + + if (cxt->empty) + return false; + + return JsonTableNextRow(&cxt->root); +} + +/* + * JsonTableGetValue + * Return the value for column number 'colnum' for the current row. + * + * This leaks memory, so be sure to reset often the context in which it's + * called. + */ +static Datum +JsonTableGetValue(TableFuncScanState *state, int colnum, + Oid typid, int32 typmod, bool *isnull) +{ + JsonTableContext *cxt = GetJsonTableContext(state, "JsonTableGetValue"); + ExprContext *econtext = state->ss.ps.ps_ExprContext; + ExprState *estate = cxt->colexprs[colnum].expr; + JsonTableScanState *scan = cxt->colexprs[colnum].scan; + Datum result; + + if (scan->currentIsNull) /* NULL from outer/union join */ + { + result = (Datum) 0; + *isnull = true; + } + else if (estate) /* regular column */ + { + result = ExecEvalExpr(estate, econtext, isnull); + } + else + { + result = Int32GetDatum(scan->ordinal); /* ordinality column */ + *isnull = false; + } + + return result; +} + +/* + * JsonTableDestroyOpaque + */ +static void +JsonTableDestroyOpaque(TableFuncScanState *state) +{ + JsonTableContext *cxt = GetJsonTableContext(state, "JsonTableDestroyOpaque"); + + /* not valid anymore */ + cxt->magic = 0; + + state->opaque = NULL; +} + +const TableFuncRoutine JsonbTableRoutine = +{ + JsonTableInitOpaque, + JsonTableSetDocument, + NULL, + NULL, + NULL, + JsonTableFetchRow, + JsonTableGetValue, + JsonTableDestroyOpaque +}; diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 4458d2ff90..e6173a9db4 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -503,6 +503,8 @@ static char *flatten_reloptions(Oid relid); static void get_reloptions(StringInfo buf, Datum reloptions); static void get_json_path_spec(Node *path_spec, deparse_context *context, bool showimplicit); +static void get_json_table_columns(TableFunc *tf, JsonTableParent *node, + deparse_context *context, bool showimplicit); #define only_marker(rte) ((rte)->inh ? "" : "ONLY ") @@ -8516,7 +8518,8 @@ get_json_behavior(JsonBehavior *behavior, deparse_context *context, /* * get_json_expr_options * - * Parse back common options for JSON_QUERY, JSON_VALUE, JSON_EXISTS. + * Parse back common options for JSON_QUERY, JSON_VALUE, JSON_EXISTS and + * JSON_TABLE columns. */ static void get_json_expr_options(JsonExpr *jsexpr, deparse_context *context, @@ -9763,6 +9766,9 @@ get_rule_expr(Node *node, deparse_context *context, case JSON_EXISTS_OP: appendStringInfoString(buf, "JSON_EXISTS("); break; + default: + elog(ERROR, "unexpected JsonExpr type: %d", jexpr->op); + break; } get_rule_expr(jexpr->formatted_expr, context, showimplicit); @@ -11039,16 +11045,14 @@ get_sublink_expr(SubLink *sublink, deparse_context *context) /* ---------- - * get_tablefunc - Parse back a table function + * get_xmltable - Parse back a XMLTABLE function * ---------- */ static void -get_tablefunc(TableFunc *tf, deparse_context *context, bool showimplicit) +get_xmltable(TableFunc *tf, deparse_context *context, bool showimplicit) { StringInfo buf = context->buf; - /* XMLTABLE is the only existing implementation. */ - appendStringInfoString(buf, "XMLTABLE("); if (tf->ns_uris != NIL) @@ -11139,6 +11143,220 @@ get_tablefunc(TableFunc *tf, deparse_context *context, bool showimplicit) appendStringInfoChar(buf, ')'); } +/* + * get_json_nested_columns - Parse back nested JSON_TABLE columns + */ +static void +get_json_table_nested_columns(TableFunc *tf, Node *node, + deparse_context *context, bool showimplicit, + bool needcomma) +{ + if (IsA(node, JsonTableSibling)) + { + JsonTableSibling *n = (JsonTableSibling *) node; + + get_json_table_nested_columns(tf, n->larg, context, showimplicit, + needcomma); + get_json_table_nested_columns(tf, n->rarg, context, showimplicit, true); + } + else + { + JsonTableParent *n = castNode(JsonTableParent, node); + + if (needcomma) + appendStringInfoChar(context->buf, ','); + + appendStringInfoChar(context->buf, ' '); + appendContextKeyword(context, "NESTED PATH ", 0, 0, 0); + get_const_expr(n->path, context, -1); + get_json_table_columns(tf, n, context, showimplicit); + } +} + +/* + * get_json_table_columns - Parse back JSON_TABLE columns + */ +static void +get_json_table_columns(TableFunc *tf, JsonTableParent *node, + deparse_context *context, bool showimplicit) +{ + StringInfo buf = context->buf; + JsonExpr *jexpr = castNode(JsonExpr, tf->docexpr); + ListCell *lc_colname; + ListCell *lc_coltype; + ListCell *lc_coltypmod; + ListCell *lc_colvarexpr; + int colnum = 0; + + appendStringInfoChar(buf, ' '); + appendContextKeyword(context, "COLUMNS (", 0, 0, 0); + + if (PRETTY_INDENT(context)) + context->indentLevel += PRETTYINDENT_VAR; + + forfour(lc_colname, tf->colnames, + lc_coltype, tf->coltypes, + lc_coltypmod, tf->coltypmods, + lc_colvarexpr, tf->colvalexprs) + { + char *colname = strVal(lfirst(lc_colname)); + JsonExpr *colexpr; + Oid typid; + int32 typmod; + bool ordinality; + JsonBehaviorType default_behavior; + + typid = lfirst_oid(lc_coltype); + typmod = lfirst_int(lc_coltypmod); + colexpr = castNode(JsonExpr, lfirst(lc_colvarexpr)); + + if (colnum < node->colMin) + { + colnum++; + continue; + } + + if (colnum > node->colMax) + break; + + if (colnum > node->colMin) + appendStringInfoString(buf, ", "); + + colnum++; + + ordinality = !colexpr; + + appendContextKeyword(context, "", 0, 0, 0); + + appendStringInfo(buf, "%s %s", quote_identifier(colname), + ordinality ? "FOR ORDINALITY" : + format_type_with_typemod(typid, typmod)); + if (ordinality) + continue; + + if (colexpr->op == JSON_EXISTS_OP) + { + appendStringInfoString(buf, " EXISTS"); + default_behavior = JSON_BEHAVIOR_FALSE; + } + else + { + if (colexpr->op == JSON_QUERY_OP) + { + char typcategory; + bool typispreferred; + + get_type_category_preferred(typid, &typcategory, &typispreferred); + + if (typcategory == TYPCATEGORY_STRING) + appendStringInfoString(buf, + colexpr->format->format_type == JS_FORMAT_JSONB ? + " FORMAT JSONB" : " FORMAT JSON"); + } + + default_behavior = JSON_BEHAVIOR_NULL; + } + + if (jexpr->on_error->btype == JSON_BEHAVIOR_ERROR) + default_behavior = JSON_BEHAVIOR_ERROR; + + appendStringInfoString(buf, " PATH "); + + get_json_path_spec(colexpr->path_spec, context, showimplicit); + + get_json_expr_options(colexpr, context, default_behavior); + } + + if (node->child) + get_json_table_nested_columns(tf, node->child, context, showimplicit, + node->colMax >= node->colMin); + + if (PRETTY_INDENT(context)) + context->indentLevel -= PRETTYINDENT_VAR; + + appendContextKeyword(context, ")", 0, 0, 0); +} + +/* ---------- + * get_json_table - Parse back a JSON_TABLE function + * ---------- + */ +static void +get_json_table(TableFunc *tf, deparse_context *context, bool showimplicit) +{ + StringInfo buf = context->buf; + JsonExpr *jexpr = castNode(JsonExpr, tf->docexpr); + JsonTableParent *root = castNode(JsonTableParent, tf->plan); + + appendStringInfoString(buf, "JSON_TABLE("); + + if (PRETTY_INDENT(context)) + context->indentLevel += PRETTYINDENT_VAR; + + appendContextKeyword(context, "", 0, 0, 0); + + get_rule_expr(jexpr->formatted_expr, context, showimplicit); + + appendStringInfoString(buf, ", "); + + get_const_expr(root->path, context, -1); + + if (jexpr->passing_values) + { + ListCell *lc1, *lc2; + bool needcomma = false; + + appendStringInfoChar(buf, ' '); + appendContextKeyword(context, "PASSING ", 0, 0, 0); + + if (PRETTY_INDENT(context)) + context->indentLevel += PRETTYINDENT_VAR; + + forboth(lc1, jexpr->passing_names, + lc2, jexpr->passing_values) + { + if (needcomma) + appendStringInfoString(buf, ", "); + needcomma = true; + + appendContextKeyword(context, "", 0, 0, 0); + + get_rule_expr((Node *) lfirst(lc2), context, false); + appendStringInfo(buf, " AS %s", + quote_identifier((lfirst_node(String, lc1))->sval) + ); + } + + if (PRETTY_INDENT(context)) + context->indentLevel -= PRETTYINDENT_VAR; + } + + get_json_table_columns(tf, root, context, showimplicit); + + if (jexpr->on_error->btype != JSON_BEHAVIOR_EMPTY) + get_json_behavior(jexpr->on_error, context, "ERROR"); + + if (PRETTY_INDENT(context)) + context->indentLevel -= PRETTYINDENT_VAR; + + appendContextKeyword(context, ")", 0, 0, 0); +} + +/* ---------- + * get_tablefunc - Parse back a table function + * ---------- + */ +static void +get_tablefunc(TableFunc *tf, deparse_context *context, bool showimplicit) +{ + /* XMLTABLE and JSON_TABLE are the only existing implementations. */ + + if (tf->functype == TFT_XMLTABLE) + get_xmltable(tf, context, showimplicit); + else if (tf->functype == TFT_JSON_TABLE) + get_json_table(tf, context, showimplicit); +} + /* ---------- * get_from_clause - Parse back a FROM clause * diff --git a/src/backend/utils/misc/queryjumble.c b/src/backend/utils/misc/queryjumble.c index 7120836c70..2ffa014618 100644 --- a/src/backend/utils/misc/queryjumble.c +++ b/src/backend/utils/misc/queryjumble.c @@ -878,9 +878,11 @@ JumbleExpr(JumbleState *jstate, Node *node) { TableFunc *tablefunc = (TableFunc *) node; + APP_JUMB(tablefunc->functype); JumbleExpr(jstate, tablefunc->docexpr); JumbleExpr(jstate, tablefunc->rowexpr); JumbleExpr(jstate, (Node *) tablefunc->colexprs); + JumbleExpr(jstate, (Node *) tablefunc->colvalexprs); } break; case T_TableSampleClause: diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h index 9ce8df17e5..9df70e6f06 100644 --- a/src/include/executor/execExpr.h +++ b/src/include/executor/execExpr.h @@ -850,6 +850,10 @@ extern Datum ExecPrepareJsonItemCoercion(struct JsonbValue *item, struct JsonCoercionState **pjcstate); extern bool ExecEvalJsonNeedsSubTransaction(JsonExpr *jsexpr, struct JsonCoercionsState *); +extern Datum ExecEvalExprPassingCaseValue(ExprState *estate, + ExprContext *econtext, bool *isnull, + Datum caseval_datum, + bool caseval_isnull); extern void ExecAggInitGroup(AggState *aggstate, AggStatePerTrans pertrans, AggStatePerGroup pergroup, ExprContext *aggcontext); diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index 53f6b05a3f..aefce33e28 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -212,6 +212,8 @@ typedef enum NodeTag T_JsonExpr, T_JsonCoercion, T_JsonItemCoercions, + T_JsonTableParent, + T_JsonTableSibling, /* * TAGS FOR EXPRESSION STATE NODES (execnodes.h) @@ -514,6 +516,8 @@ typedef enum NodeTag T_JsonArrayAgg, T_JsonFuncExpr, T_JsonIsPredicate, + T_JsonTable, + T_JsonTableColumn, T_JsonCommon, T_JsonArgument, T_JsonKeyValue, diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 8a9ccf6221..e58211eac1 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1605,6 +1605,19 @@ typedef enum JsonQuotes JS_QUOTES_OMIT /* OMIT QUOTES */ } JsonQuotes; +/* + * JsonTableColumnType - + * enumeration of JSON_TABLE column types + */ +typedef enum +{ + JTC_FOR_ORDINALITY, + JTC_REGULAR, + JTC_EXISTS, + JTC_FORMATTED, + JTC_NESTED, +} JsonTableColumnType; + /* * JsonPathSpec - * representation of JSON path constant @@ -1664,6 +1677,41 @@ typedef struct JsonFuncExpr int location; /* token location, or -1 if unknown */ } JsonFuncExpr; +/* + * JsonTableColumn - + * untransformed representation of JSON_TABLE column + */ +typedef struct JsonTableColumn +{ + NodeTag type; + JsonTableColumnType coltype; /* column type */ + char *name; /* column name */ + TypeName *typeName; /* column type name */ + JsonPathSpec pathspec; /* path specification, if any */ + JsonFormat *format; /* JSON format clause, if specified */ + JsonWrapper wrapper; /* WRAPPER behavior for formatted columns */ + bool omit_quotes; /* omit or keep quotes on scalar strings? */ + List *columns; /* nested columns */ + JsonBehavior *on_empty; /* ON EMPTY behavior */ + JsonBehavior *on_error; /* ON ERROR behavior */ + int location; /* token location, or -1 if unknown */ +} JsonTableColumn; + +/* + * JsonTable - + * untransformed representation of JSON_TABLE + */ +typedef struct JsonTable +{ + NodeTag type; + JsonCommon *common; /* common JSON path syntax fields */ + List *columns; /* list of JsonTableColumn */ + JsonBehavior *on_error; /* ON ERROR behavior, if specified */ + Alias *alias; /* table alias in FROM clause */ + bool lateral; /* does it have LATERAL prefix? */ + int location; /* token location, or -1 if unknown */ +} JsonTable; + /* * JsonKeyValue - * untransformed representation of JSON object key-value pair for diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index 439a16aa62..290898cfd7 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -73,8 +73,14 @@ typedef struct RangeVar int location; /* token location, or -1 if unknown */ } RangeVar; +typedef enum TableFuncType +{ + TFT_XMLTABLE, + TFT_JSON_TABLE +} TableFuncType; + /* - * TableFunc - node for a table function, such as XMLTABLE. + * TableFunc - node for a table function, such as XMLTABLE or JSON_TABLE. * * Entries in the ns_names list are either String nodes containing * literal namespace names, or NULL pointers to represent DEFAULT. @@ -82,6 +88,7 @@ typedef struct RangeVar typedef struct TableFunc { NodeTag type; + TableFuncType functype; /* XMLTABLE or JSON_TABLE */ List *ns_uris; /* list of namespace URI expressions */ List *ns_names; /* list of namespace names or NULL */ Node *docexpr; /* input document expression */ @@ -92,7 +99,9 @@ typedef struct TableFunc List *colcollations; /* OID list of column collation OIDs */ List *colexprs; /* list of column filter expressions */ List *coldefexprs; /* list of column default expressions */ + List *colvalexprs; /* list of column value expressions */ Bitmapset *notnulls; /* nullability flag for each output column */ + Node *plan; /* JSON_TABLE plan */ int ordinalitycol; /* counts from 0; -1 if none specified */ int location; /* token location, or -1 if unknown */ } TableFunc; @@ -1241,7 +1250,8 @@ typedef enum JsonExprOp { JSON_VALUE_OP, /* JSON_VALUE() */ JSON_QUERY_OP, /* JSON_QUERY() */ - JSON_EXISTS_OP /* JSON_EXISTS() */ + JSON_EXISTS_OP, /* JSON_EXISTS() */ + JSON_TABLE_OP /* JSON_TABLE() */ } JsonExprOp; /* @@ -1455,6 +1465,31 @@ typedef struct JsonExpr int location; /* token location, or -1 if unknown */ } JsonExpr; +/* + * JsonTableParent - + * transformed representation of parent JSON_TABLE plan node + */ +typedef struct JsonTableParent +{ + NodeTag type; + Const *path; /* jsonpath constant */ + Node *child; /* nested columns, if any */ + int colMin; /* min column index in the resulting column list */ + int colMax; /* max column index in the resulting column list */ + bool errorOnError; /* ERROR/EMPTY ON ERROR behavior */ +} JsonTableParent; + +/* + * JsonTableSibling - + * transformed representation of joined sibling JSON_TABLE plan node + */ +typedef struct JsonTableSibling +{ + NodeTag type; + Node *larg; /* left join node */ + Node *rarg; /* right join node */ +} JsonTableSibling; + /* ---------------- * NullTest * diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index a73032b319..9097ce7b26 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -241,6 +241,7 @@ PG_KEYWORD("json_objectagg", JSON_OBJECTAGG, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_query", JSON_QUERY, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_scalar", JSON_SCALAR, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_serialize", JSON_SERIALIZE, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_table", JSON_TABLE, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_value", JSON_VALUE, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("keep", KEEP, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("key", KEY, UNRESERVED_KEYWORD, BARE_LABEL) @@ -283,6 +284,7 @@ PG_KEYWORD("names", NAMES, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("national", NATIONAL, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("natural", NATURAL, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("nchar", NCHAR, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("nested", NESTED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("new", NEW, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("next", NEXT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("nfc", NFC, UNRESERVED_KEYWORD, BARE_LABEL) @@ -332,6 +334,7 @@ PG_KEYWORD("partial", PARTIAL, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("partition", PARTITION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("passing", PASSING, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("password", PASSWORD, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("path", PATH, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("placing", PLACING, RESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("plans", PLANS, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("policy", POLICY, UNRESERVED_KEYWORD, BARE_LABEL) diff --git a/src/include/parser/parse_clause.h b/src/include/parser/parse_clause.h index 2495c30034..e86b002392 100644 --- a/src/include/parser/parse_clause.h +++ b/src/include/parser/parse_clause.h @@ -51,4 +51,7 @@ extern List *addTargetToSortList(ParseState *pstate, TargetEntry *tle, extern Index assignSortGroupRef(TargetEntry *tle, List *tlist); extern bool targetIsInSortList(TargetEntry *tle, Oid sortop, List *sortList); +/* functions in parse_jsontable.c */ +extern ParseNamespaceItem *transformJsonTable(ParseState *pstate, JsonTable *jt); + #endif /* PARSE_CLAUSE_H */ diff --git a/src/include/utils/jsonpath.h b/src/include/utils/jsonpath.h index 98a61d7f72..1897ddffa6 100644 --- a/src/include/utils/jsonpath.h +++ b/src/include/utils/jsonpath.h @@ -15,6 +15,7 @@ #define JSONPATH_H #include "fmgr.h" +#include "executor/tablefunc.h" #include "nodes/pg_list.h" #include "nodes/primnodes.h" #include "utils/jsonb.h" @@ -263,6 +264,7 @@ typedef struct JsonPathVariableEvalContext int32 typmod; struct ExprContext *econtext; struct ExprState *estate; + MemoryContext mcxt; /* memory context for cached value */ Datum value; bool isnull; bool evaluated; @@ -281,4 +283,6 @@ extern JsonbValue *JsonPathValue(Datum jb, JsonPath *jp, bool *empty, extern int EvalJsonPathVar(void *vars, char *varName, int varNameLen, JsonbValue *val, JsonbValue *baseObject); +extern const TableFuncRoutine JsonbTableRoutine; + #endif diff --git a/src/test/regress/expected/json_sqljson.out b/src/test/regress/expected/json_sqljson.out index bb62634314..5c4dfa5f7c 100644 --- a/src/test/regress/expected/json_sqljson.out +++ b/src/test/regress/expected/json_sqljson.out @@ -13,3 +13,9 @@ SELECT JSON_QUERY(NULL FORMAT JSON, '$'); ERROR: JSON_QUERY() is not yet implemented for json type LINE 1: SELECT JSON_QUERY(NULL FORMAT JSON, '$'); ^ +-- JSON_TABLE +SELECT * FROM JSON_TABLE(NULL FORMAT JSON, '$' COLUMNS (foo text)); +ERROR: JSON_TABLE() is not yet implemented for json type +LINE 1: SELECT * FROM JSON_TABLE(NULL FORMAT JSON, '$' COLUMNS (foo ... + ^ +HINT: Try casting the argument to jsonb diff --git a/src/test/regress/expected/jsonb_sqljson.out b/src/test/regress/expected/jsonb_sqljson.out index 3661b7a810..144cc0c557 100644 --- a/src/test/regress/expected/jsonb_sqljson.out +++ b/src/test/regress/expected/jsonb_sqljson.out @@ -1020,3 +1020,565 @@ CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, 0 to $.a ? (@.dateti ERROR: functions in index expression must be marked IMMUTABLE CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, $.a ? (@.datetime("HH:MI") == $x)]' PASSING '12:34'::time AS x)); DROP TABLE test_jsonb_mutability; +-- JSON_TABLE +-- Should fail (JSON_TABLE can be used only in FROM clause) +SELECT JSON_TABLE('[]', '$'); +ERROR: syntax error at or near "(" +LINE 1: SELECT JSON_TABLE('[]', '$'); + ^ +-- Should fail (no columns) +SELECT * FROM JSON_TABLE(NULL, '$' COLUMNS ()); +ERROR: syntax error at or near ")" +LINE 1: SELECT * FROM JSON_TABLE(NULL, '$' COLUMNS ()); + ^ +-- NULL => empty table +SELECT * FROM JSON_TABLE(NULL::jsonb, '$' COLUMNS (foo int)) bar; + foo +----- +(0 rows) + +-- +SELECT * FROM JSON_TABLE(jsonb '123', '$' + COLUMNS (item int PATH '$', foo int)) bar; + item | foo +------+----- + 123 | +(1 row) + +-- JSON_TABLE: basic functionality +CREATE DOMAIN jsonb_test_domain AS text CHECK (value <> 'foo'); +SELECT * +FROM + (VALUES + ('1'), + ('[]'), + ('{}'), + ('[1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""]') + ) vals(js) + LEFT OUTER JOIN +-- JSON_TABLE is implicitly lateral + JSON_TABLE( + vals.js::jsonb, 'lax $[*]' + COLUMNS ( + id FOR ORDINALITY, + id2 FOR ORDINALITY, -- allowed additional ordinality columns + "int" int PATH '$', + "text" text PATH '$', + "char(4)" char(4) PATH '$', + "bool" bool PATH '$', + "numeric" numeric PATH '$', + "domain" jsonb_test_domain PATH '$', + js json PATH '$', + jb jsonb PATH '$', + jst text FORMAT JSON PATH '$', + jsc char(4) FORMAT JSON PATH '$', + jsv varchar(4) FORMAT JSON PATH '$', + jsb jsonb FORMAT JSON PATH '$', + jsbq jsonb FORMAT JSON PATH '$' OMIT QUOTES, + aaa int, -- implicit path '$."aaa"', + aaa1 int PATH '$.aaa', + exists1 bool EXISTS PATH '$.aaa', + exists2 int EXISTS PATH '$.aaa', + exists3 int EXISTS PATH 'strict $.aaa' UNKNOWN ON ERROR, + exists4 text EXISTS PATH 'strict $.aaa' FALSE ON ERROR, + js2 json PATH '$', + jsb2w jsonb PATH '$' WITH WRAPPER, + jsb2q jsonb PATH '$' OMIT QUOTES, + ia int[] PATH '$', + ta text[] PATH '$', + jba jsonb[] PATH '$' + ) + ) jt + ON true; + js | id | id2 | int | text | char(4) | bool | numeric | domain | js | jb | jst | jsc | jsv | jsb | jsbq | aaa | aaa1 | exists1 | exists2 | exists3 | exists4 | js2 | jsb2w | jsb2q | ia | ta | jba +---------------------------------------------------------------------------------------+----+-----+-----+---------+---------+------+---------+---------+--------------+--------------+--------------+------+------+--------------+--------------+-----+------+---------+---------+---------+---------+--------------+----------------+--------------+----+----+----- + 1 | 1 | 1 | 1 | 1 | 1 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | | | f | 0 | | false | 1 | [1] | 1 | | | + [] | | | | | | | | | | | | | | | | | | | | | | | | | | | + {} | 1 | 1 | | | | | | | {} | {} | {} | {} | {} | {} | {} | | | f | 0 | | false | {} | [{}] | {} | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 1 | 1 | 1 | 1 | 1 | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | | | f | 0 | | false | 1 | [1] | 1 | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 2 | 2 | 1 | 1.23 | 1.23 | | 1.23 | 1.23 | 1.23 | 1.23 | 1.23 | 1.23 | 1.23 | 1.23 | 1.23 | | | f | 0 | | false | 1.23 | [1.23] | 1.23 | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 3 | 3 | 2 | 2 | 2 | | 2 | 2 | "2" | "2" | "2" | "2" | "2" | "2" | 2 | | | f | 0 | | false | "2" | ["2"] | 2 | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 4 | 4 | | aaaaaaa | aaaa | | | aaaaaaa | "aaaaaaa" | "aaaaaaa" | "aaaaaaa" | "aaa | "aaa | "aaaaaaa" | | | | f | 0 | | false | "aaaaaaa" | ["aaaaaaa"] | | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 5 | 5 | | foo | foo | | | | "foo" | "foo" | "foo" | "foo | "foo | "foo" | | | | f | 0 | | false | "foo" | ["foo"] | | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 6 | 6 | | | | | | | null | null | null | null | null | null | null | | | f | 0 | | false | null | [null] | null | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 7 | 7 | 0 | false | fals | f | | false | false | false | false | fals | fals | false | false | | | f | 0 | | false | false | [false] | false | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 8 | 8 | 1 | true | true | t | | true | true | true | true | true | true | true | true | | | f | 0 | | false | true | [true] | true | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 9 | 9 | | | | | | | {"aaa": 123} | {"aaa": 123} | {"aaa": 123} | {"aa | {"aa | {"aaa": 123} | {"aaa": 123} | 123 | 123 | t | 1 | 1 | true | {"aaa": 123} | [{"aaa": 123}] | {"aaa": 123} | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 10 | 10 | | [1,2] | [1,2 | | | [1,2] | "[1,2]" | "[1,2]" | "[1,2]" | "[1, | "[1, | "[1,2]" | [1, 2] | | | f | 0 | | false | "[1,2]" | ["[1,2]"] | [1, 2] | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 11 | 11 | | "str" | "str | | | "str" | "\"str\"" | "\"str\"" | "\"str\"" | "\"s | "\"s | "\"str\"" | "str" | | | f | 0 | | false | "\"str\"" | ["\"str\""] | "str" | | | +(14 rows) + +-- JSON_TABLE: Test backward parsing +CREATE VIEW jsonb_table_view AS +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + id FOR ORDINALITY, + id2 FOR ORDINALITY, -- allowed additional ordinality columns + "int" int PATH '$', + "text" text PATH '$', + "char(4)" char(4) PATH '$', + "bool" bool PATH '$', + "numeric" numeric PATH '$', + "domain" jsonb_test_domain PATH '$', + js json PATH '$', + jb jsonb PATH '$', + jst text FORMAT JSON PATH '$', + jsc char(4) FORMAT JSON PATH '$', + jsv varchar(4) FORMAT JSON PATH '$', + jsb jsonb FORMAT JSON PATH '$', + jsbq jsonb FORMAT JSON PATH '$' OMIT QUOTES, + aaa int, -- implicit path '$."aaa"', + aaa1 int PATH '$.aaa', + exists1 bool EXISTS PATH '$.aaa', + exists2 int EXISTS PATH '$.aaa' TRUE ON ERROR, + exists3 text EXISTS PATH 'strict $.aaa' UNKNOWN ON ERROR, + js2 json PATH '$', + jsb2w jsonb PATH '$' WITH WRAPPER, + jsb2q jsonb PATH '$' OMIT QUOTES, + ia int[] PATH '$', + ta text[] PATH '$', + jba jsonb[] PATH '$', + NESTED PATH '$[1]' COLUMNS ( + a1 int, + NESTED PATH '$[*]' COLUMNS ( + a11 text + ), + b1 text + ), + NESTED PATH '$[2]' COLUMNS ( + NESTED PATH '$[*]' COLUMNS ( + a21 text + ), + NESTED PATH '$[*]' COLUMNS ( + a22 text + ) + ) + ) + ); +\sv jsonb_table_view +CREATE OR REPLACE VIEW public.jsonb_table_view AS + SELECT "json_table".id, + "json_table".id2, + "json_table"."int", + "json_table".text, + "json_table"."char(4)", + "json_table".bool, + "json_table"."numeric", + "json_table".domain, + "json_table".js, + "json_table".jb, + "json_table".jst, + "json_table".jsc, + "json_table".jsv, + "json_table".jsb, + "json_table".jsbq, + "json_table".aaa, + "json_table".aaa1, + "json_table".exists1, + "json_table".exists2, + "json_table".exists3, + "json_table".js2, + "json_table".jsb2w, + "json_table".jsb2q, + "json_table".ia, + "json_table".ta, + "json_table".jba, + "json_table".a1, + "json_table".b1, + "json_table".a11, + "json_table".a21, + "json_table".a22 + FROM JSON_TABLE( + 'null'::jsonb, '$[*]' + PASSING + 1 + 2 AS a, + '"foo"'::json AS "b c" + COLUMNS ( + id FOR ORDINALITY, + id2 FOR ORDINALITY, + "int" integer PATH '$', + text text PATH '$', + "char(4)" character(4) PATH '$', + bool boolean PATH '$', + "numeric" numeric PATH '$', + domain jsonb_test_domain PATH '$', + js json PATH '$', + jb jsonb PATH '$', + jst text FORMAT JSON PATH '$', + jsc character(4) FORMAT JSON PATH '$', + jsv character varying(4) FORMAT JSON PATH '$', + jsb jsonb PATH '$', + jsbq jsonb PATH '$' OMIT QUOTES, + aaa integer PATH '$."aaa"', + aaa1 integer PATH '$."aaa"', + exists1 boolean EXISTS PATH '$."aaa"', + exists2 integer EXISTS PATH '$."aaa"' TRUE ON ERROR, + exists3 text EXISTS PATH 'strict $."aaa"' UNKNOWN ON ERROR, + js2 json PATH '$', + jsb2w jsonb PATH '$' WITH UNCONDITIONAL WRAPPER, + jsb2q jsonb PATH '$' OMIT QUOTES, + ia integer[] PATH '$', + ta text[] PATH '$', + jba jsonb[] PATH '$', + NESTED PATH '$[1]' + COLUMNS ( + a1 integer PATH '$."a1"', + b1 text PATH '$."b1"', + NESTED PATH '$[*]' + COLUMNS ( + a11 text PATH '$."a11"' + ) + ), + NESTED PATH '$[2]' + COLUMNS ( + NESTED PATH '$[*]' + COLUMNS ( + a21 text PATH '$."a21"' + ), + NESTED PATH '$[*]' + COLUMNS ( + a22 text PATH '$."a22"' + ) + ) + ) + ) +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM jsonb_table_view; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Table Function Scan on "json_table" + Output: "json_table".id, "json_table".id2, "json_table"."int", "json_table".text, "json_table"."char(4)", "json_table".bool, "json_table"."numeric", "json_table".domain, "json_table".js, "json_table".jb, "json_table".jst, "json_table".jsc, "json_table".jsv, "json_table".jsb, "json_table".jsbq, "json_table".aaa, "json_table".aaa1, "json_table".exists1, "json_table".exists2, "json_table".exists3, "json_table".js2, "json_table".jsb2w, "json_table".jsb2q, "json_table".ia, "json_table".ta, "json_table".jba, "json_table".a1, "json_table".b1, "json_table".a11, "json_table".a21, "json_table".a22 + Table Function Call: JSON_TABLE('null'::jsonb, '$[*]' PASSING 3 AS a, '"foo"'::jsonb AS "b c" COLUMNS (id FOR ORDINALITY, id2 FOR ORDINALITY, "int" integer PATH '$', text text PATH '$', "char(4)" character(4) PATH '$', bool boolean PATH '$', "numeric" numeric PATH '$', domain jsonb_test_domain PATH '$', js json PATH '$', jb jsonb PATH '$', jst text FORMAT JSON PATH '$', jsc character(4) FORMAT JSON PATH '$', jsv character varying(4) FORMAT JSON PATH '$', jsb jsonb PATH '$', jsbq jsonb PATH '$' OMIT QUOTES, aaa integer PATH '$."aaa"', aaa1 integer PATH '$."aaa"', exists1 boolean EXISTS PATH '$."aaa"', exists2 integer EXISTS PATH '$."aaa"' TRUE ON ERROR, exists3 text EXISTS PATH 'strict $."aaa"' UNKNOWN ON ERROR, js2 json PATH '$', jsb2w jsonb PATH '$' WITH UNCONDITIONAL WRAPPER, jsb2q jsonb PATH '$' OMIT QUOTES, ia integer[] PATH '$', ta text[] PATH '$', jba jsonb[] PATH '$', NESTED PATH '$[1]' COLUMNS (a1 integer PATH '$."a1"', b1 text PATH '$."b1"', NESTED PATH '$[*]' COLUMNS (a11 text PATH '$."a11"')), NESTED PATH '$[2]' COLUMNS ( NESTED PATH '$[*]' COLUMNS (a21 text PATH '$."a21"'), NESTED PATH '$[*]' COLUMNS (a22 text PATH '$."a22"')))) +(3 rows) + +DROP VIEW jsonb_table_view; +DROP DOMAIN jsonb_test_domain; +-- JSON_TABLE: ON EMPTY/ON ERROR behavior +SELECT * +FROM + (VALUES ('1'), ('"err"')) vals(js), + JSON_TABLE(vals.js::jsonb, '$' COLUMNS (a int PATH '$')) jt; + js | a +-------+--- + 1 | 1 + "err" | +(2 rows) + +SELECT * +FROM + (VALUES ('1'), ('"err"')) vals(js) + LEFT OUTER JOIN + JSON_TABLE(vals.js::jsonb, '$' COLUMNS (a int PATH '$') ERROR ON ERROR) jt + ON true; +ERROR: invalid input syntax for type integer: "err" +SELECT * +FROM + (VALUES ('1'), ('"err"')) vals(js) + LEFT OUTER JOIN + JSON_TABLE(vals.js::jsonb, '$' COLUMNS (a int PATH '$' ERROR ON ERROR)) jt + ON true; +ERROR: invalid input syntax for type integer: "err" +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int PATH '$.a' ERROR ON EMPTY)) jt; + a +--- + +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int PATH 'strict $.a' ERROR ON EMPTY) ERROR ON ERROR) jt; +ERROR: jsonpath member accessor can only be applied to an object +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int PATH 'lax $.a' ERROR ON EMPTY) ERROR ON ERROR) jt; +ERROR: no SQL/JSON item +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int PATH '$' DEFAULT 1 ON EMPTY DEFAULT 2 ON ERROR)) jt; + a +--- + 2 +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int PATH 'strict $.a' DEFAULT 1 ON EMPTY DEFAULT 2 ON ERROR)) jt; + a +--- + 2 +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int PATH 'lax $.a' DEFAULT 1 ON EMPTY DEFAULT 2 ON ERROR)) jt; + a +--- + 1 +(1 row) + +-- JSON_TABLE: EXISTS PATH types +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int4 EXISTS PATH '$.a')); + a +--- + 0 +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int2 EXISTS PATH '$.a')); +ERROR: cannot cast type boolean to smallint +LINE 1: ...ELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int2 EXI... + ^ +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int8 EXISTS PATH '$.a')); +ERROR: cannot cast type boolean to bigint +LINE 1: ...ELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int8 EXI... + ^ +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a float4 EXISTS PATH '$.a')); +ERROR: cannot cast type boolean to real +LINE 1: ...ELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a float4 E... + ^ +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a char(3) EXISTS PATH '$.a')); + a +----- + fal +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a json EXISTS PATH '$.a')); +ERROR: cannot cast type boolean to json +LINE 1: ...ELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a json EXI... + ^ +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a jsonb EXISTS PATH '$.a')); +ERROR: cannot cast type boolean to jsonb +LINE 1: ...ELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a jsonb EX... + ^ +-- JSON_TABLE: nested paths and plans +-- Should fail (column names must be distinct) +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' + COLUMNS ( + a int, + b text, + a jsonb + ) +) jt; +ERROR: duplicate JSON_TABLE column name: a +HINT: JSON_TABLE column names must be distinct from one another +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' + COLUMNS ( + b int, + NESTED PATH '$' + COLUMNS ( + c int, + b text + ) + ) +) jt; +ERROR: duplicate JSON_TABLE column name: b +HINT: JSON_TABLE column names must be distinct from one another +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' + COLUMNS ( + NESTED PATH '$' + COLUMNS ( + b int + ), + NESTED PATH '$' + COLUMNS ( + NESTED PATH '$' + COLUMNS ( + c int, + b text + ) + ) + ) +) jt; +ERROR: duplicate JSON_TABLE column name: b +HINT: JSON_TABLE column names must be distinct from one another +-- JSON_TABLE: plan execution +CREATE TEMP TABLE jsonb_table_test (js jsonb); +INSERT INTO jsonb_table_test +VALUES ( + '[ + {"a": 1, "b": [], "c": []}, + {"a": 2, "b": [1, 2, 3], "c": [10, null, 20]}, + {"a": 3, "b": [1, 2], "c": []}, + {"x": "4", "b": [1, 2], "c": 123} + ]' +); +-- unspecified plan (outer, union) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' columns ( b int path '$' ), + nested path 'strict $.c[*]' columns ( c int path '$' ) + ) + ) jt; + n | a | b | c +---+----+---+---- + 1 | 1 | | + 2 | 2 | 1 | + 2 | 2 | 2 | + 2 | 2 | 3 | + 2 | 2 | | 10 + 2 | 2 | | + 2 | 2 | | 20 + 3 | 3 | 1 | + 3 | 3 | 2 | + 4 | -1 | 1 | + 4 | -1 | 2 | +(11 rows) + +-- Should succeed (JSON arguments are passed to root and nested paths) +SELECT * +FROM + generate_series(1, 4) x, + generate_series(1, 3) y, + JSON_TABLE(jsonb + '[[1,2,3],[2,3,4,5],[3,4,5,6]]', + 'strict $[*] ? (@[*] < $x)' + PASSING x AS x, y AS y + COLUMNS ( + y text FORMAT JSON PATH '$', + NESTED PATH 'strict $[*] ? (@ >= $y)' + COLUMNS ( + z int PATH '$' + ) + ) + ) jt; + x | y | y | z +---+---+--------------+--- + 2 | 1 | [1, 2, 3] | 1 + 2 | 1 | [1, 2, 3] | 2 + 2 | 1 | [1, 2, 3] | 3 + 3 | 1 | [1, 2, 3] | 1 + 3 | 1 | [1, 2, 3] | 2 + 3 | 1 | [1, 2, 3] | 3 + 3 | 1 | [2, 3, 4, 5] | 2 + 3 | 1 | [2, 3, 4, 5] | 3 + 3 | 1 | [2, 3, 4, 5] | 4 + 3 | 1 | [2, 3, 4, 5] | 5 + 4 | 1 | [1, 2, 3] | 1 + 4 | 1 | [1, 2, 3] | 2 + 4 | 1 | [1, 2, 3] | 3 + 4 | 1 | [2, 3, 4, 5] | 2 + 4 | 1 | [2, 3, 4, 5] | 3 + 4 | 1 | [2, 3, 4, 5] | 4 + 4 | 1 | [2, 3, 4, 5] | 5 + 4 | 1 | [3, 4, 5, 6] | 3 + 4 | 1 | [3, 4, 5, 6] | 4 + 4 | 1 | [3, 4, 5, 6] | 5 + 4 | 1 | [3, 4, 5, 6] | 6 + 2 | 2 | [1, 2, 3] | 2 + 2 | 2 | [1, 2, 3] | 3 + 3 | 2 | [1, 2, 3] | 2 + 3 | 2 | [1, 2, 3] | 3 + 3 | 2 | [2, 3, 4, 5] | 2 + 3 | 2 | [2, 3, 4, 5] | 3 + 3 | 2 | [2, 3, 4, 5] | 4 + 3 | 2 | [2, 3, 4, 5] | 5 + 4 | 2 | [1, 2, 3] | 2 + 4 | 2 | [1, 2, 3] | 3 + 4 | 2 | [2, 3, 4, 5] | 2 + 4 | 2 | [2, 3, 4, 5] | 3 + 4 | 2 | [2, 3, 4, 5] | 4 + 4 | 2 | [2, 3, 4, 5] | 5 + 4 | 2 | [3, 4, 5, 6] | 3 + 4 | 2 | [3, 4, 5, 6] | 4 + 4 | 2 | [3, 4, 5, 6] | 5 + 4 | 2 | [3, 4, 5, 6] | 6 + 2 | 3 | [1, 2, 3] | 3 + 3 | 3 | [1, 2, 3] | 3 + 3 | 3 | [2, 3, 4, 5] | 3 + 3 | 3 | [2, 3, 4, 5] | 4 + 3 | 3 | [2, 3, 4, 5] | 5 + 4 | 3 | [1, 2, 3] | 3 + 4 | 3 | [2, 3, 4, 5] | 3 + 4 | 3 | [2, 3, 4, 5] | 4 + 4 | 3 | [2, 3, 4, 5] | 5 + 4 | 3 | [3, 4, 5, 6] | 3 + 4 | 3 | [3, 4, 5, 6] | 4 + 4 | 3 | [3, 4, 5, 6] | 5 + 4 | 3 | [3, 4, 5, 6] | 6 +(52 rows) + +-- Should fail (JSON arguments are not passed to column paths) +SELECT * +FROM JSON_TABLE( + jsonb '[1,2,3]', + '$[*] ? (@ < $x)' + PASSING 10 AS x + COLUMNS (y text FORMAT JSON PATH '$ ? (@ < $x)') + ) jt; +ERROR: could not find jsonpath variable "x" +-- Extension: non-constant JSON path +SELECT JSON_EXISTS(jsonb '{"a": 123}', '$' || '.' || 'a'); + json_exists +------------- + t +(1 row) + +SELECT JSON_VALUE(jsonb '{"a": 123}', '$' || '.' || 'a'); + json_value +------------ + 123 +(1 row) + +SELECT JSON_VALUE(jsonb '{"a": 123}', '$' || '.' || 'b' DEFAULT 'foo' ON EMPTY); + json_value +------------ + foo +(1 row) + +SELECT JSON_QUERY(jsonb '{"a": 123}', '$' || '.' || 'a'); + json_query +------------ + 123 +(1 row) + +SELECT JSON_QUERY(jsonb '{"a": 123}', '$' || '.' || 'a' WITH WRAPPER); + json_query +------------ + [123] +(1 row) + +-- Should fail (invalid path) +SELECT JSON_QUERY(jsonb '{"a": 123}', 'error' || ' ' || 'error'); +ERROR: syntax error, unexpected IDENT_P at or near " " of jsonpath input +-- Should fail (not supported) +SELECT * FROM JSON_TABLE(jsonb '{"a": 123}', '$' || '.' || 'a' COLUMNS (foo int)); +ERROR: only string constants supported in JSON_TABLE path specification +LINE 1: SELECT * FROM JSON_TABLE(jsonb '{"a": 123}', '$' || '.' || '... + ^ +-- Test parallel JSON_VALUE() +CREATE TABLE test_parallel_jsonb_value AS +SELECT i::text::jsonb AS js +FROM generate_series(1, 1000000) i; +-- Should be non-parallel due to subtransactions +EXPLAIN (COSTS OFF) +SELECT sum(JSON_VALUE(js, '$' RETURNING numeric)) FROM test_parallel_jsonb_value; + QUERY PLAN +--------------------------------------------- + Aggregate + -> Seq Scan on test_parallel_jsonb_value +(2 rows) + +SELECT sum(JSON_VALUE(js, '$' RETURNING numeric)) FROM test_parallel_jsonb_value; + sum +-------------- + 500000500000 +(1 row) + +-- Should be parallel +EXPLAIN (COSTS OFF) +SELECT sum(JSON_VALUE(js, '$' RETURNING numeric ERROR ON ERROR)) FROM test_parallel_jsonb_value; + QUERY PLAN +------------------------------------------------------------------ + Finalize Aggregate + -> Gather + Workers Planned: 2 + -> Partial Aggregate + -> Parallel Seq Scan on test_parallel_jsonb_value +(5 rows) + +SELECT sum(JSON_VALUE(js, '$' RETURNING numeric ERROR ON ERROR)) FROM test_parallel_jsonb_value; + sum +-------------- + 500000500000 +(1 row) + diff --git a/src/test/regress/sql/json_sqljson.sql b/src/test/regress/sql/json_sqljson.sql index 4f30fa46b9..df4a430d88 100644 --- a/src/test/regress/sql/json_sqljson.sql +++ b/src/test/regress/sql/json_sqljson.sql @@ -9,3 +9,7 @@ SELECT JSON_VALUE(NULL FORMAT JSON, '$'); -- JSON_QUERY SELECT JSON_QUERY(NULL FORMAT JSON, '$'); + +-- JSON_TABLE + +SELECT * FROM JSON_TABLE(NULL FORMAT JSON, '$' COLUMNS (foo text)); diff --git a/src/test/regress/sql/jsonb_sqljson.sql b/src/test/regress/sql/jsonb_sqljson.sql index 697b8ed126..62236c9fb1 100644 --- a/src/test/regress/sql/jsonb_sqljson.sql +++ b/src/test/regress/sql/jsonb_sqljson.sql @@ -319,3 +319,287 @@ CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, $.a ? (@.datetime() CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, 0 to $.a ? (@.datetime() == $x)]' PASSING '12:34'::time AS x)); CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, $.a ? (@.datetime("HH:MI") == $x)]' PASSING '12:34'::time AS x)); DROP TABLE test_jsonb_mutability; + +-- JSON_TABLE + +-- Should fail (JSON_TABLE can be used only in FROM clause) +SELECT JSON_TABLE('[]', '$'); + +-- Should fail (no columns) +SELECT * FROM JSON_TABLE(NULL, '$' COLUMNS ()); + +-- NULL => empty table +SELECT * FROM JSON_TABLE(NULL::jsonb, '$' COLUMNS (foo int)) bar; + +-- +SELECT * FROM JSON_TABLE(jsonb '123', '$' + COLUMNS (item int PATH '$', foo int)) bar; + +-- JSON_TABLE: basic functionality +CREATE DOMAIN jsonb_test_domain AS text CHECK (value <> 'foo'); + +SELECT * +FROM + (VALUES + ('1'), + ('[]'), + ('{}'), + ('[1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""]') + ) vals(js) + LEFT OUTER JOIN +-- JSON_TABLE is implicitly lateral + JSON_TABLE( + vals.js::jsonb, 'lax $[*]' + COLUMNS ( + id FOR ORDINALITY, + id2 FOR ORDINALITY, -- allowed additional ordinality columns + "int" int PATH '$', + "text" text PATH '$', + "char(4)" char(4) PATH '$', + "bool" bool PATH '$', + "numeric" numeric PATH '$', + "domain" jsonb_test_domain PATH '$', + js json PATH '$', + jb jsonb PATH '$', + jst text FORMAT JSON PATH '$', + jsc char(4) FORMAT JSON PATH '$', + jsv varchar(4) FORMAT JSON PATH '$', + jsb jsonb FORMAT JSON PATH '$', + jsbq jsonb FORMAT JSON PATH '$' OMIT QUOTES, + aaa int, -- implicit path '$."aaa"', + aaa1 int PATH '$.aaa', + exists1 bool EXISTS PATH '$.aaa', + exists2 int EXISTS PATH '$.aaa', + exists3 int EXISTS PATH 'strict $.aaa' UNKNOWN ON ERROR, + exists4 text EXISTS PATH 'strict $.aaa' FALSE ON ERROR, + + js2 json PATH '$', + jsb2w jsonb PATH '$' WITH WRAPPER, + jsb2q jsonb PATH '$' OMIT QUOTES, + ia int[] PATH '$', + ta text[] PATH '$', + jba jsonb[] PATH '$' + ) + ) jt + ON true; + +-- JSON_TABLE: Test backward parsing + +CREATE VIEW jsonb_table_view AS +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + id FOR ORDINALITY, + id2 FOR ORDINALITY, -- allowed additional ordinality columns + "int" int PATH '$', + "text" text PATH '$', + "char(4)" char(4) PATH '$', + "bool" bool PATH '$', + "numeric" numeric PATH '$', + "domain" jsonb_test_domain PATH '$', + js json PATH '$', + jb jsonb PATH '$', + jst text FORMAT JSON PATH '$', + jsc char(4) FORMAT JSON PATH '$', + jsv varchar(4) FORMAT JSON PATH '$', + jsb jsonb FORMAT JSON PATH '$', + jsbq jsonb FORMAT JSON PATH '$' OMIT QUOTES, + aaa int, -- implicit path '$."aaa"', + aaa1 int PATH '$.aaa', + exists1 bool EXISTS PATH '$.aaa', + exists2 int EXISTS PATH '$.aaa' TRUE ON ERROR, + exists3 text EXISTS PATH 'strict $.aaa' UNKNOWN ON ERROR, + + js2 json PATH '$', + jsb2w jsonb PATH '$' WITH WRAPPER, + jsb2q jsonb PATH '$' OMIT QUOTES, + ia int[] PATH '$', + ta text[] PATH '$', + jba jsonb[] PATH '$', + + NESTED PATH '$[1]' COLUMNS ( + a1 int, + NESTED PATH '$[*]' COLUMNS ( + a11 text + ), + b1 text + ), + NESTED PATH '$[2]' COLUMNS ( + NESTED PATH '$[*]' COLUMNS ( + a21 text + ), + NESTED PATH '$[*]' COLUMNS ( + a22 text + ) + ) + ) + ); + +\sv jsonb_table_view + +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM jsonb_table_view; + +DROP VIEW jsonb_table_view; +DROP DOMAIN jsonb_test_domain; + +-- JSON_TABLE: ON EMPTY/ON ERROR behavior +SELECT * +FROM + (VALUES ('1'), ('"err"')) vals(js), + JSON_TABLE(vals.js::jsonb, '$' COLUMNS (a int PATH '$')) jt; + +SELECT * +FROM + (VALUES ('1'), ('"err"')) vals(js) + LEFT OUTER JOIN + JSON_TABLE(vals.js::jsonb, '$' COLUMNS (a int PATH '$') ERROR ON ERROR) jt + ON true; + +SELECT * +FROM + (VALUES ('1'), ('"err"')) vals(js) + LEFT OUTER JOIN + JSON_TABLE(vals.js::jsonb, '$' COLUMNS (a int PATH '$' ERROR ON ERROR)) jt + ON true; + +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int PATH '$.a' ERROR ON EMPTY)) jt; +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int PATH 'strict $.a' ERROR ON EMPTY) ERROR ON ERROR) jt; +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int PATH 'lax $.a' ERROR ON EMPTY) ERROR ON ERROR) jt; + +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int PATH '$' DEFAULT 1 ON EMPTY DEFAULT 2 ON ERROR)) jt; +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int PATH 'strict $.a' DEFAULT 1 ON EMPTY DEFAULT 2 ON ERROR)) jt; +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int PATH 'lax $.a' DEFAULT 1 ON EMPTY DEFAULT 2 ON ERROR)) jt; + +-- JSON_TABLE: EXISTS PATH types +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int4 EXISTS PATH '$.a')); +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int2 EXISTS PATH '$.a')); +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int8 EXISTS PATH '$.a')); +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a float4 EXISTS PATH '$.a')); +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a char(3) EXISTS PATH '$.a')); +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a json EXISTS PATH '$.a')); +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a jsonb EXISTS PATH '$.a')); + +-- JSON_TABLE: nested paths and plans + +-- Should fail (column names must be distinct) +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' + COLUMNS ( + a int, + b text, + a jsonb + ) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' + COLUMNS ( + b int, + NESTED PATH '$' + COLUMNS ( + c int, + b text + ) + ) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' + COLUMNS ( + NESTED PATH '$' + COLUMNS ( + b int + ), + NESTED PATH '$' + COLUMNS ( + NESTED PATH '$' + COLUMNS ( + c int, + b text + ) + ) + ) +) jt; + +-- JSON_TABLE: plan execution + +CREATE TEMP TABLE jsonb_table_test (js jsonb); + +INSERT INTO jsonb_table_test +VALUES ( + '[ + {"a": 1, "b": [], "c": []}, + {"a": 2, "b": [1, 2, 3], "c": [10, null, 20]}, + {"a": 3, "b": [1, 2], "c": []}, + {"x": "4", "b": [1, 2], "c": 123} + ]' +); + +-- unspecified plan (outer, union) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' columns ( b int path '$' ), + nested path 'strict $.c[*]' columns ( c int path '$' ) + ) + ) jt; + +-- Should succeed (JSON arguments are passed to root and nested paths) +SELECT * +FROM + generate_series(1, 4) x, + generate_series(1, 3) y, + JSON_TABLE(jsonb + '[[1,2,3],[2,3,4,5],[3,4,5,6]]', + 'strict $[*] ? (@[*] < $x)' + PASSING x AS x, y AS y + COLUMNS ( + y text FORMAT JSON PATH '$', + NESTED PATH 'strict $[*] ? (@ >= $y)' + COLUMNS ( + z int PATH '$' + ) + ) + ) jt; + +-- Should fail (JSON arguments are not passed to column paths) +SELECT * +FROM JSON_TABLE( + jsonb '[1,2,3]', + '$[*] ? (@ < $x)' + PASSING 10 AS x + COLUMNS (y text FORMAT JSON PATH '$ ? (@ < $x)') + ) jt; + +-- Extension: non-constant JSON path +SELECT JSON_EXISTS(jsonb '{"a": 123}', '$' || '.' || 'a'); +SELECT JSON_VALUE(jsonb '{"a": 123}', '$' || '.' || 'a'); +SELECT JSON_VALUE(jsonb '{"a": 123}', '$' || '.' || 'b' DEFAULT 'foo' ON EMPTY); +SELECT JSON_QUERY(jsonb '{"a": 123}', '$' || '.' || 'a'); +SELECT JSON_QUERY(jsonb '{"a": 123}', '$' || '.' || 'a' WITH WRAPPER); +-- Should fail (invalid path) +SELECT JSON_QUERY(jsonb '{"a": 123}', 'error' || ' ' || 'error'); +-- Should fail (not supported) +SELECT * FROM JSON_TABLE(jsonb '{"a": 123}', '$' || '.' || 'a' COLUMNS (foo int)); + +-- Test parallel JSON_VALUE() +CREATE TABLE test_parallel_jsonb_value AS +SELECT i::text::jsonb AS js +FROM generate_series(1, 1000000) i; + +-- Should be non-parallel due to subtransactions +EXPLAIN (COSTS OFF) +SELECT sum(JSON_VALUE(js, '$' RETURNING numeric)) FROM test_parallel_jsonb_value; +SELECT sum(JSON_VALUE(js, '$' RETURNING numeric)) FROM test_parallel_jsonb_value; + +-- Should be parallel +EXPLAIN (COSTS OFF) +SELECT sum(JSON_VALUE(js, '$' RETURNING numeric ERROR ON ERROR)) FROM test_parallel_jsonb_value; +SELECT sum(JSON_VALUE(js, '$' RETURNING numeric ERROR ON ERROR)) FROM test_parallel_jsonb_value; diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 72fafb795b..4b12c575ab 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1238,6 +1238,14 @@ JsonPathParseResult JsonPathPredicateCallback JsonPathString JsonSemAction +JsonTable +JsonTableColumn +JsonTableColumnType +JsonTableContext +JsonTableJoinState +JsonTableParent +JsonTableScanState +JsonTableSibling JsonTokenType JsonTransformStringValuesAction JsonTypeCategory @@ -2645,6 +2653,7 @@ TableFunc TableFuncRoutine TableFuncScan TableFuncScanState +TableFuncType TableInfo TableLikeClause TableSampleClause From edadf8098f4b2ca50bcc449f8857d0cc960b3c90 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 4 Apr 2022 12:14:34 -0700 Subject: [PATCH 373/772] pgstat: consistent function comment formatting. There was a wild mishmash of function comment formatting in pgstat, making it hard to know what to use for any new function and hard to extend existing comments (particularly due to randomly different forms of indentation). Author: Andres Freund Reviewed-By: Thomas Munro Discussion: https://postgr.es/m/20220329191727.mzzwbl7udhpq7pmf@alap3.anarazel.de Discussion: https://postgr.es/m/20220308205351.2xcn6k4x5yivcxyd@alap3.anarazel.de --- src/backend/postmaster/pgstat.c | 636 ++++++------------ src/backend/utils/activity/pgstat_archiver.c | 9 +- src/backend/utils/activity/pgstat_bgwriter.c | 7 +- .../utils/activity/pgstat_checkpointer.c | 7 +- src/backend/utils/activity/pgstat_database.c | 75 +-- src/backend/utils/activity/pgstat_function.c | 3 +- src/backend/utils/activity/pgstat_relation.c | 77 +-- src/backend/utils/activity/pgstat_replslot.c | 34 +- src/backend/utils/activity/pgstat_slru.c | 26 +- .../utils/activity/pgstat_subscription.c | 27 +- src/backend/utils/activity/pgstat_wal.c | 7 +- 11 files changed, 300 insertions(+), 608 deletions(-) diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index c10311e036..ef1cba61a6 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -240,14 +240,11 @@ static bool pgstat_is_shutdown = false; * ------------------------------------------------------------ */ -/* ---------- - * pgstat_init() - - * - * Called from postmaster at startup. Create the resources required - * by the statistics collector process. If unable to do so, do not - * fail --- better to let the postmaster start with stats collection - * disabled. - * ---------- +/* + * Called from postmaster at startup. Create the resources required + * by the statistics collector process. If unable to do so, do not + * fail --- better to let the postmaster start with stats collection + * disabled. */ void pgstat_init(void) @@ -579,8 +576,6 @@ pgstat_reset_remove_files(const char *directory) } /* - * pgstat_reset_all() - - * * Remove the stats files. This is currently used only if WAL * recovery is needed after a crash. */ @@ -594,8 +589,6 @@ pgstat_reset_all(void) #ifdef EXEC_BACKEND /* - * pgstat_forkexec() - - * * Format up the arglist for, then fork and exec, statistics collector process */ static pid_t @@ -617,14 +610,12 @@ pgstat_forkexec(void) /* - * pgstat_start() - + * Called from postmaster at startup or after an existing collector + * died. Attempt to fire up a fresh statistics collector. * - * Called from postmaster at startup or after an existing collector - * died. Attempt to fire up a fresh statistics collector. + * Returns PID of child process, or 0 if fail. * - * Returns PID of child process, or 0 if fail. - * - * Note: if fail, we will be called again from the postmaster main loop. + * Note: if fail, we will be called again from the postmaster main loop. */ int pgstat_start(void) @@ -727,14 +718,11 @@ pgstat_shutdown_hook(int code, Datum arg) #endif } -/* ---------- - * pgstat_initialize() - - * - * Initialize pgstats state, and set up our on-proc-exit hook. Called from - * BaseInit(). +/* + * Initialize pgstats state, and set up our on-proc-exit hook. Called from + * BaseInit(). * - * NOTE: MyDatabaseId isn't set yet; so the shutdown hook has to be careful. - * ---------- + * NOTE: MyDatabaseId isn't set yet; so the shutdown hook has to be careful. */ void pgstat_initialize(void) @@ -757,11 +745,8 @@ pgstat_initialize(void) * ------------------------------------------------------------ */ -/* ---------- - * AtEOXact_PgStat - * - * Called from access/transam/xact.c at top-level transaction commit/abort. - * ---------- +/* + * Called from access/transam/xact.c at top-level transaction commit/abort. */ void AtEOXact_PgStat(bool isCommit, bool parallel) @@ -785,11 +770,8 @@ AtEOXact_PgStat(bool isCommit, bool parallel) pgstat_clear_snapshot(); } -/* ---------- - * AtEOSubXact_PgStat - * - * Called from access/transam/xact.c at subtransaction commit/abort. - * ---------- +/* + * Called from access/transam/xact.c at subtransaction commit/abort. */ void AtEOSubXact_PgStat(bool isCommit, int nestDepth) @@ -811,8 +793,7 @@ AtEOSubXact_PgStat(bool isCommit, int nestDepth) } /* - * AtPrepare_PgStat - * Save the transactional stats state at 2PC transaction prepare. + * Save the transactional stats state at 2PC transaction prepare. */ void AtPrepare_PgStat(void) @@ -830,8 +811,7 @@ AtPrepare_PgStat(void) } /* - * PostPrepare_PgStat - * Clean up after successful PREPARE. + * Clean up after successful PREPARE. * * Note: AtEOXact_PgStat is not called during PREPARE. */ @@ -858,15 +838,12 @@ PostPrepare_PgStat(void) pgstat_clear_snapshot(); } -/* ---------- - * pgstat_clear_snapshot() - - * - * Discard any data collected in the current transaction. Any subsequent - * request will cause new snapshots to be read. +/* + * Discard any data collected in the current transaction. Any subsequent + * request will cause new snapshots to be read. * - * This is also invoked during transaction commit or abort to discard - * the no-longer-wanted snapshot. - * ---------- + * This is also invoked during transaction commit or abort to discard + * the no-longer-wanted snapshot. */ void pgstat_clear_snapshot(void) @@ -920,19 +897,16 @@ pgstat_xact_stack_level_get(int nest_level) * ------------------------------------------------------------ */ -/* ---------- - * pgstat_report_stat() - - * - * Must be called by processes that performs DML: tcop/postgres.c, logical - * receiver processes, SPI worker, etc. to send the so far collected - * per-table and function usage statistics to the collector. Note that this - * is called only when not within a transaction, so it is fair to use - * transaction stop time as an approximation of current time. +/* + * Must be called by processes that performs DML: tcop/postgres.c, logical + * receiver processes, SPI worker, etc. to send the so far collected + * per-table and function usage statistics to the collector. Note that this + * is called only when not within a transaction, so it is fair to use + * transaction stop time as an approximation of current time. * - * "disconnect" is "true" only for the last call before the backend - * exits. This makes sure that no data is lost and that interrupted - * sessions are reported correctly. - * ---------- + * "disconnect" is "true" only for the last call before the backend + * exits. This makes sure that no data is lost and that interrupted + * sessions are reported correctly. */ void pgstat_report_stat(bool disconnect) @@ -979,11 +953,8 @@ pgstat_report_stat(bool disconnect) pgstat_send_slru(); } -/* ---------- - * pgstat_vacuum_stat() - - * - * Will tell the collector about objects he can get rid of. - * ---------- +/* + * Will tell the collector about objects he can get rid of. */ void pgstat_vacuum_stat(void) @@ -1201,14 +1172,11 @@ pgstat_vacuum_stat(void) } } -/* ---------- - * pgstat_collect_oids() - - * - * Collect the OIDs of all objects listed in the specified system catalog - * into a temporary hash table. Caller should hash_destroy the result - * when done with it. (However, we make the table in CurrentMemoryContext - * so that it will be freed properly in event of an error.) - * ---------- +/* + * Collect the OIDs of all objects listed in the specified system catalog + * into a temporary hash table. Caller should hash_destroy the result + * when done with it. (However, we make the table in CurrentMemoryContext + * so that it will be freed properly in event of an error.) */ static HTAB * pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid) @@ -1250,14 +1218,11 @@ pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid) return htab; } -/* ---------- - * pgstat_reset_counters() - - * - * Tell the statistics collector to reset counters for our database. +/* + * Tell the statistics collector to reset counters for our database. * - * Permission checking for this function is managed through the normal - * GRANT system. - * ---------- + * Permission checking for this function is managed through the normal + * GRANT system. */ void pgstat_reset_counters(void) @@ -1272,14 +1237,11 @@ pgstat_reset_counters(void) pgstat_send(&msg, sizeof(msg)); } -/* ---------- - * pgstat_reset_single_counter() - - * - * Tell the statistics collector to reset a single counter. +/* + * Tell the statistics collector to reset a single counter. * - * Permission checking for this function is managed through the normal - * GRANT system. - * ---------- + * Permission checking for this function is managed through the normal + * GRANT system. */ void pgstat_reset_single_counter(Oid objoid, PgStat_Single_Reset_Type type) @@ -1297,14 +1259,11 @@ pgstat_reset_single_counter(Oid objoid, PgStat_Single_Reset_Type type) pgstat_send(&msg, sizeof(msg)); } -/* ---------- - * pgstat_reset_shared_counters() - - * - * Tell the statistics collector to reset cluster-wide shared counters. +/* + * Tell the statistics collector to reset cluster-wide shared counters. * - * Permission checking for this function is managed through the normal - * GRANT system. - * ---------- + * Permission checking for this function is managed through the normal + * GRANT system. */ void pgstat_reset_shared_counters(const char *target) @@ -1330,11 +1289,8 @@ pgstat_reset_shared_counters(const char *target) pgstat_send(&msg, sizeof(msg)); } -/* ---------- - * pgstat_ping() - - * - * Send some junk data to the collector to increase traffic. - * ---------- +/* + * Send some junk data to the collector to increase traffic. */ void pgstat_ping(void) @@ -1348,11 +1304,8 @@ pgstat_ping(void) pgstat_send(&msg, sizeof(msg)); } -/* ---------- - * pgstat_send_inquiry() - - * - * Notify collector that we need fresh data. - * ---------- +/* + * Notify collector that we need fresh data. */ static void pgstat_send_inquiry(TimestampTz clock_time, TimestampTz cutoff_time, Oid databaseid) @@ -1366,14 +1319,11 @@ pgstat_send_inquiry(TimestampTz clock_time, TimestampTz cutoff_time, Oid databas pgstat_send(&msg, sizeof(msg)); } -/* ---------- - * pgstat_fetch_stat_dbentry() - - * - * Support function for the SQL-callable pgstat* functions. Returns - * the collected statistics for one database or NULL. NULL doesn't mean - * that the database doesn't exist, it is just not yet known by the - * collector, so the caller is better off to report ZERO instead. - * ---------- +/* + * Support function for the SQL-callable pgstat* functions. Returns + * the collected statistics for one database or NULL. NULL doesn't mean + * that the database doesn't exist, it is just not yet known by the + * collector, so the caller is better off to report ZERO instead. */ PgStat_StatDBEntry * pgstat_fetch_stat_dbentry(Oid dbid) @@ -1393,12 +1343,8 @@ pgstat_fetch_stat_dbentry(Oid dbid) } /* - * --------- - * pgstat_fetch_global() - - * - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the global statistics struct. - * --------- + * Support function for the SQL-callable pgstat* functions. Returns + * a pointer to the global statistics struct. */ PgStat_GlobalStats * pgstat_fetch_global(void) @@ -1408,14 +1354,11 @@ pgstat_fetch_global(void) return &globalStats; } -/* ---------- - * pgstat_fetch_stat_tabentry() - - * - * Support function for the SQL-callable pgstat* functions. Returns - * the collected statistics for one table or NULL. NULL doesn't mean - * that the table doesn't exist, it is just not yet known by the - * collector, so the caller is better off to report ZERO instead. - * ---------- +/* + * Support function for the SQL-callable pgstat* functions. Returns + * the collected statistics for one table or NULL. NULL doesn't mean + * that the table doesn't exist, it is just not yet known by the + * collector, so the caller is better off to report ZERO instead. */ PgStat_StatTabEntry * pgstat_fetch_stat_tabentry(Oid relid) @@ -1466,12 +1409,9 @@ pgstat_fetch_stat_tabentry(Oid relid) } -/* ---------- - * pgstat_fetch_stat_funcentry() - - * - * Support function for the SQL-callable pgstat* functions. Returns - * the collected statistics for one function or NULL. - * ---------- +/* + * Support function for the SQL-callable pgstat* functions. Returns + * the collected statistics for one function or NULL. */ PgStat_StatFuncEntry * pgstat_fetch_stat_funcentry(Oid func_id) @@ -1495,12 +1435,8 @@ pgstat_fetch_stat_funcentry(Oid func_id) } /* - * --------- - * pgstat_fetch_stat_archiver() - - * - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the archiver statistics struct. - * --------- + * Support function for the SQL-callable pgstat* functions. Returns + * a pointer to the archiver statistics struct. */ PgStat_ArchiverStats * pgstat_fetch_stat_archiver(void) @@ -1511,12 +1447,8 @@ pgstat_fetch_stat_archiver(void) } /* - * --------- - * pgstat_fetch_stat_bgwriter() - - * - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the bgwriter statistics struct. - * --------- + * Support function for the SQL-callable pgstat* functions. Returns + * a pointer to the bgwriter statistics struct. */ PgStat_BgWriterStats * pgstat_fetch_stat_bgwriter(void) @@ -1527,12 +1459,8 @@ pgstat_fetch_stat_bgwriter(void) } /* - * --------- - * pgstat_fetch_stat_checkpointer() - - * - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the checkpointer statistics struct. - * --------- + * Support function for the SQL-callable pgstat* functions. Returns + * a pointer to the checkpointer statistics struct. */ PgStat_CheckpointerStats * pgstat_fetch_stat_checkpointer(void) @@ -1543,12 +1471,8 @@ pgstat_fetch_stat_checkpointer(void) } /* - * --------- - * pgstat_fetch_stat_wal() - - * - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the WAL statistics struct. - * --------- + * Support function for the SQL-callable pgstat* functions. Returns + * a pointer to the WAL statistics struct. */ PgStat_WalStats * pgstat_fetch_stat_wal(void) @@ -1559,12 +1483,8 @@ pgstat_fetch_stat_wal(void) } /* - * --------- - * pgstat_fetch_slru() - - * - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the slru statistics struct. - * --------- + * Support function for the SQL-callable pgstat* functions. Returns + * a pointer to the slru statistics struct. */ PgStat_SLRUStats * pgstat_fetch_slru(void) @@ -1575,12 +1495,8 @@ pgstat_fetch_slru(void) } /* - * --------- - * pgstat_fetch_replslot() - - * - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the replication slot statistics struct. - * --------- + * Support function for the SQL-callable pgstat* functions. Returns + * a pointer to the replication slot statistics struct. */ PgStat_StatReplSlotEntry * pgstat_fetch_replslot(NameData slotname) @@ -1591,12 +1507,8 @@ pgstat_fetch_replslot(NameData slotname) } /* - * --------- - * pgstat_fetch_stat_subscription() - - * - * Support function for the SQL-callable pgstat* functions. Returns - * the collected statistics for one subscription or NULL. - * --------- + * Support function for the SQL-callable pgstat* functions. Returns + * the collected statistics for one subscription or NULL. */ PgStat_StatSubEntry * pgstat_fetch_stat_subscription(Oid subid) @@ -1613,11 +1525,8 @@ pgstat_fetch_stat_subscription(Oid subid) * ------------------------------------------------------------ */ -/* ---------- - * pgstat_setup_memcxt() - - * - * Create pgStatLocalContext, if not already done. - * ---------- +/* + * Create pgStatLocalContext, if not already done. */ static void pgstat_setup_memcxt(void) @@ -1641,11 +1550,8 @@ pgstat_assert_is_up(void) } #endif -/* ---------- - * pgstat_setheader() - - * - * Set common header fields in a statistics message - * ---------- +/* + * Set common header fields in a statistics message */ void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype) @@ -1654,11 +1560,8 @@ pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype) } -/* ---------- - * pgstat_send() - - * - * Send out one statistics message to the collector - * ---------- +/* + * Send out one statistics message to the collector */ void pgstat_send(void *msg, int len) @@ -1685,14 +1588,11 @@ pgstat_send(void *msg, int len) #endif } -/* ---------- - * PgstatCollectorMain() - - * - * Start up the statistics collector process. This is the body of the - * postmaster child process. +/* + * Start up the statistics collector process. This is the body of the + * postmaster child process. * - * The argc/argv parameters are valid only in EXEC_BACKEND case. - * ---------- + * The argc/argv parameters are valid only in EXEC_BACKEND case. */ NON_EXEC_STATIC void PgstatCollectorMain(int argc, char *argv[]) @@ -2131,14 +2031,11 @@ pgstat_get_tab_entry(PgStat_StatDBEntry *dbentry, Oid tableoid, bool create) return result; } -/* ---------- - * pgstat_get_replslot_entry - * +/* * Return the entry of replication slot stats with the given name. Return * NULL if not found and the caller didn't request to create it. * * create tells whether to create the new slot entry if it is not found. - * ---------- */ static PgStat_StatReplSlotEntry * pgstat_get_replslot_entry(NameData name, bool create) @@ -2187,11 +2084,8 @@ pgstat_get_replslot_entry(NameData name, bool create) return slotent; } -/* ---------- - * pgstat_reset_replslot - * +/* * Reset the given replication slot stats. - * ---------- */ static void pgstat_reset_replslot(PgStat_StatReplSlotEntry *slotent, TimestampTz ts) @@ -2208,13 +2102,10 @@ pgstat_reset_replslot(PgStat_StatReplSlotEntry *slotent, TimestampTz ts) slotent->stat_reset_timestamp = ts; } -/* ---------- - * pgstat_get_subscription_entry - * +/* * Return the subscription statistics entry with the given subscription OID. * If no subscription entry exists, initialize it, if the create parameter is * true. Else, return NULL. - * ---------- */ static PgStat_StatSubEntry * pgstat_get_subscription_entry(Oid subid, bool create) @@ -2256,11 +2147,8 @@ pgstat_get_subscription_entry(Oid subid, bool create) return subentry; } -/* ---------- - * pgstat_reset_subscription - * +/* * Reset the given subscription stats. - * ---------- */ static void pgstat_reset_subscription(PgStat_StatSubEntry *subentry, TimestampTz ts) @@ -2276,19 +2164,17 @@ pgstat_reset_subscription(PgStat_StatSubEntry *subentry, TimestampTz ts) * ------------------------------------------------------------ */ -/* ---------- - * pgstat_write_statsfiles() - - * Write the global statistics file, as well as requested DB files. +/* + * Write the global statistics file, as well as requested DB files. * - * 'permanent' specifies writing to the permanent files not temporary ones. - * When true (happens only when the collector is shutting down), also remove - * the temporary files so that backends starting up under a new postmaster - * can't read old data before the new collector is ready. + * 'permanent' specifies writing to the permanent files not temporary ones. + * When true (happens only when the collector is shutting down), also remove + * the temporary files so that backends starting up under a new postmaster + * can't read old data before the new collector is ready. * - * When 'allDbs' is false, only the requested databases (listed in - * pending_write_requests) will be written; otherwise, all databases - * will be written. - * ---------- + * When 'allDbs' is false, only the requested databases (listed in + * pending_write_requests) will be written; otherwise, all databases + * will be written. */ static void pgstat_write_statsfiles(bool permanent, bool allDbs) @@ -2475,15 +2361,13 @@ get_dbstat_filename(bool permanent, bool tempname, Oid databaseid, elog(ERROR, "overlength pgstat path"); } -/* ---------- - * pgstat_write_db_statsfile() - - * Write the stat file for a single database. +/* + * Write the stat file for a single database. * - * If writing to the permanent file (happens when the collector is - * shutting down only), remove the temporary file so that backends - * starting up under a new postmaster can't read the old data before - * the new collector is ready. - * ---------- + * If writing to the permanent file (happens when the collector is + * shutting down only), remove the temporary file so that backends + * starting up under a new postmaster can't read the old data before + * the new collector is ready. */ static void pgstat_write_db_statsfile(PgStat_StatDBEntry *dbentry, bool permanent) @@ -2588,25 +2472,22 @@ pgstat_write_db_statsfile(PgStat_StatDBEntry *dbentry, bool permanent) } } -/* ---------- - * pgstat_read_statsfiles() - - * - * Reads in some existing statistics collector files and returns the - * databases hash table that is the top level of the data. +/* + * Reads in some existing statistics collector files and returns the + * databases hash table that is the top level of the data. * - * If 'onlydb' is not InvalidOid, it means we only want data for that DB - * plus the shared catalogs ("DB 0"). We'll still populate the DB hash - * table for all databases, but we don't bother even creating table/function - * hash tables for other databases. + * If 'onlydb' is not InvalidOid, it means we only want data for that DB + * plus the shared catalogs ("DB 0"). We'll still populate the DB hash + * table for all databases, but we don't bother even creating table/function + * hash tables for other databases. * - * 'permanent' specifies reading from the permanent files not temporary ones. - * When true (happens only when the collector is starting up), remove the - * files after reading; the in-memory status is now authoritative, and the - * files would be out of date in case somebody else reads them. + * 'permanent' specifies reading from the permanent files not temporary ones. + * When true (happens only when the collector is starting up), remove the + * files after reading; the in-memory status is now authoritative, and the + * files would be out of date in case somebody else reads them. * - * If a 'deep' read is requested, table/function stats are read, otherwise - * the table/function hash tables remain empty. - * ---------- + * If a 'deep' read is requested, table/function stats are read, otherwise + * the table/function hash tables remain empty. */ static HTAB * pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep) @@ -2936,19 +2817,16 @@ pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep) } -/* ---------- - * pgstat_read_db_statsfile() - - * - * Reads in the existing statistics collector file for the given database, - * filling the passed-in tables and functions hash tables. +/* + * Reads in the existing statistics collector file for the given database, + * filling the passed-in tables and functions hash tables. * - * As in pgstat_read_statsfiles, if the permanent file is requested, it is - * removed after reading. + * As in pgstat_read_statsfiles, if the permanent file is requested, it is + * removed after reading. * - * Note: this code has the ability to skip storing per-table or per-function - * data, if NULL is passed for the corresponding hashtable. That's not used - * at the moment though. - * ---------- + * Note: this code has the ability to skip storing per-table or per-function + * data, if NULL is passed for the corresponding hashtable. That's not used + * at the moment though. */ static void pgstat_read_db_statsfile(Oid databaseid, HTAB *tabhash, HTAB *funchash, @@ -3095,23 +2973,20 @@ pgstat_read_db_statsfile(Oid databaseid, HTAB *tabhash, HTAB *funchash, } } -/* ---------- - * pgstat_read_db_statsfile_timestamp() - - * - * Attempt to determine the timestamp of the last db statfile write. - * Returns true if successful; the timestamp is stored in *ts. The caller must - * rely on timestamp stored in *ts iff the function returns true. +/* + * Attempt to determine the timestamp of the last db statfile write. + * Returns true if successful; the timestamp is stored in *ts. The caller must + * rely on timestamp stored in *ts iff the function returns true. * - * This needs to be careful about handling databases for which no stats file - * exists, such as databases without a stat entry or those not yet written: + * This needs to be careful about handling databases for which no stats file + * exists, such as databases without a stat entry or those not yet written: * - * - if there's a database entry in the global file, return the corresponding - * stats_timestamp value. + * - if there's a database entry in the global file, return the corresponding + * stats_timestamp value. * - * - if there's no db stat entry (e.g. for a new or inactive database), - * there's no stats_timestamp value, but also nothing to write so we return - * the timestamp of the global statfile. - * ---------- + * - if there's no db stat entry (e.g. for a new or inactive database), + * there's no stats_timestamp value, but also nothing to write so we return + * the timestamp of the global statfile. */ static bool pgstat_read_db_statsfile_timestamp(Oid databaseid, bool permanent, @@ -3424,11 +3299,8 @@ backend_read_statsfile(void) pgStatDBHash = pgstat_read_statsfiles(MyDatabaseId, false, true); } -/* ---------- - * pgstat_write_statsfile_needed() - - * - * Do we need to write out any stats files? - * ---------- +/* + * Do we need to write out any stats files? */ static bool pgstat_write_statsfile_needed(void) @@ -3440,11 +3312,8 @@ pgstat_write_statsfile_needed(void) return false; } -/* ---------- - * pgstat_db_requested() - - * - * Checks whether stats for a particular DB need to be written to a file. - * ---------- +/* + * Checks whether stats for a particular DB need to be written to a file. */ static bool pgstat_db_requested(Oid databaseid) @@ -3471,11 +3340,8 @@ pgstat_db_requested(Oid databaseid) * ------------------------------------------------------------ */ -/* ---------- - * pgstat_recv_inquiry() - - * - * Process stat inquiry requests. - * ---------- +/* + * Process stat inquiry requests. */ static void pgstat_recv_inquiry(PgStat_MsgInquiry *msg, int len) @@ -3563,11 +3429,8 @@ pgstat_recv_inquiry(PgStat_MsgInquiry *msg, int len) msg->databaseid); } -/* ---------- - * pgstat_recv_tabstat() - - * - * Count what the backend has done. - * ---------- +/* + * Count what the backend has done. */ static void pgstat_recv_tabstat(PgStat_MsgTabstat *msg, int len) @@ -3680,11 +3543,8 @@ pgstat_recv_tabstat(PgStat_MsgTabstat *msg, int len) } } -/* ---------- - * pgstat_recv_tabpurge() - - * - * Arrange for dead table removal. - * ---------- +/* + * Arrange for dead table removal. */ static void pgstat_recv_tabpurge(PgStat_MsgTabpurge *msg, int len) @@ -3712,11 +3572,8 @@ pgstat_recv_tabpurge(PgStat_MsgTabpurge *msg, int len) } } -/* ---------- - * pgstat_recv_dropdb() - - * - * Arrange for dead database removal - * ---------- +/* + * Arrange for dead database removal */ static void pgstat_recv_dropdb(PgStat_MsgDropdb *msg, int len) @@ -3754,11 +3611,8 @@ pgstat_recv_dropdb(PgStat_MsgDropdb *msg, int len) } } -/* ---------- - * pgstat_recv_resetcounter() - - * - * Reset the statistics for the specified database. - * ---------- +/* + * Reset the statistics for the specified database. */ static void pgstat_recv_resetcounter(PgStat_MsgResetcounter *msg, int len) @@ -3792,11 +3646,8 @@ pgstat_recv_resetcounter(PgStat_MsgResetcounter *msg, int len) reset_dbentry_counters(dbentry); } -/* ---------- - * pgstat_recv_resetsharedcounter() - - * - * Reset some shared statistics of the cluster. - * ---------- +/* + * Reset some shared statistics of the cluster. */ static void pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len) @@ -3829,12 +3680,9 @@ pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len) */ } -/* ---------- - * pgstat_recv_resetsinglecounter() - - * - * Reset a statistics for a single object, which may be of current - * database or shared across all databases in the cluster. - * ---------- +/* + * Reset a statistics for a single object, which may be of current + * database or shared across all databases in the cluster. */ static void pgstat_recv_resetsinglecounter(PgStat_MsgResetsinglecounter *msg, int len) @@ -3861,11 +3709,8 @@ pgstat_recv_resetsinglecounter(PgStat_MsgResetsinglecounter *msg, int len) HASH_REMOVE, NULL); } -/* ---------- - * pgstat_recv_resetslrucounter() - - * - * Reset some SLRU statistics of the cluster. - * ---------- +/* + * Reset some SLRU statistics of the cluster. */ static void pgstat_recv_resetslrucounter(PgStat_MsgResetslrucounter *msg, int len) @@ -3884,11 +3729,8 @@ pgstat_recv_resetslrucounter(PgStat_MsgResetslrucounter *msg, int len) } } -/* ---------- - * pgstat_recv_resetreplslotcounter() - - * - * Reset some replication slot statistics of the cluster. - * ---------- +/* + * Reset some replication slot statistics of the cluster. */ static void pgstat_recv_resetreplslotcounter(PgStat_MsgResetreplslotcounter *msg, @@ -3929,11 +3771,8 @@ pgstat_recv_resetreplslotcounter(PgStat_MsgResetreplslotcounter *msg, } } -/* ---------- - * pgstat_recv_resetsubcounter() - - * - * Reset some subscription statistics of the cluster. - * ---------- +/* + * Reset some subscription statistics of the cluster. */ static void pgstat_recv_resetsubcounter(PgStat_MsgResetsubcounter *msg, int len) @@ -3974,11 +3813,8 @@ pgstat_recv_resetsubcounter(PgStat_MsgResetsubcounter *msg, int len) } } -/* ---------- - * pgstat_recv_autovac() - - * - * Process an autovacuum signaling message. - * ---------- +/* + * Process an autovacuum signaling message. */ static void pgstat_recv_autovac(PgStat_MsgAutovacStart *msg, int len) @@ -3993,11 +3829,8 @@ pgstat_recv_autovac(PgStat_MsgAutovacStart *msg, int len) dbentry->last_autovac_time = msg->m_start_time; } -/* ---------- - * pgstat_recv_vacuum() - - * - * Process a VACUUM message. - * ---------- +/* + * Process a VACUUM message. */ static void pgstat_recv_vacuum(PgStat_MsgVacuum *msg, int len) @@ -4039,11 +3872,8 @@ pgstat_recv_vacuum(PgStat_MsgVacuum *msg, int len) } } -/* ---------- - * pgstat_recv_analyze() - - * - * Process an ANALYZE message. - * ---------- +/* + * Process an ANALYZE message. */ static void pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len) @@ -4081,11 +3911,8 @@ pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len) } } -/* ---------- - * pgstat_recv_archiver() - - * - * Process a ARCHIVER message. - * ---------- +/* + * Process a ARCHIVER message. */ static void pgstat_recv_archiver(PgStat_MsgArchiver *msg, int len) @@ -4108,11 +3935,8 @@ pgstat_recv_archiver(PgStat_MsgArchiver *msg, int len) } } -/* ---------- - * pgstat_recv_bgwriter() - - * - * Process a BGWRITER message. - * ---------- +/* + * Process a BGWRITER message. */ static void pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len) @@ -4122,11 +3946,8 @@ pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len) globalStats.bgwriter.buf_alloc += msg->m_buf_alloc; } -/* ---------- - * pgstat_recv_checkpointer() - - * - * Process a CHECKPOINTER message. - * ---------- +/* + * Process a CHECKPOINTER message. */ static void pgstat_recv_checkpointer(PgStat_MsgCheckpointer *msg, int len) @@ -4140,11 +3961,8 @@ pgstat_recv_checkpointer(PgStat_MsgCheckpointer *msg, int len) globalStats.checkpointer.buf_fsync_backend += msg->m_buf_fsync_backend; } -/* ---------- - * pgstat_recv_wal() - - * - * Process a WAL message. - * ---------- +/* + * Process a WAL message. */ static void pgstat_recv_wal(PgStat_MsgWal *msg, int len) @@ -4159,11 +3977,8 @@ pgstat_recv_wal(PgStat_MsgWal *msg, int len) walStats.wal_sync_time += msg->m_wal_sync_time; } -/* ---------- - * pgstat_recv_slru() - - * - * Process a SLRU message. - * ---------- +/* + * Process a SLRU message. */ static void pgstat_recv_slru(PgStat_MsgSLRU *msg, int len) @@ -4177,11 +3992,8 @@ pgstat_recv_slru(PgStat_MsgSLRU *msg, int len) slruStats[msg->m_index].truncate += msg->m_truncate; } -/* ---------- - * pgstat_recv_recoveryconflict() - - * - * Process a RECOVERYCONFLICT message. - * ---------- +/* + * Process a RECOVERYCONFLICT message. */ static void pgstat_recv_recoveryconflict(PgStat_MsgRecoveryConflict *msg, int len) @@ -4217,11 +4029,8 @@ pgstat_recv_recoveryconflict(PgStat_MsgRecoveryConflict *msg, int len) } } -/* ---------- - * pgstat_recv_deadlock() - - * - * Process a DEADLOCK message. - * ---------- +/* + * Process a DEADLOCK message. */ static void pgstat_recv_deadlock(PgStat_MsgDeadlock *msg, int len) @@ -4233,11 +4042,8 @@ pgstat_recv_deadlock(PgStat_MsgDeadlock *msg, int len) dbentry->n_deadlocks++; } -/* ---------- - * pgstat_recv_checksum_failure() - - * - * Process a CHECKSUMFAILURE message. - * ---------- +/* + * Process a CHECKSUMFAILURE message. */ static void pgstat_recv_checksum_failure(PgStat_MsgChecksumFailure *msg, int len) @@ -4250,11 +4056,8 @@ pgstat_recv_checksum_failure(PgStat_MsgChecksumFailure *msg, int len) dbentry->last_checksum_failure = msg->m_failure_time; } -/* ---------- - * pgstat_recv_replslot() - - * - * Process a REPLSLOT message. - * ---------- +/* + * Process a REPLSLOT message. */ static void pgstat_recv_replslot(PgStat_MsgReplSlot *msg, int len) @@ -4301,11 +4104,8 @@ pgstat_recv_replslot(PgStat_MsgReplSlot *msg, int len) } } -/* ---------- - * pgstat_recv_connect() - - * - * Process a CONNECT message. - * ---------- +/* + * Process a CONNECT message. */ static void pgstat_recv_connect(PgStat_MsgConnect *msg, int len) @@ -4316,11 +4116,8 @@ pgstat_recv_connect(PgStat_MsgConnect *msg, int len) dbentry->n_sessions++; } -/* ---------- - * pgstat_recv_disconnect() - - * - * Process a DISCONNECT message. - * ---------- +/* + * Process a DISCONNECT message. */ static void pgstat_recv_disconnect(PgStat_MsgDisconnect *msg, int len) @@ -4347,11 +4144,8 @@ pgstat_recv_disconnect(PgStat_MsgDisconnect *msg, int len) } } -/* ---------- - * pgstat_recv_tempfile() - - * - * Process a TEMPFILE message. - * ---------- +/* + * Process a TEMPFILE message. */ static void pgstat_recv_tempfile(PgStat_MsgTempFile *msg, int len) @@ -4364,11 +4158,8 @@ pgstat_recv_tempfile(PgStat_MsgTempFile *msg, int len) dbentry->n_temp_files += 1; } -/* ---------- - * pgstat_recv_funcstat() - - * - * Count what the backend has done. - * ---------- +/* + * Count what the backend has done. */ static void pgstat_recv_funcstat(PgStat_MsgFuncstat *msg, int len) @@ -4412,11 +4203,8 @@ pgstat_recv_funcstat(PgStat_MsgFuncstat *msg, int len) } } -/* ---------- - * pgstat_recv_funcpurge() - - * - * Arrange for dead function removal. - * ---------- +/* + * Arrange for dead function removal. */ static void pgstat_recv_funcpurge(PgStat_MsgFuncpurge *msg, int len) @@ -4444,11 +4232,8 @@ pgstat_recv_funcpurge(PgStat_MsgFuncpurge *msg, int len) } } -/* ---------- - * pgstat_recv_subscription_drop() - - * - * Process a SUBSCRIPTIONDROP message. - * ---------- +/* + * Process a SUBSCRIPTIONDROP message. */ static void pgstat_recv_subscription_drop(PgStat_MsgSubscriptionDrop *msg, int len) @@ -4462,11 +4247,8 @@ pgstat_recv_subscription_drop(PgStat_MsgSubscriptionDrop *msg, int len) HASH_REMOVE, NULL); } -/* ---------- - * pgstat_recv_subscription_error() - - * - * Process a SUBSCRIPTIONERROR message. - * ---------- +/* + * Process a SUBSCRIPTIONERROR message. */ static void pgstat_recv_subscription_error(PgStat_MsgSubscriptionError *msg, int len) diff --git a/src/backend/utils/activity/pgstat_archiver.c b/src/backend/utils/activity/pgstat_archiver.c index 36788f7ab4..4a37b8f6e7 100644 --- a/src/backend/utils/activity/pgstat_archiver.c +++ b/src/backend/utils/activity/pgstat_archiver.c @@ -21,12 +21,9 @@ #include "utils/timestamp.h" -/* ---------- - * pgstat_send_archiver() - - * - * Tell the collector about the WAL file that we successfully - * archived or failed to archive. - * ---------- +/* + * Tell the collector about the WAL file that we successfully + * archived or failed to archive. */ void pgstat_send_archiver(const char *xlog, bool failed) diff --git a/src/backend/utils/activity/pgstat_bgwriter.c b/src/backend/utils/activity/pgstat_bgwriter.c index c5cf0002de..0d9421666d 100644 --- a/src/backend/utils/activity/pgstat_bgwriter.c +++ b/src/backend/utils/activity/pgstat_bgwriter.c @@ -28,11 +28,8 @@ PgStat_MsgBgWriter PendingBgWriterStats; -/* ---------- - * pgstat_send_bgwriter() - - * - * Send bgwriter statistics to the collector - * ---------- +/* + * Send bgwriter statistics to the collector */ void pgstat_send_bgwriter(void) diff --git a/src/backend/utils/activity/pgstat_checkpointer.c b/src/backend/utils/activity/pgstat_checkpointer.c index 2ce3fba76c..f8358eb4e0 100644 --- a/src/backend/utils/activity/pgstat_checkpointer.c +++ b/src/backend/utils/activity/pgstat_checkpointer.c @@ -28,11 +28,8 @@ PgStat_MsgCheckpointer PendingCheckpointerStats; -/* ---------- - * pgstat_send_checkpointer() - - * - * Send checkpointer statistics to the collector - * ---------- +/* + * Send checkpointer statistics to the collector */ void pgstat_send_checkpointer(void) diff --git a/src/backend/utils/activity/pgstat_database.c b/src/backend/utils/activity/pgstat_database.c index 31f6624c58..b4fba80835 100644 --- a/src/backend/utils/activity/pgstat_database.c +++ b/src/backend/utils/activity/pgstat_database.c @@ -36,13 +36,10 @@ SessionEndType pgStatSessionEndCause = DISCONNECT_NORMAL; static PgStat_Counter pgLastSessionReportTime = 0; -/* ---------- - * pgstat_drop_database() - - * - * Tell the collector that we just dropped a database. - * (If the message gets lost, we will still clean the dead DB eventually - * via future invocations of pgstat_vacuum_stat().) - * ---------- +/* + * Tell the collector that we just dropped a database. + * (If the message gets lost, we will still clean the dead DB eventually + * via future invocations of pgstat_vacuum_stat().) */ void pgstat_drop_database(Oid databaseid) @@ -57,11 +54,8 @@ pgstat_drop_database(Oid databaseid) pgstat_send(&msg, sizeof(msg)); } -/* -------- - * pgstat_report_recovery_conflict() - - * - * Tell the collector about a Hot Standby recovery conflict. - * -------- +/* + * Tell the collector about a Hot Standby recovery conflict. */ void pgstat_report_recovery_conflict(int reason) @@ -77,11 +71,8 @@ pgstat_report_recovery_conflict(int reason) pgstat_send(&msg, sizeof(msg)); } -/* -------- - * pgstat_report_deadlock() - - * - * Tell the collector about a deadlock detected. - * -------- +/* + * Tell the collector about a deadlock detected. */ void pgstat_report_deadlock(void) @@ -96,11 +87,8 @@ pgstat_report_deadlock(void) pgstat_send(&msg, sizeof(msg)); } -/* -------- - * pgstat_report_checksum_failures_in_db() - - * - * Tell the collector about one or more checksum failures. - * -------- +/* + * Tell the collector about one or more checksum failures. */ void pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount) @@ -118,11 +106,8 @@ pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount) pgstat_send(&msg, sizeof(msg)); } -/* -------- - * pgstat_report_checksum_failure() - - * - * Tell the collector about a checksum failure. - * -------- +/* + * Tell the collector about a checksum failure. */ void pgstat_report_checksum_failure(void) @@ -130,11 +115,8 @@ pgstat_report_checksum_failure(void) pgstat_report_checksum_failures_in_db(MyDatabaseId, 1); } -/* -------- - * pgstat_report_tempfile() - - * - * Tell the collector about a temporary file. - * -------- +/* + * Tell the collector about a temporary file. */ void pgstat_report_tempfile(size_t filesize) @@ -150,11 +132,8 @@ pgstat_report_tempfile(size_t filesize) pgstat_send(&msg, sizeof(msg)); } -/* -------- - * pgstat_report_connect() - - * - * Tell the collector about a new connection. - * -------- +/* + * Tell the collector about a new connection. */ void pgstat_report_connect(Oid dboid) @@ -171,11 +150,8 @@ pgstat_report_connect(Oid dboid) pgstat_send(&msg, sizeof(PgStat_MsgConnect)); } -/* -------- - * pgstat_report_disconnect() - - * - * Tell the collector about a disconnect. - * -------- +/* + * Tell the collector about a disconnect. */ void pgstat_report_disconnect(Oid dboid) @@ -262,15 +238,12 @@ pgstat_update_dbstats(PgStat_MsgTabstat *tsmsg, TimestampTz now) } } -/* -------- - * pgstat_should_report_connstats() - - * - * We report session statistics only for normal backend processes. Parallel - * workers run in parallel, so they don't contribute to session times, even - * though they use CPU time. Walsender processes could be considered here, - * but they have different session characteristics from normal backends (for - * example, they are always "active"), so they would skew session statistics. - * ---------- +/* + * We report session statistics only for normal backend processes. Parallel + * workers run in parallel, so they don't contribute to session times, even + * though they use CPU time. Walsender processes could be considered here, + * but they have different session characteristics from normal backends (for + * example, they are always "active"), so they would skew session statistics. */ static bool pgstat_should_report_connstat(void) diff --git a/src/backend/utils/activity/pgstat_function.c b/src/backend/utils/activity/pgstat_function.c index ad37bb74aa..93ec29757a 100644 --- a/src/backend/utils/activity/pgstat_function.c +++ b/src/backend/utils/activity/pgstat_function.c @@ -206,8 +206,7 @@ pgstat_send_funcstats(void) } /* - * find_funcstat_entry - find any existing PgStat_BackendFunctionEntry entry - * for specified function + * find any existing PgStat_BackendFunctionEntry entry for specified function * * If no entry, return NULL, don't create a new one */ diff --git a/src/backend/utils/activity/pgstat_relation.c b/src/backend/utils/activity/pgstat_relation.c index f5c03b54b4..74b62c39c0 100644 --- a/src/backend/utils/activity/pgstat_relation.c +++ b/src/backend/utils/activity/pgstat_relation.c @@ -95,17 +95,14 @@ bool have_relation_stats; static HTAB *pgStatTabHash = NULL; -/* ---------- - * pgstat_relation_init() - - * - * Initialize a relcache entry to count access statistics. - * Called whenever a relation is opened. +/* + * Initialize a relcache entry to count access statistics. + * Called whenever a relation is opened. * - * We assume that a relcache entry's pgstat_info field is zeroed by - * relcache.c when the relcache entry is made; thereafter it is long-lived - * data. We can avoid repeated searches of the TabStatus arrays when the - * same relation is touched repeatedly within a transaction. - * ---------- + * We assume that a relcache entry's pgstat_info field is zeroed by + * relcache.c when the relcache entry is made; thereafter it is long-lived + * data. We can avoid repeated searches of the TabStatus arrays when the + * same relation is touched repeatedly within a transaction. */ void pgstat_relation_init(Relation rel) @@ -141,16 +138,13 @@ pgstat_relation_init(Relation rel) rel->pgstat_info = get_tabstat_entry(rel_id, rel->rd_rel->relisshared); } -/* ---------- - * pgstat_drop_relation() - - * - * Tell the collector that we just dropped a relation. - * (If the message gets lost, we will still clean the dead entry eventually - * via future invocations of pgstat_vacuum_stat().) +/* + * Tell the collector that we just dropped a relation. + * (If the message gets lost, we will still clean the dead entry eventually + * via future invocations of pgstat_vacuum_stat().) * - * Currently not used for lack of any good place to call it; we rely - * entirely on pgstat_vacuum_stat() to clean out stats for dead rels. - * ---------- + * Currently not used for lack of any good place to call it; we rely + * entirely on pgstat_vacuum_stat() to clean out stats for dead rels. */ #ifdef NOT_USED void @@ -173,13 +167,10 @@ pgstat_drop_relation(Oid relid) } #endif /* NOT_USED */ -/* ---------- - * pgstat_report_autovac() - - * - * Called from autovacuum.c to report startup of an autovacuum process. - * We are called before InitPostgres is done, so can't rely on MyDatabaseId; - * the db OID must be passed in, instead. - * ---------- +/* + * Called from autovacuum.c to report startup of an autovacuum process. + * We are called before InitPostgres is done, so can't rely on MyDatabaseId; + * the db OID must be passed in, instead. */ void pgstat_report_autovac(Oid dboid) @@ -196,11 +187,8 @@ pgstat_report_autovac(Oid dboid) pgstat_send(&msg, sizeof(msg)); } -/* --------- - * pgstat_report_vacuum() - - * - * Tell the collector about the table we just vacuumed. - * --------- +/* + * Tell the collector about the table we just vacuumed. */ void pgstat_report_vacuum(Oid tableoid, bool shared, @@ -221,14 +209,11 @@ pgstat_report_vacuum(Oid tableoid, bool shared, pgstat_send(&msg, sizeof(msg)); } -/* -------- - * pgstat_report_analyze() - - * - * Tell the collector about the table we just analyzed. +/* + * Tell the collector about the table we just analyzed. * * Caller must provide new live- and dead-tuples estimates, as well as a * flag indicating whether to reset the changes_since_analyze counter. - * -------- */ void pgstat_report_analyze(Relation rel, @@ -281,7 +266,7 @@ pgstat_report_analyze(Relation rel, } /* - * pgstat_count_heap_insert - count a tuple insertion of n tuples + * count a tuple insertion of n tuples */ void pgstat_count_heap_insert(Relation rel, PgStat_Counter n) @@ -296,7 +281,7 @@ pgstat_count_heap_insert(Relation rel, PgStat_Counter n) } /* - * pgstat_count_heap_update - count a tuple update + * count a tuple update */ void pgstat_count_heap_update(Relation rel, bool hot) @@ -315,7 +300,7 @@ pgstat_count_heap_update(Relation rel, bool hot) } /* - * pgstat_count_heap_delete - count a tuple deletion + * count a tuple deletion */ void pgstat_count_heap_delete(Relation rel) @@ -330,7 +315,7 @@ pgstat_count_heap_delete(Relation rel) } /* - * pgstat_count_truncate - update tuple counters due to truncate + * update tuple counters due to truncate */ void pgstat_count_truncate(Relation rel) @@ -348,7 +333,7 @@ pgstat_count_truncate(Relation rel) } /* - * pgstat_update_heap_dead_tuples - update dead-tuples count + * update dead-tuples count * * The semantics of this are that we are reporting the nontransactional * recovery of "delta" dead tuples; so t_delta_dead_tuples decreases @@ -367,7 +352,7 @@ pgstat_update_heap_dead_tuples(Relation rel, int delta) } /* - * find_tabstat_entry - find any existing PgStat_TableStatus entry for rel + * find any existing PgStat_TableStatus entry for rel * * If no entry, return NULL, don't create a new one * @@ -772,7 +757,7 @@ pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg, TimestampTz now) } /* - * get_tabstat_entry - find or create a PgStat_TableStatus entry for rel + * find or create a PgStat_TableStatus entry for rel */ static PgStat_TableStatus * get_tabstat_entry(Oid rel_id, bool isshared) @@ -858,7 +843,7 @@ get_tabstat_entry(Oid rel_id, bool isshared) } /* - * add_tabstat_xact_level - add a new (sub)transaction state record + * add a new (sub)transaction state record */ static void add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level) @@ -898,8 +883,6 @@ ensure_tabstat_xact_level(PgStat_TableStatus *pgstat_info) } /* - * pgstat_truncdrop_save_counters - * * Whenever a table is truncated/dropped, we save its i/u/d counters so that * they can be cleared, and if the (sub)xact that executed the truncate/drop * later aborts, the counters can be restored to the saved (pre-truncate/drop) @@ -921,7 +904,7 @@ pgstat_truncdrop_save_counters(PgStat_TableXactStatus *trans, bool is_drop) } /* - * pgstat_truncdrop_restore_counters - restore counters when a truncate aborts + * restore counters when a truncate aborts */ static void pgstat_truncdrop_restore_counters(PgStat_TableXactStatus *trans) diff --git a/src/backend/utils/activity/pgstat_replslot.c b/src/backend/utils/activity/pgstat_replslot.c index 2d575b6e5c..a9405cd135 100644 --- a/src/backend/utils/activity/pgstat_replslot.c +++ b/src/backend/utils/activity/pgstat_replslot.c @@ -22,15 +22,12 @@ #include "utils/pgstat_internal.h" -/* ---------- - * pgstat_reset_replslot_counter() - +/* + * Tell the statistics collector to reset a single replication slot + * counter, or all replication slots counters (when name is null). * - * Tell the statistics collector to reset a single replication slot - * counter, or all replication slots counters (when name is null). - * - * Permission checking for this function is managed through the normal - * GRANT system. - * ---------- + * Permission checking for this function is managed through the normal + * GRANT system. */ void pgstat_reset_replslot_counter(const char *name) @@ -53,11 +50,8 @@ pgstat_reset_replslot_counter(const char *name) pgstat_send(&msg, sizeof(msg)); } -/* ---------- - * pgstat_report_replslot() - - * - * Tell the collector about replication slot statistics. - * ---------- +/* + * Tell the collector about replication slot statistics. */ void pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat) @@ -82,11 +76,8 @@ pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat) pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); } -/* ---------- - * pgstat_report_replslot_create() - - * - * Tell the collector about creating the replication slot. - * ---------- +/* + * Tell the collector about creating the replication slot. */ void pgstat_report_replslot_create(const char *slotname) @@ -100,11 +91,8 @@ pgstat_report_replslot_create(const char *slotname) pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); } -/* ---------- - * pgstat_report_replslot_drop() - - * - * Tell the collector about dropping the replication slot. - * ---------- +/* + * Tell the collector about dropping the replication slot. */ void pgstat_report_replslot_drop(const char *slotname) diff --git a/src/backend/utils/activity/pgstat_slru.c b/src/backend/utils/activity/pgstat_slru.c index 058a926211..3e284900b1 100644 --- a/src/backend/utils/activity/pgstat_slru.c +++ b/src/backend/utils/activity/pgstat_slru.c @@ -32,15 +32,12 @@ static inline PgStat_MsgSLRU *slru_entry(int slru_idx); static PgStat_MsgSLRU SLRUStats[SLRU_NUM_ELEMENTS]; -/* ---------- - * pgstat_reset_slru_counter() - - * - * Tell the statistics collector to reset a single SLRU counter, or all - * SLRU counters (when name is null). +/* + * Tell the statistics collector to reset a single SLRU counter, or all + * SLRU counters (when name is null). * - * Permission checking for this function is managed through the normal - * GRANT system. - * ---------- + * Permission checking for this function is managed through the normal + * GRANT system. */ void pgstat_reset_slru_counter(const char *name) @@ -103,8 +100,6 @@ pgstat_count_slru_truncate(int slru_idx) } /* - * pgstat_slru_name - * * Returns SLRU name for an index. The index may be above SLRU_NUM_ELEMENTS, * in which case this returns NULL. This allows writing code that does not * know the number of entries in advance. @@ -119,8 +114,6 @@ pgstat_slru_name(int slru_idx) } /* - * pgstat_slru_index - * * Determine index of entry for a SLRU with a given name. If there's no exact * match, returns index of the last "other" entry used for SLRUs defined in * external projects. @@ -140,11 +133,8 @@ pgstat_slru_index(const char *name) return (SLRU_NUM_ELEMENTS - 1); } -/* ---------- - * pgstat_send_slru() - - * - * Send SLRU statistics to the collector - * ---------- +/* + * Send SLRU statistics to the collector */ void pgstat_send_slru(void) @@ -179,8 +169,6 @@ pgstat_send_slru(void) } /* - * slru_entry - * * Returns pointer to entry with counters for given SLRU (based on the name * stored in SlruCtl as lwlock tranche name). */ diff --git a/src/backend/utils/activity/pgstat_subscription.c b/src/backend/utils/activity/pgstat_subscription.c index 2f1168f5e4..70874e13f5 100644 --- a/src/backend/utils/activity/pgstat_subscription.c +++ b/src/backend/utils/activity/pgstat_subscription.c @@ -20,15 +20,12 @@ #include "utils/pgstat_internal.h" -/* ---------- - * pgstat_reset_subscription_counter() - +/* + * Tell the statistics collector to reset a single subscription + * counter, or all subscription counters (when subid is InvalidOid). * - * Tell the statistics collector to reset a single subscription - * counter, or all subscription counters (when subid is InvalidOid). - * - * Permission checking for this function is managed through the normal - * GRANT system. - * ---------- + * Permission checking for this function is managed through the normal + * GRANT system. */ void pgstat_reset_subscription_counter(Oid subid) @@ -44,11 +41,8 @@ pgstat_reset_subscription_counter(Oid subid) pgstat_send(&msg, sizeof(msg)); } -/* ---------- - * pgstat_report_subscription_error() - - * - * Tell the collector about the subscription error. - * ---------- +/* + * Tell the collector about the subscription error. */ void pgstat_report_subscription_error(Oid subid, bool is_apply_error) @@ -61,11 +55,8 @@ pgstat_report_subscription_error(Oid subid, bool is_apply_error) pgstat_send(&msg, sizeof(PgStat_MsgSubscriptionError)); } -/* ---------- - * pgstat_report_subscription_drop() - - * - * Tell the collector about dropping the subscription. - * ---------- +/* + * Tell the collector about dropping the subscription. */ void pgstat_report_subscription_drop(Oid subid) diff --git a/src/backend/utils/activity/pgstat_wal.c b/src/backend/utils/activity/pgstat_wal.c index 14b6394033..ad99988763 100644 --- a/src/backend/utils/activity/pgstat_wal.c +++ b/src/backend/utils/activity/pgstat_wal.c @@ -38,14 +38,11 @@ PgStat_MsgWal WalStats; static WalUsage prevWalUsage; -/* ---------- - * pgstat_send_wal() - - * - * Send WAL statistics to the collector. +/* + * Send WAL statistics to the collector. * * If 'force' is not set, WAL stats message is only sent if enough time has * passed since last one was sent to reach PGSTAT_STAT_INTERVAL. - * ---------- */ void pgstat_send_wal(bool force) From 55e566fc4bc866d73541a3b28be5454bf8d666b0 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 4 Apr 2022 14:23:02 -0700 Subject: [PATCH 374/772] pgstat: remove some superflous comments from pgstat.h. These would all need to be rephrased when moving to shared memory stats, but since they don't provide actual information right now, remove them instead. The comments for PgStat_Msg* are left in, because they will all be removed as part of the shared memory stats patch. Author: Andres Freund Reviewed-By: Thomas Munro Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/include/pgstat.h | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 534d595ca0..3584078f6e 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -776,9 +776,6 @@ typedef union PgStat_Msg #define PGSTAT_FILE_FORMAT_ID 0x01A5BCA6 -/* - * Archiver statistics kept in the stats collector - */ typedef struct PgStat_ArchiverStats { PgStat_Counter archived_count; /* archival successes */ @@ -792,9 +789,6 @@ typedef struct PgStat_ArchiverStats TimestampTz stat_reset_timestamp; } PgStat_ArchiverStats; -/* - * Background writer statistics kept in the stats collector - */ typedef struct PgStat_BgWriterStats { PgStat_Counter buf_written_clean; @@ -803,9 +797,6 @@ typedef struct PgStat_BgWriterStats TimestampTz stat_reset_timestamp; } PgStat_BgWriterStats; -/* - * Checkpointer statistics kept in the stats collector - */ typedef struct PgStat_CheckpointerStats { TimestampTz stats_timestamp; /* time of stats file update */ @@ -818,10 +809,6 @@ typedef struct PgStat_CheckpointerStats PgStat_Counter buf_fsync_backend; } PgStat_CheckpointerStats; -/* ---------- - * PgStat_StatDBEntry The collector's data per database - * ---------- - */ typedef struct PgStat_StatDBEntry { Oid databaseid; @@ -866,10 +853,6 @@ typedef struct PgStat_StatDBEntry HTAB *functions; } PgStat_StatDBEntry; -/* ---------- - * PgStat_StatFuncEntry The collector's data per function - * ---------- - */ typedef struct PgStat_StatFuncEntry { Oid functionid; @@ -880,9 +863,6 @@ typedef struct PgStat_StatFuncEntry PgStat_Counter f_self_time; } PgStat_StatFuncEntry; -/* - * Global statistics kept in the stats collector - */ typedef struct PgStat_GlobalStats { TimestampTz stats_timestamp; /* time of stats file update */ @@ -891,9 +871,6 @@ typedef struct PgStat_GlobalStats PgStat_BgWriterStats bgwriter; } PgStat_GlobalStats; -/* - * Replication slot statistics kept in the stats collector - */ typedef struct PgStat_StatReplSlotEntry { NameData slotname; @@ -908,9 +885,6 @@ typedef struct PgStat_StatReplSlotEntry TimestampTz stat_reset_timestamp; } PgStat_StatReplSlotEntry; -/* - * SLRU statistics kept in the stats collector - */ typedef struct PgStat_SLRUStats { PgStat_Counter blocks_zeroed; @@ -923,9 +897,6 @@ typedef struct PgStat_SLRUStats TimestampTz stat_reset_timestamp; } PgStat_SLRUStats; -/* - * Subscription statistics kept in the stats collector. - */ typedef struct PgStat_StatSubEntry { Oid subid; /* hash key (must be first) */ @@ -935,10 +906,6 @@ typedef struct PgStat_StatSubEntry TimestampTz stat_reset_timestamp; } PgStat_StatSubEntry; -/* ---------- - * PgStat_StatTabEntry The collector's data per table (or index) - * ---------- - */ typedef struct PgStat_StatTabEntry { Oid tableid; @@ -971,9 +938,6 @@ typedef struct PgStat_StatTabEntry PgStat_Counter autovac_analyze_count; } PgStat_StatTabEntry; -/* - * WAL statistics kept in the stats collector - */ typedef struct PgStat_WalStats { PgStat_Counter wal_records; From 909eebf27b9e6aaa78fb3338f7d8fbc7fa174247 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 4 Apr 2022 14:32:52 -0700 Subject: [PATCH 375/772] dshash: revise sequential scan support. The previous coding of dshash_seq_next(), on the first call, accessed status->hash_table->size_log2 without holding a partition lock and without guaranteeing that ensure_valid_bucket_pointers() had ever been called. That oversight turns out to not have immediately visible effects, because bucket 0 is always in partition 0, and ensure_valid_bucket_pointers() was called after acquiring the partition lock. However, PARTITION_FOR_BUCKET_INDEX() with a size_log2 of 0 ends up triggering formally undefined behaviour. Simplify by accessing partition 0, without using PARTITION_FOR_BUCKET_INDEX(). While at it, remove dshash_get_current(), there is no convincing use case. Also polish a few comments. Author: Andres Freund Reviewed-By: Thomas Munro Discussion: https://postgr.es/m/CA+hUKGL9hY_VY=+oUK+Gc1iSRx-Ls5qeYJ6q=dQVZnT3R63Taw@mail.gmail.com --- src/backend/lib/dshash.c | 56 +++++++++++++++++++--------------------- src/include/lib/dshash.h | 1 - 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/src/backend/lib/dshash.c b/src/backend/lib/dshash.c index 84a9db47c7..1b94a76e43 100644 --- a/src/backend/lib/dshash.c +++ b/src/backend/lib/dshash.c @@ -601,13 +601,12 @@ dshash_memhash(const void *v, size_t size, void *arg) } /* - * dshash_seq_init/_next/_term - * Sequentially scan through dshash table and return all the - * elements one by one, return NULL when no more. + * Sequentially scan through dshash table and return all the elements one by + * one, return NULL when all elements have been returned. * - * dshash_seq_term should always be called when a scan finished. - * The caller may delete returned elements midst of a scan by using - * dshash_delete_current(). exclusive must be true to delete elements. + * dshash_seq_term needs to be called when a scan finished. The caller may + * delete returned elements midst of a scan by using dshash_delete_current() + * if exclusive = true. */ void dshash_seq_init(dshash_seq_status *status, dshash_table *hash_table, @@ -625,34 +624,38 @@ dshash_seq_init(dshash_seq_status *status, dshash_table *hash_table, /* * Returns the next element. * - * Returned elements are locked and the caller must not explicitly release - * it. It is released at the next call to dshash_next(). + * Returned elements are locked and the caller may not release the lock. It is + * released by future calls to dshash_seq_next() or dshash_seq_term(). */ void * dshash_seq_next(dshash_seq_status *status) { dsa_pointer next_item_pointer; - if (status->curitem == NULL) + /* + * Not yet holding any partition locks. Need to determine the size of the + * hash table, it could have been resized since we were looking + * last. Since we iterate in partition order, we can start by + * unconditionally lock partition 0. + * + * Once we hold the lock, no resizing can happen until the scan ends. So + * we don't need to repeatedly call ensure_valid_bucket_pointers(). + */ + if (status->curpartition == -1) { - int partition; - Assert(status->curbucket == 0); Assert(!status->hash_table->find_locked); - /* first shot. grab the first item. */ - partition = - PARTITION_FOR_BUCKET_INDEX(status->curbucket, - status->hash_table->size_log2); - LWLockAcquire(PARTITION_LOCK(status->hash_table, partition), + status->curpartition = 0; + + LWLockAcquire(PARTITION_LOCK(status->hash_table, + status->curpartition), status->exclusive ? LW_EXCLUSIVE : LW_SHARED); - status->curpartition = partition; - /* resize doesn't happen from now until seq scan ends */ - status->nbuckets = - NUM_BUCKETS(status->hash_table->control->size_log2); ensure_valid_bucket_pointers(status->hash_table); + status->nbuckets = + NUM_BUCKETS(status->hash_table->control->size_log2); next_item_pointer = status->hash_table->buckets[status->curbucket]; } else @@ -714,7 +717,7 @@ dshash_seq_next(dshash_seq_status *status) /* * Terminates the seqscan and release all locks. * - * Should be always called when finishing or exiting a seqscan. + * Needs to be called after finishing or when exiting a seqscan. */ void dshash_seq_term(dshash_seq_status *status) @@ -726,7 +729,9 @@ dshash_seq_term(dshash_seq_status *status) LWLockRelease(PARTITION_LOCK(status->hash_table, status->curpartition)); } -/* Remove the current entry while a seq scan. */ +/* + * Remove the current entry of the seq scan. + */ void dshash_delete_current(dshash_seq_status *status) { @@ -746,13 +751,6 @@ dshash_delete_current(dshash_seq_status *status) delete_item(hash_table, item); } -/* Get the current entry while a seq scan. */ -void * -dshash_get_current(dshash_seq_status *status) -{ - return ENTRY_FROM_ITEM(status->curitem); -} - /* * Print debugging information about the internal state of the hash table to * stderr. The caller must hold no partition locks. diff --git a/src/include/lib/dshash.h b/src/include/lib/dshash.h index caeb60ad72..28f8db2eab 100644 --- a/src/include/lib/dshash.h +++ b/src/include/lib/dshash.h @@ -101,7 +101,6 @@ extern void dshash_seq_init(dshash_seq_status *status, dshash_table *hash_table, extern void *dshash_seq_next(dshash_seq_status *status); extern void dshash_seq_term(dshash_seq_status *status); extern void dshash_delete_current(dshash_seq_status *status); -extern void *dshash_get_current(dshash_seq_status *status); /* Convenience hash and compare functions wrapping memcmp and tag_hash. */ extern int dshash_memcmp(const void *a, const void *b, size_t size, void *arg); From 7a43a1fc52d0fefdcb008f2fc460ab46f242da69 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 4 Apr 2022 22:10:06 -0400 Subject: [PATCH 376/772] Update some tests in 013_crash_restart.pl. The expected backend message after SIGQUIT changed in commit 7e784d1dc, but we missed updating this test case. Also, experience shows that we might sometimes get "could not send data to server" instead of either of the libpq messages the test is looking for. Per report from Mark Dilger. Back-patch to v14 where the backend message changed. Discussion: https://postgr.es/m/17BD82D7-49AC-40C9-8204-E7ADD30321A0@enterprisedb.com --- src/test/recovery/t/013_crash_restart.pl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/recovery/t/013_crash_restart.pl b/src/test/recovery/t/013_crash_restart.pl index 8807c0a291..10da6cb0c1 100644 --- a/src/test/recovery/t/013_crash_restart.pl +++ b/src/test/recovery/t/013_crash_restart.pl @@ -110,7 +110,7 @@ $killme, $psql_timeout, \$killme_stderr, - qr/WARNING: terminating connection because of crash of another server process|server closed the connection unexpectedly|connection to server was lost/m + qr/WARNING: terminating connection because of unexpected SIGQUIT signal|server closed the connection unexpectedly|connection to server was lost|could not send data to server/m ), "psql query died successfully after SIGQUIT"); $killme_stderr = ''; @@ -124,7 +124,7 @@ $monitor, $psql_timeout, \$monitor_stderr, - qr/WARNING: terminating connection because of crash of another server process|server closed the connection unexpectedly|connection to server was lost/m + qr/WARNING: terminating connection because of crash of another server process|server closed the connection unexpectedly|connection to server was lost|could not send data to server/m ), "psql monitor died successfully after SIGQUIT"); $monitor->finish; @@ -190,7 +190,7 @@ $killme, $psql_timeout, \$killme_stderr, - qr/server closed the connection unexpectedly|connection to server was lost/m + qr/server closed the connection unexpectedly|connection to server was lost|could not send data to server/m ), "psql query died successfully after SIGKILL"); $killme->finish; @@ -202,7 +202,7 @@ $monitor, $psql_timeout, \$monitor_stderr, - qr/WARNING: terminating connection because of crash of another server process|server closed the connection unexpectedly|connection to server was lost/m + qr/WARNING: terminating connection because of crash of another server process|server closed the connection unexpectedly|connection to server was lost|could not send data to server/m ), "psql monitor died successfully after SIGKILL"); $monitor->finish; From 297daa9d43539fbf5fbb3c3a2cca190d0e3da471 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Tue, 5 Apr 2022 11:46:48 +0200 Subject: [PATCH 377/772] Refactor and cleanup runtime partition prune code a little * Move the execution pruning initialization steps that are common between both ExecInitAppend() and ExecInitMergeAppend() into a new function ExecInitPartitionPruning() defined in execPartition.c. Those steps include creation of a PartitionPruneState to be used for all instances of pruning and determining the minimal set of child subplans that need to be initialized by performing initial pruning if needed, and finally adjusting the subplan_map arrays in the PartitionPruneState to reflect the new set of subplans remaining after initial pruning if it was indeed performed. ExecCreatePartitionPruneState() is no longer exported out of execPartition.c and has been renamed to CreatePartitionPruneState() as a local sub-routine of ExecInitPartitionPruning(). * Likewise, ExecFindInitialMatchingSubPlans() that was in charge of performing initial pruning no longer needs to be exported. In fact, since it would now have the same body as the more generally named ExecFindMatchingSubPlans(), except differing in the value of initial_prune passed to the common subroutine find_matching_subplans_recurse(), it seems better to remove it and add an initial_prune argument to ExecFindMatchingSubPlans(). * Add an ExprContext field to PartitionPruneContext to remove the implicit assumption in the runtime pruning code that the ExprContext to use to compute pruning expressions that need one can always rely on the PlanState providing it. A future patch will allow runtime pruning (at least the initial pruning steps) to be performed without the corresponding PlanState yet having been created, so this will help. Author: Amit Langote Discussion: https://postgr.es/m/CA+HiwqEYCpEqh2LMDOp9mT+4-QoVe8HgFMKBjntEMCTZLpcCCA@mail.gmail.com --- src/backend/executor/execPartition.c | 459 +++++++++++++------------ src/backend/executor/nodeAppend.c | 41 +-- src/backend/executor/nodeMergeAppend.c | 34 +- src/backend/partitioning/partprune.c | 24 +- src/include/executor/execPartition.h | 31 +- src/include/partitioning/partprune.h | 2 + 6 files changed, 298 insertions(+), 293 deletions(-) diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c index aca42ca5b8..615bd80973 100644 --- a/src/backend/executor/execPartition.c +++ b/src/backend/executor/execPartition.c @@ -184,11 +184,17 @@ static char *ExecBuildSlotPartitionKeyDescription(Relation rel, int maxfieldlen); static List *adjust_partition_colnos(List *colnos, ResultRelInfo *leaf_part_rri); static List *adjust_partition_colnos_using_map(List *colnos, AttrMap *attrMap); -static void ExecInitPruningContext(PartitionPruneContext *context, - List *pruning_steps, - PartitionDesc partdesc, - PartitionKey partkey, - PlanState *planstate); +static PartitionPruneState *CreatePartitionPruneState(PlanState *planstate, + PartitionPruneInfo *pruneinfo); +static void InitPartitionPruneContext(PartitionPruneContext *context, + List *pruning_steps, + PartitionDesc partdesc, + PartitionKey partkey, + PlanState *planstate, + ExprContext *econtext); +static void PartitionPruneFixSubPlanMap(PartitionPruneState *prunestate, + Bitmapset *initially_valid_subplans, + int n_total_subplans); static void find_matching_subplans_recurse(PartitionPruningData *prunedata, PartitionedRelPruningData *pprune, bool initial_prune, @@ -1590,64 +1596,121 @@ adjust_partition_colnos_using_map(List *colnos, AttrMap *attrMap) * * Functions: * - * ExecCreatePartitionPruneState: - * Creates the PartitionPruneState required by each of the two pruning - * functions. Details stored include how to map the partition index - * returned by the partition pruning code into subplan indexes. - * - * ExecFindInitialMatchingSubPlans: - * Returns indexes of matching subplans. Partition pruning is attempted - * without any evaluation of expressions containing PARAM_EXEC Params. - * This function must be called during executor startup for the parent - * plan before the subplans themselves are initialized. Subplans which - * are found not to match by this function must be removed from the - * plan's list of subplans during execution, as this function performs a - * remap of the partition index to subplan index map and the newly - * created map provides indexes only for subplans which remain after - * calling this function. + * ExecInitPartitionPruning: + * Creates the PartitionPruneState required by ExecFindMatchingSubPlans. + * Details stored include how to map the partition index returned by the + * partition pruning code into subplan indexes. Also determines the set + * of subplans to initialize considering the result of performing initial + * pruning steps if any. Maps in PartitionPruneState are updated to + * account for initial pruning possibly having eliminated some of the + * subplans. * * ExecFindMatchingSubPlans: - * Returns indexes of matching subplans after evaluating all available - * expressions. This function can only be called during execution and - * must be called again each time the value of a Param listed in + * Returns indexes of matching subplans after evaluating the expressions + * that are safe to evaluate at a given point. This function is first + * called during ExecInitPartitionPruning() to find the initially + * matching subplans based on performing the initial pruning steps and + * then must be called again each time the value of a Param listed in * PartitionPruneState's 'execparamids' changes. *------------------------------------------------------------------------- */ /* - * ExecCreatePartitionPruneState - * Build the data structure required for calling - * ExecFindInitialMatchingSubPlans and ExecFindMatchingSubPlans. + * ExecInitPartitionPruning + * Initialize data structure needed for run-time partition pruning and + * do initial pruning if needed + * + * On return, *initially_valid_subplans is assigned the set of indexes of + * child subplans that must be initialized along with the parent plan node. + * Initial pruning is performed here if needed and in that case only the + * surviving subplans' indexes are added. + * + * If subplans are indeed pruned, subplan_map arrays contained in the returned + * PartitionPruneState are re-sequenced to not count those, though only if the + * maps will be needed for subsequent execution pruning passes. + */ +PartitionPruneState * +ExecInitPartitionPruning(PlanState *planstate, + int n_total_subplans, + PartitionPruneInfo *pruneinfo, + Bitmapset **initially_valid_subplans) +{ + PartitionPruneState *prunestate; + EState *estate = planstate->state; + + /* We may need an expression context to evaluate partition exprs */ + ExecAssignExprContext(estate, planstate); + + /* Create the working data structure for pruning */ + prunestate = CreatePartitionPruneState(planstate, pruneinfo); + + /* + * Perform an initial partition prune pass, if required. + */ + if (prunestate->do_initial_prune) + *initially_valid_subplans = ExecFindMatchingSubPlans(prunestate, true); + else + { + /* No pruning, so we'll need to initialize all subplans */ + Assert(n_total_subplans > 0); + *initially_valid_subplans = bms_add_range(NULL, 0, + n_total_subplans - 1); + } + + /* + * Re-sequence subplan indexes contained in prunestate to account for any + * that were removed above due to initial pruning. No need to do this if + * no steps were removed. + */ + if (bms_num_members(*initially_valid_subplans) < n_total_subplans) + { + /* + * We can safely skip this when !do_exec_prune, even though that + * leaves invalid data in prunestate, because that data won't be + * consulted again (cf initial Assert in ExecFindMatchingSubPlans). + */ + if (prunestate->do_exec_prune) + PartitionPruneFixSubPlanMap(prunestate, + *initially_valid_subplans, + n_total_subplans); + } + + return prunestate; +} + +/* + * CreatePartitionPruneState + * Build the data structure required for calling ExecFindMatchingSubPlans * * 'planstate' is the parent plan node's execution state. * - * 'partitionpruneinfo' is a PartitionPruneInfo as generated by + * 'pruneinfo' is a PartitionPruneInfo as generated by * make_partition_pruneinfo. Here we build a PartitionPruneState containing a * PartitionPruningData for each partitioning hierarchy (i.e., each sublist of - * partitionpruneinfo->prune_infos), each of which contains a - * PartitionedRelPruningData for each PartitionedRelPruneInfo appearing in - * that sublist. This two-level system is needed to keep from confusing the - * different hierarchies when a UNION ALL contains multiple partitioned tables - * as children. The data stored in each PartitionedRelPruningData can be - * re-used each time we re-evaluate which partitions match the pruning steps - * provided in each PartitionedRelPruneInfo. + * pruneinfo->prune_infos), each of which contains a PartitionedRelPruningData + * for each PartitionedRelPruneInfo appearing in that sublist. This two-level + * system is needed to keep from confusing the different hierarchies when a + * UNION ALL contains multiple partitioned tables as children. The data + * stored in each PartitionedRelPruningData can be re-used each time we + * re-evaluate which partitions match the pruning steps provided in each + * PartitionedRelPruneInfo. */ -PartitionPruneState * -ExecCreatePartitionPruneState(PlanState *planstate, - PartitionPruneInfo *partitionpruneinfo) +static PartitionPruneState * +CreatePartitionPruneState(PlanState *planstate, PartitionPruneInfo *pruneinfo) { EState *estate = planstate->state; PartitionPruneState *prunestate; int n_part_hierarchies; ListCell *lc; int i; + ExprContext *econtext = planstate->ps_ExprContext; /* For data reading, executor always omits detached partitions */ if (estate->es_partition_directory == NULL) estate->es_partition_directory = CreatePartitionDirectory(estate->es_query_cxt, false); - n_part_hierarchies = list_length(partitionpruneinfo->prune_infos); + n_part_hierarchies = list_length(pruneinfo->prune_infos); Assert(n_part_hierarchies > 0); /* @@ -1659,7 +1722,7 @@ ExecCreatePartitionPruneState(PlanState *planstate, prunestate->execparamids = NULL; /* other_subplans can change at runtime, so we need our own copy */ - prunestate->other_subplans = bms_copy(partitionpruneinfo->other_subplans); + prunestate->other_subplans = bms_copy(pruneinfo->other_subplans); prunestate->do_initial_prune = false; /* may be set below */ prunestate->do_exec_prune = false; /* may be set below */ prunestate->num_partprunedata = n_part_hierarchies; @@ -1676,7 +1739,7 @@ ExecCreatePartitionPruneState(PlanState *planstate, ALLOCSET_DEFAULT_SIZES); i = 0; - foreach(lc, partitionpruneinfo->prune_infos) + foreach(lc, pruneinfo->prune_infos) { List *partrelpruneinfos = lfirst_node(List, lc); int npartrelpruneinfos = list_length(partrelpruneinfos); @@ -1812,18 +1875,20 @@ ExecCreatePartitionPruneState(PlanState *planstate, pprune->initial_pruning_steps = pinfo->initial_pruning_steps; if (pinfo->initial_pruning_steps) { - ExecInitPruningContext(&pprune->initial_context, - pinfo->initial_pruning_steps, - partdesc, partkey, planstate); + InitPartitionPruneContext(&pprune->initial_context, + pinfo->initial_pruning_steps, + partdesc, partkey, planstate, + econtext); /* Record whether initial pruning is needed at any level */ prunestate->do_initial_prune = true; } pprune->exec_pruning_steps = pinfo->exec_pruning_steps; if (pinfo->exec_pruning_steps) { - ExecInitPruningContext(&pprune->exec_context, - pinfo->exec_pruning_steps, - partdesc, partkey, planstate); + InitPartitionPruneContext(&pprune->exec_context, + pinfo->exec_pruning_steps, + partdesc, partkey, planstate, + econtext); /* Record whether exec pruning is needed at any level */ prunestate->do_exec_prune = true; } @@ -1847,11 +1912,12 @@ ExecCreatePartitionPruneState(PlanState *planstate, * Initialize a PartitionPruneContext for the given list of pruning steps. */ static void -ExecInitPruningContext(PartitionPruneContext *context, - List *pruning_steps, - PartitionDesc partdesc, - PartitionKey partkey, - PlanState *planstate) +InitPartitionPruneContext(PartitionPruneContext *context, + List *pruning_steps, + PartitionDesc partdesc, + PartitionKey partkey, + PlanState *planstate, + ExprContext *econtext) { int n_steps; int partnatts; @@ -1872,6 +1938,7 @@ ExecInitPruningContext(PartitionPruneContext *context, context->ppccontext = CurrentMemoryContext; context->planstate = planstate; + context->exprcontext = econtext; /* Initialize expression state for each expression we need */ context->exprstates = (ExprState **) @@ -1900,8 +1967,20 @@ ExecInitPruningContext(PartitionPruneContext *context, step->step.step_id, keyno); - context->exprstates[stateidx] = - ExecInitExpr(expr, context->planstate); + /* + * When planstate is NULL, pruning_steps is known not to + * contain any expressions that depend on the parent plan. + * Information of any available EXTERN parameters must be + * passed explicitly in that case, which the caller must have + * made available via econtext. + */ + if (planstate == NULL) + context->exprstates[stateidx] = + ExecInitExprWithParams(expr, + econtext->ecxt_param_list_info); + else + context->exprstates[stateidx] = + ExecInitExpr(expr, context->planstate); } keyno++; } @@ -1909,179 +1988,119 @@ ExecInitPruningContext(PartitionPruneContext *context, } /* - * ExecFindInitialMatchingSubPlans - * Identify the set of subplans that cannot be eliminated by initial - * pruning, disregarding any pruning constraints involving PARAM_EXEC - * Params. + * PartitionPruneFixSubPlanMap + * Fix mapping of partition indexes to subplan indexes contained in + * prunestate by considering the new list of subplans that survived + * initial pruning * - * If additional pruning passes will be required (because of PARAM_EXEC - * Params), we must also update the translation data that allows conversion - * of partition indexes into subplan indexes to account for the unneeded - * subplans having been removed. - * - * Must only be called once per 'prunestate', and only if initial pruning - * is required. - * - * 'nsubplans' must be passed as the total number of unpruned subplans. + * Current values of the indexes present in PartitionPruneState count all the + * subplans that would be present before initial pruning was done. If initial + * pruning got rid of some of the subplans, any subsequent pruning passes will + * will be looking at a different set of target subplans to choose from than + * those in the pre-initial-pruning set, so the maps in PartitionPruneState + * containing those indexes must be updated to reflect the new indexes of + * subplans in the post-initial-pruning set. */ -Bitmapset * -ExecFindInitialMatchingSubPlans(PartitionPruneState *prunestate, int nsubplans) +static void +PartitionPruneFixSubPlanMap(PartitionPruneState *prunestate, + Bitmapset *initially_valid_subplans, + int n_total_subplans) { - Bitmapset *result = NULL; - MemoryContext oldcontext; + int *new_subplan_indexes; + Bitmapset *new_other_subplans; int i; - - /* Caller error if we get here without do_initial_prune */ - Assert(prunestate->do_initial_prune); + int newidx; /* - * Switch to a temp context to avoid leaking memory in the executor's - * query-lifespan memory context. + * First we must build a temporary array which maps old subplan indexes to + * new ones. For convenience of initialization, we use 1-based indexes in + * this array and leave pruned items as 0. */ - oldcontext = MemoryContextSwitchTo(prunestate->prune_context); - - /* - * For each hierarchy, do the pruning tests, and add nondeletable - * subplans' indexes to "result". - */ - for (i = 0; i < prunestate->num_partprunedata; i++) + new_subplan_indexes = (int *) palloc0(sizeof(int) * n_total_subplans); + newidx = 1; + i = -1; + while ((i = bms_next_member(initially_valid_subplans, i)) >= 0) { - PartitionPruningData *prunedata; - PartitionedRelPruningData *pprune; - - prunedata = prunestate->partprunedata[i]; - pprune = &prunedata->partrelprunedata[0]; - - /* Perform pruning without using PARAM_EXEC Params */ - find_matching_subplans_recurse(prunedata, pprune, true, &result); - - /* Expression eval may have used space in node's ps_ExprContext too */ - if (pprune->initial_pruning_steps) - ResetExprContext(pprune->initial_context.planstate->ps_ExprContext); + Assert(i < n_total_subplans); + new_subplan_indexes[i] = newidx++; } - /* Add in any subplans that partition pruning didn't account for */ - result = bms_add_members(result, prunestate->other_subplans); - - MemoryContextSwitchTo(oldcontext); - - /* Copy result out of the temp context before we reset it */ - result = bms_copy(result); - - MemoryContextReset(prunestate->prune_context); - /* - * If exec-time pruning is required and we pruned subplans above, then we - * must re-sequence the subplan indexes so that ExecFindMatchingSubPlans - * properly returns the indexes from the subplans which will remain after - * execution of this function. - * - * We can safely skip this when !do_exec_prune, even though that leaves - * invalid data in prunestate, because that data won't be consulted again - * (cf initial Assert in ExecFindMatchingSubPlans). + * Now we can update each PartitionedRelPruneInfo's subplan_map with new + * subplan indexes. We must also recompute its present_parts bitmap. */ - if (prunestate->do_exec_prune && bms_num_members(result) < nsubplans) + for (i = 0; i < prunestate->num_partprunedata; i++) { - int *new_subplan_indexes; - Bitmapset *new_other_subplans; - int i; - int newidx; + PartitionPruningData *prunedata = prunestate->partprunedata[i]; + int j; /* - * First we must build a temporary array which maps old subplan - * indexes to new ones. For convenience of initialization, we use - * 1-based indexes in this array and leave pruned items as 0. + * Within each hierarchy, we perform this loop in back-to-front order + * so that we determine present_parts for the lowest-level partitioned + * tables first. This way we can tell whether a sub-partitioned + * table's partitions were entirely pruned so we can exclude it from + * the current level's present_parts. */ - new_subplan_indexes = (int *) palloc0(sizeof(int) * nsubplans); - newidx = 1; - i = -1; - while ((i = bms_next_member(result, i)) >= 0) + for (j = prunedata->num_partrelprunedata - 1; j >= 0; j--) { - Assert(i < nsubplans); - new_subplan_indexes[i] = newidx++; - } + PartitionedRelPruningData *pprune = &prunedata->partrelprunedata[j]; + int nparts = pprune->nparts; + int k; - /* - * Now we can update each PartitionedRelPruneInfo's subplan_map with - * new subplan indexes. We must also recompute its present_parts - * bitmap. - */ - for (i = 0; i < prunestate->num_partprunedata; i++) - { - PartitionPruningData *prunedata = prunestate->partprunedata[i]; - int j; + /* We just rebuild present_parts from scratch */ + bms_free(pprune->present_parts); + pprune->present_parts = NULL; - /* - * Within each hierarchy, we perform this loop in back-to-front - * order so that we determine present_parts for the lowest-level - * partitioned tables first. This way we can tell whether a - * sub-partitioned table's partitions were entirely pruned so we - * can exclude it from the current level's present_parts. - */ - for (j = prunedata->num_partrelprunedata - 1; j >= 0; j--) + for (k = 0; k < nparts; k++) { - PartitionedRelPruningData *pprune = &prunedata->partrelprunedata[j]; - int nparts = pprune->nparts; - int k; - - /* We just rebuild present_parts from scratch */ - bms_free(pprune->present_parts); - pprune->present_parts = NULL; + int oldidx = pprune->subplan_map[k]; + int subidx; - for (k = 0; k < nparts; k++) + /* + * If this partition existed as a subplan then change the old + * subplan index to the new subplan index. The new index may + * become -1 if the partition was pruned above, or it may just + * come earlier in the subplan list due to some subplans being + * removed earlier in the list. If it's a subpartition, add + * it to present_parts unless it's entirely pruned. + */ + if (oldidx >= 0) { - int oldidx = pprune->subplan_map[k]; - int subidx; + Assert(oldidx < n_total_subplans); + pprune->subplan_map[k] = new_subplan_indexes[oldidx] - 1; - /* - * If this partition existed as a subplan then change the - * old subplan index to the new subplan index. The new - * index may become -1 if the partition was pruned above, - * or it may just come earlier in the subplan list due to - * some subplans being removed earlier in the list. If - * it's a subpartition, add it to present_parts unless - * it's entirely pruned. - */ - if (oldidx >= 0) - { - Assert(oldidx < nsubplans); - pprune->subplan_map[k] = new_subplan_indexes[oldidx] - 1; - - if (new_subplan_indexes[oldidx] > 0) - pprune->present_parts = - bms_add_member(pprune->present_parts, k); - } - else if ((subidx = pprune->subpart_map[k]) >= 0) - { - PartitionedRelPruningData *subprune; + if (new_subplan_indexes[oldidx] > 0) + pprune->present_parts = + bms_add_member(pprune->present_parts, k); + } + else if ((subidx = pprune->subpart_map[k]) >= 0) + { + PartitionedRelPruningData *subprune; - subprune = &prunedata->partrelprunedata[subidx]; + subprune = &prunedata->partrelprunedata[subidx]; - if (!bms_is_empty(subprune->present_parts)) - pprune->present_parts = - bms_add_member(pprune->present_parts, k); - } + if (!bms_is_empty(subprune->present_parts)) + pprune->present_parts = + bms_add_member(pprune->present_parts, k); } } } + } - /* - * We must also recompute the other_subplans set, since indexes in it - * may change. - */ - new_other_subplans = NULL; - i = -1; - while ((i = bms_next_member(prunestate->other_subplans, i)) >= 0) - new_other_subplans = bms_add_member(new_other_subplans, - new_subplan_indexes[i] - 1); - - bms_free(prunestate->other_subplans); - prunestate->other_subplans = new_other_subplans; + /* + * We must also recompute the other_subplans set, since indexes in it may + * change. + */ + new_other_subplans = NULL; + i = -1; + while ((i = bms_next_member(prunestate->other_subplans, i)) >= 0) + new_other_subplans = bms_add_member(new_other_subplans, + new_subplan_indexes[i] - 1); - pfree(new_subplan_indexes); - } + bms_free(prunestate->other_subplans); + prunestate->other_subplans = new_other_subplans; - return result; + pfree(new_subplan_indexes); } /* @@ -2089,21 +2108,24 @@ ExecFindInitialMatchingSubPlans(PartitionPruneState *prunestate, int nsubplans) * Determine which subplans match the pruning steps detailed in * 'prunestate' for the current comparison expression values. * - * Here we assume we may evaluate PARAM_EXEC Params. + * Pass initial_prune if PARAM_EXEC Params cannot yet be evaluated. This + * differentiates the initial executor-time pruning step from later + * runtime pruning. */ Bitmapset * -ExecFindMatchingSubPlans(PartitionPruneState *prunestate) +ExecFindMatchingSubPlans(PartitionPruneState *prunestate, + bool initial_prune) { Bitmapset *result = NULL; MemoryContext oldcontext; int i; /* - * If !do_exec_prune, we've got problems because - * ExecFindInitialMatchingSubPlans will not have bothered to update - * prunestate for whatever pruning it did. + * Either we're here on the initial prune done during pruning + * initialization, or we're at a point where PARAM_EXEC Params can be + * evaluated *and* there are steps in which to do so. */ - Assert(prunestate->do_exec_prune); + Assert(initial_prune || prunestate->do_exec_prune); /* * Switch to a temp context to avoid leaking memory in the executor's @@ -2117,17 +2139,21 @@ ExecFindMatchingSubPlans(PartitionPruneState *prunestate) */ for (i = 0; i < prunestate->num_partprunedata; i++) { - PartitionPruningData *prunedata; + PartitionPruningData *prunedata = prunestate->partprunedata[i]; PartitionedRelPruningData *pprune; - prunedata = prunestate->partprunedata[i]; + /* + * We pass the zeroth item, belonging to the root table of the + * hierarchy, and find_matching_subplans_recurse() takes care of + * recursing to other (lower-level) parents as needed. + */ pprune = &prunedata->partrelprunedata[0]; + find_matching_subplans_recurse(prunedata, pprune, initial_prune, + &result); - find_matching_subplans_recurse(prunedata, pprune, false, &result); - - /* Expression eval may have used space in node's ps_ExprContext too */ + /* Expression eval may have used space in ExprContext too */ if (pprune->exec_pruning_steps) - ResetExprContext(pprune->exec_context.planstate->ps_ExprContext); + ResetExprContext(pprune->exec_context.exprcontext); } /* Add in any subplans that partition pruning didn't account for */ @@ -2145,8 +2171,7 @@ ExecFindMatchingSubPlans(PartitionPruneState *prunestate) /* * find_matching_subplans_recurse - * Recursive worker function for ExecFindMatchingSubPlans and - * ExecFindInitialMatchingSubPlans + * Recursive worker function for ExecFindMatchingSubPlans * * Adds valid (non-prunable) subplan IDs to *validsubplans */ @@ -2162,25 +2187,19 @@ find_matching_subplans_recurse(PartitionPruningData *prunedata, /* Guard against stack overflow due to overly deep partition hierarchy. */ check_stack_depth(); - /* Only prune if pruning would be useful at this level. */ + /* + * Prune as appropriate, if we have pruning steps matching the current + * execution context. Otherwise just include all partitions at this + * level. + */ if (initial_prune && pprune->initial_pruning_steps) - { partset = get_matching_partitions(&pprune->initial_context, pprune->initial_pruning_steps); - } else if (!initial_prune && pprune->exec_pruning_steps) - { partset = get_matching_partitions(&pprune->exec_context, pprune->exec_pruning_steps); - } else - { - /* - * If no pruning is to be done, just include all partitions at this - * level. - */ partset = pprune->present_parts; - } /* Translate partset into subplan indexes */ i = -1; diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c index 7937f1c88f..357e10a1d7 100644 --- a/src/backend/executor/nodeAppend.c +++ b/src/backend/executor/nodeAppend.c @@ -138,30 +138,17 @@ ExecInitAppend(Append *node, EState *estate, int eflags) { PartitionPruneState *prunestate; - /* We may need an expression context to evaluate partition exprs */ - ExecAssignExprContext(estate, &appendstate->ps); - - /* Create the working data structure for pruning. */ - prunestate = ExecCreatePartitionPruneState(&appendstate->ps, - node->part_prune_info); + /* + * Set up pruning data structure. This also initializes the set of + * subplans to initialize (validsubplans) by taking into account the + * result of performing initial pruning if any. + */ + prunestate = ExecInitPartitionPruning(&appendstate->ps, + list_length(node->appendplans), + node->part_prune_info, + &validsubplans); appendstate->as_prune_state = prunestate; - - /* Perform an initial partition prune, if required. */ - if (prunestate->do_initial_prune) - { - /* Determine which subplans survive initial pruning */ - validsubplans = ExecFindInitialMatchingSubPlans(prunestate, - list_length(node->appendplans)); - - nplans = bms_num_members(validsubplans); - } - else - { - /* We'll need to initialize all subplans */ - nplans = list_length(node->appendplans); - Assert(nplans > 0); - validsubplans = bms_add_range(NULL, 0, nplans - 1); - } + nplans = bms_num_members(validsubplans); /* * When no run-time pruning is required and there's at least one @@ -590,7 +577,7 @@ choose_next_subplan_locally(AppendState *node) } else if (node->as_valid_subplans == NULL) node->as_valid_subplans = - ExecFindMatchingSubPlans(node->as_prune_state); + ExecFindMatchingSubPlans(node->as_prune_state, false); whichplan = -1; } @@ -655,7 +642,7 @@ choose_next_subplan_for_leader(AppendState *node) if (node->as_valid_subplans == NULL) { node->as_valid_subplans = - ExecFindMatchingSubPlans(node->as_prune_state); + ExecFindMatchingSubPlans(node->as_prune_state, false); /* * Mark each invalid plan as finished to allow the loop below to @@ -730,7 +717,7 @@ choose_next_subplan_for_worker(AppendState *node) else if (node->as_valid_subplans == NULL) { node->as_valid_subplans = - ExecFindMatchingSubPlans(node->as_prune_state); + ExecFindMatchingSubPlans(node->as_prune_state, false); mark_invalid_subplans_as_finished(node); } @@ -881,7 +868,7 @@ ExecAppendAsyncBegin(AppendState *node) if (node->as_valid_subplans == NULL) { node->as_valid_subplans = - ExecFindMatchingSubPlans(node->as_prune_state); + ExecFindMatchingSubPlans(node->as_prune_state, false); classify_matching_subplans(node); } diff --git a/src/backend/executor/nodeMergeAppend.c b/src/backend/executor/nodeMergeAppend.c index 418f89dea8..ecf9052e03 100644 --- a/src/backend/executor/nodeMergeAppend.c +++ b/src/backend/executor/nodeMergeAppend.c @@ -86,29 +86,17 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags) { PartitionPruneState *prunestate; - /* We may need an expression context to evaluate partition exprs */ - ExecAssignExprContext(estate, &mergestate->ps); - - prunestate = ExecCreatePartitionPruneState(&mergestate->ps, - node->part_prune_info); + /* + * Set up pruning data structure. This also initializes the set of + * subplans to initialize (validsubplans) by taking into account the + * result of performing initial pruning if any. + */ + prunestate = ExecInitPartitionPruning(&mergestate->ps, + list_length(node->mergeplans), + node->part_prune_info, + &validsubplans); mergestate->ms_prune_state = prunestate; - - /* Perform an initial partition prune, if required. */ - if (prunestate->do_initial_prune) - { - /* Determine which subplans survive initial pruning */ - validsubplans = ExecFindInitialMatchingSubPlans(prunestate, - list_length(node->mergeplans)); - - nplans = bms_num_members(validsubplans); - } - else - { - /* We'll need to initialize all subplans */ - nplans = list_length(node->mergeplans); - Assert(nplans > 0); - validsubplans = bms_add_range(NULL, 0, nplans - 1); - } + nplans = bms_num_members(validsubplans); /* * When no run-time pruning is required and there's at least one @@ -230,7 +218,7 @@ ExecMergeAppend(PlanState *pstate) */ if (node->ms_valid_subplans == NULL) node->ms_valid_subplans = - ExecFindMatchingSubPlans(node->ms_prune_state); + ExecFindMatchingSubPlans(node->ms_prune_state, false); /* * First time through: pull the first tuple from each valid subplan, diff --git a/src/backend/partitioning/partprune.c b/src/backend/partitioning/partprune.c index 1bc00826c1..9d3c05aed3 100644 --- a/src/backend/partitioning/partprune.c +++ b/src/backend/partitioning/partprune.c @@ -798,6 +798,7 @@ prune_append_rel_partitions(RelOptInfo *rel) /* These are not valid when being called from the planner */ context.planstate = NULL; + context.exprcontext = NULL; context.exprstates = NULL; /* Actual pruning happens here. */ @@ -808,8 +809,8 @@ prune_append_rel_partitions(RelOptInfo *rel) * get_matching_partitions * Determine partitions that survive partition pruning * - * Note: context->planstate must be set to a valid PlanState when the - * pruning_steps were generated with a target other than PARTTARGET_PLANNER. + * Note: context->exprcontext must be valid when the pruning_steps were + * generated with a target other than PARTTARGET_PLANNER. * * Returns a Bitmapset of the RelOptInfo->part_rels indexes of the surviving * partitions. @@ -3654,9 +3655,9 @@ match_boolean_partition_clause(Oid partopfamily, Expr *clause, Expr *partkey, * exprstate array. * * Note that the evaluated result may be in the per-tuple memory context of - * context->planstate->ps_ExprContext, and we may have leaked other memory - * there too. This memory must be recovered by resetting that ExprContext - * after we're done with the pruning operation (see execPartition.c). + * context->exprcontext, and we may have leaked other memory there too. + * This memory must be recovered by resetting that ExprContext after + * we're done with the pruning operation (see execPartition.c). */ static void partkey_datum_from_expr(PartitionPruneContext *context, @@ -3677,13 +3678,18 @@ partkey_datum_from_expr(PartitionPruneContext *context, ExprContext *ectx; /* - * We should never see a non-Const in a step unless we're running in - * the executor. + * We should never see a non-Const in a step unless the caller has + * passed a valid ExprContext. + * + * When context->planstate is valid, context->exprcontext is same as + * context->planstate->ps_ExprContext. */ - Assert(context->planstate != NULL); + Assert(context->planstate != NULL || context->exprcontext != NULL); + Assert(context->planstate == NULL || + (context->exprcontext == context->planstate->ps_ExprContext)); exprstate = context->exprstates[stateidx]; - ectx = context->planstate->ps_ExprContext; + ectx = context->exprcontext; *value = ExecEvalExprSwitchContext(exprstate, ectx, isnull); } } diff --git a/src/include/executor/execPartition.h b/src/include/executor/execPartition.h index 603d8becc4..708435e952 100644 --- a/src/include/executor/execPartition.h +++ b/src/include/executor/execPartition.h @@ -22,6 +22,17 @@ typedef struct PartitionDispatchData *PartitionDispatch; typedef struct PartitionTupleRouting PartitionTupleRouting; +extern PartitionTupleRouting *ExecSetupPartitionTupleRouting(EState *estate, + Relation rel); +extern ResultRelInfo *ExecFindPartition(ModifyTableState *mtstate, + ResultRelInfo *rootResultRelInfo, + PartitionTupleRouting *proute, + TupleTableSlot *slot, + EState *estate); +extern void ExecCleanupTupleRouting(ModifyTableState *mtstate, + PartitionTupleRouting *proute); + + /* * PartitionedRelPruningData - Per-partitioned-table data for run-time pruning * of partitions. For a multilevel partitioned table, we have one of these @@ -110,19 +121,11 @@ typedef struct PartitionPruneState PartitionPruningData *partprunedata[FLEXIBLE_ARRAY_MEMBER]; } PartitionPruneState; -extern PartitionTupleRouting *ExecSetupPartitionTupleRouting(EState *estate, - Relation rel); -extern ResultRelInfo *ExecFindPartition(ModifyTableState *mtstate, - ResultRelInfo *rootResultRelInfo, - PartitionTupleRouting *proute, - TupleTableSlot *slot, - EState *estate); -extern void ExecCleanupTupleRouting(ModifyTableState *mtstate, - PartitionTupleRouting *proute); -extern PartitionPruneState *ExecCreatePartitionPruneState(PlanState *planstate, - PartitionPruneInfo *partitionpruneinfo); -extern Bitmapset *ExecFindMatchingSubPlans(PartitionPruneState *prunestate); -extern Bitmapset *ExecFindInitialMatchingSubPlans(PartitionPruneState *prunestate, - int nsubplans); +extern PartitionPruneState *ExecInitPartitionPruning(PlanState *planstate, + int n_total_subplans, + PartitionPruneInfo *pruneinfo, + Bitmapset **initially_valid_subplans); +extern Bitmapset *ExecFindMatchingSubPlans(PartitionPruneState *prunestate, + bool initial_prune); #endif /* EXECPARTITION_H */ diff --git a/src/include/partitioning/partprune.h b/src/include/partitioning/partprune.h index ee11b6feae..90684efa25 100644 --- a/src/include/partitioning/partprune.h +++ b/src/include/partitioning/partprune.h @@ -41,6 +41,7 @@ struct RelOptInfo; * subsidiary data, such as the FmgrInfos. * planstate Points to the parent plan node's PlanState when called * during execution; NULL when called from the planner. + * exprcontext ExprContext to use when evaluating pruning expressions * exprstates Array of ExprStates, indexed as per PruneCxtStateIdx; one * for each partition key in each pruning step. Allocated if * planstate is non-NULL, otherwise NULL. @@ -56,6 +57,7 @@ typedef struct PartitionPruneContext FmgrInfo *stepcmpfuncs; MemoryContext ppccontext; PlanState *planstate; + ExprContext *exprcontext; ExprState **exprstates; } PartitionPruneContext; From 98fe74218d97becb2a53581304c96091409fd929 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 5 Apr 2022 19:10:10 +0900 Subject: [PATCH 378/772] Extend TAP tests of pg_dump to test for compression with gzip The test logic is extended with two new concepts: - Addition of a compression command called compress_cmd, executed between restore_cmd and dump_cmd to control the contents of the dumps. In the case of this commit, this is used to compress or decompress elements of a dump to test new code paths. - Addition of a new flag called compile_option, to check if a set of tests can be executed depending on the ./configure options used in a given build. The tests introduced here are for gzip, but they are designed so as they can easily be extended for new compression methods. Author: Georgios Kokolatos, Rachel Heaton Discussion: https://postgr.es/m/faUNEOpts9vunEaLnmxmG-DldLSg_ql137OC3JYDmgrOMHm1RvvWY2IdBkv_CRxm5spCCb_OmKNk2T03TMm0fBEWveFF9wA1WizPuAgB7Ss=@protonmail.com --- src/bin/pg_dump/Makefile | 2 + src/bin/pg_dump/t/002_pg_dump.pl | 93 +++++++++++++++++++++++++++++++- 2 files changed, 93 insertions(+), 2 deletions(-) diff --git a/src/bin/pg_dump/Makefile b/src/bin/pg_dump/Makefile index 302f7e02d6..2f524b09bf 100644 --- a/src/bin/pg_dump/Makefile +++ b/src/bin/pg_dump/Makefile @@ -16,6 +16,8 @@ subdir = src/bin/pg_dump top_builddir = ../../.. include $(top_builddir)/src/Makefile.global +export GZIP_PROGRAM=$(GZIP) + override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index af5d6fa5a3..75b754a420 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -20,12 +20,22 @@ # test_key indicates that a given run should simply use the same # set of like/unlike tests as another run, and which run that is. # +# compile_option indicates if the commands run depend on a compilation +# option, if any. This can be used to control if tests should be +# skipped when a build dependency is not satisfied. +# # dump_cmd is the pg_dump command to run, which is an array of # the full command and arguments to run. Note that this is run # using $node->command_ok(), so the port does not need to be # specified and is pulled from $PGPORT, which is set by the # PostgreSQL::Test::Cluster system. # +# compress_cmd is the utility command for (de)compression, if any. +# Note that this should generally be used on pg_dump's output +# either to generate a text file to run the through the tests, or +# to test pg_restore's ability to parse manually compressed files +# that otherwise pg_dump does not compress on its own (e.g. *.toc). +# # restore_cmd is the pg_restore command to run, if any. Note # that this should generally be used when the pg_dump goes to # a non-text file and that the restore can then be used to @@ -54,6 +64,58 @@ "$tempdir/binary_upgrade.dump", ], }, + + # Do not use --no-sync to give test coverage for data sync. + compression_gzip_custom => { + test_key => 'compression', + compile_option => 'gzip', + dump_cmd => [ + 'pg_dump', '--format=custom', + '--compress=1', "--file=$tempdir/compression_gzip_custom.dump", + 'postgres', + ], + restore_cmd => [ + 'pg_restore', + "--file=$tempdir/compression_gzip_custom.sql", + "$tempdir/compression_gzip_custom.dump", + ], + }, + + # Do not use --no-sync to give test coverage for data sync. + compression_gzip_dir => { + test_key => 'compression', + compile_option => 'gzip', + dump_cmd => [ + 'pg_dump', '--jobs=2', + '--format=directory', '--compress=1', + "--file=$tempdir/compression_gzip_dir", 'postgres', + ], + # Give coverage for manually compressed blob.toc files during + # restore. + compress_cmd => { + program => $ENV{'GZIP_PROGRAM'}, + args => [ '-f', "$tempdir/compression_gzip_dir/blobs.toc", ], + }, + restore_cmd => [ + 'pg_restore', '--jobs=2', + "--file=$tempdir/compression_gzip_dir.sql", + "$tempdir/compression_gzip_dir", + ], + }, + + compression_gzip_plain => { + test_key => 'compression', + compile_option => 'gzip', + dump_cmd => [ + 'pg_dump', '--format=plain', '-Z1', + "--file=$tempdir/compression_gzip_plain.sql.gz", 'postgres', + ], + # Decompress the generated file to run through the tests. + compress_cmd => { + program => $ENV{'GZIP_PROGRAM'}, + args => [ '-d', "$tempdir/compression_gzip_plain.sql.gz", ], + }, + }, clean => { dump_cmd => [ 'pg_dump', @@ -424,6 +486,7 @@ binary_upgrade => 1, clean => 1, clean_if_exists => 1, + compression => 1, createdb => 1, defaults => 1, exclude_dump_test_schema => 1, @@ -3098,6 +3161,7 @@ binary_upgrade => 1, clean => 1, clean_if_exists => 1, + compression => 1, createdb => 1, defaults => 1, exclude_test_table => 1, @@ -3171,6 +3235,7 @@ binary_upgrade => 1, clean => 1, clean_if_exists => 1, + compression => 1, createdb => 1, defaults => 1, exclude_dump_test_schema => 1, @@ -3833,8 +3898,9 @@ $collation_support = 1; } -# Determine whether build supports LZ4. -my $supports_lz4 = check_pg_config("#define USE_LZ4 1"); +# Determine whether build supports LZ4 and gzip. +my $supports_lz4 = check_pg_config("#define USE_LZ4 1"); +my $supports_gzip = check_pg_config("#define HAVE_LIBZ 1"); # Create additional databases for mutations of schema public $node->psql('postgres', 'create database regress_pg_dump_test;'); @@ -3947,9 +4013,32 @@ my $test_key = $run; my $run_db = 'postgres'; + # Skip command-level tests for gzip if there is no support for it. + if ( defined($pgdump_runs{$run}->{compile_option}) + && $pgdump_runs{$run}->{compile_option} eq 'gzip' + && !$supports_gzip) + { + note "$run: skipped due to no gzip support"; + next; + } + $node->command_ok(\@{ $pgdump_runs{$run}->{dump_cmd} }, "$run: pg_dump runs"); + if ($pgdump_runs{$run}->{compress_cmd}) + { + my ($compress_cmd) = $pgdump_runs{$run}->{compress_cmd}; + my $compress_program = $compress_cmd->{program}; + + # Skip the rest of the test if the compression program is + # not defined. + next if (!defined($compress_program) || $compress_program eq ''); + + my @full_compress_cmd = + ($compress_cmd->{program}, @{ $compress_cmd->{args} }); + command_ok(\@full_compress_cmd, "$run: compression commands"); + } + if ($pgdump_runs{$run}->{restore_cmd}) { $node->command_ok(\@{ $pgdump_runs{$run}->{restore_cmd} }, From 16915126746e2d8597a92197a346fea0756f8e3e Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Tue, 5 Apr 2022 14:45:31 +0200 Subject: [PATCH 379/772] pg_rewind: Fetch small files according to new size. There's a race condition if a file changes in the source system after we have collected the file list. If the file becomes larger, we only fetched up to its original size. That can easily result in a truncated file. That's not a problem for relation files, files in pg_xact, etc. because any actions on them will be replayed from the WAL. However, configuration files are affected. This commit mitigates the race condition by fetching small files in whole, even if they have grown. A test is added in which an extra file copied is concurrently grown with the output of pg_rewind thus guaranteeing it to have changed in size during the operation. This is not a full fix: we still believe the original file size for files larger than 1 MB. That should be enough for configuration files, and doing more than that would require big changes to the chunking logic in libpq_source.c. This mitigates the race condition if the file is modified between the original scan of files and copying the file, but there's still a race condition if a file is changed while it's being copied. That's a much smaller window, though, and pg_basebackup has the same issue. This race can be seen with pg_auto_failover, which frequently uses ALTER SYSTEM, which updates postgresql.auto.conf. Often, pg_rewind will fail, because the postgresql.auto.conf file changed concurrently and a partial version of it was copied to the target. The partial file would fail to parse, preventing the server from starting up. Author: Heikki Linnakangas Reviewed-by: Cary Huang Discussion: https://postgr.es/m/f67feb24-5833-88cb-1020-19a4a2b83ac7%40iki.fi --- src/bin/pg_rewind/libpq_source.c | 32 ++++++++++ src/bin/pg_rewind/local_source.c | 76 ++++++++++++++++++++---- src/bin/pg_rewind/pg_rewind.c | 5 +- src/bin/pg_rewind/rewind_source.h | 13 ++++ src/bin/pg_rewind/t/009_growing_files.pl | 76 ++++++++++++++++++++++++ 5 files changed, 188 insertions(+), 14 deletions(-) create mode 100644 src/bin/pg_rewind/t/009_growing_files.pl diff --git a/src/bin/pg_rewind/libpq_source.c b/src/bin/pg_rewind/libpq_source.c index 997d4e2b48..011c9cce6e 100644 --- a/src/bin/pg_rewind/libpq_source.c +++ b/src/bin/pg_rewind/libpq_source.c @@ -63,6 +63,7 @@ static void process_queued_fetch_requests(libpq_source *src); /* public interface functions */ static void libpq_traverse_files(rewind_source *source, process_file_callback_t callback); +static void libpq_queue_fetch_file(rewind_source *source, const char *path, size_t len); static void libpq_queue_fetch_range(rewind_source *source, const char *path, off_t off, size_t len); static void libpq_finish_fetch(rewind_source *source); @@ -88,6 +89,7 @@ init_libpq_source(PGconn *conn) src->common.traverse_files = libpq_traverse_files; src->common.fetch_file = libpq_fetch_file; + src->common.queue_fetch_file = libpq_queue_fetch_file; src->common.queue_fetch_range = libpq_queue_fetch_range; src->common.finish_fetch = libpq_finish_fetch; src->common.get_current_wal_insert_lsn = libpq_get_current_wal_insert_lsn; @@ -307,6 +309,36 @@ libpq_traverse_files(rewind_source *source, process_file_callback_t callback) PQclear(res); } +/* + * Queue up a request to fetch a file from remote system. + */ +static void +libpq_queue_fetch_file(rewind_source *source, const char *path, size_t len) +{ + /* + * Truncate the target file immediately, and queue a request to fetch it + * from the source. If the file is small, smaller than MAX_CHUNK_SIZE, + * request fetching a full-sized chunk anyway, so that if the file has + * become larger in the source system, after we scanned the source + * directory, we still fetch the whole file. This only works for files up + * to MAX_CHUNK_SIZE, but that's good enough for small configuration files + * and such that are changed every now and then, but not WAL-logged. For + * larger files, we fetch up to the original size. + * + * Even with that mechanism, there is an inherent race condition if the + * file is modified at the same instant that we're copying it, so that we + * might copy a torn version of the file with one half from the old + * version and another half from the new. But pg_basebackup has the same + * problem, and it hasn't been a problem in practice. + * + * It might seem more natural to truncate the file later, when we receive + * it from the source server, but then we'd need to track which + * fetch-requests are for a whole file. + */ + open_target_file(path, true); + libpq_queue_fetch_range(source, path, 0, Max(len, MAX_CHUNK_SIZE)); +} + /* * Queue up a request to fetch a piece of a file from remote system. */ diff --git a/src/bin/pg_rewind/local_source.c b/src/bin/pg_rewind/local_source.c index 3406fc7037..58699effcc 100644 --- a/src/bin/pg_rewind/local_source.c +++ b/src/bin/pg_rewind/local_source.c @@ -29,8 +29,10 @@ static void local_traverse_files(rewind_source *source, process_file_callback_t callback); static char *local_fetch_file(rewind_source *source, const char *path, size_t *filesize); -static void local_fetch_file_range(rewind_source *source, const char *path, - off_t off, size_t len); +static void local_queue_fetch_file(rewind_source *source, const char *path, + size_t len); +static void local_queue_fetch_range(rewind_source *source, const char *path, + off_t off, size_t len); static void local_finish_fetch(rewind_source *source); static void local_destroy(rewind_source *source); @@ -43,7 +45,8 @@ init_local_source(const char *datadir) src->common.traverse_files = local_traverse_files; src->common.fetch_file = local_fetch_file; - src->common.queue_fetch_range = local_fetch_file_range; + src->common.queue_fetch_file = local_queue_fetch_file; + src->common.queue_fetch_range = local_queue_fetch_range; src->common.finish_fetch = local_finish_fetch; src->common.get_current_wal_insert_lsn = NULL; src->common.destroy = local_destroy; @@ -65,12 +68,65 @@ local_fetch_file(rewind_source *source, const char *path, size_t *filesize) return slurpFile(((local_source *) source)->datadir, path, filesize); } +/* + * Copy a file from source to target. + * + * 'len' is the expected length of the file. + */ +static void +local_queue_fetch_file(rewind_source *source, const char *path, size_t len) +{ + const char *datadir = ((local_source *) source)->datadir; + PGAlignedBlock buf; + char srcpath[MAXPGPATH]; + int srcfd; + size_t written_len; + + snprintf(srcpath, sizeof(srcpath), "%s/%s", datadir, path); + + /* Open source file for reading */ + srcfd = open(srcpath, O_RDONLY | PG_BINARY, 0); + if (srcfd < 0) + pg_fatal("could not open source file \"%s\": %m", + srcpath); + + /* Truncate and open the target file for writing */ + open_target_file(path, true); + + written_len = 0; + for (;;) + { + ssize_t read_len; + + read_len = read(srcfd, buf.data, sizeof(buf)); + + if (read_len < 0) + pg_fatal("could not read file \"%s\": %m", srcpath); + else if (read_len == 0) + break; /* EOF reached */ + + write_target_range(buf.data, written_len, read_len); + written_len += read_len; + } + + /* + * A local source is not expected to change while we're rewinding, so + * check that the size of the file matches our earlier expectation. + */ + if (written_len != len) + pg_fatal("size of source file \"%s\" changed concurrently: " UINT64_FORMAT " bytes expected, " UINT64_FORMAT " copied", + srcpath, len, written_len); + + if (close(srcfd) != 0) + pg_fatal("could not close file \"%s\": %m", srcpath); +} + /* * Copy a file from source to target, starting at 'off', for 'len' bytes. */ static void -local_fetch_file_range(rewind_source *source, const char *path, off_t off, - size_t len) +local_queue_fetch_range(rewind_source *source, const char *path, off_t off, + size_t len) { const char *datadir = ((local_source *) source)->datadir; PGAlignedBlock buf; @@ -94,14 +150,14 @@ local_fetch_file_range(rewind_source *source, const char *path, off_t off, while (end - begin > 0) { ssize_t readlen; - size_t len; + size_t thislen; if (end - begin > sizeof(buf)) - len = sizeof(buf); + thislen = sizeof(buf); else - len = end - begin; + thislen = end - begin; - readlen = read(srcfd, buf.data, len); + readlen = read(srcfd, buf.data, thislen); if (readlen < 0) pg_fatal("could not read file \"%s\": %m", srcpath); @@ -120,7 +176,7 @@ static void local_finish_fetch(rewind_source *source) { /* - * Nothing to do, local_fetch_file_range() copies the ranges immediately. + * Nothing to do, local_queue_fetch_range() copies the ranges immediately. */ } diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c index b39b5c1aac..6cc44172fb 100644 --- a/src/bin/pg_rewind/pg_rewind.c +++ b/src/bin/pg_rewind/pg_rewind.c @@ -537,10 +537,7 @@ perform_rewind(filemap_t *filemap, rewind_source *source, break; case FILE_ACTION_COPY: - /* Truncate the old file out of the way, if any */ - open_target_file(entry->path, true); - source->queue_fetch_range(source, entry->path, - 0, entry->source_size); + source->queue_fetch_file(source, entry->path, entry->source_size); break; case FILE_ACTION_TRUNCATE: diff --git a/src/bin/pg_rewind/rewind_source.h b/src/bin/pg_rewind/rewind_source.h index 78a12eb0f3..1310e86e75 100644 --- a/src/bin/pg_rewind/rewind_source.h +++ b/src/bin/pg_rewind/rewind_source.h @@ -47,6 +47,19 @@ typedef struct rewind_source void (*queue_fetch_range) (struct rewind_source *, const char *path, off_t offset, size_t len); + /* + * Like queue_fetch_range(), but requests replacing the whole local file + * from the source system. 'len' is the expected length of the file, + * although when the source is a live server, the file may change + * concurrently. The implementation is not obliged to copy more than 'len' + * bytes, even if the file is larger. However, to avoid copying a + * truncated version of the file, which can cause trouble if e.g. a + * configuration file is modified concurrently, the implementation should + * try to copy the whole file, even if it's larger than expected. + */ + void (*queue_fetch_file) (struct rewind_source *, const char *path, + size_t len); + /* * Execute all requests queued up with queue_fetch_range(). */ diff --git a/src/bin/pg_rewind/t/009_growing_files.pl b/src/bin/pg_rewind/t/009_growing_files.pl new file mode 100644 index 0000000000..752781e637 --- /dev/null +++ b/src/bin/pg_rewind/t/009_growing_files.pl @@ -0,0 +1,76 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +use strict; +use warnings; +use PostgreSQL::Test::Utils; +use Test::More; + +use FindBin; +use lib $FindBin::RealBin; + +use RewindTest; + +RewindTest::setup_cluster("local"); +RewindTest::start_primary(); + +# Create a test table and insert a row in primary. +primary_psql("CREATE TABLE tbl1 (d text)"); +primary_psql("INSERT INTO tbl1 VALUES ('in primary')"); +primary_psql("CHECKPOINT"); + +RewindTest::create_standby("local"); + +# Insert additional data on primary that will be replicated to standby +primary_psql("INSERT INTO tbl1 values ('in primary, before promotion')"); +primary_psql('CHECKPOINT'); + +RewindTest::promote_standby(); + +# Insert a row in the old primary. This causes the primary and standby to have +# "diverged", it's no longer possible to just apply the standy's logs over +# primary directory - you need to rewind. Also insert a new row in the +# standby, which won't be present in the old primary. +primary_psql("INSERT INTO tbl1 VALUES ('in primary, after promotion')"); +standby_psql("INSERT INTO tbl1 VALUES ('in standby, after promotion')"); + +# Stop the nodes before running pg_rewind +$node_standby->stop; +$node_primary->stop; + +my $primary_pgdata = $node_primary->data_dir; +my $standby_pgdata = $node_standby->data_dir; + +# Add an extra file that we can tamper with without interfering with the data +# directory data files. +mkdir "$standby_pgdata/tst_both_dir"; +append_to_file "$standby_pgdata/tst_both_dir/file1", 'a'; + +# Run pg_rewind and pipe the output from the run into the extra file we want +# to copy. This will ensure that the file is continously growing during the +# copy operation and the result will be an error. +my $ret = run_log( + [ + 'pg_rewind', '--debug', + '--source-pgdata', $standby_pgdata, + '--target-pgdata', $primary_pgdata, + '--no-sync', + ], + '2>>', "$standby_pgdata/tst_both_dir/file1"); +ok(!$ret, 'Error out on copying growing file'); + +# Ensure that the files are of different size, the final error message should +# only be in one of them making them guaranteed to be different +my $primary_size = -s "$primary_pgdata/tst_both_dir/file1"; +my $standby_size = -s "$standby_pgdata/tst_both_dir/file1"; +isnt($standby_size, $primary_size, "File sizes should differ"); + +# Extract the last line from the verbose output as that should have the error +# message for the unexpected file size +my $last; +open my $f, '<', "$standby_pgdata/tst_both_dir/file1"; +$last = $_ while (<$f>); +close $f; +like($last, qr/fatal: size of source file/, "Check error message"); + +done_testing(); From e83ebfe6d767dafcefe00bc5f11392a3d6976c1b Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Tue, 5 Apr 2022 09:44:52 -0700 Subject: [PATCH 380/772] Have VACUUM warn on relfrozenxid "in the future". Commits 74cf7d46 and a61daa14 fixed pg_upgrade bugs involving oversights in how relfrozenxid or relminmxid are carried forward or initialized. Corruption caused by bugs of this nature was ameliorated by commit 78db307bb2, which taught VACUUM to always overwrite existing invalid relfrozenxid or relminmxid values that are apparently "in the future". Extend that work now by showing a warning in the event of overwriting either relfrozenxid or relminmxid due to an existing value that is "in the future". There is probably a decent chance that the sanity checks added by commit 699bf7d05c will raise an error before VACUUM reaches this point, but we shouldn't rely on that. Author: Peter Geoghegan Reviewed-By: Andres Freund Discussion: https://postgr.es/m/CAH2-WzmRZEzeGvLv8yDW0AbFmSvJjTziORqjVUrf74mL4GL0Ww@mail.gmail.com --- src/backend/commands/vacuum.c | 70 ++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 18 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index deec4887be..fb33953e35 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -1340,7 +1340,11 @@ vac_update_relstats(Relation relation, Relation rd; HeapTuple ctup; Form_pg_class pgcform; - bool dirty; + bool dirty, + futurexid, + futuremxid; + TransactionId oldfrozenxid; + MultiXactId oldminmulti; rd = table_open(RelationRelationId, RowExclusiveLock); @@ -1406,32 +1410,49 @@ vac_update_relstats(Relation relation, * This should match vac_update_datfrozenxid() concerning what we consider * to be "in the future". */ + oldfrozenxid = pgcform->relfrozenxid; + futurexid = false; if (frozenxid_updated) *frozenxid_updated = false; - if (TransactionIdIsNormal(frozenxid) && - pgcform->relfrozenxid != frozenxid && - (TransactionIdPrecedes(pgcform->relfrozenxid, frozenxid) || - TransactionIdPrecedes(ReadNextTransactionId(), - pgcform->relfrozenxid))) + if (TransactionIdIsNormal(frozenxid) && oldfrozenxid != frozenxid) { - if (frozenxid_updated) - *frozenxid_updated = true; - pgcform->relfrozenxid = frozenxid; - dirty = true; + bool update = false; + + if (TransactionIdPrecedes(oldfrozenxid, frozenxid)) + update = true; + else if (TransactionIdPrecedes(ReadNextTransactionId(), oldfrozenxid)) + futurexid = update = true; + + if (update) + { + pgcform->relfrozenxid = frozenxid; + dirty = true; + if (frozenxid_updated) + *frozenxid_updated = true; + } } /* Similarly for relminmxid */ + oldminmulti = pgcform->relminmxid; + futuremxid = false; if (minmulti_updated) *minmulti_updated = false; - if (MultiXactIdIsValid(minmulti) && - pgcform->relminmxid != minmulti && - (MultiXactIdPrecedes(pgcform->relminmxid, minmulti) || - MultiXactIdPrecedes(ReadNextMultiXactId(), pgcform->relminmxid))) + if (MultiXactIdIsValid(minmulti) && oldminmulti != minmulti) { - if (minmulti_updated) - *minmulti_updated = true; - pgcform->relminmxid = minmulti; - dirty = true; + bool update = false; + + if (MultiXactIdPrecedes(oldminmulti, minmulti)) + update = true; + else if (MultiXactIdPrecedes(ReadNextMultiXactId(), oldminmulti)) + futuremxid = update = true; + + if (update) + { + pgcform->relminmxid = minmulti; + dirty = true; + if (minmulti_updated) + *minmulti_updated = true; + } } /* If anything changed, write out the tuple. */ @@ -1439,6 +1460,19 @@ vac_update_relstats(Relation relation, heap_inplace_update(rd, ctup); table_close(rd, RowExclusiveLock); + + if (futurexid) + ereport(WARNING, + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg_internal("overwrote invalid relfrozenxid value %u with new value %u for table \"%s\"", + oldfrozenxid, frozenxid, + RelationGetRelationName(relation)))); + if (futuremxid) + ereport(WARNING, + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg_internal("overwrote invalid relminmxid value %u with new value %u for table \"%s\"", + oldminmulti, minmulti, + RelationGetRelationName(relation)))); } From fadb48b00e02ccfd152baa80942de30205ab3c4f Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Tue, 5 Apr 2022 14:09:04 -0400 Subject: [PATCH 381/772] PLAN clauses for JSON_TABLE These clauses allow the user to specify how data from nested paths are joined, allowing considerable freedom in shaping the tabular output of JSON_TABLE. PLAN DEFAULT allows the user to specify the global strategies when dealing with sibling or child nested paths. The is often sufficient to achieve the necessary goal, and is considerably simpler than the full PLAN clause, which allows the user to specify the strategy to be used for each named nested path. Nikita Glukhov Reviewers have included (in no particular order) Andres Freund, Alexander Korotkov, Pavel Stehule, Andrew Alsup, Erik Rijkers, Zhihong Yu, Himanshu Upadhyaya, Daniel Gustafsson, Justin Pryzby. Discussion: https://postgr.es/m/7e2cb85d-24cf-4abb-30a5-1a33715959bd@postgrespro.ru --- src/backend/nodes/copyfuncs.c | 26 + src/backend/nodes/equalfuncs.c | 3 + src/backend/nodes/makefuncs.c | 19 + src/backend/nodes/outfuncs.c | 3 + src/backend/nodes/readfuncs.c | 3 + src/backend/parser/gram.y | 130 ++++- src/backend/parser/parse_jsontable.c | 323 ++++++++++- src/backend/utils/adt/jsonpath_exec.c | 118 +++- src/backend/utils/adt/ruleutils.c | 50 ++ src/include/nodes/makefuncs.h | 2 + src/include/nodes/nodes.h | 1 + src/include/nodes/parsenodes.h | 42 ++ src/include/nodes/primnodes.h | 3 + src/include/parser/kwlist.h | 1 + src/test/regress/expected/jsonb_sqljson.out | 600 +++++++++++++++++++- src/test/regress/sql/jsonb_sqljson.sql | 396 ++++++++++++- src/tools/pgindent/typedefs.list | 3 + 17 files changed, 1614 insertions(+), 109 deletions(-) diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 1a74122f13..d5760b1006 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -2696,6 +2696,7 @@ _copyJsonTable(const JsonTable *from) COPY_NODE_FIELD(common); COPY_NODE_FIELD(columns); + COPY_NODE_FIELD(plan); COPY_NODE_FIELD(on_error); COPY_NODE_FIELD(alias); COPY_SCALAR_FIELD(location); @@ -2715,6 +2716,7 @@ _copyJsonTableColumn(const JsonTableColumn *from) COPY_STRING_FIELD(name); COPY_NODE_FIELD(typeName); COPY_STRING_FIELD(pathspec); + COPY_STRING_FIELD(pathname); COPY_SCALAR_FIELD(format); COPY_SCALAR_FIELD(wrapper); COPY_SCALAR_FIELD(omit_quotes); @@ -2726,6 +2728,24 @@ _copyJsonTableColumn(const JsonTableColumn *from) return newnode; } +/* + * _copyJsonTablePlan + */ +static JsonTablePlan * +_copyJsonTablePlan(const JsonTablePlan *from) +{ + JsonTablePlan *newnode = makeNode(JsonTablePlan); + + COPY_SCALAR_FIELD(plan_type); + COPY_SCALAR_FIELD(join_type); + COPY_STRING_FIELD(pathname); + COPY_NODE_FIELD(plan1); + COPY_NODE_FIELD(plan2); + COPY_SCALAR_FIELD(location); + + return newnode; +} + /* * _copyJsonTableParent */ @@ -2735,7 +2755,9 @@ _copyJsonTableParent(const JsonTableParent *from) JsonTableParent *newnode = makeNode(JsonTableParent); COPY_NODE_FIELD(path); + COPY_STRING_FIELD(name); COPY_NODE_FIELD(child); + COPY_SCALAR_FIELD(outerJoin); COPY_SCALAR_FIELD(colMin); COPY_SCALAR_FIELD(colMax); @@ -2752,6 +2774,7 @@ _copyJsonTableSibling(const JsonTableSibling *from) COPY_NODE_FIELD(larg); COPY_NODE_FIELD(rarg); + COPY_SCALAR_FIELD(cross); return newnode; } @@ -5929,6 +5952,9 @@ copyObjectImpl(const void *from) case T_JsonTableColumn: retval = _copyJsonTableColumn(from); break; + case T_JsonTablePlan: + retval = _copyJsonTablePlan(from); + break; case T_JsonTableParent: retval = _copyJsonTableParent(from); break; diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 5c21850c97..1f765f42c9 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -181,7 +181,9 @@ static bool _equalJsonTableParent(const JsonTableParent *a, const JsonTableParent *b) { COMPARE_NODE_FIELD(path); + COMPARE_STRING_FIELD(name); COMPARE_NODE_FIELD(child); + COMPARE_SCALAR_FIELD(outerJoin); COMPARE_SCALAR_FIELD(colMin); COMPARE_SCALAR_FIELD(colMax); @@ -193,6 +195,7 @@ _equalJsonTableSibling(const JsonTableSibling *a, const JsonTableSibling *b) { COMPARE_NODE_FIELD(larg); COMPARE_NODE_FIELD(rarg); + COMPARE_SCALAR_FIELD(cross); return true; } diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c index cd6c300e7b..41e26a0fe6 100644 --- a/src/backend/nodes/makefuncs.c +++ b/src/backend/nodes/makefuncs.c @@ -867,6 +867,25 @@ makeJsonBehavior(JsonBehaviorType type, Node *default_expr) return behavior; } +/* + * makeJsonTableJoinedPlan - + * creates a joined JsonTablePlan node + */ +Node * +makeJsonTableJoinedPlan(JsonTablePlanJoinType type, Node *plan1, Node *plan2, + int location) +{ + JsonTablePlan *n = makeNode(JsonTablePlan); + + n->plan_type = JSTP_JOINED; + n->join_type = type; + n->plan1 = castNode(JsonTablePlan, plan1); + n->plan2 = castNode(JsonTablePlan, plan2); + n->location = location; + + return (Node *) n; +} + /* * makeJsonEncoding - * converts JSON encoding name to enum JsonEncoding diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 213396f999..abb1f787ef 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1875,7 +1875,9 @@ _outJsonTableParent(StringInfo str, const JsonTableParent *node) WRITE_NODE_TYPE("JSONTABPNODE"); WRITE_NODE_FIELD(path); + WRITE_STRING_FIELD(name); WRITE_NODE_FIELD(child); + WRITE_BOOL_FIELD(outerJoin); WRITE_INT_FIELD(colMin); WRITE_INT_FIELD(colMax); } @@ -1887,6 +1889,7 @@ _outJsonTableSibling(StringInfo str, const JsonTableSibling *node) WRITE_NODE_FIELD(larg); WRITE_NODE_FIELD(rarg); + WRITE_BOOL_FIELD(cross); } /***************************************************************************** diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 19e257684c..e7d008b2c5 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -1541,7 +1541,9 @@ _readJsonTableParent(void) READ_LOCALS(JsonTableParent); READ_NODE_FIELD(path); + READ_STRING_FIELD(name); READ_NODE_FIELD(child); + READ_BOOL_FIELD(outerJoin); READ_INT_FIELD(colMin); READ_INT_FIELD(colMax); @@ -1555,6 +1557,7 @@ _readJsonTableSibling(void) READ_NODE_FIELD(larg); READ_NODE_FIELD(rarg); + READ_BOOL_FIELD(cross); READ_DONE(); } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 13fa5bea87..7e3f4a5d27 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -683,6 +683,18 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); json_table_formatted_column_definition json_table_exists_column_definition json_table_nested_columns + json_table_plan_clause_opt + json_table_specific_plan + json_table_plan + json_table_plan_simple + json_table_plan_parent_child + json_table_plan_outer + json_table_plan_inner + json_table_plan_sibling + json_table_plan_union + json_table_plan_cross + json_table_plan_primary + json_table_default_plan %type json_name_and_value_list json_value_expr_list @@ -698,6 +710,9 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type json_encoding json_encoding_clause_opt + json_table_default_plan_choices + json_table_default_plan_inner_outer + json_table_default_plan_union_cross json_wrapper_clause_opt json_wrapper_behavior json_conditional_or_unconditional_opt @@ -812,7 +827,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); ORDER ORDINALITY OTHERS OUT_P OUTER_P OVER OVERLAPS OVERLAY OVERRIDING OWNED OWNER - PARALLEL PARSER PARTIAL PARTITION PASSING PASSWORD PATH PLACING PLANS POLICY + PARALLEL PARSER PARTIAL PARTITION PASSING PASSWORD PATH PLACING PLAN PLANS POLICY POSITION PRECEDING PRECISION PRESERVE PREPARE PREPARED PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE PROCEDURES PROGRAM PUBLICATION @@ -15928,13 +15943,15 @@ json_table: JSON_TABLE '(' json_api_common_syntax json_table_columns_clause + json_table_plan_clause_opt json_table_error_clause_opt ')' { JsonTable *n = makeNode(JsonTable); n->common = (JsonCommon *) $3; n->columns = $4; - n->on_error = $5; + n->plan = (JsonTablePlan *) $5; + n->on_error = $6; n->location = @1; $$ = (Node *) n; } @@ -16055,12 +16072,15 @@ json_table_formatted_column_definition: ; json_table_nested_columns: - NESTED path_opt Sconst json_table_columns_clause + NESTED path_opt Sconst + json_as_path_name_clause_opt + json_table_columns_clause { JsonTableColumn *n = makeNode(JsonTableColumn); n->coltype = JTC_NESTED; n->pathspec = $3; - n->columns = $4; + n->pathname = $4; + n->columns = $5; n->location = @1; $$ = (Node *) n; } @@ -16071,6 +16091,106 @@ path_opt: | /* EMPTY */ { } ; +json_table_plan_clause_opt: + json_table_specific_plan { $$ = $1; } + | json_table_default_plan { $$ = $1; } + | /* EMPTY */ { $$ = NULL; } + ; + +json_table_specific_plan: + PLAN '(' json_table_plan ')' { $$ = $3; } + ; + +json_table_plan: + json_table_plan_simple + | json_table_plan_parent_child + | json_table_plan_sibling + ; + +json_table_plan_simple: + json_table_path_name + { + JsonTablePlan *n = makeNode(JsonTablePlan); + n->plan_type = JSTP_SIMPLE; + n->pathname = $1; + n->location = @1; + $$ = (Node *) n; + } + ; + +json_table_plan_parent_child: + json_table_plan_outer + | json_table_plan_inner + ; + +json_table_plan_outer: + json_table_plan_simple OUTER_P json_table_plan_primary + { $$ = makeJsonTableJoinedPlan(JSTPJ_OUTER, $1, $3, @1); } + ; + +json_table_plan_inner: + json_table_plan_simple INNER_P json_table_plan_primary + { $$ = makeJsonTableJoinedPlan(JSTPJ_INNER, $1, $3, @1); } + ; + +json_table_plan_sibling: + json_table_plan_union + | json_table_plan_cross + ; + +json_table_plan_union: + json_table_plan_primary UNION json_table_plan_primary + { $$ = makeJsonTableJoinedPlan(JSTPJ_UNION, $1, $3, @1); } + | json_table_plan_union UNION json_table_plan_primary + { $$ = makeJsonTableJoinedPlan(JSTPJ_UNION, $1, $3, @1); } + ; + +json_table_plan_cross: + json_table_plan_primary CROSS json_table_plan_primary + { $$ = makeJsonTableJoinedPlan(JSTPJ_CROSS, $1, $3, @1); } + | json_table_plan_cross CROSS json_table_plan_primary + { $$ = makeJsonTableJoinedPlan(JSTPJ_CROSS, $1, $3, @1); } + ; + +json_table_plan_primary: + json_table_plan_simple { $$ = $1; } + | '(' json_table_plan ')' + { + castNode(JsonTablePlan, $2)->location = @1; + $$ = $2; + } + ; + +json_table_default_plan: + PLAN DEFAULT '(' json_table_default_plan_choices ')' + { + JsonTablePlan *n = makeNode(JsonTablePlan); + n->plan_type = JSTP_DEFAULT; + n->join_type = $4; + n->location = @1; + $$ = (Node *) n; + } + ; + +json_table_default_plan_choices: + json_table_default_plan_inner_outer { $$ = $1 | JSTPJ_UNION; } + | json_table_default_plan_inner_outer ',' + json_table_default_plan_union_cross { $$ = $1 | $3; } + | json_table_default_plan_union_cross { $$ = $1 | JSTPJ_OUTER; } + | json_table_default_plan_union_cross ',' + json_table_default_plan_inner_outer { $$ = $1 | $3; } + ; + +json_table_default_plan_inner_outer: + INNER_P { $$ = JSTPJ_INNER; } + | OUTER_P { $$ = JSTPJ_OUTER; } + ; + +json_table_default_plan_union_cross: + UNION { $$ = JSTPJ_UNION; } + | CROSS { $$ = JSTPJ_CROSS; } + ; + json_returning_clause_opt: RETURNING Typename { @@ -16951,6 +17071,7 @@ unreserved_keyword: | PASSING | PASSWORD | PATH + | PLAN | PLANS | POLICY | PRECEDING @@ -17568,6 +17689,7 @@ bare_label_keyword: | PASSWORD | PATH | PLACING + | PLAN | PLANS | POLICY | POSITION diff --git a/src/backend/parser/parse_jsontable.c b/src/backend/parser/parse_jsontable.c index dd75a40bf6..c7dcefa11c 100644 --- a/src/backend/parser/parse_jsontable.c +++ b/src/backend/parser/parse_jsontable.c @@ -37,13 +37,16 @@ typedef struct JsonTableContext JsonTable *table; /* untransformed node */ TableFunc *tablefunc; /* transformed node */ List *pathNames; /* list of all path and columns names */ + int pathNameId; /* path name id counter */ Oid contextItemTypid; /* type oid of context item (json/jsonb) */ } JsonTableContext; static JsonTableParent * transformJsonTableColumns(JsonTableContext *cxt, - List *columns, - char *pathSpec, - int location); + JsonTablePlan *plan, + List *columns, + char *pathSpec, + char **pathName, + int location); static Node * makeStringConst(char *str, int location) @@ -154,62 +157,239 @@ registerAllJsonTableColumns(JsonTableContext *cxt, List *columns) JsonTableColumn *jtc = castNode(JsonTableColumn, lfirst(lc)); if (jtc->coltype == JTC_NESTED) + { + if (jtc->pathname) + registerJsonTableColumn(cxt, jtc->pathname); + registerAllJsonTableColumns(cxt, jtc->columns); + } else + { registerJsonTableColumn(cxt, jtc->name); + } + } +} + +/* Generate a new unique JSON_TABLE path name. */ +static char * +generateJsonTablePathName(JsonTableContext *cxt) +{ + char namebuf[32]; + char *name = namebuf; + + do + { + snprintf(namebuf, sizeof(namebuf), "json_table_path_%d", + ++cxt->pathNameId); + } while (isJsonTablePathNameDuplicate(cxt, name)); + + name = pstrdup(name); + cxt->pathNames = lappend(cxt->pathNames, name); + + return name; +} + +/* Collect sibling path names from plan to the specified list. */ +static void +collectSiblingPathsInJsonTablePlan(JsonTablePlan *plan, List **paths) +{ + if (plan->plan_type == JSTP_SIMPLE) + *paths = lappend(*paths, plan->pathname); + else if (plan->plan_type == JSTP_JOINED) + { + if (plan->join_type == JSTPJ_INNER || + plan->join_type == JSTPJ_OUTER) + { + Assert(plan->plan1->plan_type == JSTP_SIMPLE); + *paths = lappend(*paths, plan->plan1->pathname); + } + else if (plan->join_type == JSTPJ_CROSS || + plan->join_type == JSTPJ_UNION) + { + collectSiblingPathsInJsonTablePlan(plan->plan1, paths); + collectSiblingPathsInJsonTablePlan(plan->plan2, paths); + } + else + elog(ERROR, "invalid JSON_TABLE join type %d", + plan->join_type); + } +} + +/* + * Validate child JSON_TABLE plan by checking that: + * - all nested columns have path names specified + * - all nested columns have corresponding node in the sibling plan + * - plan does not contain duplicate or extra nodes + */ +static void +validateJsonTableChildPlan(ParseState *pstate, JsonTablePlan *plan, + List *columns) +{ + ListCell *lc1; + List *siblings = NIL; + int nchildren = 0; + + if (plan) + collectSiblingPathsInJsonTablePlan(plan, &siblings); + + foreach(lc1, columns) + { + JsonTableColumn *jtc = castNode(JsonTableColumn, lfirst(lc1)); + + if (jtc->coltype == JTC_NESTED) + { + ListCell *lc2; + bool found = false; + + if (!jtc->pathname) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("nested JSON_TABLE columns must contain an explicit AS pathname specification if an explicit PLAN clause is used"), + parser_errposition(pstate, jtc->location))); + + /* find nested path name in the list of sibling path names */ + foreach(lc2, siblings) + { + if ((found = !strcmp(jtc->pathname, lfirst(lc2)))) + break; + } + + if (!found) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid JSON_TABLE plan"), + errdetail("plan node for nested path %s was not found in plan", jtc->pathname), + parser_errposition(pstate, jtc->location))); + + nchildren++; + } + } + + if (list_length(siblings) > nchildren) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid JSON_TABLE plan"), + errdetail("plan node contains some extra or duplicate sibling nodes"), + parser_errposition(pstate, plan ? plan->location : -1))); +} + +static JsonTableColumn * +findNestedJsonTableColumn(List *columns, const char *pathname) +{ + ListCell *lc; + + foreach(lc, columns) + { + JsonTableColumn *jtc = castNode(JsonTableColumn, lfirst(lc)); + + if (jtc->coltype == JTC_NESTED && + jtc->pathname && + !strcmp(jtc->pathname, pathname)) + return jtc; } + + return NULL; } static Node * -transformNestedJsonTableColumn(JsonTableContext *cxt, JsonTableColumn *jtc) +transformNestedJsonTableColumn(JsonTableContext *cxt, JsonTableColumn *jtc, + JsonTablePlan *plan) { JsonTableParent *node; + char *pathname = jtc->pathname; - node = transformJsonTableColumns(cxt, jtc->columns, jtc->pathspec, - jtc->location); + node = transformJsonTableColumns(cxt, plan, jtc->columns, jtc->pathspec, + &pathname, jtc->location); + node->name = pstrdup(pathname); return (Node *) node; } static Node * -makeJsonTableSiblingJoin(Node *lnode, Node *rnode) +makeJsonTableSiblingJoin(bool cross, Node *lnode, Node *rnode) { JsonTableSibling *join = makeNode(JsonTableSibling); join->larg = lnode; join->rarg = rnode; + join->cross = cross; return (Node *) join; } /* - * Recursively transform child (nested) JSON_TABLE columns. + * Recursively transform child JSON_TABLE plan. * - * Child columns are transformed into a binary tree of union-joined - * JsonTableSiblings. + * Default plan is transformed into a cross/union join of its nested columns. + * Simple and outer/inner plans are transformed into a JsonTableParent by + * finding and transforming corresponding nested column. + * Sibling plans are recursively transformed into a JsonTableSibling. */ static Node * -transformJsonTableChildColumns(JsonTableContext *cxt, List *columns) +transformJsonTableChildPlan(JsonTableContext *cxt, JsonTablePlan *plan, + List *columns) { - Node *res = NULL; - ListCell *lc; + JsonTableColumn *jtc = NULL; - /* transform all nested columns into union join */ - foreach(lc, columns) + if (!plan || plan->plan_type == JSTP_DEFAULT) { - JsonTableColumn *jtc = castNode(JsonTableColumn, lfirst(lc)); - Node *node; + /* unspecified or default plan */ + Node *res = NULL; + ListCell *lc; + bool cross = plan && (plan->join_type & JSTPJ_CROSS); - if (jtc->coltype != JTC_NESTED) - continue; + /* transform all nested columns into cross/union join */ + foreach(lc, columns) + { + JsonTableColumn *jtc = castNode(JsonTableColumn, lfirst(lc)); + Node *node; + + if (jtc->coltype != JTC_NESTED) + continue; - node = transformNestedJsonTableColumn(cxt, jtc); + node = transformNestedJsonTableColumn(cxt, jtc, plan); - /* join transformed node with previous sibling nodes */ - res = res ? makeJsonTableSiblingJoin(res, node) : node; + /* join transformed node with previous sibling nodes */ + res = res ? makeJsonTableSiblingJoin(cross, res, node) : node; + } + + return res; } + else if (plan->plan_type == JSTP_SIMPLE) + { + jtc = findNestedJsonTableColumn(columns, plan->pathname); + } + else if (plan->plan_type == JSTP_JOINED) + { + if (plan->join_type == JSTPJ_INNER || + plan->join_type == JSTPJ_OUTER) + { + Assert(plan->plan1->plan_type == JSTP_SIMPLE); + jtc = findNestedJsonTableColumn(columns, plan->plan1->pathname); + } + else + { + Node *node1 = + transformJsonTableChildPlan(cxt, plan->plan1, columns); + Node *node2 = + transformJsonTableChildPlan(cxt, plan->plan2, columns); + + return makeJsonTableSiblingJoin(plan->join_type == JSTPJ_CROSS, + node1, node2); + } + } + else + elog(ERROR, "invalid JSON_TABLE plan type %d", plan->plan_type); + + if (!jtc) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid JSON_TABLE plan"), + errdetail("path name was %s not found in nested columns list", + plan->pathname), + parser_errposition(cxt->pstate, plan->location))); - return res; + return transformNestedJsonTableColumn(cxt, jtc, plan); } /* Check whether type is json/jsonb, array, or record. */ @@ -374,16 +554,80 @@ makeParentJsonTableNode(JsonTableContext *cxt, char *pathSpec, List *columns) } static JsonTableParent * -transformJsonTableColumns(JsonTableContext *cxt, List *columns, char *pathSpec, +transformJsonTableColumns(JsonTableContext *cxt, JsonTablePlan *plan, + List *columns, char *pathSpec, char **pathName, int location) { JsonTableParent *node; + JsonTablePlan *childPlan; + bool defaultPlan = !plan || plan->plan_type == JSTP_DEFAULT; + + if (!*pathName) + { + if (cxt->table->plan) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid JSON_TABLE expression"), + errdetail("JSON_TABLE columns must contain " + "explicit AS pathname specification if " + "explicit PLAN clause is used"), + parser_errposition(cxt->pstate, location))); + + *pathName = generateJsonTablePathName(cxt); + } + + if (defaultPlan) + childPlan = plan; + else + { + /* validate parent and child plans */ + JsonTablePlan *parentPlan; + + if (plan->plan_type == JSTP_JOINED) + { + if (plan->join_type != JSTPJ_INNER && + plan->join_type != JSTPJ_OUTER) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid JSON_TABLE plan"), + errdetail("expected INNER or OUTER JSON_TABLE plan node"), + parser_errposition(cxt->pstate, plan->location))); + + parentPlan = plan->plan1; + childPlan = plan->plan2; + + Assert(parentPlan->plan_type != JSTP_JOINED); + Assert(parentPlan->pathname); + } + else + { + parentPlan = plan; + childPlan = NULL; + } + + if (strcmp(parentPlan->pathname, *pathName)) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid JSON_TABLE plan"), + errdetail("path name mismatch: expected %s but %s is given", + *pathName, parentPlan->pathname), + parser_errposition(cxt->pstate, plan->location))); + + validateJsonTableChildPlan(cxt->pstate, childPlan, columns); + } /* transform only non-nested columns */ node = makeParentJsonTableNode(cxt, pathSpec, columns); + node->name = pstrdup(*pathName); - /* transform recursively nested columns */ - node->child = transformJsonTableChildColumns(cxt, columns); + if (childPlan || defaultPlan) + { + /* transform recursively nested columns */ + node->child = transformJsonTableChildPlan(cxt, childPlan, columns); + if (node->child) + node->outerJoin = !plan || (plan->join_type & JSTPJ_OUTER); + /* else: default plan case, no children found */ + } return node; } @@ -401,7 +645,9 @@ transformJsonTable(ParseState *pstate, JsonTable *jt) JsonTableContext cxt; TableFunc *tf = makeNode(TableFunc); JsonFuncExpr *jfe = makeNode(JsonFuncExpr); + JsonTablePlan *plan = jt->plan; JsonCommon *jscommon; + char *rootPathName = jt->common->pathname; char *rootPath; bool is_lateral; @@ -409,9 +655,31 @@ transformJsonTable(ParseState *pstate, JsonTable *jt) cxt.table = jt; cxt.tablefunc = tf; cxt.pathNames = NIL; + cxt.pathNameId = 0; + + if (rootPathName) + registerJsonTableColumn(&cxt, rootPathName); registerAllJsonTableColumns(&cxt, jt->columns); +#if 0 /* XXX it' unclear from the standard whether root path name is mandatory or not */ + if (plan && plan->plan_type != JSTP_DEFAULT && !rootPathName) + { + /* Assign root path name and create corresponding plan node */ + JsonTablePlan *rootNode = makeNode(JsonTablePlan); + JsonTablePlan *rootPlan = (JsonTablePlan *) + makeJsonTableJoinedPlan(JSTPJ_OUTER, (Node *) rootNode, + (Node *) plan, jt->location); + + rootPathName = generateJsonTablePathName(&cxt); + + rootNode->plan_type = JSTP_SIMPLE; + rootNode->pathname = rootPathName; + + plan = rootPlan; + } +#endif + jscommon = copyObject(jt->common); jscommon->pathspec = makeStringConst(pstrdup("$"), -1); @@ -447,7 +715,8 @@ transformJsonTable(ParseState *pstate, JsonTable *jt) rootPath = castNode(A_Const, jt->common->pathspec)->val.sval.sval; - tf->plan = (Node *) transformJsonTableColumns(&cxt, jt->columns, rootPath, + tf->plan = (Node *) transformJsonTableColumns(&cxt, plan, jt->columns, + rootPath, &rootPathName, jt->common->location); tf->ordinalitycol = -1; /* undefine ordinality column number */ diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c index c55b3aae02..ee9b5089b9 100644 --- a/src/backend/utils/adt/jsonpath_exec.c +++ b/src/backend/utils/adt/jsonpath_exec.c @@ -175,6 +175,7 @@ struct JsonTableScanState Datum current; int ordinal; bool currentIsNull; + bool outerJoin; bool errorOnError; bool advanceNested; bool reset; @@ -188,6 +189,7 @@ struct JsonTableJoinState { JsonTableJoinState *left; JsonTableJoinState *right; + bool cross; bool advanceRight; } join; JsonTableScanState scan; @@ -3166,6 +3168,7 @@ JsonTableInitScanState(JsonTableContext *cxt, JsonTableScanState *scan, int i; scan->parent = parent; + scan->outerJoin = node->outerJoin; scan->errorOnError = node->errorOnError; scan->path = DatumGetJsonPathP(node->path->constvalue); scan->args = args; @@ -3192,6 +3195,7 @@ JsonTableInitPlanState(JsonTableContext *cxt, Node *plan, JsonTableSibling *join = castNode(JsonTableSibling, plan); state->is_join = true; + state->u.join.cross = join->cross; state->u.join.left = JsonTableInitPlanState(cxt, join->larg, parent); state->u.join.right = JsonTableInitPlanState(cxt, join->rarg, parent); } @@ -3328,8 +3332,26 @@ JsonTableSetDocument(TableFuncScanState *state, Datum value) JsonTableResetContextItem(&cxt->root, value); } +/* Recursively reset scan and its child nodes */ +static void +JsonTableRescanRecursive(JsonTableJoinState *state) +{ + if (state->is_join) + { + JsonTableRescanRecursive(state->u.join.left); + JsonTableRescanRecursive(state->u.join.right); + state->u.join.advanceRight = false; + } + else + { + JsonTableRescan(&state->u.scan); + if (state->u.scan.nested) + JsonTableRescanRecursive(state->u.scan.nested); + } +} + /* - * Fetch next row from a union joined scan. + * Fetch next row from a cross/union joined scan. * * Returns false at the end of a scan, true otherwise. */ @@ -3339,17 +3361,48 @@ JsonTableNextJoinRow(JsonTableJoinState *state) if (!state->is_join) return JsonTableNextRow(&state->u.scan); - if (!state->u.join.advanceRight) + if (state->u.join.advanceRight) { - /* fetch next outer row */ - if (JsonTableNextJoinRow(state->u.join.left)) + /* fetch next inner row */ + if (JsonTableNextJoinRow(state->u.join.right)) return true; - state->u.join.advanceRight = true; /* next inner row */ + /* inner rows are exhausted */ + if (state->u.join.cross) + state->u.join.advanceRight = false; /* next outer row */ + else + return false; /* end of scan */ + } + + while (!state->u.join.advanceRight) + { + /* fetch next outer row */ + bool left = JsonTableNextJoinRow(state->u.join.left); + + if (state->u.join.cross) + { + if (!left) + return false; /* end of scan */ + + JsonTableRescanRecursive(state->u.join.right); + + if (!JsonTableNextJoinRow(state->u.join.right)) + continue; /* next outer row */ + + state->u.join.advanceRight = true; /* next inner row */ + } + else if (!left) + { + if (!JsonTableNextJoinRow(state->u.join.right)) + return false; /* end of scan */ + + state->u.join.advanceRight = true; /* next inner row */ + } + + break; } - /* fetch next inner row */ - return JsonTableNextJoinRow(state->u.join.right); + return true; } /* Recursively set 'reset' flag of scan and its child nodes */ @@ -3373,16 +3426,13 @@ JsonTableJoinReset(JsonTableJoinState *state) } /* - * Fetch next row from a simple scan with outer joined nested subscans. + * Fetch next row from a simple scan with outer/inner joined nested subscans. * * Returns false at the end of a scan, true otherwise. */ static bool JsonTableNextRow(JsonTableScanState *scan) { - JsonbValue *jbv; - MemoryContext oldcxt; - /* reset context item if requested */ if (scan->reset) { @@ -3394,34 +3444,42 @@ JsonTableNextRow(JsonTableScanState *scan) if (scan->advanceNested) { /* fetch next nested row */ - if (JsonTableNextJoinRow(scan->nested)) - return true; + scan->advanceNested = JsonTableNextJoinRow(scan->nested); - scan->advanceNested = false; + if (scan->advanceNested) + return true; } - /* fetch next row */ - jbv = JsonValueListNext(&scan->found, &scan->iter); - - if (!jbv) + for (;;) { - scan->current = PointerGetDatum(NULL); - scan->currentIsNull = true; - return false; /* end of scan */ - } + /* fetch next row */ + JsonbValue *jbv = JsonValueListNext(&scan->found, &scan->iter); + MemoryContext oldcxt; - /* set current row item */ - oldcxt = MemoryContextSwitchTo(scan->mcxt); - scan->current = JsonbPGetDatum(JsonbValueToJsonb(jbv)); - scan->currentIsNull = false; - MemoryContextSwitchTo(oldcxt); + if (!jbv) + { + scan->current = PointerGetDatum(NULL); + scan->currentIsNull = true; + return false; /* end of scan */ + } - scan->ordinal++; + /* set current row item */ + oldcxt = MemoryContextSwitchTo(scan->mcxt); + scan->current = JsonbPGetDatum(JsonbValueToJsonb(jbv)); + scan->currentIsNull = false; + MemoryContextSwitchTo(oldcxt); + + scan->ordinal++; + + if (!scan->nested) + break; - if (scan->nested) - { JsonTableJoinReset(scan->nested); + scan->advanceNested = JsonTableNextJoinRow(scan->nested); + + if (scan->advanceNested || scan->outerJoin) + break; } return true; diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index e6173a9db4..3296ad070e 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -11169,10 +11169,54 @@ get_json_table_nested_columns(TableFunc *tf, Node *node, appendStringInfoChar(context->buf, ' '); appendContextKeyword(context, "NESTED PATH ", 0, 0, 0); get_const_expr(n->path, context, -1); + appendStringInfo(context->buf, " AS %s", quote_identifier(n->name)); get_json_table_columns(tf, n, context, showimplicit); } } +/* + * get_json_table_plan - Parse back a JSON_TABLE plan + */ +static void +get_json_table_plan(TableFunc *tf, Node *node, deparse_context *context, + bool parenthesize) +{ + if (parenthesize) + appendStringInfoChar(context->buf, '('); + + if (IsA(node, JsonTableSibling)) + { + JsonTableSibling *n = (JsonTableSibling *) node; + + get_json_table_plan(tf, n->larg, context, + IsA(n->larg, JsonTableSibling) || + castNode(JsonTableParent, n->larg)->child); + + appendStringInfoString(context->buf, n->cross ? " CROSS " : " UNION "); + + get_json_table_plan(tf, n->rarg, context, + IsA(n->rarg, JsonTableSibling) || + castNode(JsonTableParent, n->rarg)->child); + } + else + { + JsonTableParent *n = castNode(JsonTableParent, node); + + appendStringInfoString(context->buf, quote_identifier(n->name)); + + if (n->child) + { + appendStringInfoString(context->buf, + n->outerJoin ? " OUTER " : " INNER "); + get_json_table_plan(tf, n->child, context, + IsA(n->child, JsonTableSibling)); + } + } + + if (parenthesize) + appendStringInfoChar(context->buf, ')'); +} + /* * get_json_table_columns - Parse back JSON_TABLE columns */ @@ -11301,6 +11345,8 @@ get_json_table(TableFunc *tf, deparse_context *context, bool showimplicit) get_const_expr(root->path, context, -1); + appendStringInfo(buf, " AS %s", quote_identifier(root->name)); + if (jexpr->passing_values) { ListCell *lc1, *lc2; @@ -11333,6 +11379,10 @@ get_json_table(TableFunc *tf, deparse_context *context, bool showimplicit) get_json_table_columns(tf, root, context, showimplicit); + appendStringInfoChar(buf, ' '); + appendContextKeyword(context, "PLAN ", 0, 0, 0); + get_json_table_plan(tf, (Node *) root, context, true); + if (jexpr->on_error->btype != JSON_BEHAVIOR_EMPTY) get_json_behavior(jexpr->on_error, context, "ERROR"); diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h index 872f2f0828..c717468eb3 100644 --- a/src/include/nodes/makefuncs.h +++ b/src/include/nodes/makefuncs.h @@ -110,6 +110,8 @@ extern JsonFormat *makeJsonFormat(JsonFormatType type, JsonEncoding encoding, int location); extern JsonValueExpr *makeJsonValueExpr(Expr *expr, JsonFormat *format); extern JsonBehavior *makeJsonBehavior(JsonBehaviorType type, Node *expr); +extern Node *makeJsonTableJoinedPlan(JsonTablePlanJoinType type, + Node *plan1, Node *plan2, int location); extern Node *makeJsonKeyValue(Node *key, Node *value); extern Node *makeJsonIsPredicate(Node *expr, JsonFormat *format, JsonValueType vtype, bool unique_keys, diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index aefce33e28..300824258e 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -518,6 +518,7 @@ typedef enum NodeTag T_JsonIsPredicate, T_JsonTable, T_JsonTableColumn, + T_JsonTablePlan, T_JsonCommon, T_JsonArgument, T_JsonKeyValue, diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index e58211eac1..4a2ca81f3c 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1688,6 +1688,7 @@ typedef struct JsonTableColumn char *name; /* column name */ TypeName *typeName; /* column type name */ JsonPathSpec pathspec; /* path specification, if any */ + char *pathname; /* path name, if any */ JsonFormat *format; /* JSON format clause, if specified */ JsonWrapper wrapper; /* WRAPPER behavior for formatted columns */ bool omit_quotes; /* omit or keep quotes on scalar strings? */ @@ -1697,6 +1698,46 @@ typedef struct JsonTableColumn int location; /* token location, or -1 if unknown */ } JsonTableColumn; +/* + * JsonTablePlanType - + * flags for JSON_TABLE plan node types representation + */ +typedef enum JsonTablePlanType +{ + JSTP_DEFAULT, + JSTP_SIMPLE, + JSTP_JOINED, +} JsonTablePlanType; + +/* + * JsonTablePlanJoinType - + * flags for JSON_TABLE join types representation + */ +typedef enum JsonTablePlanJoinType +{ + JSTPJ_INNER = 0x01, + JSTPJ_OUTER = 0x02, + JSTPJ_CROSS = 0x04, + JSTPJ_UNION = 0x08, +} JsonTablePlanJoinType; + +typedef struct JsonTablePlan JsonTablePlan; + +/* + * JsonTablePlan - + * untransformed representation of JSON_TABLE plan node + */ +struct JsonTablePlan +{ + NodeTag type; + JsonTablePlanType plan_type; /* plan type */ + JsonTablePlanJoinType join_type; /* join type (for joined plan only) */ + JsonTablePlan *plan1; /* first joined plan */ + JsonTablePlan *plan2; /* second joined plan */ + char *pathname; /* path name (for simple plan only) */ + int location; /* token location, or -1 if unknown */ +}; + /* * JsonTable - * untransformed representation of JSON_TABLE @@ -1706,6 +1747,7 @@ typedef struct JsonTable NodeTag type; JsonCommon *common; /* common JSON path syntax fields */ List *columns; /* list of JsonTableColumn */ + JsonTablePlan *plan; /* join plan, if specified */ JsonBehavior *on_error; /* ON ERROR behavior, if specified */ Alias *alias; /* table alias in FROM clause */ bool lateral; /* does it have LATERAL prefix? */ diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index 290898cfd7..66d32fc006 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -1473,7 +1473,9 @@ typedef struct JsonTableParent { NodeTag type; Const *path; /* jsonpath constant */ + char *name; /* path name */ Node *child; /* nested columns, if any */ + bool outerJoin; /* outer or inner join for nested columns? */ int colMin; /* min column index in the resulting column list */ int colMax; /* max column index in the resulting column list */ bool errorOnError; /* ERROR/EMPTY ON ERROR behavior */ @@ -1488,6 +1490,7 @@ typedef struct JsonTableSibling NodeTag type; Node *larg; /* left join node */ Node *rarg; /* right join node */ + bool cross; /* cross or union join? */ } JsonTableSibling; /* ---------------- diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index 9097ce7b26..0caa7310f2 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -336,6 +336,7 @@ PG_KEYWORD("passing", PASSING, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("password", PASSWORD, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("path", PATH, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("placing", PLACING, RESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("plan", PLAN, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("plans", PLANS, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("policy", POLICY, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("position", POSITION, COL_NAME_KEYWORD, BARE_LABEL) diff --git a/src/test/regress/expected/jsonb_sqljson.out b/src/test/regress/expected/jsonb_sqljson.out index 144cc0c557..ae77af7ae2 100644 --- a/src/test/regress/expected/jsonb_sqljson.out +++ b/src/test/regress/expected/jsonb_sqljson.out @@ -1140,18 +1140,18 @@ SELECT * FROM ia int[] PATH '$', ta text[] PATH '$', jba jsonb[] PATH '$', - NESTED PATH '$[1]' COLUMNS ( + NESTED PATH '$[1]' AS p1 COLUMNS ( a1 int, - NESTED PATH '$[*]' COLUMNS ( + NESTED PATH '$[*]' AS "p1 1" COLUMNS ( a11 text ), b1 text ), - NESTED PATH '$[2]' COLUMNS ( - NESTED PATH '$[*]' COLUMNS ( + NESTED PATH '$[2]' AS p2 COLUMNS ( + NESTED PATH '$[*]' AS "p2:1" COLUMNS ( a21 text ), - NESTED PATH '$[*]' COLUMNS ( + NESTED PATH '$[*]' AS p22 COLUMNS ( a22 text ) ) @@ -1191,7 +1191,7 @@ CREATE OR REPLACE VIEW public.jsonb_table_view AS "json_table".a21, "json_table".a22 FROM JSON_TABLE( - 'null'::jsonb, '$[*]' + 'null'::jsonb, '$[*]' AS json_table_path_1 PASSING 1 + 2 AS a, '"foo"'::json AS "b c" @@ -1222,34 +1222,35 @@ CREATE OR REPLACE VIEW public.jsonb_table_view AS ia integer[] PATH '$', ta text[] PATH '$', jba jsonb[] PATH '$', - NESTED PATH '$[1]' + NESTED PATH '$[1]' AS p1 COLUMNS ( a1 integer PATH '$."a1"', b1 text PATH '$."b1"', - NESTED PATH '$[*]' + NESTED PATH '$[*]' AS "p1 1" COLUMNS ( a11 text PATH '$."a11"' ) ), - NESTED PATH '$[2]' + NESTED PATH '$[2]' AS p2 COLUMNS ( - NESTED PATH '$[*]' + NESTED PATH '$[*]' AS "p2:1" COLUMNS ( a21 text PATH '$."a21"' ), - NESTED PATH '$[*]' + NESTED PATH '$[*]' AS p22 COLUMNS ( a22 text PATH '$."a22"' ) ) ) + PLAN (json_table_path_1 OUTER ((p1 OUTER "p1 1") UNION (p2 OUTER ("p2:1" UNION p22)))) ) EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM jsonb_table_view; - QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Table Function Scan on "json_table" Output: "json_table".id, "json_table".id2, "json_table"."int", "json_table".text, "json_table"."char(4)", "json_table".bool, "json_table"."numeric", "json_table".domain, "json_table".js, "json_table".jb, "json_table".jst, "json_table".jsc, "json_table".jsv, "json_table".jsb, "json_table".jsbq, "json_table".aaa, "json_table".aaa1, "json_table".exists1, "json_table".exists2, "json_table".exists3, "json_table".js2, "json_table".jsb2w, "json_table".jsb2q, "json_table".ia, "json_table".ta, "json_table".jba, "json_table".a1, "json_table".b1, "json_table".a11, "json_table".a21, "json_table".a22 - Table Function Call: JSON_TABLE('null'::jsonb, '$[*]' PASSING 3 AS a, '"foo"'::jsonb AS "b c" COLUMNS (id FOR ORDINALITY, id2 FOR ORDINALITY, "int" integer PATH '$', text text PATH '$', "char(4)" character(4) PATH '$', bool boolean PATH '$', "numeric" numeric PATH '$', domain jsonb_test_domain PATH '$', js json PATH '$', jb jsonb PATH '$', jst text FORMAT JSON PATH '$', jsc character(4) FORMAT JSON PATH '$', jsv character varying(4) FORMAT JSON PATH '$', jsb jsonb PATH '$', jsbq jsonb PATH '$' OMIT QUOTES, aaa integer PATH '$."aaa"', aaa1 integer PATH '$."aaa"', exists1 boolean EXISTS PATH '$."aaa"', exists2 integer EXISTS PATH '$."aaa"' TRUE ON ERROR, exists3 text EXISTS PATH 'strict $."aaa"' UNKNOWN ON ERROR, js2 json PATH '$', jsb2w jsonb PATH '$' WITH UNCONDITIONAL WRAPPER, jsb2q jsonb PATH '$' OMIT QUOTES, ia integer[] PATH '$', ta text[] PATH '$', jba jsonb[] PATH '$', NESTED PATH '$[1]' COLUMNS (a1 integer PATH '$."a1"', b1 text PATH '$."b1"', NESTED PATH '$[*]' COLUMNS (a11 text PATH '$."a11"')), NESTED PATH '$[2]' COLUMNS ( NESTED PATH '$[*]' COLUMNS (a21 text PATH '$."a21"'), NESTED PATH '$[*]' COLUMNS (a22 text PATH '$."a22"')))) + Table Function Call: JSON_TABLE('null'::jsonb, '$[*]' AS json_table_path_1 PASSING 3 AS a, '"foo"'::jsonb AS "b c" COLUMNS (id FOR ORDINALITY, id2 FOR ORDINALITY, "int" integer PATH '$', text text PATH '$', "char(4)" character(4) PATH '$', bool boolean PATH '$', "numeric" numeric PATH '$', domain jsonb_test_domain PATH '$', js json PATH '$', jb jsonb PATH '$', jst text FORMAT JSON PATH '$', jsc character(4) FORMAT JSON PATH '$', jsv character varying(4) FORMAT JSON PATH '$', jsb jsonb PATH '$', jsbq jsonb PATH '$' OMIT QUOTES, aaa integer PATH '$."aaa"', aaa1 integer PATH '$."aaa"', exists1 boolean EXISTS PATH '$."aaa"', exists2 integer EXISTS PATH '$."aaa"' TRUE ON ERROR, exists3 text EXISTS PATH 'strict $."aaa"' UNKNOWN ON ERROR, js2 json PATH '$', jsb2w jsonb PATH '$' WITH UNCONDITIONAL WRAPPER, jsb2q jsonb PATH '$' OMIT QUOTES, ia integer[] PATH '$', ta text[] PATH '$', jba jsonb[] PATH '$', NESTED PATH '$[1]' AS p1 COLUMNS (a1 integer PATH '$."a1"', b1 text PATH '$."b1"', NESTED PATH '$[*]' AS "p1 1" COLUMNS (a11 text PATH '$."a11"')), NESTED PATH '$[2]' AS p2 COLUMNS ( NESTED PATH '$[*]' AS "p2:1" COLUMNS (a21 text PATH '$."a21"'), NESTED PATH '$[*]' AS p22 COLUMNS (a22 text PATH '$."a22"'))) PLAN (json_table_path_1 OUTER ((p1 OUTER "p1 1") UNION (p2 OUTER ("p2:1" UNION p22))))) (3 rows) DROP VIEW jsonb_table_view; @@ -1341,13 +1342,49 @@ ERROR: cannot cast type boolean to jsonb LINE 1: ...ELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a jsonb EX... ^ -- JSON_TABLE: nested paths and plans +-- Should fail (JSON_TABLE columns must contain explicit AS path +-- specifications if explicit PLAN clause is used) +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' -- AS required here + COLUMNS ( + foo int PATH '$' + ) + PLAN DEFAULT (UNION) +) jt; +ERROR: invalid JSON_TABLE expression +LINE 2: jsonb '[]', '$' -- AS required here + ^ +DETAIL: JSON_TABLE columns must contain explicit AS pathname specification if explicit PLAN clause is used +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' AS path1 + COLUMNS ( + NESTED PATH '$' COLUMNS ( -- AS required here + foo int PATH '$' + ) + ) + PLAN DEFAULT (UNION) +) jt; +ERROR: invalid JSON_TABLE expression +LINE 4: NESTED PATH '$' COLUMNS ( -- AS required here + ^ +DETAIL: JSON_TABLE columns must contain explicit AS pathname specification if explicit PLAN clause is used -- Should fail (column names must be distinct) SELECT * FROM JSON_TABLE( - jsonb '[]', '$' + jsonb '[]', '$' AS a + COLUMNS ( + a int + ) +) jt; +ERROR: duplicate JSON_TABLE column name: a +HINT: JSON_TABLE column names must be distinct from one another +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' AS a COLUMNS ( - a int, - b text, - a jsonb + b int, + NESTED PATH '$' AS a + COLUMNS ( + c int + ) ) ) jt; ERROR: duplicate JSON_TABLE column name: a @@ -1356,10 +1393,9 @@ SELECT * FROM JSON_TABLE( jsonb '[]', '$' COLUMNS ( b int, - NESTED PATH '$' + NESTED PATH '$' AS b COLUMNS ( - c int, - b text + c int ) ) ) jt; @@ -1368,22 +1404,209 @@ HINT: JSON_TABLE column names must be distinct from one another SELECT * FROM JSON_TABLE( jsonb '[]', '$' COLUMNS ( - NESTED PATH '$' + NESTED PATH '$' AS a COLUMNS ( b int ), NESTED PATH '$' COLUMNS ( - NESTED PATH '$' + NESTED PATH '$' AS a COLUMNS ( - c int, - b text + c int ) ) ) ) jt; -ERROR: duplicate JSON_TABLE column name: b +ERROR: duplicate JSON_TABLE column name: a HINT: JSON_TABLE column names must be distinct from one another +-- JSON_TABLE: plan validation +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p1) +) jt; +ERROR: invalid JSON_TABLE plan +LINE 12: PLAN (p1) + ^ +DETAIL: path name mismatch: expected p0 but p1 is given +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0) +) jt; +ERROR: invalid JSON_TABLE plan +LINE 4: NESTED PATH '$' AS p1 COLUMNS ( + ^ +DETAIL: plan node for nested path p1 was not found in plan +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 OUTER p3) +) jt; +ERROR: invalid JSON_TABLE plan +LINE 4: NESTED PATH '$' AS p1 COLUMNS ( + ^ +DETAIL: plan node for nested path p1 was not found in plan +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 UNION p1 UNION p11) +) jt; +ERROR: invalid JSON_TABLE plan +LINE 12: PLAN (p0 UNION p1 UNION p11) + ^ +DETAIL: expected INNER or OUTER JSON_TABLE plan node +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 OUTER (p1 CROSS p13)) +) jt; +ERROR: invalid JSON_TABLE plan +LINE 8: NESTED PATH '$' AS p2 COLUMNS ( + ^ +DETAIL: plan node for nested path p2 was not found in plan +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 OUTER (p1 CROSS p2)) +) jt; +ERROR: invalid JSON_TABLE plan +LINE 5: NESTED PATH '$' AS p11 COLUMNS ( foo int ), + ^ +DETAIL: plan node for nested path p11 was not found in plan +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 OUTER ((p1 UNION p11) CROSS p2)) +) jt; +ERROR: invalid JSON_TABLE plan +LINE 12: PLAN (p0 OUTER ((p1 UNION p11) CROSS p2)) + ^ +DETAIL: plan node contains some extra or duplicate sibling nodes +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 OUTER ((p1 INNER p11) CROSS p2)) +) jt; +ERROR: invalid JSON_TABLE plan +LINE 6: NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ^ +DETAIL: plan node for nested path p12 was not found in plan +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 OUTER ((p1 INNER (p12 CROSS p11)) CROSS p2)) +) jt; +ERROR: invalid JSON_TABLE plan +LINE 9: NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ^ +DETAIL: plan node for nested path p21 was not found in plan +SELECT * FROM JSON_TABLE( + jsonb 'null', 'strict $[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 OUTER ((p1 INNER (p12 CROSS p11)) CROSS (p2 INNER p21))) +) jt; + bar | foo | baz +-----+-----+----- +(0 rows) + +SELECT * FROM JSON_TABLE( + jsonb 'null', 'strict $[*]' -- without root path name + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN ((p1 INNER (p12 CROSS p11)) CROSS (p2 INNER p21)) +) jt; +ERROR: invalid JSON_TABLE expression +LINE 2: jsonb 'null', 'strict $[*]' -- without root path name + ^ +DETAIL: JSON_TABLE columns must contain explicit AS pathname specification if explicit PLAN clause is used -- JSON_TABLE: plan execution CREATE TEMP TABLE jsonb_table_test (js jsonb); INSERT INTO jsonb_table_test @@ -1401,12 +1624,12 @@ select from jsonb_table_test jtt, json_table ( - jtt.js,'strict $[*]' + jtt.js,'strict $[*]' as p columns ( n for ordinality, a int path 'lax $.a' default -1 on empty, - nested path 'strict $.b[*]' columns ( b int path '$' ), - nested path 'strict $.c[*]' columns ( c int path '$' ) + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) ) ) jt; n | a | b | c @@ -1424,6 +1647,325 @@ from 4 | -1 | 2 | (11 rows) +-- default plan (outer, union) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan default (outer, union) + ) jt; + n | a | b | c +---+----+---+---- + 1 | 1 | | + 2 | 2 | 1 | + 2 | 2 | 2 | + 2 | 2 | 3 | + 2 | 2 | | 10 + 2 | 2 | | + 2 | 2 | | 20 + 3 | 3 | 1 | + 3 | 3 | 2 | + 4 | -1 | 1 | + 4 | -1 | 2 | +(11 rows) + +-- specific plan (p outer (pb union pc)) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan (p outer (pb union pc)) + ) jt; + n | a | b | c +---+----+---+---- + 1 | 1 | | + 2 | 2 | 1 | + 2 | 2 | 2 | + 2 | 2 | 3 | + 2 | 2 | | 10 + 2 | 2 | | + 2 | 2 | | 20 + 3 | 3 | 1 | + 3 | 3 | 2 | + 4 | -1 | 1 | + 4 | -1 | 2 | +(11 rows) + +-- specific plan (p outer (pc union pb)) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan (p outer (pc union pb)) + ) jt; + n | a | c | b +---+----+----+--- + 1 | 1 | | + 2 | 2 | 10 | + 2 | 2 | | + 2 | 2 | 20 | + 2 | 2 | | 1 + 2 | 2 | | 2 + 2 | 2 | | 3 + 3 | 3 | | 1 + 3 | 3 | | 2 + 4 | -1 | | 1 + 4 | -1 | | 2 +(11 rows) + +-- default plan (inner, union) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan default (inner) + ) jt; + n | a | b | c +---+----+---+---- + 2 | 2 | 1 | + 2 | 2 | 2 | + 2 | 2 | 3 | + 2 | 2 | | 10 + 2 | 2 | | + 2 | 2 | | 20 + 3 | 3 | 1 | + 3 | 3 | 2 | + 4 | -1 | 1 | + 4 | -1 | 2 | +(10 rows) + +-- specific plan (p inner (pb union pc)) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan (p inner (pb union pc)) + ) jt; + n | a | b | c +---+----+---+---- + 2 | 2 | 1 | + 2 | 2 | 2 | + 2 | 2 | 3 | + 2 | 2 | | 10 + 2 | 2 | | + 2 | 2 | | 20 + 3 | 3 | 1 | + 3 | 3 | 2 | + 4 | -1 | 1 | + 4 | -1 | 2 | +(10 rows) + +-- default plan (inner, cross) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan default (cross, inner) + ) jt; + n | a | b | c +---+---+---+---- + 2 | 2 | 1 | 10 + 2 | 2 | 1 | + 2 | 2 | 1 | 20 + 2 | 2 | 2 | 10 + 2 | 2 | 2 | + 2 | 2 | 2 | 20 + 2 | 2 | 3 | 10 + 2 | 2 | 3 | + 2 | 2 | 3 | 20 +(9 rows) + +-- specific plan (p inner (pb cross pc)) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan (p inner (pb cross pc)) + ) jt; + n | a | b | c +---+---+---+---- + 2 | 2 | 1 | 10 + 2 | 2 | 1 | + 2 | 2 | 1 | 20 + 2 | 2 | 2 | 10 + 2 | 2 | 2 | + 2 | 2 | 2 | 20 + 2 | 2 | 3 | 10 + 2 | 2 | 3 | + 2 | 2 | 3 | 20 +(9 rows) + +-- default plan (outer, cross) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan default (outer, cross) + ) jt; + n | a | b | c +---+----+---+---- + 1 | 1 | | + 2 | 2 | 1 | 10 + 2 | 2 | 1 | + 2 | 2 | 1 | 20 + 2 | 2 | 2 | 10 + 2 | 2 | 2 | + 2 | 2 | 2 | 20 + 2 | 2 | 3 | 10 + 2 | 2 | 3 | + 2 | 2 | 3 | 20 + 3 | 3 | | + 4 | -1 | | +(12 rows) + +-- specific plan (p outer (pb cross pc)) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan (p outer (pb cross pc)) + ) jt; + n | a | b | c +---+----+---+---- + 1 | 1 | | + 2 | 2 | 1 | 10 + 2 | 2 | 1 | + 2 | 2 | 1 | 20 + 2 | 2 | 2 | 10 + 2 | 2 | 2 | + 2 | 2 | 2 | 20 + 2 | 2 | 3 | 10 + 2 | 2 | 3 | + 2 | 2 | 3 | 20 + 3 | 3 | | + 4 | -1 | | +(12 rows) + +select + jt.*, b1 + 100 as b +from + json_table (jsonb + '[ + {"a": 1, "b": [[1, 10], [2], [3, 30, 300]], "c": [1, null, 2]}, + {"a": 2, "b": [10, 20], "c": [1, null, 2]}, + {"x": "3", "b": [11, 22, 33, 44]} + ]', + '$[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on error, + nested path 'strict $.b[*]' as pb columns ( + b text format json path '$', + nested path 'strict $[*]' as pb1 columns ( + b1 int path '$' + ) + ), + nested path 'strict $.c[*]' as pc columns ( + c text format json path '$', + nested path 'strict $[*]' as pc1 columns ( + c1 int path '$' + ) + ) + ) + --plan default(outer, cross) + plan(p outer ((pb inner pb1) cross (pc outer pc1))) + ) jt; + n | a | b | b1 | c | c1 | b +---+---+--------------+-----+------+----+----- + 1 | 1 | [1, 10] | 1 | 1 | | 101 + 1 | 1 | [1, 10] | 1 | null | | 101 + 1 | 1 | [1, 10] | 1 | 2 | | 101 + 1 | 1 | [1, 10] | 10 | 1 | | 110 + 1 | 1 | [1, 10] | 10 | null | | 110 + 1 | 1 | [1, 10] | 10 | 2 | | 110 + 1 | 1 | [2] | 2 | 1 | | 102 + 1 | 1 | [2] | 2 | null | | 102 + 1 | 1 | [2] | 2 | 2 | | 102 + 1 | 1 | [3, 30, 300] | 3 | 1 | | 103 + 1 | 1 | [3, 30, 300] | 3 | null | | 103 + 1 | 1 | [3, 30, 300] | 3 | 2 | | 103 + 1 | 1 | [3, 30, 300] | 30 | 1 | | 130 + 1 | 1 | [3, 30, 300] | 30 | null | | 130 + 1 | 1 | [3, 30, 300] | 30 | 2 | | 130 + 1 | 1 | [3, 30, 300] | 300 | 1 | | 400 + 1 | 1 | [3, 30, 300] | 300 | null | | 400 + 1 | 1 | [3, 30, 300] | 300 | 2 | | 400 + 2 | 2 | | | | | + 3 | | | | | | +(20 rows) + -- Should succeed (JSON arguments are passed to root and nested paths) SELECT * FROM diff --git a/src/test/regress/sql/jsonb_sqljson.sql b/src/test/regress/sql/jsonb_sqljson.sql index 62236c9fb1..90c5975488 100644 --- a/src/test/regress/sql/jsonb_sqljson.sql +++ b/src/test/regress/sql/jsonb_sqljson.sql @@ -418,18 +418,18 @@ SELECT * FROM ta text[] PATH '$', jba jsonb[] PATH '$', - NESTED PATH '$[1]' COLUMNS ( + NESTED PATH '$[1]' AS p1 COLUMNS ( a1 int, - NESTED PATH '$[*]' COLUMNS ( + NESTED PATH '$[*]' AS "p1 1" COLUMNS ( a11 text ), b1 text ), - NESTED PATH '$[2]' COLUMNS ( - NESTED PATH '$[*]' COLUMNS ( + NESTED PATH '$[2]' AS p2 COLUMNS ( + NESTED PATH '$[*]' AS "p2:1" COLUMNS ( a21 text ), - NESTED PATH '$[*]' COLUMNS ( + NESTED PATH '$[*]' AS p22 COLUMNS ( a22 text ) ) @@ -482,13 +482,42 @@ SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a jsonb EXISTS PATH '$.a')); -- JSON_TABLE: nested paths and plans +-- Should fail (JSON_TABLE columns must contain explicit AS path +-- specifications if explicit PLAN clause is used) +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' -- AS required here + COLUMNS ( + foo int PATH '$' + ) + PLAN DEFAULT (UNION) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' AS path1 + COLUMNS ( + NESTED PATH '$' COLUMNS ( -- AS required here + foo int PATH '$' + ) + ) + PLAN DEFAULT (UNION) +) jt; + -- Should fail (column names must be distinct) SELECT * FROM JSON_TABLE( - jsonb '[]', '$' + jsonb '[]', '$' AS a COLUMNS ( - a int, - b text, - a jsonb + a int + ) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' AS a + COLUMNS ( + b int, + NESTED PATH '$' AS a + COLUMNS ( + c int + ) ) ) jt; @@ -496,10 +525,9 @@ SELECT * FROM JSON_TABLE( jsonb '[]', '$' COLUMNS ( b int, - NESTED PATH '$' + NESTED PATH '$' AS b COLUMNS ( - c int, - b text + c int ) ) ) jt; @@ -507,21 +535,176 @@ SELECT * FROM JSON_TABLE( SELECT * FROM JSON_TABLE( jsonb '[]', '$' COLUMNS ( - NESTED PATH '$' + NESTED PATH '$' AS a COLUMNS ( b int ), NESTED PATH '$' COLUMNS ( - NESTED PATH '$' + NESTED PATH '$' AS a COLUMNS ( - c int, - b text + c int ) ) ) ) jt; +-- JSON_TABLE: plan validation + +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p1) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 OUTER p3) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 UNION p1 UNION p11) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 OUTER (p1 CROSS p13)) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 OUTER (p1 CROSS p2)) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 OUTER ((p1 UNION p11) CROSS p2)) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 OUTER ((p1 INNER p11) CROSS p2)) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb 'null', '$[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 OUTER ((p1 INNER (p12 CROSS p11)) CROSS p2)) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb 'null', 'strict $[*]' AS p0 + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN (p0 OUTER ((p1 INNER (p12 CROSS p11)) CROSS (p2 INNER p21))) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb 'null', 'strict $[*]' -- without root path name + COLUMNS ( + NESTED PATH '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ), + NESTED PATH '$' AS p12 COLUMNS ( bar int ) + ), + NESTED PATH '$' AS p2 COLUMNS ( + NESTED PATH '$' AS p21 COLUMNS ( baz int ) + ) + ) + PLAN ((p1 INNER (p12 CROSS p11)) CROSS (p2 INNER p21)) +) jt; + -- JSON_TABLE: plan execution CREATE TEMP TABLE jsonb_table_test (js jsonb); @@ -542,13 +725,188 @@ select from jsonb_table_test jtt, json_table ( - jtt.js,'strict $[*]' + jtt.js,'strict $[*]' as p columns ( n for ordinality, a int path 'lax $.a' default -1 on empty, - nested path 'strict $.b[*]' columns ( b int path '$' ), - nested path 'strict $.c[*]' columns ( c int path '$' ) + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + ) jt; + +-- default plan (outer, union) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan default (outer, union) + ) jt; + +-- specific plan (p outer (pb union pc)) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan (p outer (pb union pc)) + ) jt; + +-- specific plan (p outer (pc union pb)) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan (p outer (pc union pb)) + ) jt; + +-- default plan (inner, union) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan default (inner) + ) jt; + +-- specific plan (p inner (pb union pc)) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan (p inner (pb union pc)) + ) jt; + +-- default plan (inner, cross) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan default (cross, inner) + ) jt; + +-- specific plan (p inner (pb cross pc)) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan (p inner (pb cross pc)) + ) jt; + +-- default plan (outer, cross) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan default (outer, cross) + ) jt; + +-- specific plan (p outer (pb cross pc)) +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns ( b int path '$' ), + nested path 'strict $.c[*]' as pc columns ( c int path '$' ) + ) + plan (p outer (pb cross pc)) + ) jt; + + +select + jt.*, b1 + 100 as b +from + json_table (jsonb + '[ + {"a": 1, "b": [[1, 10], [2], [3, 30, 300]], "c": [1, null, 2]}, + {"a": 2, "b": [10, 20], "c": [1, null, 2]}, + {"x": "3", "b": [11, 22, 33, 44]} + ]', + '$[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on error, + nested path 'strict $.b[*]' as pb columns ( + b text format json path '$', + nested path 'strict $[*]' as pb1 columns ( + b1 int path '$' + ) + ), + nested path 'strict $.c[*]' as pc columns ( + c text format json path '$', + nested path 'strict $[*]' as pc1 columns ( + c1 int path '$' + ) + ) ) + --plan default(outer, cross) + plan(p outer ((pb inner pb1) cross (pc outer pc1))) ) jt; -- Should succeed (JSON arguments are passed to root and nested paths) diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 4b12c575ab..9b4f77fbf1 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1244,6 +1244,9 @@ JsonTableColumnType JsonTableContext JsonTableJoinState JsonTableParent +JsonTablePlan +JsonTablePlanJoinType +JsonTablePlanType JsonTableScanState JsonTableSibling JsonTokenType From 75edb919613ee835e7680e40137e494c7856bcf9 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Tue, 5 Apr 2022 22:16:45 +0200 Subject: [PATCH 382/772] Fix compilerwarning in logging size_t The pg_fatal log which included filesizes were using UINT64_FORMAT for the size_t variables, which failed on 32 bit buildfarm animals. Change to using plain int instead, which is in line with how digestControlFile is doing it already. Per buildfarm animals florican and lapwing. Discussion: https://postgr.es/m/13C2BF64-4A6D-47E4-9181-3A658F00C9B7@yesql.se --- src/bin/pg_rewind/local_source.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/pg_rewind/local_source.c b/src/bin/pg_rewind/local_source.c index 58699effcc..2e50485c39 100644 --- a/src/bin/pg_rewind/local_source.c +++ b/src/bin/pg_rewind/local_source.c @@ -114,8 +114,8 @@ local_queue_fetch_file(rewind_source *source, const char *path, size_t len) * check that the size of the file matches our earlier expectation. */ if (written_len != len) - pg_fatal("size of source file \"%s\" changed concurrently: " UINT64_FORMAT " bytes expected, " UINT64_FORMAT " copied", - srcpath, len, written_len); + pg_fatal("size of source file \"%s\" changed concurrently: %d bytes expected, %d copied", + srcpath, (int) len, (int) written_len); if (close(srcfd) != 0) pg_fatal("could not close file \"%s\": %m", srcpath); From e37ad5fa4df2319e26a7e779607130feae1a5029 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 5 Apr 2022 20:44:01 -0400 Subject: [PATCH 383/772] Remove race condition in 022_crash_temp_files.pl test. It's possible for the query that "waits for restart" to complete a successful iteration before the postmaster has noticed its SIGKILL'd child and begun the restart cycle. (This is a bit hard to believe perhaps, but it's been seen at least twice in the buildfarm, mainly on ancient platforms that likely have quirky schedulers.) To provide a more secure interlock, wait for the other session we're using to report that it's been forcibly shut down. Patch by me, based on a suggestion from Andres Freund. Back-patch to v14 where this test case came in. Discussion: https://postgr.es/m/1801850.1649047827@sss.pgh.pa.us --- src/test/recovery/t/022_crash_temp_files.pl | 34 ++++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/test/recovery/t/022_crash_temp_files.pl b/src/test/recovery/t/022_crash_temp_files.pl index 36906b4aca..24fb141785 100644 --- a/src/test/recovery/t/022_crash_temp_files.pl +++ b/src/test/recovery/t/022_crash_temp_files.pl @@ -125,11 +125,24 @@ BEGIN my $ret = PostgreSQL::Test::Utils::system_log('pg_ctl', 'kill', 'KILL', $pid); is($ret, 0, 'killed process with KILL'); -# Close psql session +# Close that psql session $killme->finish; + +# Wait till the other session reports failure, ensuring that the postmaster +# has noticed its dead child and begun a restart cycle. +$killme_stdin2 .= qq[ +SELECT pg_sleep($PostgreSQL::Test::Utils::timeout_default); +]; +ok( pump_until( + $killme2, + $psql_timeout, + \$killme_stderr2, + qr/WARNING: terminating connection because of crash of another server process|server closed the connection unexpectedly|connection to server was lost|could not send data to server/m + ), + "second psql session died successfully after SIGKILL"); $killme2->finish; -# Wait till server restarts +# Wait till server finishes restarting $node->poll_query_until('postgres', undef, ''); # Check for temporary files @@ -214,11 +227,24 @@ BEGIN $ret = PostgreSQL::Test::Utils::system_log('pg_ctl', 'kill', 'KILL', $pid); is($ret, 0, 'killed process with KILL'); -# Close psql session +# Close that psql session $killme->finish; + +# Wait till the other session reports failure, ensuring that the postmaster +# has noticed its dead child and begun a restart cycle. +$killme_stdin2 .= qq[ +SELECT pg_sleep($PostgreSQL::Test::Utils::timeout_default); +]; +ok( pump_until( + $killme2, + $psql_timeout, + \$killme_stderr2, + qr/WARNING: terminating connection because of crash of another server process|server closed the connection unexpectedly|connection to server was lost|could not send data to server/m + ), + "second psql session died successfully after SIGKILL"); $killme2->finish; -# Wait till server restarts +# Wait till server finishes restarting $node->poll_query_until('postgres', undef, ''); # Check for temporary files -- should be there From 17a856d08bedeaec77be3f15572e01f553e9613f Mon Sep 17 00:00:00 2001 From: Tatsuo Ishii Date: Wed, 6 Apr 2022 09:55:58 +0900 Subject: [PATCH 384/772] Change aggregated log format of pgbench. Commit 4a39f87acd changed the aggregated log format. Problem is, now the explanatory paragraph for the log line in the document is too long. Also the log format included more optional columns, and it's harder to parse the log lines. This commit tries to solve the problems. - There's no optional log columns anymore. If a column is not meaningful with provided pgbench option, it will be presented as 0. - Reorder the log columns so that it's easier to parse them. - Adjust explanatory paragraph for the log line in the doc. Discussion: https://postgr.es/m/flat/202203280757.3tu4ovs3petm%40alvherre.pgsql --- doc/src/sgml/ref/pgbench.sgml | 64 ++++++++++++++++++++++------------- src/bin/pgbench/pgbench.c | 59 ++++++++++++++++++++++---------- 2 files changed, 82 insertions(+), 41 deletions(-) diff --git a/doc/src/sgml/ref/pgbench.sgml b/doc/src/sgml/ref/pgbench.sgml index ebdb4b3f46..d1818ff316 100644 --- a/doc/src/sgml/ref/pgbench.sgml +++ b/doc/src/sgml/ref/pgbench.sgml @@ -2401,7 +2401,9 @@ END; format is used for the log files: -interval_start num_transactions sum_latency sum_latency_2 min_latency max_latency { failures | serialization_failures deadlock_failures } sum_lag sum_lag_2 min_lag max_lag skipped retried retries +interval_start num_transactions sum_latency sum_latency_2 min_latency max_latency +sum_lag sum_lag_2 min_lag max_lag skipped +retried retries failures serialization_failures deadlock_failures where @@ -2417,41 +2419,55 @@ END; and max_latency is the maximum latency within the interval, failures is the number of transactions that ended - with a failed SQL command within the interval. If you use option - , instead of the sum of all failed - transactions you will get more detailed statistics for the failed - transactions grouped by the following types: - serialization_failures is the number of - transactions that got a serialization error and were not retried after this, - deadlock_failures is the number of transactions - that got a deadlock error and were not retried after this. + with a failed SQL command within the interval. + + The next fields, sum_lag, sum_lag_2, min_lag, - and max_lag, are only present if the - option is used. + and max_lag, only meaningful if the + option is used. Otherwise, they are all 0.0. They provide statistics about the time each transaction had to wait for the previous one to finish, i.e., the difference between each transaction's scheduled start time and the time it actually started. The next field, skipped, - is only present if the option is used, too. + is only meaningful if the option is used, too. Otherwise it is 0. It counts the number of transactions skipped because they would have started too late. - The retried and retries - fields are present only if the option is not - equal to 1. They report the number of retried transactions and the sum of all - retries after serialization or deadlock errors within the interval. - Each transaction is counted in the interval when it was committed. + + + The retried + and retries fields are only meaningful if + the option is not equal to 1. Otherwise they + are 0. They report the number of retried transactions and the sum of all + retries after serialization or deadlock errors within the interval. Each + transaction is counted in the interval when it was committed. + + + failures is the sum of all failed transactions. + If is specified, instead of the sum of + all failed transactions you will get more detailed statistics for the + failed transactions grouped by the following types: + serialization_failures is the number of + transactions that got a serialization error and were not retried after this, + deadlock_failures is the number of transactions + that got a deadlock error and were not retried after this. + If is not + specified, serialization_failures + and deadlock_failures are always 0. - Here is some example output: + Here is some example output with following options: -1345828501 5601 1542744 483552416 61 2573 0 -1345828503 7884 1979812 565806736 60 1479 0 -1345828505 7208 1979422 567277552 59 1391 0 -1345828507 7685 1980268 569784714 60 1398 0 -1345828509 7073 1979779 573489941 236 1411 0 - +pgbench --aggregate-interval=10 --time=20 --client=10 --log --rate=1000 +--latency-limit=10 --failures-detailed --max-tries=10 test + + + +1649114136 5815 27552565 177846919143 1078 21716 2756787 7264696105 0 9661 0 7854 31472 4022 4022 0 +1649114146 5958 28460110 182785513108 1083 20391 2539395 6411761497 0 7268 0 8127 32595 4101 4101 0 + + Notice that while the plain (unaggregated) log file shows which script diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index acf3e56413..4d4b979e4f 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -4494,6 +4494,17 @@ doLog(TState *thread, CState *st, while ((next = agg->start_time + agg_interval * INT64CONST(1000000)) <= now) { + double lag_sum = 0.0; + double lag_sum2 = 0.0; + double lag_min = 0.0; + double lag_max = 0.0; + int64 skipped = 0; + int64 serialization_failures = 0; + int64 deadlock_failures = 0; + int64 serialization_or_deadlock_failures = 0; + int64 retried = 0; + int64 retries = 0; + /* print aggregated report to logfile */ fprintf(logfile, INT64_FORMAT " " INT64_FORMAT " %.0f %.0f %.0f %.0f", agg->start_time / 1000000, /* seconds since Unix epoch */ @@ -4503,27 +4514,41 @@ doLog(TState *thread, CState *st, agg->latency.min, agg->latency.max); - if (failures_detailed) - fprintf(logfile, " " INT64_FORMAT " " INT64_FORMAT, - agg->serialization_failures, - agg->deadlock_failures); - else - fprintf(logfile, " " INT64_FORMAT, getFailures(agg)); - if (throttle_delay) { - fprintf(logfile, " %.0f %.0f %.0f %.0f", - agg->lag.sum, - agg->lag.sum2, - agg->lag.min, - agg->lag.max); - if (latency_limit) - fprintf(logfile, " " INT64_FORMAT, agg->skipped); + lag_sum = agg->lag.sum; + lag_sum2 = agg->lag.sum2; + lag_min = agg->lag.min; + lag_max = agg->lag.max; } + fprintf(logfile, " %.0f %.0f %.0f %.0f", + lag_sum, + lag_sum2, + lag_min, + lag_max); + + if (latency_limit) + skipped = agg->skipped; + fprintf(logfile, " " INT64_FORMAT, skipped); + if (max_tries != 1) - fprintf(logfile, " " INT64_FORMAT " " INT64_FORMAT, - agg->retried, - agg->retries); + { + retried = agg->retried; + retries = agg->retries; + } + fprintf(logfile, " " INT64_FORMAT " " INT64_FORMAT, retried, retries); + + if (failures_detailed) + { + serialization_failures = agg->serialization_failures; + deadlock_failures = agg->deadlock_failures; + } + serialization_or_deadlock_failures = serialization_failures + deadlock_failures; + fprintf(logfile, " " INT64_FORMAT " " INT64_FORMAT " " INT64_FORMAT, + serialization_or_deadlock_failures, + serialization_failures, + deadlock_failures); + fputc('\n', logfile); /* reset data and move to next interval */ From 2d09e44d309f64d3571f90f7620c9d924aecd010 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Wed, 6 Apr 2022 08:20:40 +0530 Subject: [PATCH 385/772] Improve comments for row filtering and toast interaction in logical replication. Reported-by: Antonin Houska Author: Amit Kapila Reviewed-by: Antonin Houska, Ajin Cherian Discussion: https://postgr.es/m/84638.1649152255@antos --- src/backend/replication/pgoutput/pgoutput.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 20d0b1e125..9d33630464 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -1237,10 +1237,11 @@ pgoutput_row_filter(Relation relation, TupleTableSlot *old_slot, * For inserts, we only have the new tuple. * * For updates, we can have only a new tuple when none of the replica - * identity columns changed but we still need to evaluate the row filter - * for new tuple as the existing values of those columns might not match - * the filter. Also, users can use constant expressions in the row filter, - * so we anyway need to evaluate it for the new tuple. + * identity columns changed and none of those columns have external data + * but we still need to evaluate the row filter for the new tuple as the + * existing values of those columns might not match the filter. Also, users + * can use constant expressions in the row filter, so we anyway need to + * evaluate it for the new tuple. * * For deletes, we only have the old tuple. */ From 376dc437de40bd17e99a37f72f88627a16d7f200 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 6 Apr 2022 08:17:33 +0200 Subject: [PATCH 386/772] Update Unicode data to CLDR 41 No actual changes result. --- src/Makefile.global.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 07a9e52a18..051718e4fe 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -367,7 +367,7 @@ DOWNLOAD = wget -O $@ --no-use-server-timestamps UNICODE_VERSION = 14.0.0 # Pick a release from here: -CLDR_VERSION = 39 +CLDR_VERSION = 41 # Tree-wide build support From c2bb02bc2e858ba345b8b33f1f3a54628f719d93 Mon Sep 17 00:00:00 2001 From: Etsuro Fujita Date: Wed, 6 Apr 2022 15:45:00 +0900 Subject: [PATCH 387/772] Allow asynchronous execution in more cases. In commit 27e1f1456, create_append_plan() only allowed the subplan created from a given subpath to be executed asynchronously when it was an async-capable ForeignPath. To extend coverage, this patch handles cases when the given subpath includes some other Path types as well that can be omitted in the plan processing, such as a ProjectionPath directly atop an async-capable ForeignPath, allowing asynchronous execution in partitioned-scan/partitioned-join queries with non-Var tlist expressions and more UNION queries. Andrey Lepikhov and Etsuro Fujita, reviewed by Alexander Pyhalov and Zhihong Yu. Discussion: https://postgr.es/m/659c37a8-3e71-0ff2-394c-f04428c76f08%40postgrespro.ru --- .../postgres_fdw/expected/postgres_fdw.out | 170 ++++++++++++++++++ contrib/postgres_fdw/sql/postgres_fdw.sql | 41 +++++ src/backend/nodes/copyfuncs.c | 1 + src/backend/nodes/outfuncs.c | 1 + src/backend/nodes/readfuncs.c | 1 + src/backend/optimizer/plan/createplan.c | 57 ++++-- src/backend/optimizer/plan/setrefs.c | 18 +- src/include/nodes/plannodes.h | 12 ++ src/include/optimizer/planmain.h | 1 + 9 files changed, 287 insertions(+), 15 deletions(-) diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index 11e9b4e8cc..30e95f585f 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -10221,6 +10221,31 @@ SELECT * FROM result_tbl ORDER BY a; 2505 | 505 | 0505 (2 rows) +DELETE FROM result_tbl; +EXPLAIN (VERBOSE, COSTS OFF) +INSERT INTO result_tbl SELECT a, b, 'AAA' || c FROM async_pt WHERE b === 505; + QUERY PLAN +--------------------------------------------------------------------------------- + Insert on public.result_tbl + -> Append + -> Async Foreign Scan on public.async_p1 async_pt_1 + Output: async_pt_1.a, async_pt_1.b, ('AAA'::text || async_pt_1.c) + Filter: (async_pt_1.b === 505) + Remote SQL: SELECT a, b, c FROM public.base_tbl1 + -> Async Foreign Scan on public.async_p2 async_pt_2 + Output: async_pt_2.a, async_pt_2.b, ('AAA'::text || async_pt_2.c) + Filter: (async_pt_2.b === 505) + Remote SQL: SELECT a, b, c FROM public.base_tbl2 +(10 rows) + +INSERT INTO result_tbl SELECT a, b, 'AAA' || c FROM async_pt WHERE b === 505; +SELECT * FROM result_tbl ORDER BY a; + a | b | c +------+-----+--------- + 1505 | 505 | AAA0505 + 2505 | 505 | AAA0505 +(2 rows) + DELETE FROM result_tbl; -- Check case where multiple partitions use the same connection CREATE TABLE base_tbl3 (a int, b int, c text); @@ -10358,6 +10383,69 @@ SELECT * FROM join_tbl ORDER BY a1; 3900 | 900 | 0900 | 3900 | 900 | 0900 (30 rows) +DELETE FROM join_tbl; +EXPLAIN (VERBOSE, COSTS OFF) +INSERT INTO join_tbl SELECT t1.a, t1.b, 'AAA' || t1.c, t2.a, t2.b, 'AAA' || t2.c FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Insert on public.join_tbl + -> Append + -> Async Foreign Scan + Output: t1_1.a, t1_1.b, ('AAA'::text || t1_1.c), t2_1.a, t2_1.b, ('AAA'::text || t2_1.c) + Relations: (public.async_p1 t1_1) INNER JOIN (public.async_p1 t2_1) + Remote SQL: SELECT r5.a, r5.b, r5.c, r8.a, r8.b, r8.c FROM (public.base_tbl1 r5 INNER JOIN public.base_tbl1 r8 ON (((r5.a = r8.a)) AND ((r5.b = r8.b)) AND (((r5.b % 100) = 0)))) + -> Async Foreign Scan + Output: t1_2.a, t1_2.b, ('AAA'::text || t1_2.c), t2_2.a, t2_2.b, ('AAA'::text || t2_2.c) + Relations: (public.async_p2 t1_2) INNER JOIN (public.async_p2 t2_2) + Remote SQL: SELECT r6.a, r6.b, r6.c, r9.a, r9.b, r9.c FROM (public.base_tbl2 r6 INNER JOIN public.base_tbl2 r9 ON (((r6.a = r9.a)) AND ((r6.b = r9.b)) AND (((r6.b % 100) = 0)))) + -> Hash Join + Output: t1_3.a, t1_3.b, ('AAA'::text || t1_3.c), t2_3.a, t2_3.b, ('AAA'::text || t2_3.c) + Hash Cond: ((t2_3.a = t1_3.a) AND (t2_3.b = t1_3.b)) + -> Seq Scan on public.async_p3 t2_3 + Output: t2_3.a, t2_3.b, t2_3.c + -> Hash + Output: t1_3.a, t1_3.b, t1_3.c + -> Seq Scan on public.async_p3 t1_3 + Output: t1_3.a, t1_3.b, t1_3.c + Filter: ((t1_3.b % 100) = 0) +(20 rows) + +INSERT INTO join_tbl SELECT t1.a, t1.b, 'AAA' || t1.c, t2.a, t2.b, 'AAA' || t2.c FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0; +SELECT * FROM join_tbl ORDER BY a1; + a1 | b1 | c1 | a2 | b2 | c2 +------+-----+---------+------+-----+--------- + 1000 | 0 | AAA0000 | 1000 | 0 | AAA0000 + 1100 | 100 | AAA0100 | 1100 | 100 | AAA0100 + 1200 | 200 | AAA0200 | 1200 | 200 | AAA0200 + 1300 | 300 | AAA0300 | 1300 | 300 | AAA0300 + 1400 | 400 | AAA0400 | 1400 | 400 | AAA0400 + 1500 | 500 | AAA0500 | 1500 | 500 | AAA0500 + 1600 | 600 | AAA0600 | 1600 | 600 | AAA0600 + 1700 | 700 | AAA0700 | 1700 | 700 | AAA0700 + 1800 | 800 | AAA0800 | 1800 | 800 | AAA0800 + 1900 | 900 | AAA0900 | 1900 | 900 | AAA0900 + 2000 | 0 | AAA0000 | 2000 | 0 | AAA0000 + 2100 | 100 | AAA0100 | 2100 | 100 | AAA0100 + 2200 | 200 | AAA0200 | 2200 | 200 | AAA0200 + 2300 | 300 | AAA0300 | 2300 | 300 | AAA0300 + 2400 | 400 | AAA0400 | 2400 | 400 | AAA0400 + 2500 | 500 | AAA0500 | 2500 | 500 | AAA0500 + 2600 | 600 | AAA0600 | 2600 | 600 | AAA0600 + 2700 | 700 | AAA0700 | 2700 | 700 | AAA0700 + 2800 | 800 | AAA0800 | 2800 | 800 | AAA0800 + 2900 | 900 | AAA0900 | 2900 | 900 | AAA0900 + 3000 | 0 | AAA0000 | 3000 | 0 | AAA0000 + 3100 | 100 | AAA0100 | 3100 | 100 | AAA0100 + 3200 | 200 | AAA0200 | 3200 | 200 | AAA0200 + 3300 | 300 | AAA0300 | 3300 | 300 | AAA0300 + 3400 | 400 | AAA0400 | 3400 | 400 | AAA0400 + 3500 | 500 | AAA0500 | 3500 | 500 | AAA0500 + 3600 | 600 | AAA0600 | 3600 | 600 | AAA0600 + 3700 | 700 | AAA0700 | 3700 | 700 | AAA0700 + 3800 | 800 | AAA0800 | 3800 | 800 | AAA0800 + 3900 | 900 | AAA0900 | 3900 | 900 | AAA0900 +(30 rows) + DELETE FROM join_tbl; RESET enable_partitionwise_join; -- Test rescan of an async Append node with do_exec_prune=false @@ -10536,6 +10624,88 @@ DROP TABLE local_tbl; DROP INDEX base_tbl1_idx; DROP INDEX base_tbl2_idx; DROP INDEX async_p3_idx; +-- UNION queries +EXPLAIN (VERBOSE, COSTS OFF) +INSERT INTO result_tbl +(SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10) +UNION +(SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10); + QUERY PLAN +----------------------------------------------------------------------------------------------------------------- + Insert on public.result_tbl + -> HashAggregate + Output: async_p1.a, async_p1.b, (('AAA'::text || async_p1.c)) + Group Key: async_p1.a, async_p1.b, (('AAA'::text || async_p1.c)) + -> Append + -> Async Foreign Scan on public.async_p1 + Output: async_p1.a, async_p1.b, ('AAA'::text || async_p1.c) + Remote SQL: SELECT a, b, c FROM public.base_tbl1 ORDER BY a ASC NULLS LAST LIMIT 10::bigint + -> Async Foreign Scan on public.async_p2 + Output: async_p2.a, async_p2.b, ('AAA'::text || async_p2.c) + Remote SQL: SELECT a, b, c FROM public.base_tbl2 WHERE ((b < 10)) +(11 rows) + +INSERT INTO result_tbl +(SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10) +UNION +(SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10); +SELECT * FROM result_tbl ORDER BY a; + a | b | c +------+----+--------- + 1000 | 0 | AAA0000 + 1005 | 5 | AAA0005 + 1010 | 10 | AAA0010 + 1015 | 15 | AAA0015 + 1020 | 20 | AAA0020 + 1025 | 25 | AAA0025 + 1030 | 30 | AAA0030 + 1035 | 35 | AAA0035 + 1040 | 40 | AAA0040 + 1045 | 45 | AAA0045 + 2000 | 0 | AAA0000 + 2005 | 5 | AAA0005 +(12 rows) + +DELETE FROM result_tbl; +EXPLAIN (VERBOSE, COSTS OFF) +INSERT INTO result_tbl +(SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10) +UNION ALL +(SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10); + QUERY PLAN +----------------------------------------------------------------------------------------------------------- + Insert on public.result_tbl + -> Append + -> Async Foreign Scan on public.async_p1 + Output: async_p1.a, async_p1.b, ('AAA'::text || async_p1.c) + Remote SQL: SELECT a, b, c FROM public.base_tbl1 ORDER BY a ASC NULLS LAST LIMIT 10::bigint + -> Async Foreign Scan on public.async_p2 + Output: async_p2.a, async_p2.b, ('AAA'::text || async_p2.c) + Remote SQL: SELECT a, b, c FROM public.base_tbl2 WHERE ((b < 10)) +(8 rows) + +INSERT INTO result_tbl +(SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10) +UNION ALL +(SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10); +SELECT * FROM result_tbl ORDER BY a; + a | b | c +------+----+--------- + 1000 | 0 | AAA0000 + 1005 | 5 | AAA0005 + 1010 | 10 | AAA0010 + 1015 | 15 | AAA0015 + 1020 | 20 | AAA0020 + 1025 | 25 | AAA0025 + 1030 | 30 | AAA0030 + 1035 | 35 | AAA0035 + 1040 | 40 | AAA0040 + 1045 | 45 | AAA0045 + 2000 | 0 | AAA0000 + 2005 | 5 | AAA0005 +(12 rows) + +DELETE FROM result_tbl; -- Test that pending requests are processed properly SET enable_mergejoin TO false; SET enable_hashjoin TO false; diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index 6b5de89e14..ea35e61eb8 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -3245,6 +3245,13 @@ INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505; SELECT * FROM result_tbl ORDER BY a; DELETE FROM result_tbl; +EXPLAIN (VERBOSE, COSTS OFF) +INSERT INTO result_tbl SELECT a, b, 'AAA' || c FROM async_pt WHERE b === 505; +INSERT INTO result_tbl SELECT a, b, 'AAA' || c FROM async_pt WHERE b === 505; + +SELECT * FROM result_tbl ORDER BY a; +DELETE FROM result_tbl; + -- Check case where multiple partitions use the same connection CREATE TABLE base_tbl3 (a int, b int, c text); CREATE FOREIGN TABLE async_p3 PARTITION OF async_pt FOR VALUES FROM (3000) TO (4000) @@ -3286,6 +3293,13 @@ INSERT INTO join_tbl SELECT * FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AN SELECT * FROM join_tbl ORDER BY a1; DELETE FROM join_tbl; +EXPLAIN (VERBOSE, COSTS OFF) +INSERT INTO join_tbl SELECT t1.a, t1.b, 'AAA' || t1.c, t2.a, t2.b, 'AAA' || t2.c FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0; +INSERT INTO join_tbl SELECT t1.a, t1.b, 'AAA' || t1.c, t2.a, t2.b, 'AAA' || t2.c FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0; + +SELECT * FROM join_tbl ORDER BY a1; +DELETE FROM join_tbl; + RESET enable_partitionwise_join; -- Test rescan of an async Append node with do_exec_prune=false @@ -3357,6 +3371,33 @@ DROP INDEX base_tbl1_idx; DROP INDEX base_tbl2_idx; DROP INDEX async_p3_idx; +-- UNION queries +EXPLAIN (VERBOSE, COSTS OFF) +INSERT INTO result_tbl +(SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10) +UNION +(SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10); +INSERT INTO result_tbl +(SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10) +UNION +(SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10); + +SELECT * FROM result_tbl ORDER BY a; +DELETE FROM result_tbl; + +EXPLAIN (VERBOSE, COSTS OFF) +INSERT INTO result_tbl +(SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10) +UNION ALL +(SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10); +INSERT INTO result_tbl +(SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10) +UNION ALL +(SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10); + +SELECT * FROM result_tbl ORDER BY a; +DELETE FROM result_tbl; + -- Test that pending requests are processed properly SET enable_mergejoin TO false; SET enable_hashjoin TO false; diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index d5760b1006..46a1943d97 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -632,6 +632,7 @@ _copySubqueryScan(const SubqueryScan *from) * copy remainder of node */ COPY_NODE_FIELD(subplan); + COPY_SCALAR_FIELD(scanstatus); return newnode; } diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index abb1f787ef..13e1643530 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -638,6 +638,7 @@ _outSubqueryScan(StringInfo str, const SubqueryScan *node) _outScanInfo(str, (const Scan *) node); WRITE_NODE_FIELD(subplan); + WRITE_ENUM_FIELD(scanstatus, SubqueryScanStatus); } static void diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index e7d008b2c5..48f7216c9e 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -2194,6 +2194,7 @@ _readSubqueryScan(void) ReadCommonScan(&local_node->scan); READ_NODE_FIELD(subplan); + READ_ENUM_FIELD(scanstatus, SubqueryScanStatus); READ_DONE(); } diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index 179c87c671..51591bb812 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -82,7 +82,7 @@ static List *get_gating_quals(PlannerInfo *root, List *quals); static Plan *create_gating_plan(PlannerInfo *root, Path *path, Plan *plan, List *gating_quals); static Plan *create_join_plan(PlannerInfo *root, JoinPath *best_path); -static bool is_async_capable_path(Path *path); +static bool mark_async_capable_plan(Plan *plan, Path *path); static Plan *create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags); static Plan *create_merge_append_plan(PlannerInfo *root, MergeAppendPath *best_path, @@ -1110,14 +1110,30 @@ create_join_plan(PlannerInfo *root, JoinPath *best_path) } /* - * is_async_capable_path - * Check whether a given Path node is async-capable. + * mark_async_capable_plan + * Check whether a given Path node is async-capable, and if so, mark the + * Plan node created from it as such and return true, otherwise return + * false. */ static bool -is_async_capable_path(Path *path) +mark_async_capable_plan(Plan *plan, Path *path) { switch (nodeTag(path)) { + case T_SubqueryScanPath: + { + SubqueryScan *scan_plan = (SubqueryScan *) plan; + + /* + * If a SubqueryScan node atop of an async-capable plan node + * is deletable, consider it as async-capable. + */ + if (trivial_subqueryscan(scan_plan) && + mark_async_capable_plan(scan_plan->subplan, + ((SubqueryScanPath *) path)->subpath)) + break; + return false; + } case T_ForeignPath: { FdwRoutine *fdwroutine = path->parent->fdwroutine; @@ -1125,13 +1141,27 @@ is_async_capable_path(Path *path) Assert(fdwroutine != NULL); if (fdwroutine->IsForeignPathAsyncCapable != NULL && fdwroutine->IsForeignPathAsyncCapable((ForeignPath *) path)) - return true; + break; + return false; } - break; + case T_ProjectionPath: + + /* + * If the generated plan node doesn't include a Result node, + * consider it as async-capable if the subpath is async-capable. + */ + if (!IsA(plan, Result) && + mark_async_capable_plan(plan, + ((ProjectionPath *) path)->subpath)) + return true; + return false; default: - break; + return false; } - return false; + + plan->async_capable = true; + + return true; } /* @@ -1294,14 +1324,14 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags) } } - subplans = lappend(subplans, subplan); - - /* Check to see if subplan can be executed asynchronously */ - if (consider_async && is_async_capable_path(subpath)) + /* If needed, check to see if subplan can be executed asynchronously */ + if (consider_async && mark_async_capable_plan(subplan, subpath)) { - subplan->async_capable = true; + Assert(subplan->async_capable); ++nasyncplans; } + + subplans = lappend(subplans, subplan); } /* @@ -5598,6 +5628,7 @@ make_subqueryscan(List *qptlist, plan->righttree = NULL; node->scan.scanrelid = scanrelid; node->subplan = subplan; + node->scanstatus = SUBQUERY_SCAN_UNKNOWN; return node; } diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index bf4c722c02..7519723081 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -115,7 +115,6 @@ static Plan *set_indexonlyscan_references(PlannerInfo *root, static Plan *set_subqueryscan_references(PlannerInfo *root, SubqueryScan *plan, int rtoffset); -static bool trivial_subqueryscan(SubqueryScan *plan); static Plan *clean_up_removed_plan_level(Plan *parent, Plan *child); static void set_foreignscan_references(PlannerInfo *root, ForeignScan *fscan, @@ -1319,14 +1318,26 @@ set_subqueryscan_references(PlannerInfo *root, * * We can delete it if it has no qual to check and the targetlist just * regurgitates the output of the child plan. + * + * This might be called repeatedly on a SubqueryScan node, so we cache the + * result in the SubqueryScan node to avoid repeated computation. */ -static bool +bool trivial_subqueryscan(SubqueryScan *plan) { int attrno; ListCell *lp, *lc; + /* We might have detected this already (see mark_async_capable_plan) */ + if (plan->scanstatus == SUBQUERY_SCAN_TRIVIAL) + return true; + if (plan->scanstatus == SUBQUERY_SCAN_NONTRIVIAL) + return false; + Assert(plan->scanstatus == SUBQUERY_SCAN_UNKNOWN); + /* Initially, mark the SubqueryScan as non-deletable from the plan tree */ + plan->scanstatus = SUBQUERY_SCAN_NONTRIVIAL; + if (plan->scan.plan.qual != NIL) return false; @@ -1368,6 +1379,9 @@ trivial_subqueryscan(SubqueryScan *plan) attrno++; } + /* Re-mark the SubqueryScan as deletable from the plan tree */ + plan->scanstatus = SUBQUERY_SCAN_TRIVIAL; + return true; } diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h index 50ef3dda05..10dd35f011 100644 --- a/src/include/nodes/plannodes.h +++ b/src/include/nodes/plannodes.h @@ -536,16 +536,28 @@ typedef struct TidRangeScan * relation, we make this a descendant of Scan anyway for code-sharing * purposes. * + * SubqueryScanStatus caches the trivial_subqueryscan property of the node. + * SUBQUERY_SCAN_UNKNOWN means not yet determined. This is only used during + * planning. + * * Note: we store the sub-plan in the type-specific subplan field, not in * the generic lefttree field as you might expect. This is because we do * not want plan-tree-traversal routines to recurse into the subplan without * knowing that they are changing Query contexts. * ---------------- */ +typedef enum SubqueryScanStatus +{ + SUBQUERY_SCAN_UNKNOWN, + SUBQUERY_SCAN_TRIVIAL, + SUBQUERY_SCAN_NONTRIVIAL +} SubqueryScanStatus; + typedef struct SubqueryScan { Scan scan; Plan *subplan; + SubqueryScanStatus scanstatus; } SubqueryScan; /* ---------------- diff --git a/src/include/optimizer/planmain.h b/src/include/optimizer/planmain.h index 54a0d4c188..6947bc65d1 100644 --- a/src/include/optimizer/planmain.h +++ b/src/include/optimizer/planmain.h @@ -112,6 +112,7 @@ extern bool innerrel_is_unique(PlannerInfo *root, * prototypes for plan/setrefs.c */ extern Plan *set_plan_references(PlannerInfo *root, Plan *plan); +extern bool trivial_subqueryscan(SubqueryScan *plan); extern void record_plan_function_dependency(PlannerInfo *root, Oid funcid); extern void record_plan_type_dependency(PlannerInfo *root, Oid typid); extern bool extract_query_dependencies_walker(Node *node, PlannerInfo *root); From b604a1c204fce2600730cb60aa78e04e949fa588 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 6 Apr 2022 09:09:14 +0200 Subject: [PATCH 388/772] Change one AssertMacro to Assert What surrounds it is no longer a macro (e27f4ee0a701). --- src/include/access/htup_details.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h index 3d452d50a1..51a60eda08 100644 --- a/src/include/access/htup_details.h +++ b/src/include/access/htup_details.h @@ -749,7 +749,7 @@ extern MinimalTuple minimal_expand_tuple(HeapTuple sourceTuple, TupleDesc tupleD static inline Datum fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull) { - AssertMacro(attnum > 0); + Assert(attnum > 0); *isnull = false; if (HeapTupleNoNulls(tup)) From 01effb130420ba06b3fb441274415bd07c8a87b0 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 6 Apr 2022 09:15:05 +0200 Subject: [PATCH 389/772] Fix unsigned output format in SLRU error reporting Avoid printing signed values as unsigned. (No impact in practice expected.) Author: Pavel Borisov Discussion: https://www.postgresql.org/message-id/flat/CALT9ZEHN7hWJo6MgJKqoDMGj%3DGOzQU50wTvOYZXDj7x%3DsUK-kw%40mail.gmail.com --- src/backend/access/transam/slru.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/access/transam/slru.c b/src/backend/access/transam/slru.c index 30a476ed5d..d34732cb41 100644 --- a/src/backend/access/transam/slru.c +++ b/src/backend/access/transam/slru.c @@ -949,7 +949,7 @@ SlruReportIOError(SlruCtl ctl, int pageno, TransactionId xid) ereport(ERROR, (errcode_for_file_access(), errmsg("could not access status of transaction %u", xid), - errdetail("Could not seek in file \"%s\" to offset %u: %m.", + errdetail("Could not seek in file \"%s\" to offset %d: %m.", path, offset))); break; case SLRU_READ_FAILED: @@ -957,24 +957,24 @@ SlruReportIOError(SlruCtl ctl, int pageno, TransactionId xid) ereport(ERROR, (errcode_for_file_access(), errmsg("could not access status of transaction %u", xid), - errdetail("Could not read from file \"%s\" at offset %u: %m.", + errdetail("Could not read from file \"%s\" at offset %d: %m.", path, offset))); else ereport(ERROR, (errmsg("could not access status of transaction %u", xid), - errdetail("Could not read from file \"%s\" at offset %u: read too few bytes.", path, offset))); + errdetail("Could not read from file \"%s\" at offset %d: read too few bytes.", path, offset))); break; case SLRU_WRITE_FAILED: if (errno) ereport(ERROR, (errcode_for_file_access(), errmsg("could not access status of transaction %u", xid), - errdetail("Could not write to file \"%s\" at offset %u: %m.", + errdetail("Could not write to file \"%s\" at offset %d: %m.", path, offset))); else ereport(ERROR, (errmsg("could not access status of transaction %u", xid), - errdetail("Could not write to file \"%s\" at offset %u: wrote too few bytes.", + errdetail("Could not write to file \"%s\" at offset %d: wrote too few bytes.", path, offset))); break; case SLRU_FSYNC_FAILED: From 2ef6f11b0c77ec323c688ddfd98ffabddb72c11d Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Wed, 6 Apr 2022 10:25:45 -0400 Subject: [PATCH 390/772] Reduce running time of jsonb_sqljson test The test created a 1m row table in order to test parallel operation of JSON_VALUE. However, this was more than were needed for the test, so save time by halving it, and also by making the table unlogged. Experimentation shows that this size is only a little above the number required to generate the expected output. Per gripe from Andres Freund Discussion: https://postgr.es/m/20220406022118.3ocqvhxr6kciw5am@alap3.anarazel.de --- src/test/regress/expected/jsonb_sqljson.out | 8 ++++---- src/test/regress/sql/jsonb_sqljson.sql | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/regress/expected/jsonb_sqljson.out b/src/test/regress/expected/jsonb_sqljson.out index ae77af7ae2..230cfd3bfd 100644 --- a/src/test/regress/expected/jsonb_sqljson.out +++ b/src/test/regress/expected/jsonb_sqljson.out @@ -2088,9 +2088,9 @@ ERROR: only string constants supported in JSON_TABLE path specification LINE 1: SELECT * FROM JSON_TABLE(jsonb '{"a": 123}', '$' || '.' || '... ^ -- Test parallel JSON_VALUE() -CREATE TABLE test_parallel_jsonb_value AS +CREATE UNLOGGED TABLE test_parallel_jsonb_value AS SELECT i::text::jsonb AS js -FROM generate_series(1, 1000000) i; +FROM generate_series(1, 500000) i; -- Should be non-parallel due to subtransactions EXPLAIN (COSTS OFF) SELECT sum(JSON_VALUE(js, '$' RETURNING numeric)) FROM test_parallel_jsonb_value; @@ -2103,7 +2103,7 @@ SELECT sum(JSON_VALUE(js, '$' RETURNING numeric)) FROM test_parallel_jsonb_value SELECT sum(JSON_VALUE(js, '$' RETURNING numeric)) FROM test_parallel_jsonb_value; sum -------------- - 500000500000 + 125000250000 (1 row) -- Should be parallel @@ -2121,6 +2121,6 @@ SELECT sum(JSON_VALUE(js, '$' RETURNING numeric ERROR ON ERROR)) FROM test_paral SELECT sum(JSON_VALUE(js, '$' RETURNING numeric ERROR ON ERROR)) FROM test_parallel_jsonb_value; sum -------------- - 500000500000 + 125000250000 (1 row) diff --git a/src/test/regress/sql/jsonb_sqljson.sql b/src/test/regress/sql/jsonb_sqljson.sql index 90c5975488..866c708a4d 100644 --- a/src/test/regress/sql/jsonb_sqljson.sql +++ b/src/test/regress/sql/jsonb_sqljson.sql @@ -948,9 +948,9 @@ SELECT JSON_QUERY(jsonb '{"a": 123}', 'error' || ' ' || 'error'); SELECT * FROM JSON_TABLE(jsonb '{"a": 123}', '$' || '.' || 'a' COLUMNS (foo int)); -- Test parallel JSON_VALUE() -CREATE TABLE test_parallel_jsonb_value AS +CREATE UNLOGGED TABLE test_parallel_jsonb_value AS SELECT i::text::jsonb AS js -FROM generate_series(1, 1000000) i; +FROM generate_series(1, 500000) i; -- Should be non-parallel due to subtransactions EXPLAIN (COSTS OFF) From a0ffa885e478f5eeacc4e250e35ce25a4740c487 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 6 Apr 2022 13:24:33 -0400 Subject: [PATCH 391/772] Allow granting SET and ALTER SYSTEM privileges on GUC parameters. This patch allows "PGC_SUSET" parameters to be set by non-superusers if they have been explicitly granted the privilege to do so. The privilege to perform ALTER SYSTEM SET/RESET on a specific parameter can also be granted. Such privileges are cluster-wide, not per database. They are tracked in a new shared catalog, pg_parameter_acl. Granting and revoking these new privileges works as one would expect. One caveat is that PGC_USERSET GUCs are unaffected by the SET privilege --- one could wish that those were handled by a revocable grant to PUBLIC, but they are not, because we couldn't make it robust enough for GUCs defined by extensions. Mark Dilger, reviewed at various times by Andrew Dunstan, Robert Haas, Joshua Brindle, and myself Discussion: https://postgr.es/m/3D691E20-C1D5-4B80-8BA5-6BEB63AF3029@enterprisedb.com --- doc/src/sgml/catalogs.sgml | 77 ++- doc/src/sgml/config.sgml | 150 +++-- doc/src/sgml/ddl.sgml | 44 +- doc/src/sgml/func.sgml | 24 +- doc/src/sgml/ref/alter_system.sgml | 3 +- doc/src/sgml/ref/drop_owned.sgml | 4 +- doc/src/sgml/ref/grant.sgml | 17 +- doc/src/sgml/ref/pg_dumpall.sgml | 3 +- doc/src/sgml/ref/revoke.sgml | 7 + doc/src/sgml/ref/set.sgml | 6 +- src/backend/catalog/Makefile | 4 +- src/backend/catalog/aclchk.c | 357 +++++++++++- src/backend/catalog/catalog.c | 36 +- src/backend/catalog/dependency.c | 6 + src/backend/catalog/objectaddress.c | 71 +++ src/backend/catalog/pg_parameter_acl.c | 118 ++++ src/backend/commands/alter.c | 1 + src/backend/commands/event_trigger.c | 5 + src/backend/commands/seclabel.c | 1 + src/backend/commands/tablecmds.c | 1 + src/backend/parser/gram.y | 46 +- src/backend/utils/adt/acl.c | 114 ++++ src/backend/utils/cache/syscache.c | 23 + src/backend/utils/misc/guc.c | 146 ++++- src/bin/pg_dump/dumputils.c | 7 +- src/bin/pg_dump/pg_dumpall.c | 65 +++ src/bin/psql/tab-complete.c | 78 ++- src/include/catalog/catversion.h | 2 +- src/include/catalog/dependency.h | 1 + src/include/catalog/objectaccess.h | 2 +- src/include/catalog/pg_parameter_acl.h | 62 +++ src/include/catalog/pg_proc.dat | 16 + src/include/nodes/parsenodes.h | 5 +- src/include/parser/kwlist.h | 1 + src/include/utils/acl.h | 11 +- src/include/utils/guc.h | 2 + src/include/utils/syscache.h | 2 + .../expected/test_oat_hooks.out | 215 ++++--- .../test_oat_hooks/sql/test_oat_hooks.sql | 49 +- .../modules/test_oat_hooks/test_oat_hooks.c | 80 ++- src/test/modules/test_pg_dump/t/001_base.pl | 32 ++ src/test/modules/unsafe_tests/Makefile | 2 +- .../unsafe_tests/expected/guc_privs.out | 526 ++++++++++++++++++ .../modules/unsafe_tests/sql/guc_privs.sql | 237 ++++++++ 44 files changed, 2465 insertions(+), 194 deletions(-) create mode 100644 src/backend/catalog/pg_parameter_acl.c create mode 100644 src/include/catalog/pg_parameter_acl.h create mode 100644 src/test/modules/unsafe_tests/expected/guc_privs.out create mode 100644 src/test/modules/unsafe_tests/sql/guc_privs.sql diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 7f4f79d1b5..298de74af4 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -220,6 +220,11 @@ access method operator families
+ + pg_parameter_acl + configuration parameters for which privileges have been granted + + pg_partitioned_table information about partition key of tables @@ -5450,6 +5455,74 @@ SCRAM-SHA-256$<iteration count>:&l + + <structname>pg_parameter_acl</structname> + + + pg_parameter_acl + + + + The catalog pg_parameter_acl records configuration + parameters for which privileges have been granted to one or more roles. + No entry is made for parameters that have default privileges. + + + + Unlike most system catalogs, pg_parameter_acl + is shared across all databases of a cluster: there is only one + copy of pg_parameter_acl per cluster, not + one per database. + + + + <structname>pg_parameter_acl</structname> Columns + + + + + Column Type + + + Description + + + + + + + + oid oid + + + Row identifier + + + + + + parname text + + + The name of a configuration parameter for which privileges are granted + + + + + + paracl aclitem[] + + + Access privileges; see for details + + + + + +
+
+ + <structname>pg_partitioned_table</structname> @@ -12747,7 +12820,8 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx postgresql.conf without restarting the server. They can also be set for a particular session in the connection request packet (for example, via libpq's PGOPTIONS - environment variable), but only if the connecting user is a superuser. + environment variable), but only if the connecting user is a superuser + or has been granted the appropriate SET privilege. However, these settings never change in a session after it is started. If you change them in postgresql.conf, send a SIGHUP signal to the postmaster to cause it to @@ -12781,6 +12855,7 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx These settings can be set from postgresql.conf, or within a session via the SET command; but only superusers + and users with the appropriate SET privilege can change them via SET. Changes in postgresql.conf will affect existing sessions only if no session-local value has been established with SET. diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 43e4ade83e..ea312224bf 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -274,6 +274,9 @@ shared_buffers = 128MB The SET command allows modification of the current value of those parameters that can be set locally to a session; it has no effect on other sessions. + Many parameters can be set this way by any user, but some can + only be set by superusers and users who have been + granted SET privilege on that parameter. The corresponding SQL function is set_config(setting_name, new_value, is_local) (see ). @@ -1976,7 +1979,8 @@ include_dir 'conf.d' The default setting is two megabytes (2MB), which is conservatively small and unlikely to risk crashes. However, it might be too small to allow execution of complex functions. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -2089,7 +2093,8 @@ include_dir 'conf.d' this limit will be canceled. If this value is specified without units, it is taken as kilobytes. -1 (the default) means no limit. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. This setting constrains the total space used at any instant by all @@ -3166,7 +3171,8 @@ include_dir 'conf.d' zstd (if PostgreSQL was compiled with ). The default value is off. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -3341,7 +3347,8 @@ include_dir 'conf.d' performed if fsync is disabled. If this value is specified without units, it is taken as microseconds. The default commit_delay is zero (no delay). - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. In PostgreSQL releases prior to 9.3, @@ -6462,7 +6469,8 @@ local0.* /var/log/postgresql to the log. The default is WARNING. Note that LOG has a different rank here than in . - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -6492,7 +6500,8 @@ local0.* /var/log/postgresql causing errors, log messages, fatal errors, or panics will be logged. To effectively turn off logging of failing statements, set this parameter to PANIC. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -6514,7 +6523,9 @@ local0.* /var/log/postgresql If this value is specified without units, it is taken as milliseconds. Setting this to zero prints all statement durations. -1 (the default) disables logging statement - durations. Only superusers can change this setting. + durations. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -6566,7 +6577,9 @@ local0.* /var/log/postgresql If this value is specified without units, it is taken as milliseconds. Setting this to zero samples all statement durations. -1 (the default) disables sampling statement - durations. Only superusers can change this setting. + durations. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -6603,7 +6616,8 @@ local0.* /var/log/postgresql the same as setting log_min_duration_sample to -1. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -6627,7 +6641,8 @@ local0.* /var/log/postgresql The default is 0, meaning not to log statements from any additional transactions. Setting this to 1 logs all statements of all transactions. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -6892,7 +6907,8 @@ local0.* /var/log/postgresql Causes each attempted connection to the server to be logged, as well as successful completion of both client authentication (if necessary) and authorization. - Only superusers can change this parameter at session start, + Only superusers and users with the appropriate SET + privilege can change this parameter at session start, and it cannot be changed at all within a session. The default is off. @@ -6919,7 +6935,8 @@ local0.* /var/log/postgresql Causes session terminations to be logged. The log output provides information similar to log_connections, plus the duration of the session. - Only superusers can change this parameter at session start, + Only superusers and users with the appropriate SET + privilege can change this parameter at session start, and it cannot be changed at all within a session. The default is off. @@ -6937,7 +6954,8 @@ local0.* /var/log/postgresql Causes the duration of every completed statement to be logged. The default is off. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -6978,7 +6996,8 @@ local0.* /var/log/postgresql VERBOSE output includes the SQLSTATE error code (see also ) and the source code file name, function name, and line number that generated the error. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -7233,7 +7252,8 @@ log_line_prefix = '%m [%p] %q%u@%d/%a ' longer than to acquire a lock. This is useful in determining if lock waits are causing poor performance. The default is off. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -7274,7 +7294,8 @@ log_line_prefix = '%m [%p] %q%u@%d/%a ' -1 (the default) allows bind parameters to be logged in full. If this value is specified without units, it is taken as bytes. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -7341,8 +7362,9 @@ log_line_prefix = '%m [%p] %q%u@%d/%a ' - The default is none. Only superusers can change this - setting. + The default is none. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -7371,7 +7393,8 @@ log_line_prefix = '%m [%p] %q%u@%d/%a ' Causes each replication command to be logged in the server log. See for more information about replication command. The default value is off. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -7394,7 +7417,8 @@ log_line_prefix = '%m [%p] %q%u@%d/%a ' the specified amount of data. If this value is specified without units, it is taken as kilobytes. The default setting is -1, which disables such logging. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -7784,7 +7808,8 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; This setting defaults to on on most platforms, but it defaults to off on Windows due to that platform's larger overhead for updating the process title. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -7823,7 +7848,8 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; visible to all users, only to superusers and the user owning the session being reported on, so it should not represent a security risk. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -7857,7 +7883,8 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; Enables collection of statistics on database activity. This parameter is on by default, because the autovacuum daemon needs the collected information. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -7882,9 +7909,10 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; is used, in the output of when the VERBOSE option is used, by autovacuum for auto-vacuums and auto-analyzes, when is set and by - . Only superusers can - change this setting. + linkend="guc-log-autovacuum-min-duration"/> is set and by + . + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -7904,8 +7932,9 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; measure the overhead of timing on your system. I/O timing information is displayed in - pg_stat_wal. Only superusers can - change this setting. + pg_stat_wal. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -7922,7 +7951,9 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; pl to track only procedural-language functions, all to also track SQL and C language functions. The default is none, which disables function - statistics tracking. Only superusers can change this setting. + statistics tracking. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -8028,7 +8059,9 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; statement statistics, while the others report per-module statistics. log_statement_stats cannot be enabled together with any of the per-module options. All of these options are disabled by - default. Only superusers can change these settings. + default. + Only superusers and users with the appropriate SET + privilege can change these settings. @@ -8814,10 +8847,13 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; Controls firing of replication-related triggers and rules for the - current session. Setting this variable requires - superuser privilege and results in discarding any previously cached - query plans. Possible values are origin (the default), + current session. + Possible values are origin (the default), replica and local. + Setting this parameter results in discarding any previously cached + query plans. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -9432,10 +9468,8 @@ SET XML OPTION { DOCUMENT | CONTENT }; - Only superusers can change this setting, because it affects the - messages sent to the server log as well as to the client, and - an improper value might obscure the readability of the server - logs. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -9630,7 +9664,8 @@ SET XML OPTION { DOCUMENT | CONTENT }; The parameter value only takes effect at the start of the connection. Subsequent changes have no effect. If a specified library is not found, the connection attempt will fail. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -9780,7 +9815,8 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' - This parameter can be changed at run time by superusers, but a + This parameter can be changed at run time by superusers and users + with the appropriate SET privilege, but a setting done that way will only persist until the end of the client connection, so this method should be reserved for development purposes. The recommended way to set this parameter @@ -9844,8 +9880,9 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' practice. On a heavily loaded server you might want to raise it. Ideally the setting should exceed your typical transaction time, so as to improve the odds that a lock will be released before - the waiter decides to check for deadlock. Only superusers can change - this setting. + the waiter decides to check for deadlock. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -10064,7 +10101,8 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' and writable by all users. Setting this variable to on disables the new privilege checks, for compatibility with prior releases. The default is off. - Only superusers can change this setting. + Only superusers and users with the appropriate SET + privilege can change this setting. Setting this variable does not disable all security checks related to @@ -10717,7 +10755,9 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' is intended to allow testing replication scenarios where primary and standby servers are running on the same machine. Such directories are likely to confuse backup tools that expect to find only symbolic - links in that location. Only superusers can change this setting. + links in that location. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -10734,7 +10774,9 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' certain other risky actions on system tables. This is otherwise not allowed even for superusers. Ill-advised use of this setting can cause irretrievable data loss or seriously corrupt the database - system. Only superusers can change this setting. + system. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -10760,7 +10802,8 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' - This parameter can only be set by superusers. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -11145,8 +11188,9 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1) the supported resource managers are heap, heap2, btree, hash, gin, gist, sequence, - spgist, brin, and generic. Only - superusers can change this setting. + spgist, brin, and generic. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -11187,7 +11231,9 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1) you to get past the error and retrieve undamaged tuples that might still be present in the table if the block header is still sane. If the header is corrupt an error will be reported even if this option is enabled. The - default setting is off, and it can only be changed by a superuser. + default setting is off. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -11213,8 +11259,9 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1) data from the damaged pages of a table. Zeroed-out pages are not forced to disk so it is recommended to recreate the table or the index before turning this parameter off again. The - default setting is off, and it can only be changed - by a superuser. + default setting is off. + Only superusers and users with the appropriate SET + privilege can change this setting. @@ -11272,7 +11319,8 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1) file system, inside . This is only useful for working on the internals of the JIT implementation. The default setting is off. - This parameter can only be changed by a superuser. + Only superusers and users with the appropriate SET + privilege can change this setting. diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml index 166b7a352d..492a960247 100644 --- a/doc/src/sgml/ddl.sgml +++ b/doc/src/sgml/ddl.sgml @@ -1691,7 +1691,8 @@ ALTER TABLE products RENAME TO items; INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER, CREATE, CONNECT, TEMPORARY, - EXECUTE, and USAGE. + EXECUTE, USAGE, SET + and ALTER SYSTEM. The privileges applicable to a particular object vary depending on the object's type (table, function, etc). More detail about the meanings of these privileges appears below. @@ -1959,6 +1960,28 @@ REVOKE ALL ON accounts FROM PUBLIC; + + + SET + + + Allows a server configuration parameter to be set to a new value + within the current session. (While this privilege can be granted + on any parameter, it is meaningless except for parameters that would + normally require superuser privilege to set.) + + + + + + ALTER SYSTEM + + + Allows a server configuration parameter to be configured to a new + value using the command. + + + The privileges required by other commands are listed on the @@ -1976,7 +1999,8 @@ REVOKE ALL ON accounts FROM PUBLIC; foreign servers, large objects, schemas, - or tablespaces. + tablespaces, + or configuration parameters. For other types of objects, the default privileges granted to PUBLIC are as follows: CONNECT and TEMPORARY (create @@ -2097,6 +2121,16 @@ REVOKE ALL ON accounts FROM PUBLIC; TYPE
+ + SET + s + PARAMETER + + + ALTER SYSTEM + A + PARAMETER + @@ -2167,6 +2201,12 @@ REVOKE ALL ON accounts FROM PUBLIC; none \dl+ + + PARAMETER + sA + none + none + SCHEMA UC diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 4001cb2bda..bd772eeba1 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -22853,6 +22853,25 @@ SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute'); + + + + has_parameter_privilege + + has_parameter_privilege ( + user name or oid, + parameter text, + privilege text ) + boolean + + + Does user have privilege for configuration parameter? + The parameter name is case-insensitive. + Allowable privilege types are SET + and ALTER SYSTEM. + + + @@ -23137,6 +23156,7 @@ SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute'); 'l' for LANGUAGE, 'L' for LARGE OBJECT, 'n' for SCHEMA, + 'p' for PARAMETER, 't' for TABLESPACE, 'F' for FOREIGN DATA WRAPPER, 'S' for FOREIGN SERVER, @@ -23905,7 +23925,7 @@ SELECT currval(pg_get_serial_sequence('sometable', 'id')); - + @@ -27427,7 +27447,7 @@ SELECT pg_size_pretty(sum(pg_relation_size(relid))) AS total_size are excluded. - This function is restricted to superusers and roles with privileges of + This function is restricted to superusers and roles with privileges of the pg_monitor role by default, but other users can be granted EXECUTE to run the function. diff --git a/doc/src/sgml/ref/alter_system.sgml b/doc/src/sgml/ref/alter_system.sgml index 5e41f7f644..6f8bd39eaf 100644 --- a/doc/src/sgml/ref/alter_system.sgml +++ b/doc/src/sgml/ref/alter_system.sgml @@ -55,7 +55,8 @@ ALTER SYSTEM RESET ALL - Only superusers can use ALTER SYSTEM. Also, since + Only superusers and users granted ALTER SYSTEM privilege + on a parameter can change it using ALTER SYSTEM. Also, since this command acts directly on the file system and cannot be rolled back, it is not allowed inside a transaction block or function. diff --git a/doc/src/sgml/ref/drop_owned.sgml b/doc/src/sgml/ref/drop_owned.sgml index 8fa8c414a1..efda01a39e 100644 --- a/doc/src/sgml/ref/drop_owned.sgml +++ b/doc/src/sgml/ref/drop_owned.sgml @@ -32,8 +32,8 @@ DROP OWNED BY { name | CURRENT_ROLE DROP OWNED drops all the objects within the current database that are owned by one of the specified roles. Any privileges granted to the given roles on objects in the current - database or on shared objects (databases, tablespaces) will also be - revoked. + database or on shared objects (databases, tablespaces, configuration + parameters) will also be revoked.
diff --git a/doc/src/sgml/ref/grant.sgml b/doc/src/sgml/ref/grant.sgml index 8c4edd9b0a..f744b05b55 100644 --- a/doc/src/sgml/ref/grant.sgml +++ b/doc/src/sgml/ref/grant.sgml @@ -77,6 +77,11 @@ GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } TO role_specification [, ...] [ WITH GRANT OPTION ] [ GRANTED BY role_specification ] +GRANT { { SET | ALTER SYSTEM } [, ... ] | ALL [ PRIVILEGES ] } + ON PARAMETER configuration_parameter [, ...] + TO role_specification [, ...] [ WITH GRANT OPTION ] + [ GRANTED BY role_specification ] + GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA schema_name [, ...] TO role_specification [, ...] [ WITH GRANT OPTION ] @@ -111,9 +116,10 @@ GRANT role_name [, ...] TO The GRANT command has two basic variants: one - that grants privileges on a database object (table, column, view, foreign - table, sequence, database, foreign-data wrapper, foreign server, function, procedure, - procedural language, schema, or tablespace), and one that grants + that grants privileges on a database object (table, column, view, + foreign table, sequence, database, foreign-data wrapper, foreign server, + function, procedure, procedural language, large object, configuration + parameter, schema, tablespace, or type), and one that grants membership in a role. These variants are similar in many ways, but they are different enough to be described separately. @@ -185,6 +191,8 @@ GRANT role_name [, ...] TO TEMPORARY EXECUTE USAGE + SET + ALTER SYSTEM Specific types of privileges, as defined in . @@ -452,7 +460,8 @@ GRANT admins TO joe; - Privileges on databases, tablespaces, schemas, and languages are + Privileges on databases, tablespaces, schemas, languages, and + configuration parameters are PostgreSQL extensions. diff --git a/doc/src/sgml/ref/pg_dumpall.sgml b/doc/src/sgml/ref/pg_dumpall.sgml index c9aef776eb..8a081f0080 100644 --- a/doc/src/sgml/ref/pg_dumpall.sgml +++ b/doc/src/sgml/ref/pg_dumpall.sgml @@ -38,7 +38,8 @@ PostgreSQL documentation linkend="app-psql"/> to restore the databases. It does this by calling for each database in the cluster. pg_dumpall also dumps global objects - that are common to all databases, that is, database roles and tablespaces. + that are common to all databases, namely database roles, tablespaces, + and privilege grants for configuration parameters. (pg_dump does not save these objects.) diff --git a/doc/src/sgml/ref/revoke.sgml b/doc/src/sgml/ref/revoke.sgml index 3014c864ea..62f1971036 100644 --- a/doc/src/sgml/ref/revoke.sgml +++ b/doc/src/sgml/ref/revoke.sgml @@ -97,6 +97,13 @@ REVOKE [ GRANT OPTION FOR ] [ GRANTED BY role_specification ] [ CASCADE | RESTRICT ] +REVOKE [ GRANT OPTION FOR ] + { { SET | ALTER SYSTEM } [, ...] | ALL [ PRIVILEGES ] } + ON PARAMETER configuration_parameter [, ...] + FROM role_specification [, ...] + [ GRANTED BY role_specification ] + [ CASCADE | RESTRICT ] + REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA schema_name [, ...] diff --git a/doc/src/sgml/ref/set.sgml b/doc/src/sgml/ref/set.sgml index 339ee9eec9..ae508d026e 100644 --- a/doc/src/sgml/ref/set.sgml +++ b/doc/src/sgml/ref/set.sgml @@ -34,8 +34,10 @@ SET [ SESSION | LOCAL ] TIME ZONE { timezone can be changed on-the-fly with SET. - (But some require superuser privileges to change, and others cannot - be changed after server or session start.) + (Some parameters can only be changed by superusers and users who + have been granted SET privilege on that parameter. + There are also parameters that cannot be changed after server or + session start.) SET only affects the value used by the current session. diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile index 87d7386e01..89a0221ec9 100644 --- a/src/backend/catalog/Makefile +++ b/src/backend/catalog/Makefile @@ -38,6 +38,7 @@ OBJS = \ pg_largeobject.o \ pg_namespace.o \ pg_operator.o \ + pg_parameter_acl.o \ pg_proc.o \ pg_publication.o \ pg_range.o \ @@ -68,7 +69,8 @@ CATALOG_HEADERS := \ pg_foreign_data_wrapper.h pg_foreign_server.h pg_user_mapping.h \ pg_foreign_table.h pg_policy.h pg_replication_origin.h \ pg_default_acl.h pg_init_privs.h pg_seclabel.h pg_shseclabel.h \ - pg_collation.h pg_partitioned_table.h pg_range.h pg_transform.h \ + pg_collation.h pg_parameter_acl.h pg_partitioned_table.h \ + pg_range.h pg_transform.h \ pg_sequence.h pg_publication.h pg_publication_namespace.h \ pg_publication_rel.h pg_subscription.h pg_subscription_rel.h diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c index 1dd03a8e51..5f1726c095 100644 --- a/src/backend/catalog/aclchk.c +++ b/src/backend/catalog/aclchk.c @@ -48,6 +48,7 @@ #include "catalog/pg_opclass.h" #include "catalog/pg_operator.h" #include "catalog/pg_opfamily.h" +#include "catalog/pg_parameter_acl.h" #include "catalog/pg_proc.h" #include "catalog/pg_statistic_ext.h" #include "catalog/pg_subscription.h" @@ -112,11 +113,13 @@ static void ExecGrant_Largeobject(InternalGrant *grantStmt); static void ExecGrant_Namespace(InternalGrant *grantStmt); static void ExecGrant_Tablespace(InternalGrant *grantStmt); static void ExecGrant_Type(InternalGrant *grantStmt); +static void ExecGrant_Parameter(InternalGrant *grantStmt); static void SetDefaultACLsInSchemas(InternalDefaultACL *iacls, List *nspnames); static void SetDefaultACL(InternalDefaultACL *iacls); -static List *objectNamesToOids(ObjectType objtype, List *objnames); +static List *objectNamesToOids(ObjectType objtype, List *objnames, + bool is_grant); static List *objectsInSchemaToOids(ObjectType objtype, List *nspnames); static List *getRelationsInNamespace(Oid namespaceId, char relkind); static void expand_col_privileges(List *colnames, Oid table_oid, @@ -259,6 +262,9 @@ restrict_and_check_grant(bool is_grant, AclMode avail_goptions, bool all_privs, case OBJECT_TYPE: whole_mask = ACL_ALL_RIGHTS_TYPE; break; + case OBJECT_PARAMETER_ACL: + whole_mask = ACL_ALL_RIGHTS_PARAMETER_ACL; + break; default: elog(ERROR, "unrecognized object type: %d", objtype); /* not reached, but keep compiler quiet */ @@ -390,7 +396,8 @@ ExecuteGrantStmt(GrantStmt *stmt) switch (stmt->targtype) { case ACL_TARGET_OBJECT: - istmt.objects = objectNamesToOids(stmt->objtype, stmt->objects); + istmt.objects = objectNamesToOids(stmt->objtype, stmt->objects, + stmt->is_grant); break; case ACL_TARGET_ALL_IN_SCHEMA: istmt.objects = objectsInSchemaToOids(stmt->objtype, stmt->objects); @@ -498,6 +505,10 @@ ExecuteGrantStmt(GrantStmt *stmt) all_privileges = ACL_ALL_RIGHTS_FOREIGN_SERVER; errormsg = gettext_noop("invalid privilege type %s for foreign server"); break; + case OBJECT_PARAMETER_ACL: + all_privileges = ACL_ALL_RIGHTS_PARAMETER_ACL; + errormsg = gettext_noop("invalid privilege type %s for parameter"); + break; default: elog(ERROR, "unrecognized GrantStmt.objtype: %d", (int) stmt->objtype); @@ -600,6 +611,9 @@ ExecGrantStmt_oids(InternalGrant *istmt) case OBJECT_TABLESPACE: ExecGrant_Tablespace(istmt); break; + case OBJECT_PARAMETER_ACL: + ExecGrant_Parameter(istmt); + break; default: elog(ERROR, "unrecognized GrantStmt.objtype: %d", (int) istmt->objtype); @@ -626,7 +640,7 @@ ExecGrantStmt_oids(InternalGrant *istmt) * to fail. */ static List * -objectNamesToOids(ObjectType objtype, List *objnames) +objectNamesToOids(ObjectType objtype, List *objnames, bool is_grant) { List *objects = NIL; ListCell *cell; @@ -759,6 +773,37 @@ objectNamesToOids(ObjectType objtype, List *objnames) objects = lappend_oid(objects, srvid); } break; + case OBJECT_PARAMETER_ACL: + foreach(cell, objnames) + { + /* + * In this code we represent a GUC by the OID of its entry in + * pg_parameter_acl, which we have to manufacture here if it + * doesn't exist yet. (That's a hack for sure, but it avoids + * messing with all the GRANT/REVOKE infrastructure that + * expects to use OIDs for object identities.) However, if + * this is a REVOKE, we can instead just ignore any GUCs that + * don't have such an entry, as they must not have any + * privileges needing removal. + */ + char *parameter = strVal(lfirst(cell)); + Oid parameterId = ParameterAclLookup(parameter, true); + + if (!OidIsValid(parameterId) && is_grant) + { + parameterId = ParameterAclCreate(parameter); + + /* + * Prevent error when processing duplicate objects, and + * make this new entry visible so that ExecGrant_Parameter + * can update it. + */ + CommandCounterIncrement(); + } + if (OidIsValid(parameterId)) + objects = lappend_oid(objects, parameterId); + } + break; default: elog(ERROR, "unrecognized GrantStmt.objtype: %d", (int) objtype); @@ -1494,6 +1539,9 @@ RemoveRoleFromObjectACL(Oid roleid, Oid classid, Oid objid) case ForeignDataWrapperRelationId: istmt.objtype = OBJECT_FDW; break; + case ParameterAclRelationId: + istmt.objtype = OBJECT_PARAMETER_ACL; + break; default: elog(ERROR, "unexpected object class %u", classid); break; @@ -3225,6 +3273,154 @@ ExecGrant_Type(InternalGrant *istmt) table_close(relation, RowExclusiveLock); } +static void +ExecGrant_Parameter(InternalGrant *istmt) +{ + Relation relation; + ListCell *cell; + + if (istmt->all_privs && istmt->privileges == ACL_NO_RIGHTS) + istmt->privileges = ACL_ALL_RIGHTS_PARAMETER_ACL; + + relation = table_open(ParameterAclRelationId, RowExclusiveLock); + + foreach(cell, istmt->objects) + { + Oid parameterId = lfirst_oid(cell); + Datum nameDatum; + const char *parname; + Datum aclDatum; + bool isNull; + AclMode avail_goptions; + AclMode this_privileges; + Acl *old_acl; + Acl *new_acl; + Oid grantorId; + Oid ownerId; + HeapTuple tuple; + int noldmembers; + int nnewmembers; + Oid *oldmembers; + Oid *newmembers; + + tuple = SearchSysCache1(PARAMETERACLOID, ObjectIdGetDatum(parameterId)); + if (!HeapTupleIsValid(tuple)) + elog(ERROR, "cache lookup failed for parameter ACL %u", + parameterId); + + /* We'll need the GUC's name */ + nameDatum = SysCacheGetAttr(PARAMETERACLOID, tuple, + Anum_pg_parameter_acl_parname, + &isNull); + Assert(!isNull); + parname = TextDatumGetCString(nameDatum); + + /* Treat all parameters as belonging to the bootstrap superuser. */ + ownerId = BOOTSTRAP_SUPERUSERID; + + /* + * Get working copy of existing ACL. If there's no ACL, substitute the + * proper default. + */ + aclDatum = SysCacheGetAttr(PARAMETERACLOID, tuple, + Anum_pg_parameter_acl_paracl, + &isNull); + + if (isNull) + { + old_acl = acldefault(istmt->objtype, ownerId); + /* There are no old member roles according to the catalogs */ + noldmembers = 0; + oldmembers = NULL; + } + else + { + old_acl = DatumGetAclPCopy(aclDatum); + /* Get the roles mentioned in the existing ACL */ + noldmembers = aclmembers(old_acl, &oldmembers); + } + + /* Determine ID to do the grant as, and available grant options */ + select_best_grantor(GetUserId(), istmt->privileges, + old_acl, ownerId, + &grantorId, &avail_goptions); + + /* + * Restrict the privileges to what we can actually grant, and emit the + * standards-mandated warning and error messages. + */ + this_privileges = + restrict_and_check_grant(istmt->is_grant, avail_goptions, + istmt->all_privs, istmt->privileges, + parameterId, grantorId, + OBJECT_PARAMETER_ACL, + parname, + 0, NULL); + + /* + * Generate new ACL. + */ + new_acl = merge_acl_with_grant(old_acl, istmt->is_grant, + istmt->grant_option, istmt->behavior, + istmt->grantees, this_privileges, + grantorId, ownerId); + + /* + * We need the members of both old and new ACLs so we can correct the + * shared dependency information. + */ + nnewmembers = aclmembers(new_acl, &newmembers); + + /* + * If the new ACL is equal to the default, we don't need the catalog + * entry any longer. Delete it rather than updating it, to avoid + * leaving a degenerate entry. + */ + if (aclequal(new_acl, acldefault(istmt->objtype, ownerId))) + { + CatalogTupleDelete(relation, &tuple->t_self); + } + else + { + /* finished building new ACL value, now insert it */ + HeapTuple newtuple; + Datum values[Natts_pg_parameter_acl]; + bool nulls[Natts_pg_parameter_acl]; + bool replaces[Natts_pg_parameter_acl]; + + MemSet(values, 0, sizeof(values)); + MemSet(nulls, false, sizeof(nulls)); + MemSet(replaces, false, sizeof(replaces)); + + replaces[Anum_pg_parameter_acl_paracl - 1] = true; + values[Anum_pg_parameter_acl_paracl - 1] = PointerGetDatum(new_acl); + + newtuple = heap_modify_tuple(tuple, RelationGetDescr(relation), + values, nulls, replaces); + + CatalogTupleUpdate(relation, &newtuple->t_self, newtuple); + } + + /* Update initial privileges for extensions */ + recordExtensionInitPriv(parameterId, ParameterAclRelationId, 0, + new_acl); + + /* Update the shared dependency ACL info */ + updateAclDependencies(ParameterAclRelationId, parameterId, 0, + ownerId, + noldmembers, oldmembers, + nnewmembers, newmembers); + + ReleaseSysCache(tuple); + pfree(new_acl); + + /* prevent error when processing duplicate objects */ + CommandCounterIncrement(); + } + + table_close(relation, RowExclusiveLock); +} + static AclMode string_to_privilege(const char *privname) @@ -3255,6 +3451,10 @@ string_to_privilege(const char *privname) return ACL_CREATE_TEMP; if (strcmp(privname, "connect") == 0) return ACL_CONNECT; + if (strcmp(privname, "set") == 0) + return ACL_SET; + if (strcmp(privname, "alter system") == 0) + return ACL_ALTER_SYSTEM; if (strcmp(privname, "rule") == 0) return 0; /* ignore old RULE privileges */ ereport(ERROR, @@ -3292,6 +3492,10 @@ privilege_to_string(AclMode privilege) return "TEMP"; case ACL_CONNECT: return "CONNECT"; + case ACL_SET: + return "SET"; + case ACL_ALTER_SYSTEM: + return "ALTER SYSTEM"; default: elog(ERROR, "unrecognized privilege: %d", (int) privilege); } @@ -3376,6 +3580,9 @@ aclcheck_error(AclResult aclerr, ObjectType objtype, case OBJECT_OPFAMILY: msg = gettext_noop("permission denied for operator family %s"); break; + case OBJECT_PARAMETER_ACL: + msg = gettext_noop("permission denied for parameter %s"); + break; case OBJECT_POLICY: msg = gettext_noop("permission denied for policy %s"); break; @@ -3567,6 +3774,7 @@ aclcheck_error(AclResult aclerr, ObjectType objtype, case OBJECT_DEFAULT: case OBJECT_DEFACL: case OBJECT_DOMCONSTRAINT: + case OBJECT_PARAMETER_ACL: case OBJECT_PUBLICATION_NAMESPACE: case OBJECT_PUBLICATION_REL: case OBJECT_ROLE: @@ -3653,6 +3861,8 @@ pg_aclmask(ObjectType objtype, Oid table_oid, AttrNumber attnum, Oid roleid, case OBJECT_LARGEOBJECT: return pg_largeobject_aclmask_snapshot(table_oid, roleid, mask, how, NULL); + case OBJECT_PARAMETER_ACL: + return pg_parameter_acl_aclmask(table_oid, roleid, mask, how); case OBJECT_SCHEMA: return pg_namespace_aclmask(table_oid, roleid, mask, how); case OBJECT_STATISTIC_EXT: @@ -4000,6 +4210,121 @@ pg_database_aclmask(Oid db_oid, Oid roleid, return result; } +/* + * Exported routine for examining a user's privileges for a configuration + * parameter (GUC), identified by GUC name. + */ +AclMode +pg_parameter_aclmask(const char *name, Oid roleid, AclMode mask, AclMaskHow how) +{ + AclMode result; + char *parname; + text *partext; + HeapTuple tuple; + + /* Superusers bypass all permission checking. */ + if (superuser_arg(roleid)) + return mask; + + /* Convert name to the form it should have in pg_parameter_acl... */ + parname = convert_GUC_name_for_parameter_acl(name); + partext = cstring_to_text(parname); + + /* ... and look it up */ + tuple = SearchSysCache1(PARAMETERACLNAME, PointerGetDatum(partext)); + + if (!HeapTupleIsValid(tuple)) + { + /* If no entry, GUC has no permissions for non-superusers */ + result = ACL_NO_RIGHTS; + } + else + { + Datum aclDatum; + bool isNull; + Acl *acl; + + aclDatum = SysCacheGetAttr(PARAMETERACLNAME, tuple, + Anum_pg_parameter_acl_paracl, + &isNull); + if (isNull) + { + /* No ACL, so build default ACL */ + acl = acldefault(OBJECT_PARAMETER_ACL, BOOTSTRAP_SUPERUSERID); + aclDatum = (Datum) 0; + } + else + { + /* detoast ACL if necessary */ + acl = DatumGetAclP(aclDatum); + } + + result = aclmask(acl, roleid, BOOTSTRAP_SUPERUSERID, mask, how); + + /* if we have a detoasted copy, free it */ + if (acl && (Pointer) acl != DatumGetPointer(aclDatum)) + pfree(acl); + + ReleaseSysCache(tuple); + } + + pfree(parname); + pfree(partext); + + return result; +} + +/* + * Exported routine for examining a user's privileges for a configuration + * parameter (GUC), identified by the OID of its pg_parameter_acl entry. + */ +AclMode +pg_parameter_acl_aclmask(Oid acl_oid, Oid roleid, AclMode mask, AclMaskHow how) +{ + AclMode result; + HeapTuple tuple; + Datum aclDatum; + bool isNull; + Acl *acl; + + /* Superusers bypass all permission checking. */ + if (superuser_arg(roleid)) + return mask; + + /* Get the ACL from pg_parameter_acl */ + tuple = SearchSysCache1(PARAMETERACLOID, ObjectIdGetDatum(acl_oid)); + if (!HeapTupleIsValid(tuple)) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("parameter ACL with OID %u does not exist", + acl_oid))); + + aclDatum = SysCacheGetAttr(PARAMETERACLOID, tuple, + Anum_pg_parameter_acl_paracl, + &isNull); + if (isNull) + { + /* No ACL, so build default ACL */ + acl = acldefault(OBJECT_PARAMETER_ACL, BOOTSTRAP_SUPERUSERID); + aclDatum = (Datum) 0; + } + else + { + /* detoast ACL if necessary */ + acl = DatumGetAclP(aclDatum); + } + + result = aclmask(acl, roleid, BOOTSTRAP_SUPERUSERID, mask, how); + + /* if we have a detoasted copy, free it */ + if (acl && (Pointer) acl != DatumGetPointer(aclDatum)) + pfree(acl); + + ReleaseSysCache(tuple); + + return result; +} + /* * Exported routine for examining a user's privileges for a function */ @@ -4713,6 +5038,32 @@ pg_database_aclcheck(Oid db_oid, Oid roleid, AclMode mode) return ACLCHECK_NO_PRIV; } +/* + * Exported routine for checking a user's access privileges to a configuration + * parameter (GUC), identified by GUC name. + */ +AclResult +pg_parameter_aclcheck(const char *name, Oid roleid, AclMode mode) +{ + if (pg_parameter_aclmask(name, roleid, mode, ACLMASK_ANY) != 0) + return ACLCHECK_OK; + else + return ACLCHECK_NO_PRIV; +} + +/* + * Exported routine for checking a user's access privileges to a configuration + * parameter (GUC), identified by the OID of its pg_parameter_acl entry. + */ +AclResult +pg_parameter_acl_aclcheck(Oid acl_oid, Oid roleid, AclMode mode) +{ + if (pg_parameter_acl_aclmask(acl_oid, roleid, mode, ACLMASK_ANY) != 0) + return ACLCHECK_OK; + else + return ACLCHECK_NO_PRIV; +} + /* * Exported routine for checking a user's access privileges to a function */ diff --git a/src/backend/catalog/catalog.c b/src/backend/catalog/catalog.c index dfd5fb669e..520f77971b 100644 --- a/src/backend/catalog/catalog.c +++ b/src/backend/catalog/catalog.c @@ -33,6 +33,7 @@ #include "catalog/pg_db_role_setting.h" #include "catalog/pg_largeobject.h" #include "catalog/pg_namespace.h" +#include "catalog/pg_parameter_acl.h" #include "catalog/pg_replication_origin.h" #include "catalog/pg_shdepend.h" #include "catalog/pg_shdescription.h" @@ -247,32 +248,35 @@ IsSharedRelation(Oid relationId) if (relationId == AuthIdRelationId || relationId == AuthMemRelationId || relationId == DatabaseRelationId || - relationId == SharedDescriptionRelationId || - relationId == SharedDependRelationId || - relationId == SharedSecLabelRelationId || - relationId == TableSpaceRelationId || relationId == DbRoleSettingRelationId || + relationId == ParameterAclRelationId || relationId == ReplicationOriginRelationId || - relationId == SubscriptionRelationId) + relationId == SharedDependRelationId || + relationId == SharedDescriptionRelationId || + relationId == SharedSecLabelRelationId || + relationId == SubscriptionRelationId || + relationId == TableSpaceRelationId) return true; /* These are their indexes */ - if (relationId == AuthIdRolnameIndexId || - relationId == AuthIdOidIndexId || - relationId == AuthMemRoleMemIndexId || + if (relationId == AuthIdOidIndexId || + relationId == AuthIdRolnameIndexId || relationId == AuthMemMemRoleIndexId || + relationId == AuthMemRoleMemIndexId || relationId == DatabaseNameIndexId || relationId == DatabaseOidIndexId || - relationId == SharedDescriptionObjIndexId || - relationId == SharedDependDependerIndexId || - relationId == SharedDependReferenceIndexId || - relationId == SharedSecLabelObjectIndexId || - relationId == TablespaceOidIndexId || - relationId == TablespaceNameIndexId || relationId == DbRoleSettingDatidRolidIndexId || + relationId == ParameterAclOidIndexId || + relationId == ParameterAclParnameIndexId || relationId == ReplicationOriginIdentIndex || relationId == ReplicationOriginNameIndex || + relationId == SharedDependDependerIndexId || + relationId == SharedDependReferenceIndexId || + relationId == SharedDescriptionObjIndexId || + relationId == SharedSecLabelObjectIndexId || + relationId == SubscriptionNameIndexId || relationId == SubscriptionObjectIndexId || - relationId == SubscriptionNameIndexId) + relationId == TablespaceNameIndexId || + relationId == TablespaceOidIndexId) return true; /* These are their toast tables and toast indexes */ if (relationId == PgAuthidToastTable || @@ -281,6 +285,8 @@ IsSharedRelation(Oid relationId) relationId == PgDatabaseToastIndex || relationId == PgDbRoleSettingToastTable || relationId == PgDbRoleSettingToastIndex || + relationId == PgParameterAclToastTable || + relationId == PgParameterAclToastIndex || relationId == PgReplicationOriginToastTable || relationId == PgReplicationOriginToastIndex || relationId == PgShdescriptionToastTable || diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index 25fe56d310..de10923391 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -46,6 +46,7 @@ #include "catalog/pg_opclass.h" #include "catalog/pg_operator.h" #include "catalog/pg_opfamily.h" +#include "catalog/pg_parameter_acl.h" #include "catalog/pg_policy.h" #include "catalog/pg_proc.h" #include "catalog/pg_publication.h" @@ -178,6 +179,7 @@ static const Oid object_classes[] = { DefaultAclRelationId, /* OCLASS_DEFACL */ ExtensionRelationId, /* OCLASS_EXTENSION */ EventTriggerRelationId, /* OCLASS_EVENT_TRIGGER */ + ParameterAclRelationId, /* OCLASS_PARAMETER_ACL */ PolicyRelationId, /* OCLASS_POLICY */ PublicationNamespaceRelationId, /* OCLASS_PUBLICATION_NAMESPACE */ PublicationRelationId, /* OCLASS_PUBLICATION */ @@ -1507,6 +1509,7 @@ doDeletion(const ObjectAddress *object, int flags) case OCLASS_DATABASE: case OCLASS_TBLSPACE: case OCLASS_SUBSCRIPTION: + case OCLASS_PARAMETER_ACL: elog(ERROR, "global objects cannot be deleted by doDeletion"); break; @@ -2861,6 +2864,9 @@ getObjectClass(const ObjectAddress *object) case EventTriggerRelationId: return OCLASS_EVENT_TRIGGER; + case ParameterAclRelationId: + return OCLASS_PARAMETER_ACL; + case PolicyRelationId: return OCLASS_POLICY; diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index 3fd17ea64f..31c80f7209 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -45,6 +45,7 @@ #include "catalog/pg_opclass.h" #include "catalog/pg_operator.h" #include "catalog/pg_opfamily.h" +#include "catalog/pg_parameter_acl.h" #include "catalog/pg_policy.h" #include "catalog/pg_proc.h" #include "catalog/pg_publication.h" @@ -818,6 +819,10 @@ static const struct object_type_map { "event trigger", OBJECT_EVENT_TRIGGER }, + /* OCLASS_PARAMETER_ACL */ + { + "parameter ACL", OBJECT_PARAMETER_ACL + }, /* OCLASS_POLICY */ { "policy", OBJECT_POLICY @@ -1014,6 +1019,7 @@ get_object_address(ObjectType objtype, Node *object, case OBJECT_FDW: case OBJECT_FOREIGN_SERVER: case OBJECT_EVENT_TRIGGER: + case OBJECT_PARAMETER_ACL: case OBJECT_ACCESS_METHOD: case OBJECT_PUBLICATION: case OBJECT_SUBSCRIPTION: @@ -1315,6 +1321,11 @@ get_object_address_unqualified(ObjectType objtype, address.objectId = get_event_trigger_oid(name, missing_ok); address.objectSubId = 0; break; + case OBJECT_PARAMETER_ACL: + address.classId = ParameterAclRelationId; + address.objectId = ParameterAclLookup(name, missing_ok); + address.objectSubId = 0; + break; case OBJECT_PUBLICATION: address.classId = PublicationRelationId; address.objectId = get_publication_oid(name, missing_ok); @@ -2307,6 +2318,7 @@ pg_get_object_address(PG_FUNCTION_ARGS) case OBJECT_FDW: case OBJECT_FOREIGN_SERVER: case OBJECT_LANGUAGE: + case OBJECT_PARAMETER_ACL: case OBJECT_PUBLICATION: case OBJECT_ROLE: case OBJECT_SCHEMA: @@ -2597,6 +2609,7 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address, case OBJECT_TSPARSER: case OBJECT_TSTEMPLATE: case OBJECT_ACCESS_METHOD: + case OBJECT_PARAMETER_ACL: /* We treat these object types as being owned by superusers */ if (!superuser_arg(roleid)) ereport(ERROR, @@ -3880,6 +3893,32 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } + case OCLASS_PARAMETER_ACL: + { + HeapTuple tup; + Datum nameDatum; + bool isNull; + char *parname; + + tup = SearchSysCache1(PARAMETERACLOID, + ObjectIdGetDatum(object->objectId)); + if (!HeapTupleIsValid(tup)) + { + if (!missing_ok) + elog(ERROR, "cache lookup failed for parameter ACL %u", + object->objectId); + break; + } + nameDatum = SysCacheGetAttr(PARAMETERACLOID, tup, + Anum_pg_parameter_acl_parname, + &isNull); + Assert(!isNull); + parname = TextDatumGetCString(nameDatum); + appendStringInfo(&buffer, _("parameter %s"), parname); + ReleaseSysCache(tup); + break; + } + case OCLASS_POLICY: { Relation policy_rel; @@ -4547,6 +4586,10 @@ getObjectTypeDescription(const ObjectAddress *object, bool missing_ok) appendStringInfoString(&buffer, "event trigger"); break; + case OCLASS_PARAMETER_ACL: + appendStringInfoString(&buffer, "parameter ACL"); + break; + case OCLASS_POLICY: appendStringInfoString(&buffer, "policy"); break; @@ -5693,6 +5736,34 @@ getObjectIdentityParts(const ObjectAddress *object, break; } + case OCLASS_PARAMETER_ACL: + { + HeapTuple tup; + Datum nameDatum; + bool isNull; + char *parname; + + tup = SearchSysCache1(PARAMETERACLOID, + ObjectIdGetDatum(object->objectId)); + if (!HeapTupleIsValid(tup)) + { + if (!missing_ok) + elog(ERROR, "cache lookup failed for parameter ACL %u", + object->objectId); + break; + } + nameDatum = SysCacheGetAttr(PARAMETERACLOID, tup, + Anum_pg_parameter_acl_parname, + &isNull); + Assert(!isNull); + parname = TextDatumGetCString(nameDatum); + appendStringInfoString(&buffer, parname); + if (objname) + *objname = list_make1(parname); + ReleaseSysCache(tup); + break; + } + case OCLASS_POLICY: { Relation polDesc; diff --git a/src/backend/catalog/pg_parameter_acl.c b/src/backend/catalog/pg_parameter_acl.c new file mode 100644 index 0000000000..2decee909b --- /dev/null +++ b/src/backend/catalog/pg_parameter_acl.c @@ -0,0 +1,118 @@ +/*------------------------------------------------------------------------- + * + * pg_parameter_acl.c + * routines to support manipulation of the pg_parameter_acl relation + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/catalog/pg_parameter_acl.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/table.h" +#include "catalog/catalog.h" +#include "catalog/indexing.h" +#include "catalog/objectaccess.h" +#include "catalog/pg_namespace.h" +#include "catalog/pg_parameter_acl.h" +#include "utils/builtins.h" +#include "utils/pg_locale.h" +#include "utils/rel.h" +#include "utils/syscache.h" + + +/* + * ParameterAclLookup - Given a configuration parameter name, + * look up the associated configuration parameter ACL's OID. + * + * If missing_ok is false, throw an error if ACL entry not found. If + * true, just return InvalidOid. + */ +Oid +ParameterAclLookup(const char *parameter, bool missing_ok) +{ + Oid oid; + char *parname; + + /* Convert name to the form it should have in pg_parameter_acl... */ + parname = convert_GUC_name_for_parameter_acl(parameter); + + /* ... and look it up */ + oid = GetSysCacheOid1(PARAMETERACLNAME, Anum_pg_parameter_acl_oid, + PointerGetDatum(cstring_to_text(parname))); + + if (!OidIsValid(oid) && !missing_ok) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("parameter ACL \"%s\" does not exist", parameter))); + + pfree(parname); + + return oid; +} + +/* + * ParameterAclCreate + * + * Add a new tuple to pg_parameter_acl. + * + * parameter: the parameter name to create an entry for. + * Caller should have verified that there's no such entry already. + * + * Returns the new entry's OID. + */ +Oid +ParameterAclCreate(const char *parameter) +{ + Oid parameterId; + char *parname; + Relation rel; + TupleDesc tupDesc; + HeapTuple tuple; + Datum values[Natts_pg_parameter_acl]; + bool nulls[Natts_pg_parameter_acl]; + + /* + * To prevent cluttering pg_parameter_acl with useless entries, insist + * that the name be valid. + */ + if (!check_GUC_name_for_parameter_acl(parameter)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_NAME), + errmsg("invalid parameter name \"%s\"", + parameter))); + + /* Convert name to the form it should have in pg_parameter_acl. */ + parname = convert_GUC_name_for_parameter_acl(parameter); + + /* + * Create and insert a new record containing a null ACL. + * + * We don't take a strong enough lock to prevent concurrent insertions, + * relying instead on the unique index. + */ + rel = table_open(ParameterAclRelationId, RowExclusiveLock); + tupDesc = RelationGetDescr(rel); + MemSet(values, 0, sizeof(values)); + MemSet(nulls, false, sizeof(nulls)); + parameterId = GetNewOidWithIndex(rel, + ParameterAclOidIndexId, + Anum_pg_parameter_acl_oid); + values[Anum_pg_parameter_acl_oid - 1] = ObjectIdGetDatum(parameterId); + values[Anum_pg_parameter_acl_parname - 1] = + PointerGetDatum(cstring_to_text(parname)); + nulls[Anum_pg_parameter_acl_paracl - 1] = true; + tuple = heap_form_tuple(tupDesc, values, nulls); + CatalogTupleInsert(rel, tuple); + + /* Close pg_parameter_acl, but keep lock till commit. */ + heap_freetuple(tuple); + table_close(rel, NoLock); + + return parameterId; +} diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c index 1f64c8aa51..5456b8222b 100644 --- a/src/backend/commands/alter.c +++ b/src/backend/commands/alter.c @@ -658,6 +658,7 @@ AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid, case OCLASS_DEFACL: case OCLASS_EXTENSION: case OCLASS_EVENT_TRIGGER: + case OCLASS_PARAMETER_ACL: case OCLASS_POLICY: case OCLASS_PUBLICATION: case OCLASS_PUBLICATION_NAMESPACE: diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c index 3c3fc2515b..4642527881 100644 --- a/src/backend/commands/event_trigger.c +++ b/src/backend/commands/event_trigger.c @@ -940,6 +940,7 @@ EventTriggerSupportsObjectType(ObjectType obtype) case OBJECT_DATABASE: case OBJECT_TABLESPACE: case OBJECT_ROLE: + case OBJECT_PARAMETER_ACL: /* no support for global objects */ return false; case OBJECT_EVENT_TRIGGER: @@ -1015,6 +1016,7 @@ EventTriggerSupportsObjectClass(ObjectClass objclass) case OCLASS_DATABASE: case OCLASS_TBLSPACE: case OCLASS_ROLE: + case OCLASS_PARAMETER_ACL: /* no support for global objects */ return false; case OCLASS_EVENT_TRIGGER: @@ -2042,6 +2044,8 @@ stringify_grant_objtype(ObjectType objtype) return "LARGE OBJECT"; case OBJECT_SCHEMA: return "SCHEMA"; + case OBJECT_PARAMETER_ACL: + return "PARAMETER"; case OBJECT_PROCEDURE: return "PROCEDURE"; case OBJECT_ROUTINE: @@ -2153,6 +2157,7 @@ stringify_adefprivs_objtype(ObjectType objtype) case OBJECT_OPCLASS: case OBJECT_OPERATOR: case OBJECT_OPFAMILY: + case OBJECT_PARAMETER_ACL: case OBJECT_POLICY: case OBJECT_PUBLICATION: case OBJECT_PUBLICATION_NAMESPACE: diff --git a/src/backend/commands/seclabel.c b/src/backend/commands/seclabel.c index 7a62d547e2..7ae19b98bb 100644 --- a/src/backend/commands/seclabel.c +++ b/src/backend/commands/seclabel.c @@ -78,6 +78,7 @@ SecLabelSupportsObjectType(ObjectType objtype) case OBJECT_OPCLASS: case OBJECT_OPERATOR: case OBJECT_OPFAMILY: + case OBJECT_PARAMETER_ACL: case OBJECT_POLICY: case OBJECT_PUBLICATION_NAMESPACE: case OBJECT_PUBLICATION_REL: diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 7febb5018f..a241b44497 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -12655,6 +12655,7 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, case OCLASS_DEFACL: case OCLASS_EXTENSION: case OCLASS_EVENT_TRIGGER: + case OCLASS_PARAMETER_ACL: case OCLASS_PUBLICATION: case OCLASS_PUBLICATION_NAMESPACE: case OCLASS_PUBLICATION_REL: diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 7e3f4a5d27..2cc92a8943 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -371,8 +371,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type foreign_server_version opt_foreign_server_version %type opt_in_database -%type OptSchemaName -%type OptSchemaEltList +%type OptSchemaName parameter_name +%type OptSchemaEltList parameter_name_list %type am_type @@ -827,7 +827,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); ORDER ORDINALITY OTHERS OUT_P OUTER_P OVER OVERLAPS OVERLAY OVERRIDING OWNED OWNER - PARALLEL PARSER PARTIAL PARTITION PASSING PASSWORD PATH PLACING PLAN PLANS POLICY + PARALLEL PARAMETER PARSER PARTIAL PARTITION PASSING PASSWORD PATH + PLACING PLAN PLANS POLICY POSITION PRECEDING PRECISION PRESERVE PREPARE PREPARED PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE PROCEDURES PROGRAM PUBLICATION @@ -7197,6 +7198,13 @@ privilege: SELECT opt_column_list n->cols = $2; $$ = n; } + | ALTER SYSTEM_P + { + AccessPriv *n = makeNode(AccessPriv); + n->priv_name = pstrdup("alter system"); + n->cols = NIL; + $$ = n; + } | ColId opt_column_list { AccessPriv *n = makeNode(AccessPriv); @@ -7206,6 +7214,28 @@ privilege: SELECT opt_column_list } ; +parameter_name_list: + parameter_name + { + $$ = list_make1(makeString($1)); + } + | parameter_name_list ',' parameter_name + { + $$ = lappend($1, makeString($3)); + } + ; + +parameter_name: + ColId + { + $$ = $1; + } + | parameter_name '.' ColId + { + $$ = psprintf("%s.%s", $1, $3); + } + ; + /* Don't bother trying to fold the first two rules into one using * opt_table. You're going to get conflicts. @@ -7307,6 +7337,14 @@ privilege_target: n->objs = $3; $$ = n; } + | PARAMETER parameter_name_list + { + PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; + n->objtype = OBJECT_PARAMETER_ACL; + n->objs = $2; + $$ = n; + } | SCHEMA name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); @@ -17065,6 +17103,7 @@ unreserved_keyword: | OWNED | OWNER | PARALLEL + | PARAMETER | PARSER | PARTIAL | PARTITION @@ -17682,6 +17721,7 @@ bare_label_keyword: | OWNED | OWNER | PARALLEL + | PARAMETER | PARSER | PARTIAL | PARTITION diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index 83cf7ac9ff..8bdba1c42a 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -23,6 +23,7 @@ #include "catalog/pg_authid.h" #include "catalog/pg_class.h" #include "catalog/pg_database.h" +#include "catalog/pg_parameter_acl.h" #include "catalog/pg_type.h" #include "commands/dbcommands.h" #include "commands/proclang.h" @@ -36,6 +37,7 @@ #include "utils/array.h" #include "utils/builtins.h" #include "utils/catcache.h" +#include "utils/guc.h" #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/memutils.h" @@ -109,6 +111,7 @@ static Oid convert_tablespace_name(text *tablespacename); static AclMode convert_tablespace_priv_string(text *priv_type_text); static Oid convert_type_name(text *typename); static AclMode convert_type_priv_string(text *priv_type_text); +static AclMode convert_parameter_priv_string(text *priv_text); static AclMode convert_role_priv_string(text *priv_type_text); static AclResult pg_role_aclcheck(Oid role_oid, Oid roleid, AclMode mode); @@ -306,6 +309,12 @@ aclparse(const char *s, AclItem *aip) case ACL_CONNECT_CHR: read = ACL_CONNECT; break; + case ACL_SET_CHR: + read = ACL_SET; + break; + case ACL_ALTER_SYSTEM_CHR: + read = ACL_ALTER_SYSTEM; + break; case 'R': /* ignore old RULE privileges */ read = 0; break; @@ -794,6 +803,10 @@ acldefault(ObjectType objtype, Oid ownerId) world_default = ACL_USAGE; owner_default = ACL_ALL_RIGHTS_TYPE; break; + case OBJECT_PARAMETER_ACL: + world_default = ACL_NO_RIGHTS; + owner_default = ACL_ALL_RIGHTS_PARAMETER_ACL; + break; default: elog(ERROR, "unrecognized objtype: %d", (int) objtype); world_default = ACL_NO_RIGHTS; /* keep compiler quiet */ @@ -876,6 +889,9 @@ acldefault_sql(PG_FUNCTION_ARGS) case 'n': objtype = OBJECT_SCHEMA; break; + case 'p': + objtype = OBJECT_PARAMETER_ACL; + break; case 't': objtype = OBJECT_TABLESPACE; break; @@ -1602,6 +1618,10 @@ convert_priv_string(text *priv_type_text) return ACL_CREATE_TEMP; if (pg_strcasecmp(priv_type, "CONNECT") == 0) return ACL_CONNECT; + if (pg_strcasecmp(priv_type, "SET") == 0) + return ACL_SET; + if (pg_strcasecmp(priv_type, "ALTER SYSTEM") == 0) + return ACL_ALTER_SYSTEM; if (pg_strcasecmp(priv_type, "RULE") == 0) return 0; /* ignore old RULE privileges */ @@ -1698,6 +1718,10 @@ convert_aclright_to_string(int aclright) return "TEMPORARY"; case ACL_CONNECT: return "CONNECT"; + case ACL_SET: + return "SET"; + case ACL_ALTER_SYSTEM: + return "ALTER SYSTEM"; default: elog(ERROR, "unrecognized aclright: %d", aclright); return NULL; @@ -4429,6 +4453,96 @@ convert_type_priv_string(text *priv_type_text) return convert_any_priv_string(priv_type_text, type_priv_map); } +/* + * has_parameter_privilege variants + * These are all named "has_parameter_privilege" at the SQL level. + * They take various combinations of parameter name with + * user name, user OID, or implicit user = current_user. + * + * The result is a boolean value: true if user has been granted + * the indicated privilege or false if not. + */ + +/* + * has_param_priv_byname + * + * Helper function to check user privileges on a parameter given the + * role by Oid, parameter by text name, and privileges as AclMode. + */ +static bool +has_param_priv_byname(Oid roleid, const text *parameter, AclMode priv) +{ + char *paramstr = text_to_cstring(parameter); + + return pg_parameter_aclcheck(paramstr, roleid, priv) == ACLCHECK_OK; +} + +/* + * has_parameter_privilege_name_name + * Check user privileges on a parameter given name username, text + * parameter, and text priv name. + */ +Datum +has_parameter_privilege_name_name(PG_FUNCTION_ARGS) +{ + Name username = PG_GETARG_NAME(0); + text *parameter = PG_GETARG_TEXT_PP(1); + AclMode priv = convert_parameter_priv_string(PG_GETARG_TEXT_PP(2)); + Oid roleid = get_role_oid_or_public(NameStr(*username)); + + PG_RETURN_BOOL(has_param_priv_byname(roleid, parameter, priv)); +} + +/* + * has_parameter_privilege_name + * Check user privileges on a parameter given text parameter and text priv + * name. current_user is assumed + */ +Datum +has_parameter_privilege_name(PG_FUNCTION_ARGS) +{ + text *parameter = PG_GETARG_TEXT_PP(0); + AclMode priv = convert_parameter_priv_string(PG_GETARG_TEXT_PP(1)); + + PG_RETURN_BOOL(has_param_priv_byname(GetUserId(), parameter, priv)); +} + +/* + * has_parameter_privilege_id_name + * Check user privileges on a parameter given roleid, text parameter, and + * text priv name. + */ +Datum +has_parameter_privilege_id_name(PG_FUNCTION_ARGS) +{ + Oid roleid = PG_GETARG_OID(0); + text *parameter = PG_GETARG_TEXT_PP(1); + AclMode priv = convert_parameter_priv_string(PG_GETARG_TEXT_PP(2)); + + PG_RETURN_BOOL(has_param_priv_byname(roleid, parameter, priv)); +} + +/* + * Support routines for has_parameter_privilege family. + */ + +/* + * convert_parameter_priv_string + * Convert text string to AclMode value. + */ +static AclMode +convert_parameter_priv_string(text *priv_text) +{ + static const priv_map parameter_priv_map[] = { + {"SET", ACL_SET}, + {"SET WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_SET)}, + {"ALTER SYSTEM", ACL_ALTER_SYSTEM}, + {"ALTER SYSTEM WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_ALTER_SYSTEM)}, + {NULL, 0} + }; + + return convert_any_priv_string(priv_text, parameter_priv_map); +} /* * pg_has_role variants diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c index a675877d19..8d265f2d23 100644 --- a/src/backend/utils/cache/syscache.c +++ b/src/backend/utils/cache/syscache.c @@ -47,6 +47,7 @@ #include "catalog/pg_opclass.h" #include "catalog/pg_operator.h" #include "catalog/pg_opfamily.h" +#include "catalog/pg_parameter_acl.h" #include "catalog/pg_partitioned_table.h" #include "catalog/pg_proc.h" #include "catalog/pg_publication.h" @@ -574,6 +575,28 @@ static const struct cachedesc cacheinfo[] = { }, 8 }, + {ParameterAclRelationId, /* PARAMETERACLNAME */ + ParameterAclParnameIndexId, + 1, + { + Anum_pg_parameter_acl_parname, + 0, + 0, + 0 + }, + 4 + }, + {ParameterAclRelationId, /* PARAMETERACLOID */ + ParameterAclOidIndexId, + 1, + { + Anum_pg_parameter_acl_oid, + 0, + 0, + 0 + }, + 4 + }, {PartitionedRelationId, /* PARTRELID */ PartitionedRelidIndexId, 1, diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 9e8ab1420d..5538465d7d 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -45,6 +45,7 @@ #include "catalog/namespace.h" #include "catalog/objectaccess.h" #include "catalog/pg_authid.h" +#include "catalog/pg_parameter_acl.h" #include "catalog/storage.h" #include "commands/async.h" #include "commands/prepare.h" @@ -5713,6 +5714,65 @@ guc_name_compare(const char *namea, const char *nameb) } +/* + * Convert a GUC name to the form that should be used in pg_parameter_acl. + * + * We need to canonicalize entries since, for example, case should not be + * significant. In addition, we apply the map_old_guc_names[] mapping so that + * any obsolete names will be converted when stored in a new PG version. + * Note however that this function does not verify legality of the name. + * + * The result is a palloc'd string. + */ +char * +convert_GUC_name_for_parameter_acl(const char *name) +{ + char *result; + + /* Apply old-GUC-name mapping. */ + for (int i = 0; map_old_guc_names[i] != NULL; i += 2) + { + if (guc_name_compare(name, map_old_guc_names[i]) == 0) + { + name = map_old_guc_names[i + 1]; + break; + } + } + + /* Apply case-folding that matches guc_name_compare(). */ + result = pstrdup(name); + for (char *ptr = result; *ptr != '\0'; ptr++) + { + char ch = *ptr; + + if (ch >= 'A' && ch <= 'Z') + { + ch += 'a' - 'A'; + *ptr = ch; + } + } + + return result; +} + +/* + * Check whether we should allow creation of a pg_parameter_acl entry + * for the given name. (This can be applied either before or after + * canonicalizing it.) + */ +bool +check_GUC_name_for_parameter_acl(const char *name) +{ + /* OK if the GUC exists. */ + if (find_option(name, false, true, DEBUG1) != NULL) + return true; + /* Otherwise, it'd better be a valid custom GUC name. */ + if (valid_custom_variable_name(name)) + return true; + return false; +} + + /* * Initialize GUC options during program startup. * @@ -7518,14 +7578,24 @@ set_config_option(const char *name, const char *value, */ break; case PGC_SU_BACKEND: - /* Reject if we're connecting but user is not superuser */ if (context == PGC_BACKEND) { - ereport(elevel, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("permission denied to set parameter \"%s\"", - name))); - return 0; + /* + * Check whether the current user has been granted privilege + * to set this GUC. + */ + AclResult aclresult; + + aclresult = pg_parameter_aclcheck(name, GetUserId(), ACL_SET); + if (aclresult != ACLCHECK_OK) + { + /* No granted privilege */ + ereport(elevel, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied to set parameter \"%s\"", + name))); + return 0; + } } /* fall through to process the same as PGC_BACKEND */ /* FALLTHROUGH */ @@ -7568,11 +7638,22 @@ set_config_option(const char *name, const char *value, case PGC_SUSET: if (context == PGC_USERSET || context == PGC_BACKEND) { - ereport(elevel, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("permission denied to set parameter \"%s\"", - name))); - return 0; + /* + * Check whether the current user has been granted privilege + * to set this GUC. + */ + AclResult aclresult; + + aclresult = pg_parameter_aclcheck(name, GetUserId(), ACL_SET); + if (aclresult != ACLCHECK_OK) + { + /* No granted privilege */ + ereport(elevel, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied to set parameter \"%s\"", + name))); + return 0; + } } break; case PGC_USERSET: @@ -8617,11 +8698,6 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt) char AutoConfFileName[MAXPGPATH]; char AutoConfTmpFileName[MAXPGPATH]; - if (!superuser()) - ereport(ERROR, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser to execute ALTER SYSTEM command"))); - /* * Extract statement arguments */ @@ -8649,6 +8725,29 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt) break; } + /* + * Check permission to run ALTER SYSTEM on the target variable + */ + if (!superuser()) + { + if (resetall) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied to perform ALTER SYSTEM RESET ALL"))); + else + { + AclResult aclresult; + + aclresult = pg_parameter_aclcheck(name, GetUserId(), + ACL_ALTER_SYSTEM); + if (aclresult != ACLCHECK_OK) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied to set parameter \"%s\"", + name))); + } + } + /* * Unless it's RESET_ALL, validate the target variable and value */ @@ -8760,13 +8859,18 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt) } /* - * Invoke the post-alter hook for altering this GUC variable. + * Invoke the post-alter hook for setting this GUC variable. GUCs + * typically do not have corresponding entries in pg_parameter_acl, so we + * call the hook using the name rather than a potentially-non-existent + * OID. Nonetheless, we pass ParameterAclRelationId so that this call + * context can be distinguished from others. (Note that "name" will be + * NULL in the RESET ALL case.) * * We do this here rather than at the end, because ALTER SYSTEM is not * transactional. If the hook aborts our transaction, it will be cleaner * to do so before we touch any files. */ - InvokeObjectPostAlterHookArgStr(InvalidOid, name, + InvokeObjectPostAlterHookArgStr(ParameterAclRelationId, name, ACL_ALTER_SYSTEM, altersysstmt->setstmt->kind, false); @@ -8943,9 +9047,9 @@ ExecSetVariableStmt(VariableSetStmt *stmt, bool isTopLevel) break; } - /* Invoke the post-alter hook for setting this GUC variable. */ - InvokeObjectPostAlterHookArgStr(InvalidOid, stmt->name, - ACL_SET_VALUE, stmt->kind, false); + /* Invoke the post-alter hook for setting this GUC variable, by name. */ + InvokeObjectPostAlterHookArgStr(ParameterAclRelationId, stmt->name, + ACL_SET, stmt->kind, false); } /* diff --git a/src/bin/pg_dump/dumputils.c b/src/bin/pg_dump/dumputils.c index 6086d57cf3..3e68dfc78f 100644 --- a/src/bin/pg_dump/dumputils.c +++ b/src/bin/pg_dump/dumputils.c @@ -37,7 +37,7 @@ static void AddAcl(PQExpBuffer aclbuf, const char *keyword, * nspname: the namespace the object is in (NULL if none); not pre-quoted * type: the object type (as seen in GRANT command: must be one of * TABLE, SEQUENCE, FUNCTION, PROCEDURE, LANGUAGE, SCHEMA, DATABASE, TABLESPACE, - * FOREIGN DATA WRAPPER, SERVER, or LARGE OBJECT) + * FOREIGN DATA WRAPPER, SERVER, PARAMETER or LARGE OBJECT) * acls: the ACL string fetched from the database * baseacls: the initial ACL string for this object * owner: username of object owner (will be passed through fmtId); can be @@ -501,6 +501,11 @@ do { \ CONVERT_PRIV('U', "USAGE"); else if (strcmp(type, "FOREIGN TABLE") == 0) CONVERT_PRIV('r', "SELECT"); + else if (strcmp(type, "PARAMETER") == 0) + { + CONVERT_PRIV('s', "SET"); + CONVERT_PRIV('A', "ALTER SYSTEM"); + } else if (strcmp(type, "LARGE OBJECT") == 0) { CONVERT_PRIV('r', "SELECT"); diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 9c9f7c6d63..2dc3362763 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -18,6 +18,7 @@ #include #include +#include "catalog/pg_authid_d.h" #include "common/connect.h" #include "common/file_utils.h" #include "common/logging.h" @@ -36,6 +37,7 @@ static void help(void); static void dropRoles(PGconn *conn); static void dumpRoles(PGconn *conn); static void dumpRoleMembership(PGconn *conn); +static void dumpRoleGUCPrivs(PGconn *conn); static void dropTablespaces(PGconn *conn); static void dumpTablespaces(PGconn *conn); static void dropDBs(PGconn *conn); @@ -585,6 +587,10 @@ main(int argc, char *argv[]) /* Dump role memberships */ dumpRoleMembership(conn); + + /* Dump role GUC privileges */ + if (server_version >= 150000 && !skip_acls) + dumpRoleGUCPrivs(conn); } /* Dump tablespaces */ @@ -989,6 +995,65 @@ dumpRoleMembership(PGconn *conn) } +/* + * Dump role configuration parameter privileges. This code is used for 15.0 + * and later servers. + * + * Note: we expect dumpRoles already created all the roles, but there are + * no per-role configuration parameter privileges yet. + */ +static void +dumpRoleGUCPrivs(PGconn *conn) +{ + PGresult *res; + int i; + + /* + * Get all parameters that have non-default acls defined. + */ + res = executeQuery(conn, "SELECT parname, " + "pg_catalog.pg_get_userbyid(" CppAsString2(BOOTSTRAP_SUPERUSERID) ") AS parowner, " + "paracl, " + "pg_catalog.acldefault('p', " CppAsString2(BOOTSTRAP_SUPERUSERID) ") AS acldefault " + "FROM pg_catalog.pg_parameter_acl " + "ORDER BY 1"); + + if (PQntuples(res) > 0) + fprintf(OPF, "--\n-- Role privileges on configuration parameters\n--\n\n"); + + for (i = 0; i < PQntuples(res); i++) + { + PQExpBuffer buf = createPQExpBuffer(); + char *parname = PQgetvalue(res, i, 0); + char *parowner = PQgetvalue(res, i, 1); + char *paracl = PQgetvalue(res, i, 2); + char *acldefault = PQgetvalue(res, i, 3); + char *fparname; + + /* needed for buildACLCommands() */ + fparname = pg_strdup(fmtId(parname)); + + if (!buildACLCommands(fparname, NULL, NULL, "PARAMETER", + paracl, acldefault, + parowner, "", server_version, buf)) + { + pg_log_error("could not parse ACL list (%s) for parameter \"%s\"", + paracl, parname); + PQfinish(conn); + exit_nicely(1); + } + + fprintf(OPF, "%s", buf->data); + + free(fparname); + destroyPQExpBuffer(buf); + } + + PQclear(res); + fprintf(OPF, "\n\n"); +} + + /* * Drop tablespaces. */ diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 645d46ab75..32d0b4855f 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -3737,7 +3737,8 @@ psql_completion(const char *text, int start, int end) * ALTER DEFAULT PRIVILEGES, so use TailMatches */ /* Complete GRANT/REVOKE with a list of roles and privileges */ - else if (TailMatches("GRANT|REVOKE")) + else if (TailMatches("GRANT|REVOKE") || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR")) { /* * With ALTER DEFAULT PRIVILEGES, restrict completion to grantable @@ -3749,6 +3750,7 @@ psql_completion(const char *text, int start, int end) "EXECUTE", "USAGE", "ALL"); else COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, + "GRANT", "SELECT", "INSERT", "UPDATE", @@ -3761,14 +3763,48 @@ psql_completion(const char *text, int start, int end) "TEMPORARY", "EXECUTE", "USAGE", + "SET", + "ALTER SYSTEM", "ALL"); } + else if (TailMatches("REVOKE", "GRANT")) + COMPLETE_WITH("OPTION FOR"); + else if (TailMatches("REVOKE", "GRANT", "OPTION")) + COMPLETE_WITH("FOR"); + + else if (TailMatches("GRANT|REVOKE", "ALTER") || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", "ALTER")) + COMPLETE_WITH("SYSTEM"); + + else if (TailMatches("GRANT|REVOKE", "SET") || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", "SET") || + TailMatches("GRANT|REVOKE", "ALTER", "SYSTEM") || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", "ALTER", "SYSTEM")) + COMPLETE_WITH("ON PARAMETER"); + + else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "PARAMETER") || + TailMatches("GRANT|REVOKE", MatchAny, MatchAny, "ON", "PARAMETER") || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "PARAMETER") || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, MatchAny, "ON", "PARAMETER")) + COMPLETE_WITH_QUERY(Query_for_list_of_alter_system_set_vars); + + else if (TailMatches("GRANT", MatchAny, "ON", "PARAMETER", MatchAny) || + TailMatches("GRANT", MatchAny, MatchAny, "ON", "PARAMETER", MatchAny)) + COMPLETE_WITH("TO"); + + else if (TailMatches("REVOKE", MatchAny, "ON", "PARAMETER", MatchAny) || + TailMatches("REVOKE", MatchAny, MatchAny, "ON", "PARAMETER", MatchAny) || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "PARAMETER", MatchAny) || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, MatchAny, "ON", "PARAMETER", MatchAny)) + COMPLETE_WITH("FROM"); + /* * Complete GRANT/REVOKE with "ON", GRANT/REVOKE with * TO/FROM */ - else if (TailMatches("GRANT|REVOKE", MatchAny)) + else if (TailMatches("GRANT|REVOKE", MatchAny) || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny)) { if (TailMatches("SELECT|INSERT|UPDATE|DELETE|TRUNCATE|REFERENCES|TRIGGER|CREATE|CONNECT|TEMPORARY|TEMP|EXECUTE|USAGE|ALL")) COMPLETE_WITH("ON"); @@ -3785,7 +3821,8 @@ psql_completion(const char *text, int start, int end) * here will only work if the privilege list contains exactly one * privilege. */ - else if (TailMatches("GRANT|REVOKE", MatchAny, "ON")) + else if (TailMatches("GRANT|REVOKE", MatchAny, "ON") || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON")) { /* * With ALTER DEFAULT PRIVILEGES, restrict completion to the kinds of @@ -3807,6 +3844,7 @@ psql_completion(const char *text, int start, int end) "FUNCTION", "LANGUAGE", "LARGE OBJECT", + "PARAMETER", "PROCEDURE", "ROUTINE", "SCHEMA", @@ -3815,13 +3853,15 @@ psql_completion(const char *text, int start, int end) "TABLESPACE", "TYPE"); } - else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "ALL")) + else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "ALL") || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "ALL")) COMPLETE_WITH("FUNCTIONS IN SCHEMA", "PROCEDURES IN SCHEMA", "ROUTINES IN SCHEMA", "SEQUENCES IN SCHEMA", "TABLES IN SCHEMA"); - else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "FOREIGN")) + else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "FOREIGN") || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "FOREIGN")) COMPLETE_WITH("DATA WRAPPER", "SERVER"); /* @@ -3830,7 +3870,8 @@ psql_completion(const char *text, int start, int end) * * Complete "GRANT/REVOKE * ON *" with "TO/FROM". */ - else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", MatchAny)) + else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", MatchAny) || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", MatchAny)) { if (TailMatches("DATABASE")) COMPLETE_WITH_QUERY(Query_for_list_of_databases); @@ -3868,6 +3909,22 @@ psql_completion(const char *text, int start, int end) (HeadMatches("REVOKE") && TailMatches("FROM"))) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, Keywords_for_list_of_grant_roles); + + /* + * Offer grant options after that. + */ + else if (HeadMatches("GRANT") && TailMatches("TO", MatchAny)) + COMPLETE_WITH("WITH ADMIN OPTION", + "WITH GRANT OPTION", + "GRANTED BY"); + else if (HeadMatches("GRANT") && TailMatches("TO", MatchAny, "WITH")) + COMPLETE_WITH("ADMIN OPTION", + "GRANT OPTION"); + else if (HeadMatches("GRANT") && TailMatches("TO", MatchAny, "WITH", MatchAny, "OPTION")) + COMPLETE_WITH("GRANTED BY"); + else if (HeadMatches("GRANT") && TailMatches("TO", MatchAny, "WITH", MatchAny, "OPTION", "GRANTED", "BY")) + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, + Keywords_for_list_of_grant_roles); /* Complete "ALTER DEFAULT PRIVILEGES ... GRANT/REVOKE ... TO/FROM */ else if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES") && TailMatches("TO|FROM")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, @@ -3879,7 +3936,8 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("FROM"); /* Complete "GRANT/REVOKE * ON ALL * IN SCHEMA *" with TO/FROM */ - else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "ALL", MatchAny, "IN", "SCHEMA", MatchAny)) + else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "ALL", MatchAny, "IN", "SCHEMA", MatchAny) || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "ALL", MatchAny, "IN", "SCHEMA", MatchAny)) { if (TailMatches("GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny)) COMPLETE_WITH("TO"); @@ -3888,7 +3946,8 @@ psql_completion(const char *text, int start, int end) } /* Complete "GRANT/REVOKE * ON FOREIGN DATA WRAPPER *" with TO/FROM */ - else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "FOREIGN", "DATA", "WRAPPER", MatchAny)) + else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "FOREIGN", "DATA", "WRAPPER", MatchAny) || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "FOREIGN", "DATA", "WRAPPER", MatchAny)) { if (TailMatches("GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny)) COMPLETE_WITH("TO"); @@ -3897,7 +3956,8 @@ psql_completion(const char *text, int start, int end) } /* Complete "GRANT/REVOKE * ON FOREIGN SERVER *" with TO/FROM */ - else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "FOREIGN", "SERVER", MatchAny)) + else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "FOREIGN", "SERVER", MatchAny) || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "FOREIGN", "SERVER", MatchAny)) { if (TailMatches("GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny)) COMPLETE_WITH("TO"); diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index cb26c967ad..ab28a56b3a 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202203301 +#define CATALOG_VERSION_NO 202204061 #endif diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h index 344482ec87..d027075a4c 100644 --- a/src/include/catalog/dependency.h +++ b/src/include/catalog/dependency.h @@ -120,6 +120,7 @@ typedef enum ObjectClass OCLASS_DEFACL, /* pg_default_acl */ OCLASS_EXTENSION, /* pg_extension */ OCLASS_EVENT_TRIGGER, /* pg_event_trigger */ + OCLASS_PARAMETER_ACL, /* pg_parameter_acl */ OCLASS_POLICY, /* pg_policy */ OCLASS_PUBLICATION, /* pg_publication */ OCLASS_PUBLICATION_NAMESPACE, /* pg_publication_namespace */ diff --git a/src/include/catalog/objectaccess.h b/src/include/catalog/objectaccess.h index 4d54ae2a7d..ac6adcb730 100644 --- a/src/include/catalog/objectaccess.h +++ b/src/include/catalog/objectaccess.h @@ -239,7 +239,7 @@ extern void RunFunctionExecuteHookStr(const char *objectStr); RunObjectTruncateHookStr(objectName); \ } while(0) -#define InvokeObjectPostAlterHookStr(className,objectName,subId) \ +#define InvokeObjectPostAlterHookStr(classId,objectName,subId) \ InvokeObjectPostAlterHookArgStr((classId),(objectName),(subId), \ InvalidOid,false) #define InvokeObjectPostAlterHookArgStr(classId,objectName,subId, \ diff --git a/src/include/catalog/pg_parameter_acl.h b/src/include/catalog/pg_parameter_acl.h new file mode 100644 index 0000000000..8316391e51 --- /dev/null +++ b/src/include/catalog/pg_parameter_acl.h @@ -0,0 +1,62 @@ +/*------------------------------------------------------------------------- + * + * pg_parameter_acl.h + * definition of the "configuration parameter ACL" system catalog + * (pg_parameter_acl). + * + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/catalog/pg_parameter_acl.h + * + * NOTES + * The Catalog.pm module reads this file and derives schema + * information. + * + *------------------------------------------------------------------------- + */ +#ifndef PG_PARAMETER_ACL_H +#define PG_PARAMETER_ACL_H + +#include "catalog/genbki.h" +#include "catalog/pg_parameter_acl_d.h" + +/* ---------------- + * pg_parameter_acl definition. cpp turns this into + * typedef struct FormData_pg_parameter_acl + * ---------------- + */ +CATALOG(pg_parameter_acl,8924,ParameterAclRelationId) BKI_SHARED_RELATION +{ + Oid oid; /* oid */ + +#ifdef CATALOG_VARLEN /* variable-length fields start here */ + /* name of parameter */ + text parname BKI_FORCE_NOT_NULL; + + /* access permissions */ + aclitem paracl[1] BKI_DEFAULT(_null_); +#endif +} FormData_pg_parameter_acl; + + +/* ---------------- + * Form_pg_parameter_acl corresponds to a pointer to a tuple with + * the format of pg_parameter_acl relation. + * ---------------- + */ +typedef FormData_pg_parameter_acl *Form_pg_parameter_acl; + +DECLARE_TOAST(pg_parameter_acl, 8925, 8926); +#define PgParameterAclToastTable 8925 +#define PgParameterAclToastIndex 8926 + +DECLARE_UNIQUE_INDEX(pg_parameter_acl_parname_index, 8927, ParameterAclParnameIndexId, on pg_parameter_acl using btree(parname text_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_parameter_acl_oid_index, 8928, ParameterAclOidIndexId, on pg_parameter_acl using btree(oid oid_ops)); + + +extern Oid ParameterAclLookup(const char *parameter, bool missing_ok); +extern Oid ParameterAclCreate(const char *parameter); + +#endif /* PG_PARAMETER_ACL_H */ diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 25304430f4..4d285ece8b 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -7213,6 +7213,22 @@ proname => 'has_type_privilege', provolatile => 's', prorettype => 'bool', proargtypes => 'oid text', prosrc => 'has_type_privilege_id' }, +{ oid => '8050', + descr => 'user privilege on parameter by username, parameter name', + proname => 'has_parameter_privilege', provolatile => 's', + prorettype => 'bool', proargtypes => 'name text text', + prosrc => 'has_parameter_privilege_name_name' }, +{ oid => '8051', + descr => 'user privilege on parameter by user oid, parameter name', + proname => 'has_parameter_privilege', provolatile => 's', + prorettype => 'bool', proargtypes => 'oid text text', + prosrc => 'has_parameter_privilege_id_name' }, +{ oid => '8052', + descr => 'current user privilege on parameter by parameter name', + proname => 'has_parameter_privilege', provolatile => 's', + prorettype => 'bool', proargtypes => 'text text', + prosrc => 'has_parameter_privilege_name' }, + { oid => '2705', descr => 'user privilege on role by username, role name', proname => 'pg_has_role', provolatile => 's', prorettype => 'bool', proargtypes => 'name name text', prosrc => 'pg_has_role_name_name' }, diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 4a2ca81f3c..8998d34560 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -92,8 +92,8 @@ typedef uint32 AclMode; /* a bitmask of privilege bits */ #define ACL_CREATE (1<<9) /* for namespaces and databases */ #define ACL_CREATE_TEMP (1<<10) /* for databases */ #define ACL_CONNECT (1<<11) /* for databases */ -#define ACL_SET_VALUE (1<<12) /* for configuration parameters */ -#define ACL_ALTER_SYSTEM (1<<13) /* for configuration parameters */ +#define ACL_SET (1<<12) /* for configuration parameters */ +#define ACL_ALTER_SYSTEM (1<<13) /* for configuration parameters */ #define N_ACL_RIGHTS 14 /* 1 plus the last 1< { pg_dumpall_globals => 1, }, }, + 'GRANT ALTER SYSTEM ON PARAMETER full_page_writes TO regress_dump_test_role' + => { + create_order => 2, + create_sql => + 'GRANT ALTER SYSTEM ON PARAMETER full_page_writes TO regress_dump_test_role;', + regexp => + + qr/^GRANT ALTER SYSTEM ON PARAMETER full_page_writes TO regress_dump_test_role;/m, + like => { pg_dumpall_globals => 1, }, + }, + + 'GRANT ALL ON PARAMETER Custom.Knob TO regress_dump_test_role WITH GRANT OPTION' + => { + create_order => 2, + create_sql => + 'GRANT SET, ALTER SYSTEM ON PARAMETER Custom.Knob TO regress_dump_test_role WITH GRANT OPTION;', + regexp => + # "set" plus "alter system" is "all" privileges on parameters + qr/^GRANT ALL ON PARAMETER "custom.knob" TO regress_dump_test_role WITH GRANT OPTION;/m, + like => { pg_dumpall_globals => 1, }, + }, + + 'GRANT ALL ON PARAMETER DateStyle TO regress_dump_test_role' => { + create_order => 2, + create_sql => + 'GRANT ALL ON PARAMETER "DateStyle" TO regress_dump_test_role WITH GRANT OPTION; REVOKE GRANT OPTION FOR ALL ON PARAMETER DateStyle FROM regress_dump_test_role;', + regexp => + # The revoke simplifies the ultimate grant so as to not include "with grant option" + qr/^GRANT ALL ON PARAMETER datestyle TO regress_dump_test_role;/m, + like => { pg_dumpall_globals => 1, }, + }, + 'CREATE SCHEMA public' => { regexp => qr/^CREATE SCHEMA public;/m, like => { diff --git a/src/test/modules/unsafe_tests/Makefile b/src/test/modules/unsafe_tests/Makefile index 3ecf5fcfc5..df58273688 100644 --- a/src/test/modules/unsafe_tests/Makefile +++ b/src/test/modules/unsafe_tests/Makefile @@ -1,6 +1,6 @@ # src/test/modules/unsafe_tests/Makefile -REGRESS = rolenames alter_system_table +REGRESS = rolenames alter_system_table guc_privs ifdef USE_PGXS PG_CONFIG = pg_config diff --git a/src/test/modules/unsafe_tests/expected/guc_privs.out b/src/test/modules/unsafe_tests/expected/guc_privs.out new file mode 100644 index 0000000000..58dc87f958 --- /dev/null +++ b/src/test/modules/unsafe_tests/expected/guc_privs.out @@ -0,0 +1,526 @@ +-- +-- Tests for privileges on GUCs. +-- This is unsafe because changes will affect other databases in the cluster. +-- +-- Test with a superuser role. +CREATE ROLE regress_admin SUPERUSER; +-- Perform operations as user 'regress_admin'. +SET SESSION AUTHORIZATION regress_admin; +-- PGC_BACKEND +SET ignore_system_indexes = OFF; -- fail, cannot be set after connection start +ERROR: parameter "ignore_system_indexes" cannot be set after connection start +RESET ignore_system_indexes; -- fail, cannot be set after connection start +ERROR: parameter "ignore_system_indexes" cannot be set after connection start +ALTER SYSTEM SET ignore_system_indexes = OFF; -- ok +ALTER SYSTEM RESET ignore_system_indexes; -- ok +-- PGC_INTERNAL +SET block_size = 50; -- fail, cannot be changed +ERROR: parameter "block_size" cannot be changed +RESET block_size; -- fail, cannot be changed +ERROR: parameter "block_size" cannot be changed +ALTER SYSTEM SET block_size = 50; -- fail, cannot be changed +ERROR: parameter "block_size" cannot be changed +ALTER SYSTEM RESET block_size; -- fail, cannot be changed +ERROR: parameter "block_size" cannot be changed +-- PGC_POSTMASTER +SET autovacuum_freeze_max_age = 1000050000; -- fail, requires restart +ERROR: parameter "autovacuum_freeze_max_age" cannot be changed without restarting the server +RESET autovacuum_freeze_max_age; -- fail, requires restart +ERROR: parameter "autovacuum_freeze_max_age" cannot be changed without restarting the server +ALTER SYSTEM SET autovacuum_freeze_max_age = 1000050000; -- ok +ALTER SYSTEM RESET autovacuum_freeze_max_age; -- ok +ALTER SYSTEM SET config_file = '/usr/local/data/postgresql.conf'; -- fail, cannot be changed +ERROR: parameter "config_file" cannot be changed +ALTER SYSTEM RESET config_file; -- fail, cannot be changed +ERROR: parameter "config_file" cannot be changed +-- PGC_SIGHUP +SET autovacuum = OFF; -- fail, requires reload +ERROR: parameter "autovacuum" cannot be changed now +RESET autovacuum; -- fail, requires reload +ERROR: parameter "autovacuum" cannot be changed now +ALTER SYSTEM SET autovacuum = OFF; -- ok +ALTER SYSTEM RESET autovacuum; -- ok +-- PGC_SUSET +SET lc_messages = 'C'; -- ok +RESET lc_messages; -- ok +ALTER SYSTEM SET lc_messages = 'C'; -- ok +ALTER SYSTEM RESET lc_messages; -- ok +-- PGC_SU_BACKEND +SET jit_debugging_support = OFF; -- fail, cannot be set after connection start +ERROR: parameter "jit_debugging_support" cannot be set after connection start +RESET jit_debugging_support; -- fail, cannot be set after connection start +ERROR: parameter "jit_debugging_support" cannot be set after connection start +ALTER SYSTEM SET jit_debugging_support = OFF; -- ok +ALTER SYSTEM RESET jit_debugging_support; -- ok +-- PGC_USERSET +SET DateStyle = 'ISO, MDY'; -- ok +RESET DateStyle; -- ok +ALTER SYSTEM SET DateStyle = 'ISO, MDY'; -- ok +ALTER SYSTEM RESET DateStyle; -- ok +ALTER SYSTEM SET ssl_renegotiation_limit = 0; -- fail, cannot be changed +ERROR: parameter "ssl_renegotiation_limit" cannot be changed +ALTER SYSTEM RESET ssl_renegotiation_limit; -- fail, cannot be changed +ERROR: parameter "ssl_renegotiation_limit" cannot be changed +-- Finished testing superuser +-- Create non-superuser with privileges to configure host resource usage +CREATE ROLE regress_host_resource_admin NOSUPERUSER; +-- Revoke privileges not yet granted +REVOKE SET, ALTER SYSTEM ON PARAMETER work_mem FROM regress_host_resource_admin; +REVOKE SET, ALTER SYSTEM ON PARAMETER zero_damaged_pages FROM regress_host_resource_admin; +-- Check the new role does not yet have privileges on parameters +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET, ALTER SYSTEM'); + has_parameter_privilege +------------------------- + f +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET'); + has_parameter_privilege +------------------------- + f +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'ALTER SYSTEM'); + has_parameter_privilege +------------------------- + f +(1 row) + +-- Check inappropriate and nonsense privilege types +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SELECT, UPDATE, CREATE'); +ERROR: unrecognized privilege type: "SELECT" +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'USAGE'); +ERROR: unrecognized privilege type: "USAGE" +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'WHATEVER'); +ERROR: unrecognized privilege type: "WHATEVER" +-- Revoke, grant, and revoke again a SUSET parameter not yet granted +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'SET'); + has_parameter_privilege +------------------------- + f +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'ALTER SYSTEM'); + has_parameter_privilege +------------------------- + f +(1 row) + +REVOKE SET ON PARAMETER zero_damaged_pages FROM regress_host_resource_admin; +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'SET'); + has_parameter_privilege +------------------------- + f +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'ALTER SYSTEM'); + has_parameter_privilege +------------------------- + f +(1 row) + +GRANT SET ON PARAMETER zero_damaged_pages TO regress_host_resource_admin; +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'SET'); + has_parameter_privilege +------------------------- + t +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'ALTER SYSTEM'); + has_parameter_privilege +------------------------- + f +(1 row) + +REVOKE SET ON PARAMETER zero_damaged_pages FROM regress_host_resource_admin; +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'SET'); + has_parameter_privilege +------------------------- + f +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'ALTER SYSTEM'); + has_parameter_privilege +------------------------- + f +(1 row) + +-- Revoke, grant, and revoke again a USERSET parameter not yet granted +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET'); + has_parameter_privilege +------------------------- + f +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'ALTER SYSTEM'); + has_parameter_privilege +------------------------- + f +(1 row) + +REVOKE SET ON PARAMETER work_mem FROM regress_host_resource_admin; +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET'); + has_parameter_privilege +------------------------- + f +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'ALTER SYSTEM'); + has_parameter_privilege +------------------------- + f +(1 row) + +GRANT SET ON PARAMETER work_mem TO regress_host_resource_admin; +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET'); + has_parameter_privilege +------------------------- + t +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'ALTER SYSTEM'); + has_parameter_privilege +------------------------- + f +(1 row) + +REVOKE SET ON PARAMETER work_mem FROM regress_host_resource_admin; +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET'); + has_parameter_privilege +------------------------- + f +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'ALTER SYSTEM'); + has_parameter_privilege +------------------------- + f +(1 row) + +-- Revoke privileges from a non-existent custom GUC. This should not create +-- entries in the catalog. +REVOKE ALL ON PARAMETER "none.such" FROM regress_host_resource_admin; +SELECT 1 FROM pg_parameter_acl WHERE parname = 'none.such'; + ?column? +---------- +(0 rows) + +-- Grant and then revoke privileges on the non-existent custom GUC. Check that +-- a do-nothing entry is not left in the catalogs after the revoke. +GRANT ALL ON PARAMETER none.such TO regress_host_resource_admin; +SELECT 1 FROM pg_parameter_acl WHERE parname = 'none.such'; + ?column? +---------- + 1 +(1 row) + +REVOKE ALL ON PARAMETER "None.Such" FROM regress_host_resource_admin; +SELECT 1 FROM pg_parameter_acl WHERE parname = 'none.such'; + ?column? +---------- +(0 rows) + +-- Can't grant on a non-existent core GUC. +GRANT ALL ON PARAMETER no_such_guc TO regress_host_resource_admin; -- fail +ERROR: invalid parameter name "no_such_guc" +-- Initially there are no privileges and no catalog entry for this GUC. +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET'); + has_parameter_privilege +------------------------- + f +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'ALTER SYSTEM'); + has_parameter_privilege +------------------------- + f +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET, ALTER SYSTEM'); + has_parameter_privilege +------------------------- + f +(1 row) + +SELECT 1 FROM pg_parameter_acl WHERE parname = 'enable_material'; + ?column? +---------- +(0 rows) + +-- GRANT SET creates an entry: +GRANT SET ON PARAMETER enable_material TO PUBLIC; +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET'); + has_parameter_privilege +------------------------- + t +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'ALTER SYSTEM'); + has_parameter_privilege +------------------------- + f +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET, ALTER SYSTEM'); + has_parameter_privilege +------------------------- + t +(1 row) + +SELECT 1 FROM pg_parameter_acl WHERE parname = 'enable_material'; + ?column? +---------- + 1 +(1 row) + +-- Now grant ALTER SYSTEM: +GRANT ALL ON PARAMETER enable_material TO PUBLIC; +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET'); + has_parameter_privilege +------------------------- + t +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'ALTER SYSTEM'); + has_parameter_privilege +------------------------- + t +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET, ALTER SYSTEM'); + has_parameter_privilege +------------------------- + t +(1 row) + +SELECT 1 FROM pg_parameter_acl WHERE parname = 'enable_material'; + ?column? +---------- + 1 +(1 row) + +-- REVOKE ALTER SYSTEM brings us back to just the SET privilege: +REVOKE ALTER SYSTEM ON PARAMETER enable_material FROM PUBLIC; +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET'); + has_parameter_privilege +------------------------- + t +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'ALTER SYSTEM'); + has_parameter_privilege +------------------------- + f +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET, ALTER SYSTEM'); + has_parameter_privilege +------------------------- + t +(1 row) + +SELECT 1 FROM pg_parameter_acl WHERE parname = 'enable_material'; + ?column? +---------- + 1 +(1 row) + +-- And this should remove the entry altogether: +REVOKE SET ON PARAMETER enable_material FROM PUBLIC; +SELECT 1 FROM pg_parameter_acl WHERE parname = 'enable_material'; + ?column? +---------- +(0 rows) + +-- Grant privileges on parameters to the new non-superuser role +GRANT SET, ALTER SYSTEM ON PARAMETER + autovacuum_work_mem, hash_mem_multiplier, max_stack_depth, + shared_buffers, temp_file_limit, work_mem +TO regress_host_resource_admin; +-- Check the new role now has privilges on parameters +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET, ALTER SYSTEM'); + has_parameter_privilege +------------------------- + t +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET'); + has_parameter_privilege +------------------------- + t +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'ALTER SYSTEM'); + has_parameter_privilege +------------------------- + t +(1 row) + +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET WITH GRANT OPTION, ALTER SYSTEM WITH GRANT OPTION'); + has_parameter_privilege +------------------------- + f +(1 row) + +-- Check again the inappropriate and nonsense privilege types. The prior +-- similar check was performed before any entry for work_mem existed. +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SELECT, UPDATE, CREATE'); +ERROR: unrecognized privilege type: "SELECT" +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'USAGE'); +ERROR: unrecognized privilege type: "USAGE" +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'WHATEVER'); +ERROR: unrecognized privilege type: "WHATEVER" +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'WHATEVER WITH GRANT OPTION'); +ERROR: unrecognized privilege type: "WHATEVER WITH GRANT OPTION" +-- Check other function signatures +SELECT has_parameter_privilege((SELECT oid FROM pg_catalog.pg_authid WHERE rolname = 'regress_host_resource_admin'), + 'max_stack_depth', + 'SET'); + has_parameter_privilege +------------------------- + t +(1 row) + +SELECT has_parameter_privilege('hash_mem_multiplier', 'set'); + has_parameter_privilege +------------------------- + t +(1 row) + +-- Check object identity functions +SELECT pg_describe_object(tableoid, oid, 0) +FROM pg_parameter_acl WHERE parname = 'work_mem'; + pg_describe_object +-------------------- + parameter work_mem +(1 row) + +SELECT pg_identify_object(tableoid, oid, 0) +FROM pg_parameter_acl WHERE parname = 'work_mem'; + pg_identify_object +------------------------------ + ("parameter ACL",,,work_mem) +(1 row) + +SELECT pg_identify_object_as_address(tableoid, oid, 0) +FROM pg_parameter_acl WHERE parname = 'work_mem'; + pg_identify_object_as_address +--------------------------------- + ("parameter ACL",{work_mem},{}) +(1 row) + +SELECT classid::regclass, + (SELECT parname FROM pg_parameter_acl WHERE oid = goa.objid) AS parname, + objsubid +FROM pg_get_object_address('parameter ACL', '{work_mem}', '{}') goa; + classid | parname | objsubid +------------------+----------+---------- + pg_parameter_acl | work_mem | 0 +(1 row) + +-- Perform some operations as user 'regress_host_resource_admin' +SET SESSION AUTHORIZATION regress_host_resource_admin; +ALTER SYSTEM SET autovacuum_work_mem = 32; -- ok, privileges have been granted +ALTER SYSTEM SET ignore_system_indexes = OFF; -- fail, insufficient privileges +ERROR: permission denied to set parameter "ignore_system_indexes" +ALTER SYSTEM RESET autovacuum_multixact_freeze_max_age; -- fail, insufficient privileges +ERROR: permission denied to set parameter "autovacuum_multixact_freeze_max_age" +SET jit_provider = 'llvmjit'; -- fail, insufficient privileges +ERROR: parameter "jit_provider" cannot be changed without restarting the server +SELECT set_config ('jit_provider', 'llvmjit', true); -- fail, insufficient privileges +ERROR: parameter "jit_provider" cannot be changed without restarting the server +ALTER SYSTEM SET shared_buffers = 50; -- ok +ALTER SYSTEM RESET shared_buffers; -- ok +SET autovacuum_work_mem = 50; -- cannot be changed now +ERROR: parameter "autovacuum_work_mem" cannot be changed now +ALTER SYSTEM RESET temp_file_limit; -- ok +SET TimeZone = 'Europe/Helsinki'; -- ok +RESET TimeZone; -- ok +SET max_stack_depth = 2048; -- ok, privileges have been granted +RESET max_stack_depth; -- ok, privileges have been granted +ALTER SYSTEM SET max_stack_depth = 2048; -- ok, privileges have been granted +ALTER SYSTEM RESET max_stack_depth; -- ok, privileges have been granted +SET lc_messages = 'C'; -- fail, insufficient privileges +ERROR: permission denied to set parameter "lc_messages" +RESET lc_messages; -- fail, insufficient privileges +ERROR: permission denied to set parameter "lc_messages" +ALTER SYSTEM SET lc_messages = 'C'; -- fail, insufficient privileges +ERROR: permission denied to set parameter "lc_messages" +ALTER SYSTEM RESET lc_messages; -- fail, insufficient privileges +ERROR: permission denied to set parameter "lc_messages" +SELECT set_config ('temp_buffers', '8192', false); -- ok + set_config +------------ + 64MB +(1 row) + +ALTER SYSTEM RESET autovacuum_work_mem; -- ok, privileges have been granted +ALTER SYSTEM RESET ALL; -- fail, insufficient privileges +ERROR: permission denied to perform ALTER SYSTEM RESET ALL +-- Check dropping/revoking behavior +SET SESSION AUTHORIZATION regress_admin; +DROP ROLE regress_host_resource_admin; -- fail, privileges remain +ERROR: role "regress_host_resource_admin" cannot be dropped because some objects depend on it +DETAIL: privileges for parameter autovacuum_work_mem +privileges for parameter hash_mem_multiplier +privileges for parameter max_stack_depth +privileges for parameter shared_buffers +privileges for parameter temp_file_limit +privileges for parameter work_mem +-- Use "revoke" to remove the privileges and allow the role to be dropped +REVOKE SET, ALTER SYSTEM ON PARAMETER + autovacuum_work_mem, hash_mem_multiplier, max_stack_depth, + shared_buffers, temp_file_limit, work_mem +FROM regress_host_resource_admin; +DROP ROLE regress_host_resource_admin; -- ok +-- Try that again, but use "drop owned by" instead of "revoke" +CREATE ROLE regress_host_resource_admin NOSUPERUSER; +SET SESSION AUTHORIZATION regress_host_resource_admin; +ALTER SYSTEM SET autovacuum_work_mem = 32; -- fail, privileges not yet granted +ERROR: permission denied to set parameter "autovacuum_work_mem" +SET SESSION AUTHORIZATION regress_admin; +GRANT SET, ALTER SYSTEM ON PARAMETER + autovacuum_work_mem, hash_mem_multiplier, max_stack_depth, + shared_buffers, temp_file_limit, work_mem +TO regress_host_resource_admin; +DROP ROLE regress_host_resource_admin; -- fail, privileges remain +ERROR: role "regress_host_resource_admin" cannot be dropped because some objects depend on it +DETAIL: privileges for parameter autovacuum_work_mem +privileges for parameter hash_mem_multiplier +privileges for parameter max_stack_depth +privileges for parameter shared_buffers +privileges for parameter temp_file_limit +privileges for parameter work_mem +DROP OWNED BY regress_host_resource_admin RESTRICT; -- cascade should not be needed +SET SESSION AUTHORIZATION regress_host_resource_admin; +ALTER SYSTEM SET autovacuum_work_mem = 32; -- fail, "drop owned" has dropped privileges +ERROR: permission denied to set parameter "autovacuum_work_mem" +SET SESSION AUTHORIZATION regress_admin; +DROP ROLE regress_host_resource_admin; -- ok +-- Check that "reassign owned" doesn't affect privileges +CREATE ROLE regress_host_resource_admin NOSUPERUSER; +CREATE ROLE regress_host_resource_newadmin NOSUPERUSER; +GRANT SET, ALTER SYSTEM ON PARAMETER + autovacuum_work_mem, hash_mem_multiplier, max_stack_depth, + shared_buffers, temp_file_limit, work_mem +TO regress_host_resource_admin; +REASSIGN OWNED BY regress_host_resource_admin TO regress_host_resource_newadmin; +SET SESSION AUTHORIZATION regress_host_resource_admin; +ALTER SYSTEM SET autovacuum_work_mem = 32; -- ok, "reassign owned" did not change privileges +ALTER SYSTEM RESET autovacuum_work_mem; -- ok +SET SESSION AUTHORIZATION regress_admin; +DROP ROLE regress_host_resource_admin; -- fail, privileges remain +ERROR: role "regress_host_resource_admin" cannot be dropped because some objects depend on it +DETAIL: privileges for parameter autovacuum_work_mem +privileges for parameter hash_mem_multiplier +privileges for parameter max_stack_depth +privileges for parameter shared_buffers +privileges for parameter temp_file_limit +privileges for parameter work_mem +DROP ROLE regress_host_resource_newadmin; -- ok, nothing was transferred +-- Use "drop owned by" so we can drop the role +DROP OWNED BY regress_host_resource_admin; -- ok +DROP ROLE regress_host_resource_admin; -- ok +-- Clean up +RESET SESSION AUTHORIZATION; +DROP ROLE regress_admin; -- ok diff --git a/src/test/modules/unsafe_tests/sql/guc_privs.sql b/src/test/modules/unsafe_tests/sql/guc_privs.sql new file mode 100644 index 0000000000..12b22548f0 --- /dev/null +++ b/src/test/modules/unsafe_tests/sql/guc_privs.sql @@ -0,0 +1,237 @@ +-- +-- Tests for privileges on GUCs. +-- This is unsafe because changes will affect other databases in the cluster. +-- + +-- Test with a superuser role. +CREATE ROLE regress_admin SUPERUSER; + +-- Perform operations as user 'regress_admin'. +SET SESSION AUTHORIZATION regress_admin; + +-- PGC_BACKEND +SET ignore_system_indexes = OFF; -- fail, cannot be set after connection start +RESET ignore_system_indexes; -- fail, cannot be set after connection start +ALTER SYSTEM SET ignore_system_indexes = OFF; -- ok +ALTER SYSTEM RESET ignore_system_indexes; -- ok +-- PGC_INTERNAL +SET block_size = 50; -- fail, cannot be changed +RESET block_size; -- fail, cannot be changed +ALTER SYSTEM SET block_size = 50; -- fail, cannot be changed +ALTER SYSTEM RESET block_size; -- fail, cannot be changed +-- PGC_POSTMASTER +SET autovacuum_freeze_max_age = 1000050000; -- fail, requires restart +RESET autovacuum_freeze_max_age; -- fail, requires restart +ALTER SYSTEM SET autovacuum_freeze_max_age = 1000050000; -- ok +ALTER SYSTEM RESET autovacuum_freeze_max_age; -- ok +ALTER SYSTEM SET config_file = '/usr/local/data/postgresql.conf'; -- fail, cannot be changed +ALTER SYSTEM RESET config_file; -- fail, cannot be changed +-- PGC_SIGHUP +SET autovacuum = OFF; -- fail, requires reload +RESET autovacuum; -- fail, requires reload +ALTER SYSTEM SET autovacuum = OFF; -- ok +ALTER SYSTEM RESET autovacuum; -- ok +-- PGC_SUSET +SET lc_messages = 'C'; -- ok +RESET lc_messages; -- ok +ALTER SYSTEM SET lc_messages = 'C'; -- ok +ALTER SYSTEM RESET lc_messages; -- ok +-- PGC_SU_BACKEND +SET jit_debugging_support = OFF; -- fail, cannot be set after connection start +RESET jit_debugging_support; -- fail, cannot be set after connection start +ALTER SYSTEM SET jit_debugging_support = OFF; -- ok +ALTER SYSTEM RESET jit_debugging_support; -- ok +-- PGC_USERSET +SET DateStyle = 'ISO, MDY'; -- ok +RESET DateStyle; -- ok +ALTER SYSTEM SET DateStyle = 'ISO, MDY'; -- ok +ALTER SYSTEM RESET DateStyle; -- ok +ALTER SYSTEM SET ssl_renegotiation_limit = 0; -- fail, cannot be changed +ALTER SYSTEM RESET ssl_renegotiation_limit; -- fail, cannot be changed +-- Finished testing superuser + +-- Create non-superuser with privileges to configure host resource usage +CREATE ROLE regress_host_resource_admin NOSUPERUSER; +-- Revoke privileges not yet granted +REVOKE SET, ALTER SYSTEM ON PARAMETER work_mem FROM regress_host_resource_admin; +REVOKE SET, ALTER SYSTEM ON PARAMETER zero_damaged_pages FROM regress_host_resource_admin; +-- Check the new role does not yet have privileges on parameters +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET, ALTER SYSTEM'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'ALTER SYSTEM'); +-- Check inappropriate and nonsense privilege types +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SELECT, UPDATE, CREATE'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'USAGE'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'WHATEVER'); +-- Revoke, grant, and revoke again a SUSET parameter not yet granted +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'SET'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'ALTER SYSTEM'); +REVOKE SET ON PARAMETER zero_damaged_pages FROM regress_host_resource_admin; +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'SET'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'ALTER SYSTEM'); +GRANT SET ON PARAMETER zero_damaged_pages TO regress_host_resource_admin; +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'SET'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'ALTER SYSTEM'); +REVOKE SET ON PARAMETER zero_damaged_pages FROM regress_host_resource_admin; +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'SET'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'zero_damaged_pages', 'ALTER SYSTEM'); +-- Revoke, grant, and revoke again a USERSET parameter not yet granted +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'ALTER SYSTEM'); +REVOKE SET ON PARAMETER work_mem FROM regress_host_resource_admin; +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'ALTER SYSTEM'); +GRANT SET ON PARAMETER work_mem TO regress_host_resource_admin; +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'ALTER SYSTEM'); +REVOKE SET ON PARAMETER work_mem FROM regress_host_resource_admin; +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'ALTER SYSTEM'); + +-- Revoke privileges from a non-existent custom GUC. This should not create +-- entries in the catalog. +REVOKE ALL ON PARAMETER "none.such" FROM regress_host_resource_admin; +SELECT 1 FROM pg_parameter_acl WHERE parname = 'none.such'; +-- Grant and then revoke privileges on the non-existent custom GUC. Check that +-- a do-nothing entry is not left in the catalogs after the revoke. +GRANT ALL ON PARAMETER none.such TO regress_host_resource_admin; +SELECT 1 FROM pg_parameter_acl WHERE parname = 'none.such'; +REVOKE ALL ON PARAMETER "None.Such" FROM regress_host_resource_admin; +SELECT 1 FROM pg_parameter_acl WHERE parname = 'none.such'; +-- Can't grant on a non-existent core GUC. +GRANT ALL ON PARAMETER no_such_guc TO regress_host_resource_admin; -- fail + +-- Initially there are no privileges and no catalog entry for this GUC. +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'ALTER SYSTEM'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET, ALTER SYSTEM'); +SELECT 1 FROM pg_parameter_acl WHERE parname = 'enable_material'; +-- GRANT SET creates an entry: +GRANT SET ON PARAMETER enable_material TO PUBLIC; +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'ALTER SYSTEM'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET, ALTER SYSTEM'); +SELECT 1 FROM pg_parameter_acl WHERE parname = 'enable_material'; +-- Now grant ALTER SYSTEM: +GRANT ALL ON PARAMETER enable_material TO PUBLIC; +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'ALTER SYSTEM'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET, ALTER SYSTEM'); +SELECT 1 FROM pg_parameter_acl WHERE parname = 'enable_material'; +-- REVOKE ALTER SYSTEM brings us back to just the SET privilege: +REVOKE ALTER SYSTEM ON PARAMETER enable_material FROM PUBLIC; +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'ALTER SYSTEM'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET, ALTER SYSTEM'); +SELECT 1 FROM pg_parameter_acl WHERE parname = 'enable_material'; +-- And this should remove the entry altogether: +REVOKE SET ON PARAMETER enable_material FROM PUBLIC; +SELECT 1 FROM pg_parameter_acl WHERE parname = 'enable_material'; + +-- Grant privileges on parameters to the new non-superuser role +GRANT SET, ALTER SYSTEM ON PARAMETER + autovacuum_work_mem, hash_mem_multiplier, max_stack_depth, + shared_buffers, temp_file_limit, work_mem +TO regress_host_resource_admin; +-- Check the new role now has privilges on parameters +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET, ALTER SYSTEM'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'ALTER SYSTEM'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SET WITH GRANT OPTION, ALTER SYSTEM WITH GRANT OPTION'); +-- Check again the inappropriate and nonsense privilege types. The prior +-- similar check was performed before any entry for work_mem existed. +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'SELECT, UPDATE, CREATE'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'USAGE'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'WHATEVER'); +SELECT has_parameter_privilege('regress_host_resource_admin', 'work_mem', 'WHATEVER WITH GRANT OPTION'); + +-- Check other function signatures +SELECT has_parameter_privilege((SELECT oid FROM pg_catalog.pg_authid WHERE rolname = 'regress_host_resource_admin'), + 'max_stack_depth', + 'SET'); +SELECT has_parameter_privilege('hash_mem_multiplier', 'set'); + +-- Check object identity functions +SELECT pg_describe_object(tableoid, oid, 0) +FROM pg_parameter_acl WHERE parname = 'work_mem'; +SELECT pg_identify_object(tableoid, oid, 0) +FROM pg_parameter_acl WHERE parname = 'work_mem'; +SELECT pg_identify_object_as_address(tableoid, oid, 0) +FROM pg_parameter_acl WHERE parname = 'work_mem'; +SELECT classid::regclass, + (SELECT parname FROM pg_parameter_acl WHERE oid = goa.objid) AS parname, + objsubid +FROM pg_get_object_address('parameter ACL', '{work_mem}', '{}') goa; + +-- Perform some operations as user 'regress_host_resource_admin' +SET SESSION AUTHORIZATION regress_host_resource_admin; +ALTER SYSTEM SET autovacuum_work_mem = 32; -- ok, privileges have been granted +ALTER SYSTEM SET ignore_system_indexes = OFF; -- fail, insufficient privileges +ALTER SYSTEM RESET autovacuum_multixact_freeze_max_age; -- fail, insufficient privileges +SET jit_provider = 'llvmjit'; -- fail, insufficient privileges +SELECT set_config ('jit_provider', 'llvmjit', true); -- fail, insufficient privileges +ALTER SYSTEM SET shared_buffers = 50; -- ok +ALTER SYSTEM RESET shared_buffers; -- ok +SET autovacuum_work_mem = 50; -- cannot be changed now +ALTER SYSTEM RESET temp_file_limit; -- ok +SET TimeZone = 'Europe/Helsinki'; -- ok +RESET TimeZone; -- ok +SET max_stack_depth = 2048; -- ok, privileges have been granted +RESET max_stack_depth; -- ok, privileges have been granted +ALTER SYSTEM SET max_stack_depth = 2048; -- ok, privileges have been granted +ALTER SYSTEM RESET max_stack_depth; -- ok, privileges have been granted +SET lc_messages = 'C'; -- fail, insufficient privileges +RESET lc_messages; -- fail, insufficient privileges +ALTER SYSTEM SET lc_messages = 'C'; -- fail, insufficient privileges +ALTER SYSTEM RESET lc_messages; -- fail, insufficient privileges +SELECT set_config ('temp_buffers', '8192', false); -- ok +ALTER SYSTEM RESET autovacuum_work_mem; -- ok, privileges have been granted +ALTER SYSTEM RESET ALL; -- fail, insufficient privileges + +-- Check dropping/revoking behavior +SET SESSION AUTHORIZATION regress_admin; +DROP ROLE regress_host_resource_admin; -- fail, privileges remain +-- Use "revoke" to remove the privileges and allow the role to be dropped +REVOKE SET, ALTER SYSTEM ON PARAMETER + autovacuum_work_mem, hash_mem_multiplier, max_stack_depth, + shared_buffers, temp_file_limit, work_mem +FROM regress_host_resource_admin; +DROP ROLE regress_host_resource_admin; -- ok + +-- Try that again, but use "drop owned by" instead of "revoke" +CREATE ROLE regress_host_resource_admin NOSUPERUSER; +SET SESSION AUTHORIZATION regress_host_resource_admin; +ALTER SYSTEM SET autovacuum_work_mem = 32; -- fail, privileges not yet granted +SET SESSION AUTHORIZATION regress_admin; +GRANT SET, ALTER SYSTEM ON PARAMETER + autovacuum_work_mem, hash_mem_multiplier, max_stack_depth, + shared_buffers, temp_file_limit, work_mem +TO regress_host_resource_admin; +DROP ROLE regress_host_resource_admin; -- fail, privileges remain +DROP OWNED BY regress_host_resource_admin RESTRICT; -- cascade should not be needed +SET SESSION AUTHORIZATION regress_host_resource_admin; +ALTER SYSTEM SET autovacuum_work_mem = 32; -- fail, "drop owned" has dropped privileges +SET SESSION AUTHORIZATION regress_admin; +DROP ROLE regress_host_resource_admin; -- ok + +-- Check that "reassign owned" doesn't affect privileges +CREATE ROLE regress_host_resource_admin NOSUPERUSER; +CREATE ROLE regress_host_resource_newadmin NOSUPERUSER; +GRANT SET, ALTER SYSTEM ON PARAMETER + autovacuum_work_mem, hash_mem_multiplier, max_stack_depth, + shared_buffers, temp_file_limit, work_mem +TO regress_host_resource_admin; +REASSIGN OWNED BY regress_host_resource_admin TO regress_host_resource_newadmin; +SET SESSION AUTHORIZATION regress_host_resource_admin; +ALTER SYSTEM SET autovacuum_work_mem = 32; -- ok, "reassign owned" did not change privileges +ALTER SYSTEM RESET autovacuum_work_mem; -- ok +SET SESSION AUTHORIZATION regress_admin; +DROP ROLE regress_host_resource_admin; -- fail, privileges remain +DROP ROLE regress_host_resource_newadmin; -- ok, nothing was transferred +-- Use "drop owned by" so we can drop the role +DROP OWNED BY regress_host_resource_admin; -- ok +DROP ROLE regress_host_resource_admin; -- ok + +-- Clean up +RESET SESSION AUTHORIZATION; +DROP ROLE regress_admin; -- ok From 14d3f24fa8a21f8a7e66f1fc60253a1e11410bf3 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Wed, 6 Apr 2022 13:48:26 -0400 Subject: [PATCH 392/772] Further improve jsonb_sqljson parallel test Instead of using a very large table, use some settings to encourage use of parallelism. Also, drop the table so it doesn't upset the recovery test. per suggestion from Andres Freund Discussion: https://postgr.es/m/20220406022118.3ocqvhxr6kciw5am@alap3.anarazel.de --- src/test/regress/expected/jsonb_sqljson.out | 23 ++++++++++++++------- src/test/regress/sql/jsonb_sqljson.sql | 14 ++++++++++++- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/test/regress/expected/jsonb_sqljson.out b/src/test/regress/expected/jsonb_sqljson.out index 230cfd3bfd..28338b4d19 100644 --- a/src/test/regress/expected/jsonb_sqljson.out +++ b/src/test/regress/expected/jsonb_sqljson.out @@ -2090,7 +2090,13 @@ LINE 1: SELECT * FROM JSON_TABLE(jsonb '{"a": 123}', '$' || '.' || '... -- Test parallel JSON_VALUE() CREATE UNLOGGED TABLE test_parallel_jsonb_value AS SELECT i::text::jsonb AS js -FROM generate_series(1, 500000) i; +FROM generate_series(1, 50000) i; +-- encourage use of parallel plans +set parallel_setup_cost=0; +set parallel_tuple_cost=0; +set min_parallel_table_scan_size=0; +set max_parallel_workers_per_gather=4; +set parallel_leader_participation = off; -- Should be non-parallel due to subtransactions EXPLAIN (COSTS OFF) SELECT sum(JSON_VALUE(js, '$' RETURNING numeric)) FROM test_parallel_jsonb_value; @@ -2101,9 +2107,9 @@ SELECT sum(JSON_VALUE(js, '$' RETURNING numeric)) FROM test_parallel_jsonb_value (2 rows) SELECT sum(JSON_VALUE(js, '$' RETURNING numeric)) FROM test_parallel_jsonb_value; - sum --------------- - 125000250000 + sum +------------ + 1250025000 (1 row) -- Should be parallel @@ -2113,14 +2119,15 @@ SELECT sum(JSON_VALUE(js, '$' RETURNING numeric ERROR ON ERROR)) FROM test_paral ------------------------------------------------------------------ Finalize Aggregate -> Gather - Workers Planned: 2 + Workers Planned: 4 -> Partial Aggregate -> Parallel Seq Scan on test_parallel_jsonb_value (5 rows) SELECT sum(JSON_VALUE(js, '$' RETURNING numeric ERROR ON ERROR)) FROM test_parallel_jsonb_value; - sum --------------- - 125000250000 + sum +------------ + 1250025000 (1 row) +DROP TABLE test_parallel_jsonb_value; diff --git a/src/test/regress/sql/jsonb_sqljson.sql b/src/test/regress/sql/jsonb_sqljson.sql index 866c708a4d..ba1895d42d 100644 --- a/src/test/regress/sql/jsonb_sqljson.sql +++ b/src/test/regress/sql/jsonb_sqljson.sql @@ -948,9 +948,19 @@ SELECT JSON_QUERY(jsonb '{"a": 123}', 'error' || ' ' || 'error'); SELECT * FROM JSON_TABLE(jsonb '{"a": 123}', '$' || '.' || 'a' COLUMNS (foo int)); -- Test parallel JSON_VALUE() + + CREATE UNLOGGED TABLE test_parallel_jsonb_value AS SELECT i::text::jsonb AS js -FROM generate_series(1, 500000) i; +FROM generate_series(1, 50000) i; + + +-- encourage use of parallel plans +set parallel_setup_cost=0; +set parallel_tuple_cost=0; +set min_parallel_table_scan_size=0; +set max_parallel_workers_per_gather=4; +set parallel_leader_participation = off; -- Should be non-parallel due to subtransactions EXPLAIN (COSTS OFF) @@ -961,3 +971,5 @@ SELECT sum(JSON_VALUE(js, '$' RETURNING numeric)) FROM test_parallel_jsonb_value EXPLAIN (COSTS OFF) SELECT sum(JSON_VALUE(js, '$' RETURNING numeric ERROR ON ERROR)) FROM test_parallel_jsonb_value; SELECT sum(JSON_VALUE(js, '$' RETURNING numeric ERROR ON ERROR)) FROM test_parallel_jsonb_value; + +DROP TABLE test_parallel_jsonb_value; From 39969e2a1e4d7f5a37f3ef37d53bbfe171e7d77a Mon Sep 17 00:00:00 2001 From: Stephen Frost Date: Wed, 6 Apr 2022 14:41:03 -0400 Subject: [PATCH 393/772] Remove exclusive backup mode Exclusive-mode backups have been deprecated since 9.6 (when non-exclusive backups were introduced) due to the issues they can cause should the system crash while one is running and generally because non-exclusive provides a much better interface. Further, exclusive backup mode wasn't really being tested (nor was most of the related code- like being able to log in just to stop an exclusive backup and the bits of the state machine related to that) and having to possibly deal with an exclusive backup and the backup_label file existing during pg_basebackup, pg_rewind, etc, added other complexities that we are better off without. This patch removes the exclusive backup mode, the various special cases for dealing with it, and greatly simplifies the online backup code and documentation. Authors: David Steele, Nathan Bossart Reviewed-by: Chapman Flack Discussion: https://postgr.es/m/ac7339ca-3718-3c93-929f-99e725d1172c@pgmasters.net https://postgr.es/m/CAHg+QDfiM+WU61tF6=nPZocMZvHDzCK47Kneyb0ZRULYzV5sKQ@mail.gmail.com --- doc/src/sgml/backup.sgml | 241 +------- doc/src/sgml/func.sgml | 111 +--- doc/src/sgml/high-availability.sgml | 6 +- doc/src/sgml/monitoring.sgml | 4 +- doc/src/sgml/ref/pg_ctl-ref.sgml | 6 +- doc/src/sgml/ref/pgupgrade.sgml | 2 +- doc/src/sgml/runtime.sgml | 8 +- src/backend/access/transam/xlog.c | 519 +++--------------- src/backend/access/transam/xlogfuncs.c | 253 ++------- src/backend/access/transam/xlogrecovery.c | 20 +- src/backend/catalog/system_functions.sql | 18 +- src/backend/postmaster/postmaster.c | 75 +-- src/backend/replication/basebackup.c | 20 +- src/backend/utils/init/postinit.c | 18 - src/bin/pg_basebackup/t/010_pg_basebackup.pl | 4 + src/bin/pg_ctl/pg_ctl.c | 30 - src/bin/pg_rewind/filemap.c | 6 +- src/include/access/xlog.h | 7 +- src/include/catalog/pg_control.h | 4 +- src/include/catalog/pg_proc.dat | 28 +- src/include/libpq/libpq-be.h | 3 +- src/include/miscadmin.h | 4 - src/test/perl/PostgreSQL/Test/Cluster.pm | 56 +- .../t/010_logical_decoding_timelines.pl | 4 +- 24 files changed, 247 insertions(+), 1200 deletions(-) diff --git a/doc/src/sgml/backup.sgml b/doc/src/sgml/backup.sgml index 0d69851bb1..fc2ec68758 100644 --- a/doc/src/sgml/backup.sgml +++ b/doc/src/sgml/backup.sgml @@ -857,18 +857,9 @@ test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/0 sequence, and that the success of a step is verified before proceeding to the next step. - - Low level base backups can be made in a non-exclusive or an exclusive - way. The non-exclusive method is recommended and the exclusive one is - deprecated and will eventually be removed. - - - - Making a Non-Exclusive Low-Level Backup - A non-exclusive low level backup is one that allows other - concurrent backups to be running (both those started using - the same backup API and those started using + Multiple backups are able to be run concurrently (both those + started using this backup API and those started using ). @@ -881,34 +872,30 @@ test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/0 Connect to the server (it does not matter which database) as a user with - rights to run pg_start_backup (superuser, or a user who has been granted + rights to run pg_backup_start (superuser, or a user who has been granted EXECUTE on the function) and issue the command: -SELECT pg_start_backup('label', false, false); +SELECT pg_backup_start(label => 'label', fast => false); where label is any string you want to use to uniquely identify this backup operation. The connection - calling pg_start_backup must be maintained until the end of + calling pg_backup_start must be maintained until the end of the backup, or the backup will be automatically aborted. - By default, pg_start_backup can take a long time to finish. - This is because it performs a checkpoint, and the I/O - required for the checkpoint will be spread out over a significant - period of time, by default half your inter-checkpoint interval - (see the configuration parameter + Online backups are always started at the beginning of a checkpoint. + By default, pg_backup_start will wait for the next + regularly scheduled checkpoint to complete, which may take a long time (see the + configuration parameters and ). This is - usually what you want, because it minimizes the impact on query - processing. If you want to start the backup as soon as - possible, change the second parameter to true, which will - issue an immediate checkpoint using as much I/O as available. + usually preferrable as it minimizes the impact on the running system. If you + want to start the backup as soon as possible, pass true as + the second parameter to pg_backup_start and it will + request an immediate checkpoint, which will finish as fast as possible using + as much I/O as possible. - - The third parameter being false tells - pg_start_backup to initiate a non-exclusive base backup. - @@ -926,7 +913,7 @@ SELECT pg_start_backup('label', false, false); In the same connection as before, issue the command: -SELECT * FROM pg_stop_backup(false, true); +SELECT * FROM pg_backup_stop(wait_for_archive => true); This terminates backup mode. On a primary, it also performs an automatic switch to the next WAL segment. On a standby, it is not possible to @@ -937,7 +924,7 @@ SELECT * FROM pg_stop_backup(false, true); ready to archive. - The pg_stop_backup will return one row with three + pg_backup_stop will return one row with three values. The second of these fields should be written to a file named backup_label in the root directory of the backup. The third field should be written to a file named @@ -949,14 +936,14 @@ SELECT * FROM pg_stop_backup(false, true); Once the WAL segment files active during the backup are archived, you are - done. The file identified by pg_stop_backup's first return + done. The file identified by pg_backup_stop's first return value is the last segment that is required to form a complete set of backup files. On a primary, if archive_mode is enabled and the wait_for_archive parameter is true, - pg_stop_backup does not return until the last segment has + pg_backup_stop does not return until the last segment has been archived. On a standby, archive_mode must be always in order - for pg_stop_backup to wait. + for pg_backup_stop to wait. Archiving of these files happens automatically since you have already configured archive_library. In most cases this happens quickly, but you are advised to monitor your archive @@ -965,9 +952,9 @@ SELECT * FROM pg_stop_backup(false, true); because of failures of the archive library, it will keep retrying until the archive succeeds and the backup is complete. If you wish to place a time limit on the execution of - pg_stop_backup, set an appropriate + pg_backup_stop, set an appropriate statement_timeout value, but make note that if - pg_stop_backup terminates because of this your backup + pg_backup_stop terminates because of this your backup may not be valid. @@ -975,8 +962,8 @@ SELECT * FROM pg_stop_backup(false, true); required for the backup are successfully archived then the wait_for_archive parameter (which defaults to true) can be set to false to have - pg_stop_backup return as soon as the stop backup record is - written to the WAL. By default, pg_stop_backup will wait + pg_backup_stop return as soon as the stop backup record is + written to the WAL. By default, pg_backup_stop will wait until all WAL has been archived, which can take some time. This option must be used with caution: if WAL archiving is not monitored correctly then the backup might not include all of the WAL files and will @@ -985,142 +972,6 @@ SELECT * FROM pg_stop_backup(false, true); - - - Making an Exclusive Low-Level Backup - - - - The exclusive backup method is deprecated and should be avoided. - Prior to PostgreSQL 9.6, this was the only - low-level method available, but it is now recommended that all users - upgrade their scripts to use non-exclusive backups. - - - - - The process for an exclusive backup is mostly the same as for a - non-exclusive one, but it differs in a few key steps. This type of - backup can only be taken on a primary and does not allow concurrent - backups. Moreover, because it creates a backup label file, as - described below, it can block automatic restart of the primary server - after a crash. On the other hand, the erroneous removal of this - file from a backup or standby is a common mistake, which can result - in serious data corruption. If it is necessary to use this method, - the following steps may be used. - - - - - - Ensure that WAL archiving is enabled and working. - - - - - Connect to the server (it does not matter which database) as a user with - rights to run pg_start_backup (superuser, or a user who has been granted - EXECUTE on the function) and issue the command: - -SELECT pg_start_backup('label'); - - where label is any string you want to use to uniquely - identify this backup operation. - pg_start_backup creates a backup label file, - called backup_label, in the cluster directory with - information about your backup, including the start time and label string. - The function also creates a tablespace map file, - called tablespace_map, in the cluster directory with - information about tablespace symbolic links in pg_tblspc/ if - one or more such link is present. Both files are critical to the - integrity of the backup, should you need to restore from it. - - - - By default, pg_start_backup can take a long time to finish. - This is because it performs a checkpoint, and the I/O - required for the checkpoint will be spread out over a significant - period of time, by default half your inter-checkpoint interval - (see the configuration parameter - ). This is - usually what you want, because it minimizes the impact on query - processing. If you want to start the backup as soon as - possible, use: - -SELECT pg_start_backup('label', true); - - This forces the checkpoint to be done as quickly as possible. - - - - - Perform the backup, using any convenient file-system-backup tool - such as tar or cpio (not - pg_dump or - pg_dumpall). It is neither - necessary nor desirable to stop normal operation of the database - while you do this. See - for things to - consider during this backup. - - - As noted above, if the server crashes during the backup it may not be - possible to restart until the backup_label file has - been manually deleted from the PGDATA directory. Note - that it is very important to never remove the - backup_label file when restoring a backup, because - this will result in corruption. Confusion about when it is appropriate - to remove this file is a common cause of data corruption when using this - method; be very certain that you remove the file only on an existing - primary and never when building a standby or restoring a backup, even if - you are building a standby that will subsequently be promoted to a new - primary. - - - - - Again connect to the database as a user with rights to run - pg_stop_backup (superuser, or a user who has been granted EXECUTE on - the function), and issue the command: - -SELECT pg_stop_backup(); - - This function terminates backup mode and - performs an automatic switch to the next WAL segment. The reason for the - switch is to arrange for the last WAL segment written during the backup - interval to be ready to archive. - - - - - Once the WAL segment files active during the backup are archived, you are - done. The file identified by pg_stop_backup's result is - the last segment that is required to form a complete set of backup files. - If archive_mode is enabled, - pg_stop_backup does not return until the last segment has - been archived. - Archiving of these files happens automatically since you have - already configured archive_command. In most cases this - happens quickly, but you are advised to monitor your archive - system to ensure there are no delays. - If the archive process has fallen behind - because of failures of the archive command, it will keep retrying - until the archive succeeds and the backup is complete. - - - - When using exclusive backup mode, it is absolutely imperative to ensure - that pg_stop_backup completes successfully at the - end of the backup. Even if the backup itself fails, for example due to - lack of disk space, failure to call pg_stop_backup - will leave the server in backup mode indefinitely, causing future backups - to fail and increasing the risk of a restart failure during the time that - backup_label exists. - - - - - Backing Up the Data Directory @@ -1203,8 +1054,8 @@ SELECT pg_stop_backup(); The backup label - file includes the label string you gave to pg_start_backup, - as well as the time at which pg_start_backup was run, and + file includes the label string you gave to pg_backup_start, + as well as the time at which pg_backup_start was run, and the name of the starting WAL file. In case of confusion it is therefore possible to look inside a backup file and determine exactly which backup session the dump file came from. The tablespace map file includes @@ -1218,7 +1069,7 @@ SELECT pg_stop_backup(); It is also possible to make a backup while the server is stopped. In this case, you obviously cannot use - pg_start_backup or pg_stop_backup, and + pg_backup_start or pg_backup_stop, and you will therefore be left to your own devices to keep track of which backup is which and how far back the associated WAL files go. It is generally better to follow the continuous archiving procedure above. @@ -1393,7 +1244,7 @@ restore_command = 'cp /mnt/server/archivedir/%f %p' The stop point must be after the ending time of the base backup, i.e., - the end time of pg_stop_backup. You cannot use a base backup + the end time of pg_backup_stop. You cannot use a base backup to recover to a time when that backup was in progress. (To recover to such a time, you must go back to your previous base backup and roll forward from there.) @@ -1513,44 +1364,6 @@ restore_command = 'cp /mnt/server/archivedir/%f %p' included in the backup automatically, and no special action is required to restore the backup. - - - If more flexibility in copying the backup files is needed, a lower - level process can be used for standalone hot backups as well. - To prepare for low level standalone hot backups, make sure - wal_level is set to - replica or higher, archive_mode to - on, and set up an archive_library that performs - archiving only when a switch file exists. For example: - -archive_library = '' # use shell command -archive_command = 'test ! -f /var/lib/pgsql/backup_in_progress || (test ! -f /var/lib/pgsql/archive/%f && cp %p /var/lib/pgsql/archive/%f)' - - This command will perform archiving when - /var/lib/pgsql/backup_in_progress exists, and otherwise - silently return zero exit status (allowing PostgreSQL - to recycle the unwanted WAL file). - - - - With this preparation, a backup can be taken using a script like the - following: - -touch /var/lib/pgsql/backup_in_progress -psql -c "select pg_start_backup('hot_backup');" -tar -cf /var/lib/pgsql/backup.tar /var/lib/pgsql/data/ -psql -c "select pg_stop_backup();" -rm /var/lib/pgsql/backup_in_progress -tar -rf /var/lib/pgsql/backup.tar /var/lib/pgsql/archive/ - - The switch file /var/lib/pgsql/backup_in_progress is - created first, enabling archiving of completed WAL files to occur. - After the backup the switch file is removed. Archived WAL files are - then added to the backup so that both base backup and all required - WAL files are part of the same tar file. - Please remember to add error handling to your backup scripts. - - diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index bd772eeba1..0cf513100b 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -25618,9 +25618,8 @@ LOG: Grand total: 1651920 bytes in 201 blocks; 622360 free (88 chunks); 1029560 The functions shown in assist in making on-line backups. These functions cannot be executed during recovery (except - non-exclusive pg_start_backup, - non-exclusive pg_stop_backup, - pg_is_in_backup, pg_backup_start_time + pg_backup_start, + pg_backup_stop, and pg_wal_lsn_diff). @@ -25709,13 +25708,12 @@ LOG: Grand total: 1651920 bytes in 201 blocks; 622360 free (88 chunks); 1029560 - pg_start_backup + pg_backup_start - pg_start_backup ( + pg_backup_start ( label text , fast boolean - , exclusive boolean - ) + ) pg_lsn @@ -25724,23 +25722,9 @@ LOG: Grand total: 1651920 bytes in 201 blocks; 622360 free (88 chunks); 1029560 (Typically this would be the name under which the backup dump file will be stored.) If the optional second parameter is given as true, - it specifies executing pg_start_backup as quickly + it specifies executing pg_backup_start as quickly as possible. This forces an immediate checkpoint which will cause a spike in I/O operations, slowing any concurrently executing queries. - The optional third parameter specifies whether to perform an exclusive - or non-exclusive backup (default is exclusive). - - - When used in exclusive mode, this function writes a backup label file - (backup_label) and, if there are any links in - the pg_tblspc/ directory, a tablespace map file - (tablespace_map) into the database cluster's data - directory, then performs a checkpoint, and then returns the backup's - starting write-ahead log location. (The user can ignore this - result value, but it is provided in case it is useful.) When used in - non-exclusive mode, the contents of these files are instead returned - by the pg_stop_backup function, and should be - copied to the backup area by the user. This function is restricted to superusers by default, but other users @@ -25751,11 +25735,10 @@ LOG: Grand total: 1651920 bytes in 201 blocks; 622360 free (88 chunks); 1029560 - pg_stop_backup + pg_backup_stop - pg_stop_backup ( - exclusive boolean - , wait_for_archive boolean + pg_backup_stop ( + wait_for_archive boolean ) record ( lsn pg_lsn, @@ -25763,24 +25746,21 @@ LOG: Grand total: 1651920 bytes in 201 blocks; 622360 free (88 chunks); 1029560 spcmapfile text ) - Finishes performing an exclusive or non-exclusive on-line backup. - The exclusive parameter must match the - previous pg_start_backup call. - In an exclusive backup, pg_stop_backup removes - the backup label file and, if it exists, the tablespace map file - created by pg_start_backup. In a non-exclusive - backup, the desired contents of these files are returned as part of - the result of the function, and should be written to files in the - backup area (not in the data directory). + Finishes performing an on-line backup. The desired contents of the + backup label file and the tablespace map file are returned as part of + the result of the function and must be written to files in the + backup area. These files must not be written to the live data directory + (doing so will cause PostgreSQL to fail to restart in the event of a + crash). - There is an optional second parameter of type boolean. + There is an optional parameter of type boolean. If false, the function will return immediately after the backup is completed, without waiting for WAL to be archived. This behavior is only useful with backup software that independently monitors WAL archiving. Otherwise, WAL required to make the backup consistent might be missing and make the backup useless. By default or when this - parameter is true, pg_stop_backup will wait for + parameter is true, pg_backup_stop will wait for WAL to be archived when archiving is enabled. (On a standby, this means that it will wait only when archive_mode = always. If write activity on the primary is low, @@ -25790,7 +25770,7 @@ LOG: Grand total: 1651920 bytes in 201 blocks; 622360 free (88 chunks); 1029560 When executed on a primary, this function also creates a backup history file in the write-ahead log archive area. The history file - includes the label given to pg_start_backup, the + includes the label given to pg_backup_start, the starting and ending write-ahead log locations for the backup, and the starting and ending times of the backup. After recording the ending location, the current write-ahead log insertion point is automatically @@ -25801,27 +25781,11 @@ LOG: Grand total: 1651920 bytes in 201 blocks; 622360 free (88 chunks); 1029560 The result of the function is a single record. The lsn column holds the backup's ending - write-ahead log location (which again can be ignored). The second and - third columns are NULL when ending an exclusive - backup; after a non-exclusive backup they hold the desired contents of - the label and tablespace map files. - - - This function is restricted to superusers by default, but other users - can be granted EXECUTE to run the function. - - - - - - pg_stop_backup () - pg_lsn - - - Finishes performing an exclusive on-line backup. This simplified - version is equivalent to pg_stop_backup(true, - true), except that it only returns the pg_lsn - result. + write-ahead log location (which again can be ignored). The second + column returns the contents of the backup label file, and the third + column returns the contents of the tablespace map file. These must be + stored as part of the backup and are required as part of the restore + process. This function is restricted to superusers by default, but other users @@ -25829,33 +25793,6 @@ LOG: Grand total: 1651920 bytes in 201 blocks; 622360 free (88 chunks); 1029560 - - - - pg_is_in_backup - - pg_is_in_backup () - boolean - - - Returns true if an on-line exclusive backup is in progress. - - - - - - - pg_backup_start_time - - pg_backup_start_time () - timestamp with time zone - - - Returns the start time of the current on-line exclusive backup if one - is in progress, otherwise NULL. - - - @@ -25953,7 +25890,7 @@ LOG: Grand total: 1651920 bytes in 201 blocks; 622360 free (88 chunks); 1029560 corresponding write-ahead log file name and byte offset from a pg_lsn value. For example: -postgres=# SELECT * FROM pg_walfile_name_offset(pg_stop_backup()); +postgres=# SELECT * FROM pg_walfile_name_offset((pg_backup_stop()).lsn); file_name | file_offset --------------------------+------------- 00000001000000000000000D | 4039624 diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml index 81fa26f985..3247e05666 100644 --- a/doc/src/sgml/high-availability.sgml +++ b/doc/src/sgml/high-availability.sgml @@ -1361,8 +1361,8 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)' If you need to re-create a standby server while transactions are - waiting, make sure that the commands pg_start_backup() and - pg_stop_backup() are run in a session with + waiting, make sure that the commands pg_backup_start() and + pg_backup_stop() are run in a session with synchronous_commit = off, otherwise those requests will wait forever for the standby to appear. @@ -2159,7 +2159,7 @@ HINT: You can then restart the server after making the necessary configuration WAL file control commands will not work during recovery, - e.g., pg_start_backup, pg_switch_wal etc. + e.g., pg_backup_start, pg_switch_wal etc. diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 3b9172f65b..487331c115 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -6674,7 +6674,7 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid, waiting for checkpoint to finish The WAL sender process is currently performing - pg_start_backup to prepare to + pg_backup_start to prepare to take a base backup, and waiting for the start-of-backup checkpoint to finish. @@ -6697,7 +6697,7 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid, waiting for wal archiving to finish The WAL sender process is currently performing - pg_stop_backup to finish the backup, + pg_backup_stop to finish the backup, and waiting for all the WAL files required for the base backup to be successfully archived. If either --wal-method=none or diff --git a/doc/src/sgml/ref/pg_ctl-ref.sgml b/doc/src/sgml/ref/pg_ctl-ref.sgml index 3946fa52ea..46906966eb 100644 --- a/doc/src/sgml/ref/pg_ctl-ref.sgml +++ b/doc/src/sgml/ref/pg_ctl-ref.sgml @@ -186,11 +186,11 @@ PostgreSQL documentation the specified data directory. Three different shutdown methods can be selected with the option. Smart mode disallows new connections, then waits - for all existing clients to disconnect and any online backup to finish. + for all existing clients to disconnect. If the server is in hot standby, recovery and streaming replication will be terminated once all clients have disconnected. - Fast mode (the default) does not wait for clients to disconnect and - will terminate an online backup in progress. All active transactions are + Fast mode (the default) does not wait for clients to disconnect. + All active transactions are rolled back and clients are forcibly disconnected, then the server is shut down. Immediate mode will abort all server processes immediately, without a clean shutdown. This choice diff --git a/doc/src/sgml/ref/pgupgrade.sgml b/doc/src/sgml/ref/pgupgrade.sgml index 729c886ac0..3fbe141456 100644 --- a/doc/src/sgml/ref/pgupgrade.sgml +++ b/doc/src/sgml/ref/pgupgrade.sgml @@ -618,7 +618,7 @@ rsync --archive --delete --hard-links --size-only --no-inc-recursive /vol1/pg_tb Configure the servers for log shipping. (You do not need to run - pg_start_backup() and pg_stop_backup() + pg_backup_start() and pg_backup_stop() or take a file system backup as the standbys are still synchronized with the primary.) diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml index 1f021ea116..f5f4e3fab5 100644 --- a/doc/src/sgml/runtime.sgml +++ b/doc/src/sgml/runtime.sgml @@ -1552,11 +1552,7 @@ $ cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepagesSIGTERM, the server disallows new connections, but lets existing sessions end their work normally. It shuts down only after all of the sessions terminate. - If the server is in online backup mode, it additionally waits - until online backup mode is no longer active. While backup mode is - active, new connections will still be allowed, but only to superusers - (this exception allows a superuser to connect to terminate - online backup mode). If the server is in recovery when a smart + If the server is in recovery when a smart shutdown is requested, recovery and streaming replication will be stopped only after all regular sessions have terminated. @@ -1572,8 +1568,6 @@ $ cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepagesSIGTERM, which will cause them to abort their current transactions and exit promptly. It then waits for all server processes to exit and finally shuts down. - If the server is in online backup mode, backup mode will be - terminated, rendering the backup useless. diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 17a56152f1..8ae0a0ba53 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -385,29 +385,6 @@ typedef union WALInsertLockPadded char pad[PG_CACHE_LINE_SIZE]; } WALInsertLockPadded; -/* - * State of an exclusive backup, necessary to control concurrent activities - * across sessions when working on exclusive backups. - * - * EXCLUSIVE_BACKUP_NONE means that there is no exclusive backup actually - * running, to be more precise pg_start_backup() is not being executed for - * an exclusive backup and there is no exclusive backup in progress. - * EXCLUSIVE_BACKUP_STARTING means that pg_start_backup() is starting an - * exclusive backup. - * EXCLUSIVE_BACKUP_IN_PROGRESS means that pg_start_backup() has finished - * running and an exclusive backup is in progress. pg_stop_backup() is - * needed to finish it. - * EXCLUSIVE_BACKUP_STOPPING means that pg_stop_backup() is stopping an - * exclusive backup. - */ -typedef enum ExclusiveBackupState -{ - EXCLUSIVE_BACKUP_NONE = 0, - EXCLUSIVE_BACKUP_STARTING, - EXCLUSIVE_BACKUP_IN_PROGRESS, - EXCLUSIVE_BACKUP_STOPPING -} ExclusiveBackupState; - /* * Session status of running backup, used for sanity checks in SQL-callable * functions to start and stop backups. @@ -456,15 +433,12 @@ typedef struct XLogCtlInsert bool fullPageWrites; /* - * exclusiveBackupState indicates the state of an exclusive backup (see - * comments of ExclusiveBackupState for more details). nonExclusiveBackups - * is a counter indicating the number of streaming base backups currently - * in progress. forcePageWrites is set to true when either of these is - * non-zero. lastBackupStart is the latest checkpoint redo location used - * as a starting point for an online backup. + * runningBackups is a counter indicating the number of backups currently in + * progress. forcePageWrites is set to true when runningBackups is non-zero. + * lastBackupStart is the latest checkpoint redo location used as a starting + * point for an online backup. */ - ExclusiveBackupState exclusiveBackupState; - int nonExclusiveBackups; + int runningBackups; XLogRecPtr lastBackupStart; /* @@ -696,8 +670,7 @@ static void ReadControlFile(void); static void UpdateControlFile(void); static char *str_time(pg_time_t tnow); -static void pg_start_backup_callback(int code, Datum arg); -static void pg_stop_backup_callback(int code, Datum arg); +static void pg_backup_start_callback(int code, Datum arg); static int get_sync_bit(int method); @@ -5314,8 +5287,19 @@ StartupXLOG(void) missingContrecPtr = endOfRecoveryInfo->missingContrecPtr; /* - * Complain if we did not roll forward far enough to render the backup - * dump consistent. Note: it is indeed okay to look at the local variable + * When recovering from a backup (we are in recovery, and archive recovery + * was requested), complain if we did not roll forward far enough to reach + * the point where the database is consistent. For regular online + * backup-from-primary, that means reaching the end-of-backup WAL record (at + * which point we reset backupStartPoint to be Invalid), for + * backup-from-replica (which can't inject records into the WAL stream), + * that point is when we reach the minRecoveryPoint in pg_control (which + * we purposfully copy last when backing up from a replica). For pg_rewind + * (which creates a backup_label with a method of "pg_rewind") or + * snapshot-style backups (which don't), backupEndRequired will be set to + * false. + * + * Note: it is indeed okay to look at the local variable * LocalMinRecoveryPoint here, even though ControlFile->minRecoveryPoint * might be further ahead --- ControlFile->minRecoveryPoint cannot have * been advanced beyond the WAL we processed. @@ -5326,23 +5310,16 @@ StartupXLOG(void) { /* * Ran off end of WAL before reaching end-of-backup WAL record, or - * minRecoveryPoint. That's usually a bad sign, indicating that you - * tried to recover from an online backup but never called - * pg_stop_backup(), or you didn't archive all the WAL up to that - * point. However, this also happens in crash recovery, if the system - * crashes while an online backup is in progress. We must not treat - * that as an error, or the database will refuse to start up. + * minRecoveryPoint. That's a bad sign, indicating that you tried to + * recover from an online backup but never called pg_backup_stop(), + * or you didn't archive all the WAL needed. */ if (ArchiveRecoveryRequested || ControlFile->backupEndRequired) { - if (ControlFile->backupEndRequired) + if (!XLogRecPtrIsInvalid(ControlFile->backupStartPoint) || ControlFile->backupEndRequired) ereport(FATAL, (errmsg("WAL ends before end of online backup"), errhint("All WAL generated while online backup was taken must be available at recovery."))); - else if (!XLogRecPtrIsInvalid(ControlFile->backupStartPoint)) - ereport(FATAL, - (errmsg("WAL ends before end of online backup"), - errhint("Online backup started with pg_start_backup() must be ended with pg_stop_backup(), and all WAL up to that point must be available at recovery."))); else ereport(FATAL, (errmsg("WAL ends before consistent recovery point"))); @@ -7036,7 +7013,7 @@ CreateRestartPoint(int flags) * Ensure minRecoveryPoint is past the checkpoint record. Normally, * this will have happened already while writing out dirty buffers, * but not necessarily - e.g. because no buffers were dirtied. We do - * this because a non-exclusive base backup uses minRecoveryPoint to + * this because a backup performed in recovery uses minRecoveryPoint to * determine which WAL files must be included in the backup, and the * file (or files) containing the checkpoint record must be included, * at a minimum. Note that for an ordinary restart of recovery there's @@ -7840,7 +7817,7 @@ xlog_redo(XLogReaderState *record) /* * Update the LSN of the last replayed XLOG_FPW_CHANGE record so that - * do_pg_start_backup() and do_pg_stop_backup() can check whether + * do_pg_backup_start() and do_pg_backup_stop() can check whether * full_page_writes has been disabled during online backup. */ if (!fpw) @@ -8039,29 +8016,14 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) } /* - * do_pg_start_backup - * - * Utility function called at the start of an online backup. It creates the - * necessary starting checkpoint and constructs the backup label file. - * - * There are two kind of backups: exclusive and non-exclusive. An exclusive - * backup is started with pg_start_backup(), and there can be only one active - * at a time. The backup and tablespace map files of an exclusive backup are - * written to $PGDATA/backup_label and $PGDATA/tablespace_map, and they are - * removed by pg_stop_backup(). - * - * A non-exclusive backup is used for the streaming base backups (see - * src/backend/replication/basebackup.c). The difference to exclusive backups - * is that the backup label and tablespace map files are not written to disk. - * Instead, their would-be contents are returned in *labelfile and *tblspcmapfile, - * and the caller is responsible for including them in the backup archive as - * 'backup_label' and 'tablespace_map'. There can be many non-exclusive backups - * active at the same time, and they don't conflict with an exclusive backup - * either. - * - * labelfile and tblspcmapfile must be passed as NULL when starting an - * exclusive backup, and as initially-empty StringInfos for a non-exclusive - * backup. + * do_pg_backup_start is the workhorse of the user-visible pg_backup_start() + * function. It creates the necessary starting checkpoint and constructs the + * backup label and tablespace map. + * + * The backup label and tablespace map contents are returned in *labelfile and + * *tblspcmapfile, and the caller is responsible for including them in the + * backup archive as 'backup_label' and 'tablespace_map'. There can be many + * backups active at the same time. * * If "tablespaces" isn't NULL, it receives a list of tablespaceinfo structs * describing the cluster's tablespaces. @@ -8073,18 +8035,17 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) * Returns the minimum WAL location that must be present to restore from this * backup, and the corresponding timeline ID in *starttli_p. * - * Every successfully started non-exclusive backup must be stopped by calling - * do_pg_stop_backup() or do_pg_abort_backup(). + * Every successfully started backup must be stopped by calling + * do_pg_backup_stop() or do_pg_abort_backup(). * * It is the responsibility of the caller of this function to verify the * permissions of the calling user! */ XLogRecPtr -do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p, +do_pg_backup_start(const char *backupidstr, bool fast, TimeLineID *starttli_p, StringInfo labelfile, List **tablespaces, StringInfo tblspcmapfile) { - bool exclusive = (labelfile == NULL); bool backup_started_in_recovery = false; XLogRecPtr checkpointloc; XLogRecPtr startpoint; @@ -8093,20 +8054,9 @@ do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p, char strfbuf[128]; char xlogfilename[MAXFNAMELEN]; XLogSegNo _logSegNo; - struct stat stat_buf; - FILE *fp; backup_started_in_recovery = RecoveryInProgress(); - /* - * Currently only non-exclusive backup can be taken during recovery. - */ - if (backup_started_in_recovery && exclusive) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("recovery is in progress"), - errhint("WAL control functions cannot be executed during recovery."))); - /* * During recovery, we don't need to check WAL level. Because, if WAL * level is not sufficient, it's impossible to get here during recovery. @@ -8145,30 +8095,12 @@ do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p, * XLogInsertRecord(). */ WALInsertLockAcquireExclusive(); - if (exclusive) - { - /* - * At first, mark that we're now starting an exclusive backup, to - * ensure that there are no other sessions currently running - * pg_start_backup() or pg_stop_backup(). - */ - if (XLogCtl->Insert.exclusiveBackupState != EXCLUSIVE_BACKUP_NONE) - { - WALInsertLockRelease(); - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("a backup is already in progress"), - errhint("Run pg_stop_backup() and try again."))); - } - XLogCtl->Insert.exclusiveBackupState = EXCLUSIVE_BACKUP_STARTING; - } - else - XLogCtl->Insert.nonExclusiveBackups++; + XLogCtl->Insert.runningBackups++; XLogCtl->Insert.forcePageWrites = true; WALInsertLockRelease(); /* Ensure we release forcePageWrites if fail below */ - PG_ENSURE_ERROR_CLEANUP(pg_start_backup_callback, (Datum) BoolGetDatum(exclusive)); + PG_ENSURE_ERROR_CLEANUP(pg_backup_start_callback, (Datum) 0); { bool gotUniqueStartpoint = false; DIR *tblspcdir; @@ -8180,7 +8112,7 @@ do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p, * Force an XLOG file switch before the checkpoint, to ensure that the * WAL segment the checkpoint is written to doesn't contain pages with * old timeline IDs. That would otherwise happen if you called - * pg_start_backup() right after restoring from a PITR archive: the + * pg_backup_start() right after restoring from a PITR archive: the * first WAL segment containing the startup checkpoint has pages in * the beginning with the old timeline ID. That can cause trouble at * recovery: we won't have a history file covering the old timeline if @@ -8215,7 +8147,7 @@ do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p, * means that two successive backup runs can have same checkpoint * positions. * - * Since the fact that we are executing do_pg_start_backup() + * Since the fact that we are executing do_pg_backup_start() * during recovery means that checkpointer is running, we can use * RequestCheckpoint() to establish a restartpoint. * @@ -8416,122 +8348,19 @@ do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p, LSN_FORMAT_ARGS(startpoint), xlogfilename); appendStringInfo(labelfile, "CHECKPOINT LOCATION: %X/%X\n", LSN_FORMAT_ARGS(checkpointloc)); - appendStringInfo(labelfile, "BACKUP METHOD: %s\n", - exclusive ? "pg_start_backup" : "streamed"); + appendStringInfo(labelfile, "BACKUP METHOD: streamed\n"); appendStringInfo(labelfile, "BACKUP FROM: %s\n", backup_started_in_recovery ? "standby" : "primary"); appendStringInfo(labelfile, "START TIME: %s\n", strfbuf); appendStringInfo(labelfile, "LABEL: %s\n", backupidstr); appendStringInfo(labelfile, "START TIMELINE: %u\n", starttli); - - /* - * Okay, write the file, or return its contents to caller. - */ - if (exclusive) - { - /* - * Check for existing backup label --- implies a backup is already - * running. (XXX given that we checked exclusiveBackupState - * above, maybe it would be OK to just unlink any such label - * file?) - */ - if (stat(BACKUP_LABEL_FILE, &stat_buf) != 0) - { - if (errno != ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not stat file \"%s\": %m", - BACKUP_LABEL_FILE))); - } - else - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("a backup is already in progress"), - errhint("If you're sure there is no backup in progress, remove file \"%s\" and try again.", - BACKUP_LABEL_FILE))); - - fp = AllocateFile(BACKUP_LABEL_FILE, "w"); - - if (!fp) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not create file \"%s\": %m", - BACKUP_LABEL_FILE))); - if (fwrite(labelfile->data, labelfile->len, 1, fp) != 1 || - fflush(fp) != 0 || - pg_fsync(fileno(fp)) != 0 || - ferror(fp) || - FreeFile(fp)) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not write file \"%s\": %m", - BACKUP_LABEL_FILE))); - /* Allocated locally for exclusive backups, so free separately */ - pfree(labelfile->data); - pfree(labelfile); - - /* Write backup tablespace_map file. */ - if (tblspcmapfile->len > 0) - { - if (stat(TABLESPACE_MAP, &stat_buf) != 0) - { - if (errno != ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not stat file \"%s\": %m", - TABLESPACE_MAP))); - } - else - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("a backup is already in progress"), - errhint("If you're sure there is no backup in progress, remove file \"%s\" and try again.", - TABLESPACE_MAP))); - - fp = AllocateFile(TABLESPACE_MAP, "w"); - - if (!fp) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not create file \"%s\": %m", - TABLESPACE_MAP))); - if (fwrite(tblspcmapfile->data, tblspcmapfile->len, 1, fp) != 1 || - fflush(fp) != 0 || - pg_fsync(fileno(fp)) != 0 || - ferror(fp) || - FreeFile(fp)) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not write file \"%s\": %m", - TABLESPACE_MAP))); - } - - /* Allocated locally for exclusive backups, so free separately */ - pfree(tblspcmapfile->data); - pfree(tblspcmapfile); - } } - PG_END_ENSURE_ERROR_CLEANUP(pg_start_backup_callback, (Datum) BoolGetDatum(exclusive)); + PG_END_ENSURE_ERROR_CLEANUP(pg_backup_start_callback, (Datum) 0); /* - * Mark that start phase has correctly finished for an exclusive backup. - * Session-level locks are updated as well to reflect that state. - * - * Note that CHECK_FOR_INTERRUPTS() must not occur while updating backup - * counters and session-level lock. Otherwise they can be updated - * inconsistently, and which might cause do_pg_abort_backup() to fail. + * Mark that the start phase has correctly finished for the backup. */ - if (exclusive) - { - WALInsertLockAcquireExclusive(); - XLogCtl->Insert.exclusiveBackupState = EXCLUSIVE_BACKUP_IN_PROGRESS; - - /* Set session-level lock */ - sessionBackupState = SESSION_BACKUP_EXCLUSIVE; - WALInsertLockRelease(); - } - else - sessionBackupState = SESSION_BACKUP_NON_EXCLUSIVE; + sessionBackupState = SESSION_BACKUP_RUNNING; /* * We're done. As a convenience, return the starting WAL location. @@ -8541,47 +8370,19 @@ do_pg_start_backup(const char *backupidstr, bool fast, TimeLineID *starttli_p, return startpoint; } -/* Error cleanup callback for pg_start_backup */ +/* Error cleanup callback for pg_backup_start */ static void -pg_start_backup_callback(int code, Datum arg) +pg_backup_start_callback(int code, Datum arg) { - bool exclusive = DatumGetBool(arg); - /* Update backup counters and forcePageWrites on failure */ WALInsertLockAcquireExclusive(); - if (exclusive) - { - Assert(XLogCtl->Insert.exclusiveBackupState == EXCLUSIVE_BACKUP_STARTING); - XLogCtl->Insert.exclusiveBackupState = EXCLUSIVE_BACKUP_NONE; - } - else - { - Assert(XLogCtl->Insert.nonExclusiveBackups > 0); - XLogCtl->Insert.nonExclusiveBackups--; - } - if (XLogCtl->Insert.exclusiveBackupState == EXCLUSIVE_BACKUP_NONE && - XLogCtl->Insert.nonExclusiveBackups == 0) - { - XLogCtl->Insert.forcePageWrites = false; - } - WALInsertLockRelease(); -} - -/* - * Error cleanup callback for pg_stop_backup - */ -static void -pg_stop_backup_callback(int code, Datum arg) -{ - bool exclusive = DatumGetBool(arg); + Assert(XLogCtl->Insert.runningBackups > 0); + XLogCtl->Insert.runningBackups--; - /* Update backup status on failure */ - WALInsertLockAcquireExclusive(); - if (exclusive) + if (XLogCtl->Insert.runningBackups == 0) { - Assert(XLogCtl->Insert.exclusiveBackupState == EXCLUSIVE_BACKUP_STOPPING); - XLogCtl->Insert.exclusiveBackupState = EXCLUSIVE_BACKUP_IN_PROGRESS; + XLogCtl->Insert.forcePageWrites = false; } WALInsertLockRelease(); } @@ -8596,14 +8397,11 @@ get_backup_status(void) } /* - * do_pg_stop_backup + * do_pg_backup_stop * * Utility function called at the end of an online backup. It cleans up the * backup state and can optionally wait for WAL segments to be archived. * - * If labelfile is NULL, this stops an exclusive backup. Otherwise this stops - * the non-exclusive backup specified by 'labelfile'. - * * Returns the last WAL location that must be present to restore from this * backup, and the corresponding timeline ID in *stoptli_p. * @@ -8611,9 +8409,8 @@ get_backup_status(void) * permissions of the calling user! */ XLogRecPtr -do_pg_stop_backup(char *labelfile, bool waitforarchive, TimeLineID *stoptli_p) +do_pg_backup_stop(char *labelfile, bool waitforarchive, TimeLineID *stoptli_p) { - bool exclusive = (labelfile == NULL); bool backup_started_in_recovery = false; XLogRecPtr startpoint; XLogRecPtr stoppoint; @@ -8627,7 +8424,6 @@ do_pg_stop_backup(char *labelfile, bool waitforarchive, TimeLineID *stoptli_p) char histfilename[MAXFNAMELEN]; char backupfrom[20]; XLogSegNo _logSegNo; - FILE *lfp; FILE *fp; char ch; int seconds_before_warning; @@ -8640,15 +8436,6 @@ do_pg_stop_backup(char *labelfile, bool waitforarchive, TimeLineID *stoptli_p) backup_started_in_recovery = RecoveryInProgress(); - /* - * Currently only non-exclusive backup can be taken during recovery. - */ - if (backup_started_in_recovery && exclusive) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("recovery is in progress"), - errhint("WAL control functions cannot be executed during recovery."))); - /* * During recovery, we don't need to check WAL level. Because, if WAL * level is not sufficient, it's impossible to get here during recovery. @@ -8659,106 +8446,23 @@ do_pg_stop_backup(char *labelfile, bool waitforarchive, TimeLineID *stoptli_p) errmsg("WAL level not sufficient for making an online backup"), errhint("wal_level must be set to \"replica\" or \"logical\" at server start."))); - if (exclusive) - { - /* - * At first, mark that we're now stopping an exclusive backup, to - * ensure that there are no other sessions currently running - * pg_start_backup() or pg_stop_backup(). - */ - WALInsertLockAcquireExclusive(); - if (XLogCtl->Insert.exclusiveBackupState != EXCLUSIVE_BACKUP_IN_PROGRESS) - { - WALInsertLockRelease(); - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("exclusive backup not in progress"))); - } - XLogCtl->Insert.exclusiveBackupState = EXCLUSIVE_BACKUP_STOPPING; - WALInsertLockRelease(); - - /* - * Remove backup_label. In case of failure, the state for an exclusive - * backup is switched back to in-progress. - */ - PG_ENSURE_ERROR_CLEANUP(pg_stop_backup_callback, (Datum) BoolGetDatum(exclusive)); - { - /* - * Read the existing label file into memory. - */ - struct stat statbuf; - int r; - - if (stat(BACKUP_LABEL_FILE, &statbuf)) - { - /* should not happen per the upper checks */ - if (errno != ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not stat file \"%s\": %m", - BACKUP_LABEL_FILE))); - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("a backup is not in progress"))); - } - - lfp = AllocateFile(BACKUP_LABEL_FILE, "r"); - if (!lfp) - { - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not read file \"%s\": %m", - BACKUP_LABEL_FILE))); - } - labelfile = palloc(statbuf.st_size + 1); - r = fread(labelfile, statbuf.st_size, 1, lfp); - labelfile[statbuf.st_size] = '\0'; - - /* - * Close and remove the backup label file - */ - if (r != 1 || ferror(lfp) || FreeFile(lfp)) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not read file \"%s\": %m", - BACKUP_LABEL_FILE))); - durable_unlink(BACKUP_LABEL_FILE, ERROR); - - /* - * Remove tablespace_map file if present, it is created only if - * there are tablespaces. - */ - durable_unlink(TABLESPACE_MAP, DEBUG1); - } - PG_END_ENSURE_ERROR_CLEANUP(pg_stop_backup_callback, (Datum) BoolGetDatum(exclusive)); - } - /* - * OK to update backup counters, forcePageWrites and session-level lock. + * OK to update backup counters, forcePageWrites, and session-level lock. * * Note that CHECK_FOR_INTERRUPTS() must not occur while updating them. * Otherwise they can be updated inconsistently, and which might cause * do_pg_abort_backup() to fail. */ WALInsertLockAcquireExclusive(); - if (exclusive) - { - XLogCtl->Insert.exclusiveBackupState = EXCLUSIVE_BACKUP_NONE; - } - else - { - /* - * The user-visible pg_start/stop_backup() functions that operate on - * exclusive backups can be called at any time, but for non-exclusive - * backups, it is expected that each do_pg_start_backup() call is - * matched by exactly one do_pg_stop_backup() call. - */ - Assert(XLogCtl->Insert.nonExclusiveBackups > 0); - XLogCtl->Insert.nonExclusiveBackups--; - } - if (XLogCtl->Insert.exclusiveBackupState == EXCLUSIVE_BACKUP_NONE && - XLogCtl->Insert.nonExclusiveBackups == 0) + /* + * It is expected that each do_pg_backup_start() call is matched by exactly + * one do_pg_backup_stop() call. + */ + Assert(XLogCtl->Insert.runningBackups > 0); + XLogCtl->Insert.runningBackups--; + + if (XLogCtl->Insert.runningBackups == 0) { XLogCtl->Insert.forcePageWrites = false; } @@ -9016,17 +8720,13 @@ do_pg_stop_backup(char *labelfile, bool waitforarchive, TimeLineID *stoptli_p) /* * do_pg_abort_backup: abort a running backup * - * This does just the most basic steps of do_pg_stop_backup(), by taking the + * This does just the most basic steps of do_pg_backup_stop(), by taking the * system out of backup mode, thus making it a lot more safe to call from * an error handler. * * The caller can pass 'arg' as 'true' or 'false' to control whether a warning * is emitted. * - * NB: This is only for aborting a non-exclusive backup that doesn't write - * backup_label. A backup started with pg_start_backup() needs to be finished - * with pg_stop_backup(). - * * NB: This gets used as a before_shmem_exit handler, hence the odd-looking * signature. */ @@ -9036,18 +8736,16 @@ do_pg_abort_backup(int code, Datum arg) bool emit_warning = DatumGetBool(arg); /* - * Quick exit if session is not keeping around a non-exclusive backup - * already started. + * Quick exit if session does not have a running backup. */ - if (sessionBackupState != SESSION_BACKUP_NON_EXCLUSIVE) + if (sessionBackupState != SESSION_BACKUP_RUNNING) return; WALInsertLockAcquireExclusive(); - Assert(XLogCtl->Insert.nonExclusiveBackups > 0); - XLogCtl->Insert.nonExclusiveBackups--; + Assert(XLogCtl->Insert.runningBackups > 0); + XLogCtl->Insert.runningBackups--; - if (XLogCtl->Insert.exclusiveBackupState == EXCLUSIVE_BACKUP_NONE && - XLogCtl->Insert.nonExclusiveBackups == 0) + if (XLogCtl->Insert.runningBackups == 0) { XLogCtl->Insert.forcePageWrites = false; } @@ -9055,7 +8753,7 @@ do_pg_abort_backup(int code, Datum arg) if (emit_warning) ereport(WARNING, - (errmsg("aborting backup due to backend exiting before pg_stop_backup was called"))); + (errmsg("aborting backup due to backend exiting before pg_backup_stop was called"))); } /* @@ -9115,87 +8813,6 @@ GetOldestRestartPoint(XLogRecPtr *oldrecptr, TimeLineID *oldtli) LWLockRelease(ControlFileLock); } -/* - * BackupInProgress: check if online backup mode is active - * - * This is done by checking for existence of the "backup_label" file. - */ -bool -BackupInProgress(void) -{ - struct stat stat_buf; - - return (stat(BACKUP_LABEL_FILE, &stat_buf) == 0); -} - -/* - * CancelBackup: rename the "backup_label" and "tablespace_map" - * files to cancel backup mode - * - * If the "backup_label" file exists, it will be renamed to "backup_label.old". - * Similarly, if the "tablespace_map" file exists, it will be renamed to - * "tablespace_map.old". - * - * Note that this will render an online backup in progress - * useless. To correctly finish an online backup, pg_stop_backup must be - * called. - */ -void -CancelBackup(void) -{ - struct stat stat_buf; - - /* if the backup_label file is not there, return */ - if (stat(BACKUP_LABEL_FILE, &stat_buf) < 0) - return; - - /* remove leftover file from previously canceled backup if it exists */ - unlink(BACKUP_LABEL_OLD); - - if (durable_rename(BACKUP_LABEL_FILE, BACKUP_LABEL_OLD, DEBUG1) != 0) - { - ereport(WARNING, - (errcode_for_file_access(), - errmsg("online backup mode was not canceled"), - errdetail("File \"%s\" could not be renamed to \"%s\": %m.", - BACKUP_LABEL_FILE, BACKUP_LABEL_OLD))); - return; - } - - /* if the tablespace_map file is not there, return */ - if (stat(TABLESPACE_MAP, &stat_buf) < 0) - { - ereport(LOG, - (errmsg("online backup mode canceled"), - errdetail("File \"%s\" was renamed to \"%s\".", - BACKUP_LABEL_FILE, BACKUP_LABEL_OLD))); - return; - } - - /* remove leftover file from previously canceled backup if it exists */ - unlink(TABLESPACE_MAP_OLD); - - if (durable_rename(TABLESPACE_MAP, TABLESPACE_MAP_OLD, DEBUG1) == 0) - { - ereport(LOG, - (errmsg("online backup mode canceled"), - errdetail("Files \"%s\" and \"%s\" were renamed to " - "\"%s\" and \"%s\", respectively.", - BACKUP_LABEL_FILE, TABLESPACE_MAP, - BACKUP_LABEL_OLD, TABLESPACE_MAP_OLD))); - } - else - { - ereport(WARNING, - (errcode_for_file_access(), - errmsg("online backup mode canceled"), - errdetail("File \"%s\" was renamed to \"%s\", but " - "file \"%s\" could not be renamed to \"%s\": %m.", - BACKUP_LABEL_FILE, BACKUP_LABEL_OLD, - TABLESPACE_MAP, TABLESPACE_MAP_OLD))); - } -} - /* Thin wrapper around ShutdownWalRcv(). */ void XLogShutdownWalRcv(void) diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c index 2752be63c1..b61ae6c0b4 100644 --- a/src/backend/access/transam/xlogfuncs.c +++ b/src/backend/access/transam/xlogfuncs.c @@ -39,13 +39,13 @@ #include "utils/tuplestore.h" /* - * Store label file and tablespace map during non-exclusive backups. + * Store label file and tablespace map during backups. */ static StringInfo label_file; static StringInfo tblspc_map_file; /* - * pg_start_backup: set up for taking an on-line backup dump + * pg_backup_start: set up for taking an on-line backup dump * * Essentially what this does is to create a backup label file in $PGDATA, * where it will be archived as part of the backup dump. The label file @@ -57,105 +57,44 @@ static StringInfo tblspc_map_file; * GRANT system. */ Datum -pg_start_backup(PG_FUNCTION_ARGS) +pg_backup_start(PG_FUNCTION_ARGS) { text *backupid = PG_GETARG_TEXT_PP(0); bool fast = PG_GETARG_BOOL(1); - bool exclusive = PG_GETARG_BOOL(2); char *backupidstr; XLogRecPtr startpoint; SessionBackupState status = get_backup_status(); + MemoryContext oldcontext; backupidstr = text_to_cstring(backupid); - if (status == SESSION_BACKUP_NON_EXCLUSIVE) + if (status == SESSION_BACKUP_RUNNING) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("a backup is already in progress in this session"))); - if (exclusive) - { - startpoint = do_pg_start_backup(backupidstr, fast, NULL, NULL, - NULL, NULL); - } - else - { - MemoryContext oldcontext; - - /* - * Label file and tablespace map file need to be long-lived, since - * they are read in pg_stop_backup. - */ - oldcontext = MemoryContextSwitchTo(TopMemoryContext); - label_file = makeStringInfo(); - tblspc_map_file = makeStringInfo(); - MemoryContextSwitchTo(oldcontext); + /* + * Label file and tablespace map file need to be long-lived, since + * they are read in pg_backup_stop. + */ + oldcontext = MemoryContextSwitchTo(TopMemoryContext); + label_file = makeStringInfo(); + tblspc_map_file = makeStringInfo(); + MemoryContextSwitchTo(oldcontext); - register_persistent_abort_backup_handler(); + register_persistent_abort_backup_handler(); - startpoint = do_pg_start_backup(backupidstr, fast, NULL, label_file, - NULL, tblspc_map_file); - } + startpoint = do_pg_backup_start(backupidstr, fast, NULL, label_file, + NULL, tblspc_map_file); PG_RETURN_LSN(startpoint); } -/* - * pg_stop_backup: finish taking an on-line backup dump - * - * We write an end-of-backup WAL record, and remove the backup label file - * created by pg_start_backup, creating a backup history file in pg_wal - * instead (whence it will immediately be archived). The backup history file - * contains the same info found in the label file, plus the backup-end time - * and WAL location. Before 9.0, the backup-end time was read from the backup - * history file at the beginning of archive recovery, but we now use the WAL - * record for that and the file is for informational and debug purposes only. - * - * Note: different from CancelBackup which just cancels online backup mode. - * - * Note: this version is only called to stop an exclusive backup. The function - * pg_stop_backup_v2 (overloaded as pg_stop_backup in SQL) is called to - * stop non-exclusive backups. - * - * Permission checking for this function is managed through the normal - * GRANT system. - */ -Datum -pg_stop_backup(PG_FUNCTION_ARGS) -{ - XLogRecPtr stoppoint; - SessionBackupState status = get_backup_status(); - - if (status == SESSION_BACKUP_NON_EXCLUSIVE) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("non-exclusive backup in progress"), - errhint("Did you mean to use pg_stop_backup('f')?"))); - - /* - * Exclusive backups were typically started in a different connection, so - * don't try to verify that status of backup is set to - * SESSION_BACKUP_EXCLUSIVE in this function. Actual verification that an - * exclusive backup is in fact running is handled inside - * do_pg_stop_backup. - */ - stoppoint = do_pg_stop_backup(NULL, true, NULL); - - PG_RETURN_LSN(stoppoint); -} - /* - * pg_stop_backup_v2: finish taking exclusive or nonexclusive on-line backup. - * - * Works the same as pg_stop_backup, except for non-exclusive backups it returns - * the backup label and tablespace map files as text fields in as part of the - * resultset. + * pg_backup_stop: finish taking an on-line backup. * - * The first parameter (variable 'exclusive') allows the user to tell us if - * this is an exclusive or a non-exclusive backup. - * - * The second parameter (variable 'waitforarchive'), which is optional, + * The first parameter (variable 'waitforarchive'), which is optional, * allows the user to choose if they want to wait for the WAL to be archived * or if we should just return as soon as the WAL record is written. * @@ -163,15 +102,14 @@ pg_stop_backup(PG_FUNCTION_ARGS) * GRANT system. */ Datum -pg_stop_backup_v2(PG_FUNCTION_ARGS) +pg_backup_stop(PG_FUNCTION_ARGS) { #define PG_STOP_BACKUP_V2_COLS 3 TupleDesc tupdesc; Datum values[PG_STOP_BACKUP_V2_COLS]; bool nulls[PG_STOP_BACKUP_V2_COLS]; - bool exclusive = PG_GETARG_BOOL(0); - bool waitforarchive = PG_GETARG_BOOL(1); + bool waitforarchive = PG_GETARG_BOOL(0); XLogRecPtr stoppoint; SessionBackupState status = get_backup_status(); @@ -182,51 +120,29 @@ pg_stop_backup_v2(PG_FUNCTION_ARGS) MemSet(values, 0, sizeof(values)); MemSet(nulls, 0, sizeof(nulls)); - if (exclusive) - { - if (status == SESSION_BACKUP_NON_EXCLUSIVE) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("non-exclusive backup in progress"), - errhint("Did you mean to use pg_stop_backup('f')?"))); - - /* - * Stop the exclusive backup, and since we're in an exclusive backup - * return NULL for both backup_label and tablespace_map. - */ - stoppoint = do_pg_stop_backup(NULL, waitforarchive, NULL); - - nulls[1] = true; - nulls[2] = true; - } - else - { - if (status != SESSION_BACKUP_NON_EXCLUSIVE) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("non-exclusive backup is not in progress"), - errhint("Did you mean to use pg_stop_backup('t')?"))); + if (status != SESSION_BACKUP_RUNNING) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("backup is not in progress"), + errhint("Did you call pg_backup_start()?"))); - /* - * Stop the non-exclusive backup. Return a copy of the backup label - * and tablespace map so they can be written to disk by the caller. - */ - stoppoint = do_pg_stop_backup(label_file->data, waitforarchive, NULL); - - values[1] = CStringGetTextDatum(label_file->data); - values[2] = CStringGetTextDatum(tblspc_map_file->data); - - /* Free structures allocated in TopMemoryContext */ - pfree(label_file->data); - pfree(label_file); - label_file = NULL; - pfree(tblspc_map_file->data); - pfree(tblspc_map_file); - tblspc_map_file = NULL; - } + /* + * Stop the backup. Return a copy of the backup label and tablespace map so + * they can be written to disk by the caller. + */ + stoppoint = do_pg_backup_stop(label_file->data, waitforarchive, NULL); - /* Stoppoint is included on both exclusive and nonexclusive backups */ values[0] = LSNGetDatum(stoppoint); + values[1] = CStringGetTextDatum(label_file->data); + values[2] = CStringGetTextDatum(tblspc_map_file->data); + + /* Free structures allocated in TopMemoryContext */ + pfree(label_file->data); + pfree(label_file); + label_file = NULL; + pfree(tblspc_map_file->data); + pfree(tblspc_map_file); + tblspc_map_file = NULL; /* Returns the record as Datum */ PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls))); @@ -298,7 +214,7 @@ pg_create_restore_point(PG_FUNCTION_ARGS) } /* - * Report the current WAL write location (same format as pg_start_backup etc) + * Report the current WAL write location (same format as pg_backup_start etc) * * This is useful for determining how much of WAL is visible to an external * archiving process. Note that the data before this point is written out @@ -321,7 +237,7 @@ pg_current_wal_lsn(PG_FUNCTION_ARGS) } /* - * Report the current WAL insert location (same format as pg_start_backup etc) + * Report the current WAL insert location (same format as pg_backup_start etc) * * This function is mostly for debugging purposes. */ @@ -342,7 +258,7 @@ pg_current_wal_insert_lsn(PG_FUNCTION_ARGS) } /* - * Report the current WAL flush location (same format as pg_start_backup etc) + * Report the current WAL flush location (same format as pg_backup_start etc) * * This function is mostly for debugging purposes. */ @@ -363,7 +279,7 @@ pg_current_wal_flush_lsn(PG_FUNCTION_ARGS) } /* - * Report the last WAL receive location (same format as pg_start_backup etc) + * Report the last WAL receive location (same format as pg_backup_start etc) * * This is useful for determining how much of WAL is guaranteed to be received * and synced to disk by walreceiver. @@ -382,7 +298,7 @@ pg_last_wal_receive_lsn(PG_FUNCTION_ARGS) } /* - * Report the last WAL replay location (same format as pg_start_backup etc) + * Report the last WAL replay location (same format as pg_backup_start etc) * * This is useful for determining how much of WAL is visible to read-only * connections during recovery. @@ -402,7 +318,7 @@ pg_last_wal_replay_lsn(PG_FUNCTION_ARGS) /* * Compute an xlog file name and decimal byte offset given a WAL location, - * such as is returned by pg_stop_backup() or pg_switch_wal(). + * such as is returned by pg_backup_stop() or pg_switch_wal(). * * Note that a location exactly at a segment boundary is taken to be in * the previous segment. This is usually the right thing, since the @@ -470,7 +386,7 @@ pg_walfile_name_offset(PG_FUNCTION_ARGS) /* * Compute an xlog file name given a WAL location, - * such as is returned by pg_stop_backup() or pg_switch_wal(). + * such as is returned by pg_backup_stop() or pg_switch_wal(). */ Datum pg_walfile_name(PG_FUNCTION_ARGS) @@ -645,81 +561,6 @@ pg_wal_lsn_diff(PG_FUNCTION_ARGS) PG_RETURN_NUMERIC(result); } -/* - * Returns bool with current on-line backup mode, a global state. - */ -Datum -pg_is_in_backup(PG_FUNCTION_ARGS) -{ - PG_RETURN_BOOL(BackupInProgress()); -} - -/* - * Returns start time of an online exclusive backup. - * - * When there's no exclusive backup in progress, the function - * returns NULL. - */ -Datum -pg_backup_start_time(PG_FUNCTION_ARGS) -{ - Datum xtime; - FILE *lfp; - char fline[MAXPGPATH]; - char backup_start_time[30]; - - /* - * See if label file is present - */ - lfp = AllocateFile(BACKUP_LABEL_FILE, "r"); - if (lfp == NULL) - { - if (errno != ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not read file \"%s\": %m", - BACKUP_LABEL_FILE))); - PG_RETURN_NULL(); - } - - /* - * Parse the file to find the START TIME line. - */ - backup_start_time[0] = '\0'; - while (fgets(fline, sizeof(fline), lfp) != NULL) - { - if (sscanf(fline, "START TIME: %25[^\n]\n", backup_start_time) == 1) - break; - } - - /* Check for a read error. */ - if (ferror(lfp)) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not read file \"%s\": %m", BACKUP_LABEL_FILE))); - - /* Close the backup label file. */ - if (FreeFile(lfp)) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not close file \"%s\": %m", BACKUP_LABEL_FILE))); - - if (strlen(backup_start_time) == 0) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE))); - - /* - * Convert the time string read from file to TimestampTz form. - */ - xtime = DirectFunctionCall3(timestamptz_in, - CStringGetDatum(backup_start_time), - ObjectIdGetDatum(InvalidOid), - Int32GetDatum(-1)); - - PG_RETURN_DATUM(xtime); -} - /* * Promotes a standby server. * diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 8d2395dae2..1b7bae387a 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -1183,9 +1183,14 @@ read_backup_label(XLogRecPtr *checkPointLoc, TimeLineID *backupLabelTLI, *backupLabelTLI = tli_from_walseg; /* - * BACKUP METHOD and BACKUP FROM lines are new in 9.2. We can't restore - * from an older backup anyway, but since the information on it is not - * strictly required, don't error out if it's missing for some reason. + * BACKUP METHOD lets us know if this was a typical backup ("streamed", + * which could mean either pg_basebackup or the pg_backup_start/stop + * method was used) or if this label came from somewhere else (the only + * other option today being from pg_rewind). If this was a streamed + * backup then we know that we need to play through until we get to the + * end of the WAL which was generated during the backup (at which point + * we will have reached consistency and backupEndRequired will be reset + * to be false). */ if (fscanf(lfp, "BACKUP METHOD: %19s\n", backuptype) == 1) { @@ -1193,6 +1198,11 @@ read_backup_label(XLogRecPtr *checkPointLoc, TimeLineID *backupLabelTLI, *backupEndRequired = true; } + /* + * BACKUP FROM lets us know if this was from a primary or a standby. If + * it was from a standby, we'll double-check that the control file state + * matches that of a standby. + */ if (fscanf(lfp, "BACKUP FROM: %19s\n", backupfrom) == 1) { if (strcmp(backupfrom, "standby") == 0) @@ -1970,7 +1980,7 @@ xlogrecovery_redo(XLogReaderState *record, TimeLineID replayTLI) { /* * We have reached the end of base backup, the point where - * pg_stop_backup() was done. The data on disk is now consistent + * pg_backup_stop() was done. The data on disk is now consistent * (assuming we have also reached minRecoveryPoint). Set * backupEndPoint to the current LSN, so that the next call to * CheckRecoveryConsistency() will notice it and do the @@ -2033,7 +2043,7 @@ CheckRecoveryConsistency(void) /* * Have we passed our safe starting point? Note that minRecoveryPoint is - * known to be incorrectly set if ControlFile->backupEndRequired, until + * known to be incorrectly set if recovering from a backup, until * the XLOG_BACKUP_END arrives to advise us of the correct * minRecoveryPoint. All we know prior to that is that we're not * consistent yet. diff --git a/src/backend/catalog/system_functions.sql b/src/backend/catalog/system_functions.sql index 81bac6f581..6ae4388d3f 100644 --- a/src/backend/catalog/system_functions.sql +++ b/src/backend/catalog/system_functions.sql @@ -377,14 +377,14 @@ BEGIN ATOMIC END; CREATE OR REPLACE FUNCTION - pg_start_backup(label text, fast boolean DEFAULT false, exclusive boolean DEFAULT true) - RETURNS pg_lsn STRICT VOLATILE LANGUAGE internal AS 'pg_start_backup' + pg_backup_start(label text, fast boolean DEFAULT false) + RETURNS pg_lsn STRICT VOLATILE LANGUAGE internal AS 'pg_backup_start' PARALLEL RESTRICTED; -CREATE OR REPLACE FUNCTION pg_stop_backup ( - exclusive boolean, wait_for_archive boolean DEFAULT true, - OUT lsn pg_lsn, OUT labelfile text, OUT spcmapfile text) - RETURNS record STRICT VOLATILE LANGUAGE internal as 'pg_stop_backup_v2' +CREATE OR REPLACE FUNCTION pg_backup_stop ( + wait_for_archive boolean DEFAULT true, OUT lsn pg_lsn, + OUT labelfile text, OUT spcmapfile text) + RETURNS record STRICT VOLATILE LANGUAGE internal as 'pg_backup_stop' PARALLEL RESTRICTED; CREATE OR REPLACE FUNCTION @@ -603,11 +603,9 @@ AS 'unicode_is_normalized'; -- available to superuser / cluster owner, if they choose. -- -REVOKE EXECUTE ON FUNCTION pg_start_backup(text, boolean, boolean) FROM public; +REVOKE EXECUTE ON FUNCTION pg_backup_start(text, boolean) FROM public; -REVOKE EXECUTE ON FUNCTION pg_stop_backup() FROM public; - -REVOKE EXECUTE ON FUNCTION pg_stop_backup(boolean, boolean) FROM public; +REVOKE EXECUTE ON FUNCTION pg_backup_stop(boolean) FROM public; REVOKE EXECUTE ON FUNCTION pg_create_restore_point(text) FROM public; diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 80bb269599..9f7034df11 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -345,14 +345,7 @@ static PMState pmState = PM_INIT; * connsAllowed is a sub-state indicator showing the active restriction. * It is of no interest unless pmState is PM_RUN or PM_HOT_STANDBY. */ -typedef enum -{ - ALLOW_ALL_CONNS, /* normal not-shutting-down state */ - ALLOW_SUPERUSER_CONNS, /* only superusers can connect */ - ALLOW_NO_CONNS /* no new connections allowed, period */ -} ConnsAllowedState; - -static ConnsAllowedState connsAllowed = ALLOW_ALL_CONNS; +static bool connsAllowed = true; /* Start time of SIGKILL timeout during immediate shutdown or child crash */ /* Zero means timeout is not running */ @@ -2409,9 +2402,6 @@ ProcessStartupPacket(Port *port, bool ssl_done, bool gss_done) (errcode(ERRCODE_TOO_MANY_CONNECTIONS), errmsg("sorry, too many clients already"))); break; - case CAC_SUPERUSER: - /* OK for now, will check in InitPostgres */ - break; case CAC_OK: break; } @@ -2546,19 +2536,10 @@ canAcceptConnections(int backend_type) /* * "Smart shutdown" restrictions are applied only to normal connections, - * not to autovac workers or bgworkers. When only superusers can connect, - * we return CAC_SUPERUSER to indicate that superuserness must be checked - * later. Note that neither CAC_OK nor CAC_SUPERUSER can safely be - * returned until we have checked for too many children. + * not to autovac workers or bgworkers. */ - if (connsAllowed != ALLOW_ALL_CONNS && - backend_type == BACKEND_TYPE_NORMAL) - { - if (connsAllowed == ALLOW_SUPERUSER_CONNS) - result = CAC_SUPERUSER; /* allow superusers only */ - else - return CAC_SHUTDOWN; /* shutdown is pending */ - } + if (!connsAllowed && backend_type == BACKEND_TYPE_NORMAL) + return CAC_SHUTDOWN; /* shutdown is pending */ /* * Don't start too many children. @@ -2877,17 +2858,12 @@ pmdie(SIGNAL_ARGS) #endif /* - * If we reached normal running, we have to wait for any online - * backup mode to end; otherwise go straight to waiting for client - * backends to exit. (The difference is that in the former state, - * we'll still let in new superuser clients, so that somebody can - * end the online backup mode.) If already in PM_STOP_BACKENDS or + * If we reached normal running, we go straight to waiting for + * client backends to exit. If already in PM_STOP_BACKENDS or * a later state, do not change it. */ - if (pmState == PM_RUN) - connsAllowed = ALLOW_SUPERUSER_CONNS; - else if (pmState == PM_HOT_STANDBY) - connsAllowed = ALLOW_NO_CONNS; + if (pmState == PM_RUN || pmState == PM_HOT_STANDBY) + connsAllowed = false; else if (pmState == PM_STARTUP || pmState == PM_RECOVERY) { /* There should be no clients, so proceed to stop children */ @@ -3099,7 +3075,7 @@ reaper(SIGNAL_ARGS) AbortStartTime = 0; ReachedNormalRunning = true; pmState = PM_RUN; - connsAllowed = ALLOW_ALL_CONNS; + connsAllowed = true; /* * Crank up the background tasks, if we didn't do that already @@ -3842,21 +3818,11 @@ PostmasterStateMachine(void) /* If we're doing a smart shutdown, try to advance that state. */ if (pmState == PM_RUN || pmState == PM_HOT_STANDBY) { - if (connsAllowed == ALLOW_SUPERUSER_CONNS) + if (!connsAllowed) { /* - * ALLOW_SUPERUSER_CONNS state ends as soon as online backup mode - * is not active. - */ - if (!BackupInProgress()) - connsAllowed = ALLOW_NO_CONNS; - } - - if (connsAllowed == ALLOW_NO_CONNS) - { - /* - * ALLOW_NO_CONNS state ends when we have no normal client - * backends running. Then we're ready to stop other children. + * This state ends when we have no normal client backends running. + * Then we're ready to stop other children. */ if (CountChildren(BACKEND_TYPE_NORMAL) == 0) pmState = PM_STOP_BACKENDS; @@ -4044,18 +4010,6 @@ PostmasterStateMachine(void) } else { - /* - * Terminate exclusive backup mode to avoid recovery after a clean - * fast shutdown. Since an exclusive backup can only be taken - * during normal running (and not, for example, while running - * under Hot Standby) it only makes sense to do this if we reached - * normal running. If we're still in recovery, the backup file is - * one we're recovering *from*, and we must keep it around so that - * recovery restarts from the right place. - */ - if (ReachedNormalRunning) - CancelBackup(); - /* * Normal exit from the postmaster is here. We don't need to log * anything here, since the UnlinkLockFiles proc_exit callback @@ -4277,8 +4231,7 @@ BackendStartup(Port *port) /* Pass down canAcceptConnections state */ port->canAcceptConnections = canAcceptConnections(BACKEND_TYPE_NORMAL); - bn->dead_end = (port->canAcceptConnections != CAC_OK && - port->canAcceptConnections != CAC_SUPERUSER); + bn->dead_end = (port->canAcceptConnections != CAC_OK); /* * Unless it's a dead_end child, assign it a child slot number @@ -5287,7 +5240,7 @@ sigusr1_handler(SIGNAL_ARGS) #endif pmState = PM_HOT_STANDBY; - connsAllowed = ALLOW_ALL_CONNS; + connsAllowed = true; /* Some workers may be scheduled to start now */ StartWorkerNeeded = true; diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index 6884cad2c0..815681ada7 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -184,10 +184,8 @@ static const struct exclude_list_item excludeFiles[] = {RELCACHE_INIT_FILENAME, true}, /* - * If there's a backup_label or tablespace_map file, it belongs to a - * backup started by the user with pg_start_backup(). It is *not* correct - * for this backup. Our backup_label/tablespace_map is injected into the - * tar separately. + * backup_label and tablespace_map should not exist in in a running cluster + * capable of doing an online backup, but exclude them just in case. */ {BACKUP_LABEL_FILE, false}, {TABLESPACE_MAP, false}, @@ -264,16 +262,16 @@ perform_base_backup(basebackup_options *opt, bbsink *sink) total_checksum_failures = 0; basebackup_progress_wait_checkpoint(); - state.startptr = do_pg_start_backup(opt->label, opt->fastcheckpoint, + state.startptr = do_pg_backup_start(opt->label, opt->fastcheckpoint, &state.starttli, labelfile, &state.tablespaces, tblspc_map_file); /* - * Once do_pg_start_backup has been called, ensure that any failure causes + * Once do_pg_backup_start has been called, ensure that any failure causes * us to abort the backup so we don't "leak" a backup counter. For this - * reason, *all* functionality between do_pg_start_backup() and the end of - * do_pg_stop_backup() should be inside the error cleanup block! + * reason, *all* functionality between do_pg_backup_start() and the end of + * do_pg_backup_stop() should be inside the error cleanup block! */ PG_ENSURE_ERROR_CLEANUP(do_pg_abort_backup, BoolGetDatum(false)); @@ -394,7 +392,7 @@ perform_base_backup(basebackup_options *opt, bbsink *sink) } basebackup_progress_wait_wal_archive(&state); - endptr = do_pg_stop_backup(labelfile->data, !opt->nowait, &endtli); + endptr = do_pg_backup_stop(labelfile->data, !opt->nowait, &endtli); } PG_END_ENSURE_ERROR_CLEANUP(do_pg_abort_backup, BoolGetDatum(false)); @@ -961,7 +959,7 @@ parse_basebackup_options(List *options, basebackup_options *opt) /* * SendBaseBackup() - send a complete base backup. * - * The function will put the system into backup mode like pg_start_backup() + * The function will put the system into backup mode like pg_backup_start() * does, so that the backup is consistent even though we read directly from * the filesystem, bypassing the buffer cache. */ @@ -1204,7 +1202,7 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, * error in that case. The error handler further up will call * do_pg_abort_backup() for us. Also check that if the backup was * started while still in recovery, the server wasn't promoted. - * do_pg_stop_backup() will check that too, but it's better to stop + * do_pg_backup_stop() will check that too, but it's better to stop * the backup early than continue to the end and fail there. */ CHECK_FOR_INTERRUPTS(); diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 6452b42dbf..342169b195 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -871,24 +871,6 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username, am_superuser = superuser(); } - /* - * If we're trying to shut down, only superusers can connect, and new - * replication connections are not allowed. - */ - if ((!am_superuser || am_walsender) && - MyProcPort != NULL && - MyProcPort->canAcceptConnections == CAC_SUPERUSER) - { - if (am_walsender) - ereport(FATAL, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("new replication connections are not allowed during database shutdown"))); - else - ereport(FATAL, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser to connect during database shutdown"))); - } - /* * Binary upgrades only allowed super-user connections */ diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 5ba84c2250..7309ebddea 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -247,6 +247,10 @@ 'DONOTCOPY', 'existing backup_label not copied'); rmtree("$tempdir/backup"); +# Now delete the bogus backup_label file since it will interfere with startup +unlink("$pgdata/backup_label") + or BAIL_OUT("unable to unlink $pgdata/backup_label"); + $node->command_ok( [ @pg_basebackup_defs, '-D', diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 3c182c97d4..3a9092a16a 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -1025,7 +1025,6 @@ static void do_stop(void) { pgpid_t pid; - struct stat statbuf; pid = get_pgpid(false); @@ -1058,20 +1057,6 @@ do_stop(void) } else { - /* - * If backup_label exists, an online backup is running. Warn the user - * that smart shutdown will wait for it to finish. However, if the - * server is in archive recovery, we're recovering from an online - * backup instead of performing one. - */ - if (shutdown_mode == SMART_MODE && - stat(backup_file, &statbuf) == 0 && - get_control_dbstate() != DB_IN_ARCHIVE_RECOVERY) - { - print_msg(_("WARNING: online backup mode is active\n" - "Shutdown will not complete until pg_stop_backup() is called.\n\n")); - } - print_msg(_("waiting for server to shut down...")); if (!wait_for_postmaster_stop()) @@ -1099,7 +1084,6 @@ static void do_restart(void) { pgpid_t pid; - struct stat statbuf; pid = get_pgpid(false); @@ -1134,20 +1118,6 @@ do_restart(void) exit(1); } - /* - * If backup_label exists, an online backup is running. Warn the user - * that smart shutdown will wait for it to finish. However, if the - * server is in archive recovery, we're recovering from an online - * backup instead of performing one. - */ - if (shutdown_mode == SMART_MODE && - stat(backup_file, &statbuf) == 0 && - get_control_dbstate() != DB_IN_ARCHIVE_RECOVERY) - { - print_msg(_("WARNING: online backup mode is active\n" - "Shutdown will not complete until pg_stop_backup() is called.\n\n")); - } - print_msg(_("waiting for server to shut down...")); /* always wait for restart */ diff --git a/src/bin/pg_rewind/filemap.c b/src/bin/pg_rewind/filemap.c index 7211090f47..fb52debf7a 100644 --- a/src/bin/pg_rewind/filemap.c +++ b/src/bin/pg_rewind/filemap.c @@ -140,9 +140,9 @@ static const struct exclude_list_item excludeFiles[] = {"pg_internal.init", true}, /* defined as RELCACHE_INIT_FILENAME */ /* - * If there's a backup_label or tablespace_map file, it belongs to a - * backup started by the user with pg_start_backup(). It is *not* correct - * for this backup. Our backup_label is written later on separately. + * If there is a backup_label or tablespace_map file, it indicates that + * a recovery failed and this cluster probably can't be rewound, but + * exclude them anyway if they are found. */ {"backup_label", false}, /* defined as BACKUP_LABEL_FILE */ {"tablespace_map", false}, /* defined as TABLESPACE_MAP */ diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index 09f6464331..b81917f243 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -276,14 +276,13 @@ extern void XLogShutdownWalRcv(void); typedef enum SessionBackupState { SESSION_BACKUP_NONE, - SESSION_BACKUP_EXCLUSIVE, - SESSION_BACKUP_NON_EXCLUSIVE + SESSION_BACKUP_RUNNING, } SessionBackupState; -extern XLogRecPtr do_pg_start_backup(const char *backupidstr, bool fast, +extern XLogRecPtr do_pg_backup_start(const char *backupidstr, bool fast, TimeLineID *starttli_p, StringInfo labelfile, List **tablespaces, StringInfo tblspcmapfile); -extern XLogRecPtr do_pg_stop_backup(char *labelfile, bool waitforarchive, +extern XLogRecPtr do_pg_backup_stop(char *labelfile, bool waitforarchive, TimeLineID *stoptli_p); extern void do_pg_abort_backup(int code, Datum arg); extern void register_persistent_abort_backup_handler(void); diff --git a/src/include/catalog/pg_control.h b/src/include/catalog/pg_control.h index 1f3dc24ac1..06368e2366 100644 --- a/src/include/catalog/pg_control.h +++ b/src/include/catalog/pg_control.h @@ -161,9 +161,7 @@ typedef struct ControlFileData * * If backupEndRequired is true, we know for sure that we're restoring * from a backup, and must see a backup-end record before we can safely - * start up. If it's false, but backupStartPoint is set, a backup_label - * file was found at startup but it may have been a leftover from a stray - * pg_start_backup() call, not accompanied by pg_stop_backup(). + * start up. */ XLogRecPtr minRecoveryPoint; TimeLineID minRecoveryPointTLI; diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 4d285ece8b..e8f89a7b18 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -6274,26 +6274,16 @@ proargtypes => 'int4 int8', proargnames => '{pid,timeout}', prosrc => 'pg_terminate_backend' }, { oid => '2172', descr => 'prepare for taking an online backup', - proname => 'pg_start_backup', provolatile => 'v', proparallel => 'r', - prorettype => 'pg_lsn', proargtypes => 'text bool bool', - prosrc => 'pg_start_backup' }, -{ oid => '2173', descr => 'finish taking an online backup', - proname => 'pg_stop_backup', provolatile => 'v', proparallel => 'r', - prorettype => 'pg_lsn', proargtypes => '', prosrc => 'pg_stop_backup' }, + proname => 'pg_backup_start', provolatile => 'v', proparallel => 'r', + prorettype => 'pg_lsn', proargtypes => 'text bool', + prosrc => 'pg_backup_start' }, { oid => '2739', descr => 'finish taking an online backup', - proname => 'pg_stop_backup', provolatile => 'v', proparallel => 'r', - prorettype => 'record', proargtypes => 'bool bool', - proallargtypes => '{bool,bool,pg_lsn,text,text}', - proargmodes => '{i,i,o,o,o}', - proargnames => '{exclusive,wait_for_archive,lsn,labelfile,spcmapfile}', - prosrc => 'pg_stop_backup_v2' }, -{ oid => '3813', descr => 'true if server is in online backup', - proname => 'pg_is_in_backup', provolatile => 'v', prorettype => 'bool', - proargtypes => '', prosrc => 'pg_is_in_backup' }, -{ oid => '3814', descr => 'start time of an online backup', - proname => 'pg_backup_start_time', provolatile => 's', - prorettype => 'timestamptz', proargtypes => '', - prosrc => 'pg_backup_start_time' }, + proname => 'pg_backup_stop', provolatile => 'v', proparallel => 'r', + prorettype => 'record', proargtypes => 'bool', + proallargtypes => '{bool,pg_lsn,text,text}', + proargmodes => '{i,o,o,o}', + proargnames => '{wait_for_archive,lsn,labelfile,spcmapfile}', + prosrc => 'pg_backup_stop' }, { oid => '3436', descr => 'promote standby server', proname => 'pg_promote', provolatile => 'v', prorettype => 'bool', proargtypes => 'bool int4', proargnames => '{wait,wait_seconds}', diff --git a/src/include/libpq/libpq-be.h b/src/include/libpq/libpq-be.h index dd3e5efba3..c3bf514652 100644 --- a/src/include/libpq/libpq-be.h +++ b/src/include/libpq/libpq-be.h @@ -75,8 +75,7 @@ typedef enum CAC_state CAC_SHUTDOWN, CAC_RECOVERY, CAC_NOTCONSISTENT, - CAC_TOOMANY, - CAC_SUPERUSER + CAC_TOOMANY } CAC_state; diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 0abc3ad540..9321d7f264 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -481,10 +481,6 @@ extern void process_session_preload_libraries(void); extern void pg_bindtextdomain(const char *domain); extern bool has_rolreplication(Oid roleid); -/* in access/transam/xlog.c */ -extern bool BackupInProgress(void); -extern void CancelBackup(void); - /* in executor/nodeHash.c */ extern size_t get_hash_memory_limit(void); diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index b4ebc99935..1452297210 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -638,25 +638,6 @@ sub backup return; } -=item $node->backup_fs_hot(backup_name) - -Create a backup with a filesystem level copy in subdirectory B of -B<< $node->backup_dir >>, including WAL. - -Archiving must be enabled, as B and B are -used. This is not checked or enforced. - -The backup name is passed as the backup label to B. - -=cut - -sub backup_fs_hot -{ - my ($self, $backup_name) = @_; - $self->_backup_fs($backup_name, 1); - return; -} - =item $node->backup_fs_cold(backup_name) Create a backup with a filesystem level copy in subdirectory B of @@ -670,53 +651,18 @@ Use B or B if you want to back up a running server. sub backup_fs_cold { my ($self, $backup_name) = @_; - $self->_backup_fs($backup_name, 0); - return; -} - - -# Common sub of backup_fs_hot and backup_fs_cold -sub _backup_fs -{ - my ($self, $backup_name, $hot) = @_; - my $backup_path = $self->backup_dir . '/' . $backup_name; - my $port = $self->port; - my $name = $self->name; - - print "# Taking filesystem backup $backup_name from node \"$name\"\n"; - - if ($hot) - { - my $stdout = $self->safe_psql('postgres', - "SELECT * FROM pg_start_backup('$backup_name');"); - print "# pg_start_backup: $stdout\n"; - } PostgreSQL::Test::RecursiveCopy::copypath( $self->data_dir, - $backup_path, + $self->backup_dir . '/' . $backup_name, filterfn => sub { my $src = shift; return ($src ne 'log' and $src ne 'postmaster.pid'); }); - if ($hot) - { - - # We ignore pg_stop_backup's return value. We also assume archiving - # is enabled; otherwise the caller will have to copy the remaining - # segments. - my $stdout = - $self->safe_psql('postgres', 'SELECT * FROM pg_stop_backup();'); - print "# pg_stop_backup: $stdout\n"; - } - - print "# Backup finished\n"; return; } - - =pod =item $node->init_from_backup(root_node, backup_name) diff --git a/src/test/recovery/t/010_logical_decoding_timelines.pl b/src/test/recovery/t/010_logical_decoding_timelines.pl index 01ff31e61f..135fb1a72d 100644 --- a/src/test/recovery/t/010_logical_decoding_timelines.pl +++ b/src/test/recovery/t/010_logical_decoding_timelines.pl @@ -69,7 +69,9 @@ $node_primary->safe_psql('postgres', 'CHECKPOINT;'); my $backup_name = 'b1'; -$node_primary->backup_fs_hot($backup_name); +$node_primary->stop(); +$node_primary->backup_fs_cold($backup_name); +$node_primary->start(); $node_primary->safe_psql('postgres', q[SELECT pg_create_physical_replication_slot('phys_slot');]); From e99546f56670491370d7dc63b0693c3aadaa3112 Mon Sep 17 00:00:00 2001 From: Stephen Frost Date: Wed, 6 Apr 2022 15:00:07 -0400 Subject: [PATCH 394/772] Forgotten catversion bump for 39969e2a1e4d7f5a37f3ef37d53bbfe171e7d77a --- src/include/catalog/catversion.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index ab28a56b3a..9cf5ffb6ff 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202204061 +#define CATALOG_VERSION_NO 202204062 #endif From 46a2d2499a647174585fcfe871ddd2d32244a128 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 12:40:04 -0700 Subject: [PATCH 395/772] dsm: allow use in single user mode. It might seem pointless to allow use of dsm in single user mode, but otherwise subsystems might need dedicated single user mode code paths. Besides changing the assert, all that's needed is to make some windows code assuming the presence of postmaster conditional. Author: Andres Freund Reviewed-By: Thomas Munro Discussion: https://postgr.es/m/CA+hUKGL9hY_VY=+oUK+Gc1iSRx-Ls5qeYJ6q=dQVZnT3R63Taw@mail.gmail.com --- src/backend/storage/ipc/dsm.c | 9 +++++++-- src/backend/storage/ipc/dsm_impl.c | 6 ++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/backend/storage/ipc/dsm.c b/src/backend/storage/ipc/dsm.c index e9e9fae3eb..ce6f07d4c5 100644 --- a/src/backend/storage/ipc/dsm.c +++ b/src/backend/storage/ipc/dsm.c @@ -397,6 +397,7 @@ static void dsm_backend_startup(void) { #ifdef EXEC_BACKEND + if (IsUnderPostmaster) { void *control_address = NULL; @@ -496,8 +497,12 @@ dsm_create(Size size, int flags) FreePageManager *dsm_main_space_fpm = dsm_main_space_begin; bool using_main_dsm_region = false; - /* Unsafe in postmaster (and pointless in a stand-alone backend). */ - Assert(IsUnderPostmaster); + /* + * Unsafe in postmaster. It might seem pointless to allow use of dsm in + * single user mode, but otherwise some subsystems will need dedicated + * single user mode code paths. + */ + Assert(IsUnderPostmaster || !IsPostmasterEnvironment); if (!dsm_init_done) dsm_backend_startup(); diff --git a/src/backend/storage/ipc/dsm_impl.c b/src/backend/storage/ipc/dsm_impl.c index 49f4c98620..873867e856 100644 --- a/src/backend/storage/ipc/dsm_impl.c +++ b/src/backend/storage/ipc/dsm_impl.c @@ -959,6 +959,7 @@ dsm_impl_pin_segment(dsm_handle handle, void *impl_private, { #ifdef USE_DSM_WINDOWS case DSM_IMPL_WINDOWS: + if (IsUnderPostmaster) { HANDLE hmap; @@ -984,8 +985,8 @@ dsm_impl_pin_segment(dsm_handle handle, void *impl_private, * is unpinned, dsm_impl_unpin_segment can close it. */ *impl_private_pm_handle = hmap; - break; } + break; #endif default: break; @@ -1008,6 +1009,7 @@ dsm_impl_unpin_segment(dsm_handle handle, void **impl_private) { #ifdef USE_DSM_WINDOWS case DSM_IMPL_WINDOWS: + if (IsUnderPostmaster) { if (*impl_private && !DuplicateHandle(PostmasterHandle, *impl_private, @@ -1025,8 +1027,8 @@ dsm_impl_unpin_segment(dsm_handle handle, void **impl_private) } *impl_private = NULL; - break; } + break; #endif default: break; From c3e9b07936f70388c6f5341b68d6a04d40e07b86 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 12:41:29 -0700 Subject: [PATCH 396/772] pgstat: move pgstat_report_autovac() to pgstat_database.c. I got the location wrong in 13619598f10. The name did make it sound like it belonged in pgstat_relation.c... --- src/backend/utils/activity/pgstat_database.c | 20 ++++++++++++++++++++ src/backend/utils/activity/pgstat_relation.c | 20 -------------------- src/include/pgstat.h | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/backend/utils/activity/pgstat_database.c b/src/backend/utils/activity/pgstat_database.c index b4fba80835..6c38fe86a4 100644 --- a/src/backend/utils/activity/pgstat_database.c +++ b/src/backend/utils/activity/pgstat_database.c @@ -54,6 +54,26 @@ pgstat_drop_database(Oid databaseid) pgstat_send(&msg, sizeof(msg)); } +/* + * Called from autovacuum.c to report startup of an autovacuum process. + * We are called before InitPostgres is done, so can't rely on MyDatabaseId; + * the db OID must be passed in, instead. + */ +void +pgstat_report_autovac(Oid dboid) +{ + PgStat_MsgAutovacStart msg; + + if (pgStatSock == PGINVALID_SOCKET) + return; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_AUTOVAC_START); + msg.m_databaseid = dboid; + msg.m_start_time = GetCurrentTimestamp(); + + pgstat_send(&msg, sizeof(msg)); +} + /* * Tell the collector about a Hot Standby recovery conflict. */ diff --git a/src/backend/utils/activity/pgstat_relation.c b/src/backend/utils/activity/pgstat_relation.c index 74b62c39c0..957f5b858a 100644 --- a/src/backend/utils/activity/pgstat_relation.c +++ b/src/backend/utils/activity/pgstat_relation.c @@ -167,26 +167,6 @@ pgstat_drop_relation(Oid relid) } #endif /* NOT_USED */ -/* - * Called from autovacuum.c to report startup of an autovacuum process. - * We are called before InitPostgres is done, so can't rely on MyDatabaseId; - * the db OID must be passed in, instead. - */ -void -pgstat_report_autovac(Oid dboid) -{ - PgStat_MsgAutovacStart msg; - - if (pgStatSock == PGINVALID_SOCKET) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_AUTOVAC_START); - msg.m_databaseid = dboid; - msg.m_start_time = GetCurrentTimestamp(); - - pgstat_send(&msg, sizeof(msg)); -} - /* * Tell the collector about the table we just vacuumed. */ diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 3584078f6e..41fdf5f5a3 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -1025,6 +1025,7 @@ extern void pgstat_send_checkpointer(void); */ extern void pgstat_drop_database(Oid databaseid); +extern void pgstat_report_autovac(Oid dboid); extern void pgstat_report_recovery_conflict(int reason); extern void pgstat_report_deadlock(void); extern void pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount); @@ -1060,7 +1061,6 @@ extern PgStat_BackendFunctionEntry *find_funcstat_entry(Oid func_id); extern void pgstat_relation_init(Relation rel); -extern void pgstat_report_autovac(Oid dboid); extern void pgstat_report_vacuum(Oid tableoid, bool shared, PgStat_Counter livetuples, PgStat_Counter deadtuples); extern void pgstat_report_analyze(Relation rel, From ab62a642d52c95c0c62e927ba1bf3cfa279b744b Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 13:23:47 -0700 Subject: [PATCH 397/772] pgstat: move transactional code into pgstat_xact.c. The transactional integration code is largely independent from the rest of pgstat.c. Subsequent commits will add more related code. Author: Andres Freund Reviewed-By: Thomas Munro Discussion: https://postgr.es/m/20220404041516.cctrvpadhuriawlq@alap3.anarazel.de --- src/backend/postmaster/pgstat.c | 184 ++++------------------- src/backend/utils/activity/Makefile | 3 +- src/backend/utils/activity/pgstat_xact.c | 139 +++++++++++++++++ src/include/pgstat.h | 18 ++- src/include/utils/pgstat_internal.h | 8 +- 5 files changed, 189 insertions(+), 163 deletions(-) create mode 100644 src/backend/utils/activity/pgstat_xact.c diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index ef1cba61a6..6757df397c 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -198,8 +198,6 @@ static time_t last_pgstat_start_time; static bool pgStatRunningInCollector = false; -static PgStat_SubXactStatus *pgStatXactStack = NULL; - /* * Info about current "snapshot" of stats file */ @@ -740,158 +738,6 @@ pgstat_initialize(void) } -/* ------------------------------------------------------------ - * Transaction integration - * ------------------------------------------------------------ - */ - -/* - * Called from access/transam/xact.c at top-level transaction commit/abort. - */ -void -AtEOXact_PgStat(bool isCommit, bool parallel) -{ - PgStat_SubXactStatus *xact_state; - - AtEOXact_PgStat_Database(isCommit, parallel); - - /* handle transactional stats information */ - xact_state = pgStatXactStack; - if (xact_state != NULL) - { - Assert(xact_state->nest_level == 1); - Assert(xact_state->prev == NULL); - - AtEOXact_PgStat_Relations(xact_state, isCommit); - } - pgStatXactStack = NULL; - - /* Make sure any stats snapshot is thrown away */ - pgstat_clear_snapshot(); -} - -/* - * Called from access/transam/xact.c at subtransaction commit/abort. - */ -void -AtEOSubXact_PgStat(bool isCommit, int nestDepth) -{ - PgStat_SubXactStatus *xact_state; - - /* merge the sub-transaction's transactional stats into the parent */ - xact_state = pgStatXactStack; - if (xact_state != NULL && - xact_state->nest_level >= nestDepth) - { - /* delink xact_state from stack immediately to simplify reuse case */ - pgStatXactStack = xact_state->prev; - - AtEOSubXact_PgStat_Relations(xact_state, isCommit, nestDepth); - - pfree(xact_state); - } -} - -/* - * Save the transactional stats state at 2PC transaction prepare. - */ -void -AtPrepare_PgStat(void) -{ - PgStat_SubXactStatus *xact_state; - - xact_state = pgStatXactStack; - if (xact_state != NULL) - { - Assert(xact_state->nest_level == 1); - Assert(xact_state->prev == NULL); - - AtPrepare_PgStat_Relations(xact_state); - } -} - -/* - * Clean up after successful PREPARE. - * - * Note: AtEOXact_PgStat is not called during PREPARE. - */ -void -PostPrepare_PgStat(void) -{ - PgStat_SubXactStatus *xact_state; - - /* - * We don't bother to free any of the transactional state, since it's all - * in TopTransactionContext and will go away anyway. - */ - xact_state = pgStatXactStack; - if (xact_state != NULL) - { - Assert(xact_state->nest_level == 1); - Assert(xact_state->prev == NULL); - - PostPrepare_PgStat_Relations(xact_state); - } - pgStatXactStack = NULL; - - /* Make sure any stats snapshot is thrown away */ - pgstat_clear_snapshot(); -} - -/* - * Discard any data collected in the current transaction. Any subsequent - * request will cause new snapshots to be read. - * - * This is also invoked during transaction commit or abort to discard - * the no-longer-wanted snapshot. - */ -void -pgstat_clear_snapshot(void) -{ - pgstat_assert_is_up(); - - /* Release memory, if any was allocated */ - if (pgStatLocalContext) - MemoryContextDelete(pgStatLocalContext); - - /* Reset variables */ - pgStatLocalContext = NULL; - pgStatDBHash = NULL; - replSlotStatHash = NULL; - subscriptionStatHash = NULL; - - /* - * Historically the backend_status.c facilities lived in this file, and - * were reset with the same function. For now keep it that way, and - * forward the reset request. - */ - pgstat_clear_backend_activity_snapshot(); -} - -/* - * Ensure (sub)transaction stack entry for the given nest_level exists, adding - * it if needed. - */ -PgStat_SubXactStatus * -pgstat_xact_stack_level_get(int nest_level) -{ - PgStat_SubXactStatus *xact_state; - - xact_state = pgStatXactStack; - if (xact_state == NULL || xact_state->nest_level != nest_level) - { - xact_state = (PgStat_SubXactStatus *) - MemoryContextAlloc(TopTransactionContext, - sizeof(PgStat_SubXactStatus)); - xact_state->nest_level = nest_level; - xact_state->prev = pgStatXactStack; - xact_state->first = NULL; - pgStatXactStack = xact_state; - } - return xact_state; -} - - /* ------------------------------------------------------------ * Public functions used by backends follow * ------------------------------------------------------------ @@ -1319,6 +1165,36 @@ pgstat_send_inquiry(TimestampTz clock_time, TimestampTz cutoff_time, Oid databas pgstat_send(&msg, sizeof(msg)); } +/* + * Discard any data collected in the current transaction. Any subsequent + * request will cause new snapshots to be read. + * + * This is also invoked during transaction commit or abort to discard + * the no-longer-wanted snapshot. + */ +void +pgstat_clear_snapshot(void) +{ + pgstat_assert_is_up(); + + /* Release memory, if any was allocated */ + if (pgStatLocalContext) + MemoryContextDelete(pgStatLocalContext); + + /* Reset variables */ + pgStatLocalContext = NULL; + pgStatDBHash = NULL; + replSlotStatHash = NULL; + subscriptionStatHash = NULL; + + /* + * Historically the backend_status.c facilities lived in this file, and + * were reset with the same function. For now keep it that way, and + * forward the reset request. + */ + pgstat_clear_backend_activity_snapshot(); +} + /* * Support function for the SQL-callable pgstat* functions. Returns * the collected statistics for one database or NULL. NULL doesn't mean diff --git a/src/backend/utils/activity/Makefile b/src/backend/utils/activity/Makefile index 25a967ab7d..791ba68e7e 100644 --- a/src/backend/utils/activity/Makefile +++ b/src/backend/utils/activity/Makefile @@ -23,9 +23,10 @@ OBJS = \ pgstat_function.o \ pgstat_relation.o \ pgstat_replslot.o \ + pgstat_slru.o \ pgstat_subscription.o \ pgstat_wal.o \ - pgstat_slru.o \ + pgstat_xact.o \ wait_event.o include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/utils/activity/pgstat_xact.c b/src/backend/utils/activity/pgstat_xact.c new file mode 100644 index 0000000000..17907e3278 --- /dev/null +++ b/src/backend/utils/activity/pgstat_xact.c @@ -0,0 +1,139 @@ +/* ------------------------------------------------------------------------- + * + * pgstat_xact.c + * Transactional integration for the cumulative statistics system. + * + * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/activity/pgstat_xact.c + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "access/transam.h" +#include "access/xact.h" +#include "pgstat.h" +#include "utils/memutils.h" +#include "utils/pgstat_internal.h" + + +static PgStat_SubXactStatus *pgStatXactStack = NULL; + + +/* + * Called from access/transam/xact.c at top-level transaction commit/abort. + */ +void +AtEOXact_PgStat(bool isCommit, bool parallel) +{ + PgStat_SubXactStatus *xact_state; + + AtEOXact_PgStat_Database(isCommit, parallel); + + /* handle transactional stats information */ + xact_state = pgStatXactStack; + if (xact_state != NULL) + { + Assert(xact_state->nest_level == 1); + Assert(xact_state->prev == NULL); + + AtEOXact_PgStat_Relations(xact_state, isCommit); + } + pgStatXactStack = NULL; + + /* Make sure any stats snapshot is thrown away */ + pgstat_clear_snapshot(); +} + +/* + * Called from access/transam/xact.c at subtransaction commit/abort. + */ +void +AtEOSubXact_PgStat(bool isCommit, int nestDepth) +{ + PgStat_SubXactStatus *xact_state; + + /* merge the sub-transaction's transactional stats into the parent */ + xact_state = pgStatXactStack; + if (xact_state != NULL && + xact_state->nest_level >= nestDepth) + { + /* delink xact_state from stack immediately to simplify reuse case */ + pgStatXactStack = xact_state->prev; + + AtEOSubXact_PgStat_Relations(xact_state, isCommit, nestDepth); + + pfree(xact_state); + } +} + +/* + * Save the transactional stats state at 2PC transaction prepare. + */ +void +AtPrepare_PgStat(void) +{ + PgStat_SubXactStatus *xact_state; + + xact_state = pgStatXactStack; + if (xact_state != NULL) + { + Assert(xact_state->nest_level == 1); + Assert(xact_state->prev == NULL); + + AtPrepare_PgStat_Relations(xact_state); + } +} + +/* + * Clean up after successful PREPARE. + * + * Note: AtEOXact_PgStat is not called during PREPARE. + */ +void +PostPrepare_PgStat(void) +{ + PgStat_SubXactStatus *xact_state; + + /* + * We don't bother to free any of the transactional state, since it's all + * in TopTransactionContext and will go away anyway. + */ + xact_state = pgStatXactStack; + if (xact_state != NULL) + { + Assert(xact_state->nest_level == 1); + Assert(xact_state->prev == NULL); + + PostPrepare_PgStat_Relations(xact_state); + } + pgStatXactStack = NULL; + + /* Make sure any stats snapshot is thrown away */ + pgstat_clear_snapshot(); +} + +/* + * Ensure (sub)transaction stack entry for the given nest_level exists, adding + * it if needed. + */ +PgStat_SubXactStatus * +pgstat_xact_stack_level_get(int nest_level) +{ + PgStat_SubXactStatus *xact_state; + + xact_state = pgStatXactStack; + if (xact_state == NULL || xact_state->nest_level != nest_level) + { + xact_state = (PgStat_SubXactStatus *) + MemoryContextAlloc(TopTransactionContext, + sizeof(PgStat_SubXactStatus)); + xact_state->nest_level = nest_level; + xact_state->prev = pgStatXactStack; + xact_state->first = NULL; + pgStatXactStack = xact_state; + } + return xact_state; +} diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 41fdf5f5a3..95bf06f829 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -969,13 +969,6 @@ extern void PgstatCollectorMain(int argc, char *argv[]) pg_attribute_noreturn(); /* Functions for backend initialization */ extern void pgstat_initialize(void); -/* transactional integration */ -extern void AtEOXact_PgStat(bool isCommit, bool parallel); -extern void AtEOSubXact_PgStat(bool isCommit, int nestDepth); -extern void AtPrepare_PgStat(void); -extern void PostPrepare_PgStat(void); -extern void pgstat_clear_snapshot(void); - /* Functions called from backends */ extern void pgstat_report_stat(bool force); extern void pgstat_vacuum_stat(void); @@ -986,6 +979,7 @@ extern void pgstat_reset_single_counter(Oid objectid, PgStat_Single_Reset_Type t extern void pgstat_reset_shared_counters(const char *); /* stats accessors */ +extern void pgstat_clear_snapshot(void); extern PgStat_ArchiverStats *pgstat_fetch_stat_archiver(void); extern PgStat_BgWriterStats *pgstat_fetch_stat_bgwriter(void); extern PgStat_CheckpointerStats *pgstat_fetch_stat_checkpointer(void); @@ -1157,6 +1151,16 @@ extern void pgstat_report_subscription_error(Oid subid, bool is_apply_error); extern void pgstat_report_subscription_drop(Oid subid); +/* + * Functions in pgstat_xact.c + */ + +extern void AtEOXact_PgStat(bool isCommit, bool parallel); +extern void AtEOSubXact_PgStat(bool isCommit, int nestDepth); +extern void AtPrepare_PgStat(void); +extern void PostPrepare_PgStat(void); + + /* * Functions in pgstat_wal.c */ diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index abbb4f8d96..6a828e3aa0 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -77,7 +77,6 @@ static const char *const slru_names[] = { * Functions in pgstat.c */ -extern PgStat_SubXactStatus *pgstat_xact_stack_level_get(int nest_level); extern void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype); extern void pgstat_send(void *msg, int len); #ifdef USE_ASSERT_CHECKING @@ -129,6 +128,13 @@ extern void pgstat_wal_initialize(void); extern bool pgstat_wal_pending(void); +/* + * Functions in pgstat_xact.c + */ + +extern PgStat_SubXactStatus *pgstat_xact_stack_level_get(int nest_level); + + /* * Variables in pgstat.c */ From bdbd3d9064f9dbd064253e05f156ec77d4a90d05 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 13:56:06 -0700 Subject: [PATCH 398/772] pgstat: stats collector references in comments. Soon the stats collector will be no more, with statistics instead getting stored in shared memory. There are a lot of references to the stats collector in comments. This commit replaces most of these references with "cumulative statistics system", with the remaining ones getting replaced as part of subsequent commits. This is done separately from the - quite large - shared memory statistics patch to make review easier. Author: Andres Freund Reviewed-By: Justin Pryzby Reviewed-By: Thomas Munro Reviewed-By: Kyotaro Horiguchi Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de Discussion: https://postgr.es/m/20220308205351.2xcn6k4x5yivcxyd@alap3.anarazel.de --- contrib/test_decoding/t/001_repl_stats.pl | 3 +- src/backend/access/heap/heapam_handler.c | 4 +-- src/backend/access/heap/vacuumlazy.c | 8 +++--- src/backend/commands/analyze.c | 2 +- src/backend/commands/dbcommands.c | 2 +- src/backend/commands/matview.c | 8 +++--- src/backend/commands/subscriptioncmds.c | 4 +-- src/backend/commands/vacuum.c | 4 +-- src/backend/postmaster/autovacuum.c | 14 +++++----- src/backend/postmaster/bgwriter.c | 4 +-- src/backend/postmaster/checkpointer.c | 14 +++------- src/backend/postmaster/pgarch.c | 8 +++--- src/backend/postmaster/pgstat.c | 28 +++++++++---------- src/backend/postmaster/walwriter.c | 9 +++--- src/backend/replication/basebackup.c | 4 +-- src/backend/tcop/postgres.c | 8 +++--- src/backend/utils/activity/pgstat_archiver.c | 3 +- src/backend/utils/activity/pgstat_bgwriter.c | 2 +- .../utils/activity/pgstat_checkpointer.c | 2 +- src/backend/utils/activity/pgstat_database.c | 14 +++++----- src/backend/utils/activity/pgstat_relation.c | 16 +++++------ src/backend/utils/activity/pgstat_replslot.c | 10 +++---- src/backend/utils/activity/pgstat_slru.c | 3 +- .../utils/activity/pgstat_subscription.c | 8 +++--- src/backend/utils/adt/pgstatfuncs.c | 4 +-- src/backend/utils/error/elog.c | 2 +- src/include/pgstat.h | 4 +-- src/include/utils/backend_status.h | 4 +-- src/include/utils/pgstat_internal.h | 2 +- src/test/regress/expected/stats.out | 2 +- src/test/regress/sql/stats.sql | 2 +- 31 files changed, 95 insertions(+), 107 deletions(-) diff --git a/contrib/test_decoding/t/001_repl_stats.pl b/contrib/test_decoding/t/001_repl_stats.pl index fd82244a15..daf03ff147 100644 --- a/contrib/test_decoding/t/001_repl_stats.pl +++ b/contrib/test_decoding/t/001_repl_stats.pl @@ -88,8 +88,7 @@ sub test_slot_stats # Test to remove one of the replication slots and adjust # max_replication_slots accordingly to the number of slots. This leads # to a mismatch between the number of slots present in the stats file and the -# number of stats present in the shared memory, simulating the scenario for -# drop slot message lost by the statistics collector process. We verify +# number of stats present in shared memory. We verify # replication statistics data is fine after restart. $node->stop; diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 3a9532cb4f..666b6205a7 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -1089,8 +1089,8 @@ heapam_scan_analyze_next_tuple(TableScanDesc scan, TransactionId OldestXmin, * our own. In this case we should count and sample the row, * to accommodate users who load a table and analyze it in one * transaction. (pgstat_report_analyze has to adjust the - * numbers we send to the stats collector to make this come - * out right.) + * numbers we report to the cumulative stats system to make + * this come out right.) */ if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXmin(targtuple->t_data))) { diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 9cdc8008c1..092b739dda 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -609,9 +609,9 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, &frozenxid_updated, &minmulti_updated, false); /* - * Report results to the stats collector, too. + * Report results to the cumulative stats system, too. * - * Deliberately avoid telling the stats collector about LP_DEAD items that + * Deliberately avoid telling the stats system about LP_DEAD items that * remain in the table due to VACUUM bypassing index and heap vacuuming. * ANALYZE will consider the remaining LP_DEAD items to be dead "tuples". * It seems like a good idea to err on the side of not vacuuming again too @@ -2228,10 +2228,10 @@ lazy_vacuum(LVRelState *vacrel) * dead_items space is not CPU cache resident. * * We don't take any special steps to remember the LP_DEAD items (such - * as counting them in our final report to the stats collector) when + * as counting them in our final update to the stats system) when * the optimization is applied. Though the accounting used in * analyze.c's acquire_sample_rows() will recognize the same LP_DEAD - * items as dead rows in its own stats collector report, that's okay. + * items as dead rows in its own stats report, that's okay. * The discrepancy should be negligible. If this optimization is ever * expanded to cover more cases then this may need to be reconsidered. */ diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c index 736479295a..305226692a 100644 --- a/src/backend/commands/analyze.c +++ b/src/backend/commands/analyze.c @@ -680,7 +680,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params, } /* - * Now report ANALYZE to the stats collector. For regular tables, we do + * Now report ANALYZE to the cumulative stats system. For regular tables, we do * it only if not doing inherited stats. For partitioned tables, we only * do it for inherited stats. (We're never called for not-inherited stats * on partitioned tables anyway.) diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index df16533901..ce776c53ca 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -1665,7 +1665,7 @@ dropdb(const char *dbname, bool missing_ok, bool force) DropDatabaseBuffers(db_id); /* - * Tell the stats collector to forget it immediately, too. + * Tell the cumulative stats system to forget it immediately, too. */ pgstat_drop_database(db_id); diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c index 05e7b60059..9ab248d25e 100644 --- a/src/backend/commands/matview.c +++ b/src/backend/commands/matview.c @@ -338,10 +338,10 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, refresh_by_heap_swap(matviewOid, OIDNewHeap, relpersistence); /* - * Inform stats collector about our activity: basically, we truncated - * the matview and inserted some new data. (The concurrent code path - * above doesn't need to worry about this because the inserts and - * deletes it issues get counted by lower-level code.) + * Inform cumulative stats system about our activity: basically, we + * truncated the matview and inserted some new data. (The concurrent + * code path above doesn't need to worry about this because the inserts + * and deletes it issues get counted by lower-level code.) */ pgstat_count_truncate(matviewRel); if (!stmt->skipData) diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 85dacbe93d..51505373ea 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -1409,7 +1409,7 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) * slot stays dropped even if the transaction rolls back. So we cannot * run DROP SUBSCRIPTION inside a transaction block if dropping the * replication slot. Also, in this case, we report a message for dropping - * the subscription to the stats collector. + * the subscription to the cumulative stats system. * * XXX The command name should really be something like "DROP SUBSCRIPTION * of a subscription that is associated with a replication slot", but we @@ -1583,7 +1583,7 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) PG_END_TRY(); /* - * Send a message for dropping this subscription to the stats collector. + * Tell the cumulative stats system that the subscription is getting dropped. * We can safely report dropping the subscription statistics here if the * subscription is associated with a replication slot since we cannot run * DROP SUBSCRIPTION inside a transaction block. Subscription statistics diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index fb33953e35..04dbbe5530 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -352,8 +352,8 @@ vacuum(List *relations, VacuumParams *params, errmsg("PROCESS_TOAST required with VACUUM FULL"))); /* - * Send info about dead objects to the statistics collector, unless we are - * in autovacuum --- autovacuum.c does this for itself. + * Send info about dead objects to the cumulative stats system, unless + * we are in autovacuum --- autovacuum.c does this for itself. */ if ((params->options & VACOPT_VACUUM) && !IsAutoVacuumWorkerProcess()) pgstat_vacuum_stat(); diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 681ef91b81..c6d30fa527 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1689,7 +1689,7 @@ AutoVacWorkerMain(int argc, char *argv[]) char dbname[NAMEDATALEN]; /* - * Report autovac startup to the stats collector. We deliberately do + * Report autovac startup to the cumulative stats system. We deliberately do * this before InitPostgres, so that the last_autovac_time will get * updated even if the connection attempt fails. This is to prevent * autovac from getting "stuck" repeatedly selecting an unopenable @@ -1996,9 +1996,9 @@ do_autovacuum(void) StartTransactionCommand(); /* - * Clean up any dead statistics collector entries for this DB. We always - * want to do this exactly once per DB-processing cycle, even if we find - * nothing worth vacuuming in the database. + * Clean up any dead statistics entries for this DB. We always want to do + * this exactly once per DB-processing cycle, even if we find nothing + * worth vacuuming in the database. */ pgstat_vacuum_stat(); @@ -3041,7 +3041,7 @@ recheck_relation_needs_vacanalyze(Oid relid, * * For analyze, the analysis done is that the number of tuples inserted, * deleted and updated since the last analyze exceeds a threshold calculated - * in the same fashion as above. Note that the collector actually stores + * in the same fashion as above. Note that the cumulative stats system stores * the number of tuples (both live and dead) that there were as of the last * analyze. This is asymmetric to the VACUUM case. * @@ -3051,8 +3051,8 @@ recheck_relation_needs_vacanalyze(Oid relid, * * A table whose autovacuum_enabled option is false is * automatically skipped (unless we have to vacuum it due to freeze_max_age). - * Thus autovacuum can be disabled for specific tables. Also, when the stats - * collector does not have data about a table, it will be skipped. + * Thus autovacuum can be disabled for specific tables. Also, when the cumulative + * stats system does not have data about a table, it will be skipped. * * A table whose vac_base_thresh value is < 0 takes the base value from the * autovacuum_vacuum_threshold GUC variable. Similarly, a vac_scale_factor diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c index d1f5d12eff..447596b2a8 100644 --- a/src/backend/postmaster/bgwriter.c +++ b/src/backend/postmaster/bgwriter.c @@ -240,9 +240,7 @@ BackgroundWriterMain(void) */ can_hibernate = BgBufferSync(&wb_context); - /* - * Send off activity statistics to the stats collector - */ + /* Report pending statistics to the cumulative stats system */ pgstat_send_bgwriter(); if (FirstCallSinceLastCheckpoint()) diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c index a59c3cf020..80914aa891 100644 --- a/src/backend/postmaster/checkpointer.c +++ b/src/backend/postmaster/checkpointer.c @@ -492,12 +492,8 @@ CheckpointerMain(void) /* Check for archive_timeout and switch xlog files if necessary. */ CheckArchiveTimeout(); - /* - * Send off activity statistics to the stats collector. - */ + /* Report pending statistics to the cumulative stats system */ pgstat_send_checkpointer(); - - /* Send WAL statistics to the stats collector. */ pgstat_send_wal(true); /* @@ -570,8 +566,8 @@ HandleCheckpointerInterrupts(void) * Close down the database. * * Since ShutdownXLOG() creates restartpoint or checkpoint, and - * updates the statistics, increment the checkpoint request and send - * the statistics to the stats collector. + * updates the statistics, increment the checkpoint request and flush + * out pending statistic. */ PendingCheckpointerStats.m_requested_checkpoints++; ShutdownXLOG(0, 0); @@ -718,9 +714,7 @@ CheckpointWriteDelay(int flags, double progress) CheckArchiveTimeout(); - /* - * Report interim activity statistics. - */ + /* Report interim statistics to the cumulative stats system */ pgstat_send_checkpointer(); /* diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c index d916ed39a8..adfa404f46 100644 --- a/src/backend/postmaster/pgarch.c +++ b/src/backend/postmaster/pgarch.c @@ -477,8 +477,8 @@ pgarch_ArchiverCopyLoop(void) pgarch_archiveDone(xlog); /* - * Tell the collector about the WAL file that we successfully - * archived + * Tell the cumulative stats system about the WAL file that we + * successfully archived */ pgstat_send_archiver(xlog, false); @@ -487,8 +487,8 @@ pgarch_ArchiverCopyLoop(void) else { /* - * Tell the collector about the WAL file that we failed to - * archive + * Tell the cumulative stats system about the WAL file that we + * failed to archive */ pgstat_send_archiver(xlog, true); diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 6757df397c..8cbed1d1bc 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -693,9 +693,9 @@ allow_immediate_pgstat_restart(void) /* * Shut down a single backend's statistics reporting at process exit. * - * Flush any remaining statistics counts out to the collector. - * Without this, operations triggered during backend exit (such as - * temp table deletions) won't be counted. + * Flush out any remaining statistics counts. Without this, operations + * triggered during backend exit (such as temp table deletions) won't be + * counted. */ static void pgstat_shutdown_hook(int code, Datum arg) @@ -703,10 +703,10 @@ pgstat_shutdown_hook(int code, Datum arg) Assert(!pgstat_is_shutdown); /* - * If we got as far as discovering our own database ID, we can report what - * we did to the collector. Otherwise, we'd be sending an invalid - * database ID, so forget it. (This means that accesses to pg_database - * during failed backend starts might never get counted.) + * If we got as far as discovering our own database ID, we can flush out + * what we did so far. Otherwise, we'd be reporting an invalid database + * ID, so forget it. (This means that accesses to pg_database during + * failed backend starts might never get counted.) */ if (OidIsValid(MyDatabaseId)) pgstat_report_stat(true); @@ -1065,7 +1065,7 @@ pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid) } /* - * Tell the statistics collector to reset counters for our database. + * Reset counters for our database. * * Permission checking for this function is managed through the normal * GRANT system. @@ -1084,7 +1084,7 @@ pgstat_reset_counters(void) } /* - * Tell the statistics collector to reset a single counter. + * Reset a single counter. * * Permission checking for this function is managed through the normal * GRANT system. @@ -1106,7 +1106,7 @@ pgstat_reset_single_counter(Oid objoid, PgStat_Single_Reset_Type type) } /* - * Tell the statistics collector to reset cluster-wide shared counters. + * Reset cluster-wide shared counters. * * Permission checking for this function is managed through the normal * GRANT system. @@ -1198,8 +1198,8 @@ pgstat_clear_snapshot(void) /* * Support function for the SQL-callable pgstat* functions. Returns * the collected statistics for one database or NULL. NULL doesn't mean - * that the database doesn't exist, it is just not yet known by the - * collector, so the caller is better off to report ZERO instead. + * that the database doesn't exist, just that there are no statistics, so the + * caller is better off to report ZERO instead. */ PgStat_StatDBEntry * pgstat_fetch_stat_dbentry(Oid dbid) @@ -1233,8 +1233,8 @@ pgstat_fetch_global(void) /* * Support function for the SQL-callable pgstat* functions. Returns * the collected statistics for one table or NULL. NULL doesn't mean - * that the table doesn't exist, it is just not yet known by the - * collector, so the caller is better off to report ZERO instead. + * that the table doesn't exist, just that there are no statistics, so the + * caller is better off to report ZERO instead. */ PgStat_StatTabEntry * pgstat_fetch_stat_tabentry(Oid relid) diff --git a/src/backend/postmaster/walwriter.c b/src/backend/postmaster/walwriter.c index 102fa2a089..e2c7eb78d6 100644 --- a/src/backend/postmaster/walwriter.c +++ b/src/backend/postmaster/walwriter.c @@ -257,7 +257,7 @@ WalWriterMain(void) else if (left_till_hibernate > 0) left_till_hibernate--; - /* Send WAL statistics to the stats collector */ + /* report pending statistics to the cumulative stats system */ pgstat_send_wal(false); /* @@ -295,12 +295,11 @@ HandleWalWriterInterrupts(void) if (ShutdownRequestPending) { /* - * Force to send remaining WAL statistics to the stats collector at - * process exit. + * Force reporting remaining WAL statistics at process exit. * * Since pgstat_send_wal is invoked with 'force' is false in main loop - * to avoid overloading to the stats collector, there may exist unsent - * stats counters for the WAL writer. + * to avoid overloading the cumulative stats system, there may exist + * unreported stats counters for the WAL writer. */ pgstat_send_wal(true); diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index 815681ada7..f01fff3a90 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -1505,8 +1505,8 @@ is_checksummed_file(const char *fullpath, const char *filename) * * If 'missing_ok' is true, will not throw an error if the file is not found. * - * If dboid is anything other than InvalidOid then any checksum failures detected - * will get reported to the stats collector. + * If dboid is anything other than InvalidOid then any checksum failures + * detected will get reported to the cumulative stats system. * * Returns true if the file was successfully sent, false if 'missing_ok', * and the file did not exist. diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index ba2fcfeb4a..260b650f15 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -2937,7 +2937,7 @@ die(SIGNAL_ARGS) ProcDiePending = true; } - /* for the statistics collector */ + /* for the cumulative stats system */ pgStatSessionEndCause = DISCONNECT_KILLED; /* If we're still here, waken anything waiting on the process latch */ @@ -4368,8 +4368,8 @@ PostgresMain(const char *dbname, const char *username) * * Note: this includes fflush()'ing the last of the prior output. * - * This is also a good time to send collected statistics to the - * collector, and to update the PS stats display. We avoid doing + * This is also a good time to flush out collected statistics to the + * cumulative stats system, and to update the PS stats display. We avoid doing * those every time through the message loop because it'd slow down * processing of batched messages, and because we don't want to report * uncommitted updates (that confuses autovacuum). The notification @@ -4710,7 +4710,7 @@ PostgresMain(const char *dbname, const char *username) */ case EOF: - /* for the statistics collector */ + /* for the cumulative statistics system */ pgStatSessionEndCause = DISCONNECT_CLIENT_EOF; /* FALLTHROUGH */ diff --git a/src/backend/utils/activity/pgstat_archiver.c b/src/backend/utils/activity/pgstat_archiver.c index 4a37b8f6e7..c829b91b60 100644 --- a/src/backend/utils/activity/pgstat_archiver.c +++ b/src/backend/utils/activity/pgstat_archiver.c @@ -22,8 +22,7 @@ /* - * Tell the collector about the WAL file that we successfully - * archived or failed to archive. + * Report archiver statistics */ void pgstat_send_archiver(const char *xlog, bool failed) diff --git a/src/backend/utils/activity/pgstat_bgwriter.c b/src/backend/utils/activity/pgstat_bgwriter.c index 0d9421666d..7e7eae8037 100644 --- a/src/backend/utils/activity/pgstat_bgwriter.c +++ b/src/backend/utils/activity/pgstat_bgwriter.c @@ -29,7 +29,7 @@ PgStat_MsgBgWriter PendingBgWriterStats; /* - * Send bgwriter statistics to the collector + * Report bgwriter statistics */ void pgstat_send_bgwriter(void) diff --git a/src/backend/utils/activity/pgstat_checkpointer.c b/src/backend/utils/activity/pgstat_checkpointer.c index f8358eb4e0..dbb9d861a4 100644 --- a/src/backend/utils/activity/pgstat_checkpointer.c +++ b/src/backend/utils/activity/pgstat_checkpointer.c @@ -29,7 +29,7 @@ PgStat_MsgCheckpointer PendingCheckpointerStats; /* - * Send checkpointer statistics to the collector + * Report checkpointer statistics */ void pgstat_send_checkpointer(void) diff --git a/src/backend/utils/activity/pgstat_database.c b/src/backend/utils/activity/pgstat_database.c index 6c38fe86a4..6d27657bdb 100644 --- a/src/backend/utils/activity/pgstat_database.c +++ b/src/backend/utils/activity/pgstat_database.c @@ -75,7 +75,7 @@ pgstat_report_autovac(Oid dboid) } /* - * Tell the collector about a Hot Standby recovery conflict. + * Report a Hot Standby recovery conflict. */ void pgstat_report_recovery_conflict(int reason) @@ -92,7 +92,7 @@ pgstat_report_recovery_conflict(int reason) } /* - * Tell the collector about a deadlock detected. + * Report a detected deadlock. */ void pgstat_report_deadlock(void) @@ -108,7 +108,7 @@ pgstat_report_deadlock(void) } /* - * Tell the collector about one or more checksum failures. + * Report one or more checksum failures. */ void pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount) @@ -127,7 +127,7 @@ pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount) } /* - * Tell the collector about a checksum failure. + * Report one checksum failure in the current database. */ void pgstat_report_checksum_failure(void) @@ -136,7 +136,7 @@ pgstat_report_checksum_failure(void) } /* - * Tell the collector about a temporary file. + * Report creation of temporary file. */ void pgstat_report_tempfile(size_t filesize) @@ -153,7 +153,7 @@ pgstat_report_tempfile(size_t filesize) } /* - * Tell the collector about a new connection. + * Notify stats system of a new connection. */ void pgstat_report_connect(Oid dboid) @@ -171,7 +171,7 @@ pgstat_report_connect(Oid dboid) } /* - * Tell the collector about a disconnect. + * Notify the stats system of a disconnect. */ void pgstat_report_disconnect(Oid dboid) diff --git a/src/backend/utils/activity/pgstat_relation.c b/src/backend/utils/activity/pgstat_relation.c index 957f5b858a..a78b8d2450 100644 --- a/src/backend/utils/activity/pgstat_relation.c +++ b/src/backend/utils/activity/pgstat_relation.c @@ -168,7 +168,7 @@ pgstat_drop_relation(Oid relid) #endif /* NOT_USED */ /* - * Tell the collector about the table we just vacuumed. + * Report that the table was just vacuumed. */ void pgstat_report_vacuum(Oid tableoid, bool shared, @@ -190,7 +190,7 @@ pgstat_report_vacuum(Oid tableoid, bool shared, } /* - * Tell the collector about the table we just analyzed. + * Report that the table was just analyzed. * * Caller must provide new live- and dead-tuples estimates, as well as a * flag indicating whether to reset the changes_since_analyze counter. @@ -210,10 +210,10 @@ pgstat_report_analyze(Relation rel, * already inserted and/or deleted rows in the target table. ANALYZE will * have counted such rows as live or dead respectively. Because we will * report our counts of such rows at transaction end, we should subtract - * off these counts from what we send to the collector now, else they'll - * be double-counted after commit. (This approach also ensures that the - * collector ends up with the right numbers if we abort instead of - * committing.) + * off these counts from the update we're making now, else they'll be + * double-counted after commit. (This approach also ensures that the + * shared stats entry ends up with the right numbers if we abort instead + * of committing.) * * Waste no time on partitioned tables, though. */ @@ -537,8 +537,8 @@ AtPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state) /* * All we need do here is unlink the transaction stats state from the * nontransactional state. The nontransactional action counts will be - * reported to the stats collector immediately, while the effects on - * live and dead tuple counts are preserved in the 2PC state file. + * reported to the stats system immediately, while the effects on live and + * dead tuple counts are preserved in the 2PC state file. * * Note: AtEOXact_PgStat_Relations is not called during PREPARE. */ diff --git a/src/backend/utils/activity/pgstat_replslot.c b/src/backend/utils/activity/pgstat_replslot.c index a9405cd135..35078ad73c 100644 --- a/src/backend/utils/activity/pgstat_replslot.c +++ b/src/backend/utils/activity/pgstat_replslot.c @@ -23,8 +23,8 @@ /* - * Tell the statistics collector to reset a single replication slot - * counter, or all replication slots counters (when name is null). + * Reset counters for a single replication slot, or all replication slots + * (when name is null). * * Permission checking for this function is managed through the normal * GRANT system. @@ -51,7 +51,7 @@ pgstat_reset_replslot_counter(const char *name) } /* - * Tell the collector about replication slot statistics. + * Report replication slot statistics. */ void pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat) @@ -77,7 +77,7 @@ pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat) } /* - * Tell the collector about creating the replication slot. + * Report replication slot creation. */ void pgstat_report_replslot_create(const char *slotname) @@ -92,7 +92,7 @@ pgstat_report_replslot_create(const char *slotname) } /* - * Tell the collector about dropping the replication slot. + * Report replication slot drop. */ void pgstat_report_replslot_drop(const char *slotname) diff --git a/src/backend/utils/activity/pgstat_slru.c b/src/backend/utils/activity/pgstat_slru.c index 3e284900b1..6dae3a5dc6 100644 --- a/src/backend/utils/activity/pgstat_slru.c +++ b/src/backend/utils/activity/pgstat_slru.c @@ -33,8 +33,7 @@ static PgStat_MsgSLRU SLRUStats[SLRU_NUM_ELEMENTS]; /* - * Tell the statistics collector to reset a single SLRU counter, or all - * SLRU counters (when name is null). + * Reset counters for a single SLRU, or all SLRUs (when name is null). * * Permission checking for this function is managed through the normal * GRANT system. diff --git a/src/backend/utils/activity/pgstat_subscription.c b/src/backend/utils/activity/pgstat_subscription.c index 70874e13f5..2ee23d5ae2 100644 --- a/src/backend/utils/activity/pgstat_subscription.c +++ b/src/backend/utils/activity/pgstat_subscription.c @@ -21,8 +21,8 @@ /* - * Tell the statistics collector to reset a single subscription - * counter, or all subscription counters (when subid is InvalidOid). + * Reset counters for a single subscription, or all subscriptions (when subid + * is InvalidOid). * * Permission checking for this function is managed through the normal * GRANT system. @@ -42,7 +42,7 @@ pgstat_reset_subscription_counter(Oid subid) } /* - * Tell the collector about the subscription error. + * Report a subscription error. */ void pgstat_report_subscription_error(Oid subid, bool is_apply_error) @@ -56,7 +56,7 @@ pgstat_report_subscription_error(Oid subid, bool is_apply_error) } /* - * Tell the collector about dropping the subscription. + * Report dropping the subscription. */ void pgstat_report_subscription_drop(Oid subid) diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index ce84525d40..fd4276fbc6 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -1,7 +1,7 @@ /*------------------------------------------------------------------------- * * pgstatfuncs.c - * Functions for accessing the statistics collector data + * Functions for accessing various forms of statistics data * * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California @@ -1820,7 +1820,7 @@ pg_stat_get_slru(PG_FUNCTION_ARGS) SetSingleFuncCall(fcinfo, 0); - /* request SLRU stats from the stat collector */ + /* request SLRU stats from the cumulative stats system */ stats = pgstat_fetch_slru(); for (i = 0;; i++) diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 7402696986..bd4b2c19b1 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -647,7 +647,7 @@ errfinish(const char *filename, int lineno, const char *funcname) fflush(stderr); /* - * Let the statistics collector know. Only mark the session as + * Let the cumulative stats system know. Only mark the session as * terminated by fatal error if there is no other known cause. */ if (pgStatSessionEndCause == DISCONNECT_NORMAL) diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 95bf06f829..77b6927518 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -1,7 +1,7 @@ /* ---------- * pgstat.h * - * Definitions for the PostgreSQL statistics collector daemon. + * Definitions for the PostgreSQL cumulative statistics system. * * Copyright (c) 2001-2022, PostgreSQL Global Development Group * @@ -86,7 +86,7 @@ typedef enum PgStat_Single_Reset_Type * it against zeroes to detect whether there are any counts to transmit. * * Note that the time counters are in instr_time format here. We convert to - * microseconds in PgStat_Counter format when transmitting to the collector. + * microseconds in PgStat_Counter format when flushing out pending statistics. * ---------- */ typedef struct PgStat_FunctionCounts diff --git a/src/include/utils/backend_status.h b/src/include/utils/backend_status.h index 8217d0cb6b..7403bca25e 100644 --- a/src/include/utils/backend_status.h +++ b/src/include/utils/backend_status.h @@ -85,8 +85,8 @@ typedef struct PgBackendGSSStatus * * Each live backend maintains a PgBackendStatus struct in shared memory * showing its current activity. (The structs are allocated according to - * BackendId, but that is not critical.) Note that the collector process - * has no involvement in, or even access to, these structs. + * BackendId, but that is not critical.) Note that this is unrelated to the + * cumulative stats system (i.e. pgstat.c et al). * * Each auxiliary process also maintains a PgBackendStatus struct in shared * memory. diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index 6a828e3aa0..1923f56a3a 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -1,7 +1,7 @@ /* ---------- * pgstat_internal.h * - * Definitions for the PostgreSQL activity statistics facility that should + * Definitions for the PostgreSQL cumulative statistics system that should * only be needed by files implementing statistics support (rather than ones * reporting / querying stats). * diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index 06a1d2f229..494fb26237 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -1,5 +1,5 @@ -- --- Test Statistics Collector +-- Test cumulative stats system -- -- Must be run after tenk2 has been created (by create_table), -- populated (by create_misc) and indexed (by create_index). diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index ae1ec173e3..d0ba1f6d7b 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -1,5 +1,5 @@ -- --- Test Statistics Collector +-- Test cumulative stats system -- -- Must be run after tenk2 has been created (by create_table), -- populated (by create_misc) and indexed (by create_index). From dbafe127bb215f512164669b49f99fcb7ed9d266 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 6 Apr 2022 17:03:35 -0400 Subject: [PATCH 399/772] Suppress "variable 'pagesaving' set but not used" warning. With asserts disabled, late-model clang notices that this variable is incremented but never otherwise read. Discussion: https://postgr.es/m/3171401.1649275153@sss.pgh.pa.us --- src/backend/access/nbtree/nbtdedup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/access/nbtree/nbtdedup.c b/src/backend/access/nbtree/nbtdedup.c index 3e11805293..0207421a5d 100644 --- a/src/backend/access/nbtree/nbtdedup.c +++ b/src/backend/access/nbtree/nbtdedup.c @@ -65,7 +65,7 @@ _bt_dedup_pass(Relation rel, Buffer buf, Relation heapRel, IndexTuple newitem, BTPageOpaque opaque = BTPageGetOpaque(page); Page newpage; BTDedupState state; - Size pagesaving = 0; + Size pagesaving PG_USED_FOR_ASSERTS_ONLY = 0; bool singlevalstrat = false; int nkeyatts = IndexRelationGetNumberOfKeyAttributes(rel); From cc96373cf39bbfb386a40a47b7f0ea8f051f1838 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 14:08:57 -0700 Subject: [PATCH 400/772] pgstat: rename some pgstat_send_* functions to pgstat_report_*. Only the pgstat_send_* functions that are called from outside pgstat*.c are renamed (the rest will go away). This is done separately from the - quite large - shared memory statistics patch to make review easier. Author: Andres Freund Reviewed-By: Kyotaro Horiguchi Discussion: https://postgr.es/m/20220404041516.cctrvpadhuriawlq@alap3.anarazel.de --- src/backend/postmaster/bgwriter.c | 2 +- src/backend/postmaster/checkpointer.c | 10 +++++----- src/backend/postmaster/pgarch.c | 4 ++-- src/backend/postmaster/pgstat.c | 2 +- src/backend/postmaster/walwriter.c | 6 +++--- src/backend/utils/activity/pgstat_archiver.c | 2 +- src/backend/utils/activity/pgstat_bgwriter.c | 2 +- src/backend/utils/activity/pgstat_checkpointer.c | 2 +- src/backend/utils/activity/pgstat_wal.c | 8 ++++---- src/include/pgstat.h | 8 ++++---- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c index 447596b2a8..91e6f6ea18 100644 --- a/src/backend/postmaster/bgwriter.c +++ b/src/backend/postmaster/bgwriter.c @@ -241,7 +241,7 @@ BackgroundWriterMain(void) can_hibernate = BgBufferSync(&wb_context); /* Report pending statistics to the cumulative stats system */ - pgstat_send_bgwriter(); + pgstat_report_bgwriter(); if (FirstCallSinceLastCheckpoint()) { diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c index 80914aa891..e733c70368 100644 --- a/src/backend/postmaster/checkpointer.c +++ b/src/backend/postmaster/checkpointer.c @@ -493,8 +493,8 @@ CheckpointerMain(void) CheckArchiveTimeout(); /* Report pending statistics to the cumulative stats system */ - pgstat_send_checkpointer(); - pgstat_send_wal(true); + pgstat_report_checkpointer(); + pgstat_report_wal(true); /* * If any checkpoint flags have been set, redo the loop to handle the @@ -571,8 +571,8 @@ HandleCheckpointerInterrupts(void) */ PendingCheckpointerStats.m_requested_checkpoints++; ShutdownXLOG(0, 0); - pgstat_send_checkpointer(); - pgstat_send_wal(true); + pgstat_report_checkpointer(); + pgstat_report_wal(true); /* Normal exit from the checkpointer is here */ proc_exit(0); /* done */ @@ -715,7 +715,7 @@ CheckpointWriteDelay(int flags, double progress) CheckArchiveTimeout(); /* Report interim statistics to the cumulative stats system */ - pgstat_send_checkpointer(); + pgstat_report_checkpointer(); /* * This sleep used to be connected to bgwriter_delay, typically 200ms. diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c index adfa404f46..0c8ca29f73 100644 --- a/src/backend/postmaster/pgarch.c +++ b/src/backend/postmaster/pgarch.c @@ -480,7 +480,7 @@ pgarch_ArchiverCopyLoop(void) * Tell the cumulative stats system about the WAL file that we * successfully archived */ - pgstat_send_archiver(xlog, false); + pgstat_report_archiver(xlog, false); break; /* out of inner retry loop */ } @@ -490,7 +490,7 @@ pgarch_ArchiverCopyLoop(void) * Tell the cumulative stats system about the WAL file that we * failed to archive */ - pgstat_send_archiver(xlog, true); + pgstat_report_archiver(xlog, true); if (++failures >= NUM_ARCHIVE_RETRIES) { diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 8cbed1d1bc..586dd710ef 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -793,7 +793,7 @@ pgstat_report_stat(bool disconnect) pgstat_send_funcstats(); /* Send WAL statistics */ - pgstat_send_wal(true); + pgstat_report_wal(true); /* Finally send SLRU statistics */ pgstat_send_slru(); diff --git a/src/backend/postmaster/walwriter.c b/src/backend/postmaster/walwriter.c index e2c7eb78d6..77aebb244c 100644 --- a/src/backend/postmaster/walwriter.c +++ b/src/backend/postmaster/walwriter.c @@ -258,7 +258,7 @@ WalWriterMain(void) left_till_hibernate--; /* report pending statistics to the cumulative stats system */ - pgstat_send_wal(false); + pgstat_report_wal(false); /* * Sleep until we are signaled or WalWriterDelay has elapsed. If we @@ -297,11 +297,11 @@ HandleWalWriterInterrupts(void) /* * Force reporting remaining WAL statistics at process exit. * - * Since pgstat_send_wal is invoked with 'force' is false in main loop + * Since pgstat_report_wal is invoked with 'force' is false in main loop * to avoid overloading the cumulative stats system, there may exist * unreported stats counters for the WAL writer. */ - pgstat_send_wal(true); + pgstat_report_wal(true); proc_exit(0); } diff --git a/src/backend/utils/activity/pgstat_archiver.c b/src/backend/utils/activity/pgstat_archiver.c index c829b91b60..09bc12070d 100644 --- a/src/backend/utils/activity/pgstat_archiver.c +++ b/src/backend/utils/activity/pgstat_archiver.c @@ -25,7 +25,7 @@ * Report archiver statistics */ void -pgstat_send_archiver(const char *xlog, bool failed) +pgstat_report_archiver(const char *xlog, bool failed) { PgStat_MsgArchiver msg; diff --git a/src/backend/utils/activity/pgstat_bgwriter.c b/src/backend/utils/activity/pgstat_bgwriter.c index 7e7eae8037..dfea88eca1 100644 --- a/src/backend/utils/activity/pgstat_bgwriter.c +++ b/src/backend/utils/activity/pgstat_bgwriter.c @@ -32,7 +32,7 @@ PgStat_MsgBgWriter PendingBgWriterStats; * Report bgwriter statistics */ void -pgstat_send_bgwriter(void) +pgstat_report_bgwriter(void) { /* We assume this initializes to zeroes */ static const PgStat_MsgBgWriter all_zeroes; diff --git a/src/backend/utils/activity/pgstat_checkpointer.c b/src/backend/utils/activity/pgstat_checkpointer.c index dbb9d861a4..3f4e2054f5 100644 --- a/src/backend/utils/activity/pgstat_checkpointer.c +++ b/src/backend/utils/activity/pgstat_checkpointer.c @@ -32,7 +32,7 @@ PgStat_MsgCheckpointer PendingCheckpointerStats; * Report checkpointer statistics */ void -pgstat_send_checkpointer(void) +pgstat_report_checkpointer(void) { /* We assume this initializes to zeroes */ static const PgStat_MsgCheckpointer all_zeroes; diff --git a/src/backend/utils/activity/pgstat_wal.c b/src/backend/utils/activity/pgstat_wal.c index ad99988763..8680809dee 100644 --- a/src/backend/utils/activity/pgstat_wal.c +++ b/src/backend/utils/activity/pgstat_wal.c @@ -31,8 +31,8 @@ PgStat_MsgWal WalStats; /* * WAL usage counters saved from pgWALUsage at the previous call to - * pgstat_send_wal(). This is used to calculate how much WAL usage - * happens between pgstat_send_wal() calls, by subtracting + * pgstat_report_wal(). This is used to calculate how much WAL usage + * happens between pgstat_report_wal() calls, by subtracting * the previous counters from the current ones. */ static WalUsage prevWalUsage; @@ -45,7 +45,7 @@ static WalUsage prevWalUsage; * passed since last one was sent to reach PGSTAT_STAT_INTERVAL. */ void -pgstat_send_wal(bool force) +pgstat_report_wal(bool force) { static TimestampTz sendTime = 0; @@ -133,7 +133,7 @@ void pgstat_wal_initialize(void) { /* - * Initialize prevWalUsage with pgWalUsage so that pgstat_send_wal() can + * Initialize prevWalUsage with pgWalUsage so that pgstat_report_wal() can * calculate how much pgWalUsage counters are increased by subtracting * prevWalUsage from pgWalUsage. */ diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 77b6927518..aaab2f973b 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -997,21 +997,21 @@ extern PgStat_WalStats *pgstat_fetch_stat_wal(void); * Functions in pgstat_archiver.c */ -extern void pgstat_send_archiver(const char *xlog, bool failed); +extern void pgstat_report_archiver(const char *xlog, bool failed); /* * Functions in pgstat_bgwriter.c */ -extern void pgstat_send_bgwriter(void); +extern void pgstat_report_bgwriter(void); /* * Functions in pgstat_checkpointer.c */ -extern void pgstat_send_checkpointer(void); +extern void pgstat_report_checkpointer(void); /* @@ -1165,7 +1165,7 @@ extern void PostPrepare_PgStat(void); * Functions in pgstat_wal.c */ -extern void pgstat_send_wal(bool force); +extern void pgstat_report_wal(bool force); /* From 8ea7963fc741b6f403a544d56ad0ecf78e5237b1 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 14:09:18 -0700 Subject: [PATCH 401/772] pgstat: add pgstat_copy_relation_stats(). Until now index_concurrently_swap() directly modified pgstat internal datastructures. That will break with the introduction of shared memory statistics and seems off architecturally. This is done separately from the - quite large - shared memory statistics patch to make review easier. Author: Andres Freund Author: Kyotaro Horiguchi Reviewed-By: Kyotaro Horiguchi Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/backend/catalog/index.c | 26 ++-------------- src/backend/utils/activity/pgstat_relation.c | 32 ++++++++++++++++++++ src/include/pgstat.h | 2 ++ 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 55800c9478..fd389c28d8 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -1734,30 +1734,8 @@ index_concurrently_swap(Oid newIndexId, Oid oldIndexId, const char *oldName) changeDependenciesOf(RelationRelationId, oldIndexId, newIndexId); changeDependenciesOn(RelationRelationId, oldIndexId, newIndexId); - /* - * Copy over statistics from old to new index - */ - { - PgStat_StatTabEntry *tabentry; - - tabentry = pgstat_fetch_stat_tabentry(oldIndexId); - if (tabentry) - { - if (pgstat_relation_should_count(newClassRel)) - { - newClassRel->pgstat_info->t_counts.t_numscans = tabentry->numscans; - newClassRel->pgstat_info->t_counts.t_tuples_returned = tabentry->tuples_returned; - newClassRel->pgstat_info->t_counts.t_tuples_fetched = tabentry->tuples_fetched; - newClassRel->pgstat_info->t_counts.t_blocks_fetched = tabentry->blocks_fetched; - newClassRel->pgstat_info->t_counts.t_blocks_hit = tabentry->blocks_hit; - - /* - * The data will be sent by the next pgstat_report_stat() - * call. - */ - } - } - } + /* copy over statistics from old to new index */ + pgstat_copy_relation_stats(newClassRel, oldClassRel); /* Copy data of pg_statistic from the old index to the new one */ CopyStatistics(oldIndexId, newIndexId); diff --git a/src/backend/utils/activity/pgstat_relation.c b/src/backend/utils/activity/pgstat_relation.c index a78b8d2450..4f97d2f1d9 100644 --- a/src/backend/utils/activity/pgstat_relation.c +++ b/src/backend/utils/activity/pgstat_relation.c @@ -95,6 +95,38 @@ bool have_relation_stats; static HTAB *pgStatTabHash = NULL; +/* + * Copy stats between relations. This is used for things like REINDEX + * CONCURRENTLY. + */ +void +pgstat_copy_relation_stats(Relation dst, Relation src) +{ + PgStat_StatTabEntry *srcstats; + + srcstats = pgstat_fetch_stat_tabentry(RelationGetRelid(src)); + + if (!srcstats) + return; + + if (pgstat_relation_should_count(dst)) + { + /* + * XXX: temporarily this does not actually quite do what the name + * says, and just copy index related fields. A subsequent commit will + * do more. + */ + + dst->pgstat_info->t_counts.t_numscans = srcstats->numscans; + dst->pgstat_info->t_counts.t_tuples_returned = srcstats->tuples_returned; + dst->pgstat_info->t_counts.t_tuples_fetched = srcstats->tuples_fetched; + dst->pgstat_info->t_counts.t_blocks_fetched = srcstats->blocks_fetched; + dst->pgstat_info->t_counts.t_blocks_hit = srcstats->blocks_hit; + + /* the data will be sent by the next pgstat_report_stat() call */ + } +} + /* * Initialize a relcache entry to count access statistics. * Called whenever a relation is opened. diff --git a/src/include/pgstat.h b/src/include/pgstat.h index aaab2f973b..ed141f2d2f 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -1053,6 +1053,8 @@ extern PgStat_BackendFunctionEntry *find_funcstat_entry(Oid func_id); * Functions in pgstat_relation.c */ +extern void pgstat_copy_relation_stats(Relation dstrel, Relation srcrel); + extern void pgstat_relation_init(Relation rel); extern void pgstat_report_vacuum(Oid tableoid, bool shared, From a82a5eee314df52f3183cedc0ecbcac7369243b1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 6 Apr 2022 18:57:57 -0400 Subject: [PATCH 402/772] Use ISB as a spin-delay instruction on ARM64. This seems beneficial on high-core-count machines, and not harmful on lesser hardware. However, older ARM32 gear doesn't have this instruction, so restrict the patch to ARM64. Geoffrey Blake Discussion: https://postgr.es/m/78338F29-9D7F-4DC8-BD71-E9674CE71425@amazon.com --- src/include/storage/s_lock.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/include/storage/s_lock.h b/src/include/storage/s_lock.h index 8a5a905e38..af1145d98f 100644 --- a/src/include/storage/s_lock.h +++ b/src/include/storage/s_lock.h @@ -337,6 +337,23 @@ tas(volatile slock_t *lock) #define S_UNLOCK(lock) __sync_lock_release(lock) +/* + * Using an ISB instruction to delay in spinlock loops appears beneficial on + * high-core-count ARM64 processors. It seems mostly a wash for smaller gear, + * and ISB doesn't exist at all on pre-v7 ARM chips. + */ +#if defined(__aarch64__) || defined(__aarch64) + +#define SPIN_DELAY() spin_delay() + +static __inline__ void +spin_delay(void) +{ + __asm__ __volatile__( + " isb; \n"); +} + +#endif /* __aarch64__ || __aarch64 */ #endif /* HAVE_GCC__SYNC_INT32_TAS */ #endif /* __arm__ || __arm || __aarch64__ || __aarch64 */ From 0d5c387573be5c40bf18b7b8983f406637dff42f Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 7 Apr 2022 08:51:49 +0900 Subject: [PATCH 403/772] Add option --config-file to pg_rewind This option is useful to do a rewind with the server configuration file (aka postgresql.conf) located outside the data directory, which is something that some Linux distributions and some HA tools like to rely on. As a result, this can simplify the logic around a rewind by avoiding the copy of such files before running pg_rewind. This option affects pg_rewind when it internally starts the target cluster with some "postgres" commands, adding -c config_file=FILE to the command strings generated, when: - retrieving a restore_command using a "postgres -C" command for -c/--restore-target-wal. - forcing crash recovery once to get the cluster into a clean shutdown state. Author: Gunnar "Nick" Bluth Reviewed-by: Michael Banck, Alexander Kukushkin, Michael Paquier, Alexander Alekseev Discussion: https://postgr.es/m/7c59265d-ac50-b0aa-ca1e-65e8bd27642a@pro-open.de --- doc/src/sgml/ref/pg_rewind.sgml | 15 +++++++++++++++ src/bin/pg_rewind/pg_rewind.c | 22 ++++++++++++++++++++++ src/bin/pg_rewind/t/RewindTest.pm | 14 ++++++++++---- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/doc/src/sgml/ref/pg_rewind.sgml b/doc/src/sgml/ref/pg_rewind.sgml index 33e6bb64ad..e808239aa5 100644 --- a/doc/src/sgml/ref/pg_rewind.sgml +++ b/doc/src/sgml/ref/pg_rewind.sgml @@ -241,6 +241,21 @@ PostgreSQL documentation + + + + + Use the specified main server configuration file for the target + cluster. This affects pg_rewind when + it uses internally the postgres command + for the rewind operation on this cluster (when retrieving + restore_command with the option + and when forcing a + completion of crash recovery). + + + + diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c index 6cc44172fb..0922032e23 100644 --- a/src/bin/pg_rewind/pg_rewind.c +++ b/src/bin/pg_rewind/pg_rewind.c @@ -61,6 +61,7 @@ char *datadir_target = NULL; char *datadir_source = NULL; char *connstr_source = NULL; char *restore_command = NULL; +char *config_file = NULL; static bool debug = false; bool showprogress = false; @@ -87,6 +88,8 @@ usage(const char *progname) printf(_("Options:\n")); printf(_(" -c, --restore-target-wal use restore_command in target configuration to\n" " retrieve WAL files from archives\n")); + printf(_(" --config-file=FILENAME use specified main server configuration\n")); + printf(_(" file when running target cluster\n")); printf(_(" -D, --target-pgdata=DIRECTORY existing data directory to modify\n")); printf(_(" --source-pgdata=DIRECTORY source data directory to synchronize with\n")); printf(_(" --source-server=CONNSTR source server to synchronize with\n")); @@ -115,6 +118,7 @@ main(int argc, char **argv) {"source-pgdata", required_argument, NULL, 1}, {"source-server", required_argument, NULL, 2}, {"no-ensure-shutdown", no_argument, NULL, 4}, + {"config-file", required_argument, NULL, 5}, {"version", no_argument, NULL, 'V'}, {"restore-target-wal", no_argument, NULL, 'c'}, {"dry-run", no_argument, NULL, 'n'}, @@ -205,6 +209,10 @@ main(int argc, char **argv) case 4: no_ensure_shutdown = true; break; + + case 5: + config_file = pg_strdup(optarg); + break; } } @@ -1058,6 +1066,13 @@ getRestoreCommand(const char *argv0) appendPQExpBufferStr(postgres_cmd, " -D "); appendShellString(postgres_cmd, datadir_target); + /* add custom configuration file only if requested */ + if (config_file != NULL) + { + appendPQExpBufferStr(postgres_cmd, " -c config_file="); + appendShellString(postgres_cmd, config_file); + } + /* add -C switch, for restore_command */ appendPQExpBufferStr(postgres_cmd, " -C restore_command"); @@ -1136,6 +1151,13 @@ ensureCleanShutdown(const char *argv0) appendPQExpBufferStr(postgres_cmd, " --single -F -D "); appendShellString(postgres_cmd, datadir_target); + /* add custom configuration file only if requested */ + if (config_file != NULL) + { + appendPQExpBufferStr(postgres_cmd, " -c config_file="); + appendShellString(postgres_cmd, config_file); + } + /* finish with the database name, and a properly quoted redirection */ appendPQExpBufferStr(postgres_cmd, " template1 < "); appendShellString(postgres_cmd, DEVNULL); diff --git a/src/bin/pg_rewind/t/RewindTest.pm b/src/bin/pg_rewind/t/RewindTest.pm index 1e34768e27..8fd1f4b9de 100644 --- a/src/bin/pg_rewind/t/RewindTest.pm +++ b/src/bin/pg_rewind/t/RewindTest.pm @@ -263,7 +263,9 @@ sub run_pg_rewind "--debug", "--source-pgdata=$standby_pgdata", "--target-pgdata=$primary_pgdata", - "--no-sync" + "--no-sync", + "--config-file", + "$tmp_folder/primary-postgresql.conf.tmp" ], 'pg_rewind local'); } @@ -276,7 +278,8 @@ sub run_pg_rewind 'pg_rewind', "--debug", "--source-server", $standby_connstr, "--target-pgdata=$primary_pgdata", "--no-sync", - "--write-recovery-conf" + "--write-recovery-conf", "--config-file", + "$tmp_folder/primary-postgresql.conf.tmp" ], 'pg_rewind remote'); @@ -323,7 +326,8 @@ sub run_pg_rewind # Note the use of --no-ensure-shutdown here. WAL files are # gone in this mode and the primary has been stopped - # gracefully already. + # gracefully already. --config-file reuses the original + # postgresql.conf as restore_command has been enabled above. command_ok( [ 'pg_rewind', @@ -332,7 +336,9 @@ sub run_pg_rewind "--target-pgdata=$primary_pgdata", "--no-sync", "--no-ensure-shutdown", - "--restore-target-wal" + "--restore-target-wal", + "--config-file", + "$primary_pgdata/postgresql.conf" ], 'pg_rewind archive'); } From 997afad89d12f314555600feee8189d753e105d1 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 17:56:19 -0700 Subject: [PATCH 404/772] pgstat: introduce PgStat_Kind enum. Will be used by following commits to generalize stats infrastructure. Kept separate to allow commits stand reasonably on their own. Reviewed-By: Kyotaro Horiguchi Discussion: https://postgr.es/m/20220404041516.cctrvpadhuriawlq@alap3.anarazel.de --- src/include/pgstat.h | 24 ++++++++++++++++++++++++ src/tools/pgindent/typedefs.list | 1 + 2 files changed, 25 insertions(+) diff --git a/src/include/pgstat.h b/src/include/pgstat.h index ed141f2d2f..1bd1c5cf7b 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -33,6 +33,30 @@ /* Default directory to store temporary statistics data in */ #define PG_STAT_TMP_DIR "pg_stat_tmp" +/* The types of statistics entries */ +typedef enum PgStat_Kind +{ + /* use 0 for INVALID, to catch zero-initialized data */ + PGSTAT_KIND_INVALID = 0, + + /* stats for variable-numbered objects */ + PGSTAT_KIND_DATABASE, /* database-wide statistics */ + PGSTAT_KIND_RELATION, /* per-table statistics */ + PGSTAT_KIND_FUNCTION, /* per-function statistics */ + PGSTAT_KIND_REPLSLOT, /* per-slot statistics */ + PGSTAT_KIND_SUBSCRIPTION, /* per-subscription statistics */ + + /* stats for fixed-numbered objects */ + PGSTAT_KIND_ARCHIVER, + PGSTAT_KIND_BGWRITER, + PGSTAT_KIND_CHECKPOINTER, + PGSTAT_KIND_SLRU, + PGSTAT_KIND_WAL, +} PgStat_Kind; + +#define PGSTAT_KIND_FIRST_VALID PGSTAT_KIND_DATABASE +#define PGSTAT_KIND_LAST PGSTAT_KIND_WAL +#define PGSTAT_NUM_KINDS (PGSTAT_KIND_LAST + 1) /* Values for track_functions GUC variable --- order is significant! */ typedef enum TrackFunctionsLevel diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 9b4f77fbf1..e1684d4cae 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1942,6 +1942,7 @@ PgStat_FunctionCallUsage PgStat_FunctionCounts PgStat_FunctionEntry PgStat_GlobalStats +PgStat_Kind PgStat_Msg PgStat_MsgAnalyze PgStat_MsgAnlAncestors From 8fb580a35ce358063dfdd10991d017498283c767 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 17:56:19 -0700 Subject: [PATCH 405/772] pgstat: prepare APIs used by pgstatfuncs for shared memory stats. With the introduction of PgStat_Kind PgStat_Single_Reset_Type, PgStat_Shared_Reset_Target don't make sense anymore. Replace them with PgStat_Kind. Instead of having dedicated reset functions for different kinds of stats, use two generic helper routines (one to reset all stats of a kind, one to reset one stats entry). A number of reset functions were named pgstat_reset_*_counter(), despite affecting multiple counters. The generic helper routines get rid of pgstat_reset_single_counter(), pgstat_reset_subscription_counter(). Rename pgstat_reset_slru_counter(), pgstat_reset_replslot_counter() to pgstat_reset_slru(), pgstat_reset_replslot() respectively, and have them only deal with a single SLRU/slot. Resetting all SLRUs/slots goes through the generic pgstat_reset_of_kind(). Previously pg_stat_reset_replication_slot() used SearchNamedReplicationSlot() to check if a slot exists. API wise it seems better to move that to pgstat_replslot.c. This is done separately from the - quite large - shared memory statistics patch to make review easier. Reviewed-By: Kyotaro Horiguchi Discussion: https://postgr.es/m/20220404041516.cctrvpadhuriawlq@alap3.anarazel.de --- src/backend/postmaster/pgstat.c | 128 +++++++++++++----- src/backend/utils/activity/pgstat_replslot.c | 37 +++-- src/backend/utils/activity/pgstat_slru.c | 8 +- .../utils/activity/pgstat_subscription.c | 21 --- src/backend/utils/adt/pgstatfuncs.c | 68 +++++----- src/include/pgstat.h | 28 +--- src/tools/pgindent/typedefs.list | 2 - 7 files changed, 161 insertions(+), 131 deletions(-) diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 586dd710ef..6a98e6ddd7 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -124,7 +124,7 @@ static bool pgstat_write_statsfile_needed(void); static bool pgstat_db_requested(Oid databaseid); static PgStat_StatReplSlotEntry *pgstat_get_replslot_entry(NameData name, bool create_it); -static void pgstat_reset_replslot(PgStat_StatReplSlotEntry *slotstats, TimestampTz ts); +static void pgstat_reset_replslot_entry(PgStat_StatReplSlotEntry *slotstats, TimestampTz ts); static HTAB *pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid); @@ -1084,55 +1084,110 @@ pgstat_reset_counters(void) } /* - * Reset a single counter. + * Reset a single variable-numbered entry. + * + * If the stats kind is within a database, also reset the database's + * stat_reset_timestamp. * * Permission checking for this function is managed through the normal * GRANT system. */ void -pgstat_reset_single_counter(Oid objoid, PgStat_Single_Reset_Type type) +pgstat_reset(PgStat_Kind kind, Oid dboid, Oid objoid) { - PgStat_MsgResetsinglecounter msg; if (pgStatSock == PGINVALID_SOCKET) return; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSINGLECOUNTER); - msg.m_databaseid = MyDatabaseId; - msg.m_resettype = type; - msg.m_objectid = objoid; + switch (kind) + { + case PGSTAT_KIND_FUNCTION: + case PGSTAT_KIND_RELATION: + { + PgStat_MsgResetsinglecounter msg; - pgstat_send(&msg, sizeof(msg)); + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSINGLECOUNTER); + msg.m_databaseid = dboid; + msg.m_resettype = kind; + msg.m_objectid = objoid; + pgstat_send(&msg, sizeof(msg)); + } + break; + + case PGSTAT_KIND_SUBSCRIPTION: + { + PgStat_MsgResetsubcounter msg; + + Assert(dboid == InvalidOid); + msg.m_subid = objoid; + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSUBCOUNTER); + } + break; + + default: + elog(ERROR, "unexpected"); + } } /* - * Reset cluster-wide shared counters. + * Reset stats for all entries of a kind. * * Permission checking for this function is managed through the normal * GRANT system. */ void -pgstat_reset_shared_counters(const char *target) +pgstat_reset_of_kind(PgStat_Kind kind) { - PgStat_MsgResetsharedcounter msg; - if (pgStatSock == PGINVALID_SOCKET) return; - if (strcmp(target, "archiver") == 0) - msg.m_resettarget = RESET_ARCHIVER; - else if (strcmp(target, "bgwriter") == 0) - msg.m_resettarget = RESET_BGWRITER; - else if (strcmp(target, "wal") == 0) - msg.m_resettarget = RESET_WAL; - else - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("unrecognized reset target: \"%s\"", target), - errhint("Target must be \"archiver\", \"bgwriter\", or \"wal\"."))); + switch (kind) + { + case PGSTAT_KIND_ARCHIVER: + case PGSTAT_KIND_BGWRITER: + case PGSTAT_KIND_CHECKPOINTER: + case PGSTAT_KIND_WAL: + { + PgStat_MsgResetsharedcounter msg; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSHAREDCOUNTER); - pgstat_send(&msg, sizeof(msg)); + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSHAREDCOUNTER); + msg.m_resettarget = kind; + pgstat_send(&msg, sizeof(msg)); + } + break; + case PGSTAT_KIND_SLRU: + { + PgStat_MsgResetslrucounter msg; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSLRUCOUNTER); + msg.m_index = -1; + pgstat_send(&msg, sizeof(msg)); + } + break; + case PGSTAT_KIND_REPLSLOT: + { + PgStat_MsgResetreplslotcounter msg; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETREPLSLOTCOUNTER); + msg.clearall = true; + pgstat_send(&msg, sizeof(msg)); + } + break; + + case PGSTAT_KIND_SUBSCRIPTION: + { + PgStat_MsgResetsubcounter msg; + + msg.m_subid = InvalidOid; + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSUBCOUNTER); + + pgstat_send(&msg, sizeof(msg)); + } + break; + + default: + elog(ERROR, "unexpected"); + } } /* @@ -1954,7 +2009,7 @@ pgstat_get_replslot_entry(NameData name, bool create) if (create && !found) { namestrcpy(&(slotent->slotname), NameStr(name)); - pgstat_reset_replslot(slotent, 0); + pgstat_reset_replslot_entry(slotent, 0); } return slotent; @@ -1964,7 +2019,7 @@ pgstat_get_replslot_entry(NameData name, bool create) * Reset the given replication slot stats. */ static void -pgstat_reset_replslot(PgStat_StatReplSlotEntry *slotent, TimestampTz ts) +pgstat_reset_replslot_entry(PgStat_StatReplSlotEntry *slotent, TimestampTz ts) { /* reset only counters. Don't clear slot name */ slotent->spill_txns = 0; @@ -3528,7 +3583,8 @@ pgstat_recv_resetcounter(PgStat_MsgResetcounter *msg, int len) static void pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len) { - if (msg->m_resettarget == RESET_BGWRITER) + if (msg->m_resettarget == PGSTAT_KIND_BGWRITER || + msg->m_resettarget == PGSTAT_KIND_CHECKPOINTER) { /* * Reset the global, bgwriter and checkpointer statistics for the @@ -3537,13 +3593,13 @@ pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len) memset(&globalStats, 0, sizeof(globalStats)); globalStats.bgwriter.stat_reset_timestamp = GetCurrentTimestamp(); } - else if (msg->m_resettarget == RESET_ARCHIVER) + else if (msg->m_resettarget == PGSTAT_KIND_ARCHIVER) { /* Reset the archiver statistics for the cluster. */ memset(&archiverStats, 0, sizeof(archiverStats)); archiverStats.stat_reset_timestamp = GetCurrentTimestamp(); } - else if (msg->m_resettarget == RESET_WAL) + else if (msg->m_resettarget == PGSTAT_KIND_WAL) { /* Reset the WAL statistics for the cluster. */ memset(&walStats, 0, sizeof(walStats)); @@ -3577,10 +3633,10 @@ pgstat_recv_resetsinglecounter(PgStat_MsgResetsinglecounter *msg, int len) dbentry->stat_reset_timestamp = GetCurrentTimestamp(); /* Remove object if it exists, ignore it if not */ - if (msg->m_resettype == RESET_TABLE) + if (msg->m_resettype == PGSTAT_KIND_RELATION) (void) hash_search(dbentry->tables, (void *) &(msg->m_objectid), HASH_REMOVE, NULL); - else if (msg->m_resettype == RESET_FUNCTION) + else if (msg->m_resettype == PGSTAT_KIND_FUNCTION) (void) hash_search(dbentry->functions, (void *) &(msg->m_objectid), HASH_REMOVE, NULL); } @@ -3626,7 +3682,7 @@ pgstat_recv_resetreplslotcounter(PgStat_MsgResetreplslotcounter *msg, hash_seq_init(&sstat, replSlotStatHash); while ((slotent = (PgStat_StatReplSlotEntry *) hash_seq_search(&sstat)) != NULL) - pgstat_reset_replslot(slotent, ts); + pgstat_reset_replslot_entry(slotent, ts); } else { @@ -3643,7 +3699,7 @@ pgstat_recv_resetreplslotcounter(PgStat_MsgResetreplslotcounter *msg, return; /* Reset the stats for the requested replication slot */ - pgstat_reset_replslot(slotent, ts); + pgstat_reset_replslot_entry(slotent, ts); } } @@ -3963,7 +4019,7 @@ pgstat_recv_replslot(PgStat_MsgReplSlot *msg, int len) * lost, slotent has stats for the old slot. So we initialize all * counters at slot creation. */ - pgstat_reset_replslot(slotent, 0); + pgstat_reset_replslot_entry(slotent, 0); } else { diff --git a/src/backend/utils/activity/pgstat_replslot.c b/src/backend/utils/activity/pgstat_replslot.c index 35078ad73c..cfaf8d546c 100644 --- a/src/backend/utils/activity/pgstat_replslot.c +++ b/src/backend/utils/activity/pgstat_replslot.c @@ -23,30 +23,45 @@ /* - * Reset counters for a single replication slot, or all replication slots - * (when name is null). + * Reset counters for a single replication slot. * * Permission checking for this function is managed through the normal * GRANT system. */ void -pgstat_reset_replslot_counter(const char *name) +pgstat_reset_replslot(const char *name) { + ReplicationSlot *slot; PgStat_MsgResetreplslotcounter msg; + AssertArg(name != NULL); + if (pgStatSock == PGINVALID_SOCKET) return; - if (name) - { - namestrcpy(&msg.m_slotname, name); - msg.clearall = false; - } - else - msg.clearall = true; + /* + * Check if the slot exists with the given name. It is possible that by + * the time this message is executed the slot is dropped but at least this + * check will ensure that the given name is for a valid slot. + */ + slot = SearchNamedReplicationSlot(name, true); - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETREPLSLOTCOUNTER); + if (!slot) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("replication slot \"%s\" does not exist", + name))); + /* + * Nothing to do for physical slots as we collect stats only for logical + * slots. + */ + if (SlotIsPhysical(slot)) + return; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETREPLSLOTCOUNTER); + namestrcpy(&msg.m_slotname, name); + msg.clearall = false; pgstat_send(&msg, sizeof(msg)); } diff --git a/src/backend/utils/activity/pgstat_slru.c b/src/backend/utils/activity/pgstat_slru.c index 6dae3a5dc6..1f2d2c3bbb 100644 --- a/src/backend/utils/activity/pgstat_slru.c +++ b/src/backend/utils/activity/pgstat_slru.c @@ -33,21 +33,23 @@ static PgStat_MsgSLRU SLRUStats[SLRU_NUM_ELEMENTS]; /* - * Reset counters for a single SLRU, or all SLRUs (when name is null). + * Reset counters for a single SLRU. * * Permission checking for this function is managed through the normal * GRANT system. */ void -pgstat_reset_slru_counter(const char *name) +pgstat_reset_slru(const char *name) { PgStat_MsgResetslrucounter msg; + AssertArg(name != NULL); + if (pgStatSock == PGINVALID_SOCKET) return; pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSLRUCOUNTER); - msg.m_index = (name) ? pgstat_slru_index(name) : -1; + msg.m_index = pgstat_slru_index(name); pgstat_send(&msg, sizeof(msg)); } diff --git a/src/backend/utils/activity/pgstat_subscription.c b/src/backend/utils/activity/pgstat_subscription.c index 2ee23d5ae2..503dcabd20 100644 --- a/src/backend/utils/activity/pgstat_subscription.c +++ b/src/backend/utils/activity/pgstat_subscription.c @@ -20,27 +20,6 @@ #include "utils/pgstat_internal.h" -/* - * Reset counters for a single subscription, or all subscriptions (when subid - * is InvalidOid). - * - * Permission checking for this function is managed through the normal - * GRANT system. - */ -void -pgstat_reset_subscription_counter(Oid subid) -{ - PgStat_MsgResetsubcounter msg; - - if (pgStatSock == PGINVALID_SOCKET) - return; - - msg.m_subid = subid; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSUBCOUNTER); - - pgstat_send(&msg, sizeof(msg)); -} - /* * Report a subscription error. */ diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index fd4276fbc6..709dd5548a 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -24,7 +24,6 @@ #include "pgstat.h" #include "postmaster/bgworker_internals.h" #include "postmaster/postmaster.h" -#include "replication/slot.h" #include "storage/proc.h" #include "storage/procarray.h" #include "utils/acl.h" @@ -2075,7 +2074,24 @@ pg_stat_reset_shared(PG_FUNCTION_ARGS) { char *target = text_to_cstring(PG_GETARG_TEXT_PP(0)); - pgstat_reset_shared_counters(target); + if (strcmp(target, "archiver") == 0) + pgstat_reset_of_kind(PGSTAT_KIND_ARCHIVER); + else if (strcmp(target, "bgwriter") == 0) + { + /* + * Historically checkpointer was part of bgwriter, continue to reset + * both for now. + */ + pgstat_reset_of_kind(PGSTAT_KIND_BGWRITER); + pgstat_reset_of_kind(PGSTAT_KIND_CHECKPOINTER); + } + else if (strcmp(target, "wal") == 0) + pgstat_reset_of_kind(PGSTAT_KIND_WAL); + else + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized reset target: \"%s\"", target), + errhint("Target must be \"archiver\", \"bgwriter\", or \"wal\"."))); PG_RETURN_VOID(); } @@ -2086,7 +2102,7 @@ pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS) { Oid taboid = PG_GETARG_OID(0); - pgstat_reset_single_counter(taboid, RESET_TABLE); + pgstat_reset(PGSTAT_KIND_RELATION, MyDatabaseId, taboid); PG_RETURN_VOID(); } @@ -2096,7 +2112,7 @@ pg_stat_reset_single_function_counters(PG_FUNCTION_ARGS) { Oid funcoid = PG_GETARG_OID(0); - pgstat_reset_single_counter(funcoid, RESET_FUNCTION); + pgstat_reset(PGSTAT_KIND_FUNCTION, MyDatabaseId, funcoid); PG_RETURN_VOID(); } @@ -2107,10 +2123,13 @@ pg_stat_reset_slru(PG_FUNCTION_ARGS) { char *target = NULL; - if (!PG_ARGISNULL(0)) + if (PG_ARGISNULL(0)) + pgstat_reset_of_kind(PGSTAT_KIND_SLRU); + else + { target = text_to_cstring(PG_GETARG_TEXT_PP(0)); - - pgstat_reset_slru_counter(target); + pgstat_reset_slru(target); + } PG_RETURN_VOID(); } @@ -2121,36 +2140,14 @@ pg_stat_reset_replication_slot(PG_FUNCTION_ARGS) { char *target = NULL; - if (!PG_ARGISNULL(0)) + if (PG_ARGISNULL(0)) + pgstat_reset_of_kind(PGSTAT_KIND_REPLSLOT); + else { - ReplicationSlot *slot; - target = text_to_cstring(PG_GETARG_TEXT_PP(0)); - - /* - * Check if the slot exists with the given name. It is possible that - * by the time this message is executed the slot is dropped but at - * least this check will ensure that the given name is for a valid - * slot. - */ - slot = SearchNamedReplicationSlot(target, true); - - if (!slot) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("replication slot \"%s\" does not exist", - target))); - - /* - * Nothing to do for physical slots as we collect stats only for - * logical slots. - */ - if (SlotIsPhysical(slot)) - PG_RETURN_VOID(); + pgstat_reset_replslot(target); } - pgstat_reset_replslot_counter(target); - PG_RETURN_VOID(); } @@ -2163,7 +2160,7 @@ pg_stat_reset_subscription_stats(PG_FUNCTION_ARGS) if (PG_ARGISNULL(0)) { /* Clear all subscription stats */ - subid = InvalidOid; + pgstat_reset_of_kind(PGSTAT_KIND_SUBSCRIPTION); } else { @@ -2173,10 +2170,9 @@ pg_stat_reset_subscription_stats(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid subscription OID %u", subid))); + pgstat_reset(PGSTAT_KIND_SUBSCRIPTION, InvalidOid, subid); } - pgstat_reset_subscription_counter(subid); - PG_RETURN_VOID(); } diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 1bd1c5cf7b..9235f4dc4c 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -82,21 +82,6 @@ typedef enum SessionEndType */ typedef int64 PgStat_Counter; -/* Possible targets for resetting cluster-wide shared values */ -typedef enum PgStat_Shared_Reset_Target -{ - RESET_ARCHIVER, - RESET_BGWRITER, - RESET_WAL -} PgStat_Shared_Reset_Target; - -/* Possible object types for resetting single counters */ -typedef enum PgStat_Single_Reset_Type -{ - RESET_TABLE, - RESET_FUNCTION -} PgStat_Single_Reset_Type; - /* ------------------------------------------------------------ * Structures kept in backend local memory while accumulating counts @@ -415,7 +400,7 @@ typedef struct PgStat_MsgResetcounter typedef struct PgStat_MsgResetsharedcounter { PgStat_MsgHdr m_hdr; - PgStat_Shared_Reset_Target m_resettarget; + PgStat_Kind m_resettarget; } PgStat_MsgResetsharedcounter; /* ---------- @@ -427,7 +412,7 @@ typedef struct PgStat_MsgResetsinglecounter { PgStat_MsgHdr m_hdr; Oid m_databaseid; - PgStat_Single_Reset_Type m_resettype; + PgStat_Kind m_resettype; Oid m_objectid; } PgStat_MsgResetsinglecounter; @@ -999,8 +984,8 @@ extern void pgstat_vacuum_stat(void); extern void pgstat_ping(void); extern void pgstat_reset_counters(void); -extern void pgstat_reset_single_counter(Oid objectid, PgStat_Single_Reset_Type type); -extern void pgstat_reset_shared_counters(const char *); +extern void pgstat_reset(PgStat_Kind kind, Oid dboid, Oid objectid); +extern void pgstat_reset_of_kind(PgStat_Kind kind); /* stats accessors */ extern void pgstat_clear_snapshot(void); @@ -1146,7 +1131,7 @@ extern PgStat_TableStatus *find_tabstat_entry(Oid rel_id); * Functions in pgstat_replslot.c */ -extern void pgstat_reset_replslot_counter(const char *name); +extern void pgstat_reset_replslot(const char *name); extern void pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat); extern void pgstat_report_replslot_create(const char *slotname); extern void pgstat_report_replslot_drop(const char *slotname); @@ -1156,7 +1141,7 @@ extern void pgstat_report_replslot_drop(const char *slotname); * Functions in pgstat_slru.c */ -extern void pgstat_reset_slru_counter(const char *); +extern void pgstat_reset_slru(const char *); extern void pgstat_count_slru_page_zeroed(int slru_idx); extern void pgstat_count_slru_page_hit(int slru_idx); extern void pgstat_count_slru_page_read(int slru_idx); @@ -1172,7 +1157,6 @@ extern int pgstat_slru_index(const char *name); * Functions in pgstat_subscription.c */ -extern void pgstat_reset_subscription_counter(Oid subid); extern void pgstat_report_subscription_error(Oid subid, bool is_apply_error); extern void pgstat_report_subscription_drop(Oid subid); diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index e1684d4cae..6398808950 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1977,8 +1977,6 @@ PgStat_MsgTempFile PgStat_MsgVacuum PgStat_MsgWal PgStat_SLRUStats -PgStat_Shared_Reset_Target -PgStat_Single_Reset_Type PgStat_StatDBEntry PgStat_StatFuncEntry PgStat_StatReplSlotEntry From 8b1dccd37c71ed2ff016294d8f9053a32b02b19e Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 18:22:22 -0700 Subject: [PATCH 406/772] pgstat: scaffolding for transactional stats creation / drop. One problematic part of the current statistics collector design is that there is no reliable way of getting rid of statistics entries. Because of that pgstat_vacuum_stat() (called by [auto-]vacuum) matches all stats for the current database with the catalog contents and tries to drop now-superfluous entries. That's quite expensive. What's worse, it doesn't work on physical replicas, despite physical replicas collection statistics entries. This commit introduces infrastructure to create / drop statistics entries transactionally, together with the underlying catalog objects (functions, relations, subscriptions). pgstat_xact.c maintains a list of stats entries created / dropped transactionally in the current transaction. To ensure the removal of statistics entries is durable dropped statistics entries are included in commit / abort (and prepare) records, which also ensures that stats entries are dropped on standbys. Statistics entries created separately from creating the underlying catalog object (e.g. when stats were previously lost due to an immediate restart) are *not* WAL logged. However that can only happen outside of the transaction creating the catalog object, so it does not lead to "leaked" statistics entries. For this to work, functions creating / dropping functions / relations / subscriptions need to call into pgstat. For subscriptions this was already done when dropping subscriptions, via pgstat_report_subscription_drop() (now renamed to pgstat_drop_subscription()). This commit does not actually drop stats yet, it just provides the infrastructure. It is however a largely independent piece of infrastructure, so committing it separately makes sense. Bumps XLOG_PAGE_MAGIC. Author: Andres Freund Reviewed-By: Thomas Munro Reviewed-By: Kyotaro Horiguchi Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/backend/access/rmgrdesc/xactdesc.c | 52 ++++ src/backend/access/transam/twophase.c | 45 ++++ src/backend/access/transam/xact.c | 68 +++++- src/backend/catalog/heap.c | 7 + src/backend/catalog/pg_proc.c | 5 + src/backend/commands/functioncmds.c | 2 + src/backend/commands/subscriptioncmds.c | 4 +- src/backend/postmaster/pgstat.c | 2 +- src/backend/storage/smgr/smgr.c | 5 - src/backend/utils/activity/pgstat_function.c | 22 ++ src/backend/utils/activity/pgstat_relation.c | 37 ++- .../utils/activity/pgstat_subscription.c | 19 +- src/backend/utils/activity/pgstat_xact.c | 223 ++++++++++++++++++ src/include/access/xact.h | 40 +++- src/include/access/xlog_internal.h | 2 +- src/include/pgstat.h | 11 +- src/include/utils/pgstat_internal.h | 13 + src/tools/pgindent/typedefs.list | 3 + 18 files changed, 524 insertions(+), 36 deletions(-) diff --git a/src/backend/access/rmgrdesc/xactdesc.c b/src/backend/access/rmgrdesc/xactdesc.c index 025d556f6c..d3f625d072 100644 --- a/src/backend/access/rmgrdesc/xactdesc.c +++ b/src/backend/access/rmgrdesc/xactdesc.c @@ -84,6 +84,17 @@ ParseCommitRecord(uint8 info, xl_xact_commit *xlrec, xl_xact_parsed_commit *pars data += xl_relfilenodes->nrels * sizeof(RelFileNode); } + if (parsed->xinfo & XACT_XINFO_HAS_DROPPED_STATS) + { + xl_xact_stats_items *xl_drops = (xl_xact_stats_items *) data; + + parsed->nstats = xl_drops->nitems; + parsed->stats = xl_drops->items; + + data += MinSizeOfXactStatsItems; + data += xl_drops->nitems * sizeof(xl_xact_stats_item); + } + if (parsed->xinfo & XACT_XINFO_HAS_INVALS) { xl_xact_invals *xl_invals = (xl_xact_invals *) data; @@ -179,6 +190,17 @@ ParseAbortRecord(uint8 info, xl_xact_abort *xlrec, xl_xact_parsed_abort *parsed) data += xl_relfilenodes->nrels * sizeof(RelFileNode); } + if (parsed->xinfo & XACT_XINFO_HAS_DROPPED_STATS) + { + xl_xact_stats_items *xl_drops = (xl_xact_stats_items *) data; + + parsed->nstats = xl_drops->nitems; + parsed->stats = xl_drops->items; + + data += MinSizeOfXactStatsItems; + data += xl_drops->nitems * sizeof(xl_xact_stats_item); + } + if (parsed->xinfo & XACT_XINFO_HAS_TWOPHASE) { xl_xact_twophase *xl_twophase = (xl_xact_twophase *) data; @@ -244,6 +266,12 @@ ParsePrepareRecord(uint8 info, xl_xact_prepare *xlrec, xl_xact_parsed_prepare *p parsed->abortnodes = (RelFileNode *) bufptr; bufptr += MAXALIGN(xlrec->nabortrels * sizeof(RelFileNode)); + parsed->stats = (xl_xact_stats_item *) bufptr; + bufptr += MAXALIGN(xlrec->ncommitstats * sizeof(xl_xact_stats_item)); + + parsed->abortstats = (xl_xact_stats_item *) bufptr; + bufptr += MAXALIGN(xlrec->nabortstats * sizeof(xl_xact_stats_item)); + parsed->msgs = (SharedInvalidationMessage *) bufptr; bufptr += MAXALIGN(xlrec->ninvalmsgs * sizeof(SharedInvalidationMessage)); } @@ -280,6 +308,25 @@ xact_desc_subxacts(StringInfo buf, int nsubxacts, TransactionId *subxacts) } } +static void +xact_desc_stats(StringInfo buf, const char *label, + int ndropped, xl_xact_stats_item *dropped_stats) +{ + int i; + + if (ndropped > 0) + { + appendStringInfo(buf, "; %sdropped stats:", label); + for (i = 0; i < ndropped; i++) + { + appendStringInfo(buf, " %u/%u/%u", + dropped_stats[i].kind, + dropped_stats[i].dboid, + dropped_stats[i].objoid); + } + } +} + static void xact_desc_commit(StringInfo buf, uint8 info, xl_xact_commit *xlrec, RepOriginId origin_id) { @@ -295,6 +342,7 @@ xact_desc_commit(StringInfo buf, uint8 info, xl_xact_commit *xlrec, RepOriginId xact_desc_relations(buf, "rels", parsed.nrels, parsed.xnodes); xact_desc_subxacts(buf, parsed.nsubxacts, parsed.subxacts); + xact_desc_stats(buf, "", parsed.nstats, parsed.stats); standby_desc_invalidations(buf, parsed.nmsgs, parsed.msgs, parsed.dbId, parsed.tsId, @@ -338,6 +386,8 @@ xact_desc_abort(StringInfo buf, uint8 info, xl_xact_abort *xlrec, RepOriginId or LSN_FORMAT_ARGS(parsed.origin_lsn), timestamptz_to_str(parsed.origin_timestamp)); } + + xact_desc_stats(buf, "", parsed.nstats, parsed.stats); } static void @@ -353,6 +403,8 @@ xact_desc_prepare(StringInfo buf, uint8 info, xl_xact_prepare *xlrec, RepOriginI xact_desc_relations(buf, "rels(commit)", parsed.nrels, parsed.xnodes); xact_desc_relations(buf, "rels(abort)", parsed.nabortrels, parsed.abortnodes); + xact_desc_stats(buf, "commit ", parsed.nstats, parsed.stats); + xact_desc_stats(buf, "abort ", parsed.nabortstats, parsed.abortstats); xact_desc_subxacts(buf, parsed.nsubxacts, parsed.subxacts); standby_desc_invalidations(buf, parsed.nmsgs, parsed.msgs, parsed.dbId, diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 4dc8ccc12b..b35da6f1aa 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -205,6 +205,8 @@ static void RecordTransactionCommitPrepared(TransactionId xid, TransactionId *children, int nrels, RelFileNode *rels, + int nstats, + xl_xact_stats_item *stats, int ninvalmsgs, SharedInvalidationMessage *invalmsgs, bool initfileinval, @@ -214,6 +216,8 @@ static void RecordTransactionAbortPrepared(TransactionId xid, TransactionId *children, int nrels, RelFileNode *rels, + int nstats, + xl_xact_stats_item *stats, const char *gid); static void ProcessRecords(char *bufptr, TransactionId xid, const TwoPhaseCallback callbacks[]); @@ -1046,6 +1050,8 @@ StartPrepare(GlobalTransaction gxact) TransactionId *children; RelFileNode *commitrels; RelFileNode *abortrels; + xl_xact_stats_item *abortstats = NULL; + xl_xact_stats_item *commitstats = NULL; SharedInvalidationMessage *invalmsgs; /* Initialize linked list */ @@ -1071,6 +1077,10 @@ StartPrepare(GlobalTransaction gxact) hdr.nsubxacts = xactGetCommittedChildren(&children); hdr.ncommitrels = smgrGetPendingDeletes(true, &commitrels); hdr.nabortrels = smgrGetPendingDeletes(false, &abortrels); + hdr.ncommitstats = + pgstat_get_transactional_drops(true, &commitstats); + hdr.nabortstats = + pgstat_get_transactional_drops(false, &abortstats); hdr.ninvalmsgs = xactGetCommittedInvalidationMessages(&invalmsgs, &hdr.initfileinval); hdr.gidlen = strlen(gxact->gid) + 1; /* Include '\0' */ @@ -1101,6 +1111,18 @@ StartPrepare(GlobalTransaction gxact) save_state_data(abortrels, hdr.nabortrels * sizeof(RelFileNode)); pfree(abortrels); } + if (hdr.ncommitstats > 0) + { + save_state_data(commitstats, + hdr.ncommitstats * sizeof(xl_xact_stats_item)); + pfree(commitstats); + } + if (hdr.nabortstats > 0) + { + save_state_data(abortstats, + hdr.nabortstats * sizeof(xl_xact_stats_item)); + pfree(abortstats); + } if (hdr.ninvalmsgs > 0) { save_state_data(invalmsgs, @@ -1472,6 +1494,8 @@ FinishPreparedTransaction(const char *gid, bool isCommit) RelFileNode *abortrels; RelFileNode *delrels; int ndelrels; + xl_xact_stats_item *commitstats; + xl_xact_stats_item *abortstats; SharedInvalidationMessage *invalmsgs; /* @@ -1506,6 +1530,10 @@ FinishPreparedTransaction(const char *gid, bool isCommit) bufptr += MAXALIGN(hdr->ncommitrels * sizeof(RelFileNode)); abortrels = (RelFileNode *) bufptr; bufptr += MAXALIGN(hdr->nabortrels * sizeof(RelFileNode)); + commitstats = (xl_xact_stats_item*) bufptr; + bufptr += MAXALIGN(hdr->ncommitstats * sizeof(xl_xact_stats_item)); + abortstats = (xl_xact_stats_item*) bufptr; + bufptr += MAXALIGN(hdr->nabortstats * sizeof(xl_xact_stats_item)); invalmsgs = (SharedInvalidationMessage *) bufptr; bufptr += MAXALIGN(hdr->ninvalmsgs * sizeof(SharedInvalidationMessage)); @@ -1527,12 +1555,16 @@ FinishPreparedTransaction(const char *gid, bool isCommit) RecordTransactionCommitPrepared(xid, hdr->nsubxacts, children, hdr->ncommitrels, commitrels, + hdr->ncommitstats, + commitstats, hdr->ninvalmsgs, invalmsgs, hdr->initfileinval, gid); else RecordTransactionAbortPrepared(xid, hdr->nsubxacts, children, hdr->nabortrels, abortrels, + hdr->nabortstats, + abortstats, gid); ProcArrayRemove(proc, latestXid); @@ -1568,6 +1600,11 @@ FinishPreparedTransaction(const char *gid, bool isCommit) /* Make sure files supposed to be dropped are dropped */ DropRelationFiles(delrels, ndelrels, false); + if (isCommit) + pgstat_execute_transactional_drops(hdr->ncommitstats, commitstats, false); + else + pgstat_execute_transactional_drops(hdr->nabortstats, abortstats, false); + /* * Handle cache invalidation messages. * @@ -2066,6 +2103,8 @@ RecoverPreparedTransactions(void) bufptr += MAXALIGN(hdr->nsubxacts * sizeof(TransactionId)); bufptr += MAXALIGN(hdr->ncommitrels * sizeof(RelFileNode)); bufptr += MAXALIGN(hdr->nabortrels * sizeof(RelFileNode)); + bufptr += MAXALIGN(hdr->ncommitstats * sizeof(xl_xact_stats_item)); + bufptr += MAXALIGN(hdr->nabortstats * sizeof(xl_xact_stats_item)); bufptr += MAXALIGN(hdr->ninvalmsgs * sizeof(SharedInvalidationMessage)); /* @@ -2248,6 +2287,8 @@ RecordTransactionCommitPrepared(TransactionId xid, TransactionId *children, int nrels, RelFileNode *rels, + int nstats, + xl_xact_stats_item *stats, int ninvalmsgs, SharedInvalidationMessage *invalmsgs, bool initfileinval, @@ -2277,6 +2318,7 @@ RecordTransactionCommitPrepared(TransactionId xid, */ recptr = XactLogCommitRecord(committs, nchildren, children, nrels, rels, + nstats, stats, ninvalmsgs, invalmsgs, initfileinval, MyXactFlags | XACT_FLAGS_ACQUIREDACCESSEXCLUSIVELOCK, @@ -2343,6 +2385,8 @@ RecordTransactionAbortPrepared(TransactionId xid, TransactionId *children, int nrels, RelFileNode *rels, + int nstats, + xl_xact_stats_item *stats, const char *gid) { XLogRecPtr recptr; @@ -2373,6 +2417,7 @@ RecordTransactionAbortPrepared(TransactionId xid, recptr = XactLogAbortRecord(GetCurrentTimestamp(), nchildren, children, nrels, rels, + nstats, stats, MyXactFlags | XACT_FLAGS_ACQUIREDACCESSEXCLUSIVELOCK, xid, gid); diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 3596a7d734..bf2fc08d94 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -1285,6 +1285,8 @@ RecordTransactionCommit(void) RelFileNode *rels; int nchildren; TransactionId *children; + int ndroppedstats = 0; + xl_xact_stats_item *droppedstats = NULL; int nmsgs = 0; SharedInvalidationMessage *invalMessages = NULL; bool RelcacheInitFileInval = false; @@ -1303,6 +1305,7 @@ RecordTransactionCommit(void) /* Get data needed for commit record */ nrels = smgrGetPendingDeletes(true, &rels); nchildren = xactGetCommittedChildren(&children); + ndroppedstats = pgstat_get_transactional_drops(true, &droppedstats); if (XLogStandbyInfoActive()) nmsgs = xactGetCommittedInvalidationMessages(&invalMessages, &RelcacheInitFileInval); @@ -1317,10 +1320,12 @@ RecordTransactionCommit(void) /* * We expect that every RelationDropStorage is followed by a catalog * update, and hence XID assignment, so we shouldn't get here with any - * pending deletes. Use a real test not just an Assert to check this, - * since it's a bit fragile. + * pending deletes. Same is true for dropping stats. + * + * Use a real test not just an Assert to check this, since it's a bit + * fragile. */ - if (nrels != 0) + if (nrels != 0 || ndroppedstats != 0) elog(ERROR, "cannot commit a transaction that deleted files but has no xid"); /* Can't have child XIDs either; AssignTransactionId enforces this */ @@ -1395,6 +1400,7 @@ RecordTransactionCommit(void) XactLogCommitRecord(xactStopTimestamp, nchildren, children, nrels, rels, + ndroppedstats, droppedstats, nmsgs, invalMessages, RelcacheInitFileInval, MyXactFlags, @@ -1518,6 +1524,8 @@ RecordTransactionCommit(void) /* Clean up local data */ if (rels) pfree(rels); + if (ndroppedstats) + pfree(droppedstats); return latestXid; } @@ -1698,6 +1706,8 @@ RecordTransactionAbort(bool isSubXact) TransactionId latestXid; int nrels; RelFileNode *rels; + int ndroppedstats = 0; + xl_xact_stats_item *droppedstats = NULL; int nchildren; TransactionId *children; TimestampTz xact_time; @@ -1734,6 +1744,7 @@ RecordTransactionAbort(bool isSubXact) /* Fetch the data we need for the abort record */ nrels = smgrGetPendingDeletes(false, &rels); nchildren = xactGetCommittedChildren(&children); + ndroppedstats = pgstat_get_transactional_drops(false, &droppedstats); /* XXX do we really need a critical section here? */ START_CRIT_SECTION(); @@ -1750,6 +1761,7 @@ RecordTransactionAbort(bool isSubXact) XactLogAbortRecord(xact_time, nchildren, children, nrels, rels, + ndroppedstats, droppedstats, MyXactFlags, InvalidTransactionId, NULL); @@ -1796,6 +1808,8 @@ RecordTransactionAbort(bool isSubXact) /* And clean up local data */ if (rels) pfree(rels); + if (ndroppedstats) + pfree(droppedstats); return latestXid; } @@ -5573,6 +5587,7 @@ XLogRecPtr XactLogCommitRecord(TimestampTz commit_time, int nsubxacts, TransactionId *subxacts, int nrels, RelFileNode *rels, + int ndroppedstats, xl_xact_stats_item *droppedstats, int nmsgs, SharedInvalidationMessage *msgs, bool relcacheInval, int xactflags, TransactionId twophase_xid, @@ -5583,6 +5598,7 @@ XactLogCommitRecord(TimestampTz commit_time, xl_xact_dbinfo xl_dbinfo; xl_xact_subxacts xl_subxacts; xl_xact_relfilenodes xl_relfilenodes; + xl_xact_stats_items xl_dropped_stats; xl_xact_invals xl_invals; xl_xact_twophase xl_twophase; xl_xact_origin xl_origin; @@ -5640,6 +5656,12 @@ XactLogCommitRecord(TimestampTz commit_time, info |= XLR_SPECIAL_REL_UPDATE; } + if (ndroppedstats > 0) + { + xl_xinfo.xinfo |= XACT_XINFO_HAS_DROPPED_STATS; + xl_dropped_stats.nitems = ndroppedstats; + } + if (nmsgs > 0) { xl_xinfo.xinfo |= XACT_XINFO_HAS_INVALS; @@ -5696,6 +5718,14 @@ XactLogCommitRecord(TimestampTz commit_time, nrels * sizeof(RelFileNode)); } + if (xl_xinfo.xinfo & XACT_XINFO_HAS_DROPPED_STATS) + { + XLogRegisterData((char *) (&xl_dropped_stats), + MinSizeOfXactStatsItems); + XLogRegisterData((char *) droppedstats, + ndroppedstats * sizeof(xl_xact_stats_item)); + } + if (xl_xinfo.xinfo & XACT_XINFO_HAS_INVALS) { XLogRegisterData((char *) (&xl_invals), MinSizeOfXactInvals); @@ -5729,6 +5759,7 @@ XLogRecPtr XactLogAbortRecord(TimestampTz abort_time, int nsubxacts, TransactionId *subxacts, int nrels, RelFileNode *rels, + int ndroppedstats, xl_xact_stats_item *droppedstats, int xactflags, TransactionId twophase_xid, const char *twophase_gid) { @@ -5736,6 +5767,7 @@ XactLogAbortRecord(TimestampTz abort_time, xl_xact_xinfo xl_xinfo; xl_xact_subxacts xl_subxacts; xl_xact_relfilenodes xl_relfilenodes; + xl_xact_stats_items xl_dropped_stats; xl_xact_twophase xl_twophase; xl_xact_dbinfo xl_dbinfo; xl_xact_origin xl_origin; @@ -5773,6 +5805,12 @@ XactLogAbortRecord(TimestampTz abort_time, info |= XLR_SPECIAL_REL_UPDATE; } + if (ndroppedstats > 0) + { + xl_xinfo.xinfo |= XACT_XINFO_HAS_DROPPED_STATS; + xl_dropped_stats.nitems = ndroppedstats; + } + if (TransactionIdIsValid(twophase_xid)) { xl_xinfo.xinfo |= XACT_XINFO_HAS_TWOPHASE; @@ -5834,6 +5872,14 @@ XactLogAbortRecord(TimestampTz abort_time, nrels * sizeof(RelFileNode)); } + if (xl_xinfo.xinfo & XACT_XINFO_HAS_DROPPED_STATS) + { + XLogRegisterData((char *) (&xl_dropped_stats), + MinSizeOfXactStatsItems); + XLogRegisterData((char *) droppedstats, + ndroppedstats * sizeof(xl_xact_stats_item)); + } + if (xl_xinfo.xinfo & XACT_XINFO_HAS_TWOPHASE) { XLogRegisterData((char *) (&xl_twophase), sizeof(xl_xact_twophase)); @@ -5967,6 +6013,14 @@ xact_redo_commit(xl_xact_parsed_commit *parsed, DropRelationFiles(parsed->xnodes, parsed->nrels, true); } + if (parsed->nstats > 0) + { + /* see equivalent call for relations above */ + XLogFlush(lsn); + + pgstat_execute_transactional_drops(parsed->nstats, parsed->stats, true); + } + /* * We issue an XLogFlush() for the same reason we emit ForceSyncCommit() * in normal operation. For example, in CREATE DATABASE, we copy all files @@ -6069,6 +6123,14 @@ xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid, DropRelationFiles(parsed->xnodes, parsed->nrels, true); } + + if (parsed->nstats > 0) + { + /* see equivalent call for relations above */ + XLogFlush(lsn); + + pgstat_execute_transactional_drops(parsed->nstats, parsed->stats, true); + } } void diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 6eb78a9c0f..9b512ccd3c 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -64,6 +64,7 @@ #include "parser/parse_relation.h" #include "parser/parsetree.h" #include "partitioning/partdesc.h" +#include "pgstat.h" #include "storage/lmgr.h" #include "storage/predicate.h" #include "utils/builtins.h" @@ -1475,6 +1476,9 @@ heap_create_with_catalog(const char *relname, if (oncommit != ONCOMMIT_NOOP) register_on_commit_action(relid, oncommit); + /* ensure that stats are dropped if transaction aborts */ + pgstat_create_relation(new_rel_desc); + /* * ok, the relation has been cataloged, so close our relations and return * the OID of the newly created relation. @@ -1851,6 +1855,9 @@ heap_drop_with_catalog(Oid relid) if (RELKIND_HAS_STORAGE(rel->rd_rel->relkind)) RelationDropStorage(rel); + /* ensure that stats are dropped if transaction commits */ + pgstat_drop_relation(rel); + /* * Close relcache entry, but *keep* AccessExclusiveLock on the relation * until transaction commit. This ensures no one else will try to do diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c index ac8aacbd59..d82221fdb8 100644 --- a/src/backend/catalog/pg_proc.c +++ b/src/backend/catalog/pg_proc.c @@ -35,6 +35,7 @@ #include "parser/analyze.h" #include "parser/parse_coerce.h" #include "parser/parse_type.h" +#include "pgstat.h" #include "rewrite/rewriteHandler.h" #include "tcop/pquery.h" #include "tcop/tcopprot.h" @@ -709,6 +710,10 @@ ProcedureCreate(const char *procedureName, AtEOXact_GUC(true, save_nestlevel); } + /* ensure that stats are dropped if transaction commits */ + if (!is_update) + pgstat_create_function(retval); + return myself; } diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index 25b75375a8..91f02a7eb2 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -1325,6 +1325,8 @@ RemoveFunctionById(Oid funcOid) table_close(relation, RowExclusiveLock); + pgstat_drop_function(funcOid); + /* * If there's a pg_aggregate tuple, delete that too. */ diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 51505373ea..83192dbd51 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -738,6 +738,8 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, table_close(rel, RowExclusiveLock); + pgstat_create_subscription(subid); + if (opts.enabled) ApplyLauncherWakeupAtCommit(); @@ -1592,7 +1594,7 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) * gets lost. */ if (slotname) - pgstat_report_subscription_drop(subid); + pgstat_drop_subscription(subid); table_close(rel, NoLock); } diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 6a98e6ddd7..13dee84059 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -886,7 +886,7 @@ pgstat_vacuum_stat(void) CHECK_FOR_INTERRUPTS(); if (hash_search(htab, (void *) &(subentry->subid), HASH_FIND, NULL) == NULL) - pgstat_report_subscription_drop(subentry->subid); + pgstat_drop_subscription(subentry->subid); } hash_destroy(htab); diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c index d71a557a35..2c7a2b2857 100644 --- a/src/backend/storage/smgr/smgr.c +++ b/src/backend/storage/smgr/smgr.c @@ -415,11 +415,6 @@ smgrdounlinkall(SMgrRelation *rels, int nrels, bool isRedo) smgrsw[which].smgr_close(rels[i], forknum); } - /* - * It'd be nice to tell the stats collector to forget them immediately, - * too. But we can't because we don't know the OIDs. - */ - /* * Send a shared-inval message to force other backends to close any * dangling smgr references they may have for these rels. We should do diff --git a/src/backend/utils/activity/pgstat_function.c b/src/backend/utils/activity/pgstat_function.c index 93ec29757a..ad9879afb2 100644 --- a/src/backend/utils/activity/pgstat_function.c +++ b/src/backend/utils/activity/pgstat_function.c @@ -48,6 +48,28 @@ static HTAB *pgStatFunctions = NULL; static instr_time total_func_time; +/* + * Ensure that stats are dropped if transaction aborts. + */ +void +pgstat_create_function(Oid proid) +{ + pgstat_create_transactional(PGSTAT_KIND_FUNCTION, + MyDatabaseId, + proid); +} + +/* + * Ensure that stats are dropped if transaction commits. + */ +void +pgstat_drop_function(Oid proid) +{ + pgstat_drop_transactional(PGSTAT_KIND_FUNCTION, + MyDatabaseId, + proid); +} + /* * Initialize function call usage data. * Called by the executor before invoking a function. diff --git a/src/backend/utils/activity/pgstat_relation.c b/src/backend/utils/activity/pgstat_relation.c index 4f97d2f1d9..5b9b6dd7c6 100644 --- a/src/backend/utils/activity/pgstat_relation.c +++ b/src/backend/utils/activity/pgstat_relation.c @@ -171,33 +171,26 @@ pgstat_relation_init(Relation rel) } /* - * Tell the collector that we just dropped a relation. - * (If the message gets lost, we will still clean the dead entry eventually - * via future invocations of pgstat_vacuum_stat().) - * - * Currently not used for lack of any good place to call it; we rely - * entirely on pgstat_vacuum_stat() to clean out stats for dead rels. + * Ensure that stats are dropped if transaction aborts. */ -#ifdef NOT_USED void -pgstat_drop_relation(Oid relid) +pgstat_create_relation(Relation rel) { - PgStat_MsgTabpurge msg; - int len; - - if (pgStatSock == PGINVALID_SOCKET) - return; - - msg.m_tableid[0] = relid; - msg.m_nentries = 1; - - len = offsetof(PgStat_MsgTabpurge, m_tableid[0]) + sizeof(Oid); + pgstat_create_transactional(PGSTAT_KIND_RELATION, + rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId, + RelationGetRelid(rel)); +} - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_TABPURGE); - msg.m_databaseid = MyDatabaseId; - pgstat_send(&msg, len); +/* + * Ensure that stats are dropped if transaction commits. + */ +void +pgstat_drop_relation(Relation rel) +{ + pgstat_drop_transactional(PGSTAT_KIND_RELATION, + rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId, + RelationGetRelid(rel)); } -#endif /* NOT_USED */ /* * Report that the table was just vacuumed. diff --git a/src/backend/utils/activity/pgstat_subscription.c b/src/backend/utils/activity/pgstat_subscription.c index 503dcabd20..689029b30a 100644 --- a/src/backend/utils/activity/pgstat_subscription.c +++ b/src/backend/utils/activity/pgstat_subscription.c @@ -34,15 +34,32 @@ pgstat_report_subscription_error(Oid subid, bool is_apply_error) pgstat_send(&msg, sizeof(PgStat_MsgSubscriptionError)); } +/* + * Report creating the subscription. + * + * Ensures that stats are dropped if transaction rolls back. + */ +void +pgstat_create_subscription(Oid subid) +{ + pgstat_create_transactional(PGSTAT_KIND_SUBSCRIPTION, + InvalidOid, subid); +} + /* * Report dropping the subscription. + * + * Ensures that stats are dropped if transaction commits. */ void -pgstat_report_subscription_drop(Oid subid) +pgstat_drop_subscription(Oid subid) { PgStat_MsgSubscriptionDrop msg; pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_SUBSCRIPTIONDROP); msg.m_subid = subid; pgstat_send(&msg, sizeof(PgStat_MsgSubscriptionDrop)); + + pgstat_drop_transactional(PGSTAT_KIND_SUBSCRIPTION, + InvalidOid, subid); } diff --git a/src/backend/utils/activity/pgstat_xact.c b/src/backend/utils/activity/pgstat_xact.c index 17907e3278..5c00eab7c7 100644 --- a/src/backend/utils/activity/pgstat_xact.c +++ b/src/backend/utils/activity/pgstat_xact.c @@ -19,6 +19,18 @@ #include "utils/pgstat_internal.h" +typedef struct PgStat_PendingDroppedStatsItem +{ + xl_xact_stats_item item; + bool is_create; + dlist_node node; +} PgStat_PendingDroppedStatsItem; + + +static void AtEOXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, bool isCommit); +static void AtEOSubXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, + bool isCommit, int nestDepth); + static PgStat_SubXactStatus *pgStatXactStack = NULL; @@ -40,6 +52,7 @@ AtEOXact_PgStat(bool isCommit, bool parallel) Assert(xact_state->prev == NULL); AtEOXact_PgStat_Relations(xact_state, isCommit); + AtEOXact_PgStat_DroppedStats(xact_state, isCommit); } pgStatXactStack = NULL; @@ -47,6 +60,49 @@ AtEOXact_PgStat(bool isCommit, bool parallel) pgstat_clear_snapshot(); } +/* + * When committing, drop stats for objects dropped in the transaction. When + * aborting, drop stats for objects created in the transaction. + */ +static void +AtEOXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, bool isCommit) +{ + dlist_mutable_iter iter; + + if (xact_state->pending_drops_count == 0) + { + Assert(dlist_is_empty(&xact_state->pending_drops)); + return; + } + + dlist_foreach_modify(iter, &xact_state->pending_drops) + { + PgStat_PendingDroppedStatsItem *pending = + dlist_container(PgStat_PendingDroppedStatsItem, node, iter.cur); + + if (isCommit && !pending->is_create) + { + /* + * Transaction that dropped an object committed. Drop the stats + * too. + */ + /* will do work in subsequent commit */ + } + else if (!isCommit && pending->is_create) + { + /* + * Transaction that created an object aborted. Drop the stats + * associated with the object. + */ + /* will do work in subsequent commit */ + } + + dlist_delete(&pending->node); + xact_state->pending_drops_count--; + pfree(pending); + } +} + /* * Called from access/transam/xact.c at subtransaction commit/abort. */ @@ -64,11 +120,63 @@ AtEOSubXact_PgStat(bool isCommit, int nestDepth) pgStatXactStack = xact_state->prev; AtEOSubXact_PgStat_Relations(xact_state, isCommit, nestDepth); + AtEOSubXact_PgStat_DroppedStats(xact_state, isCommit, nestDepth); pfree(xact_state); } } +/* + * Like AtEOXact_PgStat_DroppedStats(), but for subtransactions. + */ +static void +AtEOSubXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, + bool isCommit, int nestDepth) +{ + PgStat_SubXactStatus *parent_xact_state; + dlist_mutable_iter iter; + + if (xact_state->pending_drops_count == 0) + return; + + parent_xact_state = pgstat_xact_stack_level_get(nestDepth - 1); + + dlist_foreach_modify(iter, &xact_state->pending_drops) + { + PgStat_PendingDroppedStatsItem *pending = + dlist_container(PgStat_PendingDroppedStatsItem, node, iter.cur); + + dlist_delete(&pending->node); + xact_state->pending_drops_count--; + + if (!isCommit && pending->is_create) + { + /* + * Subtransaction creating a new stats object aborted. Drop the + * stats object. + */ + /* will do work in subsequent commit */ + pfree(pending); + } + else if (isCommit) + { + /* + * Subtransaction dropping a stats object committed. Can't yet + * remove the stats object, the surrounding transaction might + * still abort. Pass it on to the parent. + */ + dlist_push_tail(&parent_xact_state->pending_drops, &pending->node); + parent_xact_state->pending_drops_count++; + } + else + { + pfree(pending); + } + } + + Assert(xact_state->pending_drops_count == 0); +} + /* * Save the transactional stats state at 2PC transaction prepare. */ @@ -130,6 +238,8 @@ pgstat_xact_stack_level_get(int nest_level) xact_state = (PgStat_SubXactStatus *) MemoryContextAlloc(TopTransactionContext, sizeof(PgStat_SubXactStatus)); + dlist_init(&xact_state->pending_drops); + xact_state->pending_drops_count = 0; xact_state->nest_level = nest_level; xact_state->prev = pgStatXactStack; xact_state->first = NULL; @@ -137,3 +247,116 @@ pgstat_xact_stack_level_get(int nest_level) } return xact_state; } + +/* + * Get stat items that need to be dropped at commit / abort. + * + * When committing, stats for objects that have been dropped in the + * transaction are returned. When aborting, stats for newly created objects are + * returned. + * + * Used by COMMIT / ABORT and 2PC PREPARE processing when building their + * respective WAL records, to ensure stats are dropped in case of a crash / on + * standbys. + * + * The list of items is allocated in CurrentMemoryContext and must be freed by + * the caller (directly or via memory context reset). + */ +int +pgstat_get_transactional_drops(bool isCommit, xl_xact_stats_item **items) +{ + PgStat_SubXactStatus *xact_state = pgStatXactStack; + int nitems = 0; + dlist_iter iter; + + if (xact_state == NULL) + return 0; + + /* + * We expect to be called for subtransaction abort (which logs a WAL + * record), but not for subtransaction commit (which doesn't). + */ + Assert(!isCommit || xact_state->nest_level == 1); + Assert(!isCommit || xact_state->prev == NULL); + + *items = palloc(xact_state->pending_drops_count + * sizeof(xl_xact_stats_item)); + + dlist_foreach(iter, &xact_state->pending_drops) + { + PgStat_PendingDroppedStatsItem *pending = + dlist_container(PgStat_PendingDroppedStatsItem, node, iter.cur); + + if (isCommit && pending->is_create) + continue; + if (!isCommit && !pending->is_create) + continue; + + Assert(nitems < xact_state->pending_drops_count); + (*items)[nitems++] = pending->item; + } + + return nitems; +} + +/* + * Execute scheduled drops post-commit. Called from xact_redo_commit() / + * xact_redo_abort() during recovery, and from FinishPreparedTransaction() + * during normal 2PC COMMIT/ABORT PREPARED processing. + */ +void +pgstat_execute_transactional_drops(int ndrops, struct xl_xact_stats_item *items, bool is_redo) +{ + if (ndrops == 0) + return; + + for (int i = 0; i < ndrops; i++) + { + /* will do work in subsequent commit */ + } +} + +static void +create_drop_transactional_internal(PgStat_Kind kind, Oid dboid, Oid objoid, bool is_create) +{ + int nest_level = GetCurrentTransactionNestLevel(); + PgStat_SubXactStatus *xact_state; + PgStat_PendingDroppedStatsItem *drop = (PgStat_PendingDroppedStatsItem *) + MemoryContextAlloc(TopTransactionContext, sizeof(PgStat_PendingDroppedStatsItem)); + + xact_state = pgstat_xact_stack_level_get(nest_level); + + drop->is_create = is_create; + drop->item.kind = kind; + drop->item.dboid = dboid; + drop->item.objoid = objoid; + + dlist_push_tail(&xact_state->pending_drops, &drop->node); + xact_state->pending_drops_count++; +} + +/* + * Create a stats entry for a newly created database object in a transactional + * manner. + * + * I.e. if the current (sub-)transaction aborts, the stats entry will also be + * dropped. + */ +void +pgstat_create_transactional(PgStat_Kind kind, Oid dboid, Oid objoid) +{ + create_drop_transactional_internal(kind, dboid, objoid, /* create */ true); +} + +/* + * Drop a stats entry for a just dropped database object in a transactional + * manner. + * + * I.e. if the current (sub-)transaction aborts, the stats entry will stay + * alive. + */ +void +pgstat_drop_transactional(PgStat_Kind kind, Oid dboid, Oid objoid) +{ + create_drop_transactional_internal(kind, dboid, objoid, /* create */ false); +} diff --git a/src/include/access/xact.h b/src/include/access/xact.h index 062cc7e17d..4e1e873501 100644 --- a/src/include/access/xact.h +++ b/src/include/access/xact.h @@ -180,6 +180,7 @@ typedef struct SavedTransactionCharacteristics #define XACT_XINFO_HAS_ORIGIN (1U << 5) #define XACT_XINFO_HAS_AE_LOCKS (1U << 6) #define XACT_XINFO_HAS_GID (1U << 7) +#define XACT_XINFO_HAS_DROPPED_STATS (1U << 8) /* * Also stored in xinfo, these indicating a variety of additional actions that @@ -230,7 +231,7 @@ typedef struct xl_xact_assignment typedef struct xl_xact_xinfo { /* - * Even though we right now only require 1 byte of space in xinfo we use + * Even though we right now only require two bytes of space in xinfo we use * four so following records don't have to care about alignment. Commit * records can be large, so copying large portions isn't attractive. */ @@ -257,6 +258,27 @@ typedef struct xl_xact_relfilenodes } xl_xact_relfilenodes; #define MinSizeOfXactRelfilenodes offsetof(xl_xact_relfilenodes, xnodes) +/* + * A transactionally dropped statistics entry. + * + * Declared here rather than pgstat.h because pgstat.h can't be included from + * frontend code, but the WAL format needs to be readable by frontend + * programs. + */ +typedef struct xl_xact_stats_item +{ + int kind; + Oid dboid; + Oid objoid; +} xl_xact_stats_item; + +typedef struct xl_xact_stats_items +{ + int nitems; + xl_xact_stats_item items[FLEXIBLE_ARRAY_MEMBER]; +} xl_xact_stats_items; +#define MinSizeOfXactStatsItems offsetof(xl_xact_stats_items, items) + typedef struct xl_xact_invals { int nmsgs; /* number of shared inval msgs */ @@ -283,6 +305,7 @@ typedef struct xl_xact_commit /* xl_xact_dbinfo follows if XINFO_HAS_DBINFO */ /* xl_xact_subxacts follows if XINFO_HAS_SUBXACT */ /* xl_xact_relfilenodes follows if XINFO_HAS_RELFILENODES */ + /* xl_xact_stats_items follows if XINFO_HAS_DROPPED_STATS */ /* xl_xact_invals follows if XINFO_HAS_INVALS */ /* xl_xact_twophase follows if XINFO_HAS_TWOPHASE */ /* twophase_gid follows if XINFO_HAS_GID. As a null-terminated string. */ @@ -298,6 +321,7 @@ typedef struct xl_xact_abort /* xl_xact_dbinfo follows if XINFO_HAS_DBINFO */ /* xl_xact_subxacts follows if XINFO_HAS_SUBXACT */ /* xl_xact_relfilenodes follows if XINFO_HAS_RELFILENODES */ + /* xl_xact_stats_items follows if XINFO_HAS_DROPPED_STATS */ /* No invalidation messages needed. */ /* xl_xact_twophase follows if XINFO_HAS_TWOPHASE */ /* twophase_gid follows if XINFO_HAS_GID. As a null-terminated string. */ @@ -316,6 +340,8 @@ typedef struct xl_xact_prepare int32 nsubxacts; /* number of following subxact XIDs */ int32 ncommitrels; /* number of delete-on-commit rels */ int32 nabortrels; /* number of delete-on-abort rels */ + int32 ncommitstats; /* number of stats to drop on commit */ + int32 nabortstats; /* number of stats to drop on abort */ int32 ninvalmsgs; /* number of cache invalidation messages */ bool initfileinval; /* does relcache init file need invalidation? */ uint16 gidlen; /* length of the GID - GID follows the header */ @@ -342,6 +368,9 @@ typedef struct xl_xact_parsed_commit int nrels; RelFileNode *xnodes; + int nstats; + xl_xact_stats_item *stats; + int nmsgs; SharedInvalidationMessage *msgs; @@ -349,6 +378,8 @@ typedef struct xl_xact_parsed_commit char twophase_gid[GIDSIZE]; /* only for 2PC */ int nabortrels; /* only for 2PC */ RelFileNode *abortnodes; /* only for 2PC */ + int nabortstats; /* only for 2PC */ + xl_xact_stats_item *abortstats; /* only for 2PC */ XLogRecPtr origin_lsn; TimestampTz origin_timestamp; @@ -370,6 +401,9 @@ typedef struct xl_xact_parsed_abort int nrels; RelFileNode *xnodes; + int nstats; + xl_xact_stats_item *stats; + TransactionId twophase_xid; /* only for 2PC */ char twophase_gid[GIDSIZE]; /* only for 2PC */ @@ -449,6 +483,8 @@ extern int xactGetCommittedChildren(TransactionId **ptr); extern XLogRecPtr XactLogCommitRecord(TimestampTz commit_time, int nsubxacts, TransactionId *subxacts, int nrels, RelFileNode *rels, + int nstats, + xl_xact_stats_item *stats, int nmsgs, SharedInvalidationMessage *msgs, bool relcacheInval, int xactflags, @@ -458,6 +494,8 @@ extern XLogRecPtr XactLogCommitRecord(TimestampTz commit_time, extern XLogRecPtr XactLogAbortRecord(TimestampTz abort_time, int nsubxacts, TransactionId *subxacts, int nrels, RelFileNode *rels, + int nstats, + xl_xact_stats_item *stats, int xactflags, TransactionId twophase_xid, const char *twophase_gid); extern void xact_redo(XLogReaderState *record); diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h index 0e94833129..b7c375fed1 100644 --- a/src/include/access/xlog_internal.h +++ b/src/include/access/xlog_internal.h @@ -31,7 +31,7 @@ /* * Each page of XLOG file has a header like this: */ -#define XLOG_PAGE_MAGIC 0xD10F /* can be used as WAL version indicator */ +#define XLOG_PAGE_MAGIC 0xD110 /* can be used as WAL version indicator */ typedef struct XLogPageHeaderData { diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 9235f4dc4c..7981a81656 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -1049,6 +1049,9 @@ extern void pgstat_report_connect(Oid dboid); * Functions in pgstat_function.c */ +extern void pgstat_create_function(Oid proid); +extern void pgstat_drop_function(Oid proid); + struct FunctionCallInfoBaseData; extern void pgstat_init_function_usage(struct FunctionCallInfoBaseData *fcinfo, PgStat_FunctionCallUsage *fcu); @@ -1062,6 +1065,8 @@ extern PgStat_BackendFunctionEntry *find_funcstat_entry(Oid func_id); * Functions in pgstat_relation.c */ +extern void pgstat_create_relation(Relation rel); +extern void pgstat_drop_relation(Relation rel); extern void pgstat_copy_relation_stats(Relation dstrel, Relation srcrel); extern void pgstat_relation_init(Relation rel); @@ -1158,7 +1163,8 @@ extern int pgstat_slru_index(const char *name); */ extern void pgstat_report_subscription_error(Oid subid, bool is_apply_error); -extern void pgstat_report_subscription_drop(Oid subid); +extern void pgstat_create_subscription(Oid subid); +extern void pgstat_drop_subscription(Oid subid); /* @@ -1169,6 +1175,9 @@ extern void AtEOXact_PgStat(bool isCommit, bool parallel); extern void AtEOSubXact_PgStat(bool isCommit, int nestDepth); extern void AtPrepare_PgStat(void); extern void PostPrepare_PgStat(void); +struct xl_xact_stats_item; +extern int pgstat_get_transactional_drops(bool isCommit, struct xl_xact_stats_item **items); +extern void pgstat_execute_transactional_drops(int ndrops, struct xl_xact_stats_item *items, bool is_redo); /* diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index 1923f56a3a..da66e924dc 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -42,6 +42,16 @@ typedef struct PgStat_SubXactStatus struct PgStat_SubXactStatus *prev; /* higher-level subxact if any */ + /* + * Dropping the statistics for objects that dropped transactionally itself + * needs to be transactional. Therefore we collect the stats dropped in + * the current (sub-)transaction and only execute the stats drop when we + * know if the transaction commits/aborts. To handle replicas and crashes, + * stats drops are included in commit records. + */ + dlist_head pending_drops; + int pending_drops_count; + /* * Tuple insertion/deletion counts for an open transaction can't be * propagated into PgStat_TableStatus counters until we know if it is @@ -133,6 +143,9 @@ extern bool pgstat_wal_pending(void); */ extern PgStat_SubXactStatus *pgstat_xact_stack_level_get(int nest_level); +extern void pgstat_drop_transactional(PgStat_Kind kind, Oid dboid, Oid objoid); +extern void pgstat_create_transactional(PgStat_Kind kind, Oid dboid, Oid objoid); + /* diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 6398808950..dc38e16405 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1976,6 +1976,7 @@ PgStat_MsgTabstat PgStat_MsgTempFile PgStat_MsgVacuum PgStat_MsgWal +PgStat_PendingDroppedStatsItem PgStat_SLRUStats PgStat_StatDBEntry PgStat_StatFuncEntry @@ -3783,6 +3784,8 @@ xl_xact_parsed_commit xl_xact_parsed_prepare xl_xact_prepare xl_xact_relfilenodes +xl_xact_stats_item +xl_xact_stats_items xl_xact_subxacts xl_xact_twophase xl_xact_xinfo From e41aed674f35c63380175bb0e2dfa8dccfb2204d Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 18:26:17 -0700 Subject: [PATCH 407/772] pgstat: revise replication slot API in preparation for shared memory stats. Previously the pgstat <-> replication slots API was done with on the basis of names. However, the upcoming move to storing stats in shared memory makes it more convenient to use a integer as key. Change the replication slot functions to take the slot rather than the slot name, and expose ReplicationSlotIndex() to compute the index of an replication slot. Special handling will be required for restarts, as the index is not stable across restarts. For now pgstat internally still uses names. Rename pgstat_report_replslot_{create,drop}() to pgstat_{create,drop}_replslot() to match the functions for other kinds of stats. Reviewed-By: Kyotaro Horiguchi Discussion: https://postgr.es/m/20220404041516.cctrvpadhuriawlq@alap3.anarazel.de --- src/backend/postmaster/pgstat.c | 10 +++++++++- src/backend/replication/logical/logical.c | 2 +- src/backend/replication/slot.c | 20 ++++++++++++++++++-- src/backend/utils/activity/pgstat_replslot.c | 13 ++++++++----- src/include/pgstat.h | 7 ++++--- src/include/replication/slot.h | 1 + 6 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 13dee84059..8655b56c5e 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -862,7 +862,15 @@ pgstat_vacuum_stat(void) CHECK_FOR_INTERRUPTS(); if (SearchNamedReplicationSlot(NameStr(slotentry->slotname), true) == NULL) - pgstat_report_replslot_drop(NameStr(slotentry->slotname)); + { + PgStat_MsgReplSlot msg; + + pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); + namestrcpy(&msg.m_slotname, NameStr(slotentry->slotname)); + msg.m_create = false; + msg.m_drop = true; + pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); + } } } diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index e1f14aeecb..656ec8f555 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -1921,7 +1921,7 @@ UpdateDecodingStats(LogicalDecodingContext *ctx) repSlotStat.total_txns = rb->totalTxns; repSlotStat.total_bytes = rb->totalBytes; - pgstat_report_replslot(&repSlotStat); + pgstat_report_replslot(ctx->slot, &repSlotStat); rb->spillTxns = 0; rb->spillCount = 0; diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index ed4c8b3ad5..2217af70d4 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -356,7 +356,7 @@ ReplicationSlotCreate(const char *name, bool db_specific, * ReplicationSlotAllocationLock. */ if (SlotIsLogical(slot)) - pgstat_report_replslot_create(NameStr(slot->data.name)); + pgstat_create_replslot(slot); /* * Now that the slot has been marked as in_use and active, it's safe to @@ -399,6 +399,22 @@ SearchNamedReplicationSlot(const char *name, bool need_lock) return slot; } +/* + * Return the index of the replication slot in + * ReplicationSlotCtl->replication_slots. + * + * This is mainly useful to have an efficient key for storing replication slot + * stats. + */ +int +ReplicationSlotIndex(ReplicationSlot *slot) +{ + Assert(slot >= ReplicationSlotCtl->replication_slots && + slot < ReplicationSlotCtl->replication_slots + max_replication_slots); + + return slot - ReplicationSlotCtl->replication_slots; +} + /* * Find a previously created slot and mark it as used by this process. * @@ -746,7 +762,7 @@ ReplicationSlotDropPtr(ReplicationSlot *slot) * doesn't seem worth doing as in practice this won't happen frequently. */ if (SlotIsLogical(slot)) - pgstat_report_replslot_drop(NameStr(slot->data.name)); + pgstat_drop_replslot(slot); /* * We release this at the very end, so that nobody starts trying to create diff --git a/src/backend/utils/activity/pgstat_replslot.c b/src/backend/utils/activity/pgstat_replslot.c index cfaf8d546c..ceefc5d59b 100644 --- a/src/backend/utils/activity/pgstat_replslot.c +++ b/src/backend/utils/activity/pgstat_replslot.c @@ -69,7 +69,7 @@ pgstat_reset_replslot(const char *name) * Report replication slot statistics. */ void -pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat) +pgstat_report_replslot(ReplicationSlot *slot, const PgStat_StatReplSlotEntry *repSlotStat) { PgStat_MsgReplSlot msg; @@ -93,14 +93,17 @@ pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat) /* * Report replication slot creation. + * + * NB: This gets called with ReplicationSlotAllocationLock already held, be + * careful about calling back into slot.c. */ void -pgstat_report_replslot_create(const char *slotname) +pgstat_create_replslot(ReplicationSlot *slot) { PgStat_MsgReplSlot msg; pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); - namestrcpy(&msg.m_slotname, slotname); + namestrcpy(&msg.m_slotname, NameStr(slot->data.name)); msg.m_create = true; msg.m_drop = false; pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); @@ -110,12 +113,12 @@ pgstat_report_replslot_create(const char *slotname) * Report replication slot drop. */ void -pgstat_report_replslot_drop(const char *slotname) +pgstat_drop_replslot(ReplicationSlot *slot) { PgStat_MsgReplSlot msg; pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); - namestrcpy(&msg.m_slotname, slotname); + namestrcpy(&msg.m_slotname, NameStr(slot->data.name)); msg.m_create = false; msg.m_drop = true; pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 7981a81656..0c618e7710 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -1137,9 +1137,10 @@ extern PgStat_TableStatus *find_tabstat_entry(Oid rel_id); */ extern void pgstat_reset_replslot(const char *name); -extern void pgstat_report_replslot(const PgStat_StatReplSlotEntry *repSlotStat); -extern void pgstat_report_replslot_create(const char *slotname); -extern void pgstat_report_replslot_drop(const char *slotname); +struct ReplicationSlot; +extern void pgstat_report_replslot(struct ReplicationSlot *slot, const PgStat_StatReplSlotEntry *repSlotStat); +extern void pgstat_create_replslot(struct ReplicationSlot *slot); +extern void pgstat_drop_replslot(struct ReplicationSlot *slot); /* diff --git a/src/include/replication/slot.h b/src/include/replication/slot.h index 24b30210c3..1ee63c4cf4 100644 --- a/src/include/replication/slot.h +++ b/src/include/replication/slot.h @@ -216,6 +216,7 @@ extern bool ReplicationSlotsCountDBSlots(Oid dboid, int *nslots, int *nactive); extern void ReplicationSlotsDropDBSlots(Oid dboid); extern bool InvalidateObsoleteReplicationSlots(XLogSegNo oldestSegno); extern ReplicationSlot *SearchNamedReplicationSlot(const char *name, bool need_lock); +extern int ReplicationSlotIndex(ReplicationSlot *slot); extern void ReplicationSlotNameForTablesync(Oid suboid, Oid relid, char *syncslotname, int szslot); extern void ReplicationSlotDropAtPubNode(WalReceiverConn *wrconn, char *slotname, bool missing_ok); From 79b716cfb7a1be2a61ebb4418099db1258f35e30 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Thu, 7 Apr 2022 09:39:25 +0530 Subject: [PATCH 408/772] Reorder subskiplsn in pg_subscription to avoid alignment issues. The column 'subskiplsn' uses TYPALIGN_DOUBLE (which has 4 bytes alignment on AIX) for storage. But the C Struct (Form_pg_subscription) has 8-byte alignment for this field, so retrieving it from storage causes an unaligned read. To fix this, we rearranged the 'subskiplsn' column in the catalog so that it naturally comes at an 8-byte boundary. We have fixed a similar problem in commit f3b421da5f. This patch adds a test to avoid a similar mistake in the future. Reported-by: Noah Misch Diagnosed-by: Noah Misch, Masahiko Sawada, Amit Kapila Author: Masahiko Sawada Reviewed-by: Noah Misch, Amit Kapila Discussion: https://postgr.es/m/20220401074423.GC3682158@rfd.leadboat.com https://postgr.es/m/CAD21AoDeScrsHhLyEPYqN3sydg6PxAPVBboK=30xJfUVihNZDA@mail.gmail.com --- doc/src/sgml/catalogs.sgml | 20 +++++----- src/backend/catalog/pg_subscription.c | 2 +- src/backend/catalog/system_views.sql | 4 +- src/backend/commands/subscriptioncmds.c | 2 +- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_subscription.h | 11 +++--- src/test/regress/expected/sanity_check.out | 29 ++++++++++++++ src/test/regress/expected/test_setup.out | 4 ++ src/test/regress/regress.c | 45 ++++++++++++++++++++++ src/test/regress/sql/sanity_check.sql | 26 +++++++++++++ src/test/regress/sql/test_setup.sql | 5 +++ 11 files changed, 130 insertions(+), 20 deletions(-) diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 298de74af4..646ab74d04 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -7823,6 +7823,16 @@ SCRAM-SHA-256$<iteration count>:&l + + + subskiplsn pg_lsn + + + Finish LSN of the transaction whose changes are to be skipped, if a valid + LSN; otherwise 0/0. + + + subname name @@ -7893,16 +7903,6 @@ SCRAM-SHA-256$<iteration count>:&l - - - subskiplsn pg_lsn - - - Finish LSN of the transaction whose changes are to be skipped, if a valid - LSN; otherwise 0/0. - - - subconninfo text diff --git a/src/backend/catalog/pg_subscription.c b/src/backend/catalog/pg_subscription.c index 0ff0982f7b..add51caadf 100644 --- a/src/backend/catalog/pg_subscription.c +++ b/src/backend/catalog/pg_subscription.c @@ -63,6 +63,7 @@ GetSubscription(Oid subid, bool missing_ok) sub = (Subscription *) palloc(sizeof(Subscription)); sub->oid = subid; sub->dbid = subform->subdbid; + sub->skiplsn = subform->subskiplsn; sub->name = pstrdup(NameStr(subform->subname)); sub->owner = subform->subowner; sub->enabled = subform->subenabled; @@ -70,7 +71,6 @@ GetSubscription(Oid subid, bool missing_ok) sub->stream = subform->substream; sub->twophasestate = subform->subtwophasestate; sub->disableonerr = subform->subdisableonerr; - sub->skiplsn = subform->subskiplsn; /* Get conninfo */ datum = SysCacheGetAttr(SUBSCRIPTIONOID, diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 9eaa51df29..e701d1c676 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -1285,8 +1285,8 @@ REVOKE ALL ON pg_replication_origin_status FROM public; -- All columns of pg_subscription except subconninfo are publicly readable. REVOKE ALL ON pg_subscription FROM public; -GRANT SELECT (oid, subdbid, subname, subowner, subenabled, subbinary, - substream, subtwophasestate, subdisableonerr, subskiplsn, subslotname, +GRANT SELECT (oid, subdbid, subskiplsn, subname, subowner, subenabled, + subbinary, substream, subtwophasestate, subdisableonerr, subslotname, subsynccommit, subpublications) ON pg_subscription TO public; diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 83192dbd51..057ab4b6a3 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -596,6 +596,7 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, Anum_pg_subscription_oid); values[Anum_pg_subscription_oid - 1] = ObjectIdGetDatum(subid); values[Anum_pg_subscription_subdbid - 1] = ObjectIdGetDatum(MyDatabaseId); + values[Anum_pg_subscription_subskiplsn - 1] = LSNGetDatum(InvalidXLogRecPtr); values[Anum_pg_subscription_subname - 1] = DirectFunctionCall1(namein, CStringGetDatum(stmt->subname)); values[Anum_pg_subscription_subowner - 1] = ObjectIdGetDatum(owner); @@ -607,7 +608,6 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, LOGICALREP_TWOPHASE_STATE_PENDING : LOGICALREP_TWOPHASE_STATE_DISABLED); values[Anum_pg_subscription_subdisableonerr - 1] = BoolGetDatum(opts.disableonerr); - values[Anum_pg_subscription_subskiplsn - 1] = LSNGetDatum(InvalidXLogRecPtr); values[Anum_pg_subscription_subconninfo - 1] = CStringGetTextDatum(conninfo); if (opts.slot_name) diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 9cf5ffb6ff..b6742b12c5 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202204062 +#define CATALOG_VERSION_NO 202204071 #endif diff --git a/src/include/catalog/pg_subscription.h b/src/include/catalog/pg_subscription.h index 599c2e4422..f006a92612 100644 --- a/src/include/catalog/pg_subscription.h +++ b/src/include/catalog/pg_subscription.h @@ -54,6 +54,10 @@ CATALOG(pg_subscription,6100,SubscriptionRelationId) BKI_SHARED_RELATION BKI_ROW Oid subdbid BKI_LOOKUP(pg_database); /* Database the * subscription is in. */ + + XLogRecPtr subskiplsn; /* All changes finished at this LSN are + * skipped */ + NameData subname; /* Name of the subscription */ Oid subowner BKI_LOOKUP(pg_authid); /* Owner of the subscription */ @@ -71,9 +75,6 @@ CATALOG(pg_subscription,6100,SubscriptionRelationId) BKI_SHARED_RELATION BKI_ROW bool subdisableonerr; /* True if a worker error should cause the * subscription to be disabled */ - XLogRecPtr subskiplsn; /* All changes finished at this LSN are - * skipped */ - #ifdef CATALOG_VARLEN /* variable-length fields start here */ /* Connection string to the publisher */ text subconninfo BKI_FORCE_NOT_NULL; @@ -103,6 +104,8 @@ typedef struct Subscription Oid oid; /* Oid of the subscription */ Oid dbid; /* Oid of the database which subscription is * in */ + XLogRecPtr skiplsn; /* All changes finished at this LSN are + * skipped */ char *name; /* Name of the subscription */ Oid owner; /* Oid of the subscription owner */ bool enabled; /* Indicates if the subscription is enabled */ @@ -113,8 +116,6 @@ typedef struct Subscription bool disableonerr; /* Indicates if the subscription should be * automatically disabled if a worker error * occurs */ - XLogRecPtr skiplsn; /* All changes finished at this LSN are - * skipped */ char *conninfo; /* Connection string to the publisher */ char *slotname; /* Name of the replication slot */ char *synccommit; /* Synchronous commit setting for worker */ diff --git a/src/test/regress/expected/sanity_check.out b/src/test/regress/expected/sanity_check.out index 8370c1561c..a2faefb4c0 100644 --- a/src/test/regress/expected/sanity_check.out +++ b/src/test/regress/expected/sanity_check.out @@ -25,3 +25,32 @@ SELECT relname, relkind ---------+--------- (0 rows) +-- +-- When ALIGNOF_DOUBLE==4 (e.g. AIX), the C ABI may impose 8-byte alignment on +-- some of the C types that correspond to TYPALIGN_DOUBLE SQL types. To ensure +-- catalog C struct layout matches catalog tuple layout, arrange for the tuple +-- offset of each fixed-width, attalign='d' catalog column to be divisible by 8 +-- unconditionally. Keep such columns before the first NameData column of the +-- catalog, since packagers can override NAMEDATALEN to an odd number. +-- +WITH check_columns AS ( + SELECT relname, attname, + array( + SELECT t.oid + FROM pg_type t JOIN pg_attribute pa ON t.oid = pa.atttypid + WHERE pa.attrelid = a.attrelid AND + pa.attnum > 0 AND pa.attnum <= a.attnum + ORDER BY pa.attnum) AS coltypes + FROM pg_attribute a JOIN pg_class c ON c.oid = attrelid + JOIN pg_namespace n ON c.relnamespace = n.oid + WHERE attalign = 'd' AND relkind = 'r' AND + attnotnull AND attlen <> -1 AND n.nspname = 'pg_catalog' +) +SELECT relname, attname, coltypes, get_column_offset(coltypes) + FROM check_columns + WHERE get_column_offset(coltypes) % 8 != 0 OR + 'name'::regtype::oid = ANY(coltypes); + relname | attname | coltypes | get_column_offset +---------+---------+----------+------------------- +(0 rows) + diff --git a/src/test/regress/expected/test_setup.out b/src/test/regress/expected/test_setup.out index a9d0de3dea..8b8ba7d778 100644 --- a/src/test/regress/expected/test_setup.out +++ b/src/test/regress/expected/test_setup.out @@ -206,6 +206,10 @@ CREATE FUNCTION ttdummy () RETURNS trigger AS :'regresslib' LANGUAGE C; +CREATE FUNCTION get_column_offset (oid[]) + RETURNS int + AS :'regresslib' + LANGUAGE C STRICT STABLE PARALLEL SAFE; -- Use hand-rolled hash functions and operator classes to get predictable -- result on different machines. The hash function for int4 simply returns -- the sum of the values passed to it and the one for text returns the length diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c index 0802fb9136..8b0c2d9d68 100644 --- a/src/test/regress/regress.c +++ b/src/test/regress/regress.c @@ -41,6 +41,7 @@ #include "storage/spin.h" #include "utils/builtins.h" #include "utils/geo_decls.h" +#include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/rel.h" #include "utils/typcache.h" @@ -1216,3 +1217,47 @@ binary_coercible(PG_FUNCTION_ARGS) PG_RETURN_BOOL(IsBinaryCoercible(srctype, targettype)); } + +/* + * Return the column offset of the last data in the given array of + * data types. The input data types must be fixed-length data types. + */ +PG_FUNCTION_INFO_V1(get_column_offset); +Datum +get_column_offset(PG_FUNCTION_ARGS) +{ + ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0); + Oid *type_oids; + int ntypes; + int column_offset = 0; + + if (ARR_HASNULL(ta) && array_contains_nulls(ta)) + elog(ERROR, "argument must not contain nulls"); + + if (ARR_NDIM(ta) > 1) + elog(ERROR, "argument must be empty or one-dimensional array"); + + type_oids = (Oid *) ARR_DATA_PTR(ta); + ntypes = ArrayGetNItems(ARR_NDIM(ta), ARR_DIMS(ta)); + for (int i = 0; i < ntypes; i++) + { + Oid typeoid = type_oids[i]; + int16 typlen; + bool typbyval; + char typalign; + + get_typlenbyvalalign(typeoid, &typlen, &typbyval, &typalign); + + /* the data type must be fixed-length */ + if (!(typbyval || (typlen > 0))) + elog(ERROR, "type %u is not fixed-length data type", typeoid); + + column_offset = att_align_nominal(column_offset, typalign); + + /* not include the last type size */ + if (i != (ntypes - 1)) + column_offset += typlen; + } + + PG_RETURN_INT32(column_offset); +} diff --git a/src/test/regress/sql/sanity_check.sql b/src/test/regress/sql/sanity_check.sql index 162e5324b5..c70ff781fa 100644 --- a/src/test/regress/sql/sanity_check.sql +++ b/src/test/regress/sql/sanity_check.sql @@ -19,3 +19,29 @@ SELECT relname, relkind FROM pg_class WHERE relkind IN ('v', 'c', 'f', 'p', 'I') AND relfilenode <> 0; + +-- +-- When ALIGNOF_DOUBLE==4 (e.g. AIX), the C ABI may impose 8-byte alignment on +-- some of the C types that correspond to TYPALIGN_DOUBLE SQL types. To ensure +-- catalog C struct layout matches catalog tuple layout, arrange for the tuple +-- offset of each fixed-width, attalign='d' catalog column to be divisible by 8 +-- unconditionally. Keep such columns before the first NameData column of the +-- catalog, since packagers can override NAMEDATALEN to an odd number. +-- +WITH check_columns AS ( + SELECT relname, attname, + array( + SELECT t.oid + FROM pg_type t JOIN pg_attribute pa ON t.oid = pa.atttypid + WHERE pa.attrelid = a.attrelid AND + pa.attnum > 0 AND pa.attnum <= a.attnum + ORDER BY pa.attnum) AS coltypes + FROM pg_attribute a JOIN pg_class c ON c.oid = attrelid + JOIN pg_namespace n ON c.relnamespace = n.oid + WHERE attalign = 'd' AND relkind = 'r' AND + attnotnull AND attlen <> -1 AND n.nspname = 'pg_catalog' +) +SELECT relname, attname, coltypes, get_column_offset(coltypes) + FROM check_columns + WHERE get_column_offset(coltypes) % 8 != 0 OR + 'name'::regtype::oid = ANY(coltypes); diff --git a/src/test/regress/sql/test_setup.sql b/src/test/regress/sql/test_setup.sql index 1f3f2f1724..fbceb8cb46 100644 --- a/src/test/regress/sql/test_setup.sql +++ b/src/test/regress/sql/test_setup.sql @@ -253,6 +253,11 @@ CREATE FUNCTION ttdummy () AS :'regresslib' LANGUAGE C; +CREATE FUNCTION get_column_offset (oid[]) + RETURNS int + AS :'regresslib' + LANGUAGE C STRICT STABLE PARALLEL SAFE; + -- Use hand-rolled hash functions and operator classes to get predictable -- result on different machines. The hash function for int4 simply returns -- the sum of the values passed to it and the one for text returns the length From be902e26510788c70a874ea54bad753b723d018f Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 21:29:46 -0700 Subject: [PATCH 409/772] pgstat: normalize function naming. Most of pgstat uses pgstat__() or just _(). But not all (some introduced fairly recently by me). Rename ones that aren't intentionally following a different scheme (e.g. AtEOXact_*). --- src/backend/access/common/relation.c | 4 +-- src/backend/access/transam/slru.c | 2 +- src/backend/postmaster/pgstat.c | 4 +-- src/backend/utils/activity/pgstat_relation.c | 38 ++++++++++---------- src/backend/utils/activity/pgstat_slru.c | 24 ++++++------- src/backend/utils/activity/pgstat_wal.c | 4 +-- src/backend/utils/activity/pgstat_xact.c | 6 ++-- src/backend/utils/adt/pgstatfuncs.c | 2 +- src/include/pgstat.h | 22 ++++++------ src/include/utils/pgstat_internal.h | 7 ++-- 10 files changed, 56 insertions(+), 57 deletions(-) diff --git a/src/backend/access/common/relation.c b/src/backend/access/common/relation.c index 003663ab81..382a42ff7d 100644 --- a/src/backend/access/common/relation.c +++ b/src/backend/access/common/relation.c @@ -73,7 +73,7 @@ relation_open(Oid relationId, LOCKMODE lockmode) if (RelationUsesLocalBuffers(r)) MyXactFlags |= XACT_FLAGS_ACCESSEDTEMPNAMESPACE; - pgstat_relation_init(r); + pgstat_init_relation(r); return r; } @@ -123,7 +123,7 @@ try_relation_open(Oid relationId, LOCKMODE lockmode) if (RelationUsesLocalBuffers(r)) MyXactFlags |= XACT_FLAGS_ACCESSEDTEMPNAMESPACE; - pgstat_relation_init(r); + pgstat_init_relation(r); return r; } diff --git a/src/backend/access/transam/slru.c b/src/backend/access/transam/slru.c index d34732cb41..b65cb49d7f 100644 --- a/src/backend/access/transam/slru.c +++ b/src/backend/access/transam/slru.c @@ -215,7 +215,7 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, /* shared->latest_page_number will be set later */ - shared->slru_stats_idx = pgstat_slru_index(name); + shared->slru_stats_idx = pgstat_get_slru_index(name); ptr = (char *) shared; offset = MAXALIGN(sizeof(SlruSharedData)); diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 8655b56c5e..20c4629e55 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -727,7 +727,7 @@ pgstat_initialize(void) { Assert(!pgstat_is_initialized); - pgstat_wal_initialize(); + pgstat_init_wal(); /* Set up a process-exit hook to clean up */ before_shmem_exit(pgstat_shutdown_hook, 0); @@ -768,7 +768,7 @@ pgstat_report_stat(bool disconnect) */ if (!have_relation_stats && pgStatXactCommit == 0 && pgStatXactRollback == 0 && - !pgstat_wal_pending() && + !pgstat_have_pending_wal() && !have_function_stats && !disconnect) return; diff --git a/src/backend/utils/activity/pgstat_relation.c b/src/backend/utils/activity/pgstat_relation.c index 5b9b6dd7c6..51a87b6673 100644 --- a/src/backend/utils/activity/pgstat_relation.c +++ b/src/backend/utils/activity/pgstat_relation.c @@ -34,7 +34,7 @@ * for the life of the backend. Also, we zero out the t_id fields of the * contained PgStat_TableStatus structs whenever they are not actively in use. * This allows relcache pgstat_info pointers to be treated as long-lived data, - * avoiding repeated searches in pgstat_relation_init() when a relation is + * avoiding repeated searches in pgstat_init_relation() when a relation is * repeatedly opened during a transaction. */ #define TABSTAT_QUANTUM 100 /* we alloc this many at a time */ @@ -78,8 +78,8 @@ static PgStat_TableStatus *get_tabstat_entry(Oid rel_id, bool isshared); static void pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg, TimestampTz now); static void add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level); static void ensure_tabstat_xact_level(PgStat_TableStatus *pgstat_info); -static void pgstat_truncdrop_save_counters(PgStat_TableXactStatus *trans, bool is_drop); -static void pgstat_truncdrop_restore_counters(PgStat_TableXactStatus *trans); +static void save_truncdrop_counters(PgStat_TableXactStatus *trans, bool is_drop); +static void restore_truncdrop_counters(PgStat_TableXactStatus *trans); /* @@ -109,7 +109,7 @@ pgstat_copy_relation_stats(Relation dst, Relation src) if (!srcstats) return; - if (pgstat_relation_should_count(dst)) + if (pgstat_should_count_relation(dst)) { /* * XXX: temporarily this does not actually quite do what the name @@ -137,7 +137,7 @@ pgstat_copy_relation_stats(Relation dst, Relation src) * same relation is touched repeatedly within a transaction. */ void -pgstat_relation_init(Relation rel) +pgstat_init_relation(Relation rel) { Oid rel_id = rel->rd_id; char relkind = rel->rd_rel->relkind; @@ -242,7 +242,7 @@ pgstat_report_analyze(Relation rel, * * Waste no time on partitioned tables, though. */ - if (pgstat_relation_should_count(rel) && + if (pgstat_should_count_relation(rel) && rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) { PgStat_TableXactStatus *trans; @@ -276,7 +276,7 @@ pgstat_report_analyze(Relation rel, void pgstat_count_heap_insert(Relation rel, PgStat_Counter n) { - if (pgstat_relation_should_count(rel)) + if (pgstat_should_count_relation(rel)) { PgStat_TableStatus *pgstat_info = rel->pgstat_info; @@ -291,7 +291,7 @@ pgstat_count_heap_insert(Relation rel, PgStat_Counter n) void pgstat_count_heap_update(Relation rel, bool hot) { - if (pgstat_relation_should_count(rel)) + if (pgstat_should_count_relation(rel)) { PgStat_TableStatus *pgstat_info = rel->pgstat_info; @@ -310,7 +310,7 @@ pgstat_count_heap_update(Relation rel, bool hot) void pgstat_count_heap_delete(Relation rel) { - if (pgstat_relation_should_count(rel)) + if (pgstat_should_count_relation(rel)) { PgStat_TableStatus *pgstat_info = rel->pgstat_info; @@ -325,12 +325,12 @@ pgstat_count_heap_delete(Relation rel) void pgstat_count_truncate(Relation rel) { - if (pgstat_relation_should_count(rel)) + if (pgstat_should_count_relation(rel)) { PgStat_TableStatus *pgstat_info = rel->pgstat_info; ensure_tabstat_xact_level(pgstat_info); - pgstat_truncdrop_save_counters(pgstat_info->trans, false); + save_truncdrop_counters(pgstat_info->trans, false); pgstat_info->trans->tuples_inserted = 0; pgstat_info->trans->tuples_updated = 0; pgstat_info->trans->tuples_deleted = 0; @@ -348,7 +348,7 @@ pgstat_count_truncate(Relation rel) void pgstat_update_heap_dead_tuples(Relation rel, int delta) { - if (pgstat_relation_should_count(rel)) + if (pgstat_should_count_relation(rel)) { PgStat_TableStatus *pgstat_info = rel->pgstat_info; @@ -405,7 +405,7 @@ AtEOXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit) Assert(tabstat->trans == trans); /* restore pre-truncate/drop stats (if any) in case of aborted xact */ if (!isCommit) - pgstat_truncdrop_restore_counters(trans); + restore_truncdrop_counters(trans); /* count attempted actions regardless of commit/abort */ tabstat->t_counts.t_tuples_inserted += trans->tuples_inserted; tabstat->t_counts.t_tuples_updated += trans->tuples_updated; @@ -470,7 +470,7 @@ AtEOSubXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit, in if (trans->truncdropped) { /* propagate the truncate/drop status one level up */ - pgstat_truncdrop_save_counters(trans->upper, false); + save_truncdrop_counters(trans->upper, false); /* replace upper xact stats with ours */ trans->upper->tuples_inserted = trans->tuples_inserted; trans->upper->tuples_updated = trans->tuples_updated; @@ -497,7 +497,7 @@ AtEOSubXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit, in */ PgStat_SubXactStatus *upper_xact_state; - upper_xact_state = pgstat_xact_stack_level_get(nestDepth - 1); + upper_xact_state = pgstat_get_xact_stack_level(nestDepth - 1); trans->next = upper_xact_state->first; upper_xact_state->first = trans; trans->nest_level = nestDepth - 1; @@ -511,7 +511,7 @@ AtEOSubXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit, in */ /* first restore values obliterated by truncate/drop */ - pgstat_truncdrop_restore_counters(trans); + restore_truncdrop_counters(trans); /* count attempted actions regardless of commit/abort */ tabstat->t_counts.t_tuples_inserted += trans->tuples_inserted; tabstat->t_counts.t_tuples_updated += trans->tuples_updated; @@ -860,7 +860,7 @@ add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level) * If this is the first rel to be modified at the current nest level, we * first have to push a transaction stack entry. */ - xact_state = pgstat_xact_stack_level_get(nest_level); + xact_state = pgstat_get_xact_stack_level(nest_level); /* Now make a per-table stack entry */ trans = (PgStat_TableXactStatus *) @@ -897,7 +897,7 @@ ensure_tabstat_xact_level(PgStat_TableStatus *pgstat_info) * subxact level only. */ static void -pgstat_truncdrop_save_counters(PgStat_TableXactStatus *trans, bool is_drop) +save_truncdrop_counters(PgStat_TableXactStatus *trans, bool is_drop) { if (!trans->truncdropped || is_drop) { @@ -912,7 +912,7 @@ pgstat_truncdrop_save_counters(PgStat_TableXactStatus *trans, bool is_drop) * restore counters when a truncate aborts */ static void -pgstat_truncdrop_restore_counters(PgStat_TableXactStatus *trans) +restore_truncdrop_counters(PgStat_TableXactStatus *trans) { if (trans->truncdropped) { diff --git a/src/backend/utils/activity/pgstat_slru.c b/src/backend/utils/activity/pgstat_slru.c index 1f2d2c3bbb..d932bc74e0 100644 --- a/src/backend/utils/activity/pgstat_slru.c +++ b/src/backend/utils/activity/pgstat_slru.c @@ -20,7 +20,7 @@ #include "utils/pgstat_internal.h" -static inline PgStat_MsgSLRU *slru_entry(int slru_idx); +static inline PgStat_MsgSLRU *get_slru_entry(int slru_idx); /* @@ -49,7 +49,7 @@ pgstat_reset_slru(const char *name) return; pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSLRUCOUNTER); - msg.m_index = pgstat_slru_index(name); + msg.m_index = pgstat_get_slru_index(name); pgstat_send(&msg, sizeof(msg)); } @@ -61,43 +61,43 @@ pgstat_reset_slru(const char *name) void pgstat_count_slru_page_zeroed(int slru_idx) { - slru_entry(slru_idx)->m_blocks_zeroed += 1; + get_slru_entry(slru_idx)->m_blocks_zeroed += 1; } void pgstat_count_slru_page_hit(int slru_idx) { - slru_entry(slru_idx)->m_blocks_hit += 1; + get_slru_entry(slru_idx)->m_blocks_hit += 1; } void pgstat_count_slru_page_exists(int slru_idx) { - slru_entry(slru_idx)->m_blocks_exists += 1; + get_slru_entry(slru_idx)->m_blocks_exists += 1; } void pgstat_count_slru_page_read(int slru_idx) { - slru_entry(slru_idx)->m_blocks_read += 1; + get_slru_entry(slru_idx)->m_blocks_read += 1; } void pgstat_count_slru_page_written(int slru_idx) { - slru_entry(slru_idx)->m_blocks_written += 1; + get_slru_entry(slru_idx)->m_blocks_written += 1; } void pgstat_count_slru_flush(int slru_idx) { - slru_entry(slru_idx)->m_flush += 1; + get_slru_entry(slru_idx)->m_flush += 1; } void pgstat_count_slru_truncate(int slru_idx) { - slru_entry(slru_idx)->m_truncate += 1; + get_slru_entry(slru_idx)->m_truncate += 1; } /* @@ -106,7 +106,7 @@ pgstat_count_slru_truncate(int slru_idx) * know the number of entries in advance. */ const char * -pgstat_slru_name(int slru_idx) +pgstat_get_slru_name(int slru_idx) { if (slru_idx < 0 || slru_idx >= SLRU_NUM_ELEMENTS) return NULL; @@ -120,7 +120,7 @@ pgstat_slru_name(int slru_idx) * external projects. */ int -pgstat_slru_index(const char *name) +pgstat_get_slru_index(const char *name) { int i; @@ -174,7 +174,7 @@ pgstat_send_slru(void) * stored in SlruCtl as lwlock tranche name). */ static inline PgStat_MsgSLRU * -slru_entry(int slru_idx) +get_slru_entry(int slru_idx) { pgstat_assert_is_up(); diff --git a/src/backend/utils/activity/pgstat_wal.c b/src/backend/utils/activity/pgstat_wal.c index 8680809dee..8855598f52 100644 --- a/src/backend/utils/activity/pgstat_wal.c +++ b/src/backend/utils/activity/pgstat_wal.c @@ -130,7 +130,7 @@ pgstat_report_wal(bool force) } void -pgstat_wal_initialize(void) +pgstat_init_wal(void) { /* * Initialize prevWalUsage with pgWalUsage so that pgstat_report_wal() can @@ -148,7 +148,7 @@ pgstat_wal_initialize(void) * data pages. */ bool -pgstat_wal_pending(void) +pgstat_have_pending_wal(void) { return pgWalUsage.wal_records != prevWalUsage.wal_records || WalStats.m_wal_write != 0 || diff --git a/src/backend/utils/activity/pgstat_xact.c b/src/backend/utils/activity/pgstat_xact.c index 5c00eab7c7..3f33087378 100644 --- a/src/backend/utils/activity/pgstat_xact.c +++ b/src/backend/utils/activity/pgstat_xact.c @@ -139,7 +139,7 @@ AtEOSubXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, if (xact_state->pending_drops_count == 0) return; - parent_xact_state = pgstat_xact_stack_level_get(nestDepth - 1); + parent_xact_state = pgstat_get_xact_stack_level(nestDepth - 1); dlist_foreach_modify(iter, &xact_state->pending_drops) { @@ -228,7 +228,7 @@ PostPrepare_PgStat(void) * it if needed. */ PgStat_SubXactStatus * -pgstat_xact_stack_level_get(int nest_level) +pgstat_get_xact_stack_level(int nest_level) { PgStat_SubXactStatus *xact_state; @@ -324,7 +324,7 @@ create_drop_transactional_internal(PgStat_Kind kind, Oid dboid, Oid objoid, bool PgStat_PendingDroppedStatsItem *drop = (PgStat_PendingDroppedStatsItem *) MemoryContextAlloc(TopTransactionContext, sizeof(PgStat_PendingDroppedStatsItem)); - xact_state = pgstat_xact_stack_level_get(nest_level); + xact_state = pgstat_get_xact_stack_level(nest_level); drop->is_create = is_create; drop->item.kind = kind; diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 709dd5548a..be5470a107 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -1830,7 +1830,7 @@ pg_stat_get_slru(PG_FUNCTION_ARGS) PgStat_SLRUStats stat; const char *name; - name = pgstat_slru_name(i); + name = pgstat_get_slru_name(i); if (!name) break; diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 0c618e7710..99115bacde 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -1069,7 +1069,7 @@ extern void pgstat_create_relation(Relation rel); extern void pgstat_drop_relation(Relation rel); extern void pgstat_copy_relation_stats(Relation dstrel, Relation srcrel); -extern void pgstat_relation_init(Relation rel); +extern void pgstat_init_relation(Relation rel); extern void pgstat_report_vacuum(Oid tableoid, bool shared, PgStat_Counter livetuples, PgStat_Counter deadtuples); @@ -1077,44 +1077,44 @@ extern void pgstat_report_analyze(Relation rel, PgStat_Counter livetuples, PgStat_Counter deadtuples, bool resetcounter); -#define pgstat_relation_should_count(rel) \ +#define pgstat_should_count_relation(rel) \ (likely((rel)->pgstat_info != NULL)) /* nontransactional event counts are simple enough to inline */ #define pgstat_count_heap_scan(rel) \ do { \ - if (pgstat_relation_should_count(rel)) \ + if (pgstat_should_count_relation(rel)) \ (rel)->pgstat_info->t_counts.t_numscans++; \ } while (0) #define pgstat_count_heap_getnext(rel) \ do { \ - if (pgstat_relation_should_count(rel)) \ + if (pgstat_should_count_relation(rel)) \ (rel)->pgstat_info->t_counts.t_tuples_returned++; \ } while (0) #define pgstat_count_heap_fetch(rel) \ do { \ - if (pgstat_relation_should_count(rel)) \ + if (pgstat_should_count_relation(rel)) \ (rel)->pgstat_info->t_counts.t_tuples_fetched++; \ } while (0) #define pgstat_count_index_scan(rel) \ do { \ - if (pgstat_relation_should_count(rel)) \ + if (pgstat_should_count_relation(rel)) \ (rel)->pgstat_info->t_counts.t_numscans++; \ } while (0) #define pgstat_count_index_tuples(rel, n) \ do { \ - if (pgstat_relation_should_count(rel)) \ + if (pgstat_should_count_relation(rel)) \ (rel)->pgstat_info->t_counts.t_tuples_returned += (n); \ } while (0) #define pgstat_count_buffer_read(rel) \ do { \ - if (pgstat_relation_should_count(rel)) \ + if (pgstat_should_count_relation(rel)) \ (rel)->pgstat_info->t_counts.t_blocks_fetched++; \ } while (0) #define pgstat_count_buffer_hit(rel) \ do { \ - if (pgstat_relation_should_count(rel)) \ + if (pgstat_should_count_relation(rel)) \ (rel)->pgstat_info->t_counts.t_blocks_hit++; \ } while (0) @@ -1155,8 +1155,8 @@ extern void pgstat_count_slru_page_written(int slru_idx); extern void pgstat_count_slru_page_exists(int slru_idx); extern void pgstat_count_slru_flush(int slru_idx); extern void pgstat_count_slru_truncate(int slru_idx); -extern const char *pgstat_slru_name(int slru_idx); -extern int pgstat_slru_index(const char *name); +extern const char *pgstat_get_slru_name(int slru_idx); +extern int pgstat_get_slru_index(const char *name); /* diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index da66e924dc..c3f83c74c6 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -134,20 +134,19 @@ extern void pgstat_send_slru(void); * Functions in pgstat_wal.c */ -extern void pgstat_wal_initialize(void); -extern bool pgstat_wal_pending(void); +extern void pgstat_init_wal(void); +extern bool pgstat_have_pending_wal(void); /* * Functions in pgstat_xact.c */ -extern PgStat_SubXactStatus *pgstat_xact_stack_level_get(int nest_level); +extern PgStat_SubXactStatus *pgstat_get_xact_stack_level(int nest_level); extern void pgstat_drop_transactional(PgStat_Kind kind, Oid dboid, Oid objoid); extern void pgstat_create_transactional(PgStat_Kind kind, Oid dboid, Oid objoid); - /* * Variables in pgstat.c */ From 5891c7a8ed8f2d3d577e7eea34dacff12d7b6bbd Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 21:29:46 -0700 Subject: [PATCH 410/772] pgstat: store statistics in shared memory. Previously the statistics collector received statistics updates via UDP and shared statistics data by writing them out to temporary files regularly. These files can reach tens of megabytes and are written out up to twice a second. This has repeatedly prevented us from adding additional useful statistics. Now statistics are stored in shared memory. Statistics for variable-numbered objects are stored in a dshash hashtable (backed by dynamic shared memory). Fixed-numbered stats are stored in plain shared memory. The header for pgstat.c contains an overview of the architecture. The stats collector is not needed anymore, remove it. By utilizing the transactional statistics drop infrastructure introduced in a prior commit statistics entries cannot "leak" anymore. Previously leaked statistics were dropped by pgstat_vacuum_stat(), called from [auto-]vacuum. On systems with many small relations pgstat_vacuum_stat() could be quite expensive. Now that replicas drop statistics entries for dropped objects, it is not necessary anymore to reset stats when starting from a cleanly shut down replica. Subsequent commits will perform some further code cleanup, adapt docs and add tests. Bumps PGSTAT_FILE_FORMAT_ID. Author: Kyotaro Horiguchi Author: Andres Freund Author: Melanie Plageman Reviewed-By: Andres Freund Reviewed-By: Thomas Munro Reviewed-By: Justin Pryzby Reviewed-By: "David G. Johnston" Reviewed-By: Tomas Vondra (in a much earlier version) Reviewed-By: Arthur Zakirov (in a much earlier version) Reviewed-By: Antonin Houska (in a much earlier version) Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de Discussion: https://postgr.es/m/20220308205351.2xcn6k4x5yivcxyd@alap3.anarazel.de Discussion: https://postgr.es/m/20210319235115.y3wz7hpnnrshdyv6@alap3.anarazel.de --- doc/src/sgml/monitoring.sgml | 19 +- src/backend/access/transam/xlog.c | 39 +- src/backend/commands/vacuum.c | 7 - src/backend/commands/vacuumparallel.c | 2 + src/backend/postmaster/autovacuum.c | 197 +- src/backend/postmaster/checkpointer.c | 20 +- src/backend/postmaster/interrupt.c | 5 +- src/backend/postmaster/pgstat.c | 4637 ++++------------- src/backend/postmaster/postmaster.c | 91 +- src/backend/replication/logical/logical.c | 1 - src/backend/replication/logical/tablesync.c | 8 +- src/backend/replication/logical/worker.c | 6 + src/backend/replication/slot.c | 26 +- src/backend/storage/buffer/bufmgr.c | 8 +- src/backend/storage/ipc/ipci.c | 2 + src/backend/storage/lmgr/lwlock.c | 8 +- src/backend/tcop/postgres.c | 31 +- src/backend/utils/activity/Makefile | 1 + src/backend/utils/activity/pgstat_archiver.c | 91 +- src/backend/utils/activity/pgstat_bgwriter.c | 82 +- .../utils/activity/pgstat_checkpointer.c | 93 +- src/backend/utils/activity/pgstat_database.c | 345 +- src/backend/utils/activity/pgstat_function.c | 167 +- src/backend/utils/activity/pgstat_relation.c | 592 +-- src/backend/utils/activity/pgstat_replslot.c | 183 +- src/backend/utils/activity/pgstat_shmem.c | 987 ++++ src/backend/utils/activity/pgstat_slru.c | 160 +- .../utils/activity/pgstat_subscription.c | 67 +- src/backend/utils/activity/pgstat_wal.c | 175 +- src/backend/utils/activity/pgstat_xact.c | 37 +- src/backend/utils/activity/wait_event.c | 3 - src/backend/utils/adt/pgstatfuncs.c | 10 +- src/backend/utils/cache/relcache.c | 7 +- src/backend/utils/init/globals.c | 1 + src/backend/utils/init/miscinit.c | 3 - src/backend/utils/init/postinit.c | 12 + src/backend/utils/misc/guc.c | 21 + src/backend/utils/misc/postgresql.conf.sample | 1 + src/include/miscadmin.h | 2 +- src/include/pgstat.h | 679 +-- src/include/storage/lwlock.h | 3 + src/include/utils/pgstat_internal.h | 663 ++- src/include/utils/rel.h | 1 + src/include/utils/timeout.h | 1 + src/include/utils/wait_event.h | 1 - src/test/modules/worker_spi/worker_spi.c | 2 +- src/test/regress/expected/stats.out | 8 + src/test/regress/sql/stats.sql | 10 + src/tools/pgindent/typedefs.list | 63 +- src/tools/valgrind.supp | 18 - 50 files changed, 4253 insertions(+), 5343 deletions(-) create mode 100644 src/backend/utils/activity/pgstat_shmem.c diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 487331c115..24924647b5 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -1110,10 +1110,6 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser LogicalLauncherMain Waiting in main loop of logical replication launcher process. - - PgStatMain - Waiting in main loop of statistics collector process. - RecoveryWalStream Waiting in main loop of startup process for WAL to arrive, during @@ -2115,6 +2111,18 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser Waiting to access the list of predicate locks held by serializable transactions. + + PgStatsDSA + Waiting for stats dynamic shared memory allocator access + + + PgStatsHash + Waiting for stats shared memory hash table access + + + PgStatsData + Waiting for shared memory stats data access + SerializableXactHash Waiting to read or update information about serializable @@ -5142,7 +5150,8 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i timestamp with time zone - Returns the timestamp of the current statistics snapshot. + Returns the timestamp of the current statistics snapshot, or NULL if + no statistics snapshot has been taken. diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 8ae0a0ba53..c076e48445 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -1842,7 +1842,7 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli, bool opportunistic) WriteRqst.Flush = 0; XLogWrite(WriteRqst, tli, false); LWLockRelease(WALWriteLock); - WalStats.m_wal_buffers_full++; + PendingWalStats.wal_buffers_full++; TRACE_POSTGRESQL_WAL_BUFFER_WRITE_DIRTY_DONE(); } /* Re-acquire WALBufMappingLock and retry */ @@ -2200,10 +2200,10 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); - WalStats.m_wal_write_time += INSTR_TIME_GET_MICROSEC(duration); + PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } - WalStats.m_wal_write++; + PendingWalStats.wal_write++; if (written <= 0) { @@ -4877,6 +4877,7 @@ StartupXLOG(void) XLogCtlInsert *Insert; CheckPoint checkPoint; bool wasShutdown; + bool didCrash; bool haveTblspcMap; bool haveBackupLabel; XLogRecPtr EndOfLog; @@ -4994,7 +4995,10 @@ StartupXLOG(void) { RemoveTempXlogFiles(); SyncDataDirectory(); + didCrash = true; } + else + didCrash = false; /* * Prepare for WAL recovery if needed. @@ -5106,6 +5110,22 @@ StartupXLOG(void) */ restoreTwoPhaseData(); + /* + * When starting with crash recovery, reset pgstat data - it might not be + * valid. Otherwise restore pgstat data. It's safe to do this here, + * because postmaster will not yet have started any other processes. + * + * NB: Restoring replication slot stats relies on slot state to have + * already been restored from disk. + * + * TODO: With a bit of extra work we could just start with a pgstat file + * associated with the checkpoint redo location we're starting from. + */ + if (didCrash) + pgstat_discard_stats(); + else + pgstat_restore_stats(); + lastFullPageWrites = checkPoint.fullPageWrites; RedoRecPtr = XLogCtl->RedoRecPtr = XLogCtl->Insert.RedoRecPtr = checkPoint.redo; @@ -5180,11 +5200,6 @@ StartupXLOG(void) LocalMinRecoveryPointTLI = 0; } - /* - * Reset pgstat data, because it may be invalid after recovery. - */ - pgstat_reset_all(); - /* Check that the GUCs used to generate the WAL allow recovery */ CheckRequiredParameterValues(); @@ -6081,8 +6096,8 @@ LogCheckpointEnd(bool restartpoint) CheckpointStats.ckpt_sync_end_t); /* Accumulate checkpoint timing summary data, in milliseconds. */ - PendingCheckpointerStats.m_checkpoint_write_time += write_msecs; - PendingCheckpointerStats.m_checkpoint_sync_time += sync_msecs; + PendingCheckpointerStats.checkpoint_write_time += write_msecs; + PendingCheckpointerStats.checkpoint_sync_time += sync_msecs; /* * All of the published timing statistics are accounted for. Only @@ -8009,10 +8024,10 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); - WalStats.m_wal_sync_time += INSTR_TIME_GET_MICROSEC(duration); + PendingWalStats.wal_sync_time += INSTR_TIME_GET_MICROSEC(duration); } - WalStats.m_wal_sync++; + PendingWalStats.wal_sync++; } /* diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 04dbbe5530..e0fc7e8d79 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -351,13 +351,6 @@ vacuum(List *relations, VacuumParams *params, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("PROCESS_TOAST required with VACUUM FULL"))); - /* - * Send info about dead objects to the cumulative stats system, unless - * we are in autovacuum --- autovacuum.c does this for itself. - */ - if ((params->options & VACOPT_VACUUM) && !IsAutoVacuumWorkerProcess()) - pgstat_vacuum_stat(); - /* * Create special memory context for cross-transaction storage. * diff --git a/src/backend/commands/vacuumparallel.c b/src/backend/commands/vacuumparallel.c index 974a29e7a9..6b4f742578 100644 --- a/src/backend/commands/vacuumparallel.c +++ b/src/backend/commands/vacuumparallel.c @@ -28,6 +28,7 @@ #include "access/amapi.h" #include "access/table.h" +#include "access/xact.h" #include "catalog/index.h" #include "commands/vacuum.h" #include "optimizer/paths.h" @@ -35,6 +36,7 @@ #include "storage/bufmgr.h" #include "tcop/tcopprot.h" #include "utils/lsyscache.h" +#include "utils/rel.h" /* * DSM keys for parallel vacuum. Unlike other parallel execution code, since diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index c6d30fa527..f36c40e852 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -44,11 +44,12 @@ * Note that there can be more than one worker in a database concurrently. * They will store the table they are currently vacuuming in shared memory, so * that other workers avoid being blocked waiting for the vacuum lock for that - * table. They will also reload the pgstats data just before vacuuming each - * table, to avoid vacuuming a table that was just finished being vacuumed by - * another worker and thus is no longer noted in shared memory. However, - * there is a window (caused by pgstat delay) on which a worker may choose a - * table that was already vacuumed; this is a bug in the current design. + * table. They will also fetch the last time the table was vacuumed from + * pgstats just before vacuuming each table, to avoid vacuuming a table that + * was just finished being vacuumed by another worker and thus is no longer + * noted in shared memory. However, there is a small window (due to not yet + * holding the relation lock) during which a worker may choose a table that was + * already vacuumed; this is a bug in the current design. * * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California @@ -129,9 +130,6 @@ int autovacuum_vac_cost_limit; int Log_autovacuum_min_duration = 600000; -/* how long to keep pgstat data in the launcher, in milliseconds */ -#define STATS_READ_DELAY 1000 - /* the minimum allowed time between two awakenings of the launcher */ #define MIN_AUTOVAC_SLEEPTIME 100.0 /* milliseconds */ #define MAX_AUTOVAC_SLEEPTIME 300 /* seconds */ @@ -342,15 +340,11 @@ static void autovacuum_do_vac_analyze(autovac_table *tab, BufferAccessStrategy bstrategy); static AutoVacOpts *extract_autovac_opts(HeapTuple tup, TupleDesc pg_class_desc); -static PgStat_StatTabEntry *get_pgstat_tabentry_relid(Oid relid, bool isshared, - PgStat_StatDBEntry *shared, - PgStat_StatDBEntry *dbentry); static void perform_work_item(AutoVacuumWorkItem *workitem); static void autovac_report_activity(autovac_table *tab); static void autovac_report_workitem(AutoVacuumWorkItem *workitem, const char *nspname, const char *relname); static void avl_sigusr2_handler(SIGNAL_ARGS); -static void autovac_refresh_stats(void); @@ -555,12 +549,6 @@ AutoVacLauncherMain(int argc, char *argv[]) DatabaseListCxt = NULL; dlist_init(&DatabaseList); - /* - * Make sure pgstat also considers our stat data as gone. Note: we - * mustn't use autovac_refresh_stats here. - */ - pgstat_clear_snapshot(); - /* Now we can allow interrupts again */ RESUME_INTERRUPTS(); @@ -611,6 +599,12 @@ AutoVacLauncherMain(int argc, char *argv[]) SetConfigOption("default_transaction_isolation", "read committed", PGC_SUSET, PGC_S_OVERRIDE); + /* + * Even when system is configured to use a different fetch consistency, + * for autovac we always want fresh stats. + */ + SetConfigOption("stats_fetch_consistency", "none", PGC_SUSET, PGC_S_OVERRIDE); + /* * In emergency mode, just start a worker (unless shutdown was requested) * and go away. @@ -963,9 +957,6 @@ rebuild_database_list(Oid newdb) HTAB *dbhash; dlist_iter iter; - /* use fresh stats */ - autovac_refresh_stats(); - newcxt = AllocSetContextCreate(AutovacMemCxt, "Autovacuum database list", ALLOCSET_DEFAULT_SIZES); @@ -1184,9 +1175,6 @@ do_start_worker(void) ALLOCSET_DEFAULT_SIZES); oldcxt = MemoryContextSwitchTo(tmpcxt); - /* use fresh stats */ - autovac_refresh_stats(); - /* Get a list of databases */ dblist = get_database_list(); @@ -1642,6 +1630,12 @@ AutoVacWorkerMain(int argc, char *argv[]) SetConfigOption("synchronous_commit", "local", PGC_SUSET, PGC_S_OVERRIDE); + /* + * Even when system is configured to use a different fetch consistency, + * for autovac we always want fresh stats. + */ + SetConfigOption("stats_fetch_consistency", "none", PGC_SUSET, PGC_S_OVERRIDE); + /* * Get the info about the database we're going to work on. */ @@ -1966,8 +1960,6 @@ do_autovacuum(void) HASHCTL ctl; HTAB *table_toast_map; ListCell *volatile cell; - PgStat_StatDBEntry *shared; - PgStat_StatDBEntry *dbentry; BufferAccessStrategy bstrategy; ScanKeyData key; TupleDesc pg_class_desc; @@ -1986,22 +1978,9 @@ do_autovacuum(void) ALLOCSET_DEFAULT_SIZES); MemoryContextSwitchTo(AutovacMemCxt); - /* - * may be NULL if we couldn't find an entry (only happens if we are - * forcing a vacuum for anti-wrap purposes). - */ - dbentry = pgstat_fetch_stat_dbentry(MyDatabaseId); - /* Start a transaction so our commands have one to play into. */ StartTransactionCommand(); - /* - * Clean up any dead statistics entries for this DB. We always want to do - * this exactly once per DB-processing cycle, even if we find nothing - * worth vacuuming in the database. - */ - pgstat_vacuum_stat(); - /* * Compute the multixact age for which freezing is urgent. This is * normally autovacuum_multixact_freeze_max_age, but may be less if we are @@ -2039,9 +2018,6 @@ do_autovacuum(void) /* StartTransactionCommand changed elsewhere */ MemoryContextSwitchTo(AutovacMemCxt); - /* The database hash where pgstat keeps shared relations */ - shared = pgstat_fetch_stat_dbentry(InvalidOid); - classRel = table_open(RelationRelationId, AccessShareLock); /* create a copy so we can use it after closing pg_class */ @@ -2119,8 +2095,8 @@ do_autovacuum(void) /* Fetch reloptions and the pgstat entry for this table */ relopts = extract_autovac_opts(tuple, pg_class_desc); - tabentry = get_pgstat_tabentry_relid(relid, classForm->relisshared, - shared, dbentry); + tabentry = pgstat_fetch_stat_tabentry_ext(classForm->relisshared, + relid); /* Check if it needs vacuum or analyze */ relation_needs_vacanalyze(relid, relopts, classForm, tabentry, @@ -2203,8 +2179,8 @@ do_autovacuum(void) } /* Fetch the pgstat entry for this table */ - tabentry = get_pgstat_tabentry_relid(relid, classForm->relisshared, - shared, dbentry); + tabentry = pgstat_fetch_stat_tabentry_ext(classForm->relisshared, + relid); relation_needs_vacanalyze(relid, relopts, classForm, tabentry, effective_multixact_freeze_max_age, @@ -2418,12 +2394,8 @@ do_autovacuum(void) /* * Check whether pgstat data still says we need to vacuum this table. * It could have changed if something else processed the table while - * we weren't looking. - * - * Note: we have a special case in pgstat code to ensure that the - * stats we read are as up-to-date as possible, to avoid the problem - * that somebody just finished vacuuming this table. The window to - * the race condition is not closed but it is very small. + * we weren't looking. This doesn't entirely close the race condition, + * but it is very small. */ MemoryContextSwitchTo(AutovacMemCxt); tab = table_recheck_autovac(relid, table_toast_map, pg_class_desc, @@ -2768,29 +2740,6 @@ extract_autovac_opts(HeapTuple tup, TupleDesc pg_class_desc) return av; } -/* - * get_pgstat_tabentry_relid - * - * Fetch the pgstat entry of a table, either local to a database or shared. - */ -static PgStat_StatTabEntry * -get_pgstat_tabentry_relid(Oid relid, bool isshared, PgStat_StatDBEntry *shared, - PgStat_StatDBEntry *dbentry) -{ - PgStat_StatTabEntry *tabentry = NULL; - - if (isshared) - { - if (PointerIsValid(shared)) - tabentry = hash_search(shared->tables, &relid, - HASH_FIND, NULL); - } - else if (PointerIsValid(dbentry)) - tabentry = hash_search(dbentry->tables, &relid, - HASH_FIND, NULL); - - return tabentry; -} /* * table_recheck_autovac @@ -2812,7 +2761,6 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, autovac_table *tab = NULL; bool wraparound; AutoVacOpts *avopts; - static bool reuse_stats = false; /* fetch the relation's relcache entry */ classTup = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(relid)); @@ -2836,35 +2784,6 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, avopts = &hentry->ar_reloptions; } - /* - * Reuse the stats to recheck whether a relation needs to be vacuumed or - * analyzed if it was reloaded before and has not been cleared yet. This - * is necessary to avoid frequent refresh of stats, especially when there - * are very large number of relations and the refresh can cause lots of - * overhead. - * - * If we determined that a relation needs to be vacuumed or analyzed, - * based on the old stats, we refresh stats and recheck the necessity - * again. Because a relation may have already been vacuumed or analyzed by - * someone since the last reload of stats. - */ - if (reuse_stats) - { - recheck_relation_needs_vacanalyze(relid, avopts, classForm, - effective_multixact_freeze_max_age, - &dovacuum, &doanalyze, &wraparound); - - /* Quick exit if a relation doesn't need to be vacuumed or analyzed */ - if (!doanalyze && !dovacuum) - { - heap_freetuple(classTup); - return NULL; - } - } - - /* Use fresh stats and recheck again */ - autovac_refresh_stats(); - recheck_relation_needs_vacanalyze(relid, avopts, classForm, effective_multixact_freeze_max_age, &dovacuum, &doanalyze, &wraparound); @@ -2962,21 +2881,6 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_dobalance = !(avopts && (avopts->vacuum_cost_limit > 0 || avopts->vacuum_cost_delay > 0)); - - /* - * When we decide to do vacuum or analyze, the existing stats cannot - * be reused in the next cycle because it's cleared at the end of - * vacuum or analyze (by AtEOXact_PgStat()). - */ - reuse_stats = false; - } - else - { - /* - * If neither vacuum nor analyze is necessary, the existing stats is - * not cleared and can be reused in the next cycle. - */ - reuse_stats = true; } heap_freetuple(classTup); @@ -3001,17 +2905,10 @@ recheck_relation_needs_vacanalyze(Oid relid, bool *wraparound) { PgStat_StatTabEntry *tabentry; - PgStat_StatDBEntry *shared = NULL; - PgStat_StatDBEntry *dbentry = NULL; - - if (classForm->relisshared) - shared = pgstat_fetch_stat_dbentry(InvalidOid); - else - dbentry = pgstat_fetch_stat_dbentry(MyDatabaseId); /* fetch the pgstat table entry */ - tabentry = get_pgstat_tabentry_relid(relid, classForm->relisshared, - shared, dbentry); + tabentry = pgstat_fetch_stat_tabentry_ext(classForm->relisshared, + relid); relation_needs_vacanalyze(relid, avopts, classForm, tabentry, effective_multixact_freeze_max_age, @@ -3169,11 +3066,11 @@ relation_needs_vacanalyze(Oid relid, } /* - * If we found the table in the stats hash, and autovacuum is currently - * enabled, make a threshold-based decision whether to vacuum and/or - * analyze. If autovacuum is currently disabled, we must be here for - * anti-wraparound vacuuming only, so don't vacuum (or analyze) anything - * that's not being forced. + * If we found stats for the table, and autovacuum is currently enabled, + * make a threshold-based decision whether to vacuum and/or analyze. If + * autovacuum is currently disabled, we must be here for anti-wraparound + * vacuuming only, so don't vacuum (or analyze) anything that's not being + * forced. */ if (PointerIsValid(tabentry) && AutoVacuumingActive()) { @@ -3472,35 +3369,3 @@ AutoVacuumShmemInit(void) else Assert(found); } - -/* - * autovac_refresh_stats - * Refresh pgstats data for an autovacuum process - * - * Cause the next pgstats read operation to obtain fresh data, but throttle - * such refreshing in the autovacuum launcher. This is mostly to avoid - * rereading the pgstats files too many times in quick succession when there - * are many databases. - * - * Note: we avoid throttling in the autovac worker, as it would be - * counterproductive in the recheck logic. - */ -static void -autovac_refresh_stats(void) -{ - if (IsAutoVacuumLauncherProcess()) - { - static TimestampTz last_read = 0; - TimestampTz current_time; - - current_time = GetCurrentTimestamp(); - - if (!TimestampDifferenceExceeds(last_read, current_time, - STATS_READ_DELAY)) - return; - - last_read = current_time; - } - - pgstat_clear_snapshot(); -} diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c index e733c70368..c937c39f50 100644 --- a/src/backend/postmaster/checkpointer.c +++ b/src/backend/postmaster/checkpointer.c @@ -212,6 +212,16 @@ CheckpointerMain(void) */ last_checkpoint_time = last_xlog_switch_time = (pg_time_t) time(NULL); + /* + * Write out stats after shutdown. This needs to be called by exactly one + * process during a normal shutdown, and since checkpointer is shut down + * very late... + * + * Walsenders are shut down after the checkpointer, but currently don't + * report stats. If that changes, we need a more complicated solution. + */ + before_shmem_exit(pgstat_before_server_shutdown, 0); + /* * Create a memory context that we will do all our work in. We do this so * that we can reset the context during error recovery and thereby avoid @@ -358,7 +368,7 @@ CheckpointerMain(void) if (((volatile CheckpointerShmemStruct *) CheckpointerShmem)->ckpt_flags) { do_checkpoint = true; - PendingCheckpointerStats.m_requested_checkpoints++; + PendingCheckpointerStats.requested_checkpoints++; } /* @@ -372,7 +382,7 @@ CheckpointerMain(void) if (elapsed_secs >= CheckPointTimeout) { if (!do_checkpoint) - PendingCheckpointerStats.m_timed_checkpoints++; + PendingCheckpointerStats.timed_checkpoints++; do_checkpoint = true; flags |= CHECKPOINT_CAUSE_TIME; } @@ -569,7 +579,7 @@ HandleCheckpointerInterrupts(void) * updates the statistics, increment the checkpoint request and flush * out pending statistic. */ - PendingCheckpointerStats.m_requested_checkpoints++; + PendingCheckpointerStats.requested_checkpoints++; ShutdownXLOG(0, 0); pgstat_report_checkpointer(); pgstat_report_wal(true); @@ -1262,9 +1272,9 @@ AbsorbSyncRequests(void) LWLockAcquire(CheckpointerCommLock, LW_EXCLUSIVE); /* Transfer stats counts into pending pgstats message */ - PendingCheckpointerStats.m_buf_written_backend + PendingCheckpointerStats.buf_written_backend += CheckpointerShmem->num_backend_writes; - PendingCheckpointerStats.m_buf_fsync_backend + PendingCheckpointerStats.buf_fsync_backend += CheckpointerShmem->num_backend_fsync; CheckpointerShmem->num_backend_writes = 0; diff --git a/src/backend/postmaster/interrupt.c b/src/backend/postmaster/interrupt.c index 3f412dad2e..1aed2e2e99 100644 --- a/src/backend/postmaster/interrupt.c +++ b/src/backend/postmaster/interrupt.c @@ -98,9 +98,8 @@ SignalHandlerForCrashExit(SIGNAL_ARGS) * shut down and exit. * * Typically, this handler would be used for SIGTERM, but some processes use - * other signals. In particular, the checkpointer exits on SIGUSR2, the - * stats collector on SIGQUIT, and the WAL writer exits on either SIGINT - * or SIGTERM. + * other signals. In particular, the checkpointer exits on SIGUSR2, and the + * WAL writer exits on either SIGINT or SIGTERM. * * ShutdownRequestPending should be checked at a convenient place within the * main loop, or else the main loop should call HandleMainLoopInterrupts. diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 20c4629e55..a9f3a7ef49 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -1,100 +1,161 @@ /* ---------- * pgstat.c + * Infrastructure for the cumulative statistics system. * - * All the statistics collector stuff hacked up in one big, ugly file. + * The cumulative statistics system accumulates statistics for different kinds + * of objects. Some kinds of statistics are collected for a fixed number of + * objects (most commonly 1), e.g., checkpointer statistics. Other kinds of + * statistics are collected for a varying number of objects + * (e.g. relations). See PgStat_KindInfo for a list of currently handled + * statistics. * - * TODO: - Separate collector, postmaster and backend stuff - * into different files. + * Statistics are loaded from the filesystem during startup (by the startup + * process), unless preceded by a crash, in which case all stats are + * discarded. They are written out by the checkpointer process just before + * shutting down, except when shutting down in immediate mode. * - * - Add some automatic call for pgstat vacuuming. + * Fixed-numbered stats are stored in plain (non-dynamic) shared memory. * - * - Add a pgstat config column to pg_database, so this - * entire thing can be enabled/disabled on a per db basis. + * Statistics for variable-numbered objects are stored in dynamic shared + * memory and can be found via a dshash hashtable. The statistics counters are + * not part of the dshash entry (PgStatShared_HashEntry) directly, but are + * separately allocated (PgStatShared_HashEntry->body). The separate + * allocation allows different kinds of statistics to be stored in the same + * hashtable without wasting space in PgStatShared_HashEntry. * - * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * Variable-numbered stats are addressed by PgStat_HashKey while running. It + * is not possible to have statistics for an object that cannot be addressed + * that way at runtime. A wider identifier can be used when serializing to + * disk (used for replication slot stats). * - * src/backend/postmaster/pgstat.c + * To avoid contention on the shared hashtable, each backend has a + * backend-local hashtable (pgStatEntryRefHash) in front of the shared + * hashtable, containing references (PgStat_EntryRef) to shared hashtable + * entries. The shared hashtable only needs to be accessed when no prior + * reference is found in the local hashtable. Besides pointing to the the + * shared hashtable entry (PgStatShared_HashEntry) PgStat_EntryRef also + * contains a pointer to the the shared statistics data, as a process-local + * address, to reduce access costs. + * + * The names for structs stored in shared memory are prefixed with + * PgStatShared instead of PgStat. Each stats entry in shared memory is + * protected by a dedicated lwlock. + * + * Most stats updates are first accumulated locally in each process as pending + * entries, then later flushed to shared memory (just after commit, or by + * idle-timeout). This practically eliminates contention on individual stats + * entries. For most kinds of variable-numbered pending stats data is stored + * in PgStat_EntryRef->pending. All entries with pending data are in the + * pgStatPending list. Pending statistics updates are flushed out by + * pgstat_report_stat(). + * + * The behavior of different kinds of statistics is determined by the kind's + * entry in pgstat_kind_infos, see PgStat_KindInfo for details. + * + * The consistency of read accesses to statistics can be configured using the + * stats_fetch_consistency GUC (see config.sgml and monitoring.sgml for the + * settings). When using PGSTAT_FETCH_CONSISTENCY_CACHE or + * PGSTAT_FETCH_CONSISTENCY_SNAPSHOT statistics are stored in + * pgStatLocal.snapshot. + * + * To keep things manageable, stats handling is split across several + * files. Infrastructure pieces are in: + * - pgstat.c - this file, to tie it all together + * - pgstat_shmem.c - nearly everything dealing with shared memory, including + * the maintenance of hashtable entries + * - pgstat_xact.c - transactional integration, including the transactional + * creation and dropping of stats entries + * + * Each statistics kind is handled in a dedicated file: + * - pgstat_archiver.c + * - pgstat_bgwriter.c + * - pgstat_checkpointer.c + * - pgstat_database.c + * - pgstat_function.c + * - pgstat_relation.c + * - pgstat_slru.c + * - pgstat_subscription.c + * - pgstat_wal.c + * + * Whenever possible infrastructure files should not contain code related to + * specific kinds of stats. + * + * + * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/postmaster/pgstat.c * ---------- */ #include "postgres.h" #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_SYS_SELECT_H -#include -#endif -#include "access/heapam.h" -#include "access/htup_details.h" -#include "access/tableam.h" #include "access/transam.h" #include "access/xact.h" -#include "catalog/catalog.h" -#include "catalog/pg_database.h" -#include "catalog/pg_proc.h" -#include "catalog/pg_subscription.h" -#include "common/ip.h" -#include "libpq/libpq.h" -#include "libpq/pqsignal.h" -#include "mb/pg_wchar.h" -#include "miscadmin.h" +#include "lib/dshash.h" #include "pgstat.h" -#include "postmaster/autovacuum.h" -#include "postmaster/fork_process.h" -#include "postmaster/interrupt.h" -#include "postmaster/postmaster.h" -#include "replication/slot.h" -#include "replication/walsender.h" -#include "storage/backendid.h" -#include "storage/dsm.h" +#include "port/atomics.h" #include "storage/fd.h" #include "storage/ipc.h" -#include "storage/latch.h" -#include "storage/lmgr.h" +#include "storage/lwlock.h" #include "storage/pg_shmem.h" -#include "storage/proc.h" -#include "storage/procsignal.h" -#include "utils/builtins.h" +#include "storage/shmem.h" #include "utils/guc.h" #include "utils/memutils.h" #include "utils/pgstat_internal.h" -#include "utils/ps_status.h" -#include "utils/rel.h" -#include "utils/snapmgr.h" #include "utils/timestamp.h" /* ---------- * Timer definitions. + * + * In milliseconds. + * ---------- + */ + +/* minimum interval non-forced stats flushes.*/ +#define PGSTAT_MIN_INTERVAL 1000 +/* how long until to block flushing pending stats updates */ +#define PGSTAT_MAX_INTERVAL 60000 +/* when to call pgstat_report_stat() again, even when idle */ +#define PGSTAT_IDLE_INTERVAL 10000 + +/* ---------- + * Initial size hints for the hash tables used in statistics. * ---------- */ -#define PGSTAT_RETRY_DELAY 10 /* How long to wait between checks for a - * new file; in milliseconds. */ +#define PGSTAT_SNAPSHOT_HASH_SIZE 512 -#define PGSTAT_MAX_WAIT_TIME 10000 /* Maximum time to wait for a stats - * file update; in milliseconds. */ -#define PGSTAT_INQ_INTERVAL 640 /* How often to ping the collector for a - * new file; in milliseconds. */ +/* hash table for statistics snapshots entry */ +typedef struct PgStat_SnapshotEntry +{ + PgStat_HashKey key; + char status; /* for simplehash use */ + void *data; /* the stats data itself */ +} PgStat_SnapshotEntry; -#define PGSTAT_RESTART_INTERVAL 60 /* How often to attempt to restart a - * failed statistics collector; in - * seconds. */ -#define PGSTAT_POLL_LOOP_COUNT (PGSTAT_MAX_WAIT_TIME / PGSTAT_RETRY_DELAY) -#define PGSTAT_INQ_LOOP_COUNT (PGSTAT_INQ_INTERVAL / PGSTAT_RETRY_DELAY) +/* ---------- + * Backend-local Hash Table Definitions + * ---------- + */ -/* Minimum receive buffer size for the collector's socket. */ -#define PGSTAT_MIN_RCVBUF (100 * 1024) +/* for stats snapshot entries */ +#define SH_PREFIX pgstat_snapshot +#define SH_ELEMENT_TYPE PgStat_SnapshotEntry +#define SH_KEY_TYPE PgStat_HashKey +#define SH_KEY key +#define SH_HASH_KEY(tb, key) \ + pgstat_hash_hash_key(&key, sizeof(PgStat_HashKey), NULL) +#define SH_EQUAL(tb, a, b) \ + pgstat_cmp_hash_key(&a, &b, sizeof(PgStat_HashKey), NULL) == 0 +#define SH_SCOPE static inline +#define SH_DEFINE +#define SH_DECLARE +#include "lib/simplehash.h" /* ---------- @@ -102,63 +163,18 @@ * ---------- */ -#ifdef EXEC_BACKEND -static pid_t pgstat_forkexec(void); -#endif +static void pgstat_write_statsfile(void); +static void pgstat_read_statsfile(void); + +static void pgstat_reset_after_failure(TimestampTz ts); + +static bool pgstat_flush_pending_entries(bool nowait); -NON_EXEC_STATIC void PgstatCollectorMain(int argc, char *argv[]) pg_attribute_noreturn(); - -static PgStat_StatDBEntry *pgstat_get_db_entry(Oid databaseid, bool create); -static PgStat_StatTabEntry *pgstat_get_tab_entry(PgStat_StatDBEntry *dbentry, - Oid tableoid, bool create); -static PgStat_StatSubEntry *pgstat_get_subscription_entry(Oid subid, bool create); -static void pgstat_reset_subscription(PgStat_StatSubEntry *subentry, TimestampTz ts); -static void pgstat_write_statsfiles(bool permanent, bool allDbs); -static void pgstat_write_db_statsfile(PgStat_StatDBEntry *dbentry, bool permanent); -static HTAB *pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep); -static void pgstat_read_db_statsfile(Oid databaseid, HTAB *tabhash, HTAB *funchash, - bool permanent); -static void backend_read_statsfile(void); - -static bool pgstat_write_statsfile_needed(void); -static bool pgstat_db_requested(Oid databaseid); - -static PgStat_StatReplSlotEntry *pgstat_get_replslot_entry(NameData name, bool create_it); -static void pgstat_reset_replslot_entry(PgStat_StatReplSlotEntry *slotstats, TimestampTz ts); - -static HTAB *pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid); - -static void pgstat_setup_memcxt(void); - -static void pgstat_recv_inquiry(PgStat_MsgInquiry *msg, int len); -static void pgstat_recv_tabstat(PgStat_MsgTabstat *msg, int len); -static void pgstat_recv_tabpurge(PgStat_MsgTabpurge *msg, int len); -static void pgstat_recv_dropdb(PgStat_MsgDropdb *msg, int len); -static void pgstat_recv_resetcounter(PgStat_MsgResetcounter *msg, int len); -static void pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len); -static void pgstat_recv_resetsinglecounter(PgStat_MsgResetsinglecounter *msg, int len); -static void pgstat_recv_resetslrucounter(PgStat_MsgResetslrucounter *msg, int len); -static void pgstat_recv_resetreplslotcounter(PgStat_MsgResetreplslotcounter *msg, int len); -static void pgstat_recv_resetsubcounter(PgStat_MsgResetsubcounter *msg, int len); -static void pgstat_recv_autovac(PgStat_MsgAutovacStart *msg, int len); -static void pgstat_recv_vacuum(PgStat_MsgVacuum *msg, int len); -static void pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len); -static void pgstat_recv_archiver(PgStat_MsgArchiver *msg, int len); -static void pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len); -static void pgstat_recv_checkpointer(PgStat_MsgCheckpointer *msg, int len); -static void pgstat_recv_wal(PgStat_MsgWal *msg, int len); -static void pgstat_recv_slru(PgStat_MsgSLRU *msg, int len); -static void pgstat_recv_funcstat(PgStat_MsgFuncstat *msg, int len); -static void pgstat_recv_funcpurge(PgStat_MsgFuncpurge *msg, int len); -static void pgstat_recv_recoveryconflict(PgStat_MsgRecoveryConflict *msg, int len); -static void pgstat_recv_deadlock(PgStat_MsgDeadlock *msg, int len); -static void pgstat_recv_checksum_failure(PgStat_MsgChecksumFailure *msg, int len); -static void pgstat_recv_connect(PgStat_MsgConnect *msg, int len); -static void pgstat_recv_disconnect(PgStat_MsgDisconnect *msg, int len); -static void pgstat_recv_replslot(PgStat_MsgReplSlot *msg, int len); -static void pgstat_recv_tempfile(PgStat_MsgTempFile *msg, int len); -static void pgstat_recv_subscription_drop(PgStat_MsgSubscriptionDrop *msg, int len); -static void pgstat_recv_subscription_error(PgStat_MsgSubscriptionError *msg, int len); +static void pgstat_prep_snapshot(void); +static void pgstat_build_snapshot(void); +static void pgstat_build_snapshot_fixed(PgStat_Kind kind); + +static inline bool pgstat_is_kind_valid(int ikind); /* ---------- @@ -167,6 +183,7 @@ static void pgstat_recv_subscription_error(PgStat_MsgSubscriptionError *msg, int */ bool pgstat_track_counts = false; +int pgstat_fetch_consistency = PGSTAT_FETCH_CONSISTENCY_NONE; /* ---------- @@ -184,44 +201,33 @@ char *pgstat_stat_tmpname = NULL; * ---------- */ -pgsocket pgStatSock = PGINVALID_SOCKET; +PgStat_LocalState pgStatLocal; /* ---------- * Local data + * + * NB: There should be only variables related to stats infrastructure here, + * not for specific kinds of stats. * ---------- */ -static struct sockaddr_storage pgStatAddr; - -static time_t last_pgstat_start_time; - -static bool pgStatRunningInCollector = false; - /* - * Info about current "snapshot" of stats file + * Memory contexts containing the pgStatEntryRefHash table, the + * pgStatSharedRef entries, and pending data respectively. Mostly to make it + * easier to track / attribute memory usage. */ -static MemoryContext pgStatLocalContext = NULL; -static HTAB *pgStatDBHash = NULL; -/* - * Cluster wide statistics, kept in the stats collector. - * Contains statistics that are not collected per database - * or per table. - */ -static PgStat_ArchiverStats archiverStats; -static PgStat_GlobalStats globalStats; -static PgStat_WalStats walStats; -static PgStat_SLRUStats slruStats[SLRU_NUM_ELEMENTS]; -static HTAB *replSlotStatHash = NULL; -static HTAB *subscriptionStatHash = NULL; +static MemoryContext pgStatPendingContext = NULL; /* - * List of OIDs of databases we need to write out. If an entry is InvalidOid, - * it means to write only the shared-catalog stats ("DB 0"); otherwise, we - * will write both that DB's data and the shared stats. + * Backend local list of PgStat_EntryRef with unflushed pending stats. + * + * Newly pending entries should only ever be added to the end of the list, + * otherwise pgstat_flush_pending_entries() might not see them immediately. */ -static List *pending_write_requests = NIL; +static dlist_head pgStatPending = DLIST_STATIC_INIT(pgStatPending); + /* * For assertions that check pgstat is not used before initialization / after @@ -233,455 +239,234 @@ static bool pgstat_is_shutdown = false; #endif -/* ------------------------------------------------------------ - * Public functions called from postmaster follow - * ------------------------------------------------------------ - */ - /* - * Called from postmaster at startup. Create the resources required - * by the statistics collector process. If unable to do so, do not - * fail --- better to let the postmaster start with stats collection - * disabled. + * The different kinds of statistics. + * + * If reasonably possible, handling specific to one kind of stats should go + * through this abstraction, rather than making more of pgstat.c aware. + * + * See comments for struct PgStat_KindInfo for details about the individual + * fields. + * + * XXX: It'd be nicer to define this outside of this file. But there doesn't + * seem to be a great way of doing that, given the split across multiple + * files. */ -void -pgstat_init(void) -{ - socklen_t alen; - struct addrinfo *addrs = NULL, - *addr, - hints; - int ret; - fd_set rset; - struct timeval tv; - char test_byte; - int sel_res; - int tries = 0; +static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = { -#define TESTBYTEVAL ((char) 199) + /* stats kinds for variable-numbered objects */ - /* - * This static assertion verifies that we didn't mess up the calculations - * involved in selecting maximum payload sizes for our UDP messages. - * Because the only consequence of overrunning PGSTAT_MAX_MSG_SIZE would - * be silent performance loss from fragmentation, it seems worth having a - * compile-time cross-check that we didn't. - */ - StaticAssertStmt(sizeof(PgStat_Msg) <= PGSTAT_MAX_MSG_SIZE, - "maximum stats message size exceeds PGSTAT_MAX_MSG_SIZE"); + [PGSTAT_KIND_DATABASE] = { + .name = "database", - /* - * Create the UDP socket for sending and receiving statistic messages - */ - hints.ai_flags = AI_PASSIVE; - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_protocol = 0; - hints.ai_addrlen = 0; - hints.ai_addr = NULL; - hints.ai_canonname = NULL; - hints.ai_next = NULL; - ret = pg_getaddrinfo_all("localhost", NULL, &hints, &addrs); - if (ret || !addrs) - { - ereport(LOG, - (errmsg("could not resolve \"localhost\": %s", - gai_strerror(ret)))); - goto startup_failed; - } + .fixed_amount = false, + /* so pg_stat_database entries can be seen in all databases */ + .accessed_across_databases = true, - /* - * On some platforms, pg_getaddrinfo_all() may return multiple addresses - * only one of which will actually work (eg, both IPv6 and IPv4 addresses - * when kernel will reject IPv6). Worse, the failure may occur at the - * bind() or perhaps even connect() stage. So we must loop through the - * results till we find a working combination. We will generate LOG - * messages, but no error, for bogus combinations. - */ - for (addr = addrs; addr; addr = addr->ai_next) - { -#ifdef HAVE_UNIX_SOCKETS - /* Ignore AF_UNIX sockets, if any are returned. */ - if (addr->ai_family == AF_UNIX) - continue; -#endif + .shared_size = sizeof(PgStatShared_Database), + .shared_data_off = offsetof(PgStatShared_Database, stats), + .shared_data_len = sizeof(((PgStatShared_Database *) 0)->stats), + .pending_size = sizeof(PgStat_StatDBEntry), - if (++tries > 1) - ereport(LOG, - (errmsg("trying another address for the statistics collector"))); + .flush_pending_cb = pgstat_database_flush_cb, + .reset_timestamp_cb = pgstat_database_reset_timestamp_cb, + }, - /* - * Create the socket. - */ - if ((pgStatSock = socket(addr->ai_family, SOCK_DGRAM, 0)) == PGINVALID_SOCKET) - { - ereport(LOG, - (errcode_for_socket_access(), - errmsg("could not create socket for statistics collector: %m"))); - continue; - } + [PGSTAT_KIND_RELATION] = { + .name = "relation", - /* - * Bind it to a kernel assigned port on localhost and get the assigned - * port via getsockname(). - */ - if (bind(pgStatSock, addr->ai_addr, addr->ai_addrlen) < 0) - { - ereport(LOG, - (errcode_for_socket_access(), - errmsg("could not bind socket for statistics collector: %m"))); - closesocket(pgStatSock); - pgStatSock = PGINVALID_SOCKET; - continue; - } + .fixed_amount = false, - alen = sizeof(pgStatAddr); - if (getsockname(pgStatSock, (struct sockaddr *) &pgStatAddr, &alen) < 0) - { - ereport(LOG, - (errcode_for_socket_access(), - errmsg("could not get address of socket for statistics collector: %m"))); - closesocket(pgStatSock); - pgStatSock = PGINVALID_SOCKET; - continue; - } + .shared_size = sizeof(PgStatShared_Relation), + .shared_data_off = offsetof(PgStatShared_Relation, stats), + .shared_data_len = sizeof(((PgStatShared_Relation *) 0)->stats), + .pending_size = sizeof(PgStat_TableStatus), - /* - * Connect the socket to its own address. This saves a few cycles by - * not having to respecify the target address on every send. This also - * provides a kernel-level check that only packets from this same - * address will be received. - */ - if (connect(pgStatSock, (struct sockaddr *) &pgStatAddr, alen) < 0) - { - ereport(LOG, - (errcode_for_socket_access(), - errmsg("could not connect socket for statistics collector: %m"))); - closesocket(pgStatSock); - pgStatSock = PGINVALID_SOCKET; - continue; - } + .flush_pending_cb = pgstat_relation_flush_cb, + .delete_pending_cb = pgstat_relation_delete_pending_cb, + }, - /* - * Try to send and receive a one-byte test message on the socket. This - * is to catch situations where the socket can be created but will not - * actually pass data (for instance, because kernel packet filtering - * rules prevent it). - */ - test_byte = TESTBYTEVAL; + [PGSTAT_KIND_FUNCTION] = { + .name = "function", -retry1: - if (send(pgStatSock, &test_byte, 1, 0) != 1) - { - if (errno == EINTR) - goto retry1; /* if interrupted, just retry */ - ereport(LOG, - (errcode_for_socket_access(), - errmsg("could not send test message on socket for statistics collector: %m"))); - closesocket(pgStatSock); - pgStatSock = PGINVALID_SOCKET; - continue; - } + .fixed_amount = false, - /* - * There could possibly be a little delay before the message can be - * received. We arbitrarily allow up to half a second before deciding - * it's broken. - */ - for (;;) /* need a loop to handle EINTR */ - { - FD_ZERO(&rset); - FD_SET(pgStatSock, &rset); - - tv.tv_sec = 0; - tv.tv_usec = 500000; - sel_res = select(pgStatSock + 1, &rset, NULL, NULL, &tv); - if (sel_res >= 0 || errno != EINTR) - break; - } - if (sel_res < 0) - { - ereport(LOG, - (errcode_for_socket_access(), - errmsg("select() failed in statistics collector: %m"))); - closesocket(pgStatSock); - pgStatSock = PGINVALID_SOCKET; - continue; - } - if (sel_res == 0 || !FD_ISSET(pgStatSock, &rset)) - { - /* - * This is the case we actually think is likely, so take pains to - * give a specific message for it. - * - * errno will not be set meaningfully here, so don't use it. - */ - ereport(LOG, - (errcode(ERRCODE_CONNECTION_FAILURE), - errmsg("test message did not get through on socket for statistics collector"))); - closesocket(pgStatSock); - pgStatSock = PGINVALID_SOCKET; - continue; - } + .shared_size = sizeof(PgStatShared_Function), + .shared_data_off = offsetof(PgStatShared_Function, stats), + .shared_data_len = sizeof(((PgStatShared_Function *) 0)->stats), + .pending_size = sizeof(PgStat_BackendFunctionEntry), - test_byte++; /* just make sure variable is changed */ + .flush_pending_cb = pgstat_function_flush_cb, + }, -retry2: - if (recv(pgStatSock, &test_byte, 1, 0) != 1) - { - if (errno == EINTR) - goto retry2; /* if interrupted, just retry */ - ereport(LOG, - (errcode_for_socket_access(), - errmsg("could not receive test message on socket for statistics collector: %m"))); - closesocket(pgStatSock); - pgStatSock = PGINVALID_SOCKET; - continue; - } + [PGSTAT_KIND_REPLSLOT] = { + .name = "replslot", - if (test_byte != TESTBYTEVAL) /* strictly paranoia ... */ - { - ereport(LOG, - (errcode(ERRCODE_INTERNAL_ERROR), - errmsg("incorrect test message transmission on socket for statistics collector"))); - closesocket(pgStatSock); - pgStatSock = PGINVALID_SOCKET; - continue; - } + .fixed_amount = false, - /* If we get here, we have a working socket */ - break; - } + .accessed_across_databases = true, + .named_on_disk = true, - /* Did we find a working address? */ - if (!addr || pgStatSock == PGINVALID_SOCKET) - goto startup_failed; + .shared_size = sizeof(PgStatShared_ReplSlot), + .shared_data_off = offsetof(PgStatShared_ReplSlot, stats), + .shared_data_len = sizeof(((PgStatShared_ReplSlot *) 0)->stats), - /* - * Set the socket to non-blocking IO. This ensures that if the collector - * falls behind, statistics messages will be discarded; backends won't - * block waiting to send messages to the collector. - */ - if (!pg_set_noblock(pgStatSock)) - { - ereport(LOG, - (errcode_for_socket_access(), - errmsg("could not set statistics collector socket to nonblocking mode: %m"))); - goto startup_failed; - } + .reset_timestamp_cb = pgstat_replslot_reset_timestamp_cb, + .to_serialized_name = pgstat_replslot_to_serialized_name_cb, + .from_serialized_name = pgstat_replslot_from_serialized_name_cb, + }, - /* - * Try to ensure that the socket's receive buffer is at least - * PGSTAT_MIN_RCVBUF bytes, so that it won't easily overflow and lose - * data. Use of UDP protocol means that we are willing to lose data under - * heavy load, but we don't want it to happen just because of ridiculously - * small default buffer sizes (such as 8KB on older Windows versions). - */ - { - int old_rcvbuf; - int new_rcvbuf; - socklen_t rcvbufsize = sizeof(old_rcvbuf); + [PGSTAT_KIND_SUBSCRIPTION] = { + .name = "subscription", - if (getsockopt(pgStatSock, SOL_SOCKET, SO_RCVBUF, - (char *) &old_rcvbuf, &rcvbufsize) < 0) - { - ereport(LOG, - (errmsg("%s(%s) failed: %m", "getsockopt", "SO_RCVBUF"))); - /* if we can't get existing size, always try to set it */ - old_rcvbuf = 0; - } + .fixed_amount = false, + /* so pg_stat_subscription_stats entries can be seen in all databases */ + .accessed_across_databases = true, - new_rcvbuf = PGSTAT_MIN_RCVBUF; - if (old_rcvbuf < new_rcvbuf) - { - if (setsockopt(pgStatSock, SOL_SOCKET, SO_RCVBUF, - (char *) &new_rcvbuf, sizeof(new_rcvbuf)) < 0) - ereport(LOG, - (errmsg("%s(%s) failed: %m", "setsockopt", "SO_RCVBUF"))); - } - } + .shared_size = sizeof(PgStatShared_Subscription), + .shared_data_off = offsetof(PgStatShared_Subscription, stats), + .shared_data_len = sizeof(((PgStatShared_Subscription *) 0)->stats), + .pending_size = sizeof(PgStat_BackendSubEntry), - pg_freeaddrinfo_all(hints.ai_family, addrs); + .flush_pending_cb = pgstat_subscription_flush_cb, + .reset_timestamp_cb = pgstat_subscription_reset_timestamp_cb, + }, - /* Now that we have a long-lived socket, tell fd.c about it. */ - ReserveExternalFD(); - return; + /* stats for fixed-numbered (mostly 1) objects */ -startup_failed: - ereport(LOG, - (errmsg("disabling statistics collector for lack of working socket"))); + [PGSTAT_KIND_ARCHIVER] = { + .name = "archiver", - if (addrs) - pg_freeaddrinfo_all(hints.ai_family, addrs); + .fixed_amount = true, - if (pgStatSock != PGINVALID_SOCKET) - closesocket(pgStatSock); - pgStatSock = PGINVALID_SOCKET; + .reset_all_cb = pgstat_archiver_reset_all_cb, + .snapshot_cb = pgstat_archiver_snapshot_cb, + }, - /* - * Adjust GUC variables to suppress useless activity, and for debugging - * purposes (seeing track_counts off is a clue that we failed here). We - * use PGC_S_OVERRIDE because there is no point in trying to turn it back - * on from postgresql.conf without a restart. - */ - SetConfigOption("track_counts", "off", PGC_INTERNAL, PGC_S_OVERRIDE); -} + [PGSTAT_KIND_BGWRITER] = { + .name = "bgwriter", -/* - * subroutine for pgstat_reset_all - */ -static void -pgstat_reset_remove_files(const char *directory) -{ - DIR *dir; - struct dirent *entry; - char fname[MAXPGPATH * 2]; + .fixed_amount = true, - dir = AllocateDir(directory); - while ((entry = ReadDir(dir, directory)) != NULL) - { - int nchars; - Oid tmp_oid; + .reset_all_cb = pgstat_bgwriter_reset_all_cb, + .snapshot_cb = pgstat_bgwriter_snapshot_cb, + }, - /* - * Skip directory entries that don't match the file names we write. - * See get_dbstat_filename for the database-specific pattern. - */ - if (strncmp(entry->d_name, "global.", 7) == 0) - nchars = 7; - else - { - nchars = 0; - (void) sscanf(entry->d_name, "db_%u.%n", - &tmp_oid, &nchars); - if (nchars <= 0) - continue; - /* %u allows leading whitespace, so reject that */ - if (strchr("0123456789", entry->d_name[3]) == NULL) - continue; - } + [PGSTAT_KIND_CHECKPOINTER] = { + .name = "checkpointer", - if (strcmp(entry->d_name + nchars, "tmp") != 0 && - strcmp(entry->d_name + nchars, "stat") != 0) - continue; + .fixed_amount = true, + + .reset_all_cb = pgstat_checkpointer_reset_all_cb, + .snapshot_cb = pgstat_checkpointer_snapshot_cb, + }, + + [PGSTAT_KIND_SLRU] = { + .name = "slru", + + .fixed_amount = true, + + .reset_all_cb = pgstat_slru_reset_all_cb, + .snapshot_cb = pgstat_slru_snapshot_cb, + }, + + [PGSTAT_KIND_WAL] = { + .name = "wal", + + .fixed_amount = true, + + .reset_all_cb = pgstat_wal_reset_all_cb, + .snapshot_cb = pgstat_wal_snapshot_cb, + }, +}; - snprintf(fname, sizeof(fname), "%s/%s", directory, - entry->d_name); - unlink(fname); - } - FreeDir(dir); -} + +/* ------------------------------------------------------------ + * Functions managing the state of the stats system for all backends. + * ------------------------------------------------------------ + */ /* - * Remove the stats files. This is currently used only if WAL - * recovery is needed after a crash. + * Read on-disk stats into memory at server start. + * + * Should only be called by the startup process or in single user mode. */ void -pgstat_reset_all(void) +pgstat_restore_stats(void) { - pgstat_reset_remove_files(pgstat_stat_directory); - pgstat_reset_remove_files(PGSTAT_STAT_PERMANENT_DIRECTORY); + pgstat_read_statsfile(); } -#ifdef EXEC_BACKEND - /* - * Format up the arglist for, then fork and exec, statistics collector process + * Remove the stats file. This is currently used only if WAL recovery is + * needed after a crash. + * + * Should only be called by the startup process or in single user mode. */ -static pid_t -pgstat_forkexec(void) +void +pgstat_discard_stats(void) { - char *av[10]; - int ac = 0; - - av[ac++] = "postgres"; - av[ac++] = "--forkcol"; - av[ac++] = NULL; /* filled in by postmaster_forkexec */ + int ret; - av[ac] = NULL; - Assert(ac < lengthof(av)); + /* NB: this needs to be done even in single user mode */ - return postmaster_forkexec(ac, av); + ret = unlink(PGSTAT_STAT_PERMANENT_FILENAME); + if (ret != 0) + { + if (errno == ENOENT) + elog(DEBUG2, + "didn't need to unlink permanent stats file \"%s\" - didn't exist", + PGSTAT_STAT_PERMANENT_FILENAME); + else + ereport(LOG, + (errcode_for_file_access(), + errmsg("could not unlink permanent statistics file \"%s\": %m", + PGSTAT_STAT_PERMANENT_FILENAME))); + } + else + { + ereport(DEBUG2, + (errcode_for_file_access(), + errmsg("unlinked permanent statistics file \"%s\"", + PGSTAT_STAT_PERMANENT_FILENAME))); + } } -#endif /* EXEC_BACKEND */ - /* - * Called from postmaster at startup or after an existing collector - * died. Attempt to fire up a fresh statistics collector. + * pgstat_before_server_shutdown() needs to be called by exactly one process + * during regular server shutdowns. Otherwise all stats will be lost. * - * Returns PID of child process, or 0 if fail. - * - * Note: if fail, we will be called again from the postmaster main loop. + * We currently only write out stats for proc_exit(0). We might want to change + * that at some point... But right now pgstat_discard_stats() would be called + * during the start after a disorderly shutdown, anyway. */ -int -pgstat_start(void) +void +pgstat_before_server_shutdown(int code, Datum arg) { - time_t curtime; - pid_t pgStatPid; + Assert(pgStatLocal.shmem != NULL); + Assert(!pgStatLocal.shmem->is_shutdown); /* - * Check that the socket is there, else pgstat_init failed and we can do - * nothing useful. + * Stats should only be reported after pgstat_initialize() and before + * pgstat_shutdown(). This is a convenient point to catch most violations + * of this rule. */ - if (pgStatSock == PGINVALID_SOCKET) - return 0; + Assert(pgstat_is_initialized && !pgstat_is_shutdown); - /* - * Do nothing if too soon since last collector start. This is a safety - * valve to protect against continuous respawn attempts if the collector - * is dying immediately at launch. Note that since we will be re-called - * from the postmaster main loop, we will get another chance later. - */ - curtime = time(NULL); - if ((unsigned int) (curtime - last_pgstat_start_time) < - (unsigned int) PGSTAT_RESTART_INTERVAL) - return 0; - last_pgstat_start_time = curtime; + /* flush out our own pending changes before writing out */ + pgstat_report_stat(true); /* - * Okay, fork off the collector. + * Only write out file during normal shutdown. Don't even signal that + * we've shutdown during irregular shutdowns, because the shutdown + * sequence isn't coordinated to ensure this backend shuts down last. */ -#ifdef EXEC_BACKEND - switch ((pgStatPid = pgstat_forkexec())) -#else - switch ((pgStatPid = fork_process())) -#endif + if (code == 0) { - case -1: - ereport(LOG, - (errmsg("could not fork statistics collector: %m"))); - return 0; - -#ifndef EXEC_BACKEND - case 0: - /* in postmaster child ... */ - InitPostmasterChild(); - - /* Close the postmaster's sockets */ - ClosePostmasterPorts(false); - - /* Drop our connection to postmaster's shared memory, as well */ - dsm_detach_all(); - PGSharedMemoryDetach(); - - PgstatCollectorMain(0, NULL); - break; -#endif - - default: - return (int) pgStatPid; + pgStatLocal.shmem->is_shutdown = true; + pgstat_write_statsfile(); } - - /* shouldn't get here */ - return 0; -} - -void -allow_immediate_pgstat_restart(void) -{ - last_pgstat_start_time = 0; } @@ -701,6 +486,7 @@ static void pgstat_shutdown_hook(int code, Datum arg) { Assert(!pgstat_is_shutdown); + Assert(IsUnderPostmaster || !IsPostmasterEnvironment); /* * If we got as far as discovering our own database ID, we can flush out @@ -709,7 +495,15 @@ pgstat_shutdown_hook(int code, Datum arg) * failed backend starts might never get counted.) */ if (OidIsValid(MyDatabaseId)) - pgstat_report_stat(true); + pgstat_report_disconnect(MyDatabaseId); + + pgstat_report_stat(true); + + /* there shouldn't be any pending changes left */ + Assert(dlist_is_empty(&pgStatPending)); + dlist_init(&pgStatPending); + + pgstat_detach_shmem(); #ifdef USE_ASSERT_CHECKING pgstat_is_shutdown = true; @@ -727,6 +521,8 @@ pgstat_initialize(void) { Assert(!pgstat_is_initialized); + pgstat_attach_shmem(); + pgstat_init_wal(); /* Set up a process-exit hook to clean up */ @@ -745,717 +541,613 @@ pgstat_initialize(void) /* * Must be called by processes that performs DML: tcop/postgres.c, logical - * receiver processes, SPI worker, etc. to send the so far collected - * per-table and function usage statistics to the collector. Note that this - * is called only when not within a transaction, so it is fair to use - * transaction stop time as an approximation of current time. + * receiver processes, SPI worker, etc. to flush pending statistics updates to + * shared memory. + * + * Unless called with 'force', pending stats updates are flushed happen once + * per PGSTAT_MIN_INTERVAL (1000ms). When not forced, stats flushes do not + * block on lock acquisition, except if stats updates have been pending for + * longer than PGSTAT_MAX_INTERVAL (60000ms). + * + * Whenever pending stats updates remain at the end of pgstat_report_stat() a + * suggested idle timeout is returned. Currently this is always + * PGSTAT_IDLE_INTERVAL (10000ms). Callers can use the returned time to set up + * a timeout after which to call pgstat_report_stat(true), but are not + * required to to do so. * - * "disconnect" is "true" only for the last call before the backend - * exits. This makes sure that no data is lost and that interrupted - * sessions are reported correctly. + * Note that this is called only when not within a transaction, so it is fair + * to use transaction stop time as an approximation of current time. */ -void -pgstat_report_stat(bool disconnect) +long +pgstat_report_stat(bool force) { - static TimestampTz last_report = 0; - + static TimestampTz pending_since = 0; + static TimestampTz last_flush = 0; + bool partial_flush; TimestampTz now; + bool nowait; pgstat_assert_is_up(); + Assert(!IsTransactionBlock()); - /* - * Don't expend a clock check if nothing to do. - */ - if (!have_relation_stats && - pgStatXactCommit == 0 && pgStatXactRollback == 0 && - !pgstat_have_pending_wal() && - !have_function_stats && !disconnect) - return; + /* Don't expend a clock check if nothing to do */ + if (dlist_is_empty(&pgStatPending) && + !have_slrustats && + !pgstat_have_pending_wal()) + { + Assert(pending_since == 0); + return 0; + } /* - * Don't send a message unless it's been at least PGSTAT_STAT_INTERVAL - * msec since we last sent one, or the backend is about to exit. + * There should never be stats to report once stats are shut down. Can't + * assert that before the checks above, as there is an unconditional + * pgstat_report_stat() call in pgstat_shutdown_hook() - which at least + * the process that ran pgstat_before_server_shutdown() will still call. */ + Assert(!pgStatLocal.shmem->is_shutdown); + now = GetCurrentTransactionStopTimestamp(); - if (!disconnect && - !TimestampDifferenceExceeds(last_report, now, PGSTAT_STAT_INTERVAL)) - return; - last_report = now; + if (!force) + { + if (pending_since > 0 && + TimestampDifferenceExceeds(pending_since, now, PGSTAT_MAX_INTERVAL)) + { + /* don't keep pending updates longer than PGSTAT_MAX_INTERVAL */ + force = true; + } + else if (last_flush > 0 && + !TimestampDifferenceExceeds(last_flush, now, PGSTAT_MIN_INTERVAL)) + { + /* don't flush too frequently */ + if (pending_since == 0) + pending_since = now; - if (disconnect) - pgstat_report_disconnect(MyDatabaseId); + return PGSTAT_IDLE_INTERVAL; + } + } - /* First, send relation statistics */ - pgstat_send_tabstats(now, disconnect); + pgstat_update_dbstats(now); - /* Now, send function statistics */ - pgstat_send_funcstats(); + /* don't wait for lock acquisition when !force */ + nowait = !force; - /* Send WAL statistics */ - pgstat_report_wal(true); + partial_flush = false; - /* Finally send SLRU statistics */ - pgstat_send_slru(); -} + /* flush database / relation / function / ... stats */ + partial_flush |= pgstat_flush_pending_entries(nowait); -/* - * Will tell the collector about objects he can get rid of. - */ -void -pgstat_vacuum_stat(void) -{ - HTAB *htab; - PgStat_MsgTabpurge msg; - PgStat_MsgFuncpurge f_msg; - HASH_SEQ_STATUS hstat; - PgStat_StatDBEntry *dbentry; - PgStat_StatTabEntry *tabentry; - PgStat_StatFuncEntry *funcentry; - int len; - - if (pgStatSock == PGINVALID_SOCKET) - return; + /* flush wal stats */ + partial_flush |= pgstat_flush_wal(nowait); - /* - * If not done for this transaction, read the statistics collector stats - * file into some hash tables. - */ - backend_read_statsfile(); + /* flush SLRU stats */ + partial_flush |= pgstat_slru_flush(nowait); - /* - * Read pg_database and make a list of OIDs of all existing databases - */ - htab = pgstat_collect_oids(DatabaseRelationId, Anum_pg_database_oid); + last_flush = now; /* - * Search the database hash table for dead databases and tell the - * collector to drop them. + * If some of the pending stats could not be flushed due to lock + * contention, let the caller know when to retry. */ - hash_seq_init(&hstat, pgStatDBHash); - while ((dbentry = (PgStat_StatDBEntry *) hash_seq_search(&hstat)) != NULL) + if (partial_flush) { - Oid dbid = dbentry->databaseid; - - CHECK_FOR_INTERRUPTS(); - - /* the DB entry for shared tables (with InvalidOid) is never dropped */ - if (OidIsValid(dbid) && - hash_search(htab, (void *) &dbid, HASH_FIND, NULL) == NULL) - pgstat_drop_database(dbid); - } - - /* Clean up */ - hash_destroy(htab); + /* force should have prevented us from getting here */ + Assert(!force); - /* - * Search for all the dead replication slots in stats hashtable and tell - * the stats collector to drop them. - */ - if (replSlotStatHash) - { - PgStat_StatReplSlotEntry *slotentry; + /* remember since when stats have been pending */ + if (pending_since == 0) + pending_since = now; - hash_seq_init(&hstat, replSlotStatHash); - while ((slotentry = (PgStat_StatReplSlotEntry *) hash_seq_search(&hstat)) != NULL) - { - CHECK_FOR_INTERRUPTS(); - - if (SearchNamedReplicationSlot(NameStr(slotentry->slotname), true) == NULL) - { - PgStat_MsgReplSlot msg; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); - namestrcpy(&msg.m_slotname, NameStr(slotentry->slotname)); - msg.m_create = false; - msg.m_drop = true; - pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); - } - } + return PGSTAT_IDLE_INTERVAL; } - /* - * Repeat the above steps for subscriptions, if subscription stats are - * being collected. - */ - if (subscriptionStatHash) - { - PgStat_StatSubEntry *subentry; + pending_since = 0; - /* - * Read pg_subscription and make a list of OIDs of all existing - * subscriptions. - */ - htab = pgstat_collect_oids(SubscriptionRelationId, Anum_pg_subscription_oid); + return 0; +} - hash_seq_init(&hstat, subscriptionStatHash); - while ((subentry = (PgStat_StatSubEntry *) hash_seq_search(&hstat)) != NULL) - { - CHECK_FOR_INTERRUPTS(); +/* + * Only for use by pgstat_reset_counters() + */ +static bool +match_db_entries(PgStatShared_HashEntry *entry, Datum match_data) +{ + return entry->key.dboid == DatumGetObjectId(MyDatabaseId); +} - if (hash_search(htab, (void *) &(subentry->subid), HASH_FIND, NULL) == NULL) - pgstat_drop_subscription(subentry->subid); - } +/* + * Reset counters for our database. + * + * Permission checking for this function is managed through the normal + * GRANT system. + */ +void +pgstat_reset_counters(void) +{ + TimestampTz ts = GetCurrentTimestamp(); - hash_destroy(htab); - } + pgstat_reset_matching_entries(match_db_entries, + ObjectIdGetDatum(MyDatabaseId), + ts); +} - /* - * Lookup our own database entry; if not found, nothing more to do. - */ - dbentry = (PgStat_StatDBEntry *) hash_search(pgStatDBHash, - (void *) &MyDatabaseId, - HASH_FIND, NULL); - if (dbentry == NULL || dbentry->tables == NULL) - return; +/* + * Reset a single variable-numbered entry. + * + * If the stats kind is within a database, also reset the database's + * stat_reset_timestamp. + * + * Permission checking for this function is managed through the normal + * GRANT system. + */ +void +pgstat_reset(PgStat_Kind kind, Oid dboid, Oid objoid) +{ + const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind); + TimestampTz ts = GetCurrentTimestamp(); - /* - * Similarly to above, make a list of all known relations in this DB. - */ - htab = pgstat_collect_oids(RelationRelationId, Anum_pg_class_oid); + /* not needed atm, and doesn't make sense with the current signature */ + Assert(!pgstat_get_kind_info(kind)->fixed_amount); - /* - * Initialize our messages table counter to zero - */ - msg.m_nentries = 0; + /* reset the "single counter" */ + pgstat_reset_entry(kind, dboid, objoid, ts); - /* - * Check for all tables listed in stats hashtable if they still exist. - */ - hash_seq_init(&hstat, dbentry->tables); - while ((tabentry = (PgStat_StatTabEntry *) hash_seq_search(&hstat)) != NULL) - { - Oid tabid = tabentry->tableid; + if (!kind_info->accessed_across_databases) + pgstat_reset_database_timestamp(dboid, ts); +} - CHECK_FOR_INTERRUPTS(); +/* + * Reset stats for all entries of a kind. + * + * Permission checking for this function is managed through the normal + * GRANT system. + */ +void +pgstat_reset_of_kind(PgStat_Kind kind) +{ + const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind); + TimestampTz ts = GetCurrentTimestamp(); - if (hash_search(htab, (void *) &tabid, HASH_FIND, NULL) != NULL) - continue; + if (kind_info->fixed_amount) + kind_info->reset_all_cb(ts); + else + pgstat_reset_entries_of_kind(kind, ts); +} - /* - * Not there, so add this table's Oid to the message - */ - msg.m_tableid[msg.m_nentries++] = tabid; - /* - * If the message is full, send it out and reinitialize to empty - */ - if (msg.m_nentries >= PGSTAT_NUM_TABPURGE) - { - len = offsetof(PgStat_MsgTabpurge, m_tableid[0]) - + msg.m_nentries * sizeof(Oid); +/* ------------------------------------------------------------ + * Fetching of stats + * ------------------------------------------------------------ + */ - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_TABPURGE); - msg.m_databaseid = MyDatabaseId; - pgstat_send(&msg, len); +/* + * Discard any data collected in the current transaction. Any subsequent + * request will cause new snapshots to be read. + * + * This is also invoked during transaction commit or abort to discard + * the no-longer-wanted snapshot. + */ +void +pgstat_clear_snapshot(void) +{ + pgstat_assert_is_up(); - msg.m_nentries = 0; - } - } + memset(&pgStatLocal.snapshot.fixed_valid, 0, + sizeof(pgStatLocal.snapshot.fixed_valid)); + pgStatLocal.snapshot.stats = NULL; + pgStatLocal.snapshot.mode = PGSTAT_FETCH_CONSISTENCY_NONE; - /* - * Send the rest - */ - if (msg.m_nentries > 0) + /* Release memory, if any was allocated */ + if (pgStatLocal.snapshot.context) { - len = offsetof(PgStat_MsgTabpurge, m_tableid[0]) - + msg.m_nentries * sizeof(Oid); + MemoryContextDelete(pgStatLocal.snapshot.context); - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_TABPURGE); - msg.m_databaseid = MyDatabaseId; - pgstat_send(&msg, len); + /* Reset variables */ + pgStatLocal.snapshot.context = NULL; } - /* Clean up */ - hash_destroy(htab); - /* - * Now repeat the above steps for functions. However, we needn't bother - * in the common case where no function stats are being collected. + * Historically the backend_status.c facilities lived in this file, and + * were reset with the same function. For now keep it that way, and + * forward the reset request. */ - if (dbentry->functions != NULL && - hash_get_num_entries(dbentry->functions) > 0) - { - htab = pgstat_collect_oids(ProcedureRelationId, Anum_pg_proc_oid); + pgstat_clear_backend_activity_snapshot(); +} - pgstat_setheader(&f_msg.m_hdr, PGSTAT_MTYPE_FUNCPURGE); - f_msg.m_databaseid = MyDatabaseId; - f_msg.m_nentries = 0; +void * +pgstat_fetch_entry(PgStat_Kind kind, Oid dboid, Oid objoid) +{ + PgStat_HashKey key; + PgStat_EntryRef *entry_ref; + void *stats_data; + const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind); - hash_seq_init(&hstat, dbentry->functions); - while ((funcentry = (PgStat_StatFuncEntry *) hash_seq_search(&hstat)) != NULL) - { - Oid funcid = funcentry->functionid; + /* should be called from backends */ + Assert(IsUnderPostmaster || !IsPostmasterEnvironment); + AssertArg(!kind_info->fixed_amount); - CHECK_FOR_INTERRUPTS(); + pgstat_prep_snapshot(); - if (hash_search(htab, (void *) &funcid, HASH_FIND, NULL) != NULL) - continue; + key.kind = kind; + key.dboid = dboid; + key.objoid = objoid; - /* - * Not there, so add this function's Oid to the message - */ - f_msg.m_functionid[f_msg.m_nentries++] = funcid; + /* if we need to build a full snapshot, do so */ + if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_SNAPSHOT) + pgstat_build_snapshot(); - /* - * If the message is full, send it out and reinitialize to empty - */ - if (f_msg.m_nentries >= PGSTAT_NUM_FUNCPURGE) - { - len = offsetof(PgStat_MsgFuncpurge, m_functionid[0]) - + f_msg.m_nentries * sizeof(Oid); + /* if caching is desired, look up in cache */ + if (pgstat_fetch_consistency > PGSTAT_FETCH_CONSISTENCY_NONE) + { + PgStat_SnapshotEntry *entry = NULL; - pgstat_send(&f_msg, len); + entry = pgstat_snapshot_lookup(pgStatLocal.snapshot.stats, key); - f_msg.m_nentries = 0; - } - } + if (entry) + return entry->data; /* - * Send the rest + * If we built a full snapshot and the key is not in + * pgStatLocal.snapshot.stats, there are no matching stats. */ - if (f_msg.m_nentries > 0) - { - len = offsetof(PgStat_MsgFuncpurge, m_functionid[0]) - + f_msg.m_nentries * sizeof(Oid); + if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_SNAPSHOT) + return NULL; + } - pgstat_send(&f_msg, len); - } + pgStatLocal.snapshot.mode = pgstat_fetch_consistency; - hash_destroy(htab); - } -} + entry_ref = pgstat_get_entry_ref(kind, dboid, objoid, false, NULL); -/* - * Collect the OIDs of all objects listed in the specified system catalog - * into a temporary hash table. Caller should hash_destroy the result - * when done with it. (However, we make the table in CurrentMemoryContext - * so that it will be freed properly in event of an error.) - */ -static HTAB * -pgstat_collect_oids(Oid catalogid, AttrNumber anum_oid) -{ - HTAB *htab; - HASHCTL hash_ctl; - Relation rel; - TableScanDesc scan; - HeapTuple tup; - Snapshot snapshot; - - hash_ctl.keysize = sizeof(Oid); - hash_ctl.entrysize = sizeof(Oid); - hash_ctl.hcxt = CurrentMemoryContext; - htab = hash_create("Temporary table of OIDs", - PGSTAT_TAB_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); - - rel = table_open(catalogid, AccessShareLock); - snapshot = RegisterSnapshot(GetLatestSnapshot()); - scan = table_beginscan(rel, snapshot, 0, NULL); - while ((tup = heap_getnext(scan, ForwardScanDirection)) != NULL) + if (entry_ref == NULL || entry_ref->shared_entry->dropped) { - Oid thisoid; - bool isnull; + /* create empty entry when using PGSTAT_FETCH_CONSISTENCY_CACHE */ + if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_CACHE) + { + PgStat_SnapshotEntry *entry = NULL; + bool found; - thisoid = heap_getattr(tup, anum_oid, RelationGetDescr(rel), &isnull); - Assert(!isnull); + entry = pgstat_snapshot_insert(pgStatLocal.snapshot.stats, key, &found); + Assert(!found); + entry->data = NULL; + } + return NULL; + } - CHECK_FOR_INTERRUPTS(); + /* + * Allocate in caller's context for PGSTAT_FETCH_CONSISTENCY_NONE, + * otherwise we could quickly end up with a fair bit of memory used due to + * repeated accesses. + */ + if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_NONE) + stats_data = palloc(kind_info->shared_data_len); + else + stats_data = MemoryContextAlloc(pgStatLocal.snapshot.context, + kind_info->shared_data_len); + memcpy(stats_data, + pgstat_get_entry_data(kind, entry_ref->shared_stats), + kind_info->shared_data_len); + + if (pgstat_fetch_consistency > PGSTAT_FETCH_CONSISTENCY_NONE) + { + PgStat_SnapshotEntry *entry = NULL; + bool found; - (void) hash_search(htab, (void *) &thisoid, HASH_ENTER, NULL); + entry = pgstat_snapshot_insert(pgStatLocal.snapshot.stats, key, &found); + entry->data = stats_data; } - table_endscan(scan); - UnregisterSnapshot(snapshot); - table_close(rel, AccessShareLock); - return htab; + return stats_data; } /* - * Reset counters for our database. - * - * Permission checking for this function is managed through the normal - * GRANT system. + * If a stats snapshot has been taken, return the timestamp at which that was + * done, and set *have_snapshot to true. Otherwise *have_snapshot is set to + * false. */ -void -pgstat_reset_counters(void) +TimestampTz +pgstat_get_stat_snapshot_timestamp(bool *have_snapshot) { - PgStat_MsgResetcounter msg; + if (pgStatLocal.snapshot.mode == PGSTAT_FETCH_CONSISTENCY_SNAPSHOT) + { + *have_snapshot = true; + return pgStatLocal.snapshot.snapshot_timestamp; + } - if (pgStatSock == PGINVALID_SOCKET) - return; + *have_snapshot = false; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETCOUNTER); - msg.m_databaseid = MyDatabaseId; - pgstat_send(&msg, sizeof(msg)); + return 0; } /* - * Reset a single variable-numbered entry. - * - * If the stats kind is within a database, also reset the database's - * stat_reset_timestamp. + * Ensure snapshot for fixed-numbered 'kind' exists. * - * Permission checking for this function is managed through the normal - * GRANT system. + * Typically used by the pgstat_fetch_* functions for a kind of stats, before + * massaging the data into the desired format. */ void -pgstat_reset(PgStat_Kind kind, Oid dboid, Oid objoid) +pgstat_snapshot_fixed(PgStat_Kind kind) { + AssertArg(pgstat_is_kind_valid(kind)); + AssertArg(pgstat_get_kind_info(kind)->fixed_amount); - if (pgStatSock == PGINVALID_SOCKET) - return; + if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_SNAPSHOT) + pgstat_build_snapshot(); + else + pgstat_build_snapshot_fixed(kind); - switch (kind) - { - case PGSTAT_KIND_FUNCTION: - case PGSTAT_KIND_RELATION: - { - PgStat_MsgResetsinglecounter msg; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSINGLECOUNTER); - msg.m_databaseid = dboid; - msg.m_resettype = kind; - msg.m_objectid = objoid; - pgstat_send(&msg, sizeof(msg)); - } - break; - - case PGSTAT_KIND_SUBSCRIPTION: - { - PgStat_MsgResetsubcounter msg; - - Assert(dboid == InvalidOid); - msg.m_subid = objoid; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSUBCOUNTER); - } - break; - - default: - elog(ERROR, "unexpected"); - } + Assert(pgStatLocal.snapshot.fixed_valid[kind]); } -/* - * Reset stats for all entries of a kind. - * - * Permission checking for this function is managed through the normal - * GRANT system. - */ -void -pgstat_reset_of_kind(PgStat_Kind kind) +static void +pgstat_prep_snapshot(void) { - if (pgStatSock == PGINVALID_SOCKET) + if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_NONE || + pgStatLocal.snapshot.stats != NULL) return; - switch (kind) - { - case PGSTAT_KIND_ARCHIVER: - case PGSTAT_KIND_BGWRITER: - case PGSTAT_KIND_CHECKPOINTER: - case PGSTAT_KIND_WAL: - { - PgStat_MsgResetsharedcounter msg; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSHAREDCOUNTER); - msg.m_resettarget = kind; - pgstat_send(&msg, sizeof(msg)); - } - break; - case PGSTAT_KIND_SLRU: - { - PgStat_MsgResetslrucounter msg; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSLRUCOUNTER); - msg.m_index = -1; - pgstat_send(&msg, sizeof(msg)); - } - break; - case PGSTAT_KIND_REPLSLOT: - { - PgStat_MsgResetreplslotcounter msg; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETREPLSLOTCOUNTER); - msg.clearall = true; - pgstat_send(&msg, sizeof(msg)); - } - break; - - case PGSTAT_KIND_SUBSCRIPTION: - { - PgStat_MsgResetsubcounter msg; - - msg.m_subid = InvalidOid; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSUBCOUNTER); - - pgstat_send(&msg, sizeof(msg)); - } - break; - - default: - elog(ERROR, "unexpected"); - } -} - -/* - * Send some junk data to the collector to increase traffic. - */ -void -pgstat_ping(void) -{ - PgStat_MsgDummy msg; - - if (pgStatSock == PGINVALID_SOCKET) - return; + if (!pgStatLocal.snapshot.context) + pgStatLocal.snapshot.context = AllocSetContextCreate(TopMemoryContext, + "PgStat Snapshot", + ALLOCSET_SMALL_SIZES); - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_DUMMY); - pgstat_send(&msg, sizeof(msg)); + pgStatLocal.snapshot.stats = + pgstat_snapshot_create(pgStatLocal.snapshot.context, + PGSTAT_SNAPSHOT_HASH_SIZE, + NULL); } -/* - * Notify collector that we need fresh data. - */ static void -pgstat_send_inquiry(TimestampTz clock_time, TimestampTz cutoff_time, Oid databaseid) +pgstat_build_snapshot(void) { - PgStat_MsgInquiry msg; + dshash_seq_status hstat; + PgStatShared_HashEntry *p; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_INQUIRY); - msg.clock_time = clock_time; - msg.cutoff_time = cutoff_time; - msg.databaseid = databaseid; - pgstat_send(&msg, sizeof(msg)); -} + /* should only be called when we need a snapshot */ + Assert(pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_SNAPSHOT); -/* - * Discard any data collected in the current transaction. Any subsequent - * request will cause new snapshots to be read. - * - * This is also invoked during transaction commit or abort to discard - * the no-longer-wanted snapshot. - */ -void -pgstat_clear_snapshot(void) -{ - pgstat_assert_is_up(); + /* snapshot already built */ + if (pgStatLocal.snapshot.mode == PGSTAT_FETCH_CONSISTENCY_SNAPSHOT) + return; - /* Release memory, if any was allocated */ - if (pgStatLocalContext) - MemoryContextDelete(pgStatLocalContext); + pgstat_prep_snapshot(); - /* Reset variables */ - pgStatLocalContext = NULL; - pgStatDBHash = NULL; - replSlotStatHash = NULL; - subscriptionStatHash = NULL; + Assert(pgStatLocal.snapshot.stats->members == 0); - /* - * Historically the backend_status.c facilities lived in this file, and - * were reset with the same function. For now keep it that way, and - * forward the reset request. - */ - pgstat_clear_backend_activity_snapshot(); -} + pgStatLocal.snapshot.snapshot_timestamp = GetCurrentTimestamp(); -/* - * Support function for the SQL-callable pgstat* functions. Returns - * the collected statistics for one database or NULL. NULL doesn't mean - * that the database doesn't exist, just that there are no statistics, so the - * caller is better off to report ZERO instead. - */ -PgStat_StatDBEntry * -pgstat_fetch_stat_dbentry(Oid dbid) -{ /* - * If not done for this transaction, read the statistics collector stats - * file into some hash tables. + * Snapshot all variable stats. */ - backend_read_statsfile(); + dshash_seq_init(&hstat, pgStatLocal.shared_hash, false); + while ((p = dshash_seq_next(&hstat)) != NULL) + { + PgStat_Kind kind = p->key.kind; + const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind); + bool found; + PgStat_SnapshotEntry *entry; + PgStatShared_Common *stats_data; + + /* + * Check if the stats object should be included in the snapshot. + * Unless the stats kind can be accessed from all databases (e.g., + * database stats themselves), we only include stats for the current + * database or objects not associated with a database (e.g. shared + * relations). + */ + if (p->key.dboid != MyDatabaseId && + p->key.dboid != InvalidOid && + !kind_info->accessed_across_databases) + continue; + + if (p->dropped) + continue; + + Assert(pg_atomic_read_u32(&p->refcount) > 0); + + stats_data = dsa_get_address(pgStatLocal.dsa, p->body); + Assert(stats_data); + + entry = pgstat_snapshot_insert(pgStatLocal.snapshot.stats, p->key, &found); + Assert(!found); + + entry->data = MemoryContextAlloc(pgStatLocal.snapshot.context, + kind_info->shared_size); + memcpy(entry->data, + pgstat_get_entry_data(kind, stats_data), + kind_info->shared_size); + } + dshash_seq_term(&hstat); /* - * Lookup the requested database; return NULL if not found + * Build snapshot of all fixed-numbered stats. */ - return (PgStat_StatDBEntry *) hash_search(pgStatDBHash, - (void *) &dbid, - HASH_FIND, NULL); -} + for (int kind = PGSTAT_KIND_FIRST_VALID; kind <= PGSTAT_KIND_LAST; kind++) + { + const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind); -/* - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the global statistics struct. - */ -PgStat_GlobalStats * -pgstat_fetch_global(void) -{ - backend_read_statsfile(); + if (!kind_info->fixed_amount) + { + Assert(kind_info->snapshot_cb == NULL); + continue; + } + + pgstat_build_snapshot_fixed(kind); + } - return &globalStats; + pgStatLocal.snapshot.mode = PGSTAT_FETCH_CONSISTENCY_SNAPSHOT; } -/* - * Support function for the SQL-callable pgstat* functions. Returns - * the collected statistics for one table or NULL. NULL doesn't mean - * that the table doesn't exist, just that there are no statistics, so the - * caller is better off to report ZERO instead. - */ -PgStat_StatTabEntry * -pgstat_fetch_stat_tabentry(Oid relid) +static void +pgstat_build_snapshot_fixed(PgStat_Kind kind) { - Oid dbid; - PgStat_StatDBEntry *dbentry; - PgStat_StatTabEntry *tabentry; + const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind); - /* - * If not done for this transaction, read the statistics collector stats - * file into some hash tables. - */ - backend_read_statsfile(); + Assert(kind_info->fixed_amount); + Assert(kind_info->snapshot_cb != NULL); - /* - * Lookup our database, then look in its table hash table. - */ - dbid = MyDatabaseId; - dbentry = (PgStat_StatDBEntry *) hash_search(pgStatDBHash, - (void *) &dbid, - HASH_FIND, NULL); - if (dbentry != NULL && dbentry->tables != NULL) + if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_NONE) { - tabentry = (PgStat_StatTabEntry *) hash_search(dbentry->tables, - (void *) &relid, - HASH_FIND, NULL); - if (tabentry) - return tabentry; + /* rebuild every time */ + pgStatLocal.snapshot.fixed_valid[kind] = false; } - - /* - * If we didn't find it, maybe it's a shared table. - */ - dbid = InvalidOid; - dbentry = (PgStat_StatDBEntry *) hash_search(pgStatDBHash, - (void *) &dbid, - HASH_FIND, NULL); - if (dbentry != NULL && dbentry->tables != NULL) + else if (pgStatLocal.snapshot.fixed_valid[kind]) { - tabentry = (PgStat_StatTabEntry *) hash_search(dbentry->tables, - (void *) &relid, - HASH_FIND, NULL); - if (tabentry) - return tabentry; + /* in snapshot mode we shouldn't get called again */ + Assert(pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_CACHE); + return; } - return NULL; + Assert(!pgStatLocal.snapshot.fixed_valid[kind]); + + kind_info->snapshot_cb(); + + Assert(!pgStatLocal.snapshot.fixed_valid[kind]); + pgStatLocal.snapshot.fixed_valid[kind] = true; } +/* ------------------------------------------------------------ + * Backend-local pending stats infrastructure + * ------------------------------------------------------------ + */ + /* - * Support function for the SQL-callable pgstat* functions. Returns - * the collected statistics for one function or NULL. + * Returns the appropriate PgStat_EntryRef, preparing it to receive pending + * stats if not already done. + * + * If created_entry is non-NULL, it'll be set to true if the entry is newly + * created, false otherwise. */ -PgStat_StatFuncEntry * -pgstat_fetch_stat_funcentry(Oid func_id) +PgStat_EntryRef * +pgstat_prep_pending_entry(PgStat_Kind kind, Oid dboid, Oid objoid, bool *created_entry) { - PgStat_StatDBEntry *dbentry; - PgStat_StatFuncEntry *funcentry = NULL; + PgStat_EntryRef *entry_ref; - /* load the stats file if needed */ - backend_read_statsfile(); + /* need to be able to flush out */ + Assert(pgstat_get_kind_info(kind)->flush_pending_cb != NULL); - /* Lookup our database, then find the requested function. */ - dbentry = pgstat_fetch_stat_dbentry(MyDatabaseId); - if (dbentry != NULL && dbentry->functions != NULL) + if (unlikely(!pgStatPendingContext)) { - funcentry = (PgStat_StatFuncEntry *) hash_search(dbentry->functions, - (void *) &func_id, - HASH_FIND, NULL); + pgStatPendingContext = + AllocSetContextCreate(CacheMemoryContext, + "PgStat Pending", + ALLOCSET_SMALL_SIZES); } - return funcentry; -} + entry_ref = pgstat_get_entry_ref(kind, dboid, objoid, + true, created_entry); -/* - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the archiver statistics struct. - */ -PgStat_ArchiverStats * -pgstat_fetch_stat_archiver(void) -{ - backend_read_statsfile(); + if (entry_ref->pending == NULL) + { + size_t entrysize = pgstat_get_kind_info(kind)->pending_size; - return &archiverStats; -} + Assert(entrysize != (size_t) -1); -/* - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the bgwriter statistics struct. - */ -PgStat_BgWriterStats * -pgstat_fetch_stat_bgwriter(void) -{ - backend_read_statsfile(); + entry_ref->pending = MemoryContextAllocZero(pgStatPendingContext, entrysize); + dlist_push_tail(&pgStatPending, &entry_ref->pending_node); + } - return &globalStats.bgwriter; + return entry_ref; } /* - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the checkpointer statistics struct. + * Return an existing stats entry, or NULL. + * + * This should only be used for helper function for pgstatfuncs.c - outside of + * that it shouldn't be needed. */ -PgStat_CheckpointerStats * -pgstat_fetch_stat_checkpointer(void) +PgStat_EntryRef * +pgstat_fetch_pending_entry(PgStat_Kind kind, Oid dboid, Oid objoid) { - backend_read_statsfile(); + PgStat_EntryRef *entry_ref; - return &globalStats.checkpointer; -} + entry_ref = pgstat_get_entry_ref(kind, dboid, objoid, false, NULL); -/* - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the WAL statistics struct. - */ -PgStat_WalStats * -pgstat_fetch_stat_wal(void) -{ - backend_read_statsfile(); + if (entry_ref == NULL || entry_ref->pending == NULL) + return NULL; - return &walStats; + return entry_ref; } -/* - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the slru statistics struct. - */ -PgStat_SLRUStats * -pgstat_fetch_slru(void) +void +pgstat_delete_pending_entry(PgStat_EntryRef *entry_ref) { - backend_read_statsfile(); + PgStat_Kind kind = entry_ref->shared_entry->key.kind; + const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind); + void *pending_data = entry_ref->pending; - return slruStats; -} + Assert(pending_data != NULL); + /* !fixed_amount stats should be handled explicitly */ + Assert(!pgstat_get_kind_info(kind)->fixed_amount); -/* - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the replication slot statistics struct. - */ -PgStat_StatReplSlotEntry * -pgstat_fetch_replslot(NameData slotname) -{ - backend_read_statsfile(); + if (kind_info->delete_pending_cb) + kind_info->delete_pending_cb(entry_ref); + + pfree(pending_data); + entry_ref->pending = NULL; - return pgstat_get_replslot_entry(slotname, false); + dlist_delete(&entry_ref->pending_node); } /* - * Support function for the SQL-callable pgstat* functions. Returns - * the collected statistics for one subscription or NULL. + * Flush out pending stats for database objects (databases, relations, + * functions). */ -PgStat_StatSubEntry * -pgstat_fetch_stat_subscription(Oid subid) +static bool +pgstat_flush_pending_entries(bool nowait) { - /* Load the stats file if needed */ - backend_read_statsfile(); + bool have_pending = false; + dlist_node *cur = NULL; + + /* + * Need to be a bit careful iterating over the list of pending entries. + * Processing a pending entry may queue further pending entries to the end + * of the list that we want to process, so a simple iteration won't do. + * Further complicating matters is that we want to delete the current + * entry in each iteration from the list if we flushed successfully. + * + * So we just keep track of the next pointer in each loop iteration. + */ + if (!dlist_is_empty(&pgStatPending)) + cur = dlist_head_node(&pgStatPending); + + while (cur) + { + PgStat_EntryRef *entry_ref = + dlist_container(PgStat_EntryRef, pending_node, cur); + PgStat_HashKey key = entry_ref->shared_entry->key; + PgStat_Kind kind = key.kind; + const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind); + bool did_flush; + dlist_node *next; + + Assert(!kind_info->fixed_amount); + Assert(kind_info->flush_pending_cb != NULL); + + /* flush the stats, if possible */ + did_flush = kind_info->flush_pending_cb(entry_ref, nowait); + + Assert(did_flush || nowait); - return pgstat_get_subscription_entry(subid, false); + /* determine next entry, before deleting the pending entry */ + if (dlist_has_next(&pgStatPending, cur)) + next = dlist_next_node(&pgStatPending, cur); + else + next = NULL; + + /* if successfully flushed, remove entry */ + if (did_flush) + pgstat_delete_pending_entry(entry_ref); + else + have_pending = true; + + cur = next; + } + + Assert(dlist_is_empty(&pgStatPending) == !have_pending); + + return have_pending; } @@ -1464,16 +1156,33 @@ pgstat_fetch_stat_subscription(Oid subid) * ------------------------------------------------------------ */ -/* - * Create pgStatLocalContext, if not already done. - */ -static void -pgstat_setup_memcxt(void) +PgStat_Kind +pgstat_get_kind_from_str(char *kind_str) +{ + for (int kind = PGSTAT_KIND_FIRST_VALID; kind <= PGSTAT_KIND_LAST; kind++) + { + if (pg_strcasecmp(kind_str, pgstat_kind_infos[kind].name) == 0) + return kind; + } + + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid statistics kind: \"%s\"", kind_str))); + return PGSTAT_KIND_DATABASE; /* avoid compiler warnings */ +} + +static inline bool +pgstat_is_kind_valid(int ikind) { - if (!pgStatLocalContext) - pgStatLocalContext = AllocSetContextCreate(TopMemoryContext, - "Statistics snapshot", - ALLOCSET_SMALL_SIZES); + return ikind >= PGSTAT_KIND_FIRST_VALID && ikind <= PGSTAT_KIND_LAST; +} + +const PgStat_KindInfo * +pgstat_get_kind_info(PgStat_Kind kind) +{ + AssertArg(pgstat_is_kind_valid(kind)); + + return &pgstat_kind_infos[kind]; } /* @@ -1489,642 +1198,44 @@ pgstat_assert_is_up(void) } #endif -/* - * Set common header fields in a statistics message - */ -void -pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype) -{ - hdr->m_type = mtype; -} - - -/* - * Send out one statistics message to the collector - */ -void -pgstat_send(void *msg, int len) -{ - int rc; - - pgstat_assert_is_up(); - - if (pgStatSock == PGINVALID_SOCKET) - return; - - ((PgStat_MsgHdr *) msg)->m_size = len; - - /* We'll retry after EINTR, but ignore all other failures */ - do - { - rc = send(pgStatSock, msg, len, 0); - } while (rc < 0 && errno == EINTR); - -#ifdef USE_ASSERT_CHECKING - /* In debug builds, log send failures ... */ - if (rc < 0) - elog(LOG, "could not send to statistics collector: %m"); -#endif -} - -/* - * Start up the statistics collector process. This is the body of the - * postmaster child process. - * - * The argc/argv parameters are valid only in EXEC_BACKEND case. - */ -NON_EXEC_STATIC void -PgstatCollectorMain(int argc, char *argv[]) -{ - int len; - PgStat_Msg msg; - int wr; - WaitEvent event; - WaitEventSet *wes; - - /* - * Ignore all signals usually bound to some action in the postmaster, - * except SIGHUP and SIGQUIT. Note we don't need a SIGUSR1 handler to - * support latch operations, because we only use a local latch. - */ - pqsignal(SIGHUP, SignalHandlerForConfigReload); - pqsignal(SIGINT, SIG_IGN); - pqsignal(SIGTERM, SIG_IGN); - pqsignal(SIGQUIT, SignalHandlerForShutdownRequest); - pqsignal(SIGALRM, SIG_IGN); - pqsignal(SIGPIPE, SIG_IGN); - pqsignal(SIGUSR1, SIG_IGN); - pqsignal(SIGUSR2, SIG_IGN); - /* Reset some signals that are accepted by postmaster but not here */ - pqsignal(SIGCHLD, SIG_DFL); - PG_SETMASK(&UnBlockSig); - - MyBackendType = B_STATS_COLLECTOR; - init_ps_display(NULL); - - /* - * Read in existing stats files or initialize the stats to zero. - */ - pgStatRunningInCollector = true; - pgStatDBHash = pgstat_read_statsfiles(InvalidOid, true, true); - - /* Prepare to wait for our latch or data in our socket. */ - wes = CreateWaitEventSet(CurrentMemoryContext, 3); - AddWaitEventToSet(wes, WL_LATCH_SET, PGINVALID_SOCKET, MyLatch, NULL); - AddWaitEventToSet(wes, WL_POSTMASTER_DEATH, PGINVALID_SOCKET, NULL, NULL); - AddWaitEventToSet(wes, WL_SOCKET_READABLE, pgStatSock, NULL, NULL); - - /* - * Loop to process messages until we get SIGQUIT or detect ungraceful - * death of our parent postmaster. - * - * For performance reasons, we don't want to do ResetLatch/WaitLatch after - * every message; instead, do that only after a recv() fails to obtain a - * message. (This effectively means that if backends are sending us stuff - * like mad, we won't notice postmaster death until things slack off a - * bit; which seems fine.) To do that, we have an inner loop that - * iterates as long as recv() succeeds. We do check ConfigReloadPending - * inside the inner loop, which means that such interrupts will get - * serviced but the latch won't get cleared until next time there is a - * break in the action. - */ - for (;;) - { - /* Clear any already-pending wakeups */ - ResetLatch(MyLatch); - - /* - * Quit if we get SIGQUIT from the postmaster. - */ - if (ShutdownRequestPending) - break; - - /* - * Inner loop iterates as long as we keep getting messages, or until - * ShutdownRequestPending becomes set. - */ - while (!ShutdownRequestPending) - { - /* - * Reload configuration if we got SIGHUP from the postmaster. - */ - if (ConfigReloadPending) - { - ConfigReloadPending = false; - ProcessConfigFile(PGC_SIGHUP); - } - - /* - * Write the stats file(s) if a new request has arrived that is - * not satisfied by existing file(s). - */ - if (pgstat_write_statsfile_needed()) - pgstat_write_statsfiles(false, false); - - /* - * Try to receive and process a message. This will not block, - * since the socket is set to non-blocking mode. - * - * XXX On Windows, we have to force pgwin32_recv to cooperate, - * despite the previous use of pg_set_noblock() on the socket. - * This is extremely broken and should be fixed someday. - */ -#ifdef WIN32 - pgwin32_noblock = 1; -#endif - - len = recv(pgStatSock, (char *) &msg, - sizeof(PgStat_Msg), 0); - -#ifdef WIN32 - pgwin32_noblock = 0; -#endif - - if (len < 0) - { - if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) - break; /* out of inner loop */ - ereport(ERROR, - (errcode_for_socket_access(), - errmsg("could not read statistics message: %m"))); - } - - /* - * We ignore messages that are smaller than our common header - */ - if (len < sizeof(PgStat_MsgHdr)) - continue; - - /* - * The received length must match the length in the header - */ - if (msg.msg_hdr.m_size != len) - continue; - - /* - * O.K. - we accept this message. Process it. - */ - switch (msg.msg_hdr.m_type) - { - case PGSTAT_MTYPE_DUMMY: - break; - - case PGSTAT_MTYPE_INQUIRY: - pgstat_recv_inquiry(&msg.msg_inquiry, len); - break; - - case PGSTAT_MTYPE_TABSTAT: - pgstat_recv_tabstat(&msg.msg_tabstat, len); - break; - - case PGSTAT_MTYPE_TABPURGE: - pgstat_recv_tabpurge(&msg.msg_tabpurge, len); - break; - - case PGSTAT_MTYPE_DROPDB: - pgstat_recv_dropdb(&msg.msg_dropdb, len); - break; - - case PGSTAT_MTYPE_RESETCOUNTER: - pgstat_recv_resetcounter(&msg.msg_resetcounter, len); - break; - - case PGSTAT_MTYPE_RESETSHAREDCOUNTER: - pgstat_recv_resetsharedcounter(&msg.msg_resetsharedcounter, - len); - break; - - case PGSTAT_MTYPE_RESETSINGLECOUNTER: - pgstat_recv_resetsinglecounter(&msg.msg_resetsinglecounter, - len); - break; - - case PGSTAT_MTYPE_RESETSLRUCOUNTER: - pgstat_recv_resetslrucounter(&msg.msg_resetslrucounter, - len); - break; - - case PGSTAT_MTYPE_RESETREPLSLOTCOUNTER: - pgstat_recv_resetreplslotcounter(&msg.msg_resetreplslotcounter, - len); - break; - - case PGSTAT_MTYPE_RESETSUBCOUNTER: - pgstat_recv_resetsubcounter(&msg.msg_resetsubcounter, len); - break; - - case PGSTAT_MTYPE_AUTOVAC_START: - pgstat_recv_autovac(&msg.msg_autovacuum_start, len); - break; - - case PGSTAT_MTYPE_VACUUM: - pgstat_recv_vacuum(&msg.msg_vacuum, len); - break; - - case PGSTAT_MTYPE_ANALYZE: - pgstat_recv_analyze(&msg.msg_analyze, len); - break; - - case PGSTAT_MTYPE_ARCHIVER: - pgstat_recv_archiver(&msg.msg_archiver, len); - break; - - case PGSTAT_MTYPE_BGWRITER: - pgstat_recv_bgwriter(&msg.msg_bgwriter, len); - break; - - case PGSTAT_MTYPE_CHECKPOINTER: - pgstat_recv_checkpointer(&msg.msg_checkpointer, len); - break; - - case PGSTAT_MTYPE_WAL: - pgstat_recv_wal(&msg.msg_wal, len); - break; - - case PGSTAT_MTYPE_SLRU: - pgstat_recv_slru(&msg.msg_slru, len); - break; - - case PGSTAT_MTYPE_FUNCSTAT: - pgstat_recv_funcstat(&msg.msg_funcstat, len); - break; - - case PGSTAT_MTYPE_FUNCPURGE: - pgstat_recv_funcpurge(&msg.msg_funcpurge, len); - break; - - case PGSTAT_MTYPE_RECOVERYCONFLICT: - pgstat_recv_recoveryconflict(&msg.msg_recoveryconflict, - len); - break; - - case PGSTAT_MTYPE_DEADLOCK: - pgstat_recv_deadlock(&msg.msg_deadlock, len); - break; - - case PGSTAT_MTYPE_TEMPFILE: - pgstat_recv_tempfile(&msg.msg_tempfile, len); - break; - - case PGSTAT_MTYPE_CHECKSUMFAILURE: - pgstat_recv_checksum_failure(&msg.msg_checksumfailure, - len); - break; - - case PGSTAT_MTYPE_REPLSLOT: - pgstat_recv_replslot(&msg.msg_replslot, len); - break; - - case PGSTAT_MTYPE_CONNECT: - pgstat_recv_connect(&msg.msg_connect, len); - break; - - case PGSTAT_MTYPE_DISCONNECT: - pgstat_recv_disconnect(&msg.msg_disconnect, len); - break; - - case PGSTAT_MTYPE_SUBSCRIPTIONDROP: - pgstat_recv_subscription_drop(&msg.msg_subscriptiondrop, len); - break; - - case PGSTAT_MTYPE_SUBSCRIPTIONERROR: - pgstat_recv_subscription_error(&msg.msg_subscriptionerror, len); - break; - - default: - break; - } - } /* end of inner message-processing loop */ - - /* Sleep until there's something to do */ -#ifndef WIN32 - wr = WaitEventSetWait(wes, -1L, &event, 1, WAIT_EVENT_PGSTAT_MAIN); -#else - - /* - * Windows, at least in its Windows Server 2003 R2 incarnation, - * sometimes loses FD_READ events. Waking up and retrying the recv() - * fixes that, so don't sleep indefinitely. This is a crock of the - * first water, but until somebody wants to debug exactly what's - * happening there, this is the best we can do. The two-second - * timeout matches our pre-9.2 behavior, and needs to be short enough - * to not provoke "using stale statistics" complaints from - * backend_read_statsfile. - */ - wr = WaitEventSetWait(wes, 2 * 1000L /* msec */ , &event, 1, - WAIT_EVENT_PGSTAT_MAIN); -#endif - - /* - * Emergency bailout if postmaster has died. This is to avoid the - * necessity for manual cleanup of all postmaster children. - */ - if (wr == 1 && event.events == WL_POSTMASTER_DEATH) - break; - } /* end of outer loop */ - - /* - * Save the final stats to reuse at next startup. - */ - pgstat_write_statsfiles(true, true); - - FreeWaitEventSet(wes); - - exit(0); -} - -/* - * Subroutine to clear stats in a database entry - * - * Tables and functions hashes are initialized to empty. - */ -static void -reset_dbentry_counters(PgStat_StatDBEntry *dbentry) -{ - HASHCTL hash_ctl; - - dbentry->n_xact_commit = 0; - dbentry->n_xact_rollback = 0; - dbentry->n_blocks_fetched = 0; - dbentry->n_blocks_hit = 0; - dbentry->n_tuples_returned = 0; - dbentry->n_tuples_fetched = 0; - dbentry->n_tuples_inserted = 0; - dbentry->n_tuples_updated = 0; - dbentry->n_tuples_deleted = 0; - dbentry->last_autovac_time = 0; - dbentry->n_conflict_tablespace = 0; - dbentry->n_conflict_lock = 0; - dbentry->n_conflict_snapshot = 0; - dbentry->n_conflict_bufferpin = 0; - dbentry->n_conflict_startup_deadlock = 0; - dbentry->n_temp_files = 0; - dbentry->n_temp_bytes = 0; - dbentry->n_deadlocks = 0; - dbentry->n_checksum_failures = 0; - dbentry->last_checksum_failure = 0; - dbentry->n_block_read_time = 0; - dbentry->n_block_write_time = 0; - dbentry->n_sessions = 0; - dbentry->total_session_time = 0; - dbentry->total_active_time = 0; - dbentry->total_idle_in_xact_time = 0; - dbentry->n_sessions_abandoned = 0; - dbentry->n_sessions_fatal = 0; - dbentry->n_sessions_killed = 0; - - dbentry->stat_reset_timestamp = GetCurrentTimestamp(); - dbentry->stats_timestamp = 0; - - hash_ctl.keysize = sizeof(Oid); - hash_ctl.entrysize = sizeof(PgStat_StatTabEntry); - dbentry->tables = hash_create("Per-database table", - PGSTAT_TAB_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS); - - hash_ctl.keysize = sizeof(Oid); - hash_ctl.entrysize = sizeof(PgStat_StatFuncEntry); - dbentry->functions = hash_create("Per-database function", - PGSTAT_FUNCTION_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS); -} - -/* - * Lookup the hash table entry for the specified database. If no hash - * table entry exists, initialize it, if the create parameter is true. - * Else, return NULL. - */ -static PgStat_StatDBEntry * -pgstat_get_db_entry(Oid databaseid, bool create) -{ - PgStat_StatDBEntry *result; - bool found; - HASHACTION action = (create ? HASH_ENTER : HASH_FIND); - - /* Lookup or create the hash table entry for this database */ - result = (PgStat_StatDBEntry *) hash_search(pgStatDBHash, - &databaseid, - action, &found); - - if (!create && !found) - return NULL; - - /* - * If not found, initialize the new one. This creates empty hash tables - * for tables and functions, too. - */ - if (!found) - reset_dbentry_counters(result); - - return result; -} -/* - * Lookup the hash table entry for the specified table. If no hash - * table entry exists, initialize it, if the create parameter is true. - * Else, return NULL. - */ -static PgStat_StatTabEntry * -pgstat_get_tab_entry(PgStat_StatDBEntry *dbentry, Oid tableoid, bool create) -{ - PgStat_StatTabEntry *result; - bool found; - HASHACTION action = (create ? HASH_ENTER : HASH_FIND); - - /* Lookup or create the hash table entry for this table */ - result = (PgStat_StatTabEntry *) hash_search(dbentry->tables, - &tableoid, - action, &found); - - if (!create && !found) - return NULL; - - /* If not found, initialize the new one. */ - if (!found) - { - result->numscans = 0; - result->tuples_returned = 0; - result->tuples_fetched = 0; - result->tuples_inserted = 0; - result->tuples_updated = 0; - result->tuples_deleted = 0; - result->tuples_hot_updated = 0; - result->n_live_tuples = 0; - result->n_dead_tuples = 0; - result->changes_since_analyze = 0; - result->inserts_since_vacuum = 0; - result->blocks_fetched = 0; - result->blocks_hit = 0; - result->vacuum_timestamp = 0; - result->vacuum_count = 0; - result->autovac_vacuum_timestamp = 0; - result->autovac_vacuum_count = 0; - result->analyze_timestamp = 0; - result->analyze_count = 0; - result->autovac_analyze_timestamp = 0; - result->autovac_analyze_count = 0; - } - - return result; -} - -/* - * Return the entry of replication slot stats with the given name. Return - * NULL if not found and the caller didn't request to create it. - * - * create tells whether to create the new slot entry if it is not found. +/* ------------------------------------------------------------ + * reading and writing of on-disk stats file + * ------------------------------------------------------------ */ -static PgStat_StatReplSlotEntry * -pgstat_get_replslot_entry(NameData name, bool create) -{ - PgStat_StatReplSlotEntry *slotent; - bool found; - - if (replSlotStatHash == NULL) - { - HASHCTL hash_ctl; - - /* - * Quick return NULL if the hash table is empty and the caller didn't - * request to create the entry. - */ - if (!create) - return NULL; - - hash_ctl.keysize = sizeof(NameData); - hash_ctl.entrysize = sizeof(PgStat_StatReplSlotEntry); - replSlotStatHash = hash_create("Replication slots hash", - PGSTAT_REPLSLOT_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS); - } - - slotent = (PgStat_StatReplSlotEntry *) hash_search(replSlotStatHash, - (void *) &name, - create ? HASH_ENTER : HASH_FIND, - &found); - - if (!slotent) - { - /* not found */ - Assert(!create && !found); - return NULL; - } - - /* initialize the entry */ - if (create && !found) - { - namestrcpy(&(slotent->slotname), NameStr(name)); - pgstat_reset_replslot_entry(slotent, 0); - } - return slotent; -} - -/* - * Reset the given replication slot stats. - */ +/* helpers for pgstat_write_statsfile() */ static void -pgstat_reset_replslot_entry(PgStat_StatReplSlotEntry *slotent, TimestampTz ts) +write_chunk(FILE *fpout, void *ptr, size_t len) { - /* reset only counters. Don't clear slot name */ - slotent->spill_txns = 0; - slotent->spill_count = 0; - slotent->spill_bytes = 0; - slotent->stream_txns = 0; - slotent->stream_count = 0; - slotent->stream_bytes = 0; - slotent->total_txns = 0; - slotent->total_bytes = 0; - slotent->stat_reset_timestamp = ts; -} - -/* - * Return the subscription statistics entry with the given subscription OID. - * If no subscription entry exists, initialize it, if the create parameter is - * true. Else, return NULL. - */ -static PgStat_StatSubEntry * -pgstat_get_subscription_entry(Oid subid, bool create) -{ - PgStat_StatSubEntry *subentry; - bool found; - HASHACTION action = (create ? HASH_ENTER : HASH_FIND); - - if (subscriptionStatHash == NULL) - { - HASHCTL hash_ctl; - - /* - * Quick return NULL if the hash table is empty and the caller didn't - * request to create the entry. - */ - if (!create) - return NULL; - - hash_ctl.keysize = sizeof(Oid); - hash_ctl.entrysize = sizeof(PgStat_StatSubEntry); - subscriptionStatHash = hash_create("Subscription hash", - PGSTAT_SUBSCRIPTION_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS); - } - - subentry = (PgStat_StatSubEntry *) hash_search(subscriptionStatHash, - (void *) &subid, - action, &found); - - if (!create && !found) - return NULL; - - /* If not found, initialize the new one */ - if (!found) - pgstat_reset_subscription(subentry, 0); + int rc; - return subentry; -} + rc = fwrite(ptr, len, 1, fpout); -/* - * Reset the given subscription stats. - */ -static void -pgstat_reset_subscription(PgStat_StatSubEntry *subentry, TimestampTz ts) -{ - subentry->apply_error_count = 0; - subentry->sync_error_count = 0; - subentry->stat_reset_timestamp = ts; + /* we'll check for errors with ferror once at the end */ + (void) rc; } - -/* ------------------------------------------------------------ - * reading and writing of on-disk stats file - * ------------------------------------------------------------ - */ +#define write_chunk_s(fpout, ptr) write_chunk(fpout, ptr, sizeof(*ptr)) /* - * Write the global statistics file, as well as requested DB files. - * - * 'permanent' specifies writing to the permanent files not temporary ones. - * When true (happens only when the collector is shutting down), also remove - * the temporary files so that backends starting up under a new postmaster - * can't read old data before the new collector is ready. - * - * When 'allDbs' is false, only the requested databases (listed in - * pending_write_requests) will be written; otherwise, all databases - * will be written. + * This function is called in the last process that is accessing the shared + * stats so locking is not required. */ static void -pgstat_write_statsfiles(bool permanent, bool allDbs) +pgstat_write_statsfile(void) { - HASH_SEQ_STATUS hstat; - PgStat_StatDBEntry *dbentry; FILE *fpout; int32 format_id; - const char *tmpfile = permanent ? PGSTAT_STAT_PERMANENT_TMPFILE : pgstat_stat_tmpname; - const char *statfile = permanent ? PGSTAT_STAT_PERMANENT_FILENAME : pgstat_stat_filename; - int rc; + const char *tmpfile = PGSTAT_STAT_PERMANENT_TMPFILE; + const char *statfile = PGSTAT_STAT_PERMANENT_FILENAME; + dshash_seq_status hstat; + PgStatShared_HashEntry *ps; + + pgstat_assert_is_up(); + + /* we're shutting down, so it's ok to just override this */ + pgstat_fetch_consistency = PGSTAT_FETCH_CONSISTENCY_NONE; elog(DEBUG2, "writing stats file \"%s\"", statfile); @@ -2141,105 +1252,100 @@ pgstat_write_statsfiles(bool permanent, bool allDbs) return; } - /* - * Set the timestamp of the stats file. - */ - globalStats.stats_timestamp = GetCurrentTimestamp(); - /* * Write the file header --- currently just a format ID. */ format_id = PGSTAT_FILE_FORMAT_ID; - rc = fwrite(&format_id, sizeof(format_id), 1, fpout); - (void) rc; /* we'll check for error with ferror */ + write_chunk_s(fpout, &format_id); /* - * Write global stats struct + * XXX: The following could now be generalized to just iterate over + * pgstat_kind_infos instead of knowing about the different kinds of + * stats. */ - rc = fwrite(&globalStats, sizeof(globalStats), 1, fpout); - (void) rc; /* we'll check for error with ferror */ /* * Write archiver stats struct */ - rc = fwrite(&archiverStats, sizeof(archiverStats), 1, fpout); - (void) rc; /* we'll check for error with ferror */ + pgstat_build_snapshot_fixed(PGSTAT_KIND_ARCHIVER); + write_chunk_s(fpout, &pgStatLocal.snapshot.archiver); /* - * Write WAL stats struct + * Write bgwriter stats struct */ - rc = fwrite(&walStats, sizeof(walStats), 1, fpout); - (void) rc; /* we'll check for error with ferror */ + pgstat_build_snapshot_fixed(PGSTAT_KIND_BGWRITER); + write_chunk_s(fpout, &pgStatLocal.snapshot.bgwriter); /* - * Write SLRU stats struct + * Write checkpointer stats struct */ - rc = fwrite(slruStats, sizeof(slruStats), 1, fpout); - (void) rc; /* we'll check for error with ferror */ + pgstat_build_snapshot_fixed(PGSTAT_KIND_CHECKPOINTER); + write_chunk_s(fpout, &pgStatLocal.snapshot.checkpointer); /* - * Walk through the database table. + * Write SLRU stats struct */ - hash_seq_init(&hstat, pgStatDBHash); - while ((dbentry = (PgStat_StatDBEntry *) hash_seq_search(&hstat)) != NULL) - { - /* - * Write out the table and function stats for this DB into the - * appropriate per-DB stat file, if required. - */ - if (allDbs || pgstat_db_requested(dbentry->databaseid)) - { - /* Make DB's timestamp consistent with the global stats */ - dbentry->stats_timestamp = globalStats.stats_timestamp; - - pgstat_write_db_statsfile(dbentry, permanent); - } - - /* - * Write out the DB entry. We don't write the tables or functions - * pointers, since they're of no use to any other process. - */ - fputc('D', fpout); - rc = fwrite(dbentry, offsetof(PgStat_StatDBEntry, tables), 1, fpout); - (void) rc; /* we'll check for error with ferror */ - } + pgstat_build_snapshot_fixed(PGSTAT_KIND_SLRU); + write_chunk_s(fpout, &pgStatLocal.snapshot.slru); /* - * Write replication slot stats struct + * Write WAL stats struct */ - if (replSlotStatHash) - { - PgStat_StatReplSlotEntry *slotent; - - hash_seq_init(&hstat, replSlotStatHash); - while ((slotent = (PgStat_StatReplSlotEntry *) hash_seq_search(&hstat)) != NULL) - { - fputc('R', fpout); - rc = fwrite(slotent, sizeof(PgStat_StatReplSlotEntry), 1, fpout); - (void) rc; /* we'll check for error with ferror */ - } - } + pgstat_build_snapshot_fixed(PGSTAT_KIND_WAL); + write_chunk_s(fpout, &pgStatLocal.snapshot.wal); /* - * Write subscription stats struct + * Walk through the stats entries */ - if (subscriptionStatHash) + dshash_seq_init(&hstat, pgStatLocal.shared_hash, false); + while ((ps = dshash_seq_next(&hstat)) != NULL) { - PgStat_StatSubEntry *subentry; + PgStatShared_Common *shstats; + const PgStat_KindInfo *kind_info = NULL; + + CHECK_FOR_INTERRUPTS(); + + /* we may have some "dropped" entries not yet removed, skip them */ + Assert(!ps->dropped); + if (ps->dropped) + continue; + + shstats = (PgStatShared_Common *) dsa_get_address(pgStatLocal.dsa, ps->body); + + kind_info = pgstat_get_kind_info(ps->key.kind); + + /* if not dropped the valid-entry refcount should exist */ + Assert(pg_atomic_read_u32(&ps->refcount) > 0); - hash_seq_init(&hstat, subscriptionStatHash); - while ((subentry = (PgStat_StatSubEntry *) hash_seq_search(&hstat)) != NULL) + if (!kind_info->to_serialized_name) { + /* normal stats entry, identified by PgStat_HashKey */ fputc('S', fpout); - rc = fwrite(subentry, sizeof(PgStat_StatSubEntry), 1, fpout); - (void) rc; /* we'll check for error with ferror */ + write_chunk_s(fpout, &ps->key); } + else + { + /* stats entry identified by name on disk (e.g. slots) */ + NameData name; + + kind_info->to_serialized_name(shstats, &name); + + fputc('N', fpout); + write_chunk_s(fpout, &ps->key.kind); + write_chunk_s(fpout, &name); + } + + /* Write except the header part of the entry */ + write_chunk(fpout, + pgstat_get_entry_data(ps->key.kind, shstats), + pgstat_get_entry_len(ps->key.kind)); } + dshash_seq_term(&hstat); /* * No more output to be done. Close the temp file and replace the old * pgstat.stat with it. The ferror() check replaces testing for error - * after each individual fputc or fwrite above. + * after each individual fputc or fwrite (in write_chunk()) above. */ fputc('E', fpout); @@ -2268,1939 +1374,230 @@ pgstat_write_statsfiles(bool permanent, bool allDbs) tmpfile, statfile))); unlink(tmpfile); } +} - if (permanent) - unlink(pgstat_stat_filename); - - /* - * Now throw away the list of requests. Note that requests sent after we - * started the write are still waiting on the network socket. - */ - list_free(pending_write_requests); - pending_write_requests = NIL; -} - -/* - * return the filename for a DB stat file; filename is the output buffer, - * of length len. - */ -static void -get_dbstat_filename(bool permanent, bool tempname, Oid databaseid, - char *filename, int len) +/* helpers for pgstat_read_statsfile() */ +static bool +read_chunk(FILE *fpin, void *ptr, size_t len) { - int printed; - - /* NB -- pgstat_reset_remove_files knows about the pattern this uses */ - printed = snprintf(filename, len, "%s/db_%u.%s", - permanent ? PGSTAT_STAT_PERMANENT_DIRECTORY : - pgstat_stat_directory, - databaseid, - tempname ? "tmp" : "stat"); - if (printed >= len) - elog(ERROR, "overlength pgstat path"); + return fread(ptr, 1, len, fpin) == len; } -/* - * Write the stat file for a single database. - * - * If writing to the permanent file (happens when the collector is - * shutting down only), remove the temporary file so that backends - * starting up under a new postmaster can't read the old data before - * the new collector is ready. - */ -static void -pgstat_write_db_statsfile(PgStat_StatDBEntry *dbentry, bool permanent) -{ - HASH_SEQ_STATUS tstat; - HASH_SEQ_STATUS fstat; - PgStat_StatTabEntry *tabentry; - PgStat_StatFuncEntry *funcentry; - FILE *fpout; - int32 format_id; - Oid dbid = dbentry->databaseid; - int rc; - char tmpfile[MAXPGPATH]; - char statfile[MAXPGPATH]; - - get_dbstat_filename(permanent, true, dbid, tmpfile, MAXPGPATH); - get_dbstat_filename(permanent, false, dbid, statfile, MAXPGPATH); - - elog(DEBUG2, "writing stats file \"%s\"", statfile); - - /* - * Open the statistics temp file to write out the current values. - */ - fpout = AllocateFile(tmpfile, PG_BINARY_W); - if (fpout == NULL) - { - ereport(LOG, - (errcode_for_file_access(), - errmsg("could not open temporary statistics file \"%s\": %m", - tmpfile))); - return; - } - - /* - * Write the file header --- currently just a format ID. - */ - format_id = PGSTAT_FILE_FORMAT_ID; - rc = fwrite(&format_id, sizeof(format_id), 1, fpout); - (void) rc; /* we'll check for error with ferror */ - - /* - * Walk through the database's access stats per table. - */ - hash_seq_init(&tstat, dbentry->tables); - while ((tabentry = (PgStat_StatTabEntry *) hash_seq_search(&tstat)) != NULL) - { - fputc('T', fpout); - rc = fwrite(tabentry, sizeof(PgStat_StatTabEntry), 1, fpout); - (void) rc; /* we'll check for error with ferror */ - } - - /* - * Walk through the database's function stats table. - */ - hash_seq_init(&fstat, dbentry->functions); - while ((funcentry = (PgStat_StatFuncEntry *) hash_seq_search(&fstat)) != NULL) - { - fputc('F', fpout); - rc = fwrite(funcentry, sizeof(PgStat_StatFuncEntry), 1, fpout); - (void) rc; /* we'll check for error with ferror */ - } - - /* - * No more output to be done. Close the temp file and replace the old - * pgstat.stat with it. The ferror() check replaces testing for error - * after each individual fputc or fwrite above. - */ - fputc('E', fpout); - - if (ferror(fpout)) - { - ereport(LOG, - (errcode_for_file_access(), - errmsg("could not write temporary statistics file \"%s\": %m", - tmpfile))); - FreeFile(fpout); - unlink(tmpfile); - } - else if (FreeFile(fpout) < 0) - { - ereport(LOG, - (errcode_for_file_access(), - errmsg("could not close temporary statistics file \"%s\": %m", - tmpfile))); - unlink(tmpfile); - } - else if (rename(tmpfile, statfile) < 0) - { - ereport(LOG, - (errcode_for_file_access(), - errmsg("could not rename temporary statistics file \"%s\" to \"%s\": %m", - tmpfile, statfile))); - unlink(tmpfile); - } - - if (permanent) - { - get_dbstat_filename(false, false, dbid, statfile, MAXPGPATH); - - elog(DEBUG2, "removing temporary stats file \"%s\"", statfile); - unlink(statfile); - } -} +#define read_chunk_s(fpin, ptr) read_chunk(fpin, ptr, sizeof(*ptr)) /* - * Reads in some existing statistics collector files and returns the - * databases hash table that is the top level of the data. + * Reads in existing statistics file into the shared stats hash. * - * If 'onlydb' is not InvalidOid, it means we only want data for that DB - * plus the shared catalogs ("DB 0"). We'll still populate the DB hash - * table for all databases, but we don't bother even creating table/function - * hash tables for other databases. - * - * 'permanent' specifies reading from the permanent files not temporary ones. - * When true (happens only when the collector is starting up), remove the - * files after reading; the in-memory status is now authoritative, and the - * files would be out of date in case somebody else reads them. - * - * If a 'deep' read is requested, table/function stats are read, otherwise - * the table/function hash tables remain empty. + * This function is called in the only process that is accessing the shared + * stats so locking is not required. */ -static HTAB * -pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep) +static void +pgstat_read_statsfile(void) { - PgStat_StatDBEntry *dbentry; - PgStat_StatDBEntry dbbuf; - HASHCTL hash_ctl; - HTAB *dbhash; FILE *fpin; int32 format_id; bool found; - const char *statfile = permanent ? PGSTAT_STAT_PERMANENT_FILENAME : pgstat_stat_filename; - int i; - TimestampTz ts; - - /* - * The tables will live in pgStatLocalContext. - */ - pgstat_setup_memcxt(); - - /* - * Create the DB hashtable - */ - hash_ctl.keysize = sizeof(Oid); - hash_ctl.entrysize = sizeof(PgStat_StatDBEntry); - hash_ctl.hcxt = pgStatLocalContext; - dbhash = hash_create("Databases hash", PGSTAT_DB_HASH_SIZE, &hash_ctl, - HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); - - /* - * Clear out global, archiver, WAL and SLRU statistics so they start from - * zero in case we can't load an existing statsfile. - */ - memset(&globalStats, 0, sizeof(globalStats)); - memset(&archiverStats, 0, sizeof(archiverStats)); - memset(&walStats, 0, sizeof(walStats)); - memset(&slruStats, 0, sizeof(slruStats)); + const char *statfile = PGSTAT_STAT_PERMANENT_FILENAME; + PgStat_ShmemControl *shmem = pgStatLocal.shmem; + TimestampTz ts = GetCurrentTimestamp(); - /* - * Set the current timestamp (will be kept only in case we can't load an - * existing statsfile). - */ - ts = GetCurrentTimestamp(); - globalStats.bgwriter.stat_reset_timestamp = ts; - archiverStats.stat_reset_timestamp = ts; - walStats.stat_reset_timestamp = ts; + /* shouldn't be called from postmaster */ + Assert(IsUnderPostmaster || !IsPostmasterEnvironment); - /* - * Set the same reset timestamp for all SLRU items too. - */ - for (i = 0; i < SLRU_NUM_ELEMENTS; i++) - slruStats[i].stat_reset_timestamp = ts; + elog(DEBUG2, "reading stats file \"%s\"", statfile); /* * Try to open the stats file. If it doesn't exist, the backends simply - * return zero for anything and the collector simply starts from scratch + * returns zero for anything and statistics simply starts from scratch * with empty counters. * - * ENOENT is a possibility if the stats collector is not running or has - * not yet written the stats file the first time. Any other failure - * condition is suspicious. + * ENOENT is a possibility if stats collection was previously disabled or + * has not yet written the stats file for the first time. Any other + * failure condition is suspicious. */ if ((fpin = AllocateFile(statfile, PG_BINARY_R)) == NULL) { if (errno != ENOENT) - ereport(pgStatRunningInCollector ? LOG : WARNING, + ereport(LOG, (errcode_for_file_access(), errmsg("could not open statistics file \"%s\": %m", statfile))); - return dbhash; + pgstat_reset_after_failure(ts); + return; } /* * Verify it's of the expected format. */ - if (fread(&format_id, 1, sizeof(format_id), fpin) != sizeof(format_id) || + if (!read_chunk_s(fpin, &format_id) || format_id != PGSTAT_FILE_FORMAT_ID) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", statfile))); - goto done; - } + goto error; /* - * Read global stats struct + * XXX: The following could now be generalized to just iterate over + * pgstat_kind_infos instead of knowing about the different kinds of + * stats. */ - if (fread(&globalStats, 1, sizeof(globalStats), fpin) != sizeof(globalStats)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", statfile))); - memset(&globalStats, 0, sizeof(globalStats)); - goto done; - } /* - * In the collector, disregard the timestamp we read from the permanent - * stats file; we should be willing to write a temp stats file immediately - * upon the first request from any backend. This only matters if the old - * file's timestamp is less than PGSTAT_STAT_INTERVAL ago, but that's not - * an unusual scenario. + * Read archiver stats struct */ - if (pgStatRunningInCollector) - globalStats.stats_timestamp = 0; + if (!read_chunk_s(fpin, &shmem->archiver.stats)) + goto error; /* - * Read archiver stats struct + * Read bgwriter stats struct */ - if (fread(&archiverStats, 1, sizeof(archiverStats), fpin) != sizeof(archiverStats)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", statfile))); - memset(&archiverStats, 0, sizeof(archiverStats)); - goto done; - } + if (!read_chunk_s(fpin, &shmem->bgwriter.stats)) + goto error; /* - * Read WAL stats struct + * Read checkpointer stats struct */ - if (fread(&walStats, 1, sizeof(walStats), fpin) != sizeof(walStats)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", statfile))); - memset(&walStats, 0, sizeof(walStats)); - goto done; - } + if (!read_chunk_s(fpin, &shmem->checkpointer.stats)) + goto error; /* * Read SLRU stats struct */ - if (fread(slruStats, 1, sizeof(slruStats), fpin) != sizeof(slruStats)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", statfile))); - memset(&slruStats, 0, sizeof(slruStats)); - goto done; - } + if (!read_chunk_s(fpin, &shmem->slru.stats)) + goto error; + + /* + * Read WAL stats struct + */ + if (!read_chunk_s(fpin, &shmem->wal.stats)) + goto error; /* - * We found an existing collector stats file. Read it and put all the - * hashtable entries into place. + * We found an existing statistics file. Read it and put all the hash + * table entries into place. */ for (;;) { - switch (fgetc(fpin)) - { - /* - * 'D' A PgStat_StatDBEntry struct describing a database - * follows. - */ - case 'D': - if (fread(&dbbuf, 1, offsetof(PgStat_StatDBEntry, tables), - fpin) != offsetof(PgStat_StatDBEntry, tables)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; - } - - /* - * Add to the DB hash - */ - dbentry = (PgStat_StatDBEntry *) hash_search(dbhash, - (void *) &dbbuf.databaseid, - HASH_ENTER, - &found); - if (found) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; - } + char t = fgetc(fpin); - memcpy(dbentry, &dbbuf, sizeof(PgStat_StatDBEntry)); - dbentry->tables = NULL; - dbentry->functions = NULL; - - /* - * In the collector, disregard the timestamp we read from the - * permanent stats file; we should be willing to write a temp - * stats file immediately upon the first request from any - * backend. - */ - if (pgStatRunningInCollector) - dbentry->stats_timestamp = 0; - - /* - * Don't create tables/functions hashtables for uninteresting - * databases. - */ - if (onlydb != InvalidOid) + switch (t) + { + case 'S': + case 'N': { - if (dbbuf.databaseid != onlydb && - dbbuf.databaseid != InvalidOid) - break; - } + PgStat_HashKey key; + PgStatShared_HashEntry *p; + PgStatShared_Common *header; - hash_ctl.keysize = sizeof(Oid); - hash_ctl.entrysize = sizeof(PgStat_StatTabEntry); - hash_ctl.hcxt = pgStatLocalContext; - dbentry->tables = hash_create("Per-database table", - PGSTAT_TAB_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); - - hash_ctl.keysize = sizeof(Oid); - hash_ctl.entrysize = sizeof(PgStat_StatFuncEntry); - hash_ctl.hcxt = pgStatLocalContext; - dbentry->functions = hash_create("Per-database function", - PGSTAT_FUNCTION_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); - - /* - * If requested, read the data from the database-specific - * file. Otherwise we just leave the hashtables empty. - */ - if (deep) - pgstat_read_db_statsfile(dbentry->databaseid, - dbentry->tables, - dbentry->functions, - permanent); - - break; - - /* - * 'R' A PgStat_StatReplSlotEntry struct describing a - * replication slot follows. - */ - case 'R': - { - PgStat_StatReplSlotEntry slotbuf; - PgStat_StatReplSlotEntry *slotent; + CHECK_FOR_INTERRUPTS(); - if (fread(&slotbuf, 1, sizeof(PgStat_StatReplSlotEntry), fpin) - != sizeof(PgStat_StatReplSlotEntry)) + if (t == 'S') { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; - } + /* normal stats entry, identified by PgStat_HashKey */ + if (!read_chunk_s(fpin, &key)) + goto error; - /* Create hash table if we don't have it already. */ - if (replSlotStatHash == NULL) - { - HASHCTL hash_ctl; - - hash_ctl.keysize = sizeof(NameData); - hash_ctl.entrysize = sizeof(PgStat_StatReplSlotEntry); - hash_ctl.hcxt = pgStatLocalContext; - replSlotStatHash = hash_create("Replication slots hash", - PGSTAT_REPLSLOT_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); + if (!pgstat_is_kind_valid(key.kind)) + goto error; } + else + { + /* stats entry identified by name on disk (e.g. slots) */ + const PgStat_KindInfo *kind_info = NULL; + PgStat_Kind kind; + NameData name; - slotent = (PgStat_StatReplSlotEntry *) hash_search(replSlotStatHash, - (void *) &slotbuf.slotname, - HASH_ENTER, NULL); - memcpy(slotent, &slotbuf, sizeof(PgStat_StatReplSlotEntry)); - break; - } + if (!read_chunk_s(fpin, &kind)) + goto error; + if (!read_chunk_s(fpin, &name)) + goto error; + if (!pgstat_is_kind_valid(kind)) + goto error; - /* - * 'S' A PgStat_StatSubEntry struct describing subscription - * statistics. - */ - case 'S': - { - PgStat_StatSubEntry subbuf; - PgStat_StatSubEntry *subentry; + kind_info = pgstat_get_kind_info(kind); - if (fread(&subbuf, 1, sizeof(PgStat_StatSubEntry), fpin) - != sizeof(PgStat_StatSubEntry)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; + if (!kind_info->from_serialized_name) + goto error; + + if (!kind_info->from_serialized_name(&name, &key)) + { + /* skip over data for entry we don't care about */ + if (fseek(fpin, pgstat_get_entry_len(kind), SEEK_CUR) != 0) + goto error; + + continue; + } + + Assert(key.kind == kind); } - if (subscriptionStatHash == NULL) + /* + * This intentionally doesn't use pgstat_get_entry_ref() - + * putting all stats into checkpointer's + * pgStatEntryRefHash would be wasted effort and memory. + */ + p = dshash_find_or_insert(pgStatLocal.shared_hash, &key, &found); + + /* don't allow duplicate entries */ + if (found) { - HASHCTL hash_ctl; - - hash_ctl.keysize = sizeof(Oid); - hash_ctl.entrysize = sizeof(PgStat_StatSubEntry); - hash_ctl.hcxt = pgStatLocalContext; - subscriptionStatHash = hash_create("Subscription hash", - PGSTAT_SUBSCRIPTION_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); + dshash_release_lock(pgStatLocal.shared_hash, p); + elog(WARNING, "found duplicate stats entry %d/%u/%u", + key.kind, key.dboid, key.objoid); + goto error; } - subentry = (PgStat_StatSubEntry *) hash_search(subscriptionStatHash, - (void *) &subbuf.subid, - HASH_ENTER, NULL); + header = pgstat_init_entry(key.kind, p); + dshash_release_lock(pgStatLocal.shared_hash, p); + + if (!read_chunk(fpin, + pgstat_get_entry_data(key.kind, header), + pgstat_get_entry_len(key.kind))) + goto error; - memcpy(subentry, &subbuf, sizeof(subbuf)); break; } - case 'E': goto done; default: - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; + goto error; } } done: FreeFile(fpin); - /* If requested to read the permanent file, also get rid of it. */ - if (permanent) - { - elog(DEBUG2, "removing permanent stats file \"%s\"", statfile); - unlink(statfile); - } - - return dbhash; -} - - -/* - * Reads in the existing statistics collector file for the given database, - * filling the passed-in tables and functions hash tables. - * - * As in pgstat_read_statsfiles, if the permanent file is requested, it is - * removed after reading. - * - * Note: this code has the ability to skip storing per-table or per-function - * data, if NULL is passed for the corresponding hashtable. That's not used - * at the moment though. - */ -static void -pgstat_read_db_statsfile(Oid databaseid, HTAB *tabhash, HTAB *funchash, - bool permanent) -{ - PgStat_StatTabEntry *tabentry; - PgStat_StatTabEntry tabbuf; - PgStat_StatFuncEntry funcbuf; - PgStat_StatFuncEntry *funcentry; - FILE *fpin; - int32 format_id; - bool found; - char statfile[MAXPGPATH]; - - get_dbstat_filename(permanent, false, databaseid, statfile, MAXPGPATH); - - /* - * Try to open the stats file. If it doesn't exist, the backends simply - * return zero for anything and the collector simply starts from scratch - * with empty counters. - * - * ENOENT is a possibility if the stats collector is not running or has - * not yet written the stats file the first time. Any other failure - * condition is suspicious. - */ - if ((fpin = AllocateFile(statfile, PG_BINARY_R)) == NULL) - { - if (errno != ENOENT) - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errcode_for_file_access(), - errmsg("could not open statistics file \"%s\": %m", - statfile))); - return; - } - - /* - * Verify it's of the expected format. - */ - if (fread(&format_id, 1, sizeof(format_id), fpin) != sizeof(format_id) || - format_id != PGSTAT_FILE_FORMAT_ID) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", statfile))); - goto done; - } - - /* - * We found an existing collector stats file. Read it and put all the - * hashtable entries into place. - */ - for (;;) - { - switch (fgetc(fpin)) - { - /* - * 'T' A PgStat_StatTabEntry follows. - */ - case 'T': - if (fread(&tabbuf, 1, sizeof(PgStat_StatTabEntry), - fpin) != sizeof(PgStat_StatTabEntry)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; - } - - /* - * Skip if table data not wanted. - */ - if (tabhash == NULL) - break; - - tabentry = (PgStat_StatTabEntry *) hash_search(tabhash, - (void *) &tabbuf.tableid, - HASH_ENTER, &found); - - if (found) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; - } - - memcpy(tabentry, &tabbuf, sizeof(tabbuf)); - break; - - /* - * 'F' A PgStat_StatFuncEntry follows. - */ - case 'F': - if (fread(&funcbuf, 1, sizeof(PgStat_StatFuncEntry), - fpin) != sizeof(PgStat_StatFuncEntry)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; - } - - /* - * Skip if function data not wanted. - */ - if (funchash == NULL) - break; - - funcentry = (PgStat_StatFuncEntry *) hash_search(funchash, - (void *) &funcbuf.functionid, - HASH_ENTER, &found); - - if (found) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; - } + elog(DEBUG2, "removing permanent stats file \"%s\"", statfile); + unlink(statfile); - memcpy(funcentry, &funcbuf, sizeof(funcbuf)); - break; - - /* - * 'E' The EOF marker of a complete stats file. - */ - case 'E': - goto done; + return; - default: - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; - } - } +error: + ereport(LOG, + (errmsg("corrupted statistics file \"%s\"", statfile))); -done: - FreeFile(fpin); + /* Set the current timestamp as reset timestamp */ + pgstat_reset_after_failure(ts); - if (permanent) - { - elog(DEBUG2, "removing permanent stats file \"%s\"", statfile); - unlink(statfile); - } + goto done; } /* - * Attempt to determine the timestamp of the last db statfile write. - * Returns true if successful; the timestamp is stored in *ts. The caller must - * rely on timestamp stored in *ts iff the function returns true. - * - * This needs to be careful about handling databases for which no stats file - * exists, such as databases without a stat entry or those not yet written: - * - * - if there's a database entry in the global file, return the corresponding - * stats_timestamp value. - * - * - if there's no db stat entry (e.g. for a new or inactive database), - * there's no stats_timestamp value, but also nothing to write so we return - * the timestamp of the global statfile. + * Helper to reset / drop stats after restoring stats from disk failed, + * potentially after already loading parts. */ -static bool -pgstat_read_db_statsfile_timestamp(Oid databaseid, bool permanent, - TimestampTz *ts) +static void +pgstat_reset_after_failure(TimestampTz ts) { - PgStat_StatDBEntry dbentry; - PgStat_GlobalStats myGlobalStats; - PgStat_ArchiverStats myArchiverStats; - PgStat_WalStats myWalStats; - PgStat_SLRUStats mySLRUStats[SLRU_NUM_ELEMENTS]; - PgStat_StatReplSlotEntry myReplSlotStats; - PgStat_StatSubEntry mySubStats; - FILE *fpin; - int32 format_id; - const char *statfile = permanent ? PGSTAT_STAT_PERMANENT_FILENAME : pgstat_stat_filename; - - /* - * Try to open the stats file. As above, anything but ENOENT is worthy of - * complaining about. - */ - if ((fpin = AllocateFile(statfile, PG_BINARY_R)) == NULL) - { - if (errno != ENOENT) - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errcode_for_file_access(), - errmsg("could not open statistics file \"%s\": %m", - statfile))); - return false; - } - - /* - * Verify it's of the expected format. - */ - if (fread(&format_id, 1, sizeof(format_id), fpin) != sizeof(format_id) || - format_id != PGSTAT_FILE_FORMAT_ID) + /* reset fixed-numbered stats */ + for (int kind = PGSTAT_KIND_FIRST_VALID; kind <= PGSTAT_KIND_LAST; kind++) { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", statfile))); - FreeFile(fpin); - return false; - } + const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind); - /* - * Read global stats struct - */ - if (fread(&myGlobalStats, 1, sizeof(myGlobalStats), - fpin) != sizeof(myGlobalStats)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", statfile))); - FreeFile(fpin); - return false; - } + if (!kind_info->fixed_amount) + continue; - /* - * Read archiver stats struct - */ - if (fread(&myArchiverStats, 1, sizeof(myArchiverStats), - fpin) != sizeof(myArchiverStats)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", statfile))); - FreeFile(fpin); - return false; + kind_info->reset_all_cb(ts); } - /* - * Read WAL stats struct - */ - if (fread(&myWalStats, 1, sizeof(myWalStats), fpin) != sizeof(myWalStats)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", statfile))); - FreeFile(fpin); - return false; - } - - /* - * Read SLRU stats struct - */ - if (fread(mySLRUStats, 1, sizeof(mySLRUStats), fpin) != sizeof(mySLRUStats)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", statfile))); - FreeFile(fpin); - return false; - } - - /* By default, we're going to return the timestamp of the global file. */ - *ts = myGlobalStats.stats_timestamp; - - /* - * We found an existing collector stats file. Read it and look for a - * record for the requested database. If found, use its timestamp. - */ - for (;;) - { - switch (fgetc(fpin)) - { - /* - * 'D' A PgStat_StatDBEntry struct describing a database - * follows. - */ - case 'D': - if (fread(&dbentry, 1, offsetof(PgStat_StatDBEntry, tables), - fpin) != offsetof(PgStat_StatDBEntry, tables)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - FreeFile(fpin); - return false; - } - - /* - * If this is the DB we're looking for, save its timestamp and - * we're done. - */ - if (dbentry.databaseid == databaseid) - { - *ts = dbentry.stats_timestamp; - goto done; - } - - break; - - /* - * 'R' A PgStat_StatReplSlotEntry struct describing a - * replication slot follows. - */ - case 'R': - if (fread(&myReplSlotStats, 1, sizeof(PgStat_StatReplSlotEntry), fpin) - != sizeof(PgStat_StatReplSlotEntry)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - FreeFile(fpin); - return false; - } - break; - - /* - * 'S' A PgStat_StatSubEntry struct describing subscription - * statistics follows. - */ - case 'S': - if (fread(&mySubStats, 1, sizeof(PgStat_StatSubEntry), fpin) - != sizeof(PgStat_StatSubEntry)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - FreeFile(fpin); - return false; - } - break; - - case 'E': - goto done; - - default: - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - FreeFile(fpin); - return false; - } - } - } - -done: - FreeFile(fpin); - return true; -} - -/* - * If not already done, read the statistics collector stats file into - * some hash tables. The results will be kept until pgstat_clear_snapshot() - * is called (typically, at end of transaction). - */ -static void -backend_read_statsfile(void) -{ - TimestampTz min_ts = 0; - TimestampTz ref_ts = 0; - Oid inquiry_db; - int count; - - pgstat_assert_is_up(); - - /* already read it? */ - if (pgStatDBHash) - return; - Assert(!pgStatRunningInCollector); - - /* - * In a normal backend, we check staleness of the data for our own DB, and - * so we send MyDatabaseId in inquiry messages. In the autovac launcher, - * check staleness of the shared-catalog data, and send InvalidOid in - * inquiry messages so as not to force writing unnecessary data. - */ - if (IsAutoVacuumLauncherProcess()) - inquiry_db = InvalidOid; - else - inquiry_db = MyDatabaseId; - - /* - * Loop until fresh enough stats file is available or we ran out of time. - * The stats inquiry message is sent repeatedly in case collector drops - * it; but not every single time, as that just swamps the collector. - */ - for (count = 0; count < PGSTAT_POLL_LOOP_COUNT; count++) - { - bool ok; - TimestampTz file_ts = 0; - TimestampTz cur_ts; - - CHECK_FOR_INTERRUPTS(); - - ok = pgstat_read_db_statsfile_timestamp(inquiry_db, false, &file_ts); - - cur_ts = GetCurrentTimestamp(); - /* Calculate min acceptable timestamp, if we didn't already */ - if (count == 0 || cur_ts < ref_ts) - { - /* - * We set the minimum acceptable timestamp to PGSTAT_STAT_INTERVAL - * msec before now. This indirectly ensures that the collector - * needn't write the file more often than PGSTAT_STAT_INTERVAL. In - * an autovacuum worker, however, we want a lower delay to avoid - * using stale data, so we use PGSTAT_RETRY_DELAY (since the - * number of workers is low, this shouldn't be a problem). - * - * We don't recompute min_ts after sleeping, except in the - * unlikely case that cur_ts went backwards. So we might end up - * accepting a file a bit older than PGSTAT_STAT_INTERVAL. In - * practice that shouldn't happen, though, as long as the sleep - * time is less than PGSTAT_STAT_INTERVAL; and we don't want to - * tell the collector that our cutoff time is less than what we'd - * actually accept. - */ - ref_ts = cur_ts; - if (IsAutoVacuumWorkerProcess()) - min_ts = TimestampTzPlusMilliseconds(ref_ts, - -PGSTAT_RETRY_DELAY); - else - min_ts = TimestampTzPlusMilliseconds(ref_ts, - -PGSTAT_STAT_INTERVAL); - } - - /* - * If the file timestamp is actually newer than cur_ts, we must have - * had a clock glitch (system time went backwards) or there is clock - * skew between our processor and the stats collector's processor. - * Accept the file, but send an inquiry message anyway to make - * pgstat_recv_inquiry do a sanity check on the collector's time. - */ - if (ok && file_ts > cur_ts) - { - /* - * A small amount of clock skew between processors isn't terribly - * surprising, but a large difference is worth logging. We - * arbitrarily define "large" as 1000 msec. - */ - if (file_ts >= TimestampTzPlusMilliseconds(cur_ts, 1000)) - { - char *filetime; - char *mytime; - - /* Copy because timestamptz_to_str returns a static buffer */ - filetime = pstrdup(timestamptz_to_str(file_ts)); - mytime = pstrdup(timestamptz_to_str(cur_ts)); - ereport(LOG, - (errmsg("statistics collector's time %s is later than backend local time %s", - filetime, mytime))); - pfree(filetime); - pfree(mytime); - } - - pgstat_send_inquiry(cur_ts, min_ts, inquiry_db); - break; - } - - /* Normal acceptance case: file is not older than cutoff time */ - if (ok && file_ts >= min_ts) - break; - - /* Not there or too old, so kick the collector and wait a bit */ - if ((count % PGSTAT_INQ_LOOP_COUNT) == 0) - pgstat_send_inquiry(cur_ts, min_ts, inquiry_db); - - pg_usleep(PGSTAT_RETRY_DELAY * 1000L); - } - - if (count >= PGSTAT_POLL_LOOP_COUNT) - ereport(LOG, - (errmsg("using stale statistics instead of current ones " - "because stats collector is not responding"))); - - /* - * Autovacuum launcher wants stats about all databases, but a shallow read - * is sufficient. Regular backends want a deep read for just the tables - * they can see (MyDatabaseId + shared catalogs). - */ - if (IsAutoVacuumLauncherProcess()) - pgStatDBHash = pgstat_read_statsfiles(InvalidOid, false, false); - else - pgStatDBHash = pgstat_read_statsfiles(MyDatabaseId, false, true); -} - -/* - * Do we need to write out any stats files? - */ -static bool -pgstat_write_statsfile_needed(void) -{ - if (pending_write_requests != NIL) - return true; - - /* Everything was written recently */ - return false; -} - -/* - * Checks whether stats for a particular DB need to be written to a file. - */ -static bool -pgstat_db_requested(Oid databaseid) -{ - /* - * If any requests are outstanding at all, we should write the stats for - * shared catalogs (the "database" with OID 0). This ensures that - * backends will see up-to-date stats for shared catalogs, even though - * they send inquiry messages mentioning only their own DB. - */ - if (databaseid == InvalidOid && pending_write_requests != NIL) - return true; - - /* Search to see if there's an open request to write this database. */ - if (list_member_oid(pending_write_requests, databaseid)) - return true; - - return false; -} - - -/* ------------------------------------------------------------ - * stats collector message processing functions - * ------------------------------------------------------------ - */ - -/* - * Process stat inquiry requests. - */ -static void -pgstat_recv_inquiry(PgStat_MsgInquiry *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - - elog(DEBUG2, "received inquiry for database %u", msg->databaseid); - - /* - * If there's already a write request for this DB, there's nothing to do. - * - * Note that if a request is found, we return early and skip the below - * check for clock skew. This is okay, since the only way for a DB - * request to be present in the list is that we have been here since the - * last write round. It seems sufficient to check for clock skew once per - * write round. - */ - if (list_member_oid(pending_write_requests, msg->databaseid)) - return; - - /* - * Check to see if we last wrote this database at a time >= the requested - * cutoff time. If so, this is a stale request that was generated before - * we updated the DB file, and we don't need to do so again. - * - * If the requestor's local clock time is older than stats_timestamp, we - * should suspect a clock glitch, ie system time going backwards; though - * the more likely explanation is just delayed message receipt. It is - * worth expending a GetCurrentTimestamp call to be sure, since a large - * retreat in the system clock reading could otherwise cause us to neglect - * to update the stats file for a long time. - */ - dbentry = pgstat_get_db_entry(msg->databaseid, false); - if (dbentry == NULL) - { - /* - * We have no data for this DB. Enter a write request anyway so that - * the global stats will get updated. This is needed to prevent - * backend_read_statsfile from waiting for data that we cannot supply, - * in the case of a new DB that nobody has yet reported any stats for. - * See the behavior of pgstat_read_db_statsfile_timestamp. - */ - } - else if (msg->clock_time < dbentry->stats_timestamp) - { - TimestampTz cur_ts = GetCurrentTimestamp(); - - if (cur_ts < dbentry->stats_timestamp) - { - /* - * Sure enough, time went backwards. Force a new stats file write - * to get back in sync; but first, log a complaint. - */ - char *writetime; - char *mytime; - - /* Copy because timestamptz_to_str returns a static buffer */ - writetime = pstrdup(timestamptz_to_str(dbentry->stats_timestamp)); - mytime = pstrdup(timestamptz_to_str(cur_ts)); - ereport(LOG, - (errmsg("stats_timestamp %s is later than collector's time %s for database %u", - writetime, mytime, dbentry->databaseid))); - pfree(writetime); - pfree(mytime); - } - else - { - /* - * Nope, it's just an old request. Assuming msg's clock_time is - * >= its cutoff_time, it must be stale, so we can ignore it. - */ - return; - } - } - else if (msg->cutoff_time <= dbentry->stats_timestamp) - { - /* Stale request, ignore it */ - return; - } - - /* - * We need to write this DB, so create a request. - */ - pending_write_requests = lappend_oid(pending_write_requests, - msg->databaseid); -} - -/* - * Count what the backend has done. - */ -static void -pgstat_recv_tabstat(PgStat_MsgTabstat *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - PgStat_StatTabEntry *tabentry; - int i; - bool found; - - dbentry = pgstat_get_db_entry(msg->m_databaseid, true); - - /* - * Update database-wide stats. - */ - dbentry->n_xact_commit += (PgStat_Counter) (msg->m_xact_commit); - dbentry->n_xact_rollback += (PgStat_Counter) (msg->m_xact_rollback); - dbentry->n_block_read_time += msg->m_block_read_time; - dbentry->n_block_write_time += msg->m_block_write_time; - - dbentry->total_session_time += msg->m_session_time; - dbentry->total_active_time += msg->m_active_time; - dbentry->total_idle_in_xact_time += msg->m_idle_in_xact_time; - - /* - * Process all table entries in the message. - */ - for (i = 0; i < msg->m_nentries; i++) - { - PgStat_TableEntry *tabmsg = &(msg->m_entry[i]); - - tabentry = (PgStat_StatTabEntry *) hash_search(dbentry->tables, - (void *) &(tabmsg->t_id), - HASH_ENTER, &found); - - if (!found) - { - /* - * If it's a new table entry, initialize counters to the values we - * just got. - */ - tabentry->numscans = tabmsg->t_counts.t_numscans; - tabentry->tuples_returned = tabmsg->t_counts.t_tuples_returned; - tabentry->tuples_fetched = tabmsg->t_counts.t_tuples_fetched; - tabentry->tuples_inserted = tabmsg->t_counts.t_tuples_inserted; - tabentry->tuples_updated = tabmsg->t_counts.t_tuples_updated; - tabentry->tuples_deleted = tabmsg->t_counts.t_tuples_deleted; - tabentry->tuples_hot_updated = tabmsg->t_counts.t_tuples_hot_updated; - tabentry->n_live_tuples = tabmsg->t_counts.t_delta_live_tuples; - tabentry->n_dead_tuples = tabmsg->t_counts.t_delta_dead_tuples; - tabentry->changes_since_analyze = tabmsg->t_counts.t_changed_tuples; - tabentry->inserts_since_vacuum = tabmsg->t_counts.t_tuples_inserted; - tabentry->blocks_fetched = tabmsg->t_counts.t_blocks_fetched; - tabentry->blocks_hit = tabmsg->t_counts.t_blocks_hit; - - tabentry->vacuum_timestamp = 0; - tabentry->vacuum_count = 0; - tabentry->autovac_vacuum_timestamp = 0; - tabentry->autovac_vacuum_count = 0; - tabentry->analyze_timestamp = 0; - tabentry->analyze_count = 0; - tabentry->autovac_analyze_timestamp = 0; - tabentry->autovac_analyze_count = 0; - } - else - { - /* - * Otherwise add the values to the existing entry. - */ - tabentry->numscans += tabmsg->t_counts.t_numscans; - tabentry->tuples_returned += tabmsg->t_counts.t_tuples_returned; - tabentry->tuples_fetched += tabmsg->t_counts.t_tuples_fetched; - tabentry->tuples_inserted += tabmsg->t_counts.t_tuples_inserted; - tabentry->tuples_updated += tabmsg->t_counts.t_tuples_updated; - tabentry->tuples_deleted += tabmsg->t_counts.t_tuples_deleted; - tabentry->tuples_hot_updated += tabmsg->t_counts.t_tuples_hot_updated; - - /* - * If table was truncated/dropped, first reset the live/dead - * counters. - */ - if (tabmsg->t_counts.t_truncdropped) - { - tabentry->n_live_tuples = 0; - tabentry->n_dead_tuples = 0; - tabentry->inserts_since_vacuum = 0; - } - tabentry->n_live_tuples += tabmsg->t_counts.t_delta_live_tuples; - tabentry->n_dead_tuples += tabmsg->t_counts.t_delta_dead_tuples; - tabentry->changes_since_analyze += tabmsg->t_counts.t_changed_tuples; - tabentry->inserts_since_vacuum += tabmsg->t_counts.t_tuples_inserted; - tabentry->blocks_fetched += tabmsg->t_counts.t_blocks_fetched; - tabentry->blocks_hit += tabmsg->t_counts.t_blocks_hit; - } - - /* Clamp n_live_tuples in case of negative delta_live_tuples */ - tabentry->n_live_tuples = Max(tabentry->n_live_tuples, 0); - /* Likewise for n_dead_tuples */ - tabentry->n_dead_tuples = Max(tabentry->n_dead_tuples, 0); - - /* - * Add per-table stats to the per-database entry, too. - */ - dbentry->n_tuples_returned += tabmsg->t_counts.t_tuples_returned; - dbentry->n_tuples_fetched += tabmsg->t_counts.t_tuples_fetched; - dbentry->n_tuples_inserted += tabmsg->t_counts.t_tuples_inserted; - dbentry->n_tuples_updated += tabmsg->t_counts.t_tuples_updated; - dbentry->n_tuples_deleted += tabmsg->t_counts.t_tuples_deleted; - dbentry->n_blocks_fetched += tabmsg->t_counts.t_blocks_fetched; - dbentry->n_blocks_hit += tabmsg->t_counts.t_blocks_hit; - } -} - -/* - * Arrange for dead table removal. - */ -static void -pgstat_recv_tabpurge(PgStat_MsgTabpurge *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - int i; - - dbentry = pgstat_get_db_entry(msg->m_databaseid, false); - - /* - * No need to purge if we don't even know the database. - */ - if (!dbentry || !dbentry->tables) - return; - - /* - * Process all table entries in the message. - */ - for (i = 0; i < msg->m_nentries; i++) - { - /* Remove from hashtable if present; we don't care if it's not. */ - (void) hash_search(dbentry->tables, - (void *) &(msg->m_tableid[i]), - HASH_REMOVE, NULL); - } -} - -/* - * Arrange for dead database removal - */ -static void -pgstat_recv_dropdb(PgStat_MsgDropdb *msg, int len) -{ - Oid dbid = msg->m_databaseid; - PgStat_StatDBEntry *dbentry; - - /* - * Lookup the database in the hashtable. - */ - dbentry = pgstat_get_db_entry(dbid, false); - - /* - * If found, remove it (along with the db statfile). - */ - if (dbentry) - { - char statfile[MAXPGPATH]; - - get_dbstat_filename(false, false, dbid, statfile, MAXPGPATH); - - elog(DEBUG2, "removing stats file \"%s\"", statfile); - unlink(statfile); - - if (dbentry->tables != NULL) - hash_destroy(dbentry->tables); - if (dbentry->functions != NULL) - hash_destroy(dbentry->functions); - - if (hash_search(pgStatDBHash, - (void *) &dbid, - HASH_REMOVE, NULL) == NULL) - ereport(ERROR, - (errmsg("database hash table corrupted during cleanup --- abort"))); - } -} - -/* - * Reset the statistics for the specified database. - */ -static void -pgstat_recv_resetcounter(PgStat_MsgResetcounter *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - - /* - * Lookup the database in the hashtable. Nothing to do if not there. - */ - dbentry = pgstat_get_db_entry(msg->m_databaseid, false); - - if (!dbentry) - return; - - /* - * We simply throw away all the database's table entries by recreating a - * new hash table for them. - */ - if (dbentry->tables != NULL) - hash_destroy(dbentry->tables); - if (dbentry->functions != NULL) - hash_destroy(dbentry->functions); - - dbentry->tables = NULL; - dbentry->functions = NULL; - - /* - * Reset database-level stats, too. This creates empty hash tables for - * tables and functions. - */ - reset_dbentry_counters(dbentry); -} - -/* - * Reset some shared statistics of the cluster. - */ -static void -pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len) -{ - if (msg->m_resettarget == PGSTAT_KIND_BGWRITER || - msg->m_resettarget == PGSTAT_KIND_CHECKPOINTER) - { - /* - * Reset the global, bgwriter and checkpointer statistics for the - * cluster. - */ - memset(&globalStats, 0, sizeof(globalStats)); - globalStats.bgwriter.stat_reset_timestamp = GetCurrentTimestamp(); - } - else if (msg->m_resettarget == PGSTAT_KIND_ARCHIVER) - { - /* Reset the archiver statistics for the cluster. */ - memset(&archiverStats, 0, sizeof(archiverStats)); - archiverStats.stat_reset_timestamp = GetCurrentTimestamp(); - } - else if (msg->m_resettarget == PGSTAT_KIND_WAL) - { - /* Reset the WAL statistics for the cluster. */ - memset(&walStats, 0, sizeof(walStats)); - walStats.stat_reset_timestamp = GetCurrentTimestamp(); - } - - /* - * Presumably the sender of this message validated the target, don't - * complain here if it's not valid - */ -} - -/* - * Reset a statistics for a single object, which may be of current - * database or shared across all databases in the cluster. - */ -static void -pgstat_recv_resetsinglecounter(PgStat_MsgResetsinglecounter *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - - if (IsSharedRelation(msg->m_objectid)) - dbentry = pgstat_get_db_entry(InvalidOid, false); - else - dbentry = pgstat_get_db_entry(msg->m_databaseid, false); - - if (!dbentry) - return; - - /* Set the reset timestamp for the whole database */ - dbentry->stat_reset_timestamp = GetCurrentTimestamp(); - - /* Remove object if it exists, ignore it if not */ - if (msg->m_resettype == PGSTAT_KIND_RELATION) - (void) hash_search(dbentry->tables, (void *) &(msg->m_objectid), - HASH_REMOVE, NULL); - else if (msg->m_resettype == PGSTAT_KIND_FUNCTION) - (void) hash_search(dbentry->functions, (void *) &(msg->m_objectid), - HASH_REMOVE, NULL); -} - -/* - * Reset some SLRU statistics of the cluster. - */ -static void -pgstat_recv_resetslrucounter(PgStat_MsgResetslrucounter *msg, int len) -{ - int i; - TimestampTz ts = GetCurrentTimestamp(); - - for (i = 0; i < SLRU_NUM_ELEMENTS; i++) - { - /* reset entry with the given index, or all entries (index is -1) */ - if ((msg->m_index == -1) || (msg->m_index == i)) - { - memset(&slruStats[i], 0, sizeof(slruStats[i])); - slruStats[i].stat_reset_timestamp = ts; - } - } -} - -/* - * Reset some replication slot statistics of the cluster. - */ -static void -pgstat_recv_resetreplslotcounter(PgStat_MsgResetreplslotcounter *msg, - int len) -{ - PgStat_StatReplSlotEntry *slotent; - TimestampTz ts; - - /* Return if we don't have replication slot statistics */ - if (replSlotStatHash == NULL) - return; - - ts = GetCurrentTimestamp(); - if (msg->clearall) - { - HASH_SEQ_STATUS sstat; - - hash_seq_init(&sstat, replSlotStatHash); - while ((slotent = (PgStat_StatReplSlotEntry *) hash_seq_search(&sstat)) != NULL) - pgstat_reset_replslot_entry(slotent, ts); - } - else - { - /* Get the slot statistics to reset */ - slotent = pgstat_get_replslot_entry(msg->m_slotname, false); - - /* - * Nothing to do if the given slot entry is not found. This could - * happen when the slot with the given name is removed and the - * corresponding statistics entry is also removed before receiving the - * reset message. - */ - if (!slotent) - return; - - /* Reset the stats for the requested replication slot */ - pgstat_reset_replslot_entry(slotent, ts); - } -} - -/* - * Reset some subscription statistics of the cluster. - */ -static void -pgstat_recv_resetsubcounter(PgStat_MsgResetsubcounter *msg, int len) -{ - PgStat_StatSubEntry *subentry; - TimestampTz ts; - - /* Return if we don't have replication subscription statistics */ - if (subscriptionStatHash == NULL) - return; - - ts = GetCurrentTimestamp(); - if (!OidIsValid(msg->m_subid)) - { - HASH_SEQ_STATUS sstat; - - /* Clear all subscription counters */ - hash_seq_init(&sstat, subscriptionStatHash); - while ((subentry = (PgStat_StatSubEntry *) hash_seq_search(&sstat)) != NULL) - pgstat_reset_subscription(subentry, ts); - } - else - { - /* Get the subscription statistics to reset */ - subentry = pgstat_get_subscription_entry(msg->m_subid, false); - - /* - * Nothing to do if the given subscription entry is not found. This - * could happen when the subscription with the subid is removed and - * the corresponding statistics entry is also removed before receiving - * the reset message. - */ - if (!subentry) - return; - - /* Reset the stats for the requested subscription */ - pgstat_reset_subscription(subentry, ts); - } -} - -/* - * Process an autovacuum signaling message. - */ -static void -pgstat_recv_autovac(PgStat_MsgAutovacStart *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - - /* - * Store the last autovacuum time in the database's hashtable entry. - */ - dbentry = pgstat_get_db_entry(msg->m_databaseid, true); - - dbentry->last_autovac_time = msg->m_start_time; -} - -/* - * Process a VACUUM message. - */ -static void -pgstat_recv_vacuum(PgStat_MsgVacuum *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - PgStat_StatTabEntry *tabentry; - - /* - * Store the data in the table's hashtable entry. - */ - dbentry = pgstat_get_db_entry(msg->m_databaseid, true); - - tabentry = pgstat_get_tab_entry(dbentry, msg->m_tableoid, true); - - tabentry->n_live_tuples = msg->m_live_tuples; - tabentry->n_dead_tuples = msg->m_dead_tuples; - - /* - * It is quite possible that a non-aggressive VACUUM ended up skipping - * various pages, however, we'll zero the insert counter here regardless. - * It's currently used only to track when we need to perform an "insert" - * autovacuum, which are mainly intended to freeze newly inserted tuples. - * Zeroing this may just mean we'll not try to vacuum the table again - * until enough tuples have been inserted to trigger another insert - * autovacuum. An anti-wraparound autovacuum will catch any persistent - * stragglers. - */ - tabentry->inserts_since_vacuum = 0; - - if (msg->m_autovacuum) - { - tabentry->autovac_vacuum_timestamp = msg->m_vacuumtime; - tabentry->autovac_vacuum_count++; - } - else - { - tabentry->vacuum_timestamp = msg->m_vacuumtime; - tabentry->vacuum_count++; - } -} - -/* - * Process an ANALYZE message. - */ -static void -pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - PgStat_StatTabEntry *tabentry; - - /* - * Store the data in the table's hashtable entry. - */ - dbentry = pgstat_get_db_entry(msg->m_databaseid, true); - - tabentry = pgstat_get_tab_entry(dbentry, msg->m_tableoid, true); - - tabentry->n_live_tuples = msg->m_live_tuples; - tabentry->n_dead_tuples = msg->m_dead_tuples; - - /* - * If commanded, reset changes_since_analyze to zero. This forgets any - * changes that were committed while the ANALYZE was in progress, but we - * have no good way to estimate how many of those there were. - */ - if (msg->m_resetcounter) - tabentry->changes_since_analyze = 0; - - if (msg->m_autovacuum) - { - tabentry->autovac_analyze_timestamp = msg->m_analyzetime; - tabentry->autovac_analyze_count++; - } - else - { - tabentry->analyze_timestamp = msg->m_analyzetime; - tabentry->analyze_count++; - } -} - -/* - * Process a ARCHIVER message. - */ -static void -pgstat_recv_archiver(PgStat_MsgArchiver *msg, int len) -{ - if (msg->m_failed) - { - /* Failed archival attempt */ - ++archiverStats.failed_count; - memcpy(archiverStats.last_failed_wal, msg->m_xlog, - sizeof(archiverStats.last_failed_wal)); - archiverStats.last_failed_timestamp = msg->m_timestamp; - } - else - { - /* Successful archival operation */ - ++archiverStats.archived_count; - memcpy(archiverStats.last_archived_wal, msg->m_xlog, - sizeof(archiverStats.last_archived_wal)); - archiverStats.last_archived_timestamp = msg->m_timestamp; - } -} - -/* - * Process a BGWRITER message. - */ -static void -pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len) -{ - globalStats.bgwriter.buf_written_clean += msg->m_buf_written_clean; - globalStats.bgwriter.maxwritten_clean += msg->m_maxwritten_clean; - globalStats.bgwriter.buf_alloc += msg->m_buf_alloc; -} - -/* - * Process a CHECKPOINTER message. - */ -static void -pgstat_recv_checkpointer(PgStat_MsgCheckpointer *msg, int len) -{ - globalStats.checkpointer.timed_checkpoints += msg->m_timed_checkpoints; - globalStats.checkpointer.requested_checkpoints += msg->m_requested_checkpoints; - globalStats.checkpointer.checkpoint_write_time += msg->m_checkpoint_write_time; - globalStats.checkpointer.checkpoint_sync_time += msg->m_checkpoint_sync_time; - globalStats.checkpointer.buf_written_checkpoints += msg->m_buf_written_checkpoints; - globalStats.checkpointer.buf_written_backend += msg->m_buf_written_backend; - globalStats.checkpointer.buf_fsync_backend += msg->m_buf_fsync_backend; -} - -/* - * Process a WAL message. - */ -static void -pgstat_recv_wal(PgStat_MsgWal *msg, int len) -{ - walStats.wal_records += msg->m_wal_records; - walStats.wal_fpi += msg->m_wal_fpi; - walStats.wal_bytes += msg->m_wal_bytes; - walStats.wal_buffers_full += msg->m_wal_buffers_full; - walStats.wal_write += msg->m_wal_write; - walStats.wal_sync += msg->m_wal_sync; - walStats.wal_write_time += msg->m_wal_write_time; - walStats.wal_sync_time += msg->m_wal_sync_time; -} - -/* - * Process a SLRU message. - */ -static void -pgstat_recv_slru(PgStat_MsgSLRU *msg, int len) -{ - slruStats[msg->m_index].blocks_zeroed += msg->m_blocks_zeroed; - slruStats[msg->m_index].blocks_hit += msg->m_blocks_hit; - slruStats[msg->m_index].blocks_read += msg->m_blocks_read; - slruStats[msg->m_index].blocks_written += msg->m_blocks_written; - slruStats[msg->m_index].blocks_exists += msg->m_blocks_exists; - slruStats[msg->m_index].flush += msg->m_flush; - slruStats[msg->m_index].truncate += msg->m_truncate; -} - -/* - * Process a RECOVERYCONFLICT message. - */ -static void -pgstat_recv_recoveryconflict(PgStat_MsgRecoveryConflict *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - - dbentry = pgstat_get_db_entry(msg->m_databaseid, true); - - switch (msg->m_reason) - { - case PROCSIG_RECOVERY_CONFLICT_DATABASE: - - /* - * Since we drop the information about the database as soon as it - * replicates, there is no point in counting these conflicts. - */ - break; - case PROCSIG_RECOVERY_CONFLICT_TABLESPACE: - dbentry->n_conflict_tablespace++; - break; - case PROCSIG_RECOVERY_CONFLICT_LOCK: - dbentry->n_conflict_lock++; - break; - case PROCSIG_RECOVERY_CONFLICT_SNAPSHOT: - dbentry->n_conflict_snapshot++; - break; - case PROCSIG_RECOVERY_CONFLICT_BUFFERPIN: - dbentry->n_conflict_bufferpin++; - break; - case PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK: - dbentry->n_conflict_startup_deadlock++; - break; - } -} - -/* - * Process a DEADLOCK message. - */ -static void -pgstat_recv_deadlock(PgStat_MsgDeadlock *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - - dbentry = pgstat_get_db_entry(msg->m_databaseid, true); - - dbentry->n_deadlocks++; -} - -/* - * Process a CHECKSUMFAILURE message. - */ -static void -pgstat_recv_checksum_failure(PgStat_MsgChecksumFailure *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - - dbentry = pgstat_get_db_entry(msg->m_databaseid, true); - - dbentry->n_checksum_failures += msg->m_failurecount; - dbentry->last_checksum_failure = msg->m_failure_time; -} - -/* - * Process a REPLSLOT message. - */ -static void -pgstat_recv_replslot(PgStat_MsgReplSlot *msg, int len) -{ - if (msg->m_drop) - { - Assert(!msg->m_create); - - /* Remove the replication slot statistics with the given name */ - if (replSlotStatHash != NULL) - (void) hash_search(replSlotStatHash, - (void *) &(msg->m_slotname), - HASH_REMOVE, - NULL); - } - else - { - PgStat_StatReplSlotEntry *slotent; - - slotent = pgstat_get_replslot_entry(msg->m_slotname, true); - Assert(slotent); - - if (msg->m_create) - { - /* - * If the message for dropping the slot with the same name gets - * lost, slotent has stats for the old slot. So we initialize all - * counters at slot creation. - */ - pgstat_reset_replslot_entry(slotent, 0); - } - else - { - /* Update the replication slot statistics */ - slotent->spill_txns += msg->m_spill_txns; - slotent->spill_count += msg->m_spill_count; - slotent->spill_bytes += msg->m_spill_bytes; - slotent->stream_txns += msg->m_stream_txns; - slotent->stream_count += msg->m_stream_count; - slotent->stream_bytes += msg->m_stream_bytes; - slotent->total_txns += msg->m_total_txns; - slotent->total_bytes += msg->m_total_bytes; - } - } -} - -/* - * Process a CONNECT message. - */ -static void -pgstat_recv_connect(PgStat_MsgConnect *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - - dbentry = pgstat_get_db_entry(msg->m_databaseid, true); - dbentry->n_sessions++; -} - -/* - * Process a DISCONNECT message. - */ -static void -pgstat_recv_disconnect(PgStat_MsgDisconnect *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - - dbentry = pgstat_get_db_entry(msg->m_databaseid, true); - - switch (msg->m_cause) - { - case DISCONNECT_NOT_YET: - case DISCONNECT_NORMAL: - /* we don't collect these */ - break; - case DISCONNECT_CLIENT_EOF: - dbentry->n_sessions_abandoned++; - break; - case DISCONNECT_FATAL: - dbentry->n_sessions_fatal++; - break; - case DISCONNECT_KILLED: - dbentry->n_sessions_killed++; - break; - } -} - -/* - * Process a TEMPFILE message. - */ -static void -pgstat_recv_tempfile(PgStat_MsgTempFile *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - - dbentry = pgstat_get_db_entry(msg->m_databaseid, true); - - dbentry->n_temp_bytes += msg->m_filesize; - dbentry->n_temp_files += 1; -} - -/* - * Count what the backend has done. - */ -static void -pgstat_recv_funcstat(PgStat_MsgFuncstat *msg, int len) -{ - PgStat_FunctionEntry *funcmsg = &(msg->m_entry[0]); - PgStat_StatDBEntry *dbentry; - PgStat_StatFuncEntry *funcentry; - int i; - bool found; - - dbentry = pgstat_get_db_entry(msg->m_databaseid, true); - - /* - * Process all function entries in the message. - */ - for (i = 0; i < msg->m_nentries; i++, funcmsg++) - { - funcentry = (PgStat_StatFuncEntry *) hash_search(dbentry->functions, - (void *) &(funcmsg->f_id), - HASH_ENTER, &found); - - if (!found) - { - /* - * If it's a new function entry, initialize counters to the values - * we just got. - */ - funcentry->f_numcalls = funcmsg->f_numcalls; - funcentry->f_total_time = funcmsg->f_total_time; - funcentry->f_self_time = funcmsg->f_self_time; - } - else - { - /* - * Otherwise add the values to the existing entry. - */ - funcentry->f_numcalls += funcmsg->f_numcalls; - funcentry->f_total_time += funcmsg->f_total_time; - funcentry->f_self_time += funcmsg->f_self_time; - } - } -} - -/* - * Arrange for dead function removal. - */ -static void -pgstat_recv_funcpurge(PgStat_MsgFuncpurge *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - int i; - - dbentry = pgstat_get_db_entry(msg->m_databaseid, false); - - /* - * No need to purge if we don't even know the database. - */ - if (!dbentry || !dbentry->functions) - return; - - /* - * Process all function entries in the message. - */ - for (i = 0; i < msg->m_nentries; i++) - { - /* Remove from hashtable if present; we don't care if it's not. */ - (void) hash_search(dbentry->functions, - (void *) &(msg->m_functionid[i]), - HASH_REMOVE, NULL); - } -} - -/* - * Process a SUBSCRIPTIONDROP message. - */ -static void -pgstat_recv_subscription_drop(PgStat_MsgSubscriptionDrop *msg, int len) -{ - /* Return if we don't have replication subscription statistics */ - if (subscriptionStatHash == NULL) - return; - - /* Remove from hashtable if present; we don't care if it's not */ - (void) hash_search(subscriptionStatHash, (void *) &(msg->m_subid), - HASH_REMOVE, NULL); -} - -/* - * Process a SUBSCRIPTIONERROR message. - */ -static void -pgstat_recv_subscription_error(PgStat_MsgSubscriptionError *msg, int len) -{ - PgStat_StatSubEntry *subentry; - - /* Get the subscription stats */ - subentry = pgstat_get_subscription_entry(msg->m_subid, true); - Assert(subentry); - - if (msg->m_is_apply_error) - subentry->apply_error_count++; - else - subentry->sync_error_count++; + /* and drop variable-numbered ones */ + pgstat_drop_all_entries(); } diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 9f7034df11..d5551e0af6 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -255,7 +255,6 @@ static pid_t StartupPID = 0, WalReceiverPID = 0, AutoVacPID = 0, PgArchPID = 0, - PgStatPID = 0, SysLoggerPID = 0; /* Startup process's status */ @@ -510,7 +509,6 @@ typedef struct PGPROC *AuxiliaryProcs; PGPROC *PreparedXactProcs; PMSignalData *PMSignalState; - InheritableSocket pgStatSock; pid_t PostmasterPid; TimestampTz PgStartTime; TimestampTz PgReloadTime; @@ -645,9 +643,8 @@ PostmasterMain(int argc, char *argv[]) * CAUTION: when changing this list, check for side-effects on the signal * handling setup of child processes. See tcop/postgres.c, * bootstrap/bootstrap.c, postmaster/bgwriter.c, postmaster/walwriter.c, - * postmaster/autovacuum.c, postmaster/pgarch.c, postmaster/pgstat.c, - * postmaster/syslogger.c, postmaster/bgworker.c and - * postmaster/checkpointer.c. + * postmaster/autovacuum.c, postmaster/pgarch.c, postmaster/syslogger.c, + * postmaster/bgworker.c and postmaster/checkpointer.c. */ pqinitmask(); PG_SETMASK(&BlockSig); @@ -1384,12 +1381,6 @@ PostmasterMain(int argc, char *argv[]) */ RemovePgTempFiles(); - /* - * Initialize stats collection subsystem (this does NOT start the - * collector process!) - */ - pgstat_init(); - /* * Initialize the autovacuum subsystem (again, no process start yet) */ @@ -1845,11 +1836,6 @@ ServerLoop(void) start_autovac_launcher = false; /* signal processed */ } - /* If we have lost the stats collector, try to start a new one */ - if (PgStatPID == 0 && - (pmState == PM_RUN || pmState == PM_HOT_STANDBY)) - PgStatPID = pgstat_start(); - /* If we have lost the archiver, try to start a new one. */ if (PgArchPID == 0 && PgArchStartupAllowed()) PgArchPID = StartArchiver(); @@ -2772,8 +2758,6 @@ SIGHUP_handler(SIGNAL_ARGS) signal_child(PgArchPID, SIGHUP); if (SysLoggerPID != 0) signal_child(SysLoggerPID, SIGHUP); - if (PgStatPID != 0) - signal_child(PgStatPID, SIGHUP); /* Reload authentication config files too */ if (!load_hba()) @@ -3097,8 +3081,6 @@ reaper(SIGNAL_ARGS) AutoVacPID = StartAutoVacLauncher(); if (PgArchStartupAllowed() && PgArchPID == 0) PgArchPID = StartArchiver(); - if (PgStatPID == 0) - PgStatPID = pgstat_start(); /* workers may be scheduled to start now */ maybe_start_bgworkers(); @@ -3165,13 +3147,6 @@ reaper(SIGNAL_ARGS) SignalChildren(SIGUSR2); pmState = PM_SHUTDOWN_2; - - /* - * We can also shut down the stats collector now; there's - * nothing left for it to do. - */ - if (PgStatPID != 0) - signal_child(PgStatPID, SIGQUIT); } else { @@ -3250,22 +3225,6 @@ reaper(SIGNAL_ARGS) continue; } - /* - * Was it the statistics collector? If so, just try to start a new - * one; no need to force reset of the rest of the system. (If fail, - * we'll try again in future cycles of the main loop.) - */ - if (pid == PgStatPID) - { - PgStatPID = 0; - if (!EXIT_STATUS_0(exitstatus)) - LogChildExit(LOG, _("statistics collector process"), - pid, exitstatus); - if (pmState == PM_RUN || pmState == PM_HOT_STANDBY) - PgStatPID = pgstat_start(); - continue; - } - /* Was it the system logger? If so, try to start a new one */ if (pid == SysLoggerPID) { @@ -3707,22 +3666,6 @@ HandleChildCrash(int pid, int exitstatus, const char *procname) signal_child(PgArchPID, (SendStop ? SIGSTOP : SIGQUIT)); } - /* - * Force a power-cycle of the pgstat process too. (This isn't absolutely - * necessary, but it seems like a good idea for robustness, and it - * simplifies the state-machine logic in the case where a shutdown request - * arrives during crash processing.) - */ - if (PgStatPID != 0 && take_action) - { - ereport(DEBUG2, - (errmsg_internal("sending %s to process %d", - "SIGQUIT", - (int) PgStatPID))); - signal_child(PgStatPID, SIGQUIT); - allow_immediate_pgstat_restart(); - } - /* We do NOT restart the syslogger */ if (Shutdown != ImmediateShutdown) @@ -3934,12 +3877,10 @@ PostmasterStateMachine(void) FatalError = true; pmState = PM_WAIT_DEAD_END; - /* Kill the walsenders, archiver and stats collector too */ + /* Kill the walsenders and archiver too */ SignalChildren(SIGQUIT); if (PgArchPID != 0) signal_child(PgArchPID, SIGQUIT); - if (PgStatPID != 0) - signal_child(PgStatPID, SIGQUIT); } } } @@ -3963,8 +3904,7 @@ PostmasterStateMachine(void) { /* * PM_WAIT_DEAD_END state ends when the BackendList is entirely empty - * (ie, no dead_end children remain), and the archiver and stats - * collector are gone too. + * (ie, no dead_end children remain), and the archiver is gone too. * * The reason we wait for those two is to protect them against a new * postmaster starting conflicting subprocesses; this isn't an @@ -3974,8 +3914,7 @@ PostmasterStateMachine(void) * normal state transition leading up to PM_WAIT_DEAD_END, or during * FatalError processing. */ - if (dlist_is_empty(&BackendList) && - PgArchPID == 0 && PgStatPID == 0) + if (dlist_is_empty(&BackendList) && PgArchPID == 0) { /* These other guys should be dead already */ Assert(StartupPID == 0); @@ -4183,8 +4122,6 @@ TerminateChildren(int signal) signal_child(AutoVacPID, signal); if (PgArchPID != 0) signal_child(PgArchPID, signal); - if (PgStatPID != 0) - signal_child(PgStatPID, signal); } /* @@ -5115,12 +5052,6 @@ SubPostmasterMain(int argc, char *argv[]) StartBackgroundWorker(); } - if (strcmp(argv[1], "--forkcol") == 0) - { - /* Do not want to attach to shared memory */ - - PgstatCollectorMain(argc, argv); /* does not return */ - } if (strcmp(argv[1], "--forklog") == 0) { /* Do not want to attach to shared memory */ @@ -5224,12 +5155,6 @@ sigusr1_handler(SIGNAL_ARGS) if (CheckPostmasterSignal(PMSIGNAL_BEGIN_HOT_STANDBY) && pmState == PM_RECOVERY && Shutdown == NoShutdown) { - /* - * Likewise, start other special children as needed. - */ - Assert(PgStatPID == 0); - PgStatPID = pgstat_start(); - ereport(LOG, (errmsg("database system is ready to accept read-only connections"))); @@ -6145,7 +6070,6 @@ extern slock_t *ShmemLock; extern slock_t *ProcStructLock; extern PGPROC *AuxiliaryProcs; extern PMSignalData *PMSignalState; -extern pgsocket pgStatSock; extern pg_time_t first_syslogger_file_time; #ifndef WIN32 @@ -6201,8 +6125,6 @@ save_backend_variables(BackendParameters *param, Port *port, param->AuxiliaryProcs = AuxiliaryProcs; param->PreparedXactProcs = PreparedXactProcs; param->PMSignalState = PMSignalState; - if (!write_inheritable_socket(¶m->pgStatSock, pgStatSock, childPid)) - return false; param->PostmasterPid = PostmasterPid; param->PgStartTime = PgStartTime; @@ -6436,7 +6358,6 @@ restore_backend_variables(BackendParameters *param, Port *port) AuxiliaryProcs = param->AuxiliaryProcs; PreparedXactProcs = param->PreparedXactProcs; PMSignalState = param->PMSignalState; - read_inheritable_socket(&pgStatSock, ¶m->pgStatSock); PostmasterPid = param->PostmasterPid; PgStartTime = param->PgStartTime; @@ -6475,8 +6396,6 @@ restore_backend_variables(BackendParameters *param, Port *port) if (postmaster_alive_fds[1] >= 0) ReserveExternalFD(); #endif - if (pgStatSock != PGINVALID_SOCKET) - ReserveExternalFD(); } diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index 656ec8f555..30e33dace3 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -1911,7 +1911,6 @@ UpdateDecodingStats(LogicalDecodingContext *ctx) (long long) rb->totalTxns, (long long) rb->totalBytes); - namestrcpy(&repSlotStat.slotname, NameStr(ctx->slot->data.name)); repSlotStat.spill_txns = rb->spillTxns; repSlotStat.spill_count = rb->spillCount; repSlotStat.spill_bytes = rb->spillBytes; diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index 697fb23634..b2cb31eaad 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -141,7 +141,7 @@ finish_sync_worker(void) if (IsTransactionState()) { CommitTransactionCommand(); - pgstat_report_stat(false); + pgstat_report_stat(true); } /* And flush all writes. */ @@ -580,7 +580,7 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) if (started_tx) { CommitTransactionCommand(); - pgstat_report_stat(false); + pgstat_report_stat(true); } } @@ -1386,7 +1386,7 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) MyLogicalRepWorker->relstate, MyLogicalRepWorker->relstate_lsn); CommitTransactionCommand(); - pgstat_report_stat(false); + pgstat_report_stat(true); StartTransactionCommand(); @@ -1630,7 +1630,7 @@ AllTablesyncsReady(void) if (started_tx) { CommitTransactionCommand(); - pgstat_report_stat(false); + pgstat_report_stat(true); } /* diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index f3868b3e1f..7ade49652e 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -2937,6 +2937,12 @@ LogicalRepApplyLoop(XLogRecPtr last_received) } send_feedback(last_received, requestReply, requestReply); + + /* + * Force reporting to ensure long idle periods don't lead to + * arbitrarily delayed stats. + */ + pgstat_report_stat(true); } } diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index 2217af70d4..c35ea7c35b 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -502,6 +502,14 @@ ReplicationSlotAcquire(const char *name, bool nowait) /* We made this slot active, so it's ours now. */ MyReplicationSlot = s; + + /* + * The call to pgstat_acquire_replslot() protects against stats for + * a different slot, from before a restart or such, being present during + * pgstat_report_replslot(). + */ + if (SlotIsLogical(s)) + pgstat_acquire_replslot(s); } /* @@ -746,20 +754,10 @@ ReplicationSlotDropPtr(ReplicationSlot *slot) elog(DEBUG3, "replication slot drop: %s: removed directory", NameStr(slot->data.name)); /* - * Send a message to drop the replication slot to the stats collector. - * Since there is no guarantee of the order of message transfer on a UDP - * connection, it's possible that a message for creating a new slot - * reaches before a message for removing the old slot. We send the drop - * and create messages while holding ReplicationSlotAllocationLock to - * reduce that possibility. If the messages reached in reverse, we would - * lose one statistics update message. But the next update message will - * create the statistics for the replication slot. - * - * XXX In case, the messages for creation and drop slot of the same name - * get lost and create happens before (auto)vacuum cleans up the dead - * slot, the stats will be accumulated into the old slot. One can imagine - * having OIDs for each slot to avoid the accumulation of stats but that - * doesn't seem worth doing as in practice this won't happen frequently. + * Drop the statistics entry for the replication slot. Do this while + * holding ReplicationSlotAllocationLock so that we don't drop a + * statistics entry for another slot with the same name just created in + * another session. */ if (SlotIsLogical(slot)) pgstat_drop_replslot(slot); diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index d73a40c1bc..f80f90ac3c 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -2151,7 +2151,7 @@ BufferSync(int flags) if (SyncOneBuffer(buf_id, false, &wb_context) & BUF_WRITTEN) { TRACE_POSTGRESQL_BUFFER_SYNC_WRITTEN(buf_id); - PendingCheckpointerStats.m_buf_written_checkpoints++; + PendingCheckpointerStats.buf_written_checkpoints++; num_written++; } } @@ -2261,7 +2261,7 @@ BgBufferSync(WritebackContext *wb_context) strategy_buf_id = StrategySyncStart(&strategy_passes, &recent_alloc); /* Report buffer alloc counts to pgstat */ - PendingBgWriterStats.m_buf_alloc += recent_alloc; + PendingBgWriterStats.buf_alloc += recent_alloc; /* * If we're not running the LRU scan, just stop after doing the stats @@ -2451,7 +2451,7 @@ BgBufferSync(WritebackContext *wb_context) reusable_buffers++; if (++num_written >= bgwriter_lru_maxpages) { - PendingBgWriterStats.m_maxwritten_clean++; + PendingBgWriterStats.maxwritten_clean++; break; } } @@ -2459,7 +2459,7 @@ BgBufferSync(WritebackContext *wb_context) reusable_buffers++; } - PendingBgWriterStats.m_buf_written_clean += num_written; + PendingBgWriterStats.buf_written_clean += num_written; #ifdef BGW_DEBUG elog(DEBUG1, "bgwriter: recent_alloc=%u smoothed=%.2f delta=%ld ahead=%d density=%.2f reusable_est=%d upcoming_est=%d scanned=%d wrote=%d reusable=%d", diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c index cd4ebe2fc5..88ff59c568 100644 --- a/src/backend/storage/ipc/ipci.c +++ b/src/backend/storage/ipc/ipci.c @@ -145,6 +145,7 @@ CalculateShmemSize(int *num_semaphores) size = add_size(size, BTreeShmemSize()); size = add_size(size, SyncScanShmemSize()); size = add_size(size, AsyncShmemSize()); + size = add_size(size, StatsShmemSize()); #ifdef EXEC_BACKEND size = add_size(size, ShmemBackendArraySize()); #endif @@ -296,6 +297,7 @@ CreateSharedMemoryAndSemaphores(void) BTreeShmemInit(); SyncScanShmemInit(); AsyncShmemInit(); + StatsShmemInit(); #ifdef EXEC_BACKEND diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index 8f7f1b2f7c..c24779d0bb 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -176,7 +176,13 @@ static const char *const BuiltinTrancheNames[] = { /* LWTRANCHE_PARALLEL_APPEND: */ "ParallelAppend", /* LWTRANCHE_PER_XACT_PREDICATE_LIST: */ - "PerXactPredicateList" + "PerXactPredicateList", + /* LWTRANCHE_PGSTATS_DSA: */ + "PgStatsDSA", + /* LWTRANCHE_PGSTATS_HASH: */ + "PgStatsHash", + /* LWTRANCHE_PGSTATS_DATA: */ + "PgStatsData", }; StaticAssertDecl(lengthof(BuiltinTrancheNames) == diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 260b650f15..95dc2e2c83 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -3372,6 +3372,14 @@ ProcessInterrupts(void) IdleSessionTimeoutPending = false; } + if (IdleStatsUpdateTimeoutPending) + { + /* timer should have been disarmed */ + Assert(!IsTransactionBlock()); + IdleStatsUpdateTimeoutPending = false; + pgstat_report_stat(true); + } + if (ProcSignalBarrierPending) ProcessProcSignalBarrier(); @@ -4044,6 +4052,7 @@ PostgresMain(const char *dbname, const char *username) volatile bool send_ready_for_query = true; bool idle_in_transaction_timeout_enabled = false; bool idle_session_timeout_enabled = false; + bool idle_stats_update_timeout_enabled = false; AssertArg(dbname != NULL); AssertArg(username != NULL); @@ -4407,6 +4416,8 @@ PostgresMain(const char *dbname, const char *username) } else { + long stats_timeout; + /* * Process incoming notifies (including self-notifies), if * any, and send relevant messages to the client. Doing it @@ -4417,7 +4428,14 @@ PostgresMain(const char *dbname, const char *username) if (notifyInterruptPending) ProcessNotifyInterrupt(false); - pgstat_report_stat(false); + /* Start the idle-stats-update timer */ + stats_timeout = pgstat_report_stat(false); + if (stats_timeout > 0) + { + idle_stats_update_timeout_enabled = true; + enable_timeout_after(IDLE_STATS_UPDATE_TIMEOUT, + stats_timeout); + } set_ps_display("idle"); pgstat_report_activity(STATE_IDLE, NULL); @@ -4452,9 +4470,9 @@ PostgresMain(const char *dbname, const char *username) firstchar = ReadCommand(&input_message); /* - * (4) turn off the idle-in-transaction and idle-session timeouts, if - * active. We do this before step (5) so that any last-moment timeout - * is certain to be detected in step (5). + * (4) turn off the idle-in-transaction, idle-session and + * idle-stats-update timeouts if active. We do this before step (5) so + * that any last-moment timeout is certain to be detected in step (5). * * At most one of these timeouts will be active, so there's no need to * worry about combining the timeout.c calls into one. @@ -4469,6 +4487,11 @@ PostgresMain(const char *dbname, const char *username) disable_timeout(IDLE_SESSION_TIMEOUT, false); idle_session_timeout_enabled = false; } + if (idle_stats_update_timeout_enabled) + { + disable_timeout(IDLE_STATS_UPDATE_TIMEOUT, false); + idle_stats_update_timeout_enabled = false; + } /* * (5) disable async signal conditions again. diff --git a/src/backend/utils/activity/Makefile b/src/backend/utils/activity/Makefile index 791ba68e7e..690312308f 100644 --- a/src/backend/utils/activity/Makefile +++ b/src/backend/utils/activity/Makefile @@ -23,6 +23,7 @@ OBJS = \ pgstat_function.o \ pgstat_relation.o \ pgstat_replslot.o \ + pgstat_shmem.o \ pgstat_slru.o \ pgstat_subscription.o \ pgstat_wal.o \ diff --git a/src/backend/utils/activity/pgstat_archiver.c b/src/backend/utils/activity/pgstat_archiver.c index 09bc12070d..851726fd50 100644 --- a/src/backend/utils/activity/pgstat_archiver.c +++ b/src/backend/utils/activity/pgstat_archiver.c @@ -27,14 +27,85 @@ void pgstat_report_archiver(const char *xlog, bool failed) { - PgStat_MsgArchiver msg; - - /* - * Prepare and send the message - */ - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_ARCHIVER); - msg.m_failed = failed; - strlcpy(msg.m_xlog, xlog, sizeof(msg.m_xlog)); - msg.m_timestamp = GetCurrentTimestamp(); - pgstat_send(&msg, sizeof(msg)); + PgStatShared_Archiver *stats_shmem = &pgStatLocal.shmem->archiver; + TimestampTz now = GetCurrentTimestamp(); + + pgstat_begin_changecount_write(&stats_shmem->changecount); + + if (failed) + { + ++stats_shmem->stats.failed_count; + memcpy(&stats_shmem->stats.last_failed_wal, xlog, + sizeof(stats_shmem->stats.last_failed_wal)); + stats_shmem->stats.last_failed_timestamp = now; + } + else + { + ++stats_shmem->stats.archived_count; + memcpy(&stats_shmem->stats.last_archived_wal, xlog, + sizeof(stats_shmem->stats.last_archived_wal)); + stats_shmem->stats.last_archived_timestamp = now; + } + + pgstat_end_changecount_write(&stats_shmem->changecount); +} + +/* + * Support function for the SQL-callable pgstat* functions. Returns + * a pointer to the archiver statistics struct. + */ +PgStat_ArchiverStats * +pgstat_fetch_stat_archiver(void) +{ + pgstat_snapshot_fixed(PGSTAT_KIND_ARCHIVER); + + return &pgStatLocal.snapshot.archiver; +} + +void +pgstat_archiver_reset_all_cb(TimestampTz ts) +{ + PgStatShared_Archiver *stats_shmem = &pgStatLocal.shmem->archiver; + + /* see explanation above PgStatShared_Archiver for the reset protocol */ + LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE); + pgstat_copy_changecounted_stats(&stats_shmem->reset_offset, + &stats_shmem->stats, + sizeof(stats_shmem->stats), + &stats_shmem->changecount); + stats_shmem->stats.stat_reset_timestamp = ts; + LWLockRelease(&stats_shmem->lock); +} + +void +pgstat_archiver_snapshot_cb(void) +{ + PgStatShared_Archiver *stats_shmem = &pgStatLocal.shmem->archiver; + PgStat_ArchiverStats *stat_snap = &pgStatLocal.snapshot.archiver; + PgStat_ArchiverStats *reset_offset = &stats_shmem->reset_offset; + PgStat_ArchiverStats reset; + + pgstat_copy_changecounted_stats(stat_snap, + &stats_shmem->stats, + sizeof(stats_shmem->stats), + &stats_shmem->changecount); + + LWLockAcquire(&stats_shmem->lock, LW_SHARED); + memcpy(&reset, reset_offset, sizeof(stats_shmem->stats)); + LWLockRelease(&stats_shmem->lock); + + /* compensate by reset offsets */ + if (stat_snap->archived_count == reset.archived_count) + { + stat_snap->last_archived_wal[0] = 0; + stat_snap->last_archived_timestamp = 0; + } + stat_snap->archived_count -= reset.archived_count; + + if (stat_snap->failed_count == reset.failed_count) + { + stat_snap->last_failed_wal[0] = 0; + stat_snap->last_failed_timestamp = 0; + } + stat_snap->failed_count -= reset.failed_count; } diff --git a/src/backend/utils/activity/pgstat_bgwriter.c b/src/backend/utils/activity/pgstat_bgwriter.c index dfea88eca1..fbb1edc527 100644 --- a/src/backend/utils/activity/pgstat_bgwriter.c +++ b/src/backend/utils/activity/pgstat_bgwriter.c @@ -20,12 +20,7 @@ #include "utils/pgstat_internal.h" -/* - * BgWriter global statistics counters. Stored directly in a stats - * message structure so they can be sent without needing to copy things - * around. We assume this init to zeroes. - */ -PgStat_MsgBgWriter PendingBgWriterStats; +PgStat_BgWriterStats PendingBgWriterStats = {0}; /* @@ -34,27 +29,82 @@ PgStat_MsgBgWriter PendingBgWriterStats; void pgstat_report_bgwriter(void) { - /* We assume this initializes to zeroes */ - static const PgStat_MsgBgWriter all_zeroes; + PgStatShared_BgWriter *stats_shmem = &pgStatLocal.shmem->bgwriter; + static const PgStat_BgWriterStats all_zeroes; + Assert(!pgStatLocal.shmem->is_shutdown); pgstat_assert_is_up(); /* * This function can be called even if nothing at all has happened. In - * this case, avoid sending a completely empty message to the stats - * collector. + * this case, avoid unnecessarily modifying the stats entry. */ - if (memcmp(&PendingBgWriterStats, &all_zeroes, sizeof(PgStat_MsgBgWriter)) == 0) + if (memcmp(&PendingBgWriterStats, &all_zeroes, sizeof(all_zeroes)) == 0) return; - /* - * Prepare and send the message - */ - pgstat_setheader(&PendingBgWriterStats.m_hdr, PGSTAT_MTYPE_BGWRITER); - pgstat_send(&PendingBgWriterStats, sizeof(PendingBgWriterStats)); + pgstat_begin_changecount_write(&stats_shmem->changecount); + +#define BGWRITER_ACC(fld) stats_shmem->stats.fld += PendingBgWriterStats.fld + BGWRITER_ACC(buf_written_clean); + BGWRITER_ACC(maxwritten_clean); + BGWRITER_ACC(buf_alloc); +#undef BGWRITER_ACC + + pgstat_end_changecount_write(&stats_shmem->changecount); /* * Clear out the statistics buffer, so it can be re-used. */ MemSet(&PendingBgWriterStats, 0, sizeof(PendingBgWriterStats)); } + +/* + * Support function for the SQL-callable pgstat* functions. Returns + * a pointer to the bgwriter statistics struct. + */ +PgStat_BgWriterStats * +pgstat_fetch_stat_bgwriter(void) +{ + pgstat_snapshot_fixed(PGSTAT_KIND_BGWRITER); + + return &pgStatLocal.snapshot.bgwriter; +} + +void +pgstat_bgwriter_reset_all_cb(TimestampTz ts) +{ + PgStatShared_BgWriter *stats_shmem = &pgStatLocal.shmem->bgwriter; + + /* see explanation above PgStatShared_BgWriter for the reset protocol */ + LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE); + pgstat_copy_changecounted_stats(&stats_shmem->reset_offset, + &stats_shmem->stats, + sizeof(stats_shmem->stats), + &stats_shmem->changecount); + stats_shmem->stats.stat_reset_timestamp = ts; + LWLockRelease(&stats_shmem->lock); +} + +void +pgstat_bgwriter_snapshot_cb(void) +{ + PgStatShared_BgWriter *stats_shmem = &pgStatLocal.shmem->bgwriter; + PgStat_BgWriterStats *reset_offset = &stats_shmem->reset_offset; + PgStat_BgWriterStats reset; + + pgstat_copy_changecounted_stats(&pgStatLocal.snapshot.bgwriter, + &stats_shmem->stats, + sizeof(stats_shmem->stats), + &stats_shmem->changecount); + + LWLockAcquire(&stats_shmem->lock, LW_SHARED); + memcpy(&reset, reset_offset, sizeof(stats_shmem->stats)); + LWLockRelease(&stats_shmem->lock); + + /* compensate by reset offsets */ +#define BGWRITER_COMP(fld) pgStatLocal.snapshot.bgwriter.fld -= reset.fld; + BGWRITER_COMP(buf_written_clean); + BGWRITER_COMP(maxwritten_clean); + BGWRITER_COMP(buf_alloc); +#undef BGWRITER_COMP +} diff --git a/src/backend/utils/activity/pgstat_checkpointer.c b/src/backend/utils/activity/pgstat_checkpointer.c index 3f4e2054f5..af8d513e7b 100644 --- a/src/backend/utils/activity/pgstat_checkpointer.c +++ b/src/backend/utils/activity/pgstat_checkpointer.c @@ -20,12 +20,7 @@ #include "utils/pgstat_internal.h" -/* - * Checkpointer global statistics counters. Stored directly in a stats - * message structure so they can be sent without needing to copy things - * around. We assume this init to zeroes. - */ -PgStat_MsgCheckpointer PendingCheckpointerStats; +PgStat_CheckpointerStats PendingCheckpointerStats = {0}; /* @@ -35,24 +30,92 @@ void pgstat_report_checkpointer(void) { /* We assume this initializes to zeroes */ - static const PgStat_MsgCheckpointer all_zeroes; + static const PgStat_CheckpointerStats all_zeroes; + PgStatShared_Checkpointer *stats_shmem = &pgStatLocal.shmem->checkpointer; + + Assert(!pgStatLocal.shmem->is_shutdown); + pgstat_assert_is_up(); /* * This function can be called even if nothing at all has happened. In - * this case, avoid sending a completely empty message to the stats - * collector. + * this case, avoid unnecessarily modifying the stats entry. */ - if (memcmp(&PendingCheckpointerStats, &all_zeroes, sizeof(PgStat_MsgCheckpointer)) == 0) + if (memcmp(&PendingCheckpointerStats, &all_zeroes, + sizeof(all_zeroes)) == 0) return; - /* - * Prepare and send the message - */ - pgstat_setheader(&PendingCheckpointerStats.m_hdr, PGSTAT_MTYPE_CHECKPOINTER); - pgstat_send(&PendingCheckpointerStats, sizeof(PendingCheckpointerStats)); + pgstat_begin_changecount_write(&stats_shmem->changecount); + +#define CHECKPOINTER_ACC(fld) stats_shmem->stats.fld += PendingCheckpointerStats.fld + CHECKPOINTER_ACC(timed_checkpoints); + CHECKPOINTER_ACC(requested_checkpoints); + CHECKPOINTER_ACC(checkpoint_write_time); + CHECKPOINTER_ACC(checkpoint_sync_time); + CHECKPOINTER_ACC(buf_written_checkpoints); + CHECKPOINTER_ACC(buf_written_backend); + CHECKPOINTER_ACC(buf_fsync_backend); +#undef CHECKPOINTER_ACC + + pgstat_end_changecount_write(&stats_shmem->changecount); /* * Clear out the statistics buffer, so it can be re-used. */ MemSet(&PendingCheckpointerStats, 0, sizeof(PendingCheckpointerStats)); } + +/* + * pgstat_fetch_stat_checkpointer() - + * + * Support function for the SQL-callable pgstat* functions. Returns + * a pointer to the checkpointer statistics struct. + */ +PgStat_CheckpointerStats * +pgstat_fetch_stat_checkpointer(void) +{ + pgstat_snapshot_fixed(PGSTAT_KIND_CHECKPOINTER); + + return &pgStatLocal.snapshot.checkpointer; +} + +void +pgstat_checkpointer_reset_all_cb(TimestampTz ts) +{ + PgStatShared_Checkpointer *stats_shmem = &pgStatLocal.shmem->checkpointer; + + /* see explanation above PgStatShared_Checkpointer for the reset protocol */ + LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE); + pgstat_copy_changecounted_stats(&stats_shmem->reset_offset, + &stats_shmem->stats, + sizeof(stats_shmem->stats), + &stats_shmem->changecount); + LWLockRelease(&stats_shmem->lock); +} + +void +pgstat_checkpointer_snapshot_cb(void) +{ + PgStatShared_Checkpointer *stats_shmem = &pgStatLocal.shmem->checkpointer; + PgStat_CheckpointerStats *reset_offset = &stats_shmem->reset_offset; + PgStat_CheckpointerStats reset; + + pgstat_copy_changecounted_stats(&pgStatLocal.snapshot.checkpointer, + &stats_shmem->stats, + sizeof(stats_shmem->stats), + &stats_shmem->changecount); + + LWLockAcquire(&stats_shmem->lock, LW_SHARED); + memcpy(&reset, reset_offset, sizeof(stats_shmem->stats)); + LWLockRelease(&stats_shmem->lock); + + /* compensate by reset offsets */ +#define CHECKPOINTER_COMP(fld) pgStatLocal.snapshot.checkpointer.fld -= reset.fld; + CHECKPOINTER_COMP(timed_checkpoints); + CHECKPOINTER_COMP(requested_checkpoints); + CHECKPOINTER_COMP(checkpoint_write_time); + CHECKPOINTER_COMP(checkpoint_sync_time); + CHECKPOINTER_COMP(buf_written_checkpoints); + CHECKPOINTER_COMP(buf_written_backend); + CHECKPOINTER_COMP(buf_fsync_backend); +#undef CHECKPOINTER_COMP +} diff --git a/src/backend/utils/activity/pgstat_database.c b/src/backend/utils/activity/pgstat_database.c index 6d27657bdb..649d9c6960 100644 --- a/src/backend/utils/activity/pgstat_database.c +++ b/src/backend/utils/activity/pgstat_database.c @@ -19,13 +19,12 @@ #include "utils/pgstat_internal.h" #include "utils/timestamp.h" +#include "storage/procsignal.h" static bool pgstat_should_report_connstat(void); -int pgStatXactCommit = 0; -int pgStatXactRollback = 0; PgStat_Counter pgStatBlockReadTime = 0; PgStat_Counter pgStatBlockWriteTime = 0; PgStat_Counter pgStatActiveTime = 0; @@ -33,25 +32,18 @@ PgStat_Counter pgStatTransactionIdleTime = 0; SessionEndType pgStatSessionEndCause = DISCONNECT_NORMAL; +static int pgStatXactCommit = 0; +static int pgStatXactRollback = 0; static PgStat_Counter pgLastSessionReportTime = 0; /* - * Tell the collector that we just dropped a database. - * (If the message gets lost, we will still clean the dead DB eventually - * via future invocations of pgstat_vacuum_stat().) + * Remove entry for the database being dropped. */ void pgstat_drop_database(Oid databaseid) { - PgStat_MsgDropdb msg; - - if (pgStatSock == PGINVALID_SOCKET) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_DROPDB); - msg.m_databaseid = databaseid; - pgstat_send(&msg, sizeof(msg)); + pgstat_drop_transactional(PGSTAT_KIND_DATABASE, databaseid, InvalidOid); } /* @@ -62,16 +54,24 @@ pgstat_drop_database(Oid databaseid) void pgstat_report_autovac(Oid dboid) { - PgStat_MsgAutovacStart msg; + PgStat_EntryRef *entry_ref; + PgStatShared_Database *dbentry; - if (pgStatSock == PGINVALID_SOCKET) - return; + /* can't get here in single user mode */ + Assert(IsUnderPostmaster); + + /* + * End-of-vacuum is reported instantly. Report the start the same way for + * consistency. Vacuum doesn't run frequently and is a long-lasting + * operation so it doesn't matter if we get blocked here a little. + */ + entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_DATABASE, + dboid, InvalidOid, false); - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_AUTOVAC_START); - msg.m_databaseid = dboid; - msg.m_start_time = GetCurrentTimestamp(); + dbentry = (PgStatShared_Database *) entry_ref->shared_stats; + dbentry->stats.last_autovac_time = GetCurrentTimestamp(); - pgstat_send(&msg, sizeof(msg)); + pgstat_unlock_entry(entry_ref); } /* @@ -80,15 +80,39 @@ pgstat_report_autovac(Oid dboid) void pgstat_report_recovery_conflict(int reason) { - PgStat_MsgRecoveryConflict msg; + PgStat_StatDBEntry *dbentry; - if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) + Assert(IsUnderPostmaster); + if (!pgstat_track_counts) return; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RECOVERYCONFLICT); - msg.m_databaseid = MyDatabaseId; - msg.m_reason = reason; - pgstat_send(&msg, sizeof(msg)); + dbentry = pgstat_prep_database_pending(MyDatabaseId); + + switch (reason) + { + case PROCSIG_RECOVERY_CONFLICT_DATABASE: + + /* + * Since we drop the information about the database as soon as it + * replicates, there is no point in counting these conflicts. + */ + break; + case PROCSIG_RECOVERY_CONFLICT_TABLESPACE: + dbentry->n_conflict_tablespace++; + break; + case PROCSIG_RECOVERY_CONFLICT_LOCK: + dbentry->n_conflict_lock++; + break; + case PROCSIG_RECOVERY_CONFLICT_SNAPSHOT: + dbentry->n_conflict_snapshot++; + break; + case PROCSIG_RECOVERY_CONFLICT_BUFFERPIN: + dbentry->n_conflict_bufferpin++; + break; + case PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK: + dbentry->n_conflict_startup_deadlock++; + break; + } } /* @@ -97,14 +121,13 @@ pgstat_report_recovery_conflict(int reason) void pgstat_report_deadlock(void) { - PgStat_MsgDeadlock msg; + PgStat_StatDBEntry *dbent; - if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) + if (!pgstat_track_counts) return; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_DEADLOCK); - msg.m_databaseid = MyDatabaseId; - pgstat_send(&msg, sizeof(msg)); + dbent = pgstat_prep_database_pending(MyDatabaseId); + dbent->n_deadlocks++; } /* @@ -113,17 +136,24 @@ pgstat_report_deadlock(void) void pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount) { - PgStat_MsgChecksumFailure msg; + PgStat_EntryRef *entry_ref; + PgStatShared_Database *sharedent; - if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) + if (!pgstat_track_counts) return; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_CHECKSUMFAILURE); - msg.m_databaseid = dboid; - msg.m_failurecount = failurecount; - msg.m_failure_time = GetCurrentTimestamp(); + /* + * Update the shared stats directly - checksum failures should never be + * common enough for that to be a problem. + */ + entry_ref = + pgstat_get_entry_ref_locked(PGSTAT_KIND_DATABASE, dboid, InvalidOid, false); + + sharedent = (PgStatShared_Database *) entry_ref->shared_stats; + sharedent->stats.n_checksum_failures += failurecount; + sharedent->stats.last_checksum_failure = GetCurrentTimestamp(); - pgstat_send(&msg, sizeof(msg)); + pgstat_unlock_entry(entry_ref); } /* @@ -141,15 +171,14 @@ pgstat_report_checksum_failure(void) void pgstat_report_tempfile(size_t filesize) { - PgStat_MsgTempFile msg; + PgStat_StatDBEntry *dbent; - if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) + if (!pgstat_track_counts) return; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_TEMPFILE); - msg.m_databaseid = MyDatabaseId; - msg.m_filesize = filesize; - pgstat_send(&msg, sizeof(msg)); + dbent = pgstat_prep_database_pending(MyDatabaseId); + dbent->n_temp_bytes += filesize; + dbent->n_temp_files++; } /* @@ -158,16 +187,15 @@ pgstat_report_tempfile(size_t filesize) void pgstat_report_connect(Oid dboid) { - PgStat_MsgConnect msg; + PgStat_StatDBEntry *dbentry; if (!pgstat_should_report_connstat()) return; pgLastSessionReportTime = MyStartTimestamp; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_CONNECT); - msg.m_databaseid = MyDatabaseId; - pgstat_send(&msg, sizeof(PgStat_MsgConnect)); + dbentry = pgstat_prep_database_pending(MyDatabaseId); + dbentry->n_sessions++; } /* @@ -176,15 +204,42 @@ pgstat_report_connect(Oid dboid) void pgstat_report_disconnect(Oid dboid) { - PgStat_MsgDisconnect msg; + PgStat_StatDBEntry *dbentry; if (!pgstat_should_report_connstat()) return; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_DISCONNECT); - msg.m_databaseid = MyDatabaseId; - msg.m_cause = pgStatSessionEndCause; - pgstat_send(&msg, sizeof(PgStat_MsgDisconnect)); + dbentry = pgstat_prep_database_pending(MyDatabaseId); + + switch (pgStatSessionEndCause) + { + case DISCONNECT_NOT_YET: + case DISCONNECT_NORMAL: + /* we don't collect these */ + break; + case DISCONNECT_CLIENT_EOF: + dbentry->n_sessions_abandoned++; + break; + case DISCONNECT_FATAL: + dbentry->n_sessions_fatal++; + break; + case DISCONNECT_KILLED: + dbentry->n_sessions_killed++; + break; + } +} + +/* + * Support function for the SQL-callable pgstat* functions. Returns + * the collected statistics for one database or NULL. NULL doesn't mean + * that the database doesn't exist, just that there are no statistics, so the + * caller is better off to report ZERO instead. + */ +PgStat_StatDBEntry * +pgstat_fetch_stat_dbentry(Oid dboid) +{ + return (PgStat_StatDBEntry *) + pgstat_fetch_entry(PGSTAT_KIND_DATABASE, dboid, InvalidOid); } void @@ -205,57 +260,47 @@ AtEOXact_PgStat_Database(bool isCommit, bool parallel) } /* - * Subroutine for pgstat_send_tabstat: Handle xact commit/rollback and I/O + * Subroutine for pgstat_report_stat(): Handle xact commit/rollback and I/O * timings. */ void -pgstat_update_dbstats(PgStat_MsgTabstat *tsmsg, TimestampTz now) +pgstat_update_dbstats(TimestampTz ts) { - if (OidIsValid(tsmsg->m_databaseid)) - { - tsmsg->m_xact_commit = pgStatXactCommit; - tsmsg->m_xact_rollback = pgStatXactRollback; - tsmsg->m_block_read_time = pgStatBlockReadTime; - tsmsg->m_block_write_time = pgStatBlockWriteTime; + PgStat_StatDBEntry *dbentry; - if (pgstat_should_report_connstat()) - { - long secs; - int usecs; + dbentry = pgstat_prep_database_pending(MyDatabaseId); - /* - * pgLastSessionReportTime is initialized to MyStartTimestamp by - * pgstat_report_connect(). - */ - TimestampDifference(pgLastSessionReportTime, now, &secs, &usecs); - pgLastSessionReportTime = now; - tsmsg->m_session_time = (PgStat_Counter) secs * 1000000 + usecs; - tsmsg->m_active_time = pgStatActiveTime; - tsmsg->m_idle_in_xact_time = pgStatTransactionIdleTime; - } - else - { - tsmsg->m_session_time = 0; - tsmsg->m_active_time = 0; - tsmsg->m_idle_in_xact_time = 0; - } - pgStatXactCommit = 0; - pgStatXactRollback = 0; - pgStatBlockReadTime = 0; - pgStatBlockWriteTime = 0; - pgStatActiveTime = 0; - pgStatTransactionIdleTime = 0; - } - else + /* + * Accumulate xact commit/rollback and I/O timings to stats entry of the + * current database. + */ + dbentry->n_xact_commit += pgStatXactCommit; + dbentry->n_xact_rollback += pgStatXactRollback; + dbentry->n_block_read_time += pgStatBlockReadTime; + dbentry->n_block_write_time += pgStatBlockWriteTime; + + if (pgstat_should_report_connstat()) { - tsmsg->m_xact_commit = 0; - tsmsg->m_xact_rollback = 0; - tsmsg->m_block_read_time = 0; - tsmsg->m_block_write_time = 0; - tsmsg->m_session_time = 0; - tsmsg->m_active_time = 0; - tsmsg->m_idle_in_xact_time = 0; + long secs; + int usecs; + + /* + * pgLastSessionReportTime is initialized to MyStartTimestamp by + * pgstat_report_connect(). + */ + TimestampDifference(pgLastSessionReportTime, ts, &secs, &usecs); + pgLastSessionReportTime = ts; + dbentry->total_session_time += (PgStat_Counter) secs * 1000000 + usecs; + dbentry->total_active_time += pgStatActiveTime; + dbentry->total_idle_in_xact_time += pgStatTransactionIdleTime; } + + pgStatXactCommit = 0; + pgStatXactRollback = 0; + pgStatBlockReadTime = 0; + pgStatBlockWriteTime = 0; + pgStatActiveTime = 0; + pgStatTransactionIdleTime = 0; } /* @@ -270,3 +315,111 @@ pgstat_should_report_connstat(void) { return MyBackendType == B_BACKEND; } + +/* + * Find or create a local PgStat_StatDBEntry entry for dboid. + */ +PgStat_StatDBEntry * +pgstat_prep_database_pending(Oid dboid) +{ + PgStat_EntryRef *entry_ref; + + entry_ref = pgstat_prep_pending_entry(PGSTAT_KIND_DATABASE, dboid, InvalidOid, + NULL); + + return entry_ref->pending; + +} + +/* + * Reset the database's reset timestamp, without resetting the contents of the + * database stats. + */ +void +pgstat_reset_database_timestamp(Oid dboid, TimestampTz ts) +{ + PgStat_EntryRef *dbref; + PgStatShared_Database *dbentry; + + dbref = pgstat_get_entry_ref_locked(PGSTAT_KIND_DATABASE, MyDatabaseId, InvalidOid, + false); + + dbentry = (PgStatShared_Database *) dbref->shared_stats; + dbentry->stats.stat_reset_timestamp = ts; + + pgstat_unlock_entry(dbref); +} + +/* + * Flush out pending stats for the entry + * + * If nowait is true, this function returns false if lock could not + * immediately acquired, otherwise true is returned. + */ +bool +pgstat_database_flush_cb(PgStat_EntryRef *entry_ref, bool nowait) +{ + PgStatShared_Database *sharedent; + PgStat_StatDBEntry *pendingent; + + pendingent = (PgStat_StatDBEntry *) entry_ref->pending; + sharedent = (PgStatShared_Database *) entry_ref->shared_stats; + + if (!pgstat_lock_entry(entry_ref, nowait)) + return false; + +#define PGSTAT_ACCUM_DBCOUNT(item) \ + (sharedent)->stats.item += (pendingent)->item + + PGSTAT_ACCUM_DBCOUNT(n_xact_commit); + PGSTAT_ACCUM_DBCOUNT(n_xact_rollback); + PGSTAT_ACCUM_DBCOUNT(n_blocks_fetched); + PGSTAT_ACCUM_DBCOUNT(n_blocks_hit); + + PGSTAT_ACCUM_DBCOUNT(n_tuples_returned); + PGSTAT_ACCUM_DBCOUNT(n_tuples_fetched); + PGSTAT_ACCUM_DBCOUNT(n_tuples_inserted); + PGSTAT_ACCUM_DBCOUNT(n_tuples_updated); + PGSTAT_ACCUM_DBCOUNT(n_tuples_deleted); + + /* last_autovac_time is reported immediately */ + Assert(pendingent->last_autovac_time == 0); + + PGSTAT_ACCUM_DBCOUNT(n_conflict_tablespace); + PGSTAT_ACCUM_DBCOUNT(n_conflict_lock); + PGSTAT_ACCUM_DBCOUNT(n_conflict_snapshot); + PGSTAT_ACCUM_DBCOUNT(n_conflict_bufferpin); + PGSTAT_ACCUM_DBCOUNT(n_conflict_startup_deadlock); + + PGSTAT_ACCUM_DBCOUNT(n_temp_bytes); + PGSTAT_ACCUM_DBCOUNT(n_temp_files); + PGSTAT_ACCUM_DBCOUNT(n_deadlocks); + + /* checksum failures are reported immediately */ + Assert(pendingent->n_checksum_failures == 0); + Assert(pendingent->last_checksum_failure == 0); + + PGSTAT_ACCUM_DBCOUNT(n_block_read_time); + PGSTAT_ACCUM_DBCOUNT(n_block_write_time); + + PGSTAT_ACCUM_DBCOUNT(n_sessions); + PGSTAT_ACCUM_DBCOUNT(total_session_time); + PGSTAT_ACCUM_DBCOUNT(total_active_time); + PGSTAT_ACCUM_DBCOUNT(total_idle_in_xact_time); + PGSTAT_ACCUM_DBCOUNT(n_sessions_abandoned); + PGSTAT_ACCUM_DBCOUNT(n_sessions_fatal); + PGSTAT_ACCUM_DBCOUNT(n_sessions_killed); +#undef PGSTAT_ACCUM_DBCOUNT + + pgstat_unlock_entry(entry_ref); + + memset(pendingent, 0, sizeof(*pendingent)); + + return true; +} + +void +pgstat_database_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts) +{ + ((PgStatShared_Database *) header)->stats.stat_reset_timestamp = ts; +} diff --git a/src/backend/utils/activity/pgstat_function.c b/src/backend/utils/activity/pgstat_function.c index ad9879afb2..427d8c47fc 100644 --- a/src/backend/utils/activity/pgstat_function.c +++ b/src/backend/utils/activity/pgstat_function.c @@ -17,8 +17,10 @@ #include "postgres.h" +#include "fmgr.h" +#include "utils/inval.h" #include "utils/pgstat_internal.h" -#include "utils/timestamp.h" +#include "utils/syscache.h" /* ---------- @@ -28,18 +30,6 @@ int pgstat_track_functions = TRACK_FUNC_OFF; -/* - * Indicates if backend has some function stats that it hasn't yet - * sent to the collector. - */ -bool have_function_stats = false; - -/* - * Backends store per-function info that's waiting to be sent to the collector - * in this hash table (indexed by function OID). - */ -static HTAB *pgStatFunctions = NULL; - /* * Total time charged to functions so far in the current backend. * We use this to help separate "self" and "other" time charges. @@ -61,6 +51,10 @@ pgstat_create_function(Oid proid) /* * Ensure that stats are dropped if transaction commits. + * + * NB: This is only reliable because pgstat_init_function_usage() does some + * extra work. If other places start emitting function stats they likely need + * similar logic. */ void pgstat_drop_function(Oid proid) @@ -78,8 +72,9 @@ void pgstat_init_function_usage(FunctionCallInfo fcinfo, PgStat_FunctionCallUsage *fcu) { - PgStat_BackendFunctionEntry *htabent; - bool found; + PgStat_EntryRef *entry_ref; + PgStat_BackendFunctionEntry *pending; + bool created_entry; if (pgstat_track_functions <= fcinfo->flinfo->fn_stats) { @@ -88,29 +83,48 @@ pgstat_init_function_usage(FunctionCallInfo fcinfo, return; } - if (!pgStatFunctions) + entry_ref = pgstat_prep_pending_entry(PGSTAT_KIND_FUNCTION, + MyDatabaseId, + fcinfo->flinfo->fn_oid, + &created_entry); + + /* + * If no shared entry already exists, check if the function has been + * deleted concurrently. This can go unnoticed until here because + * executing a statement that just calls a function, does not trigger + * cache invalidation processing. The reason we care about this case is + * that otherwise we could create a new stats entry for an already dropped + * function (for relations etc this is not possible because emitting stats + * requires a lock for the relation to already have been acquired). + * + * It's somewhat ugly to have a behavioral difference based on + * track_functions being enabled/disabled. But it seems acceptable, given + * that there's already behavioral differences depending on whether the + * function is the caches etc. + * + * For correctness it'd be sufficient to set ->dropped to true. However, + * the accepted invalidation will commonly cause "low level" failures in + * PL code, with an OID in the error message. Making this harder to + * test... + */ + if (created_entry) { - /* First time through - initialize function stat table */ - HASHCTL hash_ctl; - - hash_ctl.keysize = sizeof(Oid); - hash_ctl.entrysize = sizeof(PgStat_BackendFunctionEntry); - pgStatFunctions = hash_create("Function stat entries", - PGSTAT_FUNCTION_HASH_SIZE, - &hash_ctl, - HASH_ELEM | HASH_BLOBS); + AcceptInvalidationMessages(); + if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(fcinfo->flinfo->fn_oid))) + { + pgstat_drop_entry(PGSTAT_KIND_FUNCTION, MyDatabaseId, + fcinfo->flinfo->fn_oid); + ereport(ERROR, errcode(ERRCODE_UNDEFINED_FUNCTION), + errmsg("function call to dropped function")); + } } - /* Get the stats entry for this function, create if necessary */ - htabent = hash_search(pgStatFunctions, &fcinfo->flinfo->fn_oid, - HASH_ENTER, &found); - if (!found) - MemSet(&htabent->f_counts, 0, sizeof(PgStat_FunctionCounts)); + pending = entry_ref->pending; - fcu->fs = &htabent->f_counts; + fcu->fs = &pending->f_counts; /* save stats for this function, later used to compensate for recursion */ - fcu->save_f_total_time = htabent->f_counts.f_total_time; + fcu->save_f_total_time = pending->f_counts.f_total_time; /* save current backend-wide total time */ fcu->save_total = total_func_time; @@ -167,64 +181,37 @@ pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize) fs->f_numcalls++; fs->f_total_time = f_total; INSTR_TIME_ADD(fs->f_self_time, f_self); - - /* indicate that we have something to send */ - have_function_stats = true; } /* - * Subroutine for pgstat_report_stat: populate and send a function stat message + * Flush out pending stats for the entry + * + * If nowait is true, this function returns false if lock could not + * immediately acquired, otherwise true is returned. */ -void -pgstat_send_funcstats(void) +bool +pgstat_function_flush_cb(PgStat_EntryRef *entry_ref, bool nowait) { - /* we assume this inits to all zeroes: */ - static const PgStat_FunctionCounts all_zeroes; + PgStat_BackendFunctionEntry *localent; + PgStatShared_Function *shfuncent; - PgStat_MsgFuncstat msg; - PgStat_BackendFunctionEntry *entry; - HASH_SEQ_STATUS fstat; + localent = (PgStat_BackendFunctionEntry *) entry_ref->pending; + shfuncent = (PgStatShared_Function *) entry_ref->shared_stats; - if (pgStatFunctions == NULL) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_FUNCSTAT); - msg.m_databaseid = MyDatabaseId; - msg.m_nentries = 0; - - hash_seq_init(&fstat, pgStatFunctions); - while ((entry = (PgStat_BackendFunctionEntry *) hash_seq_search(&fstat)) != NULL) - { - PgStat_FunctionEntry *m_ent; + /* localent always has non-zero content */ - /* Skip it if no counts accumulated since last time */ - if (memcmp(&entry->f_counts, &all_zeroes, - sizeof(PgStat_FunctionCounts)) == 0) - continue; - - /* need to convert format of time accumulators */ - m_ent = &msg.m_entry[msg.m_nentries]; - m_ent->f_id = entry->f_id; - m_ent->f_numcalls = entry->f_counts.f_numcalls; - m_ent->f_total_time = INSTR_TIME_GET_MICROSEC(entry->f_counts.f_total_time); - m_ent->f_self_time = INSTR_TIME_GET_MICROSEC(entry->f_counts.f_self_time); - - if (++msg.m_nentries >= PGSTAT_NUM_FUNCENTRIES) - { - pgstat_send(&msg, offsetof(PgStat_MsgFuncstat, m_entry[0]) + - msg.m_nentries * sizeof(PgStat_FunctionEntry)); - msg.m_nentries = 0; - } + if (!pgstat_lock_entry(entry_ref, nowait)) + return false; - /* reset the entry's counts */ - MemSet(&entry->f_counts, 0, sizeof(PgStat_FunctionCounts)); - } + shfuncent->stats.f_numcalls += localent->f_counts.f_numcalls; + shfuncent->stats.f_total_time += + INSTR_TIME_GET_MICROSEC(localent->f_counts.f_total_time); + shfuncent->stats.f_self_time += + INSTR_TIME_GET_MICROSEC(localent->f_counts.f_self_time); - if (msg.m_nentries > 0) - pgstat_send(&msg, offsetof(PgStat_MsgFuncstat, m_entry[0]) + - msg.m_nentries * sizeof(PgStat_FunctionEntry)); + pgstat_unlock_entry(entry_ref); - have_function_stats = false; + return true; } /* @@ -235,12 +222,22 @@ pgstat_send_funcstats(void) PgStat_BackendFunctionEntry * find_funcstat_entry(Oid func_id) { - pgstat_assert_is_up(); + PgStat_EntryRef *entry_ref; - if (pgStatFunctions == NULL) - return NULL; + entry_ref = pgstat_fetch_pending_entry(PGSTAT_KIND_FUNCTION, MyDatabaseId, func_id); + + if (entry_ref) + return entry_ref->pending; + return NULL; +} - return (PgStat_BackendFunctionEntry *) hash_search(pgStatFunctions, - (void *) &func_id, - HASH_FIND, NULL); +/* + * Support function for the SQL-callable pgstat* functions. Returns + * the collected statistics for one function or NULL. + */ +PgStat_StatFuncEntry * +pgstat_fetch_stat_funcentry(Oid func_id) +{ + return (PgStat_StatFuncEntry *) + pgstat_fetch_entry(PGSTAT_KIND_FUNCTION, MyDatabaseId, func_id); } diff --git a/src/backend/utils/activity/pgstat_relation.c b/src/backend/utils/activity/pgstat_relation.c index 51a87b6673..bec190c589 100644 --- a/src/backend/utils/activity/pgstat_relation.c +++ b/src/backend/utils/activity/pgstat_relation.c @@ -19,6 +19,7 @@ #include "access/twophase_rmgr.h" #include "access/xact.h" +#include "catalog/partition.h" #include "postmaster/autovacuum.h" #include "utils/memutils.h" #include "utils/pgstat_internal.h" @@ -26,38 +27,6 @@ #include "utils/timestamp.h" -/* - * Structures in which backends store per-table info that's waiting to be - * sent to the collector. - * - * NOTE: once allocated, TabStatusArray structures are never moved or deleted - * for the life of the backend. Also, we zero out the t_id fields of the - * contained PgStat_TableStatus structs whenever they are not actively in use. - * This allows relcache pgstat_info pointers to be treated as long-lived data, - * avoiding repeated searches in pgstat_init_relation() when a relation is - * repeatedly opened during a transaction. - */ -#define TABSTAT_QUANTUM 100 /* we alloc this many at a time */ - - -typedef struct TabStatusArray -{ - struct TabStatusArray *tsa_next; /* link to next array, if any */ - int tsa_used; /* # entries currently used */ - PgStat_TableStatus tsa_entries[TABSTAT_QUANTUM]; /* per-table data */ -} TabStatusArray; - -static TabStatusArray *pgStatTabList = NULL; - -/* - * pgStatTabHash entry: map from relation OID to PgStat_TableStatus pointer - */ -typedef struct TabStatHashEntry -{ - Oid t_id; - PgStat_TableStatus *tsa_entry; -} TabStatHashEntry; - /* Record that's written to 2PC state file when pgstat state is persisted */ typedef struct TwoPhasePgStatRecord { @@ -74,27 +43,13 @@ typedef struct TwoPhasePgStatRecord } TwoPhasePgStatRecord; -static PgStat_TableStatus *get_tabstat_entry(Oid rel_id, bool isshared); -static void pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg, TimestampTz now); +static PgStat_TableStatus *pgstat_prep_relation_pending(Oid rel_id, bool isshared); static void add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level); static void ensure_tabstat_xact_level(PgStat_TableStatus *pgstat_info); static void save_truncdrop_counters(PgStat_TableXactStatus *trans, bool is_drop); static void restore_truncdrop_counters(PgStat_TableXactStatus *trans); -/* - * Indicates if backend has some relation stats that it hasn't yet - * sent to the collector. - */ -bool have_relation_stats; - - -/* - * Hash table for O(1) t_id -> tsa_entry lookup - */ -static HTAB *pgStatTabHash = NULL; - - /* * Copy stats between relations. This is used for things like REINDEX * CONCURRENTLY. @@ -103,43 +58,39 @@ void pgstat_copy_relation_stats(Relation dst, Relation src) { PgStat_StatTabEntry *srcstats; + PgStatShared_Relation *dstshstats; + PgStat_EntryRef *dst_ref; - srcstats = pgstat_fetch_stat_tabentry(RelationGetRelid(src)); - + srcstats = pgstat_fetch_stat_tabentry_ext(src->rd_rel->relisshared, + RelationGetRelid(src)); if (!srcstats) return; - if (pgstat_should_count_relation(dst)) - { - /* - * XXX: temporarily this does not actually quite do what the name - * says, and just copy index related fields. A subsequent commit will - * do more. - */ - - dst->pgstat_info->t_counts.t_numscans = srcstats->numscans; - dst->pgstat_info->t_counts.t_tuples_returned = srcstats->tuples_returned; - dst->pgstat_info->t_counts.t_tuples_fetched = srcstats->tuples_fetched; - dst->pgstat_info->t_counts.t_blocks_fetched = srcstats->blocks_fetched; - dst->pgstat_info->t_counts.t_blocks_hit = srcstats->blocks_hit; - - /* the data will be sent by the next pgstat_report_stat() call */ - } + dst_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_RELATION, + dst->rd_rel->relisshared ? InvalidOid : MyDatabaseId, + RelationGetRelid(dst), + false); + + dstshstats = (PgStatShared_Relation *) dst_ref->shared_stats; + dstshstats->stats = *srcstats; + + pgstat_unlock_entry(dst_ref); } /* - * Initialize a relcache entry to count access statistics. - * Called whenever a relation is opened. + * Initialize a relcache entry to count access statistics. Called whenever a + * relation is opened. * - * We assume that a relcache entry's pgstat_info field is zeroed by - * relcache.c when the relcache entry is made; thereafter it is long-lived - * data. We can avoid repeated searches of the TabStatus arrays when the - * same relation is touched repeatedly within a transaction. + * We assume that a relcache entry's pgstat_info field is zeroed by relcache.c + * when the relcache entry is made; thereafter it is long-lived data. + * + * This does not create a reference to a stats entry in shared memory, nor + * allocate memory for the pending stats. That happens in + * pgstat_assoc_relation(). */ void pgstat_init_relation(Relation rel) { - Oid rel_id = rel->rd_id; char relkind = rel->rd_rel->relkind; /* @@ -147,27 +98,68 @@ pgstat_init_relation(Relation rel) */ if (!RELKIND_HAS_STORAGE(relkind) && relkind != RELKIND_PARTITIONED_TABLE) { + rel->pgstat_enabled = false; rel->pgstat_info = NULL; return; } - if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) + if (!pgstat_track_counts) { + if (rel->pgstat_info) + pgstat_unlink_relation(rel); + /* We're not counting at all */ + rel->pgstat_enabled = false; rel->pgstat_info = NULL; return; } - /* - * If we already set up this relation in the current transaction, nothing - * to do. - */ - if (rel->pgstat_info != NULL && - rel->pgstat_info->t_id == rel_id) - return; + rel->pgstat_enabled = true; +} + +/* + * Prepare for statistics for this relation to be collected. + * + * This ensures we have a reference to the stats entry before stats can be + * generated. That is important because a relation drop in another connection + * could otherwise lead to the stats entry being dropped, which then later + * would get recreated when flushing stats. + * + * This is separate from pgstat_init_relation() as it is not uncommon for + * relcache entries to be opened without ever getting stats reported. + */ +void +pgstat_assoc_relation(Relation rel) +{ + Assert(rel->pgstat_enabled); + Assert(rel->pgstat_info == NULL); /* Else find or make the PgStat_TableStatus entry, and update link */ - rel->pgstat_info = get_tabstat_entry(rel_id, rel->rd_rel->relisshared); + rel->pgstat_info = pgstat_prep_relation_pending(RelationGetRelid(rel), + rel->rd_rel->relisshared); + + /* don't allow link a stats to multiple relcache entries */ + Assert(rel->pgstat_info->relation == NULL); + + /* mark this relation as the owner */ + rel->pgstat_info->relation = rel; +} + +/* + * Break the mutual link between a relcache entry and pending stats entry. + * This must be called whenever one end of the link is removed. + */ +void +pgstat_unlink_relation(Relation rel) +{ + /* remove the link to stats info if any */ + if (rel->pgstat_info == NULL) + return; + + /* link sanity check */ + Assert(rel->pgstat_info->relation == rel); + rel->pgstat_info->relation = NULL; + rel->pgstat_info = NULL; } /* @@ -187,9 +179,26 @@ pgstat_create_relation(Relation rel) void pgstat_drop_relation(Relation rel) { + int nest_level = GetCurrentTransactionNestLevel(); + PgStat_TableStatus *pgstat_info = rel->pgstat_info; + pgstat_drop_transactional(PGSTAT_KIND_RELATION, rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId, RelationGetRelid(rel)); + + /* + * Transactionally set counters to 0. That ensures that accesses to + * pg_stat_xact_all_tables inside the transaction show 0. + */ + if (pgstat_info && + pgstat_info->trans != NULL && + pgstat_info->trans->nest_level == nest_level) + { + save_truncdrop_counters(pgstat_info->trans, true); + pgstat_info->trans->tuples_inserted = 0; + pgstat_info->trans->tuples_updated = 0; + pgstat_info->trans->tuples_deleted = 0; + } } /* @@ -199,19 +208,52 @@ void pgstat_report_vacuum(Oid tableoid, bool shared, PgStat_Counter livetuples, PgStat_Counter deadtuples) { - PgStat_MsgVacuum msg; + PgStat_EntryRef *entry_ref; + PgStatShared_Relation *shtabentry; + PgStat_StatTabEntry *tabentry; + Oid dboid = (shared ? InvalidOid : MyDatabaseId); + TimestampTz ts; - if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) + if (!pgstat_track_counts) return; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_VACUUM); - msg.m_databaseid = shared ? InvalidOid : MyDatabaseId; - msg.m_tableoid = tableoid; - msg.m_autovacuum = IsAutoVacuumWorkerProcess(); - msg.m_vacuumtime = GetCurrentTimestamp(); - msg.m_live_tuples = livetuples; - msg.m_dead_tuples = deadtuples; - pgstat_send(&msg, sizeof(msg)); + /* Store the data in the table's hash table entry. */ + ts = GetCurrentTimestamp(); + + /* block acquiring lock for the same reason as pgstat_report_autovac() */ + entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_RELATION, + dboid, tableoid, false); + + shtabentry = (PgStatShared_Relation *) entry_ref->shared_stats; + tabentry = &shtabentry->stats; + + tabentry->n_live_tuples = livetuples; + tabentry->n_dead_tuples = deadtuples; + + /* + * It is quite possible that a non-aggressive VACUUM ended up skipping + * various pages, however, we'll zero the insert counter here regardless. + * It's currently used only to track when we need to perform an "insert" + * autovacuum, which are mainly intended to freeze newly inserted tuples. + * Zeroing this may just mean we'll not try to vacuum the table again + * until enough tuples have been inserted to trigger another insert + * autovacuum. An anti-wraparound autovacuum will catch any persistent + * stragglers. + */ + tabentry->inserts_since_vacuum = 0; + + if (IsAutoVacuumWorkerProcess()) + { + tabentry->autovac_vacuum_timestamp = ts; + tabentry->autovac_vacuum_count++; + } + else + { + tabentry->vacuum_timestamp = ts; + tabentry->vacuum_count++; + } + + pgstat_unlock_entry(entry_ref); } /* @@ -225,9 +267,12 @@ pgstat_report_analyze(Relation rel, PgStat_Counter livetuples, PgStat_Counter deadtuples, bool resetcounter) { - PgStat_MsgAnalyze msg; + PgStat_EntryRef *entry_ref; + PgStatShared_Relation *shtabentry; + PgStat_StatTabEntry *tabentry; + Oid dboid = (rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId); - if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts) + if (!pgstat_track_counts) return; /* @@ -259,15 +304,39 @@ pgstat_report_analyze(Relation rel, deadtuples = Max(deadtuples, 0); } - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_ANALYZE); - msg.m_databaseid = rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId; - msg.m_tableoid = RelationGetRelid(rel); - msg.m_autovacuum = IsAutoVacuumWorkerProcess(); - msg.m_resetcounter = resetcounter; - msg.m_analyzetime = GetCurrentTimestamp(); - msg.m_live_tuples = livetuples; - msg.m_dead_tuples = deadtuples; - pgstat_send(&msg, sizeof(msg)); + /* block acquiring lock for the same reason as pgstat_report_autovac() */ + entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_RELATION, dboid, + RelationGetRelid(rel), + false); + /* can't get dropped while accessed */ + Assert(entry_ref != NULL && entry_ref->shared_stats != NULL); + + shtabentry = (PgStatShared_Relation *) entry_ref->shared_stats; + tabentry = &shtabentry->stats; + + tabentry->n_live_tuples = livetuples; + tabentry->n_dead_tuples = deadtuples; + + /* + * If commanded, reset changes_since_analyze to zero. This forgets any + * changes that were committed while the ANALYZE was in progress, but we + * have no good way to estimate how many of those there were. + */ + if (resetcounter) + tabentry->changes_since_analyze = 0; + + if (IsAutoVacuumWorkerProcess()) + { + tabentry->autovac_analyze_timestamp = GetCurrentTimestamp(); + tabentry->autovac_analyze_count++; + } + else + { + tabentry->analyze_timestamp = GetCurrentTimestamp(); + tabentry->analyze_count++; + } + + pgstat_unlock_entry(entry_ref); } /* @@ -356,30 +425,61 @@ pgstat_update_heap_dead_tuples(Relation rel, int delta) } } +/* + * Support function for the SQL-callable pgstat* functions. Returns + * the collected statistics for one table or NULL. NULL doesn't mean + * that the table doesn't exist, just that there are no statistics, so the + * caller is better off to report ZERO instead. + */ +PgStat_StatTabEntry * +pgstat_fetch_stat_tabentry(Oid relid) +{ + PgStat_StatTabEntry *tabentry; + + tabentry = pgstat_fetch_stat_tabentry_ext(false, relid); + if (tabentry != NULL) + return tabentry; + + /* + * If we didn't find it, maybe it's a shared table. + */ + tabentry = pgstat_fetch_stat_tabentry_ext(true, relid); + return tabentry; +} + +/* + * More efficient version of pgstat_fetch_stat_tabentry(), allowing to specify + * whether the to-be-accessed table is a shared relation or not. + */ +PgStat_StatTabEntry * +pgstat_fetch_stat_tabentry_ext(bool shared, Oid reloid) +{ + Oid dboid = (shared ? InvalidOid : MyDatabaseId); + + return (PgStat_StatTabEntry *) + pgstat_fetch_entry(PGSTAT_KIND_RELATION, dboid, reloid); +} + /* * find any existing PgStat_TableStatus entry for rel * - * If no entry, return NULL, don't create a new one + * Find any existing PgStat_TableStatus entry for rel_id in the current + * database. If not found, try finding from shared tables. * - * Note: if we got an error in the most recent execution of pgstat_report_stat, - * it's possible that an entry exists but there's no hashtable entry for it. - * That's okay, we'll treat this case as "doesn't exist". + * If no entry found, return NULL, don't create a new one */ PgStat_TableStatus * find_tabstat_entry(Oid rel_id) { - TabStatHashEntry *hash_entry; + PgStat_EntryRef *entry_ref; - /* If hashtable doesn't exist, there are no entries at all */ - if (!pgStatTabHash) - return NULL; + entry_ref = pgstat_fetch_pending_entry(PGSTAT_KIND_RELATION, MyDatabaseId, rel_id); + if (!entry_ref) + entry_ref = pgstat_fetch_pending_entry(PGSTAT_KIND_RELATION, InvalidOid, rel_id); - hash_entry = hash_search(pgStatTabHash, &rel_id, HASH_FIND, NULL); - if (!hash_entry) - return NULL; - - /* Note that this step could also return NULL, but that's correct */ - return hash_entry->tsa_entry; + if (entry_ref) + return entry_ref->pending; + return NULL; } /* @@ -536,7 +636,7 @@ AtPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state) for (trans = xact_state->first; trans != NULL; trans = trans->next) { - PgStat_TableStatus *tabstat; + PgStat_TableStatus *tabstat PG_USED_FOR_ASSERTS_ONLY; TwoPhasePgStatRecord record; Assert(trans->nest_level == 1); @@ -594,7 +694,7 @@ pgstat_twophase_postcommit(TransactionId xid, uint16 info, PgStat_TableStatus *pgstat_info; /* Find or create a tabstat entry for the rel */ - pgstat_info = get_tabstat_entry(rec->t_id, rec->t_shared); + pgstat_info = pgstat_prep_relation_pending(rec->t_id, rec->t_shared); /* Same math as in AtEOXact_PgStat, commit case */ pgstat_info->t_counts.t_tuples_inserted += rec->tuples_inserted; @@ -630,7 +730,7 @@ pgstat_twophase_postabort(TransactionId xid, uint16 info, PgStat_TableStatus *pgstat_info; /* Find or create a tabstat entry for the rel */ - pgstat_info = get_tabstat_entry(rec->t_id, rec->t_shared); + pgstat_info = pgstat_prep_relation_pending(rec->t_id, rec->t_shared); /* Same math as in AtEOXact_PgStat, abort case */ if (rec->t_truncdropped) @@ -647,204 +747,116 @@ pgstat_twophase_postabort(TransactionId xid, uint16 info, } /* - * Subroutine for pgstat_report_stat: Send relation statistics + * Flush out pending stats for the entry + * + * If nowait is true, this function returns false if lock could not + * immediately acquired, otherwise true is returned. + * + * Some of the stats are copied to the corresponding pending database stats + * entry when successfully flushing. */ -void -pgstat_send_tabstats(TimestampTz now, bool disconnect) +bool +pgstat_relation_flush_cb(PgStat_EntryRef *entry_ref, bool nowait) { - /* we assume this inits to all zeroes: */ static const PgStat_TableCounts all_zeroes; - PgStat_MsgTabstat regular_msg; - PgStat_MsgTabstat shared_msg; - TabStatusArray *tsa; - int i; + Oid dboid; + PgStat_TableStatus *lstats; /* pending stats entry */ + PgStatShared_Relation *shtabstats; + PgStat_StatTabEntry *tabentry; /* table entry of shared stats */ + PgStat_StatDBEntry *dbentry; /* pending database entry */ - /* - * Destroy pgStatTabHash before we start invalidating PgStat_TableEntry - * entries it points to. (Should we fail partway through the loop below, - * it's okay to have removed the hashtable already --- the only - * consequence is we'd get multiple entries for the same table in the - * pgStatTabList, and that's safe.) - */ - if (pgStatTabHash) - hash_destroy(pgStatTabHash); - pgStatTabHash = NULL; + dboid = entry_ref->shared_entry->key.dboid; + lstats = (PgStat_TableStatus *) entry_ref->pending; + shtabstats = (PgStatShared_Relation *) entry_ref->shared_stats; /* - * Scan through the TabStatusArray struct(s) to find tables that actually - * have counts, and build messages to send. We have to separate shared - * relations from regular ones because the databaseid field in the message - * header has to depend on that. + * Ignore entries that didn't accumulate any actual counts, such as + * indexes that were opened by the planner but not used. */ - regular_msg.m_databaseid = MyDatabaseId; - shared_msg.m_databaseid = InvalidOid; - regular_msg.m_nentries = 0; - shared_msg.m_nentries = 0; - - for (tsa = pgStatTabList; tsa != NULL; tsa = tsa->tsa_next) + if (memcmp(&lstats->t_counts, &all_zeroes, + sizeof(PgStat_TableCounts)) == 0) { - for (i = 0; i < tsa->tsa_used; i++) - { - PgStat_TableStatus *entry = &tsa->tsa_entries[i]; - PgStat_MsgTabstat *this_msg; - PgStat_TableEntry *this_ent; + return true; + } - /* Shouldn't have any pending transaction-dependent counts */ - Assert(entry->trans == NULL); + if (!pgstat_lock_entry(entry_ref, nowait)) + return false; - /* - * Ignore entries that didn't accumulate any actual counts, such - * as indexes that were opened by the planner but not used. - */ - if (memcmp(&entry->t_counts, &all_zeroes, - sizeof(PgStat_TableCounts)) == 0) - continue; + /* add the values to the shared entry. */ + tabentry = &shtabstats->stats; - /* - * OK, insert data into the appropriate message, and send if full. - */ - this_msg = entry->t_shared ? &shared_msg : ®ular_msg; - this_ent = &this_msg->m_entry[this_msg->m_nentries]; - this_ent->t_id = entry->t_id; - memcpy(&this_ent->t_counts, &entry->t_counts, - sizeof(PgStat_TableCounts)); - if (++this_msg->m_nentries >= PGSTAT_NUM_TABENTRIES) - { - pgstat_send_tabstat(this_msg, now); - this_msg->m_nentries = 0; - } - } - /* zero out PgStat_TableStatus structs after use */ - MemSet(tsa->tsa_entries, 0, - tsa->tsa_used * sizeof(PgStat_TableStatus)); - tsa->tsa_used = 0; - } + tabentry->numscans += lstats->t_counts.t_numscans; + tabentry->tuples_returned += lstats->t_counts.t_tuples_returned; + tabentry->tuples_fetched += lstats->t_counts.t_tuples_fetched; + tabentry->tuples_inserted += lstats->t_counts.t_tuples_inserted; + tabentry->tuples_updated += lstats->t_counts.t_tuples_updated; + tabentry->tuples_deleted += lstats->t_counts.t_tuples_deleted; + tabentry->tuples_hot_updated += lstats->t_counts.t_tuples_hot_updated; /* - * Send partial messages. Make sure that any pending xact commit/abort - * and connection stats get counted, even if there are no table stats to - * send. + * If table was truncated/dropped, first reset the live/dead counters. */ - if (regular_msg.m_nentries > 0 || - pgStatXactCommit > 0 || pgStatXactRollback > 0 || disconnect) - pgstat_send_tabstat(®ular_msg, now); - if (shared_msg.m_nentries > 0) - pgstat_send_tabstat(&shared_msg, now); + if (lstats->t_counts.t_truncdropped) + { + tabentry->n_live_tuples = 0; + tabentry->n_dead_tuples = 0; + tabentry->inserts_since_vacuum = 0; + } - have_relation_stats = false; + tabentry->n_live_tuples += lstats->t_counts.t_delta_live_tuples; + tabentry->n_dead_tuples += lstats->t_counts.t_delta_dead_tuples; + tabentry->changes_since_analyze += lstats->t_counts.t_changed_tuples; + tabentry->inserts_since_vacuum += lstats->t_counts.t_tuples_inserted; + tabentry->blocks_fetched += lstats->t_counts.t_blocks_fetched; + tabentry->blocks_hit += lstats->t_counts.t_blocks_hit; + + /* Clamp n_live_tuples in case of negative delta_live_tuples */ + tabentry->n_live_tuples = Max(tabentry->n_live_tuples, 0); + /* Likewise for n_dead_tuples */ + tabentry->n_dead_tuples = Max(tabentry->n_dead_tuples, 0); + + pgstat_unlock_entry(entry_ref); + + /* The entry was successfully flushed, add the same to database stats */ + dbentry = pgstat_prep_database_pending(dboid); + dbentry->n_tuples_returned += lstats->t_counts.t_tuples_returned; + dbentry->n_tuples_fetched += lstats->t_counts.t_tuples_fetched; + dbentry->n_tuples_inserted += lstats->t_counts.t_tuples_inserted; + dbentry->n_tuples_updated += lstats->t_counts.t_tuples_updated; + dbentry->n_tuples_deleted += lstats->t_counts.t_tuples_deleted; + dbentry->n_blocks_fetched += lstats->t_counts.t_blocks_fetched; + dbentry->n_blocks_hit += lstats->t_counts.t_blocks_hit; + + return true; } -/* - * Subroutine for pgstat_send_tabstats: finish and send one tabstat message - */ -static void -pgstat_send_tabstat(PgStat_MsgTabstat *tsmsg, TimestampTz now) +void +pgstat_relation_delete_pending_cb(PgStat_EntryRef *entry_ref) { - int n; - int len; - - /* It's unlikely we'd get here with no socket, but maybe not impossible */ - if (pgStatSock == PGINVALID_SOCKET) - return; + PgStat_TableStatus *pending = (PgStat_TableStatus *) entry_ref->pending; - /* - * Report and reset accumulated xact commit/rollback and I/O timings - * whenever we send a normal tabstat message - */ - pgstat_update_dbstats(tsmsg, now); - - n = tsmsg->m_nentries; - len = offsetof(PgStat_MsgTabstat, m_entry[0]) + - n * sizeof(PgStat_TableEntry); - - pgstat_setheader(&tsmsg->m_hdr, PGSTAT_MTYPE_TABSTAT); - pgstat_send(tsmsg, len); + if (pending->relation) + pgstat_unlink_relation(pending->relation); } /* - * find or create a PgStat_TableStatus entry for rel + * Find or create a PgStat_TableStatus entry for rel. New entry is created and + * initialized if not exists. */ static PgStat_TableStatus * -get_tabstat_entry(Oid rel_id, bool isshared) +pgstat_prep_relation_pending(Oid rel_id, bool isshared) { - TabStatHashEntry *hash_entry; - PgStat_TableStatus *entry; - TabStatusArray *tsa; - bool found; - - pgstat_assert_is_up(); + PgStat_EntryRef *entry_ref; + PgStat_TableStatus *pending; - have_relation_stats = true; - - /* - * Create hash table if we don't have it already. - */ - if (pgStatTabHash == NULL) - { - HASHCTL ctl; - - ctl.keysize = sizeof(Oid); - ctl.entrysize = sizeof(TabStatHashEntry); - - pgStatTabHash = hash_create("pgstat TabStatusArray lookup hash table", - TABSTAT_QUANTUM, - &ctl, - HASH_ELEM | HASH_BLOBS); - } - - /* - * Find an entry or create a new one. - */ - hash_entry = hash_search(pgStatTabHash, &rel_id, HASH_ENTER, &found); - if (!found) - { - /* initialize new entry with null pointer */ - hash_entry->tsa_entry = NULL; - } - - /* - * If entry is already valid, we're done. - */ - if (hash_entry->tsa_entry) - return hash_entry->tsa_entry; - - /* - * Locate the first pgStatTabList entry with free space, making a new list - * entry if needed. Note that we could get an OOM failure here, but if so - * we have left the hashtable and the list in a consistent state. - */ - if (pgStatTabList == NULL) - { - /* Set up first pgStatTabList entry */ - pgStatTabList = (TabStatusArray *) - MemoryContextAllocZero(TopMemoryContext, - sizeof(TabStatusArray)); - } - - tsa = pgStatTabList; - while (tsa->tsa_used >= TABSTAT_QUANTUM) - { - if (tsa->tsa_next == NULL) - tsa->tsa_next = (TabStatusArray *) - MemoryContextAllocZero(TopMemoryContext, - sizeof(TabStatusArray)); - tsa = tsa->tsa_next; - } - - /* - * Allocate a PgStat_TableStatus entry within this list entry. We assume - * the entry was already zeroed, either at creation or after last use. - */ - entry = &tsa->tsa_entries[tsa->tsa_used++]; - entry->t_id = rel_id; - entry->t_shared = isshared; - - /* - * Now we can fill the entry in pgStatTabHash. - */ - hash_entry->tsa_entry = entry; + entry_ref = pgstat_prep_pending_entry(PGSTAT_KIND_RELATION, + isshared ? InvalidOid : MyDatabaseId, + rel_id, NULL); + pending = entry_ref->pending; + pending->t_id = rel_id; + pending->t_shared = isshared; - return entry; + return pending; } /* diff --git a/src/backend/utils/activity/pgstat_replslot.c b/src/backend/utils/activity/pgstat_replslot.c index ceefc5d59b..b77c05ab5f 100644 --- a/src/backend/utils/activity/pgstat_replslot.c +++ b/src/backend/utils/activity/pgstat_replslot.c @@ -8,6 +8,14 @@ * storage implementation and the details about individual types of * statistics. * + * Replication slot stats work a bit different than other other + * variable-numbered stats. Slots do not have oids (so they can be created on + * physical replicas). Use the slot index as object id while running. However, + * the slot index can change when restarting. That is addressed by using the + * name when (de-)serializing. After a restart it is possible for slots to + * have been dropped while shut down, which is addressed by not restoring + * stats for slots that cannot be found by name when starting up. + * * Copyright (c) 2001-2022, PostgreSQL Global Development Group * * IDENTIFICATION @@ -22,6 +30,9 @@ #include "utils/pgstat_internal.h" +static int get_replslot_index(const char *name); + + /* * Reset counters for a single replication slot. * @@ -32,18 +43,10 @@ void pgstat_reset_replslot(const char *name) { ReplicationSlot *slot; - PgStat_MsgResetreplslotcounter msg; AssertArg(name != NULL); - if (pgStatSock == PGINVALID_SOCKET) - return; - - /* - * Check if the slot exists with the given name. It is possible that by - * the time this message is executed the slot is dropped but at least this - * check will ensure that the given name is for a valid slot. - */ + /* Check if the slot exits with the given name. */ slot = SearchNamedReplicationSlot(name, true); if (!slot) @@ -59,10 +62,9 @@ pgstat_reset_replslot(const char *name) if (SlotIsPhysical(slot)) return; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETREPLSLOTCOUNTER); - namestrcpy(&msg.m_slotname, name); - msg.clearall = false; - pgstat_send(&msg, sizeof(msg)); + /* reset this one entry */ + pgstat_reset(PGSTAT_KIND_REPLSLOT, InvalidOid, + ReplicationSlotIndex(slot)); } /* @@ -71,24 +73,34 @@ pgstat_reset_replslot(const char *name) void pgstat_report_replslot(ReplicationSlot *slot, const PgStat_StatReplSlotEntry *repSlotStat) { - PgStat_MsgReplSlot msg; + PgStat_EntryRef *entry_ref; + PgStatShared_ReplSlot *shstatent; + PgStat_StatReplSlotEntry *statent; + + entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_REPLSLOT, InvalidOid, + ReplicationSlotIndex(slot), false); + shstatent = (PgStatShared_ReplSlot *) entry_ref->shared_stats; + statent = &shstatent->stats; /* - * Prepare and send the message + * Any mismatch should have been fixed in pgstat_create_replslot() or + * pgstat_acquire_replslot(). */ - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); - namestrcpy(&msg.m_slotname, NameStr(repSlotStat->slotname)); - msg.m_create = false; - msg.m_drop = false; - msg.m_spill_txns = repSlotStat->spill_txns; - msg.m_spill_count = repSlotStat->spill_count; - msg.m_spill_bytes = repSlotStat->spill_bytes; - msg.m_stream_txns = repSlotStat->stream_txns; - msg.m_stream_count = repSlotStat->stream_count; - msg.m_stream_bytes = repSlotStat->stream_bytes; - msg.m_total_txns = repSlotStat->total_txns; - msg.m_total_bytes = repSlotStat->total_bytes; - pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); + Assert(namestrcmp(&statent->slotname, NameStr(slot->data.name)) == 0); + + /* Update the replication slot statistics */ +#define REPLSLOT_ACC(fld) statent->fld += repSlotStat->fld + REPLSLOT_ACC(spill_txns); + REPLSLOT_ACC(spill_count); + REPLSLOT_ACC(spill_bytes); + REPLSLOT_ACC(stream_txns); + REPLSLOT_ACC(stream_count); + REPLSLOT_ACC(stream_bytes); + REPLSLOT_ACC(total_txns); + REPLSLOT_ACC(total_bytes); +#undef REPLSLOT_ACC + + pgstat_unlock_entry(entry_ref); } /* @@ -100,13 +112,50 @@ pgstat_report_replslot(ReplicationSlot *slot, const PgStat_StatReplSlotEntry *re void pgstat_create_replslot(ReplicationSlot *slot) { - PgStat_MsgReplSlot msg; + PgStat_EntryRef *entry_ref; + PgStatShared_ReplSlot *shstatent; + + entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_REPLSLOT, InvalidOid, + ReplicationSlotIndex(slot), false); + shstatent = (PgStatShared_ReplSlot *) entry_ref->shared_stats; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); - namestrcpy(&msg.m_slotname, NameStr(slot->data.name)); - msg.m_create = true; - msg.m_drop = false; - pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); + /* + * NB: need to accept that there might be stats from an older slot, e.g. + * if we previously crashed after dropping a slot. + */ + memset(&shstatent->stats, 0, sizeof(shstatent->stats)); + namestrcpy(&shstatent->stats.slotname, NameStr(slot->data.name)); + + pgstat_unlock_entry(entry_ref); +} + +/* + * Report replication slot has been acquired. + */ +void +pgstat_acquire_replslot(ReplicationSlot *slot) +{ + PgStat_EntryRef *entry_ref; + PgStatShared_ReplSlot *shstatent; + PgStat_StatReplSlotEntry *statent; + + entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_REPLSLOT, InvalidOid, + ReplicationSlotIndex(slot), false); + shstatent = (PgStatShared_ReplSlot *) entry_ref->shared_stats; + statent = &shstatent->stats; + + /* + * NB: need to accept that there might be stats from an older slot, e.g. + * if we previously crashed after dropping a slot. + */ + if (NameStr(statent->slotname)[0] == 0 || + namestrcmp(&statent->slotname, NameStr(slot->data.name)) != 0) + { + memset(statent, 0, sizeof(*statent)); + namestrcpy(&statent->slotname, NameStr(slot->data.name)); + } + + pgstat_unlock_entry(entry_ref); } /* @@ -115,11 +164,65 @@ pgstat_create_replslot(ReplicationSlot *slot) void pgstat_drop_replslot(ReplicationSlot *slot) { - PgStat_MsgReplSlot msg; + pgstat_drop_entry(PGSTAT_KIND_REPLSLOT, InvalidOid, + ReplicationSlotIndex(slot)); +} + +/* + * Support function for the SQL-callable pgstat* functions. Returns + * a pointer to the replication slot statistics struct. + */ +PgStat_StatReplSlotEntry * +pgstat_fetch_replslot(NameData slotname) +{ + int idx = get_replslot_index(NameStr(slotname)); + + if (idx == -1) + return NULL; + + return (PgStat_StatReplSlotEntry *) + pgstat_fetch_entry(PGSTAT_KIND_REPLSLOT, InvalidOid, idx); +} + +void +pgstat_replslot_to_serialized_name_cb(const PgStatShared_Common *header, NameData *name) +{ + namestrcpy(name, NameStr(((PgStatShared_ReplSlot *) header)->stats.slotname)); +} + +bool +pgstat_replslot_from_serialized_name_cb(const NameData *name, PgStat_HashKey *key) +{ + int idx = get_replslot_index(NameStr(*name)); + + /* slot might have been deleted */ + if (idx == -1) + return false; + + key->kind = PGSTAT_KIND_REPLSLOT; + key->dboid = InvalidOid; + key->objoid = idx; + + return true; +} + +void +pgstat_replslot_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts) +{ + ((PgStatShared_ReplSlot *) header)->stats.stat_reset_timestamp = ts; +} + +static int +get_replslot_index(const char *name) +{ + ReplicationSlot *slot; + + AssertArg(name != NULL); + + slot = SearchNamedReplicationSlot(name, true); + + if (!slot) + return -1; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REPLSLOT); - namestrcpy(&msg.m_slotname, NameStr(slot->data.name)); - msg.m_create = false; - msg.m_drop = true; - pgstat_send(&msg, sizeof(PgStat_MsgReplSlot)); + return ReplicationSlotIndex(slot); } diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c new file mode 100644 index 0000000000..a32740b2f6 --- /dev/null +++ b/src/backend/utils/activity/pgstat_shmem.c @@ -0,0 +1,987 @@ +/* ------------------------------------------------------------------------- + * + * pgstat_shmem.c + * Storage of stats entries in shared memory + * + * Copyright (c) 2001-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/activity/pgstat_shmem.c + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "pgstat.h" +#include "storage/shmem.h" +#include "utils/memutils.h" +#include "utils/pgstat_internal.h" + + +#define PGSTAT_ENTRY_REF_HASH_SIZE 128 + +/* hash table entry for finding the PgStat_EntryRef for a key */ +typedef struct PgStat_EntryRefHashEntry +{ + PgStat_HashKey key; /* hash key */ + char status; /* for simplehash use */ + PgStat_EntryRef *entry_ref; +} PgStat_EntryRefHashEntry; + + +/* for references to shared statistics entries */ +#define SH_PREFIX pgstat_entry_ref_hash +#define SH_ELEMENT_TYPE PgStat_EntryRefHashEntry +#define SH_KEY_TYPE PgStat_HashKey +#define SH_KEY key +#define SH_HASH_KEY(tb, key) \ + pgstat_hash_hash_key(&key, sizeof(PgStat_HashKey), NULL) +#define SH_EQUAL(tb, a, b) \ + pgstat_cmp_hash_key(&a, &b, sizeof(PgStat_HashKey), NULL) == 0 +#define SH_SCOPE static inline +#define SH_DEFINE +#define SH_DECLARE +#include "lib/simplehash.h" + + +static void pgstat_drop_database_and_contents(Oid dboid); + +static void pgstat_free_entry(PgStatShared_HashEntry *shent, dshash_seq_status *hstat); + +static void pgstat_release_entry_ref(PgStat_HashKey key, PgStat_EntryRef *entry_ref, bool discard_pending); +static bool pgstat_need_entry_refs_gc(void); +static void pgstat_gc_entry_refs(void); +static void pgstat_release_all_entry_refs(bool discard_pending); +typedef bool (*ReleaseMatchCB) (PgStat_EntryRefHashEntry *, Datum data); +static void pgstat_release_matching_entry_refs(bool discard_pending, ReleaseMatchCB match, Datum match_data); + +static void pgstat_setup_memcxt(void); + + +/* parameter for the shared hash */ +static const dshash_parameters dsh_params = { + sizeof(PgStat_HashKey), + sizeof(PgStatShared_HashEntry), + pgstat_cmp_hash_key, + pgstat_hash_hash_key, + LWTRANCHE_PGSTATS_HASH +}; + + +/* + * Backend local references to shared stats entries. If there are pending + * updates to a stats entry, the PgStat_EntryRef is added to the pgStatPending + * list. + * + * When a stats entry is dropped each backend needs to release its reference + * to it before the memory can be released. To trigger that + * pgStatLocal.shmem->gc_request_count is incremented - which each backend + * compares to their copy of pgStatSharedRefAge on a regular basis. + */ +static pgstat_entry_ref_hash_hash *pgStatEntryRefHash = NULL; +static int pgStatSharedRefAge = 0; /* cache age of pgStatShmLookupCache */ + +/* + * Memory contexts containing the pgStatEntryRefHash table and the + * pgStatSharedRef entries respectively. Kept separate to make it easier to + * track / attribute memory usage. + */ +static MemoryContext pgStatSharedRefContext = NULL; +static MemoryContext pgStatEntryRefHashContext = NULL; + + +/* ------------------------------------------------------------ + * Public functions called from postmaster follow + * ------------------------------------------------------------ + */ + +/* + * The size of the shared memory allocation for stats stored in the shared + * stats hash table. This allocation will be done as part of the main shared + * memory, rather than dynamic shared memory, allowing it to be initialized in + * postmaster. + */ +static Size +pgstat_dsa_init_size(void) +{ + Size sz; + + /* + * The dshash header / initial buckets array needs to fit into "plain" + * shared memory, but it's beneficial to not need dsm segments + * immediately. A size of 256kB seems works well and is not + * disproportional compared to other constant sized shared memory + * allocations. NB: To avoid DSMs further, the user can configure + * min_dynamic_shared_memory. + */ + sz = 256 * 1024; + Assert(dsa_minimum_size() <= sz); + return MAXALIGN(sz); +} + +/* + * Compute shared memory space needed for cumulative statistics + */ +Size +StatsShmemSize(void) +{ + Size sz; + + sz = MAXALIGN(sizeof(PgStat_ShmemControl)); + sz = add_size(sz, pgstat_dsa_init_size()); + + return sz; +} + +/* + * Initialize cumulative statistics system during startup + */ +void +StatsShmemInit(void) +{ + bool found; + Size sz; + + sz = StatsShmemSize(); + pgStatLocal.shmem = (PgStat_ShmemControl *) + ShmemInitStruct("Shared Memory Stats", sz, &found); + + if (!IsUnderPostmaster) + { + dsa_area *dsa; + dshash_table *dsh; + PgStat_ShmemControl *ctl = pgStatLocal.shmem; + char *p = (char *) ctl; + + Assert(!found); + + /* the allocation of pgStatLocal.shmem itself */ + p += MAXALIGN(sizeof(PgStat_ShmemControl)); + + /* + * Create a small dsa allocation in plain shared memory. This is + * required because postmaster cannot use dsm segments. It also + * provides a small efficiency win. + */ + ctl->raw_dsa_area = p; + p += MAXALIGN(pgstat_dsa_init_size()); + dsa = dsa_create_in_place(ctl->raw_dsa_area, + pgstat_dsa_init_size(), + LWTRANCHE_PGSTATS_DSA, 0); + dsa_pin(dsa); + + /* + * To ensure dshash is created in "plain" shared memory, temporarily + * limit size of dsa to the initial size of the dsa. + */ + dsa_set_size_limit(dsa, pgstat_dsa_init_size()); + + /* + * With the limit in place, create the dshash table. XXX: It'd be nice + * if there were dshash_create_in_place(). + */ + dsh = dshash_create(dsa, &dsh_params, 0); + ctl->hash_handle = dshash_get_hash_table_handle(dsh); + + /* lift limit set above */ + dsa_set_size_limit(dsa, -1); + + /* + * Postmaster will never access these again, thus free the local + * dsa/dshash references. + */ + dshash_detach(dsh); + dsa_detach(dsa); + + pg_atomic_init_u64(&ctl->gc_request_count, 1); + + + /* initialize fixed-numbered stats */ + LWLockInitialize(&ctl->archiver.lock, LWTRANCHE_PGSTATS_DATA); + LWLockInitialize(&ctl->bgwriter.lock, LWTRANCHE_PGSTATS_DATA); + LWLockInitialize(&ctl->checkpointer.lock, LWTRANCHE_PGSTATS_DATA); + LWLockInitialize(&ctl->slru.lock, LWTRANCHE_PGSTATS_DATA); + LWLockInitialize(&ctl->wal.lock, LWTRANCHE_PGSTATS_DATA); + } + else + { + Assert(found); + } +} + +void +pgstat_attach_shmem(void) +{ + MemoryContext oldcontext; + + Assert(pgStatLocal.dsa == NULL); + + /* stats shared memory persists for the backend lifetime */ + oldcontext = MemoryContextSwitchTo(TopMemoryContext); + + pgStatLocal.dsa = dsa_attach_in_place(pgStatLocal.shmem->raw_dsa_area, + NULL); + dsa_pin_mapping(pgStatLocal.dsa); + + pgStatLocal.shared_hash = dshash_attach(pgStatLocal.dsa, &dsh_params, + pgStatLocal.shmem->hash_handle, 0); + + MemoryContextSwitchTo(oldcontext); +} + +void +pgstat_detach_shmem(void) +{ + Assert(pgStatLocal.dsa); + + /* we shouldn't leave references to shared stats */ + pgstat_release_all_entry_refs(false); + + dshash_detach(pgStatLocal.shared_hash); + pgStatLocal.shared_hash = NULL; + + dsa_detach(pgStatLocal.dsa); + pgStatLocal.dsa = NULL; +} + + +/* ------------------------------------------------------------ + * Maintenance of shared memory stats entries + * ------------------------------------------------------------ + */ + +PgStatShared_Common * +pgstat_init_entry(PgStat_Kind kind, + PgStatShared_HashEntry *shhashent) +{ + /* Create new stats entry. */ + dsa_pointer chunk; + PgStatShared_Common *shheader; + + /* + * Initialize refcount to 1, marking it as valid / not dropped. The entry + * can't be freed before the initialization because it can't be found as + * long as we hold the dshash partition lock. Caller needs to increase + * further if a longer lived reference is needed. + */ + pg_atomic_init_u32(&shhashent->refcount, 1); + shhashent->dropped = false; + + chunk = dsa_allocate0(pgStatLocal.dsa, pgstat_get_kind_info(kind)->shared_size); + shheader = dsa_get_address(pgStatLocal.dsa, chunk); + shheader->magic = 0xdeadbeef; + + /* Link the new entry from the hash entry. */ + shhashent->body = chunk; + + LWLockInitialize(&shheader->lock, LWTRANCHE_PGSTATS_DATA); + + return shheader; +} + +static PgStatShared_Common * +pgstat_reinit_entry(PgStat_Kind kind, PgStatShared_HashEntry *shhashent) +{ + PgStatShared_Common *shheader; + + shheader = dsa_get_address(pgStatLocal.dsa, shhashent->body); + + /* mark as not dropped anymore */ + pg_atomic_fetch_add_u32(&shhashent->refcount, 1); + shhashent->dropped = false; + + /* reinitialize content */ + Assert(shheader->magic == 0xdeadbeef); + memset(shheader, 0, pgstat_get_kind_info(shhashent->key.kind)->shared_size); + shheader->magic = 0xdeadbeef; + + return shheader; +} + +static void +pgstat_setup_shared_refs(void) +{ + if (likely(pgStatEntryRefHash != NULL)) + return; + + pgStatEntryRefHash = + pgstat_entry_ref_hash_create(pgStatEntryRefHashContext, + PGSTAT_ENTRY_REF_HASH_SIZE, NULL); + pgStatSharedRefAge = pg_atomic_read_u64(&pgStatLocal.shmem->gc_request_count); + Assert(pgStatSharedRefAge != 0); +} + +/* + * Helper function for pgstat_get_entry_ref(). + */ +static void +pgstat_acquire_entry_ref(PgStat_EntryRef *entry_ref, + PgStatShared_HashEntry *shhashent, + PgStatShared_Common *shheader) +{ + Assert(shheader->magic == 0xdeadbeef); + Assert(pg_atomic_read_u32(&shhashent->refcount) > 0); + + pg_atomic_fetch_add_u32(&shhashent->refcount, 1); + + dshash_release_lock(pgStatLocal.shared_hash, shhashent); + + entry_ref->shared_stats = shheader; + entry_ref->shared_entry = shhashent; +} + +/* + * Helper function for pgstat_get_entry_ref(). + */ +static bool +pgstat_get_entry_ref_cached(PgStat_HashKey key, PgStat_EntryRef **entry_ref_p) +{ + bool found; + PgStat_EntryRefHashEntry *cache_entry; + + /* + * We immediately insert a cache entry, because it avoids 1) multiple + * hashtable lookups in case of a cache miss 2) having to deal with + * out-of-memory errors after incrementing PgStatShared_Common->refcount. + */ + + cache_entry = pgstat_entry_ref_hash_insert(pgStatEntryRefHash, key, &found); + + if (!found || !cache_entry->entry_ref) + { + PgStat_EntryRef *entry_ref; + + cache_entry->entry_ref = entry_ref = + MemoryContextAlloc(pgStatSharedRefContext, + sizeof(PgStat_EntryRef)); + entry_ref->shared_stats = NULL; + entry_ref->shared_entry = NULL; + entry_ref->pending = NULL; + + found = false; + } + else if (cache_entry->entry_ref->shared_stats == NULL) + { + Assert(cache_entry->entry_ref->pending == NULL); + found = false; + } + else + { + PgStat_EntryRef *entry_ref PG_USED_FOR_ASSERTS_ONLY; + + entry_ref = cache_entry->entry_ref; + Assert(entry_ref->shared_entry != NULL); + Assert(entry_ref->shared_stats != NULL); + + Assert(entry_ref->shared_stats->magic == 0xdeadbeef); + /* should have at least our reference */ + Assert(pg_atomic_read_u32(&entry_ref->shared_entry->refcount) > 0); + } + + *entry_ref_p = cache_entry->entry_ref; + return found; +} + +/* + * Get a shared stats reference. If create is true, the shared stats object is + * created if it does not exist. + * + * When create is true, and created_entry is non-NULL, it'll be set to true + * if the entry is newly created, false otherwise. + */ +PgStat_EntryRef * +pgstat_get_entry_ref(PgStat_Kind kind, Oid dboid, Oid objoid, bool create, + bool *created_entry) +{ + PgStat_HashKey key = {.kind = kind,.dboid = dboid,.objoid = objoid}; + PgStatShared_HashEntry *shhashent; + PgStatShared_Common *shheader = NULL; + PgStat_EntryRef *entry_ref; + + /* + * passing in created_entry only makes sense if we possibly could create + * entry. + */ + AssertArg(create || created_entry == NULL); + pgstat_assert_is_up(); + Assert(pgStatLocal.shared_hash != NULL); + Assert(!pgStatLocal.shmem->is_shutdown); + + pgstat_setup_memcxt(); + pgstat_setup_shared_refs(); + + if (created_entry != NULL) + *created_entry = false; + + /* + * Check if other backends dropped stats that could not be deleted because + * somebody held references to it. If so, check this backend's references. + * This is not expected to happen often. The location of the check is a + * bit random, but this is a relatively frequently called path, so better + * than most. + */ + if (pgstat_need_entry_refs_gc()) + pgstat_gc_entry_refs(); + + /* + * First check the lookup cache hashtable in local memory. If we find a + * match here we can avoid taking locks / causing contention. + */ + if (pgstat_get_entry_ref_cached(key, &entry_ref)) + return entry_ref; + + Assert(entry_ref != NULL); + + /* + * Do a lookup in the hash table first - it's quite likely that the entry + * already exists, and that way we only need a shared lock. + */ + shhashent = dshash_find(pgStatLocal.shared_hash, &key, false); + + if (create && !shhashent) + { + bool shfound; + + /* + * It's possible that somebody created the entry since the above + * lookup. If so, fall through to the same path as if we'd have if it + * already had been created before the dshash_find() calls. + */ + shhashent = dshash_find_or_insert(pgStatLocal.shared_hash, &key, &shfound); + if (!shfound) + { + shheader = pgstat_init_entry(kind, shhashent); + pgstat_acquire_entry_ref(entry_ref, shhashent, shheader); + + if (created_entry != NULL) + *created_entry = true; + + return entry_ref; + } + } + + if (!shhashent) + { + /* + * If we're not creating, delete the reference again. In all + * likelihood it's just a stats lookup - no point wasting memory for a + * shared ref to nothing... + */ + pgstat_release_entry_ref(key, entry_ref, false); + + return NULL; + } + else + { + /* + * Can get here either because dshash_find() found a match, or if + * dshash_find_or_insert() found a concurrently inserted entry. + */ + + if (shhashent->dropped && create) + { + /* + * There are legitimate cases where the old stats entry might not + * yet have been dropped by the time it's reused. The most obvious + * case are replication slot stats, where a new slot can be + * created with the same index just after dropping. But oid + * wraparound can lead to other cases as well. We just reset the + * stats to their plain state. + */ + shheader = pgstat_reinit_entry(kind, shhashent); + pgstat_acquire_entry_ref(entry_ref, shhashent, shheader); + + if (created_entry != NULL) + *created_entry = true; + + return entry_ref; + } + else if (shhashent->dropped) + { + dshash_release_lock(pgStatLocal.shared_hash, shhashent); + pgstat_release_entry_ref(key, entry_ref, false); + + return NULL; + } + else + { + shheader = dsa_get_address(pgStatLocal.dsa, shhashent->body); + pgstat_acquire_entry_ref(entry_ref, shhashent, shheader); + + return entry_ref; + } + } +} + +static void +pgstat_release_entry_ref(PgStat_HashKey key, PgStat_EntryRef *entry_ref, + bool discard_pending) +{ + if (entry_ref && entry_ref->pending) + { + if (discard_pending) + pgstat_delete_pending_entry(entry_ref); + else + elog(ERROR, "releasing ref with pending data"); + } + + if (entry_ref && entry_ref->shared_stats) + { + Assert(entry_ref->shared_stats->magic == 0xdeadbeef); + Assert(entry_ref->pending == NULL); + + /* + * This can't race with another backend looking up the stats entry and + * increasing the refcount because it is not "legal" to create + * additional references to dropped entries. + */ + if (pg_atomic_fetch_sub_u32(&entry_ref->shared_entry->refcount, 1) == 1) + { + PgStatShared_HashEntry *shent; + + /* + * We're the last referrer to this entry, try to drop the shared + * entry. + */ + + /* only dropped entries can reach a 0 refcount */ + Assert(entry_ref->shared_entry->dropped); + + shent = dshash_find(pgStatLocal.shared_hash, + &entry_ref->shared_entry->key, + true); + if (!shent) + elog(ERROR, "could not find just referenced shared stats entry"); + + Assert(pg_atomic_read_u32(&entry_ref->shared_entry->refcount) == 0); + Assert(entry_ref->shared_entry == shent); + + pgstat_free_entry(shent, NULL); + } + } + + if (!pgstat_entry_ref_hash_delete(pgStatEntryRefHash, key)) + elog(ERROR, "entry ref vanished before deletion"); + + if (entry_ref) + pfree(entry_ref); +} + +bool +pgstat_lock_entry(PgStat_EntryRef *entry_ref, bool nowait) +{ + LWLock *lock = &entry_ref->shared_stats->lock; + + if (nowait) + return LWLockConditionalAcquire(lock, LW_EXCLUSIVE); + + LWLockAcquire(lock, LW_EXCLUSIVE); + return true; +} + +void +pgstat_unlock_entry(PgStat_EntryRef *entry_ref) +{ + LWLockRelease(&entry_ref->shared_stats->lock); +} + +/* + * Helper function to fetch and lock shared stats. + */ +PgStat_EntryRef * +pgstat_get_entry_ref_locked(PgStat_Kind kind, Oid dboid, Oid objoid, + bool nowait) +{ + PgStat_EntryRef *entry_ref; + + /* find shared table stats entry corresponding to the local entry */ + entry_ref = pgstat_get_entry_ref(kind, dboid, objoid, true, NULL); + + /* lock the shared entry to protect the content, skip if failed */ + if (!pgstat_lock_entry(entry_ref, nowait)) + return NULL; + + return entry_ref; +} + +void +pgstat_request_entry_refs_gc(void) +{ + pg_atomic_fetch_add_u64(&pgStatLocal.shmem->gc_request_count, 1); +} + +static bool +pgstat_need_entry_refs_gc(void) +{ + uint64 curage; + + if (!pgStatEntryRefHash) + return false; + + /* should have been initialized when creating pgStatEntryRefHash */ + Assert(pgStatSharedRefAge != 0); + + curage = pg_atomic_read_u64(&pgStatLocal.shmem->gc_request_count); + + return pgStatSharedRefAge != curage; +} + +static void +pgstat_gc_entry_refs(void) +{ + pgstat_entry_ref_hash_iterator i; + PgStat_EntryRefHashEntry *ent; + uint64 curage; + + curage = pg_atomic_read_u64(&pgStatLocal.shmem->gc_request_count); + Assert(curage != 0); + + /* + * Some entries have been dropped. Invalidate cache pointer to them. + */ + pgstat_entry_ref_hash_start_iterate(pgStatEntryRefHash, &i); + while ((ent = pgstat_entry_ref_hash_iterate(pgStatEntryRefHash, &i)) != NULL) + { + PgStat_EntryRef *entry_ref = ent->entry_ref; + + Assert(!entry_ref->shared_stats || + entry_ref->shared_stats->magic == 0xdeadbeef); + + if (!entry_ref->shared_entry->dropped) + continue; + + /* cannot gc shared ref that has pending data */ + if (entry_ref->pending != NULL) + continue; + + pgstat_release_entry_ref(ent->key, entry_ref, false); + } + + pgStatSharedRefAge = curage; +} + +static void +pgstat_release_matching_entry_refs(bool discard_pending, ReleaseMatchCB match, + Datum match_data) +{ + pgstat_entry_ref_hash_iterator i; + PgStat_EntryRefHashEntry *ent; + + if (pgStatEntryRefHash == NULL) + return; + + pgstat_entry_ref_hash_start_iterate(pgStatEntryRefHash, &i); + + while ((ent = pgstat_entry_ref_hash_iterate(pgStatEntryRefHash, &i)) + != NULL) + { + Assert(ent->entry_ref != NULL); + + if (match && !match(ent, match_data)) + continue; + + pgstat_release_entry_ref(ent->key, ent->entry_ref, discard_pending); + } +} + +/* + * Release all local references to shared stats entries. + * + * When a process exits it cannot do so while still holding references onto + * stats entries, otherwise the shared stats entries could never be freed. + */ +static void +pgstat_release_all_entry_refs(bool discard_pending) +{ + if (pgStatEntryRefHash == NULL) + return; + + pgstat_release_matching_entry_refs(discard_pending, NULL, 0); + Assert(pgStatEntryRefHash->members == 0); + pgstat_entry_ref_hash_destroy(pgStatEntryRefHash); + pgStatEntryRefHash = NULL; +} + +static bool +match_db(PgStat_EntryRefHashEntry *ent, Datum match_data) +{ + Oid dboid = DatumGetObjectId(match_data); + + return ent->key.dboid == dboid; +} + +static void +pgstat_release_db_entry_refs(Oid dboid) +{ + pgstat_release_matching_entry_refs( /* discard pending = */ true, + match_db, + ObjectIdGetDatum(dboid)); +} + + +/* ------------------------------------------------------------ + * Dropping and resetting of stats entries + * ------------------------------------------------------------ + */ + +static void +pgstat_free_entry(PgStatShared_HashEntry *shent, dshash_seq_status *hstat) +{ + dsa_pointer pdsa; + + /* + * Fetch dsa pointer before deleting entry - that way we can free the + * memory after releasing the lock. + */ + pdsa = shent->body; + + if (!hstat) + dshash_delete_entry(pgStatLocal.shared_hash, shent); + else + dshash_delete_current(hstat); + + dsa_free(pgStatLocal.dsa, pdsa); +} + +/* + * Helper for both pgstat_drop_database_and_contents() and + * pgstat_drop_entry(). If hstat is non-null delete the shared entry using + * dshash_delete_current(), otherwise use dshash_delete_entry(). In either + * case the entry needs to be already locked. + */ +static bool +pgstat_drop_entry_internal(PgStatShared_HashEntry *shent, + dshash_seq_status *hstat) +{ + Assert(shent->body != InvalidDsaPointer); + + /* should already have released local reference */ + if (pgStatEntryRefHash) + Assert(!pgstat_entry_ref_hash_lookup(pgStatEntryRefHash, shent->key)); + + /* + * Signal that the entry is dropped - this will eventually cause other + * backends to release their references. + */ + if (shent->dropped) + elog(ERROR, "can only drop stats once"); + shent->dropped = true; + + /* release refcount marking entry as not dropped */ + if (pg_atomic_sub_fetch_u32(&shent->refcount, 1) == 0) + { + pgstat_free_entry(shent, hstat); + return true; + } + else + { + if (!hstat) + dshash_release_lock(pgStatLocal.shared_hash, shent); + return false; + } +} + +/* + * Drop stats for the database and all the objects inside that database. + */ +static void +pgstat_drop_database_and_contents(Oid dboid) +{ + dshash_seq_status hstat; + PgStatShared_HashEntry *p; + uint64 not_freed_count = 0; + + Assert(OidIsValid(dboid)); + + Assert(pgStatLocal.shared_hash != NULL); + + /* + * This backend might very well be the only backend holding a reference to + * about-to-be-dropped entries. Ensure that we're not preventing it from + * being cleaned up till later. + * + * Doing this separately from the dshash iteration below avoids having to + * do so while holding a partition lock on the shared hashtable. + */ + pgstat_release_db_entry_refs(dboid); + + /* some of the dshash entries are to be removed, take exclusive lock. */ + dshash_seq_init(&hstat, pgStatLocal.shared_hash, true); + while ((p = dshash_seq_next(&hstat)) != NULL) + { + if (p->dropped) + continue; + + if (p->key.dboid != dboid) + continue; + + if (!pgstat_drop_entry_internal(p, &hstat)) + { + /* + * Even statistics for a dropped database might currently be + * accessed (consider e.g. database stats for pg_stat_database). + */ + not_freed_count++; + } + } + dshash_seq_term(&hstat); + + /* + * If some of the stats data could not be freed, signal the reference + * holders to run garbage collection of their cached pgStatShmLookupCache. + */ + if (not_freed_count > 0) + pgstat_request_entry_refs_gc(); +} + +bool +pgstat_drop_entry(PgStat_Kind kind, Oid dboid, Oid objoid) +{ + PgStat_HashKey key = {.kind = kind,.dboid = dboid,.objoid = objoid}; + PgStatShared_HashEntry *shent; + bool freed = true; + + /* delete local reference */ + if (pgStatEntryRefHash) + { + PgStat_EntryRefHashEntry *lohashent = + pgstat_entry_ref_hash_lookup(pgStatEntryRefHash, key); + + if (lohashent) + pgstat_release_entry_ref(lohashent->key, lohashent->entry_ref, + true); + } + + /* mark entry in shared hashtable as deleted, drop if possible */ + shent = dshash_find(pgStatLocal.shared_hash, &key, true); + if (shent) + { + freed = pgstat_drop_entry_internal(shent, NULL); + + /* + * Database stats contain other stats. Drop those as well when + * dropping the database. XXX: Perhaps this should be done in a + * slightly more principled way? But not obvious what that'd look + * like, and so far this is the only case... + */ + if (key.kind == PGSTAT_KIND_DATABASE) + pgstat_drop_database_and_contents(key.dboid); + } + + return freed; +} + +void +pgstat_drop_all_entries(void) +{ + dshash_seq_status hstat; + PgStatShared_HashEntry *ps; + uint64 not_freed_count = 0; + + dshash_seq_init(&hstat, pgStatLocal.shared_hash, false); + while ((ps = dshash_seq_next(&hstat)) != NULL) + { + if (ps->dropped) + continue; + + if (!pgstat_drop_entry_internal(ps, &hstat)) + not_freed_count++; + } + dshash_seq_term(&hstat); + + if (not_freed_count > 0) + pgstat_request_entry_refs_gc(); +} + +static void +shared_stat_reset_contents(PgStat_Kind kind, PgStatShared_Common *header, + TimestampTz ts) +{ + const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind); + + memset(pgstat_get_entry_data(kind, header), 0, + pgstat_get_entry_len(kind)); + + if (kind_info->reset_timestamp_cb) + kind_info->reset_timestamp_cb(header, ts); +} + +/* + * Reset one variable-numbered stats entry. + */ +void +pgstat_reset_entry(PgStat_Kind kind, Oid dboid, Oid objoid, TimestampTz ts) +{ + PgStat_EntryRef *entry_ref; + + Assert(!pgstat_get_kind_info(kind)->fixed_amount); + + entry_ref = pgstat_get_entry_ref(kind, dboid, objoid, false, NULL); + if (!entry_ref || entry_ref->shared_entry->dropped) + return; + + pgstat_lock_entry(entry_ref, false); + shared_stat_reset_contents(kind, entry_ref->shared_stats, ts); + pgstat_unlock_entry(entry_ref); +} + +/* + * Scan through the shared hashtable of stats, resetting statistics if + * approved by the provided do_reset() function. + */ +void +pgstat_reset_matching_entries(bool (*do_reset) (PgStatShared_HashEntry *, Datum), + Datum match_data, TimestampTz ts) +{ + dshash_seq_status hstat; + PgStatShared_HashEntry *p; + + /* dshash entry is not modified, take shared lock */ + dshash_seq_init(&hstat, pgStatLocal.shared_hash, false); + while ((p = dshash_seq_next(&hstat)) != NULL) + { + PgStatShared_Common *header; + + if (p->dropped) + continue; + + if (!do_reset(p, match_data)) + continue; + + header = dsa_get_address(pgStatLocal.dsa, p->body); + + LWLockAcquire(&header->lock, LW_EXCLUSIVE); + + shared_stat_reset_contents(p->key.kind, header, ts); + + LWLockRelease(&header->lock); + } + dshash_seq_term(&hstat); +} + +static bool +match_kind(PgStatShared_HashEntry *p, Datum match_data) +{ + return p->key.kind == DatumGetInt32(match_data); +} + +void +pgstat_reset_entries_of_kind(PgStat_Kind kind, TimestampTz ts) +{ + pgstat_reset_matching_entries(match_kind, Int32GetDatum(kind), ts); +} + +static void +pgstat_setup_memcxt(void) +{ + if (unlikely(!pgStatSharedRefContext)) + pgStatSharedRefContext = + AllocSetContextCreate(CacheMemoryContext, + "PgStat Shared Ref", + ALLOCSET_SMALL_SIZES); + if (unlikely(!pgStatEntryRefHashContext)) + pgStatEntryRefHashContext = + AllocSetContextCreate(CacheMemoryContext, + "PgStat Shared Ref Hash", + ALLOCSET_SMALL_SIZES); +} diff --git a/src/backend/utils/activity/pgstat_slru.c b/src/backend/utils/activity/pgstat_slru.c index d932bc74e0..d0b85b62a5 100644 --- a/src/backend/utils/activity/pgstat_slru.c +++ b/src/backend/utils/activity/pgstat_slru.c @@ -18,18 +18,21 @@ #include "postgres.h" #include "utils/pgstat_internal.h" +#include "utils/timestamp.h" -static inline PgStat_MsgSLRU *get_slru_entry(int slru_idx); +static inline PgStat_SLRUStats *get_slru_entry(int slru_idx); +static void pgstat_reset_slru_counter_internal(int index, TimestampTz ts); /* - * SLRU statistics counts waiting to be sent to the collector. These are - * stored directly in stats message format so they can be sent without needing - * to copy things around. We assume this variable inits to zeroes. Entries - * are one-to-one with slru_names[]. + * SLRU statistics counts waiting to be flushed out. We assume this variable + * inits to zeroes. Entries are one-to-one with slru_names[]. Changes of + * SLRU counters are reported within critical sections so we use static memory + * in order to avoid memory allocation. */ -static PgStat_MsgSLRU SLRUStats[SLRU_NUM_ELEMENTS]; +static PgStat_SLRUStats pending_SLRUStats[SLRU_NUM_ELEMENTS]; +bool have_slrustats = false; /* @@ -41,17 +44,11 @@ static PgStat_MsgSLRU SLRUStats[SLRU_NUM_ELEMENTS]; void pgstat_reset_slru(const char *name) { - PgStat_MsgResetslrucounter msg; + TimestampTz ts = GetCurrentTimestamp(); AssertArg(name != NULL); - if (pgStatSock == PGINVALID_SOCKET) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSLRUCOUNTER); - msg.m_index = pgstat_get_slru_index(name); - - pgstat_send(&msg, sizeof(msg)); + pgstat_reset_slru_counter_internal(pgstat_get_slru_index(name), ts); } /* @@ -61,43 +58,55 @@ pgstat_reset_slru(const char *name) void pgstat_count_slru_page_zeroed(int slru_idx) { - get_slru_entry(slru_idx)->m_blocks_zeroed += 1; + get_slru_entry(slru_idx)->blocks_zeroed += 1; } void pgstat_count_slru_page_hit(int slru_idx) { - get_slru_entry(slru_idx)->m_blocks_hit += 1; + get_slru_entry(slru_idx)->blocks_hit += 1; } void pgstat_count_slru_page_exists(int slru_idx) { - get_slru_entry(slru_idx)->m_blocks_exists += 1; + get_slru_entry(slru_idx)->blocks_exists += 1; } void pgstat_count_slru_page_read(int slru_idx) { - get_slru_entry(slru_idx)->m_blocks_read += 1; + get_slru_entry(slru_idx)->blocks_read += 1; } void pgstat_count_slru_page_written(int slru_idx) { - get_slru_entry(slru_idx)->m_blocks_written += 1; + get_slru_entry(slru_idx)->blocks_written += 1; } void pgstat_count_slru_flush(int slru_idx) { - get_slru_entry(slru_idx)->m_flush += 1; + get_slru_entry(slru_idx)->flush += 1; } void pgstat_count_slru_truncate(int slru_idx) { - get_slru_entry(slru_idx)->m_truncate += 1; + get_slru_entry(slru_idx)->truncate += 1; +} + +/* + * Support function for the SQL-callable pgstat* functions. Returns + * a pointer to the slru statistics struct. + */ +PgStat_SLRUStats * +pgstat_fetch_slru(void) +{ + pgstat_snapshot_fixed(PGSTAT_KIND_SLRU); + + return pgStatLocal.snapshot.slru; } /* @@ -135,45 +144,81 @@ pgstat_get_slru_index(const char *name) } /* - * Send SLRU statistics to the collector + * Flush out locally pending SLRU stats entries + * + * If nowait is true, this function returns false on lock failure. Otherwise + * this function always returns true. Writer processes are mutually excluded + * using LWLock, but readers are expected to use change-count protocol to avoid + * interference with writers. + * + * If nowait is true, this function returns true if the lock could not be + * acquired. Otherwise return false. */ -void -pgstat_send_slru(void) +bool +pgstat_slru_flush(bool nowait) { - /* We assume this initializes to zeroes */ - static const PgStat_MsgSLRU all_zeroes; + PgStatShared_SLRU *stats_shmem = &pgStatLocal.shmem->slru; + int i; - for (int i = 0; i < SLRU_NUM_ELEMENTS; i++) + if (!have_slrustats) + return false; + + if (!nowait) + LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE); + else if (!LWLockConditionalAcquire(&stats_shmem->lock, LW_EXCLUSIVE)) + return true; + + for (i = 0; i < SLRU_NUM_ELEMENTS; i++) { - /* - * This function can be called even if nothing at all has happened. In - * this case, avoid sending a completely empty message to the stats - * collector. - */ - if (memcmp(&SLRUStats[i], &all_zeroes, sizeof(PgStat_MsgSLRU)) == 0) - continue; - - /* set the SLRU type before each send */ - SLRUStats[i].m_index = i; - - /* - * Prepare and send the message - */ - pgstat_setheader(&SLRUStats[i].m_hdr, PGSTAT_MTYPE_SLRU); - pgstat_send(&SLRUStats[i], sizeof(PgStat_MsgSLRU)); - - /* - * Clear out the statistics buffer, so it can be re-used. - */ - MemSet(&SLRUStats[i], 0, sizeof(PgStat_MsgSLRU)); + PgStat_SLRUStats *sharedent = &stats_shmem->stats[i]; + PgStat_SLRUStats *pendingent = &pending_SLRUStats[i]; + +#define SLRU_ACC(fld) sharedent->fld += pendingent->fld + SLRU_ACC(blocks_zeroed); + SLRU_ACC(blocks_hit); + SLRU_ACC(blocks_read); + SLRU_ACC(blocks_written); + SLRU_ACC(blocks_exists); + SLRU_ACC(flush); + SLRU_ACC(truncate); +#undef SLRU_ACC } + + /* done, clear the pending entry */ + MemSet(pending_SLRUStats, 0, sizeof(pending_SLRUStats)); + + LWLockRelease(&stats_shmem->lock); + + have_slrustats = false; + + return false; +} + +void +pgstat_slru_reset_all_cb(TimestampTz ts) +{ + for (int i = 0; i < SLRU_NUM_ELEMENTS; i++) + pgstat_reset_slru_counter_internal(i, ts); +} + +void +pgstat_slru_snapshot_cb(void) +{ + PgStatShared_SLRU *stats_shmem = &pgStatLocal.shmem->slru; + + LWLockAcquire(&stats_shmem->lock, LW_SHARED); + + memcpy(pgStatLocal.snapshot.slru, &stats_shmem->stats, + sizeof(stats_shmem->stats)); + + LWLockRelease(&stats_shmem->lock); } /* * Returns pointer to entry with counters for given SLRU (based on the name * stored in SlruCtl as lwlock tranche name). */ -static inline PgStat_MsgSLRU * +static inline PgStat_SLRUStats * get_slru_entry(int slru_idx) { pgstat_assert_is_up(); @@ -186,5 +231,20 @@ get_slru_entry(int slru_idx) Assert((slru_idx >= 0) && (slru_idx < SLRU_NUM_ELEMENTS)); - return &SLRUStats[slru_idx]; + have_slrustats = true; + + return &pending_SLRUStats[slru_idx]; +} + +static void +pgstat_reset_slru_counter_internal(int index, TimestampTz ts) +{ + PgStatShared_SLRU *stats_shmem = &pgStatLocal.shmem->slru; + + LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE); + + memset(&stats_shmem->stats[index], 0, sizeof(PgStat_SLRUStats)); + stats_shmem->stats[index].stat_reset_timestamp = ts; + + LWLockRelease(&stats_shmem->lock); } diff --git a/src/backend/utils/activity/pgstat_subscription.c b/src/backend/utils/activity/pgstat_subscription.c index 689029b30a..e1072bd5ba 100644 --- a/src/backend/utils/activity/pgstat_subscription.c +++ b/src/backend/utils/activity/pgstat_subscription.c @@ -26,12 +26,17 @@ void pgstat_report_subscription_error(Oid subid, bool is_apply_error) { - PgStat_MsgSubscriptionError msg; + PgStat_EntryRef *entry_ref; + PgStat_BackendSubEntry *pending; - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_SUBSCRIPTIONERROR); - msg.m_subid = subid; - msg.m_is_apply_error = is_apply_error; - pgstat_send(&msg, sizeof(PgStat_MsgSubscriptionError)); + entry_ref = pgstat_prep_pending_entry(PGSTAT_KIND_SUBSCRIPTION, + InvalidOid, subid, NULL); + pending = entry_ref->pending; + + if (is_apply_error) + pending->apply_error_count++; + else + pending->sync_error_count++; } /* @@ -54,12 +59,52 @@ pgstat_create_subscription(Oid subid) void pgstat_drop_subscription(Oid subid) { - PgStat_MsgSubscriptionDrop msg; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_SUBSCRIPTIONDROP); - msg.m_subid = subid; - pgstat_send(&msg, sizeof(PgStat_MsgSubscriptionDrop)); - pgstat_drop_transactional(PGSTAT_KIND_SUBSCRIPTION, InvalidOid, subid); } + +/* + * Support function for the SQL-callable pgstat* functions. Returns + * the collected statistics for one subscription or NULL. + */ +PgStat_StatSubEntry * +pgstat_fetch_stat_subscription(Oid subid) +{ + return (PgStat_StatSubEntry *) + pgstat_fetch_entry(PGSTAT_KIND_SUBSCRIPTION, InvalidOid, subid); +} + +/* + * Flush out pending stats for the entry + * + * If nowait is true, this function returns false if lock could not + * immediately acquired, otherwise true is returned. + */ +bool +pgstat_subscription_flush_cb(PgStat_EntryRef *entry_ref, bool nowait) +{ + PgStat_BackendSubEntry *localent; + PgStatShared_Subscription *shsubent; + + localent = (PgStat_BackendSubEntry *) entry_ref->pending; + shsubent = (PgStatShared_Subscription *) entry_ref->shared_stats; + + /* localent always has non-zero content */ + + if (!pgstat_lock_entry(entry_ref, nowait)) + return false; + +#define SUB_ACC(fld) shsubent->stats.fld += localent->fld + SUB_ACC(apply_error_count); + SUB_ACC(sync_error_count); +#undef SUB_ACC + + pgstat_unlock_entry(entry_ref); + return true; +} + +void +pgstat_subscription_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts) +{ + ((PgStatShared_Subscription *) header)->stats.stat_reset_timestamp = ts; +} diff --git a/src/backend/utils/activity/pgstat_wal.c b/src/backend/utils/activity/pgstat_wal.c index 8855598f52..5a878bd115 100644 --- a/src/backend/utils/activity/pgstat_wal.c +++ b/src/backend/utils/activity/pgstat_wal.c @@ -21,13 +21,7 @@ #include "executor/instrument.h" -/* - * WAL global statistics counters. Stored directly in a stats message - * structure so they can be sent without needing to copy things around. We - * assume these init to zeroes. - */ -PgStat_MsgWal WalStats; - +PgStat_WalStats PendingWalStats = {0}; /* * WAL usage counters saved from pgWALUsage at the previous call to @@ -39,101 +33,100 @@ static WalUsage prevWalUsage; /* - * Send WAL statistics to the collector. + * Calculate how much WAL usage counters have increased and update + * shared statistics. * - * If 'force' is not set, WAL stats message is only sent if enough time has - * passed since last one was sent to reach PGSTAT_STAT_INTERVAL. + * Must be called by processes that generate WAL, that do not call + * pgstat_report_stat(), like walwriter. */ void pgstat_report_wal(bool force) { - static TimestampTz sendTime = 0; + pgstat_flush_wal(force); +} + +/* + * Support function for the SQL-callable pgstat* functions. Returns + * a pointer to the WAL statistics struct. + */ +PgStat_WalStats * +pgstat_fetch_stat_wal(void) +{ + pgstat_snapshot_fixed(PGSTAT_KIND_WAL); + + return &pgStatLocal.snapshot.wal; +} + +/* + * Calculate how much WAL usage counters have increased by subtracting the + * previous counters from the current ones. + * + * If nowait is true, this function returns true if the lock could not be + * acquired. Otherwise return false. + */ +bool +pgstat_flush_wal(bool nowait) +{ + PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal; + WalUsage diff = {0}; + + Assert(IsUnderPostmaster || !IsPostmasterEnvironment); + Assert(pgStatLocal.shmem != NULL && + !pgStatLocal.shmem->is_shutdown); /* - * This function can be called even if nothing at all has happened. In - * this case, avoid sending a completely empty message to the stats - * collector. - * - * Check wal_records counter to determine whether any WAL activity has - * happened since last time. Note that other WalUsage counters don't need - * to be checked because they are incremented always together with - * wal_records counter. - * - * m_wal_buffers_full also doesn't need to be checked because it's - * incremented only when at least one WAL record is generated (i.e., - * wal_records counter is incremented). But for safely, we assert that - * m_wal_buffers_full is always zero when no WAL record is generated - * - * This function can be called by a process like walwriter that normally - * generates no WAL records. To determine whether any WAL activity has - * happened at that process since the last time, the numbers of WAL writes - * and syncs are also checked. + * This function can be called even if nothing at all has happened. Avoid + * taking lock for nothing in that case. */ - if (pgWalUsage.wal_records == prevWalUsage.wal_records && - WalStats.m_wal_write == 0 && WalStats.m_wal_sync == 0) - { - Assert(WalStats.m_wal_buffers_full == 0); - return; - } - - if (!force) - { - TimestampTz now = GetCurrentTimestamp(); - - /* - * Don't send a message unless it's been at least PGSTAT_STAT_INTERVAL - * msec since we last sent one to avoid overloading the stats - * collector. - */ - if (!TimestampDifferenceExceeds(sendTime, now, PGSTAT_STAT_INTERVAL)) - return; - sendTime = now; - } + if (!pgstat_have_pending_wal()) + return false; /* - * Set the counters related to generated WAL data if the counters were - * updated. + * We don't update the WAL usage portion of the local WalStats elsewhere. + * Calculate how much WAL usage counters were increased by subtracting the + * previous counters from the current ones. */ - if (pgWalUsage.wal_records != prevWalUsage.wal_records) - { - WalUsage walusage; - - /* - * Calculate how much WAL usage counters were increased by subtracting - * the previous counters from the current ones. Fill the results in - * WAL stats message. - */ - MemSet(&walusage, 0, sizeof(WalUsage)); - WalUsageAccumDiff(&walusage, &pgWalUsage, &prevWalUsage); - - WalStats.m_wal_records = walusage.wal_records; - WalStats.m_wal_fpi = walusage.wal_fpi; - WalStats.m_wal_bytes = walusage.wal_bytes; - - /* - * Save the current counters for the subsequent calculation of WAL - * usage. - */ - prevWalUsage = pgWalUsage; - } + WalUsageAccumDiff(&diff, &pgWalUsage, &prevWalUsage); + PendingWalStats.wal_records = diff.wal_records; + PendingWalStats.wal_fpi = diff.wal_fpi; + PendingWalStats.wal_bytes = diff.wal_bytes; + + if (!nowait) + LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE); + else if (!LWLockConditionalAcquire(&stats_shmem->lock, LW_EXCLUSIVE)) + return true; + +#define WALSTAT_ACC(fld) stats_shmem->stats.fld += PendingWalStats.fld + WALSTAT_ACC(wal_records); + WALSTAT_ACC(wal_fpi); + WALSTAT_ACC(wal_bytes); + WALSTAT_ACC(wal_buffers_full); + WALSTAT_ACC(wal_write); + WALSTAT_ACC(wal_sync); + WALSTAT_ACC(wal_write_time); + WALSTAT_ACC(wal_sync_time); +#undef WALSTAT_ACC + + LWLockRelease(&stats_shmem->lock); /* - * Prepare and send the message + * Save the current counters for the subsequent calculation of WAL usage. */ - pgstat_setheader(&WalStats.m_hdr, PGSTAT_MTYPE_WAL); - pgstat_send(&WalStats, sizeof(WalStats)); + prevWalUsage = pgWalUsage; /* * Clear out the statistics buffer, so it can be re-used. */ - MemSet(&WalStats, 0, sizeof(WalStats)); + MemSet(&PendingWalStats, 0, sizeof(PendingWalStats)); + + return false; } void pgstat_init_wal(void) { /* - * Initialize prevWalUsage with pgWalUsage so that pgstat_report_wal() can + * Initialize prevWalUsage with pgWalUsage so that pgstat_flush_wal() can * calculate how much pgWalUsage counters are increased by subtracting * prevWalUsage from pgWalUsage. */ @@ -151,6 +144,28 @@ bool pgstat_have_pending_wal(void) { return pgWalUsage.wal_records != prevWalUsage.wal_records || - WalStats.m_wal_write != 0 || - WalStats.m_wal_sync != 0; + PendingWalStats.wal_write != 0 || + PendingWalStats.wal_sync != 0; +} + +void +pgstat_wal_reset_all_cb(TimestampTz ts) +{ + PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal; + + LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE); + memset(&stats_shmem->stats, 0, sizeof(stats_shmem->stats)); + stats_shmem->stats.stat_reset_timestamp = ts; + LWLockRelease(&stats_shmem->lock); +} + +void +pgstat_wal_snapshot_cb(void) +{ + PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal; + + LWLockAcquire(&stats_shmem->lock, LW_SHARED); + memcpy(&pgStatLocal.snapshot.wal, &stats_shmem->stats, + sizeof(pgStatLocal.snapshot.wal)); + LWLockRelease(&stats_shmem->lock); } diff --git a/src/backend/utils/activity/pgstat_xact.c b/src/backend/utils/activity/pgstat_xact.c index 3f33087378..230ffa5afc 100644 --- a/src/backend/utils/activity/pgstat_xact.c +++ b/src/backend/utils/activity/pgstat_xact.c @@ -68,6 +68,7 @@ static void AtEOXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, bool isCommit) { dlist_mutable_iter iter; + int not_freed_count = 0; if (xact_state->pending_drops_count == 0) { @@ -79,6 +80,7 @@ AtEOXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, bool isCommit) { PgStat_PendingDroppedStatsItem *pending = dlist_container(PgStat_PendingDroppedStatsItem, node, iter.cur); + xl_xact_stats_item *it = &pending->item; if (isCommit && !pending->is_create) { @@ -86,7 +88,8 @@ AtEOXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, bool isCommit) * Transaction that dropped an object committed. Drop the stats * too. */ - /* will do work in subsequent commit */ + if (!pgstat_drop_entry(it->kind, it->dboid, it->objoid)) + not_freed_count++; } else if (!isCommit && pending->is_create) { @@ -94,13 +97,17 @@ AtEOXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, bool isCommit) * Transaction that created an object aborted. Drop the stats * associated with the object. */ - /* will do work in subsequent commit */ + if (!pgstat_drop_entry(it->kind, it->dboid, it->objoid)) + not_freed_count++; } dlist_delete(&pending->node); xact_state->pending_drops_count--; pfree(pending); } + + if (not_freed_count > 0) + pgstat_request_entry_refs_gc(); } /* @@ -135,6 +142,7 @@ AtEOSubXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, { PgStat_SubXactStatus *parent_xact_state; dlist_mutable_iter iter; + int not_freed_count = 0; if (xact_state->pending_drops_count == 0) return; @@ -145,6 +153,7 @@ AtEOSubXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, { PgStat_PendingDroppedStatsItem *pending = dlist_container(PgStat_PendingDroppedStatsItem, node, iter.cur); + xl_xact_stats_item *it = &pending->item; dlist_delete(&pending->node); xact_state->pending_drops_count--; @@ -155,7 +164,8 @@ AtEOSubXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, * Subtransaction creating a new stats object aborted. Drop the * stats object. */ - /* will do work in subsequent commit */ + if (!pgstat_drop_entry(it->kind, it->dboid, it->objoid)) + not_freed_count++; pfree(pending); } else if (isCommit) @@ -175,6 +185,8 @@ AtEOSubXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, } Assert(xact_state->pending_drops_count == 0); + if (not_freed_count > 0) + pgstat_request_entry_refs_gc(); } /* @@ -307,13 +319,21 @@ pgstat_get_transactional_drops(bool isCommit, xl_xact_stats_item **items) void pgstat_execute_transactional_drops(int ndrops, struct xl_xact_stats_item *items, bool is_redo) { + int not_freed_count = 0; + if (ndrops == 0) return; for (int i = 0; i < ndrops; i++) { - /* will do work in subsequent commit */ + xl_xact_stats_item *it = &items[i]; + + if (!pgstat_drop_entry(it->kind, it->dboid, it->objoid)) + not_freed_count++; } + + if (not_freed_count > 0) + pgstat_request_entry_refs_gc(); } static void @@ -345,6 +365,15 @@ create_drop_transactional_internal(PgStat_Kind kind, Oid dboid, Oid objoid, bool void pgstat_create_transactional(PgStat_Kind kind, Oid dboid, Oid objoid) { + if (pgstat_get_entry_ref(kind, dboid, objoid, false, NULL)) + { + ereport(WARNING, + errmsg("resetting existing stats for type %s, db=%d, oid=%d", + (pgstat_get_kind_info(kind))->name, dboid, objoid)); + + pgstat_reset(kind, dboid, objoid); + } + create_drop_transactional_internal(kind, dboid, objoid, /* create */ true); } diff --git a/src/backend/utils/activity/wait_event.c b/src/backend/utils/activity/wait_event.c index 1c8aba4925..87c15b9c6f 100644 --- a/src/backend/utils/activity/wait_event.c +++ b/src/backend/utils/activity/wait_event.c @@ -230,9 +230,6 @@ pgstat_get_wait_activity(WaitEventActivity w) case WAIT_EVENT_LOGICAL_LAUNCHER_MAIN: event_name = "LogicalLauncherMain"; break; - case WAIT_EVENT_PGSTAT_MAIN: - event_name = "PgStatMain"; - break; case WAIT_EVENT_RECOVERY_WAL_STREAM: event_name = "RecoveryWalStream"; break; diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index be5470a107..248d318f86 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -2046,7 +2046,15 @@ pg_stat_get_xact_function_self_time(PG_FUNCTION_ARGS) Datum pg_stat_get_snapshot_timestamp(PG_FUNCTION_ARGS) { - PG_RETURN_TIMESTAMPTZ(pgstat_fetch_global()->stats_timestamp); + bool have_snapshot; + TimestampTz ts; + + ts = pgstat_get_stat_snapshot_timestamp(&have_snapshot); + + if (!have_snapshot) + PG_RETURN_NULL(); + + PG_RETURN_TIMESTAMPTZ(ts); } /* Discard the active statistics snapshot */ diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index a15ce9edb1..1f29670a13 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -73,6 +73,7 @@ #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" +#include "pgstat.h" #include "rewrite/rewriteDefine.h" #include "rewrite/rowsecurity.h" #include "storage/lmgr.h" @@ -2409,6 +2410,9 @@ RelationDestroyRelation(Relation relation, bool remember_tupdesc) */ RelationCloseSmgr(relation); + /* break mutual link with stats entry */ + pgstat_unlink_relation(relation); + /* * Free all the subsidiary data structures of the relcache entry, then the * entry itself. @@ -2716,8 +2720,9 @@ RelationClearRelation(Relation relation, bool rebuild) SWAPFIELD(RowSecurityDesc *, rd_rsdesc); /* toast OID override must be preserved */ SWAPFIELD(Oid, rd_toastoid); - /* pgstat_info must be preserved */ + /* pgstat_info / enabled must be preserved */ SWAPFIELD(struct PgStat_TableStatus *, pgstat_info); + SWAPFIELD(bool, pgstat_enabled); /* preserve old partition key if we have one */ if (keep_partkey) { diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c index 3419c099b2..1a5d29ac9b 100644 --- a/src/backend/utils/init/globals.c +++ b/src/backend/utils/init/globals.c @@ -36,6 +36,7 @@ volatile sig_atomic_t IdleInTransactionSessionTimeoutPending = false; volatile sig_atomic_t IdleSessionTimeoutPending = false; volatile sig_atomic_t ProcSignalBarrierPending = false; volatile sig_atomic_t LogMemoryContextPending = false; +volatile sig_atomic_t IdleStatsUpdateTimeoutPending = false; volatile uint32 InterruptHoldoffCount = 0; volatile uint32 QueryCancelHoldoffCount = 0; volatile uint32 CritSectionCount = 0; diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index bdc77af719..0d3cfe8240 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -288,9 +288,6 @@ GetBackendTypeDesc(BackendType backendType) case B_ARCHIVER: backendDesc = "archiver"; break; - case B_STATS_COLLECTOR: - backendDesc = "stats collector"; - break; case B_LOGGER: backendDesc = "logger"; break; diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 342169b195..a85c2e0260 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -80,6 +80,7 @@ static void StatementTimeoutHandler(void); static void LockTimeoutHandler(void); static void IdleInTransactionSessionTimeoutHandler(void); static void IdleSessionTimeoutHandler(void); +static void IdleStatsUpdateTimeoutHandler(void); static void ClientCheckTimeoutHandler(void); static bool ThereIsAtLeastOneRole(void); static void process_startup_options(Port *port, bool am_superuser); @@ -725,6 +726,8 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username, IdleInTransactionSessionTimeoutHandler); RegisterTimeout(IDLE_SESSION_TIMEOUT, IdleSessionTimeoutHandler); RegisterTimeout(CLIENT_CONNECTION_CHECK_TIMEOUT, ClientCheckTimeoutHandler); + RegisterTimeout(IDLE_STATS_UPDATE_TIMEOUT, + IdleStatsUpdateTimeoutHandler); } /* @@ -752,6 +755,7 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username, * Use before_shmem_exit() so that ShutdownXLOG() can rely on DSM * segments etc to work (which in turn is required for pgstats). */ + before_shmem_exit(pgstat_before_server_shutdown, 0); before_shmem_exit(ShutdownXLOG, 0); } @@ -1334,6 +1338,14 @@ IdleSessionTimeoutHandler(void) SetLatch(MyLatch); } +static void +IdleStatsUpdateTimeoutHandler(void) +{ + IdleStatsUpdateTimeoutPending = true; + InterruptPending = true; + SetLatch(MyLatch); +} + static void ClientCheckTimeoutHandler(void) { diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 5538465d7d..f7758ea4a7 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -375,6 +375,16 @@ static const struct config_enum_entry track_function_options[] = { StaticAssertDecl(lengthof(track_function_options) == (TRACK_FUNC_ALL + 2), "array length mismatch"); +static const struct config_enum_entry stats_fetch_consistency[] = { + {"none", PGSTAT_FETCH_CONSISTENCY_NONE, false}, + {"cache", PGSTAT_FETCH_CONSISTENCY_CACHE, false}, + {"snapshot", PGSTAT_FETCH_CONSISTENCY_SNAPSHOT, false}, + {NULL, 0, false} +}; + +StaticAssertDecl(lengthof(stats_fetch_consistency) == (PGSTAT_FETCH_CONSISTENCY_SNAPSHOT + 2), + "array length mismatch"); + static const struct config_enum_entry xmlbinary_options[] = { {"base64", XMLBINARY_BASE64, false}, {"hex", XMLBINARY_HEX, false}, @@ -4918,6 +4928,17 @@ static struct config_enum ConfigureNamesEnum[] = NULL, NULL, NULL }, + + { + {"stats_fetch_consistency", PGC_USERSET, STATS_COLLECTOR, + gettext_noop("Sets the consistency of accesses to statistics data"), + NULL + }, + &pgstat_fetch_consistency, + PGSTAT_FETCH_CONSISTENCY_CACHE, stats_fetch_consistency, + NULL, NULL, NULL + }, + { {"wal_compression", PGC_SUSET, WAL_SETTINGS, gettext_noop("Compresses full-page writes written in WAL file with specified method."), diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 93d221a37b..5f9a37bed3 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -614,6 +614,7 @@ #track_wal_io_timing = off #track_functions = none # none, pl, all #stats_temp_directory = 'pg_stat_tmp' +#stats_fetch_consistency = none # - Monitoring - diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 9321d7f264..66c404c666 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -94,6 +94,7 @@ extern PGDLLIMPORT volatile sig_atomic_t IdleInTransactionSessionTimeoutPending; extern PGDLLIMPORT volatile sig_atomic_t IdleSessionTimeoutPending; extern PGDLLIMPORT volatile sig_atomic_t ProcSignalBarrierPending; extern PGDLLIMPORT volatile sig_atomic_t LogMemoryContextPending; +extern PGDLLIMPORT volatile sig_atomic_t IdleStatsUpdateTimeoutPending; extern PGDLLIMPORT volatile sig_atomic_t CheckClientConnectionPending; extern PGDLLIMPORT volatile sig_atomic_t ClientConnectionLost; @@ -333,7 +334,6 @@ typedef enum BackendType B_WAL_SENDER, B_WAL_WRITER, B_ARCHIVER, - B_STATS_COLLECTOR, B_LOGGER, } BackendType; diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 99115bacde..1d2d3de86c 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -14,10 +14,8 @@ #include "datatype/timestamp.h" #include "portability/instr_time.h" #include "postmaster/pgarch.h" /* for MAX_XFN_CHARS */ -#include "replication/logicalproto.h" #include "utils/backend_progress.h" /* for backward compatibility */ #include "utils/backend_status.h" /* for backward compatibility */ -#include "utils/hsearch.h" #include "utils/relcache.h" #include "utils/wait_event.h" /* for backward compatibility */ @@ -27,8 +25,8 @@ * ---------- */ #define PGSTAT_STAT_PERMANENT_DIRECTORY "pg_stat" -#define PGSTAT_STAT_PERMANENT_FILENAME "pg_stat/global.stat" -#define PGSTAT_STAT_PERMANENT_TMPFILE "pg_stat/global.tmp" +#define PGSTAT_STAT_PERMANENT_FILENAME "pg_stat/pgstat.stat" +#define PGSTAT_STAT_PERMANENT_TMPFILE "pg_stat/pgstat.tmp" /* Default directory to store temporary statistics data in */ #define PG_STAT_TMP_DIR "pg_stat_tmp" @@ -66,6 +64,13 @@ typedef enum TrackFunctionsLevel TRACK_FUNC_ALL } TrackFunctionsLevel; +typedef enum PgStat_FetchConsistency +{ + PGSTAT_FETCH_CONSISTENCY_NONE, + PGSTAT_FETCH_CONSISTENCY_CACHE, + PGSTAT_FETCH_CONSISTENCY_SNAPSHOT, +} PgStat_FetchConsistency; + /* Values to track the cause of session termination */ typedef enum SessionEndType { @@ -92,7 +97,7 @@ typedef int64 PgStat_Counter; * PgStat_FunctionCounts The actual per-function counts kept by a backend * * This struct should contain only actual event counters, because we memcmp - * it against zeroes to detect whether there are any counts to transmit. + * it against zeroes to detect whether there are any pending stats. * * Note that the time counters are in instr_time format here. We convert to * microseconds in PgStat_Counter format when flushing out pending statistics. @@ -106,12 +111,11 @@ typedef struct PgStat_FunctionCounts } PgStat_FunctionCounts; /* ---------- - * PgStat_BackendFunctionEntry Entry in backend's per-function hash table + * PgStat_BackendFunctionEntry Non-flushed function stats. * ---------- */ typedef struct PgStat_BackendFunctionEntry { - Oid f_id; PgStat_FunctionCounts f_counts; } PgStat_BackendFunctionEntry; @@ -131,13 +135,22 @@ typedef struct PgStat_FunctionCallUsage instr_time f_start; } PgStat_FunctionCallUsage; +/* ---------- + * PgStat_BackendSubEntry Non-flushed subscription stats. + * ---------- + */ +typedef struct PgStat_BackendSubEntry +{ + PgStat_Counter apply_error_count; + PgStat_Counter sync_error_count; +} PgStat_BackendSubEntry; + /* ---------- * PgStat_TableCounts The actual per-table counts kept by a backend * * This struct should contain only actual event counters, because we memcmp - * it against zeroes to detect whether there are any counts to transmit. - * It is a component of PgStat_TableStatus (within-backend state) and - * PgStat_TableEntry (the transmitted message format). + * it against zeroes to detect whether there are any stats updates to apply. + * It is a component of PgStat_TableStatus (within-backend state). * * Note: for a table, tuples_returned is the number of tuples successfully * fetched by heap_getnext, while tuples_fetched is the number of tuples @@ -194,6 +207,7 @@ typedef struct PgStat_TableStatus bool t_shared; /* is it a shared catalog? */ struct PgStat_TableXactStatus *trans; /* lowest subxact's counts */ PgStat_TableCounts t_counts; /* event counts to be sent */ + Relation relation; /* rel that is using this entry */ } PgStat_TableStatus; /* ---------- @@ -221,569 +235,14 @@ typedef struct PgStat_TableXactStatus /* ------------------------------------------------------------ - * Message formats follow - * ------------------------------------------------------------ - */ - -/* ---------- - * The types of backend -> collector messages - * ---------- - */ -typedef enum StatMsgType -{ - PGSTAT_MTYPE_DUMMY, - PGSTAT_MTYPE_INQUIRY, - PGSTAT_MTYPE_TABSTAT, - PGSTAT_MTYPE_TABPURGE, - PGSTAT_MTYPE_DROPDB, - PGSTAT_MTYPE_RESETCOUNTER, - PGSTAT_MTYPE_RESETSHAREDCOUNTER, - PGSTAT_MTYPE_RESETSINGLECOUNTER, - PGSTAT_MTYPE_RESETSLRUCOUNTER, - PGSTAT_MTYPE_RESETREPLSLOTCOUNTER, - PGSTAT_MTYPE_RESETSUBCOUNTER, - PGSTAT_MTYPE_AUTOVAC_START, - PGSTAT_MTYPE_VACUUM, - PGSTAT_MTYPE_ANALYZE, - PGSTAT_MTYPE_ARCHIVER, - PGSTAT_MTYPE_BGWRITER, - PGSTAT_MTYPE_CHECKPOINTER, - PGSTAT_MTYPE_WAL, - PGSTAT_MTYPE_SLRU, - PGSTAT_MTYPE_FUNCSTAT, - PGSTAT_MTYPE_FUNCPURGE, - PGSTAT_MTYPE_RECOVERYCONFLICT, - PGSTAT_MTYPE_TEMPFILE, - PGSTAT_MTYPE_DEADLOCK, - PGSTAT_MTYPE_CHECKSUMFAILURE, - PGSTAT_MTYPE_REPLSLOT, - PGSTAT_MTYPE_CONNECT, - PGSTAT_MTYPE_DISCONNECT, - PGSTAT_MTYPE_SUBSCRIPTIONDROP, - PGSTAT_MTYPE_SUBSCRIPTIONERROR, -} StatMsgType; - -/* ---------- - * PgStat_MsgHdr The common message header - * ---------- - */ -typedef struct PgStat_MsgHdr -{ - StatMsgType m_type; - int m_size; -} PgStat_MsgHdr; - -/* ---------- - * Space available in a message. This will keep the UDP packets below 1K, - * which should fit unfragmented into the MTU of the loopback interface. - * (Larger values of PGSTAT_MAX_MSG_SIZE would work for that on most - * platforms, but we're being conservative here.) - * ---------- - */ -#define PGSTAT_MAX_MSG_SIZE 1000 -#define PGSTAT_MSG_PAYLOAD (PGSTAT_MAX_MSG_SIZE - sizeof(PgStat_MsgHdr)) - - -/* ---------- - * PgStat_MsgDummy A dummy message, ignored by the collector - * ---------- - */ -typedef struct PgStat_MsgDummy -{ - PgStat_MsgHdr m_hdr; -} PgStat_MsgDummy; - -/* ---------- - * PgStat_MsgInquiry Sent by a backend to ask the collector - * to write the stats file(s). - * - * Ordinarily, an inquiry message prompts writing of the global stats file, - * the stats file for shared catalogs, and the stats file for the specified - * database. If databaseid is InvalidOid, only the first two are written. - * - * New file(s) will be written only if the existing file has a timestamp - * older than the specified cutoff_time; this prevents duplicated effort - * when multiple requests arrive at nearly the same time, assuming that - * backends send requests with cutoff_times a little bit in the past. - * - * clock_time should be the requestor's current local time; the collector - * uses this to check for the system clock going backward, but it has no - * effect unless that occurs. We assume clock_time >= cutoff_time, though. - * ---------- - */ -typedef struct PgStat_MsgInquiry -{ - PgStat_MsgHdr m_hdr; - TimestampTz clock_time; /* observed local clock time */ - TimestampTz cutoff_time; /* minimum acceptable file timestamp */ - Oid databaseid; /* requested DB (InvalidOid => shared only) */ -} PgStat_MsgInquiry; - -/* ---------- - * PgStat_TableEntry Per-table info in a MsgTabstat - * ---------- - */ -typedef struct PgStat_TableEntry -{ - Oid t_id; - PgStat_TableCounts t_counts; -} PgStat_TableEntry; - -/* ---------- - * PgStat_MsgTabstat Sent by the backend to report table - * and buffer access statistics. - * ---------- - */ -#define PGSTAT_NUM_TABENTRIES \ - ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - 3 * sizeof(int) - 5 * sizeof(PgStat_Counter)) \ - / sizeof(PgStat_TableEntry)) - -typedef struct PgStat_MsgTabstat -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - int m_nentries; - int m_xact_commit; - int m_xact_rollback; - PgStat_Counter m_block_read_time; /* times in microseconds */ - PgStat_Counter m_block_write_time; - PgStat_Counter m_session_time; - PgStat_Counter m_active_time; - PgStat_Counter m_idle_in_xact_time; - PgStat_TableEntry m_entry[PGSTAT_NUM_TABENTRIES]; -} PgStat_MsgTabstat; - -/* ---------- - * PgStat_MsgTabpurge Sent by the backend to tell the collector - * about dead tables. - * ---------- - */ -#define PGSTAT_NUM_TABPURGE \ - ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) \ - / sizeof(Oid)) - -typedef struct PgStat_MsgTabpurge -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - int m_nentries; - Oid m_tableid[PGSTAT_NUM_TABPURGE]; -} PgStat_MsgTabpurge; - -/* ---------- - * PgStat_MsgDropdb Sent by the backend to tell the collector - * about a dropped database - * ---------- - */ -typedef struct PgStat_MsgDropdb -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; -} PgStat_MsgDropdb; - -/* ---------- - * PgStat_MsgResetcounter Sent by the backend to tell the collector - * to reset counters - * ---------- - */ -typedef struct PgStat_MsgResetcounter -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; -} PgStat_MsgResetcounter; - -/* ---------- - * PgStat_MsgResetsharedcounter Sent by the backend to tell the collector - * to reset a shared counter - * ---------- - */ -typedef struct PgStat_MsgResetsharedcounter -{ - PgStat_MsgHdr m_hdr; - PgStat_Kind m_resettarget; -} PgStat_MsgResetsharedcounter; - -/* ---------- - * PgStat_MsgResetsinglecounter Sent by the backend to tell the collector - * to reset a single counter - * ---------- - */ -typedef struct PgStat_MsgResetsinglecounter -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - PgStat_Kind m_resettype; - Oid m_objectid; -} PgStat_MsgResetsinglecounter; - -/* ---------- - * PgStat_MsgResetslrucounter Sent by the backend to tell the collector - * to reset a SLRU counter - * ---------- - */ -typedef struct PgStat_MsgResetslrucounter -{ - PgStat_MsgHdr m_hdr; - int m_index; -} PgStat_MsgResetslrucounter; - -/* ---------- - * PgStat_MsgResetreplslotcounter Sent by the backend to tell the collector - * to reset replication slot counter(s) - * ---------- - */ -typedef struct PgStat_MsgResetreplslotcounter -{ - PgStat_MsgHdr m_hdr; - NameData m_slotname; - bool clearall; -} PgStat_MsgResetreplslotcounter; - -/* ---------- - * PgStat_MsgResetsubcounter Sent by the backend to tell the collector - * to reset subscription counter(s) - * ---------- - */ -typedef struct PgStat_MsgResetsubcounter -{ - PgStat_MsgHdr m_hdr; - Oid m_subid; /* InvalidOid means reset all subscription - * stats */ -} PgStat_MsgResetsubcounter; - -/* ---------- - * PgStat_MsgAutovacStart Sent by the autovacuum daemon to signal - * that a database is going to be processed - * ---------- - */ -typedef struct PgStat_MsgAutovacStart -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - TimestampTz m_start_time; -} PgStat_MsgAutovacStart; - -/* ---------- - * PgStat_MsgVacuum Sent by the backend or autovacuum daemon - * after VACUUM - * ---------- - */ -typedef struct PgStat_MsgVacuum -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - Oid m_tableoid; - bool m_autovacuum; - TimestampTz m_vacuumtime; - PgStat_Counter m_live_tuples; - PgStat_Counter m_dead_tuples; -} PgStat_MsgVacuum; - -/* ---------- - * PgStat_MsgAnalyze Sent by the backend or autovacuum daemon - * after ANALYZE - * ---------- - */ -typedef struct PgStat_MsgAnalyze -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - Oid m_tableoid; - bool m_autovacuum; - bool m_resetcounter; - TimestampTz m_analyzetime; - PgStat_Counter m_live_tuples; - PgStat_Counter m_dead_tuples; -} PgStat_MsgAnalyze; - -/* ---------- - * PgStat_MsgArchiver Sent by the archiver to update statistics. - * ---------- - */ -typedef struct PgStat_MsgArchiver -{ - PgStat_MsgHdr m_hdr; - bool m_failed; /* Failed attempt */ - char m_xlog[MAX_XFN_CHARS + 1]; - TimestampTz m_timestamp; -} PgStat_MsgArchiver; - -/* ---------- - * PgStat_MsgBgWriter Sent by the bgwriter to update statistics. - * ---------- - */ -typedef struct PgStat_MsgBgWriter -{ - PgStat_MsgHdr m_hdr; - - PgStat_Counter m_buf_written_clean; - PgStat_Counter m_maxwritten_clean; - PgStat_Counter m_buf_alloc; -} PgStat_MsgBgWriter; - -/* ---------- - * PgStat_MsgCheckpointer Sent by the checkpointer to update statistics. - * ---------- - */ -typedef struct PgStat_MsgCheckpointer -{ - PgStat_MsgHdr m_hdr; - - PgStat_Counter m_timed_checkpoints; - PgStat_Counter m_requested_checkpoints; - PgStat_Counter m_buf_written_checkpoints; - PgStat_Counter m_buf_written_backend; - PgStat_Counter m_buf_fsync_backend; - PgStat_Counter m_checkpoint_write_time; /* times in milliseconds */ - PgStat_Counter m_checkpoint_sync_time; -} PgStat_MsgCheckpointer; - -/* ---------- - * PgStat_MsgWal Sent by backends and background processes to update WAL statistics. - * ---------- - */ -typedef struct PgStat_MsgWal -{ - PgStat_MsgHdr m_hdr; - PgStat_Counter m_wal_records; - PgStat_Counter m_wal_fpi; - uint64 m_wal_bytes; - PgStat_Counter m_wal_buffers_full; - PgStat_Counter m_wal_write; - PgStat_Counter m_wal_sync; - PgStat_Counter m_wal_write_time; /* time spent writing wal records in - * microseconds */ - PgStat_Counter m_wal_sync_time; /* time spent syncing wal records in - * microseconds */ -} PgStat_MsgWal; - -/* ---------- - * PgStat_MsgSLRU Sent by a backend to update SLRU statistics. - * ---------- - */ -typedef struct PgStat_MsgSLRU -{ - PgStat_MsgHdr m_hdr; - PgStat_Counter m_index; - PgStat_Counter m_blocks_zeroed; - PgStat_Counter m_blocks_hit; - PgStat_Counter m_blocks_read; - PgStat_Counter m_blocks_written; - PgStat_Counter m_blocks_exists; - PgStat_Counter m_flush; - PgStat_Counter m_truncate; -} PgStat_MsgSLRU; - -/* ---------- - * PgStat_MsgReplSlot Sent by a backend or a wal sender to update replication - * slot statistics. - * ---------- - */ -typedef struct PgStat_MsgReplSlot -{ - PgStat_MsgHdr m_hdr; - NameData m_slotname; - bool m_create; - bool m_drop; - PgStat_Counter m_spill_txns; - PgStat_Counter m_spill_count; - PgStat_Counter m_spill_bytes; - PgStat_Counter m_stream_txns; - PgStat_Counter m_stream_count; - PgStat_Counter m_stream_bytes; - PgStat_Counter m_total_txns; - PgStat_Counter m_total_bytes; -} PgStat_MsgReplSlot; - -/* ---------- - * PgStat_MsgSubscriptionDrop Sent by the backend and autovacuum to tell the - * collector about the dead subscription. - * ---------- - */ -typedef struct PgStat_MsgSubscriptionDrop -{ - PgStat_MsgHdr m_hdr; - Oid m_subid; -} PgStat_MsgSubscriptionDrop; - -/* ---------- - * PgStat_MsgSubscriptionError Sent by the apply worker or the table sync - * worker to report an error on the subscription. - * ---------- - */ -typedef struct PgStat_MsgSubscriptionError -{ - PgStat_MsgHdr m_hdr; - - Oid m_subid; - bool m_is_apply_error; -} PgStat_MsgSubscriptionError; - -/* ---------- - * PgStat_MsgRecoveryConflict Sent by the backend upon recovery conflict - * ---------- - */ -typedef struct PgStat_MsgRecoveryConflict -{ - PgStat_MsgHdr m_hdr; - - Oid m_databaseid; - int m_reason; -} PgStat_MsgRecoveryConflict; - -/* ---------- - * PgStat_MsgTempFile Sent by the backend upon creating a temp file - * ---------- - */ -typedef struct PgStat_MsgTempFile -{ - PgStat_MsgHdr m_hdr; - - Oid m_databaseid; - size_t m_filesize; -} PgStat_MsgTempFile; - -/* ---------- - * PgStat_FunctionEntry Per-function info in a MsgFuncstat - * ---------- - */ -typedef struct PgStat_FunctionEntry -{ - Oid f_id; - PgStat_Counter f_numcalls; - PgStat_Counter f_total_time; /* times in microseconds */ - PgStat_Counter f_self_time; -} PgStat_FunctionEntry; - -/* ---------- - * PgStat_MsgFuncstat Sent by the backend to report function - * usage statistics. - * ---------- - */ -#define PGSTAT_NUM_FUNCENTRIES \ - ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) \ - / sizeof(PgStat_FunctionEntry)) - -typedef struct PgStat_MsgFuncstat -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - int m_nentries; - PgStat_FunctionEntry m_entry[PGSTAT_NUM_FUNCENTRIES]; -} PgStat_MsgFuncstat; - -/* ---------- - * PgStat_MsgFuncpurge Sent by the backend to tell the collector - * about dead functions. - * ---------- - */ -#define PGSTAT_NUM_FUNCPURGE \ - ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) \ - / sizeof(Oid)) - -typedef struct PgStat_MsgFuncpurge -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - int m_nentries; - Oid m_functionid[PGSTAT_NUM_FUNCPURGE]; -} PgStat_MsgFuncpurge; - -/* ---------- - * PgStat_MsgDeadlock Sent by the backend to tell the collector - * about a deadlock that occurred. - * ---------- - */ -typedef struct PgStat_MsgDeadlock -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; -} PgStat_MsgDeadlock; - -/* ---------- - * PgStat_MsgChecksumFailure Sent by the backend to tell the collector - * about checksum failures noticed. - * ---------- - */ -typedef struct PgStat_MsgChecksumFailure -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - int m_failurecount; - TimestampTz m_failure_time; -} PgStat_MsgChecksumFailure; - -/* ---------- - * PgStat_MsgConnect Sent by the backend upon connection - * establishment - * ---------- - */ -typedef struct PgStat_MsgConnect -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; -} PgStat_MsgConnect; - -/* ---------- - * PgStat_MsgDisconnect Sent by the backend when disconnecting - * ---------- - */ -typedef struct PgStat_MsgDisconnect -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - SessionEndType m_cause; -} PgStat_MsgDisconnect; - -/* ---------- - * PgStat_Msg Union over all possible messages. - * ---------- - */ -typedef union PgStat_Msg -{ - PgStat_MsgHdr msg_hdr; - PgStat_MsgDummy msg_dummy; - PgStat_MsgInquiry msg_inquiry; - PgStat_MsgTabstat msg_tabstat; - PgStat_MsgTabpurge msg_tabpurge; - PgStat_MsgDropdb msg_dropdb; - PgStat_MsgResetcounter msg_resetcounter; - PgStat_MsgResetsharedcounter msg_resetsharedcounter; - PgStat_MsgResetsinglecounter msg_resetsinglecounter; - PgStat_MsgResetslrucounter msg_resetslrucounter; - PgStat_MsgResetreplslotcounter msg_resetreplslotcounter; - PgStat_MsgResetsubcounter msg_resetsubcounter; - PgStat_MsgAutovacStart msg_autovacuum_start; - PgStat_MsgVacuum msg_vacuum; - PgStat_MsgAnalyze msg_analyze; - PgStat_MsgArchiver msg_archiver; - PgStat_MsgBgWriter msg_bgwriter; - PgStat_MsgCheckpointer msg_checkpointer; - PgStat_MsgWal msg_wal; - PgStat_MsgSLRU msg_slru; - PgStat_MsgFuncstat msg_funcstat; - PgStat_MsgFuncpurge msg_funcpurge; - PgStat_MsgRecoveryConflict msg_recoveryconflict; - PgStat_MsgDeadlock msg_deadlock; - PgStat_MsgTempFile msg_tempfile; - PgStat_MsgChecksumFailure msg_checksumfailure; - PgStat_MsgReplSlot msg_replslot; - PgStat_MsgConnect msg_connect; - PgStat_MsgDisconnect msg_disconnect; - PgStat_MsgSubscriptionError msg_subscriptionerror; - PgStat_MsgSubscriptionDrop msg_subscriptiondrop; -} PgStat_Msg; - - -/* ------------------------------------------------------------ - * Statistic collector data structures follow + * Data structures on disk and in shared memory follow * * PGSTAT_FILE_FORMAT_ID should be changed whenever any of these * data structures change. * ------------------------------------------------------------ */ -#define PGSTAT_FILE_FORMAT_ID 0x01A5BCA6 +#define PGSTAT_FILE_FORMAT_ID 0x01A5BCA7 typedef struct PgStat_ArchiverStats { @@ -808,7 +267,6 @@ typedef struct PgStat_BgWriterStats typedef struct PgStat_CheckpointerStats { - TimestampTz stats_timestamp; /* time of stats file update */ PgStat_Counter timed_checkpoints; PgStat_Counter requested_checkpoints; PgStat_Counter checkpoint_write_time; /* times in milliseconds */ @@ -820,7 +278,6 @@ typedef struct PgStat_CheckpointerStats typedef struct PgStat_StatDBEntry { - Oid databaseid; PgStat_Counter n_xact_commit; PgStat_Counter n_xact_rollback; PgStat_Counter n_blocks_fetched; @@ -852,34 +309,16 @@ typedef struct PgStat_StatDBEntry PgStat_Counter n_sessions_killed; TimestampTz stat_reset_timestamp; - TimestampTz stats_timestamp; /* time of db stats file update */ - - /* - * tables and functions must be last in the struct, because we don't write - * the pointers out to the stats file. - */ - HTAB *tables; - HTAB *functions; } PgStat_StatDBEntry; typedef struct PgStat_StatFuncEntry { - Oid functionid; - PgStat_Counter f_numcalls; PgStat_Counter f_total_time; /* times in microseconds */ PgStat_Counter f_self_time; } PgStat_StatFuncEntry; -typedef struct PgStat_GlobalStats -{ - TimestampTz stats_timestamp; /* time of stats file update */ - - PgStat_CheckpointerStats checkpointer; - PgStat_BgWriterStats bgwriter; -} PgStat_GlobalStats; - typedef struct PgStat_StatReplSlotEntry { NameData slotname; @@ -908,8 +347,6 @@ typedef struct PgStat_SLRUStats typedef struct PgStat_StatSubEntry { - Oid subid; /* hash key (must be first) */ - PgStat_Counter apply_error_count; PgStat_Counter sync_error_count; TimestampTz stat_reset_timestamp; @@ -917,8 +354,6 @@ typedef struct PgStat_StatSubEntry typedef struct PgStat_StatTabEntry { - Oid tableid; - PgStat_Counter numscans; PgStat_Counter tuples_returned; @@ -966,22 +401,19 @@ typedef struct PgStat_WalStats */ /* functions called from postmaster */ -extern void pgstat_init(void); -extern void pgstat_reset_all(void); -extern int pgstat_start(void); -extern void allow_immediate_pgstat_restart(void); +extern Size StatsShmemSize(void); +extern void StatsShmemInit(void); -#ifdef EXEC_BACKEND -extern void PgstatCollectorMain(int argc, char *argv[]) pg_attribute_noreturn(); -#endif +/* Functions called during server startup / shutdown */ +extern void pgstat_restore_stats(void); +extern void pgstat_discard_stats(void); +extern void pgstat_before_server_shutdown(int code, Datum arg); /* Functions for backend initialization */ extern void pgstat_initialize(void); /* Functions called from backends */ -extern void pgstat_report_stat(bool force); -extern void pgstat_vacuum_stat(void); -extern void pgstat_ping(void); +extern long pgstat_report_stat(bool force); extern void pgstat_reset_counters(void); extern void pgstat_reset(PgStat_Kind kind, Oid dboid, Oid objectid); @@ -989,24 +421,17 @@ extern void pgstat_reset_of_kind(PgStat_Kind kind); /* stats accessors */ extern void pgstat_clear_snapshot(void); -extern PgStat_ArchiverStats *pgstat_fetch_stat_archiver(void); -extern PgStat_BgWriterStats *pgstat_fetch_stat_bgwriter(void); -extern PgStat_CheckpointerStats *pgstat_fetch_stat_checkpointer(void); -extern PgStat_StatDBEntry *pgstat_fetch_stat_dbentry(Oid dbid); -extern PgStat_StatFuncEntry *pgstat_fetch_stat_funcentry(Oid funcid); -extern PgStat_GlobalStats *pgstat_fetch_global(void); -extern PgStat_StatReplSlotEntry *pgstat_fetch_replslot(NameData slotname); -extern PgStat_StatSubEntry *pgstat_fetch_stat_subscription(Oid subid); -extern PgStat_SLRUStats *pgstat_fetch_slru(void); -extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry(Oid relid); -extern PgStat_WalStats *pgstat_fetch_stat_wal(void); +extern TimestampTz pgstat_get_stat_snapshot_timestamp(bool *have_snapshot); +/* helpers */ +extern PgStat_Kind pgstat_get_kind_from_str(char *kind_str); /* * Functions in pgstat_archiver.c */ extern void pgstat_report_archiver(const char *xlog, bool failed); +extern PgStat_ArchiverStats *pgstat_fetch_stat_archiver(void); /* @@ -1014,6 +439,7 @@ extern void pgstat_report_archiver(const char *xlog, bool failed); */ extern void pgstat_report_bgwriter(void); +extern PgStat_BgWriterStats *pgstat_fetch_stat_bgwriter(void); /* @@ -1021,6 +447,7 @@ extern void pgstat_report_bgwriter(void); */ extern void pgstat_report_checkpointer(void); +extern PgStat_CheckpointerStats *pgstat_fetch_stat_checkpointer(void); /* @@ -1044,6 +471,7 @@ extern void pgstat_report_connect(Oid dboid); #define pgstat_count_conn_txn_idle_time(n) \ (pgStatTransactionIdleTime += (n)) +extern PgStat_StatDBEntry *pgstat_fetch_stat_dbentry(Oid dbid); /* * Functions in pgstat_function.c @@ -1058,6 +486,7 @@ extern void pgstat_init_function_usage(struct FunctionCallInfoBaseData *fcinfo, extern void pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize); +extern PgStat_StatFuncEntry *pgstat_fetch_stat_funcentry(Oid funcid); extern PgStat_BackendFunctionEntry *find_funcstat_entry(Oid func_id); @@ -1070,6 +499,8 @@ extern void pgstat_drop_relation(Relation rel); extern void pgstat_copy_relation_stats(Relation dstrel, Relation srcrel); extern void pgstat_init_relation(Relation rel); +extern void pgstat_assoc_relation(Relation rel); +extern void pgstat_unlink_relation(Relation rel); extern void pgstat_report_vacuum(Oid tableoid, bool shared, PgStat_Counter livetuples, PgStat_Counter deadtuples); @@ -1077,8 +508,14 @@ extern void pgstat_report_analyze(Relation rel, PgStat_Counter livetuples, PgStat_Counter deadtuples, bool resetcounter); +/* + * If stats are enabled, but pending data hasn't been prepared yet, call + * pgstat_assoc_relation() to do so. See its comment for why this is done + * separately from pgstat_init_relation(). + */ #define pgstat_should_count_relation(rel) \ - (likely((rel)->pgstat_info != NULL)) + (likely((rel)->pgstat_info != NULL) ? true : \ + ((rel)->pgstat_enabled ? pgstat_assoc_relation(rel), true : false)) /* nontransactional event counts are simple enough to inline */ @@ -1129,6 +566,9 @@ extern void pgstat_twophase_postcommit(TransactionId xid, uint16 info, extern void pgstat_twophase_postabort(TransactionId xid, uint16 info, void *recdata, uint32 len); +extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry(Oid relid); +extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry_ext(bool shared, + Oid relid); extern PgStat_TableStatus *find_tabstat_entry(Oid rel_id); @@ -1140,7 +580,9 @@ extern void pgstat_reset_replslot(const char *name); struct ReplicationSlot; extern void pgstat_report_replslot(struct ReplicationSlot *slot, const PgStat_StatReplSlotEntry *repSlotStat); extern void pgstat_create_replslot(struct ReplicationSlot *slot); +extern void pgstat_acquire_replslot(struct ReplicationSlot *slot); extern void pgstat_drop_replslot(struct ReplicationSlot *slot); +extern PgStat_StatReplSlotEntry *pgstat_fetch_replslot(NameData slotname); /* @@ -1157,6 +599,7 @@ extern void pgstat_count_slru_flush(int slru_idx); extern void pgstat_count_slru_truncate(int slru_idx); extern const char *pgstat_get_slru_name(int slru_idx); extern int pgstat_get_slru_index(const char *name); +extern PgStat_SLRUStats *pgstat_fetch_slru(void); /* @@ -1166,6 +609,7 @@ extern int pgstat_get_slru_index(const char *name); extern void pgstat_report_subscription_error(Oid subid, bool is_apply_error); extern void pgstat_create_subscription(Oid subid); extern void pgstat_drop_subscription(Oid subid); +extern PgStat_StatSubEntry *pgstat_fetch_stat_subscription(Oid subid); /* @@ -1186,6 +630,7 @@ extern void pgstat_execute_transactional_drops(int ndrops, struct xl_xact_stats_ */ extern void pgstat_report_wal(bool force); +extern PgStat_WalStats *pgstat_fetch_stat_wal(void); /* @@ -1195,6 +640,8 @@ extern void pgstat_report_wal(bool force); /* GUC parameters */ extern PGDLLIMPORT bool pgstat_track_counts; extern PGDLLIMPORT int pgstat_track_functions; +extern PGDLLIMPORT int pgstat_fetch_consistency; + extern char *pgstat_stat_directory; extern char *pgstat_stat_tmpname; extern char *pgstat_stat_filename; @@ -1205,7 +652,7 @@ extern char *pgstat_stat_filename; */ /* updated directly by bgwriter and bufmgr */ -extern PgStat_MsgBgWriter PendingBgWriterStats; +extern PgStat_BgWriterStats PendingBgWriterStats; /* @@ -1216,7 +663,7 @@ extern PgStat_MsgBgWriter PendingBgWriterStats; * Checkpointer statistics counters are updated directly by checkpointer and * bufmgr. */ -extern PgStat_MsgCheckpointer PendingCheckpointerStats; +extern PgStat_CheckpointerStats PendingCheckpointerStats; /* @@ -1243,7 +690,7 @@ extern SessionEndType pgStatSessionEndCause; */ /* updated directly by backends and background processes */ -extern PgStat_MsgWal WalStats; +extern PgStat_WalStats PendingWalStats; #endif /* PGSTAT_H */ diff --git a/src/include/storage/lwlock.h b/src/include/storage/lwlock.h index c3d5889d7b..33eb4c1033 100644 --- a/src/include/storage/lwlock.h +++ b/src/include/storage/lwlock.h @@ -190,6 +190,9 @@ typedef enum BuiltinTrancheIds LWTRANCHE_SHARED_TIDBITMAP, LWTRANCHE_PARALLEL_APPEND, LWTRANCHE_PER_XACT_PREDICATE_LIST, + LWTRANCHE_PGSTATS_DSA, + LWTRANCHE_PGSTATS_HASH, + LWTRANCHE_PGSTATS_DATA, LWTRANCHE_FIRST_USER_DEFINED } BuiltinTrancheIds; diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index c3f83c74c6..ab27bc47c5 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -14,21 +14,134 @@ #define PGSTAT_INTERNAL_H +#include "common/hashfn.h" +#include "lib/dshash.h" +#include "lib/ilist.h" #include "pgstat.h" +#include "storage/lwlock.h" +#include "utils/dsa.h" -#define PGSTAT_STAT_INTERVAL 500 /* Minimum time between stats file - * updates; in milliseconds. */ +/* + * Types related to shared memory storage of statistics. + * + * Per-object statistics are stored in the "shared stats" hashtable. That + * table's entries (PgStatShared_HashEntry) contain a pointer to the actual stats + * data for the object (the size of the stats data varies depending on the + * kind of stats). The table is keyed by PgStat_HashKey. + * + * Once a backend has a reference to a shared stats entry, it increments the + * entry's refcount. Even after stats data is dropped (e.g., due to a DROP + * TABLE), the entry itself can only be deleted once all references have been + * released. + * + * These refcounts, in combination with a backend local hashtable + * (pgStatEntryRefHash, with entries pointing to PgStat_EntryRef) in front of + * the shared hash table, mean that most stats work can happen without + * touching the shared hash table, reducing contention. + * + * Once there are pending stats updates for a table PgStat_EntryRef->pending + * is allocated to contain a working space for as-of-yet-unapplied stats + * updates. Once the stats are flushed, PgStat_EntryRef->pending is freed. + * + * Each stat kind in the shared hash table has a fixed member + * PgStatShared_Common as the first element. + */ -/* ---------- - * The initial size hints for the hash tables used in the collector. - * ---------- +/* struct for shared statistics hash entry key. */ +typedef struct PgStat_HashKey +{ + PgStat_Kind kind; /* statistics entry kind */ + Oid dboid; /* database ID. InvalidOid for shared objects. */ + Oid objoid; /* object ID, either table or function. */ +} PgStat_HashKey; + +/* + * Shared statistics hash entry. Doesn't itself contain any stats, but points + * to them (with ->body). That allows the stats entries themselves to be of + * variable size. */ -#define PGSTAT_DB_HASH_SIZE 16 -#define PGSTAT_TAB_HASH_SIZE 512 -#define PGSTAT_FUNCTION_HASH_SIZE 512 -#define PGSTAT_SUBSCRIPTION_HASH_SIZE 32 -#define PGSTAT_REPLSLOT_HASH_SIZE 32 +typedef struct PgStatShared_HashEntry +{ + PgStat_HashKey key; /* hash key */ + + /* + * If dropped is set, backends need to release their references so that + * the memory for the entry can be freed. No new references may be made + * once marked as dropped. + */ + bool dropped; + + /* + * Refcount managing lifetime of the entry itself (as opposed to the + * dshash entry pointing to it). The stats lifetime has to be separate + * from the hash table entry lifetime because we allow backends to point + * to a stats entry without holding a hash table lock (and some other + * reasons). + * + * As long as the entry is not dropped, 1 is added to the refcount + * representing that the entry should not be dropped. In addition each + * backend that has a reference to the entry needs to increment the + * refcount as long as it does. + * + * May only be incremented / decremented while holding at least a shared + * lock on the dshash partition containing the entry. It needs to be an + * atomic variable because multiple backends can increment the refcount + * with just a shared lock. + * + * When the refcount reaches 0 the entry needs to be freed. + */ + pg_atomic_uint32 refcount; + + /* + * Pointer to shared stats. The stats entry always starts with + * PgStatShared_Common, embedded in a larger struct containing the + * PgStat_Kind specific stats fields. + */ + dsa_pointer body; +} PgStatShared_HashEntry; + +/* + * Common header struct for PgStatShm_Stat*Entry. + */ +typedef struct PgStatShared_Common +{ + uint32 magic; /* just a validity cross-check */ + /* lock protecting stats contents (i.e. data following the header) */ + LWLock lock; +} PgStatShared_Common; + +/* + * A backend local reference to a shared stats entry. As long as at least one + * such reference exists, the shared stats entry will not be released. + * + * If there are pending stats update to the shared stats, these are stored in + * ->pending. + */ +typedef struct PgStat_EntryRef +{ + /* + * Pointer to the PgStatShared_HashEntry entry in the shared stats + * hashtable. + */ + PgStatShared_HashEntry *shared_entry; + + /* + * Pointer to the stats data (i.e. PgStatShared_HashEntry->body), resolved + * as a local pointer, to avoid repeated dsa_get_address() calls. + */ + PgStatShared_Common *shared_stats; + + /* + * Pending statistics data that will need to be flushed to shared memory + * stats eventually. Each stats kind utilizing pending data defines what + * format its pending data has and needs to provide a + * PgStat_KindInfo->flush_pending_cb callback to merge pending into shared + * stats. + */ + void *pending; + dlist_node pending_node; /* membership in pgStatPending list */ +} PgStat_EntryRef; /* @@ -43,11 +156,11 @@ typedef struct PgStat_SubXactStatus struct PgStat_SubXactStatus *prev; /* higher-level subxact if any */ /* - * Dropping the statistics for objects that dropped transactionally itself - * needs to be transactional. Therefore we collect the stats dropped in - * the current (sub-)transaction and only execute the stats drop when we - * know if the transaction commits/aborts. To handle replicas and crashes, - * stats drops are included in commit records. + * Statistics for transactionally dropped objects need to be + * transactionally dropped as well. Collect the stats dropped in the + * current (sub-)transaction and only execute the stats drop when we know + * if the transaction commits/aborts. To handle replicas and crashes, + * stats drops are included in commit / abort records. */ dlist_head pending_drops; int pending_drops_count; @@ -64,10 +177,96 @@ typedef struct PgStat_SubXactStatus } PgStat_SubXactStatus; +/* + * Metadata for a specific kind of statistics. + */ +typedef struct PgStat_KindInfo +{ + /* + * Do a fixed number of stats objects exist for this kind of stats (e.g. + * bgwriter stats) or not (e.g. tables). + */ + bool fixed_amount:1; + + /* + * Can stats of this kind be accessed from another database? Determines + * whether a stats object gets included in stats snapshots. + */ + bool accessed_across_databases:1; + + /* + * For variable-numbered stats: Identified on-disk using a name, rather + * than PgStat_HashKey. Probably only needed for replication slot stats. + */ + bool named_on_disk:1; + + /* + * The size of an entry in the shared stats hash table (pointed to by + * PgStatShared_HashEntry->body). + */ + uint32 shared_size; + + /* + * The offset/size of statistics inside the shared stats entry. Used when + * [de-]serializing statistics to / from disk respectively. Separate from + * shared_size because [de-]serialization may not include in-memory state + * like lwlocks. + */ + uint32 shared_data_off; + uint32 shared_data_len; + + /* + * The size of the pending data for this kind. E.g. how large + * PgStat_EntryRef->pending is. Used for allocations. + * + * 0 signals that an entry of this kind should never have a pending entry. + */ + uint32 pending_size; + + /* + * For variable-numbered stats: flush pending stats. Required if pending + * data is used. + */ + bool (*flush_pending_cb) (PgStat_EntryRef *sr, bool nowait); + + /* + * For variable-numbered stats: delete pending stats. Optional. + */ + void (*delete_pending_cb) (PgStat_EntryRef *sr); + + /* + * For variable-numbered stats: reset the reset timestamp. Optional. + */ + void (*reset_timestamp_cb) (PgStatShared_Common *header, TimestampTz ts); + + /* + * For variable-numbered stats with named_on_disk. Optional. + */ + void (*to_serialized_name) (const PgStatShared_Common *header, NameData *name); + bool (*from_serialized_name) (const NameData *name, PgStat_HashKey *key); + + /* + * For fixed-numbered statistics: Reset All. + */ + void (*reset_all_cb) (TimestampTz ts); + + /* + * For fixed-numbered statistics: Build snapshot for entry + */ + void (*snapshot_cb) (void); + + /* name of the kind of stats */ + const char *const name; +} PgStat_KindInfo; + + /* * List of SLRU names that we keep stats for. There is no central registry of * SLRUs, so we use this fixed list instead. The "other" entry is used for * all SLRUs without an explicit entry (e.g. SLRUs in extensions). + * + * This is only defined here so that SLRU_NUM_ELEMENTS is known for later type + * definitions. */ static const char *const slru_names[] = { "CommitTs", @@ -83,33 +282,271 @@ static const char *const slru_names[] = { #define SLRU_NUM_ELEMENTS lengthof(slru_names) +/* ---------- + * Types and definitions for different kinds of fixed-amount stats. + * + * Single-writer stats use the changecount mechanism to achieve low-overhead + * writes - they're obviously more performance critical than reads. Check the + * definition of struct PgBackendStatus for some explanation of the + * changecount mechanism. + * + * Because the obvious implementation of resetting single-writer stats isn't + * compatible with that (another backend needs to write), we don't scribble on + * shared stats while resetting. Instead, just record the current counter + * values in a copy of the stats data, which is protected by ->lock. See + * pgstat_fetch_stat_(archiver|bgwriter|checkpointer) for the reader side. + * + * The only exception to that is the the stat_reset_timestamp in these + * structs, which is protected by ->lock, because it has to be written by + * another backend while resetting + * ---------- + */ + +typedef struct PgStatShared_Archiver +{ + /* lock protects ->reset_offset as well as stats->stat_reset_timestamp */ + LWLock lock; + uint32 changecount; + PgStat_ArchiverStats stats; + PgStat_ArchiverStats reset_offset; +} PgStatShared_Archiver; + +typedef struct PgStatShared_BgWriter +{ + /* lock protects ->reset_offset as well as stats->stat_reset_timestamp */ + LWLock lock; + uint32 changecount; + PgStat_BgWriterStats stats; + PgStat_BgWriterStats reset_offset; +} PgStatShared_BgWriter; + +typedef struct PgStatShared_Checkpointer +{ + /* lock protects ->reset_offset as well as stats->stat_reset_timestamp */ + LWLock lock; + uint32 changecount; + PgStat_CheckpointerStats stats; + PgStat_CheckpointerStats reset_offset; +} PgStatShared_Checkpointer; + +typedef struct PgStatShared_SLRU +{ + /* lock protects ->stats */ + LWLock lock; + PgStat_SLRUStats stats[SLRU_NUM_ELEMENTS]; +} PgStatShared_SLRU; + +typedef struct PgStatShared_Wal +{ + /* lock protects ->stats */ + LWLock lock; + PgStat_WalStats stats; +} PgStatShared_Wal; + + + +/* ---------- + * Types and definitions for different kinds of variable-amount stats. + * + * Each struct has to start with PgStatShared_Common, containing information + * common across the different types of stats. Kind-specific data follows. + * ---------- + */ + +typedef struct PgStatShared_Database +{ + PgStatShared_Common header; + PgStat_StatDBEntry stats; +} PgStatShared_Database; + +typedef struct PgStatShared_Relation +{ + PgStatShared_Common header; + PgStat_StatTabEntry stats; +} PgStatShared_Relation; + +typedef struct PgStatShared_Function +{ + PgStatShared_Common header; + PgStat_StatFuncEntry stats; +} PgStatShared_Function; + +typedef struct PgStatShared_Subscription +{ + PgStatShared_Common header; + PgStat_StatSubEntry stats; +} PgStatShared_Subscription; + +typedef struct PgStatShared_ReplSlot +{ + PgStatShared_Common header; + PgStat_StatReplSlotEntry stats; +} PgStatShared_ReplSlot; + + +/* + * Central shared memory entry for the cumulative stats system. + * + * Fixed amount stats, the dynamic shared memory hash table for + * non-fixed-amount stats, as well as remaining bits and pieces are all + * reached from here. + */ +typedef struct PgStat_ShmemControl +{ + void *raw_dsa_area; + + /* + * Stats for variable-numbered objects are kept in this shared hash table. + * See comment above PgStat_Kind for details. + */ + dshash_table_handle hash_handle; /* shared dbstat hash */ + + /* Has the stats system already been shut down? Just a debugging check. */ + bool is_shutdown; + + /* + * Whenever statistics for dropped objects could not be freed - because + * backends still have references - the dropping backend calls + * pgstat_request_entry_refs_gc() incrementing this counter. Eventually + * that causes backends to run pgstat_gc_entry_refs(), allowing memory to + * be reclaimed. + */ + pg_atomic_uint64 gc_request_count; + + /* + * Stats data for fixed-numbered objects. + */ + PgStatShared_Archiver archiver; + PgStatShared_BgWriter bgwriter; + PgStatShared_Checkpointer checkpointer; + PgStatShared_SLRU slru; + PgStatShared_Wal wal; +} PgStat_ShmemControl; + + +/* + * Cached statistics snapshot + */ +typedef struct PgStat_Snapshot +{ + PgStat_FetchConsistency mode; + + /* time at which snapshot was taken */ + TimestampTz snapshot_timestamp; + + bool fixed_valid[PGSTAT_NUM_KINDS]; + + PgStat_ArchiverStats archiver; + + PgStat_BgWriterStats bgwriter; + + PgStat_CheckpointerStats checkpointer; + + PgStat_SLRUStats slru[SLRU_NUM_ELEMENTS]; + + PgStat_WalStats wal; + + /* to free snapshot in bulk */ + MemoryContext context; + struct pgstat_snapshot_hash *stats; +} PgStat_Snapshot; + + +/* + * Collection of backend-local stats state. + */ +typedef struct PgStat_LocalState +{ + PgStat_ShmemControl *shmem; + dsa_area *dsa; + dshash_table *shared_hash; + + /* the current statistics snapshot */ + PgStat_Snapshot snapshot; +} PgStat_LocalState; + + +/* + * Inline functions defined further below. + */ + +static inline void pgstat_begin_changecount_write(uint32 *cc); +static inline void pgstat_end_changecount_write(uint32 *cc); +static inline uint32 pgstat_begin_changecount_read(uint32 *cc); +static inline bool pgstat_end_changecount_read(uint32 *cc, uint32 cc_before); + +static inline void pgstat_copy_changecounted_stats(void *dst, void *src, size_t len, + uint32 *cc); + +static inline int pgstat_cmp_hash_key(const void *a, const void *b, size_t size, void *arg); +static inline uint32 pgstat_hash_hash_key(const void *d, size_t size, void *arg); +static inline size_t pgstat_get_entry_len(PgStat_Kind kind); +static inline void *pgstat_get_entry_data(PgStat_Kind kind, PgStatShared_Common *entry); + + /* * Functions in pgstat.c */ -extern void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype); -extern void pgstat_send(void *msg, int len); +const PgStat_KindInfo *pgstat_get_kind_info(PgStat_Kind kind); + #ifdef USE_ASSERT_CHECKING extern void pgstat_assert_is_up(void); #else #define pgstat_assert_is_up() ((void)true) #endif +extern void pgstat_delete_pending_entry(PgStat_EntryRef *entry_ref); +extern PgStat_EntryRef *pgstat_prep_pending_entry(PgStat_Kind kind, Oid dboid, Oid objoid, bool *created_entry); +extern PgStat_EntryRef *pgstat_fetch_pending_entry(PgStat_Kind kind, Oid dboid, Oid objoid); + +extern void *pgstat_fetch_entry(PgStat_Kind kind, Oid dboid, Oid objoid); +extern void pgstat_snapshot_fixed(PgStat_Kind kind); + + +/* + * Functions in pgstat_archiver.c + */ + +extern void pgstat_archiver_reset_all_cb(TimestampTz ts); +extern void pgstat_archiver_snapshot_cb(void); + + +/* + * Functions in pgstat_bgwriter.c + */ + +extern void pgstat_bgwriter_reset_all_cb(TimestampTz ts); +extern void pgstat_bgwriter_snapshot_cb(void); + + +/* + * Functions in pgstat_checkpointer.c + */ + +extern void pgstat_checkpointer_reset_all_cb(TimestampTz ts); +extern void pgstat_checkpointer_snapshot_cb(void); + /* * Functions in pgstat_database.c */ -extern void AtEOXact_PgStat_Database(bool isCommit, bool parallel); extern void pgstat_report_disconnect(Oid dboid); -extern void pgstat_update_dbstats(PgStat_MsgTabstat *tsmsg, TimestampTz now); +extern void pgstat_update_dbstats(TimestampTz ts); +extern void AtEOXact_PgStat_Database(bool isCommit, bool parallel); + +extern PgStat_StatDBEntry *pgstat_prep_database_pending(Oid dboid); +extern void pgstat_reset_database_timestamp(Oid dboid, TimestampTz ts); +extern bool pgstat_database_flush_cb(PgStat_EntryRef *entry_ref, bool nowait); +extern void pgstat_database_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts); /* * Functions in pgstat_function.c */ -extern void pgstat_send_funcstats(void); +extern bool pgstat_function_flush_cb(PgStat_EntryRef *entry_ref, bool nowait); /* @@ -120,23 +557,73 @@ extern void AtEOXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isC extern void AtEOSubXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit, int nestDepth); extern void AtPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state); extern void PostPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state); -extern void pgstat_send_tabstats(TimestampTz now, bool disconnect); + +extern bool pgstat_relation_flush_cb(PgStat_EntryRef *entry_ref, bool nowait); +extern void pgstat_relation_delete_pending_cb(PgStat_EntryRef *entry_ref); + + +/* + * Functions in pgstat_replslot.c + */ + +extern void pgstat_replslot_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts); +extern void pgstat_replslot_to_serialized_name_cb(const PgStatShared_Common *tmp, NameData *name); +extern bool pgstat_replslot_from_serialized_name_cb(const NameData *name, PgStat_HashKey *key); + + +/* + * Functions in pgstat_shmem.c + */ + +extern void pgstat_attach_shmem(void); +extern void pgstat_detach_shmem(void); + +extern PgStat_EntryRef *pgstat_get_entry_ref(PgStat_Kind kind, Oid dboid, Oid objoid, + bool create, bool *found); +extern bool pgstat_lock_entry(PgStat_EntryRef *entry_ref, bool nowait); +extern void pgstat_unlock_entry(PgStat_EntryRef *entry_ref); +extern bool pgstat_drop_entry(PgStat_Kind kind, Oid dboid, Oid objoid); +extern void pgstat_drop_all_entries(void); +extern PgStat_EntryRef *pgstat_get_entry_ref_locked(PgStat_Kind kind, Oid dboid, Oid objoid, + bool nowait); +extern void pgstat_reset_entry(PgStat_Kind kind, Oid dboid, Oid objoid, TimestampTz ts); +extern void pgstat_reset_entries_of_kind(PgStat_Kind kind, TimestampTz ts); +extern void pgstat_reset_matching_entries(bool (*do_reset) (PgStatShared_HashEntry *, Datum), + Datum match_data, + TimestampTz ts); + +extern void pgstat_request_entry_refs_gc(void); +extern PgStatShared_Common *pgstat_init_entry(PgStat_Kind kind, + PgStatShared_HashEntry *shhashent); /* * Functions in pgstat_slru.c */ -extern void pgstat_send_slru(void); +extern bool pgstat_slru_flush(bool nowait); +extern void pgstat_slru_reset_all_cb(TimestampTz ts); +extern void pgstat_slru_snapshot_cb(void); /* * Functions in pgstat_wal.c */ +extern bool pgstat_flush_wal(bool nowait); extern void pgstat_init_wal(void); extern bool pgstat_have_pending_wal(void); +extern void pgstat_wal_reset_all_cb(TimestampTz ts); +extern void pgstat_wal_snapshot_cb(void); + + +/* + * Functions in pgstat_subscription.c + */ + +extern bool pgstat_subscription_flush_cb(PgStat_EntryRef *entry_ref, bool nowait); +extern void pgstat_subscription_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts); /* * Functions in pgstat_xact.c @@ -151,29 +638,145 @@ extern void pgstat_create_transactional(PgStat_Kind kind, Oid dboid, Oid objoid) * Variables in pgstat.c */ -extern pgsocket pgStatSock; +extern PgStat_LocalState pgStatLocal; /* - * Variables in pgstat_database.c + * Variables in pgstat_slru.c */ -extern int pgStatXactCommit; -extern int pgStatXactRollback; +extern bool have_slrustats; /* - * Variables in pgstat_functions.c + * Implementation of inline functions declared above. + */ + +/* + * Helpers for changecount manipulation. See comments around struct + * PgBackendStatus for details. */ -extern bool have_function_stats; +static inline void +pgstat_begin_changecount_write(uint32 *cc) +{ + Assert((*cc & 1) == 0); + + START_CRIT_SECTION(); + (*cc)++; + pg_write_barrier(); +} + +static inline void +pgstat_end_changecount_write(uint32 *cc) +{ + Assert((*cc & 1) == 1); + + pg_write_barrier(); + + (*cc)++; + + END_CRIT_SECTION(); +} + +static inline uint32 +pgstat_begin_changecount_read(uint32 *cc) +{ + uint32 before_cc = *cc; + + CHECK_FOR_INTERRUPTS(); + pg_read_barrier(); + + return before_cc; +} /* - * Variables in pgstat_relation.c + * Returns true if the read succeeded, false if it needs to be repeated. */ +static inline bool +pgstat_end_changecount_read(uint32 *cc, uint32 before_cc) +{ + uint32 after_cc; + + pg_read_barrier(); + + after_cc = *cc; + + /* was a write in progress when we started? */ + if (before_cc & 1) + return false; + + /* did writes start and complete while we read? */ + return before_cc == after_cc; +} + + +/* + * helper function for PgStat_KindInfo->snapshot_cb + * PgStat_KindInfo->reset_all_cb callbacks. + * + * Copies out the specified memory area following change-count protocol. + */ +static inline void +pgstat_copy_changecounted_stats(void *dst, void *src, size_t len, + uint32 *cc) +{ + uint32 cc_before; + + do + { + cc_before = pgstat_begin_changecount_read(cc); + + memcpy(dst, src, len); + } + while (!pgstat_end_changecount_read(cc, cc_before)); +} + +/* helpers for dshash / simplehash hashtables */ +static inline int +pgstat_cmp_hash_key(const void *a, const void *b, size_t size, void *arg) +{ + AssertArg(size == sizeof(PgStat_HashKey) && arg == NULL); + return memcmp(a, b, sizeof(PgStat_HashKey)); +} + +static inline uint32 +pgstat_hash_hash_key(const void *d, size_t size, void *arg) +{ + const PgStat_HashKey *key = (PgStat_HashKey *) d; + uint32 hash; + + AssertArg(size == sizeof(PgStat_HashKey) && arg == NULL); + + hash = murmurhash32(key->kind); + hash = hash_combine(hash, murmurhash32(key->dboid)); + hash = hash_combine(hash, murmurhash32(key->objoid)); + + return hash; +} + +/* + * The length of the data portion of a shared memory stats entry (i.e. without + * transient data such as refcounts, lwlocks, ...). + */ +static inline size_t +pgstat_get_entry_len(PgStat_Kind kind) +{ + return pgstat_get_kind_info(kind)->shared_data_len; +} + +/* + * Returns a pointer to the data portion of a shared memory stats entry. + */ +static inline void * +pgstat_get_entry_data(PgStat_Kind kind, PgStatShared_Common *entry) +{ + size_t off = pgstat_get_kind_info(kind)->shared_data_off; -extern bool have_relation_stats; + Assert(off != 0 && off < PG_UINT32_MAX); + return ((char *) (entry)) + off; +} #endif /* PGSTAT_INTERNAL_H */ diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 121dbbc9a9..eadbd00904 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -246,6 +246,7 @@ typedef struct RelationData */ Oid rd_toastoid; /* Real TOAST table's OID, or InvalidOid */ + bool pgstat_enabled; /* should relation stats be counted */ /* use "struct" here to avoid needing to include pgstat.h: */ struct PgStat_TableStatus *pgstat_info; /* statistics collection area */ } RelationData; diff --git a/src/include/utils/timeout.h b/src/include/utils/timeout.h index 099f91c61d..c068986d09 100644 --- a/src/include/utils/timeout.h +++ b/src/include/utils/timeout.h @@ -32,6 +32,7 @@ typedef enum TimeoutId STANDBY_LOCK_TIMEOUT, IDLE_IN_TRANSACTION_SESSION_TIMEOUT, IDLE_SESSION_TIMEOUT, + IDLE_STATS_UPDATE_TIMEOUT, CLIENT_CONNECTION_CHECK_TIMEOUT, STARTUP_PROGRESS_TIMEOUT, /* First user-definable timeout reason */ diff --git a/src/include/utils/wait_event.h b/src/include/utils/wait_event.h index d870c59263..b578e2ec75 100644 --- a/src/include/utils/wait_event.h +++ b/src/include/utils/wait_event.h @@ -42,7 +42,6 @@ typedef enum WAIT_EVENT_CHECKPOINTER_MAIN, WAIT_EVENT_LOGICAL_APPLY_MAIN, WAIT_EVENT_LOGICAL_LAUNCHER_MAIN, - WAIT_EVENT_PGSTAT_MAIN, WAIT_EVENT_RECOVERY_WAL_STREAM, WAIT_EVENT_SYSLOGGER_MAIN, WAIT_EVENT_WAL_RECEIVER_MAIN, diff --git a/src/test/modules/worker_spi/worker_spi.c b/src/test/modules/worker_spi/worker_spi.c index 48829df29c..5b541ec47f 100644 --- a/src/test/modules/worker_spi/worker_spi.c +++ b/src/test/modules/worker_spi/worker_spi.c @@ -265,7 +265,7 @@ worker_spi_main(Datum main_arg) PopActiveSnapshot(); CommitTransactionCommand(); debug_query_string = NULL; - pgstat_report_stat(false); + pgstat_report_stat(true); pgstat_report_activity(STATE_IDLE, NULL); } diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index 494fb26237..64e2ff6b29 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -17,6 +17,8 @@ SET enable_indexscan TO on; -- for the moment, we don't want index-only scans here SET enable_indexonlyscan TO off; -- save counters +BEGIN; +SET LOCAL stats_fetch_consistency = snapshot; CREATE TABLE prevstats AS SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, (b.heap_blks_read + b.heap_blks_hit) AS heap_blks, @@ -25,6 +27,7 @@ SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, FROM pg_catalog.pg_stat_user_tables AS t, pg_catalog.pg_statio_user_tables AS b WHERE t.relname='tenk2' AND b.relname='tenk2'; +COMMIT; -- function to wait for counters to advance create function wait_for_stats() returns void as $$ declare @@ -34,6 +37,8 @@ declare updated3 bool; updated4 bool; begin + SET LOCAL stats_fetch_consistency = snapshot; + -- We don't want to wait forever. No timeout suffices if the OS drops our -- stats traffic because an earlier test file left a full UDP buffer. -- Hence, don't use PG_TEST_TIMEOUT_DEFAULT, which may be large for @@ -163,6 +168,8 @@ SELECT wait_for_stats(); (1 row) -- check effects +BEGIN; +SET LOCAL stats_fetch_consistency = snapshot; SELECT relname, n_tup_ins, n_tup_upd, n_tup_del, n_live_tup, n_dead_tup FROM pg_stat_user_tables WHERE relname like 'trunc_stats_test%' order by relname; @@ -202,6 +209,7 @@ FROM prevstats AS pr; t (1 row) +COMMIT; DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4; DROP TABLE prevstats; -- test BRIN index doesn't block HOT update - we include this test here, as it diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index d0ba1f6d7b..85a253bcd4 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -15,6 +15,8 @@ SET enable_indexscan TO on; SET enable_indexonlyscan TO off; -- save counters +BEGIN; +SET LOCAL stats_fetch_consistency = snapshot; CREATE TABLE prevstats AS SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, (b.heap_blks_read + b.heap_blks_hit) AS heap_blks, @@ -23,6 +25,7 @@ SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, FROM pg_catalog.pg_stat_user_tables AS t, pg_catalog.pg_statio_user_tables AS b WHERE t.relname='tenk2' AND b.relname='tenk2'; +COMMIT; -- function to wait for counters to advance create function wait_for_stats() returns void as $$ @@ -33,6 +36,8 @@ declare updated3 bool; updated4 bool; begin + SET LOCAL stats_fetch_consistency = snapshot; + -- We don't want to wait forever. No timeout suffices if the OS drops our -- stats traffic because an earlier test file left a full UDP buffer. -- Hence, don't use PG_TEST_TIMEOUT_DEFAULT, which may be large for @@ -158,6 +163,9 @@ RESET enable_bitmapscan; SELECT wait_for_stats(); -- check effects +BEGIN; +SET LOCAL stats_fetch_consistency = snapshot; + SELECT relname, n_tup_ins, n_tup_upd, n_tup_del, n_live_tup, n_dead_tup FROM pg_stat_user_tables WHERE relname like 'trunc_stats_test%' order by relname; @@ -177,6 +185,8 @@ SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages, SELECT pr.snap_ts < pg_stat_get_snapshot_timestamp() as snapshot_newer FROM prevstats AS pr; +COMMIT; + DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4; DROP TABLE prevstats; diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index dc38e16405..566ecbf091 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1933,51 +1933,39 @@ PgFdwPathExtraData PgFdwRelationInfo PgFdwScanState PgIfAddrCallback +PgStatShared_Archiver +PgStatShared_BgWriter +PgStatShared_Checkpointer +PgStatShared_Common +PgStatShared_Database +PgStatShared_Function +PgStatShared_HashEntry +PgStatShared_Relation +PgStatShared_ReplSlot +PgStatShared_SLRU +PgStatShared_Subscription +PgStatShared_Wal PgStat_ArchiverStats PgStat_BackendFunctionEntry +PgStat_BackendSubEntry PgStat_BgWriterStats PgStat_CheckpointerStats PgStat_Counter +PgStat_EntryRef +PgStat_EntryRefHashEntry +PgStat_FetchConsistency PgStat_FunctionCallUsage PgStat_FunctionCounts -PgStat_FunctionEntry -PgStat_GlobalStats +PgStat_HashKey PgStat_Kind -PgStat_Msg -PgStat_MsgAnalyze -PgStat_MsgAnlAncestors -PgStat_MsgArchiver -PgStat_MsgAutovacStart -PgStat_MsgBgWriter -PgStat_MsgCheckpointer -PgStat_MsgChecksumFailure -PgStat_MsgConnect -PgStat_MsgDeadlock -PgStat_MsgDisconnect -PgStat_MsgDropdb -PgStat_MsgDummy -PgStat_MsgFuncpurge -PgStat_MsgFuncstat -PgStat_MsgHdr -PgStat_MsgInquiry -PgStat_MsgRecoveryConflict -PgStat_MsgReplSlot -PgStat_MsgResetcounter -PgStat_MsgResetreplslotcounter -PgStat_MsgResetsharedcounter -PgStat_MsgResetsinglecounter -PgStat_MsgResetslrucounter -PgStat_MsgResetsubcounter -PgStat_MsgSLRU -PgStat_MsgSubscriptionDrop -PgStat_MsgSubscriptionError -PgStat_MsgTabpurge -PgStat_MsgTabstat -PgStat_MsgTempFile -PgStat_MsgVacuum -PgStat_MsgWal +PgStat_KindInfo +PgStat_LocalState PgStat_PendingDroppedStatsItem +PgStat_ReplSlotStats PgStat_SLRUStats +PgStat_ShmemControl +PgStat_Snapshot +PgStat_SnapshotEntry PgStat_StatDBEntry PgStat_StatFuncEntry PgStat_StatReplSlotEntry @@ -1985,7 +1973,6 @@ PgStat_StatSubEntry PgStat_StatTabEntry PgStat_SubXactStatus PgStat_TableCounts -PgStat_TableEntry PgStat_TableStatus PgStat_TableXactStatus PgStat_WalStats @@ -2533,7 +2520,6 @@ StartReplicationCmd StartupStatusEnum StatEntry StatExtEntry -StatMsgType StateFileChunk StatisticExtInfo Stats @@ -2647,8 +2633,6 @@ TXNEntryFile TYPCATEGORY T_Action T_WorkerStatus -TabStatHashEntry -TabStatusArray TableAmRoutine TableAttachInfo TableDataInfo @@ -3433,6 +3417,7 @@ pgssHashKey pgssSharedState pgssStoreKind pgssVersion +pgstat_entry_ref_hash_hash pgstat_page pgstattuple_type pgthreadlock_t diff --git a/src/tools/valgrind.supp b/src/tools/valgrind.supp index e3a179d210..4e8c482757 100644 --- a/src/tools/valgrind.supp +++ b/src/tools/valgrind.supp @@ -14,24 +14,6 @@ # These may contain uninitialized padding bytes. Since recipients also ignore # those bytes as padding, this is harmless. -{ - padding_pgstat_send - Memcheck:Param - socketcall.send(msg) - - fun:*send* - fun:pgstat_send -} - -{ - padding_pgstat_sendto - Memcheck:Param - socketcall.sendto(msg) - - fun:*send* - fun:pgstat_send -} - { padding_pgstat_write Memcheck:Param From 6f0cf87872ab2fd4a81249ca9d6299b9b1a52277 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 21:29:46 -0700 Subject: [PATCH 411/772] pgstat: remove stats_temp_directory. With stats now being stored in shared memory, the GUC isn't needed anymore. However, the pg_stat_tmp directory and PG_STAT_TMP_DIR define are kept, as pg_stat_statements (and some out-of-core extensions) store data in it. Docs will be updated in a subsequent commit, together with the other pending docs updates due to shared memory stats. Author: Andres Freund Author: Kyotaro Horiguchi Reviewed-By: Kyotaro Horiguchi Discussion: https://postgr.es/m/20220330233550.eiwsbearu6xhuqwe@alap3.anarazel.de Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- .../pg_stat_statements/pg_stat_statements.c | 7 +--- src/backend/postmaster/pgstat.c | 10 ----- src/backend/replication/basebackup.c | 36 +--------------- src/backend/utils/misc/guc.c | 41 ------------------- src/backend/utils/misc/postgresql.conf.sample | 1 - src/bin/pg_rewind/filemap.c | 5 +-- src/include/pgstat.h | 4 -- src/test/perl/PostgreSQL/Test/Cluster.pm | 4 -- 8 files changed, 5 insertions(+), 103 deletions(-) diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 55786ae84f..1d6049f2fd 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -78,12 +78,7 @@ PG_MODULE_MAGIC; #define PGSS_DUMP_FILE PGSTAT_STAT_PERMANENT_DIRECTORY "/pg_stat_statements.stat" /* - * Location of external query text file. We don't keep it in the core - * system's stats_temp_directory. The core system can safely use that GUC - * setting, because the statistics collector temp file paths are set only once - * as part of changing the GUC, but pg_stat_statements has no way of avoiding - * race conditions. Besides, we only expect modest, infrequent I/O for query - * strings, so placing the file on a faster filesystem is not compelling. + * Location of external query text file. */ #define PGSS_TEXT_FILE PG_STAT_TMP_DIR "/pgss_query_texts.stat" diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index a9f3a7ef49..cc6f2700d6 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -186,16 +186,6 @@ bool pgstat_track_counts = false; int pgstat_fetch_consistency = PGSTAT_FETCH_CONSISTENCY_NONE; -/* ---------- - * Built from GUC parameter - * ---------- - */ - -char *pgstat_stat_directory = NULL; -char *pgstat_stat_filename = NULL; -char *pgstat_stat_tmpname = NULL; - - /* ---------- * state shared with pgstat_*.c * ---------- diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index f01fff3a90..27e4152446 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -99,9 +99,6 @@ static int basebackup_read_file(int fd, char *buf, size_t nbytes, off_t offset, /* Was the backup currently in-progress initiated in recovery mode? */ static bool backup_started_in_recovery = false; -/* Relative path of temporary statistics directory */ -static char *statrelpath = NULL; - /* Total number of checksum failures during base backup. */ static long long int total_checksum_failures; @@ -131,9 +128,8 @@ struct exclude_list_item static const char *const excludeDirContents[] = { /* - * Skip temporary statistics files. PG_STAT_TMP_DIR must be skipped even - * when stats_temp_directory is set because PGSS_TEXT_FILE is always - * created there. + * Skip temporary statistics files. PG_STAT_TMP_DIR must be skipped + * because extensions like pg_stat_statements store data there. */ PG_STAT_TMP_DIR, @@ -237,7 +233,6 @@ perform_base_backup(basebackup_options *opt, bbsink *sink) StringInfo labelfile; StringInfo tblspc_map_file; backup_manifest_info manifest; - int datadirpathlen; /* Initial backup state, insofar as we know it now. */ state.tablespaces = NIL; @@ -250,8 +245,6 @@ perform_base_backup(basebackup_options *opt, bbsink *sink) Assert(CurrentResourceOwner == NULL); CurrentResourceOwner = ResourceOwnerCreate(NULL, "base backup"); - datadirpathlen = strlen(DataDir); - backup_started_in_recovery = RecoveryInProgress(); labelfile = makeStringInfo(); @@ -279,18 +272,6 @@ perform_base_backup(basebackup_options *opt, bbsink *sink) ListCell *lc; tablespaceinfo *ti; - /* - * Calculate the relative path of temporary statistics directory in - * order to skip the files which are located in that directory later. - */ - if (is_absolute_path(pgstat_stat_directory) && - strncmp(pgstat_stat_directory, DataDir, datadirpathlen) == 0) - statrelpath = psprintf("./%s", pgstat_stat_directory + datadirpathlen + 1); - else if (strncmp(pgstat_stat_directory, "./", 2) != 0) - statrelpath = psprintf("./%s", pgstat_stat_directory); - else - statrelpath = pgstat_stat_directory; - /* Add a node for the base directory at the end */ ti = palloc0(sizeof(tablespaceinfo)); ti->size = -1; @@ -1310,19 +1291,6 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, if (excludeFound) continue; - /* - * Exclude contents of directory specified by statrelpath if not set - * to the default (pg_stat_tmp) which is caught in the loop above. - */ - if (statrelpath != NULL && strcmp(pathbuf, statrelpath) == 0) - { - elog(DEBUG1, "contents of directory \"%s\" excluded from backup", statrelpath); - convert_link_to_directory(pathbuf, &statbuf); - size += _tarWriteHeader(sink, pathbuf + basepathlen + 1, NULL, - &statbuf, sizeonly); - continue; - } - /* * We can skip pg_wal, the WAL segments need to be fetched from the * WAL archive anyway. But include it as an empty directory anyway, so diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index f7758ea4a7..719f8cb177 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -217,7 +217,6 @@ static bool check_effective_io_concurrency(int *newval, void **extra, GucSource static bool check_maintenance_io_concurrency(int *newval, void **extra, GucSource source); static bool check_huge_page_size(int *newval, void **extra, GucSource source); static bool check_client_connection_check_interval(int *newval, void **extra, GucSource source); -static void assign_pgstat_temp_directory(const char *newval, void *extra); static bool check_application_name(char **newval, void **extra, GucSource source); static void assign_application_name(const char *newval, void *extra); static bool check_cluster_name(char **newval, void **extra, GucSource source); @@ -4560,17 +4559,6 @@ static struct config_string ConfigureNamesString[] = NULL, NULL, NULL }, - { - {"stats_temp_directory", PGC_SIGHUP, STATS_COLLECTOR, - gettext_noop("Writes temporary statistics files to the specified directory."), - NULL, - GUC_SUPERUSER_ONLY - }, - &pgstat_temp_directory, - PG_STAT_TMP_DIR, - check_canonical_path, assign_pgstat_temp_directory, NULL - }, - { {"synchronous_standby_names", PGC_SIGHUP, REPLICATION_PRIMARY, gettext_noop("Number of synchronous standbys and list of names of potential synchronous ones."), @@ -12375,35 +12363,6 @@ check_client_connection_check_interval(int *newval, void **extra, GucSource sour return true; } -static void -assign_pgstat_temp_directory(const char *newval, void *extra) -{ - /* check_canonical_path already canonicalized newval for us */ - char *dname; - char *tname; - char *fname; - - /* directory */ - dname = guc_malloc(ERROR, strlen(newval) + 1); /* runtime dir */ - sprintf(dname, "%s", newval); - - /* global stats */ - tname = guc_malloc(ERROR, strlen(newval) + 12); /* /global.tmp */ - sprintf(tname, "%s/global.tmp", newval); - fname = guc_malloc(ERROR, strlen(newval) + 13); /* /global.stat */ - sprintf(fname, "%s/global.stat", newval); - - if (pgstat_stat_directory) - free(pgstat_stat_directory); - pgstat_stat_directory = dname; - if (pgstat_stat_tmpname) - free(pgstat_stat_tmpname); - pgstat_stat_tmpname = tname; - if (pgstat_stat_filename) - free(pgstat_stat_filename); - pgstat_stat_filename = fname; -} - static bool check_application_name(char **newval, void **extra, GucSource source) { diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 5f9a37bed3..64e5d11cd6 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -613,7 +613,6 @@ #track_io_timing = off #track_wal_io_timing = off #track_functions = none # none, pl, all -#stats_temp_directory = 'pg_stat_tmp' #stats_fetch_consistency = none diff --git a/src/bin/pg_rewind/filemap.c b/src/bin/pg_rewind/filemap.c index fb52debf7a..d61067f6b2 100644 --- a/src/bin/pg_rewind/filemap.c +++ b/src/bin/pg_rewind/filemap.c @@ -88,9 +88,8 @@ struct exclude_list_item static const char *excludeDirContents[] = { /* - * Skip temporary statistics files. PG_STAT_TMP_DIR must be skipped even - * when stats_temp_directory is set because PGSS_TEXT_FILE is always - * created there. + * Skip temporary statistics files. PG_STAT_TMP_DIR must be skipped + * because extensions like pg_stat_statements store data there. */ "pg_stat_tmp", /* defined as PG_STAT_TMP_DIR */ diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 1d2d3de86c..8ac3860e8d 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -642,10 +642,6 @@ extern PGDLLIMPORT bool pgstat_track_counts; extern PGDLLIMPORT int pgstat_track_functions; extern PGDLLIMPORT int pgstat_fetch_consistency; -extern char *pgstat_stat_directory; -extern char *pgstat_stat_tmpname; -extern char *pgstat_stat_filename; - /* * Variables in pgstat_bgwriter.c diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index 1452297210..9a2ada0a10 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -480,10 +480,6 @@ sub init print $conf PostgreSQL::Test::Utils::slurp_file($ENV{TEMP_CONFIG}) if defined $ENV{TEMP_CONFIG}; - # XXX Neutralize any stats_temp_directory in TEMP_CONFIG. Nodes running - # concurrently must not share a stats_temp_directory. - print $conf "stats_temp_directory = 'pg_stat_tmp'\n"; - if ($params{allows_streaming}) { if ($params{allows_streaming} eq "logical") From 1db4e5a4eeec0c5e240628923daf0e0a666f8c04 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 21:29:46 -0700 Subject: [PATCH 412/772] pgstat: rename STATS_COLLECTOR GUC group to STATS_CUMULATIVE. Reviewed-By: Kyotaro Horiguchi Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/backend/utils/misc/guc.c | 18 +++++++++--------- src/backend/utils/misc/postgresql.conf.sample | 2 +- src/include/utils/guc_tables.h | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 719f8cb177..998b8a94c4 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -810,8 +810,8 @@ const char *const config_group_names[] = gettext_noop("Reporting and Logging / Process Title"), /* STATS_MONITORING */ gettext_noop("Statistics / Monitoring"), - /* STATS_COLLECTOR */ - gettext_noop("Statistics / Query and Index Statistics Collector"), + /* STATS_CUMULATIVE */ + gettext_noop("Statistics / Cumulative Query and Index Statistics"), /* AUTOVACUUM */ gettext_noop("Autovacuum"), /* CLIENT_CONN_STATEMENT */ @@ -1548,7 +1548,7 @@ static struct config_bool ConfigureNamesBool[] = #endif { - {"track_activities", PGC_SUSET, STATS_COLLECTOR, + {"track_activities", PGC_SUSET, STATS_CUMULATIVE, gettext_noop("Collects information about executing commands."), gettext_noop("Enables the collection of information on the currently " "executing command of each session, along with " @@ -1559,7 +1559,7 @@ static struct config_bool ConfigureNamesBool[] = NULL, NULL, NULL }, { - {"track_counts", PGC_SUSET, STATS_COLLECTOR, + {"track_counts", PGC_SUSET, STATS_CUMULATIVE, gettext_noop("Collects statistics on database activity."), NULL }, @@ -1568,7 +1568,7 @@ static struct config_bool ConfigureNamesBool[] = NULL, NULL, NULL }, { - {"track_io_timing", PGC_SUSET, STATS_COLLECTOR, + {"track_io_timing", PGC_SUSET, STATS_CUMULATIVE, gettext_noop("Collects timing statistics for database I/O activity."), NULL }, @@ -1577,7 +1577,7 @@ static struct config_bool ConfigureNamesBool[] = NULL, NULL, NULL }, { - {"track_wal_io_timing", PGC_SUSET, STATS_COLLECTOR, + {"track_wal_io_timing", PGC_SUSET, STATS_CUMULATIVE, gettext_noop("Collects timing statistics for WAL I/O activity."), NULL }, @@ -3539,7 +3539,7 @@ static struct config_int ConfigureNamesInt[] = }, { - {"track_activity_query_size", PGC_POSTMASTER, STATS_COLLECTOR, + {"track_activity_query_size", PGC_POSTMASTER, STATS_CUMULATIVE, gettext_noop("Sets the size reserved for pg_stat_activity.query, in bytes."), NULL, GUC_UNIT_BYTE @@ -4907,7 +4907,7 @@ static struct config_enum ConfigureNamesEnum[] = }, { - {"track_functions", PGC_SUSET, STATS_COLLECTOR, + {"track_functions", PGC_SUSET, STATS_CUMULATIVE, gettext_noop("Collects function-level statistics on database activity."), NULL }, @@ -4918,7 +4918,7 @@ static struct config_enum ConfigureNamesEnum[] = { - {"stats_fetch_consistency", PGC_USERSET, STATS_COLLECTOR, + {"stats_fetch_consistency", PGC_USERSET, STATS_CUMULATIVE, gettext_noop("Sets the consistency of accesses to statistics data"), NULL }, diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 64e5d11cd6..e75b7d63ea 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -605,7 +605,7 @@ # STATISTICS #------------------------------------------------------------------------------ -# - Query and Index Statistics Collector - +# - Cumulative Query and Index Statistics - #track_activities = on #track_activity_query_size = 1024 # (change requires restart) diff --git a/src/include/utils/guc_tables.h b/src/include/utils/guc_tables.h index f7e54a87b7..1c5b3930a9 100644 --- a/src/include/utils/guc_tables.h +++ b/src/include/utils/guc_tables.h @@ -82,7 +82,7 @@ enum config_group LOGGING_WHAT, PROCESS_TITLE, STATS_MONITORING, - STATS_COLLECTOR, + STATS_CUMULATIVE, AUTOVACUUM, CLIENT_CONN_STATEMENT, CLIENT_CONN_LOCALE, From fbfe6910eca0d6a61cbcdd27cdd5a8d9de6477fa Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 21:29:46 -0700 Subject: [PATCH 413/772] pgstat: move pgstat.c to utils/activity. Now that pgstat is not related to postmaster anymore, src/backend/postmaster is not a well fitting directory. Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/backend/postmaster/Makefile | 1 - src/backend/utils/activity/Makefile | 1 + src/backend/{postmaster => utils/activity}/pgstat.c | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename src/backend/{postmaster => utils/activity}/pgstat.c (99%) diff --git a/src/backend/postmaster/Makefile b/src/backend/postmaster/Makefile index dbbeac5a82..3a794e54d6 100644 --- a/src/backend/postmaster/Makefile +++ b/src/backend/postmaster/Makefile @@ -21,7 +21,6 @@ OBJS = \ fork_process.o \ interrupt.o \ pgarch.o \ - pgstat.o \ postmaster.o \ shell_archive.o \ startup.o \ diff --git a/src/backend/utils/activity/Makefile b/src/backend/utils/activity/Makefile index 690312308f..a2e8507fd6 100644 --- a/src/backend/utils/activity/Makefile +++ b/src/backend/utils/activity/Makefile @@ -16,6 +16,7 @@ include $(top_builddir)/src/Makefile.global OBJS = \ backend_progress.o \ backend_status.o \ + pgstat.o \ pgstat_archiver.o \ pgstat_bgwriter.o \ pgstat_checkpointer.o \ diff --git a/src/backend/postmaster/pgstat.c b/src/backend/utils/activity/pgstat.c similarity index 99% rename from src/backend/postmaster/pgstat.c rename to src/backend/utils/activity/pgstat.c index cc6f2700d6..db30c72073 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -84,7 +84,7 @@ * Copyright (c) 2001-2022, PostgreSQL Global Development Group * * IDENTIFICATION - * src/backend/postmaster/pgstat.c + * src/backend/utils/activity/pgstat.c * ---------- */ #include "postgres.h" From 06f5295af673df795e8e70e28c43d61c2817b6df Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 7 Apr 2022 14:34:37 +0900 Subject: [PATCH 414/772] Add single-item cache when looking at topmost XID of a subtrans XID This change affects SubTransGetTopmostTransaction(), used to find the topmost transaction ID of a given transaction ID. The cache is able to store one value, so as we can save the backend from unnecessary lookups at pg_subtrans/ on repetitive calls of this routine. There is a similar practice in transam.c, for example. Author: Simon Riggs Reviewed-by: Andrey Borodin, Julien Rouhaud Discussion: https://postgr.es/m/CANbhV-G8Co=yq4v4BkW7MJDqVt68K_8A48nAZ_+8UQS7LrwLEQ@mail.gmail.com --- src/backend/access/transam/subtrans.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/backend/access/transam/subtrans.c b/src/backend/access/transam/subtrans.c index 66d3548155..7240454ca4 100644 --- a/src/backend/access/transam/subtrans.c +++ b/src/backend/access/transam/subtrans.c @@ -54,6 +54,14 @@ #define TransactionIdToPage(xid) ((xid) / (TransactionId) SUBTRANS_XACTS_PER_PAGE) #define TransactionIdToEntry(xid) ((xid) % (TransactionId) SUBTRANS_XACTS_PER_PAGE) +/* + * Single-item cache for results of SubTransGetTopmostTransaction(). It's + * worth having such a cache because we frequently find ourselves repeatedly + * checking the same XID, for example when scanning a table just after a + * bulk insert, update, or delete. + */ +static TransactionId cachedFetchSubXid = InvalidTransactionId; +static TransactionId cachedFetchTopmostXid = InvalidTransactionId; /* * Link to shared-memory data structures for SUBTRANS control @@ -155,6 +163,13 @@ SubTransGetTopmostTransaction(TransactionId xid) /* Can't ask about stuff that might not be around anymore */ Assert(TransactionIdFollowsOrEquals(xid, TransactionXmin)); + /* + * Before going to the subtrans log, check our single item cache to see if + * we know the result from a previous/recent request. + */ + if (TransactionIdEquals(xid, cachedFetchSubXid)) + return cachedFetchTopmostXid; + while (TransactionIdIsValid(parentXid)) { previousXid = parentXid; @@ -174,6 +189,9 @@ SubTransGetTopmostTransaction(TransactionId xid) Assert(TransactionIdIsValid(previousXid)); + cachedFetchSubXid = xid; + cachedFetchTopmostXid = previousXid; + return previousXid; } From a8cfb0c1a964ebbe830c5138d389b0d2627ec298 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 7 Apr 2022 07:32:43 +0200 Subject: [PATCH 415/772] Update config.guess and config.sub --- config/config.guess | 1236 ++++++++++++++++++++++--------------------- config/config.sub | 92 ++-- 2 files changed, 706 insertions(+), 622 deletions(-) diff --git a/config/config.guess b/config/config.guess index 1972fda8eb..7f76b6228f 100644 --- a/config/config.guess +++ b/config/config.guess @@ -1,12 +1,14 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2021 Free Software Foundation, Inc. +# Copyright 1992-2022 Free Software Foundation, Inc. -timestamp='2021-01-25' +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2022-01-09' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -32,7 +34,15 @@ timestamp='2021-01-25' # Please send patches to . -me=$(echo "$0" | sed -e 's,.*/,,') +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + + +me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] @@ -50,7 +60,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2021 Free Software Foundation, Inc. +Copyright 1992-2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -84,6 +94,9 @@ if test $# != 0; then exit 1 fi +# Just in case it came from the environment. +GUESS= + # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a @@ -102,8 +115,8 @@ set_cc_for_build() { # prevent multiple calls if $tmp is already set test "$tmp" && return 0 : "${TMPDIR=/tmp}" - # shellcheck disable=SC2039 - { tmp=$( (umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null) && test -n "$tmp" && test -d "$tmp" ; } || + # shellcheck disable=SC2039,SC3028 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } @@ -112,7 +125,7 @@ set_cc_for_build() { ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c89 c99 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then - CC_FOR_BUILD="$driver" + CC_FOR_BUILD=$driver break fi done @@ -131,12 +144,12 @@ if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi -UNAME_MACHINE=$( (uname -m) 2>/dev/null) || UNAME_MACHINE=unknown -UNAME_RELEASE=$( (uname -r) 2>/dev/null) || UNAME_RELEASE=unknown -UNAME_SYSTEM=$( (uname -s) 2>/dev/null) || UNAME_SYSTEM=unknown -UNAME_VERSION=$( (uname -v) 2>/dev/null) || UNAME_VERSION=unknown +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown -case "$UNAME_SYSTEM" in +case $UNAME_SYSTEM in Linux|GNU|GNU/*) LIBC=unknown @@ -157,7 +170,8 @@ Linux|GNU|GNU/*) #endif #endif EOF - eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g')" + cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + eval "$cc_set_libc" # Second heuristic to detect musl libc. if [ "$LIBC" = unknown ] && @@ -176,7 +190,7 @@ esac # Note: order is significant - the case branches are not exclusive. -case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in +case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, @@ -188,11 +202,11 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". - UNAME_MACHINE_ARCH=$( (uname -p 2>/dev/null || \ + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ - echo unknown)) - case "$UNAME_MACHINE_ARCH" in + echo unknown)` + case $UNAME_MACHINE_ARCH in aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; @@ -200,15 +214,15 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) - arch=$(echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,') - endian=$(echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p') - machine="${arch}${endian}"-unknown + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown ;; - *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. - case "$UNAME_MACHINE_ARCH" in + case $UNAME_MACHINE_ARCH in earm*) os=netbsdelf ;; @@ -229,10 +243,10 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in ;; esac # Determine ABI tags. - case "$UNAME_MACHINE_ARCH" in + case $UNAME_MACHINE_ARCH in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' - abi=$(echo "$UNAME_MACHINE_ARCH" | sed -e "$expr") + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release @@ -240,76 +254,82 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. - case "$UNAME_VERSION" in + case $UNAME_VERSION in Debian*) release='-gnu' ;; *) - release=$(echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "$machine-${os}${release}${abi-}" - exit ;; + GUESS=$machine-${os}${release}${abi-} + ;; *:Bitrig:*:*) - UNAME_MACHINE_ARCH=$(arch | sed 's/Bitrig.//') - echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" - exit ;; + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE + ;; *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=$(arch | sed 's/OpenBSD.//') - echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" - exit ;; + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE + ;; + *:SecBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE + ;; *:LibertyBSD:*:*) - UNAME_MACHINE_ARCH=$(arch | sed 's/^.*BSD\.//') - echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" - exit ;; + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE + ;; *:MidnightBSD:*:*) - echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE + ;; *:ekkoBSD:*:*) - echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE + ;; *:SolidBSD:*:*) - echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE + ;; *:OS108:*:*) - echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE + ;; macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE + ;; *:MirBSD:*:*) - echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE + ;; *:Sortix:*:*) - echo "$UNAME_MACHINE"-unknown-sortix - exit ;; + GUESS=$UNAME_MACHINE-unknown-sortix + ;; *:Twizzler:*:*) - echo "$UNAME_MACHINE"-unknown-twizzler - exit ;; + GUESS=$UNAME_MACHINE-unknown-twizzler + ;; *:Redox:*:*) - echo "$UNAME_MACHINE"-unknown-redox - exit ;; + GUESS=$UNAME_MACHINE-unknown-redox + ;; mips:OSF1:*.*) - echo mips-dec-osf1 - exit ;; + GUESS=mips-dec-osf1 + ;; alpha:OSF1:*:*) + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + trap '' 0 case $UNAME_RELEASE in *4.0) - UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $3}') + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) - UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $4}') + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=$(/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1) - case "$ALPHA_CPU_TYPE" in + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case $ALPHA_CPU_TYPE in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") @@ -346,68 +366,69 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo "$UNAME_MACHINE"-dec-osf"$(echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)" - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; + OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + GUESS=$UNAME_MACHINE-dec-osf$OSF_REL + ;; Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; + GUESS=m68k-unknown-sysv4 + ;; *:[Aa]miga[Oo][Ss]:*:*) - echo "$UNAME_MACHINE"-unknown-amigaos - exit ;; + GUESS=$UNAME_MACHINE-unknown-amigaos + ;; *:[Mm]orph[Oo][Ss]:*:*) - echo "$UNAME_MACHINE"-unknown-morphos - exit ;; + GUESS=$UNAME_MACHINE-unknown-morphos + ;; *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; + GUESS=i370-ibm-openedition + ;; *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; + GUESS=s390-ibm-zvmoe + ;; *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; + GUESS=powerpc-ibm-os400 + ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix"$UNAME_RELEASE" - exit ;; + GUESS=arm-acorn-riscix$UNAME_RELEASE + ;; arm*:riscos:*:*|arm*:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; + GUESS=arm-unknown-riscos + ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; + GUESS=hppa1.1-hitachi-hiuxmpp + ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "$( (/bin/universe) 2>/dev/null)" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; + case `(/bin/universe) 2>/dev/null` in + att) GUESS=pyramid-pyramid-sysv3 ;; + *) GUESS=pyramid-pyramid-bsd ;; + esac + ;; NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; + GUESS=pyramid-pyramid-svr4 + ;; DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; + GUESS=sparc-icl-nx6 + ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case $(/usr/bin/uname -p) in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; + case `/usr/bin/uname -p` in + sparc) GUESS=sparc-icl-nx7 ;; + esac + ;; s390x:SunOS:*:*) - echo "$UNAME_MACHINE"-ibm-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL + ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-hal-solaris2$SUN_REL + ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris2$SUN_REL + ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux"$UNAME_RELEASE" - exit ;; + GUESS=i386-pc-auroraux$UNAME_RELEASE + ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) set_cc_for_build SUN_ARCH=i386 @@ -416,47 +437,50 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # This test works for both compilers. if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi - echo "$SUN_ARCH"-pc-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$SUN_ARCH-pc-solaris2$SUN_REL + ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris3$SUN_REL + ;; sun4*:SunOS:*:*) - case "$(/usr/bin/arch -k)" in + case `/usr/bin/arch -k` in Series*|S4*) - UNAME_RELEASE=$(uname -v) + UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/')" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` + GUESS=sparc-sun-sunos$SUN_REL + ;; sun3*:SunOS:*:*) - echo m68k-sun-sunos"$UNAME_RELEASE" - exit ;; + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; sun*:*:4.2BSD:*) - UNAME_RELEASE=$( (sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 - case "$(/bin/arch)" in + case `/bin/arch` in sun3) - echo m68k-sun-sunos"$UNAME_RELEASE" + GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) - echo sparc-sun-sunos"$UNAME_RELEASE" + GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac - exit ;; + ;; aushp:SunOS:*:*) - echo sparc-auspex-sunos"$UNAME_RELEASE" - exit ;; + GUESS=sparc-auspex-sunos$UNAME_RELEASE + ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor @@ -466,41 +490,41 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-milan-mint$UNAME_RELEASE + ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-hades-mint$UNAME_RELEASE + ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-unknown-mint$UNAME_RELEASE + ;; m68k:machten:*:*) - echo m68k-apple-machten"$UNAME_RELEASE" - exit ;; + GUESS=m68k-apple-machten$UNAME_RELEASE + ;; powerpc:machten:*:*) - echo powerpc-apple-machten"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-apple-machten$UNAME_RELEASE + ;; RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; + GUESS=mips-dec-mach_bsd4.3 + ;; RISC*:ULTRIX:*:*) - echo mips-dec-ultrix"$UNAME_RELEASE" - exit ;; + GUESS=mips-dec-ultrix$UNAME_RELEASE + ;; VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix"$UNAME_RELEASE" - exit ;; + GUESS=vax-dec-ultrix$UNAME_RELEASE + ;; 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix"$UNAME_RELEASE" - exit ;; + GUESS=clipper-intergraph-clix$UNAME_RELEASE + ;; mips:*:*:UMIPS | mips:*:*:RISCos) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" @@ -525,78 +549,79 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && - dummyarg=$(echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p') && - SYSTEM_NAME=$("$dummy" "$dummyarg") && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos"$UNAME_RELEASE" - exit ;; + GUESS=mips-mips-riscos$UNAME_RELEASE + ;; Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; + GUESS=powerpc-motorola-powermax + ;; Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; + GUESS=powerpc-harris-powerunix + ;; m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; + GUESS=m88k-harris-cxux7 + ;; m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; + GUESS=m88k-motorola-sysv4 + ;; m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=$(/usr/bin/uname -p) + UNAME_PROCESSOR=`/usr/bin/uname -p` if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ test "$TARGET_BINARY_INTERFACE"x = x then - echo m88k-dg-dgux"$UNAME_RELEASE" + GUESS=m88k-dg-dgux$UNAME_RELEASE else - echo m88k-dg-dguxbcs"$UNAME_RELEASE" + GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else - echo i586-dg-dgux"$UNAME_RELEASE" + GUESS=i586-dg-dgux$UNAME_RELEASE fi - exit ;; + ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; + GUESS=m88k-dolphin-sysv3 + ;; M88*:*:R3*:*) # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; + GUESS=m88k-tektronix-sysv3 + ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; + GUESS=m68k-tektronix-bsd + ;; *:IRIX*:*:*) - echo mips-sgi-irix"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/g')" - exit ;; + IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` + GUESS=mips-sgi-irix$IRIX_REL + ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'$(uname -s)'" gives 'AIX ' + GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id + ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; + GUESS=i386-ibm-aix + ;; ia64:AIX:*:*) if test -x /usr/bin/oslevel ; then - IBM_REV=$(/usr/bin/oslevel) + IBM_REV=`/usr/bin/oslevel` else - IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" - exit ;; + GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV + ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then set_cc_for_build @@ -611,68 +636,68 @@ EOF exit(0); } EOF - if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then - echo "$SYSTEM_NAME" + GUESS=$SYSTEM_NAME else - echo rs6000-ibm-aix3.2.5 + GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 + GUESS=rs6000-ibm-aix3.2.4 else - echo rs6000-ibm-aix3.2 + GUESS=rs6000-ibm-aix3.2 fi - exit ;; + ;; *:AIX:*:[4567]) - IBM_CPU_ID=$(/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }') + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if test -x /usr/bin/lslpp ; then - IBM_REV=$(/usr/bin/lslpp -Lqc bos.rte.libc | - awk -F: '{ print $3 }' | sed s/[0-9]*$/0/) + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else - IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo "$IBM_ARCH"-ibm-aix"$IBM_REV" - exit ;; + GUESS=$IBM_ARCH-ibm-aix$IBM_REV + ;; *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; + GUESS=rs6000-ibm-aix + ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) - echo romp-ibm-bsd4.4 - exit ;; + GUESS=romp-ibm-bsd4.4 + ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 + GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to + ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; + GUESS=rs6000-bull-bosx + ;; DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; + GUESS=m68k-bull-sysv3 + ;; 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; + GUESS=m68k-hp-bsd + ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; + GUESS=m68k-hp-bsd4.4 + ;; 9000/[34678]??:HP-UX:*:*) - HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//') - case "$UNAME_MACHINE" in + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + case $UNAME_MACHINE in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if test -x /usr/bin/getconf; then - sc_cpu_version=$(/usr/bin/getconf SC_CPU_VERSION 2>/dev/null) - sc_kernel_bits=$(/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null) - case "$sc_cpu_version" in + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case $sc_cpu_version in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 - case "$sc_kernel_bits" in + case $sc_kernel_bits in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 @@ -714,7 +739,7 @@ EOF exit (0); } EOF - (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=$("$dummy") + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac @@ -739,12 +764,12 @@ EOF HP_ARCH=hppa64 fi fi - echo "$HP_ARCH"-hp-hpux"$HPUX_REV" - exit ;; + GUESS=$HP_ARCH-hp-hpux$HPUX_REV + ;; ia64:HP-UX:*:*) - HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//') - echo ia64-hp-hpux"$HPUX_REV" - exit ;; + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + GUESS=ia64-hp-hpux$HPUX_REV + ;; 3050*:HI-UX:*:*) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" @@ -772,38 +797,38 @@ EOF exit (0); } EOF - $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; + GUESS=unknown-hitachi-hiuxwe2 + ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) - echo hppa1.1-hp-bsd - exit ;; + GUESS=hppa1.1-hp-bsd + ;; 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; + GUESS=hppa1.0-hp-bsd + ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; + GUESS=hppa1.0-hp-mpeix + ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) - echo hppa1.1-hp-osf - exit ;; + GUESS=hppa1.1-hp-osf + ;; hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; + GUESS=hppa1.0-hp-osf + ;; i*86:OSF1:*:*) if test -x /usr/sbin/sysversion ; then - echo "$UNAME_MACHINE"-unknown-osf1mk + GUESS=$UNAME_MACHINE-unknown-osf1mk else - echo "$UNAME_MACHINE"-unknown-osf1 + GUESS=$UNAME_MACHINE-unknown-osf1 fi - exit ;; + ;; parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; + GUESS=hppa1.1-hp-lites + ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; + GUESS=c1-convex-bsd + ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd @@ -811,17 +836,18 @@ EOF fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; + GUESS=c34-convex-bsd + ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; + GUESS=c38-convex-bsd + ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; + GUESS=c4-convex-bsd + ;; CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=ymp-cray-unicos$CRAY_REL + ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ @@ -829,114 +855,129 @@ EOF -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) - echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=t90-cray-unicos$CRAY_REL + ;; CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=alphaev5-cray-unicosmk$CRAY_REL + ;; CRAY*SV1:*:*:*) - echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=sv1-cray-unicos$CRAY_REL + ;; *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=craynv-cray-unicosmp$CRAY_REL + ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=$(uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz) - FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///') - FUJITSU_REL=$(echo "$UNAME_RELEASE" | sed -e 's/ /_/') - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///') - FUJITSU_REL=$(echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/') - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE + ;; sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi"$UNAME_RELEASE" - exit ;; + GUESS=sparc-unknown-bsdi$UNAME_RELEASE + ;; *:BSD/OS:*:*) - echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE + ;; arm:FreeBSD:*:*) - UNAME_PROCESSOR=$(uname -p) + UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabi + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi else - echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabihf + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf fi - exit ;; + ;; *:FreeBSD:*:*) - UNAME_PROCESSOR=$(/usr/bin/uname -p) - case "$UNAME_PROCESSOR" in + UNAME_PROCESSOR=`/usr/bin/uname -p` + case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac - echo "$UNAME_PROCESSOR"-unknown-freebsd"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')" - exit ;; + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL + ;; i*:CYGWIN*:*) - echo "$UNAME_MACHINE"-pc-cygwin - exit ;; + GUESS=$UNAME_MACHINE-pc-cygwin + ;; *:MINGW64*:*) - echo "$UNAME_MACHINE"-pc-mingw64 - exit ;; + GUESS=$UNAME_MACHINE-pc-mingw64 + ;; *:MINGW*:*) - echo "$UNAME_MACHINE"-pc-mingw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-mingw32 + ;; *:MSYS*:*) - echo "$UNAME_MACHINE"-pc-msys - exit ;; + GUESS=$UNAME_MACHINE-pc-msys + ;; i*:PW*:*) - echo "$UNAME_MACHINE"-pc-pw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-pw32 + ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; *:Interix*:*) - case "$UNAME_MACHINE" in + case $UNAME_MACHINE in x86) - echo i586-pc-interix"$UNAME_RELEASE" - exit ;; + GUESS=i586-pc-interix$UNAME_RELEASE + ;; authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix"$UNAME_RELEASE" - exit ;; + GUESS=x86_64-unknown-interix$UNAME_RELEASE + ;; IA64) - echo ia64-unknown-interix"$UNAME_RELEASE" - exit ;; + GUESS=ia64-unknown-interix$UNAME_RELEASE + ;; esac ;; i*:UWIN*:*) - echo "$UNAME_MACHINE"-pc-uwin - exit ;; + GUESS=$UNAME_MACHINE-pc-uwin + ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-pc-cygwin - exit ;; + GUESS=x86_64-pc-cygwin + ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=powerpcle-unknown-solaris2$SUN_REL + ;; *:GNU:*:*) # the GNU system - echo "$(echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,')-unknown-$LIBC$(echo "$UNAME_RELEASE"|sed -e 's,/.*$,,')" - exit ;; + GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` + GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL + ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo "$UNAME_MACHINE-unknown-$(echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]")$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')-$LIBC" - exit ;; + GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC + ;; *:Minix:*:*) - echo "$UNAME_MACHINE"-unknown-minix - exit ;; + GUESS=$UNAME_MACHINE-unknown-minix + ;; aarch64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; alpha:Linux:*:*) - case $(sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null) in + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; @@ -947,63 +988,63 @@ EOF esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - arc:Linux:*:* | arceb:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi - exit ;; + ;; avr32*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; cris:Linux:*:*) - echo "$UNAME_MACHINE"-axis-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; crisv32:Linux:*:*) - echo "$UNAME_MACHINE"-axis-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; e2k:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; frv:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; hexagon:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:Linux:*:*) - echo "$UNAME_MACHINE"-pc-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-pc-linux-$LIBC + ;; ia64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; k1om:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m32r*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m68*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build IS_GLIBC=0 @@ -1048,65 +1089,66 @@ EOF #endif #endif EOF - eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI')" + cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` + eval "$cc_set_vars" test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; openrisc*:Linux:*:*) - echo or1k-unknown-linux-"$LIBC" - exit ;; + GUESS=or1k-unknown-linux-$LIBC + ;; or32:Linux:*:* | or1k*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; padre:Linux:*:*) - echo sparc-unknown-linux-"$LIBC" - exit ;; + GUESS=sparc-unknown-linux-$LIBC + ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-"$LIBC" - exit ;; + GUESS=hppa64-unknown-linux-$LIBC + ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level - case $(grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2) in - PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; - PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; - *) echo hppa-unknown-linux-"$LIBC" ;; + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; + PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; + *) GUESS=hppa-unknown-linux-$LIBC ;; esac - exit ;; + ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpc64-unknown-linux-$LIBC + ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpc-unknown-linux-$LIBC + ;; ppc64le:Linux:*:*) - echo powerpc64le-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpc64le-unknown-linux-$LIBC + ;; ppcle:Linux:*:*) - echo powerpcle-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpcle-unknown-linux-$LIBC + ;; riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; s390:Linux:*:* | s390x:Linux:*:*) - echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-ibm-linux-$LIBC + ;; sh64*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sh*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; tile*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; vax:Linux:*:*) - echo "$UNAME_MACHINE"-dec-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-dec-linux-$LIBC + ;; x86_64:Linux:*:*) set_cc_for_build LIBCABI=$LIBC @@ -1115,71 +1157,71 @@ EOF (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_X32 >/dev/null then - LIBCABI="$LIBC"x32 + LIBCABI=${LIBC}x32 fi fi - echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI" - exit ;; + GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI + ;; xtensa*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; + GUESS=i386-sequent-sysv4 + ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. - echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" - exit ;; + GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION + ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. - echo "$UNAME_MACHINE"-pc-os2-emx - exit ;; + GUESS=$UNAME_MACHINE-pc-os2-emx + ;; i*86:XTS-300:*:STOP) - echo "$UNAME_MACHINE"-unknown-stop - exit ;; + GUESS=$UNAME_MACHINE-unknown-stop + ;; i*86:atheos:*:*) - echo "$UNAME_MACHINE"-unknown-atheos - exit ;; + GUESS=$UNAME_MACHINE-unknown-atheos + ;; i*86:syllable:*:*) - echo "$UNAME_MACHINE"-pc-syllable - exit ;; + GUESS=$UNAME_MACHINE-pc-syllable + ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=i386-unknown-lynxos$UNAME_RELEASE + ;; i*86:*DOS:*:*) - echo "$UNAME_MACHINE"-pc-msdosdjgpp - exit ;; + GUESS=$UNAME_MACHINE-pc-msdosdjgpp + ;; i*86:*:4.*:*) - UNAME_REL=$(echo "$UNAME_RELEASE" | sed 's/\/MP$//') + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else - echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi - exit ;; + ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. - case $(/bin/uname -X | grep "^Machine") in + case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac - echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" - exit ;; + GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then - UNAME_REL=$(sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=$( (/bin/uname -X|grep Release|sed -e 's/.*= //')) + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 @@ -1187,11 +1229,11 @@ EOF && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 - echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else - echo "$UNAME_MACHINE"-pc-sysv32 + GUESS=$UNAME_MACHINE-pc-sysv32 fi - exit ;; + ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about @@ -1199,37 +1241,37 @@ EOF # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; + GUESS=i586-pc-msdosdjgpp + ;; Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; + GUESS=i386-pc-mach3 + ;; paragon:*:*:*) - echo i860-intel-osf1 - exit ;; + GUESS=i860-intel-osf1 + ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi - exit ;; + ;; mini*:CTIX:SYS*5:*) # "miniframe" - echo m68010-convergent-sysv - exit ;; + GUESS=m68010-convergent-sysv + ;; mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; + GUESS=m68k-convergent-sysv + ;; M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; + GUESS=m68k-diab-dnix + ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ - && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid) + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ @@ -1240,7 +1282,7 @@ EOF NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ - && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid) + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ @@ -1248,118 +1290,118 @@ EOF /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=m68k-unknown-lynxos$UNAME_RELEASE + ;; mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; + GUESS=m68k-atari-sysv4 + ;; TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=sparc-unknown-lynxos$UNAME_RELEASE + ;; rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=rs6000-unknown-lynxos$UNAME_RELEASE + ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-unknown-lynxos$UNAME_RELEASE + ;; SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv"$UNAME_RELEASE" - exit ;; + GUESS=mips-dde-sysv$UNAME_RELEASE + ;; RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=$( (uname -p) 2>/dev/null) - echo "$UNAME_MACHINE"-sni-sysv4 + UNAME_MACHINE=`(uname -p) 2>/dev/null` + GUESS=$UNAME_MACHINE-sni-sysv4 else - echo ns32k-sni-sysv + GUESS=ns32k-sni-sysv fi - exit ;; + ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says - echo i586-unisys-sysv4 - exit ;; + GUESS=i586-unisys-sysv4 + ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; + GUESS=hppa1.1-stratus-sysv4 + ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; + GUESS=i860-stratus-sysv4 + ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. - echo "$UNAME_MACHINE"-stratus-vos - exit ;; + GUESS=$UNAME_MACHINE-stratus-vos + ;; *:VOS:*:*) # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; + GUESS=hppa1.1-stratus-vos + ;; mc68*:A/UX:*:*) - echo m68k-apple-aux"$UNAME_RELEASE" - exit ;; + GUESS=m68k-apple-aux$UNAME_RELEASE + ;; news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; + GUESS=mips-sony-newsos6 + ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if test -d /usr/nec; then - echo mips-nec-sysv"$UNAME_RELEASE" + GUESS=mips-nec-sysv$UNAME_RELEASE else - echo mips-unknown-sysv"$UNAME_RELEASE" + GUESS=mips-unknown-sysv$UNAME_RELEASE fi - exit ;; + ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; + GUESS=powerpc-be-beos + ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; + GUESS=powerpc-apple-beos + ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; + GUESS=i586-pc-beos + ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; + GUESS=i586-pc-haiku + ;; x86_64:Haiku:*:*) - echo x86_64-unknown-haiku - exit ;; + GUESS=x86_64-unknown-haiku + ;; SX-4:SUPER-UX:*:*) - echo sx4-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx4-nec-superux$UNAME_RELEASE + ;; SX-5:SUPER-UX:*:*) - echo sx5-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx5-nec-superux$UNAME_RELEASE + ;; SX-6:SUPER-UX:*:*) - echo sx6-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx6-nec-superux$UNAME_RELEASE + ;; SX-7:SUPER-UX:*:*) - echo sx7-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx7-nec-superux$UNAME_RELEASE + ;; SX-8:SUPER-UX:*:*) - echo sx8-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx8-nec-superux$UNAME_RELEASE + ;; SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx8r-nec-superux$UNAME_RELEASE + ;; SX-ACE:SUPER-UX:*:*) - echo sxace-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sxace-nec-superux$UNAME_RELEASE + ;; Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-apple-rhapsody$UNAME_RELEASE + ;; *:Rhapsody:*:*) - echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE + ;; arm64:Darwin:*:*) - echo aarch64-apple-darwin"$UNAME_RELEASE" - exit ;; + GUESS=aarch64-apple-darwin$UNAME_RELEASE + ;; *:Darwin:*:*) - UNAME_PROCESSOR=$(uname -p) + UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac @@ -1393,109 +1435,119 @@ EOF # uname -m returns i386 or x86_64 UNAME_PROCESSOR=$UNAME_MACHINE fi - echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE + ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=$(uname -p) + UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi - echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE + ;; *:QNX:*:4*) - echo i386-pc-qnx - exit ;; + GUESS=i386-pc-qnx + ;; NEO-*:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=neo-tandem-nsk$UNAME_RELEASE + ;; NSE-*:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nse-tandem-nsk$UNAME_RELEASE + ;; NSR-*:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nsr-tandem-nsk$UNAME_RELEASE + ;; NSV-*:NONSTOP_KERNEL:*:*) - echo nsv-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nsv-tandem-nsk$UNAME_RELEASE + ;; NSX-*:NONSTOP_KERNEL:*:*) - echo nsx-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nsx-tandem-nsk$UNAME_RELEASE + ;; *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; + GUESS=mips-compaq-nonstopux + ;; BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; + GUESS=bs2000-siemens-sysv + ;; DS/*:UNIX_System_V:*:*) - echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE + ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - # shellcheck disable=SC2154 - if test "$cputype" = 386; then + if test "${cputype-}" = 386; then UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" + elif test "x${cputype-}" != x; then + UNAME_MACHINE=$cputype fi - echo "$UNAME_MACHINE"-unknown-plan9 - exit ;; + GUESS=$UNAME_MACHINE-unknown-plan9 + ;; *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; + GUESS=pdp10-unknown-tops10 + ;; *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; + GUESS=pdp10-unknown-tenex + ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; + GUESS=pdp10-dec-tops20 + ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; + GUESS=pdp10-xkl-tops20 + ;; *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; + GUESS=pdp10-unknown-tops20 + ;; *:ITS:*:*) - echo pdp10-unknown-its - exit ;; + GUESS=pdp10-unknown-its + ;; SEI:*:*:SEIUX) - echo mips-sei-seiux"$UNAME_RELEASE" - exit ;; + GUESS=mips-sei-seiux$UNAME_RELEASE + ;; *:DragonFly:*:*) - echo "$UNAME_MACHINE"-unknown-dragonfly"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')" - exit ;; + DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL + ;; *:*VMS:*:*) - UNAME_MACHINE=$( (uname -p) 2>/dev/null) - case "$UNAME_MACHINE" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case $UNAME_MACHINE in + A*) GUESS=alpha-dec-vms ;; + I*) GUESS=ia64-dec-vms ;; + V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; + GUESS=i386-pc-xenix + ;; i*86:skyos:*:*) - echo "$UNAME_MACHINE"-pc-skyos"$(echo "$UNAME_RELEASE" | sed -e 's/ .*$//')" - exit ;; + SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` + GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL + ;; i*86:rdos:*:*) - echo "$UNAME_MACHINE"-pc-rdos - exit ;; + GUESS=$UNAME_MACHINE-pc-rdos + ;; + i*86:Fiwix:*:*) + GUESS=$UNAME_MACHINE-pc-fiwix + ;; *:AROS:*:*) - echo "$UNAME_MACHINE"-unknown-aros - exit ;; + GUESS=$UNAME_MACHINE-unknown-aros + ;; x86_64:VMkernel:*:*) - echo "$UNAME_MACHINE"-unknown-esx - exit ;; + GUESS=$UNAME_MACHINE-unknown-esx + ;; amd64:Isilon\ OneFS:*:*) - echo x86_64-unknown-onefs - exit ;; + GUESS=x86_64-unknown-onefs + ;; *:Unleashed:*:*) - echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE + ;; esac +# Do we have a guess based on uname results? +if test "x$GUESS" != x; then + echo "$GUESS" + exit +fi + # No uname command or uname output not recognized. set_cc_for_build cat > "$dummy.c" </dev/null); + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else @@ -1627,7 +1679,7 @@ main () } EOF -$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=$($dummy) && +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. @@ -1635,7 +1687,7 @@ test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } echo "$0: unable to guess system type" >&2 -case "$UNAME_MACHINE:$UNAME_SYSTEM" in +case $UNAME_MACHINE:$UNAME_SYSTEM in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 </dev/null || echo unknown) -uname -r = $( (uname -r) 2>/dev/null || echo unknown) -uname -s = $( (uname -s) 2>/dev/null || echo unknown) -uname -v = $( (uname -v) 2>/dev/null || echo unknown) +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` -/usr/bin/uname -p = $( (/usr/bin/uname -p) 2>/dev/null) -/bin/uname -X = $( (/bin/uname -X) 2>/dev/null) +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` -hostinfo = $( (hostinfo) 2>/dev/null) -/bin/universe = $( (/bin/universe) 2>/dev/null) -/usr/bin/arch -k = $( (/usr/bin/arch -k) 2>/dev/null) -/bin/arch = $( (/bin/arch) 2>/dev/null) -/usr/bin/oslevel = $( (/usr/bin/oslevel) 2>/dev/null) -/usr/convex/getsysinfo = $( (/usr/convex/getsysinfo) 2>/dev/null) +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" diff --git a/config/config.sub b/config/config.sub index 7f7d0b055a..dba16e84c7 100644 --- a/config/config.sub +++ b/config/config.sub @@ -1,12 +1,14 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2021 Free Software Foundation, Inc. +# Copyright 1992-2022 Free Software Foundation, Inc. -timestamp='2021-03-10' +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2022-01-03' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -50,7 +52,14 @@ timestamp='2021-03-10' # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. -me=$(echo "$0" | sed -e 's,.*/,,') +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + +me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS @@ -67,7 +76,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2021 Free Software Foundation, Inc. +Copyright 1992-2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -112,9 +121,11 @@ esac # Split fields of configuration type # shellcheck disable=SC2162 +saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 From 5c279a6d350205cc98f91fb8e1d3e4442a6b25d1 Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Wed, 6 Apr 2022 22:26:43 -0700 Subject: [PATCH 416/772] Custom WAL Resource Managers. Allow extensions to specify a new custom resource manager (rmgr), which allows specialized WAL. This is meant to be used by a Table Access Method or Index Access Method. Prior to this commit, only Generic WAL was available, which offers support for recovery and physical replication but not logical replication. Reviewed-by: Julien Rouhaud, Bharath Rupireddy, Andres Freund Discussion: https://postgr.es/m/ed1fb2e22d15d3563ae0eb610f7b61bb15999c0a.camel%40j-davis.com --- doc/src/sgml/config.sgml | 4 +- doc/src/sgml/custom-rmgr.sgml | 98 +++++++++++++++++ doc/src/sgml/filelist.sgml | 1 + doc/src/sgml/func.sgml | 19 ++++ doc/src/sgml/generic-wal.sgml | 20 +++- doc/src/sgml/postgres.sgml | 1 + doc/src/sgml/ref/pg_waldump.sgml | 8 ++ src/backend/access/transam/rmgr.c | 124 +++++++++++++++++++++- src/backend/access/transam/xlogreader.c | 2 +- src/backend/access/transam/xlogrecovery.c | 33 ++---- src/backend/postmaster/postmaster.c | 6 ++ src/backend/replication/logical/decode.c | 8 +- src/backend/utils/init/miscinit.c | 2 + src/backend/utils/misc/guc.c | 77 ++++++++++++-- src/bin/pg_rewind/parsexlog.c | 11 +- src/bin/pg_waldump/pg_waldump.c | 66 ++++++++---- src/bin/pg_waldump/rmgrdesc.c | 61 ++++++++++- src/bin/pg_waldump/rmgrdesc.h | 2 +- src/include/access/rmgr.h | 19 +++- src/include/access/xlog_internal.h | 23 +++- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.dat | 7 ++ src/include/miscadmin.h | 1 + src/include/utils/guc.h | 1 + 24 files changed, 526 insertions(+), 70 deletions(-) create mode 100644 doc/src/sgml/custom-rmgr.sgml diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index ea312224bf..6901e71f9d 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -11189,8 +11189,8 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1) heap2, btree, hash, gin, gist, sequence, spgist, brin, and generic. - Only superusers and users with the appropriate SET - privilege can change this setting. + Extensions may define additional resource managers. Only superusers and users with + the appropriate SET privilege can change this setting. diff --git a/doc/src/sgml/custom-rmgr.sgml b/doc/src/sgml/custom-rmgr.sgml new file mode 100644 index 0000000000..17a4f1dfbd --- /dev/null +++ b/doc/src/sgml/custom-rmgr.sgml @@ -0,0 +1,98 @@ + + + + Custom WAL Resource Managers + + + This chapter explains the interface between the core + PostgreSQL system and custom WAL resource + managers, which enable extensions to integrate directly with the WAL. + + + An extension, especially a Table Access + Method or Index Access Method, may + need to use WAL for recovery, replication, and/or Logical Decoding. Custom resource managers + are a more flexible alternative to Generic + WAL (which does not support logical decoding), but more complex for + an extension to implement. + + + To create a new custom WAL resouce manager, first define an + RmgrData structure with implementations for the + resource manager methods. Refer to + src/backend/access/transam/README and + src/include/access/xlog_internal.h in the + PostgreSQL source. + +/* + * Method table for resource managers. + * + * This struct must be kept in sync with the PG_RMGR definition in + * rmgr.c. + * + * rm_identify must return a name for the record based on xl_info (without + * reference to the rmid). For example, XLOG_BTREE_VACUUM would be named + * "VACUUM". rm_desc can then be called to obtain additional detail for the + * record, if available (e.g. the last block). + * + * rm_mask takes as input a page modified by the resource manager and masks + * out bits that shouldn't be flagged by wal_consistency_checking. + * + * RmgrTable[] is indexed by RmgrId values (see rmgrlist.h). If rm_name is + * NULL, the corresponding RmgrTable entry is considered invalid. + */ +typedef struct RmgrData +{ + const char *rm_name; + void (*rm_redo) (XLogReaderState *record); + void (*rm_desc) (StringInfo buf, XLogReaderState *record); + const char *(*rm_identify) (uint8 info); + void (*rm_startup) (void); + void (*rm_cleanup) (void); + void (*rm_mask) (char *pagedata, BlockNumber blkno); + void (*rm_decode) (struct LogicalDecodingContext *ctx, + struct XLogRecordBuffer *buf); +} RmgrData; + + + + Then, register your new resource + manager. + + +/* + * Register a new custom WAL resource manager. + * + * Resource manager IDs must be globally unique across all extensions. Refer + * to https://wiki.postgresql.org/wiki/CustomWALResourceManager to reserve a + * unique RmgrId for your extension, to avoid conflicts with other extension + * developers. During development, use RM_EXPERIMENTAL_ID to avoid needlessly + * reserving a new ID. + */ +extern void RegisterCustomRmgr(RmgrId rmid, RmgrData *rmgr); + + RegisterCustomRmgr must be called from the + extension module's _PG_init function. + While developing a new extension, use RM_EXPERIMENTAL_ID + for rmid. When you ready to release the extension to + users, reserve a new resource manager ID at the Custom WAL + Resource Manager page. + + + + Place the extension module implementing the custom resource manager in so that it will be loaded early + during PostgreSQL startup. + + + + The extension must remain in shared_preload_libraries as long as any + custom WAL records may exist in the system. Otherwise + PostgreSQL will not be able to apply or decode + the custom WAL records, which may prevent the server from starting. + + + diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml index fd853af01f..7dea670969 100644 --- a/doc/src/sgml/filelist.sgml +++ b/doc/src/sgml/filelist.sgml @@ -105,6 +105,7 @@ + diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 0cf513100b..2f7aff9f21 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -26001,6 +26001,25 @@ postgres=# SELECT * FROM pg_walfile_name_offset((pg_backup_stop()).lsn); without recovery, the function returns NULL. + + + + + pg_get_wal_resource_managers + + pg_get_wal_resource_managers () + setof record + ( rm_id integer, + rm_name text, + rm_builtin boolean ) + + + Returns the currently-loaded WAL resource managers in the system. The + column rm_builtin indicates whether it's a + built-in resource manager, or a custom resource manager loaded by an + extension. + + diff --git a/doc/src/sgml/generic-wal.sgml b/doc/src/sgml/generic-wal.sgml index 7a0284994c..a028856d2e 100644 --- a/doc/src/sgml/generic-wal.sgml +++ b/doc/src/sgml/generic-wal.sgml @@ -6,11 +6,25 @@ Although all built-in WAL-logged modules have their own types of WAL records, there is also a generic WAL record type, which describes changes - to pages in a generic way. This is useful for extensions that provide - custom access methods, because they cannot register their own WAL redo - routines. + to pages in a generic way. This is useful for extensions that provide + custom access methods. + + In comparison with Custom WAL Resource + Managers, Generic WAL is simpler for an extension to implement and + does not require the extension library to be loaded in order to apply the + records. + + + + + Generic WAL records are ignored during Logical Decoding. If logical decoding is + required for your extension, consider a Custom WAL Resource Manager. + + + The API for constructing generic WAL records is defined in access/generic_xlog.h and implemented diff --git a/doc/src/sgml/postgres.sgml b/doc/src/sgml/postgres.sgml index 3db6d2160b..0b60e46d69 100644 --- a/doc/src/sgml/postgres.sgml +++ b/doc/src/sgml/postgres.sgml @@ -262,6 +262,7 @@ break is not needed in a wider output rendering. &tableam; &indexam; &generic-wal; + &custom-rmgr; &btree; &gist; &spgist; diff --git a/doc/src/sgml/ref/pg_waldump.sgml b/doc/src/sgml/ref/pg_waldump.sgml index 1a05af5d97..57746d9421 100644 --- a/doc/src/sgml/ref/pg_waldump.sgml +++ b/doc/src/sgml/ref/pg_waldump.sgml @@ -173,6 +173,14 @@ PostgreSQL documentation If list is passed as name, print a list of valid resource manager names, and exit. + + Extensions may define custom resource managers, but pg_waldump does + not load the extension module and therefore does not recognize custom + resource managers by name. Instead, you can specify the custom + resource managers as custom### where + "###" is the three-digit resource manager ID. Names + of this form will always be considered valid. + diff --git a/src/backend/access/transam/rmgr.c b/src/backend/access/transam/rmgr.c index f8847d5aeb..3c2dc1000d 100644 --- a/src/backend/access/transam/rmgr.c +++ b/src/backend/access/transam/rmgr.c @@ -24,16 +24,138 @@ #include "commands/dbcommands_xlog.h" #include "commands/sequence.h" #include "commands/tablespace.h" +#include "fmgr.h" +#include "funcapi.h" +#include "miscadmin.h" #include "replication/decode.h" #include "replication/message.h" #include "replication/origin.h" #include "storage/standby.h" +#include "utils/builtins.h" #include "utils/relmapper.h" /* must be kept in sync with RmgrData definition in xlog_internal.h */ #define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup,mask,decode) \ { name, redo, desc, identify, startup, cleanup, mask, decode }, -const RmgrData RmgrTable[RM_MAX_ID + 1] = { +RmgrData RmgrTable[RM_MAX_ID + 1] = { #include "access/rmgrlist.h" }; + +/* + * Start up all resource managers. + */ +void +RmgrStartup(void) +{ + for (int rmid = 0; rmid <= RM_MAX_ID; rmid++) + { + if (!RmgrIdExists(rmid)) + continue; + + if (RmgrTable[rmid].rm_startup != NULL) + RmgrTable[rmid].rm_startup(); + } +} + +/* + * Clean up all resource managers. + */ +void +RmgrCleanup(void) +{ + for (int rmid = 0; rmid <= RM_MAX_ID; rmid++) + { + if (!RmgrIdExists(rmid)) + continue; + + if (RmgrTable[rmid].rm_cleanup != NULL) + RmgrTable[rmid].rm_cleanup(); + } +} + +/* + * Emit ERROR when we encounter a record with an RmgrId we don't + * recognize. + */ +void +RmgrNotFound(RmgrId rmid) +{ + ereport(ERROR, (errmsg("resource manager with ID %d not registered", rmid), + errhint("Include the extension module that implements this resource manager in shared_preload_libraries."))); +} + +/* + * Register a new custom WAL resource manager. + * + * Resource manager IDs must be globally unique across all extensions. Refer + * to https://wiki.postgresql.org/wiki/CustomWALResourceManager to reserve a + * unique RmgrId for your extension, to avoid conflicts with other extension + * developers. During development, use RM_EXPERIMENTAL_ID to avoid needlessly + * reserving a new ID. + */ +void +RegisterCustomRmgr(RmgrId rmid, RmgrData *rmgr) +{ + if (rmgr->rm_name == NULL || strlen(rmgr->rm_name) == 0) + ereport(ERROR, (errmsg("custom resource manager name is invalid"), + errhint("Provide a non-empty name for the custom resource manager."))); + + if (!RMID_IS_CUSTOM(rmid)) + ereport(ERROR, (errmsg("custom resource manager ID %d is out of range", rmid), + errhint("Provide a custom resource manager ID between %d and %d.", + RM_MIN_CUSTOM_ID, RM_MAX_CUSTOM_ID))); + + if (!process_shared_preload_libraries_in_progress) + ereport(ERROR, + (errmsg("failed to register custom resource manager \"%s\" with ID %d", rmgr->rm_name, rmid), + errdetail("Custom resource manager must be registered while initializing modules in shared_preload_libraries."))); + + if (RmgrTable[rmid].rm_name != NULL) + ereport(ERROR, + (errmsg("failed to register custom resource manager \"%s\" with ID %d", rmgr->rm_name, rmid), + errdetail("Custom resource manager \"%s\" already registered with the same ID.", + RmgrTable[rmid].rm_name))); + + /* check for existing rmgr with the same name */ + for (int existing_rmid = 0; existing_rmid <= RM_MAX_ID; existing_rmid++) + { + if (!RmgrIdExists(existing_rmid)) + continue; + + if (!pg_strcasecmp(RmgrTable[existing_rmid].rm_name, rmgr->rm_name)) + ereport(ERROR, + (errmsg("failed to register custom resource manager \"%s\" with ID %d", rmgr->rm_name, rmid), + errdetail("Existing resource manager with ID %d has the same name.", existing_rmid))); + } + + /* register it */ + RmgrTable[rmid] = *rmgr; + ereport(LOG, + (errmsg("registered custom resource manager \"%s\" with ID %d", + rmgr->rm_name, rmid))); +} + +/* SQL SRF showing loaded resource managers */ +Datum +pg_get_wal_resource_managers(PG_FUNCTION_ARGS) +{ +#define PG_GET_RESOURCE_MANAGERS_COLS 3 + ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; + Datum values[PG_GET_RESOURCE_MANAGERS_COLS]; + bool nulls[PG_GET_RESOURCE_MANAGERS_COLS] = {0}; + + SetSingleFuncCall(fcinfo, 0); + + for (int rmid = 0; rmid <= RM_MAX_ID; rmid++) + { + if (!RmgrIdExists(rmid)) + continue; + values[0] = Int32GetDatum(rmid); + values[1] = CStringGetTextDatum(GetRmgr(rmid).rm_name); + values[2] = BoolGetDatum(RMID_IS_BUILTIN(rmid)); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); + } + + return (Datum) 0; +} diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index e437c42992..161cf13fed 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1102,7 +1102,7 @@ ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr RecPtr, (uint32) SizeOfXLogRecord, record->xl_tot_len); return false; } - if (record->xl_rmid > RM_MAX_ID) + if (!RMID_IS_VALID(record->xl_rmid)) { report_invalid_record(state, "invalid resource manager ID %u at %X/%X", diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 1b7bae387a..5539192167 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -1541,7 +1541,6 @@ ShutdownWalRecovery(void) void PerformWalRecovery(void) { - int rmid; XLogRecord *record; bool reachedRecoveryTarget = false; TimeLineID replayTLI; @@ -1614,12 +1613,7 @@ PerformWalRecovery(void) InRedo = true; - /* Initialize resource managers */ - for (rmid = 0; rmid <= RM_MAX_ID; rmid++) - { - if (RmgrTable[rmid].rm_startup != NULL) - RmgrTable[rmid].rm_startup(); - } + RmgrStartup(); ereport(LOG, (errmsg("redo starts at %X/%X", @@ -1756,12 +1750,7 @@ PerformWalRecovery(void) } } - /* Allow resource managers to do any required cleanup. */ - for (rmid = 0; rmid <= RM_MAX_ID; rmid++) - { - if (RmgrTable[rmid].rm_cleanup != NULL) - RmgrTable[rmid].rm_cleanup(); - } + RmgrCleanup(); ereport(LOG, (errmsg("redo done at %X/%X system usage: %s", @@ -1881,7 +1870,7 @@ ApplyWalRecord(XLogReaderState *xlogreader, XLogRecord *record, TimeLineID *repl xlogrecovery_redo(xlogreader, *replayTLI); /* Now apply the WAL record itself */ - RmgrTable[record->xl_rmid].rm_redo(xlogreader); + GetRmgr(record->xl_rmid).rm_redo(xlogreader); /* * After redo, check whether the backup pages associated with the WAL @@ -2111,20 +2100,20 @@ rm_redo_error_callback(void *arg) void xlog_outdesc(StringInfo buf, XLogReaderState *record) { - RmgrId rmid = XLogRecGetRmid(record); + RmgrData rmgr = GetRmgr(XLogRecGetRmid(record)); uint8 info = XLogRecGetInfo(record); const char *id; - appendStringInfoString(buf, RmgrTable[rmid].rm_name); + appendStringInfoString(buf, rmgr.rm_name); appendStringInfoChar(buf, '/'); - id = RmgrTable[rmid].rm_identify(info); + id = rmgr.rm_identify(info); if (id == NULL) appendStringInfo(buf, "UNKNOWN (%X): ", info & ~XLR_INFO_MASK); else appendStringInfo(buf, "%s: ", id); - RmgrTable[rmid].rm_desc(buf, record); + rmgr.rm_desc(buf, record); } #ifdef WAL_DEBUG @@ -2273,7 +2262,7 @@ getRecordTimestamp(XLogReaderState *record, TimestampTz *recordXtime) static void verifyBackupPageConsistency(XLogReaderState *record) { - RmgrId rmid = XLogRecGetRmid(record); + RmgrData rmgr = GetRmgr(XLogRecGetRmid(record)); RelFileNode rnode; ForkNumber forknum; BlockNumber blkno; @@ -2353,10 +2342,10 @@ verifyBackupPageConsistency(XLogReaderState *record) * If masking function is defined, mask both the primary and replay * images */ - if (RmgrTable[rmid].rm_mask != NULL) + if (rmgr.rm_mask != NULL) { - RmgrTable[rmid].rm_mask(replay_image_masked, blkno); - RmgrTable[rmid].rm_mask(primary_image_masked, blkno); + rmgr.rm_mask(replay_image_masked, blkno); + rmgr.rm_mask(primary_image_masked, blkno); } /* Time to compare the primary and replay images. */ diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index d5551e0af6..3535e9e47d 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -1039,6 +1039,12 @@ PostmasterMain(int argc, char *argv[]) */ InitializeShmemGUCs(); + /* + * Now that modules have been loaded, we can process any custom resource + * managers specified in the wal_consistency_checking GUC. + */ + InitializeWalConsistencyChecking(); + /* * If -C was specified with a runtime-computed GUC, we held off printing * the value earlier, as the GUC was not yet initialized. We handle -C diff --git a/src/backend/replication/logical/decode.c b/src/backend/replication/logical/decode.c index 77bc7aea7a..c6ea7c98e1 100644 --- a/src/backend/replication/logical/decode.c +++ b/src/backend/replication/logical/decode.c @@ -94,7 +94,7 @@ LogicalDecodingProcessRecord(LogicalDecodingContext *ctx, XLogReaderState *recor { XLogRecordBuffer buf; TransactionId txid; - RmgrId rmid; + RmgrData rmgr; buf.origptr = ctx->reader->ReadRecPtr; buf.endptr = ctx->reader->EndRecPtr; @@ -115,10 +115,10 @@ LogicalDecodingProcessRecord(LogicalDecodingContext *ctx, XLogReaderState *recor buf.origptr); } - rmid = XLogRecGetRmid(record); + rmgr = GetRmgr(XLogRecGetRmid(record)); - if (RmgrTable[rmid].rm_decode != NULL) - RmgrTable[rmid].rm_decode(ctx, &buf); + if (rmgr.rm_decode != NULL) + rmgr.rm_decode(ctx, &buf); else { /* just deal with xid, and done */ diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 0d3cfe8240..30f0f19dd5 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -1610,6 +1610,7 @@ char *local_preload_libraries_string = NULL; /* Flag telling that we are loading shared_preload_libraries */ bool process_shared_preload_libraries_in_progress = false; +bool process_shared_preload_libraries_done = false; /* * load the shared libraries listed in 'libraries' @@ -1677,6 +1678,7 @@ process_shared_preload_libraries(void) "shared_preload_libraries", false); process_shared_preload_libraries_in_progress = false; + process_shared_preload_libraries_done = true; } /* diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 998b8a94c4..89f8259bac 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -245,6 +245,11 @@ static bool check_default_with_oids(bool *newval, void **extra, GucSource source static ConfigVariable *ProcessConfigFileInternal(GucContext context, bool applySettings, int elevel); +/* + * Track whether there were any deferred checks for custom resource managers + * specified in wal_consistency_checking. + */ +static bool check_wal_consistency_checking_deferred = false; /* * Options for enum values defined in this module. @@ -5835,6 +5840,36 @@ InitializeGUCOptions(void) InitializeGUCOptionsFromEnvironment(); } +/* + * If any custom resource managers were specified in the + * wal_consistency_checking GUC, processing was deferred. Now that + * shared_preload_libraries have been loaded, process wal_consistency_checking + * again. + */ +void +InitializeWalConsistencyChecking(void) +{ + Assert(process_shared_preload_libraries_done); + + if (check_wal_consistency_checking_deferred) + { + struct config_generic *guc; + + guc = find_option("wal_consistency_checking", false, false, ERROR); + + check_wal_consistency_checking_deferred = false; + + set_config_option("wal_consistency_checking", + wal_consistency_checking_string, + PGC_POSTMASTER, guc->source, + GUC_ACTION_SET, true, ERROR, false); + + /* checking should not be deferred again */ + Assert(!check_wal_consistency_checking_deferred); + } + +} + /* * Assign any GUC values that can come from the server's environment. * @@ -11882,13 +11917,13 @@ check_wal_consistency_checking(char **newval, void **extra, GucSource source) { char *tok = (char *) lfirst(l); bool found = false; - RmgrId rmid; + int rmid; /* Check for 'all'. */ if (pg_strcasecmp(tok, "all") == 0) { for (rmid = 0; rmid <= RM_MAX_ID; rmid++) - if (RmgrTable[rmid].rm_mask != NULL) + if (RmgrIdExists(rmid) && GetRmgr(rmid).rm_mask != NULL) newwalconsistency[rmid] = true; found = true; } @@ -11900,8 +11935,8 @@ check_wal_consistency_checking(char **newval, void **extra, GucSource source) */ for (rmid = 0; rmid <= RM_MAX_ID; rmid++) { - if (pg_strcasecmp(tok, RmgrTable[rmid].rm_name) == 0 && - RmgrTable[rmid].rm_mask != NULL) + if (RmgrIdExists(rmid) && GetRmgr(rmid).rm_mask != NULL && + pg_strcasecmp(tok, GetRmgr(rmid).rm_name) == 0) { newwalconsistency[rmid] = true; found = true; @@ -11912,10 +11947,21 @@ check_wal_consistency_checking(char **newval, void **extra, GucSource source) /* If a valid resource manager is found, check for the next one. */ if (!found) { - GUC_check_errdetail("Unrecognized key word: \"%s\".", tok); - pfree(rawstring); - list_free(elemlist); - return false; + /* + * Perhaps it's a custom resource manager. If so, defer checking + * until InitializeWalConsistencyChecking(). + */ + if (!process_shared_preload_libraries_done) + { + check_wal_consistency_checking_deferred = true; + } + else + { + GUC_check_errdetail("Unrecognized key word: \"%s\".", tok); + pfree(rawstring); + list_free(elemlist); + return false; + } } } @@ -11931,7 +11977,20 @@ check_wal_consistency_checking(char **newval, void **extra, GucSource source) static void assign_wal_consistency_checking(const char *newval, void *extra) { - wal_consistency_checking = (bool *) extra; + /* + * If some checks were deferred, it's possible that the checks will fail + * later during InitializeWalConsistencyChecking(). But in that case, the + * postmaster will exit anyway, so it's safe to proceed with the + * assignment. + * + * Any built-in resource managers specified are assigned immediately, + * which affects WAL created before shared_preload_libraries are + * processed. Any custom resource managers specified won't be assigned + * until after shared_preload_libraries are processed, but that's OK + * because WAL for a custom resource manager can't be written before the + * module is loaded anyway. + */ + wal_consistency_checking = extra; } static bool diff --git a/src/bin/pg_rewind/parsexlog.c b/src/bin/pg_rewind/parsexlog.c index 49966e7b7f..dfa836d156 100644 --- a/src/bin/pg_rewind/parsexlog.c +++ b/src/bin/pg_rewind/parsexlog.c @@ -25,8 +25,8 @@ #include "pg_rewind.h" /* - * RmgrNames is an array of resource manager names, to make error messages - * a bit nicer. + * RmgrNames is an array of the built-in resource manager names, to make error + * messages a bit nicer. */ #define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup,mask,decode) \ name, @@ -35,6 +35,9 @@ static const char *RmgrNames[RM_MAX_ID + 1] = { #include "access/rmgrlist.h" }; +#define RmgrName(rmid) (((rmid) <= RM_MAX_BUILTIN_ID) ? \ + RmgrNames[rmid] : "custom") + static void extractPageInfo(XLogReaderState *record); static int xlogreadfd = -1; @@ -436,9 +439,9 @@ extractPageInfo(XLogReaderState *record) * track that change. */ pg_fatal("WAL record modifies a relation, but record type is not recognized: " - "lsn: %X/%X, rmgr: %s, info: %02X", + "lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X", LSN_FORMAT_ARGS(record->ReadRecPtr), - RmgrNames[rmid], info); + rmid, RmgrName(rmid), info); } for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 4cb40d068a..4f47449a6c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -80,8 +80,8 @@ typedef struct XLogDumpStats uint64 count; XLogRecPtr startptr; XLogRecPtr endptr; - Stats rmgr_stats[RM_NEXT_ID]; - Stats record_stats[RM_NEXT_ID][MAX_XLINFO_TYPES]; + Stats rmgr_stats[RM_MAX_ID + 1]; + Stats record_stats[RM_MAX_ID + 1][MAX_XLINFO_TYPES]; } XLogDumpStats; #define fatal_error(...) do { pg_log_fatal(__VA_ARGS__); exit(EXIT_FAILURE); } while(0) @@ -104,9 +104,9 @@ print_rmgr_list(void) { int i; - for (i = 0; i <= RM_MAX_ID; i++) + for (i = 0; i <= RM_MAX_BUILTIN_ID; i++) { - printf("%s\n", RmgrDescTable[i].rm_name); + printf("%s\n", GetRmgrDesc(i)->rm_name); } } @@ -535,7 +535,7 @@ static void XLogDumpDisplayRecord(XLogDumpConfig *config, XLogReaderState *record) { const char *id; - const RmgrDescData *desc = &RmgrDescTable[XLogRecGetRmid(record)]; + const RmgrDescData *desc = GetRmgrDesc(XLogRecGetRmid(record)); uint32 rec_len; uint32 fpi_len; RelFileNode rnode; @@ -720,7 +720,7 @@ XLogDumpDisplayStats(XLogDumpConfig *config, XLogDumpStats *stats) * calculate column totals. */ - for (ri = 0; ri < RM_NEXT_ID; ri++) + for (ri = 0; ri < RM_MAX_ID; ri++) { total_count += stats->rmgr_stats[ri].count; total_rec_len += stats->rmgr_stats[ri].rec_len; @@ -741,13 +741,18 @@ XLogDumpDisplayStats(XLogDumpConfig *config, XLogDumpStats *stats) "Type", "N", "(%)", "Record size", "(%)", "FPI size", "(%)", "Combined size", "(%)", "----", "-", "---", "-----------", "---", "--------", "---", "-------------", "---"); - for (ri = 0; ri < RM_NEXT_ID; ri++) + for (ri = 0; ri <= RM_MAX_ID; ri++) { uint64 count, rec_len, fpi_len, tot_len; - const RmgrDescData *desc = &RmgrDescTable[ri]; + const RmgrDescData *desc; + + if (!RMID_IS_VALID(ri)) + continue; + + desc = GetRmgrDesc(ri); if (!config->stats_per_record) { @@ -756,6 +761,9 @@ XLogDumpDisplayStats(XLogDumpConfig *config, XLogDumpStats *stats) fpi_len = stats->rmgr_stats[ri].fpi_len; tot_len = rec_len + fpi_len; + if (RMID_IS_CUSTOM(ri) && count == 0) + continue; + XLogDumpStatsRow(desc->rm_name, count, total_count, rec_len, total_rec_len, fpi_len, total_fpi_len, tot_len, total_len); @@ -1000,7 +1008,7 @@ main(int argc, char **argv) break; case 'r': { - int i; + int rmid; if (pg_strcasecmp(optarg, "list") == 0) { @@ -1008,20 +1016,42 @@ main(int argc, char **argv) exit(EXIT_SUCCESS); } - for (i = 0; i <= RM_MAX_ID; i++) + /* + * First look for the generated name of a custom rmgr, of + * the form "custom###". We accept this form, because the + * custom rmgr module is not loaded, so there's no way to + * know the real name. This convention should be + * consistent with that in rmgrdesc.c. + */ + if (sscanf(optarg, "custom%03d", &rmid) == 1) { - if (pg_strcasecmp(optarg, RmgrDescTable[i].rm_name) == 0) + if (!RMID_IS_CUSTOM(rmid)) { - config.filter_by_rmgr[i] = true; - config.filter_by_rmgr_enabled = true; - break; + pg_log_error("custom resource manager \"%s\" does not exist", + optarg); + goto bad_argument; } + config.filter_by_rmgr[rmid] = true; + config.filter_by_rmgr_enabled = true; } - if (i > RM_MAX_ID) + else { - pg_log_error("resource manager \"%s\" does not exist", - optarg); - goto bad_argument; + /* then look for builtin rmgrs */ + for (rmid = 0; rmid <= RM_MAX_BUILTIN_ID; rmid++) + { + if (pg_strcasecmp(optarg, GetRmgrDesc(rmid)->rm_name) == 0) + { + config.filter_by_rmgr[rmid] = true; + config.filter_by_rmgr_enabled = true; + break; + } + } + if (rmid > RM_MAX_BUILTIN_ID) + { + pg_log_error("resource manager \"%s\" does not exist", + optarg); + goto bad_argument; + } } } break; diff --git a/src/bin/pg_waldump/rmgrdesc.c b/src/bin/pg_waldump/rmgrdesc.c index 6a4ebd1310..d1f92a413c 100644 --- a/src/bin/pg_waldump/rmgrdesc.c +++ b/src/bin/pg_waldump/rmgrdesc.c @@ -35,6 +35,65 @@ #define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup,mask,decode) \ { name, desc, identify}, -const RmgrDescData RmgrDescTable[RM_MAX_ID + 1] = { +static const RmgrDescData RmgrDescTable[RM_N_BUILTIN_IDS] = { #include "access/rmgrlist.h" }; + +#define CUSTOM_NUMERIC_NAME_LEN sizeof("custom###") + +static char CustomNumericNames[RM_N_CUSTOM_IDS][CUSTOM_NUMERIC_NAME_LEN] = {0}; +static RmgrDescData CustomRmgrDesc[RM_N_CUSTOM_IDS] = {0}; +static bool CustomRmgrDescInitialized = false; + +/* + * No information on custom resource managers; just print the ID. + */ +static void +default_desc(StringInfo buf, XLogReaderState *record) +{ + appendStringInfo(buf, "rmid: %d", XLogRecGetRmid(record)); +} + +/* + * No information on custom resource managers; just return NULL and let the + * caller handle it. + */ +static const char * +default_identify(uint8 info) +{ + return NULL; +} + +/* + * We are unable to get the real name of a custom rmgr because the module is + * not loaded. Generate a table of rmgrs with numeric names of the form + * "custom###", where "###" is the 3-digit resource manager ID. + */ +static void +initialize_custom_rmgrs(void) +{ + for (int i = 0; i < RM_N_CUSTOM_IDS; i++) + { + snprintf(CustomNumericNames[i], CUSTOM_NUMERIC_NAME_LEN, + "custom%03d", i + RM_MIN_CUSTOM_ID); + CustomRmgrDesc[i].rm_name = CustomNumericNames[i]; + CustomRmgrDesc[i].rm_desc = default_desc; + CustomRmgrDesc[i].rm_identify = default_identify; + } + CustomRmgrDescInitialized = true; +} + +const RmgrDescData * +GetRmgrDesc(RmgrId rmid) +{ + Assert(RMID_IS_VALID(rmid)); + + if (RMID_IS_BUILTIN(rmid)) + return &RmgrDescTable[rmid]; + else + { + if (!CustomRmgrDescInitialized) + initialize_custom_rmgrs(); + return &CustomRmgrDesc[rmid - RM_MIN_CUSTOM_ID]; + } +} diff --git a/src/bin/pg_waldump/rmgrdesc.h b/src/bin/pg_waldump/rmgrdesc.h index 42f8483b48..f733cd467d 100644 --- a/src/bin/pg_waldump/rmgrdesc.h +++ b/src/bin/pg_waldump/rmgrdesc.h @@ -18,6 +18,6 @@ typedef struct RmgrDescData const char *(*rm_identify) (uint8 info); } RmgrDescData; -extern const RmgrDescData RmgrDescTable[]; +extern const RmgrDescData *GetRmgrDesc(RmgrId rmid); #endif /* RMGRDESC_H */ diff --git a/src/include/access/rmgr.h b/src/include/access/rmgr.h index d9b512630c..d9a96410d9 100644 --- a/src/include/access/rmgr.h +++ b/src/include/access/rmgr.h @@ -30,6 +30,23 @@ typedef enum RmgrIds #undef PG_RMGR -#define RM_MAX_ID (RM_NEXT_ID - 1) +#define RM_MAX_ID UINT8_MAX +#define RM_MAX_BUILTIN_ID (RM_NEXT_ID - 1) +#define RM_MIN_CUSTOM_ID 128 +#define RM_MAX_CUSTOM_ID UINT8_MAX +#define RM_N_IDS (UINT8_MAX + 1) +#define RM_N_BUILTIN_IDS (RM_MAX_BUILTIN_ID + 1) +#define RM_N_CUSTOM_IDS (RM_MAX_CUSTOM_ID - RM_MIN_CUSTOM_ID + 1) +#define RMID_IS_BUILTIN(rmid) ((rmid) <= RM_MAX_BUILTIN_ID) +#define RMID_IS_CUSTOM(rmid) ((rmid) >= RM_MIN_CUSTOM_ID && \ + (rmid) <= RM_MAX_CUSTOM_ID) +#define RMID_IS_VALID(rmid) (RMID_IS_BUILTIN((rmid)) || RMID_IS_CUSTOM((rmid))) + +/* + * RmgrId to use for extensions that require an RmgrId, but are still in + * development and have not reserved their own unique RmgrId yet. See: + * https://wiki.postgresql.org/wiki/CustomWALResourceManagers + */ +#define RM_EXPERIMENTAL_ID 128 #endif /* RMGR_H */ diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h index b7c375fed1..f69ea2355d 100644 --- a/src/include/access/xlog_internal.h +++ b/src/include/access/xlog_internal.h @@ -304,7 +304,8 @@ struct XLogRecordBuffer; * rm_mask takes as input a page modified by the resource manager and masks * out bits that shouldn't be flagged by wal_consistency_checking. * - * RmgrTable[] is indexed by RmgrId values (see rmgrlist.h). + * RmgrTable[] is indexed by RmgrId values (see rmgrlist.h). If rm_name is + * NULL, the corresponding RmgrTable entry is considered invalid. */ typedef struct RmgrData { @@ -319,7 +320,25 @@ typedef struct RmgrData struct XLogRecordBuffer *buf); } RmgrData; -extern const RmgrData RmgrTable[]; +extern RmgrData RmgrTable[]; +extern void RmgrStartup(void); +extern void RmgrCleanup(void); +extern void RmgrNotFound(RmgrId rmid); +extern void RegisterCustomRmgr(RmgrId rmid, RmgrData *rmgr); + +static inline bool +RmgrIdExists(RmgrId rmid) +{ + return RmgrTable[rmid].rm_name != NULL; +} + +static inline RmgrData +GetRmgr(RmgrId rmid) +{ + if (unlikely(!RmgrIdExists(rmid))) + RmgrNotFound(rmid); + return RmgrTable[rmid]; +} /* * Exported to support xlog switching from checkpointer diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index b6742b12c5..19bb3a79b4 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202204071 +#define CATALOG_VERSION_NO 202204072 #endif diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index e8f89a7b18..0f0f41b2f9 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -6356,6 +6356,13 @@ prorettype => 'text', proargtypes => '', prosrc => 'pg_get_wal_replay_pause_state' }, +{ oid => '8189', descr => 'get resource managers loaded in system', + proname => 'pg_get_wal_resource_managers', prorows => '50', proretset => 't', + provolatile => 'v', prorettype => 'record', proargtypes => '', + proallargtypes => '{int4,text,bool}', proargmodes => '{o,o,o}', + proargnames => '{rm_id, rm_name, rm_builtin}', + prosrc => 'pg_get_wal_resource_managers' }, + { oid => '2621', descr => 'reload configuration files', proname => 'pg_reload_conf', provolatile => 'v', prorettype => 'bool', proargtypes => '', prosrc => 'pg_reload_conf' }, diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 66c404c666..bcf2016421 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -465,6 +465,7 @@ extern void BaseInit(void); /* in utils/init/miscinit.c */ extern bool IgnoreSystemIndexes; extern PGDLLIMPORT bool process_shared_preload_libraries_in_progress; +extern bool process_shared_preload_libraries_done; extern char *session_preload_libraries_string; extern char *shared_preload_libraries_string; extern char *local_preload_libraries_string; diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index 3446334e90..74018ea27b 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -367,6 +367,7 @@ extern void ProcessConfigFile(GucContext context); extern char *convert_GUC_name_for_parameter_acl(const char *name); extern bool check_GUC_name_for_parameter_acl(const char *name); extern void InitializeGUCOptions(void); +extern void InitializeWalConsistencyChecking(void); extern bool SelectConfigFiles(const char *userDoption, const char *progname); extern void ResetAllOptions(void); extern void AtStart_GUC(void); From 3536b851adb275e2f49a80030111e84abc0736ba Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 23:24:00 -0700 Subject: [PATCH 417/772] Fix compilation with WAL_DEBUG. Broke with 5c279a6d350. But looks like it had been half-broken since 70e81861fad, because 'rmid' didn't refer to the current record's rmid anymore, but to rmid from "Initialize resource managers" - a constant. --- src/backend/access/transam/xlogrecovery.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 5539192167..79d38a837c 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -1634,8 +1634,8 @@ PerformWalRecovery(void) #ifdef WAL_DEBUG if (XLOG_DEBUG || - (rmid == RM_XACT_ID && trace_recovery_messages <= DEBUG2) || - (rmid != RM_XACT_ID && trace_recovery_messages <= DEBUG3)) + (record->xl_rmid == RM_XACT_ID && trace_recovery_messages <= DEBUG2) || + (record->xl_rmid != RM_XACT_ID && trace_recovery_messages <= DEBUG3)) { StringInfoData buf; From 81ae9e65887476b4c55aaad276a8010a459a41ce Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 23:35:56 -0700 Subject: [PATCH 418/772] pgstat: prevent fix pgstat_reinit_entry() from zeroing out lwlock. Zeroing out an lwlock in a normal build turns out to not trigger any alarms, if nobody can use the lwlock at that moment (as the case here). But with --disable-spinlocks --disable-atomics, the sema field needs to be initialized. We probably should make sure that this fails on more common configurations as well... Per buildfarm animal rorqual --- src/backend/utils/activity/pgstat_shmem.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c index a32740b2f6..b270c504ea 100644 --- a/src/backend/utils/activity/pgstat_shmem.c +++ b/src/backend/utils/activity/pgstat_shmem.c @@ -292,8 +292,8 @@ pgstat_reinit_entry(PgStat_Kind kind, PgStatShared_HashEntry *shhashent) /* reinitialize content */ Assert(shheader->magic == 0xdeadbeef); - memset(shheader, 0, pgstat_get_kind_info(shhashent->key.kind)->shared_size); - shheader->magic = 0xdeadbeef; + memset(pgstat_get_entry_data(kind, shheader), 0, + pgstat_get_entry_len(kind)); return shheader; } From 5e07d3d6bdbff998eb68c131ecd10c448b026e47 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 23:35:56 -0700 Subject: [PATCH 419/772] pgstat: fix small bug in pgstat_drop_relation(). Just after committing 5891c7a8ed8, a test running with debug_discard_caches=1 failed locally... pgstat_drop_relation() neither checked pgstat_should_count_relation() nor called pgstat_prep_relation_pending(). With debug_discard_caches=1 rel->pgstat_info wasn't set up, leading pg_stat_get_xact_tuples_inserted() spuriously still returning > 0 while in the transaction dropping the table. --- src/backend/utils/activity/pgstat_relation.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/activity/pgstat_relation.c b/src/backend/utils/activity/pgstat_relation.c index bec190c589..a846d9ffb6 100644 --- a/src/backend/utils/activity/pgstat_relation.c +++ b/src/backend/utils/activity/pgstat_relation.c @@ -180,18 +180,21 @@ void pgstat_drop_relation(Relation rel) { int nest_level = GetCurrentTransactionNestLevel(); - PgStat_TableStatus *pgstat_info = rel->pgstat_info; + PgStat_TableStatus *pgstat_info; pgstat_drop_transactional(PGSTAT_KIND_RELATION, rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId, RelationGetRelid(rel)); + if (!pgstat_should_count_relation(rel)) + return; + /* * Transactionally set counters to 0. That ensures that accesses to * pg_stat_xact_all_tables inside the transaction show 0. */ - if (pgstat_info && - pgstat_info->trans != NULL && + pgstat_info = rel->pgstat_info; + if (pgstat_info->trans && pgstat_info->trans->nest_level == nest_level) { save_truncdrop_counters(pgstat_info->trans, true); From 0f96965c658147d6d6bad096d2d4a2c9c665f4a9 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 6 Apr 2022 23:35:56 -0700 Subject: [PATCH 420/772] pgstat: add pg_stat_force_next_flush(), use it to simplify tests. In the stats collector days it was hard to write tests for the stats system, because fundamentally delivery of stats messages over UDP was not synchronous (nor guaranteed). Now we easily can force pending stats updates to be flushed synchronously. This moves stats.sql into a parallel group, there isn't a reason for it to run in isolation anymore. And it may shake out some bugs. Bumps catversion. Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- contrib/test_decoding/expected/stats.out | 71 ++----------- contrib/test_decoding/sql/stats.sql | 59 ++--------- src/backend/utils/activity/pgstat.c | 23 +++++ src/backend/utils/adt/pgstatfuncs.c | 10 ++ src/include/catalog/pg_proc.dat | 5 + src/include/pgstat.h | 1 + src/test/regress/expected/brin.out | 22 ++++ src/test/regress/expected/stats.out | 123 +---------------------- src/test/regress/parallel_schedule | 5 +- src/test/regress/sql/brin.sql | 19 ++++ src/test/regress/sql/stats.sql | 119 +--------------------- 11 files changed, 103 insertions(+), 354 deletions(-) diff --git a/contrib/test_decoding/expected/stats.out b/contrib/test_decoding/expected/stats.out index 206c0a126e..d9aeaa4426 100644 --- a/contrib/test_decoding/expected/stats.out +++ b/contrib/test_decoding/expected/stats.out @@ -7,50 +7,6 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_stats', ' (1 row) CREATE TABLE stats_test(data text); --- function to wait for counters to advance -CREATE FUNCTION wait_for_decode_stats(check_reset bool, check_spill_txns bool) RETURNS void AS $$ -DECLARE - start_time timestamptz := clock_timestamp(); - updated bool; -BEGIN - -- we don't want to wait forever; loop will exit after 30 seconds - FOR i IN 1 .. 300 LOOP - - IF check_spill_txns THEN - - -- check to see if all updates have been reset/updated - SELECT CASE WHEN check_reset THEN (spill_txns = 0) - ELSE (spill_txns > 0) - END - INTO updated - FROM pg_stat_replication_slots WHERE slot_name='regression_slot_stats'; - - ELSE - - -- check to see if all updates have been reset/updated - SELECT CASE WHEN check_reset THEN (total_txns = 0) - ELSE (total_txns > 0) - END - INTO updated - FROM pg_stat_replication_slots WHERE slot_name='regression_slot_stats'; - - END IF; - - exit WHEN updated; - - -- wait a little - perform pg_sleep_for('100 milliseconds'); - - -- reset stats snapshot so we can test again - perform pg_stat_clear_snapshot(); - - END LOOP; - - -- report time waited in postmaster log (where it won't change test output) - RAISE LOG 'wait_for_decode_stats delayed % seconds', - extract(epoch from clock_timestamp() - start_time); -END -$$ LANGUAGE plpgsql; -- non-spilled xact SET logical_decoding_work_mem to '64MB'; INSERT INTO stats_test values(1); @@ -60,9 +16,9 @@ SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot_stats', NULL, 3 (1 row) -SELECT wait_for_decode_stats(false, false); - wait_for_decode_stats ------------------------ +SELECT pg_stat_force_next_flush(); + pg_stat_force_next_flush +-------------------------- (1 row) @@ -73,19 +29,13 @@ SELECT slot_name, spill_txns = 0 AS spill_txns, spill_count = 0 AS spill_count, (1 row) RESET logical_decoding_work_mem; --- reset the slot stats, and wait for stats collector's total txn to reset +-- reset the slot stats SELECT pg_stat_reset_replication_slot('regression_slot_stats'); pg_stat_reset_replication_slot -------------------------------- (1 row) -SELECT wait_for_decode_stats(true, false); - wait_for_decode_stats ------------------------ - -(1 row) - SELECT slot_name, spill_txns, spill_count, total_txns, total_bytes FROM pg_stat_replication_slots; slot_name | spill_txns | spill_count | total_txns | total_bytes -----------------------+------------+-------------+------------+------------- @@ -102,12 +52,12 @@ SELECT count(*) FROM pg_logical_slot_peek_changes('regression_slot_stats', NULL, 5002 (1 row) --- Check stats, wait for the stats collector to update. We can't test the --- exact stats count as that can vary if any background transaction (say by --- autovacuum) happens in parallel to the main transaction. -SELECT wait_for_decode_stats(false, true); - wait_for_decode_stats ------------------------ +-- Check stats. We can't test the exact stats count as that can vary if any +-- background transaction (say by autovacuum) happens in parallel to the main +-- transaction. +SELECT pg_stat_force_next_flush(); + pg_stat_force_next_flush +-------------------------- (1 row) @@ -133,7 +83,6 @@ SELECT slot_name FROM pg_stat_replication_slots; (1 row) COMMIT; -DROP FUNCTION wait_for_decode_stats(bool, bool); DROP TABLE stats_test; SELECT pg_drop_replication_slot('regression_slot_stats'); pg_drop_replication_slot diff --git a/contrib/test_decoding/sql/stats.sql b/contrib/test_decoding/sql/stats.sql index 67462ca27f..6592c36a4d 100644 --- a/contrib/test_decoding/sql/stats.sql +++ b/contrib/test_decoding/sql/stats.sql @@ -5,62 +5,16 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_stats', ' CREATE TABLE stats_test(data text); --- function to wait for counters to advance -CREATE FUNCTION wait_for_decode_stats(check_reset bool, check_spill_txns bool) RETURNS void AS $$ -DECLARE - start_time timestamptz := clock_timestamp(); - updated bool; -BEGIN - -- we don't want to wait forever; loop will exit after 30 seconds - FOR i IN 1 .. 300 LOOP - - IF check_spill_txns THEN - - -- check to see if all updates have been reset/updated - SELECT CASE WHEN check_reset THEN (spill_txns = 0) - ELSE (spill_txns > 0) - END - INTO updated - FROM pg_stat_replication_slots WHERE slot_name='regression_slot_stats'; - - ELSE - - -- check to see if all updates have been reset/updated - SELECT CASE WHEN check_reset THEN (total_txns = 0) - ELSE (total_txns > 0) - END - INTO updated - FROM pg_stat_replication_slots WHERE slot_name='regression_slot_stats'; - - END IF; - - exit WHEN updated; - - -- wait a little - perform pg_sleep_for('100 milliseconds'); - - -- reset stats snapshot so we can test again - perform pg_stat_clear_snapshot(); - - END LOOP; - - -- report time waited in postmaster log (where it won't change test output) - RAISE LOG 'wait_for_decode_stats delayed % seconds', - extract(epoch from clock_timestamp() - start_time); -END -$$ LANGUAGE plpgsql; - -- non-spilled xact SET logical_decoding_work_mem to '64MB'; INSERT INTO stats_test values(1); SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot_stats', NULL, NULL, 'skip-empty-xacts', '1'); -SELECT wait_for_decode_stats(false, false); +SELECT pg_stat_force_next_flush(); SELECT slot_name, spill_txns = 0 AS spill_txns, spill_count = 0 AS spill_count, total_txns > 0 AS total_txns, total_bytes > 0 AS total_bytes FROM pg_stat_replication_slots; RESET logical_decoding_work_mem; --- reset the slot stats, and wait for stats collector's total txn to reset +-- reset the slot stats SELECT pg_stat_reset_replication_slot('regression_slot_stats'); -SELECT wait_for_decode_stats(true, false); SELECT slot_name, spill_txns, spill_count, total_txns, total_bytes FROM pg_stat_replication_slots; -- spilling the xact @@ -69,10 +23,10 @@ INSERT INTO stats_test SELECT 'serialize-topbig--1:'||g.i FROM generate_series(1 COMMIT; SELECT count(*) FROM pg_logical_slot_peek_changes('regression_slot_stats', NULL, NULL, 'skip-empty-xacts', '1'); --- Check stats, wait for the stats collector to update. We can't test the --- exact stats count as that can vary if any background transaction (say by --- autovacuum) happens in parallel to the main transaction. -SELECT wait_for_decode_stats(false, true); +-- Check stats. We can't test the exact stats count as that can vary if any +-- background transaction (say by autovacuum) happens in parallel to the main +-- transaction. +SELECT pg_stat_force_next_flush(); SELECT slot_name, spill_txns > 0 AS spill_txns, spill_count > 0 AS spill_count FROM pg_stat_replication_slots; -- Ensure stats can be repeatedly accessed using the same stats snapshot. See @@ -82,6 +36,5 @@ SELECT slot_name FROM pg_stat_replication_slots; SELECT slot_name FROM pg_stat_replication_slots; COMMIT; -DROP FUNCTION wait_for_decode_stats(bool, bool); DROP TABLE stats_test; SELECT pg_drop_replication_slot('regression_slot_stats'); diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index db30c72073..111869b211 100644 --- a/src/backend/utils/activity/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -219,6 +219,12 @@ static MemoryContext pgStatPendingContext = NULL; static dlist_head pgStatPending = DLIST_STATIC_INIT(pgStatPending); +/* + * Force the next stats flush to happen regardless of + * PGSTAT_MIN_INTERVAL. Useful in test scripts. + */ +static bool pgStatForceNextFlush = false; + /* * For assertions that check pgstat is not used before initialization / after * shutdown. @@ -560,6 +566,13 @@ pgstat_report_stat(bool force) pgstat_assert_is_up(); Assert(!IsTransactionBlock()); + /* "absorb" the forced flush even if there's nothing to flush */ + if (pgStatForceNextFlush) + { + force = true; + pgStatForceNextFlush = false; + } + /* Don't expend a clock check if nothing to do */ if (dlist_is_empty(&pgStatPending) && !have_slrustats && @@ -637,6 +650,16 @@ pgstat_report_stat(bool force) return 0; } +/* + * Force locally pending stats to be flushed during the next + * pgstat_report_stat() call. This is useful for writing tests. + */ +void +pgstat_force_next_flush(void) +{ + pgStatForceNextFlush = true; +} + /* * Only for use by pgstat_reset_counters() */ diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 248d318f86..5f1815727d 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -2067,6 +2067,16 @@ pg_stat_clear_snapshot(PG_FUNCTION_ARGS) } +/* Force statistics to be reported at the next occasion */ +Datum +pg_stat_force_next_flush(PG_FUNCTION_ARGS) +{ + pgstat_force_next_flush(); + + PG_RETURN_VOID(); +} + + /* Reset all counters for the current database */ Datum pg_stat_reset(PG_FUNCTION_ARGS) diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 0f0f41b2f9..2b4438bc3d 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -5744,6 +5744,11 @@ proname => 'pg_stat_clear_snapshot', proisstrict => 'f', provolatile => 'v', proparallel => 'r', prorettype => 'void', proargtypes => '', prosrc => 'pg_stat_clear_snapshot' }, +{ oid => '2137', + descr => 'statistics: force stats to be flushed after the next commit', + proname => 'pg_stat_force_next_flush', proisstrict => 'f', provolatile => 'v', + proparallel => 'r', prorettype => 'void', proargtypes => '', + prosrc => 'pg_stat_force_next_flush' }, { oid => '2274', descr => 'statistics: reset collected statistics for current database', proname => 'pg_stat_reset', proisstrict => 'f', provolatile => 'v', diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 8ac3860e8d..a0b853f4a6 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -414,6 +414,7 @@ extern void pgstat_initialize(void); /* Functions called from backends */ extern long pgstat_report_stat(bool force); +extern void pgstat_force_next_flush(void); extern void pgstat_reset_counters(void); extern void pgstat_reset(PgStat_Kind kind, Oid dboid, Oid objectid); diff --git a/src/test/regress/expected/brin.out b/src/test/regress/expected/brin.out index 2d03d8e134..ed7879f583 100644 --- a/src/test/regress/expected/brin.out +++ b/src/test/regress/expected/brin.out @@ -603,3 +603,25 @@ SELECT COUNT(*) FROM brin_hot_2 WHERE a = 2 AND b = 100; 1 (1 row) +-- test BRIN index doesn't block HOT update +CREATE TABLE brin_hot ( + id integer PRIMARY KEY, + val integer NOT NULL +) WITH (autovacuum_enabled = off, fillfactor = 70); +INSERT INTO brin_hot SELECT *, 0 FROM generate_series(1, 235); +CREATE INDEX val_brin ON brin_hot using brin(val); +UPDATE brin_hot SET val = -3 WHERE id = 42; +-- ensure pending stats are flushed +SELECT pg_stat_force_next_flush(); + pg_stat_force_next_flush +-------------------------- + +(1 row) + +SELECT pg_stat_get_tuples_hot_updated('brin_hot'::regclass::oid); + pg_stat_get_tuples_hot_updated +-------------------------------- + 1 +(1 row) + +DROP TABLE brin_hot; diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index 64e2ff6b29..aa05b3b78a 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -28,63 +28,6 @@ SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, pg_catalog.pg_statio_user_tables AS b WHERE t.relname='tenk2' AND b.relname='tenk2'; COMMIT; --- function to wait for counters to advance -create function wait_for_stats() returns void as $$ -declare - start_time timestamptz := clock_timestamp(); - updated1 bool; - updated2 bool; - updated3 bool; - updated4 bool; -begin - SET LOCAL stats_fetch_consistency = snapshot; - - -- We don't want to wait forever. No timeout suffices if the OS drops our - -- stats traffic because an earlier test file left a full UDP buffer. - -- Hence, don't use PG_TEST_TIMEOUT_DEFAULT, which may be large for - -- can't-happen timeouts. Exit after 30 seconds. - for i in 1 .. 300 loop - - -- With parallel query, the seqscan and indexscan on tenk2 might be done - -- in parallel worker processes, which will send their stats counters - -- asynchronously to what our own session does. So we must check for - -- those counts to be registered separately from the update counts. - - -- check to see if seqscan has been sensed - SELECT (st.seq_scan >= pr.seq_scan + 1) INTO updated1 - FROM pg_stat_user_tables AS st, pg_class AS cl, prevstats AS pr - WHERE st.relname='tenk2' AND cl.relname='tenk2'; - - -- check to see if indexscan has been sensed - SELECT (st.idx_scan >= pr.idx_scan + 1) INTO updated2 - FROM pg_stat_user_tables AS st, pg_class AS cl, prevstats AS pr - WHERE st.relname='tenk2' AND cl.relname='tenk2'; - - -- check to see if all updates have been sensed - SELECT (n_tup_ins > 0) INTO updated3 - FROM pg_stat_user_tables WHERE relname='trunc_stats_test4'; - - -- We must also check explicitly that pg_stat_get_snapshot_timestamp has - -- advanced, because that comes from the global stats file which might - -- be older than the per-DB stats file we got the other values from. - SELECT (pr.snap_ts < pg_stat_get_snapshot_timestamp()) INTO updated4 - FROM prevstats AS pr; - - exit when updated1 and updated2 and updated3 and updated4; - - -- wait a little - perform pg_sleep_for('100 milliseconds'); - - -- reset stats snapshot so we can test again - perform pg_stat_clear_snapshot(); - - end loop; - - -- report time waited in postmaster log (where it won't change test output) - raise log 'wait_for_stats delayed % seconds', - extract(epoch from clock_timestamp() - start_time); -end -$$ language plpgsql; -- test effects of TRUNCATE on n_live_tup/n_dead_tup counters CREATE TABLE trunc_stats_test(id serial); CREATE TABLE trunc_stats_test1(id serial, stuff text); @@ -153,17 +96,10 @@ SELECT count(*) FROM tenk2 WHERE unique1 = 1; (1 row) RESET enable_bitmapscan; --- We can't just call wait_for_stats() at this point, because we only --- transmit stats when the session goes idle, and we probably didn't --- transmit the last couple of counts yet thanks to the rate-limiting logic --- in pgstat_report_stat(). But instead of waiting for the rate limiter's --- timeout to elapse, let's just start a new session. The old one will --- then send its stats before dying. -\c - --- wait for stats collector to update -SELECT wait_for_stats(); - wait_for_stats ----------------- +-- ensure pending stats are flushed +SELECT pg_stat_force_next_flush(); + pg_stat_force_next_flush +-------------------------- (1 row) @@ -212,57 +148,6 @@ FROM prevstats AS pr; COMMIT; DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4; DROP TABLE prevstats; --- test BRIN index doesn't block HOT update - we include this test here, as it --- relies on statistics collector and so it may occasionally fail, especially --- on slower systems -CREATE TABLE brin_hot ( - id integer PRIMARY KEY, - val integer NOT NULL -) WITH (autovacuum_enabled = off, fillfactor = 70); -INSERT INTO brin_hot SELECT *, 0 FROM generate_series(1, 235); -CREATE INDEX val_brin ON brin_hot using brin(val); -CREATE FUNCTION wait_for_hot_stats() RETURNS void AS $$ -DECLARE - start_time timestamptz := clock_timestamp(); - updated bool; -BEGIN - -- we don't want to wait forever; loop will exit after 30 seconds - FOR i IN 1 .. 300 LOOP - SELECT (pg_stat_get_tuples_hot_updated('brin_hot'::regclass::oid) > 0) INTO updated; - EXIT WHEN updated; - - -- wait a little - PERFORM pg_sleep_for('100 milliseconds'); - -- reset stats snapshot so we can test again - PERFORM pg_stat_clear_snapshot(); - END LOOP; - -- report time waited in postmaster log (where it won't change test output) - RAISE log 'wait_for_hot_stats delayed % seconds', - EXTRACT(epoch FROM clock_timestamp() - start_time); -END -$$ LANGUAGE plpgsql; -UPDATE brin_hot SET val = -3 WHERE id = 42; --- We can't just call wait_for_hot_stats() at this point, because we only --- transmit stats when the session goes idle, and we probably didn't --- transmit the last couple of counts yet thanks to the rate-limiting logic --- in pgstat_report_stat(). But instead of waiting for the rate limiter's --- timeout to elapse, let's just start a new session. The old one will --- then send its stats before dying. -\c - -SELECT wait_for_hot_stats(); - wait_for_hot_stats --------------------- - -(1 row) - -SELECT pg_stat_get_tuples_hot_updated('brin_hot'::regclass::oid); - pg_stat_get_tuples_hot_updated --------------------------------- - 1 -(1 row) - -DROP TABLE brin_hot; -DROP FUNCTION wait_for_hot_stats(); -- ensure that stats accessors handle NULL input correctly SELECT pg_stat_get_replication_slot(NULL); pg_stat_get_replication_slot diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 5030d19c03..1087b2c14f 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -124,7 +124,7 @@ test: plancache limit plpgsql copy2 temp domain rangefuncs prepare conversion tr # ---------- # Another group of parallel tests # ---------- -test: partition_join partition_prune reloptions hash_part indexing partition_aggregate partition_info tuplesort explain compression memoize +test: partition_join partition_prune reloptions hash_part indexing partition_aggregate partition_info tuplesort explain compression memoize stats # event_trigger cannot run concurrently with any test that runs DDL # oidjoins is read-only, though, and should run late for best coverage @@ -132,6 +132,3 @@ test: event_trigger oidjoins # this test also uses event triggers, so likewise run it by itself test: fast_default - -# run stats by itself because its delay may be insufficient under heavy load -test: stats diff --git a/src/test/regress/sql/brin.sql b/src/test/regress/sql/brin.sql index e12f3a0df9..920e053249 100644 --- a/src/test/regress/sql/brin.sql +++ b/src/test/regress/sql/brin.sql @@ -526,3 +526,22 @@ SET enable_seqscan = off; EXPLAIN (COSTS OFF) SELECT * FROM brin_hot_2 WHERE a = 2 AND b = 100; SELECT COUNT(*) FROM brin_hot_2 WHERE a = 2 AND b = 100; + + +-- test BRIN index doesn't block HOT update +CREATE TABLE brin_hot ( + id integer PRIMARY KEY, + val integer NOT NULL +) WITH (autovacuum_enabled = off, fillfactor = 70); + +INSERT INTO brin_hot SELECT *, 0 FROM generate_series(1, 235); +CREATE INDEX val_brin ON brin_hot using brin(val); + +UPDATE brin_hot SET val = -3 WHERE id = 42; + +-- ensure pending stats are flushed +SELECT pg_stat_force_next_flush(); + +SELECT pg_stat_get_tuples_hot_updated('brin_hot'::regclass::oid); + +DROP TABLE brin_hot; diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index 85a253bcd4..7c77c33121 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -27,64 +27,6 @@ SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, WHERE t.relname='tenk2' AND b.relname='tenk2'; COMMIT; --- function to wait for counters to advance -create function wait_for_stats() returns void as $$ -declare - start_time timestamptz := clock_timestamp(); - updated1 bool; - updated2 bool; - updated3 bool; - updated4 bool; -begin - SET LOCAL stats_fetch_consistency = snapshot; - - -- We don't want to wait forever. No timeout suffices if the OS drops our - -- stats traffic because an earlier test file left a full UDP buffer. - -- Hence, don't use PG_TEST_TIMEOUT_DEFAULT, which may be large for - -- can't-happen timeouts. Exit after 30 seconds. - for i in 1 .. 300 loop - - -- With parallel query, the seqscan and indexscan on tenk2 might be done - -- in parallel worker processes, which will send their stats counters - -- asynchronously to what our own session does. So we must check for - -- those counts to be registered separately from the update counts. - - -- check to see if seqscan has been sensed - SELECT (st.seq_scan >= pr.seq_scan + 1) INTO updated1 - FROM pg_stat_user_tables AS st, pg_class AS cl, prevstats AS pr - WHERE st.relname='tenk2' AND cl.relname='tenk2'; - - -- check to see if indexscan has been sensed - SELECT (st.idx_scan >= pr.idx_scan + 1) INTO updated2 - FROM pg_stat_user_tables AS st, pg_class AS cl, prevstats AS pr - WHERE st.relname='tenk2' AND cl.relname='tenk2'; - - -- check to see if all updates have been sensed - SELECT (n_tup_ins > 0) INTO updated3 - FROM pg_stat_user_tables WHERE relname='trunc_stats_test4'; - - -- We must also check explicitly that pg_stat_get_snapshot_timestamp has - -- advanced, because that comes from the global stats file which might - -- be older than the per-DB stats file we got the other values from. - SELECT (pr.snap_ts < pg_stat_get_snapshot_timestamp()) INTO updated4 - FROM prevstats AS pr; - - exit when updated1 and updated2 and updated3 and updated4; - - -- wait a little - perform pg_sleep_for('100 milliseconds'); - - -- reset stats snapshot so we can test again - perform pg_stat_clear_snapshot(); - - end loop; - - -- report time waited in postmaster log (where it won't change test output) - raise log 'wait_for_stats delayed % seconds', - extract(epoch from clock_timestamp() - start_time); -end -$$ language plpgsql; - -- test effects of TRUNCATE on n_live_tup/n_dead_tup counters CREATE TABLE trunc_stats_test(id serial); CREATE TABLE trunc_stats_test1(id serial, stuff text); @@ -151,16 +93,8 @@ SET enable_bitmapscan TO off; SELECT count(*) FROM tenk2 WHERE unique1 = 1; RESET enable_bitmapscan; --- We can't just call wait_for_stats() at this point, because we only --- transmit stats when the session goes idle, and we probably didn't --- transmit the last couple of counts yet thanks to the rate-limiting logic --- in pgstat_report_stat(). But instead of waiting for the rate limiter's --- timeout to elapse, let's just start a new session. The old one will --- then send its stats before dying. -\c - - --- wait for stats collector to update -SELECT wait_for_stats(); +-- ensure pending stats are flushed +SELECT pg_stat_force_next_flush(); -- check effects BEGIN; @@ -190,55 +124,6 @@ COMMIT; DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4; DROP TABLE prevstats; --- test BRIN index doesn't block HOT update - we include this test here, as it --- relies on statistics collector and so it may occasionally fail, especially --- on slower systems -CREATE TABLE brin_hot ( - id integer PRIMARY KEY, - val integer NOT NULL -) WITH (autovacuum_enabled = off, fillfactor = 70); - -INSERT INTO brin_hot SELECT *, 0 FROM generate_series(1, 235); -CREATE INDEX val_brin ON brin_hot using brin(val); - -CREATE FUNCTION wait_for_hot_stats() RETURNS void AS $$ -DECLARE - start_time timestamptz := clock_timestamp(); - updated bool; -BEGIN - -- we don't want to wait forever; loop will exit after 30 seconds - FOR i IN 1 .. 300 LOOP - SELECT (pg_stat_get_tuples_hot_updated('brin_hot'::regclass::oid) > 0) INTO updated; - EXIT WHEN updated; - - -- wait a little - PERFORM pg_sleep_for('100 milliseconds'); - -- reset stats snapshot so we can test again - PERFORM pg_stat_clear_snapshot(); - END LOOP; - -- report time waited in postmaster log (where it won't change test output) - RAISE log 'wait_for_hot_stats delayed % seconds', - EXTRACT(epoch FROM clock_timestamp() - start_time); -END -$$ LANGUAGE plpgsql; - -UPDATE brin_hot SET val = -3 WHERE id = 42; - --- We can't just call wait_for_hot_stats() at this point, because we only --- transmit stats when the session goes idle, and we probably didn't --- transmit the last couple of counts yet thanks to the rate-limiting logic --- in pgstat_report_stat(). But instead of waiting for the rate limiter's --- timeout to elapse, let's just start a new session. The old one will --- then send its stats before dying. -\c - - -SELECT wait_for_hot_stats(); -SELECT pg_stat_get_tuples_hot_updated('brin_hot'::regclass::oid); - -DROP TABLE brin_hot; -DROP FUNCTION wait_for_hot_stats(); - - -- ensure that stats accessors handle NULL input correctly SELECT pg_stat_get_replication_slot(NULL); SELECT pg_stat_get_subscription_stats(NULL); From ad401664b8012cafb64e8fce33fe40356c5bc686 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 7 Apr 2022 00:03:58 -0700 Subject: [PATCH 421/772] pgstat: add pg_stat_have_stats() test helper. Will be used by tests committed subsequently. Bumps catversion (this time for real, the one in 0f96965c658 got lost when rebasing over 5c279a6d350). Author: Melanie Plageman Discussion: https://postgr.es/m/CAAKRu_aNxL1WegCa45r=VAViCLnpOU7uNC7bTtGw+=QAPyYivw@mail.gmail.com --- src/backend/catalog/system_functions.sql | 2 ++ src/backend/utils/activity/pgstat.c | 10 ++++++++++ src/backend/utils/adt/pgstatfuncs.c | 18 ++++++++++++++++++ src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.dat | 6 ++++++ src/include/pgstat.h | 2 ++ 6 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/backend/catalog/system_functions.sql b/src/backend/catalog/system_functions.sql index 6ae4388d3f..73da687d5d 100644 --- a/src/backend/catalog/system_functions.sql +++ b/src/backend/catalog/system_functions.sql @@ -637,6 +637,8 @@ REVOKE EXECUTE ON FUNCTION pg_stat_reset_single_function_counters(oid) FROM publ REVOKE EXECUTE ON FUNCTION pg_stat_reset_replication_slot(text) FROM public; +REVOKE EXECUTE ON FUNCTION pg_stat_have_stats(text, oid, oid) FROM public; + REVOKE EXECUTE ON FUNCTION pg_stat_reset_subscription_stats(oid) FROM public; REVOKE EXECUTE ON FUNCTION lo_import(text) FROM public; diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index 111869b211..7df3fda648 100644 --- a/src/backend/utils/activity/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -872,6 +872,16 @@ pgstat_get_stat_snapshot_timestamp(bool *have_snapshot) return 0; } +bool +pgstat_have_entry(PgStat_Kind kind, Oid dboid, Oid objoid) +{ + /* fixed-numbered stats always exist */ + if (pgstat_get_kind_info(kind)->fixed_amount) + return true; + + return pgstat_get_entry_ref(kind, dboid, objoid, false, NULL) != NULL; +} + /* * Ensure snapshot for fixed-numbered 'kind' exists. * diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 5f1815727d..2bf8ab8f98 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -2394,3 +2394,21 @@ pg_stat_get_subscription_stats(PG_FUNCTION_ARGS) /* Returns the record as Datum */ PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls))); } + +/* + * Checks for presence of stats for object with provided kind, database oid, + * object oid. + * + * This is useful for tests, but not really anything else. Therefore not + * documented. + */ +Datum +pg_stat_have_stats(PG_FUNCTION_ARGS) +{ + char *stats_type = text_to_cstring(PG_GETARG_TEXT_P(0)); + Oid dboid = PG_GETARG_OID(1); + Oid objoid = PG_GETARG_OID(2); + PgStat_Kind kind = pgstat_get_kind_from_str(stats_type); + + PG_RETURN_BOOL(pgstat_have_entry(kind, dboid, objoid)); +} diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 19bb3a79b4..e133113543 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202204072 +#define CATALOG_VERSION_NO 202204073 #endif diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 2b4438bc3d..776e31f3b5 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -5376,6 +5376,12 @@ proargmodes => '{i,o,o,o,o,o,o,o,o,o,o}', proargnames => '{slot_name,slot_name,spill_txns,spill_count,spill_bytes,stream_txns,stream_count,stream_bytes,total_txns,total_bytes,stats_reset}', prosrc => 'pg_stat_get_replication_slot' }, + +{ oid => '8384', descr => 'statistics: check if a stats object exists', + proname => 'pg_stat_have_stats', provolatile => 'v', proparallel => 'r', + prorettype => 'bool', proargtypes => 'text oid oid', + prosrc => 'pg_stat_have_stats' }, + { oid => '8523', descr => 'statistics: information about subscription stats', proname => 'pg_stat_get_subscription_stats', provolatile => 's', proparallel => 'r', diff --git a/src/include/pgstat.h b/src/include/pgstat.h index a0b853f4a6..88c87a0cc5 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -426,6 +426,8 @@ extern TimestampTz pgstat_get_stat_snapshot_timestamp(bool *have_snapshot); /* helpers */ extern PgStat_Kind pgstat_get_kind_from_str(char *kind_str); +extern bool pgstat_have_entry(PgStat_Kind kind, Oid dboid, Oid objoid); + /* * Functions in pgstat_archiver.c From e349c95d3e91754c8c3afc0587d52d44a479c8d2 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 7 Apr 2022 00:03:58 -0700 Subject: [PATCH 422/772] pgstat: add tests for transaction behaviour, 2PC, function stats. Author: Andres Freund Author: Melanie Plageman Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/test/isolation/expected/stats.out | 3737 +++++++++++++++++++++++++ src/test/isolation/isolation_schedule | 1 + src/test/isolation/specs/stats.spec | 753 +++++ src/test/regress/expected/stats.out | 471 ++++ src/test/regress/sql/stats.sql | 189 ++ 5 files changed, 5151 insertions(+) create mode 100644 src/test/isolation/expected/stats.out create mode 100644 src/test/isolation/specs/stats.spec diff --git a/src/test/isolation/expected/stats.out b/src/test/isolation/expected/stats.out new file mode 100644 index 0000000000..7628a5f5da --- /dev/null +++ b/src/test/isolation/expected/stats.out @@ -0,0 +1,3737 @@ +Parsed test spec with 2 sessions + +starting permutation: s1_track_funcs_none s1_func_stats s1_func_call s1_func_call s1_ff s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_none: SET track_functions = 'none'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_track_funcs_all s1_func_stats s1_func_call s1_func_call s1_ff s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats s1_func_call s2_func_call s1_func_call s2_func_call s2_func_call s1_ff s2_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats s1_func_call s1_ff s2_func_call s2_func_call s2_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 3|t |t +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 3|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats s1_begin s1_func_call s1_func_call s1_commit s1_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_begin: BEGIN; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_commit: COMMIT; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats s1_begin s1_func_call s2_func_call s1_func_drop s2_func_call s2_ff s2_func_stats s1_commit s1_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_begin: BEGIN; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + +step s1_commit: COMMIT; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats s1_begin s1_func_call s2_func_call s1_func_drop s2_func_call s2_ff s2_func_stats s1_rollback s1_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_begin: BEGIN; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + +step s1_rollback: ROLLBACK; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 3|t |t +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 3|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s2_func_call s2_ff s2_begin s2_func_call s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_begin: BEGIN; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_commit: COMMIT; +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s2_begin s2_func_call s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s2_begin: BEGIN; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_commit: COMMIT; +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_all s1_func_call s2_begin s2_func_call s1_func_drop s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_disable_debug_discard: SET debug_discard_caches = 0; +step s2_disable_debug_discard: SET debug_discard_caches = 0; +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_begin: BEGIN; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_commit: COMMIT; +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_none s1_func_call s2_begin s2_func_call s1_ff s1_func_stats s1_func_drop s2_track_funcs_none s1_func_stats s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_disable_debug_discard: SET debug_discard_caches = 0; +step s2_disable_debug_discard: SET debug_discard_caches = 0; +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_none: SET track_functions = 'none'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_begin: BEGIN; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_track_funcs_none: SET track_functions = 'none'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_commit: COMMIT; +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_none s1_func_call s2_begin s2_func_call s1_ff s1_func_stats s1_func_drop s2_track_funcs_all s1_func_stats s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_disable_debug_discard: SET debug_discard_caches = 0; +step s2_disable_debug_discard: SET debug_discard_caches = 0; +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_none: SET track_functions = 'none'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_begin: BEGIN; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_call: SELECT test_stat_func() +ERROR: function call to dropped function +step s2_commit: COMMIT; +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_call s2_func_call s2_func_call2 s1_ff s2_ff s1_func_stats s2_func_call s2_func_call2 s2_ff s1_func_stats s1_func_stats2 s1_func_stats s1_func_stats_reset s1_func_stats s1_func_stats2 s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call2: SELECT test_stat_func2() +test_stat_func2 +--------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call2: SELECT test_stat_func2() +test_stat_func2 +--------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 3|t |t +(1 row) + +step s1_func_stats2: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func2' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +---------------+--------------------------+----------------+--------------- +test_stat_func2| 2|t |t +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 3|t |t +(1 row) + +step s1_func_stats_reset: SELECT pg_stat_reset_single_function_counters('test_stat_func'::regproc); +pg_stat_reset_single_function_counters +-------------------------------------- + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 0|f |f +(1 row) + +step s1_func_stats2: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func2' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +---------------+--------------------------+----------------+--------------- +test_stat_func2| 2|t |t +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 0|f |f +(1 row) + + +starting permutation: s1_func_stats_nonexistent s1_func_stats_reset_nonexistent s1_func_stats_nonexistent +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + +step s1_func_stats_reset_nonexistent: SELECT pg_stat_reset_single_function_counters(12000); +pg_stat_reset_single_function_counters +-------------------------------------- + +(1 row) + +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_call s2_func_call s2_func_call2 s1_ff s2_ff s1_func_stats s1_func_stats2 s1_func_stats s1_reset s1_func_stats s1_func_stats2 s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call2: SELECT test_stat_func2() +test_stat_func2 +--------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + +step s1_func_stats2: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func2' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +---------------+--------------------------+----------------+--------------- +test_stat_func2| 1|t |t +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + +step s1_reset: SELECT pg_stat_reset(); +pg_stat_reset +------------- + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 0|f |f +(1 row) + +step s1_func_stats2: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func2' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +---------------+--------------------------+----------------+--------------- +test_stat_func2| 0|f |f +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 0|f |f +(1 row) + + +starting permutation: s1_track_funcs_all s1_fetch_consistency_none s1_func_call s1_ff s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s1_fetch_consistency_none: SET stats_fetch_consistency = 'none'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s1_fetch_consistency_cache s1_func_call s1_ff s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s1_fetch_consistency_cache: SET stats_fetch_consistency = 'cache'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s1_fetch_consistency_snapshot s1_func_call s1_ff s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_fetch_consistency_none s2_func_call s2_ff s1_begin s1_func_stats s2_func_call s2_ff s1_func_stats s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_fetch_consistency_none: SET stats_fetch_consistency = 'none'; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_begin: BEGIN; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_fetch_consistency_cache s2_func_call s2_func_call2 s2_ff s1_begin s1_func_stats s2_func_call s2_func_call2 s2_ff s1_func_stats s1_func_stats2 s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_fetch_consistency_cache: SET stats_fetch_consistency = 'cache'; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call2: SELECT test_stat_func2() +test_stat_func2 +--------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_begin: BEGIN; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call2: SELECT test_stat_func2() +test_stat_func2 +--------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s1_func_stats2: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func2' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +---------------+--------------------------+----------------+--------------- +test_stat_func2| 2|t |t +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_fetch_consistency_snapshot s2_func_call s2_func_call2 s2_ff s1_begin s1_func_stats s2_func_call s2_func_call2 s2_ff s1_func_stats s1_func_stats2 s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call2: SELECT test_stat_func2() +test_stat_func2 +--------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_begin: BEGIN; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call2: SELECT test_stat_func2() +test_stat_func2 +--------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s1_func_stats2: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func2' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +---------------+--------------------------+----------------+--------------- +test_stat_func2| 1|t |t +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_fetch_consistency_none s1_begin s1_func_stats_nonexistent s1_func_stats_nonexistent s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_none: SET stats_fetch_consistency = 'none'; +step s1_begin: BEGIN; +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_fetch_consistency_cache s1_begin s1_func_stats_nonexistent s1_func_stats_nonexistent s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_cache: SET stats_fetch_consistency = 'cache'; +step s1_begin: BEGIN; +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_fetch_consistency_snapshot s1_begin s1_func_stats_nonexistent s1_func_stats_nonexistent s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; +step s1_begin: BEGIN; +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_begin s1_func_call s2_func_call s1_func_drop s2_func_call s2_ff s1_prepare_a s2_func_call s2_ff s1_func_call s1_ff s1_func_stats s1_commit_prepared_a s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_begin: BEGIN; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + +step s1_commit_prepared_a: COMMIT PREPARED 'a'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_begin s1_func_call s2_func_call s1_func_drop s2_func_call s2_ff s1_prepare_a s2_func_call s2_ff s1_func_call s1_ff s1_func_stats s1_rollback_prepared_a s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_begin: BEGIN; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + +step s1_rollback_prepared_a: ROLLBACK PREPARED 'a'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_begin s1_func_call s2_func_call s1_func_drop s2_func_call s2_ff s1_prepare_a s2_func_call s2_ff s1_func_call s1_ff s1_func_stats s2_commit_prepared_a s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_begin: BEGIN; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + +step s2_commit_prepared_a: COMMIT PREPARED 'a'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_begin s1_func_call s2_func_call s1_func_drop s2_func_call s2_ff s1_prepare_a s2_func_call s2_ff s1_func_call s1_ff s1_func_stats s2_rollback_prepared_a s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_begin: BEGIN; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + +step s2_rollback_prepared_a: ROLLBACK PREPARED 'a'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + + +starting permutation: s1_table_select s1_table_insert s2_table_select s2_table_update_k1 s1_ff s2_table_update_k1 s1_table_drop s2_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s2_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k1 | 1 +k2 | 1 +k3 | 1 +(4 rows) + +step s2_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_drop: DROP TABLE test_stat_tab; +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 0| 0| 0| 0| 0| 0| 0| 0 +(1 row) + + +starting permutation: s1_table_select s1_table_insert s2_table_select s2_table_update_k1 s2_table_update_k1 s1_table_drop s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s2_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k1 | 1 +k2 | 1 +k3 | 1 +(4 rows) + +step s2_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s2_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_drop: DROP TABLE test_stat_tab; +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 0| 0| 0| 0| 0| 0| 0| 0 +(1 row) + + +starting permutation: s1_track_counts_off s1_table_stats s1_track_counts_on +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_counts_off: SET track_counts = off; +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 0| 0| 1| 0| 0| 1| 0| 0 +(1 row) + +step s1_track_counts_on: SET track_counts = on; + +starting permutation: s1_table_select s1_track_counts_off s1_ff s1_table_stats s1_track_counts_on +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_track_counts_off: SET track_counts = off; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 1| 1| 1| 0| 0| 1| 0| 0 +(1 row) + +step s1_track_counts_on: SET track_counts = on; + +starting permutation: s1_table_select s1_ff s1_track_counts_off s1_table_stats s1_track_counts_on +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_counts_off: SET track_counts = off; +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 1| 1| 1| 0| 0| 1| 0| 0 +(1 row) + +step s1_track_counts_on: SET track_counts = on; + +starting permutation: s1_track_counts_off s1_table_select s1_table_insert_k1 s1_table_update_k1 s2_table_select s1_track_counts_on s1_ff s2_ff s1_table_stats s1_table_select s1_table_update_k1 s1_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_counts_off: SET track_counts = off; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s2_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k1 | 2 +(2 rows) + +step s1_track_counts_on: SET track_counts = on; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 1| 2| 1| 0| 0| 1| 0| 0 +(1 row) + +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k1 | 2 +(2 rows) + +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 3| 6| 1| 1| 0| 1| 1| 0 +(1 row) + + +starting permutation: s1_table_select s1_table_insert_k1 s1_table_delete_k1 s1_track_counts_off s1_table_select s1_table_insert_k1 s1_table_update_k1 s2_table_select s1_track_counts_on s1_ff s2_ff s1_table_stats s1_table_select s1_table_update_k1 s1_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_delete_k1: DELETE FROM test_stat_tab WHERE key = 'k1'; +step s1_track_counts_off: SET track_counts = off; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s2_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k1 | 2 +(2 rows) + +step s1_track_counts_on: SET track_counts = on; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 3| 5| 2| 0| 1| 1| 1| 0 +(1 row) + +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k1 | 2 +(2 rows) + +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 5| 9| 2| 1| 1| 1| 2| 0 +(1 row) + + +starting permutation: s1_begin s1_table_insert s1_table_update_k1 s1_table_update_k1 s1_table_update_k2 s1_table_update_k2 s1_table_update_k2 s1_table_delete_k1 s1_table_select s1_prepare_a s1_table_select s1_commit_prepared_a s1_table_select s1_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_begin: BEGIN; +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_delete_k1: DELETE FROM test_stat_tab WHERE key = 'k1'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k2 | 4 +k3 | 1 +(3 rows) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_commit_prepared_a: COMMIT PREPARED 'a'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k2 | 4 +k3 | 1 +(3 rows) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 9| 31| 4| 5| 1| 3| 6| 0 +(1 row) + + +starting permutation: s1_begin s1_table_insert s1_table_update_k1 s1_table_update_k1 s1_table_update_k2 s1_table_update_k2 s1_table_update_k2 s1_table_delete_k1 s1_table_select s1_prepare_a s1_table_select s2_commit_prepared_a s1_table_select s1_ff s2_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_begin: BEGIN; +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_delete_k1: DELETE FROM test_stat_tab WHERE key = 'k1'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k2 | 4 +k3 | 1 +(3 rows) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s2_commit_prepared_a: COMMIT PREPARED 'a'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k2 | 4 +k3 | 1 +(3 rows) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 9| 31| 4| 5| 1| 3| 6| 0 +(1 row) + + +starting permutation: s1_begin s1_table_insert s1_table_update_k1 s1_table_update_k1 s1_table_update_k2 s1_table_update_k2 s1_table_update_k2 s1_table_delete_k1 s1_table_select s1_prepare_a s1_table_select s1_rollback_prepared_a s1_table_select s1_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_begin: BEGIN; +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_delete_k1: DELETE FROM test_stat_tab WHERE key = 'k1'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k2 | 4 +k3 | 1 +(3 rows) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_rollback_prepared_a: ROLLBACK PREPARED 'a'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 9| 29| 4| 5| 1| 1| 8| 0 +(1 row) + + +starting permutation: s1_begin s1_table_insert s1_table_update_k1 s1_table_update_k1 s1_table_update_k2 s1_table_update_k2 s1_table_update_k2 s1_table_delete_k1 s1_table_select s1_prepare_a s1_table_select s2_rollback_prepared_a s1_table_select s1_ff s2_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_begin: BEGIN; +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_delete_k1: DELETE FROM test_stat_tab WHERE key = 'k1'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k2 | 4 +k3 | 1 +(3 rows) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s2_rollback_prepared_a: ROLLBACK PREPARED 'a'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 9| 29| 4| 5| 1| 1| 8| 0 +(1 row) + + +starting permutation: s1_table_insert s1_begin s1_table_update_k1 s1_table_update_k1 s1_table_truncate s1_table_insert_k1 s1_table_update_k1 s1_prepare_a s1_commit_prepared_a s1_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_begin: BEGIN; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_truncate: TRUNCATE test_stat_tab; +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_prepare_a: PREPARE TRANSACTION 'a'; +step s1_commit_prepared_a: COMMIT PREPARED 'a'; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 3| 9| 5| 1| 0| 1| 1| 0 +(1 row) + + +starting permutation: s1_table_insert s1_begin s1_table_update_k1 s1_table_update_k1 s1_table_truncate s1_table_insert_k1 s1_table_update_k1 s1_prepare_a s2_commit_prepared_a s1_ff s2_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_begin: BEGIN; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_truncate: TRUNCATE test_stat_tab; +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_prepare_a: PREPARE TRANSACTION 'a'; +step s2_commit_prepared_a: COMMIT PREPARED 'a'; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 3| 9| 5| 1| 0| 1| 1| 0 +(1 row) + + +starting permutation: s1_table_insert s1_begin s1_table_update_k1 s1_table_update_k1 s1_table_truncate s1_table_insert_k1 s1_table_update_k1 s1_prepare_a s1_rollback_prepared_a s1_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_begin: BEGIN; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_truncate: TRUNCATE test_stat_tab; +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_prepare_a: PREPARE TRANSACTION 'a'; +step s1_rollback_prepared_a: ROLLBACK PREPARED 'a'; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 3| 9| 4| 2| 0| 4| 2| 0 +(1 row) + + +starting permutation: s1_table_insert s1_begin s1_table_update_k1 s1_table_update_k1 s1_table_truncate s1_table_insert_k1 s1_table_update_k1 s1_prepare_a s2_rollback_prepared_a s1_ff s2_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_begin: BEGIN; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_truncate: TRUNCATE test_stat_tab; +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_prepare_a: PREPARE TRANSACTION 'a'; +step s2_rollback_prepared_a: ROLLBACK PREPARED 'a'; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 3| 9| 4| 2| 0| 4| 2| 0 +(1 row) + + +starting permutation: s1_table_insert s1_table_update_k1 s1_begin s1_table_delete_k1 s1_table_insert_k1 s1_table_update_k1 s1_table_update_k1 s1_table_drop s1_prepare_a s1_rollback_prepared_a s1_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_begin: BEGIN; +step s1_table_delete_k1: DELETE FROM test_stat_tab WHERE key = 'k1'; +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_drop: DROP TABLE test_stat_tab; +step s1_prepare_a: PREPARE TRANSACTION 'a'; +step s1_rollback_prepared_a: ROLLBACK PREPARED 'a'; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 4| 16| 5| 3| 1| 4| 4| 0 +(1 row) + + +starting permutation: s1_table_insert s1_table_update_k1 s1_begin s1_table_delete_k1 s1_table_insert_k1 s1_table_update_k1 s1_table_update_k1 s1_table_drop s1_prepare_a s2_rollback_prepared_a s1_ff s2_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_begin: BEGIN; +step s1_table_delete_k1: DELETE FROM test_stat_tab WHERE key = 'k1'; +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_drop: DROP TABLE test_stat_tab; +step s1_prepare_a: PREPARE TRANSACTION 'a'; +step s2_rollback_prepared_a: ROLLBACK PREPARED 'a'; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 4| 16| 5| 3| 1| 4| 4| 0 +(1 row) + + +starting permutation: s1_slru_save_stats s1_listen s1_begin s1_big_notify s1_ff s1_slru_check_stats s1_commit s1_slru_check_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s1_commit: COMMIT; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + + +starting permutation: s1_slru_save_stats s1_listen s2_big_notify s2_ff s1_slru_check_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + + +starting permutation: s1_slru_save_stats s1_listen s2_begin s2_big_notify s2_ff s1_slru_check_stats s2_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s2_begin: BEGIN; +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s2_commit: COMMIT; + +starting permutation: s1_fetch_consistency_none s1_slru_save_stats s1_listen s1_begin s1_slru_check_stats s2_big_notify s2_ff s1_slru_check_stats s1_commit s1_slru_check_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_none: SET stats_fetch_consistency = 'none'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + +step s1_commit: COMMIT; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + + +starting permutation: s1_fetch_consistency_cache s1_slru_save_stats s1_listen s1_begin s1_slru_check_stats s2_big_notify s2_ff s1_slru_check_stats s1_commit s1_slru_check_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_cache: SET stats_fetch_consistency = 'cache'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s1_commit: COMMIT; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + + +starting permutation: s1_fetch_consistency_snapshot s1_slru_save_stats s1_listen s1_begin s1_slru_check_stats s2_big_notify s2_ff s1_slru_check_stats s1_commit s1_slru_check_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s1_commit: COMMIT; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + + +starting permutation: s1_fetch_consistency_none s1_slru_save_stats s1_listen s1_begin s1_slru_check_stats s2_big_notify s2_ff s1_slru_check_stats s1_clear_snapshot s1_slru_check_stats s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_none: SET stats_fetch_consistency = 'none'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); +pg_stat_clear_snapshot +---------------------- + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_fetch_consistency_cache s1_slru_save_stats s1_listen s1_begin s1_slru_check_stats s2_big_notify s2_ff s1_slru_check_stats s1_clear_snapshot s1_slru_check_stats s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_cache: SET stats_fetch_consistency = 'cache'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); +pg_stat_clear_snapshot +---------------------- + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_fetch_consistency_snapshot s1_slru_save_stats s1_listen s1_begin s1_slru_check_stats s2_big_notify s2_ff s1_slru_check_stats s1_clear_snapshot s1_slru_check_stats s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); +pg_stat_clear_snapshot +---------------------- + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_fetch_consistency_snapshot s1_slru_save_stats s1_listen s1_begin s1_func_stats s2_big_notify s2_ff s1_slru_check_stats s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_fetch_consistency_snapshot s1_slru_save_stats s1_listen s1_begin s2_big_notify s2_ff s1_slru_check_stats s2_func_call s2_ff s1_func_stats s1_clear_snapshot s1_func_stats s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); +pg_stat_clear_snapshot +---------------------- + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s1_commit: COMMIT; diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule index a48caae228..c3066a6748 100644 --- a/src/test/isolation/isolation_schedule +++ b/src/test/isolation/isolation_schedule @@ -89,6 +89,7 @@ test: timeouts test: vacuum-concurrent-drop test: vacuum-conflict test: vacuum-skip-locked +test: stats test: horizons test: predicate-hash test: predicate-gist diff --git a/src/test/isolation/specs/stats.spec b/src/test/isolation/specs/stats.spec new file mode 100644 index 0000000000..a3a18ca03d --- /dev/null +++ b/src/test/isolation/specs/stats.spec @@ -0,0 +1,753 @@ +setup +{ + CREATE TABLE test_stat_oid(name text NOT NULL, oid oid); + + CREATE TABLE test_stat_tab(key text not null, value int); + INSERT INTO test_stat_tab(key, value) VALUES('k0', 1); + INSERT INTO test_stat_oid(name, oid) VALUES('test_stat_tab', 'test_stat_tab'::regclass); + + CREATE FUNCTION test_stat_func() RETURNS VOID LANGUAGE plpgsql AS $$BEGIN END;$$; + INSERT INTO test_stat_oid(name, oid) VALUES('test_stat_func', 'test_stat_func'::regproc); + + CREATE FUNCTION test_stat_func2() RETURNS VOID LANGUAGE plpgsql AS $$BEGIN END;$$; + INSERT INTO test_stat_oid(name, oid) VALUES('test_stat_func2', 'test_stat_func2'::regproc); + + CREATE TABLE test_slru_stats(slru TEXT, stat TEXT, value INT); + + SELECT pg_stat_force_next_flush(); +} + +teardown +{ + DROP TABLE test_stat_oid; + DROP TABLE test_slru_stats; + + DROP TABLE IF EXISTS test_stat_tab; + DROP FUNCTION IF EXISTS test_stat_func(); + DROP FUNCTION IF EXISTS test_stat_func2(); +} + +session s1 +setup { SET stats_fetch_consistency = 'none'; } +step s1_fetch_consistency_none { SET stats_fetch_consistency = 'none'; } +step s1_fetch_consistency_cache { SET stats_fetch_consistency = 'cache'; } +step s1_fetch_consistency_snapshot { SET stats_fetch_consistency = 'snapshot'; } +step s1_disable_debug_discard { SET debug_discard_caches = 0; } +step s1_clear_snapshot { SELECT pg_stat_clear_snapshot(); } +step s1_begin { BEGIN; } +step s1_commit { COMMIT; } +step s1_rollback { ROLLBACK; } +step s1_prepare_a { PREPARE TRANSACTION 'a'; } +step s1_commit_prepared_a { COMMIT PREPARED 'a'; } +step s1_rollback_prepared_a { ROLLBACK PREPARED 'a'; } + +# Function stats steps +step s1_ff { SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; } +step s1_track_funcs_all { SET track_functions = 'all'; } +step s1_track_funcs_none { SET track_functions = 'none'; } +step s1_func_call { SELECT test_stat_func(); } +step s1_func_drop { DROP FUNCTION test_stat_func(); } +step s1_func_stats_reset { SELECT pg_stat_reset_single_function_counters('test_stat_func'::regproc); } +step s1_func_stats_reset_nonexistent { SELECT pg_stat_reset_single_function_counters(12000); } +step s1_reset { SELECT pg_stat_reset(); } +step s1_func_stats { + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' +} +step s1_func_stats2 { + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func2' +} +step s1_func_stats_nonexistent { + SELECT pg_stat_get_function_calls(12000); +} + +# Relation stats steps +step s1_track_counts_on { SET track_counts = on; } +step s1_track_counts_off { SET track_counts = off; } +step s1_table_select { SELECT * FROM test_stat_tab ORDER BY key, value; } +step s1_table_insert { INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1);} +step s1_table_insert_k1 { INSERT INTO test_stat_tab(key, value) VALUES('k1', 1);} +step s1_table_update_k1 { UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1';} +step s1_table_update_k2 { UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2';} +step s1_table_delete_k1 { DELETE FROM test_stat_tab WHERE key = 'k1';} +step s1_table_truncate { TRUNCATE test_stat_tab; } +step s1_table_drop { DROP TABLE test_stat_tab; } + +step s1_table_stats { + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' +} + +# SLRU stats steps +step s1_slru_save_stats { + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); +} +step s1_listen { LISTEN stats_test_nothing; } +step s1_big_notify { SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + } + +step s1_slru_check_stats { + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + } + + +session s2 +setup { SET stats_fetch_consistency = 'none'; RESET debug_discard_caches; } +step s2_begin { BEGIN; } +step s2_disable_debug_discard { SET debug_discard_caches = 0; } +step s2_commit { COMMIT; } +step s2_commit_prepared_a { COMMIT PREPARED 'a'; } +step s2_rollback_prepared_a { ROLLBACK PREPARED 'a'; } +step s2_ff { SELECT pg_stat_force_next_flush(); } + +# Function stats steps +step s2_track_funcs_all { SET track_functions = 'all'; } +step s2_track_funcs_none { SET track_functions = 'none'; } +step s2_func_call { SELECT test_stat_func() } +step s2_func_call2 { SELECT test_stat_func2() } +step s2_func_stats { + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' +} + +# Relation stats steps +step s2_table_select { SELECT * FROM test_stat_tab ORDER BY key, value; } +step s2_table_update_k1 { UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1';} + +# SLRU stats steps +step s2_big_notify { SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + } + + +###################### +# Function stats tests +###################### + +# check that stats are collected iff enabled +permutation + s1_track_funcs_none s1_func_stats s1_func_call s1_func_call s1_ff s1_func_stats +permutation + s1_track_funcs_all s1_func_stats s1_func_call s1_func_call s1_ff s1_func_stats + +# multiple function calls are accurately reported, across separate connections +permutation + s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats + s1_func_call s2_func_call s1_func_call s2_func_call s2_func_call s1_ff s2_ff s1_func_stats s2_func_stats +permutation + s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats + s1_func_call s1_ff s2_func_call s2_func_call s2_ff s1_func_stats s2_func_stats +permutation + s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats + s1_begin s1_func_call s1_func_call s1_commit s1_ff s1_func_stats s2_func_stats + + +### Check interaction between dropping and stats reporting + +# Disable debug_discard_caches for a few of these tests - we precisely are +# testing the behavior of no invalidations arriving. "Real" invalidations +# shouldn't trigger behavioral difference, because we are testing paths +# precisely because they do not have AcceptInvalidationMessages calls.() + +# dropping a table remove stats iff committed +permutation + s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats + s1_begin s1_func_call s2_func_call s1_func_drop s2_func_call s2_ff s2_func_stats s1_commit s1_ff s1_func_stats s2_func_stats +permutation + s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats + s1_begin s1_func_call s2_func_call s1_func_drop s2_func_call s2_ff s2_func_stats s1_rollback s1_ff s1_func_stats s2_func_stats + +# Verify that pending stats from before a drop do not lead to +# reviving stats for a dropped object +permutation + s1_track_funcs_all s2_track_funcs_all + s2_func_call s2_ff # this access increments refcount, preventing the shared entry from being dropped + s2_begin s2_func_call s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats +permutation + s1_track_funcs_all s2_track_funcs_all + s2_begin s2_func_call s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats +permutation + s1_disable_debug_discard s2_disable_debug_discard + s1_track_funcs_all s2_track_funcs_all + s1_func_call s2_begin s2_func_call s1_func_drop s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats + +# Function calls don't necessarily trigger cache invalidation processing. The +# default handling of dropped stats could therefore end up with stats getting +# revived by a function call done after stats processing - but +# pgstat_init_function_usage() protects against that if track_functions is +# on. Verify that the stats are indeed dropped, and document the behavioral +# difference between track_functions settings. +permutation + s1_disable_debug_discard s2_disable_debug_discard + s1_track_funcs_all s2_track_funcs_none + s1_func_call s2_begin s2_func_call s1_ff s1_func_stats s1_func_drop s2_track_funcs_none s1_func_stats s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats +permutation + s1_disable_debug_discard s2_disable_debug_discard + s1_track_funcs_all s2_track_funcs_none + s1_func_call s2_begin s2_func_call s1_ff s1_func_stats s1_func_drop s2_track_funcs_all s1_func_stats s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats + +# test pg_stat_reset_single_function_counters +permutation + s1_track_funcs_all s2_track_funcs_all + s1_func_call + s2_func_call + s2_func_call2 + s1_ff s2_ff + s1_func_stats + s2_func_call s2_func_call2 s2_ff + s1_func_stats s1_func_stats2 s1_func_stats + s1_func_stats_reset + s1_func_stats s1_func_stats2 s1_func_stats + +# test pg_stat_reset_single_function_counters of non-existing function +permutation + s1_func_stats_nonexistent + s1_func_stats_reset_nonexistent + s1_func_stats_nonexistent + +# test pg_stat_reset +permutation + s1_track_funcs_all s2_track_funcs_all + s1_func_call + s2_func_call + s2_func_call2 + s1_ff s2_ff + s1_func_stats s1_func_stats2 s1_func_stats + s1_reset + s1_func_stats s1_func_stats2 s1_func_stats + + +### Check the different snapshot consistency models + +# First just some dead-trivial test verifying each model doesn't crash +permutation + s1_track_funcs_all s1_fetch_consistency_none s1_func_call s1_ff s1_func_stats +permutation + s1_track_funcs_all s1_fetch_consistency_cache s1_func_call s1_ff s1_func_stats +permutation + s1_track_funcs_all s1_fetch_consistency_snapshot s1_func_call s1_ff s1_func_stats + +# with stats_fetch_consistency=none s1 should see flushed changes in s2, despite being in a transaction +permutation + s1_track_funcs_all s2_track_funcs_all + s1_fetch_consistency_none + s2_func_call s2_ff + s1_begin + s1_func_stats + s2_func_call s2_ff + s1_func_stats + s1_commit + +# with stats_fetch_consistency=cache s1 should not see concurrent +# changes to the same object after the first access, but a separate +# object should show changes +permutation + s1_track_funcs_all s2_track_funcs_all + s1_fetch_consistency_cache + s2_func_call s2_func_call2 s2_ff + s1_begin + s1_func_stats + s2_func_call s2_func_call2 s2_ff + s1_func_stats s1_func_stats2 + s1_commit + +# with stats_fetch_consistency=snapshot s1 should not see any +# concurrent changes after the first access +permutation + s1_track_funcs_all s2_track_funcs_all + s1_fetch_consistency_snapshot + s2_func_call s2_func_call2 s2_ff + s1_begin + s1_func_stats + s2_func_call s2_func_call2 s2_ff + s1_func_stats s1_func_stats2 + s1_commit + +# Check access to non-existing stats works correctly and repeatedly +permutation + s1_fetch_consistency_none + s1_begin + s1_func_stats_nonexistent + s1_func_stats_nonexistent + s1_commit +permutation + s1_fetch_consistency_cache + s1_begin + s1_func_stats_nonexistent + s1_func_stats_nonexistent + s1_commit +permutation + s1_fetch_consistency_snapshot + s1_begin + s1_func_stats_nonexistent + s1_func_stats_nonexistent + s1_commit + + +### Check 2PC handling of stat drops + +# S1 prepared, S1 commits prepared +permutation + s1_track_funcs_all s2_track_funcs_all + s1_begin + s1_func_call + s2_func_call + s1_func_drop + s2_func_call + s2_ff + s1_prepare_a + s2_func_call + s2_ff + s1_func_call + s1_ff + s1_func_stats + s1_commit_prepared_a + s1_func_stats + +# S1 prepared, S1 aborts prepared +permutation + s1_track_funcs_all s2_track_funcs_all + s1_begin + s1_func_call + s2_func_call + s1_func_drop + s2_func_call + s2_ff + s1_prepare_a + s2_func_call + s2_ff + s1_func_call + s1_ff + s1_func_stats + s1_rollback_prepared_a + s1_func_stats + +# S1 prepares, S2 commits prepared +permutation + s1_track_funcs_all s2_track_funcs_all + s1_begin + s1_func_call + s2_func_call + s1_func_drop + s2_func_call + s2_ff + s1_prepare_a + s2_func_call + s2_ff + s1_func_call + s1_ff + s1_func_stats + s2_commit_prepared_a + s1_func_stats + +# S1 prepared, S2 aborts prepared +permutation + s1_track_funcs_all s2_track_funcs_all + s1_begin + s1_func_call + s2_func_call + s1_func_drop + s2_func_call + s2_ff + s1_prepare_a + s2_func_call + s2_ff + s1_func_call + s1_ff + s1_func_stats + s2_rollback_prepared_a + s1_func_stats + + +###################### +# Table stats tests +###################### + +# Most of the stats handling mechanism has already been tested in the function +# stats tests above - that's cheaper than testing with relations. But +# particularly for 2PC there are special cases + + +### Verify that pending stats from before a drop do not lead to reviving +### of stats for a dropped object + +permutation + s1_table_select + s1_table_insert + s2_table_select + s2_table_update_k1 + s1_ff + s2_table_update_k1 + s1_table_drop + s2_ff + s1_table_stats + +permutation + s1_table_select + s1_table_insert + s2_table_select + s2_table_update_k1 + s2_table_update_k1 + s1_table_drop + s1_table_stats + + +### Check that we don't count changes with track counts off, but allow access +### to prior stats + +# simple read access with stats off +permutation + s1_track_counts_off + s1_table_stats + s1_track_counts_on + +# simple read access with stats off, previously accessed +permutation + s1_table_select + s1_track_counts_off + s1_ff + s1_table_stats + s1_track_counts_on +permutation + s1_table_select + s1_ff + s1_track_counts_off + s1_table_stats + s1_track_counts_on + +# ensure we don't count anything with stats off +permutation + s1_track_counts_off + s1_table_select + s1_table_insert_k1 + s1_table_update_k1 + s2_table_select + s1_track_counts_on + s1_ff s2_ff + s1_table_stats + # but can count again after + s1_table_select + s1_table_update_k1 + s1_ff + s1_table_stats +permutation + s1_table_select + s1_table_insert_k1 + s1_table_delete_k1 + s1_track_counts_off + s1_table_select + s1_table_insert_k1 + s1_table_update_k1 + s2_table_select + s1_track_counts_on + s1_ff s2_ff + s1_table_stats + s1_table_select + s1_table_update_k1 + s1_ff + s1_table_stats + + +### 2PC: transactional and non-transactional counters work correctly + +# S1 prepares, S2 commits prepared +permutation + s1_begin + s1_table_insert s1_table_update_k1 s1_table_update_k1 s1_table_update_k2 s1_table_update_k2 s1_table_update_k2 s1_table_delete_k1 + s1_table_select + s1_prepare_a + s1_table_select + s1_commit_prepared_a + s1_table_select + s1_ff + s1_table_stats + +# S1 prepares, S2 commits prepared +permutation + s1_begin + s1_table_insert s1_table_update_k1 s1_table_update_k1 s1_table_update_k2 s1_table_update_k2 s1_table_update_k2 s1_table_delete_k1 + s1_table_select + s1_prepare_a + s1_table_select + s2_commit_prepared_a + s1_table_select + s1_ff s2_ff + s1_table_stats + +# S1 prepares, S2 commits prepared +permutation + s1_begin + s1_table_insert s1_table_update_k1 s1_table_update_k1 s1_table_update_k2 s1_table_update_k2 s1_table_update_k2 s1_table_delete_k1 + s1_table_select + s1_prepare_a + s1_table_select + s1_rollback_prepared_a + s1_table_select + s1_ff + s1_table_stats + +# S1 prepares, S1 aborts prepared +permutation + s1_begin + s1_table_insert s1_table_update_k1 s1_table_update_k1 s1_table_update_k2 s1_table_update_k2 s1_table_update_k2 s1_table_delete_k1 + s1_table_select + s1_prepare_a + s1_table_select + s2_rollback_prepared_a + s1_table_select + s1_ff s2_ff + s1_table_stats + + +### 2PC: truncate handling + +# S1 prepares, S1 commits prepared +permutation + s1_table_insert + s1_begin + s1_table_update_k1 # should *not* be counted, different rel + s1_table_update_k1 # dito + s1_table_truncate + s1_table_insert_k1 # should be counted + s1_table_update_k1 # dito + s1_prepare_a + s1_commit_prepared_a + s1_ff + s1_table_stats + +# S1 prepares, S2 commits prepared +permutation + s1_table_insert + s1_begin + s1_table_update_k1 # should *not* be counted, different rel + s1_table_update_k1 # dito + s1_table_truncate + s1_table_insert_k1 # should be counted + s1_table_update_k1 # dito + s1_prepare_a + s2_commit_prepared_a + s1_ff s2_ff + s1_table_stats + +# S1 prepares, S1 aborts prepared +permutation + s1_table_insert + s1_begin + s1_table_update_k1 # should be counted + s1_table_update_k1 # dito + s1_table_truncate + s1_table_insert_k1 # should *not* be counted, different rel + s1_table_update_k1 # dito + s1_prepare_a + s1_rollback_prepared_a + s1_ff + s1_table_stats + +# S1 prepares, S2 aborts prepared +permutation + s1_table_insert + s1_begin + s1_table_update_k1 # should be counted + s1_table_update_k1 # dito + s1_table_truncate + s1_table_insert_k1 # should *not* be counted, different rel + s1_table_update_k1 # dito + s1_prepare_a + s2_rollback_prepared_a + s1_ff s2_ff + s1_table_stats + + +### 2PC: rolled back drop maintains live / dead counters + +# S1 prepares, S1 aborts prepared +permutation + s1_table_insert + s1_table_update_k1 + s1_begin + # should all be counted + s1_table_delete_k1 + s1_table_insert_k1 + s1_table_update_k1 + s1_table_update_k1 + s1_table_drop + s1_prepare_a + s1_rollback_prepared_a + s1_ff + s1_table_stats + +# S1 prepares, S1 aborts prepared +permutation + s1_table_insert + s1_table_update_k1 + s1_begin + # should all be counted + s1_table_delete_k1 + s1_table_insert_k1 + s1_table_update_k1 + s1_table_update_k1 + s1_table_drop + s1_prepare_a + s2_rollback_prepared_a + s1_ff s2_ff + s1_table_stats + + +###################### +# SLRU stats tests +###################### + +# Verify SLRU stats generated in own transaction +permutation + s1_slru_save_stats + s1_listen + s1_begin + s1_big_notify + s1_ff + s1_slru_check_stats + s1_commit + s1_slru_check_stats + +# Verify SLRU stats generated in separate transaction +permutation + s1_slru_save_stats + s1_listen + s2_big_notify + s2_ff + s1_slru_check_stats + +# shouldn't see stats yet, not committed +permutation + s1_slru_save_stats + s1_listen + s2_begin + s2_big_notify + s2_ff + s1_slru_check_stats + s2_commit + + +### Check the different snapshot consistency models for fixed-amount statistics + +permutation + s1_fetch_consistency_none + s1_slru_save_stats s1_listen + s1_begin + s1_slru_check_stats + s2_big_notify + s2_ff + s1_slru_check_stats + s1_commit + s1_slru_check_stats +permutation + s1_fetch_consistency_cache + s1_slru_save_stats s1_listen + s1_begin + s1_slru_check_stats + s2_big_notify + s2_ff + s1_slru_check_stats + s1_commit + s1_slru_check_stats +permutation + s1_fetch_consistency_snapshot + s1_slru_save_stats s1_listen + s1_begin + s1_slru_check_stats + s2_big_notify + s2_ff + s1_slru_check_stats + s1_commit + s1_slru_check_stats + +# check that pg_stat_clear_snapshot(), well ... +permutation + s1_fetch_consistency_none + s1_slru_save_stats s1_listen + s1_begin + s1_slru_check_stats + s2_big_notify + s2_ff + s1_slru_check_stats + s1_clear_snapshot + s1_slru_check_stats + s1_commit +permutation + s1_fetch_consistency_cache + s1_slru_save_stats s1_listen + s1_begin + s1_slru_check_stats + s2_big_notify + s2_ff + s1_slru_check_stats + s1_clear_snapshot + s1_slru_check_stats + s1_commit +permutation + s1_fetch_consistency_snapshot + s1_slru_save_stats s1_listen + s1_begin + s1_slru_check_stats + s2_big_notify + s2_ff + s1_slru_check_stats + s1_clear_snapshot + s1_slru_check_stats + s1_commit + +# check that a variable-amount stats access caches fixed-amount stat too +permutation + s1_fetch_consistency_snapshot + s1_slru_save_stats s1_listen + s1_begin + s1_func_stats + s2_big_notify + s2_ff + s1_slru_check_stats + s1_commit + +# and the other way round +permutation + s1_fetch_consistency_snapshot + s1_slru_save_stats s1_listen + s1_begin + s2_big_notify + s2_ff + s1_slru_check_stats + s2_func_call + s2_ff + s1_func_stats + s1_clear_snapshot + s1_func_stats + s1_commit diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index aa05b3b78a..9713175930 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -16,6 +16,8 @@ SET enable_seqscan TO on; SET enable_indexscan TO on; -- for the moment, we don't want index-only scans here SET enable_indexonlyscan TO off; +-- not enabled by default, but we want to test it... +SET track_functions TO 'all'; -- save counters BEGIN; SET LOCAL stats_fetch_consistency = snapshot; @@ -146,8 +148,477 @@ FROM prevstats AS pr; (1 row) COMMIT; +---- +-- Basic tests for track_functions +--- +CREATE FUNCTION stats_test_func1() RETURNS VOID LANGUAGE plpgsql AS $$BEGIN END;$$; +SELECT 'stats_test_func1()'::regprocedure::oid AS stats_test_func1_oid \gset +CREATE FUNCTION stats_test_func2() RETURNS VOID LANGUAGE plpgsql AS $$BEGIN END;$$; +SELECT 'stats_test_func2()'::regprocedure::oid AS stats_test_func2_oid \gset +-- test that stats are accumulated +BEGIN; +SET LOCAL stats_fetch_consistency = none; +SELECT pg_stat_get_function_calls(:stats_test_func1_oid); + pg_stat_get_function_calls +---------------------------- + +(1 row) + +SELECT pg_stat_get_xact_function_calls(:stats_test_func1_oid); + pg_stat_get_xact_function_calls +--------------------------------- + +(1 row) + +SELECT stats_test_func1(); + stats_test_func1 +------------------ + +(1 row) + +SELECT pg_stat_get_xact_function_calls(:stats_test_func1_oid); + pg_stat_get_xact_function_calls +--------------------------------- + 1 +(1 row) + +SELECT stats_test_func1(); + stats_test_func1 +------------------ + +(1 row) + +SELECT pg_stat_get_xact_function_calls(:stats_test_func1_oid); + pg_stat_get_xact_function_calls +--------------------------------- + 2 +(1 row) + +SELECT pg_stat_get_function_calls(:stats_test_func1_oid); + pg_stat_get_function_calls +---------------------------- + 0 +(1 row) + +COMMIT; +-- Verify that function stats are not transactional +-- rolled back savepoint in committing transaction +BEGIN; +SELECT stats_test_func2(); + stats_test_func2 +------------------ + +(1 row) + +SAVEPOINT foo; +SELECT stats_test_func2(); + stats_test_func2 +------------------ + +(1 row) + +ROLLBACK TO SAVEPOINT foo; +SELECT pg_stat_get_xact_function_calls(:stats_test_func2_oid); + pg_stat_get_xact_function_calls +--------------------------------- + 2 +(1 row) + +SELECT stats_test_func2(); + stats_test_func2 +------------------ + +(1 row) + +COMMIT; +-- rolled back transaction +BEGIN; +SELECT stats_test_func2(); + stats_test_func2 +------------------ + +(1 row) + +ROLLBACK; +SELECT pg_stat_force_next_flush(); + pg_stat_force_next_flush +-------------------------- + +(1 row) + +-- check collected stats +SELECT funcname, calls FROM pg_stat_user_functions WHERE funcid = :stats_test_func1_oid; + funcname | calls +------------------+------- + stats_test_func1 | 2 +(1 row) + +SELECT funcname, calls FROM pg_stat_user_functions WHERE funcid = :stats_test_func2_oid; + funcname | calls +------------------+------- + stats_test_func2 | 4 +(1 row) + +-- check that a rolled back drop function stats leaves stats alive +BEGIN; +SELECT funcname, calls FROM pg_stat_user_functions WHERE funcid = :stats_test_func1_oid; + funcname | calls +------------------+------- + stats_test_func1 | 2 +(1 row) + +DROP FUNCTION stats_test_func1(); +-- shouldn't be visible via view +SELECT funcname, calls FROM pg_stat_user_functions WHERE funcid = :stats_test_func1_oid; + funcname | calls +----------+------- +(0 rows) + +-- but still via oid access +SELECT pg_stat_get_function_calls(:stats_test_func1_oid); + pg_stat_get_function_calls +---------------------------- + 2 +(1 row) + +ROLLBACK; +SELECT funcname, calls FROM pg_stat_user_functions WHERE funcid = :stats_test_func1_oid; + funcname | calls +------------------+------- + stats_test_func1 | 2 +(1 row) + +SELECT pg_stat_get_function_calls(:stats_test_func1_oid); + pg_stat_get_function_calls +---------------------------- + 2 +(1 row) + +-- check that function dropped in main transaction leaves no stats behind +BEGIN; +DROP FUNCTION stats_test_func1(); +COMMIT; +SELECT funcname, calls FROM pg_stat_user_functions WHERE funcid = :stats_test_func1_oid; + funcname | calls +----------+------- +(0 rows) + +SELECT pg_stat_get_function_calls(:stats_test_func1_oid); + pg_stat_get_function_calls +---------------------------- + +(1 row) + +-- check that function dropped in a subtransaction leaves no stats behind +BEGIN; +SELECT stats_test_func2(); + stats_test_func2 +------------------ + +(1 row) + +SAVEPOINT a; +SELECT stats_test_func2(); + stats_test_func2 +------------------ + +(1 row) + +SAVEPOINT b; +DROP FUNCTION stats_test_func2(); +COMMIT; +SELECT funcname, calls FROM pg_stat_user_functions WHERE funcid = :stats_test_func2_oid; + funcname | calls +----------+------- +(0 rows) + +SELECT pg_stat_get_function_calls(:stats_test_func2_oid); + pg_stat_get_function_calls +---------------------------- + +(1 row) + +-- Check that stats for relations are dropped. For that we need to access stats +-- by oid after the DROP TABLE. Save oids. +CREATE TABLE drop_stats_test(); +INSERT INTO drop_stats_test DEFAULT VALUES; +SELECT 'drop_stats_test'::regclass::oid AS drop_stats_test_oid \gset +CREATE TABLE drop_stats_test_xact(); +INSERT INTO drop_stats_test_xact DEFAULT VALUES; +SELECT 'drop_stats_test_xact'::regclass::oid AS drop_stats_test_xact_oid \gset +CREATE TABLE drop_stats_test_subxact(); +INSERT INTO drop_stats_test_subxact DEFAULT VALUES; +SELECT 'drop_stats_test_subxact'::regclass::oid AS drop_stats_test_subxact_oid \gset +SELECT pg_stat_force_next_flush(); + pg_stat_force_next_flush +-------------------------- + +(1 row) + +SELECT pg_stat_get_live_tuples(:drop_stats_test_oid); + pg_stat_get_live_tuples +------------------------- + 1 +(1 row) + +DROP TABLE drop_stats_test; +SELECT pg_stat_get_live_tuples(:drop_stats_test_oid); + pg_stat_get_live_tuples +------------------------- + 0 +(1 row) + +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_oid); + pg_stat_get_xact_tuples_inserted +---------------------------------- + 0 +(1 row) + +-- check that rollback protects against having stats dropped and that local +-- modifications don't pose a problem +SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); + pg_stat_get_live_tuples +------------------------- + 1 +(1 row) + +SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); + pg_stat_get_tuples_inserted +----------------------------- + 1 +(1 row) + +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); + pg_stat_get_xact_tuples_inserted +---------------------------------- + 0 +(1 row) + +BEGIN; +INSERT INTO drop_stats_test_xact DEFAULT VALUES; +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); + pg_stat_get_xact_tuples_inserted +---------------------------------- + 1 +(1 row) + +DROP TABLE drop_stats_test_xact; +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); + pg_stat_get_xact_tuples_inserted +---------------------------------- + 0 +(1 row) + +ROLLBACK; +SELECT pg_stat_force_next_flush(); + pg_stat_force_next_flush +-------------------------- + +(1 row) + +SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); + pg_stat_get_live_tuples +------------------------- + 1 +(1 row) + +SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); + pg_stat_get_tuples_inserted +----------------------------- + 2 +(1 row) + +-- transactional drop +SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); + pg_stat_get_live_tuples +------------------------- + 1 +(1 row) + +SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); + pg_stat_get_tuples_inserted +----------------------------- + 2 +(1 row) + +BEGIN; +INSERT INTO drop_stats_test_xact DEFAULT VALUES; +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); + pg_stat_get_xact_tuples_inserted +---------------------------------- + 1 +(1 row) + +DROP TABLE drop_stats_test_xact; +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); + pg_stat_get_xact_tuples_inserted +---------------------------------- + 0 +(1 row) + +COMMIT; +SELECT pg_stat_force_next_flush(); + pg_stat_force_next_flush +-------------------------- + +(1 row) + +SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); + pg_stat_get_live_tuples +------------------------- + 0 +(1 row) + +SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); + pg_stat_get_tuples_inserted +----------------------------- + 0 +(1 row) + +-- savepoint rollback (2 levels) +SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); + pg_stat_get_live_tuples +------------------------- + 1 +(1 row) + +BEGIN; +INSERT INTO drop_stats_test_subxact DEFAULT VALUES; +SAVEPOINT sp1; +INSERT INTO drop_stats_test_subxact DEFAULT VALUES; +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_subxact_oid); + pg_stat_get_xact_tuples_inserted +---------------------------------- + 2 +(1 row) + +SAVEPOINT sp2; +DROP TABLE drop_stats_test_subxact; +ROLLBACK TO SAVEPOINT sp2; +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_subxact_oid); + pg_stat_get_xact_tuples_inserted +---------------------------------- + 2 +(1 row) + +COMMIT; +SELECT pg_stat_force_next_flush(); + pg_stat_force_next_flush +-------------------------- + +(1 row) + +SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); + pg_stat_get_live_tuples +------------------------- + 3 +(1 row) + +-- savepoint rolback (1 level) +SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); + pg_stat_get_live_tuples +------------------------- + 3 +(1 row) + +BEGIN; +SAVEPOINT sp1; +DROP TABLE drop_stats_test_subxact; +SAVEPOINT sp2; +ROLLBACK TO SAVEPOINT sp1; +COMMIT; +SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); + pg_stat_get_live_tuples +------------------------- + 3 +(1 row) + +-- and now actually drop +SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); + pg_stat_get_live_tuples +------------------------- + 3 +(1 row) + +BEGIN; +SAVEPOINT sp1; +DROP TABLE drop_stats_test_subxact; +SAVEPOINT sp2; +RELEASE SAVEPOINT sp1; +COMMIT; +SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); + pg_stat_get_live_tuples +------------------------- + 0 +(1 row) + DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4; DROP TABLE prevstats; +---- +-- pg_stat_get_snapshot_timestamp behavior +---- +BEGIN; +SET LOCAL stats_fetch_consistency = snapshot; +-- no snapshot yet, return NULL +SELECT pg_stat_get_snapshot_timestamp(); + pg_stat_get_snapshot_timestamp +-------------------------------- + +(1 row) + +-- any attempt at accessing stats will build snapshot +SELECT pg_stat_get_function_calls(0); + pg_stat_get_function_calls +---------------------------- + +(1 row) + +SELECT pg_stat_get_snapshot_timestamp() >= NOW(); + ?column? +---------- + t +(1 row) + +-- shows NULL again after clearing +SELECT pg_stat_clear_snapshot(); + pg_stat_clear_snapshot +------------------------ + +(1 row) + +SELECT pg_stat_get_snapshot_timestamp(); + pg_stat_get_snapshot_timestamp +-------------------------------- + +(1 row) + +COMMIT; +---- +-- pg_stat_have_stats behavior +---- +-- fixed-numbered stats exist +SELECT pg_stat_have_stats('bgwriter', 0, 0); + pg_stat_have_stats +-------------------- + t +(1 row) + +-- unknown stats kinds error out +SELECT pg_stat_have_stats('zaphod', 0, 0); +ERROR: invalid statistics kind: "zaphod" +-- db stats have objoid 0 +SELECT pg_stat_have_stats('database', (SELECT oid FROM pg_database WHERE datname = current_database()), 1); + pg_stat_have_stats +-------------------- + f +(1 row) + +SELECT pg_stat_have_stats('database', (SELECT oid FROM pg_database WHERE datname = current_database()), 0); + pg_stat_have_stats +-------------------- + t +(1 row) + -- ensure that stats accessors handle NULL input correctly SELECT pg_stat_get_replication_slot(NULL); pg_stat_get_replication_slot diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index 7c77c33121..4d26671da7 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -13,6 +13,8 @@ SET enable_seqscan TO on; SET enable_indexscan TO on; -- for the moment, we don't want index-only scans here SET enable_indexonlyscan TO off; +-- not enabled by default, but we want to test it... +SET track_functions TO 'all'; -- save counters BEGIN; @@ -121,9 +123,196 @@ FROM prevstats AS pr; COMMIT; +---- +-- Basic tests for track_functions +--- +CREATE FUNCTION stats_test_func1() RETURNS VOID LANGUAGE plpgsql AS $$BEGIN END;$$; +SELECT 'stats_test_func1()'::regprocedure::oid AS stats_test_func1_oid \gset +CREATE FUNCTION stats_test_func2() RETURNS VOID LANGUAGE plpgsql AS $$BEGIN END;$$; +SELECT 'stats_test_func2()'::regprocedure::oid AS stats_test_func2_oid \gset + +-- test that stats are accumulated +BEGIN; +SET LOCAL stats_fetch_consistency = none; +SELECT pg_stat_get_function_calls(:stats_test_func1_oid); +SELECT pg_stat_get_xact_function_calls(:stats_test_func1_oid); +SELECT stats_test_func1(); +SELECT pg_stat_get_xact_function_calls(:stats_test_func1_oid); +SELECT stats_test_func1(); +SELECT pg_stat_get_xact_function_calls(:stats_test_func1_oid); +SELECT pg_stat_get_function_calls(:stats_test_func1_oid); +COMMIT; + +-- Verify that function stats are not transactional + +-- rolled back savepoint in committing transaction +BEGIN; +SELECT stats_test_func2(); +SAVEPOINT foo; +SELECT stats_test_func2(); +ROLLBACK TO SAVEPOINT foo; +SELECT pg_stat_get_xact_function_calls(:stats_test_func2_oid); +SELECT stats_test_func2(); +COMMIT; + +-- rolled back transaction +BEGIN; +SELECT stats_test_func2(); +ROLLBACK; + +SELECT pg_stat_force_next_flush(); + +-- check collected stats +SELECT funcname, calls FROM pg_stat_user_functions WHERE funcid = :stats_test_func1_oid; +SELECT funcname, calls FROM pg_stat_user_functions WHERE funcid = :stats_test_func2_oid; + + +-- check that a rolled back drop function stats leaves stats alive +BEGIN; +SELECT funcname, calls FROM pg_stat_user_functions WHERE funcid = :stats_test_func1_oid; +DROP FUNCTION stats_test_func1(); +-- shouldn't be visible via view +SELECT funcname, calls FROM pg_stat_user_functions WHERE funcid = :stats_test_func1_oid; +-- but still via oid access +SELECT pg_stat_get_function_calls(:stats_test_func1_oid); +ROLLBACK; +SELECT funcname, calls FROM pg_stat_user_functions WHERE funcid = :stats_test_func1_oid; +SELECT pg_stat_get_function_calls(:stats_test_func1_oid); + + +-- check that function dropped in main transaction leaves no stats behind +BEGIN; +DROP FUNCTION stats_test_func1(); +COMMIT; +SELECT funcname, calls FROM pg_stat_user_functions WHERE funcid = :stats_test_func1_oid; +SELECT pg_stat_get_function_calls(:stats_test_func1_oid); + +-- check that function dropped in a subtransaction leaves no stats behind +BEGIN; +SELECT stats_test_func2(); +SAVEPOINT a; +SELECT stats_test_func2(); +SAVEPOINT b; +DROP FUNCTION stats_test_func2(); +COMMIT; +SELECT funcname, calls FROM pg_stat_user_functions WHERE funcid = :stats_test_func2_oid; +SELECT pg_stat_get_function_calls(:stats_test_func2_oid); + + +-- Check that stats for relations are dropped. For that we need to access stats +-- by oid after the DROP TABLE. Save oids. +CREATE TABLE drop_stats_test(); +INSERT INTO drop_stats_test DEFAULT VALUES; +SELECT 'drop_stats_test'::regclass::oid AS drop_stats_test_oid \gset + +CREATE TABLE drop_stats_test_xact(); +INSERT INTO drop_stats_test_xact DEFAULT VALUES; +SELECT 'drop_stats_test_xact'::regclass::oid AS drop_stats_test_xact_oid \gset + +CREATE TABLE drop_stats_test_subxact(); +INSERT INTO drop_stats_test_subxact DEFAULT VALUES; +SELECT 'drop_stats_test_subxact'::regclass::oid AS drop_stats_test_subxact_oid \gset + +SELECT pg_stat_force_next_flush(); + +SELECT pg_stat_get_live_tuples(:drop_stats_test_oid); +DROP TABLE drop_stats_test; +SELECT pg_stat_get_live_tuples(:drop_stats_test_oid); +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_oid); + +-- check that rollback protects against having stats dropped and that local +-- modifications don't pose a problem +SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); +SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); +BEGIN; +INSERT INTO drop_stats_test_xact DEFAULT VALUES; +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); +DROP TABLE drop_stats_test_xact; +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); +ROLLBACK; +SELECT pg_stat_force_next_flush(); +SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); +SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); + +-- transactional drop +SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); +SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); +BEGIN; +INSERT INTO drop_stats_test_xact DEFAULT VALUES; +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); +DROP TABLE drop_stats_test_xact; +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); +COMMIT; +SELECT pg_stat_force_next_flush(); +SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); +SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); + +-- savepoint rollback (2 levels) +SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); +BEGIN; +INSERT INTO drop_stats_test_subxact DEFAULT VALUES; +SAVEPOINT sp1; +INSERT INTO drop_stats_test_subxact DEFAULT VALUES; +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_subxact_oid); +SAVEPOINT sp2; +DROP TABLE drop_stats_test_subxact; +ROLLBACK TO SAVEPOINT sp2; +SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_subxact_oid); +COMMIT; +SELECT pg_stat_force_next_flush(); +SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); + +-- savepoint rolback (1 level) +SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); +BEGIN; +SAVEPOINT sp1; +DROP TABLE drop_stats_test_subxact; +SAVEPOINT sp2; +ROLLBACK TO SAVEPOINT sp1; +COMMIT; +SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); + +-- and now actually drop +SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); +BEGIN; +SAVEPOINT sp1; +DROP TABLE drop_stats_test_subxact; +SAVEPOINT sp2; +RELEASE SAVEPOINT sp1; +COMMIT; +SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); + DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4; DROP TABLE prevstats; +---- +-- pg_stat_get_snapshot_timestamp behavior +---- +BEGIN; +SET LOCAL stats_fetch_consistency = snapshot; +-- no snapshot yet, return NULL +SELECT pg_stat_get_snapshot_timestamp(); +-- any attempt at accessing stats will build snapshot +SELECT pg_stat_get_function_calls(0); +SELECT pg_stat_get_snapshot_timestamp() >= NOW(); +-- shows NULL again after clearing +SELECT pg_stat_clear_snapshot(); +SELECT pg_stat_get_snapshot_timestamp(); +COMMIT; + +---- +-- pg_stat_have_stats behavior +---- +-- fixed-numbered stats exist +SELECT pg_stat_have_stats('bgwriter', 0, 0); +-- unknown stats kinds error out +SELECT pg_stat_have_stats('zaphod', 0, 0); +-- db stats have objoid 0 +SELECT pg_stat_have_stats('database', (SELECT oid FROM pg_database WHERE datname = current_database()), 1); +SELECT pg_stat_have_stats('database', (SELECT oid FROM pg_database WHERE datname = current_database()), 0); + + -- ensure that stats accessors handle NULL input correctly SELECT pg_stat_get_replication_slot(NULL); SELECT pg_stat_get_subscription_stats(NULL); From 9553b4115f1879f66935f42fff0b798ef91866d0 Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Thu, 7 Apr 2022 00:27:07 -0700 Subject: [PATCH 423/772] Fix warning introduced in 5c279a6d350. Change two macros to be static inline functions instead to keep the data type consistent. This avoids a "comparison is always true" warning that was occurring with -Wtype-limits. In the process, change the names to look less like macros. Discussion: https://postgr.es/m/20220407063505.njnnrmbn4sxqfsts@alap3.anarazel.de --- src/backend/access/transam/rmgr.c | 4 ++-- src/backend/access/transam/xlogreader.c | 2 +- src/bin/pg_waldump/pg_waldump.c | 6 +++--- src/bin/pg_waldump/rmgrdesc.c | 4 ++-- src/include/access/rmgr.h | 18 ++++++++++++++---- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/backend/access/transam/rmgr.c b/src/backend/access/transam/rmgr.c index 3c2dc1000d..e1d6ebbd3d 100644 --- a/src/backend/access/transam/rmgr.c +++ b/src/backend/access/transam/rmgr.c @@ -101,7 +101,7 @@ RegisterCustomRmgr(RmgrId rmid, RmgrData *rmgr) ereport(ERROR, (errmsg("custom resource manager name is invalid"), errhint("Provide a non-empty name for the custom resource manager."))); - if (!RMID_IS_CUSTOM(rmid)) + if (!RmgrIdIsCustom(rmid)) ereport(ERROR, (errmsg("custom resource manager ID %d is out of range", rmid), errhint("Provide a custom resource manager ID between %d and %d.", RM_MIN_CUSTOM_ID, RM_MAX_CUSTOM_ID))); @@ -153,7 +153,7 @@ pg_get_wal_resource_managers(PG_FUNCTION_ARGS) continue; values[0] = Int32GetDatum(rmid); values[1] = CStringGetTextDatum(GetRmgr(rmid).rm_name); - values[2] = BoolGetDatum(RMID_IS_BUILTIN(rmid)); + values[2] = BoolGetDatum(RmgrIdIsBuiltin(rmid)); tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); } diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index 161cf13fed..e612aa933a 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1102,7 +1102,7 @@ ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr RecPtr, (uint32) SizeOfXLogRecord, record->xl_tot_len); return false; } - if (!RMID_IS_VALID(record->xl_rmid)) + if (!RmgrIdIsValid(record->xl_rmid)) { report_invalid_record(state, "invalid resource manager ID %u at %X/%X", diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 4f47449a6c..7d92dcaf87 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -749,7 +749,7 @@ XLogDumpDisplayStats(XLogDumpConfig *config, XLogDumpStats *stats) tot_len; const RmgrDescData *desc; - if (!RMID_IS_VALID(ri)) + if (!RmgrIdIsValid(ri)) continue; desc = GetRmgrDesc(ri); @@ -761,7 +761,7 @@ XLogDumpDisplayStats(XLogDumpConfig *config, XLogDumpStats *stats) fpi_len = stats->rmgr_stats[ri].fpi_len; tot_len = rec_len + fpi_len; - if (RMID_IS_CUSTOM(ri) && count == 0) + if (RmgrIdIsCustom(ri) && count == 0) continue; XLogDumpStatsRow(desc->rm_name, @@ -1025,7 +1025,7 @@ main(int argc, char **argv) */ if (sscanf(optarg, "custom%03d", &rmid) == 1) { - if (!RMID_IS_CUSTOM(rmid)) + if (!RmgrIdIsCustom(rmid)) { pg_log_error("custom resource manager \"%s\" does not exist", optarg); diff --git a/src/bin/pg_waldump/rmgrdesc.c b/src/bin/pg_waldump/rmgrdesc.c index d1f92a413c..fac509ed13 100644 --- a/src/bin/pg_waldump/rmgrdesc.c +++ b/src/bin/pg_waldump/rmgrdesc.c @@ -86,9 +86,9 @@ initialize_custom_rmgrs(void) const RmgrDescData * GetRmgrDesc(RmgrId rmid) { - Assert(RMID_IS_VALID(rmid)); + Assert(RmgrIdIsValid(rmid)); - if (RMID_IS_BUILTIN(rmid)) + if (RmgrIdIsBuiltin(rmid)) return &RmgrDescTable[rmid]; else { diff --git a/src/include/access/rmgr.h b/src/include/access/rmgr.h index d9a96410d9..e465800e44 100644 --- a/src/include/access/rmgr.h +++ b/src/include/access/rmgr.h @@ -37,10 +37,20 @@ typedef enum RmgrIds #define RM_N_IDS (UINT8_MAX + 1) #define RM_N_BUILTIN_IDS (RM_MAX_BUILTIN_ID + 1) #define RM_N_CUSTOM_IDS (RM_MAX_CUSTOM_ID - RM_MIN_CUSTOM_ID + 1) -#define RMID_IS_BUILTIN(rmid) ((rmid) <= RM_MAX_BUILTIN_ID) -#define RMID_IS_CUSTOM(rmid) ((rmid) >= RM_MIN_CUSTOM_ID && \ - (rmid) <= RM_MAX_CUSTOM_ID) -#define RMID_IS_VALID(rmid) (RMID_IS_BUILTIN((rmid)) || RMID_IS_CUSTOM((rmid))) + +static inline bool +RmgrIdIsBuiltin(int rmid) +{ + return rmid <= RM_MAX_BUILTIN_ID; +} + +static inline bool +RmgrIdIsCustom(int rmid) +{ + return rmid >= RM_MIN_CUSTOM_ID && rmid <= RM_MAX_CUSTOM_ID; +} + +#define RmgrIdIsValid(rmid) (RmgrIdIsBuiltin((rmid)) || RmgrIdIsCustom((rmid))) /* * RmgrId to use for extensions that require an RmgrId, but are still in From 5dc0418fab281d017a61a5756240467af982bdfd Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Thu, 7 Apr 2022 19:28:40 +1200 Subject: [PATCH 424/772] Prefetch data referenced by the WAL, take II. Introduce a new GUC recovery_prefetch. When enabled, look ahead in the WAL and try to initiate asynchronous reading of referenced data blocks that are not yet cached in our buffer pool. For now, this is done with posix_fadvise(), which has several caveats. Since not all OSes have that system call, "try" is provided so that it can be enabled where available. Better mechanisms for asynchronous I/O are possible in later work. Set to "try" for now for test coverage. Default setting to be finalized before release. The GUC wal_decode_buffer_size limits the distance we can look ahead in bytes of decoded data. The existing GUC maintenance_io_concurrency is used to limit the number of concurrent I/Os allowed, based on pessimistic heuristics used to infer that I/Os have begun and completed. We'll also not look more than maintenance_io_concurrency * 4 block references ahead. Reviewed-by: Julien Rouhaud Reviewed-by: Tomas Vondra Reviewed-by: Alvaro Herrera (earlier version) Reviewed-by: Andres Freund (earlier version) Reviewed-by: Justin Pryzby (earlier version) Tested-by: Tomas Vondra (earlier version) Tested-by: Jakub Wartak (earlier version) Tested-by: Dmitry Dolgov <9erthalion6@gmail.com> (earlier version) Tested-by: Sait Talha Nisanci (earlier version) Discussion: https://postgr.es/m/CA%2BhUKGJ4VJN8ttxScUFM8dOKX0BrBiboo5uz1cq%3DAovOddfHpA%40mail.gmail.com --- doc/src/sgml/config.sgml | 64 + doc/src/sgml/monitoring.sgml | 86 +- doc/src/sgml/wal.sgml | 12 + src/backend/access/transam/Makefile | 1 + src/backend/access/transam/xlog.c | 2 + src/backend/access/transam/xlogprefetcher.c | 1082 +++++++++++++++++ src/backend/access/transam/xlogreader.c | 27 +- src/backend/access/transam/xlogrecovery.c | 179 ++- src/backend/access/transam/xlogutils.c | 27 +- src/backend/catalog/system_views.sql | 14 + src/backend/storage/buffer/bufmgr.c | 4 + src/backend/storage/freespace/freespace.c | 3 +- src/backend/storage/ipc/ipci.c | 3 + src/backend/storage/smgr/md.c | 6 +- src/backend/utils/adt/pgstatfuncs.c | 5 +- src/backend/utils/misc/guc.c | 55 +- src/backend/utils/misc/postgresql.conf.sample | 6 + src/include/access/xlog.h | 1 + src/include/access/xlogprefetcher.h | 53 + src/include/access/xlogreader.h | 8 + src/include/access/xlogutils.h | 3 +- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.dat | 7 + src/include/utils/guc.h | 4 + src/include/utils/guc_tables.h | 1 + src/test/regress/expected/rules.out | 11 + src/tools/pgindent/typedefs.list | 6 + 27 files changed, 1595 insertions(+), 77 deletions(-) create mode 100644 src/backend/access/transam/xlogprefetcher.c create mode 100644 src/include/access/xlogprefetcher.h diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 6901e71f9d..ac533968a0 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -3657,6 +3657,70 @@ include_dir 'conf.d' + + + Recovery + + + configuration + of recovery + general settings + + + + This section describes the settings that apply to recovery in general, + affecting crash recovery, streaming replication and archive-based + replication. + + + + + + recovery_prefetch (enum) + + recovery_prefetch configuration parameter + + + + + Whether to try to prefetch blocks that are referenced in the WAL that + are not yet in the buffer pool, during recovery. Valid values are + off (the default), on and + try. The setting try enables + prefetching only if the operating system provides the + posix_fadvise function, which is currently used + to implement prefetching. Note that some operating systems provide the + function, but it doesn't do anything. + + + Prefetching blocks that will soon be needed can reduce I/O wait times + during recovery with some workloads. + See also the and + settings, which limit + prefetching activity. + + + + + + wal_decode_buffer_size (integer) + + wal_decode_buffer_size configuration parameter + + + + + A limit on how far ahead the server can look in the WAL, to find + blocks to prefetch. If this value is specified without units, it is + taken as bytes. + The default is 512kB. + + + + + + + Archive Recovery diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 24924647b5..76766d28dd 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -328,6 +328,13 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser + + pg_stat_recovery_prefetchpg_stat_recovery_prefetch + Only one row, showing statistics about blocks prefetched during recovery. + See for details. + + + pg_stat_subscriptionpg_stat_subscription At least one row per subscription, showing information about @@ -2979,6 +2986,78 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i copy of the subscribed tables. + + <structname>pg_stat_recovery_prefetch</structname> View + + + + Column + Type + Description + + + + + + prefetch + bigint + Number of blocks prefetched because they were not in the buffer pool + + + hit + bigint + Number of blocks not prefetched because they were already in the buffer pool + + + skip_init + bigint + Number of blocks not prefetched because they would be zero-initialized + + + skip_new + bigint + Number of blocks not prefetched because they didn't exist yet + + + skip_fpw + bigint + Number of blocks not prefetched because a full page image was included in the WAL + + + skip_rep + bigint + Number of blocks not prefetched because they were already recently prefetched + + + wal_distance + integer + How many bytes ahead the prefetcher is looking + + + block_distance + integer + How many blocks ahead the prefetcher is looking + + + io_depth + integer + How many prefetches have been initiated but are not yet known to have completed + + + +
+ + + The pg_stat_recovery_prefetch view will contain + only one row. It is filled with nulls if recovery has not run or + is not enabled. The + columns wal_distance, + block_distance + and io_depth show current values, and the + other columns show cumulative counters that can be reset + with the pg_stat_reset_shared function. + + <structname>pg_stat_subscription</structname> View @@ -5199,8 +5278,11 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i all the counters shown in the pg_stat_bgwriter view, archiver to reset all the counters shown in - the pg_stat_archiver view or wal - to reset all the counters shown in the pg_stat_wal view. + the pg_stat_archiver view, + wal to reset all the counters shown in the + pg_stat_wal view or + recovery_prefetch to reset all the counters shown + in the pg_stat_recovery_prefetch view. This function is restricted to superusers by default, but other users diff --git a/doc/src/sgml/wal.sgml b/doc/src/sgml/wal.sgml index 2bb27a8468..6b3406b7de 100644 --- a/doc/src/sgml/wal.sgml +++ b/doc/src/sgml/wal.sgml @@ -803,6 +803,18 @@ counted as wal_write and wal_sync in pg_stat_wal, respectively. + + + The parameter can be used to reduce + I/O wait times during recovery by instructing the kernel to initiate reads + of disk blocks that will soon be needed but are not currently in + PostgreSQL's buffer pool. + The and + settings limit prefetching + concurrency and distance, respectively. By default, it is set to + try, which enabled the feature on systems where + posix_fadvise is available. + diff --git a/src/backend/access/transam/Makefile b/src/backend/access/transam/Makefile index 79314c69ab..8c17c88dfc 100644 --- a/src/backend/access/transam/Makefile +++ b/src/backend/access/transam/Makefile @@ -31,6 +31,7 @@ OBJS = \ xlogarchive.o \ xlogfuncs.o \ xloginsert.o \ + xlogprefetcher.o \ xlogreader.o \ xlogrecovery.o \ xlogutils.o diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index c076e48445..6770c3ddba 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -59,6 +59,7 @@ #include "access/xlog_internal.h" #include "access/xlogarchive.h" #include "access/xloginsert.h" +#include "access/xlogprefetcher.h" #include "access/xlogreader.h" #include "access/xlogrecovery.h" #include "access/xlogutils.h" @@ -133,6 +134,7 @@ int CommitDelay = 0; /* precommit delay in microseconds */ int CommitSiblings = 5; /* # concurrent xacts needed to sleep */ int wal_retrieve_retry_interval = 5000; int max_slot_wal_keep_size_mb = -1; +int wal_decode_buffer_size = 512 * 1024; bool track_wal_io_timing = false; #ifdef WAL_DEBUG diff --git a/src/backend/access/transam/xlogprefetcher.c b/src/backend/access/transam/xlogprefetcher.c new file mode 100644 index 0000000000..f3428888d2 --- /dev/null +++ b/src/backend/access/transam/xlogprefetcher.c @@ -0,0 +1,1082 @@ +/*------------------------------------------------------------------------- + * + * xlogprefetcher.c + * Prefetching support for recovery. + * + * Portions Copyright (c) 2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/access/transam/xlogprefetcher.c + * + * This module provides a drop-in replacement for an XLogReader that tries to + * minimize I/O stalls by looking ahead in the WAL. If blocks that will be + * accessed in the near future are not already in the buffer pool, it initiates + * I/Os that might complete before the caller eventually needs the data. When + * referenced blocks are found in the buffer pool already, the buffer is + * recorded in the decoded record so that XLogReadBufferForRedo() can try to + * avoid a second buffer mapping table lookup. + * + * Currently, only the main fork is considered for prefetching. Currently, + * prefetching is only effective on systems where BufferPrefetch() does + * something useful (mainly Linux). + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "access/xlog.h" +#include "access/xlogprefetcher.h" +#include "access/xlogreader.h" +#include "access/xlogutils.h" +#include "catalog/pg_class.h" +#include "catalog/pg_control.h" +#include "catalog/storage_xlog.h" +#include "commands/dbcommands_xlog.h" +#include "utils/fmgrprotos.h" +#include "utils/timestamp.h" +#include "funcapi.h" +#include "pgstat.h" +#include "miscadmin.h" +#include "port/atomics.h" +#include "storage/bufmgr.h" +#include "storage/shmem.h" +#include "storage/smgr.h" +#include "utils/guc.h" +#include "utils/hsearch.h" + +/* + * Every time we process this much WAL, we'll update the values in + * pg_stat_recovery_prefetch. + */ +#define XLOGPREFETCHER_STATS_DISTANCE BLCKSZ + +/* + * To detect repeated access to the same block and skip useless extra system + * calls, we remember a small window of recently prefetched blocks. + */ +#define XLOGPREFETCHER_SEQ_WINDOW_SIZE 4 + +/* + * When maintenance_io_concurrency is not saturated, we're prepared to look + * ahead up to N times that number of block references. + */ +#define XLOGPREFETCHER_DISTANCE_MULTIPLIER 4 + +/* Define to log internal debugging messages. */ +/* #define XLOGPREFETCHER_DEBUG_LEVEL LOG */ + +/* GUCs */ +int recovery_prefetch = RECOVERY_PREFETCH_TRY; + +#ifdef USE_PREFETCH +#define RecoveryPrefetchEnabled() (recovery_prefetch != RECOVERY_PREFETCH_OFF) +#else +#define RecoveryPrefetchEnabled() false +#endif + +static int XLogPrefetchReconfigureCount = 0; + +/* + * Enum used to report whether an IO should be started. + */ +typedef enum +{ + LRQ_NEXT_NO_IO, + LRQ_NEXT_IO, + LRQ_NEXT_AGAIN +} LsnReadQueueNextStatus; + +/* + * Type of callback that can decide which block to prefetch next. For now + * there is only one. + */ +typedef LsnReadQueueNextStatus (*LsnReadQueueNextFun) (uintptr_t lrq_private, + XLogRecPtr *lsn); + +/* + * A simple circular queue of LSNs, using to control the number of + * (potentially) inflight IOs. This stands in for a later more general IO + * control mechanism, which is why it has the apparently unnecessary + * indirection through a function pointer. + */ +typedef struct LsnReadQueue +{ + LsnReadQueueNextFun next; + uintptr_t lrq_private; + uint32 max_inflight; + uint32 inflight; + uint32 completed; + uint32 head; + uint32 tail; + uint32 size; + struct + { + bool io; + XLogRecPtr lsn; + } queue[FLEXIBLE_ARRAY_MEMBER]; +} LsnReadQueue; + +/* + * A prefetcher. This is a mechanism that wraps an XLogReader, prefetching + * blocks that will be soon be referenced, to try to avoid IO stalls. + */ +struct XLogPrefetcher +{ + /* WAL reader and current reading state. */ + XLogReaderState *reader; + DecodedXLogRecord *record; + int next_block_id; + + /* When to publish stats. */ + XLogRecPtr next_stats_shm_lsn; + + /* Book-keeping to avoid accessing blocks that don't exist yet. */ + HTAB *filter_table; + dlist_head filter_queue; + + /* Book-keeping to avoid repeat prefetches. */ + RelFileNode recent_rnode[XLOGPREFETCHER_SEQ_WINDOW_SIZE]; + BlockNumber recent_block[XLOGPREFETCHER_SEQ_WINDOW_SIZE]; + int recent_idx; + + /* Book-keeping to disable prefetching temporarily. */ + XLogRecPtr no_readahead_until; + + /* IO depth manager. */ + LsnReadQueue *streaming_read; + + XLogRecPtr begin_ptr; + + int reconfigure_count; +}; + +/* + * A temporary filter used to track block ranges that haven't been created + * yet, whole relations that haven't been created yet, and whole relations + * that (we assume) have already been dropped, or will be created by bulk WAL + * operators. + */ +typedef struct XLogPrefetcherFilter +{ + RelFileNode rnode; + XLogRecPtr filter_until_replayed; + BlockNumber filter_from_block; + dlist_node link; +} XLogPrefetcherFilter; + +/* + * Counters exposed in shared memory for pg_stat_recovery_prefetch. + */ +typedef struct XLogPrefetchStats +{ + pg_atomic_uint64 reset_time; /* Time of last reset. */ + pg_atomic_uint64 prefetch; /* Prefetches initiated. */ + pg_atomic_uint64 hit; /* Blocks already in cache. */ + pg_atomic_uint64 skip_init; /* Zero-inited blocks skipped. */ + pg_atomic_uint64 skip_new; /* New/missing blocks filtered. */ + pg_atomic_uint64 skip_fpw; /* FPWs skipped. */ + pg_atomic_uint64 skip_rep; /* Repeat accesses skipped. */ + + /* Dynamic values */ + int wal_distance; /* Number of WAL bytes ahead. */ + int block_distance; /* Number of block references ahead. */ + int io_depth; /* Number of I/Os in progress. */ +} XLogPrefetchStats; + +static inline void XLogPrefetcherAddFilter(XLogPrefetcher *prefetcher, + RelFileNode rnode, + BlockNumber blockno, + XLogRecPtr lsn); +static inline bool XLogPrefetcherIsFiltered(XLogPrefetcher *prefetcher, + RelFileNode rnode, + BlockNumber blockno); +static inline void XLogPrefetcherCompleteFilters(XLogPrefetcher *prefetcher, + XLogRecPtr replaying_lsn); +static LsnReadQueueNextStatus XLogPrefetcherNextBlock(uintptr_t pgsr_private, + XLogRecPtr *lsn); + +static XLogPrefetchStats *SharedStats; + +static inline LsnReadQueue * +lrq_alloc(uint32 max_distance, + uint32 max_inflight, + uintptr_t lrq_private, + LsnReadQueueNextFun next) +{ + LsnReadQueue *lrq; + uint32 size; + + Assert(max_distance >= max_inflight); + + size = max_distance + 1; /* full ring buffer has a gap */ + lrq = palloc(offsetof(LsnReadQueue, queue) + sizeof(lrq->queue[0]) * size); + lrq->lrq_private = lrq_private; + lrq->max_inflight = max_inflight; + lrq->size = size; + lrq->next = next; + lrq->head = 0; + lrq->tail = 0; + lrq->inflight = 0; + lrq->completed = 0; + + return lrq; +} + +static inline void +lrq_free(LsnReadQueue *lrq) +{ + pfree(lrq); +} + +static inline uint32 +lrq_inflight(LsnReadQueue *lrq) +{ + return lrq->inflight; +} + +static inline uint32 +lrq_completed(LsnReadQueue *lrq) +{ + return lrq->completed; +} + +static inline void +lrq_prefetch(LsnReadQueue *lrq) +{ + /* Try to start as many IOs as we can within our limits. */ + while (lrq->inflight < lrq->max_inflight && + lrq->inflight + lrq->completed < lrq->size - 1) + { + Assert(((lrq->head + 1) % lrq->size) != lrq->tail); + switch (lrq->next(lrq->lrq_private, &lrq->queue[lrq->head].lsn)) + { + case LRQ_NEXT_AGAIN: + return; + case LRQ_NEXT_IO: + lrq->queue[lrq->head].io = true; + lrq->inflight++; + break; + case LRQ_NEXT_NO_IO: + lrq->queue[lrq->head].io = false; + lrq->completed++; + break; + } + lrq->head++; + if (lrq->head == lrq->size) + lrq->head = 0; + } +} + +static inline void +lrq_complete_lsn(LsnReadQueue *lrq, XLogRecPtr lsn) +{ + /* + * We know that LSNs before 'lsn' have been replayed, so we can now assume + * that any IOs that were started before then have finished. + */ + while (lrq->tail != lrq->head && + lrq->queue[lrq->tail].lsn < lsn) + { + if (lrq->queue[lrq->tail].io) + lrq->inflight--; + else + lrq->completed--; + lrq->tail++; + if (lrq->tail == lrq->size) + lrq->tail = 0; + } + if (RecoveryPrefetchEnabled()) + lrq_prefetch(lrq); +} + +size_t +XLogPrefetchShmemSize(void) +{ + return sizeof(XLogPrefetchStats); +} + +/* + * Reset all counters to zero. + */ +void +XLogPrefetchResetStats(void) +{ + pg_atomic_write_u64(&SharedStats->reset_time, GetCurrentTimestamp()); + pg_atomic_write_u64(&SharedStats->prefetch, 0); + pg_atomic_write_u64(&SharedStats->hit, 0); + pg_atomic_write_u64(&SharedStats->skip_init, 0); + pg_atomic_write_u64(&SharedStats->skip_new, 0); + pg_atomic_write_u64(&SharedStats->skip_fpw, 0); + pg_atomic_write_u64(&SharedStats->skip_rep, 0); +} + +void +XLogPrefetchShmemInit(void) +{ + bool found; + + SharedStats = (XLogPrefetchStats *) + ShmemInitStruct("XLogPrefetchStats", + sizeof(XLogPrefetchStats), + &found); + + if (!found) + { + pg_atomic_init_u64(&SharedStats->reset_time, GetCurrentTimestamp()); + pg_atomic_init_u64(&SharedStats->prefetch, 0); + pg_atomic_init_u64(&SharedStats->hit, 0); + pg_atomic_init_u64(&SharedStats->skip_init, 0); + pg_atomic_init_u64(&SharedStats->skip_new, 0); + pg_atomic_init_u64(&SharedStats->skip_fpw, 0); + pg_atomic_init_u64(&SharedStats->skip_rep, 0); + } +} + +/* + * Called when any GUC is changed that affects prefetching. + */ +void +XLogPrefetchReconfigure(void) +{ + XLogPrefetchReconfigureCount++; +} + +/* + * Increment a counter in shared memory. This is equivalent to *counter++ on a + * plain uint64 without any memory barrier or locking, except on platforms + * where readers can't read uint64 without possibly observing a torn value. + */ +static inline void +XLogPrefetchIncrement(pg_atomic_uint64 *counter) +{ + Assert(AmStartupProcess() || !IsUnderPostmaster); + pg_atomic_write_u64(counter, pg_atomic_read_u64(counter) + 1); +} + +/* + * Create a prefetcher that is ready to begin prefetching blocks referenced by + * WAL records. + */ +XLogPrefetcher * +XLogPrefetcherAllocate(XLogReaderState *reader) +{ + XLogPrefetcher *prefetcher; + static HASHCTL hash_table_ctl = { + .keysize = sizeof(RelFileNode), + .entrysize = sizeof(XLogPrefetcherFilter) + }; + + prefetcher = palloc0(sizeof(XLogPrefetcher)); + + prefetcher->reader = reader; + prefetcher->filter_table = hash_create("XLogPrefetcherFilterTable", 1024, + &hash_table_ctl, + HASH_ELEM | HASH_BLOBS); + dlist_init(&prefetcher->filter_queue); + + SharedStats->wal_distance = 0; + SharedStats->block_distance = 0; + SharedStats->io_depth = 0; + + /* First usage will cause streaming_read to be allocated. */ + prefetcher->reconfigure_count = XLogPrefetchReconfigureCount - 1; + + return prefetcher; +} + +/* + * Destroy a prefetcher and release all resources. + */ +void +XLogPrefetcherFree(XLogPrefetcher *prefetcher) +{ + lrq_free(prefetcher->streaming_read); + hash_destroy(prefetcher->filter_table); + pfree(prefetcher); +} + +/* + * Provide access to the reader. + */ +XLogReaderState * +XLogPrefetcherGetReader(XLogPrefetcher *prefetcher) +{ + return prefetcher->reader; +} + +/* + * Update the statistics visible in the pg_stat_recovery_prefetch view. + */ +void +XLogPrefetcherComputeStats(XLogPrefetcher *prefetcher) +{ + uint32 io_depth; + uint32 completed; + int64 wal_distance; + + + /* How far ahead of replay are we now? */ + if (prefetcher->reader->decode_queue_tail) + { + wal_distance = + prefetcher->reader->decode_queue_tail->lsn - + prefetcher->reader->decode_queue_head->lsn; + } + else + { + wal_distance = 0; + } + + /* How many IOs are currently in flight and completed? */ + io_depth = lrq_inflight(prefetcher->streaming_read); + completed = lrq_completed(prefetcher->streaming_read); + + /* Update the instantaneous stats visible in pg_stat_recovery_prefetch. */ + SharedStats->io_depth = io_depth; + SharedStats->block_distance = io_depth + completed; + SharedStats->wal_distance = wal_distance; + + prefetcher->next_stats_shm_lsn = + prefetcher->reader->ReadRecPtr + XLOGPREFETCHER_STATS_DISTANCE; +} + +/* + * A callback that examines the next block reference in the WAL, and possibly + * starts an IO so that a later read will be fast. + * + * Returns LRQ_NEXT_AGAIN if no more WAL data is available yet. + * + * Returns LRQ_NEXT_IO if the next block reference is for a main fork block + * that isn't in the buffer pool, and the kernel has been asked to start + * reading it to make a future read system call faster. An LSN is written to + * *lsn, and the I/O will be considered to have completed once that LSN is + * replayed. + * + * Returns LRQ_NO_IO if we examined the next block reference and found that it + * was already in the buffer pool, or we decided for various reasons not to + * prefetch. + */ +static LsnReadQueueNextStatus +XLogPrefetcherNextBlock(uintptr_t pgsr_private, XLogRecPtr *lsn) +{ + XLogPrefetcher *prefetcher = (XLogPrefetcher *) pgsr_private; + XLogReaderState *reader = prefetcher->reader; + XLogRecPtr replaying_lsn = reader->ReadRecPtr; + + /* + * We keep track of the record and block we're up to between calls with + * prefetcher->record and prefetcher->next_block_id. + */ + for (;;) + { + DecodedXLogRecord *record; + + /* Try to read a new future record, if we don't already have one. */ + if (prefetcher->record == NULL) + { + bool nonblocking; + + /* + * If there are already records or an error queued up that could + * be replayed, we don't want to block here. Otherwise, it's OK + * to block waiting for more data: presumably the caller has + * nothing else to do. + */ + nonblocking = XLogReaderHasQueuedRecordOrError(reader); + + /* Certain records act as barriers for all readahead. */ + if (nonblocking && replaying_lsn < prefetcher->no_readahead_until) + return LRQ_NEXT_AGAIN; + + record = XLogReadAhead(prefetcher->reader, nonblocking); + if (record == NULL) + { + /* + * We can't read any more, due to an error or lack of data in + * nonblocking mode. + */ + return LRQ_NEXT_AGAIN; + } + + /* + * If prefetching is disabled, we don't need to analyze the record + * or issue any prefetches. We just need to cause one record to + * be decoded. + */ + if (!RecoveryPrefetchEnabled()) + { + *lsn = InvalidXLogRecPtr; + return LRQ_NEXT_NO_IO; + } + + /* We have a new record to process. */ + prefetcher->record = record; + prefetcher->next_block_id = 0; + } + else + { + /* Continue to process from last call, or last loop. */ + record = prefetcher->record; + } + + /* + * Check for operations that require us to filter out block ranges, or + * pause readahead completely. + */ + if (replaying_lsn < record->lsn) + { + uint8 rmid = record->header.xl_rmid; + uint8 record_type = record->header.xl_info & ~XLR_INFO_MASK; + + if (rmid == RM_XLOG_ID) + { + if (record_type == XLOG_CHECKPOINT_SHUTDOWN || + record_type == XLOG_END_OF_RECOVERY) + { + /* + * These records might change the TLI. Avoid potential + * bugs if we were to allow "read TLI" and "replay TLI" to + * differ without more analysis. + */ + prefetcher->no_readahead_until = record->lsn; + +#ifdef XLOGPREFETCHER_DEBUG_LEVEL + elog(XLOGPREFETCHER_DEBUG_LEVEL, + "suppressing all readahead until %X/%X is replayed due to possible TLI change", + LSN_FORMAT_ARGS(record->lsn)); +#endif + + /* Fall through so we move past this record. */ + } + } + else if (rmid == RM_DBASE_ID) + { + /* + * When databases are created with the file-copy strategy, + * there are no WAL records to tell us about the creation of + * individual relations. + */ + if (record_type == XLOG_DBASE_CREATE_FILE_COPY) + { + xl_dbase_create_file_copy_rec *xlrec = + (xl_dbase_create_file_copy_rec *) record->main_data; + RelFileNode rnode = {InvalidOid, xlrec->db_id, InvalidOid}; + + /* + * Don't try to prefetch anything in this database until + * it has been created, or we might confuse the blocks of + * different generations, if a database OID or relfilenode + * is reused. It's also more efficient than discovering + * that relations don't exist on disk yet with ENOENT + * errors. + */ + XLogPrefetcherAddFilter(prefetcher, rnode, 0, record->lsn); + +#ifdef XLOGPREFETCHER_DEBUG_LEVEL + elog(XLOGPREFETCHER_DEBUG_LEVEL, + "suppressing prefetch in database %u until %X/%X is replayed due to raw file copy", + rnode.dbNode, + LSN_FORMAT_ARGS(record->lsn)); +#endif + } + } + else if (rmid == RM_SMGR_ID) + { + if (record_type == XLOG_SMGR_CREATE) + { + xl_smgr_create *xlrec = (xl_smgr_create *) + record->main_data; + + if (xlrec->forkNum == MAIN_FORKNUM) + { + /* + * Don't prefetch anything for this whole relation + * until it has been created. Otherwise we might + * confuse the blocks of different generations, if a + * relfilenode is reused. This also avoids the need + * to discover the problem via extra syscalls that + * report ENOENT. + */ + XLogPrefetcherAddFilter(prefetcher, xlrec->rnode, 0, + record->lsn); + +#ifdef XLOGPREFETCHER_DEBUG_LEVEL + elog(XLOGPREFETCHER_DEBUG_LEVEL, + "suppressing prefetch in relation %u/%u/%u until %X/%X is replayed, which creates the relation", + xlrec->rnode.spcNode, + xlrec->rnode.dbNode, + xlrec->rnode.relNode, + LSN_FORMAT_ARGS(record->lsn)); +#endif + } + } + else if (record_type == XLOG_SMGR_TRUNCATE) + { + xl_smgr_truncate *xlrec = (xl_smgr_truncate *) + record->main_data; + + /* + * Don't consider prefetching anything in the truncated + * range until the truncation has been performed. + */ + XLogPrefetcherAddFilter(prefetcher, xlrec->rnode, + xlrec->blkno, + record->lsn); + +#ifdef XLOGPREFETCHER_DEBUG_LEVEL + elog(XLOGPREFETCHER_DEBUG_LEVEL, + "suppressing prefetch in relation %u/%u/%u from block %u until %X/%X is replayed, which truncates the relation", + xlrec->rnode.spcNode, + xlrec->rnode.dbNode, + xlrec->rnode.relNode, + xlrec->blkno, + LSN_FORMAT_ARGS(record->lsn)); +#endif + } + } + } + + /* Scan the block references, starting where we left off last time. */ + while (prefetcher->next_block_id <= record->max_block_id) + { + int block_id = prefetcher->next_block_id++; + DecodedBkpBlock *block = &record->blocks[block_id]; + SMgrRelation reln; + PrefetchBufferResult result; + + if (!block->in_use) + continue; + + Assert(!BufferIsValid(block->prefetch_buffer));; + + /* + * Record the LSN of this record. When it's replayed, + * LsnReadQueue will consider any IOs submitted for earlier LSNs + * to be finished. + */ + *lsn = record->lsn; + + /* We don't try to prefetch anything but the main fork for now. */ + if (block->forknum != MAIN_FORKNUM) + { + return LRQ_NEXT_NO_IO; + } + + /* + * If there is a full page image attached, we won't be reading the + * page, so don't bother trying to prefetch. + */ + if (block->has_image) + { + XLogPrefetchIncrement(&SharedStats->skip_fpw); + return LRQ_NEXT_NO_IO; + } + + /* There is no point in reading a page that will be zeroed. */ + if (block->flags & BKPBLOCK_WILL_INIT) + { + XLogPrefetchIncrement(&SharedStats->skip_init); + return LRQ_NEXT_NO_IO; + } + + /* Should we skip prefetching this block due to a filter? */ + if (XLogPrefetcherIsFiltered(prefetcher, block->rnode, block->blkno)) + { + XLogPrefetchIncrement(&SharedStats->skip_new); + return LRQ_NEXT_NO_IO; + } + + /* There is no point in repeatedly prefetching the same block. */ + for (int i = 0; i < XLOGPREFETCHER_SEQ_WINDOW_SIZE; ++i) + { + if (block->blkno == prefetcher->recent_block[i] && + RelFileNodeEquals(block->rnode, prefetcher->recent_rnode[i])) + { + /* + * XXX If we also remembered where it was, we could set + * recent_buffer so that recovery could skip smgropen() + * and a buffer table lookup. + */ + XLogPrefetchIncrement(&SharedStats->skip_rep); + return LRQ_NEXT_NO_IO; + } + } + prefetcher->recent_rnode[prefetcher->recent_idx] = block->rnode; + prefetcher->recent_block[prefetcher->recent_idx] = block->blkno; + prefetcher->recent_idx = + (prefetcher->recent_idx + 1) % XLOGPREFETCHER_SEQ_WINDOW_SIZE; + + /* + * We could try to have a fast path for repeated references to the + * same relation (with some scheme to handle invalidations + * safely), but for now we'll call smgropen() every time. + */ + reln = smgropen(block->rnode, InvalidBackendId); + + /* + * If the relation file doesn't exist on disk, for example because + * we're replaying after a crash and the file will be created and + * then unlinked by WAL that hasn't been replayed yet, suppress + * further prefetching in the relation until this record is + * replayed. + */ + if (!smgrexists(reln, MAIN_FORKNUM)) + { +#ifdef XLOGPREFETCHER_DEBUG_LEVEL + elog(XLOGPREFETCHER_DEBUG_LEVEL, + "suppressing all prefetch in relation %u/%u/%u until %X/%X is replayed, because the relation does not exist on disk", + reln->smgr_rnode.node.spcNode, + reln->smgr_rnode.node.dbNode, + reln->smgr_rnode.node.relNode, + LSN_FORMAT_ARGS(record->lsn)); +#endif + XLogPrefetcherAddFilter(prefetcher, block->rnode, 0, + record->lsn); + XLogPrefetchIncrement(&SharedStats->skip_new); + return LRQ_NEXT_NO_IO; + } + + /* + * If the relation isn't big enough to contain the referenced + * block yet, suppress prefetching of this block and higher until + * this record is replayed. + */ + if (block->blkno >= smgrnblocks(reln, block->forknum)) + { +#ifdef XLOGPREFETCHER_DEBUG_LEVEL + elog(XLOGPREFETCHER_DEBUG_LEVEL, + "suppressing prefetch in relation %u/%u/%u from block %u until %X/%X is replayed, because the relation is too small", + reln->smgr_rnode.node.spcNode, + reln->smgr_rnode.node.dbNode, + reln->smgr_rnode.node.relNode, + block->blkno, + LSN_FORMAT_ARGS(record->lsn)); +#endif + XLogPrefetcherAddFilter(prefetcher, block->rnode, block->blkno, + record->lsn); + XLogPrefetchIncrement(&SharedStats->skip_new); + return LRQ_NEXT_NO_IO; + } + + /* Try to initiate prefetching. */ + result = PrefetchSharedBuffer(reln, block->forknum, block->blkno); + if (BufferIsValid(result.recent_buffer)) + { + /* Cache hit, nothing to do. */ + XLogPrefetchIncrement(&SharedStats->hit); + block->prefetch_buffer = result.recent_buffer; + return LRQ_NEXT_NO_IO; + } + else if (result.initiated_io) + { + /* Cache miss, I/O (presumably) started. */ + XLogPrefetchIncrement(&SharedStats->prefetch); + block->prefetch_buffer = InvalidBuffer; + return LRQ_NEXT_IO; + } + else + { + /* + * This shouldn't be possible, because we already determined + * that the relation exists on disk and is big enough. + * Something is wrong with the cache invalidation for + * smgrexists(), smgrnblocks(), or the file was unlinked or + * truncated beneath our feet? + */ + elog(ERROR, + "could not prefetch relation %u/%u/%u block %u", + reln->smgr_rnode.node.spcNode, + reln->smgr_rnode.node.dbNode, + reln->smgr_rnode.node.relNode, + block->blkno); + } + } + + /* + * Several callsites need to be able to read exactly one record + * without any internal readahead. Examples: xlog.c reading + * checkpoint records with emode set to PANIC, which might otherwise + * cause XLogPageRead() to panic on some future page, and xlog.c + * determining where to start writing WAL next, which depends on the + * contents of the reader's internal buffer after reading one record. + * Therefore, don't even think about prefetching until the first + * record after XLogPrefetcherBeginRead() has been consumed. + */ + if (prefetcher->reader->decode_queue_tail && + prefetcher->reader->decode_queue_tail->lsn == prefetcher->begin_ptr) + return LRQ_NEXT_AGAIN; + + /* Advance to the next record. */ + prefetcher->record = NULL; + } + pg_unreachable(); +} + +/* + * Expose statistics about recovery prefetching. + */ +Datum +pg_stat_get_recovery_prefetch(PG_FUNCTION_ARGS) +{ +#define PG_STAT_GET_RECOVERY_PREFETCH_COLS 10 + ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; + Datum values[PG_STAT_GET_RECOVERY_PREFETCH_COLS]; + bool nulls[PG_STAT_GET_RECOVERY_PREFETCH_COLS]; + + SetSingleFuncCall(fcinfo, 0); + + for (int i = 0; i < PG_STAT_GET_RECOVERY_PREFETCH_COLS; ++i) + nulls[i] = false; + + values[0] = TimestampTzGetDatum(pg_atomic_read_u64(&SharedStats->reset_time)); + values[1] = Int64GetDatum(pg_atomic_read_u64(&SharedStats->prefetch)); + values[2] = Int64GetDatum(pg_atomic_read_u64(&SharedStats->hit)); + values[3] = Int64GetDatum(pg_atomic_read_u64(&SharedStats->skip_init)); + values[4] = Int64GetDatum(pg_atomic_read_u64(&SharedStats->skip_new)); + values[5] = Int64GetDatum(pg_atomic_read_u64(&SharedStats->skip_fpw)); + values[6] = Int64GetDatum(pg_atomic_read_u64(&SharedStats->skip_rep)); + values[7] = Int32GetDatum(SharedStats->wal_distance); + values[8] = Int32GetDatum(SharedStats->block_distance); + values[9] = Int32GetDatum(SharedStats->io_depth); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); + + return (Datum) 0; +} + +/* + * Don't prefetch any blocks >= 'blockno' from a given 'rnode', until 'lsn' + * has been replayed. + */ +static inline void +XLogPrefetcherAddFilter(XLogPrefetcher *prefetcher, RelFileNode rnode, + BlockNumber blockno, XLogRecPtr lsn) +{ + XLogPrefetcherFilter *filter; + bool found; + + filter = hash_search(prefetcher->filter_table, &rnode, HASH_ENTER, &found); + if (!found) + { + /* + * Don't allow any prefetching of this block or higher until replayed. + */ + filter->filter_until_replayed = lsn; + filter->filter_from_block = blockno; + dlist_push_head(&prefetcher->filter_queue, &filter->link); + } + else + { + /* + * We were already filtering this rnode. Extend the filter's lifetime + * to cover this WAL record, but leave the lower of the block numbers + * there because we don't want to have to track individual blocks. + */ + filter->filter_until_replayed = lsn; + dlist_delete(&filter->link); + dlist_push_head(&prefetcher->filter_queue, &filter->link); + filter->filter_from_block = Min(filter->filter_from_block, blockno); + } +} + +/* + * Have we replayed any records that caused us to begin filtering a block + * range? That means that relations should have been created, extended or + * dropped as required, so we can stop filtering out accesses to a given + * relfilenode. + */ +static inline void +XLogPrefetcherCompleteFilters(XLogPrefetcher *prefetcher, XLogRecPtr replaying_lsn) +{ + while (unlikely(!dlist_is_empty(&prefetcher->filter_queue))) + { + XLogPrefetcherFilter *filter = dlist_tail_element(XLogPrefetcherFilter, + link, + &prefetcher->filter_queue); + + if (filter->filter_until_replayed >= replaying_lsn) + break; + + dlist_delete(&filter->link); + hash_search(prefetcher->filter_table, filter, HASH_REMOVE, NULL); + } +} + +/* + * Check if a given block should be skipped due to a filter. + */ +static inline bool +XLogPrefetcherIsFiltered(XLogPrefetcher *prefetcher, RelFileNode rnode, + BlockNumber blockno) +{ + /* + * Test for empty queue first, because we expect it to be empty most of + * the time and we can avoid the hash table lookup in that case. + */ + if (unlikely(!dlist_is_empty(&prefetcher->filter_queue))) + { + XLogPrefetcherFilter *filter; + + /* See if the block range is filtered. */ + filter = hash_search(prefetcher->filter_table, &rnode, HASH_FIND, NULL); + if (filter && filter->filter_from_block <= blockno) + { +#ifdef XLOGPREFETCHER_DEBUG_LEVEL + elog(XLOGPREFETCHER_DEBUG_LEVEL, + "prefetch of %u/%u/%u block %u suppressed; filtering until LSN %X/%X is replayed (blocks >= %u filtered)", + rnode.spcNode, rnode.dbNode, rnode.relNode, blockno, + LSN_FORMAT_ARGS(filter->filter_until_replayed), + filter->filter_from_block); +#endif + return true; + } + + /* See if the whole database is filtered. */ + rnode.relNode = InvalidOid; + rnode.spcNode = InvalidOid; + filter = hash_search(prefetcher->filter_table, &rnode, HASH_FIND, NULL); + if (filter) + { +#ifdef XLOGPREFETCHER_DEBUG_LEVEL + elog(XLOGPREFETCHER_DEBUG_LEVEL, + "prefetch of %u/%u/%u block %u suppressed; filtering until LSN %X/%X is replayed (whole database)", + rnode.spcNode, rnode.dbNode, rnode.relNode, blockno, + LSN_FORMAT_ARGS(filter->filter_until_replayed)); +#endif + return true; + } + } + + return false; +} + +/* + * A wrapper for XLogBeginRead() that also resets the prefetcher. + */ +void +XLogPrefetcherBeginRead(XLogPrefetcher *prefetcher, XLogRecPtr recPtr) +{ + /* This will forget about any in-flight IO. */ + prefetcher->reconfigure_count--; + + /* Book-keeping to avoid readahead on first read. */ + prefetcher->begin_ptr = recPtr; + + prefetcher->no_readahead_until = 0; + + /* This will forget about any queued up records in the decoder. */ + XLogBeginRead(prefetcher->reader, recPtr); +} + +/* + * A wrapper for XLogReadRecord() that provides the same interface, but also + * tries to initiate I/O for blocks referenced in future WAL records. + */ +XLogRecord * +XLogPrefetcherReadRecord(XLogPrefetcher *prefetcher, char **errmsg) +{ + DecodedXLogRecord *record; + + /* + * See if it's time to reset the prefetching machinery, because a relevant + * GUC was changed. + */ + if (unlikely(XLogPrefetchReconfigureCount != prefetcher->reconfigure_count)) + { + uint32 max_distance; + uint32 max_inflight; + + if (prefetcher->streaming_read) + lrq_free(prefetcher->streaming_read); + + if (RecoveryPrefetchEnabled()) + { + max_inflight = Max(maintenance_io_concurrency, 2); + max_distance = max_inflight * XLOGPREFETCHER_DISTANCE_MULTIPLIER; + } + else + { + max_inflight = 1; + max_distance = 1; + } + + prefetcher->streaming_read = lrq_alloc(max_distance, + max_inflight, + (uintptr_t) prefetcher, + XLogPrefetcherNextBlock); + + prefetcher->reconfigure_count = XLogPrefetchReconfigureCount; + } + + /* + * Release last returned record, if there is one. We need to do this so + * that we can check for empty decode queue accurately. + */ + XLogReleasePreviousRecord(prefetcher->reader); + + /* If there's nothing queued yet, then start prefetching. */ + if (!XLogReaderHasQueuedRecordOrError(prefetcher->reader)) + lrq_prefetch(prefetcher->streaming_read); + + /* Read the next record. */ + record = XLogNextRecord(prefetcher->reader, errmsg); + if (!record) + return NULL; + + /* + * The record we just got is the "current" one, for the benefit of the + * XLogRecXXX() macros. + */ + Assert(record == prefetcher->reader->record); + + /* + * Can we drop any prefetch filters yet, given the record we're about to + * return? This assumes that any records with earlier LSNs have been + * replayed, so if we were waiting for a relation to be created or + * extended, it is now OK to access blocks in the covered range. + */ + XLogPrefetcherCompleteFilters(prefetcher, record->lsn); + + /* + * See if it's time to compute some statistics, because enough WAL has + * been processed. + */ + if (unlikely(record->lsn >= prefetcher->next_stats_shm_lsn)) + XLogPrefetcherComputeStats(prefetcher); + + /* + * The caller is about to replay this record, so we can now report that + * all IO initiated because of early WAL must be finished. This may + * trigger more readahead. + */ + lrq_complete_lsn(prefetcher->streaming_read, record->lsn); + + Assert(record == prefetcher->reader->record); + + return &record->header; +} + +bool +check_recovery_prefetch(int *new_value, void **extra, GucSource source) +{ +#ifndef USE_PREFETCH + if (*new_value == RECOVERY_PREFETCH_ON) + { + GUC_check_errdetail("recovery_prefetch not supported on platforms that lack posix_fadvise()."); + return false; + } +#endif + + return true; +} + +void +assign_recovery_prefetch(int new_value, void *extra) +{ + /* Reconfigure prefetching, because a setting it depends on changed. */ + recovery_prefetch = new_value; + if (AmStartupProcess()) + XLogPrefetchReconfigure(); +} diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index e612aa933a..5862d9dc75 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1727,6 +1727,8 @@ DecodeXLogRecord(XLogReaderState *state, blk->has_image = ((fork_flags & BKPBLOCK_HAS_IMAGE) != 0); blk->has_data = ((fork_flags & BKPBLOCK_HAS_DATA) != 0); + blk->prefetch_buffer = InvalidBuffer; + COPY_HEADER_FIELD(&blk->data_len, sizeof(uint16)); /* cross-check that the HAS_DATA flag is set iff data_length > 0 */ if (blk->has_data && blk->data_len == 0) @@ -1925,14 +1927,29 @@ DecodeXLogRecord(XLogReaderState *state, /* * Returns information about the block that a block reference refers to. - * - * If the WAL record contains a block reference with the given ID, *rnode, - * *forknum, and *blknum are filled in (if not NULL), and returns true. - * Otherwise returns false. + * See XLogRecGetBlockTagExtended(). */ bool XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id, RelFileNode *rnode, ForkNumber *forknum, BlockNumber *blknum) +{ + return XLogRecGetBlockTagExtended(record, block_id, rnode, forknum, blknum, + NULL); +} + +/* + * Returns information about the block that a block reference refers to, + * optionally including the buffer that the block may already be in. + * + * If the WAL record contains a block reference with the given ID, *rnode, + * *forknum, *blknum and *prefetch_buffer are filled in (if not NULL), and + * returns true. Otherwise returns false. + */ +bool +XLogRecGetBlockTagExtended(XLogReaderState *record, uint8 block_id, + RelFileNode *rnode, ForkNumber *forknum, + BlockNumber *blknum, + Buffer *prefetch_buffer) { DecodedBkpBlock *bkpb; @@ -1947,6 +1964,8 @@ XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id, *forknum = bkpb->forknum; if (blknum) *blknum = bkpb->blkno; + if (prefetch_buffer) + *prefetch_buffer = bkpb->prefetch_buffer; return true; } diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 79d38a837c..54fd10475a 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -36,6 +36,7 @@ #include "access/xact.h" #include "access/xlog_internal.h" #include "access/xlogarchive.h" +#include "access/xlogprefetcher.h" #include "access/xlogreader.h" #include "access/xlogrecovery.h" #include "access/xlogutils.h" @@ -183,6 +184,9 @@ static bool doRequestWalReceiverReply; /* XLogReader object used to parse the WAL records */ static XLogReaderState *xlogreader = NULL; +/* XLogPrefetcher object used to consume WAL records with read-ahead */ +static XLogPrefetcher *xlogprefetcher = NULL; + /* Parameters passed down from ReadRecord to the XLogPageRead callback. */ typedef struct XLogPageReadPrivate { @@ -404,18 +408,21 @@ static void recoveryPausesHere(bool endOfRecovery); static bool recoveryApplyDelay(XLogReaderState *record); static void ConfirmRecoveryPaused(void); -static XLogRecord *ReadRecord(XLogReaderState *xlogreader, - int emode, bool fetching_ckpt, TimeLineID replayTLI); +static XLogRecord *ReadRecord(XLogPrefetcher *xlogprefetcher, + int emode, bool fetching_ckpt, + TimeLineID replayTLI); static int XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -static bool WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, - bool fetching_ckpt, - XLogRecPtr tliRecPtr, - TimeLineID replayTLI, - XLogRecPtr replayLSN); +static XLogPageReadResult WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, + bool randAccess, + bool fetching_ckpt, + XLogRecPtr tliRecPtr, + TimeLineID replayTLI, + XLogRecPtr replayLSN, + bool nonblocking); static int emode_for_corrupt_record(int emode, XLogRecPtr RecPtr); -static XLogRecord *ReadCheckpointRecord(XLogReaderState *xlogreader, XLogRecPtr RecPtr, +static XLogRecord *ReadCheckpointRecord(XLogPrefetcher *xlogprefetcher, XLogRecPtr RecPtr, int whichChkpt, bool report, TimeLineID replayTLI); static bool rescanLatestTimeLine(TimeLineID replayTLI, XLogRecPtr replayLSN); static int XLogFileRead(XLogSegNo segno, int emode, TimeLineID tli, @@ -561,6 +568,15 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, errdetail("Failed while allocating a WAL reading processor."))); xlogreader->system_identifier = ControlFile->system_identifier; + /* + * Set the WAL decode buffer size. This limits how far ahead we can read + * in the WAL. + */ + XLogReaderSetDecodeBuffer(xlogreader, NULL, wal_decode_buffer_size); + + /* Create a WAL prefetcher. */ + xlogprefetcher = XLogPrefetcherAllocate(xlogreader); + /* * Allocate two page buffers dedicated to WAL consistency checks. We do * it this way, rather than just making static arrays, for two reasons: @@ -589,7 +605,8 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, * When a backup_label file is present, we want to roll forward from * the checkpoint it identifies, rather than using pg_control. */ - record = ReadCheckpointRecord(xlogreader, CheckPointLoc, 0, true, CheckPointTLI); + record = ReadCheckpointRecord(xlogprefetcher, CheckPointLoc, 0, true, + CheckPointTLI); if (record != NULL) { memcpy(&checkPoint, XLogRecGetData(xlogreader), sizeof(CheckPoint)); @@ -607,8 +624,8 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, */ if (checkPoint.redo < CheckPointLoc) { - XLogBeginRead(xlogreader, checkPoint.redo); - if (!ReadRecord(xlogreader, LOG, false, + XLogPrefetcherBeginRead(xlogprefetcher, checkPoint.redo); + if (!ReadRecord(xlogprefetcher, LOG, false, checkPoint.ThisTimeLineID)) ereport(FATAL, (errmsg("could not find redo location referenced by checkpoint record"), @@ -727,7 +744,7 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, CheckPointTLI = ControlFile->checkPointCopy.ThisTimeLineID; RedoStartLSN = ControlFile->checkPointCopy.redo; RedoStartTLI = ControlFile->checkPointCopy.ThisTimeLineID; - record = ReadCheckpointRecord(xlogreader, CheckPointLoc, 1, true, + record = ReadCheckpointRecord(xlogprefetcher, CheckPointLoc, 1, true, CheckPointTLI); if (record != NULL) { @@ -1413,8 +1430,8 @@ FinishWalRecovery(void) lastRec = XLogRecoveryCtl->lastReplayedReadRecPtr; lastRecTLI = XLogRecoveryCtl->lastReplayedTLI; } - XLogBeginRead(xlogreader, lastRec); - (void) ReadRecord(xlogreader, PANIC, false, lastRecTLI); + XLogPrefetcherBeginRead(xlogprefetcher, lastRec); + (void) ReadRecord(xlogprefetcher, PANIC, false, lastRecTLI); endOfLog = xlogreader->EndRecPtr; /* @@ -1503,6 +1520,9 @@ ShutdownWalRecovery(void) { char recoveryPath[MAXPGPATH]; + /* Final update of pg_stat_recovery_prefetch. */ + XLogPrefetcherComputeStats(xlogprefetcher); + /* Shut down xlogreader */ if (readFile >= 0) { @@ -1510,6 +1530,7 @@ ShutdownWalRecovery(void) readFile = -1; } XLogReaderFree(xlogreader); + XLogPrefetcherFree(xlogprefetcher); if (ArchiveRecoveryRequested) { @@ -1593,15 +1614,15 @@ PerformWalRecovery(void) { /* back up to find the record */ replayTLI = RedoStartTLI; - XLogBeginRead(xlogreader, RedoStartLSN); - record = ReadRecord(xlogreader, PANIC, false, replayTLI); + XLogPrefetcherBeginRead(xlogprefetcher, RedoStartLSN); + record = ReadRecord(xlogprefetcher, PANIC, false, replayTLI); } else { /* just have to read next record after CheckPoint */ Assert(xlogreader->ReadRecPtr == CheckPointLoc); replayTLI = CheckPointTLI; - record = ReadRecord(xlogreader, LOG, false, replayTLI); + record = ReadRecord(xlogprefetcher, LOG, false, replayTLI); } if (record != NULL) @@ -1710,7 +1731,7 @@ PerformWalRecovery(void) } /* Else, try to fetch the next WAL record */ - record = ReadRecord(xlogreader, LOG, false, replayTLI); + record = ReadRecord(xlogprefetcher, LOG, false, replayTLI); } while (record != NULL); /* @@ -1921,6 +1942,9 @@ ApplyWalRecord(XLogReaderState *xlogreader, XLogRecord *record, TimeLineID *repl */ if (AllowCascadeReplication()) WalSndWakeup(); + + /* Reset the prefetcher. */ + XLogPrefetchReconfigure(); } } @@ -2305,7 +2329,8 @@ verifyBackupPageConsistency(XLogReaderState *record) * temporary page. */ buf = XLogReadBufferExtended(rnode, forknum, blkno, - RBM_NORMAL_NO_LOG); + RBM_NORMAL_NO_LOG, + InvalidBuffer); if (!BufferIsValid(buf)) continue; @@ -2917,17 +2942,18 @@ ConfirmRecoveryPaused(void) * Attempt to read the next XLOG record. * * Before first call, the reader needs to be positioned to the first record - * by calling XLogBeginRead(). + * by calling XLogPrefetcherBeginRead(). * * If no valid record is available, returns NULL, or fails if emode is PANIC. * (emode must be either PANIC, LOG). In standby mode, retries until a valid * record is available. */ static XLogRecord * -ReadRecord(XLogReaderState *xlogreader, int emode, +ReadRecord(XLogPrefetcher *xlogprefetcher, int emode, bool fetching_ckpt, TimeLineID replayTLI) { XLogRecord *record; + XLogReaderState *xlogreader = XLogPrefetcherGetReader(xlogprefetcher); XLogPageReadPrivate *private = (XLogPageReadPrivate *) xlogreader->private_data; /* Pass through parameters to XLogPageRead */ @@ -2943,7 +2969,7 @@ ReadRecord(XLogReaderState *xlogreader, int emode, { char *errormsg; - record = XLogReadRecord(xlogreader, &errormsg); + record = XLogPrefetcherReadRecord(xlogprefetcher, &errormsg); if (record == NULL) { /* @@ -3056,9 +3082,12 @@ ReadRecord(XLogReaderState *xlogreader, int emode, /* * Read the XLOG page containing RecPtr into readBuf (if not read already). - * Returns number of bytes read, if the page is read successfully, or -1 - * in case of errors. When errors occur, they are ereport'ed, but only - * if they have not been previously reported. + * Returns number of bytes read, if the page is read successfully, or + * XLREAD_FAIL in case of errors. When errors occur, they are ereport'ed, but + * only if they have not been previously reported. + * + * While prefetching, xlogreader->nonblocking may be set. In that case, + * returns XLREAD_WOULDBLOCK if we'd otherwise have to wait for more WAL. * * This is responsible for restoring files from archive as needed, as well * as for waiting for the requested WAL record to arrive in standby mode. @@ -3066,7 +3095,7 @@ ReadRecord(XLogReaderState *xlogreader, int emode, * 'emode' specifies the log level used for reporting "file not found" or * "end of WAL" situations in archive recovery, or in standby mode when a * trigger file is found. If set to WARNING or below, XLogPageRead() returns - * false in those situations, on higher log levels the ereport() won't + * XLREAD_FAIL in those situations, on higher log levels the ereport() won't * return. * * In standby mode, if after a successful return of XLogPageRead() the @@ -3125,20 +3154,31 @@ XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, (readSource == XLOG_FROM_STREAM && flushedUpto < targetPagePtr + reqLen)) { - if (!WaitForWALToBecomeAvailable(targetPagePtr + reqLen, - private->randAccess, - private->fetching_ckpt, - targetRecPtr, - private->replayTLI, - xlogreader->EndRecPtr)) + if (readFile >= 0 && + xlogreader->nonblocking && + readSource == XLOG_FROM_STREAM && + flushedUpto < targetPagePtr + reqLen) + return XLREAD_WOULDBLOCK; + + switch (WaitForWALToBecomeAvailable(targetPagePtr + reqLen, + private->randAccess, + private->fetching_ckpt, + targetRecPtr, + private->replayTLI, + xlogreader->EndRecPtr, + xlogreader->nonblocking)) { - if (readFile >= 0) - close(readFile); - readFile = -1; - readLen = 0; - readSource = XLOG_FROM_ANY; - - return -1; + case XLREAD_WOULDBLOCK: + return XLREAD_WOULDBLOCK; + case XLREAD_FAIL: + if (readFile >= 0) + close(readFile); + readFile = -1; + readLen = 0; + readSource = XLOG_FROM_ANY; + return XLREAD_FAIL; + case XLREAD_SUCCESS: + break; } } @@ -3263,7 +3303,7 @@ XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, if (StandbyMode) goto retry; else - return -1; + return XLREAD_FAIL; } /* @@ -3292,14 +3332,18 @@ XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, * available. * * When the requested record becomes available, the function opens the file - * containing it (if not open already), and returns true. When end of standby - * mode is triggered by the user, and there is no more WAL available, returns - * false. + * containing it (if not open already), and returns XLREAD_SUCCESS. When end + * of standby mode is triggered by the user, and there is no more WAL + * available, returns XLREAD_FAIL. + * + * If nonblocking is true, then give up immediately if we can't satisfy the + * request, returning XLREAD_WOULDBLOCK instead of waiting. */ -static bool +static XLogPageReadResult WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, bool fetching_ckpt, XLogRecPtr tliRecPtr, - TimeLineID replayTLI, XLogRecPtr replayLSN) + TimeLineID replayTLI, XLogRecPtr replayLSN, + bool nonblocking) { static TimestampTz last_fail_time = 0; TimestampTz now; @@ -3353,6 +3397,14 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, */ if (lastSourceFailed) { + /* + * Don't allow any retry loops to occur during nonblocking + * readahead. Let the caller process everything that has been + * decoded already first. + */ + if (nonblocking) + return XLREAD_WOULDBLOCK; + switch (currentSource) { case XLOG_FROM_ARCHIVE: @@ -3367,7 +3419,7 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, if (StandbyMode && CheckForStandbyTrigger()) { XLogShutdownWalRcv(); - return false; + return XLREAD_FAIL; } /* @@ -3375,7 +3427,7 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, * and pg_wal. */ if (!StandbyMode) - return false; + return XLREAD_FAIL; /* * Move to XLOG_FROM_STREAM state, and set to start a @@ -3519,7 +3571,7 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, currentSource == XLOG_FROM_ARCHIVE ? XLOG_FROM_ANY : currentSource); if (readFile >= 0) - return true; /* success! */ + return XLREAD_SUCCESS; /* success! */ /* * Nope, not found in archive or pg_wal. @@ -3674,11 +3726,15 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, /* just make sure source info is correct... */ readSource = XLOG_FROM_STREAM; XLogReceiptSource = XLOG_FROM_STREAM; - return true; + return XLREAD_SUCCESS; } break; } + /* In nonblocking mode, return rather than sleeping. */ + if (nonblocking) + return XLREAD_WOULDBLOCK; + /* * Data not here yet. Check for trigger, then wait for * walreceiver to wake us up when new WAL arrives. @@ -3686,13 +3742,13 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, if (CheckForStandbyTrigger()) { /* - * Note that we don't "return false" immediately here. - * After being triggered, we still want to replay all - * the WAL that was already streamed. It's in pg_wal - * now, so we just treat this as a failure, and the - * state machine will move on to replay the streamed - * WAL from pg_wal, and then recheck the trigger and - * exit replay. + * Note that we don't return XLREAD_FAIL immediately + * here. After being triggered, we still want to + * replay all the WAL that was already streamed. It's + * in pg_wal now, so we just treat this as a failure, + * and the state machine will move on to replay the + * streamed WAL from pg_wal, and then recheck the + * trigger and exit replay. */ lastSourceFailed = true; break; @@ -3711,6 +3767,9 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, streaming_reply_sent = true; } + /* Update pg_stat_recovery_prefetch before sleeping. */ + XLogPrefetcherComputeStats(xlogprefetcher); + /* * Wait for more WAL to arrive. Time out after 5 seconds * to react to a trigger file promptly and to check if the @@ -3743,7 +3802,7 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, HandleStartupProcInterrupts(); } - return false; /* not reached */ + return XLREAD_FAIL; /* not reached */ } @@ -3788,7 +3847,7 @@ emode_for_corrupt_record(int emode, XLogRecPtr RecPtr) * 1 for "primary", 0 for "other" (backup_label) */ static XLogRecord * -ReadCheckpointRecord(XLogReaderState *xlogreader, XLogRecPtr RecPtr, +ReadCheckpointRecord(XLogPrefetcher *xlogprefetcher, XLogRecPtr RecPtr, int whichChkpt, bool report, TimeLineID replayTLI) { XLogRecord *record; @@ -3815,8 +3874,8 @@ ReadCheckpointRecord(XLogReaderState *xlogreader, XLogRecPtr RecPtr, return NULL; } - XLogBeginRead(xlogreader, RecPtr); - record = ReadRecord(xlogreader, LOG, true, replayTLI); + XLogPrefetcherBeginRead(xlogprefetcher, RecPtr); + record = ReadRecord(xlogprefetcher, LOG, true, replayTLI); if (record == NULL) { diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index a4dedc58b7..bb2d3ec991 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -22,6 +22,7 @@ #include "access/timeline.h" #include "access/xlogrecovery.h" #include "access/xlog_internal.h" +#include "access/xlogprefetcher.h" #include "access/xlogutils.h" #include "miscadmin.h" #include "pgstat.h" @@ -355,11 +356,13 @@ XLogReadBufferForRedoExtended(XLogReaderState *record, RelFileNode rnode; ForkNumber forknum; BlockNumber blkno; + Buffer prefetch_buffer; Page page; bool zeromode; bool willinit; - if (!XLogRecGetBlockTag(record, block_id, &rnode, &forknum, &blkno)) + if (!XLogRecGetBlockTagExtended(record, block_id, &rnode, &forknum, &blkno, + &prefetch_buffer)) { /* Caller specified a bogus block_id */ elog(PANIC, "failed to locate backup block with ID %d", block_id); @@ -381,7 +384,8 @@ XLogReadBufferForRedoExtended(XLogReaderState *record, { Assert(XLogRecHasBlockImage(record, block_id)); *buf = XLogReadBufferExtended(rnode, forknum, blkno, - get_cleanup_lock ? RBM_ZERO_AND_CLEANUP_LOCK : RBM_ZERO_AND_LOCK); + get_cleanup_lock ? RBM_ZERO_AND_CLEANUP_LOCK : RBM_ZERO_AND_LOCK, + prefetch_buffer); page = BufferGetPage(*buf); if (!RestoreBlockImage(record, block_id, page)) elog(ERROR, "failed to restore block image"); @@ -410,7 +414,7 @@ XLogReadBufferForRedoExtended(XLogReaderState *record, } else { - *buf = XLogReadBufferExtended(rnode, forknum, blkno, mode); + *buf = XLogReadBufferExtended(rnode, forknum, blkno, mode, prefetch_buffer); if (BufferIsValid(*buf)) { if (mode != RBM_ZERO_AND_LOCK && mode != RBM_ZERO_AND_CLEANUP_LOCK) @@ -450,6 +454,10 @@ XLogReadBufferForRedoExtended(XLogReaderState *record, * exist, and we don't check for all-zeroes. Thus, no log entry is made * to imply that the page should be dropped or truncated later. * + * Optionally, recent_buffer can be used to provide a hint about the location + * of the page in the buffer pool; it does not have to be correct, but avoids + * a buffer mapping table probe if it is. + * * NB: A redo function should normally not call this directly. To get a page * to modify, use XLogReadBufferForRedoExtended instead. It is important that * all pages modified by a WAL record are registered in the WAL records, or @@ -457,7 +465,8 @@ XLogReadBufferForRedoExtended(XLogReaderState *record, */ Buffer XLogReadBufferExtended(RelFileNode rnode, ForkNumber forknum, - BlockNumber blkno, ReadBufferMode mode) + BlockNumber blkno, ReadBufferMode mode, + Buffer recent_buffer) { BlockNumber lastblock; Buffer buffer; @@ -465,6 +474,15 @@ XLogReadBufferExtended(RelFileNode rnode, ForkNumber forknum, Assert(blkno != P_NEW); + /* Do we have a clue where the buffer might be already? */ + if (BufferIsValid(recent_buffer) && + mode == RBM_NORMAL && + ReadRecentBuffer(rnode, forknum, blkno, recent_buffer)) + { + buffer = recent_buffer; + goto recent_buffer_fast_path; + } + /* Open the relation at smgr level */ smgr = smgropen(rnode, InvalidBackendId); @@ -523,6 +541,7 @@ XLogReadBufferExtended(RelFileNode rnode, ForkNumber forknum, } } +recent_buffer_fast_path: if (mode == RBM_NORMAL) { /* check that page has been initialized */ diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index e701d1c676..b1a6df16ad 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -930,6 +930,20 @@ CREATE VIEW pg_stat_wal_receiver AS FROM pg_stat_get_wal_receiver() s WHERE s.pid IS NOT NULL; +CREATE VIEW pg_stat_recovery_prefetch AS + SELECT + s.stats_reset, + s.prefetch, + s.hit, + s.skip_init, + s.skip_new, + s.skip_fpw, + s.skip_rep, + s.wal_distance, + s.block_distance, + s.io_depth + FROM pg_stat_get_recovery_prefetch() s; + CREATE VIEW pg_stat_subscription AS SELECT su.oid AS subid, diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index f80f90ac3c..93c1ea2d9f 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -649,6 +649,8 @@ ReadRecentBuffer(RelFileNode rnode, ForkNumber forkNum, BlockNumber blockNum, pg_atomic_write_u32(&bufHdr->state, buf_state + BUF_USAGECOUNT_ONE); + pgBufferUsage.local_blks_hit++; + return true; } } @@ -680,6 +682,8 @@ ReadRecentBuffer(RelFileNode rnode, ForkNumber forkNum, BlockNumber blockNum, else PinBuffer_Locked(bufHdr); /* pin for first time */ + pgBufferUsage.shared_blks_hit++; + return true; } diff --git a/src/backend/storage/freespace/freespace.c b/src/backend/storage/freespace/freespace.c index 78c073b7c9..d41ae37090 100644 --- a/src/backend/storage/freespace/freespace.c +++ b/src/backend/storage/freespace/freespace.c @@ -211,7 +211,8 @@ XLogRecordPageWithFreeSpace(RelFileNode rnode, BlockNumber heapBlk, blkno = fsm_logical_to_physical(addr); /* If the page doesn't exist already, extend */ - buf = XLogReadBufferExtended(rnode, FSM_FORKNUM, blkno, RBM_ZERO_ON_ERROR); + buf = XLogReadBufferExtended(rnode, FSM_FORKNUM, blkno, RBM_ZERO_ON_ERROR, + InvalidBuffer); LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE); page = BufferGetPage(buf); diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c index 88ff59c568..75e456360b 100644 --- a/src/backend/storage/ipc/ipci.c +++ b/src/backend/storage/ipc/ipci.c @@ -22,6 +22,7 @@ #include "access/subtrans.h" #include "access/syncscan.h" #include "access/twophase.h" +#include "access/xlogprefetcher.h" #include "access/xlogrecovery.h" #include "commands/async.h" #include "miscadmin.h" @@ -119,6 +120,7 @@ CalculateShmemSize(int *num_semaphores) size = add_size(size, LockShmemSize()); size = add_size(size, PredicateLockShmemSize()); size = add_size(size, ProcGlobalShmemSize()); + size = add_size(size, XLogPrefetchShmemSize()); size = add_size(size, XLOGShmemSize()); size = add_size(size, XLogRecoveryShmemSize()); size = add_size(size, CLOGShmemSize()); @@ -244,6 +246,7 @@ CreateSharedMemoryAndSemaphores(void) * Set up xlog, clog, and buffers */ XLOGShmemInit(); + XLogPrefetchShmemInit(); XLogRecoveryShmemInit(); CLOGShmemInit(); CommitTsShmemInit(); diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index 879f647dbc..286dd3f755 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -162,9 +162,11 @@ mdexists(SMgrRelation reln, ForkNumber forkNum) { /* * Close it first, to ensure that we notice if the fork has been unlinked - * since we opened it. + * since we opened it. As an optimization, we can skip that in recovery, + * which already closes relations when dropping them. */ - mdclose(reln, forkNum); + if (!InRecovery) + mdclose(reln, forkNum); return (mdopenfork(reln, forkNum, EXTENSION_RETURN_NULL) != NULL); } diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 2bf8ab8f98..d3ad795a6e 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -16,6 +16,7 @@ #include "access/htup_details.h" #include "access/xlog.h" +#include "access/xlogprefetcher.h" #include "catalog/pg_authid.h" #include "catalog/pg_type.h" #include "common/ip.h" @@ -2103,13 +2104,15 @@ pg_stat_reset_shared(PG_FUNCTION_ARGS) pgstat_reset_of_kind(PGSTAT_KIND_BGWRITER); pgstat_reset_of_kind(PGSTAT_KIND_CHECKPOINTER); } + else if (strcmp(target, "recovery_prefetch") == 0) + XLogPrefetchResetStats(); else if (strcmp(target, "wal") == 0) pgstat_reset_of_kind(PGSTAT_KIND_WAL); else ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("unrecognized reset target: \"%s\"", target), - errhint("Target must be \"archiver\", \"bgwriter\", or \"wal\"."))); + errhint("Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"."))); PG_RETURN_VOID(); } diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 89f8259bac..22b5571a70 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -41,6 +41,7 @@ #include "access/twophase.h" #include "access/xact.h" #include "access/xlog_internal.h" +#include "access/xlogprefetcher.h" #include "access/xlogrecovery.h" #include "catalog/namespace.h" #include "catalog/objectaccess.h" @@ -217,6 +218,7 @@ static bool check_effective_io_concurrency(int *newval, void **extra, GucSource static bool check_maintenance_io_concurrency(int *newval, void **extra, GucSource source); static bool check_huge_page_size(int *newval, void **extra, GucSource source); static bool check_client_connection_check_interval(int *newval, void **extra, GucSource source); +static void assign_maintenance_io_concurrency(int newval, void *extra); static bool check_application_name(char **newval, void **extra, GucSource source); static void assign_application_name(const char *newval, void *extra); static bool check_cluster_name(char **newval, void **extra, GucSource source); @@ -495,6 +497,19 @@ static const struct config_enum_entry huge_pages_options[] = { {NULL, 0, false} }; +static const struct config_enum_entry recovery_prefetch_options[] = { + {"off", RECOVERY_PREFETCH_OFF, false}, + {"on", RECOVERY_PREFETCH_ON, false}, + {"try", RECOVERY_PREFETCH_TRY, false}, + {"true", RECOVERY_PREFETCH_ON, true}, + {"false", RECOVERY_PREFETCH_OFF, true}, + {"yes", RECOVERY_PREFETCH_ON, true}, + {"no", RECOVERY_PREFETCH_OFF, true}, + {"1", RECOVERY_PREFETCH_ON, true}, + {"0", RECOVERY_PREFETCH_OFF, true}, + {NULL, 0, false} +}; + static const struct config_enum_entry force_parallel_mode_options[] = { {"off", FORCE_PARALLEL_OFF, false}, {"on", FORCE_PARALLEL_ON, false}, @@ -785,6 +800,8 @@ const char *const config_group_names[] = gettext_noop("Write-Ahead Log / Checkpoints"), /* WAL_ARCHIVING */ gettext_noop("Write-Ahead Log / Archiving"), + /* WAL_RECOVERY */ + gettext_noop("Write-Ahead Log / Recovery"), /* WAL_ARCHIVE_RECOVERY */ gettext_noop("Write-Ahead Log / Archive Recovery"), /* WAL_RECOVERY_TARGET */ @@ -2818,6 +2835,17 @@ static struct config_int ConfigureNamesInt[] = NULL, NULL, NULL }, + { + {"wal_decode_buffer_size", PGC_POSTMASTER, WAL_RECOVERY, + gettext_noop("Maximum buffer size for reading ahead in the WAL during recovery."), + gettext_noop("This controls the maximum distance we can read ahead in the WAL to prefetch referenced blocks."), + GUC_UNIT_BYTE + }, + &wal_decode_buffer_size, + 512 * 1024, 64 * 1024, MaxAllocSize, + NULL, NULL, NULL + }, + { {"wal_keep_size", PGC_SIGHUP, REPLICATION_SENDING, gettext_noop("Sets the size of WAL files held for standby servers."), @@ -3141,7 +3169,8 @@ static struct config_int ConfigureNamesInt[] = 0, #endif 0, MAX_IO_CONCURRENCY, - check_maintenance_io_concurrency, NULL, NULL + check_maintenance_io_concurrency, assign_maintenance_io_concurrency, + NULL }, { @@ -5013,6 +5042,16 @@ static struct config_enum ConfigureNamesEnum[] = NULL, NULL, NULL }, + { + {"recovery_prefetch", PGC_SIGHUP, WAL_RECOVERY, + gettext_noop("Prefetch referenced blocks during recovery"), + gettext_noop("Look ahead in the WAL to find references to uncached data.") + }, + &recovery_prefetch, + RECOVERY_PREFETCH_TRY, recovery_prefetch_options, + check_recovery_prefetch, assign_recovery_prefetch, NULL + }, + { {"force_parallel_mode", PGC_USERSET, DEVELOPER_OPTIONS, gettext_noop("Forces use of parallel query facilities."), @@ -12422,6 +12461,20 @@ check_client_connection_check_interval(int *newval, void **extra, GucSource sour return true; } +static void +assign_maintenance_io_concurrency(int newval, void *extra) +{ +#ifdef USE_PREFETCH + /* + * Reconfigure recovery prefetching, because a setting it depends on + * changed. + */ + maintenance_io_concurrency = newval; + if (AmStartupProcess()) + XLogPrefetchReconfigure(); +#endif +} + static bool check_application_name(char **newval, void **extra, GucSource source) { diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index e75b7d63ea..94270eb0ec 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -241,6 +241,12 @@ #max_wal_size = 1GB #min_wal_size = 80MB +# - Prefetching during recovery - + +#recovery_prefetch = try # prefetch pages referenced in the WAL? +#wal_decode_buffer_size = 512kB # lookahead window used for prefetching + # (change requires restart) + # - Archiving - #archive_mode = off # enables archiving; off, on, or always diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index b81917f243..e302bd102c 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -50,6 +50,7 @@ extern bool *wal_consistency_checking; extern char *wal_consistency_checking_string; extern bool log_checkpoints; extern bool track_wal_io_timing; +extern int wal_decode_buffer_size; extern int CheckPointSegments; diff --git a/src/include/access/xlogprefetcher.h b/src/include/access/xlogprefetcher.h new file mode 100644 index 0000000000..c30b09b727 --- /dev/null +++ b/src/include/access/xlogprefetcher.h @@ -0,0 +1,53 @@ +/*------------------------------------------------------------------------- + * + * xlogprefetcher.h + * Declarations for the recovery prefetching module. + * + * Portions Copyright (c) 2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/include/access/xlogprefetcher.h + *------------------------------------------------------------------------- + */ +#ifndef XLOGPREFETCHER_H +#define XLOGPREFETCHER_H + +#include "access/xlogdefs.h" + +/* GUCs */ +extern int recovery_prefetch; + +/* Possible values for recovery_prefetch */ +typedef enum +{ + RECOVERY_PREFETCH_OFF, + RECOVERY_PREFETCH_ON, + RECOVERY_PREFETCH_TRY +} RecoveryPrefetchValue; + +struct XLogPrefetcher; +typedef struct XLogPrefetcher XLogPrefetcher; + + +extern void XLogPrefetchReconfigure(void); + +extern size_t XLogPrefetchShmemSize(void); +extern void XLogPrefetchShmemInit(void); + +extern void XLogPrefetchResetStats(void); + +extern XLogPrefetcher *XLogPrefetcherAllocate(XLogReaderState *reader); +extern void XLogPrefetcherFree(XLogPrefetcher *prefetcher); + +extern XLogReaderState *XLogPrefetcherGetReader(XLogPrefetcher *prefetcher); + +extern void XLogPrefetcherBeginRead(XLogPrefetcher *prefetcher, + XLogRecPtr recPtr); + +extern XLogRecord *XLogPrefetcherReadRecord(XLogPrefetcher *prefetcher, + char **errmsg); + +extern void XLogPrefetcherComputeStats(XLogPrefetcher *prefetcher); + +#endif diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index f4388cc9be..d8eb857611 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -39,6 +39,7 @@ #endif #include "access/xlogrecord.h" +#include "storage/buf.h" /* WALOpenSegment represents a WAL segment being read. */ typedef struct WALOpenSegment @@ -125,6 +126,9 @@ typedef struct ForkNumber forknum; BlockNumber blkno; + /* Prefetching workspace. */ + Buffer prefetch_buffer; + /* copy of the fork_flags field from the XLogRecordBlockHeader */ uint8 flags; @@ -430,5 +434,9 @@ extern char *XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size * extern bool XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id, RelFileNode *rnode, ForkNumber *forknum, BlockNumber *blknum); +extern bool XLogRecGetBlockTagExtended(XLogReaderState *record, uint8 block_id, + RelFileNode *rnode, ForkNumber *forknum, + BlockNumber *blknum, + Buffer *prefetch_buffer); #endif /* XLOGREADER_H */ diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 64708949db..ff40f96e42 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -84,7 +84,8 @@ extern XLogRedoAction XLogReadBufferForRedoExtended(XLogReaderState *record, Buffer *buf); extern Buffer XLogReadBufferExtended(RelFileNode rnode, ForkNumber forknum, - BlockNumber blkno, ReadBufferMode mode); + BlockNumber blkno, ReadBufferMode mode, + Buffer recent_buffer); extern Relation CreateFakeRelcacheEntry(RelFileNode rnode); extern void FreeFakeRelcacheEntry(Relation fakerel); diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index e133113543..67f3d8526c 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202204073 +#define CATALOG_VERSION_NO 202204074 #endif diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 776e31f3b5..61876c4e80 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -5654,6 +5654,13 @@ proargmodes => '{o,o,o,o,o,o,o,o,o}', proargnames => '{wal_records,wal_fpi,wal_bytes,wal_buffers_full,wal_write,wal_sync,wal_write_time,wal_sync_time,stats_reset}', prosrc => 'pg_stat_get_wal' }, +{ oid => '9085', descr => 'statistics: information about WAL prefetching', + proname => 'pg_stat_get_recovery_prefetch', prorows => '1', provolatile => 'v', + proretset => 't', prorettype => 'record', proargtypes => '', + proallargtypes => '{timestamptz,int8,int8,int8,int8,int8,int8,int4,int4,int4}', + proargmodes => '{o,o,o,o,o,o,o,o,o,o}', + proargnames => '{stats_reset,prefetch,hit,skip_init,skip_new,skip_fpw,skip_rep,wal_distance,block_distance,io_depth}', + prosrc => 'pg_stat_get_recovery_prefetch' }, { oid => '2306', descr => 'statistics: information about SLRU caches', proname => 'pg_stat_get_slru', prorows => '100', proisstrict => 'f', diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index 74018ea27b..1189e1a226 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -453,4 +453,8 @@ extern void assign_search_path(const char *newval, void *extra); extern bool check_wal_buffers(int *newval, void **extra, GucSource source); extern void assign_xlog_sync_method(int new_sync_method, void *extra); +/* in access/transam/xlogprefetcher.c */ +extern bool check_recovery_prefetch(int *new_value, void **extra, GucSource source); +extern void assign_recovery_prefetch(int new_value, void *extra); + #endif /* GUC_H */ diff --git a/src/include/utils/guc_tables.h b/src/include/utils/guc_tables.h index 1c5b3930a9..63b56f18e0 100644 --- a/src/include/utils/guc_tables.h +++ b/src/include/utils/guc_tables.h @@ -67,6 +67,7 @@ enum config_group WAL_SETTINGS, WAL_CHECKPOINTS, WAL_ARCHIVING, + WAL_RECOVERY, WAL_ARCHIVE_RECOVERY, WAL_RECOVERY_TARGET, REPLICATION_SENDING, diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 423b9b99fb..db652ea8d8 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -2019,6 +2019,17 @@ pg_stat_progress_vacuum| SELECT s.pid, s.param7 AS num_dead_tuples FROM (pg_stat_get_progress_info('VACUUM'::text) s(pid, datid, relid, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) LEFT JOIN pg_database d ON ((s.datid = d.oid))); +pg_stat_recovery_prefetch| SELECT s.stats_reset, + s.prefetch, + s.hit, + s.skip_init, + s.skip_new, + s.skip_fpw, + s.skip_rep, + s.wal_distance, + s.block_distance, + s.io_depth + FROM pg_stat_get_recovery_prefetch() s(stats_reset, prefetch, hit, skip_init, skip_new, skip_fpw, skip_rep, wal_distance, block_distance, io_depth); pg_stat_replication| SELECT s.pid, s.usesysid, u.rolname AS usename, diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 566ecbf091..be3fafadf8 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1421,6 +1421,9 @@ LogicalRepWorker LogicalRewriteMappingData LogicalTape LogicalTapeSet +LsnReadQueue +LsnReadQueueNextFun +LsnReadQueueNextStatus LtreeGistOptions LtreeSignature MAGIC @@ -2949,6 +2952,9 @@ XLogPageHeaderData XLogPageReadCB XLogPageReadPrivate XLogPageReadResult +XLogPrefetcher +XLogPrefetcherFilter +XLogPrefetchStats XLogReaderRoutine XLogReaderState XLogRecData From 6392f2a0968c20ecde4d27b6652703ad931fce92 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 7 Apr 2022 00:49:32 -0700 Subject: [PATCH 425/772] Try to silence "-Wmissing-braces" complaints in rmgrdesc.c. Per buildfarm member lapwing. https://postgr.es/m/20220407065640.xljttqcs46k4lyvr@alap3.anarazel.de --- src/bin/pg_waldump/rmgrdesc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/pg_waldump/rmgrdesc.c b/src/bin/pg_waldump/rmgrdesc.c index fac509ed13..6b8c17bb4c 100644 --- a/src/bin/pg_waldump/rmgrdesc.c +++ b/src/bin/pg_waldump/rmgrdesc.c @@ -41,8 +41,8 @@ static const RmgrDescData RmgrDescTable[RM_N_BUILTIN_IDS] = { #define CUSTOM_NUMERIC_NAME_LEN sizeof("custom###") -static char CustomNumericNames[RM_N_CUSTOM_IDS][CUSTOM_NUMERIC_NAME_LEN] = {0}; -static RmgrDescData CustomRmgrDesc[RM_N_CUSTOM_IDS] = {0}; +static char CustomNumericNames[RM_N_CUSTOM_IDS][CUSTOM_NUMERIC_NAME_LEN] = {{0}}; +static RmgrDescData CustomRmgrDesc[RM_N_CUSTOM_IDS] = {{0}}; static bool CustomRmgrDescInitialized = false; /* From a2f433fa491f709767dbf916203f1c53f39707fe Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 7 Apr 2022 00:57:13 -0700 Subject: [PATCH 426/772] pgstat: add alternate output for stats.spec, for the 2PC disabled case. It might be worth instead splitting the test up to produce a smaller alternative output file. But that's not trivial either, due to the number of steps defined. And more than I want to do tonight. Per buildfarm. --- src/test/isolation/expected/stats_1.out | 3761 +++++++++++++++++++++++ 1 file changed, 3761 insertions(+) create mode 100644 src/test/isolation/expected/stats_1.out diff --git a/src/test/isolation/expected/stats_1.out b/src/test/isolation/expected/stats_1.out new file mode 100644 index 0000000000..1c6533cc87 --- /dev/null +++ b/src/test/isolation/expected/stats_1.out @@ -0,0 +1,3761 @@ +Parsed test spec with 2 sessions + +starting permutation: s1_track_funcs_none s1_func_stats s1_func_call s1_func_call s1_ff s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_none: SET track_functions = 'none'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_track_funcs_all s1_func_stats s1_func_call s1_func_call s1_ff s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats s1_func_call s2_func_call s1_func_call s2_func_call s2_func_call s1_ff s2_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats s1_func_call s1_ff s2_func_call s2_func_call s2_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 3|t |t +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 3|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats s1_begin s1_func_call s1_func_call s1_commit s1_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_begin: BEGIN; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_commit: COMMIT; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats s1_begin s1_func_call s2_func_call s1_func_drop s2_func_call s2_ff s2_func_stats s1_commit s1_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_begin: BEGIN; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + +step s1_commit: COMMIT; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_stats s2_func_stats s1_begin s1_func_call s2_func_call s1_func_drop s2_func_call s2_ff s2_func_stats s1_rollback s1_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_begin: BEGIN; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + +step s1_rollback: ROLLBACK; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 3|t |t +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 3|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s2_func_call s2_ff s2_begin s2_func_call s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_begin: BEGIN; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_commit: COMMIT; +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s2_begin s2_func_call s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s2_begin: BEGIN; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_commit: COMMIT; +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_all s1_func_call s2_begin s2_func_call s1_func_drop s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_disable_debug_discard: SET debug_discard_caches = 0; +step s2_disable_debug_discard: SET debug_discard_caches = 0; +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_begin: BEGIN; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_commit: COMMIT; +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_none s1_func_call s2_begin s2_func_call s1_ff s1_func_stats s1_func_drop s2_track_funcs_none s1_func_stats s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_disable_debug_discard: SET debug_discard_caches = 0; +step s2_disable_debug_discard: SET debug_discard_caches = 0; +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_none: SET track_functions = 'none'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_begin: BEGIN; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_track_funcs_none: SET track_functions = 'none'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_commit: COMMIT; +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_none s1_func_call s2_begin s2_func_call s1_ff s1_func_stats s1_func_drop s2_track_funcs_all s1_func_stats s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_disable_debug_discard: SET debug_discard_caches = 0; +step s2_disable_debug_discard: SET debug_discard_caches = 0; +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_none: SET track_functions = 'none'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_begin: BEGIN; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_call: SELECT test_stat_func() +ERROR: function call to dropped function +step s2_commit: COMMIT; +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_call s2_func_call s2_func_call2 s1_ff s2_ff s1_func_stats s2_func_call s2_func_call2 s2_ff s1_func_stats s1_func_stats2 s1_func_stats s1_func_stats_reset s1_func_stats s1_func_stats2 s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call2: SELECT test_stat_func2() +test_stat_func2 +--------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call2: SELECT test_stat_func2() +test_stat_func2 +--------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 3|t |t +(1 row) + +step s1_func_stats2: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func2' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +---------------+--------------------------+----------------+--------------- +test_stat_func2| 2|t |t +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 3|t |t +(1 row) + +step s1_func_stats_reset: SELECT pg_stat_reset_single_function_counters('test_stat_func'::regproc); +pg_stat_reset_single_function_counters +-------------------------------------- + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 0|f |f +(1 row) + +step s1_func_stats2: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func2' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +---------------+--------------------------+----------------+--------------- +test_stat_func2| 2|t |t +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 0|f |f +(1 row) + + +starting permutation: s1_func_stats_nonexistent s1_func_stats_reset_nonexistent s1_func_stats_nonexistent +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + +step s1_func_stats_reset_nonexistent: SELECT pg_stat_reset_single_function_counters(12000); +pg_stat_reset_single_function_counters +-------------------------------------- + +(1 row) + +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_call s2_func_call s2_func_call2 s1_ff s2_ff s1_func_stats s1_func_stats2 s1_func_stats s1_reset s1_func_stats s1_func_stats2 s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call2: SELECT test_stat_func2() +test_stat_func2 +--------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + +step s1_func_stats2: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func2' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +---------------+--------------------------+----------------+--------------- +test_stat_func2| 1|t |t +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + +step s1_reset: SELECT pg_stat_reset(); +pg_stat_reset +------------- + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 0|f |f +(1 row) + +step s1_func_stats2: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func2' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +---------------+--------------------------+----------------+--------------- +test_stat_func2| 0|f |f +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 0|f |f +(1 row) + + +starting permutation: s1_track_funcs_all s1_fetch_consistency_none s1_func_call s1_ff s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s1_fetch_consistency_none: SET stats_fetch_consistency = 'none'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s1_fetch_consistency_cache s1_func_call s1_ff s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s1_fetch_consistency_cache: SET stats_fetch_consistency = 'cache'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s1_fetch_consistency_snapshot s1_func_call s1_ff s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_fetch_consistency_none s2_func_call s2_ff s1_begin s1_func_stats s2_func_call s2_ff s1_func_stats s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_fetch_consistency_none: SET stats_fetch_consistency = 'none'; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_begin: BEGIN; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 2|t |t +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_fetch_consistency_cache s2_func_call s2_func_call2 s2_ff s1_begin s1_func_stats s2_func_call s2_func_call2 s2_ff s1_func_stats s1_func_stats2 s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_fetch_consistency_cache: SET stats_fetch_consistency = 'cache'; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call2: SELECT test_stat_func2() +test_stat_func2 +--------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_begin: BEGIN; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call2: SELECT test_stat_func2() +test_stat_func2 +--------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s1_func_stats2: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func2' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +---------------+--------------------------+----------------+--------------- +test_stat_func2| 2|t |t +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_fetch_consistency_snapshot s2_func_call s2_func_call2 s2_ff s1_begin s1_func_stats s2_func_call s2_func_call2 s2_ff s1_func_stats s1_func_stats2 s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call2: SELECT test_stat_func2() +test_stat_func2 +--------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_begin: BEGIN; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_func_call2: SELECT test_stat_func2() +test_stat_func2 +--------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s1_func_stats2: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func2' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +---------------+--------------------------+----------------+--------------- +test_stat_func2| 1|t |t +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_fetch_consistency_none s1_begin s1_func_stats_nonexistent s1_func_stats_nonexistent s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_none: SET stats_fetch_consistency = 'none'; +step s1_begin: BEGIN; +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_fetch_consistency_cache s1_begin s1_func_stats_nonexistent s1_func_stats_nonexistent s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_cache: SET stats_fetch_consistency = 'cache'; +step s1_begin: BEGIN; +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_fetch_consistency_snapshot s1_begin s1_func_stats_nonexistent s1_func_stats_nonexistent s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; +step s1_begin: BEGIN; +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + +step s1_func_stats_nonexistent: + SELECT pg_stat_get_function_calls(12000); + +pg_stat_get_function_calls +-------------------------- + +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_begin s1_func_call s2_func_call s1_func_drop s2_func_call s2_ff s1_prepare_a s2_func_call s2_ff s1_func_call s1_ff s1_func_stats s1_commit_prepared_a s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_begin: BEGIN; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +ERROR: prepared transactions are disabled +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + +step s1_commit_prepared_a: COMMIT PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_begin s1_func_call s2_func_call s1_func_drop s2_func_call s2_ff s1_prepare_a s2_func_call s2_ff s1_func_call s1_ff s1_func_stats s1_rollback_prepared_a s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_begin: BEGIN; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +ERROR: prepared transactions are disabled +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + +step s1_rollback_prepared_a: ROLLBACK PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_begin s1_func_call s2_func_call s1_func_drop s2_func_call s2_ff s1_prepare_a s2_func_call s2_ff s1_func_call s1_ff s1_func_stats s2_commit_prepared_a s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_begin: BEGIN; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +ERROR: prepared transactions are disabled +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + +step s2_commit_prepared_a: COMMIT PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + + +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_begin s1_func_call s2_func_call s1_func_drop s2_func_call s2_ff s1_prepare_a s2_func_call s2_ff s1_func_call s1_ff s1_func_stats s2_rollback_prepared_a s1_func_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_funcs_all: SET track_functions = 'all'; +step s2_track_funcs_all: SET track_functions = 'all'; +step s1_begin: BEGIN; +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s1_func_drop: DROP FUNCTION test_stat_func(); +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +ERROR: prepared transactions are disabled +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_call: SELECT test_stat_func(); +test_stat_func +-------------- + +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + +step s2_rollback_prepared_a: ROLLBACK PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 5|t |t +(1 row) + + +starting permutation: s1_table_select s1_table_insert s2_table_select s2_table_update_k1 s1_ff s2_table_update_k1 s1_table_drop s2_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s2_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k1 | 1 +k2 | 1 +k3 | 1 +(4 rows) + +step s2_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_drop: DROP TABLE test_stat_tab; +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 0| 0| 0| 0| 0| 0| 0| 0 +(1 row) + + +starting permutation: s1_table_select s1_table_insert s2_table_select s2_table_update_k1 s2_table_update_k1 s1_table_drop s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s2_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k1 | 1 +k2 | 1 +k3 | 1 +(4 rows) + +step s2_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s2_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_drop: DROP TABLE test_stat_tab; +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 0| 0| 0| 0| 0| 0| 0| 0 +(1 row) + + +starting permutation: s1_track_counts_off s1_table_stats s1_track_counts_on +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_counts_off: SET track_counts = off; +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 0| 0| 1| 0| 0| 1| 0| 0 +(1 row) + +step s1_track_counts_on: SET track_counts = on; + +starting permutation: s1_table_select s1_track_counts_off s1_ff s1_table_stats s1_track_counts_on +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_track_counts_off: SET track_counts = off; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 1| 1| 1| 0| 0| 1| 0| 0 +(1 row) + +step s1_track_counts_on: SET track_counts = on; + +starting permutation: s1_table_select s1_ff s1_track_counts_off s1_table_stats s1_track_counts_on +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_counts_off: SET track_counts = off; +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 1| 1| 1| 0| 0| 1| 0| 0 +(1 row) + +step s1_track_counts_on: SET track_counts = on; + +starting permutation: s1_track_counts_off s1_table_select s1_table_insert_k1 s1_table_update_k1 s2_table_select s1_track_counts_on s1_ff s2_ff s1_table_stats s1_table_select s1_table_update_k1 s1_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_track_counts_off: SET track_counts = off; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s2_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k1 | 2 +(2 rows) + +step s1_track_counts_on: SET track_counts = on; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 1| 2| 1| 0| 0| 1| 0| 0 +(1 row) + +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k1 | 2 +(2 rows) + +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 3| 6| 1| 1| 0| 1| 1| 0 +(1 row) + + +starting permutation: s1_table_select s1_table_insert_k1 s1_table_delete_k1 s1_track_counts_off s1_table_select s1_table_insert_k1 s1_table_update_k1 s2_table_select s1_track_counts_on s1_ff s2_ff s1_table_stats s1_table_select s1_table_update_k1 s1_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_delete_k1: DELETE FROM test_stat_tab WHERE key = 'k1'; +step s1_track_counts_off: SET track_counts = off; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s2_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k1 | 2 +(2 rows) + +step s1_track_counts_on: SET track_counts = on; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 3| 5| 2| 0| 1| 1| 1| 0 +(1 row) + +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k1 | 2 +(2 rows) + +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 5| 9| 2| 1| 1| 1| 2| 0 +(1 row) + + +starting permutation: s1_begin s1_table_insert s1_table_update_k1 s1_table_update_k1 s1_table_update_k2 s1_table_update_k2 s1_table_update_k2 s1_table_delete_k1 s1_table_select s1_prepare_a s1_table_select s1_commit_prepared_a s1_table_select s1_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_begin: BEGIN; +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_delete_k1: DELETE FROM test_stat_tab WHERE key = 'k1'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k2 | 4 +k3 | 1 +(3 rows) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +ERROR: prepared transactions are disabled +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_commit_prepared_a: COMMIT PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 9| 29| 4| 5| 1| 1| 8| 0 +(1 row) + + +starting permutation: s1_begin s1_table_insert s1_table_update_k1 s1_table_update_k1 s1_table_update_k2 s1_table_update_k2 s1_table_update_k2 s1_table_delete_k1 s1_table_select s1_prepare_a s1_table_select s2_commit_prepared_a s1_table_select s1_ff s2_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_begin: BEGIN; +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_delete_k1: DELETE FROM test_stat_tab WHERE key = 'k1'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k2 | 4 +k3 | 1 +(3 rows) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +ERROR: prepared transactions are disabled +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s2_commit_prepared_a: COMMIT PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 9| 29| 4| 5| 1| 1| 8| 0 +(1 row) + + +starting permutation: s1_begin s1_table_insert s1_table_update_k1 s1_table_update_k1 s1_table_update_k2 s1_table_update_k2 s1_table_update_k2 s1_table_delete_k1 s1_table_select s1_prepare_a s1_table_select s1_rollback_prepared_a s1_table_select s1_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_begin: BEGIN; +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_delete_k1: DELETE FROM test_stat_tab WHERE key = 'k1'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k2 | 4 +k3 | 1 +(3 rows) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +ERROR: prepared transactions are disabled +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_rollback_prepared_a: ROLLBACK PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 9| 29| 4| 5| 1| 1| 8| 0 +(1 row) + + +starting permutation: s1_begin s1_table_insert s1_table_update_k1 s1_table_update_k1 s1_table_update_k2 s1_table_update_k2 s1_table_update_k2 s1_table_delete_k1 s1_table_select s1_prepare_a s1_table_select s2_rollback_prepared_a s1_table_select s1_ff s2_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_begin: BEGIN; +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_update_k2: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k2'; +step s1_table_delete_k1: DELETE FROM test_stat_tab WHERE key = 'k1'; +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +k2 | 4 +k3 | 1 +(3 rows) + +step s1_prepare_a: PREPARE TRANSACTION 'a'; +ERROR: prepared transactions are disabled +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s2_rollback_prepared_a: ROLLBACK PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist +step s1_table_select: SELECT * FROM test_stat_tab ORDER BY key, value; +key|value +---+----- +k0 | 1 +(1 row) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 9| 29| 4| 5| 1| 1| 8| 0 +(1 row) + + +starting permutation: s1_table_insert s1_begin s1_table_update_k1 s1_table_update_k1 s1_table_truncate s1_table_insert_k1 s1_table_update_k1 s1_prepare_a s1_commit_prepared_a s1_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_begin: BEGIN; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_truncate: TRUNCATE test_stat_tab; +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_prepare_a: PREPARE TRANSACTION 'a'; +ERROR: prepared transactions are disabled +step s1_commit_prepared_a: COMMIT PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 3| 9| 4| 2| 0| 4| 2| 0 +(1 row) + + +starting permutation: s1_table_insert s1_begin s1_table_update_k1 s1_table_update_k1 s1_table_truncate s1_table_insert_k1 s1_table_update_k1 s1_prepare_a s2_commit_prepared_a s1_ff s2_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_begin: BEGIN; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_truncate: TRUNCATE test_stat_tab; +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_prepare_a: PREPARE TRANSACTION 'a'; +ERROR: prepared transactions are disabled +step s2_commit_prepared_a: COMMIT PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 3| 9| 4| 2| 0| 4| 2| 0 +(1 row) + + +starting permutation: s1_table_insert s1_begin s1_table_update_k1 s1_table_update_k1 s1_table_truncate s1_table_insert_k1 s1_table_update_k1 s1_prepare_a s1_rollback_prepared_a s1_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_begin: BEGIN; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_truncate: TRUNCATE test_stat_tab; +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_prepare_a: PREPARE TRANSACTION 'a'; +ERROR: prepared transactions are disabled +step s1_rollback_prepared_a: ROLLBACK PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 3| 9| 4| 2| 0| 4| 2| 0 +(1 row) + + +starting permutation: s1_table_insert s1_begin s1_table_update_k1 s1_table_update_k1 s1_table_truncate s1_table_insert_k1 s1_table_update_k1 s1_prepare_a s2_rollback_prepared_a s1_ff s2_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_begin: BEGIN; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_truncate: TRUNCATE test_stat_tab; +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_prepare_a: PREPARE TRANSACTION 'a'; +ERROR: prepared transactions are disabled +step s2_rollback_prepared_a: ROLLBACK PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 3| 9| 4| 2| 0| 4| 2| 0 +(1 row) + + +starting permutation: s1_table_insert s1_table_update_k1 s1_begin s1_table_delete_k1 s1_table_insert_k1 s1_table_update_k1 s1_table_update_k1 s1_table_drop s1_prepare_a s1_rollback_prepared_a s1_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_begin: BEGIN; +step s1_table_delete_k1: DELETE FROM test_stat_tab WHERE key = 'k1'; +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_drop: DROP TABLE test_stat_tab; +step s1_prepare_a: PREPARE TRANSACTION 'a'; +ERROR: prepared transactions are disabled +step s1_rollback_prepared_a: ROLLBACK PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 4| 16| 5| 3| 1| 4| 4| 0 +(1 row) + + +starting permutation: s1_table_insert s1_table_update_k1 s1_begin s1_table_delete_k1 s1_table_insert_k1 s1_table_update_k1 s1_table_update_k1 s1_table_drop s1_prepare_a s2_rollback_prepared_a s1_ff s2_ff s1_table_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_insert: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1), ('k2', 1), ('k3', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_begin: BEGIN; +step s1_table_delete_k1: DELETE FROM test_stat_tab WHERE key = 'k1'; +step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; +step s1_table_drop: DROP TABLE test_stat_tab; +step s1_prepare_a: PREPARE TRANSACTION 'a'; +ERROR: prepared transactions are disabled +step s2_rollback_prepared_a: ROLLBACK PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_table_stats: + SELECT + pg_stat_get_numscans(tso.oid) AS seq_scan, + pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, + pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, + pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, + pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, + pg_stat_get_live_tuples(tso.oid) AS n_live_tup, + pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_vacuum_count(tso.oid) AS vacuum_count + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_tab' + +seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count +--------+------------+---------+---------+---------+----------+----------+------------ + 4| 16| 5| 3| 1| 4| 4| 0 +(1 row) + + +starting permutation: s1_slru_save_stats s1_listen s1_begin s1_big_notify s1_ff s1_slru_check_stats s1_commit s1_slru_check_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s1_commit: COMMIT; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + + +starting permutation: s1_slru_save_stats s1_listen s2_big_notify s2_ff s1_slru_check_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + + +starting permutation: s1_slru_save_stats s1_listen s2_begin s2_big_notify s2_ff s1_slru_check_stats s2_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s2_begin: BEGIN; +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s2_commit: COMMIT; + +starting permutation: s1_fetch_consistency_none s1_slru_save_stats s1_listen s1_begin s1_slru_check_stats s2_big_notify s2_ff s1_slru_check_stats s1_commit s1_slru_check_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_none: SET stats_fetch_consistency = 'none'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + +step s1_commit: COMMIT; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + + +starting permutation: s1_fetch_consistency_cache s1_slru_save_stats s1_listen s1_begin s1_slru_check_stats s2_big_notify s2_ff s1_slru_check_stats s1_commit s1_slru_check_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_cache: SET stats_fetch_consistency = 'cache'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s1_commit: COMMIT; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + + +starting permutation: s1_fetch_consistency_snapshot s1_slru_save_stats s1_listen s1_begin s1_slru_check_stats s2_big_notify s2_ff s1_slru_check_stats s1_commit s1_slru_check_stats +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s1_commit: COMMIT; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + + +starting permutation: s1_fetch_consistency_none s1_slru_save_stats s1_listen s1_begin s1_slru_check_stats s2_big_notify s2_ff s1_slru_check_stats s1_clear_snapshot s1_slru_check_stats s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_none: SET stats_fetch_consistency = 'none'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); +pg_stat_clear_snapshot +---------------------- + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_fetch_consistency_cache s1_slru_save_stats s1_listen s1_begin s1_slru_check_stats s2_big_notify s2_ff s1_slru_check_stats s1_clear_snapshot s1_slru_check_stats s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_cache: SET stats_fetch_consistency = 'cache'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); +pg_stat_clear_snapshot +---------------------- + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_fetch_consistency_snapshot s1_slru_save_stats s1_listen s1_begin s1_slru_check_stats s2_big_notify s2_ff s1_slru_check_stats s1_clear_snapshot s1_slru_check_stats s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); +pg_stat_clear_snapshot +---------------------- + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_fetch_consistency_snapshot s1_slru_save_stats s1_listen s1_begin s1_func_stats s2_big_notify s2_ff s1_slru_check_stats s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +f +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_fetch_consistency_snapshot s1_slru_save_stats s1_listen s1_begin s2_big_notify s2_ff s1_slru_check_stats s2_func_call s2_ff s1_func_stats s1_clear_snapshot s1_func_stats s1_commit +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; +step s1_slru_save_stats: + INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + +step s1_listen: LISTEN stats_test_nothing; +step s1_begin: BEGIN; +step s2_big_notify: SELECT pg_notify('stats_test_use', + repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + +pg_notify +--------- + + + +(3 rows) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_slru_check_stats: + SELECT current.blks_zeroed > before.value + FROM test_slru_stats before + INNER JOIN pg_stat_slru current + ON before.slru = current.name + WHERE before.stat = 'blks_zeroed'; + +?column? +-------- +t +(1 row) + +step s2_func_call: SELECT test_stat_func() +test_stat_func +-------------- + +(1 row) + +step s2_ff: SELECT pg_stat_force_next_flush(); +pg_stat_force_next_flush +------------------------ + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| | | +(1 row) + +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); +pg_stat_clear_snapshot +---------------------- + +(1 row) + +step s1_func_stats: + SELECT + tso.name, + pg_stat_get_function_calls(tso.oid), + pg_stat_get_function_total_time(tso.oid) > 0 total_above_zero, + pg_stat_get_function_self_time(tso.oid) > 0 self_above_zero + FROM test_stat_oid AS tso + WHERE tso.name = 'test_stat_func' + +name |pg_stat_get_function_calls|total_above_zero|self_above_zero +--------------+--------------------------+----------------+--------------- +test_stat_func| 1|t |t +(1 row) + +step s1_commit: COMMIT; From 5b186308fbc41d0713fa91426d57a2afe37dd969 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Thu, 7 Apr 2022 20:55:16 +1200 Subject: [PATCH 427/772] Include some missing headers. Per headerscheck on BF animal crake, and Andres. Discussion: https://postgr.es/m/20220407083630.n62vgwqfy2v6wsrd%40alap3.anarazel.de --- src/include/access/xlogprefetcher.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/include/access/xlogprefetcher.h b/src/include/access/xlogprefetcher.h index c30b09b727..80283a8fc2 100644 --- a/src/include/access/xlogprefetcher.h +++ b/src/include/access/xlogprefetcher.h @@ -14,6 +14,8 @@ #define XLOGPREFETCHER_H #include "access/xlogdefs.h" +#include "access/xlogreader.h" +#include "access/xlogrecord.h" /* GUCs */ extern int recovery_prefetch; From d772b18d44c209ec4a48ba6e1d86c13445318b81 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 7 Apr 2022 13:45:25 +0200 Subject: [PATCH 428/772] Avoid element in man pages The upstream DocBook manpages stylesheet apparently does not handle the element at all, and so the content comes out unformatted, which is not useful. As a workaround, replace with a nested , which ends up effectively the same in output. --- doc/src/sgml/ref/pgupgrade.sgml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/ref/pgupgrade.sgml b/doc/src/sgml/ref/pgupgrade.sgml index 3fbe141456..f024c3ef25 100644 --- a/doc/src/sgml/ref/pgupgrade.sgml +++ b/doc/src/sgml/ref/pgupgrade.sgml @@ -499,7 +499,7 @@ pg_upgrade.exe is running. - + Install the new PostgreSQL binaries on standby servers @@ -624,7 +624,7 @@ rsync --archive --delete --hard-links --size-only --no-inc-recursive /vol1/pg_tb - + From bab588cd5cbbeb43cda6e20c967b43000ea2aa80 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Thu, 7 Apr 2022 14:01:28 +0200 Subject: [PATCH 429/772] Fix typo in xlogrecovery.c code comment Author: Bharath Rupireddy Discussion: https://postgr.es/m/CALj2ACUoPtnReT=yAQMcWLtcCpk7p83xjeA8tiRX8Q0_sjh8kw@mail.gmail.com --- src/backend/access/transam/xlogrecovery.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 54fd10475a..2e555f8573 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -4427,7 +4427,7 @@ GetXLogReplayRecPtr(TimeLineID *replayTLI) /* * Get position of last applied, or the record being applied. * - * This is different from GetLogReplayRecPtr() in that if a WAL + * This is different from GetXLogReplayRecPtr() in that if a WAL * record is currently being applied, this includes that record. */ XLogRecPtr From 344d62fb9a978a72cf8347f0369b9ee643fd0b31 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 7 Apr 2022 16:13:23 +0200 Subject: [PATCH 430/772] Unlogged sequences Add support for unlogged sequences. Unlike for unlogged tables, this is not a performance feature. It allows sequences associated with unlogged tables to be excluded from replication. A new subcommand ALTER SEQUENCE ... SET LOGGED/UNLOGGED is added. An identity/serial sequence now automatically gets and follows the persistence level (logged/unlogged) of its owning table. (The sequences owned by temporary tables were already temporary through the separate mechanism in RangeVarAdjustRelationPersistence().) But you can still change the persistence of an owned sequence separately. Also, pg_dump and pg_upgrade preserve the persistence of existing sequences. Discussion: https://www.postgresql.org/message-id/flat/04e12818-2f98-257c-b926-2845d74ed04f%402ndquadrant.com --- doc/src/sgml/ref/alter_sequence.sgml | 12 +++++ doc/src/sgml/ref/alter_table.sgml | 6 +++ doc/src/sgml/ref/create_sequence.sgml | 23 +++++++- doc/src/sgml/ref/create_table.sgml | 5 ++ doc/src/sgml/ref/pg_dump.sgml | 7 +-- src/backend/commands/sequence.c | 58 +++++++++++++++++--- src/backend/commands/tablecmds.c | 32 ++++++++++-- src/backend/parser/parse_utilcmd.c | 1 + src/bin/pg_dump/pg_dump.c | 15 +++++- src/bin/psql/describe.c | 8 ++- src/bin/psql/tab-complete.c | 5 +- src/include/commands/sequence.h | 1 + src/test/recovery/t/014_unlogged_reinit.pl | 61 +++++++++++++++++++--- src/test/regress/expected/alter_table.out | 4 +- src/test/regress/expected/sequence.out | 20 ++++++- src/test/regress/sql/sequence.sql | 10 +++- 16 files changed, 237 insertions(+), 31 deletions(-) diff --git a/doc/src/sgml/ref/alter_sequence.sgml b/doc/src/sgml/ref/alter_sequence.sgml index 3cd9ece49f..148085d4f2 100644 --- a/doc/src/sgml/ref/alter_sequence.sgml +++ b/doc/src/sgml/ref/alter_sequence.sgml @@ -31,6 +31,7 @@ ALTER SEQUENCE [ IF EXISTS ] name [ RESTART [ [ WITH ] restart ] ] [ CACHE cache ] [ [ NO ] CYCLE ] [ OWNED BY { table_name.column_name | NONE } ] +ALTER SEQUENCE [ IF EXISTS ] name SET { LOGGED | UNLOGGED } ALTER SEQUENCE [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER SEQUENCE [ IF EXISTS ] name RENAME TO new_name ALTER SEQUENCE [ IF EXISTS ] name SET SCHEMA new_schema @@ -237,6 +238,17 @@ ALTER SEQUENCE [ IF EXISTS ] name S + + SET { LOGGED | UNLOGGED } + + + This form changes the sequence from unlogged to logged or vice-versa + (see ). It cannot be applied to a + temporary sequence. + + + + OWNED BY table_name.column_name OWNED BY NONE diff --git a/doc/src/sgml/ref/alter_table.sgml b/doc/src/sgml/ref/alter_table.sgml index e610cbbc0e..c2a458eb5d 100644 --- a/doc/src/sgml/ref/alter_table.sgml +++ b/doc/src/sgml/ref/alter_table.sgml @@ -753,6 +753,12 @@ WITH ( MODULUS numeric_literal, REM (see ). It cannot be applied to a temporary table. + + + This also changes the persistence of any sequences linked to the table + (for identity or serial columns). However, it is also possible to + change the persistence of such sequences separately. + diff --git a/doc/src/sgml/ref/create_sequence.sgml b/doc/src/sgml/ref/create_sequence.sgml index 20bdbc002f..a84aa5bf56 100644 --- a/doc/src/sgml/ref/create_sequence.sgml +++ b/doc/src/sgml/ref/create_sequence.sgml @@ -21,7 +21,7 @@ PostgreSQL documentation -CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name +CREATE [ { TEMPORARY | TEMP } | UNLOGGED ] SEQUENCE [ IF NOT EXISTS ] name [ AS data_type ] [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] @@ -92,6 +92,27 @@ SELECT * FROM name; + + UNLOGGED + + + If specified, the sequence is created as an unlogged sequence. Changes + to unlogged sequences are not written to the write-ahead log. They are + not crash-safe: an unlogged sequence is automatically reset to its + initial state after a crash or unclean shutdown. Unlogged sequences are + also not replicated to standby servers. + + + + Unlike unlogged tables, unlogged sequences do not offer a significant + performance advantage. This option is mainly intended for sequences + associated with unlogged tables via identity columns or serial columns. + In those cases, it usually wouldn't make sense to have the sequence + WAL-logged and replicated but not its associated table. + + + + IF NOT EXISTS diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml index 7e4ef312c0..6c9918b0a1 100644 --- a/doc/src/sgml/ref/create_table.sgml +++ b/doc/src/sgml/ref/create_table.sgml @@ -215,6 +215,11 @@ WITH ( MODULUS numeric_literal, REM Any indexes created on an unlogged table are automatically unlogged as well. + + + If this is specified, any sequences created together with the unlogged + table (for identity or serial columns) are also created as unlogged. + diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml index 2f0042fd96..723b2a1a66 100644 --- a/doc/src/sgml/ref/pg_dump.sgml +++ b/doc/src/sgml/ref/pg_dump.sgml @@ -981,9 +981,10 @@ PostgreSQL documentation - Do not dump the contents of unlogged tables. This option has no - effect on whether or not the table definitions (schema) are dumped; - it only suppresses dumping the table data. Data in unlogged tables + Do not dump the contents of unlogged tables and sequences. This + option has no effect on whether or not the table and sequence + definitions (schema) are dumped; it only suppresses dumping the table + and sequence data. Data in unlogged tables and sequences is always excluded when dumping from a standby server. diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index 717bb0b2aa..47f62c28d4 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -30,6 +30,7 @@ #include "catalog/objectaccess.h" #include "catalog/pg_sequence.h" #include "catalog/pg_type.h" +#include "catalog/storage_xlog.h" #include "commands/defrem.h" #include "commands/sequence.h" #include "commands/tablecmds.h" @@ -95,6 +96,7 @@ static HTAB *seqhashtab = NULL; /* hash table for SeqTable items */ static SeqTableData *last_used_seq = NULL; static void fill_seq_with_data(Relation rel, HeapTuple tuple); +static void fill_seq_fork_with_data(Relation rel, HeapTuple tuple, ForkNumber forkNum); static Relation lock_and_open_sequence(SeqTable seq); static void create_seq_hashtable(void); static void init_sequence(Oid relid, SeqTable *p_elm, Relation *p_rel); @@ -133,12 +135,6 @@ DefineSequence(ParseState *pstate, CreateSeqStmt *seq) bool pgs_nulls[Natts_pg_sequence]; int i; - /* Unlogged sequences are not implemented -- not clear if useful. */ - if (seq->sequence->relpersistence == RELPERSISTENCE_UNLOGGED) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("unlogged sequences are not supported"))); - /* * If if_not_exists was given and a relation with the same name already * exists, bail out. (Note: we needn't check this when not if_not_exists, @@ -492,9 +488,33 @@ SetSequence(Oid seq_relid, bool transactional, int64 last_value, int64 log_cnt, /* * Initialize a sequence's relation with the specified tuple as content + * + * This handles unlogged sequences by writing to both the main and the init + * fork as necessary. */ static void fill_seq_with_data(Relation rel, HeapTuple tuple) +{ + fill_seq_fork_with_data(rel, tuple, MAIN_FORKNUM); + + if (rel->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED) + { + SMgrRelation srel; + + srel = smgropen(rel->rd_node, InvalidBackendId); + smgrcreate(srel, INIT_FORKNUM, false); + log_smgrcreate(&rel->rd_node, INIT_FORKNUM); + fill_seq_fork_with_data(rel, tuple, INIT_FORKNUM); + FlushRelationBuffers(rel); + smgrclose(srel); + } +} + +/* + * Initialize a sequence's relation fork with the specified tuple as content + */ +static void +fill_seq_fork_with_data(Relation rel, HeapTuple tuple, ForkNumber forkNum) { Buffer buf; Page page; @@ -503,7 +523,7 @@ fill_seq_with_data(Relation rel, HeapTuple tuple) /* Initialize first page of relation with special magic number */ - buf = ReadBuffer(rel, P_NEW); + buf = ReadBufferExtended(rel, forkNum, P_NEW, RBM_NORMAL, NULL); Assert(BufferGetBlockNumber(buf) == 0); page = BufferGetPage(buf); @@ -549,7 +569,7 @@ fill_seq_with_data(Relation rel, HeapTuple tuple) elog(ERROR, "failed to add sequence tuple to page"); /* XLOG stuff */ - if (RelationNeedsWAL(rel)) + if (RelationNeedsWAL(rel) || forkNum == INIT_FORKNUM) { xl_seq_rec xlrec; XLogRecPtr recptr; @@ -682,6 +702,28 @@ AlterSequence(ParseState *pstate, AlterSeqStmt *stmt) return address; } +void +SequenceChangePersistence(Oid relid, char newrelpersistence) +{ + SeqTable elm; + Relation seqrel; + Buffer buf; + HeapTupleData seqdatatuple; + + init_sequence(relid, &elm, &seqrel); + + /* check the comment above nextval_internal()'s equivalent call. */ + if (RelationNeedsWAL(seqrel)) + GetTopTransactionId(); + + (void) read_seq_tuple(seqrel, &buf, &seqdatatuple); + RelationSetNewRelfilenode(seqrel, newrelpersistence); + fill_seq_with_data(seqrel, &seqdatatuple); + UnlockReleaseBuffer(buf); + + relation_close(seqrel, NoLock); +} + void DeleteSequenceTuple(Oid relid) { diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index a241b44497..4dd545cdd2 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -319,6 +319,7 @@ struct DropRelationCallbackState #define ATT_COMPOSITE_TYPE 0x0010 #define ATT_FOREIGN_TABLE 0x0020 #define ATT_PARTITIONED_INDEX 0x0040 +#define ATT_SEQUENCE 0x0080 /* * ForeignTruncateInfo @@ -4660,7 +4661,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, pass = AT_PASS_MISC; break; case AT_SetLogged: /* SET LOGGED */ - ATSimplePermissions(cmd->subtype, rel, ATT_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_SEQUENCE); if (tab->chgPersistence) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -4675,7 +4676,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, pass = AT_PASS_MISC; break; case AT_SetUnLogged: /* SET UNLOGGED */ - ATSimplePermissions(cmd->subtype, rel, ATT_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_SEQUENCE); if (tab->chgPersistence) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -5425,7 +5426,7 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, * and assigns a new relfilenode, we automatically create or drop an * init fork for the relation as appropriate. */ - if (tab->rewrite > 0) + if (tab->rewrite > 0 && tab->relkind != RELKIND_SEQUENCE) { /* Build a temporary relation and copy data */ Relation OldHeap; @@ -5546,6 +5547,11 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, InvokeObjectPostAlterHook(RelationRelationId, tab->relid, 0); } + else if (tab->rewrite > 0 && tab->relkind == RELKIND_SEQUENCE) + { + if (tab->chgPersistence) + SequenceChangePersistence(tab->relid, tab->newrelpersistence); + } else { /* @@ -5564,6 +5570,23 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, if (tab->newTableSpace) ATExecSetTableSpace(tab->relid, tab->newTableSpace, lockmode); } + + /* + * Also change persistence of owned sequences, so that it matches the + * table persistence. + */ + if (tab->chgPersistence) + { + List *seqlist = getOwnedSequences(tab->relid); + ListCell *lc; + + foreach(lc, seqlist) + { + Oid seq_relid = lfirst_oid(lc); + + SequenceChangePersistence(seq_relid, tab->newrelpersistence); + } + } } /* @@ -6224,6 +6247,9 @@ ATSimplePermissions(AlterTableType cmdtype, Relation rel, int allowed_targets) case RELKIND_FOREIGN_TABLE: actual_target = ATT_FOREIGN_TABLE; break; + case RELKIND_SEQUENCE: + actual_target = ATT_SEQUENCE; + break; default: actual_target = 0; break; diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index cd946c7692..2826559d09 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -445,6 +445,7 @@ generateSerialExtraStmts(CreateStmtContext *cxt, ColumnDef *column, seqstmt = makeNode(CreateSeqStmt); seqstmt->for_identity = for_identity; seqstmt->sequence = makeRangeVar(snamespace, sname, -1); + seqstmt->sequence->relpersistence = cxt->relation->relpersistence; seqstmt->options = seqoptions; /* diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 535b160165..3c2201a725 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -16570,6 +16570,7 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo) PQExpBuffer query = createPQExpBuffer(); PQExpBuffer delqry = createPQExpBuffer(); char *qseqname; + TableInfo *owning_tab = NULL; qseqname = pg_strdup(fmtId(tbinfo->dobj.name)); @@ -16678,7 +16679,7 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo) if (tbinfo->is_identity_sequence) { - TableInfo *owning_tab = findTableByOid(tbinfo->owning_tab); + owning_tab = findTableByOid(tbinfo->owning_tab); appendPQExpBuffer(query, "ALTER TABLE %s ", @@ -16696,7 +16697,9 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo) else { appendPQExpBuffer(query, - "CREATE SEQUENCE %s\n", + "CREATE %sSEQUENCE %s\n", + tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED ? + "UNLOGGED " : "", fmtQualifiedDumpable(tbinfo)); if (strcmp(seqtype, "bigint") != 0) @@ -16722,7 +16725,15 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo) cache, (cycled ? "\n CYCLE" : "")); if (tbinfo->is_identity_sequence) + { appendPQExpBufferStr(query, "\n);\n"); + if (tbinfo->relpersistence != owning_tab->relpersistence) + appendPQExpBuffer(query, + "ALTER SEQUENCE %s SET %s;\n", + fmtQualifiedDumpable(tbinfo), + tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED ? + "UNLOGGED" : "LOGGED"); + } else appendPQExpBufferStr(query, ";\n"); diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 4dddf08789..73bbbe2eb4 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -1681,8 +1681,12 @@ describeOneTableDetails(const char *schemaname, printTableInit(&cont, &myopt, title.data, 7, numrows); printTableInitialized = true; - printfPQExpBuffer(&title, _("Sequence \"%s.%s\""), - schemaname, relationname); + if (tableinfo.relpersistence == 'u') + printfPQExpBuffer(&title, _("Unlogged sequence \"%s.%s\""), + schemaname, relationname); + else + printfPQExpBuffer(&title, _("Sequence \"%s.%s\""), + schemaname, relationname); printTableAddHeader(&cont, gettext_noop("Type"), true, 'l'); printTableAddHeader(&cont, gettext_noop("Start"), true, 'r'); diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 32d0b4855f..025d3f71a1 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -2116,7 +2116,7 @@ psql_completion(const char *text, int start, int end) /* ALTER SEQUENCE */ else if (Matches("ALTER", "SEQUENCE", MatchAny)) COMPLETE_WITH("AS", "INCREMENT", "MINVALUE", "MAXVALUE", "RESTART", - "NO", "CACHE", "CYCLE", "SET SCHEMA", "OWNED BY", + "NO", "CACHE", "CYCLE", "SET", "OWNED BY", "OWNER TO", "RENAME TO"); /* ALTER SEQUENCE AS */ else if (TailMatches("ALTER", "SEQUENCE", MatchAny, "AS")) @@ -2124,6 +2124,9 @@ psql_completion(const char *text, int start, int end) /* ALTER SEQUENCE NO */ else if (Matches("ALTER", "SEQUENCE", MatchAny, "NO")) COMPLETE_WITH("MINVALUE", "MAXVALUE", "CYCLE"); + /* ALTER SEQUENCE SET */ + else if (Matches("ALTER", "SEQUENCE", MatchAny, "SET")) + COMPLETE_WITH("SCHEMA", "LOGGED", "UNLOGGED"); /* ALTER SERVER */ else if (Matches("ALTER", "SERVER", MatchAny)) COMPLETE_WITH("VERSION", "OPTIONS", "OWNER TO", "RENAME TO"); diff --git a/src/include/commands/sequence.h b/src/include/commands/sequence.h index 5bab90db8e..f2381982d5 100644 --- a/src/include/commands/sequence.h +++ b/src/include/commands/sequence.h @@ -58,6 +58,7 @@ extern List *sequence_options(Oid relid); extern ObjectAddress DefineSequence(ParseState *pstate, CreateSeqStmt *stmt); extern ObjectAddress AlterSequence(ParseState *pstate, AlterSeqStmt *stmt); +extern void SequenceChangePersistence(Oid relid, char newrelpersistence); extern void DeleteSequenceTuple(Oid relid); extern void ResetSequence(Oid seq_relid); extern void SetSequence(Oid seq_relid, bool transactional, int64 last_value, int64 log_cnt, bool is_called); diff --git a/src/test/recovery/t/014_unlogged_reinit.pl b/src/test/recovery/t/014_unlogged_reinit.pl index f3199fbd2e..0dca3f69fe 100644 --- a/src/test/recovery/t/014_unlogged_reinit.pl +++ b/src/test/recovery/t/014_unlogged_reinit.pl @@ -18,16 +18,27 @@ $node->start; my $pgdata = $node->data_dir; -# Create an unlogged table to test that forks other than init are not -# copied. +# Create an unlogged table and an unlogged sequence to test that forks +# other than init are not copied. $node->safe_psql('postgres', 'CREATE UNLOGGED TABLE base_unlogged (id int)'); +$node->safe_psql('postgres', 'CREATE UNLOGGED SEQUENCE seq_unlogged'); my $baseUnloggedPath = $node->safe_psql('postgres', q{select pg_relation_filepath('base_unlogged')}); +my $seqUnloggedPath = $node->safe_psql('postgres', + q{select pg_relation_filepath('seq_unlogged')}); # Test that main and init forks exist. -ok(-f "$pgdata/${baseUnloggedPath}_init", 'init fork in base exists'); -ok(-f "$pgdata/$baseUnloggedPath", 'main fork in base exists'); +ok(-f "$pgdata/${baseUnloggedPath}_init", 'table init fork exists'); +ok(-f "$pgdata/$baseUnloggedPath", 'table main fork exists'); +ok(-f "$pgdata/${seqUnloggedPath}_init", 'sequence init fork exists'); +ok(-f "$pgdata/$seqUnloggedPath", 'sequence main fork exists'); + +# Test the sequence +is($node->safe_psql('postgres', "SELECT nextval('seq_unlogged')"), + 1, 'sequence nextval'); +is($node->safe_psql('postgres', "SELECT nextval('seq_unlogged')"), + 2, 'sequence nextval again'); # Create an unlogged table in a tablespace. @@ -44,6 +55,19 @@ ok(-f "$pgdata/${ts1UnloggedPath}_init", 'init fork in tablespace exists'); ok(-f "$pgdata/$ts1UnloggedPath", 'main fork in tablespace exists'); +# Create more unlogged sequences for testing. +$node->safe_psql('postgres', 'CREATE UNLOGGED SEQUENCE seq_unlogged2'); +# This rewrites the sequence relation in AlterSequence(). +$node->safe_psql('postgres', 'ALTER SEQUENCE seq_unlogged2 INCREMENT 2'); +$node->safe_psql('postgres', "SELECT nextval('seq_unlogged2')"); + +$node->safe_psql('postgres', + 'CREATE UNLOGGED TABLE tab_seq_unlogged3 (a int GENERATED ALWAYS AS IDENTITY)' +); +# This rewrites the sequence relation in ResetSequence(). +$node->safe_psql('postgres', 'TRUNCATE tab_seq_unlogged3 RESTART IDENTITY'); +$node->safe_psql('postgres', 'INSERT INTO tab_seq_unlogged3 DEFAULT VALUES'); + # Crash the postmaster. $node->stop('immediate'); @@ -54,6 +78,8 @@ # Remove main fork to test that it is recopied from init. unlink("$pgdata/${baseUnloggedPath}") or BAIL_OUT("could not remove \"${baseUnloggedPath}\": $!"); +unlink("$pgdata/${seqUnloggedPath}") + or BAIL_OUT("could not remove \"${seqUnloggedPath}\": $!"); # the same for the tablespace append_to_file("$pgdata/${ts1UnloggedPath}_vm", 'TEST_VM'); @@ -64,13 +90,25 @@ $node->start; # check unlogged table in base -ok(-f "$pgdata/${baseUnloggedPath}_init", 'init fork in base still exists'); -ok(-f "$pgdata/$baseUnloggedPath", 'main fork in base recreated at startup'); +ok( -f "$pgdata/${baseUnloggedPath}_init", + 'table init fork in base still exists'); +ok(-f "$pgdata/$baseUnloggedPath", + 'table main fork in base recreated at startup'); ok(!-f "$pgdata/${baseUnloggedPath}_vm", 'vm fork in base removed at startup'); ok( !-f "$pgdata/${baseUnloggedPath}_fsm", 'fsm fork in base removed at startup'); +# check unlogged sequence +ok(-f "$pgdata/${seqUnloggedPath}_init", 'sequence init fork still exists'); +ok(-f "$pgdata/$seqUnloggedPath", 'sequence main fork recreated at startup'); + +# Test the sequence after restart +is($node->safe_psql('postgres', "SELECT nextval('seq_unlogged')"), + 1, 'sequence nextval after restart'); +is($node->safe_psql('postgres', "SELECT nextval('seq_unlogged')"), + 2, 'sequence nextval after restart again'); + # check unlogged table in tablespace ok( -f "$pgdata/${ts1UnloggedPath}_init", 'init fork still exists in tablespace'); @@ -81,4 +119,15 @@ ok( !-f "$pgdata/${ts1UnloggedPath}_fsm", 'fsm fork in tablespace removed at startup'); +# Test other sequences +is($node->safe_psql('postgres', "SELECT nextval('seq_unlogged2')"), + 1, 'altered sequence nextval after restart'); +is($node->safe_psql('postgres', "SELECT nextval('seq_unlogged2')"), + 3, 'altered sequence nextval after restart again'); + +$node->safe_psql('postgres', + "INSERT INTO tab_seq_unlogged3 VALUES (DEFAULT), (DEFAULT)"); +is($node->safe_psql('postgres', "SELECT * FROM tab_seq_unlogged3"), + "1\n2", 'reset sequence nextval after restart'); + done_testing(); diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 07473dd660..5ede56d9b5 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -3461,7 +3461,7 @@ ORDER BY relname; unlogged1 | r | u unlogged1 toast index | i | u unlogged1 toast table | t | u - unlogged1_f1_seq | S | p + unlogged1_f1_seq | S | u unlogged1_pkey | i | u (5 rows) @@ -3528,7 +3528,7 @@ ORDER BY relname; logged1 | r | u logged1 toast index | i | u logged1 toast table | t | u - logged1_f1_seq | S | p + logged1_f1_seq | S | u logged1_pkey | i | u (5 rows) diff --git a/src/test/regress/expected/sequence.out b/src/test/regress/expected/sequence.out index 71c2b0f1df..7cb2f7cc02 100644 --- a/src/test/regress/expected/sequence.out +++ b/src/test/regress/expected/sequence.out @@ -2,8 +2,6 @@ -- CREATE SEQUENCE -- -- various error cases -CREATE UNLOGGED SEQUENCE sequence_testx; -ERROR: unlogged sequences are not supported CREATE SEQUENCE sequence_testx INCREMENT BY 0; ERROR: INCREMENT must not be zero CREATE SEQUENCE sequence_testx INCREMENT BY -1 MINVALUE 20; @@ -600,6 +598,24 @@ DROP SEQUENCE seq2; -- should fail SELECT lastval(); ERROR: lastval is not yet defined in this session +-- unlogged sequences +-- (more tests in src/test/recovery/) +CREATE UNLOGGED SEQUENCE sequence_test_unlogged; +ALTER SEQUENCE sequence_test_unlogged SET LOGGED; +\d sequence_test_unlogged + Sequence "public.sequence_test_unlogged" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+---------+---------------------+-----------+---------+------- + bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 + +ALTER SEQUENCE sequence_test_unlogged SET UNLOGGED; +\d sequence_test_unlogged + Unlogged sequence "public.sequence_test_unlogged" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +--------+-------+---------+---------------------+-----------+---------+------- + bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 + +DROP SEQUENCE sequence_test_unlogged; -- Test sequences in read-only transactions CREATE TEMPORARY SEQUENCE sequence_test_temp1; START TRANSACTION READ ONLY; diff --git a/src/test/regress/sql/sequence.sql b/src/test/regress/sql/sequence.sql index 7928ee23ee..674f5f1f66 100644 --- a/src/test/regress/sql/sequence.sql +++ b/src/test/regress/sql/sequence.sql @@ -3,7 +3,6 @@ -- -- various error cases -CREATE UNLOGGED SEQUENCE sequence_testx; CREATE SEQUENCE sequence_testx INCREMENT BY 0; CREATE SEQUENCE sequence_testx INCREMENT BY -1 MINVALUE 20; CREATE SEQUENCE sequence_testx INCREMENT BY 1 MAXVALUE -20; @@ -272,6 +271,15 @@ DROP SEQUENCE seq2; -- should fail SELECT lastval(); +-- unlogged sequences +-- (more tests in src/test/recovery/) +CREATE UNLOGGED SEQUENCE sequence_test_unlogged; +ALTER SEQUENCE sequence_test_unlogged SET LOGGED; +\d sequence_test_unlogged +ALTER SEQUENCE sequence_test_unlogged SET UNLOGGED; +\d sequence_test_unlogged +DROP SEQUENCE sequence_test_unlogged; + -- Test sequences in read-only transactions CREATE TEMPORARY SEQUENCE sequence_test_temp1; START TRANSACTION READ ONLY; From 957aa4d87a419d18710283cf4f53ba7d3ead6bbe Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Thu, 7 Apr 2022 08:40:16 -0700 Subject: [PATCH 431/772] Fix another buildfarm issue from commit 5c279a6d350. Discussion: https://postgr.es/m/3280724.1649340315@sss.pgh.pa.us --- src/include/access/xlog_internal.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h index f69ea2355d..d9df7f295d 100644 --- a/src/include/access/xlog_internal.h +++ b/src/include/access/xlog_internal.h @@ -326,6 +326,7 @@ extern void RmgrCleanup(void); extern void RmgrNotFound(RmgrId rmid); extern void RegisterCustomRmgr(RmgrId rmid, RmgrData *rmgr); +#ifndef FRONTEND static inline bool RmgrIdExists(RmgrId rmid) { @@ -339,6 +340,7 @@ GetRmgr(RmgrId rmid) RmgrNotFound(rmid); return RmgrTable[rmid]; } +#endif /* * Exported to support xlog switching from checkpointer From dad97e0502b4a5fc125c83e9092d9673f0e91805 Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Thu, 7 Apr 2022 09:14:49 -0700 Subject: [PATCH 432/772] Fix off-by-one error in pg_waldump, introduced in 5c279a6d350. Per report by Bharath Rupireddy. Discussion: https://postgr.es/m/CALj2ACX+PWDK2MYjdu8CB1ot7OUSo6kd5-fkkEgduEsTSZjAEw@mail.gmail.com --- src/bin/pg_waldump/pg_waldump.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 7d92dcaf87..30ca7684bd 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -720,7 +720,7 @@ XLogDumpDisplayStats(XLogDumpConfig *config, XLogDumpStats *stats) * calculate column totals. */ - for (ri = 0; ri < RM_MAX_ID; ri++) + for (ri = 0; ri <= RM_MAX_ID; ri++) { total_count += stats->rmgr_stats[ri].count; total_rec_len += stats->rmgr_stats[ri].rec_len; From d7ab2a9a3c0a2800ab36bb48d1cc97370067777e Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 7 Apr 2022 18:23:28 +0200 Subject: [PATCH 433/772] doc: Fix man page whitespace issues Whitespace between tags is significant, and in some cases it creates extra vertical space in man pages. The fix is to remove some newlines in the markup. --- doc/src/sgml/ref/alter_publication.sgml | 3 +-- doc/src/sgml/ref/alter_subscription.sgml | 3 +-- doc/src/sgml/ref/alter_table.sgml | 3 +-- doc/src/sgml/ref/create_subscription.sgml | 3 +-- doc/src/sgml/ref/create_trigger.sgml | 8 +++----- doc/src/sgml/ref/drop_procedure.sgml | 3 +-- doc/src/sgml/ref/merge.sgml | 6 ++---- doc/src/sgml/ref/pg_basebackup.sgml | 3 +-- doc/src/sgml/ref/pgbench.sgml | 12 ++++-------- 9 files changed, 15 insertions(+), 29 deletions(-) diff --git a/doc/src/sgml/ref/alter_publication.sgml b/doc/src/sgml/ref/alter_publication.sgml index 40366a10fe..db14d7a772 100644 --- a/doc/src/sgml/ref/alter_publication.sgml +++ b/doc/src/sgml/ref/alter_publication.sgml @@ -218,8 +218,7 @@ ALTER PUBLICATION sales_publication ADD ALL TABLES IN SCHEMA marketing, sales; production_publication: ALTER PUBLICATION production_publication ADD TABLE users, departments, ALL TABLES IN SCHEMA production; - - + diff --git a/doc/src/sgml/ref/alter_subscription.sgml b/doc/src/sgml/ref/alter_subscription.sgml index fe13ab9a2d..c1994e3a94 100644 --- a/doc/src/sgml/ref/alter_subscription.sgml +++ b/doc/src/sgml/ref/alter_subscription.sgml @@ -249,8 +249,7 @@ ALTER SUBSCRIPTION name RENAME TO < - - + diff --git a/doc/src/sgml/ref/alter_table.sgml b/doc/src/sgml/ref/alter_table.sgml index c2a458eb5d..a3c62bf056 100644 --- a/doc/src/sgml/ref/alter_table.sgml +++ b/doc/src/sgml/ref/alter_table.sgml @@ -923,8 +923,7 @@ WITH ( MODULUS numeric_literal, REM - - + diff --git a/doc/src/sgml/ref/create_subscription.sgml b/doc/src/sgml/ref/create_subscription.sgml index ebf7db57c5..203bb41844 100644 --- a/doc/src/sgml/ref/create_subscription.sgml +++ b/doc/src/sgml/ref/create_subscription.sgml @@ -302,8 +302,7 @@ CREATE SUBSCRIPTION subscription_name - - + diff --git a/doc/src/sgml/ref/create_trigger.sgml b/doc/src/sgml/ref/create_trigger.sgml index e4afa1c01d..ee42f413e9 100644 --- a/doc/src/sgml/ref/create_trigger.sgml +++ b/doc/src/sgml/ref/create_trigger.sgml @@ -175,12 +175,10 @@ CREATE [ OR REPLACE ] [ CONSTRAINT ] TRIGGER name - - trigger - constraint trigger - When the CONSTRAINT option is specified, this command creates a - constraint trigger. This is the same as a regular trigger + constraint trigger.trigger + constraint trigger + This is the same as a regular trigger except that the timing of the trigger firing can be adjusted using SET CONSTRAINTS. Constraint triggers must be AFTER ROW triggers on plain diff --git a/doc/src/sgml/ref/drop_procedure.sgml b/doc/src/sgml/ref/drop_procedure.sgml index 4c86062f34..84e6b09fee 100644 --- a/doc/src/sgml/ref/drop_procedure.sgml +++ b/doc/src/sgml/ref/drop_procedure.sgml @@ -194,8 +194,7 @@ DROP PROCEDURE do_db_maintenance(text, text); -- potentially ambiguous However, the last example would be ambiguous if there is also, say, CREATE PROCEDURE do_db_maintenance(IN target_schema text, IN options text) ... - - + diff --git a/doc/src/sgml/ref/merge.sgml b/doc/src/sgml/ref/merge.sgml index ac1c0a83dd..f68aa09736 100644 --- a/doc/src/sgml/ref/merge.sgml +++ b/doc/src/sgml/ref/merge.sgml @@ -472,11 +472,9 @@ MERGE total_count the action's event type. - - + - - + diff --git a/doc/src/sgml/ref/pg_basebackup.sgml b/doc/src/sgml/ref/pg_basebackup.sgml index 6468f45cf3..56ac7b754b 100644 --- a/doc/src/sgml/ref/pg_basebackup.sgml +++ b/doc/src/sgml/ref/pg_basebackup.sgml @@ -994,8 +994,7 @@ PostgreSQL documentation directory backup: $ pg_basebackup -D backup -Ft --compress=gzip:9 - - + diff --git a/doc/src/sgml/ref/pgbench.sgml b/doc/src/sgml/ref/pgbench.sgml index d1818ff316..9ba26e5e86 100644 --- a/doc/src/sgml/ref/pgbench.sgml +++ b/doc/src/sgml/ref/pgbench.sgml @@ -2459,11 +2459,9 @@ END; Here is some example output with following options: -pgbench --aggregate-interval=10 --time=20 --client=10 --log --rate=1000 ---latency-limit=10 --failures-detailed --max-tries=10 test - +pgbench --aggregate-interval=10 --time=20 --client=10 --log --rate=1000 +--latency-limit=10 --failures-detailed --max-tries=10 test - 1649114136 5815 27552565 177846919143 1078 21716 2756787 7264696105 0 9661 0 7854 31472 4022 4022 0 1649114146 5958 28460110 182785513108 1083 20391 2539395 6411761497 0 7268 0 8127 32595 4101 4101 0 @@ -2581,8 +2579,7 @@ statement latencies in milliseconds, failures and retries: 0.582 3363 41576 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; 0.465 0 0 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); 1.933 0 0 END; - - + If multiple script files are specified, all statistics are reported @@ -2637,8 +2634,7 @@ statement latencies in milliseconds, failures and retries: supposed to never occur...). - - + From 2c7ea57e56ca5f668c32d4266e0a3e45b455bef5 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Thu, 7 Apr 2022 18:13:13 +0200 Subject: [PATCH 434/772] Revert "Logical decoding of sequences" This reverts a sequence of commits, implementing features related to logical decoding and replication of sequences: - 0da92dc530c9251735fc70b20cd004d9630a1266 - 80901b32913ffa59bf157a4d88284b2b3a7511d9 - b779d7d8fdae088d70da5ed9fcd8205035676df3 - d5ed9da41d96988d905b49bebb273a9b2d6e2915 - a180c2b34de0989269fdb819bff241a249bf5380 - 75b1521dae1ff1fde17fda2e30e591f2e5d64b6a - 2d2232933b02d9396113662e44dca5f120d6830e - 002c9dd97a0c874fd1693a570383e2dd38cd40d5 - 05843b1aa49df2ecc9b97c693b755bd1b6f856a9 The implementation has issues, mostly due to combining transactional and non-transactional behavior of sequences. It's not clear how this could be fixed, but it'll require reworking significant part of the patch. Discussion: https://postgr.es/m/95345a19-d508-63d1-860a-f5c2f41e8d40@enterprisedb.com --- contrib/test_decoding/Makefile | 3 +- contrib/test_decoding/expected/ddl.out | 38 +- .../expected/decoding_in_xact.out | 4 +- .../expected/decoding_into_rel.out | 10 +- contrib/test_decoding/expected/mxact.out | 8 +- .../test_decoding/expected/ondisk_startup.out | 4 +- contrib/test_decoding/expected/replorigin.out | 12 +- contrib/test_decoding/expected/rewrite.out | 6 +- contrib/test_decoding/expected/sequence.out | 325 ----- contrib/test_decoding/expected/slot.out | 8 +- contrib/test_decoding/expected/toast.out | 10 +- contrib/test_decoding/expected/truncate.out | 2 +- contrib/test_decoding/specs/mxact.spec | 2 +- .../test_decoding/specs/ondisk_startup.spec | 2 +- contrib/test_decoding/sql/ddl.sql | 38 +- .../test_decoding/sql/decoding_in_xact.sql | 4 +- .../test_decoding/sql/decoding_into_rel.sql | 10 +- contrib/test_decoding/sql/replorigin.sql | 12 +- contrib/test_decoding/sql/rewrite.sql | 6 +- contrib/test_decoding/sql/sequence.sql | 119 -- contrib/test_decoding/sql/slot.sql | 8 +- contrib/test_decoding/sql/toast.sql | 10 +- contrib/test_decoding/sql/truncate.sql | 2 +- contrib/test_decoding/test_decoding.c | 87 -- doc/src/sgml/catalogs.sgml | 81 -- doc/src/sgml/logicaldecoding.sgml | 65 +- doc/src/sgml/protocol.sgml | 119 -- doc/src/sgml/ref/alter_publication.sgml | 25 +- doc/src/sgml/ref/alter_subscription.sgml | 8 +- doc/src/sgml/ref/create_publication.sgml | 51 +- src/backend/catalog/objectaddress.c | 44 +- src/backend/catalog/pg_publication.c | 328 +----- src/backend/catalog/system_views.sql | 10 - src/backend/commands/publicationcmds.c | 435 ++----- src/backend/commands/sequence.c | 186 --- src/backend/commands/subscriptioncmds.c | 101 +- src/backend/commands/tablecmds.c | 27 +- src/backend/executor/execReplication.c | 4 +- src/backend/nodes/copyfuncs.c | 4 +- src/backend/nodes/equalfuncs.c | 4 +- src/backend/parser/gram.y | 79 +- src/backend/replication/logical/decode.c | 131 --- src/backend/replication/logical/logical.c | 88 -- src/backend/replication/logical/proto.c | 52 - .../replication/logical/reorderbuffer.c | 405 ------- src/backend/replication/logical/tablesync.c | 109 +- src/backend/replication/logical/worker.c | 56 - src/backend/replication/pgoutput/pgoutput.c | 94 +- src/backend/utils/cache/relcache.c | 28 +- src/backend/utils/cache/syscache.c | 6 +- src/bin/pg_dump/pg_dump.c | 64 +- src/bin/pg_dump/pg_dump.h | 3 - src/bin/pg_dump/t/002_pg_dump.pl | 40 +- src/bin/psql/describe.c | 297 ++--- src/bin/psql/tab-complete.c | 36 +- src/include/access/rmgrlist.h | 2 +- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.dat | 5 - src/include/catalog/pg_publication.h | 27 +- .../catalog/pg_publication_namespace.h | 10 +- src/include/commands/sequence.h | 2 - src/include/nodes/parsenodes.h | 8 +- src/include/replication/decode.h | 1 - src/include/replication/logicalproto.h | 19 - src/include/replication/output_plugin.h | 27 - src/include/replication/pgoutput.h | 1 - src/include/replication/reorderbuffer.h | 43 +- src/test/regress/expected/object_address.out | 10 +- src/test/regress/expected/publication.out | 1043 +++-------------- src/test/regress/expected/rules.out | 8 - src/test/regress/sql/object_address.sql | 5 +- src/test/regress/sql/publication.sql | 242 +--- src/test/subscription/t/030_sequences.pl | 202 ---- 73 files changed, 605 insertions(+), 4762 deletions(-) delete mode 100644 contrib/test_decoding/expected/sequence.out delete mode 100644 contrib/test_decoding/sql/sequence.sql delete mode 100644 src/test/subscription/t/030_sequences.pl diff --git a/contrib/test_decoding/Makefile b/contrib/test_decoding/Makefile index 36929dd97d..b220906479 100644 --- a/contrib/test_decoding/Makefile +++ b/contrib/test_decoding/Makefile @@ -5,8 +5,7 @@ PGFILEDESC = "test_decoding - example of a logical decoding output plugin" REGRESS = ddl xact rewrite toast permissions decoding_in_xact \ decoding_into_rel binary prepared replorigin time messages \ - spill slot truncate stream stats twophase twophase_stream \ - sequence + spill slot truncate stream stats twophase twophase_stream ISOLATION = mxact delayed_startup ondisk_startup concurrent_ddl_dml \ oldest_xmin snapshot_transfer subxact_without_top concurrent_stream \ twophase_snapshot slot_creation_error diff --git a/contrib/test_decoding/expected/ddl.out b/contrib/test_decoding/expected/ddl.out index 1e37c8c897..9a28b5ddc5 100644 --- a/contrib/test_decoding/expected/ddl.out +++ b/contrib/test_decoding/expected/ddl.out @@ -40,7 +40,7 @@ SELECT 'init' FROM pg_create_physical_replication_slot('repl'); init (1 row) -SELECT data FROM pg_logical_slot_get_changes('repl', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('repl', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); ERROR: cannot use physical replication slot for logical decoding SELECT pg_drop_replication_slot('repl'); pg_drop_replication_slot @@ -89,7 +89,7 @@ COMMIT; ALTER TABLE replication_example RENAME COLUMN text TO somenum; INSERT INTO replication_example(somedata, somenum) VALUES (4, 1); -- collect all changes -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data --------------------------------------------------------------------------------------------------------------------------- BEGIN @@ -118,7 +118,7 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc ALTER TABLE replication_example ALTER COLUMN somenum TYPE int4 USING (somenum::int4); -- check that this doesn't produce any changes from the heap rewrite -SELECT count(data) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT count(data) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); count ------- 0 @@ -134,7 +134,7 @@ INSERT INTO replication_example(somedata, somenum, zaphod2) VALUES (6, 3, 1); INSERT INTO replication_example(somedata, somenum, zaphod1) VALUES (6, 4, 2); COMMIT; -- show changes -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ------------------------------------------------------------------------------------------------------------------------------------------ BEGIN @@ -154,7 +154,7 @@ INSERT INTO replication_example(id, somedata, somenum) SELECT i, i, i FROM gener ON CONFLICT (id) DO UPDATE SET somenum = excluded.somenum + 1; COMMIT; /* display results */ -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data -------------------------------------------------------------------------------------------------------------------------------------------------- BEGIN @@ -242,7 +242,7 @@ CREATE TABLE tr_unique(id2 serial unique NOT NULL, data int); INSERT INTO tr_unique(data) VALUES(10); ALTER TABLE tr_unique RENAME TO tr_pkey; ALTER TABLE tr_pkey ADD COLUMN id serial primary key; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-rewrites', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-rewrites', '1'); data ----------------------------------------------------------------------------- BEGIN @@ -257,7 +257,7 @@ INSERT INTO tr_pkey(data) VALUES(1); --show deletion with primary key DELETE FROM tr_pkey; /* display results */ -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ---------------------------------------------------------------------------- BEGIN @@ -288,7 +288,7 @@ INSERT INTO tr_oddlength VALUES('ab', 'foo'); COMMIT; /* display results, but hide most of the output */ SELECT count(*), min(data), max(data) -FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0') +FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') GROUP BY substring(data, 1, 24) ORDER BY 1,2; count | min | max @@ -310,7 +310,7 @@ DELETE FROM spoolme; DROP TABLE spoolme; COMMIT; SELECT data -FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0') +FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') WHERE data ~ 'UPDATE'; data ------------------------------------------------------------------------------------------------------------- @@ -324,7 +324,7 @@ INSERT INTO tr_etoomuch (id, data) SELECT g.i, -g.i FROM generate_series(8000, 12000) g(i) ON CONFLICT(id) DO UPDATE SET data = EXCLUDED.data; SELECT substring(data, 1, 29), count(*) -FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0') WITH ORDINALITY +FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') WITH ORDINALITY GROUP BY 1 ORDER BY min(ordinality); substring | count @@ -355,7 +355,7 @@ RELEASE SAVEPOINT c; INSERT INTO tr_sub(path) VALUES ('1-top-2-#1'); RELEASE SAVEPOINT b; COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ---------------------------------------------------------------------- BEGIN @@ -394,7 +394,7 @@ INSERT INTO tr_sub(path) VALUES ('2-top-1...--#3'); RELEASE SAVEPOINT subtop; INSERT INTO tr_sub(path) VALUES ('2-top-#1'); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ------------------------------------------------------------------------ BEGIN @@ -415,7 +415,7 @@ INSERT INTO tr_sub(path) VALUES ('3-top-2-2-#1'); ROLLBACK TO SAVEPOINT b; INSERT INTO tr_sub(path) VALUES ('3-top-2-#2'); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ----------------------------------------------------------------------- BEGIN @@ -444,7 +444,7 @@ BEGIN; SAVEPOINT a; INSERT INTO tr_sub(path) VALUES ('5-top-1-#1'); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data --------------------------------------------------------------------- BEGIN @@ -465,7 +465,7 @@ ROLLBACK TO SAVEPOINT a; ALTER TABLE tr_sub_ddl ALTER COLUMN data TYPE bigint; INSERT INTO tr_sub_ddl VALUES(43); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data -------------------------------------------------- BEGIN @@ -542,7 +542,7 @@ Options: user_catalog_table=false INSERT INTO replication_metadata(relation, options) VALUES ('zaphod', NULL); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ------------------------------------------------------------------------------------------------------------------------------------ BEGIN @@ -659,7 +659,7 @@ INSERT INTO toasttable(toasted_col2) SELECT repeat(string_agg(to_char(g.i, 'FM00 UPDATE toasttable SET toasted_col1 = (SELECT string_agg(g.i::text, '') FROM generate_series(1, 2000) g(i)) WHERE id = 1; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ BEGIN @@ -814,7 +814,7 @@ UPDATE toasttable WHERE id = 1; -- make sure we decode correctly even if the toast table is gone DROP TABLE toasttable; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- BEGIN @@ -826,7 +826,7 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc (6 rows) -- done, free logical replication slot -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ------ (0 rows) diff --git a/contrib/test_decoding/expected/decoding_in_xact.out b/contrib/test_decoding/expected/decoding_in_xact.out index 0816c780fe..b65253f463 100644 --- a/contrib/test_decoding/expected/decoding_in_xact.out +++ b/contrib/test_decoding/expected/decoding_in_xact.out @@ -58,7 +58,7 @@ SELECT pg_current_xact_id() = '0'; -- don't show yet, haven't committed INSERT INTO nobarf(data) VALUES('2'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ----------------------------------------------------------- BEGIN @@ -68,7 +68,7 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc COMMIT; INSERT INTO nobarf(data) VALUES('3'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ----------------------------------------------------------- BEGIN diff --git a/contrib/test_decoding/expected/decoding_into_rel.out b/contrib/test_decoding/expected/decoding_into_rel.out index 03966b8b1c..8fd3390066 100644 --- a/contrib/test_decoding/expected/decoding_into_rel.out +++ b/contrib/test_decoding/expected/decoding_into_rel.out @@ -19,7 +19,7 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc CREATE TABLE somechange(id serial primary key); INSERT INTO somechange DEFAULT VALUES; CREATE TABLE changeresult AS - SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); + SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); SELECT * FROM changeresult; data ------------------------------------------------ @@ -29,9 +29,9 @@ SELECT * FROM changeresult; (3 rows) INSERT INTO changeresult - SELECT data FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); + SELECT data FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); INSERT INTO changeresult - SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); + SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); SELECT * FROM changeresult; data -------------------------------------------------------------------------------------------------------------------------------------------------- @@ -63,7 +63,7 @@ DROP TABLE somechange; CREATE FUNCTION slot_changes_wrapper(slot_name name) RETURNS SETOF TEXT AS $$ BEGIN RETURN QUERY - SELECT data FROM pg_logical_slot_peek_changes(slot_name, NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); + SELECT data FROM pg_logical_slot_peek_changes(slot_name, NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); END$$ LANGUAGE plpgsql; SELECT * FROM slot_changes_wrapper('regression_slot'); slot_changes_wrapper @@ -84,7 +84,7 @@ SELECT * FROM slot_changes_wrapper('regression_slot'); COMMIT (14 rows) -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- BEGIN diff --git a/contrib/test_decoding/expected/mxact.out b/contrib/test_decoding/expected/mxact.out index c5bc26c804..03ad3df099 100644 --- a/contrib/test_decoding/expected/mxact.out +++ b/contrib/test_decoding/expected/mxact.out @@ -7,7 +7,7 @@ step s0init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_sl init (1 row) -step s0start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false', 'include-sequences', 'false'); +step s0start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false'); data ---- (0 rows) @@ -27,7 +27,7 @@ t (1 row) step s0w: INSERT INTO do_write DEFAULT VALUES; -step s0start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false', 'include-sequences', 'false'); +step s0start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false'); data -------------------------------------------- BEGIN @@ -50,7 +50,7 @@ step s0init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_sl init (1 row) -step s0start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false', 'include-sequences', 'false'); +step s0start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false'); data ---- (0 rows) @@ -71,7 +71,7 @@ t step s0alter: ALTER TABLE do_write ADD column ts timestamptz; step s0w: INSERT INTO do_write DEFAULT VALUES; -step s0start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false', 'include-sequences', 'false'); +step s0start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false'); data ------------------------------------------------------------------------------ BEGIN diff --git a/contrib/test_decoding/expected/ondisk_startup.out b/contrib/test_decoding/expected/ondisk_startup.out index 3d2fa4a92e..bc7ff07164 100644 --- a/contrib/test_decoding/expected/ondisk_startup.out +++ b/contrib/test_decoding/expected/ondisk_startup.out @@ -35,7 +35,7 @@ init step s2c: COMMIT; step s1insert: INSERT INTO do_write DEFAULT VALUES; step s1checkpoint: CHECKPOINT; -step s1start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false', 'include-sequences', 'false'); +step s1start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false'); data -------------------------------------------------------------------- BEGIN @@ -46,7 +46,7 @@ COMMIT step s1insert: INSERT INTO do_write DEFAULT VALUES; step s1alter: ALTER TABLE do_write ADD COLUMN addedbys1 int; step s1insert: INSERT INTO do_write DEFAULT VALUES; -step s1start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false', 'include-sequences', 'false'); +step s1start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false'); data -------------------------------------------------------------------------------------------- BEGIN diff --git a/contrib/test_decoding/expected/replorigin.out b/contrib/test_decoding/expected/replorigin.out index 7468c24f2b..2e9ef7c823 100644 --- a/contrib/test_decoding/expected/replorigin.out +++ b/contrib/test_decoding/expected/replorigin.out @@ -72,9 +72,9 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_d -- origin tx INSERT INTO origin_tbl(data) VALUES ('will be replicated and decoded and decoded again'); INSERT INTO target_tbl(data) -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -- as is normal, the insert into target_tbl shows up -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- BEGIN @@ -110,7 +110,7 @@ SELECT pg_replication_origin_xact_setup('0/aabbccdd', '2013-01-01 00:00'); (1 row) INSERT INTO target_tbl(data) -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1'); COMMIT; -- check replication progress for the session is correct SELECT pg_replication_origin_session_progress(false); @@ -154,14 +154,14 @@ SELECT pg_replication_origin_progress('regress_test_decoding: regression_slot', SELECT pg_replication_origin_session_reset(); ERROR: no replication origin is configured -- and magically the replayed xact will be filtered! -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1'); data ------ (0 rows) --but new original changes still show up INSERT INTO origin_tbl(data) VALUES ('will be replicated'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1'); data -------------------------------------------------------------------------------- BEGIN @@ -227,7 +227,7 @@ SELECT local_id, external_id, 1 | regress_test_decoding: regression_slot_no_lsn | f | t (1 row) -SELECT data FROM pg_logical_slot_get_changes('regression_slot_no_lsn', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot_no_lsn', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); data ------------------------------------------------------------------------------------- BEGIN diff --git a/contrib/test_decoding/expected/rewrite.out b/contrib/test_decoding/expected/rewrite.out index 5d15b192ed..b30999c436 100644 --- a/contrib/test_decoding/expected/rewrite.out +++ b/contrib/test_decoding/expected/rewrite.out @@ -64,7 +64,7 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_d CREATE TABLE replication_example(id SERIAL PRIMARY KEY, somedata int, text varchar(120)); INSERT INTO replication_example(somedata) VALUES (1); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ---------------------------------------------------------------------------------------------------------- BEGIN @@ -115,7 +115,7 @@ INSERT INTO replication_example(somedata, testcolumn1, testcolumn3) VALUES (7, 5 COMMIT; -- make old files go away CHECKPOINT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- BEGIN @@ -141,7 +141,7 @@ VACUUM FULL pg_proc; VACUUM FULL pg_description; VACUUM FULL pg_shdescription; V INSERT INTO replication_example(somedata, testcolumn1, testcolumn3) VALUES (8, 6, 1); VACUUM FULL pg_proc; VACUUM FULL pg_description; VACUUM FULL pg_shdescription; VACUUM FULL iamalargetable; INSERT INTO replication_example(somedata, testcolumn1, testcolumn3) VALUES (9, 7, 1); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- BEGIN diff --git a/contrib/test_decoding/expected/sequence.out b/contrib/test_decoding/expected/sequence.out deleted file mode 100644 index dc1bf67012..0000000000 --- a/contrib/test_decoding/expected/sequence.out +++ /dev/null @@ -1,325 +0,0 @@ --- predictability -SET synchronous_commit = on; -SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding'); - ?column? ----------- - init -(1 row) - -CREATE SEQUENCE test_sequence; --- test the sequence changes by several nextval() calls -SELECT nextval('test_sequence'); - nextval ---------- - 1 -(1 row) - -SELECT nextval('test_sequence'); - nextval ---------- - 2 -(1 row) - -SELECT nextval('test_sequence'); - nextval ---------- - 3 -(1 row) - -SELECT nextval('test_sequence'); - nextval ---------- - 4 -(1 row) - --- test the sequence changes by several ALTER commands -ALTER SEQUENCE test_sequence INCREMENT BY 10; -SELECT nextval('test_sequence'); - nextval ---------- - 14 -(1 row) - -ALTER SEQUENCE test_sequence START WITH 3000; -ALTER SEQUENCE test_sequence MAXVALUE 10000; -ALTER SEQUENCE test_sequence RESTART WITH 4000; -SELECT nextval('test_sequence'); - nextval ---------- - 4000 -(1 row) - --- test the sequence changes by several setval() calls -SELECT setval('test_sequence', 3500); - setval --------- - 3500 -(1 row) - -SELECT nextval('test_sequence'); - nextval ---------- - 3510 -(1 row) - -SELECT setval('test_sequence', 3500, true); - setval --------- - 3500 -(1 row) - -SELECT nextval('test_sequence'); - nextval ---------- - 3510 -(1 row) - -SELECT setval('test_sequence', 3500, false); - setval --------- - 3500 -(1 row) - -SELECT nextval('test_sequence'); - nextval ---------- - 3500 -(1 row) - --- show results and drop sequence -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - data ----------------------------------------------------------------------------------------- - BEGIN - sequence public.test_sequence: transactional:1 last_value: 1 log_cnt: 0 is_called:0 - COMMIT - sequence public.test_sequence: transactional:0 last_value: 33 log_cnt: 0 is_called:1 - BEGIN - sequence public.test_sequence: transactional:1 last_value: 4 log_cnt: 0 is_called:1 - COMMIT - sequence public.test_sequence: transactional:0 last_value: 334 log_cnt: 0 is_called:1 - BEGIN - sequence public.test_sequence: transactional:1 last_value: 14 log_cnt: 32 is_called:1 - COMMIT - BEGIN - sequence public.test_sequence: transactional:1 last_value: 14 log_cnt: 0 is_called:1 - COMMIT - BEGIN - sequence public.test_sequence: transactional:1 last_value: 4000 log_cnt: 0 is_called:0 - COMMIT - sequence public.test_sequence: transactional:0 last_value: 4320 log_cnt: 0 is_called:1 - sequence public.test_sequence: transactional:0 last_value: 3500 log_cnt: 0 is_called:1 - sequence public.test_sequence: transactional:0 last_value: 3830 log_cnt: 0 is_called:1 - sequence public.test_sequence: transactional:0 last_value: 3500 log_cnt: 0 is_called:1 - sequence public.test_sequence: transactional:0 last_value: 3830 log_cnt: 0 is_called:1 - sequence public.test_sequence: transactional:0 last_value: 3500 log_cnt: 0 is_called:0 - sequence public.test_sequence: transactional:0 last_value: 3820 log_cnt: 0 is_called:1 -(24 rows) - -DROP SEQUENCE test_sequence; --- rollback on sequence creation and update -BEGIN; -CREATE SEQUENCE test_sequence; -CREATE TABLE test_table (a INT); -SELECT nextval('test_sequence'); - nextval ---------- - 1 -(1 row) - -SELECT nextval('test_sequence'); - nextval ---------- - 2 -(1 row) - -SELECT nextval('test_sequence'); - nextval ---------- - 3 -(1 row) - -SELECT setval('test_sequence', 3000); - setval --------- - 3000 -(1 row) - -SELECT nextval('test_sequence'); - nextval ---------- - 3001 -(1 row) - -SELECT nextval('test_sequence'); - nextval ---------- - 3002 -(1 row) - -SELECT nextval('test_sequence'); - nextval ---------- - 3003 -(1 row) - -ALTER SEQUENCE test_sequence RESTART WITH 6000; -INSERT INTO test_table VALUES( (SELECT nextval('test_sequence')) ); -SELECT nextval('test_sequence'); - nextval ---------- - 6001 -(1 row) - -ROLLBACK; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - data ------- -(0 rows) - --- rollback on table creation with serial column -BEGIN; -CREATE TABLE test_table (a SERIAL, b INT); -INSERT INTO test_table (b) VALUES (100); -INSERT INTO test_table (b) VALUES (200); -INSERT INTO test_table (b) VALUES (300); -SELECT setval('test_table_a_seq', 3000); - setval --------- - 3000 -(1 row) - -INSERT INTO test_table (b) VALUES (400); -INSERT INTO test_table (b) VALUES (500); -INSERT INTO test_table (b) VALUES (600); -ALTER SEQUENCE test_table_a_seq RESTART WITH 6000; -INSERT INTO test_table (b) VALUES (700); -INSERT INTO test_table (b) VALUES (800); -INSERT INTO test_table (b) VALUES (900); -ROLLBACK; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - data ------- -(0 rows) - --- rollback on table with serial column -CREATE TABLE test_table (a SERIAL, b INT); -BEGIN; -INSERT INTO test_table (b) VALUES (100); -INSERT INTO test_table (b) VALUES (200); -INSERT INTO test_table (b) VALUES (300); -SELECT setval('test_table_a_seq', 3000); - setval --------- - 3000 -(1 row) - -INSERT INTO test_table (b) VALUES (400); -INSERT INTO test_table (b) VALUES (500); -INSERT INTO test_table (b) VALUES (600); -ALTER SEQUENCE test_table_a_seq RESTART WITH 6000; -INSERT INTO test_table (b) VALUES (700); -INSERT INTO test_table (b) VALUES (800); -INSERT INTO test_table (b) VALUES (900); -ROLLBACK; --- check table and sequence values after rollback -SELECT * from test_table_a_seq; - last_value | log_cnt | is_called -------------+---------+----------- - 3003 | 30 | t -(1 row) - -SELECT nextval('test_table_a_seq'); - nextval ---------- - 3004 -(1 row) - -DROP TABLE test_table; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - data -------------------------------------------------------------------------------------------- - BEGIN - sequence public.test_table_a_seq: transactional:1 last_value: 1 log_cnt: 0 is_called:0 - COMMIT - sequence public.test_table_a_seq: transactional:0 last_value: 33 log_cnt: 0 is_called:1 - sequence public.test_table_a_seq: transactional:0 last_value: 3000 log_cnt: 0 is_called:1 - sequence public.test_table_a_seq: transactional:0 last_value: 3033 log_cnt: 0 is_called:1 -(6 rows) - --- savepoint test on table with serial column -BEGIN; -CREATE TABLE test_table (a SERIAL, b INT); -INSERT INTO test_table (b) VALUES (100); -INSERT INTO test_table (b) VALUES (200); -SAVEPOINT a; -INSERT INTO test_table (b) VALUES (300); -ROLLBACK TO SAVEPOINT a; -DROP TABLE test_table; -COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - data ------------------------------------------------------------------------------------------ - BEGIN - sequence public.test_table_a_seq: transactional:1 last_value: 1 log_cnt: 0 is_called:0 - sequence public.test_table_a_seq: transactional:1 last_value: 33 log_cnt: 0 is_called:1 - table public.test_table: INSERT: a[integer]:1 b[integer]:100 - table public.test_table: INSERT: a[integer]:2 b[integer]:200 - COMMIT -(6 rows) - --- savepoint test on table with serial column -BEGIN; -CREATE SEQUENCE test_sequence; -SELECT nextval('test_sequence'); - nextval ---------- - 1 -(1 row) - -SELECT setval('test_sequence', 3000); - setval --------- - 3000 -(1 row) - -SELECT nextval('test_sequence'); - nextval ---------- - 3001 -(1 row) - -SAVEPOINT a; -ALTER SEQUENCE test_sequence START WITH 7000; -SELECT setval('test_sequence', 5000); - setval --------- - 5000 -(1 row) - -ROLLBACK TO SAVEPOINT a; -SELECT * FROM test_sequence; - last_value | log_cnt | is_called -------------+---------+----------- - 3001 | 32 | t -(1 row) - -DROP SEQUENCE test_sequence; -COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - data ----------------------------------------------------------------------------------------- - BEGIN - sequence public.test_sequence: transactional:1 last_value: 1 log_cnt: 0 is_called:0 - sequence public.test_sequence: transactional:1 last_value: 33 log_cnt: 0 is_called:1 - sequence public.test_sequence: transactional:1 last_value: 3000 log_cnt: 0 is_called:1 - sequence public.test_sequence: transactional:1 last_value: 3033 log_cnt: 0 is_called:1 - COMMIT -(6 rows) - -SELECT pg_drop_replication_slot('regression_slot'); - pg_drop_replication_slot --------------------------- - -(1 row) - diff --git a/contrib/test_decoding/expected/slot.out b/contrib/test_decoding/expected/slot.out index de59d544ae..63a9940f73 100644 --- a/contrib/test_decoding/expected/slot.out +++ b/contrib/test_decoding/expected/slot.out @@ -95,7 +95,7 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot2', 'test_ (1 row) INSERT INTO replication_example(somedata, text) VALUES (1, 3); -SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data --------------------------------------------------------------------------------------------------------- BEGIN @@ -107,7 +107,7 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'in COMMIT (7 rows) -SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data --------------------------------------------------------------------------------------------------------- BEGIN @@ -132,7 +132,7 @@ SELECT :'wal_lsn' = :'end_lsn'; t (1 row) -SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data --------------------------------------------------------------------------------------------------------- BEGIN @@ -140,7 +140,7 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'in COMMIT (3 rows) -SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ------ (0 rows) diff --git a/contrib/test_decoding/expected/toast.out b/contrib/test_decoding/expected/toast.out index d0ab0e0639..a757e7dc8d 100644 --- a/contrib/test_decoding/expected/toast.out +++ b/contrib/test_decoding/expected/toast.out @@ -52,7 +52,7 @@ CREATE TABLE toasted_copy ( ); ALTER TABLE toasted_copy ALTER COLUMN data SET STORAGE EXTERNAL; \copy toasted_copy FROM STDIN -SELECT substr(data, 1, 200) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT substr(data, 1, 200) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); substr ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- BEGIN @@ -316,7 +316,7 @@ SELECT pg_column_size(toasted_key) > 2^16 FROM toasted_several; t (1 row) -SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); regexp_replace ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ BEGIN @@ -327,7 +327,7 @@ SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_sl -- test update of a toasted key without changing it UPDATE toasted_several SET toasted_col1 = toasted_key; UPDATE toasted_several SET toasted_col2 = toasted_col1; -SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); regexp_replace ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ BEGIN @@ -350,7 +350,7 @@ UPDATE toasted_several SET toasted_col1 = toasted_col2 WHERE id = 1; DELETE FROM toasted_several WHERE id = 1; COMMIT; DROP TABLE toasted_several; -SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0') +SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') WHERE data NOT LIKE '%INSERT: %'; regexp_replace ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ @@ -373,7 +373,7 @@ INSERT INTO tbl1 VALUES(1, repeat('a', 4000)) ; ALTER TABLE tbl1 ADD COLUMN id serial primary key; INSERT INTO tbl2 VALUES(1); commit; -SELECT substr(data, 1, 200) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT substr(data, 1, 200) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); substr ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- BEGIN diff --git a/contrib/test_decoding/expected/truncate.out b/contrib/test_decoding/expected/truncate.out index 961b0ebdc8..e64d377214 100644 --- a/contrib/test_decoding/expected/truncate.out +++ b/contrib/test_decoding/expected/truncate.out @@ -11,7 +11,7 @@ CREATE TABLE tab2 (a int primary key, b int); TRUNCATE tab1; TRUNCATE tab1, tab1 RESTART IDENTITY CASCADE; TRUNCATE tab1, tab2; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ------------------------------------------------------ BEGIN diff --git a/contrib/test_decoding/specs/mxact.spec b/contrib/test_decoding/specs/mxact.spec index 19f3af14b3..ea5b1aa2d6 100644 --- a/contrib/test_decoding/specs/mxact.spec +++ b/contrib/test_decoding/specs/mxact.spec @@ -13,7 +13,7 @@ teardown session "s0" setup { SET synchronous_commit=on; } step "s0init" {SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');} -step "s0start" {SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false', 'include-sequences', 'false');} +step "s0start" {SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false');} step "s0alter" {ALTER TABLE do_write ADD column ts timestamptz; } step "s0w" { INSERT INTO do_write DEFAULT VALUES; } diff --git a/contrib/test_decoding/specs/ondisk_startup.spec b/contrib/test_decoding/specs/ondisk_startup.spec index fb43cbc5e1..96ce87f1a4 100644 --- a/contrib/test_decoding/specs/ondisk_startup.spec +++ b/contrib/test_decoding/specs/ondisk_startup.spec @@ -16,7 +16,7 @@ session "s1" setup { SET synchronous_commit=on; } step "s1init" {SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');} -step "s1start" {SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false', 'include-sequences', 'false');} +step "s1start" {SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false');} step "s1insert" { INSERT INTO do_write DEFAULT VALUES; } step "s1checkpoint" { CHECKPOINT; } step "s1alter" { ALTER TABLE do_write ADD COLUMN addedbys1 int; } diff --git a/contrib/test_decoding/sql/ddl.sql b/contrib/test_decoding/sql/ddl.sql index 807bc56a45..4f76bed72c 100644 --- a/contrib/test_decoding/sql/ddl.sql +++ b/contrib/test_decoding/sql/ddl.sql @@ -19,7 +19,7 @@ SELECT pg_drop_replication_slot('regression_slot'); -- check that we're detecting a streaming rep slot used for logical decoding SELECT 'init' FROM pg_create_physical_replication_slot('repl'); -SELECT data FROM pg_logical_slot_get_changes('repl', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('repl', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); SELECT pg_drop_replication_slot('repl'); @@ -64,11 +64,11 @@ ALTER TABLE replication_example RENAME COLUMN text TO somenum; INSERT INTO replication_example(somedata, somenum) VALUES (4, 1); -- collect all changes -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); ALTER TABLE replication_example ALTER COLUMN somenum TYPE int4 USING (somenum::int4); -- check that this doesn't produce any changes from the heap rewrite -SELECT count(data) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT count(data) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); INSERT INTO replication_example(somedata, somenum) VALUES (5, 1); @@ -82,7 +82,7 @@ INSERT INTO replication_example(somedata, somenum, zaphod1) VALUES (6, 4, 2); COMMIT; -- show changes -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -- ON CONFLICT DO UPDATE support BEGIN; @@ -91,7 +91,7 @@ INSERT INTO replication_example(id, somedata, somenum) SELECT i, i, i FROM gener COMMIT; /* display results */ -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -- MERGE support BEGIN; @@ -113,14 +113,14 @@ CREATE TABLE tr_unique(id2 serial unique NOT NULL, data int); INSERT INTO tr_unique(data) VALUES(10); ALTER TABLE tr_unique RENAME TO tr_pkey; ALTER TABLE tr_pkey ADD COLUMN id serial primary key; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-rewrites', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-rewrites', '1'); INSERT INTO tr_pkey(data) VALUES(1); --show deletion with primary key DELETE FROM tr_pkey; /* display results */ -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); /* * check that disk spooling works (also for logical messages) @@ -137,7 +137,7 @@ COMMIT; /* display results, but hide most of the output */ SELECT count(*), min(data), max(data) -FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0') +FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') GROUP BY substring(data, 1, 24) ORDER BY 1,2; @@ -152,7 +152,7 @@ DROP TABLE spoolme; COMMIT; SELECT data -FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0') +FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') WHERE data ~ 'UPDATE'; -- check that a large, spooled, upsert works @@ -161,7 +161,7 @@ SELECT g.i, -g.i FROM generate_series(8000, 12000) g(i) ON CONFLICT(id) DO UPDATE SET data = EXCLUDED.data; SELECT substring(data, 1, 29), count(*) -FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0') WITH ORDINALITY +FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') WITH ORDINALITY GROUP BY 1 ORDER BY min(ordinality); @@ -189,7 +189,7 @@ INSERT INTO tr_sub(path) VALUES ('1-top-2-#1'); RELEASE SAVEPOINT b; COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -- check that we handle xlog assignments correctly BEGIN; @@ -218,7 +218,7 @@ RELEASE SAVEPOINT subtop; INSERT INTO tr_sub(path) VALUES ('2-top-#1'); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -- make sure rollbacked subtransactions aren't decoded BEGIN; @@ -231,7 +231,7 @@ ROLLBACK TO SAVEPOINT b; INSERT INTO tr_sub(path) VALUES ('3-top-2-#2'); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -- test whether a known, but not yet logged toplevel xact, followed by a -- subxact commit is handled correctly @@ -250,7 +250,7 @@ INSERT INTO tr_sub(path) VALUES ('5-top-1-#1'); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -- check that DDL in aborted subtransactions handled correctly CREATE TABLE tr_sub_ddl(data int); @@ -263,7 +263,7 @@ ALTER TABLE tr_sub_ddl ALTER COLUMN data TYPE bigint; INSERT INTO tr_sub_ddl VALUES(43); COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); /* @@ -303,7 +303,7 @@ ALTER TABLE replication_metadata SET (user_catalog_table = false); INSERT INTO replication_metadata(relation, options) VALUES ('zaphod', NULL); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); /* * check whether we handle updates/deletes correct with & without a pkey @@ -414,7 +414,7 @@ UPDATE toasttable SET toasted_col1 = (SELECT string_agg(g.i::text, '') FROM generate_series(1, 2000) g(i)) WHERE id = 1; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); INSERT INTO toasttable(toasted_col1) SELECT string_agg(g.i::text, '') FROM generate_series(1, 2000) g(i); @@ -426,10 +426,10 @@ WHERE id = 1; -- make sure we decode correctly even if the toast table is gone DROP TABLE toasttable; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -- done, free logical replication slot -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); SELECT pg_drop_replication_slot('regression_slot'); diff --git a/contrib/test_decoding/sql/decoding_in_xact.sql b/contrib/test_decoding/sql/decoding_in_xact.sql index b343b74566..108782dc2e 100644 --- a/contrib/test_decoding/sql/decoding_in_xact.sql +++ b/contrib/test_decoding/sql/decoding_in_xact.sql @@ -32,10 +32,10 @@ BEGIN; SELECT pg_current_xact_id() = '0'; -- don't show yet, haven't committed INSERT INTO nobarf(data) VALUES('2'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); COMMIT; INSERT INTO nobarf(data) VALUES('3'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); SELECT 'stop' FROM pg_drop_replication_slot('regression_slot'); diff --git a/contrib/test_decoding/sql/decoding_into_rel.sql b/contrib/test_decoding/sql/decoding_into_rel.sql index 27d5d08879..1068cec588 100644 --- a/contrib/test_decoding/sql/decoding_into_rel.sql +++ b/contrib/test_decoding/sql/decoding_into_rel.sql @@ -15,14 +15,14 @@ CREATE TABLE somechange(id serial primary key); INSERT INTO somechange DEFAULT VALUES; CREATE TABLE changeresult AS - SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); + SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); SELECT * FROM changeresult; INSERT INTO changeresult - SELECT data FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); + SELECT data FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); INSERT INTO changeresult - SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); + SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); SELECT * FROM changeresult; DROP TABLE changeresult; @@ -32,11 +32,11 @@ DROP TABLE somechange; CREATE FUNCTION slot_changes_wrapper(slot_name name) RETURNS SETOF TEXT AS $$ BEGIN RETURN QUERY - SELECT data FROM pg_logical_slot_peek_changes(slot_name, NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); + SELECT data FROM pg_logical_slot_peek_changes(slot_name, NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); END$$ LANGUAGE plpgsql; SELECT * FROM slot_changes_wrapper('regression_slot'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); SELECT 'stop' FROM pg_drop_replication_slot('regression_slot'); diff --git a/contrib/test_decoding/sql/replorigin.sql b/contrib/test_decoding/sql/replorigin.sql index cd0a370208..2e28a48777 100644 --- a/contrib/test_decoding/sql/replorigin.sql +++ b/contrib/test_decoding/sql/replorigin.sql @@ -41,10 +41,10 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_d -- origin tx INSERT INTO origin_tbl(data) VALUES ('will be replicated and decoded and decoded again'); INSERT INTO target_tbl(data) -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -- as is normal, the insert into target_tbl shows up -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); INSERT INTO origin_tbl(data) VALUES ('will be replicated, but not decoded again'); @@ -60,7 +60,7 @@ BEGIN; -- setup transaction origin SELECT pg_replication_origin_xact_setup('0/aabbccdd', '2013-01-01 00:00'); INSERT INTO target_tbl(data) -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1'); COMMIT; -- check replication progress for the session is correct @@ -79,11 +79,11 @@ SELECT pg_replication_origin_progress('regress_test_decoding: regression_slot', SELECT pg_replication_origin_session_reset(); -- and magically the replayed xact will be filtered! -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1'); --but new original changes still show up INSERT INTO origin_tbl(data) VALUES ('will be replicated'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'only-local', '1'); SELECT pg_drop_replication_slot('regression_slot'); SELECT pg_replication_origin_drop('regress_test_decoding: regression_slot'); @@ -114,7 +114,7 @@ SELECT local_id, external_id, remote_lsn <> '0/0' AS valid_remote_lsn, local_lsn <> '0/0' AS valid_local_lsn FROM pg_replication_origin_status; -SELECT data FROM pg_logical_slot_get_changes('regression_slot_no_lsn', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot_no_lsn', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); -- Clean up SELECT pg_replication_origin_session_reset(); SELECT pg_drop_replication_slot('regression_slot_no_lsn'); diff --git a/contrib/test_decoding/sql/rewrite.sql b/contrib/test_decoding/sql/rewrite.sql index 1715bd289d..62dead3a9b 100644 --- a/contrib/test_decoding/sql/rewrite.sql +++ b/contrib/test_decoding/sql/rewrite.sql @@ -35,7 +35,7 @@ SELECT pg_relation_size((SELECT reltoastrelid FROM pg_class WHERE oid = 'pg_shde SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding'); CREATE TABLE replication_example(id SERIAL PRIMARY KEY, somedata int, text varchar(120)); INSERT INTO replication_example(somedata) VALUES (1); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); BEGIN; INSERT INTO replication_example(somedata) VALUES (2); @@ -90,7 +90,7 @@ COMMIT; -- make old files go away CHECKPOINT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -- trigger repeated rewrites of a system catalog with a toast table, -- that previously was buggy: 20180914021046.oi7dm4ra3ot2g2kt@alap3.anarazel.de @@ -98,7 +98,7 @@ VACUUM FULL pg_proc; VACUUM FULL pg_description; VACUUM FULL pg_shdescription; V INSERT INTO replication_example(somedata, testcolumn1, testcolumn3) VALUES (8, 6, 1); VACUUM FULL pg_proc; VACUUM FULL pg_description; VACUUM FULL pg_shdescription; VACUUM FULL iamalargetable; INSERT INTO replication_example(somedata, testcolumn1, testcolumn3) VALUES (9, 7, 1); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); SELECT pg_drop_replication_slot('regression_slot'); DROP TABLE IF EXISTS replication_example; diff --git a/contrib/test_decoding/sql/sequence.sql b/contrib/test_decoding/sql/sequence.sql deleted file mode 100644 index 978ee8088e..0000000000 --- a/contrib/test_decoding/sql/sequence.sql +++ /dev/null @@ -1,119 +0,0 @@ --- predictability -SET synchronous_commit = on; -SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding'); - -CREATE SEQUENCE test_sequence; - --- test the sequence changes by several nextval() calls -SELECT nextval('test_sequence'); -SELECT nextval('test_sequence'); -SELECT nextval('test_sequence'); -SELECT nextval('test_sequence'); - --- test the sequence changes by several ALTER commands -ALTER SEQUENCE test_sequence INCREMENT BY 10; -SELECT nextval('test_sequence'); - -ALTER SEQUENCE test_sequence START WITH 3000; -ALTER SEQUENCE test_sequence MAXVALUE 10000; -ALTER SEQUENCE test_sequence RESTART WITH 4000; -SELECT nextval('test_sequence'); - --- test the sequence changes by several setval() calls -SELECT setval('test_sequence', 3500); -SELECT nextval('test_sequence'); -SELECT setval('test_sequence', 3500, true); -SELECT nextval('test_sequence'); -SELECT setval('test_sequence', 3500, false); -SELECT nextval('test_sequence'); - --- show results and drop sequence -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -DROP SEQUENCE test_sequence; - --- rollback on sequence creation and update -BEGIN; -CREATE SEQUENCE test_sequence; -CREATE TABLE test_table (a INT); -SELECT nextval('test_sequence'); -SELECT nextval('test_sequence'); -SELECT nextval('test_sequence'); -SELECT setval('test_sequence', 3000); -SELECT nextval('test_sequence'); -SELECT nextval('test_sequence'); -SELECT nextval('test_sequence'); -ALTER SEQUENCE test_sequence RESTART WITH 6000; -INSERT INTO test_table VALUES( (SELECT nextval('test_sequence')) ); -SELECT nextval('test_sequence'); -ROLLBACK; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - --- rollback on table creation with serial column -BEGIN; -CREATE TABLE test_table (a SERIAL, b INT); -INSERT INTO test_table (b) VALUES (100); -INSERT INTO test_table (b) VALUES (200); -INSERT INTO test_table (b) VALUES (300); -SELECT setval('test_table_a_seq', 3000); -INSERT INTO test_table (b) VALUES (400); -INSERT INTO test_table (b) VALUES (500); -INSERT INTO test_table (b) VALUES (600); -ALTER SEQUENCE test_table_a_seq RESTART WITH 6000; -INSERT INTO test_table (b) VALUES (700); -INSERT INTO test_table (b) VALUES (800); -INSERT INTO test_table (b) VALUES (900); -ROLLBACK; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - --- rollback on table with serial column -CREATE TABLE test_table (a SERIAL, b INT); - -BEGIN; -INSERT INTO test_table (b) VALUES (100); -INSERT INTO test_table (b) VALUES (200); -INSERT INTO test_table (b) VALUES (300); -SELECT setval('test_table_a_seq', 3000); -INSERT INTO test_table (b) VALUES (400); -INSERT INTO test_table (b) VALUES (500); -INSERT INTO test_table (b) VALUES (600); -ALTER SEQUENCE test_table_a_seq RESTART WITH 6000; -INSERT INTO test_table (b) VALUES (700); -INSERT INTO test_table (b) VALUES (800); -INSERT INTO test_table (b) VALUES (900); -ROLLBACK; - --- check table and sequence values after rollback -SELECT * from test_table_a_seq; -SELECT nextval('test_table_a_seq'); - -DROP TABLE test_table; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - --- savepoint test on table with serial column -BEGIN; -CREATE TABLE test_table (a SERIAL, b INT); -INSERT INTO test_table (b) VALUES (100); -INSERT INTO test_table (b) VALUES (200); -SAVEPOINT a; -INSERT INTO test_table (b) VALUES (300); -ROLLBACK TO SAVEPOINT a; -DROP TABLE test_table; -COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - --- savepoint test on table with serial column -BEGIN; -CREATE SEQUENCE test_sequence; -SELECT nextval('test_sequence'); -SELECT setval('test_sequence', 3000); -SELECT nextval('test_sequence'); -SAVEPOINT a; -ALTER SEQUENCE test_sequence START WITH 7000; -SELECT setval('test_sequence', 5000); -ROLLBACK TO SAVEPOINT a; -SELECT * FROM test_sequence; -DROP SEQUENCE test_sequence; -COMMIT; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - -SELECT pg_drop_replication_slot('regression_slot'); diff --git a/contrib/test_decoding/sql/slot.sql b/contrib/test_decoding/sql/slot.sql index 52a740c43d..1aa27c5667 100644 --- a/contrib/test_decoding/sql/slot.sql +++ b/contrib/test_decoding/sql/slot.sql @@ -50,8 +50,8 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot2', 'test_ INSERT INTO replication_example(somedata, text) VALUES (1, 3); -SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); INSERT INTO replication_example(somedata, text) VALUES (1, 4); INSERT INTO replication_example(somedata, text) VALUES (1, 5); @@ -65,8 +65,8 @@ SELECT slot_name FROM pg_replication_slot_advance('regression_slot2', pg_current SELECT :'wal_lsn' = :'end_lsn'; -SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); DROP TABLE replication_example; diff --git a/contrib/test_decoding/sql/toast.sql b/contrib/test_decoding/sql/toast.sql index f5d4fc082e..d1c560a174 100644 --- a/contrib/test_decoding/sql/toast.sql +++ b/contrib/test_decoding/sql/toast.sql @@ -264,7 +264,7 @@ ALTER TABLE toasted_copy ALTER COLUMN data SET STORAGE EXTERNAL; 202 untoasted199 203 untoasted200 \. -SELECT substr(data, 1, 200) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT substr(data, 1, 200) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -- test we can decode "old" tuples bigger than the max heap tuple size correctly DROP TABLE IF EXISTS toasted_several; @@ -287,13 +287,13 @@ UPDATE pg_attribute SET attstorage = 'x' WHERE attrelid = 'toasted_several_pkey' INSERT INTO toasted_several(toasted_key) VALUES(repeat('9876543210', 10000)); SELECT pg_column_size(toasted_key) > 2^16 FROM toasted_several; -SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -- test update of a toasted key without changing it UPDATE toasted_several SET toasted_col1 = toasted_key; UPDATE toasted_several SET toasted_col2 = toasted_col1; -SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); /* * update with large tuplebuf, in a transaction large enough to force to spool to disk @@ -306,7 +306,7 @@ COMMIT; DROP TABLE toasted_several; -SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0') +SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') WHERE data NOT LIKE '%INSERT: %'; /* @@ -322,6 +322,6 @@ INSERT INTO tbl1 VALUES(1, repeat('a', 4000)) ; ALTER TABLE tbl1 ADD COLUMN id serial primary key; INSERT INTO tbl2 VALUES(1); commit; -SELECT substr(data, 1, 200) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT substr(data, 1, 200) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); SELECT pg_drop_replication_slot('regression_slot'); diff --git a/contrib/test_decoding/sql/truncate.sql b/contrib/test_decoding/sql/truncate.sql index b0f36fd681..5633854e0d 100644 --- a/contrib/test_decoding/sql/truncate.sql +++ b/contrib/test_decoding/sql/truncate.sql @@ -10,5 +10,5 @@ TRUNCATE tab1; TRUNCATE tab1, tab1 RESTART IDENTITY CASCADE; TRUNCATE tab1, tab2; -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); SELECT pg_drop_replication_slot('regression_slot'); diff --git a/contrib/test_decoding/test_decoding.c b/contrib/test_decoding/test_decoding.c index c7a87f5fe5..08d366a594 100644 --- a/contrib/test_decoding/test_decoding.c +++ b/contrib/test_decoding/test_decoding.c @@ -35,7 +35,6 @@ typedef struct bool include_timestamp; bool skip_empty_xacts; bool only_local; - bool include_sequences; } TestDecodingData; /* @@ -77,10 +76,6 @@ static void pg_decode_message(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr message_lsn, bool transactional, const char *prefix, Size sz, const char *message); -static void pg_decode_sequence(LogicalDecodingContext *ctx, - ReorderBufferTXN *txn, XLogRecPtr sequence_lsn, - Relation rel, bool transactional, - int64 last_value, int64 log_cnt, bool is_called); static bool pg_decode_filter_prepare(LogicalDecodingContext *ctx, TransactionId xid, const char *gid); @@ -121,10 +116,6 @@ static void pg_decode_stream_message(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr message_lsn, bool transactional, const char *prefix, Size sz, const char *message); -static void pg_decode_stream_sequence(LogicalDecodingContext *ctx, - ReorderBufferTXN *txn, XLogRecPtr sequence_lsn, - Relation rel, bool transactional, - int64 last_value, int64 log_cnt, bool is_called); static void pg_decode_stream_truncate(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, int nrelations, Relation relations[], @@ -150,7 +141,6 @@ _PG_output_plugin_init(OutputPluginCallbacks *cb) cb->filter_by_origin_cb = pg_decode_filter; cb->shutdown_cb = pg_decode_shutdown; cb->message_cb = pg_decode_message; - cb->sequence_cb = pg_decode_sequence; cb->filter_prepare_cb = pg_decode_filter_prepare; cb->begin_prepare_cb = pg_decode_begin_prepare_txn; cb->prepare_cb = pg_decode_prepare_txn; @@ -163,7 +153,6 @@ _PG_output_plugin_init(OutputPluginCallbacks *cb) cb->stream_commit_cb = pg_decode_stream_commit; cb->stream_change_cb = pg_decode_stream_change; cb->stream_message_cb = pg_decode_stream_message; - cb->stream_sequence_cb = pg_decode_stream_sequence; cb->stream_truncate_cb = pg_decode_stream_truncate; } @@ -184,7 +173,6 @@ pg_decode_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt, data->include_xids = true; data->include_timestamp = false; data->skip_empty_xacts = false; - data->include_sequences = true; data->only_local = false; ctx->output_plugin_private = data; @@ -277,17 +265,6 @@ pg_decode_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt, errmsg("could not parse value \"%s\" for parameter \"%s\"", strVal(elem->arg), elem->defname))); } - else if (strcmp(elem->defname, "include-sequences") == 0) - { - - if (elem->arg == NULL) - data->include_sequences = false; - else if (!parse_bool(strVal(elem->arg), &data->include_sequences)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("could not parse value \"%s\" for parameter \"%s\"", - strVal(elem->arg), elem->defname))); - } else { ereport(ERROR, @@ -779,38 +756,6 @@ pg_decode_message(LogicalDecodingContext *ctx, OutputPluginWrite(ctx, true); } -static void -pg_decode_sequence(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, - XLogRecPtr sequence_lsn, Relation rel, - bool transactional, - int64 last_value, int64 log_cnt, bool is_called) -{ - TestDecodingData *data = ctx->output_plugin_private; - TestDecodingTxnData *txndata = txn->output_plugin_private; - - if (!data->include_sequences) - return; - - /* output BEGIN if we haven't yet, but only for the transactional case */ - if (transactional) - { - if (data->skip_empty_xacts && !txndata->xact_wrote_changes) - { - pg_output_begin(ctx, data, txn, false); - } - txndata->xact_wrote_changes = true; - } - - OutputPluginPrepareWrite(ctx, true); - appendStringInfoString(ctx->out, "sequence "); - appendStringInfoString(ctx->out, - quote_qualified_identifier(get_namespace_name(get_rel_namespace(RelationGetRelid(rel))), - RelationGetRelationName(rel))); - appendStringInfo(ctx->out, ": transactional:%d last_value: " INT64_FORMAT " log_cnt: " INT64_FORMAT " is_called:%d", - transactional, last_value, log_cnt, is_called); - OutputPluginWrite(ctx, true); -} - static void pg_decode_stream_start(LogicalDecodingContext *ctx, ReorderBufferTXN *txn) @@ -1010,38 +955,6 @@ pg_decode_stream_message(LogicalDecodingContext *ctx, OutputPluginWrite(ctx, true); } -static void -pg_decode_stream_sequence(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, - XLogRecPtr sequence_lsn, Relation rel, - bool transactional, - int64 last_value, int64 log_cnt, bool is_called) -{ - TestDecodingData *data = ctx->output_plugin_private; - TestDecodingTxnData *txndata = txn->output_plugin_private; - - if (!data->include_sequences) - return; - - /* output BEGIN if we haven't yet, but only for the transactional case */ - if (transactional) - { - if (data->skip_empty_xacts && !txndata->xact_wrote_changes) - { - pg_output_begin(ctx, data, txn, false); - } - txndata->xact_wrote_changes = true; - } - - OutputPluginPrepareWrite(ctx, true); - appendStringInfoString(ctx->out, "streaming sequence "); - appendStringInfoString(ctx->out, - quote_qualified_identifier(get_namespace_name(get_rel_namespace(RelationGetRelid(rel))), - RelationGetRelationName(rel))); - appendStringInfo(ctx->out, ": transactional:%d last_value: " INT64_FORMAT " log_cnt: " INT64_FORMAT " is_called:%d", - transactional, last_value, log_cnt, is_called); - OutputPluginWrite(ctx, true); -} - /* * In streaming mode, we don't display the detailed information of Truncate. * See pg_decode_stream_change. diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 646ab74d04..e8f850a9c0 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -6354,16 +6354,6 @@ SCRAM-SHA-256$<iteration count>:&l Reference to schema - - - - pntype char - Determines which object type is included from this schema. - - - Reference to schema - -
@@ -9699,11 +9689,6 @@ SCRAM-SHA-256$<iteration count>:&l prepared transactions
- - pg_publication_sequences - publications and their associated sequences - - pg_publication_tables publications and their associated tables @@ -11641,72 +11626,6 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx - - <structname>pg_publication_sequences</structname> - - - pg_publication_sequences - - - - The view pg_publication_sequences provides - information about the mapping between publications and the sequences they - contain. Unlike the underlying catalog - pg_publication_rel, - this view expands - publications defined as FOR ALL SEQUENCES, so for such - publications there will be a row for each eligible sequence. - - - - <structname>pg_publication_sequences</structname> Columns - - - - - Column Type - - - Description - - - - - - - - pubname name - (references pg_publication.pubname) - - - Name of publication - - - - - - schemaname name - (references pg_namespace.nspname) - - - Name of schema containing sequence - - - - - - sequencename name - (references pg_class.relname) - - - Name of sequence - - - - -
-
- <structname>pg_publication_tables</structname> diff --git a/doc/src/sgml/logicaldecoding.sgml b/doc/src/sgml/logicaldecoding.sgml index a6ea6ff3fc..8b2c31a87f 100644 --- a/doc/src/sgml/logicaldecoding.sgml +++ b/doc/src/sgml/logicaldecoding.sgml @@ -458,7 +458,6 @@ typedef struct OutputPluginCallbacks LogicalDecodeTruncateCB truncate_cb; LogicalDecodeCommitCB commit_cb; LogicalDecodeMessageCB message_cb; - LogicalDecodeSequenceCB sequence_cb; LogicalDecodeFilterByOriginCB filter_by_origin_cb; LogicalDecodeShutdownCB shutdown_cb; LogicalDecodeFilterPrepareCB filter_prepare_cb; @@ -473,7 +472,6 @@ typedef struct OutputPluginCallbacks LogicalDecodeStreamCommitCB stream_commit_cb; LogicalDecodeStreamChangeCB stream_change_cb; LogicalDecodeStreamMessageCB stream_message_cb; - LogicalDecodeStreamSequenceCB stream_sequence_cb; LogicalDecodeStreamTruncateCB stream_truncate_cb; } OutputPluginCallbacks; @@ -483,11 +481,9 @@ typedef void (*LogicalOutputPluginInit) (struct OutputPluginCallbacks *cb); and commit_cb callbacks are required, while startup_cb, filter_by_origin_cb, truncate_cb, - sequence_cb, and shutdown_cb are - optional. If truncate_cb is not set but a + and shutdown_cb are optional. + If truncate_cb is not set but a TRUNCATE is to be decoded, the action will be ignored. - Similarly, if sequence_cb is not set and a sequence - change is to be decoded, the action will be ignored. @@ -496,8 +492,7 @@ typedef void (*LogicalOutputPluginInit) (struct OutputPluginCallbacks *cb); stream_stop_cb, stream_abort_cb, stream_commit_cb, stream_change_cb, and stream_prepare_cb - are required, while stream_message_cb, - stream_sequence_cb, and + are required, while stream_message_cb and stream_truncate_cb are optional. @@ -813,35 +808,6 @@ typedef void (*LogicalDecodeMessageCB) (struct LogicalDecodingContext *ctx, - - Sequence Callback - - - The optional sequence_cb callback is called for - actions that update a sequence value. - -typedef void (*LogicalDecodeSequenceCB) (struct LogicalDecodingContext *ctx, - ReorderBufferTXN *txn, - XLogRecPtr sequence_lsn, - Relation rel, - bool transactional, - int64 last_value, - int64 log_cnt, - bool is_called); - - The txn parameter contains meta information about - the transaction the sequence change is part of. Note however that for - non-transactional increments, the transaction may be either NULL or not - NULL, depending on if the transaction already has an XID assigned. - The sequence_lsn has the WAL location of the - sequence update. transactional says if the - sequence has to be replayed as part of the transaction or directly. - - The last_value, log_cnt and - is_called parameters describe the sequence change. - - - Prepare Filter Callback @@ -1051,26 +1017,6 @@ typedef void (*LogicalDecodeStreamMessageCB) (struct LogicalDecodingContext *ctx - - Stream Sequence Callback - - The optional stream_sequence_cb callback is called - for actions that change a sequence in a block of streamed changes - (demarcated by stream_start_cb and - stream_stop_cb calls). - -typedef void (*LogicalDecodeStreamSequenceCB) (struct LogicalDecodingContext *ctx, - ReorderBufferTXN *txn, - XLogRecPtr sequence_lsn, - Relation rel, - bool transactional, - int64 last_value, - int64 log_cnt, - bool is_called); - - - - Stream Truncate Callback @@ -1251,9 +1197,8 @@ OutputPluginWrite(ctx, true); in-progress transactions. There are multiple required streaming callbacks (stream_start_cb, stream_stop_cb, stream_abort_cb, stream_commit_cb - and stream_change_cb) and multiple optional callbacks - (stream_message_cb, stream_sequence_cb, - and stream_truncate_cb). + and stream_change_cb) and two optional callbacks + (stream_message_cb and stream_truncate_cb). Also, if streaming of two-phase commands is to be supported, then additional callbacks must be provided. (See for details). diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 98f0bc3cc3..75a7a76a55 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -7072,125 +7072,6 @@ Relation - - -Sequence - - - - - - - - Byte1('X') - - - - Identifies the message as a sequence message. - - - - - - Int32 (TransactionId) - - - - Xid of the transaction (only present for streamed transactions). - This field is available since protocol version 2. - - - - - - Int8(0) - - - - Flags; currently unused. - - - - - - Int64 (XLogRecPtr) - - - - The LSN of the sequence increment. - - - - - - String - - - - Namespace (empty string for pg_catalog). - - - - - - String - - - - Relation name. - - - - - - - Int8 - - - - 1 if the sequence update is transactional, 0 otherwise. - - - - - - - Int64 - - - - last_value value of the sequence. - - - - - - - Int64 - - - - log_cnt value of the sequence. - - - - - - - Int8 - - - - is_called value of the sequence. - - - - - - - - - Type diff --git a/doc/src/sgml/ref/alter_publication.sgml b/doc/src/sgml/ref/alter_publication.sgml index db14d7a772..e2cce49471 100644 --- a/doc/src/sgml/ref/alter_publication.sgml +++ b/doc/src/sgml/ref/alter_publication.sgml @@ -31,9 +31,7 @@ ALTER PUBLICATION name RENAME TO where publication_object is one of: TABLE [ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ] [, ... ] - SEQUENCE sequence_name [, ... ] ALL TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] - ALL SEQUENCES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] @@ -46,13 +44,13 @@ ALTER PUBLICATION name RENAME TO - The first three variants change which objects (tables, sequences or schemas) - are part of the publication. The SET clause will replace - the list of objects in the publication with the specified list; the existing - objects that were present in the publication will be removed. - The ADD and DROP clauses will add and - remove one or more objects from the publication. Note that adding objects - to a publication that is already subscribed to will require an + The first three variants change which tables/schemas are part of the + publication. The SET clause will replace the list of + tables/schemas in the publication with the specified list; the existing + tables/schemas that were present in the publication will be removed. The + ADD and DROP clauses will add and + remove one or more tables/schemas from the publication. Note that adding + tables/schemas to a publication that is already subscribed to will require an ALTER SUBSCRIPTION ... REFRESH PUBLICATION action on the subscribing side in order to become effective. Note also that the combination of DROP with a WHERE clause is not @@ -132,15 +130,6 @@ ALTER PUBLICATION name RENAME TO - - sequence_name - - - Name of an existing sequence. - - - - schema_name diff --git a/doc/src/sgml/ref/alter_subscription.sgml b/doc/src/sgml/ref/alter_subscription.sgml index c1994e3a94..7c5203b6d3 100644 --- a/doc/src/sgml/ref/alter_subscription.sgml +++ b/doc/src/sgml/ref/alter_subscription.sgml @@ -150,8 +150,8 @@ ALTER SUBSCRIPTION name RENAME TO < Fetch missing table information from publisher. This will start - replication of tables and sequences that were added to the subscribed-to - publications since CREATE SUBSCRIPTION or + replication of tables that were added to the subscribed-to publications + since CREATE SUBSCRIPTION or the last invocation of REFRESH PUBLICATION. @@ -169,8 +169,8 @@ ALTER SUBSCRIPTION name RENAME TO < The default is true. - Previously subscribed tables and sequences are not copied, even if a - table's row filter WHERE clause has since been modified. + Previously subscribed tables are not copied, even if a table's row + filter WHERE clause has since been modified. diff --git a/doc/src/sgml/ref/create_publication.sgml b/doc/src/sgml/ref/create_publication.sgml index d2739968d9..fb2d013393 100644 --- a/doc/src/sgml/ref/create_publication.sgml +++ b/doc/src/sgml/ref/create_publication.sgml @@ -22,21 +22,14 @@ PostgreSQL documentation CREATE PUBLICATION name - [ FOR ALL object_type [, ...] + [ FOR ALL TABLES | FOR publication_object [, ... ] ] [ WITH ( publication_parameter [= value] [, ... ] ) ] -where object type is one of: - - TABLES - SEQUENCES - where publication_object is one of: TABLE [ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ] [, ... ] - SEQUENCE sequence_name [ * ] [, ... ] ALL TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] - ALL SEQUENCES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ] @@ -121,43 +114,27 @@ CREATE PUBLICATION name - - FOR SEQUENCE - - - Specifies a list of sequences to add to the publication. - - - - Specifying a sequence that is part of a schema specified by FOR - ALL SEQUENCES IN SCHEMA is not supported. - - - - FOR ALL TABLES - FOR ALL SEQUENCES - Marks the publication as one that replicates changes for all tables/sequences in - the database, including tables/sequences created in the future. + Marks the publication as one that replicates changes for all tables in + the database, including tables created in the future. FOR ALL TABLES IN SCHEMA - FOR ALL SEQUENCES IN SCHEMA - Marks the publication as one that replicates changes for all sequences/tables in - the specified list of schemas, including sequences/tables created in the future. + Marks the publication as one that replicates changes for all tables in + the specified list of schemas, including tables created in the future. - Specifying a schema along with a sequence/table which belongs to the specified - schema using FOR SEQUENCE/FOR TABLE is not supported. + Specifying a schema along with a table which belongs to the specified + schema using FOR TABLE is not supported. @@ -232,9 +209,10 @@ CREATE PUBLICATION name Notes - If FOR TABLE, FOR SEQUENCE, etc. is - not specified, then the publication starts out with an empty set of tables - and sequences. That is useful if objects are to be added later. + If FOR TABLE, FOR ALL TABLES or + FOR ALL TABLES IN SCHEMA are not specified, then the + publication starts out with an empty set of tables. That is useful if + tables or schemas are to be added later. @@ -249,9 +227,10 @@ CREATE PUBLICATION name - To add a table or a sequence to a publication, the invoking user must - have ownership rights on the object. The FOR ALL ... - clauses require the invoking user to be a superuser. + To add a table to a publication, the invoking user must have ownership + rights on the table. The FOR ALL TABLES and + FOR ALL TABLES IN SCHEMA clauses require the invoking + user to be a superuser. diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index 31c80f7209..ac6043514f 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -1941,14 +1941,12 @@ get_object_address_publication_schema(List *object, bool missing_ok) char *pubname; char *schemaname; Oid schemaid; - char *objtype; ObjectAddressSet(address, PublicationNamespaceRelationId, InvalidOid); /* Fetch schema name and publication name from input list */ schemaname = strVal(linitial(object)); pubname = strVal(lsecond(object)); - objtype = strVal(lthird(object)); schemaid = get_namespace_oid(schemaname, missing_ok); if (!OidIsValid(schemaid)) @@ -1961,12 +1959,10 @@ get_object_address_publication_schema(List *object, bool missing_ok) /* Find the publication schema mapping in syscache */ address.objectId = - GetSysCacheOid3(PUBLICATIONNAMESPACEMAP, + GetSysCacheOid2(PUBLICATIONNAMESPACEMAP, Anum_pg_publication_namespace_oid, ObjectIdGetDatum(schemaid), - ObjectIdGetDatum(pub->oid), - CharGetDatum(objtype[0])); - + ObjectIdGetDatum(pub->oid)); if (!OidIsValid(address.objectId) && !missing_ok) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), @@ -2247,6 +2243,7 @@ pg_get_object_address(PG_FUNCTION_ARGS) case OBJECT_DOMCONSTRAINT: case OBJECT_CAST: case OBJECT_USER_MAPPING: + case OBJECT_PUBLICATION_NAMESPACE: case OBJECT_PUBLICATION_REL: case OBJECT_DEFACL: case OBJECT_TRANSFORM: @@ -2271,7 +2268,6 @@ pg_get_object_address(PG_FUNCTION_ARGS) /* fall through to check args length */ /* FALLTHROUGH */ case OBJECT_OPERATOR: - case OBJECT_PUBLICATION_NAMESPACE: if (list_length(args) != 2) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -2343,8 +2339,6 @@ pg_get_object_address(PG_FUNCTION_ARGS) objnode = (Node *) list_make2(name, linitial(args)); break; case OBJECT_PUBLICATION_NAMESPACE: - objnode = (Node *) list_make3(linitial(name), linitial(args), lsecond(args)); - break; case OBJECT_USER_MAPPING: objnode = (Node *) list_make2(linitial(name), linitial(args)); break; @@ -2900,12 +2894,11 @@ get_catalog_object_by_oid(Relation catalog, AttrNumber oidcol, Oid objectId) * * Get publication name and schema name from the object address into pubname and * nspname. Both pubname and nspname are palloc'd strings which will be freed by - * the caller. The last parameter specifies which object type is included from - * the schema. + * the caller. */ static bool getPublicationSchemaInfo(const ObjectAddress *object, bool missing_ok, - char **pubname, char **nspname, char **objtype) + char **pubname, char **nspname) { HeapTuple tup; Form_pg_publication_namespace pnform; @@ -2941,13 +2934,6 @@ getPublicationSchemaInfo(const ObjectAddress *object, bool missing_ok, return false; } - /* - * The type is always a single character, but we need to pass it as a string, - * so allocate two charaters and set the first one. The second one is \0. - */ - *objtype = palloc0(2); - *objtype[0] = pnform->pntype; - ReleaseSysCache(tup); return true; } @@ -3979,17 +3965,15 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) { char *pubname; char *nspname; - char *objtype; if (!getPublicationSchemaInfo(object, missing_ok, - &pubname, &nspname, &objtype)) + &pubname, &nspname)) break; - appendStringInfo(&buffer, _("publication of schema %s in publication %s type %s"), - nspname, pubname, objtype); + appendStringInfo(&buffer, _("publication of schema %s in publication %s"), + nspname, pubname); pfree(pubname); pfree(nspname); - pfree(objtype); break; } @@ -5816,24 +5800,18 @@ getObjectIdentityParts(const ObjectAddress *object, { char *pubname; char *nspname; - char *objtype; if (!getPublicationSchemaInfo(object, missing_ok, &pubname, - &nspname, &objtype)) + &nspname)) break; - appendStringInfo(&buffer, "%s in publication %s type %s", - nspname, pubname, objtype); + appendStringInfo(&buffer, "%s in publication %s", + nspname, pubname); if (objargs) *objargs = list_make1(pubname); else pfree(pubname); - if (objargs) - *objargs = lappend(*objargs, objtype); - else - pfree(objtype); - if (objname) *objname = list_make1(nspname); else diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 9fe3b18926..2631558ff1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -55,10 +55,9 @@ static void publication_translate_columns(Relation targetrel, List *columns, static void check_publication_add_relation(Relation targetrel) { - /* Must be a regular or partitioned table, or a sequence */ + /* Must be a regular or partitioned table */ if (RelationGetForm(targetrel)->relkind != RELKIND_RELATION && - RelationGetForm(targetrel)->relkind != RELKIND_PARTITIONED_TABLE && - RelationGetForm(targetrel)->relkind != RELKIND_SEQUENCE) + RelationGetForm(targetrel)->relkind != RELKIND_PARTITIONED_TABLE) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("cannot add relation \"%s\" to publication", @@ -135,8 +134,7 @@ static bool is_publishable_class(Oid relid, Form_pg_class reltuple) { return (reltuple->relkind == RELKIND_RELATION || - reltuple->relkind == RELKIND_PARTITIONED_TABLE || - reltuple->relkind == RELKIND_SEQUENCE) && + reltuple->relkind == RELKIND_PARTITIONED_TABLE) && !IsCatalogRelationOid(relid) && reltuple->relpersistence == RELPERSISTENCE_PERMANENT && relid >= FirstNormalObjectId; @@ -181,52 +179,6 @@ filter_partitions(List *relids) return result; } -/* - * Check the character is a valid object type for schema publication. - * - * This recognizes either 't' for tables or 's' for sequences. Places that - * need to handle 'u' for unsupported relkinds need to do that explicitlyl - */ -static void -AssertObjectTypeValid(char objectType) -{ -#ifdef USE_ASSERT_CHECKING - Assert(objectType == PUB_OBJTYPE_SEQUENCE || objectType == PUB_OBJTYPE_TABLE); -#endif -} - -/* - * Determine object type matching a given a relkind value. - */ -char -pub_get_object_type_for_relkind(char relkind) -{ - /* sequence maps directly to sequence relkind */ - if (relkind == RELKIND_SEQUENCE) - return PUB_OBJTYPE_SEQUENCE; - - /* for table, we match either regular or partitioned table */ - if (relkind == RELKIND_RELATION || - relkind == RELKIND_PARTITIONED_TABLE) - return PUB_OBJTYPE_TABLE; - - return PUB_OBJTYPE_UNSUPPORTED; -} - -/* - * Determine if publication object type matches the relkind. - * - * Returns true if the relation matches object type replicated by this schema, - * false otherwise. - */ -static bool -pub_object_type_matches_relkind(char objectType, char relkind) -{ - AssertObjectTypeValid(objectType); - - return (pub_get_object_type_for_relkind(relkind) == objectType); -} - /* * Another variant of this, taking a Relation. */ @@ -256,7 +208,7 @@ is_schema_publication(Oid pubid) ObjectIdGetDatum(pubid)); scan = systable_beginscan(pubschsrel, - PublicationNamespacePnnspidPnpubidPntypeIndexId, + PublicationNamespacePnnspidPnpubidIndexId, true, NULL, 1, &scankey); tup = systable_getnext(scan); result = HeapTupleIsValid(tup); @@ -364,9 +316,7 @@ GetTopMostAncestorInPublication(Oid puboid, List *ancestors, int *ancestor_level } else { - /* we only search for ancestors of tables, so PUB_OBJTYPE_TABLE */ - aschemaPubids = GetSchemaPublications(get_rel_namespace(ancestor), - PUB_OBJTYPE_TABLE); + aschemaPubids = GetSchemaPublications(get_rel_namespace(ancestor)); if (list_member_oid(aschemaPubids, puboid)) { topmost_relid = ancestor; @@ -635,7 +585,7 @@ pub_collist_to_bitmapset(Bitmapset *columns, Datum pubcols, MemoryContext mcxt) * Insert new publication / schema mapping. */ ObjectAddress -publication_add_schema(Oid pubid, Oid schemaid, char objectType, bool if_not_exists) +publication_add_schema(Oid pubid, Oid schemaid, bool if_not_exists) { Relation rel; HeapTuple tup; @@ -647,8 +597,6 @@ publication_add_schema(Oid pubid, Oid schemaid, char objectType, bool if_not_exi ObjectAddress myself, referenced; - AssertObjectTypeValid(objectType); - rel = table_open(PublicationNamespaceRelationId, RowExclusiveLock); /* @@ -656,10 +604,9 @@ publication_add_schema(Oid pubid, Oid schemaid, char objectType, bool if_not_exi * duplicates, it's here just to provide nicer error message in common * case. The real protection is the unique key on the catalog. */ - if (SearchSysCacheExists3(PUBLICATIONNAMESPACEMAP, + if (SearchSysCacheExists2(PUBLICATIONNAMESPACEMAP, ObjectIdGetDatum(schemaid), - ObjectIdGetDatum(pubid), - CharGetDatum(objectType))) + ObjectIdGetDatum(pubid))) { table_close(rel, RowExclusiveLock); @@ -685,8 +632,6 @@ publication_add_schema(Oid pubid, Oid schemaid, char objectType, bool if_not_exi ObjectIdGetDatum(pubid); values[Anum_pg_publication_namespace_pnnspid - 1] = ObjectIdGetDatum(schemaid); - values[Anum_pg_publication_namespace_pntype - 1] = - CharGetDatum(objectType); tup = heap_form_tuple(RelationGetDescr(rel), values, nulls); @@ -712,7 +657,7 @@ publication_add_schema(Oid pubid, Oid schemaid, char objectType, bool if_not_exi * publication_add_relation for why we need to consider all the * partitions. */ - schemaRels = GetSchemaPublicationRelations(schemaid, objectType, + schemaRels = GetSchemaPublicationRelations(schemaid, PUBLICATION_PART_ALL); InvalidatePublicationRels(schemaRels); @@ -746,14 +691,11 @@ GetRelationPublications(Oid relid) /* * Gets list of relation oids for a publication. * - * This should only be used FOR TABLE / FOR SEQUENCE publications, the FOR - * ALL TABLES / SEQUENCES should use GetAllTablesPublicationRelations() - * and GetAllSequencesPublicationRelations(). - * - * XXX pub_partopt only matters for tables, not sequences. + * This should only be used FOR TABLE publications, the FOR ALL TABLES + * should use GetAllTablesPublicationRelations(). */ List * -GetPublicationRelations(Oid pubid, char objectType, PublicationPartOpt pub_partopt) +GetPublicationRelations(Oid pubid, PublicationPartOpt pub_partopt) { List *result; Relation pubrelsrel; @@ -761,8 +703,6 @@ GetPublicationRelations(Oid pubid, char objectType, PublicationPartOpt pub_parto SysScanDesc scan; HeapTuple tup; - AssertObjectTypeValid(objectType); - /* Find all publications associated with the relation. */ pubrelsrel = table_open(PublicationRelRelationId, AccessShareLock); @@ -777,29 +717,11 @@ GetPublicationRelations(Oid pubid, char objectType, PublicationPartOpt pub_parto result = NIL; while (HeapTupleIsValid(tup = systable_getnext(scan))) { - char relkind; Form_pg_publication_rel pubrel; pubrel = (Form_pg_publication_rel) GETSTRUCT(tup); - relkind = get_rel_relkind(pubrel->prrelid); - - /* - * If the relkind does not match the requested object type, ignore the - * relation. For example we might be interested only in sequences, so - * we ignore tables. - */ - if (!pub_object_type_matches_relkind(objectType, relkind)) - continue; - - /* - * We don't have partitioned sequences, so just add them to the list. - * Otherwise consider adding all child relations, if requested. - */ - if (relkind == RELKIND_SEQUENCE) - result = lappend_oid(result, pubrel->prrelid); - else - result = GetPubPartitionOptionRelations(result, pub_partopt, - pubrel->prrelid); + result = GetPubPartitionOptionRelations(result, pub_partopt, + pubrel->prrelid); } systable_endscan(scan); @@ -849,43 +771,6 @@ GetAllTablesPublications(void) return result; } -/* - * Gets list of publication oids for publications marked as FOR ALL SEQUENCES. - */ -List * -GetAllSequencesPublications(void) -{ - List *result; - Relation rel; - ScanKeyData scankey; - SysScanDesc scan; - HeapTuple tup; - - /* Find all publications that are marked as for all sequences. */ - rel = table_open(PublicationRelationId, AccessShareLock); - - ScanKeyInit(&scankey, - Anum_pg_publication_puballsequences, - BTEqualStrategyNumber, F_BOOLEQ, - BoolGetDatum(true)); - - scan = systable_beginscan(rel, InvalidOid, false, - NULL, 1, &scankey); - - result = NIL; - while (HeapTupleIsValid(tup = systable_getnext(scan))) - { - Oid oid = ((Form_pg_publication) GETSTRUCT(tup))->oid; - - result = lappend_oid(result, oid); - } - - systable_endscan(scan); - table_close(rel, AccessShareLock); - - return result; -} - /* * Gets list of all relation published by FOR ALL TABLES publication(s). * @@ -952,38 +837,28 @@ GetAllTablesPublicationRelations(bool pubviaroot) /* * Gets the list of schema oids for a publication. * - * This should only be used FOR ALL TABLES IN SCHEMA and FOR ALL SEQUENCES - * publications. - * - * 'objectType' determines whether to get FOR TABLE or FOR SEQUENCES schemas + * This should only be used FOR ALL TABLES IN SCHEMA publications. */ List * -GetPublicationSchemas(Oid pubid, char objectType) +GetPublicationSchemas(Oid pubid) { List *result = NIL; Relation pubschsrel; - ScanKeyData scankey[2]; + ScanKeyData scankey; SysScanDesc scan; HeapTuple tup; - AssertObjectTypeValid(objectType); - /* Find all schemas associated with the publication */ pubschsrel = table_open(PublicationNamespaceRelationId, AccessShareLock); - ScanKeyInit(&scankey[0], + ScanKeyInit(&scankey, Anum_pg_publication_namespace_pnpubid, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(pubid)); - ScanKeyInit(&scankey[1], - Anum_pg_publication_namespace_pntype, - BTEqualStrategyNumber, F_CHAREQ, - CharGetDatum(objectType)); - scan = systable_beginscan(pubschsrel, - PublicationNamespacePnnspidPnpubidPntypeIndexId, - true, NULL, 2, scankey); + PublicationNamespacePnnspidPnpubidIndexId, + true, NULL, 1, &scankey); while (HeapTupleIsValid(tup = systable_getnext(scan))) { Form_pg_publication_namespace pubsch; @@ -1001,26 +876,14 @@ GetPublicationSchemas(Oid pubid, char objectType) /* * Gets the list of publication oids associated with a specified schema. - * - * objectType specifies whether we're looking for schemas including tables or - * sequences. - * - * Note: relcache calls this for all object types, not just tables and sequences. - * Which is why we handle the PUB_OBJTYPE_UNSUPPORTED object type too. */ List * -GetSchemaPublications(Oid schemaid, char objectType) +GetSchemaPublications(Oid schemaid) { List *result = NIL; CatCList *pubschlist; int i; - /* unsupported object type */ - if (objectType == PUB_OBJTYPE_UNSUPPORTED) - return result; - - AssertObjectTypeValid(objectType); - /* Find all publications associated with the schema */ pubschlist = SearchSysCacheList1(PUBLICATIONNAMESPACEMAP, ObjectIdGetDatum(schemaid)); @@ -1028,11 +891,6 @@ GetSchemaPublications(Oid schemaid, char objectType) { HeapTuple tup = &pubschlist->members[i]->tuple; Oid pubid = ((Form_pg_publication_namespace) GETSTRUCT(tup))->pnpubid; - char pntype = ((Form_pg_publication_namespace) GETSTRUCT(tup))->pntype; - - /* Skip schemas publishing a different object type. */ - if (pntype != objectType) - continue; result = lappend_oid(result, pubid); } @@ -1044,13 +902,9 @@ GetSchemaPublications(Oid schemaid, char objectType) /* * Get the list of publishable relation oids for a specified schema. - * - * objectType specifies whether this is FOR ALL TABLES IN SCHEMA or FOR ALL - * SEQUENCES IN SCHEMA */ List * -GetSchemaPublicationRelations(Oid schemaid, char objectType, - PublicationPartOpt pub_partopt) +GetSchemaPublicationRelations(Oid schemaid, PublicationPartOpt pub_partopt) { Relation classRel; ScanKeyData key[1]; @@ -1059,7 +913,6 @@ GetSchemaPublicationRelations(Oid schemaid, char objectType, List *result = NIL; Assert(OidIsValid(schemaid)); - AssertObjectTypeValid(objectType); classRel = table_open(RelationRelationId, AccessShareLock); @@ -1080,16 +933,9 @@ GetSchemaPublicationRelations(Oid schemaid, char objectType, continue; relkind = get_rel_relkind(relid); - - /* Skip if the relkind does not match FOR ALL TABLES / SEQUENCES. */ - if (!pub_object_type_matches_relkind(objectType, relkind)) - continue; - - /* - * If the object is a partitioned table, lookup all the child relations - * (if requested). Otherwise just add the object to the list. - */ - if (relkind == RELKIND_PARTITIONED_TABLE) + if (relkind == RELKIND_RELATION) + result = lappend_oid(result, relid); + else if (relkind == RELKIND_PARTITIONED_TABLE) { List *partitionrels = NIL; @@ -1102,11 +948,7 @@ GetSchemaPublicationRelations(Oid schemaid, char objectType, pub_partopt, relForm->oid); result = list_concat_unique_oid(result, partitionrels); - continue; } - - /* non-partitioned tables and sequences */ - result = lappend_oid(result, relid); } table_endscan(scan); @@ -1116,67 +958,27 @@ GetSchemaPublicationRelations(Oid schemaid, char objectType, /* * Gets the list of all relations published by FOR ALL TABLES IN SCHEMA - * or FOR ALL SEQUENCES IN SCHEMA publication. + * publication. */ List * -GetAllSchemaPublicationRelations(Oid pubid, char objectType, - PublicationPartOpt pub_partopt) +GetAllSchemaPublicationRelations(Oid pubid, PublicationPartOpt pub_partopt) { List *result = NIL; - List *pubschemalist = GetPublicationSchemas(pubid, objectType); + List *pubschemalist = GetPublicationSchemas(pubid); ListCell *cell; - AssertObjectTypeValid(objectType); - foreach(cell, pubschemalist) { Oid schemaid = lfirst_oid(cell); List *schemaRels = NIL; - schemaRels = GetSchemaPublicationRelations(schemaid, objectType, - pub_partopt); + schemaRels = GetSchemaPublicationRelations(schemaid, pub_partopt); result = list_concat(result, schemaRels); } return result; } -/* - * Gets list of all relation published by FOR ALL SEQUENCES publication(s). - */ -List * -GetAllSequencesPublicationRelations(void) -{ - Relation classRel; - ScanKeyData key[1]; - TableScanDesc scan; - HeapTuple tuple; - List *result = NIL; - - classRel = table_open(RelationRelationId, AccessShareLock); - - ScanKeyInit(&key[0], - Anum_pg_class_relkind, - BTEqualStrategyNumber, F_CHAREQ, - CharGetDatum(RELKIND_SEQUENCE)); - - scan = table_beginscan_catalog(classRel, 1, key); - - while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL) - { - Form_pg_class relForm = (Form_pg_class) GETSTRUCT(tuple); - Oid relid = relForm->oid; - - if (is_publishable_class(relid, relForm)) - result = lappend_oid(result, relid); - } - - table_endscan(scan); - - table_close(classRel, AccessShareLock); - return result; -} - /* * Get publication using oid * @@ -1199,12 +1001,10 @@ GetPublication(Oid pubid) pub->oid = pubid; pub->name = pstrdup(NameStr(pubform->pubname)); pub->alltables = pubform->puballtables; - pub->allsequences = pubform->puballsequences; pub->pubactions.pubinsert = pubform->pubinsert; pub->pubactions.pubupdate = pubform->pubupdate; pub->pubactions.pubdelete = pubform->pubdelete; pub->pubactions.pubtruncate = pubform->pubtruncate; - pub->pubactions.pubsequence = pubform->pubsequence; pub->pubviaroot = pubform->pubviaroot; ReleaseSysCache(tup); @@ -1315,12 +1115,10 @@ pg_get_publication_tables(PG_FUNCTION_ARGS) *schemarelids; relids = GetPublicationRelations(publication->oid, - PUB_OBJTYPE_TABLE, publication->pubviaroot ? PUBLICATION_PART_ROOT : PUBLICATION_PART_LEAF); schemarelids = GetAllSchemaPublicationRelations(publication->oid, - PUB_OBJTYPE_TABLE, publication->pubviaroot ? PUBLICATION_PART_ROOT : PUBLICATION_PART_LEAF); @@ -1356,71 +1154,3 @@ pg_get_publication_tables(PG_FUNCTION_ARGS) SRF_RETURN_DONE(funcctx); } - -/* - * Returns Oids of sequences in a publication. - */ -Datum -pg_get_publication_sequences(PG_FUNCTION_ARGS) -{ - FuncCallContext *funcctx; - char *pubname = text_to_cstring(PG_GETARG_TEXT_PP(0)); - Publication *publication; - List *sequences; - - /* stuff done only on the first call of the function */ - if (SRF_IS_FIRSTCALL()) - { - MemoryContext oldcontext; - - /* create a function context for cross-call persistence */ - funcctx = SRF_FIRSTCALL_INIT(); - - /* switch to memory context appropriate for multiple function calls */ - oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); - - publication = GetPublicationByName(pubname, false); - - /* - * Publications support partitioned tables, although all changes are - * replicated using leaf partition identity and schema, so we only - * need those. - */ - if (publication->allsequences) - sequences = GetAllSequencesPublicationRelations(); - else - { - List *relids, - *schemarelids; - - relids = GetPublicationRelations(publication->oid, - PUB_OBJTYPE_SEQUENCE, - publication->pubviaroot ? - PUBLICATION_PART_ROOT : - PUBLICATION_PART_LEAF); - schemarelids = GetAllSchemaPublicationRelations(publication->oid, - PUB_OBJTYPE_SEQUENCE, - publication->pubviaroot ? - PUBLICATION_PART_ROOT : - PUBLICATION_PART_LEAF); - sequences = list_concat_unique_oid(relids, schemarelids); - } - - funcctx->user_fctx = (void *) sequences; - - MemoryContextSwitchTo(oldcontext); - } - - /* stuff done on every call of the function */ - funcctx = SRF_PERCALL_SETUP(); - sequences = (List *) funcctx->user_fctx; - - if (funcctx->call_cntr < list_length(sequences)) - { - Oid relid = list_nth_oid(sequences, funcctx->call_cntr); - - SRF_RETURN_NEXT(funcctx, ObjectIdGetDatum(relid)); - } - - SRF_RETURN_DONE(funcctx); -} diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index b1a6df16ad..0fc614e32c 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -374,16 +374,6 @@ CREATE VIEW pg_publication_tables AS pg_class C JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.oid = GPT.relid; -CREATE VIEW pg_publication_sequences AS - SELECT - P.pubname AS pubname, - N.nspname AS schemaname, - C.relname AS sequencename - FROM pg_publication P, - LATERAL pg_get_publication_sequences(P.pubname) GPS, - pg_class C JOIN pg_namespace N ON (N.oid = C.relnamespace) - WHERE C.oid = GPS.relid; - CREATE VIEW pg_locks AS SELECT * FROM pg_lock_status() AS L; diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index 84e37df783..4fd1e6e7ab 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -16,7 +16,6 @@ #include "access/genam.h" #include "access/htup_details.h" -#include "access/relation.h" #include "access/table.h" #include "access/xact.h" #include "catalog/catalog.h" @@ -68,17 +67,15 @@ typedef struct rf_context } rf_context; static List *OpenRelIdList(List *relids); -static List *OpenRelationList(List *rels, char objectType); -static void CloseRelationList(List *rels); +static List *OpenTableList(List *tables); +static void CloseTableList(List *rels); static void LockSchemaList(List *schemalist); -static void PublicationAddRelations(Oid pubid, List *rels, bool if_not_exists, +static void PublicationAddTables(Oid pubid, List *rels, bool if_not_exists, AlterPublicationStmt *stmt); -static void PublicationDropRelations(Oid pubid, List *rels, bool missing_ok); -static void PublicationAddSchemas(Oid pubid, List *schemas, char objectType, - bool if_not_exists, AlterPublicationStmt *stmt); -static void PublicationDropSchemas(Oid pubid, List *schemas, char objectType, - bool missing_ok); - +static void PublicationDropTables(Oid pubid, List *rels, bool missing_ok); +static void PublicationAddSchemas(Oid pubid, List *schemas, bool if_not_exists, + AlterPublicationStmt *stmt); +static void PublicationDropSchemas(Oid pubid, List *schemas, bool missing_ok); static void parse_publication_options(ParseState *pstate, @@ -98,7 +95,6 @@ parse_publication_options(ParseState *pstate, pubactions->pubupdate = true; pubactions->pubdelete = true; pubactions->pubtruncate = true; - pubactions->pubsequence = true; *publish_via_partition_root = false; /* Parse options */ @@ -123,7 +119,6 @@ parse_publication_options(ParseState *pstate, pubactions->pubupdate = false; pubactions->pubdelete = false; pubactions->pubtruncate = false; - pubactions->pubsequence = false; *publish_given = true; publish = defGetString(defel); @@ -146,8 +141,6 @@ parse_publication_options(ParseState *pstate, pubactions->pubdelete = true; else if (strcmp(publish_opt, "truncate") == 0) pubactions->pubtruncate = true; - else if (strcmp(publish_opt, "sequence") == 0) - pubactions->pubsequence = true; else ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -174,8 +167,7 @@ parse_publication_options(ParseState *pstate, */ static void ObjectsInPublicationToOids(List *pubobjspec_list, ParseState *pstate, - List **tables, List **sequences, - List **tables_schemas, List **sequences_schemas) + List **rels, List **schemas) { ListCell *cell; PublicationObjSpec *pubobj; @@ -193,22 +185,13 @@ ObjectsInPublicationToOids(List *pubobjspec_list, ParseState *pstate, switch (pubobj->pubobjtype) { case PUBLICATIONOBJ_TABLE: - *tables = lappend(*tables, pubobj->pubtable); - break; - case PUBLICATIONOBJ_SEQUENCE: - *sequences = lappend(*sequences, pubobj->pubtable); + *rels = lappend(*rels, pubobj->pubtable); break; case PUBLICATIONOBJ_TABLES_IN_SCHEMA: schemaid = get_namespace_oid(pubobj->name, false); /* Filter out duplicates if user specifies "sch1, sch1" */ - *tables_schemas = list_append_unique_oid(*tables_schemas, schemaid); - break; - case PUBLICATIONOBJ_SEQUENCES_IN_SCHEMA: - schemaid = get_namespace_oid(pubobj->name, false); - - /* Filter out duplicates if user specifies "sch1, sch1" */ - *sequences_schemas = list_append_unique_oid(*sequences_schemas, schemaid); + *schemas = list_append_unique_oid(*schemas, schemaid); break; case PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA: search_path = fetch_search_path(false); @@ -221,20 +204,7 @@ ObjectsInPublicationToOids(List *pubobjspec_list, ParseState *pstate, list_free(search_path); /* Filter out duplicates if user specifies "sch1, sch1" */ - *tables_schemas = list_append_unique_oid(*tables_schemas, schemaid); - break; - case PUBLICATIONOBJ_SEQUENCES_IN_CUR_SCHEMA: - search_path = fetch_search_path(false); - if (search_path == NIL) /* nothing valid in search_path? */ - ereport(ERROR, - errcode(ERRCODE_UNDEFINED_SCHEMA), - errmsg("no schema has been selected for CURRENT_SCHEMA")); - - schemaid = linitial_oid(search_path); - list_free(search_path); - - /* Filter out duplicates if user specifies "sch1, sch1" */ - *sequences_schemas = list_append_unique_oid(*sequences_schemas, schemaid); + *schemas = list_append_unique_oid(*schemas, schemaid); break; default: /* shouldn't happen */ @@ -270,14 +240,6 @@ CheckObjSchemaNotAlreadyInPublication(List *rels, List *schemaidlist, errdetail("Table \"%s\" in schema \"%s\" is already part of the publication, adding the same schema is not supported.", RelationGetRelationName(rel), get_namespace_name(relSchemaId))); - else if (checkobjtype == PUBLICATIONOBJ_SEQUENCES_IN_SCHEMA) - ereport(ERROR, - errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("cannot add schema \"%s\" to publication", - get_namespace_name(relSchemaId)), - errdetail("Sequence \"%s\" in schema \"%s\" is already part of the publication, adding the same schema is not supported.", - RelationGetRelationName(rel), - get_namespace_name(relSchemaId))); else if (checkobjtype == PUBLICATIONOBJ_TABLE) ereport(ERROR, errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -286,14 +248,6 @@ CheckObjSchemaNotAlreadyInPublication(List *rels, List *schemaidlist, RelationGetRelationName(rel)), errdetail("Table's schema \"%s\" is already part of the publication or part of the specified schema list.", get_namespace_name(relSchemaId))); - else if (checkobjtype == PUBLICATIONOBJ_SEQUENCE) - ereport(ERROR, - errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("cannot add relation \"%s.%s\" to publication", - get_namespace_name(relSchemaId), - RelationGetRelationName(rel)), - errdetail("Sequence's schema \"%s\" is already part of the publication or part of the specified schema list.", - get_namespace_name(relSchemaId))); } } } @@ -799,7 +753,6 @@ CheckPubRelationColumnList(List *tables, const char *queryString, ObjectAddress CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) { - ListCell *lc; Relation rel; ObjectAddress myself; Oid puboid; @@ -811,23 +764,8 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) bool publish_via_partition_root_given; bool publish_via_partition_root; AclResult aclresult; - List *tables = NIL; - List *sequences = NIL; - List *tables_schemaidlist = NIL; - List *sequences_schemaidlist = NIL; - - bool for_all_tables = false; - bool for_all_sequences = false; - - /* Translate the list of object types (represented by strings) to bool flags. */ - foreach (lc, stmt->for_all_objects) - { - char *val = strVal(lfirst(lc)); - if (strcmp(val, "tables") == 0) - for_all_tables = true; - else if (strcmp(val, "sequences") == 0) - for_all_sequences = true; - } + List *relations = NIL; + List *schemaidlist = NIL; /* must have CREATE privilege on database */ aclresult = pg_database_aclcheck(MyDatabaseId, GetUserId(), ACL_CREATE); @@ -836,17 +774,11 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) get_database_name(MyDatabaseId)); /* FOR ALL TABLES requires superuser */ - if (for_all_tables && !superuser()) + if (stmt->for_all_tables && !superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to create FOR ALL TABLES publication"))); - /* FOR ALL SEQUENCES requires superuser */ - if (for_all_sequences && !superuser()) - ereport(ERROR, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser to create FOR ALL SEQUENCES publication"))); - rel = table_open(PublicationRelationId, RowExclusiveLock); /* Check if name is used */ @@ -878,9 +810,7 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) Anum_pg_publication_oid); values[Anum_pg_publication_oid - 1] = ObjectIdGetDatum(puboid); values[Anum_pg_publication_puballtables - 1] = - BoolGetDatum(for_all_tables); - values[Anum_pg_publication_puballsequences - 1] = - BoolGetDatum(for_all_sequences); + BoolGetDatum(stmt->for_all_tables); values[Anum_pg_publication_pubinsert - 1] = BoolGetDatum(pubactions.pubinsert); values[Anum_pg_publication_pubupdate - 1] = @@ -889,8 +819,6 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) BoolGetDatum(pubactions.pubdelete); values[Anum_pg_publication_pubtruncate - 1] = BoolGetDatum(pubactions.pubtruncate); - values[Anum_pg_publication_pubsequence - 1] = - BoolGetDatum(pubactions.pubsequence); values[Anum_pg_publication_pubviaroot - 1] = BoolGetDatum(publish_via_partition_root); @@ -908,42 +836,28 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) CommandCounterIncrement(); /* Associate objects with the publication. */ - if (for_all_tables || for_all_sequences) + if (stmt->for_all_tables) { /* Invalidate relcache so that publication info is rebuilt. */ CacheInvalidateRelcacheAll(); } - - /* - * If the publication might have either tables or sequences (directly or - * through a schema), process that. - */ - if (!for_all_tables || !for_all_sequences) + else { - ObjectsInPublicationToOids(stmt->pubobjects, pstate, - &tables, &sequences, - &tables_schemaidlist, - &sequences_schemaidlist); + ObjectsInPublicationToOids(stmt->pubobjects, pstate, &relations, + &schemaidlist); /* FOR ALL TABLES IN SCHEMA requires superuser */ - if (list_length(tables_schemaidlist) > 0 && !superuser()) + if (list_length(schemaidlist) > 0 && !superuser()) ereport(ERROR, errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to create FOR ALL TABLES IN SCHEMA publication")); - /* FOR ALL SEQUENCES IN SCHEMA requires superuser */ - if (list_length(sequences_schemaidlist) > 0 && !superuser()) - ereport(ERROR, - errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser to create FOR ALL SEQUENCES IN SCHEMA publication")); - - /* tables added directly */ - if (list_length(tables) > 0) + if (list_length(relations) > 0) { List *rels; - rels = OpenRelationList(tables, PUB_OBJTYPE_TABLE); - CheckObjSchemaNotAlreadyInPublication(rels, tables_schemaidlist, + rels = OpenTableList(relations); + CheckObjSchemaNotAlreadyInPublication(rels, schemaidlist, PUBLICATIONOBJ_TABLE); TransformPubWhereClauses(rels, pstate->p_sourcetext, @@ -952,46 +866,18 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) CheckPubRelationColumnList(rels, pstate->p_sourcetext, publish_via_partition_root); - PublicationAddRelations(puboid, rels, true, NULL); - CloseRelationList(rels); + PublicationAddTables(puboid, rels, true, NULL); + CloseTableList(rels); } - /* sequences added directly */ - if (list_length(sequences) > 0) - { - List *rels; - - rels = OpenRelationList(sequences, PUB_OBJTYPE_SEQUENCE); - CheckObjSchemaNotAlreadyInPublication(rels, sequences_schemaidlist, - PUBLICATIONOBJ_SEQUENCE); - PublicationAddRelations(puboid, rels, true, NULL); - CloseRelationList(rels); - } - - /* tables added through a schema */ - if (list_length(tables_schemaidlist) > 0) + if (list_length(schemaidlist) > 0) { /* * Schema lock is held until the publication is created to prevent * concurrent schema deletion. */ - LockSchemaList(tables_schemaidlist); - PublicationAddSchemas(puboid, - tables_schemaidlist, PUB_OBJTYPE_TABLE, - true, NULL); - } - - /* sequences added through a schema */ - if (list_length(sequences_schemaidlist) > 0) - { - /* - * Schema lock is held until the publication is created to prevent - * concurrent schema deletion. - */ - LockSchemaList(sequences_schemaidlist); - PublicationAddSchemas(puboid, - sequences_schemaidlist, PUB_OBJTYPE_SEQUENCE, - true, NULL); + LockSchemaList(schemaidlist); + PublicationAddSchemas(puboid, schemaidlist, true, NULL); } } @@ -1055,7 +941,6 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, AccessShareLock); root_relids = GetPublicationRelations(pubform->oid, - PUB_OBJTYPE_TABLE, PUBLICATION_PART_ROOT); foreach(lc, root_relids) @@ -1135,9 +1020,6 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, values[Anum_pg_publication_pubtruncate - 1] = BoolGetDatum(pubactions.pubtruncate); replaces[Anum_pg_publication_pubtruncate - 1] = true; - - values[Anum_pg_publication_pubsequence - 1] = BoolGetDatum(pubactions.pubsequence); - replaces[Anum_pg_publication_pubsequence - 1] = true; } if (publish_via_partition_root_given) @@ -1157,7 +1039,7 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, pubform = (Form_pg_publication) GETSTRUCT(tup); /* Invalidate the relcache. */ - if (pubform->puballtables || pubform->puballsequences) + if (pubform->puballtables) { CacheInvalidateRelcacheAll(); } @@ -1173,7 +1055,6 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, */ if (root_relids == NIL) relids = GetPublicationRelations(pubform->oid, - PUB_OBJTYPE_TABLE, PUBLICATION_PART_ALL); else { @@ -1187,20 +1068,7 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, lfirst_oid(lc)); } - /* tables */ - schemarelids = GetAllSchemaPublicationRelations(pubform->oid, - PUB_OBJTYPE_TABLE, - PUBLICATION_PART_ALL); - relids = list_concat_unique_oid(relids, schemarelids); - - /* sequences */ - relids = list_concat_unique_oid(relids, - GetPublicationRelations(pubform->oid, - PUB_OBJTYPE_SEQUENCE, - PUBLICATION_PART_ALL)); - schemarelids = GetAllSchemaPublicationRelations(pubform->oid, - PUB_OBJTYPE_SEQUENCE, PUBLICATION_PART_ALL); relids = list_concat_unique_oid(relids, schemarelids); @@ -1255,7 +1123,7 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, if (!tables && stmt->action != AP_SetObjects) return; - rels = OpenRelationList(tables, PUB_OBJTYPE_TABLE); + rels = OpenTableList(tables); if (stmt->action == AP_AddObjects) { @@ -1265,9 +1133,7 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, * Check if the relation is member of the existing schema in the * publication or member of the schema list specified. */ - schemas = list_concat_copy(schemaidlist, - GetPublicationSchemas(pubid, - PUB_OBJTYPE_TABLE)); + schemas = list_concat_copy(schemaidlist, GetPublicationSchemas(pubid)); CheckObjSchemaNotAlreadyInPublication(rels, schemas, PUBLICATIONOBJ_TABLE); @@ -1275,14 +1141,13 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, CheckPubRelationColumnList(rels, queryString, pubform->pubviaroot); - PublicationAddRelations(pubid, rels, false, stmt); + PublicationAddTables(pubid, rels, false, stmt); } else if (stmt->action == AP_DropObjects) - PublicationDropRelations(pubid, rels, false); + PublicationDropTables(pubid, rels, false); else /* AP_SetObjects */ { List *oldrelids = GetPublicationRelations(pubid, - PUB_OBJTYPE_TABLE, PUBLICATION_PART_ROOT); List *delrels = NIL; ListCell *oldlc; @@ -1401,18 +1266,18 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, } /* And drop them. */ - PublicationDropRelations(pubid, delrels, true); + PublicationDropTables(pubid, delrels, true); /* * Don't bother calculating the difference for adding, we'll catch and * skip existing ones when doing catalog update. */ - PublicationAddRelations(pubid, rels, true, stmt); + PublicationAddTables(pubid, rels, true, stmt); - CloseRelationList(delrels); + CloseTableList(delrels); } - CloseRelationList(rels); + CloseTableList(rels); } /* @@ -1422,8 +1287,7 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, */ static void AlterPublicationSchemas(AlterPublicationStmt *stmt, - HeapTuple tup, List *schemaidlist, - char objectType) + HeapTuple tup, List *schemaidlist) { Form_pg_publication pubform = (Form_pg_publication) GETSTRUCT(tup); @@ -1445,20 +1309,20 @@ AlterPublicationSchemas(AlterPublicationStmt *stmt, List *rels; List *reloids; - reloids = GetPublicationRelations(pubform->oid, objectType, PUBLICATION_PART_ROOT); + reloids = GetPublicationRelations(pubform->oid, PUBLICATION_PART_ROOT); rels = OpenRelIdList(reloids); CheckObjSchemaNotAlreadyInPublication(rels, schemaidlist, PUBLICATIONOBJ_TABLES_IN_SCHEMA); - CloseRelationList(rels); - PublicationAddSchemas(pubform->oid, schemaidlist, objectType, false, stmt); + CloseTableList(rels); + PublicationAddSchemas(pubform->oid, schemaidlist, false, stmt); } else if (stmt->action == AP_DropObjects) - PublicationDropSchemas(pubform->oid, schemaidlist, objectType, false); + PublicationDropSchemas(pubform->oid, schemaidlist, false); else /* AP_SetObjects */ { - List *oldschemaids = GetPublicationSchemas(pubform->oid, objectType); + List *oldschemaids = GetPublicationSchemas(pubform->oid); List *delschemas = NIL; /* Identify which schemas should be dropped */ @@ -1471,13 +1335,13 @@ AlterPublicationSchemas(AlterPublicationStmt *stmt, LockSchemaList(delschemas); /* And drop them */ - PublicationDropSchemas(pubform->oid, delschemas, objectType, true); + PublicationDropSchemas(pubform->oid, delschemas, true); /* * Don't bother calculating the difference for adding, we'll catch and * skip existing ones when doing catalog update. */ - PublicationAddSchemas(pubform->oid, schemaidlist, objectType, true, stmt); + PublicationAddSchemas(pubform->oid, schemaidlist, true, stmt); } } @@ -1487,13 +1351,12 @@ AlterPublicationSchemas(AlterPublicationStmt *stmt, */ static void CheckAlterPublication(AlterPublicationStmt *stmt, HeapTuple tup, - List *tables, List *tables_schemaidlist, - List *sequences, List *sequences_schemaidlist) + List *tables, List *schemaidlist) { Form_pg_publication pubform = (Form_pg_publication) GETSTRUCT(tup); if ((stmt->action == AP_AddObjects || stmt->action == AP_SetObjects) && - (tables_schemaidlist || sequences_schemaidlist) && !superuser()) + schemaidlist && !superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to add or set schemas"))); @@ -1502,24 +1365,13 @@ CheckAlterPublication(AlterPublicationStmt *stmt, HeapTuple tup, * Check that user is allowed to manipulate the publication tables in * schema */ - if (tables_schemaidlist && pubform->puballtables) + if (schemaidlist && pubform->puballtables) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("publication \"%s\" is defined as FOR ALL TABLES", NameStr(pubform->pubname)), errdetail("Tables from schema cannot be added to, dropped from, or set on FOR ALL TABLES publications."))); - /* - * Check that user is allowed to manipulate the publication sequences in - * schema - */ - if (sequences_schemaidlist && pubform->puballsequences) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("publication \"%s\" is defined as FOR ALL SEQUENCES", - NameStr(pubform->pubname)), - errdetail("Sequences from schema cannot be added to, dropped from, or set on FOR ALL SEQUENCES publications."))); - /* Check that user is allowed to manipulate the publication tables. */ if (tables && pubform->puballtables) ereport(ERROR, @@ -1527,108 +1379,6 @@ CheckAlterPublication(AlterPublicationStmt *stmt, HeapTuple tup, errmsg("publication \"%s\" is defined as FOR ALL TABLES", NameStr(pubform->pubname)), errdetail("Tables cannot be added to or dropped from FOR ALL TABLES publications."))); - - /* Check that user is allowed to manipulate the publication sequences. */ - if (sequences && pubform->puballsequences) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("publication \"%s\" is defined as FOR ALL SEQUENCES", - NameStr(pubform->pubname)), - errdetail("Sequences cannot be added to or dropped from FOR ALL SEQUENCES publications."))); -} - -/* - * Add or remove sequence to/from publication. - */ -static void -AlterPublicationSequences(AlterPublicationStmt *stmt, HeapTuple tup, - List *sequences, List *schemaidlist) -{ - List *rels = NIL; - Form_pg_publication pubform = (Form_pg_publication) GETSTRUCT(tup); - Oid pubid = pubform->oid; - - /* - * It is quite possible that for the SET case user has not specified any - * tables in which case we need to remove all the existing tables. - */ - if (!sequences && stmt->action != AP_SetObjects) - return; - - rels = OpenRelationList(sequences, PUB_OBJTYPE_SEQUENCE); - - if (stmt->action == AP_AddObjects) - { - List *schemas = NIL; - - /* - * Check if the relation is member of the existing schema in the - * publication or member of the schema list specified. - */ - schemas = list_concat_copy(schemaidlist, - GetPublicationSchemas(pubid, - PUB_OBJTYPE_SEQUENCE)); - CheckObjSchemaNotAlreadyInPublication(rels, schemas, - PUBLICATIONOBJ_SEQUENCE); - PublicationAddRelations(pubid, rels, false, stmt); - } - else if (stmt->action == AP_DropObjects) - PublicationDropRelations(pubid, rels, false); - else /* DEFELEM_SET */ - { - List *oldrelids = GetPublicationRelations(pubid, - PUB_OBJTYPE_SEQUENCE, - PUBLICATION_PART_ROOT); - List *delrels = NIL; - ListCell *oldlc; - - CheckObjSchemaNotAlreadyInPublication(rels, schemaidlist, - PUBLICATIONOBJ_SEQUENCE); - - /* Calculate which relations to drop. */ - foreach(oldlc, oldrelids) - { - Oid oldrelid = lfirst_oid(oldlc); - ListCell *newlc; - PublicationRelInfo *oldrel; - bool found = false; - - foreach(newlc, rels) - { - PublicationRelInfo *newpubrel; - - newpubrel = (PublicationRelInfo *) lfirst(newlc); - if (RelationGetRelid(newpubrel->relation) == oldrelid) - { - found = true; - break; - } - } - /* Not yet in the list, open it and add to the list */ - if (!found) - { - oldrel = palloc(sizeof(PublicationRelInfo)); - oldrel->whereClause = NULL; - oldrel->columns = NULL; - oldrel->relation = table_open(oldrelid, - ShareUpdateExclusiveLock); - delrels = lappend(delrels, oldrel); - } - } - - /* And drop them. */ - PublicationDropRelations(pubid, delrels, true); - - /* - * Don't bother calculating the difference for adding, we'll catch and - * skip existing ones when doing catalog update. - */ - PublicationAddRelations(pubid, rels, true, stmt); - - CloseRelationList(delrels); - } - - CloseRelationList(rels); } /* @@ -1666,20 +1416,14 @@ AlterPublication(ParseState *pstate, AlterPublicationStmt *stmt) AlterPublicationOptions(pstate, stmt, rel, tup); else { - List *tables = NIL; - List *sequences = NIL; - List *tables_schemaidlist = NIL; - List *sequences_schemaidlist = NIL; + List *relations = NIL; + List *schemaidlist = NIL; Oid pubid = pubform->oid; - ObjectsInPublicationToOids(stmt->pubobjects, pstate, - &tables, &sequences, - &tables_schemaidlist, - &sequences_schemaidlist); + ObjectsInPublicationToOids(stmt->pubobjects, pstate, &relations, + &schemaidlist); - CheckAlterPublication(stmt, tup, - tables, tables_schemaidlist, - sequences, sequences_schemaidlist); + CheckAlterPublication(stmt, tup, relations, schemaidlist); heap_freetuple(tup); @@ -1707,16 +1451,9 @@ AlterPublication(ParseState *pstate, AlterPublicationStmt *stmt) errmsg("publication \"%s\" does not exist", stmt->pubname)); - AlterPublicationTables(stmt, tup, tables, tables_schemaidlist, + AlterPublicationTables(stmt, tup, relations, schemaidlist, pstate->p_sourcetext); - - AlterPublicationSequences(stmt, tup, sequences, sequences_schemaidlist); - - AlterPublicationSchemas(stmt, tup, tables_schemaidlist, - PUB_OBJTYPE_TABLE); - - AlterPublicationSchemas(stmt, tup, sequences_schemaidlist, - PUB_OBJTYPE_SEQUENCE); + AlterPublicationSchemas(stmt, tup, schemaidlist); } /* Cleanup. */ @@ -1784,7 +1521,7 @@ RemovePublicationById(Oid pubid) pubform = (Form_pg_publication) GETSTRUCT(tup); /* Invalidate relcache so that publication info is rebuilt. */ - if (pubform->puballtables || pubform->puballsequences) + if (pubform->puballtables) CacheInvalidateRelcacheAll(); CatalogTupleDelete(rel, &tup->t_self); @@ -1820,7 +1557,6 @@ RemovePublicationSchemaById(Oid psoid) * partitions. */ schemaRels = GetSchemaPublicationRelations(pubsch->pnnspid, - pubsch->pntype, PUBLICATION_PART_ALL); InvalidatePublicationRels(schemaRels); @@ -1863,10 +1599,10 @@ OpenRelIdList(List *relids) * add them to a publication. */ static List * -OpenRelationList(List *rels, char objectType) +OpenTableList(List *tables) { List *relids = NIL; - List *result = NIL; + List *rels = NIL; ListCell *lc; List *relids_with_rf = NIL; List *relids_with_collist = NIL; @@ -1874,35 +1610,19 @@ OpenRelationList(List *rels, char objectType) /* * Open, share-lock, and check all the explicitly-specified relations */ - foreach(lc, rels) + foreach(lc, tables) { PublicationTable *t = lfirst_node(PublicationTable, lc); bool recurse = t->relation->inh; Relation rel; Oid myrelid; PublicationRelInfo *pub_rel; - char myrelkind; /* Allow query cancel in case this takes a long time */ CHECK_FOR_INTERRUPTS(); rel = table_openrv(t->relation, ShareUpdateExclusiveLock); myrelid = RelationGetRelid(rel); - myrelkind = get_rel_relkind(myrelid); - - /* - * Make sure the relkind matches the expected object type. This may - * happen e.g. when adding a sequence using ADD TABLE or a table - * using ADD SEQUENCE). - * - * XXX We let through unsupported object types (views etc.). Those - * will be caught later in check_publication_add_relation. - */ - if (pub_get_object_type_for_relkind(myrelkind) != PUB_OBJTYPE_UNSUPPORTED && - pub_get_object_type_for_relkind(myrelkind) != objectType) - ereport(ERROR, - errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("object type does not match type expected by command")); /* * Filter out duplicates if user specifies "foo, foo". @@ -1935,7 +1655,7 @@ OpenRelationList(List *rels, char objectType) pub_rel->relation = rel; pub_rel->whereClause = t->whereClause; pub_rel->columns = t->columns; - result = lappend(result, pub_rel); + rels = lappend(rels, pub_rel); relids = lappend_oid(relids, myrelid); if (t->whereClause) @@ -2004,9 +1724,10 @@ OpenRelationList(List *rels, char objectType) pub_rel->relation = rel; /* child inherits WHERE clause from parent */ pub_rel->whereClause = t->whereClause; + /* child inherits column list from parent */ pub_rel->columns = t->columns; - result = lappend(result, pub_rel); + rels = lappend(rels, pub_rel); relids = lappend_oid(relids, childrelid); if (t->whereClause) @@ -2021,14 +1742,14 @@ OpenRelationList(List *rels, char objectType) list_free(relids); list_free(relids_with_rf); - return result; + return rels; } /* * Close all relations in the list. */ static void -CloseRelationList(List *rels) +CloseTableList(List *rels) { ListCell *lc; @@ -2076,12 +1797,12 @@ LockSchemaList(List *schemalist) * Add listed tables to the publication. */ static void -PublicationAddRelations(Oid pubid, List *rels, bool if_not_exists, +PublicationAddTables(Oid pubid, List *rels, bool if_not_exists, AlterPublicationStmt *stmt) { ListCell *lc; - Assert(!stmt || !stmt->for_all_objects); + Assert(!stmt || !stmt->for_all_tables); foreach(lc, rels) { @@ -2110,7 +1831,7 @@ PublicationAddRelations(Oid pubid, List *rels, bool if_not_exists, * Remove listed tables from the publication. */ static void -PublicationDropRelations(Oid pubid, List *rels, bool missing_ok) +PublicationDropTables(Oid pubid, List *rels, bool missing_ok) { ObjectAddress obj; ListCell *lc; @@ -2155,19 +1876,19 @@ PublicationDropRelations(Oid pubid, List *rels, bool missing_ok) * Add listed schemas to the publication. */ static void -PublicationAddSchemas(Oid pubid, List *schemas, char objectType, - bool if_not_exists, AlterPublicationStmt *stmt) +PublicationAddSchemas(Oid pubid, List *schemas, bool if_not_exists, + AlterPublicationStmt *stmt) { ListCell *lc; - Assert(!stmt || !stmt->for_all_objects); + Assert(!stmt || !stmt->for_all_tables); foreach(lc, schemas) { Oid schemaid = lfirst_oid(lc); ObjectAddress obj; - obj = publication_add_schema(pubid, schemaid, objectType, if_not_exists); + obj = publication_add_schema(pubid, schemaid, if_not_exists); if (stmt) { EventTriggerCollectSimpleCommand(obj, InvalidObjectAddress, @@ -2183,7 +1904,7 @@ PublicationAddSchemas(Oid pubid, List *schemas, char objectType, * Remove listed schemas from the publication. */ static void -PublicationDropSchemas(Oid pubid, List *schemas, char objectType, bool missing_ok) +PublicationDropSchemas(Oid pubid, List *schemas, bool missing_ok) { ObjectAddress obj; ListCell *lc; @@ -2193,11 +1914,10 @@ PublicationDropSchemas(Oid pubid, List *schemas, char objectType, bool missing_o { Oid schemaid = lfirst_oid(lc); - psid = GetSysCacheOid3(PUBLICATIONNAMESPACEMAP, + psid = GetSysCacheOid2(PUBLICATIONNAMESPACEMAP, Anum_pg_publication_namespace_oid, ObjectIdGetDatum(schemaid), - ObjectIdGetDatum(pubid), - CharGetDatum(objectType)); + ObjectIdGetDatum(pubid)); if (!OidIsValid(psid)) { if (missing_ok) @@ -2252,13 +1972,6 @@ AlterPublicationOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId) NameStr(form->pubname)), errhint("The owner of a FOR ALL TABLES publication must be a superuser."))); - if (form->puballsequences && !superuser_arg(newOwnerId)) - ereport(ERROR, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("permission denied to change owner of publication \"%s\"", - NameStr(form->pubname)), - errhint("The owner of a FOR ALL SEQUENCES publication must be a superuser."))); - if (!superuser_arg(newOwnerId) && is_schema_publication(form->oid)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index 47f62c28d4..ddf219b21f 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -332,160 +332,6 @@ ResetSequence(Oid seq_relid) relation_close(seq_rel, NoLock); } -/* - * Update the sequence state by modifying the existing sequence data row. - * - * This keeps the same relfilenode, so the behavior is non-transactional. - */ -static void -SetSequence_non_transactional(Oid seqrelid, int64 last_value, int64 log_cnt, bool is_called) -{ - SeqTable elm; - Relation seqrel; - Buffer buf; - HeapTupleData seqdatatuple; - Form_pg_sequence_data seq; - - /* open and lock sequence */ - init_sequence(seqrelid, &elm, &seqrel); - - /* lock page' buffer and read tuple */ - seq = read_seq_tuple(seqrel, &buf, &seqdatatuple); - - /* check the comment above nextval_internal()'s equivalent call. */ - if (RelationNeedsWAL(seqrel)) - { - GetTopTransactionId(); - - if (XLogLogicalInfoActive()) - GetCurrentTransactionId(); - } - - /* ready to change the on-disk (or really, in-buffer) tuple */ - START_CRIT_SECTION(); - - seq->last_value = last_value; - seq->is_called = is_called; - seq->log_cnt = log_cnt; - - MarkBufferDirty(buf); - - /* XLOG stuff */ - if (RelationNeedsWAL(seqrel)) - { - xl_seq_rec xlrec; - XLogRecPtr recptr; - Page page = BufferGetPage(buf); - - XLogBeginInsert(); - XLogRegisterBuffer(0, buf, REGBUF_WILL_INIT); - - xlrec.node = seqrel->rd_node; - xlrec.created = false; - - XLogRegisterData((char *) &xlrec, sizeof(xl_seq_rec)); - XLogRegisterData((char *) seqdatatuple.t_data, seqdatatuple.t_len); - - recptr = XLogInsert(RM_SEQ_ID, XLOG_SEQ_LOG); - - PageSetLSN(page, recptr); - } - - END_CRIT_SECTION(); - - UnlockReleaseBuffer(buf); - - /* Clear local cache so that we don't think we have cached numbers */ - /* Note that we do not change the currval() state */ - elm->cached = elm->last; - - relation_close(seqrel, NoLock); -} - -/* - * Update the sequence state by creating a new relfilenode. - * - * This creates a new relfilenode, to allow transactional behavior. - */ -static void -SetSequence_transactional(Oid seq_relid, int64 last_value, int64 log_cnt, bool is_called) -{ - SeqTable elm; - Relation seqrel; - Buffer buf; - HeapTupleData seqdatatuple; - Form_pg_sequence_data seq; - HeapTuple tuple; - - /* open and lock sequence */ - init_sequence(seq_relid, &elm, &seqrel); - - /* lock page' buffer and read tuple */ - seq = read_seq_tuple(seqrel, &buf, &seqdatatuple); - - /* Copy the existing sequence tuple. */ - tuple = heap_copytuple(&seqdatatuple); - - /* Now we're done with the old page */ - UnlockReleaseBuffer(buf); - - /* - * Modify the copied tuple to update the sequence state (similar to what - * ResetSequence does). - */ - seq = (Form_pg_sequence_data) GETSTRUCT(tuple); - seq->last_value = last_value; - seq->is_called = is_called; - seq->log_cnt = log_cnt; - - /* - * Create a new storage file for the sequence - this is needed for the - * transactional behavior. - */ - RelationSetNewRelfilenode(seqrel, seqrel->rd_rel->relpersistence); - - /* - * Ensure sequence's relfrozenxid is at 0, since it won't contain any - * unfrozen XIDs. Same with relminmxid, since a sequence will never - * contain multixacts. - */ - Assert(seqrel->rd_rel->relfrozenxid == InvalidTransactionId); - Assert(seqrel->rd_rel->relminmxid == InvalidMultiXactId); - - /* - * Insert the modified tuple into the new storage file. This does all the - * necessary WAL-logging etc. - */ - fill_seq_with_data(seqrel, tuple); - - /* Clear local cache so that we don't think we have cached numbers */ - /* Note that we do not change the currval() state */ - elm->cached = elm->last; - - relation_close(seqrel, NoLock); -} - -/* - * Set a sequence to a specified internal state. - * - * The change is made transactionally, so that on failure of the current - * transaction, the sequence will be restored to its previous state. - * We do that by creating a whole new relfilenode for the sequence; so this - * works much like the rewriting forms of ALTER TABLE. - * - * Caller is assumed to have acquired AccessExclusiveLock on the sequence, - * which must not be released until end of transaction. Caller is also - * responsible for permissions checking. - */ -void -SetSequence(Oid seq_relid, bool transactional, int64 last_value, int64 log_cnt, bool is_called) -{ - if (transactional) - SetSequence_transactional(seq_relid, last_value, log_cnt, is_called); - else - SetSequence_non_transactional(seq_relid, last_value, log_cnt, is_called); -} - /* * Initialize a sequence's relation with the specified tuple as content * @@ -552,13 +398,8 @@ fill_seq_fork_with_data(Relation rel, HeapTuple tuple, ForkNumber forkNum) /* check the comment above nextval_internal()'s equivalent call. */ if (RelationNeedsWAL(rel)) - { GetTopTransactionId(); - if (XLogLogicalInfoActive()) - GetCurrentTransactionId(); - } - START_CRIT_SECTION(); MarkBufferDirty(buf); @@ -578,7 +419,6 @@ fill_seq_fork_with_data(Relation rel, HeapTuple tuple, ForkNumber forkNum) XLogRegisterBuffer(0, buf, REGBUF_WILL_INIT); xlrec.node = rel->rd_node; - xlrec.created = true; XLogRegisterData((char *) &xlrec, sizeof(xl_seq_rec)); XLogRegisterData((char *) tuple->t_data, tuple->t_len); @@ -958,28 +798,10 @@ nextval_internal(Oid relid, bool check_permissions) * It's sufficient to ensure the toplevel transaction has an xid, no need * to assign xids subxacts, that'll already trigger an appropriate wait. * (Have to do that here, so we're outside the critical section) - * - * We have to ensure we have a proper XID, which will be included in - * the XLOG record by XLogRecordAssemble. Otherwise the first nextval() - * in a subxact (without any preceding changes) would get XID 0, and it - * would then be impossible to decide which top xact it belongs to. - * It'd also trigger assert in DecodeSequence. We only do that with - * wal_level=logical, though. - * - * XXX This might seem unnecessary, because if there's no XID the xact - * couldn't have done anything important yet, e.g. it could not have - * created a sequence. But that's incorrect, because of subxacts. The - * current subtransaction might not have done anything yet (thus no XID), - * but an earlier one might have created the sequence. */ if (logit && RelationNeedsWAL(seqrel)) - { GetTopTransactionId(); - if (XLogLogicalInfoActive()) - GetCurrentTransactionId(); - } - /* ready to change the on-disk (or really, in-buffer) tuple */ START_CRIT_SECTION(); @@ -1015,7 +837,6 @@ nextval_internal(Oid relid, bool check_permissions) seq->log_cnt = 0; xlrec.node = seqrel->rd_node; - xlrec.created = false; XLogRegisterData((char *) &xlrec, sizeof(xl_seq_rec)); XLogRegisterData((char *) seqdatatuple.t_data, seqdatatuple.t_len); @@ -1181,13 +1002,8 @@ do_setval(Oid relid, int64 next, bool iscalled) /* check the comment above nextval_internal()'s equivalent call. */ if (RelationNeedsWAL(seqrel)) - { GetTopTransactionId(); - if (XLogLogicalInfoActive()) - GetCurrentTransactionId(); - } - /* ready to change the on-disk (or really, in-buffer) tuple */ START_CRIT_SECTION(); @@ -1208,8 +1024,6 @@ do_setval(Oid relid, int64 next, bool iscalled) XLogRegisterBuffer(0, buf, REGBUF_WILL_INIT); xlrec.node = seqrel->rd_node; - xlrec.created = false; - XLogRegisterData((char *) &xlrec, sizeof(xl_seq_rec)); XLogRegisterData((char *) seqdatatuple.t_data, seqdatatuple.t_len); diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 057ab4b6a3..2e8d8afead 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -90,7 +90,6 @@ typedef struct SubOpts } SubOpts; static List *fetch_table_list(WalReceiverConn *wrconn, List *publications); -static List *fetch_sequence_list(WalReceiverConn *wrconn, List *publications); static void check_duplicates_in_publist(List *publist, Datum *datums); static List *merge_publications(List *oldpublist, List *newpublist, bool addpub, const char *subname); static void ReportSlotConnectionError(List *rstates, Oid subid, char *slotname, char *err); @@ -639,9 +638,9 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, { char *err; WalReceiverConn *wrconn; - List *relations; + List *tables; ListCell *lc; - char sync_state; + char table_state; /* Try to connect to the publisher. */ wrconn = walrcv_connect(conninfo, true, stmt->subname, &err); @@ -658,17 +657,14 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, * Set sync state based on if we were asked to do data copy or * not. */ - sync_state = opts.copy_data ? SUBREL_STATE_INIT : SUBREL_STATE_READY; + table_state = opts.copy_data ? SUBREL_STATE_INIT : SUBREL_STATE_READY; /* - * Get the table and sequence list from publisher and build - * local relation sync status info. + * Get the table list from publisher and build local table status + * info. */ - relations = fetch_table_list(wrconn, publications); - relations = list_concat(relations, - fetch_sequence_list(wrconn, publications)); - - foreach(lc, relations) + tables = fetch_table_list(wrconn, publications); + foreach(lc, tables) { RangeVar *rv = (RangeVar *) lfirst(lc); Oid relid; @@ -679,7 +675,7 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, CheckSubscriptionRelkind(get_rel_relkind(relid), rv->schemaname, rv->relname); - AddSubscriptionRelState(subid, relid, sync_state, + AddSubscriptionRelState(subid, relid, table_state, InvalidXLogRecPtr); } @@ -705,12 +701,12 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, * * Note that if tables were specified but copy_data is false * then it is safe to enable two_phase up-front because those - * relations are already initially in READY state. When the - * subscription has no relations, we leave the twophase state - * as PENDING, to allow ALTER SUBSCRIPTION ... REFRESH + * tables are already initially in READY state. When the + * subscription has no tables, we leave the twophase state as + * PENDING, to allow ALTER SUBSCRIPTION ... REFRESH * PUBLICATION to work. */ - if (opts.twophase && !opts.copy_data && relations != NIL) + if (opts.twophase && !opts.copy_data && tables != NIL) twophase_enabled = true; walrcv_create_slot(wrconn, opts.slot_name, false, twophase_enabled, @@ -786,10 +782,8 @@ AlterSubscription_refresh(Subscription *sub, bool copy_data, if (validate_publications) check_publications(wrconn, validate_publications); - /* Get the list of relations from publisher. */ + /* Get the table list from publisher. */ pubrel_names = fetch_table_list(wrconn, sub->publications); - pubrel_names = list_concat(pubrel_names, - fetch_sequence_list(wrconn, sub->publications)); /* Get local table list. */ subrel_states = GetSubscriptionRelations(sub->oid); @@ -1813,75 +1807,6 @@ fetch_table_list(WalReceiverConn *wrconn, List *publications) return tablelist; } -/* - * Get the list of sequences which belong to specified publications on the - * publisher connection. - */ -static List * -fetch_sequence_list(WalReceiverConn *wrconn, List *publications) -{ - WalRcvExecResult *res; - StringInfoData cmd; - TupleTableSlot *slot; - Oid tableRow[2] = {TEXTOID, TEXTOID}; - ListCell *lc; - bool first; - List *tablelist = NIL; - - Assert(list_length(publications) > 0); - - initStringInfo(&cmd); - appendStringInfoString(&cmd, "SELECT DISTINCT s.schemaname, s.sequencename\n" - " FROM pg_catalog.pg_publication_sequences s\n" - " WHERE s.pubname IN ("); - first = true; - foreach(lc, publications) - { - char *pubname = strVal(lfirst(lc)); - - if (first) - first = false; - else - appendStringInfoString(&cmd, ", "); - - appendStringInfoString(&cmd, quote_literal_cstr(pubname)); - } - appendStringInfoChar(&cmd, ')'); - - res = walrcv_exec(wrconn, cmd.data, 2, tableRow); - pfree(cmd.data); - - if (res->status != WALRCV_OK_TUPLES) - ereport(ERROR, - (errmsg("could not receive list of replicated sequences from the publisher: %s", - res->err))); - - /* Process sequences. */ - slot = MakeSingleTupleTableSlot(res->tupledesc, &TTSOpsMinimalTuple); - while (tuplestore_gettupleslot(res->tuplestore, true, false, slot)) - { - char *nspname; - char *relname; - bool isnull; - RangeVar *rv; - - nspname = TextDatumGetCString(slot_getattr(slot, 1, &isnull)); - Assert(!isnull); - relname = TextDatumGetCString(slot_getattr(slot, 2, &isnull)); - Assert(!isnull); - - rv = makeRangeVar(nspname, relname, -1); - tablelist = lappend(tablelist, rv); - - ExecClearTuple(slot); - } - ExecDropSingleTupleTableSlot(slot); - - walrcv_clear_result(res); - - return tablelist; -} - /* * This is to report the connection failure while dropping replication slots. * Here, we report the WARNING for all tablesync slots so that user can drop diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 4dd545cdd2..90edd0bb97 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -42,7 +42,6 @@ #include "catalog/pg_inherits.h" #include "catalog/pg_namespace.h" #include "catalog/pg_opclass.h" -#include "catalog/pg_publication_namespace.h" #include "catalog/pg_statistic_ext.h" #include "catalog/pg_tablespace.h" #include "catalog/pg_trigger.h" @@ -16409,14 +16408,11 @@ AlterTableNamespace(AlterObjectSchemaStmt *stmt, Oid *oldschema) * Check that setting the relation to a different schema won't result in a * publication having both a schema and the same schema's table, as this * is not supported. - * - * XXX We do this for tables and sequences, but it's better to keep the two - * blocks separate, to make the strings easier to translate. */ if (stmt->objectType == OBJECT_TABLE) { ListCell *lc; - List *schemaPubids = GetSchemaPublications(nspOid, PUB_OBJTYPE_TABLE); + List *schemaPubids = GetSchemaPublications(nspOid); List *relPubids = GetRelationPublications(RelationGetRelid(rel)); foreach(lc, relPubids) @@ -16434,27 +16430,6 @@ AlterTableNamespace(AlterObjectSchemaStmt *stmt, Oid *oldschema) get_publication_name(pubid, false))); } } - else if (stmt->objectType == OBJECT_SEQUENCE) - { - ListCell *lc; - List *schemaPubids = GetSchemaPublications(nspOid, PUB_OBJTYPE_SEQUENCE); - List *relPubids = GetRelationPublications(RelationGetRelid(rel)); - - foreach(lc, relPubids) - { - Oid pubid = lfirst_oid(lc); - - if (list_member_oid(schemaPubids, pubid)) - ereport(ERROR, - errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot move sequence \"%s\" to schema \"%s\"", - RelationGetRelationName(rel), stmt->newschema), - errdetail("The schema \"%s\" and same schema's sequence \"%s\" cannot be part of the same publication \"%s\".", - stmt->newschema, - RelationGetRelationName(rel), - get_publication_name(pubid, false))); - } - } /* common checks on switching namespaces */ CheckSetNamespace(oldNspOid, nspOid); diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c index 228e354701..27989bd723 100644 --- a/src/backend/executor/execReplication.c +++ b/src/backend/executor/execReplication.c @@ -649,9 +649,7 @@ void CheckSubscriptionRelkind(char relkind, const char *nspname, const char *relname) { - if (relkind != RELKIND_RELATION && - relkind != RELKIND_PARTITIONED_TABLE && - relkind != RELKIND_SEQUENCE) + if (relkind != RELKIND_RELATION && relkind != RELKIND_PARTITIONED_TABLE) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot use relation \"%s.%s\" as logical replication target", diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 46a1943d97..1585cf2d58 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -5390,7 +5390,7 @@ _copyCreatePublicationStmt(const CreatePublicationStmt *from) COPY_STRING_FIELD(pubname); COPY_NODE_FIELD(options); COPY_NODE_FIELD(pubobjects); - COPY_NODE_FIELD(for_all_objects); + COPY_SCALAR_FIELD(for_all_tables); return newnode; } @@ -5403,7 +5403,7 @@ _copyAlterPublicationStmt(const AlterPublicationStmt *from) COPY_STRING_FIELD(pubname); COPY_NODE_FIELD(options); COPY_NODE_FIELD(pubobjects); - COPY_NODE_FIELD(for_all_objects); + COPY_SCALAR_FIELD(for_all_tables); COPY_SCALAR_FIELD(action); return newnode; diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 1f765f42c9..caad20e047 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -2688,7 +2688,7 @@ _equalCreatePublicationStmt(const CreatePublicationStmt *a, COMPARE_STRING_FIELD(pubname); COMPARE_NODE_FIELD(options); COMPARE_NODE_FIELD(pubobjects); - COMPARE_NODE_FIELD(for_all_objects); + COMPARE_SCALAR_FIELD(for_all_tables); return true; } @@ -2700,7 +2700,7 @@ _equalAlterPublicationStmt(const AlterPublicationStmt *a, COMPARE_STRING_FIELD(pubname); COMPARE_NODE_FIELD(options); COMPARE_NODE_FIELD(pubobjects); - COMPARE_NODE_FIELD(for_all_objects); + COMPARE_SCALAR_FIELD(for_all_tables); COMPARE_SCALAR_FIELD(action); return true; diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 2cc92a8943..c9941d9cb4 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -455,7 +455,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); transform_element_list transform_type_list TriggerTransitions TriggerReferencing vacuum_relation_list opt_vacuum_relation_list - drop_option_list pub_obj_list pub_obj_type_list + drop_option_list pub_obj_list %type opt_routine_body %type group_clause @@ -588,7 +588,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type var_value zone_value %type auth_ident RoleSpec opt_granted_by %type PublicationObjSpec -%type pub_obj_type %type unreserved_keyword type_func_name_keyword %type col_name_keyword reserved_keyword @@ -9863,10 +9862,13 @@ AlterOwnerStmt: ALTER AGGREGATE aggregate_with_argtypes OWNER TO RoleSpec * * CREATE PUBLICATION FOR ALL TABLES [WITH options] * - * CREATE PUBLICATION FOR ALL SEQUENCES [WITH options] - * * CREATE PUBLICATION FOR pub_obj [, ...] [WITH options] * + * pub_obj is one of: + * + * TABLE table [, ...] + * ALL TABLES IN SCHEMA schema [, ...] + * *****************************************************************************/ CreatePublicationStmt: @@ -9877,12 +9879,12 @@ CreatePublicationStmt: n->options = $4; $$ = (Node *)n; } - | CREATE PUBLICATION name FOR ALL pub_obj_type_list opt_definition + | CREATE PUBLICATION name FOR ALL TABLES opt_definition { CreatePublicationStmt *n = makeNode(CreatePublicationStmt); n->pubname = $3; n->options = $7; - n->for_all_objects = $6; + n->for_all_tables = true; $$ = (Node *)n; } | CREATE PUBLICATION name FOR pub_obj_list opt_definition @@ -9932,26 +9934,6 @@ PublicationObjSpec: $$->pubobjtype = PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA; $$->location = @5; } - | SEQUENCE relation_expr - { - $$ = makeNode(PublicationObjSpec); - $$->pubobjtype = PUBLICATIONOBJ_SEQUENCE; - $$->pubtable = makeNode(PublicationTable); - $$->pubtable->relation = $2; - } - | ALL SEQUENCES IN_P SCHEMA ColId - { - $$ = makeNode(PublicationObjSpec); - $$->pubobjtype = PUBLICATIONOBJ_SEQUENCES_IN_SCHEMA; - $$->name = $5; - $$->location = @5; - } - | ALL SEQUENCES IN_P SCHEMA CURRENT_SCHEMA - { - $$ = makeNode(PublicationObjSpec); - $$->pubobjtype = PUBLICATIONOBJ_SEQUENCES_IN_CUR_SCHEMA; - $$->location = @5; - } | ColId opt_column_list OptWhereClause { $$ = makeNode(PublicationObjSpec); @@ -10013,19 +9995,6 @@ pub_obj_list: PublicationObjSpec { $$ = lappend($1, $3); } ; -pub_obj_type: TABLES - { $$ = (Node *) makeString("tables"); } - | SEQUENCES - { $$ = (Node *) makeString("sequences"); } - ; - -pub_obj_type_list: pub_obj_type - { $$ = list_make1($1); } - | pub_obj_type_list ',' pub_obj_type - { $$ = lappend($1, $3); } - ; - - /***************************************************************************** * * ALTER PUBLICATION name SET ( options ) @@ -10036,6 +10005,11 @@ pub_obj_type_list: pub_obj_type * * ALTER PUBLICATION name SET pub_obj [, ...] * + * pub_obj is one of: + * + * TABLE table_name [, ...] + * ALL TABLES IN SCHEMA schema_name [, ...] + * *****************************************************************************/ AlterPublicationStmt: @@ -18757,8 +18731,7 @@ preprocess_pubobj_list(List *pubobjspec_list, core_yyscan_t yyscanner) if (pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION) pubobj->pubobjtype = prevobjtype; - if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLE || - pubobj->pubobjtype == PUBLICATIONOBJ_SEQUENCE) + if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLE) { /* relation name or pubtable must be set for this type of object */ if (!pubobj->name && !pubobj->pubtable) @@ -18809,30 +18782,6 @@ preprocess_pubobj_list(List *pubobjspec_list, core_yyscan_t yyscanner) errmsg("invalid schema name at or near"), parser_errposition(pubobj->location)); } - else if (pubobj->pubobjtype == PUBLICATIONOBJ_SEQUENCES_IN_SCHEMA || - pubobj->pubobjtype == PUBLICATIONOBJ_SEQUENCES_IN_CUR_SCHEMA) - { - /* WHERE clause is not allowed on a schema object */ - if (pubobj->pubtable && pubobj->pubtable->whereClause) - ereport(ERROR, - errcode(ERRCODE_SYNTAX_ERROR), - errmsg("WHERE clause not allowed for schema"), - parser_errposition(pubobj->location)); - - /* - * We can distinguish between the different type of schema - * objects based on whether name and pubtable is set. - */ - if (pubobj->name) - pubobj->pubobjtype = PUBLICATIONOBJ_SEQUENCES_IN_SCHEMA; - else if (!pubobj->name && !pubobj->pubtable) - pubobj->pubobjtype = PUBLICATIONOBJ_SEQUENCES_IN_CUR_SCHEMA; - else - ereport(ERROR, - errcode(ERRCODE_SYNTAX_ERROR), - errmsg("invalid schema name at or near"), - parser_errposition(pubobj->location)); - } prevobjtype = pubobj->pubobjtype; } diff --git a/src/backend/replication/logical/decode.c b/src/backend/replication/logical/decode.c index c6ea7c98e1..6303647fe0 100644 --- a/src/backend/replication/logical/decode.c +++ b/src/backend/replication/logical/decode.c @@ -42,7 +42,6 @@ #include "replication/reorderbuffer.h" #include "replication/snapbuild.h" #include "storage/standby.h" -#include "commands/sequence.h" /* individual record(group)'s handlers */ static void DecodeInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); @@ -64,7 +63,6 @@ static void DecodePrepare(LogicalDecodingContext *ctx, XLogRecordBuffer *buf, /* common function to decode tuples */ static void DecodeXLogTuple(char *data, Size len, ReorderBufferTupleBuf *tup); -static void DecodeSeqTuple(char *data, Size len, ReorderBufferTupleBuf *tuple); /* helper functions for decoding transactions */ static inline bool FilterPrepare(LogicalDecodingContext *ctx, @@ -1252,132 +1250,3 @@ DecodeTXNNeedSkip(LogicalDecodingContext *ctx, XLogRecordBuffer *buf, (txn_dbid != InvalidOid && txn_dbid != ctx->slot->data.database) || ctx->fast_forward || FilterByOrigin(ctx, origin_id)); } - -/* - * DecodeSeqTuple - * decode tuple describing the sequence increment - * - * Sequences are represented as a table with a single row, which gets updated - * by nextval(). The tuple is stored in WAL right after the xl_seq_rec, so we - * simply copy it into the tuplebuf (similar to seq_redo). - */ -static void -DecodeSeqTuple(char *data, Size len, ReorderBufferTupleBuf *tuple) -{ - int datalen = len - sizeof(xl_seq_rec) - SizeofHeapTupleHeader; - - Assert(datalen >= 0); - - tuple->tuple.t_len = datalen + SizeofHeapTupleHeader; - - ItemPointerSetInvalid(&tuple->tuple.t_self); - - tuple->tuple.t_tableOid = InvalidOid; - - memcpy(((char *) tuple->tuple.t_data), - data + sizeof(xl_seq_rec), - SizeofHeapTupleHeader); - - memcpy(((char *) tuple->tuple.t_data) + SizeofHeapTupleHeader, - data + sizeof(xl_seq_rec) + SizeofHeapTupleHeader, - datalen); -} - -/* - * Handle sequence decode - * - * Decoding sequences is a bit tricky, because while most sequence actions - * are non-transactional (not subject to rollback), some need to be handled - * as transactional. - * - * By default, a sequence increment is non-transactional - we must not queue - * it in a transaction as other changes, because the transaction might get - * rolled back and we'd discard the increment. The downstream would not be - * notified about the increment, which is wrong. - * - * On the other hand, the sequence may be created in a transaction. In this - * case we *should* queue the change as other changes in the transaction, - * because we don't want to send the increments for unknown sequence to the - * plugin - it might get confused about which sequence it's related to etc. - */ -void -sequence_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) -{ - SnapBuild *builder = ctx->snapshot_builder; - ReorderBufferTupleBuf *tuplebuf; - RelFileNode target_node; - XLogReaderState *r = buf->record; - char *tupledata = NULL; - Size tuplelen; - Size datalen = 0; - TransactionId xid = XLogRecGetXid(r); - uint8 info = XLogRecGetInfo(buf->record) & ~XLR_INFO_MASK; - xl_seq_rec *xlrec; - Snapshot snapshot; - RepOriginId origin_id = XLogRecGetOrigin(r); - bool transactional; - - /* only decode changes flagged with XLOG_SEQ_LOG */ - if (info != XLOG_SEQ_LOG) - elog(ERROR, "unexpected RM_SEQ_ID record type: %u", info); - - ReorderBufferProcessXid(ctx->reorder, XLogRecGetXid(r), buf->origptr); - - /* - * If we don't have snapshot or we are just fast-forwarding, there is no - * point in decoding messages. - */ - if (SnapBuildCurrentState(builder) < SNAPBUILD_FULL_SNAPSHOT || - ctx->fast_forward) - return; - - /* only interested in our database */ - XLogRecGetBlockTag(r, 0, &target_node, NULL, NULL); - if (target_node.dbNode != ctx->slot->data.database) - return; - - /* output plugin doesn't look for this origin, no need to queue */ - if (FilterByOrigin(ctx, XLogRecGetOrigin(r))) - return; - - tupledata = XLogRecGetData(r); - datalen = XLogRecGetDataLen(r); - tuplelen = datalen - SizeOfHeapHeader - sizeof(xl_seq_rec); - - /* extract the WAL record, with "created" flag */ - xlrec = (xl_seq_rec *) XLogRecGetData(r); - - /* XXX how could we have sequence change without data? */ - if(!datalen || !tupledata) - return; - - tuplebuf = ReorderBufferGetTupleBuf(ctx->reorder, tuplelen); - DecodeSeqTuple(tupledata, datalen, tuplebuf); - - /* - * Should we handle the sequence increment as transactional or not? - * - * If the sequence was created in a still-running transaction, treat - * it as transactional and queue the increments. Otherwise it needs - * to be treated as non-transactional, in which case we send it to - * the plugin right away. - */ - transactional = ReorderBufferSequenceIsTransactional(ctx->reorder, - target_node, - xlrec->created); - - /* Skip the change if already processed (per the snapshot). */ - if (transactional && - !SnapBuildProcessChange(builder, xid, buf->origptr)) - return; - else if (!transactional && - (SnapBuildCurrentState(builder) != SNAPBUILD_CONSISTENT || - SnapBuildXactNeedsSkip(builder, buf->origptr))) - return; - - /* Queue the increment (or send immediately if not transactional). */ - snapshot = SnapBuildGetOrBuildSnapshot(builder, xid); - ReorderBufferQueueSequence(ctx->reorder, xid, snapshot, buf->endptr, - origin_id, target_node, transactional, - xlrec->created, tuplebuf); -} diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index 30e33dace3..788769dd73 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -73,10 +73,6 @@ static void truncate_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, static void message_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, XLogRecPtr message_lsn, bool transactional, const char *prefix, Size message_size, const char *message); -static void sequence_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, - XLogRecPtr sequence_lsn, Relation rel, - bool transactional, - int64 last_value, int64 log_cnt, bool is_called); /* streaming callbacks */ static void stream_start_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, @@ -94,10 +90,6 @@ static void stream_change_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn static void stream_message_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, XLogRecPtr message_lsn, bool transactional, const char *prefix, Size message_size, const char *message); -static void stream_sequence_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, - XLogRecPtr sequence_lsn, Relation rel, - bool transactional, - int64 last_value, int64 log_cnt, bool is_called); static void stream_truncate_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, int nrelations, Relation relations[], ReorderBufferChange *change); @@ -226,7 +218,6 @@ StartupDecodingContext(List *output_plugin_options, ctx->reorder->apply_truncate = truncate_cb_wrapper; ctx->reorder->commit = commit_cb_wrapper; ctx->reorder->message = message_cb_wrapper; - ctx->reorder->sequence = sequence_cb_wrapper; /* * To support streaming, we require start/stop/abort/commit/change @@ -243,7 +234,6 @@ StartupDecodingContext(List *output_plugin_options, (ctx->callbacks.stream_commit_cb != NULL) || (ctx->callbacks.stream_change_cb != NULL) || (ctx->callbacks.stream_message_cb != NULL) || - (ctx->callbacks.stream_sequence_cb != NULL) || (ctx->callbacks.stream_truncate_cb != NULL); /* @@ -261,7 +251,6 @@ StartupDecodingContext(List *output_plugin_options, ctx->reorder->stream_commit = stream_commit_cb_wrapper; ctx->reorder->stream_change = stream_change_cb_wrapper; ctx->reorder->stream_message = stream_message_cb_wrapper; - ctx->reorder->stream_sequence = stream_sequence_cb_wrapper; ctx->reorder->stream_truncate = stream_truncate_cb_wrapper; @@ -1216,42 +1205,6 @@ message_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, error_context_stack = errcallback.previous; } -static void -sequence_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, - XLogRecPtr sequence_lsn, Relation rel, bool transactional, - int64 last_value, int64 log_cnt, bool is_called) -{ - LogicalDecodingContext *ctx = cache->private_data; - LogicalErrorCallbackState state; - ErrorContextCallback errcallback; - - Assert(!ctx->fast_forward); - - if (ctx->callbacks.sequence_cb == NULL) - return; - - /* Push callback + info on the error context stack */ - state.ctx = ctx; - state.callback_name = "sequence"; - state.report_location = sequence_lsn; - errcallback.callback = output_plugin_error_callback; - errcallback.arg = (void *) &state; - errcallback.previous = error_context_stack; - error_context_stack = &errcallback; - - /* set output state */ - ctx->accept_writes = true; - ctx->write_xid = txn != NULL ? txn->xid : InvalidTransactionId; - ctx->write_location = sequence_lsn; - - /* do the actual work: call callback */ - ctx->callbacks.sequence_cb(ctx, txn, sequence_lsn, rel, transactional, - last_value, log_cnt, is_called); - - /* Pop the error context stack */ - error_context_stack = errcallback.previous; -} - static void stream_start_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, XLogRecPtr first_lsn) @@ -1557,47 +1510,6 @@ stream_message_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, error_context_stack = errcallback.previous; } -static void -stream_sequence_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, - XLogRecPtr sequence_lsn, Relation rel, - bool transactional, - int64 last_value, int64 log_cnt, bool is_called) -{ - LogicalDecodingContext *ctx = cache->private_data; - LogicalErrorCallbackState state; - ErrorContextCallback errcallback; - - Assert(!ctx->fast_forward); - - /* We're only supposed to call this when streaming is supported. */ - Assert(ctx->streaming); - - /* this callback is optional */ - if (ctx->callbacks.stream_sequence_cb == NULL) - return; - - /* Push callback + info on the error context stack */ - state.ctx = ctx; - state.callback_name = "stream_sequence"; - state.report_location = sequence_lsn; - errcallback.callback = output_plugin_error_callback; - errcallback.arg = (void *) &state; - errcallback.previous = error_context_stack; - error_context_stack = &errcallback; - - /* set output state */ - ctx->accept_writes = true; - ctx->write_xid = txn != NULL ? txn->xid : InvalidTransactionId; - ctx->write_location = sequence_lsn; - - /* do the actual work: call callback */ - ctx->callbacks.sequence_cb(ctx, txn, sequence_lsn, rel, transactional, - last_value, log_cnt, is_called); - - /* Pop the error context stack */ - error_context_stack = errcallback.previous; -} - static void stream_truncate_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, int nrelations, Relation relations[], diff --git a/src/backend/replication/logical/proto.c b/src/backend/replication/logical/proto.c index 18d3cbb924..ff8513e2d2 100644 --- a/src/backend/replication/logical/proto.c +++ b/src/backend/replication/logical/proto.c @@ -662,56 +662,6 @@ logicalrep_write_message(StringInfo out, TransactionId xid, XLogRecPtr lsn, pq_sendbytes(out, message, sz); } -/* - * Write SEQUENCE to stream - */ -void -logicalrep_write_sequence(StringInfo out, Relation rel, TransactionId xid, - XLogRecPtr lsn, bool transactional, - int64 last_value, int64 log_cnt, bool is_called) -{ - uint8 flags = 0; - char *relname; - - pq_sendbyte(out, LOGICAL_REP_MSG_SEQUENCE); - - /* transaction ID (if not valid, we're not streaming) */ - if (TransactionIdIsValid(xid)) - pq_sendint32(out, xid); - - pq_sendint8(out, flags); - pq_sendint64(out, lsn); - - logicalrep_write_namespace(out, RelationGetNamespace(rel)); - relname = RelationGetRelationName(rel); - pq_sendstring(out, relname); - - pq_sendint8(out, transactional); - pq_sendint64(out, last_value); - pq_sendint64(out, log_cnt); - pq_sendint8(out, is_called); -} - -/* - * Read SEQUENCE from the stream. - */ -void -logicalrep_read_sequence(StringInfo in, LogicalRepSequence *seqdata) -{ - /* XXX skipping flags and lsn */ - pq_getmsgint(in, 1); - pq_getmsgint64(in); - - /* Read relation name from stream */ - seqdata->nspname = pstrdup(logicalrep_read_namespace(in)); - seqdata->seqname = pstrdup(pq_getmsgstring(in)); - - seqdata->transactional = pq_getmsgint(in, 1); - seqdata->last_value = pq_getmsgint64(in); - seqdata->log_cnt = pq_getmsgint64(in); - seqdata->is_called = pq_getmsgint(in, 1); -} - /* * Write relation description to the output stream. */ @@ -1286,8 +1236,6 @@ logicalrep_message_type(LogicalRepMsgType action) return "STREAM ABORT"; case LOGICAL_REP_MSG_STREAM_PREPARE: return "STREAM PREPARE"; - case LOGICAL_REP_MSG_SEQUENCE: - return "SEQUENCE"; } elog(ERROR, "invalid logical replication message type \"%c\"", action); diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 4702750a2e..5adc016d44 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -77,40 +77,6 @@ * a bit more memory to the oldest subtransactions, because it's likely * they are the source for the next sequence of changes. * - * When decoding sequences, we differentiate between a sequences created - * in a (running) transaction, and sequences created in other (already - * committed) transactions. Changes for sequences created in the same - * top-level transaction are treated as "transactional" i.e. just like - * any other change from that transaction (and discarded in case of a - * rollback). Changes for sequences created earlier are treated as not - * transactional - are processed immediately, as if performed outside - * any transaction (and thus not rolled back). - * - * This mixed behavior is necessary - sequences are non-transactional - * (e.g. ROLLBACK does not undo the sequence increments). But for new - * sequences, we need to handle them in a transactional way, because if - * we ever get some DDL support, the sequence won't exist until the - * transaction gets applied. So we need to ensure the increments don't - * happen until the sequence gets created. - * - * To differentiate which sequences are "old" and which were created - * in a still-running transaction, we track sequences created in running - * transactions in a hash table. Sequences are identified by relfilenode, - * and we track XID of the (sub)transaction that created it. This means - * that if a transaction does something that changes the relfilenode - * (like an alter / reset of a sequence), the new relfilenode will be - * treated as if created in the transaction. The list of sequences gets - * discarded when the transaction completes (commit/rollback). - * - * We don't use the XID to check if it's the same top-level transaction. - * It's enough to know it was created in an in-progress transaction, - * and we know it must be the current one because otherwise it wouldn't - * see the sequence object. - * - * The XID may be valid even for non-transactional sequences - we simply - * keep the XID logged to WAL, it's up to the reorderbuffer to decide if - * the increment is transactional. - * * ------------------------------------------------------------------------- */ #include "postgres.h" @@ -125,7 +91,6 @@ #include "access/xact.h" #include "access/xlog_internal.h" #include "catalog/catalog.h" -#include "commands/sequence.h" #include "lib/binaryheap.h" #include "miscadmin.h" #include "pgstat.h" @@ -151,13 +116,6 @@ typedef struct ReorderBufferTXNByIdEnt ReorderBufferTXN *txn; } ReorderBufferTXNByIdEnt; -/* entry for hash table we use to track sequences created in running xacts */ -typedef struct ReorderBufferSequenceEnt -{ - RelFileNode rnode; - TransactionId xid; -} ReorderBufferSequenceEnt; - /* data structures for (relfilenode, ctid) => (cmin, cmax) mapping */ typedef struct ReorderBufferTupleCidKey { @@ -388,14 +346,6 @@ ReorderBufferAllocate(void) buffer->by_txn = hash_create("ReorderBufferByXid", 1000, &hash_ctl, HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); - /* hash table of sequences, mapping relfilenode to XID of transaction */ - hash_ctl.keysize = sizeof(RelFileNode); - hash_ctl.entrysize = sizeof(ReorderBufferSequenceEnt); - hash_ctl.hcxt = buffer->context; - - buffer->sequences = hash_create("ReorderBufferSequenceHash", 1000, &hash_ctl, - HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); - buffer->by_txn_last_xid = InvalidTransactionId; buffer->by_txn_last_txn = NULL; @@ -582,13 +532,6 @@ ReorderBufferReturnChange(ReorderBuffer *rb, ReorderBufferChange *change, change->data.truncate.relids = NULL; } break; - case REORDER_BUFFER_CHANGE_SEQUENCE: - if (change->data.sequence.tuple) - { - ReorderBufferReturnTupleBuf(rb, change->data.sequence.tuple); - change->data.sequence.tuple = NULL; - } - break; case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_CONFIRM: case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_ABORT: case REORDER_BUFFER_CHANGE_INTERNAL_COMMAND_ID: @@ -923,230 +866,6 @@ ReorderBufferQueueMessage(ReorderBuffer *rb, TransactionId xid, } } -/* - * Treat the sequence increment as transactional? - * - * The hash table tracks all sequences created in in-progress transactions, - * so we simply do a lookup (the sequence is identified by relfilende). If - * we find a match, the increment should be handled as transactional. - */ -bool -ReorderBufferSequenceIsTransactional(ReorderBuffer *rb, - RelFileNode rnode, bool created) -{ - bool found = false; - - if (created) - return true; - - hash_search(rb->sequences, - (void *) &rnode, - HASH_FIND, - &found); - - return found; -} - -/* - * Cleanup sequences created in in-progress transactions. - * - * There's no way to search by XID, so we simply do a seqscan of all - * the entries in the hash table. Hopefully there are only a couple - * entries in most cases - people generally don't create many new - * sequences over and over. - */ -static void -ReorderBufferSequenceCleanup(ReorderBuffer *rb, TransactionId xid) -{ - HASH_SEQ_STATUS scan_status; - ReorderBufferSequenceEnt *ent; - - hash_seq_init(&scan_status, rb->sequences); - while ((ent = (ReorderBufferSequenceEnt *) hash_seq_search(&scan_status)) != NULL) - { - /* skip sequences not from this transaction */ - if (ent->xid != xid) - continue; - - (void) hash_search(rb->sequences, - (void *) &(ent->rnode), - HASH_REMOVE, NULL); - } -} - -/* - * A transactional sequence increment is queued to be processed upon commit - * and a non-transactional increment gets processed immediately. - * - * A sequence update may be both transactional and non-transactional. When - * created in a running transaction, treat it as transactional and queue - * the change in it. Otherwise treat it as non-transactional, so that we - * don't forget the increment in case of a rollback. - */ -void -ReorderBufferQueueSequence(ReorderBuffer *rb, TransactionId xid, - Snapshot snapshot, XLogRecPtr lsn, RepOriginId origin_id, - RelFileNode rnode, bool transactional, bool created, - ReorderBufferTupleBuf *tuplebuf) -{ - /* - * Change needs to be handled as transactional, because the sequence was - * created in a transaction that is still running. In that case all the - * changes need to be queued in that transaction, we must not send them - * to the downstream until the transaction commits. - * - * There's a bit of a trouble with subtransactions - we can't queue it - * into the subxact, because it might be rolled back and we'd lose the - * increment. We need to queue it into the same (sub)xact that created - * the sequence, which is why we track the XID in the hash table. - */ - if (transactional) - { - MemoryContext oldcontext; - ReorderBufferChange *change; - - /* lookup sequence by relfilenode */ - ReorderBufferSequenceEnt *ent; - bool found; - - /* transactional changes require a transaction */ - Assert(xid != InvalidTransactionId); - - /* search the lookup table (we ignore the return value, found is enough) */ - ent = hash_search(rb->sequences, - (void *) &rnode, - created ? HASH_ENTER : HASH_FIND, - &found); - - /* - * If this is the "create" increment, we must not have found any - * pre-existing entry in the hash table (i.e. there must not be - * any conflicting sequence). - */ - Assert(!(created && found)); - - /* But we must have either created or found an existing entry. */ - Assert(created || found); - - /* - * When creating the sequence, remember the XID of the transaction - * that created id. - */ - if (created) - ent->xid = xid; - - /* XXX Maybe check that we're still in the same top-level xact? */ - - /* OK, allocate and queue the change */ - oldcontext = MemoryContextSwitchTo(rb->context); - - change = ReorderBufferGetChange(rb); - - change->action = REORDER_BUFFER_CHANGE_SEQUENCE; - change->origin_id = origin_id; - - memcpy(&change->data.sequence.relnode, &rnode, sizeof(RelFileNode)); - - change->data.sequence.tuple = tuplebuf; - - /* add it to the same subxact that created the sequence */ - ReorderBufferQueueChange(rb, ent->xid, lsn, change, false); - - MemoryContextSwitchTo(oldcontext); - } - else - { - /* - * This increment is for a sequence that was not created in any - * running transaction, so we treat it as non-transactional and - * just send it to the output plugin directly. - */ - ReorderBufferTXN *txn = NULL; - volatile Snapshot snapshot_now = snapshot; - bool using_subtxn; - -#ifdef USE_ASSERT_CHECKING - /* All "creates" have to be handled as transactional. */ - Assert(!created); - - /* Make sure the sequence is not in the hash table. */ - { - bool found; - hash_search(rb->sequences, - (void *) &rnode, - HASH_FIND, &found); - Assert(!found); - } -#endif - - if (xid != InvalidTransactionId) - txn = ReorderBufferTXNByXid(rb, xid, true, NULL, lsn, true); - - /* setup snapshot to allow catalog access */ - SetupHistoricSnapshot(snapshot_now, NULL); - - /* - * Decoding needs access to syscaches et al., which in turn use - * heavyweight locks and such. Thus we need to have enough state around to - * keep track of those. The easiest way is to simply use a transaction - * internally. That also allows us to easily enforce that nothing writes - * to the database by checking for xid assignments. - * - * When we're called via the SQL SRF there's already a transaction - * started, so start an explicit subtransaction there. - */ - using_subtxn = IsTransactionOrTransactionBlock(); - - PG_TRY(); - { - Relation relation; - HeapTuple tuple; - Form_pg_sequence_data seq; - Oid reloid; - - if (using_subtxn) - BeginInternalSubTransaction("sequence"); - else - StartTransactionCommand(); - - reloid = RelidByRelfilenode(rnode.spcNode, rnode.relNode); - - if (reloid == InvalidOid) - elog(ERROR, "could not map filenode \"%s\" to relation OID", - relpathperm(rnode, - MAIN_FORKNUM)); - - relation = RelationIdGetRelation(reloid); - tuple = &tuplebuf->tuple; - seq = (Form_pg_sequence_data) GETSTRUCT(tuple); - - rb->sequence(rb, txn, lsn, relation, transactional, - seq->last_value, seq->log_cnt, seq->is_called); - - RelationClose(relation); - - TeardownHistoricSnapshot(false); - - AbortCurrentTransaction(); - - if (using_subtxn) - RollbackAndReleaseCurrentSubTransaction(); - } - PG_CATCH(); - { - TeardownHistoricSnapshot(true); - - AbortCurrentTransaction(); - - if (using_subtxn) - RollbackAndReleaseCurrentSubTransaction(); - - PG_RE_THROW(); - } - PG_END_TRY(); - } -} - /* * AssertTXNLsnOrder * Verify LSN ordering of transaction lists in the reorderbuffer @@ -1823,9 +1542,6 @@ ReorderBufferCleanupTXN(ReorderBuffer *rb, ReorderBufferTXN *txn) &found); Assert(found); - /* Remove sequences created in this transaction (if any). */ - ReorderBufferSequenceCleanup(rb, txn->xid); - /* remove entries spilled to disk */ if (rbtxn_is_serialized(txn)) ReorderBufferRestoreCleanup(rb, txn); @@ -2241,29 +1957,6 @@ ReorderBufferApplyMessage(ReorderBuffer *rb, ReorderBufferTXN *txn, change->data.msg.message); } -/* - * Helper function for ReorderBufferProcessTXN for applying sequences. - */ -static inline void -ReorderBufferApplySequence(ReorderBuffer *rb, ReorderBufferTXN *txn, - Relation relation, ReorderBufferChange *change, - bool streaming) -{ - HeapTuple tuple; - Form_pg_sequence_data seq; - - tuple = &change->data.sequence.tuple->tuple; - seq = (Form_pg_sequence_data) GETSTRUCT(tuple); - - /* Only ever called from ReorderBufferApplySequence, so transational. */ - if (streaming) - rb->stream_sequence(rb, txn, change->lsn, relation, true, - seq->last_value, seq->log_cnt, seq->is_called); - else - rb->sequence(rb, txn, change->lsn, relation, true, - seq->last_value, seq->log_cnt, seq->is_called); -} - /* * Function to store the command id and snapshot at the end of the current * stream so that we can reuse the same while sending the next stream. @@ -2706,31 +2399,6 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, case REORDER_BUFFER_CHANGE_INTERNAL_TUPLECID: elog(ERROR, "tuplecid value in changequeue"); break; - - case REORDER_BUFFER_CHANGE_SEQUENCE: - Assert(snapshot_now); - - reloid = RelidByRelfilenode(change->data.sequence.relnode.spcNode, - change->data.sequence.relnode.relNode); - - if (reloid == InvalidOid) - elog(ERROR, "could not map filenode \"%s\" to relation OID", - relpathperm(change->data.sequence.relnode, - MAIN_FORKNUM)); - - relation = RelationIdGetRelation(reloid); - - if (!RelationIsValid(relation)) - elog(ERROR, "could not open relation with OID %u (for filenode \"%s\")", - reloid, - relpathperm(change->data.sequence.relnode, - MAIN_FORKNUM)); - - if (RelationIsLogicallyLogged(relation)) - ReorderBufferApplySequence(rb, txn, relation, change, streaming); - - RelationClose(relation); - break; } } @@ -4115,39 +3783,6 @@ ReorderBufferSerializeChange(ReorderBuffer *rb, ReorderBufferTXN *txn, memcpy(data, change->data.truncate.relids, size); data += size; - break; - } - case REORDER_BUFFER_CHANGE_SEQUENCE: - { - char *data; - ReorderBufferTupleBuf *tup; - Size len = 0; - - tup = change->data.sequence.tuple; - - if (tup) - { - sz += sizeof(HeapTupleData); - len = tup->tuple.t_len; - sz += len; - } - - /* make sure we have enough space */ - ReorderBufferSerializeReserve(rb, sz); - - data = ((char *) rb->outbuf) + sizeof(ReorderBufferDiskChange); - /* might have been reallocated above */ - ondisk = (ReorderBufferDiskChange *) rb->outbuf; - - if (len) - { - memcpy(data, &tup->tuple, sizeof(HeapTupleData)); - data += sizeof(HeapTupleData); - - memcpy(data, tup->tuple.t_data, len); - data += len; - } - break; } case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_CONFIRM: @@ -4412,22 +4047,6 @@ ReorderBufferChangeSize(ReorderBufferChange *change) { sz += sizeof(Oid) * change->data.truncate.nrelids; - break; - } - case REORDER_BUFFER_CHANGE_SEQUENCE: - { - ReorderBufferTupleBuf *tup; - Size len = 0; - - tup = change->data.sequence.tuple; - - if (tup) - { - sz += sizeof(HeapTupleData); - len = tup->tuple.t_len; - sz += len; - } - break; } case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_CONFIRM: @@ -4729,30 +4348,6 @@ ReorderBufferRestoreChange(ReorderBuffer *rb, ReorderBufferTXN *txn, break; } - - case REORDER_BUFFER_CHANGE_SEQUENCE: - if (change->data.sequence.tuple) - { - uint32 tuplelen = ((HeapTuple) data)->t_len; - - change->data.sequence.tuple = - ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader); - - /* restore ->tuple */ - memcpy(&change->data.sequence.tuple->tuple, data, - sizeof(HeapTupleData)); - data += sizeof(HeapTupleData); - - /* reset t_data pointer into the new tuplebuf */ - change->data.sequence.tuple->tuple.t_data = - ReorderBufferTupleBufData(change->data.sequence.tuple); - - /* restore tuple data itself */ - memcpy(change->data.sequence.tuple->tuple.t_data, data, tuplelen); - data += tuplelen; - } - break; - case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_CONFIRM: case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_ABORT: case REORDER_BUFFER_CHANGE_INTERNAL_COMMAND_ID: diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index b2cb31eaad..49ceec3bdc 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -100,7 +100,6 @@ #include "catalog/pg_subscription_rel.h" #include "catalog/pg_type.h" #include "commands/copy.h" -#include "commands/sequence.h" #include "miscadmin.h" #include "parser/parse_relation.h" #include "pgstat.h" @@ -1137,95 +1136,6 @@ copy_table(Relation rel) logicalrep_rel_close(relmapentry, NoLock); } -/* - * Fetch sequence data (current state) from the remote node. - */ -static void -fetch_sequence_data(char *nspname, char *relname, - int64 *last_value, int64 *log_cnt, bool *is_called) -{ - WalRcvExecResult *res; - StringInfoData cmd; - TupleTableSlot *slot; - Oid tableRow[3] = {INT8OID, INT8OID, BOOLOID}; - - initStringInfo(&cmd); - appendStringInfo(&cmd, "SELECT last_value, log_cnt, is_called\n" - " FROM %s", quote_qualified_identifier(nspname, relname)); - - res = walrcv_exec(LogRepWorkerWalRcvConn, cmd.data, 3, tableRow); - pfree(cmd.data); - - if (res->status != WALRCV_OK_TUPLES) - ereport(ERROR, - (errmsg("could not receive list of replicated tables from the publisher: %s", - res->err))); - - /* Process the sequence. */ - slot = MakeSingleTupleTableSlot(res->tupledesc, &TTSOpsMinimalTuple); - while (tuplestore_gettupleslot(res->tuplestore, true, false, slot)) - { - bool isnull; - - *last_value = DatumGetInt64(slot_getattr(slot, 1, &isnull)); - Assert(!isnull); - - *log_cnt = DatumGetInt64(slot_getattr(slot, 2, &isnull)); - Assert(!isnull); - - *is_called = DatumGetBool(slot_getattr(slot, 3, &isnull)); - Assert(!isnull); - - ExecClearTuple(slot); - } - ExecDropSingleTupleTableSlot(slot); - - walrcv_clear_result(res); -} - -/* - * Copy existing data of a sequence from publisher. - * - * Caller is responsible for locking the local relation. - */ -static void -copy_sequence(Relation rel) -{ - LogicalRepRelMapEntry *relmapentry; - LogicalRepRelation lrel; - List *qual = NIL; - StringInfoData cmd; - int64 last_value = 0, - log_cnt = 0; - bool is_called = 0; - - /* Get the publisher relation info. */ - fetch_remote_table_info(get_namespace_name(RelationGetNamespace(rel)), - RelationGetRelationName(rel), &lrel, &qual); - - /* sequences don't have row filters */ - Assert(!qual); - - /* Put the relation into relmap. */ - logicalrep_relmap_update(&lrel); - - /* Map the publisher relation to local one. */ - relmapentry = logicalrep_rel_open(lrel.remoteid, NoLock); - Assert(rel == relmapentry->localrel); - - /* Start copy on the publisher. */ - initStringInfo(&cmd); - - Assert(lrel.relkind == RELKIND_SEQUENCE); - - fetch_sequence_data(lrel.nspname, lrel.relname, &last_value, &log_cnt, &is_called); - - /* tablesync sets the sequences in non-transactional way */ - SetSequence(RelationGetRelid(rel), false, last_value, log_cnt, is_called); - - logicalrep_rel_close(relmapentry, NoLock); -} - /* * Determine the tablesync slot name. * @@ -1487,21 +1397,10 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) originname))); } - /* Do the right action depending on the relation kind. */ - if (get_rel_relkind(RelationGetRelid(rel)) == RELKIND_SEQUENCE) - { - /* Now do the initial sequence copy */ - PushActiveSnapshot(GetTransactionSnapshot()); - copy_sequence(rel); - PopActiveSnapshot(); - } - else - { - /* Now do the initial data copy */ - PushActiveSnapshot(GetTransactionSnapshot()); - copy_table(rel); - PopActiveSnapshot(); - } + /* Now do the initial data copy */ + PushActiveSnapshot(GetTransactionSnapshot()); + copy_table(rel); + PopActiveSnapshot(); res = walrcv_exec(LogRepWorkerWalRcvConn, "COMMIT", 0, NULL); if (res->status != WALRCV_OK_COMMAND) diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 7ade49652e..9181d3e863 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -143,7 +143,6 @@ #include "catalog/pg_subscription.h" #include "catalog/pg_subscription_rel.h" #include "catalog/pg_tablespace.h" -#include "commands/sequence.h" #include "commands/tablecmds.h" #include "commands/tablespace.h" #include "commands/trigger.h" @@ -1144,57 +1143,6 @@ apply_handle_origin(StringInfo s) errmsg_internal("ORIGIN message sent out of order"))); } -/* - * Handle SEQUENCE message. - */ -static void -apply_handle_sequence(StringInfo s) -{ - LogicalRepSequence seq; - Oid relid; - - if (handle_streamed_transaction(LOGICAL_REP_MSG_SEQUENCE, s)) - return; - - logicalrep_read_sequence(s, &seq); - - /* - * Non-transactional sequence updates should not be part of a remote - * transaction. There should not be any running transaction. - */ - Assert((!seq.transactional) || in_remote_transaction); - Assert(!(!seq.transactional && in_remote_transaction)); - Assert(!(!seq.transactional && IsTransactionState())); - - /* - * Make sure we're in a transaction (needed by SetSequence). For - * non-transactional updates we're guaranteed to start a new one, - * and we'll commit it at the end. - */ - if (!IsTransactionState()) - { - StartTransactionCommand(); - maybe_reread_subscription(); - } - - relid = RangeVarGetRelid(makeRangeVar(seq.nspname, - seq.seqname, -1), - RowExclusiveLock, false); - - /* lock the sequence in AccessExclusiveLock, as expected by SetSequence */ - LockRelationOid(relid, AccessExclusiveLock); - - /* apply the sequence change */ - SetSequence(relid, seq.transactional, seq.last_value, seq.log_cnt, seq.is_called); - - /* - * Commit the per-stream transaction (we only do this when not in - * remote transaction, i.e. for non-transactional sequence updates. - */ - if (!in_remote_transaction) - CommitTransactionCommand(); -} - /* * Handle STREAM START message. */ @@ -2563,10 +2511,6 @@ apply_dispatch(StringInfo s) */ break; - case LOGICAL_REP_MSG_SEQUENCE: - apply_handle_sequence(s); - return; - case LOGICAL_REP_MSG_STREAM_START: apply_handle_stream_start(s); break; diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 9d33630464..fe5accca57 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -15,7 +15,6 @@ #include "access/tupconvert.h" #include "catalog/partition.h" #include "catalog/pg_publication.h" -#include "catalog/pg_publication_namespace.h" #include "catalog/pg_publication_rel.h" #include "commands/defrem.h" #include "executor/executor.h" @@ -55,10 +54,6 @@ static void pgoutput_message(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr message_lsn, bool transactional, const char *prefix, Size sz, const char *message); -static void pgoutput_sequence(LogicalDecodingContext *ctx, - ReorderBufferTXN *txn, XLogRecPtr sequence_lsn, - Relation relation, bool transactional, - int64 last_value, int64 log_cnt, bool is_called); static bool pgoutput_origin_filter(LogicalDecodingContext *ctx, RepOriginId origin_id); static void pgoutput_begin_prepare_txn(LogicalDecodingContext *ctx, @@ -260,7 +255,6 @@ _PG_output_plugin_init(OutputPluginCallbacks *cb) cb->change_cb = pgoutput_change; cb->truncate_cb = pgoutput_truncate; cb->message_cb = pgoutput_message; - cb->sequence_cb = pgoutput_sequence; cb->commit_cb = pgoutput_commit_txn; cb->begin_prepare_cb = pgoutput_begin_prepare_txn; @@ -277,7 +271,6 @@ _PG_output_plugin_init(OutputPluginCallbacks *cb) cb->stream_commit_cb = pgoutput_stream_commit; cb->stream_change_cb = pgoutput_change; cb->stream_message_cb = pgoutput_message; - cb->stream_sequence_cb = pgoutput_sequence; cb->stream_truncate_cb = pgoutput_truncate; /* transaction streaming - two-phase commit */ cb->stream_prepare_cb = pgoutput_stream_prepare_txn; @@ -291,7 +284,6 @@ parse_output_parameters(List *options, PGOutputData *data) bool publication_names_given = false; bool binary_option_given = false; bool messages_option_given = false; - bool sequences_option_given = false; bool streaming_given = false; bool two_phase_option_given = false; @@ -299,7 +291,6 @@ parse_output_parameters(List *options, PGOutputData *data) data->streaming = false; data->messages = false; data->two_phase = false; - data->sequences = true; foreach(lc, options) { @@ -368,16 +359,6 @@ parse_output_parameters(List *options, PGOutputData *data) data->messages = defGetBoolean(defel); } - else if (strcmp(defel->defname, "sequences") == 0) - { - if (sequences_option_given) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); - sequences_option_given = true; - - data->sequences = defGetBoolean(defel); - } else if (strcmp(defel->defname, "streaming") == 0) { if (streaming_given) @@ -1709,64 +1690,6 @@ pgoutput_message(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, OutputPluginWrite(ctx, true); } -static void -pgoutput_sequence(LogicalDecodingContext *ctx, - ReorderBufferTXN *txn, XLogRecPtr sequence_lsn, - Relation relation, bool transactional, - int64 last_value, int64 log_cnt, bool is_called) -{ - PGOutputData *data = (PGOutputData *) ctx->output_plugin_private; - TransactionId xid = InvalidTransactionId; - RelationSyncEntry *relentry; - - if (!data->sequences) - return; - - if (!is_publishable_relation(relation)) - return; - - /* - * Remember the xid for the message in streaming mode. See - * pgoutput_change. - */ - if (in_streaming) - xid = txn->xid; - - relentry = get_rel_sync_entry(data, relation); - - /* - * First check the sequence filter. - * - * We handle just REORDER_BUFFER_CHANGE_SEQUENCE here. - */ - if (!relentry->pubactions.pubsequence) - return; - - /* - * Output BEGIN if we haven't yet. Avoid for non-transactional - * sequence changes. - */ - if (transactional) - { - PGOutputTxnData *txndata = (PGOutputTxnData *) txn->output_plugin_private; - - /* Send BEGIN if we haven't yet */ - if (txndata && !txndata->sent_begin_txn) - pgoutput_send_begin(ctx, txn); - } - - OutputPluginPrepareWrite(ctx, true); - logicalrep_write_sequence(ctx->out, - relation, - xid, - sequence_lsn, - transactional, - last_value, - log_cnt, - is_called); - OutputPluginWrite(ctx, true); -} - /* * Currently we always forward. */ @@ -2052,8 +1975,7 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) entry->schema_sent = false; entry->streamed_txns = NIL; entry->pubactions.pubinsert = entry->pubactions.pubupdate = - entry->pubactions.pubdelete = entry->pubactions.pubtruncate = - entry->pubactions.pubsequence = false; + entry->pubactions.pubdelete = entry->pubactions.pubtruncate = false; entry->new_slot = NULL; entry->old_slot = NULL; memset(entry->exprstate, 0, sizeof(entry->exprstate)); @@ -2068,18 +1990,18 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) { Oid schemaId = get_rel_namespace(relid); List *pubids = GetRelationPublications(relid); - char relkind = get_rel_relkind(relid); - char objectType = pub_get_object_type_for_relkind(relkind); + /* * We don't acquire a lock on the namespace system table as we build * the cache entry using a historic snapshot and all the later changes * are absorbed while decoding WAL. */ - List *schemaPubids = GetSchemaPublications(schemaId, objectType); + List *schemaPubids = GetSchemaPublications(schemaId); ListCell *lc; Oid publish_as_relid = relid; int publish_ancestor_level = 0; bool am_partition = get_rel_relispartition(relid); + char relkind = get_rel_relkind(relid); List *rel_publications = NIL; /* Reload publications if needed before use. */ @@ -2111,7 +2033,6 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) entry->pubactions.pubupdate = false; entry->pubactions.pubdelete = false; entry->pubactions.pubtruncate = false; - entry->pubactions.pubsequence = false; /* * Tuple slots cleanups. (Will be rebuilt later if needed). @@ -2159,11 +2080,9 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) /* * If this is a FOR ALL TABLES publication, pick the partition root - * and set the ancestor level accordingly. If this is a FOR ALL - * SEQUENCES publication, we publish it too but we don't need to - * pick the partition root etc. + * and set the ancestor level accordingly. */ - if (pub->alltables || pub->allsequences) + if (pub->alltables) { publish = true; if (pub->pubviaroot && am_partition) @@ -2227,7 +2146,6 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) entry->pubactions.pubupdate |= pub->pubactions.pubupdate; entry->pubactions.pubdelete |= pub->pubactions.pubdelete; entry->pubactions.pubtruncate |= pub->pubactions.pubtruncate; - entry->pubactions.pubsequence |= pub->pubactions.pubsequence; /* * We want to publish the changes as the top-most ancestor diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 1f29670a13..43f14c233d 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -56,7 +56,6 @@ #include "catalog/pg_opclass.h" #include "catalog/pg_proc.h" #include "catalog/pg_publication.h" -#include "catalog/pg_publication_namespace.h" #include "catalog/pg_rewrite.h" #include "catalog/pg_shseclabel.h" #include "catalog/pg_statistic_ext.h" @@ -5568,8 +5567,6 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) Oid schemaid; List *ancestors = NIL; Oid relid = RelationGetRelid(relation); - char relkind = relation->rd_rel->relkind; - char objType; /* * If not publishable, it publishes no actions. (pgoutput_change() will @@ -5600,15 +5597,8 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) /* Fetch the publication membership info. */ puboids = GetRelationPublications(relid); schemaid = RelationGetNamespace(relation); - objType = pub_get_object_type_for_relkind(relkind); + puboids = list_concat_unique_oid(puboids, GetSchemaPublications(schemaid)); - puboids = list_concat_unique_oid(puboids, - GetSchemaPublications(schemaid, objType)); - - /* - * If this is a partion (and thus a table), lookup all ancestors and track - * all publications them too. - */ if (relation->rd_rel->relispartition) { /* Add publications that the ancestors are in too. */ @@ -5620,23 +5610,12 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) puboids = list_concat_unique_oid(puboids, GetRelationPublications(ancestor)); - - /* include all publications publishing schema of all ancestors */ schemaid = get_rel_namespace(ancestor); puboids = list_concat_unique_oid(puboids, - GetSchemaPublications(schemaid, - PUB_OBJTYPE_TABLE)); + GetSchemaPublications(schemaid)); } } - - /* - * Consider also FOR ALL TABLES and FOR ALL SEQUENCES publications, - * depending on the relkind of the relation. - */ - if (relation->rd_rel->relkind == RELKIND_SEQUENCE) - puboids = list_concat_unique_oid(puboids, GetAllSequencesPublications()); - else - puboids = list_concat_unique_oid(puboids, GetAllTablesPublications()); + puboids = list_concat_unique_oid(puboids, GetAllTablesPublications()); foreach(lc, puboids) { @@ -5655,7 +5634,6 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) pubdesc->pubactions.pubupdate |= pubform->pubupdate; pubdesc->pubactions.pubdelete |= pubform->pubdelete; pubdesc->pubactions.pubtruncate |= pubform->pubtruncate; - pubdesc->pubactions.pubsequence |= pubform->pubsequence; /* * Check if all columns referenced in the filter expression are part of diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c index 8d265f2d23..1912b12146 100644 --- a/src/backend/utils/cache/syscache.c +++ b/src/backend/utils/cache/syscache.c @@ -653,12 +653,12 @@ static const struct cachedesc cacheinfo[] = { 64 }, {PublicationNamespaceRelationId, /* PUBLICATIONNAMESPACEMAP */ - PublicationNamespacePnnspidPnpubidPntypeIndexId, - 3, + PublicationNamespacePnnspidPnpubidIndexId, + 2, { Anum_pg_publication_namespace_pnnspid, Anum_pg_publication_namespace_pnpubid, - Anum_pg_publication_namespace_pntype, + 0, 0 }, 64 diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 3c2201a725..196f6d23a3 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -3814,12 +3814,10 @@ getPublications(Archive *fout, int *numPublications) int i_pubname; int i_pubowner; int i_puballtables; - int i_puballsequences; int i_pubinsert; int i_pubupdate; int i_pubdelete; int i_pubtruncate; - int i_pubsequence; int i_pubviaroot; int i, ntups; @@ -3835,29 +3833,23 @@ getPublications(Archive *fout, int *numPublications) resetPQExpBuffer(query); /* Get the publications. */ - if (fout->remoteVersion >= 150000) - appendPQExpBuffer(query, - "SELECT p.tableoid, p.oid, p.pubname, " - "p.pubowner, " - "p.puballtables, p.puballsequences, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, p.pubsequence, p.pubviaroot " - "FROM pg_publication p"); - else if (fout->remoteVersion >= 130000) + if (fout->remoteVersion >= 130000) appendPQExpBuffer(query, "SELECT p.tableoid, p.oid, p.pubname, " "p.pubowner, " - "p.puballtables, false AS puballsequences, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, false AS pubsequence, p.pubviaroot " + "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, p.pubviaroot " "FROM pg_publication p"); else if (fout->remoteVersion >= 110000) appendPQExpBuffer(query, "SELECT p.tableoid, p.oid, p.pubname, " "p.pubowner, " - "p.puballtables, false AS puballsequences, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, false AS pubsequence, false AS pubviaroot " + "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, false AS pubviaroot " "FROM pg_publication p"); else appendPQExpBuffer(query, "SELECT p.tableoid, p.oid, p.pubname, " "p.pubowner, " - "p.puballtables, false AS puballsequences, p.pubinsert, p.pubupdate, p.pubdelete, false AS pubtruncate, false AS pubsequence, false AS pubviaroot " + "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, false AS pubtruncate, false AS pubviaroot " "FROM pg_publication p"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -3869,12 +3861,10 @@ getPublications(Archive *fout, int *numPublications) i_pubname = PQfnumber(res, "pubname"); i_pubowner = PQfnumber(res, "pubowner"); i_puballtables = PQfnumber(res, "puballtables"); - i_puballsequences = PQfnumber(res, "puballsequences"); i_pubinsert = PQfnumber(res, "pubinsert"); i_pubupdate = PQfnumber(res, "pubupdate"); i_pubdelete = PQfnumber(res, "pubdelete"); i_pubtruncate = PQfnumber(res, "pubtruncate"); - i_pubsequence = PQfnumber(res, "pubsequence"); i_pubviaroot = PQfnumber(res, "pubviaroot"); pubinfo = pg_malloc(ntups * sizeof(PublicationInfo)); @@ -3890,8 +3880,6 @@ getPublications(Archive *fout, int *numPublications) pubinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_pubowner)); pubinfo[i].puballtables = (strcmp(PQgetvalue(res, i, i_puballtables), "t") == 0); - pubinfo[i].puballsequences = - (strcmp(PQgetvalue(res, i, i_puballsequences), "t") == 0); pubinfo[i].pubinsert = (strcmp(PQgetvalue(res, i, i_pubinsert), "t") == 0); pubinfo[i].pubupdate = @@ -3900,8 +3888,6 @@ getPublications(Archive *fout, int *numPublications) (strcmp(PQgetvalue(res, i, i_pubdelete), "t") == 0); pubinfo[i].pubtruncate = (strcmp(PQgetvalue(res, i, i_pubtruncate), "t") == 0); - pubinfo[i].pubsequence = - (strcmp(PQgetvalue(res, i, i_pubsequence), "t") == 0); pubinfo[i].pubviaroot = (strcmp(PQgetvalue(res, i, i_pubviaroot), "t") == 0); @@ -3947,9 +3933,6 @@ dumpPublication(Archive *fout, const PublicationInfo *pubinfo) if (pubinfo->puballtables) appendPQExpBufferStr(query, " FOR ALL TABLES"); - if (pubinfo->puballsequences) - appendPQExpBufferStr(query, " FOR ALL SEQUENCES"); - appendPQExpBufferStr(query, " WITH (publish = '"); if (pubinfo->pubinsert) { @@ -3984,15 +3967,6 @@ dumpPublication(Archive *fout, const PublicationInfo *pubinfo) first = false; } - if (pubinfo->pubsequence) - { - if (!first) - appendPQExpBufferStr(query, ", "); - - appendPQExpBufferStr(query, "sequence"); - first = false; - } - appendPQExpBufferStr(query, "'"); if (pubinfo->pubviaroot) @@ -4039,7 +4013,6 @@ getPublicationNamespaces(Archive *fout) int i_oid; int i_pnpubid; int i_pnnspid; - int i_pntype; int i, j, ntups; @@ -4051,7 +4024,7 @@ getPublicationNamespaces(Archive *fout) /* Collect all publication membership info. */ appendPQExpBufferStr(query, - "SELECT tableoid, oid, pnpubid, pnnspid, pntype " + "SELECT tableoid, oid, pnpubid, pnnspid " "FROM pg_catalog.pg_publication_namespace"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -4061,7 +4034,6 @@ getPublicationNamespaces(Archive *fout) i_oid = PQfnumber(res, "oid"); i_pnpubid = PQfnumber(res, "pnpubid"); i_pnnspid = PQfnumber(res, "pnnspid"); - i_pntype = PQfnumber(res, "pntype"); /* this allocation may be more than we need */ pubsinfo = pg_malloc(ntups * sizeof(PublicationSchemaInfo)); @@ -4071,7 +4043,6 @@ getPublicationNamespaces(Archive *fout) { Oid pnpubid = atooid(PQgetvalue(res, i, i_pnpubid)); Oid pnnspid = atooid(PQgetvalue(res, i, i_pnnspid)); - char pntype = PQgetvalue(res, i, i_pntype)[0]; PublicationInfo *pubinfo; NamespaceInfo *nspinfo; @@ -4103,7 +4074,6 @@ getPublicationNamespaces(Archive *fout) pubsinfo[j].dobj.name = nspinfo->dobj.name; pubsinfo[j].publication = pubinfo; pubsinfo[j].pubschema = nspinfo; - pubsinfo[j].pubtype = pntype; /* Decide whether we want to dump it */ selectDumpablePublicationObject(&(pubsinfo[j].dobj), fout); @@ -4269,11 +4239,7 @@ dumpPublicationNamespace(Archive *fout, const PublicationSchemaInfo *pubsinfo) query = createPQExpBuffer(); appendPQExpBuffer(query, "ALTER PUBLICATION %s ", fmtId(pubinfo->dobj.name)); - - if (pubsinfo->pubtype == 't') - appendPQExpBuffer(query, "ADD ALL TABLES IN SCHEMA %s;\n", fmtId(schemainfo->dobj.name)); - else - appendPQExpBuffer(query, "ADD ALL SEQUENCES IN SCHEMA %s;\n", fmtId(schemainfo->dobj.name)); + appendPQExpBuffer(query, "ADD ALL TABLES IN SCHEMA %s;\n", fmtId(schemainfo->dobj.name)); /* * There is no point in creating drop query as the drop is done by schema @@ -4306,7 +4272,6 @@ dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo) TableInfo *tbinfo = pubrinfo->pubtable; PQExpBuffer query; char *tag; - char *description; /* Do nothing in data-only dump */ if (dopt->dataOnly) @@ -4316,19 +4281,8 @@ dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo) query = createPQExpBuffer(); - if (tbinfo->relkind == RELKIND_SEQUENCE) - { - appendPQExpBuffer(query, "ALTER PUBLICATION %s ADD SEQUENCE", - fmtId(pubinfo->dobj.name)); - description = "PUBLICATION SEQUENCE"; - } - else - { - appendPQExpBuffer(query, "ALTER PUBLICATION %s ADD TABLE ONLY", - fmtId(pubinfo->dobj.name)); - description = "PUBLICATION TABLE"; - } - + appendPQExpBuffer(query, "ALTER PUBLICATION %s ADD TABLE ONLY", + fmtId(pubinfo->dobj.name)); appendPQExpBuffer(query, " %s", fmtQualifiedDumpable(tbinfo)); @@ -4357,7 +4311,7 @@ dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo) ARCHIVE_OPTS(.tag = tag, .namespace = tbinfo->dobj.namespace->dobj.name, .owner = pubinfo->rolname, - .description = description, + .description = "PUBLICATION TABLE", .section = SECTION_POST_DATA, .createStmt = query->data)); diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 688093c55e..1d21c2906f 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -615,12 +615,10 @@ typedef struct _PublicationInfo DumpableObject dobj; const char *rolname; bool puballtables; - bool puballsequences; bool pubinsert; bool pubupdate; bool pubdelete; bool pubtruncate; - bool pubsequence; bool pubviaroot; } PublicationInfo; @@ -646,7 +644,6 @@ typedef struct _PublicationSchemaInfo DumpableObject dobj; PublicationInfo *publication; NamespaceInfo *pubschema; - char pubtype; } PublicationSchemaInfo; /* diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index 75b754a420..c65c92bfb0 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -2420,7 +2420,7 @@ create_order => 50, create_sql => 'CREATE PUBLICATION pub1;', regexp => qr/^ - \QCREATE PUBLICATION pub1 WITH (publish = 'insert, update, delete, truncate, sequence');\E + \QCREATE PUBLICATION pub1 WITH (publish = 'insert, update, delete, truncate');\E /xm, like => { %full_runs, section_post_data => 1, }, }, @@ -2440,27 +2440,16 @@ create_order => 50, create_sql => 'CREATE PUBLICATION pub3;', regexp => qr/^ - \QCREATE PUBLICATION pub3 WITH (publish = 'insert, update, delete, truncate, sequence');\E + \QCREATE PUBLICATION pub3 WITH (publish = 'insert, update, delete, truncate');\E /xm, like => { %full_runs, section_post_data => 1, }, }, 'CREATE PUBLICATION pub4' => { create_order => 50, - create_sql => 'CREATE PUBLICATION pub4 - FOR ALL SEQUENCES - WITH (publish = \'\');', + create_sql => 'CREATE PUBLICATION pub4;', regexp => qr/^ - \QCREATE PUBLICATION pub4 FOR ALL SEQUENCES WITH (publish = '');\E - /xm, - like => { %full_runs, section_post_data => 1, }, - }, - - 'CREATE PUBLICATION pub5' => { - create_order => 50, - create_sql => 'CREATE PUBLICATION pub5;', - regexp => qr/^ - \QCREATE PUBLICATION pub5 WITH (publish = 'insert, update, delete, truncate, sequence');\E + \QCREATE PUBLICATION pub4 WITH (publish = 'insert, update, delete, truncate');\E /xm, like => { %full_runs, section_post_data => 1, }, }, @@ -2569,27 +2558,6 @@ unlike => { exclude_dump_test_schema => 1, }, }, - 'ALTER PUBLICATION pub3 ADD ALL SEQUENCES IN SCHEMA dump_test' => { - create_order => 51, - create_sql => - 'ALTER PUBLICATION pub3 ADD ALL SEQUENCES IN SCHEMA dump_test;', - regexp => qr/^ - \QALTER PUBLICATION pub3 ADD ALL SEQUENCES IN SCHEMA dump_test;\E - /xm, - like => { %full_runs, section_post_data => 1, }, - unlike => { exclude_dump_test_schema => 1, }, - }, - - 'ALTER PUBLICATION pub3 ADD ALL SEQUENCES IN SCHEMA public' => { - create_order => 52, - create_sql => - 'ALTER PUBLICATION pub3 ADD ALL SEQUENCES IN SCHEMA public;', - regexp => qr/^ - \QALTER PUBLICATION pub3 ADD ALL SEQUENCES IN SCHEMA public;\E - /xm, - like => { %full_runs, section_post_data => 1, }, - }, - 'CREATE SCHEMA public' => { regexp => qr/^CREATE SCHEMA public;/m, diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 73bbbe2eb4..3f1b3802c2 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -1633,19 +1633,28 @@ describeOneTableDetails(const char *schemaname, if (tableinfo.relkind == RELKIND_SEQUENCE) { PGresult *result = NULL; + printQueryOpt myopt = pset.popt; + char *footers[2] = {NULL, NULL}; if (pset.sversion >= 100000) { printfPQExpBuffer(&buf, - "SELECT pg_catalog.format_type(seqtypid, NULL),\n" - " seqstart,\n" - " seqmin,\n" - " seqmax,\n" - " seqincrement,\n" - " CASE WHEN seqcycle THEN '%s' ELSE '%s' END,\n" - " seqcache\n", + "SELECT pg_catalog.format_type(seqtypid, NULL) AS \"%s\",\n" + " seqstart AS \"%s\",\n" + " seqmin AS \"%s\",\n" + " seqmax AS \"%s\",\n" + " seqincrement AS \"%s\",\n" + " CASE WHEN seqcycle THEN '%s' ELSE '%s' END AS \"%s\",\n" + " seqcache AS \"%s\"\n", + gettext_noop("Type"), + gettext_noop("Start"), + gettext_noop("Minimum"), + gettext_noop("Maximum"), + gettext_noop("Increment"), gettext_noop("yes"), - gettext_noop("no")); + gettext_noop("no"), + gettext_noop("Cycles?"), + gettext_noop("Cache")); appendPQExpBuffer(&buf, "FROM pg_catalog.pg_sequence\n" "WHERE seqrelid = '%s';", @@ -1654,15 +1663,22 @@ describeOneTableDetails(const char *schemaname, else { printfPQExpBuffer(&buf, - "SELECT 'bigint',\n" - " start_value,\n" - " min_value,\n" - " max_value,\n" - " increment_by,\n" - " CASE WHEN is_cycled THEN '%s' ELSE '%s' END,\n" - " cache_value\n", + "SELECT 'bigint' AS \"%s\",\n" + " start_value AS \"%s\",\n" + " min_value AS \"%s\",\n" + " max_value AS \"%s\",\n" + " increment_by AS \"%s\",\n" + " CASE WHEN is_cycled THEN '%s' ELSE '%s' END AS \"%s\",\n" + " cache_value AS \"%s\"\n", + gettext_noop("Type"), + gettext_noop("Start"), + gettext_noop("Minimum"), + gettext_noop("Maximum"), + gettext_noop("Increment"), gettext_noop("yes"), - gettext_noop("no")); + gettext_noop("no"), + gettext_noop("Cycles?"), + gettext_noop("Cache")); appendPQExpBuffer(&buf, "FROM %s", fmtId(schemaname)); /* must be separate because fmtId isn't reentrant */ appendPQExpBuffer(&buf, ".%s;", fmtId(relationname)); @@ -1672,57 +1688,6 @@ describeOneTableDetails(const char *schemaname, if (!res) goto error_return; - numrows = PQntuples(res); - - /* XXX reset to use expanded output for sequences (maybe we should - * keep this disabled, just like for tables?) */ - myopt.expanded = pset.popt.topt.expanded; - - printTableInit(&cont, &myopt, title.data, 7, numrows); - printTableInitialized = true; - - if (tableinfo.relpersistence == 'u') - printfPQExpBuffer(&title, _("Unlogged sequence \"%s.%s\""), - schemaname, relationname); - else - printfPQExpBuffer(&title, _("Sequence \"%s.%s\""), - schemaname, relationname); - - printTableAddHeader(&cont, gettext_noop("Type"), true, 'l'); - printTableAddHeader(&cont, gettext_noop("Start"), true, 'r'); - printTableAddHeader(&cont, gettext_noop("Minimum"), true, 'r'); - printTableAddHeader(&cont, gettext_noop("Maximum"), true, 'r'); - printTableAddHeader(&cont, gettext_noop("Increment"), true, 'r'); - printTableAddHeader(&cont, gettext_noop("Cycles?"), true, 'l'); - printTableAddHeader(&cont, gettext_noop("Cache"), true, 'r'); - - /* Generate table cells to be printed */ - for (i = 0; i < numrows; i++) - { - /* Type */ - printTableAddCell(&cont, PQgetvalue(res, i, 0), false, false); - - /* Start */ - printTableAddCell(&cont, PQgetvalue(res, i, 1), false, false); - - /* Minimum */ - printTableAddCell(&cont, PQgetvalue(res, i, 2), false, false); - - /* Maximum */ - printTableAddCell(&cont, PQgetvalue(res, i, 3), false, false); - - /* Increment */ - printTableAddCell(&cont, PQgetvalue(res, i, 4), false, false); - - /* Cycles? */ - printTableAddCell(&cont, PQgetvalue(res, i, 5), false, false); - - /* Cache */ - printTableAddCell(&cont, PQgetvalue(res, i, 6), false, false); - } - - /* Footer information about a sequence */ - /* Get the column that owns this sequence */ printfPQExpBuffer(&buf, "SELECT pg_catalog.quote_ident(nspname) || '.' ||" "\n pg_catalog.quote_ident(relname) || '.' ||" @@ -1754,63 +1719,33 @@ describeOneTableDetails(const char *schemaname, switch (PQgetvalue(result, 0, 1)[0]) { case 'a': - printTableAddFooter(&cont, - psprintf(_("Owned by: %s"), - PQgetvalue(result, 0, 0))); + footers[0] = psprintf(_("Owned by: %s"), + PQgetvalue(result, 0, 0)); break; case 'i': - printTableAddFooter(&cont, - psprintf(_("Sequence for identity column: %s"), - PQgetvalue(result, 0, 0))); + footers[0] = psprintf(_("Sequence for identity column: %s"), + PQgetvalue(result, 0, 0)); break; } } PQclear(result); - /* print any publications */ - if (pset.sversion >= 150000) - { - int tuples = 0; - - printfPQExpBuffer(&buf, - "SELECT pubname\n" - "FROM pg_catalog.pg_publication p\n" - " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" - " JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid\n" - "WHERE pc.oid ='%s' and pn.pntype = 's' and pg_catalog.pg_relation_is_publishable('%s')\n" - "UNION\n" - "SELECT pubname\n" - "FROM pg_catalog.pg_publication p\n" - " JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n" - "WHERE pr.prrelid = '%s'\n" - "UNION\n" - "SELECT pubname\n" - "FROM pg_catalog.pg_publication p\n" - "WHERE p.puballsequences AND pg_catalog.pg_relation_is_publishable('%s')\n" - "ORDER BY 1;", - oid, oid, oid, oid); - - result = PSQLexec(buf.data); - if (!result) - goto error_return; - else - tuples = PQntuples(result); - - if (tuples > 0) - printTableAddFooter(&cont, _("Publications:")); + if (tableinfo.relpersistence == 'u') + printfPQExpBuffer(&title, _("Unlogged sequence \"%s.%s\""), + schemaname, relationname); + else + printfPQExpBuffer(&title, _("Sequence \"%s.%s\""), + schemaname, relationname); - /* Might be an empty set - that's ok */ - for (i = 0; i < tuples; i++) - { - printfPQExpBuffer(&buf, " \"%s\"", - PQgetvalue(result, i, 0)); + myopt.footers = footers; + myopt.topt.default_footer = false; + myopt.title = title.data; + myopt.translate_header = true; - printTableAddFooter(&cont, buf.data); - } - PQclear(result); - } + printQuery(res, &myopt, pset.queryFout, false, pset.logfile); - printTable(&cont, pset.queryFout, false, pset.logfile); + if (footers[0]) + free(footers[0]); retval = true; goto error_return; /* not an error, just return early */ @@ -2037,11 +1972,6 @@ describeOneTableDetails(const char *schemaname, for (i = 0; i < cols; i++) printTableAddHeader(&cont, headers[i], true, 'l'); - res = PSQLexec(buf.data); - if (!res) - goto error_return; - numrows = PQntuples(res); - /* Generate table cells to be printed */ for (i = 0; i < numrows; i++) { @@ -2968,7 +2898,7 @@ describeOneTableDetails(const char *schemaname, "FROM pg_catalog.pg_publication p\n" " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" " JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid\n" - "WHERE pc.oid ='%s' and pn.pntype = 't' and pg_catalog.pg_relation_is_publishable('%s')\n" + "WHERE pc.oid ='%s' and pg_catalog.pg_relation_is_publishable('%s')\n" "UNION\n" "SELECT pubname\n" " , pg_get_expr(pr.prqual, c.oid)\n" @@ -4872,7 +4802,7 @@ listSchemas(const char *pattern, bool verbose, bool showSystem) int i; printfPQExpBuffer(&buf, - "SELECT pubname, (CASE WHEN pntype = 't' THEN 'tables' ELSE 'sequences' END) AS pubtype\n" + "SELECT pubname \n" "FROM pg_catalog.pg_publication p\n" " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" " JOIN pg_catalog.pg_namespace n ON n.oid = pn.pnnspid \n" @@ -4901,9 +4831,8 @@ listSchemas(const char *pattern, bool verbose, bool showSystem) /* Might be an empty set - that's ok */ for (i = 0; i < pub_schema_tuples; i++) { - printfPQExpBuffer(&buf, " \"%s\" (%s)", - PQgetvalue(result, i, 0), - PQgetvalue(result, i, 1)); + printfPQExpBuffer(&buf, " \"%s\"", + PQgetvalue(result, i, 0)); footers[i + 1] = pg_strdup(buf.data); } @@ -5908,7 +5837,7 @@ listPublications(const char *pattern) PQExpBufferData buf; PGresult *res; printQueryOpt myopt = pset.popt; - static const bool translate_columns[] = {false, false, false, false, false, false, false, false, false, false}; + static const bool translate_columns[] = {false, false, false, false, false, false, false, false}; if (pset.sversion < 100000) { @@ -5922,45 +5851,23 @@ listPublications(const char *pattern) initPQExpBuffer(&buf); - if (pset.sversion >= 150000) - printfPQExpBuffer(&buf, - "SELECT pubname AS \"%s\",\n" - " pg_catalog.pg_get_userbyid(pubowner) AS \"%s\",\n" - " puballtables AS \"%s\",\n" - " puballsequences AS \"%s\",\n" - " pubinsert AS \"%s\",\n" - " pubupdate AS \"%s\",\n" - " pubdelete AS \"%s\"", - gettext_noop("Name"), - gettext_noop("Owner"), - gettext_noop("All tables"), - gettext_noop("All sequences"), - gettext_noop("Inserts"), - gettext_noop("Updates"), - gettext_noop("Deletes")); - else - printfPQExpBuffer(&buf, - "SELECT pubname AS \"%s\",\n" - " pg_catalog.pg_get_userbyid(pubowner) AS \"%s\",\n" - " puballtables AS \"%s\",\n" - " pubinsert AS \"%s\",\n" - " pubupdate AS \"%s\",\n" - " pubdelete AS \"%s\"", - gettext_noop("Name"), - gettext_noop("Owner"), - gettext_noop("All tables"), - gettext_noop("Inserts"), - gettext_noop("Updates"), - gettext_noop("Deletes")); - + printfPQExpBuffer(&buf, + "SELECT pubname AS \"%s\",\n" + " pg_catalog.pg_get_userbyid(pubowner) AS \"%s\",\n" + " puballtables AS \"%s\",\n" + " pubinsert AS \"%s\",\n" + " pubupdate AS \"%s\",\n" + " pubdelete AS \"%s\"", + gettext_noop("Name"), + gettext_noop("Owner"), + gettext_noop("All tables"), + gettext_noop("Inserts"), + gettext_noop("Updates"), + gettext_noop("Deletes")); if (pset.sversion >= 110000) appendPQExpBuffer(&buf, ",\n pubtruncate AS \"%s\"", gettext_noop("Truncates")); - if (pset.sversion >= 150000) - appendPQExpBuffer(&buf, - ",\n pubsequence AS \"%s\"", - gettext_noop("Sequences")); if (pset.sversion >= 130000) appendPQExpBuffer(&buf, ",\n pubviaroot AS \"%s\"", @@ -6050,7 +5957,6 @@ describePublications(const char *pattern) PGresult *res; bool has_pubtruncate; bool has_pubviaroot; - bool has_pubsequence; PQExpBufferData title; printTableContent cont; @@ -6067,7 +5973,6 @@ describePublications(const char *pattern) has_pubtruncate = (pset.sversion >= 110000); has_pubviaroot = (pset.sversion >= 130000); - has_pubsequence = (pset.sversion >= 150000); initPQExpBuffer(&buf); @@ -6075,17 +5980,12 @@ describePublications(const char *pattern) "SELECT oid, pubname,\n" " pg_catalog.pg_get_userbyid(pubowner) AS owner,\n" " puballtables, pubinsert, pubupdate, pubdelete"); - if (has_pubtruncate) appendPQExpBufferStr(&buf, ", pubtruncate"); if (has_pubviaroot) appendPQExpBufferStr(&buf, ", pubviaroot"); - if (has_pubsequence) - appendPQExpBufferStr(&buf, - ", puballsequences, pubsequence"); - appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_publication\n"); @@ -6126,7 +6026,6 @@ describePublications(const char *pattern) char *pubid = PQgetvalue(res, i, 0); char *pubname = PQgetvalue(res, i, 1); bool puballtables = strcmp(PQgetvalue(res, i, 3), "t") == 0; - bool puballsequences = strcmp(PQgetvalue(res, i, 9), "t") == 0; printTableOpt myopt = pset.popt.topt; if (has_pubtruncate) @@ -6134,43 +6033,29 @@ describePublications(const char *pattern) if (has_pubviaroot) ncols++; - /* sequences have two extra columns (puballsequences, pubsequences) */ - if (has_pubsequence) - ncols += 2; - initPQExpBuffer(&title); printfPQExpBuffer(&title, _("Publication %s"), pubname); printTableInit(&cont, &myopt, title.data, ncols, nrows); printTableAddHeader(&cont, gettext_noop("Owner"), true, align); printTableAddHeader(&cont, gettext_noop("All tables"), true, align); - if (has_pubsequence) - printTableAddHeader(&cont, gettext_noop("All sequences"), true, align); printTableAddHeader(&cont, gettext_noop("Inserts"), true, align); printTableAddHeader(&cont, gettext_noop("Updates"), true, align); printTableAddHeader(&cont, gettext_noop("Deletes"), true, align); if (has_pubtruncate) printTableAddHeader(&cont, gettext_noop("Truncates"), true, align); - if (has_pubsequence) - printTableAddHeader(&cont, gettext_noop("Sequences"), true, align); if (has_pubviaroot) printTableAddHeader(&cont, gettext_noop("Via root"), true, align); - printTableAddCell(&cont, PQgetvalue(res, i, 2), false, false); /* owner */ - printTableAddCell(&cont, PQgetvalue(res, i, 3), false, false); /* all tables */ - - if (has_pubsequence) - printTableAddCell(&cont, PQgetvalue(res, i, 9), false, false); /* all sequences */ - - printTableAddCell(&cont, PQgetvalue(res, i, 4), false, false); /* insert */ - printTableAddCell(&cont, PQgetvalue(res, i, 5), false, false); /* update */ - printTableAddCell(&cont, PQgetvalue(res, i, 6), false, false); /* delete */ + printTableAddCell(&cont, PQgetvalue(res, i, 2), false, false); + printTableAddCell(&cont, PQgetvalue(res, i, 3), false, false); + printTableAddCell(&cont, PQgetvalue(res, i, 4), false, false); + printTableAddCell(&cont, PQgetvalue(res, i, 5), false, false); + printTableAddCell(&cont, PQgetvalue(res, i, 6), false, false); if (has_pubtruncate) - printTableAddCell(&cont, PQgetvalue(res, i, 7), false, false); /* truncate */ - if (has_pubsequence) - printTableAddCell(&cont, PQgetvalue(res, i, 10), false, false); /* sequence */ + printTableAddCell(&cont, PQgetvalue(res, i, 7), false, false); if (has_pubviaroot) - printTableAddCell(&cont, PQgetvalue(res, i, 8), false, false); /* via root */ + printTableAddCell(&cont, PQgetvalue(res, i, 8), false, false); if (!puballtables) { @@ -6201,7 +6086,6 @@ describePublications(const char *pattern) "WHERE c.relnamespace = n.oid\n" " AND c.oid = pr.prrelid\n" " AND pr.prpubid = '%s'\n" - " AND c.relkind != 'S'\n" /* exclude sequences */ "ORDER BY 1,2", pubid); if (!addFooterToPublicationDesc(&buf, "Tables:", false, &cont)) goto error_return; @@ -6213,7 +6097,7 @@ describePublications(const char *pattern) "SELECT n.nspname\n" "FROM pg_catalog.pg_namespace n\n" " JOIN pg_catalog.pg_publication_namespace pn ON n.oid = pn.pnnspid\n" - "WHERE pn.pnpubid = '%s' AND pn.pntype = 't'\n" + "WHERE pn.pnpubid = '%s'\n" "ORDER BY 1", pubid); if (!addFooterToPublicationDesc(&buf, "Tables from schemas:", true, &cont)) @@ -6221,37 +6105,6 @@ describePublications(const char *pattern) } } - if (!puballsequences) - { - /* Get the sequences for the specified publication */ - printfPQExpBuffer(&buf, - "SELECT n.nspname, c.relname, NULL, NULL\n" - "FROM pg_catalog.pg_class c,\n" - " pg_catalog.pg_namespace n,\n" - " pg_catalog.pg_publication_rel pr\n" - "WHERE c.relnamespace = n.oid\n" - " AND c.oid = pr.prrelid\n" - " AND pr.prpubid = '%s'\n" - " AND c.relkind = 'S'\n" /* only sequences */ - "ORDER BY 1,2", pubid); - if (!addFooterToPublicationDesc(&buf, "Sequences:", false, &cont)) - goto error_return; - - if (pset.sversion >= 150000) - { - /* Get the schemas for the specified publication */ - printfPQExpBuffer(&buf, - "SELECT n.nspname\n" - "FROM pg_catalog.pg_namespace n\n" - " JOIN pg_catalog.pg_publication_namespace pn ON n.oid = pn.pnnspid\n" - "WHERE pn.pnpubid = '%s' AND pn.pntype = 's'\n" - "ORDER BY 1", pubid); - if (!addFooterToPublicationDesc(&buf, "Sequences from schemas:", - true, &cont)) - goto error_return; - } - } - printTable(&cont, pset.queryFout, false, pset.logfile); printTableCleanup(&cont); diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 025d3f71a1..a2df39d0c1 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1827,15 +1827,11 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("ADD", "DROP", "OWNER TO", "RENAME TO", "SET"); /* ALTER PUBLICATION ADD */ else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD")) - COMPLETE_WITH("ALL TABLES IN SCHEMA", "ALL SEQUENCES IN SCHEMA", "TABLE", "SEQUENCE"); + COMPLETE_WITH("ALL TABLES IN SCHEMA", "TABLE"); else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE") || (HeadMatches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE") && ends_with(prev_wd, ','))) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); - else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "SEQUENCE") || - (HeadMatches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "SEQUENCE") && - ends_with(prev_wd, ','))) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences); /* * "ALTER PUBLICATION SET TABLE WHERE (" - complete with * table attributes @@ -1854,11 +1850,11 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH(","); /* ALTER PUBLICATION DROP */ else if (Matches("ALTER", "PUBLICATION", MatchAny, "DROP")) - COMPLETE_WITH("ALL TABLES IN SCHEMA", "ALL SEQUENCES IN SCHEMA", "TABLE", "SEQUENCE"); + COMPLETE_WITH("ALL TABLES IN SCHEMA", "TABLE"); /* ALTER PUBLICATION SET */ else if (Matches("ALTER", "PUBLICATION", MatchAny, "SET")) - COMPLETE_WITH("(", "ALL TABLES IN SCHEMA", "ALL SEQUENCES IN SCHEMA", "TABLE", "SEQUENCE"); - else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD|DROP|SET", "ALL", "TABLES|SEQUENCES", "IN", "SCHEMA")) + COMPLETE_WITH("(", "ALL TABLES IN SCHEMA", "TABLE"); + else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD|DROP|SET", "ALL", "TABLES", "IN", "SCHEMA")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas " AND nspname NOT LIKE E'pg\\\\_%%'", "CURRENT_SCHEMA"); @@ -2988,27 +2984,21 @@ psql_completion(const char *text, int start, int end) /* CREATE PUBLICATION */ else if (Matches("CREATE", "PUBLICATION", MatchAny)) - COMPLETE_WITH("FOR TABLE", "FOR ALL TABLES", "FOR ALL TABLES IN SCHEMA", - "FOR SEQUENCE", "FOR ALL SEQUENCES", "FOR ALL SEQUENCES IN SCHEMA", - "WITH ("); + COMPLETE_WITH("FOR TABLE", "FOR ALL TABLES", "FOR ALL TABLES IN SCHEMA", "WITH ("); else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR")) - COMPLETE_WITH("TABLE", "ALL TABLES", "ALL TABLES IN SCHEMA", - "SEQUENCE", "ALL SEQUENCES", "ALL SEQUENCES IN SCHEMA"); + COMPLETE_WITH("TABLE", "ALL TABLES", "ALL TABLES IN SCHEMA"); else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL")) - COMPLETE_WITH("TABLES", "TABLES IN SCHEMA", "SEQUENCES", "SEQUENCES IN SCHEMA"); - else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES|SEQUENCES")) + COMPLETE_WITH("TABLES", "TABLES IN SCHEMA"); + else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES")) COMPLETE_WITH("IN SCHEMA", "WITH ("); - else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE|SEQUENCE", MatchAny) && !ends_with(prev_wd, ',')) + else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE", MatchAny) && !ends_with(prev_wd, ',')) COMPLETE_WITH("WHERE (", "WITH ("); /* Complete "CREATE PUBLICATION FOR TABLE" with ", ..." */ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); - /* Complete "CREATE PUBLICATION FOR SEQUENCE" with ", ..." */ - else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "SEQUENCE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences); /* - * "CREATE PUBLICATION FOR TABLE|SEQUENCE WHERE (" - complete with + * "CREATE PUBLICATION FOR TABLE WHERE (" - complete with * table attributes */ else if (HeadMatches("CREATE", "PUBLICATION", MatchAny) && TailMatches("WHERE")) @@ -3019,14 +3009,14 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH(" WITH ("); /* - * Complete "CREATE PUBLICATION FOR ALL TABLES|SEQUENCES IN SCHEMA , + * Complete "CREATE PUBLICATION FOR ALL TABLES IN SCHEMA , * ..." */ - else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES|SEQUENCES", "IN", "SCHEMA")) + else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES", "IN", "SCHEMA")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas " AND nspname NOT LIKE E'pg\\\\_%%'", "CURRENT_SCHEMA"); - else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES|SEQUENCES", "IN", "SCHEMA", MatchAny) && (!ends_with(prev_wd, ','))) + else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES", "IN", "SCHEMA", MatchAny) && (!ends_with(prev_wd, ','))) COMPLETE_WITH("WITH ("); /* Complete "CREATE PUBLICATION [...] WITH" */ else if (HeadMatches("CREATE", "PUBLICATION") && TailMatches("WITH", "(")) diff --git a/src/include/access/rmgrlist.h b/src/include/access/rmgrlist.h index cf8b6d4819..9a74721c97 100644 --- a/src/include/access/rmgrlist.h +++ b/src/include/access/rmgrlist.h @@ -40,7 +40,7 @@ PG_RMGR(RM_BTREE_ID, "Btree", btree_redo, btree_desc, btree_identify, btree_xlog PG_RMGR(RM_HASH_ID, "Hash", hash_redo, hash_desc, hash_identify, NULL, NULL, hash_mask, NULL) PG_RMGR(RM_GIN_ID, "Gin", gin_redo, gin_desc, gin_identify, gin_xlog_startup, gin_xlog_cleanup, gin_mask, NULL) PG_RMGR(RM_GIST_ID, "Gist", gist_redo, gist_desc, gist_identify, gist_xlog_startup, gist_xlog_cleanup, gist_mask, NULL) -PG_RMGR(RM_SEQ_ID, "Sequence", seq_redo, seq_desc, seq_identify, NULL, NULL, seq_mask, sequence_decode) +PG_RMGR(RM_SEQ_ID, "Sequence", seq_redo, seq_desc, seq_identify, NULL, NULL, seq_mask, NULL) PG_RMGR(RM_SPGIST_ID, "SPGist", spg_redo, spg_desc, spg_identify, spg_xlog_startup, spg_xlog_cleanup, spg_mask, NULL) PG_RMGR(RM_BRIN_ID, "BRIN", brin_redo, brin_desc, brin_identify, NULL, NULL, brin_mask, NULL) PG_RMGR(RM_COMMIT_TS_ID, "CommitTs", commit_ts_redo, commit_ts_desc, commit_ts_identify, NULL, NULL, NULL, NULL) diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 67f3d8526c..cec70caae1 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202204074 +#define CATALOG_VERSION_NO 202204075 #endif diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 61876c4e80..52f56cf5b1 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -11658,11 +11658,6 @@ provolatile => 's', prorettype => 'oid', proargtypes => 'text', proallargtypes => '{text,oid}', proargmodes => '{i,o}', proargnames => '{pubname,relid}', prosrc => 'pg_get_publication_tables' }, -{ oid => '8000', descr => 'get OIDs of sequences in a publication', - proname => 'pg_get_publication_sequences', prorows => '1000', proretset => 't', - provolatile => 's', prorettype => 'oid', proargtypes => 'text', - proallargtypes => '{text,oid}', proargmodes => '{i,o}', - proargnames => '{pubname,relid}', prosrc => 'pg_get_publication_sequences' }, { oid => '6121', descr => 'returns whether a relation can be part of a publication', proname => 'pg_relation_is_publishable', provolatile => 's', diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h index 186d8ea74b..29b1856665 100644 --- a/src/include/catalog/pg_publication.h +++ b/src/include/catalog/pg_publication.h @@ -40,12 +40,6 @@ CATALOG(pg_publication,6104,PublicationRelationId) */ bool puballtables; - /* - * indicates that this is special publication which should encompass all - * sequences in the database (except for the unlogged and temp ones) - */ - bool puballsequences; - /* true if inserts are published */ bool pubinsert; @@ -58,9 +52,6 @@ CATALOG(pg_publication,6104,PublicationRelationId) /* true if truncates are published */ bool pubtruncate; - /* true if sequences are published */ - bool pubsequence; - /* true if partition changes are published using root schema */ bool pubviaroot; } FormData_pg_publication; @@ -81,7 +72,6 @@ typedef struct PublicationActions bool pubupdate; bool pubdelete; bool pubtruncate; - bool pubsequence; } PublicationActions; typedef struct PublicationDesc @@ -109,7 +99,6 @@ typedef struct Publication Oid oid; char *name; bool alltables; - bool allsequences; bool pubviaroot; PublicationActions pubactions; } Publication; @@ -141,16 +130,14 @@ typedef enum PublicationPartOpt PUBLICATION_PART_ALL, } PublicationPartOpt; -extern List *GetPublicationRelations(Oid pubid, char objectType, - PublicationPartOpt pub_partopt); +extern List *GetPublicationRelations(Oid pubid, PublicationPartOpt pub_partopt); extern List *GetAllTablesPublications(void); extern List *GetAllTablesPublicationRelations(bool pubviaroot); -extern void GetActionsInPublication(Oid pubid, PublicationActions *actions); -extern List *GetPublicationSchemas(Oid pubid, char objectType); -extern List *GetSchemaPublications(Oid schemaid, char objectType); -extern List *GetSchemaPublicationRelations(Oid schemaid, char objectType, +extern List *GetPublicationSchemas(Oid pubid); +extern List *GetSchemaPublications(Oid schemaid); +extern List *GetSchemaPublicationRelations(Oid schemaid, PublicationPartOpt pub_partopt); -extern List *GetAllSchemaPublicationRelations(Oid puboid, char objectType, +extern List *GetAllSchemaPublicationRelations(Oid puboid, PublicationPartOpt pub_partopt); extern List *GetPubPartitionOptionRelations(List *result, PublicationPartOpt pub_partopt, @@ -158,15 +145,11 @@ extern List *GetPubPartitionOptionRelations(List *result, extern Oid GetTopMostAncestorInPublication(Oid puboid, List *ancestors, int *ancestor_level); -extern List *GetAllSequencesPublications(void); -extern List *GetAllSequencesPublicationRelations(void); - extern bool is_publishable_relation(Relation rel); extern bool is_schema_publication(Oid pubid); extern ObjectAddress publication_add_relation(Oid pubid, PublicationRelInfo *pri, bool if_not_exists); extern ObjectAddress publication_add_schema(Oid pubid, Oid schemaid, - char objectType, bool if_not_exists); extern Bitmapset *pub_collist_to_bitmapset(Bitmapset *columns, Datum pubcols, diff --git a/src/include/catalog/pg_publication_namespace.h b/src/include/catalog/pg_publication_namespace.h index 7340a1ec64..e4306da02e 100644 --- a/src/include/catalog/pg_publication_namespace.h +++ b/src/include/catalog/pg_publication_namespace.h @@ -32,7 +32,6 @@ CATALOG(pg_publication_namespace,8901,PublicationNamespaceRelationId) Oid oid; /* oid */ Oid pnpubid BKI_LOOKUP(pg_publication); /* Oid of the publication */ Oid pnnspid BKI_LOOKUP(pg_namespace); /* Oid of the schema */ - char pntype; /* object type to include */ } FormData_pg_publication_namespace; /* ---------------- @@ -43,13 +42,6 @@ CATALOG(pg_publication_namespace,8901,PublicationNamespaceRelationId) typedef FormData_pg_publication_namespace *Form_pg_publication_namespace; DECLARE_UNIQUE_INDEX_PKEY(pg_publication_namespace_oid_index, 8902, PublicationNamespaceObjectIndexId, on pg_publication_namespace using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_pntype_index, 8903, PublicationNamespacePnnspidPnpubidPntypeIndexId, on pg_publication_namespace using btree(pnnspid oid_ops, pnpubid oid_ops, pntype char_ops)); - -/* object type to include from a schema, maps to relkind */ -#define PUB_OBJTYPE_TABLE 't' /* table (regular or partitioned) */ -#define PUB_OBJTYPE_SEQUENCE 's' /* sequence object */ -#define PUB_OBJTYPE_UNSUPPORTED 'u' /* used for non-replicated types */ - -extern char pub_get_object_type_for_relkind(char relkind); +DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_index, 8903, PublicationNamespacePnnspidPnpubidIndexId, on pg_publication_namespace using btree(pnnspid oid_ops, pnpubid oid_ops)); #endif /* PG_PUBLICATION_NAMESPACE_H */ diff --git a/src/include/commands/sequence.h b/src/include/commands/sequence.h index f2381982d5..9da2300810 100644 --- a/src/include/commands/sequence.h +++ b/src/include/commands/sequence.h @@ -48,7 +48,6 @@ typedef FormData_pg_sequence_data *Form_pg_sequence_data; typedef struct xl_seq_rec { RelFileNode node; - bool created; /* creates a new relfilenode (CREATE/ALTER) */ /* SEQUENCE TUPLE DATA FOLLOWS AT THE END */ } xl_seq_rec; @@ -61,7 +60,6 @@ extern ObjectAddress AlterSequence(ParseState *pstate, AlterSeqStmt *stmt); extern void SequenceChangePersistence(Oid relid, char newrelpersistence); extern void DeleteSequenceTuple(Oid relid); extern void ResetSequence(Oid seq_relid); -extern void SetSequence(Oid seq_relid, bool transactional, int64 last_value, int64 log_cnt, bool is_called); extern void ResetSequenceCaches(void); extern void seq_redo(XLogReaderState *rptr); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 8998d34560..1bdeb9eb3d 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -4013,10 +4013,6 @@ typedef enum PublicationObjSpecType PUBLICATIONOBJ_TABLES_IN_SCHEMA, /* All tables in schema */ PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA, /* All tables in first element of * search_path */ - PUBLICATIONOBJ_SEQUENCE, /* Sequence type */ - PUBLICATIONOBJ_SEQUENCES_IN_SCHEMA, /* Sequences in schema type */ - PUBLICATIONOBJ_SEQUENCES_IN_CUR_SCHEMA, /* Get the first element of - * search_path */ PUBLICATIONOBJ_CONTINUATION /* Continuation of previous type */ } PublicationObjSpecType; @@ -4035,7 +4031,7 @@ typedef struct CreatePublicationStmt char *pubname; /* Name of the publication */ List *options; /* List of DefElem nodes */ List *pubobjects; /* Optional list of publication objects */ - List *for_all_objects; /* Special publication for all objects in db */ + bool for_all_tables; /* Special publication for all tables in db */ } CreatePublicationStmt; typedef enum AlterPublicationAction @@ -4058,7 +4054,7 @@ typedef struct AlterPublicationStmt * objects. */ List *pubobjects; /* Optional list of publication objects */ - List *for_all_objects; /* Special publication for all objects in db */ + bool for_all_tables; /* Special publication for all tables in db */ AlterPublicationAction action; /* What action to perform with the given * objects */ } AlterPublicationStmt; diff --git a/src/include/replication/decode.h b/src/include/replication/decode.h index 8e07bb7409..a33c2a718a 100644 --- a/src/include/replication/decode.h +++ b/src/include/replication/decode.h @@ -27,7 +27,6 @@ extern void heap2_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); extern void xact_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); extern void standby_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); extern void logicalmsg_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); -extern void sequence_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); extern void LogicalDecodingProcessRecord(LogicalDecodingContext *ctx, XLogReaderState *record); diff --git a/src/include/replication/logicalproto.h b/src/include/replication/logicalproto.h index 13ee10fdd4..a771ab8ff3 100644 --- a/src/include/replication/logicalproto.h +++ b/src/include/replication/logicalproto.h @@ -61,7 +61,6 @@ typedef enum LogicalRepMsgType LOGICAL_REP_MSG_RELATION = 'R', LOGICAL_REP_MSG_TYPE = 'Y', LOGICAL_REP_MSG_MESSAGE = 'M', - LOGICAL_REP_MSG_SEQUENCE = 'Q', LOGICAL_REP_MSG_BEGIN_PREPARE = 'b', LOGICAL_REP_MSG_PREPARE = 'P', LOGICAL_REP_MSG_COMMIT_PREPARED = 'K', @@ -119,18 +118,6 @@ typedef struct LogicalRepTyp char *typname; /* name of the remote type */ } LogicalRepTyp; -/* Sequence info */ -typedef struct LogicalRepSequence -{ - Oid remoteid; /* unique id of the remote sequence */ - char *nspname; /* schema name of remote sequence */ - char *seqname; /* name of the remote sequence */ - bool transactional; - int64 last_value; - int64 log_cnt; - bool is_called; -} LogicalRepSequence; - /* Transaction info */ typedef struct LogicalRepBeginData { @@ -243,12 +230,6 @@ extern List *logicalrep_read_truncate(StringInfo in, bool *cascade, bool *restart_seqs); extern void logicalrep_write_message(StringInfo out, TransactionId xid, XLogRecPtr lsn, bool transactional, const char *prefix, Size sz, const char *message); -extern void logicalrep_write_sequence(StringInfo out, Relation rel, - TransactionId xid, XLogRecPtr lsn, - bool transactional, - int64 last_value, int64 log_cnt, - bool is_called); -extern void logicalrep_read_sequence(StringInfo in, LogicalRepSequence *seqdata); extern void logicalrep_write_rel(StringInfo out, TransactionId xid, Relation rel, Bitmapset *columns); extern LogicalRepRelation *logicalrep_read_rel(StringInfo in); diff --git a/src/include/replication/output_plugin.h b/src/include/replication/output_plugin.h index fe85d49a03..539dc8e697 100644 --- a/src/include/replication/output_plugin.h +++ b/src/include/replication/output_plugin.h @@ -88,18 +88,6 @@ typedef void (*LogicalDecodeMessageCB) (struct LogicalDecodingContext *ctx, Size message_size, const char *message); -/* - * Called for the generic logical decoding sequences. - */ -typedef void (*LogicalDecodeSequenceCB) (struct LogicalDecodingContext *ctx, - ReorderBufferTXN *txn, - XLogRecPtr sequence_lsn, - Relation rel, - bool transactional, - int64 last_value, - int64 log_cnt, - bool is_called); - /* * Filter changes by origin. */ @@ -211,19 +199,6 @@ typedef void (*LogicalDecodeStreamMessageCB) (struct LogicalDecodingContext *ctx Size message_size, const char *message); -/* - * Called for the streaming generic logical decoding sequences from in-progress - * transactions. - */ -typedef void (*LogicalDecodeStreamSequenceCB) (struct LogicalDecodingContext *ctx, - ReorderBufferTXN *txn, - XLogRecPtr sequence_lsn, - Relation rel, - bool transactional, - int64 last_value, - int64 log_cnt, - bool is_called); - /* * Callback for streaming truncates from in-progress transactions. */ @@ -244,7 +219,6 @@ typedef struct OutputPluginCallbacks LogicalDecodeTruncateCB truncate_cb; LogicalDecodeCommitCB commit_cb; LogicalDecodeMessageCB message_cb; - LogicalDecodeSequenceCB sequence_cb; LogicalDecodeFilterByOriginCB filter_by_origin_cb; LogicalDecodeShutdownCB shutdown_cb; @@ -263,7 +237,6 @@ typedef struct OutputPluginCallbacks LogicalDecodeStreamCommitCB stream_commit_cb; LogicalDecodeStreamChangeCB stream_change_cb; LogicalDecodeStreamMessageCB stream_message_cb; - LogicalDecodeStreamSequenceCB stream_sequence_cb; LogicalDecodeStreamTruncateCB stream_truncate_cb; } OutputPluginCallbacks; diff --git a/src/include/replication/pgoutput.h b/src/include/replication/pgoutput.h index f4e9f35d09..eafedd610a 100644 --- a/src/include/replication/pgoutput.h +++ b/src/include/replication/pgoutput.h @@ -29,7 +29,6 @@ typedef struct PGOutputData bool streaming; bool messages; bool two_phase; - bool sequences; } PGOutputData; #endif /* PGOUTPUT_H */ diff --git a/src/include/replication/reorderbuffer.h b/src/include/replication/reorderbuffer.h index 0bcc150b33..f12e75d69b 100644 --- a/src/include/replication/reorderbuffer.h +++ b/src/include/replication/reorderbuffer.h @@ -64,8 +64,7 @@ typedef enum ReorderBufferChangeType REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT, REORDER_BUFFER_CHANGE_INTERNAL_SPEC_CONFIRM, REORDER_BUFFER_CHANGE_INTERNAL_SPEC_ABORT, - REORDER_BUFFER_CHANGE_TRUNCATE, - REORDER_BUFFER_CHANGE_SEQUENCE + REORDER_BUFFER_CHANGE_TRUNCATE } ReorderBufferChangeType; /* forward declaration */ @@ -159,13 +158,6 @@ typedef struct ReorderBufferChange uint32 ninvalidations; /* Number of messages */ SharedInvalidationMessage *invalidations; /* invalidation message */ } inval; - - /* Context data for Sequence changes */ - struct - { - RelFileNode relnode; - ReorderBufferTupleBuf *tuple; - } sequence; } data; /* @@ -438,15 +430,6 @@ typedef void (*ReorderBufferMessageCB) (ReorderBuffer *rb, const char *prefix, Size sz, const char *message); -/* sequence callback signature */ -typedef void (*ReorderBufferSequenceCB) (ReorderBuffer *rb, - ReorderBufferTXN *txn, - XLogRecPtr sequence_lsn, - Relation rel, - bool transactional, - int64 last_value, int64 log_cnt, - bool is_called); - /* begin prepare callback signature */ typedef void (*ReorderBufferBeginPrepareCB) (ReorderBuffer *rb, ReorderBufferTXN *txn); @@ -513,15 +496,6 @@ typedef void (*ReorderBufferStreamMessageCB) ( const char *prefix, Size sz, const char *message); -/* stream sequence callback signature */ -typedef void (*ReorderBufferStreamSequenceCB) (ReorderBuffer *rb, - ReorderBufferTXN *txn, - XLogRecPtr sequence_lsn, - Relation rel, - bool transactional, - int64 last_value, int64 log_cnt, - bool is_called); - /* stream truncate callback signature */ typedef void (*ReorderBufferStreamTruncateCB) ( ReorderBuffer *rb, @@ -537,12 +511,6 @@ struct ReorderBuffer */ HTAB *by_txn; - /* - * relfilenode => XID lookup table for sequences created in a transaction - * (also includes altered sequences, which assigns new relfilenode) - */ - HTAB *sequences; - /* * Transactions that could be a toplevel xact, ordered by LSN of the first * record bearing that xid. @@ -573,7 +541,6 @@ struct ReorderBuffer ReorderBufferApplyTruncateCB apply_truncate; ReorderBufferCommitCB commit; ReorderBufferMessageCB message; - ReorderBufferSequenceCB sequence; /* * Callbacks to be called when streaming a transaction at prepare time. @@ -593,7 +560,6 @@ struct ReorderBuffer ReorderBufferStreamCommitCB stream_commit; ReorderBufferStreamChangeCB stream_change; ReorderBufferStreamMessageCB stream_message; - ReorderBufferStreamSequenceCB stream_sequence; ReorderBufferStreamTruncateCB stream_truncate; /* @@ -669,10 +635,6 @@ void ReorderBufferQueueChange(ReorderBuffer *, TransactionId, void ReorderBufferQueueMessage(ReorderBuffer *, TransactionId, Snapshot snapshot, XLogRecPtr lsn, bool transactional, const char *prefix, Size message_size, const char *message); -void ReorderBufferQueueSequence(ReorderBuffer *rb, TransactionId xid, - Snapshot snapshot, XLogRecPtr lsn, RepOriginId origin_id, - RelFileNode rnode, bool transactional, bool created, - ReorderBufferTupleBuf *tuplebuf); void ReorderBufferCommit(ReorderBuffer *, TransactionId, XLogRecPtr commit_lsn, XLogRecPtr end_lsn, TimestampTz commit_time, RepOriginId origin_id, XLogRecPtr origin_lsn); @@ -720,7 +682,4 @@ void ReorderBufferSetRestartPoint(ReorderBuffer *, XLogRecPtr ptr); void StartupReorderBuffer(void); -bool ReorderBufferSequenceIsTransactional(ReorderBuffer *rb, - RelFileNode rnode, bool created); - #endif diff --git a/src/test/regress/expected/object_address.out b/src/test/regress/expected/object_address.out index c95d44b3db..4117fc27c9 100644 --- a/src/test/regress/expected/object_address.out +++ b/src/test/regress/expected/object_address.out @@ -46,7 +46,6 @@ CREATE TRANSFORM FOR int LANGUAGE SQL ( SET client_min_messages = 'ERROR'; CREATE PUBLICATION addr_pub FOR TABLE addr_nsp.gentable; CREATE PUBLICATION addr_pub_schema FOR ALL TABLES IN SCHEMA addr_nsp; -CREATE PUBLICATION addr_pub_schema2 FOR ALL SEQUENCES IN SCHEMA addr_nsp; RESET client_min_messages; CREATE SUBSCRIPTION regress_addr_sub CONNECTION '' PUBLICATION bar WITH (connect = false, slot_name = NONE); WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables @@ -429,8 +428,7 @@ WITH objects (type, name, args) AS (VALUES ('transform', '{int}', '{sql}'), ('access method', '{btree}', '{}'), ('publication', '{addr_pub}', '{}'), - ('publication namespace', '{addr_nsp}', '{addr_pub_schema,t}'), - ('publication namespace', '{addr_nsp}', '{addr_pub_schema2,s}'), + ('publication namespace', '{addr_nsp}', '{addr_pub_schema}'), ('publication relation', '{addr_nsp, gentable}', '{addr_pub}'), ('subscription', '{regress_addr_sub}', '{}'), ('statistics object', '{addr_nsp, gentable_stat}', '{}') @@ -494,9 +492,8 @@ SELECT (pg_identify_object(addr1.classid, addr1.objid, addr1.objsubid)).*, subscription | | regress_addr_sub | regress_addr_sub | t publication | | addr_pub | addr_pub | t publication relation | | | addr_nsp.gentable in publication addr_pub | t - publication namespace | | | addr_nsp in publication addr_pub_schema type t | t - publication namespace | | | addr_nsp in publication addr_pub_schema2 type s | t -(51 rows) + publication namespace | | | addr_nsp in publication addr_pub_schema | t +(50 rows) --- --- Cleanup resources @@ -509,7 +506,6 @@ drop cascades to server integer drop cascades to user mapping for regress_addr_user on server integer DROP PUBLICATION addr_pub; DROP PUBLICATION addr_pub_schema; -DROP PUBLICATION addr_pub_schema2; DROP SUBSCRIPTION regress_addr_sub; DROP SCHEMA addr_nsp CASCADE; NOTICE: drop cascades to 14 other objects diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index 0308e40ba6..4d24d772bd 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -30,20 +30,20 @@ ERROR: conflicting or redundant options LINE 1: ...ub_xxx WITH (publish_via_partition_root = 'true', publish_vi... ^ \dRp - List of publications - Name | Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------+--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - testpib_ins_trunct | regress_publication_user | f | f | t | f | f | f | f | f - testpub_default | regress_publication_user | f | f | f | t | f | f | f | f + List of publications + Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------+--------------------------+------------+---------+---------+---------+-----------+---------- + testpib_ins_trunct | regress_publication_user | f | t | f | f | f | f + testpub_default | regress_publication_user | f | f | t | f | f | f (2 rows) -ALTER PUBLICATION testpub_default SET (publish = 'insert, update, delete, sequence'); +ALTER PUBLICATION testpub_default SET (publish = 'insert, update, delete'); \dRp - List of publications - Name | Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------+--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - testpib_ins_trunct | regress_publication_user | f | f | t | f | f | f | f | f - testpub_default | regress_publication_user | f | f | t | t | t | f | t | f + List of publications + Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------+--------------------------+------------+---------+---------+---------+-----------+---------- + testpib_ins_trunct | regress_publication_user | f | t | f | f | f | f + testpub_default | regress_publication_user | f | t | t | t | f | f (2 rows) --- adding tables @@ -61,9 +61,6 @@ CREATE TABLE testpub_tbl2 (id serial primary key, data text); ALTER PUBLICATION testpub_foralltables ADD TABLE testpub_tbl2; ERROR: publication "testpub_foralltables" is defined as FOR ALL TABLES DETAIL: Tables cannot be added to or dropped from FOR ALL TABLES publications. --- fail - can't add a table using ADD SEQUENCE command -ALTER PUBLICATION testpub_foralltables ADD SEQUENCE testpub_tbl2; -ERROR: object type does not match type expected by command -- fail - can't drop from all tables publication ALTER PUBLICATION testpub_foralltables DROP TABLE testpub_tbl2; ERROR: publication "testpub_foralltables" is defined as FOR ALL TABLES @@ -90,10 +87,10 @@ RESET client_min_messages; -- should be able to add schema to 'FOR TABLE' publication ALTER PUBLICATION testpub_fortable ADD ALL TABLES IN SCHEMA pub_test; \dRp+ testpub_fortable - Publication testpub_fortable - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub_fortable + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables: "public.testpub_tbl1" Tables from schemas: @@ -102,20 +99,20 @@ Tables from schemas: -- should be able to drop schema from 'FOR TABLE' publication ALTER PUBLICATION testpub_fortable DROP ALL TABLES IN SCHEMA pub_test; \dRp+ testpub_fortable - Publication testpub_fortable - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub_fortable + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables: "public.testpub_tbl1" -- should be able to set schema to 'FOR TABLE' publication ALTER PUBLICATION testpub_fortable SET ALL TABLES IN SCHEMA pub_test; \dRp+ testpub_fortable - Publication testpub_fortable - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub_fortable + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test" @@ -137,10 +134,10 @@ ERROR: relation "testpub_nopk" is not part of the publication -- should be able to set table to schema publication ALTER PUBLICATION testpub_forschema SET TABLE pub_test.testpub_nopk; \dRp+ testpub_forschema - Publication testpub_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables: "pub_test.testpub_nopk" @@ -162,10 +159,10 @@ Publications: "testpub_foralltables" \dRp+ testpub_foralltables - Publication testpub_foralltables - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | t | f | t | t | f | f | f | f + Publication testpub_foralltables + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | t | t | t | f | f | f (1 row) DROP TABLE testpub_tbl2; @@ -177,545 +174,24 @@ CREATE PUBLICATION testpub3 FOR TABLE testpub_tbl3; CREATE PUBLICATION testpub4 FOR TABLE ONLY testpub_tbl3; RESET client_min_messages; \dRp+ testpub3 - Publication testpub3 - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub3 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables: "public.testpub_tbl3" "public.testpub_tbl3a" \dRp+ testpub4 - Publication testpub4 - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub4 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables: "public.testpub_tbl3" DROP TABLE testpub_tbl3, testpub_tbl3a; DROP PUBLICATION testpub3, testpub4; ---- adding sequences -CREATE SEQUENCE testpub_seq0; -CREATE SEQUENCE pub_test.testpub_seq1; -SET client_min_messages = 'ERROR'; -CREATE PUBLICATION testpub_forallsequences FOR ALL SEQUENCES WITH (publish = 'sequence'); -RESET client_min_messages; -ALTER PUBLICATION testpub_forallsequences SET (publish = 'insert, sequence'); -CREATE SEQUENCE testpub_seq2; --- fail - can't add to for all sequences publication -ALTER PUBLICATION testpub_forallsequences ADD SEQUENCE testpub_seq2; -ERROR: publication "testpub_forallsequences" is defined as FOR ALL SEQUENCES -DETAIL: Sequences cannot be added to or dropped from FOR ALL SEQUENCES publications. --- fail - can't drop from all sequences publication -ALTER PUBLICATION testpub_forallsequences DROP SEQUENCE testpub_seq2; -ERROR: publication "testpub_forallsequences" is defined as FOR ALL SEQUENCES -DETAIL: Sequences cannot be added to or dropped from FOR ALL SEQUENCES publications. --- fail - can't add to for all sequences publication -ALTER PUBLICATION testpub_forallsequences SET SEQUENCE pub_test.testpub_seq1; -ERROR: publication "testpub_forallsequences" is defined as FOR ALL SEQUENCES -DETAIL: Sequences cannot be added to or dropped from FOR ALL SEQUENCES publications. --- fail - can't add schema to 'FOR ALL SEQUENCES' publication -ALTER PUBLICATION testpub_forallsequences ADD ALL SEQUENCES IN SCHEMA pub_test; -ERROR: publication "testpub_forallsequences" is defined as FOR ALL SEQUENCES -DETAIL: Sequences from schema cannot be added to, dropped from, or set on FOR ALL SEQUENCES publications. --- fail - can't drop schema from 'FOR ALL SEQUENCES' publication -ALTER PUBLICATION testpub_forallsequences DROP ALL SEQUENCES IN SCHEMA pub_test; -ERROR: publication "testpub_forallsequences" is defined as FOR ALL SEQUENCES -DETAIL: Sequences from schema cannot be added to, dropped from, or set on FOR ALL SEQUENCES publications. --- fail - can't set schema to 'FOR ALL SEQUENCES' publication -ALTER PUBLICATION testpub_forallsequences SET ALL SEQUENCES IN SCHEMA pub_test; -ERROR: publication "testpub_forallsequences" is defined as FOR ALL SEQUENCES -DETAIL: Sequences from schema cannot be added to, dropped from, or set on FOR ALL SEQUENCES publications. -SET client_min_messages = 'ERROR'; -CREATE PUBLICATION testpub_forsequence FOR SEQUENCE testpub_seq0; -RESET client_min_messages; --- should be able to add schema to 'FOR SEQUENCE' publication -ALTER PUBLICATION testpub_forsequence ADD ALL SEQUENCES IN SCHEMA pub_test; -\dRp+ testpub_forsequence - Publication testpub_forsequence - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f -Sequences: - "public.testpub_seq0" -Sequences from schemas: - "pub_test" - --- fail - can't add sequence from the schema we already added -ALTER PUBLICATION testpub_forsequence ADD SEQUENCE pub_test.testpub_seq1; -ERROR: cannot add relation "pub_test.testpub_seq1" to publication -DETAIL: Sequence's schema "pub_test" is already part of the publication or part of the specified schema list. --- fail - can't add sequence using ADD TABLE command -ALTER PUBLICATION testpub_forsequence ADD TABLE pub_test.testpub_seq1; -ERROR: object type does not match type expected by command --- should be able to drop schema from 'FOR SEQUENCE' publication -ALTER PUBLICATION testpub_forsequence DROP ALL SEQUENCES IN SCHEMA pub_test; -\dRp+ testpub_forsequence - Publication testpub_forsequence - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f -Sequences: - "public.testpub_seq0" - --- should be able to set schema to 'FOR SEQUENCE' publication -ALTER PUBLICATION testpub_forsequence SET ALL SEQUENCES IN SCHEMA pub_test; -\dRp+ testpub_forsequence - Publication testpub_forsequence - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f -Sequences from schemas: - "pub_test" - -SET client_min_messages = 'ERROR'; -CREATE PUBLICATION testpub_forschema FOR ALL SEQUENCES IN SCHEMA pub_test; -RESET client_min_messages; --- fail - can't create publication with schema and sequence of the same schema -CREATE PUBLICATION testpub_for_seq_schema FOR ALL SEQUENCES IN SCHEMA pub_test, SEQUENCE pub_test.testpub_seq1; -ERROR: cannot add relation "pub_test.testpub_seq1" to publication -DETAIL: Sequence's schema "pub_test" is already part of the publication or part of the specified schema list. --- fail - can't add a sequence of the same schema to the schema publication -ALTER PUBLICATION testpub_forschema ADD SEQUENCE pub_test.testpub_seq1; -ERROR: cannot add relation "pub_test.testpub_seq1" to publication -DETAIL: Sequence's schema "pub_test" is already part of the publication or part of the specified schema list. --- fail - can't drop a sequence from the schema publication which isn't in the --- publication -ALTER PUBLICATION testpub_forschema DROP SEQUENCE pub_test.testpub_seq1; -ERROR: relation "testpub_seq1" is not part of the publication --- should be able to set sequence to schema publication -ALTER PUBLICATION testpub_forschema SET SEQUENCE pub_test.testpub_seq1; -\dRp+ testpub_forschema - Publication testpub_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f -Sequences: - "pub_test.testpub_seq1" - -SELECT pubname, puballtables, puballsequences FROM pg_publication WHERE pubname = 'testpub_forallsequences'; - pubname | puballtables | puballsequences --------------------------+--------------+----------------- - testpub_forallsequences | f | t -(1 row) - -\d+ pub_test.testpub_seq1 - Sequence "pub_test.testpub_seq1" - Type | Start | Minimum | Maximum | Increment | Cycles? | Cache ---------+-------+---------+---------------------+-----------+---------+------- - bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 -Publications: - "testpub_forallsequences" - "testpub_forschema" - "testpub_forsequence" - -\dRp+ testpub_forallsequences - Publication testpub_forallsequences - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | t | t | f | f | f | t | f -(1 row) - -DROP SEQUENCE testpub_seq0, pub_test.testpub_seq1, testpub_seq2; -DROP PUBLICATION testpub_forallsequences, testpub_forsequence, testpub_forschema; --- publication testing multiple sequences at the same time -CREATE SEQUENCE testpub_seq1; -CREATE SEQUENCE testpub_seq2; -SET client_min_messages = 'ERROR'; -CREATE PUBLICATION testpub_multi FOR SEQUENCE testpub_seq1, testpub_seq2; -RESET client_min_messages; -\dRp+ testpub_multi - Publication testpub_multi - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f -Sequences: - "public.testpub_seq1" - "public.testpub_seq2" - -DROP PUBLICATION testpub_multi; -DROP SEQUENCE testpub_seq1; -DROP SEQUENCE testpub_seq2; --- Publication mixing tables and sequences -SET client_min_messages = 'ERROR'; -CREATE PUBLICATION testpub_mix; -RESET client_min_messages; -CREATE SEQUENCE testpub_seq1; -CREATE SEQUENCE pub_test.testpub_seq2; -ALTER PUBLICATION testpub_mix ADD SEQUENCE testpub_seq1, TABLE testpub_tbl1; -\dRp+ testpub_mix - Publication testpub_mix - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f -Tables: - "public.testpub_tbl1" -Sequences: - "public.testpub_seq1" - -ALTER PUBLICATION testpub_mix ADD ALL SEQUENCES IN SCHEMA pub_test, ALL TABLES IN SCHEMA pub_test; -\dRp+ testpub_mix - Publication testpub_mix - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f -Tables: - "public.testpub_tbl1" -Tables from schemas: - "pub_test" -Sequences: - "public.testpub_seq1" -Sequences from schemas: - "pub_test" - -ALTER PUBLICATION testpub_mix DROP ALL SEQUENCES IN SCHEMA pub_test; -\dRp+ testpub_mix - Publication testpub_mix - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f -Tables: - "public.testpub_tbl1" -Tables from schemas: - "pub_test" -Sequences: - "public.testpub_seq1" - -ALTER PUBLICATION testpub_mix DROP ALL TABLES IN SCHEMA pub_test; -\dRp+ testpub_mix - Publication testpub_mix - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f -Tables: - "public.testpub_tbl1" -Sequences: - "public.testpub_seq1" - -DROP PUBLICATION testpub_mix; -DROP SEQUENCE testpub_seq1; -DROP SEQUENCE pub_test.testpub_seq2; --- make sure we replicate only the correct relation type -CREATE SCHEMA pub_test1; -CREATE SEQUENCE pub_test1.test_seq1; -CREATE TABLE pub_test1.test_tbl1 (a int primary key, b int); -CREATE SCHEMA pub_test2; -CREATE SEQUENCE pub_test2.test_seq2; -CREATE TABLE pub_test2.test_tbl2 (a int primary key, b int); -SET client_min_messages = 'ERROR'; -CREATE PUBLICATION testpub_schemas; -RESET client_min_messages; --- add tables from one schema, sequences from the other -ALTER PUBLICATION testpub_schemas ADD ALL TABLES IN SCHEMA pub_test2; -ALTER PUBLICATION testpub_schemas ADD ALL SEQUENCES IN SCHEMA pub_test1; -\dRp+ testpub_schemas - Publication testpub_schemas - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f -Tables from schemas: - "pub_test2" -Sequences from schemas: - "pub_test1" - -\dn+ pub_test1 - List of schemas - Name | Owner | Access privileges | Description ------------+--------------------------+-------------------+------------- - pub_test1 | regress_publication_user | | -Publications: - "testpub_schemas" (sequences) - -\dn+ pub_test2 - List of schemas - Name | Owner | Access privileges | Description ------------+--------------------------+-------------------+------------- - pub_test2 | regress_publication_user | | -Publications: - "testpub_schemas" (tables) - -\d+ pub_test1.test_seq1; - Sequence "pub_test1.test_seq1" - Type | Start | Minimum | Maximum | Increment | Cycles? | Cache ---------+-------+---------+---------------------+-----------+---------+------- - bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 -Publications: - "testpub_schemas" - -\d+ pub_test1.test_tbl1; - Table "pub_test1.test_tbl1" - Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+---------+-----------+----------+---------+---------+--------------+------------- - a | integer | | not null | | plain | | - b | integer | | | | plain | | -Indexes: - "test_tbl1_pkey" PRIMARY KEY, btree (a) - -\d+ pub_test2.test_seq2; - Sequence "pub_test2.test_seq2" - Type | Start | Minimum | Maximum | Increment | Cycles? | Cache ---------+-------+---------+---------------------+-----------+---------+------- - bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 - -\d+ pub_test2.test_tbl2; - Table "pub_test2.test_tbl2" - Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+---------+-----------+----------+---------+---------+--------------+------------- - a | integer | | not null | | plain | | - b | integer | | | | plain | | -Indexes: - "test_tbl2_pkey" PRIMARY KEY, btree (a) -Publications: - "testpub_schemas" - --- add the other object type from each schema -ALTER PUBLICATION testpub_schemas ADD ALL TABLES IN SCHEMA pub_test1; -ALTER PUBLICATION testpub_schemas ADD ALL SEQUENCES IN SCHEMA pub_test2; -\dRp+ testpub_schemas - Publication testpub_schemas - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f -Tables from schemas: - "pub_test1" - "pub_test2" -Sequences from schemas: - "pub_test1" - "pub_test2" - -\dn+ pub_test1 - List of schemas - Name | Owner | Access privileges | Description ------------+--------------------------+-------------------+------------- - pub_test1 | regress_publication_user | | -Publications: - "testpub_schemas" (sequences) - "testpub_schemas" (tables) - -\dn+ pub_test2 - List of schemas - Name | Owner | Access privileges | Description ------------+--------------------------+-------------------+------------- - pub_test2 | regress_publication_user | | -Publications: - "testpub_schemas" (tables) - "testpub_schemas" (sequences) - -\d+ pub_test1.test_seq1; - Sequence "pub_test1.test_seq1" - Type | Start | Minimum | Maximum | Increment | Cycles? | Cache ---------+-------+---------+---------------------+-----------+---------+------- - bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 -Publications: - "testpub_schemas" - -\d+ pub_test1.test_tbl1; - Table "pub_test1.test_tbl1" - Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+---------+-----------+----------+---------+---------+--------------+------------- - a | integer | | not null | | plain | | - b | integer | | | | plain | | -Indexes: - "test_tbl1_pkey" PRIMARY KEY, btree (a) -Publications: - "testpub_schemas" - -\d+ pub_test2.test_seq2; - Sequence "pub_test2.test_seq2" - Type | Start | Minimum | Maximum | Increment | Cycles? | Cache ---------+-------+---------+---------------------+-----------+---------+------- - bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 -Publications: - "testpub_schemas" - -\d+ pub_test2.test_tbl2; - Table "pub_test2.test_tbl2" - Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+---------+-----------+----------+---------+---------+--------------+------------- - a | integer | | not null | | plain | | - b | integer | | | | plain | | -Indexes: - "test_tbl2_pkey" PRIMARY KEY, btree (a) -Publications: - "testpub_schemas" - --- now drop the object type added first -ALTER PUBLICATION testpub_schemas DROP ALL TABLES IN SCHEMA pub_test2; -ALTER PUBLICATION testpub_schemas DROP ALL SEQUENCES IN SCHEMA pub_test1; -\dRp+ testpub_schemas - Publication testpub_schemas - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f -Tables from schemas: - "pub_test1" -Sequences from schemas: - "pub_test2" - -\dn+ pub_test1 - List of schemas - Name | Owner | Access privileges | Description ------------+--------------------------+-------------------+------------- - pub_test1 | regress_publication_user | | -Publications: - "testpub_schemas" (tables) - -\dn+ pub_test2 - List of schemas - Name | Owner | Access privileges | Description ------------+--------------------------+-------------------+------------- - pub_test2 | regress_publication_user | | -Publications: - "testpub_schemas" (sequences) - -\d+ pub_test1.test_seq1; - Sequence "pub_test1.test_seq1" - Type | Start | Minimum | Maximum | Increment | Cycles? | Cache ---------+-------+---------+---------------------+-----------+---------+------- - bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 - -\d+ pub_test1.test_tbl1; - Table "pub_test1.test_tbl1" - Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+---------+-----------+----------+---------+---------+--------------+------------- - a | integer | | not null | | plain | | - b | integer | | | | plain | | -Indexes: - "test_tbl1_pkey" PRIMARY KEY, btree (a) -Publications: - "testpub_schemas" - -\d+ pub_test2.test_seq2; - Sequence "pub_test2.test_seq2" - Type | Start | Minimum | Maximum | Increment | Cycles? | Cache ---------+-------+---------+---------------------+-----------+---------+------- - bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 -Publications: - "testpub_schemas" - -\d+ pub_test2.test_tbl2; - Table "pub_test2.test_tbl2" - Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+---------+-----------+----------+---------+---------+--------------+------------- - a | integer | | not null | | plain | | - b | integer | | | | plain | | -Indexes: - "test_tbl2_pkey" PRIMARY KEY, btree (a) - --- should fail (publication contains the whole schema) -ALTER PUBLICATION testpub_schemas ADD TABLE pub_test1.test_tbl1; -ERROR: cannot add relation "pub_test1.test_tbl1" to publication -DETAIL: Table's schema "pub_test1" is already part of the publication or part of the specified schema list. -ALTER PUBLICATION testpub_schemas ADD SEQUENCE pub_test2.test_seq2; -ERROR: cannot add relation "pub_test2.test_seq2" to publication -DETAIL: Sequence's schema "pub_test2" is already part of the publication or part of the specified schema list. --- should work (different schema) -ALTER PUBLICATION testpub_schemas ADD TABLE pub_test2.test_tbl2; -ALTER PUBLICATION testpub_schemas ADD SEQUENCE pub_test1.test_seq1; -\dRp+ testpub_schemas - Publication testpub_schemas - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f -Tables: - "pub_test2.test_tbl2" -Tables from schemas: - "pub_test1" -Sequences: - "pub_test1.test_seq1" -Sequences from schemas: - "pub_test2" - -\d+ pub_test1.test_seq1; - Sequence "pub_test1.test_seq1" - Type | Start | Minimum | Maximum | Increment | Cycles? | Cache ---------+-------+---------+---------------------+-----------+---------+------- - bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 -Publications: - "testpub_schemas" - -\d+ pub_test1.test_tbl1; - Table "pub_test1.test_tbl1" - Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+---------+-----------+----------+---------+---------+--------------+------------- - a | integer | | not null | | plain | | - b | integer | | | | plain | | -Indexes: - "test_tbl1_pkey" PRIMARY KEY, btree (a) -Publications: - "testpub_schemas" - -\d+ pub_test2.test_seq2; - Sequence "pub_test2.test_seq2" - Type | Start | Minimum | Maximum | Increment | Cycles? | Cache ---------+-------+---------+---------------------+-----------+---------+------- - bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 -Publications: - "testpub_schemas" - -\d+ pub_test2.test_tbl2; - Table "pub_test2.test_tbl2" - Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+---------+-----------+----------+---------+---------+--------------+------------- - a | integer | | not null | | plain | | - b | integer | | | | plain | | -Indexes: - "test_tbl2_pkey" PRIMARY KEY, btree (a) -Publications: - "testpub_schemas" - --- now drop the explicitly added objects again -ALTER PUBLICATION testpub_schemas DROP TABLE pub_test2.test_tbl2; -ALTER PUBLICATION testpub_schemas DROP SEQUENCE pub_test1.test_seq1; -\dRp+ testpub_schemas - Publication testpub_schemas - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f -Tables from schemas: - "pub_test1" -Sequences from schemas: - "pub_test2" - -\d+ pub_test1.test_seq1; - Sequence "pub_test1.test_seq1" - Type | Start | Minimum | Maximum | Increment | Cycles? | Cache ---------+-------+---------+---------------------+-----------+---------+------- - bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 - -\d+ pub_test1.test_tbl1; - Table "pub_test1.test_tbl1" - Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+---------+-----------+----------+---------+---------+--------------+------------- - a | integer | | not null | | plain | | - b | integer | | | | plain | | -Indexes: - "test_tbl1_pkey" PRIMARY KEY, btree (a) -Publications: - "testpub_schemas" - -\d+ pub_test2.test_seq2; - Sequence "pub_test2.test_seq2" - Type | Start | Minimum | Maximum | Increment | Cycles? | Cache ---------+-------+---------+---------------------+-----------+---------+------- - bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 -Publications: - "testpub_schemas" - -\d+ pub_test2.test_tbl2; - Table "pub_test2.test_tbl2" - Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+---------+-----------+----------+---------+---------+--------------+------------- - a | integer | | not null | | plain | | - b | integer | | | | plain | | -Indexes: - "test_tbl2_pkey" PRIMARY KEY, btree (a) - -DROP PUBLICATION testpub_schemas; -DROP TABLE pub_test1.test_tbl1, pub_test2.test_tbl2; -DROP SEQUENCE pub_test1.test_seq1, pub_test2.test_seq2; -DROP SCHEMA pub_test1, pub_test2; -- Tests for partitioned tables SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_forparted; @@ -731,10 +207,10 @@ UPDATE testpub_parted1 SET a = 1; -- only parent is listed as being in publication, not the partition ALTER PUBLICATION testpub_forparted ADD TABLE testpub_parted; \dRp+ testpub_forparted - Publication testpub_forparted - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub_forparted + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables: "public.testpub_parted" @@ -747,10 +223,10 @@ ALTER TABLE testpub_parted DETACH PARTITION testpub_parted1; UPDATE testpub_parted1 SET a = 1; ALTER PUBLICATION testpub_forparted SET (publish_via_partition_root = true); \dRp+ testpub_forparted - Publication testpub_forparted - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | t + Publication testpub_forparted + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | t Tables: "public.testpub_parted" @@ -779,10 +255,10 @@ SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub5 FOR TABLE testpub_rf_tbl1, testpub_rf_tbl2 WHERE (c <> 'test' AND d < 5) WITH (publish = 'insert'); RESET client_min_messages; \dRp+ testpub5 - Publication testpub5 - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | f | f | f | f | f + Publication testpub5 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | f | f | f | f Tables: "public.testpub_rf_tbl1" "public.testpub_rf_tbl2" WHERE ((c <> 'test'::text) AND (d < 5)) @@ -795,10 +271,10 @@ Tables: ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl3 WHERE (e > 1000 AND e < 2000); \dRp+ testpub5 - Publication testpub5 - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | f | f | f | f | f + Publication testpub5 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | f | f | f | f Tables: "public.testpub_rf_tbl1" "public.testpub_rf_tbl2" WHERE ((c <> 'test'::text) AND (d < 5)) @@ -814,10 +290,10 @@ Publications: ALTER PUBLICATION testpub5 DROP TABLE testpub_rf_tbl2; \dRp+ testpub5 - Publication testpub5 - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | f | f | f | f | f + Publication testpub5 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | f | f | f | f Tables: "public.testpub_rf_tbl1" "public.testpub_rf_tbl3" WHERE ((e > 1000) AND (e < 2000)) @@ -825,10 +301,10 @@ Tables: -- remove testpub_rf_tbl1 and add testpub_rf_tbl3 again (another WHERE expression) ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl3 WHERE (e > 300 AND e < 500); \dRp+ testpub5 - Publication testpub5 - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | f | f | f | f | f + Publication testpub5 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | f | f | f | f Tables: "public.testpub_rf_tbl3" WHERE ((e > 300) AND (e < 500)) @@ -861,10 +337,10 @@ SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_syntax1 FOR TABLE testpub_rf_tbl1, ONLY testpub_rf_tbl3 WHERE (e < 999) WITH (publish = 'insert'); RESET client_min_messages; \dRp+ testpub_syntax1 - Publication testpub_syntax1 - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | f | f | f | f | f + Publication testpub_syntax1 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | f | f | f | f Tables: "public.testpub_rf_tbl1" "public.testpub_rf_tbl3" WHERE (e < 999) @@ -874,10 +350,10 @@ SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_syntax2 FOR TABLE testpub_rf_tbl1, testpub_rf_schema1.testpub_rf_tbl5 WHERE (h < 999) WITH (publish = 'insert'); RESET client_min_messages; \dRp+ testpub_syntax2 - Publication testpub_syntax2 - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | f | f | f | f | f + Publication testpub_syntax2 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | f | f | f | f Tables: "public.testpub_rf_tbl1" "testpub_rf_schema1.testpub_rf_tbl5" WHERE (h < 999) @@ -1196,10 +672,10 @@ CREATE PUBLICATION testpub_table_ins WITH (publish = 'insert, truncate'); RESET client_min_messages; ALTER PUBLICATION testpub_table_ins ADD TABLE testpub_tbl5 (a); -- ok \dRp+ testpub_table_ins - Publication testpub_table_ins - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | f | f | t | f | f + Publication testpub_table_ins + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | f | f | t | f Tables: "public.testpub_tbl5" (a) @@ -1341,10 +817,10 @@ CREATE TABLE testpub_tbl_both_filters (a int, b int, c int, PRIMARY KEY (a,c)); ALTER TABLE testpub_tbl_both_filters REPLICA IDENTITY USING INDEX testpub_tbl_both_filters_pkey; ALTER PUBLICATION testpub_both_filters ADD TABLE testpub_tbl_both_filters (a,c) WHERE (c != 1); \dRp+ testpub_both_filters - Publication testpub_both_filters - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub_both_filters + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables: "public.testpub_tbl_both_filters" (a, c) WHERE (c <> 1) @@ -1545,10 +1021,10 @@ ERROR: relation "testpub_tbl1" is already member of publication "testpub_fortbl CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_tbl1; ERROR: publication "testpub_fortbl" already exists \dRp+ testpub_fortbl - Publication testpub_fortbl - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub_fortbl + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables: "pub_test.testpub_nopk" "public.testpub_tbl1" @@ -1586,10 +1062,10 @@ Publications: "testpub_fortbl" \dRp+ testpub_default - Publication testpub_default - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | f | t | f + Publication testpub_default + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | f | f Tables: "pub_test.testpub_nopk" "public.testpub_tbl1" @@ -1667,10 +1143,10 @@ REVOKE CREATE ON DATABASE regression FROM regress_publication_user2; DROP TABLE testpub_parted; DROP TABLE testpub_tbl1; \dRp+ testpub_default - Publication testpub_default - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | f | t | f + Publication testpub_default + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | f | f (1 row) -- fail - must be owner of publication @@ -1680,20 +1156,20 @@ ERROR: must be owner of publication testpub_default RESET ROLE; ALTER PUBLICATION testpub_default RENAME TO testpub_foo; \dRp testpub_foo - List of publications - Name | Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root --------------+--------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - testpub_foo | regress_publication_user | f | f | t | t | t | f | t | f + List of publications + Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +-------------+--------------------------+------------+---------+---------+---------+-----------+---------- + testpub_foo | regress_publication_user | f | t | t | t | f | f (1 row) -- rename back to keep the rest simple ALTER PUBLICATION testpub_foo RENAME TO testpub_default; ALTER PUBLICATION testpub_default OWNER TO regress_publication_user2; \dRp testpub_default - List of publications - Name | Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ------------------+---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - testpub_default | regress_publication_user2 | f | f | t | t | t | f | t | f + List of publications + Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +-----------------+---------------------------+------------+---------+---------+---------+-----------+---------- + testpub_default | regress_publication_user2 | f | t | t | t | f | f (1 row) -- adding schemas and tables @@ -1709,19 +1185,19 @@ CREATE TABLE "CURRENT_SCHEMA"."CURRENT_SCHEMA"(id int); SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub1_forschema FOR ALL TABLES IN SCHEMA pub_test1; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1" CREATE PUBLICATION testpub2_forschema FOR ALL TABLES IN SCHEMA pub_test1, pub_test2, pub_test3; \dRp+ testpub2_forschema - Publication testpub2_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub2_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1735,44 +1211,44 @@ CREATE PUBLICATION testpub6_forschema FOR ALL TABLES IN SCHEMA "CURRENT_SCHEMA", CREATE PUBLICATION testpub_fortable FOR TABLE "CURRENT_SCHEMA"."CURRENT_SCHEMA"; RESET client_min_messages; \dRp+ testpub3_forschema - Publication testpub3_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub3_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "public" \dRp+ testpub4_forschema - Publication testpub4_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub4_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "CURRENT_SCHEMA" \dRp+ testpub5_forschema - Publication testpub5_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub5_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "CURRENT_SCHEMA" "public" \dRp+ testpub6_forschema - Publication testpub6_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub6_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "CURRENT_SCHEMA" "public" \dRp+ testpub_fortable - Publication testpub_fortable - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub_fortable + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables: "CURRENT_SCHEMA.CURRENT_SCHEMA" @@ -1806,10 +1282,10 @@ ERROR: schema "testpub_view" does not exist -- dropping the schema should reflect the change in publication DROP SCHEMA pub_test3; \dRp+ testpub2_forschema - Publication testpub2_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub2_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1817,20 +1293,20 @@ Tables from schemas: -- renaming the schema should reflect the change in publication ALTER SCHEMA pub_test1 RENAME to pub_test1_renamed; \dRp+ testpub2_forschema - Publication testpub2_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub2_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1_renamed" "pub_test2" ALTER SCHEMA pub_test1_renamed RENAME to pub_test1; \dRp+ testpub2_forschema - Publication testpub2_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub2_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1838,10 +1314,10 @@ Tables from schemas: -- alter publication add schema ALTER PUBLICATION testpub1_forschema ADD ALL TABLES IN SCHEMA pub_test2; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1850,10 +1326,10 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema ADD ALL TABLES IN SCHEMA non_existent_schema; ERROR: schema "non_existent_schema" does not exist \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1862,10 +1338,10 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema ADD ALL TABLES IN SCHEMA pub_test1; ERROR: schema "pub_test1" is already member of publication "testpub1_forschema" \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1873,10 +1349,10 @@ Tables from schemas: -- alter publication drop schema ALTER PUBLICATION testpub1_forschema DROP ALL TABLES IN SCHEMA pub_test2; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1" @@ -1884,10 +1360,10 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema DROP ALL TABLES IN SCHEMA pub_test2; ERROR: tables from schema "pub_test2" are not part of the publication \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1" @@ -1895,29 +1371,29 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema DROP ALL TABLES IN SCHEMA non_existent_schema; ERROR: schema "non_existent_schema" does not exist \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1" -- drop all schemas ALTER PUBLICATION testpub1_forschema DROP ALL TABLES IN SCHEMA pub_test1; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f (1 row) -- alter publication set multiple schema ALTER PUBLICATION testpub1_forschema SET ALL TABLES IN SCHEMA pub_test1, pub_test2; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1926,10 +1402,10 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema SET ALL TABLES IN SCHEMA non_existent_schema; ERROR: schema "non_existent_schema" does not exist \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1938,10 +1414,10 @@ Tables from schemas: -- removing the duplicate schemas ALTER PUBLICATION testpub1_forschema SET ALL TABLES IN SCHEMA pub_test1, pub_test1; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1" @@ -2020,18 +1496,18 @@ SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub3_forschema; RESET client_min_messages; \dRp+ testpub3_forschema - Publication testpub3_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub3_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f (1 row) ALTER PUBLICATION testpub3_forschema SET ALL TABLES IN SCHEMA pub_test1; \dRp+ testpub3_forschema - Publication testpub3_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub3_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables from schemas: "pub_test1" @@ -2041,20 +1517,20 @@ CREATE PUBLICATION testpub_forschema_fortable FOR ALL TABLES IN SCHEMA pub_test1 CREATE PUBLICATION testpub_fortable_forschema FOR TABLE pub_test2.tbl1, ALL TABLES IN SCHEMA pub_test1; RESET client_min_messages; \dRp+ testpub_forschema_fortable - Publication testpub_forschema_fortable - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub_forschema_fortable + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables: "pub_test2.tbl1" Tables from schemas: "pub_test1" \dRp+ testpub_fortable_forschema - Publication testpub_fortable_forschema - Owner | All tables | All sequences | Inserts | Updates | Deletes | Truncates | Sequences | Via root ---------------------------+------------+---------------+---------+---------+---------+-----------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t | f + Publication testpub_fortable_forschema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f Tables: "pub_test2.tbl1" Tables from schemas: @@ -2098,85 +1574,40 @@ CREATE SCHEMA sch1; CREATE SCHEMA sch2; CREATE TABLE sch1.tbl1 (a int) PARTITION BY RANGE(a); CREATE TABLE sch2.tbl1_part1 PARTITION OF sch1.tbl1 FOR VALUES FROM (1) to (10); -CREATE SEQUENCE sch1.seq1; -CREATE SEQUENCE sch2.seq2; -- Schema publication that does not include the schema that has the parent table CREATE PUBLICATION pub FOR ALL TABLES IN SCHEMA sch2 WITH (PUBLISH_VIA_PARTITION_ROOT=1); -ALTER PUBLICATION pub ADD ALL SEQUENCES IN SCHEMA sch2; SELECT * FROM pg_publication_tables; pubname | schemaname | tablename ---------+------------+------------ pub | sch2 | tbl1_part1 (1 row) -SELECT * FROM pg_publication_sequences; - pubname | schemaname | sequencename ----------+------------+-------------- - pub | sch2 | seq2 -(1 row) - DROP PUBLICATION pub; -- Table publication that does not include the parent table CREATE PUBLICATION pub FOR TABLE sch2.tbl1_part1 WITH (PUBLISH_VIA_PARTITION_ROOT=1); -ALTER PUBLICATION pub ADD SEQUENCE sch2.seq2; SELECT * FROM pg_publication_tables; pubname | schemaname | tablename ---------+------------+------------ pub | sch2 | tbl1_part1 (1 row) -SELECT * FROM pg_publication_sequences; - pubname | schemaname | sequencename ----------+------------+-------------- - pub | sch2 | seq2 -(1 row) - -- Table publication that includes both the parent table and the child table ALTER PUBLICATION pub ADD TABLE sch1.tbl1; -ALTER PUBLICATION pub ADD SEQUENCE sch1.seq1; SELECT * FROM pg_publication_tables; pubname | schemaname | tablename ---------+------------+----------- pub | sch1 | tbl1 (1 row) -SELECT * FROM pg_publication_sequences; - pubname | schemaname | sequencename ----------+------------+-------------- - pub | sch1 | seq1 - pub | sch2 | seq2 -(2 rows) - DROP PUBLICATION pub; -- Schema publication that does not include the schema that has the parent table CREATE PUBLICATION pub FOR ALL TABLES IN SCHEMA sch2 WITH (PUBLISH_VIA_PARTITION_ROOT=0); -ALTER PUBLICATION pub ADD SEQUENCE sch1.seq1; SELECT * FROM pg_publication_tables; pubname | schemaname | tablename ---------+------------+------------ pub | sch2 | tbl1_part1 (1 row) -SELECT * FROM pg_publication_sequences; - pubname | schemaname | sequencename ----------+------------+-------------- - pub | sch1 | seq1 -(1 row) - -DROP PUBLICATION pub; --- Sequence publication -CREATE PUBLICATION pub FOR SEQUENCE sch2.seq2; -SELECT * FROM pg_publication_tables; - pubname | schemaname | tablename ----------+------------+----------- -(0 rows) - -SELECT * FROM pg_publication_sequences; - pubname | schemaname | sequencename ----------+------------+-------------- - pub | sch2 | seq2 -(1 row) - DROP PUBLICATION pub; -- Table publication that does not include the parent table CREATE PUBLICATION pub FOR TABLE sch2.tbl1_part1 WITH (PUBLISH_VIA_PARTITION_ROOT=0); @@ -2186,26 +1617,14 @@ SELECT * FROM pg_publication_tables; pub | sch2 | tbl1_part1 (1 row) -SELECT * FROM pg_publication_sequences; - pubname | schemaname | sequencename ----------+------------+-------------- -(0 rows) - -- Table publication that includes both the parent table and the child table ALTER PUBLICATION pub ADD TABLE sch1.tbl1; -ALTER PUBLICATION pub ADD ALL SEQUENCES IN SCHEMA sch2; SELECT * FROM pg_publication_tables; pubname | schemaname | tablename ---------+------------+------------ pub | sch2 | tbl1_part1 (1 row) -SELECT * FROM pg_publication_sequences; - pubname | schemaname | sequencename ----------+------------+-------------- - pub | sch2 | seq2 -(1 row) - DROP PUBLICATION pub; DROP TABLE sch2.tbl1_part1; DROP TABLE sch1.tbl1; @@ -2221,81 +1640,9 @@ SELECT * FROM pg_publication_tables; pub | sch1 | tbl1 (1 row) -SELECT * FROM pg_publication_sequences; - pubname | schemaname | sequencename ----------+------------+-------------- -(0 rows) - -DROP PUBLICATION pub; --- Schema publication -CREATE PUBLICATION pub FOR SEQUENCE sch2.seq2; -SELECT * FROM pg_publication_tables; - pubname | schemaname | tablename ----------+------------+----------- -(0 rows) - -SELECT * FROM pg_publication_sequences; - pubname | schemaname | sequencename ----------+------------+-------------- - pub | sch2 | seq2 -(1 row) - -DROP PUBLICATION pub; --- Sequence publication -CREATE PUBLICATION pub FOR ALL SEQUENCES IN SCHEMA sch2; -SELECT * FROM pg_publication_tables; - pubname | schemaname | tablename ----------+------------+----------- -(0 rows) - -SELECT * FROM pg_publication_sequences; - pubname | schemaname | sequencename ----------+------------+-------------- - pub | sch2 | seq2 -(1 row) - -ALTER PUBLICATION pub ADD SEQUENCE sch1.seq1; -SELECT * FROM pg_publication_tables; - pubname | schemaname | tablename ----------+------------+----------- -(0 rows) - -SELECT * FROM pg_publication_sequences; - pubname | schemaname | sequencename ----------+------------+-------------- - pub | sch1 | seq1 - pub | sch2 | seq2 -(2 rows) - -ALTER PUBLICATION pub DROP SEQUENCE sch1.seq1; -SELECT * FROM pg_publication_tables; - pubname | schemaname | tablename ----------+------------+----------- -(0 rows) - -SELECT * FROM pg_publication_sequences; - pubname | schemaname | sequencename ----------+------------+-------------- - pub | sch2 | seq2 -(1 row) - -ALTER PUBLICATION pub ADD ALL SEQUENCES IN SCHEMA sch1; -SELECT * FROM pg_publication_tables; - pubname | schemaname | tablename ----------+------------+----------- -(0 rows) - -SELECT * FROM pg_publication_sequences; - pubname | schemaname | sequencename ----------+------------+-------------- - pub | sch1 | seq1 - pub | sch2 | seq2 -(2 rows) - RESET client_min_messages; DROP PUBLICATION pub; DROP TABLE sch1.tbl1; -DROP SEQUENCE sch1.seq1, sch2.seq2; DROP SCHEMA sch1 cascade; DROP SCHEMA sch2 cascade; RESET SESSION AUTHORIZATION; diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index db652ea8d8..f29375c2a9 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -1435,14 +1435,6 @@ pg_prepared_xacts| SELECT p.transaction, FROM ((pg_prepared_xact() p(transaction, gid, prepared, ownerid, dbid) LEFT JOIN pg_authid u ON ((p.ownerid = u.oid))) LEFT JOIN pg_database d ON ((p.dbid = d.oid))); -pg_publication_sequences| SELECT p.pubname, - n.nspname AS schemaname, - c.relname AS sequencename - FROM pg_publication p, - LATERAL pg_get_publication_sequences((p.pubname)::text) gps(relid), - (pg_class c - JOIN pg_namespace n ON ((n.oid = c.relnamespace))) - WHERE (c.oid = gps.relid); pg_publication_tables| SELECT p.pubname, n.nspname AS schemaname, c.relname AS tablename diff --git a/src/test/regress/sql/object_address.sql b/src/test/regress/sql/object_address.sql index 9d8323468d..acd0468a9d 100644 --- a/src/test/regress/sql/object_address.sql +++ b/src/test/regress/sql/object_address.sql @@ -49,7 +49,6 @@ CREATE TRANSFORM FOR int LANGUAGE SQL ( SET client_min_messages = 'ERROR'; CREATE PUBLICATION addr_pub FOR TABLE addr_nsp.gentable; CREATE PUBLICATION addr_pub_schema FOR ALL TABLES IN SCHEMA addr_nsp; -CREATE PUBLICATION addr_pub_schema2 FOR ALL SEQUENCES IN SCHEMA addr_nsp; RESET client_min_messages; CREATE SUBSCRIPTION regress_addr_sub CONNECTION '' PUBLICATION bar WITH (connect = false, slot_name = NONE); CREATE STATISTICS addr_nsp.gentable_stat ON a, b FROM addr_nsp.gentable; @@ -199,8 +198,7 @@ WITH objects (type, name, args) AS (VALUES ('transform', '{int}', '{sql}'), ('access method', '{btree}', '{}'), ('publication', '{addr_pub}', '{}'), - ('publication namespace', '{addr_nsp}', '{addr_pub_schema,t}'), - ('publication namespace', '{addr_nsp}', '{addr_pub_schema2,s}'), + ('publication namespace', '{addr_nsp}', '{addr_pub_schema}'), ('publication relation', '{addr_nsp, gentable}', '{addr_pub}'), ('subscription', '{regress_addr_sub}', '{}'), ('statistics object', '{addr_nsp, gentable_stat}', '{}') @@ -220,7 +218,6 @@ SELECT (pg_identify_object(addr1.classid, addr1.objid, addr1.objsubid)).*, DROP FOREIGN DATA WRAPPER addr_fdw CASCADE; DROP PUBLICATION addr_pub; DROP PUBLICATION addr_pub_schema; -DROP PUBLICATION addr_pub_schema2; DROP SUBSCRIPTION regress_addr_sub; DROP SCHEMA addr_nsp CASCADE; diff --git a/src/test/regress/sql/publication.sql b/src/test/regress/sql/publication.sql index 96b02947fa..8539110025 100644 --- a/src/test/regress/sql/publication.sql +++ b/src/test/regress/sql/publication.sql @@ -27,7 +27,7 @@ CREATE PUBLICATION testpub_xxx WITH (publish_via_partition_root = 'true', publis \dRp -ALTER PUBLICATION testpub_default SET (publish = 'insert, update, delete, sequence'); +ALTER PUBLICATION testpub_default SET (publish = 'insert, update, delete'); \dRp @@ -46,8 +46,6 @@ ALTER PUBLICATION testpub_foralltables SET (publish = 'insert, update'); CREATE TABLE testpub_tbl2 (id serial primary key, data text); -- fail - can't add to for all tables publication ALTER PUBLICATION testpub_foralltables ADD TABLE testpub_tbl2; --- fail - can't add a table using ADD SEQUENCE command -ALTER PUBLICATION testpub_foralltables ADD SEQUENCE testpub_tbl2; -- fail - can't drop from all tables publication ALTER PUBLICATION testpub_foralltables DROP TABLE testpub_tbl2; -- fail - can't add to for all tables publication @@ -106,199 +104,6 @@ RESET client_min_messages; DROP TABLE testpub_tbl3, testpub_tbl3a; DROP PUBLICATION testpub3, testpub4; ---- adding sequences -CREATE SEQUENCE testpub_seq0; -CREATE SEQUENCE pub_test.testpub_seq1; - -SET client_min_messages = 'ERROR'; -CREATE PUBLICATION testpub_forallsequences FOR ALL SEQUENCES WITH (publish = 'sequence'); -RESET client_min_messages; -ALTER PUBLICATION testpub_forallsequences SET (publish = 'insert, sequence'); - -CREATE SEQUENCE testpub_seq2; --- fail - can't add to for all sequences publication -ALTER PUBLICATION testpub_forallsequences ADD SEQUENCE testpub_seq2; --- fail - can't drop from all sequences publication -ALTER PUBLICATION testpub_forallsequences DROP SEQUENCE testpub_seq2; --- fail - can't add to for all sequences publication -ALTER PUBLICATION testpub_forallsequences SET SEQUENCE pub_test.testpub_seq1; - --- fail - can't add schema to 'FOR ALL SEQUENCES' publication -ALTER PUBLICATION testpub_forallsequences ADD ALL SEQUENCES IN SCHEMA pub_test; --- fail - can't drop schema from 'FOR ALL SEQUENCES' publication -ALTER PUBLICATION testpub_forallsequences DROP ALL SEQUENCES IN SCHEMA pub_test; --- fail - can't set schema to 'FOR ALL SEQUENCES' publication -ALTER PUBLICATION testpub_forallsequences SET ALL SEQUENCES IN SCHEMA pub_test; - -SET client_min_messages = 'ERROR'; -CREATE PUBLICATION testpub_forsequence FOR SEQUENCE testpub_seq0; -RESET client_min_messages; --- should be able to add schema to 'FOR SEQUENCE' publication -ALTER PUBLICATION testpub_forsequence ADD ALL SEQUENCES IN SCHEMA pub_test; -\dRp+ testpub_forsequence --- fail - can't add sequence from the schema we already added -ALTER PUBLICATION testpub_forsequence ADD SEQUENCE pub_test.testpub_seq1; --- fail - can't add sequence using ADD TABLE command -ALTER PUBLICATION testpub_forsequence ADD TABLE pub_test.testpub_seq1; --- should be able to drop schema from 'FOR SEQUENCE' publication -ALTER PUBLICATION testpub_forsequence DROP ALL SEQUENCES IN SCHEMA pub_test; -\dRp+ testpub_forsequence --- should be able to set schema to 'FOR SEQUENCE' publication -ALTER PUBLICATION testpub_forsequence SET ALL SEQUENCES IN SCHEMA pub_test; -\dRp+ testpub_forsequence - -SET client_min_messages = 'ERROR'; -CREATE PUBLICATION testpub_forschema FOR ALL SEQUENCES IN SCHEMA pub_test; -RESET client_min_messages; --- fail - can't create publication with schema and sequence of the same schema -CREATE PUBLICATION testpub_for_seq_schema FOR ALL SEQUENCES IN SCHEMA pub_test, SEQUENCE pub_test.testpub_seq1; --- fail - can't add a sequence of the same schema to the schema publication -ALTER PUBLICATION testpub_forschema ADD SEQUENCE pub_test.testpub_seq1; --- fail - can't drop a sequence from the schema publication which isn't in the --- publication -ALTER PUBLICATION testpub_forschema DROP SEQUENCE pub_test.testpub_seq1; --- should be able to set sequence to schema publication -ALTER PUBLICATION testpub_forschema SET SEQUENCE pub_test.testpub_seq1; -\dRp+ testpub_forschema - -SELECT pubname, puballtables, puballsequences FROM pg_publication WHERE pubname = 'testpub_forallsequences'; -\d+ pub_test.testpub_seq1 -\dRp+ testpub_forallsequences -DROP SEQUENCE testpub_seq0, pub_test.testpub_seq1, testpub_seq2; -DROP PUBLICATION testpub_forallsequences, testpub_forsequence, testpub_forschema; - - --- publication testing multiple sequences at the same time -CREATE SEQUENCE testpub_seq1; -CREATE SEQUENCE testpub_seq2; - -SET client_min_messages = 'ERROR'; -CREATE PUBLICATION testpub_multi FOR SEQUENCE testpub_seq1, testpub_seq2; -RESET client_min_messages; - -\dRp+ testpub_multi - -DROP PUBLICATION testpub_multi; -DROP SEQUENCE testpub_seq1; -DROP SEQUENCE testpub_seq2; - - --- Publication mixing tables and sequences -SET client_min_messages = 'ERROR'; -CREATE PUBLICATION testpub_mix; -RESET client_min_messages; - -CREATE SEQUENCE testpub_seq1; -CREATE SEQUENCE pub_test.testpub_seq2; - -ALTER PUBLICATION testpub_mix ADD SEQUENCE testpub_seq1, TABLE testpub_tbl1; -\dRp+ testpub_mix - -ALTER PUBLICATION testpub_mix ADD ALL SEQUENCES IN SCHEMA pub_test, ALL TABLES IN SCHEMA pub_test; -\dRp+ testpub_mix - -ALTER PUBLICATION testpub_mix DROP ALL SEQUENCES IN SCHEMA pub_test; -\dRp+ testpub_mix - -ALTER PUBLICATION testpub_mix DROP ALL TABLES IN SCHEMA pub_test; -\dRp+ testpub_mix - -DROP PUBLICATION testpub_mix; -DROP SEQUENCE testpub_seq1; -DROP SEQUENCE pub_test.testpub_seq2; - - --- make sure we replicate only the correct relation type -CREATE SCHEMA pub_test1; -CREATE SEQUENCE pub_test1.test_seq1; -CREATE TABLE pub_test1.test_tbl1 (a int primary key, b int); - -CREATE SCHEMA pub_test2; -CREATE SEQUENCE pub_test2.test_seq2; -CREATE TABLE pub_test2.test_tbl2 (a int primary key, b int); - -SET client_min_messages = 'ERROR'; -CREATE PUBLICATION testpub_schemas; -RESET client_min_messages; - --- add tables from one schema, sequences from the other -ALTER PUBLICATION testpub_schemas ADD ALL TABLES IN SCHEMA pub_test2; -ALTER PUBLICATION testpub_schemas ADD ALL SEQUENCES IN SCHEMA pub_test1; - -\dRp+ testpub_schemas - -\dn+ pub_test1 -\dn+ pub_test2 - -\d+ pub_test1.test_seq1; -\d+ pub_test1.test_tbl1; - -\d+ pub_test2.test_seq2; -\d+ pub_test2.test_tbl2; - --- add the other object type from each schema -ALTER PUBLICATION testpub_schemas ADD ALL TABLES IN SCHEMA pub_test1; -ALTER PUBLICATION testpub_schemas ADD ALL SEQUENCES IN SCHEMA pub_test2; - -\dRp+ testpub_schemas - -\dn+ pub_test1 -\dn+ pub_test2 - -\d+ pub_test1.test_seq1; -\d+ pub_test1.test_tbl1; - -\d+ pub_test2.test_seq2; -\d+ pub_test2.test_tbl2; - --- now drop the object type added first -ALTER PUBLICATION testpub_schemas DROP ALL TABLES IN SCHEMA pub_test2; -ALTER PUBLICATION testpub_schemas DROP ALL SEQUENCES IN SCHEMA pub_test1; - -\dRp+ testpub_schemas - -\dn+ pub_test1 -\dn+ pub_test2 - -\d+ pub_test1.test_seq1; -\d+ pub_test1.test_tbl1; - -\d+ pub_test2.test_seq2; -\d+ pub_test2.test_tbl2; - --- should fail (publication contains the whole schema) -ALTER PUBLICATION testpub_schemas ADD TABLE pub_test1.test_tbl1; -ALTER PUBLICATION testpub_schemas ADD SEQUENCE pub_test2.test_seq2; - --- should work (different schema) -ALTER PUBLICATION testpub_schemas ADD TABLE pub_test2.test_tbl2; -ALTER PUBLICATION testpub_schemas ADD SEQUENCE pub_test1.test_seq1; - -\dRp+ testpub_schemas - -\d+ pub_test1.test_seq1; -\d+ pub_test1.test_tbl1; - -\d+ pub_test2.test_seq2; -\d+ pub_test2.test_tbl2; - --- now drop the explicitly added objects again -ALTER PUBLICATION testpub_schemas DROP TABLE pub_test2.test_tbl2; -ALTER PUBLICATION testpub_schemas DROP SEQUENCE pub_test1.test_seq1; - -\dRp+ testpub_schemas - -\d+ pub_test1.test_seq1; -\d+ pub_test1.test_tbl1; - -\d+ pub_test2.test_seq2; -\d+ pub_test2.test_tbl2; - -DROP PUBLICATION testpub_schemas; -DROP TABLE pub_test1.test_tbl1, pub_test2.test_tbl2; -DROP SEQUENCE pub_test1.test_seq1, pub_test2.test_seq2; -DROP SCHEMA pub_test1, pub_test2; - -- Tests for partitioned tables SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_forparted; @@ -1199,51 +1004,32 @@ CREATE SCHEMA sch1; CREATE SCHEMA sch2; CREATE TABLE sch1.tbl1 (a int) PARTITION BY RANGE(a); CREATE TABLE sch2.tbl1_part1 PARTITION OF sch1.tbl1 FOR VALUES FROM (1) to (10); -CREATE SEQUENCE sch1.seq1; -CREATE SEQUENCE sch2.seq2; -- Schema publication that does not include the schema that has the parent table CREATE PUBLICATION pub FOR ALL TABLES IN SCHEMA sch2 WITH (PUBLISH_VIA_PARTITION_ROOT=1); -ALTER PUBLICATION pub ADD ALL SEQUENCES IN SCHEMA sch2; SELECT * FROM pg_publication_tables; -SELECT * FROM pg_publication_sequences; DROP PUBLICATION pub; -- Table publication that does not include the parent table CREATE PUBLICATION pub FOR TABLE sch2.tbl1_part1 WITH (PUBLISH_VIA_PARTITION_ROOT=1); -ALTER PUBLICATION pub ADD SEQUENCE sch2.seq2; SELECT * FROM pg_publication_tables; -SELECT * FROM pg_publication_sequences; -- Table publication that includes both the parent table and the child table ALTER PUBLICATION pub ADD TABLE sch1.tbl1; -ALTER PUBLICATION pub ADD SEQUENCE sch1.seq1; SELECT * FROM pg_publication_tables; -SELECT * FROM pg_publication_sequences; DROP PUBLICATION pub; -- Schema publication that does not include the schema that has the parent table CREATE PUBLICATION pub FOR ALL TABLES IN SCHEMA sch2 WITH (PUBLISH_VIA_PARTITION_ROOT=0); -ALTER PUBLICATION pub ADD SEQUENCE sch1.seq1; -SELECT * FROM pg_publication_tables; -SELECT * FROM pg_publication_sequences; - -DROP PUBLICATION pub; --- Sequence publication -CREATE PUBLICATION pub FOR SEQUENCE sch2.seq2; SELECT * FROM pg_publication_tables; -SELECT * FROM pg_publication_sequences; DROP PUBLICATION pub; -- Table publication that does not include the parent table CREATE PUBLICATION pub FOR TABLE sch2.tbl1_part1 WITH (PUBLISH_VIA_PARTITION_ROOT=0); SELECT * FROM pg_publication_tables; -SELECT * FROM pg_publication_sequences; -- Table publication that includes both the parent table and the child table ALTER PUBLICATION pub ADD TABLE sch1.tbl1; -ALTER PUBLICATION pub ADD ALL SEQUENCES IN SCHEMA sch2; SELECT * FROM pg_publication_tables; -SELECT * FROM pg_publication_sequences; DROP PUBLICATION pub; DROP TABLE sch2.tbl1_part1; @@ -1256,36 +1042,10 @@ CREATE TABLE sch1.tbl1_part3 (a int) PARTITION BY RANGE(a); ALTER TABLE sch1.tbl1 ATTACH PARTITION sch1.tbl1_part3 FOR VALUES FROM (20) to (30); CREATE PUBLICATION pub FOR ALL TABLES IN SCHEMA sch1 WITH (PUBLISH_VIA_PARTITION_ROOT=1); SELECT * FROM pg_publication_tables; -SELECT * FROM pg_publication_sequences; - -DROP PUBLICATION pub; --- Schema publication -CREATE PUBLICATION pub FOR SEQUENCE sch2.seq2; -SELECT * FROM pg_publication_tables; -SELECT * FROM pg_publication_sequences; - -DROP PUBLICATION pub; --- Sequence publication -CREATE PUBLICATION pub FOR ALL SEQUENCES IN SCHEMA sch2; -SELECT * FROM pg_publication_tables; -SELECT * FROM pg_publication_sequences; - -ALTER PUBLICATION pub ADD SEQUENCE sch1.seq1; -SELECT * FROM pg_publication_tables; -SELECT * FROM pg_publication_sequences; - -ALTER PUBLICATION pub DROP SEQUENCE sch1.seq1; -SELECT * FROM pg_publication_tables; -SELECT * FROM pg_publication_sequences; - -ALTER PUBLICATION pub ADD ALL SEQUENCES IN SCHEMA sch1; -SELECT * FROM pg_publication_tables; -SELECT * FROM pg_publication_sequences; RESET client_min_messages; DROP PUBLICATION pub; DROP TABLE sch1.tbl1; -DROP SEQUENCE sch1.seq1, sch2.seq2; DROP SCHEMA sch1 cascade; DROP SCHEMA sch2 cascade; diff --git a/src/test/subscription/t/030_sequences.pl b/src/test/subscription/t/030_sequences.pl deleted file mode 100644 index 9ae3c03d7d..0000000000 --- a/src/test/subscription/t/030_sequences.pl +++ /dev/null @@ -1,202 +0,0 @@ - -# Copyright (c) 2021, PostgreSQL Global Development Group - -# This tests that sequences are replicated correctly by logical replication -use strict; -use warnings; -use PostgreSQL::Test::Cluster; -use PostgreSQL::Test::Utils; -use Test::More; - -# Initialize publisher node -my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); -$node_publisher->init(allows_streaming => 'logical'); -$node_publisher->start; - -# Create subscriber node -my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); -$node_subscriber->start; - -# Create some preexisting content on publisher -my $ddl = qq( - CREATE TABLE seq_test (v BIGINT); - CREATE SEQUENCE s; -); - -# Setup structure on the publisher -$node_publisher->safe_psql('postgres', $ddl); - -# Create some the same structure on subscriber, and an extra sequence that -# we'll create on the publisher later -$ddl = qq( - CREATE TABLE seq_test (v BIGINT); - CREATE SEQUENCE s; - CREATE SEQUENCE s2; -); - -$node_subscriber->safe_psql('postgres', $ddl); - -# Setup logical replication -my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; -$node_publisher->safe_psql('postgres', - "CREATE PUBLICATION seq_pub"); - -$node_publisher->safe_psql('postgres', - "ALTER PUBLICATION seq_pub ADD SEQUENCE s"); - -$node_subscriber->safe_psql('postgres', - "CREATE SUBSCRIPTION seq_sub CONNECTION '$publisher_connstr' PUBLICATION seq_pub" -); - -$node_publisher->wait_for_catchup('seq_sub'); - -# Wait for initial sync to finish as well -my $synced_query = - "SELECT count(1) = 0 FROM pg_subscription_rel WHERE srsubstate NOT IN ('s', 'r');"; -$node_subscriber->poll_query_until('postgres', $synced_query) - or die "Timed out while waiting for subscriber to synchronize data"; - -# Insert initial test data -$node_publisher->safe_psql( - 'postgres', qq( - -- generate a number of values using the sequence - INSERT INTO seq_test SELECT nextval('s') FROM generate_series(1,100); -)); - -$node_publisher->wait_for_catchup('seq_sub'); - -# Check the data on subscriber -my $result = $node_subscriber->safe_psql( - 'postgres', qq( - SELECT * FROM s; -)); - -is( $result, '132|0|t', - 'initial test data replicated'); - - -# advance the sequence in a rolled-back transaction - the rollback -# does not wait for the replication, so we could see any intermediate state -# so do something else after the test, to ensure we wait for everything -$node_publisher->safe_psql( - 'postgres', qq( - BEGIN; - INSERT INTO seq_test SELECT nextval('s') FROM generate_series(1,100); - ROLLBACK; - INSERT INTO seq_test VALUES (-1); -)); - -$node_publisher->wait_for_catchup('seq_sub'); - -# Check the data on subscriber -$result = $node_subscriber->safe_psql( - 'postgres', qq( - SELECT * FROM s; -)); - -is( $result, '231|0|t', - 'advance sequence in rolled-back transaction'); - - -# create a new sequence and roll it back - should not be replicated, due to -# the transactional behavior -$node_publisher->safe_psql( - 'postgres', qq( - BEGIN; - CREATE SEQUENCE s2; - ALTER PUBLICATION seq_pub ADD SEQUENCE s2; - INSERT INTO seq_test SELECT nextval('s2') FROM generate_series(1,100); - ROLLBACK; -)); - -$node_publisher->wait_for_catchup('seq_sub'); - -# Check the data on subscriber -$result = $node_subscriber->safe_psql( - 'postgres', qq( - SELECT * FROM s2; -)); - -is( $result, '1|0|f', - 'create new sequence and roll it back'); - - -# create a new sequence, advance it in a rolled-back transaction, but commit -# the create - the advance should be replicated nevertheless -$node_publisher->safe_psql( - 'postgres', qq( - BEGIN; - CREATE SEQUENCE s2; - ALTER PUBLICATION seq_pub ADD SEQUENCE s2; - SAVEPOINT sp1; - INSERT INTO seq_test SELECT nextval('s2') FROM generate_series(1,100); - ROLLBACK TO sp1; - COMMIT; -)); - -$node_publisher->wait_for_catchup('seq_sub'); - -# Wait for sync of the second sequence we just added to finish -$synced_query = - "SELECT count(1) = 0 FROM pg_subscription_rel WHERE srsubstate NOT IN ('s', 'r');"; -$node_subscriber->poll_query_until('postgres', $synced_query) - or die "Timed out while waiting for subscriber to synchronize data"; - -# Check the data on subscriber -$result = $node_subscriber->safe_psql( - 'postgres', qq( - SELECT * FROM s2; -)); - -is( $result, '132|0|t', - 'create sequence, advance it in rolled-back transaction, but commit the create'); - - -# advance the new sequence in a transaction, and roll it back - the rollback -# does not wait for the replication, so we could see any intermediate state -# so do something else after the test, to ensure we wait for everything -$node_publisher->safe_psql( - 'postgres', qq( - BEGIN; - INSERT INTO seq_test SELECT nextval('s2') FROM generate_series(1,100); - ROLLBACK; - INSERT INTO seq_test VALUES (-1); -)); - -$node_publisher->wait_for_catchup('seq_sub'); - -# Check the data on subscriber -$result = $node_subscriber->safe_psql( - 'postgres', qq( - SELECT * FROM s2; -)); - -is( $result, '231|0|t', - 'advance the new sequence in a transaction and roll it back'); - - -# advance the sequence in a subtransaction - the subtransaction gets rolled -# back, but commit the main one - the changes should still be replicated -$node_publisher->safe_psql( - 'postgres', qq( - BEGIN; - SAVEPOINT s1; - INSERT INTO seq_test SELECT nextval('s2') FROM generate_series(1,100); - ROLLBACK TO s1; - COMMIT; -)); - -$node_publisher->wait_for_catchup('seq_sub'); - -# Check the data on subscriber -$result = $node_subscriber->safe_psql( - 'postgres', qq( - SELECT * FROM s2; -)); - -is( $result, '330|0|t', - 'advance sequence in a subtransaction'); - - -done_testing(); From 00cb86e75d6dd13a8bc07f79c2cdbe20d96c2d92 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 7 Apr 2022 19:57:29 +0200 Subject: [PATCH 435/772] Add isolation tests for snapshot behavior in ri_triggers.c They are to check the behavior of RI_FKey_check() and ri_Check_Pk_Match(). A test case whereby RI_FKey_check() queries a partitioned PK table under REPEATABLE READ isolation produces wrong output due to a bug of the partition-descriptor logic and that is noted as such in the comment in the test. A subsequent commit will fix the bug and replace the buggy output by the correct one. Author: Amit Langote Discussion: https://postgr.es/m/1627848.1636676261@sss.pgh.pa.us --- src/test/isolation/expected/fk-snapshot.out | 124 ++++++++++++++++++++ src/test/isolation/isolation_schedule | 1 + src/test/isolation/specs/fk-snapshot.spec | 61 ++++++++++ 3 files changed, 186 insertions(+) create mode 100644 src/test/isolation/expected/fk-snapshot.out create mode 100644 src/test/isolation/specs/fk-snapshot.spec diff --git a/src/test/isolation/expected/fk-snapshot.out b/src/test/isolation/expected/fk-snapshot.out new file mode 100644 index 0000000000..5faf80d6ce --- /dev/null +++ b/src/test/isolation/expected/fk-snapshot.out @@ -0,0 +1,124 @@ +Parsed test spec with 2 sessions + +starting permutation: s1brr s2brc s2ip2 s1sp s2c s1sp s1ifp2 s1c s1sfp +step s1brr: BEGIN ISOLATION LEVEL REPEATABLE READ; +step s2brc: BEGIN ISOLATION LEVEL READ COMMITTED; +step s2ip2: INSERT INTO pk_noparted VALUES (2); +step s1sp: SELECT * FROM pk_noparted; +a +- +1 +(1 row) + +step s2c: COMMIT; +step s1sp: SELECT * FROM pk_noparted; +a +- +1 +(1 row) + +step s1ifp2: INSERT INTO fk_parted_pk VALUES (2); +ERROR: insert or update on table "fk_parted_pk_2" violates foreign key constraint "fk_parted_pk_a_fkey" +step s1c: COMMIT; +step s1sfp: SELECT * FROM fk_parted_pk; +a +- +1 +(1 row) + + +starting permutation: s2ip2 s2brr s1brc s1ifp2 s2sfp s1c s2sfp s2ifn2 s2c s2sfn +step s2ip2: INSERT INTO pk_noparted VALUES (2); +step s2brr: BEGIN ISOLATION LEVEL REPEATABLE READ; +step s1brc: BEGIN ISOLATION LEVEL READ COMMITTED; +step s1ifp2: INSERT INTO fk_parted_pk VALUES (2); +step s2sfp: SELECT * FROM fk_parted_pk; +a +- +1 +(1 row) + +step s1c: COMMIT; +step s2sfp: SELECT * FROM fk_parted_pk; +a +- +1 +(1 row) + +step s2ifn2: INSERT INTO fk_noparted VALUES (2); +step s2c: COMMIT; +step s2sfn: SELECT * FROM fk_noparted; +a +- +1 +2 +(2 rows) + + +starting permutation: s1brc s2brc s2ip2 s1sp s2c s1sp s1ifp2 s2brc s2sfp s1c s1sfp s2ifn2 s2c s2sfn +step s1brc: BEGIN ISOLATION LEVEL READ COMMITTED; +step s2brc: BEGIN ISOLATION LEVEL READ COMMITTED; +step s2ip2: INSERT INTO pk_noparted VALUES (2); +step s1sp: SELECT * FROM pk_noparted; +a +- +1 +(1 row) + +step s2c: COMMIT; +step s1sp: SELECT * FROM pk_noparted; +a +- +1 +2 +(2 rows) + +step s1ifp2: INSERT INTO fk_parted_pk VALUES (2); +step s2brc: BEGIN ISOLATION LEVEL READ COMMITTED; +step s2sfp: SELECT * FROM fk_parted_pk; +a +- +1 +(1 row) + +step s1c: COMMIT; +step s1sfp: SELECT * FROM fk_parted_pk; +a +- +1 +2 +(2 rows) + +step s2ifn2: INSERT INTO fk_noparted VALUES (2); +step s2c: COMMIT; +step s2sfn: SELECT * FROM fk_noparted; +a +- +1 +2 +(2 rows) + + +starting permutation: s1brr s1dfp s1ifp1 s1c s1sfn +step s1brr: BEGIN ISOLATION LEVEL REPEATABLE READ; +step s1dfp: DELETE FROM fk_parted_pk WHERE a = 1; +step s1ifp1: INSERT INTO fk_parted_pk VALUES (1); +step s1c: COMMIT; +step s1sfn: SELECT * FROM fk_noparted; +a +- +1 +(1 row) + + +starting permutation: s1brc s1dfp s1ifp1 s1c s1sfn +step s1brc: BEGIN ISOLATION LEVEL READ COMMITTED; +step s1dfp: DELETE FROM fk_parted_pk WHERE a = 1; +step s1ifp1: INSERT INTO fk_parted_pk VALUES (1); +step s1c: COMMIT; +step s1sfn: SELECT * FROM fk_noparted; +a +- +1 +(1 row) + diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule index c3066a6748..607760386e 100644 --- a/src/test/isolation/isolation_schedule +++ b/src/test/isolation/isolation_schedule @@ -33,6 +33,7 @@ test: fk-deadlock test: fk-deadlock2 test: fk-partitioned-1 test: fk-partitioned-2 +test: fk-snapshot test: eval-plan-qual test: eval-plan-qual-trigger test: lock-update-delete diff --git a/src/test/isolation/specs/fk-snapshot.spec b/src/test/isolation/specs/fk-snapshot.spec new file mode 100644 index 0000000000..378507fbc3 --- /dev/null +++ b/src/test/isolation/specs/fk-snapshot.spec @@ -0,0 +1,61 @@ +setup +{ + CREATE TABLE pk_noparted ( + a int PRIMARY KEY + ); + + CREATE TABLE fk_parted_pk ( + a int PRIMARY KEY REFERENCES pk_noparted ON DELETE CASCADE + ) PARTITION BY LIST (a); + CREATE TABLE fk_parted_pk_1 PARTITION OF fk_parted_pk FOR VALUES IN (1); + CREATE TABLE fk_parted_pk_2 PARTITION OF fk_parted_pk FOR VALUES IN (2); + + CREATE TABLE fk_noparted ( + a int REFERENCES fk_parted_pk ON DELETE NO ACTION INITIALLY DEFERRED + ); + INSERT INTO pk_noparted VALUES (1); + INSERT INTO fk_parted_pk VALUES (1); + INSERT INTO fk_noparted VALUES (1); +} + +teardown +{ + DROP TABLE pk_noparted, fk_parted_pk, fk_noparted; +} + +session s1 +step s1brr { BEGIN ISOLATION LEVEL REPEATABLE READ; } +step s1brc { BEGIN ISOLATION LEVEL READ COMMITTED; } +step s1ifp2 { INSERT INTO fk_parted_pk VALUES (2); } +step s1ifp1 { INSERT INTO fk_parted_pk VALUES (1); } +step s1dfp { DELETE FROM fk_parted_pk WHERE a = 1; } +step s1c { COMMIT; } +step s1sfp { SELECT * FROM fk_parted_pk; } +step s1sp { SELECT * FROM pk_noparted; } +step s1sfn { SELECT * FROM fk_noparted; } + +session s2 +step s2brr { BEGIN ISOLATION LEVEL REPEATABLE READ; } +step s2brc { BEGIN ISOLATION LEVEL READ COMMITTED; } +step s2ip2 { INSERT INTO pk_noparted VALUES (2); } +step s2ifn2 { INSERT INTO fk_noparted VALUES (2); } +step s2c { COMMIT; } +step s2sfp { SELECT * FROM fk_parted_pk; } +step s2sfn { SELECT * FROM fk_noparted; } + +# inserting into referencing tables in transaction-snapshot mode +# PK table is non-partitioned +permutation s1brr s2brc s2ip2 s1sp s2c s1sp s1ifp2 s1c s1sfp +# PK table is partitioned: buggy, because s2's serialization transaction can +# see the uncommitted row thanks to the latest snapshot taken for +# partition lookup to work correctly also ends up getting used by the PK index +# scan +permutation s2ip2 s2brr s1brc s1ifp2 s2sfp s1c s2sfp s2ifn2 s2c s2sfn + +# inserting into referencing tables in up-to-date snapshot mode +permutation s1brc s2brc s2ip2 s1sp s2c s1sp s1ifp2 s2brc s2sfp s1c s1sfp s2ifn2 s2c s2sfn + +# deleting a referenced row and then inserting again in the same transaction; works +# the same no matter the snapshot mode +permutation s1brr s1dfp s1ifp1 s1c s1sfn +permutation s1brc s1dfp s1ifp1 s1c s1sfn From dbe29b0d2c96f34b3f3222c6fc1710fcff065f18 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 7 Apr 2022 11:54:51 -0700 Subject: [PATCH 436/772] Fix test instability introduced in e349c95d3e9 due to async deduplication. The statement emitting notifies tried to make sure page boundaries were crossed, but failed to do so reliably due to deduplication. Reported-By: chap@anastigmatix.net Discussion: https://postgr.es/m/20220407185408.n7dvsgqsb3q6uze7@alap3.anarazel.de --- src/test/isolation/expected/stats.out | 22 +++++++++++----------- src/test/isolation/expected/stats_1.out | 22 +++++++++++----------- src/test/isolation/specs/stats.spec | 4 ++-- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/test/isolation/expected/stats.out b/src/test/isolation/expected/stats.out index 7628a5f5da..12234fbcd9 100644 --- a/src/test/isolation/expected/stats.out +++ b/src/test/isolation/expected/stats.out @@ -3047,7 +3047,7 @@ step s1_slru_save_stats: step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; step s1_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3100,7 +3100,7 @@ step s1_slru_save_stats: step s1_listen: LISTEN stats_test_nothing; step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3141,7 +3141,7 @@ step s1_slru_save_stats: step s1_listen: LISTEN stats_test_nothing; step s2_begin: BEGIN; step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3196,7 +3196,7 @@ f (1 row) step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3263,7 +3263,7 @@ f (1 row) step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3330,7 +3330,7 @@ f (1 row) step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3397,7 +3397,7 @@ f (1 row) step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3470,7 +3470,7 @@ f (1 row) step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3543,7 +3543,7 @@ f (1 row) step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3618,7 +3618,7 @@ test_stat_func| | | (1 row) step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3661,7 +3661,7 @@ step s1_slru_save_stats: step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- diff --git a/src/test/isolation/expected/stats_1.out b/src/test/isolation/expected/stats_1.out index 1c6533cc87..beb959453d 100644 --- a/src/test/isolation/expected/stats_1.out +++ b/src/test/isolation/expected/stats_1.out @@ -3071,7 +3071,7 @@ step s1_slru_save_stats: step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; step s1_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3124,7 +3124,7 @@ step s1_slru_save_stats: step s1_listen: LISTEN stats_test_nothing; step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3165,7 +3165,7 @@ step s1_slru_save_stats: step s1_listen: LISTEN stats_test_nothing; step s2_begin: BEGIN; step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3220,7 +3220,7 @@ f (1 row) step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3287,7 +3287,7 @@ f (1 row) step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3354,7 +3354,7 @@ f (1 row) step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3421,7 +3421,7 @@ f (1 row) step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3494,7 +3494,7 @@ f (1 row) step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3567,7 +3567,7 @@ f (1 row) step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3642,7 +3642,7 @@ test_stat_func| | | (1 row) step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- @@ -3685,7 +3685,7 @@ step s1_slru_save_stats: step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; step s2_big_notify: SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); pg_notify --------- diff --git a/src/test/isolation/specs/stats.spec b/src/test/isolation/specs/stats.spec index a3a18ca03d..f27d11eede 100644 --- a/src/test/isolation/specs/stats.spec +++ b/src/test/isolation/specs/stats.spec @@ -105,7 +105,7 @@ step s1_slru_save_stats { } step s1_listen { LISTEN stats_test_nothing; } step s1_big_notify { SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); } step s1_slru_check_stats { @@ -147,7 +147,7 @@ step s2_table_update_k1 { UPDATE test_stat_tab SET value = value + 1 WHERE key = # SLRU stats steps step s2_big_notify { SELECT pg_notify('stats_test_use', - repeat('0', current_setting('block_size')::int / 2)) FROM generate_series(1, 3); + repeat(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); } From 99392cdd78b788295e52b9f4942fa11992fd5ba9 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 7 Apr 2022 21:04:36 +0200 Subject: [PATCH 437/772] Rewrite some RI code to avoid using SPI Modify the subroutines called by RI trigger functions that want to check if a given referenced value exists in the referenced relation to simply scan the foreign key constraint's unique index, instead of using SPI to execute SELECT 1 FROM referenced_relation WHERE ref_key = $1 This saves a lot of work, especially when inserting into or updating a referencing relation. This rewrite allows to fix a PK row visibility bug caused by a partition descriptor hack which requires ActiveSnapshot to be set to come up with the correct set of partitions for the RI query running under REPEATABLE READ isolation. We now set that snapshot indepedently of the snapshot to be used by the PK index scan, so the two no longer interfere. The buggy output in src/test/isolation/expected/fk-snapshot.out of the relevant test case added by commit 00cb86e75d6d has been corrected. (The bug still exists in branch 14, however, but this fix is too invasive to backpatch.) Author: Amit Langote Reviewed-by: Kyotaro Horiguchi Reviewed-by: Corey Huinker Reviewed-by: Li Japin Reviewed-by: Tom Lane Reviewed-by: Zhihong Yu Discussion: https://postgr.es/m/CA+HiwqGkfJfYdeq5vHPh6eqPKjSbfpDDY+j-kXYFePQedtSLeg@mail.gmail.com --- src/backend/executor/execPartition.c | 174 +++++- src/backend/executor/nodeLockRows.c | 161 +++--- src/backend/utils/adt/ri_triggers.c | 564 ++++++++++++-------- src/include/executor/execPartition.h | 6 + src/include/executor/executor.h | 8 + src/test/isolation/expected/fk-snapshot.out | 4 +- src/test/isolation/specs/fk-snapshot.spec | 5 +- 7 files changed, 605 insertions(+), 317 deletions(-) diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c index 615bd80973..c22c9ac096 100644 --- a/src/backend/executor/execPartition.c +++ b/src/backend/executor/execPartition.c @@ -176,8 +176,9 @@ static void FormPartitionKeyDatum(PartitionDispatch pd, EState *estate, Datum *values, bool *isnull); -static int get_partition_for_tuple(PartitionDispatch pd, Datum *values, - bool *isnull); +static int get_partition_for_tuple(PartitionKey key, + PartitionDesc partdesc, + Datum *values, bool *isnull); static char *ExecBuildSlotPartitionKeyDescription(Relation rel, Datum *values, bool *isnull, @@ -318,7 +319,9 @@ ExecFindPartition(ModifyTableState *mtstate, * these values, error out. */ if (partdesc->nparts == 0 || - (partidx = get_partition_for_tuple(dispatch, values, isnull)) < 0) + (partidx = get_partition_for_tuple(dispatch->key, + dispatch->partdesc, + values, isnull)) < 0) { char *val_desc; @@ -1341,12 +1344,12 @@ FormPartitionKeyDatum(PartitionDispatch pd, * found or -1 if none found. */ static int -get_partition_for_tuple(PartitionDispatch pd, Datum *values, bool *isnull) +get_partition_for_tuple(PartitionKey key, + PartitionDesc partdesc, + Datum *values, bool *isnull) { int bound_offset; int part_index = -1; - PartitionKey key = pd->key; - PartitionDesc partdesc = pd->partdesc; PartitionBoundInfo boundinfo = partdesc->boundinfo; /* Route as appropriate based on partitioning strategy. */ @@ -1438,6 +1441,165 @@ get_partition_for_tuple(PartitionDispatch pd, Datum *values, bool *isnull) return part_index; } +/* + * ExecGetLeafPartitionForKey + * Finds the leaf partition of partitioned table 'root_rel' that would + * contain the specified key tuple. + * + * A subset of the table's columns (including all of the partition key columns) + * must be specified: + * - 'key_natts' indicats the number of columns contained in the key + * - 'key_attnums' indicates their attribute numbers as defined in 'root_rel' + * - 'key_vals' and 'key_nulls' specify the key tuple + * + * Returns the leaf partition, locked with the given lockmode, or NULL if + * there isn't one. Caller is responsibly for closing it. All intermediate + * partitions are also locked with the same lockmode. Caller must have locked + * the root already. + * + * In addition, the OID of the index of a unique constraint on the root table + * must be given as 'root_idxoid'; *leaf_idxoid will be set to the OID of the + * corresponding index on the returned leaf partition. (This can be used by + * caller to search for a tuple matching the key in the leaf partition.) + * + * This works because the unique key defined on the root relation is required + * to contain the partition key columns of all of the ancestors that lead up to + * a given leaf partition. + */ +Relation +ExecGetLeafPartitionForKey(Relation root_rel, int key_natts, + const AttrNumber *key_attnums, + Datum *key_vals, char *key_nulls, + Oid root_idxoid, int lockmode, + Oid *leaf_idxoid) +{ + Relation found_leafpart = NULL; + Relation rel = root_rel; + Oid constr_idxoid = root_idxoid; + PartitionDirectory partdir; + + Assert(root_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE); + + *leaf_idxoid = InvalidOid; + + partdir = CreatePartitionDirectory(CurrentMemoryContext, true); + + /* + * Descend through partitioned parents to find the leaf partition that + * would accept a row with the provided key values, starting with the root + * parent. + */ + for (;;) + { + PartitionKey partkey = RelationGetPartitionKey(rel); + PartitionDesc partdesc; + Datum partkey_vals[PARTITION_MAX_KEYS]; + bool partkey_isnull[PARTITION_MAX_KEYS]; + AttrNumber *root_partattrs = partkey->partattrs; + int found_att; + int partidx; + Oid partoid; + + CHECK_FOR_INTERRUPTS(); + + /* + * Collect partition key values from the unique key. + * + * Because we only have the root table's copy of pk_attnums, must map + * any non-root table's partition key attribute numbers to the root + * table's. + */ + if (rel != root_rel) + { + /* + * map->attnums will contain root table attribute numbers for each + * attribute of the current partitioned relation. + */ + AttrMap *map; + + map = build_attrmap_by_name_if_req(RelationGetDescr(root_rel), + RelationGetDescr(rel)); + if (map) + { + root_partattrs = palloc(partkey->partnatts * + sizeof(AttrNumber)); + for (int att = 0; att < partkey->partnatts; att++) + { + AttrNumber partattno = partkey->partattrs[att]; + + root_partattrs[att] = map->attnums[partattno - 1]; + } + + free_attrmap(map); + } + } + + /* + * Map the values/isnulls to match the partition description, as + * necessary. + * + * (Referenced key specification does not allow expressions, so there + * would not be expressions in the partition keys either.) + */ + Assert(partkey->partexprs == NIL); + found_att = 0; + for (int keyatt = 0; keyatt < key_natts; keyatt++) + { + for (int att = 0; att < partkey->partnatts; att++) + { + if (root_partattrs[att] == key_attnums[keyatt]) + { + partkey_vals[found_att] = key_vals[keyatt]; + partkey_isnull[found_att] = (key_nulls[keyatt] == 'n'); + found_att++; + break; + } + } + } + /* We had better have found values for all partition keys */ + Assert(found_att == partkey->partnatts); + + if (root_partattrs != partkey->partattrs) + pfree(root_partattrs); + + /* Get the PartitionDesc using the partition directory machinery. */ + partdesc = PartitionDirectoryLookup(partdir, rel); + if (partdesc->nparts == 0) + break; + + /* Find the partition for the key. */ + partidx = get_partition_for_tuple(partkey, partdesc, + partkey_vals, partkey_isnull); + Assert(partidx < 0 || partidx < partdesc->nparts); + + /* close the previous parent if any, but keep lock */ + if (rel != root_rel) + table_close(rel, NoLock); + + /* No partition found. */ + if (partidx < 0) + break; + + partoid = partdesc->oids[partidx]; + rel = table_open(partoid, lockmode); + constr_idxoid = index_get_partition(rel, constr_idxoid); + + /* + * We're done if the partition is a leaf, else find its partition in + * the next iteration. + */ + if (partdesc->is_leaf[partidx]) + { + *leaf_idxoid = constr_idxoid; + found_leafpart = rel; + break; + } + } + + DestroyPartitionDirectory(partdir); + return found_leafpart; +} + /* * ExecBuildSlotPartitionKeyDescription * diff --git a/src/backend/executor/nodeLockRows.c b/src/backend/executor/nodeLockRows.c index 1a9dab25dd..bbccafb2cf 100644 --- a/src/backend/executor/nodeLockRows.c +++ b/src/backend/executor/nodeLockRows.c @@ -79,10 +79,7 @@ ExecLockRows(PlanState *pstate) Datum datum; bool isNull; ItemPointerData tid; - TM_FailureData tmfd; LockTupleMode lockmode; - int lockflags = 0; - TM_Result test; TupleTableSlot *markSlot; /* clear any leftover test tuple for this rel */ @@ -179,74 +176,11 @@ ExecLockRows(PlanState *pstate) break; } - lockflags = TUPLE_LOCK_FLAG_LOCK_UPDATE_IN_PROGRESS; - if (!IsolationUsesXactSnapshot()) - lockflags |= TUPLE_LOCK_FLAG_FIND_LAST_VERSION; - - test = table_tuple_lock(erm->relation, &tid, estate->es_snapshot, - markSlot, estate->es_output_cid, - lockmode, erm->waitPolicy, - lockflags, - &tmfd); - - switch (test) - { - case TM_WouldBlock: - /* couldn't lock tuple in SKIP LOCKED mode */ - goto lnext; - - case TM_SelfModified: - - /* - * The target tuple was already updated or deleted by the - * current command, or by a later command in the current - * transaction. We *must* ignore the tuple in the former - * case, so as to avoid the "Halloween problem" of repeated - * update attempts. In the latter case it might be sensible - * to fetch the updated tuple instead, but doing so would - * require changing heap_update and heap_delete to not - * complain about updating "invisible" tuples, which seems - * pretty scary (table_tuple_lock will not complain, but few - * callers expect TM_Invisible, and we're not one of them). So - * for now, treat the tuple as deleted and do not process. - */ - goto lnext; - - case TM_Ok: - - /* - * Got the lock successfully, the locked tuple saved in - * markSlot for, if needed, EvalPlanQual testing below. - */ - if (tmfd.traversed) - epq_needed = true; - break; - - case TM_Updated: - if (IsolationUsesXactSnapshot()) - ereport(ERROR, - (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), - errmsg("could not serialize access due to concurrent update"))); - elog(ERROR, "unexpected table_tuple_lock status: %u", - test); - break; - - case TM_Deleted: - if (IsolationUsesXactSnapshot()) - ereport(ERROR, - (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), - errmsg("could not serialize access due to concurrent update"))); - /* tuple was deleted so don't return it */ - goto lnext; - - case TM_Invisible: - elog(ERROR, "attempted to lock invisible tuple"); - break; - - default: - elog(ERROR, "unrecognized table_tuple_lock status: %u", - test); - } + /* skip tuple if it couldn't be locked */ + if (!ExecLockTableTuple(erm->relation, &tid, markSlot, + estate->es_snapshot, estate->es_output_cid, + lockmode, erm->waitPolicy, &epq_needed)) + goto lnext; /* Remember locked tuple's TID for EPQ testing and WHERE CURRENT OF */ erm->curCtid = tid; @@ -281,6 +215,91 @@ ExecLockRows(PlanState *pstate) return slot; } +/* + * ExecLockTableTuple + * Locks tuple with the specified TID in lockmode following given wait + * policy + * + * Returns true if the tuple was successfully locked. Locked tuple is loaded + * into provided slot. + */ +bool +ExecLockTableTuple(Relation relation, ItemPointer tid, TupleTableSlot *slot, + Snapshot snapshot, CommandId cid, + LockTupleMode lockmode, LockWaitPolicy waitPolicy, + bool *epq_needed) +{ + TM_FailureData tmfd; + int lockflags = TUPLE_LOCK_FLAG_LOCK_UPDATE_IN_PROGRESS; + TM_Result test; + + if (!IsolationUsesXactSnapshot()) + lockflags |= TUPLE_LOCK_FLAG_FIND_LAST_VERSION; + + test = table_tuple_lock(relation, tid, snapshot, slot, cid, lockmode, + waitPolicy, lockflags, &tmfd); + + switch (test) + { + case TM_WouldBlock: + /* couldn't lock tuple in SKIP LOCKED mode */ + return false; + + case TM_SelfModified: + + /* + * The target tuple was already updated or deleted by the current + * command, or by a later command in the current transaction. We + * *must* ignore the tuple in the former case, so as to avoid the + * "Halloween problem" of repeated update attempts. In the latter + * case it might be sensible to fetch the updated tuple instead, + * but doing so would require changing heap_update and heap_delete + * to not complain about updating "invisible" tuples, which seems + * pretty scary (table_tuple_lock will not complain, but few + * callers expect TM_Invisible, and we're not one of them). So for + * now, treat the tuple as deleted and do not process. + */ + return false; + + case TM_Ok: + + /* + * Got the lock successfully, the locked tuple saved in slot for + * EvalPlanQual, if asked by the caller. + */ + if (tmfd.traversed && epq_needed) + *epq_needed = true; + break; + + case TM_Updated: + if (IsolationUsesXactSnapshot()) + ereport(ERROR, + (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), + errmsg("could not serialize access due to concurrent update"))); + elog(ERROR, "unexpected table_tuple_lock status: %u", + test); + break; + + case TM_Deleted: + if (IsolationUsesXactSnapshot()) + ereport(ERROR, + (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), + errmsg("could not serialize access due to concurrent update"))); + /* tuple was deleted so don't return it */ + return false; + + case TM_Invisible: + elog(ERROR, "attempted to lock invisible tuple"); + return false; + + default: + elog(ERROR, "unrecognized table_tuple_lock status: %u", test); + return false; + } + + return true; +} + /* ---------------------------------------------------------------- * ExecInitLockRows * diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c index 01d4c22cfc..088b402700 100644 --- a/src/backend/utils/adt/ri_triggers.c +++ b/src/backend/utils/adt/ri_triggers.c @@ -23,6 +23,7 @@ #include "postgres.h" +#include "access/genam.h" #include "access/htup_details.h" #include "access/sysattr.h" #include "access/table.h" @@ -33,6 +34,7 @@ #include "catalog/pg_operator.h" #include "catalog/pg_type.h" #include "commands/trigger.h" +#include "executor/execPartition.h" #include "executor/executor.h" #include "executor/spi.h" #include "lib/ilist.h" @@ -68,19 +70,14 @@ #define RI_KEYS_NONE_NULL 2 /* RI query type codes */ -/* these queries are executed against the PK (referenced) table: */ -#define RI_PLAN_CHECK_LOOKUPPK 1 -#define RI_PLAN_CHECK_LOOKUPPK_FROM_PK 2 -#define RI_PLAN_LAST_ON_PK RI_PLAN_CHECK_LOOKUPPK_FROM_PK -/* these queries are executed against the FK (referencing) table: */ -#define RI_PLAN_CASCADE_ONDELETE 3 -#define RI_PLAN_CASCADE_ONUPDATE 4 +#define RI_PLAN_CASCADE_ONDELETE 1 +#define RI_PLAN_CASCADE_ONUPDATE 2 /* For RESTRICT, the same plan can be used for both ON DELETE and ON UPDATE triggers. */ -#define RI_PLAN_RESTRICT 5 -#define RI_PLAN_SETNULL_ONDELETE 6 -#define RI_PLAN_SETNULL_ONUPDATE 7 -#define RI_PLAN_SETDEFAULT_ONDELETE 8 -#define RI_PLAN_SETDEFAULT_ONUPDATE 9 +#define RI_PLAN_RESTRICT 3 +#define RI_PLAN_SETNULL_ONDELETE 4 +#define RI_PLAN_SETNULL_ONUPDATE 5 +#define RI_PLAN_SETDEFAULT_ONDELETE 6 +#define RI_PLAN_SETDEFAULT_ONUPDATE 7 #define MAX_QUOTED_NAME_LEN (NAMEDATALEN*2+3) #define MAX_QUOTED_REL_NAME_LEN (MAX_QUOTED_NAME_LEN*2) @@ -229,9 +226,278 @@ static void ri_ExtractValues(Relation rel, TupleTableSlot *slot, static void ri_ReportViolation(const RI_ConstraintInfo *riinfo, Relation pk_rel, Relation fk_rel, TupleTableSlot *violatorslot, TupleDesc tupdesc, - int queryno, bool partgone) pg_attribute_noreturn(); + bool on_fk, bool partgone) pg_attribute_noreturn(); +static Oid get_fkey_unique_index(Oid conoid); +/* + * Checks whether a tuple containing the unique key as extracted from the + * tuple provided in 'slot' exists in 'pk_rel'. The key is extracted using the + * constraint's index given in 'riinfo', which is also scanned to check the + * existence of the key. + * + * If 'pk_rel' is a partitioned table, the check is performed on its leaf + * partition that would contain the key. + * + * The provided tuple is either the one being inserted into the referencing + * relation ('fk_rel' is non-NULL), or the one being deleted from the + * referenced relation, that is, 'pk_rel' ('fk_rel' is NULL). + */ +static bool +ri_ReferencedKeyExists(Relation pk_rel, Relation fk_rel, + TupleTableSlot *slot, const RI_ConstraintInfo *riinfo) +{ + Oid constr_id = riinfo->constraint_id; + Oid idxoid; + Relation idxrel; + Relation leaf_pk_rel = NULL; + int num_pk; + int i; + bool found = false; + const Oid *eq_oprs; + Datum pk_vals[INDEX_MAX_KEYS]; + char pk_nulls[INDEX_MAX_KEYS]; + ScanKeyData skey[INDEX_MAX_KEYS]; + Snapshot snap = InvalidSnapshot; + bool pushed_latest_snapshot = false; + IndexScanDesc scan; + TupleTableSlot *outslot; + Oid saved_userid; + int saved_sec_context; + AclResult aclresult; + + /* + * Extract the unique key from the provided slot and choose the equality + * operators to use when scanning the index below. + */ + if (fk_rel) + { + ri_ExtractValues(fk_rel, slot, riinfo, false, pk_vals, pk_nulls); + /* Use PK = FK equality operator. */ + eq_oprs = riinfo->pf_eq_oprs; + + /* + * May need to cast each of the individual values of the foreign key + * to the corresponding PK column's type if the equality operator + * demands it. + */ + for (i = 0; i < riinfo->nkeys; i++) + { + if (pk_nulls[i] != 'n') + { + Oid eq_opr = eq_oprs[i]; + Oid typeid = RIAttType(fk_rel, riinfo->fk_attnums[i]); + RI_CompareHashEntry *entry = ri_HashCompareOp(eq_opr, typeid); + + if (OidIsValid(entry->cast_func_finfo.fn_oid)) + pk_vals[i] = FunctionCall3(&entry->cast_func_finfo, + pk_vals[i], + Int32GetDatum(-1), /* typmod */ + BoolGetDatum(false)); /* implicit coercion */ + } + } + } + else + { + ri_ExtractValues(pk_rel, slot, riinfo, true, pk_vals, pk_nulls); + /* Use PK = PK equality operator. */ + eq_oprs = riinfo->pp_eq_oprs; + } + + /* + * Switch to referenced table's owner to perform the below operations as. + * This matches what ri_PerformCheck() does. + * + * Note that as with queries done by ri_PerformCheck(), the way we select + * the referenced row below effectively bypasses any RLS policies that may + * be present on the referenced table. + */ + GetUserIdAndSecContext(&saved_userid, &saved_sec_context); + SetUserIdAndSecContext(RelationGetForm(pk_rel)->relowner, + saved_sec_context | SECURITY_LOCAL_USERID_CHANGE); + + /* + * Also check that the new user has permissions to look into the schema of + * and SELECT from the referenced table. + */ + aclresult = pg_namespace_aclcheck(RelationGetNamespace(pk_rel), + GetUserId(), ACL_USAGE); + if (aclresult != ACLCHECK_OK) + aclcheck_error(aclresult, OBJECT_SCHEMA, + get_namespace_name(RelationGetNamespace(pk_rel))); + aclresult = pg_class_aclcheck(RelationGetRelid(pk_rel), GetUserId(), + ACL_SELECT); + if (aclresult != ACLCHECK_OK) + aclcheck_error(aclresult, OBJECT_TABLE, + RelationGetRelationName(pk_rel)); + + /* Make the changes of the current command visible in all cases. */ + CommandCounterIncrement(); + + /* + * In the case of scanning the PK index for ri_Check_Pk_Match(), we'd like + * to see all rows that could be interesting, even those that would not be + * visible to the transaction snapshot. To do so, force-push the latest + * snapshot. + */ + if (fk_rel == NULL) + { + snap = GetLatestSnapshot(); + PushActiveSnapshot(snap); + pushed_latest_snapshot = true; + } + else + { + snap = GetTransactionSnapshot(); + PushActiveSnapshot(snap); + } + + /* + * Open the constraint index to be scanned. + * + * If the target table is partitioned, we must look up the leaf partition + * and its corresponding unique index to search the keys in. + */ + idxoid = get_fkey_unique_index(constr_id); + if (pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + { + Oid leaf_idxoid; + Snapshot mysnap = InvalidSnapshot; + + /* + * XXX the partition descriptor machinery has a hack that assumes that + * the queries originating in this module push the latest snapshot in + * the transaction-snapshot mode. If we haven't pushed one already, + * do so now. + */ + if (!pushed_latest_snapshot) + { + mysnap = GetLatestSnapshot(); + PushActiveSnapshot(mysnap); + } + + leaf_pk_rel = ExecGetLeafPartitionForKey(pk_rel, riinfo->nkeys, + riinfo->pk_attnums, + pk_vals, pk_nulls, + idxoid, RowShareLock, + &leaf_idxoid); + + /* + * XXX done fiddling with the partition descriptor machinery so unset + * the active snapshot if we must. + */ + if (mysnap != InvalidSnapshot) + PopActiveSnapshot(); + + /* + * If no suitable leaf partition exists, neither can the key we're + * looking for. + */ + if (leaf_pk_rel == NULL) + { + SetUserIdAndSecContext(saved_userid, saved_sec_context); + PopActiveSnapshot(); + return false; + } + + pk_rel = leaf_pk_rel; + idxoid = leaf_idxoid; + } + idxrel = index_open(idxoid, RowShareLock); + + /* Set up ScanKeys for the index scan. */ + num_pk = IndexRelationGetNumberOfKeyAttributes(idxrel); + for (i = 0; i < num_pk; i++) + { + int pkattno = i + 1; + Oid operator = eq_oprs[i]; + Oid opfamily = idxrel->rd_opfamily[i]; + StrategyNumber strat = get_op_opfamily_strategy(operator, opfamily); + RegProcedure regop = get_opcode(operator); + + /* Initialize the scankey. */ + ScanKeyInit(&skey[i], + pkattno, + strat, + regop, + pk_vals[i]); + + skey[i].sk_collation = idxrel->rd_indcollation[i]; + + /* + * Check for null value. Should not occur, because callers currently + * take care of the cases in which they do occur. + */ + if (pk_nulls[i] == 'n') + skey[i].sk_flags |= SK_ISNULL; + } + + scan = index_beginscan(pk_rel, idxrel, snap, num_pk, 0); + index_rescan(scan, skey, num_pk, NULL, 0); + + /* Look for the tuple, and if found, try to lock it in key share mode. */ + outslot = table_slot_create(pk_rel, NULL); + if (index_getnext_slot(scan, ForwardScanDirection, outslot)) + { + /* + * If we fail to lock the tuple for whatever reason, assume it doesn't + * exist. + */ + found = ExecLockTableTuple(pk_rel, &(outslot->tts_tid), outslot, + snap, + GetCurrentCommandId(false), + LockTupleKeyShare, + LockWaitBlock, NULL); + } + + index_endscan(scan); + ExecDropSingleTupleTableSlot(outslot); + + /* Don't release lock until commit. */ + index_close(idxrel, NoLock); + + /* Close leaf partition relation if any. */ + if (leaf_pk_rel) + table_close(leaf_pk_rel, NoLock); + + /* Restore UID and security context */ + SetUserIdAndSecContext(saved_userid, saved_sec_context); + + PopActiveSnapshot(); + + return found; +} + +/* + * get_fkey_unique_index + * Returns the unique index used by a supposedly foreign key constraint + * + * XXX This is very similar to get_constraint_index; probably they should be + * unified. + */ +static Oid +get_fkey_unique_index(Oid conoid) +{ + Oid result = InvalidOid; + HeapTuple tp; + + tp = SearchSysCache1(CONSTROID, ObjectIdGetDatum(conoid)); + if (HeapTupleIsValid(tp)) + { + Form_pg_constraint contup = (Form_pg_constraint) GETSTRUCT(tp); + + if (contup->contype == CONSTRAINT_FOREIGN) + result = contup->conindid; + ReleaseSysCache(tp); + } + + if (!OidIsValid(result)) + elog(ERROR, "unique index not found for foreign key constraint %u", + conoid); + + return result; +} + /* * RI_FKey_check - * @@ -244,8 +510,6 @@ RI_FKey_check(TriggerData *trigdata) Relation fk_rel; Relation pk_rel; TupleTableSlot *newslot; - RI_QueryKey qkey; - SPIPlanPtr qplan; riinfo = ri_FetchConstraintInfo(trigdata->tg_trigger, trigdata->tg_relation, false); @@ -325,9 +589,9 @@ RI_FKey_check(TriggerData *trigdata) /* * MATCH PARTIAL - all non-null columns must match. (not - * implemented, can be done by modifying the query below - * to only include non-null columns, or by writing a - * special version here) + * implemented, can be done by modifying + * ri_ReferencedKeyExists() to only include non-null + * columns. */ break; #endif @@ -342,74 +606,12 @@ RI_FKey_check(TriggerData *trigdata) break; } - if (SPI_connect() != SPI_OK_CONNECT) - elog(ERROR, "SPI_connect failed"); - - /* Fetch or prepare a saved plan for the real check */ - ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_CHECK_LOOKUPPK); - - if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL) - { - StringInfoData querybuf; - char pkrelname[MAX_QUOTED_REL_NAME_LEN]; - char attname[MAX_QUOTED_NAME_LEN]; - char paramname[16]; - const char *querysep; - Oid queryoids[RI_MAX_NUMKEYS]; - const char *pk_only; - - /* ---------- - * The query string built is - * SELECT 1 FROM [ONLY] x WHERE pkatt1 = $1 [AND ...] - * FOR KEY SHARE OF x - * The type id's for the $ parameters are those of the - * corresponding FK attributes. - * ---------- - */ - initStringInfo(&querybuf); - pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ? - "" : "ONLY "; - quoteRelationName(pkrelname, pk_rel); - appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x", - pk_only, pkrelname); - querysep = "WHERE"; - for (int i = 0; i < riinfo->nkeys; i++) - { - Oid pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]); - Oid fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]); - - quoteOneName(attname, - RIAttName(pk_rel, riinfo->pk_attnums[i])); - sprintf(paramname, "$%d", i + 1); - ri_GenerateQual(&querybuf, querysep, - attname, pk_type, - riinfo->pf_eq_oprs[i], - paramname, fk_type); - querysep = "AND"; - queryoids[i] = fk_type; - } - appendStringInfoString(&querybuf, " FOR KEY SHARE OF x"); - - /* Prepare and save the plan */ - qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids, - &qkey, fk_rel, pk_rel); - } - - /* - * Now check that foreign key exists in PK table - * - * XXX detectNewRows must be true when a partitioned table is on the - * referenced side. The reason is that our snapshot must be fresh in - * order for the hack in find_inheritance_children() to work. - */ - ri_PerformCheck(riinfo, &qkey, qplan, - fk_rel, pk_rel, - NULL, newslot, - pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE, - SPI_OK_SELECT); - - if (SPI_finish() != SPI_OK_FINISH) - elog(ERROR, "SPI_finish failed"); + if (!ri_ReferencedKeyExists(pk_rel, fk_rel, newslot, riinfo)) + ri_ReportViolation(riinfo, + pk_rel, fk_rel, + newslot, + NULL, + true, false); table_close(pk_rel, RowShareLock); @@ -464,81 +666,10 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel, TupleTableSlot *oldslot, const RI_ConstraintInfo *riinfo) { - SPIPlanPtr qplan; - RI_QueryKey qkey; - bool result; - /* Only called for non-null rows */ Assert(ri_NullCheck(RelationGetDescr(pk_rel), oldslot, riinfo, true) == RI_KEYS_NONE_NULL); - if (SPI_connect() != SPI_OK_CONNECT) - elog(ERROR, "SPI_connect failed"); - - /* - * Fetch or prepare a saved plan for checking PK table with values coming - * from a PK row - */ - ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_CHECK_LOOKUPPK_FROM_PK); - - if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL) - { - StringInfoData querybuf; - char pkrelname[MAX_QUOTED_REL_NAME_LEN]; - char attname[MAX_QUOTED_NAME_LEN]; - char paramname[16]; - const char *querysep; - const char *pk_only; - Oid queryoids[RI_MAX_NUMKEYS]; - - /* ---------- - * The query string built is - * SELECT 1 FROM [ONLY] x WHERE pkatt1 = $1 [AND ...] - * FOR KEY SHARE OF x - * The type id's for the $ parameters are those of the - * PK attributes themselves. - * ---------- - */ - initStringInfo(&querybuf); - pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ? - "" : "ONLY "; - quoteRelationName(pkrelname, pk_rel); - appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x", - pk_only, pkrelname); - querysep = "WHERE"; - for (int i = 0; i < riinfo->nkeys; i++) - { - Oid pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]); - - quoteOneName(attname, - RIAttName(pk_rel, riinfo->pk_attnums[i])); - sprintf(paramname, "$%d", i + 1); - ri_GenerateQual(&querybuf, querysep, - attname, pk_type, - riinfo->pp_eq_oprs[i], - paramname, pk_type); - querysep = "AND"; - queryoids[i] = pk_type; - } - appendStringInfoString(&querybuf, " FOR KEY SHARE OF x"); - - /* Prepare and save the plan */ - qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids, - &qkey, fk_rel, pk_rel); - } - - /* - * We have a plan now. Run it. - */ - result = ri_PerformCheck(riinfo, &qkey, qplan, - fk_rel, pk_rel, - oldslot, NULL, - true, /* treat like update */ - SPI_OK_SELECT); - - if (SPI_finish() != SPI_OK_FINISH) - elog(ERROR, "SPI_finish failed"); - - return result; + return ri_ReferencedKeyExists(pk_rel, NULL, oldslot, riinfo); } @@ -1608,15 +1739,10 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel) errtableconstraint(fk_rel, NameStr(fake_riinfo.conname)))); - /* - * We tell ri_ReportViolation we were doing the RI_PLAN_CHECK_LOOKUPPK - * query, which isn't true, but will cause it to use - * fake_riinfo.fk_attnums as we need. - */ ri_ReportViolation(&fake_riinfo, pk_rel, fk_rel, slot, tupdesc, - RI_PLAN_CHECK_LOOKUPPK, false); + true, false); ExecDropSingleTupleTableSlot(slot); } @@ -1833,7 +1959,7 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel) fake_riinfo.pk_attnums[i] = i + 1; ri_ReportViolation(&fake_riinfo, pk_rel, fk_rel, - slot, tupdesc, 0, true); + slot, tupdesc, true, true); } if (SPI_finish() != SPI_OK_FINISH) @@ -1970,9 +2096,8 @@ ri_BuildQueryKey(RI_QueryKey *key, const RI_ConstraintInfo *riinfo, { /* * Inherited constraints with a common ancestor can share ri_query_cache - * entries for all query types except RI_PLAN_CHECK_LOOKUPPK_FROM_PK. - * Except in that case, the query processes the other table involved in - * the FK constraint (i.e., not the table on which the trigger has been + * entries, because each query processes the other table involved in the + * FK constraint (i.e., not the table on which the trigger has been * fired), and so it will be the same for all members of the inheritance * tree. So we may use the root constraint's OID in the hash key, rather * than the constraint's own OID. This avoids creating duplicate SPI @@ -1983,13 +2108,13 @@ ri_BuildQueryKey(RI_QueryKey *key, const RI_ConstraintInfo *riinfo, * constraint, because partitions can have different column orders, * resulting in different pk_attnums[] or fk_attnums[] array contents.) * + * (Note also that for a standalone or non-inherited constraint, + * constraint_root_id is same as constraint_id.) + * * We assume struct RI_QueryKey contains no padding bytes, else we'd need * to use memset to clear them. */ - if (constr_queryno != RI_PLAN_CHECK_LOOKUPPK_FROM_PK) - key->constr_id = riinfo->constraint_root_id; - else - key->constr_id = riinfo->constraint_id; + key->constr_id = riinfo->constraint_root_id; key->constr_queryno = constr_queryno; } @@ -2260,19 +2385,12 @@ ri_PlanCheck(const char *querystr, int nargs, Oid *argtypes, RI_QueryKey *qkey, Relation fk_rel, Relation pk_rel) { SPIPlanPtr qplan; - Relation query_rel; + + /* There are currently no queries that run on PK table. */ + Relation query_rel = fk_rel; Oid save_userid; int save_sec_context; - /* - * Use the query type code to determine whether the query is run against - * the PK or FK table; we'll do the check as that table's owner - */ - if (qkey->constr_queryno <= RI_PLAN_LAST_ON_PK) - query_rel = pk_rel; - else - query_rel = fk_rel; - /* Switch to proper UID to perform check as */ GetUserIdAndSecContext(&save_userid, &save_sec_context); SetUserIdAndSecContext(RelationGetForm(query_rel)->relowner, @@ -2305,9 +2423,9 @@ ri_PerformCheck(const RI_ConstraintInfo *riinfo, TupleTableSlot *oldslot, TupleTableSlot *newslot, bool detectNewRows, int expect_OK) { - Relation query_rel, - source_rel; - bool source_is_pk; + /* There are currently no queries that run on PK table. */ + Relation query_rel = fk_rel, + source_rel = pk_rel; Snapshot test_snapshot; Snapshot crosscheck_snapshot; int limit; @@ -2317,46 +2435,17 @@ ri_PerformCheck(const RI_ConstraintInfo *riinfo, Datum vals[RI_MAX_NUMKEYS * 2]; char nulls[RI_MAX_NUMKEYS * 2]; - /* - * Use the query type code to determine whether the query is run against - * the PK or FK table; we'll do the check as that table's owner - */ - if (qkey->constr_queryno <= RI_PLAN_LAST_ON_PK) - query_rel = pk_rel; - else - query_rel = fk_rel; - - /* - * The values for the query are taken from the table on which the trigger - * is called - it is normally the other one with respect to query_rel. An - * exception is ri_Check_Pk_Match(), which uses the PK table for both (and - * sets queryno to RI_PLAN_CHECK_LOOKUPPK_FROM_PK). We might eventually - * need some less klugy way to determine this. - */ - if (qkey->constr_queryno == RI_PLAN_CHECK_LOOKUPPK) - { - source_rel = fk_rel; - source_is_pk = false; - } - else - { - source_rel = pk_rel; - source_is_pk = true; - } - /* Extract the parameters to be passed into the query */ if (newslot) { - ri_ExtractValues(source_rel, newslot, riinfo, source_is_pk, - vals, nulls); + ri_ExtractValues(source_rel, newslot, riinfo, true, vals, nulls); if (oldslot) - ri_ExtractValues(source_rel, oldslot, riinfo, source_is_pk, + ri_ExtractValues(source_rel, oldslot, riinfo, true, vals + riinfo->nkeys, nulls + riinfo->nkeys); } else { - ri_ExtractValues(source_rel, oldslot, riinfo, source_is_pk, - vals, nulls); + ri_ExtractValues(source_rel, oldslot, riinfo, true, vals, nulls); } /* @@ -2420,14 +2509,12 @@ ri_PerformCheck(const RI_ConstraintInfo *riinfo, errhint("This is most likely due to a rule having rewritten the query."))); /* XXX wouldn't it be clearer to do this part at the caller? */ - if (qkey->constr_queryno != RI_PLAN_CHECK_LOOKUPPK_FROM_PK && - expect_OK == SPI_OK_SELECT && - (SPI_processed == 0) == (qkey->constr_queryno == RI_PLAN_CHECK_LOOKUPPK)) + if (expect_OK == SPI_OK_SELECT && SPI_processed != 0) ri_ReportViolation(riinfo, pk_rel, fk_rel, newslot ? newslot : oldslot, NULL, - qkey->constr_queryno, false); + false, false); return SPI_processed != 0; } @@ -2458,9 +2545,9 @@ ri_ExtractValues(Relation rel, TupleTableSlot *slot, /* * Produce an error report * - * If the failed constraint was on insert/update to the FK table, - * we want the key names and values extracted from there, and the error - * message to look like 'key blah is not present in PK'. + * If the failed constraint was on insert/update to the FK table (on_fk is + * true), we want the key names and values extracted from there, and the + * error message to look like 'key blah is not present in PK'. * Otherwise, the attr names and values come from the PK table and the * message looks like 'key blah is still referenced from FK'. */ @@ -2468,22 +2555,20 @@ static void ri_ReportViolation(const RI_ConstraintInfo *riinfo, Relation pk_rel, Relation fk_rel, TupleTableSlot *violatorslot, TupleDesc tupdesc, - int queryno, bool partgone) + bool on_fk, bool partgone) { StringInfoData key_names; StringInfoData key_values; - bool onfk; const int16 *attnums; Oid rel_oid; AclResult aclresult; bool has_perm = true; /* - * Determine which relation to complain about. If tupdesc wasn't passed - * by caller, assume the violator tuple came from there. + * If tupdesc wasn't passed by caller, assume the violator tuple came from + * there. */ - onfk = (queryno == RI_PLAN_CHECK_LOOKUPPK); - if (onfk) + if (on_fk) { attnums = riinfo->fk_attnums; rel_oid = fk_rel->rd_id; @@ -2585,7 +2670,7 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo, key_names.data, key_values.data, RelationGetRelationName(fk_rel)), errtableconstraint(fk_rel, NameStr(riinfo->conname)))); - else if (onfk) + else if (on_fk) ereport(ERROR, (errcode(ERRCODE_FOREIGN_KEY_VIOLATION), errmsg("insert or update on table \"%s\" violates foreign key constraint \"%s\"", @@ -2892,7 +2977,10 @@ ri_AttributesEqual(Oid eq_opr, Oid typeid, * ri_HashCompareOp - * * See if we know how to compare two values, and create a new hash entry - * if not. + * if not. The entry contains the FmgrInfo of the equality operator function + * and that of the cast function, if one is needed to convert the right + * operand (whose type OID has been passed) before passing it to the equality + * function. */ static RI_CompareHashEntry * ri_HashCompareOp(Oid eq_opr, Oid typeid) @@ -2948,8 +3036,16 @@ ri_HashCompareOp(Oid eq_opr, Oid typeid) * moment since that will never be generated for implicit coercions. */ op_input_types(eq_opr, &lefttype, &righttype); - Assert(lefttype == righttype); - if (typeid == lefttype) + + /* + * Don't need to cast if the values that will be passed to the + * operator will be of expected operand type(s). The operator can be + * cross-type (such as when called by ri_ReferencedKeyExists()), in + * which case, we only need the cast if the right operand value + * doesn't match the type expected by the operator. + */ + if ((lefttype == righttype && typeid == lefttype) || + (lefttype != righttype && typeid == righttype)) castfunc = InvalidOid; /* simplest case */ else { diff --git a/src/include/executor/execPartition.h b/src/include/executor/execPartition.h index 708435e952..cbe1d996e6 100644 --- a/src/include/executor/execPartition.h +++ b/src/include/executor/execPartition.h @@ -31,6 +31,12 @@ extern ResultRelInfo *ExecFindPartition(ModifyTableState *mtstate, EState *estate); extern void ExecCleanupTupleRouting(ModifyTableState *mtstate, PartitionTupleRouting *proute); +extern Relation ExecGetLeafPartitionForKey(Relation root_rel, + int key_natts, + const AttrNumber *key_attnums, + Datum *key_vals, char *key_nulls, + Oid root_idxoid, int lockmode, + Oid *leaf_idxoid); /* diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index 873772f188..216d28679a 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -651,6 +651,14 @@ extern void CheckCmdReplicaIdentity(Relation rel, CmdType cmd); extern void CheckSubscriptionRelkind(char relkind, const char *nspname, const char *relname); +/* + * prototypes from functions in nodeLockRows.c + */ +extern bool ExecLockTableTuple(Relation relation, ItemPointer tid, + TupleTableSlot *slot, Snapshot snapshot, + CommandId cid, LockTupleMode lockmode, + LockWaitPolicy waitPolicy, bool *epq_needed); + /* * prototypes from functions in nodeModifyTable.c */ diff --git a/src/test/isolation/expected/fk-snapshot.out b/src/test/isolation/expected/fk-snapshot.out index 5faf80d6ce..22752cc742 100644 --- a/src/test/isolation/expected/fk-snapshot.out +++ b/src/test/isolation/expected/fk-snapshot.out @@ -47,12 +47,12 @@ a step s2ifn2: INSERT INTO fk_noparted VALUES (2); step s2c: COMMIT; +ERROR: insert or update on table "fk_noparted" violates foreign key constraint "fk_noparted_a_fkey" step s2sfn: SELECT * FROM fk_noparted; a - 1 -2 -(2 rows) +(1 row) starting permutation: s1brc s2brc s2ip2 s1sp s2c s1sp s1ifp2 s2brc s2sfp s1c s1sfp s2ifn2 s2c s2sfn diff --git a/src/test/isolation/specs/fk-snapshot.spec b/src/test/isolation/specs/fk-snapshot.spec index 378507fbc3..64d27f29c3 100644 --- a/src/test/isolation/specs/fk-snapshot.spec +++ b/src/test/isolation/specs/fk-snapshot.spec @@ -46,10 +46,7 @@ step s2sfn { SELECT * FROM fk_noparted; } # inserting into referencing tables in transaction-snapshot mode # PK table is non-partitioned permutation s1brr s2brc s2ip2 s1sp s2c s1sp s1ifp2 s1c s1sfp -# PK table is partitioned: buggy, because s2's serialization transaction can -# see the uncommitted row thanks to the latest snapshot taken for -# partition lookup to work correctly also ends up getting used by the PK index -# scan +# PK table is partitioned permutation s2ip2 s2brr s1brc s1ifp2 s2sfp s1c s2sfp s2ifn2 s2c s2sfn # inserting into referencing tables in up-to-date snapshot mode From 16acf7f1aaea6c5efc0fa49182c16cd6bfd9f3d3 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 7 Apr 2022 12:07:50 -0700 Subject: [PATCH 438/772] pgstat: add tests for handling of restarts, including crashes. Test that stats are restored during normal restarts, discarded after a crash / immediate restart, and that a corrupted stats file leads to stats being reset. Author: Melanie Plageman Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/test/recovery/t/029_stats_restart.pl | 307 +++++++++++++++++++++++ 1 file changed, 307 insertions(+) create mode 100644 src/test/recovery/t/029_stats_restart.pl diff --git a/src/test/recovery/t/029_stats_restart.pl b/src/test/recovery/t/029_stats_restart.pl new file mode 100644 index 0000000000..d3108127ef --- /dev/null +++ b/src/test/recovery/t/029_stats_restart.pl @@ -0,0 +1,307 @@ +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +# Tests statistics handling around restarts, including handling of crashes and +# invalid stats files, as well as restorting stats after "normal" restarts. + +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; +use File::Copy; + +my $node = PostgreSQL::Test::Cluster->new('primary'); +$node->init(allows_streaming => 1); +$node->append_conf('postgresql.conf', "track_functions = 'all'"); +$node->start; + +my $connect_db = 'postgres'; +my $db_under_test = 'test'; + +# create test objects +$node->safe_psql($connect_db, "CREATE DATABASE $db_under_test"); +$node->safe_psql($db_under_test, + "CREATE TABLE tab_stats_crash_discard_test1 AS SELECT generate_series(1,100) AS a" +); +$node->safe_psql($db_under_test, + "CREATE FUNCTION func_stats_crash_discard1() RETURNS VOID AS 'select 2;' LANGUAGE SQL IMMUTABLE" +); + +# collect object oids +my $dboid = $node->safe_psql($db_under_test, + "SELECT oid FROM pg_database WHERE datname = '$db_under_test'"); +my $funcoid = $node->safe_psql($db_under_test, + "SELECT 'func_stats_crash_discard1()'::regprocedure::oid"); +my $tableoid = $node->safe_psql($db_under_test, + "SELECT 'tab_stats_crash_discard_test1'::regclass::oid"); + +# generate stats and flush them +trigger_funcrel_stat(); + +# verify stats objects exist +my $sect = "initial"; +is(have_stats('database', $dboid, 0), 't', "$sect: db stats do exist"); +is(have_stats('function', $dboid, $funcoid), + 't', "$sect: function stats do exist"); +is(have_stats('relation', $dboid, $tableoid), + 't', "$sect: relation stats do exist"); + +# regular shutdown +$node->stop(); + +# backup stats files +my $statsfile = $PostgreSQL::Test::Utils::tmp_check . '/' . "discard_stats1"; +ok(!-f "$statsfile", "backup statsfile cannot already exist"); + +my $datadir = $node->data_dir(); +my $og_stats = "$datadir/pg_stat/pgstat.stat"; +ok(-f "$og_stats", "origin stats file must exist"); +copy($og_stats, $statsfile) or die "Copy failed: $!"; + + +## test discarding of stats file after crash etc + +$node->start; + +$sect = "copy"; +is(have_stats('database', $dboid, 0), 't', "$sect: db stats do exist"); +is(have_stats('function', $dboid, $funcoid), + 't', "$sect: function stats do exist"); +is(have_stats('relation', $dboid, $tableoid), + 't', "$sect: relation stats do exist"); + +$node->stop('immediate'); + +ok(!-f "$og_stats", "no stats file should exist after immediate shutdown"); + +# copy the old stats back to test we discard stats after crash restart +copy($statsfile, $og_stats) or die "Copy failed: $!"; + +$node->start; + +# stats should have been discarded +$sect = "post immediate"; +is(have_stats('database', $dboid, 0), 'f', "$sect: db stats do not exist"); +is(have_stats('function', $dboid, $funcoid), + 'f', "$sect: function stats do exist"); +is(have_stats('relation', $dboid, $tableoid), + 'f', "$sect: relation stats do not exist"); + +# get rid of backup statsfile +unlink $statsfile or die "cannot unlink $statsfile $!"; + + +# generate new stats and flush them +trigger_funcrel_stat(); + +$sect = "post immediate, new"; +is(have_stats('database', $dboid, 0), 't', "$sect: db stats do exist"); +is(have_stats('function', $dboid, $funcoid), + 't', "$sect: function stats do exist"); +is(have_stats('relation', $dboid, $tableoid), + 't', "$sect: relation stats do exist"); + +# regular shutdown +$node->stop(); + + +## check an invalid stats file is handled + +overwrite_file($og_stats, "ZZZZZZZZZZZZZ"); + +# normal startup and no issues despite invalid stats file +$node->start; + +# no stats present due to invalid stats file +$sect = "invalid"; +is(have_stats('database', $dboid, 0), 'f', "$sect: db stats do not exist"); +is(have_stats('function', $dboid, $funcoid), + 'f', "$sect: function stats do not exist"); +is(have_stats('relation', $dboid, $tableoid), + 'f', "$sect: relation stats do not exist"); + + +## checks related to stats persistency around restarts and resets + +# Ensure enough checkpoints to protect against races for test after reset, +# even on very slow machines. +$node->safe_psql($connect_db, "CHECKPOINT; CHECKPOINT;"); + + +## check checkpoint and wal stats are incremented due to restart + +my $ckpt_start = checkpoint_stats(); +my $wal_start = wal_stats(); +$node->restart; + +$sect = "post restart"; +my $ckpt_restart = checkpoint_stats(); +my $wal_restart = wal_stats(); + +cmp_ok( + $ckpt_start->{count}, '<', + $ckpt_restart->{count}, + "$sect: increased checkpoint count"); +cmp_ok( + $wal_start->{records}, '<', + $wal_restart->{records}, + "$sect: increased wal record count"); +cmp_ok($wal_start->{bytes}, '<', $wal_restart->{bytes}, + "$sect: increased wal bytes"); +is( $ckpt_start->{reset}, + $ckpt_restart->{reset}, + "$sect: checkpoint stats_reset equal"); +is($wal_start->{reset}, $wal_restart->{reset}, + "$sect: wal stats_reset equal"); + + +## Check that checkpoint stats are reset, WAL stats aren't affected + +$node->safe_psql($connect_db, "SELECT pg_stat_reset_shared('bgwriter')"); + +$sect = "post ckpt reset"; +my $ckpt_reset = checkpoint_stats(); +my $wal_ckpt_reset = wal_stats(); + +cmp_ok($ckpt_restart->{count}, + '>', $ckpt_reset->{count}, "$sect: checkpoint count smaller"); +cmp_ok($ckpt_start->{reset}, 'lt', $ckpt_reset->{reset}, + "$sect: stats_reset newer"); + +cmp_ok( + $wal_restart->{records}, + '<=', + $wal_ckpt_reset->{records}, + "$sect: wal record count not affected by reset"); +is( $wal_start->{reset}, + $wal_ckpt_reset->{reset}, + "$sect: wal stats_reset equal"); + + +## check that checkpoint stats stay reset after restart + +$node->restart; + +$sect = "post ckpt reset & restart"; +my $ckpt_restart_reset = checkpoint_stats(); +my $wal_restart2 = wal_stats(); + +# made sure above there's enough checkpoints that this will be stable even on slow machines +cmp_ok( + $ckpt_restart_reset->{count}, + '<', + $ckpt_restart->{count}, + "$sect: checkpoint still reset"); +is($ckpt_restart_reset->{reset}, + $ckpt_reset->{reset}, "$sect: stats_reset same"); + +cmp_ok( + $wal_ckpt_reset->{records}, + '<', + $wal_restart2->{records}, + "$sect: increased wal record count"); +cmp_ok( + $wal_ckpt_reset->{bytes}, + '<', + $wal_restart2->{bytes}, + "$sect: increased wal bytes"); +is( $wal_start->{reset}, + $wal_restart2->{reset}, + "$sect: wal stats_reset equal"); + + +## check WAL stats stay reset + +$node->safe_psql($connect_db, "SELECT pg_stat_reset_shared('wal')"); + +$sect = "post wal reset"; +my $wal_reset = wal_stats(); + +cmp_ok( + $wal_reset->{records}, '<', + $wal_restart2->{records}, + "$sect: smaller record count"); +cmp_ok( + $wal_reset->{bytes}, '<', + $wal_restart2->{bytes}, + "$sect: smaller bytes"); +cmp_ok( + $wal_reset->{reset}, 'gt', + $wal_restart2->{reset}, + "$sect: newer stats_reset"); + +$node->restart; + +$sect = "post wal reset & restart"; +my $wal_reset_restart = wal_stats(); + +# enough WAL generated during prior tests and initdb to make this not racy +cmp_ok( + $wal_reset_restart->{records}, + '<', + $wal_restart2->{records}, + "$sect: smaller record count"); +cmp_ok( + $wal_reset->{bytes}, '<', + $wal_restart2->{bytes}, + "$sect: smaller bytes"); +cmp_ok( + $wal_reset->{reset}, 'gt', + $wal_restart2->{reset}, + "$sect: newer stats_reset"); + + +$node->stop; +done_testing(); + +sub trigger_funcrel_stat +{ + $node->safe_psql( + $db_under_test, q[ + SELECT * FROM tab_stats_crash_discard_test1; + SELECT func_stats_crash_discard1(); + SELECT pg_stat_force_next_flush();]); +} + +sub have_stats +{ + my ($kind, $dboid, $objoid) = @_; + + return $node->safe_psql($connect_db, + "SELECT pg_stat_have_stats('$kind', $dboid, $objoid)"); +} + +sub overwrite_file +{ + my ($filename, $str) = @_; + open my $fh, ">", $filename + or die "could not write \"$filename\": $!"; + print $fh $str; + close $fh; + return; +} + +sub checkpoint_stats +{ + my %results; + + $results{count} = $node->safe_psql($connect_db, + "SELECT checkpoints_timed + checkpoints_req FROM pg_stat_bgwriter"); + $results{reset} = $node->safe_psql($connect_db, + "SELECT stats_reset FROM pg_stat_bgwriter"); + + return \%results; +} + +sub wal_stats +{ + my %results; + $results{records} = + $node->safe_psql($connect_db, "SELECT wal_records FROM pg_stat_wal"); + $results{bytes} = + $node->safe_psql($connect_db, "SELECT wal_bytes FROM pg_stat_wal"); + $results{reset} = + $node->safe_psql($connect_db, "SELECT stats_reset FROM pg_stat_wal"); + + return \%results; +} From 3e707fbb4009e9ac1d0e8b78b7af9f3f03f4cf1a Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 7 Apr 2022 17:09:44 -0400 Subject: [PATCH 439/772] psql: add \dconfig command to show server's configuration parameters. Plain \dconfig is basically equivalent to SHOW except that you can give it a pattern with wildcards, either to match multiple GUCs or because you don't exactly remember the name you want. \dconfig+ adds type, context, and access-privilege information, mainly because every other kind of object privilege has a psql command to show it, so GUC privileges should too. (A form of this command was in some versions of the patch series leading up to commit a0ffa885e. We pulled it out then because of doubts that the design and code were up to snuff, but I think subsequent work has resolved that.) In passing, fix incorrect completion of GUC names in GRANT/REVOKE ON PARAMETER: a0ffa885e neglected to use the VERBATIM form of COMPLETE_WITH_QUERY, so it misbehaved for custom (qualified) GUC names. Mark Dilger and Tom Lane Discussion: https://postgr.es/m/3118455.1649267333@sss.pgh.pa.us --- doc/src/sgml/ddl.sgml | 2 +- doc/src/sgml/ref/psql-ref.sgml | 17 ++++++++ src/bin/psql/command.c | 9 ++++- src/bin/psql/describe.c | 62 ++++++++++++++++++++++++++++++ src/bin/psql/describe.h | 4 ++ src/bin/psql/help.c | 3 +- src/bin/psql/tab-complete.c | 7 +++- src/fe_utils/string_utils.c | 6 ++- src/test/regress/expected/psql.out | 17 ++++++++ src/test/regress/sql/psql.sql | 6 +++ 10 files changed, 127 insertions(+), 6 deletions(-) diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml index 492a960247..77ce39766c 100644 --- a/doc/src/sgml/ddl.sgml +++ b/doc/src/sgml/ddl.sgml @@ -2205,7 +2205,7 @@ REVOKE ALL ON accounts FROM PUBLIC; PARAMETER sA none - none + \dconfig+ SCHEMA diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index f01adb1fd2..92e5c50300 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -1380,6 +1380,23 @@ testdb=> + + \dconfig[+] [ pattern ] + + + Lists server configuration parameters and their values. + If pattern + is specified, only parameters whose names match the pattern are + listed. + If + is appended to the command name, each + parameter is listed with its data type, context in which the + parameter can be set, and access privileges (if non-default access + privileges have been granted). + + + + + \dC[+] [ pattern ] diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 079f4a1a76..db071d561f 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -780,7 +780,14 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) success = describeTablespaces(pattern, show_verbose); break; case 'c': - success = listConversions(pattern, show_verbose, show_system); + if (strncmp(cmd, "dconfig", 7) == 0) + success = describeConfigurationParameters(pattern, + show_verbose, + show_system); + else + success = listConversions(pattern, + show_verbose, + show_system); break; case 'C': success = listCasts(pattern, show_verbose); diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 3f1b3802c2..797ef233c9 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -4364,6 +4364,68 @@ listConversions(const char *pattern, bool verbose, bool showSystem) return true; } +/* + * \dconfig + * + * Describes configuration parameters. + */ +bool +describeConfigurationParameters(const char *pattern, bool verbose, + bool showSystem) +{ + PQExpBufferData buf; + PGresult *res; + printQueryOpt myopt = pset.popt; + + initPQExpBuffer(&buf); + printfPQExpBuffer(&buf, + "SELECT s.name AS \"%s\", " + "pg_catalog.current_setting(s.name) AS \"%s\"", + gettext_noop("Parameter"), + gettext_noop("Value")); + + if (verbose) + { + appendPQExpBuffer(&buf, + ", s.vartype AS \"%s\", s.context AS \"%s\", ", + gettext_noop("Type"), + gettext_noop("Context")); + if (pset.sversion >= 150000) + printACLColumn(&buf, "p.paracl"); + else + appendPQExpBuffer(&buf, "NULL AS \"%s\"", + gettext_noop("Access privileges")); + } + + appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_settings s\n"); + + if (verbose && pset.sversion >= 150000) + appendPQExpBufferStr(&buf, + " LEFT JOIN pg_catalog.pg_parameter_acl p\n" + " ON pg_catalog.lower(s.name) = p.parname\n"); + + processSQLNamePattern(pset.db, &buf, pattern, + false, false, + NULL, "pg_catalog.lower(s.name)", NULL, + NULL); + + appendPQExpBufferStr(&buf, "ORDER BY 1;"); + + res = PSQLexec(buf.data); + termPQExpBuffer(&buf); + if (!res) + return false; + + myopt.nullPrint = NULL; + myopt.title = _("List of configuration parameters"); + myopt.translate_header = true; + + printQuery(res, &myopt, pset.queryFout, false, pset.logfile); + + PQclear(res); + return true; +} + /* * \dy * diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h index fd6079679c..7872c71f58 100644 --- a/src/bin/psql/describe.h +++ b/src/bin/psql/describe.h @@ -76,6 +76,10 @@ extern bool listDomains(const char *pattern, bool verbose, bool showSystem); /* \dc */ extern bool listConversions(const char *pattern, bool verbose, bool showSystem); +/* \dconfig */ +extern bool describeConfigurationParameters(const char *pattern, bool verbose, + bool showSystem); + /* \dC */ extern bool listCasts(const char *pattern, bool verbose); diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index b3971bce64..1d3601e594 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -166,7 +166,7 @@ slashUsage(unsigned short int pager) * Use "psql --help=commands | wc" to count correctly. It's okay to count * the USE_READLINE line even in builds without that. */ - output = PageOutput(137, pager ? &(pset.popt.topt) : NULL); + output = PageOutput(138, pager ? &(pset.popt.topt) : NULL); fprintf(output, _("General\n")); fprintf(output, _(" \\copyright show PostgreSQL usage and distribution terms\n")); @@ -231,6 +231,7 @@ slashUsage(unsigned short int pager) fprintf(output, _(" \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n")); fprintf(output, _(" \\db[+] [PATTERN] list tablespaces\n")); fprintf(output, _(" \\dc[S+] [PATTERN] list conversions\n")); + fprintf(output, _(" \\dconfig[+] [PATTERN] list configuration parameters\n")); fprintf(output, _(" \\dC[+] [PATTERN] list casts\n")); fprintf(output, _(" \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n")); fprintf(output, _(" \\dD[S+] [PATTERN] list domains\n")); diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index a2df39d0c1..8f163fb7ba 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1004,6 +1004,7 @@ static const SchemaQuery Query_for_trigger_of_table = { "SELECT nspname FROM pg_catalog.pg_namespace "\ " WHERE nspname LIKE '%s'" +/* Use COMPLETE_WITH_QUERY_VERBATIM with these queries for GUC names: */ #define Query_for_list_of_alter_system_set_vars \ "SELECT name FROM "\ " (SELECT pg_catalog.lower(name) AS name FROM pg_catalog.pg_settings "\ @@ -1690,7 +1691,7 @@ psql_completion(const char *text, int start, int end) "\\connect", "\\conninfo", "\\C", "\\cd", "\\copy", "\\copyright", "\\crosstabview", "\\d", "\\da", "\\dA", "\\dAc", "\\dAf", "\\dAo", "\\dAp", - "\\db", "\\dc", "\\dC", "\\dd", "\\ddp", "\\dD", + "\\db", "\\dc", "\\dconfig", "\\dC", "\\dd", "\\ddp", "\\dD", "\\des", "\\det", "\\deu", "\\dew", "\\dE", "\\df", "\\dF", "\\dFd", "\\dFp", "\\dFt", "\\dg", "\\di", "\\dl", "\\dL", "\\dm", "\\dn", "\\do", "\\dO", "\\dp", "\\dP", "\\dPi", "\\dPt", @@ -3780,7 +3781,7 @@ psql_completion(const char *text, int start, int end) TailMatches("GRANT|REVOKE", MatchAny, MatchAny, "ON", "PARAMETER") || TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "PARAMETER") || TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, MatchAny, "ON", "PARAMETER")) - COMPLETE_WITH_QUERY(Query_for_list_of_alter_system_set_vars); + COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_alter_system_set_vars); else if (TailMatches("GRANT", MatchAny, "ON", "PARAMETER", MatchAny) || TailMatches("GRANT", MatchAny, MatchAny, "ON", "PARAMETER", MatchAny)) @@ -4532,6 +4533,8 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_QUERY(Query_for_list_of_access_methods); else if (TailMatchesCS("\\db*")) COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces); + else if (TailMatchesCS("\\dconfig*")) + COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_show_vars); else if (TailMatchesCS("\\dD*")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains); else if (TailMatchesCS("\\des*")) diff --git a/src/fe_utils/string_utils.c b/src/fe_utils/string_utils.c index bca50ec6de..1c61840462 100644 --- a/src/fe_utils/string_utils.c +++ b/src/fe_utils/string_utils.c @@ -918,8 +918,12 @@ processSQLNamePattern(PGconn *conn, PQExpBuffer buf, const char *pattern, * Convert shell-style 'pattern' into the regular expression(s) we want to * execute. Quoting/escaping into SQL literal format will be done below * using appendStringLiteralConn(). + * + * If the caller provided a schemavar, we want to split the pattern on + * ".", otherwise not. */ - patternToSQLRegex(PQclientEncoding(conn), NULL, &schemabuf, &namebuf, + patternToSQLRegex(PQclientEncoding(conn), NULL, + (schemavar ? &schemabuf : NULL), &namebuf, pattern, force_escape); /* diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out index 185c505312..8e11ebbcaa 100644 --- a/src/test/regress/expected/psql.out +++ b/src/test/regress/expected/psql.out @@ -5090,6 +5090,23 @@ List of access methods hash | uuid_ops | uuid | uuid | 2 | uuid_hash_extended (5 rows) +-- check \dconfig +set work_mem = 10240; +\dconfig work_mem +List of configuration parameters + Parameter | Value +-----------+------- + work_mem | 10MB +(1 row) + +\dconfig+ work* + List of configuration parameters + Parameter | Value | Type | Context | Access privileges +-----------+-------+---------+---------+------------------- + work_mem | 10MB | integer | user | +(1 row) + +reset work_mem; -- check \df, \do with argument specifications \df *sqrt List of functions diff --git a/src/test/regress/sql/psql.sql b/src/test/regress/sql/psql.sql index 8f49a5f347..bf372c37a5 100644 --- a/src/test/regress/sql/psql.sql +++ b/src/test/regress/sql/psql.sql @@ -1241,6 +1241,12 @@ drop role regress_partitioning_role; \dAp+ btree float_ops \dAp * pg_catalog.uuid_ops +-- check \dconfig +set work_mem = 10240; +\dconfig work_mem +\dconfig+ work* +reset work_mem; + -- check \df, \do with argument specifications \df *sqrt \df *sqrt num* From a90641eac24dfc8889122d88eb7f482cd3db8b39 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 7 Apr 2022 23:42:13 +0200 Subject: [PATCH 440/772] Revert "Rewrite some RI code to avoid using SPI" This reverts commit 99392cdd78b788295e52b9f4942fa11992fd5ba9. We'd rather rewrite ri_triggers.c as a whole rather than piecemeal. Discussion: https://postgr.es/m/E1ncXX2-000mFt-Pe@gemulon.postgresql.org --- src/backend/executor/execPartition.c | 174 +----- src/backend/executor/nodeLockRows.c | 161 +++--- src/backend/utils/adt/ri_triggers.c | 564 ++++++++------------ src/include/executor/execPartition.h | 6 - src/include/executor/executor.h | 8 - src/test/isolation/expected/fk-snapshot.out | 4 +- src/test/isolation/specs/fk-snapshot.spec | 5 +- 7 files changed, 317 insertions(+), 605 deletions(-) diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c index c22c9ac096..615bd80973 100644 --- a/src/backend/executor/execPartition.c +++ b/src/backend/executor/execPartition.c @@ -176,9 +176,8 @@ static void FormPartitionKeyDatum(PartitionDispatch pd, EState *estate, Datum *values, bool *isnull); -static int get_partition_for_tuple(PartitionKey key, - PartitionDesc partdesc, - Datum *values, bool *isnull); +static int get_partition_for_tuple(PartitionDispatch pd, Datum *values, + bool *isnull); static char *ExecBuildSlotPartitionKeyDescription(Relation rel, Datum *values, bool *isnull, @@ -319,9 +318,7 @@ ExecFindPartition(ModifyTableState *mtstate, * these values, error out. */ if (partdesc->nparts == 0 || - (partidx = get_partition_for_tuple(dispatch->key, - dispatch->partdesc, - values, isnull)) < 0) + (partidx = get_partition_for_tuple(dispatch, values, isnull)) < 0) { char *val_desc; @@ -1344,12 +1341,12 @@ FormPartitionKeyDatum(PartitionDispatch pd, * found or -1 if none found. */ static int -get_partition_for_tuple(PartitionKey key, - PartitionDesc partdesc, - Datum *values, bool *isnull) +get_partition_for_tuple(PartitionDispatch pd, Datum *values, bool *isnull) { int bound_offset; int part_index = -1; + PartitionKey key = pd->key; + PartitionDesc partdesc = pd->partdesc; PartitionBoundInfo boundinfo = partdesc->boundinfo; /* Route as appropriate based on partitioning strategy. */ @@ -1441,165 +1438,6 @@ get_partition_for_tuple(PartitionKey key, return part_index; } -/* - * ExecGetLeafPartitionForKey - * Finds the leaf partition of partitioned table 'root_rel' that would - * contain the specified key tuple. - * - * A subset of the table's columns (including all of the partition key columns) - * must be specified: - * - 'key_natts' indicats the number of columns contained in the key - * - 'key_attnums' indicates their attribute numbers as defined in 'root_rel' - * - 'key_vals' and 'key_nulls' specify the key tuple - * - * Returns the leaf partition, locked with the given lockmode, or NULL if - * there isn't one. Caller is responsibly for closing it. All intermediate - * partitions are also locked with the same lockmode. Caller must have locked - * the root already. - * - * In addition, the OID of the index of a unique constraint on the root table - * must be given as 'root_idxoid'; *leaf_idxoid will be set to the OID of the - * corresponding index on the returned leaf partition. (This can be used by - * caller to search for a tuple matching the key in the leaf partition.) - * - * This works because the unique key defined on the root relation is required - * to contain the partition key columns of all of the ancestors that lead up to - * a given leaf partition. - */ -Relation -ExecGetLeafPartitionForKey(Relation root_rel, int key_natts, - const AttrNumber *key_attnums, - Datum *key_vals, char *key_nulls, - Oid root_idxoid, int lockmode, - Oid *leaf_idxoid) -{ - Relation found_leafpart = NULL; - Relation rel = root_rel; - Oid constr_idxoid = root_idxoid; - PartitionDirectory partdir; - - Assert(root_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE); - - *leaf_idxoid = InvalidOid; - - partdir = CreatePartitionDirectory(CurrentMemoryContext, true); - - /* - * Descend through partitioned parents to find the leaf partition that - * would accept a row with the provided key values, starting with the root - * parent. - */ - for (;;) - { - PartitionKey partkey = RelationGetPartitionKey(rel); - PartitionDesc partdesc; - Datum partkey_vals[PARTITION_MAX_KEYS]; - bool partkey_isnull[PARTITION_MAX_KEYS]; - AttrNumber *root_partattrs = partkey->partattrs; - int found_att; - int partidx; - Oid partoid; - - CHECK_FOR_INTERRUPTS(); - - /* - * Collect partition key values from the unique key. - * - * Because we only have the root table's copy of pk_attnums, must map - * any non-root table's partition key attribute numbers to the root - * table's. - */ - if (rel != root_rel) - { - /* - * map->attnums will contain root table attribute numbers for each - * attribute of the current partitioned relation. - */ - AttrMap *map; - - map = build_attrmap_by_name_if_req(RelationGetDescr(root_rel), - RelationGetDescr(rel)); - if (map) - { - root_partattrs = palloc(partkey->partnatts * - sizeof(AttrNumber)); - for (int att = 0; att < partkey->partnatts; att++) - { - AttrNumber partattno = partkey->partattrs[att]; - - root_partattrs[att] = map->attnums[partattno - 1]; - } - - free_attrmap(map); - } - } - - /* - * Map the values/isnulls to match the partition description, as - * necessary. - * - * (Referenced key specification does not allow expressions, so there - * would not be expressions in the partition keys either.) - */ - Assert(partkey->partexprs == NIL); - found_att = 0; - for (int keyatt = 0; keyatt < key_natts; keyatt++) - { - for (int att = 0; att < partkey->partnatts; att++) - { - if (root_partattrs[att] == key_attnums[keyatt]) - { - partkey_vals[found_att] = key_vals[keyatt]; - partkey_isnull[found_att] = (key_nulls[keyatt] == 'n'); - found_att++; - break; - } - } - } - /* We had better have found values for all partition keys */ - Assert(found_att == partkey->partnatts); - - if (root_partattrs != partkey->partattrs) - pfree(root_partattrs); - - /* Get the PartitionDesc using the partition directory machinery. */ - partdesc = PartitionDirectoryLookup(partdir, rel); - if (partdesc->nparts == 0) - break; - - /* Find the partition for the key. */ - partidx = get_partition_for_tuple(partkey, partdesc, - partkey_vals, partkey_isnull); - Assert(partidx < 0 || partidx < partdesc->nparts); - - /* close the previous parent if any, but keep lock */ - if (rel != root_rel) - table_close(rel, NoLock); - - /* No partition found. */ - if (partidx < 0) - break; - - partoid = partdesc->oids[partidx]; - rel = table_open(partoid, lockmode); - constr_idxoid = index_get_partition(rel, constr_idxoid); - - /* - * We're done if the partition is a leaf, else find its partition in - * the next iteration. - */ - if (partdesc->is_leaf[partidx]) - { - *leaf_idxoid = constr_idxoid; - found_leafpart = rel; - break; - } - } - - DestroyPartitionDirectory(partdir); - return found_leafpart; -} - /* * ExecBuildSlotPartitionKeyDescription * diff --git a/src/backend/executor/nodeLockRows.c b/src/backend/executor/nodeLockRows.c index bbccafb2cf..1a9dab25dd 100644 --- a/src/backend/executor/nodeLockRows.c +++ b/src/backend/executor/nodeLockRows.c @@ -79,7 +79,10 @@ ExecLockRows(PlanState *pstate) Datum datum; bool isNull; ItemPointerData tid; + TM_FailureData tmfd; LockTupleMode lockmode; + int lockflags = 0; + TM_Result test; TupleTableSlot *markSlot; /* clear any leftover test tuple for this rel */ @@ -176,11 +179,74 @@ ExecLockRows(PlanState *pstate) break; } - /* skip tuple if it couldn't be locked */ - if (!ExecLockTableTuple(erm->relation, &tid, markSlot, - estate->es_snapshot, estate->es_output_cid, - lockmode, erm->waitPolicy, &epq_needed)) - goto lnext; + lockflags = TUPLE_LOCK_FLAG_LOCK_UPDATE_IN_PROGRESS; + if (!IsolationUsesXactSnapshot()) + lockflags |= TUPLE_LOCK_FLAG_FIND_LAST_VERSION; + + test = table_tuple_lock(erm->relation, &tid, estate->es_snapshot, + markSlot, estate->es_output_cid, + lockmode, erm->waitPolicy, + lockflags, + &tmfd); + + switch (test) + { + case TM_WouldBlock: + /* couldn't lock tuple in SKIP LOCKED mode */ + goto lnext; + + case TM_SelfModified: + + /* + * The target tuple was already updated or deleted by the + * current command, or by a later command in the current + * transaction. We *must* ignore the tuple in the former + * case, so as to avoid the "Halloween problem" of repeated + * update attempts. In the latter case it might be sensible + * to fetch the updated tuple instead, but doing so would + * require changing heap_update and heap_delete to not + * complain about updating "invisible" tuples, which seems + * pretty scary (table_tuple_lock will not complain, but few + * callers expect TM_Invisible, and we're not one of them). So + * for now, treat the tuple as deleted and do not process. + */ + goto lnext; + + case TM_Ok: + + /* + * Got the lock successfully, the locked tuple saved in + * markSlot for, if needed, EvalPlanQual testing below. + */ + if (tmfd.traversed) + epq_needed = true; + break; + + case TM_Updated: + if (IsolationUsesXactSnapshot()) + ereport(ERROR, + (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), + errmsg("could not serialize access due to concurrent update"))); + elog(ERROR, "unexpected table_tuple_lock status: %u", + test); + break; + + case TM_Deleted: + if (IsolationUsesXactSnapshot()) + ereport(ERROR, + (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), + errmsg("could not serialize access due to concurrent update"))); + /* tuple was deleted so don't return it */ + goto lnext; + + case TM_Invisible: + elog(ERROR, "attempted to lock invisible tuple"); + break; + + default: + elog(ERROR, "unrecognized table_tuple_lock status: %u", + test); + } /* Remember locked tuple's TID for EPQ testing and WHERE CURRENT OF */ erm->curCtid = tid; @@ -215,91 +281,6 @@ ExecLockRows(PlanState *pstate) return slot; } -/* - * ExecLockTableTuple - * Locks tuple with the specified TID in lockmode following given wait - * policy - * - * Returns true if the tuple was successfully locked. Locked tuple is loaded - * into provided slot. - */ -bool -ExecLockTableTuple(Relation relation, ItemPointer tid, TupleTableSlot *slot, - Snapshot snapshot, CommandId cid, - LockTupleMode lockmode, LockWaitPolicy waitPolicy, - bool *epq_needed) -{ - TM_FailureData tmfd; - int lockflags = TUPLE_LOCK_FLAG_LOCK_UPDATE_IN_PROGRESS; - TM_Result test; - - if (!IsolationUsesXactSnapshot()) - lockflags |= TUPLE_LOCK_FLAG_FIND_LAST_VERSION; - - test = table_tuple_lock(relation, tid, snapshot, slot, cid, lockmode, - waitPolicy, lockflags, &tmfd); - - switch (test) - { - case TM_WouldBlock: - /* couldn't lock tuple in SKIP LOCKED mode */ - return false; - - case TM_SelfModified: - - /* - * The target tuple was already updated or deleted by the current - * command, or by a later command in the current transaction. We - * *must* ignore the tuple in the former case, so as to avoid the - * "Halloween problem" of repeated update attempts. In the latter - * case it might be sensible to fetch the updated tuple instead, - * but doing so would require changing heap_update and heap_delete - * to not complain about updating "invisible" tuples, which seems - * pretty scary (table_tuple_lock will not complain, but few - * callers expect TM_Invisible, and we're not one of them). So for - * now, treat the tuple as deleted and do not process. - */ - return false; - - case TM_Ok: - - /* - * Got the lock successfully, the locked tuple saved in slot for - * EvalPlanQual, if asked by the caller. - */ - if (tmfd.traversed && epq_needed) - *epq_needed = true; - break; - - case TM_Updated: - if (IsolationUsesXactSnapshot()) - ereport(ERROR, - (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), - errmsg("could not serialize access due to concurrent update"))); - elog(ERROR, "unexpected table_tuple_lock status: %u", - test); - break; - - case TM_Deleted: - if (IsolationUsesXactSnapshot()) - ereport(ERROR, - (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), - errmsg("could not serialize access due to concurrent update"))); - /* tuple was deleted so don't return it */ - return false; - - case TM_Invisible: - elog(ERROR, "attempted to lock invisible tuple"); - return false; - - default: - elog(ERROR, "unrecognized table_tuple_lock status: %u", test); - return false; - } - - return true; -} - /* ---------------------------------------------------------------- * ExecInitLockRows * diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c index 088b402700..01d4c22cfc 100644 --- a/src/backend/utils/adt/ri_triggers.c +++ b/src/backend/utils/adt/ri_triggers.c @@ -23,7 +23,6 @@ #include "postgres.h" -#include "access/genam.h" #include "access/htup_details.h" #include "access/sysattr.h" #include "access/table.h" @@ -34,7 +33,6 @@ #include "catalog/pg_operator.h" #include "catalog/pg_type.h" #include "commands/trigger.h" -#include "executor/execPartition.h" #include "executor/executor.h" #include "executor/spi.h" #include "lib/ilist.h" @@ -70,14 +68,19 @@ #define RI_KEYS_NONE_NULL 2 /* RI query type codes */ -#define RI_PLAN_CASCADE_ONDELETE 1 -#define RI_PLAN_CASCADE_ONUPDATE 2 +/* these queries are executed against the PK (referenced) table: */ +#define RI_PLAN_CHECK_LOOKUPPK 1 +#define RI_PLAN_CHECK_LOOKUPPK_FROM_PK 2 +#define RI_PLAN_LAST_ON_PK RI_PLAN_CHECK_LOOKUPPK_FROM_PK +/* these queries are executed against the FK (referencing) table: */ +#define RI_PLAN_CASCADE_ONDELETE 3 +#define RI_PLAN_CASCADE_ONUPDATE 4 /* For RESTRICT, the same plan can be used for both ON DELETE and ON UPDATE triggers. */ -#define RI_PLAN_RESTRICT 3 -#define RI_PLAN_SETNULL_ONDELETE 4 -#define RI_PLAN_SETNULL_ONUPDATE 5 -#define RI_PLAN_SETDEFAULT_ONDELETE 6 -#define RI_PLAN_SETDEFAULT_ONUPDATE 7 +#define RI_PLAN_RESTRICT 5 +#define RI_PLAN_SETNULL_ONDELETE 6 +#define RI_PLAN_SETNULL_ONUPDATE 7 +#define RI_PLAN_SETDEFAULT_ONDELETE 8 +#define RI_PLAN_SETDEFAULT_ONUPDATE 9 #define MAX_QUOTED_NAME_LEN (NAMEDATALEN*2+3) #define MAX_QUOTED_REL_NAME_LEN (MAX_QUOTED_NAME_LEN*2) @@ -226,278 +229,9 @@ static void ri_ExtractValues(Relation rel, TupleTableSlot *slot, static void ri_ReportViolation(const RI_ConstraintInfo *riinfo, Relation pk_rel, Relation fk_rel, TupleTableSlot *violatorslot, TupleDesc tupdesc, - bool on_fk, bool partgone) pg_attribute_noreturn(); -static Oid get_fkey_unique_index(Oid conoid); + int queryno, bool partgone) pg_attribute_noreturn(); -/* - * Checks whether a tuple containing the unique key as extracted from the - * tuple provided in 'slot' exists in 'pk_rel'. The key is extracted using the - * constraint's index given in 'riinfo', which is also scanned to check the - * existence of the key. - * - * If 'pk_rel' is a partitioned table, the check is performed on its leaf - * partition that would contain the key. - * - * The provided tuple is either the one being inserted into the referencing - * relation ('fk_rel' is non-NULL), or the one being deleted from the - * referenced relation, that is, 'pk_rel' ('fk_rel' is NULL). - */ -static bool -ri_ReferencedKeyExists(Relation pk_rel, Relation fk_rel, - TupleTableSlot *slot, const RI_ConstraintInfo *riinfo) -{ - Oid constr_id = riinfo->constraint_id; - Oid idxoid; - Relation idxrel; - Relation leaf_pk_rel = NULL; - int num_pk; - int i; - bool found = false; - const Oid *eq_oprs; - Datum pk_vals[INDEX_MAX_KEYS]; - char pk_nulls[INDEX_MAX_KEYS]; - ScanKeyData skey[INDEX_MAX_KEYS]; - Snapshot snap = InvalidSnapshot; - bool pushed_latest_snapshot = false; - IndexScanDesc scan; - TupleTableSlot *outslot; - Oid saved_userid; - int saved_sec_context; - AclResult aclresult; - - /* - * Extract the unique key from the provided slot and choose the equality - * operators to use when scanning the index below. - */ - if (fk_rel) - { - ri_ExtractValues(fk_rel, slot, riinfo, false, pk_vals, pk_nulls); - /* Use PK = FK equality operator. */ - eq_oprs = riinfo->pf_eq_oprs; - - /* - * May need to cast each of the individual values of the foreign key - * to the corresponding PK column's type if the equality operator - * demands it. - */ - for (i = 0; i < riinfo->nkeys; i++) - { - if (pk_nulls[i] != 'n') - { - Oid eq_opr = eq_oprs[i]; - Oid typeid = RIAttType(fk_rel, riinfo->fk_attnums[i]); - RI_CompareHashEntry *entry = ri_HashCompareOp(eq_opr, typeid); - - if (OidIsValid(entry->cast_func_finfo.fn_oid)) - pk_vals[i] = FunctionCall3(&entry->cast_func_finfo, - pk_vals[i], - Int32GetDatum(-1), /* typmod */ - BoolGetDatum(false)); /* implicit coercion */ - } - } - } - else - { - ri_ExtractValues(pk_rel, slot, riinfo, true, pk_vals, pk_nulls); - /* Use PK = PK equality operator. */ - eq_oprs = riinfo->pp_eq_oprs; - } - - /* - * Switch to referenced table's owner to perform the below operations as. - * This matches what ri_PerformCheck() does. - * - * Note that as with queries done by ri_PerformCheck(), the way we select - * the referenced row below effectively bypasses any RLS policies that may - * be present on the referenced table. - */ - GetUserIdAndSecContext(&saved_userid, &saved_sec_context); - SetUserIdAndSecContext(RelationGetForm(pk_rel)->relowner, - saved_sec_context | SECURITY_LOCAL_USERID_CHANGE); - - /* - * Also check that the new user has permissions to look into the schema of - * and SELECT from the referenced table. - */ - aclresult = pg_namespace_aclcheck(RelationGetNamespace(pk_rel), - GetUserId(), ACL_USAGE); - if (aclresult != ACLCHECK_OK) - aclcheck_error(aclresult, OBJECT_SCHEMA, - get_namespace_name(RelationGetNamespace(pk_rel))); - aclresult = pg_class_aclcheck(RelationGetRelid(pk_rel), GetUserId(), - ACL_SELECT); - if (aclresult != ACLCHECK_OK) - aclcheck_error(aclresult, OBJECT_TABLE, - RelationGetRelationName(pk_rel)); - - /* Make the changes of the current command visible in all cases. */ - CommandCounterIncrement(); - - /* - * In the case of scanning the PK index for ri_Check_Pk_Match(), we'd like - * to see all rows that could be interesting, even those that would not be - * visible to the transaction snapshot. To do so, force-push the latest - * snapshot. - */ - if (fk_rel == NULL) - { - snap = GetLatestSnapshot(); - PushActiveSnapshot(snap); - pushed_latest_snapshot = true; - } - else - { - snap = GetTransactionSnapshot(); - PushActiveSnapshot(snap); - } - - /* - * Open the constraint index to be scanned. - * - * If the target table is partitioned, we must look up the leaf partition - * and its corresponding unique index to search the keys in. - */ - idxoid = get_fkey_unique_index(constr_id); - if (pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) - { - Oid leaf_idxoid; - Snapshot mysnap = InvalidSnapshot; - - /* - * XXX the partition descriptor machinery has a hack that assumes that - * the queries originating in this module push the latest snapshot in - * the transaction-snapshot mode. If we haven't pushed one already, - * do so now. - */ - if (!pushed_latest_snapshot) - { - mysnap = GetLatestSnapshot(); - PushActiveSnapshot(mysnap); - } - - leaf_pk_rel = ExecGetLeafPartitionForKey(pk_rel, riinfo->nkeys, - riinfo->pk_attnums, - pk_vals, pk_nulls, - idxoid, RowShareLock, - &leaf_idxoid); - - /* - * XXX done fiddling with the partition descriptor machinery so unset - * the active snapshot if we must. - */ - if (mysnap != InvalidSnapshot) - PopActiveSnapshot(); - - /* - * If no suitable leaf partition exists, neither can the key we're - * looking for. - */ - if (leaf_pk_rel == NULL) - { - SetUserIdAndSecContext(saved_userid, saved_sec_context); - PopActiveSnapshot(); - return false; - } - - pk_rel = leaf_pk_rel; - idxoid = leaf_idxoid; - } - idxrel = index_open(idxoid, RowShareLock); - - /* Set up ScanKeys for the index scan. */ - num_pk = IndexRelationGetNumberOfKeyAttributes(idxrel); - for (i = 0; i < num_pk; i++) - { - int pkattno = i + 1; - Oid operator = eq_oprs[i]; - Oid opfamily = idxrel->rd_opfamily[i]; - StrategyNumber strat = get_op_opfamily_strategy(operator, opfamily); - RegProcedure regop = get_opcode(operator); - - /* Initialize the scankey. */ - ScanKeyInit(&skey[i], - pkattno, - strat, - regop, - pk_vals[i]); - - skey[i].sk_collation = idxrel->rd_indcollation[i]; - - /* - * Check for null value. Should not occur, because callers currently - * take care of the cases in which they do occur. - */ - if (pk_nulls[i] == 'n') - skey[i].sk_flags |= SK_ISNULL; - } - - scan = index_beginscan(pk_rel, idxrel, snap, num_pk, 0); - index_rescan(scan, skey, num_pk, NULL, 0); - - /* Look for the tuple, and if found, try to lock it in key share mode. */ - outslot = table_slot_create(pk_rel, NULL); - if (index_getnext_slot(scan, ForwardScanDirection, outslot)) - { - /* - * If we fail to lock the tuple for whatever reason, assume it doesn't - * exist. - */ - found = ExecLockTableTuple(pk_rel, &(outslot->tts_tid), outslot, - snap, - GetCurrentCommandId(false), - LockTupleKeyShare, - LockWaitBlock, NULL); - } - - index_endscan(scan); - ExecDropSingleTupleTableSlot(outslot); - - /* Don't release lock until commit. */ - index_close(idxrel, NoLock); - - /* Close leaf partition relation if any. */ - if (leaf_pk_rel) - table_close(leaf_pk_rel, NoLock); - - /* Restore UID and security context */ - SetUserIdAndSecContext(saved_userid, saved_sec_context); - - PopActiveSnapshot(); - - return found; -} - -/* - * get_fkey_unique_index - * Returns the unique index used by a supposedly foreign key constraint - * - * XXX This is very similar to get_constraint_index; probably they should be - * unified. - */ -static Oid -get_fkey_unique_index(Oid conoid) -{ - Oid result = InvalidOid; - HeapTuple tp; - - tp = SearchSysCache1(CONSTROID, ObjectIdGetDatum(conoid)); - if (HeapTupleIsValid(tp)) - { - Form_pg_constraint contup = (Form_pg_constraint) GETSTRUCT(tp); - - if (contup->contype == CONSTRAINT_FOREIGN) - result = contup->conindid; - ReleaseSysCache(tp); - } - - if (!OidIsValid(result)) - elog(ERROR, "unique index not found for foreign key constraint %u", - conoid); - - return result; -} - /* * RI_FKey_check - * @@ -510,6 +244,8 @@ RI_FKey_check(TriggerData *trigdata) Relation fk_rel; Relation pk_rel; TupleTableSlot *newslot; + RI_QueryKey qkey; + SPIPlanPtr qplan; riinfo = ri_FetchConstraintInfo(trigdata->tg_trigger, trigdata->tg_relation, false); @@ -589,9 +325,9 @@ RI_FKey_check(TriggerData *trigdata) /* * MATCH PARTIAL - all non-null columns must match. (not - * implemented, can be done by modifying - * ri_ReferencedKeyExists() to only include non-null - * columns. + * implemented, can be done by modifying the query below + * to only include non-null columns, or by writing a + * special version here) */ break; #endif @@ -606,12 +342,74 @@ RI_FKey_check(TriggerData *trigdata) break; } - if (!ri_ReferencedKeyExists(pk_rel, fk_rel, newslot, riinfo)) - ri_ReportViolation(riinfo, - pk_rel, fk_rel, - newslot, - NULL, - true, false); + if (SPI_connect() != SPI_OK_CONNECT) + elog(ERROR, "SPI_connect failed"); + + /* Fetch or prepare a saved plan for the real check */ + ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_CHECK_LOOKUPPK); + + if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL) + { + StringInfoData querybuf; + char pkrelname[MAX_QUOTED_REL_NAME_LEN]; + char attname[MAX_QUOTED_NAME_LEN]; + char paramname[16]; + const char *querysep; + Oid queryoids[RI_MAX_NUMKEYS]; + const char *pk_only; + + /* ---------- + * The query string built is + * SELECT 1 FROM [ONLY] x WHERE pkatt1 = $1 [AND ...] + * FOR KEY SHARE OF x + * The type id's for the $ parameters are those of the + * corresponding FK attributes. + * ---------- + */ + initStringInfo(&querybuf); + pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ? + "" : "ONLY "; + quoteRelationName(pkrelname, pk_rel); + appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x", + pk_only, pkrelname); + querysep = "WHERE"; + for (int i = 0; i < riinfo->nkeys; i++) + { + Oid pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]); + Oid fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]); + + quoteOneName(attname, + RIAttName(pk_rel, riinfo->pk_attnums[i])); + sprintf(paramname, "$%d", i + 1); + ri_GenerateQual(&querybuf, querysep, + attname, pk_type, + riinfo->pf_eq_oprs[i], + paramname, fk_type); + querysep = "AND"; + queryoids[i] = fk_type; + } + appendStringInfoString(&querybuf, " FOR KEY SHARE OF x"); + + /* Prepare and save the plan */ + qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids, + &qkey, fk_rel, pk_rel); + } + + /* + * Now check that foreign key exists in PK table + * + * XXX detectNewRows must be true when a partitioned table is on the + * referenced side. The reason is that our snapshot must be fresh in + * order for the hack in find_inheritance_children() to work. + */ + ri_PerformCheck(riinfo, &qkey, qplan, + fk_rel, pk_rel, + NULL, newslot, + pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE, + SPI_OK_SELECT); + + if (SPI_finish() != SPI_OK_FINISH) + elog(ERROR, "SPI_finish failed"); table_close(pk_rel, RowShareLock); @@ -666,10 +464,81 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel, TupleTableSlot *oldslot, const RI_ConstraintInfo *riinfo) { + SPIPlanPtr qplan; + RI_QueryKey qkey; + bool result; + /* Only called for non-null rows */ Assert(ri_NullCheck(RelationGetDescr(pk_rel), oldslot, riinfo, true) == RI_KEYS_NONE_NULL); - return ri_ReferencedKeyExists(pk_rel, NULL, oldslot, riinfo); + if (SPI_connect() != SPI_OK_CONNECT) + elog(ERROR, "SPI_connect failed"); + + /* + * Fetch or prepare a saved plan for checking PK table with values coming + * from a PK row + */ + ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_CHECK_LOOKUPPK_FROM_PK); + + if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL) + { + StringInfoData querybuf; + char pkrelname[MAX_QUOTED_REL_NAME_LEN]; + char attname[MAX_QUOTED_NAME_LEN]; + char paramname[16]; + const char *querysep; + const char *pk_only; + Oid queryoids[RI_MAX_NUMKEYS]; + + /* ---------- + * The query string built is + * SELECT 1 FROM [ONLY] x WHERE pkatt1 = $1 [AND ...] + * FOR KEY SHARE OF x + * The type id's for the $ parameters are those of the + * PK attributes themselves. + * ---------- + */ + initStringInfo(&querybuf); + pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ? + "" : "ONLY "; + quoteRelationName(pkrelname, pk_rel); + appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x", + pk_only, pkrelname); + querysep = "WHERE"; + for (int i = 0; i < riinfo->nkeys; i++) + { + Oid pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]); + + quoteOneName(attname, + RIAttName(pk_rel, riinfo->pk_attnums[i])); + sprintf(paramname, "$%d", i + 1); + ri_GenerateQual(&querybuf, querysep, + attname, pk_type, + riinfo->pp_eq_oprs[i], + paramname, pk_type); + querysep = "AND"; + queryoids[i] = pk_type; + } + appendStringInfoString(&querybuf, " FOR KEY SHARE OF x"); + + /* Prepare and save the plan */ + qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids, + &qkey, fk_rel, pk_rel); + } + + /* + * We have a plan now. Run it. + */ + result = ri_PerformCheck(riinfo, &qkey, qplan, + fk_rel, pk_rel, + oldslot, NULL, + true, /* treat like update */ + SPI_OK_SELECT); + + if (SPI_finish() != SPI_OK_FINISH) + elog(ERROR, "SPI_finish failed"); + + return result; } @@ -1739,10 +1608,15 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel) errtableconstraint(fk_rel, NameStr(fake_riinfo.conname)))); + /* + * We tell ri_ReportViolation we were doing the RI_PLAN_CHECK_LOOKUPPK + * query, which isn't true, but will cause it to use + * fake_riinfo.fk_attnums as we need. + */ ri_ReportViolation(&fake_riinfo, pk_rel, fk_rel, slot, tupdesc, - true, false); + RI_PLAN_CHECK_LOOKUPPK, false); ExecDropSingleTupleTableSlot(slot); } @@ -1959,7 +1833,7 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel) fake_riinfo.pk_attnums[i] = i + 1; ri_ReportViolation(&fake_riinfo, pk_rel, fk_rel, - slot, tupdesc, true, true); + slot, tupdesc, 0, true); } if (SPI_finish() != SPI_OK_FINISH) @@ -2096,8 +1970,9 @@ ri_BuildQueryKey(RI_QueryKey *key, const RI_ConstraintInfo *riinfo, { /* * Inherited constraints with a common ancestor can share ri_query_cache - * entries, because each query processes the other table involved in the - * FK constraint (i.e., not the table on which the trigger has been + * entries for all query types except RI_PLAN_CHECK_LOOKUPPK_FROM_PK. + * Except in that case, the query processes the other table involved in + * the FK constraint (i.e., not the table on which the trigger has been * fired), and so it will be the same for all members of the inheritance * tree. So we may use the root constraint's OID in the hash key, rather * than the constraint's own OID. This avoids creating duplicate SPI @@ -2108,13 +1983,13 @@ ri_BuildQueryKey(RI_QueryKey *key, const RI_ConstraintInfo *riinfo, * constraint, because partitions can have different column orders, * resulting in different pk_attnums[] or fk_attnums[] array contents.) * - * (Note also that for a standalone or non-inherited constraint, - * constraint_root_id is same as constraint_id.) - * * We assume struct RI_QueryKey contains no padding bytes, else we'd need * to use memset to clear them. */ - key->constr_id = riinfo->constraint_root_id; + if (constr_queryno != RI_PLAN_CHECK_LOOKUPPK_FROM_PK) + key->constr_id = riinfo->constraint_root_id; + else + key->constr_id = riinfo->constraint_id; key->constr_queryno = constr_queryno; } @@ -2385,12 +2260,19 @@ ri_PlanCheck(const char *querystr, int nargs, Oid *argtypes, RI_QueryKey *qkey, Relation fk_rel, Relation pk_rel) { SPIPlanPtr qplan; - - /* There are currently no queries that run on PK table. */ - Relation query_rel = fk_rel; + Relation query_rel; Oid save_userid; int save_sec_context; + /* + * Use the query type code to determine whether the query is run against + * the PK or FK table; we'll do the check as that table's owner + */ + if (qkey->constr_queryno <= RI_PLAN_LAST_ON_PK) + query_rel = pk_rel; + else + query_rel = fk_rel; + /* Switch to proper UID to perform check as */ GetUserIdAndSecContext(&save_userid, &save_sec_context); SetUserIdAndSecContext(RelationGetForm(query_rel)->relowner, @@ -2423,9 +2305,9 @@ ri_PerformCheck(const RI_ConstraintInfo *riinfo, TupleTableSlot *oldslot, TupleTableSlot *newslot, bool detectNewRows, int expect_OK) { - /* There are currently no queries that run on PK table. */ - Relation query_rel = fk_rel, - source_rel = pk_rel; + Relation query_rel, + source_rel; + bool source_is_pk; Snapshot test_snapshot; Snapshot crosscheck_snapshot; int limit; @@ -2435,17 +2317,46 @@ ri_PerformCheck(const RI_ConstraintInfo *riinfo, Datum vals[RI_MAX_NUMKEYS * 2]; char nulls[RI_MAX_NUMKEYS * 2]; + /* + * Use the query type code to determine whether the query is run against + * the PK or FK table; we'll do the check as that table's owner + */ + if (qkey->constr_queryno <= RI_PLAN_LAST_ON_PK) + query_rel = pk_rel; + else + query_rel = fk_rel; + + /* + * The values for the query are taken from the table on which the trigger + * is called - it is normally the other one with respect to query_rel. An + * exception is ri_Check_Pk_Match(), which uses the PK table for both (and + * sets queryno to RI_PLAN_CHECK_LOOKUPPK_FROM_PK). We might eventually + * need some less klugy way to determine this. + */ + if (qkey->constr_queryno == RI_PLAN_CHECK_LOOKUPPK) + { + source_rel = fk_rel; + source_is_pk = false; + } + else + { + source_rel = pk_rel; + source_is_pk = true; + } + /* Extract the parameters to be passed into the query */ if (newslot) { - ri_ExtractValues(source_rel, newslot, riinfo, true, vals, nulls); + ri_ExtractValues(source_rel, newslot, riinfo, source_is_pk, + vals, nulls); if (oldslot) - ri_ExtractValues(source_rel, oldslot, riinfo, true, + ri_ExtractValues(source_rel, oldslot, riinfo, source_is_pk, vals + riinfo->nkeys, nulls + riinfo->nkeys); } else { - ri_ExtractValues(source_rel, oldslot, riinfo, true, vals, nulls); + ri_ExtractValues(source_rel, oldslot, riinfo, source_is_pk, + vals, nulls); } /* @@ -2509,12 +2420,14 @@ ri_PerformCheck(const RI_ConstraintInfo *riinfo, errhint("This is most likely due to a rule having rewritten the query."))); /* XXX wouldn't it be clearer to do this part at the caller? */ - if (expect_OK == SPI_OK_SELECT && SPI_processed != 0) + if (qkey->constr_queryno != RI_PLAN_CHECK_LOOKUPPK_FROM_PK && + expect_OK == SPI_OK_SELECT && + (SPI_processed == 0) == (qkey->constr_queryno == RI_PLAN_CHECK_LOOKUPPK)) ri_ReportViolation(riinfo, pk_rel, fk_rel, newslot ? newslot : oldslot, NULL, - false, false); + qkey->constr_queryno, false); return SPI_processed != 0; } @@ -2545,9 +2458,9 @@ ri_ExtractValues(Relation rel, TupleTableSlot *slot, /* * Produce an error report * - * If the failed constraint was on insert/update to the FK table (on_fk is - * true), we want the key names and values extracted from there, and the - * error message to look like 'key blah is not present in PK'. + * If the failed constraint was on insert/update to the FK table, + * we want the key names and values extracted from there, and the error + * message to look like 'key blah is not present in PK'. * Otherwise, the attr names and values come from the PK table and the * message looks like 'key blah is still referenced from FK'. */ @@ -2555,20 +2468,22 @@ static void ri_ReportViolation(const RI_ConstraintInfo *riinfo, Relation pk_rel, Relation fk_rel, TupleTableSlot *violatorslot, TupleDesc tupdesc, - bool on_fk, bool partgone) + int queryno, bool partgone) { StringInfoData key_names; StringInfoData key_values; + bool onfk; const int16 *attnums; Oid rel_oid; AclResult aclresult; bool has_perm = true; /* - * If tupdesc wasn't passed by caller, assume the violator tuple came from - * there. + * Determine which relation to complain about. If tupdesc wasn't passed + * by caller, assume the violator tuple came from there. */ - if (on_fk) + onfk = (queryno == RI_PLAN_CHECK_LOOKUPPK); + if (onfk) { attnums = riinfo->fk_attnums; rel_oid = fk_rel->rd_id; @@ -2670,7 +2585,7 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo, key_names.data, key_values.data, RelationGetRelationName(fk_rel)), errtableconstraint(fk_rel, NameStr(riinfo->conname)))); - else if (on_fk) + else if (onfk) ereport(ERROR, (errcode(ERRCODE_FOREIGN_KEY_VIOLATION), errmsg("insert or update on table \"%s\" violates foreign key constraint \"%s\"", @@ -2977,10 +2892,7 @@ ri_AttributesEqual(Oid eq_opr, Oid typeid, * ri_HashCompareOp - * * See if we know how to compare two values, and create a new hash entry - * if not. The entry contains the FmgrInfo of the equality operator function - * and that of the cast function, if one is needed to convert the right - * operand (whose type OID has been passed) before passing it to the equality - * function. + * if not. */ static RI_CompareHashEntry * ri_HashCompareOp(Oid eq_opr, Oid typeid) @@ -3036,16 +2948,8 @@ ri_HashCompareOp(Oid eq_opr, Oid typeid) * moment since that will never be generated for implicit coercions. */ op_input_types(eq_opr, &lefttype, &righttype); - - /* - * Don't need to cast if the values that will be passed to the - * operator will be of expected operand type(s). The operator can be - * cross-type (such as when called by ri_ReferencedKeyExists()), in - * which case, we only need the cast if the right operand value - * doesn't match the type expected by the operator. - */ - if ((lefttype == righttype && typeid == lefttype) || - (lefttype != righttype && typeid == righttype)) + Assert(lefttype == righttype); + if (typeid == lefttype) castfunc = InvalidOid; /* simplest case */ else { diff --git a/src/include/executor/execPartition.h b/src/include/executor/execPartition.h index cbe1d996e6..708435e952 100644 --- a/src/include/executor/execPartition.h +++ b/src/include/executor/execPartition.h @@ -31,12 +31,6 @@ extern ResultRelInfo *ExecFindPartition(ModifyTableState *mtstate, EState *estate); extern void ExecCleanupTupleRouting(ModifyTableState *mtstate, PartitionTupleRouting *proute); -extern Relation ExecGetLeafPartitionForKey(Relation root_rel, - int key_natts, - const AttrNumber *key_attnums, - Datum *key_vals, char *key_nulls, - Oid root_idxoid, int lockmode, - Oid *leaf_idxoid); /* diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index 216d28679a..873772f188 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -651,14 +651,6 @@ extern void CheckCmdReplicaIdentity(Relation rel, CmdType cmd); extern void CheckSubscriptionRelkind(char relkind, const char *nspname, const char *relname); -/* - * prototypes from functions in nodeLockRows.c - */ -extern bool ExecLockTableTuple(Relation relation, ItemPointer tid, - TupleTableSlot *slot, Snapshot snapshot, - CommandId cid, LockTupleMode lockmode, - LockWaitPolicy waitPolicy, bool *epq_needed); - /* * prototypes from functions in nodeModifyTable.c */ diff --git a/src/test/isolation/expected/fk-snapshot.out b/src/test/isolation/expected/fk-snapshot.out index 22752cc742..5faf80d6ce 100644 --- a/src/test/isolation/expected/fk-snapshot.out +++ b/src/test/isolation/expected/fk-snapshot.out @@ -47,12 +47,12 @@ a step s2ifn2: INSERT INTO fk_noparted VALUES (2); step s2c: COMMIT; -ERROR: insert or update on table "fk_noparted" violates foreign key constraint "fk_noparted_a_fkey" step s2sfn: SELECT * FROM fk_noparted; a - 1 -(1 row) +2 +(2 rows) starting permutation: s1brc s2brc s2ip2 s1sp s2c s1sp s1ifp2 s2brc s2sfp s1c s1sfp s2ifn2 s2c s2sfn diff --git a/src/test/isolation/specs/fk-snapshot.spec b/src/test/isolation/specs/fk-snapshot.spec index 64d27f29c3..378507fbc3 100644 --- a/src/test/isolation/specs/fk-snapshot.spec +++ b/src/test/isolation/specs/fk-snapshot.spec @@ -46,7 +46,10 @@ step s2sfn { SELECT * FROM fk_noparted; } # inserting into referencing tables in transaction-snapshot mode # PK table is non-partitioned permutation s1brr s2brc s2ip2 s1sp s2c s1sp s1ifp2 s1c s1sfp -# PK table is partitioned +# PK table is partitioned: buggy, because s2's serialization transaction can +# see the uncommitted row thanks to the latest snapshot taken for +# partition lookup to work correctly also ends up getting used by the PK index +# scan permutation s2ip2 s2brr s1brc s1ifp2 s2sfp s1c s2sfp s2ifn2 s2c s2sfn # inserting into referencing tables in up-to-date snapshot mode From 53b9cd20d4144f5d65c107babe23916aad6c2ef8 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 21 Mar 2022 12:58:51 -0700 Subject: [PATCH 441/772] pgstat: test stats interactions with physical replication. Tests that standbys: - drop stats for objects when the those records are replayed - persist stats across graceful restarts - discard stats after immediate / crash restarts Author: Melanie Plageman Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- .../recovery/t/030_stats_cleanup_replica.pl | 206 ++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 src/test/recovery/t/030_stats_cleanup_replica.pl diff --git a/src/test/recovery/t/030_stats_cleanup_replica.pl b/src/test/recovery/t/030_stats_cleanup_replica.pl new file mode 100644 index 0000000000..cc92ddbb52 --- /dev/null +++ b/src/test/recovery/t/030_stats_cleanup_replica.pl @@ -0,0 +1,206 @@ +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +# Tests that standbys: +# - drop stats for objects when the those records are replayed +# - persist stats across graceful restarts +# - discard stats after immediate / crash restarts + +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); +$node_primary->init(allows_streaming => 1); +$node_primary->append_conf('postgresql.conf', "track_functions = 'all'"); +$node_primary->start; + +my $backup_name = 'my_backup'; +$node_primary->backup($backup_name); + +my $node_standby = PostgreSQL::Test::Cluster->new('standby'); +$node_standby->init_from_backup($node_primary, $backup_name, + has_streaming => 1); +$node_standby->start; + + +## Test that stats are cleaned up on standby after dropping table or function + +my $sect = 'initial'; + +my ($dboid, $tableoid, $funcoid) = + populate_standby_stats('postgres', 'public'); +test_standby_func_tab_stats_status('postgres', + $dboid, $tableoid, $funcoid, 't'); + +drop_table_by_oid('postgres', $tableoid); +drop_function_by_oid('postgres', $funcoid); + +$sect = 'post drop'; +my $primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); +test_standby_func_tab_stats_status('postgres', + $dboid, $tableoid, $funcoid, 'f'); + + +## Test that stats are cleaned up on standby after dropping indirectly + +$sect = "schema creation"; + +$node_primary->safe_psql('postgres', "CREATE SCHEMA drop_schema_test1"); +$primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + +($dboid, $tableoid, $funcoid) = + populate_standby_stats('postgres', 'drop_schema_test1'); + +test_standby_func_tab_stats_status('postgres', + $dboid, $tableoid, $funcoid, 't'); +$node_primary->safe_psql('postgres', "DROP SCHEMA drop_schema_test1 CASCADE"); + +$sect = "post schema drop"; + +$primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + +# verify table and function stats removed from standby +test_standby_func_tab_stats_status('postgres', + $dboid, $tableoid, $funcoid, 'f'); + + +## Test that stats are cleaned up on standby after dropping database + +$sect = "createdb"; + +$node_primary->safe_psql('postgres', "CREATE DATABASE test"); +$primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + +($dboid, $tableoid, $funcoid) = populate_standby_stats('test', 'public'); + +# verify stats are present +test_standby_func_tab_stats_status('test', $dboid, $tableoid, $funcoid, 't'); +test_standby_db_stats_status('test', $dboid, 't'); + +$node_primary->safe_psql('postgres', "DROP DATABASE test"); +$sect = "post dropdb"; +$primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + +# Test that the stats were cleaned up on standby +# Note that this connects to 'postgres' but provides the dboid of dropped db +# 'test' which we acquired previously +test_standby_func_tab_stats_status('postgres', + $dboid, $tableoid, $funcoid, 'f'); + +test_standby_db_stats_status('postgres', $dboid, 'f'); + + +## verify that stats persist across graceful restarts on a replica + +# NB: Can't test database stats, they're immediately repopulated when +# reconnecting... +$sect = "pre restart"; +($dboid, $tableoid, $funcoid) = populate_standby_stats('postgres', 'public'); +test_standby_func_tab_stats_status('postgres', + $dboid, $tableoid, $funcoid, 't'); + +$node_standby->restart(); + +$sect = "post non-immediate"; + +test_standby_func_tab_stats_status('postgres', + $dboid, $tableoid, $funcoid, 't'); + +# but gone after an immediate restart +$node_standby->stop('immediate'); +$node_standby->start(); + +$sect = "post immediate restart"; + +test_standby_func_tab_stats_status('postgres', + $dboid, $tableoid, $funcoid, 'f'); + + +done_testing(); + + +sub populate_standby_stats +{ + my ($connect_db, $schema) = @_; + + # create objects on primary + $node_primary->safe_psql($connect_db, + "CREATE TABLE $schema.drop_tab_test1 AS SELECT generate_series(1,100) AS a" + ); + $node_primary->safe_psql($connect_db, + "CREATE FUNCTION $schema.drop_func_test1() RETURNS VOID AS 'select 2;' LANGUAGE SQL IMMUTABLE" + ); + my $primary_lsn = $node_primary->lsn('flush'); + $node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + + # collect object oids + my $dboid = $node_standby->safe_psql($connect_db, + "SELECT oid FROM pg_database WHERE datname = '$connect_db'"); + my $tableoid = $node_standby->safe_psql($connect_db, + "SELECT '$schema.drop_tab_test1'::regclass::oid"); + my $funcoid = $node_standby->safe_psql($connect_db, + "SELECT '$schema.drop_func_test1()'::regprocedure::oid"); + + # generate stats on standby + $node_standby->safe_psql($connect_db, + "SELECT * FROM $schema.drop_tab_test1"); + $node_standby->safe_psql($connect_db, "SELECT $schema.drop_func_test1()"); + + return ($dboid, $tableoid, $funcoid); +} + +sub drop_function_by_oid +{ + my ($connect_db, $funcoid) = @_; + + # Get function name from returned oid + my $func_name = $node_primary->safe_psql($connect_db, + "SELECT '$funcoid'::regprocedure"); + $node_primary->safe_psql($connect_db, "DROP FUNCTION $func_name"); +} + +sub drop_table_by_oid +{ + my ($connect_db, $tableoid) = @_; + + # Get table name from returned oid + my $table_name = + $node_primary->safe_psql($connect_db, "SELECT '$tableoid'::regclass"); + $node_primary->safe_psql($connect_db, "DROP TABLE $table_name"); +} + +sub test_standby_func_tab_stats_status +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my ($connect_db, $dboid, $tableoid, $funcoid, $present) = @_; + + my %expected = (rel => $present, func => $present); + my %stats; + + $stats{rel} = $node_standby->safe_psql($connect_db, + "SELECT pg_stat_have_stats('relation', $dboid, $tableoid)"); + $stats{func} = $node_standby->safe_psql($connect_db, + "SELECT pg_stat_have_stats('function', $dboid, $funcoid)"); + + is_deeply(\%stats, \%expected, "$sect: standby stats as expected"); + + return; +} + +sub test_standby_db_stats_status +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my ($connect_db, $dboid, $present) = @_; + + is( $node_standby->safe_psql( + $connect_db, "SELECT pg_stat_have_stats('database', $dboid, 0)"), + $present, + "$sect: standby db stats as expected"); +} From 9f8a050f68dcb38fb0a1ea87e0e5d04df32b56f4 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 7 Apr 2022 12:46:51 -0700 Subject: [PATCH 442/772] Add minimal tests for recovery conflict handling. Previously none of our tests triggered recovery conflicts. The test is primarily motivated by needing tests for recovery conflict stats for shared memory based pgstats. But it's also a decent start for recovery conflict handling in general. The only type of recovery conflict not tested yet are rcovery deadlock conflicts. By configuring log_recovery_conflict_waits the test adds some very minimal testing for that path as well. Author: Melanie Plageman Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/test/recovery/t/031_recovery_conflict.pl | 296 +++++++++++++++++++ 1 file changed, 296 insertions(+) create mode 100644 src/test/recovery/t/031_recovery_conflict.pl diff --git a/src/test/recovery/t/031_recovery_conflict.pl b/src/test/recovery/t/031_recovery_conflict.pl new file mode 100644 index 0000000000..83a8579dcf --- /dev/null +++ b/src/test/recovery/t/031_recovery_conflict.pl @@ -0,0 +1,296 @@ +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +# Test that connections to a hot standby are correctly canceled when a +# recovery conflict is detected Also, test that statistics in +# pg_stat_database_conflicts are populated correctly + +# TODO: add a test for deadlock recovery conflicts. + +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + + +# Set up nodes +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); +$node_primary->init(allows_streaming => 1); + +my $tablespace1 = "test_recovery_conflict_tblspc"; + +$node_primary->append_conf( + 'postgresql.conf', qq[ +allow_in_place_tablespaces = on +log_temp_files = 0 + +# wait some to test the wait paths as well, but not long for obvious reasons +max_standby_streaming_delay = 50ms + +temp_tablespaces = $tablespace1 +# Some of the recovery conflict logging code only gets exercised after +# deadlock_timeout. The test doesn't rely on that additional output, but it's +# nice to get some minimal coverage of that code. +log_recovery_conflict_waits = on +deadlock_timeout = 10ms +]); +$node_primary->start; + +my $backup_name = 'my_backup'; + +$node_primary->safe_psql('postgres', + qq[CREATE TABLESPACE $tablespace1 LOCATION '']); + +$node_primary->backup($backup_name); +my $node_standby = PostgreSQL::Test::Cluster->new('standby'); +$node_standby->init_from_backup($node_primary, $backup_name, + has_streaming => 1); + +$node_standby->start; + +my $test_db = "test_db"; + +# use a new database, to trigger database recovery conflict +$node_primary->safe_psql('postgres', "CREATE DATABASE $test_db"); + +# test schema / data +my $table1 = "test_recovery_conflict_table1"; +$node_primary->safe_psql($test_db, qq[CREATE TABLE ${table1}(a int, b int);]); +$node_primary->safe_psql($test_db, + qq[INSERT INTO $table1 SELECT i % 3, 0 FROM generate_series(1,20) i]); +my $primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + + +# a longrunning psql that we can use to trigger conflicts +my $psql_timeout = IPC::Run::timer($PostgreSQL::Test::Utils::timeout_default); +my %psql_standby = ('stdin' => '', 'stdout' => ''); +$psql_standby{run} = + $node_standby->background_psql($test_db, \$psql_standby{stdin}, + \$psql_standby{stdout}, + $psql_timeout); +$psql_standby{stdout} = ''; + +my $expected_conflicts = 0; + + +## RECOVERY CONFLICT 1: Buffer pin conflict +my $sect = "buffer pin conflict"; +$expected_conflicts++; + +# Aborted INSERT on primary that will be cleaned up by vacuum. Has to be old +# enough so that there's not a snapshot conflict before the buffer pin +# conflict. + +$node_primary->safe_psql( + $test_db, + qq[ + BEGIN; + INSERT INTO $table1 VALUES (1,0); + ROLLBACK; + -- ensure flush, rollback doesn't do so + BEGIN; LOCK $table1; COMMIT; + ]); + +$primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + +my $cursor1 = "test_recovery_conflict_cursor"; + +# DECLARE and use a cursor on standby, causing buffer with the only block of +# the relation to be pinned on the standby +$psql_standby{stdin} .= qq[ + BEGIN; + DECLARE $cursor1 CURSOR FOR SELECT b FROM $table1; + FETCH FORWARD FROM $cursor1; + ]; +# FETCH FORWARD should have returned a 0 since all values of b in the table +# are 0 +ok(pump_until_standby(qr/^0$/m), + "$sect: cursor with conflicting pin established"); + +# to check the log starting now for recovery conflict messages +my $log_location = -s $node_standby->logfile; + +# VACUUM on the primary +$node_primary->safe_psql($test_db, qq[VACUUM $table1;]); + +# Wait for catchup. Existing connection will be terminated before replay is +# finished, so waiting for catchup ensures that there is no race between +# encountering the recovery conflict which causes the disconnect and checking +# the logfile for the terminated connection. +$primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + +check_conflict_log("User was holding shared buffer pin for too long"); +reconnect_and_clear(); +check_conflict_stat("bufferpin"); + + +## RECOVERY CONFLICT 2: Snapshot conflict +$sect = "snapshot conflict"; +$expected_conflicts++; + +$node_primary->safe_psql($test_db, + qq[INSERT INTO $table1 SELECT i, 0 FROM generate_series(1,20) i]); +$primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + +# DECLARE and FETCH from cursor on the standby +$psql_standby{stdin} .= qq[ + BEGIN; + DECLARE $cursor1 CURSOR FOR SELECT b FROM $table1; + FETCH FORWARD FROM $cursor1; + ]; +ok( pump_until( + $psql_standby{run}, $psql_timeout, + \$psql_standby{stdout}, qr/^0$/m,), + "$sect: cursor with conflicting snapshot established"); + +# Do some HOT updates +$node_primary->safe_psql($test_db, + qq[UPDATE $table1 SET a = a + 1 WHERE a > 2;]); + +# VACUUM, pruning those dead tuples +$node_primary->safe_psql($test_db, qq[VACUUM $table1;]); + +# Wait for attempted replay of PRUNE records +$primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + +check_conflict_log( + "User query might have needed to see row versions that must be removed"); +reconnect_and_clear(); +check_conflict_stat("snapshot"); + + +## RECOVERY CONFLICT 3: Lock conflict +$sect = "lock conflict"; +$expected_conflicts++; + +# acquire lock to conflict with +$psql_standby{stdin} .= qq[ + BEGIN; + LOCK TABLE $table1 IN ACCESS SHARE MODE; + SELECT 1; + ]; +ok(pump_until_standby(qr/^1$/m), "$sect: conflicting lock acquired"); + +# DROP TABLE containing block which standby has in a pinned buffer +$node_primary->safe_psql($test_db, qq[DROP TABLE $table1;]); + +$primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + +check_conflict_log("User was holding a relation lock for too long"); +reconnect_and_clear(); +check_conflict_stat("lock"); + + +## RECOVERY CONFLICT 4: Tablespace conflict +$sect = "tablespace conflict"; +$expected_conflicts++; + +# DECLARE a cursor for a query which, with sufficiently low work_mem, will +# spill tuples into temp files in the temporary tablespace created during +# setup. +$psql_standby{stdin} .= qq[ + BEGIN; + SET work_mem = '64kB'; + DECLARE $cursor1 CURSOR FOR + SELECT count(*) FROM generate_series(1,6000); + FETCH FORWARD FROM $cursor1; + ]; +ok(pump_until_standby(qr/^6000$/m), + "$sect: cursor with conflicting temp file established"); + +# Drop the tablespace currently containing spill files for the query on the +# standby +$node_primary->safe_psql($test_db, qq[DROP TABLESPACE $tablespace1;]); + +$primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + +check_conflict_log( + "User was or might have been using tablespace that must be dropped"); +reconnect_and_clear(); +check_conflict_stat("tablespace"); + + +# Check that expected number of conflicts show in pg_stat_database. Needs to +# be tested before database is dropped, for obvious reasons. +is( $node_standby->safe_psql( + $test_db, + qq[SELECT conflicts FROM pg_stat_database WHERE datname='$test_db';]), + $expected_conflicts, + qq[$expected_conflicts recovery conflicts shown in pg_stat_database]); + + +## RECOVERY CONFLICT 5: Database conflict +$sect = "database conflict"; + +$node_primary->safe_psql('postgres', qq[DROP DATABASE $test_db;]); + +$primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + +check_conflict_log("User was connected to a database that must be dropped"); + + +# explicitly shut down psql instances gracefully - to avoid hangs or worse on +# windows +$psql_standby{stdin} .= "\\q\n"; +$psql_standby{run}->finish; + +$node_standby->stop(); +$node_primary->stop(); + + +done_testing(); + + +sub pump_until_standby +{ + my $match = shift; + + return pump_until($psql_standby{run}, $psql_timeout, + \$psql_standby{stdout}, $match); +} + +sub reconnect_and_clear +{ + $psql_standby{stdin} .= "\\q\n"; + $psql_standby{run}->finish; + + # restart + $psql_standby{run}->run(); + $psql_standby{stdin} = ''; + $psql_standby{stdout} = ''; + + # Run query to ensure connection has finished re-establishing + $psql_standby{stdin} .= qq[SELECT 1;\n]; + die unless pump_until_standby(qr/^1$/m); + $psql_standby{stdout} = ''; +} + +sub check_conflict_log +{ + my $message = shift; + my $old_log_location = $log_location; + + $log_location = $node_standby->wait_for_log(qr/$message/, $log_location); + + cmp_ok($log_location, '>', $old_log_location, + "$sect: logfile contains terminated connection due to recovery conflict" + ); +} + +sub check_conflict_stat +{ + my $conflict_type = shift; + my $count = $node_standby->safe_psql($test_db, + qq[SELECT confl_$conflict_type FROM pg_stat_database_conflicts WHERE datname='$test_db';] + ); + + is($count, 1, "$sect: stats show conflict on standby"); +} From 2f4d0d67994b32320487784afab7ab997d331bb5 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 7 Apr 2022 18:26:13 -0400 Subject: [PATCH 443/772] Extend plsample example to include a trigger handler. Mark Wong and Konstantina Skovola, reviewed by Chapman Flack Discussion: https://postgr.es/m/Yd8Cz22eHi80XS30@workstation-mark-wong --- .../modules/plsample/expected/plsample.out | 81 ++++++++ src/test/modules/plsample/plsample.c | 173 +++++++++++++++++- src/test/modules/plsample/sql/plsample.sql | 23 +++ 3 files changed, 274 insertions(+), 3 deletions(-) diff --git a/src/test/modules/plsample/expected/plsample.out b/src/test/modules/plsample/expected/plsample.out index a0c318b6df..8ad5f7af14 100644 --- a/src/test/modules/plsample/expected/plsample.out +++ b/src/test/modules/plsample/expected/plsample.out @@ -34,3 +34,84 @@ NOTICE: argument: 0; name: a1; value: {foo,bar,hoge} (1 row) +CREATE FUNCTION my_trigger_func() RETURNS trigger AS $$ +if TD_event == "INSERT" + return TD_NEW +elseif TD_event == "UPDATE" + return TD_NEW +else + return "OK" +end +$$ language plsample; +CREATE TABLE my_table (num integer, description text); +CREATE TRIGGER my_trigger_func BEFORE INSERT OR UPDATE ON my_table + FOR EACH ROW EXECUTE FUNCTION my_trigger_func(); +CREATE TRIGGER my_trigger_func2 AFTER INSERT OR UPDATE ON my_table + FOR EACH ROW EXECUTE FUNCTION my_trigger_func(8); +INSERT INTO my_table (num, description) +VALUES (1, 'first'); +NOTICE: source text of function "my_trigger_func": +if TD_event == "INSERT" + return TD_NEW +elseif TD_event == "UPDATE" + return TD_NEW +else + return "OK" +end + +NOTICE: trigger name: my_trigger_func +NOTICE: trigger relation: my_table +NOTICE: trigger relation schema: public +NOTICE: triggered by INSERT +NOTICE: triggered BEFORE +NOTICE: triggered per row +NOTICE: source text of function "my_trigger_func": +if TD_event == "INSERT" + return TD_NEW +elseif TD_event == "UPDATE" + return TD_NEW +else + return "OK" +end + +NOTICE: trigger name: my_trigger_func2 +NOTICE: trigger relation: my_table +NOTICE: trigger relation schema: public +NOTICE: triggered by INSERT +NOTICE: triggered AFTER +NOTICE: triggered per row +NOTICE: trigger arg[0]: 8 +UPDATE my_table +SET description = 'first, modified once' +WHERE num = 1; +NOTICE: source text of function "my_trigger_func": +if TD_event == "INSERT" + return TD_NEW +elseif TD_event == "UPDATE" + return TD_NEW +else + return "OK" +end + +NOTICE: trigger name: my_trigger_func +NOTICE: trigger relation: my_table +NOTICE: trigger relation schema: public +NOTICE: triggered by UPDATE +NOTICE: triggered BEFORE +NOTICE: triggered per row +NOTICE: source text of function "my_trigger_func": +if TD_event == "INSERT" + return TD_NEW +elseif TD_event == "UPDATE" + return TD_NEW +else + return "OK" +end + +NOTICE: trigger name: my_trigger_func2 +NOTICE: trigger relation: my_table +NOTICE: trigger relation schema: public +NOTICE: triggered by UPDATE +NOTICE: triggered AFTER +NOTICE: triggered per row +NOTICE: trigger arg[0]: 8 diff --git a/src/test/modules/plsample/plsample.c b/src/test/modules/plsample/plsample.c index 72693f6ee5..780db7292a 100644 --- a/src/test/modules/plsample/plsample.c +++ b/src/test/modules/plsample/plsample.c @@ -19,6 +19,7 @@ #include "catalog/pg_type.h" #include "commands/event_trigger.h" #include "commands/trigger.h" +#include "executor/spi.h" #include "funcapi.h" #include "utils/builtins.h" #include "utils/lsyscache.h" @@ -29,6 +30,7 @@ PG_MODULE_MAGIC; PG_FUNCTION_INFO_V1(plsample_call_handler); static Datum plsample_func_handler(PG_FUNCTION_ARGS); +static HeapTuple plsample_trigger_handler(PG_FUNCTION_ARGS); /* * Handle function, procedure, and trigger calls. @@ -38,6 +40,11 @@ plsample_call_handler(PG_FUNCTION_ARGS) { Datum retval = (Datum) 0; + /* + * Many languages will require cleanup that happens even in the event of + * an error. That can happen in the PG_FINALLY block. If none is needed, + * this PG_TRY construct can be omitted. + */ PG_TRY(); { /* @@ -51,6 +58,7 @@ plsample_call_handler(PG_FUNCTION_ARGS) * (TriggerData *) fcinfo->context includes the information of the * context. */ + retval = PointerGetDatum(plsample_trigger_handler(fcinfo)); } else if (CALLED_AS_EVENT_TRIGGER(fcinfo)) { @@ -58,6 +66,8 @@ plsample_call_handler(PG_FUNCTION_ARGS) * This function is called as an event trigger function, where * (EventTriggerData *) fcinfo->context includes the information * of the context. + * + * TODO: provide an example handler. */ } else @@ -101,9 +111,9 @@ plsample_func_handler(PG_FUNCTION_ARGS) FmgrInfo result_in_func; int numargs; - /* Fetch the source text of the function. */ - pl_tuple = SearchSysCache(PROCOID, - ObjectIdGetDatum(fcinfo->flinfo->fn_oid), 0, 0, 0); + /* Fetch the function's pg_proc entry. */ + pl_tuple = SearchSysCache1(PROCOID, + ObjectIdGetDatum(fcinfo->flinfo->fn_oid)); if (!HeapTupleIsValid(pl_tuple)) elog(ERROR, "cache lookup failed for function %u", fcinfo->flinfo->fn_oid); @@ -185,3 +195,160 @@ plsample_func_handler(PG_FUNCTION_ARGS) ret = InputFunctionCall(&result_in_func, source, result_typioparam, -1); PG_RETURN_DATUM(ret); } + +/* + * plsample_trigger_handler + * + * Function called by the call handler for trigger execution. + */ +static HeapTuple +plsample_trigger_handler(PG_FUNCTION_ARGS) +{ + TriggerData *trigdata = (TriggerData *) fcinfo->context; + char *string; + volatile HeapTuple rettup; + HeapTuple pl_tuple; + Datum ret; + char *source; + bool isnull; + Form_pg_proc pl_struct; + char *proname; + int rc PG_USED_FOR_ASSERTS_ONLY; + + /* Make sure this is being called from a trigger. */ + if (!CALLED_AS_TRIGGER(fcinfo)) + elog(ERROR, "not called by trigger manager"); + + /* Connect to the SPI manager */ + if (SPI_connect() != SPI_OK_CONNECT) + elog(ERROR, "could not connect to SPI manager"); + + rc = SPI_register_trigger_data(trigdata); + Assert(rc >= 0); + + /* Fetch the function's pg_proc entry. */ + pl_tuple = SearchSysCache1(PROCOID, + ObjectIdGetDatum(fcinfo->flinfo->fn_oid)); + if (!HeapTupleIsValid(pl_tuple)) + elog(ERROR, "cache lookup failed for function %u", + fcinfo->flinfo->fn_oid); + + /* + * Code Retrieval + * + * Extract and print the source text of the function. This can be used as + * a base for the function validation and execution. + */ + pl_struct = (Form_pg_proc) GETSTRUCT(pl_tuple); + proname = pstrdup(NameStr(pl_struct->proname)); + ret = SysCacheGetAttr(PROCOID, pl_tuple, Anum_pg_proc_prosrc, &isnull); + if (isnull) + elog(ERROR, "could not find source text of function \"%s\"", + proname); + source = DatumGetCString(DirectFunctionCall1(textout, ret)); + ereport(NOTICE, + (errmsg("source text of function \"%s\": %s", + proname, source))); + + /* + * We're done with the pg_proc tuple, so release it. (Note that the + * "proname" and "source" strings are now standalone copies.) + */ + ReleaseSysCache(pl_tuple); + + /* + * Code Augmentation + * + * The source text may be augmented here, such as by wrapping it as the + * body of a function in the target language, prefixing a parameter list + * with names like TD_name, TD_relid, TD_table_name, TD_table_schema, + * TD_event, TD_when, TD_level, TD_NEW, TD_OLD, and args, using whatever + * types in the target language are convenient. The augmented text can be + * cached in a longer-lived memory context, or, if the target language + * uses a compilation step, that can be done here, caching the result of + * the compilation. + */ + + /* + * Code Execution + * + * Here the function (the possibly-augmented source text, or the result of + * compilation if the target language uses such a step) should be + * executed, after binding values from the TriggerData struct to the + * appropriate parameters. + * + * In this example we just print a lot of info via ereport. + */ + + PG_TRY(); + { + ereport(NOTICE, + (errmsg("trigger name: %s", trigdata->tg_trigger->tgname))); + string = SPI_getrelname(trigdata->tg_relation); + ereport(NOTICE, (errmsg("trigger relation: %s", string))); + + string = SPI_getnspname(trigdata->tg_relation); + ereport(NOTICE, (errmsg("trigger relation schema: %s", string))); + + /* Example handling of different trigger aspects. */ + + if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event)) + { + ereport(NOTICE, (errmsg("triggered by INSERT"))); + rettup = trigdata->tg_trigtuple; + } + else if (TRIGGER_FIRED_BY_DELETE(trigdata->tg_event)) + { + ereport(NOTICE, (errmsg("triggered by DELETE"))); + rettup = trigdata->tg_trigtuple; + } + else if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event)) + { + ereport(NOTICE, (errmsg("triggered by UPDATE"))); + rettup = trigdata->tg_trigtuple; + } + else if (TRIGGER_FIRED_BY_TRUNCATE(trigdata->tg_event)) + { + ereport(NOTICE, (errmsg("triggered by TRUNCATE"))); + rettup = trigdata->tg_trigtuple; + } + else + elog(ERROR, "unrecognized event: %u", trigdata->tg_event); + + if (TRIGGER_FIRED_BEFORE(trigdata->tg_event)) + ereport(NOTICE, (errmsg("triggered BEFORE"))); + else if (TRIGGER_FIRED_AFTER(trigdata->tg_event)) + ereport(NOTICE, (errmsg("triggered AFTER"))); + else if (TRIGGER_FIRED_INSTEAD(trigdata->tg_event)) + ereport(NOTICE, (errmsg("triggered INSTEAD OF"))); + else + elog(ERROR, "unrecognized when: %u", trigdata->tg_event); + + if (TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) + ereport(NOTICE, (errmsg("triggered per row"))); + else if (TRIGGER_FIRED_FOR_STATEMENT(trigdata->tg_event)) + ereport(NOTICE, (errmsg("triggered per statement"))); + else + elog(ERROR, "unrecognized level: %u", trigdata->tg_event); + + /* + * Iterate through all of the trigger arguments, printing each input + * value. + */ + for (int i = 0; i < trigdata->tg_trigger->tgnargs; i++) + ereport(NOTICE, + (errmsg("trigger arg[%i]: %s", i, + trigdata->tg_trigger->tgargs[i]))); + } + PG_CATCH(); + { + /* Error cleanup code would go here */ + PG_RE_THROW(); + } + PG_END_TRY(); + + if (SPI_finish() != SPI_OK_FINISH) + elog(ERROR, "SPI_finish() failed"); + + return rettup; +} diff --git a/src/test/modules/plsample/sql/plsample.sql b/src/test/modules/plsample/sql/plsample.sql index bf0fddac7f..cf652ad56f 100644 --- a/src/test/modules/plsample/sql/plsample.sql +++ b/src/test/modules/plsample/sql/plsample.sql @@ -13,3 +13,26 @@ AS $$ Example of source with void result. $$ LANGUAGE plsample; SELECT plsample_result_void('{foo, bar, hoge}'); + +CREATE FUNCTION my_trigger_func() RETURNS trigger AS $$ +if TD_event == "INSERT" + return TD_NEW +elseif TD_event == "UPDATE" + return TD_NEW +else + return "OK" +end +$$ language plsample; + +CREATE TABLE my_table (num integer, description text); +CREATE TRIGGER my_trigger_func BEFORE INSERT OR UPDATE ON my_table + FOR EACH ROW EXECUTE FUNCTION my_trigger_func(); +CREATE TRIGGER my_trigger_func2 AFTER INSERT OR UPDATE ON my_table + FOR EACH ROW EXECUTE FUNCTION my_trigger_func(8); + +INSERT INTO my_table (num, description) +VALUES (1, 'first'); + +UPDATE my_table +SET description = 'first, modified once' +WHERE num = 1; From 9d9c02ccd1aea8e9131d8f4edb21bf1687e40782 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Fri, 8 Apr 2022 10:34:36 +1200 Subject: [PATCH 444/772] Teach planner and executor about monotonic window funcs Window functions such as row_number() always return a value higher than the previously returned value for tuples in any given window partition. Traditionally queries such as; SELECT * FROM ( SELECT *, row_number() over (order by c) rn FROM t ) t WHERE rn <= 10; were executed fairly inefficiently. Neither the query planner nor the executor knew that once rn made it to 11 that nothing further would match the outer query's WHERE clause. It would blindly continue until all tuples were exhausted from the subquery. Here we implement means to make the above execute more efficiently. This is done by way of adding a pg_proc.prosupport function to various of the built-in window functions and adding supporting code to allow the support function to inform the planner if the window function is monotonically increasing, monotonically decreasing, both or neither. The planner is then able to make use of that information and possibly allow the executor to short-circuit execution by way of adding a "run condition" to the WindowAgg to allow it to determine if some of its execution work can be skipped. This "run condition" is not like a normal filter. These run conditions are only built using quals comparing values to monotonic window functions. For monotonic increasing functions, quals making use of the btree operators for <, <= and = can be used (assuming the window function column is on the left). You can see here that once such a condition becomes false that a monotonic increasing function could never make it subsequently true again. For monotonically decreasing functions the >, >= and = btree operators for the given type can be used for run conditions. The best-case situation for this is when there is a single WindowAgg node without a PARTITION BY clause. Here when the run condition becomes false the WindowAgg node can simply return NULL. No more tuples will ever match the run condition. It's a little more complex when there is a PARTITION BY clause. In this case, we cannot return NULL as we must still process other partitions. To speed this case up we pull tuples from the outer plan to check if they're from the same partition and simply discard them if they are. When we find a tuple belonging to another partition we start processing as normal again until the run condition becomes false or we run out of tuples to process. When there are multiple WindowAgg nodes to evaluate then this complicates the situation. For intermediate WindowAggs we must ensure we always return all tuples to the calling node. Any filtering done could lead to incorrect results in WindowAgg nodes above. For all intermediate nodes, we can still save some work when the run condition becomes false. We've no need to evaluate the WindowFuncs anymore. Other WindowAgg nodes cannot reference the value of these and these tuples will not appear in the final result anyway. The savings here are small in comparison to what can be saved in the top-level WingowAgg, but still worthwhile. Intermediate WindowAgg nodes never filter out tuples, but here we change WindowAgg so that the top-level WindowAgg filters out tuples that don't match the intermediate WindowAgg node's run condition. Such filters appear in the "Filter" clause in EXPLAIN for the top-level WindowAgg node. Here we add prosupport functions to allow the above to work for; row_number(), rank(), dense_rank(), count(*) and count(expr). It appears technically possible to do the same for min() and max(), however, it seems unlikely to be useful enough, so that's not done here. Bump catversion Author: David Rowley Reviewed-by: Andy Fan, Zhihong Yu Discussion: https://postgr.es/m/CAApHDvqvp3At8++yF8ij06sdcoo1S_b2YoaT9D4Nf+MObzsrLQ@mail.gmail.com --- src/backend/commands/explain.c | 8 + src/backend/executor/nodeWindowAgg.c | 380 ++++++++++++++-------- src/backend/nodes/copyfuncs.c | 4 + src/backend/nodes/equalfuncs.c | 1 + src/backend/nodes/outfuncs.c | 6 + src/backend/nodes/readfuncs.c | 4 + src/backend/optimizer/path/allpaths.c | 284 ++++++++++++++++- src/backend/optimizer/plan/createplan.c | 13 +- src/backend/optimizer/plan/planner.c | 15 +- src/backend/optimizer/plan/setrefs.c | 102 ++++++ src/backend/optimizer/util/pathnode.c | 13 +- src/backend/utils/adt/int8.c | 44 +++ src/backend/utils/adt/windowfuncs.c | 63 ++++ src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.dat | 35 ++- src/include/nodes/execnodes.h | 24 +- src/include/nodes/nodes.h | 3 +- src/include/nodes/parsenodes.h | 1 + src/include/nodes/pathnodes.h | 3 + src/include/nodes/plannodes.h | 21 ++ src/include/nodes/supportnodes.h | 64 +++- src/include/optimizer/pathnode.h | 4 +- src/test/regress/expected/window.out | 398 ++++++++++++++++++++++++ src/test/regress/sql/window.sql | 206 ++++++++++++ 24 files changed, 1547 insertions(+), 151 deletions(-) diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 1e5701b8eb..512b41dc3a 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -1988,6 +1988,14 @@ ExplainNode(PlanState *planstate, List *ancestors, show_instrumentation_count("Rows Removed by Filter", 1, planstate, es); break; + case T_WindowAgg: + show_upper_qual(plan->qual, "Filter", planstate, ancestors, es); + if (plan->qual) + show_instrumentation_count("Rows Removed by Filter", 1, + planstate, es); + show_upper_qual(((WindowAgg *) plan)->runConditionOrig, + "Run Condition", planstate, ancestors, es); + break; case T_Group: show_group_keys(castNode(GroupState, planstate), ancestors, es); show_upper_qual(plan->qual, "Filter", planstate, ancestors, es); diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c index 08ce05ca5a..4b104c4d98 100644 --- a/src/backend/executor/nodeWindowAgg.c +++ b/src/backend/executor/nodeWindowAgg.c @@ -1248,6 +1248,20 @@ spool_tuples(WindowAggState *winstate, int64 pos) if (winstate->partition_spooled) return; /* whole partition done already */ + /* + * When in pass-through mode we can just exhaust all tuples in the current + * partition. We don't need these tuples for any further window function + * evaluation, however, we do need to keep them around if we're not the + * top-level window as another WindowAgg node above must see these. + */ + if (winstate->status != WINDOWAGG_RUN) + { + Assert(winstate->status == WINDOWAGG_PASSTHROUGH || + winstate->status == WINDOWAGG_PASSTHROUGH_STRICT); + + pos = -1; + } + /* * If the tuplestore has spilled to disk, alternate reading and writing * becomes quite expensive due to frequent buffer flushes. It's cheaper @@ -1256,7 +1270,7 @@ spool_tuples(WindowAggState *winstate, int64 pos) * XXX this is a horrid kluge --- it'd be better to fix the performance * problem inside tuplestore. FIXME */ - if (!tuplestore_in_memory(winstate->buffer)) + else if (!tuplestore_in_memory(winstate->buffer)) pos = -1; outerPlan = outerPlanState(winstate); @@ -1295,9 +1309,16 @@ spool_tuples(WindowAggState *winstate, int64 pos) } } - /* Still in partition, so save it into the tuplestore */ - tuplestore_puttupleslot(winstate->buffer, outerslot); - winstate->spooled_rows++; + /* + * Remember the tuple unless we're the top-level window and we're in + * pass-through mode. + */ + if (winstate->status != WINDOWAGG_PASSTHROUGH_STRICT) + { + /* Still in partition, so save it into the tuplestore */ + tuplestore_puttupleslot(winstate->buffer, outerslot); + winstate->spooled_rows++; + } } MemoryContextSwitchTo(oldcontext); @@ -2023,13 +2044,14 @@ static TupleTableSlot * ExecWindowAgg(PlanState *pstate) { WindowAggState *winstate = castNode(WindowAggState, pstate); + TupleTableSlot *slot; ExprContext *econtext; int i; int numfuncs; CHECK_FOR_INTERRUPTS(); - if (winstate->all_done) + if (winstate->status == WINDOWAGG_DONE) return NULL; /* @@ -2099,143 +2121,224 @@ ExecWindowAgg(PlanState *pstate) winstate->all_first = false; } - if (winstate->buffer == NULL) - { - /* Initialize for first partition and set current row = 0 */ - begin_partition(winstate); - /* If there are no input rows, we'll detect that and exit below */ - } - else + /* We need to loop as the runCondition or qual may filter out tuples */ + for (;;) { - /* Advance current row within partition */ - winstate->currentpos++; - /* This might mean that the frame moves, too */ - winstate->framehead_valid = false; - winstate->frametail_valid = false; - /* we don't need to invalidate grouptail here; see below */ - } + if (winstate->buffer == NULL) + { + /* Initialize for first partition and set current row = 0 */ + begin_partition(winstate); + /* If there are no input rows, we'll detect that and exit below */ + } + else + { + /* Advance current row within partition */ + winstate->currentpos++; + /* This might mean that the frame moves, too */ + winstate->framehead_valid = false; + winstate->frametail_valid = false; + /* we don't need to invalidate grouptail here; see below */ + } - /* - * Spool all tuples up to and including the current row, if we haven't - * already - */ - spool_tuples(winstate, winstate->currentpos); + /* + * Spool all tuples up to and including the current row, if we haven't + * already + */ + spool_tuples(winstate, winstate->currentpos); - /* Move to the next partition if we reached the end of this partition */ - if (winstate->partition_spooled && - winstate->currentpos >= winstate->spooled_rows) - { - release_partition(winstate); + /* Move to the next partition if we reached the end of this partition */ + if (winstate->partition_spooled && + winstate->currentpos >= winstate->spooled_rows) + { + release_partition(winstate); + + if (winstate->more_partitions) + { + begin_partition(winstate); + Assert(winstate->spooled_rows > 0); + + /* Come out of pass-through mode when changing partition */ + winstate->status = WINDOWAGG_RUN; + } + else + { + /* No further partitions? We're done */ + winstate->status = WINDOWAGG_DONE; + return NULL; + } + } + + /* final output execution is in ps_ExprContext */ + econtext = winstate->ss.ps.ps_ExprContext; + + /* Clear the per-output-tuple context for current row */ + ResetExprContext(econtext); - if (winstate->more_partitions) + /* + * Read the current row from the tuplestore, and save in + * ScanTupleSlot. (We can't rely on the outerplan's output slot + * because we may have to read beyond the current row. Also, we have + * to actually copy the row out of the tuplestore, since window + * function evaluation might cause the tuplestore to dump its state to + * disk.) + * + * In GROUPS mode, or when tracking a group-oriented exclusion clause, + * we must also detect entering a new peer group and update associated + * state when that happens. We use temp_slot_2 to temporarily hold + * the previous row for this purpose. + * + * Current row must be in the tuplestore, since we spooled it above. + */ + tuplestore_select_read_pointer(winstate->buffer, winstate->current_ptr); + if ((winstate->frameOptions & (FRAMEOPTION_GROUPS | + FRAMEOPTION_EXCLUDE_GROUP | + FRAMEOPTION_EXCLUDE_TIES)) && + winstate->currentpos > 0) { - begin_partition(winstate); - Assert(winstate->spooled_rows > 0); + ExecCopySlot(winstate->temp_slot_2, winstate->ss.ss_ScanTupleSlot); + if (!tuplestore_gettupleslot(winstate->buffer, true, true, + winstate->ss.ss_ScanTupleSlot)) + elog(ERROR, "unexpected end of tuplestore"); + if (!are_peers(winstate, winstate->temp_slot_2, + winstate->ss.ss_ScanTupleSlot)) + { + winstate->currentgroup++; + winstate->groupheadpos = winstate->currentpos; + winstate->grouptail_valid = false; + } + ExecClearTuple(winstate->temp_slot_2); } else { - winstate->all_done = true; - return NULL; + if (!tuplestore_gettupleslot(winstate->buffer, true, true, + winstate->ss.ss_ScanTupleSlot)) + elog(ERROR, "unexpected end of tuplestore"); } - } - /* final output execution is in ps_ExprContext */ - econtext = winstate->ss.ps.ps_ExprContext; + /* don't evaluate the window functions when we're in pass-through mode */ + if (winstate->status == WINDOWAGG_RUN) + { + /* + * Evaluate true window functions + */ + numfuncs = winstate->numfuncs; + for (i = 0; i < numfuncs; i++) + { + WindowStatePerFunc perfuncstate = &(winstate->perfunc[i]); - /* Clear the per-output-tuple context for current row */ - ResetExprContext(econtext); + if (perfuncstate->plain_agg) + continue; + eval_windowfunction(winstate, perfuncstate, + &(econtext->ecxt_aggvalues[perfuncstate->wfuncstate->wfuncno]), + &(econtext->ecxt_aggnulls[perfuncstate->wfuncstate->wfuncno])); + } - /* - * Read the current row from the tuplestore, and save in ScanTupleSlot. - * (We can't rely on the outerplan's output slot because we may have to - * read beyond the current row. Also, we have to actually copy the row - * out of the tuplestore, since window function evaluation might cause the - * tuplestore to dump its state to disk.) - * - * In GROUPS mode, or when tracking a group-oriented exclusion clause, we - * must also detect entering a new peer group and update associated state - * when that happens. We use temp_slot_2 to temporarily hold the previous - * row for this purpose. - * - * Current row must be in the tuplestore, since we spooled it above. - */ - tuplestore_select_read_pointer(winstate->buffer, winstate->current_ptr); - if ((winstate->frameOptions & (FRAMEOPTION_GROUPS | - FRAMEOPTION_EXCLUDE_GROUP | - FRAMEOPTION_EXCLUDE_TIES)) && - winstate->currentpos > 0) - { - ExecCopySlot(winstate->temp_slot_2, winstate->ss.ss_ScanTupleSlot); - if (!tuplestore_gettupleslot(winstate->buffer, true, true, - winstate->ss.ss_ScanTupleSlot)) - elog(ERROR, "unexpected end of tuplestore"); - if (!are_peers(winstate, winstate->temp_slot_2, - winstate->ss.ss_ScanTupleSlot)) - { - winstate->currentgroup++; - winstate->groupheadpos = winstate->currentpos; - winstate->grouptail_valid = false; + /* + * Evaluate aggregates + */ + if (winstate->numaggs > 0) + eval_windowaggregates(winstate); } - ExecClearTuple(winstate->temp_slot_2); - } - else - { - if (!tuplestore_gettupleslot(winstate->buffer, true, true, - winstate->ss.ss_ScanTupleSlot)) - elog(ERROR, "unexpected end of tuplestore"); - } - /* - * Evaluate true window functions - */ - numfuncs = winstate->numfuncs; - for (i = 0; i < numfuncs; i++) - { - WindowStatePerFunc perfuncstate = &(winstate->perfunc[i]); + /* + * If we have created auxiliary read pointers for the frame or group + * boundaries, force them to be kept up-to-date, because we don't know + * whether the window function(s) will do anything that requires that. + * Failing to advance the pointers would result in being unable to + * trim data from the tuplestore, which is bad. (If we could know in + * advance whether the window functions will use frame boundary info, + * we could skip creating these pointers in the first place ... but + * unfortunately the window function API doesn't require that.) + */ + if (winstate->framehead_ptr >= 0) + update_frameheadpos(winstate); + if (winstate->frametail_ptr >= 0) + update_frametailpos(winstate); + if (winstate->grouptail_ptr >= 0) + update_grouptailpos(winstate); - if (perfuncstate->plain_agg) - continue; - eval_windowfunction(winstate, perfuncstate, - &(econtext->ecxt_aggvalues[perfuncstate->wfuncstate->wfuncno]), - &(econtext->ecxt_aggnulls[perfuncstate->wfuncstate->wfuncno])); - } + /* + * Truncate any no-longer-needed rows from the tuplestore. + */ + tuplestore_trim(winstate->buffer); - /* - * Evaluate aggregates - */ - if (winstate->numaggs > 0) - eval_windowaggregates(winstate); + /* + * Form and return a projection tuple using the windowfunc results and + * the current row. Setting ecxt_outertuple arranges that any Vars + * will be evaluated with respect to that row. + */ + econtext->ecxt_outertuple = winstate->ss.ss_ScanTupleSlot; - /* - * If we have created auxiliary read pointers for the frame or group - * boundaries, force them to be kept up-to-date, because we don't know - * whether the window function(s) will do anything that requires that. - * Failing to advance the pointers would result in being unable to trim - * data from the tuplestore, which is bad. (If we could know in advance - * whether the window functions will use frame boundary info, we could - * skip creating these pointers in the first place ... but unfortunately - * the window function API doesn't require that.) - */ - if (winstate->framehead_ptr >= 0) - update_frameheadpos(winstate); - if (winstate->frametail_ptr >= 0) - update_frametailpos(winstate); - if (winstate->grouptail_ptr >= 0) - update_grouptailpos(winstate); + slot = ExecProject(winstate->ss.ps.ps_ProjInfo); - /* - * Truncate any no-longer-needed rows from the tuplestore. - */ - tuplestore_trim(winstate->buffer); + if (winstate->status == WINDOWAGG_RUN) + { + econtext->ecxt_scantuple = slot; - /* - * Form and return a projection tuple using the windowfunc results and the - * current row. Setting ecxt_outertuple arranges that any Vars will be - * evaluated with respect to that row. - */ - econtext->ecxt_outertuple = winstate->ss.ss_ScanTupleSlot; + /* + * Now evaluate the run condition to see if we need to go into + * pass-through mode, or maybe stop completely. + */ + if (!ExecQual(winstate->runcondition, econtext)) + { + /* + * Determine which mode to move into. If there is no + * PARTITION BY clause and we're the top-level WindowAgg then + * we're done. This tuple and any future tuples cannot + * possibly match the runcondition. However, when there is a + * PARTITION BY clause or we're not the top-level window we + * can't just stop as we need to either process other + * partitions or ensure WindowAgg nodes above us receive all + * of the tuples they need to process their WindowFuncs. + */ + if (winstate->use_pass_through) + { + /* + * STRICT pass-through mode is required for the top window + * when there is a PARTITION BY clause. Otherwise we must + * ensure we store tuples that don't match the + * runcondition so they're available to WindowAggs above. + */ + if (winstate->top_window) + { + winstate->status = WINDOWAGG_PASSTHROUGH_STRICT; + continue; + } + else + winstate->status = WINDOWAGG_PASSTHROUGH; + } + else + { + /* + * Pass-through not required. We can just return NULL. + * Nothing else will match the runcondition. + */ + winstate->status = WINDOWAGG_DONE; + return NULL; + } + } - return ExecProject(winstate->ss.ps.ps_ProjInfo); + /* + * Filter out any tuples we don't need in the top-level WindowAgg. + */ + if (!ExecQual(winstate->ss.ps.qual, econtext)) + { + InstrCountFiltered1(winstate, 1); + continue; + } + + break; + } + + /* + * When not in WINDOWAGG_RUN mode, we must still return this tuple if + * we're anything apart from the top window. + */ + else if (!winstate->top_window) + break; + } + + return slot; } /* ----------------- @@ -2300,12 +2403,32 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags) "WindowAgg Aggregates", ALLOCSET_DEFAULT_SIZES); + /* Only the top-level WindowAgg may have a qual */ + Assert(node->plan.qual == NIL || node->topWindow); + + /* Initialize the qual */ + winstate->ss.ps.qual = ExecInitQual(node->plan.qual, + (PlanState *) winstate); + + /* + * Setup the run condition, if we received one from the query planner. + * When set, this may allow us to move into pass-through mode so that we + * don't have to perform any further evaluation of WindowFuncs in the + * current partition or possibly stop returning tuples altogether when all + * tuples are in the same partition. + */ + winstate->runcondition = ExecInitQual(node->runCondition, + (PlanState *) winstate); + /* - * WindowAgg nodes never have quals, since they can only occur at the - * logical top level of a query (ie, after any WHERE or HAVING filters) + * When we're not the top-level WindowAgg node or we are but have a + * PARTITION BY clause we must move into one of the WINDOWAGG_PASSTHROUGH* + * modes when the runCondition becomes false. */ - Assert(node->plan.qual == NIL); - winstate->ss.ps.qual = NULL; + winstate->use_pass_through = !node->topWindow || node->partNumCols > 0; + + /* remember if we're the top-window or we are below the top-window */ + winstate->top_window = node->topWindow; /* * initialize child nodes @@ -2500,6 +2623,9 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags) winstate->agg_winobj = agg_winobj; } + /* Set the status to running */ + winstate->status = WINDOWAGG_RUN; + /* copy frame options to state node for easy access */ winstate->frameOptions = frameOptions; @@ -2579,7 +2705,7 @@ ExecReScanWindowAgg(WindowAggState *node) PlanState *outerPlan = outerPlanState(node); ExprContext *econtext = node->ss.ps.ps_ExprContext; - node->all_done = false; + node->status = WINDOWAGG_RUN; node->all_first = true; /* release tuplestore et al */ diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 1585cf2d58..836f427ea8 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -1104,11 +1104,14 @@ _copyWindowAgg(const WindowAgg *from) COPY_SCALAR_FIELD(frameOptions); COPY_NODE_FIELD(startOffset); COPY_NODE_FIELD(endOffset); + COPY_NODE_FIELD(runCondition); + COPY_NODE_FIELD(runConditionOrig); COPY_SCALAR_FIELD(startInRangeFunc); COPY_SCALAR_FIELD(endInRangeFunc); COPY_SCALAR_FIELD(inRangeColl); COPY_SCALAR_FIELD(inRangeAsc); COPY_SCALAR_FIELD(inRangeNullsFirst); + COPY_SCALAR_FIELD(topWindow); return newnode; } @@ -3061,6 +3064,7 @@ _copyWindowClause(const WindowClause *from) COPY_SCALAR_FIELD(frameOptions); COPY_NODE_FIELD(startOffset); COPY_NODE_FIELD(endOffset); + COPY_NODE_FIELD(runCondition); COPY_SCALAR_FIELD(startInRangeFunc); COPY_SCALAR_FIELD(endInRangeFunc); COPY_SCALAR_FIELD(inRangeColl); diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index caad20e047..e013c1bbfe 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -3234,6 +3234,7 @@ _equalWindowClause(const WindowClause *a, const WindowClause *b) COMPARE_SCALAR_FIELD(frameOptions); COMPARE_NODE_FIELD(startOffset); COMPARE_NODE_FIELD(endOffset); + COMPARE_NODE_FIELD(runCondition); COMPARE_SCALAR_FIELD(startInRangeFunc); COMPARE_SCALAR_FIELD(endInRangeFunc); COMPARE_SCALAR_FIELD(inRangeColl); diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 13e1643530..d5f5e76c55 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -829,11 +829,14 @@ _outWindowAgg(StringInfo str, const WindowAgg *node) WRITE_INT_FIELD(frameOptions); WRITE_NODE_FIELD(startOffset); WRITE_NODE_FIELD(endOffset); + WRITE_NODE_FIELD(runCondition); + WRITE_NODE_FIELD(runConditionOrig); WRITE_OID_FIELD(startInRangeFunc); WRITE_OID_FIELD(endInRangeFunc); WRITE_OID_FIELD(inRangeColl); WRITE_BOOL_FIELD(inRangeAsc); WRITE_BOOL_FIELD(inRangeNullsFirst); + WRITE_BOOL_FIELD(topWindow); } static void @@ -2283,6 +2286,8 @@ _outWindowAggPath(StringInfo str, const WindowAggPath *node) WRITE_NODE_FIELD(subpath); WRITE_NODE_FIELD(winclause); + WRITE_NODE_FIELD(qual); + WRITE_BOOL_FIELD(topwindow); } static void @@ -3293,6 +3298,7 @@ _outWindowClause(StringInfo str, const WindowClause *node) WRITE_INT_FIELD(frameOptions); WRITE_NODE_FIELD(startOffset); WRITE_NODE_FIELD(endOffset); + WRITE_NODE_FIELD(runCondition); WRITE_OID_FIELD(startInRangeFunc); WRITE_OID_FIELD(endInRangeFunc); WRITE_OID_FIELD(inRangeColl); diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 48f7216c9e..3d150cb25d 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -384,6 +384,7 @@ _readWindowClause(void) READ_INT_FIELD(frameOptions); READ_NODE_FIELD(startOffset); READ_NODE_FIELD(endOffset); + READ_NODE_FIELD(runCondition); READ_OID_FIELD(startInRangeFunc); READ_OID_FIELD(endInRangeFunc); READ_OID_FIELD(inRangeColl); @@ -2576,11 +2577,14 @@ _readWindowAgg(void) READ_INT_FIELD(frameOptions); READ_NODE_FIELD(startOffset); READ_NODE_FIELD(endOffset); + READ_NODE_FIELD(runCondition); + READ_NODE_FIELD(runConditionOrig); READ_OID_FIELD(startInRangeFunc); READ_OID_FIELD(endInRangeFunc); READ_OID_FIELD(inRangeColl); READ_BOOL_FIELD(inRangeAsc); READ_BOOL_FIELD(inRangeNullsFirst); + READ_BOOL_FIELD(topWindow); READ_DONE(); } diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 169b1d53fc..998212dda8 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -27,6 +27,7 @@ #include "miscadmin.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" +#include "nodes/supportnodes.h" #ifdef OPTIMIZER_DEBUG #include "nodes/print.h" #endif @@ -2157,6 +2158,269 @@ has_multiple_baserels(PlannerInfo *root) return false; } +/* + * find_window_run_conditions + * Determine if 'wfunc' is really a WindowFunc and call its prosupport + * function to determine the function's monotonic properties. We then + * see if 'opexpr' can be used to short-circuit execution. + * + * For example row_number() over (order by ...) always produces a value one + * higher than the previous. If someone has a window function in a subquery + * and has a WHERE clause in the outer query to filter rows <= 10, then we may + * as well stop processing the windowagg once the row number reaches 11. Here + * we check if 'opexpr' might help us to stop doing needless extra processing + * in WindowAgg nodes. + * + * '*keep_original' is set to true if the caller should also use 'opexpr' for + * its original purpose. This is set to false if the caller can assume that + * the run condition will handle all of the required filtering. + * + * Returns true if 'opexpr' was found to be useful and was added to the + * WindowClauses runCondition. We also set *keep_original accordingly. + * If the 'opexpr' cannot be used then we set *keep_original to true and + * return false. + */ +static bool +find_window_run_conditions(Query *subquery, RangeTblEntry *rte, Index rti, + AttrNumber attno, WindowFunc *wfunc, OpExpr *opexpr, + bool wfunc_left, bool *keep_original) +{ + Oid prosupport; + Expr *otherexpr; + SupportRequestWFuncMonotonic req; + SupportRequestWFuncMonotonic *res; + WindowClause *wclause; + List *opinfos; + OpExpr *runopexpr; + Oid runoperator; + ListCell *lc; + + *keep_original = true; + + while (IsA(wfunc, RelabelType)) + wfunc = (WindowFunc *) ((RelabelType *) wfunc)->arg; + + /* we can only work with window functions */ + if (!IsA(wfunc, WindowFunc)) + return false; + + prosupport = get_func_support(wfunc->winfnoid); + + /* Check if there's a support function for 'wfunc' */ + if (!OidIsValid(prosupport)) + return false; + + /* get the Expr from the other side of the OpExpr */ + if (wfunc_left) + otherexpr = lsecond(opexpr->args); + else + otherexpr = linitial(opexpr->args); + + /* + * The value being compared must not change during the evaluation of the + * window partition. + */ + if (!is_pseudo_constant_clause((Node *) otherexpr)) + return false; + + /* find the window clause belonging to the window function */ + wclause = (WindowClause *) list_nth(subquery->windowClause, + wfunc->winref - 1); + + req.type = T_SupportRequestWFuncMonotonic; + req.window_func = wfunc; + req.window_clause = wclause; + + /* call the support function */ + res = (SupportRequestWFuncMonotonic *) + DatumGetPointer(OidFunctionCall1(prosupport, + PointerGetDatum(&req))); + + /* + * Nothing to do if the function is neither monotonically increasing nor + * monotonically decreasing. + */ + if (res == NULL || res->monotonic == MONOTONICFUNC_NONE) + return false; + + runopexpr = NULL; + runoperator = InvalidOid; + opinfos = get_op_btree_interpretation(opexpr->opno); + + foreach(lc, opinfos) + { + OpBtreeInterpretation *opinfo = (OpBtreeInterpretation *) lfirst(lc); + int strategy = opinfo->strategy; + + /* handle < / <= */ + if (strategy == BTLessStrategyNumber || + strategy == BTLessEqualStrategyNumber) + { + /* + * < / <= is supported for monotonically increasing functions in + * the form op and op + * for monotonically decreasing functions. + */ + if ((wfunc_left && (res->monotonic & MONOTONICFUNC_INCREASING)) || + (!wfunc_left && (res->monotonic & MONOTONICFUNC_DECREASING))) + { + *keep_original = false; + runopexpr = opexpr; + runoperator = opexpr->opno; + } + break; + } + /* handle > / >= */ + else if (strategy == BTGreaterStrategyNumber || + strategy == BTGreaterEqualStrategyNumber) + { + /* + * > / >= is supported for monotonically decreasing functions in + * the form op and op + * for monotonically increasing functions. + */ + if ((wfunc_left && (res->monotonic & MONOTONICFUNC_DECREASING)) || + (!wfunc_left && (res->monotonic & MONOTONICFUNC_INCREASING))) + { + *keep_original = false; + runopexpr = opexpr; + runoperator = opexpr->opno; + } + break; + } + /* handle = */ + else if (strategy == BTEqualStrategyNumber) + { + int16 newstrategy; + + /* + * When both monotonically increasing and decreasing then the + * return value of the window function will be the same each time. + * We can simply use 'opexpr' as the run condition without + * modifying it. + */ + if ((res->monotonic & MONOTONICFUNC_BOTH) == MONOTONICFUNC_BOTH) + { + *keep_original = false; + runopexpr = opexpr; + break; + } + + /* + * When monotonically increasing we make a qual with <= + * or >= in order to filter out values + * which are above the value in the equality condition. For + * monotonically decreasing functions we want to filter values + * below the value in the equality condition. + */ + if (res->monotonic & MONOTONICFUNC_INCREASING) + newstrategy = wfunc_left ? BTLessEqualStrategyNumber : BTGreaterEqualStrategyNumber; + else + newstrategy = wfunc_left ? BTGreaterEqualStrategyNumber : BTLessEqualStrategyNumber; + + /* We must keep the original equality qual */ + *keep_original = true; + runopexpr = opexpr; + + /* determine the operator to use for the runCondition qual */ + runoperator = get_opfamily_member(opinfo->opfamily_id, + opinfo->oplefttype, + opinfo->oprighttype, + newstrategy); + break; + } + } + + if (runopexpr != NULL) + { + Expr *newexpr; + + /* + * Build the qual required for the run condition keeping the + * WindowFunc on the same side as it was originally. + */ + if (wfunc_left) + newexpr = make_opclause(runoperator, + runopexpr->opresulttype, + runopexpr->opretset, (Expr *) wfunc, + otherexpr, runopexpr->opcollid, + runopexpr->inputcollid); + else + newexpr = make_opclause(runoperator, + runopexpr->opresulttype, + runopexpr->opretset, + otherexpr, (Expr *) wfunc, + runopexpr->opcollid, + runopexpr->inputcollid); + + wclause->runCondition = lappend(wclause->runCondition, newexpr); + + return true; + } + + /* unsupported OpExpr */ + return false; +} + +/* + * check_and_push_window_quals + * Check if 'clause' is a qual that can be pushed into a WindowFunc's + * WindowClause as a 'runCondition' qual. These, when present, allow + * some unnecessary work to be skipped during execution. + * + * Returns true if the caller still must keep the original qual or false if + * the caller can safely ignore the original qual because the WindowAgg node + * will use the runCondition to stop returning tuples. + */ +static bool +check_and_push_window_quals(Query *subquery, RangeTblEntry *rte, Index rti, + Node *clause) +{ + OpExpr *opexpr = (OpExpr *) clause; + bool keep_original = true; + Var *var1; + Var *var2; + + /* We're only able to use OpExprs with 2 operands */ + if (!IsA(opexpr, OpExpr)) + return true; + + if (list_length(opexpr->args) != 2) + return true; + + /* + * Check for plain Vars that reference window functions in the subquery. + * If we find any, we'll ask find_window_run_conditions() if 'opexpr' can + * be used as part of the run condition. + */ + + /* Check the left side of the OpExpr */ + var1 = linitial(opexpr->args); + if (IsA(var1, Var) && var1->varattno > 0) + { + TargetEntry *tle = list_nth(subquery->targetList, var1->varattno - 1); + WindowFunc *wfunc = (WindowFunc *) tle->expr; + + if (find_window_run_conditions(subquery, rte, rti, tle->resno, wfunc, + opexpr, true, &keep_original)) + return keep_original; + } + + /* and check the right side */ + var2 = lsecond(opexpr->args); + if (IsA(var2, Var) && var2->varattno > 0) + { + TargetEntry *tle = list_nth(subquery->targetList, var2->varattno - 1); + WindowFunc *wfunc = (WindowFunc *) tle->expr; + + if (find_window_run_conditions(subquery, rte, rti, tle->resno, wfunc, + opexpr, false, &keep_original)) + return keep_original; + } + + return true; +} + /* * set_subquery_pathlist * Generate SubqueryScan access paths for a subquery RTE @@ -2245,19 +2509,31 @@ set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel, foreach(l, rel->baserestrictinfo) { RestrictInfo *rinfo = (RestrictInfo *) lfirst(l); + Node *clause = (Node *) rinfo->clause; if (!rinfo->pseudoconstant && qual_is_pushdown_safe(subquery, rti, rinfo, &safetyInfo)) { - Node *clause = (Node *) rinfo->clause; - /* Push it down */ subquery_push_qual(subquery, rte, rti, clause); } else { - /* Keep it in the upper query */ - upperrestrictlist = lappend(upperrestrictlist, rinfo); + /* + * Since we can't push the qual down into the subquery, check + * if it happens to reference a window function. If so then + * it might be useful to use for the WindowAgg's runCondition. + */ + if (!subquery->hasWindowFuncs || + check_and_push_window_quals(subquery, rte, rti, clause)) + { + /* + * subquery has no window funcs or the clause is not a + * suitable window run condition qual or it is, but the + * original must also be kept in the upper query. + */ + upperrestrictlist = lappend(upperrestrictlist, rinfo); + } } } rel->baserestrictinfo = upperrestrictlist; diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index 51591bb812..95476ada0b 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -288,6 +288,7 @@ static WindowAgg *make_windowagg(List *tlist, Index winref, int frameOptions, Node *startOffset, Node *endOffset, Oid startInRangeFunc, Oid endInRangeFunc, Oid inRangeColl, bool inRangeAsc, bool inRangeNullsFirst, + List *runCondition, List *qual, bool topWindow, Plan *lefttree); static Group *make_group(List *tlist, List *qual, int numGroupCols, AttrNumber *grpColIdx, Oid *grpOperators, Oid *grpCollations, @@ -2672,6 +2673,9 @@ create_windowagg_plan(PlannerInfo *root, WindowAggPath *best_path) wc->inRangeColl, wc->inRangeAsc, wc->inRangeNullsFirst, + wc->runCondition, + best_path->qual, + best_path->topwindow, subplan); copy_generic_path_info(&plan->plan, (Path *) best_path); @@ -6558,7 +6562,7 @@ make_windowagg(List *tlist, Index winref, int frameOptions, Node *startOffset, Node *endOffset, Oid startInRangeFunc, Oid endInRangeFunc, Oid inRangeColl, bool inRangeAsc, bool inRangeNullsFirst, - Plan *lefttree) + List *runCondition, List *qual, bool topWindow, Plan *lefttree) { WindowAgg *node = makeNode(WindowAgg); Plan *plan = &node->plan; @@ -6575,17 +6579,20 @@ make_windowagg(List *tlist, Index winref, node->frameOptions = frameOptions; node->startOffset = startOffset; node->endOffset = endOffset; + node->runCondition = runCondition; + /* a duplicate of the above for EXPLAIN */ + node->runConditionOrig = runCondition; node->startInRangeFunc = startInRangeFunc; node->endInRangeFunc = endInRangeFunc; node->inRangeColl = inRangeColl; node->inRangeAsc = inRangeAsc; node->inRangeNullsFirst = inRangeNullsFirst; + node->topWindow = topWindow; plan->targetlist = tlist; plan->lefttree = lefttree; plan->righttree = NULL; - /* WindowAgg nodes never have a qual clause */ - plan->qual = NIL; + plan->qual = qual; return node; } diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index b2569c5d0c..b090b087e9 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -4190,6 +4190,7 @@ create_one_window_path(PlannerInfo *root, { PathTarget *window_target; ListCell *l; + List *topqual = NIL; /* * Since each window clause could require a different sort order, we stack @@ -4214,6 +4215,7 @@ create_one_window_path(PlannerInfo *root, List *window_pathkeys; int presorted_keys; bool is_sorted; + bool topwindow; window_pathkeys = make_pathkeys_for_window(root, wc, @@ -4277,10 +4279,21 @@ create_one_window_path(PlannerInfo *root, window_target = output_target; } + /* mark the final item in the list as the top-level window */ + topwindow = foreach_current_index(l) == list_length(activeWindows) - 1; + + /* + * Accumulate all of the runConditions from each intermediate + * WindowClause. The top-level WindowAgg must pass these as a qual so + * that it filters out unwanted tuples correctly. + */ + if (!topwindow) + topqual = list_concat(topqual, wc->runCondition); + path = (Path *) create_windowagg_path(root, window_rel, path, window_target, wflists->windowFuncs[wc->winref], - wc); + wc, topwindow ? topqual : NIL, topwindow); } add_path(window_rel, path); diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 7519723081..6ea3505646 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -71,6 +71,13 @@ typedef struct double num_exec; } fix_upper_expr_context; +typedef struct +{ + PlannerInfo *root; + indexed_tlist *subplan_itlist; + int newvarno; +} fix_windowagg_cond_context; + /* * Selecting the best alternative in an AlternativeSubPlan expression requires * estimating how many times that expression will be evaluated. For an @@ -171,6 +178,9 @@ static List *set_returning_clause_references(PlannerInfo *root, Plan *topplan, Index resultRelation, int rtoffset); +static List *set_windowagg_runcondition_references(PlannerInfo *root, + List *runcondition, + Plan *plan); /***************************************************************************** @@ -885,6 +895,18 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset) { WindowAgg *wplan = (WindowAgg *) plan; + /* + * Adjust the WindowAgg's run conditions by swapping the + * WindowFuncs references out to instead reference the Var in + * the scan slot so that when the executor evaluates the + * runCondition, it receives the WindowFunc's value from the + * slot that the result has just been stored into rather than + * evaluating the WindowFunc all over again. + */ + wplan->runCondition = set_windowagg_runcondition_references(root, + wplan->runCondition, + (Plan *) wplan); + set_upper_references(root, plan, rtoffset); /* @@ -896,6 +918,14 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset) fix_scan_expr(root, wplan->startOffset, rtoffset, 1); wplan->endOffset = fix_scan_expr(root, wplan->endOffset, rtoffset, 1); + wplan->runCondition = fix_scan_list(root, + wplan->runCondition, + rtoffset, + NUM_EXEC_TLIST(plan)); + wplan->runConditionOrig = fix_scan_list(root, + wplan->runConditionOrig, + rtoffset, + NUM_EXEC_TLIST(plan)); } break; case T_Result: @@ -3064,6 +3094,78 @@ set_returning_clause_references(PlannerInfo *root, return rlist; } +/* + * fix_windowagg_condition_expr_mutator + * Mutator function for replacing WindowFuncs with the corresponding Var + * in the targetlist which references that WindowFunc. + */ +static Node * +fix_windowagg_condition_expr_mutator(Node *node, + fix_windowagg_cond_context *context) +{ + if (node == NULL) + return NULL; + + if (IsA(node, WindowFunc)) + { + Var *newvar; + + newvar = search_indexed_tlist_for_non_var((Expr *) node, + context->subplan_itlist, + context->newvarno); + if (newvar) + return (Node *) newvar; + elog(ERROR, "WindowFunc not found in subplan target lists"); + } + + return expression_tree_mutator(node, + fix_windowagg_condition_expr_mutator, + (void *) context); +} + +/* + * fix_windowagg_condition_expr + * Converts references in 'runcondition' so that any WindowFunc + * references are swapped out for a Var which references the matching + * WindowFunc in 'subplan_itlist'. + */ +static List * +fix_windowagg_condition_expr(PlannerInfo *root, + List *runcondition, + indexed_tlist *subplan_itlist) +{ + fix_windowagg_cond_context context; + + context.root = root; + context.subplan_itlist = subplan_itlist; + context.newvarno = 0; + + return (List *) fix_windowagg_condition_expr_mutator((Node *) runcondition, + &context); +} + +/* + * set_windowagg_runcondition_references + * Converts references in 'runcondition' so that any WindowFunc + * references are swapped out for a Var which references the matching + * WindowFunc in 'plan' targetlist. + */ +static List * +set_windowagg_runcondition_references(PlannerInfo *root, + List *runcondition, + Plan *plan) +{ + List *newlist; + indexed_tlist *itlist; + + itlist = build_tlist_index(plan->targetlist); + + newlist = fix_windowagg_condition_expr(root, runcondition, itlist); + + pfree(itlist); + + return newlist; +} /***************************************************************************** * QUERY DEPENDENCY MANAGEMENT diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c index 1670e54644..e2a3c110ce 100644 --- a/src/backend/optimizer/util/pathnode.c +++ b/src/backend/optimizer/util/pathnode.c @@ -3388,6 +3388,10 @@ create_minmaxagg_path(PlannerInfo *root, * 'target' is the PathTarget to be computed * 'windowFuncs' is a list of WindowFunc structs * 'winclause' is a WindowClause that is common to all the WindowFuncs + * 'qual' WindowClause.runconditions from lower-level WindowAggPaths. + * Must always be NIL when topwindow == false + * 'topwindow' pass as true only for the top-level WindowAgg. False for all + * intermediate WindowAggs. * * The input must be sorted according to the WindowClause's PARTITION keys * plus ORDER BY keys. @@ -3398,10 +3402,15 @@ create_windowagg_path(PlannerInfo *root, Path *subpath, PathTarget *target, List *windowFuncs, - WindowClause *winclause) + WindowClause *winclause, + List *qual, + bool topwindow) { WindowAggPath *pathnode = makeNode(WindowAggPath); + /* qual can only be set for the topwindow */ + Assert(qual == NIL || topwindow); + pathnode->path.pathtype = T_WindowAgg; pathnode->path.parent = rel; pathnode->path.pathtarget = target; @@ -3416,6 +3425,8 @@ create_windowagg_path(PlannerInfo *root, pathnode->subpath = subpath; pathnode->winclause = winclause; + pathnode->qual = qual; + pathnode->topwindow = topwindow; /* * For costing purposes, assume that there are no redundant partitioning diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c index 4a87114a4f..98d4323755 100644 --- a/src/backend/utils/adt/int8.c +++ b/src/backend/utils/adt/int8.c @@ -24,6 +24,7 @@ #include "nodes/supportnodes.h" #include "optimizer/optimizer.h" #include "utils/builtins.h" +#include "utils/lsyscache.h" typedef struct @@ -818,6 +819,49 @@ int8dec_any(PG_FUNCTION_ARGS) return int8dec(fcinfo); } +/* + * int8inc_support + * prosupport function for int8inc() and int8inc_any() + */ +Datum +int8inc_support(PG_FUNCTION_ARGS) +{ + Node *rawreq = (Node *) PG_GETARG_POINTER(0); + + if (IsA(rawreq, SupportRequestWFuncMonotonic)) + { + SupportRequestWFuncMonotonic *req = (SupportRequestWFuncMonotonic *) rawreq; + MonotonicFunction monotonic = MONOTONICFUNC_NONE; + int frameOptions = req->window_clause->frameOptions; + + /* No ORDER BY clause then all rows are peers */ + if (req->window_clause->orderClause == NIL) + monotonic = MONOTONICFUNC_BOTH; + else + { + /* + * Otherwise take into account the frame options. When the frame + * bound is the start of the window then the resulting value can + * never decrease, therefore is monotonically increasing + */ + if (frameOptions & FRAMEOPTION_START_UNBOUNDED_PRECEDING) + monotonic |= MONOTONICFUNC_INCREASING; + + /* + * Likewise, if the frame bound is the end of the window then the + * resulting value can never decrease. + */ + if (frameOptions & FRAMEOPTION_END_UNBOUNDED_FOLLOWING) + monotonic |= MONOTONICFUNC_DECREASING; + } + + req->monotonic = monotonic; + PG_RETURN_POINTER(req); + } + + PG_RETURN_POINTER(NULL); +} + Datum int8larger(PG_FUNCTION_ARGS) diff --git a/src/backend/utils/adt/windowfuncs.c b/src/backend/utils/adt/windowfuncs.c index 3e0cc9be1a..596564fa15 100644 --- a/src/backend/utils/adt/windowfuncs.c +++ b/src/backend/utils/adt/windowfuncs.c @@ -13,6 +13,7 @@ */ #include "postgres.h" +#include "nodes/supportnodes.h" #include "utils/builtins.h" #include "windowapi.h" @@ -88,6 +89,26 @@ window_row_number(PG_FUNCTION_ARGS) PG_RETURN_INT64(curpos + 1); } +/* + * window_row_number_support + * prosupport function for window_row_number() + */ +Datum +window_row_number_support(PG_FUNCTION_ARGS) +{ + Node *rawreq = (Node *) PG_GETARG_POINTER(0); + + if (IsA(rawreq, SupportRequestWFuncMonotonic)) + { + SupportRequestWFuncMonotonic *req = (SupportRequestWFuncMonotonic *) rawreq; + + /* row_number() is monotonically increasing */ + req->monotonic = MONOTONICFUNC_INCREASING; + PG_RETURN_POINTER(req); + } + + PG_RETURN_POINTER(NULL); +} /* * rank @@ -110,6 +131,27 @@ window_rank(PG_FUNCTION_ARGS) PG_RETURN_INT64(context->rank); } +/* + * window_rank_support + * prosupport function for window_rank() + */ +Datum +window_rank_support(PG_FUNCTION_ARGS) +{ + Node *rawreq = (Node *) PG_GETARG_POINTER(0); + + if (IsA(rawreq, SupportRequestWFuncMonotonic)) + { + SupportRequestWFuncMonotonic *req = (SupportRequestWFuncMonotonic *) rawreq; + + /* rank() is monotonically increasing */ + req->monotonic = MONOTONICFUNC_INCREASING; + PG_RETURN_POINTER(req); + } + + PG_RETURN_POINTER(NULL); +} + /* * dense_rank * Rank increases by 1 when key columns change. @@ -130,6 +172,27 @@ window_dense_rank(PG_FUNCTION_ARGS) PG_RETURN_INT64(context->rank); } +/* + * window_dense_rank_support + * prosupport function for window_dense_rank() + */ +Datum +window_dense_rank_support(PG_FUNCTION_ARGS) +{ + Node *rawreq = (Node *) PG_GETARG_POINTER(0); + + if (IsA(rawreq, SupportRequestWFuncMonotonic)) + { + SupportRequestWFuncMonotonic *req = (SupportRequestWFuncMonotonic *) rawreq; + + /* dense_rank() is monotonically increasing */ + req->monotonic = MONOTONICFUNC_INCREASING; + PG_RETURN_POINTER(req); + } + + PG_RETURN_POINTER(NULL); +} + /* * percent_rank * return fraction between 0 and 1 inclusive, diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index cec70caae1..5757f3baa1 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202204075 +#define CATALOG_VERSION_NO 202204076 #endif diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 52f56cf5b1..6d378ff785 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -6662,11 +6662,16 @@ # count has two forms: count(any) and count(*) { oid => '2147', descr => 'number of input rows for which the input expression is not null', - proname => 'count', prokind => 'a', proisstrict => 'f', prorettype => 'int8', - proargtypes => 'any', prosrc => 'aggregate_dummy' }, + proname => 'count', prosupport => 'int8inc_support', prokind => 'a', + proisstrict => 'f', prorettype => 'int8', proargtypes => 'any', + prosrc => 'aggregate_dummy' }, { oid => '2803', descr => 'number of input rows', - proname => 'count', prokind => 'a', proisstrict => 'f', prorettype => 'int8', - proargtypes => '', prosrc => 'aggregate_dummy' }, + proname => 'count', prosupport => 'int8inc_support', prokind => 'a', + proisstrict => 'f', prorettype => 'int8', proargtypes => '', + prosrc => 'aggregate_dummy' }, +{ oid => '8802', descr => 'planner support for count run condition', + proname => 'int8inc_support', prorettype => 'internal', + proargtypes => 'internal', prosrc => 'int8inc_support' }, { oid => '2718', descr => 'population variance of bigint input values (square of the population standard deviation)', @@ -10186,14 +10191,26 @@ # SQL-spec window functions { oid => '3100', descr => 'row number within partition', - proname => 'row_number', prokind => 'w', proisstrict => 'f', - prorettype => 'int8', proargtypes => '', prosrc => 'window_row_number' }, + proname => 'row_number', prosupport => 'window_row_number_support', + prokind => 'w', proisstrict => 'f', prorettype => 'int8', + proargtypes => '', prosrc => 'window_row_number' }, +{ oid => '8799', descr => 'planner support for row_number run condition', + proname => 'window_row_number_support', prorettype => 'internal', + proargtypes => 'internal', prosrc => 'window_row_number_support' }, { oid => '3101', descr => 'integer rank with gaps', - proname => 'rank', prokind => 'w', proisstrict => 'f', prorettype => 'int8', + proname => 'rank', prosupport => 'window_rank_support', + prokind => 'w', proisstrict => 'f', prorettype => 'int8', proargtypes => '', prosrc => 'window_rank' }, +{ oid => '8800', descr => 'planner support for rank run condition', + proname => 'window_rank_support', prorettype => 'internal', + proargtypes => 'internal', prosrc => 'window_rank_support' }, { oid => '3102', descr => 'integer rank without gaps', - proname => 'dense_rank', prokind => 'w', proisstrict => 'f', - prorettype => 'int8', proargtypes => '', prosrc => 'window_dense_rank' }, + proname => 'dense_rank', prosupport => 'window_dense_rank_support', + prokind => 'w', proisstrict => 'f', prorettype => 'int8', proargtypes => '', + prosrc => 'window_dense_rank' }, +{ oid => '8801', descr => 'planner support for dense rank run condition', + proname => 'window_dense_rank_support', prorettype => 'internal', + proargtypes => 'internal', prosrc => 'window_dense_rank_support' }, { oid => '3103', descr => 'fractional rank within partition', proname => 'percent_rank', prokind => 'w', proisstrict => 'f', prorettype => 'float8', proargtypes => '', prosrc => 'window_percent_rank' }, diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index cbbcff81d2..94b191f8ae 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -2406,6 +2406,18 @@ typedef struct AggState typedef struct WindowStatePerFuncData *WindowStatePerFunc; typedef struct WindowStatePerAggData *WindowStatePerAgg; +/* + * WindowAggStatus -- Used to track the status of WindowAggState + */ +typedef enum WindowAggStatus +{ + WINDOWAGG_DONE, /* No more processing to do */ + WINDOWAGG_RUN, /* Normal processing of window funcs */ + WINDOWAGG_PASSTHROUGH, /* Don't eval window funcs */ + WINDOWAGG_PASSTHROUGH_STRICT /* Pass-through plus don't store new + * tuples during spool */ +} WindowAggStatus; + typedef struct WindowAggState { ScanState ss; /* its first field is NodeTag */ @@ -2432,6 +2444,7 @@ typedef struct WindowAggState struct WindowObjectData *agg_winobj; /* winobj for aggregate fetches */ int64 aggregatedbase; /* start row for current aggregates */ int64 aggregatedupto; /* rows before this one are aggregated */ + WindowAggStatus status; /* run status of WindowAggState */ int frameOptions; /* frame_clause options, see WindowDef */ ExprState *startOffset; /* expression for starting bound offset */ @@ -2458,8 +2471,17 @@ typedef struct WindowAggState MemoryContext curaggcontext; /* current aggregate's working data */ ExprContext *tmpcontext; /* short-term evaluation context */ + ExprState *runcondition; /* Condition which must remain true otherwise + * execution of the WindowAgg will finish or + * go into pass-through mode. NULL when there + * is no such condition. */ + + bool use_pass_through; /* When false, stop execution when + * runcondition is no longer true. Else + * just stop evaluating window funcs. */ + bool top_window; /* true if this is the top-most WindowAgg or + * the only WindowAgg in this query level */ bool all_first; /* true if the scan is starting */ - bool all_done; /* true if the scan is finished */ bool partition_spooled; /* true if all tuples in current partition * have been spooled into tuplestore */ bool more_partitions; /* true if there's more partitions after diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index 300824258e..340d28f4e1 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -560,7 +560,8 @@ typedef enum NodeTag T_SupportRequestSelectivity, /* in nodes/supportnodes.h */ T_SupportRequestCost, /* in nodes/supportnodes.h */ T_SupportRequestRows, /* in nodes/supportnodes.h */ - T_SupportRequestIndexCondition /* in nodes/supportnodes.h */ + T_SupportRequestIndexCondition, /* in nodes/supportnodes.h */ + T_SupportRequestWFuncMonotonic /* in nodes/supportnodes.h */ } NodeTag; /* diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 1bdeb9eb3d..da02658c81 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1402,6 +1402,7 @@ typedef struct WindowClause int frameOptions; /* frame_clause options, see WindowDef */ Node *startOffset; /* expression for starting bound, if any */ Node *endOffset; /* expression for ending bound, if any */ + List *runCondition; /* qual to help short-circuit execution */ Oid startInRangeFunc; /* in_range function for startOffset */ Oid endInRangeFunc; /* in_range function for endOffset */ Oid inRangeColl; /* collation for in_range tests */ diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h index 6cbcb67bdf..c5ab53e05c 100644 --- a/src/include/nodes/pathnodes.h +++ b/src/include/nodes/pathnodes.h @@ -1843,6 +1843,9 @@ typedef struct WindowAggPath Path path; Path *subpath; /* path representing input source */ WindowClause *winclause; /* WindowClause we'll be using */ + List *qual; /* lower-level WindowAgg runconditions */ + bool topwindow; /* false for all apart from the WindowAgg + * that's closest to the root of the plan */ } WindowAggPath; /* diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h index 10dd35f011..e43e360d9b 100644 --- a/src/include/nodes/plannodes.h +++ b/src/include/nodes/plannodes.h @@ -926,12 +926,16 @@ typedef struct WindowAgg int frameOptions; /* frame_clause options, see WindowDef */ Node *startOffset; /* expression for starting bound, if any */ Node *endOffset; /* expression for ending bound, if any */ + List *runCondition; /* qual to help short-circuit execution */ + List *runConditionOrig; /* runCondition for display in EXPLAIN */ /* these fields are used with RANGE offset PRECEDING/FOLLOWING: */ Oid startInRangeFunc; /* in_range function for startOffset */ Oid endInRangeFunc; /* in_range function for endOffset */ Oid inRangeColl; /* collation for in_range tests */ bool inRangeAsc; /* use ASC sort order for in_range tests? */ bool inRangeNullsFirst; /* nulls sort first for in_range tests? */ + bool topWindow; /* false for all apart from the WindowAgg + * that's closest to the root of the plan */ } WindowAgg; /* ---------------- @@ -1324,4 +1328,21 @@ typedef struct PlanInvalItem uint32 hashValue; /* hash value of object's cache lookup key */ } PlanInvalItem; +/* + * MonotonicFunction + * + * Allows the planner to track monotonic properties of functions. A function + * is monotonically increasing if a subsequent call cannot yield a lower value + * than the previous call. A monotonically decreasing function cannot yield a + * higher value on subsequent calls, and a function which is both must return + * the same value on each call. + */ +typedef enum MonotonicFunction +{ + MONOTONICFUNC_NONE = 0, + MONOTONICFUNC_INCREASING = (1 << 0), + MONOTONICFUNC_DECREASING = (1 << 1), + MONOTONICFUNC_BOTH = MONOTONICFUNC_INCREASING | MONOTONICFUNC_DECREASING +} MonotonicFunction; + #endif /* PLANNODES_H */ diff --git a/src/include/nodes/supportnodes.h b/src/include/nodes/supportnodes.h index 88b61b3ab3..9fcbc39949 100644 --- a/src/include/nodes/supportnodes.h +++ b/src/include/nodes/supportnodes.h @@ -33,12 +33,12 @@ #ifndef SUPPORTNODES_H #define SUPPORTNODES_H -#include "nodes/primnodes.h" +#include "nodes/plannodes.h" struct PlannerInfo; /* avoid including pathnodes.h here */ struct IndexOptInfo; struct SpecialJoinInfo; - +struct WindowClause; /* * The Simplify request allows the support function to perform plan-time @@ -239,4 +239,64 @@ typedef struct SupportRequestIndexCondition * equivalent of the function call */ } SupportRequestIndexCondition; +/* ---------- + * To support more efficient query execution of any monotonically increasing + * and/or monotonically decreasing window functions, we support calling the + * window function's prosupport function passing along this struct whenever + * the planner sees an OpExpr qual directly reference a window function in a + * subquery. When the planner encounters this, we populate this struct and + * pass it along to the window function's prosupport function so that it can + * evaluate if the given WindowFunc is; + * + * a) monotonically increasing, or + * b) monotonically decreasing, or + * c) both monotonically increasing and decreasing, or + * d) none of the above. + * + * A function that is monotonically increasing can never return a value that + * is lower than a value returned in a "previous call". A monotonically + * decreasing function can never return a value higher than a value returned + * in a previous call. A function that is both must return the same value + * each time. + * + * We define "previous call" to mean a previous call to the same WindowFunc + * struct in the same window partition. + * + * row_number() is an example of a monotonically increasing function. The + * return value will be reset back to 1 in each new partition. An example of + * a monotonically increasing and decreasing function is COUNT(*) OVER (). + * Since there is no ORDER BY clause in this example, all rows in the + * partition are peers and all rows within the partition will be within the + * frame bound. Likewise for COUNT(*) OVER(ORDER BY a ROWS BETWEEN UNBOUNDED + * PRECEDING AND UNBOUNDED FOLLOWING). + * + * COUNT(*) OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + * is an example of a monotonically decreasing function. + * + * Implementations must only concern themselves with the given WindowFunc + * being monotonic in a single partition. + * + * Inputs: + * 'window_func' is the pointer to the window function being called. + * + * 'window_clause' pointer to the WindowClause data. Support functions can + * use this to check frame bounds, etc. + * + * Outputs: + * 'monotonic' the resulting MonotonicFunction value for the given input + * window function and window clause. + * ---------- + */ +typedef struct SupportRequestWFuncMonotonic +{ + NodeTag type; + + /* Input fields: */ + WindowFunc *window_func; /* Pointer to the window function data */ + struct WindowClause *window_clause; /* Pointer to the window clause data */ + + /* Output fields: */ + MonotonicFunction monotonic; +} SupportRequestWFuncMonotonic; + #endif /* SUPPORTNODES_H */ diff --git a/src/include/optimizer/pathnode.h b/src/include/optimizer/pathnode.h index 6eca547af8..d2d46b15df 100644 --- a/src/include/optimizer/pathnode.h +++ b/src/include/optimizer/pathnode.h @@ -245,7 +245,9 @@ extern WindowAggPath *create_windowagg_path(PlannerInfo *root, Path *subpath, PathTarget *target, List *windowFuncs, - WindowClause *winclause); + WindowClause *winclause, + List *qual, + bool topwindow); extern SetOpPath *create_setop_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, diff --git a/src/test/regress/expected/window.out b/src/test/regress/expected/window.out index bb9ff7f07b..d78b4c463c 100644 --- a/src/test/regress/expected/window.out +++ b/src/test/regress/expected/window.out @@ -3336,6 +3336,404 @@ WHERE depname = 'sales'; -> Seq Scan on empsalary (9 rows) +-- Test window function run conditions are properly pushed down into the +-- WindowAgg +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + row_number() OVER (ORDER BY empno) rn + FROM empsalary) emp +WHERE rn < 3; + QUERY PLAN +---------------------------------------------- + WindowAgg + Run Condition: (row_number() OVER (?) < 3) + -> Sort + Sort Key: empsalary.empno + -> Seq Scan on empsalary +(5 rows) + +-- The following 3 statements should result the same result. +SELECT * FROM + (SELECT empno, + row_number() OVER (ORDER BY empno) rn + FROM empsalary) emp +WHERE rn < 3; + empno | rn +-------+---- + 1 | 1 + 2 | 2 +(2 rows) + +SELECT * FROM + (SELECT empno, + row_number() OVER (ORDER BY empno) rn + FROM empsalary) emp +WHERE 3 > rn; + empno | rn +-------+---- + 1 | 1 + 2 | 2 +(2 rows) + +SELECT * FROM + (SELECT empno, + row_number() OVER (ORDER BY empno) rn + FROM empsalary) emp +WHERE 2 >= rn; + empno | rn +-------+---- + 1 | 1 + 2 | 2 +(2 rows) + +-- Ensure r <= 3 is pushed down into the run condition of the window agg +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + rank() OVER (ORDER BY salary DESC) r + FROM empsalary) emp +WHERE r <= 3; + QUERY PLAN +----------------------------------------- + WindowAgg + Run Condition: (rank() OVER (?) <= 3) + -> Sort + Sort Key: empsalary.salary DESC + -> Seq Scan on empsalary +(5 rows) + +SELECT * FROM + (SELECT empno, + salary, + rank() OVER (ORDER BY salary DESC) r + FROM empsalary) emp +WHERE r <= 3; + empno | salary | r +-------+--------+--- + 8 | 6000 | 1 + 10 | 5200 | 2 + 11 | 5200 | 2 +(3 rows) + +-- Ensure dr = 1 is converted to dr <= 1 to get all rows leading up to dr = 1 +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + dense_rank() OVER (ORDER BY salary DESC) dr + FROM empsalary) emp +WHERE dr = 1; + QUERY PLAN +----------------------------------------------------- + Subquery Scan on emp + Filter: (emp.dr = 1) + -> WindowAgg + Run Condition: (dense_rank() OVER (?) <= 1) + -> Sort + Sort Key: empsalary.salary DESC + -> Seq Scan on empsalary +(7 rows) + +SELECT * FROM + (SELECT empno, + salary, + dense_rank() OVER (ORDER BY salary DESC) dr + FROM empsalary) emp +WHERE dr = 1; + empno | salary | dr +-------+--------+---- + 8 | 6000 | 1 +(1 row) + +-- Check COUNT() and COUNT(*) +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary DESC) c + FROM empsalary) emp +WHERE c <= 3; + QUERY PLAN +------------------------------------------- + WindowAgg + Run Condition: (count(*) OVER (?) <= 3) + -> Sort + Sort Key: empsalary.salary DESC + -> Seq Scan on empsalary +(5 rows) + +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary DESC) c + FROM empsalary) emp +WHERE c <= 3; + empno | salary | c +-------+--------+--- + 8 | 6000 | 1 + 10 | 5200 | 3 + 11 | 5200 | 3 +(3 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(empno) OVER (ORDER BY salary DESC) c + FROM empsalary) emp +WHERE c <= 3; + QUERY PLAN +--------------------------------------------------------- + WindowAgg + Run Condition: (count(empsalary.empno) OVER (?) <= 3) + -> Sort + Sort Key: empsalary.salary DESC + -> Seq Scan on empsalary +(5 rows) + +SELECT * FROM + (SELECT empno, + salary, + count(empno) OVER (ORDER BY salary DESC) c + FROM empsalary) emp +WHERE c <= 3; + empno | salary | c +-------+--------+--- + 8 | 6000 | 1 + 10 | 5200 | 3 + 11 | 5200 | 3 +(3 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary DESC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) c + FROM empsalary) emp +WHERE c >= 3; + QUERY PLAN +------------------------------------------- + WindowAgg + Run Condition: (count(*) OVER (?) >= 3) + -> Sort + Sort Key: empsalary.salary DESC + -> Seq Scan on empsalary +(5 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER () c + FROM empsalary) emp +WHERE 11 <= c; + QUERY PLAN +-------------------------------------------- + WindowAgg + Run Condition: (11 <= count(*) OVER (?)) + -> Seq Scan on empsalary +(3 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary DESC) c, + dense_rank() OVER (ORDER BY salary DESC) dr + FROM empsalary) emp +WHERE dr = 1; + QUERY PLAN +----------------------------------------------------- + Subquery Scan on emp + Filter: (emp.dr = 1) + -> WindowAgg + Run Condition: (dense_rank() OVER (?) <= 1) + -> Sort + Sort Key: empsalary.salary DESC + -> Seq Scan on empsalary +(7 rows) + +-- Ensure we get a run condition when there's a PARTITION BY clause +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + depname, + row_number() OVER (PARTITION BY depname ORDER BY empno) rn + FROM empsalary) emp +WHERE rn < 3; + QUERY PLAN +------------------------------------------------------ + WindowAgg + Run Condition: (row_number() OVER (?) < 3) + -> Sort + Sort Key: empsalary.depname, empsalary.empno + -> Seq Scan on empsalary +(5 rows) + +-- and ensure we get the correct results from the above plan +SELECT * FROM + (SELECT empno, + depname, + row_number() OVER (PARTITION BY depname ORDER BY empno) rn + FROM empsalary) emp +WHERE rn < 3; + empno | depname | rn +-------+-----------+---- + 7 | develop | 1 + 8 | develop | 2 + 2 | personnel | 1 + 5 | personnel | 2 + 1 | sales | 1 + 3 | sales | 2 +(6 rows) + +-- likewise with count(empno) instead of row_number() +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + depname, + salary, + count(empno) OVER (PARTITION BY depname ORDER BY salary DESC) c + FROM empsalary) emp +WHERE c <= 3; + QUERY PLAN +------------------------------------------------------------ + WindowAgg + Run Condition: (count(empsalary.empno) OVER (?) <= 3) + -> Sort + Sort Key: empsalary.depname, empsalary.salary DESC + -> Seq Scan on empsalary +(5 rows) + +-- and again, check the results are what we expect. +SELECT * FROM + (SELECT empno, + depname, + salary, + count(empno) OVER (PARTITION BY depname ORDER BY salary DESC) c + FROM empsalary) emp +WHERE c <= 3; + empno | depname | salary | c +-------+-----------+--------+--- + 8 | develop | 6000 | 1 + 10 | develop | 5200 | 3 + 11 | develop | 5200 | 3 + 2 | personnel | 3900 | 1 + 5 | personnel | 3500 | 2 + 1 | sales | 5000 | 1 + 4 | sales | 4800 | 3 + 3 | sales | 4800 | 3 +(8 rows) + +-- Some more complex cases with multiple window clauses +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT *, + count(salary) OVER (PARTITION BY depname || '') c1, -- w1 + row_number() OVER (PARTITION BY depname) rn, -- w2 + count(*) OVER (PARTITION BY depname) c2, -- w2 + count(*) OVER (PARTITION BY '' || depname) c3 -- w3 + FROM empsalary +) e WHERE rn <= 1 AND c1 <= 3; + QUERY PLAN +------------------------------------------------------------------------------------------- + Subquery Scan on e + -> WindowAgg + Filter: ((row_number() OVER (?)) <= 1) + Run Condition: (count(empsalary.salary) OVER (?) <= 3) + -> Sort + Sort Key: (((empsalary.depname)::text || ''::text)) + -> WindowAgg + Run Condition: (row_number() OVER (?) <= 1) + -> Sort + Sort Key: empsalary.depname + -> WindowAgg + -> Sort + Sort Key: ((''::text || (empsalary.depname)::text)) + -> Seq Scan on empsalary +(14 rows) + +-- Ensure we correctly filter out all of the run conditions from each window +SELECT * FROM + (SELECT *, + count(salary) OVER (PARTITION BY depname || '') c1, -- w1 + row_number() OVER (PARTITION BY depname) rn, -- w2 + count(*) OVER (PARTITION BY depname) c2, -- w2 + count(*) OVER (PARTITION BY '' || depname) c3 -- w3 + FROM empsalary +) e WHERE rn <= 1 AND c1 <= 3; + depname | empno | salary | enroll_date | c1 | rn | c2 | c3 +-----------+-------+--------+-------------+----+----+----+---- + personnel | 5 | 3500 | 12-10-2007 | 2 | 1 | 2 | 2 + sales | 3 | 4800 | 08-01-2007 | 3 | 1 | 3 | 3 +(2 rows) + +-- Tests to ensure we don't push down the run condition when it's not valid to +-- do so. +-- Ensure we don't push down when the frame options show that the window +-- function is not monotonically increasing +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary DESC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) c + FROM empsalary) emp +WHERE c <= 3; + QUERY PLAN +----------------------------------------------- + Subquery Scan on emp + Filter: (emp.c <= 3) + -> WindowAgg + -> Sort + Sort Key: empsalary.salary DESC + -> Seq Scan on empsalary +(6 rows) + +-- Ensure we don't push down when the window function's monotonic properties +-- don't match that of the clauses. +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary) c + FROM empsalary) emp +WHERE 3 <= c; + QUERY PLAN +------------------------------------------ + Subquery Scan on emp + Filter: (3 <= emp.c) + -> WindowAgg + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(6 rows) + +-- Ensure we don't pushdown when there are multiple window clauses to evaluate +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY empno DESC) c, + dense_rank() OVER (ORDER BY salary DESC) dr + FROM empsalary) emp +WHERE dr = 1; + QUERY PLAN +----------------------------------------------------------------- + Subquery Scan on emp + Filter: (emp.dr = 1) + -> WindowAgg + Filter: ((dense_rank() OVER (?)) <= 1) + -> Sort + Sort Key: empsalary.empno DESC + -> WindowAgg + Run Condition: (dense_rank() OVER (?) <= 1) + -> Sort + Sort Key: empsalary.salary DESC + -> Seq Scan on empsalary +(11 rows) + -- Test Sort node collapsing EXPLAIN (COSTS OFF) SELECT * FROM diff --git a/src/test/regress/sql/window.sql b/src/test/regress/sql/window.sql index 41a8e0d152..967b9413de 100644 --- a/src/test/regress/sql/window.sql +++ b/src/test/regress/sql/window.sql @@ -988,6 +988,212 @@ SELECT * FROM FROM empsalary) emp WHERE depname = 'sales'; +-- Test window function run conditions are properly pushed down into the +-- WindowAgg +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + row_number() OVER (ORDER BY empno) rn + FROM empsalary) emp +WHERE rn < 3; + +-- The following 3 statements should result the same result. +SELECT * FROM + (SELECT empno, + row_number() OVER (ORDER BY empno) rn + FROM empsalary) emp +WHERE rn < 3; + +SELECT * FROM + (SELECT empno, + row_number() OVER (ORDER BY empno) rn + FROM empsalary) emp +WHERE 3 > rn; + +SELECT * FROM + (SELECT empno, + row_number() OVER (ORDER BY empno) rn + FROM empsalary) emp +WHERE 2 >= rn; + +-- Ensure r <= 3 is pushed down into the run condition of the window agg +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + rank() OVER (ORDER BY salary DESC) r + FROM empsalary) emp +WHERE r <= 3; + +SELECT * FROM + (SELECT empno, + salary, + rank() OVER (ORDER BY salary DESC) r + FROM empsalary) emp +WHERE r <= 3; + +-- Ensure dr = 1 is converted to dr <= 1 to get all rows leading up to dr = 1 +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + dense_rank() OVER (ORDER BY salary DESC) dr + FROM empsalary) emp +WHERE dr = 1; + +SELECT * FROM + (SELECT empno, + salary, + dense_rank() OVER (ORDER BY salary DESC) dr + FROM empsalary) emp +WHERE dr = 1; + +-- Check COUNT() and COUNT(*) +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary DESC) c + FROM empsalary) emp +WHERE c <= 3; + +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary DESC) c + FROM empsalary) emp +WHERE c <= 3; + +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(empno) OVER (ORDER BY salary DESC) c + FROM empsalary) emp +WHERE c <= 3; + +SELECT * FROM + (SELECT empno, + salary, + count(empno) OVER (ORDER BY salary DESC) c + FROM empsalary) emp +WHERE c <= 3; + +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary DESC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) c + FROM empsalary) emp +WHERE c >= 3; + +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER () c + FROM empsalary) emp +WHERE 11 <= c; + +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary DESC) c, + dense_rank() OVER (ORDER BY salary DESC) dr + FROM empsalary) emp +WHERE dr = 1; + +-- Ensure we get a run condition when there's a PARTITION BY clause +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + depname, + row_number() OVER (PARTITION BY depname ORDER BY empno) rn + FROM empsalary) emp +WHERE rn < 3; + +-- and ensure we get the correct results from the above plan +SELECT * FROM + (SELECT empno, + depname, + row_number() OVER (PARTITION BY depname ORDER BY empno) rn + FROM empsalary) emp +WHERE rn < 3; + +-- likewise with count(empno) instead of row_number() +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + depname, + salary, + count(empno) OVER (PARTITION BY depname ORDER BY salary DESC) c + FROM empsalary) emp +WHERE c <= 3; + +-- and again, check the results are what we expect. +SELECT * FROM + (SELECT empno, + depname, + salary, + count(empno) OVER (PARTITION BY depname ORDER BY salary DESC) c + FROM empsalary) emp +WHERE c <= 3; + +-- Some more complex cases with multiple window clauses +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT *, + count(salary) OVER (PARTITION BY depname || '') c1, -- w1 + row_number() OVER (PARTITION BY depname) rn, -- w2 + count(*) OVER (PARTITION BY depname) c2, -- w2 + count(*) OVER (PARTITION BY '' || depname) c3 -- w3 + FROM empsalary +) e WHERE rn <= 1 AND c1 <= 3; + +-- Ensure we correctly filter out all of the run conditions from each window +SELECT * FROM + (SELECT *, + count(salary) OVER (PARTITION BY depname || '') c1, -- w1 + row_number() OVER (PARTITION BY depname) rn, -- w2 + count(*) OVER (PARTITION BY depname) c2, -- w2 + count(*) OVER (PARTITION BY '' || depname) c3 -- w3 + FROM empsalary +) e WHERE rn <= 1 AND c1 <= 3; + +-- Tests to ensure we don't push down the run condition when it's not valid to +-- do so. + +-- Ensure we don't push down when the frame options show that the window +-- function is not monotonically increasing +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary DESC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) c + FROM empsalary) emp +WHERE c <= 3; + +-- Ensure we don't push down when the window function's monotonic properties +-- don't match that of the clauses. +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary) c + FROM empsalary) emp +WHERE 3 <= c; + +-- Ensure we don't pushdown when there are multiple window clauses to evaluate +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY empno DESC) c, + dense_rank() OVER (ORDER BY salary DESC) dr + FROM empsalary) emp +WHERE dr = 1; + -- Test Sort node collapsing EXPLAIN (COSTS OFF) SELECT * FROM From 10a8d138235b3b8cfbce8a0145526d9b9a80cc96 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Thu, 7 Apr 2022 15:42:12 -0700 Subject: [PATCH 445/772] Truncate line pointer array during heap pruning. Reclaim space from the line pointer array when heap pruning leaves behind a contiguous group of LP_UNUSED items at the end of the array. This happens during subsequent page defragmentation. Certain kinds of heap line pointer bloat are ameliorated by this new optimization. Follow-up work to commit 3c3b8a4b26, which taught VACUUM to truncate the line pointer array in about the same way during VACUUM's second pass over the heap. We now apply line pointer array truncation during both the first and the second pass over the heap made by VACUUM. We can also perform line pointer array truncation during opportunistic pruning. Matthias van de Meent, with small tweaks by me. Author: Matthias van de Meent Discussion: https://postgr.es/m/CAEze2WjgaQc55Y5f5CQd3L=eS5CZcff2Obxp=O6pto8-f0hC4w@mail.gmail.com Discussion: https://postgr.es/m/CAEze2Wg36%2B4at2eWJNcYNiW2FJmht34x3YeX54ctUSs7kKoNcA%40mail.gmail.com --- src/backend/access/heap/pruneheap.c | 4 +++- src/backend/access/heap/vacuumlazy.c | 11 ++++++--- src/backend/storage/page/bufpage.c | 35 +++++++++++++++++----------- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c index 4656f1b3db..98d31de003 100644 --- a/src/backend/access/heap/pruneheap.c +++ b/src/backend/access/heap/pruneheap.c @@ -244,7 +244,9 @@ heap_page_prune_opt(Relation relation, Buffer buffer) * Prune and repair fragmentation in the specified page. * * Caller must have pin and buffer cleanup lock on the page. Note that we - * don't update the FSM information for page on caller's behalf. + * don't update the FSM information for page on caller's behalf. Caller might + * also need to account for a reduction in the length of the line pointer + * array following array truncation by us. * * vistest is used to distinguish whether tuples are DEAD or RECENTLY_DEAD * (see heap_prune_satisfies_vacuum and diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 092b739dda..e1cac74e62 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -223,7 +223,7 @@ typedef struct LVRelState */ typedef struct LVPagePruneState { - bool hastup; /* Page is truncatable? */ + bool hastup; /* Page prevents rel truncation? */ bool has_lpdead_items; /* includes existing LP_DEAD items */ /* @@ -1393,7 +1393,7 @@ lazy_scan_skip(LVRelState *vacrel, Buffer *vmbuffer, BlockNumber next_block, * * It's necessary to consider new pages as a special case, since the rules for * maintaining the visibility map and FSM with empty pages are a little - * different (though new pages can be truncated based on the usual rules). + * different (though new pages can be truncated away during rel truncation). * * Empty pages are not really a special case -- they're just heap pages that * have no allocated tuples (including even LP_UNUSED items). You might @@ -1561,6 +1561,11 @@ lazy_scan_prune(LVRelState *vacrel, Assert(BufferGetBlockNumber(buf) == blkno); + /* + * maxoff might be reduced following line pointer array truncation in + * heap_page_prune. That's safe for us to ignore, since the reclaimed + * space will continue to look like LP_UNUSED items below. + */ maxoff = PageGetMaxOffsetNumber(page); retry: @@ -1768,7 +1773,7 @@ lazy_scan_prune(LVRelState *vacrel, * Check tuple left behind after pruning to see if needs to be frozen * now. */ - prunestate->hastup = true; /* page won't be truncatable */ + prunestate->hastup = true; /* page makes rel truncation unsafe */ if (heap_prepare_freeze_tuple(tuple.t_data, vacrel->relfrozenxid, vacrel->relminmxid, diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c index 147ba4d923..366d57ea7a 100644 --- a/src/backend/storage/page/bufpage.c +++ b/src/backend/storage/page/bufpage.c @@ -688,22 +688,14 @@ compactify_tuples(itemIdCompact itemidbase, int nitems, Page page, bool presorte * * This routine is usable for heap pages only, but see PageIndexMultiDelete. * - * Never removes unused line pointers. PageTruncateLinePointerArray can - * safely remove some unused line pointers. It ought to be safe for this - * routine to free unused line pointers in roughly the same way, but it's not - * clear that that would be beneficial. - * - * PageTruncateLinePointerArray is only called during VACUUM's second pass - * over the heap. Any unused line pointers that it sees are likely to have - * been set to LP_UNUSED (from LP_DEAD) immediately before the time it is - * called. On the other hand, many tables have the vast majority of all - * required pruning performed opportunistically (not during VACUUM). And so - * there is, in general, a good chance that even large groups of unused line - * pointers that we see here will be recycled quickly. + * This routine removes unused line pointers from the end of the line pointer + * array. This is possible when dead heap-only tuples get removed by pruning, + * especially when there were HOT chains with several tuples each beforehand. * * Caller had better have a full cleanup lock on page's buffer. As a side * effect the page's PD_HAS_FREE_LINES hint bit will be set or unset as - * needed. + * needed. Caller might also need to account for a reduction in the length of + * the line pointer array following array truncation. */ void PageRepairFragmentation(Page page) @@ -718,6 +710,7 @@ PageRepairFragmentation(Page page) int nline, nstorage, nunused; + OffsetNumber finalusedlp = InvalidOffsetNumber; int i; Size totallen; bool presorted = true; /* For now */ @@ -771,10 +764,13 @@ PageRepairFragmentation(Page page) totallen += itemidptr->alignedlen; itemidptr++; } + + finalusedlp = i; /* Could be the final non-LP_UNUSED item */ } else { /* Unused entries should have lp_len = 0, but make sure */ + Assert(!ItemIdHasStorage(lp)); ItemIdSetUnused(lp); nunused++; } @@ -798,6 +794,19 @@ PageRepairFragmentation(Page page) compactify_tuples(itemidbase, nstorage, page, presorted); } + if (finalusedlp != nline) + { + /* The last line pointer is not the last used line pointer */ + int nunusedend = nline - finalusedlp; + + Assert(nunused >= nunusedend && nunusedend > 0); + + /* remove trailing unused line pointers from the count */ + nunused -= nunusedend; + /* truncate the line pointer array */ + ((PageHeader) page)->pd_lower -= (sizeof(ItemIdData) * nunusedend); + } + /* Set hint bit for PageAddItemExtended */ if (nunused > 0) PageSetHasFreeLinePointers(page); From 5264add7847871d61d36a5770dac2139d6a7bc80 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 7 Apr 2022 15:17:07 -0700 Subject: [PATCH 446/772] pgstat: add/extend tests for resetting various kinds of stats. - subscriber stats reset path was untested - slot stat sreset path for all slots was untested - pg_stat_database.sessions etc was untested - pg_stat_reset_shared() was untested, for any kind of shared stats - pg_stat_reset() was untested Author: Melanie Plageman Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- contrib/test_decoding/expected/stats.out | 117 +++++-- contrib/test_decoding/sql/stats.sql | 32 +- src/test/recovery/t/006_logical_decoding.pl | 63 ++++ src/test/regress/expected/stats.out | 164 ++++++++++ src/test/regress/parallel_schedule | 3 + src/test/regress/sql/stats.sql | 78 +++++ src/test/subscription/t/026_stats.pl | 318 +++++++++++++++----- 7 files changed, 664 insertions(+), 111 deletions(-) diff --git a/contrib/test_decoding/expected/stats.out b/contrib/test_decoding/expected/stats.out index d9aeaa4426..78d36429c8 100644 --- a/contrib/test_decoding/expected/stats.out +++ b/contrib/test_decoding/expected/stats.out @@ -1,6 +1,9 @@ -- predictability SET synchronous_commit = on; -SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_stats', 'test_decoding'); +SELECT 'init' FROM + pg_create_logical_replication_slot('regression_slot_stats1', 'test_decoding') s1, + pg_create_logical_replication_slot('regression_slot_stats2', 'test_decoding') s2, + pg_create_logical_replication_slot('regression_slot_stats3', 'test_decoding') s3; ?column? ---------- init @@ -10,7 +13,19 @@ CREATE TABLE stats_test(data text); -- non-spilled xact SET logical_decoding_work_mem to '64MB'; INSERT INTO stats_test values(1); -SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot_stats', NULL, NULL, 'skip-empty-xacts', '1'); +SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot_stats1', NULL, NULL, 'skip-empty-xacts', '1'); + count +------- + 3 +(1 row) + +SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot_stats2', NULL, NULL, 'skip-empty-xacts', '1'); + count +------- + 3 +(1 row) + +SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot_stats3', NULL, NULL, 'skip-empty-xacts', '1'); count ------- 3 @@ -22,31 +37,65 @@ SELECT pg_stat_force_next_flush(); (1 row) -SELECT slot_name, spill_txns = 0 AS spill_txns, spill_count = 0 AS spill_count, total_txns > 0 AS total_txns, total_bytes > 0 AS total_bytes FROM pg_stat_replication_slots; - slot_name | spill_txns | spill_count | total_txns | total_bytes ------------------------+------------+-------------+------------+------------- - regression_slot_stats | t | t | t | t -(1 row) +SELECT slot_name, spill_txns = 0 AS spill_txns, spill_count = 0 AS spill_count, total_txns > 0 AS total_txns, total_bytes > 0 AS total_bytes FROM pg_stat_replication_slots ORDER BY slot_name; + slot_name | spill_txns | spill_count | total_txns | total_bytes +------------------------+------------+-------------+------------+------------- + regression_slot_stats1 | t | t | t | t + regression_slot_stats2 | t | t | t | t + regression_slot_stats3 | t | t | t | t +(3 rows) RESET logical_decoding_work_mem; --- reset the slot stats -SELECT pg_stat_reset_replication_slot('regression_slot_stats'); +-- reset stats for one slot, others should be unaffected +SELECT pg_stat_reset_replication_slot('regression_slot_stats1'); pg_stat_reset_replication_slot -------------------------------- (1 row) -SELECT slot_name, spill_txns, spill_count, total_txns, total_bytes FROM pg_stat_replication_slots; - slot_name | spill_txns | spill_count | total_txns | total_bytes ------------------------+------------+-------------+------------+------------- - regression_slot_stats | 0 | 0 | 0 | 0 +SELECT slot_name, spill_txns = 0 AS spill_txns, spill_count = 0 AS spill_count, total_txns > 0 AS total_txns, total_bytes > 0 AS total_bytes FROM pg_stat_replication_slots ORDER BY slot_name; + slot_name | spill_txns | spill_count | total_txns | total_bytes +------------------------+------------+-------------+------------+------------- + regression_slot_stats1 | t | t | f | f + regression_slot_stats2 | t | t | t | t + regression_slot_stats3 | t | t | t | t +(3 rows) + +-- reset stats for all slots +SELECT pg_stat_reset_replication_slot(NULL); + pg_stat_reset_replication_slot +-------------------------------- + +(1 row) + +SELECT slot_name, spill_txns = 0 AS spill_txns, spill_count = 0 AS spill_count, total_txns > 0 AS total_txns, total_bytes > 0 AS total_bytes FROM pg_stat_replication_slots ORDER BY slot_name; + slot_name | spill_txns | spill_count | total_txns | total_bytes +------------------------+------------+-------------+------------+------------- + regression_slot_stats1 | t | t | f | f + regression_slot_stats2 | t | t | f | f + regression_slot_stats3 | t | t | f | f +(3 rows) + +-- verify accessing/resetting stats for non-existent slot does something reasonable +SELECT * FROM pg_stat_get_replication_slot('do-not-exist'); + slot_name | spill_txns | spill_count | spill_bytes | stream_txns | stream_count | stream_bytes | total_txns | total_bytes | stats_reset +--------------+------------+-------------+-------------+-------------+--------------+--------------+------------+-------------+------------- + do-not-exist | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +(1 row) + +SELECT pg_stat_reset_replication_slot('do-not-exist'); +ERROR: replication slot "do-not-exist" does not exist +SELECT * FROM pg_stat_get_replication_slot('do-not-exist'); + slot_name | spill_txns | spill_count | spill_bytes | stream_txns | stream_count | stream_bytes | total_txns | total_bytes | stats_reset +--------------+------------+-------------+-------------+-------------+--------------+--------------+------------+-------------+------------- + do-not-exist | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | (1 row) -- spilling the xact BEGIN; INSERT INTO stats_test SELECT 'serialize-topbig--1:'||g.i FROM generate_series(1, 5000) g(i); COMMIT; -SELECT count(*) FROM pg_logical_slot_peek_changes('regression_slot_stats', NULL, NULL, 'skip-empty-xacts', '1'); +SELECT count(*) FROM pg_logical_slot_peek_changes('regression_slot_stats1', NULL, NULL, 'skip-empty-xacts', '1'); count ------- 5002 @@ -62,31 +111,39 @@ SELECT pg_stat_force_next_flush(); (1 row) SELECT slot_name, spill_txns > 0 AS spill_txns, spill_count > 0 AS spill_count FROM pg_stat_replication_slots; - slot_name | spill_txns | spill_count ------------------------+------------+------------- - regression_slot_stats | t | t -(1 row) + slot_name | spill_txns | spill_count +------------------------+------------+------------- + regression_slot_stats1 | t | t + regression_slot_stats2 | f | f + regression_slot_stats3 | f | f +(3 rows) -- Ensure stats can be repeatedly accessed using the same stats snapshot. See -- https://postgr.es/m/20210317230447.c7uc4g3vbs4wi32i%40alap3.anarazel.de BEGIN; SELECT slot_name FROM pg_stat_replication_slots; - slot_name ------------------------ - regression_slot_stats -(1 row) + slot_name +------------------------ + regression_slot_stats1 + regression_slot_stats2 + regression_slot_stats3 +(3 rows) SELECT slot_name FROM pg_stat_replication_slots; - slot_name ------------------------ - regression_slot_stats -(1 row) + slot_name +------------------------ + regression_slot_stats1 + regression_slot_stats2 + regression_slot_stats3 +(3 rows) COMMIT; DROP TABLE stats_test; -SELECT pg_drop_replication_slot('regression_slot_stats'); - pg_drop_replication_slot --------------------------- - +SELECT pg_drop_replication_slot('regression_slot_stats1'), + pg_drop_replication_slot('regression_slot_stats2'), + pg_drop_replication_slot('regression_slot_stats3'); + pg_drop_replication_slot | pg_drop_replication_slot | pg_drop_replication_slot +--------------------------+--------------------------+-------------------------- + | | (1 row) diff --git a/contrib/test_decoding/sql/stats.sql b/contrib/test_decoding/sql/stats.sql index 6592c36a4d..630371f147 100644 --- a/contrib/test_decoding/sql/stats.sql +++ b/contrib/test_decoding/sql/stats.sql @@ -1,27 +1,41 @@ -- predictability SET synchronous_commit = on; -SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_stats', 'test_decoding'); +SELECT 'init' FROM + pg_create_logical_replication_slot('regression_slot_stats1', 'test_decoding') s1, + pg_create_logical_replication_slot('regression_slot_stats2', 'test_decoding') s2, + pg_create_logical_replication_slot('regression_slot_stats3', 'test_decoding') s3; CREATE TABLE stats_test(data text); -- non-spilled xact SET logical_decoding_work_mem to '64MB'; INSERT INTO stats_test values(1); -SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot_stats', NULL, NULL, 'skip-empty-xacts', '1'); +SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot_stats1', NULL, NULL, 'skip-empty-xacts', '1'); +SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot_stats2', NULL, NULL, 'skip-empty-xacts', '1'); +SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot_stats3', NULL, NULL, 'skip-empty-xacts', '1'); SELECT pg_stat_force_next_flush(); -SELECT slot_name, spill_txns = 0 AS spill_txns, spill_count = 0 AS spill_count, total_txns > 0 AS total_txns, total_bytes > 0 AS total_bytes FROM pg_stat_replication_slots; +SELECT slot_name, spill_txns = 0 AS spill_txns, spill_count = 0 AS spill_count, total_txns > 0 AS total_txns, total_bytes > 0 AS total_bytes FROM pg_stat_replication_slots ORDER BY slot_name; RESET logical_decoding_work_mem; --- reset the slot stats -SELECT pg_stat_reset_replication_slot('regression_slot_stats'); -SELECT slot_name, spill_txns, spill_count, total_txns, total_bytes FROM pg_stat_replication_slots; +-- reset stats for one slot, others should be unaffected +SELECT pg_stat_reset_replication_slot('regression_slot_stats1'); +SELECT slot_name, spill_txns = 0 AS spill_txns, spill_count = 0 AS spill_count, total_txns > 0 AS total_txns, total_bytes > 0 AS total_bytes FROM pg_stat_replication_slots ORDER BY slot_name; + +-- reset stats for all slots +SELECT pg_stat_reset_replication_slot(NULL); +SELECT slot_name, spill_txns = 0 AS spill_txns, spill_count = 0 AS spill_count, total_txns > 0 AS total_txns, total_bytes > 0 AS total_bytes FROM pg_stat_replication_slots ORDER BY slot_name; + +-- verify accessing/resetting stats for non-existent slot does something reasonable +SELECT * FROM pg_stat_get_replication_slot('do-not-exist'); +SELECT pg_stat_reset_replication_slot('do-not-exist'); +SELECT * FROM pg_stat_get_replication_slot('do-not-exist'); -- spilling the xact BEGIN; INSERT INTO stats_test SELECT 'serialize-topbig--1:'||g.i FROM generate_series(1, 5000) g(i); COMMIT; -SELECT count(*) FROM pg_logical_slot_peek_changes('regression_slot_stats', NULL, NULL, 'skip-empty-xacts', '1'); +SELECT count(*) FROM pg_logical_slot_peek_changes('regression_slot_stats1', NULL, NULL, 'skip-empty-xacts', '1'); -- Check stats. We can't test the exact stats count as that can vary if any -- background transaction (say by autovacuum) happens in parallel to the main @@ -37,4 +51,6 @@ SELECT slot_name FROM pg_stat_replication_slots; COMMIT; DROP TABLE stats_test; -SELECT pg_drop_replication_slot('regression_slot_stats'); +SELECT pg_drop_replication_slot('regression_slot_stats1'), + pg_drop_replication_slot('regression_slot_stats2'), + pg_drop_replication_slot('regression_slot_stats3'); diff --git a/src/test/recovery/t/006_logical_decoding.pl b/src/test/recovery/t/006_logical_decoding.pl index 9cec2792fc..3ccced2ea2 100644 --- a/src/test/recovery/t/006_logical_decoding.pl +++ b/src/test/recovery/t/006_logical_decoding.pl @@ -200,6 +200,69 @@ ok(($logical_restart_lsn_pre cmp $logical_restart_lsn_post) == 0, "logical slot advance persists across restarts"); +my $stats_test_slot1 = 'test_slot'; +my $stats_test_slot2 = 'logical_slot'; + +# Test that reset works for pg_stat_replication_slots + +# Stats exist for stats test slot 1 +is($node_primary->safe_psql( + 'postgres', + qq(SELECT total_bytes > 0, stats_reset IS NULL FROM pg_stat_replication_slots WHERE slot_name = '$stats_test_slot1') +), qq(t|t), qq(Total bytes is > 0 and stats_reset is NULL for slot '$stats_test_slot1'.)); + +# Do reset of stats for stats test slot 1 +$node_primary->safe_psql( + 'postgres', + qq(SELECT pg_stat_reset_replication_slot('$stats_test_slot1')) +); + +# Get reset value after reset +my $reset1 = $node_primary->safe_psql( + 'postgres', + qq(SELECT stats_reset FROM pg_stat_replication_slots WHERE slot_name = '$stats_test_slot1') +); + +# Do reset again +$node_primary->safe_psql( + 'postgres', + qq(SELECT pg_stat_reset_replication_slot('$stats_test_slot1')) +); + +is($node_primary->safe_psql( + 'postgres', + qq(SELECT stats_reset > '$reset1'::timestamptz, total_bytes = 0 FROM pg_stat_replication_slots WHERE slot_name = '$stats_test_slot1') +), qq(t|t), qq(Check that reset timestamp is later after the second reset of stats for slot '$stats_test_slot1' and confirm total_bytes was set to 0.)); + +# Check that test slot 2 has NULL in reset timestamp +is($node_primary->safe_psql( + 'postgres', + qq(SELECT stats_reset IS NULL FROM pg_stat_replication_slots WHERE slot_name = '$stats_test_slot2') +), qq(t), qq(Stats_reset is NULL for slot '$stats_test_slot2' before reset.)); + +# Get reset value again for test slot 1 +$reset1 = $node_primary->safe_psql( + 'postgres', + qq(SELECT stats_reset FROM pg_stat_replication_slots WHERE slot_name = '$stats_test_slot1') +); + +# Reset stats for all replication slots +$node_primary->safe_psql( + 'postgres', + qq(SELECT pg_stat_reset_replication_slot(NULL)) +); + +# Check that test slot 2 reset timestamp is no longer NULL after reset +is($node_primary->safe_psql( + 'postgres', + qq(SELECT stats_reset IS NOT NULL FROM pg_stat_replication_slots WHERE slot_name = '$stats_test_slot2') +), qq(t), qq(Stats_reset is not NULL for slot '$stats_test_slot2' after reset all.)); + +is($node_primary->safe_psql( + 'postgres', + qq(SELECT stats_reset > '$reset1'::timestamptz FROM pg_stat_replication_slots WHERE slot_name = '$stats_test_slot1') +), qq(t), qq(Check that reset timestamp is later after resetting stats for slot '$stats_test_slot1' again.)); + # done with the node $node_primary->stop; diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index 9713175930..6b233ff4c0 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -554,6 +554,170 @@ SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4; DROP TABLE prevstats; +----- +-- Test that various stats views are being properly populated +----- +-- Test that sessions is incremented when a new session is started in pg_stat_database +SELECT sessions AS db_stat_sessions FROM pg_stat_database WHERE datname = (SELECT current_database()) \gset +\c +SELECT sessions > :db_stat_sessions FROM pg_stat_database WHERE datname = (SELECT current_database()); + ?column? +---------- + t +(1 row) + +-- Test pg_stat_bgwriter checkpointer-related stats, together with pg_stat_wal +SELECT checkpoints_req AS rqst_ckpts_before FROM pg_stat_bgwriter \gset +-- Test pg_stat_wal +SELECT wal_bytes AS wal_bytes_before FROM pg_stat_wal \gset +CREATE TABLE test_stats_temp AS SELECT 17; +DROP TABLE test_stats_temp; +-- Checkpoint twice: The checkpointer reports stats after reporting completion +-- of the checkpoint. But after a second checkpoint we'll see at least the +-- results of the first. +CHECKPOINT; +CHECKPOINT; +SELECT checkpoints_req > :rqst_ckpts_before FROM pg_stat_bgwriter; + ?column? +---------- + t +(1 row) + +SELECT wal_bytes > :wal_bytes_before FROM pg_stat_wal; + ?column? +---------- + t +(1 row) + +----- +-- Test that resetting stats works for reset timestamp +----- +-- Test that reset_slru with a specified SLRU works. +SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'CommitTs' \gset +SELECT stats_reset AS slru_notify_reset_ts FROM pg_stat_slru WHERE name = 'Notify' \gset +SELECT pg_stat_reset_slru('CommitTs'); + pg_stat_reset_slru +-------------------- + +(1 row) + +SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'CommitTs'; + ?column? +---------- + t +(1 row) + +SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'CommitTs' \gset +-- Test that multiple SLRUs are reset when no specific SLRU provided to reset function +SELECT pg_stat_reset_slru(NULL); + pg_stat_reset_slru +-------------------- + +(1 row) + +SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'CommitTs'; + ?column? +---------- + t +(1 row) + +SELECT stats_reset > :'slru_notify_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'Notify'; + ?column? +---------- + t +(1 row) + +-- Test that reset_shared with archiver specified as the stats type works +SELECT stats_reset AS archiver_reset_ts FROM pg_stat_archiver \gset +SELECT pg_stat_reset_shared('archiver'); + pg_stat_reset_shared +---------------------- + +(1 row) + +SELECT stats_reset > :'archiver_reset_ts'::timestamptz FROM pg_stat_archiver; + ?column? +---------- + t +(1 row) + +SELECT stats_reset AS archiver_reset_ts FROM pg_stat_archiver \gset +-- Test that reset_shared with bgwriter specified as the stats type works +SELECT stats_reset AS bgwriter_reset_ts FROM pg_stat_bgwriter \gset +SELECT pg_stat_reset_shared('bgwriter'); + pg_stat_reset_shared +---------------------- + +(1 row) + +SELECT stats_reset > :'bgwriter_reset_ts'::timestamptz FROM pg_stat_bgwriter; + ?column? +---------- + t +(1 row) + +SELECT stats_reset AS bgwriter_reset_ts FROM pg_stat_bgwriter \gset +-- Test that reset_shared with wal specified as the stats type works +SELECT stats_reset AS wal_reset_ts FROM pg_stat_wal \gset +SELECT pg_stat_reset_shared('wal'); + pg_stat_reset_shared +---------------------- + +(1 row) + +SELECT stats_reset > :'wal_reset_ts'::timestamptz FROM pg_stat_wal; + ?column? +---------- + t +(1 row) + +SELECT stats_reset AS wal_reset_ts FROM pg_stat_wal \gset +-- Test that reset_shared with no specified stats type doesn't reset anything +SELECT pg_stat_reset_shared(NULL); + pg_stat_reset_shared +---------------------- + +(1 row) + +SELECT stats_reset = :'archiver_reset_ts'::timestamptz FROM pg_stat_archiver; + ?column? +---------- + t +(1 row) + +SELECT stats_reset = :'bgwriter_reset_ts'::timestamptz FROM pg_stat_bgwriter; + ?column? +---------- + t +(1 row) + +SELECT stats_reset = :'wal_reset_ts'::timestamptz FROM pg_stat_wal; + ?column? +---------- + t +(1 row) + +-- Test that reset works for pg_stat_database +-- Since pg_stat_database stats_reset starts out as NULL, reset it once first so we have something to compare it to +SELECT pg_stat_reset(); + pg_stat_reset +--------------- + +(1 row) + +SELECT stats_reset AS db_reset_ts FROM pg_stat_database WHERE datname = (SELECT current_database()) \gset +SELECT pg_stat_reset(); + pg_stat_reset +--------------- + +(1 row) + +SELECT stats_reset > :'db_reset_ts'::timestamptz FROM pg_stat_database WHERE datname = (SELECT current_database()); + ?column? +---------- + t +(1 row) + ---- -- pg_stat_get_snapshot_timestamp behavior ---- diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 1087b2c14f..103e11483d 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -123,6 +123,9 @@ test: plancache limit plpgsql copy2 temp domain rangefuncs prepare conversion tr # ---------- # Another group of parallel tests +# +# The stats test resets stats, so nothing else needing stats access can be in +# this group. # ---------- test: partition_join partition_prune reloptions hash_part indexing partition_aggregate partition_info tuplesort explain compression memoize stats diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index 4d26671da7..096f00ce8b 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -286,6 +286,84 @@ SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4; DROP TABLE prevstats; + +----- +-- Test that various stats views are being properly populated +----- + +-- Test that sessions is incremented when a new session is started in pg_stat_database +SELECT sessions AS db_stat_sessions FROM pg_stat_database WHERE datname = (SELECT current_database()) \gset +\c +SELECT sessions > :db_stat_sessions FROM pg_stat_database WHERE datname = (SELECT current_database()); + +-- Test pg_stat_bgwriter checkpointer-related stats, together with pg_stat_wal +SELECT checkpoints_req AS rqst_ckpts_before FROM pg_stat_bgwriter \gset + +-- Test pg_stat_wal +SELECT wal_bytes AS wal_bytes_before FROM pg_stat_wal \gset + +CREATE TABLE test_stats_temp AS SELECT 17; +DROP TABLE test_stats_temp; + +-- Checkpoint twice: The checkpointer reports stats after reporting completion +-- of the checkpoint. But after a second checkpoint we'll see at least the +-- results of the first. +CHECKPOINT; +CHECKPOINT; + +SELECT checkpoints_req > :rqst_ckpts_before FROM pg_stat_bgwriter; +SELECT wal_bytes > :wal_bytes_before FROM pg_stat_wal; + + +----- +-- Test that resetting stats works for reset timestamp +----- + +-- Test that reset_slru with a specified SLRU works. +SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'CommitTs' \gset +SELECT stats_reset AS slru_notify_reset_ts FROM pg_stat_slru WHERE name = 'Notify' \gset +SELECT pg_stat_reset_slru('CommitTs'); +SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'CommitTs'; +SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'CommitTs' \gset + +-- Test that multiple SLRUs are reset when no specific SLRU provided to reset function +SELECT pg_stat_reset_slru(NULL); +SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'CommitTs'; +SELECT stats_reset > :'slru_notify_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'Notify'; + +-- Test that reset_shared with archiver specified as the stats type works +SELECT stats_reset AS archiver_reset_ts FROM pg_stat_archiver \gset +SELECT pg_stat_reset_shared('archiver'); +SELECT stats_reset > :'archiver_reset_ts'::timestamptz FROM pg_stat_archiver; +SELECT stats_reset AS archiver_reset_ts FROM pg_stat_archiver \gset + +-- Test that reset_shared with bgwriter specified as the stats type works +SELECT stats_reset AS bgwriter_reset_ts FROM pg_stat_bgwriter \gset +SELECT pg_stat_reset_shared('bgwriter'); +SELECT stats_reset > :'bgwriter_reset_ts'::timestamptz FROM pg_stat_bgwriter; +SELECT stats_reset AS bgwriter_reset_ts FROM pg_stat_bgwriter \gset + +-- Test that reset_shared with wal specified as the stats type works +SELECT stats_reset AS wal_reset_ts FROM pg_stat_wal \gset +SELECT pg_stat_reset_shared('wal'); +SELECT stats_reset > :'wal_reset_ts'::timestamptz FROM pg_stat_wal; +SELECT stats_reset AS wal_reset_ts FROM pg_stat_wal \gset + +-- Test that reset_shared with no specified stats type doesn't reset anything +SELECT pg_stat_reset_shared(NULL); +SELECT stats_reset = :'archiver_reset_ts'::timestamptz FROM pg_stat_archiver; +SELECT stats_reset = :'bgwriter_reset_ts'::timestamptz FROM pg_stat_bgwriter; +SELECT stats_reset = :'wal_reset_ts'::timestamptz FROM pg_stat_wal; + +-- Test that reset works for pg_stat_database + +-- Since pg_stat_database stats_reset starts out as NULL, reset it once first so we have something to compare it to +SELECT pg_stat_reset(); +SELECT stats_reset AS db_reset_ts FROM pg_stat_database WHERE datname = (SELECT current_database()) \gset +SELECT pg_stat_reset(); +SELECT stats_reset > :'db_reset_ts'::timestamptz FROM pg_stat_database WHERE datname = (SELECT current_database()); + + ---- -- pg_stat_get_snapshot_timestamp behavior ---- diff --git a/src/test/subscription/t/026_stats.pl b/src/test/subscription/t/026_stats.pl index a42ea3170e..59a09ce6dc 100644 --- a/src/test/subscription/t/026_stats.pl +++ b/src/test/subscription/t/026_stats.pl @@ -18,83 +18,255 @@ $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; -# Initial table setup on both publisher and subscriber. On subscriber we -# create the same tables but with primary keys. Also, insert some data that -# will conflict with the data replicated from publisher later. -$node_publisher->safe_psql( - 'postgres', - qq[ -BEGIN; -CREATE TABLE test_tab1 (a int); -INSERT INTO test_tab1 VALUES (1); -COMMIT; -]); -$node_subscriber->safe_psql( - 'postgres', - qq[ -BEGIN; -CREATE TABLE test_tab1 (a int primary key); -INSERT INTO test_tab1 VALUES (1); -COMMIT; -]); - -# Setup publication. -my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; -$node_publisher->safe_psql('postgres', - "CREATE PUBLICATION tap_pub FOR TABLE test_tab1;"); + +sub create_sub_pub_w_errors +{ + my ($node_publisher, $node_subscriber, $db, $table_name) = @_; + # Initial table setup on both publisher and subscriber. On subscriber we + # create the same tables but with primary keys. Also, insert some data that + # will conflict with the data replicated from publisher later. + $node_publisher->safe_psql( + $db, + qq[ + BEGIN; + CREATE TABLE $table_name(a int); + INSERT INTO $table_name VALUES (1); + COMMIT; + ]); + $node_subscriber->safe_psql( + $db, + qq[ + BEGIN; + CREATE TABLE $table_name(a int primary key); + INSERT INTO $table_name VALUES (1); + COMMIT; + ]); + + # Set up publication. + my $pub_name = $table_name . '_pub'; + my $publisher_connstr = $node_publisher->connstr . qq( dbname=$db); + + $node_publisher->safe_psql($db, + qq(CREATE PUBLICATION $pub_name FOR TABLE $table_name)); + + # Create subscription. The tablesync for table on subscription will enter into + # infinite error loop due to violating the unique constraint. + my $sub_name = $table_name . '_sub'; + $node_subscriber->safe_psql($db, + qq(CREATE SUBSCRIPTION $sub_name CONNECTION '$publisher_connstr' PUBLICATION $pub_name) + ); + + $node_publisher->wait_for_catchup($sub_name); + + # Wait for the tablesync error to be reported. + $node_subscriber->poll_query_until( + $db, + qq[ + SELECT sync_error_count > 0 + FROM pg_stat_subscription_stats + WHERE subname = '$sub_name' + ]) + or die + qq(Timed out while waiting for tablesync errors for subscription '$sub_name'); + + # Truncate test_tab1 so that tablesync worker can continue. + $node_subscriber->safe_psql($db, qq(TRUNCATE $table_name)); + + # Wait for initial tablesync to finish. + $node_subscriber->poll_query_until( + $db, + qq[ + SELECT count(1) = 1 FROM pg_subscription_rel + WHERE srrelid = '$table_name'::regclass AND srsubstate in ('r', 's') + ]) + or die + qq(Timed out while waiting for subscriber to synchronize data for table '$table_name'.); + + # Check test table on the subscriber has one row. + my $result = + $node_subscriber->safe_psql($db, qq(SELECT a FROM $table_name)); + is($result, qq(1), qq(Check that table '$table_name' now has 1 row.)); + + # Insert data to test table on the publisher, raising an error on the + # subscriber due to violation of the unique constraint on test table. + $node_publisher->safe_psql($db, qq(INSERT INTO $table_name VALUES (1))); + + # Wait for the apply error to be reported. + $node_subscriber->poll_query_until( + $db, + qq[ + SELECT apply_error_count > 0 + FROM pg_stat_subscription_stats + WHERE subname = '$sub_name' + ]) + or die + qq(Timed out while waiting for apply error for subscription '$sub_name'); + + # Truncate test table so that apply worker can continue. + $node_subscriber->safe_psql($db, qq(TRUNCATE $table_name)); + + return ($pub_name, $sub_name); +} + +my $db = 'postgres'; # There shouldn't be any subscription errors before starting logical replication. -my $result = $node_subscriber->safe_psql('postgres', - "SELECT count(1) FROM pg_stat_subscription_stats"); -is($result, qq(0), 'check no subscription error'); - -# Create subscription. The tablesync for test_tab1 on tap_sub will enter into -# infinite error loop due to violating the unique constraint. -$node_subscriber->safe_psql('postgres', - "CREATE SUBSCRIPTION tap_sub CONNECTION '$publisher_connstr' PUBLICATION tap_pub;" +my $result = $node_subscriber->safe_psql($db, + qq(SELECT count(1) FROM pg_stat_subscription_stats)); +is($result, qq(0), + 'Check that there are no subscription errors before starting logical replication.' +); + +# Create the publication and subscription with sync and apply errors +my $table1_name = 'test_tab1'; +my ($pub1_name, $sub1_name) = + create_sub_pub_w_errors($node_publisher, $node_subscriber, $db, + $table1_name); + +# Apply and Sync errors are > 0 and reset timestamp is NULL +is( $node_subscriber->safe_psql( + $db, + qq(SELECT apply_error_count > 0, + sync_error_count > 0, + stats_reset IS NULL + FROM pg_stat_subscription_stats + WHERE subname = '$sub1_name') + ), + qq(t|t|t), + qq(Check that apply errors and sync errors are both > 0 and stats_reset is NULL for subscription '$sub1_name'.) +); + +# Reset a single subscription +$node_subscriber->safe_psql($db, + qq(SELECT pg_stat_reset_subscription_stats((SELECT subid FROM pg_stat_subscription_stats WHERE subname = '$sub1_name'))) +); + +# Apply and Sync errors are 0 and stats reset is not NULL +is( $node_subscriber->safe_psql( + $db, + qq(SELECT apply_error_count = 0, + sync_error_count = 0, + stats_reset IS NOT NULL + FROM pg_stat_subscription_stats + WHERE subname = '$sub1_name') + ), + qq(t|t|t), + qq(Confirm that apply errors and sync errors are both 0 and stats_reset is not NULL after reset for subscription '$sub1_name'.) +); + +# Get reset timestamp +my $reset_time1 = $node_subscriber->safe_psql($db, + qq(SELECT stats_reset FROM pg_stat_subscription_stats WHERE subname = '$sub1_name') ); -$node_publisher->wait_for_catchup('tap_sub'); - -# Wait for the tablesync error to be reported. -$node_subscriber->poll_query_until( - 'postgres', - qq[ -SELECT sync_error_count > 0 -FROM pg_stat_subscription_stats -WHERE subname = 'tap_sub' -]) or die "Timed out while waiting for tablesync error"; - -# Truncate test_tab1 so that tablesync worker can continue. -$node_subscriber->safe_psql('postgres', "TRUNCATE test_tab1;"); - -# Wait for initial tablesync for test_tab1 to finish. -$node_subscriber->poll_query_until( - 'postgres', - qq[ -SELECT count(1) = 1 FROM pg_subscription_rel -WHERE srrelid = 'test_tab1'::regclass AND srsubstate in ('r', 's') -]) or die "Timed out while waiting for subscriber to synchronize data"; - -# Check test_tab1 on the subscriber has one row. -$result = $node_subscriber->safe_psql('postgres', "SELECT a FROM test_tab1"); -is($result, qq(1), 'check the table has now row'); - -# Insert data to test_tab1 on the publisher, raising an error on the subscriber -# due to violation of the unique constraint on test_tab1. -$node_publisher->safe_psql('postgres', "INSERT INTO test_tab1 VALUES (1)"); - -# Wait for the apply error to be reported. -$node_subscriber->poll_query_until( - 'postgres', - qq[ -SELECT apply_error_count > 0 -FROM pg_stat_subscription_stats -WHERE subname = 'tap_sub' -]) or die "Timed out while waiting for apply error"; - -# Truncate test_tab1 so that apply worker can continue. -$node_subscriber->safe_psql('postgres', "TRUNCATE test_tab1;"); +# Reset single sub again +$node_subscriber->safe_psql( + $db, + qq(SELECT pg_stat_reset_subscription_stats((SELECT subid FROM + pg_stat_subscription_stats WHERE subname = '$sub1_name'))) +); + +# check reset timestamp is newer after reset +is( $node_subscriber->safe_psql( + $db, + qq(SELECT stats_reset > '$reset_time1'::timestamptz FROM + pg_stat_subscription_stats WHERE subname = '$sub1_name') + ), + qq(t), + qq(Check reset timestamp for '$sub1_name' is newer after second reset.)); + +# Make second subscription and publication +my $table2_name = 'test_tab2'; +my ($pub2_name, $sub2_name) = + create_sub_pub_w_errors($node_publisher, $node_subscriber, $db, + $table2_name); + +# Apply and Sync errors are > 0 and reset timestamp is NULL +is( $node_subscriber->safe_psql( + $db, + qq(SELECT apply_error_count > 0, + sync_error_count > 0, + stats_reset IS NULL + FROM pg_stat_subscription_stats + WHERE subname = '$sub2_name') + ), + qq(t|t|t), + qq(Confirm that apply errors and sync errors are both > 0 and stats_reset is NULL for sub '$sub2_name'.) +); + +# Reset all subscriptions +$node_subscriber->safe_psql($db, + qq(SELECT pg_stat_reset_subscription_stats(NULL))); + +# Apply and Sync errors are 0 and stats reset is not NULL +is( $node_subscriber->safe_psql( + $db, + qq(SELECT apply_error_count = 0, + sync_error_count = 0, + stats_reset IS NOT NULL + FROM pg_stat_subscription_stats + WHERE subname = '$sub1_name') + ), + qq(t|t|t), + qq(Confirm that apply errors and sync errors are both 0 and stats_reset is not NULL for sub '$sub1_name' after reset.) +); + +is( $node_subscriber->safe_psql( + $db, + qq(SELECT apply_error_count = 0, + sync_error_count = 0, + stats_reset IS NOT NULL + FROM pg_stat_subscription_stats + WHERE subname = '$sub2_name') + ), + qq(t|t|t), + qq(Confirm that apply errors and sync errors are both 0 and stats_reset is not NULL for sub '$sub2_name' after reset.) +); + +$reset_time1 = $node_subscriber->safe_psql($db, + qq(SELECT stats_reset FROM pg_stat_subscription_stats WHERE subname = '$sub1_name') +); +my $reset_time2 = $node_subscriber->safe_psql($db, + qq(SELECT stats_reset FROM pg_stat_subscription_stats WHERE subname = '$sub2_name') +); + +# Reset all subscriptions +$node_subscriber->safe_psql($db, + qq(SELECT pg_stat_reset_subscription_stats(NULL))); + +# check reset timestamp for sub1 is newer after reset +is( $node_subscriber->safe_psql( + $db, + qq(SELECT stats_reset > '$reset_time1'::timestamptz FROM + pg_stat_subscription_stats WHERE subname = '$sub1_name') + ), + qq(t), + qq(Confirm that reset timestamp for '$sub1_name' is newer after second reset.) +); + +# check reset timestamp for sub2 is newer after reset +is( $node_subscriber->safe_psql( + $db, + qq(SELECT stats_reset > '$reset_time2'::timestamptz FROM + pg_stat_subscription_stats WHERE subname = '$sub2_name') + ), + qq(t), + qq(Confirm that reset timestamp for '$sub2_name' is newer after second reset.) +); + +# Get subscription 1 oid +my $sub1_oid = $node_subscriber->safe_psql($db, + qq(SELECT oid FROM pg_subscription WHERE subname = '$sub1_name')); + +# Drop subscription 1 +$node_subscriber->safe_psql($db, qq(DROP SUBSCRIPTION $sub1_name)); + +# Subscription stats for sub1 should be gone +is( $node_subscriber->safe_psql( + $db, qq(SELECT pg_stat_have_stats('subscription', 0, $sub1_oid))), + qq(f), + qq(Subscription stats for subscription '$sub1_name' should be removed.)); + $node_subscriber->stop('fast'); $node_publisher->stop('fast'); From d6c0db14836cd843d589372d909c73aab68c7a24 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 7 Apr 2022 18:20:50 -0700 Subject: [PATCH 447/772] pgstat: Hide instability in stats.spec with -DCATCACHE_FORCE_RELEASE. With -DCATCACHE_FORCE_RELEASE a few tests failed. Those were trying to test behavior in the absence of invalidation processing and -DCATCACHE_FORCE_RELEASE obviously adds a lot of invalidation processing. The test already tried to handle debug_discard_caches > 0, by disabling it for individual tests. Instead hide potentially problematic function calls in a wrapper function that catches the does-not-exist error. The error isn't the actually interesting bit, it's whether the stats entry still exist afterwards. I confirmed that the tests still catches leaked function stats if I nuke the protections against that in pgstat_function.c. Per buildfarm animal prion. Discussion: https://postgr.es/m/20220407165709.jgdkrzqlkcwue6ko@alap3.anarazel.de --- src/test/isolation/expected/stats.out | 152 ++++++++++++------------ src/test/isolation/expected/stats_1.out | 152 ++++++++++++------------ src/test/isolation/specs/stats.spec | 38 +++--- 3 files changed, 172 insertions(+), 170 deletions(-) diff --git a/src/test/isolation/expected/stats.out b/src/test/isolation/expected/stats.out index 12234fbcd9..8bf6e57d0b 100644 --- a/src/test/isolation/expected/stats.out +++ b/src/test/isolation/expected/stats.out @@ -33,7 +33,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -87,7 +87,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -174,7 +174,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -257,7 +257,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -360,7 +360,7 @@ test_stat_func (1 row) step s1_commit: COMMIT; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -472,7 +472,7 @@ test_stat_func| 2|t |t (1 row) step s1_commit: COMMIT; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -584,7 +584,7 @@ test_stat_func| 2|t |t (1 row) step s1_rollback: ROLLBACK; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -619,7 +619,7 @@ test_stat_func| 3|t |t (1 row) -starting permutation: s1_track_funcs_all s2_track_funcs_all s2_func_call s2_ff s2_begin s2_func_call s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats +starting permutation: s1_track_funcs_all s2_track_funcs_all s2_func_call s2_ff s2_begin s2_func_call_ifexists s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats pg_stat_force_next_flush ------------------------ @@ -640,10 +640,10 @@ pg_stat_force_next_flush (1 row) step s2_begin: BEGIN; -step s2_func_call: SELECT test_stat_func() -test_stat_func --------------- - +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + (1 row) step s1_func_drop: DROP FUNCTION test_stat_func(); @@ -697,7 +697,7 @@ test_stat_func| | | (1 row) -starting permutation: s1_track_funcs_all s2_track_funcs_all s2_begin s2_func_call s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats +starting permutation: s1_track_funcs_all s2_track_funcs_all s2_begin s2_func_call_ifexists s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats pg_stat_force_next_flush ------------------------ @@ -706,10 +706,10 @@ pg_stat_force_next_flush step s1_track_funcs_all: SET track_functions = 'all'; step s2_track_funcs_all: SET track_functions = 'all'; step s2_begin: BEGIN; -step s2_func_call: SELECT test_stat_func() -test_stat_func --------------- - +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + (1 row) step s1_func_drop: DROP FUNCTION test_stat_func(); @@ -763,14 +763,12 @@ test_stat_func| | | (1 row) -starting permutation: s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_all s1_func_call s2_begin s2_func_call s1_func_drop s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_call s2_begin s2_func_call_ifexists s1_func_drop s2_func_call_ifexists s2_commit s2_ff s1_func_stats s2_func_stats pg_stat_force_next_flush ------------------------ (1 row) -step s1_disable_debug_discard: SET debug_discard_caches = 0; -step s2_disable_debug_discard: SET debug_discard_caches = 0; step s1_track_funcs_all: SET track_functions = 'all'; step s2_track_funcs_all: SET track_functions = 'all'; step s1_func_call: SELECT test_stat_func(); @@ -780,17 +778,17 @@ test_stat_func (1 row) step s2_begin: BEGIN; -step s2_func_call: SELECT test_stat_func() -test_stat_func --------------- - +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + (1 row) step s1_func_drop: DROP FUNCTION test_stat_func(); -step s2_func_call: SELECT test_stat_func() -test_stat_func --------------- - +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + (1 row) step s2_commit: COMMIT; @@ -829,14 +827,12 @@ test_stat_func| | | (1 row) -starting permutation: s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_none s1_func_call s2_begin s2_func_call s1_ff s1_func_stats s1_func_drop s2_track_funcs_none s1_func_stats s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats +starting permutation: s1_track_funcs_all s2_track_funcs_none s1_func_call s2_begin s2_func_call_ifexists s1_ff s1_func_stats s1_func_drop s2_track_funcs_none s1_func_stats s2_func_call_ifexists s2_commit s2_ff s1_func_stats s2_func_stats pg_stat_force_next_flush ------------------------ (1 row) -step s1_disable_debug_discard: SET debug_discard_caches = 0; -step s2_disable_debug_discard: SET debug_discard_caches = 0; step s1_track_funcs_all: SET track_functions = 'all'; step s2_track_funcs_none: SET track_functions = 'none'; step s1_func_call: SELECT test_stat_func(); @@ -846,13 +842,13 @@ test_stat_func (1 row) step s2_begin: BEGIN; -step s2_func_call: SELECT test_stat_func() -test_stat_func --------------- - +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -888,10 +884,10 @@ name |pg_stat_get_function_calls|total_above_zero|self_above_zero test_stat_func| | | (1 row) -step s2_func_call: SELECT test_stat_func() -test_stat_func --------------- - +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + (1 row) step s2_commit: COMMIT; @@ -930,14 +926,12 @@ test_stat_func| | | (1 row) -starting permutation: s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_none s1_func_call s2_begin s2_func_call s1_ff s1_func_stats s1_func_drop s2_track_funcs_all s1_func_stats s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats +starting permutation: s1_track_funcs_all s2_track_funcs_none s1_func_call s2_begin s2_func_call_ifexists s1_ff s1_func_stats s1_func_drop s2_track_funcs_all s1_func_stats s2_func_call_ifexists s2_commit s2_ff s1_func_stats s2_func_stats pg_stat_force_next_flush ------------------------ (1 row) -step s1_disable_debug_discard: SET debug_discard_caches = 0; -step s2_disable_debug_discard: SET debug_discard_caches = 0; step s1_track_funcs_all: SET track_functions = 'all'; step s2_track_funcs_none: SET track_functions = 'none'; step s1_func_call: SELECT test_stat_func(); @@ -947,13 +941,13 @@ test_stat_func (1 row) step s2_begin: BEGIN; -step s2_func_call: SELECT test_stat_func() -test_stat_func --------------- - +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -989,8 +983,12 @@ name |pg_stat_get_function_calls|total_above_zero|self_above_zero test_stat_func| | | (1 row) -step s2_func_call: SELECT test_stat_func() -ERROR: function call to dropped function +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + +(1 row) + step s2_commit: COMMIT; step s2_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush @@ -1053,7 +1051,7 @@ test_stat_func2 (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -1243,7 +1241,7 @@ test_stat_func2 (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -1360,7 +1358,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -1395,7 +1393,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -1430,7 +1428,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -1826,7 +1824,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -1915,7 +1913,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2004,7 +2002,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2093,7 +2091,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2152,7 +2150,7 @@ k3 | 1 (4 rows) step s2_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2269,7 +2267,7 @@ k0 | 1 (1 row) step s1_track_counts_off: SET track_counts = off; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2307,7 +2305,7 @@ key|value k0 | 1 (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2357,7 +2355,7 @@ k1 | 2 (2 rows) step s1_track_counts_on: SET track_counts = on; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2395,7 +2393,7 @@ k1 | 2 (2 rows) step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2451,7 +2449,7 @@ k1 | 2 (2 rows) step s1_track_counts_on: SET track_counts = on; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2489,7 +2487,7 @@ k1 | 2 (2 rows) step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2552,7 +2550,7 @@ k2 | 4 k3 | 1 (3 rows) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2615,7 +2613,7 @@ k2 | 4 k3 | 1 (3 rows) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2682,7 +2680,7 @@ key|value k0 | 1 (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2743,7 +2741,7 @@ key|value k0 | 1 (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2789,7 +2787,7 @@ step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; step s1_prepare_a: PREPARE TRANSACTION 'a'; step s1_commit_prepared_a: COMMIT PREPARED 'a'; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2829,7 +2827,7 @@ step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; step s1_prepare_a: PREPARE TRANSACTION 'a'; step s2_commit_prepared_a: COMMIT PREPARED 'a'; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2875,7 +2873,7 @@ step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; step s1_prepare_a: PREPARE TRANSACTION 'a'; step s1_rollback_prepared_a: ROLLBACK PREPARED 'a'; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2915,7 +2913,7 @@ step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; step s1_prepare_a: PREPARE TRANSACTION 'a'; step s2_rollback_prepared_a: ROLLBACK PREPARED 'a'; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2962,7 +2960,7 @@ step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = step s1_table_drop: DROP TABLE test_stat_tab; step s1_prepare_a: PREPARE TRANSACTION 'a'; step s1_rollback_prepared_a: ROLLBACK PREPARED 'a'; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -3003,7 +3001,7 @@ step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = step s1_table_drop: DROP TABLE test_stat_tab; step s1_prepare_a: PREPARE TRANSACTION 'a'; step s2_rollback_prepared_a: ROLLBACK PREPARED 'a'; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -3056,7 +3054,7 @@ pg_notify (3 rows) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ diff --git a/src/test/isolation/expected/stats_1.out b/src/test/isolation/expected/stats_1.out index beb959453d..61fda0b502 100644 --- a/src/test/isolation/expected/stats_1.out +++ b/src/test/isolation/expected/stats_1.out @@ -33,7 +33,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -87,7 +87,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -174,7 +174,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -257,7 +257,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -360,7 +360,7 @@ test_stat_func (1 row) step s1_commit: COMMIT; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -472,7 +472,7 @@ test_stat_func| 2|t |t (1 row) step s1_commit: COMMIT; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -584,7 +584,7 @@ test_stat_func| 2|t |t (1 row) step s1_rollback: ROLLBACK; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -619,7 +619,7 @@ test_stat_func| 3|t |t (1 row) -starting permutation: s1_track_funcs_all s2_track_funcs_all s2_func_call s2_ff s2_begin s2_func_call s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats +starting permutation: s1_track_funcs_all s2_track_funcs_all s2_func_call s2_ff s2_begin s2_func_call_ifexists s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats pg_stat_force_next_flush ------------------------ @@ -640,10 +640,10 @@ pg_stat_force_next_flush (1 row) step s2_begin: BEGIN; -step s2_func_call: SELECT test_stat_func() -test_stat_func --------------- - +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + (1 row) step s1_func_drop: DROP FUNCTION test_stat_func(); @@ -697,7 +697,7 @@ test_stat_func| | | (1 row) -starting permutation: s1_track_funcs_all s2_track_funcs_all s2_begin s2_func_call s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats +starting permutation: s1_track_funcs_all s2_track_funcs_all s2_begin s2_func_call_ifexists s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats pg_stat_force_next_flush ------------------------ @@ -706,10 +706,10 @@ pg_stat_force_next_flush step s1_track_funcs_all: SET track_functions = 'all'; step s2_track_funcs_all: SET track_functions = 'all'; step s2_begin: BEGIN; -step s2_func_call: SELECT test_stat_func() -test_stat_func --------------- - +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + (1 row) step s1_func_drop: DROP FUNCTION test_stat_func(); @@ -763,14 +763,12 @@ test_stat_func| | | (1 row) -starting permutation: s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_all s1_func_call s2_begin s2_func_call s1_func_drop s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats +starting permutation: s1_track_funcs_all s2_track_funcs_all s1_func_call s2_begin s2_func_call_ifexists s1_func_drop s2_func_call_ifexists s2_commit s2_ff s1_func_stats s2_func_stats pg_stat_force_next_flush ------------------------ (1 row) -step s1_disable_debug_discard: SET debug_discard_caches = 0; -step s2_disable_debug_discard: SET debug_discard_caches = 0; step s1_track_funcs_all: SET track_functions = 'all'; step s2_track_funcs_all: SET track_functions = 'all'; step s1_func_call: SELECT test_stat_func(); @@ -780,17 +778,17 @@ test_stat_func (1 row) step s2_begin: BEGIN; -step s2_func_call: SELECT test_stat_func() -test_stat_func --------------- - +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + (1 row) step s1_func_drop: DROP FUNCTION test_stat_func(); -step s2_func_call: SELECT test_stat_func() -test_stat_func --------------- - +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + (1 row) step s2_commit: COMMIT; @@ -829,14 +827,12 @@ test_stat_func| | | (1 row) -starting permutation: s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_none s1_func_call s2_begin s2_func_call s1_ff s1_func_stats s1_func_drop s2_track_funcs_none s1_func_stats s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats +starting permutation: s1_track_funcs_all s2_track_funcs_none s1_func_call s2_begin s2_func_call_ifexists s1_ff s1_func_stats s1_func_drop s2_track_funcs_none s1_func_stats s2_func_call_ifexists s2_commit s2_ff s1_func_stats s2_func_stats pg_stat_force_next_flush ------------------------ (1 row) -step s1_disable_debug_discard: SET debug_discard_caches = 0; -step s2_disable_debug_discard: SET debug_discard_caches = 0; step s1_track_funcs_all: SET track_functions = 'all'; step s2_track_funcs_none: SET track_functions = 'none'; step s1_func_call: SELECT test_stat_func(); @@ -846,13 +842,13 @@ test_stat_func (1 row) step s2_begin: BEGIN; -step s2_func_call: SELECT test_stat_func() -test_stat_func --------------- - +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -888,10 +884,10 @@ name |pg_stat_get_function_calls|total_above_zero|self_above_zero test_stat_func| | | (1 row) -step s2_func_call: SELECT test_stat_func() -test_stat_func --------------- - +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + (1 row) step s2_commit: COMMIT; @@ -930,14 +926,12 @@ test_stat_func| | | (1 row) -starting permutation: s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_none s1_func_call s2_begin s2_func_call s1_ff s1_func_stats s1_func_drop s2_track_funcs_all s1_func_stats s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats +starting permutation: s1_track_funcs_all s2_track_funcs_none s1_func_call s2_begin s2_func_call_ifexists s1_ff s1_func_stats s1_func_drop s2_track_funcs_all s1_func_stats s2_func_call_ifexists s2_commit s2_ff s1_func_stats s2_func_stats pg_stat_force_next_flush ------------------------ (1 row) -step s1_disable_debug_discard: SET debug_discard_caches = 0; -step s2_disable_debug_discard: SET debug_discard_caches = 0; step s1_track_funcs_all: SET track_functions = 'all'; step s2_track_funcs_none: SET track_functions = 'none'; step s1_func_call: SELECT test_stat_func(); @@ -947,13 +941,13 @@ test_stat_func (1 row) step s2_begin: BEGIN; -step s2_func_call: SELECT test_stat_func() -test_stat_func --------------- - +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -989,8 +983,12 @@ name |pg_stat_get_function_calls|total_above_zero|self_above_zero test_stat_func| | | (1 row) -step s2_func_call: SELECT test_stat_func() -ERROR: function call to dropped function +step s2_func_call_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + +(1 row) + step s2_commit: COMMIT; step s2_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush @@ -1053,7 +1051,7 @@ test_stat_func2 (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -1243,7 +1241,7 @@ test_stat_func2 (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -1360,7 +1358,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -1395,7 +1393,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -1430,7 +1428,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -1827,7 +1825,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -1918,7 +1916,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2009,7 +2007,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2100,7 +2098,7 @@ test_stat_func (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2160,7 +2158,7 @@ k3 | 1 (4 rows) step s2_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2277,7 +2275,7 @@ k0 | 1 (1 row) step s1_track_counts_off: SET track_counts = off; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2315,7 +2313,7 @@ key|value k0 | 1 (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2365,7 +2363,7 @@ k1 | 2 (2 rows) step s1_track_counts_on: SET track_counts = on; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2403,7 +2401,7 @@ k1 | 2 (2 rows) step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2459,7 +2457,7 @@ k1 | 2 (2 rows) step s1_track_counts_on: SET track_counts = on; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2497,7 +2495,7 @@ k1 | 2 (2 rows) step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2560,7 +2558,7 @@ key|value k0 | 1 (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2623,7 +2621,7 @@ key|value k0 | 1 (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2692,7 +2690,7 @@ key|value k0 | 1 (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2755,7 +2753,7 @@ key|value k0 | 1 (1 row) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2803,7 +2801,7 @@ step s1_prepare_a: PREPARE TRANSACTION 'a'; ERROR: prepared transactions are disabled step s1_commit_prepared_a: COMMIT PREPARED 'a'; ERROR: prepared transaction with identifier "a" does not exist -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2845,7 +2843,7 @@ step s1_prepare_a: PREPARE TRANSACTION 'a'; ERROR: prepared transactions are disabled step s2_commit_prepared_a: COMMIT PREPARED 'a'; ERROR: prepared transaction with identifier "a" does not exist -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2893,7 +2891,7 @@ step s1_prepare_a: PREPARE TRANSACTION 'a'; ERROR: prepared transactions are disabled step s1_rollback_prepared_a: ROLLBACK PREPARED 'a'; ERROR: prepared transaction with identifier "a" does not exist -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2935,7 +2933,7 @@ step s1_prepare_a: PREPARE TRANSACTION 'a'; ERROR: prepared transactions are disabled step s2_rollback_prepared_a: ROLLBACK PREPARED 'a'; ERROR: prepared transaction with identifier "a" does not exist -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -2984,7 +2982,7 @@ step s1_prepare_a: PREPARE TRANSACTION 'a'; ERROR: prepared transactions are disabled step s1_rollback_prepared_a: ROLLBACK PREPARED 'a'; ERROR: prepared transaction with identifier "a" does not exist -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -3027,7 +3025,7 @@ step s1_prepare_a: PREPARE TRANSACTION 'a'; ERROR: prepared transactions are disabled step s2_rollback_prepared_a: ROLLBACK PREPARED 'a'; ERROR: prepared transaction with identifier "a" does not exist -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ @@ -3080,7 +3078,7 @@ pg_notify (3 rows) -step s1_ff: SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; +step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ diff --git a/src/test/isolation/specs/stats.spec b/src/test/isolation/specs/stats.spec index f27d11eede..be4ae1f4ff 100644 --- a/src/test/isolation/specs/stats.spec +++ b/src/test/isolation/specs/stats.spec @@ -14,6 +14,13 @@ setup CREATE TABLE test_slru_stats(slru TEXT, stat TEXT, value INT); + -- calls test_stat_func, but hides error if it doesn't exist + CREATE FUNCTION test_stat_func_ifexists() RETURNS VOID LANGUAGE plpgsql AS $$ + BEGIN + PERFORM test_stat_func(); + EXCEPTION WHEN undefined_function THEN + END;$$; + SELECT pg_stat_force_next_flush(); } @@ -25,6 +32,7 @@ teardown DROP TABLE IF EXISTS test_stat_tab; DROP FUNCTION IF EXISTS test_stat_func(); DROP FUNCTION IF EXISTS test_stat_func2(); + DROP FUNCTION test_stat_func_ifexists(); } session s1 @@ -32,7 +40,6 @@ setup { SET stats_fetch_consistency = 'none'; } step s1_fetch_consistency_none { SET stats_fetch_consistency = 'none'; } step s1_fetch_consistency_cache { SET stats_fetch_consistency = 'cache'; } step s1_fetch_consistency_snapshot { SET stats_fetch_consistency = 'snapshot'; } -step s1_disable_debug_discard { SET debug_discard_caches = 0; } step s1_clear_snapshot { SELECT pg_stat_clear_snapshot(); } step s1_begin { BEGIN; } step s1_commit { COMMIT; } @@ -42,7 +49,7 @@ step s1_commit_prepared_a { COMMIT PREPARED 'a'; } step s1_rollback_prepared_a { ROLLBACK PREPARED 'a'; } # Function stats steps -step s1_ff { SELECT pg_stat_force_next_flush(); RESET debug_discard_caches; } +step s1_ff { SELECT pg_stat_force_next_flush(); } step s1_track_funcs_all { SET track_functions = 'all'; } step s1_track_funcs_none { SET track_functions = 'none'; } step s1_func_call { SELECT test_stat_func(); } @@ -118,9 +125,8 @@ step s1_slru_check_stats { session s2 -setup { SET stats_fetch_consistency = 'none'; RESET debug_discard_caches; } +setup { SET stats_fetch_consistency = 'none'; } step s2_begin { BEGIN; } -step s2_disable_debug_discard { SET debug_discard_caches = 0; } step s2_commit { COMMIT; } step s2_commit_prepared_a { COMMIT PREPARED 'a'; } step s2_rollback_prepared_a { ROLLBACK PREPARED 'a'; } @@ -130,6 +136,7 @@ step s2_ff { SELECT pg_stat_force_next_flush(); } step s2_track_funcs_all { SET track_functions = 'all'; } step s2_track_funcs_none { SET track_functions = 'none'; } step s2_func_call { SELECT test_stat_func() } +step s2_func_call_ifexists { SELECT test_stat_func_ifexists(); } step s2_func_call2 { SELECT test_stat_func2() } step s2_func_stats { SELECT @@ -175,10 +182,12 @@ permutation ### Check interaction between dropping and stats reporting -# Disable debug_discard_caches for a few of these tests - we precisely are -# testing the behavior of no invalidations arriving. "Real" invalidations -# shouldn't trigger behavioral difference, because we are testing paths -# precisely because they do not have AcceptInvalidationMessages calls.() +# Some of these tests try to test behavior in cases where no invalidation +# processing is triggered. To prevent output changes when +# debug_discard_caches, CATCACHE_FORCE_RELEASE or RELCACHE_FORCE_RELEASE are +# used (which trigger invalidation processing in paths that normally don't), +# test_stat_func_ifexists() can be used, which tries to call test_stat_func(), +# but doesn't raise an error if the function doesn't exist. # dropping a table remove stats iff committed permutation @@ -193,14 +202,13 @@ permutation permutation s1_track_funcs_all s2_track_funcs_all s2_func_call s2_ff # this access increments refcount, preventing the shared entry from being dropped - s2_begin s2_func_call s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats + s2_begin s2_func_call_ifexists s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats permutation s1_track_funcs_all s2_track_funcs_all - s2_begin s2_func_call s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats + s2_begin s2_func_call_ifexists s1_func_drop s1_func_stats s2_commit s2_ff s1_func_stats s2_func_stats permutation - s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_all - s1_func_call s2_begin s2_func_call s1_func_drop s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats + s1_func_call s2_begin s2_func_call_ifexists s1_func_drop s2_func_call_ifexists s2_commit s2_ff s1_func_stats s2_func_stats # Function calls don't necessarily trigger cache invalidation processing. The # default handling of dropped stats could therefore end up with stats getting @@ -209,13 +217,11 @@ permutation # on. Verify that the stats are indeed dropped, and document the behavioral # difference between track_functions settings. permutation - s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_none - s1_func_call s2_begin s2_func_call s1_ff s1_func_stats s1_func_drop s2_track_funcs_none s1_func_stats s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats + s1_func_call s2_begin s2_func_call_ifexists s1_ff s1_func_stats s1_func_drop s2_track_funcs_none s1_func_stats s2_func_call_ifexists s2_commit s2_ff s1_func_stats s2_func_stats permutation - s1_disable_debug_discard s2_disable_debug_discard s1_track_funcs_all s2_track_funcs_none - s1_func_call s2_begin s2_func_call s1_ff s1_func_stats s1_func_drop s2_track_funcs_all s1_func_stats s2_func_call s2_commit s2_ff s1_func_stats s2_func_stats + s1_func_call s2_begin s2_func_call_ifexists s1_ff s1_func_stats s1_func_drop s2_track_funcs_all s1_func_stats s2_func_call_ifexists s2_commit s2_ff s1_func_stats s2_func_stats # test pg_stat_reset_single_function_counters permutation From dafae9707ab7e7079ce1ba22cebda4557d0cbaf3 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Fri, 8 Apr 2022 13:28:04 +1200 Subject: [PATCH 448/772] Fix recovery_prefetch docs. Correct a typo and a couple of sentences that weren't updated to reflect recent changes to the code. Reported-by: Justin Pryzby Discussion: https://postgr.es/m/20220407125555.GC24419%40telsasoft.com --- doc/src/sgml/config.sgml | 5 +++-- doc/src/sgml/monitoring.sgml | 8 +++----- doc/src/sgml/wal.sgml | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index ac533968a0..c2c7a95a82 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -3685,8 +3685,9 @@ include_dir 'conf.d' Whether to try to prefetch blocks that are referenced in the WAL that are not yet in the buffer pool, during recovery. Valid values are - off (the default), on and - try. The setting try enables + off, on and + try (the default). The setting + try enables prefetching only if the operating system provides the posix_fadvise function, which is currently used to implement prefetching. Note that some operating systems provide the diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 76766d28dd..8717df060e 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -3049,11 +3049,9 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i The pg_stat_recovery_prefetch view will contain - only one row. It is filled with nulls if recovery has not run or - is not enabled. The - columns wal_distance, - block_distance - and io_depth show current values, and the + only one row. The columns wal_distance, + block_distance and + io_depth show current values, and the other columns show cumulative counters that can be reset with the pg_stat_reset_shared function. diff --git a/doc/src/sgml/wal.sgml b/doc/src/sgml/wal.sgml index 6b3406b7de..4b6ef283c1 100644 --- a/doc/src/sgml/wal.sgml +++ b/doc/src/sgml/wal.sgml @@ -812,7 +812,7 @@ The and settings limit prefetching concurrency and distance, respectively. By default, it is set to - try, which enabled the feature on systems where + try, which enables the feature on systems where posix_fadvise is available. From efb0ef909f605817da6b77c1f3fef0a24457ec16 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 8 Apr 2022 11:27:21 +0900 Subject: [PATCH 449/772] Track I/O timing for temporary file blocks in EXPLAIN (BUFFERS) Previously, the output of EXPLAIN (BUFFERS) option showed only the I/O timing spent reading and writing shared and local buffers. This commit adds on top of that the I/O timing for temporary buffers in the output of EXPLAIN (for spilled external sorts, hashes, materialization. etc). This can be helpful for users in cases where the I/O related to temporary buffers is the bottleneck. Like its cousin, this information is available only when track_io_timing is enabled. Playing the patch, this is showing an extra overhead of up to 1% even when using gettimeofday() as implementation for interval timings, which is slightly within the usual range noise still that's measurable. Author: Masahiko Sawada Reviewed-by: Georgios Kokolatos, Melanie Plageman, Julien Rouhaud, Ranier Vilela Discussion: https://postgr.es/m/CAD21AoAJgotTeP83p6HiAGDhs_9Fw9pZ2J=_tYTsiO5Ob-V5GQ@mail.gmail.com --- doc/src/sgml/ref/explain.sgml | 13 +-- src/backend/commands/explain.c | 42 ++++++++-- src/backend/executor/instrument.c | 6 ++ src/backend/storage/file/buffile.c | 29 ++++++- src/include/executor/instrument.h | 6 +- src/test/regress/expected/explain.out | 112 ++++++++++++++------------ src/test/regress/sql/explain.sql | 7 +- 7 files changed, 147 insertions(+), 68 deletions(-) diff --git a/doc/src/sgml/ref/explain.sgml b/doc/src/sgml/ref/explain.sgml index 4d758fb237..857c4e6e86 100644 --- a/doc/src/sgml/ref/explain.sgml +++ b/doc/src/sgml/ref/explain.sgml @@ -174,14 +174,15 @@ ROLLBACK; Include information on buffer usage. Specifically, include the number of shared blocks hit, read, dirtied, and written, the number of local blocks hit, read, dirtied, and written, the number of temp blocks read and - written, and the time spent reading and writing data file blocks - (in milliseconds) if is enabled. - A hit means that a read was avoided because the block was - found already in cache when needed. + written, and the time spent reading and writing data file blocks and + temporary file blocks (in milliseconds) if + is enabled. A + hit means that a read was avoided because the block + was found already in cache when needed. Shared blocks contain data from regular tables and indexes; local blocks contain data from temporary tables and indexes; - while temp blocks contain short-term working data used in sorts, hashes, - Materialize plan nodes, and similar cases. + while temporary blocks contain short-term working data used in sorts, + hashes, Materialize plan nodes, and similar cases. The number of blocks dirtied indicates the number of previously unmodified blocks that were changed by this query; while the number of blocks written indicates the number of diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 512b41dc3a..d2a2479822 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -3521,8 +3521,11 @@ show_buffer_usage(ExplainState *es, const BufferUsage *usage, bool planning) usage->temp_blks_written > 0); bool has_timing = (!INSTR_TIME_IS_ZERO(usage->blk_read_time) || !INSTR_TIME_IS_ZERO(usage->blk_write_time)); + bool has_temp_timing = (!INSTR_TIME_IS_ZERO(usage->temp_blk_read_time) || + !INSTR_TIME_IS_ZERO(usage->temp_blk_write_time)); bool show_planning = (planning && (has_shared || - has_local || has_temp || has_timing)); + has_local || has_temp || has_timing || + has_temp_timing)); if (show_planning) { @@ -3587,16 +3590,33 @@ show_buffer_usage(ExplainState *es, const BufferUsage *usage, bool planning) } /* As above, show only positive counter values. */ - if (has_timing) + if (has_timing || has_temp_timing) { ExplainIndentText(es); appendStringInfoString(es->str, "I/O Timings:"); - if (!INSTR_TIME_IS_ZERO(usage->blk_read_time)) - appendStringInfo(es->str, " read=%0.3f", - INSTR_TIME_GET_MILLISEC(usage->blk_read_time)); - if (!INSTR_TIME_IS_ZERO(usage->blk_write_time)) - appendStringInfo(es->str, " write=%0.3f", - INSTR_TIME_GET_MILLISEC(usage->blk_write_time)); + + if (has_timing) + { + appendStringInfoString(es->str, " shared/local"); + if (!INSTR_TIME_IS_ZERO(usage->blk_read_time)) + appendStringInfo(es->str, " read=%0.3f", + INSTR_TIME_GET_MILLISEC(usage->blk_read_time)); + if (!INSTR_TIME_IS_ZERO(usage->blk_write_time)) + appendStringInfo(es->str, " write=%0.3f", + INSTR_TIME_GET_MILLISEC(usage->blk_write_time)); + if (has_temp_timing) + appendStringInfoChar(es->str, ','); + } + if (has_temp_timing) + { + appendStringInfoString(es->str, " temp"); + if (!INSTR_TIME_IS_ZERO(usage->temp_blk_read_time)) + appendStringInfo(es->str, " read=%0.3f", + INSTR_TIME_GET_MILLISEC(usage->temp_blk_read_time)); + if (!INSTR_TIME_IS_ZERO(usage->temp_blk_write_time)) + appendStringInfo(es->str, " write=%0.3f", + INSTR_TIME_GET_MILLISEC(usage->temp_blk_write_time)); + } appendStringInfoChar(es->str, '\n'); } @@ -3633,6 +3653,12 @@ show_buffer_usage(ExplainState *es, const BufferUsage *usage, bool planning) ExplainPropertyFloat("I/O Write Time", "ms", INSTR_TIME_GET_MILLISEC(usage->blk_write_time), 3, es); + ExplainPropertyFloat("Temp I/O Read Time", "ms", + INSTR_TIME_GET_MILLISEC(usage->temp_blk_read_time), + 3, es); + ExplainPropertyFloat("Temp I/O Write Time", "ms", + INSTR_TIME_GET_MILLISEC(usage->temp_blk_write_time), + 3, es); } } } diff --git a/src/backend/executor/instrument.c b/src/backend/executor/instrument.c index c5ff02a842..ceff4727d4 100644 --- a/src/backend/executor/instrument.c +++ b/src/backend/executor/instrument.c @@ -237,6 +237,8 @@ BufferUsageAdd(BufferUsage *dst, const BufferUsage *add) dst->temp_blks_written += add->temp_blks_written; INSTR_TIME_ADD(dst->blk_read_time, add->blk_read_time); INSTR_TIME_ADD(dst->blk_write_time, add->blk_write_time); + INSTR_TIME_ADD(dst->temp_blk_read_time, add->temp_blk_read_time); + INSTR_TIME_ADD(dst->temp_blk_write_time, add->temp_blk_write_time); } /* dst += add - sub */ @@ -259,6 +261,10 @@ BufferUsageAccumDiff(BufferUsage *dst, add->blk_read_time, sub->blk_read_time); INSTR_TIME_ACCUM_DIFF(dst->blk_write_time, add->blk_write_time, sub->blk_write_time); + INSTR_TIME_ACCUM_DIFF(dst->temp_blk_read_time, + add->temp_blk_read_time, sub->temp_blk_read_time); + INSTR_TIME_ACCUM_DIFF(dst->temp_blk_write_time, + add->temp_blk_write_time, sub->temp_blk_write_time); } /* helper functions for WAL usage accumulation */ diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 3108e96dc9..56b88594cc 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,6 +429,8 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; + instr_time io_start; + instr_time io_time; /* * Advance to next component file if necessary and possible. @@ -440,10 +442,14 @@ BufFileLoadBuffer(BufFile *file) file->curOffset = 0L; } + thisfile = file->files[file->curFile]; + + if (track_io_timing) + INSTR_TIME_SET_CURRENT(io_start); + /* * Read whatever we can get, up to a full bufferload. */ - thisfile = file->files[file->curFile]; file->nbytes = FileRead(thisfile, file->buffer.data, sizeof(file->buffer), @@ -458,6 +464,13 @@ BufFileLoadBuffer(BufFile *file) FilePathName(thisfile)))); } + if (track_io_timing) + { + INSTR_TIME_SET_CURRENT(io_time); + INSTR_TIME_SUBTRACT(io_time, io_start); + INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); + } + /* we choose not to advance curOffset here */ if (file->nbytes > 0) @@ -485,6 +498,8 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; + instr_time io_start; + instr_time io_time; /* * Advance to next component file if necessary and possible. @@ -507,6 +522,10 @@ BufFileDumpBuffer(BufFile *file) bytestowrite = (int) availbytes; thisfile = file->files[file->curFile]; + + if (track_io_timing) + INSTR_TIME_SET_CURRENT(io_start); + bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, bytestowrite, @@ -517,6 +536,14 @@ BufFileDumpBuffer(BufFile *file) (errcode_for_file_access(), errmsg("could not write to file \"%s\": %m", FilePathName(thisfile)))); + + if (track_io_timing) + { + INSTR_TIME_SET_CURRENT(io_time); + INSTR_TIME_SUBTRACT(io_time, io_start); + INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); + } + file->curOffset += bytestowrite; wpos += bytestowrite; diff --git a/src/include/executor/instrument.h b/src/include/executor/instrument.h index 1b7157bdd1..2945cce3a9 100644 --- a/src/include/executor/instrument.h +++ b/src/include/executor/instrument.h @@ -33,8 +33,10 @@ typedef struct BufferUsage int64 local_blks_written; /* # of local disk blocks written */ int64 temp_blks_read; /* # of temp blocks read */ int64 temp_blks_written; /* # of temp blocks written */ - instr_time blk_read_time; /* time spent reading */ - instr_time blk_write_time; /* time spent writing */ + instr_time blk_read_time; /* time spent reading blocks */ + instr_time blk_write_time; /* time spent writing blocks */ + instr_time temp_blk_read_time; /* time spent reading temp blocks */ + instr_time temp_blk_write_time; /* time spent writing temp blocks */ } BufferUsage; /* diff --git a/src/test/regress/expected/explain.out b/src/test/regress/expected/explain.out index bc36175921..48620edbc2 100644 --- a/src/test/regress/expected/explain.out +++ b/src/test/regress/expected/explain.out @@ -85,56 +85,6 @@ select explain_filter('explain (analyze, buffers, format text) select * from int Execution Time: N.N ms (3 rows) -select explain_filter('explain (analyze, buffers, format json) select * from int8_tbl i8'); - explain_filter ------------------------------------- - [ + - { + - "Plan": { + - "Node Type": "Seq Scan", + - "Parallel Aware": false, + - "Async Capable": false, + - "Relation Name": "int8_tbl",+ - "Alias": "i8", + - "Startup Cost": N.N, + - "Total Cost": N.N, + - "Plan Rows": N, + - "Plan Width": N, + - "Actual Startup Time": N.N, + - "Actual Total Time": N.N, + - "Actual Rows": N, + - "Actual Loops": N, + - "Shared Hit Blocks": N, + - "Shared Read Blocks": N, + - "Shared Dirtied Blocks": N, + - "Shared Written Blocks": N, + - "Local Hit Blocks": N, + - "Local Read Blocks": N, + - "Local Dirtied Blocks": N, + - "Local Written Blocks": N, + - "Temp Read Blocks": N, + - "Temp Written Blocks": N + - }, + - "Planning": { + - "Shared Hit Blocks": N, + - "Shared Read Blocks": N, + - "Shared Dirtied Blocks": N, + - "Shared Written Blocks": N, + - "Local Hit Blocks": N, + - "Local Read Blocks": N, + - "Local Dirtied Blocks": N, + - "Local Written Blocks": N, + - "Temp Read Blocks": N, + - "Temp Written Blocks": N + - }, + - "Planning Time": N.N, + - "Triggers": [ + - ], + - "Execution Time": N.N + - } + - ] -(1 row) - select explain_filter('explain (analyze, buffers, format xml) select * from int8_tbl i8'); explain_filter -------------------------------------------------------- @@ -276,6 +226,68 @@ select explain_filter('explain (buffers, format json) select * from int8_tbl i8' ] (1 row) +-- Check output including I/O timings. These fields are conditional +-- but always set in JSON format, so check them only in this case. +set track_io_timing = on; +select explain_filter('explain (analyze, buffers, format json) select * from int8_tbl i8'); + explain_filter +------------------------------------ + [ + + { + + "Plan": { + + "Node Type": "Seq Scan", + + "Parallel Aware": false, + + "Async Capable": false, + + "Relation Name": "int8_tbl",+ + "Alias": "i8", + + "Startup Cost": N.N, + + "Total Cost": N.N, + + "Plan Rows": N, + + "Plan Width": N, + + "Actual Startup Time": N.N, + + "Actual Total Time": N.N, + + "Actual Rows": N, + + "Actual Loops": N, + + "Shared Hit Blocks": N, + + "Shared Read Blocks": N, + + "Shared Dirtied Blocks": N, + + "Shared Written Blocks": N, + + "Local Hit Blocks": N, + + "Local Read Blocks": N, + + "Local Dirtied Blocks": N, + + "Local Written Blocks": N, + + "Temp Read Blocks": N, + + "Temp Written Blocks": N, + + "I/O Read Time": N.N, + + "I/O Write Time": N.N, + + "Temp I/O Read Time": N.N, + + "Temp I/O Write Time": N.N + + }, + + "Planning": { + + "Shared Hit Blocks": N, + + "Shared Read Blocks": N, + + "Shared Dirtied Blocks": N, + + "Shared Written Blocks": N, + + "Local Hit Blocks": N, + + "Local Read Blocks": N, + + "Local Dirtied Blocks": N, + + "Local Written Blocks": N, + + "Temp Read Blocks": N, + + "Temp Written Blocks": N, + + "I/O Read Time": N.N, + + "I/O Write Time": N.N, + + "Temp I/O Read Time": N.N, + + "Temp I/O Write Time": N.N + + }, + + "Planning Time": N.N, + + "Triggers": [ + + ], + + "Execution Time": N.N + + } + + ] +(1 row) + +set track_io_timing = off; -- SETTINGS option -- We have to ignore other settings that might be imposed by the environment, -- so printing the whole Settings field unfortunately won't do. diff --git a/src/test/regress/sql/explain.sql b/src/test/regress/sql/explain.sql index 5069fa8795..ae3f7a308d 100644 --- a/src/test/regress/sql/explain.sql +++ b/src/test/regress/sql/explain.sql @@ -65,12 +65,17 @@ select explain_filter('explain select * from int8_tbl i8'); select explain_filter('explain (analyze) select * from int8_tbl i8'); select explain_filter('explain (analyze, verbose) select * from int8_tbl i8'); select explain_filter('explain (analyze, buffers, format text) select * from int8_tbl i8'); -select explain_filter('explain (analyze, buffers, format json) select * from int8_tbl i8'); select explain_filter('explain (analyze, buffers, format xml) select * from int8_tbl i8'); select explain_filter('explain (analyze, buffers, format yaml) select * from int8_tbl i8'); select explain_filter('explain (buffers, format text) select * from int8_tbl i8'); select explain_filter('explain (buffers, format json) select * from int8_tbl i8'); +-- Check output including I/O timings. These fields are conditional +-- but always set in JSON format, so check them only in this case. +set track_io_timing = on; +select explain_filter('explain (analyze, buffers, format json) select * from int8_tbl i8'); +set track_io_timing = off; + -- SETTINGS option -- We have to ignore other settings that might be imposed by the environment, -- so printing the whole Settings field unfortunately won't do. From a6baa4baddd5f111bc59d8f5ed5cadbb2d91e98d Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 7 Apr 2022 23:36:50 -0400 Subject: [PATCH 450/772] Documentation for SQL/JSON features This documents the features added in commits f79b803dcc, f4fb45d15c, 33a377608f, 1a36bc9dba, 606948b058, 49082c2cc3, 4e34747c88, and fadb48b00e. I have cleaned up the aggregate section of the submitted docs, but there is still a deal of copy editing required. However, I thought it best to have some documentation sooner rather than later so testers can have a better idea what they are playing with. Nikita Glukhov Reviewers have included (in no particular order) Andres Freund, Alexander Korotkov, Pavel Stehule, Andrew Alsup, Erik Rijkers, Zhihong Yu, Himanshu Upadhyaya, Daniel Gustafsson, Justin Pryzby. Discussion: https://postgr.es/m/cd0bb935-0158-78a7-08b5-904886deac4b@postgrespro.ru Discussion: https://postgr.es/m/7e2cb85d-24cf-4abb-30a5-1a33715959bd@postgrespro.ru --- doc/src/sgml/func.sgml | 2542 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 2540 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 2f7aff9f21..569c78e792 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -17564,6 +17564,2421 @@ $.* ? (@ like_regex "^\\d+$") + + + SQL/JSON Functions and Expressions + + SQL/JSON + functions and expressions + + + + To provide native support for JSON data types within the SQL environment, + PostgreSQL implements the + SQL/JSON data model. + This model comprises sequences of items. Each item can hold SQL scalar + values, with an additional SQL/JSON null value, and composite data structures + that use JSON arrays and objects. The model is a formalization of the implied + data model in the JSON specification + RFC 7159. + + + + SQL/JSON allows you to handle JSON data alongside regular SQL data, + with transaction support, including: + + + + + + Uploading JSON data into the database and storing it in + regular SQL columns as character or binary strings. + + + + + Generating JSON objects and arrays from relational data. + + + + + Querying JSON data using SQL/JSON query functions and + SQL/JSON path language expressions. + + + + + + All SQL/JSON functions fall into one of two groups. + Constructor functions + generate JSON data from values of SQL types. + Query functions + evaluate SQL/JSON path language expressions against JSON values + and produce values of SQL/JSON types, which are converted to SQL types. + + + + Producing JSON Content + + + PostgreSQL provides several functions + that generate JSON data. Taking values of SQL types as input, these + functions construct JSON objects, JSON arrays or JSON scalars represented + as the json or jsonb types, or as + SQL character or binary strings. + + + + + + JSON + + + + + JSON_SCALAR + + + + + JSON_OBJECT + + + + + JSON_OBJECTAGG + + + + + JSON_ARRAY + + + + + JSON_ARRAYAGG + + + + + + <literal>JSON</literal> + json + +JSON ( + expression FORMAT JSON ENCODING UTF8 + { WITH | WITHOUT } UNIQUE KEYS + RETURNING json_data_type +) + + + + Description + + + The JSON function generates JSON + from text data. + + + + + Parameters + + + + expression FORMAT JSON ENCODING UTF8 + + + + The string expression provides the + JSON text data. + It can be any character string (text, + char, etc.) or binary string (bytea) + in UTF8 encoding. + If the expression is NULL an + SQL null value is returned. + + + The optional FORMAT clause is provided to conform + to the SQL/JSON standard. + + + + + + { WITH | WITHOUT } UNIQUE KEYS + + + + Defines whether duplicate keys are allowed: + + + + WITHOUT + + + Default. The constructed + JSON object can contain duplicate keys. + + + + + WITH + + + Duplicate keys are not allowed. + If the input data contains duplicate keys, an error is returned. + + + + + + Optionally, you can add the KEYS keyword for + semantic clarity. + + + + + + RETURNING json_data_type + + + + The output clause that specifies the type (json or + jsonb) of the generated JSON. + The default is json. + + + + + + + + Notes + + Alternatively, you can construct JSON values simply + using PostgreSQL-specific casts to + json and jsonb types. + + + + Examples + + Construct a JSON the provided strings: + + +SELECT JSON('{ "a" : 123, "b": [ true, "foo" ], "a" : "bar" }'); + json +-------------------------------------------------- + { "a" : 123, "b": [ true, "foo" ], "a" : "bar" } +(1 row) + + +SELECT JSON('{"a": 123, "b": [true, "foo"], "a": "bar"}' RETURNING jsonb); + json +---------------------------------- + {"a": "bar", "b": [true, "foo"]} +(1 row) + +SELECT JSON('{"a": 123, "b": [true, "foo"], "a": "bar"}' WITH UNIQUE KEYS); +ERROR: duplicate JSON object key value + + + + + + <literal>JSON_SCALAR</literal> + json_scalar + + +JSON_SCALAR ( + expression + RETURNING json_data_type +) + + + + Description + + + The JSON_SCALAR function generates a + JSON scalar value from SQL data. + + + + + Parameters + + + + expression + + + + The expression provides the data for constructing a + JSON value. + For null input, SQL null + (not a JSON null) value is returned. + For any scalar other than a number or a Boolean the text + representation will be used, with escaping as necessary to make + it a valid JSON string value. + For details, see + to_json()/to_jsonb() + in . + + + + + + RETURNING json_data_type + + + + The output clause that specifies the type (json or + jsonb) of the generated JSON scalar. + The default is json. + + + + + + + + Notes + + Alternatively, you can construct JSON objects by + using the PostgreSQL-specific + to_json()/to_jsonb() functions. + See for details. + + + + Examples + + Construct a JSON from the provided values various types: + + +SELECT JSON_SCALAR(123.45); + json_scalar +------------- + 123.45 +(1 row) + +SELECT JSON_SCALAR('123'); + json_scalar +------------- + "123" +(1 row) + +SELECT JSON_SCALAR(true); + json_scalar +------------- + true +(1 row) + + + + + + <literal>JSON_OBJECT</literal> + json_object + + +JSON_OBJECT ( + { key_expression { VALUE | ':' } + value_expression FORMAT JSON ENCODING UTF8 }, ... + { NULL | ABSENT } ON NULL + { WITH | WITHOUT } UNIQUE KEYS + RETURNING data_type FORMAT JSON ENCODING UTF8 +) + + + + Description + + + The JSON_OBJECT function generates a + JSON object from SQL or + JSON data. + + + + + Parameters + + + + + + key_expression { VALUE | ':' } + value_expression FORMAT JSON ENCODING UTF8 + + + + + The input clause that provides the data for constructing a JSON object: + + + + + key_expression is a scalar expression + defining the JSON key, which is implicitly + converted to the text type. + The provided expression cannot be NULL or + belong to a type that has a cast to json. + + + + + value_expression is an expression + that provides the input for the JSON value. + + + + + The optional FORMAT clause is provided to + conform to the SQL/JSON standard. + + + + + You must use a colon or the VALUE keyword as a + separator between the key and the value. Multiple key/value pairs are + separated by commas. + + + + + + + { NULL | ABSENT } ON NULL + + + + Defines whether NULL values are allowed in the constructed + JSON object: + + + + NULL + + + Default. NULL values are allowed. + + + + + ABSENT + + + If the value is NULL, + the corresponding key/value pair is omitted from the generated + JSON object. + + + + + + + + + + { WITH | WITHOUT } UNIQUE KEYS + + + Defines whether duplicate keys are allowed: + + + + WITHOUT + + + Default. The constructed + JSON object can contain duplicate keys. + + + + + WITH + + + Duplicate keys are not allowed. + If the input data contains duplicate keys, an error is returned. + This check is performed before removing JSON items with NULL values. + + + + + + Optionally, you can add the KEYS keyword for semantic clarity. + + + + + + + RETURNING data_type FORMAT JSON ENCODING UTF8 + + + + The output clause that specifies the type of the generated JSON object. + For details, see . + + + + + + + + + Notes + Alternatively, you can construct JSON objects by using the + PostgreSQL-specific json_build_object()/ + jsonb_build_object() functions. + See for details. + + + + + Examples + + Construct a JSON object from the provided key/value pairs of various types: + + +SELECT JSON_OBJECT( +-- scalar JSON types + 'key1': 'string', + 'key2': '[1, 2]', + 'key3' VALUE 123, -- alternative syntax for key-value delimiter + 'key4': NULL, +-- other types + 'key5': ARRAY[1, 2, 3], -- postgres array + 'key6': jsonb '{"a": ["b", 1]}', -- composite json/jsonb + 'key7': date '2017-09-30', -- datetime type + 'key8': row(1, 'a'), -- row type + 'key9': '[1, 2]' FORMAT JSON, -- same value as for key2, but with FORMAT +-- key can be an expression + 'key' || 'last' : TRUE +ABSENT ON NULL) AS json; + json +---------------------------------------------------- +{"key1" : "string", "key2" : "[1, 2]", "key3" : 123, + "key5" : [1,2,3], "key6" : {"a": ["b", 1]}, + "key7" : "2017-09-30", "key8" : {"f1":1,"f2":"a"}, + "key9" : [1, 2], "keylast" : true} +(1 row) + + + + From the films table, select some data + about the films distributed by Paramount Pictures + (did = 103) and return JSON objects: + + +SELECT +JSON_OBJECT( + 'code' VALUE f.code, + 'title' VALUE f.title, + 'did' VALUE f.did +) AS paramount +FROM films AS f +WHERE f.did = 103; + paramount +---------------------------------------------------- +{"code" : "P_301", "title" : "Vertigo", "did" : 103} +{"code" : "P_302", "title" : "Becket", "did" : 103} +{"code" : "P_303", "title" : "48 Hrs", "did" : 103} +(3 rows) + + + + + + <literal>JSON_OBJECTAGG</literal> + json_objectagg + + +JSON_OBJECTAGG ( + { key_expression { VALUE | ':' } value_expression } + { NULL | ABSENT } ON NULL + { WITH | WITHOUT } UNIQUE KEYS + RETURNING data_type FORMAT JSON ENCODING UTF8 +) + + + + + Description + + + The JSON_OBJECTAGG function aggregates the provided data + into a JSON object. You can use this function to combine values + stored in different table columns into pairs. If you specify a GROUP BY + or an ORDER BY clause, this function returns a separate JSON object + for each table row. + + + + + Parameters + + + + + key_expression { VALUE | ':' } value_expression + + + + + The input clause that provides the data to be aggregated as a JSON object: + + + + + key_expression is a scalar expression + defining the JSON key, which is implicitly + converted to the text type. + The provided expression cannot be NULL or + belong to a type that has a cast to json. + + + + + value_expression is an expression that + provides the input for the JSON value preceded + by its type. + For JSON scalar types, you can omit the type. + + + + The input value of the bytea type must be stored in UTF8 + and contain a valid UTF8 string. Otherwise, an error occurs. + PostgreSQL currently supports only UTF8. + + + + + + You must use a colon or the VALUE keyword as a separator between + keys and values. Multiple key/value pairs are separated by commas. + + + + + + + { NULL | ABSENT } ON NULL + + + + Defines whether NULL values are allowed in the constructed + JSON object: + + + + NULL + + + Default. NULL values are allowed. + + + + + ABSENT + + + If the value is NULL, + the corresponding key/value pair is omitted from the generated + JSON object. + + + + + + + + + + { WITH | WITHOUT } UNIQUE KEYS + + + Defines whether duplicate keys are allowed: + + + + WITHOUT + + + Default. The constructed + JSON object can contain duplicate keys. + + + + + WITH + + + Duplicate keys are not allowed. + If the input data contains duplicate keys, an error is returned. + This check is performed before removing JSON items with NULL values. + + + + + + Optionally, you can add the KEYS keyword for semantic clarity. + + + + + + + RETURNING data_type FORMAT JSON ENCODING UTF8 + + + + The output clause that specifies the type of the generated JSON object. + For details, see . + + + + + + + + + Notes + Alternatively, you can create JSON objects by using + PostgreSQL-specific json_object_agg()/ + jsonb_object_agg() aggregate functions. + See for details. + + + + + Examples + + + For films with did = 103, aggregate key/value pairs + of film genre (f.kind) and title (f.title) + into a single object: + + +SELECT +JSON_OBJECTAGG( + f.kind VALUE f.title) + AS films_list +FROM films AS f +where f.did = 103; + films_list +---------------------------------------------------- +{ "Action" : "Vertigo", "Drama" : "Becket", "Action" : "48 Hrs" } + + + + Return the same object as jsonb. Note that only a single film of + the action genre is included as the jsonb type does not allow duplicate keys. + + +SELECT +JSON_OBJECTAGG( + f.kind VALUE f.title + RETURNING jsonb) +AS films_list +FROM films AS f +where f.did = 103; + films_list +---------------------------------------------------- +{"Drama": "Becket", "Action": "48 Hrs"} + + + + Return objects of film titles and length, grouped by the film genre: + + +SELECT + f.kind, + JSON_OBJECTAGG( + f.title VALUE f.len +) AS films_list +FROM films AS f +GROUP BY f.kind; + + kind | films_list +-------------+---------------------------------- +Musical | { "West Side Story" : "02:32:00", "The King and I" : "02:13:00", "Bed Knobs and Broomsticks" : "01:57:00" } +Romantic | { "The African Queen" : "01:43:00", "Une Femme est une Femme" : "01:25:00", "Storia di una donna" : "01:30:00" } +Comedy | { "Bananas" : "01:22:00", "There's a Girl in my Soup" : "01:36:00" } +Drama | { "The Third Man" : "01:44:00", "Becket" : "02:28:00", "War and Peace" : "05:57:00", "Yojimbo" : "01:50:00", "Das Boot" : "02:29:00" } +Action | { "Vertigo" : "02:08:00", "48 Hrs" : "01:37:00", "Taxi Driver" : "01:54:00", "Absence of Malice" : "01:55:00" } +(5 rows) + + + + + + <literal>JSON_ARRAY</literal> + json_array + + +JSON_ARRAY ( + { value_expression FORMAT JSON } , ... + { NULL | ABSENT } ON NULL + RETURNING data_type FORMAT JSON ENCODING UTF8 +) + +JSON_ARRAY ( + query_expression + RETURNING data_type FORMAT JSON ENCODING UTF8 +) + + + + Description + + + The JSON_ARRAY function constructs a JSON array from + the provided SQL or JSON data. + + + + + Parameters + + + + + value_expression + + + + + The input clause that provides the data for constructing a JSON array. + The value_expression is an expression + that provides the input for the JSON value preceded by its type. + For JSON scalar types, you can omit the type. + + + + The input value of the bytea type must be stored in UTF8 + and contain a valid UTF8 string. Otherwise, an error occurs. + PostgreSQL currently supports only UTF8. + + + + + + + + + query_expression + + + + An SQL query that provides the data for constructing a JSON array. + The query must return a single column that holds the values to be + used in the array. + + + + + + + { NULL | ABSENT } ON NULL + + + + Defines whether NULL values are allowed in the generated JSON array: + + + + NULL + + + NULL values are allowed. + + + + + ABSENT + + + Default. If the value is NULL, + the corresponding key/value pair is omitted from the generated + JSON object. + + + + + + This clause is only supported for arrays built from an explicit list of values. + If you are using an SQL query to generate an array, NULL values are always + omitted. + + + + + + + RETURNING data_type FORMAT JSON ENCODING UTF8 + + + + The output clause that specifies the return type of the constructed JSON array. + For details, see . + + + + + + + + + Notes + Alternatively, you can create JSON arrays by using + PostgreSQL-specific json_build_array()/ + jsonb_build_array() functions. + See for details. + + + + + Examples + + From the films table, select some data + about the films distributed by Paramount Pictures + (did = 103) and return JSON arrays: + + +SELECT +JSON_ARRAY( + f.code, + f.title, + f.did +) AS films +FROM films AS f +WHERE f.did = 103; + films +---------------------------------------------------- +["P_301", "Vertigo", 103] +["P_302", "Becket", 103] +["P_303", "48 Hrs", 103] +(3 rows) + + + Construct a JSON array from the list of film titles returned from the + films table by a subquery: + + +SELECT +JSON_ARRAY( + SELECT + f.title +FROM films AS f +where f.did = 103) +AS film_titles; + film_titles +---------------------------------------------------- +["Vertigo", "Becket", "48 Hrs"] +(1 row) + + + + + + <literal>JSON_ARRAYAGG</literal> + json_arrayagg + + +JSON_ARRAYAGG ( + value_expression + ORDER BY sort_expression + { NULL | ABSENT } ON NULL + RETURNING data_type FORMAT JSON ENCODING UTF8 +) + + + + + Description + + + The JSON_ARRAYAGG function aggregates the provided SQL + or JSON data into a JSON array. + + + + + Parameters + + + + + value_expression + + + + + The input clause that provides the input data to be aggregated as + a JSON array. + The value_expression can be a value or a query + returning the values to be used as input in array construction. + You can provide multiple input values separated by commas. + + + + + + + ORDER BY + + + + Sorts the input data to be aggregated as a JSON array. + For details on the exact syntax of the ORDER BY clause, see . + + + + + + + { NULL | ABSENT } ON NULL + + + + Defines whether NULL values are allowed in the constructed array: + + + + NULLNULL values are allowed. + + + + + ABSENT (default) — NULL + values are omitted from the generated array. + + + + + + + + + + RETURNING data_type FORMAT JSON ENCODING UTF8 + + + + The output clause that specifies the return type of the constructed JSON array. + For details, see . + + + + + + + + + Notes + Alternatively, you can create JSON arrays by using + PostgreSQL-specific json_agg()/ + jsonb_agg() functions. + See for details. + + + + + Examples + + Construct an array of film titles sorted in alphabetical order: + + +SELECT +JSON_ARRAYAGG( + f.title +ORDER BY f.title ASC) AS film_titles +FROM films AS f; + film_titles +---------------------------------------------------- +["48 Hrs", "Absence of Malice", "Bananas", "Becket", "Bed Knobs and Broomsticks", "Das Boot", "Storia di una donna", "Taxi Driver", "The African Queen", "The King and I", "There's a Girl in my Soup", "The Third Man", "Une Femme est une Femme", "Vertigo", "War and Peace", "West Side Story", "Yojimbo"] +(1 row) + + + + + + + Querying JSON + + + SQL/JSON query functions evaluate SQL/JSON path language expressions + against JSON values, producing values of SQL/JSON types, which are + converted to SQL types. All SQL/JSON query functions accept several + common clauses described in . + For details on the SQL/JSON path language, + see . + + + + + + IS JSON + + + + + JSON_EXISTS + + + + + JSON_VALUE + + + + + JSON_QUERY + + + + + JSON_TABLE + + + + + + In some usage examples for these functions, + the following small table storing some JSON data will be used: + +CREATE TABLE my_films ( + js text ); + +INSERT INTO my_films VALUES ( +'{ "favorites" : [ + { "kind" : "comedy", "films" : [ + { "title" : "Bananas", + "director" : "Woody Allen"}, + { "title" : "The Dinner Game", + "director" : "Francis Veber" } ] }, + { "kind" : "horror", "films" : [ + { "title" : "Psycho", + "director" : "Alfred Hitchcock" } ] }, + { "kind" : "thriller", "films" : [ + { "title" : "Vertigo", + "director" : "Alfred Hitchcock" } ] }, + { "kind" : "drama", "films" : [ + { "title" : "Yojimbo", + "director" : "Akira Kurosawa" } ] } + ] }'); + + + + + <literal>JSON_EXISTS</literal> + json_exists + + +JSON_EXISTS ( + context_item, path_expression PASSING { value AS varname } , ... + RETURNING data_type + { TRUE | FALSE | UNKNOWN | ERROR } ON ERROR +) + + + + Description + + + JSON_EXISTS function checks whether the provided + JSON path expression can return any SQL/JSON items. + + + + + Parameters + + + + context_item, path_expression PASSING { value AS varname } , ... + + + + + The input data to query, the JSON path expression defining the query, and an optional PASSING clause. + See for details. + + + + + + + RETURNING data_type + + + + The output clause that specifies the data type of the returned value. + The specified data type should have a cast from a boolean + type, which is returned by default. + + + + + + + { TRUE | FALSE | UNKNOWN | ERROR } ON ERROR + + + + Defines the return value if an error occurs. The default value is FALSE. + + + + + + + + + Examples + + + Check whether the provided jsonb data contains a + key/value pair with the key1 key, and its value + contains an array with one or more elements bigger than 2: + + +SELECT JSON_EXISTS(jsonb '{"key1": [1,2,3]}', 'strict $.key1[*] ? (@ > 2)'); + json_exists +------------- + t +(1 row) + + + + Note the difference between strict and lax modes + if the required item does not exist: + + +-- Strict mode with ERROR on ERROR clause +SELECT JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'strict $.a[5]' ERROR ON ERROR); +ERROR: Invalid SQL/JSON subscript +(1 row) + + + +-- Lax mode +SELECT JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'lax $.a[5]' ERROR ON ERROR); + json_exists +------------- + f +(1 row) + + + +-- Strict mode using the default value for the ON ERROR clause +SELECT JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'strict $.a[5]'); + json_exists +------------- + f +(1 row) + + + + + + + <literal>JSON_VALUE</literal> + json_value + + +JSON_VALUE ( + context_item, path_expression PASSING { value AS varname } , ... + RETURNING data_type + { ERROR | NULL | DEFAULT expression } ON EMPTY + { ERROR | NULL | DEFAULT expression } ON ERROR +) + + + + Description + + + JSON_VALUE function extracts a value from the provided + JSON data and converts it to an SQL scalar. + If the specified JSON path expression returns more than one + SQL/JSON item, an error occurs. To extract + an SQL/JSON array or object, use . + + + + + Parameters + + + + + + context_item, path_expression PASSING { value AS varname } , ... + + + + + The input data to query, the JSON path expression defining the query, and an optional PASSING clause. + For details, see . + + + + + + + RETURNING data_type + + + + The output clause that specifies the data type of the returned value. + Out of the box, PostgreSQL + supports the following types: json, jsonb, + bytea, and character string types (text, char, + varchar, and nchar). + The extracted value must be a single SQL/JSON scalar item + and have a cast to the specified type. Otherwise, an error occurs. + By default, JSON_VALUE returns a string + of the text type. + + + + + + + { ERROR | NULL | DEFAULT expression } ON EMPTY + + + + Defines the return value if no JSON value is found. The default is + NULL. If you use + DEFAULT expression, + the provided expression is + evaluated and cast to the type specified in the RETURNING clause. + + + + + + + { ERROR | NULL | DEFAULT expression } ON ERROR + + + + Defines the return value if an unhandled error occurs. The default is + NULL. If you use + DEFAULT expression, + the provided expression is + evaluated and cast to the type specified in the RETURNING clause. + + + + + + + + + Examples + + + Extract an SQL/JSON value and return it as an SQL + scalar of the specified type. Note that + JSON_VALUE can only return a + single scalar, and the returned value must have a + cast to the specified return type: + + + +SELECT JSON_VALUE('"123.45"', '$' RETURNING float); + json_value +------------ + 123.45 +(1 row) + +SELECT JSON_VALUE('123.45', '$' RETURNING int ERROR ON ERROR); + json_value +------------ + 123 +(1 row) + +SELECT JSON_VALUE('"03:04 2015-02-01"', '$.datetime("HH24:MI YYYY-MM-DD")' RETURNING date); + json_value +------------ + 2015-02-01 +(1 row) + +SELECT JSON_VALUE('"123.45"', '$' RETURNING int ERROR ON ERROR); +ERROR: invalid input syntax for integer: "123.45" + +SELECT JSON_VALUE(jsonb '[1]', 'strict $' ERROR ON ERROR); +ERROR: SQL/JSON scalar required + +SELECT JSON_VALUE(jsonb '[1,2]', 'strict $[*]' ERROR ON ERROR); +ERROR: more than one SQL/JSON item + + + + If the path expression returns an array, an object, or + multiple SQL/JSON items, an error is returned, as specified + in the ON ERROR clause: + + +SELECT JSON_VALUE(jsonb '[1]', 'strict $' ERROR ON ERROR); +ERROR: SQL/JSON scalar required + +SELECT JSON_VALUE(jsonb '{"a": 1}', 'strict $' ERROR ON ERROR); +ERROR: SQL/JSON scalar required + +SELECT JSON_VALUE(jsonb '[1,2]', 'strict $[*]' ERROR ON ERROR); +ERROR: more than one SQL/JSON item + +SELECT JSON_VALUE(jsonb '[1,2]', 'strict $[*]' DEFAULT 1 ON ERROR); +1 + + + + + + + <literal>JSON_QUERY</literal> + json_query + + +JSON_QUERY ( + context_item, path_expression PASSING { value AS varname } , ... + RETURNING data_type FORMAT JSON ENCODING UTF8 + { WITHOUT | WITH { CONDITIONAL | UNCONDITIONAL } } ARRAY WRAPPER + { KEEP | OMIT } QUOTES ON SCALAR STRING + { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON EMPTY + { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON ERROR +) + + + + Description + + + JSON_QUERY function extracts an SQL/JSON + array or object from JSON data. This function must return + a JSON string, so if the path expression returns a scalar or multiple SQL/JSON + items, you must wrap the result using the WITH WRAPPER clause. + To extract a single SQL/JSON value, you can use . + + + + + Parameters + + + + + + context_item, path_expression PASSING { value AS varname } , ... + + + + + The input data to query, the JSON path expression defining the query, and an optional PASSING clause. + For details, see . + + + + + + + RETURNING data_type FORMAT JSON ENCODING UTF8 + + + + The output clause that specifies the data type of the returned value. + For details, see . + + + + + + + { WITHOUT | WITH { CONDITIONAL | UNCONDITIONAL } } ARRAY WRAPPER + + + + Defines whether to wrap a returned sequence of SQL/JSON + items into a SQL/JSON array. + + + + WITHOUT WRAPPER + + + Do not wrap the result. + This is the default behavior if the WRAPPER + clause is omitted. + + + + + WITH UNCONDITIONAL WRAPPER + + + Always wrap the result. + + + + + WITH CONDITIONAL WRAPPER + + + Wrap the result if the path + expression returns anything other than a single + SQL/JSON array or object. + + + + + + Optionally, you can add the ARRAY keyword for semantic clarity. + + + You cannot use this clause together with the ON EMPTY clause. + + + + + + + + { KEEP | OMIT } QUOTES ON SCALAR STRING + + + + Defines whether to keep or omit quotes if a scalar string is returned. + By default, scalar strings are returned with quotes. Using this + clause together with the WITH WRAPPER clause is not allowed. + + + Optionally, you can add the ON SCALAR STRING keywords for semantic clarity. + + + + + + + { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON EMPTY + + + + Defines the return value if no JSON value is found. The default is NULL. + If you use EMPTY ARRAY or EMPTY OBJECT, + an empty JSON array [] or object {} is returned, respectively. + If you use DEFAULT expression, + the provided expression is evaluated and cast + to the type specified in the RETURNING clause. + + + You cannot use this clause together with the WRAPPER clause. + + + + + + + { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON ERROR + + + + Defines the return value if an unhandled error occurs. The default is NULL. + If you use EMPTY ARRAY or EMPTY OBJECT, + an empty JSON array [] or object {} are returned, respectively. + If you use DEFAULT expression, + the provided expression is evaluated and cast + to the type specified in the RETURNING clause. + + + + + + + + + Examples + + + Extract all film genres listed in the my_films table: + + +SELECT + JSON_QUERY(js, '$.favorites[*].kind' WITH WRAPPER ERROR ON ERROR) +FROM my_films; + json_query +------------ + ["comedy", "horror", "thriller", "drama"] +(1 row) + + + + Note that the same query will result in an error if you omit the + WITH WRAPPER clause, as it returns multiple SQL/JSON items: + + +SELECT + JSON_QUERY(js, '$.favorites[*].kind' ERROR ON ERROR) +FROM my_films; +ERROR: more than one SQL/JSON item + + + + Compare the effect of different WRAPPER clauses: + + +SELECT + js, + JSON_QUERY(js, 'lax $[*]') AS "without", + JSON_QUERY(js, 'lax $[*]' WITH WRAPPER) AS "with uncond", + JSON_QUERY(js, 'lax $[*]' WITH CONDITIONAL WRAPPER) AS "with cond" +FROM + (VALUES (jsonb '[]'), ('[1]'), ('[[1,2,3]]'), ('[{"a": 1}]'), ('[1, null, "2"]')) foo(js); + js | without | with uncond | with cond +----------------+-----------+----------------+---------------- + [] | (null) | (null) | (null) + [1] | 1 | [1] | [1] + [[1, 2, 3]] | [1, 2, 3] | [[1, 2, 3]] | [1, 2, 3] + [{"a": 1}] | {"a": 1} | [{"a": 1}] | {"a": 1} + [1, null, "2"] | (null) | [1, null, "2"] | [1, null, "2"] +(5 rows) + + +Compare quote handling for scalar types with and without the OMIT QUOTES clause: + + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text); + json_query +------------ + "aaa" +(1 row) + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text OMIT QUOTES); + json_query +------------ + aaa +(1 row) + + + + + + <literal>IS JSON</literal> + is_json + + +expression + IS NOT JSON + { VALUE | SCALAR | ARRAY | OBJECT } + { WITH | WITHOUT } UNIQUE KEYS + + + + Description + + + The IS JSON predicate tests whether the provided value is valid + JSON data. If you provide a specific JSON data type as a parameter, + you can check whether the value belongs to this type. + You can also use this predicate in the IS NOT JSON form. + The return values are: + + + + t if the value satisfies the specified condition. + + + + + f if the value does not satisfy the specified condition. + + + + + + + + Parameters + + + + + + expression + + + + + The input clause defining the value to test. You can provide the values + of json, jsonb, + bytea, or character string types. + + + + + + + VALUE | SCALAR | ARRAY | OBJECT + + + + + Specifies the JSON data type to test for: + + + + VALUE (default) — any JSON type. + + + + + SCALARJSON number, string, or boolean. + + + + + ARRAYJSON array. + + + + + OBJECTJSON object. + + + + + + + + + + { WITH | WITHOUT } UNIQUE KEYS + + + Defines whether duplicate keys are allowed: + + + + WITHOUT (default) — the + JSON object can contain duplicate keys. + + + + + WITH — duplicate keys are not allowed. + If the input data contains duplicate keys, it is considered to be invalid JSON. + + + + Optionally, you can add the KEYS keyword for semantic clarity. + + + + + + + + + Examples + + + Compare the result returned by the IS JSON + predicate for different data types: + + +SELECT + js, + js IS JSON "is json", + js IS NOT JSON "is not json", + js IS JSON SCALAR "is scalar", + js IS JSON OBJECT "is object", + js IS JSON ARRAY "is array" +FROM + (VALUES ('123'), ('"abc"'), ('{"a": "b"}'), ('[1,2]'), ('abc')) foo(js); + + js | is json | is not json | is scalar | is object | is array +------------+---------+-------------+-----------+-----------|------------- + 123 | t | f | t | f | f + "abc" | t | f | t | f | f + {"a": "b"} | t | f | f | t | f + [1,2] | t | f | f | f | t + abc | f | t | f | f | f +(5 rows) + + + + + + <literal>JSON_TABLE</literal> + json_table + + +JSON_TABLE ( + context_item, path_expression AS json_path_name PASSING { value AS varname } , ... + COLUMNS ( json_table_column , ... ) + + PLAN ( json_table_plan ) | + PLAN DEFAULT ( { INNER | OUTER } , { CROSS | UNION } + | { CROSS | UNION } , { INNER | OUTER } ) + +) + +where json_table_column is: + + name type PATH json_path_specification + { WITHOUT | WITH { CONDITIONAL | UNCONDITIONAL } } ARRAY WRAPPER + { KEEP | OMIT } QUOTES ON SCALAR STRING + { ERROR | NULL | DEFAULT expression } ON EMPTY + { ERROR | NULL | DEFAULT expression } ON ERROR + | name type FORMAT json_representation + PATH json_path_specification + { WITHOUT | WITH { CONDITIONAL | UNCONDITIONAL } } ARRAY WRAPPER + { KEEP | OMIT } QUOTES ON SCALAR STRING + { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON EMPTY + { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON ERROR + | name type EXISTS PATH json_path_specification + { ERROR | TRUE | FALSE | UNKNOWN } ON ERROR + | NESTED PATH json_path_specification AS path_name + COLUMNS ( json_table_column , ... ) + | name FOR ORDINALITY + +json_table_plan is: + + json_path_name { OUTER | INNER } json_table_plan_primary + | json_table_plan_primary { UNION json_table_plan_primary } ... + | json_table_plan_primary { CROSS json_table_plan_primary } ... + +json_table_plan_primary is: + + json_path_name | ( json_table_plan ) + + + + + Description + + + JSON_TABLE function queries JSON data + and presents the results as a relational view, which can be accessed as a + regular SQL table. You can only use JSON_TABLE inside the + FROM clause of the SELECT statement + for an SQL table. + + + + Taking JSON data as input, JSON_TABLE uses + a path expression to extract a part of the provided data that + will be used as a row pattern for the + constructed view. Each SQL/JSON item at the top level of the row pattern serves + as the source for a separate row in the constructed relational view. + + + + To split the row pattern into columns, JSON_TABLE + provides the COLUMNS clause that defines the + schema of the created view. For each column to be constructed, + this clause provides a separate path expression that evaluates + the row pattern, extracts a JSON item, and returns it as a + separate SQL value for the specified column. If the required value + is stored in a nested level of the row pattern, it can be extracted + using the NESTED PATH subclause. Joining the + columns returned by NESTED PATH can add multiple + new rows to the constructed view. Such rows are called + child rows, as opposed to the parent row + that generates them. + + + + The rows produced by JSON_TABLE are laterally + joined to the row that generated them, so you do not have to explicitly join + the constructed view with the original table holding JSON + data. Optionally, you can specify how to join the columns returned + by NESTED PATH using the PLAN clause. + + + + Each NESTED PATH clause can generate one or more + columns, which are considered to be siblings + to each other. In relation to the columns returned directly from the row + expression or by the NESTED PATH clause of a + higher level, these columns are child columns. + Sibling columns are always joined first. Once they are processed, + the resulting rows are joined to the parent row. + + + + + Parameters + + + + + context_item, path_expression AS json_path_name PASSING { value AS varname } , ... + + + + + The input data to query, the JSON path expression defining the query, + and an optional PASSING clause, as described in + . The result of the input data + evaluation is called the row pattern. The row + pattern is used as the source for row values in the constructed view. + + + + + + + COLUMNS( json_table_column , ... ) + + + + + The COLUMNS clause defining the schema of the + constructed view. In this clause, you must specify all the columns + to be filled with SQL/JSON items. + The json_table_column + expression has the following syntax variants: + + + + + + name type + PATH json_path_specification + + + + + Inserts a single SQL/JSON item into each row of + the specified column. + + + The provided PATH expression parses the + row pattern defined by json_api_common_syntax + and fills the column with produced SQL/JSON items, one for each row. + If the PATH expression is omitted, + JSON_TABLE uses the + $.name path expression, + where name is the provided column name. + In this case, the column name must correspond to one of the + keys within the SQL/JSON item produced by the row pattern. + + + Internally, and + are used to produce resulting values. + is used for JSON, array, and + composite column types, is used for + other types. + + + Optionally, you can add ON EMPTY and + ON ERROR clauses to define how to handle missing values + or structural errors. + WRAPPER and QUOTES clauses can only + be used with JSON, array, and composite types. + These clauses have the same syntax and semantics as in + and + . + + + + + + + name type FORMAT json_representation + PATH json_path_specification + + + + + Generates a column and inserts a composite SQL/JSON + item into each row of this column. + + + The provided PATH expression parses the + row pattern defined by json_api_common_syntax + and fills the column with produced SQL/JSON items, one for each row. + If the PATH expression is omitted, + JSON_TABLE uses the + $.name path expression, + where name is the provided column name. + In this case, the column name must correspond to one of the + keys within the SQL/JSON item produced by the row pattern. + + + Internally, is used to produce + resulting values. + + + Optionally, you can add WRAPPER, QUOTES, + ON EMPTY and ON ERROR clauses + to define additional settings for the returned SQL/JSON items. + These clauses have the same syntax and semantics as + in . + + + + + + + + name type + EXISTS PATH json_path_specification + + + + + + Generates a column and inserts a boolean item into each row of this column. + + + The provided PATH expression parses the + row pattern defined by json_api_common_syntax, + checks whether any SQL/JSON items were returned, and fills the column with + resulting boolean value, one for each row. + The specified type should have cast from + boolean. + If the PATH expression is omitted, + JSON_TABLE uses the + $.name path expression, + where name is the provided column name. + + + Optionally, you can add ON ERROR clause to define + error behavior. This clause have the same syntax and semantics as in + . + + + + + + + NESTED PATH json_path_specification AS json_path_name + COLUMNS ( json_table_column , ... ) + + + + + Extracts SQL/JSON items from nested levels of the row pattern, + generates one or more columns as defined by the COLUMNS + subclause, and inserts the extracted SQL/JSON items into each row of these columns. + The json_table_column expression in the + COLUMNS subclause uses the same syntax as in the + parent COLUMNS clause. + + + + The NESTED PATH syntax is recursive, + so you can go down multiple nested levels by specifying several + NESTED PATH subclauses within each other. + It allows to unnest the hierarchy of JSON objects and arrays + in a single function invocation rather than chaining several + JSON_TABLE expressions in an SQL statement. + + + + You can use the PLAN clause to define how + to join the columns returned by NESTED PATH clauses. + + + + + + + name FOR ORDINALITY + + + + + Adds an ordinality column that provides sequential row numbering. + You can have only one ordinality column per table. Row numbering + is 1-based. For child rows that result from the NESTED PATH + clauses, the parent row number is repeated. + + + + + + + + + + + AS json_path_name + + + + + The optional json_path_name serves as an + identifier of the provided json_path_specification. + The path name must be unique and cannot coincide with column names. + When using the PLAN clause, you must specify the names + for all the paths, including the row pattern. Each path name can appear in + the PLAN clause only once. + + + + + + + PLAN ( json_table_plan ) + + + + + Defines how to join the data returned by NESTED PATH + clauses to the constructed view. + + + To join columns with parent/child relationship, you can use: + + + + + INNER + + + + + Use INNER JOIN, so that the parent row + is omitted from the output if it does not have any child rows + after joining the data returned by NESTED PATH. + + + + + + + OUTER + + + + + Use LEFT OUTER JOIN, so that the parent row + is always included into the output even if it does not have any child rows + after joining the data returned by NESTED PATH, with NULL values + inserted into the child columns if the corresponding + values are missing. + + + This is the default option for joining columns with parent/child relationship. + + + + + + + To join sibling columns, you can use: + + + + + + UNION + + + + + Use FULL OUTER JOIN ON FALSE, so that both parent and child + rows are included into the output, with NULL values inserted + into both child and parent columns for all missing values. + + + This is the default option for joining sibling columns. + + + + + + + CROSS + + + + + Use CROSS JOIN, so that the output includes + a row for every possible combination of rows from the left-hand + and the right-hand columns. + + + + + + + + + + + + PLAN DEFAULT ( option , ... ) + + + + Overrides the default joining plans. The INNER and + OUTER options define the joining plan for parent/child + columns, while UNION and CROSS + affect the sibling columns. You can override the default plans for all columns at once. + Even though the path names are not included into the PLAN DEFAULT + clause, they must be provided for all the paths to conform to + the SQL/JSON standard. + + + + + + + + Examples + + + Query the my_films table holding + some JSON data about the films and create a view that + distributes the film genre, title, and director between separate columns: + +SELECT jt.* FROM + my_films, + JSON_TABLE ( js, '$.favorites[*]' COLUMNS ( + id FOR ORDINALITY, + kind text PATH '$.kind', + NESTED PATH '$.films[*]' COLUMNS ( + title text PATH '$.title', + director text PATH '$.director'))) AS jt; +----+----------+------------------+------------------- + id | kind | title | director +----+----------+------------------+------------------- + 1 | comedy | Bananas | Woody Allen + 1 | comedy | The Dinner Game | Francis Veber + 2 | horror | Psycho | Alfred Hitchcock + 3 | thriller | Vertigo | Hitchcock + 4 | drama | Yojimbo | Akira Kurosawa + (5 rows) + + + + + Find a director that has done films in two different genres: + +SELECT + director1 AS director, title1, kind1, title2, kind2 +FROM + my_films, + JSON_TABLE ( js, '$.favorites' AS favs COLUMNS ( + NESTED PATH '$[*]' AS films1 COLUMNS ( + kind1 text PATH '$.kind', + NESTED PATH '$.films[*]' AS film1 COLUMNS ( + title1 text PATH '$.title', + director1 text PATH '$.director') + ), + NESTED PATH '$[*]' AS films2 COLUMNS ( + kind2 text PATH '$.kind', + NESTED PATH '$.films[*]' AS film2 COLUMNS ( + title2 text PATH '$.title', + director2 text PATH '$.director' + ) + ) + ) + PLAN (favs OUTER ((films1 INNER film1) CROSS (films2 INNER film2))) + ) AS jt + WHERE kind1 > kind2 AND director1 = director2; + + + + + + + + Serializing JSON data + + + + JSON_SERIALIZE + + + + + + <literal>JSON_SERIALAIZE</literal> + json_serialize + + +JSON_SERIALIZE ( + expression FORMAT JSON ENCODING UTF8 + RETURNING data_type FORMAT JSON ENCODING UTF8 +) + + + + Description + + + JSON_SERIALIZE function transforms a SQL/JSON value + into a character or binary string. + + + + + Parameters + + + + expression FORMAT JSON ENCODING UTF8 + + + + JSON typed expression that provides a data for + serialization. Accepted JSON types (json and + jsonb), any character string types (text, + char, etc.), binary strings (bytea) in + UTF8 encoding. + For null input, null value is returned. + + + The optional FORMAT clause is provided to conform + to the SQL/JSON standard. + + + + + + RETURNING data_type FORMAT JSON ENCODING UTF8 + + + + The output clause that specifies the target character or binary string + type (text, char, bytea, etc.). + + + + + + + + Notes + + Alternatively, you can construct JSON values simply + using PostgreSQL-specific casts to + json and jsonb types. + + + + Examples + + Construct a JSON the provided strings: + + +SELECT JSON_SERIALIZE(JSON_SCALAR('foo')); + json_serialize +---------------- + "foo" +(1 row) + +SELECT JSON_SERIALIZE('{"foo": "bar", "baz": [1, 2, 3]}' RETURNING bytea); + json_serialize +-------------------------------------------------------------------- + \x7b22666f6f223a2022626172222c202262617a223a205b312c20322c20335d7d +(1 row) + + + + + + + + + SQL/JSON Common Clauses + + + SQL/JSON Input Clause + + + + + context_item, path_expression + PASSING { value AS varname } , ... + + + + The input clause specifies the JSON data to query and + the exact query path to be passed to SQL/JSON query functions: + + + + + The context_item is the JSON data to query. + + + + Currently for functions JSON_VALUE, + JSON_EXISTS, and JSON_QUERY + this must be a value of type jsonb. + + + + + + The path_expression is an SQL/JSON path + expression that specifies the items to be retrieved from the JSON + data. For details on path expression syntax, see + . + + + + + The optional PASSING clause provides the values for + the named variables used in the SQL/JSON path expression. + + + + + The input clause is common for all SQL/JSON query functions. + + + + + + + + + SQL/JSON Output Clause + + + + + RETURNING data_type FORMAT JSON ENCODING UTF8 + + + + The output clause that specifies the return type of the generated + JSON object. Out of the box, PostgreSQL + supports the following types: json, jsonb, + bytea, and character string types (text, char, + varchar, and nchar). + To use other types, you must create the CAST from json for this type. + By default, the json type is returned. + + + The optional FORMAT clause is provided to conform to the SQL/JSON standard. + + + The output clause is common for both constructor and query SQL/JSON functions. + + + + + + + + + @@ -19932,6 +22347,29 @@ SELECT NULLIF(value, '(none)') ... No + + + + json_agg_strict + + json_agg_strict ( anyelement ) + json + + + + jsonb_agg_strict + + jsonb_agg_strict ( anyelement ) + jsonb + + + Collects all the input values, skipping nulls, into a JSON array. + Values are converted to JSON as per to_json + or to_jsonb. + + No + + @@ -19953,9 +22391,97 @@ SELECT NULLIF(value, '(none)') ... Collects all the key/value pairs into a JSON object. Key arguments - are coerced to text; value arguments are converted as - per to_json or to_jsonb. + are coerced to text; value arguments are converted as per + to_json or to_jsonb + Values can be null, but not keys. + + No + + + + + + json_object_agg_strict + + json_object_agg_strict ( + key "any", + value "any" ) + json + + + + jsonb_object_agg_strict + + jsonb_object_agg_strict ( + key "any", + value "any" ) + jsonb + + + Collects all the key/value pairs into a JSON object. Key arguments + are coerced to text; value arguments are converted as per + to_json or to_jsonb. + The key can not be null. If the + value is null then the entry is skipped, + + No + + + + + + json_object_agg_unique + + json_object_agg_unique ( + key "any", + value "any" ) + json + + + + jsonb_object_agg_unique + + jsonb_object_agg_unique ( + key "any", + value "any" ) + jsonb + + + Collects all the key/value pairs into a JSON object. Key arguments + are coerced to text; value arguments are converted as per + to_json or to_jsonb. Values can be null, but not keys. + If there is a duplicate key an error is thrown. + + No + + + + + + json_object_agg_unique_strict + + json_object_agg_unique_strict ( + key "any", + value "any" ) + json + + + + jsonb_object_agg_unique_strict + + jsonb_object_agg_unique_strict ( + key "any", + value "any" ) + jsonb + + + Collects all the key/value pairs into a JSON object. Key arguments + are coerced to text; value arguments are converted as per + to_json or to_jsonb. + The key can not be null. If the + value is null then the entry is skipped, + If there is a duplicate key an error is thrown. No @@ -20133,7 +22659,12 @@ SELECT NULLIF(value, '(none)') ... The aggregate functions array_agg, json_agg, jsonb_agg, + json_agg_strict, jsonb_agg_strict, json_object_agg, jsonb_object_agg, + json_object_agg_strict, jsonb_object_agg_strict, + json_object_agg_unique, jsonb_object_agg_unique, + json_object_agg_unique_strict, + jsonb_object_agg_unique_strict, string_agg, and xmlagg, as well as similar user-defined aggregate functions, produce meaningfully different result values @@ -20153,6 +22684,13 @@ SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab; subquery's output to be reordered before the aggregate is computed. + + + In addition to the JSON aggregates shown here, see the JSON_OBJECTAGG + and JSON_ARRAYAGG constructors in . + + + ANY From 76cbf7edb6385c682facda095050858cac2efae0 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 8 Apr 2022 13:12:07 +0900 Subject: [PATCH 451/772] pg_stat_statements: Track I/O timing for temporary file blocks This commit adds two new columns to pg_stat_statements, called temp_blk_read_time and temp_blk_write_time. Those columns respectively show the time spent to read and write temporary file blocks on disk, whose tracking has been added in efb0ef9. This information is available when track_io_timing is enabled, like blk_read_time and blk_write_time. pg_stat_statements is updated to version to 1.10 as an effect of the newly-added columns. Tests for the upgrade path 1.9->1.10 are added. PGSS_FILE_HEADER is bumped for the new stats file format. Author: Masahiko Sawada Reviewed-by: Georgios Kokolatos, Melanie Plageman, Julien Rouhaud, Ranier Vilela Discussion: https://postgr.es/m/CAD21AoAJgotTeP83p6HiAGDhs_9Fw9pZ2J=_tYTsiO5Ob-V5GQ@mail.gmail.com --- contrib/pg_stat_statements/Makefile | 3 +- .../expected/oldextversions.out | 106 ++++++++++++++++++ .../pg_stat_statements--1.9--1.10.sql | 59 ++++++++++ .../pg_stat_statements/pg_stat_statements.c | 38 ++++++- .../pg_stat_statements.control | 2 +- .../pg_stat_statements/sql/oldextversions.sql | 12 ++ doc/src/sgml/pgstatstatements.sgml | 26 ++++- 7 files changed, 237 insertions(+), 9 deletions(-) create mode 100644 contrib/pg_stat_statements/pg_stat_statements--1.9--1.10.sql diff --git a/contrib/pg_stat_statements/Makefile b/contrib/pg_stat_statements/Makefile index 7fabd96f38..edc40c8bbf 100644 --- a/contrib/pg_stat_statements/Makefile +++ b/contrib/pg_stat_statements/Makefile @@ -6,7 +6,8 @@ OBJS = \ pg_stat_statements.o EXTENSION = pg_stat_statements -DATA = pg_stat_statements--1.4.sql pg_stat_statements--1.8--1.9.sql \ +DATA = pg_stat_statements--1.4.sql \ + pg_stat_statements--1.9--1.10.sql pg_stat_statements--1.8--1.9.sql \ pg_stat_statements--1.7--1.8.sql pg_stat_statements--1.6--1.7.sql \ pg_stat_statements--1.5--1.6.sql pg_stat_statements--1.4--1.5.sql \ pg_stat_statements--1.3--1.4.sql pg_stat_statements--1.2--1.3.sql \ diff --git a/contrib/pg_stat_statements/expected/oldextversions.out b/contrib/pg_stat_statements/expected/oldextversions.out index f18c08838f..2813eb16cb 100644 --- a/contrib/pg_stat_statements/expected/oldextversions.out +++ b/contrib/pg_stat_statements/expected/oldextversions.out @@ -136,4 +136,110 @@ SELECT pg_get_functiondef('pg_stat_statements_reset'::regproc); (1 row) +-- New function pg_stat_statement_info, and new function +-- and view for pg_stat_statements introduced in 1.9 +AlTER EXTENSION pg_stat_statements UPDATE TO '1.9'; +SELECT pg_get_functiondef('pg_stat_statements_info'::regproc); + pg_get_functiondef +------------------------------------------------------------------------------------------------------------------------- + CREATE OR REPLACE FUNCTION public.pg_stat_statements_info(OUT dealloc bigint, OUT stats_reset timestamp with time zone)+ + RETURNS record + + LANGUAGE c + + PARALLEL SAFE STRICT + + AS '$libdir/pg_stat_statements', $function$pg_stat_statements_info$function$ + + +(1 row) + +\d pg_stat_statements + View "public.pg_stat_statements" + Column | Type | Collation | Nullable | Default +---------------------+------------------+-----------+----------+--------- + userid | oid | | | + dbid | oid | | | + toplevel | boolean | | | + queryid | bigint | | | + query | text | | | + plans | bigint | | | + total_plan_time | double precision | | | + min_plan_time | double precision | | | + max_plan_time | double precision | | | + mean_plan_time | double precision | | | + stddev_plan_time | double precision | | | + calls | bigint | | | + total_exec_time | double precision | | | + min_exec_time | double precision | | | + max_exec_time | double precision | | | + mean_exec_time | double precision | | | + stddev_exec_time | double precision | | | + rows | bigint | | | + shared_blks_hit | bigint | | | + shared_blks_read | bigint | | | + shared_blks_dirtied | bigint | | | + shared_blks_written | bigint | | | + local_blks_hit | bigint | | | + local_blks_read | bigint | | | + local_blks_dirtied | bigint | | | + local_blks_written | bigint | | | + temp_blks_read | bigint | | | + temp_blks_written | bigint | | | + blk_read_time | double precision | | | + blk_write_time | double precision | | | + wal_records | bigint | | | + wal_fpi | bigint | | | + wal_bytes | numeric | | | + +SELECT count(*) > 0 AS has_data FROM pg_stat_statements; + has_data +---------- + t +(1 row) + +-- New functions and views for pg_stat_statements in 1.10 +AlTER EXTENSION pg_stat_statements UPDATE TO '1.10'; +\d pg_stat_statements + View "public.pg_stat_statements" + Column | Type | Collation | Nullable | Default +---------------------+------------------+-----------+----------+--------- + userid | oid | | | + dbid | oid | | | + toplevel | boolean | | | + queryid | bigint | | | + query | text | | | + plans | bigint | | | + total_plan_time | double precision | | | + min_plan_time | double precision | | | + max_plan_time | double precision | | | + mean_plan_time | double precision | | | + stddev_plan_time | double precision | | | + calls | bigint | | | + total_exec_time | double precision | | | + min_exec_time | double precision | | | + max_exec_time | double precision | | | + mean_exec_time | double precision | | | + stddev_exec_time | double precision | | | + rows | bigint | | | + shared_blks_hit | bigint | | | + shared_blks_read | bigint | | | + shared_blks_dirtied | bigint | | | + shared_blks_written | bigint | | | + local_blks_hit | bigint | | | + local_blks_read | bigint | | | + local_blks_dirtied | bigint | | | + local_blks_written | bigint | | | + temp_blks_read | bigint | | | + temp_blks_written | bigint | | | + blk_read_time | double precision | | | + blk_write_time | double precision | | | + temp_blk_read_time | double precision | | | + temp_blk_write_time | double precision | | | + wal_records | bigint | | | + wal_fpi | bigint | | | + wal_bytes | numeric | | | + +SELECT count(*) > 0 AS has_data FROM pg_stat_statements; + has_data +---------- + t +(1 row) + DROP EXTENSION pg_stat_statements; diff --git a/contrib/pg_stat_statements/pg_stat_statements--1.9--1.10.sql b/contrib/pg_stat_statements/pg_stat_statements--1.9--1.10.sql new file mode 100644 index 0000000000..ca777f14e8 --- /dev/null +++ b/contrib/pg_stat_statements/pg_stat_statements--1.9--1.10.sql @@ -0,0 +1,59 @@ +/* contrib/pg_stat_statements/pg_stat_statements--1.9--1.10.sql */ + +-- complain if script is sourced in psql, rather than via ALTER EXTENSION +\echo Use "ALTER EXTENSION pg_stat_statements UPDATE TO '1.10'" to load this file. \quit + +/* First we have to remove them from the extension */ +ALTER EXTENSION pg_stat_statements DROP VIEW pg_stat_statements; +ALTER EXTENSION pg_stat_statements DROP FUNCTION pg_stat_statements(boolean); + +/* Then we can drop them */ +DROP VIEW pg_stat_statements; +DROP FUNCTION pg_stat_statements(boolean); + +/* Now redefine */ +CREATE FUNCTION pg_stat_statements(IN showtext boolean, + OUT userid oid, + OUT dbid oid, + OUT toplevel bool, + OUT queryid bigint, + OUT query text, + OUT plans int8, + OUT total_plan_time float8, + OUT min_plan_time float8, + OUT max_plan_time float8, + OUT mean_plan_time float8, + OUT stddev_plan_time float8, + OUT calls int8, + OUT total_exec_time float8, + OUT min_exec_time float8, + OUT max_exec_time float8, + OUT mean_exec_time float8, + OUT stddev_exec_time float8, + OUT rows int8, + OUT shared_blks_hit int8, + OUT shared_blks_read int8, + OUT shared_blks_dirtied int8, + OUT shared_blks_written int8, + OUT local_blks_hit int8, + OUT local_blks_read int8, + OUT local_blks_dirtied int8, + OUT local_blks_written int8, + OUT temp_blks_read int8, + OUT temp_blks_written int8, + OUT blk_read_time float8, + OUT blk_write_time float8, + OUT temp_blk_read_time float8, + OUT temp_blk_write_time float8, + OUT wal_records int8, + OUT wal_fpi int8, + OUT wal_bytes numeric +) +RETURNS SETOF record +AS 'MODULE_PATHNAME', 'pg_stat_statements_1_10' +LANGUAGE C STRICT VOLATILE PARALLEL SAFE; + +CREATE VIEW pg_stat_statements AS + SELECT * FROM pg_stat_statements(true); + +GRANT SELECT ON pg_stat_statements TO PUBLIC; diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 1d6049f2fd..42ac001053 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -83,7 +83,7 @@ PG_MODULE_MAGIC; #define PGSS_TEXT_FILE PG_STAT_TMP_DIR "/pgss_query_texts.stat" /* Magic number identifying the stats file format */ -static const uint32 PGSS_FILE_HEADER = 0x20201227; +static const uint32 PGSS_FILE_HEADER = 0x20220408; /* PostgreSQL major version number, changes in which invalidate all entries */ static const uint32 PGSS_PG_MAJOR_VERSION = PG_VERSION_NUM / 100; @@ -116,7 +116,8 @@ typedef enum pgssVersion PGSS_V1_2, PGSS_V1_3, PGSS_V1_8, - PGSS_V1_9 + PGSS_V1_9, + PGSS_V1_10 } pgssVersion; typedef enum pgssStoreKind @@ -178,8 +179,11 @@ typedef struct Counters int64 local_blks_written; /* # of local disk blocks written */ int64 temp_blks_read; /* # of temp blocks read */ int64 temp_blks_written; /* # of temp blocks written */ - double blk_read_time; /* time spent reading, in msec */ - double blk_write_time; /* time spent writing, in msec */ + double blk_read_time; /* time spent reading blocks, in msec */ + double blk_write_time; /* time spent writing blocks, in msec */ + double temp_blk_read_time; /* time spent reading temp blocks, in msec */ + double temp_blk_write_time; /* time spent writing temp blocks, in + * msec */ double usage; /* usage factor */ int64 wal_records; /* # of WAL records generated */ int64 wal_fpi; /* # of WAL full page images generated */ @@ -297,6 +301,7 @@ PG_FUNCTION_INFO_V1(pg_stat_statements_1_2); PG_FUNCTION_INFO_V1(pg_stat_statements_1_3); PG_FUNCTION_INFO_V1(pg_stat_statements_1_8); PG_FUNCTION_INFO_V1(pg_stat_statements_1_9); +PG_FUNCTION_INFO_V1(pg_stat_statements_1_10); PG_FUNCTION_INFO_V1(pg_stat_statements); PG_FUNCTION_INFO_V1(pg_stat_statements_info); @@ -1364,6 +1369,8 @@ pgss_store(const char *query, uint64 queryId, e->counters.temp_blks_written += bufusage->temp_blks_written; e->counters.blk_read_time += INSTR_TIME_GET_MILLISEC(bufusage->blk_read_time); e->counters.blk_write_time += INSTR_TIME_GET_MILLISEC(bufusage->blk_write_time); + e->counters.temp_blk_read_time += INSTR_TIME_GET_MILLISEC(bufusage->temp_blk_read_time); + e->counters.temp_blk_write_time += INSTR_TIME_GET_MILLISEC(bufusage->temp_blk_write_time); e->counters.usage += USAGE_EXEC(total_time); e->counters.wal_records += walusage->wal_records; e->counters.wal_fpi += walusage->wal_fpi; @@ -1417,7 +1424,8 @@ pg_stat_statements_reset(PG_FUNCTION_ARGS) #define PG_STAT_STATEMENTS_COLS_V1_3 23 #define PG_STAT_STATEMENTS_COLS_V1_8 32 #define PG_STAT_STATEMENTS_COLS_V1_9 33 -#define PG_STAT_STATEMENTS_COLS 33 /* maximum of above */ +#define PG_STAT_STATEMENTS_COLS_V1_10 35 +#define PG_STAT_STATEMENTS_COLS 35 /* maximum of above */ /* * Retrieve statement statistics. @@ -1429,6 +1437,16 @@ pg_stat_statements_reset(PG_FUNCTION_ARGS) * expected API version is identified by embedding it in the C name of the * function. Unfortunately we weren't bright enough to do that for 1.1. */ +Datum +pg_stat_statements_1_10(PG_FUNCTION_ARGS) +{ + bool showtext = PG_GETARG_BOOL(0); + + pg_stat_statements_internal(fcinfo, PGSS_V1_10, showtext); + + return (Datum) 0; +} + Datum pg_stat_statements_1_9(PG_FUNCTION_ARGS) { @@ -1542,6 +1560,10 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, if (api_version != PGSS_V1_9) elog(ERROR, "incorrect number of output arguments"); break; + case PG_STAT_STATEMENTS_COLS_V1_10: + if (api_version != PGSS_V1_10) + elog(ERROR, "incorrect number of output arguments"); + break; default: elog(ERROR, "incorrect number of output arguments"); } @@ -1742,6 +1764,11 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, values[i++] = Float8GetDatumFast(tmp.blk_read_time); values[i++] = Float8GetDatumFast(tmp.blk_write_time); } + if (api_version >= PGSS_V1_10) + { + values[i++] = Float8GetDatumFast(tmp.temp_blk_read_time); + values[i++] = Float8GetDatumFast(tmp.temp_blk_write_time); + } if (api_version >= PGSS_V1_8) { char buf[256]; @@ -1766,6 +1793,7 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, api_version == PGSS_V1_3 ? PG_STAT_STATEMENTS_COLS_V1_3 : api_version == PGSS_V1_8 ? PG_STAT_STATEMENTS_COLS_V1_8 : api_version == PGSS_V1_9 ? PG_STAT_STATEMENTS_COLS_V1_9 : + api_version == PGSS_V1_10 ? PG_STAT_STATEMENTS_COLS_V1_10 : -1 /* fail if you forget to update this assert */ )); tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); diff --git a/contrib/pg_stat_statements/pg_stat_statements.control b/contrib/pg_stat_statements/pg_stat_statements.control index 2f1ce6ed50..0747e48138 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.control +++ b/contrib/pg_stat_statements/pg_stat_statements.control @@ -1,5 +1,5 @@ # pg_stat_statements extension comment = 'track planning and execution statistics of all SQL statements executed' -default_version = '1.9' +default_version = '1.10' module_pathname = '$libdir/pg_stat_statements' relocatable = true diff --git a/contrib/pg_stat_statements/sql/oldextversions.sql b/contrib/pg_stat_statements/sql/oldextversions.sql index f2e822acd3..e2a83106d4 100644 --- a/contrib/pg_stat_statements/sql/oldextversions.sql +++ b/contrib/pg_stat_statements/sql/oldextversions.sql @@ -36,4 +36,16 @@ AlTER EXTENSION pg_stat_statements UPDATE TO '1.8'; \d pg_stat_statements SELECT pg_get_functiondef('pg_stat_statements_reset'::regproc); +-- New function pg_stat_statement_info, and new function +-- and view for pg_stat_statements introduced in 1.9 +AlTER EXTENSION pg_stat_statements UPDATE TO '1.9'; +SELECT pg_get_functiondef('pg_stat_statements_info'::regproc); +\d pg_stat_statements +SELECT count(*) > 0 AS has_data FROM pg_stat_statements; + +-- New functions and views for pg_stat_statements in 1.10 +AlTER EXTENSION pg_stat_statements UPDATE TO '1.10'; +\d pg_stat_statements +SELECT count(*) > 0 AS has_data FROM pg_stat_statements; + DROP EXTENSION pg_stat_statements; diff --git a/doc/src/sgml/pgstatstatements.sgml b/doc/src/sgml/pgstatstatements.sgml index 3a7e36bd13..0ead2464d8 100644 --- a/doc/src/sgml/pgstatstatements.sgml +++ b/doc/src/sgml/pgstatstatements.sgml @@ -338,7 +338,7 @@ blk_read_time double precision - Total time the statement spent reading blocks, in milliseconds + Total time the statement spent reading data file blocks, in milliseconds (if is enabled, otherwise zero) @@ -348,11 +348,33 @@ blk_write_time double precision - Total time the statement spent writing blocks, in milliseconds + Total time the statement spent writing data file blocks, in milliseconds (if is enabled, otherwise zero) + + + temp_blk_read_time double precision + + + Total time the statement spent reading temporary file blocks, in + milliseconds (if is enabled, + otherwise zero) + + + + + + temp_blk_write_time double precision + + + Total time the statement spent writing temporary file blocks, in + milliseconds (if is enabled, + otherwise zero) + + + wal_records bigint From b3abca68106d518ce5d3c0d9a1e0ec02a647ceda Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 7 Apr 2022 21:35:35 -0700 Subject: [PATCH 452/772] pgstat: Update docs to match the shared memory stats reality. This includes removing documentation for stats_temp_directory, adding documentation for stats_fetch_consistency, rephrasing references to the stats collector and documenting that starting a cleanly shut down standby will not remove stats anymore. The latter point might require further wordsmithing, it wasn't easy to adjust some of the existing content. Author: Kyotaro Horiguchi Author: Andres Freund Reviewed-By: Thomas Munro Reviewed-By: Justin Pryzby Reviewed-By: "David G. Johnston" Reviewed-By: Lukas Fittl Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- doc/src/sgml/backup.sgml | 2 - doc/src/sgml/catalogs.sgml | 6 +- doc/src/sgml/config.sgml | 49 ++++++---- doc/src/sgml/func.sgml | 4 +- doc/src/sgml/glossary.sgml | 38 ++++---- doc/src/sgml/high-availability.sgml | 13 +-- doc/src/sgml/maintenance.sgml | 2 +- doc/src/sgml/monitoring.sgml | 142 +++++++++++++++------------- doc/src/sgml/ref/pg_dump.sgml | 2 +- 9 files changed, 139 insertions(+), 119 deletions(-) diff --git a/doc/src/sgml/backup.sgml b/doc/src/sgml/backup.sgml index fc2ec68758..6812e9ec66 100644 --- a/doc/src/sgml/backup.sgml +++ b/doc/src/sgml/backup.sgml @@ -1036,8 +1036,6 @@ SELECT * FROM pg_backup_stop(wait_for_archive => true); pg_snapshots/, pg_stat_tmp/, and pg_subtrans/ (but not the directories themselves) can be omitted from the backup as they will be initialized on postmaster startup. - If is set and is under the data - directory then the contents of that directory can also be omitted. diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index e8f850a9c0..c1c89a95c6 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -9593,9 +9593,9 @@ SCRAM-SHA-256$<iteration count>:&l lists the system views described here. More detailed documentation of each view follows below. - There are some additional views that provide access to the results of - the statistics collector; they are described in . + There are some additional views that provide access to accumulated + statistics; they are described in + . diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index c2c7a95a82..6e3e27bed7 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -7885,15 +7885,15 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; Run-time Statistics - - Query and Index Statistics Collector + + Cumulative Query and Index Statistics - These parameters control server-wide statistics collection features. - When statistics collection is enabled, the data that is produced can be - accessed via the pg_stat and - pg_statio family of system views. - Refer to for more information. + These parameters control the server-wide cumulative statistics system. + When enabled, the data that is collected can be accessed via the + pg_stat and pg_statio + family of system views. Refer to for more + information. @@ -8031,22 +8031,37 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; - - stats_temp_directory (string) + + stats_fetch_consistency (enum) - stats_temp_directory configuration parameter + stats_fetch_consistency configuration parameter - Sets the directory to store temporary statistics data in. This can be - a path relative to the data directory or an absolute path. The default - is pg_stat_tmp. Pointing this at a RAM-based - file system will decrease physical I/O requirements and can lead to - improved performance. - This parameter can only be set in the postgresql.conf - file or on the server command line. + Determines the behavior when cumulative statistics are accessed + multiple times within a transaction. When set to + none, each access re-fetches counters from shared + memory. When set to cache, the first access to + statistics for an object caches those statistics until the end of the + transaction unless pg_stat_clear_snapshot() is + called. When set to snapshot, the first statistics + access caches all statistics accessible in the current database, until + the end of the transaction unless + pg_stat_clear_snapshot() is called. The default + is cache. + + + none is most suitable for monitoring systems. If + values are only accessed once, it is the most + efficient. cache ensures repeat accesses yield the + same values, which is important for queries involving + e.g. self-joins. snapshot can be useful when + interactively inspecting statistics, but has higher overhead, + particularly if many database objects exist. + + diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 569c78e792..29c4376886 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -28019,8 +28019,8 @@ SELECT collation for ('foo' COLLATE "de_DE"); Requests to log the memory contexts of the backend with the specified process ID. This function can send the request to - backends and auxiliary processes except logger and statistics - collector. These memory contexts will be logged at + backends and auxiliary processes except logger. These memory contexts + will be logged at LOG message level. They will appear in the server log based on the log configuration set (See for more information), diff --git a/doc/src/sgml/glossary.sgml b/doc/src/sgml/glossary.sgml index 1835d0e65a..b187506d5e 100644 --- a/doc/src/sgml/glossary.sgml +++ b/doc/src/sgml/glossary.sgml @@ -136,9 +136,9 @@ The auxiliary processes consist of the autovacuum launcher (but not the autovacuum workers), @@ -146,7 +146,6 @@ the checkpointer, the logger, the startup process, - the statistics collector, the WAL archiver, the WAL receiver (but not the WAL senders), @@ -434,6 +433,21 @@ + + Cumulative Statistics System + + + A system which, if enabled, accumulates statistical information + about the instance's + activities. + + + For more information, see + . + + + + Data area @@ -1563,22 +1577,6 @@ - - Stats collector (process) - - - An auxiliary process - which, if enabled, receives statistical information - about the instance's - activities. - - - For more information, see - . - - - - System catalog diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml index 3247e05666..b0a653373d 100644 --- a/doc/src/sgml/high-availability.sgml +++ b/doc/src/sgml/high-availability.sgml @@ -2227,12 +2227,13 @@ HINT: You can then restart the server after making the necessary configuration - The statistics collector is active during recovery. All scans, reads, blocks, - index usage, etc., will be recorded normally on the standby. Replayed - actions will not duplicate their effects on primary, so replaying an - insert will not increment the Inserts column of pg_stat_user_tables. - The stats file is deleted at the start of recovery, so stats from primary - and standby will differ; this is considered a feature, not a bug. + The cumulative statistics system is active during recovery. All scans, + reads, blocks, index usage, etc., will be recorded normally on the + standby. However, WAL replay will not increment relation and database + specific counters. I.e. replay will not increment pg_stat_all_tables + columns (like n_tup_ins), nor will reads or writes performed by the + startup process be tracked in the pg_statio views, nor will associated + pg_stat_database columns be incremented. diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml index 2e09fee5ae..a209a63304 100644 --- a/doc/src/sgml/maintenance.sgml +++ b/doc/src/sgml/maintenance.sgml @@ -839,7 +839,7 @@ vacuum insert threshold = vacuum base insert threshold + vacuum insert scale fac it may be beneficial to lower the table's as this may allow tuples to be frozen by earlier vacuums. The number of obsolete tuples and - the number of inserted tuples are obtained from the statistics collector; + the number of inserted tuples are obtained from the cumulative statistics system; it is a semi-accurate count updated by each UPDATE, DELETE and INSERT operation. (It is only semi-accurate because some information might be lost under heavy diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 8717df060e..2f44113caa 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -22,7 +22,7 @@ Several tools are available for monitoring database activity and analyzing performance. Most of this chapter is devoted to describing - PostgreSQL's statistics collector, + PostgreSQL's cumulative statistics system, but one should not neglect regular Unix monitoring programs such as ps, top, iostat, and vmstat. Also, once one has identified a @@ -53,7 +53,6 @@ postgres 15554 0.0 0.0 57536 1184 ? Ss 18:02 0:00 postgres: back postgres 15555 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres: checkpointer postgres 15556 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres: walwriter postgres 15557 0.0 0.0 58504 2244 ? Ss 18:02 0:00 postgres: autovacuum launcher -postgres 15558 0.0 0.0 17512 1068 ? Ss 18:02 0:00 postgres: stats collector postgres 15582 0.0 0.0 58772 3080 ? Ss 18:04 0:00 postgres: joe runbug 127.0.0.1 idle postgres 15606 0.0 0.0 58772 3052 ? Ss 18:07 0:00 postgres: tgl regression [local] SELECT waiting postgres 15610 0.0 0.0 58772 3056 ? Ss 18:07 0:00 postgres: tgl regression [local] idle in transaction @@ -63,11 +62,10 @@ postgres 15610 0.0 0.0 58772 3056 ? Ss 18:07 0:00 postgres: tgl platforms, as do the details of what is shown. This example is from a recent Linux system.) The first process listed here is the primary server process. The command arguments - shown for it are the same ones used when it was launched. The next five + shown for it are the same ones used when it was launched. The next four processes are background worker processes automatically launched by the - primary process. (The stats collector process will not be present - if you have set the system not to start the statistics collector; likewise - the autovacuum launcher process can be disabled.) + primary process. (The autovacuum launcher process will not + be present if you have set the system not to run autovacuum.) Each of the remaining processes is a server process handling one client connection. Each such process sets its command line display in the form @@ -130,20 +128,20 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser - The Statistics Collector + The Cumulative Statistics System statistics - PostgreSQL's statistics collector - is a subsystem that supports collection and reporting of information about - server activity. Presently, the collector can count accesses to tables - and indexes in both disk-block and individual-row terms. It also tracks - the total number of rows in each table, and information about vacuum and - analyze actions for each table. It can also count calls to user-defined - functions and the total time spent in each one. + PostgreSQL's cumulative statistics + system supports collection and reporting of information about + server activity. Presently, accesses to tables and indexes in both + disk-block and individual-row terms are counted. The total number of rows + in each table, and information about vacuum and analyze actions for each + table are also counted. If enabled, calls to user-defined functions and + the total time spent in each one are counted as well. @@ -151,7 +149,7 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser information about exactly what is going on in the system right now, such as the exact command currently being executed by other server processes, and which other connections exist in the system. This facility is independent - of the collector process. + of the cumulative statistics system. @@ -172,7 +170,7 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser The parameter controls whether - statistics are collected about table and index accesses. + cumulative statistics are collected about table and index accesses. @@ -201,18 +199,15 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser - The statistics collector transmits the collected information to other - PostgreSQL processes through temporary files. - These files are stored in the directory named by the - parameter, - pg_stat_tmp by default. - For better performance, stats_temp_directory can be - pointed at a RAM-based file system, decreasing physical I/O requirements. - When the server shuts down cleanly, a permanent copy of the statistics - data is stored in the pg_stat subdirectory, so that - statistics can be retained across server restarts. When recovery is - performed at server start (e.g., after immediate shutdown, server crash, - and point-in-time recovery), all statistics counters are reset. + Cumulative statistics are collected in shared memory. Every + PostgreSQL process collects statistics locally + then updates the shared data at appropriate intervals. When a server, + including a physical replica, shuts down cleanly, a permanent copy of the + statistics data is stored in the pg_stat subdirectory, + so that statistics can be retained across server restarts. In contrast, + when starting from an unclean shutdown (e.g., after an immediate shutdown, + a server crash, starting from a base backup, and point-in-time recovery), + all statistics counters are reset. @@ -225,48 +220,58 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser linkend="monitoring-stats-dynamic-views-table"/>, are available to show the current state of the system. There are also several other views, listed in , available to show the results - of statistics collection. Alternatively, one can - build custom views using the underlying statistics functions, as discussed - in . + linkend="monitoring-stats-views-table"/>, available to show the accumulated + statistics. Alternatively, one can + build custom views using the underlying cumulative statistics functions, as + discussed in . - When using the statistics to monitor collected data, it is important - to realize that the information does not update instantaneously. - Each individual server process transmits new statistical counts to - the collector just before going idle; so a query or transaction still in - progress does not affect the displayed totals. Also, the collector itself - emits a new report at most once per PGSTAT_STAT_INTERVAL - milliseconds (500 ms unless altered while building the server). So the - displayed information lags behind actual activity. However, current-query - information collected by track_activities is - always up-to-date. + When using the cumulative statistics views and functions to monitor + collected data, it is important to realize that the information does not + update instantaneously. Each individual server process flushes out + accumulated statistics to shared memory just before going idle, but not + more frequently than once per PGSTAT_MIN_INTERVAL + milliseconds (1 second unless altered while building the server); so a + query or transaction still in progress does not affect the displayed totals + and the displayed information lags behind actual activity. However, + current-query information collected by track_activities + is always up-to-date. Another important point is that when a server process is asked to display - any of these statistics, it first fetches the most recent report emitted by - the collector process and then continues to use this snapshot for all - statistical views and functions until the end of its current transaction. - So the statistics will show static information as long as you continue the - current transaction. Similarly, information about the current queries of - all sessions is collected when any such information is first requested - within a transaction, and the same information will be displayed throughout - the transaction. - This is a feature, not a bug, because it allows you to perform several - queries on the statistics and correlate the results without worrying that - the numbers are changing underneath you. But if you want to see new - results with each query, be sure to do the queries outside any transaction - block. Alternatively, you can invoke - pg_stat_clear_snapshot(), which will discard the - current transaction's statistics snapshot (if any). The next use of - statistical information will cause a new snapshot to be fetched. + any of the accumulated statistics, accessed values are cached until the end + of its current transaction in the default configuration. So the statistics + will show static information as long as you continue the current + transaction. Similarly, information about the current queries of all + sessions is collected when any such information is first requested within a + transaction, and the same information will be displayed throughout the + transaction. This is a feature, not a bug, because it allows you to perform + several queries on the statistics and correlate the results without + worrying that the numbers are changing underneath you. + + When analyzing statistics interactively, or with expensive queries, the + time delta between accesses to individual statistics can lead to + significant skew in the cached statistics. To minimize skew, + stats_fetch_consistency can be set to + snapshot, at the price of increased memory usage for + caching not-needed statistics data. Conversely, if it's known that + statistics are only accessed once, caching accessed statistics is + unnecessary and can be avoided by setting + stats_fetch_consistency to none. + + You can invoke pg_stat_clear_snapshot() to discard the + current transaction's statistics snapshot or cached values (if any). The + next use of statistical information will (when in snapshot mode) cause a + new snapshot to be built or (when in cache mode) accessed statistics to be + cached. - A transaction can also see its own statistics (as yet untransmitted to the - collector) in the views pg_stat_xact_all_tables, + A transaction can also see its own statistics (not yet flushed out to the + shared memory statistics) in the views + pg_stat_xact_all_tables, pg_stat_xact_sys_tables, pg_stat_xact_user_tables, and pg_stat_xact_user_functions. These numbers do not act as @@ -663,7 +668,7 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser kernel's I/O cache, and might therefore still be fetched without requiring a physical read. Users interested in obtaining more detailed information on PostgreSQL I/O behavior are - advised to use the PostgreSQL statistics collector + advised to use the PostgreSQL statistics views in combination with operating system utilities that allow insight into the kernel's handling of I/O. @@ -5171,8 +5176,8 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i - Additional functions related to statistics collection are listed in . + Additional functions related to the cumulative statistics system are listed + in .
@@ -5228,7 +5233,10 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i Returns the timestamp of the current statistics snapshot, or NULL if - no statistics snapshot has been taken. + no statistics snapshot has been taken. A snapshot is taken the first + time cumulative statistics are accessed in a transaction if + stats_fetch_consistency is set to + snapshot @@ -5241,7 +5249,7 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i void - Discards the current statistics snapshot. + Discards the current statistics snapshot or cached information. @@ -6405,8 +6413,8 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid, VACUUM is performing final cleanup. During this phase, VACUUM will vacuum the free space map, update statistics - in pg_class, and report statistics to the statistics - collector. When this phase is completed, VACUUM will end. + in pg_class, and report statistics to the cumulative + statistics system. When this phase is completed, VACUUM will end. diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml index 723b2a1a66..c946755737 100644 --- a/doc/src/sgml/ref/pg_dump.sgml +++ b/doc/src/sgml/ref/pg_dump.sgml @@ -1329,7 +1329,7 @@ PostgreSQL documentation The database activity of pg_dump is - normally collected by the statistics collector. If this is + normally collected by the cumulative statistics system. If this is undesirable, you can set parameter track_counts to false via PGOPTIONS or the ALTER USER command. From 708007dced2b05ed9b4f1963e91b2eb67413bd19 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 8 Apr 2022 07:41:09 +0200 Subject: [PATCH 453/772] Remove error message hints mentioning configure options These are usually not useful since users will use packaged distributions and won't be interested in rebuilding their installation from source. Also, we have only used these kinds of hints for some features and in some places, not consistently throughout. Reviewed-by: Andres Freund Reviewed-by: Daniel Gustafsson Reviewed-by: Tom Lane Discussion: https://www.postgresql.org/message-id/flat/2552aed7-d0e9-280a-54aa-2dc7073f371d%40enterprisedb.com --- src/backend/access/common/toast_compression.c | 3 +- src/backend/libpq/hba.c | 2 - src/backend/utils/adt/pg_locale.c | 6 +- src/backend/utils/adt/xml.c | 3 +- src/bin/initdb/initdb.c | 1 - src/test/regress/expected/compression_1.out | 5 - src/test/regress/expected/xml_1.out | 163 ------------------ src/test/regress/expected/xmlmap_1.out | 28 --- 8 files changed, 4 insertions(+), 207 deletions(-) diff --git a/src/backend/access/common/toast_compression.c b/src/backend/access/common/toast_compression.c index 8a81ff4c0c..f90f9f11e3 100644 --- a/src/backend/access/common/toast_compression.c +++ b/src/backend/access/common/toast_compression.c @@ -30,8 +30,7 @@ int default_toast_compression = TOAST_PGLZ_COMPRESSION; ereport(ERROR, \ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), \ errmsg("compression method lz4 not supported"), \ - errdetail("This functionality requires the server to be built with lz4 support."), \ - errhint("You need to rebuild PostgreSQL using %s.", "--with-lz4"))) + errdetail("This functionality requires the server to be built with lz4 support."))) /* * Compress a varlena using PGLZ. diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index f8393ca8ed..cbd17b790d 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -1010,7 +1010,6 @@ parse_hba_line(TokenizedAuthLine *tok_line, int elevel) ereport(elevel, (errcode(ERRCODE_CONFIG_FILE_ERROR), errmsg("hostssl record cannot match because SSL is not supported by this build"), - errhint("Compile with --with-ssl to use SSL connections."), errcontext("line %d of configuration file \"%s\"", line_num, HbaFileName))); *err_msg = "hostssl record cannot match because SSL is not supported by this build"; @@ -1023,7 +1022,6 @@ parse_hba_line(TokenizedAuthLine *tok_line, int elevel) ereport(elevel, (errcode(ERRCODE_CONFIG_FILE_ERROR), errmsg("hostgssenc record cannot match because GSSAPI is not supported by this build"), - errhint("Compile with --with-gssapi to use GSSAPI connections."), errcontext("line %d of configuration file \"%s\"", line_num, HbaFileName))); *err_msg = "hostgssenc record cannot match because GSSAPI is not supported by this build"; diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index c84fdd8525..12603b727c 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -1462,8 +1462,7 @@ make_icu_collator(const char *iculocstr, /* could get here if a collation was created by a build with ICU */ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("ICU is not supported in this build"), \ - errhint("You need to rebuild PostgreSQL using %s.", "--with-icu"))); + errmsg("ICU is not supported in this build"))); #endif /* not USE_ICU */ } @@ -2008,8 +2007,7 @@ check_icu_locale(const char *icu_locale) #else ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("ICU is not supported in this build"), \ - errhint("You need to rebuild PostgreSQL using %s.", "--with-icu"))); + errmsg("ICU is not supported in this build"))); #endif } diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 801ad8fa4e..1ec6f1c2fd 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -220,8 +220,7 @@ const TableFuncRoutine XmlTableRoutine = ereport(ERROR, \ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), \ errmsg("unsupported XML feature"), \ - errdetail("This functionality requires the server to be built with libxml support."), \ - errhint("You need to rebuild PostgreSQL using %s.", "--with-libxml"))) + errdetail("This functionality requires the server to be built with libxml support."))) /* from SQL/XML:2008 section 4.9 */ diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 9dd4a8de9a..bbca1236d9 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -2214,7 +2214,6 @@ setlocales(void) */ #ifndef USE_ICU pg_log_error("ICU is not supported in this build"); - fprintf(stderr, _("You need to rebuild PostgreSQL using %s.\n"), "--with-icu"); exit(1); #endif } diff --git a/src/test/regress/expected/compression_1.out b/src/test/regress/expected/compression_1.out index 1ce2962d55..c0a47646eb 100644 --- a/src/test/regress/expected/compression_1.out +++ b/src/test/regress/expected/compression_1.out @@ -16,7 +16,6 @@ Indexes: CREATE TABLE cmdata1(f1 TEXT COMPRESSION lz4); ERROR: compression method lz4 not supported DETAIL: This functionality requires the server to be built with lz4 support. -HINT: You need to rebuild PostgreSQL using --with-lz4. INSERT INTO cmdata1 VALUES(repeat('1234567890', 1004)); ERROR: relation "cmdata1" does not exist LINE 1: INSERT INTO cmdata1 VALUES(repeat('1234567890', 1004)); @@ -195,7 +194,6 @@ LINE 1: SELECT pg_column_compression(x) FROM compressmv; CREATE TABLE cmpart(f1 text COMPRESSION lz4) PARTITION BY HASH(f1); ERROR: compression method lz4 not supported DETAIL: This functionality requires the server to be built with lz4 support. -HINT: You need to rebuild PostgreSQL using --with-lz4. CREATE TABLE cmpart1 PARTITION OF cmpart FOR VALUES WITH (MODULUS 2, REMAINDER 0); ERROR: relation "cmpart" does not exist CREATE TABLE cmpart2(f1 text COMPRESSION pglz); @@ -240,7 +238,6 @@ SET default_toast_compression = 'pglz'; ALTER TABLE cmdata ALTER COLUMN f1 SET COMPRESSION lz4; ERROR: compression method lz4 not supported DETAIL: This functionality requires the server to be built with lz4 support. -HINT: You need to rebuild PostgreSQL using --with-lz4. INSERT INTO cmdata VALUES (repeat('123456789', 4004)); \d+ cmdata Table "public.cmdata" @@ -274,7 +271,6 @@ ERROR: relation "cmpart1" does not exist ALTER TABLE cmpart2 ALTER COLUMN f1 SET COMPRESSION lz4; ERROR: compression method lz4 not supported DETAIL: This functionality requires the server to be built with lz4 support. -HINT: You need to rebuild PostgreSQL using --with-lz4. -- new data should be compressed with the current compression method INSERT INTO cmpart VALUES (repeat('123456789', 1004)); ERROR: relation "cmpart" does not exist @@ -314,7 +310,6 @@ DROP TABLE cmdata2; CREATE TABLE cmdata2 (f1 TEXT COMPRESSION pglz, f2 TEXT COMPRESSION lz4); ERROR: compression method lz4 not supported DETAIL: This functionality requires the server to be built with lz4 support. -HINT: You need to rebuild PostgreSQL using --with-lz4. CREATE UNIQUE INDEX idx1 ON cmdata2 ((f1 || f2)); ERROR: relation "cmdata2" does not exist INSERT INTO cmdata2 VALUES((SELECT array_agg(md5(g::TEXT))::TEXT FROM diff --git a/src/test/regress/expected/xml_1.out b/src/test/regress/expected/xml_1.out index ec6457875f..9aadc89a89 100644 --- a/src/test/regress/expected/xml_1.out +++ b/src/test/regress/expected/xml_1.out @@ -7,19 +7,16 @@ ERROR: unsupported XML feature LINE 1: INSERT INTO xmltest VALUES (1, 'one'); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. INSERT INTO xmltest VALUES (2, 'two'); ERROR: unsupported XML feature LINE 1: INSERT INTO xmltest VALUES (2, 'two'); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. INSERT INTO xmltest VALUES (3, '', NULL, ''); ERROR: unsupported XML feature LINE 1: SELECT xmlconcat('', NULL, '', NULL, ''); ERROR: unsupported XML feature LINE 1: SELECT xmlconcat('', NULL, 'r'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlelement(name foo, xml 'br'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlelement(name foo, array[1, 2, 3]); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SET xmlbinary TO base64; SELECT xmlelement(name foo, bytea 'bar'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SET xmlbinary TO hex; SELECT xmlelement(name foo, bytea 'bar'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlelement(name foo, xmlattributes(true as bar)); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar)); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar)); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'br' as funnier)); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(content ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(content ' '); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(content 'abc'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(content 'x'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(content '&'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(content '&idontexist;'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(content ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(content ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(content '&idontexist;'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(content ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(document ' '); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(document 'abc'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(document 'x'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(document '&'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(document '&idontexist;'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(document ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(document ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(document '&idontexist;'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlparse(document ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlpi(name foo); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlpi(name xml); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlpi(name xmlstuff); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlpi(name foo, 'bar'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlpi(name foo, 'in?>valid'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlpi(name foo, null); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlpi(name xml, null); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlpi(name xmlstuff, null); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlpi(name "xml-stylesheet", 'href="https://github.com/mystyle.css" type="text/css"'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlpi(name foo, ' bar'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlroot(xml '', version no value, standalone no value); ERROR: unsupported XML feature LINE 1: SELECT xmlroot(xml '', version no value, standalone no... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlroot(xml '', version '2.0'); ERROR: unsupported XML feature LINE 1: SELECT xmlroot(xml '', version '2.0'); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlroot(xml '', version no value, standalone yes); ERROR: unsupported XML feature LINE 1: SELECT xmlroot(xml '', version no value, standalone ye... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlroot(xml '', version no value, standalone yes); ERROR: unsupported XML feature LINE 1: SELECT xmlroot(xml '', version no... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlroot(xmlroot(xml '', version '1.0'), version '1.1', standalone no); ERROR: unsupported XML feature LINE 1: SELECT xmlroot(xmlroot(xml '', version '1.0'), version... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlroot('', version no value, standalone no); ERROR: unsupported XML feature LINE 1: SELECT xmlroot('... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlroot('', version no value, standalone no value); ERROR: unsupported XML feature LINE 1: SELECT xmlroot('... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlroot('', version no value); ERROR: unsupported XML feature LINE 1: SELECT xmlroot('... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlroot ( xmlelement ( name gazonk, @@ -345,7 +278,6 @@ SELECT xmlroot ( ); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlserialize(content data as character varying(20)) FROM xmltest; xmlserialize -------------- @@ -356,43 +288,36 @@ ERROR: unsupported XML feature LINE 1: SELECT xmlserialize(content 'good' as char(10)); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlserialize(document 'bad' as text); ERROR: unsupported XML feature LINE 1: SELECT xmlserialize(document 'bad' as text); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xml 'bar' IS DOCUMENT; ERROR: unsupported XML feature LINE 1: SELECT xml 'bar' IS DOCUMENT; ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xml 'barfoo' IS DOCUMENT; ERROR: unsupported XML feature LINE 1: SELECT xml 'barfoo' IS DOCUMENT; ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xml '' IS NOT DOCUMENT; ERROR: unsupported XML feature LINE 1: SELECT xml '' IS NOT DOCUMENT; ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xml 'abc' IS NOT DOCUMENT; ERROR: unsupported XML feature LINE 1: SELECT xml 'abc' IS NOT DOCUMENT; ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT '<>' IS NOT DOCUMENT; ERROR: unsupported XML feature LINE 1: SELECT '<>' IS NOT DOCUMENT; ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlagg(data) FROM xmltest; xmlagg -------- @@ -408,22 +333,18 @@ SELECT xmlagg(data) FROM xmltest WHERE id > 10; SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM emp; ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. -- Check mapping SQL identifier to XML name SELECT xmlpi(name ":::_xml_abc135.%-&_"); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmlpi(name "123"); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. PREPARE foo (xml) AS SELECT xmlconcat('', $1); ERROR: unsupported XML feature LINE 1: PREPARE foo (xml) AS SELECT xmlconcat('', $1); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SET XML OPTION DOCUMENT; EXECUTE foo (''); ERROR: prepared statement "foo" does not exist @@ -434,7 +355,6 @@ ERROR: unsupported XML feature LINE 1: SELECT xml ''; ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SET XML OPTION CONTENT; EXECUTE foo (''); ERROR: prepared statement "foo" does not exist @@ -445,37 +365,31 @@ ERROR: unsupported XML feature LINE 1: SELECT xml ' '; ERROR: unsupported XML feature LINE 1: SELECT xml ' '; ERROR: unsupported XML feature LINE 1: SELECT xml ''; ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xml ' oops '; ERROR: unsupported XML feature LINE 1: SELECT xml ' oops '; ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xml ' '; ERROR: unsupported XML feature LINE 1: SELECT xml ' '; ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xml ''; ERROR: unsupported XML feature LINE 1: SELECT xml ''; ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. -- Test backwards parsing CREATE VIEW xmlview1 AS SELECT xmlcomment('test'); CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); @@ -483,38 +397,31 @@ ERROR: unsupported XML feature LINE 1: CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. CREATE VIEW xmlview5 AS SELECT xmlparse(content 'x'); CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. CREATE VIEW xmlview7 AS SELECT xmlroot(xml '', version no value, standalone yes); ERROR: unsupported XML feature LINE 1: CREATE VIEW xmlview7 AS SELECT xmlroot(xml '', version... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); ERROR: unsupported XML feature LINE 1: ...EATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as ... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); ERROR: unsupported XML feature LINE 1: ...EATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as ... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_name, view_definition FROM information_schema.views WHERE table_name LIKE 'xmlview%' ORDER BY 1; table_name | view_definition @@ -539,91 +446,76 @@ ERROR: unsupported XML feature LINE 1: SELECT xpath('', ''); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xpath('//text()', 'number one'); ERROR: unsupported XML feature LINE 1: SELECT xpath('//text()', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1/']]); ERROR: unsupported XML feature LINE 1: SELECT xpath('//loc:piece/@id', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1/']]); ERROR: unsupported XML feature LINE 1: SELECT xpath('//loc:piece', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1/']]); ERROR: unsupported XML feature LINE 1: SELECT xpath('//loc:piece', ''); ERROR: unsupported XML feature LINE 1: SELECT xpath('//@value', ''); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xpath('''<>''', ''); ERROR: unsupported XML feature LINE 1: SELECT xpath('''<>''', ''); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xpath('count(//*)', ''); ERROR: unsupported XML feature LINE 1: SELECT xpath('count(//*)', ''); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xpath('count(//*)=0', ''); ERROR: unsupported XML feature LINE 1: SELECT xpath('count(//*)=0', ''); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xpath('count(//*)=3', ''); ERROR: unsupported XML feature LINE 1: SELECT xpath('count(//*)=3', ''); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xpath('name(/*)', ''); ERROR: unsupported XML feature LINE 1: SELECT xpath('name(/*)', ''); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xpath('/nosuchtag', ''); ERROR: unsupported XML feature LINE 1: SELECT xpath('/nosuchtag', ''); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xpath('root', ''); ERROR: unsupported XML feature LINE 1: SELECT xpath('root', ''); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. -- Round-trip non-ASCII data through xpath(). DO $$ DECLARE @@ -665,61 +557,51 @@ ERROR: unsupported XML feature LINE 1: ...sts('//town[text() = ''Toronto'']' PASSING BY REF 'Bidford-on-AvonCwmbranBristol'); ERROR: unsupported XML feature LINE 1: ...sts('//town[text() = ''Cwmbran'']' PASSING BY REF ''); ERROR: unsupported XML feature LINE 1: ...LECT xmlexists('count(/nosuchtag)' PASSING BY REF '')... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xpath_exists('//town[text() = ''Toronto'']','Bidford-on-AvonCwmbranBristol'::xml); ERROR: unsupported XML feature LINE 1: ...ELECT xpath_exists('//town[text() = ''Toronto'']','Bidford-on-AvonCwmbranBristol'::xml); ERROR: unsupported XML feature LINE 1: ...ELECT xpath_exists('//town[text() = ''Cwmbran'']',''::xml); ERROR: unsupported XML feature LINE 1: SELECT xpath_exists('count(/nosuchtag)', ''::xml); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. INSERT INTO xmltest VALUES (4, 'BudvarfreeCarlinglots'::xml); ERROR: unsupported XML feature LINE 1: INSERT INTO xmltest VALUES (4, 'BudvarMolsonfreeCarlinglots'::xml); ERROR: unsupported XML feature LINE 1: INSERT INTO xmltest VALUES (5, 'MolsonBudvarfreeCarlinglots'::xml); ERROR: unsupported XML feature LINE 1: INSERT INTO xmltest VALUES (6, 'MolsonfreeCarlinglots'::xml); ERROR: unsupported XML feature LINE 1: INSERT INTO xmltest VALUES (7, 'number one'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xml_is_well_formed('bar'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xml_is_well_formed('bar'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xml_is_well_formed('&'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xml_is_well_formed('&idontexist;'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xml_is_well_formed(''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xml_is_well_formed(''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xml_is_well_formed('&idontexist;'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SET xmloption TO CONTENT; SELECT xml_is_well_formed('abc'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. -- Since xpath() deals with namespaces, it's a bit stricter about -- what's well-formed and what's not. If we don't obey these rules -- (i.e. ignore namespace-related errors from libxml), xpath() @@ -887,7 +750,6 @@ ERROR: unsupported XML feature LINE 1: SELECT xpath('/*', ''); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. -- XPath deprecates relative namespaces, but they're not supposed to -- throw an error, only a warning. SELECT xpath('/*', ''); @@ -895,21 +757,17 @@ ERROR: unsupported XML feature LINE 1: SELECT xpath('/*', ''); ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. -- External entity references should not leak filesystem information. SELECT XMLPARSE(DOCUMENT ']>&c;'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT XMLPARSE(DOCUMENT ']>&c;'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. -- This might or might not load the requested DTD, but it mustn't throw error. SELECT XMLPARSE(DOCUMENT ' '); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. -- XMLPATH tests CREATE TABLE xmldata(data xml); INSERT INTO xmldata VALUES(' @@ -948,7 +806,6 @@ ERROR: unsupported XML feature LINE 1: INSERT INTO xmldata VALUES(' ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. -- XMLTABLE with columns SELECT xmltable.* FROM (SELECT data FROM xmldata) x, @@ -1025,7 +882,6 @@ ERROR: unsupported XML feature LINE 3: PASSING '10' @@ -1034,7 +890,6 @@ ERROR: unsupported XML feature LINE 3: PASSING '' COLUMNS a text PATH 'foo/namespace::node()'); @@ -1055,7 +909,6 @@ ERROR: unsupported XML feature LINE 2: PASSING '' ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. -- used in prepare statements PREPARE pp AS SELECT xmltable.* @@ -1115,33 +968,28 @@ ERROR: unsupported XML feature LINE 1: SELECT * FROM xmltable('/root' passing 'a1aa1aa2a bbbbxxxcccc' COLUMNS element text PATH 'element/text()'); -- should fail ERROR: unsupported XML feature LINE 1: SELECT * FROM xmltable('/root' passing 'a1a &"<>!foo]]>2' columns c text); ERROR: unsupported XML feature LINE 1: select * from xmltable('d/r' passing ''"&<>' COLUMNS ent text); ERROR: unsupported XML feature LINE 1: SELECT * FROM xmltable('/x/a' PASSING '''"&<>' COLUMNS ent xml); ERROR: unsupported XML feature LINE 1: SELECT * FROM xmltable('/x/a' PASSING '' ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. INSERT INTO xmldata VALUES(' EG @@ -1225,7 +1072,6 @@ ERROR: unsupported XML feature LINE 1: INSERT INTO xmldata VALUES(' ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmltable.* FROM (SELECT data FROM xmldata) x, LATERAL XMLTABLE('/ROWS/ROW' @@ -1327,7 +1173,6 @@ WITH EXCEPT SELECT * FROM x; ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. -- multi line xml test, result should be empty too WITH x AS (SELECT proname, proowner, procost::numeric, pronargs, @@ -1352,32 +1197,27 @@ WITH EXCEPT SELECT * FROM x; ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. CREATE TABLE xmltest2(x xml, _path text); INSERT INTO xmltest2 VALUES('1', 'A'); ERROR: unsupported XML feature LINE 1: INSERT INTO xmltest2 VALUES('1', 'A')... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. INSERT INTO xmltest2 VALUES('2', 'B'); ERROR: unsupported XML feature LINE 1: INSERT INTO xmltest2 VALUES('2', 'B')... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. INSERT INTO xmltest2 VALUES('3', 'C'); ERROR: unsupported XML feature LINE 1: INSERT INTO xmltest2 VALUES('3', 'C')... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. INSERT INTO xmltest2 VALUES('2', 'D'); ERROR: unsupported XML feature LINE 1: INSERT INTO xmltest2 VALUES('2', 'D')... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT xmltable.* FROM xmltest2, LATERAL xmltable('/d/r' PASSING x COLUMNS a int PATH '' || lower(_path) || 'c'); a --- @@ -1399,16 +1239,13 @@ ERROR: unsupported XML feature LINE 1: SELECT * FROM XMLTABLE('*' PASSING 'a' COLUMNS a xml ... ^ DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. \x SELECT * FROM XMLTABLE('*' PASSING 'pre&deeppost' COLUMNS x xml PATH 'node()', y xml PATH '/'); ERROR: unsupported XML feature LINE 1: SELECT * FROM XMLTABLE('*' PASSING 'pre"', b xml PATH '""'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. diff --git a/src/test/regress/expected/xmlmap_1.out b/src/test/regress/expected/xmlmap_1.out index 4504acd377..05c5d3eb8a 100644 --- a/src/test/regress/expected/xmlmap_1.out +++ b/src/test/regress/expected/xmlmap_1.out @@ -14,109 +14,83 @@ INSERT INTO testxmlschema.test2 VALUES (55, 'abc', 'def', SELECT table_to_xml('testxmlschema.test1', false, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_to_xml('testxmlschema.test1', true, false, 'foo'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_to_xml('testxmlschema.test1', false, true, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_to_xml('testxmlschema.test1', true, true, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_to_xml('testxmlschema.test2', false, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_to_xmlschema('testxmlschema.test1', false, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_to_xmlschema('testxmlschema.test1', true, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_to_xmlschema('testxmlschema.test1', false, true, 'foo'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_to_xmlschema('testxmlschema.test1', true, true, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_to_xmlschema('testxmlschema.test2', false, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_to_xml_and_xmlschema('testxmlschema.test1', false, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_to_xml_and_xmlschema('testxmlschema.test1', true, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_to_xml_and_xmlschema('testxmlschema.test1', false, true, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_to_xml_and_xmlschema('testxmlschema.test1', true, true, 'foo'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT query_to_xml('SELECT * FROM testxmlschema.test1', false, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT query_to_xmlschema('SELECT * FROM testxmlschema.test1', false, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT query_to_xml_and_xmlschema('SELECT * FROM testxmlschema.test1', true, true, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. DECLARE xc CURSOR WITH HOLD FOR SELECT * FROM testxmlschema.test1 ORDER BY 1, 2; SELECT cursor_to_xml('xc'::refcursor, 5, false, true, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT cursor_to_xmlschema('xc'::refcursor, false, true, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. MOVE BACKWARD ALL IN xc; SELECT cursor_to_xml('xc'::refcursor, 5, true, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT cursor_to_xmlschema('xc'::refcursor, true, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT schema_to_xml('testxmlschema', false, true, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT schema_to_xml('testxmlschema', true, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT schema_to_xmlschema('testxmlschema', false, true, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT schema_to_xmlschema('testxmlschema', true, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT schema_to_xml_and_xmlschema('testxmlschema', true, true, 'foo'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. -- test that domains are transformed like their base types CREATE DOMAIN testboolxmldomain AS bool; CREATE DOMAIN testdatexmldomain AS date; @@ -128,8 +102,6 @@ CREATE TABLE testxmlschema.test3 SELECT xmlforest(c1, c2, c3, c4) FROM testxmlschema.test3; ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. SELECT table_to_xml('testxmlschema.test3', true, true, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. -HINT: You need to rebuild PostgreSQL using --with-libxml. From 2258e76f90bf0254504644df0515cddc0c0a87f9 Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Fri, 8 Apr 2022 00:02:10 -0700 Subject: [PATCH 454/772] Add contrib/pg_walinspect. Provides similar functionality to pg_waldump, but from a SQL interface rather than a separate utility. Author: Bharath Rupireddy Reviewed-by: Greg Stark, Kyotaro Horiguchi, Andres Freund, Ashutosh Sharma, Nitin Jadhav, RKN Sai Krishna Discussion: https://postgr.es/m/CALj2ACUGUYXsEQdKhEdsBzhGEyF3xggvLdD8C0VT72TNEfOiog%40mail.gmail.com --- contrib/Makefile | 1 + contrib/pg_walinspect/.gitignore | 4 + contrib/pg_walinspect/Makefile | 23 + .../pg_walinspect/expected/pg_walinspect.out | 165 +++++ contrib/pg_walinspect/pg_walinspect--1.0.sql | 118 ++++ contrib/pg_walinspect/pg_walinspect.c | 629 ++++++++++++++++++ contrib/pg_walinspect/pg_walinspect.control | 5 + contrib/pg_walinspect/sql/pg_walinspect.sql | 120 ++++ doc/src/sgml/contrib.sgml | 1 + doc/src/sgml/filelist.sgml | 1 + doc/src/sgml/func.sgml | 2 +- doc/src/sgml/pgwalinspect.sgml | 275 ++++++++ src/backend/access/rmgrdesc/xlogdesc.c | 130 ++++ src/backend/access/transam/Makefile | 1 + src/backend/access/transam/xlogreader.c | 9 - src/backend/access/transam/xlogstats.c | 93 +++ src/backend/access/transam/xlogutils.c | 33 + src/bin/pg_waldump/.gitignore | 1 + src/bin/pg_waldump/Makefile | 8 +- src/bin/pg_waldump/pg_waldump.c | 206 +----- src/include/access/xlog.h | 2 +- src/include/access/xlog_internal.h | 6 +- src/include/access/xlogreader.h | 2 - src/include/access/xlogstats.h | 40 ++ src/include/access/xlogutils.h | 4 + 25 files changed, 1675 insertions(+), 204 deletions(-) create mode 100644 contrib/pg_walinspect/.gitignore create mode 100644 contrib/pg_walinspect/Makefile create mode 100644 contrib/pg_walinspect/expected/pg_walinspect.out create mode 100644 contrib/pg_walinspect/pg_walinspect--1.0.sql create mode 100644 contrib/pg_walinspect/pg_walinspect.c create mode 100644 contrib/pg_walinspect/pg_walinspect.control create mode 100644 contrib/pg_walinspect/sql/pg_walinspect.sql create mode 100644 doc/src/sgml/pgwalinspect.sgml create mode 100644 src/backend/access/transam/xlogstats.c create mode 100644 src/include/access/xlogstats.h diff --git a/contrib/Makefile b/contrib/Makefile index 332b486ecc..bbf220407b 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -41,6 +41,7 @@ SUBDIRS = \ pgrowlocks \ pgstattuple \ pg_visibility \ + pg_walinspect \ postgres_fdw \ seg \ spi \ diff --git a/contrib/pg_walinspect/.gitignore b/contrib/pg_walinspect/.gitignore new file mode 100644 index 0000000000..5dcb3ff972 --- /dev/null +++ b/contrib/pg_walinspect/.gitignore @@ -0,0 +1,4 @@ +# Generated subdirectories +/log/ +/results/ +/tmp_check/ diff --git a/contrib/pg_walinspect/Makefile b/contrib/pg_walinspect/Makefile new file mode 100644 index 0000000000..350845cd43 --- /dev/null +++ b/contrib/pg_walinspect/Makefile @@ -0,0 +1,23 @@ +# contrib/pg_walinspect/Makefile + +MODULE_big = pg_walinspect +OBJS = \ + $(WIN32RES) \ + pg_walinspect.o +PGFILEDESC = "pg_walinspect - functions to inspect contents of PostgreSQL Write-Ahead Log" + +EXTENSION = pg_walinspect +DATA = pg_walinspect--1.0.sql + +REGRESS = pg_walinspect + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = contrib/pg_walinspect +top_builddir = ../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/contrib/pg_walinspect/expected/pg_walinspect.out b/contrib/pg_walinspect/expected/pg_walinspect.out new file mode 100644 index 0000000000..634b1bb739 --- /dev/null +++ b/contrib/pg_walinspect/expected/pg_walinspect.out @@ -0,0 +1,165 @@ +CREATE EXTENSION pg_walinspect; +CREATE TABLE sample_tbl(col1 int, col2 int); +-- Make sure checkpoints don't interfere with the test. +SELECT lsn as wal_lsn1 FROM + pg_create_physical_replication_slot('regress_pg_walinspect_slot', true, false) + \gset +INSERT INTO sample_tbl SELECT * FROM generate_series(1, 2); +SELECT pg_current_wal_lsn() AS wal_lsn2 \gset +INSERT INTO sample_tbl SELECT * FROM generate_series(1, 2); +-- =================================================================== +-- Tests for input validation +-- =================================================================== +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_records_info(:'wal_lsn2', :'wal_lsn1'); -- ERROR +ERROR: WAL start LSN must be less than end LSN +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_stats(:'wal_lsn2', :'wal_lsn1'); -- ERROR +ERROR: WAL start LSN must be less than end LSN +-- =================================================================== +-- Tests for all function executions +-- =================================================================== +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_record_info(:'wal_lsn1'); + ok +---- + t +(1 row) + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_records_info(:'wal_lsn1', :'wal_lsn2'); + ok +---- + t +(1 row) + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_records_info_till_end_of_wal(:'wal_lsn1'); + ok +---- + t +(1 row) + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_stats(:'wal_lsn1', :'wal_lsn2'); + ok +---- + t +(1 row) + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_stats_till_end_of_wal(:'wal_lsn1'); + ok +---- + t +(1 row) + +-- =================================================================== +-- Test for filtering out WAL records of a particular table +-- =================================================================== +SELECT oid AS sample_tbl_oid FROM pg_class WHERE relname = 'sample_tbl' \gset +SELECT COUNT(*) >= 1 AS ok FROM pg_get_wal_records_info(:'wal_lsn1', :'wal_lsn2') + WHERE block_ref LIKE concat('%', :'sample_tbl_oid', '%') AND resource_manager = 'Heap'; + ok +---- + t +(1 row) + +-- =================================================================== +-- Test for filtering out WAL records based on resource_manager and +-- record_type +-- =================================================================== +SELECT COUNT(*) >= 1 AS ok FROM pg_get_wal_records_info(:'wal_lsn1', :'wal_lsn2') + WHERE resource_manager = 'Heap' AND record_type = 'INSERT'; + ok +---- + t +(1 row) + +-- =================================================================== +-- Tests for permissions +-- =================================================================== +CREATE ROLE regress_pg_walinspect; +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_record_info(pg_lsn)', 'EXECUTE'); -- no + has_function_privilege +------------------------ + f +(1 row) + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_records_info(pg_lsn, pg_lsn) ', 'EXECUTE'); -- no + has_function_privilege +------------------------ + f +(1 row) + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_stats(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- no + has_function_privilege +------------------------ + f +(1 row) + +-- Functions accessible by users with role pg_read_server_files +GRANT pg_read_server_files TO regress_pg_walinspect; +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_record_info(pg_lsn)', 'EXECUTE'); -- yes + has_function_privilege +------------------------ + t +(1 row) + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_records_info(pg_lsn, pg_lsn) ', 'EXECUTE'); -- yes + has_function_privilege +------------------------ + t +(1 row) + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_stats(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- yes + has_function_privilege +------------------------ + t +(1 row) + +REVOKE pg_read_server_files FROM regress_pg_walinspect; +-- Superuser can grant execute to other users +GRANT EXECUTE ON FUNCTION pg_get_wal_record_info(pg_lsn) + TO regress_pg_walinspect; +GRANT EXECUTE ON FUNCTION pg_get_wal_records_info(pg_lsn, pg_lsn) + TO regress_pg_walinspect; +GRANT EXECUTE ON FUNCTION pg_get_wal_stats(pg_lsn, pg_lsn, boolean) + TO regress_pg_walinspect; +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_record_info(pg_lsn)', 'EXECUTE'); -- yes + has_function_privilege +------------------------ + t +(1 row) + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_records_info(pg_lsn, pg_lsn) ', 'EXECUTE'); -- yes + has_function_privilege +------------------------ + t +(1 row) + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_stats(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- yes + has_function_privilege +------------------------ + t +(1 row) + +REVOKE EXECUTE ON FUNCTION pg_get_wal_record_info(pg_lsn) + FROM regress_pg_walinspect; +REVOKE EXECUTE ON FUNCTION pg_get_wal_records_info(pg_lsn, pg_lsn) + FROM regress_pg_walinspect; +REVOKE EXECUTE ON FUNCTION pg_get_wal_stats(pg_lsn, pg_lsn, boolean) + FROM regress_pg_walinspect; +-- =================================================================== +-- Clean up +-- =================================================================== +DROP ROLE regress_pg_walinspect; +SELECT pg_drop_replication_slot('regress_pg_walinspect_slot'); + pg_drop_replication_slot +-------------------------- + +(1 row) + +DROP TABLE sample_tbl; diff --git a/contrib/pg_walinspect/pg_walinspect--1.0.sql b/contrib/pg_walinspect/pg_walinspect--1.0.sql new file mode 100644 index 0000000000..4243516d8a --- /dev/null +++ b/contrib/pg_walinspect/pg_walinspect--1.0.sql @@ -0,0 +1,118 @@ +/* contrib/pg_walinspect/pg_walinspect--1.0.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION pg_walinspect" to load this file. \quit + +-- +-- pg_get_wal_record_info() +-- +CREATE FUNCTION pg_get_wal_record_info(IN in_lsn pg_lsn, + OUT start_lsn pg_lsn, + OUT end_lsn pg_lsn, + OUT prev_lsn pg_lsn, + OUT xid xid, + OUT resource_manager text, + OUT record_type text, + OUT record_length int4, + OUT main_data_length int4, + OUT fpi_length int4, + OUT description text, + OUT block_ref text +) +AS 'MODULE_PATHNAME', 'pg_get_wal_record_info' +LANGUAGE C STRICT PARALLEL SAFE; + +REVOKE EXECUTE ON FUNCTION pg_get_wal_record_info(pg_lsn) FROM PUBLIC; +GRANT EXECUTE ON FUNCTION pg_get_wal_record_info(pg_lsn) TO pg_read_server_files; + +-- +-- pg_get_wal_records_info() +-- +CREATE FUNCTION pg_get_wal_records_info(IN start_lsn pg_lsn, + IN end_lsn pg_lsn, + OUT start_lsn pg_lsn, + OUT end_lsn pg_lsn, + OUT prev_lsn pg_lsn, + OUT xid xid, + OUT resource_manager text, + OUT record_type text, + OUT record_length int4, + OUT main_data_length int4, + OUT fpi_length int4, + OUT description text, + OUT block_ref text +) +RETURNS SETOF record +AS 'MODULE_PATHNAME', 'pg_get_wal_records_info' +LANGUAGE C STRICT PARALLEL SAFE; + +REVOKE EXECUTE ON FUNCTION pg_get_wal_records_info(pg_lsn, pg_lsn) FROM PUBLIC; +GRANT EXECUTE ON FUNCTION pg_get_wal_records_info(pg_lsn, pg_lsn) TO pg_read_server_files; + +-- +-- pg_get_wal_records_info_till_end_of_wal() +-- +CREATE FUNCTION pg_get_wal_records_info_till_end_of_wal(IN start_lsn pg_lsn, + OUT start_lsn pg_lsn, + OUT end_lsn pg_lsn, + OUT prev_lsn pg_lsn, + OUT xid xid, + OUT resource_manager text, + OUT record_type text, + OUT record_length int4, + OUT main_data_length int4, + OUT fpi_length int4, + OUT description text, + OUT block_ref text +) +RETURNS SETOF record +AS 'MODULE_PATHNAME', 'pg_get_wal_records_info_till_end_of_wal' +LANGUAGE C STRICT PARALLEL SAFE; + +REVOKE EXECUTE ON FUNCTION pg_get_wal_records_info_till_end_of_wal(pg_lsn) FROM PUBLIC; +GRANT EXECUTE ON FUNCTION pg_get_wal_records_info_till_end_of_wal(pg_lsn) TO pg_read_server_files; + +-- +-- pg_get_wal_stats() +-- +CREATE FUNCTION pg_get_wal_stats(IN start_lsn pg_lsn, + IN end_lsn pg_lsn, + IN per_record boolean DEFAULT false, + OUT "resource_manager/record_type" text, + OUT count int8, + OUT count_percentage float4, + OUT record_size int8, + OUT record_size_percentage float4, + OUT fpi_size int8, + OUT fpi_size_percentage float4, + OUT combined_size int8, + OUT combined_size_percentage float4 +) +RETURNS SETOF record +AS 'MODULE_PATHNAME', 'pg_get_wal_stats' +LANGUAGE C STRICT PARALLEL SAFE; + +REVOKE EXECUTE ON FUNCTION pg_get_wal_stats(pg_lsn, pg_lsn, boolean) FROM PUBLIC; +GRANT EXECUTE ON FUNCTION pg_get_wal_stats(pg_lsn, pg_lsn, boolean) TO pg_read_server_files; + +-- +-- pg_get_wal_stats_till_end_of_wal() +-- +CREATE FUNCTION pg_get_wal_stats_till_end_of_wal(IN start_lsn pg_lsn, + IN per_record boolean DEFAULT false, + OUT "resource_manager/record_type" text, + OUT count int8, + OUT count_percentage float4, + OUT record_size int8, + OUT record_size_percentage float4, + OUT fpi_size int8, + OUT fpi_size_percentage float4, + OUT combined_size int8, + OUT combined_size_percentage float4 +) +RETURNS SETOF record +AS 'MODULE_PATHNAME', 'pg_get_wal_stats_till_end_of_wal' +LANGUAGE C STRICT PARALLEL SAFE; + +REVOKE EXECUTE ON FUNCTION pg_get_wal_stats_till_end_of_wal(pg_lsn, boolean) FROM PUBLIC; +GRANT EXECUTE ON FUNCTION pg_get_wal_stats_till_end_of_wal(pg_lsn, boolean) TO pg_read_server_files; diff --git a/contrib/pg_walinspect/pg_walinspect.c b/contrib/pg_walinspect/pg_walinspect.c new file mode 100644 index 0000000000..58afa1ab1c --- /dev/null +++ b/contrib/pg_walinspect/pg_walinspect.c @@ -0,0 +1,629 @@ +/*------------------------------------------------------------------------- + * + * pg_walinspect.c + * Functions to inspect contents of PostgreSQL Write-Ahead Log + * + * Copyright (c) 2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * contrib/pg_walinspect/pg_walinspect.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/xlog.h" +#include "access/xlog_internal.h" +#include "access/xlogreader.h" +#include "access/xlogrecovery.h" +#include "access/xlogstats.h" +#include "access/xlogutils.h" +#include "funcapi.h" +#include "miscadmin.h" +#include "utils/builtins.h" +#include "utils/pg_lsn.h" + +/* + * NOTE: For any code change or issue fix here, it is highly recommended to + * give a thought about doing the same in pg_waldump tool as well. + */ + +PG_MODULE_MAGIC; + +PG_FUNCTION_INFO_V1(pg_get_wal_record_info); +PG_FUNCTION_INFO_V1(pg_get_wal_records_info); +PG_FUNCTION_INFO_V1(pg_get_wal_records_info_till_end_of_wal); +PG_FUNCTION_INFO_V1(pg_get_wal_stats); +PG_FUNCTION_INFO_V1(pg_get_wal_stats_till_end_of_wal); + +static bool IsFutureLSN(XLogRecPtr lsn, XLogRecPtr *curr_lsn); +static XLogReaderState *InitXLogReaderState(XLogRecPtr lsn, + XLogRecPtr *first_record); +static XLogRecord *ReadNextXLogRecord(XLogReaderState *xlogreader, + XLogRecPtr first_record); +static void GetWALRecordInfo(XLogReaderState *record, XLogRecPtr lsn, + Datum *values, bool *nulls, uint32 ncols); +static XLogRecPtr ValidateInputLSNs(bool till_end_of_wal, + XLogRecPtr start_lsn, XLogRecPtr end_lsn); +static void GetWALRecordsInfo(FunctionCallInfo fcinfo, XLogRecPtr start_lsn, + XLogRecPtr end_lsn); +static void GetXLogSummaryStats(XLogStats * stats, ReturnSetInfo *rsinfo, + Datum *values, bool *nulls, uint32 ncols, + bool stats_per_record); +static void FillXLogStatsRow(const char *name, uint64 n, uint64 total_count, + uint64 rec_len, uint64 total_rec_len, + uint64 fpi_len, uint64 total_fpi_len, + uint64 tot_len, uint64 total_len, + Datum *values, bool *nulls, uint32 ncols); +static void GetWalStats(FunctionCallInfo fcinfo, XLogRecPtr start_lsn, + XLogRecPtr end_lsn, bool stats_per_record); + +/* + * Check if the given LSN is in future. Also, return the LSN up to which the + * server has WAL. + */ +static bool +IsFutureLSN(XLogRecPtr lsn, XLogRecPtr *curr_lsn) +{ + /* + * We determine the current LSN of the server similar to how page_read + * callback read_local_xlog_page_no_wait does. + */ + if (!RecoveryInProgress()) + *curr_lsn = GetFlushRecPtr(NULL); + else + *curr_lsn = GetXLogReplayRecPtr(NULL); + + Assert(!XLogRecPtrIsInvalid(*curr_lsn)); + + if (lsn >= *curr_lsn) + return true; + + return false; +} + +/* + * Intialize WAL reader and identify first valid LSN. + */ +static XLogReaderState * +InitXLogReaderState(XLogRecPtr lsn, XLogRecPtr *first_record) +{ + XLogReaderState *xlogreader; + + /* + * Reading WAL below the first page of the first sgements isn't allowed. + * This is a bootstrap WAL page and the page_read callback fails to read + * it. + */ + if (lsn < XLOG_BLCKSZ) + ereport(ERROR, + (errmsg("could not read WAL at LSN %X/%X", + LSN_FORMAT_ARGS(lsn)))); + + xlogreader = XLogReaderAllocate(wal_segment_size, NULL, + XL_ROUTINE(.page_read = &read_local_xlog_page_no_wait, + .segment_open = &wal_segment_open, + .segment_close = &wal_segment_close), + NULL); + + if (xlogreader == NULL) + ereport(ERROR, + (errcode(ERRCODE_OUT_OF_MEMORY), + errmsg("out of memory"), + errdetail("Failed while allocating a WAL reading processor."))); + + /* first find a valid recptr to start from */ + *first_record = XLogFindNextRecord(xlogreader, lsn); + + if (XLogRecPtrIsInvalid(*first_record)) + ereport(ERROR, + (errmsg("could not find a valid record after %X/%X", + LSN_FORMAT_ARGS(lsn)))); + + return xlogreader; +} + +/* + * Read next WAL record. + * + * By design, to be less intrusive in a running system, no slot is allocated + * to reserve the WAL we're about to read. Therefore this function can + * encounter read errors for historical WAL. + * + * We guard against ordinary errors trying to read WAL that hasn't been + * written yet by limiting end_lsn to the flushed WAL, but that can also + * encounter errors if the flush pointer falls in the middle of a record. + */ +static XLogRecord * +ReadNextXLogRecord(XLogReaderState *xlogreader, XLogRecPtr first_record) +{ + XLogRecord *record; + char *errormsg; + + record = XLogReadRecord(xlogreader, &errormsg); + + if (record == NULL) + { + if (errormsg) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not read WAL at %X/%X: %s", + LSN_FORMAT_ARGS(first_record), errormsg))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not read WAL at %X/%X", + LSN_FORMAT_ARGS(first_record)))); + } + + return record; +} + +/* + * Get a single WAL record info. + */ +static void +GetWALRecordInfo(XLogReaderState *record, XLogRecPtr lsn, + Datum *values, bool *nulls, uint32 ncols) +{ + const char *id; + RmgrData desc; + uint32 fpi_len = 0; + StringInfoData rec_desc; + StringInfoData rec_blk_ref; + uint32 main_data_len; + int i = 0; + + desc = GetRmgr(XLogRecGetRmid(record)); + id = desc.rm_identify(XLogRecGetInfo(record)); + + if (id == NULL) + id = psprintf("UNKNOWN (%x)", XLogRecGetInfo(record) & ~XLR_INFO_MASK); + + initStringInfo(&rec_desc); + desc.rm_desc(&rec_desc, record); + + /* Block references. */ + initStringInfo(&rec_blk_ref); + XLogRecGetBlockRefInfo(record, false, true, &rec_blk_ref, &fpi_len); + + main_data_len = XLogRecGetDataLen(record); + + values[i++] = LSNGetDatum(lsn); + values[i++] = LSNGetDatum(record->EndRecPtr); + values[i++] = LSNGetDatum(XLogRecGetPrev(record)); + values[i++] = TransactionIdGetDatum(XLogRecGetXid(record)); + values[i++] = CStringGetTextDatum(desc.rm_name); + values[i++] = CStringGetTextDatum(id); + values[i++] = UInt32GetDatum(XLogRecGetTotalLen(record)); + values[i++] = UInt32GetDatum(main_data_len); + values[i++] = UInt32GetDatum(fpi_len); + values[i++] = CStringGetTextDatum(rec_desc.data); + values[i++] = CStringGetTextDatum(rec_blk_ref.data); + + Assert(i == ncols); +} + +/* + * Get WAL record info. + * + * This function emits an error if a future WAL LSN i.e. WAL LSN the database + * system doesn't know about is specified. + */ +Datum +pg_get_wal_record_info(PG_FUNCTION_ARGS) +{ +#define PG_GET_WAL_RECORD_INFO_COLS 11 + Datum result; + Datum values[PG_GET_WAL_RECORD_INFO_COLS]; + bool nulls[PG_GET_WAL_RECORD_INFO_COLS]; + XLogRecPtr lsn; + XLogRecPtr curr_lsn; + XLogRecPtr first_record; + XLogReaderState *xlogreader; + TupleDesc tupdesc; + HeapTuple tuple; + + lsn = PG_GETARG_LSN(0); + + if (IsFutureLSN(lsn, &curr_lsn)) + { + /* + * GetFlushRecPtr or GetXLogReplayRecPtr gives "end+1" LSN of the last + * record flushed or replayed respectively. But let's use the LSN up + * to "end" in user facing message. + */ + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot accept future input LSN"), + errdetail("Last known WAL LSN on the database system is at %X/%X.", + LSN_FORMAT_ARGS(curr_lsn)))); + } + + /* Build a tuple descriptor for our result type. */ + if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) + elog(ERROR, "return type must be a row type"); + + xlogreader = InitXLogReaderState(lsn, &first_record); + + (void) ReadNextXLogRecord(xlogreader, first_record); + + MemSet(values, 0, sizeof(values)); + MemSet(nulls, 0, sizeof(nulls)); + + GetWALRecordInfo(xlogreader, first_record, values, nulls, + PG_GET_WAL_RECORD_INFO_COLS); + + XLogReaderFree(xlogreader); + + tuple = heap_form_tuple(tupdesc, values, nulls); + result = HeapTupleGetDatum(tuple); + + PG_RETURN_DATUM(result); +#undef PG_GET_WAL_RECORD_INFO_COLS +} + +/* + * Validate the input LSNs and compute end LSN for till_end_of_wal versions. + */ +static XLogRecPtr +ValidateInputLSNs(bool till_end_of_wal, XLogRecPtr start_lsn, + XLogRecPtr end_lsn) +{ + XLogRecPtr curr_lsn; + + if (IsFutureLSN(start_lsn, &curr_lsn)) + { + /* + * GetFlushRecPtr or GetXLogReplayRecPtr gives "end+1" LSN of the last + * record flushed or replayed respectively. But let's use the LSN up + * to "end" in user facing message. + */ + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot accept future start LSN"), + errdetail("Last known WAL LSN on the database system is at %X/%X.", + LSN_FORMAT_ARGS(curr_lsn)))); + } + + if (till_end_of_wal) + end_lsn = curr_lsn; + + if (end_lsn > curr_lsn) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot accept future end LSN"), + errdetail("Last known WAL LSN on the database system is at %X/%X.", + LSN_FORMAT_ARGS(curr_lsn)))); + + if (start_lsn >= end_lsn) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("WAL start LSN must be less than end LSN"))); + + return end_lsn; +} + +/* + * Get info and data of all WAL records between start LSN and end LSN. + */ +static void +GetWALRecordsInfo(FunctionCallInfo fcinfo, XLogRecPtr start_lsn, + XLogRecPtr end_lsn) +{ +#define PG_GET_WAL_RECORDS_INFO_COLS 11 + XLogRecPtr first_record; + XLogReaderState *xlogreader; + ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; + Datum values[PG_GET_WAL_RECORDS_INFO_COLS]; + bool nulls[PG_GET_WAL_RECORDS_INFO_COLS]; + + SetSingleFuncCall(fcinfo, 0); + + xlogreader = InitXLogReaderState(start_lsn, &first_record); + + Assert(xlogreader); + + MemSet(values, 0, sizeof(values)); + MemSet(nulls, 0, sizeof(nulls)); + + for (;;) + { + (void) ReadNextXLogRecord(xlogreader, first_record); + + if (xlogreader->EndRecPtr <= end_lsn) + { + GetWALRecordInfo(xlogreader, xlogreader->currRecPtr, values, nulls, + PG_GET_WAL_RECORDS_INFO_COLS); + + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); + } + + /* if we read up to end_lsn, we're done */ + if (xlogreader->EndRecPtr >= end_lsn) + break; + + CHECK_FOR_INTERRUPTS(); + } + + XLogReaderFree(xlogreader); + +#undef PG_GET_WAL_RECORDS_INFO_COLS +} + +/* + * Get info and data of all WAL records between start LSN and end LSN. + * + * This function emits an error if a future start or end WAL LSN i.e. WAL LSN + * the database system doesn't know about is specified. + */ +Datum +pg_get_wal_records_info(PG_FUNCTION_ARGS) +{ + XLogRecPtr start_lsn; + XLogRecPtr end_lsn; + + start_lsn = PG_GETARG_LSN(0); + end_lsn = PG_GETARG_LSN(1); + + end_lsn = ValidateInputLSNs(false, start_lsn, end_lsn); + + GetWALRecordsInfo(fcinfo, start_lsn, end_lsn); + + PG_RETURN_VOID(); +} + +/* + * Get info and data of all WAL records from start LSN till end of WAL. + * + * This function emits an error if a future start i.e. WAL LSN the database + * system doesn't know about is specified. + */ +Datum +pg_get_wal_records_info_till_end_of_wal(PG_FUNCTION_ARGS) +{ + XLogRecPtr start_lsn; + XLogRecPtr end_lsn = InvalidXLogRecPtr; + + start_lsn = PG_GETARG_LSN(0); + + end_lsn = ValidateInputLSNs(true, start_lsn, end_lsn); + + GetWALRecordsInfo(fcinfo, start_lsn, end_lsn); + + PG_RETURN_VOID(); +} + +/* + * Fill single row of record counts and sizes for an rmgr or record. + */ +static void +FillXLogStatsRow(const char *name, + uint64 n, uint64 total_count, + uint64 rec_len, uint64 total_rec_len, + uint64 fpi_len, uint64 total_fpi_len, + uint64 tot_len, uint64 total_len, + Datum *values, bool *nulls, uint32 ncols) +{ + double n_pct, + rec_len_pct, + fpi_len_pct, + tot_len_pct; + int i = 0; + + n_pct = 0; + if (total_count != 0) + n_pct = 100 * (double) n / total_count; + + rec_len_pct = 0; + if (total_rec_len != 0) + rec_len_pct = 100 * (double) rec_len / total_rec_len; + + fpi_len_pct = 0; + if (total_fpi_len != 0) + fpi_len_pct = 100 * (double) fpi_len / total_fpi_len; + + tot_len_pct = 0; + if (total_len != 0) + tot_len_pct = 100 * (double) tot_len / total_len; + + values[i++] = CStringGetTextDatum(name); + values[i++] = Int64GetDatum(n); + values[i++] = Float4GetDatum(n_pct); + values[i++] = Int64GetDatum(rec_len); + values[i++] = Float4GetDatum(rec_len_pct); + values[i++] = Int64GetDatum(fpi_len); + values[i++] = Float4GetDatum(fpi_len_pct); + values[i++] = Int64GetDatum(tot_len); + values[i++] = Float4GetDatum(tot_len_pct); + + Assert(i == ncols); +} + +/* + * Get summary statistics about the records seen so far. + */ +static void +GetXLogSummaryStats(XLogStats *stats, ReturnSetInfo *rsinfo, + Datum *values, bool *nulls, uint32 ncols, + bool stats_per_record) +{ + uint64 total_count = 0; + uint64 total_rec_len = 0; + uint64 total_fpi_len = 0; + uint64 total_len = 0; + int ri; + + /* + * Each row shows its percentages of the total, so make a first pass to + * calculate column totals. + */ + for (ri = 0; ri <= RM_MAX_ID; ri++) + { + if (!RmgrIdIsValid(ri)) + continue; + + total_count += stats->rmgr_stats[ri].count; + total_rec_len += stats->rmgr_stats[ri].rec_len; + total_fpi_len += stats->rmgr_stats[ri].fpi_len; + } + total_len = total_rec_len + total_fpi_len; + + for (ri = 0; ri <= RM_MAX_ID; ri++) + { + uint64 count; + uint64 rec_len; + uint64 fpi_len; + uint64 tot_len; + RmgrData desc; + + if (!RmgrIdIsValid(ri)) + continue; + + if (!RmgrIdExists(ri)) + continue; + + desc = GetRmgr(ri); + + if (stats_per_record) + { + int rj; + + for (rj = 0; rj < MAX_XLINFO_TYPES; rj++) + { + const char *id; + + count = stats->record_stats[ri][rj].count; + rec_len = stats->record_stats[ri][rj].rec_len; + fpi_len = stats->record_stats[ri][rj].fpi_len; + tot_len = rec_len + fpi_len; + + /* Skip undefined combinations and ones that didn't occur */ + if (count == 0) + continue; + + /* the upper four bits in xl_info are the rmgr's */ + id = desc.rm_identify(rj << 4); + if (id == NULL) + id = psprintf("UNKNOWN (%x)", rj << 4); + + FillXLogStatsRow(psprintf("%s/%s", desc.rm_name, id), count, + total_count, rec_len, total_rec_len, fpi_len, + total_fpi_len, tot_len, total_len, + values, nulls, ncols); + + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); + } + } + else + { + count = stats->rmgr_stats[ri].count; + rec_len = stats->rmgr_stats[ri].rec_len; + fpi_len = stats->rmgr_stats[ri].fpi_len; + tot_len = rec_len + fpi_len; + + FillXLogStatsRow(desc.rm_name, count, total_count, rec_len, + total_rec_len, fpi_len, total_fpi_len, tot_len, + total_len, values, nulls, ncols); + + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); + } + } +} + +/* + * Get WAL stats between start LSN and end LSN. + */ +static void +GetWalStats(FunctionCallInfo fcinfo, XLogRecPtr start_lsn, + XLogRecPtr end_lsn, bool stats_per_record) +{ +#define PG_GET_WAL_STATS_COLS 9 + XLogRecPtr first_record; + XLogReaderState *xlogreader; + XLogStats stats; + ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; + Datum values[PG_GET_WAL_STATS_COLS]; + bool nulls[PG_GET_WAL_STATS_COLS]; + + SetSingleFuncCall(fcinfo, 0); + + xlogreader = InitXLogReaderState(start_lsn, &first_record); + + MemSet(&stats, 0, sizeof(stats)); + + for (;;) + { + (void) ReadNextXLogRecord(xlogreader, first_record); + + if (xlogreader->EndRecPtr <= end_lsn) + XLogRecStoreStats(&stats, xlogreader); + + /* if we read up to end_lsn, we're done */ + if (xlogreader->EndRecPtr >= end_lsn) + break; + + CHECK_FOR_INTERRUPTS(); + } + + XLogReaderFree(xlogreader); + + MemSet(values, 0, sizeof(values)); + MemSet(nulls, 0, sizeof(nulls)); + + GetXLogSummaryStats(&stats, rsinfo, values, nulls, + PG_GET_WAL_STATS_COLS, + stats_per_record); + +#undef PG_GET_WAL_STATS_COLS +} + +/* + * Get stats of all WAL records between start LSN and end LSN. + * + * This function emits an error if a future start or end WAL LSN i.e. WAL LSN + * the database system doesn't know about is specified. + */ +Datum +pg_get_wal_stats(PG_FUNCTION_ARGS) +{ + XLogRecPtr start_lsn; + XLogRecPtr end_lsn; + bool stats_per_record; + + start_lsn = PG_GETARG_LSN(0); + end_lsn = PG_GETARG_LSN(1); + stats_per_record = PG_GETARG_BOOL(2); + + end_lsn = ValidateInputLSNs(false, start_lsn, end_lsn); + + GetWalStats(fcinfo, start_lsn, end_lsn, stats_per_record); + + PG_RETURN_VOID(); +} + +/* + * Get stats of all WAL records from start LSN till end of WAL. + * + * This function emits an error if a future start i.e. WAL LSN the database + * system doesn't know about is specified. + */ +Datum +pg_get_wal_stats_till_end_of_wal(PG_FUNCTION_ARGS) +{ + XLogRecPtr start_lsn; + XLogRecPtr end_lsn = InvalidXLogRecPtr; + bool stats_per_record; + + start_lsn = PG_GETARG_LSN(0); + stats_per_record = PG_GETARG_BOOL(1); + + end_lsn = ValidateInputLSNs(true, start_lsn, end_lsn); + + GetWalStats(fcinfo, start_lsn, end_lsn, stats_per_record); + + PG_RETURN_VOID(); +} diff --git a/contrib/pg_walinspect/pg_walinspect.control b/contrib/pg_walinspect/pg_walinspect.control new file mode 100644 index 0000000000..017e56a2bb --- /dev/null +++ b/contrib/pg_walinspect/pg_walinspect.control @@ -0,0 +1,5 @@ +# pg_walinspect extension +comment = 'functions to inspect contents of PostgreSQL Write-Ahead Log' +default_version = '1.0' +module_pathname = '$libdir/pg_walinspect' +relocatable = true diff --git a/contrib/pg_walinspect/sql/pg_walinspect.sql b/contrib/pg_walinspect/sql/pg_walinspect.sql new file mode 100644 index 0000000000..1a9fd09e7b --- /dev/null +++ b/contrib/pg_walinspect/sql/pg_walinspect.sql @@ -0,0 +1,120 @@ +CREATE EXTENSION pg_walinspect; + +CREATE TABLE sample_tbl(col1 int, col2 int); + +-- Make sure checkpoints don't interfere with the test. +SELECT lsn as wal_lsn1 FROM + pg_create_physical_replication_slot('regress_pg_walinspect_slot', true, false) + \gset + +INSERT INTO sample_tbl SELECT * FROM generate_series(1, 2); + +SELECT pg_current_wal_lsn() AS wal_lsn2 \gset + +INSERT INTO sample_tbl SELECT * FROM generate_series(1, 2); + +-- =================================================================== +-- Tests for input validation +-- =================================================================== + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_records_info(:'wal_lsn2', :'wal_lsn1'); -- ERROR + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_stats(:'wal_lsn2', :'wal_lsn1'); -- ERROR + +-- =================================================================== +-- Tests for all function executions +-- =================================================================== + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_record_info(:'wal_lsn1'); + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_records_info(:'wal_lsn1', :'wal_lsn2'); + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_records_info_till_end_of_wal(:'wal_lsn1'); + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_stats(:'wal_lsn1', :'wal_lsn2'); + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_stats_till_end_of_wal(:'wal_lsn1'); + +-- =================================================================== +-- Test for filtering out WAL records of a particular table +-- =================================================================== + +SELECT oid AS sample_tbl_oid FROM pg_class WHERE relname = 'sample_tbl' \gset + +SELECT COUNT(*) >= 1 AS ok FROM pg_get_wal_records_info(:'wal_lsn1', :'wal_lsn2') + WHERE block_ref LIKE concat('%', :'sample_tbl_oid', '%') AND resource_manager = 'Heap'; + +-- =================================================================== +-- Test for filtering out WAL records based on resource_manager and +-- record_type +-- =================================================================== + +SELECT COUNT(*) >= 1 AS ok FROM pg_get_wal_records_info(:'wal_lsn1', :'wal_lsn2') + WHERE resource_manager = 'Heap' AND record_type = 'INSERT'; + +-- =================================================================== +-- Tests for permissions +-- =================================================================== +CREATE ROLE regress_pg_walinspect; + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_record_info(pg_lsn)', 'EXECUTE'); -- no + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_records_info(pg_lsn, pg_lsn) ', 'EXECUTE'); -- no + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_stats(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- no + +-- Functions accessible by users with role pg_read_server_files + +GRANT pg_read_server_files TO regress_pg_walinspect; + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_record_info(pg_lsn)', 'EXECUTE'); -- yes + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_records_info(pg_lsn, pg_lsn) ', 'EXECUTE'); -- yes + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_stats(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- yes + +REVOKE pg_read_server_files FROM regress_pg_walinspect; + +-- Superuser can grant execute to other users +GRANT EXECUTE ON FUNCTION pg_get_wal_record_info(pg_lsn) + TO regress_pg_walinspect; + +GRANT EXECUTE ON FUNCTION pg_get_wal_records_info(pg_lsn, pg_lsn) + TO regress_pg_walinspect; + +GRANT EXECUTE ON FUNCTION pg_get_wal_stats(pg_lsn, pg_lsn, boolean) + TO regress_pg_walinspect; + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_record_info(pg_lsn)', 'EXECUTE'); -- yes + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_records_info(pg_lsn, pg_lsn) ', 'EXECUTE'); -- yes + +SELECT has_function_privilege('regress_pg_walinspect', + 'pg_get_wal_stats(pg_lsn, pg_lsn, boolean) ', 'EXECUTE'); -- yes + +REVOKE EXECUTE ON FUNCTION pg_get_wal_record_info(pg_lsn) + FROM regress_pg_walinspect; + +REVOKE EXECUTE ON FUNCTION pg_get_wal_records_info(pg_lsn, pg_lsn) + FROM regress_pg_walinspect; + +REVOKE EXECUTE ON FUNCTION pg_get_wal_stats(pg_lsn, pg_lsn, boolean) + FROM regress_pg_walinspect; + +-- =================================================================== +-- Clean up +-- =================================================================== + +DROP ROLE regress_pg_walinspect; + +SELECT pg_drop_replication_slot('regress_pg_walinspect_slot'); + +DROP TABLE sample_tbl; diff --git a/doc/src/sgml/contrib.sgml b/doc/src/sgml/contrib.sgml index 1e42ce1a7f..4e7b87a42f 100644 --- a/doc/src/sgml/contrib.sgml +++ b/doc/src/sgml/contrib.sgml @@ -131,6 +131,7 @@ CREATE EXTENSION module_name; &pgsurgery; &pgtrgm; &pgvisibility; + &pgwalinspect; &postgres-fdw; &seg; &sepgsql; diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml index 7dea670969..1e82cb2d3d 100644 --- a/doc/src/sgml/filelist.sgml +++ b/doc/src/sgml/filelist.sgml @@ -148,6 +148,7 @@ + diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 29c4376886..5047e090db 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -29205,7 +29205,7 @@ postgres=# SELECT * FROM pg_walfile_name_offset((pg_backup_stop()).lsn); - + pg_logical_emit_message diff --git a/doc/src/sgml/pgwalinspect.sgml b/doc/src/sgml/pgwalinspect.sgml new file mode 100644 index 0000000000..44010a5b0a --- /dev/null +++ b/doc/src/sgml/pgwalinspect.sgml @@ -0,0 +1,275 @@ + + + + pg_walinspect + + + pg_walinspect + + + + The pg_walinspect module provides SQL functions that + allow you to inspect the contents of write-ahead log of + a running PostgreSQL database cluster at a low + level, which is useful for debugging or analytical or reporting or + educational purposes. It is similar to , but + accessible through SQL rather than a separate utility. + + + + All the functions of this module will provide the WAL information using the + current server's timeline ID. + + + + All the functions of this module will try to find the first valid WAL record + that is at or after the given in_lsn or + start_lsn and will emit error if no such record + is available. Similarly, the end_lsn must be + available, and if it falls in the middle of a record, the entire record must + be available. + + + + + Some functions, such as pg_logical_emit_message, + return the LSN after the record just + inserted. Therefore, if you pass that LSN as + in_lsn or start_lsn + to one of these functions, it will return the next + record. + + + + By default, use of these functions is restricted to superusers and members of + the pg_read_server_files role. Access may be granted by + superusers to others using GRANT. + + + + General Functions + + + + + + pg_get_wal_record_info(in_lsn pg_lsn, + start_lsn OUT pg_lsn, + end_lsn OUT pg_lsn, + prev_lsn OUT pg_lsn, + xid OUT xid, + resource_manager OUT text, + record_type OUT text, + record_length OUT int4, + main_data_length OUT int4, + fpi_length OUT int4, + description OUT text, + block_ref OUT text) + + + + + + Gets WAL record information of a given LSN. If the given LSN isn't + at the start of a WAL record, it gives the information of the next + available valid WAL record; or an error if no such record is found. + + + + + + + + pg_get_wal_records_info(start_lsn pg_lsn, + end_lsn pg_lsn, + start_lsn OUT pg_lsn, + end_lsn OUT pg_lsn, + prev_lsn OUT pg_lsn, + xid OUT xid, + resource_manager OUT text, + record_type OUT text, + record_length OUT int4, + main_data_length OUT int4, + fpi_length OUT int4, + description OUT text, + block_ref OUT text) + returns setof record + + + + + + Gets information of all the valid WAL records between + start_lsn and end_lsn. + Returns one row per WAL record. If start_lsn + or end_lsn are not yet available, the + function will raise an error. For example, usage of the function is as + follows: + +postgres=# select start_lsn, end_lsn, prev_lsn, xid, resource_manager, record_type, record_length, main_data_length, fpi_length, description from pg_get_wal_records_info('0/14F9A30', '0/15011D7'); + start_lsn | end_lsn | prev_lsn | xid | resource_manager | record_type | record_length | main_data_length | fpi_length | description +-----------+-----------+-----------+-----+------------------+--------------+---------------+------------------+------------+--------------------- + 0/14FA118 | 0/14FB4B0 | 0/14F9958 | 725 | Btree | INSERT_LEAF | 5013 | 2 | 4960 | off 246 + 0/14FB4B0 | 0/14FD050 | 0/14FA118 | 725 | Btree | INSERT_LEAF | 7045 | 2 | 6992 | off 130 + 0/14FD050 | 0/14FD0A8 | 0/14FB4B0 | 725 | Heap2 | MULTI_INSERT | 85 | 6 | 0 | 1 tuples flags 0x02 + 0/14FD0A8 | 0/14FD0F0 | 0/14FD050 | 725 | Btree | INSERT_LEAF | 72 | 2 | 0 | off 155 + 0/14FD0F0 | 0/14FD138 | 0/14FD0A8 | 725 | Btree | INSERT_LEAF | 72 | 2 | 0 | off 134 + 0/14FD138 | 0/14FD210 | 0/14FD0F0 | 725 | Heap | INSERT | 211 | 3 | 0 | off 11 flags 0x00 + 0/14FD210 | 0/14FD250 | 0/14FD138 | 725 | Btree | INSERT_LEAF | 64 | 2 | 0 | off 246 + 0/14FD250 | 0/14FF260 | 0/14FD210 | 725 | Btree | INSERT_LEAF | 8181 | 2 | 8128 | off 47 + 0/14FF260 | 0/14FF2B8 | 0/14FD250 | 725 | Heap2 | MULTI_INSERT | 85 | 6 | 0 | 1 tuples flags 0x02 + 0/14FF2B8 | 0/14FF300 | 0/14FF260 | 725 | Btree | INSERT_LEAF | 72 | 2 | 0 | off 155 + 0/14FF300 | 0/15008D8 | 0/14FF2B8 | 725 | Btree | INSERT_LEAF | 5565 | 2 | 5512 | off 106 + 0/15008D8 | 0/1500C48 | 0/14FF300 | 725 | Heap | INSERT | 874 | 3 | 820 | off 2 flags 0x01 +(12 rows) + + + + + + + + + pg_get_wal_records_info_till_end_of_wal(start_lsn pg_lsn, + start_lsn OUT pg_lsn, + end_lsn OUT pg_lsn, + prev_lsn OUT pg_lsn, + xid OUT xid, + resource_manager OUT text, + record_type OUT text, + record_length OUT int4, + main_data_length OUT int4, + fpi_length OUT int4, + description OUT text, + block_ref OUT text) + returns setof record + + + + + + This function is same as pg_get_wal_records_info() + except that it gets information of all the valid WAL records from + start_lsn till the end of WAL. + + + + + + + + pg_get_wal_stats(start_lsn pg_lsn, + end_lsn pg_lsn, + per_record boolean DEFAULT false, + "resource_manager/record_type" OUT text, + count OUT int8, + count_percentage OUT float4, + record_length OUT int8, + record_length_percentage OUT float4, + fpi_length OUT int8, + fpi_length_percentage OUT float4, + combined_size OUT int8, + combined_size_percentage OUT float4) + returns setof record + + + + + + Gets statistics of all the valid WAL records between + start_lsn and + end_lsn. By default, it returns one row per + resource_manager type. When + per_record is set to true, + it returns one row per record_type. + If start_lsn + or end_lsn are not yet available, the + function will raise an error. For example, usage of the function is as + follows: + +postgres=# select * from pg_get_wal_stats('0/12FBA30', '0/15011D7') where count > 0; + resource_manager/record_type | count | count_percentage | record_size | record_size_percentage | fpi_size | fpi_size_percentage | combined_size | combined_size_percentage +------------------------------+-------+------------------+-------------+------------------------+----------+---------------------+---------------+-------------------------- + XLOG | 10 | 0.10871929 | 796 | 0.052369177 | 352 | 0.061031006 | 1148 | 0.054751817 + Transaction | 187 | 2.0330508 | 62773 | 4.1298623 | 0 | 0 | 62773 | 2.9938467 + Storage | 13 | 0.14133507 | 546 | 0.035921574 | 0 | 0 | 546 | 0.0260405 + Database | 2 | 0.021743858 | 84 | 0.005526396 | 0 | 0 | 84 | 0.0040062307 + Standby | 218 | 2.3700805 | 15908 | 1.0465941 | 0 | 0 | 15908 | 0.75870377 + Heap2 | 1897 | 20.624048 | 383916 | 25.257998 | 364472 | 63.193447 | 748388 | 35.693035 + Heap | 1318 | 14.329202 | 621390 | 40.88151 | 139660 | 24.214746 | 761050 | 36.29693 + Btree | 5553 | 60.37182 | 434565 | 28.590216 | 72272 | 12.530776 | 506837 | 24.17269 +(8 rows) + + +With per_record passed as true: + + +postgres=# select * from pg_get_wal_stats('0/14AFC30', '0/15011D7', true) where count > 0; + resource_manager/record_type | count | count_percentage | record_size | record_size_percentage | fpi_size | fpi_size_percentage | combined_size | combined_size_percentage +------------------------------+-------+------------------+-------------+------------------------+----------+---------------------+---------------+-------------------------- + XLOG/CHECKPOINT_SHUTDOWN | 1 | 0.32894737 | 114 | 0.22891566 | 0 | 0 | 114 | 0.03534489 + XLOG/CHECKPOINT_ONLINE | 4 | 1.3157895 | 456 | 0.91566265 | 0 | 0 | 456 | 0.14137957 + XLOG/NEXTOID | 1 | 0.32894737 | 30 | 0.060240965 | 0 | 0 | 30 | 0.009301287 + Transaction/COMMIT | 9 | 2.9605262 | 1173 | 2.3554218 | 0 | 0 | 1173 | 0.36368033 + Storage/CREATE | 1 | 0.32894737 | 42 | 0.084337346 | 0 | 0 | 42 | 0.0130218025 + Database/CREATE_FILE_COPY | 2 | 0.65789473 | 84 | 0.16867469 | 0 | 0 | 84 | 0.026043605 + Standby/RUNNING_XACTS | 6 | 1.9736842 | 316 | 0.6345382 | 0 | 0 | 316 | 0.09797356 + Standby/INVALIDATIONS | 45 | 14.802631 | 4018 | 8.068274 | 0 | 0 | 4018 | 1.2457525 + Heap2/PRUNE | 4 | 1.3157895 | 270 | 0.5421687 | 0 | 0 | 270 | 0.08371159 + Heap2/FREEZE_PAGE | 27 | 8.881579 | 20904 | 41.975903 | 0 | 0 | 20904 | 6.481137 + Heap2/VISIBLE | 29 | 9.539474 | 1756 | 3.5261045 | 73728 | 27.032736 | 75484 | 23.403278 + Heap2/MULTI_INSERT | 13 | 4.2763157 | 1049 | 2.1064258 | 12216 | 4.479057 | 13265 | 4.112719 + Heap/INSERT | 19 | 6.25 | 2324 | 4.6666665 | 43884 | 16.090284 | 46208 | 14.326463 + Heap/UPDATE | 7 | 2.3026316 | 511 | 1.0261045 | 54340 | 19.924028 | 54851 | 17.006165 + Heap/HOT_UPDATE | 11 | 3.618421 | 1134 | 2.2771084 | 468 | 0.17159452 | 1602 | 0.49668875 + Heap/LOCK | 8 | 2.631579 | 432 | 0.8674699 | 0 | 0 | 432 | 0.13393854 + Heap/INPLACE | 45 | 14.802631 | 9123 | 18.319277 | 16076 | 5.894345 | 25199 | 7.8127713 + Heap/UPDATE+INIT | 1 | 0.32894737 | 817 | 1.6405623 | 0 | 0 | 817 | 0.25330505 + Btree/INSERT_LEAF | 70 | 23.026316 | 5183 | 10.407631 | 72024 | 26.407955 | 77207 | 23.937483 + Btree/DEDUP | 1 | 0.32894737 | 64 | 0.12851405 | 0 | 0 | 64 | 0.019842746 +(20 rows) + + + + + + + + + pg_get_wal_stats_till_end_of_wal(start_lsn pg_lsn, + per_record boolean DEFAULT false, + "resource_manager/record_type" OUT text, + count OUT int8, + count_percentage OUT float4, + record_length OUT int8, + record_length_percentage OUT float4, + fpi_length OUT int8, + fpi_length_percentage OUT float4, + combined_size OUT int8, + combined_size_percentage OUT float4) + returns setof record + + + + + + This function is same as pg_get_wal_stats() except + that it gets statistics of all the valid WAL records from + start_lsn till end of WAL. + + + + + + + + + Author + + + Bharath Rupireddy bharath.rupireddyforpostgres@gmail.com + + + + diff --git a/src/backend/access/rmgrdesc/xlogdesc.c b/src/backend/access/rmgrdesc/xlogdesc.c index e7452af679..dff1e7685e 100644 --- a/src/backend/access/rmgrdesc/xlogdesc.c +++ b/src/backend/access/rmgrdesc/xlogdesc.c @@ -200,3 +200,133 @@ xlog_identify(uint8 info) return id; } + +/* + * Returns a string giving information about all the blocks in an + * XLogRecord. + */ +void +XLogRecGetBlockRefInfo(XLogReaderState *record, bool pretty, + bool detailed_format, StringInfo buf, + uint32 *fpi_len) +{ + int block_id; + + Assert(record != NULL); + + if (detailed_format && pretty) + appendStringInfoChar(buf, '\n'); + + for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) + { + RelFileNode rnode = {InvalidOid, InvalidOid, InvalidOid}; + ForkNumber forknum = InvalidForkNumber; + BlockNumber blk = InvalidBlockNumber; + + if (!XLogRecHasBlockRef(record, block_id)) + continue; + + XLogRecGetBlockTag(record, block_id, &rnode, &forknum, &blk); + + if (detailed_format) + { + /* Get block references in detailed format. */ + + if (pretty) + appendStringInfoChar(buf, '\t'); + else if (block_id > 0) + appendStringInfoChar(buf, ' '); + + appendStringInfo(buf, + "blkref #%d: rel %u/%u/%u fork %s blk %u", + block_id, + rnode.spcNode, rnode.dbNode, rnode.relNode, + forkNames[forknum], + blk); + + if (XLogRecHasBlockImage(record, block_id)) + { + uint8 bimg_info = XLogRecGetBlock(record, block_id)->bimg_info; + + /* Calculate the amount of FPI data in the record. */ + if (fpi_len) + *fpi_len += XLogRecGetBlock(record, block_id)->bimg_len; + + if (BKPIMAGE_COMPRESSED(bimg_info)) + { + const char *method; + + if ((bimg_info & BKPIMAGE_COMPRESS_PGLZ) != 0) + method = "pglz"; + else if ((bimg_info & BKPIMAGE_COMPRESS_LZ4) != 0) + method = "lz4"; + else if ((bimg_info & BKPIMAGE_COMPRESS_ZSTD) != 0) + method = "zstd"; + else + method = "unknown"; + + appendStringInfo(buf, + " (FPW%s); hole: offset: %u, length: %u, " + "compression saved: %u, method: %s", + XLogRecBlockImageApply(record, block_id) ? + "" : " for WAL verification", + XLogRecGetBlock(record, block_id)->hole_offset, + XLogRecGetBlock(record, block_id)->hole_length, + BLCKSZ - + XLogRecGetBlock(record, block_id)->hole_length - + XLogRecGetBlock(record, block_id)->bimg_len, + method); + } + else + { + appendStringInfo(buf, + " (FPW%s); hole: offset: %u, length: %u", + XLogRecBlockImageApply(record, block_id) ? + "" : " for WAL verification", + XLogRecGetBlock(record, block_id)->hole_offset, + XLogRecGetBlock(record, block_id)->hole_length); + } + } + + if (pretty) + appendStringInfoChar(buf, '\n'); + } + else + { + /* Get block references in short format. */ + + if (forknum != MAIN_FORKNUM) + { + appendStringInfo(buf, + ", blkref #%d: rel %u/%u/%u fork %s blk %u", + block_id, + rnode.spcNode, rnode.dbNode, rnode.relNode, + forkNames[forknum], + blk); + } + else + { + appendStringInfo(buf, + ", blkref #%d: rel %u/%u/%u blk %u", + block_id, + rnode.spcNode, rnode.dbNode, rnode.relNode, + blk); + } + + if (XLogRecHasBlockImage(record, block_id)) + { + /* Calculate the amount of FPI data in the record. */ + if (fpi_len) + *fpi_len += XLogRecGetBlock(record, block_id)->bimg_len; + + if (XLogRecBlockImageApply(record, block_id)) + appendStringInfo(buf, " FPW"); + else + appendStringInfo(buf, " FPW for WAL verification"); + } + } + } + + if (!detailed_format && pretty) + appendStringInfoChar(buf, '\n'); +} diff --git a/src/backend/access/transam/Makefile b/src/backend/access/transam/Makefile index 8c17c88dfc..3e5444a6f7 100644 --- a/src/backend/access/transam/Makefile +++ b/src/backend/access/transam/Makefile @@ -34,6 +34,7 @@ OBJS = \ xlogprefetcher.o \ xlogreader.o \ xlogrecovery.o \ + xlogstats.o \ xlogutils.o include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index 5862d9dc75..a5f1a648d3 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1320,13 +1320,6 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr, return true; } -#ifdef FRONTEND -/* - * Functions that are currently not needed in the backend, but are better - * implemented inside xlogreader.c because of the internal facilities available - * here. - */ - /* * Find the first record with an lsn >= RecPtr. * @@ -1447,8 +1440,6 @@ XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr) return InvalidXLogRecPtr; } -#endif /* FRONTEND */ - /* * Helper function to ease writing of XLogRoutine->page_read callbacks. * If this function is used, caller must supply a segment_open callback in diff --git a/src/backend/access/transam/xlogstats.c b/src/backend/access/transam/xlogstats.c new file mode 100644 index 0000000000..aff3069ecb --- /dev/null +++ b/src/backend/access/transam/xlogstats.c @@ -0,0 +1,93 @@ +/*------------------------------------------------------------------------- + * + * xlogstats.c + * Functions for WAL Statitstics + * + * Copyright (c) 2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/access/transam/xlogstats.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/xlogreader.h" +#include "access/xlogstats.h" + +/* + * Calculate the size of a record, split into !FPI and FPI parts. + */ +void +XLogRecGetLen(XLogReaderState *record, uint32 *rec_len, + uint32 *fpi_len) +{ + int block_id; + + /* + * Calculate the amount of FPI data in the record. + * + * XXX: We peek into xlogreader's private decoded backup blocks for the + * bimg_len indicating the length of FPI data. + */ + *fpi_len = 0; + for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) + { + if (XLogRecHasBlockImage(record, block_id)) + *fpi_len += XLogRecGetBlock(record, block_id)->bimg_len; + } + + /* + * Calculate the length of the record as the total length - the length of + * all the block images. + */ + *rec_len = XLogRecGetTotalLen(record) - *fpi_len; +} + +/* + * Store per-rmgr and per-record statistics for a given record. + */ +void +XLogRecStoreStats(XLogStats *stats, XLogReaderState *record) +{ + RmgrId rmid; + uint8 recid; + uint32 rec_len; + uint32 fpi_len; + + Assert(stats != NULL && record != NULL); + + stats->count++; + + rmid = XLogRecGetRmid(record); + + XLogRecGetLen(record, &rec_len, &fpi_len); + + /* Update per-rmgr statistics */ + + stats->rmgr_stats[rmid].count++; + stats->rmgr_stats[rmid].rec_len += rec_len; + stats->rmgr_stats[rmid].fpi_len += fpi_len; + + /* + * Update per-record statistics, where the record is identified by a + * combination of the RmgrId and the four bits of the xl_info field that + * are the rmgr's domain (resulting in sixteen possible entries per + * RmgrId). + */ + + recid = XLogRecGetInfo(record) >> 4; + + /* + * XACT records need to be handled differently. Those records use the + * first bit of those four bits for an optional flag variable and the + * following three bits for the opcode. We filter opcode out of xl_info + * and use it as the identifier of the record. + */ + if (rmid == RM_XACT_ID) + recid &= 0x07; + + stats->record_stats[rmid][recid].count++; + stats->record_stats[rmid][recid].rec_len += rec_len; + stats->record_stats[rmid][recid].fpi_len += fpi_len; +} diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index bb2d3ec991..b5d34c61e6 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -80,6 +80,10 @@ typedef struct xl_invalid_page static HTAB *invalid_page_tab = NULL; +static int +read_local_xlog_page_guts(XLogReaderState *state, XLogRecPtr targetPagePtr, + int reqLen, XLogRecPtr targetRecPtr, + char *cur_page, bool wait_for_wal); /* Report a reference to an invalid page */ static void @@ -870,6 +874,31 @@ wal_segment_close(XLogReaderState *state) int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page) +{ + return read_local_xlog_page_guts(state, targetPagePtr, reqLen, + targetRecPtr, cur_page, true); +} + +/* + * Same as read_local_xlog_page except that it doesn't wait for future WAL + * to be available. + */ +int +read_local_xlog_page_no_wait(XLogReaderState *state, XLogRecPtr targetPagePtr, + int reqLen, XLogRecPtr targetRecPtr, + char *cur_page) +{ + return read_local_xlog_page_guts(state, targetPagePtr, reqLen, + targetRecPtr, cur_page, false); +} + +/* + * Implementation of read_local_xlog_page and its no wait version. + */ +static int +read_local_xlog_page_guts(XLogReaderState *state, XLogRecPtr targetPagePtr, + int reqLen, XLogRecPtr targetRecPtr, + char *cur_page, bool wait_for_wal) { XLogRecPtr read_upto, loc; @@ -925,6 +954,10 @@ read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, if (loc <= read_upto) break; + /* If asked, let's not wait for future WAL. */ + if (!wait_for_wal) + break; + CHECK_FOR_INTERRUPTS(); pg_usleep(1000L); } diff --git a/src/bin/pg_waldump/.gitignore b/src/bin/pg_waldump/.gitignore index 3be00a8b61..dabb6e34b6 100644 --- a/src/bin/pg_waldump/.gitignore +++ b/src/bin/pg_waldump/.gitignore @@ -23,6 +23,7 @@ /xactdesc.c /xlogdesc.c /xlogreader.c +/xlogstat.c # Generated by test suite /tmp_check/ diff --git a/src/bin/pg_waldump/Makefile b/src/bin/pg_waldump/Makefile index 9f333d0c8a..d6459e17c7 100644 --- a/src/bin/pg_waldump/Makefile +++ b/src/bin/pg_waldump/Makefile @@ -13,7 +13,8 @@ OBJS = \ compat.o \ pg_waldump.o \ rmgrdesc.o \ - xlogreader.o + xlogreader.o \ + xlogstats.o override CPPFLAGS := -DFRONTEND $(CPPFLAGS) @@ -29,6 +30,9 @@ pg_waldump: $(OBJS) | submake-libpgport xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/% rm -f $@ && $(LN_S) $< . +xlogstats.c: % : $(top_srcdir)/src/backend/access/transam/% + rm -f $@ && $(LN_S) $< . + $(RMGRDESCSOURCES): % : $(top_srcdir)/src/backend/access/rmgrdesc/% rm -f $@ && $(LN_S) $< . @@ -42,7 +46,7 @@ uninstall: rm -f '$(DESTDIR)$(bindir)/pg_waldump$(X)' clean distclean maintainer-clean: - rm -f pg_waldump$(X) $(OBJS) $(RMGRDESCSOURCES) xlogreader.c + rm -f pg_waldump$(X) $(OBJS) $(RMGRDESCSOURCES) xlogreader.c xlogstats.c rm -rf tmp_check check: diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 30ca7684bd..8bf6899d67 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -21,11 +21,17 @@ #include "access/xlog_internal.h" #include "access/xlogreader.h" #include "access/xlogrecord.h" +#include "access/xlogstats.h" #include "common/fe_memutils.h" #include "common/logging.h" #include "getopt_long.h" #include "rmgrdesc.h" +/* + * NOTE: For any code change or issue fix here, it is highly recommended to + * give a thought about doing the same in pg_walinspect contrib module as well. + */ + static const char *progname; static int WalSegSz; @@ -66,24 +72,6 @@ typedef struct XLogDumpConfig bool filter_by_fpw; } XLogDumpConfig; -typedef struct Stats -{ - uint64 count; - uint64 rec_len; - uint64 fpi_len; -} Stats; - -#define MAX_XLINFO_TYPES 16 - -typedef struct XLogDumpStats -{ - uint64 count; - XLogRecPtr startptr; - XLogRecPtr endptr; - Stats rmgr_stats[RM_MAX_ID + 1]; - Stats record_stats[RM_MAX_ID + 1][MAX_XLINFO_TYPES]; -} XLogDumpStats; - #define fatal_error(...) do { pg_log_fatal(__VA_ARGS__); exit(EXIT_FAILURE); } while(0) /* @@ -453,81 +441,6 @@ XLogRecordHasFPW(XLogReaderState *record) return false; } -/* - * Calculate the size of a record, split into !FPI and FPI parts. - */ -static void -XLogDumpRecordLen(XLogReaderState *record, uint32 *rec_len, uint32 *fpi_len) -{ - int block_id; - - /* - * Calculate the amount of FPI data in the record. - * - * XXX: We peek into xlogreader's private decoded backup blocks for the - * bimg_len indicating the length of FPI data. - */ - *fpi_len = 0; - for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) - { - if (XLogRecHasBlockImage(record, block_id)) - *fpi_len += XLogRecGetBlock(record, block_id)->bimg_len; - } - - /* - * Calculate the length of the record as the total length - the length of - * all the block images. - */ - *rec_len = XLogRecGetTotalLen(record) - *fpi_len; -} - -/* - * Store per-rmgr and per-record statistics for a given record. - */ -static void -XLogDumpCountRecord(XLogDumpConfig *config, XLogDumpStats *stats, - XLogReaderState *record) -{ - RmgrId rmid; - uint8 recid; - uint32 rec_len; - uint32 fpi_len; - - stats->count++; - - rmid = XLogRecGetRmid(record); - - XLogDumpRecordLen(record, &rec_len, &fpi_len); - - /* Update per-rmgr statistics */ - - stats->rmgr_stats[rmid].count++; - stats->rmgr_stats[rmid].rec_len += rec_len; - stats->rmgr_stats[rmid].fpi_len += fpi_len; - - /* - * Update per-record statistics, where the record is identified by a - * combination of the RmgrId and the four bits of the xl_info field that - * are the rmgr's domain (resulting in sixteen possible entries per - * RmgrId). - */ - - recid = XLogRecGetInfo(record) >> 4; - - /* - * XACT records need to be handled differently. Those records use the - * first bit of those four bits for an optional flag variable and the - * following three bits for the opcode. We filter opcode out of xl_info - * and use it as the identifier of the record. - */ - if (rmid == RM_XACT_ID) - recid &= 0x07; - - stats->record_stats[rmid][recid].count++; - stats->record_stats[rmid][recid].rec_len += rec_len; - stats->record_stats[rmid][recid].fpi_len += fpi_len; -} - /* * Print a record to stdout */ @@ -538,15 +451,11 @@ XLogDumpDisplayRecord(XLogDumpConfig *config, XLogReaderState *record) const RmgrDescData *desc = GetRmgrDesc(XLogRecGetRmid(record)); uint32 rec_len; uint32 fpi_len; - RelFileNode rnode; - ForkNumber forknum; - BlockNumber blk; - int block_id; uint8 info = XLogRecGetInfo(record); XLogRecPtr xl_prev = XLogRecGetPrev(record); StringInfoData s; - XLogDumpRecordLen(record, &rec_len, &fpi_len); + XLogRecGetLen(record, &rec_len, &fpi_len); printf("rmgr: %-11s len (rec/tot): %6u/%6u, tx: %10u, lsn: %X/%08X, prev %X/%08X, ", desc->rm_name, @@ -564,93 +473,11 @@ XLogDumpDisplayRecord(XLogDumpConfig *config, XLogReaderState *record) initStringInfo(&s); desc->rm_desc(&s, record); printf("%s", s.data); - pfree(s.data); - - if (!config->bkp_details) - { - /* print block references (short format) */ - for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) - { - if (!XLogRecHasBlockRef(record, block_id)) - continue; - - XLogRecGetBlockTag(record, block_id, &rnode, &forknum, &blk); - if (forknum != MAIN_FORKNUM) - printf(", blkref #%d: rel %u/%u/%u fork %s blk %u", - block_id, - rnode.spcNode, rnode.dbNode, rnode.relNode, - forkNames[forknum], - blk); - else - printf(", blkref #%d: rel %u/%u/%u blk %u", - block_id, - rnode.spcNode, rnode.dbNode, rnode.relNode, - blk); - if (XLogRecHasBlockImage(record, block_id)) - { - if (XLogRecBlockImageApply(record, block_id)) - printf(" FPW"); - else - printf(" FPW for WAL verification"); - } - } - putchar('\n'); - } - else - { - /* print block references (detailed format) */ - putchar('\n'); - for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) - { - if (!XLogRecHasBlockRef(record, block_id)) - continue; - - XLogRecGetBlockTag(record, block_id, &rnode, &forknum, &blk); - printf("\tblkref #%d: rel %u/%u/%u fork %s blk %u", - block_id, - rnode.spcNode, rnode.dbNode, rnode.relNode, - forkNames[forknum], - blk); - if (XLogRecHasBlockImage(record, block_id)) - { - uint8 bimg_info = XLogRecGetBlock(record, block_id)->bimg_info; - if (BKPIMAGE_COMPRESSED(bimg_info)) - { - const char *method; - - if ((bimg_info & BKPIMAGE_COMPRESS_PGLZ) != 0) - method = "pglz"; - else if ((bimg_info & BKPIMAGE_COMPRESS_LZ4) != 0) - method = "lz4"; - else if ((bimg_info & BKPIMAGE_COMPRESS_ZSTD) != 0) - method = "zstd"; - else - method = "unknown"; - - printf(" (FPW%s); hole: offset: %u, length: %u, " - "compression saved: %u, method: %s", - XLogRecBlockImageApply(record, block_id) ? - "" : " for WAL verification", - XLogRecGetBlock(record, block_id)->hole_offset, - XLogRecGetBlock(record, block_id)->hole_length, - BLCKSZ - - XLogRecGetBlock(record, block_id)->hole_length - - XLogRecGetBlock(record, block_id)->bimg_len, - method); - } - else - { - printf(" (FPW%s); hole: offset: %u, length: %u", - XLogRecBlockImageApply(record, block_id) ? - "" : " for WAL verification", - XLogRecGetBlock(record, block_id)->hole_offset, - XLogRecGetBlock(record, block_id)->hole_length); - } - } - putchar('\n'); - } - } + resetStringInfo(&s); + XLogRecGetBlockRefInfo(record, true, config->bkp_details, &s, NULL); + printf("%s", s.data); + pfree(s.data); } /* @@ -698,7 +525,7 @@ XLogDumpStatsRow(const char *name, * Display summary statistics about the records seen so far. */ static void -XLogDumpDisplayStats(XLogDumpConfig *config, XLogDumpStats *stats) +XLogDumpDisplayStats(XLogDumpConfig *config, XLogStats *stats) { int ri, rj; @@ -722,6 +549,9 @@ XLogDumpDisplayStats(XLogDumpConfig *config, XLogDumpStats *stats) for (ri = 0; ri <= RM_MAX_ID; ri++) { + if (!RmgrIdIsValid(ri)) + continue; + total_count += stats->rmgr_stats[ri].count; total_rec_len += stats->rmgr_stats[ri].rec_len; total_fpi_len += stats->rmgr_stats[ri].fpi_len; @@ -867,7 +697,7 @@ main(int argc, char **argv) XLogReaderState *xlogreader_state; XLogDumpPrivate private; XLogDumpConfig config; - XLogDumpStats stats; + XLogStats stats; XLogRecord *record; XLogRecPtr first_record; char *waldir = NULL; @@ -921,7 +751,7 @@ main(int argc, char **argv) memset(&private, 0, sizeof(XLogDumpPrivate)); memset(&config, 0, sizeof(XLogDumpConfig)); - memset(&stats, 0, sizeof(XLogDumpStats)); + memset(&stats, 0, sizeof(XLogStats)); private.timeline = 1; private.startptr = InvalidXLogRecPtr; @@ -1319,7 +1149,7 @@ main(int argc, char **argv) { if (config.stats == true) { - XLogDumpCountRecord(&config, &stats, xlogreader_state); + XLogRecStoreStats(&stats, xlogreader_state); stats.endptr = xlogreader_state->EndRecPtr; } else diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index e302bd102c..5e1e3446ae 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -31,7 +31,7 @@ extern XLogRecPtr XactLastRecEnd; extern PGDLLIMPORT XLogRecPtr XactLastCommitEnd; /* these variables are GUC parameters related to XLOG */ -extern int wal_segment_size; +extern PGDLLIMPORT int wal_segment_size; extern int min_wal_size_mb; extern int max_wal_size_mb; extern int wal_keep_size_mb; diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h index d9df7f295d..750f634120 100644 --- a/src/include/access/xlog_internal.h +++ b/src/include/access/xlog_internal.h @@ -320,7 +320,7 @@ typedef struct RmgrData struct XLogRecordBuffer *buf); } RmgrData; -extern RmgrData RmgrTable[]; +extern PGDLLIMPORT RmgrData RmgrTable[]; extern void RmgrStartup(void); extern void RmgrCleanup(void); extern void RmgrNotFound(RmgrId rmid); @@ -350,6 +350,10 @@ extern XLogRecPtr RequestXLogSwitch(bool mark_unimportant); extern void GetOldestRestartPoint(XLogRecPtr *oldrecptr, TimeLineID *oldtli); +extern void XLogRecGetBlockRefInfo(XLogReaderState *record, bool pretty, + bool detailed_format, StringInfo buf, + uint32 *fpi_len); + /* * Exported for the functions in timeline.c and xlogarchive.c. Only valid * in the startup process. diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index d8eb857611..727e9fe971 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -344,9 +344,7 @@ extern void XLogReaderSetDecodeBuffer(XLogReaderState *state, /* Position the XLogReader to given record */ extern void XLogBeginRead(XLogReaderState *state, XLogRecPtr RecPtr); -#ifdef FRONTEND extern XLogRecPtr XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr); -#endif /* FRONTEND */ /* Return values from XLogPageReadCB. */ typedef enum XLogPageReadResult diff --git a/src/include/access/xlogstats.h b/src/include/access/xlogstats.h new file mode 100644 index 0000000000..453bb1f491 --- /dev/null +++ b/src/include/access/xlogstats.h @@ -0,0 +1,40 @@ +/*------------------------------------------------------------------------- + * + * xlogstats.h + * Definitions for WAL Statitstics + * + * Copyright (c) 2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/include/access/xlogstats.h + * + *------------------------------------------------------------------------- + */ +#ifndef XLOGSTATS_H +#define XLOGSTATS_H + +#define MAX_XLINFO_TYPES 16 + +typedef struct XLogRecStats +{ + uint64 count; + uint64 rec_len; + uint64 fpi_len; +} XLogRecStats; + +typedef struct XLogStats +{ + uint64 count; +#ifdef FRONTEND + XLogRecPtr startptr; + XLogRecPtr endptr; +#endif + XLogRecStats rmgr_stats[RM_MAX_ID + 1]; + XLogRecStats record_stats[RM_MAX_ID + 1][MAX_XLINFO_TYPES]; +} XLogStats; + +extern void XLogRecGetLen(XLogReaderState *record, uint32 *rec_len, + uint32 *fpi_len); +extern void XLogRecStoreStats(XLogStats *stats, XLogReaderState *record); + +#endif /* XLOGSTATS_H */ diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index ff40f96e42..3746e31e40 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -93,6 +93,10 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); +extern int read_local_xlog_page_no_wait(XLogReaderState *state, + XLogRecPtr targetPagePtr, int reqLen, + XLogRecPtr targetRecPtr, + char *cur_page); extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, TimeLineID *tli_p); From 1562e92c62a3f3a4e5d87895523ff74174029654 Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Fri, 8 Apr 2022 01:33:58 -0700 Subject: [PATCH 455/772] Fix buildfarm failure from commit 2258e76f90. --- src/include/access/xlogstats.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/include/access/xlogstats.h b/src/include/access/xlogstats.h index 453bb1f491..be59eece22 100644 --- a/src/include/access/xlogstats.h +++ b/src/include/access/xlogstats.h @@ -13,6 +13,9 @@ #ifndef XLOGSTATS_H #define XLOGSTATS_H +#include "access/rmgr.h" +#include "access/xlogreader.h" + #define MAX_XLINFO_TYPES 16 typedef struct XLogRecStats From 12aaae5131af343b7cd2fdef05dee82c25d8aaf8 Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Fri, 8 Apr 2022 02:30:57 -0700 Subject: [PATCH 456/772] Check XLogRecHasBlockRef() before XLogRecHasBlockImage(). Trial fix of buildfarm failures on kestrel and tamandua. --- src/backend/access/transam/xlogstats.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backend/access/transam/xlogstats.c b/src/backend/access/transam/xlogstats.c index aff3069ecb..6524a1ad0b 100644 --- a/src/backend/access/transam/xlogstats.c +++ b/src/backend/access/transam/xlogstats.c @@ -33,6 +33,9 @@ XLogRecGetLen(XLogReaderState *record, uint32 *rec_len, *fpi_len = 0; for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) { + if (!XLogRecHasBlockRef(record, block_id)) + continue; + if (XLogRecHasBlockImage(record, block_id)) *fpi_len += XLogRecGetBlock(record, block_id)->bimg_len; } From dad9ba1c82fd985aa6fb8035ebca1e79c138dde2 Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Fri, 8 Apr 2022 03:21:12 -0700 Subject: [PATCH 457/772] Fix buildfarm failures in pg_walinspect tests. --- contrib/pg_walinspect/Makefile | 6 ++++++ contrib/pg_walinspect/expected/pg_walinspect.out | 12 ++++++++---- contrib/pg_walinspect/sql/pg_walinspect.sql | 8 ++++---- contrib/pg_walinspect/walinspect.conf | 2 ++ 4 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 contrib/pg_walinspect/walinspect.conf diff --git a/contrib/pg_walinspect/Makefile b/contrib/pg_walinspect/Makefile index 350845cd43..960530eb6c 100644 --- a/contrib/pg_walinspect/Makefile +++ b/contrib/pg_walinspect/Makefile @@ -11,6 +11,12 @@ DATA = pg_walinspect--1.0.sql REGRESS = pg_walinspect +REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/pg_walinspect/walinspect.conf + +# Disabled because these tests require "wal_level=replica", which +# some installcheck users do not have (e.g. buildfarm clients). +NO_INSTALLCHECK = 1 + ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) diff --git a/contrib/pg_walinspect/expected/pg_walinspect.out b/contrib/pg_walinspect/expected/pg_walinspect.out index 634b1bb739..a1ee743457 100644 --- a/contrib/pg_walinspect/expected/pg_walinspect.out +++ b/contrib/pg_walinspect/expected/pg_walinspect.out @@ -1,9 +1,13 @@ CREATE EXTENSION pg_walinspect; -CREATE TABLE sample_tbl(col1 int, col2 int); -- Make sure checkpoints don't interfere with the test. -SELECT lsn as wal_lsn1 FROM - pg_create_physical_replication_slot('regress_pg_walinspect_slot', true, false) - \gset +SELECT 'init' FROM pg_create_physical_replication_slot('regress_pg_walinspect_slot', true, false); + ?column? +---------- + init +(1 row) + +CREATE TABLE sample_tbl(col1 int, col2 int); +SELECT pg_current_wal_lsn() AS wal_lsn1 \gset INSERT INTO sample_tbl SELECT * FROM generate_series(1, 2); SELECT pg_current_wal_lsn() AS wal_lsn2 \gset INSERT INTO sample_tbl SELECT * FROM generate_series(1, 2); diff --git a/contrib/pg_walinspect/sql/pg_walinspect.sql b/contrib/pg_walinspect/sql/pg_walinspect.sql index 1a9fd09e7b..1b265ea7bc 100644 --- a/contrib/pg_walinspect/sql/pg_walinspect.sql +++ b/contrib/pg_walinspect/sql/pg_walinspect.sql @@ -1,11 +1,11 @@ CREATE EXTENSION pg_walinspect; +-- Make sure checkpoints don't interfere with the test. +SELECT 'init' FROM pg_create_physical_replication_slot('regress_pg_walinspect_slot', true, false); + CREATE TABLE sample_tbl(col1 int, col2 int); --- Make sure checkpoints don't interfere with the test. -SELECT lsn as wal_lsn1 FROM - pg_create_physical_replication_slot('regress_pg_walinspect_slot', true, false) - \gset +SELECT pg_current_wal_lsn() AS wal_lsn1 \gset INSERT INTO sample_tbl SELECT * FROM generate_series(1, 2); diff --git a/contrib/pg_walinspect/walinspect.conf b/contrib/pg_walinspect/walinspect.conf new file mode 100644 index 0000000000..67ceb2bb07 --- /dev/null +++ b/contrib/pg_walinspect/walinspect.conf @@ -0,0 +1,2 @@ +wal_level = replica +max_replication_slots = 4 From 57d6aea00fcefec3825a5948ce05cf2b4941097b Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Fri, 8 Apr 2022 13:51:01 +0200 Subject: [PATCH 458/772] Add JIT counters to pg_stat_statements This adds cumulative counters for jit operations to pg_stat_statements, making it easier to diagnose how JIT is used in an installation. These changes merge into the 1.10 changes applied in 76cbf7edb6 without creating a new version. Reviewed-By: Julien Rouhaud Discussion: https://www.postgresql.org/message-id/flat/CABUevEySt4NTYqvWzwyAW_0-jG1bjN-y+tykapAnA0FALOs+Lw@mail.gmail.com --- .../expected/oldextversions.out | 84 ++++++++++--------- .../pg_stat_statements--1.9--1.10.sql | 10 ++- .../pg_stat_statements/pg_stat_statements.c | 50 ++++++++++- doc/src/sgml/pgstatstatements.sgml | 72 ++++++++++++++++ 4 files changed, 175 insertions(+), 41 deletions(-) diff --git a/contrib/pg_stat_statements/expected/oldextversions.out b/contrib/pg_stat_statements/expected/oldextversions.out index 2813eb16cb..efb2049ecf 100644 --- a/contrib/pg_stat_statements/expected/oldextversions.out +++ b/contrib/pg_stat_statements/expected/oldextversions.out @@ -197,44 +197,52 @@ SELECT count(*) > 0 AS has_data FROM pg_stat_statements; -- New functions and views for pg_stat_statements in 1.10 AlTER EXTENSION pg_stat_statements UPDATE TO '1.10'; \d pg_stat_statements - View "public.pg_stat_statements" - Column | Type | Collation | Nullable | Default ----------------------+------------------+-----------+----------+--------- - userid | oid | | | - dbid | oid | | | - toplevel | boolean | | | - queryid | bigint | | | - query | text | | | - plans | bigint | | | - total_plan_time | double precision | | | - min_plan_time | double precision | | | - max_plan_time | double precision | | | - mean_plan_time | double precision | | | - stddev_plan_time | double precision | | | - calls | bigint | | | - total_exec_time | double precision | | | - min_exec_time | double precision | | | - max_exec_time | double precision | | | - mean_exec_time | double precision | | | - stddev_exec_time | double precision | | | - rows | bigint | | | - shared_blks_hit | bigint | | | - shared_blks_read | bigint | | | - shared_blks_dirtied | bigint | | | - shared_blks_written | bigint | | | - local_blks_hit | bigint | | | - local_blks_read | bigint | | | - local_blks_dirtied | bigint | | | - local_blks_written | bigint | | | - temp_blks_read | bigint | | | - temp_blks_written | bigint | | | - blk_read_time | double precision | | | - blk_write_time | double precision | | | - temp_blk_read_time | double precision | | | - temp_blk_write_time | double precision | | | - wal_records | bigint | | | - wal_fpi | bigint | | | - wal_bytes | numeric | | | + View "public.pg_stat_statements" + Column | Type | Collation | Nullable | Default +------------------------+------------------+-----------+----------+--------- + userid | oid | | | + dbid | oid | | | + toplevel | boolean | | | + queryid | bigint | | | + query | text | | | + plans | bigint | | | + total_plan_time | double precision | | | + min_plan_time | double precision | | | + max_plan_time | double precision | | | + mean_plan_time | double precision | | | + stddev_plan_time | double precision | | | + calls | bigint | | | + total_exec_time | double precision | | | + min_exec_time | double precision | | | + max_exec_time | double precision | | | + mean_exec_time | double precision | | | + stddev_exec_time | double precision | | | + rows | bigint | | | + shared_blks_hit | bigint | | | + shared_blks_read | bigint | | | + shared_blks_dirtied | bigint | | | + shared_blks_written | bigint | | | + local_blks_hit | bigint | | | + local_blks_read | bigint | | | + local_blks_dirtied | bigint | | | + local_blks_written | bigint | | | + temp_blks_read | bigint | | | + temp_blks_written | bigint | | | + blk_read_time | double precision | | | + blk_write_time | double precision | | | + temp_blk_read_time | double precision | | | + temp_blk_write_time | double precision | | | + wal_records | bigint | | | + wal_fpi | bigint | | | + wal_bytes | numeric | | | + jit_functions | bigint | | | + jit_generation_time | double precision | | | + jit_inlining_count | bigint | | | + jit_inlining_time | double precision | | | + jit_optimization_count | bigint | | | + jit_optimization_time | double precision | | | + jit_emission_count | bigint | | | + jit_emission_time | double precision | | | SELECT count(*) > 0 AS has_data FROM pg_stat_statements; has_data diff --git a/contrib/pg_stat_statements/pg_stat_statements--1.9--1.10.sql b/contrib/pg_stat_statements/pg_stat_statements--1.9--1.10.sql index ca777f14e8..811813c491 100644 --- a/contrib/pg_stat_statements/pg_stat_statements--1.9--1.10.sql +++ b/contrib/pg_stat_statements/pg_stat_statements--1.9--1.10.sql @@ -47,7 +47,15 @@ CREATE FUNCTION pg_stat_statements(IN showtext boolean, OUT temp_blk_write_time float8, OUT wal_records int8, OUT wal_fpi int8, - OUT wal_bytes numeric + OUT wal_bytes numeric, + OUT jit_functions int8, + OUT jit_generation_time float8, + OUT jit_inlining_count int8, + OUT jit_inlining_time float8, + OUT jit_optimization_count int8, + OUT jit_optimization_time float8, + OUT jit_emission_count int8, + OUT jit_emission_time float8 ) RETURNS SETOF record AS 'MODULE_PATHNAME', 'pg_stat_statements_1_10' diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 42ac001053..1ca67ef623 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -52,6 +52,7 @@ #include "common/hashfn.h" #include "executor/instrument.h" #include "funcapi.h" +#include "jit/jit.h" #include "mb/pg_wchar.h" #include "miscadmin.h" #include "optimizer/planner.h" @@ -188,6 +189,17 @@ typedef struct Counters int64 wal_records; /* # of WAL records generated */ int64 wal_fpi; /* # of WAL full page images generated */ uint64 wal_bytes; /* total amount of WAL generated in bytes */ + int64 jit_functions; /* total number of JIT functions emitted */ + double jit_generation_time; /* total time to generate jit code */ + int64 jit_inlining_count; /* number of times inlining time has been + * > 0 */ + double jit_inlining_time; /* total time to inline jit code */ + int64 jit_optimization_count; /* number of times optimization time + * has been > 0 */ + double jit_optimization_time; /* total time to optimize jit code */ + int64 jit_emission_count; /* number of times emission time has been + * > 0 */ + double jit_emission_time; /* total time to emit jit code */ } Counters; /* @@ -330,6 +342,7 @@ static void pgss_store(const char *query, uint64 queryId, double total_time, uint64 rows, const BufferUsage *bufusage, const WalUsage *walusage, + const struct JitInstrumentation *jitusage, JumbleState *jstate); static void pg_stat_statements_internal(FunctionCallInfo fcinfo, pgssVersion api_version, @@ -854,6 +867,7 @@ pgss_post_parse_analyze(ParseState *pstate, Query *query, JumbleState *jstate) 0, NULL, NULL, + NULL, jstate); } @@ -938,6 +952,7 @@ pgss_planner(Query *parse, 0, &bufusage, &walusage, + NULL, NULL); } else @@ -1056,6 +1071,7 @@ pgss_ExecutorEnd(QueryDesc *queryDesc) queryDesc->estate->es_processed, &queryDesc->totaltime->bufusage, &queryDesc->totaltime->walusage, + queryDesc->estate->es_jit ? &queryDesc->estate->es_jit->instr : NULL, NULL); } @@ -1173,6 +1189,7 @@ pgss_ProcessUtility(PlannedStmt *pstmt, const char *queryString, rows, &bufusage, &walusage, + NULL, NULL); } else @@ -1206,6 +1223,7 @@ pgss_store(const char *query, uint64 queryId, double total_time, uint64 rows, const BufferUsage *bufusage, const WalUsage *walusage, + const struct JitInstrumentation *jitusage, JumbleState *jstate) { pgssHashKey key; @@ -1375,6 +1393,23 @@ pgss_store(const char *query, uint64 queryId, e->counters.wal_records += walusage->wal_records; e->counters.wal_fpi += walusage->wal_fpi; e->counters.wal_bytes += walusage->wal_bytes; + if (jitusage) + { + e->counters.jit_functions += jitusage->created_functions; + e->counters.jit_generation_time += INSTR_TIME_GET_MILLISEC(jitusage->generation_counter); + + if (INSTR_TIME_GET_MILLISEC(jitusage->inlining_counter)) + e->counters.jit_inlining_count++; + e->counters.jit_inlining_time += INSTR_TIME_GET_MILLISEC(jitusage->inlining_counter); + + if (INSTR_TIME_GET_MILLISEC(jitusage->optimization_counter)) + e->counters.jit_optimization_count++; + e->counters.jit_optimization_time += INSTR_TIME_GET_MILLISEC(jitusage->optimization_counter); + + if (INSTR_TIME_GET_MILLISEC(jitusage->emission_counter)) + e->counters.jit_emission_count++; + e->counters.jit_emission_time += INSTR_TIME_GET_MILLISEC(jitusage->emission_counter); + } SpinLockRelease(&e->mutex); } @@ -1424,8 +1459,8 @@ pg_stat_statements_reset(PG_FUNCTION_ARGS) #define PG_STAT_STATEMENTS_COLS_V1_3 23 #define PG_STAT_STATEMENTS_COLS_V1_8 32 #define PG_STAT_STATEMENTS_COLS_V1_9 33 -#define PG_STAT_STATEMENTS_COLS_V1_10 35 -#define PG_STAT_STATEMENTS_COLS 35 /* maximum of above */ +#define PG_STAT_STATEMENTS_COLS_V1_10 43 +#define PG_STAT_STATEMENTS_COLS 43 /* maximum of above */ /* * Retrieve statement statistics. @@ -1786,6 +1821,17 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, Int32GetDatum(-1)); values[i++] = wal_bytes; } + if (api_version >= PGSS_V1_10) + { + values[i++] = Int64GetDatumFast(tmp.jit_functions); + values[i++] = Float8GetDatumFast(tmp.jit_generation_time); + values[i++] = Int64GetDatumFast(tmp.jit_inlining_count); + values[i++] = Float8GetDatumFast(tmp.jit_inlining_time); + values[i++] = Int64GetDatumFast(tmp.jit_optimization_count); + values[i++] = Float8GetDatumFast(tmp.jit_optimization_time); + values[i++] = Int64GetDatumFast(tmp.jit_emission_count); + values[i++] = Float8GetDatumFast(tmp.jit_emission_time); + } Assert(i == (api_version == PGSS_V1_0 ? PG_STAT_STATEMENTS_COLS_V1_0 : api_version == PGSS_V1_1 ? PG_STAT_STATEMENTS_COLS_V1_1 : diff --git a/doc/src/sgml/pgstatstatements.sgml b/doc/src/sgml/pgstatstatements.sgml index 0ead2464d8..45e720e995 100644 --- a/doc/src/sgml/pgstatstatements.sgml +++ b/doc/src/sgml/pgstatstatements.sgml @@ -401,6 +401,78 @@ Total amount of WAL generated by the statement in bytes + + + + jit_functions bigint + + + Total number of functions JIT-compiled by the statement + + + + + + jit_generation_time bigint + + + Total time spent by the statement on generating JIT code, in milliseconds + + + + + + jit_inlining_count bigint + + + Number of times functions have been inlined + + + + + + jit_inlining_time bigint + + + Total time spent by the statement on inlining functions, in milliseconds + + + + + + jit_optimization_count bigint + + + Number of times the statement has been optimized + + + + + + jit_optimization_time bigint + + + Total time spent by the statement on optimizing, in milliseconds + + + + + + jit_emission_count bigint + + + Number of times code has been emitted + + + + + + jit_emission_time bigint + + + Total time spent by the statement on emitting code, in milliseconds + +
From 80900d4690916a30f278d877eb5a7a42b14c3f0a Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 8 Apr 2022 08:06:10 -0400 Subject: [PATCH 459/772] Helper script to apply PGDLLIMPORT markings. This script isn't terribly smart and won't necessarily catch every case, but it catches many of them and is better than a totally manual approach. Patch by me, reviewed by Andrew Dunstan. Discussion: http://postgr.es/m/CA+TgmoYanc1_FSfimhgiWSqVyP5KKmh5NP2BWNwDhO8Pg2vGYQ@mail.gmail.com --- src/tools/mark_pgdllimport.pl | 75 +++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 src/tools/mark_pgdllimport.pl diff --git a/src/tools/mark_pgdllimport.pl b/src/tools/mark_pgdllimport.pl new file mode 100755 index 0000000000..3152c1428b --- /dev/null +++ b/src/tools/mark_pgdllimport.pl @@ -0,0 +1,75 @@ +#!/usr/bin/perl + +#---------------------------------------------------------------------- +# +# mark_pgdllimport.pl +# Perl script that tries to add PGDLLIMPORT markings to PostgreSQL +# header files. +# +# This relies on a few idiosyncracies of the PostgreSQL cding style, +# such as the fact that we always use "extern" in function +# declarations, and that we don't use // comments. It's not very +# smart and may not catch all cases. +# +# It's probably a good idea to run pgindent on any files that this +# script modifies before committing. +# +# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group +# Portions Copyright (c) 1994, Regents of the University of California +# +# src/tools/mark_pgdllimport.pl +# +#---------------------------------------------------------------------- + +use strict; +use warnings; + +for my $include_file (@ARGV) +{ + open(my $rfh, '<', $include_file) || die "$include_file: $!"; + my $buffer = ''; + my $num_pgdllimport_added = 0; + + while (my $raw_line = <$rfh>) + { + my $needs_pgdllimport = 1; + + # By convention we declare global variables explicitly extern. We're + # looking for those not already marked with PGDLLIMPORT. + $needs_pgdllimport = 0 if $raw_line !~ /^extern\s+/ + || $raw_line =~ /PGDLLIMPORT/; + + # Make a copy of the line and perform a simple-minded comment strip. + # Also strip trailing whitespace. + my $stripped_line = $raw_line; + $stripped_line =~ s/\/\*.*\*\///g; + $stripped_line =~ s/\s+$//; + + # Variable declarations should end in a semicolon. If we see an + # opening parenthesis, it's probably a function declaration. + $needs_pgdllimport = 0 if $stripped_line !~ /;$/ + || $stripped_line =~ /\(/; + + # Add PGDLLIMPORT marker, if required. + if ($needs_pgdllimport) + { + $raw_line =~ s/^extern/extern PGDLLIMPORT/; + ++$num_pgdllimport_added; + } + + # Add line to buffer. + $buffer .= $raw_line; + } + + close($rfh); + + # If we added any PGDLLIMPORT markers, rewrite the file. + if ($num_pgdllimport_added > 0) + { + printf "%s: adding %d PGDLLIMPORT markers\n", + $include_file, $num_pgdllimport_added; + open(my $wfh, '>', $include_file) || die "$include_file: $!"; + print $wfh $buffer; + close($wfh); + } +} From 8ec569479fc28ddd634a13dc100b36352ec3a3c2 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 8 Apr 2022 08:16:38 -0400 Subject: [PATCH 460/772] Apply PGDLLIMPORT markings broadly. Up until now, we've had a policy of only marking certain variables in the PostgreSQL header files with PGDLLIMPORT, but now we've decided to mark them all. This means that extensions running on Windows should no longer operate at a disadvantage as compared to extensions running on Linux: if the variable is present in a header file, it should be accessible. Discussion: http://postgr.es/m/CA+TgmoYanc1_FSfimhgiWSqVyP5KKmh5NP2BWNwDhO8Pg2vGYQ@mail.gmail.com --- src/include/access/gin.h | 2 +- src/include/access/parallel.h | 2 +- src/include/access/session.h | 2 +- src/include/access/tableam.h | 4 +- src/include/access/toast_compression.h | 2 +- src/include/access/twophase_rmgr.h | 8 +-- src/include/access/xact.h | 16 +++--- src/include/access/xlog.h | 56 +++++++++---------- src/include/access/xlog_internal.h | 8 +-- src/include/access/xlogprefetcher.h | 2 +- src/include/access/xlogrecovery.h | 42 +++++++------- src/include/access/xlogutils.h | 4 +- src/include/bootstrap/bootstrap.h | 6 +- src/include/catalog/namespace.h | 2 +- src/include/catalog/objectaddress.h | 2 +- src/include/catalog/storage.h | 2 +- src/include/commands/async.h | 4 +- src/include/commands/tablespace.h | 2 +- src/include/commands/user.h | 2 +- src/include/commands/vacuum.h | 18 +++--- src/include/common/file_perm.h | 6 +- src/include/common/jsonapi.h | 2 +- src/include/common/logging.h | 2 +- src/include/common/pg_lzcompress.h | 4 +- src/include/common/relpath.h | 2 +- src/include/fe_utils/cancel.h | 2 +- src/include/fe_utils/print.h | 9 +-- src/include/fe_utils/string_utils.h | 2 +- src/include/fmgr.h | 2 +- src/include/jit/jit.h | 20 +++---- src/include/jit/llvmjit.h | 44 +++++++-------- src/include/libpq/auth.h | 6 +- src/include/libpq/libpq-be.h | 2 +- src/include/libpq/libpq.h | 28 +++++----- src/include/libpq/pqcomm.h | 2 +- src/include/libpq/scram.h | 2 +- src/include/mb/pg_wchar.h | 6 +- src/include/miscadmin.h | 54 +++++++++--------- src/include/nodes/readfuncs.h | 2 +- src/include/optimizer/geqo.h | 11 ++-- src/include/optimizer/optimizer.h | 4 +- src/include/optimizer/planmain.h | 6 +- src/include/parser/parse_expr.h | 2 +- src/include/parser/parser.h | 4 +- src/include/pg_getopt.h | 10 ++-- src/include/pgstat.h | 16 +++--- src/include/pgtime.h | 2 +- src/include/port/win32_port.h | 6 +- src/include/port/win32ntdll.h | 4 +- src/include/postmaster/autovacuum.h | 32 +++++------ src/include/postmaster/bgworker_internals.h | 2 +- src/include/postmaster/bgwriter.h | 8 +-- src/include/postmaster/pgarch.h | 8 +-- src/include/postmaster/postmaster.h | 34 +++++------ src/include/postmaster/startup.h | 2 +- src/include/postmaster/syslogger.h | 14 ++--- src/include/postmaster/walwriter.h | 4 +- src/include/replication/logicallauncher.h | 4 +- src/include/replication/syncrep.h | 8 +-- src/include/replication/walreceiver.h | 8 +-- src/include/replication/walsender.h | 14 ++--- src/include/replication/walsender_private.h | 6 +- src/include/replication/worker_internal.h | 10 ++-- src/include/storage/buf_internals.h | 4 +- src/include/storage/bufmgr.h | 20 +++---- src/include/storage/dsm_impl.h | 4 +- src/include/storage/fd.h | 4 +- src/include/storage/large_object.h | 2 +- src/include/storage/lock.h | 14 ++--- src/include/storage/lwlock.h | 4 +- src/include/storage/pg_shmem.h | 14 ++--- src/include/storage/pmsignal.h | 2 +- src/include/storage/predicate.h | 6 +- src/include/storage/proc.h | 4 +- src/include/storage/s_lock.h | 2 +- src/include/storage/sinval.h | 4 +- src/include/storage/spin.h | 2 +- src/include/storage/standby.h | 8 +-- src/include/tcop/tcopprot.h | 8 +-- src/include/tsearch/ts_cache.h | 2 +- src/include/tsearch/ts_type.h | 2 +- src/include/utils/array.h | 2 +- src/include/utils/builtins.h | 2 +- src/include/utils/bytea.h | 3 +- src/include/utils/datetime.h | 7 ++- src/include/utils/elog.h | 12 ++-- src/include/utils/fmgrtab.h | 9 +-- src/include/utils/guc.h | 62 ++++++++++----------- src/include/utils/guc_tables.h | 8 +-- src/include/utils/jsonpath.h | 2 +- src/include/utils/pg_locale.h | 18 +++--- src/include/utils/pgstat_internal.h | 4 +- src/include/utils/plancache.h | 2 +- src/include/utils/ps_status.h | 2 +- src/include/utils/queryjumble.h | 4 +- src/include/utils/relcache.h | 4 +- src/include/utils/rls.h | 2 +- src/include/utils/snapmgr.h | 2 +- src/include/utils/timestamp.h | 4 +- src/include/utils/xml.h | 6 +- 100 files changed, 434 insertions(+), 429 deletions(-) diff --git a/src/include/access/gin.h b/src/include/access/gin.h index e83e0acd92..aacc665fdc 100644 --- a/src/include/access/gin.h +++ b/src/include/access/gin.h @@ -68,7 +68,7 @@ typedef char GinTernaryValue; /* GUC parameters */ extern PGDLLIMPORT int GinFuzzySearchLimit; -extern int gin_pending_list_limit; +extern PGDLLIMPORT int gin_pending_list_limit; /* ginutil.c */ extern void ginGetStats(Relation index, GinStatsData *stats); diff --git a/src/include/access/parallel.h b/src/include/access/parallel.h index 30786820f8..983841d45e 100644 --- a/src/include/access/parallel.h +++ b/src/include/access/parallel.h @@ -54,7 +54,7 @@ typedef struct ParallelWorkerContext shm_toc *toc; } ParallelWorkerContext; -extern volatile bool ParallelMessagePending; +extern PGDLLIMPORT volatile bool ParallelMessagePending; extern PGDLLIMPORT int ParallelWorkerNumber; extern PGDLLIMPORT bool InitializingParallelWorker; diff --git a/src/include/access/session.h b/src/include/access/session.h index 0ed52d4821..775888bbb0 100644 --- a/src/include/access/session.h +++ b/src/include/access/session.h @@ -39,6 +39,6 @@ extern void AttachSession(dsm_handle handle); extern void DetachSession(void); /* The current session, or NULL for none. */ -extern Session *CurrentSession; +extern PGDLLIMPORT Session *CurrentSession; #endif /* SESSION_H */ diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index bb365736b7..fe869c6c18 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -28,8 +28,8 @@ #define DEFAULT_TABLE_ACCESS_METHOD "heap" /* GUCs */ -extern char *default_table_access_method; -extern bool synchronize_seqscans; +extern PGDLLIMPORT char *default_table_access_method; +extern PGDLLIMPORT bool synchronize_seqscans; struct BulkInsertStateData; diff --git a/src/include/access/toast_compression.h b/src/include/access/toast_compression.h index 9b433c7721..deb8f99da5 100644 --- a/src/include/access/toast_compression.h +++ b/src/include/access/toast_compression.h @@ -20,7 +20,7 @@ * but the value is one of the char values defined below, as they appear in * pg_attribute.attcompression, e.g. TOAST_PGLZ_COMPRESSION. */ -extern int default_toast_compression; +extern PGDLLIMPORT int default_toast_compression; /* * Built-in compression method ID. The toast compression header will store diff --git a/src/include/access/twophase_rmgr.h b/src/include/access/twophase_rmgr.h index 284c7539f8..96381a5e3f 100644 --- a/src/include/access/twophase_rmgr.h +++ b/src/include/access/twophase_rmgr.h @@ -28,10 +28,10 @@ typedef uint8 TwoPhaseRmgrId; #define TWOPHASE_RM_PREDICATELOCK_ID 4 #define TWOPHASE_RM_MAX_ID TWOPHASE_RM_PREDICATELOCK_ID -extern const TwoPhaseCallback twophase_recover_callbacks[]; -extern const TwoPhaseCallback twophase_postcommit_callbacks[]; -extern const TwoPhaseCallback twophase_postabort_callbacks[]; -extern const TwoPhaseCallback twophase_standby_recover_callbacks[]; +extern PGDLLIMPORT const TwoPhaseCallback twophase_recover_callbacks[]; +extern PGDLLIMPORT const TwoPhaseCallback twophase_postcommit_callbacks[]; +extern PGDLLIMPORT const TwoPhaseCallback twophase_postabort_callbacks[]; +extern PGDLLIMPORT const TwoPhaseCallback twophase_standby_recover_callbacks[]; extern void RegisterTwoPhaseRecord(TwoPhaseRmgrId rmid, uint16 info, diff --git a/src/include/access/xact.h b/src/include/access/xact.h index 4e1e873501..837fe7de0b 100644 --- a/src/include/access/xact.h +++ b/src/include/access/xact.h @@ -38,7 +38,7 @@ #define XACT_REPEATABLE_READ 2 #define XACT_SERIALIZABLE 3 -extern int DefaultXactIsoLevel; +extern PGDLLIMPORT int DefaultXactIsoLevel; extern PGDLLIMPORT int XactIsoLevel; /* @@ -52,18 +52,18 @@ extern PGDLLIMPORT int XactIsoLevel; #define IsolationIsSerializable() (XactIsoLevel == XACT_SERIALIZABLE) /* Xact read-only state */ -extern bool DefaultXactReadOnly; -extern bool XactReadOnly; +extern PGDLLIMPORT bool DefaultXactReadOnly; +extern PGDLLIMPORT bool XactReadOnly; /* flag for logging statements in this transaction */ -extern bool xact_is_sampled; +extern PGDLLIMPORT bool xact_is_sampled; /* * Xact is deferrable -- only meaningful (currently) for read only * SERIALIZABLE transactions */ -extern bool DefaultXactDeferrable; -extern bool XactDeferrable; +extern PGDLLIMPORT bool DefaultXactDeferrable; +extern PGDLLIMPORT bool XactDeferrable; typedef enum { @@ -80,7 +80,7 @@ typedef enum #define SYNCHRONOUS_COMMIT_ON SYNCHRONOUS_COMMIT_REMOTE_FLUSH /* Synchronous commit level */ -extern int synchronous_commit; +extern PGDLLIMPORT int synchronous_commit; /* used during logical streaming of a transaction */ extern PGDLLIMPORT TransactionId CheckXidAlive; @@ -93,7 +93,7 @@ extern PGDLLIMPORT bool bsysscan; * globally accessible, so can be set from anywhere in the code which requires * recording flags. */ -extern int MyXactFlags; +extern PGDLLIMPORT int MyXactFlags; /* * XACT_FLAGS_ACCESSEDTEMPNAMESPACE - set when a temporary object is accessed. diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index 5e1e3446ae..d9f2487a96 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -24,35 +24,35 @@ #define SYNC_METHOD_OPEN 2 /* for O_SYNC */ #define SYNC_METHOD_FSYNC_WRITETHROUGH 3 #define SYNC_METHOD_OPEN_DSYNC 4 /* for O_DSYNC */ -extern int sync_method; +extern PGDLLIMPORT int sync_method; -extern XLogRecPtr ProcLastRecPtr; -extern XLogRecPtr XactLastRecEnd; +extern PGDLLIMPORT XLogRecPtr ProcLastRecPtr; +extern PGDLLIMPORT XLogRecPtr XactLastRecEnd; extern PGDLLIMPORT XLogRecPtr XactLastCommitEnd; /* these variables are GUC parameters related to XLOG */ -extern PGDLLIMPORT int wal_segment_size; -extern int min_wal_size_mb; -extern int max_wal_size_mb; -extern int wal_keep_size_mb; -extern int max_slot_wal_keep_size_mb; -extern int XLOGbuffers; -extern int XLogArchiveTimeout; -extern int wal_retrieve_retry_interval; -extern char *XLogArchiveCommand; -extern bool EnableHotStandby; -extern bool fullPageWrites; -extern bool wal_log_hints; -extern int wal_compression; -extern bool wal_init_zero; -extern bool wal_recycle; -extern bool *wal_consistency_checking; -extern char *wal_consistency_checking_string; -extern bool log_checkpoints; -extern bool track_wal_io_timing; -extern int wal_decode_buffer_size; - -extern int CheckPointSegments; +extern PGDLLIMPORT int wal_segment_size; +extern PGDLLIMPORT int min_wal_size_mb; +extern PGDLLIMPORT int max_wal_size_mb; +extern PGDLLIMPORT int wal_keep_size_mb; +extern PGDLLIMPORT int max_slot_wal_keep_size_mb; +extern PGDLLIMPORT int XLOGbuffers; +extern PGDLLIMPORT int XLogArchiveTimeout; +extern PGDLLIMPORT int wal_retrieve_retry_interval; +extern PGDLLIMPORT char *XLogArchiveCommand; +extern PGDLLIMPORT bool EnableHotStandby; +extern PGDLLIMPORT bool fullPageWrites; +extern PGDLLIMPORT bool wal_log_hints; +extern PGDLLIMPORT int wal_compression; +extern PGDLLIMPORT bool wal_init_zero; +extern PGDLLIMPORT bool wal_recycle; +extern PGDLLIMPORT bool *wal_consistency_checking; +extern PGDLLIMPORT char *wal_consistency_checking_string; +extern PGDLLIMPORT bool log_checkpoints; +extern PGDLLIMPORT bool track_wal_io_timing; +extern PGDLLIMPORT int wal_decode_buffer_size; + +extern PGDLLIMPORT int CheckPointSegments; /* Archive modes */ typedef enum ArchiveMode @@ -61,7 +61,7 @@ typedef enum ArchiveMode ARCHIVE_MODE_ON, /* enabled while server is running normally */ ARCHIVE_MODE_ALWAYS /* enabled always (even during recovery) */ } ArchiveMode; -extern int XLogArchiveMode; +extern PGDLLIMPORT int XLogArchiveMode; /* WAL levels */ typedef enum WalLevel @@ -121,7 +121,7 @@ extern PGDLLIMPORT int wal_level; #define XLogLogicalInfoActive() (wal_level >= WAL_LEVEL_LOGICAL) #ifdef WAL_DEBUG -extern bool XLOG_DEBUG; +extern PGDLLIMPORT bool XLOG_DEBUG; #endif /* @@ -175,7 +175,7 @@ typedef struct CheckpointStatsData * entire sync phase. */ } CheckpointStatsData; -extern CheckpointStatsData CheckpointStats; +extern PGDLLIMPORT CheckpointStatsData CheckpointStats; /* * GetWALAvailability return codes diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h index 750f634120..fae0bef8f5 100644 --- a/src/include/access/xlog_internal.h +++ b/src/include/access/xlog_internal.h @@ -358,9 +358,9 @@ extern void XLogRecGetBlockRefInfo(XLogReaderState *record, bool pretty, * Exported for the functions in timeline.c and xlogarchive.c. Only valid * in the startup process. */ -extern bool ArchiveRecoveryRequested; -extern bool InArchiveRecovery; -extern bool StandbyMode; -extern char *recoveryRestoreCommand; +extern PGDLLIMPORT bool ArchiveRecoveryRequested; +extern PGDLLIMPORT bool InArchiveRecovery; +extern PGDLLIMPORT bool StandbyMode; +extern PGDLLIMPORT char *recoveryRestoreCommand; #endif /* XLOG_INTERNAL_H */ diff --git a/src/include/access/xlogprefetcher.h b/src/include/access/xlogprefetcher.h index 80283a8fc2..fdd67fcedd 100644 --- a/src/include/access/xlogprefetcher.h +++ b/src/include/access/xlogprefetcher.h @@ -18,7 +18,7 @@ #include "access/xlogrecord.h" /* GUCs */ -extern int recovery_prefetch; +extern PGDLLIMPORT int recovery_prefetch; /* Possible values for recovery_prefetch */ typedef enum diff --git a/src/include/access/xlogrecovery.h b/src/include/access/xlogrecovery.h index 75a0f5fe5e..0aa85d90e8 100644 --- a/src/include/access/xlogrecovery.h +++ b/src/include/access/xlogrecovery.h @@ -49,33 +49,33 @@ typedef enum RecoveryPauseState } RecoveryPauseState; /* User-settable GUC parameters */ -extern bool recoveryTargetInclusive; -extern int recoveryTargetAction; -extern int recovery_min_apply_delay; -extern char *PrimaryConnInfo; -extern char *PrimarySlotName; -extern char *recoveryRestoreCommand; -extern char *recoveryEndCommand; -extern char *archiveCleanupCommand; +extern PGDLLIMPORT bool recoveryTargetInclusive; +extern PGDLLIMPORT int recoveryTargetAction; +extern PGDLLIMPORT int recovery_min_apply_delay; +extern PGDLLIMPORT char *PrimaryConnInfo; +extern PGDLLIMPORT char *PrimarySlotName; +extern PGDLLIMPORT char *recoveryRestoreCommand; +extern PGDLLIMPORT char *recoveryEndCommand; +extern PGDLLIMPORT char *archiveCleanupCommand; /* indirectly set via GUC system */ -extern TransactionId recoveryTargetXid; -extern char *recovery_target_time_string; -extern TimestampTz recoveryTargetTime; -extern const char *recoveryTargetName; -extern XLogRecPtr recoveryTargetLSN; -extern RecoveryTargetType recoveryTarget; -extern char *PromoteTriggerFile; -extern bool wal_receiver_create_temp_slot; -extern RecoveryTargetTimeLineGoal recoveryTargetTimeLineGoal; -extern TimeLineID recoveryTargetTLIRequested; -extern TimeLineID recoveryTargetTLI; +extern PGDLLIMPORT TransactionId recoveryTargetXid; +extern PGDLLIMPORT char *recovery_target_time_string; +extern PGDLLIMPORT TimestampTz recoveryTargetTime; +extern PGDLLIMPORT const char *recoveryTargetName; +extern PGDLLIMPORT XLogRecPtr recoveryTargetLSN; +extern PGDLLIMPORT RecoveryTargetType recoveryTarget; +extern PGDLLIMPORT char *PromoteTriggerFile; +extern PGDLLIMPORT bool wal_receiver_create_temp_slot; +extern PGDLLIMPORT RecoveryTargetTimeLineGoal recoveryTargetTimeLineGoal; +extern PGDLLIMPORT TimeLineID recoveryTargetTLIRequested; +extern PGDLLIMPORT TimeLineID recoveryTargetTLI; /* Have we already reached a consistent database state? */ -extern bool reachedConsistency; +extern PGDLLIMPORT bool reachedConsistency; /* Are we currently in standby mode? */ -extern bool StandbyMode; +extern PGDLLIMPORT bool StandbyMode; extern Size XLogRecoveryShmemSize(void); extern void XLogRecoveryShmemInit(void); diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 3746e31e40..761625acf4 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -21,7 +21,7 @@ * potentially perform work during recovery should check RecoveryInProgress(). * See XLogCtl notes in xlog.c. */ -extern bool InRecovery; +extern PGDLLIMPORT bool InRecovery; /* * Like InRecovery, standbyState is only valid in the startup process. @@ -52,7 +52,7 @@ typedef enum STANDBY_SNAPSHOT_READY } HotStandbyState; -extern HotStandbyState standbyState; +extern PGDLLIMPORT HotStandbyState standbyState; #define InHotStandby (standbyState >= STANDBY_SNAPSHOT_PENDING) diff --git a/src/include/bootstrap/bootstrap.h b/src/include/bootstrap/bootstrap.h index 471414909f..49d4ad560f 100644 --- a/src/include/bootstrap/bootstrap.h +++ b/src/include/bootstrap/bootstrap.h @@ -27,9 +27,9 @@ #define BOOTCOL_NULL_FORCE_NULL 2 #define BOOTCOL_NULL_FORCE_NOT_NULL 3 -extern Relation boot_reldesc; -extern Form_pg_attribute attrtypes[MAXATTR]; -extern int numattr; +extern PGDLLIMPORT Relation boot_reldesc; +extern PGDLLIMPORT Form_pg_attribute attrtypes[MAXATTR]; +extern PGDLLIMPORT int numattr; extern void BootstrapModeMain(int argc, char *argv[], bool check_only) pg_attribute_noreturn(); diff --git a/src/include/catalog/namespace.h b/src/include/catalog/namespace.h index f963d82797..1bc55c01a5 100644 --- a/src/include/catalog/namespace.h +++ b/src/include/catalog/namespace.h @@ -182,7 +182,7 @@ extern void AtEOSubXact_Namespace(bool isCommit, SubTransactionId mySubid, SubTransactionId parentSubid); /* stuff for search_path GUC variable */ -extern char *namespace_search_path; +extern PGDLLIMPORT char *namespace_search_path; extern List *fetch_search_path(bool includeImplicit); extern int fetch_search_path_array(Oid *sarray, int sarray_len); diff --git a/src/include/catalog/objectaddress.h b/src/include/catalog/objectaddress.h index 274f300054..cf4d8b3107 100644 --- a/src/include/catalog/objectaddress.h +++ b/src/include/catalog/objectaddress.h @@ -28,7 +28,7 @@ typedef struct ObjectAddress int32 objectSubId; /* Subitem within object (eg column), or 0 */ } ObjectAddress; -extern const ObjectAddress InvalidObjectAddress; +extern PGDLLIMPORT const ObjectAddress InvalidObjectAddress; #define ObjectAddressSubSet(addr, class_id, object_id, object_sub_id) \ do { \ diff --git a/src/include/catalog/storage.h b/src/include/catalog/storage.h index 844a023b2c..59f3404ac6 100644 --- a/src/include/catalog/storage.h +++ b/src/include/catalog/storage.h @@ -20,7 +20,7 @@ #include "utils/relcache.h" /* GUC variables */ -extern int wal_skip_threshold; +extern PGDLLIMPORT int wal_skip_threshold; extern SMgrRelation RelationCreateStorage(RelFileNode rnode, char relpersistence, diff --git a/src/include/commands/async.h b/src/include/commands/async.h index ebc9271789..926af933d1 100644 --- a/src/include/commands/async.h +++ b/src/include/commands/async.h @@ -20,8 +20,8 @@ */ #define NUM_NOTIFY_BUFFERS 8 -extern bool Trace_notify; -extern volatile sig_atomic_t notifyInterruptPending; +extern PGDLLIMPORT bool Trace_notify; +extern PGDLLIMPORT volatile sig_atomic_t notifyInterruptPending; extern Size AsyncShmemSize(void); extern void AsyncShmemInit(void); diff --git a/src/include/commands/tablespace.h b/src/include/commands/tablespace.h index 323528ebb8..24b647332d 100644 --- a/src/include/commands/tablespace.h +++ b/src/include/commands/tablespace.h @@ -19,7 +19,7 @@ #include "lib/stringinfo.h" #include "nodes/parsenodes.h" -extern bool allow_in_place_tablespaces; +extern PGDLLIMPORT bool allow_in_place_tablespaces; /* XLOG stuff */ #define XLOG_TBLSPC_CREATE 0x00 diff --git a/src/include/commands/user.h b/src/include/commands/user.h index 0b7a3cd65f..d3dd8303d2 100644 --- a/src/include/commands/user.h +++ b/src/include/commands/user.h @@ -17,7 +17,7 @@ #include "parser/parse_node.h" /* GUC. Is actually of type PasswordType. */ -extern int Password_encryption; +extern PGDLLIMPORT int Password_encryption; /* Hook to check passwords in CreateRole() and AlterRole() */ typedef void (*check_password_hook_type) (const char *username, const char *shadow_pass, PasswordType password_type, Datum validuntil_time, bool validuntil_null); diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index ead88edda7..f38e1148f9 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -252,17 +252,17 @@ typedef struct VacDeadItems /* GUC parameters */ extern PGDLLIMPORT int default_statistics_target; /* PGDLLIMPORT for PostGIS */ -extern int vacuum_freeze_min_age; -extern int vacuum_freeze_table_age; -extern int vacuum_multixact_freeze_min_age; -extern int vacuum_multixact_freeze_table_age; -extern int vacuum_failsafe_age; -extern int vacuum_multixact_failsafe_age; +extern PGDLLIMPORT int vacuum_freeze_min_age; +extern PGDLLIMPORT int vacuum_freeze_table_age; +extern PGDLLIMPORT int vacuum_multixact_freeze_min_age; +extern PGDLLIMPORT int vacuum_multixact_freeze_table_age; +extern PGDLLIMPORT int vacuum_failsafe_age; +extern PGDLLIMPORT int vacuum_multixact_failsafe_age; /* Variables for cost-based parallel vacuum */ -extern pg_atomic_uint32 *VacuumSharedCostBalance; -extern pg_atomic_uint32 *VacuumActiveNWorkers; -extern int VacuumCostBalanceLocal; +extern PGDLLIMPORT pg_atomic_uint32 *VacuumSharedCostBalance; +extern PGDLLIMPORT pg_atomic_uint32 *VacuumActiveNWorkers; +extern PGDLLIMPORT int VacuumCostBalanceLocal; /* in commands/vacuum.c */ diff --git a/src/include/common/file_perm.h b/src/include/common/file_perm.h index 85d32ed141..48d68ef276 100644 --- a/src/include/common/file_perm.h +++ b/src/include/common/file_perm.h @@ -41,11 +41,11 @@ #define PG_FILE_MODE_GROUP (S_IRUSR | S_IWUSR | S_IRGRP) /* Modes for creating directories and files in the data directory */ -extern int pg_dir_create_mode; -extern int pg_file_create_mode; +extern PGDLLIMPORT int pg_dir_create_mode; +extern PGDLLIMPORT int pg_file_create_mode; /* Mode mask to pass to umask() */ -extern int pg_mode_mask; +extern PGDLLIMPORT int pg_mode_mask; /* Set permissions and mask based on the provided mode */ extern void SetDataDirectoryCreatePerm(int dataDirMode); diff --git a/src/include/common/jsonapi.h b/src/include/common/jsonapi.h index 52cb4a9339..8d31630e5c 100644 --- a/src/include/common/jsonapi.h +++ b/src/include/common/jsonapi.h @@ -128,7 +128,7 @@ extern JsonParseErrorType pg_parse_json(JsonLexContext *lex, JsonSemAction *sem); /* the null action object used for pure validation */ -extern JsonSemAction nullSemAction; +extern PGDLLIMPORT JsonSemAction nullSemAction; /* * json_count_array_elements performs a fast secondary parse to determine the diff --git a/src/include/common/logging.h b/src/include/common/logging.h index 43cc79afa8..61cfdce653 100644 --- a/src/include/common/logging.h +++ b/src/include/common/logging.h @@ -55,7 +55,7 @@ enum pg_log_level PG_LOG_OFF, }; -extern enum pg_log_level __pg_log_level; +extern PGDLLIMPORT enum pg_log_level __pg_log_level; /* * Kind of a hack to be able to produce the psql output exactly as required by diff --git a/src/include/common/pg_lzcompress.h b/src/include/common/pg_lzcompress.h index 3e53fbe97b..2a12b33a00 100644 --- a/src/include/common/pg_lzcompress.h +++ b/src/include/common/pg_lzcompress.h @@ -75,8 +75,8 @@ typedef struct PGLZ_Strategy * output would be larger than input. * ---------- */ -extern const PGLZ_Strategy *const PGLZ_strategy_default; -extern const PGLZ_Strategy *const PGLZ_strategy_always; +extern PGDLLIMPORT const PGLZ_Strategy *const PGLZ_strategy_default; +extern PGDLLIMPORT const PGLZ_Strategy *const PGLZ_strategy_always; /* ---------- diff --git a/src/include/common/relpath.h b/src/include/common/relpath.h index a4b5dc853b..13849a3790 100644 --- a/src/include/common/relpath.h +++ b/src/include/common/relpath.h @@ -56,7 +56,7 @@ typedef enum ForkNumber #define FORKNAMECHARS 4 /* max chars for a fork name */ -extern const char *const forkNames[]; +extern PGDLLIMPORT const char *const forkNames[]; extern ForkNumber forkname_to_number(const char *forkName); extern int forkname_chars(const char *str, ForkNumber *fork); diff --git a/src/include/fe_utils/cancel.h b/src/include/fe_utils/cancel.h index 7005b804bc..3b84daf6eb 100644 --- a/src/include/fe_utils/cancel.h +++ b/src/include/fe_utils/cancel.h @@ -18,7 +18,7 @@ #include "libpq-fe.h" -extern volatile sig_atomic_t CancelRequested; +extern PGDLLIMPORT volatile sig_atomic_t CancelRequested; extern void SetCancelConn(PGconn *conn); extern void ResetCancelConn(void); diff --git a/src/include/fe_utils/print.h b/src/include/fe_utils/print.h index 836b4e29a8..bb2f1bf4e6 100644 --- a/src/include/fe_utils/print.h +++ b/src/include/fe_utils/print.h @@ -177,11 +177,12 @@ typedef struct printQueryOpt } printQueryOpt; -extern volatile sig_atomic_t cancel_pressed; +extern PGDLLIMPORT volatile sig_atomic_t cancel_pressed; -extern const printTextFormat pg_asciiformat; -extern const printTextFormat pg_asciiformat_old; -extern printTextFormat pg_utf8format; /* ideally would be const, but... */ +extern PGDLLIMPORT const printTextFormat pg_asciiformat; +extern PGDLLIMPORT const printTextFormat pg_asciiformat_old; +extern PGDLLIMPORT printTextFormat pg_utf8format; /* ideally would be const, + * but... */ extern void disable_sigpipe_trap(void); diff --git a/src/include/fe_utils/string_utils.h b/src/include/fe_utils/string_utils.h index 3c88250e6c..b9b8708dab 100644 --- a/src/include/fe_utils/string_utils.h +++ b/src/include/fe_utils/string_utils.h @@ -20,7 +20,7 @@ #include "pqexpbuffer.h" /* Global variables controlling behavior of fmtId() and fmtQualifiedId() */ -extern int quote_all_identifiers; +extern PGDLLIMPORT int quote_all_identifiers; extern PQExpBuffer (*getLocalPQExpBuffer) (void); /* Functions */ diff --git a/src/include/fmgr.h b/src/include/fmgr.h index 6560e462d6..a1cf4bd646 100644 --- a/src/include/fmgr.h +++ b/src/include/fmgr.h @@ -721,7 +721,7 @@ extern bool CheckFunctionValidatorAccess(Oid validatorOid, Oid functionOid); /* * Routines in dfmgr.c */ -extern char *Dynamic_library_path; +extern PGDLLIMPORT char *Dynamic_library_path; extern void *load_external_function(const char *filename, const char *funcname, bool signalNotFound, void **filehandle); diff --git a/src/include/jit/jit.h b/src/include/jit/jit.h index 707176d9ed..d194033209 100644 --- a/src/include/jit/jit.h +++ b/src/include/jit/jit.h @@ -79,16 +79,16 @@ struct JitProviderCallbacks /* GUCs */ -extern bool jit_enabled; -extern char *jit_provider; -extern bool jit_debugging_support; -extern bool jit_dump_bitcode; -extern bool jit_expressions; -extern bool jit_profiling_support; -extern bool jit_tuple_deforming; -extern double jit_above_cost; -extern double jit_inline_above_cost; -extern double jit_optimize_above_cost; +extern PGDLLIMPORT bool jit_enabled; +extern PGDLLIMPORT char *jit_provider; +extern PGDLLIMPORT bool jit_debugging_support; +extern PGDLLIMPORT bool jit_dump_bitcode; +extern PGDLLIMPORT bool jit_expressions; +extern PGDLLIMPORT bool jit_profiling_support; +extern PGDLLIMPORT bool jit_tuple_deforming; +extern PGDLLIMPORT double jit_above_cost; +extern PGDLLIMPORT double jit_inline_above_cost; +extern PGDLLIMPORT double jit_optimize_above_cost; extern void jit_reset_after_error(void); diff --git a/src/include/jit/llvmjit.h b/src/include/jit/llvmjit.h index 66143afccc..4541f9a2c4 100644 --- a/src/include/jit/llvmjit.h +++ b/src/include/jit/llvmjit.h @@ -56,30 +56,30 @@ typedef struct LLVMJitContext } LLVMJitContext; /* llvm module containing information about types */ -extern LLVMModuleRef llvm_types_module; +extern PGDLLIMPORT LLVMModuleRef llvm_types_module; /* type and struct definitions */ -extern LLVMTypeRef TypeParamBool; -extern LLVMTypeRef TypePGFunction; -extern LLVMTypeRef TypeSizeT; -extern LLVMTypeRef TypeStorageBool; - -extern LLVMTypeRef StructNullableDatum; -extern LLVMTypeRef StructTupleDescData; -extern LLVMTypeRef StructHeapTupleData; -extern LLVMTypeRef StructTupleTableSlot; -extern LLVMTypeRef StructHeapTupleTableSlot; -extern LLVMTypeRef StructMinimalTupleTableSlot; -extern LLVMTypeRef StructMemoryContextData; -extern LLVMTypeRef StructFunctionCallInfoData; -extern LLVMTypeRef StructExprContext; -extern LLVMTypeRef StructExprEvalStep; -extern LLVMTypeRef StructExprState; -extern LLVMTypeRef StructAggState; -extern LLVMTypeRef StructAggStatePerTransData; -extern LLVMTypeRef StructAggStatePerGroupData; - -extern LLVMValueRef AttributeTemplate; +extern PGDLLIMPORT LLVMTypeRef TypeParamBool; +extern PGDLLIMPORT LLVMTypeRef TypePGFunction; +extern PGDLLIMPORT LLVMTypeRef TypeSizeT; +extern PGDLLIMPORT LLVMTypeRef TypeStorageBool; + +extern PGDLLIMPORT LLVMTypeRef StructNullableDatum; +extern PGDLLIMPORT LLVMTypeRef StructTupleDescData; +extern PGDLLIMPORT LLVMTypeRef StructHeapTupleData; +extern PGDLLIMPORT LLVMTypeRef StructTupleTableSlot; +extern PGDLLIMPORT LLVMTypeRef StructHeapTupleTableSlot; +extern PGDLLIMPORT LLVMTypeRef StructMinimalTupleTableSlot; +extern PGDLLIMPORT LLVMTypeRef StructMemoryContextData; +extern PGDLLIMPORT LLVMTypeRef StructFunctionCallInfoData; +extern PGDLLIMPORT LLVMTypeRef StructExprContext; +extern PGDLLIMPORT LLVMTypeRef StructExprEvalStep; +extern PGDLLIMPORT LLVMTypeRef StructExprState; +extern PGDLLIMPORT LLVMTypeRef StructAggState; +extern PGDLLIMPORT LLVMTypeRef StructAggStatePerTransData; +extern PGDLLIMPORT LLVMTypeRef StructAggStatePerGroupData; + +extern PGDLLIMPORT LLVMValueRef AttributeTemplate; extern void llvm_enter_fatal_on_oom(void); diff --git a/src/include/libpq/auth.h b/src/include/libpq/auth.h index 6d7ee1acb9..d3c189efe3 100644 --- a/src/include/libpq/auth.h +++ b/src/include/libpq/auth.h @@ -16,9 +16,9 @@ #include "libpq/libpq-be.h" -extern char *pg_krb_server_keyfile; -extern bool pg_krb_caseins_users; -extern char *pg_krb_realm; +extern PGDLLIMPORT char *pg_krb_server_keyfile; +extern PGDLLIMPORT bool pg_krb_caseins_users; +extern PGDLLIMPORT char *pg_krb_realm; extern void ClientAuthentication(Port *port); extern void sendAuthRequest(Port *port, AuthRequest areq, const char *extradata, diff --git a/src/include/libpq/libpq-be.h b/src/include/libpq/libpq-be.h index c3bf514652..90c20da22b 100644 --- a/src/include/libpq/libpq-be.h +++ b/src/include/libpq/libpq-be.h @@ -326,7 +326,7 @@ extern ssize_t be_gssapi_read(Port *port, void *ptr, size_t len); extern ssize_t be_gssapi_write(Port *port, void *ptr, size_t len); #endif /* ENABLE_GSS */ -extern ProtocolVersion FrontendProtocol; +extern PGDLLIMPORT ProtocolVersion FrontendProtocol; /* TCP keepalives configuration. These are no-ops on an AF_UNIX socket. */ diff --git a/src/include/libpq/libpq.h b/src/include/libpq/libpq.h index d348a55812..2de7d9bad2 100644 --- a/src/include/libpq/libpq.h +++ b/src/include/libpq/libpq.h @@ -58,7 +58,7 @@ extern const PGDLLIMPORT PQcommMethods *PqCommMethods; /* * prototypes for functions in pqcomm.c */ -extern WaitEventSet *FeBeWaitSet; +extern PGDLLIMPORT WaitEventSet *FeBeWaitSet; #define FeBeWaitSetSocketPos 0 #define FeBeWaitSetLatchPos 1 @@ -87,17 +87,17 @@ extern bool pq_check_connection(void); /* * prototypes for functions in be-secure.c */ -extern char *ssl_library; -extern char *ssl_cert_file; -extern char *ssl_key_file; -extern char *ssl_ca_file; -extern char *ssl_crl_file; -extern char *ssl_crl_dir; -extern char *ssl_dh_params_file; +extern PGDLLIMPORT char *ssl_library; +extern PGDLLIMPORT char *ssl_cert_file; +extern PGDLLIMPORT char *ssl_key_file; +extern PGDLLIMPORT char *ssl_ca_file; +extern PGDLLIMPORT char *ssl_crl_file; +extern PGDLLIMPORT char *ssl_crl_dir; +extern PGDLLIMPORT char *ssl_dh_params_file; extern PGDLLIMPORT char *ssl_passphrase_command; extern PGDLLIMPORT bool ssl_passphrase_command_supports_reload; #ifdef USE_SSL -extern bool ssl_loaded_verify_locations; +extern PGDLLIMPORT bool ssl_loaded_verify_locations; #endif extern int secure_initialize(bool isServerStart); @@ -118,11 +118,11 @@ extern ssize_t secure_open_gssapi(Port *port); #endif /* GUCs */ -extern char *SSLCipherSuites; -extern char *SSLECDHCurve; -extern bool SSLPreferServerCiphers; -extern int ssl_min_protocol_version; -extern int ssl_max_protocol_version; +extern PGDLLIMPORT char *SSLCipherSuites; +extern PGDLLIMPORT char *SSLECDHCurve; +extern PGDLLIMPORT bool SSLPreferServerCiphers; +extern PGDLLIMPORT int ssl_min_protocol_version; +extern PGDLLIMPORT int ssl_max_protocol_version; enum ssl_protocol_versions { diff --git a/src/include/libpq/pqcomm.h b/src/include/libpq/pqcomm.h index ed26ad2256..b418283d5f 100644 --- a/src/include/libpq/pqcomm.h +++ b/src/include/libpq/pqcomm.h @@ -135,7 +135,7 @@ typedef ProtocolVersion MsgType; typedef uint32 PacketLen; -extern bool Db_user_namespace; +extern PGDLLIMPORT bool Db_user_namespace; /* * In protocol 3.0 and later, the startup packet length is not fixed, but diff --git a/src/include/libpq/scram.h b/src/include/libpq/scram.h index e60992a0d2..c51e848c24 100644 --- a/src/include/libpq/scram.h +++ b/src/include/libpq/scram.h @@ -18,7 +18,7 @@ #include "libpq/sasl.h" /* SASL implementation callbacks */ -extern const pg_be_sasl_mech pg_be_scram_mech; +extern PGDLLIMPORT const pg_be_sasl_mech pg_be_scram_mech; /* Routines to handle and check SCRAM-SHA-256 secret */ extern char *pg_be_scram_build_secret(const char *password); diff --git a/src/include/mb/pg_wchar.h b/src/include/mb/pg_wchar.h index fd89bee80b..31f5b393da 100644 --- a/src/include/mb/pg_wchar.h +++ b/src/include/mb/pg_wchar.h @@ -359,7 +359,7 @@ typedef struct pg_enc2name #endif } pg_enc2name; -extern const pg_enc2name pg_enc2name_tbl[]; +extern PGDLLIMPORT const pg_enc2name pg_enc2name_tbl[]; /* * Encoding names for gettext @@ -370,7 +370,7 @@ typedef struct pg_enc2gettext const char *name; } pg_enc2gettext; -extern const pg_enc2gettext pg_enc2gettext_tbl[]; +extern PGDLLIMPORT const pg_enc2gettext pg_enc2gettext_tbl[]; /* * pg_wchar stuff @@ -406,7 +406,7 @@ typedef struct int maxmblen; /* max bytes for a char in this encoding */ } pg_wchar_tbl; -extern const pg_wchar_tbl pg_wchar_table[]; +extern PGDLLIMPORT const pg_wchar_tbl pg_wchar_table[]; /* * Data structures for conversions between UTF-8 and other encodings diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index bcf2016421..e9ad52c347 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -182,15 +182,15 @@ extern PGDLLIMPORT pg_time_t MyStartTime; extern PGDLLIMPORT TimestampTz MyStartTimestamp; extern PGDLLIMPORT struct Port *MyProcPort; extern PGDLLIMPORT struct Latch *MyLatch; -extern int32 MyCancelKey; -extern int MyPMChildSlot; +extern PGDLLIMPORT int32 MyCancelKey; +extern PGDLLIMPORT int MyPMChildSlot; -extern char OutputFileName[]; +extern PGDLLIMPORT char OutputFileName[]; extern PGDLLIMPORT char my_exec_path[]; -extern char pkglib_path[]; +extern PGDLLIMPORT char pkglib_path[]; #ifdef EXEC_BACKEND -extern char postgres_exec_path[]; +extern PGDLLIMPORT char postgres_exec_path[]; #endif /* @@ -255,25 +255,25 @@ extern PGDLLIMPORT int IntervalStyle; #define MAXTZLEN 10 /* max TZ name len, not counting tr. null */ -extern bool enableFsync; +extern PGDLLIMPORT bool enableFsync; extern PGDLLIMPORT bool allowSystemTableMods; extern PGDLLIMPORT int work_mem; extern PGDLLIMPORT double hash_mem_multiplier; extern PGDLLIMPORT int maintenance_work_mem; extern PGDLLIMPORT int max_parallel_maintenance_workers; -extern int VacuumCostPageHit; -extern int VacuumCostPageMiss; -extern int VacuumCostPageDirty; -extern int VacuumCostLimit; -extern double VacuumCostDelay; +extern PGDLLIMPORT int VacuumCostPageHit; +extern PGDLLIMPORT int VacuumCostPageMiss; +extern PGDLLIMPORT int VacuumCostPageDirty; +extern PGDLLIMPORT int VacuumCostLimit; +extern PGDLLIMPORT double VacuumCostDelay; -extern int64 VacuumPageHit; -extern int64 VacuumPageMiss; -extern int64 VacuumPageDirty; +extern PGDLLIMPORT int64 VacuumPageHit; +extern PGDLLIMPORT int64 VacuumPageMiss; +extern PGDLLIMPORT int64 VacuumPageDirty; -extern int VacuumCostBalance; -extern bool VacuumCostActive; +extern PGDLLIMPORT int VacuumCostBalance; +extern PGDLLIMPORT bool VacuumCostActive; /* in tcop/postgres.c */ @@ -299,7 +299,7 @@ extern void PreventCommandIfParallelMode(const char *cmdname); extern void PreventCommandDuringRecovery(const char *cmdname); /* in utils/misc/guc.c */ -extern int trace_recovery_messages; +extern PGDLLIMPORT int trace_recovery_messages; extern int trace_recovery(int trace_level); /***************************************************************************** @@ -312,7 +312,7 @@ extern int trace_recovery(int trace_level); #define SECURITY_RESTRICTED_OPERATION 0x0002 #define SECURITY_NOFORCE_RLS 0x0004 -extern char *DatabasePath; +extern PGDLLIMPORT char *DatabasePath; /* now in utils/init/miscinit.c */ extern void InitPostmasterChild(void); @@ -337,7 +337,7 @@ typedef enum BackendType B_LOGGER, } BackendType; -extern BackendType MyBackendType; +extern PGDLLIMPORT BackendType MyBackendType; extern const char *GetBackendTypeDesc(BackendType backendType); @@ -400,7 +400,7 @@ typedef enum ProcessingMode NormalProcessing /* normal processing */ } ProcessingMode; -extern ProcessingMode Mode; +extern PGDLLIMPORT ProcessingMode Mode; #define IsBootstrapProcessingMode() (Mode == BootstrapProcessing) #define IsInitProcessingMode() (Mode == InitProcessing) @@ -438,7 +438,7 @@ typedef enum NUM_AUXPROCTYPES /* Must be last! */ } AuxProcType; -extern AuxProcType MyAuxProcType; +extern PGDLLIMPORT AuxProcType MyAuxProcType; #define AmStartupProcess() (MyAuxProcType == StartupProcess) #define AmBackgroundWriterProcess() (MyAuxProcType == BgWriterProcess) @@ -456,19 +456,19 @@ extern AuxProcType MyAuxProcType; /* in utils/init/postinit.c */ extern void pg_split_opts(char **argv, int *argcp, const char *optstr); extern void InitializeMaxBackends(void); -extern int GetMaxBackends(void); +extern int GetMaxBackends(void); extern void SetMaxBackends(int max_backends); extern void InitPostgres(const char *in_dbname, Oid dboid, const char *username, Oid useroid, char *out_dbname, bool override_allow_connections); extern void BaseInit(void); /* in utils/init/miscinit.c */ -extern bool IgnoreSystemIndexes; +extern PGDLLIMPORT bool IgnoreSystemIndexes; extern PGDLLIMPORT bool process_shared_preload_libraries_in_progress; -extern bool process_shared_preload_libraries_done; -extern char *session_preload_libraries_string; -extern char *shared_preload_libraries_string; -extern char *local_preload_libraries_string; +extern PGDLLIMPORT bool process_shared_preload_libraries_done; +extern PGDLLIMPORT char *session_preload_libraries_string; +extern PGDLLIMPORT char *shared_preload_libraries_string; +extern PGDLLIMPORT char *local_preload_libraries_string; extern void CreateDataDirLockFile(bool amPostmaster); extern void CreateSocketLockFile(const char *socketfile, bool amPostmaster, diff --git a/src/include/nodes/readfuncs.h b/src/include/nodes/readfuncs.h index 41794354e2..66717fd6c3 100644 --- a/src/include/nodes/readfuncs.h +++ b/src/include/nodes/readfuncs.h @@ -20,7 +20,7 @@ * variable in read.c that needs to be accessible to readfuncs.c */ #ifdef WRITE_READ_PARSE_PLAN_TREES -extern bool restore_location_fields; +extern PGDLLIMPORT bool restore_location_fields; #endif /* diff --git a/src/include/optimizer/geqo.h b/src/include/optimizer/geqo.h index 4563f200cd..d399323332 100644 --- a/src/include/optimizer/geqo.h +++ b/src/include/optimizer/geqo.h @@ -49,23 +49,24 @@ * * If you change these, update backend/utils/misc/postgresql.conf.sample */ -extern int Geqo_effort; /* 1 .. 10, knob for adjustment of defaults */ +extern PGDLLIMPORT int Geqo_effort; /* 1 .. 10, knob for adjustment of + * defaults */ #define DEFAULT_GEQO_EFFORT 5 #define MIN_GEQO_EFFORT 1 #define MAX_GEQO_EFFORT 10 -extern int Geqo_pool_size; /* 2 .. inf, or 0 to use default */ +extern PGDLLIMPORT int Geqo_pool_size; /* 2 .. inf, or 0 to use default */ -extern int Geqo_generations; /* 1 .. inf, or 0 to use default */ +extern PGDLLIMPORT int Geqo_generations; /* 1 .. inf, or 0 to use default */ -extern double Geqo_selection_bias; +extern PGDLLIMPORT double Geqo_selection_bias; #define DEFAULT_GEQO_SELECTION_BIAS 2.0 #define MIN_GEQO_SELECTION_BIAS 1.5 #define MAX_GEQO_SELECTION_BIAS 2.0 -extern double Geqo_seed; /* 0 .. 1 */ +extern PGDLLIMPORT double Geqo_seed; /* 0 .. 1 */ /* diff --git a/src/include/optimizer/optimizer.h b/src/include/optimizer/optimizer.h index 2302ab6d54..d40ce2eae1 100644 --- a/src/include/optimizer/optimizer.h +++ b/src/include/optimizer/optimizer.h @@ -112,8 +112,8 @@ typedef enum } ForceParallelMode; /* GUC parameters */ -extern int force_parallel_mode; -extern bool parallel_leader_participation; +extern PGDLLIMPORT int force_parallel_mode; +extern PGDLLIMPORT bool parallel_leader_participation; extern struct PlannedStmt *planner(Query *parse, const char *query_string, int cursorOptions, diff --git a/src/include/optimizer/planmain.h b/src/include/optimizer/planmain.h index 6947bc65d1..c4f61c1a09 100644 --- a/src/include/optimizer/planmain.h +++ b/src/include/optimizer/planmain.h @@ -19,7 +19,7 @@ /* GUC parameters */ #define DEFAULT_CURSOR_TUPLE_FRACTION 0.1 -extern double cursor_tuple_fraction; +extern PGDLLIMPORT double cursor_tuple_fraction; /* query_planner callback to compute query_pathkeys */ typedef void (*query_pathkeys_callback) (PlannerInfo *root, void *extra); @@ -64,8 +64,8 @@ extern Limit *make_limit(Plan *lefttree, Node *limitOffset, Node *limitCount, /* * prototypes for plan/initsplan.c */ -extern int from_collapse_limit; -extern int join_collapse_limit; +extern PGDLLIMPORT int from_collapse_limit; +extern PGDLLIMPORT int join_collapse_limit; extern void add_base_rels_to_query(PlannerInfo *root, Node *jtnode); extern void add_other_rels_to_query(PlannerInfo *root); diff --git a/src/include/parser/parse_expr.h b/src/include/parser/parse_expr.h index 308e84edda..c8e5c57b43 100644 --- a/src/include/parser/parse_expr.h +++ b/src/include/parser/parse_expr.h @@ -16,7 +16,7 @@ #include "parser/parse_node.h" /* GUC parameters */ -extern bool Transform_null_equals; +extern PGDLLIMPORT bool Transform_null_equals; extern Node *transformExpr(ParseState *pstate, Node *expr, ParseExprKind exprKind); diff --git a/src/include/parser/parser.h b/src/include/parser/parser.h index 6aac0e096a..828150f01b 100644 --- a/src/include/parser/parser.h +++ b/src/include/parser/parser.h @@ -53,8 +53,8 @@ typedef enum } BackslashQuoteType; /* GUC variables in scan.l (every one of these is a bad idea :-() */ -extern int backslash_quote; -extern bool escape_string_warning; +extern PGDLLIMPORT int backslash_quote; +extern PGDLLIMPORT bool escape_string_warning; extern PGDLLIMPORT bool standard_conforming_strings; diff --git a/src/include/pg_getopt.h b/src/include/pg_getopt.h index ec9f6e6ee3..9d91e602e6 100644 --- a/src/include/pg_getopt.h +++ b/src/include/pg_getopt.h @@ -33,10 +33,10 @@ */ #ifndef HAVE_GETOPT_H -extern char *optarg; -extern int optind; -extern int opterr; -extern int optopt; +extern PGDLLIMPORT char *optarg; +extern PGDLLIMPORT int optind; +extern PGDLLIMPORT int opterr; +extern PGDLLIMPORT int optopt; #endif /* HAVE_GETOPT_H */ @@ -45,7 +45,7 @@ extern int optopt; * Cygwin, however, doesn't like this either. */ #if defined(HAVE_INT_OPTRESET) && !defined(__CYGWIN__) -extern int optreset; +extern PGDLLIMPORT int optreset; #endif /* Provide getopt() declaration if the platform doesn't have it */ diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 88c87a0cc5..ac28f813b4 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -651,7 +651,7 @@ extern PGDLLIMPORT int pgstat_fetch_consistency; */ /* updated directly by bgwriter and bufmgr */ -extern PgStat_BgWriterStats PendingBgWriterStats; +extern PGDLLIMPORT PgStat_BgWriterStats PendingBgWriterStats; /* @@ -662,7 +662,7 @@ extern PgStat_BgWriterStats PendingBgWriterStats; * Checkpointer statistics counters are updated directly by checkpointer and * bufmgr. */ -extern PgStat_CheckpointerStats PendingCheckpointerStats; +extern PGDLLIMPORT PgStat_CheckpointerStats PendingCheckpointerStats; /* @@ -670,18 +670,18 @@ extern PgStat_CheckpointerStats PendingCheckpointerStats; */ /* Updated by pgstat_count_buffer_*_time macros */ -extern PgStat_Counter pgStatBlockReadTime; -extern PgStat_Counter pgStatBlockWriteTime; +extern PGDLLIMPORT PgStat_Counter pgStatBlockReadTime; +extern PGDLLIMPORT PgStat_Counter pgStatBlockWriteTime; /* * Updated by pgstat_count_conn_*_time macros, called by * pgstat_report_activity(). */ -extern PgStat_Counter pgStatActiveTime; -extern PgStat_Counter pgStatTransactionIdleTime; +extern PGDLLIMPORT PgStat_Counter pgStatActiveTime; +extern PGDLLIMPORT PgStat_Counter pgStatTransactionIdleTime; /* updated by the traffic cop and in errfinish() */ -extern SessionEndType pgStatSessionEndCause; +extern PGDLLIMPORT SessionEndType pgStatSessionEndCause; /* @@ -689,7 +689,7 @@ extern SessionEndType pgStatSessionEndCause; */ /* updated directly by backends and background processes */ -extern PgStat_WalStats PendingWalStats; +extern PGDLLIMPORT PgStat_WalStats PendingWalStats; #endif /* PGSTAT_H */ diff --git a/src/include/pgtime.h b/src/include/pgtime.h index 441d7847c1..1c44be8baa 100644 --- a/src/include/pgtime.h +++ b/src/include/pgtime.h @@ -81,7 +81,7 @@ extern size_t pg_strftime(char *s, size_t max, const char *format, /* these functions and variables are in pgtz.c */ extern PGDLLIMPORT pg_tz *session_timezone; -extern pg_tz *log_timezone; +extern PGDLLIMPORT pg_tz *log_timezone; extern void pg_timezone_initialize(void); extern pg_tz *pg_tzset(const char *tzname); diff --git a/src/include/port/win32_port.h b/src/include/port/win32_port.h index 4bb6fc5e1e..5045ced91b 100644 --- a/src/include/port/win32_port.h +++ b/src/include/port/win32_port.h @@ -449,8 +449,8 @@ extern char *pgwin32_setlocale(int category, const char *locale); /* In backend/port/win32/signal.c */ extern PGDLLIMPORT volatile int pg_signal_queue; extern PGDLLIMPORT int pg_signal_mask; -extern HANDLE pgwin32_signal_event; -extern HANDLE pgwin32_initial_signal_pipe; +extern PGDLLIMPORT HANDLE pgwin32_signal_event; +extern PGDLLIMPORT HANDLE pgwin32_initial_signal_pipe; #define UNBLOCKED_SIGNAL_QUEUE() (pg_signal_queue & ~pg_signal_mask) #define PG_SIGNAL_COUNT 32 @@ -485,7 +485,7 @@ int pgwin32_recv(SOCKET s, char *buf, int len, int flags); int pgwin32_send(SOCKET s, const void *buf, int len, int flags); int pgwin32_waitforsinglesocket(SOCKET s, int what, int timeout); -extern int pgwin32_noblock; +extern PGDLLIMPORT int pgwin32_noblock; #endif /* FRONTEND */ diff --git a/src/include/port/win32ntdll.h b/src/include/port/win32ntdll.h index 663b9754bd..291b067ea4 100644 --- a/src/include/port/win32ntdll.h +++ b/src/include/port/win32ntdll.h @@ -23,9 +23,9 @@ #include #include -typedef NTSTATUS (__stdcall *RtlGetLastNtStatus_t) (void); +typedef NTSTATUS (__stdcall * RtlGetLastNtStatus_t) (void); -extern RtlGetLastNtStatus_t pg_RtlGetLastNtStatus; +extern PGDLLIMPORT RtlGetLastNtStatus_t pg_RtlGetLastNtStatus; extern int initialize_ntdll(void); diff --git a/src/include/postmaster/autovacuum.h b/src/include/postmaster/autovacuum.h index 30a2b3274f..9d40fd6d54 100644 --- a/src/include/postmaster/autovacuum.h +++ b/src/include/postmaster/autovacuum.h @@ -27,25 +27,25 @@ typedef enum /* GUC variables */ -extern bool autovacuum_start_daemon; -extern int autovacuum_max_workers; -extern int autovacuum_work_mem; -extern int autovacuum_naptime; -extern int autovacuum_vac_thresh; -extern double autovacuum_vac_scale; -extern int autovacuum_vac_ins_thresh; -extern double autovacuum_vac_ins_scale; -extern int autovacuum_anl_thresh; -extern double autovacuum_anl_scale; -extern int autovacuum_freeze_max_age; -extern int autovacuum_multixact_freeze_max_age; -extern double autovacuum_vac_cost_delay; -extern int autovacuum_vac_cost_limit; +extern PGDLLIMPORT bool autovacuum_start_daemon; +extern PGDLLIMPORT int autovacuum_max_workers; +extern PGDLLIMPORT int autovacuum_work_mem; +extern PGDLLIMPORT int autovacuum_naptime; +extern PGDLLIMPORT int autovacuum_vac_thresh; +extern PGDLLIMPORT double autovacuum_vac_scale; +extern PGDLLIMPORT int autovacuum_vac_ins_thresh; +extern PGDLLIMPORT double autovacuum_vac_ins_scale; +extern PGDLLIMPORT int autovacuum_anl_thresh; +extern PGDLLIMPORT double autovacuum_anl_scale; +extern PGDLLIMPORT int autovacuum_freeze_max_age; +extern PGDLLIMPORT int autovacuum_multixact_freeze_max_age; +extern PGDLLIMPORT double autovacuum_vac_cost_delay; +extern PGDLLIMPORT int autovacuum_vac_cost_limit; /* autovacuum launcher PID, only valid when worker is shutting down */ -extern int AutovacuumLauncherPid; +extern PGDLLIMPORT int AutovacuumLauncherPid; -extern int Log_autovacuum_min_duration; +extern PGDLLIMPORT int Log_autovacuum_min_duration; /* Status inquiry functions */ extern bool AutoVacuumingActive(void); diff --git a/src/include/postmaster/bgworker_internals.h b/src/include/postmaster/bgworker_internals.h index 75900686fc..387683546d 100644 --- a/src/include/postmaster/bgworker_internals.h +++ b/src/include/postmaster/bgworker_internals.h @@ -42,7 +42,7 @@ typedef struct RegisteredBgWorker slist_node rw_lnode; /* list link */ } RegisteredBgWorker; -extern slist_head BackgroundWorkerList; +extern PGDLLIMPORT slist_head BackgroundWorkerList; extern Size BackgroundWorkerShmemSize(void); extern void BackgroundWorkerShmemInit(void); diff --git a/src/include/postmaster/bgwriter.h b/src/include/postmaster/bgwriter.h index 2882efd67b..2511ef451e 100644 --- a/src/include/postmaster/bgwriter.h +++ b/src/include/postmaster/bgwriter.h @@ -22,10 +22,10 @@ /* GUC options */ -extern int BgWriterDelay; -extern int CheckPointTimeout; -extern int CheckPointWarning; -extern double CheckPointCompletionTarget; +extern PGDLLIMPORT int BgWriterDelay; +extern PGDLLIMPORT int CheckPointTimeout; +extern PGDLLIMPORT int CheckPointWarning; +extern PGDLLIMPORT double CheckPointCompletionTarget; extern void BackgroundWriterMain(void) pg_attribute_noreturn(); extern void CheckpointerMain(void) pg_attribute_noreturn(); diff --git a/src/include/postmaster/pgarch.h b/src/include/postmaster/pgarch.h index 9bc7593a2d..38cb1c6477 100644 --- a/src/include/postmaster/pgarch.h +++ b/src/include/postmaster/pgarch.h @@ -36,7 +36,7 @@ extern void PgArchForceDirScan(void); /* * The value of the archive_library GUC. */ -extern char *XLogArchiveLibrary; +extern PGDLLIMPORT char *XLogArchiveLibrary; /* * Archive module callbacks @@ -55,19 +55,19 @@ typedef struct ArchiveModuleCallbacks ArchiveCheckConfiguredCB check_configured_cb; ArchiveFileCB archive_file_cb; ArchiveShutdownCB shutdown_cb; -} ArchiveModuleCallbacks; +} ArchiveModuleCallbacks; /* * Type of the shared library symbol _PG_archive_module_init that is looked * up when loading an archive library. */ -typedef void (*ArchiveModuleInit) (ArchiveModuleCallbacks *cb); +typedef void (*ArchiveModuleInit) (ArchiveModuleCallbacks * cb); /* * Since the logic for archiving via a shell command is in the core server * and does not need to be loaded via a shared library, it has a special * initialization function. */ -extern void shell_archive_init(ArchiveModuleCallbacks *cb); +extern void shell_archive_init(ArchiveModuleCallbacks * cb); #endif /* _PGARCH_H */ diff --git a/src/include/postmaster/postmaster.h b/src/include/postmaster/postmaster.h index 324a30ec1a..90e333ccd2 100644 --- a/src/include/postmaster/postmaster.h +++ b/src/include/postmaster/postmaster.h @@ -14,27 +14,27 @@ #define _POSTMASTER_H /* GUC options */ -extern bool EnableSSL; -extern int ReservedBackends; +extern PGDLLIMPORT bool EnableSSL; +extern PGDLLIMPORT int ReservedBackends; extern PGDLLIMPORT int PostPortNumber; -extern int Unix_socket_permissions; -extern char *Unix_socket_group; -extern char *Unix_socket_directories; -extern char *ListenAddresses; -extern bool ClientAuthInProgress; -extern int PreAuthDelay; -extern int AuthenticationTimeout; -extern bool Log_connections; -extern bool log_hostname; -extern bool enable_bonjour; -extern char *bonjour_name; -extern bool restart_after_crash; -extern bool remove_temp_files_after_crash; +extern PGDLLIMPORT int Unix_socket_permissions; +extern PGDLLIMPORT char *Unix_socket_group; +extern PGDLLIMPORT char *Unix_socket_directories; +extern PGDLLIMPORT char *ListenAddresses; +extern PGDLLIMPORT bool ClientAuthInProgress; +extern PGDLLIMPORT int PreAuthDelay; +extern PGDLLIMPORT int AuthenticationTimeout; +extern PGDLLIMPORT bool Log_connections; +extern PGDLLIMPORT bool log_hostname; +extern PGDLLIMPORT bool enable_bonjour; +extern PGDLLIMPORT char *bonjour_name; +extern PGDLLIMPORT bool restart_after_crash; +extern PGDLLIMPORT bool remove_temp_files_after_crash; #ifdef WIN32 -extern HANDLE PostmasterHandle; +extern PGDLLIMPORT HANDLE PostmasterHandle; #else -extern int postmaster_alive_fds[2]; +extern PGDLLIMPORT int postmaster_alive_fds[2]; /* * Constants that represent which of postmaster_alive_fds is held by diff --git a/src/include/postmaster/startup.h b/src/include/postmaster/startup.h index 7e39db7159..d66ec1fcb1 100644 --- a/src/include/postmaster/startup.h +++ b/src/include/postmaster/startup.h @@ -23,7 +23,7 @@ ereport(LOG, errmsg(msg, secs, (usecs / 10000), __VA_ARGS__ )); \ } while(0) -extern int log_startup_progress_interval; +extern PGDLLIMPORT int log_startup_progress_interval; extern void HandleStartupProcInterrupts(void); extern void StartupProcessMain(void) pg_attribute_noreturn(); diff --git a/src/include/postmaster/syslogger.h b/src/include/postmaster/syslogger.h index 1ca326e52e..6436724f3d 100644 --- a/src/include/postmaster/syslogger.h +++ b/src/include/postmaster/syslogger.h @@ -67,18 +67,18 @@ typedef union #define PIPE_PROTO_DEST_JSONLOG 0x40 /* GUC options */ -extern bool Logging_collector; -extern int Log_RotationAge; -extern int Log_RotationSize; +extern PGDLLIMPORT bool Logging_collector; +extern PGDLLIMPORT int Log_RotationAge; +extern PGDLLIMPORT int Log_RotationSize; extern PGDLLIMPORT char *Log_directory; extern PGDLLIMPORT char *Log_filename; -extern bool Log_truncate_on_rotation; -extern int Log_file_mode; +extern PGDLLIMPORT bool Log_truncate_on_rotation; +extern PGDLLIMPORT int Log_file_mode; #ifndef WIN32 -extern int syslogPipe[2]; +extern PGDLLIMPORT int syslogPipe[2]; #else -extern HANDLE syslogPipe[2]; +extern PGDLLIMPORT HANDLE syslogPipe[2]; #endif diff --git a/src/include/postmaster/walwriter.h b/src/include/postmaster/walwriter.h index 5a3011d9c9..ddc943657e 100644 --- a/src/include/postmaster/walwriter.h +++ b/src/include/postmaster/walwriter.h @@ -13,8 +13,8 @@ #define _WALWRITER_H /* GUC options */ -extern int WalWriterDelay; -extern int WalWriterFlushAfter; +extern PGDLLIMPORT int WalWriterDelay; +extern PGDLLIMPORT int WalWriterFlushAfter; extern void WalWriterMain(void) pg_attribute_noreturn(); diff --git a/src/include/replication/logicallauncher.h b/src/include/replication/logicallauncher.h index 15596fe446..f1e2821e25 100644 --- a/src/include/replication/logicallauncher.h +++ b/src/include/replication/logicallauncher.h @@ -12,8 +12,8 @@ #ifndef LOGICALLAUNCHER_H #define LOGICALLAUNCHER_H -extern int max_logical_replication_workers; -extern int max_sync_workers_per_subscription; +extern PGDLLIMPORT int max_logical_replication_workers; +extern PGDLLIMPORT int max_sync_workers_per_subscription; extern void ApplyLauncherRegister(void); extern void ApplyLauncherMain(Datum main_arg); diff --git a/src/include/replication/syncrep.h b/src/include/replication/syncrep.h index 27be230d77..4d7c90b9f0 100644 --- a/src/include/replication/syncrep.h +++ b/src/include/replication/syncrep.h @@ -72,14 +72,14 @@ typedef struct SyncRepConfigData char member_names[FLEXIBLE_ARRAY_MEMBER]; } SyncRepConfigData; -extern SyncRepConfigData *SyncRepConfig; +extern PGDLLIMPORT SyncRepConfigData *SyncRepConfig; /* communication variables for parsing synchronous_standby_names GUC */ -extern SyncRepConfigData *syncrep_parse_result; -extern char *syncrep_parse_error_msg; +extern PGDLLIMPORT SyncRepConfigData *syncrep_parse_result; +extern PGDLLIMPORT char *syncrep_parse_error_msg; /* user-settable parameters for synchronous replication */ -extern char *SyncRepStandbyNames; +extern PGDLLIMPORT char *SyncRepStandbyNames; /* called by user backend */ extern void SyncRepWaitForLSN(XLogRecPtr lsn, bool commit); diff --git a/src/include/replication/walreceiver.h b/src/include/replication/walreceiver.h index 92f73a55b8..81184aa92f 100644 --- a/src/include/replication/walreceiver.h +++ b/src/include/replication/walreceiver.h @@ -25,9 +25,9 @@ #include "utils/tuplestore.h" /* user-settable parameters */ -extern int wal_receiver_status_interval; -extern int wal_receiver_timeout; -extern bool hot_standby_feedback; +extern PGDLLIMPORT int wal_receiver_status_interval; +extern PGDLLIMPORT int wal_receiver_timeout; +extern PGDLLIMPORT bool hot_standby_feedback; /* * MAXCONNINFO: maximum size of a connection string. @@ -160,7 +160,7 @@ typedef struct sig_atomic_t force_reply; /* used as a bool */ } WalRcvData; -extern WalRcvData *WalRcv; +extern PGDLLIMPORT WalRcvData *WalRcv; typedef struct { diff --git a/src/include/replication/walsender.h b/src/include/replication/walsender.h index b1892e9e4b..d99a21b077 100644 --- a/src/include/replication/walsender.h +++ b/src/include/replication/walsender.h @@ -25,15 +25,15 @@ typedef enum } CRSSnapshotAction; /* global state */ -extern bool am_walsender; -extern bool am_cascading_walsender; -extern bool am_db_walsender; -extern bool wake_wal_senders; +extern PGDLLIMPORT bool am_walsender; +extern PGDLLIMPORT bool am_cascading_walsender; +extern PGDLLIMPORT bool am_db_walsender; +extern PGDLLIMPORT bool wake_wal_senders; /* user-settable parameters */ -extern int max_wal_senders; -extern int wal_sender_timeout; -extern bool log_replication_commands; +extern PGDLLIMPORT int max_wal_senders; +extern PGDLLIMPORT int wal_sender_timeout; +extern PGDLLIMPORT bool log_replication_commands; extern void InitWalSender(void); extern bool exec_replication_command(const char *query_string); diff --git a/src/include/replication/walsender_private.h b/src/include/replication/walsender_private.h index 9631047c6c..c14888e493 100644 --- a/src/include/replication/walsender_private.h +++ b/src/include/replication/walsender_private.h @@ -80,7 +80,7 @@ typedef struct WalSnd TimestampTz replyTime; } WalSnd; -extern WalSnd *MyWalSnd; +extern PGDLLIMPORT WalSnd *MyWalSnd; /* There is one WalSndCtl struct for the whole database cluster */ typedef struct @@ -107,7 +107,7 @@ typedef struct WalSnd walsnds[FLEXIBLE_ARRAY_MEMBER]; } WalSndCtlData; -extern WalSndCtlData *WalSndCtl; +extern PGDLLIMPORT WalSndCtlData *WalSndCtl; extern void WalSndSetState(WalSndState state); @@ -123,6 +123,6 @@ extern void replication_scanner_init(const char *query_string); extern void replication_scanner_finish(void); extern bool replication_scanner_is_replication_command(void); -extern Node *replication_parse_result; +extern PGDLLIMPORT Node *replication_parse_result; #endif /* _WALSENDER_PRIVATE_H */ diff --git a/src/include/replication/worker_internal.h b/src/include/replication/worker_internal.h index 3c3f5f6a3a..4485d4ebee 100644 --- a/src/include/replication/worker_internal.h +++ b/src/include/replication/worker_internal.h @@ -69,16 +69,16 @@ typedef struct LogicalRepWorker } LogicalRepWorker; /* Main memory context for apply worker. Permanent during worker lifetime. */ -extern MemoryContext ApplyContext; +extern PGDLLIMPORT MemoryContext ApplyContext; /* libpqreceiver connection */ -extern struct WalReceiverConn *LogRepWorkerWalRcvConn; +extern PGDLLIMPORT struct WalReceiverConn *LogRepWorkerWalRcvConn; /* Worker and subscription objects. */ -extern Subscription *MySubscription; -extern LogicalRepWorker *MyLogicalRepWorker; +extern PGDLLIMPORT Subscription *MySubscription; +extern PGDLLIMPORT LogicalRepWorker *MyLogicalRepWorker; -extern bool in_remote_transaction; +extern PGDLLIMPORT bool in_remote_transaction; extern void logicalrep_worker_attach(int slot); extern LogicalRepWorker *logicalrep_worker_find(Oid subid, Oid relid, diff --git a/src/include/storage/buf_internals.h b/src/include/storage/buf_internals.h index b903d2bcaf..a17e7b28a5 100644 --- a/src/include/storage/buf_internals.h +++ b/src/include/storage/buf_internals.h @@ -279,7 +279,7 @@ extern PGDLLIMPORT BufferDescPadded *BufferDescriptors; extern PGDLLIMPORT WritebackContext BackendWritebackContext; /* in localbuf.c */ -extern BufferDesc *LocalBufferDescriptors; +extern PGDLLIMPORT BufferDesc *LocalBufferDescriptors; /* in bufmgr.c */ @@ -298,7 +298,7 @@ typedef struct CkptSortItem int buf_id; } CkptSortItem; -extern CkptSortItem *CkptBufferIds; +extern PGDLLIMPORT CkptSortItem *CkptBufferIds; /* * Internal buffer management routines diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h index a6b657f0ba..58391406f6 100644 --- a/src/include/storage/bufmgr.h +++ b/src/include/storage/bufmgr.h @@ -65,16 +65,16 @@ struct SMgrRelationData; extern PGDLLIMPORT int NBuffers; /* in bufmgr.c */ -extern bool zero_damaged_pages; -extern int bgwriter_lru_maxpages; -extern double bgwriter_lru_multiplier; -extern bool track_io_timing; -extern int effective_io_concurrency; -extern int maintenance_io_concurrency; - -extern int checkpoint_flush_after; -extern int backend_flush_after; -extern int bgwriter_flush_after; +extern PGDLLIMPORT bool zero_damaged_pages; +extern PGDLLIMPORT int bgwriter_lru_maxpages; +extern PGDLLIMPORT double bgwriter_lru_multiplier; +extern PGDLLIMPORT bool track_io_timing; +extern PGDLLIMPORT int effective_io_concurrency; +extern PGDLLIMPORT int maintenance_io_concurrency; + +extern PGDLLIMPORT int checkpoint_flush_after; +extern PGDLLIMPORT int backend_flush_after; +extern PGDLLIMPORT int bgwriter_flush_after; /* in buf_init.c */ extern PGDLLIMPORT char *BufferBlocks; diff --git a/src/include/storage/dsm_impl.h b/src/include/storage/dsm_impl.h index f60b76f075..c51584dc6a 100644 --- a/src/include/storage/dsm_impl.h +++ b/src/include/storage/dsm_impl.h @@ -39,8 +39,8 @@ #endif /* GUC. */ -extern int dynamic_shared_memory_type; -extern int min_dynamic_shared_memory; +extern PGDLLIMPORT int dynamic_shared_memory_type; +extern PGDLLIMPORT int min_dynamic_shared_memory; /* * Directory for on-disk state. diff --git a/src/include/storage/fd.h b/src/include/storage/fd.h index 29209e2724..69549b000f 100644 --- a/src/include/storage/fd.h +++ b/src/include/storage/fd.h @@ -59,12 +59,12 @@ typedef int File; /* GUC parameter */ extern PGDLLIMPORT int max_files_per_process; extern PGDLLIMPORT bool data_sync_retry; -extern int recovery_init_sync_method; +extern PGDLLIMPORT int recovery_init_sync_method; /* * This is private to fd.c, but exported for save/restore_backend_variables() */ -extern int max_safe_fds; +extern PGDLLIMPORT int max_safe_fds; /* * On Windows, we have to interpret EACCES as possibly meaning the same as diff --git a/src/include/storage/large_object.h b/src/include/storage/large_object.h index 274b97fd42..b826a7dcd5 100644 --- a/src/include/storage/large_object.h +++ b/src/include/storage/large_object.h @@ -79,7 +79,7 @@ typedef struct LargeObjectDesc /* * GUC: backwards-compatibility flag to suppress LO permission checks */ -extern bool lo_compat_privileges; +extern PGDLLIMPORT bool lo_compat_privileges; /* * Function definitions... diff --git a/src/include/storage/lock.h b/src/include/storage/lock.h index dc537e20f2..e4e1495b24 100644 --- a/src/include/storage/lock.h +++ b/src/include/storage/lock.h @@ -34,14 +34,14 @@ typedef struct PROC_QUEUE } PROC_QUEUE; /* GUC variables */ -extern int max_locks_per_xact; +extern PGDLLIMPORT int max_locks_per_xact; #ifdef LOCK_DEBUG -extern int Trace_lock_oidmin; -extern bool Trace_locks; -extern bool Trace_userlocks; -extern int Trace_lock_table; -extern bool Debug_deadlocks; +extern PGDLLIMPORT int Trace_lock_oidmin; +extern PGDLLIMPORT bool Trace_locks; +extern PGDLLIMPORT bool Trace_userlocks; +extern PGDLLIMPORT int Trace_lock_table; +extern PGDLLIMPORT bool Debug_deadlocks; #endif /* LOCK_DEBUG */ @@ -154,7 +154,7 @@ typedef enum LockTagType #define LOCKTAG_LAST_TYPE LOCKTAG_ADVISORY -extern const char *const LockTagTypeNames[]; +extern PGDLLIMPORT const char *const LockTagTypeNames[]; /* * The LOCKTAG struct is defined with malice aforethought to fit into 16 diff --git a/src/include/storage/lwlock.h b/src/include/storage/lwlock.h index 33eb4c1033..e8c91139f8 100644 --- a/src/include/storage/lwlock.h +++ b/src/include/storage/lwlock.h @@ -110,7 +110,7 @@ typedef enum LWLockMode #ifdef LOCK_DEBUG -extern bool Trace_lwlocks; +extern PGDLLIMPORT bool Trace_lwlocks; #endif extern bool LWLockAcquire(LWLock *lock, LWLockMode mode); @@ -121,7 +121,7 @@ extern void LWLockReleaseClearVar(LWLock *lock, uint64 *valptr, uint64 val); extern void LWLockReleaseAll(void); extern bool LWLockHeldByMe(LWLock *lock); extern bool LWLockHeldByMeInMode(LWLock *lock, LWLockMode mode); -extern int LWLockHeldCount(void); +extern int LWLockHeldCount(void); extern bool LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval); extern void LWLockUpdateVar(LWLock *lock, uint64 *valptr, uint64 value); diff --git a/src/include/storage/pg_shmem.h b/src/include/storage/pg_shmem.h index 50e5c5f99b..da5962edb9 100644 --- a/src/include/storage/pg_shmem.h +++ b/src/include/storage/pg_shmem.h @@ -42,9 +42,9 @@ typedef struct PGShmemHeader /* standard header for all Postgres shmem */ } PGShmemHeader; /* GUC variables */ -extern int shared_memory_type; -extern int huge_pages; -extern int huge_page_size; +extern PGDLLIMPORT int shared_memory_type; +extern PGDLLIMPORT int huge_pages; +extern PGDLLIMPORT int huge_page_size; /* Possible values for huge_pages */ typedef enum @@ -63,12 +63,12 @@ typedef enum } PGShmemType; #ifndef WIN32 -extern unsigned long UsedShmemSegID; +extern PGDLLIMPORT unsigned long UsedShmemSegID; #else -extern HANDLE UsedShmemSegID; -extern void *ShmemProtectiveRegion; +extern PGDLLIMPORT HANDLE UsedShmemSegID; +extern PGDLLIMPORT void *ShmemProtectiveRegion; #endif -extern void *UsedShmemSegAddr; +extern PGDLLIMPORT void *UsedShmemSegAddr; #if !defined(WIN32) && !defined(EXEC_BACKEND) #define DEFAULT_SHARED_MEMORY_TYPE SHMEM_TYPE_MMAP diff --git a/src/include/storage/pmsignal.h b/src/include/storage/pmsignal.h index ea42c2072d..58f4ddf476 100644 --- a/src/include/storage/pmsignal.h +++ b/src/include/storage/pmsignal.h @@ -89,7 +89,7 @@ extern void PostmasterDeathSignalInit(void); #endif #ifdef USE_POSTMASTER_DEATH_SIGNAL -extern volatile sig_atomic_t postmaster_possibly_dead; +extern PGDLLIMPORT volatile sig_atomic_t postmaster_possibly_dead; static inline bool PostmasterIsAlive(void) diff --git a/src/include/storage/predicate.h b/src/include/storage/predicate.h index ba12904f22..8dfcb3944b 100644 --- a/src/include/storage/predicate.h +++ b/src/include/storage/predicate.h @@ -22,9 +22,9 @@ /* * GUC variables */ -extern int max_predicate_locks_per_xact; -extern int max_predicate_locks_per_relation; -extern int max_predicate_locks_per_page; +extern PGDLLIMPORT int max_predicate_locks_per_xact; +extern PGDLLIMPORT int max_predicate_locks_per_relation; +extern PGDLLIMPORT int max_predicate_locks_per_page; /* Number of SLRU buffers to use for Serial SLRU */ diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h index 36ecf7d005..c02001d3a0 100644 --- a/src/include/storage/proc.h +++ b/src/include/storage/proc.h @@ -400,7 +400,7 @@ typedef struct PROC_HDR extern PGDLLIMPORT PROC_HDR *ProcGlobal; -extern PGPROC *PreparedXactProcs; +extern PGDLLIMPORT PGPROC *PreparedXactProcs; /* Accessor for PGPROC given a pgprocno. */ #define GetPGProcByNumber(n) (&ProcGlobal->allProcs[(n)]) @@ -421,7 +421,7 @@ extern PGDLLIMPORT int StatementTimeout; extern PGDLLIMPORT int LockTimeout; extern PGDLLIMPORT int IdleInTransactionSessionTimeout; extern PGDLLIMPORT int IdleSessionTimeout; -extern bool log_lock_waits; +extern PGDLLIMPORT bool log_lock_waits; /* diff --git a/src/include/storage/s_lock.h b/src/include/storage/s_lock.h index af1145d98f..39faa4d837 100644 --- a/src/include/storage/s_lock.h +++ b/src/include/storage/s_lock.h @@ -1042,7 +1042,7 @@ extern int tas(volatile slock_t *lock); /* in port/.../tas.s, or #define TAS_SPIN(lock) TAS(lock) #endif /* TAS_SPIN */ -extern slock_t dummy_spinlock; +extern PGDLLIMPORT slock_t dummy_spinlock; /* * Platform-independent out-of-line support routines diff --git a/src/include/storage/sinval.h b/src/include/storage/sinval.h index 593a4211af..e7cd45658c 100644 --- a/src/include/storage/sinval.h +++ b/src/include/storage/sinval.h @@ -123,9 +123,9 @@ typedef union /* Counter of messages processed; don't worry about overflow. */ -extern uint64 SharedInvalidMessageCounter; +extern PGDLLIMPORT uint64 SharedInvalidMessageCounter; -extern volatile sig_atomic_t catchupInterruptPending; +extern PGDLLIMPORT volatile sig_atomic_t catchupInterruptPending; extern void SendSharedInvalidMessages(const SharedInvalidationMessage *msgs, int n); diff --git a/src/include/storage/spin.h b/src/include/storage/spin.h index 70070ca9ab..7031f1d2c5 100644 --- a/src/include/storage/spin.h +++ b/src/include/storage/spin.h @@ -71,7 +71,7 @@ extern Size SpinlockSemaSize(void); #ifndef HAVE_SPINLOCKS extern void SpinlockSemaInit(void); -extern PGSemaphore *SpinlockSemaArray; +extern PGDLLIMPORT PGSemaphore *SpinlockSemaArray; #endif #endif /* SPIN_H */ diff --git a/src/include/storage/standby.h b/src/include/storage/standby.h index 58ea21aa13..6a7763264b 100644 --- a/src/include/storage/standby.h +++ b/src/include/storage/standby.h @@ -21,10 +21,10 @@ #include "storage/standbydefs.h" /* User-settable GUC parameters */ -extern int vacuum_defer_cleanup_age; -extern int max_standby_archive_delay; -extern int max_standby_streaming_delay; -extern bool log_recovery_conflict_waits; +extern PGDLLIMPORT int vacuum_defer_cleanup_age; +extern PGDLLIMPORT int max_standby_archive_delay; +extern PGDLLIMPORT int max_standby_streaming_delay; +extern PGDLLIMPORT bool log_recovery_conflict_waits; extern void InitRecoveryTransactionEnvironment(void); extern void ShutdownRecoveryTransactionEnvironment(void); diff --git a/src/include/tcop/tcopprot.h b/src/include/tcop/tcopprot.h index 92291a750d..87e408b719 100644 --- a/src/include/tcop/tcopprot.h +++ b/src/include/tcop/tcopprot.h @@ -25,11 +25,11 @@ /* Required daylight between max_stack_depth and the kernel limit, in bytes */ #define STACK_DEPTH_SLOP (512 * 1024L) -extern CommandDest whereToSendOutput; +extern PGDLLIMPORT CommandDest whereToSendOutput; extern PGDLLIMPORT const char *debug_query_string; -extern int max_stack_depth; -extern int PostAuthDelay; -extern int client_connection_check_interval; +extern PGDLLIMPORT int max_stack_depth; +extern PGDLLIMPORT int PostAuthDelay; +extern PGDLLIMPORT int client_connection_check_interval; /* GUC-configurable parameters */ diff --git a/src/include/tsearch/ts_cache.h b/src/include/tsearch/ts_cache.h index 5e70d74b41..5e4a49ea1c 100644 --- a/src/include/tsearch/ts_cache.h +++ b/src/include/tsearch/ts_cache.h @@ -84,7 +84,7 @@ typedef struct /* * GUC variable for current configuration */ -extern char *TSCurrentConfig; +extern PGDLLIMPORT char *TSCurrentConfig; extern TSParserCacheEntry *lookup_ts_parser_cache(Oid prsId); diff --git a/src/include/tsearch/ts_type.h b/src/include/tsearch/ts_type.h index 1a8bad8491..a2008f5504 100644 --- a/src/include/tsearch/ts_type.h +++ b/src/include/tsearch/ts_type.h @@ -169,7 +169,7 @@ typedef struct #define OP_PHRASE 4 /* highest code, tsquery_cleanup.c */ #define OP_COUNT 4 -extern const int tsearch_op_priority[OP_COUNT]; +extern PGDLLIMPORT const int tsearch_op_priority[OP_COUNT]; /* get operation priority by its code*/ #define OP_PRIORITY(x) ( tsearch_op_priority[(x) - 1] ) diff --git a/src/include/utils/array.h b/src/include/utils/array.h index 2dba156d35..656c766a9a 100644 --- a/src/include/utils/array.h +++ b/src/include/utils/array.h @@ -339,7 +339,7 @@ typedef struct ArrayIteratorData *ArrayIterator; /* * GUC parameter */ -extern bool Array_nulls; +extern PGDLLIMPORT bool Array_nulls; /* * prototypes for functions defined in arrayfuncs.c diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index 666e545496..221c3e6c3d 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -64,7 +64,7 @@ extern char *regexp_fixed_prefix(text *text_re, bool case_insensitive, Oid collation, bool *exact); /* ruleutils.c */ -extern bool quote_all_identifiers; +extern PGDLLIMPORT bool quote_all_identifiers; extern const char *quote_identifier(const char *ident); extern char *quote_qualified_identifier(const char *qualifier, const char *ident); diff --git a/src/include/utils/bytea.h b/src/include/utils/bytea.h index dfef8e2d52..c3c9e54707 100644 --- a/src/include/utils/bytea.h +++ b/src/include/utils/bytea.h @@ -22,6 +22,7 @@ typedef enum BYTEA_OUTPUT_HEX } ByteaOutputType; -extern int bytea_output; /* ByteaOutputType, but int for GUC enum */ +extern PGDLLIMPORT int bytea_output; /* ByteaOutputType, but int for GUC + * enum */ #endif /* BYTEA_H */ diff --git a/src/include/utils/datetime.h b/src/include/utils/datetime.h index 0801858d60..4527e82517 100644 --- a/src/include/utils/datetime.h +++ b/src/include/utils/datetime.h @@ -257,9 +257,10 @@ do { \ * Include check for leap year. */ -extern const char *const months[]; /* months (3-char abbreviations) */ -extern const char *const days[]; /* days (full names) */ -extern const int day_tab[2][13]; +extern PGDLLIMPORT const char *const months[]; /* months (3-char + * abbreviations) */ +extern PGDLLIMPORT const char *const days[]; /* days (full names) */ +extern PGDLLIMPORT const int day_tab[2][13]; /* * These are the rules for the Gregorian calendar, which was adopted in 1582. diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h index 3eb8de3966..f5c6cd904d 100644 --- a/src/include/utils/elog.h +++ b/src/include/utils/elog.h @@ -424,12 +424,12 @@ typedef enum PGERROR_VERBOSE /* all the facts, ma'am */ } PGErrorVerbosity; -extern int Log_error_verbosity; -extern char *Log_line_prefix; -extern int Log_destination; -extern char *Log_destination_string; -extern bool syslog_sequence_numbers; -extern bool syslog_split_messages; +extern PGDLLIMPORT int Log_error_verbosity; +extern PGDLLIMPORT char *Log_line_prefix; +extern PGDLLIMPORT int Log_destination; +extern PGDLLIMPORT char *Log_destination_string; +extern PGDLLIMPORT bool syslog_sequence_numbers; +extern PGDLLIMPORT bool syslog_split_messages; /* Log destination bitmap */ #define LOG_DESTINATION_STDERR 1 diff --git a/src/include/utils/fmgrtab.h b/src/include/utils/fmgrtab.h index e5f53d6295..0a59937656 100644 --- a/src/include/utils/fmgrtab.h +++ b/src/include/utils/fmgrtab.h @@ -32,17 +32,18 @@ typedef struct PGFunction func; /* pointer to compiled function */ } FmgrBuiltin; -extern const FmgrBuiltin fmgr_builtins[]; +extern PGDLLIMPORT const FmgrBuiltin fmgr_builtins[]; -extern const int fmgr_nbuiltins; /* number of entries in table */ +extern PGDLLIMPORT const int fmgr_nbuiltins; /* number of entries in table */ -extern const Oid fmgr_last_builtin_oid; /* highest function OID in table */ +extern PGDLLIMPORT const Oid fmgr_last_builtin_oid; /* highest function OID in + * table */ /* * Mapping from a builtin function's OID to its index in the fmgr_builtins * array. This is indexed from 0 through fmgr_last_builtin_oid. */ #define InvalidOidBuiltinMapping PG_UINT16_MAX -extern const uint16 fmgr_builtin_oid_index[]; +extern PGDLLIMPORT const uint16 fmgr_builtin_oid_index[]; #endif /* FMGRTAB_H */ diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index 1189e1a226..efcbad7842 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -239,53 +239,53 @@ typedef enum /* GUC vars that are actually declared in guc.c, rather than elsewhere */ -extern bool Debug_print_plan; -extern bool Debug_print_parse; -extern bool Debug_print_rewritten; -extern bool Debug_pretty_print; +extern PGDLLIMPORT bool Debug_print_plan; +extern PGDLLIMPORT bool Debug_print_parse; +extern PGDLLIMPORT bool Debug_print_rewritten; +extern PGDLLIMPORT bool Debug_pretty_print; -extern bool log_parser_stats; -extern bool log_planner_stats; -extern bool log_executor_stats; -extern bool log_statement_stats; -extern bool log_btree_build_stats; +extern PGDLLIMPORT bool log_parser_stats; +extern PGDLLIMPORT bool log_planner_stats; +extern PGDLLIMPORT bool log_executor_stats; +extern PGDLLIMPORT bool log_statement_stats; +extern PGDLLIMPORT bool log_btree_build_stats; extern PGDLLIMPORT bool check_function_bodies; -extern bool session_auth_is_superuser; +extern PGDLLIMPORT bool session_auth_is_superuser; -extern bool log_duration; -extern int log_parameter_max_length; -extern int log_parameter_max_length_on_error; -extern int log_min_error_statement; +extern PGDLLIMPORT bool log_duration; +extern PGDLLIMPORT int log_parameter_max_length; +extern PGDLLIMPORT int log_parameter_max_length_on_error; +extern PGDLLIMPORT int log_min_error_statement; extern PGDLLIMPORT int log_min_messages; extern PGDLLIMPORT int client_min_messages; -extern int log_min_duration_sample; -extern int log_min_duration_statement; -extern int log_temp_files; -extern double log_statement_sample_rate; -extern double log_xact_sample_rate; -extern char *backtrace_functions; -extern char *backtrace_symbol_list; +extern PGDLLIMPORT int log_min_duration_sample; +extern PGDLLIMPORT int log_min_duration_statement; +extern PGDLLIMPORT int log_temp_files; +extern PGDLLIMPORT double log_statement_sample_rate; +extern PGDLLIMPORT double log_xact_sample_rate; +extern PGDLLIMPORT char *backtrace_functions; +extern PGDLLIMPORT char *backtrace_symbol_list; -extern int temp_file_limit; +extern PGDLLIMPORT int temp_file_limit; -extern int num_temp_buffers; +extern PGDLLIMPORT int num_temp_buffers; extern PGDLLIMPORT char *cluster_name; extern PGDLLIMPORT char *ConfigFileName; -extern char *HbaFileName; -extern char *IdentFileName; -extern char *external_pid_file; +extern PGDLLIMPORT char *HbaFileName; +extern PGDLLIMPORT char *IdentFileName; +extern PGDLLIMPORT char *external_pid_file; extern PGDLLIMPORT char *application_name; -extern int tcp_keepalives_idle; -extern int tcp_keepalives_interval; -extern int tcp_keepalives_count; -extern int tcp_user_timeout; +extern PGDLLIMPORT int tcp_keepalives_idle; +extern PGDLLIMPORT int tcp_keepalives_interval; +extern PGDLLIMPORT int tcp_keepalives_count; +extern PGDLLIMPORT int tcp_user_timeout; #ifdef TRACE_SORT -extern bool trace_sort; +extern PGDLLIMPORT bool trace_sort; #endif /* diff --git a/src/include/utils/guc_tables.h b/src/include/utils/guc_tables.h index 63b56f18e0..ba44f7437b 100644 --- a/src/include/utils/guc_tables.h +++ b/src/include/utils/guc_tables.h @@ -249,10 +249,10 @@ struct config_enum }; /* constant tables corresponding to enums above and in guc.h */ -extern const char *const config_group_names[]; -extern const char *const config_type_names[]; -extern const char *const GucContext_Names[]; -extern const char *const GucSource_Names[]; +extern PGDLLIMPORT const char *const config_group_names[]; +extern PGDLLIMPORT const char *const config_type_names[]; +extern PGDLLIMPORT const char *const GucContext_Names[]; +extern PGDLLIMPORT const char *const GucSource_Names[]; /* get the current set of variables */ extern struct config_generic **get_guc_variables(void); diff --git a/src/include/utils/jsonpath.h b/src/include/utils/jsonpath.h index 1897ddffa6..358b9eb611 100644 --- a/src/include/utils/jsonpath.h +++ b/src/include/utils/jsonpath.h @@ -283,6 +283,6 @@ extern JsonbValue *JsonPathValue(Datum jb, JsonPath *jp, bool *empty, extern int EvalJsonPathVar(void *vars, char *varName, int varNameLen, JsonbValue *val, JsonbValue *baseObject); -extern const TableFuncRoutine JsonbTableRoutine; +extern PGDLLIMPORT const TableFuncRoutine JsonbTableRoutine; #endif diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h index a44e17ffdf..e7385faef8 100644 --- a/src/include/utils/pg_locale.h +++ b/src/include/utils/pg_locale.h @@ -38,16 +38,16 @@ #define LOCALE_NAME_BUFLEN 128 /* GUC settings */ -extern char *locale_messages; -extern char *locale_monetary; -extern char *locale_numeric; -extern char *locale_time; +extern PGDLLIMPORT char *locale_messages; +extern PGDLLIMPORT char *locale_monetary; +extern PGDLLIMPORT char *locale_numeric; +extern PGDLLIMPORT char *locale_time; /* lc_time localization cache */ -extern char *localized_abbrev_days[]; -extern char *localized_full_days[]; -extern char *localized_abbrev_months[]; -extern char *localized_full_months[]; +extern PGDLLIMPORT char *localized_abbrev_days[]; +extern PGDLLIMPORT char *localized_full_days[]; +extern PGDLLIMPORT char *localized_abbrev_months[]; +extern PGDLLIMPORT char *localized_full_months[]; extern bool check_locale_messages(char **newval, void **extra, GucSource source); @@ -103,7 +103,7 @@ struct pg_locale_struct typedef struct pg_locale_struct *pg_locale_t; -extern struct pg_locale_struct default_locale; +extern PGDLLIMPORT struct pg_locale_struct default_locale; extern void make_icu_collator(const char *iculocstr, struct pg_locale_struct *resultp); diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index ab27bc47c5..0ee60b2f2a 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -638,14 +638,14 @@ extern void pgstat_create_transactional(PgStat_Kind kind, Oid dboid, Oid objoid) * Variables in pgstat.c */ -extern PgStat_LocalState pgStatLocal; +extern PGDLLIMPORT PgStat_LocalState pgStatLocal; /* * Variables in pgstat_slru.c */ -extern bool have_slrustats; +extern PGDLLIMPORT bool have_slrustats; /* diff --git a/src/include/utils/plancache.h b/src/include/utils/plancache.h index 95b99e3d25..0499635f59 100644 --- a/src/include/utils/plancache.h +++ b/src/include/utils/plancache.h @@ -35,7 +35,7 @@ typedef enum } PlanCacheMode; /* GUC parameter */ -extern int plan_cache_mode; +extern PGDLLIMPORT int plan_cache_mode; #define CACHEDPLANSOURCE_MAGIC 195726186 #define CACHEDPLAN_MAGIC 953717834 diff --git a/src/include/utils/ps_status.h b/src/include/utils/ps_status.h index 9f43e1fdf0..bba463591f 100644 --- a/src/include/utils/ps_status.h +++ b/src/include/utils/ps_status.h @@ -12,7 +12,7 @@ #ifndef PS_STATUS_H #define PS_STATUS_H -extern bool update_process_title; +extern PGDLLIMPORT bool update_process_title; extern char **save_ps_display_args(int argc, char **argv); diff --git a/src/include/utils/queryjumble.h b/src/include/utils/queryjumble.h index c670662db2..3c2d9beab2 100644 --- a/src/include/utils/queryjumble.h +++ b/src/include/utils/queryjumble.h @@ -62,14 +62,14 @@ enum ComputeQueryIdType }; /* GUC parameters */ -extern int compute_query_id; +extern PGDLLIMPORT int compute_query_id; extern const char *CleanQuerytext(const char *query, int *location, int *len); extern JumbleState *JumbleQuery(Query *query, const char *querytext); extern void EnableQueryId(void); -extern bool query_id_enabled; +extern PGDLLIMPORT bool query_id_enabled; /* * Returns whether query identifier computation has been enabled, either diff --git a/src/include/utils/relcache.h b/src/include/utils/relcache.h index 2281a7dc53..86dddbd975 100644 --- a/src/include/utils/relcache.h +++ b/src/include/utils/relcache.h @@ -145,9 +145,9 @@ extern void RelationCacheInitFilePostInvalidate(void); extern void RelationCacheInitFileRemove(void); /* should be used only by relcache.c and catcache.c */ -extern bool criticalRelcachesBuilt; +extern PGDLLIMPORT bool criticalRelcachesBuilt; /* should be used only by relcache.c and postinit.c */ -extern bool criticalSharedRelcachesBuilt; +extern PGDLLIMPORT bool criticalSharedRelcachesBuilt; #endif /* RELCACHE_H */ diff --git a/src/include/utils/rls.h b/src/include/utils/rls.h index c1896d6735..75259cc1f7 100644 --- a/src/include/utils/rls.h +++ b/src/include/utils/rls.h @@ -14,7 +14,7 @@ #define RLS_H /* GUC variable */ -extern bool row_security; +extern PGDLLIMPORT bool row_security; /* * Used by callers of check_enable_rls. diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index e04018c034..67b217b1c1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -53,7 +53,7 @@ extern TimestampTz GetSnapshotCurrentTimestamp(void); extern TimestampTz GetOldSnapshotThresholdTimestamp(void); extern void SnapshotTooOldMagicForTest(void); -extern bool FirstSnapshotSet; +extern PGDLLIMPORT bool FirstSnapshotSet; extern PGDLLIMPORT TransactionId TransactionXmin; extern PGDLLIMPORT TransactionId RecentXmin; diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h index d33421d380..edf3a97318 100644 --- a/src/include/utils/timestamp.h +++ b/src/include/utils/timestamp.h @@ -57,10 +57,10 @@ /* Set at postmaster start */ -extern TimestampTz PgStartTime; +extern PGDLLIMPORT TimestampTz PgStartTime; /* Set at configuration reload */ -extern TimestampTz PgReloadTime; +extern PGDLLIMPORT TimestampTz PgReloadTime; /* Internal routines (not fmgr-callable) */ diff --git a/src/include/utils/xml.h b/src/include/utils/xml.h index c1de08d15b..6620a62619 100644 --- a/src/include/utils/xml.h +++ b/src/include/utils/xml.h @@ -75,10 +75,10 @@ extern char *map_sql_identifier_to_xml_name(const char *ident, bool fully_escape extern char *map_xml_name_to_sql_identifier(const char *name); extern char *map_sql_value_to_xml_value(Datum value, Oid type, bool xml_escape_strings); -extern int xmlbinary; /* XmlBinaryType, but int for guc enum */ +extern PGDLLIMPORT int xmlbinary; /* XmlBinaryType, but int for guc enum */ -extern int xmloption; /* XmlOptionType, but int for guc enum */ +extern PGDLLIMPORT int xmloption; /* XmlOptionType, but int for guc enum */ -extern const TableFuncRoutine XmlTableRoutine; +extern PGDLLIMPORT const TableFuncRoutine XmlTableRoutine; #endif /* XML_H */ From 891624f0ec3b3d353269b0bfc7bc545333d6b4d5 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 8 Apr 2022 15:07:35 +0200 Subject: [PATCH 461/772] psql: Fix translation marking Commit 5a2832465fd8984d089e8c44c094e6900d987fcd added addFooterToPublicationDesc() as a wrapper around printTableAddFooter(). The translation marker _() was moved to the body of addFooterToPublicationDesc(), but addFooterToPublicationDesc() was not added to GETTEXT_TRIGGERS, so those strings were lost for translation. To fix, add the translation markers to the call sites of addFooterToPublicationDesc() and remove the translation marker from the body of the function. This seems easiest since there were only two callers and it keeps the API consistent with printTableAddFooter(). While we're here, add some const decorations to the prototype of addFooterToPublicationDesc() for consistency with printTableAddFooter(). --- src/bin/psql/describe.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 797ef233c9..e8919ab0be 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -5966,8 +5966,8 @@ listPublications(const char *pattern) * Add footer to publication description. */ static bool -addFooterToPublicationDesc(PQExpBuffer buf, char *footermsg, - bool as_schema, printTableContent *cont) +addFooterToPublicationDesc(PQExpBuffer buf, const char *footermsg, + bool as_schema, printTableContent *const cont) { PGresult *res; int count = 0; @@ -5980,7 +5980,7 @@ addFooterToPublicationDesc(PQExpBuffer buf, char *footermsg, count = PQntuples(res); if (count > 0) - printTableAddFooter(cont, _(footermsg)); + printTableAddFooter(cont, footermsg); for (i = 0; i < count; i++) { @@ -6149,7 +6149,7 @@ describePublications(const char *pattern) " AND c.oid = pr.prrelid\n" " AND pr.prpubid = '%s'\n" "ORDER BY 1,2", pubid); - if (!addFooterToPublicationDesc(&buf, "Tables:", false, &cont)) + if (!addFooterToPublicationDesc(&buf, _("Tables:"), false, &cont)) goto error_return; if (pset.sversion >= 150000) @@ -6161,7 +6161,7 @@ describePublications(const char *pattern) " JOIN pg_catalog.pg_publication_namespace pn ON n.oid = pn.pnnspid\n" "WHERE pn.pnpubid = '%s'\n" "ORDER BY 1", pubid); - if (!addFooterToPublicationDesc(&buf, "Tables from schemas:", + if (!addFooterToPublicationDesc(&buf, _("Tables from schemas:"), true, &cont)) goto error_return; } From f37015a1617d4e6b4b50a1c789b382d9a654fcd9 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 8 Apr 2022 11:44:17 -0400 Subject: [PATCH 462/772] Rename delayChkpt to delayChkptFlags. Before commit 412ad7a55639516f284cd0ef9757d6ae5c7abd43, delayChkpt was a Boolean. Now it's an integer. Extensions using it need to be appropriately updated, so let's rename the field to make sure that a hard compilation failure occurs. Replacing delayChkpt with delayChkptFlags made a few comments extend past 80 characters, so I reflowed them and changed some wording very slightly. The back-branches will need a different change to restore compatibility with existing minor releases; this is just for master. Per suggestion from Tom Lane. Discussion: http://postgr.es/m/a7880f4d-1d74-582a-ada7-dad168d046d1@enterprisedb.com --- src/backend/access/transam/multixact.c | 6 ++--- src/backend/access/transam/twophase.c | 28 ++++++++++++------------ src/backend/access/transam/xact.c | 14 ++++++------ src/backend/access/transam/xlog.c | 10 ++++----- src/backend/access/transam/xloginsert.c | 2 +- src/backend/catalog/storage.c | 6 ++--- src/backend/storage/buffer/bufmgr.c | 12 +++++----- src/backend/storage/ipc/procarray.c | 29 +++++++++++++------------ src/backend/storage/lmgr/proc.c | 4 ++-- src/include/storage/proc.h | 2 +- 10 files changed, 57 insertions(+), 56 deletions(-) diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index 9f65c600d0..45907d1b44 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -3088,8 +3088,8 @@ TruncateMultiXact(MultiXactId newOldestMulti, Oid newOldestMultiDB) * crash/basebackup, even though the state of the data directory would * require it. */ - Assert((MyProc->delayChkpt & DELAY_CHKPT_START) == 0); - MyProc->delayChkpt |= DELAY_CHKPT_START; + Assert((MyProc->delayChkptFlags & DELAY_CHKPT_START) == 0); + MyProc->delayChkptFlags |= DELAY_CHKPT_START; /* WAL log truncation */ WriteMTruncateXlogRec(newOldestMultiDB, @@ -3115,7 +3115,7 @@ TruncateMultiXact(MultiXactId newOldestMulti, Oid newOldestMultiDB) /* Then offsets */ PerformOffsetsTruncation(oldestMulti, newOldestMulti); - MyProc->delayChkpt &= ~DELAY_CHKPT_START; + MyProc->delayChkptFlags &= ~DELAY_CHKPT_START; END_CRIT_SECTION(); LWLockRelease(MultiXactTruncationLock); diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index b35da6f1aa..7632596008 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -479,7 +479,7 @@ MarkAsPreparingGuts(GlobalTransaction gxact, TransactionId xid, const char *gid, } proc->xid = xid; Assert(proc->xmin == InvalidTransactionId); - proc->delayChkpt = 0; + proc->delayChkptFlags = 0; proc->statusFlags = 0; proc->pid = 0; proc->databaseId = databaseid; @@ -1173,11 +1173,11 @@ EndPrepare(GlobalTransaction gxact) * Now writing 2PC state data to WAL. We let the WAL's CRC protection * cover us, so no need to calculate a separate CRC. * - * We have to set delayChkpt here, too; otherwise a checkpoint starting - * immediately after the WAL record is inserted could complete without - * fsync'ing our state file. (This is essentially the same kind of race - * condition as the COMMIT-to-clog-write case that RecordTransactionCommit - * uses delayChkpt for; see notes there.) + * We have to set DELAY_CHKPT_START here, too; otherwise a checkpoint + * starting immediately after the WAL record is inserted could complete + * without fsync'ing our state file. (This is essentially the same kind + * of race condition as the COMMIT-to-clog-write case that + * RecordTransactionCommit uses DELAY_CHKPT_START for; see notes there.) * * We save the PREPARE record's location in the gxact for later use by * CheckPointTwoPhase. @@ -1186,8 +1186,8 @@ EndPrepare(GlobalTransaction gxact) START_CRIT_SECTION(); - Assert((MyProc->delayChkpt & DELAY_CHKPT_START) == 0); - MyProc->delayChkpt |= DELAY_CHKPT_START; + Assert((MyProc->delayChkptFlags & DELAY_CHKPT_START) == 0); + MyProc->delayChkptFlags |= DELAY_CHKPT_START; XLogBeginInsert(); for (record = records.head; record != NULL; record = record->next) @@ -1230,7 +1230,7 @@ EndPrepare(GlobalTransaction gxact) * checkpoint starting after this will certainly see the gxact as a * candidate for fsyncing. */ - MyProc->delayChkpt &= ~DELAY_CHKPT_START; + MyProc->delayChkptFlags &= ~DELAY_CHKPT_START; /* * Remember that we have this GlobalTransaction entry locked for us. If @@ -1817,7 +1817,7 @@ CheckPointTwoPhase(XLogRecPtr redo_horizon) * * Note that it isn't possible for there to be a GXACT with a * prepare_end_lsn set prior to the last checkpoint yet is marked invalid, - * because of the efforts with delayChkpt. + * because of the efforts with delayChkptFlags. */ LWLockAcquire(TwoPhaseStateLock, LW_SHARED); for (i = 0; i < TwoPhaseState->numPrepXacts; i++) @@ -2275,7 +2275,7 @@ ProcessTwoPhaseBuffer(TransactionId xid, * RecordTransactionCommitPrepared * * This is basically the same as RecordTransactionCommit (q.v. if you change - * this function): in particular, we must set the delayChkpt flag to avoid a + * this function): in particular, we must set DELAY_CHKPT_START to avoid a * race condition. * * We know the transaction made at least one XLOG entry (its PREPARE), @@ -2308,8 +2308,8 @@ RecordTransactionCommitPrepared(TransactionId xid, START_CRIT_SECTION(); /* See notes in RecordTransactionCommit */ - Assert((MyProc->delayChkpt & DELAY_CHKPT_START) == 0); - MyProc->delayChkpt |= DELAY_CHKPT_START; + Assert((MyProc->delayChkptFlags & DELAY_CHKPT_START) == 0); + MyProc->delayChkptFlags |= DELAY_CHKPT_START; /* * Emit the XLOG commit record. Note that we mark 2PC commits as @@ -2358,7 +2358,7 @@ RecordTransactionCommitPrepared(TransactionId xid, TransactionIdCommitTree(xid, nchildren, children); /* Checkpoint can proceed now */ - MyProc->delayChkpt &= ~DELAY_CHKPT_START; + MyProc->delayChkptFlags &= ~DELAY_CHKPT_START; END_CRIT_SECTION(); diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index bf2fc08d94..53f3e7fd1a 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -1387,14 +1387,14 @@ RecordTransactionCommit(void) * RecordTransactionAbort. That's because loss of a transaction abort * is noncritical; the presumption would be that it aborted, anyway. * - * It's safe to change the delayChkpt flag of our own backend without - * holding the ProcArrayLock, since we're the only one modifying it. - * This makes checkpoint's determination of which xacts are delayChkpt - * a bit fuzzy, but it doesn't matter. + * It's safe to change the delayChkptFlags flag of our own backend + * without holding the ProcArrayLock, since we're the only one + * modifying it. This makes checkpoint's determination of which xacts + * are delaying the checkpoint a bit fuzzy, but it doesn't matter. */ - Assert((MyProc->delayChkpt & DELAY_CHKPT_START) == 0); + Assert((MyProc->delayChkptFlags & DELAY_CHKPT_START) == 0); START_CRIT_SECTION(); - MyProc->delayChkpt |= DELAY_CHKPT_START; + MyProc->delayChkptFlags |= DELAY_CHKPT_START; SetCurrentTransactionStopTimestamp(); @@ -1496,7 +1496,7 @@ RecordTransactionCommit(void) */ if (markXidCommitted) { - MyProc->delayChkpt &= ~DELAY_CHKPT_START; + MyProc->delayChkptFlags &= ~DELAY_CHKPT_START; END_CRIT_SECTION(); } diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 6770c3ddba..a7814d4019 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -6505,11 +6505,11 @@ CreateCheckPoint(int flags) * protected by different locks, but again that seems best on grounds of * minimizing lock contention.) * - * A transaction that has not yet set delayChkpt when we look cannot be at - * risk, since he's not inserted his commit record yet; and one that's - * already cleared it is not at risk either, since he's done fixing clog - * and we will correctly flush the update below. So we cannot miss any - * xacts we need to wait for. + * A transaction that has not yet set delayChkptFlags when we look cannot + * be at risk, since it has not inserted its commit record yet; and one + * that's already cleared it is not at risk either, since it's done fixing + * clog and we will correctly flush the update below. So we cannot miss + * any xacts we need to wait for. */ vxids = GetVirtualXIDsDelayingChkpt(&nvxids, DELAY_CHKPT_START); if (nvxids > 0) diff --git a/src/backend/access/transam/xloginsert.c b/src/backend/access/transam/xloginsert.c index 462e23503e..2ce9be2cc7 100644 --- a/src/backend/access/transam/xloginsert.c +++ b/src/backend/access/transam/xloginsert.c @@ -1011,7 +1011,7 @@ XLogSaveBufferForHint(Buffer buffer, bool buffer_std) /* * Ensure no checkpoint can change our view of RedoRecPtr. */ - Assert((MyProc->delayChkpt & DELAY_CHKPT_START) != 0); + Assert((MyProc->delayChkptFlags & DELAY_CHKPT_START) != 0); /* * Update RedoRecPtr so that we can make the right decision diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index 9898701a43..e4d000d4fe 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -348,8 +348,8 @@ RelationTruncate(Relation rel, BlockNumber nblocks) * the blocks to not exist on disk at all, but not for them to have the * wrong contents. */ - Assert((MyProc->delayChkpt & DELAY_CHKPT_COMPLETE) == 0); - MyProc->delayChkpt |= DELAY_CHKPT_COMPLETE; + Assert((MyProc->delayChkptFlags & DELAY_CHKPT_COMPLETE) == 0); + MyProc->delayChkptFlags |= DELAY_CHKPT_COMPLETE; /* * We WAL-log the truncation before actually truncating, which means @@ -397,7 +397,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks) smgrtruncate(RelationGetSmgr(rel), forks, nforks, blocks); /* We've done all the critical work, so checkpoints are OK now. */ - MyProc->delayChkpt &= ~DELAY_CHKPT_COMPLETE; + MyProc->delayChkptFlags &= ~DELAY_CHKPT_COMPLETE; /* * Update upper-level FSM pages to account for the truncation. This is diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 93c1ea2d9f..c12028ca0f 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -4021,7 +4021,7 @@ MarkBufferDirtyHint(Buffer buffer, bool buffer_std) { XLogRecPtr lsn = InvalidXLogRecPtr; bool dirtied = false; - bool delayChkpt = false; + bool delayChkptFlags = false; uint32 buf_state; /* @@ -4071,9 +4071,9 @@ MarkBufferDirtyHint(Buffer buffer, bool buffer_std) * essential that CreateCheckPoint waits for virtual transactions * rather than full transactionids. */ - Assert((MyProc->delayChkpt & DELAY_CHKPT_START) == 0); - MyProc->delayChkpt |= DELAY_CHKPT_START; - delayChkpt = true; + Assert((MyProc->delayChkptFlags & DELAY_CHKPT_START) == 0); + MyProc->delayChkptFlags |= DELAY_CHKPT_START; + delayChkptFlags = true; lsn = XLogSaveBufferForHint(buffer, buffer_std); } @@ -4105,8 +4105,8 @@ MarkBufferDirtyHint(Buffer buffer, bool buffer_std) buf_state |= BM_DIRTY | BM_JUST_DIRTIED; UnlockBufHdr(bufHdr, buf_state); - if (delayChkpt) - MyProc->delayChkpt &= ~DELAY_CHKPT_START; + if (delayChkptFlags) + MyProc->delayChkptFlags &= ~DELAY_CHKPT_START; if (dirtied) { diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index 735763cc24..603f6aba71 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -700,7 +700,7 @@ ProcArrayEndTransaction(PGPROC *proc, TransactionId latestXid) proc->xmin = InvalidTransactionId; /* be sure this is cleared in abort */ - proc->delayChkpt = 0; + proc->delayChkptFlags = 0; proc->recoveryConflictPending = false; @@ -742,7 +742,7 @@ ProcArrayEndTransactionInternal(PGPROC *proc, TransactionId latestXid) proc->xmin = InvalidTransactionId; /* be sure this is cleared in abort */ - proc->delayChkpt = 0; + proc->delayChkptFlags = 0; proc->recoveryConflictPending = false; @@ -929,7 +929,7 @@ ProcArrayClearTransaction(PGPROC *proc) proc->recoveryConflictPending = false; Assert(!(proc->statusFlags & PROC_VACUUM_STATE_MASK)); - Assert(!proc->delayChkpt); + Assert(!proc->delayChkptFlags); /* * Need to increment completion count even though transaction hasn't @@ -3059,19 +3059,20 @@ GetOldestSafeDecodingTransactionId(bool catalogOnly) * delaying checkpoint because they have critical actions in progress. * * Constructs an array of VXIDs of transactions that are currently in commit - * critical sections, as shown by having specified delayChkpt bits set in their - * PGPROC. + * critical sections, as shown by having specified delayChkptFlags bits set + * in their PGPROC. * * Returns a palloc'd array that should be freed by the caller. * *nvxids is the number of valid entries. * - * Note that because backends set or clear delayChkpt without holding any lock, - * the result is somewhat indeterminate, but we don't really care. Even in - * a multiprocessor with delayed writes to shared memory, it should be certain - * that setting of delayChkpt will propagate to shared memory when the backend - * takes a lock, so we cannot fail to see a virtual xact as delayChkpt if - * it's already inserted its commit record. Whether it takes a little while - * for clearing of delayChkpt to propagate is unimportant for correctness. + * Note that because backends set or clear delayChkptFlags without holding any + * lock, the result is somewhat indeterminate, but we don't really care. Even + * in a multiprocessor with delayed writes to shared memory, it should be + * certain that setting of delayChkptFlags will propagate to shared memory + * when the backend takes a lock, so we cannot fail to see a virtual xact as + * delayChkptFlags if it's already inserted its commit record. Whether it + * takes a little while for clearing of delayChkptFlags to propagate is + * unimportant for correctness. */ VirtualTransactionId * GetVirtualXIDsDelayingChkpt(int *nvxids, int type) @@ -3094,7 +3095,7 @@ GetVirtualXIDsDelayingChkpt(int *nvxids, int type) int pgprocno = arrayP->pgprocnos[index]; PGPROC *proc = &allProcs[pgprocno]; - if ((proc->delayChkpt & type) != 0) + if ((proc->delayChkptFlags & type) != 0) { VirtualTransactionId vxid; @@ -3138,7 +3139,7 @@ HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids, int nvxids, int type) GET_VXID_FROM_PGPROC(vxid, *proc); - if ((proc->delayChkpt & type) != 0 && + if ((proc->delayChkptFlags & type) != 0 && VirtualTransactionIdIsValid(vxid)) { int i; diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index df080cd332..93d082c45e 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -393,7 +393,7 @@ InitProcess(void) MyProc->roleId = InvalidOid; MyProc->tempNamespaceId = InvalidOid; MyProc->isBackgroundWorker = IsBackgroundWorker; - MyProc->delayChkpt = 0; + MyProc->delayChkptFlags = 0; MyProc->statusFlags = 0; /* NB -- autovac launcher intentionally does not set IS_AUTOVACUUM */ if (IsAutoVacuumWorkerProcess()) @@ -578,7 +578,7 @@ InitAuxiliaryProcess(void) MyProc->roleId = InvalidOid; MyProc->tempNamespaceId = InvalidOid; MyProc->isBackgroundWorker = IsBackgroundWorker; - MyProc->delayChkpt = 0; + MyProc->delayChkptFlags = 0; MyProc->statusFlags = 0; MyProc->lwWaiting = false; MyProc->lwWaitMode = 0; diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h index c02001d3a0..809b74db5e 100644 --- a/src/include/storage/proc.h +++ b/src/include/storage/proc.h @@ -226,7 +226,7 @@ struct PGPROC pg_atomic_uint64 waitStart; /* time at which wait for lock acquisition * started */ - int delayChkpt; /* for DELAY_CHKPT_* flags */ + int delayChkptFlags; /* for DELAY_CHKPT_* flags */ uint8 statusFlags; /* this backend's status flags, see PROC_* * above. mirrored in From 5c431c7fb327e1abc70b7a197650f8d45fd5bede Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 8 Apr 2022 14:22:47 -0400 Subject: [PATCH 463/772] Fix busted .gitignore entry. Typo in commit 2258e76f9. --- src/bin/pg_waldump/.gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bin/pg_waldump/.gitignore b/src/bin/pg_waldump/.gitignore index dabb6e34b6..dc6705f5b2 100644 --- a/src/bin/pg_waldump/.gitignore +++ b/src/bin/pg_waldump/.gitignore @@ -22,8 +22,10 @@ /tblspcdesc.c /xactdesc.c /xlogdesc.c + +# Source files copied from src/backend/access/transam/ /xlogreader.c -/xlogstat.c +/xlogstats.c # Generated by test suite /tmp_check/ From 9a374b77fb53e4cfbca121e4fa278a7d71bde7c4 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 8 Apr 2022 14:55:14 -0400 Subject: [PATCH 464/772] Improve frontend error logging style. Get rid of the separate "FATAL" log level, as it was applied so inconsistently as to be meaningless. This mostly involves s/pg_log_fatal/pg_log_error/g. Create a macro pg_fatal() to handle the common use-case of pg_log_error() immediately followed by exit(1). Various modules had already invented either this or equivalent macros; standardize on pg_fatal() and apply it where possible. Invent the ability to add "detail" and "hint" messages to a frontend message, much as we have long had in the backend. Except where rewording was needed to convert existing coding to detail/hint style, I have (mostly) resisted the temptation to change existing message wording. Patch by me. Design and patch reviewed at various stages by Robert Haas, Kyotaro Horiguchi, Peter Eisentraut and Daniel Gustafsson. Discussion: https://postgr.es/m/1363732.1636496441@sss.pgh.pa.us --- contrib/oid2name/oid2name.c | 22 +- contrib/vacuumlo/vacuumlo.c | 18 +- src/bin/initdb/initdb.c | 333 +++++--------- src/bin/pg_amcheck/pg_amcheck.c | 84 ++-- src/bin/pg_archivecleanup/pg_archivecleanup.c | 40 +- src/bin/pg_basebackup/bbstreamer_file.c | 58 +-- src/bin/pg_basebackup/bbstreamer_gzip.c | 47 +- src/bin/pg_basebackup/bbstreamer_inject.c | 3 +- src/bin/pg_basebackup/bbstreamer_lz4.c | 17 +- src/bin/pg_basebackup/bbstreamer_tar.c | 18 +- src/bin/pg_basebackup/bbstreamer_zstd.c | 33 +- src/bin/pg_basebackup/pg_basebackup.c | 407 +++++------------- src/bin/pg_basebackup/pg_receivewal.c | 148 ++----- src/bin/pg_basebackup/pg_recvlogical.c | 60 +-- src/bin/pg_basebackup/receivelog.c | 16 +- src/bin/pg_basebackup/streamutil.c | 10 +- src/bin/pg_basebackup/walmethods.c | 5 +- src/bin/pg_checksums/pg_checksums.c | 97 ++--- src/bin/pg_controldata/pg_controldata.c | 8 +- src/bin/pg_ctl/pg_ctl.c | 8 +- src/bin/pg_dump/common.c | 27 +- src/bin/pg_dump/compress_io.c | 38 +- src/bin/pg_dump/nls.mk | 3 +- src/bin/pg_dump/parallel.c | 39 +- src/bin/pg_dump/pg_backup_archiver.c | 154 +++---- src/bin/pg_dump/pg_backup_archiver.h | 6 +- src/bin/pg_dump/pg_backup_custom.c | 72 ++-- src/bin/pg_dump/pg_backup_db.c | 46 +- src/bin/pg_dump/pg_backup_directory.c | 72 ++-- src/bin/pg_dump/pg_backup_null.c | 4 +- src/bin/pg_dump/pg_backup_tar.c | 70 +-- src/bin/pg_dump/pg_backup_utils.c | 8 +- src/bin/pg_dump/pg_backup_utils.h | 8 +- src/bin/pg_dump/pg_dump.c | 278 ++++++------ src/bin/pg_dump/pg_dump_sort.c | 14 +- src/bin/pg_dump/pg_dumpall.c | 105 ++--- src/bin/pg_dump/pg_restore.c | 44 +- src/bin/pg_dump/t/003_pg_dump_with_server.pl | 2 +- src/bin/pg_resetwal/pg_resetwal.c | 210 +++------ src/bin/pg_rewind/nls.mk | 3 +- src/bin/pg_rewind/pg_rewind.c | 54 +-- src/bin/pg_rewind/pg_rewind.h | 3 - src/bin/pg_rewind/t/009_growing_files.pl | 2 +- src/bin/pg_rewind/timeline.c | 8 +- src/bin/pg_test_fsync/pg_test_fsync.c | 24 +- src/bin/pg_upgrade/pg_upgrade.h | 3 + src/bin/pg_verifybackup/pg_verifybackup.c | 34 +- src/bin/pg_verifybackup/t/005_bad_manifest.pl | 2 +- src/bin/pg_waldump/nls.mk | 4 +- src/bin/pg_waldump/pg_waldump.c | 59 ++- src/bin/pgbench/pgbench.c | 285 ++++-------- src/bin/psql/command.c | 2 +- src/bin/psql/common.c | 2 +- src/bin/psql/help.c | 5 +- src/bin/psql/mainloop.c | 10 +- src/bin/psql/startup.c | 28 +- src/bin/psql/t/001_basic.pl | 2 +- src/bin/scripts/clusterdb.c | 15 +- src/bin/scripts/createdb.c | 20 +- src/bin/scripts/createuser.c | 12 +- src/bin/scripts/dropdb.c | 7 +- src/bin/scripts/dropuser.c | 7 +- src/bin/scripts/pg_isready.c | 5 +- src/bin/scripts/reindexdb.c | 65 +-- src/bin/scripts/vacuumdb.c | 136 ++---- src/common/controldata_utils.c | 40 +- src/common/file_utils.c | 6 +- src/common/logging.c | 60 +-- src/common/restricted_token.c | 5 +- src/fe_utils/archive.c | 35 +- src/fe_utils/connect_utils.c | 10 +- src/fe_utils/parallel_slot.c | 5 +- src/fe_utils/query_utils.c | 4 +- src/fe_utils/recovery_gen.c | 40 +- src/include/common/logging.h | 115 ++++- src/include/lib/simplehash.h | 3 +- src/nls-global.mk | 10 +- 77 files changed, 1367 insertions(+), 2395 deletions(-) diff --git a/contrib/oid2name/oid2name.c b/contrib/oid2name/oid2name.c index 65cce49993..a62a5eedb1 100644 --- a/contrib/oid2name/oid2name.c +++ b/contrib/oid2name/oid2name.c @@ -182,16 +182,17 @@ get_opts(int argc, char **argv, struct options *my_opts) break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } if (optind < argc) { - fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), - progname, argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error("too many command-line arguments (first is \"%s\")", + argv[optind]); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -328,11 +329,8 @@ sql_conn(struct options *my_opts) conn = PQconnectdbParams(keywords, values, true); if (!conn) - { - pg_log_error("could not connect to database %s", - my_opts->dbname); - exit(1); - } + pg_fatal("could not connect to database %s", + my_opts->dbname); if (PQstatus(conn) == CONNECTION_BAD && PQconnectionNeedsPassword(conn) && @@ -359,7 +357,7 @@ sql_conn(struct options *my_opts) PQerrorMessage(conn)); PQclear(res); PQfinish(conn); - exit(-1); + exit(1); } PQclear(res); @@ -390,11 +388,11 @@ sql_exec(PGconn *conn, const char *todo, bool quiet) if (!res || PQresultStatus(res) > 2) { pg_log_error("query failed: %s", PQerrorMessage(conn)); - pg_log_error("query was: %s", todo); + pg_log_error_detail("Query was: %s", todo); PQclear(res); PQfinish(conn); - exit(-1); + exit(1); } /* get the number of fields */ diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c index d15edca454..b7c8f2c805 100644 --- a/contrib/vacuumlo/vacuumlo.c +++ b/contrib/vacuumlo/vacuumlo.c @@ -492,19 +492,13 @@ main(int argc, char **argv) { switch (c) { - case '?': - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); - exit(1); case 'h': param.pg_host = pg_strdup(optarg); break; case 'l': param.transaction_limit = strtol(optarg, NULL, 10); if (param.transaction_limit < 0) - { - pg_log_error("transaction limit must not be negative (0 disables)"); - exit(1); - } + pg_fatal("transaction limit must not be negative (0 disables)"); break; case 'n': param.dry_run = 1; @@ -513,10 +507,7 @@ main(int argc, char **argv) case 'p': port = strtol(optarg, NULL, 10); if ((port < 1) || (port > 65535)) - { - pg_log_error("invalid port number: %s", optarg); - exit(1); - } + pg_fatal("invalid port number: %s", optarg); param.pg_port = pg_strdup(optarg); break; case 'U': @@ -532,7 +523,8 @@ main(int argc, char **argv) param.pg_prompt = TRI_YES; break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -541,7 +533,7 @@ main(int argc, char **argv) if (optind >= argc) { pg_log_error("missing required argument: database name"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index bbca1236d9..ab826da650 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -331,10 +331,7 @@ escape_quotes(const char *src) char *result = escape_single_quotes_ascii(src); if (!result) - { - pg_log_error("out of memory"); - exit(1); - } + pg_fatal("out of memory"); return result; } @@ -464,10 +461,7 @@ readfile(const char *path) int n; if ((infile = fopen(path, "r")) == NULL) - { - pg_log_error("could not open file \"%s\" for reading: %m", path); - exit(1); - } + pg_fatal("could not open file \"%s\" for reading: %m", path); initStringInfo(&line); @@ -508,24 +502,15 @@ writefile(char *path, char **lines) char **line; if ((out_file = fopen(path, "w")) == NULL) - { - pg_log_error("could not open file \"%s\" for writing: %m", path); - exit(1); - } + pg_fatal("could not open file \"%s\" for writing: %m", path); for (line = lines; *line != NULL; line++) { if (fputs(*line, out_file) < 0) - { - pg_log_error("could not write file \"%s\": %m", path); - exit(1); - } + pg_fatal("could not write file \"%s\": %m", path); free(*line); } if (fclose(out_file)) - { - pg_log_error("could not write file \"%s\": %m", path); - exit(1); - } + pg_fatal("could not close file \"%s\": %m", path); } /* @@ -611,9 +596,7 @@ get_id(void) if (geteuid() == 0) /* 0 is root's uid */ { pg_log_error("cannot be run as root"); - fprintf(stderr, - _("Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" - "own the server process.\n")); + pg_log_error_hint("Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."); exit(1); } #endif @@ -645,9 +628,8 @@ get_encoding_id(const char *encoding_name) if ((enc = pg_valid_server_encoding(encoding_name)) >= 0) return enc; } - pg_log_error("\"%s\" is not a valid server encoding name", - encoding_name ? encoding_name : "(null)"); - exit(1); + pg_fatal("\"%s\" is not a valid server encoding name", + encoding_name ? encoding_name : "(null)"); } /* @@ -791,25 +773,19 @@ check_input(char *path) if (errno == ENOENT) { pg_log_error("file \"%s\" does not exist", path); - fprintf(stderr, - _("This might mean you have a corrupted installation or identified\n" - "the wrong directory with the invocation option -L.\n")); + pg_log_error_hint("This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."); } else { pg_log_error("could not access file \"%s\": %m", path); - fprintf(stderr, - _("This might mean you have a corrupted installation or identified\n" - "the wrong directory with the invocation option -L.\n")); + pg_log_error_hint("This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."); } exit(1); } if (!S_ISREG(statbuf.st_mode)) { pg_log_error("file \"%s\" is not a regular file", path); - fprintf(stderr, - _("This might mean you have a corrupted installation or identified\n" - "the wrong directory with the invocation option -L.\n")); + pg_log_error_hint("This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."); exit(1); } } @@ -830,16 +806,10 @@ write_version_file(const char *extrapath) path = psprintf("%s/%s/PG_VERSION", pg_data, extrapath); if ((version_file = fopen(path, PG_BINARY_W)) == NULL) - { - pg_log_error("could not open file \"%s\" for writing: %m", path); - exit(1); - } + pg_fatal("could not open file \"%s\" for writing: %m", path); if (fprintf(version_file, "%s\n", PG_MAJORVERSION) < 0 || fclose(version_file)) - { - pg_log_error("could not write file \"%s\": %m", path); - exit(1); - } + pg_fatal("could not write file \"%s\": %m", path); free(path); } @@ -856,15 +826,9 @@ set_null_conf(void) path = psprintf("%s/postgresql.conf", pg_data); conf_file = fopen(path, PG_BINARY_W); if (conf_file == NULL) - { - pg_log_error("could not open file \"%s\" for writing: %m", path); - exit(1); - } + pg_fatal("could not open file \"%s\" for writing: %m", path); if (fclose(conf_file)) - { - pg_log_error("could not write file \"%s\": %m", path); - exit(1); - } + pg_fatal("could not write file \"%s\": %m", path); free(path); } @@ -1218,10 +1182,7 @@ setup_config(void) writefile(path, conflines); if (chmod(path, pg_file_create_mode) != 0) - { - pg_log_error("could not change permissions of \"%s\": %m", path); - exit(1); - } + pg_fatal("could not change permissions of \"%s\": %m", path); /* * create the automatic configuration file to store the configuration @@ -1237,10 +1198,7 @@ setup_config(void) writefile(path, autoconflines); if (chmod(path, pg_file_create_mode) != 0) - { - pg_log_error("could not change permissions of \"%s\": %m", path); - exit(1); - } + pg_fatal("could not change permissions of \"%s\": %m", path); free(conflines); @@ -1323,10 +1281,7 @@ setup_config(void) writefile(path, conflines); if (chmod(path, pg_file_create_mode) != 0) - { - pg_log_error("could not change permissions of \"%s\": %m", path); - exit(1); - } + pg_fatal("could not change permissions of \"%s\": %m", path); free(conflines); @@ -1338,10 +1293,7 @@ setup_config(void) writefile(path, conflines); if (chmod(path, pg_file_create_mode) != 0) - { - pg_log_error("could not change permissions of \"%s\": %m", path); - exit(1); - } + pg_fatal("could not change permissions of \"%s\": %m", path); free(conflines); @@ -1375,9 +1327,7 @@ bootstrap_template1(void) { pg_log_error("input file \"%s\" does not belong to PostgreSQL %s", bki_file, PG_VERSION); - fprintf(stderr, - _("Check your installation or specify the correct path " - "using the option -L.\n")); + pg_log_error_hint("Specify the correct path using the option -L."); exit(1); } @@ -1503,21 +1453,17 @@ get_su_pwd(void) FILE *pwf = fopen(pwfilename, "r"); if (!pwf) - { - pg_log_error("could not open file \"%s\" for reading: %m", - pwfilename); - exit(1); - } + pg_fatal("could not open file \"%s\" for reading: %m", + pwfilename); pwd1 = pg_get_line(pwf, NULL); if (!pwd1) { if (ferror(pwf)) - pg_log_error("could not read password from file \"%s\": %m", - pwfilename); + pg_fatal("could not read password from file \"%s\": %m", + pwfilename); else - pg_log_error("password file \"%s\" is empty", - pwfilename); - exit(1); + pg_fatal("password file \"%s\" is empty", + pwfilename); } fclose(pwf); @@ -2065,10 +2011,7 @@ check_locale_name(int category, const char *locale, char **canonname) save = setlocale(category, NULL); if (!save) - { - pg_log_error("setlocale() failed"); - exit(1); - } + pg_fatal("setlocale() failed"); /* save may be pointing at a modifiable scratch variable, so copy it. */ save = pg_strdup(save); @@ -2086,17 +2029,14 @@ check_locale_name(int category, const char *locale, char **canonname) /* restore old value. */ if (!setlocale(category, save)) - { - pg_log_error("failed to restore old locale \"%s\"", save); - exit(1); - } + pg_fatal("failed to restore old locale \"%s\"", save); free(save); /* complain if locale wasn't valid */ if (res == NULL) { if (*locale) - pg_log_error("invalid locale name \"%s\"", locale); + pg_fatal("invalid locale name \"%s\"", locale); else { /* @@ -2107,9 +2047,8 @@ check_locale_name(int category, const char *locale, char **canonname) * setlocale's behavior is implementation-specific, it's hard to * be sure what it didn't like. Print a safe generic message. */ - pg_log_error("invalid locale settings; check LANG and LC_* environment variables"); + pg_fatal("invalid locale settings; check LANG and LC_* environment variables"); } - exit(1); } } @@ -2135,15 +2074,14 @@ check_locale_encoding(const char *locale, int user_enc) user_enc == PG_SQL_ASCII)) { pg_log_error("encoding mismatch"); - fprintf(stderr, - _("The encoding you selected (%s) and the encoding that the\n" - "selected locale uses (%s) do not match. This would lead to\n" - "misbehavior in various character string processing functions.\n" - "Rerun %s and either do not specify an encoding explicitly,\n" - "or choose a matching combination.\n"), - pg_encoding_to_char(user_enc), - pg_encoding_to_char(locale_enc), - progname); + pg_log_error_detail("The encoding you selected (%s) and the encoding that the " + "selected locale uses (%s) do not match. This would lead to " + "misbehavior in various character string processing functions.", + pg_encoding_to_char(user_enc), + pg_encoding_to_char(locale_enc)); + pg_log_error_hint("Rerun %s and either do not specify an encoding explicitly, " + "or choose a matching combination.", + progname); return false; } return true; @@ -2203,18 +2141,14 @@ setlocales(void) if (locale_provider == COLLPROVIDER_ICU) { if (!icu_locale) - { - pg_log_error("ICU locale must be specified"); - exit(1); - } + pg_fatal("ICU locale must be specified"); /* * In supported builds, the ICU locale ID will be checked by the - * backend when performing the post-boostrap initialization. + * backend during post-bootstrap initialization. */ #ifndef USE_ICU - pg_log_error("ICU is not supported in this build"); - exit(1); + pg_fatal("ICU is not supported in this build"); #endif } } @@ -2295,9 +2229,8 @@ check_authmethod_valid(const char *authmethod, const char *const *valid_methods, return; } - pg_log_error("invalid authentication method \"%s\" for \"%s\" connections", - authmethod, conntype); - exit(1); + pg_fatal("invalid authentication method \"%s\" for \"%s\" connections", + authmethod, conntype); } static void @@ -2310,10 +2243,7 @@ check_need_password(const char *authmethodlocal, const char *authmethodhost) strcmp(authmethodhost, "password") == 0 || strcmp(authmethodhost, "scram-sha-256") == 0) && !(pwprompt || pwfilename)) - { - pg_log_error("must specify a password for the superuser to enable password authentication"); - exit(1); - } + pg_fatal("must specify a password for the superuser to enable password authentication"); } @@ -2333,10 +2263,9 @@ setup_pgdata(void) else { pg_log_error("no data directory specified"); - fprintf(stderr, - _("You must identify the directory where the data for this database system\n" - "will reside. Do this with either the invocation option -D or the\n" - "environment variable PGDATA.\n")); + pg_log_error_hint("You must identify the directory where the data for this database system " + "will reside. Do this with either the invocation option -D or the " + "environment variable PGDATA."); exit(1); } } @@ -2351,10 +2280,7 @@ setup_pgdata(void) * have embedded spaces. */ if (setenv("PGDATA", pg_data, 1) != 0) - { - pg_log_error("could not set environment"); - exit(1); - } + pg_fatal("could not set environment"); } @@ -2372,16 +2298,11 @@ setup_bin_paths(const char *argv0) strlcpy(full_path, progname, sizeof(full_path)); if (ret == -1) - pg_log_error("The program \"%s\" is needed by %s but was not found in the\n" - "same directory as \"%s\".\n" - "Check your installation.", - "postgres", progname, full_path); + pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"", + "postgres", progname, full_path); else - pg_log_error("The program \"%s\" was found by \"%s\"\n" - "but was not the same version as %s.\n" - "Check your installation.", - "postgres", full_path, progname); - exit(1); + pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s", + "postgres", full_path, progname); } /* store binary directory */ @@ -2395,10 +2316,7 @@ setup_bin_paths(const char *argv0) get_share_path(backend_exec, share_path); } else if (!is_absolute_path(share_path)) - { - pg_log_error("input file location must be an absolute path"); - exit(1); - } + pg_fatal("input file location must be an absolute path"); canonicalize_path(share_path); } @@ -2449,9 +2367,8 @@ setup_locale_encoding(void) /* Couldn't recognize the locale's codeset */ pg_log_error("could not find suitable encoding for locale \"%s\"", lc_ctype); - fprintf(stderr, _("Rerun %s with the -E option.\n"), progname); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Rerun %s with the -E option.", progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } else if (!pg_valid_server_encoding_id(ctype_enc)) @@ -2470,10 +2387,10 @@ setup_locale_encoding(void) #else pg_log_error("locale \"%s\" requires unsupported encoding \"%s\"", lc_ctype, pg_encoding_to_char(ctype_enc)); - fprintf(stderr, - _("Encoding \"%s\" is not allowed as a server-side encoding.\n" - "Rerun %s with a different locale selection.\n"), - pg_encoding_to_char(ctype_enc), progname); + pg_log_error_detail("Encoding \"%s\" is not allowed as a server-side encoding.", + pg_encoding_to_char(ctype_enc)); + pg_log_error_hint("Rerun %s with a different locale selection.", + progname); exit(1); #endif } @@ -2616,10 +2533,7 @@ create_data_directory(void) fflush(stdout); if (pg_mkdir_p(pg_data, pg_dir_create_mode) != 0) - { - pg_log_error("could not create directory \"%s\": %m", pg_data); - exit(1); - } + pg_fatal("could not create directory \"%s\": %m", pg_data); else check_ok(); @@ -2633,11 +2547,8 @@ create_data_directory(void) fflush(stdout); if (chmod(pg_data, pg_dir_create_mode) != 0) - { - pg_log_error("could not change permissions of directory \"%s\": %m", - pg_data); - exit(1); - } + pg_fatal("could not change permissions of directory \"%s\": %m", + pg_data); else check_ok(); @@ -2652,17 +2563,15 @@ create_data_directory(void) if (ret != 4) warn_on_mount_point(ret); else - fprintf(stderr, - _("If you want to create a new database system, either remove or empty\n" - "the directory \"%s\" or run %s\n" - "with an argument other than \"%s\".\n"), - pg_data, progname, pg_data); + pg_log_error_hint("If you want to create a new database system, either remove or empty " + "the directory \"%s\" or run %s " + "with an argument other than \"%s\".", + pg_data, progname, pg_data); exit(1); /* no further message needed */ default: /* Trouble accessing directory */ - pg_log_error("could not access directory \"%s\": %m", pg_data); - exit(1); + pg_fatal("could not access directory \"%s\": %m", pg_data); } } @@ -2683,10 +2592,7 @@ create_xlog_or_symlink(void) /* clean up xlog directory name, check it's absolute */ canonicalize_path(xlog_dir); if (!is_absolute_path(xlog_dir)) - { - pg_log_error("WAL directory location must be an absolute path"); - exit(1); - } + pg_fatal("WAL directory location must be an absolute path"); /* check if the specified xlog directory exists/is empty */ switch ((ret = pg_check_dir(xlog_dir))) @@ -2698,11 +2604,8 @@ create_xlog_or_symlink(void) fflush(stdout); if (pg_mkdir_p(xlog_dir, pg_dir_create_mode) != 0) - { - pg_log_error("could not create directory \"%s\": %m", - xlog_dir); - exit(1); - } + pg_fatal("could not create directory \"%s\": %m", + xlog_dir); else check_ok(); @@ -2716,11 +2619,8 @@ create_xlog_or_symlink(void) fflush(stdout); if (chmod(xlog_dir, pg_dir_create_mode) != 0) - { - pg_log_error("could not change permissions of directory \"%s\": %m", - xlog_dir); - exit(1); - } + pg_fatal("could not change permissions of directory \"%s\": %m", + xlog_dir); else check_ok(); @@ -2735,39 +2635,29 @@ create_xlog_or_symlink(void) if (ret != 4) warn_on_mount_point(ret); else - fprintf(stderr, - _("If you want to store the WAL there, either remove or empty the directory\n" - "\"%s\".\n"), - xlog_dir); + pg_log_error_hint("If you want to store the WAL there, either remove or empty the directory \"%s\".", + xlog_dir); exit(1); default: /* Trouble accessing directory */ - pg_log_error("could not access directory \"%s\": %m", xlog_dir); - exit(1); + pg_fatal("could not access directory \"%s\": %m", xlog_dir); } #ifdef HAVE_SYMLINK if (symlink(xlog_dir, subdirloc) != 0) - { - pg_log_error("could not create symbolic link \"%s\": %m", - subdirloc); - exit(1); - } + pg_fatal("could not create symbolic link \"%s\": %m", + subdirloc); #else - pg_log_error("symlinks are not supported on this platform"); - exit(1); + pg_fatal("symlinks are not supported on this platform"); #endif } else { /* Without -X option, just make the subdirectory normally */ if (mkdir(subdirloc, pg_dir_create_mode) < 0) - { - pg_log_error("could not create directory \"%s\": %m", - subdirloc); - exit(1); - } + pg_fatal("could not create directory \"%s\": %m", + subdirloc); } free(subdirloc); @@ -2778,15 +2668,12 @@ void warn_on_mount_point(int error) { if (error == 2) - fprintf(stderr, - _("It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n")); + pg_log_error_detail("It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."); else if (error == 3) - fprintf(stderr, - _("It contains a lost+found directory, perhaps due to it being a mount point.\n")); + pg_log_error_detail("It contains a lost+found directory, perhaps due to it being a mount point."); - fprintf(stderr, - _("Using a mount point directly as the data directory is not recommended.\n" - "Create a subdirectory under the mount point.\n")); + pg_log_error_hint("Using a mount point directly as the data directory is not recommended.\n" + "Create a subdirectory under the mount point."); } @@ -2825,10 +2712,7 @@ initialize_data_directory(void) * pg_mkdir_p() here, which avoids some failure modes; cf bug #13853. */ if (mkdir(path, pg_dir_create_mode) < 0) - { - pg_log_error("could not create directory \"%s\": %m", path); - exit(1); - } + pg_fatal("could not create directory \"%s\": %m", path); free(path); } @@ -3096,18 +2980,14 @@ main(int argc, char *argv[]) else if (strcmp(optarg, "libc") == 0) locale_provider = COLLPROVIDER_LIBC; else - { - pg_log_error("unrecognized locale provider: %s", optarg); - exit(1); - } + pg_fatal("unrecognized locale provider: %s", optarg); break; case 16: icu_locale = pg_strdup(optarg); break; default: /* getopt_long already emitted a complaint */ - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -3127,17 +3007,13 @@ main(int argc, char *argv[]) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (icu_locale && locale_provider != COLLPROVIDER_ICU) - { - pg_log_error("%s cannot be specified unless locale provider \"%s\" is chosen", - "--icu-locale", "icu"); - exit(1); - } + pg_fatal("%s cannot be specified unless locale provider \"%s\" is chosen", + "--icu-locale", "icu"); atexit(cleanup_directories_atexit); @@ -3148,10 +3024,7 @@ main(int argc, char *argv[]) /* must check that directory is readable */ if (pg_check_dir(pg_data) <= 0) - { - pg_log_error("could not access directory \"%s\": %m", pg_data); - exit(1); - } + pg_fatal("could not access directory \"%s\": %m", pg_data); fputs(_("syncing data to disk ... "), stdout); fflush(stdout); @@ -3161,10 +3034,7 @@ main(int argc, char *argv[]) } if (pwprompt && pwfilename) - { - pg_log_error("password prompt and password file cannot be specified together"); - exit(1); - } + pg_fatal("password prompt and password file cannot be specified together"); check_authmethod_unspecified(&authmethodlocal); check_authmethod_unspecified(&authmethodhost); @@ -3186,15 +3056,9 @@ main(int argc, char *argv[]) /* verify that wal segment size is valid */ if (endptr == str_wal_segment_size_mb || *endptr != '\0') - { - pg_log_error("argument of --wal-segsize must be a number"); - exit(1); - } + pg_fatal("argument of --wal-segsize must be a number"); if (!IsValidWalSegSize(wal_segment_size_mb * 1024 * 1024)) - { - pg_log_error("argument of --wal-segsize must be a power of 2 between 1 and 1024"); - exit(1); - } + pg_fatal("argument of --wal-segsize must be a power of 2 between 1 and 1024"); } get_restricted_token(); @@ -3208,10 +3072,7 @@ main(int argc, char *argv[]) username = effective_user; if (strncmp(username, "pg_", 3) == 0) - { - pg_log_error("superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"", username); - exit(1); - } + pg_fatal("superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"", username); printf(_("The files belonging to this database system will be owned " "by user \"%s\".\n" @@ -3254,8 +3115,8 @@ main(int argc, char *argv[]) { printf("\n"); pg_log_warning("enabling \"trust\" authentication for local connections"); - fprintf(stderr, _("You can change this by editing pg_hba.conf or using the option -A, or\n" - "--auth-local and --auth-host, the next time you run initdb.\n")); + pg_log_warning_hint("You can change this by editing pg_hba.conf or using the option -A, or " + "--auth-local and --auth-host, the next time you run initdb."); } if (!noinstructions) diff --git a/src/bin/pg_amcheck/pg_amcheck.c b/src/bin/pg_amcheck/pg_amcheck.c index 6607f72938..90471e096d 100644 --- a/src/bin/pg_amcheck/pg_amcheck.c +++ b/src/bin/pg_amcheck/pg_amcheck.c @@ -202,9 +202,9 @@ static void compile_relation_list_one_db(PGconn *conn, SimplePtrList *relations, #define log_no_match(...) do { \ if (opts.strict_names) \ - pg_log_generic(PG_LOG_ERROR, __VA_ARGS__); \ + pg_log_error(__VA_ARGS__); \ else \ - pg_log_generic(PG_LOG_WARNING, __VA_ARGS__); \ + pg_log_warning(__VA_ARGS__); \ } while(0) #define FREE_AND_SET_NULL(x) do { \ @@ -396,39 +396,24 @@ main(int argc, char *argv[]) else if (pg_strcasecmp(optarg, "none") == 0) opts.skip = "none"; else - { - pg_log_error("invalid argument for option %s", "--skip"); - exit(1); - } + pg_fatal("invalid argument for option %s", "--skip"); break; case 7: errno = 0; optval = strtoul(optarg, &endptr, 10); if (endptr == optarg || *endptr != '\0' || errno != 0) - { - pg_log_error("invalid start block"); - exit(1); - } + pg_fatal("invalid start block"); if (optval > MaxBlockNumber) - { - pg_log_error("start block out of bounds"); - exit(1); - } + pg_fatal("start block out of bounds"); opts.startblock = optval; break; case 8: errno = 0; optval = strtoul(optarg, &endptr, 10); if (endptr == optarg || *endptr != '\0' || errno != 0) - { - pg_log_error("invalid end block"); - exit(1); - } + pg_fatal("invalid end block"); if (optval > MaxBlockNumber) - { - pg_log_error("end block out of bounds"); - exit(1); - } + pg_fatal("end block out of bounds"); opts.endblock = optval; break; case 9: @@ -450,18 +435,14 @@ main(int argc, char *argv[]) opts.install_schema = pg_strdup(optarg); break; default: - fprintf(stderr, - _("Try \"%s --help\" for more information.\n"), - progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } if (opts.endblock >= 0 && opts.endblock < opts.startblock) - { - pg_log_error("end block precedes start block"); - exit(1); - } + pg_fatal("end block precedes start block"); /* * A single non-option arguments specifies a database name or connection @@ -477,7 +458,7 @@ main(int argc, char *argv[]) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -495,19 +476,13 @@ main(int argc, char *argv[]) if (opts.alldb) { if (db != NULL) - { - pg_log_error("cannot specify a database name with --all"); - exit(1); - } + pg_fatal("cannot specify a database name with --all"); cparams.dbname = maintenance_db; } else if (db != NULL) { if (opts.dbpattern) - { - pg_log_error("cannot specify both a database name and database patterns"); - exit(1); - } + pg_fatal("cannot specify both a database name and database patterns"); cparams.dbname = db; } @@ -535,7 +510,7 @@ main(int argc, char *argv[]) { if (conn != NULL) disconnectDatabase(conn); - pg_log_error("no databases to check"); + pg_log_warning("no databases to check"); exit(0); } @@ -593,7 +568,7 @@ main(int argc, char *argv[]) /* Querying the catalog failed. */ pg_log_error("database \"%s\": %s", PQdb(conn), PQerrorMessage(conn)); - pg_log_info("query was: %s", amcheck_sql); + pg_log_error_detail("Query was: %s", amcheck_sql); PQclear(result); disconnectDatabase(conn); exit(1); @@ -669,8 +644,7 @@ main(int argc, char *argv[]) { if (conn != NULL) disconnectDatabase(conn); - pg_log_error("no relations to check"); - exit(1); + pg_fatal("no relations to check"); } progress_report(reltotal, relprogress, pagestotal, pageschecked, NULL, true, false); @@ -919,7 +893,7 @@ run_command(ParallelSlot *slot, const char *sql) pg_log_error("error sending command to database \"%s\": %s", PQdb(slot->connection), PQerrorMessage(slot->connection)); - pg_log_error("command was: %s", sql); + pg_log_error_detail("Command was: %s", sql); exit(1); } } @@ -1123,9 +1097,9 @@ verify_btree_slot_handler(PGresult *res, PGconn *conn, void *context) pg_log_warning("btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d", rel->datinfo->datname, rel->nspname, rel->relname, ntups); if (opts.verbose) - pg_log_info("query was: %s", rel->sql); - pg_log_warning("Are %s's and amcheck's versions compatible?", - progname); + pg_log_warning_detail("Query was: %s", rel->sql); + pg_log_warning_hint("Are %s's and amcheck's versions compatible?", + progname); progress_since_last_stderr = false; } } @@ -1648,7 +1622,7 @@ compile_database_list(PGconn *conn, SimplePtrList *databases, if (PQresultStatus(res) != PGRES_TUPLES_OK) { pg_log_error("query failed: %s", PQerrorMessage(conn)); - pg_log_info("query was: %s", sql.data); + pg_log_error_detail("Query was: %s", sql.data); disconnectDatabase(conn); exit(1); } @@ -1673,11 +1647,8 @@ compile_database_list(PGconn *conn, SimplePtrList *databases, */ fatal = opts.strict_names; if (pattern_id >= opts.include.len) - { - pg_log_error("internal error: received unexpected database pattern_id %d", - pattern_id); - exit(1); - } + pg_fatal("internal error: received unexpected database pattern_id %d", + pattern_id); log_no_match("no connectable databases to check matching \"%s\"", opts.include.data[pattern_id].pattern); } @@ -2096,7 +2067,7 @@ compile_relation_list_one_db(PGconn *conn, SimplePtrList *relations, if (PQresultStatus(res) != PGRES_TUPLES_OK) { pg_log_error("query failed: %s", PQerrorMessage(conn)); - pg_log_info("query was: %s", sql.data); + pg_log_error_detail("Query was: %s", sql.data); disconnectDatabase(conn); exit(1); } @@ -2136,11 +2107,8 @@ compile_relation_list_one_db(PGconn *conn, SimplePtrList *relations, */ if (pattern_id >= opts.include.len) - { - pg_log_error("internal error: received unexpected relation pattern_id %d", - pattern_id); - exit(1); - } + pg_fatal("internal error: received unexpected relation pattern_id %d", + pattern_id); opts.include.data[pattern_id].matched = true; } diff --git a/src/bin/pg_archivecleanup/pg_archivecleanup.c b/src/bin/pg_archivecleanup/pg_archivecleanup.c index 6c3e7f4e01..064cbb222f 100644 --- a/src/bin/pg_archivecleanup/pg_archivecleanup.c +++ b/src/bin/pg_archivecleanup/pg_archivecleanup.c @@ -148,33 +148,21 @@ CleanupPriorWALFiles(void) rc = unlink(WALFilePath); if (rc != 0) - { - pg_log_error("could not remove file \"%s\": %m", - WALFilePath); - exit(1); - } + pg_fatal("could not remove file \"%s\": %m", + WALFilePath); } } if (errno) - { - pg_log_error("could not read archive location \"%s\": %m", - archiveLocation); - exit(1); - } + pg_fatal("could not read archive location \"%s\": %m", + archiveLocation); if (closedir(xldir)) - { - pg_log_error("could not close archive location \"%s\": %m", - archiveLocation); - exit(1); - } - } - else - { - pg_log_error("could not open archive location \"%s\": %m", + pg_fatal("could not close archive location \"%s\": %m", archiveLocation); - exit(1); } + else + pg_fatal("could not open archive location \"%s\": %m", + archiveLocation); } /* @@ -247,7 +235,7 @@ SetWALFileNameForCleanup(void) if (!fnameOK) { pg_log_error("invalid file name argument"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(2); } } @@ -321,9 +309,9 @@ main(int argc, char **argv) * from xlogfile names */ break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(2); - break; } } @@ -342,7 +330,7 @@ main(int argc, char **argv) else { pg_log_error("must specify archive location"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(2); } @@ -354,14 +342,14 @@ main(int argc, char **argv) else { pg_log_error("must specify oldest kept WAL file"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(2); } if (optind < argc) { pg_log_error("too many command-line arguments"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(2); } diff --git a/src/bin/pg_basebackup/bbstreamer_file.c b/src/bin/pg_basebackup/bbstreamer_file.c index d721f87891..393e9f340c 100644 --- a/src/bin/pg_basebackup/bbstreamer_file.c +++ b/src/bin/pg_basebackup/bbstreamer_file.c @@ -90,10 +90,7 @@ bbstreamer_plain_writer_new(char *pathname, FILE *file) { streamer->file = fopen(pathname, "wb"); if (streamer->file == NULL) - { - pg_log_error("could not create file \"%s\": %m", pathname); - exit(1); - } + pg_fatal("could not create file \"%s\": %m", pathname); streamer->should_close_file = true; } @@ -121,9 +118,8 @@ bbstreamer_plain_writer_content(bbstreamer *streamer, /* if write didn't set errno, assume problem is no disk space */ if (errno == 0) errno = ENOSPC; - pg_log_error("could not write to file \"%s\": %m", - mystreamer->pathname); - exit(1); + pg_fatal("could not write to file \"%s\": %m", + mystreamer->pathname); } } @@ -139,11 +135,8 @@ bbstreamer_plain_writer_finalize(bbstreamer *streamer) mystreamer = (bbstreamer_plain_writer *) streamer; if (mystreamer->should_close_file && fclose(mystreamer->file) != 0) - { - pg_log_error("could not close file \"%s\": %m", - mystreamer->pathname); - exit(1); - } + pg_fatal("could not close file \"%s\": %m", + mystreamer->pathname); mystreamer->file = NULL; mystreamer->should_close_file = false; @@ -262,9 +255,8 @@ bbstreamer_extractor_content(bbstreamer *streamer, bbstreamer_member *member, /* if write didn't set errno, assume problem is no disk space */ if (errno == 0) errno = ENOSPC; - pg_log_error("could not write to file \"%s\": %m", - mystreamer->filename); - exit(1); + pg_fatal("could not write to file \"%s\": %m", + mystreamer->filename); } break; @@ -280,8 +272,7 @@ bbstreamer_extractor_content(bbstreamer *streamer, bbstreamer_member *member, default: /* Shouldn't happen. */ - pg_log_error("unexpected state while extracting archive"); - exit(1); + pg_fatal("unexpected state while extracting archive"); } } @@ -304,20 +295,14 @@ extract_directory(const char *filename, mode_t mode) pg_str_endswith(filename, "/pg_xlog") || pg_str_endswith(filename, "/archive_status")) && errno == EEXIST)) - { - pg_log_error("could not create directory \"%s\": %m", - filename); - exit(1); - } + pg_fatal("could not create directory \"%s\": %m", + filename); } #ifndef WIN32 if (chmod(filename, mode)) - { - pg_log_error("could not set permissions on directory \"%s\": %m", - filename); - exit(1); - } + pg_fatal("could not set permissions on directory \"%s\": %m", + filename); #endif } @@ -335,11 +320,8 @@ static void extract_link(const char *filename, const char *linktarget) { if (symlink(linktarget, filename) != 0) - { - pg_log_error("could not create symbolic link from \"%s\" to \"%s\": %m", - filename, linktarget); - exit(1); - } + pg_fatal("could not create symbolic link from \"%s\" to \"%s\": %m", + filename, linktarget); } /* @@ -354,18 +336,12 @@ create_file_for_extract(const char *filename, mode_t mode) file = fopen(filename, "wb"); if (file == NULL) - { - pg_log_error("could not create file \"%s\": %m", filename); - exit(1); - } + pg_fatal("could not create file \"%s\": %m", filename); #ifndef WIN32 if (chmod(filename, mode)) - { - pg_log_error("could not set permissions on file \"%s\": %m", - filename); - exit(1); - } + pg_fatal("could not set permissions on file \"%s\": %m", + filename); #endif return file; diff --git a/src/bin/pg_basebackup/bbstreamer_gzip.c b/src/bin/pg_basebackup/bbstreamer_gzip.c index 760619fcd7..d5b38ec4bc 100644 --- a/src/bin/pg_basebackup/bbstreamer_gzip.c +++ b/src/bin/pg_basebackup/bbstreamer_gzip.c @@ -92,43 +92,30 @@ bbstreamer_gzip_writer_new(char *pathname, FILE *file, { streamer->gzfile = gzopen(pathname, "wb"); if (streamer->gzfile == NULL) - { - pg_log_error("could not create compressed file \"%s\": %m", - pathname); - exit(1); - } + pg_fatal("could not create compressed file \"%s\": %m", + pathname); } else { int fd = dup(fileno(file)); if (fd < 0) - { - pg_log_error("could not duplicate stdout: %m"); - exit(1); - } + pg_fatal("could not duplicate stdout: %m"); streamer->gzfile = gzdopen(fd, "wb"); if (streamer->gzfile == NULL) - { - pg_log_error("could not open output file: %m"); - exit(1); - } + pg_fatal("could not open output file: %m"); } if ((compress->options & BACKUP_COMPRESSION_OPTION_LEVEL) != 0 && gzsetparams(streamer->gzfile, compress->level, Z_DEFAULT_STRATEGY) != Z_OK) - { - pg_log_error("could not set compression level %d: %s", - compress->level, get_gz_error(streamer->gzfile)); - exit(1); - } + pg_fatal("could not set compression level %d: %s", + compress->level, get_gz_error(streamer->gzfile)); return &streamer->base; #else - pg_log_error("this build does not support compression"); - exit(1); + pg_fatal("this build does not support gzip compression"); #endif } @@ -154,9 +141,8 @@ bbstreamer_gzip_writer_content(bbstreamer *streamer, /* if write didn't set errno, assume problem is no disk space */ if (errno == 0) errno = ENOSPC; - pg_log_error("could not write to compressed file \"%s\": %s", - mystreamer->pathname, get_gz_error(mystreamer->gzfile)); - exit(1); + pg_fatal("could not write to compressed file \"%s\": %s", + mystreamer->pathname, get_gz_error(mystreamer->gzfile)); } } @@ -179,11 +165,8 @@ bbstreamer_gzip_writer_finalize(bbstreamer *streamer) errno = 0; /* in case gzclose() doesn't set it */ if (gzclose(mystreamer->gzfile) != 0) - { - pg_log_error("could not close compressed file \"%s\": %m", - mystreamer->pathname); - exit(1); - } + pg_fatal("could not close compressed file \"%s\": %m", + mystreamer->pathname); mystreamer->gzfile = NULL; } @@ -260,15 +243,11 @@ bbstreamer_gzip_decompressor_new(bbstreamer *next) * possible value for safety. */ if (inflateInit2(zs, 15 + 16) != Z_OK) - { - pg_log_error("could not initialize compression library"); - exit(1); - } + pg_fatal("could not initialize compression library"); return &streamer->base; #else - pg_log_error("this build does not support compression"); - exit(1); + pg_fatal("this build does not support gzip compression"); #endif } diff --git a/src/bin/pg_basebackup/bbstreamer_inject.c b/src/bin/pg_basebackup/bbstreamer_inject.c index 79c378d96e..cc804f1091 100644 --- a/src/bin/pg_basebackup/bbstreamer_inject.c +++ b/src/bin/pg_basebackup/bbstreamer_inject.c @@ -186,8 +186,7 @@ bbstreamer_recovery_injector_content(bbstreamer *streamer, default: /* Shouldn't happen. */ - pg_log_error("unexpected state while injecting recovery settings"); - exit(1); + pg_fatal("unexpected state while injecting recovery settings"); } bbstreamer_content(mystreamer->base.bbs_next, &mystreamer->member, diff --git a/src/bin/pg_basebackup/bbstreamer_lz4.c b/src/bin/pg_basebackup/bbstreamer_lz4.c index 2ffe2241b4..93f8344ea3 100644 --- a/src/bin/pg_basebackup/bbstreamer_lz4.c +++ b/src/bin/pg_basebackup/bbstreamer_lz4.c @@ -93,13 +93,12 @@ bbstreamer_lz4_compressor_new(bbstreamer *next, bc_specification *compress) ctxError = LZ4F_createCompressionContext(&streamer->cctx, LZ4F_VERSION); if (LZ4F_isError(ctxError)) - pg_log_error("could not create lz4 compression context: %s", - LZ4F_getErrorName(ctxError)); + pg_log_error("could not create lz4 compression context: %s", + LZ4F_getErrorName(ctxError)); return &streamer->base; #else - pg_log_error("this build does not support compression"); - exit(1); + pg_fatal("this build does not support lz4 compression"); #endif } @@ -291,16 +290,12 @@ bbstreamer_lz4_decompressor_new(bbstreamer *next) /* Initialize internal stream state for decompression */ ctxError = LZ4F_createDecompressionContext(&streamer->dctx, LZ4F_VERSION); if (LZ4F_isError(ctxError)) - { - pg_log_error("could not initialize compression library: %s", - LZ4F_getErrorName(ctxError)); - exit(1); - } + pg_fatal("could not initialize compression library: %s", + LZ4F_getErrorName(ctxError)); return &streamer->base; #else - pg_log_error("this build does not support compression"); - exit(1); + pg_fatal("this build does not support lz4 compression"); #endif } diff --git a/src/bin/pg_basebackup/bbstreamer_tar.c b/src/bin/pg_basebackup/bbstreamer_tar.c index 6ab981156e..fcbad579df 100644 --- a/src/bin/pg_basebackup/bbstreamer_tar.c +++ b/src/bin/pg_basebackup/bbstreamer_tar.c @@ -241,16 +241,12 @@ bbstreamer_tar_parser_content(bbstreamer *streamer, bbstreamer_member *member, */ bbstreamer_buffer_bytes(streamer, &data, &len, len); if (len > 2 * TAR_BLOCK_SIZE) - { - pg_log_error("tar file trailer exceeds 2 blocks"); - exit(1); - } + pg_fatal("tar file trailer exceeds 2 blocks"); return; default: /* Shouldn't happen. */ - pg_log_error("unexpected state while parsing tar archive"); - exit(1); + pg_fatal("unexpected state while parsing tar archive"); } } } @@ -297,10 +293,7 @@ bbstreamer_tar_header(bbstreamer_tar_parser *mystreamer) */ strlcpy(member->pathname, &buffer[0], MAXPGPATH); if (member->pathname[0] == '\0') - { - pg_log_error("tar member has empty name"); - exit(1); - } + pg_fatal("tar member has empty name"); member->size = read_tar_number(&buffer[124], 12); member->mode = read_tar_number(&buffer[100], 8); member->uid = read_tar_number(&buffer[108], 8); @@ -332,10 +325,7 @@ bbstreamer_tar_parser_finalize(bbstreamer *streamer) if (mystreamer->next_context != BBSTREAMER_ARCHIVE_TRAILER && (mystreamer->next_context != BBSTREAMER_MEMBER_HEADER || mystreamer->base.bbs_buffer.len > 0)) - { - pg_log_error("COPY stream ended before last file was finished"); - exit(1); - } + pg_fatal("COPY stream ended before last file was finished"); /* Send the archive trailer, even if empty. */ bbstreamer_content(streamer->bbs_next, NULL, diff --git a/src/bin/pg_basebackup/bbstreamer_zstd.c b/src/bin/pg_basebackup/bbstreamer_zstd.c index f94c5c041d..e2c76503cc 100644 --- a/src/bin/pg_basebackup/bbstreamer_zstd.c +++ b/src/bin/pg_basebackup/bbstreamer_zstd.c @@ -82,10 +82,7 @@ bbstreamer_zstd_compressor_new(bbstreamer *next, bc_specification *compress) streamer->cctx = ZSTD_createCCtx(); if (!streamer->cctx) - { - pg_log_error("could not create zstd compression context"); - exit(1); - } + pg_fatal("could not create zstd compression context"); /* Set compression level, if specified */ if ((compress->options & BACKUP_COMPRESSION_OPTION_LEVEL) != 0) @@ -93,11 +90,8 @@ bbstreamer_zstd_compressor_new(bbstreamer *next, bc_specification *compress) ret = ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_compressionLevel, compress->level); if (ZSTD_isError(ret)) - { - pg_log_error("could not set zstd compression level to %d: %s", - compress->level, ZSTD_getErrorName(ret)); - exit(1); - } + pg_fatal("could not set zstd compression level to %d: %s", + compress->level, ZSTD_getErrorName(ret)); } /* Set # of workers, if specified */ @@ -111,11 +105,8 @@ bbstreamer_zstd_compressor_new(bbstreamer *next, bc_specification *compress) ret = ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_nbWorkers, compress->workers); if (ZSTD_isError(ret)) - { - pg_log_error("could not set compression worker count to %d: %s", - compress->workers, ZSTD_getErrorName(ret)); - exit(1); - } + pg_fatal("could not set compression worker count to %d: %s", + compress->workers, ZSTD_getErrorName(ret)); } /* Initialize the ZSTD output buffer. */ @@ -125,8 +116,7 @@ bbstreamer_zstd_compressor_new(bbstreamer *next, bc_specification *compress) return &streamer->base; #else - pg_log_error("this build does not support zstd compression"); - exit(1); + pg_fatal("this build does not support zstd compression"); #endif } @@ -271,10 +261,7 @@ bbstreamer_zstd_decompressor_new(bbstreamer *next) streamer->dctx = ZSTD_createDCtx(); if (!streamer->dctx) - { - pg_log_error("could not create zstd decompression context"); - exit(1); - } + pg_fatal("could not create zstd decompression context"); /* Initialize the ZSTD output buffer. */ streamer->zstd_outBuf.dst = streamer->base.bbs_buffer.data; @@ -283,8 +270,7 @@ bbstreamer_zstd_decompressor_new(bbstreamer *next) return &streamer->base; #else - pg_log_error("this build does not support compression"); - exit(1); + pg_fatal("this build does not support zstd compression"); #endif } @@ -328,7 +314,8 @@ bbstreamer_zstd_decompressor_content(bbstreamer *streamer, &mystreamer->zstd_outBuf, &inBuf); if (ZSTD_isError(ret)) - pg_log_error("could not decompress data: %s", ZSTD_getErrorName(ret)); + pg_log_error("could not decompress data: %s", + ZSTD_getErrorName(ret)); } } diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index ed8d084d62..65dcfff0a0 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -322,20 +322,14 @@ tablespace_list_append(const char *arg) for (arg_ptr = arg; *arg_ptr; arg_ptr++) { if (dst_ptr - dst >= MAXPGPATH) - { - pg_log_error("directory name too long"); - exit(1); - } + pg_fatal("directory name too long"); if (*arg_ptr == '\\' && *(arg_ptr + 1) == '=') ; /* skip backslash escaping = */ else if (*arg_ptr == '=' && (arg_ptr == arg || *(arg_ptr - 1) != '\\')) { if (*cell->new_dir) - { - pg_log_error("multiple \"=\" signs in tablespace mapping"); - exit(1); - } + pg_fatal("multiple \"=\" signs in tablespace mapping"); else dst = dst_ptr = cell->new_dir; } @@ -344,10 +338,7 @@ tablespace_list_append(const char *arg) } if (!*cell->old_dir || !*cell->new_dir) - { - pg_log_error("invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"", arg); - exit(1); - } + pg_fatal("invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"", arg); /* * This check isn't absolutely necessary. But all tablespaces are created @@ -356,18 +347,12 @@ tablespace_list_append(const char *arg) * consistent with the new_dir check. */ if (!is_absolute_path(cell->old_dir)) - { - pg_log_error("old directory is not an absolute path in tablespace mapping: %s", - cell->old_dir); - exit(1); - } + pg_fatal("old directory is not an absolute path in tablespace mapping: %s", + cell->old_dir); if (!is_absolute_path(cell->new_dir)) - { - pg_log_error("new directory is not an absolute path in tablespace mapping: %s", - cell->new_dir); - exit(1); - } + pg_fatal("new directory is not an absolute path in tablespace mapping: %s", + cell->new_dir); /* * Comparisons done with these values should involve similarly @@ -483,17 +468,11 @@ reached_end_position(XLogRecPtr segendpos, uint32 timeline, MemSet(xlogend, 0, sizeof(xlogend)); r = read(bgpipe[0], xlogend, sizeof(xlogend) - 1); if (r < 0) - { - pg_log_error("could not read from ready pipe: %m"); - exit(1); - } + pg_fatal("could not read from ready pipe: %m"); if (sscanf(xlogend, "%X/%X", &hi, &lo) != 2) - { - pg_log_error("could not parse write-ahead log location \"%s\"", - xlogend); - exit(1); - } + pg_fatal("could not parse write-ahead log location \"%s\"", + xlogend); xlogendptr = ((uint64) hi) << 32 | lo; has_xlogendptr = 1; @@ -639,11 +618,8 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier, /* Convert the starting position */ if (sscanf(startpos, "%X/%X", &hi, &lo) != 2) - { - pg_log_error("could not parse write-ahead log location \"%s\"", - startpos); - exit(1); - } + pg_fatal("could not parse write-ahead log location \"%s\"", + startpos); param->startptr = ((uint64) hi) << 32 | lo; /* Round off to even segment position */ param->startptr -= XLogSegmentOffset(param->startptr, WalSegSz); @@ -651,10 +627,7 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier, #ifndef WIN32 /* Create our background pipe */ if (pipe(bgpipe) < 0) - { - pg_log_error("could not create pipe for background process: %m"); - exit(1); - } + pg_fatal("could not create pipe for background process: %m"); #endif /* Get a second connection */ @@ -709,10 +682,7 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier, "pg_xlog" : "pg_wal"); if (pg_mkdir_p(statusdir, pg_dir_create_mode) != 0 && errno != EEXIST) - { - pg_log_error("could not create directory \"%s\": %m", statusdir); - exit(1); - } + pg_fatal("could not create directory \"%s\": %m", statusdir); } /* @@ -735,10 +705,7 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier, exit(ret); } else if (bgchild < 0) - { - pg_log_error("could not create background process: %m"); - exit(1); - } + pg_fatal("could not create background process: %m"); /* * Else we are in the parent process and all is well. @@ -747,10 +714,7 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier, #else /* WIN32 */ bgchild = _beginthreadex(NULL, 0, (void *) LogStreamerMain, param, 0, NULL); if (bgchild == 0) - { - pg_log_error("could not create background thread: %m"); - exit(1); - } + pg_fatal("could not create background thread: %m"); #endif } @@ -770,10 +734,7 @@ verify_dir_is_empty_or_create(char *dirname, bool *created, bool *found) * Does not exist, so create */ if (pg_mkdir_p(dirname, pg_dir_create_mode) == -1) - { - pg_log_error("could not create directory \"%s\": %m", dirname); - exit(1); - } + pg_fatal("could not create directory \"%s\": %m", dirname); if (created) *created = true; return; @@ -792,15 +753,13 @@ verify_dir_is_empty_or_create(char *dirname, bool *created, bool *found) /* * Exists, not empty */ - pg_log_error("directory \"%s\" exists but is not empty", dirname); - exit(1); + pg_fatal("directory \"%s\" exists but is not empty", dirname); case -1: /* * Access problem */ - pg_log_error("could not access directory \"%s\": %m", dirname); - exit(1); + pg_fatal("could not access directory \"%s\": %m", dirname); } } @@ -929,23 +888,16 @@ parse_max_rate(char *src) errno = 0; result = strtod(src, &after_num); if (src == after_num) - { - pg_log_error("transfer rate \"%s\" is not a valid value", src); - exit(1); - } + pg_fatal("transfer rate \"%s\" is not a valid value", src); if (errno != 0) - { - pg_log_error("invalid transfer rate \"%s\": %m", src); - exit(1); - } + pg_fatal("invalid transfer rate \"%s\": %m", src); if (result <= 0) { /* * Reject obviously wrong values here. */ - pg_log_error("transfer rate must be greater than zero"); - exit(1); + pg_fatal("transfer rate must be greater than zero"); } /* @@ -975,27 +927,18 @@ parse_max_rate(char *src) after_num++; if (*after_num != '\0') - { - pg_log_error("invalid --max-rate unit: \"%s\"", suffix); - exit(1); - } + pg_fatal("invalid --max-rate unit: \"%s\"", suffix); /* Valid integer? */ if ((uint64) result != (uint64) ((uint32) result)) - { - pg_log_error("transfer rate \"%s\" exceeds integer range", src); - exit(1); - } + pg_fatal("transfer rate \"%s\" exceeds integer range", src); /* * The range is checked on the server side too, but avoid the server * connection if a nonsensical value was passed. */ if (result < MAX_RATE_LOWER || result > MAX_RATE_UPPER) - { - pg_log_error("transfer rate \"%s\" is out of range", src); - exit(1); - } + pg_fatal("transfer rate \"%s\" is out of range", src); return (int32) result; } @@ -1091,11 +1034,8 @@ ReceiveCopyData(PGconn *conn, WriteDataCallback callback, /* Get the COPY data stream. */ res = PQgetResult(conn); if (PQresultStatus(res) != PGRES_COPY_OUT) - { - pg_log_error("could not get COPY data stream: %s", - PQerrorMessage(conn)); - exit(1); - } + pg_fatal("could not get COPY data stream: %s", + PQerrorMessage(conn)); PQclear(res); /* Loop over chunks until done. */ @@ -1111,17 +1051,11 @@ ReceiveCopyData(PGconn *conn, WriteDataCallback callback, break; } else if (r == -2) - { - pg_log_error("could not read COPY data: %s", - PQerrorMessage(conn)); - exit(1); - } + pg_fatal("could not read COPY data: %s", + PQerrorMessage(conn)); if (bgchild_exited) - { - pg_log_error("background process terminated unexpectedly"); - exit(1); - } + pg_fatal("background process terminated unexpectedly"); (*callback) (r, copybuf, callback_data); @@ -1209,13 +1143,13 @@ CreateBackupStreamer(char *archive_name, char *spclocation, if (must_parse_archive && !is_tar && !is_compressed_tar) { pg_log_error("unable to parse archive: %s", archive_name); - pg_log_info("only tar archives can be parsed"); + pg_log_error_detail("Only tar archives can be parsed."); if (format == 'p') - pg_log_info("plain format requires pg_basebackup to parse the archive"); + pg_log_error_detail("Plain format requires pg_basebackup to parse the archive."); if (inject_manifest) - pg_log_info("using - as the output directory requires pg_basebackup to parse the archive"); + pg_log_error_detail("Using - as the output directory requires pg_basebackup to parse the archive."); if (writerecoveryconf) - pg_log_info("the -R option requires pg_basebackup to parse the archive"); + pg_log_error_detail("The -R option requires pg_basebackup to parse the archive."); exit(1); } @@ -1427,10 +1361,7 @@ ReceiveArchiveStreamChunk(size_t r, char *copybuf, void *callback_data) /* Sanity check. */ if (state->manifest_buffer != NULL || state->manifest_file !=NULL) - { - pg_log_error("archives should precede manifest"); - exit(1); - } + pg_fatal("archives should precede manifest"); /* Parse the rest of the CopyData message. */ archive_name = GetCopyDataString(r, copybuf, &cursor); @@ -1445,11 +1376,8 @@ ReceiveArchiveStreamChunk(size_t r, char *copybuf, void *callback_data) if (archive_name[0] == '\0' || archive_name[0] == '.' || strchr(archive_name, '/') != NULL || strchr(archive_name, '\\') != NULL) - { - pg_log_error("invalid archive name: \"%s\"", - archive_name); - exit(1); - } + pg_fatal("invalid archive name: \"%s\"", + archive_name); /* * An empty spclocation is treated as NULL. We expect this @@ -1509,9 +1437,8 @@ ReceiveArchiveStreamChunk(size_t r, char *copybuf, void *callback_data) */ if (errno == 0) errno = ENOSPC; - pg_log_error("could not write to file \"%s\": %m", - state->manifest_filename); - exit(1); + pg_fatal("could not write to file \"%s\": %m", + state->manifest_filename); } } else if (state->streamer != NULL) @@ -1521,10 +1448,7 @@ ReceiveArchiveStreamChunk(size_t r, char *copybuf, void *callback_data) r - 1, BBSTREAMER_UNKNOWN); } else - { - pg_log_error("unexpected payload data"); - exit(1); - } + pg_fatal("unexpected payload data"); break; } @@ -1577,11 +1501,8 @@ ReceiveArchiveStreamChunk(size_t r, char *copybuf, void *callback_data) state->manifest_file = fopen(state->manifest_filename, "wb"); if (state->manifest_file == NULL) - { - pg_log_error("could not create file \"%s\": %m", - state->manifest_filename); - exit(1); - } + pg_fatal("could not create file \"%s\": %m", + state->manifest_filename); } } break; @@ -1670,11 +1591,10 @@ static void ReportCopyDataParseError(size_t r, char *copybuf) { if (r == 0) - pg_log_error("empty COPY message"); + pg_fatal("empty COPY message"); else - pg_log_error("malformed COPY message of type %d, length %zu", - copybuf[0], r); - exit(1); + pg_fatal("malformed COPY message of type %d, length %zu", + copybuf[0], r); } /* @@ -1720,10 +1640,7 @@ ReceiveTarFile(PGconn *conn, char *archive_name, char *spclocation, initPQExpBuffer(&buf); ReceiveBackupManifestInMemory(conn, &buf); if (PQExpBufferDataBroken(buf)) - { - pg_log_error("out of memory"); - exit(1); - } + pg_fatal("out of memory"); /* Inject it into the output tarfile. */ bbstreamer_inject_file(manifest_inject_streamer, "backup_manifest", @@ -1793,10 +1710,7 @@ ReceiveBackupManifest(PGconn *conn) "%s/backup_manifest.tmp", basedir); state.file = fopen(state.filename, "wb"); if (state.file == NULL) - { - pg_log_error("could not create file \"%s\": %m", state.filename); - exit(1); - } + pg_fatal("could not create file \"%s\": %m", state.filename); ReceiveCopyData(conn, ReceiveBackupManifestChunk, &state); @@ -1817,8 +1731,7 @@ ReceiveBackupManifestChunk(size_t r, char *copybuf, void *callback_data) /* if write didn't set errno, assume problem is no disk space */ if (errno == 0) errno = ENOSPC; - pg_log_error("could not write to file \"%s\": %m", state->filename); - exit(1); + pg_fatal("could not write to file \"%s\": %m", state->filename); } } @@ -1878,9 +1791,8 @@ BaseBackup(char *compression_algorithm, char *compression_detail, { const char *serverver = PQparameterStatus(conn, "server_version"); - pg_log_error("incompatible server version %s", - serverver ? serverver : "'unknown'"); - exit(1); + pg_fatal("incompatible server version %s", + serverver ? serverver : "'unknown'"); } if (serverMajor >= 1500) use_new_option_syntax = true; @@ -1963,16 +1875,10 @@ BaseBackup(char *compression_algorithm, char *compression_detail, char *colon; if (serverMajor < 1500) - { - pg_log_error("backup targets are not supported by this server version"); - exit(1); - } + pg_fatal("backup targets are not supported by this server version"); if (writerecoveryconf) - { - pg_log_error("recovery configuration cannot be written when a backup target is used"); - exit(1); - } + pg_fatal("recovery configuration cannot be written when a backup target is used"); AppendPlainCommandOption(&buf, use_new_option_syntax, "TABLESPACE_MAP"); @@ -1999,10 +1905,7 @@ BaseBackup(char *compression_algorithm, char *compression_detail, if (compressloc == COMPRESS_LOCATION_SERVER) { if (!use_new_option_syntax) - { - pg_log_error("server does not support server-side compression"); - exit(1); - } + pg_fatal("server does not support server-side compression"); AppendStringCommandOption(&buf, use_new_option_syntax, "COMPRESSION", compression_algorithm); if (compression_detail != NULL) @@ -2029,28 +1932,19 @@ BaseBackup(char *compression_algorithm, char *compression_detail, basebkp = psprintf("BASE_BACKUP %s", buf.data); if (PQsendQuery(conn, basebkp) == 0) - { - pg_log_error("could not send replication command \"%s\": %s", - "BASE_BACKUP", PQerrorMessage(conn)); - exit(1); - } + pg_fatal("could not send replication command \"%s\": %s", + "BASE_BACKUP", PQerrorMessage(conn)); /* * Get the starting WAL location */ res = PQgetResult(conn); if (PQresultStatus(res) != PGRES_TUPLES_OK) - { - pg_log_error("could not initiate base backup: %s", - PQerrorMessage(conn)); - exit(1); - } + pg_fatal("could not initiate base backup: %s", + PQerrorMessage(conn)); if (PQntuples(res) != 1) - { - pg_log_error("server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields", - PQntuples(res), PQnfields(res), 1, 2); - exit(1); - } + pg_fatal("server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields", + PQntuples(res), PQnfields(res), 1, 2); strlcpy(xlogstart, PQgetvalue(res, 0, 0), sizeof(xlogstart)); @@ -2078,16 +1972,10 @@ BaseBackup(char *compression_algorithm, char *compression_detail, */ res = PQgetResult(conn); if (PQresultStatus(res) != PGRES_TUPLES_OK) - { - pg_log_error("could not get backup header: %s", - PQerrorMessage(conn)); - exit(1); - } + pg_fatal("could not get backup header: %s", + PQerrorMessage(conn)); if (PQntuples(res) < 1) - { - pg_log_error("no data returned from server"); - exit(1); - } + pg_fatal("no data returned from server"); /* * Sum up the total size, for progress reporting @@ -2122,11 +2010,8 @@ BaseBackup(char *compression_algorithm, char *compression_detail, writing_to_stdout = format == 't' && basedir != NULL && strcmp(basedir, "-") == 0; if (writing_to_stdout && PQntuples(res) > 1) - { - pg_log_error("can only write single tablespace to stdout, database has %d", - PQntuples(res)); - exit(1); - } + pg_fatal("can only write single tablespace to stdout, database has %d", + PQntuples(res)); /* * If we're streaming WAL, start the streaming session before we start @@ -2221,16 +2106,10 @@ BaseBackup(char *compression_algorithm, char *compression_detail, */ res = PQgetResult(conn); if (PQresultStatus(res) != PGRES_TUPLES_OK) - { - pg_log_error("backup failed: %s", - PQerrorMessage(conn)); - exit(1); - } + pg_fatal("backup failed: %s", + PQerrorMessage(conn)); if (PQntuples(res) != 1) - { - pg_log_error("no write-ahead log end position returned from server"); - exit(1); - } + pg_fatal("no write-ahead log end position returned from server"); strlcpy(xlogend, PQgetvalue(res, 0, 0), sizeof(xlogend)); if (verbose && includewal != NO_WAL) pg_log_info("write-ahead log end point: %s", xlogend); @@ -2277,28 +2156,16 @@ BaseBackup(char *compression_algorithm, char *compression_detail, #ifndef WIN32 if (write(bgpipe[1], xlogend, strlen(xlogend)) != strlen(xlogend)) - { - pg_log_info("could not send command to background pipe: %m"); - exit(1); - } + pg_fatal("could not send command to background pipe: %m"); /* Just wait for the background process to exit */ r = waitpid(bgchild, &status, 0); if (r == (pid_t) -1) - { - pg_log_error("could not wait for child process: %m"); - exit(1); - } + pg_fatal("could not wait for child process: %m"); if (r != bgchild) - { - pg_log_error("child %d died, expected %d", (int) r, (int) bgchild); - exit(1); - } + pg_fatal("child %d died, expected %d", (int) r, (int) bgchild); if (status != 0) - { - pg_log_error("%s", wait_result_to_str(status)); - exit(1); - } + pg_fatal("%s", wait_result_to_str(status)); /* Exited normally, we're happy! */ #else /* WIN32 */ @@ -2308,11 +2175,8 @@ BaseBackup(char *compression_algorithm, char *compression_detail, * it's there. */ if (sscanf(xlogend, "%X/%X", &hi, &lo) != 2) - { - pg_log_error("could not parse write-ahead log location \"%s\"", - xlogend); - exit(1); - } + pg_fatal("could not parse write-ahead log location \"%s\"", + xlogend); xlogendptr = ((uint64) hi) << 32 | lo; InterlockedIncrement(&has_xlogendptr); @@ -2321,21 +2185,16 @@ BaseBackup(char *compression_algorithm, char *compression_detail, WAIT_OBJECT_0) { _dosmaperr(GetLastError()); - pg_log_error("could not wait for child thread: %m"); - exit(1); + pg_fatal("could not wait for child thread: %m"); } if (GetExitCodeThread((HANDLE) bgchild_handle, &status) == 0) { _dosmaperr(GetLastError()); - pg_log_error("could not get child thread exit status: %m"); - exit(1); + pg_fatal("could not get child thread exit status: %m"); } if (status != 0) - { - pg_log_error("child thread exited with error %u", - (unsigned int) status); - exit(1); - } + pg_fatal("child thread exited with error %u", + (unsigned int) status); /* Exited normally, we're happy */ #endif } @@ -2402,11 +2261,8 @@ BaseBackup(char *compression_algorithm, char *compression_detail, else { if (rename(tmp_filename, filename) != 0) - { - pg_log_error("could not rename file \"%s\" to \"%s\": %m", - tmp_filename, filename); - exit(1); - } + pg_fatal("could not rename file \"%s\" to \"%s\": %m", + tmp_filename, filename); } } @@ -2500,11 +2356,8 @@ main(int argc, char **argv) else if (strcmp(optarg, "t") == 0 || strcmp(optarg, "tar") == 0) format = 't'; else - { - pg_log_error("invalid output format \"%s\", must be \"plain\" or \"tar\"", - optarg); - exit(1); - } + pg_fatal("invalid output format \"%s\", must be \"plain\" or \"tar\"", + optarg); break; case 'r': maxrate = parse_max_rate(optarg); @@ -2547,11 +2400,8 @@ main(int argc, char **argv) includewal = STREAM_WAL; } else - { - pg_log_error("invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"", - optarg); - exit(1); - } + pg_fatal("invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"", + optarg); break; case 1: xlog_dir = pg_strdup(optarg); @@ -2580,11 +2430,8 @@ main(int argc, char **argv) else if (pg_strcasecmp(optarg, "spread") == 0) fastcheckpoint = false; else - { - pg_log_error("invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"", - optarg); - exit(1); - } + pg_fatal("invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"", + optarg); break; case 'd': connection_string = pg_strdup(optarg); @@ -2633,12 +2480,8 @@ main(int argc, char **argv) manifest_checksums = pg_strdup(optarg); break; default: - - /* - * getopt_long already emitted a complaint - */ - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -2650,8 +2493,7 @@ main(int argc, char **argv) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -2673,8 +2515,7 @@ main(int argc, char **argv) if (backup_target != NULL && format != '\0') { pg_log_error("cannot specify both format and backup target"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (format == '\0') @@ -2686,15 +2527,13 @@ main(int argc, char **argv) if (basedir == NULL && backup_target == NULL) { pg_log_error("must specify output directory or backup target"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (basedir != NULL && backup_target != NULL) { pg_log_error("cannot specify both output directory and backup target"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -2723,20 +2562,14 @@ main(int argc, char **argv) char *error_detail; if (!parse_bc_algorithm(compression_algorithm, &alg)) - { - pg_log_error("unrecognized compression algorithm \"%s\"", - compression_algorithm); - exit(1); - } + pg_fatal("unrecognized compression algorithm \"%s\"", + compression_algorithm); parse_bc_specification(alg, compression_detail, &client_compress); error_detail = validate_bc_specification(&client_compress); if (error_detail != NULL) - { - pg_log_error("invalid compression specification: %s", - error_detail); - exit(1); - } + pg_fatal("invalid compression specification: %s", + error_detail); } else { @@ -2752,8 +2585,7 @@ main(int argc, char **argv) if (backup_target != NULL && compressloc == COMPRESS_LOCATION_CLIENT) { pg_log_error("client-side compression is not possible when a backup target is specified"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -2764,8 +2596,7 @@ main(int argc, char **argv) client_compress.algorithm != BACKUP_COMPRESSION_NONE) { pg_log_error("only tar mode backups can be compressed"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -2775,23 +2606,20 @@ main(int argc, char **argv) if (backup_target != NULL && includewal == STREAM_WAL) { pg_log_error("WAL cannot be streamed when a backup target is specified"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (format == 't' && includewal == STREAM_WAL && strcmp(basedir, "-") == 0) { pg_log_error("cannot stream write-ahead logs in tar mode to stdout"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (replication_slot && includewal != STREAM_WAL) { pg_log_error("replication slots can only be used with WAL streaming"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -2803,8 +2631,7 @@ main(int argc, char **argv) if (replication_slot) { pg_log_error("--no-slot cannot be used with slot name"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } temp_replication_slot = false; @@ -2816,8 +2643,7 @@ main(int argc, char **argv) { pg_log_error("%s needs a slot to be specified using --slot", "--create-slot"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -2825,8 +2651,7 @@ main(int argc, char **argv) { pg_log_error("%s and %s are incompatible options", "--create-slot", "--no-slot"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -2839,15 +2664,13 @@ main(int argc, char **argv) if (backup_target != NULL) { pg_log_error("WAL directory location cannot be specified along with a backup target"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (format != 'p') { pg_log_error("WAL directory location can only be specified in plain mode"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -2856,8 +2679,7 @@ main(int argc, char **argv) if (!is_absolute_path(xlog_dir)) { pg_log_error("WAL directory location must be an absolute path"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -2869,8 +2691,7 @@ main(int argc, char **argv) { pg_log_error("%s and %s are incompatible options", "--progress", "--no-estimate-size"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -2881,8 +2702,7 @@ main(int argc, char **argv) { pg_log_error("%s and %s are incompatible options", "--no-manifest", "--manifest-checksums"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -2890,8 +2710,7 @@ main(int argc, char **argv) { pg_log_error("%s and %s are incompatible options", "--no-manifest", "--manifest-force-encode"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -2959,13 +2778,9 @@ main(int argc, char **argv) #ifdef HAVE_SYMLINK if (symlink(xlog_dir, linkloc) != 0) - { - pg_log_error("could not create symbolic link \"%s\": %m", linkloc); - exit(1); - } + pg_fatal("could not create symbolic link \"%s\": %m", linkloc); #else - pg_log_error("symlinks are not supported on this platform"); - exit(1); + pg_fatal("symlinks are not supported on this platform"); #endif free(linkloc); } diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c index 8d2c1e6ce0..23e04741fd 100644 --- a/src/bin/pg_basebackup/pg_receivewal.c +++ b/src/bin/pg_basebackup/pg_receivewal.c @@ -239,10 +239,7 @@ get_destination_dir(char *dest_folder) Assert(dest_folder != NULL); dir = opendir(dest_folder); if (dir == NULL) - { - pg_log_error("could not open directory \"%s\": %m", dest_folder); - exit(1); - } + pg_fatal("could not open directory \"%s\": %m", dest_folder); return dir; } @@ -256,10 +253,7 @@ close_destination_dir(DIR *dest_dir, char *dest_folder) { Assert(dest_dir != NULL && dest_folder != NULL); if (closedir(dest_dir)) - { - pg_log_error("could not close directory \"%s\": %m", dest_folder); - exit(1); - } + pg_fatal("could not close directory \"%s\": %m", dest_folder); } @@ -322,10 +316,7 @@ FindStreamingStart(uint32 *tli) snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name); if (stat(fullpath, &statbuf) != 0) - { - pg_log_error("could not stat file \"%s\": %m", fullpath); - exit(1); - } + pg_fatal("could not stat file \"%s\": %m", fullpath); if (statbuf.st_size != WalSegSz) { @@ -346,27 +337,20 @@ FindStreamingStart(uint32 *tli) fd = open(fullpath, O_RDONLY | PG_BINARY, 0); if (fd < 0) - { - pg_log_error("could not open compressed file \"%s\": %m", - fullpath); - exit(1); - } + pg_fatal("could not open compressed file \"%s\": %m", + fullpath); if (lseek(fd, (off_t) (-4), SEEK_END) < 0) - { - pg_log_error("could not seek in compressed file \"%s\": %m", - fullpath); - exit(1); - } + pg_fatal("could not seek in compressed file \"%s\": %m", + fullpath); r = read(fd, (char *) buf, sizeof(buf)); if (r != sizeof(buf)) { if (r < 0) - pg_log_error("could not read compressed file \"%s\": %m", - fullpath); + pg_fatal("could not read compressed file \"%s\": %m", + fullpath); else - pg_log_error("could not read compressed file \"%s\": read %d of %zu", - fullpath, r, sizeof(buf)); - exit(1); + pg_fatal("could not read compressed file \"%s\": read %d of %zu", + fullpath, r, sizeof(buf)); } close(fd); @@ -399,18 +383,12 @@ FindStreamingStart(uint32 *tli) fd = open(fullpath, O_RDONLY | PG_BINARY, 0); if (fd < 0) - { - pg_log_error("could not open file \"%s\": %m", fullpath); - exit(1); - } + pg_fatal("could not open file \"%s\": %m", fullpath); status = LZ4F_createDecompressionContext(&ctx, LZ4F_VERSION); if (LZ4F_isError(status)) - { - pg_log_error("could not create LZ4 decompression context: %s", - LZ4F_getErrorName(status)); - exit(1); - } + pg_fatal("could not create LZ4 decompression context: %s", + LZ4F_getErrorName(status)); outbuf = pg_malloc0(LZ4_CHUNK_SZ); readbuf = pg_malloc0(LZ4_CHUNK_SZ); @@ -421,10 +399,7 @@ FindStreamingStart(uint32 *tli) r = read(fd, readbuf, LZ4_CHUNK_SZ); if (r < 0) - { - pg_log_error("could not read file \"%s\": %m", fullpath); - exit(1); - } + pg_fatal("could not read file \"%s\": %m", fullpath); /* Done reading the file */ if (r == 0) @@ -442,12 +417,9 @@ FindStreamingStart(uint32 *tli) status = LZ4F_decompress(ctx, outbuf, &out_size, readp, &read_size, &dec_opt); if (LZ4F_isError(status)) - { - pg_log_error("could not decompress file \"%s\": %s", - fullpath, - LZ4F_getErrorName(status)); - exit(1); - } + pg_fatal("could not decompress file \"%s\": %s", + fullpath, + LZ4F_getErrorName(status)); readp += read_size; uncompressed_size += out_size; @@ -468,11 +440,8 @@ FindStreamingStart(uint32 *tli) status = LZ4F_freeDecompressionContext(ctx); if (LZ4F_isError(status)) - { - pg_log_error("could not free LZ4 decompression context: %s", - LZ4F_getErrorName(status)); - exit(1); - } + pg_fatal("could not free LZ4 decompression context: %s", + LZ4F_getErrorName(status)); if (uncompressed_size != WalSegSz) { @@ -483,8 +452,8 @@ FindStreamingStart(uint32 *tli) #else pg_log_error("could not check file \"%s\"", dirent->d_name); - pg_log_error("this build does not support compression with %s", - "LZ4"); + pg_log_error_detail("This build does not support compression with %s.", + "LZ4"); exit(1); #endif } @@ -501,10 +470,7 @@ FindStreamingStart(uint32 *tli) } if (errno) - { - pg_log_error("could not read directory \"%s\": %m", basedir); - exit(1); - } + pg_fatal("could not read directory \"%s\": %m", basedir); close_destination_dir(dir, basedir); @@ -752,10 +718,7 @@ main(int argc, char **argv) break; case 'E': if (sscanf(optarg, "%X/%X", &hi, &lo) != 2) - { - pg_log_error("could not parse end position \"%s\"", optarg); - exit(1); - } + pg_fatal("could not parse end position \"%s\"", optarg); endpos = ((uint64) hi) << 32 | lo; break; case 'n': @@ -793,19 +756,12 @@ main(int argc, char **argv) else if (pg_strcasecmp(optarg, "none") == 0) compression_method = COMPRESSION_NONE; else - { - pg_log_error("invalid value \"%s\" for option %s", - optarg, "--compression-method"); - exit(1); - } + pg_fatal("invalid value \"%s\" for option %s", + optarg, "--compression-method"); break; default: - - /* - * getopt_long already emitted a complaint - */ - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -817,16 +773,14 @@ main(int argc, char **argv) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (do_drop_slot && do_create_slot) { pg_log_error("cannot use --create-slot together with --drop-slot"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -835,16 +789,14 @@ main(int argc, char **argv) /* translator: second %s is an option name */ pg_log_error("%s needs a slot to be specified using --slot", do_drop_slot ? "--drop-slot" : "--create-slot"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (synchronous && !do_sync) { pg_log_error("cannot use --synchronous together with --no-sync"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -854,8 +806,7 @@ main(int argc, char **argv) if (basedir == NULL && !do_drop_slot && !do_create_slot) { pg_log_error("no target directory specified"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -870,8 +821,7 @@ main(int argc, char **argv) { pg_log_error("cannot use --compress with --compression-method=%s", "none"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } break; @@ -883,9 +833,8 @@ main(int argc, char **argv) compresslevel = Z_DEFAULT_COMPRESSION; } #else - pg_log_error("this build does not support compression with %s", - "gzip"); - exit(1); + pg_fatal("this build does not support compression with %s", + "gzip"); #endif break; case COMPRESSION_LZ4: @@ -894,20 +843,17 @@ main(int argc, char **argv) { pg_log_error("cannot use --compress with --compression-method=%s", "lz4"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } #else - pg_log_error("this build does not support compression with %s", - "LZ4"); - exit(1); + pg_fatal("this build does not support compression with %s", + "LZ4"); #endif break; case COMPRESSION_ZSTD: - pg_log_error("compression with %s is not yet supported", "ZSTD"); - exit(1); - + pg_fatal("compression with %s is not yet supported", "ZSTD"); + break; } @@ -951,11 +897,8 @@ main(int argc, char **argv) * be defined in this context. */ if (db_name) - { - pg_log_error("replication connection using slot \"%s\" is unexpectedly database specific", - replication_slot); - exit(1); - } + pg_fatal("replication connection using slot \"%s\" is unexpectedly database specific", + replication_slot); /* * Set umask so that directories/files are created with the same @@ -1013,10 +956,7 @@ main(int argc, char **argv) exit(0); } else if (noloop) - { - pg_log_error("disconnected"); - exit(1); - } + pg_fatal("disconnected"); else { /* translator: check source for value for %d */ diff --git a/src/bin/pg_basebackup/pg_recvlogical.c b/src/bin/pg_basebackup/pg_recvlogical.c index cc35d16f32..b59ff23f61 100644 --- a/src/bin/pg_basebackup/pg_recvlogical.c +++ b/src/bin/pg_basebackup/pg_recvlogical.c @@ -193,10 +193,7 @@ OutputFsync(TimestampTz now) return true; if (fsync(outfd) != 0) - { - pg_log_fatal("could not fsync file \"%s\": %m", outfile); - exit(1); - } + pg_fatal("could not fsync file \"%s\": %m", outfile); return true; } @@ -780,18 +777,12 @@ main(int argc, char **argv) /* replication options */ case 'I': if (sscanf(optarg, "%X/%X", &hi, &lo) != 2) - { - pg_log_error("could not parse start position \"%s\"", optarg); - exit(1); - } + pg_fatal("could not parse start position \"%s\"", optarg); startpos = ((uint64) hi) << 32 | lo; break; case 'E': if (sscanf(optarg, "%X/%X", &hi, &lo) != 2) - { - pg_log_error("could not parse end position \"%s\"", optarg); - exit(1); - } + pg_fatal("could not parse end position \"%s\"", optarg); endpos = ((uint64) hi) << 32 | lo; break; case 'o': @@ -842,12 +833,8 @@ main(int argc, char **argv) break; default: - - /* - * getopt_long already emitted a complaint - */ - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -859,8 +846,7 @@ main(int argc, char **argv) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -870,64 +856,56 @@ main(int argc, char **argv) if (replication_slot == NULL) { pg_log_error("no slot specified"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (do_start_slot && outfile == NULL) { pg_log_error("no target file specified"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (!do_drop_slot && dbname == NULL) { pg_log_error("no database specified"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (!do_drop_slot && !do_create_slot && !do_start_slot) { pg_log_error("at least one action needs to be specified"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (do_drop_slot && (do_create_slot || do_start_slot)) { pg_log_error("cannot use --create-slot or --start together with --drop-slot"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (startpos != InvalidXLogRecPtr && (do_create_slot || do_drop_slot)) { pg_log_error("cannot use --create-slot or --drop-slot together with --startpos"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (endpos != InvalidXLogRecPtr && !do_start_slot) { pg_log_error("--endpos may only be specified with --start"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (two_phase && !do_create_slot) { pg_log_error("--two-phase may only be specified with --create-slot"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -958,10 +936,7 @@ main(int argc, char **argv) exit(1); if (db_name == NULL) - { - pg_log_error("could not establish database-specific replication connection"); - exit(1); - } + pg_fatal("could not establish database-specific replication connection"); /* * Set umask so that directories/files are created with the same @@ -1011,10 +986,7 @@ main(int argc, char **argv) exit(0); } else if (noloop) - { - pg_log_error("disconnected"); - exit(1); - } + pg_fatal("disconnected"); else { /* translator: check source for value for %d */ diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c index d39e4b11a1..42d50931d3 100644 --- a/src/bin/pg_basebackup/receivelog.c +++ b/src/bin/pg_basebackup/receivelog.c @@ -140,7 +140,7 @@ open_walfile(StreamCtl *stream, XLogRecPtr startpoint) /* fsync file in case of a previous crash */ if (stream->walmethod->sync(f) != 0) { - pg_log_fatal("could not fsync existing write-ahead log file \"%s\": %s", + pg_log_error("could not fsync existing write-ahead log file \"%s\": %s", fn, stream->walmethod->getlasterror()); stream->walmethod->close(f, CLOSE_UNLINK); exit(1); @@ -778,11 +778,8 @@ HandleCopyStream(PGconn *conn, StreamCtl *stream, if (stream->synchronous && lastFlushPosition < blockpos && walfile != NULL) { if (stream->walmethod->sync(walfile) != 0) - { - pg_log_fatal("could not fsync file \"%s\": %s", - current_walfile_name, stream->walmethod->getlasterror()); - exit(1); - } + pg_fatal("could not fsync file \"%s\": %s", + current_walfile_name, stream->walmethod->getlasterror()); lastFlushPosition = blockpos; /* @@ -1030,11 +1027,8 @@ ProcessKeepaliveMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len, * shutdown of the server. */ if (stream->walmethod->sync(walfile) != 0) - { - pg_log_fatal("could not fsync file \"%s\": %s", - current_walfile_name, stream->walmethod->getlasterror()); - exit(1); - } + pg_fatal("could not fsync file \"%s\": %s", + current_walfile_name, stream->walmethod->getlasterror()); lastFlushPosition = blockpos; } diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c index 4a6afd1a06..86c0493a94 100644 --- a/src/bin/pg_basebackup/streamutil.c +++ b/src/bin/pg_basebackup/streamutil.c @@ -88,10 +88,7 @@ GetConnection(void) { conn_opts = PQconninfoParse(connection_string, &err_msg); if (conn_opts == NULL) - { - pg_log_error("%s", err_msg); - exit(1); - } + pg_fatal("%s", err_msg); for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++) { @@ -182,10 +179,7 @@ GetConnection(void) * and PQconnectdbParams returns NULL, we call exit(1) directly. */ if (!tmpconn) - { - pg_log_error("could not connect to server"); - exit(1); - } + pg_fatal("could not connect to server"); /* If we need a password and -w wasn't given, loop back and get one */ if (PQstatus(tmpconn) == CONNECTION_BAD && diff --git a/src/bin/pg_basebackup/walmethods.c b/src/bin/pg_basebackup/walmethods.c index 1e0ff760eb..acd242d2c9 100644 --- a/src/bin/pg_basebackup/walmethods.c +++ b/src/bin/pg_basebackup/walmethods.c @@ -1195,9 +1195,8 @@ tar_close(Walfile f, WalCloseMethod method) if (tar_sync(f) < 0) { /* XXX this seems pretty bogus; why is only this case fatal? */ - pg_log_fatal("could not fsync file \"%s\": %s", - tf->pathname, tar_getlasterror()); - exit(1); + pg_fatal("could not fsync file \"%s\": %s", + tf->pathname, tar_getlasterror()); } /* Clean up and done */ diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c index 5f0f5ee62d..21dfe1b6ee 100644 --- a/src/bin/pg_checksums/pg_checksums.c +++ b/src/bin/pg_checksums/pg_checksums.c @@ -197,10 +197,7 @@ scan_file(const char *fn, int segmentno) f = open(fn, PG_BINARY | flags, 0); if (f < 0) - { - pg_log_error("could not open file \"%s\": %m", fn); - exit(1); - } + pg_fatal("could not open file \"%s\": %m", fn); files_scanned++; @@ -214,12 +211,11 @@ scan_file(const char *fn, int segmentno) if (r != BLCKSZ) { if (r < 0) - pg_log_error("could not read block %u in file \"%s\": %m", - blockno, fn); + pg_fatal("could not read block %u in file \"%s\": %m", + blockno, fn); else - pg_log_error("could not read block %u in file \"%s\": read %d of %d", - blockno, fn, r, BLCKSZ); - exit(1); + pg_fatal("could not read block %u in file \"%s\": read %d of %d", + blockno, fn, r, BLCKSZ); } blocks_scanned++; @@ -264,22 +260,18 @@ scan_file(const char *fn, int segmentno) /* Seek back to beginning of block */ if (lseek(f, -BLCKSZ, SEEK_CUR) < 0) - { - pg_log_error("seek failed for block %u in file \"%s\": %m", blockno, fn); - exit(1); - } + pg_fatal("seek failed for block %u in file \"%s\": %m", blockno, fn); /* Write block with checksum */ w = write(f, buf.data, BLCKSZ); if (w != BLCKSZ) { if (w < 0) - pg_log_error("could not write block %u in file \"%s\": %m", - blockno, fn); + pg_fatal("could not write block %u in file \"%s\": %m", + blockno, fn); else - pg_log_error("could not write block %u in file \"%s\": wrote %d of %d", - blockno, fn, w, BLCKSZ); - exit(1); + pg_fatal("could not write block %u in file \"%s\": wrote %d of %d", + blockno, fn, w, BLCKSZ); } } @@ -323,10 +315,7 @@ scan_directory(const char *basedir, const char *subdir, bool sizeonly) snprintf(path, sizeof(path), "%s/%s", basedir, subdir); dir = opendir(path); if (!dir) - { - pg_log_error("could not open directory \"%s\": %m", path); - exit(1); - } + pg_fatal("could not open directory \"%s\": %m", path); while ((de = readdir(dir)) != NULL) { char fn[MAXPGPATH]; @@ -350,10 +339,7 @@ scan_directory(const char *basedir, const char *subdir, bool sizeonly) snprintf(fn, sizeof(fn), "%s/%s", path, de->d_name); if (lstat(fn, &st) < 0) - { - pg_log_error("could not stat file \"%s\": %m", fn); - exit(1); - } + pg_fatal("could not stat file \"%s\": %m", fn); if (S_ISREG(st.st_mode)) { char fnonly[MAXPGPATH]; @@ -377,11 +363,8 @@ scan_directory(const char *basedir, const char *subdir, bool sizeonly) *segmentpath++ = '\0'; segmentno = atoi(segmentpath); if (segmentno == 0) - { - pg_log_error("invalid segment number %d in file name \"%s\"", - segmentno, fn); - exit(1); - } + pg_fatal("invalid segment number %d in file name \"%s\"", + segmentno, fn); } forkpath = strchr(fnonly, '_'); @@ -429,11 +412,8 @@ scan_directory(const char *basedir, const char *subdir, bool sizeonly) path, de->d_name, TABLESPACE_VERSION_DIRECTORY); if (lstat(tblspc_path, &tblspc_st) < 0) - { - pg_log_error("could not stat file \"%s\": %m", - tblspc_path); - exit(1); - } + pg_fatal("could not stat file \"%s\": %m", + tblspc_path); /* * Move backwards once as the scan needs to happen for the @@ -528,7 +508,8 @@ main(int argc, char *argv[]) showprogress = true; break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -544,7 +525,7 @@ main(int argc, char *argv[]) if (DataDir == NULL) { pg_log_error("no data directory specified"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -554,8 +535,7 @@ main(int argc, char *argv[]) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -563,30 +543,23 @@ main(int argc, char *argv[]) if (mode != PG_MODE_CHECK && only_filenode) { pg_log_error("option -f/--filenode can only be used with --check"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } /* Read the control file and check compatibility */ ControlFile = get_controlfile(DataDir, &crc_ok); if (!crc_ok) - { - pg_log_error("pg_control CRC value is incorrect"); - exit(1); - } + pg_fatal("pg_control CRC value is incorrect"); if (ControlFile->pg_control_version != PG_CONTROL_VERSION) - { - pg_log_error("cluster is not compatible with this version of pg_checksums"); - exit(1); - } + pg_fatal("cluster is not compatible with this version of pg_checksums"); if (ControlFile->blcksz != BLCKSZ) { pg_log_error("database cluster is not compatible"); - fprintf(stderr, _("The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.\n"), - ControlFile->blcksz, BLCKSZ); + pg_log_error_detail("The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.", + ControlFile->blcksz, BLCKSZ); exit(1); } @@ -597,31 +570,19 @@ main(int argc, char *argv[]) */ if (ControlFile->state != DB_SHUTDOWNED && ControlFile->state != DB_SHUTDOWNED_IN_RECOVERY) - { - pg_log_error("cluster must be shut down"); - exit(1); - } + pg_fatal("cluster must be shut down"); if (ControlFile->data_checksum_version == 0 && mode == PG_MODE_CHECK) - { - pg_log_error("data checksums are not enabled in cluster"); - exit(1); - } + pg_fatal("data checksums are not enabled in cluster"); if (ControlFile->data_checksum_version == 0 && mode == PG_MODE_DISABLE) - { - pg_log_error("data checksums are already disabled in cluster"); - exit(1); - } + pg_fatal("data checksums are already disabled in cluster"); if (ControlFile->data_checksum_version > 0 && mode == PG_MODE_ENABLE) - { - pg_log_error("data checksums are already enabled in cluster"); - exit(1); - } + pg_fatal("data checksums are already enabled in cluster"); /* Operate on all files if checking or enabling checksums */ if (mode == PG_MODE_CHECK || mode == PG_MODE_ENABLE) diff --git a/src/bin/pg_controldata/pg_controldata.c b/src/bin/pg_controldata/pg_controldata.c index f911f98d94..c390ec51ce 100644 --- a/src/bin/pg_controldata/pg_controldata.c +++ b/src/bin/pg_controldata/pg_controldata.c @@ -134,7 +134,8 @@ main(int argc, char *argv[]) break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -152,15 +153,14 @@ main(int argc, char *argv[]) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (DataDir == NULL) { pg_log_error("no data directory specified"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 3a9092a16a..f605e02da8 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -886,14 +886,10 @@ find_other_exec_or_die(const char *argv0, const char *target, const char *versio strlcpy(full_path, progname, sizeof(full_path)); if (ret == -1) - write_stderr(_("The program \"%s\" is needed by %s but was not found in the\n" - "same directory as \"%s\".\n" - "Check your installation.\n"), + write_stderr(_("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"), target, progname, full_path); else - write_stderr(_("The program \"%s\" was found by \"%s\"\n" - "but was not the same version as %s.\n" - "Check your installation.\n"), + write_stderr(_("program \"%s\" was found by \"%s\" but was not the same version as %s\n"), target, full_path, progname); exit(1); } diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c index b9a25442f5..794e6e7ce9 100644 --- a/src/bin/pg_dump/common.c +++ b/src/bin/pg_dump/common.c @@ -340,9 +340,9 @@ flagInhTables(Archive *fout, TableInfo *tblinfo, int numTables, /* With partitions there can only be one parent */ if (tblinfo[i].numParents != 1) - fatal("invalid number of parents %d for table \"%s\"", - tblinfo[i].numParents, - tblinfo[i].dobj.name); + pg_fatal("invalid number of parents %d for table \"%s\"", + tblinfo[i].numParents, + tblinfo[i].dobj.name); attachinfo = (TableAttachInfo *) palloc(sizeof(TableAttachInfo)); attachinfo->dobj.objType = DO_TABLE_ATTACH; @@ -1001,13 +1001,10 @@ findParentsByOid(TableInfo *self, parent = findTableByOid(inhinfo[i].inhparent); if (parent == NULL) - { - pg_log_error("failed sanity check, parent OID %u of table \"%s\" (OID %u) not found", - inhinfo[i].inhparent, - self->dobj.name, - oid); - exit_nicely(1); - } + pg_fatal("failed sanity check, parent OID %u of table \"%s\" (OID %u) not found", + inhinfo[i].inhparent, + self->dobj.name, + oid); self->parents[j++] = parent; } } @@ -1043,10 +1040,7 @@ parseOidArray(const char *str, Oid *array, int arraysize) if (j > 0) { if (argNum >= arraysize) - { - pg_log_error("could not parse numeric array \"%s\": too many numbers", str); - exit_nicely(1); - } + pg_fatal("could not parse numeric array \"%s\": too many numbers", str); temp[j] = '\0'; array[argNum++] = atooid(temp); j = 0; @@ -1058,10 +1052,7 @@ parseOidArray(const char *str, Oid *array, int arraysize) { if (!(isdigit((unsigned char) s) || s == '-') || j >= sizeof(temp) - 1) - { - pg_log_error("could not parse numeric array \"%s\": invalid character in number", str); - exit_nicely(1); - } + pg_fatal("could not parse numeric array \"%s\": invalid character in number", str); temp[j++] = s; } } diff --git a/src/bin/pg_dump/compress_io.c b/src/bin/pg_dump/compress_io.c index 9077fdb74d..62f940ff7a 100644 --- a/src/bin/pg_dump/compress_io.c +++ b/src/bin/pg_dump/compress_io.c @@ -108,7 +108,7 @@ ParseCompressionOption(int compression, CompressionAlgorithm *alg, int *level) *alg = COMPR_ALG_NONE; else { - fatal("invalid compression code: %d", compression); + pg_fatal("invalid compression code: %d", compression); *alg = COMPR_ALG_NONE; /* keep compiler quiet */ } @@ -131,7 +131,7 @@ AllocateCompressor(int compression, WriteFunc writeF) #ifndef HAVE_LIBZ if (alg == COMPR_ALG_LIBZ) - fatal("not built with zlib support"); + pg_fatal("not built with zlib support"); #endif cs = (CompressorState *) pg_malloc0(sizeof(CompressorState)); @@ -167,7 +167,7 @@ ReadDataFromArchive(ArchiveHandle *AH, int compression, ReadFunc readF) #ifdef HAVE_LIBZ ReadDataFromArchiveZlib(AH, readF); #else - fatal("not built with zlib support"); + pg_fatal("not built with zlib support"); #endif } } @@ -185,7 +185,7 @@ WriteDataToArchive(ArchiveHandle *AH, CompressorState *cs, #ifdef HAVE_LIBZ WriteDataToArchiveZlib(AH, cs, data, dLen); #else - fatal("not built with zlib support"); + pg_fatal("not built with zlib support"); #endif break; case COMPR_ALG_NONE: @@ -233,8 +233,8 @@ InitCompressorZlib(CompressorState *cs, int level) cs->zlibOutSize = ZLIB_OUT_SIZE; if (deflateInit(zp, level) != Z_OK) - fatal("could not initialize compression library: %s", - zp->msg); + pg_fatal("could not initialize compression library: %s", + zp->msg); /* Just be paranoid - maybe End is called after Start, with no Write */ zp->next_out = (void *) cs->zlibOut; @@ -253,7 +253,7 @@ EndCompressorZlib(ArchiveHandle *AH, CompressorState *cs) DeflateCompressorZlib(AH, cs, true); if (deflateEnd(zp) != Z_OK) - fatal("could not close compression stream: %s", zp->msg); + pg_fatal("could not close compression stream: %s", zp->msg); free(cs->zlibOut); free(cs->zp); @@ -270,7 +270,7 @@ DeflateCompressorZlib(ArchiveHandle *AH, CompressorState *cs, bool flush) { res = deflate(zp, flush ? Z_FINISH : Z_NO_FLUSH); if (res == Z_STREAM_ERROR) - fatal("could not compress data: %s", zp->msg); + pg_fatal("could not compress data: %s", zp->msg); if ((flush && (zp->avail_out < cs->zlibOutSize)) || (zp->avail_out == 0) || (zp->avail_in != 0) @@ -330,8 +330,8 @@ ReadDataFromArchiveZlib(ArchiveHandle *AH, ReadFunc readF) out = pg_malloc(ZLIB_OUT_SIZE + 1); if (inflateInit(zp) != Z_OK) - fatal("could not initialize compression library: %s", - zp->msg); + pg_fatal("could not initialize compression library: %s", + zp->msg); /* no minimal chunk size for zlib */ while ((cnt = readF(AH, &buf, &buflen))) @@ -346,7 +346,7 @@ ReadDataFromArchiveZlib(ArchiveHandle *AH, ReadFunc readF) res = inflate(zp, 0); if (res != Z_OK && res != Z_STREAM_END) - fatal("could not uncompress data: %s", zp->msg); + pg_fatal("could not uncompress data: %s", zp->msg); out[ZLIB_OUT_SIZE - zp->avail_out] = '\0'; ahwrite(out, 1, ZLIB_OUT_SIZE - zp->avail_out, AH); @@ -361,14 +361,14 @@ ReadDataFromArchiveZlib(ArchiveHandle *AH, ReadFunc readF) zp->avail_out = ZLIB_OUT_SIZE; res = inflate(zp, 0); if (res != Z_OK && res != Z_STREAM_END) - fatal("could not uncompress data: %s", zp->msg); + pg_fatal("could not uncompress data: %s", zp->msg); out[ZLIB_OUT_SIZE - zp->avail_out] = '\0'; ahwrite(out, 1, ZLIB_OUT_SIZE - zp->avail_out, AH); } if (inflateEnd(zp) != Z_OK) - fatal("could not close compression library: %s", zp->msg); + pg_fatal("could not close compression library: %s", zp->msg); free(buf); free(out); @@ -501,7 +501,7 @@ cfopen_write(const char *path, const char *mode, int compression) fp = cfopen(fname, mode, compression); free_keep_errno(fname); #else - fatal("not built with zlib support"); + pg_fatal("not built with zlib support"); fp = NULL; /* keep compiler quiet */ #endif } @@ -544,7 +544,7 @@ cfopen(const char *path, const char *mode, int compression) fp = NULL; } #else - fatal("not built with zlib support"); + pg_fatal("not built with zlib support"); #endif } else @@ -581,8 +581,8 @@ cfread(void *ptr, int size, cfp *fp) int errnum; const char *errmsg = gzerror(fp->compressedfp, &errnum); - fatal("could not read from input file: %s", - errnum == Z_ERRNO ? strerror(errno) : errmsg); + pg_fatal("could not read from input file: %s", + errnum == Z_ERRNO ? strerror(errno) : errmsg); } } else @@ -618,9 +618,9 @@ cfgetc(cfp *fp) if (ret == EOF) { if (!gzeof(fp->compressedfp)) - fatal("could not read from input file: %s", strerror(errno)); + pg_fatal("could not read from input file: %s", strerror(errno)); else - fatal("could not read from input file: end of file"); + pg_fatal("could not read from input file: end of file"); } } else diff --git a/src/bin/pg_dump/nls.mk b/src/bin/pg_dump/nls.mk index 6276fd443b..220d1ec75f 100644 --- a/src/bin/pg_dump/nls.mk +++ b/src/bin/pg_dump/nls.mk @@ -11,8 +11,7 @@ GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ ../../common/exec.c ../../common/fe_memutils.c \ ../../common/wait_error.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \ - fatal simple_prompt \ + simple_prompt \ ExecuteSqlCommand:3 warn_or_exit_horribly:2 GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \ - fatal:1:c-format \ warn_or_exit_horribly:2:c-format diff --git a/src/bin/pg_dump/parallel.c b/src/bin/pg_dump/parallel.c index bc5251be82..c9f6b86bb0 100644 --- a/src/bin/pg_dump/parallel.c +++ b/src/bin/pg_dump/parallel.c @@ -250,10 +250,7 @@ init_parallel_dump_utils(void) /* Initialize socket access */ err = WSAStartup(MAKEWORD(2, 2), &wsaData); if (err != 0) - { - pg_log_error("%s() failed: error code %d", "WSAStartup", err); - exit_nicely(1); - } + pg_fatal("%s() failed: error code %d", "WSAStartup", err); parallel_init_done = true; } @@ -393,7 +390,7 @@ archive_close_connection(int code, void *arg) * * Note that we don't expect to come here during normal exit (the workers * should be long gone, and the ParallelState too). We're only here in a - * fatal() situation, so intervening to cancel active commands is + * pg_fatal() situation, so intervening to cancel active commands is * appropriate. */ static void @@ -961,7 +958,7 @@ ParallelBackupStart(ArchiveHandle *AH) /* Create communication pipes for this worker */ if (pgpipe(pipeMW) < 0 || pgpipe(pipeWM) < 0) - fatal("could not create communication channels: %m"); + pg_fatal("could not create communication channels: %m"); /* leader's ends of the pipes */ slot->pipeRead = pipeWM[PIPE_READ]; @@ -1018,7 +1015,7 @@ ParallelBackupStart(ArchiveHandle *AH) else if (pid < 0) { /* fork failed */ - fatal("could not create worker process: %m"); + pg_fatal("could not create worker process: %m"); } /* In Leader after successful fork */ @@ -1148,8 +1145,8 @@ parseWorkerCommand(ArchiveHandle *AH, TocEntry **te, T_Action *act, Assert(*te != NULL); } else - fatal("unrecognized command received from leader: \"%s\"", - msg); + pg_fatal("unrecognized command received from leader: \"%s\"", + msg); } /* @@ -1191,8 +1188,8 @@ parseWorkerResponse(ArchiveHandle *AH, TocEntry *te, AH->public.n_errors += n_errors; } else - fatal("invalid message received from worker: \"%s\"", - msg); + pg_fatal("invalid message received from worker: \"%s\"", + msg); return status; } @@ -1323,10 +1320,10 @@ lockTableForWorker(ArchiveHandle *AH, TocEntry *te) res = PQexec(AH->connection, query->data); if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) - fatal("could not obtain lock on relation \"%s\"\n" - "This usually means that someone requested an ACCESS EXCLUSIVE lock " - "on the table after the pg_dump parent process had gotten the " - "initial ACCESS SHARE lock on the table.", qualId); + pg_fatal("could not obtain lock on relation \"%s\"\n" + "This usually means that someone requested an ACCESS EXCLUSIVE lock " + "on the table after the pg_dump parent process had gotten the " + "initial ACCESS SHARE lock on the table.", qualId); PQclear(res); destroyPQExpBuffer(query); @@ -1412,7 +1409,7 @@ ListenToWorkers(ArchiveHandle *AH, ParallelState *pstate, bool do_wait) { /* If do_wait is true, we must have detected EOF on some socket */ if (do_wait) - fatal("a worker process died unexpectedly"); + pg_fatal("a worker process died unexpectedly"); return false; } @@ -1429,8 +1426,8 @@ ListenToWorkers(ArchiveHandle *AH, ParallelState *pstate, bool do_wait) pstate->te[worker] = NULL; } else - fatal("invalid message received from worker: \"%s\"", - msg); + pg_fatal("invalid message received from worker: \"%s\"", + msg); /* Free the string returned from getMessageFromWorker */ free(msg); @@ -1534,7 +1531,7 @@ sendMessageToLeader(int pipefd[2], const char *str) int len = strlen(str) + 1; if (pipewrite(pipefd[PIPE_WRITE], str, len) != len) - fatal("could not write to the communication channel: %m"); + pg_fatal("could not write to the communication channel: %m"); } /* @@ -1611,7 +1608,7 @@ getMessageFromWorker(ParallelState *pstate, bool do_wait, int *worker) } if (i < 0) - fatal("%s() failed: %m", "select"); + pg_fatal("%s() failed: %m", "select"); for (i = 0; i < pstate->numWorkers; i++) { @@ -1652,7 +1649,7 @@ sendMessageToWorker(ParallelState *pstate, int worker, const char *str) if (pipewrite(pstate->parallelSlot[worker].pipeWrite, str, len) != len) { - fatal("could not write to the communication channel: %m"); + pg_fatal("could not write to the communication channel: %m"); } } diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index d41a99d6ea..24e42fa5d7 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -276,7 +276,7 @@ CloseArchive(Archive *AHX) res = fclose(AH->OF); if (res != 0) - fatal("could not close output file: %m"); + pg_fatal("could not close output file: %m"); } /* Public */ @@ -330,8 +330,8 @@ ProcessArchiveRestoreOptions(Archive *AHX) /* ok no matter which section we were in */ break; default: - fatal("unexpected section code %d", - (int) te->section); + pg_fatal("unexpected section code %d", + (int) te->section); break; } } @@ -367,11 +367,11 @@ RestoreArchive(Archive *AHX) { /* We haven't got round to making this work for all archive formats */ if (AH->ClonePtr == NULL || AH->ReopenPtr == NULL) - fatal("parallel restore is not supported with this archive file format"); + pg_fatal("parallel restore is not supported with this archive file format"); /* Doesn't work if the archive represents dependencies as OIDs */ if (AH->version < K_VERS_1_8) - fatal("parallel restore is not supported with archives made by pre-8.0 pg_dump"); + pg_fatal("parallel restore is not supported with archives made by pre-8.0 pg_dump"); /* * It's also not gonna work if we can't reopen the input file, so @@ -389,7 +389,7 @@ RestoreArchive(Archive *AHX) for (te = AH->toc->next; te != AH->toc; te = te->next) { if (te->hadDumper && (te->reqs & REQ_DATA) != 0) - fatal("cannot restore from compressed archive (compression not supported in this installation)"); + pg_fatal("cannot restore from compressed archive (compression not supported in this installation)"); } } #endif @@ -408,7 +408,7 @@ RestoreArchive(Archive *AHX) { pg_log_info("connecting to database for restore"); if (AH->version < K_VERS_1_3) - fatal("direct database connections are not supported in pre-1.3 archives"); + pg_fatal("direct database connections are not supported in pre-1.3 archives"); /* * We don't want to guess at whether the dump will successfully @@ -1037,7 +1037,7 @@ WriteData(Archive *AHX, const void *data, size_t dLen) ArchiveHandle *AH = (ArchiveHandle *) AHX; if (!AH->currToc) - fatal("internal error -- WriteData cannot be called outside the context of a DataDumper routine"); + pg_fatal("internal error -- WriteData cannot be called outside the context of a DataDumper routine"); AH->WriteDataPtr(AH, data, dLen); } @@ -1220,7 +1220,7 @@ StartBlob(Archive *AHX, Oid oid) ArchiveHandle *AH = (ArchiveHandle *) AHX; if (!AH->StartBlobPtr) - fatal("large-object output not supported in chosen format"); + pg_fatal("large-object output not supported in chosen format"); AH->StartBlobPtr(AH, AH->currToc, oid); @@ -1311,13 +1311,13 @@ StartRestoreBlob(ArchiveHandle *AH, Oid oid, bool drop) { loOid = lo_create(AH->connection, oid); if (loOid == 0 || loOid != oid) - fatal("could not create large object %u: %s", - oid, PQerrorMessage(AH->connection)); + pg_fatal("could not create large object %u: %s", + oid, PQerrorMessage(AH->connection)); } AH->loFd = lo_open(AH->connection, oid, INV_WRITE); if (AH->loFd == -1) - fatal("could not open large object %u: %s", - oid, PQerrorMessage(AH->connection)); + pg_fatal("could not open large object %u: %s", + oid, PQerrorMessage(AH->connection)); } else { @@ -1372,7 +1372,7 @@ SortTocFromFile(Archive *AHX) /* Setup the file */ fh = fopen(ropt->tocFile, PG_BINARY_R); if (!fh) - fatal("could not open TOC file \"%s\": %m", ropt->tocFile); + pg_fatal("could not open TOC file \"%s\": %m", ropt->tocFile); initStringInfo(&linebuf); @@ -1407,8 +1407,8 @@ SortTocFromFile(Archive *AHX) /* Find TOC entry */ te = getTocEntryByDumpId(AH, id); if (!te) - fatal("could not find entry for ID %d", - id); + pg_fatal("could not find entry for ID %d", + id); /* Mark it wanted */ ropt->idWanted[id - 1] = true; @@ -1430,7 +1430,7 @@ SortTocFromFile(Archive *AHX) pg_free(linebuf.data); if (fclose(fh) != 0) - fatal("could not close TOC file: %m"); + pg_fatal("could not close TOC file: %m"); } /********************** @@ -1544,9 +1544,9 @@ SetOutput(ArchiveHandle *AH, const char *filename, int compression) if (!AH->OF) { if (filename) - fatal("could not open output file \"%s\": %m", filename); + pg_fatal("could not open output file \"%s\": %m", filename); else - fatal("could not open output file: %m"); + pg_fatal("could not open output file: %m"); } } @@ -1573,7 +1573,7 @@ RestoreOutput(ArchiveHandle *AH, OutputContext savedContext) res = fclose(AH->OF); if (res != 0) - fatal("could not close output file: %m"); + pg_fatal("could not close output file: %m"); AH->gzOut = savedContext.gzOut; AH->OF = savedContext.OF; @@ -1736,34 +1736,34 @@ warn_or_exit_horribly(ArchiveHandle *AH, const char *fmt,...) case STAGE_INITIALIZING: if (AH->stage != AH->lastErrorStage) - pg_log_generic(PG_LOG_INFO, "while INITIALIZING:"); + pg_log_info("while INITIALIZING:"); break; case STAGE_PROCESSING: if (AH->stage != AH->lastErrorStage) - pg_log_generic(PG_LOG_INFO, "while PROCESSING TOC:"); + pg_log_info("while PROCESSING TOC:"); break; case STAGE_FINALIZING: if (AH->stage != AH->lastErrorStage) - pg_log_generic(PG_LOG_INFO, "while FINALIZING:"); + pg_log_info("while FINALIZING:"); break; } if (AH->currentTE != NULL && AH->currentTE != AH->lastErrorTE) { - pg_log_generic(PG_LOG_INFO, "from TOC entry %d; %u %u %s %s %s", - AH->currentTE->dumpId, - AH->currentTE->catalogId.tableoid, - AH->currentTE->catalogId.oid, - AH->currentTE->desc ? AH->currentTE->desc : "(no desc)", - AH->currentTE->tag ? AH->currentTE->tag : "(no tag)", - AH->currentTE->owner ? AH->currentTE->owner : "(no owner)"); + pg_log_info("from TOC entry %d; %u %u %s %s %s", + AH->currentTE->dumpId, + AH->currentTE->catalogId.tableoid, + AH->currentTE->catalogId.oid, + AH->currentTE->desc ? AH->currentTE->desc : "(no desc)", + AH->currentTE->tag ? AH->currentTE->tag : "(no tag)", + AH->currentTE->owner ? AH->currentTE->owner : "(no owner)"); } AH->lastErrorStage = AH->stage; AH->lastErrorTE = AH->currentTE; va_start(ap, fmt); - pg_log_generic_v(PG_LOG_ERROR, fmt, ap); + pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, fmt, ap); va_end(ap); if (AH->public.exit_on_error) @@ -1827,7 +1827,7 @@ buildTocEntryArrays(ArchiveHandle *AH) { /* this check is purely paranoia, maxDumpId should be correct */ if (te->dumpId <= 0 || te->dumpId > maxDumpId) - fatal("bad dumpId"); + pg_fatal("bad dumpId"); /* tocsByDumpId indexes all TOCs by their dump ID */ AH->tocsByDumpId[te->dumpId] = te; @@ -1848,7 +1848,7 @@ buildTocEntryArrays(ArchiveHandle *AH) * item's dump ID, so there should be a place for it in the array. */ if (tableId <= 0 || tableId > maxDumpId) - fatal("bad table dumpId for TABLE DATA item"); + pg_fatal("bad table dumpId for TABLE DATA item"); AH->tableDataId[tableId] = te->dumpId; } @@ -1940,7 +1940,7 @@ ReadOffset(ArchiveHandle *AH, pgoff_t * o) break; default: - fatal("unexpected data offset flag %d", offsetFlg); + pg_fatal("unexpected data offset flag %d", offsetFlg); } /* @@ -1953,7 +1953,7 @@ ReadOffset(ArchiveHandle *AH, pgoff_t * o) else { if (AH->ReadBytePtr(AH) != 0) - fatal("file offset in dump file is too large"); + pg_fatal("file offset in dump file is too large"); } } @@ -2091,8 +2091,8 @@ _discoverArchiveFormat(ArchiveHandle *AH) char buf[MAXPGPATH]; if (snprintf(buf, MAXPGPATH, "%s/toc.dat", AH->fSpec) >= MAXPGPATH) - fatal("directory name too long: \"%s\"", - AH->fSpec); + pg_fatal("directory name too long: \"%s\"", + AH->fSpec); if (stat(buf, &st) == 0 && S_ISREG(st.st_mode)) { AH->format = archDirectory; @@ -2101,39 +2101,39 @@ _discoverArchiveFormat(ArchiveHandle *AH) #ifdef HAVE_LIBZ if (snprintf(buf, MAXPGPATH, "%s/toc.dat.gz", AH->fSpec) >= MAXPGPATH) - fatal("directory name too long: \"%s\"", - AH->fSpec); + pg_fatal("directory name too long: \"%s\"", + AH->fSpec); if (stat(buf, &st) == 0 && S_ISREG(st.st_mode)) { AH->format = archDirectory; return AH->format; } #endif - fatal("directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)", - AH->fSpec); + pg_fatal("directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)", + AH->fSpec); fh = NULL; /* keep compiler quiet */ } else { fh = fopen(AH->fSpec, PG_BINARY_R); if (!fh) - fatal("could not open input file \"%s\": %m", AH->fSpec); + pg_fatal("could not open input file \"%s\": %m", AH->fSpec); } } else { fh = stdin; if (!fh) - fatal("could not open input file: %m"); + pg_fatal("could not open input file: %m"); } if ((cnt = fread(sig, 1, 5, fh)) != 5) { if (ferror(fh)) - fatal("could not read input file: %m"); + pg_fatal("could not read input file: %m"); else - fatal("input file is too short (read %lu, expected 5)", - (unsigned long) cnt); + pg_fatal("input file is too short (read %lu, expected 5)", + (unsigned long) cnt); } /* Save it, just in case we need it later */ @@ -2164,19 +2164,19 @@ _discoverArchiveFormat(ArchiveHandle *AH) * looks like it's probably a text format dump. so suggest they * try psql */ - fatal("input file appears to be a text format dump. Please use psql."); + pg_fatal("input file appears to be a text format dump. Please use psql."); } if (AH->lookaheadLen != 512) { if (feof(fh)) - fatal("input file does not appear to be a valid archive (too short?)"); + pg_fatal("input file does not appear to be a valid archive (too short?)"); else READ_ERROR_EXIT(fh); } if (!isValidTarHeader(AH->lookahead)) - fatal("input file does not appear to be a valid archive"); + pg_fatal("input file does not appear to be a valid archive"); AH->format = archTar; } @@ -2185,7 +2185,7 @@ _discoverArchiveFormat(ArchiveHandle *AH) if (wantClose) { if (fclose(fh) != 0) - fatal("could not close input file: %m"); + pg_fatal("could not close input file: %m"); /* Forget lookahead, since we'll re-read header after re-opening */ AH->readHeader = 0; AH->lookaheadLen = 0; @@ -2302,7 +2302,7 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt, break; default: - fatal("unrecognized file format \"%d\"", fmt); + pg_fatal("unrecognized file format \"%d\"", fmt); } return AH; @@ -2388,8 +2388,8 @@ mark_dump_job_done(ArchiveHandle *AH, te->dumpId, te->desc, te->tag); if (status != 0) - fatal("worker process failed: exit code %d", - status); + pg_fatal("worker process failed: exit code %d", + status); } @@ -2509,8 +2509,8 @@ ReadToc(ArchiveHandle *AH) /* Sanity check */ if (te->dumpId <= 0) - fatal("entry ID %d out of range -- perhaps a corrupt TOC", - te->dumpId); + pg_fatal("entry ID %d out of range -- perhaps a corrupt TOC", + te->dumpId); te->hadDumper = ReadInt(AH); @@ -2671,13 +2671,13 @@ processEncodingEntry(ArchiveHandle *AH, TocEntry *te) *ptr2 = '\0'; encoding = pg_char_to_encoding(ptr1); if (encoding < 0) - fatal("unrecognized encoding \"%s\"", - ptr1); + pg_fatal("unrecognized encoding \"%s\"", + ptr1); AH->public.encoding = encoding; } else - fatal("invalid ENCODING item: %s", - te->defn); + pg_fatal("invalid ENCODING item: %s", + te->defn); free(defn); } @@ -2694,8 +2694,8 @@ processStdStringsEntry(ArchiveHandle *AH, TocEntry *te) else if (ptr1 && strncmp(ptr1, "'off'", 5) == 0) AH->public.std_strings = false; else - fatal("invalid STDSTRINGS item: %s", - te->defn); + pg_fatal("invalid STDSTRINGS item: %s", + te->defn); } static void @@ -2719,35 +2719,35 @@ StrictNamesCheck(RestoreOptions *ropt) { missing_name = simple_string_list_not_touched(&ropt->schemaNames); if (missing_name != NULL) - fatal("schema \"%s\" not found", missing_name); + pg_fatal("schema \"%s\" not found", missing_name); } if (ropt->tableNames.head != NULL) { missing_name = simple_string_list_not_touched(&ropt->tableNames); if (missing_name != NULL) - fatal("table \"%s\" not found", missing_name); + pg_fatal("table \"%s\" not found", missing_name); } if (ropt->indexNames.head != NULL) { missing_name = simple_string_list_not_touched(&ropt->indexNames); if (missing_name != NULL) - fatal("index \"%s\" not found", missing_name); + pg_fatal("index \"%s\" not found", missing_name); } if (ropt->functionNames.head != NULL) { missing_name = simple_string_list_not_touched(&ropt->functionNames); if (missing_name != NULL) - fatal("function \"%s\" not found", missing_name); + pg_fatal("function \"%s\" not found", missing_name); } if (ropt->triggerNames.head != NULL) { missing_name = simple_string_list_not_touched(&ropt->triggerNames); if (missing_name != NULL) - fatal("trigger \"%s\" not found", missing_name); + pg_fatal("trigger \"%s\" not found", missing_name); } } @@ -3140,8 +3140,8 @@ _doSetSessionAuth(ArchiveHandle *AH, const char *user) if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) /* NOT warn_or_exit_horribly... use -O instead to skip this. */ - fatal("could not set session user to \"%s\": %s", - user, PQerrorMessage(AH->connection)); + pg_fatal("could not set session user to \"%s\": %s", + user, PQerrorMessage(AH->connection)); PQclear(res); } @@ -3751,7 +3751,7 @@ ReadHead(ArchiveHandle *AH) AH->ReadBufPtr(AH, tmpMag, 5); if (strncmp(tmpMag, "PGDMP", 5) != 0) - fatal("did not find magic string in file header"); + pg_fatal("did not find magic string in file header"); } vmaj = AH->ReadBytePtr(AH); @@ -3765,13 +3765,13 @@ ReadHead(ArchiveHandle *AH) AH->version = MAKE_ARCHIVE_VERSION(vmaj, vmin, vrev); if (AH->version < K_VERS_1_0 || AH->version > K_VERS_MAX) - fatal("unsupported version (%d.%d) in file header", - vmaj, vmin); + pg_fatal("unsupported version (%d.%d) in file header", + vmaj, vmin); AH->intSize = AH->ReadBytePtr(AH); if (AH->intSize > 32) - fatal("sanity check on integer size (%lu) failed", - (unsigned long) AH->intSize); + pg_fatal("sanity check on integer size (%lu) failed", + (unsigned long) AH->intSize); if (AH->intSize > sizeof(int)) pg_log_warning("archive was made on a machine with larger integers, some operations might fail"); @@ -3784,8 +3784,8 @@ ReadHead(ArchiveHandle *AH) fmt = AH->ReadBytePtr(AH); if (AH->format != fmt) - fatal("expected format (%d) differs from format found in file (%d)", - AH->format, fmt); + pg_fatal("expected format (%d) differs from format found in file (%d)", + AH->format, fmt); if (AH->version >= K_VERS_1_2) { @@ -4455,8 +4455,8 @@ mark_restore_job_done(ArchiveHandle *AH, else if (status == WORKER_IGNORED_ERRORS) AH->public.n_errors++; else if (status != 0) - fatal("worker process failed: exit code %d", - status); + pg_fatal("worker process failed: exit code %d", + status); reduce_dependencies(AH, te, ready_list); } diff --git a/src/bin/pg_dump/pg_backup_archiver.h b/src/bin/pg_dump/pg_backup_archiver.h index 540d4f6a83..084cd87e8d 100644 --- a/src/bin/pg_dump/pg_backup_archiver.h +++ b/src/bin/pg_dump/pg_backup_archiver.h @@ -121,14 +121,14 @@ struct ParallelState; #define READ_ERROR_EXIT(fd) \ do { \ if (feof(fd)) \ - fatal("could not read from input file: end of file"); \ + pg_fatal("could not read from input file: end of file"); \ else \ - fatal("could not read from input file: %m"); \ + pg_fatal("could not read from input file: %m"); \ } while (0) #define WRITE_ERROR_EXIT \ do { \ - fatal("could not write to output file: %m"); \ + pg_fatal("could not write to output file: %m"); \ } while (0) typedef enum T_Action diff --git a/src/bin/pg_dump/pg_backup_custom.c b/src/bin/pg_dump/pg_backup_custom.c index 77d402c323..c3b9c365d5 100644 --- a/src/bin/pg_dump/pg_backup_custom.c +++ b/src/bin/pg_dump/pg_backup_custom.c @@ -153,13 +153,13 @@ InitArchiveFmt_Custom(ArchiveHandle *AH) { AH->FH = fopen(AH->fSpec, PG_BINARY_W); if (!AH->FH) - fatal("could not open output file \"%s\": %m", AH->fSpec); + pg_fatal("could not open output file \"%s\": %m", AH->fSpec); } else { AH->FH = stdout; if (!AH->FH) - fatal("could not open output file: %m"); + pg_fatal("could not open output file: %m"); } ctx->hasSeek = checkSeek(AH->FH); @@ -170,13 +170,13 @@ InitArchiveFmt_Custom(ArchiveHandle *AH) { AH->FH = fopen(AH->fSpec, PG_BINARY_R); if (!AH->FH) - fatal("could not open input file \"%s\": %m", AH->fSpec); + pg_fatal("could not open input file \"%s\": %m", AH->fSpec); } else { AH->FH = stdin; if (!AH->FH) - fatal("could not open input file: %m"); + pg_fatal("could not open input file: %m"); } ctx->hasSeek = checkSeek(AH->FH); @@ -373,7 +373,7 @@ _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid) lclContext *ctx = (lclContext *) AH->formatData; if (oid == 0) - fatal("invalid OID for large object"); + pg_fatal("invalid OID for large object"); WriteInt(AH, oid); @@ -436,7 +436,7 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te) if (ctx->hasSeek) { if (fseeko(AH->FH, ctx->lastFilePos, SEEK_SET) != 0) - fatal("error during file seek: %m"); + pg_fatal("error during file seek: %m"); } for (;;) @@ -492,8 +492,8 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te) break; default: /* Always have a default */ - fatal("unrecognized data block type (%d) while searching archive", - blkType); + pg_fatal("unrecognized data block type (%d) while searching archive", + blkType); break; } } @@ -502,7 +502,7 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te) { /* We can just seek to the place we need to be. */ if (fseeko(AH->FH, tctx->dataPos, SEEK_SET) != 0) - fatal("error during file seek: %m"); + pg_fatal("error during file seek: %m"); _readBlockHeader(AH, &blkType, &id); } @@ -514,20 +514,20 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te) if (blkType == EOF) { if (!ctx->hasSeek) - fatal("could not find block ID %d in archive -- " - "possibly due to out-of-order restore request, " - "which cannot be handled due to non-seekable input file", - te->dumpId); + pg_fatal("could not find block ID %d in archive -- " + "possibly due to out-of-order restore request, " + "which cannot be handled due to non-seekable input file", + te->dumpId); else - fatal("could not find block ID %d in archive -- " - "possibly corrupt archive", - te->dumpId); + pg_fatal("could not find block ID %d in archive -- " + "possibly corrupt archive", + te->dumpId); } /* Are we sane? */ if (id != te->dumpId) - fatal("found unexpected block ID (%d) when reading data -- expected %d", - id, te->dumpId); + pg_fatal("found unexpected block ID (%d) when reading data -- expected %d", + id, te->dumpId); switch (blkType) { @@ -540,8 +540,8 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te) break; default: /* Always have a default */ - fatal("unrecognized data block type %d while restoring archive", - blkType); + pg_fatal("unrecognized data block type %d while restoring archive", + blkType); break; } @@ -626,7 +626,7 @@ _skipData(ArchiveHandle *AH) if (ctx->hasSeek) { if (fseeko(AH->FH, blkLen, SEEK_CUR) != 0) - fatal("error during file seek: %m"); + pg_fatal("error during file seek: %m"); } else { @@ -640,9 +640,9 @@ _skipData(ArchiveHandle *AH) if (fread(buf, 1, blkLen, AH->FH) != blkLen) { if (feof(AH->FH)) - fatal("could not read from input file: end of file"); + pg_fatal("could not read from input file: end of file"); else - fatal("could not read from input file: %m"); + pg_fatal("could not read from input file: %m"); } } @@ -743,7 +743,7 @@ _CloseArchive(ArchiveHandle *AH) /* Remember TOC's seek position for use below */ tpos = ftello(AH->FH); if (tpos < 0 && ctx->hasSeek) - fatal("could not determine seek position in archive file: %m"); + pg_fatal("could not determine seek position in archive file: %m"); WriteToc(AH); WriteDataChunks(AH, NULL); @@ -759,7 +759,7 @@ _CloseArchive(ArchiveHandle *AH) } if (fclose(AH->FH) != 0) - fatal("could not close archive file: %m"); + pg_fatal("could not close archive file: %m"); /* Sync the output file if one is defined */ if (AH->dosync && AH->mode == archModeWrite && AH->fSpec) @@ -782,32 +782,32 @@ _ReopenArchive(ArchiveHandle *AH) pgoff_t tpos; if (AH->mode == archModeWrite) - fatal("can only reopen input archives"); + pg_fatal("can only reopen input archives"); /* * These two cases are user-facing errors since they represent unsupported * (but not invalid) use-cases. Word the error messages appropriately. */ if (AH->fSpec == NULL || strcmp(AH->fSpec, "") == 0) - fatal("parallel restore from standard input is not supported"); + pg_fatal("parallel restore from standard input is not supported"); if (!ctx->hasSeek) - fatal("parallel restore from non-seekable file is not supported"); + pg_fatal("parallel restore from non-seekable file is not supported"); tpos = ftello(AH->FH); if (tpos < 0) - fatal("could not determine seek position in archive file: %m"); + pg_fatal("could not determine seek position in archive file: %m"); #ifndef WIN32 if (fclose(AH->FH) != 0) - fatal("could not close archive file: %m"); + pg_fatal("could not close archive file: %m"); #endif AH->FH = fopen(AH->fSpec, PG_BINARY_R); if (!AH->FH) - fatal("could not open input file \"%s\": %m", AH->fSpec); + pg_fatal("could not open input file \"%s\": %m", AH->fSpec); if (fseeko(AH->FH, tpos, SEEK_SET) != 0) - fatal("could not set seek position in archive file: %m"); + pg_fatal("could not set seek position in archive file: %m"); } /* @@ -862,7 +862,7 @@ _PrepParallelRestore(ArchiveHandle *AH) pgoff_t endpos; if (fseeko(AH->FH, 0, SEEK_END) != 0) - fatal("error during file seek: %m"); + pg_fatal("error during file seek: %m"); endpos = ftello(AH->FH); if (endpos > prev_tctx->dataPos) prev_te->dataLength = endpos - prev_tctx->dataPos; @@ -886,7 +886,7 @@ _Clone(ArchiveHandle *AH) /* sanity check, shouldn't happen */ if (ctx->cs != NULL) - fatal("compressor active"); + pg_fatal("compressor active"); /* * We intentionally do not clone TOC-entry-local state: it's useful to @@ -940,7 +940,7 @@ _getFilePos(ArchiveHandle *AH, lclContext *ctx) { /* Not expected if we found we can seek. */ if (ctx->hasSeek) - fatal("could not determine seek position in archive file: %m"); + pg_fatal("could not determine seek position in archive file: %m"); } return pos; } @@ -956,7 +956,7 @@ _readBlockHeader(ArchiveHandle *AH, int *type, int *id) int byt; /* - * Note: if we are at EOF with a pre-1.3 input file, we'll fatal() inside + * Note: if we are at EOF with a pre-1.3 input file, we'll pg_fatal() inside * ReadInt rather than returning EOF. It doesn't seem worth jumping * through hoops to deal with that case better, because no such files are * likely to exist in the wild: only some 7.1 development versions of diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c index 3184eda3e7..89cdbf80e0 100644 --- a/src/bin/pg_dump/pg_backup_db.c +++ b/src/bin/pg_dump/pg_backup_db.c @@ -39,7 +39,7 @@ _check_database_version(ArchiveHandle *AH) remoteversion_str = PQparameterStatus(AH->connection, "server_version"); remoteversion = PQserverVersion(AH->connection); if (remoteversion == 0 || !remoteversion_str) - fatal("could not get server_version from libpq"); + pg_fatal("could not get server_version from libpq"); AH->public.remoteVersionStr = pg_strdup(remoteversion_str); AH->public.remoteVersion = remoteversion; @@ -50,9 +50,10 @@ _check_database_version(ArchiveHandle *AH) && (remoteversion < AH->public.minRemoteVersion || remoteversion > AH->public.maxRemoteVersion)) { - pg_log_error("server version: %s; %s version: %s", - remoteversion_str, progname, PG_VERSION); - fatal("aborting because of server version mismatch"); + pg_log_error("aborting because of server version mismatch"); + pg_log_error_detail("server version: %s; %s version: %s", + remoteversion_str, progname, PG_VERSION); + exit(1); } /* @@ -116,7 +117,7 @@ ConnectDatabase(Archive *AHX, bool new_pass; if (AH->connection) - fatal("already connected to a database"); + pg_fatal("already connected to a database"); /* Never prompt for a password during a reconnection */ prompt_password = isReconnect ? TRI_NO : cparams->promptPassword; @@ -166,7 +167,7 @@ ConnectDatabase(Archive *AHX, AH->connection = PQconnectdbParams(keywords, values, true); if (!AH->connection) - fatal("could not connect to database"); + pg_fatal("could not connect to database"); if (PQstatus(AH->connection) == CONNECTION_BAD && PQconnectionNeedsPassword(AH->connection) && @@ -183,11 +184,11 @@ ConnectDatabase(Archive *AHX, if (PQstatus(AH->connection) == CONNECTION_BAD) { if (isReconnect) - fatal("reconnection failed: %s", - PQerrorMessage(AH->connection)); + pg_fatal("reconnection failed: %s", + PQerrorMessage(AH->connection)); else - fatal("%s", - PQerrorMessage(AH->connection)); + pg_fatal("%s", + PQerrorMessage(AH->connection)); } /* Start strict; later phases may override this. */ @@ -235,7 +236,7 @@ DisconnectDatabase(Archive *AHX) /* * If we have an active query, send a cancel before closing, ignoring * any errors. This is of no use for a normal exit, but might be - * helpful during fatal(). + * helpful during pg_fatal(). */ if (PQtransactionStatus(AH->connection) == PQTRANS_ACTIVE) (void) PQcancel(AH->connCancel, errbuf, sizeof(errbuf)); @@ -261,16 +262,17 @@ GetConnection(Archive *AHX) static void notice_processor(void *arg, const char *message) { - pg_log_generic(PG_LOG_INFO, "%s", message); + pg_log_info("%s", message); } -/* Like fatal(), but with a complaint about a particular query. */ +/* Like pg_fatal(), but with a complaint about a particular query. */ static void die_on_query_failure(ArchiveHandle *AH, const char *query) { pg_log_error("query failed: %s", PQerrorMessage(AH->connection)); - fatal("query was: %s", query); + pg_log_error_detail("Query was: %s", query); + exit(1); } void @@ -311,10 +313,10 @@ ExecuteSqlQueryForSingleRow(Archive *fout, const char *query) /* Expecting a single result only */ ntups = PQntuples(res); if (ntups != 1) - fatal(ngettext("query returned %d row instead of one: %s", - "query returned %d rows instead of one: %s", - ntups), - ntups, query); + pg_fatal(ngettext("query returned %d row instead of one: %s", + "query returned %d rows instead of one: %s", + ntups), + ntups, query); return res; } @@ -456,8 +458,8 @@ ExecuteSqlCommandBuf(Archive *AHX, const char *buf, size_t bufLen) */ if (AH->pgCopyIn && PQputCopyData(AH->connection, buf, bufLen) <= 0) - fatal("error returned by PQputCopyData: %s", - PQerrorMessage(AH->connection)); + pg_fatal("error returned by PQputCopyData: %s", + PQerrorMessage(AH->connection)); } else if (AH->outputKind == OUTPUT_OTHERDATA) { @@ -505,8 +507,8 @@ EndDBCopyMode(Archive *AHX, const char *tocEntryTag) PGresult *res; if (PQputCopyEnd(AH->connection, NULL) <= 0) - fatal("error returned by PQputCopyEnd: %s", - PQerrorMessage(AH->connection)); + pg_fatal("error returned by PQputCopyEnd: %s", + PQerrorMessage(AH->connection)); /* Check command status and return to normal libpq state */ res = PQgetResult(AH->connection); diff --git a/src/bin/pg_dump/pg_backup_directory.c b/src/bin/pg_dump/pg_backup_directory.c index 7f4e340dea..3f46f7988a 100644 --- a/src/bin/pg_dump/pg_backup_directory.c +++ b/src/bin/pg_dump/pg_backup_directory.c @@ -153,7 +153,7 @@ InitArchiveFmt_Directory(ArchiveHandle *AH) */ if (!AH->fSpec || strcmp(AH->fSpec, "") == 0) - fatal("no output directory specified"); + pg_fatal("no output directory specified"); ctx->directory = AH->fSpec; @@ -182,18 +182,18 @@ InitArchiveFmt_Directory(ArchiveHandle *AH) } if (errno) - fatal("could not read directory \"%s\": %m", - ctx->directory); + pg_fatal("could not read directory \"%s\": %m", + ctx->directory); if (closedir(dir)) - fatal("could not close directory \"%s\": %m", - ctx->directory); + pg_fatal("could not close directory \"%s\": %m", + ctx->directory); } } if (!is_empty && mkdir(ctx->directory, 0700) < 0) - fatal("could not create directory \"%s\": %m", - ctx->directory); + pg_fatal("could not create directory \"%s\": %m", + ctx->directory); } else { /* Read Mode */ @@ -204,7 +204,7 @@ InitArchiveFmt_Directory(ArchiveHandle *AH) tocFH = cfopen_read(fname, PG_BINARY_R); if (tocFH == NULL) - fatal("could not open input file \"%s\": %m", fname); + pg_fatal("could not open input file \"%s\": %m", fname); ctx->dataFH = tocFH; @@ -219,7 +219,7 @@ InitArchiveFmt_Directory(ArchiveHandle *AH) /* Nothing else in the file, so close it again... */ if (cfclose(tocFH) != 0) - fatal("could not close TOC file: %m"); + pg_fatal("could not close TOC file: %m"); ctx->dataFH = NULL; } } @@ -329,7 +329,7 @@ _StartData(ArchiveHandle *AH, TocEntry *te) ctx->dataFH = cfopen_write(fname, PG_BINARY_W, AH->compression); if (ctx->dataFH == NULL) - fatal("could not open output file \"%s\": %m", fname); + pg_fatal("could not open output file \"%s\": %m", fname); } /* @@ -352,8 +352,8 @@ _WriteData(ArchiveHandle *AH, const void *data, size_t dLen) /* if write didn't set errno, assume problem is no disk space */ if (errno == 0) errno = ENOSPC; - fatal("could not write to output file: %s", - get_cfp_error(ctx->dataFH)); + pg_fatal("could not write to output file: %s", + get_cfp_error(ctx->dataFH)); } } @@ -370,7 +370,7 @@ _EndData(ArchiveHandle *AH, TocEntry *te) /* Close the file */ if (cfclose(ctx->dataFH) != 0) - fatal("could not close data file: %m"); + pg_fatal("could not close data file: %m"); ctx->dataFH = NULL; } @@ -392,7 +392,7 @@ _PrintFileData(ArchiveHandle *AH, char *filename) cfp = cfopen_read(filename, PG_BINARY_R); if (!cfp) - fatal("could not open input file \"%s\": %m", filename); + pg_fatal("could not open input file \"%s\": %m", filename); buf = pg_malloc(ZLIB_OUT_SIZE); buflen = ZLIB_OUT_SIZE; @@ -404,7 +404,7 @@ _PrintFileData(ArchiveHandle *AH, char *filename) free(buf); if (cfclose(cfp) != 0) - fatal("could not close data file \"%s\": %m", filename); + pg_fatal("could not close data file \"%s\": %m", filename); } /* @@ -444,8 +444,8 @@ _LoadBlobs(ArchiveHandle *AH) ctx->blobsTocFH = cfopen_read(tocfname, PG_BINARY_R); if (ctx->blobsTocFH == NULL) - fatal("could not open large object TOC file \"%s\" for input: %m", - tocfname); + pg_fatal("could not open large object TOC file \"%s\" for input: %m", + tocfname); /* Read the blobs TOC file line-by-line, and process each blob */ while ((cfgets(ctx->blobsTocFH, line, MAXPGPATH)) != NULL) @@ -455,8 +455,8 @@ _LoadBlobs(ArchiveHandle *AH) /* Can't overflow because line and blobfname are the same length */ if (sscanf(line, "%u %" CppAsString2(MAXPGPATH) "s\n", &oid, blobfname) != 2) - fatal("invalid line in large object TOC file \"%s\": \"%s\"", - tocfname, line); + pg_fatal("invalid line in large object TOC file \"%s\": \"%s\"", + tocfname, line); StartRestoreBlob(AH, oid, AH->public.ropt->dropSchema); snprintf(path, MAXPGPATH, "%s/%s", ctx->directory, blobfname); @@ -464,12 +464,12 @@ _LoadBlobs(ArchiveHandle *AH) EndRestoreBlob(AH, oid); } if (!cfeof(ctx->blobsTocFH)) - fatal("error reading large object TOC file \"%s\"", - tocfname); + pg_fatal("error reading large object TOC file \"%s\"", + tocfname); if (cfclose(ctx->blobsTocFH) != 0) - fatal("could not close large object TOC file \"%s\": %m", - tocfname); + pg_fatal("could not close large object TOC file \"%s\": %m", + tocfname); ctx->blobsTocFH = NULL; @@ -494,8 +494,8 @@ _WriteByte(ArchiveHandle *AH, const int i) /* if write didn't set errno, assume problem is no disk space */ if (errno == 0) errno = ENOSPC; - fatal("could not write to output file: %s", - get_cfp_error(ctx->dataFH)); + pg_fatal("could not write to output file: %s", + get_cfp_error(ctx->dataFH)); } return 1; @@ -530,8 +530,8 @@ _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len) /* if write didn't set errno, assume problem is no disk space */ if (errno == 0) errno = ENOSPC; - fatal("could not write to output file: %s", - get_cfp_error(ctx->dataFH)); + pg_fatal("could not write to output file: %s", + get_cfp_error(ctx->dataFH)); } } @@ -550,7 +550,7 @@ _ReadBuf(ArchiveHandle *AH, void *buf, size_t len) * exit on short reads. */ if (cfread(buf, len, ctx->dataFH) != len) - fatal("could not read from input file: end of file"); + pg_fatal("could not read from input file: end of file"); } /* @@ -583,7 +583,7 @@ _CloseArchive(ArchiveHandle *AH) /* The TOC is always created uncompressed */ tocFH = cfopen_write(fname, PG_BINARY_W, 0); if (tocFH == NULL) - fatal("could not open output file \"%s\": %m", fname); + pg_fatal("could not open output file \"%s\": %m", fname); ctx->dataFH = tocFH; /* @@ -596,7 +596,7 @@ _CloseArchive(ArchiveHandle *AH) AH->format = archDirectory; WriteToc(AH); if (cfclose(tocFH) != 0) - fatal("could not close TOC file: %m"); + pg_fatal("could not close TOC file: %m"); WriteDataChunks(AH, ctx->pstate); ParallelBackupEnd(AH, ctx->pstate); @@ -646,7 +646,7 @@ _StartBlobs(ArchiveHandle *AH, TocEntry *te) /* The blob TOC file is never compressed */ ctx->blobsTocFH = cfopen_write(fname, "ab", 0); if (ctx->blobsTocFH == NULL) - fatal("could not open output file \"%s\": %m", fname); + pg_fatal("could not open output file \"%s\": %m", fname); } /* @@ -665,7 +665,7 @@ _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid) ctx->dataFH = cfopen_write(fname, PG_BINARY_W, AH->compression); if (ctx->dataFH == NULL) - fatal("could not open output file \"%s\": %m", fname); + pg_fatal("could not open output file \"%s\": %m", fname); } /* @@ -682,13 +682,13 @@ _EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid) /* Close the BLOB data file itself */ if (cfclose(ctx->dataFH) != 0) - fatal("could not close blob data file: %m"); + pg_fatal("could not close blob data file: %m"); ctx->dataFH = NULL; /* register the blob in blobs.toc */ len = snprintf(buf, sizeof(buf), "%u blob_%u.dat\n", oid, oid); if (cfwrite(buf, len, ctx->blobsTocFH) != len) - fatal("could not write to blobs TOC file"); + pg_fatal("could not write to blobs TOC file"); } /* @@ -702,7 +702,7 @@ _EndBlobs(ArchiveHandle *AH, TocEntry *te) lclContext *ctx = (lclContext *) AH->formatData; if (cfclose(ctx->blobsTocFH) != 0) - fatal("could not close blobs TOC file: %m"); + pg_fatal("could not close blobs TOC file: %m"); ctx->blobsTocFH = NULL; } @@ -721,7 +721,7 @@ setFilePath(ArchiveHandle *AH, char *buf, const char *relativeFilename) dname = ctx->directory; if (strlen(dname) + 1 + strlen(relativeFilename) + 1 > MAXPGPATH) - fatal("file name too long: \"%s\"", dname); + pg_fatal("file name too long: \"%s\"", dname); strcpy(buf, dname); strcat(buf, "/"); diff --git a/src/bin/pg_dump/pg_backup_null.c b/src/bin/pg_dump/pg_backup_null.c index 0458979f3c..541306d991 100644 --- a/src/bin/pg_dump/pg_backup_null.c +++ b/src/bin/pg_dump/pg_backup_null.c @@ -71,7 +71,7 @@ InitArchiveFmt_Null(ArchiveHandle *AH) * Now prevent reading... */ if (AH->mode == archModeRead) - fatal("this format cannot be read"); + pg_fatal("this format cannot be read"); } /* @@ -144,7 +144,7 @@ _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid) bool old_blob_style = (AH->version < K_VERS_1_12); if (oid == 0) - fatal("invalid OID for large object"); + pg_fatal("invalid OID for large object"); /* With an old archive we must do drop and create logic here */ if (old_blob_style && AH->public.ropt->dropSchema) diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c index 2491a091b9..39d71badb7 100644 --- a/src/bin/pg_dump/pg_backup_tar.c +++ b/src/bin/pg_dump/pg_backup_tar.c @@ -169,14 +169,14 @@ InitArchiveFmt_Tar(ArchiveHandle *AH) { ctx->tarFH = fopen(AH->fSpec, PG_BINARY_W); if (ctx->tarFH == NULL) - fatal("could not open TOC file \"%s\" for output: %m", - AH->fSpec); + pg_fatal("could not open TOC file \"%s\" for output: %m", + AH->fSpec); } else { ctx->tarFH = stdout; if (ctx->tarFH == NULL) - fatal("could not open TOC file for output: %m"); + pg_fatal("could not open TOC file for output: %m"); } ctx->tarFHpos = 0; @@ -195,7 +195,7 @@ InitArchiveFmt_Tar(ArchiveHandle *AH) * positioning. */ if (AH->compression != 0) - fatal("compression is not supported by tar archive format"); + pg_fatal("compression is not supported by tar archive format"); } else { /* Read Mode */ @@ -203,14 +203,14 @@ InitArchiveFmt_Tar(ArchiveHandle *AH) { ctx->tarFH = fopen(AH->fSpec, PG_BINARY_R); if (ctx->tarFH == NULL) - fatal("could not open TOC file \"%s\" for input: %m", - AH->fSpec); + pg_fatal("could not open TOC file \"%s\" for input: %m", + AH->fSpec); } else { ctx->tarFH = stdin; if (ctx->tarFH == NULL) - fatal("could not open TOC file for input: %m"); + pg_fatal("could not open TOC file for input: %m"); } /* @@ -319,7 +319,7 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode) * Couldn't find the requested file. Future: do SEEK(0) and * retry. */ - fatal("could not find file \"%s\" in archive", filename); + pg_fatal("could not find file \"%s\" in archive", filename); } else { @@ -331,7 +331,7 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode) if (AH->compression == 0) tm->nFH = ctx->tarFH; else - fatal("compression is not supported by tar archive format"); + pg_fatal("compression is not supported by tar archive format"); } else { @@ -379,14 +379,14 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode) #endif if (tm->tmpFH == NULL) - fatal("could not generate temporary file name: %m"); + pg_fatal("could not generate temporary file name: %m"); umask(old_umask); if (AH->compression == 0) tm->nFH = tm->tmpFH; else - fatal("compression is not supported by tar archive format"); + pg_fatal("compression is not supported by tar archive format"); tm->AH = AH; tm->targetFile = pg_strdup(filename); @@ -402,7 +402,7 @@ static void tarClose(ArchiveHandle *AH, TAR_MEMBER *th) { if (AH->compression != 0) - fatal("compression is not supported by tar archive format"); + pg_fatal("compression is not supported by tar archive format"); if (th->mode == 'w') _tarAddFile(AH, th); /* This will close the temp file */ @@ -621,8 +621,8 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te) pos1 = (int) strlen(te->copyStmt) - 13; if (pos1 < 6 || strncmp(te->copyStmt, "COPY ", 5) != 0 || strcmp(te->copyStmt + pos1, " FROM stdin;\n") != 0) - fatal("unexpected COPY statement syntax: \"%s\"", - te->copyStmt); + pg_fatal("unexpected COPY statement syntax: \"%s\"", + te->copyStmt); /* Emit all but the FROM part ... */ ahwrite(te->copyStmt, 1, pos1, AH); @@ -723,7 +723,7 @@ _ReadByte(ArchiveHandle *AH) res = tarRead(&c, 1, ctx->FH); if (res != 1) /* We already would have exited for errors on reads, must be EOF */ - fatal("could not read from input file: end of file"); + pg_fatal("could not read from input file: end of file"); ctx->filePos += 1; return c; } @@ -746,7 +746,7 @@ _ReadBuf(ArchiveHandle *AH, void *buf, size_t len) if (tarRead(buf, len, ctx->FH) != len) /* We already would have exited for errors on reads, must be EOF */ - fatal("could not read from input file: end of file"); + pg_fatal("could not read from input file: end of file"); ctx->filePos += len; } @@ -887,10 +887,10 @@ _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid) char fname[255]; if (oid == 0) - fatal("invalid OID for large object (%u)", oid); + pg_fatal("invalid OID for large object (%u)", oid); if (AH->compression != 0) - fatal("compression is not supported by tar archive format"); + pg_fatal("compression is not supported by tar archive format"); sprintf(fname, "blob_%u.dat", oid); @@ -1013,12 +1013,12 @@ _tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th) * Find file len & go back to start. */ if (fseeko(tmp, 0, SEEK_END) != 0) - fatal("error during file seek: %m"); + pg_fatal("error during file seek: %m"); th->fileLen = ftello(tmp); if (th->fileLen < 0) - fatal("could not determine seek position in archive file: %m"); + pg_fatal("could not determine seek position in archive file: %m"); if (fseeko(tmp, 0, SEEK_SET) != 0) - fatal("error during file seek: %m"); + pg_fatal("error during file seek: %m"); _tarWriteHeader(th); @@ -1032,11 +1032,11 @@ _tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th) READ_ERROR_EXIT(tmp); if (fclose(tmp) != 0) /* This *should* delete it... */ - fatal("could not close temporary file: %m"); + pg_fatal("could not close temporary file: %m"); if (len != th->fileLen) - fatal("actual file length (%lld) does not match expected (%lld)", - (long long) len, (long long) th->fileLen); + pg_fatal("actual file length (%lld) does not match expected (%lld)", + (long long) len, (long long) th->fileLen); pad = tarPaddingBytesRequired(len); for (i = 0; i < pad; i++) @@ -1081,7 +1081,7 @@ _tarPositionTo(ArchiveHandle *AH, const char *filename) if (!_tarGetHeader(AH, th)) { if (filename) - fatal("could not find header for file \"%s\" in tar archive", filename); + pg_fatal("could not find header for file \"%s\" in tar archive", filename); else { /* @@ -1099,9 +1099,9 @@ _tarPositionTo(ArchiveHandle *AH, const char *filename) id = atoi(th->targetFile); if ((TocIDRequired(AH, id) & REQ_DATA) != 0) - fatal("restoring data out of order is not supported in this archive format: " - "\"%s\" is required, but comes before \"%s\" in the archive file.", - th->targetFile, filename); + pg_fatal("restoring data out of order is not supported in this archive format: " + "\"%s\" is required, but comes before \"%s\" in the archive file.", + th->targetFile, filename); /* Header doesn't match, so read to next header */ len = th->fileLen; @@ -1112,7 +1112,7 @@ _tarPositionTo(ArchiveHandle *AH, const char *filename) _tarReadRaw(AH, &header[0], TAR_BLOCK_SIZE, NULL, ctx->tarFH); if (!_tarGetHeader(AH, th)) - fatal("could not find header for file \"%s\" in tar archive", filename); + pg_fatal("could not find header for file \"%s\" in tar archive", filename); } ctx->tarNextMember = ctx->tarFHpos + th->fileLen @@ -1146,10 +1146,10 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th) return 0; if (len != TAR_BLOCK_SIZE) - fatal(ngettext("incomplete tar header found (%lu byte)", - "incomplete tar header found (%lu bytes)", - len), - (unsigned long) len); + pg_fatal(ngettext("incomplete tar header found (%lu byte)", + "incomplete tar header found (%lu bytes)", + len), + (unsigned long) len); /* Calc checksum */ chk = tarChecksum(h); @@ -1185,8 +1185,8 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th) tag, (unsigned long long) hPos, (unsigned long long) len, sum); if (chk != sum) - fatal("corrupt tar header found in %s (expected %d, computed %d) file position %llu", - tag, sum, chk, (unsigned long long) ftello(ctx->tarFH)); + pg_fatal("corrupt tar header found in %s (expected %d, computed %d) file position %llu", + tag, sum, chk, (unsigned long long) ftello(ctx->tarFH)); th->targetFile = pg_strdup(tag); th->fileLen = len; diff --git a/src/bin/pg_dump/pg_backup_utils.c b/src/bin/pg_dump/pg_backup_utils.c index 57140a5504..e40890cb26 100644 --- a/src/bin/pg_dump/pg_backup_utils.c +++ b/src/bin/pg_dump/pg_backup_utils.c @@ -52,8 +52,7 @@ set_dump_section(const char *arg, int *dumpSections) else { pg_log_error("unrecognized section name: \"%s\"", arg); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } } @@ -64,10 +63,7 @@ void on_exit_nicely(on_exit_nicely_callback function, void *arg) { if (on_exit_nicely_index >= MAX_ON_EXIT_NICELY) - { - pg_log_fatal("out of on_exit_nicely slots"); - exit_nicely(1); - } + pg_fatal("out of on_exit_nicely slots"); on_exit_nicely_list[on_exit_nicely_index].function = function; on_exit_nicely_list[on_exit_nicely_index].arg = arg; on_exit_nicely_index++; diff --git a/src/bin/pg_dump/pg_backup_utils.h b/src/bin/pg_dump/pg_backup_utils.h index 6ebc3afee4..5b1c51554d 100644 --- a/src/bin/pg_dump/pg_backup_utils.h +++ b/src/bin/pg_dump/pg_backup_utils.h @@ -31,6 +31,12 @@ extern void set_dump_section(const char *arg, int *dumpSections); extern void on_exit_nicely(on_exit_nicely_callback function, void *arg); extern void exit_nicely(int code) pg_attribute_noreturn(); -#define fatal(...) do { pg_log_error(__VA_ARGS__); exit_nicely(1); } while(0) +/* In pg_dump, we modify pg_fatal to call exit_nicely instead of exit */ +#undef pg_fatal +#define pg_fatal(...) do { \ + if (likely(__pg_log_level <= PG_LOG_ERROR)) \ + pg_log_generic(PG_LOG_ERROR, PG_LOG_PRIMARY, __VA_ARGS__); \ + exit_nicely(1); \ + } while(0) #endif /* PG_BACKUP_UTILS_H */ diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 196f6d23a3..969e2a7a46 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -620,7 +620,8 @@ main(int argc, char **argv) break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } } @@ -637,8 +638,7 @@ main(int argc, char **argv) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } @@ -655,32 +655,26 @@ main(int argc, char **argv) dopt.sequence_data = 1; if (dopt.dataOnly && dopt.schemaOnly) - { - pg_log_error("options -s/--schema-only and -a/--data-only cannot be used together"); - exit_nicely(1); - } + pg_fatal("options -s/--schema-only and -a/--data-only cannot be used together"); if (dopt.schemaOnly && foreign_servers_include_patterns.head != NULL) - fatal("options -s/--schema-only and --include-foreign-data cannot be used together"); + pg_fatal("options -s/--schema-only and --include-foreign-data cannot be used together"); if (numWorkers > 1 && foreign_servers_include_patterns.head != NULL) - fatal("option --include-foreign-data is not supported with parallel backup"); + pg_fatal("option --include-foreign-data is not supported with parallel backup"); if (dopt.dataOnly && dopt.outputClean) - { - pg_log_error("options -c/--clean and -a/--data-only cannot be used together"); - exit_nicely(1); - } + pg_fatal("options -c/--clean and -a/--data-only cannot be used together"); if (dopt.if_exists && !dopt.outputClean) - fatal("option --if-exists requires option -c/--clean"); + pg_fatal("option --if-exists requires option -c/--clean"); /* * --inserts are already implied above if --column-inserts or * --rows-per-insert were specified. */ if (dopt.do_nothing && dopt.dump_inserts == 0) - fatal("option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"); + pg_fatal("option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"); /* Identify archive format to emit */ archiveFormat = parseArchiveFormat(format, &archiveMode); @@ -715,7 +709,7 @@ main(int argc, char **argv) /* Parallel backup only in the directory archive format so far */ if (archiveFormat != archDirectory && numWorkers > 1) - fatal("parallel backup only supported by the directory format"); + pg_fatal("parallel backup only supported by the directory format"); /* Open the output file */ fout = CreateArchive(filename, archiveFormat, compressLevel, dosync, @@ -770,7 +764,7 @@ main(int argc, char **argv) &schema_include_oids, strict_names); if (schema_include_oids.head == NULL) - fatal("no matching schemas were found"); + pg_fatal("no matching schemas were found"); } expand_schema_name_patterns(fout, &schema_exclude_patterns, &schema_exclude_oids, @@ -784,7 +778,7 @@ main(int argc, char **argv) &table_include_oids, strict_names); if (table_include_oids.head == NULL) - fatal("no matching tables were found"); + pg_fatal("no matching tables were found"); } expand_table_name_patterns(fout, &table_exclude_patterns, &table_exclude_oids, @@ -806,7 +800,7 @@ main(int argc, char **argv) &extension_include_oids, strict_names); if (extension_include_oids.head == NULL) - fatal("no matching extensions were found"); + pg_fatal("no matching extensions were found"); } /* @@ -1087,8 +1081,8 @@ setup_connection(Archive *AH, const char *dumpencoding, if (dumpencoding) { if (PQsetClientEncoding(conn, dumpencoding) < 0) - fatal("invalid client encoding \"%s\" specified", - dumpencoding); + pg_fatal("invalid client encoding \"%s\" specified", + dumpencoding); } /* @@ -1225,7 +1219,7 @@ setup_connection(Archive *AH, const char *dumpencoding, else if (AH->numWorkers > 1) { if (AH->isStandby && AH->remoteVersion < 100000) - fatal("parallel dumps from standby servers are not supported by this server version"); + pg_fatal("parallel dumps from standby servers are not supported by this server version"); AH->sync_snapshot_id = get_synchronized_snapshot(AH); } } @@ -1290,7 +1284,7 @@ parseArchiveFormat(const char *format, ArchiveMode *mode) else if (pg_strcasecmp(format, "tar") == 0) archiveFormat = archTar; else - fatal("invalid output format \"%s\" specified", format); + pg_fatal("invalid output format \"%s\" specified", format); return archiveFormat; } @@ -1328,7 +1322,7 @@ expand_schema_name_patterns(Archive *fout, res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); if (strict_names && PQntuples(res) == 0) - fatal("no matching schemas were found for pattern \"%s\"", cell->val); + pg_fatal("no matching schemas were found for pattern \"%s\"", cell->val); for (i = 0; i < PQntuples(res); i++) { @@ -1375,7 +1369,7 @@ expand_extension_name_patterns(Archive *fout, res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); if (strict_names && PQntuples(res) == 0) - fatal("no matching extensions were found for pattern \"%s\"", cell->val); + pg_fatal("no matching extensions were found for pattern \"%s\"", cell->val); for (i = 0; i < PQntuples(res); i++) { @@ -1422,7 +1416,7 @@ expand_foreign_server_name_patterns(Archive *fout, res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); if (PQntuples(res) == 0) - fatal("no matching foreign servers were found for pattern \"%s\"", cell->val); + pg_fatal("no matching foreign servers were found for pattern \"%s\"", cell->val); for (i = 0; i < PQntuples(res); i++) simple_oid_list_append(oids, atooid(PQgetvalue(res, i, 0))); @@ -1485,7 +1479,7 @@ expand_table_name_patterns(Archive *fout, PQclear(ExecuteSqlQueryForSingleRow(fout, ALWAYS_SECURE_SEARCH_PATH_SQL)); if (strict_names && PQntuples(res) == 0) - fatal("no matching tables were found for pattern \"%s\"", cell->val); + pg_fatal("no matching tables were found for pattern \"%s\"", cell->val); for (i = 0; i < PQntuples(res); i++) { @@ -2033,8 +2027,8 @@ dumpTableData_copy(Archive *fout, const void *dcontext) { /* copy data transfer failed */ pg_log_error("Dumping the contents of table \"%s\" failed: PQgetCopyData() failed.", classname); - pg_log_error("Error message from server: %s", PQerrorMessage(conn)); - pg_log_error("The command was: %s", q->data); + pg_log_error_detail("Error message from server: %s", PQerrorMessage(conn)); + pg_log_error_detail("Command was: %s", q->data); exit_nicely(1); } @@ -2043,8 +2037,8 @@ dumpTableData_copy(Archive *fout, const void *dcontext) if (PQresultStatus(res) != PGRES_COMMAND_OK) { pg_log_error("Dumping the contents of table \"%s\" failed: PQgetResult() failed.", classname); - pg_log_error("Error message from server: %s", PQerrorMessage(conn)); - pg_log_error("The command was: %s", q->data); + pg_log_error_detail("Error message from server: %s", PQerrorMessage(conn)); + pg_log_error_detail("Command was: %s", q->data); exit_nicely(1); } PQclear(res); @@ -2124,8 +2118,8 @@ dumpTableData_insert(Archive *fout, const void *dcontext) /* cross-check field count, allowing for dummy NULL if any */ if (nfields != PQnfields(res) && !(nfields == 0 && PQnfields(res) == 1)) - fatal("wrong number of fields retrieved from table \"%s\"", - tbinfo->dobj.name); + pg_fatal("wrong number of fields retrieved from table \"%s\"", + tbinfo->dobj.name); /* * First time through, we build as much of the INSERT statement as @@ -2877,8 +2871,8 @@ dumpDatabase(Archive *fout) else if (datlocprovider[0] == 'i') appendPQExpBufferStr(creaQry, "icu"); else - fatal("unrecognized locale provider: %s", - datlocprovider); + pg_fatal("unrecognized locale provider: %s", + datlocprovider); if (strlen(collate) > 0 && strcmp(collate, ctype) == 0) { @@ -3257,7 +3251,7 @@ dumpSearchPath(Archive *AH) "SELECT pg_catalog.current_schemas(false)"); if (!parsePGArray(PQgetvalue(res, 0, 0), &schemanames, &nschemanames)) - fatal("could not parse result of current_schemas()"); + pg_fatal("could not parse result of current_schemas()"); /* * We use set_config(), not a simple "SET search_path" command, because @@ -3483,8 +3477,8 @@ dumpBlobs(Archive *fout, const void *arg) /* Open the BLOB */ loFd = lo_open(conn, blobOid, INV_READ); if (loFd == -1) - fatal("could not open large object %u: %s", - blobOid, PQerrorMessage(conn)); + pg_fatal("could not open large object %u: %s", + blobOid, PQerrorMessage(conn)); StartBlob(fout, blobOid); @@ -3493,8 +3487,8 @@ dumpBlobs(Archive *fout, const void *arg) { cnt = lo_read(conn, loFd, buf, LOBBUFSIZE); if (cnt < 0) - fatal("error reading large object %u: %s", - blobOid, PQerrorMessage(conn)); + pg_fatal("error reading large object %u: %s", + blobOid, PQerrorMessage(conn)); WriteData(fout, buf, cnt); } while (cnt > 0); @@ -3740,11 +3734,8 @@ dumpPolicy(Archive *fout, const PolicyInfo *polinfo) else if (polinfo->polcmd == 'd') cmd = " FOR DELETE"; else - { - pg_log_error("unexpected policy command type: %c", - polinfo->polcmd); - exit_nicely(1); - } + pg_fatal("unexpected policy command type: %c", + polinfo->polcmd); query = createPQExpBuffer(); delqry = createPQExpBuffer(); @@ -4193,7 +4184,7 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables) if (!parsePGArray(PQgetvalue(res, i, i_prattrs), &attnames, &nattnames)) - fatal("could not parse %s array", "prattrs"); + pg_fatal("could not parse %s array", "prattrs"); attribs = createPQExpBuffer(); for (int k = 0; k < nattnames; k++) { @@ -4510,7 +4501,7 @@ dumpSubscription(Archive *fout, const SubscriptionInfo *subinfo) /* Build list of quoted publications and append them to query. */ if (!parsePGArray(subinfo->subpublications, &pubnames, &npubnames)) - fatal("could not parse %s array", "subpublications"); + pg_fatal("could not parse %s array", "subpublications"); publications = createPQExpBuffer(); for (i = 0; i < npubnames; i++) @@ -4892,8 +4883,8 @@ binary_upgrade_extension_member(PQExpBuffer upgrade_buffer, extobj = NULL; } if (extobj == NULL) - fatal("could not find parent extension for %s %s", - objtype, objname); + pg_fatal("could not find parent extension for %s %s", + objtype, objname); appendPQExpBufferStr(upgrade_buffer, "\n-- For binary upgrade, handle extension membership the hard way\n"); @@ -5037,7 +5028,7 @@ findNamespace(Oid nsoid) nsinfo = findNamespaceByOid(nsoid); if (nsinfo == NULL) - fatal("schema with OID %u does not exist", nsoid); + pg_fatal("schema with OID %u does not exist", nsoid); return nsinfo; } @@ -6491,8 +6482,8 @@ getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables) owning_tab = findTableByOid(seqinfo->owning_tab); if (owning_tab == NULL) - fatal("failed sanity check, parent table with OID %u of sequence with OID %u not found", - seqinfo->owning_tab, seqinfo->dobj.catId.oid); + pg_fatal("failed sanity check, parent table with OID %u of sequence with OID %u not found", + seqinfo->owning_tab, seqinfo->dobj.catId.oid); /* * Only dump identity sequences if we're going to dump the table that @@ -6795,12 +6786,12 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) break; } if (curtblindx >= numTables) - fatal("unrecognized table OID %u", indrelid); + pg_fatal("unrecognized table OID %u", indrelid); /* cross-check that we only got requested tables */ if (!tbinfo->hasindex || !tbinfo->interesting) - fatal("unexpected index data for table \"%s\"", - tbinfo->dobj.name); + pg_fatal("unexpected index data for table \"%s\"", + tbinfo->dobj.name); /* Save data for this table */ tbinfo->indexes = indxinfo + j; @@ -7062,7 +7053,7 @@ getConstraints(Archive *fout, TableInfo tblinfo[], int numTables) break; } if (curtblindx >= numTables) - fatal("unrecognized table OID %u", conrelid); + pg_fatal("unrecognized table OID %u", conrelid); } constrinfo[j].dobj.objType = DO_FK_CONSTRAINT; @@ -7294,8 +7285,8 @@ getRules(Archive *fout, int *numRules) ruletableoid = atooid(PQgetvalue(res, i, i_ruletable)); ruleinfo[i].ruletable = findTableByOid(ruletableoid); if (ruleinfo[i].ruletable == NULL) - fatal("failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found", - ruletableoid, ruleinfo[i].dobj.catId.oid); + pg_fatal("failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found", + ruletableoid, ruleinfo[i].dobj.catId.oid); ruleinfo[i].dobj.namespace = ruleinfo[i].ruletable->dobj.namespace; ruleinfo[i].dobj.dump = ruleinfo[i].ruletable->dobj.dump; ruleinfo[i].ev_type = *(PQgetvalue(res, i, i_ev_type)); @@ -7533,7 +7524,7 @@ getTriggers(Archive *fout, TableInfo tblinfo[], int numTables) break; } if (curtblindx >= numTables) - fatal("unrecognized table OID %u", tgrelid); + pg_fatal("unrecognized table OID %u", tgrelid); /* Save data for this table */ tbinfo->triggers = tginfo + j; @@ -7585,10 +7576,10 @@ getTriggers(Archive *fout, TableInfo tblinfo[], int numTables) if (OidIsValid(tginfo[j].tgconstrrelid)) { if (PQgetisnull(res, j, i_tgconstrrelname)) - fatal("query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)", - tginfo[j].dobj.name, - tbinfo->dobj.name, - tginfo[j].tgconstrrelid); + pg_fatal("query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)", + tginfo[j].dobj.name, + tbinfo->dobj.name, + tginfo[j].tgconstrrelid); tginfo[j].tgconstrrelname = pg_strdup(PQgetvalue(res, j, i_tgconstrrelname)); } else @@ -8200,12 +8191,12 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables) break; } if (curtblindx >= numTables) - fatal("unrecognized table OID %u", attrelid); + pg_fatal("unrecognized table OID %u", attrelid); /* cross-check that we only got requested tables */ if (tbinfo->relkind == RELKIND_SEQUENCE || !tbinfo->interesting) - fatal("unexpected column data for table \"%s\"", - tbinfo->dobj.name); + pg_fatal("unexpected column data for table \"%s\"", + tbinfo->dobj.name); /* Save data for this table */ tbinfo->numatts = numatts; @@ -8234,8 +8225,8 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables) for (int j = 0; j < numatts; j++, r++) { if (j + 1 != atoi(PQgetvalue(res, r, i_attnum))) - fatal("invalid column numbering in table \"%s\"", - tbinfo->dobj.name); + pg_fatal("invalid column numbering in table \"%s\"", + tbinfo->dobj.name); tbinfo->attnames[j] = pg_strdup(PQgetvalue(res, r, i_attname)); tbinfo->atttypnames[j] = pg_strdup(PQgetvalue(res, r, i_atttypname)); tbinfo->atttypmod[j] = atoi(PQgetvalue(res, r, i_atttypmod)); @@ -8321,12 +8312,12 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables) break; } if (curtblindx >= numTables) - fatal("unrecognized table OID %u", adrelid); + pg_fatal("unrecognized table OID %u", adrelid); } if (adnum <= 0 || adnum > tbinfo->numatts) - fatal("invalid adnum value %d for table \"%s\"", - adnum, tbinfo->dobj.name); + pg_fatal("invalid adnum value %d for table \"%s\"", + adnum, tbinfo->dobj.name); /* * dropped columns shouldn't have defaults, but just in case, @@ -8475,7 +8466,7 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables) break; } if (curtblindx >= numTables) - fatal("unrecognized table OID %u", conrelid); + pg_fatal("unrecognized table OID %u", conrelid); if (numcons != tbinfo->ncheck) { @@ -8483,7 +8474,7 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables) "expected %d check constraints on table \"%s\" but found %d", tbinfo->ncheck), tbinfo->ncheck, tbinfo->dobj.name, numcons); - pg_log_error("(The system catalogs might be corrupted.)"); + pg_log_error_hint("The system catalogs might be corrupted."); exit_nicely(1); } @@ -9173,7 +9164,7 @@ getRoleName(const char *roleoid_str) } } - fatal("role with OID %u does not exist", roleoid); + pg_fatal("role with OID %u does not exist", roleoid); return NULL; /* keep compiler quiet */ } @@ -11641,7 +11632,7 @@ dumpFunc(Archive *fout, const FuncInfo *finfo) if (*proconfig) { if (!parsePGArray(proconfig, &configitems, &nconfigitems)) - fatal("could not parse %s array", "proconfig"); + pg_fatal("could not parse %s array", "proconfig"); } else { @@ -11710,8 +11701,8 @@ dumpFunc(Archive *fout, const FuncInfo *finfo) else if (provolatile[0] == PROVOLATILE_STABLE) appendPQExpBufferStr(q, " STABLE"); else if (provolatile[0] != PROVOLATILE_VOLATILE) - fatal("unrecognized provolatile value for function \"%s\"", - finfo->dobj.name); + pg_fatal("unrecognized provolatile value for function \"%s\"", + finfo->dobj.name); } if (proisstrict[0] == 't') @@ -11760,8 +11751,8 @@ dumpFunc(Archive *fout, const FuncInfo *finfo) else if (proparallel[0] == PROPARALLEL_RESTRICTED) appendPQExpBufferStr(q, " PARALLEL RESTRICTED"); else if (proparallel[0] != PROPARALLEL_UNSAFE) - fatal("unrecognized proparallel value for function \"%s\"", - finfo->dobj.name); + pg_fatal("unrecognized proparallel value for function \"%s\"", + finfo->dobj.name); } for (i = 0; i < nconfigitems; i++) @@ -11891,8 +11882,8 @@ dumpCast(Archive *fout, const CastInfo *cast) { funcInfo = findFuncByOid(cast->castfunc); if (funcInfo == NULL) - fatal("could not find function definition for function with OID %u", - cast->castfunc); + pg_fatal("could not find function definition for function with OID %u", + cast->castfunc); } defqry = createPQExpBuffer(); @@ -11997,15 +11988,15 @@ dumpTransform(Archive *fout, const TransformInfo *transform) { fromsqlFuncInfo = findFuncByOid(transform->trffromsql); if (fromsqlFuncInfo == NULL) - fatal("could not find function definition for function with OID %u", - transform->trffromsql); + pg_fatal("could not find function definition for function with OID %u", + transform->trffromsql); } if (OidIsValid(transform->trftosql)) { tosqlFuncInfo = findFuncByOid(transform->trftosql); if (tosqlFuncInfo == NULL) - fatal("could not find function definition for function with OID %u", - transform->trftosql); + pg_fatal("could not find function definition for function with OID %u", + transform->trftosql); } defqry = createPQExpBuffer(); @@ -13063,8 +13054,8 @@ dumpCollation(Archive *fout, const CollInfo *collinfo) /* to allow dumping pg_catalog; not accepted on input */ appendPQExpBufferStr(q, "default"); else - fatal("unrecognized collation provider: %s", - collprovider); + pg_fatal("unrecognized collation provider: %s", + collprovider); if (strcmp(PQgetvalue(res, 0, i_collisdeterministic), "f") == 0) appendPQExpBufferStr(q, ", deterministic = false"); @@ -13470,8 +13461,8 @@ dumpAgg(Archive *fout, const AggInfo *agginfo) appendPQExpBufferStr(details, ",\n FINALFUNC_MODIFY = READ_WRITE"); break; default: - fatal("unrecognized aggfinalmodify value for aggregate \"%s\"", - agginfo->aggfn.dobj.name); + pg_fatal("unrecognized aggfinalmodify value for aggregate \"%s\"", + agginfo->aggfn.dobj.name); break; } } @@ -13526,8 +13517,8 @@ dumpAgg(Archive *fout, const AggInfo *agginfo) appendPQExpBufferStr(details, ",\n MFINALFUNC_MODIFY = READ_WRITE"); break; default: - fatal("unrecognized aggmfinalmodify value for aggregate \"%s\"", - agginfo->aggfn.dobj.name); + pg_fatal("unrecognized aggmfinalmodify value for aggregate \"%s\"", + agginfo->aggfn.dobj.name); break; } } @@ -13551,8 +13542,8 @@ dumpAgg(Archive *fout, const AggInfo *agginfo) else if (proparallel[0] == PROPARALLEL_RESTRICTED) appendPQExpBufferStr(details, ",\n PARALLEL = restricted"); else if (proparallel[0] != PROPARALLEL_UNSAFE) - fatal("unrecognized proparallel value for function \"%s\"", - agginfo->aggfn.dobj.name); + pg_fatal("unrecognized proparallel value for function \"%s\"", + agginfo->aggfn.dobj.name); } appendPQExpBuffer(delq, "DROP AGGREGATE %s.%s;\n", @@ -14244,8 +14235,8 @@ dumpDefaultACL(Archive *fout, const DefaultACLInfo *daclinfo) break; default: /* shouldn't get here */ - fatal("unrecognized object type in default privileges: %d", - (int) daclinfo->defaclobjtype); + pg_fatal("unrecognized object type in default privileges: %d", + (int) daclinfo->defaclobjtype); type = ""; /* keep compiler quiet */ } @@ -14260,8 +14251,8 @@ dumpDefaultACL(Archive *fout, const DefaultACLInfo *daclinfo) daclinfo->defaclrole, fout->remoteVersion, q)) - fatal("could not parse default ACL list (%s)", - daclinfo->dacl.acl); + pg_fatal("could not parse default ACL list (%s)", + daclinfo->dacl.acl); if (daclinfo->dobj.dump & DUMP_COMPONENT_ACL) ArchiveEntry(fout, daclinfo->dobj.catId, daclinfo->dobj.dumpId, @@ -14342,8 +14333,8 @@ dumpACL(Archive *fout, DumpId objDumpId, DumpId altDumpId, if (!buildACLCommands(name, subname, nspname, type, initprivs, acldefault, owner, "", fout->remoteVersion, sql)) - fatal("could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)", - initprivs, acldefault, name, type); + pg_fatal("could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)", + initprivs, acldefault, name, type); appendPQExpBufferStr(sql, "SELECT pg_catalog.binary_upgrade_set_record_init_privs(false);\n"); } @@ -14367,8 +14358,8 @@ dumpACL(Archive *fout, DumpId objDumpId, DumpId altDumpId, if (!buildACLCommands(name, subname, nspname, type, acls, baseacls, owner, "", fout->remoteVersion, sql)) - fatal("could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)", - acls, baseacls, name, type); + pg_fatal("could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)", + acls, baseacls, name, type); if (sql->len > 0) { @@ -14905,18 +14896,18 @@ createViewAsClause(Archive *fout, const TableInfo *tbinfo) if (PQntuples(res) != 1) { if (PQntuples(res) < 1) - fatal("query to obtain definition of view \"%s\" returned no data", - tbinfo->dobj.name); + pg_fatal("query to obtain definition of view \"%s\" returned no data", + tbinfo->dobj.name); else - fatal("query to obtain definition of view \"%s\" returned more than one definition", - tbinfo->dobj.name); + pg_fatal("query to obtain definition of view \"%s\" returned more than one definition", + tbinfo->dobj.name); } len = PQgetlength(res, 0, 0); if (len == 0) - fatal("definition of view \"%s\" appears to be empty (length zero)", - tbinfo->dobj.name); + pg_fatal("definition of view \"%s\" appears to be empty (length zero)", + tbinfo->dobj.name); /* Strip off the trailing semicolon so that other things may follow. */ Assert(PQgetvalue(res, 0, 0)[len - 1] == ';'); @@ -15928,8 +15919,8 @@ getAttrName(int attrnum, const TableInfo *tblInfo) case TableOidAttributeNumber: return "tableoid"; } - fatal("invalid column number %d for table \"%s\"", - attrnum, tblInfo->dobj.name); + pg_fatal("invalid column number %d for table \"%s\"", + attrnum, tblInfo->dobj.name); return NULL; /* keep compiler quiet */ } @@ -16006,11 +15997,11 @@ dumpIndex(Archive *fout, const IndxInfo *indxinfo) int j; if (!parsePGArray(indstatcols, &indstatcolsarray, &nstatcols)) - fatal("could not parse index statistic columns"); + pg_fatal("could not parse index statistic columns"); if (!parsePGArray(indstatvals, &indstatvalsarray, &nstatvals)) - fatal("could not parse index statistic values"); + pg_fatal("could not parse index statistic values"); if (nstatcols != nstatvals) - fatal("mismatched number of columns and values for index statistics"); + pg_fatal("mismatched number of columns and values for index statistics"); for (j = 0; j < nstatcols; j++) { @@ -16228,8 +16219,8 @@ dumpConstraint(Archive *fout, const ConstraintInfo *coninfo) indxinfo = (IndxInfo *) findObjectByDumpId(coninfo->conindex); if (indxinfo == NULL) - fatal("missing index for constraint \"%s\"", - coninfo->dobj.name); + pg_fatal("missing index for constraint \"%s\"", + coninfo->dobj.name); if (dopt->binary_upgrade) binary_upgrade_set_pg_class_oids(fout, q, @@ -16456,8 +16447,8 @@ dumpConstraint(Archive *fout, const ConstraintInfo *coninfo) } else { - fatal("unrecognized constraint type: %c", - coninfo->contype); + pg_fatal("unrecognized constraint type: %c", + coninfo->contype); } /* Dump Constraint Comments --- only works for table constraints */ @@ -16557,13 +16548,10 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo) res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); if (PQntuples(res) != 1) - { - pg_log_error(ngettext("query to get data of sequence \"%s\" returned %d row (expected 1)", - "query to get data of sequence \"%s\" returned %d rows (expected 1)", - PQntuples(res)), - tbinfo->dobj.name, PQntuples(res)); - exit_nicely(1); - } + pg_fatal(ngettext("query to get data of sequence \"%s\" returned %d row (expected 1)", + "query to get data of sequence \"%s\" returned %d rows (expected 1)", + PQntuples(res)), + tbinfo->dobj.name, PQntuples(res)); seqtype = PQgetvalue(res, 0, 0); startv = PQgetvalue(res, 0, 1); @@ -16592,7 +16580,7 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo) } else { - fatal("unrecognized sequence type: %s", seqtype); + pg_fatal("unrecognized sequence type: %s", seqtype); default_minv = default_maxv = 0; /* keep compiler quiet */ } @@ -16725,8 +16713,8 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo) TableInfo *owning_tab = findTableByOid(tbinfo->owning_tab); if (owning_tab == NULL) - fatal("failed sanity check, parent table with OID %u of sequence with OID %u not found", - tbinfo->owning_tab, tbinfo->dobj.catId.oid); + pg_fatal("failed sanity check, parent table with OID %u of sequence with OID %u not found", + tbinfo->owning_tab, tbinfo->dobj.catId.oid); if (owning_tab->dobj.dump & DUMP_COMPONENT_DEFINITION) { @@ -16789,13 +16777,10 @@ dumpSequenceData(Archive *fout, const TableDataInfo *tdinfo) res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); if (PQntuples(res) != 1) - { - pg_log_error(ngettext("query to get data of sequence \"%s\" returned %d row (expected 1)", - "query to get data of sequence \"%s\" returned %d rows (expected 1)", - PQntuples(res)), - tbinfo->dobj.name, PQntuples(res)); - exit_nicely(1); - } + pg_fatal(ngettext("query to get data of sequence \"%s\" returned %d row (expected 1)", + "query to get data of sequence \"%s\" returned %d rows (expected 1)", + PQntuples(res)), + tbinfo->dobj.name, PQntuples(res)); last = PQgetvalue(res, 0, 0); called = (strcmp(PQgetvalue(res, 0, 1), "t") == 0); @@ -16884,10 +16869,7 @@ dumpTrigger(Archive *fout, const TriggerInfo *tginfo) else if (TRIGGER_FOR_INSTEAD(tginfo->tgtype)) appendPQExpBufferStr(query, "INSTEAD OF"); else - { - pg_log_error("unexpected tgtype value: %d", tginfo->tgtype); - exit_nicely(1); - } + pg_fatal("unexpected tgtype value: %d", tginfo->tgtype); findx = 0; if (TRIGGER_FOR_INSERT(tginfo->tgtype)) @@ -16959,11 +16941,10 @@ dumpTrigger(Archive *fout, const TriggerInfo *tginfo) if (p + tlen >= tgargs + lentgargs) { /* hm, not found before end of bytea value... */ - pg_log_error("invalid argument string (%s) for trigger \"%s\" on table \"%s\"", - tginfo->tgargs, - tginfo->dobj.name, - tbinfo->dobj.name); - exit_nicely(1); + pg_fatal("invalid argument string (%s) for trigger \"%s\" on table \"%s\"", + tginfo->tgargs, + tginfo->dobj.name, + tbinfo->dobj.name); } if (findx > 0) @@ -17229,11 +17210,8 @@ dumpRule(Archive *fout, const RuleInfo *rinfo) res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); if (PQntuples(res) != 1) - { - pg_log_error("query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned", - rinfo->dobj.name, tbinfo->dobj.name); - exit_nicely(1); - } + pg_fatal("query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned", + rinfo->dobj.name, tbinfo->dobj.name); printfPQExpBuffer(cmd, "%s\n", PQgetvalue(res, 0, 0)); @@ -17471,11 +17449,11 @@ processExtensionTables(Archive *fout, ExtensionInfo extinfo[], int j; if (!parsePGArray(extconfig, &extconfigarray, &nconfigitems)) - fatal("could not parse %s array", "extconfig"); + pg_fatal("could not parse %s array", "extconfig"); if (!parsePGArray(extcondition, &extconditionarray, &nconditionitems)) - fatal("could not parse %s array", "extcondition"); + pg_fatal("could not parse %s array", "extcondition"); if (nconfigitems != nconditionitems) - fatal("mismatched number of configurations and conditions for extension"); + pg_fatal("mismatched number of configurations and conditions for extension"); for (j = 0; j < nconfigitems; j++) { diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c index 1592090839..5de3241eb4 100644 --- a/src/bin/pg_dump/pg_dump_sort.c +++ b/src/bin/pg_dump/pg_dump_sort.c @@ -419,13 +419,13 @@ TopoSort(DumpableObject **objs, obj = objs[i]; j = obj->dumpId; if (j <= 0 || j > maxDumpId) - fatal("invalid dumpId %d", j); + pg_fatal("invalid dumpId %d", j); idMap[j] = i; for (j = 0; j < obj->nDeps; j++) { k = obj->dependencies[j]; if (k <= 0 || k > maxDumpId) - fatal("invalid dependency %d", k); + pg_fatal("invalid dependency %d", k); beforeConstraints[k]++; } } @@ -658,7 +658,7 @@ findDependencyLoops(DumpableObject **objs, int nObjs, int totObjs) /* We'd better have fixed at least one loop */ if (!fixedloop) - fatal("could not identify dependency loop"); + pg_fatal("could not identify dependency loop"); free(workspace); free(searchFailed); @@ -1233,9 +1233,9 @@ repairDependencyLoop(DumpableObject **loop, "there are circular foreign-key constraints among these tables:", nLoop)); for (i = 0; i < nLoop; i++) - pg_log_generic(PG_LOG_INFO, " %s", loop[i]->name); - pg_log_generic(PG_LOG_INFO, "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."); - pg_log_generic(PG_LOG_INFO, "Consider using a full dump instead of a --data-only dump to avoid this problem."); + pg_log_info(" %s", loop[i]->name); + pg_log_info("You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."); + pg_log_info("Consider using a full dump instead of a --data-only dump to avoid this problem."); if (nLoop > 1) removeObjectDependency(loop[0], loop[1]->dumpId); else /* must be a self-dependency */ @@ -1253,7 +1253,7 @@ repairDependencyLoop(DumpableObject **loop, char buf[1024]; describeDumpableObject(loop[i], buf, sizeof(buf)); - pg_log_generic(PG_LOG_INFO, " %s", buf); + pg_log_info(" %s", buf); } if (nLoop > 1) diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 2dc3362763..6ef3d61421 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -202,16 +202,11 @@ main(int argc, char *argv[]) strlcpy(full_path, progname, sizeof(full_path)); if (ret == -1) - pg_log_error("The program \"%s\" is needed by %s but was not found in the\n" - "same directory as \"%s\".\n" - "Check your installation.", - "pg_dump", progname, full_path); + pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"", + "pg_dump", progname, full_path); else - pg_log_error("The program \"%s\" was found by \"%s\"\n" - "but was not the same version as %s.\n" - "Check your installation.", - "pg_dump", full_path, progname); - exit_nicely(1); + pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s", + "pg_dump", full_path, progname); } pgdumpopts = createPQExpBuffer(); @@ -341,7 +336,8 @@ main(int argc, char *argv[]) break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } } @@ -351,8 +347,7 @@ main(int argc, char *argv[]) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } @@ -360,8 +355,7 @@ main(int argc, char *argv[]) (globals_only || roles_only || tablespaces_only)) { pg_log_error("option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } @@ -369,30 +363,24 @@ main(int argc, char *argv[]) if (globals_only && roles_only) { pg_log_error("options -g/--globals-only and -r/--roles-only cannot be used together"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } if (globals_only && tablespaces_only) { pg_log_error("options -g/--globals-only and -t/--tablespaces-only cannot be used together"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } if (if_exists && !output_clean) - { - pg_log_error("option --if-exists requires option -c/--clean"); - exit_nicely(1); - } + pg_fatal("option --if-exists requires option -c/--clean"); if (roles_only && tablespaces_only) { pg_log_error("options -r/--roles-only and -t/--tablespaces-only cannot be used together"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } @@ -453,10 +441,7 @@ main(int argc, char *argv[]) prompt_password, false); if (!conn) - { - pg_log_error("could not connect to database \"%s\"", pgdb); - exit_nicely(1); - } + pg_fatal("could not connect to database \"%s\"", pgdb); } else { @@ -470,8 +455,7 @@ main(int argc, char *argv[]) { pg_log_error("could not connect to databases \"postgres\" or \"template1\"\n" "Please specify an alternative database."); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } } @@ -489,11 +473,8 @@ main(int argc, char *argv[]) { OPF = fopen(filename, PG_BINARY_W); if (!OPF) - { - pg_log_error("could not open output file \"%s\": %m", - filename); - exit_nicely(1); - } + pg_fatal("could not open output file \"%s\": %m", + filename); } else OPF = stdout; @@ -504,11 +485,8 @@ main(int argc, char *argv[]) if (dumpencoding) { if (PQsetClientEncoding(conn, dumpencoding) < 0) - { - pg_log_error("invalid client encoding \"%s\" specified", - dumpencoding); - exit_nicely(1); - } + pg_fatal("invalid client encoding \"%s\" specified", + dumpencoding); } /* @@ -1386,20 +1364,14 @@ dumpDatabases(PGconn *conn) ret = runPgDump(dbname, create_opts); if (ret != 0) - { - pg_log_error("pg_dump failed on database \"%s\", exiting", dbname); - exit_nicely(1); - } + pg_fatal("pg_dump failed on database \"%s\", exiting", dbname); if (filename) { OPF = fopen(filename, PG_BINARY_A); if (!OPF) - { - pg_log_error("could not re-open the output file \"%s\": %m", - filename); - exit_nicely(1); - } + pg_fatal("could not re-open the output file \"%s\": %m", + filename); } } @@ -1535,10 +1507,7 @@ connectDatabase(const char *dbname, const char *connection_string, { conn_opts = PQconninfoParse(connection_string, &err_msg); if (conn_opts == NULL) - { - pg_log_error("%s", err_msg); - exit_nicely(1); - } + pg_fatal("%s", err_msg); for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++) { @@ -1605,10 +1574,7 @@ connectDatabase(const char *dbname, const char *connection_string, conn = PQconnectdbParams(keywords, values, true); if (!conn) - { - pg_log_error("could not connect to database \"%s\"", dbname); - exit_nicely(1); - } + pg_fatal("could not connect to database \"%s\"", dbname); if (PQstatus(conn) == CONNECTION_BAD && PQconnectionNeedsPassword(conn) && @@ -1625,10 +1591,7 @@ connectDatabase(const char *dbname, const char *connection_string, if (PQstatus(conn) == CONNECTION_BAD) { if (fail_on_error) - { - pg_log_error("%s", PQerrorMessage(conn)); - exit_nicely(1); - } + pg_fatal("%s", PQerrorMessage(conn)); else { PQfinish(conn); @@ -1654,17 +1617,11 @@ connectDatabase(const char *dbname, const char *connection_string, /* Check version */ remoteversion_str = PQparameterStatus(conn, "server_version"); if (!remoteversion_str) - { - pg_log_error("could not get server version"); - exit_nicely(1); - } + pg_fatal("could not get server version"); server_version = PQserverVersion(conn); if (server_version == 0) - { - pg_log_error("could not parse server version \"%s\"", - remoteversion_str); - exit_nicely(1); - } + pg_fatal("could not parse server version \"%s\"", + remoteversion_str); my_version = PG_VERSION_NUM; @@ -1676,9 +1633,9 @@ connectDatabase(const char *dbname, const char *connection_string, && (server_version < 90200 || (server_version / 100) > (my_version / 100))) { - pg_log_error("server version: %s; %s version: %s", - remoteversion_str, progname, PG_VERSION); pg_log_error("aborting because of server version mismatch"); + pg_log_error_detail("server version: %s; %s version: %s", + remoteversion_str, progname, PG_VERSION); exit_nicely(1); } @@ -1740,7 +1697,7 @@ executeQuery(PGconn *conn, const char *query) PQresultStatus(res) != PGRES_TUPLES_OK) { pg_log_error("query failed: %s", PQerrorMessage(conn)); - pg_log_error("query was: %s", query); + pg_log_error_detail("Query was: %s", query); PQfinish(conn); exit_nicely(1); } @@ -1763,7 +1720,7 @@ executeCommand(PGconn *conn, const char *query) PQresultStatus(res) != PGRES_COMMAND_OK) { pg_log_error("query failed: %s", PQerrorMessage(conn)); - pg_log_error("query was: %s", query); + pg_log_error_detail("Query was: %s", query); PQfinish(conn); exit_nicely(1); } diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c index 55bf1b6975..049a100634 100644 --- a/src/bin/pg_dump/pg_restore.c +++ b/src/bin/pg_dump/pg_restore.c @@ -287,7 +287,8 @@ main(int argc, char **argv) break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } } @@ -303,17 +304,13 @@ main(int argc, char **argv) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } /* Complain if neither -f nor -d was specified (except if dumping TOC) */ if (!opts->cparams.dbname && !opts->filename && !opts->tocSummary) - { - pg_log_error("one of -d/--dbname and -f/--file must be specified"); - exit_nicely(1); - } + pg_fatal("one of -d/--dbname and -f/--file must be specified"); /* Should get at most one of -d and -f, else user is confused */ if (opts->cparams.dbname) @@ -321,41 +318,28 @@ main(int argc, char **argv) if (opts->filename) { pg_log_error("options -d/--dbname and -f/--file cannot be used together"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } opts->useDB = 1; } if (opts->dataOnly && opts->schemaOnly) - { - pg_log_error("options -s/--schema-only and -a/--data-only cannot be used together"); - exit_nicely(1); - } + pg_fatal("options -s/--schema-only and -a/--data-only cannot be used together"); if (opts->dataOnly && opts->dropSchema) - { - pg_log_error("options -c/--clean and -a/--data-only cannot be used together"); - exit_nicely(1); - } + pg_fatal("options -c/--clean and -a/--data-only cannot be used together"); /* * -C is not compatible with -1, because we can't create a database inside * a transaction block. */ if (opts->createDB && opts->single_txn) - { - pg_log_error("options -C/--create and -1/--single-transaction cannot be used together"); - exit_nicely(1); - } + pg_fatal("options -C/--create and -1/--single-transaction cannot be used together"); /* Can't do single-txn mode with multiple connections */ if (opts->single_txn && numWorkers > 1) - { - pg_log_error("cannot specify both --single-transaction and multiple jobs"); - exit_nicely(1); - } + pg_fatal("cannot specify both --single-transaction and multiple jobs"); opts->disable_triggers = disable_triggers; opts->enable_row_security = enable_row_security; @@ -369,10 +353,7 @@ main(int argc, char **argv) opts->no_subscriptions = no_subscriptions; if (if_exists && !opts->dropSchema) - { - pg_log_error("option --if-exists requires option -c/--clean"); - exit_nicely(1); - } + pg_fatal("option --if-exists requires option -c/--clean"); opts->if_exists = if_exists; opts->strict_names = strict_names; @@ -396,9 +377,8 @@ main(int argc, char **argv) break; default: - pg_log_error("unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"", - opts->formatName); - exit_nicely(1); + pg_fatal("unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"", + opts->formatName); } } diff --git a/src/bin/pg_dump/t/003_pg_dump_with_server.pl b/src/bin/pg_dump/t/003_pg_dump_with_server.pl index 528db179cb..c284866326 100644 --- a/src/bin/pg_dump/t/003_pg_dump_with_server.pl +++ b/src/bin/pg_dump/t/003_pg_dump_with_server.pl @@ -30,7 +30,7 @@ command_fails_like( [ "pg_dump", '-p', $port, '--include-foreign-data=s0', 'postgres' ], - qr/foreign-data wrapper \"dummy\" has no handler\r?\npg_dump: error: query was:.*t0/, + qr/foreign-data wrapper \"dummy\" has no handler\r?\ndetail: Query was: .*t0/, "correctly fails to dump a foreign table from a dummy FDW"); command_ok( diff --git a/src/bin/pg_resetwal/pg_resetwal.c b/src/bin/pg_resetwal/pg_resetwal.c index 1eb4509fca..d4772a2965 100644 --- a/src/bin/pg_resetwal/pg_resetwal.c +++ b/src/bin/pg_resetwal/pg_resetwal.c @@ -161,14 +161,11 @@ main(int argc, char *argv[]) /*------ translator: the second %s is a command line argument (-e, etc) */ pg_log_error("invalid argument for option %s", "-e"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (set_xid_epoch == -1) - { - pg_log_error("transaction ID epoch (-e) must not be -1"); - exit(1); - } + pg_fatal("transaction ID epoch (-e) must not be -1"); break; case 'u': @@ -177,14 +174,11 @@ main(int argc, char *argv[]) if (endptr == optarg || *endptr != '\0' || errno != 0) { pg_log_error("invalid argument for option %s", "-u"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (!TransactionIdIsNormal(set_oldest_xid)) - { - pg_log_error("oldest transaction ID (-u) must be greater than or equal to %u", FirstNormalTransactionId); - exit(1); - } + pg_fatal("oldest transaction ID (-u) must be greater than or equal to %u", FirstNormalTransactionId); break; case 'x': @@ -193,14 +187,11 @@ main(int argc, char *argv[]) if (endptr == optarg || *endptr != '\0' || errno != 0) { pg_log_error("invalid argument for option %s", "-x"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (!TransactionIdIsNormal(set_xid)) - { - pg_log_error("transaction ID (-x) must be greater than or equal to %u", FirstNormalTransactionId); - exit(1); - } + pg_fatal("transaction ID (-x) must be greater than or equal to %u", FirstNormalTransactionId); break; case 'c': @@ -209,30 +200,24 @@ main(int argc, char *argv[]) if (endptr == optarg || *endptr != ',' || errno != 0) { pg_log_error("invalid argument for option %s", "-c"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } set_newest_commit_ts_xid = strtoul(endptr + 1, &endptr2, 0); if (endptr2 == endptr + 1 || *endptr2 != '\0' || errno != 0) { pg_log_error("invalid argument for option %s", "-c"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (set_oldest_commit_ts_xid < 2 && set_oldest_commit_ts_xid != 0) - { - pg_log_error("transaction ID (-c) must be either 0 or greater than or equal to 2"); - exit(1); - } + pg_fatal("transaction ID (-c) must be either 0 or greater than or equal to 2"); if (set_newest_commit_ts_xid < 2 && set_newest_commit_ts_xid != 0) - { - pg_log_error("transaction ID (-c) must be either 0 or greater than or equal to 2"); - exit(1); - } + pg_fatal("transaction ID (-c) must be either 0 or greater than or equal to 2"); break; case 'o': @@ -241,14 +226,11 @@ main(int argc, char *argv[]) if (endptr == optarg || *endptr != '\0' || errno != 0) { pg_log_error("invalid argument for option %s", "-o"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (set_oid == 0) - { - pg_log_error("OID (-o) must not be 0"); - exit(1); - } + pg_fatal("OID (-o) must not be 0"); break; case 'm': @@ -257,7 +239,7 @@ main(int argc, char *argv[]) if (endptr == optarg || *endptr != ',' || errno != 0) { pg_log_error("invalid argument for option %s", "-m"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -265,24 +247,18 @@ main(int argc, char *argv[]) if (endptr2 == endptr + 1 || *endptr2 != '\0' || errno != 0) { pg_log_error("invalid argument for option %s", "-m"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (set_mxid == 0) - { - pg_log_error("multitransaction ID (-m) must not be 0"); - exit(1); - } + pg_fatal("multitransaction ID (-m) must not be 0"); /* * XXX It'd be nice to have more sanity checks here, e.g. so * that oldest is not wrapped around w.r.t. nextMulti. */ if (set_oldestmxid == 0) - { - pg_log_error("oldest multitransaction ID (-m) must not be 0"); - exit(1); - } + pg_fatal("oldest multitransaction ID (-m) must not be 0"); break; case 'O': @@ -291,21 +267,18 @@ main(int argc, char *argv[]) if (endptr == optarg || *endptr != '\0' || errno != 0) { pg_log_error("invalid argument for option %s", "-O"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (set_mxoff == -1) - { - pg_log_error("multitransaction offset (-O) must not be -1"); - exit(1); - } + pg_fatal("multitransaction offset (-O) must not be -1"); break; case 'l': if (strspn(optarg, "01234567890ABCDEFabcdef") != XLOG_FNAME_LEN) { pg_log_error("invalid argument for option %s", "-l"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -320,19 +293,14 @@ main(int argc, char *argv[]) errno = 0; set_wal_segsize = strtol(optarg, &endptr, 10) * 1024 * 1024; if (endptr == optarg || *endptr != '\0' || errno != 0) - { - pg_log_error("argument of --wal-segsize must be a number"); - exit(1); - } + pg_fatal("argument of --wal-segsize must be a number"); if (!IsValidWalSegSize(set_wal_segsize)) - { - pg_log_error("argument of --wal-segsize must be a power of 2 between 1 and 1024"); - exit(1); - } + pg_fatal("argument of --wal-segsize must be a power of 2 between 1 and 1024"); break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -345,15 +313,14 @@ main(int argc, char *argv[]) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (DataDir == NULL) { pg_log_error("no data directory specified"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -367,8 +334,8 @@ main(int argc, char *argv[]) if (geteuid() == 0) { pg_log_error("cannot be executed by \"root\""); - pg_log_info("You must run %s as the PostgreSQL superuser.", - progname); + pg_log_error_hint("You must run %s as the PostgreSQL superuser.", + progname); exit(1); } #endif @@ -377,20 +344,14 @@ main(int argc, char *argv[]) /* Set mask based on PGDATA permissions */ if (!GetDataDirectoryCreatePerm(DataDir)) - { - pg_log_error("could not read permissions of directory \"%s\": %m", - DataDir); - exit(1); - } + pg_fatal("could not read permissions of directory \"%s\": %m", + DataDir); umask(pg_mode_mask); if (chdir(DataDir) < 0) - { - pg_log_error("could not change directory to \"%s\": %m", - DataDir); - exit(1); - } + pg_fatal("could not change directory to \"%s\": %m", + DataDir); /* Check that data directory matches our server version */ CheckDataVersion(); @@ -402,16 +363,13 @@ main(int argc, char *argv[]) if ((fd = open("postmaster.pid", O_RDONLY, 0)) < 0) { if (errno != ENOENT) - { - pg_log_error("could not open file \"%s\" for reading: %m", - "postmaster.pid"); - exit(1); - } + pg_fatal("could not open file \"%s\" for reading: %m", + "postmaster.pid"); } else { pg_log_error("lock file \"%s\" exists", "postmaster.pid"); - pg_log_info("Is a server running? If not, delete the lock file and try again."); + pg_log_error_hint("Is a server running? If not, delete the lock file and try again."); exit(1); } @@ -557,20 +515,16 @@ CheckDataVersion(void) char rawline[64]; if ((ver_fd = fopen(ver_file, "r")) == NULL) - { - pg_log_error("could not open file \"%s\" for reading: %m", - ver_file); - exit(1); - } + pg_fatal("could not open file \"%s\" for reading: %m", + ver_file); /* version number has to be the first line read */ if (!fgets(rawline, sizeof(rawline), ver_fd)) { if (!ferror(ver_fd)) - pg_log_error("unexpected empty file \"%s\"", ver_file); + pg_fatal("unexpected empty file \"%s\"", ver_file); else - pg_log_error("could not read file \"%s\": %m", ver_file); - exit(1); + pg_fatal("could not read file \"%s\": %m", ver_file); } /* strip trailing newline and carriage return */ @@ -579,8 +533,8 @@ CheckDataVersion(void) if (strcmp(rawline, PG_MAJORVERSION) != 0) { pg_log_error("data directory is of wrong version"); - pg_log_info("File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\".", - ver_file, rawline, PG_MAJORVERSION); + pg_log_error_detail("File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\".", + ver_file, rawline, PG_MAJORVERSION); exit(1); } @@ -612,10 +566,10 @@ read_controlfile(void) pg_log_error("could not open file \"%s\" for reading: %m", XLOG_CONTROL_FILE); if (errno == ENOENT) - pg_log_info("If you are sure the data directory path is correct, execute\n" - " touch %s\n" - "and try again.", - XLOG_CONTROL_FILE); + pg_log_error_hint("If you are sure the data directory path is correct, execute\n" + " touch %s\n" + "and try again.", + XLOG_CONTROL_FILE); exit(1); } @@ -624,10 +578,7 @@ read_controlfile(void) len = read(fd, buffer, PG_CONTROL_FILE_SIZE); if (len < 0) - { - pg_log_error("could not read file \"%s\": %m", XLOG_CONTROL_FILE); - exit(1); - } + pg_fatal("could not read file \"%s\": %m", XLOG_CONTROL_FILE); close(fd); if (len >= sizeof(ControlFileData) && @@ -968,10 +919,7 @@ FindEndOfXLOG(void) */ xldir = opendir(XLOGDIR); if (xldir == NULL) - { - pg_log_error("could not open directory \"%s\": %m", XLOGDIR); - exit(1); - } + pg_fatal("could not open directory \"%s\": %m", XLOGDIR); while (errno = 0, (xlde = readdir(xldir)) != NULL) { @@ -1003,16 +951,10 @@ FindEndOfXLOG(void) } if (errno) - { - pg_log_error("could not read directory \"%s\": %m", XLOGDIR); - exit(1); - } + pg_fatal("could not read directory \"%s\": %m", XLOGDIR); if (closedir(xldir)) - { - pg_log_error("could not close directory \"%s\": %m", XLOGDIR); - exit(1); - } + pg_fatal("could not close directory \"%s\": %m", XLOGDIR); /* * Finally, convert to new xlog seg size, and advance by one to ensure we @@ -1036,10 +978,7 @@ KillExistingXLOG(void) xldir = opendir(XLOGDIR); if (xldir == NULL) - { - pg_log_error("could not open directory \"%s\": %m", XLOGDIR); - exit(1); - } + pg_fatal("could not open directory \"%s\": %m", XLOGDIR); while (errno = 0, (xlde = readdir(xldir)) != NULL) { @@ -1048,24 +987,15 @@ KillExistingXLOG(void) { snprintf(path, sizeof(path), "%s/%s", XLOGDIR, xlde->d_name); if (unlink(path) < 0) - { - pg_log_error("could not delete file \"%s\": %m", path); - exit(1); - } + pg_fatal("could not delete file \"%s\": %m", path); } } if (errno) - { - pg_log_error("could not read directory \"%s\": %m", XLOGDIR); - exit(1); - } + pg_fatal("could not read directory \"%s\": %m", XLOGDIR); if (closedir(xldir)) - { - pg_log_error("could not close directory \"%s\": %m", XLOGDIR); - exit(1); - } + pg_fatal("could not close directory \"%s\": %m", XLOGDIR); } @@ -1083,10 +1013,7 @@ KillExistingArchiveStatus(void) xldir = opendir(ARCHSTATDIR); if (xldir == NULL) - { - pg_log_error("could not open directory \"%s\": %m", ARCHSTATDIR); - exit(1); - } + pg_fatal("could not open directory \"%s\": %m", ARCHSTATDIR); while (errno = 0, (xlde = readdir(xldir)) != NULL) { @@ -1098,24 +1025,15 @@ KillExistingArchiveStatus(void) { snprintf(path, sizeof(path), "%s/%s", ARCHSTATDIR, xlde->d_name); if (unlink(path) < 0) - { - pg_log_error("could not delete file \"%s\": %m", path); - exit(1); - } + pg_fatal("could not delete file \"%s\": %m", path); } } if (errno) - { - pg_log_error("could not read directory \"%s\": %m", ARCHSTATDIR); - exit(1); - } + pg_fatal("could not read directory \"%s\": %m", ARCHSTATDIR); if (closedir(xldir)) - { - pg_log_error("could not close directory \"%s\": %m", ARCHSTATDIR); - exit(1); - } + pg_fatal("could not close directory \"%s\": %m", ARCHSTATDIR); } @@ -1179,10 +1097,7 @@ WriteEmptyXLOG(void) fd = open(path, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, pg_file_create_mode); if (fd < 0) - { - pg_log_error("could not open file \"%s\": %m", path); - exit(1); - } + pg_fatal("could not open file \"%s\": %m", path); errno = 0; if (write(fd, buffer.data, XLOG_BLCKSZ) != XLOG_BLCKSZ) @@ -1190,8 +1105,7 @@ WriteEmptyXLOG(void) /* if write didn't set errno, assume problem is no disk space */ if (errno == 0) errno = ENOSPC; - pg_log_error("could not write file \"%s\": %m", path); - exit(1); + pg_fatal("could not write file \"%s\": %m", path); } /* Fill the rest of the file with zeroes */ @@ -1203,16 +1117,12 @@ WriteEmptyXLOG(void) { if (errno == 0) errno = ENOSPC; - pg_log_error("could not write file \"%s\": %m", path); - exit(1); + pg_fatal("could not write file \"%s\": %m", path); } } if (fsync(fd) != 0) - { - pg_log_error("fsync error: %m"); - exit(1); - } + pg_fatal("fsync error: %m"); close(fd); } diff --git a/src/bin/pg_rewind/nls.mk b/src/bin/pg_rewind/nls.mk index a561f965df..a50f9139df 100644 --- a/src/bin/pg_rewind/nls.mk +++ b/src/bin/pg_rewind/nls.mk @@ -2,7 +2,6 @@ CATALOG_NAME = pg_rewind AVAIL_LANGUAGES = cs de es fr it ja ko pl pt_BR ru sv tr uk zh_CN GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) datapagemap.c file_ops.c filemap.c libpq_source.c local_source.c parsexlog.c pg_rewind.c timeline.c xlogreader.c ../../common/fe_memutils.c ../../common/restricted_token.c ../../fe_utils/archive.c ../../fe_utils/recovery_gen.c -GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) pg_fatal report_invalid_record:2 +GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) report_invalid_record:2 GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \ - pg_fatal:1:c-format \ report_invalid_record:2:c-format diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c index 0922032e23..2ca4dd29af 100644 --- a/src/bin/pg_rewind/pg_rewind.c +++ b/src/bin/pg_rewind/pg_rewind.c @@ -165,10 +165,6 @@ main(int argc, char **argv) { switch (c) { - case '?': - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); - exit(1); - case 'c': restore_wal = true; break; @@ -213,34 +209,39 @@ main(int argc, char **argv) case 5: config_file = pg_strdup(optarg); break; + + default: + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); } } if (datadir_source == NULL && connstr_source == NULL) { pg_log_error("no source specified (--source-pgdata or --source-server)"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (datadir_source != NULL && connstr_source != NULL) { pg_log_error("only one of --source-pgdata or --source-server can be specified"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (datadir_target == NULL) { pg_log_error("no target data directory specified (--target-pgdata)"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (writerecoveryconf && connstr_source == NULL) { pg_log_error("no source server information (--source-server) specified for --write-recovery-conf"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -248,7 +249,7 @@ main(int argc, char **argv) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -262,8 +263,8 @@ main(int argc, char **argv) if (geteuid() == 0) { pg_log_error("cannot be executed by \"root\""); - fprintf(stderr, _("You must run %s as the PostgreSQL superuser.\n"), - progname); + pg_log_error_hint("You must run %s as the PostgreSQL superuser.", + progname); exit(1); } #endif @@ -272,11 +273,8 @@ main(int argc, char **argv) /* Set mask based on PGDATA permissions */ if (!GetDataDirectoryCreatePerm(datadir_target)) - { - pg_log_error("could not read permissions of directory \"%s\": %m", - datadir_target); - exit(1); - } + pg_fatal("could not read permissions of directory \"%s\": %m", + datadir_target); umask(pg_mode_mask); @@ -1041,16 +1039,11 @@ getRestoreCommand(const char *argv0) strlcpy(full_path, progname, sizeof(full_path)); if (rc == -1) - pg_log_error("The program \"%s\" is needed by %s but was not found in the\n" - "same directory as \"%s\".\n" - "Check your installation.", - "postgres", progname, full_path); + pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"", + "postgres", progname, full_path); else - pg_log_error("The program \"%s\" was found by \"%s\"\n" - "but was not the same version as %s.\n" - "Check your installation.", - "postgres", full_path, progname); - exit(1); + pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s", + "postgres", full_path, progname); } /* @@ -1116,14 +1109,10 @@ ensureCleanShutdown(const char *argv0) strlcpy(full_path, progname, sizeof(full_path)); if (ret == -1) - pg_fatal("The program \"%s\" is needed by %s but was not found in the\n" - "same directory as \"%s\".\n" - "Check your installation.", + pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"", "postgres", progname, full_path); else - pg_fatal("The program \"%s\" was found by \"%s\"\n" - "but was not the same version as %s.\n" - "Check your installation.", + pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s", "postgres", full_path, progname); } @@ -1165,7 +1154,8 @@ ensureCleanShutdown(const char *argv0) if (system(postgres_cmd->data) != 0) { pg_log_error("postgres single-user mode in target cluster failed"); - pg_fatal("Command was: %s", postgres_cmd->data); + pg_log_error_detail("Command was: %s", postgres_cmd->data); + exit(1); } destroyPQExpBuffer(postgres_cmd); diff --git a/src/bin/pg_rewind/pg_rewind.h b/src/bin/pg_rewind/pg_rewind.h index 388870ce95..393182fe2a 100644 --- a/src/bin/pg_rewind/pg_rewind.h +++ b/src/bin/pg_rewind/pg_rewind.h @@ -33,9 +33,6 @@ extern int targetNentries; extern uint64 fetch_size; extern uint64 fetch_done; -/* logging support */ -#define pg_fatal(...) do { pg_log_fatal(__VA_ARGS__); exit(1); } while(0) - /* in parsexlog.c */ extern void extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex, XLogRecPtr endpoint, diff --git a/src/bin/pg_rewind/t/009_growing_files.pl b/src/bin/pg_rewind/t/009_growing_files.pl index 752781e637..2c81406cc0 100644 --- a/src/bin/pg_rewind/t/009_growing_files.pl +++ b/src/bin/pg_rewind/t/009_growing_files.pl @@ -71,6 +71,6 @@ open my $f, '<', "$standby_pgdata/tst_both_dir/file1"; $last = $_ while (<$f>); close $f; -like($last, qr/fatal: size of source file/, "Check error message"); +like($last, qr/error: size of source file/, "Check error message"); done_testing(); diff --git a/src/bin/pg_rewind/timeline.c b/src/bin/pg_rewind/timeline.c index df8f82a50c..983388c92b 100644 --- a/src/bin/pg_rewind/timeline.c +++ b/src/bin/pg_rewind/timeline.c @@ -73,19 +73,19 @@ rewind_parseTimeLineHistory(char *buffer, TimeLineID targetTLI, int *nentries) { /* expect a numeric timeline ID as first field of line */ pg_log_error("syntax error in history file: %s", fline); - pg_log_error("Expected a numeric timeline ID."); + pg_log_error_detail("Expected a numeric timeline ID."); exit(1); } if (nfields != 3) { pg_log_error("syntax error in history file: %s", fline); - pg_log_error("Expected a write-ahead log switchpoint location."); + pg_log_error_detail("Expected a write-ahead log switchpoint location."); exit(1); } if (entries && tli <= lasttli) { pg_log_error("invalid data in history file: %s", fline); - pg_log_error("Timeline IDs must be in increasing sequence."); + pg_log_error_detail("Timeline IDs must be in increasing sequence."); exit(1); } @@ -106,7 +106,7 @@ rewind_parseTimeLineHistory(char *buffer, TimeLineID targetTLI, int *nentries) if (entries && targetTLI <= lasttli) { pg_log_error("invalid data in history file"); - pg_log_error("Timeline IDs must be less than child timeline's ID."); + pg_log_error_detail("Timeline IDs must be less than child timeline's ID."); exit(1); } diff --git a/src/bin/pg_test_fsync/pg_test_fsync.c b/src/bin/pg_test_fsync/pg_test_fsync.c index ddabf64c58..f7bc199a30 100644 --- a/src/bin/pg_test_fsync/pg_test_fsync.c +++ b/src/bin/pg_test_fsync/pg_test_fsync.c @@ -47,10 +47,7 @@ do { \ alarm_triggered = false; \ if (CreateThread(NULL, 0, process_alarm, NULL, 0, NULL) == \ INVALID_HANDLE_VALUE) \ - { \ - pg_log_error("could not create thread for alarm"); \ - exit(1); \ - } \ + pg_fatal("could not create thread for alarm"); \ gettimeofday(&start_t, NULL); \ } while (0) #endif @@ -95,7 +92,7 @@ static int pg_fsync_writethrough(int fd); #endif static void print_elapse(struct timeval start_t, struct timeval stop_t, int ops); -#define die(msg) do { pg_log_error("%s: %m", _(msg)); exit(1); } while(0) +#define die(msg) pg_fatal("%s: %m", _(msg)) int @@ -186,24 +183,20 @@ handle_args(int argc, char *argv[]) errno != 0 || optval != (unsigned int) optval) { pg_log_error("invalid argument for option %s", "--secs-per-test"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } secs_per_test = (unsigned int) optval; if (secs_per_test == 0) - { - pg_log_error("%s must be in range %u..%u", - "--secs-per-test", 1, UINT_MAX); - exit(1); - } + pg_fatal("%s must be in range %u..%u", + "--secs-per-test", 1, UINT_MAX); break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); - break; } } @@ -211,8 +204,7 @@ handle_args(int argc, char *argv[]) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h index 6d7fd88c0c..86d3dc46fa 100644 --- a/src/bin/pg_upgrade/pg_upgrade.h +++ b/src/bin/pg_upgrade/pg_upgrade.h @@ -12,6 +12,9 @@ #include "libpq-fe.h" +/* For now, pg_upgrade does not use common/logging.c; use our own pg_fatal */ +#undef pg_fatal + /* Use port in the private/dynamic port number range */ #define DEF_PGUPORT 50432 diff --git a/src/bin/pg_verifybackup/pg_verifybackup.c b/src/bin/pg_verifybackup/pg_verifybackup.c index 05cb520c11..6671a84150 100644 --- a/src/bin/pg_verifybackup/pg_verifybackup.c +++ b/src/bin/pg_verifybackup/pg_verifybackup.c @@ -252,8 +252,8 @@ main(int argc, char **argv) canonicalize_path(wal_directory); break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -261,9 +261,8 @@ main(int argc, char **argv) /* Get backup directory name */ if (optind >= argc) { - pg_log_fatal("no backup directory specified"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error("no backup directory specified"); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } context.backup_directory = pstrdup(argv[optind++]); @@ -272,10 +271,9 @@ main(int argc, char **argv) /* Complain if any arguments remain */ if (optind < argc) { - pg_log_fatal("too many command-line arguments (first is \"%s\")", + pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -294,17 +292,13 @@ main(int argc, char **argv) if (find_my_exec(argv[0], full_path) < 0) strlcpy(full_path, progname, sizeof(full_path)); + if (ret == -1) - pg_log_fatal("The program \"%s\" is needed by %s but was not found in the\n" - "same directory as \"%s\".\n" - "Check your installation.", - "pg_waldump", "pg_verifybackup", full_path); + pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"", + "pg_waldump", "pg_verifybackup", full_path); else - pg_log_fatal("The program \"%s\" was found by \"%s\"\n" - "but was not the same version as %s.\n" - "Check your installation.", - "pg_waldump", full_path, "pg_verifybackup"); - exit(1); + pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s", + "pg_waldump", full_path, "pg_verifybackup"); } } @@ -449,7 +443,7 @@ report_manifest_error(JsonManifestParseContext *context, const char *fmt,...) va_list ap; va_start(ap, fmt); - pg_log_generic_v(PG_LOG_FATAL, gettext(fmt), ap); + pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, gettext(fmt), ap); va_end(ap); exit(1); @@ -840,7 +834,7 @@ report_backup_error(verifier_context *context, const char *pg_restrict fmt,...) va_list ap; va_start(ap, fmt); - pg_log_generic_v(PG_LOG_ERROR, gettext(fmt), ap); + pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, gettext(fmt), ap); va_end(ap); context->saw_any_error = true; @@ -857,7 +851,7 @@ report_fatal_error(const char *pg_restrict fmt,...) va_list ap; va_start(ap, fmt); - pg_log_generic_v(PG_LOG_FATAL, gettext(fmt), ap); + pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, gettext(fmt), ap); va_end(ap); exit(1); diff --git a/src/bin/pg_verifybackup/t/005_bad_manifest.pl b/src/bin/pg_verifybackup/t/005_bad_manifest.pl index 74d0a8d1b2..48fecfa315 100644 --- a/src/bin/pg_verifybackup/t/005_bad_manifest.pl +++ b/src/bin/pg_verifybackup/t/005_bad_manifest.pl @@ -190,7 +190,7 @@ sub test_fatal_error my ($test_name, $manifest_contents) = @_; - test_bad_manifest($test_name, qr/fatal: $test_name/, $manifest_contents); + test_bad_manifest($test_name, qr/error: $test_name/, $manifest_contents); return; } diff --git a/src/bin/pg_waldump/nls.mk b/src/bin/pg_waldump/nls.mk index a3d5e88e4f..159638fc00 100644 --- a/src/bin/pg_waldump/nls.mk +++ b/src/bin/pg_waldump/nls.mk @@ -2,5 +2,5 @@ CATALOG_NAME = pg_waldump AVAIL_LANGUAGES = cs de el es fr ja ko ru sv tr uk vi zh_CN GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_waldump.c -GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) fatal_error -GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) fatal_error:1:c-format +GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) +GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 8bf6899d67..7b8b98cc96 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -72,7 +72,6 @@ typedef struct XLogDumpConfig bool filter_by_fpw; } XLogDumpConfig; -#define fatal_error(...) do { pg_log_fatal(__VA_ARGS__); exit(EXIT_FAILURE); } while(0) /* * When sigint is called, just tell the system to exit at the next possible @@ -158,7 +157,7 @@ open_file_in_directory(const char *directory, const char *fname) fd = open(fpath, O_RDONLY | PG_BINARY, 0); if (fd < 0 && errno != ENOENT) - fatal_error("could not open file \"%s\": %m", fname); + pg_fatal("could not open file \"%s\": %m", fname); return fd; } @@ -214,17 +213,17 @@ search_directory(const char *directory, const char *fname) WalSegSz = longhdr->xlp_seg_size; if (!IsValidWalSegSize(WalSegSz)) - fatal_error(ngettext("WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte", - "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes", - WalSegSz), - fname, WalSegSz); + pg_fatal(ngettext("WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte", + "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes", + WalSegSz), + fname, WalSegSz); } else if (r < 0) - fatal_error("could not read file \"%s\": %m", - fname); + pg_fatal("could not read file \"%s\": %m", + fname); else - fatal_error("could not read file \"%s\": read %d of %d", - fname, r, XLOG_BLCKSZ); + pg_fatal("could not read file \"%s\": read %d of %d", + fname, r, XLOG_BLCKSZ); close(fd); return true; } @@ -284,9 +283,9 @@ identify_target_directory(char *directory, char *fname) /* could not locate WAL file */ if (fname) - fatal_error("could not locate WAL file \"%s\"", fname); + pg_fatal("could not locate WAL file \"%s\"", fname); else - fatal_error("could not find any WAL file"); + pg_fatal("could not find any WAL file"); return NULL; /* not reached */ } @@ -327,7 +326,7 @@ WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, break; } - fatal_error("could not find file \"%s\": %m", fname); + pg_fatal("could not find file \"%s\": %m", fname); } /* @@ -376,13 +375,13 @@ WALDumpReadPage(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, if (errinfo.wre_errno != 0) { errno = errinfo.wre_errno; - fatal_error("could not read from file %s, offset %d: %m", - fname, errinfo.wre_off); + pg_fatal("could not read from file %s, offset %d: %m", + fname, errinfo.wre_off); } else - fatal_error("could not read from file %s, offset %d: read %d of %d", - fname, errinfo.wre_off, errinfo.wre_read, - errinfo.wre_req); + pg_fatal("could not read from file %s, offset %d: read %d of %d", + fname, errinfo.wre_off, errinfo.wre_read, + errinfo.wre_req); } return count; @@ -989,13 +988,13 @@ main(int argc, char **argv) waldir = directory; if (!verify_directory(waldir)) - fatal_error("could not open directory \"%s\": %m", waldir); + pg_fatal("could not open directory \"%s\": %m", waldir); } waldir = identify_target_directory(waldir, fname); fd = open_file_in_directory(waldir, fname); if (fd < 0) - fatal_error("could not open file \"%s\"", fname); + pg_fatal("could not open file \"%s\"", fname); close(fd); /* parse position from file */ @@ -1025,15 +1024,15 @@ main(int argc, char **argv) fd = open_file_in_directory(waldir, fname); if (fd < 0) - fatal_error("could not open file \"%s\"", fname); + pg_fatal("could not open file \"%s\"", fname); close(fd); /* parse position from file */ XLogFromFileName(fname, &private.timeline, &endsegno, WalSegSz); if (endsegno < segno) - fatal_error("ENDSEG %s is before STARTSEG %s", - argv[optind + 1], argv[optind]); + pg_fatal("ENDSEG %s is before STARTSEG %s", + argv[optind + 1], argv[optind]); if (XLogRecPtrIsInvalid(private.endptr)) XLogSegNoOffsetToRecPtr(endsegno + 1, 0, WalSegSz, @@ -1073,14 +1072,14 @@ main(int argc, char **argv) .segment_close = WALDumpCloseSegment), &private); if (!xlogreader_state) - fatal_error("out of memory while allocating a WAL reading processor"); + pg_fatal("out of memory while allocating a WAL reading processor"); /* first find a valid recptr to start from */ first_record = XLogFindNextRecord(xlogreader_state, private.startptr); if (first_record == InvalidXLogRecPtr) - fatal_error("could not find a valid record after %X/%X", - LSN_FORMAT_ARGS(private.startptr)); + pg_fatal("could not find a valid record after %X/%X", + LSN_FORMAT_ARGS(private.startptr)); /* * Display a message that we're skipping data if `from` wasn't a pointer @@ -1170,15 +1169,15 @@ main(int argc, char **argv) exit(0); if (errormsg) - fatal_error("error in WAL record at %X/%X: %s", - LSN_FORMAT_ARGS(xlogreader_state->ReadRecPtr), - errormsg); + pg_fatal("error in WAL record at %X/%X: %s", + LSN_FORMAT_ARGS(xlogreader_state->ReadRecPtr), + errormsg); XLogReaderFree(xlogreader_state); return EXIT_SUCCESS; bad_argument: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); return EXIT_FAILURE; } diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 4d4b979e4f..8a31ffa067 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -1502,8 +1502,7 @@ accumStats(StatsData *stats, bool skipped, double lat, double lag, break; default: /* internal error which should never occur */ - pg_log_fatal("unexpected error status: %d", estatus); - exit(1); + pg_fatal("unexpected error status: %d", estatus); } } @@ -1516,8 +1515,8 @@ executeStatement(PGconn *con, const char *sql) res = PQexec(con, sql); if (PQresultStatus(res) != PGRES_COMMAND_OK) { - pg_log_fatal("query failed: %s", PQerrorMessage(con)); - pg_log_info("query was: %s", sql); + pg_log_error("query failed: %s", PQerrorMessage(con)); + pg_log_error_detail("Query was: %s", sql); exit(1); } PQclear(res); @@ -1533,7 +1532,7 @@ tryExecuteStatement(PGconn *con, const char *sql) if (PQresultStatus(res) != PGRES_COMMAND_OK) { pg_log_error("%s", PQerrorMessage(con)); - pg_log_info("(ignoring this error and continuing anyway)"); + pg_log_error_detail("(ignoring this error and continuing anyway)"); } PQclear(res); } @@ -2878,8 +2877,7 @@ evaluateExpr(CState *st, PgBenchExpr *expr, PgBenchValue *retval) default: /* internal error which should never occur */ - pg_log_fatal("unexpected enode type in evaluation: %d", expr->etype); - exit(1); + pg_fatal("unexpected enode type in evaluation: %d", expr->etype); } } @@ -4447,8 +4445,7 @@ getResultString(bool skipped, EStatus estatus) return "deadlock"; default: /* internal error which should never occur */ - pg_log_fatal("unexpected error status: %d", estatus); - exit(1); + pg_fatal("unexpected error status: %d", estatus); } } else @@ -4901,10 +4898,7 @@ initGenerateDataClientSide(PGconn *con) res = PQexec(con, copy_statement); if (PQresultStatus(res) != PGRES_COPY_IN) - { - pg_log_fatal("unexpected copy in result: %s", PQerrorMessage(con)); - exit(1); - } + pg_fatal("unexpected copy in result: %s", PQerrorMessage(con)); PQclear(res); start = pg_time_now(); @@ -4918,10 +4912,7 @@ initGenerateDataClientSide(PGconn *con) INT64_FORMAT "\t" INT64_FORMAT "\t%d\t\n", j, k / naccounts + 1, 0); if (PQputline(con, sql.data)) - { - pg_log_fatal("PQputline failed"); - exit(1); - } + pg_fatal("PQputline failed"); if (CancelRequested) break; @@ -4963,15 +4954,9 @@ initGenerateDataClientSide(PGconn *con) fputc('\n', stderr); /* Need to move to next line */ if (PQputline(con, "\\.\n")) - { - pg_log_fatal("very last PQputline failed"); - exit(1); - } + pg_fatal("very last PQputline failed"); if (PQendcopy(con)) - { - pg_log_fatal("PQendcopy failed"); - exit(1); - } + pg_fatal("PQendcopy failed"); termPQExpBuffer(&sql); @@ -5111,17 +5096,14 @@ static void checkInitSteps(const char *initialize_steps) { if (initialize_steps[0] == '\0') - { - pg_log_fatal("no initialization steps specified"); - exit(1); - } + pg_fatal("no initialization steps specified"); for (const char *step = initialize_steps; *step != '\0'; step++) { if (strchr(ALL_INIT_STEPS " ", *step) == NULL) { - pg_log_fatal("unrecognized initialization step \"%c\"", *step); - pg_log_info("Allowed step characters are: \"" ALL_INIT_STEPS "\"."); + pg_log_error("unrecognized initialization step \"%c\"", *step); + pg_log_error_detail("Allowed step characters are: \"" ALL_INIT_STEPS "\"."); exit(1); } } @@ -5142,10 +5124,7 @@ runInitSteps(const char *initialize_steps) initPQExpBuffer(&stats); if ((con = doConnect()) == NULL) - { - pg_log_fatal("could not create connection for initialization"); - exit(1); - } + pg_fatal("could not create connection for initialization"); setup_cancel_handler(NULL); SetCancelConn(con); @@ -5188,7 +5167,7 @@ runInitSteps(const char *initialize_steps) case ' ': break; /* ignore */ default: - pg_log_fatal("unrecognized initialization step \"%c\"", *step); + pg_log_error("unrecognized initialization step \"%c\"", *step); PQfinish(con); exit(1); } @@ -5232,21 +5211,18 @@ GetTableInfo(PGconn *con, bool scale_given) { char *sqlState = PQresultErrorField(res, PG_DIAG_SQLSTATE); - pg_log_fatal("could not count number of branches: %s", PQerrorMessage(con)); + pg_log_error("could not count number of branches: %s", PQerrorMessage(con)); if (sqlState && strcmp(sqlState, ERRCODE_UNDEFINED_TABLE) == 0) - pg_log_info("Perhaps you need to do initialization (\"pgbench -i\") in database \"%s\"", - PQdb(con)); + pg_log_error_hint("Perhaps you need to do initialization (\"pgbench -i\") in database \"%s\".", + PQdb(con)); exit(1); } scale = atoi(PQgetvalue(res, 0, 0)); if (scale < 0) - { - pg_log_fatal("invalid count(*) from pgbench_branches: \"%s\"", - PQgetvalue(res, 0, 0)); - exit(1); - } + pg_fatal("invalid count(*) from pgbench_branches: \"%s\"", + PQgetvalue(res, 0, 0)); PQclear(res); /* warn if we override user-given -s switch */ @@ -5293,8 +5269,8 @@ GetTableInfo(PGconn *con, bool scale_given) * This case is unlikely as pgbench already found "pgbench_branches" * above to compute the scale. */ - pg_log_fatal("no pgbench_accounts table found in search_path"); - pg_log_info("Perhaps you need to do initialization (\"pgbench -i\") in database \"%s\".", PQdb(con)); + pg_log_error("no pgbench_accounts table found in search_path"); + pg_log_error_hint("Perhaps you need to do initialization (\"pgbench -i\") in database \"%s\".", PQdb(con)); exit(1); } else /* PQntupes(res) == 1 */ @@ -5316,8 +5292,7 @@ GetTableInfo(PGconn *con, bool scale_given) else { /* possibly a newer version with new partition method */ - pg_log_fatal("unexpected partition method: \"%s\"", ps); - exit(1); + pg_fatal("unexpected partition method: \"%s\"", ps); } } @@ -5409,7 +5384,7 @@ syntax_error(const char *source, int lineno, if (command != NULL) appendPQExpBuffer(&buf, " in command \"%s\"", command); - pg_log_fatal("%s", buf.data); + pg_log_error("%s", buf.data); termPQExpBuffer(&buf); @@ -5759,9 +5734,8 @@ process_backslash_command(PsqlScanState sstate, const char *source) static void ConditionError(const char *desc, int cmdn, const char *msg) { - pg_log_fatal("condition error in script \"%s\" command %d: %s", - desc, cmdn, msg); - exit(1); + pg_fatal("condition error in script \"%s\" command %d: %s", + desc, cmdn, msg); } /* @@ -5997,18 +5971,12 @@ process_file(const char *filename, int weight) if (strcmp(filename, "-") == 0) fd = stdin; else if ((fd = fopen(filename, "r")) == NULL) - { - pg_log_fatal("could not open file \"%s\": %m", filename); - exit(1); - } + pg_fatal("could not open file \"%s\": %m", filename); buf = read_file_contents(fd); if (ferror(fd)) - { - pg_log_fatal("could not read file \"%s\": %m", filename); - exit(1); - } + pg_fatal("could not read file \"%s\": %m", filename); if (fd != stdin) fclose(fd); @@ -6061,9 +6029,9 @@ findBuiltin(const char *name) /* error cases */ if (found == 0) - pg_log_fatal("no builtin script found for name \"%s\"", name); + pg_log_error("no builtin script found for name \"%s\"", name); else /* found > 1 */ - pg_log_fatal("ambiguous builtin name: %d builtin scripts found for prefix \"%s\"", found, name); + pg_log_error("ambiguous builtin name: %d builtin scripts found for prefix \"%s\"", found, name); listAvailableScripts(); exit(1); @@ -6095,16 +6063,10 @@ parseScriptWeight(const char *option, char **script) errno = 0; wtmp = strtol(sep + 1, &badp, 10); if (errno != 0 || badp == sep + 1 || *badp != '\0') - { - pg_log_fatal("invalid weight specification: %s", sep); - exit(1); - } + pg_fatal("invalid weight specification: %s", sep); if (wtmp > INT_MAX || wtmp < 0) - { - pg_log_fatal("weight specification out of range (0 .. %d): %lld", - INT_MAX, (long long) wtmp); - exit(1); - } + pg_fatal("weight specification out of range (0 .. %d): %lld", + INT_MAX, (long long) wtmp); weight = wtmp; } else @@ -6121,16 +6083,10 @@ static void addScript(const ParsedScript *script) { if (script->commands == NULL || script->commands[0] == NULL) - { - pg_log_fatal("empty command list for script \"%s\"", script->desc); - exit(1); - } + pg_fatal("empty command list for script \"%s\"", script->desc); if (num_scripts >= MAX_SCRIPTS) - { - pg_log_fatal("at most %d SQL scripts are allowed", MAX_SCRIPTS); - exit(1); - } + pg_fatal("at most %d SQL scripts are allowed", MAX_SCRIPTS); CheckConditional(script); @@ -6530,7 +6486,7 @@ set_random_seed(const char *seed) if (sscanf(seed, "%lu%c", &ulseed, &garbage) != 1) { pg_log_error("unrecognized random seed option \"%s\"", seed); - pg_log_info("Expecting an unsigned integer, \"time\" or \"rand\""); + pg_log_error_detail("Expecting an unsigned integer, \"time\" or \"rand\"."); return false; } iseed = (uint64) ulseed; @@ -6664,10 +6620,7 @@ main(int argc, char **argv) /* set random seed early, because it may be used while parsing scripts. */ if (!set_random_seed(getenv("PGBENCH_RANDOM_SEED"))) - { - pg_log_fatal("error while setting random seed from PGBENCH_RANDOM_SEED environment variable"); - exit(1); - } + pg_fatal("error while setting random seed from PGBENCH_RANDOM_SEED environment variable"); while ((c = getopt_long(argc, argv, "iI:h:nvp:dqb:SNc:j:Crs:t:T:U:lf:D:F:M:P:R:L:", long_options, &optindex)) != -1) { @@ -6714,15 +6667,12 @@ main(int argc, char **argv) #else /* but BSD doesn't ... */ if (getrlimit(RLIMIT_OFILE, &rlim) == -1) #endif /* RLIMIT_NOFILE */ - { - pg_log_fatal("getrlimit failed: %m"); - exit(1); - } + pg_fatal("getrlimit failed: %m"); if (rlim.rlim_cur < nclients + 3) { - pg_log_fatal("need at least %d open files, but system limit is %ld", + pg_log_error("need at least %d open files, but system limit is %ld", nclients + 3, (long) rlim.rlim_cur); - pg_log_info("Reduce number of clients, or use limit/ulimit to increase the system limit."); + pg_log_error_hint("Reduce number of clients, or use limit/ulimit to increase the system limit."); exit(1); } #endif /* HAVE_GETRLIMIT */ @@ -6736,10 +6686,7 @@ main(int argc, char **argv) } #ifndef ENABLE_THREAD_SAFETY if (nthreads != 1) - { - pg_log_fatal("threads are not supported on this platform; use -j1"); - exit(1); - } + pg_fatal("threads are not supported on this platform; use -j1"); #endif /* !ENABLE_THREAD_SAFETY */ break; case 'C': @@ -6812,10 +6759,7 @@ main(int argc, char **argv) benchmarking_option_set = true; if ((p = strchr(optarg, '=')) == NULL || p == optarg || *(p + 1) == '\0') - { - pg_log_fatal("invalid variable definition: \"%s\"", optarg); - exit(1); - } + pg_fatal("invalid variable definition: \"%s\"", optarg); *p++ = '\0'; if (!putVariable(&state[0].variables, "option", optarg, p)) @@ -6834,10 +6778,7 @@ main(int argc, char **argv) if (strcmp(optarg, QUERYMODE[querymode]) == 0) break; if (querymode >= NUM_QUERYMODE) - { - pg_log_fatal("invalid query mode (-M): \"%s\"", optarg); - exit(1); - } + pg_fatal("invalid query mode (-M): \"%s\"", optarg); break; case 'P': benchmarking_option_set = true; @@ -6853,10 +6794,7 @@ main(int argc, char **argv) benchmarking_option_set = true; if (throttle_value <= 0.0) - { - pg_log_fatal("invalid rate limit: \"%s\"", optarg); - exit(1); - } + pg_fatal("invalid rate limit: \"%s\"", optarg); /* Invert rate limit into per-transaction delay in usec */ throttle_delay = 1000000.0 / throttle_value; } @@ -6866,10 +6804,7 @@ main(int argc, char **argv) double limit_ms = atof(optarg); if (limit_ms <= 0.0) - { - pg_log_fatal("invalid latency limit: \"%s\"", optarg); - exit(1); - } + pg_fatal("invalid latency limit: \"%s\"", optarg); benchmarking_option_set = true; latency_limit = (int64) (limit_ms * 1000); } @@ -6890,10 +6825,7 @@ main(int argc, char **argv) benchmarking_option_set = true; sample_rate = atof(optarg); if (sample_rate <= 0.0 || sample_rate > 1.0) - { - pg_log_fatal("invalid sampling rate: \"%s\"", optarg); - exit(1); - } + pg_fatal("invalid sampling rate: \"%s\"", optarg); break; case 5: /* aggregate-interval */ benchmarking_option_set = true; @@ -6916,10 +6848,7 @@ main(int argc, char **argv) case 9: /* random-seed */ benchmarking_option_set = true; if (!set_random_seed(optarg)) - { - pg_log_fatal("error while setting random seed from --random-seed option"); - exit(1); - } + pg_fatal("error while setting random seed from --random-seed option"); break; case 10: /* list */ { @@ -6942,11 +6871,8 @@ main(int argc, char **argv) else if (pg_strcasecmp(optarg, "hash") == 0) partition_method = PART_HASH; else - { - pg_log_fatal("invalid partition method, expecting \"range\" or \"hash\", got: \"%s\"", - optarg); - exit(1); - } + pg_fatal("invalid partition method, expecting \"range\" or \"hash\", got: \"%s\"", + optarg); break; case 13: /* failures-detailed */ benchmarking_option_set = true; @@ -6957,10 +6883,7 @@ main(int argc, char **argv) int32 max_tries_arg = atoi(optarg); if (max_tries_arg < 0) - { - pg_log_fatal("invalid number of maximum tries: \"%s\"", optarg); - exit(1); - } + pg_fatal("invalid number of maximum tries: \"%s\"", optarg); benchmarking_option_set = true; max_tries = (uint32) max_tries_arg; @@ -6971,9 +6894,9 @@ main(int argc, char **argv) verbose_errors = true; break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); - break; } } @@ -6999,10 +6922,7 @@ main(int argc, char **argv) } if (total_weight == 0 && !is_init_mode) - { - pg_log_fatal("total script weight must not be zero"); - exit(1); - } + pg_fatal("total script weight must not be zero"); /* show per script stats if several scripts are used */ if (num_scripts > 1) @@ -7037,25 +6957,19 @@ main(int argc, char **argv) if (optind < argc) { - pg_log_fatal("too many command-line arguments (first is \"%s\")", + pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (is_init_mode) { if (benchmarking_option_set) - { - pg_log_fatal("some of the specified options cannot be used in initialization (-i) mode"); - exit(1); - } + pg_fatal("some of the specified options cannot be used in initialization (-i) mode"); if (partitions == 0 && partition_method != PART_NONE) - { - pg_log_fatal("--partition-method requires greater than zero --partitions"); - exit(1); - } + pg_fatal("--partition-method requires greater than zero --partitions"); /* set default method */ if (partitions > 0 && partition_method == PART_NONE) @@ -7091,17 +7005,11 @@ main(int argc, char **argv) else { if (initialization_option_set) - { - pg_log_fatal("some of the specified options cannot be used in benchmarking mode"); - exit(1); - } + pg_fatal("some of the specified options cannot be used in benchmarking mode"); } if (nxacts > 0 && duration > 0) - { - pg_log_fatal("specify either a number of transactions (-t) or a duration (-T), not both"); - exit(1); - } + pg_fatal("specify either a number of transactions (-t) or a duration (-T), not both"); /* Use DEFAULT_NXACTS if neither nxacts nor duration is specified. */ if (nxacts <= 0 && duration <= 0) @@ -7109,55 +7017,31 @@ main(int argc, char **argv) /* --sampling-rate may be used only with -l */ if (sample_rate > 0.0 && !use_log) - { - pg_log_fatal("log sampling (--sampling-rate) is allowed only when logging transactions (-l)"); - exit(1); - } + pg_fatal("log sampling (--sampling-rate) is allowed only when logging transactions (-l)"); /* --sampling-rate may not be used with --aggregate-interval */ if (sample_rate > 0.0 && agg_interval > 0) - { - pg_log_fatal("log sampling (--sampling-rate) and aggregation (--aggregate-interval) cannot be used at the same time"); - exit(1); - } + pg_fatal("log sampling (--sampling-rate) and aggregation (--aggregate-interval) cannot be used at the same time"); if (agg_interval > 0 && !use_log) - { - pg_log_fatal("log aggregation is allowed only when actually logging transactions"); - exit(1); - } + pg_fatal("log aggregation is allowed only when actually logging transactions"); if (!use_log && logfile_prefix) - { - pg_log_fatal("log file prefix (--log-prefix) is allowed only when logging transactions (-l)"); - exit(1); - } + pg_fatal("log file prefix (--log-prefix) is allowed only when logging transactions (-l)"); if (duration > 0 && agg_interval > duration) - { - pg_log_fatal("number of seconds for aggregation (%d) must not be higher than test duration (%d)", agg_interval, duration); - exit(1); - } + pg_fatal("number of seconds for aggregation (%d) must not be higher than test duration (%d)", agg_interval, duration); if (duration > 0 && agg_interval > 0 && duration % agg_interval != 0) - { - pg_log_fatal("duration (%d) must be a multiple of aggregation interval (%d)", duration, agg_interval); - exit(1); - } + pg_fatal("duration (%d) must be a multiple of aggregation interval (%d)", duration, agg_interval); if (progress_timestamp && progress == 0) - { - pg_log_fatal("--progress-timestamp is allowed only under --progress"); - exit(1); - } + pg_fatal("--progress-timestamp is allowed only under --progress"); if (!max_tries) { if (!latency_limit && duration <= 0) - { - pg_log_fatal("an unlimited number of transaction tries can only be used with --latency-limit or a duration (-T)"); - exit(1); - } + pg_fatal("an unlimited number of transaction tries can only be used with --latency-limit or a duration (-T)"); } /* @@ -7207,10 +7091,7 @@ main(int argc, char **argv) /* opening connection... */ con = doConnect(); if (con == NULL) - { - pg_log_fatal("could not create connection for setup"); - exit(1); - } + pg_fatal("could not create connection for setup"); /* report pgbench and server versions */ printVersion(con); @@ -7318,10 +7199,7 @@ main(int argc, char **argv) errno = THREAD_BARRIER_INIT(&barrier, nthreads); if (errno != 0) - { - pg_log_fatal("could not initialize barrier: %m"); - exit(1); - } + pg_fatal("could not initialize barrier: %m"); #ifdef ENABLE_THREAD_SAFETY /* start all threads but thread 0 which is executed directly later */ @@ -7333,10 +7211,7 @@ main(int argc, char **argv) errno = THREAD_CREATE(&thread->thread, threadRun, thread); if (errno != 0) - { - pg_log_fatal("could not create thread: %m"); - exit(1); - } + pg_fatal("could not create thread: %m"); } #else Assert(nthreads == 1); @@ -7404,7 +7279,7 @@ main(int argc, char **argv) THREAD_BARRIER_DESTROY(&barrier); if (exit_code != 0) - pg_log_fatal("Run was aborted; the above results are incomplete."); + pg_log_error("Run was aborted; the above results are incomplete."); return exit_code; } @@ -7438,10 +7313,7 @@ threadRun(void *arg) thread->logfile = fopen(logpath, "w"); if (thread->logfile == NULL) - { - pg_log_fatal("could not open logfile \"%s\": %m", logpath); - exit(1); - } + pg_fatal("could not open logfile \"%s\": %m", logpath); } /* explicitly initialize the state machines */ @@ -7466,9 +7338,8 @@ threadRun(void *arg) if ((state[i].con = doConnect()) == NULL) { /* coldly abort on initial connection failure */ - pg_log_fatal("could not create connection for client %d", - state[i].id); - exit(1); + pg_fatal("could not create connection for client %d", + state[i].id); } } } @@ -7738,10 +7609,7 @@ setalarm(int seconds) !CreateTimerQueueTimer(&timer, queue, win32_timer_callback, NULL, seconds * 1000, 0, WT_EXECUTEINTIMERTHREAD | WT_EXECUTEONLYONCE)) - { - pg_log_fatal("failed to set timer"); - exit(1); - } + pg_fatal("failed to set timer"); } #endif /* WIN32 */ @@ -7885,8 +7753,7 @@ add_socket_to_set(socket_set *sa, int fd, int idx) * Doing a hard exit here is a bit grotty, but it doesn't seem worth * complicating the API to make it less grotty. */ - pg_log_fatal("too many client connections for select()"); - exit(1); + pg_fatal("too many client connections for select()"); } FD_SET(fd, &sa->fds); if (fd > sa->maxfd) diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index db071d561f..b51d28780b 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -232,7 +232,7 @@ HandleSlashCmds(PsqlScanState scan_state, { pg_log_error("invalid command \\%s", cmd); if (pset.cur_cmd_interactive) - pg_log_info("Try \\? for help."); + pg_log_error_hint("Try \\? for help."); status = PSQL_CMD_ERROR; } diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index 5a707dab64..feb1d547d4 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -304,7 +304,7 @@ CheckConnection(void) { if (!pset.cur_cmd_interactive) { - pg_log_fatal("connection to server was lost"); + pg_log_error("connection to server was lost"); exit(EXIT_BADCONN); } diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index 1d3601e594..49eb116f33 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -58,10 +58,7 @@ usage(unsigned short int pager) { user = get_user_name(&errstr); if (!user) - { - pg_log_fatal("%s", errstr); - exit(EXIT_FAILURE); - } + pg_fatal("%s", errstr); } /* diff --git a/src/bin/psql/mainloop.c b/src/bin/psql/mainloop.c index e5c976fc4f..b0c4177a20 100644 --- a/src/bin/psql/mainloop.c +++ b/src/bin/psql/mainloop.c @@ -77,10 +77,7 @@ MainLoop(FILE *source) if (PQExpBufferBroken(query_buf) || PQExpBufferBroken(previous_buf) || PQExpBufferBroken(history_buf)) - { - pg_log_error("out of memory"); - exit(EXIT_FAILURE); - } + pg_fatal("out of memory"); /* main loop to get queries and execute them */ while (successResult == EXIT_SUCCESS) @@ -398,10 +395,7 @@ MainLoop(FILE *source) prompt_status = prompt_tmp; if (PQExpBufferBroken(query_buf)) - { - pg_log_error("out of memory"); - exit(EXIT_FAILURE); - } + pg_fatal("out of memory"); /* * Increase statement line number counter for each linebreak added diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c index d08b15886a..ddff903915 100644 --- a/src/bin/psql/startup.c +++ b/src/bin/psql/startup.c @@ -217,10 +217,7 @@ main(int argc, char *argv[]) /* Bail out if -1 was specified but will be ignored. */ if (options.single_txn && options.actions.head == NULL) - { - pg_log_fatal("-1 can only be used in non-interactive mode"); - exit(EXIT_FAILURE); - } + pg_fatal("-1 can only be used in non-interactive mode"); if (!pset.popt.topt.fieldSep.separator && !pset.popt.topt.fieldSep.separator_zero) @@ -343,11 +340,8 @@ main(int argc, char *argv[]) { pset.logfile = fopen(options.logfilename, "a"); if (!pset.logfile) - { - pg_log_fatal("could not open log file \"%s\": %m", - options.logfilename); - exit(EXIT_FAILURE); - } + pg_fatal("could not open log file \"%s\": %m", + options.logfilename); } if (!options.no_psqlrc) @@ -608,10 +602,7 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts *options) } if (!result) - { - pg_log_fatal("could not set printing parameter \"%s\"", value); - exit(EXIT_FAILURE); - } + pg_fatal("could not set printing parameter \"%s\"", value); free(value); break; @@ -717,10 +708,10 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts *options) break; default: unknown_option: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), - pset.progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", + pset.progname); exit(EXIT_FAILURE); - break; } } @@ -782,10 +773,7 @@ process_psqlrc(char *argv0) char *envrc = getenv("PSQLRC"); if (find_my_exec(argv0, my_exec_path) < 0) - { - pg_log_fatal("could not find own program executable"); - exit(EXIT_FAILURE); - } + pg_fatal("could not find own program executable"); get_etc_path(my_exec_path, etc_path); diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl index 8ecb9b2583..98996d9a37 100644 --- a/src/bin/psql/t/001_basic.pl +++ b/src/bin/psql/t/001_basic.pl @@ -129,7 +129,7 @@ sub psql_fails_like psql::2: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. -psql::2: fatal: connection to server was lost', +psql::2: error: connection to server was lost', 'server crash: error message'); # test \errverbose diff --git a/src/bin/scripts/clusterdb.c b/src/bin/scripts/clusterdb.c index 4c97bd41d7..df1766679b 100644 --- a/src/bin/scripts/clusterdb.c +++ b/src/bin/scripts/clusterdb.c @@ -109,7 +109,8 @@ main(int argc, char *argv[]) maintenance_db = pg_strdup(optarg); break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -128,7 +129,7 @@ main(int argc, char *argv[]) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -144,16 +145,10 @@ main(int argc, char *argv[]) if (alldb) { if (dbname) - { - pg_log_error("cannot cluster all databases and a specific one at the same time"); - exit(1); - } + pg_fatal("cannot cluster all databases and a specific one at the same time"); if (tables.head != NULL) - { - pg_log_error("cannot cluster specific table(s) in all databases"); - exit(1); - } + pg_fatal("cannot cluster specific table(s) in all databases"); cparams.dbname = maintenance_db; diff --git a/src/bin/scripts/createdb.c b/src/bin/scripts/createdb.c index 0bffa2f3ee..e523e58b21 100644 --- a/src/bin/scripts/createdb.c +++ b/src/bin/scripts/createdb.c @@ -135,7 +135,8 @@ main(int argc, char *argv[]) icu_locale = pg_strdup(optarg); break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -154,22 +155,16 @@ main(int argc, char *argv[]) default: pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind + 2]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (locale) { if (lc_ctype) - { - pg_log_error("only one of --locale and --lc-ctype can be specified"); - exit(1); - } + pg_fatal("only one of --locale and --lc-ctype can be specified"); if (lc_collate) - { - pg_log_error("only one of --locale and --lc-collate can be specified"); - exit(1); - } + pg_fatal("only one of --locale and --lc-collate can be specified"); lc_ctype = locale; lc_collate = locale; } @@ -177,10 +172,7 @@ main(int argc, char *argv[]) if (encoding) { if (pg_char_to_encoding(encoding) < 0) - { - pg_log_error("\"%s\" is not a valid encoding name", encoding); - exit(1); - } + pg_fatal("\"%s\" is not a valid encoding name", encoding); } if (dbname == NULL) diff --git a/src/bin/scripts/createuser.c b/src/bin/scripts/createuser.c index d6ce04a809..bfba0d09d1 100644 --- a/src/bin/scripts/createuser.c +++ b/src/bin/scripts/createuser.c @@ -166,7 +166,8 @@ main(int argc, char *argv[]) interactive = true; break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -181,7 +182,7 @@ main(int argc, char *argv[]) default: pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind + 1]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -274,11 +275,8 @@ main(int argc, char *argv[]) newuser, NULL); if (!encrypted_password) - { - pg_log_error("password encryption failed: %s", - PQerrorMessage(conn)); - exit(1); - } + pg_fatal("password encryption failed: %s", + PQerrorMessage(conn)); appendStringLiteralConn(&sql, encrypted_password, conn); PQfreemem(encrypted_password); } diff --git a/src/bin/scripts/dropdb.c b/src/bin/scripts/dropdb.c index 7e321dd11b..afc00dac78 100644 --- a/src/bin/scripts/dropdb.c +++ b/src/bin/scripts/dropdb.c @@ -100,7 +100,8 @@ main(int argc, char *argv[]) maintenance_db = pg_strdup(optarg); break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -109,7 +110,7 @@ main(int argc, char *argv[]) { case 0: pg_log_error("missing required argument database name"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); case 1: dbname = argv[optind]; @@ -117,7 +118,7 @@ main(int argc, char *argv[]) default: pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind + 1]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } diff --git a/src/bin/scripts/dropuser.c b/src/bin/scripts/dropuser.c index dfe4a5088c..82c1f35ab2 100644 --- a/src/bin/scripts/dropuser.c +++ b/src/bin/scripts/dropuser.c @@ -91,7 +91,8 @@ main(int argc, char *argv[]) /* this covers the long options */ break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -106,7 +107,7 @@ main(int argc, char *argv[]) default: pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind + 1]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -119,7 +120,7 @@ main(int argc, char *argv[]) else { pg_log_error("missing required argument role name"); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } diff --git a/src/bin/scripts/pg_isready.c b/src/bin/scripts/pg_isready.c index a7653b3eaf..1aa834742d 100644 --- a/src/bin/scripts/pg_isready.c +++ b/src/bin/scripts/pg_isready.c @@ -93,7 +93,8 @@ main(int argc, char **argv) pguser = pg_strdup(optarg); break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); /* * We need to make sure we don't return 1 here because someone @@ -107,7 +108,7 @@ main(int argc, char **argv) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); /* * We need to make sure we don't return 1 here because someone diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c index c292d43203..f3b03ec325 100644 --- a/src/bin/scripts/reindexdb.c +++ b/src/bin/scripts/reindexdb.c @@ -170,7 +170,8 @@ main(int argc, char *argv[]) tablespace = pg_strdup(optarg); break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -189,7 +190,7 @@ main(int argc, char *argv[]) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } @@ -205,30 +206,15 @@ main(int argc, char *argv[]) if (alldb) { if (dbname) - { - pg_log_error("cannot reindex all databases and a specific one at the same time"); - exit(1); - } + pg_fatal("cannot reindex all databases and a specific one at the same time"); if (syscatalog) - { - pg_log_error("cannot reindex all databases and system catalogs at the same time"); - exit(1); - } + pg_fatal("cannot reindex all databases and system catalogs at the same time"); if (schemas.head != NULL) - { - pg_log_error("cannot reindex specific schema(s) in all databases"); - exit(1); - } + pg_fatal("cannot reindex specific schema(s) in all databases"); if (tables.head != NULL) - { - pg_log_error("cannot reindex specific table(s) in all databases"); - exit(1); - } + pg_fatal("cannot reindex specific table(s) in all databases"); if (indexes.head != NULL) - { - pg_log_error("cannot reindex specific index(es) in all databases"); - exit(1); - } + pg_fatal("cannot reindex specific index(es) in all databases"); cparams.dbname = maintenance_db; @@ -238,26 +224,14 @@ main(int argc, char *argv[]) else if (syscatalog) { if (schemas.head != NULL) - { - pg_log_error("cannot reindex specific schema(s) and system catalogs at the same time"); - exit(1); - } + pg_fatal("cannot reindex specific schema(s) and system catalogs at the same time"); if (tables.head != NULL) - { - pg_log_error("cannot reindex specific table(s) and system catalogs at the same time"); - exit(1); - } + pg_fatal("cannot reindex specific table(s) and system catalogs at the same time"); if (indexes.head != NULL) - { - pg_log_error("cannot reindex specific index(es) and system catalogs at the same time"); - exit(1); - } + pg_fatal("cannot reindex specific index(es) and system catalogs at the same time"); if (concurrentCons > 1) - { - pg_log_error("cannot use multiple jobs to reindex system catalogs"); - exit(1); - } + pg_fatal("cannot use multiple jobs to reindex system catalogs"); if (dbname == NULL) { @@ -283,10 +257,7 @@ main(int argc, char *argv[]) * depending on the same relation. */ if (concurrentCons > 1 && indexes.head != NULL) - { - pg_log_error("cannot use multiple jobs to reindex indexes"); - exit(1); - } + pg_fatal("cannot use multiple jobs to reindex indexes"); if (dbname == NULL) { @@ -349,17 +320,15 @@ reindex_one_database(ConnParams *cparams, ReindexType type, if (concurrently && PQserverVersion(conn) < 120000) { PQfinish(conn); - pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL %s", - "concurrently", "12"); - exit(1); + pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", + "concurrently", "12"); } if (tablespace && PQserverVersion(conn) < 140000) { PQfinish(conn); - pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL %s", - "tablespace", "14"); - exit(1); + pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", + "tablespace", "14"); } if (!parallel) diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c index 4f6917fd39..92f1ffe147 100644 --- a/src/bin/scripts/vacuumdb.c +++ b/src/bin/scripts/vacuumdb.c @@ -237,7 +237,8 @@ main(int argc, char *argv[]) vacopts.process_toast = false; break; default: - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -256,54 +257,33 @@ main(int argc, char *argv[]) { pg_log_error("too many command-line arguments (first is \"%s\")", argv[optind]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } if (vacopts.analyze_only) { if (vacopts.full) - { - pg_log_error("cannot use the \"%s\" option when performing only analyze", - "full"); - exit(1); - } + pg_fatal("cannot use the \"%s\" option when performing only analyze", + "full"); if (vacopts.freeze) - { - pg_log_error("cannot use the \"%s\" option when performing only analyze", - "freeze"); - exit(1); - } + pg_fatal("cannot use the \"%s\" option when performing only analyze", + "freeze"); if (vacopts.disable_page_skipping) - { - pg_log_error("cannot use the \"%s\" option when performing only analyze", - "disable-page-skipping"); - exit(1); - } + pg_fatal("cannot use the \"%s\" option when performing only analyze", + "disable-page-skipping"); if (vacopts.no_index_cleanup) - { - pg_log_error("cannot use the \"%s\" option when performing only analyze", - "no-index-cleanup"); - exit(1); - } + pg_fatal("cannot use the \"%s\" option when performing only analyze", + "no-index-cleanup"); if (vacopts.force_index_cleanup) - { - pg_log_error("cannot use the \"%s\" option when performing only analyze", - "force-index-cleanup"); - exit(1); - } + pg_fatal("cannot use the \"%s\" option when performing only analyze", + "force-index-cleanup"); if (!vacopts.do_truncate) - { - pg_log_error("cannot use the \"%s\" option when performing only analyze", - "no-truncate"); - exit(1); - } + pg_fatal("cannot use the \"%s\" option when performing only analyze", + "no-truncate"); if (!vacopts.process_toast) - { - pg_log_error("cannot use the \"%s\" option when performing only analyze", - "no-process-toast"); - exit(1); - } + pg_fatal("cannot use the \"%s\" option when performing only analyze", + "no-process-toast"); /* allow 'and_analyze' with 'analyze_only' */ } @@ -311,26 +291,17 @@ main(int argc, char *argv[]) if (vacopts.parallel_workers >= 0) { if (vacopts.analyze_only) - { - pg_log_error("cannot use the \"%s\" option when performing only analyze", - "parallel"); - exit(1); - } + pg_fatal("cannot use the \"%s\" option when performing only analyze", + "parallel"); if (vacopts.full) - { - pg_log_error("cannot use the \"%s\" option when performing full vacuum", - "parallel"); - exit(1); - } + pg_fatal("cannot use the \"%s\" option when performing full vacuum", + "parallel"); } /* Prohibit --no-index-cleanup and --force-index-cleanup together */ if (vacopts.no_index_cleanup && vacopts.force_index_cleanup) - { - pg_log_error("cannot use the \"%s\" option with the \"%s\" option", - "no-index-cleanup", "force-index-cleanup"); - exit(1); - } + pg_fatal("cannot use the \"%s\" option with the \"%s\" option", + "no-index-cleanup", "force-index-cleanup"); /* fill cparams except for dbname, which is set below */ cparams.pghost = host; @@ -348,15 +319,9 @@ main(int argc, char *argv[]) if (alldb) { if (dbname) - { - pg_log_error("cannot vacuum all databases and a specific one at the same time"); - exit(1); - } + pg_fatal("cannot vacuum all databases and a specific one at the same time"); if (tables.head != NULL) - { - pg_log_error("cannot vacuum specific table(s) in all databases"); - exit(1); - } + pg_fatal("cannot vacuum specific table(s) in all databases"); cparams.dbname = maintenance_db; @@ -457,71 +422,56 @@ vacuum_one_database(ConnParams *cparams, if (vacopts->disable_page_skipping && PQserverVersion(conn) < 90600) { PQfinish(conn); - pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL %s", - "disable-page-skipping", "9.6"); - exit(1); + pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", + "disable-page-skipping", "9.6"); } if (vacopts->no_index_cleanup && PQserverVersion(conn) < 120000) { PQfinish(conn); - pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL %s", - "no-index-cleanup", "12"); - exit(1); + pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", + "no-index-cleanup", "12"); } if (vacopts->force_index_cleanup && PQserverVersion(conn) < 120000) { PQfinish(conn); - pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL %s", - "force-index-cleanup", "12"); - exit(1); + pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", + "force-index-cleanup", "12"); } if (!vacopts->do_truncate && PQserverVersion(conn) < 120000) { PQfinish(conn); - pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL %s", - "no-truncate", "12"); - exit(1); + pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", + "no-truncate", "12"); } if (!vacopts->process_toast && PQserverVersion(conn) < 140000) { PQfinish(conn); - pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL %s", - "no-process-toast", "14"); - exit(1); + pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", + "no-process-toast", "14"); } if (vacopts->skip_locked && PQserverVersion(conn) < 120000) { PQfinish(conn); - pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL %s", - "skip-locked", "12"); - exit(1); + pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", + "skip-locked", "12"); } if (vacopts->min_xid_age != 0 && PQserverVersion(conn) < 90600) - { - pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL %s", - "--min-xid-age", "9.6"); - exit(1); - } + pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", + "--min-xid-age", "9.6"); if (vacopts->min_mxid_age != 0 && PQserverVersion(conn) < 90600) - { - pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL %s", - "--min-mxid-age", "9.6"); - exit(1); - } + pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", + "--min-mxid-age", "9.6"); if (vacopts->parallel_workers >= 0 && PQserverVersion(conn) < 130000) - { - pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL %s", - "--parallel", "13"); - exit(1); - } + pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", + "--parallel", "13"); if (!quiet) { diff --git a/src/common/controldata_utils.c b/src/common/controldata_utils.c index 348f046a44..4c0da6e124 100644 --- a/src/common/controldata_utils.c +++ b/src/common/controldata_utils.c @@ -70,11 +70,8 @@ get_controlfile(const char *DataDir, bool *crc_ok_p) ControlFilePath))); #else if ((fd = open(ControlFilePath, O_RDONLY | PG_BINARY, 0)) == -1) - { - pg_log_fatal("could not open file \"%s\" for reading: %m", - ControlFilePath); - exit(EXIT_FAILURE); - } + pg_fatal("could not open file \"%s\" for reading: %m", + ControlFilePath); #endif r = read(fd, ControlFile, sizeof(ControlFileData)); @@ -86,10 +83,7 @@ get_controlfile(const char *DataDir, bool *crc_ok_p) (errcode_for_file_access(), errmsg("could not read file \"%s\": %m", ControlFilePath))); #else - { - pg_log_fatal("could not read file \"%s\": %m", ControlFilePath); - exit(EXIT_FAILURE); - } + pg_fatal("could not read file \"%s\": %m", ControlFilePath); #endif else #ifndef FRONTEND @@ -98,11 +92,8 @@ get_controlfile(const char *DataDir, bool *crc_ok_p) errmsg("could not read file \"%s\": read %d of %zu", ControlFilePath, r, sizeof(ControlFileData)))); #else - { - pg_log_fatal("could not read file \"%s\": read %d of %zu", - ControlFilePath, r, sizeof(ControlFileData)); - exit(EXIT_FAILURE); - } + pg_fatal("could not read file \"%s\": read %d of %zu", + ControlFilePath, r, sizeof(ControlFileData)); #endif } @@ -114,10 +105,7 @@ get_controlfile(const char *DataDir, bool *crc_ok_p) ControlFilePath))); #else if (close(fd) != 0) - { - pg_log_fatal("could not close file \"%s\": %m", ControlFilePath); - exit(EXIT_FAILURE); - } + pg_fatal("could not close file \"%s\": %m", ControlFilePath); #endif /* Check the CRC. */ @@ -203,10 +191,7 @@ update_controlfile(const char *DataDir, #else if ((fd = open(ControlFilePath, O_WRONLY | PG_BINARY, pg_file_create_mode)) == -1) - { - pg_log_fatal("could not open file \"%s\": %m", ControlFilePath); - exit(EXIT_FAILURE); - } + pg_fatal("could not open file \"%s\": %m", ControlFilePath); #endif errno = 0; @@ -225,8 +210,7 @@ update_controlfile(const char *DataDir, errmsg("could not write file \"%s\": %m", ControlFilePath))); #else - pg_log_fatal("could not write file \"%s\": %m", ControlFilePath); - exit(EXIT_FAILURE); + pg_fatal("could not write file \"%s\": %m", ControlFilePath); #endif } #ifndef FRONTEND @@ -245,10 +229,7 @@ update_controlfile(const char *DataDir, pgstat_report_wait_end(); #else if (fsync(fd) != 0) - { - pg_log_fatal("could not fsync file \"%s\": %m", ControlFilePath); - exit(EXIT_FAILURE); - } + pg_fatal("could not fsync file \"%s\": %m", ControlFilePath); #endif } @@ -260,8 +241,7 @@ update_controlfile(const char *DataDir, errmsg("could not close file \"%s\": %m", ControlFilePath))); #else - pg_log_fatal("could not close file \"%s\": %m", ControlFilePath); - exit(EXIT_FAILURE); + pg_fatal("could not close file \"%s\": %m", ControlFilePath); #endif } } diff --git a/src/common/file_utils.c b/src/common/file_utils.c index 7138068633..19d308ad1f 100644 --- a/src/common/file_utils.c +++ b/src/common/file_utils.c @@ -300,7 +300,7 @@ fsync_fname(const char *fname, bool isdir) */ if (returncode != 0 && !(isdir && (errno == EBADF || errno == EINVAL))) { - pg_log_fatal("could not fsync file \"%s\": %m", fname); + pg_log_error("could not fsync file \"%s\": %m", fname); (void) close(fd); exit(EXIT_FAILURE); } @@ -370,7 +370,7 @@ durable_rename(const char *oldfile, const char *newfile) { if (fsync(fd) != 0) { - pg_log_fatal("could not fsync file \"%s\": %m", newfile); + pg_log_error("could not fsync file \"%s\": %m", newfile); close(fd); exit(EXIT_FAILURE); } @@ -448,7 +448,7 @@ get_dirent_type(const char *path, { result = PGFILETYPE_ERROR; #ifdef FRONTEND - pg_log_generic(elevel, "could not stat file \"%s\": %m", path); + pg_log_generic(elevel, PG_LOG_PRIMARY, "could not stat file \"%s\": %m", path); #else ereport(elevel, (errcode_for_file_access(), diff --git a/src/common/logging.c b/src/common/logging.c index 9a076bb812..18d6669f27 100644 --- a/src/common/logging.c +++ b/src/common/logging.c @@ -151,6 +151,9 @@ pg_logging_init(const char *argv0) } } +/* + * Change the logging flags. + */ void pg_logging_config(int new_flags) { @@ -194,17 +197,19 @@ pg_logging_set_locus_callback(void (*cb) (const char **filename, uint64 *lineno) } void -pg_log_generic(enum pg_log_level level, const char *pg_restrict fmt,...) +pg_log_generic(enum pg_log_level level, enum pg_log_part part, + const char *pg_restrict fmt,...) { va_list ap; va_start(ap, fmt); - pg_log_generic_v(level, fmt, ap); + pg_log_generic_v(level, part, fmt, ap); va_end(ap); } void -pg_log_generic_v(enum pg_log_level level, const char *pg_restrict fmt, va_list ap) +pg_log_generic_v(enum pg_log_level level, enum pg_log_part part, + const char *pg_restrict fmt, va_list ap) { int save_errno = errno; const char *filename = NULL; @@ -232,7 +237,8 @@ pg_log_generic_v(enum pg_log_level level, const char *pg_restrict fmt, va_list a fmt = _(fmt); - if (!(log_flags & PG_LOG_FLAG_TERSE) || filename) + if (part == PG_LOG_PRIMARY && + (!(log_flags & PG_LOG_FLAG_TERSE) || filename)) { if (sgr_locus) fprintf(stderr, ANSI_ESCAPE_FMT, sgr_locus); @@ -251,30 +257,34 @@ pg_log_generic_v(enum pg_log_level level, const char *pg_restrict fmt, va_list a if (!(log_flags & PG_LOG_FLAG_TERSE)) { - switch (level) + switch (part) { - case PG_LOG_FATAL: - if (sgr_error) - fprintf(stderr, ANSI_ESCAPE_FMT, sgr_error); - fprintf(stderr, _("fatal: ")); - if (sgr_error) - fprintf(stderr, ANSI_ESCAPE_RESET); - break; - case PG_LOG_ERROR: - if (sgr_error) - fprintf(stderr, ANSI_ESCAPE_FMT, sgr_error); - fprintf(stderr, _("error: ")); - if (sgr_error) - fprintf(stderr, ANSI_ESCAPE_RESET); + case PG_LOG_PRIMARY: + switch (level) + { + case PG_LOG_ERROR: + if (sgr_error) + fprintf(stderr, ANSI_ESCAPE_FMT, sgr_error); + fprintf(stderr, _("error: ")); + if (sgr_error) + fprintf(stderr, ANSI_ESCAPE_RESET); + break; + case PG_LOG_WARNING: + if (sgr_warning) + fprintf(stderr, ANSI_ESCAPE_FMT, sgr_warning); + fprintf(stderr, _("warning: ")); + if (sgr_warning) + fprintf(stderr, ANSI_ESCAPE_RESET); + break; + default: + break; + } break; - case PG_LOG_WARNING: - if (sgr_warning) - fprintf(stderr, ANSI_ESCAPE_FMT, sgr_warning); - fprintf(stderr, _("warning: ")); - if (sgr_warning) - fprintf(stderr, ANSI_ESCAPE_RESET); + case PG_LOG_DETAIL: + fprintf(stderr, _("detail: ")); break; - default: + case PG_LOG_HINT: + fprintf(stderr, _("hint: ")); break; } } diff --git a/src/common/restricted_token.c b/src/common/restricted_token.c index 48b1ce0585..82b74b565e 100644 --- a/src/common/restricted_token.c +++ b/src/common/restricted_token.c @@ -190,10 +190,7 @@ get_restricted_token(void) WaitForSingleObject(pi.hProcess, INFINITE); if (!GetExitCodeProcess(pi.hProcess, &x)) - { - pg_log_error("could not get exit code from subprocess: error code %lu", GetLastError()); - exit(1); - } + pg_fatal("could not get exit code from subprocess: error code %lu", GetLastError()); exit(x); } pg_free(cmdline); diff --git a/src/fe_utils/archive.c b/src/fe_utils/archive.c index 361c1c25ea..53d42c2be4 100644 --- a/src/fe_utils/archive.c +++ b/src/fe_utils/archive.c @@ -49,10 +49,7 @@ RestoreArchivedFile(const char *path, const char *xlogfname, xlogRestoreCmd = BuildRestoreCommand(restoreCommand, xlogpath, xlogfname, NULL); if (xlogRestoreCmd == NULL) - { - pg_log_fatal("cannot use restore_command with %%r placeholder"); - exit(1); - } + pg_fatal("cannot use restore_command with %%r placeholder"); /* * Execute restore_command, which should copy the missing file from @@ -70,22 +67,16 @@ RestoreArchivedFile(const char *path, const char *xlogfname, if (stat(xlogpath, &stat_buf) == 0) { if (expectedSize > 0 && stat_buf.st_size != expectedSize) - { - pg_log_fatal("unexpected file size for \"%s\": %lld instead of %lld", - xlogfname, (long long int) stat_buf.st_size, - (long long int) expectedSize); - exit(1); - } + pg_fatal("unexpected file size for \"%s\": %lld instead of %lld", + xlogfname, (long long int) stat_buf.st_size, + (long long int) expectedSize); else { int xlogfd = open(xlogpath, O_RDONLY | PG_BINARY, 0); if (xlogfd < 0) - { - pg_log_fatal("could not open file \"%s\" restored from archive: %m", - xlogpath); - exit(1); - } + pg_fatal("could not open file \"%s\" restored from archive: %m", + xlogpath); else return xlogfd; } @@ -93,11 +84,8 @@ RestoreArchivedFile(const char *path, const char *xlogfname, else { if (errno != ENOENT) - { - pg_log_fatal("could not stat file \"%s\": %m", - xlogpath); - exit(1); - } + pg_fatal("could not stat file \"%s\": %m", + xlogpath); } } @@ -108,11 +96,8 @@ RestoreArchivedFile(const char *path, const char *xlogfname, * fatal too. */ if (wait_result_is_any_signal(rc, true)) - { - pg_log_fatal("restore_command failed: %s", - wait_result_to_str(rc)); - exit(1); - } + pg_fatal("restore_command failed: %s", + wait_result_to_str(rc)); /* * The file is not available, so just let the caller decide what to do diff --git a/src/fe_utils/connect_utils.c b/src/fe_utils/connect_utils.c index a30c66f13a..f2e583f9fa 100644 --- a/src/fe_utils/connect_utils.c +++ b/src/fe_utils/connect_utils.c @@ -88,11 +88,8 @@ connectDatabase(const ConnParams *cparams, const char *progname, conn = PQconnectdbParams(keywords, values, true); if (!conn) - { - pg_log_error("could not connect to database %s: out of memory", - cparams->dbname); - exit(1); - } + pg_fatal("could not connect to database %s: out of memory", + cparams->dbname); /* * No luck? Trying asking (again) for a password. @@ -117,8 +114,7 @@ connectDatabase(const ConnParams *cparams, const char *progname, PQfinish(conn); return NULL; } - pg_log_error("%s", PQerrorMessage(conn)); - exit(1); + pg_fatal("%s", PQerrorMessage(conn)); } /* Start strict; callers may override this. */ diff --git a/src/fe_utils/parallel_slot.c b/src/fe_utils/parallel_slot.c index 5896a8a6ca..684327885d 100644 --- a/src/fe_utils/parallel_slot.c +++ b/src/fe_utils/parallel_slot.c @@ -298,10 +298,7 @@ connect_slot(ParallelSlotArray *sa, int slotno, const char *dbname) sa->cparams->override_dbname = old_override; if (PQsocket(slot->connection) >= FD_SETSIZE) - { - pg_log_fatal("too many jobs for this platform"); - exit(1); - } + pg_fatal("too many jobs for this platform"); /* Setup the connection using the supplied command, if any. */ if (sa->initcmd) diff --git a/src/fe_utils/query_utils.c b/src/fe_utils/query_utils.c index 0b31b33f17..2fc6e2405b 100644 --- a/src/fe_utils/query_utils.c +++ b/src/fe_utils/query_utils.c @@ -31,7 +31,7 @@ executeQuery(PGconn *conn, const char *query, bool echo) PQresultStatus(res) != PGRES_TUPLES_OK) { pg_log_error("query failed: %s", PQerrorMessage(conn)); - pg_log_info("query was: %s", query); + pg_log_error_detail("Query was: %s", query); PQfinish(conn); exit(1); } @@ -56,7 +56,7 @@ executeCommand(PGconn *conn, const char *query, bool echo) PQresultStatus(res) != PGRES_COMMAND_OK) { pg_log_error("query failed: %s", PQerrorMessage(conn)); - pg_log_info("query was: %s", query); + pg_log_error_detail("Query was: %s", query); PQfinish(conn); exit(1); } diff --git a/src/fe_utils/recovery_gen.c b/src/fe_utils/recovery_gen.c index 9407e76bba..c9a423038a 100644 --- a/src/fe_utils/recovery_gen.c +++ b/src/fe_utils/recovery_gen.c @@ -31,10 +31,7 @@ GenerateRecoveryConfig(PGconn *pgconn, char *replication_slot) contents = createPQExpBuffer(); if (!contents) - { - pg_log_error("out of memory"); - exit(1); - } + pg_fatal("out of memory"); /* * In PostgreSQL 12 and newer versions, standby_mode is gone, replaced by @@ -45,10 +42,7 @@ GenerateRecoveryConfig(PGconn *pgconn, char *replication_slot) connOptions = PQconninfo(pgconn); if (connOptions == NULL) - { - pg_log_error("out of memory"); - exit(1); - } + pg_fatal("out of memory"); initPQExpBuffer(&conninfo_buf); for (PQconninfoOption *opt = connOptions; opt && opt->keyword; opt++) @@ -73,10 +67,7 @@ GenerateRecoveryConfig(PGconn *pgconn, char *replication_slot) appendConnStrVal(&conninfo_buf, opt->val); } if (PQExpBufferDataBroken(conninfo_buf)) - { - pg_log_error("out of memory"); - exit(1); - } + pg_fatal("out of memory"); /* * Escape the connection string, so that it can be put in the config file. @@ -96,10 +87,7 @@ GenerateRecoveryConfig(PGconn *pgconn, char *replication_slot) } if (PQExpBufferBroken(contents)) - { - pg_log_error("out of memory"); - exit(1); - } + pg_fatal("out of memory"); PQconninfoFree(connOptions); @@ -130,16 +118,10 @@ WriteRecoveryConfig(PGconn *pgconn, char *target_dir, PQExpBuffer contents) cf = fopen(filename, use_recovery_conf ? "w" : "a"); if (cf == NULL) - { - pg_log_error("could not open file \"%s\": %m", filename); - exit(1); - } + pg_fatal("could not open file \"%s\": %m", filename); if (fwrite(contents->data, contents->len, 1, cf) != 1) - { - pg_log_error("could not write to file \"%s\": %m", filename); - exit(1); - } + pg_fatal("could not write to file \"%s\": %m", filename); fclose(cf); @@ -148,10 +130,7 @@ WriteRecoveryConfig(PGconn *pgconn, char *target_dir, PQExpBuffer contents) snprintf(filename, MAXPGPATH, "%s/%s", target_dir, "standby.signal"); cf = fopen(filename, "w"); if (cf == NULL) - { - pg_log_error("could not create file \"%s\": %m", filename); - exit(1); - } + pg_fatal("could not create file \"%s\": %m", filename); fclose(cf); } @@ -167,9 +146,6 @@ escape_quotes(const char *src) char *result = escape_single_quotes_ascii(src); if (!result) - { - pg_log_error("out of memory"); - exit(1); - } + pg_fatal("out of memory"); return result; } diff --git a/src/include/common/logging.h b/src/include/common/logging.h index 61cfdce653..e213bb70d0 100644 --- a/src/include/common/logging.h +++ b/src/include/common/logging.h @@ -16,7 +16,7 @@ enum pg_log_level { /* - * Not initialized yet + * Not initialized yet (not to be used as an actual message log level). */ PG_LOG_NOTSET = 0, @@ -43,19 +43,41 @@ enum pg_log_level PG_LOG_ERROR, /* - * Severe errors that cause program termination. (One-shot programs may - * chose to label even fatal errors as merely "errors". The distinction - * is up to the program.) + * Turn all logging off (not to be used as an actual message log level). */ - PG_LOG_FATAL, + PG_LOG_OFF, +}; + +/* + * __pg_log_level is the minimum log level that will actually be shown. + */ +extern enum pg_log_level __pg_log_level; +/* + * A log message can have several parts. The primary message is required, + * others are optional. When emitting multiple parts, do so in the order of + * this enum, for consistency. + */ +enum pg_log_part +{ /* - * Turn all logging off. + * The primary message. Try to keep it to one line; follow the backend's + * style guideline for primary messages. */ - PG_LOG_OFF, -}; + PG_LOG_PRIMARY, -extern PGDLLIMPORT enum pg_log_level __pg_log_level; + /* + * Additional detail. Follow the backend's style guideline for detail + * messages. + */ + PG_LOG_DETAIL, + + /* + * Hint (not guaranteed correct) about how to fix the problem. Follow the + * backend's style guideline for hint messages. + */ + PG_LOG_HINT, +}; /* * Kind of a hack to be able to produce the psql output exactly as required by @@ -70,27 +92,84 @@ void pg_logging_increase_verbosity(void); void pg_logging_set_pre_callback(void (*cb) (void)); void pg_logging_set_locus_callback(void (*cb) (const char **filename, uint64 *lineno)); -void pg_log_generic(enum pg_log_level level, const char *pg_restrict fmt,...) pg_attribute_printf(2, 3); -void pg_log_generic_v(enum pg_log_level level, const char *pg_restrict fmt, va_list ap) pg_attribute_printf(2, 0); +void pg_log_generic(enum pg_log_level level, enum pg_log_part part, + const char *pg_restrict fmt,...) + pg_attribute_printf(3, 4); +void pg_log_generic_v(enum pg_log_level level, enum pg_log_part part, + const char *pg_restrict fmt, va_list ap) + pg_attribute_printf(3, 0); + +/* + * Preferred style is to use these macros to perform logging; don't call + * pg_log_generic[_v] directly, except perhaps in error interface code. + */ +#define pg_log_error(...) do { \ + if (likely(__pg_log_level <= PG_LOG_ERROR)) \ + pg_log_generic(PG_LOG_ERROR, PG_LOG_PRIMARY, __VA_ARGS__); \ + } while(0) -#define pg_log_fatal(...) do { \ - if (likely(__pg_log_level <= PG_LOG_FATAL)) pg_log_generic(PG_LOG_FATAL, __VA_ARGS__); \ +#define pg_log_error_detail(...) do { \ + if (likely(__pg_log_level <= PG_LOG_ERROR)) \ + pg_log_generic(PG_LOG_ERROR, PG_LOG_DETAIL, __VA_ARGS__); \ } while(0) -#define pg_log_error(...) do { \ - if (likely(__pg_log_level <= PG_LOG_ERROR)) pg_log_generic(PG_LOG_ERROR, __VA_ARGS__); \ +#define pg_log_error_hint(...) do { \ + if (likely(__pg_log_level <= PG_LOG_ERROR)) \ + pg_log_generic(PG_LOG_ERROR, PG_LOG_HINT, __VA_ARGS__); \ } while(0) #define pg_log_warning(...) do { \ - if (likely(__pg_log_level <= PG_LOG_WARNING)) pg_log_generic(PG_LOG_WARNING, __VA_ARGS__); \ + if (likely(__pg_log_level <= PG_LOG_WARNING)) \ + pg_log_generic(PG_LOG_WARNING, PG_LOG_PRIMARY, __VA_ARGS__); \ + } while(0) + +#define pg_log_warning_detail(...) do { \ + if (likely(__pg_log_level <= PG_LOG_WARNING)) \ + pg_log_generic(PG_LOG_WARNING, PG_LOG_DETAIL, __VA_ARGS__); \ + } while(0) + +#define pg_log_warning_hint(...) do { \ + if (likely(__pg_log_level <= PG_LOG_WARNING)) \ + pg_log_generic(PG_LOG_WARNING, PG_LOG_HINT, __VA_ARGS__); \ } while(0) #define pg_log_info(...) do { \ - if (likely(__pg_log_level <= PG_LOG_INFO)) pg_log_generic(PG_LOG_INFO, __VA_ARGS__); \ + if (likely(__pg_log_level <= PG_LOG_INFO)) \ + pg_log_generic(PG_LOG_INFO, PG_LOG_PRIMARY, __VA_ARGS__); \ + } while(0) + +#define pg_log_info_detail(...) do { \ + if (likely(__pg_log_level <= PG_LOG_INFO)) \ + pg_log_generic(PG_LOG_INFO, PG_LOG_DETAIL, __VA_ARGS__); \ + } while(0) + +#define pg_log_info_hint(...) do { \ + if (likely(__pg_log_level <= PG_LOG_INFO)) \ + pg_log_generic(PG_LOG_INFO, PG_LOG_HINT, __VA_ARGS__); \ } while(0) #define pg_log_debug(...) do { \ - if (unlikely(__pg_log_level <= PG_LOG_DEBUG)) pg_log_generic(PG_LOG_DEBUG, __VA_ARGS__); \ + if (unlikely(__pg_log_level <= PG_LOG_DEBUG)) \ + pg_log_generic(PG_LOG_DEBUG, PG_LOG_PRIMARY, __VA_ARGS__); \ + } while(0) + +#define pg_log_debug_detail(...) do { \ + if (unlikely(__pg_log_level <= PG_LOG_DEBUG)) \ + pg_log_generic(PG_LOG_DEBUG, PG_LOG_DETAIL, __VA_ARGS__); \ + } while(0) + +#define pg_log_debug_hint(...) do { \ + if (unlikely(__pg_log_level <= PG_LOG_DEBUG)) \ + pg_log_generic(PG_LOG_DEBUG, PG_LOG_HINT, __VA_ARGS__); \ + } while(0) + +/* + * A common shortcut: pg_log_error() and immediately exit(1). + */ +#define pg_fatal(...) do { \ + if (likely(__pg_log_level <= PG_LOG_ERROR)) \ + pg_log_generic(PG_LOG_ERROR, PG_LOG_PRIMARY, __VA_ARGS__); \ + exit(1); \ } while(0) #endif /* COMMON_LOGGING_H */ diff --git a/src/include/lib/simplehash.h b/src/include/lib/simplehash.h index 8192927010..4a3d0ec2c5 100644 --- a/src/include/lib/simplehash.h +++ b/src/include/lib/simplehash.h @@ -293,8 +293,7 @@ SH_SCOPE void SH_STAT(SH_TYPE * tb); #define SIMPLEHASH_H #ifdef FRONTEND -#define sh_error(...) \ - do { pg_log_fatal(__VA_ARGS__); exit(1); } while(0) +#define sh_error(...) pg_fatal(__VA_ARGS__) #define sh_log(...) pg_log_info(__VA_ARGS__) #else #define sh_error(...) elog(ERROR, __VA_ARGS__) diff --git a/src/nls-global.mk b/src/nls-global.mk index 53129f0a04..c1f7982300 100644 --- a/src/nls-global.mk +++ b/src/nls-global.mk @@ -72,10 +72,16 @@ BACKEND_COMMON_GETTEXT_FLAGS = \ FRONTEND_COMMON_GETTEXT_FILES = $(top_srcdir)/src/common/logging.c FRONTEND_COMMON_GETTEXT_TRIGGERS = \ - pg_log_fatal pg_log_error pg_log_warning pg_log_info pg_log_generic:2 pg_log_generic_v:2 + pg_log_error pg_log_error_detail pg_log_error_hint \ + pg_log_warning pg_log_warning_detail pg_log_warning_hint \ + pg_log_info pg_log_info_detail pg_log_info_hint \ + pg_fatal pg_log_generic:3 pg_log_generic_v:3 FRONTEND_COMMON_GETTEXT_FLAGS = \ - pg_log_fatal:1:c-format pg_log_error:1:c-format pg_log_warning:1:c-format pg_log_info:1:c-format pg_log_generic:2:c-format pg_log_generic_v:2:c-format + pg_log_error:1:c-format pg_log_error_detail:1:c-format pg_log_error_hint:1:c-format \ + pg_log_warning:1:c-format pg_log_warning_detail:1:c-format pg_log_warning_hint:1:c-format \ + pg_log_info:1:c-format pg_log_info_detail:1:c-format pg_log_info_hint:1:c-format \ + pg_fatal:1:c-format pg_log_generic:3:c-format pg_log_generic_v:3:c-format all-po: $(MO_FILES) From c0d1c641cbe433d1b6304bc1e3a2d8cd38b9a8e5 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 8 Apr 2022 18:14:24 -0400 Subject: [PATCH 465/772] Silence compiler warnings for unsupported compression methods. wrasse, at least, moans about the lack of any "return" statement in these functions. You'd think pretty much everything would know that exit(1) doesn't return, but evidently not. --- src/bin/pg_basebackup/bbstreamer_gzip.c | 2 ++ src/bin/pg_basebackup/bbstreamer_lz4.c | 2 ++ src/bin/pg_basebackup/bbstreamer_zstd.c | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/bin/pg_basebackup/bbstreamer_gzip.c b/src/bin/pg_basebackup/bbstreamer_gzip.c index d5b38ec4bc..1ab7ee6ea9 100644 --- a/src/bin/pg_basebackup/bbstreamer_gzip.c +++ b/src/bin/pg_basebackup/bbstreamer_gzip.c @@ -116,6 +116,7 @@ bbstreamer_gzip_writer_new(char *pathname, FILE *file, return &streamer->base; #else pg_fatal("this build does not support gzip compression"); + return NULL; /* keep compiler quiet */ #endif } @@ -248,6 +249,7 @@ bbstreamer_gzip_decompressor_new(bbstreamer *next) return &streamer->base; #else pg_fatal("this build does not support gzip compression"); + return NULL; /* keep compiler quiet */ #endif } diff --git a/src/bin/pg_basebackup/bbstreamer_lz4.c b/src/bin/pg_basebackup/bbstreamer_lz4.c index 93f8344ea3..2f75ba5602 100644 --- a/src/bin/pg_basebackup/bbstreamer_lz4.c +++ b/src/bin/pg_basebackup/bbstreamer_lz4.c @@ -99,6 +99,7 @@ bbstreamer_lz4_compressor_new(bbstreamer *next, bc_specification *compress) return &streamer->base; #else pg_fatal("this build does not support lz4 compression"); + return NULL; /* keep compiler quiet */ #endif } @@ -296,6 +297,7 @@ bbstreamer_lz4_decompressor_new(bbstreamer *next) return &streamer->base; #else pg_fatal("this build does not support lz4 compression"); + return NULL; /* keep compiler quiet */ #endif } diff --git a/src/bin/pg_basebackup/bbstreamer_zstd.c b/src/bin/pg_basebackup/bbstreamer_zstd.c index e2c76503cc..a5167e9fea 100644 --- a/src/bin/pg_basebackup/bbstreamer_zstd.c +++ b/src/bin/pg_basebackup/bbstreamer_zstd.c @@ -117,6 +117,7 @@ bbstreamer_zstd_compressor_new(bbstreamer *next, bc_specification *compress) return &streamer->base; #else pg_fatal("this build does not support zstd compression"); + return NULL; /* keep compiler quiet */ #endif } @@ -271,6 +272,7 @@ bbstreamer_zstd_decompressor_new(bbstreamer *next) return &streamer->base; #else pg_fatal("this build does not support zstd compression"); + return NULL; /* keep compiler quiet */ #endif } From fc5b83bb60a862a4a27372b255405df598455ff1 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sat, 9 Apr 2022 15:46:37 +0200 Subject: [PATCH 466/772] Add missing source files to nls.mk --- src/bin/pg_basebackup/nls.mk | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/bin/pg_basebackup/nls.mk b/src/bin/pg_basebackup/nls.mk index 2d521f0683..cf8570ce18 100644 --- a/src/bin/pg_basebackup/nls.mk +++ b/src/bin/pg_basebackup/nls.mk @@ -1,6 +1,22 @@ # src/bin/pg_basebackup/nls.mk CATALOG_NAME = pg_basebackup AVAIL_LANGUAGES = cs de es fr he it ja ko pl pt_BR ru sv tr uk vi zh_CN -GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_basebackup.c pg_receivewal.c pg_recvlogical.c receivelog.c streamutil.c walmethods.c ../../common/fe_memutils.c ../../common/file_utils.c ../../fe_utils/recovery_gen.c +GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ + bbstreamer_file.c \ + bbstreamer_gzip.c \ + bbstreamer_inject.c \ + bbstreamer_lz4.c \ + bbstreamer_tar.c \ + bbstreamer_zstd.c \ + pg_basebackup.c \ + pg_receivewal.c \ + pg_recvlogical.c \ + receivelog.c \ + streamutil.c \ + walmethods.c \ + ../../common/backup_compression.c \ + ../../common/fe_memutils.c \ + ../../common/file_utils.c \ + ../../fe_utils/recovery_gen.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt tar_set_error GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) From 38abc39c81f9d51cff0b4dccebd5bf73327f19e1 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sat, 9 Apr 2022 16:15:01 +0200 Subject: [PATCH 467/772] Add missing serial commas --- src/backend/commands/publicationcmds.c | 2 +- src/backend/utils/adt/jsonpath_exec.c | 2 +- src/backend/utils/misc/guc.c | 2 +- src/test/regress/expected/publication.out | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index 4fd1e6e7ab..7aacb6b2fe 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -613,7 +613,7 @@ check_simple_rowfilter_expr_walker(Node *node, ParseState *pstate) /* OK, supported */ break; default: - errdetail_msg = _("Expressions only allow columns, constants, built-in operators, built-in data types, built-in collations and immutable built-in functions."); + errdetail_msg = _("Expressions only allow columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions."); break; } diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c index ee9b5089b9..2544c6b155 100644 --- a/src/backend/utils/adt/jsonpath_exec.c +++ b/src/backend/utils/adt/jsonpath_exec.c @@ -3134,7 +3134,7 @@ JsonItemFromDatum(Datum val, Oid typid, int32 typmod, JsonbValue *res) default: ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("only bool, numeric and text types could be " + errmsg("only bool, numeric, and text types could be " "casted to supported jsonpath types."))); } } diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 22b5571a70..9e0f262088 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -4360,7 +4360,7 @@ static struct config_string ConfigureNamesString[] = {"log_destination", PGC_SIGHUP, LOGGING_WHERE, gettext_noop("Sets the destination for server log output."), gettext_noop("Valid values are combinations of \"stderr\", " - "\"syslog\", \"csvlog\", \"jsonlog\" and \"eventlog\", " + "\"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", " "depending on the platform."), GUC_LIST_INPUT }, diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index 4d24d772bd..8208f9fa0e 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -441,7 +441,7 @@ CREATE PUBLICATION testpub6 FOR TABLE testpub_rf_tbl1 WHERE (a IN (SELECT genera ERROR: invalid publication WHERE expression LINE 1: ...ICATION testpub6 FOR TABLE testpub_rf_tbl1 WHERE (a IN (SELE... ^ -DETAIL: Expressions only allow columns, constants, built-in operators, built-in data types, built-in collations and immutable built-in functions. +DETAIL: Expressions only allow columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions. -- fail - system columns are not allowed CREATE PUBLICATION testpub6 FOR TABLE testpub_rf_tbl1 WHERE ('(0,1)'::tid = ctid); ERROR: invalid publication WHERE expression From 80c877271a61bd11d6a2ff9a37f1f414a1b082ab Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sat, 9 Apr 2022 16:17:41 +0200 Subject: [PATCH 468/772] Fix whitespace --- src/test/regress/expected/rules.out | 2 +- src/test/regress/sql/rules.sql | 2 +- src/tools/mark_pgdllimport.pl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index f29375c2a9..21effe8315 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -3553,7 +3553,7 @@ DROP TABLE ruletest2; -- -- Test non-SELECT rule on security invoker view. -- Should use view owner's permissions. --- +-- CREATE USER regress_rule_user1; CREATE TABLE ruletest_t1 (x int); CREATE TABLE ruletest_t2 (x int); diff --git a/src/test/regress/sql/rules.sql b/src/test/regress/sql/rules.sql index aee6abed86..bfb5f3b0bb 100644 --- a/src/test/regress/sql/rules.sql +++ b/src/test/regress/sql/rules.sql @@ -1294,7 +1294,7 @@ DROP TABLE ruletest2; -- -- Test non-SELECT rule on security invoker view. -- Should use view owner's permissions. --- +-- CREATE USER regress_rule_user1; CREATE TABLE ruletest_t1 (x int); diff --git a/src/tools/mark_pgdllimport.pl b/src/tools/mark_pgdllimport.pl index 3152c1428b..a09ec5a369 100755 --- a/src/tools/mark_pgdllimport.pl +++ b/src/tools/mark_pgdllimport.pl @@ -34,7 +34,7 @@ { my $needs_pgdllimport = 1; - # By convention we declare global variables explicitly extern. We're + # By convention we declare global variables explicitly extern. We're # looking for those not already marked with PGDLLIMPORT. $needs_pgdllimport = 0 if $raw_line !~ /^extern\s+/ || $raw_line =~ /PGDLLIMPORT/; From 7b735f8b52ad4ccf742c29dc41e3d049bdffe2fa Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 9 Apr 2022 15:09:38 -0400 Subject: [PATCH 469/772] Doc: shorten JSON_SERIALIZE example to avoid a PDF build warning. There's no particular reason why this example has to use a 3-element array rather than 2-element. Shortening it makes the result bytea narrow enough to not cause a margin overrun in A4 format. --- doc/src/sgml/func.sgml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 5047e090db..2ecf0482d8 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -19881,12 +19881,11 @@ SELECT JSON_SERIALIZE(JSON_SCALAR('foo')); "foo" (1 row) -SELECT JSON_SERIALIZE('{"foo": "bar", "baz": [1, 2, 3]}' RETURNING bytea); - json_serialize --------------------------------------------------------------------- - \x7b22666f6f223a2022626172222c202262617a223a205b312c20322c20335d7d +SELECT JSON_SERIALIZE('{"foo": "bar", "baz": [1, 2]}' RETURNING bytea); + json_serialize +-------------------------------------------------------------- + \x7b22666f6f223a2022626172222c202262617a223a205b312c20325d7d (1 row) - From 3b0a42e74edfc57c3cef1f3b1a583d4fe5cca846 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Sun, 10 Apr 2022 08:46:12 -0400 Subject: [PATCH 470/772] Add timestamp and elapsed time decorations to TAP test logs These apply to traces from Test::More functions such as ok(), is(), diag() and note(). Output from other sources (e.g. external programs such a initdb) is not affected. The elapsed time is the time since the last such trace (or the beginning of the test in the first case). Times and timestamps are at millisecond precision. Discussion: https://postgr.es/m/20220401172150.rsycz4lrn7ewruil@alap3.anarazel.de --- src/test/perl/PostgreSQL/Test/SimpleTee.pm | 30 +++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/test/perl/PostgreSQL/Test/SimpleTee.pm b/src/test/perl/PostgreSQL/Test/SimpleTee.pm index bb9d79a755..7cb8591fed 100644 --- a/src/test/perl/PostgreSQL/Test/SimpleTee.pm +++ b/src/test/perl/PostgreSQL/Test/SimpleTee.pm @@ -10,10 +10,32 @@ # method is currently implemented; that's all we need. We don't want to # depend on IO::Tee just for this. +# The package is enhanced to add timestamp and elapsed time decorations to +# the log file traces sent through this interface from Test::More functions +# (ok, is, note, diag etc.). Elapsed time is shown as the time since the last +# log trace. + package PostgreSQL::Test::SimpleTee; use strict; use warnings; +use Time::HiRes qw(time); + +my $last_time; + +BEGIN { $last_time = time; } + +sub _time_str +{ + my $tm = time; + my $diff = $tm - $last_time; + $last_time = $tm; + my ($sec, $min, $hour) = localtime($tm); + my $msec = int(1000 * ($tm - int($tm))); + return sprintf("[%.2d:%.2d:%.2d.%.3d](%.3fs) ", + $hour, $min, $sec, $msec, $diff); +} + sub TIEHANDLE { my $self = shift; @@ -24,10 +46,16 @@ sub PRINT { my $self = shift; my $ok = 1; + # The first file argument passed to tiehandle in PostgreSQL::Test::Utils is + # the original stdout, which is what PROVE sees. Additional decorations + # confuse it, so only put out the time string on files after the first. + my $skip = 1; + my $ts = _time_str; for my $fh (@$self) { - print $fh @_ or $ok = 0; + print $fh ($skip ? "" : $ts), @_ or $ok = 0; $fh->flush or $ok = 0; + $skip = 0; } return $ok; } From c835dcdab622813bb1ccd130458065089f2ccacd Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Sun, 10 Apr 2022 09:04:24 -0400 Subject: [PATCH 471/772] Fix pgperlsyncheck following SSL TAP test refactoring Commit 4a7e964fc6 made pgperlsyncheck fail, but apparently nobody noticed, although the buildfarm module that does more or less the same thing was modified. So fix the in-core test. I will look at unifying the two sets of tests so we avoid a future mismatch. --- src/tools/perlcheck/pgperlsyncheck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/perlcheck/pgperlsyncheck b/src/tools/perlcheck/pgperlsyncheck index 74f1584b8e..730f5927cd 100755 --- a/src/tools/perlcheck/pgperlsyncheck +++ b/src/tools/perlcheck/pgperlsyncheck @@ -4,7 +4,7 @@ INCLUDES="-I src/tools/msvc -I src/tools/msvc/dummylib -I src/backend/catalog" INCLUDES="-I src/test/perl -I src/backend/utils/mb/Unicode $INCLUDES" -INCLUDES="-I src/bin/pg_rewind -I src/test/ssl $INCLUDES" +INCLUDES="-I src/bin/pg_rewind -I src/test/ssl/t $INCLUDES" set -e From b6b8824ee771eecb84830903fad50a7f6853639d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 10 Apr 2022 15:31:42 -0400 Subject: [PATCH 472/772] Doc: reformat descriptions of pgbench output formats. This is mostly driven by trying to get rid of line-too-wide warnings in PDF output; but I think converting to a makes it more readable anyway. Discussion: https://postgr.es/m/4183048.1649536705@sss.pgh.pa.us --- doc/src/sgml/ref/pgbench.sgml | 337 +++++++++++++++++++++++++--------- 1 file changed, 252 insertions(+), 85 deletions(-) diff --git a/doc/src/sgml/ref/pgbench.sgml b/doc/src/sgml/ref/pgbench.sgml index 9ba26e5e86..659fe2d984 100644 --- a/doc/src/sgml/ref/pgbench.sgml +++ b/doc/src/sgml/ref/pgbench.sgml @@ -2289,33 +2289,96 @@ END;
- The format of the log is: - - -client_id transaction_no time script_no time_epoch time_us schedule_lag retries - - - where - client_id indicates which client session ran the transaction, - transaction_no counts how many transactions have been - run by that session, - time is the total elapsed transaction time in microseconds, - script_no identifies which script file was used (useful when - multiple scripts were specified with or ), - and time_epoch/time_us are a - Unix-epoch time stamp and an offset - in microseconds (suitable for creating an ISO 8601 - time stamp with fractional seconds) showing when - the transaction completed. - The schedule_lag field is the difference between the - transaction's scheduled start time, and the time it actually started, in - microseconds. It is only present when the option is used. + Each line in a log file describes one transaction. + It contains the following space-separated fields: + + + + client_id + + + identifies the client session that ran the transaction + + + + + + transaction_no + + + counts how many transactions have been run by that session + + + + + + time + + + transaction's elapsed time, in microseconds + + + + + + script_no + + + identifies the script file that was used for the transaction + (useful when multiple scripts are specified + with or ) + + + + + + time_epoch + + + transaction's completion time, as a Unix-epoch time stamp + + + + + + time_us + + + fractional-second part of transaction's completion time, in + microseconds + + + + + + schedule_lag + + + transaction start delay, that is the difference between the + transaction's scheduled start time and the time it actually + started, in microseconds + (present only if is specified) + + + + + + retries + + + count of retries after serialization or deadlock errors during the + transaction + (present only if is not equal to one) + + + + + + + When both and are used, the time for a skipped transaction will be reported as skipped. - retries is the sum of all retries after the - serialization or deadlock errors during the current script execution. It is - present only if the option is not equal to 1. If the transaction ends with a failure, its time will be reported as failed. If you use the option, the @@ -2398,69 +2461,173 @@ END; With the option, a different - format is used for the log files: - - -interval_start num_transactions sum_latency sum_latency_2 min_latency max_latency -sum_lag sum_lag_2 min_lag max_lag skipped -retried retries failures serialization_failures deadlock_failures - - - where - interval_start is the start of the interval (as a Unix - epoch time stamp), - num_transactions is the number of transactions - within the interval, - sum_latency is the sum of the transaction - latencies within the interval, - sum_latency_2 is the sum of squares of the - transaction latencies within the interval, - min_latency is the minimum latency within the interval, - and - max_latency is the maximum latency within the interval, - failures is the number of transactions that ended - with a failed SQL command within the interval. - - - The next fields, - sum_lag, sum_lag_2, min_lag, - and max_lag, only meaningful if the - option is used. Otherwise, they are all 0.0. - They provide statistics about the time each transaction had to wait for the - previous one to finish, i.e., the difference between each transaction's - scheduled start time and the time it actually started. - The next field, skipped, - is only meaningful if the option is used, too. Otherwise it is 0. - It counts the number of transactions skipped because they would have - started too late. - - - The retried - and retries fields are only meaningful if - the option is not equal to 1. Otherwise they - are 0. They report the number of retried transactions and the sum of all - retries after serialization or deadlock errors within the interval. Each - transaction is counted in the interval when it was committed. - - - failures is the sum of all failed transactions. - If is specified, instead of the sum of - all failed transactions you will get more detailed statistics for the - failed transactions grouped by the following types: - serialization_failures is the number of - transactions that got a serialization error and were not retried after this, - deadlock_failures is the number of transactions - that got a deadlock error and were not retried after this. - If is not - specified, serialization_failures - and deadlock_failures are always 0. + format is used for the log files. Each log line describes one + aggregation interval. It contains the following space-separated + fields: + + + + interval_start + + + start time of the interval, as a Unix-epoch time stamp + + + + + + num_transactions + + + number of transactions within the interval + + + + + + sum_latency + + + sum of transaction latencies + + + + + + sum_latency_2 + + + sum of squares of transaction latencies + + + + + + min_latency + + + minimum transaction latency + + + + + + max_latency + + + maximum transaction latency + + + + + + sum_lag + + + sum of transaction start delays + (zero unless is specified) + + + + + + sum_lag_2 + + + sum of squares of transaction start delays + (zero unless is specified) + + + + + + min_lag + + + minimum transaction start delay + (zero unless is specified) + + + + + + max_lag + + + maximum transaction start delay + (zero unless is specified) + + + + + + skipped + + + number of transactions skipped because they would have started too late + (zero unless + and are specified) + + + + + + retried + + + number of retried transactions + (zero unless is not equal to one) + + + + + + retries + + + number of retries after serialization or deadlock errors + (zero unless is not equal to one) + + + + + + failures + + + number of transactions that ended with a failed SQL command + + + + + + serialization_failures + + + number of transactions that got a serialization error and were not + retried afterwards + (zero unless is specified) + + + + + + deadlock_failures + + + number of transactions that got a deadlock error and were not + retried afterwards + (zero unless is specified) + + + + - Here is some example output with following options: + Here is some example output generated with these options: -pgbench --aggregate-interval=10 --time=20 --client=10 --log --rate=1000 ---latency-limit=10 --failures-detailed --max-tries=10 test +pgbench --aggregate-interval=10 --time=20 --client=10 --log --rate=1000 --latency-limit=10 --failures-detailed --max-tries=10 test 1649114136 5815 27552565 177846919143 1078 21716 2756787 7264696105 0 9661 0 7854 31472 4022 4022 0 1649114146 5958 28460110 182785513108 1083 20391 2539395 6411761497 0 7268 0 8127 32595 4101 4101 0 @@ -2468,8 +2635,8 @@ END; - Notice that while the plain (unaggregated) log file shows which script - was used for each transaction, the aggregated log does not. Therefore if + Notice that while the plain (unaggregated) log format shows which script + was used for each transaction, the aggregated format does not. Therefore if you need per-script data, you need to aggregate the data on your own. From cd959b1b0662c9d57540b31961680c38037ffcd6 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Sun, 10 Apr 2022 21:42:43 +0200 Subject: [PATCH 473/772] Doc: fix typos in documentation Commits 39969e2a1e4 and 5c279a6d350 accidentally included a typo each in the user facing documentation. --- doc/src/sgml/backup.sgml | 2 +- doc/src/sgml/custom-rmgr.sgml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/backup.sgml b/doc/src/sgml/backup.sgml index 6812e9ec66..5b147a746d 100644 --- a/doc/src/sgml/backup.sgml +++ b/doc/src/sgml/backup.sgml @@ -889,7 +889,7 @@ SELECT pg_backup_start(label => 'label', fast => false); regularly scheduled checkpoint to complete, which may take a long time (see the configuration parameters and ). This is - usually preferrable as it minimizes the impact on the running system. If you + usually preferable as it minimizes the impact on the running system. If you want to start the backup as soon as possible, pass true as the second parameter to pg_backup_start and it will request an immediate checkpoint, which will finish as fast as possible using diff --git a/doc/src/sgml/custom-rmgr.sgml b/doc/src/sgml/custom-rmgr.sgml index 17a4f1dfbd..dd917c54b6 100644 --- a/doc/src/sgml/custom-rmgr.sgml +++ b/doc/src/sgml/custom-rmgr.sgml @@ -19,7 +19,7 @@ an extension to implement. - To create a new custom WAL resouce manager, first define an + To create a new custom WAL resource manager, first define an RmgrData structure with implementations for the resource manager methods. Refer to src/backend/access/transam/README and From 8ac700acffc7b17d88414be47b8dff44fb1ea681 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 11 Apr 2022 09:49:13 +0900 Subject: [PATCH 474/772] doc: Clarify behavior of query planner locking with REINDEX MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The documentation of REINDEX has never mentioned that the query planner may take an ACCESS SHARE lock on the indexes depending on the query used. This adds also a note about prepared queries not impacted when they do not use the index(es) rebuilt. Author: Frédéric Yhuel Reviewed-by: Guillaume Lelarge, Justin Pryzby Discussion: https://postgr.es/m/65d08718-6f11-978a-4b5a-72b807d4c663@dalibo.com --- doc/src/sgml/ref/reindex.sgml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/reindex.sgml b/doc/src/sgml/ref/reindex.sgml index e6b25ee670..6a0eca8b9a 100644 --- a/doc/src/sgml/ref/reindex.sgml +++ b/doc/src/sgml/ref/reindex.sgml @@ -275,7 +275,12 @@ REINDEX [ ( option [, ...] ) ] { IN considerations are rather different. REINDEX locks out writes but not reads of the index's parent table. It also takes an ACCESS EXCLUSIVE lock on the specific index being processed, - which will block reads that attempt to use that index. In contrast, + which will block reads that attempt to use that index. In particular, + the query planner tries to take an ACCESS SHARE + lock on every index of the table, regardless of the query, and so + REINDEX blocks virtually any queries except for some + prepared queries whose plan has been cached and which don't use this very + index. In contrast, DROP INDEX momentarily takes an ACCESS EXCLUSIVE lock on the parent table, blocking both writes and reads. The subsequent CREATE INDEX locks out From 0c65177a21a9e23490bee0e50ba61eeb287f7183 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 11 Apr 2022 07:39:25 +0200 Subject: [PATCH 475/772] Put new command-line options into alphabetical order in help output --- src/bin/pg_basebackup/pg_basebackup.c | 4 ++-- src/bin/pg_rewind/pg_rewind.c | 4 ++-- src/bin/pgbench/pgbench.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index 65dcfff0a0..c1f2253af2 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -378,14 +378,14 @@ usage(void) printf(_("Usage:\n")); printf(_(" %s [OPTION]...\n"), progname); printf(_("\nOptions controlling the output:\n")); - printf(_(" -t, --target=TARGET[:DETAIL]\n" - " backup target (if other than client)\n")); printf(_(" -D, --pgdata=DIRECTORY receive base backup into directory\n")); printf(_(" -F, --format=p|t output format (plain (default), tar)\n")); printf(_(" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" " (in kB/s, or use suffix \"k\" or \"M\")\n")); printf(_(" -R, --write-recovery-conf\n" " write configuration for replication\n")); + printf(_(" -t, --target=TARGET[:DETAIL]\n" + " backup target (if other than client)\n")); printf(_(" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" " relocate tablespace in OLDDIR to NEWDIR\n")); printf(_(" --waldir=WALDIR location for the write-ahead log directory\n")); diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c index 2ca4dd29af..1ff8da1676 100644 --- a/src/bin/pg_rewind/pg_rewind.c +++ b/src/bin/pg_rewind/pg_rewind.c @@ -88,8 +88,6 @@ usage(const char *progname) printf(_("Options:\n")); printf(_(" -c, --restore-target-wal use restore_command in target configuration to\n" " retrieve WAL files from archives\n")); - printf(_(" --config-file=FILENAME use specified main server configuration\n")); - printf(_(" file when running target cluster\n")); printf(_(" -D, --target-pgdata=DIRECTORY existing data directory to modify\n")); printf(_(" --source-pgdata=DIRECTORY source data directory to synchronize with\n")); printf(_(" --source-server=CONNSTR source server to synchronize with\n")); @@ -99,6 +97,8 @@ usage(const char *progname) printf(_(" -P, --progress write progress messages\n")); printf(_(" -R, --write-recovery-conf write configuration for replication\n" " (requires --source-server)\n")); + printf(_(" --config-file=FILENAME use specified main server configuration\n" + " file when running target cluster\n")); printf(_(" --debug write a lot of debug messages\n")); printf(_(" --no-ensure-shutdown do not automatically fix unclean shutdown\n")); printf(_(" -V, --version output version information, then exit\n")); diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 8a31ffa067..8197da8546 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -921,11 +921,11 @@ usage(void) " --log-prefix=PREFIX prefix for transaction time log file\n" " (default: \"pgbench_log\")\n" " --max-tries=NUM max number of tries to run transaction (default: 1)\n" - " --verbose-errors print messages of all errors\n" " --progress-timestamp use Unix epoch timestamps for progress\n" " --random-seed=SEED set random seed (\"time\", \"rand\", integer)\n" " --sampling-rate=NUM fraction of transactions to log (e.g., 0.01 for 1%%)\n" " --show-script=NAME show builtin script code, then exit\n" + " --verbose-errors print messages of all errors\n" "\nCommon options:\n" " -d, --debug print debugging output\n" " -h, --host=HOSTNAME database server host or socket directory\n" From 7597cc3083f8b3607123f71bc6432afc5a655d6e Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 11 Apr 2022 16:36:25 +0900 Subject: [PATCH 476/772] Fix the dates of some copyright notices 0ad8032 and 4e34747 are at the origin of that. Julien has found the one in parse_jsontable.c, while I have spotted the rest. Author: Julien Rouhaud, Michael Paquier Discussion: https://postgr.es/m/20220411060838.ftnzyvflpwu6f74w@jrouhaud --- src/backend/parser/parse_jsontable.c | 2 +- src/backend/replication/basebackup_gzip.c | 2 +- src/backend/replication/basebackup_lz4.c | 2 +- src/backend/replication/basebackup_target.c | 2 +- src/backend/replication/basebackup_zstd.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/parser/parse_jsontable.c b/src/backend/parser/parse_jsontable.c index c7dcefa11c..0dea7c998e 100644 --- a/src/backend/parser/parse_jsontable.c +++ b/src/backend/parser/parse_jsontable.c @@ -3,7 +3,7 @@ * parse_jsontable.c * parsing of JSON_TABLE * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/replication/basebackup_gzip.c b/src/backend/replication/basebackup_gzip.c index e4df57b121..43a7323e7d 100644 --- a/src/backend/replication/basebackup_gzip.c +++ b/src/backend/replication/basebackup_gzip.c @@ -3,7 +3,7 @@ * basebackup_gzip.c * Basebackup sink implementing gzip compression. * - * Portions Copyright (c) 2010-2020, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/basebackup_gzip.c diff --git a/src/backend/replication/basebackup_lz4.c b/src/backend/replication/basebackup_lz4.c index 48929321a4..032cc10bc4 100644 --- a/src/backend/replication/basebackup_lz4.c +++ b/src/backend/replication/basebackup_lz4.c @@ -3,7 +3,7 @@ * basebackup_lz4.c * Basebackup sink implementing lz4 compression. * - * Portions Copyright (c) 2010-2020, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/basebackup_lz4.c diff --git a/src/backend/replication/basebackup_target.c b/src/backend/replication/basebackup_target.c index 55651cbe16..cff65611ef 100644 --- a/src/backend/replication/basebackup_target.c +++ b/src/backend/replication/basebackup_target.c @@ -6,7 +6,7 @@ * Furthermore, new targets can be defined by extensions. This file * contains code to support that functionality. * - * Portions Copyright (c) 2010-2020, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/basebackup_target.c diff --git a/src/backend/replication/basebackup_zstd.c b/src/backend/replication/basebackup_zstd.c index f6876f4811..55dee6b0b5 100644 --- a/src/backend/replication/basebackup_zstd.c +++ b/src/backend/replication/basebackup_zstd.c @@ -3,7 +3,7 @@ * basebackup_zstd.c * Basebackup sink implementing zstd compression. * - * Portions Copyright (c) 2010-2020, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/basebackup_zstd.c From bba3c35b29d07a27bbf5dd0d7d5e7c7592e02f81 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Mon, 11 Apr 2022 20:48:48 +1200 Subject: [PATCH 477/772] Docs: Fix various mistakes and typos Author: Justin Pryzby Discussion: https://postgr.es/m/20220411020336.GB26620@telsasoft.com --- doc/src/sgml/config.sgml | 6 +-- doc/src/sgml/glossary.sgml | 2 +- doc/src/sgml/monitoring.sgml | 2 +- doc/src/sgml/postgres-fdw.sgml | 4 +- doc/src/sgml/ref/create_database.sgml | 12 +++--- doc/src/sgml/ref/pgbench.sgml | 56 +++++++++++++-------------- 6 files changed, 41 insertions(+), 41 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 6e3e27bed7..81cacdcbe4 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -5047,7 +5047,7 @@ ANY num_sync ( the autovacuum launcher diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 2f44113caa..87b6e5fb5e 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -200,7 +200,7 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser Cumulative statistics are collected in shared memory. Every - PostgreSQL process collects statistics locally + PostgreSQL process collects statistics locally, then updates the shared data at appropriate intervals. When a server, including a physical replica, shuts down cleanly, a permanent copy of the statistics data is stored in the pg_stat subdirectory, diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml index d8dc715587..1901736e60 100644 --- a/doc/src/sgml/postgres-fdw.sgml +++ b/doc/src/sgml/postgres-fdw.sgml @@ -491,7 +491,7 @@ OPTIONS (ADD password_required 'false'); For a foreign server with this option enabled, if many remote (sub)transactions are opened on the foreign server in a local - (sub)transaction, this option might increase the remote server’s load + (sub)transaction, this option might increase the remote server's load when the local (sub)transaction commits, so be careful when using this option. @@ -1040,7 +1040,7 @@ postgres=# SELECT postgres_fdw_disconnect_all(); %C - Cluster name in local server + Cluster name on local server (see for details) diff --git a/doc/src/sgml/ref/create_database.sgml b/doc/src/sgml/ref/create_database.sgml index 255ad3a1ce..0b32e7ecf9 100644 --- a/doc/src/sgml/ref/create_database.sgml +++ b/doc/src/sgml/ref/create_database.sgml @@ -132,7 +132,7 @@ CREATE DATABASE name available. This strategy writes a small record to the write-ahead log for each tablespace used by the target database. Each such record represents copying an entire directory to a new location at the - filesystem level. While this does reduce the write-ahed + filesystem level. While this does reduce the write-ahead log volume substantially, especially if the template database is large, it also forces the system to perform a checkpoint both before and after the creation of the new database. In some situations, this may @@ -278,11 +278,11 @@ CREATE DATABASE name The object identifier to be used for the new database. If this - parameter is not specified, the database will choose a suitable - OID automatically. This parameter is primarily intended for internal - use by pg_upgrade, and only - pg_upgrade can specify a value less - than 16384. + parameter is not specified, PostgreSQL + will choose a suitable OID automatically. This parameter is primarily + intended for internal use by pg_upgrade, + and only pg_upgrade can specify a value + less than 16384.
diff --git a/doc/src/sgml/ref/pgbench.sgml b/doc/src/sgml/ref/pgbench.sgml index 659fe2d984..1a630f020b 100644 --- a/doc/src/sgml/ref/pgbench.sgml +++ b/doc/src/sgml/ref/pgbench.sgml @@ -541,15 +541,15 @@ pgbench options d skipped. - When the option is used, the transaction with - serialization or deadlock error cannot be retried if the total time of - all its tries is greater than limit ms. To - limit only the time of tries and not their number, use - --max-tries=0. By default option - is set to 1 and transactions with - serialization/deadlock errors are not retried. See for more information about retrying - such transactions. + When the option is used, a transaction + which fails due to a serialization anomaly or from a deadlock will not + be retried if the total time of all its tries is greater than + limit ms. To limit only the time of tries + and not their number, use --max-tries=0. By + default, the option is set to 1 and + transactions with serialization/deadlock errors are not retried. See + for more information about + retrying such transactions. @@ -622,7 +622,7 @@ pgbench options d throttling (), the latency is computed with respect to the transaction scheduled start time, not the actual transaction beginning time, thus it also includes the average schedule lag time. - When is used to enable transactions retries + When is used to enable transaction retries after serialization/deadlock errors, the report includes the number of retried transactions and the sum of all retries. @@ -818,7 +818,7 @@ pgbench options d Print messages about all errors and failures (errors without retrying) - including which limit for retries was violated and how far it was + including which limit for retries was exceeded and how far it was exceeded for the serialization/deadlock failures. (Note that in this case the output can be significantly increased.). See for more information. @@ -2433,7 +2433,7 @@ END; - If option is used, the type of + If the option is used, the type of failure is reported in the time like this: 3 0 47423 0 1499414498 34501 3 @@ -2773,12 +2773,12 @@ statement latencies in milliseconds, failures and retries: Errors of the main program. They are the most serious and always result - in an immediate exit from the pgbench with - the corresponding error message. They include: + in an immediate exit from pgbench with the + corresponding error message. They include: - errors at the beginning of the pgbench + errors at the beginning of pgbench (e.g. an invalid option value); @@ -2790,8 +2790,8 @@ statement latencies in milliseconds, failures and retries: - errors before starting threads (e.g. we could not connect to the - database server / the syntax error in the meta command / thread + errors before starting threads (e.g. could not connect to the + database server, syntax error in the meta command, thread creation failure); @@ -2813,7 +2813,7 @@ statement latencies in milliseconds, failures and retries: - Direct client errors. They lead to immediate exit from the + Direct client errors. They lead to immediate exit from pgbench with the corresponding error message only in the case of an internal pgbench error (which are supposed to never occur...). Otherwise in the worst @@ -2829,11 +2829,11 @@ statement latencies in milliseconds, failures and retries: - Client's run is aborted in case of a serious error, for example, the - connection with the database server was lost or the end of script reached - without completing the last transaction. In addition, if an execution of SQL + A client's run is aborted in case of a serious error; for example, the + connection with the database server was lost or the end of script was reached + without completing the last transaction. In addition, if execution of an SQL or meta command fails for reasons other than serialization or deadlock errors, - the client is aborted. Otherwise, if an SQL fails with serialization or + the client is aborted. Otherwise, if an SQL command fails with serialization or deadlock errors, the client is not aborted. In such cases, the current transaction is rolled back, which also includes setting the client variables as they were before the run of this transaction (it is assumed that one @@ -2845,21 +2845,21 @@ statement latencies in milliseconds, failures and retries: time of retries (specified by the option) / the end of benchmark (specified by the option). If the last trial run fails, this transaction will be reported as failed but - the client is not aborted and continue to work. + the client is not aborted and continues to work. - Without specifying the option a transaction will + Without specifying the option, a transaction will never be retried after a serialization or deadlock error because its default - values is 1. Use an unlimited number of tries (--max-tries=0) + value is 1. Use an unlimited number of tries (--max-tries=0) and the option to limit only the maximum time of tries. You can also use the option to limit the benchmark duration under an unlimited number of tries. Be careful when repeating scripts that contain multiple transactions: the - script is always retried completely, so the successful transactions can be + script is always retried completely, so successful transactions can be performed several times. @@ -2879,7 +2879,7 @@ statement latencies in milliseconds, failures and retries: The main report contains the number of failed transactions. If the option is not equal to 1, the main report also - contains the statistics related to retries: the total number of retried + contains statistics related to retries: the total number of retried transactions and total number of retries. The per-script report inherits all these fields from the main report. The per-statement report displays retry statistics only if the option is not equal to 1. @@ -2890,7 +2890,7 @@ statement latencies in milliseconds, failures and retries: aggregation logs, as well as in the main and per-script reports, use the option. If you also want to distinguish all errors and failures (errors without retrying) by type including which - limit for retries was violated and how far it was exceeded for the + limit for retries was exceeded and how much it was exceeded by for the serialization/deadlock failures, use the option. From b0e5f02ddc836499bdcf093df52e4c342dda5891 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Mon, 11 Apr 2022 20:49:41 +1200 Subject: [PATCH 478/772] Fix various typos and spelling mistakes in code comments Author: Justin Pryzby Discussion: https://postgr.es/m/20220411020336.GB26620@telsasoft.com --- contrib/ltree/ltree.h | 2 +- src/backend/access/brin/brin_minmax_multi.c | 2 +- src/backend/access/heap/heapam.c | 2 +- src/backend/access/transam/xlogreader.c | 2 +- src/backend/access/transam/xlogrecovery.c | 2 +- src/backend/commands/dbcommands.c | 2 +- src/backend/commands/vacuumparallel.c | 2 +- src/backend/executor/nodeMergeAppend.c | 2 +- src/backend/optimizer/path/costsize.c | 6 +++--- src/backend/optimizer/path/pathkeys.c | 10 +++++----- src/backend/parser/parse_expr.c | 2 +- src/backend/replication/basebackup_server.c | 6 +++--- src/backend/replication/logical/reorderbuffer.c | 2 +- src/backend/replication/slot.c | 2 +- src/backend/storage/ipc/procarray.c | 2 +- src/backend/tsearch/ts_parse.c | 2 +- src/backend/utils/adt/genfile.c | 6 +++--- src/backend/utils/adt/geo_ops.c | 2 +- src/backend/utils/adt/pg_locale.c | 2 +- src/backend/utils/adt/tsquery.c | 2 +- src/backend/utils/cache/relmapper.c | 4 ++-- src/backend/utils/error/csvlog.c | 2 +- src/backend/utils/error/elog.c | 2 +- src/backend/utils/error/jsonlog.c | 2 +- src/backend/utils/fmgr/funcapi.c | 2 +- src/backend/utils/mmgr/generation.c | 2 +- src/bin/pg_basebackup/pg_basebackup.c | 2 +- src/bin/pgbench/pgbench.c | 4 ++-- src/bin/psql/copy.c | 3 ++- src/bin/psql/describe.c | 2 +- src/bin/psql/tab-complete.c | 2 +- src/include/utils/sortsupport.h | 2 +- src/tools/mark_pgdllimport.pl | 2 +- 33 files changed, 46 insertions(+), 45 deletions(-) diff --git a/contrib/ltree/ltree.h b/contrib/ltree/ltree.h index 10341d6021..564e4fa81b 100644 --- a/contrib/ltree/ltree.h +++ b/contrib/ltree/ltree.h @@ -24,7 +24,7 @@ * modified to look for -D compile flags in Makefiles, so here, in order to * get the historic behavior of LOWER_NODE not being defined on MSVC, we only * define it when not building in that environment. This is important as we - * want to maintain the same LOWER_NODE behavior after a pg_update. + * want to maintain the same LOWER_NODE behavior after a pg_upgrade. */ #ifndef _MSC_VER #define LOWER_NODE diff --git a/src/backend/access/brin/brin_minmax_multi.c b/src/backend/access/brin/brin_minmax_multi.c index 82333752f1..10d4f17bc6 100644 --- a/src/backend/access/brin/brin_minmax_multi.c +++ b/src/backend/access/brin/brin_minmax_multi.c @@ -310,7 +310,7 @@ AssertCheckRanges(Ranges *ranges, FmgrInfo *cmpFn, Oid colloid) */ AssertArrayOrder(cmpFn, colloid, ranges->values, 2 * ranges->nranges); - /* then the single-point ranges (with nvalues boundar values ) */ + /* then the single-point ranges (with nvalues boundary values ) */ AssertArrayOrder(cmpFn, colloid, &ranges->values[2 * ranges->nranges], ranges->nsorted); diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 1ee985f633..a03122df8d 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -1470,7 +1470,7 @@ heap_getnextslot_tidrange(TableScanDesc sscan, ScanDirection direction, * heap_set_tidrange will have used heap_setscanlimits to limit the * range of pages we scan to only ones that can contain the TID range * we're scanning for. Here we must filter out any tuples from these - * pages that are outwith that range. + * pages that are outside of that range. */ if (ItemPointerCompare(&scan->rs_ctup.t_self, mintid) < 0) { diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index a5f1a648d3..b3e37003ac 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -300,7 +300,7 @@ XLogReleasePreviousRecord(XLogReaderState *state) /* Release the space. */ if (unlikely(record->oversized)) { - /* It's not in the the decode buffer, so free it to release space. */ + /* It's not in the decode buffer, so free it to release space. */ pfree(record); } else diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 2e555f8573..4ee29182ac 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -2975,7 +2975,7 @@ ReadRecord(XLogPrefetcher *xlogprefetcher, int emode, /* * When not in standby mode we find that WAL ends in an incomplete * record, keep track of that record. After recovery is done, - * we'll write a record to indicate downstream WAL readers that + * we'll write a record to indicate to downstream WAL readers that * that portion is to be ignored. */ if (!StandbyMode && diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index ce776c53ca..1bbecfeddf 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -386,7 +386,7 @@ ScanSourceDatabasePgClassPage(Page page, Buffer buf, Oid tbid, Oid dbid, * needs to be copied from the source database to the destination database, * and if so, construct a CreateDBRelInfo for it. * - * Visbility checks are handled by the caller, so our job here is just + * Visibility checks are handled by the caller, so our job here is just * to assess the data stored in the tuple. */ CreateDBRelInfo * diff --git a/src/backend/commands/vacuumparallel.c b/src/backend/commands/vacuumparallel.c index 6b4f742578..bbf3b69c57 100644 --- a/src/backend/commands/vacuumparallel.c +++ b/src/backend/commands/vacuumparallel.c @@ -12,7 +12,7 @@ * the memory space for storing dead items allocated in the DSM segment. We * launch parallel worker processes at the start of parallel index * bulk-deletion and index cleanup and once all indexes are processed, the - * parallel worker processes exit. Each time we process indexes parallelly, + * parallel worker processes exit. Each time we process indexes in parallel, * the parallel context is re-initialized so that the same DSM can be used for * multiple passes of index bulk-deletion and index cleanup. * diff --git a/src/backend/executor/nodeMergeAppend.c b/src/backend/executor/nodeMergeAppend.c index ecf9052e03..c5c62fa5c7 100644 --- a/src/backend/executor/nodeMergeAppend.c +++ b/src/backend/executor/nodeMergeAppend.c @@ -100,7 +100,7 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags) /* * When no run-time pruning is required and there's at least one - * subplan, we can fill as_valid_subplans immediately, preventing + * subplan, we can fill ms_valid_subplans immediately, preventing * later calls to ExecFindMatchingSubPlans. */ if (!prunestate->do_exec_prune && nplans > 0) diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index ec3c23013a..b787c6f81a 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -1976,8 +1976,8 @@ compute_cpu_sort_cost(PlannerInfo *root, List *pathkeys, int nPresortedKeys, * by calling estimate_num_groups_incremental(), which estimates the * group size for "new" pathkeys. * - * Note: estimate_num_groups_incremntal does not handle fake Vars, so use - * a default estimate otherwise. + * Note: estimate_num_groups_incremental does not handle fake Vars, so + * use a default estimate otherwise. */ if (!has_fake_var) nGroups = estimate_num_groups_incremental(root, pathkeyExprs, @@ -6471,7 +6471,7 @@ compute_bitmap_pages(PlannerInfo *root, RelOptInfo *baserel, Path *bitmapqual, exact_pages = heap_pages - lossy_pages; /* - * If there are lossy pages then recompute the number of tuples + * If there are lossy pages then recompute the number of tuples * processed by the bitmap heap node. We assume here that the chance * of a given tuple coming from an exact page is the same as the * chance that a given page is exact. This might not be true, but diff --git a/src/backend/optimizer/path/pathkeys.c b/src/backend/optimizer/path/pathkeys.c index 75fe03fd04..91556910ae 100644 --- a/src/backend/optimizer/path/pathkeys.c +++ b/src/backend/optimizer/path/pathkeys.c @@ -2383,16 +2383,16 @@ pathkeys_useful_for_ordering(PlannerInfo *root, List *pathkeys) * Count the number of pathkeys that are useful for grouping (instead of * explicit sort) * - * Group pathkeys could be reordered to benefit from the odering. The ordering - * may not be "complete" and may require incremental sort, but that's fine. So - * we simply count prefix pathkeys with a matching group key, and stop once we - * find the first pathkey without a match. + * Group pathkeys could be reordered to benefit from the ordering. The + * ordering may not be "complete" and may require incremental sort, but that's + * fine. So we simply count prefix pathkeys with a matching group key, and + * stop once we find the first pathkey without a match. * * So e.g. with pathkeys (a,b,c) and group keys (a,b,e) this determines (a,b) * pathkeys are useful for grouping, and we might do incremental sort to get * path ordered by (a,b,e). * - * This logic is necessary to retain paths with ordeding not matching grouping + * This logic is necessary to retain paths with ordering not matching grouping * keys directly, without the reordering. * * Returns the length of pathkey prefix with matching group keys. diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index b6a2482f23..3cbd516152 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -3507,7 +3507,7 @@ transformJsonOutput(ParseState *pstate, const JsonOutput *output, } /* - * Transform JSON output clause of JSON contructor functions. + * Transform JSON output clause of JSON constructor functions. * * Derive RETURNING type, if not specified, from argument types. */ diff --git a/src/backend/replication/basebackup_server.c b/src/backend/replication/basebackup_server.c index bc16897b33..f5d73301d8 100644 --- a/src/backend/replication/basebackup_server.c +++ b/src/backend/replication/basebackup_server.c @@ -195,9 +195,9 @@ bbsink_server_end_archive(bbsink *sink) /* * We intentionally don't use data_sync_elevel here, because the server - * shouldn't PANIC just because we can't guarantee the the backup has been - * written down to disk. Running recovery won't fix anything in this case - * anyway. + * shouldn't PANIC just because we can't guarantee that the backup has + * been written down to disk. Running recovery won't fix anything in this + * case anyway. */ if (FileSync(mysink->file, WAIT_EVENT_BASEBACKUP_SYNC) < 0) ereport(ERROR, diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 5adc016d44..6887dc23f6 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -1876,7 +1876,7 @@ ReorderBufferStreamCommit(ReorderBuffer *rb, ReorderBufferTXN *txn) * xid 502 which is not visible to our snapshot. And when we will try to * decode with that catalog tuple, it can lead to a wrong result or a crash. * So, it is necessary to detect concurrent aborts to allow streaming of - * in-progress transactions or decoding of prepared transactions. + * in-progress transactions or decoding of prepared transactions. * * For detecting the concurrent abort we set CheckXidAlive to the current * (sub)transaction's xid for which this change belongs to. And, during diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index c35ea7c35b..5c778f5333 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -247,7 +247,7 @@ ReplicationSlotValidateName(const char *name, int elevel) * to be enabled only at the slot creation time. If we allow this option * to be changed during decoding then it is quite possible that we skip * prepare first time because this option was not enabled. Now next time - * during getting changes, if the two_phase option is enabled it can skip + * during getting changes, if the two_phase option is enabled it can skip * prepare because by that time start decoding point has been moved. So the * user will only get commit prepared. */ diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index 603f6aba71..e184a3552c 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -2338,7 +2338,7 @@ GetSnapshotData(Snapshot snapshot) /* * We don't include our own XIDs (if any) in the snapshot. It - * needs to be includeded in the xmin computation, but we did so + * needs to be included in the xmin computation, but we did so * outside the loop. */ if (pgxactoff == mypgxactoff) diff --git a/src/backend/tsearch/ts_parse.c b/src/backend/tsearch/ts_parse.c index bf4247048d..fe46988161 100644 --- a/src/backend/tsearch/ts_parse.c +++ b/src/backend/tsearch/ts_parse.c @@ -248,7 +248,7 @@ LexizeExec(LexizeData *ld, ParsedLex **correspondLexem) dict = lookup_ts_dictionary_cache(ld->curDictId); /* - * Dictionary ld->curDictId asks us about following words + * Dictionary ld->curDictId asks us about following words */ while (ld->curSub) diff --git a/src/backend/utils/adt/genfile.c b/src/backend/utils/adt/genfile.c index 88f279d1b3..2bf5219256 100644 --- a/src/backend/utils/adt/genfile.c +++ b/src/backend/utils/adt/genfile.c @@ -59,9 +59,9 @@ convert_and_check_filename(text *arg) canonicalize_path(filename); /* filename can change length here */ /* - * Roles with privleges of the 'pg_read_server_files' role are allowed to access - * any files on the server as the PG user, so no need to do any further checks - * here. + * Roles with privileges of the 'pg_read_server_files' role are allowed to + * access any files on the server as the PG user, so no need to do any + * further checks here. */ if (has_privs_of_role(GetUserId(), ROLE_PG_READ_SERVER_FILES)) return filename; diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c index 609aab2e65..b79705f8b3 100644 --- a/src/backend/utils/adt/geo_ops.c +++ b/src/backend/utils/adt/geo_ops.c @@ -3878,7 +3878,7 @@ lseg_inside_poly(Point *a, Point *b, POLYGON *poly, int start) Point p; /* - * if X-intersection wasn't found then check central point of tested + * if X-intersection wasn't found, then check central point of tested * segment. In opposite case we already check all subsegments */ p.x = float8_div(float8_pl(t.p[0].x, t.p[1].x), 2.0); diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index 12603b727c..2c47dea342 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -991,7 +991,7 @@ search_locale_enum(LPWSTR pStr, DWORD dwFlags, LPARAM lparam) test_locale, LOCALE_NAME_MAX_LENGTH)) { /* - * If the enumerated locale does not have a hyphen ("en") OR the + * If the enumerated locale does not have a hyphen ("en") OR the * lc_message input does not have an underscore ("English"), we only * need to compare the tags. */ diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c index f0a95297b3..f54f298814 100644 --- a/src/backend/utils/adt/tsquery.c +++ b/src/backend/utils/adt/tsquery.c @@ -261,7 +261,7 @@ parse_or_operator(TSQueryParserState pstate) /* * Suppose, we found an operand, but could be a not correct operand. * So we still treat OR literal as operation with possibly incorrect - * operand and will not search it as lexeme + * operand and will not search it as lexeme */ if (!t_isspace(ptr)) break; diff --git a/src/backend/utils/cache/relmapper.c b/src/backend/utils/cache/relmapper.c index dee3387d02..75a3aedc5a 100644 --- a/src/backend/utils/cache/relmapper.c +++ b/src/backend/utils/cache/relmapper.c @@ -1044,7 +1044,7 @@ perform_relmap_update(bool shared, const RelMapFile *updates) (shared ? "global" : DatabasePath)); /* - * We succesfully wrote the updated file, so it's now safe to rely on the + * We successfully wrote the updated file, so it's now safe to rely on the * new values in this process, too. */ if (shared) @@ -1093,7 +1093,7 @@ relmap_redo(XLogReaderState *record) * an existing database as we do for creating a new database. In * the latter case, taking the relmap log and sending sinval messages * is unnecessary, but harmless. If we wanted to avoid it, we could - * add a flag to the WAL record to indicate which opration is being + * add a flag to the WAL record to indicate which operation is being * performed. */ LWLockAcquire(RelationMappingLock, LW_EXCLUSIVE); diff --git a/src/backend/utils/error/csvlog.c b/src/backend/utils/error/csvlog.c index 89f78b447d..5c49bc4209 100644 --- a/src/backend/utils/error/csvlog.c +++ b/src/backend/utils/error/csvlog.c @@ -4,7 +4,7 @@ * CSV logging * * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of Californi + * Portions Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index bd4b2c19b1..72778b896a 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -2269,7 +2269,7 @@ write_console(const char *line, int len) /* * Conversion on non-win32 platforms is not implemented yet. It requires * non-throw version of pg_do_encoding_conversion(), that converts - * unconvertable characters to '?' without errors. + * unconvertible characters to '?' without errors. * * XXX: We have a no-throw version now. It doesn't convert to '?' though. */ diff --git a/src/backend/utils/error/jsonlog.c b/src/backend/utils/error/jsonlog.c index 843641c865..f336c063e5 100644 --- a/src/backend/utils/error/jsonlog.c +++ b/src/backend/utils/error/jsonlog.c @@ -4,7 +4,7 @@ * JSON logging * * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of Californi + * Portions Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION diff --git a/src/backend/utils/fmgr/funcapi.c b/src/backend/utils/fmgr/funcapi.c index d269662ad8..9197b0f1e2 100644 --- a/src/backend/utils/fmgr/funcapi.c +++ b/src/backend/utils/fmgr/funcapi.c @@ -69,7 +69,7 @@ static TypeFuncClass get_type_func_class(Oid typid, Oid *base_typeid); * descriptor coming from expectedDesc, which is the tuple descriptor * expected by the caller. SRF_SINGLE_BLESS can be set to complete the * information associated to the tuple descriptor, which is necessary - * in some cases where the tuple descriptor comes from a transient + * in some cases where the tuple descriptor comes from a transient * RECORD datatype. */ void diff --git a/src/backend/utils/mmgr/generation.c b/src/backend/utils/mmgr/generation.c index 685688c155..56ed496386 100644 --- a/src/backend/utils/mmgr/generation.c +++ b/src/backend/utils/mmgr/generation.c @@ -27,7 +27,7 @@ * context's 'freeblock' field. If the freeblock field is already occupied * by another free block we simply return the newly empty block to malloc. * - * This approach to free blocks requires fewer malloc/free calls for truely + * This approach to free blocks requires fewer malloc/free calls for truly * first allocated, first free'd allocation patterns. * *------------------------------------------------------------------------- diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index c1f2253af2..d96ae87303 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -1464,7 +1464,7 @@ ReceiveArchiveStreamChunk(size_t r, char *copybuf, void *callback_data) GetCopyDataEnd(r, copybuf, cursor); /* - * The server shouldn't send progres report messages too + * The server shouldn't send progress report messages too * often, so we force an update each time we receive one. */ progress_report(state->tablespacenum, true, false); diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 8197da8546..e63cea56a1 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -3450,7 +3450,7 @@ discardUntilSync(CState *st) PQclear(res); } - /* exit pipline */ + /* exit pipeline */ if (PQexitPipelineMode(st->con) != 1) { pg_log_error("client %d aborted: failed to exit pipeline mode for rolling back the failed transaction", @@ -7261,7 +7261,7 @@ main(int argc, char **argv) /* * All connections should be already closed in threadRun(), so this - * disconnect_all() will be a no-op, but clean up the connecions just to + * disconnect_all() will be a no-op, but clean up the connections just to * be sure. We don't need to measure the disconnection delays here. */ disconnect_all(state, nclients); diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c index a5ceaec3ac..424a429e1e 100644 --- a/src/bin/psql/copy.c +++ b/src/bin/psql/copy.c @@ -653,7 +653,8 @@ handleCopyIn(PGconn *conn, FILE *copystream, bool isbinary, PGresult **res) * * Make sure there's always space for four more bytes in the * buffer, plus a NUL terminator. That way, an EOF marker is - * never split across two fgets() calls, which simplies the logic. + * never split across two fgets() calls, which simplifies the + * logic. */ if (buflen >= COPYBUFSIZ - 5 || (copydone && buflen > 0)) { diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index e8919ab0be..d04ba2b029 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -3080,7 +3080,7 @@ describeOneTableDetails(const char *schemaname, * servers between v11 and v14, though these must still be shown to * the user. So we use another property that is true for such * inherited triggers to avoid them being hidden, which is their - * dependendence on another trigger. + * dependence on another trigger. */ if (pset.sversion >= 110000 && pset.sversion < 150000) appendPQExpBufferStr(&buf, "(NOT t.tgisinternal OR (t.tgisinternal AND t.tgenabled = 'D') \n" diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 8f163fb7ba..10e8dbc9b1 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -2257,7 +2257,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("COLUMN", "CONSTRAINT", "CHECK", "UNIQUE", "PRIMARY KEY", "EXCLUDE", "FOREIGN KEY"); } - /* ATER TABLE xxx ADD [COLUMN] yyy */ + /* ALTER TABLE xxx ADD [COLUMN] yyy */ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "COLUMN", MatchAny) || (Matches("ALTER", "TABLE", MatchAny, "ADD", MatchAny) && !Matches("ALTER", "TABLE", MatchAny, "ADD", "COLUMN|CONSTRAINT|CHECK|UNIQUE|PRIMARY|EXCLUDE|FOREIGN"))) diff --git a/src/include/utils/sortsupport.h b/src/include/utils/sortsupport.h index 60e5f9940d..4f7c73f0aa 100644 --- a/src/include/utils/sortsupport.h +++ b/src/include/utils/sortsupport.h @@ -24,7 +24,7 @@ * function will have a shim set up by sort support automatically. However, * opclasses that support the optional additional abbreviated key capability * must always provide an authoritative comparator used to tie-break - * inconclusive abbreviated comparisons and also used when aborting + * inconclusive abbreviated comparisons and also used when aborting * abbreviation. Furthermore, a converter and abort/costing function must be * provided. * diff --git a/src/tools/mark_pgdllimport.pl b/src/tools/mark_pgdllimport.pl index a09ec5a369..83b90db6ef 100755 --- a/src/tools/mark_pgdllimport.pl +++ b/src/tools/mark_pgdllimport.pl @@ -6,7 +6,7 @@ # Perl script that tries to add PGDLLIMPORT markings to PostgreSQL # header files. # -# This relies on a few idiosyncracies of the PostgreSQL cding style, +# This relies on a few idiosyncracies of the PostgreSQL coding style, # such as the fact that we always use "extern" in function # declarations, and that we don't use // comments. It's not very # smart and may not catch all cases. From e0064f0ff6dfada2695330c6bc1945fa7ae813be Mon Sep 17 00:00:00 2001 From: David Rowley Date: Mon, 11 Apr 2022 20:50:20 +1200 Subject: [PATCH 479/772] Docs: Mention that relpersistence is for sequences now too Per 344d62fb9. Author: Justin Pryzby Discussion: https://postgr.es/m/20220411020336.GB26620@telsasoft.com --- doc/src/sgml/catalogs.sgml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index c1c89a95c6..6f285871b6 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -2065,8 +2065,8 @@ SCRAM-SHA-256$<iteration count>:&l relpersistence char - p = permanent table, u = unlogged table, - t = temporary table + p = permanent table/sequence, u = unlogged table/sequence, + t = temporary table/sequence
From ad385a494f6ad863b38aa7c708f23aaf223438a7 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 8 Apr 2022 11:02:59 -0400 Subject: [PATCH 480/772] docs: Note the recovery_min_apply_delay bloats pg_wal. Those WAL files that we're waiting to apply have to be stored somewhere. Thom Brown Discussion: http://postgr.es/m/CAA-aLv4SkJRK6GGcd0Axt8kt6_eWMEbtG7f8NJpFh+rNshtdNA@mail.gmail.com --- doc/src/sgml/config.sgml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 81cacdcbe4..cfbb20a39e 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -4872,6 +4872,12 @@ ANY num_sync (
- - <structname>pg_stat_subscription</structname> + + <structname>pg_stat_recovery_prefetch</structname> - pg_stat_subscription + pg_stat_recovery_prefetch - The pg_stat_subscription view will contain one - row per subscription for main worker (with null PID if the worker is - not running), and additional rows for workers handling the initial data - copy of the subscribed tables. + The pg_stat_recovery_prefetch view will contain + only one row. The columns wal_distance, + block_distance and + io_depth show current values, and the + other columns show cumulative counters that can be reset + with the pg_stat_reset_shared function. <structname>pg_stat_recovery_prefetch</structname> View - + - - Column - Type - Description + + + Column Type + + + Description + - - - prefetch - bigint - Number of blocks prefetched because they were not in the buffer pool - - - hit - bigint - Number of blocks not prefetched because they were already in the buffer pool - - - skip_init - bigint - Number of blocks not prefetched because they would be zero-initialized - - - skip_new - bigint - Number of blocks not prefetched because they didn't exist yet - - - skip_fpw - bigint - Number of blocks not prefetched because a full page image was included in the WAL - - - skip_rep - bigint - Number of blocks not prefetched because they were already recently prefetched - - - wal_distance - integer - How many bytes ahead the prefetcher is looking - - - block_distance - integer - How many blocks ahead the prefetcher is looking - - - io_depth - integer - How many prefetches have been initiated but are not yet known to have completed - + + + + + prefetch bigint + + + Number of blocks prefetched because they were not in the buffer pool + + + + + + + + hit bigint + + + Number of blocks not prefetched because they were already in the buffer pool + + + + + + + + skip_init bigint + + + Number of blocks not prefetched because they would be zero-initialized + + + + + + + + skip_new bigint + + + Number of blocks not prefetched because they didn't exist yet + + + + + + + + skip_fpw bigint + + + Number of blocks not prefetched because a full page image was included in the WAL + + + + + + + + skip_rep bigint + + + Number of blocks not prefetched because they were already recently prefetched + + + + + + + + wal_distance int + + + How many bytes ahead the prefetcher is looking + + + + + + + + block_distance int + + + How many blocks ahead the prefetcher is looking + + + + + + + + io_depth int + + + How many prefetches have been initiated but are not yet known to have completed + + +
- - The pg_stat_recovery_prefetch view will contain - only one row. The columns wal_distance, - block_distance and - io_depth show current values, and the - other columns show cumulative counters that can be reset - with the pg_stat_reset_shared function. - +
+ + + <structname>pg_stat_subscription</structname> + + + pg_stat_subscription + <structname>pg_stat_subscription</structname> View From 183c869e1cbf69e7f5408ccb2121d37deec9956e Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Tue, 12 Apr 2022 15:19:57 +0200 Subject: [PATCH 496/772] adjust_partition_colnos mustn't be called if not needed Add an assert to make this very explicit, as well as a code comment. The former should silence Coverity complaining about this. Introduced by 7103ebb7aae8. Reported-by: Ranier Vilela Discussion: https://postgr.es/m/CAEudQAqTTAOzXiYybab+1DQOb3ZUuK99=p_KD+yrRFhcDbd0jg@mail.gmail.com --- src/backend/executor/execPartition.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c index 615bd80973..e03ea27299 100644 --- a/src/backend/executor/execPartition.c +++ b/src/backend/executor/execPartition.c @@ -1530,12 +1530,16 @@ ExecBuildSlotPartitionKeyDescription(Relation rel, * adjust_partition_colnos * Adjust the list of UPDATE target column numbers to account for * attribute differences between the parent and the partition. + * + * Note: mustn't be called if no adjustment is required. */ static List * adjust_partition_colnos(List *colnos, ResultRelInfo *leaf_part_rri) { TupleConversionMap *map = ExecGetChildToRootMap(leaf_part_rri); + Assert(map != NULL); + return adjust_partition_colnos_using_map(colnos, map->attrMap); } @@ -1543,6 +1547,8 @@ adjust_partition_colnos(List *colnos, ResultRelInfo *leaf_part_rri) * adjust_partition_colnos_using_map * Like adjust_partition_colnos, but uses a caller-supplied map instead * of assuming to map from the "root" result relation. + * + * Note: mustn't be called if no adjustment is required. */ static List * adjust_partition_colnos_using_map(List *colnos, AttrMap *attrMap) From 51e81794058e78a151368d0b652f3c92602568c0 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 12 Apr 2022 16:18:01 +0200 Subject: [PATCH 497/772] Make node output prefix match node structure name as done in e58136069687b9cf29c27281e227ac397d72141d --- src/backend/nodes/outfuncs.c | 2 +- src/backend/nodes/readfuncs.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index d5f5e76c55..21fc79fd95 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1792,7 +1792,7 @@ _outJsonValueExpr(StringInfo str, const JsonValueExpr *node) static void _outJsonConstructorExpr(StringInfo str, const JsonConstructorExpr *node) { - WRITE_NODE_TYPE("JSONCTOREXPR"); + WRITE_NODE_TYPE("JSONCONSTRUCTOREXPR"); WRITE_NODE_FIELD(args); WRITE_NODE_FIELD(func); diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 3d150cb25d..ddf76ac778 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -3217,7 +3217,7 @@ parseNodeString(void) return_value = _readJsonReturning(); else if (MATCH("JSONVALUEEXPR", 13)) return_value = _readJsonValueExpr(); - else if (MATCH("JSONCTOREXPR", 12)) + else if (MATCH("JSONCONSTRUCTOREXPR", 19)) return_value = _readJsonConstructorExpr(); else if (MATCH("JSONISPREDICATE", 15)) return_value = _readJsonIsPredicate(); From e7cc4a6e3dcc39f3643f998aa5da6a6f27f28db5 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 12 Apr 2022 16:19:00 +0200 Subject: [PATCH 498/772] Use WRITE_ENUM_FIELD for enum field --- src/backend/nodes/outfuncs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 21fc79fd95..6a02f81ad5 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1797,7 +1797,7 @@ _outJsonConstructorExpr(StringInfo str, const JsonConstructorExpr *node) WRITE_NODE_FIELD(args); WRITE_NODE_FIELD(func); WRITE_NODE_FIELD(coercion); - WRITE_INT_FIELD(type); + WRITE_ENUM_FIELD(type, JsonConstructorType); WRITE_NODE_FIELD(returning); WRITE_BOOL_FIELD(unique); WRITE_BOOL_FIELD(absent_on_null); From d4f109e4a2c028bcd889cc44d84b10fff7d9186b Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 12 Apr 2022 11:36:45 -0400 Subject: [PATCH 499/772] Doc: update description of random() function. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit 3804539e4 neglected to update the documentation's claim that random() uses a "linear congruential algorithm". In hopes of avoiding the same mistake if someone replaces our PRNG again, just say it's a deterministic pseudo-random number generator and leave it at that. Anybody who really wants to know can look in the source code. COMPATIBILITY NOTE FOR RELEASE NOTES: 3804539e4's commit message really should have mentioned that the random() sequence after setseed(), while still repeatable, will differ from what you got in pre-v15 releases. Noted by Dagfinn Ilmari Mannsåker; wording suggestion by Dean Rasheed. Discussion: https://postgr.es/m/875ynfpiru.fsf@wibble.ilmari.org --- doc/src/sgml/func.sgml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 0a5c402640..93ba39eff1 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -1832,8 +1832,9 @@ repeat('Pg', 4) PgPgPgPg
- The random() function uses a simple linear - congruential algorithm. It is fast but not suitable for cryptographic + The random() function uses a deterministic + pseudo-random number generator. + It is fast but not suitable for cryptographic applications; see the module for a more secure alternative. If setseed() is called, the series of results of From 2c9381840fe2d6d1c3179350493fe5fd3dcf90b5 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 12 Apr 2022 13:25:29 -0400 Subject: [PATCH 500/772] Remove not-very-useful early checks of __pg_log_level in logging.h. Enforce __pg_log_level message filtering centrally in logging.c, instead of relying on the calling macros to do it. This is more reliable (e.g. it works correctly for direct calls to pg_log_generic) and it saves a percent or so of total code size because we get rid of so many duplicate checks of __pg_log_level. This does mean that argument expressions in a logging macro will be evaluated even if we end up not printing anything. That seems of little concern for INFO and higher levels as those messages are printed by default, and most of our frontend programs don't even offer a way to turn them off. I left the unlikely() checks in place for DEBUG messages, though. Discussion: https://postgr.es/m/3993549.1649449609@sss.pgh.pa.us --- src/bin/pg_dump/pg_backup_utils.h | 3 +- src/common/logging.c | 4 +++ src/include/common/logging.h | 57 +++++++++++-------------------- 3 files changed, 24 insertions(+), 40 deletions(-) diff --git a/src/bin/pg_dump/pg_backup_utils.h b/src/bin/pg_dump/pg_backup_utils.h index 5b1c51554d..8173bb93cf 100644 --- a/src/bin/pg_dump/pg_backup_utils.h +++ b/src/bin/pg_dump/pg_backup_utils.h @@ -34,8 +34,7 @@ extern void exit_nicely(int code) pg_attribute_noreturn(); /* In pg_dump, we modify pg_fatal to call exit_nicely instead of exit */ #undef pg_fatal #define pg_fatal(...) do { \ - if (likely(__pg_log_level <= PG_LOG_ERROR)) \ - pg_log_generic(PG_LOG_ERROR, PG_LOG_PRIMARY, __VA_ARGS__); \ + pg_log_generic(PG_LOG_ERROR, PG_LOG_PRIMARY, __VA_ARGS__); \ exit_nicely(1); \ } while(0) diff --git a/src/common/logging.c b/src/common/logging.c index 2933cab85c..0b5bcb1a17 100644 --- a/src/common/logging.c +++ b/src/common/logging.c @@ -228,6 +228,10 @@ pg_log_generic_v(enum pg_log_level level, enum pg_log_part part, Assert(fmt); Assert(fmt[strlen(fmt) - 1] != '\n'); + /* Do nothing if log level is too low. */ + if (level < __pg_log_level) + return; + /* * Flush stdout before output to stderr, to ensure sync even when stdout * is buffered. diff --git a/src/include/common/logging.h b/src/include/common/logging.h index e213bb70d0..9f426c32d6 100644 --- a/src/include/common/logging.h +++ b/src/include/common/logging.h @@ -103,50 +103,32 @@ void pg_log_generic_v(enum pg_log_level level, enum pg_log_part part, * Preferred style is to use these macros to perform logging; don't call * pg_log_generic[_v] directly, except perhaps in error interface code. */ -#define pg_log_error(...) do { \ - if (likely(__pg_log_level <= PG_LOG_ERROR)) \ - pg_log_generic(PG_LOG_ERROR, PG_LOG_PRIMARY, __VA_ARGS__); \ - } while(0) +#define pg_log_error(...) \ + pg_log_generic(PG_LOG_ERROR, PG_LOG_PRIMARY, __VA_ARGS__) -#define pg_log_error_detail(...) do { \ - if (likely(__pg_log_level <= PG_LOG_ERROR)) \ - pg_log_generic(PG_LOG_ERROR, PG_LOG_DETAIL, __VA_ARGS__); \ - } while(0) +#define pg_log_error_detail(...) \ + pg_log_generic(PG_LOG_ERROR, PG_LOG_DETAIL, __VA_ARGS__) -#define pg_log_error_hint(...) do { \ - if (likely(__pg_log_level <= PG_LOG_ERROR)) \ - pg_log_generic(PG_LOG_ERROR, PG_LOG_HINT, __VA_ARGS__); \ - } while(0) +#define pg_log_error_hint(...) \ + pg_log_generic(PG_LOG_ERROR, PG_LOG_HINT, __VA_ARGS__) -#define pg_log_warning(...) do { \ - if (likely(__pg_log_level <= PG_LOG_WARNING)) \ - pg_log_generic(PG_LOG_WARNING, PG_LOG_PRIMARY, __VA_ARGS__); \ - } while(0) +#define pg_log_warning(...) \ + pg_log_generic(PG_LOG_WARNING, PG_LOG_PRIMARY, __VA_ARGS__) -#define pg_log_warning_detail(...) do { \ - if (likely(__pg_log_level <= PG_LOG_WARNING)) \ - pg_log_generic(PG_LOG_WARNING, PG_LOG_DETAIL, __VA_ARGS__); \ - } while(0) +#define pg_log_warning_detail(...) \ + pg_log_generic(PG_LOG_WARNING, PG_LOG_DETAIL, __VA_ARGS__) -#define pg_log_warning_hint(...) do { \ - if (likely(__pg_log_level <= PG_LOG_WARNING)) \ - pg_log_generic(PG_LOG_WARNING, PG_LOG_HINT, __VA_ARGS__); \ - } while(0) +#define pg_log_warning_hint(...) \ + pg_log_generic(PG_LOG_WARNING, PG_LOG_HINT, __VA_ARGS__) -#define pg_log_info(...) do { \ - if (likely(__pg_log_level <= PG_LOG_INFO)) \ - pg_log_generic(PG_LOG_INFO, PG_LOG_PRIMARY, __VA_ARGS__); \ - } while(0) +#define pg_log_info(...) \ + pg_log_generic(PG_LOG_INFO, PG_LOG_PRIMARY, __VA_ARGS__) -#define pg_log_info_detail(...) do { \ - if (likely(__pg_log_level <= PG_LOG_INFO)) \ - pg_log_generic(PG_LOG_INFO, PG_LOG_DETAIL, __VA_ARGS__); \ - } while(0) +#define pg_log_info_detail(...) \ + pg_log_generic(PG_LOG_INFO, PG_LOG_DETAIL, __VA_ARGS__) -#define pg_log_info_hint(...) do { \ - if (likely(__pg_log_level <= PG_LOG_INFO)) \ - pg_log_generic(PG_LOG_INFO, PG_LOG_HINT, __VA_ARGS__); \ - } while(0) +#define pg_log_info_hint(...) \ + pg_log_generic(PG_LOG_INFO, PG_LOG_HINT, __VA_ARGS__) #define pg_log_debug(...) do { \ if (unlikely(__pg_log_level <= PG_LOG_DEBUG)) \ @@ -167,8 +149,7 @@ void pg_log_generic_v(enum pg_log_level level, enum pg_log_part part, * A common shortcut: pg_log_error() and immediately exit(1). */ #define pg_fatal(...) do { \ - if (likely(__pg_log_level <= PG_LOG_ERROR)) \ - pg_log_generic(PG_LOG_ERROR, PG_LOG_PRIMARY, __VA_ARGS__); \ + pg_log_generic(PG_LOG_ERROR, PG_LOG_PRIMARY, __VA_ARGS__); \ exit(1); \ } while(0) From 7fc0e7de9fb8306e84d1c15211aba4308f694455 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 12 Apr 2022 14:45:23 -0400 Subject: [PATCH 501/772] Revert the addition of GetMaxBackends() and related stuff. This reverts commits 0147fc7, 4567596, aa64f23, and 5ecd018. There is no longer agreement that introducing this function was the right way to address the problem. The consensus now seems to favor trying to make a correct value for MaxBackends available to mdules executing their _PG_init() functions. Nathan Bossart Discussion: http://postgr.es/m/20220323045229.i23skfscdbvrsuxa@jrouhaud --- src/backend/access/nbtree/nbtutils.c | 4 +- src/backend/access/transam/multixact.c | 31 +++----- src/backend/access/transam/twophase.c | 3 +- src/backend/commands/async.c | 12 ++- src/backend/libpq/pqcomm.c | 3 +- src/backend/postmaster/auxprocess.c | 2 +- src/backend/postmaster/postmaster.c | 14 ++-- src/backend/storage/ipc/dsm.c | 2 +- src/backend/storage/ipc/procarray.c | 25 ++---- src/backend/storage/ipc/procsignal.c | 37 ++++----- src/backend/storage/ipc/sinvaladt.c | 4 +- src/backend/storage/lmgr/deadlock.c | 31 ++++---- src/backend/storage/lmgr/lock.c | 23 +++--- src/backend/storage/lmgr/predicate.c | 10 +-- src/backend/storage/lmgr/proc.c | 17 ++-- src/backend/utils/activity/backend_status.c | 88 ++++++++++----------- src/backend/utils/adt/lockfuncs.c | 5 +- src/backend/utils/init/postinit.c | 55 +++---------- src/include/miscadmin.h | 3 +- 19 files changed, 142 insertions(+), 227 deletions(-) diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c index 96c72fc432..fd1b53885c 100644 --- a/src/backend/access/nbtree/nbtutils.c +++ b/src/backend/access/nbtree/nbtutils.c @@ -2072,7 +2072,7 @@ BTreeShmemSize(void) Size size; size = offsetof(BTVacInfo, vacuums); - size = add_size(size, mul_size(GetMaxBackends(), sizeof(BTOneVacInfo))); + size = add_size(size, mul_size(MaxBackends, sizeof(BTOneVacInfo))); return size; } @@ -2101,7 +2101,7 @@ BTreeShmemInit(void) btvacinfo->cycle_ctr = (BTCycleId) time(NULL); btvacinfo->num_vacuums = 0; - btvacinfo->max_vacuums = GetMaxBackends(); + btvacinfo->max_vacuums = MaxBackends; } else Assert(found); diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index 45907d1b44..8f7d12950e 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -282,11 +282,12 @@ typedef struct MultiXactStateData } MultiXactStateData; /* - * Pointers to the state data in shared memory - * - * The index of the last element of the OldestMemberMXactId and - * OldestVisibleMXactId arrays can be obtained with GetMaxOldestSlot(). + * Last element of OldestMemberMXactId and OldestVisibleMXactId arrays. + * Valid elements are (1..MaxOldestSlot); element 0 is never used. */ +#define MaxOldestSlot (MaxBackends + max_prepared_xacts) + +/* Pointers to the state data in shared memory */ static MultiXactStateData *MultiXactState; static MultiXactId *OldestMemberMXactId; static MultiXactId *OldestVisibleMXactId; @@ -341,7 +342,6 @@ static void MultiXactIdSetOldestVisible(void); static void RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset, int nmembers, MultiXactMember *members); static MultiXactId GetNewMultiXactId(int nmembers, MultiXactOffset *offset); -static inline int GetMaxOldestSlot(void); /* MultiXact cache management */ static int mxactMemberComparator(const void *arg1, const void *arg2); @@ -662,17 +662,6 @@ MultiXactIdSetOldestMember(void) } } -/* - * Retrieve the index of the last element of the OldestMemberMXactId and - * OldestVisibleMXactId arrays. Valid elements are (1..MaxOldestSlot); element - * 0 is never used. - */ -static inline int -GetMaxOldestSlot(void) -{ - return GetMaxBackends() + max_prepared_xacts; -} - /* * MultiXactIdSetOldestVisible * Save the oldest MultiXactId this transaction considers possibly live. @@ -695,7 +684,6 @@ MultiXactIdSetOldestVisible(void) if (!MultiXactIdIsValid(OldestVisibleMXactId[MyBackendId])) { MultiXactId oldestMXact; - int maxOldestSlot = GetMaxOldestSlot(); int i; LWLockAcquire(MultiXactGenLock, LW_EXCLUSIVE); @@ -709,7 +697,7 @@ MultiXactIdSetOldestVisible(void) if (oldestMXact < FirstMultiXactId) oldestMXact = FirstMultiXactId; - for (i = 1; i <= maxOldestSlot; i++) + for (i = 1; i <= MaxOldestSlot; i++) { MultiXactId thisoldest = OldestMemberMXactId[i]; @@ -1843,7 +1831,7 @@ MultiXactShmemSize(void) /* We need 2*MaxOldestSlot + 1 perBackendXactIds[] entries */ #define SHARED_MULTIXACT_STATE_SIZE \ add_size(offsetof(MultiXactStateData, perBackendXactIds) + sizeof(MultiXactId), \ - mul_size(sizeof(MultiXactId) * 2, GetMaxOldestSlot())) + mul_size(sizeof(MultiXactId) * 2, MaxOldestSlot)) size = SHARED_MULTIXACT_STATE_SIZE; size = add_size(size, SimpleLruShmemSize(NUM_MULTIXACTOFFSET_BUFFERS, 0)); @@ -1894,7 +1882,7 @@ MultiXactShmemInit(void) * since we only use indexes 1..MaxOldestSlot in each array. */ OldestMemberMXactId = MultiXactState->perBackendXactIds; - OldestVisibleMXactId = OldestMemberMXactId + GetMaxOldestSlot(); + OldestVisibleMXactId = OldestMemberMXactId + MaxOldestSlot; } /* @@ -2519,7 +2507,6 @@ GetOldestMultiXactId(void) { MultiXactId oldestMXact; MultiXactId nextMXact; - int maxOldestSlot = GetMaxOldestSlot(); int i; /* @@ -2538,7 +2525,7 @@ GetOldestMultiXactId(void) nextMXact = FirstMultiXactId; oldestMXact = nextMXact; - for (i = 1; i <= maxOldestSlot; i++) + for (i = 1; i <= MaxOldestSlot; i++) { MultiXactId thisoldest; diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 7632596008..dc0266693e 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -264,7 +264,6 @@ TwoPhaseShmemInit(void) { GlobalTransaction gxacts; int i; - int max_backends = GetMaxBackends(); Assert(!found); TwoPhaseState->freeGXacts = NULL; @@ -298,7 +297,7 @@ TwoPhaseShmemInit(void) * prepared transaction. Currently multixact.c uses that * technique. */ - gxacts[i].dummyBackendId = max_backends + 1 + i; + gxacts[i].dummyBackendId = MaxBackends + 1 + i; } } else diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c index 455d895a44..3e1b92df03 100644 --- a/src/backend/commands/async.c +++ b/src/backend/commands/async.c @@ -518,7 +518,7 @@ AsyncShmemSize(void) Size size; /* This had better match AsyncShmemInit */ - size = mul_size(GetMaxBackends() + 1, sizeof(QueueBackendStatus)); + size = mul_size(MaxBackends + 1, sizeof(QueueBackendStatus)); size = add_size(size, offsetof(AsyncQueueControl, backend)); size = add_size(size, SimpleLruShmemSize(NUM_NOTIFY_BUFFERS, 0)); @@ -534,7 +534,6 @@ AsyncShmemInit(void) { bool found; Size size; - int max_backends = GetMaxBackends(); /* * Create or attach to the AsyncQueueControl structure. @@ -542,7 +541,7 @@ AsyncShmemInit(void) * The used entries in the backend[] array run from 1 to MaxBackends; the * zero'th entry is unused but must be allocated. */ - size = mul_size(max_backends + 1, sizeof(QueueBackendStatus)); + size = mul_size(MaxBackends + 1, sizeof(QueueBackendStatus)); size = add_size(size, offsetof(AsyncQueueControl, backend)); asyncQueueControl = (AsyncQueueControl *) @@ -557,7 +556,7 @@ AsyncShmemInit(void) QUEUE_FIRST_LISTENER = InvalidBackendId; asyncQueueControl->lastQueueFillWarn = 0; /* zero'th entry won't be used, but let's initialize it anyway */ - for (int i = 0; i <= max_backends; i++) + for (int i = 0; i <= MaxBackends; i++) { QUEUE_BACKEND_PID(i) = InvalidPid; QUEUE_BACKEND_DBOID(i) = InvalidOid; @@ -1633,7 +1632,6 @@ SignalBackends(void) int32 *pids; BackendId *ids; int count; - int max_backends = GetMaxBackends(); /* * Identify backends that we need to signal. We don't want to send @@ -1643,8 +1641,8 @@ SignalBackends(void) * XXX in principle these pallocs could fail, which would be bad. Maybe * preallocate the arrays? They're not that large, though. */ - pids = (int32 *) palloc(max_backends * sizeof(int32)); - ids = (BackendId *) palloc(max_backends * sizeof(BackendId)); + pids = (int32 *) palloc(MaxBackends * sizeof(int32)); + ids = (BackendId *) palloc(MaxBackends * sizeof(BackendId)); count = 0; LWLockAcquire(NotifyQueueLock, LW_EXCLUSIVE); diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index 7d3dc2a51f..03cdc72b40 100644 --- a/src/backend/libpq/pqcomm.c +++ b/src/backend/libpq/pqcomm.c @@ -334,7 +334,6 @@ StreamServerPort(int family, const char *hostName, unsigned short portNumber, struct addrinfo hint; int listen_index = 0; int added = 0; - int max_backends = GetMaxBackends(); #ifdef HAVE_UNIX_SOCKETS char unixSocketPath[MAXPGPATH]; @@ -557,7 +556,7 @@ StreamServerPort(int family, const char *hostName, unsigned short portNumber, * intended to provide a clamp on the request on platforms where an * overly large request provokes a kernel error (are there any?). */ - maxconn = max_backends * 2; + maxconn = MaxBackends * 2; if (maxconn > PG_SOMAXCONN) maxconn = PG_SOMAXCONN; diff --git a/src/backend/postmaster/auxprocess.c b/src/backend/postmaster/auxprocess.c index 0587e45920..39ac4490db 100644 --- a/src/backend/postmaster/auxprocess.c +++ b/src/backend/postmaster/auxprocess.c @@ -116,7 +116,7 @@ AuxiliaryProcessMain(AuxProcType auxtype) * This will need rethinking if we ever want more than one of a particular * auxiliary process type. */ - ProcSignalInit(GetMaxBackends() + MyAuxProcType + 1); + ProcSignalInit(MaxBackends + MyAuxProcType + 1); /* * Auxiliary processes don't run transactions, but they may need a diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 3535e9e47d..3dcaf8a4a5 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -1005,8 +1005,10 @@ PostmasterMain(int argc, char *argv[]) LocalProcessControlFile(false); /* - * Register the apply launcher. It's probably a good idea to call this - * before any modules had a chance to take the background worker slots. + * Register the apply launcher. Since it registers a background worker, + * it needs to be called before InitializeMaxBackends(), and it's probably + * a good idea to call it before any modules had chance to take the + * background worker slots. */ ApplyLauncherRegister(); @@ -1027,8 +1029,8 @@ PostmasterMain(int argc, char *argv[]) #endif /* - * Now that loadable modules have had their chance to alter any GUCs, - * calculate MaxBackends. + * Now that loadable modules have had their chance to register background + * workers, calculate MaxBackends. */ InitializeMaxBackends(); @@ -6142,7 +6144,7 @@ save_backend_variables(BackendParameters *param, Port *port, param->query_id_enabled = query_id_enabled; param->max_safe_fds = max_safe_fds; - param->MaxBackends = GetMaxBackends(); + param->MaxBackends = MaxBackends; #ifdef WIN32 param->PostmasterHandle = PostmasterHandle; @@ -6375,7 +6377,7 @@ restore_backend_variables(BackendParameters *param, Port *port) query_id_enabled = param->query_id_enabled; max_safe_fds = param->max_safe_fds; - SetMaxBackends(param->MaxBackends); + MaxBackends = param->MaxBackends; #ifdef WIN32 PostmasterHandle = param->PostmasterHandle; diff --git a/src/backend/storage/ipc/dsm.c b/src/backend/storage/ipc/dsm.c index ce6f07d4c5..9d86bbe872 100644 --- a/src/backend/storage/ipc/dsm.c +++ b/src/backend/storage/ipc/dsm.c @@ -166,7 +166,7 @@ dsm_postmaster_startup(PGShmemHeader *shim) /* Determine size for new control segment. */ maxitems = PG_DYNSHMEM_FIXED_SLOTS - + PG_DYNSHMEM_SLOTS_PER_BACKEND * GetMaxBackends(); + + PG_DYNSHMEM_SLOTS_PER_BACKEND * MaxBackends; elog(DEBUG2, "dynamic shared memory system will support %u segments", maxitems); segsize = dsm_control_bytes_needed(maxitems); diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index e184a3552c..cb39fdde33 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -97,7 +97,7 @@ typedef struct ProcArrayStruct /* oldest catalog xmin of any replication slot */ TransactionId replication_slot_catalog_xmin; - /* indexes into allProcs[], has ProcArrayMaxProcs entries */ + /* indexes into allProcs[], has PROCARRAY_MAXPROCS entries */ int pgprocnos[FLEXIBLE_ARRAY_MEMBER]; } ProcArrayStruct; @@ -355,17 +355,6 @@ static void MaintainLatestCompletedXidRecovery(TransactionId latestXid); static inline FullTransactionId FullXidRelativeTo(FullTransactionId rel, TransactionId xid); static void GlobalVisUpdateApply(ComputeXidHorizonsResult *horizons); -static inline int GetProcArrayMaxProcs(void); - - -/* - * Retrieve the number of slots in the ProcArray structure. - */ -static inline int -GetProcArrayMaxProcs(void) -{ - return GetMaxBackends() + max_prepared_xacts; -} /* * Report shared-memory space needed by CreateSharedProcArray. @@ -376,8 +365,10 @@ ProcArrayShmemSize(void) Size size; /* Size of the ProcArray structure itself */ +#define PROCARRAY_MAXPROCS (MaxBackends + max_prepared_xacts) + size = offsetof(ProcArrayStruct, pgprocnos); - size = add_size(size, mul_size(sizeof(int), GetProcArrayMaxProcs())); + size = add_size(size, mul_size(sizeof(int), PROCARRAY_MAXPROCS)); /* * During Hot Standby processing we have a data structure called @@ -393,7 +384,7 @@ ProcArrayShmemSize(void) * shared memory is being set up. */ #define TOTAL_MAX_CACHED_SUBXIDS \ - ((PGPROC_MAX_CACHED_SUBXIDS + 1) * GetProcArrayMaxProcs()) + ((PGPROC_MAX_CACHED_SUBXIDS + 1) * PROCARRAY_MAXPROCS) if (EnableHotStandby) { @@ -420,7 +411,7 @@ CreateSharedProcArray(void) ShmemInitStruct("Proc Array", add_size(offsetof(ProcArrayStruct, pgprocnos), mul_size(sizeof(int), - GetProcArrayMaxProcs())), + PROCARRAY_MAXPROCS)), &found); if (!found) @@ -429,7 +420,7 @@ CreateSharedProcArray(void) * We're the first - initialize. */ procArray->numProcs = 0; - procArray->maxProcs = GetProcArrayMaxProcs(); + procArray->maxProcs = PROCARRAY_MAXPROCS; procArray->maxKnownAssignedXids = TOTAL_MAX_CACHED_SUBXIDS; procArray->numKnownAssignedXids = 0; procArray->tailKnownAssignedXids = 0; @@ -4645,7 +4636,7 @@ KnownAssignedXidsCompress(bool force) */ int nelements = head - tail; - if (nelements < 4 * GetProcArrayMaxProcs() || + if (nelements < 4 * PROCARRAY_MAXPROCS || nelements < 2 * pArray->numKnownAssignedXids) return; } diff --git a/src/backend/storage/ipc/procsignal.c b/src/backend/storage/ipc/procsignal.c index f41563a0a4..00d66902d8 100644 --- a/src/backend/storage/ipc/procsignal.c +++ b/src/backend/storage/ipc/procsignal.c @@ -81,6 +81,13 @@ typedef struct ProcSignalSlot psh_slot[FLEXIBLE_ARRAY_MEMBER]; } ProcSignalHeader; +/* + * We reserve a slot for each possible BackendId, plus one for each + * possible auxiliary process type. (This scheme assumes there is not + * more than one of any auxiliary process type at a time.) + */ +#define NumProcSignalSlots (MaxBackends + NUM_AUXPROCTYPES) + /* Check whether the relevant type bit is set in the flags. */ #define BARRIER_SHOULD_CHECK(flags, type) \ (((flags) & (((uint32) 1) << (uint32) (type))) != 0) @@ -95,20 +102,6 @@ static ProcSignalSlot *MyProcSignalSlot = NULL; static bool CheckProcSignal(ProcSignalReason reason); static void CleanupProcSignalState(int status, Datum arg); static void ResetProcSignalBarrierBits(uint32 flags); -static inline int GetNumProcSignalSlots(void); - -/* - * GetNumProcSignalSlots - * - * We reserve a slot for each possible BackendId, plus one for each possible - * auxiliary process type. (This scheme assume there is not more than one of - * any auxiliary process type at a time.) - */ -static inline int -GetNumProcSignalSlots(void) -{ - return GetMaxBackends() + NUM_AUXPROCTYPES; -} /* * ProcSignalShmemSize @@ -119,7 +112,7 @@ ProcSignalShmemSize(void) { Size size; - size = mul_size(GetNumProcSignalSlots(), sizeof(ProcSignalSlot)); + size = mul_size(NumProcSignalSlots, sizeof(ProcSignalSlot)); size = add_size(size, offsetof(ProcSignalHeader, psh_slot)); return size; } @@ -133,7 +126,6 @@ ProcSignalShmemInit(void) { Size size = ProcSignalShmemSize(); bool found; - int numProcSignalSlots = GetNumProcSignalSlots(); ProcSignal = (ProcSignalHeader *) ShmemInitStruct("ProcSignal", size, &found); @@ -145,7 +137,7 @@ ProcSignalShmemInit(void) pg_atomic_init_u64(&ProcSignal->psh_barrierGeneration, 0); - for (i = 0; i < numProcSignalSlots; ++i) + for (i = 0; i < NumProcSignalSlots; ++i) { ProcSignalSlot *slot = &ProcSignal->psh_slot[i]; @@ -171,7 +163,7 @@ ProcSignalInit(int pss_idx) ProcSignalSlot *slot; uint64 barrier_generation; - Assert(pss_idx >= 1 && pss_idx <= GetNumProcSignalSlots()); + Assert(pss_idx >= 1 && pss_idx <= NumProcSignalSlots); slot = &ProcSignal->psh_slot[pss_idx - 1]; @@ -300,7 +292,7 @@ SendProcSignal(pid_t pid, ProcSignalReason reason, BackendId backendId) */ int i; - for (i = GetNumProcSignalSlots() - 1; i >= 0; i--) + for (i = NumProcSignalSlots - 1; i >= 0; i--) { slot = &ProcSignal->psh_slot[i]; @@ -341,7 +333,6 @@ EmitProcSignalBarrier(ProcSignalBarrierType type) { uint32 flagbit = 1 << (uint32) type; uint64 generation; - int numProcSignalSlots = GetNumProcSignalSlots(); /* * Set all the flags. @@ -351,7 +342,7 @@ EmitProcSignalBarrier(ProcSignalBarrierType type) * anything that we do afterwards. (This is also true of the later call to * pg_atomic_add_fetch_u64.) */ - for (int i = 0; i < numProcSignalSlots; i++) + for (int i = 0; i < NumProcSignalSlots; i++) { volatile ProcSignalSlot *slot = &ProcSignal->psh_slot[i]; @@ -377,7 +368,7 @@ EmitProcSignalBarrier(ProcSignalBarrierType type) * backends that need to update state - but they won't actually need to * change any state. */ - for (int i = numProcSignalSlots - 1; i >= 0; i--) + for (int i = NumProcSignalSlots - 1; i >= 0; i--) { volatile ProcSignalSlot *slot = &ProcSignal->psh_slot[i]; pid_t pid = slot->pss_pid; @@ -402,7 +393,7 @@ WaitForProcSignalBarrier(uint64 generation) { Assert(generation <= pg_atomic_read_u64(&ProcSignal->psh_barrierGeneration)); - for (int i = GetNumProcSignalSlots() - 1; i >= 0; i--) + for (int i = NumProcSignalSlots - 1; i >= 0; i--) { ProcSignalSlot *slot = &ProcSignal->psh_slot[i]; uint64 oldval; diff --git a/src/backend/storage/ipc/sinvaladt.c b/src/backend/storage/ipc/sinvaladt.c index 2dec668bbc..2861c03e04 100644 --- a/src/backend/storage/ipc/sinvaladt.c +++ b/src/backend/storage/ipc/sinvaladt.c @@ -213,7 +213,7 @@ SInvalShmemSize(void) * free slot. This is because the autovacuum launcher and worker processes, * which are included in MaxBackends, are not started in Hot Standby mode. */ - size = add_size(size, mul_size(sizeof(ProcState), GetMaxBackends())); + size = add_size(size, mul_size(sizeof(ProcState), MaxBackends)); return size; } @@ -239,7 +239,7 @@ CreateSharedInvalidationState(void) shmInvalBuffer->maxMsgNum = 0; shmInvalBuffer->nextThreshold = CLEANUP_MIN; shmInvalBuffer->lastBackend = 0; - shmInvalBuffer->maxBackends = GetMaxBackends(); + shmInvalBuffer->maxBackends = MaxBackends; SpinLockInit(&shmInvalBuffer->msgnumLock); /* The buffer[] array is initially all unused, so we need not fill it */ diff --git a/src/backend/storage/lmgr/deadlock.c b/src/backend/storage/lmgr/deadlock.c index b5d539ba5d..cd9c0418ec 100644 --- a/src/backend/storage/lmgr/deadlock.c +++ b/src/backend/storage/lmgr/deadlock.c @@ -143,7 +143,6 @@ void InitDeadLockChecking(void) { MemoryContext oldcxt; - int max_backends = GetMaxBackends(); /* Make sure allocations are permanent */ oldcxt = MemoryContextSwitchTo(TopMemoryContext); @@ -152,16 +151,16 @@ InitDeadLockChecking(void) * FindLockCycle needs at most MaxBackends entries in visitedProcs[] and * deadlockDetails[]. */ - visitedProcs = (PGPROC **) palloc(max_backends * sizeof(PGPROC *)); - deadlockDetails = (DEADLOCK_INFO *) palloc(max_backends * sizeof(DEADLOCK_INFO)); + visitedProcs = (PGPROC **) palloc(MaxBackends * sizeof(PGPROC *)); + deadlockDetails = (DEADLOCK_INFO *) palloc(MaxBackends * sizeof(DEADLOCK_INFO)); /* * TopoSort needs to consider at most MaxBackends wait-queue entries, and * it needn't run concurrently with FindLockCycle. */ topoProcs = visitedProcs; /* re-use this space */ - beforeConstraints = (int *) palloc(max_backends * sizeof(int)); - afterConstraints = (int *) palloc(max_backends * sizeof(int)); + beforeConstraints = (int *) palloc(MaxBackends * sizeof(int)); + afterConstraints = (int *) palloc(MaxBackends * sizeof(int)); /* * We need to consider rearranging at most MaxBackends/2 wait queues @@ -170,8 +169,8 @@ InitDeadLockChecking(void) * MaxBackends total waiters. */ waitOrders = (WAIT_ORDER *) - palloc((max_backends / 2) * sizeof(WAIT_ORDER)); - waitOrderProcs = (PGPROC **) palloc(max_backends * sizeof(PGPROC *)); + palloc((MaxBackends / 2) * sizeof(WAIT_ORDER)); + waitOrderProcs = (PGPROC **) palloc(MaxBackends * sizeof(PGPROC *)); /* * Allow at most MaxBackends distinct constraints in a configuration. (Is @@ -181,7 +180,7 @@ InitDeadLockChecking(void) * limits the maximum recursion depth of DeadLockCheckRecurse. Making it * really big might potentially allow a stack-overflow problem. */ - maxCurConstraints = max_backends; + maxCurConstraints = MaxBackends; curConstraints = (EDGE *) palloc(maxCurConstraints * sizeof(EDGE)); /* @@ -192,7 +191,7 @@ InitDeadLockChecking(void) * last MaxBackends entries in possibleConstraints[] are reserved as * output workspace for FindLockCycle. */ - maxPossibleConstraints = max_backends * 4; + maxPossibleConstraints = MaxBackends * 4; possibleConstraints = (EDGE *) palloc(maxPossibleConstraints * sizeof(EDGE)); @@ -328,7 +327,7 @@ DeadLockCheckRecurse(PGPROC *proc) if (nCurConstraints >= maxCurConstraints) return true; /* out of room for active constraints? */ oldPossibleConstraints = nPossibleConstraints; - if (nPossibleConstraints + nEdges + GetMaxBackends() <= maxPossibleConstraints) + if (nPossibleConstraints + nEdges + MaxBackends <= maxPossibleConstraints) { /* We can save the edge list in possibleConstraints[] */ nPossibleConstraints += nEdges; @@ -389,7 +388,7 @@ TestConfiguration(PGPROC *startProc) /* * Make sure we have room for FindLockCycle's output. */ - if (nPossibleConstraints + GetMaxBackends() > maxPossibleConstraints) + if (nPossibleConstraints + MaxBackends > maxPossibleConstraints) return -1; /* @@ -487,7 +486,7 @@ FindLockCycleRecurse(PGPROC *checkProc, * record total length of cycle --- outer levels will now fill * deadlockDetails[] */ - Assert(depth <= GetMaxBackends()); + Assert(depth <= MaxBackends); nDeadlockDetails = depth; return true; @@ -501,7 +500,7 @@ FindLockCycleRecurse(PGPROC *checkProc, } } /* Mark proc as seen */ - Assert(nVisitedProcs < GetMaxBackends()); + Assert(nVisitedProcs < MaxBackends); visitedProcs[nVisitedProcs++] = checkProc; /* @@ -699,7 +698,7 @@ FindLockCycleRecurseMember(PGPROC *checkProc, /* * Add this edge to the list of soft edges in the cycle */ - Assert(*nSoftEdges < GetMaxBackends()); + Assert(*nSoftEdges < MaxBackends); softEdges[*nSoftEdges].waiter = checkProcLeader; softEdges[*nSoftEdges].blocker = leader; softEdges[*nSoftEdges].lock = lock; @@ -772,7 +771,7 @@ FindLockCycleRecurseMember(PGPROC *checkProc, /* * Add this edge to the list of soft edges in the cycle */ - Assert(*nSoftEdges < GetMaxBackends()); + Assert(*nSoftEdges < MaxBackends); softEdges[*nSoftEdges].waiter = checkProcLeader; softEdges[*nSoftEdges].blocker = leader; softEdges[*nSoftEdges].lock = lock; @@ -835,7 +834,7 @@ ExpandConstraints(EDGE *constraints, waitOrders[nWaitOrders].procs = waitOrderProcs + nWaitOrderProcs; waitOrders[nWaitOrders].nProcs = lock->waitProcs.size; nWaitOrderProcs += lock->waitProcs.size; - Assert(nWaitOrderProcs <= GetMaxBackends()); + Assert(nWaitOrderProcs <= MaxBackends); /* * Do the topo sort. TopoSort need not examine constraints after this diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c index ee2e15c17e..5f5803f681 100644 --- a/src/backend/storage/lmgr/lock.c +++ b/src/backend/storage/lmgr/lock.c @@ -55,7 +55,7 @@ int max_locks_per_xact; /* set by guc.c */ #define NLOCKENTS() \ - mul_size(max_locks_per_xact, add_size(GetMaxBackends(), max_prepared_xacts)) + mul_size(max_locks_per_xact, add_size(MaxBackends, max_prepared_xacts)) /* @@ -2924,7 +2924,6 @@ GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode, int *countp) LWLock *partitionLock; int count = 0; int fast_count = 0; - int max_backends = GetMaxBackends(); if (lockmethodid <= 0 || lockmethodid >= lengthof(LockMethods)) elog(ERROR, "unrecognized lock method: %d", lockmethodid); @@ -2943,12 +2942,12 @@ GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode, int *countp) vxids = (VirtualTransactionId *) MemoryContextAlloc(TopMemoryContext, sizeof(VirtualTransactionId) * - (max_backends + max_prepared_xacts + 1)); + (MaxBackends + max_prepared_xacts + 1)); } else vxids = (VirtualTransactionId *) palloc0(sizeof(VirtualTransactionId) * - (max_backends + max_prepared_xacts + 1)); + (MaxBackends + max_prepared_xacts + 1)); /* Compute hash code and partition lock, and look up conflicting modes. */ hashcode = LockTagHashCode(locktag); @@ -3105,7 +3104,7 @@ GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode, int *countp) LWLockRelease(partitionLock); - if (count > max_backends + max_prepared_xacts) /* should never happen */ + if (count > MaxBackends + max_prepared_xacts) /* should never happen */ elog(PANIC, "too many conflicting locks found"); vxids[count].backendId = InvalidBackendId; @@ -3652,12 +3651,11 @@ GetLockStatusData(void) int els; int el; int i; - int max_backends = GetMaxBackends(); data = (LockData *) palloc(sizeof(LockData)); /* Guess how much space we'll need. */ - els = max_backends; + els = MaxBackends; el = 0; data->locks = (LockInstanceData *) palloc(sizeof(LockInstanceData) * els); @@ -3691,7 +3689,7 @@ GetLockStatusData(void) if (el >= els) { - els += max_backends; + els += MaxBackends; data->locks = (LockInstanceData *) repalloc(data->locks, sizeof(LockInstanceData) * els); } @@ -3723,7 +3721,7 @@ GetLockStatusData(void) if (el >= els) { - els += max_backends; + els += MaxBackends; data->locks = (LockInstanceData *) repalloc(data->locks, sizeof(LockInstanceData) * els); } @@ -3852,7 +3850,7 @@ GetBlockerStatusData(int blocked_pid) * for the procs[] array; the other two could need enlargement, though.) */ data->nprocs = data->nlocks = data->npids = 0; - data->maxprocs = data->maxlocks = data->maxpids = GetMaxBackends(); + data->maxprocs = data->maxlocks = data->maxpids = MaxBackends; data->procs = (BlockedProcData *) palloc(sizeof(BlockedProcData) * data->maxprocs); data->locks = (LockInstanceData *) palloc(sizeof(LockInstanceData) * data->maxlocks); data->waiter_pids = (int *) palloc(sizeof(int) * data->maxpids); @@ -3927,7 +3925,6 @@ GetSingleProcBlockerStatusData(PGPROC *blocked_proc, BlockedProcsData *data) PGPROC *proc; int queue_size; int i; - int max_backends = GetMaxBackends(); /* Nothing to do if this proc is not blocked */ if (theLock == NULL) @@ -3956,7 +3953,7 @@ GetSingleProcBlockerStatusData(PGPROC *blocked_proc, BlockedProcsData *data) if (data->nlocks >= data->maxlocks) { - data->maxlocks += max_backends; + data->maxlocks += MaxBackends; data->locks = (LockInstanceData *) repalloc(data->locks, sizeof(LockInstanceData) * data->maxlocks); } @@ -3985,7 +3982,7 @@ GetSingleProcBlockerStatusData(PGPROC *blocked_proc, BlockedProcsData *data) if (queue_size > data->maxpids - data->npids) { - data->maxpids = Max(data->maxpids + max_backends, + data->maxpids = Max(data->maxpids + MaxBackends, data->npids + queue_size); data->waiter_pids = (int *) repalloc(data->waiter_pids, sizeof(int) * data->maxpids); diff --git a/src/backend/storage/lmgr/predicate.c b/src/backend/storage/lmgr/predicate.c index e337aad5b2..25e7e4e37b 100644 --- a/src/backend/storage/lmgr/predicate.c +++ b/src/backend/storage/lmgr/predicate.c @@ -257,7 +257,7 @@ (&MainLWLockArray[PREDICATELOCK_MANAGER_LWLOCK_OFFSET + (i)].lock) #define NPREDICATELOCKTARGETENTS() \ - mul_size(max_predicate_locks_per_xact, add_size(GetMaxBackends(), max_prepared_xacts)) + mul_size(max_predicate_locks_per_xact, add_size(MaxBackends, max_prepared_xacts)) #define SxactIsOnFinishedList(sxact) (!SHMQueueIsDetached(&((sxact)->finishedLink))) @@ -1222,7 +1222,7 @@ InitPredicateLocks(void) * Compute size for serializable transaction hashtable. Note these * calculations must agree with PredicateLockShmemSize! */ - max_table_size = (GetMaxBackends() + max_prepared_xacts); + max_table_size = (MaxBackends + max_prepared_xacts); /* * Allocate a list to hold information on transactions participating in @@ -1375,7 +1375,7 @@ PredicateLockShmemSize(void) size = add_size(size, size / 10); /* transaction list */ - max_table_size = GetMaxBackends() + max_prepared_xacts; + max_table_size = MaxBackends + max_prepared_xacts; max_table_size *= 10; size = add_size(size, PredXactListDataSize); size = add_size(size, mul_size((Size) max_table_size, @@ -1907,7 +1907,7 @@ GetSerializableTransactionSnapshotInt(Snapshot snapshot, { ++(PredXact->WritableSxactCount); Assert(PredXact->WritableSxactCount <= - (GetMaxBackends() + max_prepared_xacts)); + (MaxBackends + max_prepared_xacts)); } MySerializableXact = sxact; @@ -5111,7 +5111,7 @@ predicatelock_twophase_recover(TransactionId xid, uint16 info, { ++(PredXact->WritableSxactCount); Assert(PredXact->WritableSxactCount <= - (GetMaxBackends() + max_prepared_xacts)); + (MaxBackends + max_prepared_xacts)); } /* diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index 93d082c45e..37aaab1338 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -103,7 +103,7 @@ ProcGlobalShmemSize(void) { Size size = 0; Size TotalProcs = - add_size(GetMaxBackends(), add_size(NUM_AUXILIARY_PROCS, max_prepared_xacts)); + add_size(MaxBackends, add_size(NUM_AUXILIARY_PROCS, max_prepared_xacts)); /* ProcGlobal */ size = add_size(size, sizeof(PROC_HDR)); @@ -127,7 +127,7 @@ ProcGlobalSemas(void) * We need a sema per backend (including autovacuum), plus one for each * auxiliary process. */ - return GetMaxBackends() + NUM_AUXILIARY_PROCS; + return MaxBackends + NUM_AUXILIARY_PROCS; } /* @@ -162,8 +162,7 @@ InitProcGlobal(void) int i, j; bool found; - int max_backends = GetMaxBackends(); - uint32 TotalProcs = max_backends + NUM_AUXILIARY_PROCS + max_prepared_xacts; + uint32 TotalProcs = MaxBackends + NUM_AUXILIARY_PROCS + max_prepared_xacts; /* Create the ProcGlobal shared structure */ ProcGlobal = (PROC_HDR *) @@ -196,7 +195,7 @@ InitProcGlobal(void) MemSet(procs, 0, TotalProcs * sizeof(PGPROC)); ProcGlobal->allProcs = procs; /* XXX allProcCount isn't really all of them; it excludes prepared xacts */ - ProcGlobal->allProcCount = max_backends + NUM_AUXILIARY_PROCS; + ProcGlobal->allProcCount = MaxBackends + NUM_AUXILIARY_PROCS; /* * Allocate arrays mirroring PGPROC fields in a dense manner. See @@ -222,7 +221,7 @@ InitProcGlobal(void) * dummy PGPROCs don't need these though - they're never associated * with a real process */ - if (i < max_backends + NUM_AUXILIARY_PROCS) + if (i < MaxBackends + NUM_AUXILIARY_PROCS) { procs[i].sem = PGSemaphoreCreate(); InitSharedLatch(&(procs[i].procLatch)); @@ -259,7 +258,7 @@ InitProcGlobal(void) ProcGlobal->bgworkerFreeProcs = &procs[i]; procs[i].procgloballist = &ProcGlobal->bgworkerFreeProcs; } - else if (i < max_backends) + else if (i < MaxBackends) { /* PGPROC for walsender, add to walsenderFreeProcs list */ procs[i].links.next = (SHM_QUEUE *) ProcGlobal->walsenderFreeProcs; @@ -287,8 +286,8 @@ InitProcGlobal(void) * Save pointers to the blocks of PGPROC structures reserved for auxiliary * processes and prepared transactions. */ - AuxiliaryProcs = &procs[max_backends]; - PreparedXactProcs = &procs[max_backends + NUM_AUXILIARY_PROCS]; + AuxiliaryProcs = &procs[MaxBackends]; + PreparedXactProcs = &procs[MaxBackends + NUM_AUXILIARY_PROCS]; /* Create ProcStructLock spinlock, too */ ProcStructLock = (slock_t *) ShmemAlloc(sizeof(slock_t)); diff --git a/src/backend/utils/activity/backend_status.c b/src/backend/utils/activity/backend_status.c index 079321599d..c7ed1e6d7a 100644 --- a/src/backend/utils/activity/backend_status.c +++ b/src/backend/utils/activity/backend_status.c @@ -26,6 +26,18 @@ #include "utils/memutils.h" +/* ---------- + * Total number of backends including auxiliary + * + * We reserve a slot for each possible BackendId, plus one for each + * possible auxiliary process type. (This scheme assumes there is not + * more than one of any auxiliary process type at a time.) MaxBackends + * includes autovacuum workers and background workers as well. + * ---------- + */ +#define NumBackendStatSlots (MaxBackends + NUM_AUXPROCTYPES) + + /* ---------- * GUC parameters * ---------- @@ -63,23 +75,8 @@ static MemoryContext backendStatusSnapContext; static void pgstat_beshutdown_hook(int code, Datum arg); static void pgstat_read_current_status(void); static void pgstat_setup_backend_status_context(void); -static inline int GetNumBackendStatSlots(void); -/* - * Retrieve the total number of backends including auxiliary - * - * We reserve a slot for each possible BackendId, plus one for each possible - * auxiliary process type. (This scheme assumes there is not more than one of - * any auxiliary process type at a time.) MaxBackends includes autovacuum - * workers and background workers as well. - */ -static inline int -GetNumBackendStatSlots(void) -{ - return GetMaxBackends() + NUM_AUXPROCTYPES; -} - /* * Report shared-memory space needed by CreateSharedBackendStatus. */ @@ -87,28 +84,27 @@ Size BackendStatusShmemSize(void) { Size size; - int numBackendStatSlots = GetNumBackendStatSlots(); /* BackendStatusArray: */ - size = mul_size(sizeof(PgBackendStatus), numBackendStatSlots); + size = mul_size(sizeof(PgBackendStatus), NumBackendStatSlots); /* BackendAppnameBuffer: */ size = add_size(size, - mul_size(NAMEDATALEN, numBackendStatSlots)); + mul_size(NAMEDATALEN, NumBackendStatSlots)); /* BackendClientHostnameBuffer: */ size = add_size(size, - mul_size(NAMEDATALEN, numBackendStatSlots)); + mul_size(NAMEDATALEN, NumBackendStatSlots)); /* BackendActivityBuffer: */ size = add_size(size, - mul_size(pgstat_track_activity_query_size, numBackendStatSlots)); + mul_size(pgstat_track_activity_query_size, NumBackendStatSlots)); #ifdef USE_SSL /* BackendSslStatusBuffer: */ size = add_size(size, - mul_size(sizeof(PgBackendSSLStatus), numBackendStatSlots)); + mul_size(sizeof(PgBackendSSLStatus), NumBackendStatSlots)); #endif #ifdef ENABLE_GSS /* BackendGssStatusBuffer: */ size = add_size(size, - mul_size(sizeof(PgBackendGSSStatus), numBackendStatSlots)); + mul_size(sizeof(PgBackendGSSStatus), NumBackendStatSlots)); #endif return size; } @@ -124,10 +120,9 @@ CreateSharedBackendStatus(void) bool found; int i; char *buffer; - int numBackendStatSlots = GetNumBackendStatSlots(); /* Create or attach to the shared array */ - size = mul_size(sizeof(PgBackendStatus), numBackendStatSlots); + size = mul_size(sizeof(PgBackendStatus), NumBackendStatSlots); BackendStatusArray = (PgBackendStatus *) ShmemInitStruct("Backend Status Array", size, &found); @@ -140,7 +135,7 @@ CreateSharedBackendStatus(void) } /* Create or attach to the shared appname buffer */ - size = mul_size(NAMEDATALEN, numBackendStatSlots); + size = mul_size(NAMEDATALEN, NumBackendStatSlots); BackendAppnameBuffer = (char *) ShmemInitStruct("Backend Application Name Buffer", size, &found); @@ -150,7 +145,7 @@ CreateSharedBackendStatus(void) /* Initialize st_appname pointers. */ buffer = BackendAppnameBuffer; - for (i = 0; i < numBackendStatSlots; i++) + for (i = 0; i < NumBackendStatSlots; i++) { BackendStatusArray[i].st_appname = buffer; buffer += NAMEDATALEN; @@ -158,7 +153,7 @@ CreateSharedBackendStatus(void) } /* Create or attach to the shared client hostname buffer */ - size = mul_size(NAMEDATALEN, numBackendStatSlots); + size = mul_size(NAMEDATALEN, NumBackendStatSlots); BackendClientHostnameBuffer = (char *) ShmemInitStruct("Backend Client Host Name Buffer", size, &found); @@ -168,7 +163,7 @@ CreateSharedBackendStatus(void) /* Initialize st_clienthostname pointers. */ buffer = BackendClientHostnameBuffer; - for (i = 0; i < numBackendStatSlots; i++) + for (i = 0; i < NumBackendStatSlots; i++) { BackendStatusArray[i].st_clienthostname = buffer; buffer += NAMEDATALEN; @@ -177,7 +172,7 @@ CreateSharedBackendStatus(void) /* Create or attach to the shared activity buffer */ BackendActivityBufferSize = mul_size(pgstat_track_activity_query_size, - numBackendStatSlots); + NumBackendStatSlots); BackendActivityBuffer = (char *) ShmemInitStruct("Backend Activity Buffer", BackendActivityBufferSize, @@ -189,7 +184,7 @@ CreateSharedBackendStatus(void) /* Initialize st_activity pointers. */ buffer = BackendActivityBuffer; - for (i = 0; i < numBackendStatSlots; i++) + for (i = 0; i < NumBackendStatSlots; i++) { BackendStatusArray[i].st_activity_raw = buffer; buffer += pgstat_track_activity_query_size; @@ -198,7 +193,7 @@ CreateSharedBackendStatus(void) #ifdef USE_SSL /* Create or attach to the shared SSL status buffer */ - size = mul_size(sizeof(PgBackendSSLStatus), numBackendStatSlots); + size = mul_size(sizeof(PgBackendSSLStatus), NumBackendStatSlots); BackendSslStatusBuffer = (PgBackendSSLStatus *) ShmemInitStruct("Backend SSL Status Buffer", size, &found); @@ -210,7 +205,7 @@ CreateSharedBackendStatus(void) /* Initialize st_sslstatus pointers. */ ptr = BackendSslStatusBuffer; - for (i = 0; i < numBackendStatSlots; i++) + for (i = 0; i < NumBackendStatSlots; i++) { BackendStatusArray[i].st_sslstatus = ptr; ptr++; @@ -220,7 +215,7 @@ CreateSharedBackendStatus(void) #ifdef ENABLE_GSS /* Create or attach to the shared GSSAPI status buffer */ - size = mul_size(sizeof(PgBackendGSSStatus), numBackendStatSlots); + size = mul_size(sizeof(PgBackendGSSStatus), NumBackendStatSlots); BackendGssStatusBuffer = (PgBackendGSSStatus *) ShmemInitStruct("Backend GSS Status Buffer", size, &found); @@ -232,7 +227,7 @@ CreateSharedBackendStatus(void) /* Initialize st_gssstatus pointers. */ ptr = BackendGssStatusBuffer; - for (i = 0; i < numBackendStatSlots; i++) + for (i = 0; i < NumBackendStatSlots; i++) { BackendStatusArray[i].st_gssstatus = ptr; ptr++; @@ -256,7 +251,7 @@ pgstat_beinit(void) /* Initialize MyBEEntry */ if (MyBackendId != InvalidBackendId) { - Assert(MyBackendId >= 1 && MyBackendId <= GetMaxBackends()); + Assert(MyBackendId >= 1 && MyBackendId <= MaxBackends); MyBEEntry = &BackendStatusArray[MyBackendId - 1]; } else @@ -272,7 +267,7 @@ pgstat_beinit(void) * MaxBackends + AuxBackendType + 1 as the index of the slot for an * auxiliary process. */ - MyBEEntry = &BackendStatusArray[GetMaxBackends() + MyAuxProcType]; + MyBEEntry = &BackendStatusArray[MaxBackends + MyAuxProcType]; } /* Set up a process-exit hook to clean up */ @@ -744,7 +739,6 @@ pgstat_read_current_status(void) PgBackendGSSStatus *localgssstatus; #endif int i; - int numBackendStatSlots = GetNumBackendStatSlots(); if (localBackendStatusTable) return; /* already done */ @@ -761,32 +755,32 @@ pgstat_read_current_status(void) */ localtable = (LocalPgBackendStatus *) MemoryContextAlloc(backendStatusSnapContext, - sizeof(LocalPgBackendStatus) * numBackendStatSlots); + sizeof(LocalPgBackendStatus) * NumBackendStatSlots); localappname = (char *) MemoryContextAlloc(backendStatusSnapContext, - NAMEDATALEN * numBackendStatSlots); + NAMEDATALEN * NumBackendStatSlots); localclienthostname = (char *) MemoryContextAlloc(backendStatusSnapContext, - NAMEDATALEN * numBackendStatSlots); + NAMEDATALEN * NumBackendStatSlots); localactivity = (char *) MemoryContextAllocHuge(backendStatusSnapContext, - pgstat_track_activity_query_size * numBackendStatSlots); + pgstat_track_activity_query_size * NumBackendStatSlots); #ifdef USE_SSL localsslstatus = (PgBackendSSLStatus *) MemoryContextAlloc(backendStatusSnapContext, - sizeof(PgBackendSSLStatus) * numBackendStatSlots); + sizeof(PgBackendSSLStatus) * NumBackendStatSlots); #endif #ifdef ENABLE_GSS localgssstatus = (PgBackendGSSStatus *) MemoryContextAlloc(backendStatusSnapContext, - sizeof(PgBackendGSSStatus) * numBackendStatSlots); + sizeof(PgBackendGSSStatus) * NumBackendStatSlots); #endif localNumBackends = 0; beentry = BackendStatusArray; localentry = localtable; - for (i = 1; i <= numBackendStatSlots; i++) + for (i = 1; i <= NumBackendStatSlots; i++) { /* * Follow the protocol of retrying if st_changecount changes while we @@ -899,10 +893,9 @@ pgstat_get_backend_current_activity(int pid, bool checkUser) { PgBackendStatus *beentry; int i; - int max_backends = GetMaxBackends(); beentry = BackendStatusArray; - for (i = 1; i <= max_backends; i++) + for (i = 1; i <= MaxBackends; i++) { /* * Although we expect the target backend's entry to be stable, that @@ -978,7 +971,6 @@ pgstat_get_crashed_backend_activity(int pid, char *buffer, int buflen) { volatile PgBackendStatus *beentry; int i; - int max_backends = GetMaxBackends(); beentry = BackendStatusArray; @@ -989,7 +981,7 @@ pgstat_get_crashed_backend_activity(int pid, char *buffer, int buflen) if (beentry == NULL || BackendActivityBuffer == NULL) return NULL; - for (i = 1; i <= max_backends; i++) + for (i = 1; i <= MaxBackends; i++) { if (beentry->st_procpid == pid) { diff --git a/src/backend/utils/adt/lockfuncs.c b/src/backend/utils/adt/lockfuncs.c index 944cd6df03..023a004ac8 100644 --- a/src/backend/utils/adt/lockfuncs.c +++ b/src/backend/utils/adt/lockfuncs.c @@ -559,14 +559,13 @@ pg_safe_snapshot_blocking_pids(PG_FUNCTION_ARGS) int *blockers; int num_blockers; Datum *blocker_datums; - int max_backends = GetMaxBackends(); /* A buffer big enough for any possible blocker list without truncation */ - blockers = (int *) palloc(max_backends * sizeof(int)); + blockers = (int *) palloc(MaxBackends * sizeof(int)); /* Collect a snapshot of processes waited for by GetSafeSnapshot */ num_blockers = - GetSafeSnapshotBlockingPids(blocked_pid, blockers, max_backends); + GetSafeSnapshotBlockingPids(blocked_pid, blockers, MaxBackends); /* Convert int array to Datum array */ if (num_blockers > 0) diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index a85c2e0260..9139fe895c 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -25,7 +25,6 @@ #include "access/session.h" #include "access/sysattr.h" #include "access/tableam.h" -#include "access/twophase.h" #include "access/xact.h" #include "access/xlog.h" #include "access/xloginsert.h" @@ -68,9 +67,6 @@ #include "utils/syscache.h" #include "utils/timeout.h" -static int MaxBackends = 0; -static int MaxBackendsInitialized = false; - static HeapTuple GetDatabaseTuple(const char *dbname); static HeapTuple GetDatabaseTupleByOid(Oid dboid); static void PerformAuthentication(Port *port); @@ -542,8 +538,9 @@ pg_split_opts(char **argv, int *argcp, const char *optstr) /* * Initialize MaxBackends value from config options. * - * This must be called after modules have had the chance to alter GUCs in - * shared_preload_libraries and before shared memory size is determined. + * This must be called after modules have had the chance to register background + * workers in shared_preload_libraries, and before shared memory size is + * determined. * * Note that in EXEC_BACKEND environment, the value is passed down from * postmaster to subprocesses via BackendParameters in SubPostmasterMain; only @@ -553,49 +550,15 @@ pg_split_opts(char **argv, int *argcp, const char *optstr) void InitializeMaxBackends(void) { - /* the extra unit accounts for the autovacuum launcher */ - SetMaxBackends(MaxConnections + autovacuum_max_workers + 1 + - max_worker_processes + max_wal_senders); -} + Assert(MaxBackends == 0); -/* - * Safely retrieve the value of MaxBackends. - * - * Previously, MaxBackends was externally visible, but it was often used before - * it was initialized (e.g., in preloaded libraries' _PG_init() functions). - * Unfortunately, we cannot initialize MaxBackends before processing - * shared_preload_libraries because the libraries sometimes alter GUCs that are - * used to calculate its value. Instead, we provide this function for accessing - * MaxBackends, and we ERROR if someone calls it before it is initialized. - */ -int -GetMaxBackends(void) -{ - if (unlikely(!MaxBackendsInitialized)) - elog(ERROR, "MaxBackends not yet initialized"); - - return MaxBackends; -} - -/* - * Set the value of MaxBackends. - * - * This should only be used by InitializeMaxBackends() and - * restore_backend_variables(). If MaxBackends is already initialized or the - * specified value is greater than the maximum, this will ERROR. - */ -void -SetMaxBackends(int max_backends) -{ - if (MaxBackendsInitialized) - elog(ERROR, "MaxBackends already initialized"); + /* the extra unit accounts for the autovacuum launcher */ + MaxBackends = MaxConnections + autovacuum_max_workers + 1 + + max_worker_processes + max_wal_senders; /* internal error because the values were all checked previously */ - if (max_backends > MAX_BACKENDS) + if (MaxBackends > MAX_BACKENDS) elog(ERROR, "too many backends configured"); - - MaxBackends = max_backends; - MaxBackendsInitialized = true; } /* @@ -707,7 +670,7 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username, SharedInvalBackendInit(false); - if (MyBackendId > GetMaxBackends() || MyBackendId <= 0) + if (MyBackendId > MaxBackends || MyBackendId <= 0) elog(FATAL, "bad backend ID: %d", MyBackendId); /* Now that we have a BackendId, we can participate in ProcSignal */ diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index e9ad52c347..53fd168d93 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -173,6 +173,7 @@ extern PGDLLIMPORT char *DataDir; extern PGDLLIMPORT int data_directory_mode; extern PGDLLIMPORT int NBuffers; +extern PGDLLIMPORT int MaxBackends; extern PGDLLIMPORT int MaxConnections; extern PGDLLIMPORT int max_worker_processes; extern PGDLLIMPORT int max_parallel_workers; @@ -456,8 +457,6 @@ extern PGDLLIMPORT AuxProcType MyAuxProcType; /* in utils/init/postinit.c */ extern void pg_split_opts(char **argv, int *argcp, const char *optstr); extern void InitializeMaxBackends(void); -extern int GetMaxBackends(void); -extern void SetMaxBackends(int max_backends); extern void InitPostgres(const char *in_dbname, Oid dboid, const char *username, Oid useroid, char *out_dbname, bool override_allow_connections); extern void BaseInit(void); From 55ff3563d8fac659147a87ea93ec1464c601107d Mon Sep 17 00:00:00 2001 From: David Rowley Date: Wed, 13 Apr 2022 09:15:02 +1200 Subject: [PATCH 502/772] Docs: avoid confusing use of the word "synchronized" It's misleading to call the data directory the "synchronized data directory" when discussing a crash scenario when using pg_rewind's --no-sync option. Here we just remove the word "synchronized" to avoid any possible confusion. Author: Justin Pryzby Discussion: https://postgr.es/m/20220411020336.GB26620@telsasoft.com Backpatch-through: 12, where --no-sync was added --- doc/src/sgml/ref/pg_rewind.sgml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/ref/pg_rewind.sgml b/doc/src/sgml/ref/pg_rewind.sgml index e808239aa5..69d6924b3a 100644 --- a/doc/src/sgml/ref/pg_rewind.sgml +++ b/doc/src/sgml/ref/pg_rewind.sgml @@ -210,8 +210,8 @@ PostgreSQL documentation to be written safely to disk. This option causes pg_rewind to return without waiting, which is faster, but means that a subsequent operating system crash can leave - the synchronized data directory corrupt. Generally, this option is - useful for testing but should not be used on a production + the data directory corrupt. Generally, this option is useful for + testing but should not be used on a production installation. From aa36e7dd38d35b81d978ab94cd7a6fd3dc2d23c5 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 12 Apr 2022 18:21:04 -0400 Subject: [PATCH 503/772] Doc: tweak textsearch.sgml for SEO purposes. Google seems to like to return textsearch.html for queries about GIN and GiST indexes, even though it's not a primary reference for either. It seems likely that that's because those keywords appear in the page title. Since "GIN and GiST Index Types" is not a very apposite title for this material anyway, rename the section in hopes of stopping that. Also provide explicit links to the GIN and GiST chapters, to help anyone who finds their way to this page regardless. Per gripe from Jan Piotrowski. Back-patch to supported branches. (Unfortunately Google is likely to continue returning the 9.1 version of this page, but improving that situation is a matter for the www team.) Discussion: https://postgr.es/m/164978902252.1276550.9330175733459697101@wrigleys.postgresql.org --- doc/src/sgml/textsearch.sgml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/textsearch.sgml b/doc/src/sgml/textsearch.sgml index 20db7b7afe..6afaf9e62c 100644 --- a/doc/src/sgml/textsearch.sgml +++ b/doc/src/sgml/textsearch.sgml @@ -3618,7 +3618,7 @@ SELECT plainto_tsquery('supernovae stars'); - GIN and GiST Index Types + Preferred Index Types for Text Search text search @@ -3627,10 +3627,16 @@ SELECT plainto_tsquery('supernovae stars'); There are two kinds of indexes that can be used to speed up full text - searches. + searches: + GIN and + GiST. Note that indexes are not mandatory for full text searching, but in cases where a column is searched on a regular basis, an index is usually desirable. + + + + To create such an index, do one of: From 0f0b76b67a064083c77a25a307592c55ab5f2930 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Wed, 13 Apr 2022 11:18:54 +1200 Subject: [PATCH 504/772] Docs: adjust pg_upgrade syntax to mark -B as optional This was made optional in 959f6d6a1. Author: Justin Pryzby Discussion: https://postgr.es/m/20220411020336.GB26620@telsasoft.com Backpatch-through: 13, where -B was made optional --- doc/src/sgml/ref/pgupgrade.sgml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/src/sgml/ref/pgupgrade.sgml b/doc/src/sgml/ref/pgupgrade.sgml index f024c3ef25..8cda8d16d1 100644 --- a/doc/src/sgml/ref/pgupgrade.sgml +++ b/doc/src/sgml/ref/pgupgrade.sgml @@ -24,8 +24,7 @@ PostgreSQL documentation pg_upgrade oldbindir - - newbindir + newbindir oldconfigdir From d27323db7c451462387cd284275e1e79c59f7bac Mon Sep 17 00:00:00 2001 From: David Rowley Date: Wed, 13 Apr 2022 12:01:23 +1200 Subject: [PATCH 505/772] Docs: adjust wording about basebackup_to_shell's required_role GUC Author: Justin Pryzby Reviewed-by: Robert Haas Discussion: https://postgr.es/m/20220411020336.GB26620@telsasoft.com --- doc/src/sgml/basebackup-to-shell.sgml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/doc/src/sgml/basebackup-to-shell.sgml b/doc/src/sgml/basebackup-to-shell.sgml index 9f44071d50..85868db3c1 100644 --- a/doc/src/sgml/basebackup-to-shell.sgml +++ b/doc/src/sgml/basebackup-to-shell.sgml @@ -65,10 +65,9 @@ - A role which replication whose privileges users are required to possess - in order to make use of the shell backup target. - If this is not set, any replication user may make use of the - shell backup target. + The role required in order to make use of the shell + backup target. If this is not set, any replication user may make use of + the shell backup target. From 042a923ad53dfbe39a9d5012d6c3cf3c9c338884 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 13 Apr 2022 11:09:51 +0900 Subject: [PATCH 506/772] Rework compression options of pg_receivewal Since babbbb5 and the introduction of LZ4 in pg_receivewal, the compression of the WAL archived is controlled by two options: - --compression-method with "gzip", "none" or "lz4" as possible value. - --compress=N to specify a compression level. This includes a backward-incompatible change where a value of 0 leads to a failure instead of no compression enforced. This commit takes advantage of a4b5754 and 3603f7c to rework the compression options of pg_receivewal, as of: - The removal of --compression-method. - The extenction of --compress to use the same grammar as pg_basebackup, with a METHOD:DETAIL format, where a METHOD is "gzip", "none" or "lz4" and a DETAIL is a comma-separated list of options, the only keyword supported is now "level" to control the compression level. If only an integer is specified as value of this option, "none" is implied on 0 and "gzip" is implied otherwise. This brings back --compress to be backward-compatible with ~14, while still supporting LZ4. This has also the advantage of centralizing the set of checks used by pg_receivewal to validate its compression options. Author: Michael Paquier Reviewed-by: Robert Haas, Georgios Kokolatos Discussion: https://postgr.es/m/YlPQGNAAa04raObK@paquier.xyz --- doc/src/sgml/ref/pg_receivewal.sgml | 45 ++++--- src/bin/pg_basebackup/pg_receivewal.c | 127 +++++++++++++------ src/bin/pg_basebackup/t/020_pg_receivewal.pl | 28 ++-- 3 files changed, 121 insertions(+), 79 deletions(-) diff --git a/doc/src/sgml/ref/pg_receivewal.sgml b/doc/src/sgml/ref/pg_receivewal.sgml index b846213fb7..4fe9e1a874 100644 --- a/doc/src/sgml/ref/pg_receivewal.sgml +++ b/doc/src/sgml/ref/pg_receivewal.sgml @@ -263,37 +263,36 @@ PostgreSQL documentation - + + + + - Enables compression of write-ahead logs using the specified method. - Supported values are gzip, lz4 - (if PostgreSQL was compiled with - ), and none. + Enables compression of write-ahead logs. - - The suffix .gz will automatically be added to - all filenames when using gzip, and the suffix - .lz4 is added when using lz4. + The compression method can be set to gzip, + lz4 (if PostgreSQL + was compiled with ) or + none for no compression. + A compression detail string can optionally be specified. If the + detail string is an integer, it specifies the compression level. + Otherwise, it should be a comma-separated list of items, each of the + form keyword or keyword=value. + Currently, the only supported keyword is level. - - - - - - - - Specifies the compression level (1 through - 9, 1 being worst compression - and 9 being best compression) for WAL segments - compressed with gzip. + If no compression level is specified, the default compression level + will be used. If only a level is specified without mentioning an + algorithm, gzip compression will be used if the + level is greater than 0, and no compression will be used if the level + is 0. - - This option requires to be - specified with gzip. + The suffix .gz will automatically be added to + all filenames when using gzip, and the suffix + .lz4 is added when using lz4. diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c index ede1d4648d..ea3902c971 100644 --- a/src/bin/pg_basebackup/pg_receivewal.c +++ b/src/bin/pg_basebackup/pg_receivewal.c @@ -57,6 +57,8 @@ static XLogRecPtr endpos = InvalidXLogRecPtr; static void usage(void); +static void parse_compress_options(char *option, char **algorithm, + char **detail); static DIR *get_destination_dir(char *dest_folder); static void close_destination_dir(DIR *dest_dir, char *dest_folder); static XLogRecPtr FindStreamingStart(uint32 *tli); @@ -90,9 +92,8 @@ usage(void) printf(_(" --synchronous flush write-ahead log immediately after writing\n")); printf(_(" -v, --verbose output verbose messages\n")); printf(_(" -V, --version output version information, then exit\n")); - printf(_(" --compression-method=METHOD\n" - " method to compress logs\n")); - printf(_(" -Z, --compress=1-9 compress logs with given compression level\n")); + printf(_(" -Z, --compress=METHOD[:DETAIL]\n" + " compress as specified\n")); printf(_(" -?, --help show this help, then exit\n")); printf(_("\nConnection options:\n")); printf(_(" -d, --dbname=CONNSTR connection string\n")); @@ -108,6 +109,66 @@ usage(void) printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL); } +/* + * Basic parsing of a value specified for -Z/--compress + * + * The parsing consists of a METHOD:DETAIL string fed later on to a more + * advanced routine in charge of proper validation checks. This only extracts + * METHOD and DETAIL. If only an integer is found, the method is implied by + * the value specified. + */ +static void +parse_compress_options(char *option, char **algorithm, char **detail) +{ + char *sep; + char *endp; + long result; + + /* + * Check whether the compression specification consists of a bare integer. + * + * For backward-compatibility, assume "none" if the integer found is zero + * and "gzip" otherwise. + */ + result = strtol(option, &endp, 10); + if (*endp == '\0') + { + if (result == 0) + { + *algorithm = pstrdup("none"); + *detail = NULL; + } + else + { + *algorithm = pstrdup("gzip"); + *detail = pstrdup(option); + } + return; + } + + /* + * Check whether there is a compression detail following the algorithm + * name. + */ + sep = strchr(option, ':'); + if (sep == NULL) + { + *algorithm = pstrdup(option); + *detail = NULL; + } + else + { + char *alg; + + alg = palloc((sep - option) + 1); + memcpy(alg, option, sep - option); + alg[sep - option] = '\0'; + + *algorithm = alg; + *detail = pstrdup(sep + 1); + } +} + /* * Check if the filename looks like a WAL file, letting caller know if this * WAL segment is partial and/or compressed. @@ -651,7 +712,6 @@ main(int argc, char **argv) {"if-not-exists", no_argument, NULL, 3}, {"synchronous", no_argument, NULL, 4}, {"no-sync", no_argument, NULL, 5}, - {"compression-method", required_argument, NULL, 6}, {NULL, 0, NULL, 0} }; @@ -660,6 +720,10 @@ main(int argc, char **argv) char *db_name; uint32 hi, lo; + pg_compress_specification compression_spec; + char *compression_detail = NULL; + char *compression_algorithm_str = "none"; + char *error_detail = NULL; pg_logging_init(argv[0]); progname = get_progname(argv[0]); @@ -728,9 +792,8 @@ main(int argc, char **argv) verbose++; break; case 'Z': - if (!option_parse_int(optarg, "-Z/--compress", 1, 9, - &compresslevel)) - exit(1); + parse_compress_options(optarg, &compression_algorithm_str, + &compression_detail); break; /* action */ case 1: @@ -748,17 +811,6 @@ main(int argc, char **argv) case 5: do_sync = false; break; - case 6: - if (pg_strcasecmp(optarg, "gzip") == 0) - compression_algorithm = PG_COMPRESSION_GZIP; - else if (pg_strcasecmp(optarg, "lz4") == 0) - compression_algorithm = PG_COMPRESSION_LZ4; - else if (pg_strcasecmp(optarg, "none") == 0) - compression_algorithm = PG_COMPRESSION_NONE; - else - pg_fatal("invalid value \"%s\" for option %s", - optarg, "--compression-method"); - break; default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -810,24 +862,33 @@ main(int argc, char **argv) exit(1); } - /* - * Compression-related options. + * Compression options */ + if (!parse_compress_algorithm(compression_algorithm_str, + &compression_algorithm)) + pg_fatal("unrecognized compression algorithm \"%s\"", + compression_algorithm_str); + + parse_compress_specification(compression_algorithm, compression_detail, + &compression_spec); + error_detail = validate_compress_specification(&compression_spec); + if (error_detail != NULL) + pg_fatal("invalid compression specification: %s", + error_detail); + + /* Extract the compression level, if found in the specification */ + if ((compression_spec.options & PG_COMPRESSION_OPTION_LEVEL) != 0) + compresslevel = compression_spec.level; + switch (compression_algorithm) { case PG_COMPRESSION_NONE: - if (compresslevel != 0) - { - pg_log_error("cannot use --compress with --compression-method=%s", - "none"); - pg_log_error_hint("Try \"%s --help\" for more information.", progname); - exit(1); - } + /* nothing to do */ break; case PG_COMPRESSION_GZIP: #ifdef HAVE_LIBZ - if (compresslevel == 0) + if ((compression_spec.options & PG_COMPRESSION_OPTION_LEVEL) == 0) { pg_log_info("no value specified for --compress, switching to default"); compresslevel = Z_DEFAULT_COMPRESSION; @@ -838,15 +899,7 @@ main(int argc, char **argv) #endif break; case PG_COMPRESSION_LZ4: -#ifdef USE_LZ4 - if (compresslevel != 0) - { - pg_log_error("cannot use --compress with --compression-method=%s", - "lz4"); - pg_log_error_hint("Try \"%s --help\" for more information.", progname); - exit(1); - } -#else +#ifndef USE_LZ4 pg_fatal("this build does not support compression with %s", "LZ4"); #endif diff --git a/src/bin/pg_basebackup/t/020_pg_receivewal.pl b/src/bin/pg_basebackup/t/020_pg_receivewal.pl index 8c38816b22..465394404f 100644 --- a/src/bin/pg_basebackup/t/020_pg_receivewal.pl +++ b/src/bin/pg_basebackup/t/020_pg_receivewal.pl @@ -34,12 +34,9 @@ [ 'pg_receivewal', '-D', $stream_dir, '--synchronous', '--no-sync' ], 'failure if --synchronous specified with --no-sync'); $primary->command_fails_like( - [ - 'pg_receivewal', '-D', $stream_dir, '--compression-method', 'none', - '--compress', '1' - ], - qr/\Qpg_receivewal: error: cannot use --compress with --compression-method=none/, - 'failure if --compress specified with --compression-method=none'); + [ 'pg_receivewal', '-D', $stream_dir, '--compress', 'none:1', ], + qr/\Qpg_receivewal: error: invalid compression specification: compression algorithm "none" does not accept a compression level/, + 'failure if --compress none:N (where N > 0)'); # Slot creation and drop my $slot_name = 'test'; @@ -48,7 +45,7 @@ 'creating a replication slot'); my $slot = $primary->slot($slot_name); is($slot->{'slot_type'}, 'physical', 'physical replication slot was created'); -is($slot->{'restart_lsn'}, '', 'restart LSN of new slot is null'); +is($slot->{'restart_lsn'}, '', 'restart LSN of new slot is null'); $primary->command_ok([ 'pg_receivewal', '--slot', $slot_name, '--drop-slot' ], 'dropping a replication slot'); is($primary->slot($slot_name)->{'slot_type'}, @@ -93,15 +90,10 @@ chomp($nextlsn); $primary->psql('postgres', 'INSERT INTO test_table VALUES (2);'); - # Note the trailing whitespace after the value of --compress, that is - # a valid value. $primary->command_ok( [ - 'pg_receivewal', '-D', - $stream_dir, '--verbose', - '--endpos', $nextlsn, - '--compression-method', 'gzip', - '--compress', '1 ', + 'pg_receivewal', '-D', $stream_dir, '--verbose', + '--endpos', $nextlsn, '--compress', 'gzip:1', '--no-loop' ], "streaming some WAL using ZLIB compression"); @@ -153,13 +145,11 @@ # Stream up to the given position. $primary->command_ok( [ - 'pg_receivewal', '-D', - $stream_dir, '--verbose', - '--endpos', $nextlsn, - '--no-loop', '--compression-method', + 'pg_receivewal', '-D', $stream_dir, '--verbose', + '--endpos', $nextlsn, '--no-loop', '--compress', 'lz4' ], - 'streaming some WAL using --compression-method=lz4'); + 'streaming some WAL using --compress=lz4'); # Verify that the stored files are generated with their expected # names. From fdc18ea23b393d4a34c78b94ad3fcaf547e74959 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Wed, 13 Apr 2022 17:42:13 +1200 Subject: [PATCH 507/772] Docs: tidy up various usages of the productname tag This tries to bring a bit more consistency to the use of the tag in the documents. This fixes a couple of mistakes with our own product. We definitely should be consistently calling that PostgreSQL when we're referring to the modern-day version of the software. This also tidies up a couple of inconsistencies with the case of other product names, namely Emacs and Python. We also get rid of some incorrect usages of and replace them with . Many of these mistakes exist in the back branches, but they don't quite seem critical enough to warrant fixing them in prior versions at this stage. Author: Justin Pryzby Discussion: https://postgr.es/m/20220411020336.GB26620@telsasoft.com --- doc/src/sgml/catalogs.sgml | 2 +- doc/src/sgml/client-auth.sgml | 4 ++-- doc/src/sgml/ecpg.sgml | 2 +- doc/src/sgml/install-windows.sgml | 2 +- doc/src/sgml/sources.sgml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 6f285871b6..a533a2153e 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -12962,7 +12962,7 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx The pg_shmem_allocations view shows allocations made from the server's main shared memory segment. This includes both - memory allocated by postgres itself and memory + memory allocated by PostgreSQL itself and memory allocated by extensions using the mechanisms detailed in . diff --git a/doc/src/sgml/client-auth.sgml b/doc/src/sgml/client-auth.sgml index 142b0affcb..28c51d7261 100644 --- a/doc/src/sgml/client-auth.sgml +++ b/doc/src/sgml/client-auth.sgml @@ -1523,7 +1523,7 @@ omicron bryanh guest1 - The following configuration options are supported for ident: + The following configuration options are supported for ident: map @@ -1597,7 +1597,7 @@ omicron bryanh guest1 - The following configuration options are supported for peer: + The following configuration options are supported for peer: map diff --git a/doc/src/sgml/ecpg.sgml b/doc/src/sgml/ecpg.sgml index cdc4761c60..7f8b4dd5c0 100644 --- a/doc/src/sgml/ecpg.sgml +++ b/doc/src/sgml/ecpg.sgml @@ -8233,7 +8233,7 @@ $COMMIT; you functions that have the same name and the same basic behavior but it is no drop-in replacement if you are using Informix at the moment. Moreover, some of the data types are different. For example, - PostgreSQL's datetime and interval types do not + PostgreSQL's datetime and interval types do not know about ranges like for example YEAR TO MINUTE so you won't find support in ECPG for that either. diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index 18101e7a70..43cc5f6f5b 100644 --- a/doc/src/sgml/install-windows.sgml +++ b/doc/src/sgml/install-windows.sgml @@ -370,7 +370,7 @@ $ENV{MSBFLAGS}="/m"; - To use a server-side third party library such as python or + To use a server-side third party library such as Python or OpenSSL, this library must also be 64-bit. There is no support for loading a 32-bit library in a 64-bit server. Several of the third party libraries that PostgreSQL supports may diff --git a/doc/src/sgml/sources.sgml b/doc/src/sgml/sources.sgml index 1b77efb087..2d01efc950 100644 --- a/doc/src/sgml/sources.sgml +++ b/doc/src/sgml/sources.sgml @@ -63,7 +63,7 @@ The src/tools/editors directory contains sample settings - files that can be used with the emacs, + files that can be used with the Emacs, xemacs or vim editors to help ensure that they format code according to these conventions. From b940918dc888b9b797f29d965f8beafe0a4271b5 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 13 Apr 2022 15:32:35 +0900 Subject: [PATCH 508/772] Remove "recheck" argument from check_index_is_clusterable() The last usage of this argument in this routine can be tracked down to 7e2f9062, aka 11 years ago. Getting rid of this argument can also be an advantage for extensions calling check_index_is_clusterable(), as it removes any need to worry about the meaning of what a recheck would be at this level. Author: Justin Pryzby Discussion: https://postgr.es/m/20220411140609.GF26620@telsasoft.com --- src/backend/commands/cluster.c | 6 +++--- src/backend/commands/tablecmds.c | 2 +- src/include/commands/cluster.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 322d6bb2f1..0f0a6e9f01 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -232,7 +232,7 @@ cluster(ParseState *pstate, ClusterStmt *stmt, bool isTopLevel) if (rel != NULL) { Assert(rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE); - check_index_is_clusterable(rel, indexOid, true, AccessShareLock); + check_index_is_clusterable(rel, indexOid, AccessShareLock); rtcs = get_tables_to_cluster_partitioned(cluster_context, indexOid); /* close relation, releasing lock on parent table */ @@ -434,7 +434,7 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) /* Check heap and index are valid to cluster on */ if (OidIsValid(indexOid)) - check_index_is_clusterable(OldHeap, indexOid, recheck, AccessExclusiveLock); + check_index_is_clusterable(OldHeap, indexOid, AccessExclusiveLock); /* * Quietly ignore the request if this is a materialized view which has not @@ -480,7 +480,7 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) * protection here. */ void -check_index_is_clusterable(Relation OldHeap, Oid indexOid, bool recheck, LOCKMODE lockmode) +check_index_is_clusterable(Relation OldHeap, Oid indexOid, LOCKMODE lockmode) { Relation OldIndex; diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 90edd0bb97..1d7db41d17 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -14055,7 +14055,7 @@ ATExecClusterOn(Relation rel, const char *indexName, LOCKMODE lockmode) indexName, RelationGetRelationName(rel)))); /* Check index is valid to cluster on */ - check_index_is_clusterable(rel, indexOid, false, lockmode); + check_index_is_clusterable(rel, indexOid, lockmode); /* And do the work */ mark_index_clustered(rel, indexOid, false); diff --git a/src/include/commands/cluster.h b/src/include/commands/cluster.h index 3c279f6210..df8e73af40 100644 --- a/src/include/commands/cluster.h +++ b/src/include/commands/cluster.h @@ -34,7 +34,7 @@ typedef struct ClusterParams extern void cluster(ParseState *pstate, ClusterStmt *stmt, bool isTopLevel); extern void cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params); extern void check_index_is_clusterable(Relation OldHeap, Oid indexOid, - bool recheck, LOCKMODE lockmode); + LOCKMODE lockmode); extern void mark_index_clustered(Relation rel, Oid indexOid, bool is_internal); extern Oid make_new_heap(Oid OIDOldHeap, Oid NewTableSpace, Oid NewAccessMethod, From a59746d311264305bbe68aaf48d5b20e8fd56920 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Wed, 13 Apr 2022 21:28:25 +1200 Subject: [PATCH 509/772] Docs: wording improvement for compute_query_id = regress It's more accurate to say that the query identifier is not shown when compute_query_id = regress rather than to say it is hidden. This change (ebf6c5249) appeared in v14, so it makes sense to backpatch this small adjustment to keep the documents consistent between v14 and master. Author: Justin Pryzby Discussion: https://postgr.es/m/20220411020336.GB26620@telsasoft.com Backpatch-through: 14, where compute_query_id = regress was added --- doc/src/sgml/config.sgml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index cfbb20a39e..a1682f6d4d 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -8101,8 +8101,8 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; which lets modules such as automatically enable it, and regress which has the same effect as auto, except that the - query identifier is hidden in the EXPLAIN output - to facilitate automated regression testing. + query identifier is not shown in the EXPLAIN output + in order to facilitate automated regression testing. The default is auto. From a038679cd876f63e17a08f64fafad27cd5bc23fe Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 13 Apr 2022 14:04:51 +0200 Subject: [PATCH 510/772] Fix incorrect format placeholders --- src/backend/utils/error/jsonlog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/utils/error/jsonlog.c b/src/backend/utils/error/jsonlog.c index f336c063e5..27ad7686d8 100644 --- a/src/backend/utils/error/jsonlog.c +++ b/src/backend/utils/error/jsonlog.c @@ -235,7 +235,7 @@ write_jsonlog(ErrorData *edata) /* if printed internal query, print internal pos too */ if (edata->internalpos > 0 && edata->internalquery != NULL) - appendJSONKeyValueFmt(&buf, "internal_position", false, "%u", + appendJSONKeyValueFmt(&buf, "internal_position", false, "%d", edata->internalpos); /* errcontext */ From 112fdb3528465cc14a2f1dff3dc27f100326d885 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Wed, 13 Apr 2022 10:26:38 -0400 Subject: [PATCH 511/772] Fix finalization for json_objectagg and friends Commit f4fb45d15c misguidedly tried to free some state during aggregate finalization for json_objectagg. This resulted in attempts to access freed memory, especially when the function is used as a window function. Commit 4eb9798879 attempted to ameliorate that, but in fact it should just be ripped out, which is done here. Also add some regression tests for json_objectagg in various flavors as a window function. Original report from Jaime Casanova, diagnosis by Andres Freund. Discussion: https://postgr.es/m/YkfeMNYRCGhySKyg@ahch-to --- src/backend/utils/adt/json.c | 12 --------- src/test/regress/expected/sqljson.out | 35 +++++++++++++++++++++++++++ src/test/regress/sql/sqljson.sql | 18 ++++++++++++++ 3 files changed, 53 insertions(+), 12 deletions(-) diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c index 4cf01300d8..da3f1b9700 100644 --- a/src/backend/utils/adt/json.c +++ b/src/backend/utils/adt/json.c @@ -1002,13 +1002,6 @@ json_unique_builder_init(JsonUniqueBuilderState *cxt) cxt->skipped_keys.data = NULL; } -static void -json_unique_builder_clean(JsonUniqueBuilderState *cxt) -{ - if (cxt->skipped_keys.data) - resetStringInfo(&cxt->skipped_keys); -} - /* On-demand initialization of skipped_keys StringInfo structure */ static StringInfo json_unique_builder_get_skipped_keys(JsonUniqueBuilderState *cxt) @@ -1216,8 +1209,6 @@ json_object_agg_finalfn(PG_FUNCTION_ARGS) if (state == NULL) PG_RETURN_NULL(); - json_unique_builder_clean(&state->unique_check); - /* Else return state with appropriate object terminator added */ PG_RETURN_TEXT_P(catenate_stringinfo_string(state->str, " }")); } @@ -1324,9 +1315,6 @@ json_build_object_worker(int nargs, Datum *args, bool *nulls, Oid *types, appendStringInfoChar(result, '}'); - if (unique_keys) - json_unique_builder_clean(&unique_check); - return PointerGetDatum(cstring_to_text_with_len(result->data, result->len)); } diff --git a/src/test/regress/expected/sqljson.out b/src/test/regress/expected/sqljson.out index 6cadd87868..97a72be970 100644 --- a/src/test/regress/expected/sqljson.out +++ b/src/test/regress/expected/sqljson.out @@ -959,6 +959,41 @@ SELECT JSON_OBJECT('foo' : '1' FORMAT JSON, 'bar' : 'baz' RETURNING json); CREATE OR REPLACE VIEW public.json_object_view AS SELECT JSON_OBJECT('foo' : '1'::text FORMAT JSON, 'bar' : 'baz'::text RETURNING json) AS "json_object" DROP VIEW json_object_view; +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v WITH UNIQUE KEYS) OVER (ORDER BY k) +FROM (VALUES (1,1), (2,2)) a(k,v); + a | json_objectagg +---------------+---------------------- + {"k":1,"v":1} | { "1" : 1 } + {"k":2,"v":2} | { "1" : 1, "2" : 2 } +(2 rows) + +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v WITH UNIQUE KEYS) OVER (ORDER BY k) +FROM (VALUES (1,1), (1,2), (2,2)) a(k,v); +ERROR: duplicate JSON key "1" +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v ABSENT ON NULL WITH UNIQUE KEYS) + OVER (ORDER BY k) +FROM (VALUES (1,1), (1,null), (2,2)) a(k,v); +ERROR: duplicate JSON key "1" +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v ABSENT ON NULL) +OVER (ORDER BY k) +FROM (VALUES (1,1), (1,null), (2,2)) a(k,v); + a | json_objectagg +------------------+---------------------- + {"k":1,"v":1} | { "1" : 1 } + {"k":1,"v":null} | { "1" : 1 } + {"k":2,"v":2} | { "1" : 1, "2" : 2 } +(3 rows) + +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v ABSENT ON NULL) +OVER (ORDER BY k RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) +FROM (VALUES (1,1), (1,null), (2,2)) a(k,v); + a | json_objectagg +------------------+---------------------- + {"k":1,"v":1} | { "1" : 1, "2" : 2 } + {"k":1,"v":null} | { "1" : 1, "2" : 2 } + {"k":2,"v":2} | { "1" : 1, "2" : 2 } +(3 rows) + -- Test JSON_ARRAY deparsing EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_ARRAY('1' FORMAT JSON, 2 RETURNING json); diff --git a/src/test/regress/sql/sqljson.sql b/src/test/regress/sql/sqljson.sql index 51fc659b58..b422ded978 100644 --- a/src/test/regress/sql/sqljson.sql +++ b/src/test/regress/sql/sqljson.sql @@ -292,6 +292,24 @@ SELECT JSON_OBJECT('foo' : '1' FORMAT JSON, 'bar' : 'baz' RETURNING json); DROP VIEW json_object_view; +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v WITH UNIQUE KEYS) OVER (ORDER BY k) +FROM (VALUES (1,1), (2,2)) a(k,v); + +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v WITH UNIQUE KEYS) OVER (ORDER BY k) +FROM (VALUES (1,1), (1,2), (2,2)) a(k,v); + +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v ABSENT ON NULL WITH UNIQUE KEYS) + OVER (ORDER BY k) +FROM (VALUES (1,1), (1,null), (2,2)) a(k,v); + +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v ABSENT ON NULL) +OVER (ORDER BY k) +FROM (VALUES (1,1), (1,null), (2,2)) a(k,v); + +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v ABSENT ON NULL) +OVER (ORDER BY k RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) +FROM (VALUES (1,1), (1,null), (2,2)) a(k,v); + -- Test JSON_ARRAY deparsing EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_ARRAY('1' FORMAT JSON, 2 RETURNING json); From ed0fbc8e5ac995eada933250c1d5535336442b97 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 13 Apr 2022 18:19:38 +0200 Subject: [PATCH 512/772] Release cache tuple when no longer needed There was a small buglet in commit 52e4f0cd472d whereby a tuple acquired from cache was not released, giving rise to WARNING messages; fix that. While at it, restructure the code a bit on stylistic grounds. Author: Hou zj Reported-by: Peter Smith Reviewed-by: Amit Kapila Discussion: https://postgr.es/m/CAHut+PvKTyhTBtYCQsP6Ph7=o-oWRSX+v+PXXLXp81-o2bazig@mail.gmail.com --- src/backend/commands/publicationcmds.c | 95 ++++++++++++----------- src/test/regress/expected/publication.out | 16 +++- src/test/regress/sql/publication.sql | 8 ++ 3 files changed, 68 insertions(+), 51 deletions(-) diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index 7aacb6b2fe..6df0e6670f 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -925,8 +925,9 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, /* * If the publication doesn't publish changes via the root partitioned - * table, the partition's row filter and column list will be used. So disallow - * using WHERE clause and column lists on partitioned table in this case. + * table, the partition's row filter and column list will be used. So + * disallow using WHERE clause and column lists on partitioned table in + * this case. */ if (!pubform->puballtables && publish_via_partition_root_given && !publish_via_partition_root) @@ -945,60 +946,60 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, foreach(lc, root_relids) { - HeapTuple rftuple; Oid relid = lfirst_oid(lc); - bool has_column_list; - bool has_row_filter; + HeapTuple rftuple; + char relkind; + char *relname; + bool has_rowfilter; + bool has_collist; + + /* + * Beware: we don't have lock on the relations, so cope silently + * with the cache lookups returning NULL. + */ rftuple = SearchSysCache2(PUBLICATIONRELMAP, ObjectIdGetDatum(relid), ObjectIdGetDatum(pubform->oid)); - - has_row_filter - = !heap_attisnull(rftuple, Anum_pg_publication_rel_prqual, NULL); - - has_column_list - = !heap_attisnull(rftuple, Anum_pg_publication_rel_prattrs, NULL); - - if (HeapTupleIsValid(rftuple) && - (has_row_filter || has_column_list)) + if (!HeapTupleIsValid(rftuple)) + continue; + has_rowfilter = !heap_attisnull(rftuple, Anum_pg_publication_rel_prqual, NULL); + has_collist = !heap_attisnull(rftuple, Anum_pg_publication_rel_prattrs, NULL); + if (!has_rowfilter && !has_collist) { - HeapTuple tuple; - - tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid)); - if (HeapTupleIsValid(tuple)) - { - Form_pg_class relform = (Form_pg_class) GETSTRUCT(tuple); - - if ((relform->relkind == RELKIND_PARTITIONED_TABLE) && - has_row_filter) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("cannot set %s for publication \"%s\"", - "publish_via_partition_root = false", - stmt->pubname), - errdetail("The publication contains a WHERE clause for a partitioned table \"%s\" " - "which is not allowed when %s is false.", - NameStr(relform->relname), - "publish_via_partition_root"))); - - if ((relform->relkind == RELKIND_PARTITIONED_TABLE) && - has_column_list) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("cannot set %s for publication \"%s\"", - "publish_via_partition_root = false", - stmt->pubname), - errdetail("The publication contains a column list for a partitioned table \"%s\" " - "which is not allowed when %s is false.", - NameStr(relform->relname), - "publish_via_partition_root"))); - - ReleaseSysCache(tuple); - } + ReleaseSysCache(rftuple); + continue; + } + relkind = get_rel_relkind(relid); + if (relkind != RELKIND_PARTITIONED_TABLE) + { + ReleaseSysCache(rftuple); + continue; + } + relname = get_rel_name(relid); + if (relname == NULL) /* table concurrently dropped */ + { ReleaseSysCache(rftuple); + continue; } + + if (has_rowfilter) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot set parameter \"%s\" to false for publication \"%s\"", + "publish_via_partition_root", + stmt->pubname), + errdetail("The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false.", + relname, "publish_via_partition_root"))); + Assert(has_collist); + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot set parameter \"%s\" to false for publication \"%s\"", + "publish_via_partition_root", + stmt->pubname), + errdetail("The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false.", + relname, "publish_via_partition_root"))); } } diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index 8208f9fa0e..398c0f38f6 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -588,8 +588,12 @@ UPDATE rf_tbl_abcd_part_pk SET a = 1; -- fail - cannot set PUBLISH_VIA_PARTITION_ROOT to false if any row filter is -- used for partitioned table ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); -ERROR: cannot set publish_via_partition_root = false for publication "testpub6" -DETAIL: The publication contains a WHERE clause for a partitioned table "rf_tbl_abcd_part_pk" which is not allowed when publish_via_partition_root is false. +ERROR: cannot set parameter "publish_via_partition_root" to false for publication "testpub6" +DETAIL: The publication contains a WHERE clause for partitioned table "rf_tbl_abcd_part_pk", which is not allowed when "publish_via_partition_root" is false. +-- remove partitioned table's row filter +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk; +-- ok - we don't have row filter for partitioned table. +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); -- Now change the root filter to use a column "b" -- (which is not in the replica identity) ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 WHERE (b > 99); @@ -951,8 +955,12 @@ UPDATE rf_tbl_abcd_part_pk SET a = 1; -- fail - cannot set PUBLISH_VIA_PARTITION_ROOT to false if any column list is -- used for partitioned table ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); -ERROR: cannot set publish_via_partition_root = false for publication "testpub6" -DETAIL: The publication contains a column list for a partitioned table "rf_tbl_abcd_part_pk" which is not allowed when publish_via_partition_root is false. +ERROR: cannot set parameter "publish_via_partition_root" to false for publication "testpub6" +DETAIL: The publication contains a column list for partitioned table "rf_tbl_abcd_part_pk", which is not allowed when "publish_via_partition_root" is false. +-- remove partitioned table's column list +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk; +-- ok - we don't have column list for partitioned table. +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); -- Now change the root column list to use a column "b" -- (which is not in the replica identity) ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 (b); diff --git a/src/test/regress/sql/publication.sql b/src/test/regress/sql/publication.sql index 8539110025..9eb86fd54f 100644 --- a/src/test/regress/sql/publication.sql +++ b/src/test/regress/sql/publication.sql @@ -352,6 +352,10 @@ UPDATE rf_tbl_abcd_part_pk SET a = 1; -- fail - cannot set PUBLISH_VIA_PARTITION_ROOT to false if any row filter is -- used for partitioned table ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +-- remove partitioned table's row filter +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk; +-- ok - we don't have row filter for partitioned table. +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); -- Now change the root filter to use a column "b" -- (which is not in the replica identity) ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 WHERE (b > 99); @@ -635,6 +639,10 @@ UPDATE rf_tbl_abcd_part_pk SET a = 1; -- fail - cannot set PUBLISH_VIA_PARTITION_ROOT to false if any column list is -- used for partitioned table ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +-- remove partitioned table's column list +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk; +-- ok - we don't have column list for partitioned table. +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); -- Now change the root column list to use a column "b" -- (which is not in the replica identity) ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 (b); From 24d2b2680a8d0e01b30ce8a41c4eb3b47aca5031 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 13 Apr 2022 19:14:20 +0200 Subject: [PATCH 513/772] Remove extraneous blank lines before block-closing braces These are useless and distracting. We wouldn't have written the code with them to begin with, so there's no reason to keep them. Author: Justin Pryzby Discussion: https://postgr.es/m/20220411020336.GB26620@telsasoft.com Discussion: https://postgr.es/m/attachment/133167/0016-Extraneous-blank-lines.patch --- contrib/btree_gist/btree_bit.c | 1 - contrib/btree_gist/btree_cash.c | 1 - contrib/btree_gist/btree_float4.c | 1 - contrib/btree_gist/btree_float8.c | 1 - contrib/btree_gist/btree_inet.c | 1 - contrib/btree_gist/btree_interval.c | 2 -- contrib/btree_gist/btree_macaddr.c | 1 - contrib/btree_gist/btree_macaddr8.c | 1 - contrib/btree_gist/btree_ts.c | 1 - contrib/dblink/dblink.c | 2 -- contrib/intarray/_int_bool.c | 1 - contrib/ltree/ltxtquery_io.c | 1 - contrib/pg_stat_statements/pg_stat_statements.c | 1 - contrib/postgres_fdw/connection.c | 1 - contrib/spi/refint.c | 2 -- src/backend/access/brin/brin_bloom.c | 1 - src/backend/access/gin/ginbtree.c | 1 - src/backend/access/heap/heapam.c | 1 - src/backend/access/heap/vacuumlazy.c | 1 - src/backend/access/nbtree/nbtsplitloc.c | 1 - src/backend/access/nbtree/nbtutils.c | 3 --- src/backend/access/rmgrdesc/gistdesc.c | 1 - src/backend/access/spgist/spgutils.c | 1 - src/backend/access/table/tableam.c | 1 - src/backend/access/transam/xlogrecovery.c | 1 - src/backend/catalog/objectaddress.c | 2 -- src/backend/catalog/pg_attrdef.c | 1 - src/backend/commands/copyto.c | 1 - src/backend/commands/subscriptioncmds.c | 1 - src/backend/commands/tablecmds.c | 3 --- src/backend/executor/execParallel.c | 1 - src/backend/executor/execReplication.c | 1 - src/backend/executor/nodeAgg.c | 1 - src/backend/executor/nodeMergejoin.c | 1 - src/backend/jit/llvm/llvmjit_deform.c | 2 -- src/backend/jit/llvm/llvmjit_expr.c | 1 - src/backend/libpq/hba.c | 1 - src/backend/optimizer/geqo/geqo_cx.c | 1 - src/backend/optimizer/geqo/geqo_erx.c | 3 --- src/backend/optimizer/geqo/geqo_ox1.c | 1 - src/backend/optimizer/geqo/geqo_ox2.c | 1 - src/backend/optimizer/geqo/geqo_pmx.c | 6 ------ src/backend/optimizer/geqo/geqo_px.c | 3 --- src/backend/optimizer/plan/planner.c | 1 - src/backend/postmaster/postmaster.c | 1 - src/backend/replication/logical/origin.c | 1 - src/backend/replication/logical/snapbuild.c | 1 - src/backend/replication/logical/worker.c | 1 - src/backend/replication/pgoutput/pgoutput.c | 3 +-- src/backend/replication/walsender.c | 1 - src/backend/statistics/dependencies.c | 1 - src/backend/storage/buffer/bufmgr.c | 2 -- src/backend/storage/buffer/freelist.c | 1 - src/backend/storage/ipc/latch.c | 1 - src/backend/storage/ipc/procarray.c | 2 -- src/backend/storage/lmgr/lwlock.c | 1 - src/backend/storage/page/bufpage.c | 2 -- src/backend/storage/sync/sync.c | 1 - src/backend/tcop/postgres.c | 1 - src/backend/tcop/utility.c | 1 - src/backend/tsearch/to_tsany.c | 2 -- src/backend/tsearch/ts_parse.c | 2 -- src/backend/utils/activity/pgstat_database.c | 1 - src/backend/utils/adt/acl.c | 1 - src/backend/utils/adt/json.c | 1 - src/backend/utils/adt/jsonb.c | 1 - src/backend/utils/adt/jsonfuncs.c | 1 - src/backend/utils/adt/multirangetypes.c | 2 -- src/backend/utils/adt/oracle_compat.c | 1 - src/backend/utils/adt/ruleutils.c | 1 - src/backend/utils/adt/selfuncs.c | 1 - src/backend/utils/adt/timestamp.c | 2 -- src/backend/utils/adt/tsvector_op.c | 1 - src/backend/utils/cache/catcache.c | 2 -- src/backend/utils/error/elog.c | 2 -- src/backend/utils/misc/guc.c | 1 - src/backend/utils/mmgr/generation.c | 1 - src/backend/utils/resowner/resowner.c | 1 - src/backend/utils/sort/tuplesort.c | 1 - src/bin/initdb/initdb.c | 2 -- src/bin/pg_dump/pg_dumpall.c | 1 - src/bin/pg_rewind/parsexlog.c | 1 - src/bin/pg_verifybackup/pg_verifybackup.c | 2 -- src/bin/psql/describe.c | 2 -- src/bin/psql/prompt.c | 1 - src/common/jsonapi.c | 3 --- src/fe_utils/print.c | 1 - src/interfaces/ecpg/ecpglib/connect.c | 1 - src/interfaces/ecpg/ecpglib/data.c | 1 - src/interfaces/ecpg/ecpglib/execute.c | 1 - src/interfaces/ecpg/ecpglib/misc.c | 1 - src/interfaces/ecpg/pgtypeslib/dt_common.c | 1 - src/interfaces/ecpg/pgtypeslib/interval.c | 1 - src/interfaces/ecpg/pgtypeslib/numeric.c | 1 - src/interfaces/ecpg/pgtypeslib/timestamp.c | 7 +------ src/interfaces/libpq/fe-connect.c | 1 - src/interfaces/libpq/fe-secure-openssl.c | 1 - src/pl/tcl/pltcl.c | 1 - src/port/chklocale.c | 1 - .../modules/ssl_passphrase_callback/ssl_passphrase_func.c | 1 - 100 files changed, 2 insertions(+), 138 deletions(-) diff --git a/contrib/btree_gist/btree_bit.c b/contrib/btree_gist/btree_bit.c index 2225244ded..5b246bcde4 100644 --- a/contrib/btree_gist/btree_bit.c +++ b/contrib/btree_gist/btree_bit.c @@ -104,7 +104,6 @@ gbt_bit_l2n(GBT_VARKEY *leaf, FmgrInfo *flinfo) pfree(o); return out; - } static const gbtree_vinfo tinfo = diff --git a/contrib/btree_gist/btree_cash.c b/contrib/btree_gist/btree_cash.c index dfa23224b6..6ac97e2b12 100644 --- a/contrib/btree_gist/btree_cash.c +++ b/contrib/btree_gist/btree_cash.c @@ -195,7 +195,6 @@ gbt_cash_penalty(PG_FUNCTION_ARGS) penalty_num(result, origentry->lower, origentry->upper, newentry->lower, newentry->upper); PG_RETURN_POINTER(result); - } Datum diff --git a/contrib/btree_gist/btree_float4.c b/contrib/btree_gist/btree_float4.c index b5d9175e6d..3cbd9a06dc 100644 --- a/contrib/btree_gist/btree_float4.c +++ b/contrib/btree_gist/btree_float4.c @@ -190,7 +190,6 @@ gbt_float4_penalty(PG_FUNCTION_ARGS) penalty_num(result, origentry->lower, origentry->upper, newentry->lower, newentry->upper); PG_RETURN_POINTER(result); - } Datum diff --git a/contrib/btree_gist/btree_float8.c b/contrib/btree_gist/btree_float8.c index 8fe1fedeef..b95a08e228 100644 --- a/contrib/btree_gist/btree_float8.c +++ b/contrib/btree_gist/btree_float8.c @@ -197,7 +197,6 @@ gbt_float8_penalty(PG_FUNCTION_ARGS) penalty_num(result, origentry->lower, origentry->upper, newentry->lower, newentry->upper); PG_RETURN_POINTER(result); - } Datum diff --git a/contrib/btree_gist/btree_inet.c b/contrib/btree_gist/btree_inet.c index e4b3a946b2..2fb952dca8 100644 --- a/contrib/btree_gist/btree_inet.c +++ b/contrib/btree_gist/btree_inet.c @@ -165,7 +165,6 @@ gbt_inet_penalty(PG_FUNCTION_ARGS) penalty_num(result, origentry->lower, origentry->upper, newentry->lower, newentry->upper); PG_RETURN_POINTER(result); - } Datum diff --git a/contrib/btree_gist/btree_interval.c b/contrib/btree_gist/btree_interval.c index a4b3b2b1e6..c2bf82086d 100644 --- a/contrib/btree_gist/btree_interval.c +++ b/contrib/btree_gist/btree_interval.c @@ -173,7 +173,6 @@ gbt_intv_compress(PG_FUNCTION_ARGS) } PG_RETURN_POINTER(retval); - } Datum @@ -276,7 +275,6 @@ gbt_intv_penalty(PG_FUNCTION_ARGS) penalty_num(result, iorg[0], iorg[1], inew[0], inew[1]); PG_RETURN_POINTER(result); - } Datum diff --git a/contrib/btree_gist/btree_macaddr.c b/contrib/btree_gist/btree_macaddr.c index 7f0e9e9c91..17290529c0 100644 --- a/contrib/btree_gist/btree_macaddr.c +++ b/contrib/btree_gist/btree_macaddr.c @@ -174,7 +174,6 @@ gbt_macad_penalty(PG_FUNCTION_ARGS) penalty_num(result, iorg[0], iorg[1], inew[0], inew[1]); PG_RETURN_POINTER(result); - } Datum diff --git a/contrib/btree_gist/btree_macaddr8.c b/contrib/btree_gist/btree_macaddr8.c index ab4bca5d50..796cc4efee 100644 --- a/contrib/btree_gist/btree_macaddr8.c +++ b/contrib/btree_gist/btree_macaddr8.c @@ -174,7 +174,6 @@ gbt_macad8_penalty(PG_FUNCTION_ARGS) penalty_num(result, iorg[0], iorg[1], inew[0], inew[1]); PG_RETURN_POINTER(result); - } Datum diff --git a/contrib/btree_gist/btree_ts.c b/contrib/btree_gist/btree_ts.c index 2671ba961c..a51900941e 100644 --- a/contrib/btree_gist/btree_ts.c +++ b/contrib/btree_gist/btree_ts.c @@ -377,7 +377,6 @@ gbt_ts_penalty(PG_FUNCTION_ARGS) penalty_num(result, orgdbl[0], orgdbl[1], newdbl[0], newdbl[1]); PG_RETURN_POINTER(result); - } diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index a06d4bd12d..a561d1d652 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -1004,7 +1004,6 @@ materializeResult(FunctionCallInfo fcinfo, PGconn *conn, PGresult *res) /* clean up GUC settings, if we changed any */ restoreLocalGucs(nestlevel); - } } PG_FINALLY(); @@ -2635,7 +2634,6 @@ deleteConnection(const char *name) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("undefined connection name"))); - } static void diff --git a/contrib/intarray/_int_bool.c b/contrib/intarray/_int_bool.c index 4b6a31080e..3ed88af76d 100644 --- a/contrib/intarray/_int_bool.c +++ b/contrib/intarray/_int_bool.c @@ -210,7 +210,6 @@ makepol(WORKSTATE *state) (errcode(ERRCODE_SYNTAX_ERROR), errmsg("syntax error"))); return ERR; - } } diff --git a/contrib/ltree/ltxtquery_io.c b/contrib/ltree/ltxtquery_io.c index d967f92110..3eca5cb8ff 100644 --- a/contrib/ltree/ltxtquery_io.c +++ b/contrib/ltree/ltxtquery_io.c @@ -260,7 +260,6 @@ makepol(QPRS_STATE *state) errmsg("syntax error"))); return ERR; - } } while (lenstack) diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 1ca67ef623..df2ce63790 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -1849,7 +1849,6 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, if (qbuffer) free(qbuffer); - } /* Number of output arguments (columns) for pg_stat_statements_info */ diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c index 129ca79221..f9b8c01f3b 100644 --- a/contrib/postgres_fdw/connection.c +++ b/contrib/postgres_fdw/connection.c @@ -1734,7 +1734,6 @@ postgres_fdw_get_connections(PG_FUNCTION_ARGS) tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); } - PG_RETURN_VOID(); } diff --git a/contrib/spi/refint.c b/contrib/spi/refint.c index 6fbfef2b12..18062eb1cf 100644 --- a/contrib/spi/refint.c +++ b/contrib/spi/refint.c @@ -497,12 +497,10 @@ check_foreign_key(PG_FUNCTION_ARGS) nv, (is_char_type > 0) ? "'" : "", (k < nkeys) ? ", " : ""); } strcat(sql, " where "); - } else /* DELETE */ snprintf(sql, sizeof(sql), "delete from %s where ", relname); - } /* diff --git a/src/backend/access/brin/brin_bloom.c b/src/backend/access/brin/brin_bloom.c index 7428fa90d3..6812ca9fd1 100644 --- a/src/backend/access/brin/brin_bloom.c +++ b/src/backend/access/brin/brin_bloom.c @@ -257,7 +257,6 @@ typedef struct BloomFilter /* data of the bloom filter */ char data[FLEXIBLE_ARRAY_MEMBER]; - } BloomFilter; diff --git a/src/backend/access/gin/ginbtree.c b/src/backend/access/gin/ginbtree.c index 8df45478f1..cc6d4e6338 100644 --- a/src/backend/access/gin/ginbtree.c +++ b/src/backend/access/gin/ginbtree.c @@ -527,7 +527,6 @@ ginPlaceToPage(GinBtree btree, GinBtreeStack *stack, BufferGetBlockNumber(stack->buffer), BufferGetBlockNumber(rbuffer)); } - } else { diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index ba11bcd99e..8d7655f4cf 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -8481,7 +8481,6 @@ log_heap_new_cid(Relation relation, HeapTuple tup) { xlrec.cmin = InvalidCommandId; xlrec.cmax = HeapTupleHeaderGetRawCommandId(hdr); - } xlrec.combocid = InvalidCommandId; } diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index a1c2af33f1..788db569b2 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -2073,7 +2073,6 @@ lazy_scan_noprune(LVRelState *vacrel, elog(ERROR, "unexpected HeapTupleSatisfiesVacuum result"); break; } - } vacrel->offnum = InvalidOffsetNumber; diff --git a/src/backend/access/nbtree/nbtsplitloc.c b/src/backend/access/nbtree/nbtsplitloc.c index ee01ceafda..241e26d338 100644 --- a/src/backend/access/nbtree/nbtsplitloc.c +++ b/src/backend/access/nbtree/nbtsplitloc.c @@ -35,7 +35,6 @@ typedef struct /* split point identifying fields (returned by _bt_findsplitloc) */ OffsetNumber firstrightoff; /* first origpage item on rightpage */ bool newitemonleft; /* new item goes on left, or right? */ - } SplitPoint; typedef struct diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c index fd1b53885c..ff260c393a 100644 --- a/src/backend/access/nbtree/nbtutils.c +++ b/src/backend/access/nbtree/nbtutils.c @@ -2116,14 +2116,12 @@ btoptions(Datum reloptions, bool validate) offsetof(BTOptions, vacuum_cleanup_index_scale_factor)}, {"deduplicate_items", RELOPT_TYPE_BOOL, offsetof(BTOptions, deduplicate_items)} - }; return (bytea *) build_reloptions(reloptions, validate, RELOPT_KIND_BTREE, sizeof(BTOptions), tab, lengthof(tab)); - } /* @@ -2591,7 +2589,6 @@ _bt_check_natts(Relation rel, bool heapkeyspace, Page page, OffsetNumber offnum) /* Use generic heapkeyspace pivot tuple handling */ } - } /* Handle heapkeyspace pivot tuples (excluding minus infinity items) */ diff --git a/src/backend/access/rmgrdesc/gistdesc.c b/src/backend/access/rmgrdesc/gistdesc.c index 9cab4fa158..d0c8e247c1 100644 --- a/src/backend/access/rmgrdesc/gistdesc.c +++ b/src/backend/access/rmgrdesc/gistdesc.c @@ -38,7 +38,6 @@ out_gistxlogDelete(StringInfo buf, gistxlogDelete *xlrec) { appendStringInfo(buf, "delete: latestRemovedXid %u, nitems: %u", xlrec->latestRemovedXid, xlrec->ntodelete); - } static void diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c index 1ae7492216..a171ca8a08 100644 --- a/src/backend/access/spgist/spgutils.c +++ b/src/backend/access/spgist/spgutils.c @@ -747,7 +747,6 @@ spgoptions(Datum reloptions, bool validate) RELOPT_KIND_SPGIST, sizeof(SpGistOptions), tab, lengthof(tab)); - } /* diff --git a/src/backend/access/table/tableam.c b/src/backend/access/table/tableam.c index 4f20c6ac12..b3d1a6c3f8 100644 --- a/src/backend/access/table/tableam.c +++ b/src/backend/access/table/tableam.c @@ -381,7 +381,6 @@ simple_table_tuple_update(Relation rel, ItemPointer otid, elog(ERROR, "unrecognized table_tuple_update status: %u", result); break; } - } diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 26be94b3f1..39ef865ed9 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -1790,7 +1790,6 @@ PerformWalRecovery(void) /* there are no WAL records following the checkpoint */ ereport(LOG, (errmsg("redo is not required"))); - } /* diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index ac6043514f..8377b4f7d4 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -1007,7 +1007,6 @@ get_object_address(ObjectType objtype, Node *object, address.objectId = get_domain_constraint_oid(domaddr.objectId, constrname, missing_ok); address.objectSubId = 0; - } break; case OBJECT_DATABASE: @@ -5621,7 +5620,6 @@ getObjectIdentityParts(const ObjectAddress *object, systable_endscan(rcscan); table_close(defaclrel, AccessShareLock); break; - } defacl = (Form_pg_default_acl) GETSTRUCT(tup); diff --git a/src/backend/catalog/pg_attrdef.c b/src/backend/catalog/pg_attrdef.c index 2d63c6e62a..c5d4a9912e 100644 --- a/src/backend/catalog/pg_attrdef.c +++ b/src/backend/catalog/pg_attrdef.c @@ -167,7 +167,6 @@ StoreAttrDefault(Relation rel, AttrNumber attnum, if (!missingIsNull) pfree(DatumGetPointer(missingval)); - } table_close(attrrel, RowExclusiveLock); heap_freetuple(atttup); diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c index 55c38b04c4..643bbf286e 100644 --- a/src/backend/commands/copyto.c +++ b/src/backend/commands/copyto.c @@ -97,7 +97,6 @@ typedef struct CopyToStateData FmgrInfo *out_functions; /* lookup info for output functions */ MemoryContext rowcontext; /* per-row evaluation context */ uint64 bytes_processed; /* number of bytes processed so far */ - } CopyToStateData; /* DestReceiver for COPY (query) TO */ diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 2e8d8afead..b94236f74d 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -1570,7 +1570,6 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) */ if (slotname) ReplicationSlotDropAtPubNode(wrconn, slotname, false); - } PG_FINALLY(); { diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 1d7db41d17..2cd8546d47 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -945,7 +945,6 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("specifying a table access method is not supported on a partitioned table"))); - } else if (RELKIND_HAS_TABLE_AM(relkind)) accessMethod = default_table_access_method; @@ -3773,7 +3772,6 @@ RenameConstraint(RenameStmt *stmt) stmt->relation->inh), /* recursive? */ false, /* recursing? */ 0 /* expected inhcount */ ); - } /* @@ -17451,7 +17449,6 @@ ComputePartitionAttrs(ParseState *pstate, Relation rel, List *partParams, AttrNu errmsg("data type %s has no default operator class for access method \"%s\"", format_type_be(atttype), "btree"), errhint("You must specify a btree operator class or define a default btree operator class for the data type."))); - } } else diff --git a/src/backend/executor/execParallel.c b/src/backend/executor/execParallel.c index 9a0d5d59ef..f1fd7f7e8b 100644 --- a/src/backend/executor/execParallel.c +++ b/src/backend/executor/execParallel.c @@ -1439,7 +1439,6 @@ ParallelQueryMain(dsm_segment *seg, shm_toc *toc) paramexec_space = dsa_get_address(area, fpes->param_exec); RestoreParamExecParams(paramexec_space, queryDesc->estate); - } pwcxt.toc = toc; pwcxt.seg = seg; diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c index 27989bd723..b000645d48 100644 --- a/src/backend/executor/execReplication.c +++ b/src/backend/executor/execReplication.c @@ -548,7 +548,6 @@ ExecSimpleRelationDelete(ResultRelInfo *resultRelInfo, { skip_tuple = !ExecBRDeleteTriggers(estate, epqstate, resultRelInfo, tid, NULL, NULL); - } if (!skip_tuple) diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 23030a32a5..3223d9b24e 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -4119,7 +4119,6 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans, 2, InvalidOid, (void *) aggstate, NULL); - } /* diff --git a/src/backend/executor/nodeMergejoin.c b/src/backend/executor/nodeMergejoin.c index edb8972c5b..864e3baf86 100644 --- a/src/backend/executor/nodeMergejoin.c +++ b/src/backend/executor/nodeMergejoin.c @@ -1674,5 +1674,4 @@ ExecReScanMergeJoin(MergeJoinState *node) ExecReScan(node->js.ps.lefttree); if (node->js.ps.righttree->chgParam == NULL) ExecReScan(node->js.ps.righttree); - } diff --git a/src/backend/jit/llvm/llvmjit_deform.c b/src/backend/jit/llvm/llvmjit_deform.c index a3355860c3..661f15272b 100644 --- a/src/backend/jit/llvm/llvmjit_deform.c +++ b/src/backend/jit/llvm/llvmjit_deform.c @@ -192,7 +192,6 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, v_tupleheaderp = l_load_struct_gep(b, v_heapslot, FIELDNO_HEAPTUPLETABLESLOT_TUPLE, "tupleheader"); - } else if (ops == &TTSOpsMinimalTuple) { @@ -357,7 +356,6 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, LLVMAddCase(v_switch, v_attno, attcheckattnoblocks[attnum]); } - } else { diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c index 9c8f341d96..b6b6512ef1 100644 --- a/src/backend/jit/llvm/llvmjit_expr.c +++ b/src/backend/jit/llvm/llvmjit_expr.c @@ -2173,7 +2173,6 @@ llvm_compile_expr(ExprState *state) ""); LLVMBuildBr(b, opblocks[opno + 1]); - } LLVMPositionBuilderAtEnd(b, b_no_init); diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index cbd17b790d..327a4b42af 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -1775,7 +1775,6 @@ parse_hba_auth_opt(char *name, char *val, HbaLine *hbaline, hbaline->pam_use_hostname = true; else hbaline->pam_use_hostname = false; - } else if (strcmp(name, "ldapurl") == 0) { diff --git a/src/backend/optimizer/geqo/geqo_cx.c b/src/backend/optimizer/geqo/geqo_cx.c index 3b8d2fe560..34cc53af53 100644 --- a/src/backend/optimizer/geqo/geqo_cx.c +++ b/src/backend/optimizer/geqo/geqo_cx.c @@ -115,7 +115,6 @@ cx(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, for (i = 0; i < num_gene; i++) if (tour1[i] != offspring[i]) num_diffs++; - } return num_diffs; diff --git a/src/backend/optimizer/geqo/geqo_erx.c b/src/backend/optimizer/geqo/geqo_erx.c index 3b92f420e0..cc0661365f 100644 --- a/src/backend/optimizer/geqo/geqo_erx.c +++ b/src/backend/optimizer/geqo/geqo_erx.c @@ -222,11 +222,9 @@ gimme_tour(PlannerInfo *root, Edge *edge_table, Gene *new_gene, int num_gene) /* mark this node as incorporated */ edge_table[(int) new_gene[i - 1]].unused_edges = -1; - } /* for (i=1; idefname, action))); - } else if (strcmp(defel->defname, "reserve_wal") == 0) { diff --git a/src/backend/statistics/dependencies.c b/src/backend/statistics/dependencies.c index 34326d5561..b6f3184961 100644 --- a/src/backend/statistics/dependencies.c +++ b/src/backend/statistics/dependencies.c @@ -199,7 +199,6 @@ DependencyGenerator_free(DependencyGenerator state) { pfree(state->dependencies); pfree(state); - } /* generate next combination */ diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index c12028ca0f..e02ea3a977 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -2676,7 +2676,6 @@ CheckForBufferLeaks(void) PrintBufferLeakWarning(res->buffer); RefCountErrors++; } - } Assert(RefCountErrors == 0); @@ -3652,7 +3651,6 @@ FlushRelationsAllBuffers(SMgrRelation *smgrs, int nrels) break; } } - } else { diff --git a/src/backend/storage/buffer/freelist.c b/src/backend/storage/buffer/freelist.c index 3b98e68d50..990e081aae 100644 --- a/src/backend/storage/buffer/freelist.c +++ b/src/backend/storage/buffer/freelist.c @@ -308,7 +308,6 @@ StrategyGetBuffer(BufferAccessStrategy strategy, uint32 *buf_state) return buf; } UnlockBufHdr(buf, local_buf_state); - } } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index c3aaa8bff0..9dbb4f17cf 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -648,7 +648,6 @@ SetLatch(Latch *latch) */ } #endif - } /* diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index cb39fdde33..f6e98aae29 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -243,7 +243,6 @@ typedef struct ComputeXidHorizonsResult * session's temporary tables. */ TransactionId temp_oldest_nonremovable; - } ComputeXidHorizonsResult; /* @@ -1839,7 +1838,6 @@ ComputeXidHorizons(ComputeXidHorizonsResult *h) /* Catalog tables need to consider all backends in this db */ h->catalog_oldest_nonremovable = TransactionIdOlder(h->catalog_oldest_nonremovable, xmin); - } } diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index c24779d0bb..fef462b110 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -1096,7 +1096,6 @@ LWLockQueueSelf(LWLock *lock, LWLockMode mode) #ifdef LOCK_DEBUG pg_atomic_fetch_add_u32(&lock->nwaiters, 1); #endif - } /* diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c index 366d57ea7a..cc15396789 100644 --- a/src/backend/storage/page/bufpage.c +++ b/src/backend/storage/page/bufpage.c @@ -563,7 +563,6 @@ compactify_tuples(itemIdCompact itemidbase, int nitems, Page page, bool presorte /* update the line pointer to reference the new offset */ lp->lp_off = upper; - } /* move the remaining tuples. */ @@ -669,7 +668,6 @@ compactify_tuples(itemIdCompact itemidbase, int nitems, Page page, bool presorte /* update the line pointer to reference the new offset */ lp->lp_off = upper; - } /* Copy the remaining chunk */ diff --git a/src/backend/storage/sync/sync.c b/src/backend/storage/sync/sync.c index c695d816fc..e1fb631003 100644 --- a/src/backend/storage/sync/sync.c +++ b/src/backend/storage/sync/sync.c @@ -162,7 +162,6 @@ InitSync(void) HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); pendingUnlinks = NIL; } - } /* diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 95dc2e2c83..304cce135a 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -2636,7 +2636,6 @@ exec_describe_statement_message(const char *stmt_name) } else pq_putemptymessage('n'); /* NoData */ - } /* diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index f364a9b88a..0e7b7b3138 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -3741,7 +3741,6 @@ GetCommandLogLevel(Node *parsetree) lev = LOGSTMT_ALL; break; } - } break; diff --git a/src/backend/tsearch/to_tsany.c b/src/backend/tsearch/to_tsany.c index 1b0a1e244b..edeffacc2d 100644 --- a/src/backend/tsearch/to_tsany.c +++ b/src/backend/tsearch/to_tsany.c @@ -569,7 +569,6 @@ pushval_morph(Datum opaque, TSQueryParserState state, char *strval, int lenval, } pfree(prs.words); - } else pushStop(state); @@ -720,5 +719,4 @@ websearch_to_tsquery(PG_FUNCTION_ARGS) PG_RETURN_DATUM(DirectFunctionCall2(websearch_to_tsquery_byid, ObjectIdGetDatum(cfgId), PointerGetDatum(in))); - } diff --git a/src/backend/tsearch/ts_parse.c b/src/backend/tsearch/ts_parse.c index fe46988161..27b2cca2df 100644 --- a/src/backend/tsearch/ts_parse.c +++ b/src/backend/tsearch/ts_parse.c @@ -584,7 +584,6 @@ hlparsetext(Oid cfgId, HeadlineParsedText *prs, TSQuery query, char *buf, int bu else addHLParsedLex(prs, query, lexs, NULL); } while (norms); - } while (type > 0); FunctionCall1(&(prsobj->prsend), PointerGetDatum(prsdata)); @@ -629,7 +628,6 @@ generateHeadline(HeadlineParsedText *prs) memcpy(ptr, prs->fragdelim, prs->fragdelimlen); ptr += prs->fragdelimlen; } - } if (wrd->replace) { diff --git a/src/backend/utils/activity/pgstat_database.c b/src/backend/utils/activity/pgstat_database.c index 649d9c6960..d9275611f0 100644 --- a/src/backend/utils/activity/pgstat_database.c +++ b/src/backend/utils/activity/pgstat_database.c @@ -328,7 +328,6 @@ pgstat_prep_database_pending(Oid dboid) NULL); return entry_ref->pending; - } /* diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index 8bdba1c42a..772c04155c 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -3094,7 +3094,6 @@ convert_database_priv_string(text *priv_type_text) }; return convert_any_priv_string(priv_type_text, database_priv_map); - } diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c index da3f1b9700..63649ba735 100644 --- a/src/backend/utils/adt/json.c +++ b/src/backend/utils/adt/json.c @@ -1489,7 +1489,6 @@ json_object(PG_FUNCTION_ARGS) pfree(result.data); PG_RETURN_TEXT_P(rval); - } /* diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c index 2043f2e74a..56c588bbab 100644 --- a/src/backend/utils/adt/jsonb.c +++ b/src/backend/utils/adt/jsonb.c @@ -851,7 +851,6 @@ datum_to_jsonb(Datum val, bool is_null, JsonbInState *result, sem.object_field_start = jsonb_in_object_field_start; pg_parse_json_or_ereport(lex, &sem); - } break; case JSONBTYPE_JSONB: diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index a682d9c973..d1356d6416 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -4168,7 +4168,6 @@ json_strip_nulls(PG_FUNCTION_ARGS) PG_RETURN_TEXT_P(cstring_to_text_with_len(state->strval->data, state->strval->len)); - } /* diff --git a/src/backend/utils/adt/multirangetypes.c b/src/backend/utils/adt/multirangetypes.c index efd8584a3d..67d7d67fb8 100644 --- a/src/backend/utils/adt/multirangetypes.c +++ b/src/backend/utils/adt/multirangetypes.c @@ -1181,7 +1181,6 @@ multirange_minus_internal(Oid mltrngtypoid, TypeCacheEntry *rangetyp, */ range_count3++; r2 = ++i2 >= range_count2 ? NULL : ranges2[i2]; - } else if (range_overlaps_internal(rangetyp, r1, r2)) { @@ -1200,7 +1199,6 @@ multirange_minus_internal(Oid mltrngtypoid, TypeCacheEntry *rangetyp, break; else r2 = ++i2 >= range_count2 ? NULL : ranges2[i2]; - } else { diff --git a/src/backend/utils/adt/oracle_compat.c b/src/backend/utils/adt/oracle_compat.c index f1673cc145..a6e043c32c 100644 --- a/src/backend/utils/adt/oracle_compat.c +++ b/src/backend/utils/adt/oracle_compat.c @@ -868,7 +868,6 @@ translate(PG_FUNCTION_ARGS) target += len; retlen += len; } - } else { diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 3296ad070e..7e08d7fe6c 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -9440,7 +9440,6 @@ get_rule_expr(Node *node, deparse_context *context, get_rule_expr_paren((Node *) xexpr->args, context, false, node); break; } - } if (xexpr->op == IS_XMLSERIALIZE) appendStringInfo(buf, " AS %s", diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index fb4fb987e7..71cbc1c3d8 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -3628,7 +3628,6 @@ estimate_num_groups_incremental(PlannerInfo *root, List *groupExprs, */ if (estinfo != NULL && varinfo2->isdefault) estinfo->flags |= SELFLAG_USED_DEFAULT; - } /* we're done with this relation */ diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 70937eaa46..da73796eac 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -4898,7 +4898,6 @@ timestamp_part_common(PG_FUNCTION_ARGS, bool retnumeric) lowunits, format_type_be(TIMESTAMPOID)))); intresult = 0; } - } else { @@ -5123,7 +5122,6 @@ timestamptz_part_common(PG_FUNCTION_ARGS, bool retnumeric) lowunits, format_type_be(TIMESTAMPTZOID)))); intresult = 0; } - } else if (type == RESERV) { diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c index 8ba9ef22f5..addc349151 100644 --- a/src/backend/utils/adt/tsvector_op.c +++ b/src/backend/utils/adt/tsvector_op.c @@ -2196,7 +2196,6 @@ insertStatEntry(MemoryContext persistentContext, TSVectorStat *stat, TSVector tx else pnode->right = node; } - } else { diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c index ec073e1ed0..6ae7c1f50b 100644 --- a/src/backend/utils/cache/catcache.c +++ b/src/backend/utils/cache/catcache.c @@ -1710,7 +1710,6 @@ SearchCatCacheList(CatCache *cache, * we'd better do so before we start marking the members as belonging * to the list. */ - } PG_CATCH(); { @@ -1962,7 +1961,6 @@ CatCacheCopyKeys(TupleDesc tupdesc, int nkeys, int *attnos, att->attbyval, att->attlen); } - } /* diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 72778b896a..55ee5423af 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -2683,7 +2683,6 @@ log_line_prefix(StringInfo buf, ErrorData *edata) appendStringInfo(buf, "%*s", padding, psdisp); else appendBinaryStringInfo(buf, psdisp, displen); - } else if (padding != 0) appendStringInfoSpaces(buf, @@ -2722,7 +2721,6 @@ log_line_prefix(StringInfo buf, ErrorData *edata) appendStringInfo(buf, "(%s)", MyProcPort->remote_port); } - } else if (padding != 0) appendStringInfoSpaces(buf, diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 9e0f262088..8e9b71375c 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -5906,7 +5906,6 @@ InitializeWalConsistencyChecking(void) /* checking should not be deferred again */ Assert(!check_wal_consistency_checking_deferred); } - } /* diff --git a/src/backend/utils/mmgr/generation.c b/src/backend/utils/mmgr/generation.c index 56ed496386..e530e272e0 100644 --- a/src/backend/utils/mmgr/generation.c +++ b/src/backend/utils/mmgr/generation.c @@ -620,7 +620,6 @@ GenerationBlockMarkEmpty(GenerationBlock *block) block->nchunks = 0; block->nfree = 0; block->freeptr = ((char *) block) + Generation_BLOCKHDRSZ; - } /* diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c index 3236b1b919..ceb4b0e3f7 100644 --- a/src/backend/utils/resowner/resowner.c +++ b/src/backend/utils/resowner/resowner.c @@ -896,7 +896,6 @@ CreateAuxProcessResourceOwner(void) * owner. (This needs to run after, e.g., ShutdownXLOG.) */ on_shmem_exit(ReleaseAuxProcessResourcesCallback, 0); - } /* diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index 571fb95532..1174e1a31c 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -3186,7 +3186,6 @@ mergeonerun(Tuplesortstate *state) { stup.srctape = srcTapeIndex; tuplesort_heap_replace_top(state, &stup); - } else { diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index ab826da650..1cb4a5b0d2 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -2407,7 +2407,6 @@ setup_locale_encoding(void) if (!check_locale_encoding(lc_ctype, encodingid) || !check_locale_encoding(lc_collate, encodingid)) exit(1); /* check_locale_encoding printed the error */ - } @@ -2486,7 +2485,6 @@ setup_text_search(void) printf(_("The default text search configuration will be set to \"%s\".\n"), default_text_search_config); - } diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 6ef3d61421..79a723885e 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -1373,7 +1373,6 @@ dumpDatabases(PGconn *conn) pg_fatal("could not re-open the output file \"%s\": %m", filename); } - } PQclear(res); diff --git a/src/bin/pg_rewind/parsexlog.c b/src/bin/pg_rewind/parsexlog.c index 87b9f75f2c..c6792dafae 100644 --- a/src/bin/pg_rewind/parsexlog.c +++ b/src/bin/pg_rewind/parsexlog.c @@ -98,7 +98,6 @@ extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex, } extractPageInfo(xlogreader); - } while (xlogreader->EndRecPtr < endpoint); /* diff --git a/src/bin/pg_verifybackup/pg_verifybackup.c b/src/bin/pg_verifybackup/pg_verifybackup.c index 6671a84150..bd18b4491d 100644 --- a/src/bin/pg_verifybackup/pg_verifybackup.c +++ b/src/bin/pg_verifybackup/pg_verifybackup.c @@ -740,8 +740,6 @@ verify_file_checksum(verifier_context *context, manifest_file *m, close(fd); return; } - - } if (rc < 0) report_backup_error(context, "could not read file \"%s\": %m", diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index e7377d4583..1a2c6bc7f5 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -2622,7 +2622,6 @@ describeOneTableDetails(const char *schemaname, PQgetvalue(result, i, 4)); printTableAddFooter(&cont, buf.data); - } PQclear(result); } @@ -3172,7 +3171,6 @@ describeOneTableDetails(const char *schemaname, case 4: printfPQExpBuffer(&buf, _("Triggers firing on replica only:")); break; - } printTableAddFooter(&cont, buf.data); have_heading = true; diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c index 10ab390531..509e6422b7 100644 --- a/src/bin/psql/prompt.c +++ b/src/bin/psql/prompt.c @@ -316,7 +316,6 @@ get_prompt(promptStatus_t status, ConditionalStack cstack) buf[0] = *p; buf[1] = '\0'; break; - } esc = false; } diff --git a/src/common/jsonapi.c b/src/common/jsonapi.c index 6666077a93..98e4ef0942 100644 --- a/src/common/jsonapi.c +++ b/src/common/jsonapi.c @@ -658,7 +658,6 @@ json_lex(JsonLexContext *lex) lex->token_type = JSON_TOKEN_FALSE; else return JSON_INVALID_TOKEN; - } } /* end of switch */ } @@ -856,7 +855,6 @@ json_lex_string(JsonLexContext *lex) lex->token_terminator = s + pg_encoding_mblen_bounded(lex->input_encoding, s); return JSON_ESCAPING_INVALID; } - } else if (lex->strval != NULL) { @@ -865,7 +863,6 @@ json_lex_string(JsonLexContext *lex) appendStringInfoChar(lex->strval, *s); } - } if (hi_surrogate != -1) diff --git a/src/fe_utils/print.c b/src/fe_utils/print.c index dcdb2e0d0c..fe676a971b 100644 --- a/src/fe_utils/print.c +++ b/src/fe_utils/print.c @@ -1173,7 +1173,6 @@ print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager) if (opt_border == 2) fputs(dformat->rightvrule, fout); fputc('\n', fout); - } while (more_lines); } diff --git a/src/interfaces/ecpg/ecpglib/connect.c b/src/interfaces/ecpg/ecpglib/connect.c index a2166b1e12..8dfcabe3b5 100644 --- a/src/interfaces/ecpg/ecpglib/connect.c +++ b/src/interfaces/ecpg/ecpglib/connect.c @@ -315,7 +315,6 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p ecpg_free(dbname); dbname = ecpg_strdup(envname, lineno); } - } if (dbname == NULL && connection_name == NULL) diff --git a/src/interfaces/ecpg/ecpglib/data.c b/src/interfaces/ecpg/ecpglib/data.c index 6bc91ef7eb..a1bba42bb8 100644 --- a/src/interfaces/ecpg/ecpglib/data.c +++ b/src/interfaces/ecpg/ecpglib/data.c @@ -564,7 +564,6 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno, } pval += size; - } break; diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c index 930b6adbe4..6a7ef0bbf6 100644 --- a/src/interfaces/ecpg/ecpglib/execute.c +++ b/src/interfaces/ecpg/ecpglib/execute.c @@ -1392,7 +1392,6 @@ ecpg_build_params(struct statement *stmt) if (sqlda->sqln == desc_counter) desc_counter = 0; } - } else { diff --git a/src/interfaces/ecpg/ecpglib/misc.c b/src/interfaces/ecpg/ecpglib/misc.c index b8dbe5e7f3..1eef1ec044 100644 --- a/src/interfaces/ecpg/ecpglib/misc.c +++ b/src/interfaces/ecpg/ecpglib/misc.c @@ -191,7 +191,6 @@ ECPGtransactionStatus(const char *connection_name) } return PQtransactionStatus(con->connection); - } bool diff --git a/src/interfaces/ecpg/pgtypeslib/dt_common.c b/src/interfaces/ecpg/pgtypeslib/dt_common.c index e8a8a0f0ed..e0fae3d5f1 100644 --- a/src/interfaces/ecpg/pgtypeslib/dt_common.c +++ b/src/interfaces/ecpg/pgtypeslib/dt_common.c @@ -1740,7 +1740,6 @@ ParseDateTime(char *timestr, char *lowstr, { (*endstr)++; continue; - } /* otherwise, something is not right... */ else diff --git a/src/interfaces/ecpg/pgtypeslib/interval.c b/src/interfaces/ecpg/pgtypeslib/interval.c index a7e530cb5d..73bde94aaf 100644 --- a/src/interfaces/ecpg/pgtypeslib/interval.c +++ b/src/interfaces/ecpg/pgtypeslib/interval.c @@ -947,7 +947,6 @@ interval2tm(interval span, struct tm *tm, fsec_t *fsec) { tm->tm_year = span.month / MONTHS_PER_YEAR; tm->tm_mon = span.month % MONTHS_PER_YEAR; - } else { diff --git a/src/interfaces/ecpg/pgtypeslib/numeric.c b/src/interfaces/ecpg/pgtypeslib/numeric.c index dbe4eb21e2..34efc9045f 100644 --- a/src/interfaces/ecpg/pgtypeslib/numeric.c +++ b/src/interfaces/ecpg/pgtypeslib/numeric.c @@ -1308,7 +1308,6 @@ PGTYPESnumeric_cmp(numeric *var1, numeric *var2) errno = PGTYPES_NUM_BAD_NUMERIC; return INT_MAX; - } int diff --git a/src/interfaces/ecpg/pgtypeslib/timestamp.c b/src/interfaces/ecpg/pgtypeslib/timestamp.c index 3f82ee54a5..54cc04addd 100644 --- a/src/interfaces/ecpg/pgtypeslib/timestamp.c +++ b/src/interfaces/ecpg/pgtypeslib/timestamp.c @@ -863,8 +863,6 @@ PGTYPEStimestamp_add_interval(timestamp * tin, interval * span, timestamp * tout { if (TIMESTAMP_NOT_FINITE(*tin)) *tout = *tin; - - else { if (span->month != 0) @@ -873,7 +871,6 @@ PGTYPEStimestamp_add_interval(timestamp * tin, interval * span, timestamp * tout *tm = &tt; fsec_t fsec; - if (timestamp2tm(*tin, NULL, tm, &fsec, NULL) != 0) return -1; tm->tm_mon += span->month; @@ -898,12 +895,11 @@ PGTYPEStimestamp_add_interval(timestamp * tin, interval * span, timestamp * tout return -1; } - *tin += span->time; *tout = *tin; } - return 0; + return 0; } @@ -925,6 +921,5 @@ PGTYPEStimestamp_sub_interval(timestamp * tin, interval * span, timestamp * tout tspan.month = -span->month; tspan.time = -span->time; - return PGTYPEStimestamp_add_interval(tin, &tspan, tout); } diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index cf554d389f..4c12f1411f 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -664,7 +664,6 @@ PQconnectdbParams(const char *const *keywords, (void) connectDBComplete(conn); return conn; - } /* diff --git a/src/interfaces/libpq/fe-secure-openssl.c b/src/interfaces/libpq/fe-secure-openssl.c index 24a598b6e4..42d8d4616e 100644 --- a/src/interfaces/libpq/fe-secure-openssl.c +++ b/src/interfaces/libpq/fe-secure-openssl.c @@ -1432,7 +1432,6 @@ initialize_SSL(PGconn *conn) } SSLerrfree(err); - } } diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c index 68c9bd1970..0dd6d8ab2c 100644 --- a/src/pl/tcl/pltcl.c +++ b/src/pl/tcl/pltcl.c @@ -1243,7 +1243,6 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS, pltcl_call_state *call_state, for (i = 0; i < trigdata->tg_trigger->tgnargs; i++) Tcl_ListObjAppendElement(NULL, tcl_cmd, Tcl_NewStringObj(utf_e2u(trigdata->tg_trigger->tgargs[i]), -1)); - } PG_CATCH(); { diff --git a/src/port/chklocale.c b/src/port/chklocale.c index 3e77725352..c85d8da3c8 100644 --- a/src/port/chklocale.c +++ b/src/port/chklocale.c @@ -278,7 +278,6 @@ win32_langinfo(const char *ctype) strcpy(r, codepage); } } - } #endif diff --git a/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c b/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c index 7c469fd57e..b5bb5580a0 100644 --- a/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c +++ b/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c @@ -89,5 +89,4 @@ rot13_passphrase(char *buf, int size, int rwflag, void *userdata) } return strlen(buf); - } From 7b7ed046cb2ad9f6efac90380757d5977f0f563f Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 13 Apr 2022 13:35:02 -0400 Subject: [PATCH 514/772] Prevent access to no-longer-pinned buffer in heapam_tuple_lock(). heap_fetch() used to have a "keep_buf" parameter that told it to return ownership of the buffer pin to the caller after finding that the requested tuple TID exists but is invisible to the specified snapshot. This was thoughtlessly removed in commit 5db6df0c0, which broke heapam_tuple_lock() (formerly EvalPlanQualFetch) because that function needs to do more accesses to the tuple even if it's invisible. The net effect is that we would continue to touch the page for a microsecond or two after releasing pin on the buffer. Usually no harm would result; but if a different session decided to defragment the page concurrently, we could see garbage data and mistakenly conclude that there's no newer tuple version to chain up to. (It's hard to say whether this has happened in the field. The bug was actually found thanks to a later change that allowed valgrind to detect accesses to non-pinned buffers.) The most reasonable way to fix this is to reintroduce keep_buf, although I made it behave slightly differently: buffer ownership is passed back only if there is a valid tuple at the requested TID. In HEAD, we can just add the parameter back to heap_fetch(). To avoid an API break in the back branches, introduce an additional function heap_fetch_extended() in those branches. In HEAD there is an additional, less obvious API change: tuple->t_data will be set to NULL in all cases where buffer ownership is not returned, in particular when the tuple exists but fails the time qual (and !keep_buf). This is to defend against any other callers attempting to access non-pinned buffers. We concluded that making that change in back branches would be more likely to introduce problems than cure any. In passing, remove a comment about heap_fetch that was obsoleted by 9a8ee1dc6. Per bug #17462 from Daniil Anisimov. Back-patch to v12 where the bug was introduced. Discussion: https://postgr.es/m/17462-9c98a0f00df9bd36@postgresql.org --- src/backend/access/heap/heapam.c | 30 ++++++++++++++++-------- src/backend/access/heap/heapam_handler.c | 16 ++++++------- src/include/access/heapam.h | 2 +- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 8d7655f4cf..7421851027 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -1530,10 +1530,14 @@ heap_getnextslot_tidrange(TableScanDesc sscan, ScanDirection direction, * must unpin the buffer when done with the tuple. * * If the tuple is not found (ie, item number references a deleted slot), - * then tuple->t_data is set to NULL and false is returned. + * then tuple->t_data is set to NULL, *userbuf is set to InvalidBuffer, + * and false is returned. * - * If the tuple is found but fails the time qual check, then false is returned - * but tuple->t_data is left pointing to the tuple. + * If the tuple is found but fails the time qual check, then the behavior + * depends on the keep_buf parameter. If keep_buf is false, the results + * are the same as for the tuple-not-found case. If keep_buf is true, + * then tuple->t_data and *userbuf are returned as for the success case, + * and again the caller must unpin the buffer; but false is returned. * * heap_fetch does not follow HOT chains: only the exact TID requested will * be fetched. @@ -1551,7 +1555,8 @@ bool heap_fetch(Relation relation, Snapshot snapshot, HeapTuple tuple, - Buffer *userbuf) + Buffer *userbuf, + bool keep_buf) { ItemPointer tid = &(tuple->t_self); ItemId lp; @@ -1634,9 +1639,15 @@ heap_fetch(Relation relation, return true; } - /* Tuple failed time qual */ - ReleaseBuffer(buffer); - *userbuf = InvalidBuffer; + /* Tuple failed time qual, but maybe caller wants to see it anyway. */ + if (keep_buf) + *userbuf = buffer; + else + { + ReleaseBuffer(buffer); + *userbuf = InvalidBuffer; + tuple->t_data = NULL; + } return false; } @@ -1659,8 +1670,7 @@ heap_fetch(Relation relation, * are vacuumable, false if not. * * Unlike heap_fetch, the caller must already have pin and (at least) share - * lock on the buffer; it is still pinned/locked at exit. Also unlike - * heap_fetch, we do not report any pgstats count; caller may do so if wanted. + * lock on the buffer; it is still pinned/locked at exit. */ bool heap_hot_search_buffer(ItemPointer tid, Relation relation, Buffer buffer, @@ -5379,7 +5389,7 @@ heap_lock_updated_tuple_rec(Relation rel, ItemPointer tid, TransactionId xid, block = ItemPointerGetBlockNumber(&tupid); ItemPointerCopy(&tupid, &(mytup.t_self)); - if (!heap_fetch(rel, SnapshotAny, &mytup, &buf)) + if (!heap_fetch(rel, SnapshotAny, &mytup, &buf, false)) { /* * if we fail to find the updated version of the tuple, it's diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 666b6205a7..444f027149 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -188,7 +188,7 @@ heapam_fetch_row_version(Relation relation, Assert(TTS_IS_BUFFERTUPLE(slot)); bslot->base.tupdata.t_self = *tid; - if (heap_fetch(relation, snapshot, &bslot->base.tupdata, &buffer)) + if (heap_fetch(relation, snapshot, &bslot->base.tupdata, &buffer, false)) { /* store in slot, transferring existing pin */ ExecStorePinnedBufferHeapTuple(&bslot->base.tupdata, slot, buffer); @@ -401,7 +401,7 @@ heapam_tuple_lock(Relation relation, ItemPointer tid, Snapshot snapshot, errmsg("tuple to be locked was already moved to another partition due to concurrent update"))); tuple->t_self = *tid; - if (heap_fetch(relation, &SnapshotDirty, tuple, &buffer)) + if (heap_fetch(relation, &SnapshotDirty, tuple, &buffer, true)) { /* * If xmin isn't what we're expecting, the slot must have @@ -500,6 +500,7 @@ heapam_tuple_lock(Relation relation, ItemPointer tid, Snapshot snapshot, */ if (tuple->t_data == NULL) { + Assert(!BufferIsValid(buffer)); return TM_Deleted; } @@ -509,8 +510,7 @@ heapam_tuple_lock(Relation relation, ItemPointer tid, Snapshot snapshot, if (!TransactionIdEquals(HeapTupleHeaderGetXmin(tuple->t_data), priorXmax)) { - if (BufferIsValid(buffer)) - ReleaseBuffer(buffer); + ReleaseBuffer(buffer); return TM_Deleted; } @@ -526,13 +526,12 @@ heapam_tuple_lock(Relation relation, ItemPointer tid, Snapshot snapshot, * * As above, it should be safe to examine xmax and t_ctid * without the buffer content lock, because they can't be - * changing. + * changing. We'd better hold a buffer pin though. */ if (ItemPointerEquals(&tuple->t_self, &tuple->t_data->t_ctid)) { /* deleted, so forget about it */ - if (BufferIsValid(buffer)) - ReleaseBuffer(buffer); + ReleaseBuffer(buffer); return TM_Deleted; } @@ -540,8 +539,7 @@ heapam_tuple_lock(Relation relation, ItemPointer tid, Snapshot snapshot, *tid = tuple->t_data->t_ctid; /* updated row should have xmin matching this xmax */ priorXmax = HeapTupleHeaderGetUpdateXid(tuple->t_data); - if (BufferIsValid(buffer)) - ReleaseBuffer(buffer); + ReleaseBuffer(buffer); /* loop back to fetch next in chain */ } } diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index 4403f01e13..5d7f7fd800 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -133,7 +133,7 @@ extern bool heap_getnextslot_tidrange(TableScanDesc sscan, ScanDirection direction, TupleTableSlot *slot); extern bool heap_fetch(Relation relation, Snapshot snapshot, - HeapTuple tuple, Buffer *userbuf); + HeapTuple tuple, Buffer *userbuf, bool keep_buf); extern bool heap_hot_search_buffer(ItemPointer tid, Relation relation, Buffer buffer, Snapshot snapshot, HeapTuple heapTuple, bool *all_dead, bool first_call); From 139d46ee26a2c7813d02739d35fa305890643ac1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 13 Apr 2022 15:03:58 -0400 Subject: [PATCH 515/772] Further tweak the default behavior of psql's \dconfig. Define "parameters with non-default settings" as being those that not only have pg_settings.source different from 'default', but also have a current value different from the hard-wired boot_val. Adding the latter restriction removes a number of not-very-interesting cases where the active setting is chosen by initdb but in practice tends to be the same all the time. Per discussion with Jonathan Katz. Discussion: https://postgr.es/m/YlFQLzlPi4QD0wSi@msg.df7cb.de --- src/bin/psql/describe.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 1a2c6bc7f5..839f1add90 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -4408,7 +4408,8 @@ describeConfigurationParameters(const char *pattern, bool verbose, NULL, "pg_catalog.lower(s.name)", NULL, NULL); else - appendPQExpBufferStr(&buf, "WHERE s.source <> 'default'\n"); + appendPQExpBufferStr(&buf, "WHERE s.source <> 'default' AND\n" + " s.setting IS DISTINCT FROM s.boot_val\n"); appendPQExpBufferStr(&buf, "ORDER BY 1;"); From b5607b0746f40b3f5b38004c64ccc9697ee1e222 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 13 Apr 2022 16:26:34 -0400 Subject: [PATCH 516/772] Fix case sensitivity in psql's tab completion for GUC names. Input for these should be case-insensitive, but was not completely so. Comparing to the similar queries for timezone names, I realized that we'd missed forcing the comparison pattern to lower-case. With that, it behaves as I expect. While here, flatten the sub-selects in these queries; I don't find that those add any readability. Discussion: https://postgr.es/m/3369130.1649348542@sss.pgh.pa.us --- src/bin/psql/tab-complete.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 10e8dbc9b1..588c0841fe 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1006,24 +1006,18 @@ static const SchemaQuery Query_for_trigger_of_table = { /* Use COMPLETE_WITH_QUERY_VERBATIM with these queries for GUC names: */ #define Query_for_list_of_alter_system_set_vars \ -"SELECT name FROM "\ -" (SELECT pg_catalog.lower(name) AS name FROM pg_catalog.pg_settings "\ -" WHERE context != 'internal' "\ -" ) ss "\ -" WHERE name LIKE '%s'" +"SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\ +" WHERE context != 'internal' "\ +" AND pg_catalog.lower(name) LIKE pg_catalog.lower('%s')" #define Query_for_list_of_set_vars \ -"SELECT name FROM "\ -" (SELECT pg_catalog.lower(name) AS name FROM pg_catalog.pg_settings "\ -" WHERE context IN ('user', 'superuser') "\ -" ) ss "\ -" WHERE name LIKE '%s'" +"SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\ +" WHERE context IN ('user', 'superuser') "\ +" AND pg_catalog.lower(name) LIKE pg_catalog.lower('%s')" #define Query_for_list_of_show_vars \ -"SELECT name FROM "\ -" (SELECT pg_catalog.lower(name) AS name FROM pg_catalog.pg_settings "\ -" ) ss "\ -" WHERE name LIKE '%s'" +"SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\ +" WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')" #define Query_for_list_of_roles \ " SELECT rolname "\ From ac8be0cb957811d04d7564f4d710ceb3e5f2fb9f Mon Sep 17 00:00:00 2001 From: David Rowley Date: Thu, 14 Apr 2022 09:16:05 +1200 Subject: [PATCH 517/772] Docs: fix some spelling mistakes and also do some wordsmithing All except one of these are new to v15. Only one of the wordsmithing changes appears in older versions. The wordsmithing improvement does not seem significant enough to warrant backpatching. Author: Justin Pryzby Discussion: https://postgr.es/m/20220411020336.GB26620@telsasoft.com --- doc/src/sgml/charset.sgml | 12 ++++++------ doc/src/sgml/ref/initdb.sgml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/src/sgml/charset.sgml b/doc/src/sgml/charset.sgml index d60d3207fd..b95303fb89 100644 --- a/doc/src/sgml/charset.sgml +++ b/doc/src/sgml/charset.sgml @@ -314,7 +314,7 @@ initdb --locale=sv_SE A locale can be selected separately for each database. The SQL command CREATE DATABASE and its command-line equivalent createdb have options for that. Use this for example - if a database cluster houses databases for multiple tennants with + if a database cluster houses databases for multiple tenants with different requirements. @@ -346,7 +346,7 @@ initdb --locale=sv_SE providers. This specifies which library supplies the locale data. One standard provider name is libc, which uses the locales provided by the operating system C library. These are the - locales that most tools provided by the operating system use. Another + locales used by most tools provided by the operating system. Another provider is icu, which uses the external ICUICU library. ICU locales can only be used if support for ICU was configured when PostgreSQL was built. @@ -361,8 +361,8 @@ initdb --locale=sv_SE initdb --locale-provider=icu --icu-locale=en - See the description of the respective commands and programs for the - respective details. Note that you can mix locale providers on different + See the description of the respective commands and programs for + details. Note that you can mix locale providers at different granularities, for example use libc by default for the cluster but have one database that uses the icu provider, and then have collation objects using either provider within @@ -610,8 +610,8 @@ SELECT * FROM test1 ORDER BY a || b COLLATE "fr_FR"; definition has a provider that specifies which library supplies the locale data. One standard provider name is libc, which uses the locales provided by the - operating system C library. These are the locales that most tools - provided by the operating system use. Another provider + operating system C library. These are the locales used by most tools + provided by the operating system. Another provider is icu, which uses the external ICUICU library. ICU locales can only be used if support for ICU was configured when PostgreSQL was built. diff --git a/doc/src/sgml/ref/initdb.sgml b/doc/src/sgml/ref/initdb.sgml index f5d633b0af..c9ffaaecfb 100644 --- a/doc/src/sgml/ref/initdb.sgml +++ b/doc/src/sgml/ref/initdb.sgml @@ -108,7 +108,7 @@ PostgreSQL documentation Alternatively, the ICU library can be used to provide locale services. (Again, this only sets the default for subsequently created databases.) To select this option, specify --locale-provider=icu. - To chose the specific ICU locale ID to apply, use the option + To choose the specific ICU locale ID to apply, use the option . Note that for implementation reasons and to support legacy code, initdb will still select and initialize libc locale From a00fd066b1b632e675bae74841a87de1ffc1cd33 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Thu, 14 Apr 2022 09:28:56 +1200 Subject: [PATCH 518/772] Add missing spaces after single-line comments Only 1 of 3 of these changes appear to be handled by pgindent. That change is new to v15. The remaining two appear to be left alone by pgindent. The exact reason for that is not 100% clear to me. It seems related to the fact that it's a line that contains *only* a single line comment and no actual code. It does not seem worth investigating this in too much detail. In any case, these do not conform to our usual practices, so fix them. Author: Justin Pryzby Discussion: https://postgr.es/m/20220411020336.GB26620@telsasoft.com --- src/backend/storage/file/fd.c | 2 +- src/include/replication/message.h | 2 +- src/include/tsearch/ts_type.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index 14b77f2861..24704b6a02 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -912,7 +912,7 @@ InitFileAccess(void) void InitTemporaryFileAccess(void) { - Assert(SizeVfdCache != 0); /* InitFileAccess() needs to have run*/ + Assert(SizeVfdCache != 0); /* InitFileAccess() needs to have run */ Assert(!temporary_files_allowed); /* call me only once */ /* diff --git a/src/include/replication/message.h b/src/include/replication/message.h index 7d7785292f..b9686c2855 100644 --- a/src/include/replication/message.h +++ b/src/include/replication/message.h @@ -32,7 +32,7 @@ typedef struct xl_logical_message extern XLogRecPtr LogLogicalMessage(const char *prefix, const char *message, size_t size, bool transactional); -/* RMGR API*/ +/* RMGR API */ #define XLOG_LOGICAL_MESSAGE 0x00 void logicalmsg_redo(XLogReaderState *record); void logicalmsg_desc(StringInfo buf, XLogReaderState *record); diff --git a/src/include/tsearch/ts_type.h b/src/include/tsearch/ts_type.h index a2008f5504..689b2d1cfb 100644 --- a/src/include/tsearch/ts_type.h +++ b/src/include/tsearch/ts_type.h @@ -171,7 +171,7 @@ typedef struct extern PGDLLIMPORT const int tsearch_op_priority[OP_COUNT]; -/* get operation priority by its code*/ +/* get operation priority by its code */ #define OP_PRIORITY(x) ( tsearch_op_priority[(x) - 1] ) /* get QueryOperator priority */ #define QO_PRIORITY(x) OP_PRIORITY(((QueryOperator *) (x))->oper) From cd4868a5700fadf5a840d44686658517433b338c Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 14 Apr 2022 15:08:03 +0900 Subject: [PATCH 519/772] pageinspect: Fix handling of all-zero pages Getting from get_raw_page() an all-zero page is considered as a valid case by the buffer manager and it can happen for example when finding a corrupted page with zero_damaged_pages enabled (using zero_damaged_pages to look at corrupted pages happens), or after a crash when a relation file is extended before any WAL for its new data is generated (before a vacuum or autovacuum job comes in to do some cleanup). However, all the functions of pageinspect, as of the index AMs (except hash that has its own idea of new pages), heap, the FSM or the page header have never worked with all-zero pages, causing various crashes when going through the page internals. This commit changes all the pageinspect functions to be compliant with all-zero pages, where the choice is made to return NULL or no rows for SRFs when finding a new page. get_raw_page() still works the same way, returning a batch of zeros in the bytea of the page retrieved. A hard error could be used but NULL, while more invasive, is useful when scanning relation files in full to get a batch of results for a single relation in one query. Tests are added for all the code paths impacted. Reported-by: Daria Lepikhova Author: Michael Paquier Discussion: https://postgr.es/m/561e187b-3549-c8d5-03f5-525c14e65bd0@postgrespro.ru Backpatch-through: 10 --- contrib/pageinspect/brinfuncs.c | 22 ++++++++++++++++++++++ contrib/pageinspect/btreefuncs.c | 6 ++++++ contrib/pageinspect/expected/brin.out | 25 +++++++++++++++++++++++++ contrib/pageinspect/expected/btree.out | 6 ++++++ contrib/pageinspect/expected/gin.out | 14 ++++++++++++++ contrib/pageinspect/expected/gist.out | 18 ++++++++++++++++++ contrib/pageinspect/expected/hash.out | 12 ++++++++++++ contrib/pageinspect/expected/page.out | 20 ++++++++++++++++++++ contrib/pageinspect/fsmfuncs.c | 4 ++++ contrib/pageinspect/ginfuncs.c | 13 +++++++++++++ contrib/pageinspect/gistfuncs.c | 12 ++++++++++++ contrib/pageinspect/rawpage.c | 3 +++ contrib/pageinspect/sql/brin.sql | 7 +++++++ contrib/pageinspect/sql/btree.sql | 4 ++++ contrib/pageinspect/sql/gin.sql | 6 ++++++ contrib/pageinspect/sql/gist.sql | 6 ++++++ contrib/pageinspect/sql/hash.sql | 7 +++++++ contrib/pageinspect/sql/page.sql | 6 ++++++ 18 files changed, 191 insertions(+) diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c index 0387b2847a..c2a37277e0 100644 --- a/contrib/pageinspect/brinfuncs.c +++ b/contrib/pageinspect/brinfuncs.c @@ -58,6 +58,9 @@ brin_page_type(PG_FUNCTION_ARGS) page = get_page_from_raw(raw_page); + if (PageIsNew(page)) + PG_RETURN_NULL(); + /* verify the special space has the expected size */ if (PageGetSpecialSize(page) != MAXALIGN(sizeof(BrinSpecialSpace))) ereport(ERROR, @@ -95,6 +98,9 @@ verify_brin_page(bytea *raw_page, uint16 type, const char *strtype) { Page page = get_page_from_raw(raw_page); + if (PageIsNew(page)) + return page; + /* verify the special space has the expected size */ if (PageGetSpecialSize(page) != MAXALIGN(sizeof(BrinSpecialSpace))) ereport(ERROR, @@ -156,6 +162,13 @@ brin_page_items(PG_FUNCTION_ARGS) /* minimally verify the page we got */ page = verify_brin_page(raw_page, BRIN_PAGETYPE_REGULAR, "regular"); + if (PageIsNew(page)) + { + brin_free_desc(bdesc); + index_close(indexRel, AccessShareLock); + PG_RETURN_NULL(); + } + /* * Initialize output functions for all indexed datatypes; simplifies * calling them later. @@ -331,6 +344,9 @@ brin_metapage_info(PG_FUNCTION_ARGS) page = verify_brin_page(raw_page, BRIN_PAGETYPE_META, "metapage"); + if (PageIsNew(page)) + PG_RETURN_NULL(); + /* Build a tuple descriptor for our result type */ if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) elog(ERROR, "return type must be a row type"); @@ -382,6 +398,12 @@ brin_revmap_data(PG_FUNCTION_ARGS) /* minimally verify the page we got */ page = verify_brin_page(raw_page, BRIN_PAGETYPE_REVMAP, "revmap"); + if (PageIsNew(page)) + { + MemoryContextSwitchTo(mctx); + PG_RETURN_NULL(); + } + state = palloc(sizeof(*state)); state->tids = ((RevmapContents *) PageGetContents(page))->rm_tids; state->idx = 0; diff --git a/contrib/pageinspect/btreefuncs.c b/contrib/pageinspect/btreefuncs.c index 3daa31c84d..62f2c1b315 100644 --- a/contrib/pageinspect/btreefuncs.c +++ b/contrib/pageinspect/btreefuncs.c @@ -611,6 +611,12 @@ bt_page_items_bytea(PG_FUNCTION_ARGS) uargs->page = get_page_from_raw(raw_page); + if (PageIsNew(uargs->page)) + { + MemoryContextSwitchTo(mctx); + PG_RETURN_NULL(); + } + uargs->offset = FirstOffsetNumber; /* verify the special space has the expected size */ diff --git a/contrib/pageinspect/expected/brin.out b/contrib/pageinspect/expected/brin.out index 62ee783b60..d19cdc3b95 100644 --- a/contrib/pageinspect/expected/brin.out +++ b/contrib/pageinspect/expected/brin.out @@ -62,4 +62,29 @@ ERROR: input page is not a valid BRIN page SELECT * FROM brin_revmap_data(get_raw_page('test1', 0)); ERROR: input page is not a valid BRIN page \set VERBOSITY default +-- Tests with all-zero pages. +SHOW block_size \gset +SELECT brin_page_type(decode(repeat('00', :block_size), 'hex')); + brin_page_type +---------------- + +(1 row) + +SELECT brin_page_items(decode(repeat('00', :block_size), 'hex'), 'test1_a_idx'); + brin_page_items +----------------- +(0 rows) + +SELECT brin_metapage_info(decode(repeat('00', :block_size), 'hex')); + brin_metapage_info +-------------------- + +(1 row) + +SELECT brin_revmap_data(decode(repeat('00', :block_size), 'hex')); + brin_revmap_data +------------------ + +(1 row) + DROP TABLE test1; diff --git a/contrib/pageinspect/expected/btree.out b/contrib/pageinspect/expected/btree.out index 89d2160990..035a81a759 100644 --- a/contrib/pageinspect/expected/btree.out +++ b/contrib/pageinspect/expected/btree.out @@ -99,4 +99,10 @@ ERROR: input page is not a valid btree page SELECT bt_page_items(get_raw_page('test1_a_brin', 0)); ERROR: input page is not a valid btree page \set VERBOSITY default +-- Tests with all-zero pages. +SHOW block_size \gset +SELECT bt_page_items(decode(repeat('00', :block_size), 'hex')); +-[ RECORD 1 ]-+- +bt_page_items | + DROP TABLE test1; diff --git a/contrib/pageinspect/expected/gin.out b/contrib/pageinspect/expected/gin.out index e9fdb4cf20..ff1da6a5a1 100644 --- a/contrib/pageinspect/expected/gin.out +++ b/contrib/pageinspect/expected/gin.out @@ -54,4 +54,18 @@ ERROR: input page is not a valid GIN data leaf page SELECT * FROM gin_leafpage_items(get_raw_page('test1', 0)); ERROR: input page is not a valid GIN data leaf page \set VERBOSITY default +-- Tests with all-zero pages. +SHOW block_size \gset +SELECT gin_leafpage_items(decode(repeat('00', :block_size), 'hex')); +-[ RECORD 1 ]------+- +gin_leafpage_items | + +SELECT gin_metapage_info(decode(repeat('00', :block_size), 'hex')); +-[ RECORD 1 ]-----+- +gin_metapage_info | + +SELECT gin_page_opaque_info(decode(repeat('00', :block_size), 'hex')); +-[ RECORD 1 ]--------+- +gin_page_opaque_info | + DROP TABLE test1; diff --git a/contrib/pageinspect/expected/gist.out b/contrib/pageinspect/expected/gist.out index c18a7091b2..a51bded0cb 100644 --- a/contrib/pageinspect/expected/gist.out +++ b/contrib/pageinspect/expected/gist.out @@ -87,4 +87,22 @@ ERROR: input page is not a valid GiST page SELECT gist_page_items_bytea(get_raw_page('test_gist_btree', 0)); ERROR: input page is not a valid GiST page \set VERBOSITY default +-- Tests with all-zero pages. +SHOW block_size \gset +SELECT gist_page_items_bytea(decode(repeat('00', :block_size), 'hex')); + gist_page_items_bytea +----------------------- +(0 rows) + +SELECT gist_page_items(decode(repeat('00', :block_size), 'hex'), 'test_gist_idx'::regclass); + gist_page_items +----------------- +(0 rows) + +SELECT gist_page_opaque_info(decode(repeat('00', :block_size), 'hex')); + gist_page_opaque_info +----------------------- + +(1 row) + DROP TABLE test_gist; diff --git a/contrib/pageinspect/expected/hash.out b/contrib/pageinspect/expected/hash.out index 96c9511457..5d6a518834 100644 --- a/contrib/pageinspect/expected/hash.out +++ b/contrib/pageinspect/expected/hash.out @@ -190,4 +190,16 @@ ERROR: input page is not a valid hash page SELECT hash_page_type(get_raw_page('test_hash', 0)); ERROR: input page is not a valid hash page \set VERBOSITY default +-- Tests with all-zero pages. +SHOW block_size \gset +SELECT hash_metapage_info(decode(repeat('00', :block_size), 'hex')); +ERROR: page is not a hash meta page +SELECT hash_page_items(decode(repeat('00', :block_size), 'hex')); +ERROR: page is not a hash bucket or overflow page +SELECT hash_page_stats(decode(repeat('00', :block_size), 'hex')); +ERROR: page is not a hash bucket or overflow page +SELECT hash_page_type(decode(repeat('00', :block_size), 'hex')); +-[ RECORD 1 ]--+------- +hash_page_type | unused + DROP TABLE test_hash; diff --git a/contrib/pageinspect/expected/page.out b/contrib/pageinspect/expected/page.out index 9bbdda7f18..3bdc37bbf5 100644 --- a/contrib/pageinspect/expected/page.out +++ b/contrib/pageinspect/expected/page.out @@ -218,3 +218,23 @@ ERROR: invalid page size SELECT page_header('ccc'::bytea); ERROR: invalid page size \set VERBOSITY default +-- Tests with all-zero pages. +SHOW block_size \gset +SELECT fsm_page_contents(decode(repeat('00', :block_size), 'hex')); + fsm_page_contents +------------------- + +(1 row) + +SELECT page_header(decode(repeat('00', :block_size), 'hex')); + page_header +----------------------- + (0/0,0,0,0,0,0,0,0,0) +(1 row) + +SELECT page_checksum(decode(repeat('00', :block_size), 'hex'), 1); + page_checksum +--------------- + +(1 row) + diff --git a/contrib/pageinspect/fsmfuncs.c b/contrib/pageinspect/fsmfuncs.c index b914da1d4a..2b9679e454 100644 --- a/contrib/pageinspect/fsmfuncs.c +++ b/contrib/pageinspect/fsmfuncs.c @@ -46,6 +46,10 @@ fsm_page_contents(PG_FUNCTION_ARGS) errmsg("must be superuser to use raw page functions"))); page = get_page_from_raw(raw_page); + + if (PageIsNew(page)) + PG_RETURN_NULL(); + fsmpage = (FSMPage) PageGetContents(page); initStringInfo(&sinfo); diff --git a/contrib/pageinspect/ginfuncs.c b/contrib/pageinspect/ginfuncs.c index 1c56fa18cd..31aca7b000 100644 --- a/contrib/pageinspect/ginfuncs.c +++ b/contrib/pageinspect/ginfuncs.c @@ -49,6 +49,9 @@ gin_metapage_info(PG_FUNCTION_ARGS) page = get_page_from_raw(raw_page); + if (PageIsNew(page)) + PG_RETURN_NULL(); + if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GinPageOpaqueData))) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -58,6 +61,7 @@ gin_metapage_info(PG_FUNCTION_ARGS) (int) PageGetSpecialSize(page)))); opaq = GinPageGetOpaque(page); + if (opaq->flags != GIN_META) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -115,6 +119,9 @@ gin_page_opaque_info(PG_FUNCTION_ARGS) page = get_page_from_raw(raw_page); + if (PageIsNew(page)) + PG_RETURN_NULL(); + if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GinPageOpaqueData))) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -200,6 +207,12 @@ gin_leafpage_items(PG_FUNCTION_ARGS) page = get_page_from_raw(raw_page); + if (PageIsNew(page)) + { + MemoryContextSwitchTo(mctx); + PG_RETURN_NULL(); + } + if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GinPageOpaqueData))) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c index b2bbf4f6cb..9c29fbc7aa 100644 --- a/contrib/pageinspect/gistfuncs.c +++ b/contrib/pageinspect/gistfuncs.c @@ -55,6 +55,9 @@ gist_page_opaque_info(PG_FUNCTION_ARGS) page = get_page_from_raw(raw_page); + if (PageIsNew(page)) + PG_RETURN_NULL(); + /* verify the special space has the expected size */ if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GISTPageOpaqueData))) ereport(ERROR, @@ -130,6 +133,9 @@ gist_page_items_bytea(PG_FUNCTION_ARGS) page = get_page_from_raw(raw_page); + if (PageIsNew(page)) + PG_RETURN_NULL(); + /* verify the special space has the expected size */ if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GISTPageOpaqueData))) ereport(ERROR, @@ -220,6 +226,12 @@ gist_page_items(PG_FUNCTION_ARGS) page = get_page_from_raw(raw_page); + if (PageIsNew(page)) + { + index_close(indexRel, AccessShareLock); + PG_RETURN_NULL(); + } + /* Avoid bogus PageGetMaxOffsetNumber() call with deleted pages */ if (GistPageIsDeleted(page)) elog(NOTICE, "page is deleted"); diff --git a/contrib/pageinspect/rawpage.c b/contrib/pageinspect/rawpage.c index 92ffb2d930..730a46b1d8 100644 --- a/contrib/pageinspect/rawpage.c +++ b/contrib/pageinspect/rawpage.c @@ -352,6 +352,9 @@ page_checksum_internal(PG_FUNCTION_ARGS, enum pageinspect_version ext_version) page = get_page_from_raw(raw_page); + if (PageIsNew(page)) + PG_RETURN_NULL(); + PG_RETURN_INT16(pg_checksum_page((char *) page, blkno)); } diff --git a/contrib/pageinspect/sql/brin.sql b/contrib/pageinspect/sql/brin.sql index dc5d1661b6..45098c1ef5 100644 --- a/contrib/pageinspect/sql/brin.sql +++ b/contrib/pageinspect/sql/brin.sql @@ -27,4 +27,11 @@ SELECT * FROM brin_metapage_info(get_raw_page('test1', 0)); SELECT * FROM brin_revmap_data(get_raw_page('test1', 0)); \set VERBOSITY default +-- Tests with all-zero pages. +SHOW block_size \gset +SELECT brin_page_type(decode(repeat('00', :block_size), 'hex')); +SELECT brin_page_items(decode(repeat('00', :block_size), 'hex'), 'test1_a_idx'); +SELECT brin_metapage_info(decode(repeat('00', :block_size), 'hex')); +SELECT brin_revmap_data(decode(repeat('00', :block_size), 'hex')); + DROP TABLE test1; diff --git a/contrib/pageinspect/sql/btree.sql b/contrib/pageinspect/sql/btree.sql index 44d83f90ba..1f554f0f67 100644 --- a/contrib/pageinspect/sql/btree.sql +++ b/contrib/pageinspect/sql/btree.sql @@ -44,4 +44,8 @@ SELECT bt_page_items(get_raw_page('test1', 0)); SELECT bt_page_items(get_raw_page('test1_a_brin', 0)); \set VERBOSITY default +-- Tests with all-zero pages. +SHOW block_size \gset +SELECT bt_page_items(decode(repeat('00', :block_size), 'hex')); + DROP TABLE test1; diff --git a/contrib/pageinspect/sql/gin.sql b/contrib/pageinspect/sql/gin.sql index 6499b5c72b..b57466d7eb 100644 --- a/contrib/pageinspect/sql/gin.sql +++ b/contrib/pageinspect/sql/gin.sql @@ -32,4 +32,10 @@ SELECT * FROM gin_page_opaque_info(get_raw_page('test1', 0)); SELECT * FROM gin_leafpage_items(get_raw_page('test1', 0)); \set VERBOSITY default +-- Tests with all-zero pages. +SHOW block_size \gset +SELECT gin_leafpage_items(decode(repeat('00', :block_size), 'hex')); +SELECT gin_metapage_info(decode(repeat('00', :block_size), 'hex')); +SELECT gin_page_opaque_info(decode(repeat('00', :block_size), 'hex')); + DROP TABLE test1; diff --git a/contrib/pageinspect/sql/gist.sql b/contrib/pageinspect/sql/gist.sql index e76f6fa8d1..1edf2b307f 100644 --- a/contrib/pageinspect/sql/gist.sql +++ b/contrib/pageinspect/sql/gist.sql @@ -44,4 +44,10 @@ SELECT gist_page_items_bytea(get_raw_page('test_gist', 0)); SELECT gist_page_items_bytea(get_raw_page('test_gist_btree', 0)); \set VERBOSITY default +-- Tests with all-zero pages. +SHOW block_size \gset +SELECT gist_page_items_bytea(decode(repeat('00', :block_size), 'hex')); +SELECT gist_page_items(decode(repeat('00', :block_size), 'hex'), 'test_gist_idx'::regclass); +SELECT gist_page_opaque_info(decode(repeat('00', :block_size), 'hex')); + DROP TABLE test_gist; diff --git a/contrib/pageinspect/sql/hash.sql b/contrib/pageinspect/sql/hash.sql index ccc984c086..320fb9fa9f 100644 --- a/contrib/pageinspect/sql/hash.sql +++ b/contrib/pageinspect/sql/hash.sql @@ -98,4 +98,11 @@ SELECT hash_page_stats(get_raw_page('test_hash', 0)); SELECT hash_page_type(get_raw_page('test_hash', 0)); \set VERBOSITY default +-- Tests with all-zero pages. +SHOW block_size \gset +SELECT hash_metapage_info(decode(repeat('00', :block_size), 'hex')); +SELECT hash_page_items(decode(repeat('00', :block_size), 'hex')); +SELECT hash_page_stats(decode(repeat('00', :block_size), 'hex')); +SELECT hash_page_type(decode(repeat('00', :block_size), 'hex')); + DROP TABLE test_hash; diff --git a/contrib/pageinspect/sql/page.sql b/contrib/pageinspect/sql/page.sql index 38b1681541..b5c41cc8ac 100644 --- a/contrib/pageinspect/sql/page.sql +++ b/contrib/pageinspect/sql/page.sql @@ -91,3 +91,9 @@ SELECT fsm_page_contents('aaa'::bytea); SELECT page_checksum('bbb'::bytea, 0); SELECT page_header('ccc'::bytea); \set VERBOSITY default + +-- Tests with all-zero pages. +SHOW block_size \gset +SELECT fsm_page_contents(decode(repeat('00', :block_size), 'hex')); +SELECT page_header(decode(repeat('00', :block_size), 'hex')); +SELECT page_checksum(decode(repeat('00', :block_size), 'hex'), 1); From fcdb35c32ac70a113c134a66daf9ba28523ff32b Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 14 Apr 2022 08:57:09 -0400 Subject: [PATCH 520/772] Fix transformJsonBehavior Commit 1a36bc9dba8 conained some logic that was a little opaque and could have involved a NULL dereference, as complained about by Coverity. Make the logic more transparent and in doing so avoid the NULL dereference. --- src/backend/parser/parse_expr.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 3cbd516152..2f8c5e63fe 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -4072,13 +4072,15 @@ static JsonBehavior * transformJsonBehavior(ParseState *pstate, JsonBehavior *behavior, JsonBehaviorType default_behavior) { - JsonBehaviorType behavior_type; - Node *default_expr; - - behavior_type = behavior ? behavior->btype : default_behavior; - default_expr = behavior_type != JSON_BEHAVIOR_DEFAULT ? NULL : - transformExprRecurse(pstate, behavior->default_expr); + JsonBehaviorType behavior_type = default_behavior; + Node *default_expr = NULL; + if (behavior) + { + behavior_type = behavior->btype; + if (behavior_type == JSON_BEHAVIOR_DEFAULT) + default_expr = transformExprRecurse(pstate, behavior->default_expr); + } return makeJsonBehavior(behavior_type, default_expr); } From 4cd8717af3f0345c758d46fea06fb390b4d593f2 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 14 Apr 2022 10:26:29 -0400 Subject: [PATCH 521/772] Improve a couple of sql/json error messages Fix the grammar in two, and add a hint to one. --- src/backend/parser/parse_expr.c | 5 +++-- src/test/regress/expected/json_sqljson.out | 11 +++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 2f8c5e63fe..5fc0b1763c 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -4456,7 +4456,7 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func) if (jsexpr->returning->typid != JSONBOID) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("JSON_TABLE() is not yet implemented for json type"), + errmsg("JSON_TABLE() is not yet implemented for the json type"), errhint("Try casting the argument to jsonb"), parser_errposition(pstate, func->location))); @@ -4466,7 +4466,8 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func) if (exprType(contextItemExpr) != JSONBOID) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("%s() is not yet implemented for json type", func_name), + errmsg("%s() is not yet implemented for the json type", func_name), + errhint("Try casting the argument to jsonb"), parser_errposition(pstate, func->location))); return (Node *) jsexpr; diff --git a/src/test/regress/expected/json_sqljson.out b/src/test/regress/expected/json_sqljson.out index 5c4dfa5f7c..995f267404 100644 --- a/src/test/regress/expected/json_sqljson.out +++ b/src/test/regress/expected/json_sqljson.out @@ -1,21 +1,24 @@ -- JSON_EXISTS SELECT JSON_EXISTS(NULL FORMAT JSON, '$'); -ERROR: JSON_EXISTS() is not yet implemented for json type +ERROR: JSON_EXISTS() is not yet implemented for the json type LINE 1: SELECT JSON_EXISTS(NULL FORMAT JSON, '$'); ^ +HINT: Try casting the argument to jsonb -- JSON_VALUE SELECT JSON_VALUE(NULL FORMAT JSON, '$'); -ERROR: JSON_VALUE() is not yet implemented for json type +ERROR: JSON_VALUE() is not yet implemented for the json type LINE 1: SELECT JSON_VALUE(NULL FORMAT JSON, '$'); ^ +HINT: Try casting the argument to jsonb -- JSON_QUERY SELECT JSON_QUERY(NULL FORMAT JSON, '$'); -ERROR: JSON_QUERY() is not yet implemented for json type +ERROR: JSON_QUERY() is not yet implemented for the json type LINE 1: SELECT JSON_QUERY(NULL FORMAT JSON, '$'); ^ +HINT: Try casting the argument to jsonb -- JSON_TABLE SELECT * FROM JSON_TABLE(NULL FORMAT JSON, '$' COLUMNS (foo text)); -ERROR: JSON_TABLE() is not yet implemented for json type +ERROR: JSON_TABLE() is not yet implemented for the json type LINE 1: SELECT * FROM JSON_TABLE(NULL FORMAT JSON, '$' COLUMNS (foo ... ^ HINT: Try casting the argument to jsonb From 5bb2b6abc8d6cf120a814317816e4384bcbb9c1e Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 14 Apr 2022 12:14:01 -0400 Subject: [PATCH 522/772] Temporarily add some probes of tenk1's relallvisible in create_index.sql. This is to gather some more evidence about why buildfarm member wrasse is failing. We should revert it (or at least scale it way back) once that's resolved. Discussion: https://postgr.es/m/1346227.1649887693@sss.pgh.pa.us --- src/test/regress/expected/create_index.out | 49 ++++++++++++++++++++++ src/test/regress/sql/create_index.sql | 22 ++++++++++ 2 files changed, 71 insertions(+) diff --git a/src/test/regress/expected/create_index.out b/src/test/regress/expected/create_index.out index d55aec3a1d..2d7a5401d7 100644 --- a/src/test/regress/expected/create_index.out +++ b/src/test/regress/expected/create_index.out @@ -17,10 +17,45 @@ LINE 1: CREATE INDEX IF NOT EXISTS ON onek USING btree(unique1 int4_... CREATE INDEX onek_unique2 ON onek USING btree(unique2 int4_ops); CREATE INDEX onek_hundred ON onek USING btree(hundred int4_ops); CREATE INDEX onek_stringu1 ON onek USING btree(stringu1 name_ops); +select relallvisible::float8/relpages as visfrac +from pg_class where relname = 'tenk1'; + visfrac +--------- + 1 +(1 row) + CREATE INDEX tenk1_unique1 ON tenk1 USING btree(unique1 int4_ops); +select relallvisible::float8/relpages as visfrac +from pg_class where relname = 'tenk1'; + visfrac +--------- + 1 +(1 row) + CREATE INDEX tenk1_unique2 ON tenk1 USING btree(unique2 int4_ops); +select relallvisible::float8/relpages as visfrac +from pg_class where relname = 'tenk1'; + visfrac +--------- + 1 +(1 row) + CREATE INDEX tenk1_hundred ON tenk1 USING btree(hundred int4_ops); +select relallvisible::float8/relpages as visfrac +from pg_class where relname = 'tenk1'; + visfrac +--------- + 1 +(1 row) + CREATE INDEX tenk1_thous_tenthous ON tenk1 (thousand, tenthous); +select relallvisible::float8/relpages as visfrac +from pg_class where relname = 'tenk1'; + visfrac +--------- + 1 +(1 row) + CREATE INDEX tenk2_unique1 ON tenk2 USING btree(unique1 int4_ops); CREATE INDEX tenk2_unique2 ON tenk2 USING btree(unique2 int4_ops); CREATE INDEX tenk2_hundred ON tenk2 USING btree(hundred int4_ops); @@ -1216,6 +1251,13 @@ DROP TABLE unlogged_hash_table; -- maintenance_work_mem setting and fillfactor: SET maintenance_work_mem = '1MB'; CREATE INDEX hash_tuplesort_idx ON tenk1 USING hash (stringu1 name_ops) WITH (fillfactor = 10); +select relallvisible::float8/relpages as visfrac +from pg_class where relname = 'tenk1'; + visfrac +--------- + 1 +(1 row) + EXPLAIN (COSTS OFF) SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; QUERY PLAN @@ -1903,6 +1945,13 @@ SELECT count(*) FROM dupindexcols 97 (1 row) +select relallvisible::float8/relpages as visfrac +from pg_class where relname = 'tenk1'; + visfrac +--------- + 1 +(1 row) + -- -- Check ordering of =ANY indexqual results (bug in 9.2.0) -- diff --git a/src/test/regress/sql/create_index.sql b/src/test/regress/sql/create_index.sql index d8fded3d93..db29687752 100644 --- a/src/test/regress/sql/create_index.sql +++ b/src/test/regress/sql/create_index.sql @@ -21,14 +21,29 @@ CREATE INDEX onek_hundred ON onek USING btree(hundred int4_ops); CREATE INDEX onek_stringu1 ON onek USING btree(stringu1 name_ops); +select relallvisible::float8/relpages as visfrac +from pg_class where relname = 'tenk1'; + CREATE INDEX tenk1_unique1 ON tenk1 USING btree(unique1 int4_ops); +select relallvisible::float8/relpages as visfrac +from pg_class where relname = 'tenk1'; + CREATE INDEX tenk1_unique2 ON tenk1 USING btree(unique2 int4_ops); +select relallvisible::float8/relpages as visfrac +from pg_class where relname = 'tenk1'; + CREATE INDEX tenk1_hundred ON tenk1 USING btree(hundred int4_ops); +select relallvisible::float8/relpages as visfrac +from pg_class where relname = 'tenk1'; + CREATE INDEX tenk1_thous_tenthous ON tenk1 (thousand, tenthous); +select relallvisible::float8/relpages as visfrac +from pg_class where relname = 'tenk1'; + CREATE INDEX tenk2_unique1 ON tenk2 USING btree(unique1 int4_ops); CREATE INDEX tenk2_unique2 ON tenk2 USING btree(unique2 int4_ops); @@ -369,6 +384,10 @@ DROP TABLE unlogged_hash_table; -- maintenance_work_mem setting and fillfactor: SET maintenance_work_mem = '1MB'; CREATE INDEX hash_tuplesort_idx ON tenk1 USING hash (stringu1 name_ops) WITH (fillfactor = 10); + +select relallvisible::float8/relpages as visfrac +from pg_class where relname = 'tenk1'; + EXPLAIN (COSTS OFF) SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; @@ -746,6 +765,9 @@ EXPLAIN (COSTS OFF) SELECT count(*) FROM dupindexcols WHERE f1 BETWEEN 'WA' AND 'ZZZ' and id < 1000 and f1 ~<~ 'YX'; +select relallvisible::float8/relpages as visfrac +from pg_class where relname = 'tenk1'; + -- -- Check ordering of =ANY indexqual results (bug in 9.2.0) -- From 275e719d910459db747346a51d56185e2440763b Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 14 Apr 2022 21:52:20 +0200 Subject: [PATCH 523/772] Reword text on ROW SHARE lock as acquired by SELECT FOR It was missing lock levels FOR KEY SHARE and FOR NO KEY EXCLUSIVE; but also SELECT FOR UPDATE is not a command separate from SELECT, as the original text implied. It is clearer to state that FOR is an option of regular SELECT. Per suggestion from Joey Bodoia Reviewed-by: Joey Bodoia (offlist) Reviewed-by: Erikjan Rijkers Discussion: https://postgr.es/m/164908765512.682.17348032020747341013@wrigleys.postgresql.org --- doc/src/sgml/mvcc.sgml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/src/sgml/mvcc.sgml b/doc/src/sgml/mvcc.sgml index 905460723c..341fea524a 100644 --- a/doc/src/sgml/mvcc.sgml +++ b/doc/src/sgml/mvcc.sgml @@ -932,12 +932,14 @@ ERROR: could not serialize access due to read/write dependencies among transact - The SELECT FOR UPDATE and - SELECT FOR SHARE commands acquire a - lock of this mode on the target table(s) (in addition to - ACCESS SHARE locks on any other tables - that are referenced but not selected - ). + The SELECT command acquires a lock of this mode + on all tables on which one of the , + , + , or + options is specified + (in addition to ACCESS SHARE locks on any other + tables that are referenced without any explicit + locking option). From 3f19e176ae0f55a653d62e1504dbe5ad8c1006a0 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 14 Apr 2022 22:11:06 +0200 Subject: [PATCH 524/772] Have CLUSTER ignore partitions not owned by caller If a partitioned table has partitions owned by roles other than the owner of the partitioned table, don't include them in the to-be- clustered list. This is similar to what VACUUM FULL does (except we do it sooner, because there is no reason to postpone it). Add a simple test to verify that only owned partitions are clustered. While at it, change memory context switch-and-back to occur once per partition instead of outside of the loop. Author: Justin Pryzby Reviewed-by: Zhihong Yu Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/20220411140609.GF26620@telsasoft.com --- src/backend/commands/cluster.c | 19 ++++++++++++------- src/test/regress/expected/cluster.out | 25 +++++++++++++++++++++++++ src/test/regress/sql/cluster.sql | 19 +++++++++++++++++++ 3 files changed, 56 insertions(+), 7 deletions(-) diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 0f0a6e9f01..d8a6d43d95 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -1647,10 +1647,8 @@ get_tables_to_cluster(MemoryContext cluster_context) * Given an index on a partitioned table, return a list of RelToCluster for * all the children leaves tables/indexes. * - * Caller must hold lock on the table containing the index. - * * Like expand_vacuum_rel, but here caller must hold AccessExclusiveLock - * on the table already. + * on the table containing the index. */ static List * get_tables_to_cluster_partitioned(MemoryContext cluster_context, Oid indexOid) @@ -1663,9 +1661,6 @@ get_tables_to_cluster_partitioned(MemoryContext cluster_context, Oid indexOid) /* Do not lock the children until they're processed */ inhoids = find_all_inheritors(indexOid, NoLock, NULL); - /* Use a permanent memory context for the result list */ - old_context = MemoryContextSwitchTo(cluster_context); - foreach(lc, inhoids) { Oid indexrelid = lfirst_oid(lc); @@ -1676,12 +1671,22 @@ get_tables_to_cluster_partitioned(MemoryContext cluster_context, Oid indexOid) if (get_rel_relkind(indexrelid) != RELKIND_INDEX) continue; + /* Silently skip partitions which the user has no access to. */ + if (!pg_class_ownercheck(relid, GetUserId()) && + (!pg_database_ownercheck(MyDatabaseId, GetUserId()) || + IsSharedRelation(relid))) + continue; + + /* Use a permanent memory context for the result list */ + old_context = MemoryContextSwitchTo(cluster_context); + rtc = (RelToCluster *) palloc(sizeof(RelToCluster)); rtc->tableOid = relid; rtc->indexOid = indexrelid; rtcs = lappend(rtcs, rtc); + + MemoryContextSwitchTo(old_context); } - MemoryContextSwitchTo(old_context); return rtcs; } diff --git a/src/test/regress/expected/cluster.out b/src/test/regress/expected/cluster.out index 953818c74e..6c8c4c929a 100644 --- a/src/test/regress/expected/cluster.out +++ b/src/test/regress/expected/cluster.out @@ -493,6 +493,31 @@ ERROR: cannot mark index clustered in partitioned table ALTER TABLE clstrpart CLUSTER ON clstrpart_idx; ERROR: cannot mark index clustered in partitioned table DROP TABLE clstrpart; +-- Ownership of partitions is checked +CREATE TABLE ptnowner(i int unique) PARTITION BY LIST (i); +CREATE INDEX ptnowner_i_idx ON ptnowner(i); +CREATE TABLE ptnowner1 PARTITION OF ptnowner FOR VALUES IN (1); +CREATE ROLE regress_ptnowner; +CREATE TABLE ptnowner2 PARTITION OF ptnowner FOR VALUES IN (2); +ALTER TABLE ptnowner1 OWNER TO regress_ptnowner; +ALTER TABLE ptnowner OWNER TO regress_ptnowner; +CREATE TEMP TABLE ptnowner_oldnodes AS + SELECT oid, relname, relfilenode FROM pg_partition_tree('ptnowner') AS tree + JOIN pg_class AS c ON c.oid=tree.relid; +SET SESSION AUTHORIZATION regress_ptnowner; +CLUSTER ptnowner USING ptnowner_i_idx; +RESET SESSION AUTHORIZATION; +SELECT a.relname, a.relfilenode=b.relfilenode FROM pg_class a + JOIN ptnowner_oldnodes b USING (oid) ORDER BY a.relname COLLATE "C"; + relname | ?column? +-----------+---------- + ptnowner | t + ptnowner1 | f + ptnowner2 | t +(3 rows) + +DROP TABLE ptnowner; +DROP ROLE regress_ptnowner; -- Test CLUSTER with external tuplesorting create table clstr_4 as select * from tenk1; create index cluster_sort on clstr_4 (hundred, thousand, tenthous); diff --git a/src/test/regress/sql/cluster.sql b/src/test/regress/sql/cluster.sql index 5601684ee3..e758088ef6 100644 --- a/src/test/regress/sql/cluster.sql +++ b/src/test/regress/sql/cluster.sql @@ -229,6 +229,25 @@ ALTER TABLE clstrpart SET WITHOUT CLUSTER; ALTER TABLE clstrpart CLUSTER ON clstrpart_idx; DROP TABLE clstrpart; +-- Ownership of partitions is checked +CREATE TABLE ptnowner(i int unique) PARTITION BY LIST (i); +CREATE INDEX ptnowner_i_idx ON ptnowner(i); +CREATE TABLE ptnowner1 PARTITION OF ptnowner FOR VALUES IN (1); +CREATE ROLE regress_ptnowner; +CREATE TABLE ptnowner2 PARTITION OF ptnowner FOR VALUES IN (2); +ALTER TABLE ptnowner1 OWNER TO regress_ptnowner; +ALTER TABLE ptnowner OWNER TO regress_ptnowner; +CREATE TEMP TABLE ptnowner_oldnodes AS + SELECT oid, relname, relfilenode FROM pg_partition_tree('ptnowner') AS tree + JOIN pg_class AS c ON c.oid=tree.relid; +SET SESSION AUTHORIZATION regress_ptnowner; +CLUSTER ptnowner USING ptnowner_i_idx; +RESET SESSION AUTHORIZATION; +SELECT a.relname, a.relfilenode=b.relfilenode FROM pg_class a + JOIN ptnowner_oldnodes b USING (oid) ORDER BY a.relname COLLATE "C"; +DROP TABLE ptnowner; +DROP ROLE regress_ptnowner; + -- Test CLUSTER with external tuplesorting create table clstr_4 as select * from tenk1; From 5cd1c40b3ce9600f129fd1fea9850e1affaf31d5 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 14 Apr 2022 17:40:25 -0700 Subject: [PATCH 525/772] pgstat: set timestamps of fixed-numbered stats after a crash. When not loading stats at startup (i.e. pgstat_discard_stats() getting called), reset timestamps of fixed numbered stats would be left at 0. Oversight in 5891c7a8ed8. Instead use pgstat_reset_after_failure() and add tests verifying that fixed-numbered reset timestamps are set appropriately. Reported-By: "David G. Johnston" Discussion: https://postgr.es/m/CAKFQuwamFuaQHKdhcMt4Gbw5+Hca2UE741B8gOOXoA=TtAd2Yw@mail.gmail.com --- src/backend/utils/activity/pgstat.c | 22 ++++++++++++++-------- src/test/recovery/t/029_stats_restart.pl | 10 ++++++++++ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index ea1cb8d1e3..f658f8f198 100644 --- a/src/backend/utils/activity/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -166,7 +166,7 @@ typedef struct PgStat_SnapshotEntry static void pgstat_write_statsfile(void); static void pgstat_read_statsfile(void); -static void pgstat_reset_after_failure(TimestampTz ts); +static void pgstat_reset_after_failure(void); static bool pgstat_flush_pending_entries(bool nowait); @@ -427,6 +427,12 @@ pgstat_discard_stats(void) errmsg("unlinked permanent statistics file \"%s\"", PGSTAT_STAT_PERMANENT_FILENAME))); } + + /* + * Reset stats contents. This will set reset timestamps of fixed-numbered + * stats to the current time (no variable stats exist). + */ + pgstat_reset_after_failure(); } /* @@ -1422,7 +1428,6 @@ pgstat_read_statsfile(void) bool found; const char *statfile = PGSTAT_STAT_PERMANENT_FILENAME; PgStat_ShmemControl *shmem = pgStatLocal.shmem; - TimestampTz ts = GetCurrentTimestamp(); /* shouldn't be called from postmaster */ Assert(IsUnderPostmaster || !IsPostmasterEnvironment); @@ -1445,7 +1450,7 @@ pgstat_read_statsfile(void) (errcode_for_file_access(), errmsg("could not open statistics file \"%s\": %m", statfile))); - pgstat_reset_after_failure(ts); + pgstat_reset_after_failure(); return; } @@ -1597,19 +1602,20 @@ pgstat_read_statsfile(void) ereport(LOG, (errmsg("corrupted statistics file \"%s\"", statfile))); - /* Set the current timestamp as reset timestamp */ - pgstat_reset_after_failure(ts); + pgstat_reset_after_failure(); goto done; } /* - * Helper to reset / drop stats after restoring stats from disk failed, - * potentially after already loading parts. + * Helper to reset / drop stats after a crash or after restoring stats from + * disk failed, potentially after already loading parts. */ static void -pgstat_reset_after_failure(TimestampTz ts) +pgstat_reset_after_failure(void) { + TimestampTz ts = GetCurrentTimestamp(); + /* reset fixed-numbered stats */ for (int kind = PGSTAT_KIND_FIRST_VALID; kind <= PGSTAT_KIND_LAST; kind++) { diff --git a/src/test/recovery/t/029_stats_restart.pl b/src/test/recovery/t/029_stats_restart.pl index d3108127ef..e0478f8af8 100644 --- a/src/test/recovery/t/029_stats_restart.pl +++ b/src/test/recovery/t/029_stats_restart.pl @@ -250,6 +250,16 @@ $wal_restart2->{reset}, "$sect: newer stats_reset"); +$node->stop('immediate'); +$node->start; + +$sect = "post immediate restart"; +my $wal_restart_immediate = wal_stats(); + +cmp_ok( + $wal_reset_restart->{reset}, 'lt', + $wal_restart_immediate->{reset}, + "$sect: reset timestamp is new"); $node->stop; done_testing(); From f7a605f636d62935b80f9905575d40bc4eeca5ae Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Fri, 15 Apr 2022 07:47:12 -0400 Subject: [PATCH 526/772] Small cleanups in SQL/JSON code These are to keep Coverity happy. In one case remove a redundant NULL check, and in another explicitly ignore a function result that is already known. --- src/backend/parser/parse_expr.c | 2 +- src/backend/utils/adt/jsonb.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 5fc0b1763c..33eb19a33f 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -3569,7 +3569,7 @@ coerceJsonFuncExpr(ParseState *pstate, Node *expr, location = exprLocation(expr); if (location < 0) - location = returning ? returning->format->location : -1; + location = returning->format->location; /* special case for RETURNING bytea FORMAT json */ if (returning->format->format_type == JS_FORMAT_JSON && diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c index 56c588bbab..26d81366c9 100644 --- a/src/backend/utils/adt/jsonb.c +++ b/src/backend/utils/adt/jsonb.c @@ -2264,7 +2264,7 @@ JsonbUnquote(Jsonb *jb) { JsonbValue v; - JsonbExtractScalar(&jb->root, &v); + (void) JsonbExtractScalar(&jb->root, &v); if (v.type == jbvString) return pnstrdup(v.val.string.val, v.val.string.len); From 91998539b227dfc6dd091714da7d106f2c95a321 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 15 Apr 2022 13:29:39 -0400 Subject: [PATCH 527/772] Revert "Temporarily add some probes of tenk1's relallvisible in create_index.sql." This reverts commit 5bb2b6abc8d6cf120a814317816e4384bcbb9c1e. Not needed anymore. --- src/test/regress/expected/create_index.out | 49 ---------------------- src/test/regress/sql/create_index.sql | 22 ---------- 2 files changed, 71 deletions(-) diff --git a/src/test/regress/expected/create_index.out b/src/test/regress/expected/create_index.out index 2d7a5401d7..d55aec3a1d 100644 --- a/src/test/regress/expected/create_index.out +++ b/src/test/regress/expected/create_index.out @@ -17,45 +17,10 @@ LINE 1: CREATE INDEX IF NOT EXISTS ON onek USING btree(unique1 int4_... CREATE INDEX onek_unique2 ON onek USING btree(unique2 int4_ops); CREATE INDEX onek_hundred ON onek USING btree(hundred int4_ops); CREATE INDEX onek_stringu1 ON onek USING btree(stringu1 name_ops); -select relallvisible::float8/relpages as visfrac -from pg_class where relname = 'tenk1'; - visfrac ---------- - 1 -(1 row) - CREATE INDEX tenk1_unique1 ON tenk1 USING btree(unique1 int4_ops); -select relallvisible::float8/relpages as visfrac -from pg_class where relname = 'tenk1'; - visfrac ---------- - 1 -(1 row) - CREATE INDEX tenk1_unique2 ON tenk1 USING btree(unique2 int4_ops); -select relallvisible::float8/relpages as visfrac -from pg_class where relname = 'tenk1'; - visfrac ---------- - 1 -(1 row) - CREATE INDEX tenk1_hundred ON tenk1 USING btree(hundred int4_ops); -select relallvisible::float8/relpages as visfrac -from pg_class where relname = 'tenk1'; - visfrac ---------- - 1 -(1 row) - CREATE INDEX tenk1_thous_tenthous ON tenk1 (thousand, tenthous); -select relallvisible::float8/relpages as visfrac -from pg_class where relname = 'tenk1'; - visfrac ---------- - 1 -(1 row) - CREATE INDEX tenk2_unique1 ON tenk2 USING btree(unique1 int4_ops); CREATE INDEX tenk2_unique2 ON tenk2 USING btree(unique2 int4_ops); CREATE INDEX tenk2_hundred ON tenk2 USING btree(hundred int4_ops); @@ -1251,13 +1216,6 @@ DROP TABLE unlogged_hash_table; -- maintenance_work_mem setting and fillfactor: SET maintenance_work_mem = '1MB'; CREATE INDEX hash_tuplesort_idx ON tenk1 USING hash (stringu1 name_ops) WITH (fillfactor = 10); -select relallvisible::float8/relpages as visfrac -from pg_class where relname = 'tenk1'; - visfrac ---------- - 1 -(1 row) - EXPLAIN (COSTS OFF) SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; QUERY PLAN @@ -1945,13 +1903,6 @@ SELECT count(*) FROM dupindexcols 97 (1 row) -select relallvisible::float8/relpages as visfrac -from pg_class where relname = 'tenk1'; - visfrac ---------- - 1 -(1 row) - -- -- Check ordering of =ANY indexqual results (bug in 9.2.0) -- diff --git a/src/test/regress/sql/create_index.sql b/src/test/regress/sql/create_index.sql index db29687752..d8fded3d93 100644 --- a/src/test/regress/sql/create_index.sql +++ b/src/test/regress/sql/create_index.sql @@ -21,29 +21,14 @@ CREATE INDEX onek_hundred ON onek USING btree(hundred int4_ops); CREATE INDEX onek_stringu1 ON onek USING btree(stringu1 name_ops); -select relallvisible::float8/relpages as visfrac -from pg_class where relname = 'tenk1'; - CREATE INDEX tenk1_unique1 ON tenk1 USING btree(unique1 int4_ops); -select relallvisible::float8/relpages as visfrac -from pg_class where relname = 'tenk1'; - CREATE INDEX tenk1_unique2 ON tenk1 USING btree(unique2 int4_ops); -select relallvisible::float8/relpages as visfrac -from pg_class where relname = 'tenk1'; - CREATE INDEX tenk1_hundred ON tenk1 USING btree(hundred int4_ops); -select relallvisible::float8/relpages as visfrac -from pg_class where relname = 'tenk1'; - CREATE INDEX tenk1_thous_tenthous ON tenk1 (thousand, tenthous); -select relallvisible::float8/relpages as visfrac -from pg_class where relname = 'tenk1'; - CREATE INDEX tenk2_unique1 ON tenk2 USING btree(unique1 int4_ops); CREATE INDEX tenk2_unique2 ON tenk2 USING btree(unique2 int4_ops); @@ -384,10 +369,6 @@ DROP TABLE unlogged_hash_table; -- maintenance_work_mem setting and fillfactor: SET maintenance_work_mem = '1MB'; CREATE INDEX hash_tuplesort_idx ON tenk1 USING hash (stringu1 name_ops) WITH (fillfactor = 10); - -select relallvisible::float8/relpages as visfrac -from pg_class where relname = 'tenk1'; - EXPLAIN (COSTS OFF) SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; @@ -765,9 +746,6 @@ EXPLAIN (COSTS OFF) SELECT count(*) FROM dupindexcols WHERE f1 BETWEEN 'WA' AND 'ZZZ' and id < 1000 and f1 ~<~ 'YX'; -select relallvisible::float8/relpages as visfrac -from pg_class where relname = 'tenk1'; - -- -- Check ordering of =ANY indexqual results (bug in 9.2.0) -- From 357c8455e64915f2d8f50ca5853eb91b74470d96 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Fri, 15 Apr 2022 13:21:43 -0700 Subject: [PATCH 528/772] Adjust VACUUM's removable cutoff log message. The age of OldestXmin (a.k.a. "removable cutoff") when VACUUM ends often indicates the approximate number of XIDs consumed while VACUUM ran. However, there is at least one important exception: the cutoff could be held back by a snapshot that was acquired before our VACUUM even began. Successive VACUUM operations may even use exactly the same old cutoff in extreme cases involving long held snapshots. The log messages that described how removable cutoff aged (which were added by commit 872770fd) created the impression that we were reporting on how VACUUM's usable cutoff advanced while VACUUM ran, which was misleading in these extreme cases. Fix by using a more general wording. Per gripe from Tom Lane. In passing, relocate related instrumentation code for clarity. Author: Peter Geoghegan Discussion: https://postgr.es/m/1643035.1650035653@sss.pgh.pa.us --- src/backend/access/heap/vacuumlazy.c | 34 ++++++++++++---------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 788db569b2..3259ebd98a 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -633,30 +633,19 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, TimestampDifferenceExceeds(starttime, endtime, params->log_min_duration)) { - long secs; - int usecs; + long secs_dur; + int usecs_dur; WalUsage walusage; - double read_rate, - write_rate; StringInfoData buf; char *msgfmt; int32 diff; + double read_rate = 0, + write_rate = 0; - TimestampDifference(starttime, endtime, &secs, &usecs); - + TimestampDifference(starttime, endtime, &secs_dur, &usecs_dur); memset(&walusage, 0, sizeof(WalUsage)); WalUsageAccumDiff(&walusage, &pgWalUsage, &walusage_start); - read_rate = 0; - write_rate = 0; - if ((secs > 0) || (usecs > 0)) - { - read_rate = (double) BLCKSZ * VacuumPageMiss / (1024 * 1024) / - (secs + usecs / 1000000.0); - write_rate = (double) BLCKSZ * VacuumPageDirty / (1024 * 1024) / - (secs + usecs / 1000000.0); - } - initStringInfo(&buf); if (verbose) { @@ -710,20 +699,20 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, vacrel->missed_dead_pages); diff = (int32) (ReadNextTransactionId() - OldestXmin); appendStringInfo(&buf, - _("removable cutoff: %u, older by %d xids when operation ended\n"), + _("removable cutoff: %u, which was %d XIDs old when operation ended\n"), OldestXmin, diff); if (frozenxid_updated) { diff = (int32) (vacrel->NewRelfrozenXid - vacrel->relfrozenxid); appendStringInfo(&buf, - _("new relfrozenxid: %u, which is %d xids ahead of previous value\n"), + _("new relfrozenxid: %u, which is %d XIDs ahead of previous value\n"), vacrel->NewRelfrozenXid, diff); } if (minmulti_updated) { diff = (int32) (vacrel->NewRelminMxid - vacrel->relminmxid); appendStringInfo(&buf, - _("new relminmxid: %u, which is %d mxids ahead of previous value\n"), + _("new relminmxid: %u, which is %d MXIDs ahead of previous value\n"), vacrel->NewRelminMxid, diff); } if (orig_rel_pages > 0) @@ -774,6 +763,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, appendStringInfo(&buf, _("I/O timings: read: %.3f ms, write: %.3f ms\n"), read_ms, write_ms); } + if (secs_dur > 0 || usecs_dur > 0) + { + read_rate = (double) BLCKSZ * VacuumPageMiss / (1024 * 1024) / + (secs_dur + usecs_dur / 1000000.0); + write_rate = (double) BLCKSZ * VacuumPageDirty / (1024 * 1024) / + (secs_dur + usecs_dur / 1000000.0); + } appendStringInfo(&buf, _("avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n"), read_rate, write_rate); appendStringInfo(&buf, From bdb71dbe80d0560f84255e05b73f449e11007325 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Fri, 15 Apr 2022 14:20:56 -0700 Subject: [PATCH 529/772] VACUUM VERBOSE: Show dead items for an empty table. Be consistent about the lines that VACUUM VERBOSE outputs by including an "index scan not needed: " line for completely empty tables. This makes the output more readable, especially with multiple distinct VACUUM operations processed by the same VACUUM command. It's also more consistent; even empty tables can use the failsafe, which wasn't reported in the standard way until now. Follow-up to commit 6e20f460, which taught VACUUM VERBOSE to be more consistent about reporting on scanned pages with empty tables. --- src/backend/access/heap/vacuumlazy.c | 38 +++++++++++++--------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 3259ebd98a..8abb6dca41 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -715,31 +715,29 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, _("new relminmxid: %u, which is %d MXIDs ahead of previous value\n"), vacrel->NewRelminMxid, diff); } - if (orig_rel_pages > 0) + if (vacrel->do_index_vacuuming) { - if (vacrel->do_index_vacuuming) - { - if (vacrel->nindexes == 0 || vacrel->num_index_scans == 0) - appendStringInfoString(&buf, _("index scan not needed: ")); - else - appendStringInfoString(&buf, _("index scan needed: ")); + if (vacrel->nindexes == 0 || vacrel->num_index_scans == 0) + appendStringInfoString(&buf, _("index scan not needed: ")); + else + appendStringInfoString(&buf, _("index scan needed: ")); - msgfmt = _("%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n"); - } + msgfmt = _("%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n"); + } + else + { + if (!vacrel->failsafe_active) + appendStringInfoString(&buf, _("index scan bypassed: ")); else - { - if (!vacrel->failsafe_active) - appendStringInfoString(&buf, _("index scan bypassed: ")); - else - appendStringInfoString(&buf, _("index scan bypassed by failsafe: ")); + appendStringInfoString(&buf, _("index scan bypassed by failsafe: ")); - msgfmt = _("%u pages from table (%.2f%% of total) have %lld dead item identifiers\n"); - } - appendStringInfo(&buf, msgfmt, - vacrel->lpdead_item_pages, - 100.0 * vacrel->lpdead_item_pages / orig_rel_pages, - (long long) vacrel->lpdead_items); + msgfmt = _("%u pages from table (%.2f%% of total) have %lld dead item identifiers\n"); } + appendStringInfo(&buf, msgfmt, + vacrel->lpdead_item_pages, + orig_rel_pages == 0 ? 100.0 : + 100.0 * vacrel->lpdead_item_pages / orig_rel_pages, + (long long) vacrel->lpdead_items); for (int i = 0; i < vacrel->nindexes; i++) { IndexBulkDeleteResult *istat = vacrel->indstats[i]; From 6fea65508a1aa6a1caa5f3e7b4d27bcccb0740d8 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 15 Apr 2022 17:50:01 -0400 Subject: [PATCH 530/772] Tighten ComputeXidHorizons' handling of walsenders. ComputeXidHorizons (nee GetOldestXmin) thought that it could identify walsenders by checking for proc->databaseId == 0. Perhaps that was safe when the code was written, but it's been wrong at least since autovacuum was invented. Background processes that aren't connected to any particular database, such as the autovacuum launcher and logical replication launcher, look like that too. This imprecision is harmful because when such a process advertises an xmin, the result is to hold back dead-tuple cleanup in all databases, though it'd be sufficient to hold it back in shared catalogs (which are the only relations such a process can access). Aside from being generally inefficient, this has recently been seen to cause regression test failures in the buildfarm, as a consequence of the logical replication launcher's startup transaction preventing VACUUM from marking pages of a user table as all-visible. We only want that global hold-back effect for the case where a walsender is advertising a hot standby feedback xmin. Therefore, invent a new PGPROC flag that says that a process' xmin should be considered globally, and check that instead of using the incorrect databaseId == 0 test. Currently only a walsender sets that flag, and only if it is not connected to any particular database. (This is for bug-compatibility with the undocumented behavior of the existing code, namely that feedback sent by a client who has connected to a particular database would not be applied globally. I'm not sure this is a great definition; however, such a client is capable of issuing plain SQL commands, and I don't think we want xmins advertised for such commands to be applied globally. Perhaps this could do with refinement later.) While at it, I rewrote the comment in ComputeXidHorizons, and re-ordered the commented-upon if-tests, to make them match up for intelligibility's sake. This is arguably a back-patchable bug fix, but given the lack of complaints I think it prudent to let it age awhile in HEAD first. Discussion: https://postgr.es/m/1346227.1649887693@sss.pgh.pa.us --- src/backend/replication/walsender.c | 15 ++++++++++ src/backend/storage/ipc/procarray.c | 45 ++++++++++++++++++----------- src/include/storage/proc.h | 3 ++ 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index be40261393..63a818140b 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -285,6 +285,21 @@ InitWalSender(void) MarkPostmasterChildWalSender(); SendPostmasterSignal(PMSIGNAL_ADVANCE_STATE_MACHINE); + /* + * If the client didn't specify a database to connect to, show in PGPROC + * that our advertised xmin should affect vacuum horizons in all + * databases. This allows physical replication clients to send hot + * standby feedback that will delay vacuum cleanup in all databases. + */ + if (MyDatabaseId == InvalidOid) + { + Assert(MyProc->xmin == InvalidTransactionId); + LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); + MyProc->statusFlags |= PROC_AFFECTS_ALL_HORIZONS; + ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags; + LWLockRelease(ProcArrayLock); + } + /* Initialize empty timestamp buffer for lag tracking. */ lag_tracker = MemoryContextAllocZero(TopMemoryContext, sizeof(LagTracker)); } diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index f6e98aae29..25c310f675 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -1810,21 +1810,28 @@ ComputeXidHorizons(ComputeXidHorizonsResult *h) TransactionIdOlder(h->shared_oldest_nonremovable, xmin); /* - * Normally queries in other databases are ignored for anything but - * the shared horizon. But in recovery we cannot compute an accurate - * per-database horizon as all xids are managed via the - * KnownAssignedXids machinery. + * Normally sessions in other databases are ignored for anything but + * the shared horizon. * - * Be careful to compute a pessimistic value when MyDatabaseId is not - * set. If this is a backend in the process of starting up, we may not - * use a "too aggressive" horizon (otherwise we could end up using it - * to prune still needed data away). If the current backend never - * connects to a database that is harmless, because - * data_oldest_nonremovable will never be utilized. + * However, include them when MyDatabaseId is not (yet) set. A + * backend in the process of starting up must not compute a "too + * aggressive" horizon, otherwise we could end up using it to prune + * still-needed data away. If the current backend never connects to a + * database this is harmless, because data_oldest_nonremovable will + * never be utilized. + * + * Also, sessions marked with PROC_AFFECTS_ALL_HORIZONS should always + * be included. (This flag is used for hot standby feedback, which + * can't be tied to a specific database.) + * + * Also, while in recovery we cannot compute an accurate per-database + * horizon, as all xids are managed via the KnownAssignedXids + * machinery. */ - if (in_recovery || - MyDatabaseId == InvalidOid || proc->databaseId == MyDatabaseId || - proc->databaseId == 0) /* always include WalSender */ + if (proc->databaseId == MyDatabaseId || + MyDatabaseId == InvalidOid || + (statusFlags & PROC_AFFECTS_ALL_HORIZONS) || + in_recovery) { /* * We can ignore this backend if it's running CREATE INDEX @@ -2681,10 +2688,14 @@ ProcArrayInstallRestoredXmin(TransactionId xmin, PGPROC *proc) /* Install xmin */ MyProc->xmin = TransactionXmin = xmin; - /* Flags being copied must be valid copy-able flags. */ - Assert((proc->statusFlags & (~PROC_COPYABLE_FLAGS)) == 0); - MyProc->statusFlags = proc->statusFlags; - ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags; + /* walsender cheats by passing proc == MyProc, don't check its flags */ + if (proc != MyProc) + { + /* Flags being copied must be valid copy-able flags. */ + Assert((proc->statusFlags & (~PROC_COPYABLE_FLAGS)) == 0); + MyProc->statusFlags = proc->statusFlags; + ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags; + } result = true; } diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h index 809b74db5e..15be21c00a 100644 --- a/src/include/storage/proc.h +++ b/src/include/storage/proc.h @@ -60,6 +60,9 @@ struct XidCache #define PROC_VACUUM_FOR_WRAPAROUND 0x08 /* set by autovac only */ #define PROC_IN_LOGICAL_DECODING 0x10 /* currently doing logical * decoding outside xact */ +#define PROC_AFFECTS_ALL_HORIZONS 0x20 /* this proc's xmin must be + * included in vacuum horizons + * in all databases */ /* flags reset at EOXact */ #define PROC_VACUUM_STATE_MASK \ From 7129a9791eafdd825eae0187b7dd7b99ed48fdc7 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 15 Apr 2022 18:31:01 -0400 Subject: [PATCH 531/772] psql: fix \l display for pre-v15 databases. With a pre-v15 server, show NULL for the "ICU Locale" column, matching what you see in v15 when the database locale isn't ICU. The previous coding incorrectly repeated datcollate here. (There's an unfinished discussion about whether to consolidate these columns in \l output, but in any case we'd want this fix for \l+ output.) Euler Taveira, per report from Christoph Berg Discussion: https://postgr.es/m/YlmIFCqu+TZSW4rB@msg.df7cb.de --- src/bin/psql/describe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 839f1add90..583817b0cc 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -904,7 +904,7 @@ listAllDbs(const char *pattern, bool verbose) gettext_noop("Locale Provider")); else appendPQExpBuffer(&buf, - " d.datcollate as \"%s\",\n" + " NULL as \"%s\",\n" " 'libc' AS \"%s\",\n", gettext_noop("ICU Locale"), gettext_noop("Locale Provider")); From d3609dd2547b3ed807bc3b6dd27a008d65e86668 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Fri, 15 Apr 2022 15:48:39 -0700 Subject: [PATCH 532/772] Fix multi-table VACUUM VERBOSE accounting. Per-backend global variables like VacuumPageHit are initialized once per VACUUM command. This was missed by commit 49c9d9fc, which unified VACUUM VERBOSE and autovacuum logging. As a result of that oversight, incorrect values were shown when multiple relations were processed by a single VACUUM VERBOSE command. Relations that happened to be processed later on would show "buffer usage:" values that incorrectly included buffer accesses made while processing earlier unrelated relations. The same accesses were counted multiple times. To fix, take initial values for the tracker variables at the start of heap_vacuum_rel(), and report delta values later on. --- src/backend/access/heap/vacuumlazy.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 8abb6dca41..7f2e887406 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -325,9 +325,12 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, new_rel_allvisible; PGRUsage ru0; TimestampTz starttime = 0; - PgStat_Counter startreadtime = 0; - PgStat_Counter startwritetime = 0; - WalUsage walusage_start = pgWalUsage; + PgStat_Counter startreadtime = 0, + startwritetime = 0; + WalUsage startwalusage = pgWalUsage; + int64 StartPageHit = VacuumPageHit, + StartPageMiss = VacuumPageMiss, + StartPageDirty = VacuumPageDirty; ErrorContextCallback errcallback; char **indnames = NULL; @@ -639,12 +642,15 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, StringInfoData buf; char *msgfmt; int32 diff; + int64 PageHitOp = VacuumPageHit - StartPageHit, + PageMissOp = VacuumPageMiss - StartPageMiss, + PageDirtyOp = VacuumPageDirty - StartPageDirty; double read_rate = 0, write_rate = 0; TimestampDifference(starttime, endtime, &secs_dur, &usecs_dur); memset(&walusage, 0, sizeof(WalUsage)); - WalUsageAccumDiff(&walusage, &pgWalUsage, &walusage_start); + WalUsageAccumDiff(&walusage, &pgWalUsage, &startwalusage); initStringInfo(&buf); if (verbose) @@ -763,18 +769,18 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, } if (secs_dur > 0 || usecs_dur > 0) { - read_rate = (double) BLCKSZ * VacuumPageMiss / (1024 * 1024) / + read_rate = (double) BLCKSZ * PageMissOp / (1024 * 1024) / (secs_dur + usecs_dur / 1000000.0); - write_rate = (double) BLCKSZ * VacuumPageDirty / (1024 * 1024) / + write_rate = (double) BLCKSZ * PageDirtyOp / (1024 * 1024) / (secs_dur + usecs_dur / 1000000.0); } appendStringInfo(&buf, _("avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n"), read_rate, write_rate); appendStringInfo(&buf, _("buffer usage: %lld hits, %lld misses, %lld dirtied\n"), - (long long) VacuumPageHit, - (long long) VacuumPageMiss, - (long long) VacuumPageDirty); + (long long) PageHitOp, + (long long) PageMissOp, + (long long) PageDirtyOp); appendStringInfo(&buf, _("WAL usage: %lld records, %lld full page images, %llu bytes\n"), (long long) walusage.wal_records, From 5fbb2d8f105efee1d059a7edb86f45e38616d329 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Fri, 15 Apr 2022 23:15:38 -0700 Subject: [PATCH 533/772] Use standard timeout, in 010_pg_basebackup.pl. Per buildfarm member mandrill. The test is new in v15, so no back-patch. --- src/bin/pg_basebackup/t/010_pg_basebackup.pl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 7309ebddea..056fcf3597 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -838,7 +838,8 @@ $node->safe_psql('postgres', q{CREATE TABLE t AS SELECT a FROM generate_series(1,10000) AS a;}); -my $sigchld_bb_timeout = IPC::Run::timer(60); +my $sigchld_bb_timeout = + IPC::Run::timer($PostgreSQL::Test::Utils::timeout_default); my ($sigchld_bb_stdin, $sigchld_bb_stdout, $sigchld_bb_stderr) = ('', '', ''); my $sigchld_bb = IPC::Run::start( [ From 5a892c9b154f513a42c4a42cdfdae524ce33c86a Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sat, 16 Apr 2022 09:05:07 +0200 Subject: [PATCH 534/772] Fix some trailing whitespace in documentation files --- doc/src/sgml/adminpack.sgml | 2 +- doc/src/sgml/custom-rmgr.sgml | 4 ++-- doc/src/sgml/func.sgml | 20 ++++++++++---------- doc/src/sgml/high-availability.sgml | 2 +- doc/src/sgml/pgwalinspect.sgml | 2 +- doc/src/sgml/ref/pgbench.sgml | 2 +- doc/src/sgml/runtime.sgml | 2 +- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/doc/src/sgml/adminpack.sgml b/doc/src/sgml/adminpack.sgml index 5702456cd2..40cab29b24 100644 --- a/doc/src/sgml/adminpack.sgml +++ b/doc/src/sgml/adminpack.sgml @@ -22,7 +22,7 @@ functions in , which provide read-only access.) Only files within the database cluster directory can be accessed, unless the - user is a superuser or given privileges of one of the pg_read_server_files, + user is a superuser or given privileges of one of the pg_read_server_files, or pg_write_server_files roles, as appropriate for the function, but either a relative or absolute path is allowable. diff --git a/doc/src/sgml/custom-rmgr.sgml b/doc/src/sgml/custom-rmgr.sgml index dd917c54b6..acf5077d75 100644 --- a/doc/src/sgml/custom-rmgr.sgml +++ b/doc/src/sgml/custom-rmgr.sgml @@ -55,7 +55,7 @@ typedef struct RmgrData void (*rm_decode) (struct LogicalDecodingContext *ctx, struct XLogRecordBuffer *buf); } RmgrData; - + Then, register your new resource @@ -88,7 +88,7 @@ extern void RegisterCustomRmgr(RmgrId rmid, RmgrData *rmgr); during PostgreSQL startup. - + The extension must remain in shared_preload_libraries as long as any custom WAL records may exist in the system. Otherwise PostgreSQL will not be able to apply or decode diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 93ba39eff1..489184a4f0 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -17758,7 +17758,7 @@ $.* ? (@ like_regex "^\\d+$") Notes Alternatively, you can construct JSON values simply - using PostgreSQL-specific casts to + using PostgreSQL-specific casts to json and jsonb types. @@ -19127,7 +19127,7 @@ FROM my_films; SELECT JSON_QUERY(js, '$.favorites[*].kind' ERROR ON ERROR) FROM my_films; -ERROR: more than one SQL/JSON item +ERROR: more than one SQL/JSON item @@ -19175,7 +19175,7 @@ SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text OMIT QUOTES); expression - IS NOT JSON + IS NOT JSON { VALUE | SCALAR | ARRAY | OBJECT } { WITH | WITHOUT } UNIQUE KEYS @@ -19294,16 +19294,16 @@ SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text OMIT QUOTES); SELECT - js, - js IS JSON "is json", + js, + js IS JSON "is json", js IS NOT JSON "is not json", js IS JSON SCALAR "is scalar", js IS JSON OBJECT "is object", js IS JSON ARRAY "is array" -FROM +FROM (VALUES ('123'), ('"abc"'), ('{"a": "b"}'), ('[1,2]'), ('abc')) foo(js); - js | is json | is not json | is scalar | is object | is array + js | is json | is not json | is scalar | is object | is array ------------+---------+-------------+-----------+-----------|------------- 123 | t | f | t | f | f "abc" | t | f | t | f | f @@ -19704,7 +19704,7 @@ where json_table_column is: - Use CROSS JOIN, so that the output includes + Use CROSS JOIN, so that the output includes a row for every possible combination of rows from the left-hand and the right-hand columns. @@ -19743,7 +19743,7 @@ where json_table_column is: some JSON data about the films and create a view that distributes the film genre, title, and director between separate columns: -SELECT jt.* FROM +SELECT jt.* FROM my_films, JSON_TABLE ( js, '$.favorites[*]' COLUMNS ( id FOR ORDINALITY, @@ -19864,7 +19864,7 @@ JSON_SERIALIZE ( Notes Alternatively, you can construct JSON values simply - using PostgreSQL-specific casts to + using PostgreSQL-specific casts to json and jsonb types. diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml index b0a653373d..db1bde4706 100644 --- a/doc/src/sgml/high-availability.sgml +++ b/doc/src/sgml/high-availability.sgml @@ -548,7 +548,7 @@ protocol to make nodes agree on a serializable transactional order. rollforward will take considerably longer, so that technique only offers a solution for disaster recovery, not high availability. A standby server can also be used for read-only queries, in which case - it is called a hot standby server. See + it is called a hot standby server. See for more information. diff --git a/doc/src/sgml/pgwalinspect.sgml b/doc/src/sgml/pgwalinspect.sgml index 44010a5b0a..c1d4fbc66c 100644 --- a/doc/src/sgml/pgwalinspect.sgml +++ b/doc/src/sgml/pgwalinspect.sgml @@ -150,7 +150,7 @@ postgres=# select start_lsn, end_lsn, prev_lsn, xid, resource_manager, record_ty This function is same as pg_get_wal_records_info() - except that it gets information of all the valid WAL records from + except that it gets information of all the valid WAL records from start_lsn till the end of WAL. diff --git a/doc/src/sgml/ref/pgbench.sgml b/doc/src/sgml/ref/pgbench.sgml index 1a630f020b..387a836287 100644 --- a/doc/src/sgml/ref/pgbench.sgml +++ b/doc/src/sgml/ref/pgbench.sgml @@ -69,7 +69,7 @@ tps = 896.967014 (without initial connection time) The first seven lines report some of the most important parameter settings. The sixth line reports the maximum number of tries for transactions with - serialization or deadlock errors (see + serialization or deadlock errors (see for more information). The eighth line reports the number of transactions completed and intended (the latter being just the product of number of clients diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml index f5f4e3fab5..4465c876b1 100644 --- a/doc/src/sgml/runtime.sgml +++ b/doc/src/sgml/runtime.sgml @@ -2194,7 +2194,7 @@ pg_dumpall -p 5432 | psql -d postgres -p 5433 TLS protocol. SSL protocols are the precursors to TLS protocols, and the term SSL is still used for encrypted connections even though - SSL protocols are no longer supported. + SSL protocols are no longer supported. SSL is used interchangeably with TLS in PostgreSQL. From a17fd67d2f2861ae0ce00d1aeefdf2facc47cd5e Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Sat, 16 Apr 2022 09:35:15 -0400 Subject: [PATCH 535/772] Build libpq test programs under MSVC This allows the newly added TAP tests to run. --- src/tools/msvc/Mkvcbuild.pm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm index 46904fee0e..fc04e1db8e 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -284,6 +284,22 @@ sub mkvcbuild $libpqwalreceiver->AddIncludeDir('src/interfaces/libpq'); $libpqwalreceiver->AddReference($postgres, $libpq); + my $libpq_testclient = + $solution->AddProject('testclient', 'exe', 'misc', + 'src/interfaces/libpq/test'); + $libpq_testclient->AddFile('src/interfaces/libpq/test/testclient.c'); + $libpq_testclient->AddIncludeDir('src/interfaces/libpq'); + $libpq_testclient->AddReference($libpgport, $libpq); + $libpq_testclient->AddLibrary('ws2_32.lib'); + + my $libpq_uri_regress = + $solution->AddProject('uri-regress', 'exe', 'misc', + 'src/interfaces/libpq/test'); + $libpq_uri_regress->AddFile('src/interfaces/libpq/test/uri-regress.c'); + $libpq_uri_regress->AddIncludeDir('src/interfaces/libpq'); + $libpq_uri_regress->AddReference($libpgport, $libpq); + $libpq_uri_regress->AddLibrary('ws2_32.lib'); + my $pgoutput = $solution->AddProject('pgoutput', 'dll', '', 'src/backend/replication/pgoutput'); $pgoutput->AddReference($postgres); From 9f4f0a0dad4c7422a97d94e4051c08ec6d181dd6 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 16 Apr 2022 16:04:50 -0400 Subject: [PATCH 536/772] Fix incorrect logic in HaveRegisteredOrActiveSnapshot(). This function gave the wrong answer when there's more than one RegisteredSnapshots entry, whether or not any of them is the CatalogSnapshot. This leads to assertion failure in some scenarios involving fetching toasted data using a cursor. (As per discussion, I'm dubious that this is the right contract to be enforcing at all; but it surely doesn't help to be enforcing it incorrectly.) Fetching toasted data using a cursor is evidently under-tested, so add a test case too. Per report from Erik Rijkers. This is new code, so no need for back-patch. Discussion: https://postgr.es/m/dc9dd229-ed30-6c62-4c41-d733ffff776b@xs4all.nl --- src/backend/utils/time/snapmgr.c | 6 +++--- src/test/regress/expected/portals.out | 25 +++++++++++++++++++++++++ src/test/regress/sql/portals.sql | 24 ++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c index a0be0c411a..5bc2a15160 100644 --- a/src/backend/utils/time/snapmgr.c +++ b/src/backend/utils/time/snapmgr.c @@ -1646,11 +1646,11 @@ HaveRegisteredOrActiveSnapshot(void) * removed at any time due to invalidation processing. If explicitly * registered more than one snapshot has to be in RegisteredSnapshots. */ - if (pairingheap_is_empty(&RegisteredSnapshots) || - !pairingheap_is_singular(&RegisteredSnapshots)) + if (CatalogSnapshot != NULL && + pairingheap_is_singular(&RegisteredSnapshots)) return false; - return CatalogSnapshot == NULL; + return !pairingheap_is_empty(&RegisteredSnapshots); } diff --git a/src/test/regress/expected/portals.out b/src/test/regress/expected/portals.out index 9da74876e1..f71e0b3d41 100644 --- a/src/test/regress/expected/portals.out +++ b/src/test/regress/expected/portals.out @@ -1536,3 +1536,28 @@ fetch backward all in c2; (3 rows) rollback; +-- Check fetching of toasted datums via cursors. +begin; +-- Other compression algorithms may cause the compressed data to be stored +-- inline. Use pglz to ensure consistent results. +set default_toast_compression = 'pglz'; +create table toasted_data (f1 int[]); +insert into toasted_data + select array_agg(i) from generate_series(12345678, 12345678 + 1000) i; +declare local_portal cursor for select * from toasted_data; +fetch all in local_portal; + f1 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + {12345678,12345679,12345680,12345681,12345682,12345683,12345684,12345685,12345686,12345687,12345688,12345689,12345690,12345691,12345692,12345693,12345694,12345695,12345696,12345697,12345698,12345699,12345700,12345701,12345702,12345703,12345704,12345705,12345706,12345707,12345708,12345709,12345710,12345711,12345712,12345713,12345714,12345715,12345716,12345717,12345718,12345719,12345720,12345721,12345722,12345723,12345724,12345725,12345726,12345727,12345728,12345729,12345730,12345731,12345732,12345733,12345734,12345735,12345736,12345737,12345738,12345739,12345740,12345741,12345742,12345743,12345744,12345745,12345746,12345747,12345748,12345749,12345750,12345751,12345752,12345753,12345754,12345755,12345756,12345757,12345758,12345759,12345760,12345761,12345762,12345763,12345764,12345765,12345766,12345767,12345768,12345769,12345770,12345771,12345772,12345773,12345774,12345775,12345776,12345777,12345778,12345779,12345780,12345781,12345782,12345783,12345784,12345785,12345786,12345787,12345788,12345789,12345790,12345791,12345792,12345793,12345794,12345795,12345796,12345797,12345798,12345799,12345800,12345801,12345802,12345803,12345804,12345805,12345806,12345807,12345808,12345809,12345810,12345811,12345812,12345813,12345814,12345815,12345816,12345817,12345818,12345819,12345820,12345821,12345822,12345823,12345824,12345825,12345826,12345827,12345828,12345829,12345830,12345831,12345832,12345833,12345834,12345835,12345836,12345837,12345838,12345839,12345840,12345841,12345842,12345843,12345844,12345845,12345846,12345847,12345848,12345849,12345850,12345851,12345852,12345853,12345854,12345855,12345856,12345857,12345858,12345859,12345860,12345861,12345862,12345863,12345864,12345865,12345866,12345867,12345868,12345869,12345870,12345871,12345872,12345873,12345874,12345875,12345876,12345877,12345878,12345879,12345880,12345881,12345882,12345883,12345884,12345885,12345886,12345887,12345888,12345889,12345890,12345891,12345892,12345893,12345894,12345895,12345896,12345897,12345898,12345899,12345900,12345901,12345902,12345903,12345904,12345905,12345906,12345907,12345908,12345909,12345910,12345911,12345912,12345913,12345914,12345915,12345916,12345917,12345918,12345919,12345920,12345921,12345922,12345923,12345924,12345925,12345926,12345927,12345928,12345929,12345930,12345931,12345932,12345933,12345934,12345935,12345936,12345937,12345938,12345939,12345940,12345941,12345942,12345943,12345944,12345945,12345946,12345947,12345948,12345949,12345950,12345951,12345952,12345953,12345954,12345955,12345956,12345957,12345958,12345959,12345960,12345961,12345962,12345963,12345964,12345965,12345966,12345967,12345968,12345969,12345970,12345971,12345972,12345973,12345974,12345975,12345976,12345977,12345978,12345979,12345980,12345981,12345982,12345983,12345984,12345985,12345986,12345987,12345988,12345989,12345990,12345991,12345992,12345993,12345994,12345995,12345996,12345997,12345998,12345999,12346000,12346001,12346002,12346003,12346004,12346005,12346006,12346007,12346008,12346009,12346010,12346011,12346012,12346013,12346014,12346015,12346016,12346017,12346018,12346019,12346020,12346021,12346022,12346023,12346024,12346025,12346026,12346027,12346028,12346029,12346030,12346031,12346032,12346033,12346034,12346035,12346036,12346037,12346038,12346039,12346040,12346041,12346042,12346043,12346044,12346045,12346046,12346047,12346048,12346049,12346050,12346051,12346052,12346053,12346054,12346055,12346056,12346057,12346058,12346059,12346060,12346061,12346062,12346063,12346064,12346065,12346066,12346067,12346068,12346069,12346070,12346071,12346072,12346073,12346074,12346075,12346076,12346077,12346078,12346079,12346080,12346081,12346082,12346083,12346084,12346085,12346086,12346087,12346088,12346089,12346090,12346091,12346092,12346093,12346094,12346095,12346096,12346097,12346098,12346099,12346100,12346101,12346102,12346103,12346104,12346105,12346106,12346107,12346108,12346109,12346110,12346111,12346112,12346113,12346114,12346115,12346116,12346117,12346118,12346119,12346120,12346121,12346122,12346123,12346124,12346125,12346126,12346127,12346128,12346129,12346130,12346131,12346132,12346133,12346134,12346135,12346136,12346137,12346138,12346139,12346140,12346141,12346142,12346143,12346144,12346145,12346146,12346147,12346148,12346149,12346150,12346151,12346152,12346153,12346154,12346155,12346156,12346157,12346158,12346159,12346160,12346161,12346162,12346163,12346164,12346165,12346166,12346167,12346168,12346169,12346170,12346171,12346172,12346173,12346174,12346175,12346176,12346177,12346178,12346179,12346180,12346181,12346182,12346183,12346184,12346185,12346186,12346187,12346188,12346189,12346190,12346191,12346192,12346193,12346194,12346195,12346196,12346197,12346198,12346199,12346200,12346201,12346202,12346203,12346204,12346205,12346206,12346207,12346208,12346209,12346210,12346211,12346212,12346213,12346214,12346215,12346216,12346217,12346218,12346219,12346220,12346221,12346222,12346223,12346224,12346225,12346226,12346227,12346228,12346229,12346230,12346231,12346232,12346233,12346234,12346235,12346236,12346237,12346238,12346239,12346240,12346241,12346242,12346243,12346244,12346245,12346246,12346247,12346248,12346249,12346250,12346251,12346252,12346253,12346254,12346255,12346256,12346257,12346258,12346259,12346260,12346261,12346262,12346263,12346264,12346265,12346266,12346267,12346268,12346269,12346270,12346271,12346272,12346273,12346274,12346275,12346276,12346277,12346278,12346279,12346280,12346281,12346282,12346283,12346284,12346285,12346286,12346287,12346288,12346289,12346290,12346291,12346292,12346293,12346294,12346295,12346296,12346297,12346298,12346299,12346300,12346301,12346302,12346303,12346304,12346305,12346306,12346307,12346308,12346309,12346310,12346311,12346312,12346313,12346314,12346315,12346316,12346317,12346318,12346319,12346320,12346321,12346322,12346323,12346324,12346325,12346326,12346327,12346328,12346329,12346330,12346331,12346332,12346333,12346334,12346335,12346336,12346337,12346338,12346339,12346340,12346341,12346342,12346343,12346344,12346345,12346346,12346347,12346348,12346349,12346350,12346351,12346352,12346353,12346354,12346355,12346356,12346357,12346358,12346359,12346360,12346361,12346362,12346363,12346364,12346365,12346366,12346367,12346368,12346369,12346370,12346371,12346372,12346373,12346374,12346375,12346376,12346377,12346378,12346379,12346380,12346381,12346382,12346383,12346384,12346385,12346386,12346387,12346388,12346389,12346390,12346391,12346392,12346393,12346394,12346395,12346396,12346397,12346398,12346399,12346400,12346401,12346402,12346403,12346404,12346405,12346406,12346407,12346408,12346409,12346410,12346411,12346412,12346413,12346414,12346415,12346416,12346417,12346418,12346419,12346420,12346421,12346422,12346423,12346424,12346425,12346426,12346427,12346428,12346429,12346430,12346431,12346432,12346433,12346434,12346435,12346436,12346437,12346438,12346439,12346440,12346441,12346442,12346443,12346444,12346445,12346446,12346447,12346448,12346449,12346450,12346451,12346452,12346453,12346454,12346455,12346456,12346457,12346458,12346459,12346460,12346461,12346462,12346463,12346464,12346465,12346466,12346467,12346468,12346469,12346470,12346471,12346472,12346473,12346474,12346475,12346476,12346477,12346478,12346479,12346480,12346481,12346482,12346483,12346484,12346485,12346486,12346487,12346488,12346489,12346490,12346491,12346492,12346493,12346494,12346495,12346496,12346497,12346498,12346499,12346500,12346501,12346502,12346503,12346504,12346505,12346506,12346507,12346508,12346509,12346510,12346511,12346512,12346513,12346514,12346515,12346516,12346517,12346518,12346519,12346520,12346521,12346522,12346523,12346524,12346525,12346526,12346527,12346528,12346529,12346530,12346531,12346532,12346533,12346534,12346535,12346536,12346537,12346538,12346539,12346540,12346541,12346542,12346543,12346544,12346545,12346546,12346547,12346548,12346549,12346550,12346551,12346552,12346553,12346554,12346555,12346556,12346557,12346558,12346559,12346560,12346561,12346562,12346563,12346564,12346565,12346566,12346567,12346568,12346569,12346570,12346571,12346572,12346573,12346574,12346575,12346576,12346577,12346578,12346579,12346580,12346581,12346582,12346583,12346584,12346585,12346586,12346587,12346588,12346589,12346590,12346591,12346592,12346593,12346594,12346595,12346596,12346597,12346598,12346599,12346600,12346601,12346602,12346603,12346604,12346605,12346606,12346607,12346608,12346609,12346610,12346611,12346612,12346613,12346614,12346615,12346616,12346617,12346618,12346619,12346620,12346621,12346622,12346623,12346624,12346625,12346626,12346627,12346628,12346629,12346630,12346631,12346632,12346633,12346634,12346635,12346636,12346637,12346638,12346639,12346640,12346641,12346642,12346643,12346644,12346645,12346646,12346647,12346648,12346649,12346650,12346651,12346652,12346653,12346654,12346655,12346656,12346657,12346658,12346659,12346660,12346661,12346662,12346663,12346664,12346665,12346666,12346667,12346668,12346669,12346670,12346671,12346672,12346673,12346674,12346675,12346676,12346677,12346678} +(1 row) + +declare held_portal cursor with hold for select * from toasted_data; +commit; +drop table toasted_data; +fetch all in held_portal; + f1 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + {12345678,12345679,12345680,12345681,12345682,12345683,12345684,12345685,12345686,12345687,12345688,12345689,12345690,12345691,12345692,12345693,12345694,12345695,12345696,12345697,12345698,12345699,12345700,12345701,12345702,12345703,12345704,12345705,12345706,12345707,12345708,12345709,12345710,12345711,12345712,12345713,12345714,12345715,12345716,12345717,12345718,12345719,12345720,12345721,12345722,12345723,12345724,12345725,12345726,12345727,12345728,12345729,12345730,12345731,12345732,12345733,12345734,12345735,12345736,12345737,12345738,12345739,12345740,12345741,12345742,12345743,12345744,12345745,12345746,12345747,12345748,12345749,12345750,12345751,12345752,12345753,12345754,12345755,12345756,12345757,12345758,12345759,12345760,12345761,12345762,12345763,12345764,12345765,12345766,12345767,12345768,12345769,12345770,12345771,12345772,12345773,12345774,12345775,12345776,12345777,12345778,12345779,12345780,12345781,12345782,12345783,12345784,12345785,12345786,12345787,12345788,12345789,12345790,12345791,12345792,12345793,12345794,12345795,12345796,12345797,12345798,12345799,12345800,12345801,12345802,12345803,12345804,12345805,12345806,12345807,12345808,12345809,12345810,12345811,12345812,12345813,12345814,12345815,12345816,12345817,12345818,12345819,12345820,12345821,12345822,12345823,12345824,12345825,12345826,12345827,12345828,12345829,12345830,12345831,12345832,12345833,12345834,12345835,12345836,12345837,12345838,12345839,12345840,12345841,12345842,12345843,12345844,12345845,12345846,12345847,12345848,12345849,12345850,12345851,12345852,12345853,12345854,12345855,12345856,12345857,12345858,12345859,12345860,12345861,12345862,12345863,12345864,12345865,12345866,12345867,12345868,12345869,12345870,12345871,12345872,12345873,12345874,12345875,12345876,12345877,12345878,12345879,12345880,12345881,12345882,12345883,12345884,12345885,12345886,12345887,12345888,12345889,12345890,12345891,12345892,12345893,12345894,12345895,12345896,12345897,12345898,12345899,12345900,12345901,12345902,12345903,12345904,12345905,12345906,12345907,12345908,12345909,12345910,12345911,12345912,12345913,12345914,12345915,12345916,12345917,12345918,12345919,12345920,12345921,12345922,12345923,12345924,12345925,12345926,12345927,12345928,12345929,12345930,12345931,12345932,12345933,12345934,12345935,12345936,12345937,12345938,12345939,12345940,12345941,12345942,12345943,12345944,12345945,12345946,12345947,12345948,12345949,12345950,12345951,12345952,12345953,12345954,12345955,12345956,12345957,12345958,12345959,12345960,12345961,12345962,12345963,12345964,12345965,12345966,12345967,12345968,12345969,12345970,12345971,12345972,12345973,12345974,12345975,12345976,12345977,12345978,12345979,12345980,12345981,12345982,12345983,12345984,12345985,12345986,12345987,12345988,12345989,12345990,12345991,12345992,12345993,12345994,12345995,12345996,12345997,12345998,12345999,12346000,12346001,12346002,12346003,12346004,12346005,12346006,12346007,12346008,12346009,12346010,12346011,12346012,12346013,12346014,12346015,12346016,12346017,12346018,12346019,12346020,12346021,12346022,12346023,12346024,12346025,12346026,12346027,12346028,12346029,12346030,12346031,12346032,12346033,12346034,12346035,12346036,12346037,12346038,12346039,12346040,12346041,12346042,12346043,12346044,12346045,12346046,12346047,12346048,12346049,12346050,12346051,12346052,12346053,12346054,12346055,12346056,12346057,12346058,12346059,12346060,12346061,12346062,12346063,12346064,12346065,12346066,12346067,12346068,12346069,12346070,12346071,12346072,12346073,12346074,12346075,12346076,12346077,12346078,12346079,12346080,12346081,12346082,12346083,12346084,12346085,12346086,12346087,12346088,12346089,12346090,12346091,12346092,12346093,12346094,12346095,12346096,12346097,12346098,12346099,12346100,12346101,12346102,12346103,12346104,12346105,12346106,12346107,12346108,12346109,12346110,12346111,12346112,12346113,12346114,12346115,12346116,12346117,12346118,12346119,12346120,12346121,12346122,12346123,12346124,12346125,12346126,12346127,12346128,12346129,12346130,12346131,12346132,12346133,12346134,12346135,12346136,12346137,12346138,12346139,12346140,12346141,12346142,12346143,12346144,12346145,12346146,12346147,12346148,12346149,12346150,12346151,12346152,12346153,12346154,12346155,12346156,12346157,12346158,12346159,12346160,12346161,12346162,12346163,12346164,12346165,12346166,12346167,12346168,12346169,12346170,12346171,12346172,12346173,12346174,12346175,12346176,12346177,12346178,12346179,12346180,12346181,12346182,12346183,12346184,12346185,12346186,12346187,12346188,12346189,12346190,12346191,12346192,12346193,12346194,12346195,12346196,12346197,12346198,12346199,12346200,12346201,12346202,12346203,12346204,12346205,12346206,12346207,12346208,12346209,12346210,12346211,12346212,12346213,12346214,12346215,12346216,12346217,12346218,12346219,12346220,12346221,12346222,12346223,12346224,12346225,12346226,12346227,12346228,12346229,12346230,12346231,12346232,12346233,12346234,12346235,12346236,12346237,12346238,12346239,12346240,12346241,12346242,12346243,12346244,12346245,12346246,12346247,12346248,12346249,12346250,12346251,12346252,12346253,12346254,12346255,12346256,12346257,12346258,12346259,12346260,12346261,12346262,12346263,12346264,12346265,12346266,12346267,12346268,12346269,12346270,12346271,12346272,12346273,12346274,12346275,12346276,12346277,12346278,12346279,12346280,12346281,12346282,12346283,12346284,12346285,12346286,12346287,12346288,12346289,12346290,12346291,12346292,12346293,12346294,12346295,12346296,12346297,12346298,12346299,12346300,12346301,12346302,12346303,12346304,12346305,12346306,12346307,12346308,12346309,12346310,12346311,12346312,12346313,12346314,12346315,12346316,12346317,12346318,12346319,12346320,12346321,12346322,12346323,12346324,12346325,12346326,12346327,12346328,12346329,12346330,12346331,12346332,12346333,12346334,12346335,12346336,12346337,12346338,12346339,12346340,12346341,12346342,12346343,12346344,12346345,12346346,12346347,12346348,12346349,12346350,12346351,12346352,12346353,12346354,12346355,12346356,12346357,12346358,12346359,12346360,12346361,12346362,12346363,12346364,12346365,12346366,12346367,12346368,12346369,12346370,12346371,12346372,12346373,12346374,12346375,12346376,12346377,12346378,12346379,12346380,12346381,12346382,12346383,12346384,12346385,12346386,12346387,12346388,12346389,12346390,12346391,12346392,12346393,12346394,12346395,12346396,12346397,12346398,12346399,12346400,12346401,12346402,12346403,12346404,12346405,12346406,12346407,12346408,12346409,12346410,12346411,12346412,12346413,12346414,12346415,12346416,12346417,12346418,12346419,12346420,12346421,12346422,12346423,12346424,12346425,12346426,12346427,12346428,12346429,12346430,12346431,12346432,12346433,12346434,12346435,12346436,12346437,12346438,12346439,12346440,12346441,12346442,12346443,12346444,12346445,12346446,12346447,12346448,12346449,12346450,12346451,12346452,12346453,12346454,12346455,12346456,12346457,12346458,12346459,12346460,12346461,12346462,12346463,12346464,12346465,12346466,12346467,12346468,12346469,12346470,12346471,12346472,12346473,12346474,12346475,12346476,12346477,12346478,12346479,12346480,12346481,12346482,12346483,12346484,12346485,12346486,12346487,12346488,12346489,12346490,12346491,12346492,12346493,12346494,12346495,12346496,12346497,12346498,12346499,12346500,12346501,12346502,12346503,12346504,12346505,12346506,12346507,12346508,12346509,12346510,12346511,12346512,12346513,12346514,12346515,12346516,12346517,12346518,12346519,12346520,12346521,12346522,12346523,12346524,12346525,12346526,12346527,12346528,12346529,12346530,12346531,12346532,12346533,12346534,12346535,12346536,12346537,12346538,12346539,12346540,12346541,12346542,12346543,12346544,12346545,12346546,12346547,12346548,12346549,12346550,12346551,12346552,12346553,12346554,12346555,12346556,12346557,12346558,12346559,12346560,12346561,12346562,12346563,12346564,12346565,12346566,12346567,12346568,12346569,12346570,12346571,12346572,12346573,12346574,12346575,12346576,12346577,12346578,12346579,12346580,12346581,12346582,12346583,12346584,12346585,12346586,12346587,12346588,12346589,12346590,12346591,12346592,12346593,12346594,12346595,12346596,12346597,12346598,12346599,12346600,12346601,12346602,12346603,12346604,12346605,12346606,12346607,12346608,12346609,12346610,12346611,12346612,12346613,12346614,12346615,12346616,12346617,12346618,12346619,12346620,12346621,12346622,12346623,12346624,12346625,12346626,12346627,12346628,12346629,12346630,12346631,12346632,12346633,12346634,12346635,12346636,12346637,12346638,12346639,12346640,12346641,12346642,12346643,12346644,12346645,12346646,12346647,12346648,12346649,12346650,12346651,12346652,12346653,12346654,12346655,12346656,12346657,12346658,12346659,12346660,12346661,12346662,12346663,12346664,12346665,12346666,12346667,12346668,12346669,12346670,12346671,12346672,12346673,12346674,12346675,12346676,12346677,12346678} +(1 row) + +reset default_toast_compression; diff --git a/src/test/regress/sql/portals.sql b/src/test/regress/sql/portals.sql index eadf6ed942..fc4cccb96c 100644 --- a/src/test/regress/sql/portals.sql +++ b/src/test/regress/sql/portals.sql @@ -581,3 +581,27 @@ declare c2 scroll cursor for select generate_series(1,3) as g; fetch all in c2; fetch backward all in c2; rollback; + +-- Check fetching of toasted datums via cursors. +begin; + +-- Other compression algorithms may cause the compressed data to be stored +-- inline. Use pglz to ensure consistent results. +set default_toast_compression = 'pglz'; + +create table toasted_data (f1 int[]); +insert into toasted_data + select array_agg(i) from generate_series(12345678, 12345678 + 1000) i; + +declare local_portal cursor for select * from toasted_data; +fetch all in local_portal; + +declare held_portal cursor with hold for select * from toasted_data; + +commit; + +drop table toasted_data; + +fetch all in held_portal; + +reset default_toast_compression; From 4a736a161c306fcfed970e6b649f2f03f465ac24 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 16 Apr 2022 12:13:31 -0700 Subject: [PATCH 537/772] pgstat: Use correct lock level in pgstat_drop_all_entries(). Previously we didn't, which lead to an assertion failure when resetting partially loaded statistics. This was encountered on the buildfarm, for as-of-yet unknown reasons. Ttighten up a validity check when reading the stats file, verifying 'E' signals the end of the file (rather than just stopping reading). That's then used in a test appending to the stats file that crashed before the fix in pgstat_drop_all_entries(). Reported by buildfarm animals mylodon and kestrel, via Tom Lane. Discussion: https://postgr.es/m/1656446.1650043715@sss.pgh.pa.us --- src/backend/utils/activity/pgstat.c | 4 +++ src/backend/utils/activity/pgstat_shmem.c | 2 +- src/test/recovery/t/029_stats_restart.pl | 30 +++++++++++++++++++++-- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index f658f8f198..3c3fd0e9b7 100644 --- a/src/backend/utils/activity/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -1583,6 +1583,10 @@ pgstat_read_statsfile(void) break; } case 'E': + /* check that 'E' actually signals end of file */ + if (fgetc(fpin) != EOF) + goto error; + goto done; default: diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c index 68ff6f51fc..89060ef29a 100644 --- a/src/backend/utils/activity/pgstat_shmem.c +++ b/src/backend/utils/activity/pgstat_shmem.c @@ -878,7 +878,7 @@ pgstat_drop_all_entries(void) PgStatShared_HashEntry *ps; uint64 not_freed_count = 0; - dshash_seq_init(&hstat, pgStatLocal.shared_hash, false); + dshash_seq_init(&hstat, pgStatLocal.shared_hash, true); while ((ps = dshash_seq_next(&hstat)) != NULL) { if (ps->dropped) diff --git a/src/test/recovery/t/029_stats_restart.pl b/src/test/recovery/t/029_stats_restart.pl index e0478f8af8..2fe8db8807 100644 --- a/src/test/recovery/t/029_stats_restart.pl +++ b/src/test/recovery/t/029_stats_restart.pl @@ -113,7 +113,23 @@ $node->start; # no stats present due to invalid stats file -$sect = "invalid"; +$sect = "invalid_overwrite"; +is(have_stats('database', $dboid, 0), 'f', "$sect: db stats do not exist"); +is(have_stats('function', $dboid, $funcoid), + 'f', "$sect: function stats do not exist"); +is(have_stats('relation', $dboid, $tableoid), + 'f', "$sect: relation stats do not exist"); + + +## check invalid stats file starting with valid contents, but followed by +## invalid content is handled. + +trigger_funcrel_stat(); +$node->stop; +append_file($og_stats, "XYZ"); +$node->start; + +$sect = "invalid_append"; is(have_stats('database', $dboid, 0), 'f', "$sect: db stats do not exist"); is(have_stats('function', $dboid, $funcoid), 'f', "$sect: function stats do not exist"); @@ -285,7 +301,17 @@ sub overwrite_file { my ($filename, $str) = @_; open my $fh, ">", $filename - or die "could not write \"$filename\": $!"; + or die "could not overwrite \"$filename\": $!"; + print $fh $str; + close $fh; + return; +} + +sub append_file +{ + my ($filename, $str) = @_; + open my $fh, ">>", $filename + or die "could not append to \"$filename\": $!"; print $fh $str; close $fh; return; From acf1dd42342d6d84ca8e7a1998335e2e8809759e Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Sun, 17 Apr 2022 10:22:03 +1200 Subject: [PATCH 538/772] Don't retry restore_command while reading ahead. Suppress further attempts to read ahead in the WAL if we run out of data, until the records already decoded have been replayed. This restores the traditional behavior for continuous archive recovery, which is to retry the failing restore_command only every 5 seconds. With the coding in 5dc0418f, we would start retrying every time through the recovery loop when our WAL decoding window hit the end of the current segment and we tried to look ahead into a not-yet-available next file. That was very slow. Also change the no_readahead_until mechanism to use <= rather than <, which seems more useful. Otherwise we'd either get one extra unwanted retry of restore_command, or we'd need to add 1 to an LSN. No change in behavior for regular streaming. That was already limited by the flushedUpto variable, which won't be updated until we replay what we have already. Reported by Andres Freund while analyzing the failure of a TAP test on build farm animal skink (investigation ongoing but probably due to otherwise unrelated timing bugs triggered by this slowness magnified by valgrind). Discussion: https://postgr.es/m/20220409005910.alw46xqmmgny2sgr%40alap3.anarazel.de --- src/backend/access/transam/xlogprefetcher.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/backend/access/transam/xlogprefetcher.c b/src/backend/access/transam/xlogprefetcher.c index f3428888d2..959e409466 100644 --- a/src/backend/access/transam/xlogprefetcher.c +++ b/src/backend/access/transam/xlogprefetcher.c @@ -487,8 +487,8 @@ XLogPrefetcherNextBlock(uintptr_t pgsr_private, XLogRecPtr *lsn) */ nonblocking = XLogReaderHasQueuedRecordOrError(reader); - /* Certain records act as barriers for all readahead. */ - if (nonblocking && replaying_lsn < prefetcher->no_readahead_until) + /* Readahead is disabled until we replay past a certain point. */ + if (nonblocking && replaying_lsn <= prefetcher->no_readahead_until) return LRQ_NEXT_AGAIN; record = XLogReadAhead(prefetcher->reader, nonblocking); @@ -496,8 +496,13 @@ XLogPrefetcherNextBlock(uintptr_t pgsr_private, XLogRecPtr *lsn) { /* * We can't read any more, due to an error or lack of data in - * nonblocking mode. + * nonblocking mode. Don't try to read ahead again until + * we've replayed everything already decoded. */ + if (nonblocking && prefetcher->reader->decode_queue_tail) + prefetcher->no_readahead_until = + prefetcher->reader->decode_queue_tail->lsn; + return LRQ_NEXT_AGAIN; } From 42dbbca58e8e87e461bb0a4fe48a450e90e1e932 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Sat, 16 Apr 2022 17:43:54 -0700 Subject: [PATCH 539/772] Add a temp-install prerequisite to src/interfaces/ecpg "checktcp". The target failed, tested $PATH binaries, or tested a stale temporary installation. Commit c66b438db62748000700c9b90b585e756dd54141 missed this. Back-patch to v10 (all supported versions). --- src/interfaces/ecpg/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/src/interfaces/ecpg/Makefile b/src/interfaces/ecpg/Makefile index a8f91e3dc2..e4bbf7b8a8 100644 --- a/src/interfaces/ecpg/Makefile +++ b/src/interfaces/ecpg/Makefile @@ -26,5 +26,6 @@ install-ecpglib-recurse: install-pgtypeslib-recurse clean distclean maintainer-clean: $(MAKE) -C test clean +checktcp: | temp-install check checktcp installcheck: $(MAKE) -C test $@ From 42e44f3b3830cbc051a5d83956546e2ef553b047 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 18 Apr 2022 10:18:34 +0900 Subject: [PATCH 540/772] Handle compression level in pg_receivewal for LZ4 The new option set of pg_receivewal introduced in 042a923 to control the compression method makes it now easy to pass down various options, including the compression level. The change to be able to do is simple, and requires one LZ4F_preferences_t fed to LZ4F_compressBegin(). Note that LZ4F_INIT_PREFERENCES could be used to initialize the contents of LZ4F_preferences_t as required by LZ4, but this is only available since v1.8.3. memset()'ing its structure to 0 is enough. Discussion: https://postgr.es/m/YlPQGNAAa04raObK@paquier.xyz --- src/bin/pg_basebackup/walmethods.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/bin/pg_basebackup/walmethods.c b/src/bin/pg_basebackup/walmethods.c index d5bcc208a9..cc292718da 100644 --- a/src/bin/pg_basebackup/walmethods.c +++ b/src/bin/pg_basebackup/walmethods.c @@ -165,6 +165,7 @@ dir_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_ { size_t ctx_out; size_t header_size; + LZ4F_preferences_t prefs; ctx_out = LZ4F_createCompressionContext(&ctx, LZ4F_VERSION); if (LZ4F_isError(ctx_out)) @@ -177,8 +178,12 @@ dir_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_ lz4bufsize = LZ4F_compressBound(LZ4_IN_SIZE, NULL); lz4buf = pg_malloc0(lz4bufsize); + /* assign the compression level, default is 0 */ + memset(&prefs, 0, sizeof(prefs)); + prefs.compressionLevel = dir_data->compression_level; + /* add the header */ - header_size = LZ4F_compressBegin(ctx, lz4buf, lz4bufsize, NULL); + header_size = LZ4F_compressBegin(ctx, lz4buf, lz4bufsize, &prefs); if (LZ4F_isError(header_size)) { dir_data->lasterrstring = LZ4F_getErrorName(header_size); From e61efafcb82c605dcc78f668685223e20d2f7ad8 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 18 Apr 2022 11:39:50 +0900 Subject: [PATCH 541/772] Fix race in TAP test 002_archiving.pl when restoring history file This test, introduced in df86e52, uses a second standby to check that it is able to remove correctly RECOVERYHISTORY and RECOVERYXLOG at the end of recovery. This standby uses the archives of the primary to restore its contents, with some of the archive's contents coming from the first standby previously promoted. In slow environments, it was possible that the test did not check what it should, as the history file generated by the promotion of the first standby may not be stored yet on the archives the second standby feeds on. So, it could be possible that the second standby selects an incorrect timeline, without restoring a history file at all. This commits adds a wait phase to make sure that the history file required by the second standby is archived before this cluster is created. This relies on poll_query_until() with pg_stat_file() and an absolute path, something not supported in REL_10_STABLE. While on it, this adds a new test to check that the history file has been restored by looking at the logs of the second standby. This ensures that a RECOVERYHISTORY, whose removal needs to be checked, is created in the first place. This should make the test more robust. This test has been introduced by df86e52, but it came in light as an effect of the bug fixed by acf1dd42, where the extra restore_command calls made the test much slower. Reported-by: Andres Freund Discussion: https://postgr.es/m/YlT23IvsXkGuLzFi@paquier.xyz Backpatch-through: 11 --- src/test/recovery/t/002_archiving.pl | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/test/recovery/t/002_archiving.pl b/src/test/recovery/t/002_archiving.pl index c8f5ffbaf0..88ddc8fce7 100644 --- a/src/test/recovery/t/002_archiving.pl +++ b/src/test/recovery/t/002_archiving.pl @@ -24,6 +24,8 @@ # Initialize standby node from backup, fetching WAL from archives my $node_standby = PostgreSQL::Test::Cluster->new('standby'); +# Note that this makes the standby store its contents on the archives +# of the primary. $node_standby->init_from_backup($node_primary, $backup_name, has_restoring => 1); $node_standby->append_conf('postgresql.conf', @@ -81,10 +83,20 @@ # file, switch to a timeline large enough to allow a standby to recover # a history file from an archive. As this requires at least two timeline # switches, promote the existing standby first. Then create a second -# standby based on the promoted one. Finally, the second standby is -# promoted. +# standby based on the primary, using its archives. Finally, the second +# standby is promoted. $node_standby->promote; +# Wait until the history file has been stored on the archives of the +# primary once the promotion of the standby completes. This ensures that +# the second standby created below will be able to restore this file, +# creating a RECOVERYHISTORY. +my $primary_archive = $node_primary->archive_dir; +$caughtup_query = + "SELECT size IS NOT NULL FROM pg_stat_file('$primary_archive/00000002.history')"; +$node_primary->poll_query_until('postgres', $caughtup_query) + or die "Timed out while waiting for archiving of 00000002.history"; + # recovery_end_command should have been triggered on promotion. ok( -f "$data_dir/$recovery_end_command_file", 'recovery_end_command executed after promotion'); @@ -108,14 +120,19 @@ # Now promote standby2, and check that temporary files specifically # generated during archive recovery are removed by the end of recovery. $node_standby2->promote; + +# Check the logs of the standby to see that the commands have failed. +my $log_contents = slurp_file($node_standby2->logfile, $log_location); my $node_standby2_data = $node_standby2->data_dir; + +like( + $log_contents, + qr/restored log file "00000002.history" from archive/s, + "00000002.history retrieved from the archives"); ok( !-f "$node_standby2_data/pg_wal/RECOVERYHISTORY", "RECOVERYHISTORY removed after promotion"); ok( !-f "$node_standby2_data/pg_wal/RECOVERYXLOG", "RECOVERYXLOG removed after promotion"); - -# Check the logs of the standby to see that the commands have failed. -my $log_contents = slurp_file($node_standby2->logfile, $log_location); like( $log_contents, qr/WARNING:.*recovery_end_command/s, From 676eeb6dd1655f7a3ee783b7ca0d645580630acc Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Mon, 18 Apr 2022 08:42:37 +0530 Subject: [PATCH 542/772] Add additional documentation for row filters. Commit 52e4f0cd47 added a feature to allow specifying row filters for logical replication of tables. This patch adds detailed documentation on that feature including examples to make it easier for users to understand. Author: Peter Smith, Euler Taveira Reviewed By: Greg Nancarrow, Aleksander Alekseev, Amit Kapila, Ajin Cherian, Alvaro Herrera Discussion: https://postgr.es/m/CAHut+PtnsBr59=_NvxXp_=S-em0WxyuDOQmSTuHGb4sVhkHffg@mail.gmail.com --- doc/src/sgml/logical-replication.sgml | 562 +++++++++++++++++++++++ doc/src/sgml/ref/create_publication.sgml | 2 + 2 files changed, 564 insertions(+) diff --git a/doc/src/sgml/logical-replication.sgml b/doc/src/sgml/logical-replication.sgml index 1126ce4ccf..bc4d700456 100644 --- a/doc/src/sgml/logical-replication.sgml +++ b/doc/src/sgml/logical-replication.sgml @@ -118,6 +118,8 @@ any combination of INSERT, UPDATE, DELETE, and TRUNCATE, similar to how triggers are fired by particular event types. By default, all operation types are replicated. + (Row filters have no effect for TRUNCATE. See + ). @@ -317,6 +319,566 @@
+ + Row Filters + + + By default, all data from all published tables will be replicated to the + appropriate subscribers. The replicated data can be reduced by using a + row filter. A user might choose to use row filters + for behavioral, security or performance reasons. If a published table sets a + row filter, a row is replicated only if its data satisfies the row filter + expression. This allows a set of tables to be partially replicated. The row + filter is defined per table. Use a WHERE clause after the + table name for each published table that requires data to be filtered out. + The WHERE clause must be enclosed by parentheses. See + for details. + + + + Row Filter Rules + + + Row filters are applied before publishing the changes. + If the row filter evaluates to false or NULL + then the row is not replicated. The WHERE clause expression + is evaluated with the same role used for the replication connection (i.e. + the role specified in the CONNECTION clause of the + ). Row filters have no effect for + TRUNCATE command. + + + + + + Expression Restrictions + + + The WHERE clause allows only simple expressions. It + cannot contain user-defined functions, operators, types, and collations, + system column references or non-immutable built-in functions. + + + + If a publication publishes UPDATE or + DELETE operations, the row filter WHERE + clause must contain only columns that are covered by the replica identity + (see ). If a publication + publishes only INSERT operations, the row filter + WHERE clause can use any column. + + + + + + UPDATE Transformations + + + Whenever an UPDATE is processed, the row filter + expression is evaluated for both the old and new row (i.e. using the data + before and after the update). If both evaluations are true, + it replicates the UPDATE change. If both evaluations are + false, it doesn't replicate the change. If only one of + the old/new rows matches the row filter expression, the UPDATE + is transformed to INSERT or DELETE, to + avoid any data inconsistency. The row on the subscriber should reflect what + is defined by the row filter expression on the publisher. + + + + If the old row satisfies the row filter expression (it was sent to the + subscriber) but the new row doesn't, then, from a data consistency + perspective the old row should be removed from the subscriber. + So the UPDATE is transformed into a DELETE. + + + + If the old row doesn't satisfy the row filter expression (it wasn't sent + to the subscriber) but the new row does, then, from a data consistency + perspective the new row should be added to the subscriber. + So the UPDATE is transformed into an INSERT. + + + + <command>UPDATE</command> Transformation Summary + + + + Old rowNew rowTransformation + + + + + no matchno matchdon't replicate + + + no matchmatchINSERT + + + matchno matchDELETE + + + matchmatchUPDATE + + + +
+ +
+ + + Partitioned Tables + + + If the publication contains a partitioned table, the publication parameter + publish_via_partition_root determines which row filter + is used. If publish_via_partition_root is true, + the root partitioned table's row filter is used. Otherwise, + if publish_via_partition_root is false + (default), each partition's row filter is used. + + + + + + Initial Data Synchronization + + + If the subscription requires copying pre-existing table data + and a publication contains WHERE clauses, only data that + satisfies the row filter expressions is copied to the subscriber. + + + + If the subscription has several publications in which a table has been + published with different WHERE clauses, rows that satisfy + any of the expressions will be copied. See + for details. + + + + + If the subscriber is in a release prior to 15, copy pre-existing data + doesn't use row filters even if they are defined in the publication. + This is because old releases can only copy the entire table data. + + + + + + + Combining Multiple Row Filters + + + If the subscription has several publications in which the same table has + been published with different row filters (for the same publish + operation), those expressions get ORed together, so that rows satisfying + any of the expressions will be replicated. This means all + the other row filters for the same table become redundant if: + + + + one of the publications has no row filter. + + + + + one of the publications was created using FOR ALL TABLES. + This clause does not allow row filters. + + + + + one of the publications was created using + FOR ALL TABLES IN SCHEMA and the table belongs to + the referred schema. This clause does not allow row filters. + + + + + + + + Examples + + + Create some tables to be used in the following examples. + +test_pub=# CREATE TABLE t1(a int, b int, c text, PRIMARY KEY(a,c)); +CREATE TABLE +test_pub=# CREATE TABLE t2(d int, e int, f int, PRIMARY KEY(d)); +CREATE TABLE +test_pub=# CREATE TABLE t3(g int, h int, i int, PRIMARY KEY(g)); +CREATE TABLE + + + + Create some publications. Publication p1 has one table + (t1) and that table has a row filter. Publication + p2 has two tables. Table t1 has no row + filter, and table t2 has a row filter. Publication + p3 has two tables, and both of them have a row filter. + +test_pub=# CREATE PUBLICATION p1 FOR TABLE t1 WHERE (a > 5 AND c = 'NSW'); +CREATE PUBLICATION +test_pub=# CREATE PUBLICATION p2 FOR TABLE t1, t2 WHERE (e = 99); +CREATE PUBLICATION +test_pub=# CREATE PUBLICATION p3 FOR TABLE t2 WHERE (d = 10), t3 WHERE (g = 10); +CREATE PUBLICATION + + + + psql can be used to show the row filter expressions (if + defined) for each publication. + +test_pub=# \dRp+ + Publication p1 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +----------+------------+---------+---------+---------+-----------+---------- + postgres | f | t | t | t | t | f +Tables: + "public.t1" WHERE ((a > 5) AND (c = 'NSW'::text)) + + Publication p2 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +----------+------------+---------+---------+---------+-----------+---------- + postgres | f | t | t | t | t | f +Tables: + "public.t1" + "public.t2" WHERE (e = 99) + + Publication p3 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +----------+------------+---------+---------+---------+-----------+---------- + postgres | f | t | t | t | t | f +Tables: + "public.t2" WHERE (d = 10) + "public.t3" WHERE (g = 10) + + + + psql can be used to show the row filter expressions (if + defined) for each table. See that table t1 is a member + of two publications, but has a row filter only in p1. + See that table t2 is a member of two publications, and + has a different row filter in each of them. + +test_pub=# \d t1 + Table "public.t1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | not null | + b | integer | | | + c | text | | not null | +Indexes: + "t1_pkey" PRIMARY KEY, btree (a, c) +Publications: + "p1" WHERE ((a > 5) AND (c = 'NSW'::text)) + "p2" + +test_pub=# \d t2 + Table "public.t2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + d | integer | | not null | + e | integer | | | + f | integer | | | +Indexes: + "t2_pkey" PRIMARY KEY, btree (d) +Publications: + "p2" WHERE (e = 99) + "p3" WHERE (d = 10) + +test_pub=# \d t3 + Table "public.t3" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + g | integer | | not null | + h | integer | | | + i | integer | | | +Indexes: + "t3_pkey" PRIMARY KEY, btree (g) +Publications: + "p3" WHERE (g = 10) + + + + On the subscriber node, create a table t1 with the same + definition as the one on the publisher, and also create the subscription + s1 that subscribes to the publication p1. + +test_sub=# CREATE TABLE t1(a int, b int, c text, PRIMARY KEY(a,c)); +CREATE TABLE +test_sub=# CREATE SUBSCRIPTION s1 +test_sub-# CONNECTION 'host=localhost dbname=test_pub application_name=s1' +test_sub-# PUBLICATION p1; +CREATE SUBSCRIPTION + + + + Insert some rows. Only the rows satisfying the t1 WHERE + clause of publication p1 are replicated. + +test_pub=# INSERT INTO t1 VALUES (2, 102, 'NSW'); +INSERT 0 1 +test_pub=# INSERT INTO t1 VALUES (3, 103, 'QLD'); +INSERT 0 1 +test_pub=# INSERT INTO t1 VALUES (4, 104, 'VIC'); +INSERT 0 1 +test_pub=# INSERT INTO t1 VALUES (5, 105, 'ACT'); +INSERT 0 1 +test_pub=# INSERT INTO t1 VALUES (6, 106, 'NSW'); +INSERT 0 1 +test_pub=# INSERT INTO t1 VALUES (7, 107, 'NT'); +INSERT 0 1 +test_pub=# INSERT INTO t1 VALUES (8, 108, 'QLD'); +INSERT 0 1 +test_pub=# INSERT INTO t1 VALUES (9, 109, 'NSW'); +INSERT 0 1 + +test_pub=# SELECT * FROM t1; + a | b | c +---+-----+----- + 2 | 102 | NSW + 3 | 103 | QLD + 4 | 104 | VIC + 5 | 105 | ACT + 6 | 106 | NSW + 7 | 107 | NT + 8 | 108 | QLD + 9 | 109 | NSW +(8 rows) + + +test_sub=# SELECT * FROM t1; + a | b | c +---+-----+----- + 6 | 106 | NSW + 9 | 109 | NSW +(2 rows) + + + + Update some data, where the old and new row values both + satisfy the t1 WHERE clause of publication + p1. The UPDATE replicates + the change as normal. + +test_pub=# UPDATE t1 SET b = 999 WHERE a = 6; +UPDATE 1 + +test_pub=# SELECT * FROM t1; + a | b | c +---+-----+----- + 2 | 102 | NSW + 3 | 103 | QLD + 4 | 104 | VIC + 5 | 105 | ACT + 7 | 107 | NT + 8 | 108 | QLD + 9 | 109 | NSW + 6 | 999 | NSW +(8 rows) + + +test_sub=# SELECT * FROM t1; + a | b | c +---+-----+----- + 9 | 109 | NSW + 6 | 999 | NSW +(2 rows) + + + + Update some data, where the old row values did not satisfy + the t1 WHERE clause of publication p1, + but the new row values do satisfy it. The UPDATE is + transformed into an INSERT and the change is replicated. + See the new row on the subscriber. + +test_pub=# UPDATE t1 SET a = 555 WHERE a = 2; +UPDATE 1 + +test_pub=# SELECT * FROM t1; + a | b | c +-----+-----+----- + 3 | 103 | QLD + 4 | 104 | VIC + 5 | 105 | ACT + 7 | 107 | NT + 8 | 108 | QLD + 9 | 109 | NSW + 6 | 999 | NSW + 555 | 102 | NSW +(8 rows) + + +test_sub=# SELECT * FROM t1; + a | b | c +-----+-----+----- + 9 | 109 | NSW + 6 | 999 | NSW + 555 | 102 | NSW +(3 rows) + + + + Update some data, where the old row values satisfied + the t1 WHERE clause of publication p1, + but the new row values do not satisfy it. The UPDATE is + transformed into a DELETE and the change is replicated. + See that the row is removed from the subscriber. + +test_pub=# UPDATE t1 SET c = 'VIC' WHERE a = 9; +UPDATE 1 + +test_pub=# SELECT * FROM t1; + a | b | c +-----+-----+----- + 3 | 103 | QLD + 4 | 104 | VIC + 5 | 105 | ACT + 7 | 107 | NT + 8 | 108 | QLD + 6 | 999 | NSW + 555 | 102 | NSW + 9 | 109 | VIC +(8 rows) + + +test_sub=# SELECT * FROM t1; + a | b | c +-----+-----+----- + 6 | 999 | NSW + 555 | 102 | NSW +(2 rows) + + + + The following examples show how the publication parameter + publish_via_partition_root determines whether the row + filter of the parent or child table will be used in the case of partitioned + tables. + + + + Create a partitioned table on the publisher. + +test_pub=# CREATE TABLE parent(a int PRIMARY KEY) PARTITION BY RANGE(a); +CREATE TABLE +test_pub=# CREATE TABLE child PARTITION OF parent DEFAULT; +CREATE TABLE + + Create the same tables on the subscriber. + +test_sub=# CREATE TABLE parent(a int PRIMARY KEY) PARTITION BY RANGE(a); +CREATE TABLE +test_sub=# CREATE TABLE child PARTITION OF parent DEFAULT; +CREATE TABLE + + + + Create a publication p4, and then subscribe to it. The + publication parameter publish_via_partition_root is set + as true. There are row filters defined on both the partitioned table + (parent), and on the partition (child). + +test_pub=# CREATE PUBLICATION p4 FOR TABLE parent WHERE (a < 5), child WHERE (a >= 5) +test_pub-# WITH (publish_via_partition_root=true); +CREATE PUBLICATION + + +test_sub=# CREATE SUBSCRIPTION s4 +test_sub-# CONNECTION 'host=localhost dbname=test_pub application_name=s4' +test_sub-# PUBLICATION p4; +CREATE SUBSCRIPTION + + + + Insert some values directly into the parent and + child tables. They replicate using the row filter of + parent (because publish_via_partition_root + is true). + +test_pub=# INSERT INTO parent VALUES (2), (4), (6); +INSERT 0 3 +test_pub=# INSERT INTO child VALUES (3), (5), (7); +INSERT 0 3 + +test_pub=# SELECT * FROM parent ORDER BY a; + a +--- + 2 + 3 + 4 + 5 + 6 + 7 +(6 rows) + + +test_sub=# SELECT * FROM parent ORDER BY a; + a +--- + 2 + 3 + 4 +(3 rows) + + + + Repeat the same test, but with a different value for publish_via_partition_root. + The publication parameter publish_via_partition_root is + set as false. A row filter is defined on the partition (child). + +test_pub=# DROP PUBLICATION p4; +DROP PUBLICATION +test_pub=# CREATE PUBLICATION p4 FOR TABLE parent, child WHERE (a >= 5) +test_pub-# WITH (publish_via_partition_root=false); +CREATE PUBLICATION + + +test_sub=# ALTER SUBSCRIPTION s4 REFRESH PUBLICATION; +ALTER SUBSCRIPTION + + + + Do the inserts on the publisher same as before. They replicate using the + row filter of child (because + publish_via_partition_root is false). + +test_pub=# TRUNCATE parent; +TRUNCATE TABLE +test_pub=# INSERT INTO parent VALUES (2), (4), (6); +INSERT 0 3 +test_pub=# INSERT INTO child VALUES (3), (5), (7); +INSERT 0 3 + +test_pub=# SELECT * FROM parent ORDER BY a; + a +--- + 2 + 3 + 4 + 5 + 6 + 7 +(6 rows) + + +test_sub=# SELECT * FROM child ORDER BY a; + a +--- + 5 + 6 + 7 +(3 rows) + + + + +
+ Conflicts diff --git a/doc/src/sgml/ref/create_publication.sgml b/doc/src/sgml/ref/create_publication.sgml index fb2d013393..23d883c158 100644 --- a/doc/src/sgml/ref/create_publication.sgml +++ b/doc/src/sgml/ref/create_publication.sgml @@ -254,6 +254,8 @@ CREATE PUBLICATION name publish_via_partition_root determines if it uses the partition's row filter (if the parameter is false, the default) or the root partitioned table's row filter. + See for details about row + filters. From 1a8b110539efe18803c1fa8aa452a2178dbad9a9 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 18 Apr 2022 13:41:40 +0900 Subject: [PATCH 543/772] Fix second race condition in 002_archiving.pl with archive_cleanup_command Checking the execution of archive_cleanup_command on a standby requires a valid checkpoint coming from its primary, but the logic did not check that the standby replayed up to the point of the checkpoint, causing the test checking for the execution of archive_cleanup_command to fail. This race was more visible in slow environments. Issue introduced in 46dea24, so no backpatch is needed. Author: Tom Lane Discussion: https://postgr.es/m/4015413.1649454951@sss.pgh.pa.us --- src/test/recovery/t/002_archiving.pl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/test/recovery/t/002_archiving.pl b/src/test/recovery/t/002_archiving.pl index 88ddc8fce7..01c52d8e7f 100644 --- a/src/test/recovery/t/002_archiving.pl +++ b/src/test/recovery/t/002_archiving.pl @@ -46,13 +46,16 @@ # Create some content on primary $node_primary->safe_psql('postgres', "CREATE TABLE tab_int AS SELECT generate_series(1,1000) AS a"); -my $current_lsn = - $node_primary->safe_psql('postgres', "SELECT pg_current_wal_lsn();"); # Note the presence of this checkpoint for the archive_cleanup_command # check done below, before switching to a new segment. $node_primary->safe_psql('postgres', "CHECKPOINT"); +# Done after the checkpoint to ensure that it is replayed on the standby, +# for archive_cleanup_command. +my $current_lsn = + $node_primary->safe_psql('postgres', "SELECT pg_current_wal_lsn();"); + # Force archiving of WAL file to make it present on primary $node_primary->safe_psql('postgres', "SELECT pg_switch_wal()"); From 36d4efe779bfc7190ea1c1cf8deb0d945b726663 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 18 Apr 2022 12:16:45 -0400 Subject: [PATCH 544/772] Avoid invalid array reference in transformAlterTableStmt(). Don't try to look at the attidentity field of system attributes, because they're not there in the TupleDescAttr array. Sometimes this is harmless because we accidentally pick up a zero, but otherwise we'll report "no owned sequence found" from an attempt to alter a system attribute. (It seems possible that a SIGSEGV could occur, too, though I've not seen it in testing.) It's not in this function's charter to complain that you can't alter a system column, so instead just hard-wire an assumption that system attributes aren't identities. I didn't bother with a regression test because the appearance of the bug is very erratic. Per bug #17465 from Roman Zharkov. Back-patch to all supported branches. (There's not actually a live bug before v12, because before that get_attidentity() did the right thing anyway. But for consistency I changed the test in the older branches too.) Discussion: https://postgr.es/m/17465-f2a554a6cb5740d3@postgresql.org --- src/backend/parser/parse_utilcmd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index 2826559d09..1a64a52279 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -3424,7 +3424,8 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt, errmsg("column \"%s\" of relation \"%s\" does not exist", cmd->name, RelationGetRelationName(rel)))); - if (TupleDescAttr(tupdesc, attnum - 1)->attidentity) + if (attnum > 0 && + TupleDescAttr(tupdesc, attnum - 1)->attidentity) { Oid seq_relid = getIdentitySequence(relid, attnum, false); Oid typeOid = typenameTypeId(pstate, def->typeName); From 587de223f03e6086d511dab16b17406eb21277ce Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 18 Apr 2022 20:04:55 -0400 Subject: [PATCH 545/772] Add missing error handling in pg_md5_hash(). It failed to provide an error string as expected for the admittedly-unlikely case of OOM in pg_cryptohash_create(). Also, make it initialize *errstr to NULL for success, as pg_md5_binary() does. Also add missing comments. Readers should not have to reverse-engineer the API spec for a publicly visible routine. --- src/common/md5_common.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/common/md5_common.c b/src/common/md5_common.c index edc935eeb8..472a1032c0 100644 --- a/src/common/md5_common.c +++ b/src/common/md5_common.c @@ -57,6 +57,9 @@ bytesToHex(uint8 b[16], char *s) * characters. you thus need to provide an array * of 33 characters, including the trailing '\0'. * + * errstr filled with a constant-string error message + * on failure return; NULL on success. + * * RETURNS false on failure (out of memory for internal buffers * or MD5 computation failure) or true on success. * @@ -72,9 +75,13 @@ pg_md5_hash(const void *buff, size_t len, char *hexsum, const char **errstr) uint8 sum[MD5_DIGEST_LENGTH]; pg_cryptohash_ctx *ctx; + *errstr = NULL; ctx = pg_cryptohash_create(PG_MD5); if (ctx == NULL) + { + *errstr = pg_cryptohash_error(NULL); /* returns OOM */ return false; + } if (pg_cryptohash_init(ctx) < 0 || pg_cryptohash_update(ctx, buff, len) < 0 || @@ -90,6 +97,12 @@ pg_md5_hash(const void *buff, size_t len, char *hexsum, const char **errstr) return true; } +/* + * pg_md5_binary + * + * As above, except that the MD5 digest is returned as a binary string + * (of size MD5_DIGEST_LENGTH) rather than being converted to ASCII hex. + */ bool pg_md5_binary(const void *buff, size_t len, void *outbuf, const char **errstr) { From dd4ab6fd6528e160571986fa8817cee9f2645aa8 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Tue, 19 Apr 2022 08:49:49 +0530 Subject: [PATCH 546/772] Fix the check to limit sync workers. We don't allow to invoke more sync workers once we have reached the sync worker limit per subscription. But the check to enforce this also doesn't allow to launch an apply worker if it gets restarted. This code was introduced by commit de43897122 but we caught the problem only with the test added by recent commit c91f71b9dc which started failing occasionally in the buildfarm. As per buildfarm. Diagnosed-by: Amit Kapila, Masahiko Sawada, Tomas Vondra Author: Amit Kapila Backpatch-through: 10 Discussion: https://postgr.es/m/CAH2L28vddB_NFdRVpuyRBJEBWjz4BSyTB=_ektNRH8NJ1jf95g@mail.gmail.com https://postgr.es/m/f90d2b03-4462-ce95-a524-d91464e797c8@enterprisedb.com --- src/backend/replication/logical/launcher.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c index 6f25b2c2ad..0adb2d1d66 100644 --- a/src/backend/replication/logical/launcher.c +++ b/src/backend/replication/logical/launcher.c @@ -344,11 +344,11 @@ logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid, } /* - * If we reached the sync worker limit per subscription, just exit - * silently as we might get here because of an otherwise harmless race - * condition. + * We don't allow to invoke more sync workers once we have reached the sync + * worker limit per subscription. So, just return silently as we might get + * here because of an otherwise harmless race condition. */ - if (nsyncworkers >= max_sync_workers_per_subscription) + if (OidIsValid(relid) && nsyncworkers >= max_sync_workers_per_subscription) { LWLockRelease(LogicalRepWorkerLock); return; From a62bff74b135b191de0417d1cc8ec52f144c8fe7 Mon Sep 17 00:00:00 2001 From: Tatsuo Ishii Date: Tue, 19 Apr 2022 17:04:27 +0900 Subject: [PATCH 547/772] Fix aggregate logging of pgbench. Remove meaningless "failures" column from the aggregate logging. It was just a sum of "serialization failures" and "deadlock failures". Pointed out by Tom Lane. Patch reviewed by Fabien COELHO. Discussion: https://postgr.es/m/4183048.1649536705%40sss.pgh.pa.us --- doc/src/sgml/ref/pgbench.sgml | 13 ++----------- src/bin/pgbench/pgbench.c | 5 +---- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/doc/src/sgml/ref/pgbench.sgml b/doc/src/sgml/ref/pgbench.sgml index 387a836287..dbae4e2321 100644 --- a/doc/src/sgml/ref/pgbench.sgml +++ b/doc/src/sgml/ref/pgbench.sgml @@ -2591,15 +2591,6 @@ END; - - failures - - - number of transactions that ended with a failed SQL command - - - - serialization_failures @@ -2629,8 +2620,8 @@ END; pgbench --aggregate-interval=10 --time=20 --client=10 --log --rate=1000 --latency-limit=10 --failures-detailed --max-tries=10 test -1649114136 5815 27552565 177846919143 1078 21716 2756787 7264696105 0 9661 0 7854 31472 4022 4022 0 -1649114146 5958 28460110 182785513108 1083 20391 2539395 6411761497 0 7268 0 8127 32595 4101 4101 0 +1650260552 5178 26171317 177284491527 1136 44462 2647617 7321113867 0 9866 64 7564 28340 4148 0 +1650260562 4808 25573984 220121792172 1171 62083 3037380 9666800914 0 9998 598 7392 26621 4527 0 diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index e63cea56a1..f8bcb1ab6d 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -4498,7 +4498,6 @@ doLog(TState *thread, CState *st, int64 skipped = 0; int64 serialization_failures = 0; int64 deadlock_failures = 0; - int64 serialization_or_deadlock_failures = 0; int64 retried = 0; int64 retries = 0; @@ -4540,9 +4539,7 @@ doLog(TState *thread, CState *st, serialization_failures = agg->serialization_failures; deadlock_failures = agg->deadlock_failures; } - serialization_or_deadlock_failures = serialization_failures + deadlock_failures; - fprintf(logfile, " " INT64_FORMAT " " INT64_FORMAT " " INT64_FORMAT, - serialization_or_deadlock_failures, + fprintf(logfile, " " INT64_FORMAT " " INT64_FORMAT, serialization_failures, deadlock_failures); From f2a2bf66c87e14f07aefe23cbbe2f2d9edcd9734 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 19 Apr 2022 20:38:53 +0200 Subject: [PATCH 548/772] Fix extract epoch from interval calculation The new numeric code for extract epoch from interval accidentally truncated the DAYS_PER_YEAR value to an integer, leading to results that mismatched the floating-point interval_part calculations. The commit a2da77cdb4661826482ebf2ddba1f953bc74afe4 that introduced this actually contains the regression test change that this reverts. I suppose this was missed at the time. Reported-by: Joseph Koshakow Reviewed-by: Tom Lane Discussion: https://www.postgresql.org/message-id/flat/CAAvxfHd5n%3D13NYA2q_tUq%3D3%3DSuWU-CufmTf-Ozj%3DfrEgt7pXwQ%40mail.gmail.com --- src/backend/utils/adt/timestamp.c | 14 ++++++++++---- src/test/regress/expected/interval.out | 4 ++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index da73796eac..552b631ba7 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -5308,10 +5308,16 @@ interval_part_common(PG_FUNCTION_ARGS, bool retnumeric) int64 secs_from_day_month; int64 val; - /* this always fits into int64 */ - secs_from_day_month = ((int64) DAYS_PER_YEAR * (interval->month / MONTHS_PER_YEAR) + - (int64) DAYS_PER_MONTH * (interval->month % MONTHS_PER_YEAR) + - interval->day) * SECS_PER_DAY; + /* + * To do this calculation in integer arithmetic even though + * DAYS_PER_YEAR is fractional, multiply everything by 4 and then + * divide by 4 again at the end. This relies on DAYS_PER_YEAR + * being a multiple of 0.25 and on SECS_PER_DAY being a multiple + * of 4. + */ + secs_from_day_month = ((int64) (4 * DAYS_PER_YEAR) * (interval->month / MONTHS_PER_YEAR) + + (int64) (4 * DAYS_PER_MONTH) * (interval->month % MONTHS_PER_YEAR) + + (int64) 4 * interval->day) * (SECS_PER_DAY / 4); /*--- * result = secs_from_day_month + interval->time / 1'000'000 diff --git a/src/test/regress/expected/interval.out b/src/test/regress/expected/interval.out index 03f77c01dc..00885acd1d 100644 --- a/src/test/regress/expected/interval.out +++ b/src/test/regress/expected/interval.out @@ -1655,11 +1655,11 @@ SELECT f1, @ 1 min | 0 | 0.000 | 0.000000 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 60.000000 @ 5 hours | 0 | 0.000 | 0.000000 | 0 | 5 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 18000.000000 @ 10 days | 0 | 0.000 | 0.000000 | 0 | 0 | 10 | 0 | 1 | 0 | 0 | 0 | 0 | 864000.000000 - @ 34 years | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 0 | 1 | 34 | 3 | 0 | 0 | 1072224000.000000 + @ 34 years | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 0 | 1 | 34 | 3 | 0 | 0 | 1072958400.000000 @ 3 mons | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 3 | 2 | 0 | 0 | 0 | 0 | 7776000.000000 @ 14 secs ago | -14000000 | -14000.000 | -14.000000 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | -14.000000 @ 1 day 2 hours 3 mins 4 secs | 4000000 | 4000.000 | 4.000000 | 3 | 2 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 93784.000000 - @ 6 years | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 0 | 1 | 6 | 0 | 0 | 0 | 189216000.000000 + @ 6 years | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 0 | 1 | 6 | 0 | 0 | 0 | 189345600.000000 @ 5 mons | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 5 | 2 | 0 | 0 | 0 | 0 | 12960000.000000 @ 5 mons 12 hours | 0 | 0.000 | 0.000000 | 0 | 12 | 0 | 5 | 2 | 0 | 0 | 0 | 0 | 13003200.000000 (10 rows) From 83cca409edf276cfbd2ff691ceea1b10027c5205 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 20 Apr 2022 11:05:34 +0900 Subject: [PATCH 549/772] Remove duplicated word in comment of basebackup.c MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Oversight in 39969e2. Author: Martín Marqués Discussion: https://postgr.es/m/CABeG9LviA01oHC5h=ksLUuhMyXxmZR_tftRq6q3341CMT=j=4g@mail.gmail.com --- src/backend/replication/basebackup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index 67489192a2..5244823ff8 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -180,7 +180,7 @@ static const struct exclude_list_item excludeFiles[] = {RELCACHE_INIT_FILENAME, true}, /* - * backup_label and tablespace_map should not exist in in a running cluster + * backup_label and tablespace_map should not exist in a running cluster * capable of doing an online backup, but exclude them just in case. */ {BACKUP_LABEL_FILE, false}, From 344a225cb9d42f20df063e4d0e0d4559c5de7910 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 19 Apr 2022 23:03:59 -0400 Subject: [PATCH 550/772] Fix breakage in AlterFunction(). An ALTER FUNCTION command that tried to update both the function's proparallel property and its proconfig list failed to do the former, because it stored the new proparallel value into a tuple that was no longer the interesting one. Carelessness in 7aea8e4f2. (I did not bother with a regression test, because the only likely future breakage would be for someone to ignore the comment I added and add some other field update after the heap_modify_tuple step. A test using existing function properties could not catch that.) Per report from Bryn Llewellyn. Back-patch to all supported branches. Discussion: https://postgr.es/m/8AC9A37F-99BD-446F-A2F7-B89AD0022774@yugabyte.com --- src/backend/commands/functioncmds.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index 91f02a7eb2..00a6d282cf 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -1472,6 +1472,8 @@ AlterFunction(ParseState *pstate, AlterFunctionStmt *stmt) procForm->prosupport = newsupport; } + if (parallel_item) + procForm->proparallel = interpret_func_parallel(parallel_item); if (set_items) { Datum datum; @@ -1506,8 +1508,7 @@ AlterFunction(ParseState *pstate, AlterFunctionStmt *stmt) tup = heap_modify_tuple(tup, RelationGetDescr(rel), repl_val, repl_null, repl_repl); } - if (parallel_item) - procForm->proparallel = interpret_func_parallel(parallel_item); + /* DO NOT put more touches of procForm below here; it's now dangling. */ /* Do the update */ CatalogTupleUpdate(rel, &tup->t_self, tup); From 7bdd489d3d32d6ab5af1d2b22eaf8cc7dc148027 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Wed, 20 Apr 2022 15:17:56 +1200 Subject: [PATCH 551/772] Doc: use "an SQL" consistently rather than "a SQL" Similarly to what was done in 04539e73f, we standardized on SQL being pronounced "es-que-ell" rather than "sequel" in our documentation. Two inconsistencies have crept in during the v15 cycle. The others existed before but were missed in 04539e73f due to none of the searches accounting for "SQL" being wrapped in tags. As with 04539e73f, we don't touch code comments here in order to not create unnecessary back-patching pain. Discussion: https://postgr.es/m/CAApHDvpML27UqFXnrYO1MJddsKVMQoiZisPvsAGhKE_tsKXquw%40mail.gmail.com --- doc/src/sgml/func.sgml | 4 ++-- doc/src/sgml/ref/select.sgml | 2 +- doc/src/sgml/xfunc.sgml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 489184a4f0..5804069e6a 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -19007,7 +19007,7 @@ SELECT JSON_VALUE(jsonb '[1,2]', 'strict $[*]' DEFAULT 1 ON ERROR); Defines whether to wrap a returned sequence of SQL/JSON - items into a SQL/JSON array. + items into an SQL/JSON array. @@ -19819,7 +19819,7 @@ JSON_SERIALIZE ( Description - The JSON_SERIALIZE function transforms a SQL/JSON value + The JSON_SERIALIZE function transforms an SQL/JSON value into a character or binary string. diff --git a/doc/src/sgml/ref/select.sgml b/doc/src/sgml/ref/select.sgml index 16bbab52c3..8e5b83dfde 100644 --- a/doc/src/sgml/ref/select.sgml +++ b/doc/src/sgml/ref/select.sgml @@ -1715,7 +1715,7 @@ SELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss ORDER BY column1; At the REPEATABLE READ or SERIALIZABLE transaction isolation level this would cause a serialization failure (with - a SQLSTATE of '40001'), so there is + an SQLSTATE of '40001'), so there is no possibility of receiving rows out of order under these isolation levels. diff --git a/doc/src/sgml/xfunc.sgml b/doc/src/sgml/xfunc.sgml index a34723030b..fb8255f136 100644 --- a/doc/src/sgml/xfunc.sgml +++ b/doc/src/sgml/xfunc.sgml @@ -445,7 +445,7 @@ $$ LANGUAGE SQL; If the final SELECT or RETURNING - clause in a SQL function does not return exactly + clause in an SQL function does not return exactly the function's declared result type, PostgreSQL will automatically cast the value to the required type, if that is possible with an implicit From 74547b9c23f9f7ecfc6511e055982b8d5f51ae88 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Wed, 20 Apr 2022 08:59:55 +0530 Subject: [PATCH 552/772] Stabilize streaming tests in test_decoding. We have some streaming tests that rely on the size of changes which can fail if there are additional changes like invalidation messages by background activity like auto analyze. Avoid such failures by increasing autovacuum_naptime to a reasonably high value (1d). Author: Dilip Kumar Backpatch-through: 14 Discussion: https://postgr.es/m/1958043.1650129119@sss.pgh.pa.us --- contrib/test_decoding/logical.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/test_decoding/logical.conf b/contrib/test_decoding/logical.conf index 07c4d3d7c8..cc12f2542b 100644 --- a/contrib/test_decoding/logical.conf +++ b/contrib/test_decoding/logical.conf @@ -1,3 +1,4 @@ wal_level = logical max_replication_slots = 4 logical_decoding_work_mem = 64kB +autovacuum_naptime = 1d From 3dcc6bf4068a29be2bebee80bb919f8057af0fd9 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 20 Apr 2022 10:34:58 +0200 Subject: [PATCH 553/772] ExecModifyTable: use context.planSlot instead of planSlot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There's no reason to keep a separate local variable when we have a place for it elsewhere. This allows to simplify some code. Reviewed-by: Michaël Paquier Discussion: https://postgr.es/m/202204191345.qerjy3kxi3eb@alvherre.pgsql --- src/backend/executor/nodeModifyTable.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 171575cd73..0de6abd5bb 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -3452,7 +3452,6 @@ ExecModifyTable(PlanState *pstate) ResultRelInfo *resultRelInfo; PlanState *subplanstate; TupleTableSlot *slot; - TupleTableSlot *planSlot; TupleTableSlot *oldSlot; ItemPointerData tuple_ctid; HeapTupleData oldtupdata; @@ -3525,10 +3524,10 @@ ExecModifyTable(PlanState *pstate) if (pstate->ps_ExprContext) ResetExprContext(pstate->ps_ExprContext); - planSlot = ExecProcNode(subplanstate); + context.planSlot = ExecProcNode(subplanstate); /* No more tuples to process? */ - if (TupIsNull(planSlot)) + if (TupIsNull(context.planSlot)) break; /* @@ -3542,7 +3541,7 @@ ExecModifyTable(PlanState *pstate) bool isNull; Oid resultoid; - datum = ExecGetJunkAttribute(planSlot, node->mt_resultOidAttno, + datum = ExecGetJunkAttribute(context.planSlot, node->mt_resultOidAttno, &isNull); if (isNull) { @@ -3556,9 +3555,8 @@ ExecModifyTable(PlanState *pstate) */ if (operation == CMD_MERGE) { - EvalPlanQualSetSlot(&node->mt_epqstate, planSlot); + EvalPlanQualSetSlot(&node->mt_epqstate, context.planSlot); - context.planSlot = planSlot; context.lockmode = 0; ExecMerge(&context, node->resultRelInfo, NULL, node->canSetTag); @@ -3589,13 +3587,13 @@ ExecModifyTable(PlanState *pstate) * ExecProcessReturning by IterateDirectModify, so no need to * provide it here. */ - slot = ExecProcessReturning(resultRelInfo, NULL, planSlot); + slot = ExecProcessReturning(resultRelInfo, NULL, context.planSlot); return slot; } - EvalPlanQualSetSlot(&node->mt_epqstate, planSlot); - slot = planSlot; + EvalPlanQualSetSlot(&node->mt_epqstate, context.planSlot); + slot = context.planSlot; tupleid = NULL; oldtuple = NULL; @@ -3637,9 +3635,8 @@ ExecModifyTable(PlanState *pstate) { if (operation == CMD_MERGE) { - EvalPlanQualSetSlot(&node->mt_epqstate, planSlot); + EvalPlanQualSetSlot(&node->mt_epqstate, context.planSlot); - context.planSlot = planSlot; context.lockmode = 0; ExecMerge(&context, node->resultRelInfo, NULL, node->canSetTag); @@ -3698,7 +3695,6 @@ ExecModifyTable(PlanState *pstate) } /* complete context setup */ - context.planSlot = planSlot; context.lockmode = 0; switch (operation) @@ -3707,7 +3703,7 @@ ExecModifyTable(PlanState *pstate) /* Initialize projection info if first time for this table */ if (unlikely(!resultRelInfo->ri_projectNewInfoValid)) ExecInitInsertProjection(node, resultRelInfo); - slot = ExecGetInsertNewTuple(resultRelInfo, planSlot); + slot = ExecGetInsertNewTuple(resultRelInfo, context.planSlot); slot = ExecInsert(&context, resultRelInfo, slot, node->canSetTag, NULL, NULL); break; @@ -3737,7 +3733,7 @@ ExecModifyTable(PlanState *pstate) oldSlot)) elog(ERROR, "failed to fetch tuple being updated"); } - slot = internalGetUpdateNewTuple(resultRelInfo, planSlot, + slot = internalGetUpdateNewTuple(resultRelInfo, context.planSlot, oldSlot, NULL); context.GetUpdateNewTuple = internalGetUpdateNewTuple; context.relaction = NULL; From a87e75956926f966d90bdd1a6bd495cf59cdc3ad Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 20 Apr 2022 11:18:04 +0200 Subject: [PATCH 554/772] Move ModifyTableContext->lockmode to UpdateContext MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Should have been done this way to start with, but I failed to notice This way we avoid some pointless initialization, and better contains the variable to exist in the scope where it is really used. Reviewed-by: Michaël Paquier Discussion: https://postgr.es/m/202204191345.qerjy3kxi3eb@alvherre.pgsql --- src/backend/executor/nodeModifyTable.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 0de6abd5bb..982acfdad9 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -116,12 +116,6 @@ typedef struct ModifyTableContext * cross-partition UPDATE */ TupleTableSlot *cpUpdateReturningSlot; - - /* - * Lock mode to acquire on the latest tuple version before performing - * EvalPlanQual on it - */ - LockTupleMode lockmode; } ModifyTableContext; /* @@ -132,6 +126,12 @@ typedef struct UpdateContext bool updated; /* did UPDATE actually occur? */ bool updateIndexes; /* index update required? */ bool crossPartUpdate; /* was it a cross-partition update? */ + + /* + * Lock mode to acquire on the latest tuple version before performing + * EvalPlanQual on it + */ + LockTupleMode lockmode; } UpdateContext; @@ -1971,7 +1971,7 @@ lreplace:; estate->es_snapshot, estate->es_crosscheck_snapshot, true /* wait for commit */ , - &context->tmfd, &context->lockmode, + &context->tmfd, &updateCxt->lockmode, &updateCxt->updateIndexes); if (result == TM_Ok) updateCxt->updated = true; @@ -2251,7 +2251,7 @@ ExecUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, result = table_tuple_lock(resultRelationDesc, tupleid, estate->es_snapshot, inputslot, estate->es_output_cid, - context->lockmode, LockWaitBlock, + updateCxt.lockmode, LockWaitBlock, TUPLE_LOCK_FLAG_FIND_LAST_VERSION, &context->tmfd); @@ -3557,8 +3557,6 @@ ExecModifyTable(PlanState *pstate) { EvalPlanQualSetSlot(&node->mt_epqstate, context.planSlot); - context.lockmode = 0; - ExecMerge(&context, node->resultRelInfo, NULL, node->canSetTag); continue; /* no RETURNING support yet */ } @@ -3637,8 +3635,6 @@ ExecModifyTable(PlanState *pstate) { EvalPlanQualSetSlot(&node->mt_epqstate, context.planSlot); - context.lockmode = 0; - ExecMerge(&context, node->resultRelInfo, NULL, node->canSetTag); continue; /* no RETURNING support yet */ } @@ -3694,9 +3690,6 @@ ExecModifyTable(PlanState *pstate) } } - /* complete context setup */ - context.lockmode = 0; - switch (operation) { case CMD_INSERT: From e70813fbc4aaca35ec012d5a426706bd54e4acab Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 20 Apr 2022 11:44:08 +0200 Subject: [PATCH 555/772] set_deparse_plan: Reuse variable to appease Coverity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Coverity complains that dpns->outer_plan is deferenced (to obtain ->targetlist) when possibly NULL. We can avoid this by using dpns->outer_tlist instead, which was already obtained a few lines up. The fact that we end up with dpns->inner_tlist = dpns->outer_tlist is a bit suspicious-looking and maybe worthy of more investigation, but I'll leave that for another day. Reviewed-by: Michaël Paquier Discussion: https://postgr.es/m/202204191345.qerjy3kxi3eb@alvherre.pgsql --- src/backend/utils/adt/ruleutils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 7e08d7fe6c..5d49f564a2 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -4996,7 +4996,7 @@ set_deparse_plan(deparse_namespace *dpns, Plan *plan) if (IsA(plan, ModifyTable)) { if (((ModifyTable *) plan)->operation == CMD_MERGE) - dpns->inner_tlist = dpns->outer_plan->targetlist; + dpns->inner_tlist = dpns->outer_tlist; else dpns->inner_tlist = ((ModifyTable *) plan)->exclRelTlist; } From 6c0f9f60f1c24aead1bfdd0ed294ac5b6f1d1ac1 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 20 Apr 2022 16:11:14 +0200 Subject: [PATCH 556/772] Fix incorrect format placeholders --- src/bin/pgbench/pgbench.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index f8bcb1ab6d..02f250f511 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -3515,11 +3515,11 @@ printVerboseErrorMessages(CState *st, pg_time_usec_t *now, bool is_retry) (is_retry ? "repeats the transaction after the error" : "ends the failed transaction")); - appendPQExpBuffer(buf, " (try %d", st->tries); + appendPQExpBuffer(buf, " (try %u", st->tries); /* Print max_tries if it is not unlimitted. */ if (max_tries) - appendPQExpBuffer(buf, "/%d", max_tries); + appendPQExpBuffer(buf, "/%u", max_tries); /* * If the latency limit is used, print a percentage of the current transaction @@ -4569,7 +4569,7 @@ doLog(TState *thread, CState *st, if (throttle_delay) fprintf(logfile, " %.0f", lag); if (max_tries != 1) - fprintf(logfile, " %d", st->tries - 1); + fprintf(logfile, " %u", st->tries - 1); fputc('\n', logfile); } } @@ -6262,7 +6262,7 @@ printResults(StatsData *total, printf("number of threads: %d\n", nthreads); if (max_tries) - printf("maximum number of tries: %d\n", max_tries); + printf("maximum number of tries: %u\n", max_tries); if (duration <= 0) { From 836af9756b742f5a8ae77b4bef9d27311772a13c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 20 Apr 2022 11:04:28 -0400 Subject: [PATCH 557/772] Remove trailing whitespace from *.sgml files. Historically we've been lax about this, but seeing that we're not lax in C files, there doesn't seem to be a good reason to be so in the documentation. Remove the existing occurrences (mostly though not entirely in copied-n-pasted psql output), and modify .gitattributes so that "git diff --check" will warn about future cases. While at it, add *.pm to the set of extensions .gitattributes knows about, and remove some obsolete entries for files that we don't have in the tree anymore. Per followup discussion of commit 5a892c9b1. Discussion: https://postgr.es/m/E1nfcV1-000kOR-E5@gemulon.postgresql.org --- .gitattributes | 7 +- doc/src/sgml/advanced.sgml | 8 +- doc/src/sgml/backup.sgml | 2 +- doc/src/sgml/bloom.sgml | 8 +- doc/src/sgml/charset.sgml | 12 +-- doc/src/sgml/datatype.sgml | 32 ++++---- doc/src/sgml/dblink.sgml | 6 +- doc/src/sgml/ddl.sgml | 4 +- doc/src/sgml/fdwhandler.sgml | 2 +- doc/src/sgml/func.sgml | 92 +++++++++++----------- doc/src/sgml/high-availability.sgml | 2 +- doc/src/sgml/hstore.sgml | 8 +- doc/src/sgml/json.sgml | 6 +- doc/src/sgml/logical-replication.sgml | 58 +++++++------- doc/src/sgml/logicaldecoding.sgml | 26 +++---- doc/src/sgml/monitoring.sgml | 2 +- doc/src/sgml/pageinspect.sgml | 26 +++---- doc/src/sgml/parallel.sgml | 2 +- doc/src/sgml/perform.sgml | 4 +- doc/src/sgml/pgfreespacemap.sgml | 4 +- doc/src/sgml/pgstatstatements.sgml | 4 +- doc/src/sgml/pgsurgery.sgml | 10 +-- doc/src/sgml/pgwalinspect.sgml | 6 +- doc/src/sgml/planstats.sgml | 14 ++-- doc/src/sgml/plperl.sgml | 2 +- doc/src/sgml/plpgsql.sgml | 4 +- doc/src/sgml/postgres-fdw.sgml | 6 +- doc/src/sgml/ref/create_index.sgml | 4 +- doc/src/sgml/ref/explain.sgml | 4 +- doc/src/sgml/ref/pgarchivecleanup.sgml | 3 +- doc/src/sgml/ref/pgtestfsync.sgml | 2 +- doc/src/sgml/ref/psql-ref.sgml | 14 ++-- doc/src/sgml/ref/reindex.sgml | 4 +- doc/src/sgml/ref/rollback_to.sgml | 4 +- doc/src/sgml/ref/select.sgml | 2 +- doc/src/sgml/ref/set_role.sgml | 4 +- doc/src/sgml/ref/set_session_auth.sgml | 4 +- doc/src/sgml/ref/show.sgml | 2 +- doc/src/sgml/release-15.sgml | 4 +- doc/src/sgml/rules.sgml | 8 +- doc/src/sgml/syntax.sgml | 14 ++-- doc/src/sgml/test-decoding.sgml | 2 +- doc/src/sgml/textsearch.sgml | 102 ++++++++++++------------- doc/src/sgml/xaggr.sgml | 4 +- doc/src/sgml/xfunc.sgml | 16 ++-- 45 files changed, 275 insertions(+), 279 deletions(-) diff --git a/.gitattributes b/.gitattributes index f9868677fa..4e4e26e34b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,8 +1,9 @@ * whitespace=space-before-tab,trailing-space *.[chly] whitespace=space-before-tab,trailing-space,indent-with-non-tab,tabwidth=4 *.pl whitespace=space-before-tab,trailing-space,tabwidth=4 +*.pm whitespace=space-before-tab,trailing-space,tabwidth=4 *.po whitespace=space-before-tab,trailing-space,tab-in-indent,-blank-at-eof -*.sgml whitespace=space-before-tab,trailing-space,tab-in-indent,-blank-at-eol +*.sgml whitespace=space-before-tab,trailing-space,tab-in-indent *.x[ms]l whitespace=space-before-tab,trailing-space,tab-in-indent # Avoid confusing ASCII underlines with leftover merge conflict markers @@ -17,9 +18,6 @@ src/backend/utils/Gen_dummy_probes.pl.prolog whitespace=-blank-at-eof # Test output files that contain extra whitespace *.out -whitespace -contrib/*/output/*.source -whitespace -src/pl/plpgsql/src/output/*.source -whitespace -src/test/regress/output/*.source -whitespace src/interfaces/ecpg/test/expected/* -whitespace src/interfaces/libpq/test/expected.out whitespace=-blank-at-eof @@ -27,7 +25,6 @@ src/interfaces/libpq/test/expected.out whitespace=-blank-at-eof configure -whitespace ppport.h -whitespace src/backend/regex/COPYRIGHT -whitespace -src/backend/regex/re_syntax.n -whitespace src/backend/snowball/libstemmer/*.c -whitespace src/backend/utils/mb/Unicode/*-std.txt -whitespace src/include/snowball/libstemmer/* -whitespace diff --git a/doc/src/sgml/advanced.sgml b/doc/src/sgml/advanced.sgml index 71ae423f63..755c9f1485 100644 --- a/doc/src/sgml/advanced.sgml +++ b/doc/src/sgml/advanced.sgml @@ -344,7 +344,7 @@ SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM emps - depname | empno | salary | avg + depname | empno | salary | avg -----------+-------+--------+----------------------- develop | 11 | 5200 | 5020.0000000000000000 develop | 7 | 4200 | 5020.0000000000000000 @@ -394,7 +394,7 @@ FROM empsalary; - depname | empno | salary | rank + depname | empno | salary | rank -----------+-------+--------+------ develop | 8 | 6000 | 1 develop | 10 | 5200 | 2 @@ -458,7 +458,7 @@ SELECT salary, sum(salary) OVER () FROM empsalary; - salary | sum + salary | sum --------+------- 5200 | 47100 5000 | 47100 @@ -487,7 +487,7 @@ SELECT salary, sum(salary) OVER (ORDER BY salary) FROM empsalary; - salary | sum + salary | sum --------+------- 3500 | 3500 3900 | 7400 diff --git a/doc/src/sgml/backup.sgml b/doc/src/sgml/backup.sgml index 5b147a746d..73a774d3d7 100644 --- a/doc/src/sgml/backup.sgml +++ b/doc/src/sgml/backup.sgml @@ -929,7 +929,7 @@ SELECT * FROM pg_backup_stop(wait_for_archive => true); backup_label in the root directory of the backup. The third field should be written to a file named tablespace_map unless the field is empty. These files are - vital to the backup working and must be written byte for byte without + vital to the backup working and must be written byte for byte without modification, which may require opening the file in binary mode. diff --git a/doc/src/sgml/bloom.sgml b/doc/src/sgml/bloom.sgml index d1cf9ac24a..a3f51cfdc4 100644 --- a/doc/src/sgml/bloom.sgml +++ b/doc/src/sgml/bloom.sgml @@ -116,7 +116,7 @@ SELECT 10000000 A sequential scan over this large table takes a long time: =# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; - QUERY PLAN + QUERY PLAN -------------------------------------------------------------------&zwsp;----------------------------------- Seq Scan on tbloom (cost=0.00..2137.14 rows=3 width=24) (actual time=16.971..16.971 rows=0 loops=1) Filter: ((i2 = 898732) AND (i5 = 123451)) @@ -139,7 +139,7 @@ CREATE INDEX 3976 kB (1 row) =# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; - QUERY PLAN + QUERY PLAN -------------------------------------------------------------------&zwsp;----------------------------------- Seq Scan on tbloom (cost=0.00..2137.00 rows=2 width=24) (actual time=12.805..12.805 rows=0 loops=1) Filter: ((i2 = 898732) AND (i5 = 123451)) @@ -162,7 +162,7 @@ CREATE INDEX 1584 kB (1 row) =# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; - QUERY PLAN + QUERY PLAN -------------------------------------------------------------------&zwsp;-------------------------------------------------- Bitmap Heap Scan on tbloom (cost=1792.00..1799.69 rows=2 width=24) (actual time=0.388..0.388 rows=0 loops=1) Recheck Cond: ((i2 = 898732) AND (i5 = 123451)) @@ -195,7 +195,7 @@ CREATE INDEX =# CREATE INDEX btreeidx6 ON tbloom (i6); CREATE INDEX =# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; - QUERY PLAN + QUERY PLAN -------------------------------------------------------------------&zwsp;-------------------------------------------------------- Bitmap Heap Scan on tbloom (cost=24.34..32.03 rows=2 width=24) (actual time=0.028..0.029 rows=0 loops=1) Recheck Cond: ((i5 = 123451) AND (i2 = 898732)) diff --git a/doc/src/sgml/charset.sgml b/doc/src/sgml/charset.sgml index b95303fb89..445fd175d8 100644 --- a/doc/src/sgml/charset.sgml +++ b/doc/src/sgml/charset.sgml @@ -1574,13 +1574,13 @@ CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE= $ psql -l List of databases - Name | Owner | Encoding | Collation | Ctype | Access Privileges + Name | Owner | Encoding | Collation | Ctype | Access Privileges -----------+----------+-----------+-------------+-------------+------------------------------------- - clocaledb | hlinnaka | SQL_ASCII | C | C | - englishdb | hlinnaka | UTF8 | en_GB.UTF8 | en_GB.UTF8 | - japanese | hlinnaka | UTF8 | ja_JP.UTF8 | ja_JP.UTF8 | - korean | hlinnaka | EUC_KR | ko_KR.euckr | ko_KR.euckr | - postgres | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | + clocaledb | hlinnaka | SQL_ASCII | C | C | + englishdb | hlinnaka | UTF8 | en_GB.UTF8 | en_GB.UTF8 | + japanese | hlinnaka | UTF8 | ja_JP.UTF8 | ja_JP.UTF8 | + korean | hlinnaka | EUC_KR | ko_KR.euckr | ko_KR.euckr | + postgres | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | template0 | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | {=c/hlinnaka,hlinnaka=CTc/hlinnaka} template1 | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | {=c/hlinnaka,hlinnaka=CTc/hlinnaka} (7 rows) diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml index 0932c812da..9b0c6c6926 100644 --- a/doc/src/sgml/datatype.sgml +++ b/doc/src/sgml/datatype.sgml @@ -3177,7 +3177,7 @@ CREATE TABLE person ( ); INSERT INTO person VALUES ('Moe', 'happy'); SELECT * FROM person WHERE current_mood = 'happy'; - name | current_mood + name | current_mood ------+-------------- Moe | happy (1 row) @@ -3198,14 +3198,14 @@ SELECT * FROM person WHERE current_mood = 'happy'; INSERT INTO person VALUES ('Larry', 'sad'); INSERT INTO person VALUES ('Curly', 'ok'); SELECT * FROM person WHERE current_mood > 'sad'; - name | current_mood + name | current_mood -------+-------------- Moe | happy Curly | ok (2 rows) SELECT * FROM person WHERE current_mood > 'sad' ORDER BY current_mood; - name | current_mood + name | current_mood -------+-------------- Curly | ok Moe | happy @@ -3214,7 +3214,7 @@ SELECT * FROM person WHERE current_mood > 'sad' ORDER BY current_mood; SELECT name FROM person WHERE current_mood = (SELECT MIN(current_mood) FROM person); - name + name ------- Larry (1 row) @@ -3253,7 +3253,7 @@ ERROR: operator does not exist: mood = happiness SELECT person.name, holidays.num_weeks FROM person, holidays WHERE person.current_mood::text = holidays.happiness::text; - name | num_weeks + name | num_weeks ------+----------- Moe | 4 (1 row) @@ -3982,7 +3982,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays SELECT macaddr8_set7bit('08:00:2b:01:02:03'); - macaddr8_set7bit + macaddr8_set7bit ------------------------- 0a:00:2b:ff:fe:01:02:03 (1 row) @@ -4124,7 +4124,7 @@ SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector; SELECT $$the lexeme ' ' contains spaces$$::tsvector; - tsvector + tsvector ------------------------------------------- ' ' 'contains' 'lexeme' 'spaces' 'the' @@ -4135,7 +4135,7 @@ SELECT $$the lexeme ' ' contains spaces$$::tsvector; SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector; - tsvector + tsvector ------------------------------------------------ 'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the' @@ -4165,7 +4165,7 @@ SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::ts SELECT 'a:1A fat:2B,4C cat:5D'::tsvector; - tsvector + tsvector ---------------------------- 'a':1A 'cat':5 'fat':2B,4C @@ -4184,7 +4184,7 @@ SELECT 'a:1A fat:2B,4C cat:5D'::tsvector; SELECT 'The Fat Rats'::tsvector; - tsvector + tsvector -------------------- 'Fat' 'Rats' 'The' @@ -4197,7 +4197,7 @@ SELECT 'The Fat Rats'::tsvector; SELECT to_tsvector('english', 'The Fat Rats'); - to_tsvector + to_tsvector ----------------- 'fat':2 'rat':3 @@ -4239,17 +4239,17 @@ SELECT to_tsvector('english', 'The Fat Rats'); SELECT 'fat & rat'::tsquery; - tsquery + tsquery --------------- 'fat' & 'rat' SELECT 'fat & (rat | cat)'::tsquery; - tsquery + tsquery --------------------------- 'fat' & ( 'rat' | 'cat' ) SELECT 'fat & rat & ! cat'::tsquery; - tsquery + tsquery ------------------------ 'fat' & 'rat' & !'cat' @@ -4273,7 +4273,7 @@ SELECT 'fat:ab & cat'::tsquery; to specify prefix matching: SELECT 'super:*'::tsquery; - tsquery + tsquery ----------- 'super':* @@ -4290,7 +4290,7 @@ SELECT 'super:*'::tsquery; SELECT to_tsquery('Fat:ab & Cats'); - to_tsquery + to_tsquery ------------------ 'fat':AB & 'cat' diff --git a/doc/src/sgml/dblink.sgml b/doc/src/sgml/dblink.sgml index 4ab38bcc99..50c49f533b 100644 --- a/doc/src/sgml/dblink.sgml +++ b/doc/src/sgml/dblink.sgml @@ -161,13 +161,13 @@ GRANT SELECT ON TABLE foo TO regress_dblink_user; \set ORIGINAL_USER :USER \c - regress_dblink_user SELECT dblink_connect('myconn', 'fdtest'); - dblink_connect + dblink_connect ---------------- OK (1 row) SELECT * FROM dblink('myconn', 'SELECT * FROM foo') AS t(a int, b text, c text[]); - a | b | c + a | b | c ----+---+--------------- 0 | a | {a0,b0,c0} 1 | b | {a1,b1,c1} @@ -1397,7 +1397,7 @@ dblink_get_notify(text connname) returns setof (notify_name text, be_pid int, ex SELECT dblink_exec('LISTEN virtual'); - dblink_exec + dblink_exec ------------- LISTEN (1 row) diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml index 77ce39766c..f2ac1ba003 100644 --- a/doc/src/sgml/ddl.sgml +++ b/doc/src/sgml/ddl.sgml @@ -2619,13 +2619,13 @@ CREATE POLICY admin_local_only ON passwd AS RESTRICTIVE TO admin => SELECT current_user; - current_user + current_user -------------- admin (1 row) => select inet_client_addr(); - inet_client_addr + inet_client_addr ------------------ 127.0.0.1 (1 row) diff --git a/doc/src/sgml/fdwhandler.sgml b/doc/src/sgml/fdwhandler.sgml index dbf5dd3d15..d0b5951019 100644 --- a/doc/src/sgml/fdwhandler.sgml +++ b/doc/src/sgml/fdwhandler.sgml @@ -1089,7 +1089,7 @@ ExecForeignTruncate(List *rels, requested in the original TRUNCATE command, respectively. - + If restart_seqs is true, the original TRUNCATE command requested the diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 5804069e6a..396359883d 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -6011,44 +6011,44 @@ regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, 3, 'i') Some examples: SELECT foo FROM regexp_split_to_table('the quick brown fox jumps over the lazy dog', '\s+') AS foo; - foo + foo ------- - the - quick - brown - fox - jumps - over - the - lazy - dog + the + quick + brown + fox + jumps + over + the + lazy + dog (9 rows) SELECT regexp_split_to_array('the quick brown fox jumps over the lazy dog', '\s+'); - regexp_split_to_array + regexp_split_to_array ----------------------------------------------- {the,quick,brown,fox,jumps,over,the,lazy,dog} (1 row) SELECT foo FROM regexp_split_to_table('the quick brown fox', '\s*') AS foo; - foo + foo ----- - t - h - e - q - u - i - c - k - b - r - o - w - n - f - o - x + t + h + e + q + u + i + c + k + b + r + o + w + n + f + o + x (16 rows) @@ -14400,32 +14400,32 @@ SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY VALUE 'T '); - xml_is_well_formed + xml_is_well_formed -------------------- f (1 row) SELECT xml_is_well_formed(''); - xml_is_well_formed + xml_is_well_formed -------------------- t (1 row) SET xmloption TO CONTENT; SELECT xml_is_well_formed('abc'); - xml_is_well_formed + xml_is_well_formed -------------------- t (1 row) SELECT xml_is_well_formed_document('bar'); - xml_is_well_formed_document + xml_is_well_formed_document ----------------------------- t (1 row) SELECT xml_is_well_formed_document('bar'); - xml_is_well_formed_document + xml_is_well_formed_document ----------------------------- f (1 row) @@ -14492,7 +14492,7 @@ SELECT xml_is_well_formed_document('test', ARRAY[ARRAY['my', 'http://example.com/']]); - xpath + xpath -------- {test} (1 row) @@ -14540,7 +14540,7 @@ SELECT xpath('//mydefns:b/text()', 'testtest', ARRAY[ARRAY['my', 'http://example.com/']]); - xpath_exists + xpath_exists -------------- t (1 row) @@ -14773,7 +14773,7 @@ SELECT xmltable.* 'concat(SIZE[@unit!="sq_km"], " ", SIZE[@unit!="sq_km"]/@unit)', premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); - id | ordinality | COUNTRY_NAME | country_id | size_sq_km | size_other | premier_name + id | ordinality | COUNTRY_NAME | country_id | size_sq_km | size_other | premier_name ----+------------+--------------+------------+------------+--------------+--------------- 1 | 1 | Australia | AU | | | not specified 5 | 2 | Japan | JP | | 145935 sq_mi | Shinzo Abe @@ -14794,9 +14794,9 @@ $$ AS data; SELECT xmltable.* FROM xmlelements, XMLTABLE('/root' PASSING data COLUMNS element text); - element + element ------------------------- - Hello2a2 bbbxxxCC + Hello2a2 bbbxxxCC ]]> @@ -17769,14 +17769,14 @@ $.* ? (@ like_regex "^\\d+$") SELECT JSON('{ "a" : 123, "b": [ true, "foo" ], "a" : "bar" }'); - json + json -------------------------------------------------- { "a" : 123, "b": [ true, "foo" ], "a" : "bar" } (1 row) SELECT JSON('{"a": 123, "b": [true, "foo"], "a": "bar"}' RETURNING jsonb); - json + json ---------------------------------- {"a": "bar", "b": [true, "foo"]} (1 row) @@ -18097,7 +18097,7 @@ WHERE f.did = 103; <literal>JSON_OBJECTAGG</literal> json_objectagg - + JSON_OBJECTAGG ( { key_expression { VALUE | ':' } value_expression } @@ -18906,7 +18906,7 @@ SELECT JSON_VALUE('123.45', '$' RETURNING int ERROR ON ERROR); (1 row) SELECT JSON_VALUE('"03:04 2015-02-01"', '$.datetime("HH24:MI YYYY-MM-DD")' RETURNING date); - json_value + json_value ------------ 2015-02-01 (1 row) @@ -19222,7 +19222,7 @@ SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text OMIT QUOTES); - + VALUE | SCALAR | ARRAY | OBJECT @@ -19875,7 +19875,7 @@ JSON_SERIALIZE ( SELECT JSON_SERIALIZE(JSON_SCALAR('foo')); - json_serialize + json_serialize ---------------- "foo" (1 row) @@ -19890,7 +19890,7 @@ SELECT JSON_SERIALIZE('{"foo": "bar", "baz": [1, 2]}' RETURNING bytea); - + SQL/JSON Common Clauses @@ -28114,7 +28114,7 @@ SELECT collation for ('foo' COLLATE "de_DE"); to log the memory contexts of a backend process. For example: postgres=# SELECT pg_log_backend_memory_contexts(pg_backend_pid()); - pg_log_backend_memory_contexts + pg_log_backend_memory_contexts -------------------------------- t (1 row) diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml index db1bde4706..c7e402765f 100644 --- a/doc/src/sgml/high-availability.sgml +++ b/doc/src/sgml/high-availability.sgml @@ -980,7 +980,7 @@ postgres=# SELECT * FROM pg_create_physical_replication_slot('node_a_slot'); node_a_slot | postgres=# SELECT slot_name, slot_type, active FROM pg_replication_slots; - slot_name | slot_type | active + slot_name | slot_type | active -------------+-----------+-------- node_a_slot | physical | f (1 row) diff --git a/doc/src/sgml/hstore.sgml b/doc/src/sgml/hstore.sgml index 679878b3af..335d64641b 100644 --- a/doc/src/sgml/hstore.sgml +++ b/doc/src/sgml/hstore.sgml @@ -817,7 +817,7 @@ CREATE TABLE test (col1 integer, col2 text, col3 text); INSERT INTO test VALUES (123, 'foo', 'bar'); SELECT hstore(t) FROM test AS t; - hstore + hstore --------------------------------------------- "col1"=>"123", "col2"=>"foo", "col3"=>"bar" (1 row) @@ -831,9 +831,9 @@ CREATE TABLE test (col1 integer, col2 text, col3 text); SELECT * FROM populate_record(null::test, '"col1"=>"456", "col2"=>"zzz"'); - col1 | col2 | col3 + col1 | col2 | col3 ------+------+------ - 456 | zzz | + 456 | zzz | (1 row) @@ -845,7 +845,7 @@ CREATE TABLE test (col1 integer, col2 text, col3 text); INSERT INTO test VALUES (123, 'foo', 'bar'); SELECT (r).* FROM (SELECT t #= '"col3"=>"baz"' AS r FROM test t) s; - col1 | col2 | col3 + col1 | col2 | col3 ------+------+------ 123 | foo | baz (1 row) diff --git a/doc/src/sgml/json.sgml b/doc/src/sgml/json.sgml index c4223fafb6..0ffb5a708d 100644 --- a/doc/src/sgml/json.sgml +++ b/doc/src/sgml/json.sgml @@ -200,13 +200,13 @@ SELECT '{"foo": [true, "bar"], "tags": {"a": 1, "b": null}}'::json; details such as whitespace. For example, note the differences here: SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json; - json + json ------------------------------------------------- {"bar": "baz", "balance": 7.77, "active":false} (1 row) SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb; - jsonb + jsonb -------------------------------------------------- {"bar": "baz", "active": false, "balance": 7.77} (1 row) @@ -218,7 +218,7 @@ SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb; example: SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb; - json | jsonb + json | jsonb -----------------------+------------------------- {"reading": 1.230e-5} | {"reading": 0.00001230} (1 row) diff --git a/doc/src/sgml/logical-replication.sgml b/doc/src/sgml/logical-replication.sgml index bc4d700456..a0f9cecd01 100644 --- a/doc/src/sgml/logical-replication.sgml +++ b/doc/src/sgml/logical-replication.sgml @@ -118,7 +118,7 @@ any combination of INSERT, UPDATE, DELETE, and TRUNCATE, similar to how triggers are fired by particular event types. By default, all operation types are replicated. - (Row filters have no effect for TRUNCATE. See + (Row filters have no effect for TRUNCATE. See ). @@ -324,7 +324,7 @@ By default, all data from all published tables will be replicated to the - appropriate subscribers. The replicated data can be reduced by using a + appropriate subscribers. The replicated data can be reduced by using a row filter. A user might choose to use row filters for behavioral, security or performance reasons. If a published table sets a row filter, a row is replicated only if its data satisfies the row filter @@ -533,14 +533,14 @@ CREATE PUBLICATION test_pub=# \dRp+ Publication p1 - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ----------+------------+---------+---------+---------+-----------+---------- postgres | f | t | t | t | t | f Tables: "public.t1" WHERE ((a > 5) AND (c = 'NSW'::text)) Publication p2 - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ----------+------------+---------+---------+---------+-----------+---------- postgres | f | t | t | t | t | f Tables: @@ -548,7 +548,7 @@ Tables: "public.t2" WHERE (e = 99) Publication p3 - Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root ----------+------------+---------+---------+---------+-----------+---------- postgres | f | t | t | t | t | f Tables: @@ -565,11 +565,11 @@ Tables: test_pub=# \d t1 Table "public.t1" - Column | Type | Collation | Nullable | Default + Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- - a | integer | | not null | - b | integer | | | - c | text | | not null | + a | integer | | not null | + b | integer | | | + c | text | | not null | Indexes: "t1_pkey" PRIMARY KEY, btree (a, c) Publications: @@ -578,11 +578,11 @@ Publications: test_pub=# \d t2 Table "public.t2" - Column | Type | Collation | Nullable | Default + Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- - d | integer | | not null | - e | integer | | | - f | integer | | | + d | integer | | not null | + e | integer | | | + f | integer | | | Indexes: "t2_pkey" PRIMARY KEY, btree (d) Publications: @@ -591,11 +591,11 @@ Publications: test_pub=# \d t3 Table "public.t3" - Column | Type | Collation | Nullable | Default + Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- - g | integer | | not null | - h | integer | | | - i | integer | | | + g | integer | | not null | + h | integer | | | + i | integer | | | Indexes: "t3_pkey" PRIMARY KEY, btree (g) Publications: @@ -636,7 +636,7 @@ INSERT 0 1 test_pub=# INSERT INTO t1 VALUES (9, 109, 'NSW'); INSERT 0 1 -test_pub=# SELECT * FROM t1; +test_pub=# SELECT * FROM t1; a | b | c ---+-----+----- 2 | 102 | NSW @@ -651,7 +651,7 @@ test_pub=# SELECT * FROM t1; test_sub=# SELECT * FROM t1; - a | b | c + a | b | c ---+-----+----- 6 | 106 | NSW 9 | 109 | NSW @@ -668,7 +668,7 @@ test_pub=# UPDATE t1 SET b = 999 WHERE a = 6; UPDATE 1 test_pub=# SELECT * FROM t1; - a | b | c + a | b | c ---+-----+----- 2 | 102 | NSW 3 | 103 | QLD @@ -682,7 +682,7 @@ test_pub=# SELECT * FROM t1; test_sub=# SELECT * FROM t1; - a | b | c + a | b | c ---+-----+----- 9 | 109 | NSW 6 | 999 | NSW @@ -700,7 +700,7 @@ test_pub=# UPDATE t1 SET a = 555 WHERE a = 2; UPDATE 1 test_pub=# SELECT * FROM t1; - a | b | c + a | b | c -----+-----+----- 3 | 103 | QLD 4 | 104 | VIC @@ -714,7 +714,7 @@ test_pub=# SELECT * FROM t1; test_sub=# SELECT * FROM t1; - a | b | c + a | b | c -----+-----+----- 9 | 109 | NSW 6 | 999 | NSW @@ -733,7 +733,7 @@ test_pub=# UPDATE t1 SET c = 'VIC' WHERE a = 9; UPDATE 1 test_pub=# SELECT * FROM t1; - a | b | c + a | b | c -----+-----+----- 3 | 103 | QLD 4 | 104 | VIC @@ -747,7 +747,7 @@ test_pub=# SELECT * FROM t1; test_sub=# SELECT * FROM t1; - a | b | c + a | b | c -----+-----+----- 6 | 999 | NSW 555 | 102 | NSW @@ -806,7 +806,7 @@ test_pub=# INSERT INTO child VALUES (3), (5), (7); INSERT 0 3 test_pub=# SELECT * FROM parent ORDER BY a; - a + a --- 2 3 @@ -818,7 +818,7 @@ test_pub=# SELECT * FROM parent ORDER BY a; test_sub=# SELECT * FROM parent ORDER BY a; - a + a --- 2 3 @@ -855,7 +855,7 @@ test_pub=# INSERT INTO child VALUES (3), (5), (7); INSERT 0 3 test_pub=# SELECT * FROM parent ORDER BY a; - a + a --- 2 3 @@ -867,7 +867,7 @@ test_pub=# SELECT * FROM parent ORDER BY a; test_sub=# SELECT * FROM child ORDER BY a; - a + a --- 5 6 diff --git a/doc/src/sgml/logicaldecoding.sgml b/doc/src/sgml/logicaldecoding.sgml index 8b2c31a87f..38ee69dccc 100644 --- a/doc/src/sgml/logicaldecoding.sgml +++ b/doc/src/sgml/logicaldecoding.sgml @@ -69,7 +69,7 @@ postgres=# SELECT slot_name, plugin, slot_type, database, active, restart_lsn, c postgres=# -- There are no changes to see yet postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL); - lsn | xid | data + lsn | xid | data -----+-----+------ (0 rows) @@ -78,7 +78,7 @@ CREATE TABLE postgres=# -- DDL isn't replicated, so all you'll see is the transaction postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL); - lsn | xid | data + lsn | xid | data -----------+-------+-------------- 0/BA2DA58 | 10297 | BEGIN 10297 0/BA5A5A0 | 10297 | COMMIT 10297 @@ -87,7 +87,7 @@ postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NU postgres=# -- Once changes are read, they're consumed and not emitted postgres=# -- in a subsequent call: postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL); - lsn | xid | data + lsn | xid | data -----+-----+------ (0 rows) @@ -97,7 +97,7 @@ postgres=*# INSERT INTO data(data) VALUES('2'); postgres=*# COMMIT; postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL); - lsn | xid | data + lsn | xid | data -----------+-------+--------------------------------------------------------- 0/BA5A688 | 10298 | BEGIN 10298 0/BA5A6F0 | 10298 | table public.data: INSERT: id[integer]:1 data[text]:'1' @@ -109,7 +109,7 @@ postgres=# INSERT INTO data(data) VALUES('3'); postgres=# -- You can also peek ahead in the change stream without consuming changes postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL); - lsn | xid | data + lsn | xid | data -----------+-------+--------------------------------------------------------- 0/BA5A8E0 | 10299 | BEGIN 10299 0/BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3' @@ -118,7 +118,7 @@ postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, N postgres=# -- The next call to pg_logical_slot_peek_changes() returns the same changes again postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL); - lsn | xid | data + lsn | xid | data -----------+-------+--------------------------------------------------------- 0/BA5A8E0 | 10299 | BEGIN 10299 0/BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3' @@ -127,7 +127,7 @@ postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, N postgres=# -- options can be passed to output plugin, to influence the formatting postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'include-timestamp', 'on'); - lsn | xid | data + lsn | xid | data -----------+-------+--------------------------------------------------------- 0/BA5A8E0 | 10299 | BEGIN 10299 0/BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3' @@ -200,7 +200,7 @@ postgres=*# INSERT INTO data(data) VALUES('5'); postgres=*# PREPARE TRANSACTION 'test_prepared1'; postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL); - lsn | xid | data + lsn | xid | data -----------+-----+--------------------------------------------------------- 0/1689DC0 | 529 | BEGIN 529 0/1689DC0 | 529 | table public.data: INSERT: id[integer]:3 data[text]:'5' @@ -209,7 +209,7 @@ postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NU postgres=# COMMIT PREPARED 'test_prepared1'; postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NULL); - lsn | xid | data + lsn | xid | data -----------+-----+-------------------------------------------- 0/168A060 | 529 | COMMIT PREPARED 'test_prepared1', txid 529 (4 row) @@ -219,7 +219,7 @@ postgres=# BEGIN; postgres=*# INSERT INTO data(data) VALUES('6'); postgres=*# PREPARE TRANSACTION 'test_prepared2'; postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NULL); - lsn | xid | data + lsn | xid | data -----------+-----+--------------------------------------------------------- 0/168A180 | 530 | BEGIN 530 0/168A1E8 | 530 | table public.data: INSERT: id[integer]:4 data[text]:'6' @@ -228,7 +228,7 @@ postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NU postgres=# ROLLBACK PREPARED 'test_prepared2'; postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NULL); - lsn | xid | data + lsn | xid | data -----------+-----+---------------------------------------------- 0/168A4B8 | 530 | ROLLBACK PREPARED 'test_prepared2', txid 530 (1 row) @@ -850,7 +850,7 @@ typedef bool (*LogicalDecodeFilterPrepareCB) (struct LogicalDecodingContext *ctx gid field, which is part of the txn parameter, can be used in this callback to check if the plugin has already received this PREPARE - in which case it can either error out or skip the remaining changes of + in which case it can either error out or skip the remaining changes of the transaction. typedef void (*LogicalDecodeBeginPrepareCB) (struct LogicalDecodingContext *ctx, @@ -978,7 +978,7 @@ typedef void (*LogicalDecodeStreamCommitCB) (struct LogicalDecodingContext *ctx, - + Stream Change Callback diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 180798a6b9..56d9b375ec 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -2302,7 +2302,7 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event is NOT NULL; - pid | wait_event_type | wait_event + pid | wait_event_type | wait_event ------+-----------------+------------ 2540 | Lock | relation 6644 | LWLock | ProcArray diff --git a/doc/src/sgml/pageinspect.sgml b/doc/src/sgml/pageinspect.sgml index 55513cf522..d4ee34ee0f 100644 --- a/doc/src/sgml/pageinspect.sgml +++ b/doc/src/sgml/pageinspect.sgml @@ -492,7 +492,7 @@ test=# SELECT itemoffset, ctid, itemlen, nulls, vars, data, dead, htid, tids[0:2 not a valid BRIN page. For example: test=# SELECT brin_page_type(get_raw_page('brinidx', 0)); - brin_page_type + brin_page_type ---------------- meta @@ -514,7 +514,7 @@ test=# SELECT brin_page_type(get_raw_page('brinidx', 0)); about a BRIN index metapage. For example: test=# SELECT * FROM brin_metapage_info(get_raw_page('brinidx', 0)); - magic | version | pagesperrange | lastrevmappage + magic | version | pagesperrange | lastrevmappage ------------+---------+---------------+---------------- 0xA8109CFA | 1 | 4 | 2 @@ -537,7 +537,7 @@ test=# SELECT * FROM brin_metapage_info(get_raw_page('brinidx', 0)); For example: test=# SELECT * FROM brin_revmap_data(get_raw_page('brinidx', 2)) LIMIT 5; - pages + pages --------- (6,137) (6,138) @@ -565,13 +565,13 @@ test=# SELECT * FROM brin_revmap_data(get_raw_page('brinidx', 2)) LIMIT 5; test=# SELECT * FROM brin_page_items(get_raw_page('brinidx', 5), 'brinidx') ORDER BY blknum, attnum LIMIT 6; - itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | value + itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | value ------------+--------+--------+----------+----------+-------------+-------------- - 137 | 0 | 1 | t | f | f | + 137 | 0 | 1 | t | f | f | 137 | 0 | 2 | f | f | f | {1 .. 88} - 138 | 4 | 1 | t | f | f | + 138 | 4 | 1 | t | f | f | 138 | 4 | 2 | f | f | f | {89 .. 176} - 139 | 8 | 1 | t | f | f | + 139 | 8 | 1 | t | f | f | 139 | 8 | 2 | f | f | f | {177 .. 264} The returned columns correspond to the fields in the @@ -693,7 +693,7 @@ test=# SELECT first_tid, nbytes, tids[0:5] AS some_tids For example: test=# SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 2)); - lsn | nsn | rightlink | flags + lsn | nsn | rightlink | flags -----+-----+-----------+-------- 0/1 | 0/0 | 1 | {leaf} (1 row) @@ -716,7 +716,7 @@ test=# SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 2)); the data stored in a page of a GiST index. For example: test=# SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 0), 'test_gist_idx'); - itemoffset | ctid | itemlen | dead | keys + itemoffset | ctid | itemlen | dead | keys ------------+-----------+---------+------+------------------- 1 | (1,65535) | 40 | f | (p)=((166,166)) 2 | (2,65535) | 40 | f | (p)=((332,332)) @@ -747,7 +747,7 @@ test=# SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 0), 'test_gis example: test=# SELECT * FROM gist_page_items_bytea(get_raw_page('test_gist_idx', 0)); - itemoffset | ctid | itemlen | dead | key_data + itemoffset | ctid | itemlen | dead | key_data ------------+-----------+---------+------+-----------------------------------------&zwsp;------------------------------------------- 1 | (1,65535) | 40 | f | \x00000100ffff28000000000000c0644000000000&zwsp;00c06440000000000000f03f000000000000f03f 2 | (2,65535) | 40 | f | \x00000200ffff28000000000000c0744000000000&zwsp;00c074400000000000e064400000000000e06440 @@ -782,7 +782,7 @@ test=# SELECT * FROM gist_page_items_bytea(get_raw_page('test_gist_idx', 0)); the given HASH index page. For example: test=# SELECT hash_page_type(get_raw_page('con_hash_index', 0)); - hash_page_type + hash_page_type ---------------- metapage @@ -835,7 +835,7 @@ hasho_page_id | 65408 index page. For example: test=# SELECT * FROM hash_page_items(get_raw_page('con_hash_index', 1)) LIMIT 5; - itemoffset | ctid | data + itemoffset | ctid | data ------------+-----------+------------ 1 | (899,77) | 1053474816 2 | (897,29) | 1053474816 @@ -862,7 +862,7 @@ test=# SELECT * FROM hash_page_items(get_raw_page('con_hash_index', 1)) LIMIT 5; index. For example: test=# SELECT * FROM hash_bitmap_info('con_hash_index', 2052); - bitmapblkno | bitmapbit | bitstatus + bitmapblkno | bitmapbit | bitstatus -------------+-----------+----------- 65 | 3 | t diff --git a/doc/src/sgml/parallel.sgml b/doc/src/sgml/parallel.sgml index 13479d7e5e..c37fb67065 100644 --- a/doc/src/sgml/parallel.sgml +++ b/doc/src/sgml/parallel.sgml @@ -33,7 +33,7 @@ EXPLAIN SELECT * FROM pgbench_accounts WHERE filler LIKE '%x%'; - QUERY PLAN + QUERY PLAN -------------------------------------------------------------------&zwsp;------------------ Gather (cost=1000.00..217018.43 rows=1 width=97) Workers Planned: 2 diff --git a/doc/src/sgml/perform.sgml b/doc/src/sgml/perform.sgml index 9cf8ebea80..8fd8e25c51 100644 --- a/doc/src/sgml/perform.sgml +++ b/doc/src/sgml/perform.sgml @@ -1221,7 +1221,7 @@ ANALYZE zipcodes; SELECT stxname, stxkeys, stxddependencies FROM pg_statistic_ext join pg_statistic_ext_data on (oid = stxoid) WHERE stxname = 'stts'; - stxname | stxkeys | stxddependencies + stxname | stxkeys | stxddependencies ---------+---------+------------------------------------------ stts | 1 5 | {"1 => 5": 1.000000, "5 => 1": 0.423130} (1 row) @@ -1367,7 +1367,7 @@ ANALYZE zipcodes; SELECT m.* FROM pg_statistic_ext join pg_statistic_ext_data on (oid = stxoid), pg_mcv_list_items(stxdmcv) m WHERE stxname = 'stts3'; - index | values | nulls | frequency | base_frequency + index | values | nulls | frequency | base_frequency -------+------------------------+-------+-----------+---------------- 0 | {Washington, DC} | {f,f} | 0.003467 | 2.7e-05 1 | {Apo, AE} | {f,f} | 0.003067 | 1.9e-05 diff --git a/doc/src/sgml/pgfreespacemap.sgml b/doc/src/sgml/pgfreespacemap.sgml index 3063885c2c..4dd7a084b9 100644 --- a/doc/src/sgml/pgfreespacemap.sgml +++ b/doc/src/sgml/pgfreespacemap.sgml @@ -76,7 +76,7 @@ postgres=# SELECT * FROM pg_freespace('foo'); - blkno | avail + blkno | avail -------+------- 0 | 0 1 | 0 @@ -101,7 +101,7 @@ postgres=# SELECT * FROM pg_freespace('foo'); (20 rows) postgres=# SELECT * FROM pg_freespace('foo', 7); - pg_freespace + pg_freespace -------------- 1216 (1 row) diff --git a/doc/src/sgml/pgstatstatements.sgml b/doc/src/sgml/pgstatstatements.sgml index 45e720e995..215419f23c 100644 --- a/doc/src/sgml/pgstatstatements.sgml +++ b/doc/src/sgml/pgstatstatements.sgml @@ -948,7 +948,7 @@ query | SELECT pg_stat_statements_reset(0,0,0) calls | 1 total_exec_time | 0.189497 rows | 1 -hit_percent | +hit_percent | -[ RECORD 2 ]---+--------------------------------------------------&zwsp;--------------------------- query | SELECT query, calls, total_exec_time, rows, $1 * shared_blks_hit / + | nullif(shared_blks_hit + shared_blks_read, $2) AS hit_percent+ @@ -956,7 +956,7 @@ query | SELECT query, calls, total_exec_time, rows, $1 * shared_blks_h calls | 0 total_exec_time | 0 rows | 0 -hit_percent | +hit_percent |
diff --git a/doc/src/sgml/pgsurgery.sgml b/doc/src/sgml/pgsurgery.sgml index 134be9bebd..4bba14f217 100644 --- a/doc/src/sgml/pgsurgery.sgml +++ b/doc/src/sgml/pgsurgery.sgml @@ -39,9 +39,9 @@ ERROR: could not access status of transaction 4007513275 DETAIL: Could not open file "pg_xact/0EED": No such file or directory. test=# select heap_force_kill('t1'::regclass, ARRAY['(0, 1)']::tid[]); - heap_force_kill + heap_force_kill ----------------- - + (1 row) test=# select * from t1 where ctid = '(0, 1)'; @@ -71,15 +71,15 @@ ERROR: found xmin 507 from before relfrozenxid 515 CONTEXT: while scanning block 0 of relation "public.t1" test=# select ctid from t1 where xmin = 507; - ctid + ctid ------- (0,3) (1 row) test=# select heap_force_freeze('t1'::regclass, ARRAY['(0, 3)']::tid[]); - heap_force_freeze + heap_force_freeze ------------------- - + (1 row) test=# select ctid from t1 where xmin = 2; diff --git a/doc/src/sgml/pgwalinspect.sgml b/doc/src/sgml/pgwalinspect.sgml index c1d4fbc66c..de63a70965 100644 --- a/doc/src/sgml/pgwalinspect.sgml +++ b/doc/src/sgml/pgwalinspect.sgml @@ -108,7 +108,7 @@ follows: postgres=# select start_lsn, end_lsn, prev_lsn, xid, resource_manager, record_type, record_length, main_data_length, fpi_length, description from pg_get_wal_records_info('0/14F9A30', '0/15011D7'); - start_lsn | end_lsn | prev_lsn | xid | resource_manager | record_type | record_length | main_data_length | fpi_length | description + start_lsn | end_lsn | prev_lsn | xid | resource_manager | record_type | record_length | main_data_length | fpi_length | description -----------+-----------+-----------+-----+------------------+--------------+---------------+------------------+------------+--------------------- 0/14FA118 | 0/14FB4B0 | 0/14F9958 | 725 | Btree | INSERT_LEAF | 5013 | 2 | 4960 | off 246 0/14FB4B0 | 0/14FD050 | 0/14FA118 | 725 | Btree | INSERT_LEAF | 7045 | 2 | 6992 | off 130 @@ -189,7 +189,7 @@ postgres=# select start_lsn, end_lsn, prev_lsn, xid, resource_manager, record_ty follows: postgres=# select * from pg_get_wal_stats('0/12FBA30', '0/15011D7') where count > 0; - resource_manager/record_type | count | count_percentage | record_size | record_size_percentage | fpi_size | fpi_size_percentage | combined_size | combined_size_percentage + resource_manager/record_type | count | count_percentage | record_size | record_size_percentage | fpi_size | fpi_size_percentage | combined_size | combined_size_percentage ------------------------------+-------+------------------+-------------+------------------------+----------+---------------------+---------------+-------------------------- XLOG | 10 | 0.10871929 | 796 | 0.052369177 | 352 | 0.061031006 | 1148 | 0.054751817 Transaction | 187 | 2.0330508 | 62773 | 4.1298623 | 0 | 0 | 62773 | 2.9938467 @@ -206,7 +206,7 @@ With per_record passed as true: postgres=# select * from pg_get_wal_stats('0/14AFC30', '0/15011D7', true) where count > 0; - resource_manager/record_type | count | count_percentage | record_size | record_size_percentage | fpi_size | fpi_size_percentage | combined_size | combined_size_percentage + resource_manager/record_type | count | count_percentage | record_size | record_size_percentage | fpi_size | fpi_size_percentage | combined_size | combined_size_percentage ------------------------------+-------+------------------+-------------+------------------------+----------+---------------------+---------------+-------------------------- XLOG/CHECKPOINT_SHUTDOWN | 1 | 0.32894737 | 114 | 0.22891566 | 0 | 0 | 114 | 0.03534489 XLOG/CHECKPOINT_ONLINE | 4 | 1.3157895 | 456 | 0.91566265 | 0 | 0 | 456 | 0.14137957 diff --git a/doc/src/sgml/planstats.sgml b/doc/src/sgml/planstats.sgml index 78053d7c49..df85ea5eea 100644 --- a/doc/src/sgml/planstats.sgml +++ b/doc/src/sgml/planstats.sgml @@ -490,7 +490,7 @@ SELECT relpages, reltuples FROM pg_class WHERE relname = 't'; EXPLAIN (ANALYZE, TIMING OFF) SELECT * FROM t WHERE a = 1; - QUERY PLAN + QUERY PLAN -------------------------------------------------------------------&zwsp;------------ Seq Scan on t (cost=0.00..170.00 rows=100 width=8) (actual rows=100 loops=1) Filter: (a = 1) @@ -507,7 +507,7 @@ EXPLAIN (ANALYZE, TIMING OFF) SELECT * FROM t WHERE a = 1; EXPLAIN (ANALYZE, TIMING OFF) SELECT * FROM t WHERE a = 1 AND b = 1; - QUERY PLAN + QUERY PLAN -------------------------------------------------------------------&zwsp;---------- Seq Scan on t (cost=0.00..195.00 rows=1 width=8) (actual rows=100 loops=1) Filter: ((a = 1) AND (b = 1)) @@ -531,7 +531,7 @@ EXPLAIN (ANALYZE, TIMING OFF) SELECT * FROM t WHERE a = 1 AND b = 1; CREATE STATISTICS stts (dependencies) ON a, b FROM t; ANALYZE t; EXPLAIN (ANALYZE, TIMING OFF) SELECT * FROM t WHERE a = 1 AND b = 1; - QUERY PLAN + QUERY PLAN -------------------------------------------------------------------&zwsp;------------ Seq Scan on t (cost=0.00..195.00 rows=100 width=8) (actual rows=100 loops=1) Filter: ((a = 1) AND (b = 1)) @@ -552,7 +552,7 @@ EXPLAIN (ANALYZE, TIMING OFF) SELECT * FROM t WHERE a = 1 AND b = 1; accurate: EXPLAIN (ANALYZE, TIMING OFF) SELECT COUNT(*) FROM t GROUP BY a; - QUERY PLAN + QUERY PLAN -------------------------------------------------------------------&zwsp;---------------------- HashAggregate (cost=195.00..196.00 rows=100 width=12) (actual rows=100 loops=1) Group Key: a @@ -563,7 +563,7 @@ EXPLAIN (ANALYZE, TIMING OFF) SELECT COUNT(*) FROM t GROUP BY a; in the following example, is off by an order of magnitude: EXPLAIN (ANALYZE, TIMING OFF) SELECT COUNT(*) FROM t GROUP BY a, b; - QUERY PLAN + QUERY PLAN -------------------------------------------------------------------&zwsp;------------------------- HashAggregate (cost=220.00..230.00 rows=1000 width=16) (actual rows=100 loops=1) Group Key: a, b @@ -576,7 +576,7 @@ DROP STATISTICS stts; CREATE STATISTICS stts (dependencies, ndistinct) ON a, b FROM t; ANALYZE t; EXPLAIN (ANALYZE, TIMING OFF) SELECT COUNT(*) FROM t GROUP BY a, b; - QUERY PLAN + QUERY PLAN -------------------------------------------------------------------&zwsp;------------------------- HashAggregate (cost=220.00..221.00 rows=100 width=16) (actual rows=100 loops=1) Group Key: a, b @@ -637,7 +637,7 @@ EXPLAIN (ANALYZE, TIMING OFF) SELECT * FROM t WHERE a = 1 AND b = 1; SELECT m.* FROM pg_statistic_ext join pg_statistic_ext_data on (oid = stxoid), pg_mcv_list_items(stxdmcv) m WHERE stxname = 'stts2'; - index | values | nulls | frequency | base_frequency + index | values | nulls | frequency | base_frequency -------+----------+-------+-----------+---------------- 0 | {0, 0} | {f,f} | 0.01 | 0.0001 1 | {1, 1} | {f,f} | 0.01 | 0.0001 diff --git a/doc/src/sgml/plperl.sgml b/doc/src/sgml/plperl.sgml index 01f9870773..627c7936fc 100644 --- a/doc/src/sgml/plperl.sgml +++ b/doc/src/sgml/plperl.sgml @@ -709,7 +709,7 @@ SELECT init_hosts_query(); SELECT query_hosts('192.168.1.0/30'); SELECT release_hosts_query(); - query_hosts + query_hosts ----------------- (1,192.168.1.1) (2,192.168.1.2) diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml index 7ebc6593f1..d9a74896d5 100644 --- a/doc/src/sgml/plpgsql.sgml +++ b/doc/src/sgml/plpgsql.sgml @@ -5352,9 +5352,9 @@ WARNING: number of source and target fields in assignment does not match DETAIL: strict_multi_assignment check of extra_warnings is active. HINT: Make sure the query returns the exact list of columns. - foo + foo ----- - + (1 row) diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml index 1901736e60..b43d0aecba 100644 --- a/doc/src/sgml/postgres-fdw.sgml +++ b/doc/src/sgml/postgres-fdw.sgml @@ -729,7 +729,7 @@ OPTIONS (ADD password_required 'false'); Example usage of the function: postgres=# SELECT * FROM postgres_fdw_get_connections() ORDER BY 1; - server_name | valid + server_name | valid -------------+------- loopback1 | t loopback2 | f @@ -754,7 +754,7 @@ postgres=# SELECT * FROM postgres_fdw_get_connections() ORDER BY 1; Example usage of the function: postgres=# SELECT postgres_fdw_disconnect('loopback1'); - postgres_fdw_disconnect + postgres_fdw_disconnect ------------------------- t @@ -775,7 +775,7 @@ postgres=# SELECT postgres_fdw_disconnect('loopback1'); Example usage of the function: postgres=# SELECT postgres_fdw_disconnect_all(); - postgres_fdw_disconnect_all + postgres_fdw_disconnect_all ----------------------------- t diff --git a/doc/src/sgml/ref/create_index.sgml b/doc/src/sgml/ref/create_index.sgml index 91eaaabc90..d3102a87d9 100644 --- a/doc/src/sgml/ref/create_index.sgml +++ b/doc/src/sgml/ref/create_index.sgml @@ -649,9 +649,9 @@ CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] postgres=# \d tab Table "public.tab" - Column | Type | Collation | Nullable | Default + Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- - col | integer | | | + col | integer | | | Indexes: "idx" btree (col) INVALID diff --git a/doc/src/sgml/ref/explain.sgml b/doc/src/sgml/ref/explain.sgml index 857c4e6e86..d4895b9d7d 100644 --- a/doc/src/sgml/ref/explain.sgml +++ b/doc/src/sgml/ref/explain.sgml @@ -395,7 +395,7 @@ EXPLAIN (FORMAT YAML) SELECT * FROM foo WHERE i='4'; Total Cost: 5.98 + Plan Rows: 1 + Plan Width: 4 + - Index Cond: "(i = 4)" + Index Cond: "(i = 4)" (1 row) @@ -442,7 +442,7 @@ PREPARE query(int, int) AS SELECT sum(bar) FROM test EXPLAIN ANALYZE EXECUTE query(100, 200); - QUERY PLAN + QUERY PLAN -------------------------------------------------------------------&zwsp;----------------------------------------------------- HashAggregate (cost=9.54..9.54 rows=1 width=8) (actual time=0.156..0.161 rows=11 loops=1) Group Key: foo diff --git a/doc/src/sgml/ref/pgarchivecleanup.sgml b/doc/src/sgml/ref/pgarchivecleanup.sgml index e27db3c077..635e7c7685 100644 --- a/doc/src/sgml/ref/pgarchivecleanup.sgml +++ b/doc/src/sgml/ref/pgarchivecleanup.sgml @@ -160,8 +160,7 @@ pg_archivecleanup: removing file "archive/00000001000000370000000E" never. - - + Notes diff --git a/doc/src/sgml/ref/pgtestfsync.sgml b/doc/src/sgml/ref/pgtestfsync.sgml index 95be7a16d2..e811f80bf4 100644 --- a/doc/src/sgml/ref/pgtestfsync.sgml +++ b/doc/src/sgml/ref/pgtestfsync.sgml @@ -116,7 +116,7 @@ PostgreSQL documentation never. - + See Also diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index 592356019b..8fc7870733 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -4992,7 +4992,7 @@ testdb=> \d my_table Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- first | integer | | not null | 0 - second | text | | | + second | text | | | Now we change the prompt to something more interesting: @@ -5123,7 +5123,7 @@ testdb=> \df int*pl * bigint with the \crosstabview command: testdb=> SELECT first, second, first > 2 AS gt2 FROM my_table; - first | second | gt2 + first | second | gt2 -------+--------+----- 1 | one | f 2 | two | f @@ -5132,11 +5132,11 @@ testdb=> SELECT first, second, first > 2 AS gt2 FROM my_table;< (4 rows) testdb=> \crosstabview first second - first | one | two | three | four + first | one | two | three | four -------+-----+-----+-------+------ - 1 | f | | | - 2 | | f | | - 3 | | | t | + 1 | f | | | + 2 | | f | | + 3 | | | t | 4 | | | | t (4 rows) @@ -5148,7 +5148,7 @@ testdb=> SELECT t1.first as "A", t2.first+100 AS "B", t1.first*(t2 testdb(> row_number() over(order by t2.first) AS ord testdb(> FROM my_table t1 CROSS JOIN my_table t2 ORDER BY 1 DESC testdb(> \crosstabview "A" "B" "AxB" ord - A | 101 | 102 | 103 | 104 + A | 101 | 102 | 103 | 104 ---+-----+-----+-----+----- 4 | 404 | 408 | 412 | 416 3 | 303 | 306 | 309 | 312 diff --git a/doc/src/sgml/ref/reindex.sgml b/doc/src/sgml/ref/reindex.sgml index 6a0eca8b9a..36cb4a455b 100644 --- a/doc/src/sgml/ref/reindex.sgml +++ b/doc/src/sgml/ref/reindex.sgml @@ -309,7 +309,7 @@ REINDEX [ ( option [, ...] ) ] { IN reindexed in a separate transaction. Those commands cannot be used inside a transaction block when working on a partitioned table or index. - + When using the TABLESPACE clause with REINDEX on a partitioned index or table, only the @@ -329,7 +329,7 @@ REINDEX [ ( option [, ...] ) ] { IN will be generated. Indexes on TOAST tables are rebuilt, but not moved to the new tablespace. - + Rebuilding Indexes Concurrently diff --git a/doc/src/sgml/ref/rollback_to.sgml b/doc/src/sgml/ref/rollback_to.sgml index 3d5a241e1a..27fa95cd1b 100644 --- a/doc/src/sgml/ref/rollback_to.sgml +++ b/doc/src/sgml/ref/rollback_to.sgml @@ -112,14 +112,14 @@ DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2; SAVEPOINT foo; FETCH 1 FROM foo; - ?column? + ?column? ---------- 1 ROLLBACK TO SAVEPOINT foo; FETCH 1 FROM foo; - ?column? + ?column? ---------- 2 diff --git a/doc/src/sgml/ref/select.sgml b/doc/src/sgml/ref/select.sgml index 8e5b83dfde..80bb8adcac 100644 --- a/doc/src/sgml/ref/select.sgml +++ b/doc/src/sgml/ref/select.sgml @@ -1915,7 +1915,7 @@ SELECT * FROM t UNION ALL SELECT * FROM t - x + x -------------------- 0.534150459803641 0.520092216785997 diff --git a/doc/src/sgml/ref/set_role.sgml b/doc/src/sgml/ref/set_role.sgml index f02babf3af..4e02322158 100644 --- a/doc/src/sgml/ref/set_role.sgml +++ b/doc/src/sgml/ref/set_role.sgml @@ -115,7 +115,7 @@ RESET ROLE SELECT SESSION_USER, CURRENT_USER; - session_user | current_user + session_user | current_user --------------+-------------- peter | peter @@ -123,7 +123,7 @@ SET ROLE 'paul'; SELECT SESSION_USER, CURRENT_USER; - session_user | current_user + session_user | current_user --------------+-------------- peter | paul diff --git a/doc/src/sgml/ref/set_session_auth.sgml b/doc/src/sgml/ref/set_session_auth.sgml index e44e78ed8d..f8fcafc194 100644 --- a/doc/src/sgml/ref/set_session_auth.sgml +++ b/doc/src/sgml/ref/set_session_auth.sgml @@ -84,7 +84,7 @@ RESET SESSION AUTHORIZATION SELECT SESSION_USER, CURRENT_USER; - session_user | current_user + session_user | current_user --------------+-------------- peter | peter @@ -92,7 +92,7 @@ SET SESSION AUTHORIZATION 'paul'; SELECT SESSION_USER, CURRENT_USER; - session_user | current_user + session_user | current_user --------------+-------------- paul | paul diff --git a/doc/src/sgml/ref/show.sgml b/doc/src/sgml/ref/show.sgml index 93789ee0be..b3747b119f 100644 --- a/doc/src/sgml/ref/show.sgml +++ b/doc/src/sgml/ref/show.sgml @@ -167,7 +167,7 @@ SHOW geqo; Show all settings: SHOW ALL; - name | setting | description + name | setting | description -------------------------+---------+------------------------------------------------- allow_system_table_mods | off | Allows modifications of the structure of ... . diff --git a/doc/src/sgml/release-15.sgml b/doc/src/sgml/release-15.sgml index 4b78f0be91..bee24b236a 100644 --- a/doc/src/sgml/release-15.sgml +++ b/doc/src/sgml/release-15.sgml @@ -8,9 +8,9 @@ Release date: 2022-??-?? - + This is just a placeholder for now. - + diff --git a/doc/src/sgml/rules.sgml b/doc/src/sgml/rules.sgml index 4b2ba5a4e6..be3d17c852 100644 --- a/doc/src/sgml/rules.sgml +++ b/doc/src/sgml/rules.sgml @@ -1010,7 +1010,7 @@ VACUUM ANALYZE wrd; SELECT count(*) FROM words WHERE word = 'caterpiler'; - count + count ------- 0 (1 row) @@ -1047,7 +1047,7 @@ SELECT count(*) FROM words WHERE word = 'caterpiler'; SELECT word FROM words ORDER BY word <-> 'caterpiler' LIMIT 10; - word + word --------------- cater caterpillar @@ -1337,7 +1337,7 @@ UPDATE shoelace_data SET sl_avail = 6 WHERE sl_name = 'sl7'; SELECT * FROM shoelace_log; - sl_name | sl_avail | log_who | log_when + sl_name | sl_avail | log_who | log_when ---------+----------+---------+---------------------------------- sl7 | 6 | Al | Tue Oct 20 16:14:45 1998 MET DST (1 row) @@ -1718,7 +1718,7 @@ SELECT * FROM shoelace ORDER BY sl_name; SELECT * FROM shoelace_log; - sl_name | sl_avail | log_who| log_when + sl_name | sl_avail | log_who| log_when ---------+----------+--------+---------------------------------- sl7 | 6 | Al | Tue Oct 20 19:14:45 1998 MET DST sl3 | 10 | Al | Tue Oct 20 19:25:16 1998 MET DST diff --git a/doc/src/sgml/syntax.sgml b/doc/src/sgml/syntax.sgml index d66560b587..487ea58d89 100644 --- a/doc/src/sgml/syntax.sgml +++ b/doc/src/sgml/syntax.sgml @@ -2625,7 +2625,7 @@ LANGUAGE SQL IMMUTABLE STRICT; to functions in PostgreSQL. An example is: SELECT concat_lower_or_upper('Hello', 'World', true); - concat_lower_or_upper + concat_lower_or_upper ----------------------- HELLO WORLD (1 row) @@ -2635,7 +2635,7 @@ SELECT concat_lower_or_upper('Hello', 'World', true); Another example is: SELECT concat_lower_or_upper('Hello', 'World'); - concat_lower_or_upper + concat_lower_or_upper ----------------------- hello world (1 row) @@ -2661,7 +2661,7 @@ SELECT concat_lower_or_upper('Hello', 'World'); For example: SELECT concat_lower_or_upper(a => 'Hello', b => 'World'); - concat_lower_or_upper + concat_lower_or_upper ----------------------- hello world (1 row) @@ -2672,13 +2672,13 @@ SELECT concat_lower_or_upper(a => 'Hello', b => 'World'); order, for example: SELECT concat_lower_or_upper(a => 'Hello', b => 'World', uppercase => true); - concat_lower_or_upper + concat_lower_or_upper ----------------------- HELLO WORLD (1 row) SELECT concat_lower_or_upper(a => 'Hello', uppercase => true, b => 'World'); - concat_lower_or_upper + concat_lower_or_upper ----------------------- HELLO WORLD (1 row) @@ -2689,7 +2689,7 @@ SELECT concat_lower_or_upper(a => 'Hello', uppercase => true, b => 'Wor An older syntax based on ":=" is supported for backward compatibility: SELECT concat_lower_or_upper(a := 'Hello', uppercase := true, b := 'World'); - concat_lower_or_upper + concat_lower_or_upper ----------------------- HELLO WORLD (1 row) @@ -2711,7 +2711,7 @@ SELECT concat_lower_or_upper(a := 'Hello', uppercase := true, b := 'World'); For example: SELECT concat_lower_or_upper('Hello', 'World', uppercase => true); - concat_lower_or_upper + concat_lower_or_upper ----------------------- HELLO WORLD (1 row) diff --git a/doc/src/sgml/test-decoding.sgml b/doc/src/sgml/test-decoding.sgml index cf736bd41a..9b07195427 100644 --- a/doc/src/sgml/test-decoding.sgml +++ b/doc/src/sgml/test-decoding.sgml @@ -45,7 +45,7 @@ postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'i postgres[33712]=#* SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'stream-changes', '1'); - lsn | xid | data + lsn | xid | data -----------+-----+-------------------------------------------------- 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503 0/16B21F8 | 503 | streaming change for TXN 503 diff --git a/doc/src/sgml/textsearch.sgml b/doc/src/sgml/textsearch.sgml index 6afaf9e62c..2cbf7e7d42 100644 --- a/doc/src/sgml/textsearch.sgml +++ b/doc/src/sgml/textsearch.sgml @@ -275,7 +275,7 @@ SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat rat'::t SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat'); - ?column? + ?column? ---------- t @@ -284,7 +284,7 @@ SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat'); SELECT 'fat cats ate fat rats'::tsvector @@ to_tsquery('fat & rat'); - ?column? + ?column? ---------- f @@ -335,12 +335,12 @@ text @@ text SELECT to_tsvector('fatal error') @@ to_tsquery('fatal <-> error'); - ?column? + ?column? ---------- t SELECT to_tsvector('error is not fatal') @@ to_tsquery('fatal <-> error'); - ?column? + ?column? ---------- f @@ -357,12 +357,12 @@ SELECT to_tsvector('error is not fatal') @@ to_tsquery('fatal <-> error'); SELECT phraseto_tsquery('cats ate rats'); - phraseto_tsquery + phraseto_tsquery ------------------------------- 'cat' <-> 'ate' <-> 'rat' SELECT phraseto_tsquery('the cats ate the rats'); - phraseto_tsquery + phraseto_tsquery ------------------------------- 'cat' <-> 'ate' <2> 'rat' @@ -828,7 +828,7 @@ to_tsquery( config SELECT to_tsquery('english', 'The & Fat & Rats'); - to_tsquery + to_tsquery --------------- 'fat' & 'rat' @@ -839,7 +839,7 @@ SELECT to_tsquery('english', 'The & Fat & Rats'); SELECT to_tsquery('english', 'Fat | Rats:AB'); - to_tsquery + to_tsquery ------------------ 'fat' | 'rat':AB @@ -848,7 +848,7 @@ SELECT to_tsquery('english', 'Fat | Rats:AB'); SELECT to_tsquery('supern:*A & star:A*B'); - to_tsquery + to_tsquery -------------------------- 'supern':*A & 'star':*AB @@ -897,7 +897,7 @@ plainto_tsquery( config < SELECT plainto_tsquery('english', 'The Fat Rats'); - plainto_tsquery + plainto_tsquery ----------------- 'fat' & 'rat' @@ -908,7 +908,7 @@ SELECT plainto_tsquery('english', 'The Fat Rats'); SELECT plainto_tsquery('english', 'The Fat & Rats:C'); - plainto_tsquery + plainto_tsquery --------------------- 'fat' & 'rat' & 'c' @@ -1827,7 +1827,7 @@ CREATE TABLE aliases (t tsquery primary key, s tsquery); INSERT INTO aliases VALUES(to_tsquery('supernovae'), to_tsquery('supernovae|sn')); SELECT ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT * FROM aliases'); - ts_rewrite + ts_rewrite --------------------------------- 'crab' & ( 'supernova' | 'sn' ) @@ -1840,7 +1840,7 @@ SET s = to_tsquery('supernovae|sn & !nebulae') WHERE t = to_tsquery('supernovae'); SELECT ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT * FROM aliases'); - ts_rewrite + ts_rewrite --------------------------------------------- 'crab' & ( 'supernova' | 'sn' & !'nebula' ) @@ -1915,12 +1915,12 @@ tsvector_update_trigger(tsv, 'pg_catalog.english', title, body); INSERT INTO messages VALUES('title here', 'the body text is here'); SELECT * FROM messages; - title | body | tsv + title | body | tsv ------------+-----------------------+---------------------------- title here | the body text is here | 'bodi':4 'text':5 'titl':1 SELECT title, body FROM messages WHERE tsv @@ to_tsquery('title & body'); - title | body + title | body ------------+----------------------- title here | the body text is here @@ -2231,7 +2231,7 @@ LIMIT 10; SELECT alias, description, token FROM ts_debug('foo-bar-beta1'); - alias | description | token + alias | description | token -----------------+------------------------------------------+--------------- numhword | Hyphenated word, letters and digits | foo-bar-beta1 hword_asciipart | Hyphenated word part, all ASCII | foo @@ -2247,7 +2247,7 @@ SELECT alias, description, token FROM ts_debug('foo-bar-beta1'); SELECT alias, description, token FROM ts_debug('http://example.com/stuff/index.html'); - alias | description | token + alias | description | token ----------+---------------+------------------------------ protocol | Protocol head | http:// url | URL | example.com/stuff/index.html @@ -2571,7 +2571,7 @@ SELECT ts_lexize('public.simple_dict', 'The'); SELECT * FROM ts_debug('english', 'Paris'); - alias | description | token | dictionaries | dictionary | lexemes + alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+----------------+--------------+--------- asciiword | Word, all ASCII | Paris | {english_stem} | english_stem | {pari} @@ -2585,7 +2585,7 @@ ALTER TEXT SEARCH CONFIGURATION english WITH my_synonym, english_stem; SELECT * FROM ts_debug('english', 'Paris'); - alias | description | token | dictionaries | dictionary | lexemes + alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+---------------------------+------------+--------- asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris} @@ -2654,7 +2654,7 @@ mydb=# SELECT to_tsquery('tst', 'indices'); (1 row) mydb=# SELECT 'indexes are very useful'::tsvector; - tsvector + tsvector --------------------------------- 'are' 'indexes' 'useful' 'very' (1 row) @@ -3355,31 +3355,31 @@ ts_debug( config re SELECT * FROM ts_debug('english', 'a fat cat sat on a mat - it ate a fat rats'); - alias | description | token | dictionaries | dictionary | lexemes + alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+----------------+--------------+--------- asciiword | Word, all ASCII | a | {english_stem} | english_stem | {} - blank | Space symbols | | {} | | + blank | Space symbols | | {} | | asciiword | Word, all ASCII | fat | {english_stem} | english_stem | {fat} - blank | Space symbols | | {} | | + blank | Space symbols | | {} | | asciiword | Word, all ASCII | cat | {english_stem} | english_stem | {cat} - blank | Space symbols | | {} | | + blank | Space symbols | | {} | | asciiword | Word, all ASCII | sat | {english_stem} | english_stem | {sat} - blank | Space symbols | | {} | | + blank | Space symbols | | {} | | asciiword | Word, all ASCII | on | {english_stem} | english_stem | {} - blank | Space symbols | | {} | | + blank | Space symbols | | {} | | asciiword | Word, all ASCII | a | {english_stem} | english_stem | {} - blank | Space symbols | | {} | | + blank | Space symbols | | {} | | asciiword | Word, all ASCII | mat | {english_stem} | english_stem | {mat} - blank | Space symbols | | {} | | - blank | Space symbols | - | {} | | + blank | Space symbols | | {} | | + blank | Space symbols | - | {} | | asciiword | Word, all ASCII | it | {english_stem} | english_stem | {} - blank | Space symbols | | {} | | + blank | Space symbols | | {} | | asciiword | Word, all ASCII | ate | {english_stem} | english_stem | {ate} - blank | Space symbols | | {} | | + blank | Space symbols | | {} | | asciiword | Word, all ASCII | a | {english_stem} | english_stem | {} - blank | Space symbols | | {} | | + blank | Space symbols | | {} | | asciiword | Word, all ASCII | fat | {english_stem} | english_stem | {fat} - blank | Space symbols | | {} | | + blank | Space symbols | | {} | | asciiword | Word, all ASCII | rats | {english_stem} | english_stem | {rat} @@ -3406,12 +3406,12 @@ ALTER TEXT SEARCH CONFIGURATION public.english SELECT * FROM ts_debug('public.english', 'The Brightest supernovaes'); - alias | description | token | dictionaries | dictionary | lexemes + alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------------+-------------------------------+----------------+------------- asciiword | Word, all ASCII | The | {english_ispell,english_stem} | english_ispell | {} - blank | Space symbols | | {} | | + blank | Space symbols | | {} | | asciiword | Word, all ASCII | Brightest | {english_ispell,english_stem} | english_ispell | {bright} - blank | Space symbols | | {} | | + blank | Space symbols | | {} | | asciiword | Word, all ASCII | supernovaes | {english_ispell,english_stem} | english_stem | {supernova} @@ -3445,12 +3445,12 @@ SELECT * FROM ts_debug('public.english', 'The Brightest supernovaes'); SELECT alias, token, dictionary, lexemes FROM ts_debug('public.english', 'The Brightest supernovaes'); - alias | token | dictionary | lexemes + alias | token | dictionary | lexemes -----------+-------------+----------------+------------- asciiword | The | english_ispell | {} - blank | | | + blank | | | asciiword | Brightest | english_ispell | {bright} - blank | | | + blank | | | asciiword | supernovaes | english_stem | {supernova} @@ -3516,7 +3516,7 @@ ts_token_type(parser_oid oid< SELECT * FROM ts_token_type('default'); - tokid | alias | description + tokid | alias | description -------+-----------------+------------------------------------------ 1 | asciiword | Word, all ASCII 2 | word | Word, all letters @@ -3799,14 +3799,14 @@ SELECT plainto_tsquery('supernovae stars'); => \dF russian List of text search configurations - Schema | Name | Description + Schema | Name | Description ------------+---------+------------------------------------ pg_catalog | russian | configuration for russian language => \dF+ russian Text search configuration "pg_catalog.russian" Parser: "pg_catalog.default" - Token | Dictionaries + Token | Dictionaries -----------------+-------------- asciihword | english_stem asciiword | english_stem @@ -3884,21 +3884,21 @@ Parser: "pg_catalog.default" => \dFp List of text search parsers - Schema | Name | Description + Schema | Name | Description ------------+---------+--------------------- pg_catalog | default | default word parser => \dFp+ Text search parser "pg_catalog.default" - Method | Function | Description + Method | Function | Description -----------------+----------------+------------- - Start parse | prsd_start | - Get next token | prsd_nexttoken | - End parse | prsd_end | - Get headline | prsd_headline | - Get token types | prsd_lextype | + Start parse | prsd_start | + Get next token | prsd_nexttoken | + End parse | prsd_end | + Get headline | prsd_headline | + Get token types | prsd_lextype | Token types for parser "pg_catalog.default" - Token name | Description + Token name | Description -----------------+------------------------------------------ asciihword | Hyphenated word, all ASCII asciiword | Word, all ASCII @@ -3937,7 +3937,7 @@ Parser: "pg_catalog.default" => \dFt List of text search templates - Schema | Name | Description + Schema | Name | Description ------------+-----------+----------------------------------------------------------- pg_catalog | ispell | ispell dictionary pg_catalog | simple | simple dictionary: just lower case and check for stopword diff --git a/doc/src/sgml/xaggr.sgml b/doc/src/sgml/xaggr.sgml index 93f1155ab9..bdad8d3dc2 100644 --- a/doc/src/sgml/xaggr.sgml +++ b/doc/src/sgml/xaggr.sgml @@ -322,7 +322,7 @@ SELECT attrelid::regclass, array_accum(attname) WHERE attnum > 0 AND attrelid = 'pg_tablespace'::regclass GROUP BY attrelid; - attrelid | array_accum + attrelid | array_accum ---------------+--------------------------------------- pg_tablespace | {spcname,spcowner,spcacl,spcoptions} (1 row) @@ -332,7 +332,7 @@ SELECT attrelid::regclass, array_accum(atttypid::regtype) WHERE attnum > 0 AND attrelid = 'pg_tablespace'::regclass GROUP BY attrelid; - attrelid | array_accum + attrelid | array_accum ---------------+--------------------------- pg_tablespace | {name,oid,aclitem[],text[]} (1 row) diff --git a/doc/src/sgml/xfunc.sgml b/doc/src/sgml/xfunc.sgml index fb8255f136..07c5fd198b 100644 --- a/doc/src/sgml/xfunc.sgml +++ b/doc/src/sgml/xfunc.sgml @@ -836,7 +836,7 @@ CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS numeric AS $$ $$ LANGUAGE SQL; SELECT mleast(10, -1, 5, 4.4); - mleast + mleast -------- -1 (1 row) @@ -942,19 +942,19 @@ AS $$ $$; SELECT foo(10, 20, 30); - foo + foo ----- 60 (1 row) SELECT foo(10, 20); - foo + foo ----- 33 (1 row) SELECT foo(10); - foo + foo ----- 15 (1 row) @@ -1387,7 +1387,7 @@ SELECT make_array2(1, 2.5) AS numericarray; also works: SELECT make_array2('a', 'b') AS textarray; - textarray + textarray ----------- {a,b} (1 row) @@ -1440,13 +1440,13 @@ CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$ $$ LANGUAGE SQL; SELECT anyleast(10, -1, 5, 4); - anyleast + anyleast ---------- -1 (1 row) SELECT anyleast('abc'::text, 'def'); - anyleast + anyleast ---------- abc (1 row) @@ -1456,7 +1456,7 @@ CREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$ $$ LANGUAGE SQL; SELECT concat_values('|', 1, 4, 2); - concat_values + concat_values --------------- 1|4|2 (1 row) From d2d35479796c3510e249d6fc72adbd5df918efbf Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 20 Apr 2022 11:02:35 -0400 Subject: [PATCH 558/772] Allow db.schema.table patterns, but complain about random garbage. psql, pg_dump, and pg_amcheck share code to process object name patterns like 'foo*.bar*' to match all tables with names starting in 'bar' that are in schemas starting with 'foo'. Before v14, any number of extra name parts were silently ignored, so a command line '\d foo.bar.baz.bletch.quux' was interpreted as '\d bletch.quux'. In v14, as a result of commit 2c8726c4b0a496608919d1f78a5abc8c9b6e0868, we instead treated this as a request for table quux in a schema named 'foo.bar.baz.bletch'. That caused problems for people like Justin Pryzby who were accustomed to copying strings of the form db.schema.table from messages generated by PostgreSQL itself and using them as arguments to \d. Accordingly, revise things so that if an object name pattern contains more parts than we're expecting, we throw an error, unless there's exactly one extra part and it matches the current database name. That way, thisdb.myschema.mytable is accepted as meaning just myschema.mytable, but otherdb.myschema.mytable is an error, and so is some.random.garbage.myschema.mytable. Mark Dilger, per report from Justin Pryzby and discussion among various people. Discussion: https://www.postgresql.org/message-id/20211013165426.GD27491%40telsasoft.com --- doc/src/sgml/ref/psql-ref.sgml | 17 +- src/bin/pg_amcheck/pg_amcheck.c | 27 +- src/bin/pg_amcheck/t/002_nonesuch.pl | 99 +++- src/bin/pg_dump/pg_dump.c | 65 ++- src/bin/pg_dump/pg_dumpall.c | 13 +- src/bin/pg_dump/t/002_pg_dump.pl | 107 ++++ src/bin/psql/describe.c | 504 +++++++++++------ src/fe_utils/string_utils.c | 129 +++-- src/include/fe_utils/string_utils.h | 6 +- src/test/regress/expected/psql.out | 804 +++++++++++++++++++++++++++ src/test/regress/sql/psql.sql | 242 ++++++++ 11 files changed, 1796 insertions(+), 217 deletions(-) diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index 8fc7870733..5fc6b1034a 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -3641,14 +3641,27 @@ select 1\; select 2\; select 3; - A pattern that contains a dot (.) is interpreted as a schema + A relation pattern that contains a dot (.) is interpreted as a schema name pattern followed by an object name pattern. For example, \dt foo*.*bar* displays all tables whose table name includes bar that are in schemas whose schema name starts with foo. When no dot appears, then the pattern matches only objects that are visible in the current schema search path. Again, a dot within double quotes loses its special meaning and is matched - literally. + literally. A relation pattern that contains two dots (.) + is interpreted as a database name followed by a schema name pattern followed + by an object name pattern. The database name portion will not be treated as + a pattern and must match the name of the currently connected database, else + an error will be raised. + + + + A schema pattern that contains a dot (.) is interpreted + as a database name followed by a schema name pattern. For example, + \dn mydb.*foo* displays all schemas whose schema name + includes foo. The database name portion will not be + treated as a pattern and must match the name of the currently connected + database, else an error will be raised. diff --git a/src/bin/pg_amcheck/pg_amcheck.c b/src/bin/pg_amcheck/pg_amcheck.c index 90471e096d..48cee8c1c4 100644 --- a/src/bin/pg_amcheck/pg_amcheck.c +++ b/src/bin/pg_amcheck/pg_amcheck.c @@ -1308,10 +1308,17 @@ static void append_database_pattern(PatternInfoArray *pia, const char *pattern, int encoding) { PQExpBufferData buf; + int dotcnt; PatternInfo *info = extend_pattern_info_array(pia); initPQExpBuffer(&buf); - patternToSQLRegex(encoding, NULL, NULL, &buf, pattern, false); + patternToSQLRegex(encoding, NULL, NULL, &buf, pattern, false, false, + &dotcnt); + if (dotcnt > 0) + { + pg_log_error("improper qualified name (too many dotted names): %s", pattern); + exit(2); + } info->pattern = pattern; info->db_regex = pstrdup(buf.data); @@ -1332,12 +1339,19 @@ append_schema_pattern(PatternInfoArray *pia, const char *pattern, int encoding) { PQExpBufferData dbbuf; PQExpBufferData nspbuf; + int dotcnt; PatternInfo *info = extend_pattern_info_array(pia); initPQExpBuffer(&dbbuf); initPQExpBuffer(&nspbuf); - patternToSQLRegex(encoding, NULL, &dbbuf, &nspbuf, pattern, false); + patternToSQLRegex(encoding, NULL, &dbbuf, &nspbuf, pattern, false, false, + &dotcnt); + if (dotcnt > 1) + { + pg_log_error("improper qualified name (too many dotted names): %s", pattern); + exit(2); + } info->pattern = pattern; if (dbbuf.data[0]) { @@ -1369,13 +1383,20 @@ append_relation_pattern_helper(PatternInfoArray *pia, const char *pattern, PQExpBufferData dbbuf; PQExpBufferData nspbuf; PQExpBufferData relbuf; + int dotcnt; PatternInfo *info = extend_pattern_info_array(pia); initPQExpBuffer(&dbbuf); initPQExpBuffer(&nspbuf); initPQExpBuffer(&relbuf); - patternToSQLRegex(encoding, &dbbuf, &nspbuf, &relbuf, pattern, false); + patternToSQLRegex(encoding, &dbbuf, &nspbuf, &relbuf, pattern, false, + false, &dotcnt); + if (dotcnt > 2) + { + pg_log_error("improper relation name (too many dotted names): %s", pattern); + exit(2); + } info->pattern = pattern; if (dbbuf.data[0]) { diff --git a/src/bin/pg_amcheck/t/002_nonesuch.pl b/src/bin/pg_amcheck/t/002_nonesuch.pl index 56d55199f8..6c0f97027d 100644 --- a/src/bin/pg_amcheck/t/002_nonesuch.pl +++ b/src/bin/pg_amcheck/t/002_nonesuch.pl @@ -147,6 +147,100 @@ [qr/pg_amcheck: error: no heap tables to check matching "\."/], 'checking table pattern "."'); +# Check that a multipart database name is rejected +$node->command_checks_all( + [ 'pg_amcheck', '-d', 'localhost.postgres' ], + 2, + [qr/^$/], + [ + qr/pg_amcheck: error: improper qualified name \(too many dotted names\): localhost\.postgres/ + ], + 'multipart database patterns are rejected' +); + +# Check that a three-part schema name is rejected +$node->command_checks_all( + [ 'pg_amcheck', '-s', 'localhost.postgres.pg_catalog' ], + 2, + [qr/^$/], + [ + qr/pg_amcheck: error: improper qualified name \(too many dotted names\): localhost\.postgres\.pg_catalog/ + ], + 'three part schema patterns are rejected' +); + +# Check that a four-part table name is rejected +$node->command_checks_all( + [ 'pg_amcheck', '-t', 'localhost.postgres.pg_catalog.pg_class' ], + 2, + [qr/^$/], + [ + qr/pg_amcheck: error: improper relation name \(too many dotted names\): localhost\.postgres\.pg_catalog\.pg_class/ + ], + 'four part table patterns are rejected' +); + +# Check that too many dotted names still draws an error under --no-strict-names +# That flag means that it is ok for the object to be missing, not that it is ok +# for the object name to be ungrammatical +$node->command_checks_all( + [ 'pg_amcheck', '--no-strict-names', '-t', 'this.is.a.really.long.dotted.string' ], + 2, + [qr/^$/], + [ + qr/pg_amcheck: error: improper relation name \(too many dotted names\): this\.is\.a\.really\.long\.dotted\.string/ + ], + 'ungrammatical table names still draw errors under --no-strict-names' +); +$node->command_checks_all( + [ 'pg_amcheck', '--no-strict-names', '-s', 'postgres.long.dotted.string' ], + 2, + [qr/^$/], + [ + qr/pg_amcheck: error: improper qualified name \(too many dotted names\): postgres\.long\.dotted\.string/ + ], + 'ungrammatical schema names still draw errors under --no-strict-names' +); +$node->command_checks_all( + [ 'pg_amcheck', '--no-strict-names', '-d', 'postgres.long.dotted.string' ], + 2, + [qr/^$/], + [ + qr/pg_amcheck: error: improper qualified name \(too many dotted names\): postgres\.long\.dotted\.string/ + ], + 'ungrammatical database names still draw errors under --no-strict-names' +); + +# Likewise for exclusion patterns +$node->command_checks_all( + [ 'pg_amcheck', '--no-strict-names', '-T', 'a.b.c.d' ], + 2, + [qr/^$/], + [ + qr/pg_amcheck: error: improper relation name \(too many dotted names\): a\.b\.c\.d/ + ], + 'ungrammatical table exclusions still draw errors under --no-strict-names' +); +$node->command_checks_all( + [ 'pg_amcheck', '--no-strict-names', '-S', 'a.b.c' ], + 2, + [qr/^$/], + [ + qr/pg_amcheck: error: improper qualified name \(too many dotted names\): a\.b\.c/ + ], + 'ungrammatical schema exclusions still draw errors under --no-strict-names' +); +$node->command_checks_all( + [ 'pg_amcheck', '--no-strict-names', '-D', 'a.b' ], + 2, + [qr/^$/], + [ + qr/pg_amcheck: error: improper qualified name \(too many dotted names\): a\.b/ + ], + 'ungrammatical database exclusions still draw errors under --no-strict-names' +); + + ######################################### # Test checking non-existent databases, schemas, tables, and indexes @@ -165,9 +259,7 @@ '-d', 'no*such*database', '-r', 'none.none', '-r', 'none.none.none', - '-r', 'this.is.a.really.long.dotted.string', '-r', 'postgres.none.none', - '-r', 'postgres.long.dotted.string', '-r', 'postgres.pg_catalog.none', '-r', 'postgres.none.pg_class', '-t', 'postgres.pg_catalog.pg_class', # This exists @@ -186,15 +278,12 @@ qr/pg_amcheck: warning: no connectable databases to check matching "no\*such\*database"/, qr/pg_amcheck: warning: no relations to check matching "none\.none"/, qr/pg_amcheck: warning: no connectable databases to check matching "none\.none\.none"/, - qr/pg_amcheck: warning: no connectable databases to check matching "this\.is\.a\.really\.long\.dotted\.string"/, qr/pg_amcheck: warning: no relations to check matching "postgres\.none\.none"/, - qr/pg_amcheck: warning: no relations to check matching "postgres\.long\.dotted\.string"/, qr/pg_amcheck: warning: no relations to check matching "postgres\.pg_catalog\.none"/, qr/pg_amcheck: warning: no relations to check matching "postgres\.none\.pg_class"/, qr/pg_amcheck: warning: no connectable databases to check matching "no_such_database"/, qr/pg_amcheck: warning: no connectable databases to check matching "no\*such\*database"/, qr/pg_amcheck: warning: no connectable databases to check matching "none\.none\.none"/, - qr/pg_amcheck: warning: no connectable databases to check matching "this\.is\.a\.really\.long\.dotted\.string"/, ], 'many unmatched patterns and one matched pattern under --no-strict-names' ); diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 969e2a7a46..d3588607e7 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -178,6 +178,9 @@ static void expand_table_name_patterns(Archive *fout, SimpleStringList *patterns, SimpleOidList *oids, bool strict_names); +static void prohibit_crossdb_refs(PGconn *conn, const char *dbname, + const char *pattern); + static NamespaceInfo *findNamespace(Oid nsoid); static void dumpTableData(Archive *fout, const TableDataInfo *tdinfo); static void refreshMatViewData(Archive *fout, const TableDataInfo *tdinfo); @@ -1315,10 +1318,21 @@ expand_schema_name_patterns(Archive *fout, for (cell = patterns->head; cell; cell = cell->next) { + PQExpBufferData dbbuf; + int dotcnt; + appendPQExpBufferStr(query, "SELECT oid FROM pg_catalog.pg_namespace n\n"); + initPQExpBuffer(&dbbuf); processSQLNamePattern(GetConnection(fout), query, cell->val, false, - false, NULL, "n.nspname", NULL, NULL); + false, NULL, "n.nspname", NULL, NULL, &dbbuf, + &dotcnt); + if (dotcnt > 1) + pg_fatal("improper qualified name (too many dotted names): %s", + cell->val); + else if (dotcnt == 1) + prohibit_crossdb_refs(GetConnection(fout), dbbuf.data, cell->val); + termPQExpBuffer(&dbbuf); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); if (strict_names && PQntuples(res) == 0) @@ -1362,10 +1376,16 @@ expand_extension_name_patterns(Archive *fout, */ for (cell = patterns->head; cell; cell = cell->next) { + int dotcnt; + appendPQExpBufferStr(query, "SELECT oid FROM pg_catalog.pg_extension e\n"); processSQLNamePattern(GetConnection(fout), query, cell->val, false, - false, NULL, "e.extname", NULL, NULL); + false, NULL, "e.extname", NULL, NULL, NULL, + &dotcnt); + if (dotcnt > 0) + pg_fatal("improper qualified name (too many dotted names): %s", + cell->val); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); if (strict_names && PQntuples(res) == 0) @@ -1409,10 +1429,16 @@ expand_foreign_server_name_patterns(Archive *fout, for (cell = patterns->head; cell; cell = cell->next) { + int dotcnt; + appendPQExpBufferStr(query, "SELECT oid FROM pg_catalog.pg_foreign_server s\n"); processSQLNamePattern(GetConnection(fout), query, cell->val, false, - false, NULL, "s.srvname", NULL, NULL); + false, NULL, "s.srvname", NULL, NULL, NULL, + &dotcnt); + if (dotcnt > 0) + pg_fatal("improper qualified name (too many dotted names): %s", + cell->val); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); if (PQntuples(res) == 0) @@ -1455,6 +1481,9 @@ expand_table_name_patterns(Archive *fout, for (cell = patterns->head; cell; cell = cell->next) { + PQExpBufferData dbbuf; + int dotcnt; + /* * Query must remain ABSOLUTELY devoid of unqualified names. This * would be unnecessary given a pg_table_is_visible() variant taking a @@ -1470,9 +1499,17 @@ expand_table_name_patterns(Archive *fout, RELKIND_RELATION, RELKIND_SEQUENCE, RELKIND_VIEW, RELKIND_MATVIEW, RELKIND_FOREIGN_TABLE, RELKIND_PARTITIONED_TABLE); + initPQExpBuffer(&dbbuf); processSQLNamePattern(GetConnection(fout), query, cell->val, true, false, "n.nspname", "c.relname", NULL, - "pg_catalog.pg_table_is_visible(c.oid)"); + "pg_catalog.pg_table_is_visible(c.oid)", &dbbuf, + &dotcnt); + if (dotcnt > 2) + pg_fatal("improper relation name (too many dotted names): %s", + cell->val); + else if (dotcnt == 2) + prohibit_crossdb_refs(GetConnection(fout), dbbuf.data, cell->val); + termPQExpBuffer(&dbbuf); ExecuteSqlStatement(fout, "RESET search_path"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -1493,6 +1530,26 @@ expand_table_name_patterns(Archive *fout, destroyPQExpBuffer(query); } +/* + * Verifies that the connected database name matches the given database name, + * and if not, dies with an error about the given pattern. + * + * The 'dbname' argument should be a literal name parsed from 'pattern'. + */ +static void +prohibit_crossdb_refs(PGconn *conn, const char *dbname, const char *pattern) +{ + const char *db; + + db = PQdb(conn); + if (db == NULL) + pg_fatal("You are currently not connected to a database."); + + if (strcmp(db, dbname) != 0) + pg_fatal("cross-database references are not implemented: %s", + pattern); +} + /* * checkExtensionMembership * Determine whether object is an extension member, and if so, diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 79a723885e..52f9f7c4d6 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -1269,10 +1269,21 @@ expand_dbname_patterns(PGconn *conn, for (SimpleStringListCell *cell = patterns->head; cell; cell = cell->next) { + int dotcnt; + appendPQExpBufferStr(query, "SELECT datname FROM pg_catalog.pg_database n\n"); processSQLNamePattern(conn, query, cell->val, false, - false, NULL, "datname", NULL, NULL); + false, NULL, "datname", NULL, NULL, NULL, + &dotcnt); + + if (dotcnt > 0) + { + pg_log_error("improper qualified name (too many dotted names): %s", + cell->val); + PQfinish(conn); + exit_nicely(1); + } res = executeQuery(conn, query->data); for (int i = 0; i < PQntuples(res); i++) diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index c65c92bfb0..1ecfd7ae23 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -3973,6 +3973,113 @@ qr/\Qpg_dump: error: no matching tables were found for pattern\E/, 'no matching tables'); +######################################### +# Test invalid multipart database names + +$node->command_fails_like( + [ 'pg_dumpall', '--exclude-database', '.' ], + qr/pg_dumpall: error: improper qualified name \(too many dotted names\): \./, + 'pg_dumpall: option --exclude-database rejects multipart pattern "."' +); + +$node->command_fails_like( + [ 'pg_dumpall', '--exclude-database', '.*' ], + qr/pg_dumpall: error: improper qualified name \(too many dotted names\): \.\*/, + 'pg_dumpall: option --exclude-database rejects multipart pattern ".*"' +); + +$node->command_fails_like( + [ 'pg_dumpall', '--exclude-database', '*.*' ], + qr/pg_dumpall: error: improper qualified name \(too many dotted names\): \*\.\*/, + 'pg_dumpall: option --exclude-database rejects multipart pattern "*.*"' +); + +$node->command_fails_like( + [ 'pg_dumpall', '--exclude-database', 'myhost.mydb' ], + qr/pg_dumpall: error: improper qualified name \(too many dotted names\): myhost\.mydb/, + 'pg_dumpall: option --exclude-database rejects multipart database names' +); + +######################################### +# Test valid database exclusion patterns + +$node->command_ok( + [ 'pg_dumpall', '-p', "$port", '--exclude-database', '"myhost.mydb"' ], + 'pg_dumpall: option --exclude-database handles database names with embedded dots' +); + +$node->command_ok( + [ 'pg_dumpall', '--exclude-database', '??*' ], + 'pg_dumpall: option --exclude-database handles database name patterns' +); + + +######################################### +# Test invalid multipart schema names + +$node->command_fails_like( + [ 'pg_dump', '--schema', 'myhost.mydb.myschema' ], + qr/pg_dump: error: improper qualified name \(too many dotted names\): myhost\.mydb\.myschema/, + 'pg_dump: option --schema rejects three-part schema names' +); + +$node->command_fails_like( + [ 'pg_dump', '--schema', 'otherdb.myschema' ], + qr/pg_dump: error: cross-database references are not implemented: otherdb\.myschema/, + 'pg_dump: option --schema rejects cross-database multipart schema names' +); + +$node->command_fails_like( + [ 'pg_dump', '--schema', '.' ], + qr/pg_dump: error: cross-database references are not implemented: \./, + 'pg_dump: option --schema rejects degenerate two-part schema name: "."' +); + +$node->command_fails_like( + [ 'pg_dump', '--schema', '"some.other.db".myschema' ], + qr/pg_dump: error: cross-database references are not implemented: "some\.other\.db"\.myschema/, + 'pg_dump: option --schema rejects cross-database multipart schema names with embedded dots' +); + +$node->command_fails_like( + [ 'pg_dump', '--schema', '.*' ], + qr/pg_dump: error: cross-database references are not implemented: \.\*/, + 'pg_dump: option --schema rejects degenerate two-part schema name: ".*"' +); + +$node->command_fails_like( + [ 'pg_dump', '--schema', '..' ], + qr/pg_dump: error: improper qualified name \(too many dotted names\): \.\./, + 'pg_dump: option --schema rejects degenerate three-part schema name: ".."' +); + +$node->command_fails_like( + [ 'pg_dump', '--schema', '.*.*' ], + qr/pg_dump: error: improper qualified name \(too many dotted names\): \.\*\.\*/, + 'pg_dump: option --schema rejects degenerate three-part schema pattern: ".*.*"' +); + +######################################### +# Test invalid multipart relation names + +$node->command_fails_like( + [ 'pg_dump', '--table', 'myhost.mydb.myschema.mytable' ], + qr/pg_dump: error: improper relation name \(too many dotted names\): myhost\.mydb\.myschema\.mytable/, + 'pg_dump: option --table rejects four-part table names' +); + +$node->command_fails_like( + [ 'pg_dump', '--table', 'otherdb.pg_catalog.pg_class' ], + qr/pg_dump: error: cross-database references are not implemented: otherdb\.pg_catalog\.pg_class/, + 'pg_dump: option --table rejects cross-database three part table names' +); + +command_fails_like( + [ 'pg_dump', '-p', "$port", '--table', '"some.other.db".pg_catalog.pg_class' ], + qr/pg_dump: error: cross-database references are not implemented: "some\.other\.db"\.pg_catalog\.pg_class/, + 'pg_dump: option --table rejects cross-database three part table names with embedded dots' +); + ######################################### # Run all runs diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 583817b0cc..4369f2235b 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -46,6 +46,12 @@ static bool describeOneTSConfig(const char *oid, const char *nspname, const char *pnspname, const char *prsname); static void printACLColumn(PQExpBuffer buf, const char *colname); static bool listOneExtensionContents(const char *extname, const char *oid); +static bool validateSQLNamePattern(PQExpBuffer buf, const char *pattern, + bool have_where, bool force_escape, + const char *schemavar, const char *namevar, + const char *altnamevar, + const char *visibilityrule, + bool *added_clause, int maxparts); /*---------------- @@ -102,9 +108,11 @@ describeAggregates(const char *pattern, bool verbose, bool showSystem) appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n" " AND n.nspname <> 'information_schema'\n"); - processSQLNamePattern(pset.db, &buf, pattern, true, false, - "n.nspname", "p.proname", NULL, - "pg_catalog.pg_function_is_visible(p.oid)"); + if (!validateSQLNamePattern(&buf, pattern, true, false, + "n.nspname", "p.proname", NULL, + "pg_catalog.pg_function_is_visible(p.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 4;"); @@ -170,9 +178,11 @@ describeAccessMethods(const char *pattern, bool verbose) appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_am\n"); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - NULL, "amname", NULL, - NULL); + if (!validateSQLNamePattern(&buf, pattern, false, false, + NULL, "amname", NULL, + NULL, + NULL, 1)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1;"); @@ -230,9 +240,11 @@ describeTablespaces(const char *pattern, bool verbose) appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_tablespace\n"); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - NULL, "spcname", NULL, - NULL); + if (!validateSQLNamePattern(&buf, pattern, false, false, + NULL, "spcname", NULL, + NULL, + NULL, 1)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1;"); @@ -518,9 +530,11 @@ describeFunctions(const char *functypes, const char *func_pattern, appendPQExpBufferStr(&buf, " )\n"); } - processSQLNamePattern(pset.db, &buf, func_pattern, have_where, false, - "n.nspname", "p.proname", NULL, - "pg_catalog.pg_function_is_visible(p.oid)"); + if (!validateSQLNamePattern(&buf, func_pattern, have_where, false, + "n.nspname", "p.proname", NULL, + "pg_catalog.pg_function_is_visible(p.oid)", + NULL, 3)) + return false; for (int i = 0; i < num_arg_patterns; i++) { @@ -542,10 +556,12 @@ describeFunctions(const char *functypes, const char *func_pattern, "pg_catalog.format_type(t%d.oid, NULL)", i); snprintf(tiv, sizeof(tiv), "pg_catalog.pg_type_is_visible(t%d.oid)", i); - processSQLNamePattern(pset.db, &buf, - map_typename_pattern(arg_patterns[i]), - true, false, - nspname, typname, ft, tiv); + if (!validateSQLNamePattern(&buf, + map_typename_pattern(arg_patterns[i]), + true, false, + nspname, typname, ft, tiv, + NULL, 3)) + return false; } else { @@ -660,11 +676,13 @@ describeTypes(const char *pattern, bool verbose, bool showSystem) " AND n.nspname <> 'information_schema'\n"); /* Match name pattern against either internal or external name */ - processSQLNamePattern(pset.db, &buf, map_typename_pattern(pattern), - true, false, - "n.nspname", "t.typname", - "pg_catalog.format_type(t.oid, NULL)", - "pg_catalog.pg_type_is_visible(t.oid)"); + if (!validateSQLNamePattern(&buf, map_typename_pattern(pattern), + true, false, + "n.nspname", "t.typname", + "pg_catalog.format_type(t.oid, NULL)", + "pg_catalog.pg_type_is_visible(t.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2;"); @@ -813,10 +831,12 @@ describeOperators(const char *oper_pattern, appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n" " AND n.nspname <> 'information_schema'\n"); - processSQLNamePattern(pset.db, &buf, oper_pattern, - !showSystem && !oper_pattern, true, - "n.nspname", "o.oprname", NULL, - "pg_catalog.pg_operator_is_visible(o.oid)"); + if (!validateSQLNamePattern(&buf, oper_pattern, + !showSystem && !oper_pattern, true, + "n.nspname", "o.oprname", NULL, + "pg_catalog.pg_operator_is_visible(o.oid)", + NULL, 3)) + return false; if (num_arg_patterns == 1) appendPQExpBufferStr(&buf, " AND o.oprleft = 0\n"); @@ -841,10 +861,12 @@ describeOperators(const char *oper_pattern, "pg_catalog.format_type(t%d.oid, NULL)", i); snprintf(tiv, sizeof(tiv), "pg_catalog.pg_type_is_visible(t%d.oid)", i); - processSQLNamePattern(pset.db, &buf, - map_typename_pattern(arg_patterns[i]), - true, false, - nspname, typname, ft, tiv); + if (!validateSQLNamePattern(&buf, + map_typename_pattern(arg_patterns[i]), + true, false, + nspname, typname, ft, tiv, + NULL, 3)) + return false; } else { @@ -928,8 +950,10 @@ listAllDbs(const char *pattern, bool verbose) " JOIN pg_catalog.pg_tablespace t on d.dattablespace = t.oid\n"); if (pattern) - processSQLNamePattern(pset.db, &buf, pattern, false, false, - NULL, "d.datname", NULL, NULL); + if (!validateSQLNamePattern(&buf, pattern, false, false, + NULL, "d.datname", NULL, NULL, + NULL, 1)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1;"); res = PSQLexec(buf.data); @@ -1078,9 +1102,11 @@ permissionsList(const char *pattern) * point of view. You can see 'em by explicit request though, eg with \z * pg_catalog.* */ - processSQLNamePattern(pset.db, &buf, pattern, true, false, - "n.nspname", "c.relname", NULL, - "n.nspname !~ '^pg_' AND pg_catalog.pg_table_is_visible(c.oid)"); + if (!validateSQLNamePattern(&buf, pattern, true, false, + "n.nspname", "c.relname", NULL, + "n.nspname !~ '^pg_' AND pg_catalog.pg_table_is_visible(c.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2;"); @@ -1145,11 +1171,13 @@ listDefaultACLs(const char *pattern) appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_default_acl d\n" " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.defaclnamespace\n"); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - NULL, - "n.nspname", - "pg_catalog.pg_get_userbyid(d.defaclrole)", - NULL); + if (!validateSQLNamePattern(&buf, pattern, false, false, + NULL, + "n.nspname", + "pg_catalog.pg_get_userbyid(d.defaclrole)", + NULL, + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 3;"); @@ -1221,9 +1249,11 @@ objectDescription(const char *pattern, bool showSystem) appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n" " AND n.nspname <> 'information_schema'\n"); - processSQLNamePattern(pset.db, &buf, pattern, !showSystem && !pattern, - false, "n.nspname", "pgc.conname", NULL, - "pg_catalog.pg_table_is_visible(c.oid)"); + if (!validateSQLNamePattern(&buf, pattern, !showSystem && !pattern, + false, "n.nspname", "pgc.conname", NULL, + "pg_catalog.pg_table_is_visible(c.oid)", + NULL, 3)) + return false; /* Domain constraint descriptions */ appendPQExpBuffer(&buf, @@ -1243,9 +1273,11 @@ objectDescription(const char *pattern, bool showSystem) appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n" " AND n.nspname <> 'information_schema'\n"); - processSQLNamePattern(pset.db, &buf, pattern, !showSystem && !pattern, - false, "n.nspname", "pgc.conname", NULL, - "pg_catalog.pg_type_is_visible(t.oid)"); + if (!validateSQLNamePattern(&buf, pattern, !showSystem && !pattern, + false, "n.nspname", "pgc.conname", NULL, + "pg_catalog.pg_type_is_visible(t.oid)", + NULL, 3)) + return false; /* Operator class descriptions */ appendPQExpBuffer(&buf, @@ -1265,9 +1297,11 @@ objectDescription(const char *pattern, bool showSystem) appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n" " AND n.nspname <> 'information_schema'\n"); - processSQLNamePattern(pset.db, &buf, pattern, true, false, - "n.nspname", "o.opcname", NULL, - "pg_catalog.pg_opclass_is_visible(o.oid)"); + if (!validateSQLNamePattern(&buf, pattern, true, false, + "n.nspname", "o.opcname", NULL, + "pg_catalog.pg_opclass_is_visible(o.oid)", + NULL, 3)) + return false; /* Operator family descriptions */ appendPQExpBuffer(&buf, @@ -1287,9 +1321,11 @@ objectDescription(const char *pattern, bool showSystem) appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n" " AND n.nspname <> 'information_schema'\n"); - processSQLNamePattern(pset.db, &buf, pattern, true, false, - "n.nspname", "opf.opfname", NULL, - "pg_catalog.pg_opfamily_is_visible(opf.oid)"); + if (!validateSQLNamePattern(&buf, pattern, true, false, + "n.nspname", "opf.opfname", NULL, + "pg_catalog.pg_opfamily_is_visible(opf.oid)", + NULL, 3)) + return false; /* Rule descriptions (ignore rules for views) */ appendPQExpBuffer(&buf, @@ -1308,9 +1344,11 @@ objectDescription(const char *pattern, bool showSystem) appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n" " AND n.nspname <> 'information_schema'\n"); - processSQLNamePattern(pset.db, &buf, pattern, true, false, - "n.nspname", "r.rulename", NULL, - "pg_catalog.pg_table_is_visible(c.oid)"); + if (!validateSQLNamePattern(&buf, pattern, true, false, + "n.nspname", "r.rulename", NULL, + "pg_catalog.pg_table_is_visible(c.oid)", + NULL, 3)) + return false; /* Trigger descriptions */ appendPQExpBuffer(&buf, @@ -1328,9 +1366,11 @@ objectDescription(const char *pattern, bool showSystem) appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n" " AND n.nspname <> 'information_schema'\n"); - processSQLNamePattern(pset.db, &buf, pattern, !showSystem && !pattern, false, - "n.nspname", "t.tgname", NULL, - "pg_catalog.pg_table_is_visible(c.oid)"); + if (!validateSQLNamePattern(&buf, pattern, !showSystem && !pattern, false, + "n.nspname", "t.tgname", NULL, + "pg_catalog.pg_table_is_visible(c.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, ") AS tt\n" @@ -1384,9 +1424,11 @@ describeTableDetails(const char *pattern, bool verbose, bool showSystem) appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n" " AND n.nspname <> 'information_schema'\n"); - processSQLNamePattern(pset.db, &buf, pattern, !showSystem && !pattern, false, - "n.nspname", "c.relname", NULL, - "pg_catalog.pg_table_is_visible(c.oid)"); + if (!validateSQLNamePattern(&buf, pattern, !showSystem && !pattern, false, + "n.nspname", "c.relname", NULL, + "pg_catalog.pg_table_is_visible(c.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 2, 3;"); @@ -3572,8 +3614,10 @@ describeRoles(const char *pattern, bool verbose, bool showSystem) if (!showSystem && !pattern) appendPQExpBufferStr(&buf, "WHERE r.rolname !~ '^pg_'\n"); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - NULL, "r.rolname", NULL, NULL); + if (!validateSQLNamePattern(&buf, pattern, false, false, + NULL, "r.rolname", NULL, NULL, + NULL, 1)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1;"); @@ -3696,10 +3740,13 @@ listDbRoleSettings(const char *pattern, const char *pattern2) gettext_noop("Role"), gettext_noop("Database"), gettext_noop("Settings")); - havewhere = processSQLNamePattern(pset.db, &buf, pattern, false, false, - NULL, "r.rolname", NULL, NULL); - processSQLNamePattern(pset.db, &buf, pattern2, havewhere, false, - NULL, "d.datname", NULL, NULL); + if (!validateSQLNamePattern(&buf, pattern, false, false, + NULL, "r.rolname", NULL, NULL, &havewhere, 1)) + return false; + if (!validateSQLNamePattern(&buf, pattern2, havewhere, false, + NULL, "d.datname", NULL, NULL, + NULL, 1)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2;"); res = PSQLexec(buf.data); @@ -3892,9 +3939,11 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys " AND n.nspname !~ '^pg_toast'\n" " AND n.nspname <> 'information_schema'\n"); - processSQLNamePattern(pset.db, &buf, pattern, true, false, - "n.nspname", "c.relname", NULL, - "pg_catalog.pg_table_is_visible(c.oid)"); + if (!validateSQLNamePattern(&buf, pattern, true, false, + "n.nspname", "c.relname", NULL, + "pg_catalog.pg_table_is_visible(c.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1,2;"); @@ -4107,9 +4156,11 @@ listPartitionedTables(const char *reltypes, const char *pattern, bool verbose) " AND n.nspname !~ '^pg_toast'\n" " AND n.nspname <> 'information_schema'\n"); - processSQLNamePattern(pset.db, &buf, pattern, true, false, - "n.nspname", "c.relname", NULL, - "pg_catalog.pg_table_is_visible(c.oid)"); + if (!validateSQLNamePattern(&buf, pattern, true, false, + "n.nspname", "c.relname", NULL, + "pg_catalog.pg_table_is_visible(c.oid)", + NULL, 3)) + return false; appendPQExpBuffer(&buf, "ORDER BY \"Schema\", %s%s\"Name\";", mixed_output ? "\"Type\" DESC, " : "", @@ -4182,8 +4233,10 @@ listLanguages(const char *pattern, bool verbose, bool showSystem) gettext_noop("Description")); if (pattern) - processSQLNamePattern(pset.db, &buf, pattern, false, false, - NULL, "l.lanname", NULL, NULL); + if (!validateSQLNamePattern(&buf, pattern, false, false, + NULL, "l.lanname", NULL, NULL, + NULL, 2)) + return false; if (!showSystem && !pattern) appendPQExpBufferStr(&buf, "WHERE l.lanplcallfoid != 0\n"); @@ -4265,9 +4318,11 @@ listDomains(const char *pattern, bool verbose, bool showSystem) appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n" " AND n.nspname <> 'information_schema'\n"); - processSQLNamePattern(pset.db, &buf, pattern, true, false, - "n.nspname", "t.typname", NULL, - "pg_catalog.pg_type_is_visible(t.oid)"); + if (!validateSQLNamePattern(&buf, pattern, true, false, + "n.nspname", "t.typname", NULL, + "pg_catalog.pg_type_is_visible(t.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2;"); @@ -4339,9 +4394,11 @@ listConversions(const char *pattern, bool verbose, bool showSystem) appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n" " AND n.nspname <> 'information_schema'\n"); - processSQLNamePattern(pset.db, &buf, pattern, true, false, - "n.nspname", "c.conname", NULL, - "pg_catalog.pg_conversion_is_visible(c.oid)"); + if (!validateSQLNamePattern(&buf, pattern, true, false, + "n.nspname", "c.conname", NULL, + "pg_catalog.pg_conversion_is_visible(c.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2;"); @@ -4406,7 +4463,7 @@ describeConfigurationParameters(const char *pattern, bool verbose, processSQLNamePattern(pset.db, &buf, pattern, false, false, NULL, "pg_catalog.lower(s.name)", NULL, - NULL); + NULL, NULL, NULL); else appendPQExpBufferStr(&buf, "WHERE s.source <> 'default' AND\n" " s.setting IS DISTINCT FROM s.boot_val\n"); @@ -4485,8 +4542,10 @@ listEventTriggers(const char *pattern, bool verbose) appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_event_trigger e "); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - NULL, "evtname", NULL, NULL); + if (!validateSQLNamePattern(&buf, pattern, false, false, + NULL, "evtname", NULL, NULL, + NULL, 1)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1"); @@ -4577,10 +4636,12 @@ listExtendedStats(const char *pattern) appendPQExpBufferStr(&buf, " \nFROM pg_catalog.pg_statistic_ext es \n"); - processSQLNamePattern(pset.db, &buf, pattern, - false, false, - "es.stxnamespace::pg_catalog.regnamespace::pg_catalog.text", "es.stxname", - NULL, "pg_catalog.pg_statistics_obj_is_visible(es.oid)"); + if (!validateSQLNamePattern(&buf, pattern, + false, false, + "es.stxnamespace::pg_catalog.regnamespace::pg_catalog.text", "es.stxname", + NULL, "pg_catalog.pg_statistics_obj_is_visible(es.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2;"); @@ -4679,17 +4740,21 @@ listCasts(const char *pattern, bool verbose) * Match name pattern against either internal or external name of either * castsource or casttarget */ - processSQLNamePattern(pset.db, &buf, pattern, true, false, - "ns.nspname", "ts.typname", - "pg_catalog.format_type(ts.oid, NULL)", - "pg_catalog.pg_type_is_visible(ts.oid)"); + if (!validateSQLNamePattern(&buf, pattern, true, false, + "ns.nspname", "ts.typname", + "pg_catalog.format_type(ts.oid, NULL)", + "pg_catalog.pg_type_is_visible(ts.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, ") OR (true"); - processSQLNamePattern(pset.db, &buf, pattern, true, false, - "nt.nspname", "tt.typname", - "pg_catalog.format_type(tt.oid, NULL)", - "pg_catalog.pg_type_is_visible(tt.oid)"); + if (!validateSQLNamePattern(&buf, pattern, true, false, + "nt.nspname", "tt.typname", + "pg_catalog.format_type(tt.oid, NULL)", + "pg_catalog.pg_type_is_visible(tt.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, ") )\nORDER BY 1, 2;"); @@ -4785,9 +4850,11 @@ listCollations(const char *pattern, bool verbose, bool showSystem) */ appendPQExpBufferStr(&buf, " AND c.collencoding IN (-1, pg_catalog.pg_char_to_encoding(pg_catalog.getdatabaseencoding()))\n"); - processSQLNamePattern(pset.db, &buf, pattern, true, false, - "n.nspname", "c.collname", NULL, - "pg_catalog.pg_collation_is_visible(c.oid)"); + if (!validateSQLNamePattern(&buf, pattern, true, false, + "n.nspname", "c.collname", NULL, + "pg_catalog.pg_collation_is_visible(c.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2;"); @@ -4845,10 +4912,12 @@ listSchemas(const char *pattern, bool verbose, bool showSystem) appendPQExpBufferStr(&buf, "WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'\n"); - processSQLNamePattern(pset.db, &buf, pattern, - !showSystem && !pattern, false, - NULL, "n.nspname", NULL, - NULL); + if (!validateSQLNamePattern(&buf, pattern, + !showSystem && !pattern, false, + NULL, "n.nspname", NULL, + NULL, + NULL, 2)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1;"); @@ -4959,9 +5028,11 @@ listTSParsers(const char *pattern, bool verbose) gettext_noop("Description") ); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - "n.nspname", "p.prsname", NULL, - "pg_catalog.pg_ts_parser_is_visible(p.oid)"); + if (!validateSQLNamePattern(&buf, pattern, false, false, + "n.nspname", "p.prsname", NULL, + "pg_catalog.pg_ts_parser_is_visible(p.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2;"); @@ -5000,9 +5071,11 @@ listTSParsersVerbose(const char *pattern) "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.prsnamespace\n" ); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - "n.nspname", "p.prsname", NULL, - "pg_catalog.pg_ts_parser_is_visible(p.oid)"); + if (!validateSQLNamePattern(&buf, pattern, false, false, + "n.nspname", "p.prsname", NULL, + "pg_catalog.pg_ts_parser_is_visible(p.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2;"); @@ -5207,9 +5280,11 @@ listTSDictionaries(const char *pattern, bool verbose) appendPQExpBufferStr(&buf, "FROM pg_catalog.pg_ts_dict d\n" "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.dictnamespace\n"); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - "n.nspname", "d.dictname", NULL, - "pg_catalog.pg_ts_dict_is_visible(d.oid)"); + if (!validateSQLNamePattern(&buf, pattern, false, false, + "n.nspname", "d.dictname", NULL, + "pg_catalog.pg_ts_dict_is_visible(d.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2;"); @@ -5268,9 +5343,11 @@ listTSTemplates(const char *pattern, bool verbose) appendPQExpBufferStr(&buf, "FROM pg_catalog.pg_ts_template t\n" "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.tmplnamespace\n"); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - "n.nspname", "t.tmplname", NULL, - "pg_catalog.pg_ts_template_is_visible(t.oid)"); + if (!validateSQLNamePattern(&buf, pattern, false, false, + "n.nspname", "t.tmplname", NULL, + "pg_catalog.pg_ts_template_is_visible(t.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2;"); @@ -5318,9 +5395,11 @@ listTSConfigs(const char *pattern, bool verbose) gettext_noop("Description") ); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - "n.nspname", "c.cfgname", NULL, - "pg_catalog.pg_ts_config_is_visible(c.oid)"); + if (!validateSQLNamePattern(&buf, pattern, false, false, + "n.nspname", "c.cfgname", NULL, + "pg_catalog.pg_ts_config_is_visible(c.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2;"); @@ -5360,9 +5439,11 @@ listTSConfigsVerbose(const char *pattern) "WHERE p.oid = c.cfgparser\n" ); - processSQLNamePattern(pset.db, &buf, pattern, true, false, - "n.nspname", "c.cfgname", NULL, - "pg_catalog.pg_ts_config_is_visible(c.oid)"); + if (!validateSQLNamePattern(&buf, pattern, true, false, + "n.nspname", "c.cfgname", NULL, + "pg_catalog.pg_ts_config_is_visible(c.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 3, 2;"); @@ -5532,8 +5613,10 @@ listForeignDataWrappers(const char *pattern, bool verbose) " ON d.classoid = fdw.tableoid " "AND d.objoid = fdw.oid AND d.objsubid = 0\n"); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - NULL, "fdwname", NULL, NULL); + if (!validateSQLNamePattern(&buf, pattern, false, false, + NULL, "fdwname", NULL, NULL, + NULL, 1)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1;"); @@ -5604,8 +5687,10 @@ listForeignServers(const char *pattern, bool verbose) "ON d.classoid = s.tableoid AND d.objoid = s.oid " "AND d.objsubid = 0\n"); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - NULL, "s.srvname", NULL, NULL); + if (!validateSQLNamePattern(&buf, pattern, false, false, + NULL, "s.srvname", NULL, NULL, + NULL, 1)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1;"); @@ -5655,8 +5740,10 @@ listUserMappings(const char *pattern, bool verbose) appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_user_mappings um\n"); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - NULL, "um.srvname", "um.usename", NULL); + if (!validateSQLNamePattern(&buf, pattern, false, false, + NULL, "um.srvname", "um.usename", NULL, + NULL, 1)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2;"); @@ -5722,9 +5809,11 @@ listForeignTables(const char *pattern, bool verbose) " ON d.classoid = c.tableoid AND " "d.objoid = c.oid AND d.objsubid = 0\n"); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - "n.nspname", "c.relname", NULL, - "pg_catalog.pg_table_is_visible(c.oid)"); + if (!validateSQLNamePattern(&buf, pattern, false, false, + "n.nspname", "c.relname", NULL, + "pg_catalog.pg_table_is_visible(c.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2;"); @@ -5768,10 +5857,12 @@ listExtensions(const char *pattern) gettext_noop("Schema"), gettext_noop("Description")); - processSQLNamePattern(pset.db, &buf, pattern, - false, false, - NULL, "e.extname", NULL, - NULL); + if (!validateSQLNamePattern(&buf, pattern, + false, false, + NULL, "e.extname", NULL, + NULL, + NULL, 1)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1;"); @@ -5807,10 +5898,12 @@ listExtensionContents(const char *pattern) "SELECT e.extname, e.oid\n" "FROM pg_catalog.pg_extension e\n"); - processSQLNamePattern(pset.db, &buf, pattern, - false, false, - NULL, "e.extname", NULL, - NULL); + if (!validateSQLNamePattern(&buf, pattern, + false, false, + NULL, "e.extname", NULL, + NULL, + NULL, 1)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1;"); @@ -5892,6 +5985,59 @@ listOneExtensionContents(const char *extname, const char *oid) return true; } +/* + * validateSQLNamePattern + * + * Wrapper around string_utils's processSQLNamePattern which also checks the + * pattern's validity. In addition to that function's parameters, takes a + * 'maxparts' parameter specifying the maximum number of dotted names the + * pattern is allowed to have, and a 'added_clause' parameter that returns by + * reference whether a clause was added to 'buf'. Returns whether the pattern + * passed validation, after logging any errors. + */ +static bool +validateSQLNamePattern(PQExpBuffer buf, const char *pattern, bool have_where, + bool force_escape, const char *schemavar, + const char *namevar, const char *altnamevar, + const char *visibilityrule, bool *added_clause, + int maxparts) +{ + PQExpBufferData dbbuf; + int dotcnt; + bool added; + + initPQExpBuffer(&dbbuf); + added = processSQLNamePattern(pset.db, buf, pattern, have_where, force_escape, + schemavar, namevar, altnamevar, + visibilityrule, &dbbuf, &dotcnt); + if (added_clause != NULL) + *added_clause = added; + + if (dotcnt >= maxparts) + { + pg_log_error("improper qualified name (too many dotted names): %s", + pattern); + termPQExpBuffer(&dbbuf); + return false; + } + + if (maxparts > 1 && dotcnt == maxparts-1) + { + if (PQdb(pset.db) == NULL) + { + pg_log_error("You are currently not connected to a database."); + return false; + } + if (strcmp(PQdb(pset.db), dbbuf.data) != 0) + { + pg_log_error("cross-database references are not implemented: %s", + pattern); + return false; + } + } + return true; +} + /* * \dRp * Lists publications. @@ -5943,9 +6089,11 @@ listPublications(const char *pattern) appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_publication\n"); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - NULL, "pubname", NULL, - NULL); + if (!validateSQLNamePattern(&buf, pattern, false, false, + NULL, "pubname", NULL, + NULL, + NULL, 1)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1;"); @@ -6056,9 +6204,11 @@ describePublications(const char *pattern) appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_publication\n"); - processSQLNamePattern(pset.db, &buf, pattern, false, false, - NULL, "pubname", NULL, - NULL); + if (!validateSQLNamePattern(&buf, pattern, false, false, + NULL, "pubname", NULL, + NULL, + NULL, 1)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 2;"); @@ -6266,9 +6416,11 @@ describeSubscriptions(const char *pattern, bool verbose) " FROM pg_catalog.pg_database\n" " WHERE datname = pg_catalog.current_database())"); - processSQLNamePattern(pset.db, &buf, pattern, true, false, - NULL, "subname", NULL, - NULL); + if (!validateSQLNamePattern(&buf, pattern, true, false, + NULL, "subname", NULL, + NULL, + NULL, 1)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1;"); @@ -6369,15 +6521,19 @@ listOperatorClasses(const char *access_method_pattern, " LEFT JOIN pg_catalog.pg_namespace ofn ON ofn.oid = of.opfnamespace\n"); if (access_method_pattern) - have_where = processSQLNamePattern(pset.db, &buf, access_method_pattern, - false, false, NULL, "am.amname", NULL, NULL); + if (!validateSQLNamePattern(&buf, access_method_pattern, + false, false, NULL, "am.amname", NULL, NULL, + &have_where, 1)) + return false; if (type_pattern) { /* Match type name pattern against either internal or external name */ - processSQLNamePattern(pset.db, &buf, type_pattern, have_where, false, - "tn.nspname", "t.typname", - "pg_catalog.format_type(t.oid, NULL)", - "pg_catalog.pg_type_is_visible(t.oid)"); + if (!validateSQLNamePattern(&buf, type_pattern, have_where, false, + "tn.nspname", "t.typname", + "pg_catalog.format_type(t.oid, NULL)", + "pg_catalog.pg_type_is_visible(t.oid)", + NULL, 3)) + return false; } appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 4;"); @@ -6441,8 +6597,10 @@ listOperatorFamilies(const char *access_method_pattern, " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = f.opfnamespace\n"); if (access_method_pattern) - have_where = processSQLNamePattern(pset.db, &buf, access_method_pattern, - false, false, NULL, "am.amname", NULL, NULL); + if (!validateSQLNamePattern(&buf, access_method_pattern, + false, false, NULL, "am.amname", NULL, NULL, + &have_where, 1)) + return false; if (type_pattern) { appendPQExpBuffer(&buf, @@ -6454,10 +6612,12 @@ listOperatorFamilies(const char *access_method_pattern, " WHERE oc.opcfamily = f.oid\n", have_where ? "AND" : "WHERE"); /* Match type name pattern against either internal or external name */ - processSQLNamePattern(pset.db, &buf, type_pattern, true, false, - "tn.nspname", "t.typname", - "pg_catalog.format_type(t.oid, NULL)", - "pg_catalog.pg_type_is_visible(t.oid)"); + if (!validateSQLNamePattern(&buf, type_pattern, true, false, + "tn.nspname", "t.typname", + "pg_catalog.format_type(t.oid, NULL)", + "pg_catalog.pg_type_is_visible(t.oid)", + NULL, 3)) + return false; appendPQExpBufferStr(&buf, " )\n"); } @@ -6535,13 +6695,17 @@ listOpFamilyOperators(const char *access_method_pattern, " LEFT JOIN pg_catalog.pg_opfamily ofs ON ofs.oid = o.amopsortfamily\n"); if (access_method_pattern) - have_where = processSQLNamePattern(pset.db, &buf, access_method_pattern, - false, false, NULL, "am.amname", - NULL, NULL); + if (!validateSQLNamePattern(&buf, access_method_pattern, + false, false, NULL, "am.amname", + NULL, NULL, + &have_where, 1)) + return false; if (family_pattern) - processSQLNamePattern(pset.db, &buf, family_pattern, have_where, false, - "nsf.nspname", "of.opfname", NULL, NULL); + if (!validateSQLNamePattern(&buf, family_pattern, have_where, false, + "nsf.nspname", "of.opfname", NULL, NULL, + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2,\n" " o.amoplefttype = o.amoprighttype DESC,\n" @@ -6619,12 +6783,16 @@ listOpFamilyFunctions(const char *access_method_pattern, " LEFT JOIN pg_catalog.pg_proc p ON ap.amproc = p.oid\n"); if (access_method_pattern) - have_where = processSQLNamePattern(pset.db, &buf, access_method_pattern, - false, false, NULL, "am.amname", - NULL, NULL); + if (!validateSQLNamePattern(&buf, access_method_pattern, + false, false, NULL, "am.amname", + NULL, NULL, + &have_where, 1)) + return false; if (family_pattern) - processSQLNamePattern(pset.db, &buf, family_pattern, have_where, false, - "ns.nspname", "of.opfname", NULL, NULL); + if (!validateSQLNamePattern(&buf, family_pattern, have_where, false, + "ns.nspname", "of.opfname", NULL, NULL, + NULL, 3)) + return false; appendPQExpBufferStr(&buf, "ORDER BY 1, 2,\n" " ap.amproclefttype = ap.amprocrighttype DESC,\n" diff --git a/src/fe_utils/string_utils.c b/src/fe_utils/string_utils.c index 1c61840462..c3ea4fc186 100644 --- a/src/fe_utils/string_utils.c +++ b/src/fe_utils/string_utils.c @@ -882,6 +882,9 @@ appendReloptionsArray(PQExpBuffer buffer, const char *reloptions, * altnamevar: NULL, or name of an alternative variable to match against name. * visibilityrule: clause to use if we want to restrict to visible objects * (for example, "pg_catalog.pg_table_is_visible(p.oid)"). Can be NULL. + * dbnamebuf: output parameter receiving the database name portion of the + * pattern, if any. Can be NULL. + * dotcnt: how many separators were parsed from the pattern, by reference. * * Formatting note: the text already present in buf should end with a newline. * The appended text, if any, will end with one too. @@ -890,16 +893,21 @@ bool processSQLNamePattern(PGconn *conn, PQExpBuffer buf, const char *pattern, bool have_where, bool force_escape, const char *schemavar, const char *namevar, - const char *altnamevar, const char *visibilityrule) + const char *altnamevar, const char *visibilityrule, + PQExpBuffer dbnamebuf, int *dotcnt) { PQExpBufferData schemabuf; PQExpBufferData namebuf; bool added_clause = false; + int dcnt; #define WHEREAND() \ (appendPQExpBufferStr(buf, have_where ? " AND " : "WHERE "), \ have_where = true, added_clause = true) + if (dotcnt == NULL) + dotcnt = &dcnt; + *dotcnt = 0; if (pattern == NULL) { /* Default: select all visible objects */ @@ -922,9 +930,11 @@ processSQLNamePattern(PGconn *conn, PQExpBuffer buf, const char *pattern, * If the caller provided a schemavar, we want to split the pattern on * ".", otherwise not. */ - patternToSQLRegex(PQclientEncoding(conn), NULL, - (schemavar ? &schemabuf : NULL), &namebuf, - pattern, force_escape); + patternToSQLRegex(PQclientEncoding(conn), + (schemavar ? dbnamebuf : NULL), + (schemavar ? &schemabuf : NULL), + &namebuf, + pattern, force_escape, true, dotcnt); /* * Now decide what we need to emit. We may run under a hostile @@ -937,7 +947,7 @@ processSQLNamePattern(PGconn *conn, PQExpBuffer buf, const char *pattern, * is >= v12 then we need to force it through explicit COLLATE clauses, * otherwise the "C" collation attached to "name" catalog columns wins. */ - if (namebuf.len > 2) + if (namevar && namebuf.len > 2) { /* We have a name pattern, so constrain the namevar(s) */ @@ -971,7 +981,7 @@ processSQLNamePattern(PGconn *conn, PQExpBuffer buf, const char *pattern, } } - if (schemabuf.len > 2) + if (schemavar && schemabuf.len > 2) { /* We have a schema pattern, so constrain the schemavar */ @@ -1012,8 +1022,7 @@ processSQLNamePattern(PGconn *conn, PQExpBuffer buf, const char *pattern, * If the dbnamebuf and schemabuf arguments are non-NULL, and the pattern * contains two or more dbname/schema/name separators, we parse the portions of * the pattern prior to the first and second separators into dbnamebuf and - * schemabuf, and the rest into namebuf. (Additional dots in the name portion - * are not treated as special.) + * schemabuf, and the rest into namebuf. * * If dbnamebuf is NULL and schemabuf is non-NULL, and the pattern contains at * least one separator, we parse the first portion into schemabuf and the rest @@ -1021,24 +1030,49 @@ processSQLNamePattern(PGconn *conn, PQExpBuffer buf, const char *pattern, * * Otherwise, we parse all the pattern into namebuf. * + * If the pattern contains more dotted parts than buffers to parse into, the + * extra dots will be treated as literal characters and written into the + * namebuf, though they will be counted. Callers should always check the value + * returned by reference in dotcnt and handle this error case appropriately. + * * We surround the regexps with "^(...)$" to force them to match whole strings, * as per SQL practice. We have to have parens in case strings contain "|", * else the "^" and "$" will be bound into the first and last alternatives - * which is not what we want. + * which is not what we want. Whether this is done for dbnamebuf is controlled + * by the want_literal_dbname parameter. * * The regexps we parse into the buffers are appended to the data (if any) * already present. If we parse fewer fields than the number of buffers we * were given, the extra buffers are unaltered. + * + * encoding: the character encoding for the given pattern + * dbnamebuf: output parameter receiving the database name portion of the + * pattern, if any. Can be NULL. + * schemabuf: output parameter receiving the schema name portion of the + * pattern, if any. Can be NULL. + * namebuf: output parameter receiving the database name portion of the + * pattern, if any. Can be NULL. + * pattern: user-specified pattern option, or NULL if none ("*" is implied). + * force_escape: always quote regexp special characters, even outside + * double quotes (else they are quoted only between double quotes). + * want_literal_dbname: if true, regexp special characters within the database + * name portion of the pattern will not be escaped, nor will the dbname be + * converted into a regular expression. + * dotcnt: output parameter receiving the number of separators parsed from the + * pattern. */ void patternToSQLRegex(int encoding, PQExpBuffer dbnamebuf, PQExpBuffer schemabuf, - PQExpBuffer namebuf, const char *pattern, bool force_escape) + PQExpBuffer namebuf, const char *pattern, bool force_escape, + bool want_literal_dbname, int *dotcnt) { PQExpBufferData buf[3]; + PQExpBufferData left_literal; PQExpBuffer curbuf; PQExpBuffer maxbuf; int i; bool inquotes; + bool left; const char *cp; Assert(pattern != NULL); @@ -1046,7 +1080,9 @@ patternToSQLRegex(int encoding, PQExpBuffer dbnamebuf, PQExpBuffer schemabuf, /* callers should never expect "dbname.relname" format */ Assert(dbnamebuf == NULL || schemabuf != NULL); + Assert(dotcnt != NULL); + *dotcnt = 0; inquotes = false; cp = pattern; @@ -1058,6 +1094,13 @@ patternToSQLRegex(int encoding, PQExpBuffer dbnamebuf, PQExpBuffer schemabuf, maxbuf = &buf[0]; curbuf = &buf[0]; + if (want_literal_dbname) + { + left = true; + initPQExpBuffer(&left_literal); + } + else + left = false; initPQExpBuffer(curbuf); appendPQExpBufferStr(curbuf, "^("); while (*cp) @@ -1070,6 +1113,8 @@ patternToSQLRegex(int encoding, PQExpBuffer dbnamebuf, PQExpBuffer schemabuf, { /* emit one quote, stay in inquotes mode */ appendPQExpBufferChar(curbuf, '"'); + if (left) + appendPQExpBufferChar(&left_literal, '"'); cp++; } else @@ -1080,32 +1125,40 @@ patternToSQLRegex(int encoding, PQExpBuffer dbnamebuf, PQExpBuffer schemabuf, { appendPQExpBufferChar(curbuf, pg_tolower((unsigned char) ch)); + if (left) + appendPQExpBufferChar(&left_literal, + pg_tolower((unsigned char) ch)); cp++; } else if (!inquotes && ch == '*') { appendPQExpBufferStr(curbuf, ".*"); + if (left) + appendPQExpBufferChar(&left_literal, '*'); cp++; } else if (!inquotes && ch == '?') { appendPQExpBufferChar(curbuf, '.'); + if (left) + appendPQExpBufferChar(&left_literal, '?'); cp++; } - - /* - * When we find a dbname/schema/name separator, we treat it specially - * only if the caller requested more patterns to be parsed than we - * have already parsed from the pattern. Otherwise, dot characters - * are not special. - */ - else if (!inquotes && ch == '.' && curbuf < maxbuf) + else if (!inquotes && ch == '.') { - appendPQExpBufferStr(curbuf, ")$"); - curbuf++; - initPQExpBuffer(curbuf); - appendPQExpBufferStr(curbuf, "^("); - cp++; + left = false; + if (dotcnt) + (*dotcnt)++; + if (curbuf < maxbuf) + { + appendPQExpBufferStr(curbuf, ")$"); + curbuf++; + initPQExpBuffer(curbuf); + appendPQExpBufferStr(curbuf, "^("); + cp++; + } + else + appendPQExpBufferChar(curbuf, *cp++); } else if (ch == '$') { @@ -1117,6 +1170,8 @@ patternToSQLRegex(int encoding, PQExpBuffer dbnamebuf, PQExpBuffer schemabuf, * having it possess its regexp meaning. */ appendPQExpBufferStr(curbuf, "\\$"); + if (left) + appendPQExpBufferChar(&left_literal, '$'); cp++; } else @@ -1141,25 +1196,35 @@ patternToSQLRegex(int encoding, PQExpBuffer dbnamebuf, PQExpBuffer schemabuf, appendPQExpBufferChar(curbuf, '\\'); i = PQmblenBounded(cp, encoding); while (i--) + { + if (left) + appendPQExpBufferChar(&left_literal, *cp); appendPQExpBufferChar(curbuf, *cp++); + } } } appendPQExpBufferStr(curbuf, ")$"); - appendPQExpBufferStr(namebuf, curbuf->data); - termPQExpBuffer(curbuf); - - if (curbuf > buf) + if (namebuf) { + appendPQExpBufferStr(namebuf, curbuf->data); + termPQExpBuffer(curbuf); curbuf--; + } + + if (schemabuf && curbuf >= buf) + { appendPQExpBufferStr(schemabuf, curbuf->data); termPQExpBuffer(curbuf); + curbuf--; + } - if (curbuf > buf) - { - curbuf--; + if (dbnamebuf && curbuf >= buf) + { + if (want_literal_dbname) + appendPQExpBufferStr(dbnamebuf, left_literal.data); + else appendPQExpBufferStr(dbnamebuf, curbuf->data); - termPQExpBuffer(curbuf); - } + termPQExpBuffer(curbuf); } } diff --git a/src/include/fe_utils/string_utils.h b/src/include/fe_utils/string_utils.h index b9b8708dab..fa4deb2497 100644 --- a/src/include/fe_utils/string_utils.h +++ b/src/include/fe_utils/string_utils.h @@ -55,10 +55,12 @@ extern bool processSQLNamePattern(PGconn *conn, PQExpBuffer buf, const char *pattern, bool have_where, bool force_escape, const char *schemavar, const char *namevar, - const char *altnamevar, const char *visibilityrule); + const char *altnamevar, const char *visibilityrule, + PQExpBuffer dbnamebuf, int *dotcnt); extern void patternToSQLRegex(int encoding, PQExpBuffer dbnamebuf, PQExpBuffer schemabuf, PQExpBuffer namebuf, - const char *pattern, bool force_escape); + const char *pattern, bool force_escape, + bool want_literal_dbname, int *dotcnt); #endif /* STRING_UTILS_H */ diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out index 8e11ebbcaa..1c5b5d2763 100644 --- a/src/test/regress/expected/psql.out +++ b/src/test/regress/expected/psql.out @@ -5549,3 +5549,807 @@ SELECT * FROM bla ORDER BY 1; # final ON_ERROR_ROLLBACK: off DROP TABLE bla; DROP FUNCTION psql_error; +-- check describing invalid multipart names +\dA regression.heap +improper qualified name (too many dotted names): regression.heap +\dA nonesuch.heap +improper qualified name (too many dotted names): nonesuch.heap +\dt host.regression.pg_catalog.pg_class +improper qualified name (too many dotted names): host.regression.pg_catalog.pg_class +\dt |.pg_catalog.pg_class +cross-database references are not implemented: |.pg_catalog.pg_class +\dt nonesuch.pg_catalog.pg_class +cross-database references are not implemented: nonesuch.pg_catalog.pg_class +\da host.regression.pg_catalog.sum +improper qualified name (too many dotted names): host.regression.pg_catalog.sum +\da +.pg_catalog.sum +cross-database references are not implemented: +.pg_catalog.sum +\da nonesuch.pg_catalog.sum +cross-database references are not implemented: nonesuch.pg_catalog.sum +\dAc nonesuch.brin +improper qualified name (too many dotted names): nonesuch.brin +\dAc regression.brin +improper qualified name (too many dotted names): regression.brin +\dAf nonesuch.brin +improper qualified name (too many dotted names): nonesuch.brin +\dAf regression.brin +improper qualified name (too many dotted names): regression.brin +\dAo nonesuch.brin +improper qualified name (too many dotted names): nonesuch.brin +\dAo regression.brin +improper qualified name (too many dotted names): regression.brin +\dAp nonesuch.brin +improper qualified name (too many dotted names): nonesuch.brin +\dAp regression.brin +improper qualified name (too many dotted names): regression.brin +\db nonesuch.pg_default +improper qualified name (too many dotted names): nonesuch.pg_default +\db regression.pg_default +improper qualified name (too many dotted names): regression.pg_default +\dc host.regression.public.conversion +improper qualified name (too many dotted names): host.regression.public.conversion +\dc (.public.conversion +cross-database references are not implemented: (.public.conversion +\dc nonesuch.public.conversion +cross-database references are not implemented: nonesuch.public.conversion +\dC host.regression.pg_catalog.int8 +improper qualified name (too many dotted names): host.regression.pg_catalog.int8 +\dC ).pg_catalog.int8 +cross-database references are not implemented: ).pg_catalog.int8 +\dC nonesuch.pg_catalog.int8 +cross-database references are not implemented: nonesuch.pg_catalog.int8 +\dd host.regression.pg_catalog.pg_class +improper qualified name (too many dotted names): host.regression.pg_catalog.pg_class +\dd [.pg_catalog.pg_class +cross-database references are not implemented: [.pg_catalog.pg_class +\dd nonesuch.pg_catalog.pg_class +cross-database references are not implemented: nonesuch.pg_catalog.pg_class +\dD host.regression.public.gtestdomain1 +improper qualified name (too many dotted names): host.regression.public.gtestdomain1 +\dD ].public.gtestdomain1 +cross-database references are not implemented: ].public.gtestdomain1 +\dD nonesuch.public.gtestdomain1 +cross-database references are not implemented: nonesuch.public.gtestdomain1 +\ddp host.regression.pg_catalog.pg_class +improper qualified name (too many dotted names): host.regression.pg_catalog.pg_class +\ddp {.pg_catalog.pg_class +cross-database references are not implemented: {.pg_catalog.pg_class +\ddp nonesuch.pg_catalog.pg_class +cross-database references are not implemented: nonesuch.pg_catalog.pg_class +\dE host.regression.public.ft +improper qualified name (too many dotted names): host.regression.public.ft +\dE }.public.ft +cross-database references are not implemented: }.public.ft +\dE nonesuch.public.ft +cross-database references are not implemented: nonesuch.public.ft +\di host.regression.public.tenk1_hundred +improper qualified name (too many dotted names): host.regression.public.tenk1_hundred +\di ..public.tenk1_hundred +improper qualified name (too many dotted names): ..public.tenk1_hundred +\di nonesuch.public.tenk1_hundred +cross-database references are not implemented: nonesuch.public.tenk1_hundred +\dm host.regression.public.mvtest_bb +improper qualified name (too many dotted names): host.regression.public.mvtest_bb +\dm ^.public.mvtest_bb +cross-database references are not implemented: ^.public.mvtest_bb +\dm nonesuch.public.mvtest_bb +cross-database references are not implemented: nonesuch.public.mvtest_bb +\ds host.regression.public.check_seq +improper qualified name (too many dotted names): host.regression.public.check_seq +\ds regression|mydb.public.check_seq +cross-database references are not implemented: regression|mydb.public.check_seq +\ds nonesuch.public.check_seq +cross-database references are not implemented: nonesuch.public.check_seq +\dt host.regression.public.b_star +improper qualified name (too many dotted names): host.regression.public.b_star +\dt regres+ion.public.b_star +cross-database references are not implemented: regres+ion.public.b_star +\dt nonesuch.public.b_star +cross-database references are not implemented: nonesuch.public.b_star +\dv host.regression.public.shoe +improper qualified name (too many dotted names): host.regression.public.shoe +\dv regress(ion).public.shoe +cross-database references are not implemented: regress(ion).public.shoe +\dv nonesuch.public.shoe +cross-database references are not implemented: nonesuch.public.shoe +\des nonesuch.server +improper qualified name (too many dotted names): nonesuch.server +\des regression.server +improper qualified name (too many dotted names): regression.server +\des nonesuch.server +improper qualified name (too many dotted names): nonesuch.server +\des regression.server +improper qualified name (too many dotted names): regression.server +\des nonesuch.username +improper qualified name (too many dotted names): nonesuch.username +\des regression.username +improper qualified name (too many dotted names): regression.username +\dew nonesuch.fdw +improper qualified name (too many dotted names): nonesuch.fdw +\dew regression.fdw +improper qualified name (too many dotted names): regression.fdw +\df host.regression.public.namelen +improper qualified name (too many dotted names): host.regression.public.namelen +\df regres[qrstuv]ion.public.namelen +cross-database references are not implemented: regres[qrstuv]ion.public.namelen +\df nonesuch.public.namelen +cross-database references are not implemented: nonesuch.public.namelen +\dF host.regression.pg_catalog.arabic +improper qualified name (too many dotted names): host.regression.pg_catalog.arabic +\dF regres{1,2}ion.pg_catalog.arabic +cross-database references are not implemented: regres{1,2}ion.pg_catalog.arabic +\dF nonesuch.pg_catalog.arabic +cross-database references are not implemented: nonesuch.pg_catalog.arabic +\dFd host.regression.pg_catalog.arabic_stem +improper qualified name (too many dotted names): host.regression.pg_catalog.arabic_stem +\dFd regres?ion.pg_catalog.arabic_stem +cross-database references are not implemented: regres?ion.pg_catalog.arabic_stem +\dFd nonesuch.pg_catalog.arabic_stem +cross-database references are not implemented: nonesuch.pg_catalog.arabic_stem +\dFp host.regression.pg_catalog.default +improper qualified name (too many dotted names): host.regression.pg_catalog.default +\dFp ^regression.pg_catalog.default +cross-database references are not implemented: ^regression.pg_catalog.default +\dFp nonesuch.pg_catalog.default +cross-database references are not implemented: nonesuch.pg_catalog.default +\dFt host.regression.pg_catalog.ispell +improper qualified name (too many dotted names): host.regression.pg_catalog.ispell +\dFt regression$.pg_catalog.ispell +cross-database references are not implemented: regression$.pg_catalog.ispell +\dFt nonesuch.pg_catalog.ispell +cross-database references are not implemented: nonesuch.pg_catalog.ispell +\dg nonesuch.pg_database_owner +improper qualified name (too many dotted names): nonesuch.pg_database_owner +\dg regression.pg_database_owner +improper qualified name (too many dotted names): regression.pg_database_owner +\dL host.regression.plpgsql +improper qualified name (too many dotted names): host.regression.plpgsql +\dL *.plpgsql +cross-database references are not implemented: *.plpgsql +\dL nonesuch.plpgsql +cross-database references are not implemented: nonesuch.plpgsql +\dn host.regression.public +improper qualified name (too many dotted names): host.regression.public +\dn """".public +cross-database references are not implemented: """".public +\dn nonesuch.public +cross-database references are not implemented: nonesuch.public +\do host.regression.public.!=- +improper qualified name (too many dotted names): host.regression.public.!=- +\do "regression|mydb".public.!=- +cross-database references are not implemented: "regression|mydb".public.!=- +\do nonesuch.public.!=- +cross-database references are not implemented: nonesuch.public.!=- +\dO host.regression.pg_catalog.POSIX +improper qualified name (too many dotted names): host.regression.pg_catalog.POSIX +\dO .pg_catalog.POSIX +cross-database references are not implemented: .pg_catalog.POSIX +\dO nonesuch.pg_catalog.POSIX +cross-database references are not implemented: nonesuch.pg_catalog.POSIX +\dp host.regression.public.a_star +improper qualified name (too many dotted names): host.regression.public.a_star +\dp "regres+ion".public.a_star +cross-database references are not implemented: "regres+ion".public.a_star +\dp nonesuch.public.a_star +cross-database references are not implemented: nonesuch.public.a_star +\dP host.regression.public.mlparted +improper qualified name (too many dotted names): host.regression.public.mlparted +\dP "regres(sion)".public.mlparted +cross-database references are not implemented: "regres(sion)".public.mlparted +\dP nonesuch.public.mlparted +cross-database references are not implemented: nonesuch.public.mlparted +\drds nonesuch.lc_messages +improper qualified name (too many dotted names): nonesuch.lc_messages +\drds regression.lc_messages +improper qualified name (too many dotted names): regression.lc_messages +\dRp public.mypub +improper qualified name (too many dotted names): public.mypub +\dRp regression.mypub +improper qualified name (too many dotted names): regression.mypub +\dRs public.mysub +improper qualified name (too many dotted names): public.mysub +\dRs regression.mysub +improper qualified name (too many dotted names): regression.mysub +\dT host.regression.public.widget +improper qualified name (too many dotted names): host.regression.public.widget +\dT "regression{1,2}".public.widget +cross-database references are not implemented: "regression{1,2}".public.widget +\dT nonesuch.public.widget +cross-database references are not implemented: nonesuch.public.widget +\dx regression.plpgsql +improper qualified name (too many dotted names): regression.plpgsql +\dx nonesuch.plpgsql +improper qualified name (too many dotted names): nonesuch.plpgsql +\dX host.regression.public.func_deps_stat +improper qualified name (too many dotted names): host.regression.public.func_deps_stat +\dX "^regression$".public.func_deps_stat +cross-database references are not implemented: "^regression$".public.func_deps_stat +\dX nonesuch.public.func_deps_stat +cross-database references are not implemented: nonesuch.public.func_deps_stat +\dy regression.myevt +improper qualified name (too many dotted names): regression.myevt +\dy nonesuch.myevt +improper qualified name (too many dotted names): nonesuch.myevt +-- check that dots within quoted name segments are not counted +\dA "no.such.access.method" +List of access methods + Name | Type +------+------ +(0 rows) + +\dt "no.such.table.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\da "no.such.aggregate.function" + List of aggregate functions + Schema | Name | Result data type | Argument data types | Description +--------+------+------------------+---------------------+------------- +(0 rows) + +\dAc "no.such.operator.class" + List of operator classes + AM | Input type | Storage type | Operator class | Default? +----+------------+--------------+----------------+---------- +(0 rows) + +\dAf "no.such.operator.family" + List of operator families + AM | Operator family | Applicable types +----+-----------------+------------------ +(0 rows) + +\dAo "no.such.operator.of.operator.family" + List of operators of operator families + AM | Operator family | Operator | Strategy | Purpose +----+-----------------+----------+----------+--------- +(0 rows) + +\dAp "no.such.operator.support.function.of.operator.family" + List of support functions of operator families + AM | Operator family | Registered left type | Registered right type | Number | Function +----+-----------------+----------------------+-----------------------+--------+---------- +(0 rows) + +\db "no.such.tablespace" + List of tablespaces + Name | Owner | Location +------+-------+---------- +(0 rows) + +\dc "no.such.conversion" + List of conversions + Schema | Name | Source | Destination | Default? +--------+------+--------+-------------+---------- +(0 rows) + +\dC "no.such.cast" + List of casts + Source type | Target type | Function | Implicit? +-------------+-------------+----------+----------- +(0 rows) + +\dd "no.such.object.description" + Object descriptions + Schema | Name | Object | Description +--------+------+--------+------------- +(0 rows) + +\dD "no.such.domain" + List of domains + Schema | Name | Type | Collation | Nullable | Default | Check +--------+------+------+-----------+----------+---------+------- +(0 rows) + +\ddp "no.such.default.access.privilege" + Default access privileges + Owner | Schema | Type | Access privileges +-------+--------+------+------------------- +(0 rows) + +\di "no.such.index.relation" + List of relations + Schema | Name | Type | Owner | Table +--------+------+------+-------+------- +(0 rows) + +\dm "no.such.materialized.view" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\ds "no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\dt "no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\dv "no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\des "no.such.foreign.server" + List of foreign servers + Name | Owner | Foreign-data wrapper +------+-------+---------------------- +(0 rows) + +\dew "no.such.foreign.data.wrapper" + List of foreign-data wrappers + Name | Owner | Handler | Validator +------+-------+---------+----------- +(0 rows) + +\df "no.such.function" + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+------+------------------+---------------------+------ +(0 rows) + +\dF "no.such.text.search.configuration" +List of text search configurations + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFd "no.such.text.search.dictionary" +List of text search dictionaries + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFp "no.such.text.search.parser" + List of text search parsers + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFt "no.such.text.search.template" +List of text search templates + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dg "no.such.role" + List of roles + Role name | Attributes | Member of +-----------+------------+----------- + +\dL "no.such.language" + List of languages + Name | Owner | Trusted | Description +------+-------+---------+------------- +(0 rows) + +\dn "no.such.schema" +List of schemas + Name | Owner +------+------- +(0 rows) + +\do "no.such.operator" + List of operators + Schema | Name | Left arg type | Right arg type | Result type | Description +--------+------+---------------+----------------+-------------+------------- +(0 rows) + +\dO "no.such.collation" + List of collations + Schema | Name | Collate | Ctype | ICU Locale | Provider | Deterministic? +--------+------+---------+-------+------------+----------+---------------- +(0 rows) + +\dp "no.such.access.privilege" + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------+------+------+-------------------+-------------------+---------- +(0 rows) + +\dP "no.such.partitioned.relation" + List of partitioned relations + Schema | Name | Owner | Type | Parent name | Table +--------+------+-------+------+-------------+------- +(0 rows) + +\drds "no.such.setting" + List of settings + Role | Database | Settings +------+----------+---------- +(0 rows) + +\dRp "no.such.publication" + List of publications + Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +------+-------+------------+---------+---------+---------+-----------+---------- +(0 rows) + +\dRs "no.such.subscription" + List of subscriptions + Name | Owner | Enabled | Publication +------+-------+---------+------------- +(0 rows) + +\dT "no.such.data.type" + List of data types + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dx "no.such.installed.extension" + List of installed extensions + Name | Version | Schema | Description +------+---------+--------+------------- +(0 rows) + +\dX "no.such.extended.statistics" + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +--------+------+------------+-----------+--------------+----- +(0 rows) + +\dy "no.such.event.trigger" + List of event triggers + Name | Event | Owner | Enabled | Function | Tags +------+-------+-------+---------+----------+------ +(0 rows) + +-- again, but with dotted schema qualifications. +\dA "no.such.schema"."no.such.access.method" +improper qualified name (too many dotted names): "no.such.schema"."no.such.access.method" +\dt "no.such.schema"."no.such.table.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\da "no.such.schema"."no.such.aggregate.function" + List of aggregate functions + Schema | Name | Result data type | Argument data types | Description +--------+------+------------------+---------------------+------------- +(0 rows) + +\dAc "no.such.schema"."no.such.operator.class" +improper qualified name (too many dotted names): "no.such.schema"."no.such.operator.class" +\dAf "no.such.schema"."no.such.operator.family" +improper qualified name (too many dotted names): "no.such.schema"."no.such.operator.family" +\dAo "no.such.schema"."no.such.operator.of.operator.family" +improper qualified name (too many dotted names): "no.such.schema"."no.such.operator.of.operator.family" +\dAp "no.such.schema"."no.such.operator.support.function.of.operator.family" +improper qualified name (too many dotted names): "no.such.schema"."no.such.operator.support.function.of.operator.family" +\db "no.such.schema"."no.such.tablespace" +improper qualified name (too many dotted names): "no.such.schema"."no.such.tablespace" +\dc "no.such.schema"."no.such.conversion" + List of conversions + Schema | Name | Source | Destination | Default? +--------+------+--------+-------------+---------- +(0 rows) + +\dC "no.such.schema"."no.such.cast" + List of casts + Source type | Target type | Function | Implicit? +-------------+-------------+----------+----------- +(0 rows) + +\dd "no.such.schema"."no.such.object.description" + Object descriptions + Schema | Name | Object | Description +--------+------+--------+------------- +(0 rows) + +\dD "no.such.schema"."no.such.domain" + List of domains + Schema | Name | Type | Collation | Nullable | Default | Check +--------+------+------+-----------+----------+---------+------- +(0 rows) + +\ddp "no.such.schema"."no.such.default.access.privilege" + Default access privileges + Owner | Schema | Type | Access privileges +-------+--------+------+------------------- +(0 rows) + +\di "no.such.schema"."no.such.index.relation" + List of relations + Schema | Name | Type | Owner | Table +--------+------+------+-------+------- +(0 rows) + +\dm "no.such.schema"."no.such.materialized.view" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\ds "no.such.schema"."no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\dt "no.such.schema"."no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\dv "no.such.schema"."no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\des "no.such.schema"."no.such.foreign.server" +improper qualified name (too many dotted names): "no.such.schema"."no.such.foreign.server" +\dew "no.such.schema"."no.such.foreign.data.wrapper" +improper qualified name (too many dotted names): "no.such.schema"."no.such.foreign.data.wrapper" +\df "no.such.schema"."no.such.function" + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+------+------------------+---------------------+------ +(0 rows) + +\dF "no.such.schema"."no.such.text.search.configuration" +List of text search configurations + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFd "no.such.schema"."no.such.text.search.dictionary" +List of text search dictionaries + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFp "no.such.schema"."no.such.text.search.parser" + List of text search parsers + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFt "no.such.schema"."no.such.text.search.template" +List of text search templates + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dg "no.such.schema"."no.such.role" +improper qualified name (too many dotted names): "no.such.schema"."no.such.role" +\dL "no.such.schema"."no.such.language" +cross-database references are not implemented: "no.such.schema"."no.such.language" +\do "no.such.schema"."no.such.operator" + List of operators + Schema | Name | Left arg type | Right arg type | Result type | Description +--------+------+---------------+----------------+-------------+------------- +(0 rows) + +\dO "no.such.schema"."no.such.collation" + List of collations + Schema | Name | Collate | Ctype | ICU Locale | Provider | Deterministic? +--------+------+---------+-------+------------+----------+---------------- +(0 rows) + +\dp "no.such.schema"."no.such.access.privilege" + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------+------+------+-------------------+-------------------+---------- +(0 rows) + +\dP "no.such.schema"."no.such.partitioned.relation" + List of partitioned relations + Schema | Name | Owner | Type | Parent name | Table +--------+------+-------+------+-------------+------- +(0 rows) + +\drds "no.such.schema"."no.such.setting" +improper qualified name (too many dotted names): "no.such.schema"."no.such.setting" +\dRp "no.such.schema"."no.such.publication" +improper qualified name (too many dotted names): "no.such.schema"."no.such.publication" +\dRs "no.such.schema"."no.such.subscription" +improper qualified name (too many dotted names): "no.such.schema"."no.such.subscription" +\dT "no.such.schema"."no.such.data.type" + List of data types + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dx "no.such.schema"."no.such.installed.extension" +improper qualified name (too many dotted names): "no.such.schema"."no.such.installed.extension" +\dX "no.such.schema"."no.such.extended.statistics" + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +--------+------+------------+-----------+--------------+----- +(0 rows) + +\dy "no.such.schema"."no.such.event.trigger" +improper qualified name (too many dotted names): "no.such.schema"."no.such.event.trigger" +-- again, but with current database and dotted schema qualifications. +\dt regression."no.such.schema"."no.such.table.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\da regression."no.such.schema"."no.such.aggregate.function" + List of aggregate functions + Schema | Name | Result data type | Argument data types | Description +--------+------+------------------+---------------------+------------- +(0 rows) + +\dc regression."no.such.schema"."no.such.conversion" + List of conversions + Schema | Name | Source | Destination | Default? +--------+------+--------+-------------+---------- +(0 rows) + +\dC regression."no.such.schema"."no.such.cast" + List of casts + Source type | Target type | Function | Implicit? +-------------+-------------+----------+----------- +(0 rows) + +\dd regression."no.such.schema"."no.such.object.description" + Object descriptions + Schema | Name | Object | Description +--------+------+--------+------------- +(0 rows) + +\dD regression."no.such.schema"."no.such.domain" + List of domains + Schema | Name | Type | Collation | Nullable | Default | Check +--------+------+------+-----------+----------+---------+------- +(0 rows) + +\di regression."no.such.schema"."no.such.index.relation" + List of relations + Schema | Name | Type | Owner | Table +--------+------+------+-------+------- +(0 rows) + +\dm regression."no.such.schema"."no.such.materialized.view" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\ds regression."no.such.schema"."no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\dt regression."no.such.schema"."no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\dv regression."no.such.schema"."no.such.relation" + List of relations + Schema | Name | Type | Owner +--------+------+------+------- +(0 rows) + +\df regression."no.such.schema"."no.such.function" + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+------+------------------+---------------------+------ +(0 rows) + +\dF regression."no.such.schema"."no.such.text.search.configuration" +List of text search configurations + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFd regression."no.such.schema"."no.such.text.search.dictionary" +List of text search dictionaries + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFp regression."no.such.schema"."no.such.text.search.parser" + List of text search parsers + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dFt regression."no.such.schema"."no.such.text.search.template" +List of text search templates + Schema | Name | Description +--------+------+------------- +(0 rows) + +\do regression."no.such.schema"."no.such.operator" + List of operators + Schema | Name | Left arg type | Right arg type | Result type | Description +--------+------+---------------+----------------+-------------+------------- +(0 rows) + +\dO regression."no.such.schema"."no.such.collation" + List of collations + Schema | Name | Collate | Ctype | ICU Locale | Provider | Deterministic? +--------+------+---------+-------+------------+----------+---------------- +(0 rows) + +\dp regression."no.such.schema"."no.such.access.privilege" + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------+------+------+-------------------+-------------------+---------- +(0 rows) + +\dP regression."no.such.schema"."no.such.partitioned.relation" + List of partitioned relations + Schema | Name | Owner | Type | Parent name | Table +--------+------+-------+------+-------------+------- +(0 rows) + +\dT regression."no.such.schema"."no.such.data.type" + List of data types + Schema | Name | Description +--------+------+------------- +(0 rows) + +\dX regression."no.such.schema"."no.such.extended.statistics" + List of extended statistics + Schema | Name | Definition | Ndistinct | Dependencies | MCV +--------+------+------------+-----------+--------------+----- +(0 rows) + +-- again, but with dotted database and dotted schema qualifications. +\dt "no.such.database"."no.such.schema"."no.such.table.relation" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.table.relation" +\da "no.such.database"."no.such.schema"."no.such.aggregate.function" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.aggregate.function" +\dc "no.such.database"."no.such.schema"."no.such.conversion" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.conversion" +\dC "no.such.database"."no.such.schema"."no.such.cast" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.cast" +\dd "no.such.database"."no.such.schema"."no.such.object.description" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.object.description" +\dD "no.such.database"."no.such.schema"."no.such.domain" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.domain" +\ddp "no.such.database"."no.such.schema"."no.such.default.access.privilege" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.default.access.privilege" +\di "no.such.database"."no.such.schema"."no.such.index.relation" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.index.relation" +\dm "no.such.database"."no.such.schema"."no.such.materialized.view" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.materialized.view" +\ds "no.such.database"."no.such.schema"."no.such.relation" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.relation" +\dt "no.such.database"."no.such.schema"."no.such.relation" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.relation" +\dv "no.such.database"."no.such.schema"."no.such.relation" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.relation" +\df "no.such.database"."no.such.schema"."no.such.function" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.function" +\dF "no.such.database"."no.such.schema"."no.such.text.search.configuration" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.text.search.configuration" +\dFd "no.such.database"."no.such.schema"."no.such.text.search.dictionary" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.text.search.dictionary" +\dFp "no.such.database"."no.such.schema"."no.such.text.search.parser" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.text.search.parser" +\dFt "no.such.database"."no.such.schema"."no.such.text.search.template" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.text.search.template" +\do "no.such.database"."no.such.schema"."no.such.operator" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.operator" +\dO "no.such.database"."no.such.schema"."no.such.collation" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.collation" +\dp "no.such.database"."no.such.schema"."no.such.access.privilege" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.access.privilege" +\dP "no.such.database"."no.such.schema"."no.such.partitioned.relation" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.partitioned.relation" +\dT "no.such.database"."no.such.schema"."no.such.data.type" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.data.type" +\dX "no.such.database"."no.such.schema"."no.such.extended.statistics" +cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.extended.statistics" diff --git a/src/test/regress/sql/psql.sql b/src/test/regress/sql/psql.sql index bf372c37a5..6fc0ac6bd1 100644 --- a/src/test/regress/sql/psql.sql +++ b/src/test/regress/sql/psql.sql @@ -1463,3 +1463,245 @@ SELECT * FROM bla ORDER BY 1; \echo '# final ON_ERROR_ROLLBACK:' :ON_ERROR_ROLLBACK DROP TABLE bla; DROP FUNCTION psql_error; + +-- check describing invalid multipart names +\dA regression.heap +\dA nonesuch.heap +\dt host.regression.pg_catalog.pg_class +\dt |.pg_catalog.pg_class +\dt nonesuch.pg_catalog.pg_class +\da host.regression.pg_catalog.sum +\da +.pg_catalog.sum +\da nonesuch.pg_catalog.sum +\dAc nonesuch.brin +\dAc regression.brin +\dAf nonesuch.brin +\dAf regression.brin +\dAo nonesuch.brin +\dAo regression.brin +\dAp nonesuch.brin +\dAp regression.brin +\db nonesuch.pg_default +\db regression.pg_default +\dc host.regression.public.conversion +\dc (.public.conversion +\dc nonesuch.public.conversion +\dC host.regression.pg_catalog.int8 +\dC ).pg_catalog.int8 +\dC nonesuch.pg_catalog.int8 +\dd host.regression.pg_catalog.pg_class +\dd [.pg_catalog.pg_class +\dd nonesuch.pg_catalog.pg_class +\dD host.regression.public.gtestdomain1 +\dD ].public.gtestdomain1 +\dD nonesuch.public.gtestdomain1 +\ddp host.regression.pg_catalog.pg_class +\ddp {.pg_catalog.pg_class +\ddp nonesuch.pg_catalog.pg_class +\dE host.regression.public.ft +\dE }.public.ft +\dE nonesuch.public.ft +\di host.regression.public.tenk1_hundred +\di ..public.tenk1_hundred +\di nonesuch.public.tenk1_hundred +\dm host.regression.public.mvtest_bb +\dm ^.public.mvtest_bb +\dm nonesuch.public.mvtest_bb +\ds host.regression.public.check_seq +\ds regression|mydb.public.check_seq +\ds nonesuch.public.check_seq +\dt host.regression.public.b_star +\dt regres+ion.public.b_star +\dt nonesuch.public.b_star +\dv host.regression.public.shoe +\dv regress(ion).public.shoe +\dv nonesuch.public.shoe +\des nonesuch.server +\des regression.server +\des nonesuch.server +\des regression.server +\des nonesuch.username +\des regression.username +\dew nonesuch.fdw +\dew regression.fdw +\df host.regression.public.namelen +\df regres[qrstuv]ion.public.namelen +\df nonesuch.public.namelen +\dF host.regression.pg_catalog.arabic +\dF regres{1,2}ion.pg_catalog.arabic +\dF nonesuch.pg_catalog.arabic +\dFd host.regression.pg_catalog.arabic_stem +\dFd regres?ion.pg_catalog.arabic_stem +\dFd nonesuch.pg_catalog.arabic_stem +\dFp host.regression.pg_catalog.default +\dFp ^regression.pg_catalog.default +\dFp nonesuch.pg_catalog.default +\dFt host.regression.pg_catalog.ispell +\dFt regression$.pg_catalog.ispell +\dFt nonesuch.pg_catalog.ispell +\dg nonesuch.pg_database_owner +\dg regression.pg_database_owner +\dL host.regression.plpgsql +\dL *.plpgsql +\dL nonesuch.plpgsql +\dn host.regression.public +\dn """".public +\dn nonesuch.public +\do host.regression.public.!=- +\do "regression|mydb".public.!=- +\do nonesuch.public.!=- +\dO host.regression.pg_catalog.POSIX +\dO .pg_catalog.POSIX +\dO nonesuch.pg_catalog.POSIX +\dp host.regression.public.a_star +\dp "regres+ion".public.a_star +\dp nonesuch.public.a_star +\dP host.regression.public.mlparted +\dP "regres(sion)".public.mlparted +\dP nonesuch.public.mlparted +\drds nonesuch.lc_messages +\drds regression.lc_messages +\dRp public.mypub +\dRp regression.mypub +\dRs public.mysub +\dRs regression.mysub +\dT host.regression.public.widget +\dT "regression{1,2}".public.widget +\dT nonesuch.public.widget +\dx regression.plpgsql +\dx nonesuch.plpgsql +\dX host.regression.public.func_deps_stat +\dX "^regression$".public.func_deps_stat +\dX nonesuch.public.func_deps_stat +\dy regression.myevt +\dy nonesuch.myevt + +-- check that dots within quoted name segments are not counted +\dA "no.such.access.method" +\dt "no.such.table.relation" +\da "no.such.aggregate.function" +\dAc "no.such.operator.class" +\dAf "no.such.operator.family" +\dAo "no.such.operator.of.operator.family" +\dAp "no.such.operator.support.function.of.operator.family" +\db "no.such.tablespace" +\dc "no.such.conversion" +\dC "no.such.cast" +\dd "no.such.object.description" +\dD "no.such.domain" +\ddp "no.such.default.access.privilege" +\di "no.such.index.relation" +\dm "no.such.materialized.view" +\ds "no.such.relation" +\dt "no.such.relation" +\dv "no.such.relation" +\des "no.such.foreign.server" +\dew "no.such.foreign.data.wrapper" +\df "no.such.function" +\dF "no.such.text.search.configuration" +\dFd "no.such.text.search.dictionary" +\dFp "no.such.text.search.parser" +\dFt "no.such.text.search.template" +\dg "no.such.role" +\dL "no.such.language" +\dn "no.such.schema" +\do "no.such.operator" +\dO "no.such.collation" +\dp "no.such.access.privilege" +\dP "no.such.partitioned.relation" +\drds "no.such.setting" +\dRp "no.such.publication" +\dRs "no.such.subscription" +\dT "no.such.data.type" +\dx "no.such.installed.extension" +\dX "no.such.extended.statistics" +\dy "no.such.event.trigger" + +-- again, but with dotted schema qualifications. +\dA "no.such.schema"."no.such.access.method" +\dt "no.such.schema"."no.such.table.relation" +\da "no.such.schema"."no.such.aggregate.function" +\dAc "no.such.schema"."no.such.operator.class" +\dAf "no.such.schema"."no.such.operator.family" +\dAo "no.such.schema"."no.such.operator.of.operator.family" +\dAp "no.such.schema"."no.such.operator.support.function.of.operator.family" +\db "no.such.schema"."no.such.tablespace" +\dc "no.such.schema"."no.such.conversion" +\dC "no.such.schema"."no.such.cast" +\dd "no.such.schema"."no.such.object.description" +\dD "no.such.schema"."no.such.domain" +\ddp "no.such.schema"."no.such.default.access.privilege" +\di "no.such.schema"."no.such.index.relation" +\dm "no.such.schema"."no.such.materialized.view" +\ds "no.such.schema"."no.such.relation" +\dt "no.such.schema"."no.such.relation" +\dv "no.such.schema"."no.such.relation" +\des "no.such.schema"."no.such.foreign.server" +\dew "no.such.schema"."no.such.foreign.data.wrapper" +\df "no.such.schema"."no.such.function" +\dF "no.such.schema"."no.such.text.search.configuration" +\dFd "no.such.schema"."no.such.text.search.dictionary" +\dFp "no.such.schema"."no.such.text.search.parser" +\dFt "no.such.schema"."no.such.text.search.template" +\dg "no.such.schema"."no.such.role" +\dL "no.such.schema"."no.such.language" +\do "no.such.schema"."no.such.operator" +\dO "no.such.schema"."no.such.collation" +\dp "no.such.schema"."no.such.access.privilege" +\dP "no.such.schema"."no.such.partitioned.relation" +\drds "no.such.schema"."no.such.setting" +\dRp "no.such.schema"."no.such.publication" +\dRs "no.such.schema"."no.such.subscription" +\dT "no.such.schema"."no.such.data.type" +\dx "no.such.schema"."no.such.installed.extension" +\dX "no.such.schema"."no.such.extended.statistics" +\dy "no.such.schema"."no.such.event.trigger" + +-- again, but with current database and dotted schema qualifications. +\dt regression."no.such.schema"."no.such.table.relation" +\da regression."no.such.schema"."no.such.aggregate.function" +\dc regression."no.such.schema"."no.such.conversion" +\dC regression."no.such.schema"."no.such.cast" +\dd regression."no.such.schema"."no.such.object.description" +\dD regression."no.such.schema"."no.such.domain" +\di regression."no.such.schema"."no.such.index.relation" +\dm regression."no.such.schema"."no.such.materialized.view" +\ds regression."no.such.schema"."no.such.relation" +\dt regression."no.such.schema"."no.such.relation" +\dv regression."no.such.schema"."no.such.relation" +\df regression."no.such.schema"."no.such.function" +\dF regression."no.such.schema"."no.such.text.search.configuration" +\dFd regression."no.such.schema"."no.such.text.search.dictionary" +\dFp regression."no.such.schema"."no.such.text.search.parser" +\dFt regression."no.such.schema"."no.such.text.search.template" +\do regression."no.such.schema"."no.such.operator" +\dO regression."no.such.schema"."no.such.collation" +\dp regression."no.such.schema"."no.such.access.privilege" +\dP regression."no.such.schema"."no.such.partitioned.relation" +\dT regression."no.such.schema"."no.such.data.type" +\dX regression."no.such.schema"."no.such.extended.statistics" + +-- again, but with dotted database and dotted schema qualifications. +\dt "no.such.database"."no.such.schema"."no.such.table.relation" +\da "no.such.database"."no.such.schema"."no.such.aggregate.function" +\dc "no.such.database"."no.such.schema"."no.such.conversion" +\dC "no.such.database"."no.such.schema"."no.such.cast" +\dd "no.such.database"."no.such.schema"."no.such.object.description" +\dD "no.such.database"."no.such.schema"."no.such.domain" +\ddp "no.such.database"."no.such.schema"."no.such.default.access.privilege" +\di "no.such.database"."no.such.schema"."no.such.index.relation" +\dm "no.such.database"."no.such.schema"."no.such.materialized.view" +\ds "no.such.database"."no.such.schema"."no.such.relation" +\dt "no.such.database"."no.such.schema"."no.such.relation" +\dv "no.such.database"."no.such.schema"."no.such.relation" +\df "no.such.database"."no.such.schema"."no.such.function" +\dF "no.such.database"."no.such.schema"."no.such.text.search.configuration" +\dFd "no.such.database"."no.such.schema"."no.such.text.search.dictionary" +\dFp "no.such.database"."no.such.schema"."no.such.text.search.parser" +\dFt "no.such.database"."no.such.schema"."no.such.text.search.template" +\do "no.such.database"."no.such.schema"."no.such.operator" +\dO "no.such.database"."no.such.schema"."no.such.collation" +\dp "no.such.database"."no.such.schema"."no.such.access.privilege" +\dP "no.such.database"."no.such.schema"."no.such.partitioned.relation" +\dT "no.such.database"."no.such.schema"."no.such.data.type" +\dX "no.such.database"."no.such.schema"."no.such.extended.statistics" From eafdf9de06e9b60168f5e47cedcfceecdc6d4b5f Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 20 Apr 2022 18:08:15 -0400 Subject: [PATCH 559/772] Disallow infinite endpoints in generate_series() for timestamps. Such cases will lead to infinite loops, so they're of no practical value. The numeric variant of generate_series() already threw error for this, so borrow its message wording. Per report from Richard Wesley. Back-patch to all supported branches. Discussion: https://postgr.es/m/91B44E7B-68D5-448F-95C8-B4B3B0F5DEAF@duckdblabs.com --- src/backend/utils/adt/timestamp.c | 28 +++++++++++++ src/test/regress/expected/timestamp.out | 49 +++++++++++++++++++++++ src/test/regress/expected/timestamptz.out | 49 +++++++++++++++++++++++ src/test/regress/sql/timestamp.sql | 15 +++++++ src/test/regress/sql/timestamptz.sql | 15 +++++++ 5 files changed, 156 insertions(+) diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 552b631ba7..93c10e1ae4 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -5778,6 +5778,20 @@ generate_series_timestamp(PG_FUNCTION_ARGS) MemoryContext oldcontext; Interval interval_zero; + /* Reject infinities in start and stop values */ + if (TIMESTAMP_IS_NOBEGIN(start) || + TIMESTAMP_IS_NOEND(start)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("start value cannot be infinity"))); + if (TIMESTAMP_IS_NOBEGIN(finish) || + TIMESTAMP_IS_NOEND(finish)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("stop value cannot be infinity"))); + + /* Interval doesn't (currently) have infinity, so nothing to check */ + /* create a function context for cross-call persistence */ funcctx = SRF_FIRSTCALL_INIT(); @@ -5858,6 +5872,20 @@ generate_series_timestamptz(PG_FUNCTION_ARGS) MemoryContext oldcontext; Interval interval_zero; + /* Reject infinities in start and stop values */ + if (TIMESTAMP_IS_NOBEGIN(start) || + TIMESTAMP_IS_NOEND(start)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("start value cannot be infinity"))); + if (TIMESTAMP_IS_NOBEGIN(finish) || + TIMESTAMP_IS_NOEND(finish)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("stop value cannot be infinity"))); + + /* Interval doesn't (currently) have infinity, so nothing to check */ + /* create a function context for cross-call persistence */ funcctx = SRF_FIRSTCALL_INIT(); diff --git a/src/test/regress/expected/timestamp.out b/src/test/regress/expected/timestamp.out index 1a2d48cae9..d5ca6b76a4 100644 --- a/src/test/regress/expected/timestamp.out +++ b/src/test/regress/expected/timestamp.out @@ -2019,3 +2019,52 @@ SELECT make_timestamp(-44, 3, 15, 12, 30, 15); -- should fail select make_timestamp(0, 7, 15, 12, 30, 15); ERROR: date field value out of range: 0-07-15 +-- generate_series for timestamp +select * from generate_series('2020-01-01 00:00'::timestamp, + '2020-01-02 03:00'::timestamp, + '1 hour'::interval); + generate_series +-------------------------- + Wed Jan 01 00:00:00 2020 + Wed Jan 01 01:00:00 2020 + Wed Jan 01 02:00:00 2020 + Wed Jan 01 03:00:00 2020 + Wed Jan 01 04:00:00 2020 + Wed Jan 01 05:00:00 2020 + Wed Jan 01 06:00:00 2020 + Wed Jan 01 07:00:00 2020 + Wed Jan 01 08:00:00 2020 + Wed Jan 01 09:00:00 2020 + Wed Jan 01 10:00:00 2020 + Wed Jan 01 11:00:00 2020 + Wed Jan 01 12:00:00 2020 + Wed Jan 01 13:00:00 2020 + Wed Jan 01 14:00:00 2020 + Wed Jan 01 15:00:00 2020 + Wed Jan 01 16:00:00 2020 + Wed Jan 01 17:00:00 2020 + Wed Jan 01 18:00:00 2020 + Wed Jan 01 19:00:00 2020 + Wed Jan 01 20:00:00 2020 + Wed Jan 01 21:00:00 2020 + Wed Jan 01 22:00:00 2020 + Wed Jan 01 23:00:00 2020 + Thu Jan 02 00:00:00 2020 + Thu Jan 02 01:00:00 2020 + Thu Jan 02 02:00:00 2020 + Thu Jan 02 03:00:00 2020 +(28 rows) + +-- errors +select * from generate_series('-infinity'::timestamp, + '2020-01-02 03:00'::timestamp, + '1 hour'::interval); +ERROR: start value cannot be infinity +select * from generate_series('2020-01-01 00:00'::timestamp, + 'infinity'::timestamp, + '1 hour'::interval); +ERROR: stop value cannot be infinity +select * from generate_series('2020-01-01 00:00'::timestamp, + '2020-01-02 03:00'::timestamp, + '0 hour'::interval); +ERROR: step size cannot equal zero diff --git a/src/test/regress/expected/timestamptz.out b/src/test/regress/expected/timestamptz.out index d402802db0..4a29484ec3 100644 --- a/src/test/regress/expected/timestamptz.out +++ b/src/test/regress/expected/timestamptz.out @@ -2362,6 +2362,55 @@ SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, 'PST8PDT'); (1 row) RESET TimeZone; +-- generate_series for timestamptz +select * from generate_series('2020-01-01 00:00'::timestamptz, + '2020-01-02 03:00'::timestamptz, + '1 hour'::interval); + generate_series +------------------------------ + Wed Jan 01 00:00:00 2020 PST + Wed Jan 01 01:00:00 2020 PST + Wed Jan 01 02:00:00 2020 PST + Wed Jan 01 03:00:00 2020 PST + Wed Jan 01 04:00:00 2020 PST + Wed Jan 01 05:00:00 2020 PST + Wed Jan 01 06:00:00 2020 PST + Wed Jan 01 07:00:00 2020 PST + Wed Jan 01 08:00:00 2020 PST + Wed Jan 01 09:00:00 2020 PST + Wed Jan 01 10:00:00 2020 PST + Wed Jan 01 11:00:00 2020 PST + Wed Jan 01 12:00:00 2020 PST + Wed Jan 01 13:00:00 2020 PST + Wed Jan 01 14:00:00 2020 PST + Wed Jan 01 15:00:00 2020 PST + Wed Jan 01 16:00:00 2020 PST + Wed Jan 01 17:00:00 2020 PST + Wed Jan 01 18:00:00 2020 PST + Wed Jan 01 19:00:00 2020 PST + Wed Jan 01 20:00:00 2020 PST + Wed Jan 01 21:00:00 2020 PST + Wed Jan 01 22:00:00 2020 PST + Wed Jan 01 23:00:00 2020 PST + Thu Jan 02 00:00:00 2020 PST + Thu Jan 02 01:00:00 2020 PST + Thu Jan 02 02:00:00 2020 PST + Thu Jan 02 03:00:00 2020 PST +(28 rows) + +-- errors +select * from generate_series('-infinity'::timestamptz, + '2020-01-02 03:00'::timestamptz, + '1 hour'::interval); +ERROR: start value cannot be infinity +select * from generate_series('2020-01-01 00:00'::timestamptz, + 'infinity'::timestamptz, + '1 hour'::interval); +ERROR: stop value cannot be infinity +select * from generate_series('2020-01-01 00:00'::timestamptz, + '2020-01-02 03:00'::timestamptz, + '0 hour'::interval); +ERROR: step size cannot equal zero -- -- Test behavior with a dynamic (time-varying) timezone abbreviation. -- These tests rely on the knowledge that MSK (Europe/Moscow standard time) diff --git a/src/test/regress/sql/timestamp.sql b/src/test/regress/sql/timestamp.sql index e011e779ea..0778e5d7c0 100644 --- a/src/test/regress/sql/timestamp.sql +++ b/src/test/regress/sql/timestamp.sql @@ -370,3 +370,18 @@ SELECT make_timestamp(2014, 12, 28, 6, 30, 45.887); SELECT make_timestamp(-44, 3, 15, 12, 30, 15); -- should fail select make_timestamp(0, 7, 15, 12, 30, 15); + +-- generate_series for timestamp +select * from generate_series('2020-01-01 00:00'::timestamp, + '2020-01-02 03:00'::timestamp, + '1 hour'::interval); +-- errors +select * from generate_series('-infinity'::timestamp, + '2020-01-02 03:00'::timestamp, + '1 hour'::interval); +select * from generate_series('2020-01-01 00:00'::timestamp, + 'infinity'::timestamp, + '1 hour'::interval); +select * from generate_series('2020-01-01 00:00'::timestamp, + '2020-01-02 03:00'::timestamp, + '0 hour'::interval); diff --git a/src/test/regress/sql/timestamptz.sql b/src/test/regress/sql/timestamptz.sql index 7cd2420b08..c1643de0f1 100644 --- a/src/test/regress/sql/timestamptz.sql +++ b/src/test/regress/sql/timestamptz.sql @@ -432,6 +432,21 @@ SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, 'PST8PDT'); RESET TimeZone; +-- generate_series for timestamptz +select * from generate_series('2020-01-01 00:00'::timestamptz, + '2020-01-02 03:00'::timestamptz, + '1 hour'::interval); +-- errors +select * from generate_series('-infinity'::timestamptz, + '2020-01-02 03:00'::timestamptz, + '1 hour'::interval); +select * from generate_series('2020-01-01 00:00'::timestamptz, + 'infinity'::timestamptz, + '1 hour'::interval); +select * from generate_series('2020-01-01 00:00'::timestamptz, + '2020-01-02 03:00'::timestamptz, + '0 hour'::interval); + -- -- Test behavior with a dynamic (time-varying) timezone abbreviation. -- These tests rely on the knowledge that MSK (Europe/Moscow standard time) From 8ab0ebb9a842dc6063d1374a38b47a3b7ee64afe Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Wed, 20 Apr 2022 17:17:43 -0700 Subject: [PATCH 560/772] Fix CLUSTER tuplesorts on abbreviated expressions. CLUSTER sort won't use the datum1 SortTuple field when clustering against an index whose leading key is an expression. This makes it unsafe to use the abbreviated keys optimization, which was missed by the logic that sets up SortSupport state. Affected tuplesorts output tuples in a completely bogus order as a result (the wrong SortSupport based comparator was used for the leading attribute). This issue is similar to the bug fixed on the master branch by recent commit cc58eecc5d. But it's a far older issue, that dates back to the introduction of the abbreviated keys optimization by commit 4ea51cdfe8. Backpatch to all supported versions. Author: Peter Geoghegan Author: Thomas Munro Discussion: https://postgr.es/m/CA+hUKG+bA+bmwD36_oDxAoLrCwZjVtST2fqe=b4=qZcmU7u89A@mail.gmail.com Backpatch: 10- --- src/backend/utils/sort/tuplesort.c | 8 ++++---- src/test/regress/expected/cluster.out | 14 ++++++++++++++ src/test/regress/sql/cluster.sql | 6 ++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index 1174e1a31c..10e89e5208 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -1051,7 +1051,7 @@ tuplesort_begin_heap(TupleDesc tupDesc, sortKey->ssup_nulls_first = nullsFirstFlags[i]; sortKey->ssup_attno = attNums[i]; /* Convey if abbreviation optimization is applicable in principle */ - sortKey->abbreviate = (i == 0); + sortKey->abbreviate = (i == 0 && state->haveDatum1); PrepareSortSupportFromOrderingOp(sortOperators[i], sortKey); } @@ -1157,7 +1157,7 @@ tuplesort_begin_cluster(TupleDesc tupDesc, (scanKey->sk_flags & SK_BT_NULLS_FIRST) != 0; sortKey->ssup_attno = scanKey->sk_attno; /* Convey if abbreviation optimization is applicable in principle */ - sortKey->abbreviate = (i == 0); + sortKey->abbreviate = (i == 0 && state->haveDatum1); AssertState(sortKey->ssup_attno != 0); @@ -1238,7 +1238,7 @@ tuplesort_begin_index_btree(Relation heapRel, (scanKey->sk_flags & SK_BT_NULLS_FIRST) != 0; sortKey->ssup_attno = scanKey->sk_attno; /* Convey if abbreviation optimization is applicable in principle */ - sortKey->abbreviate = (i == 0); + sortKey->abbreviate = (i == 0 && state->haveDatum1); AssertState(sortKey->ssup_attno != 0); @@ -1348,7 +1348,7 @@ tuplesort_begin_index_gist(Relation heapRel, sortKey->ssup_nulls_first = false; sortKey->ssup_attno = i + 1; /* Convey if abbreviation optimization is applicable in principle */ - sortKey->abbreviate = (i == 0); + sortKey->abbreviate = (i == 0 && state->haveDatum1); AssertState(sortKey->ssup_attno != 0); diff --git a/src/test/regress/expected/cluster.out b/src/test/regress/expected/cluster.out index 6c8c4c929a..542c2e098c 100644 --- a/src/test/regress/expected/cluster.out +++ b/src/test/regress/expected/cluster.out @@ -577,6 +577,13 @@ SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b; COMMIT; -- and after clustering on clstr_expression_minus_a CLUSTER clstr_expression USING clstr_expression_minus_a; +WITH rows AS + (SELECT ctid, lag(a) OVER (ORDER BY ctid) AS la, a FROM clstr_expression) +SELECT * FROM rows WHERE la < a; + ctid | la | a +------+----+--- +(0 rows) + BEGIN; SET LOCAL enable_seqscan = false; EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; @@ -611,6 +618,13 @@ SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b; COMMIT; -- and after clustering on clstr_expression_upper_b CLUSTER clstr_expression USING clstr_expression_upper_b; +WITH rows AS + (SELECT ctid, lag(b) OVER (ORDER BY ctid) AS lb, b FROM clstr_expression) +SELECT * FROM rows WHERE upper(lb) > upper(b); + ctid | lb | b +------+----+--- +(0 rows) + BEGIN; SET LOCAL enable_seqscan = false; EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; diff --git a/src/test/regress/sql/cluster.sql b/src/test/regress/sql/cluster.sql index e758088ef6..6cb9c926c0 100644 --- a/src/test/regress/sql/cluster.sql +++ b/src/test/regress/sql/cluster.sql @@ -284,6 +284,9 @@ COMMIT; -- and after clustering on clstr_expression_minus_a CLUSTER clstr_expression USING clstr_expression_minus_a; +WITH rows AS + (SELECT ctid, lag(a) OVER (ORDER BY ctid) AS la, a FROM clstr_expression) +SELECT * FROM rows WHERE la < a; BEGIN; SET LOCAL enable_seqscan = false; EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; @@ -294,6 +297,9 @@ COMMIT; -- and after clustering on clstr_expression_upper_b CLUSTER clstr_expression USING clstr_expression_upper_b; +WITH rows AS + (SELECT ctid, lag(b) OVER (ORDER BY ctid) AS lb, b FROM clstr_expression) +SELECT * FROM rows WHERE upper(lb) > upper(b); BEGIN; SET LOCAL enable_seqscan = false; EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE upper(b) = 'PREFIX3'; From ba6af6aa0b764d76cfca79d9dfbddc7134a16bfc Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Wed, 20 Apr 2022 18:29:02 -0700 Subject: [PATCH 561/772] vacuumlazy.c: MultiXactIds are MXIDs, not XMIDs. Oversights in commits 0b018fab and f3c15cbe. --- src/backend/access/heap/vacuumlazy.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 7f2e887406..9482f99e68 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -512,7 +512,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, vacrel->FreezeLimit = FreezeLimit; /* MultiXactCutoff controls MXID freezing (always <= OldestMxact) */ vacrel->MultiXactCutoff = MultiXactCutoff; - /* Initialize state used to track oldest extant XID/XMID */ + /* Initialize state used to track oldest extant XID/MXID */ vacrel->NewRelfrozenXid = OldestXmin; vacrel->NewRelminMxid = OldestMxact; vacrel->skippedallvis = false; @@ -1295,7 +1295,7 @@ lazy_scan_heap(LVRelState *vacrel) * Note: our opinion of which blocks can be skipped can go stale immediately. * It's okay if caller "misses" a page whose all-visible or all-frozen marking * was concurrently cleared, though. All that matters is that caller scan all - * pages whose tuples might contain XIDs < OldestXmin, or XMIDs < OldestMxact. + * pages whose tuples might contain XIDs < OldestXmin, or MXIDs < OldestMxact. * (Actually, non-aggressive VACUUMs can choose to skip all-visible pages with * older XIDs/MXIDs. The vacrel->skippedallvis flag will be set here when the * choice to skip such a range is actually made, making everything safe.) @@ -2012,7 +2012,7 @@ lazy_scan_noprune(LVRelState *vacrel, * relfrozenxid to a value >= FreezeLimit (and be able to * advance rel's relminmxid to a value >= MultiXactCutoff). * The ongoing aggressive VACUUM won't be able to do that - * unless it can freeze an XID (or XMID) from this tuple now. + * unless it can freeze an XID (or MXID) from this tuple now. * * The only safe option is to have caller perform processing * of this page using lazy_scan_prune. Caller might have to From 4eea2202beadbba67638bb129149abe5650aaaf6 Mon Sep 17 00:00:00 2001 From: Etsuro Fujita Date: Thu, 21 Apr 2022 15:30:00 +0900 Subject: [PATCH 562/772] postgres_fdw: Disable batch insert when BEFORE ROW INSERT triggers exist. Previously, we allowed this, but such triggers might query the table to insert into and act differently if the tuples that have already been processed and prepared for insertion are not there, so disable it in such cases. Back-patch to v14 where batch insert was added. Discussion: https://postgr.es/m/CAPmGK16_uPqsmgK0-LpLSUk54_BoK13bPrhxhfjSoSTVz414hA%40mail.gmail.com --- .../postgres_fdw/expected/postgres_fdw.out | 28 +++++++++++++++++++ contrib/postgres_fdw/postgres_fdw.c | 17 ++++++++--- contrib/postgres_fdw/sql/postgres_fdw.sql | 12 ++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index 30e95f585f..477de09a87 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -10008,6 +10008,34 @@ SELECT COUNT(*) FROM ftable; 2 (1 row) +-- Disable batch inserting into foreign tables with BEFORE ROW INSERT triggers +-- even if the batch_size option is enabled. +ALTER FOREIGN TABLE ftable OPTIONS ( SET batch_size '10' ); +CREATE TRIGGER trig_row_before BEFORE INSERT ON ftable +FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo'); +EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable VALUES (3), (4); + QUERY PLAN +------------------------------------------------------------- + Insert on public.ftable + Remote SQL: INSERT INTO public.batch_table(x) VALUES ($1) + Batch Size: 1 + -> Values Scan on "*VALUES*" + Output: "*VALUES*".column1 +(5 rows) + +INSERT INTO ftable VALUES (3), (4); +NOTICE: trig_row_before(23, skidoo) BEFORE ROW INSERT ON ftable +NOTICE: NEW: (3) +NOTICE: trig_row_before(23, skidoo) BEFORE ROW INSERT ON ftable +NOTICE: NEW: (4) +SELECT COUNT(*) FROM ftable; + count +------- + 4 +(1 row) + +-- Clean up +DROP TRIGGER trig_row_before ON ftable; DROP FOREIGN TABLE ftable; DROP TABLE batch_table; -- Use partitioning diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c index c51dd68722..0e5771c89d 100644 --- a/contrib/postgres_fdw/postgres_fdw.c +++ b/contrib/postgres_fdw/postgres_fdw.c @@ -2012,8 +2012,8 @@ postgresExecForeignBatchInsert(EState *estate, * Determine the maximum number of tuples that can be inserted in bulk * * Returns the batch size specified for server or table. When batching is not - * allowed (e.g. for tables with AFTER ROW triggers or with RETURNING clause), - * returns 1. + * allowed (e.g. for tables with BEFORE/AFTER ROW triggers or with RETURNING + * clause), returns 1. */ static int postgresGetForeignModifyBatchSize(ResultRelInfo *resultRelInfo) @@ -2042,10 +2042,19 @@ postgresGetForeignModifyBatchSize(ResultRelInfo *resultRelInfo) else batch_size = get_batch_size_option(resultRelInfo->ri_RelationDesc); - /* Disable batching when we have to use RETURNING. */ + /* + * Disable batching when we have to use RETURNING or there are any + * BEFORE/AFTER ROW INSERT triggers on the foreign table. + * + * When there are any BEFORE ROW INSERT triggers on the table, we can't + * support it, because such triggers might query the table we're inserting + * into and act differently if the tuples that have already been processed + * and prepared for insertion are not there. + */ if (resultRelInfo->ri_projectReturning != NULL || (resultRelInfo->ri_TrigDesc && - resultRelInfo->ri_TrigDesc->trig_insert_after_row)) + (resultRelInfo->ri_TrigDesc->trig_insert_before_row || + resultRelInfo->ri_TrigDesc->trig_insert_after_row))) return 1; /* diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index ea35e61eb8..ed181dedff 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -3135,6 +3135,18 @@ CREATE FOREIGN TABLE ftable ( x int ) SERVER loopback OPTIONS ( table_name 'batc EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable VALUES (1), (2); INSERT INTO ftable VALUES (1), (2); SELECT COUNT(*) FROM ftable; + +-- Disable batch inserting into foreign tables with BEFORE ROW INSERT triggers +-- even if the batch_size option is enabled. +ALTER FOREIGN TABLE ftable OPTIONS ( SET batch_size '10' ); +CREATE TRIGGER trig_row_before BEFORE INSERT ON ftable +FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo'); +EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable VALUES (3), (4); +INSERT INTO ftable VALUES (3), (4); +SELECT COUNT(*) FROM ftable; + +-- Clean up +DROP TRIGGER trig_row_before ON ftable; DROP FOREIGN TABLE ftable; DROP TABLE batch_table; From 40eba064b24d98e343b45ccef6907fe8c9784dc1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 21 Apr 2022 12:02:23 -0400 Subject: [PATCH 563/772] Use DECLARE_TOAST_WITH_MACRO() to simplify toast-table declarations. This is needed so that renumber_oids.pl can handle renumbering shared catalog declarations, which need to provide C macros for the OIDs of the shared toast table and index. The previous method of writing a C macro separately was error-prone anyway. Also teach renumber_oids.pl about DECLARE_UNIQUE_INDEX_PKEY, as we missed doing when inventing that macro. There are no changes to postgres.bki here, so no need for a catversion bump. Discussion: https://postgr.es/m/2995325.1650487527@sss.pgh.pa.us --- src/backend/catalog/Catalog.pm | 11 +++++++++ src/backend/catalog/genbki.pl | 10 ++++++++ src/include/catalog/genbki.h | 6 ++++- src/include/catalog/pg_authid.h | 4 +-- src/include/catalog/pg_database.h | 4 +-- src/include/catalog/pg_db_role_setting.h | 4 +-- src/include/catalog/pg_parameter_acl.h | 4 +-- src/include/catalog/pg_replication_origin.h | 4 +-- src/include/catalog/pg_shdescription.h | 4 +-- src/include/catalog/pg_shseclabel.h | 4 +-- src/include/catalog/pg_subscription.h | 4 +-- src/include/catalog/pg_tablespace.h | 4 +-- src/include/catalog/renumber_oids.pl | 27 ++++++++++++++++++--- 13 files changed, 58 insertions(+), 32 deletions(-) diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm index dbc3f87e28..0275795dea 100644 --- a/src/backend/catalog/Catalog.pm +++ b/src/backend/catalog/Catalog.pm @@ -94,6 +94,17 @@ sub ParseHeader push @{ $catalog{toasting} }, { parent_table => $1, toast_oid => $2, toast_index_oid => $3 }; } + elsif (/^DECLARE_TOAST_WITH_MACRO\(\s*(\w+),\s*(\d+),\s*(\d+),\s*(\w+),\s*(\w+)\)/) + { + push @{ $catalog{toasting} }, + { + parent_table => $1, + toast_oid => $2, + toast_index_oid => $3, + toast_oid_macro => $4, + toast_index_oid_macro => $5 + }; + } elsif ( /^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*(\w+),\s*(\d+),\s*(\w+),\s*(.+)\)/) { diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl index 2dfcdc5dad..2d02b02267 100644 --- a/src/backend/catalog/genbki.pl +++ b/src/backend/catalog/genbki.pl @@ -472,6 +472,16 @@ $catalog->{rowtype_oid_macro}, $catalog->{rowtype_oid} if $catalog->{rowtype_oid_macro}; + # Likewise for macros for toast and index OIDs + foreach my $toast (@{ $catalog->{toasting} }) + { + printf $def "#define %s %s\n", + $toast->{toast_oid_macro}, $toast->{toast_oid} + if $toast->{toast_oid_macro}; + printf $def "#define %s %s\n", + $toast->{toast_index_oid_macro}, $toast->{toast_index_oid} + if $toast->{toast_index_oid_macro}; + } foreach my $index (@{ $catalog->{indexing} }) { printf $def "#define %s %s\n", diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h index 9fb0d2c83d..4ecd76f4be 100644 --- a/src/include/catalog/genbki.h +++ b/src/include/catalog/genbki.h @@ -55,9 +55,13 @@ * need stable OIDs for shared relations, and that includes toast tables * of shared relations. * - * The macro definition is just to keep the C compiler from spitting up. + * The DECLARE_TOAST_WITH_MACRO variant is used when C macros are needed + * for the toast table/index OIDs (usually only for shared catalogs). + * + * The macro definitions are just to keep the C compiler from spitting up. */ #define DECLARE_TOAST(name,toastoid,indexoid) extern int no_such_variable +#define DECLARE_TOAST_WITH_MACRO(name,toastoid,indexoid,toastoidmacro,indexoidmacro) extern int no_such_variable /* * These lines are processed by genbki.pl to create the statements diff --git a/src/include/catalog/pg_authid.h b/src/include/catalog/pg_authid.h index 4b65e39a1f..3512601c80 100644 --- a/src/include/catalog/pg_authid.h +++ b/src/include/catalog/pg_authid.h @@ -55,9 +55,7 @@ CATALOG(pg_authid,1260,AuthIdRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID(284 */ typedef FormData_pg_authid *Form_pg_authid; -DECLARE_TOAST(pg_authid, 4175, 4176); -#define PgAuthidToastTable 4175 -#define PgAuthidToastIndex 4176 +DECLARE_TOAST_WITH_MACRO(pg_authid, 4175, 4176, PgAuthidToastTable, PgAuthidToastIndex); DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, AuthIdRolnameIndexId, on pg_authid using btree(rolname name_ops)); DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, AuthIdOidIndexId, on pg_authid using btree(oid oid_ops)); diff --git a/src/include/catalog/pg_database.h b/src/include/catalog/pg_database.h index a9f4a8071f..e10e91c0af 100644 --- a/src/include/catalog/pg_database.h +++ b/src/include/catalog/pg_database.h @@ -86,9 +86,7 @@ CATALOG(pg_database,1262,DatabaseRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID */ typedef FormData_pg_database *Form_pg_database; -DECLARE_TOAST(pg_database, 4177, 4178); -#define PgDatabaseToastTable 4177 -#define PgDatabaseToastIndex 4178 +DECLARE_TOAST_WITH_MACRO(pg_database, 4177, 4178, PgDatabaseToastTable, PgDatabaseToastIndex); DECLARE_UNIQUE_INDEX(pg_database_datname_index, 2671, DatabaseNameIndexId, on pg_database using btree(datname name_ops)); DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, DatabaseOidIndexId, on pg_database using btree(oid oid_ops)); diff --git a/src/include/catalog/pg_db_role_setting.h b/src/include/catalog/pg_db_role_setting.h index ae5cc4365e..45d478e9e7 100644 --- a/src/include/catalog/pg_db_role_setting.h +++ b/src/include/catalog/pg_db_role_setting.h @@ -46,9 +46,7 @@ CATALOG(pg_db_role_setting,2964,DbRoleSettingRelationId) BKI_SHARED_RELATION typedef FormData_pg_db_role_setting * Form_pg_db_role_setting; -DECLARE_TOAST(pg_db_role_setting, 2966, 2967); -#define PgDbRoleSettingToastTable 2966 -#define PgDbRoleSettingToastIndex 2967 +DECLARE_TOAST_WITH_MACRO(pg_db_role_setting, 2966, 2967, PgDbRoleSettingToastTable, PgDbRoleSettingToastIndex); DECLARE_UNIQUE_INDEX_PKEY(pg_db_role_setting_databaseid_rol_index, 2965, DbRoleSettingDatidRolidIndexId, on pg_db_role_setting using btree(setdatabase oid_ops, setrole oid_ops)); diff --git a/src/include/catalog/pg_parameter_acl.h b/src/include/catalog/pg_parameter_acl.h index 8316391e51..263079c9e1 100644 --- a/src/include/catalog/pg_parameter_acl.h +++ b/src/include/catalog/pg_parameter_acl.h @@ -48,9 +48,7 @@ CATALOG(pg_parameter_acl,8924,ParameterAclRelationId) BKI_SHARED_RELATION */ typedef FormData_pg_parameter_acl *Form_pg_parameter_acl; -DECLARE_TOAST(pg_parameter_acl, 8925, 8926); -#define PgParameterAclToastTable 8925 -#define PgParameterAclToastIndex 8926 +DECLARE_TOAST_WITH_MACRO(pg_parameter_acl, 8925, 8926, PgParameterAclToastTable, PgParameterAclToastIndex); DECLARE_UNIQUE_INDEX(pg_parameter_acl_parname_index, 8927, ParameterAclParnameIndexId, on pg_parameter_acl using btree(parname text_ops)); DECLARE_UNIQUE_INDEX_PKEY(pg_parameter_acl_oid_index, 8928, ParameterAclOidIndexId, on pg_parameter_acl using btree(oid oid_ops)); diff --git a/src/include/catalog/pg_replication_origin.h b/src/include/catalog/pg_replication_origin.h index 5dcf1dafe3..3b11cd21cb 100644 --- a/src/include/catalog/pg_replication_origin.h +++ b/src/include/catalog/pg_replication_origin.h @@ -54,9 +54,7 @@ CATALOG(pg_replication_origin,6000,ReplicationOriginRelationId) BKI_SHARED_RELAT typedef FormData_pg_replication_origin *Form_pg_replication_origin; -DECLARE_TOAST(pg_replication_origin, 4181, 4182); -#define PgReplicationOriginToastTable 4181 -#define PgReplicationOriginToastIndex 4182 +DECLARE_TOAST_WITH_MACRO(pg_replication_origin, 4181, 4182, PgReplicationOriginToastTable, PgReplicationOriginToastIndex); DECLARE_UNIQUE_INDEX_PKEY(pg_replication_origin_roiident_index, 6001, ReplicationOriginIdentIndex, on pg_replication_origin using btree(roident oid_ops)); DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, ReplicationOriginNameIndex, on pg_replication_origin using btree(roname text_ops)); diff --git a/src/include/catalog/pg_shdescription.h b/src/include/catalog/pg_shdescription.h index 1e354b29c2..da2b9f6fdf 100644 --- a/src/include/catalog/pg_shdescription.h +++ b/src/include/catalog/pg_shdescription.h @@ -55,9 +55,7 @@ CATALOG(pg_shdescription,2396,SharedDescriptionRelationId) BKI_SHARED_RELATION */ typedef FormData_pg_shdescription * Form_pg_shdescription; -DECLARE_TOAST(pg_shdescription, 2846, 2847); -#define PgShdescriptionToastTable 2846 -#define PgShdescriptionToastIndex 2847 +DECLARE_TOAST_WITH_MACRO(pg_shdescription, 2846, 2847, PgShdescriptionToastTable, PgShdescriptionToastIndex); DECLARE_UNIQUE_INDEX_PKEY(pg_shdescription_o_c_index, 2397, SharedDescriptionObjIndexId, on pg_shdescription using btree(objoid oid_ops, classoid oid_ops)); diff --git a/src/include/catalog/pg_shseclabel.h b/src/include/catalog/pg_shseclabel.h index 6f6bd9da2f..fc1b97f46f 100644 --- a/src/include/catalog/pg_shseclabel.h +++ b/src/include/catalog/pg_shseclabel.h @@ -39,9 +39,7 @@ CATALOG(pg_shseclabel,3592,SharedSecLabelRelationId) BKI_SHARED_RELATION BKI_ROW typedef FormData_pg_shseclabel * Form_pg_shseclabel; -DECLARE_TOAST(pg_shseclabel, 4060, 4061); -#define PgShseclabelToastTable 4060 -#define PgShseclabelToastIndex 4061 +DECLARE_TOAST_WITH_MACRO(pg_shseclabel, 4060, 4061, PgShseclabelToastTable, PgShseclabelToastIndex); DECLARE_UNIQUE_INDEX_PKEY(pg_shseclabel_object_index, 3593, SharedSecLabelObjectIndexId, on pg_shseclabel using btree(objoid oid_ops, classoid oid_ops, provider text_ops)); diff --git a/src/include/catalog/pg_subscription.h b/src/include/catalog/pg_subscription.h index f006a92612..d1260f590c 100644 --- a/src/include/catalog/pg_subscription.h +++ b/src/include/catalog/pg_subscription.h @@ -92,9 +92,7 @@ CATALOG(pg_subscription,6100,SubscriptionRelationId) BKI_SHARED_RELATION BKI_ROW typedef FormData_pg_subscription *Form_pg_subscription; -DECLARE_TOAST(pg_subscription, 4183, 4184); -#define PgSubscriptionToastTable 4183 -#define PgSubscriptionToastIndex 4184 +DECLARE_TOAST_WITH_MACRO(pg_subscription, 4183, 4184, PgSubscriptionToastTable, PgSubscriptionToastIndex); DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_oid_index, 6114, SubscriptionObjectIndexId, on pg_subscription using btree(oid oid_ops)); DECLARE_UNIQUE_INDEX(pg_subscription_subname_index, 6115, SubscriptionNameIndexId, on pg_subscription using btree(subdbid oid_ops, subname name_ops)); diff --git a/src/include/catalog/pg_tablespace.h b/src/include/catalog/pg_tablespace.h index 58c1cfa605..572eeeb8a6 100644 --- a/src/include/catalog/pg_tablespace.h +++ b/src/include/catalog/pg_tablespace.h @@ -47,9 +47,7 @@ CATALOG(pg_tablespace,1213,TableSpaceRelationId) BKI_SHARED_RELATION */ typedef FormData_pg_tablespace *Form_pg_tablespace; -DECLARE_TOAST(pg_tablespace, 4185, 4186); -#define PgTablespaceToastTable 4185 -#define PgTablespaceToastIndex 4186 +DECLARE_TOAST_WITH_MACRO(pg_tablespace, 4185, 4186, PgTablespaceToastTable, PgTablespaceToastIndex); DECLARE_UNIQUE_INDEX_PKEY(pg_tablespace_oid_index, 2697, TablespaceOidIndexId, on pg_tablespace using btree(oid oid_ops)); DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index, 2698, TablespaceNameIndexId, on pg_tablespace using btree(spcname name_ops)); diff --git a/src/include/catalog/renumber_oids.pl b/src/include/catalog/renumber_oids.pl index d959c2de0f..7de13da4bd 100755 --- a/src/include/catalog/renumber_oids.pl +++ b/src/include/catalog/renumber_oids.pl @@ -140,14 +140,33 @@ $changed = 1; } } + elsif ($line =~ m/^(DECLARE_TOAST_WITH_MACRO\(\s*\w+,\s*)(\d+)(,\s*)(\d+)(,\s*\w+,\s*\w+)\)/) + { + my $oid2 = $2; + my $oid4 = $4; + if (exists $maphash{$oid2}) + { + $oid2 = $maphash{$oid2}; + my $repl = $1 . $oid2 . $3 . $oid4 . $5 . ")"; + $line =~ s/^DECLARE_TOAST_WITH_MACRO\(\s*\w+,\s*\d+,\s*\d+,\s*\w+,\s*\w+\)/$repl/; + $changed = 1; + } + if (exists $maphash{$oid4}) + { + $oid4 = $maphash{$oid4}; + my $repl = $1 . $oid2 . $3 . $oid4 . $5 . ")"; + $line =~ s/^DECLARE_TOAST_WITH_MACRO\(\s*\w+,\s*\d+,\s*\d+,\s*\w+,\s*\w+\)/$repl/; + $changed = 1; + } + } elsif ( - $line =~ m/^(DECLARE_(UNIQUE_)?INDEX\(\s*\w+,\s*)(\d+)(,\s*.+)\)/) + $line =~ m/^(DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*\w+,\s*)(\d+)(,\s*.+)\)/) { - if (exists $maphash{$3}) + if (exists $maphash{$4}) { - my $repl = $1 . $maphash{$3} . $4 . ")"; + my $repl = $1 . $maphash{$4} . $5 . ")"; $line =~ - s/^DECLARE_(UNIQUE_)?INDEX\(\s*\w+,\s*\d+,\s*.+\)/$repl/; + s/^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*\w+,\s*\d+,\s*.+\)/$repl/; $changed = 1; } } From bb85eec6fe9178aa849b43414f2db440bb5edfbd Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 21 Apr 2022 18:57:40 +0200 Subject: [PATCH 564/772] CREATE PUBLICATION ref: Minor tweaks to row filters Prompted by a complaint from Justin Pryzby. Reviewed-by: Amit Kapila Discussion: https://postgr.es/m/20220414003301.GT26620@telsasoft.com --- doc/src/sgml/ref/create_publication.sgml | 27 ++++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/doc/src/sgml/ref/create_publication.sgml b/doc/src/sgml/ref/create_publication.sgml index 23d883c158..1a828e8d2f 100644 --- a/doc/src/sgml/ref/create_publication.sgml +++ b/doc/src/sgml/ref/create_publication.sgml @@ -79,7 +79,8 @@ CREATE PUBLICATION name - If the optional WHERE clause is specified, rows for + If the optional WHERE clause is specified, it defines a + row filter expression. Rows for which the expression evaluates to false or null will not be published. Note that parentheses are required around the expression. It has no effect on @@ -192,6 +193,11 @@ CREATE PUBLICATION name consisting of a different set of partitions. + + This parameter also affects how row filters and column lists are + chosen for partitions; see below for details. + + If this is enabled, TRUNCATE operations performed directly on partitions are not replicated. @@ -241,21 +247,28 @@ CREATE PUBLICATION name - A WHERE (i.e. row filter) expression must contain only + A row filter expression (i.e., the WHERE clause) must contain only columns that are covered by the REPLICA IDENTITY, in order for UPDATE and DELETE operations to be published. For publication of INSERT operations, any column may be used in the WHERE expression. The - WHERE clause allows simple expressions that don't have + row filter allows simple expressions that don't have user-defined functions, user-defined operators, user-defined types, user-defined collations, non-immutable built-in functions, or references to system columns. - If your publication contains a partitioned table, the publication parameter - publish_via_partition_root determines if it uses the - partition's row filter (if the parameter is false, the default) or the root - partitioned table's row filter. + + + + For published partitioned tables, the row filter for each + partition is taken from the published partitioned table if the + publication parameter publish_via_partition_root is true, + or from the partition itself if it is false (the default). See for details about row filters. + Similarly, for published partitioned tables, the column list for each + partition is taken from the published partitioned table if the + publication parameter publish_via_partition_root is true, + or from the partition itself if it is false. From 586955dddecc95e0003262a3954ae83b68ce0372 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 21 Apr 2022 19:12:21 +0200 Subject: [PATCH 565/772] Standardize references to Zstandard as Some places used ZSTD, which isn't widely used anywhere. Use ZSTD only to refer to the environment variable; use zstd (all lowercase) to refer to the utility. Per complaint from Justin Pryzby. Discussion: https://postgr.es/m/20220414003301.GT26620@telsasoft.com --- doc/src/sgml/install-windows.sgml | 6 +++--- doc/src/sgml/installation.sgml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index 43cc5f6f5b..bcfd5a1a10 100644 --- a/doc/src/sgml/install-windows.sgml +++ b/doc/src/sgml/install-windows.sgml @@ -307,10 +307,10 @@ $ENV{MSBFLAGS}="/m"; - ZSTD + Zstandard - Required for supporting ZSTD compression - method. Binaries and source can be downloaded from + Required for supporting Zstandard compression. + Binaries and source can be downloaded from . diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index df32025a86..c585078029 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -273,7 +273,7 @@ su - postgres - You need zstd, if you want to support + You need Zstandard, if you want to support compression of data with that method; see . The minimum required version is 1.4.0. @@ -996,7 +996,7 @@ build-postgresql: - Build with ZSTD compression support. + Build with Zstandard compression support. From 2cb1272445d2a6616991fc6ede274d9f1f62ff73 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 21 Apr 2022 16:23:12 -0400 Subject: [PATCH 566/772] Rethink method for assigning OIDs to the template0 and postgres DBs. Commit aa0105141 assigned fixed OIDs to template0 and postgres in a very ad-hoc way. Notably, instead of teaching Catalog.pm about these OIDs, the unused_oids script was just hacked to not show them as unused. That's problematic since, for example, duplicate_oids wouldn't report any future conflict. Hence, invent a macro DECLARE_OID_DEFINING_MACRO() that can be used to define an OID that is known to Catalog.pm and will participate in duplicate-detection as well as renumbering by renumber_oids.pl. (We don't anticipate renumbering these particular OIDs, but we might as well build out all the Catalog.pm infrastructure while we're here.) Another issue is that aa0105141 neglected to touch IsPinnedObject, with the result that it now claimed template0 and postgres are pinned. The right thing to do there seems to be to teach it that no database is pinned, since in fact DROP DATABASE doesn't check for pinned-ness (and at least for these cases, that is an intentional choice). It's not clear whether this wrong answer had any visible effect, but perhaps it could have resulted in erroneous management of dependency entries. In passing, rename the TemplateDbOid macro to Template1DbOid to reduce confusion (likely we should have done that way back when we invented template0, but we didn't), and rename the OID macros for template0 and postgres to have a similar style. There are no changes to postgres.bki here, so no need for a catversion bump. Discussion: https://postgr.es/m/2935358.1650479692@sss.pgh.pa.us --- doc/src/sgml/bki.sgml | 7 ++++--- src/backend/access/transam/xlog.c | 4 ++-- src/backend/catalog/Catalog.pm | 14 ++++++++++++++ src/backend/catalog/catalog.c | 14 +++++++++----- src/backend/catalog/genbki.pl | 8 +++++++- src/backend/utils/init/postinit.c | 2 +- src/bin/initdb/initdb.c | 9 +++++---- src/bin/pg_dump/pg_dump.c | 9 +++++---- src/include/access/transam.h | 4 ---- src/include/catalog/genbki.h | 8 ++++++++ src/include/catalog/pg_database.dat | 2 +- src/include/catalog/pg_database.h | 9 +++++++++ src/include/catalog/renumber_oids.pl | 10 ++++++++++ src/include/catalog/unused_oids | 9 --------- 14 files changed, 75 insertions(+), 34 deletions(-) diff --git a/doc/src/sgml/bki.sgml b/doc/src/sgml/bki.sgml index 33955494c6..20894baf18 100644 --- a/doc/src/sgml/bki.sgml +++ b/doc/src/sgml/bki.sgml @@ -180,12 +180,13 @@ [ # A comment could appear here. -{ oid => '1', oid_symbol => 'TemplateDbOid', +{ oid => '1', oid_symbol => 'Template1DbOid', descr => 'database\'s default template', - datname => 'template1', encoding => 'ENCODING', datistemplate => 't', + datname => 'template1', encoding => 'ENCODING', + datlocprovider => 'LOCALE_PROVIDER', datistemplate => 't', datallowconn => 't', datconnlimit => '-1', datfrozenxid => '0', datminmxid => '1', dattablespace => 'pg_default', datcollate => 'LC_COLLATE', - datctype => 'LC_CTYPE', datacl => '_null_' }, + datctype => 'LC_CTYPE', daticulocale => 'ICU_LOCALE', datacl => '_null_' }, ] ]]> diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 5eabd32cf6..61cda56c6f 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -4540,9 +4540,9 @@ BootStrapXLOG(void) checkPoint.nextMulti = FirstMultiXactId; checkPoint.nextMultiOffset = 0; checkPoint.oldestXid = FirstNormalTransactionId; - checkPoint.oldestXidDB = TemplateDbOid; + checkPoint.oldestXidDB = Template1DbOid; checkPoint.oldestMulti = FirstMultiXactId; - checkPoint.oldestMultiDB = TemplateDbOid; + checkPoint.oldestMultiDB = Template1DbOid; checkPoint.oldestCommitTsXid = InvalidTransactionId; checkPoint.newestCommitTsXid = InvalidTransactionId; checkPoint.time = (pg_time_t) time(NULL); diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm index 0275795dea..ece0a934f0 100644 --- a/src/backend/catalog/Catalog.pm +++ b/src/backend/catalog/Catalog.pm @@ -44,6 +44,8 @@ sub ParseHeader $catalog{columns} = []; $catalog{toasting} = []; $catalog{indexing} = []; + $catalog{other_oids} = []; + $catalog{foreign_keys} = []; $catalog{client_code} = []; open(my $ifh, '<', $input_file) || die "$input_file: $!"; @@ -118,6 +120,14 @@ sub ParseHeader index_decl => $6 }; } + elsif (/^DECLARE_OID_DEFINING_MACRO\(\s*(\w+),\s*(\d+)\)/) + { + push @{ $catalog{other_oids} }, + { + other_name => $1, + other_oid => $2 + }; + } elsif ( /^DECLARE_(ARRAY_)?FOREIGN_KEY(_OPT)?\(\s*\(([^)]+)\),\s*(\w+),\s*\(([^)]+)\)\)/ ) @@ -572,6 +582,10 @@ sub FindAllOidsFromHeaders { push @oids, $index->{index_oid}; } + foreach my $other (@{ $catalog->{other_oids} }) + { + push @oids, $other->{other_oid}; + } } return \@oids; diff --git a/src/backend/catalog/catalog.c b/src/backend/catalog/catalog.c index 520f77971b..e784538aae 100644 --- a/src/backend/catalog/catalog.c +++ b/src/backend/catalog/catalog.c @@ -339,16 +339,20 @@ IsPinnedObject(Oid classId, Oid objectId) * robustness. */ - /* template1 is not pinned */ - if (classId == DatabaseRelationId && - objectId == TemplateDbOid) - return false; - /* the public namespace is not pinned */ if (classId == NamespaceRelationId && objectId == PG_PUBLIC_NAMESPACE) return false; + /* + * Databases are never pinned. It might seem that it'd be prudent to pin + * at least template0; but we do this intentionally so that template0 and + * template1 can be rebuilt from each other, thus letting them serve as + * mutual backups (as long as you've not modified template1, anyway). + */ + if (classId == DatabaseRelationId) + return false; + /* * All other initdb-created objects are pinned. This is overkill (the * system doesn't really depend on having every last weird datatype, for diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl index 2d02b02267..f4ec6d6d40 100644 --- a/src/backend/catalog/genbki.pl +++ b/src/backend/catalog/genbki.pl @@ -472,7 +472,7 @@ $catalog->{rowtype_oid_macro}, $catalog->{rowtype_oid} if $catalog->{rowtype_oid_macro}; - # Likewise for macros for toast and index OIDs + # Likewise for macros for toast, index, and other OIDs foreach my $toast (@{ $catalog->{toasting} }) { printf $def "#define %s %s\n", @@ -488,6 +488,12 @@ $index->{index_oid_macro}, $index->{index_oid} if $index->{index_oid_macro}; } + foreach my $other (@{ $catalog->{other_oids} }) + { + printf $def "#define %s %s\n", + $other->{other_name}, $other->{other_oid} + if $other->{other_name}; + } print $def "\n"; diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 9139fe895c..5dbc7379e3 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -908,7 +908,7 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username, */ if (bootstrap) { - MyDatabaseId = TemplateDbOid; + MyDatabaseId = Template1DbOid; MyDatabaseTableSpace = DEFAULTTABLESPACE_OID; } else if (in_dbname != NULL) diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 1cb4a5b0d2..fcef651c2f 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -59,11 +59,11 @@ #include "sys/mman.h" #endif -#include "access/transam.h" #include "access/xlog_internal.h" #include "catalog/pg_authid_d.h" #include "catalog/pg_class_d.h" /* pgrminclude ignore */ #include "catalog/pg_collation_d.h" +#include "catalog/pg_database_d.h" /* pgrminclude ignore */ #include "common/file_perm.h" #include "common/file_utils.h" #include "common/logging.h" @@ -1812,8 +1812,8 @@ make_template0(FILE *cmdfd) * be a little bit slower and make the new cluster a little bit bigger. */ static const char *const template0_setup[] = { - "CREATE DATABASE template0 IS_TEMPLATE = true ALLOW_CONNECTIONS = false OID = " - CppAsString2(Template0ObjectId) + "CREATE DATABASE template0 IS_TEMPLATE = true ALLOW_CONNECTIONS = false" + " OID = " CppAsString2(Template0DbOid) " STRATEGY = file_copy;\n\n", /* @@ -1862,7 +1862,8 @@ make_postgres(FILE *cmdfd) * OID to postgres and select the file_copy strategy. */ static const char *const postgres_setup[] = { - "CREATE DATABASE postgres OID = " CppAsString2(PostgresObjectId) " STRATEGY = file_copy;\n\n", + "CREATE DATABASE postgres OID = " CppAsString2(PostgresDbOid) + " STRATEGY = file_copy;\n\n", "COMMENT ON DATABASE postgres IS 'default administrative connection database';\n\n", NULL }; diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index d3588607e7..786d592e2b 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -2901,10 +2901,11 @@ dumpDatabase(Archive *fout) qdatname = pg_strdup(fmtId(datname)); /* - * Prepare the CREATE DATABASE command. We must specify encoding, locale, - * and tablespace since those can't be altered later. Other DB properties - * are left to the DATABASE PROPERTIES entry, so that they can be applied - * after reconnecting to the target DB. + * Prepare the CREATE DATABASE command. We must specify OID (if we want + * to preserve that), as well as the encoding, locale, and tablespace + * since those can't be altered later. Other DB properties are left to + * the DATABASE PROPERTIES entry, so that they can be applied after + * reconnecting to the target DB. */ if (dopt->binary_upgrade) { diff --git a/src/include/access/transam.h b/src/include/access/transam.h index 9a2816de51..338dfca5a0 100644 --- a/src/include/access/transam.h +++ b/src/include/access/transam.h @@ -196,10 +196,6 @@ FullTransactionIdAdvance(FullTransactionId *dest) #define FirstUnpinnedObjectId 12000 #define FirstNormalObjectId 16384 -/* OIDs of Template0 and Postgres database are fixed */ -#define Template0ObjectId 4 -#define PostgresObjectId 5 - /* * VariableCache is a data structure in shared memory that is used to track * OID and XID assignment state. For largely historical reasons, there is diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h index 4ecd76f4be..992b784236 100644 --- a/src/include/catalog/genbki.h +++ b/src/include/catalog/genbki.h @@ -84,6 +84,14 @@ #define DECLARE_UNIQUE_INDEX(name,oid,oidmacro,decl) extern int no_such_variable #define DECLARE_UNIQUE_INDEX_PKEY(name,oid,oidmacro,decl) extern int no_such_variable +/* + * These lines inform genbki.pl about manually-assigned OIDs that do not + * correspond to any entry in the catalog *.dat files, but should be subject + * to uniqueness verification and renumber_oids.pl renumbering. A C macro + * to #define the given name is emitted into the corresponding *_d.h file. + */ +#define DECLARE_OID_DEFINING_MACRO(name,oid) extern int no_such_variable + /* * These lines are processed by genbki.pl to create a table for use * by the pg_get_catalog_foreign_keys() function. We do not have any diff --git a/src/include/catalog/pg_database.dat b/src/include/catalog/pg_database.dat index 5feedff7bf..05873f74f6 100644 --- a/src/include/catalog/pg_database.dat +++ b/src/include/catalog/pg_database.dat @@ -12,7 +12,7 @@ [ -{ oid => '1', oid_symbol => 'TemplateDbOid', +{ oid => '1', oid_symbol => 'Template1DbOid', descr => 'default template for new databases', datname => 'template1', encoding => 'ENCODING', datlocprovider => 'LOCALE_PROVIDER', datistemplate => 't', datallowconn => 't', datconnlimit => '-1', datfrozenxid => '0', diff --git a/src/include/catalog/pg_database.h b/src/include/catalog/pg_database.h index e10e91c0af..611c95656a 100644 --- a/src/include/catalog/pg_database.h +++ b/src/include/catalog/pg_database.h @@ -91,4 +91,13 @@ DECLARE_TOAST_WITH_MACRO(pg_database, 4177, 4178, PgDatabaseToastTable, PgDataba DECLARE_UNIQUE_INDEX(pg_database_datname_index, 2671, DatabaseNameIndexId, on pg_database using btree(datname name_ops)); DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, DatabaseOidIndexId, on pg_database using btree(oid oid_ops)); +/* + * pg_database.dat contains an entry for template1, but not for the template0 + * or postgres databases, because those are created later in initdb. + * However, we still want to manually assign the OIDs for template0 and + * postgres, so declare those here. + */ +DECLARE_OID_DEFINING_MACRO(Template0DbOid, 4); +DECLARE_OID_DEFINING_MACRO(PostgresDbOid, 5); + #endif /* PG_DATABASE_H */ diff --git a/src/include/catalog/renumber_oids.pl b/src/include/catalog/renumber_oids.pl index 7de13da4bd..ba8c69c87e 100755 --- a/src/include/catalog/renumber_oids.pl +++ b/src/include/catalog/renumber_oids.pl @@ -170,6 +170,16 @@ $changed = 1; } } + elsif (/^(DECLARE_OID_DEFINING_MACRO\(\s*\w+,\s*)(\d+)\)/) + { + if (exists $maphash{$2}) + { + my $repl = $1 . $maphash{$2} . ")"; + $line =~ + s/^DECLARE_OID_DEFINING_MACRO\(\s*\w+,\s*\d+\)/$repl/; + $changed = 1; + } + } elsif ($line =~ m/^CATALOG\((\w+),(\d+),(\w+)\)/) { if (exists $maphash{$2}) diff --git a/src/include/catalog/unused_oids b/src/include/catalog/unused_oids index 61d41e7561..e55bc6fa3c 100755 --- a/src/include/catalog/unused_oids +++ b/src/include/catalog/unused_oids @@ -32,15 +32,6 @@ my @input_files = glob("pg_*.h"); my $oids = Catalog::FindAllOidsFromHeaders(@input_files); -# Push the template0 and postgres database OIDs. -my $Template0ObjectId = - Catalog::FindDefinedSymbol('access/transam.h', '..', 'Template0ObjectId'); -push @{$oids}, $Template0ObjectId; - -my $PostgresObjectId = - Catalog::FindDefinedSymbol('access/transam.h', '..', 'PostgresObjectId'); -push @{$oids}, $PostgresObjectId; - # Also push FirstGenbkiObjectId to serve as a terminator for the last gap. my $FirstGenbkiObjectId = Catalog::FindDefinedSymbol('access/transam.h', '..', 'FirstGenbkiObjectId'); From 914611ea738a3601717990faff0f5d71a0f14a3d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 21 Apr 2022 17:12:49 -0400 Subject: [PATCH 567/772] Fix missed cases in libpq's error handling. Commit 618c16707 invented an "error_result" flag in PGconn, which intends to represent the state that we have an error condition and need to build a PGRES_FATAL_ERROR PGresult from the message text in conn->errorMessage, but have not yet done so. (Postponing construction of the error object simplifies dealing with out-of-memory conditions and with concatenation of messages for multiple errors.) For nearly all purposes, this "virtual" PGresult object should act the same as if it were already materialized. But a couple of places in fe-protocol3.c didn't get that memo, and were only testing conn->result as they used to, without also checking conn->error_result. In hopes of reducing the probability of similar mistakes in future, I invented a pgHavePendingResult() macro that includes both tests. Per report from Peter Eisentraut. Discussion: https://postgr.es/m/b52277b9-fa66-b027-4a37-fb8989c73ff8@enterprisedb.com --- src/interfaces/libpq/fe-exec.c | 5 +++-- src/interfaces/libpq/fe-protocol3.c | 10 +++++----- src/interfaces/libpq/libpq-int.h | 8 ++++++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index 78cff4475c..919cf5741d 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -1196,6 +1196,7 @@ pqSaveParameterStatus(PGconn *conn, const char *name, const char *value) * Returns 1 if OK, 0 if error occurred. * * On error, *errmsgp can be set to an error string to be returned. + * (Such a string should already be translated via libpq_gettext().) * If it is left NULL, the error is presumed to be "out of memory". * * In single-row mode, we create a new result holding just the current row, @@ -1986,7 +1987,7 @@ PQsetSingleRowMode(PGconn *conn) (conn->cmd_queue_head->queryclass != PGQUERY_SIMPLE && conn->cmd_queue_head->queryclass != PGQUERY_EXTENDED)) return 0; - if (conn->result || conn->error_result) + if (pgHavePendingResult(conn)) return 0; /* OK, set flag */ @@ -2941,7 +2942,7 @@ PQfn(PGconn *conn, } if (conn->sock == PGINVALID_SOCKET || conn->asyncStatus != PGASYNC_IDLE || - conn->result || conn->error_result) + pgHavePendingResult(conn)) { appendPQExpBufferStr(&conn->errorMessage, libpq_gettext("connection in wrong state\n")); diff --git a/src/interfaces/libpq/fe-protocol3.c b/src/interfaces/libpq/fe-protocol3.c index 94b4a448b9..10c76daf6e 100644 --- a/src/interfaces/libpq/fe-protocol3.c +++ b/src/interfaces/libpq/fe-protocol3.c @@ -209,7 +209,7 @@ pqParseInput3(PGconn *conn) case 'C': /* command complete */ if (pqGets(&conn->workBuffer, conn)) return; - if (conn->result == NULL) + if (!pgHavePendingResult(conn)) { conn->result = PQmakeEmptyPGresult(conn, PGRES_COMMAND_OK); @@ -263,7 +263,7 @@ pqParseInput3(PGconn *conn) } break; case 'I': /* empty query */ - if (conn->result == NULL) + if (!pgHavePendingResult(conn)) { conn->result = PQmakeEmptyPGresult(conn, PGRES_EMPTY_QUERY); @@ -281,7 +281,7 @@ pqParseInput3(PGconn *conn) if (conn->cmd_queue_head && conn->cmd_queue_head->queryclass == PGQUERY_PREPARE) { - if (conn->result == NULL) + if (!pgHavePendingResult(conn)) { conn->result = PQmakeEmptyPGresult(conn, PGRES_COMMAND_OK); @@ -362,7 +362,7 @@ pqParseInput3(PGconn *conn) if (conn->cmd_queue_head && conn->cmd_queue_head->queryclass == PGQUERY_DESCRIBE) { - if (conn->result == NULL) + if (!pgHavePendingResult(conn)) { conn->result = PQmakeEmptyPGresult(conn, PGRES_COMMAND_OK); @@ -2133,7 +2133,7 @@ pqFunctionCall3(PGconn *conn, Oid fnid, * report COMMAND_OK. Otherwise, the backend violated the * protocol, so complain. */ - if (!(conn->result || conn->error_result)) + if (!pgHavePendingResult(conn)) { if (status == PGRES_COMMAND_OK) { diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index e0cee4b142..3db6a17db4 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -852,6 +852,14 @@ extern void pqTraceOutputNoTypeByteMessage(PGconn *conn, const char *message); (resetPQExpBuffer(&(conn)->errorMessage), \ (conn)->errorReported = 0) +/* + * Check whether we have a PGresult pending to be returned --- either a + * constructed one in conn->result, or a "virtual" error result that we + * don't intend to materialize until the end of the query cycle. + */ +#define pgHavePendingResult(conn) \ + ((conn)->result != NULL || (conn)->error_result) + /* * this is so that we can check if a connection is non-blocking internally * without the overhead of a function call From 92e7a537520927107742af654619e55f34072942 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 21 Apr 2022 17:58:52 -0400 Subject: [PATCH 568/772] Remove inadequate assertion check in CTE inlining. inline_cte() expected to find exactly as many references to the target CTE as its cterefcount indicates. While that should be accurate for the tree as emitted by the parser, there are some optimizations that occur upstream of here that could falsify it, notably removal of unused subquery output expressions. Trying to make the accounting 100% accurate seems expensive and doomed to future breakage. It's not really worth it, because all this code is protecting is downstream assumptions that every referenced CTE has a plan. Let's convert those assertions to regular test-and-elog just in case there's some actual problem, and then drop the failing assertion. Per report from Tomas Vondra (thanks also to Richard Guo for analysis). Back-patch to v12 where the faulty code came in. Discussion: https://postgr.es/m/29196a1e-ed47-c7ca-9be2-b1c636816183@enterprisedb.com --- src/backend/optimizer/path/allpaths.c | 3 +- src/backend/optimizer/plan/createplan.c | 3 +- src/backend/optimizer/plan/subselect.c | 8 ---- src/include/nodes/pathnodes.h | 3 +- src/test/regress/expected/with.out | 64 +++++++++++++++++++++++++ src/test/regress/sql/with.sql | 31 ++++++++++++ 6 files changed, 101 insertions(+), 11 deletions(-) diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 998212dda8..d84f66a81b 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -2804,7 +2804,8 @@ set_cte_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte) if (ndx >= list_length(cteroot->cte_plan_ids)) elog(ERROR, "could not find plan for CTE \"%s\"", rte->ctename); plan_id = list_nth_int(cteroot->cte_plan_ids, ndx); - Assert(plan_id > 0); + if (plan_id <= 0) + elog(ERROR, "no plan was made for CTE \"%s\"", rte->ctename); cteplan = (Plan *) list_nth(root->glob->subplans, plan_id - 1); /* Mark rel with estimated output rows, width, etc */ diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index 95476ada0b..7905bc4654 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -3898,7 +3898,8 @@ create_ctescan_plan(PlannerInfo *root, Path *best_path, if (ndx >= list_length(cteroot->cte_plan_ids)) elog(ERROR, "could not find plan for CTE \"%s\"", rte->ctename); plan_id = list_nth_int(cteroot->cte_plan_ids, ndx); - Assert(plan_id > 0); + if (plan_id <= 0) + elog(ERROR, "no plan was made for CTE \"%s\"", rte->ctename); foreach(lc, cteroot->init_plans) { ctesplan = (SubPlan *) lfirst(lc); diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index 863e0e24a1..df4ca12919 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -61,7 +61,6 @@ typedef struct inline_cte_walker_context { const char *ctename; /* name and relative level of target CTE */ int levelsup; - int refcount; /* number of remaining references */ Query *ctequery; /* query to substitute */ } inline_cte_walker_context; @@ -1157,13 +1156,9 @@ inline_cte(PlannerInfo *root, CommonTableExpr *cte) context.ctename = cte->ctename; /* Start at levelsup = -1 because we'll immediately increment it */ context.levelsup = -1; - context.refcount = cte->cterefcount; context.ctequery = castNode(Query, cte->ctequery); (void) inline_cte_walker((Node *) root->parse, &context); - - /* Assert we replaced all references */ - Assert(context.refcount == 0); } static bool @@ -1226,9 +1221,6 @@ inline_cte_walker(Node *node, inline_cte_walker_context *context) rte->coltypes = NIL; rte->coltypmods = NIL; rte->colcollations = NIL; - - /* Count the number of replacements we've done */ - context->refcount--; } return false; diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h index c5ab53e05c..244d1e1197 100644 --- a/src/include/nodes/pathnodes.h +++ b/src/include/nodes/pathnodes.h @@ -241,7 +241,8 @@ struct PlannerInfo List *init_plans; /* init SubPlans for query */ - List *cte_plan_ids; /* per-CTE-item list of subplan IDs */ + List *cte_plan_ids; /* per-CTE-item list of subplan IDs (or -1 if + * no subplan was made for that CTE) */ List *multiexpr_params; /* List of Lists of Params for MULTIEXPR * subquery outputs */ diff --git a/src/test/regress/expected/with.out b/src/test/regress/expected/with.out index 57e145b0f5..32f90d7375 100644 --- a/src/test/regress/expected/with.out +++ b/src/test/regress/expected/with.out @@ -2535,6 +2535,70 @@ SELECT * FROM bug6051_3; --- (0 rows) +-- check case where CTE reference is removed due to optimization +EXPLAIN (VERBOSE, COSTS OFF) +SELECT q1 FROM +( + WITH t_cte AS (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + QUERY PLAN +-------------------------------------- + Subquery Scan on ss + Output: ss.q1 + -> Seq Scan on public.int8_tbl i8 + Output: i8.q1, NULL::bigint +(4 rows) + +SELECT q1 FROM +( + WITH t_cte AS (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + q1 +------------------ + 123 + 123 + 4567890123456789 + 4567890123456789 + 4567890123456789 +(5 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT q1 FROM +( + WITH t_cte AS MATERIALIZED (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + QUERY PLAN +--------------------------------------------- + Subquery Scan on ss + Output: ss.q1 + -> Seq Scan on public.int8_tbl i8 + Output: i8.q1, NULL::bigint + CTE t_cte + -> Seq Scan on public.int8_tbl t + Output: t.q1, t.q2 +(7 rows) + +SELECT q1 FROM +( + WITH t_cte AS MATERIALIZED (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + q1 +------------------ + 123 + 123 + 4567890123456789 + 4567890123456789 + 4567890123456789 +(5 rows) + -- a truly recursive CTE in the same list WITH RECURSIVE t(a) AS ( SELECT 0 diff --git a/src/test/regress/sql/with.sql b/src/test/regress/sql/with.sql index f1ea3ae22e..7e430e859e 100644 --- a/src/test/regress/sql/with.sql +++ b/src/test/regress/sql/with.sql @@ -1181,6 +1181,37 @@ COMMIT; SELECT * FROM bug6051_3; +-- check case where CTE reference is removed due to optimization +EXPLAIN (VERBOSE, COSTS OFF) +SELECT q1 FROM +( + WITH t_cte AS (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + +SELECT q1 FROM +( + WITH t_cte AS (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT q1 FROM +( + WITH t_cte AS MATERIALIZED (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + +SELECT q1 FROM +( + WITH t_cte AS MATERIALIZED (SELECT * FROM int8_tbl t) + SELECT q1, (SELECT q2 FROM t_cte WHERE t_cte.q1 = i8.q1) AS t_sub + FROM int8_tbl i8 +) ss; + -- a truly recursive CTE in the same list WITH RECURSIVE t(a) AS ( SELECT 0 From 99c754129d787ea4ce3b34b9f4c5f5e74c45ab6a Mon Sep 17 00:00:00 2001 From: David Rowley Date: Fri, 22 Apr 2022 16:02:15 +1200 Subject: [PATCH 569/772] Fix performance regression in tuplesort specializations 697492434 added 3 new qsort specialization functions aimed to improve the performance of sorting many of the common pass-by-value data types when they're the leading or only sort key. Unfortunately, that has caused a performance regression when sorting datasets where many of the values being compared were equal. What was happening here was that we were falling back to the standard sort comparison function to handle tiebreaks. When the two given Datums compared equally we would incur both the overhead of an indirect function call to the standard comparer to perform the tiebreak and also the standard comparer function would go and compare the leading key needlessly all over again. Here improve the situation in the 3 new comparison functions. We now return 0 directly when the two Datums compare equally and we're performing a 1-key sort. Here we don't do anything to help the multi-key sort case where the leading key uses one of the sort specializations functions. On testing this case, even when the leading key's values are all equal, there appeared to be no performance regression. Let's leave it up to future work to optimize that case so that the tiebreak function no longer re-compares the leading key over again. Another possible fix for this would have been to add 3 additional sort specialization functions to handle single-key sorts for these pass-by-value types. The reason we didn't do that here is that we may deem some other sort specialization to be more useful than single-key sorts. It may be impractical to have sort specialization functions for every single combination of what may be useful and it was already decided that further analysis into which ones are the most useful would be delayed until the v16 cycle. Let's not let this regression force our hand into trying to make that decision for v15. Author: David Rowley Reviewed-by: John Naylor Discussion: https://postgr.es/m/CA+hUKGJRbzaAOUtBUcjF5hLtaSHnJUqXmtiaLEoi53zeWSizeA@mail.gmail.com --- src/backend/utils/sort/tuplesort.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index 10e89e5208..e8da988a73 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -436,7 +436,11 @@ struct Tuplesortstate /* * This variable is shared by the single-key MinimalTuple case and the - * Datum case (which both use qsort_ssup()). Otherwise it's NULL. + * Datum case (which both use qsort_ssup()). Otherwise, it's NULL. The + * presence of a value in this field is also checked by various sort + * specialization functions as an optimization when comparing the leading + * key in a tiebreak situation to determine if there are any subsequent + * keys to sort on. */ SortSupport onlyKey; @@ -701,6 +705,13 @@ qsort_tuple_unsigned_compare(SortTuple *a, SortTuple *b, Tuplesortstate *state) if (compare != 0) return compare; + /* + * No need to waste effort calling the tiebreak function when there are + * no other keys to sort on. + */ + if (state->onlyKey != NULL) + return 0; + return state->comparetup(a, b, state); } @@ -713,9 +724,17 @@ qsort_tuple_signed_compare(SortTuple *a, SortTuple *b, Tuplesortstate *state) compare = ApplySignedSortComparator(a->datum1, a->isnull1, b->datum1, b->isnull1, &state->sortKeys[0]); + if (compare != 0) return compare; + /* + * No need to waste effort calling the tiebreak function when there are + * no other keys to sort on. + */ + if (state->onlyKey != NULL) + return 0; + return state->comparetup(a, b, state); } @@ -728,9 +747,17 @@ qsort_tuple_int32_compare(SortTuple *a, SortTuple *b, Tuplesortstate *state) compare = ApplyInt32SortComparator(a->datum1, a->isnull1, b->datum1, b->isnull1, &state->sortKeys[0]); + if (compare != 0) return compare; + /* + * No need to waste effort calling the tiebreak function when there are + * no other keys to sort on. + */ + if (state->onlyKey != NULL) + return 0; + return state->comparetup(a, b, state); } From 826be1ffb28dde083552150243dbbdcac55ab28e Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 22 Apr 2022 11:19:17 +0200 Subject: [PATCH 570/772] doc: Add links to tables Formal tables should generally have an xref in the text that points to them. Add them here. --- doc/src/sgml/config.sgml | 7 ++++--- doc/src/sgml/logical-replication.sgml | 7 ++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index a1682f6d4d..03986946a8 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -7663,11 +7663,12 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; - Each log line is serialized as a JSON object with the following - set of keys and their associated values. + Each log line is serialized as a JSON object with the set of keys and + their associated values shown in . - +
Keys and values of JSON log entries diff --git a/doc/src/sgml/logical-replication.sgml b/doc/src/sgml/logical-replication.sgml index a0f9cecd01..145ea71d61 100644 --- a/doc/src/sgml/logical-replication.sgml +++ b/doc/src/sgml/logical-replication.sgml @@ -399,7 +399,12 @@ So the UPDATE is transformed into an INSERT. -
+ + + summarizes the applied transformations. + + +
<command>UPDATE</command> Transformation Summary From a66e722cc1180cd7a2046fb552195a7d7703a592 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 22 Apr 2022 16:16:52 -0400 Subject: [PATCH 571/772] Remove some recently-added pg_dump test cases. Commit d2d35479796c3510e249d6fc72adbd5df918efbf included a pretty extensive set of test cases, and some of them don't work on all of our Windows machines. This happens because IPC::Run expands its arguments as shell globs on a few machines, but doesn't on most of the buildfarm. It might be good to fix that problem systematically somehow, but in the meantime, there are enough test cases for this commit that it seems OK to just remove the ones that are failing. Discussion: http://postgr.es/m/3a190754-b2b0-d02b-dcfd-4ec1610ffbcb@dunslane.net Discussion: http://postgr.es/m/CA+TgmoYRGUcFBy6VgN0+Pn4f6Wv=2H0HZLuPHqSy6VC8Ba7vdg@mail.gmail.com --- src/bin/pg_dump/t/002_pg_dump.pl | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index 1ecfd7ae23..3b31e13f62 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -3982,18 +3982,6 @@ 'pg_dumpall: option --exclude-database rejects multipart pattern "."' ); -$node->command_fails_like( - [ 'pg_dumpall', '--exclude-database', '.*' ], - qr/pg_dumpall: error: improper qualified name \(too many dotted names\): \.\*/, - 'pg_dumpall: option --exclude-database rejects multipart pattern ".*"' -); - -$node->command_fails_like( - [ 'pg_dumpall', '--exclude-database', '*.*' ], - qr/pg_dumpall: error: improper qualified name \(too many dotted names\): \*\.\*/, - 'pg_dumpall: option --exclude-database rejects multipart pattern "*.*"' -); - $node->command_fails_like( [ 'pg_dumpall', '--exclude-database', 'myhost.mydb' ], qr/pg_dumpall: error: improper qualified name \(too many dotted names\): myhost\.mydb/, @@ -4008,12 +3996,6 @@ 'pg_dumpall: option --exclude-database handles database names with embedded dots' ); -$node->command_ok( - [ 'pg_dumpall', '--exclude-database', '??*' ], - 'pg_dumpall: option --exclude-database handles database name patterns' -); - - ######################################### # Test invalid multipart schema names @@ -4041,24 +4023,12 @@ 'pg_dump: option --schema rejects cross-database multipart schema names with embedded dots' ); -$node->command_fails_like( - [ 'pg_dump', '--schema', '.*' ], - qr/pg_dump: error: cross-database references are not implemented: \.\*/, - 'pg_dump: option --schema rejects degenerate two-part schema name: ".*"' -); - $node->command_fails_like( [ 'pg_dump', '--schema', '..' ], qr/pg_dump: error: improper qualified name \(too many dotted names\): \.\./, 'pg_dump: option --schema rejects degenerate three-part schema name: ".."' ); -$node->command_fails_like( - [ 'pg_dump', '--schema', '.*.*' ], - qr/pg_dump: error: improper qualified name \(too many dotted names\): \.\*\.\*/, - 'pg_dump: option --schema rejects degenerate three-part schema pattern: ".*.*"' -); - ######################################### # Test invalid multipart relation names From c1da0acbb06e9175044b436d14c51cef03339109 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Fri, 22 Apr 2022 20:20:11 -0700 Subject: [PATCH 572/772] Test ALIGNOF_DOUBLE==4 compatibility under ALIGNOF_DOUBLE==8. Today's test case detected alignment problems only when executing on AIX. This change lets popular platforms detect the same problems. Reviewed by Masahiko Sawada. Discussion: https://postgr.es/m/20220415072601.GG862547@rfd.leadboat.com --- src/test/regress/expected/sanity_check.out | 10 +++++----- src/test/regress/expected/test_setup.out | 2 +- src/test/regress/regress.c | 16 ++++++---------- src/test/regress/sql/sanity_check.sql | 6 +++--- src/test/regress/sql/test_setup.sql | 2 +- 5 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/test/regress/expected/sanity_check.out b/src/test/regress/expected/sanity_check.out index a2faefb4c0..c5c675b750 100644 --- a/src/test/regress/expected/sanity_check.out +++ b/src/test/regress/expected/sanity_check.out @@ -39,18 +39,18 @@ WITH check_columns AS ( SELECT t.oid FROM pg_type t JOIN pg_attribute pa ON t.oid = pa.atttypid WHERE pa.attrelid = a.attrelid AND - pa.attnum > 0 AND pa.attnum <= a.attnum + pa.attnum > 0 AND pa.attnum < a.attnum ORDER BY pa.attnum) AS coltypes FROM pg_attribute a JOIN pg_class c ON c.oid = attrelid JOIN pg_namespace n ON c.relnamespace = n.oid WHERE attalign = 'd' AND relkind = 'r' AND attnotnull AND attlen <> -1 AND n.nspname = 'pg_catalog' ) -SELECT relname, attname, coltypes, get_column_offset(coltypes) +SELECT relname, attname, coltypes, get_columns_length(coltypes) FROM check_columns - WHERE get_column_offset(coltypes) % 8 != 0 OR + WHERE get_columns_length(coltypes) % 8 != 0 OR 'name'::regtype::oid = ANY(coltypes); - relname | attname | coltypes | get_column_offset ----------+---------+----------+------------------- + relname | attname | coltypes | get_columns_length +---------+---------+----------+-------------------- (0 rows) diff --git a/src/test/regress/expected/test_setup.out b/src/test/regress/expected/test_setup.out index 8b8ba7d778..391b36d131 100644 --- a/src/test/regress/expected/test_setup.out +++ b/src/test/regress/expected/test_setup.out @@ -206,7 +206,7 @@ CREATE FUNCTION ttdummy () RETURNS trigger AS :'regresslib' LANGUAGE C; -CREATE FUNCTION get_column_offset (oid[]) +CREATE FUNCTION get_columns_length(oid[]) RETURNS int AS :'regresslib' LANGUAGE C STRICT STABLE PARALLEL SAFE; diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c index 8b0c2d9d68..ade4b51fb8 100644 --- a/src/test/regress/regress.c +++ b/src/test/regress/regress.c @@ -1219,12 +1219,12 @@ binary_coercible(PG_FUNCTION_ARGS) } /* - * Return the column offset of the last data in the given array of - * data types. The input data types must be fixed-length data types. + * Return the length of the portion of a tuple consisting of the given array + * of data types. The input data types must be fixed-length data types. */ -PG_FUNCTION_INFO_V1(get_column_offset); +PG_FUNCTION_INFO_V1(get_columns_length); Datum -get_column_offset(PG_FUNCTION_ARGS) +get_columns_length(PG_FUNCTION_ARGS) { ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0); Oid *type_oids; @@ -1249,14 +1249,10 @@ get_column_offset(PG_FUNCTION_ARGS) get_typlenbyvalalign(typeoid, &typlen, &typbyval, &typalign); /* the data type must be fixed-length */ - if (!(typbyval || (typlen > 0))) + if (typlen < 0) elog(ERROR, "type %u is not fixed-length data type", typeoid); - column_offset = att_align_nominal(column_offset, typalign); - - /* not include the last type size */ - if (i != (ntypes - 1)) - column_offset += typlen; + column_offset = att_align_nominal(column_offset + typlen, typalign); } PG_RETURN_INT32(column_offset); diff --git a/src/test/regress/sql/sanity_check.sql b/src/test/regress/sql/sanity_check.sql index c70ff781fa..7f338d191c 100644 --- a/src/test/regress/sql/sanity_check.sql +++ b/src/test/regress/sql/sanity_check.sql @@ -34,14 +34,14 @@ WITH check_columns AS ( SELECT t.oid FROM pg_type t JOIN pg_attribute pa ON t.oid = pa.atttypid WHERE pa.attrelid = a.attrelid AND - pa.attnum > 0 AND pa.attnum <= a.attnum + pa.attnum > 0 AND pa.attnum < a.attnum ORDER BY pa.attnum) AS coltypes FROM pg_attribute a JOIN pg_class c ON c.oid = attrelid JOIN pg_namespace n ON c.relnamespace = n.oid WHERE attalign = 'd' AND relkind = 'r' AND attnotnull AND attlen <> -1 AND n.nspname = 'pg_catalog' ) -SELECT relname, attname, coltypes, get_column_offset(coltypes) +SELECT relname, attname, coltypes, get_columns_length(coltypes) FROM check_columns - WHERE get_column_offset(coltypes) % 8 != 0 OR + WHERE get_columns_length(coltypes) % 8 != 0 OR 'name'::regtype::oid = ANY(coltypes); diff --git a/src/test/regress/sql/test_setup.sql b/src/test/regress/sql/test_setup.sql index fbceb8cb46..02c0c84c3a 100644 --- a/src/test/regress/sql/test_setup.sql +++ b/src/test/regress/sql/test_setup.sql @@ -253,7 +253,7 @@ CREATE FUNCTION ttdummy () AS :'regresslib' LANGUAGE C; -CREATE FUNCTION get_column_offset (oid[]) +CREATE FUNCTION get_columns_length(oid[]) RETURNS int AS :'regresslib' LANGUAGE C STRICT STABLE PARALLEL SAFE; From f819020d400f1dbd96ee1a9fd44a1f6f44932b4d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 23 Apr 2022 12:16:12 -0400 Subject: [PATCH 573/772] Fix incautious CTE matching in rewriteSearchAndCycle(). This function looks for a reference to the recursive WITH CTE, but it checked only the CTE name not ctelevelsup, so that it could seize on a lower CTE that happened to have the same name. This would result in planner failures later, either weird errors such as "could not find attribute 2 in subquery targetlist", or crashes or assertion failures. The code also merely Assert'ed that it found a matching entry, which is not guaranteed at all by the parser. Per bugs #17320 and #17318 from Zhiyong Wu. Thanks to Kyotaro Horiguchi for investigation. Discussion: https://postgr.es/m/17320-70e37868182512ab@postgresql.org Discussion: https://postgr.es/m/17318-2eb65a3a611d2368@postgresql.org --- src/backend/rewrite/rewriteSearchCycle.c | 19 ++++++++++++++++--- src/test/regress/expected/with.out | 10 ++++++++++ src/test/regress/sql/with.sql | 10 ++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/backend/rewrite/rewriteSearchCycle.c b/src/backend/rewrite/rewriteSearchCycle.c index dc408404eb..58f684cd52 100644 --- a/src/backend/rewrite/rewriteSearchCycle.c +++ b/src/backend/rewrite/rewriteSearchCycle.c @@ -383,19 +383,32 @@ rewriteSearchAndCycle(CommonTableExpr *cte) newrte->eref = newrte->alias; /* - * Find the reference to our CTE in the range table + * Find the reference to the recursive CTE in the right UNION subquery's + * range table. We expect it to be two levels up from the UNION subquery + * (and must check that to avoid being fooled by sub-WITHs with the same + * CTE name). There will not be more than one such reference, because the + * parser would have rejected that (see checkWellFormedRecursion() in + * parse_cte.c). However, the parser doesn't insist that the reference + * appear in the UNION subquery's topmost range table, so we might fail to + * find it at all. That's an unimplemented case for the moment. */ for (int rti = 1; rti <= list_length(rte2->subquery->rtable); rti++) { RangeTblEntry *e = rt_fetch(rti, rte2->subquery->rtable); - if (e->rtekind == RTE_CTE && strcmp(cte->ctename, e->ctename) == 0) + if (e->rtekind == RTE_CTE && + strcmp(cte->ctename, e->ctename) == 0 && + e->ctelevelsup == 2) { cte_rtindex = rti; break; } } - Assert(cte_rtindex > 0); + if (cte_rtindex <= 0) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("with a SEARCH or CYCLE clause, the recursive reference to WITH query \"%s\" must be at the top level of its right-hand SELECT", + cte->ctename))); newsubquery = copyObject(rte2->subquery); IncrementVarSublevelsUp((Node *) newsubquery, 1, 1); diff --git a/src/test/regress/expected/with.out b/src/test/regress/expected/with.out index 32f90d7375..d731604374 100644 --- a/src/test/regress/expected/with.out +++ b/src/test/regress/expected/with.out @@ -846,6 +846,16 @@ with recursive search_graph(f, t, label) as ( ) search depth first by f, t set seq select * from search_graph order by seq; ERROR: with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT +-- check that we distinguish same CTE name used at different levels +-- (this case could be supported, perhaps, but it isn't today) +with recursive x(col) as ( + select 1 + union + (with x as (select * from x) + select * from x) +) search depth first by col set seq +select * from x; +ERROR: with a SEARCH or CYCLE clause, the recursive reference to WITH query "x" must be at the top level of its right-hand SELECT -- test ruleutils and view expansion create temp view v_search as with recursive search_graph(f, t, label) as ( diff --git a/src/test/regress/sql/with.sql b/src/test/regress/sql/with.sql index 7e430e859e..3251c29584 100644 --- a/src/test/regress/sql/with.sql +++ b/src/test/regress/sql/with.sql @@ -464,6 +464,16 @@ with recursive search_graph(f, t, label) as ( ) search depth first by f, t set seq select * from search_graph order by seq; +-- check that we distinguish same CTE name used at different levels +-- (this case could be supported, perhaps, but it isn't today) +with recursive x(col) as ( + select 1 + union + (with x as (select * from x) + select * from x) +) search depth first by col set seq +select * from x; + -- test ruleutils and view expansion create temp view v_search as with recursive search_graph(f, t, label) as ( From 0bd56172b2871e94c0d7115ffbf430308317ac49 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Mon, 25 Apr 2022 10:32:13 +0200 Subject: [PATCH 574/772] Always pfree strings returned by GetDatabasePath Several places didn't do it, and in many cases it didn't matter because it would be a small allocation in a short-lived context; but other places may accumulate a few (for example, in CreateDatabaseUsingFileCopy, one per tablespace). In most databases this is highly unlikely to be very serious either, but it seems better to make the code consistent in case there's future copy-and-paste. The only case of actual concern seems to be the aforementioned routine, which is new with commit 9c08aea6a309, so there's no need to backpatch. As pointed out by Coverity. --- src/backend/commands/dbcommands.c | 13 +++++++++++++ src/backend/utils/init/postinit.c | 1 + 2 files changed, 14 insertions(+) diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 1bbecfeddf..9d0f83cde3 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -217,6 +217,8 @@ CreateDatabaseUsingWalLog(Oid src_dboid, Oid dst_dboid, UnlockRelationId(&dstrelid, AccessShareLock); } + pfree(srcpath); + pfree(dstpath); list_free_deep(rnodelist); } @@ -628,6 +630,8 @@ CreateDatabaseUsingFileCopy(Oid src_dboid, Oid dst_dboid, Oid src_tsid, (void) XLogInsert(RM_DBASE_ID, XLOG_DBASE_CREATE_FILE_COPY | XLR_SPECIAL_REL_UPDATE); } + pfree(srcpath); + pfree(dstpath); } table_endscan(scan); table_close(rel, AccessShareLock); @@ -2128,6 +2132,9 @@ movedb(const char *dbname, const char *tblspcname) /* Now it's safe to release the database lock */ UnlockSharedObjectForSession(DatabaseRelationId, db_id, 0, AccessExclusiveLock); + + pfree(src_dbpath); + pfree(dst_dbpath); } /* Error cleanup callback for movedb */ @@ -2141,6 +2148,8 @@ movedb_failure_callback(int code, Datum arg) dstpath = GetDatabasePath(fparms->dest_dboid, fparms->dest_tsoid); (void) rmtree(dstpath, true); + + pfree(dstpath); } /* @@ -3051,6 +3060,9 @@ dbase_redo(XLogReaderState *record) * We don't need to copy subdirectories */ copydir(src_path, dst_path, false); + + pfree(src_path); + pfree(dst_path); } else if (info == XLOG_DBASE_CREATE_WAL_LOG) { @@ -3063,6 +3075,7 @@ dbase_redo(XLogReaderState *record) /* Create the database directory with the version file. */ CreateDirAndVersionFile(dbpath, xlrec->db_id, xlrec->tablespace_id, true); + pfree(dbpath); } else if (info == XLOG_DBASE_DROP) { diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 5dbc7379e3..38e5b54a15 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -1057,6 +1057,7 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username, } SetDatabasePath(fullpath); + pfree(fullpath); /* * It's now possible to do real access to the system catalogs. From 4fb5c794e58613561f94ad5ea1197729be7791dc Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Mon, 25 Apr 2022 15:00:49 +0200 Subject: [PATCH 575/772] Cover brin/gin/gist/spgist ambuildempty routines in regression tests Changing some TEMP or permanent tables to UNLOGGED is sufficient to invoke these ambuildempty routines, which were all not uncovered by any tests. These changes do not otherwise affect the test suite. Author: Amul Sul Discussion: https://postgr.es/m/CAAJ_b95nneRCLM-=qELEdgCYSk6W_++-C+Q_t+wH3SW-hF50iw@mail.gmail.com --- src/test/regress/expected/brin.out | 2 +- src/test/regress/expected/gin.out | 2 +- src/test/regress/expected/gist.out | 2 +- src/test/regress/expected/spgist.out | 2 +- src/test/regress/sql/brin.sql | 2 +- src/test/regress/sql/gin.sql | 2 +- src/test/regress/sql/gist.sql | 2 +- src/test/regress/sql/spgist.sql | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/regress/expected/brin.out b/src/test/regress/expected/brin.out index ed7879f583..96cbb5de4e 100644 --- a/src/test/regress/expected/brin.out +++ b/src/test/regress/expected/brin.out @@ -484,7 +484,7 @@ ERROR: block number out of range: -1 SELECT brin_summarize_range('brin_summarize_idx', 4294967296); ERROR: block number out of range: 4294967296 -- test value merging in add_value -CREATE TABLE brintest_2 (n numrange); +CREATE UNLOGGED TABLE brintest_2 (n numrange); CREATE INDEX brinidx_2 ON brintest_2 USING brin (n); INSERT INTO brintest_2 VALUES ('empty'); INSERT INTO brintest_2 VALUES (numrange(0, 2^1000::numeric)); diff --git a/src/test/regress/expected/gin.out b/src/test/regress/expected/gin.out index 6402e89c7f..1a0c3c6167 100644 --- a/src/test/regress/expected/gin.out +++ b/src/test/regress/expected/gin.out @@ -74,7 +74,7 @@ select count(*) > 0 as ok from gin_test_tbl where i @> array[1]; reset gin_fuzzy_search_limit; -- Test optimization of empty queries -create temp table t_gin_test_tbl(i int4[], j int4[]); +create unlogged table t_gin_test_tbl(i int4[], j int4[]); create index on t_gin_test_tbl using gin (i, j); insert into t_gin_test_tbl values diff --git a/src/test/regress/expected/gist.out b/src/test/regress/expected/gist.out index 2393132ed6..a36b4c9c56 100644 --- a/src/test/regress/expected/gist.out +++ b/src/test/regress/expected/gist.out @@ -36,7 +36,7 @@ reindex index gist_pointidx; -- -- Test Index-only plans on GiST indexes -- -create table gist_tbl (b box, p point, c circle); +create unlogged table gist_tbl (b box, p point, c circle); insert into gist_tbl select box(point(0.05*i, 0.05*i), point(0.05*i, 0.05*i)), point(0.05*i, 0.05*i), diff --git a/src/test/regress/expected/spgist.out b/src/test/regress/expected/spgist.out index 1688e0e0a3..51bb9a95c5 100644 --- a/src/test/regress/expected/spgist.out +++ b/src/test/regress/expected/spgist.out @@ -26,7 +26,7 @@ vacuum spgist_point_tbl; -- Test rescan paths (cf. bug #15378) -- use box and && rather than point, so that rescan happens when the -- traverse stack is non-empty -create table spgist_box_tbl(id serial, b box); +create unlogged table spgist_box_tbl(id serial, b box); insert into spgist_box_tbl(b) select box(point(i,j),point(i+s,j+s)) from generate_series(1,100,5) i, diff --git a/src/test/regress/sql/brin.sql b/src/test/regress/sql/brin.sql index 920e053249..eec73b7fbe 100644 --- a/src/test/regress/sql/brin.sql +++ b/src/test/regress/sql/brin.sql @@ -449,7 +449,7 @@ SELECT brin_summarize_range('brin_summarize_idx', -1); SELECT brin_summarize_range('brin_summarize_idx', 4294967296); -- test value merging in add_value -CREATE TABLE brintest_2 (n numrange); +CREATE UNLOGGED TABLE brintest_2 (n numrange); CREATE INDEX brinidx_2 ON brintest_2 USING brin (n); INSERT INTO brintest_2 VALUES ('empty'); INSERT INTO brintest_2 VALUES (numrange(0, 2^1000::numeric)); diff --git a/src/test/regress/sql/gin.sql b/src/test/regress/sql/gin.sql index 5194afcc1f..746880937b 100644 --- a/src/test/regress/sql/gin.sql +++ b/src/test/regress/sql/gin.sql @@ -52,7 +52,7 @@ select count(*) > 0 as ok from gin_test_tbl where i @> array[1]; reset gin_fuzzy_search_limit; -- Test optimization of empty queries -create temp table t_gin_test_tbl(i int4[], j int4[]); +create unlogged table t_gin_test_tbl(i int4[], j int4[]); create index on t_gin_test_tbl using gin (i, j); insert into t_gin_test_tbl values diff --git a/src/test/regress/sql/gist.sql b/src/test/regress/sql/gist.sql index d94a0bb2f7..3360266370 100644 --- a/src/test/regress/sql/gist.sql +++ b/src/test/regress/sql/gist.sql @@ -41,7 +41,7 @@ reindex index gist_pointidx; -- Test Index-only plans on GiST indexes -- -create table gist_tbl (b box, p point, c circle); +create unlogged table gist_tbl (b box, p point, c circle); insert into gist_tbl select box(point(0.05*i, 0.05*i), point(0.05*i, 0.05*i)), diff --git a/src/test/regress/sql/spgist.sql b/src/test/regress/sql/spgist.sql index 7644f344a9..f375025dcb 100644 --- a/src/test/regress/sql/spgist.sql +++ b/src/test/regress/sql/spgist.sql @@ -34,7 +34,7 @@ vacuum spgist_point_tbl; -- use box and && rather than point, so that rescan happens when the -- traverse stack is non-empty -create table spgist_box_tbl(id serial, b box); +create unlogged table spgist_box_tbl(id serial, b box); insert into spgist_box_tbl(b) select box(point(i,j),point(i+s,j+s)) from generate_series(1,100,5) i, From dec8ad367e46180f826d5b6dc820fbecba1b71d2 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Mon, 25 Apr 2022 15:48:13 +0200 Subject: [PATCH 576/772] Drop unlogged table after test is done Another test is constructed on top of regression tests, which does not work correctly with unlogged tables. For now, cope with that by making sure no unlogged table is left behind. Per buildfarm pink after 4fb5c794e586. --- src/test/regress/expected/spgist.out | 1 + src/test/regress/sql/spgist.sql | 1 + 2 files changed, 2 insertions(+) diff --git a/src/test/regress/expected/spgist.out b/src/test/regress/expected/spgist.out index 51bb9a95c5..f07b6f0145 100644 --- a/src/test/regress/expected/spgist.out +++ b/src/test/regress/expected/spgist.out @@ -41,6 +41,7 @@ select count(*) 3 (1 row) +drop table spgist_box_tbl; -- The point opclass's choose method only uses the spgMatchNode action, -- so the other actions are not tested by the above. Create an index using -- text opclass, which uses the others actions. diff --git a/src/test/regress/sql/spgist.sql b/src/test/regress/sql/spgist.sql index f375025dcb..d56b80a51b 100644 --- a/src/test/regress/sql/spgist.sql +++ b/src/test/regress/sql/spgist.sql @@ -45,6 +45,7 @@ create index spgist_box_idx on spgist_box_tbl using spgist (b); select count(*) from (values (point(5,5)),(point(8,8)),(point(12,12))) v(p) where exists(select * from spgist_box_tbl b where b.b && box(v.p,v.p)); +drop table spgist_box_tbl; -- The point opclass's choose method only uses the spgMatchNode action, -- so the other actions are not tested by the above. Create an index using From b787c554c264cbed4de4eff2bb170a5224f0cfa5 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Mon, 25 Apr 2022 15:02:13 -0400 Subject: [PATCH 577/772] Inhibit mingw CRT's auto-globbing of command line arguments For some reason by default the mingw C Runtime takes it upon itself to expand program arguments that look like shell globbing characters. That has caused much scratching of heads and mis-attribution of the causes of some TAP test failures, so stop doing that. This removes an inconsistency with Windows binaries built with MSVC, which have no such behaviour. Per suggestion from Noah Misch. Backpatch to all live branches. Discussion: https://postgr.es/m/20220423025927.GA1274057@rfd.leadboat.com --- src/common/exec.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/common/exec.c b/src/common/exec.c index 95ef13c322..289b1f26b8 100644 --- a/src/common/exec.c +++ b/src/common/exec.c @@ -33,6 +33,11 @@ #endif #endif +/* Inhibit mingw CRT's auto-globbing of command line arguments */ +#if defined(WIN32) && !defined(_MSC_VER) +extern int _CRT_glob = 0; /* 0 turns off globbing; 1 turns it on */ +#endif + /* * Hacky solution to allow expressing both frontend and backend error reports * in one macro call. First argument of log_error is an errcode() call of From 21a10368eb3fce73f146d7e48b4d81496f60d965 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 26 Apr 2022 13:41:17 +0900 Subject: [PATCH 578/772] Add some isolation tests for CLUSTER This commit adds two isolation tests for CLUSTER, using: - A normal table, making sure that CLUSTER blocks and completes if the table is locked by a concurrent session. - A partitioned table with a partition owned by a different user. If the partitioned table is locked by a concurrent session, CLUSTER on the partitioned table should block. If the partition owned by a different user is locked, CLUSTER on its partitioned table should complete and skip the partition. 3f19e17 has added an early check to ignore such a partition with a SQL regression test, but this was not checking that CLUSTER should not block. Discussion: https://postgr.es/m/YlqveniXn9AI6RFZ@paquier.xyz --- .../expected/cluster-conflict-partition.out | 35 ++++++++++++++++++ .../isolation/expected/cluster-conflict.out | 19 ++++++++++ src/test/isolation/isolation_schedule | 2 + .../specs/cluster-conflict-partition.spec | 37 +++++++++++++++++++ .../isolation/specs/cluster-conflict.spec | 30 +++++++++++++++ 5 files changed, 123 insertions(+) create mode 100644 src/test/isolation/expected/cluster-conflict-partition.out create mode 100644 src/test/isolation/expected/cluster-conflict.out create mode 100644 src/test/isolation/specs/cluster-conflict-partition.spec create mode 100644 src/test/isolation/specs/cluster-conflict.spec diff --git a/src/test/isolation/expected/cluster-conflict-partition.out b/src/test/isolation/expected/cluster-conflict-partition.out new file mode 100644 index 0000000000..7acb675c97 --- /dev/null +++ b/src/test/isolation/expected/cluster-conflict-partition.out @@ -0,0 +1,35 @@ +Parsed test spec with 2 sessions + +starting permutation: s1_begin s1_lock_parent s2_auth s2_cluster s1_commit s2_reset +step s1_begin: BEGIN; +step s1_lock_parent: LOCK cluster_part_tab IN SHARE UPDATE EXCLUSIVE MODE; +step s2_auth: SET ROLE regress_cluster_part; +step s2_cluster: CLUSTER cluster_part_tab USING cluster_part_ind; +step s1_commit: COMMIT; +step s2_cluster: <... completed> +step s2_reset: RESET ROLE; + +starting permutation: s1_begin s2_auth s1_lock_parent s2_cluster s1_commit s2_reset +step s1_begin: BEGIN; +step s2_auth: SET ROLE regress_cluster_part; +step s1_lock_parent: LOCK cluster_part_tab IN SHARE UPDATE EXCLUSIVE MODE; +step s2_cluster: CLUSTER cluster_part_tab USING cluster_part_ind; +step s1_commit: COMMIT; +step s2_cluster: <... completed> +step s2_reset: RESET ROLE; + +starting permutation: s1_begin s1_lock_child s2_auth s2_cluster s1_commit s2_reset +step s1_begin: BEGIN; +step s1_lock_child: LOCK cluster_part_tab1 IN SHARE UPDATE EXCLUSIVE MODE; +step s2_auth: SET ROLE regress_cluster_part; +step s2_cluster: CLUSTER cluster_part_tab USING cluster_part_ind; +step s1_commit: COMMIT; +step s2_reset: RESET ROLE; + +starting permutation: s1_begin s2_auth s1_lock_child s2_cluster s1_commit s2_reset +step s1_begin: BEGIN; +step s2_auth: SET ROLE regress_cluster_part; +step s1_lock_child: LOCK cluster_part_tab1 IN SHARE UPDATE EXCLUSIVE MODE; +step s2_cluster: CLUSTER cluster_part_tab USING cluster_part_ind; +step s1_commit: COMMIT; +step s2_reset: RESET ROLE; diff --git a/src/test/isolation/expected/cluster-conflict.out b/src/test/isolation/expected/cluster-conflict.out new file mode 100644 index 0000000000..614d8f9d15 --- /dev/null +++ b/src/test/isolation/expected/cluster-conflict.out @@ -0,0 +1,19 @@ +Parsed test spec with 2 sessions + +starting permutation: s1_begin s1_lock s2_auth s2_cluster s1_commit s2_reset +step s1_begin: BEGIN; +step s1_lock: LOCK cluster_tab IN SHARE UPDATE EXCLUSIVE MODE; +step s2_auth: SET ROLE regress_cluster_conflict; +step s2_cluster: CLUSTER cluster_tab USING cluster_ind; +step s1_commit: COMMIT; +step s2_cluster: <... completed> +step s2_reset: RESET ROLE; + +starting permutation: s1_begin s2_auth s1_lock s2_cluster s1_commit s2_reset +step s1_begin: BEGIN; +step s2_auth: SET ROLE regress_cluster_conflict; +step s1_lock: LOCK cluster_tab IN SHARE UPDATE EXCLUSIVE MODE; +step s2_cluster: CLUSTER cluster_tab USING cluster_ind; +step s1_commit: COMMIT; +step s2_cluster: <... completed> +step s2_reset: RESET ROLE; diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule index 607760386e..529a4cbd4d 100644 --- a/src/test/isolation/isolation_schedule +++ b/src/test/isolation/isolation_schedule @@ -102,6 +102,8 @@ test: partition-key-update-2 test: partition-key-update-3 test: partition-key-update-4 test: plpgsql-toast +test: cluster-conflict +test: cluster-conflict-partition test: truncate-conflict test: serializable-parallel test: serializable-parallel-2 diff --git a/src/test/isolation/specs/cluster-conflict-partition.spec b/src/test/isolation/specs/cluster-conflict-partition.spec new file mode 100644 index 0000000000..5091f684a9 --- /dev/null +++ b/src/test/isolation/specs/cluster-conflict-partition.spec @@ -0,0 +1,37 @@ +# Tests for locking conflicts with CLUSTER command and partitions. + +setup +{ + CREATE ROLE regress_cluster_part; + CREATE TABLE cluster_part_tab (a int) PARTITION BY LIST (a); + CREATE TABLE cluster_part_tab1 PARTITION OF cluster_part_tab FOR VALUES IN (1); + CREATE TABLE cluster_part_tab2 PARTITION OF cluster_part_tab FOR VALUES IN (2); + CREATE INDEX cluster_part_ind ON cluster_part_tab(a); + ALTER TABLE cluster_part_tab OWNER TO regress_cluster_part; +} + +teardown +{ + DROP TABLE cluster_part_tab; + DROP ROLE regress_cluster_part; +} + +session s1 +step s1_begin { BEGIN; } +step s1_lock_parent { LOCK cluster_part_tab IN SHARE UPDATE EXCLUSIVE MODE; } +step s1_lock_child { LOCK cluster_part_tab1 IN SHARE UPDATE EXCLUSIVE MODE; } +step s1_commit { COMMIT; } + +session s2 +step s2_auth { SET ROLE regress_cluster_part; } +step s2_cluster { CLUSTER cluster_part_tab USING cluster_part_ind; } +step s2_reset { RESET ROLE; } + +# CLUSTER on the parent waits if locked, passes for all cases. +permutation s1_begin s1_lock_parent s2_auth s2_cluster s1_commit s2_reset +permutation s1_begin s2_auth s1_lock_parent s2_cluster s1_commit s2_reset + +# When taking a lock on a partition leaf, CLUSTER on the parent skips +# the leaf, passes for all cases. +permutation s1_begin s1_lock_child s2_auth s2_cluster s1_commit s2_reset +permutation s1_begin s2_auth s1_lock_child s2_cluster s1_commit s2_reset diff --git a/src/test/isolation/specs/cluster-conflict.spec b/src/test/isolation/specs/cluster-conflict.spec new file mode 100644 index 0000000000..2e1d547f01 --- /dev/null +++ b/src/test/isolation/specs/cluster-conflict.spec @@ -0,0 +1,30 @@ +# Tests for locking conflicts with CLUSTER command. + +setup +{ + CREATE ROLE regress_cluster_conflict; + CREATE TABLE cluster_tab (a int); + CREATE INDEX cluster_ind ON cluster_tab(a); + ALTER TABLE cluster_tab OWNER TO regress_cluster_conflict; +} + +teardown +{ + DROP TABLE cluster_tab; + DROP ROLE regress_cluster_conflict; +} + +session s1 +step s1_begin { BEGIN; } +step s1_lock { LOCK cluster_tab IN SHARE UPDATE EXCLUSIVE MODE; } +step s1_commit { COMMIT; } + +session s2 +step s2_auth { SET ROLE regress_cluster_conflict; } +step s2_cluster { CLUSTER cluster_tab USING cluster_ind; } +step s2_reset { RESET ROLE; } + +# The role has privileges to cluster the table, CLUSTER will block if +# another session holds a lock on the table and succeed in all cases. +permutation s1_begin s1_lock s2_auth s2_cluster s1_commit s2_reset +permutation s1_begin s2_auth s1_lock s2_cluster s1_commit s2_reset From 06cafd6f577ba251ac10d4f009fc3be424705a37 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 26 Apr 2022 14:24:13 +0900 Subject: [PATCH 579/772] Fix typo in pg_walinspect.c Spotted while looking at the surroundings, introduced by 2258e76. --- contrib/pg_walinspect/pg_walinspect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/pg_walinspect/pg_walinspect.c b/contrib/pg_walinspect/pg_walinspect.c index 58afa1ab1c..bf38863ff1 100644 --- a/contrib/pg_walinspect/pg_walinspect.c +++ b/contrib/pg_walinspect/pg_walinspect.c @@ -91,7 +91,7 @@ InitXLogReaderState(XLogRecPtr lsn, XLogRecPtr *first_record) XLogReaderState *xlogreader; /* - * Reading WAL below the first page of the first sgements isn't allowed. + * Reading WAL below the first page of the first segments isn't allowed. * This is a bootstrap WAL page and the page_read callback fails to read * it. */ From 9ddf251f94090cebf1bd8fc18396cb8a4b580d04 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 27 Apr 2022 09:15:09 +0200 Subject: [PATCH 580/772] Handle NULL fields in WRITE_INDEX_ARRAY Unlike existing WRITE_*_ARRAY macros, WRITE_INDEX_ARRAY needs to handle the case that the field is NULL. We already have the convention to print NULL fields as "<>", so we do that here as well. There is currently no corresponding read function for this, so reading this back in is not implemented, but it could be if needed. Reported-by: Richard Guo Reviewed-by: Tom Lane Discussion: https://www.postgresql.org/message-id/flat/CAMbWs4-LN%3DbF8f9eU2R94dJtF54DfDvBq%2BovqHnOQqbinYDrUw%40mail.gmail.com --- src/backend/nodes/outfuncs.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 6a02f81ad5..b1f2de8b28 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -124,11 +124,18 @@ static void outChar(StringInfo str, char c); appendStringInfo(str, " %u", node->fldname[i]); \ } while(0) +/* + * This macro supports the case that the field is NULL. For the other array + * macros, that is currently not needed. + */ #define WRITE_INDEX_ARRAY(fldname, len) \ do { \ appendStringInfoString(str, " :" CppAsString(fldname) " "); \ - for (int i = 0; i < len; i++) \ - appendStringInfo(str, " %u", node->fldname[i]); \ + if (node->fldname) \ + for (int i = 0; i < len; i++) \ + appendStringInfo(str, " %u", node->fldname[i]); \ + else \ + appendStringInfoString(str, "<>"); \ } while(0) #define WRITE_INT_ARRAY(fldname, len) \ From 755df30e48b0a9ff8428f4c1ccb468dac29fc320 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 27 Apr 2022 09:49:10 +0200 Subject: [PATCH 581/772] Fix incorrect format placeholders --- src/backend/executor/execExprInterp.c | 2 +- src/backend/utils/activity/pgstat_xact.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index 7094e7e3f6..3b1c045c52 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -4786,7 +4786,7 @@ ExecPrepareJsonItemCoercion(JsonbValue *item, coercion = &coercions->timestamptz; break; default: - elog(ERROR, "unexpected jsonb datetime type oid %d", + elog(ERROR, "unexpected jsonb datetime type oid %u", item->val.datetime.typid); return (Datum) 0; } diff --git a/src/backend/utils/activity/pgstat_xact.c b/src/backend/utils/activity/pgstat_xact.c index 230ffa5afc..82eb59af83 100644 --- a/src/backend/utils/activity/pgstat_xact.c +++ b/src/backend/utils/activity/pgstat_xact.c @@ -368,7 +368,7 @@ pgstat_create_transactional(PgStat_Kind kind, Oid dboid, Oid objoid) if (pgstat_get_entry_ref(kind, dboid, objoid, false, NULL)) { ereport(WARNING, - errmsg("resetting existing stats for type %s, db=%d, oid=%d", + errmsg("resetting existing stats for type %s, db=%u, oid=%u", (pgstat_get_kind_info(kind))->name, dboid, objoid)); pgstat_reset(kind, dboid, objoid); From ccfbd9287d70038518bdd3e85d7f5fd3dd1bb880 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 28 Apr 2022 10:11:45 +0900 Subject: [PATCH 582/772] Replace existing durable_rename_excl() calls with durable_rename() durable_rename_excl() attempts to avoid overwriting any existing files by using link() and unlink(), falling back to rename() on some platforms (e.g., Windows where link() followed by unlink() is not concurrent-safe, see 909b449). Most callers of durable_rename_excl() use it just in case there is an existing file, but it happens that for all of them we never expect a target file to exist (WAL segment recycling, creation of timeline history file and basic_archive). basic_archive used durable_rename_excl() to avoid overwriting an archive concurrently created by another server. Now, there is a stat() call to avoid overwriting an existing archive a couple of lines above, so note that this change opens a small TOCTOU window in this module between the stat() call and durable_rename(). Furthermore, as mentioned in the top comment of durable_rename_excl(), this routine can result in multiple hard links to the same file and data corruption, with two or more links to the same file in pg_wal/ if a crash happens before the unlink() call during WAL recycling. Specifically, this would produce links to the same file for the current WAL file and the next one because the half-recycled WAL file was re-recycled during crash recovery of a follow-up cluster restart. This change replaces all calls to durable_rename_excl() with durable_rename(). This removes the protection against accidentally overwriting an existing file, but some platforms are already living without it, and all those code paths never expect an existing file (a couple of assertions are added to check after that, in case). This is a bug fix, but knowing the unlikeliness of the problem involving one of more crashes at an exceptionally bad moment, no backpatch is done. This could be revisited in the future. Author: Nathan Bossart Reviewed-by: Robert Haas, Kyotaro Horiguchi, Michael Paquier Discussion: https://postgr.es/m/20220407182954.GA1231544@nathanxps13 --- contrib/basic_archive/basic_archive.c | 5 +++-- src/backend/access/transam/timeline.c | 18 ++++++------------ src/backend/access/transam/xlog.c | 10 ++++------ 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/contrib/basic_archive/basic_archive.c b/contrib/basic_archive/basic_archive.c index e7efbfb9c3..ed33854c57 100644 --- a/contrib/basic_archive/basic_archive.c +++ b/contrib/basic_archive/basic_archive.c @@ -281,9 +281,10 @@ basic_archive_file_internal(const char *file, const char *path) /* * Sync the temporary file to disk and move it to its final destination. - * This will fail if destination already exists. + * Note that this will overwrite any existing file, but this is only + * possible if someone else created the file since the stat() above. */ - (void) durable_rename_excl(temp, destination, ERROR); + (void) durable_rename(temp, destination, ERROR); ereport(DEBUG1, (errmsg("archived \"%s\" via basic_archive", file))); diff --git a/src/backend/access/transam/timeline.c b/src/backend/access/transam/timeline.c index be21968293..c9344e5e8b 100644 --- a/src/backend/access/transam/timeline.c +++ b/src/backend/access/transam/timeline.c @@ -439,14 +439,11 @@ writeTimeLineHistory(TimeLineID newTLI, TimeLineID parentTLI, /* * Now move the completed history file into place with its final name. + * The target file should not exist. */ TLHistoryFilePath(path, newTLI); - - /* - * Perform the rename using link if available, paranoidly trying to avoid - * overwriting an existing file (there shouldn't be one). - */ - durable_rename_excl(tmppath, path, ERROR); + Assert(access(path, F_OK) != 0 && errno == ENOENT); + durable_rename(tmppath, path, ERROR); /* The history file can be archived immediately. */ if (XLogArchivingActive()) @@ -517,14 +514,11 @@ writeTimeLineHistoryFile(TimeLineID tli, char *content, int size) /* * Now move the completed history file into place with its final name. + * The target file should not exist. */ TLHistoryFilePath(path, tli); - - /* - * Perform the rename using link if available, paranoidly trying to avoid - * overwriting an existing file (there shouldn't be one). - */ - durable_rename_excl(tmppath, path, ERROR); + Assert(access(path, F_OK) != 0 && errno == ENOENT); + durable_rename(tmppath, path, ERROR); } /* diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 61cda56c6f..45c84e3959 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -3323,14 +3323,12 @@ InstallXLogFileSegment(XLogSegNo *segno, char *tmppath, } } - /* - * Perform the rename using link if available, paranoidly trying to avoid - * overwriting an existing file (there shouldn't be one). - */ - if (durable_rename_excl(tmppath, path, LOG) != 0) + /* The target file should not exist */ + Assert(access(path, F_OK) != 0 && errno == ENOENT); + if (durable_rename(tmppath, path, LOG) != 0) { LWLockRelease(ControlFileLock); - /* durable_rename_excl already emitted log message */ + /* durable_rename already emitted log message */ return false; } From 2c902bbf1911a3c3dd68b817209eca9be81e381c Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 28 Apr 2022 11:10:40 +0900 Subject: [PATCH 583/772] Remove durable_rename_excl() ccfbd92 has replaced all existing in-core callers of this function in favor of durable_rename(). durable_rename_excl() is by nature unsafe on crashes happening at the wrong time, so just remove it. Author: Nathan Bossart Reviewed-by: Robert Haas, Kyotaro Horiguchi, Michael Paquier Discussion: https://postgr.es/m/20220407182954.GA1231544@nathanxps13 --- src/backend/storage/file/fd.c | 63 ---------------------------------- src/include/pg_config_manual.h | 7 ---- src/include/storage/fd.h | 1 - 3 files changed, 71 deletions(-) diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index 24704b6a02..f904f60c08 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -807,69 +807,6 @@ durable_unlink(const char *fname, int elevel) return 0; } -/* - * durable_rename_excl -- rename a file in a durable manner. - * - * Similar to durable_rename(), except that this routine tries (but does not - * guarantee) not to overwrite the target file. - * - * Note that a crash in an unfortunate moment can leave you with two links to - * the target file. - * - * Log errors with the caller specified severity. - * - * On Windows, using a hard link followed by unlink() causes concurrency - * issues, while a simple rename() does not cause that, so be careful when - * changing the logic of this routine. - * - * Returns 0 if the operation succeeded, -1 otherwise. Note that errno is not - * valid upon return. - */ -int -durable_rename_excl(const char *oldfile, const char *newfile, int elevel) -{ - /* - * Ensure that, if we crash directly after the rename/link, a file with - * valid contents is moved into place. - */ - if (fsync_fname_ext(oldfile, false, false, elevel) != 0) - return -1; - -#ifdef HAVE_WORKING_LINK - if (link(oldfile, newfile) < 0) - { - ereport(elevel, - (errcode_for_file_access(), - errmsg("could not link file \"%s\" to \"%s\": %m", - oldfile, newfile))); - return -1; - } - unlink(oldfile); -#else - if (rename(oldfile, newfile) < 0) - { - ereport(elevel, - (errcode_for_file_access(), - errmsg("could not rename file \"%s\" to \"%s\": %m", - oldfile, newfile))); - return -1; - } -#endif - - /* - * Make change persistent in case of an OS crash, both the new entry and - * its parent directory need to be flushed. - */ - if (fsync_fname_ext(newfile, false, false, elevel) != 0) - return -1; - - /* Same for parent directory */ - if (fsync_parent_path(newfile, elevel) != 0) - return -1; - - return 0; -} - /* * InitFileAccess --- initialize this module during backend startup * diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h index 84ce5a4a5d..830804fdfb 100644 --- a/src/include/pg_config_manual.h +++ b/src/include/pg_config_manual.h @@ -163,13 +163,6 @@ #define USE_BARRIER_SMGRRELEASE #endif -/* - * Define this if your operating system supports link() - */ -#if !defined(WIN32) && !defined(__CYGWIN__) -#define HAVE_WORKING_LINK 1 -#endif - /* * USE_POSIX_FADVISE controls whether Postgres will attempt to use the * posix_fadvise() kernel call. Usually the automatic configure tests are diff --git a/src/include/storage/fd.h b/src/include/storage/fd.h index 69549b000f..2b4a8e0ffe 100644 --- a/src/include/storage/fd.h +++ b/src/include/storage/fd.h @@ -187,7 +187,6 @@ extern void fsync_fname(const char *fname, bool isdir); extern int fsync_fname_ext(const char *fname, bool isdir, bool ignore_perm, int elevel); extern int durable_rename(const char *oldfile, const char *newfile, int loglevel); extern int durable_unlink(const char *fname, int loglevel); -extern int durable_rename_excl(const char *oldfile, const char *newfile, int loglevel); extern void SyncDataDirectory(void); extern int data_sync_elevel(int elevel); From e84f82ab5cff2811745ae8e2ac163a4b8b733394 Mon Sep 17 00:00:00 2001 From: John Naylor Date: Thu, 28 Apr 2022 09:27:32 +0700 Subject: [PATCH 584/772] Fix SQL syntax in comment in logical/worker.c Euler Taveira Disussion: https://www.postgresql.org/message-id/25f95189-eef8-43c4-9d7b-419b651963c8%40www.fastmail.com --- src/backend/replication/logical/worker.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 4171371296..7da7823c35 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -93,7 +93,7 @@ * ReorderBufferFinishPrepared. * * If the subscription has no tables then a two_phase tri-state PENDING is - * left unchanged. This lets the user still do an ALTER TABLE REFRESH + * left unchanged. This lets the user still do an ALTER SUBSCRIPTION REFRESH * PUBLICATION which might otherwise be disallowed (see below). * * If ever a user needs to be aware of the tri-state value, they can fetch it From 55b56865115eccd6449e79d6f06fe49d6ba3b792 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 28 Apr 2022 13:08:16 +0900 Subject: [PATCH 585/772] Revert recent changes with durable_rename_excl() This reverts commits 2c902bb and ccfbd92. Per buildfarm members kestrel, rorqual and calliphoridae, the assertions checking that a TLI history file should not exist when created by a WAL receiver have been failing, and switching to durable_rename() over durable_rename_excl() would cause the newest TLI history file to overwrite the existing one. We need to think harder about such cases, so revert the new logic for now. Note that all the failures have been reported in the test 025_stuck_on_old_timeline. Discussion: https://postgr.es/m/511362.1651116498@sss.pgh.pa.us --- contrib/basic_archive/basic_archive.c | 5 +-- src/backend/access/transam/timeline.c | 18 +++++--- src/backend/access/transam/xlog.c | 10 +++-- src/backend/storage/file/fd.c | 63 +++++++++++++++++++++++++++ src/include/pg_config_manual.h | 7 +++ src/include/storage/fd.h | 1 + 6 files changed, 91 insertions(+), 13 deletions(-) diff --git a/contrib/basic_archive/basic_archive.c b/contrib/basic_archive/basic_archive.c index ed33854c57..e7efbfb9c3 100644 --- a/contrib/basic_archive/basic_archive.c +++ b/contrib/basic_archive/basic_archive.c @@ -281,10 +281,9 @@ basic_archive_file_internal(const char *file, const char *path) /* * Sync the temporary file to disk and move it to its final destination. - * Note that this will overwrite any existing file, but this is only - * possible if someone else created the file since the stat() above. + * This will fail if destination already exists. */ - (void) durable_rename(temp, destination, ERROR); + (void) durable_rename_excl(temp, destination, ERROR); ereport(DEBUG1, (errmsg("archived \"%s\" via basic_archive", file))); diff --git a/src/backend/access/transam/timeline.c b/src/backend/access/transam/timeline.c index c9344e5e8b..be21968293 100644 --- a/src/backend/access/transam/timeline.c +++ b/src/backend/access/transam/timeline.c @@ -439,11 +439,14 @@ writeTimeLineHistory(TimeLineID newTLI, TimeLineID parentTLI, /* * Now move the completed history file into place with its final name. - * The target file should not exist. */ TLHistoryFilePath(path, newTLI); - Assert(access(path, F_OK) != 0 && errno == ENOENT); - durable_rename(tmppath, path, ERROR); + + /* + * Perform the rename using link if available, paranoidly trying to avoid + * overwriting an existing file (there shouldn't be one). + */ + durable_rename_excl(tmppath, path, ERROR); /* The history file can be archived immediately. */ if (XLogArchivingActive()) @@ -514,11 +517,14 @@ writeTimeLineHistoryFile(TimeLineID tli, char *content, int size) /* * Now move the completed history file into place with its final name. - * The target file should not exist. */ TLHistoryFilePath(path, tli); - Assert(access(path, F_OK) != 0 && errno == ENOENT); - durable_rename(tmppath, path, ERROR); + + /* + * Perform the rename using link if available, paranoidly trying to avoid + * overwriting an existing file (there shouldn't be one). + */ + durable_rename_excl(tmppath, path, ERROR); } /* diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 45c84e3959..61cda56c6f 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -3323,12 +3323,14 @@ InstallXLogFileSegment(XLogSegNo *segno, char *tmppath, } } - /* The target file should not exist */ - Assert(access(path, F_OK) != 0 && errno == ENOENT); - if (durable_rename(tmppath, path, LOG) != 0) + /* + * Perform the rename using link if available, paranoidly trying to avoid + * overwriting an existing file (there shouldn't be one). + */ + if (durable_rename_excl(tmppath, path, LOG) != 0) { LWLockRelease(ControlFileLock); - /* durable_rename already emitted log message */ + /* durable_rename_excl already emitted log message */ return false; } diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index f904f60c08..24704b6a02 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -807,6 +807,69 @@ durable_unlink(const char *fname, int elevel) return 0; } +/* + * durable_rename_excl -- rename a file in a durable manner. + * + * Similar to durable_rename(), except that this routine tries (but does not + * guarantee) not to overwrite the target file. + * + * Note that a crash in an unfortunate moment can leave you with two links to + * the target file. + * + * Log errors with the caller specified severity. + * + * On Windows, using a hard link followed by unlink() causes concurrency + * issues, while a simple rename() does not cause that, so be careful when + * changing the logic of this routine. + * + * Returns 0 if the operation succeeded, -1 otherwise. Note that errno is not + * valid upon return. + */ +int +durable_rename_excl(const char *oldfile, const char *newfile, int elevel) +{ + /* + * Ensure that, if we crash directly after the rename/link, a file with + * valid contents is moved into place. + */ + if (fsync_fname_ext(oldfile, false, false, elevel) != 0) + return -1; + +#ifdef HAVE_WORKING_LINK + if (link(oldfile, newfile) < 0) + { + ereport(elevel, + (errcode_for_file_access(), + errmsg("could not link file \"%s\" to \"%s\": %m", + oldfile, newfile))); + return -1; + } + unlink(oldfile); +#else + if (rename(oldfile, newfile) < 0) + { + ereport(elevel, + (errcode_for_file_access(), + errmsg("could not rename file \"%s\" to \"%s\": %m", + oldfile, newfile))); + return -1; + } +#endif + + /* + * Make change persistent in case of an OS crash, both the new entry and + * its parent directory need to be flushed. + */ + if (fsync_fname_ext(newfile, false, false, elevel) != 0) + return -1; + + /* Same for parent directory */ + if (fsync_parent_path(newfile, elevel) != 0) + return -1; + + return 0; +} + /* * InitFileAccess --- initialize this module during backend startup * diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h index 830804fdfb..84ce5a4a5d 100644 --- a/src/include/pg_config_manual.h +++ b/src/include/pg_config_manual.h @@ -163,6 +163,13 @@ #define USE_BARRIER_SMGRRELEASE #endif +/* + * Define this if your operating system supports link() + */ +#if !defined(WIN32) && !defined(__CYGWIN__) +#define HAVE_WORKING_LINK 1 +#endif + /* * USE_POSIX_FADVISE controls whether Postgres will attempt to use the * posix_fadvise() kernel call. Usually the automatic configure tests are diff --git a/src/include/storage/fd.h b/src/include/storage/fd.h index 2b4a8e0ffe..69549b000f 100644 --- a/src/include/storage/fd.h +++ b/src/include/storage/fd.h @@ -187,6 +187,7 @@ extern void fsync_fname(const char *fname, bool isdir); extern int fsync_fname_ext(const char *fname, bool isdir, bool ignore_perm, int elevel); extern int durable_rename(const char *oldfile, const char *newfile, int loglevel); extern int durable_unlink(const char *fname, int loglevel); +extern int durable_rename_excl(const char *oldfile, const char *newfile, int loglevel); extern void SyncDataDirectory(void); extern int data_sync_elevel(int elevel); From 5c854e7a2c8a6cd26040e0f9949e7a4a007f6366 Mon Sep 17 00:00:00 2001 From: Etsuro Fujita Date: Thu, 28 Apr 2022 15:15:00 +0900 Subject: [PATCH 586/772] Disable asynchronous execution if using gating Result nodes. mark_async_capable_plan(), which is called from create_append_plan() to determine whether subplans are async-capable, failed to take into account that the given subplan created from a given subpath might include a gating Result node if the subpath is a SubqueryScanPath or ForeignPath, causing a segmentation fault there when the subplan created from a SubqueryScanPath includes the Result node, or causing ExecAsyncRequest() to throw an error about an unrecognized node type when the subplan created from a ForeignPath includes the Result node, because in the latter case the Result node was unintentionally considered as async-capable, but we don't currently support executing Result nodes asynchronously. Fix by modifying mark_async_capable_plan() to disable asynchronous execution in such cases. Also, adjust code in the ProjectionPath case in mark_async_capable_plan(), for consistency with other cases, and adjust/improve comments there. is_async_capable_path() added in commit 27e1f1456, which was rewritten to mark_async_capable_plan() in a later commit, has the same issue, causing the error at execution mentioned above, so back-patch to v14 where the aforesaid commit went in. Per report from Justin Pryzby. Etsuro Fujita, reviewed by Zhihong Yu and Justin Pryzby. Discussion: https://postgr.es/m/20220408124338.GK24419%40telsasoft.com --- .../postgres_fdw/expected/postgres_fdw.out | 66 +++++++++++++++++++ contrib/postgres_fdw/sql/postgres_fdw.sql | 13 ++++ src/backend/optimizer/plan/createplan.c | 34 ++++++++-- 3 files changed, 106 insertions(+), 7 deletions(-) diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index 477de09a87..44457f930c 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -10734,6 +10734,72 @@ SELECT * FROM result_tbl ORDER BY a; (12 rows) DELETE FROM result_tbl; +-- Disable async execution if we use gating Result nodes for pseudoconstant +-- quals +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM async_pt WHERE CURRENT_USER = SESSION_USER; + QUERY PLAN +---------------------------------------------------------------- + Append + -> Result + Output: async_pt_1.a, async_pt_1.b, async_pt_1.c + One-Time Filter: (CURRENT_USER = SESSION_USER) + -> Foreign Scan on public.async_p1 async_pt_1 + Output: async_pt_1.a, async_pt_1.b, async_pt_1.c + Remote SQL: SELECT a, b, c FROM public.base_tbl1 + -> Result + Output: async_pt_2.a, async_pt_2.b, async_pt_2.c + One-Time Filter: (CURRENT_USER = SESSION_USER) + -> Foreign Scan on public.async_p2 async_pt_2 + Output: async_pt_2.a, async_pt_2.b, async_pt_2.c + Remote SQL: SELECT a, b, c FROM public.base_tbl2 + -> Result + Output: async_pt_3.a, async_pt_3.b, async_pt_3.c + One-Time Filter: (CURRENT_USER = SESSION_USER) + -> Seq Scan on public.async_p3 async_pt_3 + Output: async_pt_3.a, async_pt_3.b, async_pt_3.c +(18 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +(SELECT * FROM async_p1 WHERE CURRENT_USER = SESSION_USER) +UNION ALL +(SELECT * FROM async_p2 WHERE CURRENT_USER = SESSION_USER); + QUERY PLAN +---------------------------------------------------------------- + Append + -> Result + Output: async_p1.a, async_p1.b, async_p1.c + One-Time Filter: (CURRENT_USER = SESSION_USER) + -> Foreign Scan on public.async_p1 + Output: async_p1.a, async_p1.b, async_p1.c + Remote SQL: SELECT a, b, c FROM public.base_tbl1 + -> Result + Output: async_p2.a, async_p2.b, async_p2.c + One-Time Filter: (CURRENT_USER = SESSION_USER) + -> Foreign Scan on public.async_p2 + Output: async_p2.a, async_p2.b, async_p2.c + Remote SQL: SELECT a, b, c FROM public.base_tbl2 +(13 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM ((SELECT * FROM async_p1 WHERE b < 10) UNION ALL (SELECT * FROM async_p2 WHERE b < 10)) s WHERE CURRENT_USER = SESSION_USER; + QUERY PLAN +--------------------------------------------------------------------------------- + Append + -> Result + Output: async_p1.a, async_p1.b, async_p1.c + One-Time Filter: (CURRENT_USER = SESSION_USER) + -> Foreign Scan on public.async_p1 + Output: async_p1.a, async_p1.b, async_p1.c + Remote SQL: SELECT a, b, c FROM public.base_tbl1 WHERE ((b < 10)) + -> Result + Output: async_p2.a, async_p2.b, async_p2.c + One-Time Filter: (CURRENT_USER = SESSION_USER) + -> Foreign Scan on public.async_p2 + Output: async_p2.a, async_p2.b, async_p2.c + Remote SQL: SELECT a, b, c FROM public.base_tbl2 WHERE ((b < 10)) +(13 rows) + -- Test that pending requests are processed properly SET enable_mergejoin TO false; SET enable_hashjoin TO false; diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index ed181dedff..92d1212027 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -3410,6 +3410,19 @@ UNION ALL SELECT * FROM result_tbl ORDER BY a; DELETE FROM result_tbl; +-- Disable async execution if we use gating Result nodes for pseudoconstant +-- quals +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM async_pt WHERE CURRENT_USER = SESSION_USER; + +EXPLAIN (VERBOSE, COSTS OFF) +(SELECT * FROM async_p1 WHERE CURRENT_USER = SESSION_USER) +UNION ALL +(SELECT * FROM async_p2 WHERE CURRENT_USER = SESSION_USER); + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM ((SELECT * FROM async_p1 WHERE b < 10) UNION ALL (SELECT * FROM async_p2 WHERE b < 10)) s WHERE CURRENT_USER = SESSION_USER; + -- Test that pending requests are processed properly SET enable_mergejoin TO false; SET enable_hashjoin TO false; diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index 7905bc4654..db11936efe 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -1112,9 +1112,9 @@ create_join_plan(PlannerInfo *root, JoinPath *best_path) /* * mark_async_capable_plan - * Check whether a given Path node is async-capable, and if so, mark the - * Plan node created from it as such and return true, otherwise return - * false. + * Check whether the Plan node created from a Path node is async-capable, + * and if so, mark the Plan node as such and return true, otherwise + * return false. */ static bool mark_async_capable_plan(Plan *plan, Path *path) @@ -1125,6 +1125,13 @@ mark_async_capable_plan(Plan *plan, Path *path) { SubqueryScan *scan_plan = (SubqueryScan *) plan; + /* + * If the generated plan node includes a gating Result node, + * we can't execute it asynchronously. + */ + if (IsA(plan, Result)) + return false; + /* * If a SubqueryScan node atop of an async-capable plan node * is deletable, consider it as async-capable. @@ -1139,6 +1146,13 @@ mark_async_capable_plan(Plan *plan, Path *path) { FdwRoutine *fdwroutine = path->parent->fdwroutine; + /* + * If the generated plan node includes a gating Result node, + * we can't execute it asynchronously. + */ + if (IsA(plan, Result)) + return false; + Assert(fdwroutine != NULL); if (fdwroutine->IsForeignPathAsyncCapable != NULL && fdwroutine->IsForeignPathAsyncCapable((ForeignPath *) path)) @@ -1148,11 +1162,17 @@ mark_async_capable_plan(Plan *plan, Path *path) case T_ProjectionPath: /* - * If the generated plan node doesn't include a Result node, - * consider it as async-capable if the subpath is async-capable. + * If the generated plan node includes a Result node for + * the projection, we can't execute it asynchronously. + */ + if (IsA(plan, Result)) + return false; + + /* + * create_projection_plan() would have pulled up the subplan, so + * check the capability using the subpath. */ - if (!IsA(plan, Result) && - mark_async_capable_plan(plan, + if (mark_async_capable_plan(plan, ((ProjectionPath *) path)->subpath)) return true; return false; From 9c3d25e17894f35045a2d57dfb834e25c9dc4c21 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 28 Apr 2022 15:28:20 -0400 Subject: [PATCH 587/772] Fix JSON_OBJECTAGG uniquefying bug Commit f4fb45d15c contained a bug in removing items with null values when unique keys are required, where the leading items that are sorted contained such values. Fix that and add a test for it. Discussion: https://postgr.es/m/CAJA4AWQ_XbSmsNbW226UqNyRLJ+wb=iQkQMj77cQyoNkqtf=2Q@mail.gmail.com --- src/backend/utils/adt/jsonb_util.c | 14 ++++++++++++-- src/test/regress/expected/sqljson.out | 7 +++++++ src/test/regress/sql/sqljson.sql | 3 +++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c index aa151a53d6..21d874c098 100644 --- a/src/backend/utils/adt/jsonb_util.c +++ b/src/backend/utils/adt/jsonb_util.c @@ -1959,8 +1959,18 @@ uniqueifyJsonbObject(JsonbValue *object, bool unique_keys, bool skip_nulls) if (hasNonUniq || skip_nulls) { - JsonbPair *ptr = object->val.object.pairs + 1, - *res = object->val.object.pairs; + JsonbPair *ptr, *res; + + while (skip_nulls && object->val.object.nPairs > 0 && + object->val.object.pairs->value.type == jbvNull) + { + /* If skip_nulls is true, remove leading items with null */ + object->val.object.pairs++; + object->val.object.nPairs--; + } + + ptr = object->val.object.pairs + 1; + res = object->val.object.pairs; while (ptr - object->val.object.pairs < object->val.object.nPairs) { diff --git a/src/test/regress/expected/sqljson.out b/src/test/regress/expected/sqljson.out index 97a72be970..0883261535 100644 --- a/src/test/regress/expected/sqljson.out +++ b/src/test/regress/expected/sqljson.out @@ -944,6 +944,13 @@ ERROR: duplicate JSON object key value SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb) FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); ERROR: duplicate JSON object key value +SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb) +FROM (VALUES (1, 1), (0, NULL),(4, null), (5, null),(6, null),(2, 2)) foo(k, v); + json_objectagg +------------------ + {"1": 1, "2": 2} +(1 row) + -- Test JSON_OBJECT deparsing EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_OBJECT('foo' : '1' FORMAT JSON, 'bar' : 'baz' RETURNING json); diff --git a/src/test/regress/sql/sqljson.sql b/src/test/regress/sql/sqljson.sql index b422ded978..3db81a7ba8 100644 --- a/src/test/regress/sql/sqljson.sql +++ b/src/test/regress/sql/sqljson.sql @@ -281,6 +281,9 @@ FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb) FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); +SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb) +FROM (VALUES (1, 1), (0, NULL),(4, null), (5, null),(6, null),(2, 2)) foo(k, v); + -- Test JSON_OBJECT deparsing EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_OBJECT('foo' : '1' FORMAT JSON, 'bar' : 'baz' RETURNING json); From a79153b7a28579bda02e0d72464383dca4929e62 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Fri, 29 Apr 2022 09:01:05 -0400 Subject: [PATCH 588/772] Claim SQL standard compliance for SQL/JSON features Discussion: https://postgr.es/m/d03d809c-d0fb-fd6a-1476-d6dc18ec940e@dunslane.net --- src/backend/catalog/sql_features.txt | 30 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/backend/catalog/sql_features.txt b/src/backend/catalog/sql_features.txt index 4c3e29111d..910c40d3e4 100644 --- a/src/backend/catalog/sql_features.txt +++ b/src/backend/catalog/sql_features.txt @@ -527,20 +527,20 @@ T652 SQL-dynamic statements in SQL routines NO T653 SQL-schema statements in external routines YES T654 SQL-dynamic statements in external routines NO T655 Cyclically dependent routines YES -T811 Basic SQL/JSON constructor functions NO -T812 SQL/JSON: JSON_OBJECTAGG NO -T813 SQL/JSON: JSON_ARRAYAGG with ORDER BY NO -T814 Colon in JSON_OBJECT or JSON_OBJECTAGG NO -T821 Basic SQL/JSON query operators NO -T822 SQL/JSON: IS JSON WITH UNIQUE KEYS predicate NO -T823 SQL/JSON: PASSING clause NO -T824 JSON_TABLE: specific PLAN clause NO -T825 SQL/JSON: ON EMPTY and ON ERROR clauses NO -T826 General value expression in ON ERROR or ON EMPTY clauses NO -T827 JSON_TABLE: sibling NESTED COLUMNS clauses NO -T828 JSON_QUERY NO -T829 JSON_QUERY: array wrapper options NO -T830 Enforcing unique keys in SQL/JSON constructor functions NO +T811 Basic SQL/JSON constructor functions YES +T812 SQL/JSON: JSON_OBJECTAGG YES +T813 SQL/JSON: JSON_ARRAYAGG with ORDER BY YES +T814 Colon in JSON_OBJECT or JSON_OBJECTAGG YES +T821 Basic SQL/JSON query operators YES +T822 SQL/JSON: IS JSON WITH UNIQUE KEYS predicate YES +T823 SQL/JSON: PASSING clause YES +T824 JSON_TABLE: specific PLAN clause YES +T825 SQL/JSON: ON EMPTY and ON ERROR clauses YES +T826 General value expression in ON ERROR or ON EMPTY clauses YES +T827 JSON_TABLE: sibling NESTED COLUMNS clauses YES +T828 JSON_QUERY YES +T829 JSON_QUERY: array wrapper options YES +T830 Enforcing unique keys in SQL/JSON constructor functions YES T831 SQL/JSON path language: strict mode YES T832 SQL/JSON path language: item method YES T833 SQL/JSON path language: multiple subscripts YES @@ -548,7 +548,7 @@ T834 SQL/JSON path language: wildcard member accessor YES T835 SQL/JSON path language: filter expressions YES T836 SQL/JSON path language: starts with predicate YES T837 SQL/JSON path language: regex_like predicate YES -T838 JSON_TABLE: PLAN DEFAULT clause NO +T838 JSON_TABLE: PLAN DEFAULT clause YES T839 Formatted cast of datetimes to/from character strings NO M001 Datalinks NO M002 Datalinks via SQL/CLI NO From ccd10a9bfa54c1aad3561232bf24222f1b455e1c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 30 Apr 2022 11:54:28 -0400 Subject: [PATCH 589/772] Tighten enforcement of variable CONSTANT markings in plpgsql. I noticed that plpgsql would allow assignment of a new value to a variable even when that variable is marked CONSTANT, if the variable is used as an output parameter in CALL or is a refcursor variable that OPEN assigns a new value to. Fix these oversights. In the CALL case, the check has to be done at runtime because we cannot know at parse time which parameters are OUT parameters. For OPEN, it seems best to likewise enforce at runtime because then we needn't throw error if the variable has a nonnull value (since OPEN will only try to overwrite a null value). Although this is surely a bug fix, no back-patch: it seems unlikely that anyone would thank us for breaking formerly-working code in minor releases. Discussion: https://postgr.es/m/214453.1651182729@sss.pgh.pa.us --- src/pl/plpgsql/src/expected/plpgsql_call.out | 12 ++++ src/pl/plpgsql/src/pl_exec.c | 63 ++++++++++++++++++-- src/pl/plpgsql/src/sql/plpgsql_call.sql | 12 ++++ src/test/regress/expected/plpgsql.out | 27 +++++++++ src/test/regress/sql/plpgsql.sql | 24 ++++++++ 5 files changed, 134 insertions(+), 4 deletions(-) diff --git a/src/pl/plpgsql/src/expected/plpgsql_call.out b/src/pl/plpgsql/src/expected/plpgsql_call.out index 7b156f3489..1ec6182a8d 100644 --- a/src/pl/plpgsql/src/expected/plpgsql_call.out +++ b/src/pl/plpgsql/src/expected/plpgsql_call.out @@ -122,6 +122,18 @@ CONTEXT: PL/pgSQL function inline_code_block line 6 at CALL DO LANGUAGE plpgsql $$ +DECLARE + x constant int := 3; + y int := 4; +BEGIN + CALL test_proc6(2, x, y); -- error because x is constant +END; +$$; +ERROR: variable "x" is declared CONSTANT +CONTEXT: PL/pgSQL function inline_code_block line 6 at CALL +DO +LANGUAGE plpgsql +$$ DECLARE x int := 3; y int := 4; diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index ceb011810d..7bd2a9fff1 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -331,6 +331,7 @@ static void exec_prepare_plan(PLpgSQL_execstate *estate, static void exec_simple_check_plan(PLpgSQL_execstate *estate, PLpgSQL_expr *expr); static void exec_save_simple_expr(PLpgSQL_expr *expr, CachedPlan *cplan); static void exec_check_rw_parameter(PLpgSQL_expr *expr); +static void exec_check_assignable(PLpgSQL_execstate *estate, int dno); static bool exec_eval_simple_expr(PLpgSQL_execstate *estate, PLpgSQL_expr *expr, Datum *result, @@ -2342,9 +2343,13 @@ make_callstmt_target(PLpgSQL_execstate *estate, PLpgSQL_expr *expr) if (IsA(n, Param)) { Param *param = (Param *) n; + int dno; /* paramid is offset by 1 (see make_datum_param()) */ - row->varnos[nfields++] = param->paramid - 1; + dno = param->paramid - 1; + /* must check assignability now, because grammar can't */ + exec_check_assignable(estate, dno); + row->varnos[nfields++] = dno; } else { @@ -2926,10 +2931,14 @@ exec_stmt_forc(PLpgSQL_execstate *estate, PLpgSQL_stmt_forc *stmt) SPI_result_code_string(SPI_result)); /* - * If cursor variable was NULL, store the generated portal name in it + * If cursor variable was NULL, store the generated portal name in it, + * after verifying it's okay to assign to. */ if (curname == NULL) + { + exec_check_assignable(estate, stmt->curvar); assign_text_var(estate, curvar, portal->name); + } /* * Clean up before entering exec_for_query @@ -4688,13 +4697,18 @@ exec_stmt_open(PLpgSQL_execstate *estate, PLpgSQL_stmt_open *stmt) stmt->cursor_options); /* - * If cursor variable was NULL, store the generated portal name in it. + * If cursor variable was NULL, store the generated portal name in it, + * after verifying it's okay to assign to. + * * Note: exec_dynquery_with_params already reset the stmt_mcontext, so * curname is a dangling pointer here; but testing it for nullness is * OK. */ if (curname == NULL) + { + exec_check_assignable(estate, stmt->curvar); assign_text_var(estate, curvar, portal->name); + } return PLPGSQL_RC_OK; } @@ -4763,10 +4777,14 @@ exec_stmt_open(PLpgSQL_execstate *estate, PLpgSQL_stmt_open *stmt) SPI_result_code_string(SPI_result)); /* - * If cursor variable was NULL, store the generated portal name in it + * If cursor variable was NULL, store the generated portal name in it, + * after verifying it's okay to assign to. */ if (curname == NULL) + { + exec_check_assignable(estate, stmt->curvar); assign_text_var(estate, curvar, portal->name); + } /* If we had any transient data, clean it up */ exec_eval_cleanup(estate); @@ -8242,6 +8260,43 @@ exec_check_rw_parameter(PLpgSQL_expr *expr) } } +/* + * exec_check_assignable --- is it OK to assign to the indicated datum? + * + * This should match pl_gram.y's check_assignable(). + */ +static void +exec_check_assignable(PLpgSQL_execstate *estate, int dno) +{ + PLpgSQL_datum *datum; + + Assert(dno >= 0 && dno < estate->ndatums); + datum = estate->datums[dno]; + switch (datum->dtype) + { + case PLPGSQL_DTYPE_VAR: + case PLPGSQL_DTYPE_PROMISE: + case PLPGSQL_DTYPE_REC: + if (((PLpgSQL_variable *) datum)->isconst) + ereport(ERROR, + (errcode(ERRCODE_ERROR_IN_ASSIGNMENT), + errmsg("variable \"%s\" is declared CONSTANT", + ((PLpgSQL_variable *) datum)->refname))); + break; + case PLPGSQL_DTYPE_ROW: + /* always assignable; member vars were checked at compile time */ + break; + case PLPGSQL_DTYPE_RECFIELD: + /* assignable if parent record is */ + exec_check_assignable(estate, + ((PLpgSQL_recfield *) datum)->recparentno); + break; + default: + elog(ERROR, "unrecognized dtype: %d", datum->dtype); + break; + } +} + /* ---------- * exec_set_found Set the global found variable to true/false * ---------- diff --git a/src/pl/plpgsql/src/sql/plpgsql_call.sql b/src/pl/plpgsql/src/sql/plpgsql_call.sql index 8108d05060..5028398348 100644 --- a/src/pl/plpgsql/src/sql/plpgsql_call.sql +++ b/src/pl/plpgsql/src/sql/plpgsql_call.sql @@ -112,6 +112,18 @@ END; $$; +DO +LANGUAGE plpgsql +$$ +DECLARE + x constant int := 3; + y int := 4; +BEGIN + CALL test_proc6(2, x, y); -- error because x is constant +END; +$$; + + DO LANGUAGE plpgsql $$ diff --git a/src/test/regress/expected/plpgsql.out b/src/test/regress/expected/plpgsql.out index 33eb5e54b9..08e42f17dc 100644 --- a/src/test/regress/expected/plpgsql.out +++ b/src/test/regress/expected/plpgsql.out @@ -2256,6 +2256,33 @@ select refcursor_test2(20000, 20000) as "Should be false", f | t (1 row) +-- should fail +create function constant_refcursor() returns refcursor as $$ +declare + rc constant refcursor; +begin + open rc for select a from rc_test; + return rc; +end +$$ language plpgsql; +select constant_refcursor(); +ERROR: variable "rc" is declared CONSTANT +CONTEXT: PL/pgSQL function constant_refcursor() line 5 at OPEN +-- but it's okay like this +create or replace function constant_refcursor() returns refcursor as $$ +declare + rc constant refcursor := 'my_cursor_name'; +begin + open rc for select a from rc_test; + return rc; +end +$$ language plpgsql; +select constant_refcursor(); + constant_refcursor +-------------------- + my_cursor_name +(1 row) + -- -- tests for cursors with named parameter arguments -- diff --git a/src/test/regress/sql/plpgsql.sql b/src/test/regress/sql/plpgsql.sql index bffb7b703b..588c331033 100644 --- a/src/test/regress/sql/plpgsql.sql +++ b/src/test/regress/sql/plpgsql.sql @@ -1933,6 +1933,30 @@ $$ language plpgsql; select refcursor_test2(20000, 20000) as "Should be false", refcursor_test2(20, 20) as "Should be true"; +-- should fail +create function constant_refcursor() returns refcursor as $$ +declare + rc constant refcursor; +begin + open rc for select a from rc_test; + return rc; +end +$$ language plpgsql; + +select constant_refcursor(); + +-- but it's okay like this +create or replace function constant_refcursor() returns refcursor as $$ +declare + rc constant refcursor := 'my_cursor_name'; +begin + open rc for select a from rc_test; + return rc; +end +$$ language plpgsql; + +select constant_refcursor(); + -- -- tests for cursors with named parameter arguments -- From ed57cac84d1c5642737dab1e4c4b8cb4f0c4305f Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Sat, 30 Apr 2022 08:28:33 -0700 Subject: [PATCH 590/772] pg_walinspect: fix case where flush LSN is in the middle of a record. Instability in the test for pg_walinspect revealed that pg_get_wal_records_info_till_end_of_wal(x) would try to decode all the records with a start LSN earlier than the flush LSN, even though that might include a partial record at the end of the range. In that case, read_local_xlog_page_no_wait() would return NULL when it tried to read past the flush LSN, which would be interpreted as an error by the caller. That caused a test failure only on a BF animal that had been restarted recently, but could be expected to happen in the wild quite easily depending on the alignment of various parameters. Fix by using private data in read_local_xlog_page_no_wait() to signal end-of-wal to the caller, so that it can be properly distinguished from a real error. Discussion: https://postgr.es/m/Ymd/e5eeZMNAkrXo%40paquier.xyz Discussion: https://postgr.es/m/111657.1650910309@sss.pgh.pa.us Authors: Thomas Munro, Bharath Rupireddy. --- contrib/pg_walinspect/pg_walinspect.c | 59 ++++++++++++++------------ src/backend/access/transam/xlogutils.c | 11 +++++ src/include/access/xlogutils.h | 6 +++ 3 files changed, 50 insertions(+), 26 deletions(-) diff --git a/contrib/pg_walinspect/pg_walinspect.c b/contrib/pg_walinspect/pg_walinspect.c index bf38863ff1..cc33fb65d5 100644 --- a/contrib/pg_walinspect/pg_walinspect.c +++ b/contrib/pg_walinspect/pg_walinspect.c @@ -89,6 +89,7 @@ static XLogReaderState * InitXLogReaderState(XLogRecPtr lsn, XLogRecPtr *first_record) { XLogReaderState *xlogreader; + ReadLocalXLogPageNoWaitPrivate *private_data; /* * Reading WAL below the first page of the first segments isn't allowed. @@ -100,11 +101,14 @@ InitXLogReaderState(XLogRecPtr lsn, XLogRecPtr *first_record) (errmsg("could not read WAL at LSN %X/%X", LSN_FORMAT_ARGS(lsn)))); + private_data = (ReadLocalXLogPageNoWaitPrivate *) + palloc0(sizeof(ReadLocalXLogPageNoWaitPrivate)); + xlogreader = XLogReaderAllocate(wal_segment_size, NULL, XL_ROUTINE(.page_read = &read_local_xlog_page_no_wait, .segment_open = &wal_segment_open, .segment_close = &wal_segment_close), - NULL); + private_data); if (xlogreader == NULL) ereport(ERROR, @@ -132,7 +136,8 @@ InitXLogReaderState(XLogRecPtr lsn, XLogRecPtr *first_record) * * We guard against ordinary errors trying to read WAL that hasn't been * written yet by limiting end_lsn to the flushed WAL, but that can also - * encounter errors if the flush pointer falls in the middle of a record. + * encounter errors if the flush pointer falls in the middle of a record. In + * that case we'll return NULL. */ static XLogRecord * ReadNextXLogRecord(XLogReaderState *xlogreader, XLogRecPtr first_record) @@ -144,6 +149,15 @@ ReadNextXLogRecord(XLogReaderState *xlogreader, XLogRecPtr first_record) if (record == NULL) { + ReadLocalXLogPageNoWaitPrivate *private_data; + + /* return NULL, if end of WAL is reached */ + private_data = (ReadLocalXLogPageNoWaitPrivate *) + xlogreader->private_data; + + if (private_data->end_of_wal) + return NULL; + if (errormsg) ereport(ERROR, (errcode_for_file_access(), @@ -246,7 +260,11 @@ pg_get_wal_record_info(PG_FUNCTION_ARGS) xlogreader = InitXLogReaderState(lsn, &first_record); - (void) ReadNextXLogRecord(xlogreader, first_record); + if (!ReadNextXLogRecord(xlogreader, first_record)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("could not read WAL at %X/%X", + LSN_FORMAT_ARGS(first_record)))); MemSet(values, 0, sizeof(values)); MemSet(nulls, 0, sizeof(nulls)); @@ -254,6 +272,7 @@ pg_get_wal_record_info(PG_FUNCTION_ARGS) GetWALRecordInfo(xlogreader, first_record, values, nulls, PG_GET_WAL_RECORD_INFO_COLS); + pfree(xlogreader->private_data); XLogReaderFree(xlogreader); tuple = heap_form_tuple(tupdesc, values, nulls); @@ -327,26 +346,19 @@ GetWALRecordsInfo(FunctionCallInfo fcinfo, XLogRecPtr start_lsn, MemSet(values, 0, sizeof(values)); MemSet(nulls, 0, sizeof(nulls)); - for (;;) + while (ReadNextXLogRecord(xlogreader, first_record) && + xlogreader->EndRecPtr <= end_lsn) { - (void) ReadNextXLogRecord(xlogreader, first_record); - - if (xlogreader->EndRecPtr <= end_lsn) - { - GetWALRecordInfo(xlogreader, xlogreader->currRecPtr, values, nulls, - PG_GET_WAL_RECORDS_INFO_COLS); + GetWALRecordInfo(xlogreader, xlogreader->currRecPtr, values, nulls, + PG_GET_WAL_RECORDS_INFO_COLS); - tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, - values, nulls); - } - - /* if we read up to end_lsn, we're done */ - if (xlogreader->EndRecPtr >= end_lsn) - break; + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); CHECK_FOR_INTERRUPTS(); } + pfree(xlogreader->private_data); XLogReaderFree(xlogreader); #undef PG_GET_WAL_RECORDS_INFO_COLS @@ -555,20 +567,15 @@ GetWalStats(FunctionCallInfo fcinfo, XLogRecPtr start_lsn, MemSet(&stats, 0, sizeof(stats)); - for (;;) + while (ReadNextXLogRecord(xlogreader, first_record) && + xlogreader->EndRecPtr <= end_lsn) { - (void) ReadNextXLogRecord(xlogreader, first_record); - - if (xlogreader->EndRecPtr <= end_lsn) - XLogRecStoreStats(&stats, xlogreader); - - /* if we read up to end_lsn, we're done */ - if (xlogreader->EndRecPtr >= end_lsn) - break; + XLogRecStoreStats(&stats, xlogreader); CHECK_FOR_INTERRUPTS(); } + pfree(xlogreader->private_data); XLogReaderFree(xlogreader); MemSet(values, 0, sizeof(values)); diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index 425702641a..29419c10a8 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -957,7 +957,18 @@ read_local_xlog_page_guts(XLogReaderState *state, XLogRecPtr targetPagePtr, /* If asked, let's not wait for future WAL. */ if (!wait_for_wal) + { + ReadLocalXLogPageNoWaitPrivate *private_data; + + /* + * Inform the caller of read_local_xlog_page_no_wait that the + * end of WAL has been reached. + */ + private_data = (ReadLocalXLogPageNoWaitPrivate *) + state->private_data; + private_data->end_of_wal = true; break; + } CHECK_FOR_INTERRUPTS(); pg_usleep(1000L); diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 761625acf4..5fcbbc136f 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -75,6 +75,12 @@ typedef enum * need to be replayed) */ } XLogRedoAction; +/* Private data of the read_local_xlog_page_no_wait callback. */ +typedef struct ReadLocalXLogPageNoWaitPrivate +{ + bool end_of_wal; /* true, when end of WAL is reached */ +} ReadLocalXLogPageNoWaitPrivate; + extern XLogRedoAction XLogReadBufferForRedo(XLogReaderState *record, uint8 buffer_id, Buffer *buf); extern Buffer XLogInitBufferForRedo(XLogReaderState *record, uint8 block_id); From d89f97e83efed4b2ac0a1803a1b6813c8277de73 Mon Sep 17 00:00:00 2001 From: Etsuro Fujita Date: Mon, 2 May 2022 16:45:00 +0900 Subject: [PATCH 591/772] Fix typo in comment. --- src/backend/storage/ipc/latch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index 9dbb4f17cf..78c6a89271 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -689,7 +689,7 @@ CreateWaitEventSet(MemoryContext context, int nevents) * Use MAXALIGN size/alignment to guarantee that later uses of memory are * aligned correctly. E.g. epoll_event might need 8 byte alignment on some * platforms, but earlier allocations like WaitEventSet and WaitEvent - * might not sized to guarantee that when purely using sizeof(). + * might not be sized to guarantee that when purely using sizeof(). */ sz += MAXALIGN(sizeof(WaitEventSet)); sz += MAXALIGN(sizeof(WaitEvent) * nevents); From 7307988abdff6c948d87e6d9dc9aaaa1f4c5283f Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 2 May 2022 20:16:19 +0900 Subject: [PATCH 592/772] basebackup_to_shell: Add missing MarkGUCPrefixReserved() Oversight in c6306db24, as per a requirement from 88103567. All the other modules in the tree, be they in contrib/ or src/test/modules/, already do that. Author: Bharath Rupireddy Discussion: https://postgr.es/m/CALj2ACUy7q_KwSMda+2SHPSWep32tNUM8cXGRS3=-Vfodo9OUg@mail.gmail.com --- contrib/basebackup_to_shell/basebackup_to_shell.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contrib/basebackup_to_shell/basebackup_to_shell.c b/contrib/basebackup_to_shell/basebackup_to_shell.c index f0ddef1987..fd462a8ff4 100644 --- a/contrib/basebackup_to_shell/basebackup_to_shell.c +++ b/contrib/basebackup_to_shell/basebackup_to_shell.c @@ -86,6 +86,8 @@ _PG_init(void) 0, NULL, NULL, NULL); + MarkGUCPrefixReserved("basebackup_to_shell"); + BaseBackupAddTarget("shell", shell_check_detail, shell_get_sink); } From 21e184403bf92c52191d1f03dd6566a3d54dc907 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 2 May 2022 17:19:11 -0700 Subject: [PATCH 593/772] Add tests for recovery deadlock conflicts. The recovery conflict tests added in 9f8a050f68d surfaced a bug in the interaction between buffer pin and deadlock recovery conflicts. To make sure that the bugfix won't break deadlock conflict detection, add a test for that scenario. 031_recovery_conflict.pl will later be backpatched, with this included. Discussion: https://postgr.es/m/20220413002626.udl7lll7f3o7nre7@alap3.anarazel.de --- src/test/recovery/t/031_recovery_conflict.pl | 86 ++++++++++++++++++-- 1 file changed, 79 insertions(+), 7 deletions(-) diff --git a/src/test/recovery/t/031_recovery_conflict.pl b/src/test/recovery/t/031_recovery_conflict.pl index 83a8579dcf..192d2d5a31 100644 --- a/src/test/recovery/t/031_recovery_conflict.pl +++ b/src/test/recovery/t/031_recovery_conflict.pl @@ -4,8 +4,6 @@ # recovery conflict is detected Also, test that statistics in # pg_stat_database_conflicts are populated correctly -# TODO: add a test for deadlock recovery conflicts. - use strict; use warnings; use PostgreSQL::Test::Cluster; @@ -24,6 +22,9 @@ allow_in_place_tablespaces = on log_temp_files = 0 +# for deadlock test +max_prepared_transactions = 10 + # wait some to test the wait paths as well, but not long for obvious reasons max_standby_streaming_delay = 50ms @@ -55,9 +56,13 @@ # test schema / data my $table1 = "test_recovery_conflict_table1"; -$node_primary->safe_psql($test_db, qq[CREATE TABLE ${table1}(a int, b int);]); -$node_primary->safe_psql($test_db, - qq[INSERT INTO $table1 SELECT i % 3, 0 FROM generate_series(1,20) i]); +my $table2 = "test_recovery_conflict_table2"; +$node_primary->safe_psql( + $test_db, qq[ +CREATE TABLE ${table1}(a int, b int); +INSERT INTO $table1 SELECT i % 3, 0 FROM generate_series(1,20) i; +CREATE TABLE ${table2}(a int, b int); +]); my $primary_lsn = $node_primary->lsn('flush'); $node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); @@ -217,6 +222,67 @@ check_conflict_stat("tablespace"); +## RECOVERY CONFLICT 5: Deadlock +$sect = "startup deadlock"; +$expected_conflicts++; + +# Generate a few dead rows, to later be cleaned up by vacuum. Then acquire a +# lock on another relation in a prepared xact, so it's held continuously by +# the startup process. The standby psql will block acquiring that lock while +# holding a pin that vacuum needs, triggering the deadlock. +$node_primary->safe_psql( + $test_db, + qq[ +CREATE TABLE $table1(a int, b int); +INSERT INTO $table1 VALUES (1); +BEGIN; +INSERT INTO $table1(a) SELECT generate_series(1, 100) i; +ROLLBACK; +BEGIN; +LOCK TABLE $table2; +PREPARE TRANSACTION 'lock'; +INSERT INTO $table1(a) VALUES (170); +SELECT txid_current(); +]); + +$primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + +$psql_standby{stdin} .= qq[ + BEGIN; + -- hold pin + DECLARE $cursor1 CURSOR FOR SELECT a FROM $table1; + FETCH FORWARD FROM $cursor1; + -- wait for lock held by prepared transaction + SELECT * FROM $table2; + ]; +ok( pump_until( + $psql_standby{run}, $psql_timeout, + \$psql_standby{stdout}, qr/^1$/m,), + "$sect: cursor holding conflicting pin, also waiting for lock, established" +); + +# just to make sure we're waiting for lock already +ok( $node_standby->poll_query_until( + 'postgres', qq[ +SELECT 'waiting' FROM pg_locks WHERE locktype = 'relation' AND NOT granted; +], 'waiting'), + "$sect: lock acquisition is waiting"); + +# VACUUM will prune away rows, causing a buffer pin conflict, while standby +# psql is waiting on lock +$node_primary->safe_psql($test_db, qq[VACUUM $table1;]); +$primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_standby, 'replay', $primary_lsn); + +check_conflict_log("User transaction caused buffer deadlock with recovery."); +reconnect_and_clear(); +check_conflict_stat("deadlock"); + +# clean up for next tests +$node_primary->safe_psql($test_db, qq[ROLLBACK PREPARED 'lock';]); + + # Check that expected number of conflicts show in pg_stat_database. Needs to # be tested before database is dropped, for obvious reasons. is( $node_standby->safe_psql( @@ -226,7 +292,7 @@ qq[$expected_conflicts recovery conflicts shown in pg_stat_database]); -## RECOVERY CONFLICT 5: Database conflict +## RECOVERY CONFLICT 6: Database conflict $sect = "database conflict"; $node_primary->safe_psql('postgres', qq[DROP DATABASE $test_db;]); @@ -259,7 +325,13 @@ sub pump_until_standby sub reconnect_and_clear { - $psql_standby{stdin} .= "\\q\n"; + # If psql isn't dead already, tell it to quit as \q, when already dead, + # causes IPC::Run to unhelpfully error out with "ack Broken pipe:". + $psql_standby{run}->pump_nb(); + if ($psql_standby{run}->pumpable()) + { + $psql_standby{stdin} .= "\\q\n"; + } $psql_standby{run}->finish; # restart From 8f1537d10e83ad9c23ed2772cc28f74582b237ea Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 2 May 2022 18:25:00 -0700 Subject: [PATCH 594/772] Fix possibility of self-deadlock in ResolveRecoveryConflictWithBufferPin(). The tests added in 9f8a050f68d failed nearly reliably on FreeBSD in CI, and occasionally on the buildfarm. That turns out to be caused not by a bug in the test, but by a longstanding bug in recovery conflict handling. The standby timeout handler, used by ResolveRecoveryConflictWithBufferPin(), executed SendRecoveryConflictWithBufferPin() inside a signal handler. A bad idea, because the deadlock timeout handler (or a spurious latch set) could have interrupted ProcWaitForSignal(). If unlucky that could cause a self-deadlock on ProcArrayLock, if the deadlock check is in SendRecoveryConflictWithBufferPin()->CancelDBBackends(). To fix, set a flag in StandbyTimeoutHandler(), and check the flag in ResolveRecoveryConflictWithBufferPin(). Subsequently the recovery conflict tests will be backpatched. Discussion: https://postgr.es/m/20220413002626.udl7lll7f3o7nre7@alap3.anarazel.de Backpatch: 10- --- src/backend/storage/ipc/standby.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c index 2850867323..8c5e8432e7 100644 --- a/src/backend/storage/ipc/standby.c +++ b/src/backend/storage/ipc/standby.c @@ -46,6 +46,7 @@ static HTAB *RecoveryLockLists; /* Flags set by timeout handlers */ static volatile sig_atomic_t got_standby_deadlock_timeout = false; +static volatile sig_atomic_t got_standby_delay_timeout = false; static volatile sig_atomic_t got_standby_lock_timeout = false; static void ResolveRecoveryConflictWithVirtualXIDs(VirtualTransactionId *waitlist, @@ -793,7 +794,8 @@ ResolveRecoveryConflictWithBufferPin(void) } /* - * Wait to be signaled by UnpinBuffer(). + * Wait to be signaled by UnpinBuffer() or for the wait to be interrupted + * by one of the timeouts established above. * * We assume that only UnpinBuffer() and the timeout requests established * above can wake us up here. WakeupRecovery() called by walreceiver or @@ -802,7 +804,9 @@ ResolveRecoveryConflictWithBufferPin(void) */ ProcWaitForSignal(PG_WAIT_BUFFER_PIN); - if (got_standby_deadlock_timeout) + if (got_standby_delay_timeout) + SendRecoveryConflictWithBufferPin(PROCSIG_RECOVERY_CONFLICT_BUFFERPIN); + else if (got_standby_deadlock_timeout) { /* * Send out a request for hot-standby backends to check themselves for @@ -828,6 +832,7 @@ ResolveRecoveryConflictWithBufferPin(void) * individually, but that'd be slower. */ disable_all_timeouts(false); + got_standby_delay_timeout = false; got_standby_deadlock_timeout = false; } @@ -887,8 +892,8 @@ CheckRecoveryConflictDeadlock(void) */ /* - * StandbyDeadLockHandler() will be called if STANDBY_DEADLOCK_TIMEOUT - * occurs before STANDBY_TIMEOUT. + * StandbyDeadLockHandler() will be called if STANDBY_DEADLOCK_TIMEOUT is + * exceeded. */ void StandbyDeadLockHandler(void) @@ -898,16 +903,11 @@ StandbyDeadLockHandler(void) /* * StandbyTimeoutHandler() will be called if STANDBY_TIMEOUT is exceeded. - * Send out a request to release conflicting buffer pins unconditionally, - * so we can press ahead with applying changes in recovery. */ void StandbyTimeoutHandler(void) { - /* forget any pending STANDBY_DEADLOCK_TIMEOUT request */ - disable_timeout(STANDBY_DEADLOCK_TIMEOUT, false); - - SendRecoveryConflictWithBufferPin(PROCSIG_RECOVERY_CONFLICT_BUFFERPIN); + got_standby_delay_timeout = true; } /* From 2e77180d4572ddb892f9c2e253ee95dc0fa26b5f Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 4 May 2022 07:57:39 +0200 Subject: [PATCH 595/772] Fix incorrect format placeholders --- src/backend/access/rmgrdesc/relmapdesc.c | 2 +- src/backend/access/rmgrdesc/xactdesc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/access/rmgrdesc/relmapdesc.c b/src/backend/access/rmgrdesc/relmapdesc.c index f1b129b8a9..43d63eb9a4 100644 --- a/src/backend/access/rmgrdesc/relmapdesc.c +++ b/src/backend/access/rmgrdesc/relmapdesc.c @@ -26,7 +26,7 @@ relmap_desc(StringInfo buf, XLogReaderState *record) { xl_relmap_update *xlrec = (xl_relmap_update *) rec; - appendStringInfo(buf, "database %u tablespace %u size %u", + appendStringInfo(buf, "database %u tablespace %u size %d", xlrec->dbid, xlrec->tsid, xlrec->nbytes); } } diff --git a/src/backend/access/rmgrdesc/xactdesc.c b/src/backend/access/rmgrdesc/xactdesc.c index d3f625d072..e739c4a3bd 100644 --- a/src/backend/access/rmgrdesc/xactdesc.c +++ b/src/backend/access/rmgrdesc/xactdesc.c @@ -319,7 +319,7 @@ xact_desc_stats(StringInfo buf, const char *label, appendStringInfo(buf, "; %sdropped stats:", label); for (i = 0; i < ndropped; i++) { - appendStringInfo(buf, " %u/%u/%u", + appendStringInfo(buf, " %d/%u/%u", dropped_stats[i].kind, dropped_stats[i].dboid, dropped_stats[i].objoid); From 0432490d290f679cad773ce4735e8769e2c4db75 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Wed, 4 May 2022 14:15:25 +0200 Subject: [PATCH 596/772] Rename libpq test programs with libpq_ prefix The testclient and uri-regress programs in the libpq test suite had quite generic names which didn't convey much meaning. Since they are installed as part of the MSVC test runs, ensure that their purpose is a little bit clearer by renaming with a libpq_ prefix. While at it rename uri-regress to uri_regress to avoid mixing dash and under- score in the same filename. Reported-by: Noah Misch Discussion: https://postgr.es/m/20220501080706.GA1542365@rfd.leadboat.com --- src/interfaces/libpq/t/001_uri.pl | 30 +++++++++---------- src/interfaces/libpq/t/002_api.pl | 2 +- src/interfaces/libpq/test/.gitignore | 4 +-- src/interfaces/libpq/test/Makefile | 2 +- .../test/{testclient.c => libpq_testclient.c} | 4 +-- .../{uri-regress.c => libpq_uri_regress.c} | 8 ++--- src/tools/msvc/Mkvcbuild.pm | 8 ++--- 7 files changed, 29 insertions(+), 29 deletions(-) rename src/interfaces/libpq/test/{testclient.c => libpq_testclient.c} (88%) rename src/interfaces/libpq/test/{uri-regress.c => libpq_uri_regress.c} (90%) diff --git a/src/interfaces/libpq/t/001_uri.pl b/src/interfaces/libpq/t/001_uri.pl index 1d595c0529..beaf13b49c 100644 --- a/src/interfaces/libpq/t/001_uri.pl +++ b/src/interfaces/libpq/t/001_uri.pl @@ -72,7 +72,7 @@ ], [ q{postgresql://host/db?u%7aer=someotheruser&port=12345}, q{}, - q{uri-regress: invalid URI query parameter: "uzer"}, + q{libpq_uri_regress: invalid URI query parameter: "uzer"}, ], [ q{postgresql://host:12345?user=uri-user}, @@ -114,63 +114,63 @@ ], [ q{postgresql://host?uzer=}, q{}, - q{uri-regress: invalid URI query parameter: "uzer"}, + q{libpq_uri_regress: invalid URI query parameter: "uzer"}, ], [ q{postgre://}, q{}, - q{uri-regress: missing "=" after "postgre://" in connection info string}, + q{libpq_uri_regress: missing "=" after "postgre://" in connection info string}, ], [ q{postgres://[::1}, q{}, - q{uri-regress: end of string reached when looking for matching "]" in IPv6 host address in URI: "postgres://[::1"}, + q{libpq_uri_regress: end of string reached when looking for matching "]" in IPv6 host address in URI: "postgres://[::1"}, ], [ q{postgres://[]}, q{}, - q{uri-regress: IPv6 host address may not be empty in URI: "postgres://[]"}, + q{libpq_uri_regress: IPv6 host address may not be empty in URI: "postgres://[]"}, ], [ q{postgres://[::1]z}, q{}, - q{uri-regress: unexpected character "z" at position 17 in URI (expected ":" or "/"): "postgres://[::1]z"}, + q{libpq_uri_regress: unexpected character "z" at position 17 in URI (expected ":" or "/"): "postgres://[::1]z"}, ], [ q{postgresql://host?zzz}, q{}, - q{uri-regress: missing key/value separator "=" in URI query parameter: "zzz"}, + q{libpq_uri_regress: missing key/value separator "=" in URI query parameter: "zzz"}, ], [ q{postgresql://host?value1&value2}, q{}, - q{uri-regress: missing key/value separator "=" in URI query parameter: "value1"}, + q{libpq_uri_regress: missing key/value separator "=" in URI query parameter: "value1"}, ], [ q{postgresql://host?key=key=value}, q{}, - q{uri-regress: extra key/value separator "=" in URI query parameter: "key"}, + q{libpq_uri_regress: extra key/value separator "=" in URI query parameter: "key"}, ], [ q{postgres://host?dbname=%XXfoo}, q{}, - q{uri-regress: invalid percent-encoded token: "%XXfoo"}, + q{libpq_uri_regress: invalid percent-encoded token: "%XXfoo"}, ], [ q{postgresql://a%00b}, q{}, - q{uri-regress: forbidden value %00 in percent-encoded value: "a%00b"}, + q{libpq_uri_regress: forbidden value %00 in percent-encoded value: "a%00b"}, ], [ q{postgresql://%zz}, q{}, - q{uri-regress: invalid percent-encoded token: "%zz"}, + q{libpq_uri_regress: invalid percent-encoded token: "%zz"}, ], [ q{postgresql://%1}, q{}, - q{uri-regress: invalid percent-encoded token: "%1"}, + q{libpq_uri_regress: invalid percent-encoded token: "%1"}, ], [ q{postgresql://%}, q{}, - q{uri-regress: invalid percent-encoded token: "%"}, + q{libpq_uri_regress: invalid percent-encoded token: "%"}, ], [ q{postgres://@host}, q{host='host' (inet)}, q{}, ], [ q{postgres://host:/}, q{host='host' (inet)}, q{}, ], @@ -224,7 +224,7 @@ sub test_uri $expect{'exit'} = $expect{stderr} eq ''; - my $cmd = [ 'uri-regress', $uri ]; + my $cmd = [ 'libpq_uri_regress', $uri ]; $result{exit} = IPC::Run::run $cmd, '>', \$result{stdout}, '2>', \$result{stderr}; diff --git a/src/interfaces/libpq/t/002_api.pl b/src/interfaces/libpq/t/002_api.pl index 7c6c5788a0..8b3355e6dd 100644 --- a/src/interfaces/libpq/t/002_api.pl +++ b/src/interfaces/libpq/t/002_api.pl @@ -6,7 +6,7 @@ use Test::More; # Test PQsslAttribute(NULL, "library") -my ($out, $err) = run_command(['testclient', '--ssl']); +my ($out, $err) = run_command(['libpq_testclient', '--ssl']); if ($ENV{with_ssl} eq 'openssl') { diff --git a/src/interfaces/libpq/test/.gitignore b/src/interfaces/libpq/test/.gitignore index 4b17210483..6ba78adb67 100644 --- a/src/interfaces/libpq/test/.gitignore +++ b/src/interfaces/libpq/test/.gitignore @@ -1,2 +1,2 @@ -/testclient -/uri-regress +/libpq_testclient +/libpq_uri_regress diff --git a/src/interfaces/libpq/test/Makefile b/src/interfaces/libpq/test/Makefile index 1d45be0c37..1f75b73b8c 100644 --- a/src/interfaces/libpq/test/Makefile +++ b/src/interfaces/libpq/test/Makefile @@ -11,7 +11,7 @@ endif override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) LDFLAGS_INTERNAL += $(libpq_pgport) -PROGS = testclient uri-regress +PROGS = libpq_testclient libpq_uri_regress all: $(PROGS) diff --git a/src/interfaces/libpq/test/testclient.c b/src/interfaces/libpq/test/libpq_testclient.c similarity index 88% rename from src/interfaces/libpq/test/testclient.c rename to src/interfaces/libpq/test/libpq_testclient.c index 2c730d83fa..d945bacf1b 100644 --- a/src/interfaces/libpq/test/testclient.c +++ b/src/interfaces/libpq/test/libpq_testclient.c @@ -1,11 +1,11 @@ /* - * testclient.c + * libpq_testclient.c * A test program for the libpq public API * * Copyright (c) 2022, PostgreSQL Global Development Group * * IDENTIFICATION - * src/interfaces/libpq/test/testclient.c + * src/interfaces/libpq/test/libpq_testclient.c */ #include "postgres_fe.h" diff --git a/src/interfaces/libpq/test/uri-regress.c b/src/interfaces/libpq/test/libpq_uri_regress.c similarity index 90% rename from src/interfaces/libpq/test/uri-regress.c rename to src/interfaces/libpq/test/libpq_uri_regress.c index c5ef33c46b..60469002fd 100644 --- a/src/interfaces/libpq/test/uri-regress.c +++ b/src/interfaces/libpq/test/libpq_uri_regress.c @@ -1,5 +1,5 @@ /* - * uri-regress.c + * libpq_uri_regress.c * A test program for libpq URI format * * This is a helper for libpq conninfo regression testing. It takes a single @@ -10,7 +10,7 @@ * Portions Copyright (c) 2012-2022, PostgreSQL Global Development Group * * IDENTIFICATION - * src/interfaces/libpq/test/uri-regress.c + * src/interfaces/libpq/test/libpq_uri_regress.c */ #include "postgres_fe.h" @@ -33,14 +33,14 @@ main(int argc, char *argv[]) opts = PQconninfoParse(argv[1], &errmsg); if (opts == NULL) { - fprintf(stderr, "uri-regress: %s", errmsg); + fprintf(stderr, "libpq_uri_regress: %s", errmsg); return 1; } defs = PQconndefaults(); if (defs == NULL) { - fprintf(stderr, "uri-regress: cannot fetch default options\n"); + fprintf(stderr, "libpq_uri_regress: cannot fetch default options\n"); return 1; } diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm index fc04e1db8e..c3058399d4 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -285,17 +285,17 @@ sub mkvcbuild $libpqwalreceiver->AddReference($postgres, $libpq); my $libpq_testclient = - $solution->AddProject('testclient', 'exe', 'misc', + $solution->AddProject('libpq_testclient', 'exe', 'misc', 'src/interfaces/libpq/test'); - $libpq_testclient->AddFile('src/interfaces/libpq/test/testclient.c'); + $libpq_testclient->AddFile('src/interfaces/libpq/test/libpq_testclient.c'); $libpq_testclient->AddIncludeDir('src/interfaces/libpq'); $libpq_testclient->AddReference($libpgport, $libpq); $libpq_testclient->AddLibrary('ws2_32.lib'); my $libpq_uri_regress = - $solution->AddProject('uri-regress', 'exe', 'misc', + $solution->AddProject('libpq_uri_regress', 'exe', 'misc', 'src/interfaces/libpq/test'); - $libpq_uri_regress->AddFile('src/interfaces/libpq/test/uri-regress.c'); + $libpq_uri_regress->AddFile('src/interfaces/libpq/test/libpq_uri_regress.c'); $libpq_uri_regress->AddIncludeDir('src/interfaces/libpq'); $libpq_uri_regress->AddReference($libpgport, $libpq); $libpq_uri_regress->AddLibrary('ws2_32.lib'); From cfb63b994e91af8315f5262b3dc630c565f2420a Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 4 May 2022 13:33:59 +0200 Subject: [PATCH 597/772] Simplify configure test The test for lz4.h used AC_CHECK_HEADERS, but nothing was using the resulting symbol HAVE_LZ4_H. Change this to use AC_CHECK_HEADER instead. This was probably an oversight, seeing that the nearby similar tests do this correctly. --- configure | 6 ------ configure.ac | 2 +- src/include/pg_config.h.in | 3 --- src/tools/msvc/Solution.pm | 2 -- 4 files changed, 1 insertion(+), 12 deletions(-) diff --git a/configure b/configure index a4b654ad94..364f37559d 100755 --- a/configure +++ b/configure @@ -14103,19 +14103,13 @@ $as_echo "$LZ4" >&6; } fi if test "$with_lz4" = yes; then - for ac_header in lz4.h -do : ac_fn_c_check_header_mongrel "$LINENO" "lz4.h" "ac_cv_header_lz4_h" "$ac_includes_default" if test "x$ac_cv_header_lz4_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LZ4_H 1 -_ACEOF else as_fn_error $? "lz4.h header file is required for LZ4" "$LINENO" 5 fi -done fi diff --git a/configure.ac b/configure.ac index 44d35e1b5a..bfd8b713a9 100644 --- a/configure.ac +++ b/configure.ac @@ -1525,7 +1525,7 @@ fi PGAC_PATH_PROGS(LZ4, lz4) if test "$with_lz4" = yes; then - AC_CHECK_HEADERS(lz4.h, [], [AC_MSG_ERROR([lz4.h header file is required for LZ4])]) + AC_CHECK_HEADER(lz4.h, [], [AC_MSG_ERROR([lz4.h header file is required for LZ4])]) fi PGAC_PATH_PROGS(ZSTD, zstd) diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 13a2049df4..cdd742cb55 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -373,9 +373,6 @@ /* Define to 1 if `long long int' works and is 64 bits. */ #undef HAVE_LONG_LONG_INT_64 -/* Define to 1 if you have the header file. */ -#undef HAVE_LZ4_H - /* Define to 1 if you have the header file. */ #undef HAVE_MBARRIER_H diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index cb2ad6cd29..03357095b2 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -318,7 +318,6 @@ sub GenerateFiles HAVE_LOCALE_T => 1, HAVE_LONG_INT_64 => undef, HAVE_LONG_LONG_INT_64 => 1, - HAVE_LZ4_H => undef, HAVE_MBARRIER_H => undef, HAVE_MBSTOWCS_L => 1, HAVE_MEMORY_H => 1, @@ -541,7 +540,6 @@ sub GenerateFiles if ($self->{options}->{lz4}) { $define{HAVE_LIBLZ4} = 1; - $define{HAVE_LZ4_H} = 1; $define{USE_LZ4} = 1; } if ($self->{options}->{zstd}) From d47a11da9e5c5bad3eb0f353ab7b883d3f0eb48a Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 4 May 2022 17:34:22 +0200 Subject: [PATCH 598/772] Add missing enum tag in enum used in nodes Similar to 983bdc4fac492a99bb8ab5a471ca7437139e5cf6. Author: Alvaro Herrera Discussion: https://www.postgresql.org/message-id/202204191140.3wsbevfhqmu3@alvherre.pgsql --- src/include/nodes/parsenodes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index da02658c81..b1f81feb46 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1610,7 +1610,7 @@ typedef enum JsonQuotes * JsonTableColumnType - * enumeration of JSON_TABLE column types */ -typedef enum +typedef enum JsonTableColumnType { JTC_FOR_ORDINALITY, JTC_REGULAR, From dc2be6ed47e54004666a78e1592896c08f2be80e Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 4 May 2022 17:36:31 +0200 Subject: [PATCH 599/772] Remove JsonPathSpec typedef It doesn't seem very useful, and it's a bit in the way of the planned node support automation. Discussion: https://www.postgresql.org/message-id/202204191140.3wsbevfhqmu3@alvherre.pgsql --- src/backend/parser/parse_jsontable.c | 2 +- src/include/nodes/parsenodes.h | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/backend/parser/parse_jsontable.c b/src/backend/parser/parse_jsontable.c index 0dea7c998e..5ee63cf57f 100644 --- a/src/backend/parser/parse_jsontable.c +++ b/src/backend/parser/parse_jsontable.c @@ -73,7 +73,7 @@ transformJsonTableColumn(JsonTableColumn *jtc, Node *contextItemExpr, JsonFuncExpr *jfexpr = makeNode(JsonFuncExpr); JsonCommon *common = makeNode(JsonCommon); JsonOutput *output = makeNode(JsonOutput); - JsonPathSpec pathspec; + char *pathspec; JsonFormat *default_format; jfexpr->op = diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index b1f81feb46..9a716f3794 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1619,12 +1619,6 @@ typedef enum JsonTableColumnType JTC_NESTED, } JsonTableColumnType; -/* - * JsonPathSpec - - * representation of JSON path constant - */ -typedef char *JsonPathSpec; - /* * JsonOutput - * representation of JSON output clause (RETURNING type [FORMAT format]) @@ -1688,7 +1682,7 @@ typedef struct JsonTableColumn JsonTableColumnType coltype; /* column type */ char *name; /* column name */ TypeName *typeName; /* column type name */ - JsonPathSpec pathspec; /* path specification, if any */ + char *pathspec; /* path specification, if any */ char *pathname; /* path name, if any */ JsonFormat *format; /* JSON format clause, if specified */ JsonWrapper wrapper; /* WRAPPER behavior for formatted columns */ From c40ba5f318f96a6a5a29729b987ead11c5dc65c1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 4 May 2022 14:44:40 -0400 Subject: [PATCH 600/772] Fix rowcount estimate for SubqueryScan that's under a Gather. SubqueryScan was always getting labeled with a rowcount estimate appropriate for non-parallel cases. However, nodes that are underneath a Gather should be treated as processing only one worker's share of the rows, whether the particular node is explicitly parallel-aware or not. Most non-scan-level node types get this right automatically because they base their rowcount estimate on that of their input sub-Path(s). But SubqueryScan didn't do that, instead using the whole-relation rowcount estimate as if it were a non-parallel-aware scan node. If there is a parallel-aware node below the SubqueryScan, this is wrong, and it results in inflating the cost estimates for nodes above the SubqueryScan, which can cause us to not choose a parallel plan, or choose a silly one --- as indeed is visible in the one regression test whose results change with this patch. (Although that plan tree appears to contain no SubqueryScans, there were some in it before setrefs.c deleted them.) To fix, use path->subpath->rows not baserel->tuples as the number of input tuples we'll process. This requires estimating the quals' selectivity afresh, which is slightly annoying; but it shouldn't really add much cost thanks to the caching done in RestrictInfo. This is pretty clearly a bug fix, but I'll refrain from back-patching as people might not appreciate plan choices changing in stable branches. The fact that it took us this long to identify the bug suggests that it's not a major problem. Per report from bucoo, though this is not his proposed patch. Discussion: https://postgr.es/m/202204121457159307248@sohu.com --- src/backend/optimizer/path/costsize.c | 22 +++++++++++++++---- .../regress/expected/incremental_sort.out | 10 ++++----- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index b787c6f81a..6673d271c2 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -1395,6 +1395,7 @@ cost_subqueryscan(SubqueryScanPath *path, PlannerInfo *root, { Cost startup_cost; Cost run_cost; + List *qpquals; QualCost qpqual_cost; Cost cpu_per_tuple; @@ -1402,11 +1403,24 @@ cost_subqueryscan(SubqueryScanPath *path, PlannerInfo *root, Assert(baserel->relid > 0); Assert(baserel->rtekind == RTE_SUBQUERY); - /* Mark the path with the correct row estimate */ + /* + * We compute the rowcount estimate as the subplan's estimate times the + * selectivity of relevant restriction clauses. In simple cases this will + * come out the same as baserel->rows; but when dealing with parallelized + * paths we must do it like this to get the right answer. + */ if (param_info) - path->path.rows = param_info->ppi_rows; + qpquals = list_concat_copy(param_info->ppi_clauses, + baserel->baserestrictinfo); else - path->path.rows = baserel->rows; + qpquals = baserel->baserestrictinfo; + + path->path.rows = clamp_row_est(path->subpath->rows * + clauselist_selectivity(root, + qpquals, + 0, + JOIN_INNER, + NULL)); /* * Cost of path is cost of evaluating the subplan, plus cost of evaluating @@ -1421,7 +1435,7 @@ cost_subqueryscan(SubqueryScanPath *path, PlannerInfo *root, startup_cost = qpqual_cost.startup; cpu_per_tuple = cpu_tuple_cost + qpqual_cost.per_tuple; - run_cost = cpu_per_tuple * baserel->tuples; + run_cost = cpu_per_tuple * path->subpath->rows; /* tlist eval costs are paid per output row, not per tuple scanned */ startup_cost += path->path.pathtarget->cost.startup; diff --git a/src/test/regress/expected/incremental_sort.out b/src/test/regress/expected/incremental_sort.out index 21c429226f..0d8d77140a 100644 --- a/src/test/regress/expected/incremental_sort.out +++ b/src/test/regress/expected/incremental_sort.out @@ -1487,14 +1487,12 @@ explain (costs off) select * from t union select * from t order by 1,3; -> Unique -> Sort Sort Key: t.a, t.b, t.c - -> Append - -> Gather - Workers Planned: 2 + -> Gather + Workers Planned: 2 + -> Parallel Append -> Parallel Seq Scan on t - -> Gather - Workers Planned: 2 -> Parallel Seq Scan on t t_1 -(13 rows) +(11 rows) -- Full sort, not just incremental sort can be pushed below a gather merge path -- by generate_useful_gather_paths. From 9e6b7b45ca92cccd6b870fa4e0a98059a86ce79d Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 4 May 2022 12:50:38 -0700 Subject: [PATCH 601/772] Fix timing issue in deadlock recovery conflict test. Per buildfarm members longfin and skink. Discussion: https://postgr.es/m/20220413002626.udl7lll7f3o7nre7@alap3.anarazel.de Backpatch: 10- --- src/test/recovery/t/031_recovery_conflict.pl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/recovery/t/031_recovery_conflict.pl b/src/test/recovery/t/031_recovery_conflict.pl index 192d2d5a31..8dcb3da0de 100644 --- a/src/test/recovery/t/031_recovery_conflict.pl +++ b/src/test/recovery/t/031_recovery_conflict.pl @@ -226,6 +226,14 @@ $sect = "startup deadlock"; $expected_conflicts++; +# Want to test recovery deadlock conflicts, not buffer pin conflicts. Without +# changing max_standby_streaming_delay it'd be timing dependent what we hit +# first +$node_standby->adjust_conf('postgresql.conf', 'max_standby_streaming_delay', + "${PostgreSQL::Test::Utils::timeout_default}s"); +$node_standby->restart(); +reconnect_and_clear(); + # Generate a few dead rows, to later be cleaned up by vacuum. Then acquire a # lock on another relation in a prepared xact, so it's held continuously by # the startup process. The standby psql will block acquiring that lock while @@ -281,6 +289,9 @@ # clean up for next tests $node_primary->safe_psql($test_db, qq[ROLLBACK PREPARED 'lock';]); +$node_standby->adjust_conf('postgresql.conf', 'max_standby_streaming_delay', '50ms'); +$node_standby->restart(); +reconnect_and_clear(); # Check that expected number of conflicts show in pg_stat_database. Needs to From ab3479bf55066f3dc827796f5bf1e957ffc97d2d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 5 May 2022 14:54:53 -0400 Subject: [PATCH 602/772] Update time zone data files to tzdata release 2022a. DST law changes in Palestine. Historical corrections for Chile and Ukraine. --- src/timezone/data/tzdata.zi | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/timezone/data/tzdata.zi b/src/timezone/data/tzdata.zi index 1948c7258b..c38197eaeb 100644 --- a/src/timezone/data/tzdata.zi +++ b/src/timezone/data/tzdata.zi @@ -1,4 +1,4 @@ -# version 2021e +# version 2022a # This zic input file is in the public domain. R d 1916 o - Jun 14 23s 1 S R d 1916 1919 - O Su>=1 23s 0 - @@ -1111,9 +1111,10 @@ R P 2016 2018 - Mar Sa>=24 1 1 S R P 2016 2018 - O Sa>=24 1 0 - R P 2019 o - Mar 29 0 1 S R P 2019 o - O Sa>=24 0 0 - -R P 2020 ma - Mar Sa>=24 0 1 S +R P 2020 2021 - Mar Sa>=24 0 1 S R P 2020 o - O 24 1 0 - -R P 2021 ma - O lastF 1 0 - +R P 2021 ma - O F>=23 1 0 - +R P 2022 ma - Mar Su>=25 0 1 S Z Asia/Gaza 2:17:52 - LMT 1900 O 2 Z EET/EEST 1948 May 15 2 K EE%sT 1967 Jun 5 @@ -2431,8 +2432,8 @@ Z Europe/Simferopol 2:16:24 - LMT 1880 1 c CE%sT 1944 Ap 13 3 R MSK/MSD 1990 3 - MSK 1990 Jul 1 2 -2 - EET 1992 -2 e EE%sT 1994 May +2 - EET 1992 Mar 20 +2 c EE%sT 1994 May 3 e MSK/MSD 1996 Mar 31 0s 3 1 MSD 1996 O 27 3s 3 R MSK/MSD 1997 @@ -2787,7 +2788,7 @@ Z Europe/Kiev 2:2:4 - LMT 1880 1 c CE%sT 1943 N 6 3 R MSK/MSD 1990 Jul 1 2 2 1 EEST 1991 S 29 3 -2 e EE%sT 1995 +2 c EE%sT 1996 May 13 2 E EE%sT Z Europe/Uzhgorod 1:29:12 - LMT 1890 O 1 - CET 1940 @@ -2797,8 +2798,8 @@ Z Europe/Uzhgorod 1:29:12 - LMT 1890 O 3 R MSK/MSD 1990 3 - MSK 1990 Jul 1 2 1 - CET 1991 Mar 31 3 -2 - EET 1992 -2 e EE%sT 1995 +2 - EET 1992 Mar 20 +2 c EE%sT 1996 May 13 2 E EE%sT Z Europe/Zaporozhye 2:20:40 - LMT 1880 2:20 - +0220 1924 May 2 @@ -2806,7 +2807,8 @@ Z Europe/Zaporozhye 2:20:40 - LMT 1880 3 - MSK 1941 Au 25 1 c CE%sT 1943 O 25 3 R MSK/MSD 1991 Mar 31 2 -2 e EE%sT 1995 +2 e EE%sT 1992 Mar 20 +2 c EE%sT 1996 May 13 2 E EE%sT R u 1918 1919 - Mar lastSu 2 1 D R u 1918 1919 - O lastSu 2 0 S @@ -4088,12 +4090,12 @@ R x 2016 2018 - May Su>=9 3u 0 - R x 2016 2018 - Au Su>=9 4u 1 - R x 2019 ma - Ap Su>=2 3u 0 - R x 2019 ma - S Su>=2 4u 1 - -Z America/Santiago -4:42:46 - LMT 1890 --4:42:46 - SMT 1910 Ja 10 +Z America/Santiago -4:42:45 - LMT 1890 +-4:42:45 - SMT 1910 Ja 10 -5 - -05 1916 Jul --4:42:46 - SMT 1918 S 10 +-4:42:45 - SMT 1918 S 10 -4 - -04 1919 Jul --4:42:46 - SMT 1927 S +-4:42:45 - SMT 1927 S -5 x -05/-04 1932 S -4 - -04 1942 Jun -5 - -05 1942 Au @@ -4103,11 +4105,11 @@ Z America/Santiago -4:42:46 - LMT 1890 -5 - -05 1947 May 21 23 -4 x -04/-03 Z America/Punta_Arenas -4:43:40 - LMT 1890 --4:42:46 - SMT 1910 Ja 10 +-4:42:45 - SMT 1910 Ja 10 -5 - -05 1916 Jul --4:42:46 - SMT 1918 S 10 +-4:42:45 - SMT 1918 S 10 -4 - -04 1919 Jul --4:42:46 - SMT 1927 S +-4:42:45 - SMT 1927 S -5 x -05/-04 1932 S -4 - -04 1942 Jun -5 - -05 1942 Au From a6f12520bed073d1d548a691e85d7f5371cc4ed4 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 6 May 2022 09:07:14 +0200 Subject: [PATCH 603/772] doc: Fix typos introduced by 222b697ec077047024a96392a2f5cb9b1803ccf7 --- doc/src/sgml/func.sgml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 396359883d..cc4ab4a1f2 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -7418,22 +7418,22 @@ SELECT regexp_match('abc01234xyz', '(?:(.*?)(\d+)(.*)){1,1}'); - OCCURRENCES_REGEX(pattern IN string + OCCURRENCES_REGEX(pattern IN string) regexp_count(string, pattern) - POSITION_REGEX(pattern IN string + POSITION_REGEX(pattern IN string) regexp_instr(string, pattern) - SUBSTRING_REGEX(pattern IN string + SUBSTRING_REGEX(pattern IN string) regexp_substr(string, pattern) - TRANSLATE_REGEX(pattern IN string WITH replacement + TRANSLATE_REGEX(pattern IN string WITH replacement) regexp_replace(string, pattern, replacement) From 7d6a4fdf3243a7a18e2cfc6cf03bce01cc6ce651 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 6 May 2022 09:14:15 +0200 Subject: [PATCH 604/772] Fix some whitespace in documentation markup --- doc/src/sgml/func.sgml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index cc4ab4a1f2..85ecc639fd 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -18797,7 +18797,7 @@ SELECT JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'strict $.a[5]'); { ERROR | NULL | DEFAULT expression } ON EMPTY { ERROR | NULL | DEFAULT expression } ON ERROR ) - + Description @@ -18956,7 +18956,7 @@ SELECT JSON_VALUE(jsonb '[1,2]', 'strict $[*]' DEFAULT 1 ON ERROR); { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON EMPTY { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON ERROR ) - + Description From 7e367924e33e47e0b0b135b0649c406a589bd496 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 6 May 2022 09:17:38 +0200 Subject: [PATCH 605/772] Update SQL features Update a few items that have become supported or mostly supported but weren't updated at the time. --- src/backend/catalog/sql_features.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/catalog/sql_features.txt b/src/backend/catalog/sql_features.txt index 910c40d3e4..0a9c7df4f4 100644 --- a/src/backend/catalog/sql_features.txt +++ b/src/backend/catalog/sql_features.txt @@ -28,7 +28,7 @@ B124 Routine language Fortran NO B125 Routine language MUMPS NO B126 Routine language Pascal NO B127 Routine language PL/I NO -B128 Routine language SQL NO +B128 Routine language SQL YES B200 Polymorphic table functions NO B201 More than one PTF generic table parameter NO B202 PTF Copartitioning NO @@ -364,9 +364,9 @@ S051 Create table of type NO partially supported S071 SQL paths in function and type name resolution YES S081 Subtables NO S091 Basic array support NO partially supported -S091 Basic array support 01 Arrays of built-in data types NO +S091 Basic array support 01 Arrays of built-in data types YES S091 Basic array support 02 Arrays of distinct types NO -S091 Basic array support 03 Array expressions NO +S091 Basic array support 03 Array expressions YES S092 Arrays of user-defined types YES S094 Arrays of reference types NO S095 Array constructors by query YES @@ -463,12 +463,12 @@ T281 SELECT privilege with column granularity YES T285 Enhanced derived column names YES T301 Functional dependencies NO partially supported T312 OVERLAY function YES -T321 Basic SQL-invoked routines NO +T321 Basic SQL-invoked routines NO partially supported T321 Basic SQL-invoked routines 01 User-defined functions with no overloading YES T321 Basic SQL-invoked routines 02 User-defined stored procedures with no overloading YES T321 Basic SQL-invoked routines 03 Function invocation YES T321 Basic SQL-invoked routines 04 CALL statement YES -T321 Basic SQL-invoked routines 05 RETURN statement NO +T321 Basic SQL-invoked routines 05 RETURN statement YES T321 Basic SQL-invoked routines 06 ROUTINES view YES T321 Basic SQL-invoked routines 07 PARAMETERS view YES T322 Declared data type attributes NO From 59a32f00937c85fe944cf1fac3e8b98d091e2bc6 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 6 May 2022 20:01:15 +0900 Subject: [PATCH 606/772] Fix typo in origin.c Introduced in 5aa2350. Author: Peter Smith Discussion: https://postgr.es/m/CAHut+PsuWz6_7aCmivNU5FahgQxDUTQtc3+__XnWkBzQcfn43w@mail.gmail.com --- src/backend/replication/logical/origin.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/replication/logical/origin.c b/src/backend/replication/logical/origin.c index b0c8b6c077..21937ab2d3 100644 --- a/src/backend/replication/logical/origin.c +++ b/src/backend/replication/logical/origin.c @@ -1059,7 +1059,7 @@ ReplicationOriginExitCleanup(int code, Datum arg) /* * Setup a replication origin in the shared memory struct if it doesn't - * already exists and cache access to the specific ReplicationSlot so the + * already exist and cache access to the specific ReplicationSlot so the * array doesn't have to be searched when calling * replorigin_session_advance(). * From 17ec5fa502d299b1919b1afacda839fb7d8206ad Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Fri, 6 May 2022 14:41:31 +0200 Subject: [PATCH 607/772] Clear the OpenSSL error queue before cryptohash operations Setting up an EVP context for ciphers banned under FIPS generate two OpenSSL errors in the queue, and as we only consume one from the queue the other is at the head for the next invocation: postgres=# select md5('foo'); ERROR: could not compute MD5 hash: unsupported postgres=# select md5('foo'); ERROR: could not compute MD5 hash: initialization error Clearing the error queue when creating the context ensures that we don't pull in an error from an earlier operation. Discussion: https://postgr.es/m/C89D932C-501E-4473-9750-638CFCD9095E@yesql.se --- src/common/cryptohash_openssl.c | 9 +++++++++ src/common/hmac_openssl.c | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/src/common/cryptohash_openssl.c b/src/common/cryptohash_openssl.c index 6c98f1cf95..8e76ffdee9 100644 --- a/src/common/cryptohash_openssl.c +++ b/src/common/cryptohash_openssl.c @@ -117,7 +117,10 @@ pg_cryptohash_create(pg_cryptohash_type type) /* * Initialization takes care of assigning the correct type for OpenSSL. + * Also ensure that there aren't any unconsumed errors in the queue from + * previous runs. */ + ERR_clear_error(); ctx->evpctx = EVP_MD_CTX_create(); if (ctx->evpctx == NULL) @@ -182,6 +185,12 @@ pg_cryptohash_init(pg_cryptohash_ctx *ctx) { ctx->errreason = SSLerrmessage(ERR_get_error()); ctx->error = PG_CRYPTOHASH_ERROR_OPENSSL; + /* + * The OpenSSL error queue should normally be empty since we've + * consumed an error, but cipher initialization can in FIPS-enabled + * OpenSSL builds generate two errors so clear the queue here as well. + */ + ERR_clear_error(); return -1; } return 0; diff --git a/src/common/hmac_openssl.c b/src/common/hmac_openssl.c index 44f36d51dc..8874d6a240 100644 --- a/src/common/hmac_openssl.c +++ b/src/common/hmac_openssl.c @@ -106,9 +106,13 @@ pg_hmac_create(pg_cryptohash_type type) ctx->error = PG_HMAC_ERROR_NONE; ctx->errreason = NULL; + /* * Initialization takes care of assigning the correct type for OpenSSL. + * Also ensure that there aren't any unconsumed errors in the queue from + * previous runs. */ + ERR_clear_error(); #ifdef HAVE_HMAC_CTX_NEW #ifndef FRONTEND ResourceOwnerEnlargeHMAC(CurrentResourceOwner); From 0250a167a07d4d2cff932e467d84306cbd3704fe Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Fri, 6 May 2022 14:41:33 +0200 Subject: [PATCH 608/772] pgcrypto: report init errors as PXE_CIPHER_INIT Report OpenSSL errors during initialization as PXE_CIPHER_INIT since that's just what they were, and not generic unknown errors. This also removes the last users of the generic error, and thus it can be removed. Discussion: http://postgr.es/m/C89D932C-501E-4473-9750-638CFCD9095E@yesql.se --- contrib/pgcrypto/openssl.c | 4 ++-- contrib/pgcrypto/px.c | 1 - contrib/pgcrypto/px.h | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/contrib/pgcrypto/openssl.c b/contrib/pgcrypto/openssl.c index 68fd61b716..53e64297c2 100644 --- a/contrib/pgcrypto/openssl.c +++ b/contrib/pgcrypto/openssl.c @@ -209,13 +209,13 @@ px_find_digest(const char *name, PX_MD **res) if (!ctx) { pfree(digest); - return -1; + return PXE_CIPHER_INIT; } if (EVP_DigestInit_ex(ctx, md, NULL) == 0) { EVP_MD_CTX_destroy(ctx); pfree(digest); - return -1; + return PXE_CIPHER_INIT; } digest->algo = md; diff --git a/contrib/pgcrypto/px.c b/contrib/pgcrypto/px.c index c139798f3b..40b6a04d52 100644 --- a/contrib/pgcrypto/px.c +++ b/contrib/pgcrypto/px.c @@ -41,7 +41,6 @@ struct error_desc static const struct error_desc px_err_list[] = { {PXE_OK, "Everything ok"}, - {PXE_ERR_GENERIC, "Some PX error (not specified)"}, {PXE_NO_HASH, "No such hash algorithm"}, {PXE_NO_CIPHER, "No such cipher algorithm"}, {PXE_BAD_OPTION, "Unknown option"}, diff --git a/contrib/pgcrypto/px.h b/contrib/pgcrypto/px.h index f175862f8e..4ef40f3f1c 100644 --- a/contrib/pgcrypto/px.h +++ b/contrib/pgcrypto/px.h @@ -44,7 +44,7 @@ * PX error codes */ #define PXE_OK 0 -#define PXE_ERR_GENERIC -1 +/* -1 is unused */ #define PXE_NO_HASH -2 #define PXE_NO_CIPHER -3 /* -4 is unused */ From ee97d46cdb7e23f8ee98fe22648a1c3c75a80261 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Fri, 6 May 2022 14:41:36 +0200 Subject: [PATCH 609/772] pgcrypto: remove questionmark from error message The PXE_CIPHER_INIT error is used to report initialization errors, so appending a questionmark to the error isn't entirely accurate (using a space before the questionmark doubly so). Discussion: https://postgr.es/m/C89D932C-501E-4473-9750-638CFCD9095E@yesql.se --- contrib/pgcrypto/expected/blowfish_1.out | 32 ++++++++++++------------ contrib/pgcrypto/expected/cast5_1.out | 20 +++++++-------- contrib/pgcrypto/expected/des_1.out | 16 ++++++------ contrib/pgcrypto/px.c | 2 +- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/contrib/pgcrypto/expected/blowfish_1.out b/contrib/pgcrypto/expected/blowfish_1.out index 4d5ce1fb6e..e52abf1d29 100644 --- a/contrib/pgcrypto/expected/blowfish_1.out +++ b/contrib/pgcrypto/expected/blowfish_1.out @@ -3,25 +3,25 @@ -- -- some standard Blowfish testvalues SELECT encrypt('\x0000000000000000', '\x0000000000000000', 'bf-ecb/pad:none'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized SELECT encrypt('\xffffffffffffffff', '\xffffffffffffffff', 'bf-ecb/pad:none'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized SELECT encrypt('\x1000000000000001', '\x3000000000000000', 'bf-ecb/pad:none'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized SELECT encrypt('\x1111111111111111', '\x1111111111111111', 'bf-ecb/pad:none'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized SELECT encrypt('\x0123456789abcdef', '\xfedcba9876543210', 'bf-ecb/pad:none'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized SELECT encrypt('\x01a1d6d039776742', '\xfedcba9876543210', 'bf-ecb/pad:none'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized SELECT encrypt('\xffffffffffffffff', '\x0000000000000000', 'bf-ecb/pad:none'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- setkey SELECT encrypt('\xfedcba9876543210', '\xf0e1d2c3b4a5968778695a4b3c2d1e0f', 'bf-ecb/pad:none'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- with padding SELECT encrypt('\x01234567890123456789', '\x33443344334433443344334433443344', 'bf-ecb'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- cbc -- 28 bytes key SELECT encrypt('\x6b77b4d63006dee605b156e27403979358deb9e7154616d959f1652bd5', @@ -40,23 +40,23 @@ SELECT encrypt('\xfedcba9876543210', ERROR: encrypt error: Key was too big -- empty data select encrypt('', 'foo', 'bf'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- 10 bytes key select encrypt('foo', '0123456789', 'bf'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- 22 bytes key select encrypt('foo', '0123456789012345678901', 'bf'); ERROR: encrypt error: Key was too big -- decrypt select encode(decrypt(encrypt('foo', '0123456', 'bf'), '0123456', 'bf'), 'escape'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- iv select encrypt_iv('foo', '0123456', 'abcd', 'bf'); -ERROR: encrypt_iv error: Cipher cannot be initialized ? +ERROR: encrypt_iv error: Cipher cannot be initialized select encode(decrypt_iv('\x95c7e89322525d59', '0123456', 'abcd', 'bf'), 'escape'); -ERROR: decrypt_iv error: Cipher cannot be initialized ? +ERROR: decrypt_iv error: Cipher cannot be initialized -- long message select encrypt('Lets try a longer message.', '0123456789', 'bf'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized select encode(decrypt(encrypt('Lets try a longer message.', '0123456789', 'bf'), '0123456789', 'bf'), 'escape'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized diff --git a/contrib/pgcrypto/expected/cast5_1.out b/contrib/pgcrypto/expected/cast5_1.out index 5acf7e4343..175e0b0366 100644 --- a/contrib/pgcrypto/expected/cast5_1.out +++ b/contrib/pgcrypto/expected/cast5_1.out @@ -4,30 +4,30 @@ -- test vectors from RFC2144 -- 128 bit key SELECT encrypt('\x0123456789ABCDEF', '\x0123456712345678234567893456789A', 'cast5-ecb/pad:none'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- 80 bit key SELECT encrypt('\x0123456789ABCDEF', '\x01234567123456782345', 'cast5-ecb/pad:none'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- 40 bit key SELECT encrypt('\x0123456789ABCDEF', '\x0123456712', 'cast5-ecb/pad:none'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- cbc -- empty data select encrypt('', 'foo', 'cast5'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- 10 bytes key select encrypt('foo', '0123456789', 'cast5'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- decrypt select encode(decrypt(encrypt('foo', '0123456', 'cast5'), '0123456', 'cast5'), 'escape'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- iv select encrypt_iv('foo', '0123456', 'abcd', 'cast5'); -ERROR: encrypt_iv error: Cipher cannot be initialized ? +ERROR: encrypt_iv error: Cipher cannot be initialized select encode(decrypt_iv('\x384a970695ce016a', '0123456', 'abcd', 'cast5'), 'escape'); -ERROR: decrypt_iv error: Cipher cannot be initialized ? +ERROR: decrypt_iv error: Cipher cannot be initialized -- long message select encrypt('Lets try a longer message.', '0123456789', 'cast5'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized select encode(decrypt(encrypt('Lets try a longer message.', '0123456789', 'cast5'), '0123456789', 'cast5'), 'escape'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized diff --git a/contrib/pgcrypto/expected/des_1.out b/contrib/pgcrypto/expected/des_1.out index acacb38aaa..5a76154ee2 100644 --- a/contrib/pgcrypto/expected/des_1.out +++ b/contrib/pgcrypto/expected/des_1.out @@ -4,23 +4,23 @@ -- no official test vectors atm -- from blowfish.sql SELECT encrypt('\x0123456789abcdef', '\xfedcba9876543210', 'des-ecb/pad:none'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- empty data select encrypt('', 'foo', 'des'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- 8 bytes key select encrypt('foo', '01234589', 'des'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- decrypt select encode(decrypt(encrypt('foo', '0123456', 'des'), '0123456', 'des'), 'escape'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized -- iv select encrypt_iv('foo', '0123456', 'abcd', 'des'); -ERROR: encrypt_iv error: Cipher cannot be initialized ? +ERROR: encrypt_iv error: Cipher cannot be initialized select encode(decrypt_iv('\x50735067b073bb93', '0123456', 'abcd', 'des'), 'escape'); -ERROR: decrypt_iv error: Cipher cannot be initialized ? +ERROR: decrypt_iv error: Cipher cannot be initialized -- long message select encrypt('Lets try a longer message.', '01234567', 'des'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized select encode(decrypt(encrypt('Lets try a longer message.', '01234567', 'des'), '01234567', 'des'), 'escape'); -ERROR: encrypt error: Cipher cannot be initialized ? +ERROR: encrypt error: Cipher cannot be initialized diff --git a/contrib/pgcrypto/px.c b/contrib/pgcrypto/px.c index 40b6a04d52..3b098c6151 100644 --- a/contrib/pgcrypto/px.c +++ b/contrib/pgcrypto/px.c @@ -46,7 +46,7 @@ static const struct error_desc px_err_list[] = { {PXE_BAD_OPTION, "Unknown option"}, {PXE_BAD_FORMAT, "Badly formatted type"}, {PXE_KEY_TOO_BIG, "Key was too big"}, - {PXE_CIPHER_INIT, "Cipher cannot be initialized ?"}, + {PXE_CIPHER_INIT, "Cipher cannot be initialized"}, {PXE_HASH_UNUSABLE_FOR_HMAC, "This hash algorithm is unusable for HMAC"}, {PXE_BUG, "pgcrypto bug"}, {PXE_ARGUMENT_ERROR, "Illegal argument to function"}, From 701d918a426b394620ce4d046533f77262c70829 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 6 May 2022 09:24:06 -0400 Subject: [PATCH 610/772] Fix misleading comments about background worker registration. Since 6bc8ef0b7f1f1df3998745a66e1790e27424aa0c, the maximum number of backends can't change as background workers are registered, but these comments still reflect the way things worked prior to that. Also, per recent discussion, some modules call SetConfigOption() from _PG_init(). It's not entirely clear to me whether we want to regard that as a fully supported operation, but since we know it's a thing that happens, it at least deserves a mention in the comments, so add that. Nathan Bossart, reviewed by Anton A. Melnikov Discussion: http://postgr.es/m/20220419154658.GA2487941@nathanxps13 --- src/backend/postmaster/postmaster.c | 10 ++++------ src/backend/utils/init/postinit.c | 5 ++--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 964a56dec4..ce4007bb2c 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -1005,10 +1005,8 @@ PostmasterMain(int argc, char *argv[]) LocalProcessControlFile(false); /* - * Register the apply launcher. Since it registers a background worker, - * it needs to be called before InitializeMaxBackends(), and it's probably - * a good idea to call it before any modules had chance to take the - * background worker slots. + * Register the apply launcher. It's probably a good idea to call this + * before any modules had a chance to take the background worker slots. */ ApplyLauncherRegister(); @@ -1029,8 +1027,8 @@ PostmasterMain(int argc, char *argv[]) #endif /* - * Now that loadable modules have had their chance to register background - * workers, calculate MaxBackends. + * Now that loadable modules have had their chance to alter any GUCs, + * calculate MaxBackends. */ InitializeMaxBackends(); diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 38e5b54a15..d297ba0829 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -538,9 +538,8 @@ pg_split_opts(char **argv, int *argcp, const char *optstr) /* * Initialize MaxBackends value from config options. * - * This must be called after modules have had the chance to register background - * workers in shared_preload_libraries, and before shared memory size is - * determined. + * This must be called after modules have had the chance to alter GUCs in + * shared_preload_libraries and before shared memory size is determined. * * Note that in EXEC_BACKEND environment, the value is passed down from * postmaster to subprocesses via BackendParameters in SubPostmasterMain; only From b74e94dc27fdbb13954f230b1d1298430afa6c0c Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Sat, 7 May 2022 16:19:42 +1200 Subject: [PATCH 611/772] Rethink PROCSIGNAL_BARRIER_SMGRRELEASE. With sufficiently bad luck, it was possible for IssuePendingWritebacks() to reopen a file after we'd processed PROCSIGNAL_BARRIER_SMGRRELEASE and before the file was unlinked by some other backend. That left a small hole in commit 4eb21763's plan to fix all spurious errors from DROP TABLESPACE and similar on Windows. Fix by closing md.c's segments, instead of just closing fd.c's descriptors, and then teaching smgrwriteback() not to open files that aren't already open. Reported-by: Andres Freund Reviewed-by: Robert Haas Discussion: https://postgr.es/m/20220209220004.kb3dgtn2x2k2gtdm%40alap3.anarazel.de --- src/backend/storage/smgr/md.c | 22 +++++++++------- src/backend/storage/smgr/smgr.c | 45 +++++++++++++++++++++++++++------ src/include/storage/md.h | 1 - src/include/storage/smgr.h | 2 ++ 4 files changed, 52 insertions(+), 18 deletions(-) diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index 286dd3f755..43edaf5d87 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -116,6 +116,8 @@ static MemoryContext MdCxt; /* context for all MdfdVec objects */ * mdnblocks(). */ #define EXTENSION_DONT_CHECK_SIZE (1 << 4) +/* don't try to open a segment, if not already open */ +#define EXTENSION_DONT_OPEN (1 << 5) /* local routines */ @@ -551,12 +553,6 @@ mdclose(SMgrRelation reln, ForkNumber forknum) } } -void -mdrelease(void) -{ - closeAllVfds(); -} - /* * mdprefetch() -- Initiate asynchronous read of the specified block of a relation */ @@ -605,11 +601,14 @@ mdwriteback(SMgrRelation reln, ForkNumber forknum, segnum_end; v = _mdfd_getseg(reln, forknum, blocknum, true /* not used */ , - EXTENSION_RETURN_NULL); + EXTENSION_DONT_OPEN); /* * We might be flushing buffers of already removed relations, that's - * ok, just ignore that case. + * ok, just ignore that case. If the segment file wasn't open already + * (ie from a recent mdwrite()), then we don't want to re-open it, to + * avoid a race with PROCSIGNAL_BARRIER_SMGRRELEASE that might leave + * us with a descriptor to a file that is about to be unlinked. */ if (!v) return; @@ -1202,7 +1201,8 @@ _mdfd_getseg(SMgrRelation reln, ForkNumber forknum, BlockNumber blkno, /* some way to handle non-existent segments needs to be specified */ Assert(behavior & - (EXTENSION_FAIL | EXTENSION_CREATE | EXTENSION_RETURN_NULL)); + (EXTENSION_FAIL | EXTENSION_CREATE | EXTENSION_RETURN_NULL | + EXTENSION_DONT_OPEN)); targetseg = blkno / ((BlockNumber) RELSEG_SIZE); @@ -1213,6 +1213,10 @@ _mdfd_getseg(SMgrRelation reln, ForkNumber forknum, BlockNumber blkno, return v; } + /* The caller only wants the segment if we already had it open. */ + if (behavior & EXTENSION_DONT_OPEN) + return NULL; + /* * The target segment is not yet open. Iterate over all the segments * between the last opened and the target segment. This way missing diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c index 2c7a2b2857..a477f70f0e 100644 --- a/src/backend/storage/smgr/smgr.c +++ b/src/backend/storage/smgr/smgr.c @@ -41,7 +41,6 @@ typedef struct f_smgr { void (*smgr_init) (void); /* may be NULL */ void (*smgr_shutdown) (void); /* may be NULL */ - void (*smgr_release) (void); /* may be NULL */ void (*smgr_open) (SMgrRelation reln); void (*smgr_close) (SMgrRelation reln, ForkNumber forknum); void (*smgr_create) (SMgrRelation reln, ForkNumber forknum, @@ -70,7 +69,6 @@ static const f_smgr smgrsw[] = { { .smgr_init = mdinit, .smgr_shutdown = NULL, - .smgr_release = mdrelease, .smgr_open = mdopen, .smgr_close = mdclose, .smgr_create = mdcreate, @@ -281,6 +279,42 @@ smgrclose(SMgrRelation reln) *owner = NULL; } +/* + * smgrrelease() -- Release all resources used by this object. + * + * The object remains valid. + */ +void +smgrrelease(SMgrRelation reln) +{ + for (ForkNumber forknum = 0; forknum <= MAX_FORKNUM; forknum++) + { + smgrsw[reln->smgr_which].smgr_close(reln, forknum); + reln->smgr_cached_nblocks[forknum] = InvalidBlockNumber; + } +} + +/* + * smgrreleaseall() -- Release resources used by all objects. + * + * This is called for PROCSIGNAL_BARRIER_SMGRRELEASE. + */ +void +smgrreleaseall(void) +{ + HASH_SEQ_STATUS status; + SMgrRelation reln; + + /* Nothing to do if hashtable not set up */ + if (SMgrRelationHash == NULL) + return; + + hash_seq_init(&status, SMgrRelationHash); + + while ((reln = (SMgrRelation) hash_seq_search(&status)) != NULL) + smgrrelease(reln); +} + /* * smgrcloseall() -- Close all existing SMgrRelation objects. */ @@ -698,11 +732,6 @@ AtEOXact_SMgr(void) bool ProcessBarrierSmgrRelease(void) { - for (int i = 0; i < NSmgr; i++) - { - if (smgrsw[i].smgr_release) - smgrsw[i].smgr_release(); - } - + smgrreleaseall(); return true; } diff --git a/src/include/storage/md.h b/src/include/storage/md.h index 6e46d8d96a..ffffa40db7 100644 --- a/src/include/storage/md.h +++ b/src/include/storage/md.h @@ -23,7 +23,6 @@ extern void mdinit(void); extern void mdopen(SMgrRelation reln); extern void mdclose(SMgrRelation reln, ForkNumber forknum); -extern void mdrelease(void); extern void mdcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo); extern bool mdexists(SMgrRelation reln, ForkNumber forknum); extern void mdunlink(RelFileNodeBackend rnode, ForkNumber forknum, bool isRedo); diff --git a/src/include/storage/smgr.h b/src/include/storage/smgr.h index 8e3ef92cda..6b63c60fbd 100644 --- a/src/include/storage/smgr.h +++ b/src/include/storage/smgr.h @@ -85,6 +85,8 @@ extern void smgrclearowner(SMgrRelation *owner, SMgrRelation reln); extern void smgrclose(SMgrRelation reln); extern void smgrcloseall(void); extern void smgrclosenode(RelFileNodeBackend rnode); +extern void smgrrelease(SMgrRelation reln); +extern void smgrreleaseall(void); extern void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo); extern void smgrdosyncall(SMgrRelation *rels, int nrels); extern void smgrdounlinkall(SMgrRelation *rels, int nrels, bool isRedo); From e2f65f42555ff531c6d7c8f151526b4ef7c016f8 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Sat, 7 May 2022 15:19:52 +1200 Subject: [PATCH 612/772] Fix old-fd issues using global barriers everywhere. Commits 4eb21763 and b74e94dc introduced a way to force every backend to close all relation files, to fix an ancient Windows-only bug. This commit extends that behavior to all operating systems and adds a couple of extra barrier points, to fix a totally different class of bug: the reuse of relfilenodes in scenarios that have no other kind of cache invalidation to prevent file descriptor mix-ups. In all releases, data corruption could occur when you moved a database to another tablespace and then back again. Despite that, no back-patch for now as the infrastructure required is too new and invasive. In master only, since commit aa010514, it could also happen when using CREATE DATABASE with a user-supplied OID or via pg_upgrade. Author: Andres Freund Reviewed-by: Robert Haas Reviewed-by: Thomas Munro Discussion: https://postgr.es/m/20220209220004.kb3dgtn2x2k2gtdm%40alap3.anarazel.de --- src/backend/commands/dbcommands.c | 9 +- src/backend/commands/tablespace.c | 11 +- src/include/pg_config_manual.h | 11 - src/test/recovery/Makefile | 2 +- src/test/recovery/t/032_relfilenode_reuse.pl | 233 +++++++++++++++++++ 5 files changed, 241 insertions(+), 25 deletions(-) create mode 100644 src/test/recovery/t/032_relfilenode_reuse.pl diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 9d0f83cde3..6da58437c5 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -1687,10 +1687,8 @@ dropdb(const char *dbname, bool missing_ok, bool force) */ RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | CHECKPOINT_WAIT); -#if defined(USE_BARRIER_SMGRRELEASE) /* Close all smgr fds in all backends. */ WaitForProcSignalBarrier(EmitProcSignalBarrier(PROCSIGNAL_BARRIER_SMGRRELEASE)); -#endif /* * Remove all tablespace subdirs belonging to the database. @@ -1940,10 +1938,8 @@ movedb(const char *dbname, const char *tblspcname) RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | CHECKPOINT_WAIT | CHECKPOINT_FLUSH_ALL); -#if defined(USE_BARRIER_SMGRRELEASE) /* Close all smgr fds in all backends. */ WaitForProcSignalBarrier(EmitProcSignalBarrier(PROCSIGNAL_BARRIER_SMGRRELEASE)); -#endif /* * Now drop all buffers holding data of the target database; they should @@ -3054,6 +3050,9 @@ dbase_redo(XLogReaderState *record) */ FlushDatabaseBuffers(xlrec->src_db_id); + /* Close all sgmr fds in all backends. */ + WaitForProcSignalBarrier(EmitProcSignalBarrier(PROCSIGNAL_BARRIER_SMGRRELEASE)); + /* * Copy this subdirectory to the new location * @@ -3111,10 +3110,8 @@ dbase_redo(XLogReaderState *record) /* Clean out the xlog relcache too */ XLogDropDatabase(xlrec->db_id); -#if defined(USE_BARRIER_SMGRRELEASE) /* Close all sgmr fds in all backends. */ WaitForProcSignalBarrier(EmitProcSignalBarrier(PROCSIGNAL_BARRIER_SMGRRELEASE)); -#endif for (i = 0; i < xlrec->ntablespaces; i++) { diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c index 40514ab550..822d65287e 100644 --- a/src/backend/commands/tablespace.c +++ b/src/backend/commands/tablespace.c @@ -548,11 +548,10 @@ DropTableSpace(DropTableSpaceStmt *stmt) * use a global barrier to ask all backends to close all files, and * wait until they're finished. */ -#if defined(USE_BARRIER_SMGRRELEASE) LWLockRelease(TablespaceCreateLock); WaitForProcSignalBarrier(EmitProcSignalBarrier(PROCSIGNAL_BARRIER_SMGRRELEASE)); LWLockAcquire(TablespaceCreateLock, LW_EXCLUSIVE); -#endif + /* And now try again. */ if (!destroy_tablespace_directories(tablespaceoid, false)) { @@ -1574,6 +1573,9 @@ tblspc_redo(XLogReaderState *record) { xl_tblspc_drop_rec *xlrec = (xl_tblspc_drop_rec *) XLogRecGetData(record); + /* Close all smgr fds in all backends. */ + WaitForProcSignalBarrier(EmitProcSignalBarrier(PROCSIGNAL_BARRIER_SMGRRELEASE)); + /* * If we issued a WAL record for a drop tablespace it implies that * there were no files in it at all when the DROP was done. That means @@ -1591,11 +1593,6 @@ tblspc_redo(XLogReaderState *record) */ if (!destroy_tablespace_directories(xlrec->ts_id, true)) { -#if defined(USE_BARRIER_SMGRRELEASE) - /* Close all smgr fds in all backends. */ - WaitForProcSignalBarrier(EmitProcSignalBarrier(PROCSIGNAL_BARRIER_SMGRRELEASE)); -#endif - ResolveRecoveryConflictWithTablespace(xlrec->ts_id); /* diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h index 84ce5a4a5d..8d2e3e3a57 100644 --- a/src/include/pg_config_manual.h +++ b/src/include/pg_config_manual.h @@ -152,17 +152,6 @@ #define EXEC_BACKEND #endif -/* - * If USE_BARRIER_SMGRRELEASE is defined, certain code paths that unlink - * directories will ask other backends to close all smgr file descriptors. - * This is enabled on Windows, because otherwise unlinked but still open files - * can prevent rmdir(containing_directory) from succeeding. On other - * platforms, it can be defined to exercise those code paths. - */ -#if defined(WIN32) -#define USE_BARRIER_SMGRRELEASE -#endif - /* * Define this if your operating system supports link() */ diff --git a/src/test/recovery/Makefile b/src/test/recovery/Makefile index da5b9ff397..c47eee273b 100644 --- a/src/test/recovery/Makefile +++ b/src/test/recovery/Makefile @@ -9,7 +9,7 @@ # #------------------------------------------------------------------------- -EXTRA_INSTALL=contrib/test_decoding +EXTRA_INSTALL=contrib/test_decoding contrib/pg_prewarm subdir = src/test/recovery top_builddir = ../../.. diff --git a/src/test/recovery/t/032_relfilenode_reuse.pl b/src/test/recovery/t/032_relfilenode_reuse.pl new file mode 100644 index 0000000000..22d8e85614 --- /dev/null +++ b/src/test/recovery/t/032_relfilenode_reuse.pl @@ -0,0 +1,233 @@ +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; +use File::Basename; + + +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); +$node_primary->init(allows_streaming => 1); +$node_primary->append_conf('postgresql.conf', q[ +allow_in_place_tablespaces = true +log_connections=on +# to avoid "repairing" corruption +full_page_writes=off +log_min_messages=debug2 +autovacuum_naptime=1s +shared_buffers=1MB +]); +$node_primary->start; + + +# Create streaming standby linking to primary +my $backup_name = 'my_backup'; +$node_primary->backup($backup_name); +my $node_standby = PostgreSQL::Test::Cluster->new('standby'); +$node_standby->init_from_backup($node_primary, $backup_name, + has_streaming => 1); +$node_standby->start; + +# To avoid hanging while expecting some specific input from a psql +# instance being driven by us, add a timeout high enough that it +# should never trigger even on very slow machines, unless something +# is really wrong. +my $psql_timeout = IPC::Run::timer(300); + +my %psql_primary = (stdin => '', stdout => '', stderr => ''); +$psql_primary{run} = IPC::Run::start( + [ 'psql', '-XA', '-f', '-', '-d', $node_primary->connstr('postgres') ], + '<', + \$psql_primary{stdin}, + '>', + \$psql_primary{stdout}, + '2>', + \$psql_primary{stderr}, + $psql_timeout); + +my %psql_standby = ('stdin' => '', 'stdout' => '', 'stderr' => ''); +$psql_standby{run} = IPC::Run::start( + [ 'psql', '-XA', '-f', '-', '-d', $node_standby->connstr('postgres') ], + '<', + \$psql_standby{stdin}, + '>', + \$psql_standby{stdout}, + '2>', + \$psql_standby{stderr}, + $psql_timeout); + + +# Create template database with a table that we'll update, to trigger dirty +# rows. Using a template database + preexisting rows makes it a bit easier to +# reproduce, because there's no cache invalidations generated. + +$node_primary->safe_psql('postgres', "CREATE DATABASE conflict_db_template OID = 50000;"); +$node_primary->safe_psql('conflict_db_template', q[ + CREATE TABLE large(id serial primary key, dataa text, datab text); + INSERT INTO large(dataa, datab) SELECT g.i::text, 1 FROM generate_series(1, 4000) g(i);]); +$node_primary->safe_psql('postgres', "CREATE DATABASE conflict_db TEMPLATE conflict_db_template OID = 50001;"); + +$node_primary->safe_psql('postgres', q[ + CREATE EXTENSION pg_prewarm; + CREATE TABLE replace_sb(data text); + INSERT INTO replace_sb(data) SELECT random()::text FROM generate_series(1, 15000);]); + +# Use longrunning transactions, so that AtEOXact_SMgr doesn't close files +send_query_and_wait( + \%psql_primary, + q[BEGIN;], + qr/BEGIN/m); +send_query_and_wait( + \%psql_standby, + q[BEGIN;], + qr/BEGIN/m); + +# Cause lots of dirty rows in shared_buffers +$node_primary->safe_psql('conflict_db', "UPDATE large SET datab = 1;"); + +# Now do a bunch of work in another database. That will end up needing to +# write back dirty data from the previous step, opening the relevant file +# descriptors +cause_eviction(\%psql_primary, \%psql_standby); + +# drop and recreate database +$node_primary->safe_psql('postgres', "DROP DATABASE conflict_db;"); +$node_primary->safe_psql('postgres', "CREATE DATABASE conflict_db TEMPLATE conflict_db_template OID = 50001;"); + +verify($node_primary, $node_standby, 1, + "initial contents as expected"); + +# Again cause lots of dirty rows in shared_buffers, but use a different update +# value so we can check everything is OK +$node_primary->safe_psql('conflict_db', "UPDATE large SET datab = 2;"); + +# Again cause a lot of IO. That'll again write back dirty data, but uses (XXX +# adjust after bugfix) the already opened file descriptor. +# FIXME +cause_eviction(\%psql_primary, \%psql_standby); + +verify($node_primary, $node_standby, 2, + "update to reused relfilenode (due to DB oid conflict) is not lost"); + + +$node_primary->safe_psql('conflict_db', "VACUUM FULL large;"); +$node_primary->safe_psql('conflict_db', "UPDATE large SET datab = 3;"); + +verify($node_primary, $node_standby, 3, + "restored contents as expected"); + +# Test for old filehandles after moving a database in / out of tablespace +$node_primary->safe_psql('postgres', q[CREATE TABLESPACE test_tablespace LOCATION '']); + +# cause dirty buffers +$node_primary->safe_psql('conflict_db', "UPDATE large SET datab = 4;"); +# cause files to be opened in backend in other database +cause_eviction(\%psql_primary, \%psql_standby); + +# move database back / forth +$node_primary->safe_psql('postgres', 'ALTER DATABASE conflict_db SET TABLESPACE test_tablespace'); +$node_primary->safe_psql('postgres', 'ALTER DATABASE conflict_db SET TABLESPACE pg_default'); + +# cause dirty buffers +$node_primary->safe_psql('conflict_db', "UPDATE large SET datab = 5;"); +cause_eviction(\%psql_primary, \%psql_standby); + +verify($node_primary, $node_standby, 5, + "post move contents as expected"); + +$node_primary->safe_psql('postgres', 'ALTER DATABASE conflict_db SET TABLESPACE test_tablespace'); + +$node_primary->safe_psql('conflict_db', "UPDATE large SET datab = 7;"); +cause_eviction(\%psql_primary, \%psql_standby); +$node_primary->safe_psql('conflict_db', "UPDATE large SET datab = 8;"); +$node_primary->safe_psql('postgres', 'DROP DATABASE conflict_db'); +$node_primary->safe_psql('postgres', 'DROP TABLESPACE test_tablespace'); + +$node_primary->safe_psql('postgres', 'REINDEX TABLE pg_database'); + + +# explicitly shut down psql instances gracefully - to avoid hangs +# or worse on windows +$psql_primary{stdin} .= "\\q\n"; +$psql_primary{run}->finish; +$psql_standby{stdin} .= "\\q\n"; +$psql_standby{run}->finish; + +$node_primary->stop(); +$node_standby->stop(); + +# Make sure that there weren't crashes during shutdown + +command_like([ 'pg_controldata', $node_primary->data_dir ], + qr/Database cluster state:\s+shut down\n/, 'primary shut down ok'); +command_like([ 'pg_controldata', $node_standby->data_dir ], + qr/Database cluster state:\s+shut down in recovery\n/, 'standby shut down ok'); +done_testing(); + +sub verify +{ + my ($primary, $standby, $counter, $message) = @_; + + my $query = "SELECT datab, count(*) FROM large GROUP BY 1 ORDER BY 1 LIMIT 10"; + is($primary->safe_psql('conflict_db', $query), + "$counter|4000", + "primary: $message"); + + $primary->wait_for_catchup($standby); + is($standby->safe_psql('conflict_db', $query), + "$counter|4000", + "standby: $message"); +} + +sub cause_eviction +{ + my ($psql_primary, $psql_standby) = @_; + + send_query_and_wait( + $psql_primary, + q[SELECT SUM(pg_prewarm(oid)) warmed_buffers FROM pg_class WHERE pg_relation_filenode(oid) != 0;], + qr/warmed_buffers/m); + + send_query_and_wait( + $psql_standby, + q[SELECT SUM(pg_prewarm(oid)) warmed_buffers FROM pg_class WHERE pg_relation_filenode(oid) != 0;], + qr/warmed_buffers/m); +} + +# Send query, wait until string matches +sub send_query_and_wait +{ + my ($psql, $query, $untl) = @_; + my $ret; + + # send query + $$psql{stdin} .= $query; + $$psql{stdin} .= "\n"; + + # wait for query results + $$psql{run}->pump_nb(); + while (1) + { + last if $$psql{stdout} =~ /$untl/; + + if ($psql_timeout->is_expired) + { + BAIL_OUT("aborting wait: program timed out\n" + . "stream contents: >>$$psql{stdout}<<\n" + . "pattern searched for: $untl\n"); + return 0; + } + if (not $$psql{run}->pumpable()) + { + BAIL_OUT("aborting wait: program died\n" + . "stream contents: >>$$psql{stdout}<<\n" + . "pattern searched for: $untl\n"); + return 0; + } + $$psql{run}->pump(); + } + + $$psql{stdout} = ''; + + return 1; +} From ad76c9708bd1a333c28e7be2178e34b745fb23d1 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Sat, 7 May 2022 00:33:15 -0700 Subject: [PATCH 613/772] Under has_wal_read_bug, skip contrib/bloom/t/001_wal.pl. Per buildfarm members snapper and kittiwake. Back-patch to v10 (all supported versions). Discussion: https://postgr.es/m/20220116210241.GC756210@rfd.leadboat.com --- contrib/bloom/t/001_wal.pl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/contrib/bloom/t/001_wal.pl b/contrib/bloom/t/001_wal.pl index 9416a64dbd..f7f16dc5fa 100644 --- a/contrib/bloom/t/001_wal.pl +++ b/contrib/bloom/t/001_wal.pl @@ -8,6 +8,13 @@ use PostgreSQL::Test::Utils; use Test::More; +if (PostgreSQL::Test::Utils::has_wal_read_bug) +{ + # We'd prefer to use Test::More->builder->todo_start, but the bug causes + # this test file to die(), not merely to fail. + plan skip_all => 'filesystem bug'; +} + my $node_primary; my $node_standby; From a22652ebbcb33a6a271cc69841ad61d971d7db30 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Sun, 8 May 2022 16:54:09 +1200 Subject: [PATCH 614/772] Fix race in 032_relfilenode_reuse.pl. Add wait_for_catchup() call to the test added by commit e2f65f42. Per slow build farm animal grison. Also fix a comment. Discussion: https://postgr.es/m/CA%2BhUKGLJ2Vy8hVQmnYotmTaEKZK0%3D-GcXgNAgcHzArZvtS4L_g%40mail.gmail.com --- src/test/recovery/t/032_relfilenode_reuse.pl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/test/recovery/t/032_relfilenode_reuse.pl b/src/test/recovery/t/032_relfilenode_reuse.pl index 22d8e85614..ac9340b7dd 100644 --- a/src/test/recovery/t/032_relfilenode_reuse.pl +++ b/src/test/recovery/t/032_relfilenode_reuse.pl @@ -72,6 +72,8 @@ CREATE TABLE replace_sb(data text); INSERT INTO replace_sb(data) SELECT random()::text FROM generate_series(1, 15000);]); +$node_primary->wait_for_catchup($node_standby); + # Use longrunning transactions, so that AtEOXact_SMgr doesn't close files send_query_and_wait( \%psql_primary, @@ -101,9 +103,9 @@ # value so we can check everything is OK $node_primary->safe_psql('conflict_db', "UPDATE large SET datab = 2;"); -# Again cause a lot of IO. That'll again write back dirty data, but uses (XXX -# adjust after bugfix) the already opened file descriptor. -# FIXME +# Again cause a lot of IO. That'll again write back dirty data, but uses newly +# opened file descriptors, so we don't confuse old files with new files despite +# recycling relfilenodes. cause_eviction(\%psql_primary, \%psql_standby); verify($node_primary, $node_standby, 2, From 7863ee4def653f2c2193cb0b0cf4a8f0f3ca6c56 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 9 May 2022 08:39:59 +0900 Subject: [PATCH 615/772] Fix control file update done in restartpoints still running after promotion If a cluster is promoted (aka the control file shows a state different than DB_IN_ARCHIVE_RECOVERY) while CreateRestartPoint() is still processing, this function could miss an update of the control file for "checkPoint" and "checkPointCopy" but still do the recycling and/or removal of the past WAL segments, assuming that the to-be-updated LSN values should be used as reference points for the cleanup. This causes a follow-up restart attempting crash recovery to fail with a PANIC on a missing checkpoint record if the end-of-recovery checkpoint triggered by the promotion did not complete while the cluster abruptly stopped or crashed before the completion of this checkpoint. The PANIC would be caused by the redo LSN referred in the control file as located in a segment already gone, recycled by the previous restartpoint with "checkPoint" out-of-sync in the control file. This commit fixes the update of the control file during restartpoints so as "checkPoint" and "checkPointCopy" are updated even if the cluster has been promoted while a restartpoint is running, to be on par with the set of WAL segments actually recycled in the end of CreateRestartPoint(). This problem exists in all the stable branches. However, commit 7ff23c6, by removing the last call of CreateCheckPoint() from the startup process, has made this bug much easier to reason about as concurrent checkpoints are not possible anymore. No backpatch is done yet, mostly out of caution from me as a point release is close by, but we need to think harder about the case of concurrent checkpoints at promotion if the bgwriter is not considered as running by the startup process in ~v14, so this change is done only on HEAD for the moment. Reported-by: Fujii Masao, Rui Zhao Author: Kyotaro Horiguchi Reviewed-by: Nathan Bossart, Michael Paquier Discussion: https://postgr.es/m/20220316.102444.2193181487576617583.horikyota.ntt@gmail.com --- src/backend/access/transam/xlog.c | 54 +++++++++++++++++++------------ 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 61cda56c6f..36852f2327 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -6921,6 +6921,9 @@ CreateRestartPoint(int flags) XLogSegNo _logSegNo; TimestampTz xtime; + /* Concurrent checkpoint/restartpoint cannot happen */ + Assert(!IsUnderPostmaster || MyBackendType == B_CHECKPOINTER); + /* Get a local copy of the last safe checkpoint record. */ SpinLockAcquire(&XLogCtl->info_lck); lastCheckPointRecPtr = XLogCtl->lastCheckPointRecPtr; @@ -7014,40 +7017,49 @@ CreateRestartPoint(int flags) PriorRedoPtr = ControlFile->checkPointCopy.redo; /* - * Update pg_control, using current time. Check that it still shows - * DB_IN_ARCHIVE_RECOVERY state and an older checkpoint, else do nothing; - * this is a quick hack to make sure nothing really bad happens if somehow - * we get here after the end-of-recovery checkpoint. + * Update pg_control, using current time. Check that it still shows an + * older checkpoint, else do nothing; this is a quick hack to make sure + * nothing really bad happens if somehow we get here after the + * end-of-recovery checkpoint. */ LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - if (ControlFile->state == DB_IN_ARCHIVE_RECOVERY && - ControlFile->checkPointCopy.redo < lastCheckPoint.redo) + if (ControlFile->checkPointCopy.redo < lastCheckPoint.redo) { + /* + * Update the checkpoint information. We do this even if the cluster + * does not show DB_IN_ARCHIVE_RECOVERY to match with the set of WAL + * segments recycled below. + */ ControlFile->checkPoint = lastCheckPointRecPtr; ControlFile->checkPointCopy = lastCheckPoint; /* - * Ensure minRecoveryPoint is past the checkpoint record. Normally, + * Ensure minRecoveryPoint is past the checkpoint record and update it + * if the control file still shows DB_IN_ARCHIVE_RECOVERY. Normally, * this will have happened already while writing out dirty buffers, * but not necessarily - e.g. because no buffers were dirtied. We do - * this because a backup performed in recovery uses minRecoveryPoint to - * determine which WAL files must be included in the backup, and the - * file (or files) containing the checkpoint record must be included, - * at a minimum. Note that for an ordinary restart of recovery there's - * no value in having the minimum recovery point any earlier than this - * anyway, because redo will begin just after the checkpoint record. + * this because a backup performed in recovery uses minRecoveryPoint + * to determine which WAL files must be included in the backup, and + * the file (or files) containing the checkpoint record must be + * included, at a minimum. Note that for an ordinary restart of + * recovery there's no value in having the minimum recovery point any + * earlier than this anyway, because redo will begin just after the + * checkpoint record. */ - if (ControlFile->minRecoveryPoint < lastCheckPointEndPtr) + if (ControlFile->state == DB_IN_ARCHIVE_RECOVERY) { - ControlFile->minRecoveryPoint = lastCheckPointEndPtr; - ControlFile->minRecoveryPointTLI = lastCheckPoint.ThisTimeLineID; + if (ControlFile->minRecoveryPoint < lastCheckPointEndPtr) + { + ControlFile->minRecoveryPoint = lastCheckPointEndPtr; + ControlFile->minRecoveryPointTLI = lastCheckPoint.ThisTimeLineID; - /* update local copy */ - LocalMinRecoveryPoint = ControlFile->minRecoveryPoint; - LocalMinRecoveryPointTLI = ControlFile->minRecoveryPointTLI; + /* update local copy */ + LocalMinRecoveryPoint = ControlFile->minRecoveryPoint; + LocalMinRecoveryPointTLI = ControlFile->minRecoveryPointTLI; + } + if (flags & CHECKPOINT_IS_SHUTDOWN) + ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY; } - if (flags & CHECKPOINT_IS_SHUTDOWN) - ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY; UpdateControlFile(); } LWLockRelease(ControlFileLock); From f45f8b7ff3fe6c8b8139e177bb3fec7629ef9f05 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 9 May 2022 07:17:08 +0200 Subject: [PATCH 616/772] Add missing source files to nls.mk --- src/bin/pg_amcheck/nls.mk | 1 + src/bin/pg_basebackup/nls.mk | 1 + src/bin/pg_checksums/nls.mk | 4 +++- src/bin/pg_dump/nls.mk | 3 ++- src/bin/pg_test_fsync/nls.mk | 5 +++-- src/bin/scripts/nls.mk | 4 +++- 6 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/bin/pg_amcheck/nls.mk b/src/bin/pg_amcheck/nls.mk index f5658efc0e..f73d2d377e 100644 --- a/src/bin/pg_amcheck/nls.mk +++ b/src/bin/pg_amcheck/nls.mk @@ -5,6 +5,7 @@ GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ pg_amcheck.c \ ../../fe_utils/cancel.c \ ../../fe_utils/connect_utils.c \ + ../../fe_utils/option_utils.c \ ../../fe_utils/query_utils.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \ log_no_match diff --git a/src/bin/pg_basebackup/nls.mk b/src/bin/pg_basebackup/nls.mk index 298a6e02f0..ec7393d321 100644 --- a/src/bin/pg_basebackup/nls.mk +++ b/src/bin/pg_basebackup/nls.mk @@ -17,6 +17,7 @@ GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ ../../common/compression.c \ ../../common/fe_memutils.c \ ../../common/file_utils.c \ + ../../fe_utils/option_utils.c \ ../../fe_utils/recovery_gen.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt tar_set_error GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/pg_checksums/nls.mk b/src/bin/pg_checksums/nls.mk index a7a9423a53..5d8fd7e7cc 100644 --- a/src/bin/pg_checksums/nls.mk +++ b/src/bin/pg_checksums/nls.mk @@ -1,6 +1,8 @@ # src/bin/pg_checksums/nls.mk CATALOG_NAME = pg_checksums AVAIL_LANGUAGES = cs de el es fr ja ko ru sv tr uk zh_CN -GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_checksums.c +GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ + pg_checksums.c \ + ../../fe_utils/option_utils.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/pg_dump/nls.mk b/src/bin/pg_dump/nls.mk index 220d1ec75f..dc7360db48 100644 --- a/src/bin/pg_dump/nls.mk +++ b/src/bin/pg_dump/nls.mk @@ -9,7 +9,8 @@ GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ pg_restore.c pg_dumpall.c \ parallel.c parallel.h pg_backup_utils.c pg_backup_utils.h \ ../../common/exec.c ../../common/fe_memutils.c \ - ../../common/wait_error.c + ../../common/wait_error.c \ + ../../fe_utils/option_utils.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \ simple_prompt \ ExecuteSqlCommand:3 warn_or_exit_horribly:2 diff --git a/src/bin/pg_test_fsync/nls.mk b/src/bin/pg_test_fsync/nls.mk index 3449f1b7af..4b4d33b95a 100644 --- a/src/bin/pg_test_fsync/nls.mk +++ b/src/bin/pg_test_fsync/nls.mk @@ -1,5 +1,6 @@ # src/bin/pg_test_fsync/nls.mk CATALOG_NAME = pg_test_fsync AVAIL_LANGUAGES = cs de el es fr ja ko pl ru sv tr uk vi zh_CN -GETTEXT_FILES = pg_test_fsync.c -GETTEXT_TRIGGERS = die +GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_test_fsync.c +GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) die +GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/scripts/nls.mk b/src/bin/scripts/nls.mk index 3f9636cf8f..86063f3759 100644 --- a/src/bin/scripts/nls.mk +++ b/src/bin/scripts/nls.mk @@ -9,7 +9,9 @@ GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ common.c \ ../../fe_utils/parallel_slot.c \ ../../fe_utils/cancel.c ../../fe_utils/print.c \ - ../../fe_utils/connect_utils.c ../../fe_utils/query_utils.c \ + ../../fe_utils/connect_utils.c \ + ../../fe_utils/option_utils.c \ + ../../fe_utils/query_utils.c \ ../../common/fe_memutils.c ../../common/username.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt yesno_prompt GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) From a117cebd638dd02e5c2e791c25e43745f233111b Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Mon, 9 May 2022 08:35:08 -0700 Subject: [PATCH 617/772] Make relation-enumerating operations be security-restricted operations. When a feature enumerates relations and runs functions associated with all found relations, the feature's user shall not need to trust every user having permission to create objects. BRIN-specific functionality in autovacuum neglected to account for this, as did pg_amcheck and CLUSTER. An attacker having permission to create non-temp objects in at least one schema could execute arbitrary SQL functions under the identity of the bootstrap superuser. CREATE INDEX (not a relation-enumerating operation) and REINDEX protected themselves too late. This change extends to the non-enumerating amcheck interface. Back-patch to v10 (all supported versions). Sergey Shinderuk, reviewed (in earlier versions) by Alexander Lakhin. Reported by Alexander Lakhin. Security: CVE-2022-1552 --- contrib/amcheck/expected/check_btree.out | 23 ++++++ contrib/amcheck/sql/check_btree.sql | 21 +++++ contrib/amcheck/verify_nbtree.c | 27 +++++++ src/backend/access/brin/brin.c | 29 ++++++- src/backend/catalog/index.c | 65 ++++++++++++---- src/backend/commands/cluster.c | 37 ++++++--- src/backend/commands/indexcmds.c | 98 ++++++++++++++++++++---- src/backend/utils/init/miscinit.c | 24 +++--- src/test/regress/expected/privileges.out | 55 +++++++++++++ src/test/regress/sql/privileges.sql | 47 ++++++++++++ 10 files changed, 378 insertions(+), 48 deletions(-) diff --git a/contrib/amcheck/expected/check_btree.out b/contrib/amcheck/expected/check_btree.out index 5a3f1ef737..38791bbc1f 100644 --- a/contrib/amcheck/expected/check_btree.out +++ b/contrib/amcheck/expected/check_btree.out @@ -177,11 +177,34 @@ SELECT bt_index_check('toasty', true); (1 row) +-- +-- Check that index expressions and predicates are run as the table's owner +-- +TRUNCATE bttest_a; +INSERT INTO bttest_a SELECT * FROM generate_series(1, 1000); +ALTER TABLE bttest_a OWNER TO regress_bttest_role; +-- A dummy index function checking current_user +CREATE FUNCTION ifun(int8) RETURNS int8 AS $$ +BEGIN + ASSERT current_user = 'regress_bttest_role', + format('ifun(%s) called by %s', $1, current_user); + RETURN $1; +END; +$$ LANGUAGE plpgsql IMMUTABLE; +CREATE INDEX bttest_a_expr_idx ON bttest_a ((ifun(id) + ifun(0))) + WHERE ifun(id + 10) > ifun(10); +SELECT bt_index_check('bttest_a_expr_idx', true); + bt_index_check +---------------- + +(1 row) + -- cleanup DROP TABLE bttest_a; DROP TABLE bttest_b; DROP TABLE bttest_multi; DROP TABLE delete_test_table; DROP TABLE toast_bug; +DROP FUNCTION ifun(int8); DROP OWNED BY regress_bttest_role; -- permissions DROP ROLE regress_bttest_role; diff --git a/contrib/amcheck/sql/check_btree.sql b/contrib/amcheck/sql/check_btree.sql index 97a3e1a20d..033c04b4d0 100644 --- a/contrib/amcheck/sql/check_btree.sql +++ b/contrib/amcheck/sql/check_btree.sql @@ -115,11 +115,32 @@ INSERT INTO toast_bug SELECT repeat('a', 2200); -- Should not get false positive report of corruption: SELECT bt_index_check('toasty', true); +-- +-- Check that index expressions and predicates are run as the table's owner +-- +TRUNCATE bttest_a; +INSERT INTO bttest_a SELECT * FROM generate_series(1, 1000); +ALTER TABLE bttest_a OWNER TO regress_bttest_role; +-- A dummy index function checking current_user +CREATE FUNCTION ifun(int8) RETURNS int8 AS $$ +BEGIN + ASSERT current_user = 'regress_bttest_role', + format('ifun(%s) called by %s', $1, current_user); + RETURN $1; +END; +$$ LANGUAGE plpgsql IMMUTABLE; + +CREATE INDEX bttest_a_expr_idx ON bttest_a ((ifun(id) + ifun(0))) + WHERE ifun(id + 10) > ifun(10); + +SELECT bt_index_check('bttest_a_expr_idx', true); + -- cleanup DROP TABLE bttest_a; DROP TABLE bttest_b; DROP TABLE bttest_multi; DROP TABLE delete_test_table; DROP TABLE toast_bug; +DROP FUNCTION ifun(int8); DROP OWNED BY regress_bttest_role; -- permissions DROP ROLE regress_bttest_role; diff --git a/contrib/amcheck/verify_nbtree.c b/contrib/amcheck/verify_nbtree.c index 70278c4f93..a8791000f8 100644 --- a/contrib/amcheck/verify_nbtree.c +++ b/contrib/amcheck/verify_nbtree.c @@ -249,6 +249,9 @@ bt_index_check_internal(Oid indrelid, bool parentcheck, bool heapallindexed, Relation indrel; Relation heaprel; LOCKMODE lockmode; + Oid save_userid; + int save_sec_context; + int save_nestlevel; if (parentcheck) lockmode = ShareLock; @@ -265,9 +268,27 @@ bt_index_check_internal(Oid indrelid, bool parentcheck, bool heapallindexed, */ heapid = IndexGetRelation(indrelid, true); if (OidIsValid(heapid)) + { heaprel = table_open(heapid, lockmode); + + /* + * Switch to the table owner's userid, so that any index functions are + * run as that user. Also lock down security-restricted operations + * and arrange to make GUC variable changes local to this command. + */ + GetUserIdAndSecContext(&save_userid, &save_sec_context); + SetUserIdAndSecContext(heaprel->rd_rel->relowner, + save_sec_context | SECURITY_RESTRICTED_OPERATION); + save_nestlevel = NewGUCNestLevel(); + } else + { heaprel = NULL; + /* for "gcc -Og" https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78394 */ + save_userid = InvalidOid; + save_sec_context = -1; + save_nestlevel = -1; + } /* * Open the target index relations separately (like relation_openrv(), but @@ -326,6 +347,12 @@ bt_index_check_internal(Oid indrelid, bool parentcheck, bool heapallindexed, heapallindexed, rootdescend); } + /* Roll back any GUC changes executed by index functions */ + AtEOXact_GUC(false, save_nestlevel); + + /* Restore userid and security context */ + SetUserIdAndSecContext(save_userid, save_sec_context); + /* * Release locks early. That's ok here because nothing in the called * routines will trigger shared cache invalidations to be sent, so we can diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c index 4366010768..52f171772d 100644 --- a/src/backend/access/brin/brin.c +++ b/src/backend/access/brin/brin.c @@ -1008,6 +1008,9 @@ brin_summarize_range(PG_FUNCTION_ARGS) Oid heapoid; Relation indexRel; Relation heapRel; + Oid save_userid; + int save_sec_context; + int save_nestlevel; double numSummarized = 0; if (RecoveryInProgress()) @@ -1031,7 +1034,22 @@ brin_summarize_range(PG_FUNCTION_ARGS) */ heapoid = IndexGetRelation(indexoid, true); if (OidIsValid(heapoid)) + { heapRel = table_open(heapoid, ShareUpdateExclusiveLock); + + /* + * Autovacuum calls us. For its benefit, switch to the table owner's + * userid, so that any index functions are run as that user. Also + * lock down security-restricted operations and arrange to make GUC + * variable changes local to this command. This is harmless, albeit + * unnecessary, when called from SQL, because we fail shortly if the + * user does not own the index. + */ + GetUserIdAndSecContext(&save_userid, &save_sec_context); + SetUserIdAndSecContext(heapRel->rd_rel->relowner, + save_sec_context | SECURITY_RESTRICTED_OPERATION); + save_nestlevel = NewGUCNestLevel(); + } else heapRel = NULL; @@ -1046,7 +1064,7 @@ brin_summarize_range(PG_FUNCTION_ARGS) RelationGetRelationName(indexRel)))); /* User must own the index (comparable to privileges needed for VACUUM) */ - if (!pg_class_ownercheck(indexoid, GetUserId())) + if (heapRel != NULL && !pg_class_ownercheck(indexoid, save_userid)) aclcheck_error(ACLCHECK_NOT_OWNER, OBJECT_INDEX, RelationGetRelationName(indexRel)); @@ -1064,6 +1082,12 @@ brin_summarize_range(PG_FUNCTION_ARGS) /* OK, do it */ brinsummarize(indexRel, heapRel, heapBlk, true, &numSummarized, NULL); + /* Roll back any GUC changes executed by index functions */ + AtEOXact_GUC(false, save_nestlevel); + + /* Restore userid and security context */ + SetUserIdAndSecContext(save_userid, save_sec_context); + relation_close(indexRel, ShareUpdateExclusiveLock); relation_close(heapRel, ShareUpdateExclusiveLock); @@ -1102,6 +1126,9 @@ brin_desummarize_range(PG_FUNCTION_ARGS) * passed indexoid isn't an index then IndexGetRelation() will fail. * Rather than emitting a not-very-helpful error message, postpone * complaining, expecting that the is-it-an-index test below will fail. + * + * Unlike brin_summarize_range(), autovacuum never calls this. Hence, we + * don't switch userid. */ heapoid = IndexGetRelation(indexoid, true); if (OidIsValid(heapoid)) diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index fd389c28d8..7539742c78 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -1445,6 +1445,9 @@ index_concurrently_build(Oid heapRelationId, Oid indexRelationId) { Relation heapRel; + Oid save_userid; + int save_sec_context; + int save_nestlevel; Relation indexRelation; IndexInfo *indexInfo; @@ -1454,7 +1457,16 @@ index_concurrently_build(Oid heapRelationId, /* Open and lock the parent heap relation */ heapRel = table_open(heapRelationId, ShareUpdateExclusiveLock); - /* And the target index relation */ + /* + * Switch to the table owner's userid, so that any index functions are run + * as that user. Also lock down security-restricted operations and + * arrange to make GUC variable changes local to this command. + */ + GetUserIdAndSecContext(&save_userid, &save_sec_context); + SetUserIdAndSecContext(heapRel->rd_rel->relowner, + save_sec_context | SECURITY_RESTRICTED_OPERATION); + save_nestlevel = NewGUCNestLevel(); + indexRelation = index_open(indexRelationId, RowExclusiveLock); /* @@ -1470,6 +1482,12 @@ index_concurrently_build(Oid heapRelationId, /* Now build the index */ index_build(heapRel, indexRelation, indexInfo, false, true); + /* Roll back any GUC changes executed by index functions */ + AtEOXact_GUC(false, save_nestlevel); + + /* Restore userid and security context */ + SetUserIdAndSecContext(save_userid, save_sec_context); + /* Close both the relations, but keep the locks */ table_close(heapRel, NoLock); index_close(indexRelation, NoLock); @@ -3299,7 +3317,17 @@ validate_index(Oid heapId, Oid indexId, Snapshot snapshot) /* Open and lock the parent heap relation */ heapRelation = table_open(heapId, ShareUpdateExclusiveLock); - /* And the target index relation */ + + /* + * Switch to the table owner's userid, so that any index functions are run + * as that user. Also lock down security-restricted operations and + * arrange to make GUC variable changes local to this command. + */ + GetUserIdAndSecContext(&save_userid, &save_sec_context); + SetUserIdAndSecContext(heapRelation->rd_rel->relowner, + save_sec_context | SECURITY_RESTRICTED_OPERATION); + save_nestlevel = NewGUCNestLevel(); + indexRelation = index_open(indexId, RowExclusiveLock); /* @@ -3312,16 +3340,6 @@ validate_index(Oid heapId, Oid indexId, Snapshot snapshot) /* mark build is concurrent just for consistency */ indexInfo->ii_Concurrent = true; - /* - * Switch to the table owner's userid, so that any index functions are run - * as that user. Also lock down security-restricted operations and - * arrange to make GUC variable changes local to this command. - */ - GetUserIdAndSecContext(&save_userid, &save_sec_context); - SetUserIdAndSecContext(heapRelation->rd_rel->relowner, - save_sec_context | SECURITY_RESTRICTED_OPERATION); - save_nestlevel = NewGUCNestLevel(); - /* * Scan the index and gather up all the TIDs into a tuplesort object. */ @@ -3530,6 +3548,9 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence, Relation iRel, heapRelation; Oid heapId; + Oid save_userid; + int save_sec_context; + int save_nestlevel; IndexInfo *indexInfo; volatile bool skipped_constraint = false; PGRUsage ru0; @@ -3557,6 +3578,16 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence, if (!heapRelation) return; + /* + * Switch to the table owner's userid, so that any index functions are run + * as that user. Also lock down security-restricted operations and + * arrange to make GUC variable changes local to this command. + */ + GetUserIdAndSecContext(&save_userid, &save_sec_context); + SetUserIdAndSecContext(heapRelation->rd_rel->relowner, + save_sec_context | SECURITY_RESTRICTED_OPERATION); + save_nestlevel = NewGUCNestLevel(); + if (progress) { const int progress_cols[] = { @@ -3775,12 +3806,18 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence, errdetail_internal("%s", pg_rusage_show(&ru0)))); - if (progress) - pgstat_progress_end_command(); + /* Roll back any GUC changes executed by index functions */ + AtEOXact_GUC(false, save_nestlevel); + + /* Restore userid and security context */ + SetUserIdAndSecContext(save_userid, save_sec_context); /* Close rels, but keep locks */ index_close(iRel, NoLock); table_close(heapRelation, NoLock); + + if (progress) + pgstat_progress_end_command(); } /* diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index d8a6d43d95..cea2c8be80 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -310,6 +310,9 @@ void cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) { Relation OldHeap; + Oid save_userid; + int save_sec_context; + int save_nestlevel; bool verbose = ((params->options & CLUOPT_VERBOSE) != 0); bool recheck = ((params->options & CLUOPT_RECHECK) != 0); @@ -339,6 +342,16 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) return; } + /* + * Switch to the table owner's userid, so that any index functions are run + * as that user. Also lock down security-restricted operations and + * arrange to make GUC variable changes local to this command. + */ + GetUserIdAndSecContext(&save_userid, &save_sec_context); + SetUserIdAndSecContext(OldHeap->rd_rel->relowner, + save_sec_context | SECURITY_RESTRICTED_OPERATION); + save_nestlevel = NewGUCNestLevel(); + /* * Since we may open a new transaction for each relation, we have to check * that the relation still is what we think it is. @@ -350,11 +363,10 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) if (recheck) { /* Check that the user still owns the relation */ - if (!pg_class_ownercheck(tableOid, GetUserId())) + if (!pg_class_ownercheck(tableOid, save_userid)) { relation_close(OldHeap, AccessExclusiveLock); - pgstat_progress_end_command(); - return; + goto out; } /* @@ -369,8 +381,7 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) if (RELATION_IS_OTHER_TEMP(OldHeap)) { relation_close(OldHeap, AccessExclusiveLock); - pgstat_progress_end_command(); - return; + goto out; } if (OidIsValid(indexOid)) @@ -381,8 +392,7 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(indexOid))) { relation_close(OldHeap, AccessExclusiveLock); - pgstat_progress_end_command(); - return; + goto out; } /* @@ -393,8 +403,7 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) !get_index_isclustered(indexOid)) { relation_close(OldHeap, AccessExclusiveLock); - pgstat_progress_end_command(); - return; + goto out; } } } @@ -447,8 +456,7 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) !RelationIsPopulated(OldHeap)) { relation_close(OldHeap, AccessExclusiveLock); - pgstat_progress_end_command(); - return; + goto out; } Assert(OldHeap->rd_rel->relkind == RELKIND_RELATION || @@ -468,6 +476,13 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) /* NB: rebuild_relation does table_close() on OldHeap */ +out: + /* Roll back any GUC changes executed by index functions */ + AtEOXact_GUC(false, save_nestlevel); + + /* Restore userid and security context */ + SetUserIdAndSecContext(save_userid, save_sec_context); + pgstat_progress_end_command(); } diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index cd30f15eba..eac13ac0b7 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -547,21 +547,22 @@ DefineIndex(Oid relationId, LOCKTAG heaplocktag; LOCKMODE lockmode; Snapshot snapshot; - int save_nestlevel = -1; + Oid root_save_userid; + int root_save_sec_context; + int root_save_nestlevel; int i; + root_save_nestlevel = NewGUCNestLevel(); + /* * Some callers need us to run with an empty default_tablespace; this is a * necessary hack to be able to reproduce catalog state accurately when * recreating indexes after table-rewriting ALTER TABLE. */ if (stmt->reset_default_tblspc) - { - save_nestlevel = NewGUCNestLevel(); (void) set_config_option("default_tablespace", "", PGC_USERSET, PGC_S_SESSION, GUC_ACTION_SAVE, true, 0, false); - } /* * Force non-concurrent build on temporary relations, even if CONCURRENTLY @@ -640,6 +641,15 @@ DefineIndex(Oid relationId, lockmode = concurrent ? ShareUpdateExclusiveLock : ShareLock; rel = table_open(relationId, lockmode); + /* + * Switch to the table owner's userid, so that any index functions are run + * as that user. Also lock down security-restricted operations. We + * already arranged to make GUC variable changes local to this command. + */ + GetUserIdAndSecContext(&root_save_userid, &root_save_sec_context); + SetUserIdAndSecContext(rel->rd_rel->relowner, + root_save_sec_context | SECURITY_RESTRICTED_OPERATION); + namespaceId = RelationGetNamespace(rel); /* Ensure that it makes sense to index this kind of relation */ @@ -715,7 +725,7 @@ DefineIndex(Oid relationId, { AclResult aclresult; - aclresult = pg_namespace_aclcheck(namespaceId, GetUserId(), + aclresult = pg_namespace_aclcheck(namespaceId, root_save_userid, ACL_CREATE); if (aclresult != ACLCHECK_OK) aclcheck_error(aclresult, OBJECT_SCHEMA, @@ -747,7 +757,7 @@ DefineIndex(Oid relationId, { AclResult aclresult; - aclresult = pg_tablespace_aclcheck(tablespaceId, GetUserId(), + aclresult = pg_tablespace_aclcheck(tablespaceId, root_save_userid, ACL_CREATE); if (aclresult != ACLCHECK_OK) aclcheck_error(aclresult, OBJECT_TABLESPACE, @@ -1138,15 +1148,17 @@ DefineIndex(Oid relationId, ObjectAddressSet(address, RelationRelationId, indexRelationId); - /* - * Revert to original default_tablespace. Must do this before any return - * from this function, but after index_create, so this is a good time. - */ - if (save_nestlevel >= 0) - AtEOXact_GUC(true, save_nestlevel); - if (!OidIsValid(indexRelationId)) { + /* + * Roll back any GUC changes executed by index functions. Also revert + * to original default_tablespace if we changed it above. + */ + AtEOXact_GUC(false, root_save_nestlevel); + + /* Restore userid and security context */ + SetUserIdAndSecContext(root_save_userid, root_save_sec_context); + table_close(rel, NoLock); /* If this is the top-level index, we're done */ @@ -1156,6 +1168,17 @@ DefineIndex(Oid relationId, return address; } + /* + * Roll back any GUC changes executed by index functions, and keep + * subsequent changes local to this command. It's barely possible that + * some index function changed a behavior-affecting GUC, e.g. xmloption, + * that affects subsequent steps. This improves bug-compatibility with + * older PostgreSQL versions. They did the AtEOXact_GUC() here for the + * purpose of clearing the above default_tablespace change. + */ + AtEOXact_GUC(false, root_save_nestlevel); + root_save_nestlevel = NewGUCNestLevel(); + /* Add any requested comment */ if (stmt->idxcomment != NULL) CreateComments(indexRelationId, RelationRelationId, 0, @@ -1202,6 +1225,9 @@ DefineIndex(Oid relationId, { Oid childRelid = part_oids[i]; Relation childrel; + Oid child_save_userid; + int child_save_sec_context; + int child_save_nestlevel; List *childidxs; ListCell *cell; AttrMap *attmap; @@ -1209,6 +1235,12 @@ DefineIndex(Oid relationId, childrel = table_open(childRelid, lockmode); + GetUserIdAndSecContext(&child_save_userid, + &child_save_sec_context); + SetUserIdAndSecContext(childrel->rd_rel->relowner, + child_save_sec_context | SECURITY_RESTRICTED_OPERATION); + child_save_nestlevel = NewGUCNestLevel(); + /* * Don't try to create indexes on foreign tables, though. Skip * those if a regular index, or fail if trying to create a @@ -1224,6 +1256,9 @@ DefineIndex(Oid relationId, errdetail("Table \"%s\" contains partitions that are foreign tables.", RelationGetRelationName(rel)))); + AtEOXact_GUC(false, child_save_nestlevel); + SetUserIdAndSecContext(child_save_userid, + child_save_sec_context); table_close(childrel, lockmode); continue; } @@ -1295,6 +1330,9 @@ DefineIndex(Oid relationId, } list_free(childidxs); + AtEOXact_GUC(false, child_save_nestlevel); + SetUserIdAndSecContext(child_save_userid, + child_save_sec_context); table_close(childrel, NoLock); /* @@ -1351,12 +1389,21 @@ DefineIndex(Oid relationId, if (found_whole_row) elog(ERROR, "cannot convert whole-row table reference"); + /* + * Recurse as the starting user ID. Callee will use that + * for permission checks, then switch again. + */ + Assert(GetUserId() == child_save_userid); + SetUserIdAndSecContext(root_save_userid, + root_save_sec_context); DefineIndex(childRelid, childStmt, InvalidOid, /* no predefined OID */ indexRelationId, /* this is our child */ createdConstraintId, is_alter_table, check_rights, check_not_in_use, skip_build, quiet); + SetUserIdAndSecContext(child_save_userid, + child_save_sec_context); } pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE, @@ -1393,12 +1440,17 @@ DefineIndex(Oid relationId, * Indexes on partitioned tables are not themselves built, so we're * done here. */ + AtEOXact_GUC(false, root_save_nestlevel); + SetUserIdAndSecContext(root_save_userid, root_save_sec_context); table_close(rel, NoLock); if (!OidIsValid(parentIndexId)) pgstat_progress_end_command(); return address; } + AtEOXact_GUC(false, root_save_nestlevel); + SetUserIdAndSecContext(root_save_userid, root_save_sec_context); + if (!concurrent) { /* Close the heap and we're done, in the non-concurrent case */ @@ -3524,6 +3576,9 @@ ReindexRelationConcurrently(Oid relationOid, ReindexParams *params) Oid newIndexId; Relation indexRel; Relation heapRel; + Oid save_userid; + int save_sec_context; + int save_nestlevel; Relation newIndexRel; LockRelId *lockrelid; Oid tablespaceid; @@ -3532,6 +3587,16 @@ ReindexRelationConcurrently(Oid relationOid, ReindexParams *params) heapRel = table_open(indexRel->rd_index->indrelid, ShareUpdateExclusiveLock); + /* + * Switch to the table owner's userid, so that any index functions are + * run as that user. Also lock down security-restricted operations + * and arrange to make GUC variable changes local to this command. + */ + GetUserIdAndSecContext(&save_userid, &save_sec_context); + SetUserIdAndSecContext(heapRel->rd_rel->relowner, + save_sec_context | SECURITY_RESTRICTED_OPERATION); + save_nestlevel = NewGUCNestLevel(); + /* determine safety of this index for set_indexsafe_procflags */ idx->safe = (indexRel->rd_indexprs == NIL && indexRel->rd_indpred == NIL); @@ -3607,6 +3672,13 @@ ReindexRelationConcurrently(Oid relationOid, ReindexParams *params) index_close(indexRel, NoLock); index_close(newIndexRel, NoLock); + + /* Roll back any GUC changes executed by index functions */ + AtEOXact_GUC(false, save_nestlevel); + + /* Restore userid and security context */ + SetUserIdAndSecContext(save_userid, save_sec_context); + table_close(heapRel, NoLock); } diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 30f0f19dd5..6ed584e114 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -567,15 +567,21 @@ GetAuthenticatedUserId(void) * with guc.c's internal state, so SET ROLE has to be disallowed. * * SECURITY_RESTRICTED_OPERATION indicates that we are inside an operation - * that does not wish to trust called user-defined functions at all. This - * bit prevents not only SET ROLE, but various other changes of session state - * that normally is unprotected but might possibly be used to subvert the - * calling session later. An example is replacing an existing prepared - * statement with new code, which will then be executed with the outer - * session's permissions when the prepared statement is next used. Since - * these restrictions are fairly draconian, we apply them only in contexts - * where the called functions are really supposed to be side-effect-free - * anyway, such as VACUUM/ANALYZE/REINDEX. + * that does not wish to trust called user-defined functions at all. The + * policy is to use this before operations, e.g. autovacuum and REINDEX, that + * enumerate relations of a database or schema and run functions associated + * with each found relation. The relation owner is the new user ID. Set this + * as soon as possible after locking the relation. Restore the old user ID as + * late as possible before closing the relation; restoring it shortly after + * close is also tolerable. If a command has both relation-enumerating and + * non-enumerating modes, e.g. ANALYZE, both modes set this bit. This bit + * prevents not only SET ROLE, but various other changes of session state that + * normally is unprotected but might possibly be used to subvert the calling + * session later. An example is replacing an existing prepared statement with + * new code, which will then be executed with the outer session's permissions + * when the prepared statement is next used. These restrictions are fairly + * draconian, but the functions called in relation-enumerating operations are + * really supposed to be side-effect-free anyway. * * SECURITY_NOFORCE_RLS indicates that we are inside an operation which should * ignore the FORCE ROW LEVEL SECURITY per-table indication. This is used to diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out index 14bc497c21..4a3709e315 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -1592,6 +1592,61 @@ SELECT has_table_privilege('regress_priv_user1', 'atest4', 'SELECT WITH GRANT OP -- security-restricted operations \c - CREATE ROLE regress_sro_user; +-- Check that index expressions and predicates are run as the table's owner +-- A dummy index function checking current_user +CREATE FUNCTION sro_ifun(int) RETURNS int AS $$ +BEGIN + -- Below we set the table's owner to regress_sro_user + ASSERT current_user = 'regress_sro_user', + format('sro_ifun(%s) called by %s', $1, current_user); + RETURN $1; +END; +$$ LANGUAGE plpgsql IMMUTABLE; +-- Create a table owned by regress_sro_user +CREATE TABLE sro_tab (a int); +ALTER TABLE sro_tab OWNER TO regress_sro_user; +INSERT INTO sro_tab VALUES (1), (2), (3); +-- Create an expression index with a predicate +CREATE INDEX sro_idx ON sro_tab ((sro_ifun(a) + sro_ifun(0))) + WHERE sro_ifun(a + 10) > sro_ifun(10); +DROP INDEX sro_idx; +-- Do the same concurrently +CREATE INDEX CONCURRENTLY sro_idx ON sro_tab ((sro_ifun(a) + sro_ifun(0))) + WHERE sro_ifun(a + 10) > sro_ifun(10); +-- REINDEX +REINDEX TABLE sro_tab; +REINDEX INDEX sro_idx; +REINDEX TABLE CONCURRENTLY sro_tab; +DROP INDEX sro_idx; +-- CLUSTER +CREATE INDEX sro_cluster_idx ON sro_tab ((sro_ifun(a) + sro_ifun(0))); +CLUSTER sro_tab USING sro_cluster_idx; +DROP INDEX sro_cluster_idx; +-- BRIN index +CREATE INDEX sro_brin ON sro_tab USING brin ((sro_ifun(a) + sro_ifun(0))); +SELECT brin_desummarize_range('sro_brin', 0); + brin_desummarize_range +------------------------ + +(1 row) + +SELECT brin_summarize_range('sro_brin', 0); + brin_summarize_range +---------------------- + 1 +(1 row) + +DROP TABLE sro_tab; +-- Check with a partitioned table +CREATE TABLE sro_ptab (a int) PARTITION BY RANGE (a); +ALTER TABLE sro_ptab OWNER TO regress_sro_user; +CREATE TABLE sro_part PARTITION OF sro_ptab FOR VALUES FROM (1) TO (10); +ALTER TABLE sro_part OWNER TO regress_sro_user; +INSERT INTO sro_ptab VALUES (1), (2), (3); +CREATE INDEX sro_pidx ON sro_ptab ((sro_ifun(a) + sro_ifun(0))) + WHERE sro_ifun(a + 10) > sro_ifun(10); +REINDEX TABLE sro_ptab; +REINDEX INDEX CONCURRENTLY sro_pidx; SET SESSION AUTHORIZATION regress_sro_user; CREATE FUNCTION unwanted_grant() RETURNS void LANGUAGE sql AS 'GRANT regress_priv_group2 TO regress_sro_user'; diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql index a26c0e17fc..55df7f3b32 100644 --- a/src/test/regress/sql/privileges.sql +++ b/src/test/regress/sql/privileges.sql @@ -1043,6 +1043,53 @@ SELECT has_table_privilege('regress_priv_user1', 'atest4', 'SELECT WITH GRANT OP \c - CREATE ROLE regress_sro_user; +-- Check that index expressions and predicates are run as the table's owner + +-- A dummy index function checking current_user +CREATE FUNCTION sro_ifun(int) RETURNS int AS $$ +BEGIN + -- Below we set the table's owner to regress_sro_user + ASSERT current_user = 'regress_sro_user', + format('sro_ifun(%s) called by %s', $1, current_user); + RETURN $1; +END; +$$ LANGUAGE plpgsql IMMUTABLE; +-- Create a table owned by regress_sro_user +CREATE TABLE sro_tab (a int); +ALTER TABLE sro_tab OWNER TO regress_sro_user; +INSERT INTO sro_tab VALUES (1), (2), (3); +-- Create an expression index with a predicate +CREATE INDEX sro_idx ON sro_tab ((sro_ifun(a) + sro_ifun(0))) + WHERE sro_ifun(a + 10) > sro_ifun(10); +DROP INDEX sro_idx; +-- Do the same concurrently +CREATE INDEX CONCURRENTLY sro_idx ON sro_tab ((sro_ifun(a) + sro_ifun(0))) + WHERE sro_ifun(a + 10) > sro_ifun(10); +-- REINDEX +REINDEX TABLE sro_tab; +REINDEX INDEX sro_idx; +REINDEX TABLE CONCURRENTLY sro_tab; +DROP INDEX sro_idx; +-- CLUSTER +CREATE INDEX sro_cluster_idx ON sro_tab ((sro_ifun(a) + sro_ifun(0))); +CLUSTER sro_tab USING sro_cluster_idx; +DROP INDEX sro_cluster_idx; +-- BRIN index +CREATE INDEX sro_brin ON sro_tab USING brin ((sro_ifun(a) + sro_ifun(0))); +SELECT brin_desummarize_range('sro_brin', 0); +SELECT brin_summarize_range('sro_brin', 0); +DROP TABLE sro_tab; +-- Check with a partitioned table +CREATE TABLE sro_ptab (a int) PARTITION BY RANGE (a); +ALTER TABLE sro_ptab OWNER TO regress_sro_user; +CREATE TABLE sro_part PARTITION OF sro_ptab FOR VALUES FROM (1) TO (10); +ALTER TABLE sro_part OWNER TO regress_sro_user; +INSERT INTO sro_ptab VALUES (1), (2), (3); +CREATE INDEX sro_pidx ON sro_ptab ((sro_ifun(a) + sro_ifun(0))) + WHERE sro_ifun(a + 10) > sro_ifun(10); +REINDEX TABLE sro_ptab; +REINDEX INDEX CONCURRENTLY sro_pidx; + SET SESSION AUTHORIZATION regress_sro_user; CREATE FUNCTION unwanted_grant() RETURNS void LANGUAGE sql AS 'GRANT regress_priv_group2 TO regress_sro_user'; From 0abc1a059e27c5a71a1a186c97d9c0af407469cc Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Mon, 9 May 2022 08:35:08 -0700 Subject: [PATCH 618/772] In REFRESH MATERIALIZED VIEW, set user ID before running user code. It intended to, but did not, achieve this. Adopt the new standard of setting user ID just after locking the relation. Back-patch to v10 (all supported versions). Reviewed by Simon Riggs. Reported by Alvaro Herrera. Security: CVE-2022-1552 --- src/backend/commands/matview.c | 30 +++++++++--------------- src/test/regress/expected/privileges.out | 16 +++++++++++++ src/test/regress/sql/privileges.sql | 17 ++++++++++++++ 3 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c index 9ab248d25e..52534f1827 100644 --- a/src/backend/commands/matview.c +++ b/src/backend/commands/matview.c @@ -167,6 +167,17 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, lockmode, 0, RangeVarCallbackOwnsTable, NULL); matviewRel = table_open(matviewOid, NoLock); + relowner = matviewRel->rd_rel->relowner; + + /* + * Switch to the owner's userid, so that any functions are run as that + * user. Also lock down security-restricted operations and arrange to + * make GUC variable changes local to this command. + */ + GetUserIdAndSecContext(&save_userid, &save_sec_context); + SetUserIdAndSecContext(relowner, + save_sec_context | SECURITY_RESTRICTED_OPERATION); + save_nestlevel = NewGUCNestLevel(); /* Make sure it is a materialized view. */ if (matviewRel->rd_rel->relkind != RELKIND_MATVIEW) @@ -269,19 +280,6 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, */ SetMatViewPopulatedState(matviewRel, !stmt->skipData); - relowner = matviewRel->rd_rel->relowner; - - /* - * Switch to the owner's userid, so that any functions are run as that - * user. Also arrange to make GUC variable changes local to this command. - * Don't lock it down too tight to create a temporary table just yet. We - * will switch modes when we are about to execute user code. - */ - GetUserIdAndSecContext(&save_userid, &save_sec_context); - SetUserIdAndSecContext(relowner, - save_sec_context | SECURITY_LOCAL_USERID_CHANGE); - save_nestlevel = NewGUCNestLevel(); - /* Concurrent refresh builds new data in temp tablespace, and does diff. */ if (concurrent) { @@ -305,12 +303,6 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, LockRelationOid(OIDNewHeap, AccessExclusiveLock); dest = CreateTransientRelDestReceiver(OIDNewHeap); - /* - * Now lock down security-restricted operations. - */ - SetUserIdAndSecContext(relowner, - save_sec_context | SECURITY_RESTRICTED_OPERATION); - /* Generate the data, if wanted. */ if (!stmt->skipData) processed = refresh_matview_datafill(dest, dataQuery, queryString); diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out index 4a3709e315..03df567d50 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -1684,6 +1684,22 @@ CONTEXT: SQL function "unwanted_grant" statement 1 SQL statement "SELECT unwanted_grant()" PL/pgSQL function sro_trojan() line 1 at PERFORM SQL function "mv_action" statement 1 +-- REFRESH MATERIALIZED VIEW CONCURRENTLY use of eval_const_expressions() +SET SESSION AUTHORIZATION regress_sro_user; +CREATE FUNCTION unwanted_grant_nofail(int) RETURNS int + IMMUTABLE LANGUAGE plpgsql AS $$ +BEGIN + PERFORM unwanted_grant(); + RAISE WARNING 'owned'; + RETURN 1; +EXCEPTION WHEN OTHERS THEN + RETURN 2; +END$$; +CREATE MATERIALIZED VIEW sro_index_mv AS SELECT 1 AS c; +CREATE UNIQUE INDEX ON sro_index_mv (c) WHERE unwanted_grant_nofail(1) > 0; +\c - +REFRESH MATERIALIZED VIEW CONCURRENTLY sro_index_mv; +REFRESH MATERIALIZED VIEW sro_index_mv; DROP OWNED BY regress_sro_user; DROP ROLE regress_sro_user; -- Admin options diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql index 55df7f3b32..2a6ba38e52 100644 --- a/src/test/regress/sql/privileges.sql +++ b/src/test/regress/sql/privileges.sql @@ -1116,6 +1116,23 @@ REFRESH MATERIALIZED VIEW sro_mv; REFRESH MATERIALIZED VIEW sro_mv; BEGIN; SET CONSTRAINTS ALL IMMEDIATE; REFRESH MATERIALIZED VIEW sro_mv; COMMIT; +-- REFRESH MATERIALIZED VIEW CONCURRENTLY use of eval_const_expressions() +SET SESSION AUTHORIZATION regress_sro_user; +CREATE FUNCTION unwanted_grant_nofail(int) RETURNS int + IMMUTABLE LANGUAGE plpgsql AS $$ +BEGIN + PERFORM unwanted_grant(); + RAISE WARNING 'owned'; + RETURN 1; +EXCEPTION WHEN OTHERS THEN + RETURN 2; +END$$; +CREATE MATERIALIZED VIEW sro_index_mv AS SELECT 1 AS c; +CREATE UNIQUE INDEX ON sro_index_mv (c) WHERE unwanted_grant_nofail(1) > 0; +\c - +REFRESH MATERIALIZED VIEW CONCURRENTLY sro_index_mv; +REFRESH MATERIALIZED VIEW sro_index_mv; + DROP OWNED BY regress_sro_user; DROP ROLE regress_sro_user; From 29904f5f2fdafbbb96ef3685fd361053b061aeb1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 9 May 2022 11:02:36 -0400 Subject: [PATCH 619/772] Revert "Disallow infinite endpoints in generate_series() for timestamps." This reverts commit eafdf9de06e9b60168f5e47cedcfceecdc6d4b5f and its back-branch counterparts. Corey Huinker pointed out that we'd discussed this exact change back in 2016 and rejected it, on the grounds that there's at least one usage pattern with LIMIT where an infinite endpoint can usefully be used. Perhaps that argument needs to be re-litigated, but there's no time left before our back-branch releases. To keep our options open, restore the status quo ante; if we do end up deciding to change things, waiting one more quarter won't hurt anything. Rather than just doing a straight revert, I added a new test case demonstrating the usage with LIMIT. That'll at least remind us of the issue if we forget again. Discussion: https://postgr.es/m/3603504.1652068977@sss.pgh.pa.us Discussion: https://postgr.es/m/CADkLM=dzw0Pvdqp5yWKxMd+VmNkAMhG=4ku7GnCZxebWnzmz3Q@mail.gmail.com --- src/backend/utils/adt/timestamp.c | 28 ----------------------- src/test/regress/expected/timestamp.out | 27 +++++++++++++++------- src/test/regress/expected/timestamptz.out | 27 +++++++++++++++------- src/test/regress/sql/timestamp.sql | 11 ++++----- src/test/regress/sql/timestamptz.sql | 11 ++++----- 5 files changed, 48 insertions(+), 56 deletions(-) diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 93c10e1ae4..552b631ba7 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -5778,20 +5778,6 @@ generate_series_timestamp(PG_FUNCTION_ARGS) MemoryContext oldcontext; Interval interval_zero; - /* Reject infinities in start and stop values */ - if (TIMESTAMP_IS_NOBEGIN(start) || - TIMESTAMP_IS_NOEND(start)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("start value cannot be infinity"))); - if (TIMESTAMP_IS_NOBEGIN(finish) || - TIMESTAMP_IS_NOEND(finish)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("stop value cannot be infinity"))); - - /* Interval doesn't (currently) have infinity, so nothing to check */ - /* create a function context for cross-call persistence */ funcctx = SRF_FIRSTCALL_INIT(); @@ -5872,20 +5858,6 @@ generate_series_timestamptz(PG_FUNCTION_ARGS) MemoryContext oldcontext; Interval interval_zero; - /* Reject infinities in start and stop values */ - if (TIMESTAMP_IS_NOBEGIN(start) || - TIMESTAMP_IS_NOEND(start)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("start value cannot be infinity"))); - if (TIMESTAMP_IS_NOBEGIN(finish) || - TIMESTAMP_IS_NOEND(finish)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("stop value cannot be infinity"))); - - /* Interval doesn't (currently) have infinity, so nothing to check */ - /* create a function context for cross-call persistence */ funcctx = SRF_FIRSTCALL_INIT(); diff --git a/src/test/regress/expected/timestamp.out b/src/test/regress/expected/timestamp.out index d5ca6b76a4..79f8180955 100644 --- a/src/test/regress/expected/timestamp.out +++ b/src/test/regress/expected/timestamp.out @@ -2055,15 +2055,26 @@ select * from generate_series('2020-01-01 00:00'::timestamp, Thu Jan 02 03:00:00 2020 (28 rows) +-- the LIMIT should allow this to terminate in a reasonable amount of time +-- (but that unfortunately doesn't work yet for SELECT * FROM ...) +select generate_series('2022-01-01 00:00'::timestamp, + 'infinity'::timestamp, + '1 month'::interval) limit 10; + generate_series +-------------------------- + Sat Jan 01 00:00:00 2022 + Tue Feb 01 00:00:00 2022 + Tue Mar 01 00:00:00 2022 + Fri Apr 01 00:00:00 2022 + Sun May 01 00:00:00 2022 + Wed Jun 01 00:00:00 2022 + Fri Jul 01 00:00:00 2022 + Mon Aug 01 00:00:00 2022 + Thu Sep 01 00:00:00 2022 + Sat Oct 01 00:00:00 2022 +(10 rows) + -- errors -select * from generate_series('-infinity'::timestamp, - '2020-01-02 03:00'::timestamp, - '1 hour'::interval); -ERROR: start value cannot be infinity -select * from generate_series('2020-01-01 00:00'::timestamp, - 'infinity'::timestamp, - '1 hour'::interval); -ERROR: stop value cannot be infinity select * from generate_series('2020-01-01 00:00'::timestamp, '2020-01-02 03:00'::timestamp, '0 hour'::interval); diff --git a/src/test/regress/expected/timestamptz.out b/src/test/regress/expected/timestamptz.out index 4a29484ec3..eba84191d3 100644 --- a/src/test/regress/expected/timestamptz.out +++ b/src/test/regress/expected/timestamptz.out @@ -2398,15 +2398,26 @@ select * from generate_series('2020-01-01 00:00'::timestamptz, Thu Jan 02 03:00:00 2020 PST (28 rows) +-- the LIMIT should allow this to terminate in a reasonable amount of time +-- (but that unfortunately doesn't work yet for SELECT * FROM ...) +select generate_series('2022-01-01 00:00'::timestamptz, + 'infinity'::timestamptz, + '1 month'::interval) limit 10; + generate_series +------------------------------ + Sat Jan 01 00:00:00 2022 PST + Tue Feb 01 00:00:00 2022 PST + Tue Mar 01 00:00:00 2022 PST + Fri Apr 01 00:00:00 2022 PDT + Sun May 01 00:00:00 2022 PDT + Wed Jun 01 00:00:00 2022 PDT + Fri Jul 01 00:00:00 2022 PDT + Mon Aug 01 00:00:00 2022 PDT + Thu Sep 01 00:00:00 2022 PDT + Sat Oct 01 00:00:00 2022 PDT +(10 rows) + -- errors -select * from generate_series('-infinity'::timestamptz, - '2020-01-02 03:00'::timestamptz, - '1 hour'::interval); -ERROR: start value cannot be infinity -select * from generate_series('2020-01-01 00:00'::timestamptz, - 'infinity'::timestamptz, - '1 hour'::interval); -ERROR: stop value cannot be infinity select * from generate_series('2020-01-01 00:00'::timestamptz, '2020-01-02 03:00'::timestamptz, '0 hour'::interval); diff --git a/src/test/regress/sql/timestamp.sql b/src/test/regress/sql/timestamp.sql index 0778e5d7c0..ebc969f36c 100644 --- a/src/test/regress/sql/timestamp.sql +++ b/src/test/regress/sql/timestamp.sql @@ -375,13 +375,12 @@ select make_timestamp(0, 7, 15, 12, 30, 15); select * from generate_series('2020-01-01 00:00'::timestamp, '2020-01-02 03:00'::timestamp, '1 hour'::interval); +-- the LIMIT should allow this to terminate in a reasonable amount of time +-- (but that unfortunately doesn't work yet for SELECT * FROM ...) +select generate_series('2022-01-01 00:00'::timestamp, + 'infinity'::timestamp, + '1 month'::interval) limit 10; -- errors -select * from generate_series('-infinity'::timestamp, - '2020-01-02 03:00'::timestamp, - '1 hour'::interval); -select * from generate_series('2020-01-01 00:00'::timestamp, - 'infinity'::timestamp, - '1 hour'::interval); select * from generate_series('2020-01-01 00:00'::timestamp, '2020-01-02 03:00'::timestamp, '0 hour'::interval); diff --git a/src/test/regress/sql/timestamptz.sql b/src/test/regress/sql/timestamptz.sql index c1643de0f1..a107abc5a4 100644 --- a/src/test/regress/sql/timestamptz.sql +++ b/src/test/regress/sql/timestamptz.sql @@ -436,13 +436,12 @@ RESET TimeZone; select * from generate_series('2020-01-01 00:00'::timestamptz, '2020-01-02 03:00'::timestamptz, '1 hour'::interval); +-- the LIMIT should allow this to terminate in a reasonable amount of time +-- (but that unfortunately doesn't work yet for SELECT * FROM ...) +select generate_series('2022-01-01 00:00'::timestamptz, + 'infinity'::timestamptz, + '1 month'::interval) limit 10; -- errors -select * from generate_series('-infinity'::timestamptz, - '2020-01-02 03:00'::timestamptz, - '1 hour'::interval); -select * from generate_series('2020-01-01 00:00'::timestamptz, - 'infinity'::timestamptz, - '1 hour'::interval); select * from generate_series('2020-01-01 00:00'::timestamptz, '2020-01-02 03:00'::timestamptz, '0 hour'::interval); From fe20afaee8aac7838ed6e4a76baa83e547629582 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 9 May 2022 14:15:37 -0400 Subject: [PATCH 620/772] Fix core dump in transformValuesClause when there are no columns. The parser code that transformed VALUES from row-oriented to column-oriented lists failed if there were zero columns. You can't write that straightforwardly (though probably you should be able to), but the case can be reached by expanding a "tab.*" reference to a zero-column table. Per bug #17477 from Wang Ke. Back-patch to all supported branches. Discussion: https://postgr.es/m/17477-0af3c6ac6b0a6ae0@postgresql.org --- src/backend/parser/analyze.c | 18 ++++++------------ src/test/regress/expected/select.out | 7 +++++++ src/test/regress/sql/select.sql | 5 +++++ 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 0144284aa3..6b54e8e46d 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -1424,7 +1424,7 @@ static Query * transformValuesClause(ParseState *pstate, SelectStmt *stmt) { Query *qry = makeNode(Query); - List *exprsLists; + List *exprsLists = NIL; List *coltypes = NIL; List *coltypmods = NIL; List *colcollations = NIL; @@ -1508,6 +1508,9 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) /* Release sub-list's cells to save memory */ list_free(sublist); + + /* Prepare an exprsLists element for this row */ + exprsLists = lappend(exprsLists, NIL); } /* @@ -1551,17 +1554,7 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) /* * Finally, rearrange the coerced expressions into row-organized lists. */ - exprsLists = NIL; - foreach(lc, colexprs[0]) - { - Node *col = (Node *) lfirst(lc); - List *sublist; - - sublist = list_make1(col); - exprsLists = lappend(exprsLists, sublist); - } - list_free(colexprs[0]); - for (i = 1; i < sublist_length; i++) + for (i = 0; i < sublist_length; i++) { forboth(lc, colexprs[i], lc2, exprsLists) { @@ -1569,6 +1562,7 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) List *sublist = lfirst(lc2); sublist = lappend(sublist, col); + lfirst(lc2) = sublist; } list_free(colexprs[i]); } diff --git a/src/test/regress/expected/select.out b/src/test/regress/expected/select.out index d7888e44eb..33a6dceb0e 100644 --- a/src/test/regress/expected/select.out +++ b/src/test/regress/expected/select.out @@ -514,6 +514,13 @@ TABLE int8_tbl; 4567890123456789 | -4567890123456789 (9 rows) +-- corner case: VALUES with no columns +CREATE TEMP TABLE nocols(); +INSERT INTO nocols DEFAULT VALUES; +SELECT * FROM nocols n, LATERAL (VALUES(n.*)) v; +-- +(1 row) + -- -- Test ORDER BY options -- diff --git a/src/test/regress/sql/select.sql b/src/test/regress/sql/select.sql index aa3d035204..019f1e7673 100644 --- a/src/test/regress/sql/select.sql +++ b/src/test/regress/sql/select.sql @@ -143,6 +143,11 @@ SELECT 2+2, 57 UNION ALL TABLE int8_tbl; +-- corner case: VALUES with no columns +CREATE TEMP TABLE nocols(); +INSERT INTO nocols DEFAULT VALUES; +SELECT * FROM nocols n, LATERAL (VALUES(n.*)) v; + -- -- Test ORDER BY options -- From 7dd3ee508432730d15c5d3032f37362f6b6e4dd8 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 10 May 2022 11:31:31 +0900 Subject: [PATCH 621/772] Fix several issues with the TAP tests of pg_upgrade This commit addresses the following issues in the TAP tests of pg_upgrade, introduced in 322becb: - Remove --port and --host for commands that already rely on a node's environment PGHOST and PGPORT. - Switch from run_log() to command_ok(), as all the commands executed in the tests should succeed. - Change EXTRA_REGRESS_OPTS to make it count as a shell fragment (fixing s/OPT/OPTS on a way), to be compatible with the various Makefiles using it as well as 027_stream_regress.pl in the recovery tests. The command built for the execution the pg_regress command is reformatted, while on it, to map with the recovery test doing the same thing (we should refactor and consolidate that in the future, perhaps). - Re-add the test for database names stressing the behavior of backslashes with double quotes, mostly here for Windows. Tests doable with the upgrade across different major versions still work the same way. Reported-by: Noah Misch Discussion: https://postgr.es/m/20220502042718.GB1565149@rfd.leadboat.com --- src/bin/pg_upgrade/t/002_pg_upgrade.pl | 54 ++++++++++++-------------- 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl index 05bf161843..76b8dab4b7 100644 --- a/src/bin/pg_upgrade/t/002_pg_upgrade.pl +++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl @@ -21,9 +21,11 @@ sub generate_db next if $i == 7 || $i == 10 || $i == 13; # skip BEL, LF, and CR $dbname = $dbname . sprintf('%c', $i); } - $node->run_log( - [ 'createdb', '--host', $node->host, '--port', $node->port, $dbname ] - ); + + # Exercise backslashes adjacent to double quotes, a Windows special + # case. + $dbname = '\\"\\' . $dbname . '\\\\"\\\\\\'; + $node->command_ok([ 'createdb', $dbname ]); } # The test of pg_upgrade requires two clusters, an old one and a new one @@ -70,12 +72,7 @@ sub generate_db # Load the dump using the "postgres" database as "regression" does # not exist yet, and we are done here. - $oldnode->command_ok( - [ - 'psql', '-X', '-f', $olddumpfile, - '--port', $oldnode->port, '--host', $oldnode->host, - 'postgres' - ]); + $oldnode->command_ok([ 'psql', '-X', '-f', $olddumpfile, 'postgres' ]); } else { @@ -87,8 +84,7 @@ sub generate_db generate_db($oldnode, 91, 127); # Grab any regression options that may be passed down by caller. - my $extra_opts_val = $ENV{EXTRA_REGRESS_OPT} || ""; - my @extra_opts = split(/\s+/, $extra_opts_val); + my $extra_opts = $ENV{EXTRA_REGRESS_OPTS} || ""; # --dlpath is needed to be able to find the location of regress.so # and any libraries the regression tests require. @@ -100,19 +96,19 @@ sub generate_db # --inputdir points to the path of the input files. my $inputdir = "$srcdir/src/test/regress"; - my @regress_command = [ - $ENV{PG_REGRESS}, @extra_opts, - '--dlpath', $dlpath, - '--max-concurrent-tests', '20', - '--bindir=', '--host', - $oldnode->host, '--port', - $oldnode->port, '--schedule', - "$srcdir/src/test/regress/parallel_schedule", '--outputdir', - $outputdir, '--inputdir', - $inputdir - ]; - - my $rc = run_log(@regress_command); + my $rc = + system($ENV{PG_REGRESS} + . "$extra_opts " + . "--dlpath=\"$dlpath\" " + . "--bindir= " + . "--host=" + . $oldnode->host . " " + . "--port=" + . $oldnode->port . " " + . "--schedule=$srcdir/src/test/regress/parallel_schedule " + . "--max-concurrent-tests=20 " + . "--inputdir=\"$inputdir\" " + . "--outputdir=\"$outputdir\""); if ($rc != 0) { # Dump out the regression diffs file, if there is one @@ -133,12 +129,10 @@ sub generate_db { # Note that upgrade_adapt.sql from the new version is used, to # cope with an upgrade to this version. - $oldnode->run_log( + $oldnode->command_ok( [ - 'psql', '-X', - '-f', "$srcdir/src/bin/pg_upgrade/upgrade_adapt.sql", - '--port', $oldnode->port, - '--host', $oldnode->host, + 'psql', '-X', + '-f', "$srcdir/src/bin/pg_upgrade/upgrade_adapt.sql", 'regression' ]); } @@ -232,7 +226,7 @@ sub generate_db } # Second dump from the upgraded instance. -$newnode->run_log( +$newnode->command_ok( [ 'pg_dumpall', '--no-sync', '-d', $newnode->connstr('postgres'), From 9499606db00290562096d74f62cf47f953795b58 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 10 May 2022 11:35:28 -0400 Subject: [PATCH 622/772] doc: first draft of PG 15 release notes --- doc/src/sgml/release-15.sgml | 2926 +++++++++++++++++++++++++++++++++- 1 file changed, 2915 insertions(+), 11 deletions(-) diff --git a/doc/src/sgml/release-15.sgml b/doc/src/sgml/release-15.sgml index bee24b236a..eebd17db5e 100644 --- a/doc/src/sgml/release-15.sgml +++ b/doc/src/sgml/release-15.sgml @@ -1,16 +1,2920 @@ - - + + Release 15 + + + Release date: + AS OF 2022-05-09 + + + + Overview + + + PostgreSQL 15 contains many new features and + enhancements, including: + + + + + + + + The above items and other new features + of PostgreSQL 15 are explained in more + detail in the sections below. + + + + + + + Migration to Version 15 + + + A dump/restore using or use of or logical replication is required for those + wishing to migrate data from any previous release. See for general information on migrating to new major + releases. + + + + Version 15 contains a number of changes that may affect compatibility + with previous releases. Observe the following incompatibilities: + + + + + + + + +Remove PUBLIC 'creation' permission on the 'public' schema (Noah Misch) + + + +This is a change in the default for newly-created databases in existing clusters and for new clusters; usage permissions on the 'public' schema has not been changed. Databases restored from previous +Postgres releases will be restored with their current permissions. Users wishing to have the old permissions on new objects will need to grant 'create' permission for PUBLIC on the 'public' schema; this +change can be made on 'template1' to cause all new databases to have these permissions. template1 permissions for pg_dumpall and pg_upgrade? + + + + + + + +Change the owner of the 'public' schema to 'pg_database_owner' (Noah Misch) + + + +Previously it was the literal user name of the database owner. Databases restored from previous Postgres releases will be restored with their current owner specification. + + + + + + + +Remove exclusive backup mode (David Steele, Nathan Bossart) + + + +This mode could cause server startup failure if the database server stopped abruptly while in this mode. The non-exclusive backup mode requires a continuous database connection during the backup. + + + + + + + +Increase hash_mem_multiplier default to 2.0 (Peter Geoghegan) + + + +This allows query hash operations to use double the amount of work_mem memory as other operations. + + + + + + + +Remove server-side language plpython2u and generic Python language plpythonu (Andres Freund) + + + + + + + +Mark the interval output function as stable, not immutable, since it depends on IntervalStyle (Tom Lane) + + + +This will cause the creation of indexes relying on the text output of interval values to fail. + + + + + + + +Allow tsvector_delete_arr() and tsvector_setweight_by_filter() accept empty array elements (Jean-Christophe Arnu) + + + +These lexemes are not stored so the acceptance of empty array elements is not a problem. + + + + + + + +Generate an error if array_to_tsvector() is passed an empty array element (Jean-Christophe Arnu) + + + +This is prohibited because lexemes should never be empty. Users of previous Postgres releases should verify that no empty lexemes are stored because they can lead to dump/restore failures and inconsistent +results. + + + + + + + +Generate an error when char() is supplied with a negative argument (Peter Eisentraut) + + + + + + + +Remove unused function parameter in get_qual_from_partbound() (Hou Zhijie) + + + + + + + +Prevent Unicode zero-length identifiers, e.g., U&"" (Peter Eisentraut) + + + +Non-Unicode zero-length identifiers were already prevented. + + + + + + + +Remove pg_dump's --no-synchronized-snapshots option since all supported server versions support synchronized snapshots (Tom Lane) + + + + + + + +Prevent CREATE OR REPLACE VIEW from changing the collation of an output column (Tom Lane) + + + + + + + +Prevent numeric literals from having non-numeric training characters (Peter Eisentraut) + + + +Previously literals like '123abc' would be interpreted as '123' and 'abc'. + + + + + + + +Adjust JSON numeric literal processing to match the SQL/JSON-standard (Peter Eisentraut) + + + +This accepts numeric formats like ".1" and "1.", and disallow trailing junk after numeric literals, like "1.type()". + + + + + + + +Improve consistency of interval parsing with trailing periods (Tom Lane) + + + +Some platforms disallowed trailing periods. + + + + + + + +Detect integer overflow in interval justification functions (Joe Koshakow) + + + +Specifically, functions justify_interval(), justify_hours(), and justify_days() are affected. + + + + + + + +Remove the default ADMIN OPTION privilege a login role has on its own role membership (Robert Haas) + + + +Previously, login roles could add/remove members of its own role, even without ADMIN OPTION privilege. + + + + + + + +Prevent logical replication into tables where the subscription owner is subject to the table's row-level security policies (Mark Dilger) + + + +This effectively means that only super users, roles with bypassrls, and table owners can replicate into tables with row-level security policies. (The actual row-level security policies are not checked, +only whether row-level security policies are enforced for subscribing users.) + + + + + + + +Prevent UPDATE and DELETE logical replication operations on tables where the subscription owner does not have SELECT permission on the table (Jeff Davis) + + + +UPDATE and DELETE perform SELECT, so require the subscription owner to have table SELECT permission. + + + + + + + +Modify SPI's SPI_commit() and SPI_commit_and_chain() to automatically start a new transaction at completion (Peter Eisentraut, Tom Lane) + + + +BACKPATCHED? + + + + + + + +Fix pg_statio_all_tables to sum values for the rare case of TOAST tables with multiple indexes (Andrei Zubkov) + + + +Previously such cases would have one row for each index. + + + + + + + +Disallow setting of server variables matching the prefixes of installed extension (Florin Irion, Tom Lane) + + + +This also deletes any matching server variables during extension load. + + + + + + + +Remove unnecessary server variable stats_temp_directory (Andres Freund, Kyotaro Horiguchi) + + + + + + + +Improve the algorithm used to compute random() (Fabien Coelho) + + + +This will cause setseed() followed by random() to return a different value on older servers. + + + + + + + +Reduce casting of constants in postgres_fdw queries (Dian Fay) + + + +If column types were mismatched between local and remote databases, such casting could cause errors. + + + + + + + +Remove contrib/xml2's function xml_is_well_formed() (Tom Lane) + + + +This function has been implemented in the core backend since Postgres 9.1. + + + + + + + +Allow CustomScan providers to indicate if they support projections (Sven Klemm) + + + +The default is now that custom scan providers can't support projections, so they need to be updated for this release. + + + + + + + + + Changes + + + Below you will find a detailed account of the changes between + PostgreSQL 15 and the previous major + release. + + + + Server + + + + + + + +Record and check the collation of each database (Peter Eisentraut) + + + +This is designed to detect collation mismatches to avoid data corruption. Function pg_database_collation_actual_version() reports the underlying operating system collation version, and ALTER DATABASE ... +REFRESH sets the database to match the operating system collation version. DETAILS? + + + + + + + +Allow ICU collations to be set as the default for clusters and databases (Peter Eisentraut) + + + +Previously, ICU collations could only be specified in CREATE COLLATION and used with the COLLATE clause. + + + + + + + +Add system view pg_ident_file_mappings to report pg_ident.conf information (Julien Rouhaud) + + + + + + + <link linkend="ddl-partitioning">Partitioning</link> + + + + + + + +Improve planning time for queries referencing partitioned tables (David Rowley) + + + +Specifically this helps if only a small number of the many partitions are relevant. + + + + + + + +Allow ordered scans of partitions to avoid sorting in more cases (David Rowley) + + + +Previously, a partitioned table with any LIST partition containing multiple values could not be used for ordered partition scans. Now only non-pruned LIST partitions are checked. This also helps with +partitioned tables with DEFAULT partitions. + + + + + + + +Improve the trigger behavior of updates on partitioned tables that move rows between partitions (Amit Langote) + + + +Previously, such updates fired delete triggers on the source partition and fired insert triggers on the target partition. PostgreSQL will now fire an update trigger on the partition root. This makes +foreign key behavior more consistent. ALL TRIGGERS? + + + + + + + +Remove incorrect duplicate partition tables in system view pg_publication_tables (Hou Zhijie) + + + + + + + +Allow CLUSTER on partitioned tables (Justin Pryzby) + + + + + + + +Fix ALTER TRIGGER RENAME on partitioned tables to rename partitions (Arne Roland, Álvaro Herrera) + + + +Also prohibit cloned triggers from being renamed. + + + + + + + + + Indexes + + + + + + + +Allow system and TOAST B-tree indexes to efficiently store duplicates (Peter Geoghegan) + + + +Previously de-duplication was disabled for these types of indexes. + + + + + + + +Improve sorting performance (Heikki Linnakangas) + + + +Specifically, switch to a batch sorting algorithm that uses more output streams internally. + + + + + + + +Improve lookup performance of GiST indexes built using sorting (Aliaksandr Kalenik, Sergei Shoulbakov, Andrey Borodin) + + + + + + + +Prevent changes to columns only indexed by BRIN indexes from preventing HOT updates (Josef Simanek) + + + + + + + +Allow unique constraints and indexes to treat NULL values as not distinct (Peter Eisentraut) + + + +The Postgres default has always been to treat NULL indexed values as distinct, but this can now be changed by creating constraints and indexes using UNIQUE NULLS NOT DISTINCT. + + + + + + + +Allow ^@ and starts_with() to use btree indexes if using a C collation (Tom Lane) + + + +Previously these could only use SP-GiST indexes. + + + + + + + + + Optimizer + + + + + + + +Have extended statistics track statistics for a table's children separately (Tomas Vondra, Justin Pryzby) + + + +Regular statistics already tracked child and non-child statistics separately. + + + + + + + +Allow GROUP BY sorting to optimize column order (Dmitry Dolgov, Teodor Sigaev, Tomas Vondra) + + + +This optimization can be disabled using the server variable enable_group_by_reordering. + + + + + + + +Add server variable recursive_worktable_factor to allow the user to specify the expected recursive query worktable size (Simon Riggs) + + + +WHAT IS A WORKTABLE? NOT DEFINED. + + + + + + + + + General Performance + + + + + + + +Allow hash lookup for NOT IN clauses with many constants (David Rowley, James Coleman) + + + +Previously the code always sequentially scanned the list of values. + + + + + + + +Improve validation of ASCII and UTF-8 text by processing 16 bytes at a time (John Naylor) + + + +This will improve text-heavy operations like COPY FROM. + + + + + + + +Allow WAL full page writes to use LZ4 and ZSTD compression (Andrey Borodin, Justin Pryzby) + + + +This is controlled by the wal_compression server setting. + + + + + + + +Add direct I/O support to macOS (Thomas Munro) + + + +This only works if max_wal_senders=0 and wal_level=minimal. + + + + + + + +Allow vacuum to be more aggressive in setting the oldest frozenxid (Peter Geoghegan) + + + + + + + +Allow a query referencing multiple foreign tables to perform parallel foreign table scans in more cases (Andrey Lepikhov, Etsuro Fujita) + + + + + + + +Improve the performance of window functions that use row_number(), rank(), and count() (David Rowley) + + + + + + + + + Monitoring + + + + + + + +Enable default logging of checkpoints and slow autovacuum operations (Bharath Rupireddy) + + + +Specifically, this changes the default of log_checkpoints to on and log_autovacuum_min_duration to 10 minutes. This will cause idle servers to generate log output, which might cause problems on +resource-constrained servers with insufficient log file removal. The defaults should be changed in such cases. + + + + + + + +Generate periodic log message during slow server starts (Nitin Jadhav, Robert Haas, Álvaro Herrera) + + + +Messages report the cause of the delay. The time interval for notification is controlled by the new server variable log_startup_progress_interval. + + + + + + + +Store server-level statistics in shared memory (Kyotaro Horiguchi, Andres Freund, Melanie Plageman) + + + +Previously this was updated via UDP packets, stored in the file system, and read by sessions. There is no longer a statistics collector process. + + + + + + + +Add additional information to VACUUM VERBOSE and autovacuum logging messages (Peter Geoghegan) + + + + + + + +Add EXPLAIN (BUFFERS) output for temporary file block I/O (Masahiko Sawada) + + + + + + + +Allow log output in JSON format (Sehrope Sarkuni, Michael Paquier) + + + +The new setting is log_destination=jsonlog. + + + + + + + +Allow pg_stat_reset_single_table_counters() to reset the counters of relations shared across all databases (B Sadhu, Prasad Patro) + + + + + + + +Add wait events for local shell commands (Fujii Masao) + + + +Specifically the new wait events are related to commands archive_command, archive_cleanup_command, restore_command and recovery_end_command. + + + + + + + + + Privileges + + + + + + + +Allows view access to be controlled by privileges of the view user (Christoph Heiss) + + + +Previously, view access could only be based on the view owner. + + + + + + + +Allow members of the pg_write_server_files predefined role to perform server-side base backups (Dagfinn Ilmari Mannsåker) + + + +Previously only the super users could perform such backups. + + + + + + + +Allow GRANT to assign permission to change server variables via SET and ALTER SYSTEM (Mark Dilger) + + + +New function has_parameter_privilege() reports on this privilege. + + + + + + + +Allow members of the pg_checkpointer predefined role to run the CHECKPOINT command (Jeff Davis) + + + +Previously these views could only be run by super users. + + + + + + + +Allow members of the pg_read_all_stats predefined role to access the views pg_backend_memory_contexts and pg_shmem_allocations (Bharath Rupireddy) + + + +Previously these views could only be run by super users. + + + + + + + +Allow GRANT to assign permissions on pg_log_backend_memory_contexts() (Jeff Davis) + + + +Previously this function could only be run by super users. + + + + + + + + + Server Configuration + + + + + + + +Add server variable shared_memory_size to report the size of allocated shared memory (Nathan Bossart) + + + + + + + +Add server variable shared_memory_size_in_huge_pages to report the number of huge memory pages required (Nathan Bossart) + + + +This is only supported on Linux. + + + + + + + +Allow "postgres -C" to properly report runtime-computed values (Nathan Bossart) + + + +Previously runtime-computed values data_checksums, wal_segment_size, and data_directory_mode would report values that would not be accurate on the running server. They also can only be + + + + + + + +Add function pg_settings_get_flags() to get the flags of server-side variables (Justin Pryzby) + + + + + + + +Add server variable allow_in_place_tablespaces for tablespace testing (Thomas Munro) + + + + + + + + + + + Streaming Replication and Recovery + + + + + + + +Add support for LZ4 and ZSTD compression of server-side base backups (Jeevan Ladhe, Robert Haas) + + + + + + + +Run checkpointer and bgwriter during crash recovery (Thomas Munro) + + + + + + + +Allow WAL processing to pre-fetch needed file contents (Thomas Munro) + + + +This is controlled by the server variable recovery_prefetch. + + + + + + + +Add server variable archive_library to specify the library to be called for archiving (Nathan Bossart) + + + + + + + +Add SQL functions to monitor the directory contents of replication slots (Bharath Rupireddy) + + + +Specifically, the functions are pg_ls_logicalsnapdir(), pg_ls_logicalmapdir(), and pg_ls_replslotdir(). They can be run by members of the predefined pg_monitor role. + + + + + + + +No longer require IDENTIFY_SYSTEM to be run before START_REPLICATION (Jeff Davis) + + + + + + + <link linkend="logical-replication">Logical Replication</link> + + + + + + + +Allow publication of all tables in a schema (Vignesh C, Hou Zhijie, Amit Kapila) + + + +For example, this syntax is now supported: CREATE PUBLICATION pub1 FOR ALL TABLES IN SCHEMA s1,s2; ALTER PUBLICATION supports a similar syntax. Tables added to the listed schemas in the future will also +be replicated. + + + + + + + +Allow publication content to be filtered using a WHERE clause (Hou Zhijie, Euler Taveira, Peter Smith, Ajin Cherian, Tomas Vondra, Amit Kapila) + + + + + + + +Allow publications to be restricted to specific columns (Tomas Vondra, Álvaro Herrera, Rahila Syed) + + + + + + + +Allow logical replication to transfer sequence changes (Tomas Vondra, Cary Huang) + + + +The sequence option must be specified in the publication. A new system view pg_publication_sequences shows published sequences. + + + + + + + +Create unlogged sequences and allow them to be skipped in logical replication (Peter Eisentraut) + + + +Individual sequence changes are not WAL logged so there is no performance benefit on the primary. + + + + + + + +Allow skipping of transactions on a subscriber using ALTER SUBSCRIPTION ... SKIP (Masahiko Sawada) + + + + + + + +Add support for prepared transactions to built-in logical replication (Peter Smith, Ajin Cherian, Amit Kapila, Nikhil Sontakke, Stas Kelvich) + + + + + + + +Add two-phase information to the logical replication stream (Ajin Cherian) + + + +The new CREATE_REPLICATION_SLOT option is called TWO_PHASE. pg_recvlogical now supports a new --two-phase option during slot creation. + + + + + + + +Adjust subscriber server variables to match the publisher so datetime and float8 values are interpreted consistently (Japin Li) + + + +Some publishers might be relying on inconsistent behavior. + + + + + + + +Add system view pg_stat_subscription_stats to report on subscriber activity (Masahiko Sawada) + + + +New function pg_stat_reset_subscription_stats() allows the resetting of subscriber statistics. + + + + + + + + + + + <link linkend="sql-select"><command>SELECT</command></link>, <link linkend="sql-insert"><command>INSERT</command></link> + + + + + + + +Allow SELECT DISTINCT to be parallelized (David Rowley) + + + + + + + + + Utility Commands + + + + + + + +Add SQL MERGE command to adjust one table to match another (Pavan Deolasee, Álvaro Herrera, Amit Langote, Simon Riggs) + + + +This is similar to INSERT ... ON CONFLICT but more batch-oriented. + + + + + + + +Add support for HEADER option in COPY text format (Rémi Lapeyre) + + + +The new options causes the column names to be output, and optionally verified on input. + + + + + + + +Add new default WAL-logged method for database creation (Dilip Kumar) + + + +This avoids the need for checkpoints during database creation; the old method is still available. + + + + + + + +Allow CREATE DATABASE to set the database OID (Shruthi KC, Antonin Houska) + + + + + + + +Prevent DROP DATABASE, DROP TABLESPACE, and ALTER DATABASE SET TABLESPACE from occasionally failing during concurrent use on Windows (Thomas Munro) + + + + + + + +Allow foreign key ON DELETE SET actions to affect only specified columns (Paul Martinez) + + + +Previously, all of the columns in the foreign key were always effected. + + + + + + + +When EXPLAIN references the temporary object schema, refer to it as "pg_temp" (Amul Sul) + + + +Previous the actual schema name was used. + + + + + + + +Allow ALTER TABLE to modify a table's ACCESS METHOD (Justin Pryzby, Jeff Davis) + + + + + + + +Properly call object access hooks when ALTER TABLE causes table rewrites (Michael Paquier) + + + + + + + + + Data Types + + + + + + + +Allow numeric scale to be negative or greater than precision (Dean Rasheed, Tom Lane) + + + +This allows rounding of values to the left of the decimal point, e.g., '1234'::numeric(4, -2) returns 1200. + + + + + + + +When specifying fractional interval values in units greater than months, round to the nearest month (Bruce Momjian) + + + +For example, report '1.99 years' as '2 years', not '1 year 11 months'. + + + + + + + +Improve overflow detection when casting values to interval (Joe Koshakow) + + + + + + + +Update the display width information for modern Unicode characters, like emojis (Jacob Champion) + + + +Also update from Unicode 5.0 to 14.0.0. There is now an automated way to keep Postgres updated with Unicode releases. + + + + + + + + + Functions + + + + + + + +Add multirange input to range_agg() (Paul Jungwirth) + + + + + + + +Add min() and max() aggregates for the xid8 data type (Ken Kato) + + + + + + + +Add regular expression functions for compatibility with other relational systems (Gilles Darold, Tom Lane) + + + +Specifically, the new functions are regexp_count(), regexp_instr(), regexp_like(), and regexp_substr(). Some new optional arguments were also added to regexp_replace(). + + - - Release 15 + + + + + + +Add the ability to compute the distance between polygons (Tom Lane) + + + + + + + +Add to_char() format codes "of", "tzh", and "tzm" format codes (Nitin Jadhav) + + + +The upper-case versions of these were already supported. + + + + + + + +Improve the optimization of timetz_zone() by stabilizing its value at transaction start (Aleksander Alekseev, Tom Lane) + + + + + + + +Add support for petabyte units to pg_size_pretty() and pg_size_bytes() (David Christensen) + + + + + + + +Change pg_event_trigger_ddl_commands() to output references to non-local temporary schemas using the actual schema name (Tom Lane) + + + +Previously this function referred to temporary schemas as "pg_temp". + + + + + + + JSON + + + + + + + +Add SQL/JSON-standard JSON constructors (Nikita Glukhov) + + + +The construction functions are JSON(), JSON_SCALAR(), and JSON_SERIALIZE(), JSON_ARRAY(), JSON_ARRAYAGG(), JSON_OBJECT(), and JSON_OBJECTAGG(). They have a few functional advantages over the existing JSON functions. + + + + + + + +Add SQL/JSON query functions JSON_EXISTS(), JSON_QUERY(), and JSON_VALUE() (Nikita Glukhov) + + + + + + + +Add JSON predicates to test JSON/JSONB values (Nikita Glukhov) + + + +The clauses are IS JSON [ VALUE | ARRAY | OBJECT | SCALAR | [WITH | WITHOUT ] UNIQUE KEYS ]. + + + + + + + +Add JSON_TABLE function to cause JSON data to be treated as a table (Nikita Glukhov) + + + + + + + + + + + <link linkend="plpgsql">PL/pgSQL</link> + + + + + + + +Fix inforcement of PL/pgSQL variable CONSTANT markings (Tom Lane) + + + +Previously, a variable used as a CALL output parameter or refcursor OPEN variable would not enforce CONSTANT. + + + + + + + + + Client Interfaces + + + + + + + +Allow IP address matching against a server's certificate Subject Alternative Name (Jacob Champion) + + + + + + + +Allow libpq's SSL private to be owned by the root user (David Steele) + + + + + + + +Allow PQsslAttribute() to report the SSL library type without requiring a libpq connection (Jacob Champion) + + + + + + + +Change query cancellations sent by the client to use the same TCP settings as normal client connections (Jelte Fennema) + + + +This allows configured TCP timeouts to apply to query cancel connections. + + + + + + + +Prevent libpq event callback failures from forcing an error result (Tom Lane) + + + + + + + + + Client Applications + + + + + + + +On Unix platforms, have client applications like psql check $HOME for the user's home directory before checking the operating system definition (Anders Kaseorg) + + + + + + + <xref linkend="app-psql"/> + + + + + + + +Improve performance of psql's \copy command (Heikki Linnakangas) + + + + + + + +Add psql command \getenv to assign the value of an environment variable to a psql variable (Tom Lane) + + + + + + + +Add '+' option to psql's \lo_list/\dl to show object privileges (Pavel Luzanov) + + + + + + + +Add psql \dconfig to report server variables (Mark Dilger, Tom Lane) + + + +This is similar to the server-side SHOW command but can process patterns. + + + + + + + +Add pager option for psql's \watch command (Pavel Stehule, Thomas Munro) + + + +This is only supported on Unix, and is controlled by PSQL_WATCH_PAGER. + + + + + + + +Have psql send intra-query double-hyphen comments to the server (Tom Lane, Greg Nancarrow) + + + +Previously such comments were removed from the query before being sent. Double-hyphen comments that are before query text are not sent, and are not recorded as separate psql history entries. + + + + + + + +Adjust psql's readline meta-# to insert a double-hyphen comment marker (Tom Lane) + + + +Previously an unhelpful pound marker was inserted. + + + + + + + +Have psql output all output if multiple queries are passed to the server at once (Fabien Coelho) + + + +This can be disabled setting SHOW_ALL_RESULTS. + + + + + + + +Improve psql's tab completion (Shinya Kato, Dagfinn Ilmari Mannsåker, Peter Smith, Koyu Tanigawa, Ken Kato, David Fetter, Haiying Tang, Peter Eisentraut, Álvaro Herrera, Tom Lane, Masahiko Sawada) + + + + + + + +Limit support of psql to servers running PostgreSQL 9.2 and later (Tom Lane) + + + + + + + + + + + Server Applications + + + + + + + +Add new pg_basebackup option --target to control the base backup location (Robert Haas) + + + +New output options are 'server' to write the backup locally and 'blackhole' to discard the backup (for testing). + + + + + + + +Allow pg_basebackup to decompress LZ4 and ZSTD compressed server-side base backups, and LZ4 and ZSTD compress output files (Dipesh Pandit, Jeevan Ladhe) + + + + + + + +Allow pg_basebackup's --compress option to control the compression method (Michael Paquier, Robert Haas) + + + +New options include "server-gzip" (gzip on the server), "client-gzip" (same as "gzip"). + + + + + + + +Allow pg_basebackup to compress on the server slide and decompress on the client side before storage (Dipesh Pandit) + + + +This is accomplished by specifying compression on the server side and plain output format. + + + + + + + +Add the LZ4 compression method to pg_receivewal (Georgios Kokolatos) + + + +This is enabled via --compression-method=lz4 and requires binaries to be built using --with-lz4. + + + + + + + +Redesign pg_receivewal's compression options (Georgios Kokolatos) + + + +The new --compression-method option controls the type of compression, rather than just relying on --compress. + + + + + + + +Improve pg_receivewal's ability to restart at the proper WAL location (Ronan Dunklau) + + + +Previously, pg_receivewal would start based on the WAL file stored in the local archive directory, or at the sending server's current WAL flush location. With this change, if the sending server is running +Postgres 15 or later, the local archive directory is empty, and a replication slot is specified, the replication slots restart point will be used. + + + + + + + + pg_dump + + + + + + + +Have pg_dump dump "public" schema ownership changes and security labels (Noah Misch) + + + +It also dumps "public" schema comments. + + + + + + + +Improve performance of dumping databases with many objects (Tom Lane) + + + +This will also improve the performance of pg_upgrade. + + + + + + + +Improve the parallel pg_dump performance of TOAST tables (Tom Lane) + + + + + + + +Add dump/restore option --no-table-access-method to force restore to use only the default table access method (Justin Pryzby) + + + +This is for portability in restoring from systems using non-default table access methods. + + + + + + + +Limit support of pg_dump and pg_dumpall to servers running PostgreSQL 9.2 and later (Tom Lane) + + + + + + + + + + pg_upgrade + + + + + + + +Remove status reporting during pg_upgrade operation if the output is not a terminal (Andres Freund) + + + +The status reporting output can be enabled for non-tty usage by using --verbose. + + + + + + + +Have pg_upgrade report all databases with invalid connection settings (Jeevan Ladhe) + + + +Previously only the first invalid connection setting database was reported. + + + + + + + +Store pg_upgrade temporary files in a new cluster subdirectory called "pg_upgrade_output".d (Justin Pryzby) + + + +Previously temporary files were stored in the current directory. + + + + + + + +Have pg_upgrade preserve relfilenodes, tablespace, and database OIDs between old and new clusters (Shruthi KC, Antonin Houska) + + + + + + + +Add a --no-sync option to pg_upgrade (Michael Paquier) + + + +This useful only for testing. + + + + + + + +Limit support of pg_upgrade to old servers running PostgreSQL 9.2 and later (Tom Lane) + + + + + + + + + + pg_waldump + + + + + + + +Allow pg_waldump to be filtered by relation file node, block number, fork number, and full page images (David Christensen, Thomas Munro) + + + + + + + +Have pg_waldump report statistics before an interrupted exit (Bharath Rupireddy) + + + +For example, issuing a control-C in a terminal running "pg_waldump --stats --follow" will report the current statistics before exiting. This does not work on Windows. + + + + + + + +Improve descriptions of some transaction WAL records reported by pg_waldump (Masahiko Sawada, Michael Paquier) + + + + + + + +Allow pg_waldump to dump information about multiple resource managers (Heikki Linnakangas) + + + +This is enabled by specifying the --rmgr option multiple times. + + + + + + + +Add pg_rewind option --config-file to simplify use when server configuration files are stored outside the data directory (Gunnar "Nick" Bluth) + + + + + + + + + + + Documentation + + + + + + + +Add documentation for pg_encoding_to_char() and pg_char_to_encoding() (Ian Lawrence Barwick) + + + + + + + +Add documentation for range_intersect_agg(anymultirange) (Paul Jungwirth) + + + + + + + +Document the ^@ starts-with operator (Tom Lane) + + + + + + + + + Source Code + + + + + + + +Add support for continuous integration testing using cirrus-ci (Andres Freund, Thomas Munro, Melanie Plageman) + + + + + + + +Add configure option --with-zstd to enable ZSTD build (Jeevan Ladhe, Robert Haas, Michael Paquier) + + + + + + + +Add module field which can be customized for non-community PostgreSQL distributions (Peter Eisentraut) + + + +A module field mismatch would generate an error. + + + + + + + +Create a new pg_type.typcategory value for "char" (Tom Lane) + + + +Some internal-use-only types have also been assigned this new pg_type.typcategory. + + + + + + + +Add new protocol message TARGET to specific a new COPY method to be for base backups (Robert Haas) + + + +Modify pg_basebackup to use this method. + + + + + + + +Add new protocol message COMPRESSION and COMPRESSION_DETAIL to specify the compression method and level (Robert Haas) + + + + + + + +Remove server support for old BASE_BACKUP command syntax and base backup protocol (Robert Haas) + + + + + + + +Add support for extensions to set custom backup targets (Robert Haas) + + + + + + + +Add extensions to define their own WAL resource managers (Jeff Davis) + + + + + + + +Automatically export server variables using PGDLLIMPORT on Windows (Robert Haas) + + + +Previously only specific variables where exported. + + + + + + + +Require OpenSSL to build pgcrypto binaries (Peter Eisentraut) + + + + + + + +Disallow building with Python 2 (Andres Freund) + + + + + + + +Adjust configure to require Perl version 5.8.3 or later (Dagfinn Ilmari Mannsåker) + + + + + + + + + Additional Modules + + + + + + + +Add contrib/pg_walinspect (Bharath Rupireddy) + + + +This gives SQL-level output similar to pg_waldump. + + + + + + + +Add contrib module basic_archive to perform archiving via a library (Nathan Bossart) + + + + + + + +Add contrib module 'basebackup_to_shell' as a custom backup target (Robert Haas) +contrib module. + + + + + + + +Add pg_stat_statements output for temporary file block I/O (Masahiko Sawada) + + + + + + + +Add JIT counters to pg_stat_statements (Magnus Hagander) + + + + + + + +Allow amcheck to check sequences (Mark Dilger) + + + + + + + +Improve amcheck sanity checks for TOAST tables (Mark Dilger) + + + + + + + +Allow btree_gist indexes on boolean columns (Emre Hasegeli) + + + +These can be used for exclusion constraints. + + + + + + + +Indicate the permissive/enforcing state in sepgsql log messages (Dave Page) + + + + + + + +Allow pgbench to retry after serialization and deadlock failures (Yugo Nagata, Marina Polyakova) + + + + + + + +Fix pageinspect's page_header() to handle 32 kilobyte page sizes (Quan Zongliang) + + + +Previously improper negative values could be returned in certain cases. + + + + + + + <link linkend="postgres-fdw"><application>postgres_fdw</application></link> + + + + + + + +Allow postgres_fdw to push down CASE expressions (Alexander Pyhalov) + + + + + + + +Add server variable postgres_fdw.application_name to control the application name of postgres_fdw connections (Hayato Kuroda) + + + +Previously the remote application_name could only be set on the remote server or the postgres_fdw connection specification. + + + + + + + +Allow informational escape sequences to be used in postgres_fdw's application name (Hayato Kuroda, Fujii Masao) + + + + + + + +Allow parallel commit on postgres_fdw servers (Etsuro Fujita) + + + +This is enabled with the "parallel_commit" postgres_fdw option. + + + + + + + + + + + + + Acknowledgments - - Release date: - 2022-??-?? - + + The following individuals (in alphabetical order) have contributed + to this release as patch authors, committers, reviewers, testers, + or reporters of issues. + - - This is just a placeholder for now. - + + + + From 3c534949bbb0c7f312175879d1bf7de4f336c6e1 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 10 May 2022 12:51:25 -0400 Subject: [PATCH 623/772] relnotes: "training" -> "trailing" Reported-by: Geoff Winkless Discussion: https://postgr.es/m/CAEzk6fdF_J4jqicLz=FZ6R1u2EjpEtmzD55tFjVbxw-O-kR1=w@mail.gmail.com --- doc/src/sgml/release-15.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/release-15.sgml b/doc/src/sgml/release-15.sgml index eebd17db5e..e6b8509992 100644 --- a/doc/src/sgml/release-15.sgml +++ b/doc/src/sgml/release-15.sgml @@ -230,7 +230,7 @@ Author: Peter Eisentraut -Prevent numeric literals from having non-numeric training characters (Peter Eisentraut) +Prevent numeric literals from having non-numeric trailing characters (Peter Eisentraut) From a9c018565eb306b5a884c31ca6e26efed4dfc774 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 10 May 2022 20:31:13 +0200 Subject: [PATCH 624/772] doc: Update SQL keywords for SQL:2016 technical corrigenda Several keywords were missing or misclassified in the original SQL:2016 standard. This has been corrected in later technical corrigenda. This change updates the PostgreSQL documentation accordingly. This also fixes a mistake in 606948b058d: The keywords JSON_SCALAR and JSON_SERIALIZE added there are not from SQL:2016 but from future SQL:202x, so they don't belong in that list yet. (606948b058d also added JSON to the reserved list, which is what the corrigendum also does, but failed to remove it from the nonreserved list.) --- doc/src/sgml/keywords/sql2016-02-nonreserved.txt | 10 +++++++++- doc/src/sgml/keywords/sql2016-02-reserved.txt | 3 +-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/doc/src/sgml/keywords/sql2016-02-nonreserved.txt b/doc/src/sgml/keywords/sql2016-02-nonreserved.txt index f39e52e475..9edcbce49e 100644 --- a/doc/src/sgml/keywords/sql2016-02-nonreserved.txt +++ b/doc/src/sgml/keywords/sql2016-02-nonreserved.txt @@ -100,7 +100,6 @@ INSTANTIABLE INSTEAD INVOKER ISOLATION -JSON K KEEP KEY @@ -115,6 +114,7 @@ M MAP MATCHED MAXVALUE +MEASURES MESSAGE_LENGTH MESSAGE_OCTET_LENGTH MESSAGE_TEXT @@ -131,10 +131,12 @@ NFD NFKC NFKD NORMALIZED +NULL_ORDERING NULLABLE NULLS NUMBER OBJECT +OCCURRENCE OCTETS OPTION OPTIONS @@ -158,11 +160,14 @@ PASS PASSING PAST PATH +PERMUTE +PIPE PLACING PLAN PLI PRECEDING PRESERVE +PREV PRIOR PRIVATE PRIVILEGES @@ -196,6 +201,7 @@ SCOPE_SCHEMA SECTION SECURITY SELF +SEMANTICS SEQUENCE SERIALIZABLE SERVER_NAME @@ -203,6 +209,7 @@ SESSION SETS SIMPLE SIZE +SORT_DIRECTION SOURCE SPACE SPECIFIC_NAME @@ -232,6 +239,7 @@ UNBOUNDED UNCOMMITTED UNCONDITIONAL UNDER +UNMATCHED UNNAMED USAGE USER_DEFINED_TYPE_CATALOG diff --git a/doc/src/sgml/keywords/sql2016-02-reserved.txt b/doc/src/sgml/keywords/sql2016-02-reserved.txt index 7ba4208398..7e1a5e4d89 100644 --- a/doc/src/sgml/keywords/sql2016-02-reserved.txt +++ b/doc/src/sgml/keywords/sql2016-02-reserved.txt @@ -1,4 +1,5 @@ ABS +ABSENT ACOS ALL ALLOCATE @@ -163,8 +164,6 @@ JSON_EXISTS JSON_OBJECT JSON_OBJECTAGG JSON_QUERY -JSON_SCALAR -JSON_SERIALIZE JSON_TABLE JSON_TABLE_PRIMITIVE JSON_VALUE From 93e6892f6717d5777c9decef301728e8bb3f011b Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 10 May 2022 20:57:37 +0200 Subject: [PATCH 625/772] Remove some tabs in SQL code in C string literals This is not handled uniformly throughout the code, but at least nearby code can be consistent. --- src/bin/psql/describe.c | 42 ++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 4369f2235b..31df8b759c 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -2934,29 +2934,29 @@ describeOneTableDetails(const char *schemaname, { printfPQExpBuffer(&buf, "SELECT pubname\n" - " , NULL\n" - " , NULL\n" + " , NULL\n" + " , NULL\n" "FROM pg_catalog.pg_publication p\n" - " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" - " JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid\n" + " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" + " JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid\n" "WHERE pc.oid ='%s' and pg_catalog.pg_relation_is_publishable('%s')\n" "UNION\n" "SELECT pubname\n" - " , pg_get_expr(pr.prqual, c.oid)\n" - " , (CASE WHEN pr.prattrs IS NOT NULL THEN\n" - " (SELECT string_agg(attname, ', ')\n" - " FROM pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,\n" - " pg_catalog.pg_attribute\n" - " WHERE attrelid = pr.prrelid AND attnum = prattrs[s])\n" - " ELSE NULL END) " + " , pg_get_expr(pr.prqual, c.oid)\n" + " , (CASE WHEN pr.prattrs IS NOT NULL THEN\n" + " (SELECT string_agg(attname, ', ')\n" + " FROM pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,\n" + " pg_catalog.pg_attribute\n" + " WHERE attrelid = pr.prrelid AND attnum = prattrs[s])\n" + " ELSE NULL END) " "FROM pg_catalog.pg_publication p\n" - " JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n" - " JOIN pg_catalog.pg_class c ON c.oid = pr.prrelid\n" + " JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n" + " JOIN pg_catalog.pg_class c ON c.oid = pr.prrelid\n" "WHERE pr.prrelid = '%s'\n" "UNION\n" "SELECT pubname\n" - " , NULL\n" - " , NULL\n" + " , NULL\n" + " , NULL\n" "FROM pg_catalog.pg_publication p\n" "WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n" "ORDER BY 1;", @@ -2966,15 +2966,15 @@ describeOneTableDetails(const char *schemaname, { printfPQExpBuffer(&buf, "SELECT pubname\n" - " , NULL\n" - " , NULL\n" + " , NULL\n" + " , NULL\n" "FROM pg_catalog.pg_publication p\n" "JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n" "WHERE pr.prrelid = '%s'\n" "UNION ALL\n" "SELECT pubname\n" - " , NULL\n" - " , NULL\n" + " , NULL\n" + " , NULL\n" "FROM pg_catalog.pg_publication p\n" "WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n" "ORDER BY 1;", @@ -4940,8 +4940,8 @@ listSchemas(const char *pattern, bool verbose, bool showSystem) printfPQExpBuffer(&buf, "SELECT pubname \n" "FROM pg_catalog.pg_publication p\n" - " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" - " JOIN pg_catalog.pg_namespace n ON n.oid = pn.pnnspid \n" + " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" + " JOIN pg_catalog.pg_namespace n ON n.oid = pn.pnnspid \n" "WHERE n.nspname = '%s'\n" "ORDER BY 1", pattern); From 9700b250c5b84a083261add9f6e3507c9c72e076 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 10 May 2022 21:15:56 +0200 Subject: [PATCH 626/772] Formatting and punctuation improvements in sample configuration files --- contrib/basic_archive/basic_archive.conf | 4 ++-- src/backend/utils/misc/postgresql.conf.sample | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contrib/basic_archive/basic_archive.conf b/contrib/basic_archive/basic_archive.conf index db029f4b8e..7c82a4b82b 100644 --- a/contrib/basic_archive/basic_archive.conf +++ b/contrib/basic_archive/basic_archive.conf @@ -1,4 +1,4 @@ -archive_mode = 'on' +archive_mode = on archive_library = 'basic_archive' basic_archive.archive_directory = '.' -wal_level = 'replica' +wal_level = replica diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 94270eb0ec..a5a6d14cd4 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -449,7 +449,7 @@ # logging_collector to be on. # This is used when logging to stderr: -#logging_collector = off # Enable capturing of stderr, jsonlog +#logging_collector = off # Enable capturing of stderr, jsonlog, # and csvlog into log files. Required # to be on for csvlogs and jsonlogs. # (change requires restart) @@ -536,9 +536,9 @@ # statements from all transactions, 0.0 never logs #log_startup_progress_interval = 10s # Time between progress updates for - # long-running startup operations. - # 0 disables the feature, > 0 indicates - # the interval in milliseconds. + # long-running startup operations. + # 0 disables the feature, > 0 indicates + # the interval in milliseconds. # - What to Log - From 9d89bb8a025d0374f7705cea9fead4eae9ae80ed Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 10 May 2022 16:05:12 -0400 Subject: [PATCH 627/772] relnote: extensive updates Reported-by: Erik Rijkers, Justin Pryzby Discussion: https://postgr.es/m/20220510180935.GB19626@telsasoft.com --- doc/src/sgml/release-15.sgml | 126 +++++++++++++++++------------------ 1 file changed, 61 insertions(+), 65 deletions(-) diff --git a/doc/src/sgml/release-15.sgml b/doc/src/sgml/release-15.sgml index e6b8509992..213ec926f9 100644 --- a/doc/src/sgml/release-15.sgml +++ b/doc/src/sgml/release-15.sgml @@ -88,7 +88,7 @@ Remove exclusive backup mode (David Steele, Nathan Bossart) -This mode could cause server startup failure if the database server stopped abruptly while in this mode. The non-exclusive backup mode requires a continuous database connection during the backup. +If the database server stops abruptly while in this mode, the server could fail to start. The non-exclusive backup mode requires a continuous database connection during the backup. @@ -138,21 +138,6 @@ Author: Tom Lane 2021-11-06 [cbe25dcff] Disallow making an empty lexeme via array_to_tsvector(). --> - - -Allow tsvector_delete_arr() and tsvector_setweight_by_filter() accept empty array elements (Jean-Christophe Arnu) - - - -These lexemes are not stored so the acceptance of empty array elements is not a problem. - - - - - Generate an error if array_to_tsvector() is passed an empty array element (Jean-Christophe Arnu) @@ -249,7 +234,7 @@ Adjust JSON numeric literal processing to match the SQL/JSON-standard (Peter Eis -This accepts numeric formats like ".1" and "1.", and disallow trailing junk after numeric literals, like "1.type()". +This accepts numeric formats like ".1" and "1.", and disallows trailing junk after numeric literals, like "1.type()". @@ -309,7 +294,7 @@ Prevent logical replication into tables where the subscription owner is subject -This effectively means that only super users, roles with bypassrls, and table owners can replicate into tables with row-level security policies. (The actual row-level security policies are not checked, +This effectively means that only superusers, roles with bypassrls, and table owners can replicate into tables with row-level security policies. (The actual row-level security policies are not checked, only whether row-level security policies are enforced for subscribing users.) @@ -402,7 +387,7 @@ Improve the algorithm used to compute random() (Fabien Coelho) -This will cause setseed() followed by random() to return a different value on older servers. +This will cause setseed() followed by random() to return a different value than on older servers. @@ -678,7 +663,7 @@ Allow unique constraints and indexes to treat NULL values as not distinct (Peter -The Postgres default has always been to treat NULL indexed values as distinct, but this can now be changed by creating constraints and indexes using UNIQUE NULLS NOT DISTINCT. +Previously NULL values were always indexed as distinct values, but this can now be changed by creating constraints and indexes using UNIQUE NULLS NOT DISTINCT. @@ -713,11 +698,11 @@ Author: Tomas Vondra -Have extended statistics track statistics for a table's children separately (Tomas Vondra, Justin Pryzby) +Allow extended statistics to record statistics for a parent with all it children (Tomas Vondra, Justin Pryzby) -Regular statistics already tracked child and non-child statistics separately. +Regular statistics already tracked parent and parent/all-children statistics separately. @@ -799,7 +784,7 @@ Author: Michael Paquier -Allow WAL full page writes to use LZ4 and ZSTD compression (Andrey Borodin, Justin Pryzby) +Allow WAL full page writes to use LZ4 and Zstandard compression (Andrey Borodin, Justin Pryzby) @@ -1016,7 +1001,7 @@ Allow members of the pg_write_server_files predefined role to perform server-sid -Previously only the super users could perform such backups. +Previously only the superusers could perform such backups. @@ -1046,7 +1031,7 @@ Allow members of the pg_checkpointer predefined role to run the CHECKPOINT comma -Previously these views could only be run by super users. +Previously checkpoints could only be run by superusers. @@ -1061,7 +1046,7 @@ Allow members of the pg_read_all_stats predefined role to access the views pg_ba -Previously these views could only be run by super users. +Previously these views could only be accessed by superusers. @@ -1076,7 +1061,7 @@ Allow GRANT to assign permissions on pg_log_backend_memory_contexts() (Jeff Davi -Previously this function could only be run by super users. +Previously this function could only be run by superusers. @@ -1130,7 +1115,7 @@ Allow "postgres -C" to properly report runtime-computed values (Nathan Bossart) -Previously runtime-computed values data_checksums, wal_segment_size, and data_directory_mode would report values that would not be accurate on the running server. They also can only be +Previously runtime-computed values data_checksums, wal_segment_size, and data_directory_mode would report values that would not be accurate on the running server. @@ -1143,17 +1128,6 @@ Author: Michael Paquier Add function pg_settings_get_flags() to get the flags of server-side variables (Justin Pryzby) - - - - - - -Add server variable allow_in_place_tablespaces for tablespace testing (Thomas Munro) - @@ -1178,7 +1152,7 @@ Author: Robert Haas -Add support for LZ4 and ZSTD compression of server-side base backups (Jeevan Ladhe, Robert Haas) +Add support for LZ4 and Zstandard compression of server-side base backups (Jeevan Ladhe, Robert Haas) @@ -1456,7 +1430,7 @@ Add support for HEADER option in COPY text format (Rémi Lapeyre) -The new options causes the column names to be output, and optionally verified on input. +The new option causes the column names to be output, and optionally verified on input. @@ -1508,7 +1482,7 @@ Allow foreign key ON DELETE SET actions to affect only specified columns (Paul M -Previously, all of the columns in the foreign key were always effected. +Previously, all of the columns in the foreign key were always affected. @@ -1523,7 +1497,7 @@ When EXPLAIN references the temporary object schema, refer to it as "pg_temp" (A -Previous the actual schema name was used. +Previously the actual schema name was used. @@ -1704,6 +1678,21 @@ Improve the optimization of timetz_zone() by stabilizing its value at transactio + + + + +Allow tsvector_delete_arr() and tsvector_setweight_by_filter() to accept empty array elements (Jean-Christophe Arnu) + + + +These lexemes are not stored so the acceptance of empty array elements is not a problem. + + + + + + +Add server variable allow_in_place_tablespaces for tablespace testing (Thomas Munro) @@ -2644,7 +2640,7 @@ Author: Robert Haas -Automatically export server variables using PGDLLIMPORT on Windows (Robert Haas) +Export all server variables using PGDLLIMPORT on Windows (Robert Haas) @@ -2891,7 +2887,7 @@ Allow parallel commit on postgres_fdw servers (Etsuro Fujita) -This is enabled with the "parallel_commit" postgres_fdw option. +This is enabled with the CREATE SERVER option "parallel_commit" when using postgres_fdw. From 653443ed83f03820d29604b65dca6a56f3f8ab06 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 10 May 2022 16:34:11 -0400 Subject: [PATCH 628/772] relnotes: remove sequence replication and update 'postgres -C' Reported-by: Nathan Bossart, Jonathan Katz Discussion: https://postgr.es/m/20220510194456.GA3716556@nathanxps13 --- doc/src/sgml/release-15.sgml | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/doc/src/sgml/release-15.sgml b/doc/src/sgml/release-15.sgml index 213ec926f9..8355bf4827 100644 --- a/doc/src/sgml/release-15.sgml +++ b/doc/src/sgml/release-15.sgml @@ -1115,7 +1115,7 @@ Allow "postgres -C" to properly report runtime-computed values (Nathan Bossart) -Previously runtime-computed values data_checksums, wal_segment_size, and data_directory_mode would report values that would not be accurate on the running server. +Previously runtime-computed values data_checksums, wal_segment_size, and data_directory_mode would report values that would not be accurate on the running server. However, this does not work on a running server. @@ -1270,21 +1270,6 @@ Allow publications to be restricted to specific columns (Tomas Vondra, Álvaro H - - - - -Allow logical replication to transfer sequence changes (Tomas Vondra, Cary Huang) - - - -The sequence option must be specified in the publication. A new system view pg_publication_sequences shows published sequences. - - - + + + +Improve the performance of spinlocks on high-core-count ARM64 systems (Geoffrey Blake) + From b0d4b3c386f5372474575a4eeba2450951d9b44a Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 10 May 2022 17:49:51 -0400 Subject: [PATCH 630/772] relnotes: adjust sections for various items Also improve postgres_fdw.application_name Reported-by: Justin Pryzby, Tatsuo Ishii Diagnosed-by: 20220510210235.GD19626@telsasoft.com --- doc/src/sgml/release-15.sgml | 127 ++++++++++++++++------------------- 1 file changed, 59 insertions(+), 68 deletions(-) diff --git a/doc/src/sgml/release-15.sgml b/doc/src/sgml/release-15.sgml index c9ea7c9fed..dc626adb9d 100644 --- a/doc/src/sgml/release-15.sgml +++ b/doc/src/sgml/release-15.sgml @@ -253,6 +253,21 @@ Some platforms disallowed trailing periods. + + + + +When specifying fractional interval values in units greater than months, round to the nearest month (Bruce Momjian) + + + +For example, report '1.99 years' as '2 years', not '1 year 11 months'. + + + + + + +When EXPLAIN references the temporary object schema, refer to it as "pg_temp" (Amul Sul) + + + +Previously the actual schema name was used. + + + - - - -Add function pg_settings_get_flags() to get the flags of server-side variables (Justin Pryzby) - @@ -1478,21 +1497,6 @@ Previously, all of the columns in the foreign key were always affected. - - - - -When EXPLAIN references the temporary object schema, refer to it as "pg_temp" (Amul Sul) - - - -Previously the actual schema name was used. - - - - - - -When specifying fractional interval values in units greater than months, round to the nearest month (Bruce Momjian) - - - -For example, report '1.99 years' as '2 years', not '1 year 11 months'. - - - + + + +Allow pgbench to retry after serialization and deadlock failures (Yugo Nagata, Marina Polyakova) + @@ -2614,6 +2614,17 @@ Allow extensions to define their own WAL resource managers (Jeff Davis) + + + + +Add function pg_settings_get_flags() to get the flags of server-side variables (Justin Pryzby) + + + - - - -Allow pgbench to retry after serialization and deadlock failures (Yugo Nagata, Marina Polyakova) - - - - - - -Add server variable postgres_fdw.application_name to control the application name of postgres_fdw connections (Hayato Kuroda) - - - -Previously the remote application_name could only be set on the remote server or the postgres_fdw connection specification. - - - - - - - -Allow libpq's SSL private key file to be owned by the root user (David Steele) - - - + + + +Improve performance and reduce memory consumption of in-memory sorts (Ronan Dunklau, David Rowley, Thomas Munro) + + + - - - -Remove unused function parameter in get_qual_from_partbound() (Hou Zhijie) - - - - - - -Create unlogged sequences and allow them to be skipped in logical replication (Peter Eisentraut) - - - + + + +Create unlogged sequences and allow them to be skipped in logical replication (Peter Eisentraut) + + + - - - -Improve sorting performance (Heikki Linnakangas) - - - -Specifically, switch to a batch sorting algorithm that uses more output streams internally. - - - + + + +Improve performance for sorts that exceed work_mem (Heikki Linnakangas) + + + +Specifically, switch to a batch sorting algorithm that uses more output streams internally. + + + - - - -Add SQL functions to monitor the directory contents of replication slots (Bharath Rupireddy) - - - -Specifically, the functions are pg_ls_logicalsnapdir(), pg_ls_logicalmapdir(), and pg_ls_replslotdir(). They can be run by members of the predefined pg_monitor role. - - - + + + +Add SQL functions to monitor the directory contents of logical replication slots (Bharath Rupireddy) + + + +Specifically, the functions are pg_ls_logicalsnapdir(), pg_ls_logicalmapdir(), and pg_ls_replslotdir(). They can be run by members of the predefined pg_monitor role. + + + + + + + + + +Allow subscribers to stop logical replication application on error (Osumi Takamichi, Mark Dilger) + + + +This is enabled with the subscriber option "disable_on_error" and avoids possible infinite loops during stream application. + + + - -SASL Authentication - - -SASL is a framework for authentication in connection-oriented -protocols. At the moment, PostgreSQL implements two SASL -authentication mechanisms, SCRAM-SHA-256 and SCRAM-SHA-256-PLUS. More -might be added in the future. The below steps illustrate how SASL -authentication is performed in general, while the next subsection gives -more details on SCRAM-SHA-256 and SCRAM-SHA-256-PLUS. - - - -SASL Authentication Message Flow - - - - To begin a SASL authentication exchange, the server sends an - AuthenticationSASL message. It includes a list of SASL authentication - mechanisms that the server can accept, in the server's preferred order. - - - - - - The client selects one of the supported mechanisms from the list, and sends - a SASLInitialResponse message to the server. The message includes the name - of the selected mechanism, and an optional Initial Client Response, if the - selected mechanism uses that. - - - - - - One or more server-challenge and client-response message will follow. Each - server-challenge is sent in an AuthenticationSASLContinue message, followed - by a response from client in a SASLResponse message. The particulars of - the messages are mechanism specific. - - - - - - Finally, when the authentication exchange is completed successfully, the - server sends an AuthenticationSASLFinal message, followed - immediately by an AuthenticationOk message. The AuthenticationSASLFinal - contains additional server-to-client data, whose content is particular to the - selected authentication mechanism. If the authentication mechanism doesn't - use additional data that's sent at completion, the AuthenticationSASLFinal - message is not sent. - - - - - -On error, the server can abort the authentication at any stage, and send an -ErrorMessage. - - - - SCRAM-SHA-256 Authentication + + SASL Authentication - The implemented SASL mechanisms at the moment - are SCRAM-SHA-256 and its variant with channel - binding SCRAM-SHA-256-PLUS. They are described in - detail in RFC 7677 - and RFC 5802. + SASL is a framework for authentication in connection-oriented + protocols. At the moment, PostgreSQL implements two SASL + authentication mechanisms, SCRAM-SHA-256 and SCRAM-SHA-256-PLUS. More + might be added in the future. The below steps illustrate how SASL + authentication is performed in general, while the next subsection gives + more details on SCRAM-SHA-256 and SCRAM-SHA-256-PLUS. - -When SCRAM-SHA-256 is used in PostgreSQL, the server will ignore the user name -that the client sends in the client-first-message. The user name -that was already sent in the startup message is used instead. -PostgreSQL supports multiple character encodings, while SCRAM -dictates UTF-8 to be used for the user name, so it might be impossible to -represent the PostgreSQL user name in UTF-8. - + + SASL Authentication Message Flow - -The SCRAM specification dictates that the password is also in UTF-8, and is -processed with the SASLprep algorithm. -PostgreSQL, however, does not require UTF-8 to be used for -the password. When a user's password is set, it is processed with SASLprep -as if it was in UTF-8, regardless of the actual encoding used. However, if -it is not a legal UTF-8 byte sequence, or it contains UTF-8 byte sequences -that are prohibited by the SASLprep algorithm, the raw password will be used -without SASLprep processing, instead of throwing an error. This allows the -password to be normalized when it is in UTF-8, but still allows a non-UTF-8 -password to be used, and doesn't require the system to know which encoding -the password is in. - + + + To begin a SASL authentication exchange, the server sends an + AuthenticationSASL message. It includes a list of SASL authentication + mechanisms that the server can accept, in the server's preferred order. + + - -Channel binding is supported in PostgreSQL builds with -SSL support. The SASL mechanism name for SCRAM with channel binding is -SCRAM-SHA-256-PLUS. The channel binding type used by -PostgreSQL is tls-server-end-point. - + + + The client selects one of the supported mechanisms from the list, and sends + a SASLInitialResponse message to the server. The message includes the name + of the selected mechanism, and an optional Initial Client Response, if the + selected mechanism uses that. + + - - In SCRAM without channel binding, the server chooses - a random number that is transmitted to the client to be mixed with the - user-supplied password in the transmitted password hash. While this - prevents the password hash from being successfully retransmitted in - a later session, it does not prevent a fake server between the real - server and client from passing through the server's random value - and successfully authenticating. - + + + One or more server-challenge and client-response message will follow. Each + server-challenge is sent in an AuthenticationSASLContinue message, followed + by a response from client in a SASLResponse message. The particulars of + the messages are mechanism specific. + + + + + + Finally, when the authentication exchange is completed successfully, the + server sends an AuthenticationSASLFinal message, followed + immediately by an AuthenticationOk message. The AuthenticationSASLFinal + contains additional server-to-client data, whose content is particular to the + selected authentication mechanism. If the authentication mechanism doesn't + use additional data that's sent at completion, the AuthenticationSASLFinal + message is not sent. + + + - SCRAM with channel binding prevents such - man-in-the-middle attacks by mixing the signature of the server's - certificate into the transmitted password hash. While a fake server can - retransmit the real server's certificate, it doesn't have access to the - private key matching that certificate, and therefore cannot prove it is - the owner, causing SSL connection failure. + On error, the server can abort the authentication at any stage, and send an + ErrorMessage. - -Example - - - The server sends an AuthenticationSASL message. It includes a list of - SASL authentication mechanisms that the server can accept. - This will be SCRAM-SHA-256-PLUS - and SCRAM-SHA-256 if the server is built with SSL - support, or else just the latter. - - - - - The client responds by sending a SASLInitialResponse message, which - indicates the chosen mechanism, SCRAM-SHA-256 or - SCRAM-SHA-256-PLUS. (A client is free to choose either - mechanism, but for better security it should choose the channel-binding - variant if it can support it.) In the Initial Client response field, the - message contains the SCRAM client-first-message. - The client-first-message also contains the channel - binding type chosen by the client. - - - - - Server sends an AuthenticationSASLContinue message, with a SCRAM - server-first-message as the content. - - - - - Client sends a SASLResponse message, with SCRAM - client-final-message as the content. - - - - - Server sends an AuthenticationSASLFinal message, with the SCRAM - server-final-message, followed immediately by - an AuthenticationOk message. - - - - - + + SCRAM-SHA-256 Authentication - -Streaming Replication Protocol - - -To initiate streaming replication, the frontend sends the -replication parameter in the startup message. A Boolean -value of true (or on, -yes, 1) tells the backend to go into -physical replication walsender mode, wherein a small set of replication -commands, shown below, can be issued instead of SQL statements. - - - -Passing database as the value for the -replication parameter instructs the backend to go into -logical replication walsender mode, connecting to the database specified in -the dbname parameter. In logical replication walsender -mode, the replication commands shown below as well as normal SQL commands can -be issued. - - - -In either physical replication or logical replication walsender mode, only the -simple query protocol can be used. - - - - For the purpose of testing replication commands, you can make a replication - connection via psql or any other - libpq-using tool with a connection string including - the replication option, - e.g.: - -psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" - - However, it is often more useful to use - (for physical replication) or - (for logical replication). - - - -Replication commands are logged in the server log when - is enabled. - - - -The commands accepted in replication mode are: - - - IDENTIFY_SYSTEM - IDENTIFY_SYSTEM - - - - Requests the server to identify itself. Server replies with a result - set of a single row, containing four fields: - + + The implemented SASL mechanisms at the moment + are SCRAM-SHA-256 and its variant with channel + binding SCRAM-SHA-256-PLUS. They are described in + detail in RFC 7677 + and RFC 5802. + - - - - - systemid (text) - - - - The unique system identifier identifying the cluster. This - can be used to check that the base backup used to initialize the - standby came from the same cluster. - - - + + When SCRAM-SHA-256 is used in PostgreSQL, the server will ignore the user name + that the client sends in the client-first-message. The user name + that was already sent in the startup message is used instead. + PostgreSQL supports multiple character encodings, while SCRAM + dictates UTF-8 to be used for the user name, so it might be impossible to + represent the PostgreSQL user name in UTF-8. + - - - timeline (int4) - - - - Current timeline ID. Also useful to check that the standby is - consistent with the primary. - - - + + The SCRAM specification dictates that the password is also in UTF-8, and is + processed with the SASLprep algorithm. + PostgreSQL, however, does not require UTF-8 to be used for + the password. When a user's password is set, it is processed with SASLprep + as if it was in UTF-8, regardless of the actual encoding used. However, if + it is not a legal UTF-8 byte sequence, or it contains UTF-8 byte sequences + that are prohibited by the SASLprep algorithm, the raw password will be used + without SASLprep processing, instead of throwing an error. This allows the + password to be normalized when it is in UTF-8, but still allows a non-UTF-8 + password to be used, and doesn't require the system to know which encoding + the password is in. + - - - xlogpos (text) - - - - Current WAL flush location. Useful to get a known location in the - write-ahead log where streaming can start. - - - + + Channel binding is supported in PostgreSQL builds with + SSL support. The SASL mechanism name for SCRAM with channel binding is + SCRAM-SHA-256-PLUS. The channel binding type used by + PostgreSQL is tls-server-end-point. + - - - dbname (text) - - - - Database connected to or null. - - - + + In SCRAM without channel binding, the server chooses + a random number that is transmitted to the client to be mixed with the + user-supplied password in the transmitted password hash. While this + prevents the password hash from being successfully retransmitted in + a later session, it does not prevent a fake server between the real + server and client from passing through the server's random value + and successfully authenticating. + - - - - + + SCRAM with channel binding prevents such + man-in-the-middle attacks by mixing the signature of the server's + certificate into the transmitted password hash. While a fake server can + retransmit the real server's certificate, it doesn't have access to the + private key matching that certificate, and therefore cannot prove it is + the owner, causing SSL connection failure. + - - SHOW name - SHOW - - + + Example + - Requests the server to send the current setting of a run-time parameter. - This is similar to the SQL command . + The server sends an AuthenticationSASL message. It includes a list of + SASL authentication mechanisms that the server can accept. + This will be SCRAM-SHA-256-PLUS + and SCRAM-SHA-256 if the server is built with SSL + support, or else just the latter. + - - - name - - - The name of a run-time parameter. Available parameters are documented - in . - - - - - - - - - TIMELINE_HISTORY tli - TIMELINE_HISTORY - - + - Requests the server to send over the timeline history file for timeline - tli. Server replies with a - result set of a single row, containing two fields. While the fields - are labeled as text, they effectively return raw bytes, - with no encoding conversion: + The client responds by sending a SASLInitialResponse message, which + indicates the chosen mechanism, SCRAM-SHA-256 or + SCRAM-SHA-256-PLUS. (A client is free to choose either + mechanism, but for better security it should choose the channel-binding + variant if it can support it.) In the Initial Client response field, the + message contains the SCRAM client-first-message. + The client-first-message also contains the channel + binding type chosen by the client. + + - - - - filename (text) - - - - File name of the timeline history file, e.g., 00000002.history. - - - - - - - content (text) - - - - Contents of the timeline history file. - - - + Server sends an AuthenticationSASLContinue message, with a SCRAM + server-first-message as the content. + + - + + + Client sends a SASLResponse message, with SCRAM + client-final-message as the content. - - + - - CREATE_REPLICATION_SLOT slot_name [ TEMPORARY ] { PHYSICAL | LOGICAL } [ ( option [, ...] ) ] - CREATE_REPLICATION_SLOT - - + - Create a physical or logical replication - slot. See for more about - replication slots. + Server sends an AuthenticationSASLFinal message, with the SCRAM + server-final-message, followed immediately by + an AuthenticationOk message. - - - slot_name - - - The name of the slot to create. Must be a valid replication slot - name (see ). - - - + + + + - - output_plugin - - - The name of the output plugin used for logical decoding - (see ). - - - + + Streaming Replication Protocol - - TEMPORARY - - - Specify that this replication slot is a temporary one. Temporary - slots are not saved to disk and are automatically dropped on error - or when the session has finished. - - - - + + To initiate streaming replication, the frontend sends the + replication parameter in the startup message. A Boolean + value of true (or on, + yes, 1) tells the backend to go into + physical replication walsender mode, wherein a small set of replication + commands, shown below, can be issued instead of SQL statements. + + + + Passing database as the value for the + replication parameter instructs the backend to go into + logical replication walsender mode, connecting to the database specified in + the dbname parameter. In logical replication walsender + mode, the replication commands shown below as well as normal SQL commands can + be issued. + - The following options are supported: + + In either physical replication or logical replication walsender mode, only the + simple query protocol can be used. + - - - TWO_PHASE [ boolean ] - - - If true, this logical replication slot supports decoding of two-phase - transactions. With this option, two-phase commands like - PREPARE TRANSACTION, COMMIT PREPARED - and ROLLBACK PREPARED are decoded and transmitted. - The transaction will be decoded and transmitted at - PREPARE TRANSACTION time. - The default is false. - - - + + For the purpose of testing replication commands, you can make a replication + connection via psql or any other + libpq-using tool with a connection string including + the replication option, + e.g.: + +psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" + + However, it is often more useful to use + (for physical replication) or + (for logical replication). + - - RESERVE_WAL [ boolean ] - - - If true, this physical replication slot reserves WAL - immediately. Otherwise, WAL is only reserved upon - connection from a streaming replication client. - The default is false. - - - + + Replication commands are logged in the server log when + is enabled. + - - SNAPSHOT { 'export' | 'use' | 'nothing' } - - - Decides what to do with the snapshot created during logical slot - initialization. 'export', which is the default, - will export the snapshot for use in other sessions. This option can't - be used inside a transaction. 'use' will use the - snapshot for the current transaction executing the command. This - option must be used in a transaction, and - CREATE_REPLICATION_SLOT must be the first command - run in that transaction. Finally, 'nothing' will - just use the snapshot for logical decoding as normal but won't do - anything else with it. - - - - + + The commands accepted in replication mode are: - - In response to this command, the server will send a one-row result set - containing the following fields: + + + IDENTIFY_SYSTEM + IDENTIFY_SYSTEM + + + + Requests the server to identify itself. Server replies with a result + set of a single row, containing four fields: + - slot_name (text) + systemid (text) - The name of the newly-created replication slot. + The unique system identifier identifying the cluster. This + can be used to check that the base backup used to initialize the + standby came from the same cluster. - consistent_point (text) + timeline (int4) - The WAL location at which the slot became consistent. This is the - earliest location from which streaming can start on this replication - slot. + Current timeline ID. Also useful to check that the standby is + consistent with the primary. - snapshot_name (text) + xlogpos (text) - The identifier of the snapshot exported by the command. The - snapshot is valid until a new command is executed on this connection - or the replication connection is closed. Null if the created slot - is physical. + Current WAL flush location. Useful to get a known location in the + write-ahead log where streaming can start. - output_plugin (text) + dbname (text) - The name of the output plugin used by the newly-created replication - slot. Null if the created slot is physical. + Database connected to or null. - - - + + - - CREATE_REPLICATION_SLOT slot_name [ TEMPORARY ] { PHYSICAL [ RESERVE_WAL ] | LOGICAL output_plugin [ EXPORT_SNAPSHOT | NOEXPORT_SNAPSHOT | USE_SNAPSHOT | TWO_PHASE ] } - - - - For compatibility with older releases, this alternative syntax for - the CREATE_REPLICATION_SLOT command is still supported. - - - + + SHOW name + SHOW + + + + Requests the server to send the current setting of a run-time parameter. + This is similar to the SQL command . + - - READ_REPLICATION_SLOT slot_name - READ_REPLICATION_SLOT - - - - Read some information associated with a replication slot. Returns a tuple - with NULL values if the replication slot does not - exist. This command is currently only supported for physical replication - slots. - - - In response to this command, the server will return a one-row result set, - containing the following fields: - slot_type (text) + name - The replication slot's type, either physical or - NULL. + The name of a run-time parameter. Available parameters are documented + in . + + + + + + TIMELINE_HISTORY tli + TIMELINE_HISTORY + + + + Requests the server to send over the timeline history file for timeline + tli. Server replies with a + result set of a single row, containing two fields. While the fields + are labeled as text, they effectively return raw bytes, + with no encoding conversion: + + - restart_lsn (text) + filename (text) - The replication slot's restart_lsn. + File name of the timeline history file, e.g., 00000002.history. - restart_tli (int8) + content (text) - The timeline ID associated with restart_lsn, - following the current timeline history. + Contents of the timeline history file. - - - + + - - START_REPLICATION [ SLOT slot_name ] [ PHYSICAL ] XXX/XXX [ TIMELINE tli ] - START_REPLICATION - - - - Instructs server to start streaming WAL, starting at - WAL location XXX/XXX. - If TIMELINE option is specified, - streaming starts on timeline tli; - otherwise, the server's current timeline is selected. The server can - reply with an error, for example if the requested section of WAL has already - been recycled. On success, the server responds with a CopyBothResponse - message, and then starts to stream WAL to the frontend. - + + CREATE_REPLICATION_SLOT slot_name [ TEMPORARY ] { PHYSICAL | LOGICAL } [ ( option [, ...] ) ] + CREATE_REPLICATION_SLOT + + + + Create a physical or logical replication + slot. See for more about + replication slots. + - - If a slot's name is provided - via slot_name, it will be updated - as replication progresses so that the server knows which WAL segments, - and if hot_standby_feedback is on which transactions, - are still needed by the standby. - + + + slot_name + + + The name of the slot to create. Must be a valid replication slot + name (see ). + + + - - If the client requests a timeline that's not the latest but is part of - the history of the server, the server will stream all the WAL on that - timeline starting from the requested start point up to the point where - the server switched to another timeline. If the client requests - streaming at exactly the end of an old timeline, the server skips COPY - mode entirely. - + + output_plugin + + + The name of the output plugin used for logical decoding + (see ). + + + - - After streaming all the WAL on a timeline that is not the latest one, - the server will end streaming by exiting the COPY mode. When the client - acknowledges this by also exiting COPY mode, the server sends a result - set with one row and two columns, indicating the next timeline in this - server's history. The first column is the next timeline's ID (type int8), and the - second column is the WAL location where the switch happened (type text). Usually, - the switch position is the end of the WAL that was streamed, but there - are corner cases where the server can send some WAL from the old - timeline that it has not itself replayed before promoting. Finally, the - server sends two CommandComplete messages (one that ends the CopyData - and the other ends the START_REPLICATION itself), and - is ready to accept a new command. - + + TEMPORARY + + + Specify that this replication slot is a temporary one. Temporary + slots are not saved to disk and are automatically dropped on error + or when the session has finished. + + + + - - WAL data is sent as a series of CopyData messages. (This allows - other information to be intermixed; in particular the server can send - an ErrorResponse message if it encounters a failure after beginning - to stream.) The payload of each CopyData message from server to the - client contains a message of one of the following formats: - + The following options are supported: - - - - - XLogData (B) - - - - - - Byte1('w') - - - - Identifies the message as WAL data. - - - - - - Int64 - - - - The starting point of the WAL data in this message. - - - - - - Int64 - - - - The current end of WAL on the server. - - + + TWO_PHASE [ boolean ] + + + If true, this logical replication slot supports decoding of two-phase + transactions. With this option, two-phase commands like + PREPARE TRANSACTION, COMMIT PREPARED + and ROLLBACK PREPARED are decoded and transmitted. + The transaction will be decoded and transmitted at + PREPARE TRANSACTION time. + The default is false. + + + + + + RESERVE_WAL [ boolean ] + + + If true, this physical replication slot reserves WAL + immediately. Otherwise, WAL is only reserved upon + connection from a streaming replication client. + The default is false. + + + + + + SNAPSHOT { 'export' | 'use' | 'nothing' } + + + Decides what to do with the snapshot created during logical slot + initialization. 'export', which is the default, + will export the snapshot for use in other sessions. This option can't + be used inside a transaction. 'use' will use the + snapshot for the current transaction executing the command. This + option must be used in a transaction, and + CREATE_REPLICATION_SLOT must be the first command + run in that transaction. Finally, 'nothing' will + just use the snapshot for logical decoding as normal but won't do + anything else with it. + + + + + + + In response to this command, the server will send a one-row result set + containing the following fields: + + + + slot_name (text) + + + The name of the newly-created replication slot. + + + + + + consistent_point (text) + + + The WAL location at which the slot became consistent. This is the + earliest location from which streaming can start on this replication + slot. + + + + + + snapshot_name (text) + + + The identifier of the snapshot exported by the command. The + snapshot is valid until a new command is executed on this connection + or the replication connection is closed. Null if the created slot + is physical. + + + + + + output_plugin (text) + + + The name of the output plugin used by the newly-created replication + slot. Null if the created slot is physical. + + + + + + + + + + CREATE_REPLICATION_SLOT slot_name [ TEMPORARY ] { PHYSICAL [ RESERVE_WAL ] | LOGICAL output_plugin [ EXPORT_SNAPSHOT | NOEXPORT_SNAPSHOT | USE_SNAPSHOT | TWO_PHASE ] } + + + + For compatibility with older releases, this alternative syntax for + the CREATE_REPLICATION_SLOT command is still supported. + + + + + + READ_REPLICATION_SLOT slot_name + READ_REPLICATION_SLOT + + + + Read some information associated with a replication slot. Returns a tuple + with NULL values if the replication slot does not + exist. This command is currently only supported for physical replication + slots. + + + + In response to this command, the server will return a one-row result set, + containing the following fields: + + + slot_type (text) + + + The replication slot's type, either physical or + NULL. + + + + + + restart_lsn (text) + + + The replication slot's restart_lsn. + + + + + + restart_tli (int8) + + + The timeline ID associated with restart_lsn, + following the current timeline history. + + + + + + + + + + START_REPLICATION [ SLOT slot_name ] [ PHYSICAL ] XXX/XXX [ TIMELINE tli ] + START_REPLICATION + + + + Instructs server to start streaming WAL, starting at + WAL location XXX/XXX. + If TIMELINE option is specified, + streaming starts on timeline tli; + otherwise, the server's current timeline is selected. The server can + reply with an error, for example if the requested section of WAL has already + been recycled. On success, the server responds with a CopyBothResponse + message, and then starts to stream WAL to the frontend. + + + + If a slot's name is provided + via slot_name, it will be updated + as replication progresses so that the server knows which WAL segments, + and if hot_standby_feedback is on which transactions, + are still needed by the standby. + + + + If the client requests a timeline that's not the latest but is part of + the history of the server, the server will stream all the WAL on that + timeline starting from the requested start point up to the point where + the server switched to another timeline. If the client requests + streaming at exactly the end of an old timeline, the server skips COPY + mode entirely. + + + + After streaming all the WAL on a timeline that is not the latest one, + the server will end streaming by exiting the COPY mode. When the client + acknowledges this by also exiting COPY mode, the server sends a result + set with one row and two columns, indicating the next timeline in this + server's history. The first column is the next timeline's ID (type int8), and the + second column is the WAL location where the switch happened (type text). Usually, + the switch position is the end of the WAL that was streamed, but there + are corner cases where the server can send some WAL from the old + timeline that it has not itself replayed before promoting. Finally, the + server sends two CommandComplete messages (one that ends the CopyData + and the other ends the START_REPLICATION itself), and + is ready to accept a new command. + + + + WAL data is sent as a series of CopyData messages. (This allows + other information to be intermixed; in particular the server can send + an ErrorResponse message if it encounters a failure after beginning + to stream.) The payload of each CopyData message from server to the + client contains a message of one of the following formats: + + + + + XLogData (B) + + + + Byte1('w') + + + Identifies the message as WAL data. + + + + + + Int64 + + + The starting point of the WAL data in this message. + + + + + + Int64 + + + The current end of WAL on the server. + + + + + + Int64 + + + The server's system clock at the time of transmission, as + microseconds since midnight on 2000-01-01. + + + + + + Byten + + + A section of the WAL data stream. + + + + 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. + + + + + + + + + Primary keepalive message (B) + + + + Byte1('k') + + + Identifies the message as a sender keepalive. + + + + + + Int64 + + + The current end of WAL on the server. + + + + + + Int64 + + + The server's system clock at the time of transmission, as + microseconds since midnight on 2000-01-01. + + + + + + Byte1 + + + 1 means that the client should reply to this message as soon as + possible, to avoid a timeout disconnect. 0 otherwise. + + + + + + + + + + The receiving process can send replies back to the sender at any time, + using one of the following message formats (also in the payload of a + CopyData message): + + + + + Standby status update (F) + + + + Byte1('r') + + + Identifies the message as a receiver status update. + + + + + + Int64 + + + The location of the last WAL byte + 1 received and written to disk + in the standby. + + + + + + Int64 + + + The location of the last WAL byte + 1 flushed to disk in + the standby. + + + + + + Int64 + + + The location of the last WAL byte + 1 applied in the standby. + + + + + + Int64 + + + The client's system clock at the time of transmission, as + microseconds since midnight on 2000-01-01. + + + + + + Byte1 + + + If 1, the client requests the server to reply to this message + immediately. This can be used to ping the server, to test if + the connection is still healthy. + + + + + + + + + Hot standby feedback message (F) + + + + Byte1('h') + + + Identifies the message as a hot standby feedback message. + + + + + + Int64 + + + The client's system clock at the time of transmission, as + microseconds since midnight on 2000-01-01. + + + + + + Int32 + + + The standby's current global xmin, excluding the catalog_xmin from any + replication slots. If both this value and the following + catalog_xmin are 0 this is treated as a notification that hot standby + feedback will no longer be sent on this connection. Later non-zero + messages may reinitiate the feedback mechanism. + + + + + + Int32 + + + The epoch of the global xmin xid on the standby. + + + + + + Int32 + + + The lowest catalog_xmin of any replication slots on the standby. Set to 0 + if no catalog_xmin exists on the standby or if hot standby feedback is being + disabled. + + + + + + Int32 + + + The epoch of the catalog_xmin xid on the standby. + + + + + + + + + + + + START_REPLICATION SLOT slot_name LOGICAL XXX/XXX [ ( option_name [ option_value ] [, ...] ) ] + + + Instructs server to start streaming WAL for logical replication, + starting at either WAL location XXX/XXX or the slot's + confirmed_flush_lsn (see ), whichever is greater. This + behavior makes it easier for clients to avoid updating their local LSN + status when there is no data to process. However, starting at a + different LSN than requested might not catch certain kinds of client + errors; so the client may wish to check that + confirmed_flush_lsn matches its expectations before + issuing START_REPLICATION. + + + + The server can reply with an error, for example if the + slot does not exist. On success, the server responds with a CopyBothResponse + message, and then starts to stream WAL to the frontend. + + + + The messages inside the CopyBothResponse messages are of the same format + documented for START_REPLICATION ... PHYSICAL, including + two CommandComplete messages. + + + + The output plugin associated with the selected slot is used + to process the output for streaming. + + + + + SLOT slot_name + + + The name of the slot to stream changes from. This parameter is required, + and must correspond to an existing logical replication slot created + with CREATE_REPLICATION_SLOT in + LOGICAL mode. + + + + + + XXX/XXX + + + The WAL location to begin streaming at. + + + + + + option_name + + + The name of an option passed to the slot's logical decoding plugin. + + + + + + option_value + + + Optional value, in the form of a string constant, associated with the + specified option. + + + + + + + + + + DROP_REPLICATION_SLOT slot_name WAIT + DROP_REPLICATION_SLOT + + + + Drops a replication slot, freeing any reserved server-side resources. + If the slot is a logical slot that was created in a database other than + the database the walsender is connected to, this command fails. + + + + + slot_name + + + The name of the slot to drop. + + + + + + WAIT + + + This option causes the command to wait if the slot is active until + it becomes inactive, instead of the default behavior of raising an + error. + + + + + + + + + BASE_BACKUP [ ( option [, ...] ) ] + BASE_BACKUP + + + + Instructs the server to start streaming a base backup. + The system will automatically be put in backup mode before the backup + is started, and taken out of it when the backup is complete. The + following options are accepted: + + + + LABEL 'label' + + + Sets the label of the backup. If none is specified, a backup label + of base backup will be used. The quoting rules + for the label are the same as a standard SQL string with + turned on. + + + + + + TARGET 'target' + + + Tells the server where to send the backup. If the target is + client, which is the default, the backup data is + sent to the client. If it is server, the backup + data is written to the server at the pathname specified by the + TARGET_DETAIL option. If it is + blackhole, the backup data is not sent + anywhere; it is simply discarded. + + + + The server target requires superuser privilege or + being granted the pg_write_server_files role. + + + + + + TARGET_DETAIL 'detail' + + + Provides additional information about the backup target. + + + + Currently, this option can only be used when the backup target is + server. It specifies the server directory + to which the backup should be written. + + + + + + PROGRESS [ boolean ] + + + If set to true, request information required to generate a progress + report. This will send back an approximate size in the header of each + tablespace, which can be used to calculate how far along the stream + is done. This is calculated by enumerating all the file sizes once + before the transfer is even started, and might as such have a + negative impact on the performance. In particular, it might take + longer before the first data + is streamed. Since the database files can change during the backup, + the size is only approximate and might both grow and shrink between + the time of approximation and the sending of the actual files. + The default is false. + + + + + + CHECKPOINT { 'fast' | 'spread' } + + + Sets the type of checkpoint to be performed at the beginning of the + base backup. The default is spread. + + + + + + WAL [ boolean ] + + + If set to true, include the necessary WAL segments in the backup. + This will include all the files between start and stop backup in the + pg_wal directory of the base directory tar + file. The default is false. + + + + + + WAIT [ boolean ] + + + If set to true, the backup will wait until the last required WAL + segment has been archived, or emit a warning if log archiving is + not enabled. If false, the backup will neither wait nor warn, + leaving the client responsible for ensuring the required log is + available. The default is true. + + + + + + COMPRESSION 'method' + + + Instructs the server to compress the backup using the specified + method. Currently, the supported methods are gzip, + lz4, and zstd. + + + + + + COMPRESSION_DETAIL detail + + + Specifies details for the chosen compression method. This should only + be used in conjunction with the COMPRESSION + option. If the value is an integer, it specifies the compression + level. Otherwise, it should be a comma-separated list of items, + each of the form keyword or + keyword=value. Currently, the supported keywords + are level and workers. + + + + The level keyword sets the compression level. + For gzip the compression level should be an + integer between 1 and 9, for lz4 an integer + between 1 and 12, and for zstd an integer + between 1 and 22. + + + + The workers keyword sets the number of threads + that should be used for parallel compression. Parallel compression + is supported only for zstd. + + + + + + MAX_RATE rate + + + Limit (throttle) the maximum amount of data transferred from server + to client per unit of time. The expected unit is kilobytes per second. + If this option is specified, the value must either be equal to zero + or it must fall within the range from 32 kB through 1 GB (inclusive). + If zero is passed or the option is not specified, no restriction is + imposed on the transfer. + + + + + + TABLESPACE_MAP [ boolean ] + + + If true, include information about symbolic links present in the + directory pg_tblspc in a file named + tablespace_map. The tablespace map file includes + each symbolic link name as it exists in the directory + pg_tblspc/ and the full path of that symbolic link. + The default is false. + + + + + + VERIFY_CHECKSUMS [ boolean ] + + + If true, checksums are verified during a base backup if they are + enabled. If false, this is skipped. The default is true. + + + + + + MANIFEST manifest_option + + + When this option is specified with a value of yes + or force-encode, a backup manifest is created + and sent along with the backup. The manifest is a list of every + file present in the backup with the exception of any WAL files that + may be included. It also stores the size, last modification time, and + optionally a checksum for each file. + A value of force-encode forces all filenames + to be hex-encoded; otherwise, this type of encoding is performed only + for files whose names are non-UTF8 octet sequences. + force-encode is intended primarily for testing + purposes, to be sure that clients which read the backup manifest + can handle this case. For compatibility with previous releases, + the default is MANIFEST 'no'. + + + + + + MANIFEST_CHECKSUMS checksum_algorithm + + + Specifies the checksum algorithm that should be applied to each file included + in the backup manifest. Currently, the available + algorithms are NONE, CRC32C, + SHA224, SHA256, + SHA384, and SHA512. + The default is CRC32C. + + + + + + + + When the backup is started, the server will first send two + ordinary result sets, followed by one or more CopyOutResponse + results. + + + + The first ordinary result set contains the starting position of the + backup, in a single row with two columns. The first column contains + the start position given in XLogRecPtr format, and the second column + contains the corresponding timeline ID. + + + + The second ordinary result set has one row for each tablespace. + The fields in this row are: + + + + spcoid (oid) + + + The OID of the tablespace, or null if it's the base + directory. + + + + + + spclocation (text) + + + The full path of the tablespace directory, or null + if it's the base directory. + + + + + + size (int8) + + + The approximate size of the tablespace, in kilobytes (1024 bytes), + if progress report has been requested; otherwise it's null. + + + + + + + + After the second regular result set, a CopyOutResponse will be sent. + The payload of each CopyData message will contain a message in one of + the following formats: + + + + + new archive (B) + + + + Byte1('n') + + Identifes the messaage as indicating the start of a new archive. + There will be one archive for the main data directory and one + for each additional tablespace; each will use tar format + (following the ustar interchange format specified + in the POSIX 1003.1-2008 standard). + + + + + String + + The file name for this archive. + + + + + String + + For the main data directory, an empty string. For other + tablespaces, the full path to the directory from which this + archive was created. + + + + + + + + manifest (B) + + + + Byte1('m') + + Identifes the message as indicating the start of the backup + manifest. + + + + + + + + archive or manifest data (B) + + + + Byte1('d') + + Identifes the message as containing archive or manifest data. + + + + + Byten + + Data bytes. + + + + + + + + progress report (B) + + + + Byte1('p') + + Identifes the message as a progress report. + + + + + Int64 + + The number of bytes from the current tablespace for which + processing has been completed. + + + + + + + + + After the CopyOutResponse, or all such responses, have been sent, a + final ordinary result set will be sent, containing the WAL end position + of the backup, in the same format as the start position. + + + + The tar archive for the data directory and each tablespace will contain + all files in the directories, regardless of whether they are + PostgreSQL files or other files added to the same + directory. The only excluded files are: + + + + + postmaster.pid + + + + + postmaster.opts + + + + + pg_internal.init (found in multiple directories) + + + + + Various temporary files and directories created during the operation + of the PostgreSQL server, such as any file or directory beginning + with pgsql_tmp and temporary relations. + + + + + Unlogged relations, except for the init fork which is required to + recreate the (empty) unlogged relation on recovery. + + + + + pg_wal, including subdirectories. If the backup is run + with WAL files included, a synthesized version of pg_wal will be + included, but it will only contain the files necessary for the + backup to work, not the rest of the contents. + + + + + pg_dynshmem, pg_notify, + pg_replslot, pg_serial, + pg_snapshots, pg_stat_tmp, and + pg_subtrans are copied as empty directories (even if + they are symbolic links). + + + + + Files other than regular files and directories, such as symbolic + links (other than for the directories listed above) and special + device files, are skipped. (Symbolic links + in pg_tblspc are maintained.) + + + + Owner, group, and file mode are set if the underlying file system on + the server supports it. + + + + + + + + + Logical Streaming Replication Protocol + + + This section describes the logical replication protocol, which is the message + flow started by the START_REPLICATION + SLOT slot_name + LOGICAL replication command. + + + + The logical streaming replication protocol builds on the primitives of + the physical streaming replication protocol. + + + + Logical Streaming Replication Parameters + + + The logical replication START_REPLICATION command + accepts following parameters: + + + + + proto_version + + + + Protocol version. Currently versions 1, 2, + and 3 are supported. + + + Version 2 is supported only for server version 14 + and above, and it allows streaming of large in-progress transactions. + + + Version 3 is supported only for server version 15 + and above, and it allows streaming of two-phase transactions. + + + + + + + publication_names + + + + Comma separated list of publication names for which to subscribe + (receive changes). The individual publication names are treated + as standard objects names and can be quoted the same as needed. + + + + + + + + + + Logical Replication Protocol Messages + + + The individual protocol messages are discussed in the following + subsections. Individual messages are described in + . + + + + All top-level protocol messages begin with a message type byte. + While represented in code as a character, this is a signed byte with no + associated encoding. + + + + Since the streaming replication protocol supplies a message length there + is no need for top-level protocol messages to embed a length in their + header. + + + + + + Logical Replication Protocol Message Flow + + + With the exception of the START_REPLICATION command and + the replay progress messages, all information flows only from the backend + to the frontend. + + + + The logical replication protocol sends individual transactions one by one. + This means that all messages between a pair of Begin and Commit messages + belong to the same transaction. Similarly, all messages between a pair of + Begin Prepare and Prepare messages belong to the same transaction. + It also sends changes of large in-progress transactions between a pair of + Stream Start and Stream Stop messages. The last stream of such a transaction + contains a Stream Commit or Stream Abort message. + + + + Every sent transaction contains zero or more DML messages (Insert, + Update, Delete). In case of a cascaded setup it can also contain Origin + messages. The origin message indicates that the transaction originated on + different replication node. Since a replication node in the scope of logical + replication protocol can be pretty much anything, the only identifier + is the origin name. It's downstream's responsibility to handle this as + needed (if needed). The Origin message is always sent before any DML + messages in the transaction. + + + + Every DML message contains a relation OID, identifying the publisher's + relation that was acted on. Before the first DML message for a given + relation OID, a Relation message will be sent, describing the schema of + that relation. Subsequently, a new Relation message will be sent if + the relation's definition has changed since the last Relation message + was sent for it. (The protocol assumes that the client is capable of + remembering this metadata for as many relations as needed.) + + + + Relation messages identify column types by their OIDs. In the case + of a built-in type, it is assumed that the client can look up that + type OID locally, so no additional data is needed. For a non-built-in + type OID, a Type message will be sent before the Relation message, + to provide the type name associated with that OID. Thus, a client that + needs to specifically identify the types of relation columns should + cache the contents of Type messages, and first consult that cache to + see if the type OID is defined there. If not, look up the type OID + locally. + + + + + + Message Data Types + + + This section describes the base data types used in messages. + + + + + Intn(i) + + + An n-bit integer in network byte + order (most significant byte first). + If i is specified it + is the exact value that will appear, otherwise the value + is variable. Eg. Int16, Int32(42). + + + + + + Intn[k] + + + An array of k + n-bit integers, each in network + byte order. The array length k + is always determined by an earlier field in the message. + Eg. Int16[M]. + + + + + + String(s) + + + A null-terminated string (C-style string). There is no + specific length limitation on strings. + If s is specified it is the exact + value that will appear, otherwise the value is variable. + Eg. String, String("user"). + + + + + There is no predefined limit on the length of a string + that can be returned by the backend. Good coding strategy for a frontend + is to use an expandable buffer so that anything that fits in memory can be + accepted. If that's not feasible, read the full string and discard trailing + characters that don't fit into your fixed-size buffer. + + + + + + + Byten(c) + + + Exactly n bytes. If the field + width n is not a constant, it is + always determinable from an earlier field in the message. + If c is specified it is the exact + value. Eg. Byte2, Byte1('\n'). + + + + + + + + Message Formats + + + This section describes the detailed format of each message. Each is marked to + indicate that it can be sent by a frontend (F), a backend (B), or both + (F & B). + Notice that although each message includes a byte count at the beginning, + the message format is defined so that the message end can be found without + reference to the byte count. This aids validity checking. (The CopyData + message is an exception, because it forms part of a data stream; the contents + of any individual CopyData message cannot be interpretable on their own.) + + + + + AuthenticationOk (B) + + + + Byte1('R') + + + Identifies the message as an authentication request. + + + + + + Int32(8) + + + Length of message contents in bytes, including self. + + + + + + Int32(0) + + + Specifies that the authentication was successful. + + + + + + + + + AuthenticationKerberosV5 (B) + + + + + Byte1('R') + + + Identifies the message as an authentication request. + + + + + + Int32(8) + + + Length of message contents in bytes, including self. + + + + + + Int32(2) + + + Specifies that Kerberos V5 authentication is required. + + + + + + + + + AuthenticationCleartextPassword (B) + + + + + Byte1('R') + + + Identifies the message as an authentication request. + + + + + + Int32(8) + + + Length of message contents in bytes, including self. + + + + + + Int32(3) + + + Specifies that a clear-text password is required. + + + + + + + + + AuthenticationMD5Password (B) + + + + Byte1('R') + + + Identifies the message as an authentication request. + + + + + + Int32(12) + + + Length of message contents in bytes, including self. + + + + + + Int32(5) + + + Specifies that an MD5-encrypted password is required. + + + + + + Byte4 + + + The salt to use when encrypting the password. + + + + + + + + + AuthenticationSCMCredential (B) + + + + Byte1('R') + + + Identifies the message as an authentication request. + + + + + + Int32(8) + + + Length of message contents in bytes, including self. + + + + + + Int32(6) + + + Specifies that an SCM credentials message is required. + + + + + + + + + AuthenticationGSS (B) + + + + Byte1('R') + + + Identifies the message as an authentication request. + + + + + Int32(8) + + + Length of message contents in bytes, including self. + + + + + + Int32(7) + + + Specifies that GSSAPI authentication is required. + + + + + + + + + AuthenticationGSSContinue (B) + + + + Byte1('R') + + + Identifies the message as an authentication request. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int32(8) + + + Specifies that this message contains GSSAPI or SSPI data. + + + + + + Byten + + + GSSAPI or SSPI authentication data. + + + + + + + + + AuthenticationSSPI (B) + + + + Byte1('R') + + + Identifies the message as an authentication request. + + + + + + Int32(8) + + + Length of message contents in bytes, including self. + + + + + + Int32(9) + + + Specifies that SSPI authentication is required. + + + + + + + + + AuthenticationSASL (B) + + + + Byte1('R') + + + Identifies the message as an authentication request. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int32(10) + + + Specifies that SASL authentication is required. + + + + + + + The message body is a list of SASL authentication mechanisms, in the + server's order of preference. A zero byte is required as terminator after + the last authentication mechanism name. For each mechanism, there is the + following: + + + + String + + + Name of a SASL authentication mechanism. + + + + + + + + + + AuthenticationSASLContinue (B) + + + + Byte1('R') + + + Identifies the message as an authentication request. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int32(11) + + + Specifies that this message contains a SASL challenge. + + + + + + Byten + + + SASL data, specific to the SASL mechanism being used. + + + + + + + + + AuthenticationSASLFinal (B) + + + + Byte1('R') + + + Identifies the message as an authentication request. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int32(12) + + + Specifies that SASL authentication has completed. + + + + + + Byten + + + SASL outcome "additional data", specific to the SASL mechanism + being used. + + + + + + + + + BackendKeyData (B) + + + + Byte1('K') + + + Identifies the message as cancellation key data. + The frontend must save these values if it wishes to be + able to issue CancelRequest messages later. + + + + + + Int32(12) + + + Length of message contents in bytes, including self. + + + + + + Int32 + + + The process ID of this backend. + + + + + + Int32 + + + The secret key of this backend. + + + + + + + + + Bind (F) + + + + Byte1('B') + + + Identifies the message as a Bind command. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + String + + + The name of the destination portal + (an empty string selects the unnamed portal). + + + + + + String + + + The name of the source prepared statement + (an empty string selects the unnamed prepared statement). + + + + + + Int16 + + + The number of parameter format codes that follow + (denoted C below). + This can be zero to indicate that there are no parameters + or that the parameters all use the default format (text); + or one, in which case the specified format code is applied + to all parameters; or it can equal the actual number of + parameters. + + + + + + Int16[C] + + + The parameter format codes. Each must presently be + zero (text) or one (binary). + + + + + + Int16 + + + The number of parameter values that follow (possibly zero). + This must match the number of parameters needed by the query. + + + + + + + Next, the following pair of fields appear for each parameter: + + + + + Int32 + + + The length of the parameter value, in bytes (this count + does not include itself). Can be zero. + As a special case, -1 indicates a NULL parameter value. + No value bytes follow in the NULL case. + + + + + + Byten + + + The value of the parameter, in the format indicated by the + associated format code. + n is the above length. + + + + + + + After the last parameter, the following fields appear: + + + + + Int16 + + + The number of result-column format codes that follow + (denoted R below). + This can be zero to indicate that there are no result columns + or that the result columns should all use the default format + (text); + or one, in which case the specified format code is applied + to all result columns (if any); or it can equal the actual + number of result columns of the query. + + + + + + Int16[R] + + + The result-column format codes. Each must presently be + zero (text) or one (binary). + + + + + + + + + BindComplete (B) + + + + Byte1('2') + + + Identifies the message as a Bind-complete indicator. + + + + + + Int32(4) + + + Length of message contents in bytes, including self. + + + + + + + + + + CancelRequest (F) + + + + Int32(16) + + + Length of message contents in bytes, including self. + + + + + + Int32(80877102) + + + The cancel request code. The value is chosen to contain + 1234 in the most significant 16 bits, and 5678 in the + least significant 16 bits. (To avoid confusion, this code + must not be the same as any protocol version number.) + + + + + + Int32 + + + The process ID of the target backend. + + + + + + Int32 + + + The secret key for the target backend. + + + + + + + + + Close (F) + + + + Byte1('C') + + + Identifies the message as a Close command. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Byte1 + + + 'S' to close a prepared statement; or + 'P' to close a portal. + + + + + + String + + + The name of the prepared statement or portal to close + (an empty string selects the unnamed prepared statement + or portal). + + + + + + + + + CloseComplete (B) + + + + Byte1('3') + + + Identifies the message as a Close-complete indicator. + + + + + + Int32(4) + + + Length of message contents in bytes, including self. + + + + + + + + + CommandComplete (B) + + + + Byte1('C') + + + Identifies the message as a command-completed response. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + String + + + The command tag. This is usually a single + word that identifies which SQL command was completed. + + + + For an INSERT command, the tag is + INSERT oid + rows, where + rows is the number of rows + inserted. oid used to be the object ID + of the inserted row if rows was 1 + and the target table had OIDs, but OIDs system columns are + not supported anymore; therefore oid + is always 0. + + + + For a DELETE command, the tag is + DELETE rows where + rows is the number of rows deleted. + + + + For an UPDATE command, the tag is + UPDATE rows where + rows is the number of rows updated. + + + + For a SELECT or CREATE TABLE AS + command, the tag is SELECT rows + where rows is the number of rows retrieved. + + + + For a MOVE command, the tag is + MOVE rows where + rows is the number of rows the + cursor's position has been changed by. + + + + For a FETCH command, the tag is + FETCH rows where + rows is the number of rows that + have been retrieved from the cursor. + + + + For a COPY command, the tag is + COPY rows where + rows is the number of rows copied. + (Note: the row count appears only in + PostgreSQL 8.2 and later.) + + + + + + + + + CopyData (F & B) + + + + Byte1('d') + + + Identifies the message as COPY data. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Byten + + + Data that forms part of a COPY data stream. Messages sent + from the backend will always correspond to single data rows, + but messages sent by frontends might divide the data stream + arbitrarily. + + + + + + + + + CopyDone (F & B) + + + + Byte1('c') + + + Identifies the message as a COPY-complete indicator. + + + + + + Int32(4) + + + Length of message contents in bytes, including self. + + + + + + + + + CopyFail (F) + + + + Byte1('f') + + + Identifies the message as a COPY-failure indicator. + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + String + + + An error message to report as the cause of failure. + + + + + + + + + CopyInResponse (B) + + + + Byte1('G') + + + Identifies the message as a Start Copy In response. + The frontend must now send copy-in data (if not + prepared to do so, send a CopyFail message). + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int8 + + + 0 indicates the overall COPY format is textual (rows + separated by newlines, columns separated by separator + characters, etc). + 1 indicates the overall copy format is binary (similar + to DataRow format). + See + for more information. + + + + + + Int16 + + + The number of columns in the data to be copied + (denoted N below). + + + + + + Int16[N] + + + The format codes to be used for each column. + Each must presently be zero (text) or one (binary). + All must be zero if the overall copy format is textual. + + + + + + + + + CopyOutResponse (B) + + + + Byte1('H') + + + Identifies the message as a Start Copy Out response. + This message will be followed by copy-out data. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int8 + + + 0 indicates the overall COPY format + is textual (rows separated by newlines, columns + separated by separator characters, etc). 1 indicates + the overall copy format is binary (similar to DataRow + format). See for more information. + + + + + + Int16 + + + The number of columns in the data to be copied + (denoted N below). + + + + + + Int16[N] + + + The format codes to be used for each column. + Each must presently be zero (text) or one (binary). + All must be zero if the overall copy format is textual. + + + + + + + + + CopyBothResponse (B) + + + + Byte1('W') + + + Identifies the message as a Start Copy Both response. + This message is used only for Streaming Replication. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int8 + + + 0 indicates the overall COPY format + is textual (rows separated by newlines, columns + separated by separator characters, etc). 1 indicates + the overall copy format is binary (similar to DataRow + format). See for more information. + + + + + + Int16 + + + The number of columns in the data to be copied + (denoted N below). + + + + + + Int16[N] + + + The format codes to be used for each column. + Each must presently be zero (text) or one (binary). + All must be zero if the overall copy format is textual. + + + + + + + + + DataRow (B) + + + + Byte1('D') + + + Identifies the message as a data row. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int16 + + + The number of column values that follow (possibly zero). + + + + + + + Next, the following pair of fields appear for each column: + + + + + Int32 + + + The length of the column value, in bytes (this count + does not include itself). Can be zero. + As a special case, -1 indicates a NULL column value. + No value bytes follow in the NULL case. + + + + + + Byten + + + The value of the column, in the format indicated by the + associated format code. + n is the above length. + + + + + + + + + Describe (F) + + + + Byte1('D') + + + Identifies the message as a Describe command. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Byte1 + + + 'S' to describe a prepared statement; or + 'P' to describe a portal. + + + + + + String + + + The name of the prepared statement or portal to describe + (an empty string selects the unnamed prepared statement + or portal). + + + + + + + + + EmptyQueryResponse (B) + + + + Byte1('I') + + + Identifies the message as a response to an empty query string. + (This substitutes for CommandComplete.) + + + + + + Int32(4) + + + Length of message contents in bytes, including self. + + + + + + + + + ErrorResponse (B) + + + + Byte1('E') + + + Identifies the message as an error. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + + The message body consists of one or more identified fields, + followed by a zero byte as a terminator. Fields can appear in + any order. For each field there is the following: + + + + + Byte1 + + + A code identifying the field type; if zero, this is + the message terminator and no string follows. + The presently defined field types are listed in + . + Since more field types might be added in future, + frontends should silently ignore fields of unrecognized + type. + + + + + + String + + + The field value. + + + + + + + + + Execute (F) + + + + Byte1('E') + + + Identifies the message as an Execute command. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + String + + + The name of the portal to execute + (an empty string selects the unnamed portal). + + + + + + Int32 + + + Maximum number of rows to return, if portal contains + a query that returns rows (ignored otherwise). Zero + denotes no limit. + + + + + + + + + Flush (F) + + + + Byte1('H') + + + Identifies the message as a Flush command. + + + + + + Int32(4) + + + Length of message contents in bytes, including self. + + + + + + + + + FunctionCall (F) + + + + Byte1('F') + + + Identifies the message as a function call. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int32 + + + Specifies the object ID of the function to call. + + + + + + Int16 + + + The number of argument format codes that follow + (denoted C below). + This can be zero to indicate that there are no arguments + or that the arguments all use the default format (text); + or one, in which case the specified format code is applied + to all arguments; or it can equal the actual number of + arguments. + + + + + + Int16[C] + + + The argument format codes. Each must presently be + zero (text) or one (binary). + + + + + + Int16 + + + Specifies the number of arguments being supplied to the + function. + + + + + + + Next, the following pair of fields appear for each argument: + + + + + Int32 + + + The length of the argument value, in bytes (this count + does not include itself). Can be zero. + As a special case, -1 indicates a NULL argument value. + No value bytes follow in the NULL case. + + + + + + Byten + + + The value of the argument, in the format indicated by the + associated format code. + n is the above length. + + + + + + + After the last argument, the following field appears: + + + + + Int16 + + + The format code for the function result. Must presently be + zero (text) or one (binary). + + + + + + + + + FunctionCallResponse (B) + + + + Byte1('V') + + + Identifies the message as a function call result. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int32 + + + The length of the function result value, in bytes (this count + does not include itself). Can be zero. + As a special case, -1 indicates a NULL function result. + No value bytes follow in the NULL case. + + + + + + Byten + + + The value of the function result, in the format indicated by + the associated format code. + n is the above length. + + + + + + + + + GSSENCRequest (F) + + + + Int32(8) + + + Length of message contents in bytes, including self. + + + + + + Int32(80877104) + + + The GSSAPI Encryption request code. The value is chosen to contain + 1234 in the most significant 16 bits, and 5680 in the + least significant 16 bits. (To avoid confusion, this code + must not be the same as any protocol version number.) + + + + + + + + + GSSResponse (F) + + + + Byte1('p') + + + Identifies the message as a GSSAPI or SSPI response. Note that + this is also used for SASL and password response messages. + The exact message type can be deduced from the context. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Byten + + + GSSAPI/SSPI specific message data. + + + + + + + + + NegotiateProtocolVersion (B) + + + + Byte1('v') + + + Identifies the message as a protocol version negotiation + message. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int32 + + + Newest minor protocol version supported by the server + for the major protocol version requested by the client. + + + + + + Int32 + + + Number of protocol options not recognized by the server. + + + + + + + Then, for protocol option not recognized by the server, there + is the following: + + + + + String + + + The option name. + + + + + + + + + NoData (B) + + + + Byte1('n') + + + Identifies the message as a no-data indicator. + + + + + + Int32(4) + + + Length of message contents in bytes, including self. + + + + + + + + + NoticeResponse (B) + + + + Byte1('N') + + + Identifies the message as a notice. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + + The message body consists of one or more identified fields, + followed by a zero byte as a terminator. Fields can appear in + any order. For each field there is the following: + + + + + Byte1 + + + A code identifying the field type; if zero, this is + the message terminator and no string follows. + The presently defined field types are listed in + . + Since more field types might be added in future, + frontends should silently ignore fields of unrecognized + type. + + + + + + String + + + The field value. + + + + + + + + + NotificationResponse (B) + + + + Byte1('A') + + + Identifies the message as a notification response. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int32 + + + The process ID of the notifying backend process. + + + + + + String + + + The name of the channel that the notify has been raised on. + + + + + + String + + + The payload string passed from the notifying process. + + + + + + + + + ParameterDescription (B) + + + + Byte1('t') + + + Identifies the message as a parameter description. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int16 + + + The number of parameters used by the statement + (can be zero). + + + + + + + Then, for each parameter, there is the following: + + + + + Int32 + + + Specifies the object ID of the parameter data type. + + + + + + + + + ParameterStatus (B) + + + + Byte1('S') + + + Identifies the message as a run-time parameter status report. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + String + + + The name of the run-time parameter being reported. + + + + + + String + + + The current value of the parameter. + + + + + + + + + Parse (F) + + + + Byte1('P') + + + Identifies the message as a Parse command. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + String + + + The name of the destination prepared statement + (an empty string selects the unnamed prepared statement). + + + + + + String + + + The query string to be parsed. + + + + + + Int16 + + + The number of parameter data types specified + (can be zero). Note that this is not an indication of + the number of parameters that might appear in the + query string, only the number that the frontend wants to + prespecify types for. + + + + + + + Then, for each parameter, there is the following: + + + + + Int32 + + + Specifies the object ID of the parameter data type. + Placing a zero here is equivalent to leaving the type + unspecified. + + + + + + + + + ParseComplete (B) + + + + Byte1('1') + + + Identifies the message as a Parse-complete indicator. + + + + + + Int32(4) + + + Length of message contents in bytes, including self. + + + + + + + + + PasswordMessage (F) + + + + Byte1('p') + + + Identifies the message as a password response. Note that + this is also used for GSSAPI, SSPI and SASL response messages. + The exact message type can be deduced from the context. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + String + + + The password (encrypted, if requested). + + + + + + + + + PortalSuspended (B) + + + + Byte1('s') + + + Identifies the message as a portal-suspended indicator. + Note this only appears if an Execute message's row-count limit + was reached. + + + + + + Int32(4) + + + Length of message contents in bytes, including self. + + + + + + + + + Query (F) + + + + Byte1('Q') + + + Identifies the message as a simple query. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + String + + + The query string itself. + + + + + + + + + ReadyForQuery (B) + + + + Byte1('Z') + + + Identifies the message type. ReadyForQuery is sent + whenever the backend is ready for a new query cycle. + + + + + + Int32(5) + + + Length of message contents in bytes, including self. + + + + + + Byte1 + + + Current backend transaction status indicator. + Possible values are 'I' if idle (not in + a transaction block); 'T' if in a transaction + block; or 'E' if in a failed transaction + block (queries will be rejected until block is ended). + + + + + + + + + RowDescription (B) + + + + Byte1('T') + + + Identifies the message as a row description. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int16 + + + Specifies the number of fields in a row (can be zero). + + + + + + + Then, for each field, there is the following: + + + + + String + + + The field name. + + + + + + Int32 + + + If the field can be identified as a column of a specific + table, the object ID of the table; otherwise zero. + + + + + + Int16 + + + If the field can be identified as a column of a specific + table, the attribute number of the column; otherwise zero. + + + + + + Int32 + + + The object ID of the field's data type. + + + + + + Int16 + + + The data type size (see pg_type.typlen). + Note that negative values denote variable-width types. + + + + + + Int32 + + + The type modifier (see pg_attribute.atttypmod). + The meaning of the modifier is type-specific. + + + + + + Int16 + + + The format code being used for the field. Currently will + be zero (text) or one (binary). In a RowDescription + returned from the statement variant of Describe, the + format code is not yet known and will always be zero. + + + + + + + + + SASLInitialResponse (F) + + + + Byte1('p') + + + Identifies the message as an initial SASL response. Note that + this is also used for GSSAPI, SSPI and password response messages. + The exact message type is deduced from the context. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + String + + + Name of the SASL authentication mechanism that the client + selected. + + + + + + Int32 + + + Length of SASL mechanism specific "Initial Client Response" that + follows, or -1 if there is no Initial Response. + + + + + + Byten + + + SASL mechanism specific "Initial Response". + + + + + + + + + SASLResponse (F) + + + + Byte1('p') + + + Identifies the message as a SASL response. Note that + this is also used for GSSAPI, SSPI and password response messages. + The exact message type can be deduced from the context. + + + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Byten + + + SASL mechanism specific message data. + + + + + + + + + SSLRequest (F) + + + + Int32(8) + + + Length of message contents in bytes, including self. + + + + + + Int32(80877103) + + + The SSL request code. The value is chosen to contain + 1234 in the most significant 16 bits, and 5679 in the + least significant 16 bits. (To avoid confusion, this code + must not be the same as any protocol version number.) + + + + + + + + + StartupMessage (F) + + + + Int32 + + + Length of message contents in bytes, including self. + + + + + + Int32(196608) + + + The protocol version number. The most significant 16 bits are + the major version number (3 for the protocol described here). + The least significant 16 bits are the minor version number + (0 for the protocol described here). + + + + + + + The protocol version number is followed by one or more pairs of + parameter name and value strings. A zero byte is required as a + terminator after the last name/value pair. + Parameters can appear in any + order. user is required, others are optional. + Each parameter is specified as: + + + + + String + + + The parameter name. Currently recognized names are: + + + + user + + + The database user name to connect as. Required; + there is no default. + + + + + + database + + + The database to connect to. Defaults to the user name. + + + + + + options + + + Command-line arguments for the backend. (This is + deprecated in favor of setting individual run-time + parameters.) Spaces within this string are + considered to separate arguments, unless escaped with + a backslash (\); write \\ to + represent a literal backslash. + + + + + + replication + + + Used to connect in streaming replication mode, where + a small set of replication commands can be issued + instead of SQL statements. Value can be + true, false, or + database, and the default is + false. See + for details. + + + + + + In addition to the above, other parameters may be listed. + Parameter names beginning with _pq_. are + reserved for use as protocol extensions, while others are + treated as run-time parameters to be set at backend start + time. Such settings will be applied during backend start + (after parsing the command-line arguments if any) and will + act as session defaults. + + + + + + String + + + The parameter value. + + + + + + + + + Sync (F) + + + + Byte1('S') + + + Identifies the message as a Sync command. + + + + + + Int32(4) + + + Length of message contents in bytes, including self. + + + + + + + + + Terminate (F) + + + + Byte1('X') + + + Identifies the message as a termination. + + + + + + Int32(4) + + + Length of message contents in bytes, including self. + + + + + + + + + + + Error and Notice Message Fields + + + This section describes the fields that can appear in ErrorResponse and + NoticeResponse messages. Each field type has a single-byte identification + token. Note that any given field type should appear at most once per + message. + + + + + S + + + Severity: the field contents are + ERROR, FATAL, or + PANIC (in an error message), or + WARNING, NOTICE, DEBUG, + INFO, or LOG (in a notice message), + or a localized translation of one of these. Always present. + + + + + + V + + + Severity: the field contents are + ERROR, FATAL, or + PANIC (in an error message), or + WARNING, NOTICE, DEBUG, + INFO, or LOG (in a notice message). + This is identical to the S field except + that the contents are never localized. This is present only in + messages generated by PostgreSQL versions 9.6 + and later. + + + + + + C + + + Code: the SQLSTATE code for the error (see ). Not localizable. Always present. + + + + + + M + + + Message: the primary human-readable error message. + This should be accurate but terse (typically one line). + Always present. + + + + + + D + + + Detail: an optional secondary error message carrying more + detail about the problem. Might run to multiple lines. + + + + + + H + + + Hint: an optional suggestion what to do about the problem. + This is intended to differ from Detail in that it offers advice + (potentially inappropriate) rather than hard facts. + Might run to multiple lines. + + + + + + P + + + Position: the field value is a decimal ASCII integer, indicating + an error cursor position as an index into the original query string. + The first character has index 1, and positions are measured in + characters not bytes. + + + + + + p + + + Internal position: this is defined the same as the P + field, but it is used when the cursor position refers to an internally + generated command rather than the one submitted by the client. + The q field will always appear when this field appears. + + + + + + q + + + Internal query: the text of a failed internally-generated command. + This could be, for example, an SQL query issued by a PL/pgSQL function. + + + + + + W + + + Where: an indication of the context in which the error occurred. + Presently this includes a call stack traceback of active + procedural language functions and internally-generated queries. + The trace is one entry per line, most recent first. + + + + + + s + + + Schema name: if the error was associated with a specific database + object, the name of the schema containing that object, if any. + + + + + + t + + + Table name: if the error was associated with a specific table, the + name of the table. (Refer to the schema name field for the name of + the table's schema.) + + + + + + c + + + Column name: if the error was associated with a specific table column, + the name of the column. (Refer to the schema and table name fields to + identify the table.) + + + + + + d + + + Data type name: if the error was associated with a specific data type, + the name of the data type. (Refer to the schema name field for the + name of the data type's schema.) + + + + + + n + + + Constraint name: if the error was associated with a specific + constraint, the name of the constraint. Refer to fields listed above + for the associated table or domain. (For this purpose, indexes are + treated as constraints, even if they weren't created with constraint + syntax.) + + + + + + F + + + File: the file name of the source-code location where the error + was reported. + + + + + + L + + + Line: the line number of the source-code location where the error + was reported. + + + + + + R + + + Routine: the name of the source-code routine reporting the error. + + + + + + + + The fields for schema name, table name, column name, data type name, and + constraint name are supplied only for a limited number of error types; + see . Frontends should not assume that + the presence of any of these fields guarantees the presence of another + field. Core error sources observe the interrelationships noted above, but + user-defined functions may use these fields in other ways. In the same + vein, clients should not assume that these fields denote contemporary + objects in the current database. + + + + + The client is responsible for formatting displayed information to meet its + needs; in particular it should break long lines as needed. Newline characters + appearing in the error message fields should be treated as paragraph breaks, + not line breaks. + + + + + Logical Replication Message Formats + + + This section describes the detailed format of each logical replication + message. These messages are either returned by the replication slot SQL + interface or are sent by a walsender. In the case of a walsender, they are + encapsulated inside replication protocol WAL messages as described in + , and generally obey the same message + flow as physical replication. + + + + + Begin + + + + Byte1('B') + + + Identifies the message as a begin message. + + + + + + Int64 (XLogRecPtr) + + + The final LSN of the transaction. + + + + + + Int64 (TimestampTz) + + + Commit timestamp of the transaction. The value is in number + of microseconds since PostgreSQL epoch (2000-01-01). + + + + + + Int32 (TransactionId) + + + Xid of the transaction. + + + + + + + + + Message + + + + Byte1('M') + + + Identifies the message as a logical decoding message. + + + + + + Int32 (TransactionId) + + + Xid of the transaction (only present for streamed transactions). + This field is available since protocol version 2. + + + + + + Int8 + + + Flags; Either 0 for no flags or 1 if the logical decoding + message is transactional. + + + + + + Int64 (XLogRecPtr) + + + The LSN of the logical decoding message. + + + + + + String + + + The prefix of the logical decoding message. + + + + + + Int32 + + + Length of the content. + + + + + + Byten + + + The content of the logical decoding message. + + + + + + + + + Commit + + + + Byte1('C') + + + Identifies the message as a commit message. + + + + + + Int8(0) + + + Flags; currently unused. + + + + + + Int64 (XLogRecPtr) + + + The LSN of the commit. + + + + + + Int64 (XLogRecPtr) + + + The end LSN of the transaction. + + + + + + Int64 (TimestampTz) + + + Commit timestamp of the transaction. The value is in number + of microseconds since PostgreSQL epoch (2000-01-01). + + + + + + + + + Origin + + + + Byte1('O') + + + Identifies the message as an origin message. + + + + + + Int64 (XLogRecPtr) + + + The LSN of the commit on the origin server. + + + + + + String + + + Name of the origin. + + + + + + + Note that there can be multiple Origin messages inside a single transaction. + + + + + + Relation + + + + Byte1('R') + + + Identifies the message as a relation message. + + + + + + Int32 (TransactionId) + + + Xid of the transaction (only present for streamed transactions). + This field is available since protocol version 2. + + + + + + Int32 (Oid) + + + OID of the relation. + + + + + + String + + + Namespace (empty string for pg_catalog). + + + + + + String + + + Relation name. + + + + + + Int8 + + + Replica identity setting for the relation (same as + relreplident in pg_class). + + + + + + Int16 + + + Number of columns. + + + + + + + Next, the following message part appears for each column included in + the publication (except generated columns): + + + + + Int8 + + + Flags for the column. Currently can be either 0 for no flags + or 1 which marks the column as part of the key. + + + + + + String + + + Name of the column. + + + + + + Int32 (Oid) + + + OID of the column's data type. + + + + + + Int32 + + + Type modifier of the column (atttypmod). + + + + + + + + + Type + + + + Byte1('Y') + + + Identifies the message as a type message. + + + + + + Int32 (TransactionId) + + + Xid of the transaction (only present for streamed transactions). + This field is available since protocol version 2. + + + + + + Int32 (Oid) + + + OID of the data type. + + + + + + String + + + Namespace (empty string for pg_catalog). + + + + + + String + + + Name of the data type. + + + + + + + + + Insert + + + + Byte1('I') + + + Identifies the message as an insert message. + + + + + + Int32 (TransactionId) + + + Xid of the transaction (only present for streamed transactions). + This field is available since protocol version 2. + + + + + + Int32 (Oid) + + + OID of the relation corresponding to the ID in the relation + message. + + + + + + Byte1('N') + + + Identifies the following TupleData message as a new tuple. + + + + + + TupleData + + + TupleData message part representing the contents of new tuple. + + + + + + + + + Update + + + + Byte1('U') + + + Identifies the message as an update message. + + + + + + Int32 (TransactionId) + + + Xid of the transaction (only present for streamed transactions). + This field is available since protocol version 2. + + + + + + Int32 (Oid) + + + OID of the relation corresponding to the ID in the relation + message. + + + + + + Byte1('K') + + + Identifies the following TupleData submessage as a key. + This field is optional and is only present if + the update changed data in any of the column(s) that are + part of the REPLICA IDENTITY index. + + + + + + Byte1('O') + + + Identifies the following TupleData submessage as an old tuple. + This field is optional and is only present if table in which + the update happened has REPLICA IDENTITY set to FULL. + + + + + + TupleData + + + TupleData message part representing the contents of the old tuple + or primary key. Only present if the previous 'O' or 'K' part + is present. + + + + + + Byte1('N') + + + Identifies the following TupleData message as a new tuple. + + + + + + TupleData + + + TupleData message part representing the contents of a new tuple. + + + + + + + The Update message may contain either a 'K' message part or an 'O' message part + or neither of them, but never both of them. + + + + + + Delete + + + + Byte1('D') + + + Identifies the message as a delete message. + + + + + + Int32 (TransactionId) + + + Xid of the transaction (only present for streamed transactions). + This field is available since protocol version 2. + + + + + + Int32 (Oid) + + + OID of the relation corresponding to the ID in the relation + message. + + + + + + Byte1('K') + + + Identifies the following TupleData submessage as a key. + This field is present if the table in which the delete has + happened uses an index as REPLICA IDENTITY. + + + + + + Byte1('O') + + + Identifies the following TupleData message as an old tuple. + This field is present if the table in which the delete + happened has REPLICA IDENTITY set to FULL. + + + + + + TupleData + + + TupleData message part representing the contents of the old tuple + or primary key, depending on the previous field. + + + + + + + The Delete message may contain either a 'K' message part or an 'O' message part, + but never both of them. + + + + + + Truncate + + + + Byte1('T') + + + Identifies the message as a truncate message. + + + + + + Int32 (TransactionId) + + + Xid of the transaction (only present for streamed transactions). + This field is available since protocol version 2. + + + + + + Int32 + + + Number of relations + + + + + + Int8 + + + Option bits for TRUNCATE: + 1 for CASCADE, 2 for RESTART IDENTITY + + + + + + Int32 (Oid) + + + OID of the relation corresponding to the ID in the relation + message. This field is repeated for each relation. + + + + + + + + + + The following messages (Stream Start, Stream Stop, Stream Commit, and + Stream Abort) are available since protocol version 2. + + + + + Stream Start + + + + Byte1('S') + + + Identifies the message as a stream start message. + + + + + + Int32 (TransactionId) + + + Xid of the transaction. + + + + + + Int8 + + + A value of 1 indicates this is the first stream segment for + this XID, 0 for any other stream segment. + + + + + + + + + Stream Stop + + + + Byte1('E') + + + Identifies the message as a stream stop message. + + + + + + + + Stream Commit + + - - Int64 - - - - The server's system clock at the time of transmission, as - microseconds since midnight on 2000-01-01. - - + Byte1('c') + + + Identifies the message as a stream commit message. + + + - - Byten - - - - A section of the WAL data stream. - - - 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. - - - - - - + Int32 (TransactionId) + + + Xid of the transaction. + + - - - Primary keepalive message (B) - - - - + - - Byte1('k') - - - - Identifies the message as a sender keepalive. - - + Int8(0) + + + Flags; currently unused. + + + - - Int64 - - - - The current end of WAL on the server. - - + Int64 (XLogRecPtr) + + + The LSN of the commit. + + + - - Int64 - - - - The server's system clock at the time of transmission, as - microseconds since midnight on 2000-01-01. - - + Int64 (XLogRecPtr) + + + The end LSN of the transaction. + + + - - Byte1 - - - - 1 means that the client should reply to this message as soon as - possible, to avoid a timeout disconnect. 0 otherwise. - - - - - - + Int64 (TimestampTz) + + + Commit timestamp of the transaction. The value is in number + of microseconds since PostgreSQL epoch (2000-01-01). + + - - - - - The receiving process can send replies back to the sender at any time, - using one of the following message formats (also in the payload of a - CopyData message): - + + + - - - - - Standby status update (F) - - - - + + Stream Abort + + - - Byte1('r') - - - - Identifies the message as a receiver status update. - - + Byte1('A') + + + Identifies the message as a stream abort message. + + + - - Int64 - - - - The location of the last WAL byte + 1 received and written to disk - in the standby. - - + Int32 (TransactionId) + + + Xid of the transaction. + + + - - Int64 - - - - The location of the last WAL byte + 1 flushed to disk in - the standby. - - + Int32 (TransactionId) + + + Xid of the subtransaction (will be same as xid of the transaction for top-level + transactions). + + + + + + + + + The following messages (Begin Prepare, Prepare, Commit Prepared, Rollback Prepared, Stream Prepare) + are available since protocol version 3. + + + + + Begin Prepare + + - - Int64 - - - - The location of the last WAL byte + 1 applied in the standby. - - + Byte1('b') + + + Identifies the message as the beginning of a two-phase transaction message. + + + - - Int64 - - - - The client's system clock at the time of transmission, as - microseconds since midnight on 2000-01-01. - - + Int64 (XLogRecPtr) + + + The LSN of the prepare. + + + - - Byte1 - - - - If 1, the client requests the server to reply to this message - immediately. This can be used to ping the server, to test if - the connection is still healthy. - - - - - - + Int64 (XLogRecPtr) + + + The end LSN of the prepared transaction. + + - - - - - - - Hot standby feedback message (F) - - - - - - Byte1('h') - - - - Identifies the message as a hot standby feedback message. - - + Int64 (TimestampTz) + + + Prepare timestamp of the transaction. The value is in number + of microseconds since PostgreSQL epoch (2000-01-01). + + + - - Int64 - - - - The client's system clock at the time of transmission, as - microseconds since midnight on 2000-01-01. - - + Int32 (TransactionId) + + + Xid of the transaction. + + + - - Int32 - - - - The standby's current global xmin, excluding the catalog_xmin from any - replication slots. If both this value and the following - catalog_xmin are 0 this is treated as a notification that hot standby - feedback will no longer be sent on this connection. Later non-zero - messages may reinitiate the feedback mechanism. - - + String + + + The user defined GID of the two-phase transaction. + + + + + + + + Prepare + + - - Int32 - - - - The epoch of the global xmin xid on the standby. - - + Byte1('P') + + + Identifies the message as a two-phase prepared transaction message. + + + - - Int32 - - - - The lowest catalog_xmin of any replication slots on the standby. Set to 0 - if no catalog_xmin exists on the standby or if hot standby feedback is being - disabled. - - + Int8(0) + + + Flags; currently unused. + + + - - Int32 - - - - The epoch of the catalog_xmin xid on the standby. - - + Int64 (XLogRecPtr) + + + The LSN of the prepare. + + - - - + + + Int64 (XLogRecPtr) + + + The end LSN of the prepared transaction. + + - - - - - - START_REPLICATION SLOT slot_name LOGICAL XXX/XXX [ ( option_name [ option_value ] [, ...] ) ] - - - Instructs server to start streaming WAL for logical replication, - starting at either WAL location XXX/XXX or the slot's - confirmed_flush_lsn (see ), whichever is greater. This - behavior makes it easier for clients to avoid updating their local LSN - status when there is no data to process. However, starting at a - different LSN than requested might not catch certain kinds of client - errors; so the client may wish to check that - confirmed_flush_lsn matches its expectations before - issuing START_REPLICATION. - - - The server can reply with an error, for example if the - slot does not exist. On success, the server responds with a CopyBothResponse - message, and then starts to stream WAL to the frontend. - + + Int64 (TimestampTz) + + + Prepare timestamp of the transaction. The value is in number + of microseconds since PostgreSQL epoch (2000-01-01). + + + - - The messages inside the CopyBothResponse messages are of the same format - documented for START_REPLICATION ... PHYSICAL, including - two CommandComplete messages. - + + Int32 (TransactionId) + + + Xid of the transaction. + + + - - The output plugin associated with the selected slot is used - to process the output for streaming. - + + String + + + The user defined GID of the two-phase transaction. + + + + + + + + Commit Prepared + - SLOT slot_name + Byte1('K') - - The name of the slot to stream changes from. This parameter is required, - and must correspond to an existing logical replication slot created - with CREATE_REPLICATION_SLOT in - LOGICAL mode. - + + Identifies the message as the commit of a two-phase transaction message. + + - XXX/XXX + Int8(0) - The WAL location to begin streaming at. + Flags; currently unused. + - option_name + Int64 (XLogRecPtr) - The name of an option passed to the slot's logical decoding plugin. + The LSN of the commit prepared. + - option_value + Int64 (XLogRecPtr) - Optional value, in the form of a string constant, associated with the - specified option. + The end LSN of the commit prepared transaction. - - - - - - DROP_REPLICATION_SLOT slot_name WAIT - DROP_REPLICATION_SLOT - - - - Drops a replication slot, freeing any reserved server-side resources. - If the slot is a logical slot that was created in a database other than - the database the walsender is connected to, this command fails. - - - slot_name + Int64 (TimestampTz) - - The name of the slot to drop. - + + Commit timestamp of the transaction. The value is in number + of microseconds since PostgreSQL epoch (2000-01-01). + - WAIT + Int32 (TransactionId) - This option causes the command to wait if the slot is active until - it becomes inactive, instead of the default behavior of raising an - error. + Xid of the transaction. + + + + + + String + + + The user defined GID of the two-phase transaction. - + - - BASE_BACKUP [ ( option [, ...] ) ] - BASE_BACKUP - + + Rollback Prepared - - Instructs the server to start streaming a base backup. - The system will automatically be put in backup mode before the backup - is started, and taken out of it when the backup is complete. The - following options are accepted: - - - LABEL 'label' - - - Sets the label of the backup. If none is specified, a backup label - of base backup will be used. The quoting rules - for the label are the same as a standard SQL string with - turned on. - - - - - - TARGET 'target' - - - Tells the server where to send the backup. If the target is - client, which is the default, the backup data is - sent to the client. If it is server, the backup - data is written to the server at the pathname specified by the - TARGET_DETAIL option. If it is - blackhole, the backup data is not sent - anywhere; it is simply discarded. - - - - The server target requires superuser privilege or - being granted the pg_write_server_files role. - - - - - - TARGET_DETAIL 'detail' - - - Provides additional information about the backup target. - - - - Currently, this option can only be used when the backup target is - server. It specifies the server directory - to which the backup should be written. - - - - - - PROGRESS [ boolean ] - - - If set to true, request information required to generate a progress - report. This will send back an approximate size in the header of each - tablespace, which can be used to calculate how far along the stream - is done. This is calculated by enumerating all the file sizes once - before the transfer is even started, and might as such have a - negative impact on the performance. In particular, it might take - longer before the first data - is streamed. Since the database files can change during the backup, - the size is only approximate and might both grow and shrink between - the time of approximation and the sending of the actual files. - The default is false. - - - - - - CHECKPOINT { 'fast' | 'spread' } - - - Sets the type of checkpoint to be performed at the beginning of the - base backup. The default is spread. - - - - - - WAL [ boolean ] - - - If set to true, include the necessary WAL segments in the backup. - This will include all the files between start and stop backup in the - pg_wal directory of the base directory tar - file. The default is false. - - - - - - WAIT [ boolean ] - - - If set to true, the backup will wait until the last required WAL - segment has been archived, or emit a warning if log archiving is - not enabled. If false, the backup will neither wait nor warn, - leaving the client responsible for ensuring the required log is - available. The default is true. - - - - - - COMPRESSION 'method' - - - Instructs the server to compress the backup using the specified - method. Currently, the supported methods are gzip, - lz4, and zstd. - - - - - - COMPRESSION_DETAIL detail - - - Specifies details for the chosen compression method. This should only - be used in conjunction with the COMPRESSION - option. If the value is an integer, it specifies the compression - level. Otherwise, it should be a comma-separated list of items, - each of the form keyword or - keyword=value. Currently, the supported keywords - are level and workers. + + + Byte1('r') + + + Identifies the message as the rollback of a two-phase transaction message. + + + + Int8(0) + - The level keyword sets the compression level. - For gzip the compression level should be an - integer between 1 and 9, for lz4 an integer - between 1 and 12, and for zstd an integer - between 1 and 22. - + Flags; currently unused. + + + + + Int64 (XLogRecPtr) + - The workers keyword sets the number of threads - that should be used for parallel compression. Parallel compression - is supported only for zstd. - - - - - - MAX_RATE rate - - - Limit (throttle) the maximum amount of data transferred from server - to client per unit of time. The expected unit is kilobytes per second. - If this option is specified, the value must either be equal to zero - or it must fall within the range from 32 kB through 1 GB (inclusive). - If zero is passed or the option is not specified, no restriction is - imposed on the transfer. - - - - - - TABLESPACE_MAP [ boolean ] - - - If true, include information about symbolic links present in the - directory pg_tblspc in a file named - tablespace_map. The tablespace map file includes - each symbolic link name as it exists in the directory - pg_tblspc/ and the full path of that symbolic link. - The default is false. - - - - - - VERIFY_CHECKSUMS [ boolean ] - - - If true, checksums are verified during a base backup if they are - enabled. If false, this is skipped. The default is true. - - - - - - MANIFEST manifest_option - - - When this option is specified with a value of yes - or force-encode, a backup manifest is created - and sent along with the backup. The manifest is a list of every - file present in the backup with the exception of any WAL files that - may be included. It also stores the size, last modification time, and - optionally a checksum for each file. - A value of force-encode forces all filenames - to be hex-encoded; otherwise, this type of encoding is performed only - for files whose names are non-UTF8 octet sequences. - force-encode is intended primarily for testing - purposes, to be sure that clients which read the backup manifest - can handle this case. For compatibility with previous releases, - the default is MANIFEST 'no'. - - - - - - MANIFEST_CHECKSUMS checksum_algorithm - - - Specifies the checksum algorithm that should be applied to each file included - in the backup manifest. Currently, the available - algorithms are NONE, CRC32C, - SHA224, SHA256, - SHA384, and SHA512. - The default is CRC32C. - - - - - - - When the backup is started, the server will first send two - ordinary result sets, followed by one or more CopyOutResponse - results. - - - The first ordinary result set contains the starting position of the - backup, in a single row with two columns. The first column contains - the start position given in XLogRecPtr format, and the second column - contains the corresponding timeline ID. - - - The second ordinary result set has one row for each tablespace. - The fields in this row are: - - - spcoid (oid) - - - The OID of the tablespace, or null if it's the base - directory. - - - - - spclocation (text) - - - The full path of the tablespace directory, or null - if it's the base directory. - - - - - size (int8) - - - The approximate size of the tablespace, in kilobytes (1024 bytes), - if progress report has been requested; otherwise it's null. - - - - - - - - After the second regular result set, a CopyOutResponse will be sent. - The payload of each CopyData message will contain a message in one of - the following formats: - - - - + The end LSN of the prepared transaction. + + + - new archive (B) - - - Byte1('n') - - Identifes the messaage as indicating the start of a new archive. - There will be one archive for the main data directory and one - for each additional tablespace; each will use tar format - (following the ustar interchange format specified - in the POSIX 1003.1-2008 standard). - - - - String - - The file name for this archive. - - - - String - - For the main data directory, an empty string. For other - tablespaces, the full path to the directory from which this - archive was created. - - - + Int64 (XLogRecPtr) + + + The end LSN of the rollback prepared transaction. + + - manifest (B) - - - Byte1('m') - - Identifes the message as indicating the start of the backup - manifest. - - - + Int64 (TimestampTz) + + + Prepare timestamp of the transaction. The value is in number + of microseconds since PostgreSQL epoch (2000-01-01). + + - archive or manifest data (B) - - - Byte1('d') - - Identifes the message as containing archive or manifest data. - - - - Byten - - Data bytes. - - - + Int64 (TimestampTz) + + + Rollback timestamp of the transaction. The value is in number + of microseconds since PostgreSQL epoch (2000-01-01). + + - progress report (B) - - - Byte1('p') - - Identifes the message as a progress report. - - - - Int64 - - The number of bytes from the current tablespace for which - processing has been completed. - - - + Int32 (TransactionId) + + + Xid of the transaction. + + - - - - - After the CopyOutResponse, or all such responses, have been sent, a - final ordinary result set will be sent, containing the WAL end position - of the backup, in the same format as the start position. - + + String + + + The user defined GID of the two-phase transaction. + + + + + + - - The tar archive for the data directory and each tablespace will contain - all files in the directories, regardless of whether they are - PostgreSQL files or other files added to the same - directory. The only excluded files are: - + + Stream Prepare + + + + Byte1('p') - postmaster.pid + Identifies the message as a two-phase stream prepare message. + + + + Int8(0) - postmaster.opts + Flags; currently unused. + + + + Int64 (XLogRecPtr) - pg_internal.init (found in multiple directories) + The LSN of the prepare. + + + + Int64 (XLogRecPtr) - Various temporary files and directories created during the operation - of the PostgreSQL server, such as any file or directory beginning - with pgsql_tmp and temporary relations. + The end LSN of the prepare transaction. + + + + Int64 (TimestampTz) - Unlogged relations, except for the init fork which is required to - recreate the (empty) unlogged relation on recovery. + Prepare timestamp of the transaction. The value is in number + of microseconds since PostgreSQL epoch (2000-01-01). + + + + Int32 (TransactionId) - pg_wal, including subdirectories. If the backup is run - with WAL files included, a synthesized version of pg_wal will be - included, but it will only contain the files necessary for the - backup to work, not the rest of the contents. + Xid of the transaction. + + + + String - pg_dynshmem, pg_notify, - pg_replslot, pg_serial, - pg_snapshots, pg_stat_tmp, and - pg_subtrans are copied as empty directories (even if - they are symbolic links). + The user defined GID of the two-phase transaction. + + + + + + + + The following message parts are shared by the above messages. + + + + + TupleData + + + + Int16 - Files other than regular files and directories, such as symbolic - links (other than for the directories listed above) and special - device files, are skipped. (Symbolic links - in pg_tblspc are maintained.) + Number of columns. - - Owner, group, and file mode are set if the underlying file system on - the server supports it. - - - - - - + + - + + Next, one of the following submessages appears for each column (except generated columns): - - Logical Streaming Replication Protocol + + + Byte1('n') + + + Identifies the data as NULL value. + + + + + Or + + + Byte1('u') + + + Identifies unchanged TOASTed value (the actual value is not + sent). + + + + + Or + + + Byte1('t') + + + Identifies the data as text formatted value. + + + + + Or + + + Byte1('b') + + + Identifies the data as binary formatted value. + + + - - This section describes the logical replication protocol, which is the message - flow started by the START_REPLICATION - SLOT slot_name - LOGICAL replication command. - + + Int32 + + + Length of the column value. + + + - - The logical streaming replication protocol builds on the primitives of - the physical streaming replication protocol. - + + Byten + + + The value of the column, either in binary or in text format. + (As specified in the preceding format byte). + n is the above length. + + + + + + + + + - - Logical Streaming Replication Parameters + + Summary of Changes since Protocol 2.0 - The logical replication START_REPLICATION command - accepts following parameters: - - - - - proto_version - - - - Protocol version. Currently versions 1, 2, - and 3 are supported. - - - Version 2 is supported only for server version 14 - and above, and it allows streaming of large in-progress transactions. - - - Version 3 is supported only for server version 15 - and above, and it allows streaming of two-phase transactions. - - - - - - - publication_names - - - - Comma separated list of publication names for which to subscribe - (receive changes). The individual publication names are treated - as standard objects names and can be quoted the same as needed. - - - - - + This section provides a quick checklist of changes, for the benefit of + developers trying to update existing client libraries to protocol 3.0. - - - - Logical Replication Protocol Messages - The individual protocol messages are discussed in the following - subsections. Individual messages are described in - . + The initial startup packet uses a flexible list-of-strings format + instead of a fixed format. Notice that session default values for run-time + parameters can now be specified directly in the startup packet. (Actually, + you could do that before using the options field, but given the + limited width of options and the lack of any way to quote + whitespace in the values, it wasn't a very safe technique.) - All top-level protocol messages begin with a message type byte. - While represented in code as a character, this is a signed byte with no - associated encoding. + All messages now have a length count immediately following the message type + byte (except for startup packets, which have no type byte). Also note that + PasswordMessage now has a type byte. - Since the streaming replication protocol supplies a message length there - is no need for top-level protocol messages to embed a length in their - header. + ErrorResponse and NoticeResponse ('E' and 'N') + messages now contain multiple fields, from which the client code can + assemble an error message of the desired level of verbosity. Note that + individual fields will typically not end with a newline, whereas the single + string sent in the older protocol always did. - - - - Logical Replication Protocol Message Flow - - With the exception of the START_REPLICATION command and - the replay progress messages, all information flows only from the backend - to the frontend. + The ReadyForQuery ('Z') message includes a transaction status + indicator. - The logical replication protocol sends individual transactions one by one. - This means that all messages between a pair of Begin and Commit messages - belong to the same transaction. Similarly, all messages between a pair of - Begin Prepare and Prepare messages belong to the same transaction. - It also sends changes of large in-progress transactions between a pair of - Stream Start and Stream Stop messages. The last stream of such a transaction - contains a Stream Commit or Stream Abort message. + The distinction between BinaryRow and DataRow message types is gone; the + single DataRow message type serves for returning data in all formats. + Note that the layout of DataRow has changed to make it easier to parse. + Also, the representation of binary values has changed: it is no longer + directly tied to the server's internal representation. - Every sent transaction contains zero or more DML messages (Insert, - Update, Delete). In case of a cascaded setup it can also contain Origin - messages. The origin message indicates that the transaction originated on - different replication node. Since a replication node in the scope of logical - replication protocol can be pretty much anything, the only identifier - is the origin name. It's downstream's responsibility to handle this as - needed (if needed). The Origin message is always sent before any DML - messages in the transaction. + There is a new extended query sub-protocol, which adds the frontend + message types Parse, Bind, Execute, Describe, Close, Flush, and Sync, and the + backend message types ParseComplete, BindComplete, PortalSuspended, + ParameterDescription, NoData, and CloseComplete. Existing clients do not + have to concern themselves with this sub-protocol, but making use of it + might allow improvements in performance or functionality. - Every DML message contains a relation OID, identifying the publisher's - relation that was acted on. Before the first DML message for a given - relation OID, a Relation message will be sent, describing the schema of - that relation. Subsequently, a new Relation message will be sent if - the relation's definition has changed since the last Relation message - was sent for it. (The protocol assumes that the client is capable of - remembering this metadata for as many relations as needed.) + COPY data is now encapsulated into CopyData and CopyDone messages. There + is a well-defined way to recover from errors during COPY. The special + \. last line is not needed anymore, and is not sent + during COPY OUT. + (It is still recognized as a terminator during COPY IN, but its use is + deprecated and will eventually be removed.) Binary COPY is supported. + The CopyInResponse and CopyOutResponse messages include fields indicating + the number of columns and the format of each column. - Relation messages identify column types by their OIDs. In the case - of a built-in type, it is assumed that the client can look up that - type OID locally, so no additional data is needed. For a non-built-in - type OID, a Type message will be sent before the Relation message, - to provide the type name associated with that OID. Thus, a client that - needs to specifically identify the types of relation columns should - cache the contents of Type messages, and first consult that cache to - see if the type OID is defined there. If not, look up the type OID - locally. + The layout of FunctionCall and FunctionCallResponse messages has changed. + FunctionCall can now support passing NULL arguments to functions. It also + can handle passing parameters and retrieving results in either text or + binary format. There is no longer any reason to consider FunctionCall a + potential security hole, since it does not offer direct access to internal + server data representations. - - - - -Message Data Types - - -This section describes the base data types used in messages. - - - - - - Intn(i) - - - - An n-bit integer in network byte - order (most significant byte first). - If i is specified it - is the exact value that will appear, otherwise the value - is variable. Eg. Int16, Int32(42). - - - - - - - Intn[k] - - - - An array of k - n-bit integers, each in network - byte order. The array length k - is always determined by an earlier field in the message. - Eg. Int16[M]. - - - - - - - String(s) - - - - A null-terminated string (C-style string). There is no - specific length limitation on strings. - If s is specified it is the exact - value that will appear, otherwise the value is variable. - Eg. String, String("user"). - - - - -There is no predefined limit on the length of a string -that can be returned by the backend. Good coding strategy for a frontend -is to use an expandable buffer so that anything that fits in memory can be -accepted. If that's not feasible, read the full string and discard trailing -characters that don't fit into your fixed-size buffer. - - - - - - - - Byten(c) - - - - Exactly n bytes. If the field - width n is not a constant, it is - always determinable from an earlier field in the message. - If c is specified it is the exact - value. Eg. Byte2, Byte1('\n'). - - - - - - - - - -Message Formats - - -This section describes the detailed format of each message. Each is marked to -indicate that it can be sent by a frontend (F), a backend (B), or both -(F & B). -Notice that although each message includes a byte count at the beginning, -the message format is defined so that the message end can be found without -reference to the byte count. This aids validity checking. (The CopyData -message is an exception, because it forms part of a data stream; the contents -of any individual CopyData message cannot be interpretable on their own.) - - - - - - - -AuthenticationOk (B) - - - - - - - - Byte1('R') - - - - Identifies the message as an authentication request. - - - - - - Int32(8) - - - - Length of message contents in bytes, including self. - - - - - - Int32(0) - - - - Specifies that the authentication was successful. - - - - - - - - - - - - -AuthenticationKerberosV5 (B) - - - - - - - - Byte1('R') - - - - Identifies the message as an authentication request. - - - - - - Int32(8) - - - - Length of message contents in bytes, including self. - - - - - - Int32(2) - - - - Specifies that Kerberos V5 authentication is required. - - - - - - - - - - - -AuthenticationCleartextPassword (B) - - - - - - - - Byte1('R') - - - - Identifies the message as an authentication request. - - - - - - Int32(8) - - - - Length of message contents in bytes, including self. - - - - - - Int32(3) - - - - Specifies that a clear-text password is required. - - - - - - - - - - - -AuthenticationMD5Password (B) - - - - - - - - Byte1('R') - - - - Identifies the message as an authentication request. - - - - - - Int32(12) - - - - Length of message contents in bytes, including self. - - - - - - Int32(5) - - - - Specifies that an MD5-encrypted password is required. - - - - - - Byte4 - - - - The salt to use when encrypting the password. - - - - - - - - - - - - -AuthenticationSCMCredential (B) - - - - - - - - Byte1('R') - - - - Identifies the message as an authentication request. - - - - - - Int32(8) - - - - Length of message contents in bytes, including self. - - - - - - Int32(6) - - - - Specifies that an SCM credentials message is required. - - - - - - - - - - - - -AuthenticationGSS (B) - - - - - - - - Byte1('R') - - - - Identifies the message as an authentication request. - - - - - - Int32(8) - - - - Length of message contents in bytes, including self. - - - - - - Int32(7) - - - - Specifies that GSSAPI authentication is required. - - - - - - - - - - - - -AuthenticationGSSContinue (B) - - - - - - - - Byte1('R') - - - - Identifies the message as an authentication request. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int32(8) - - - - Specifies that this message contains GSSAPI or SSPI data. - - - - - - Byten - - - - GSSAPI or SSPI authentication data. - - - - - - - - - - - - -AuthenticationSSPI (B) - - - - - - - - Byte1('R') - - - - Identifies the message as an authentication request. - - - - - - Int32(8) - - - - Length of message contents in bytes, including self. - - - - - - Int32(9) - - - - Specifies that SSPI authentication is required. - - - - - - - - - - - - -AuthenticationSASL (B) - - - - - - - - Byte1('R') - - - - Identifies the message as an authentication request. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int32(10) - - - - Specifies that SASL authentication is required. - - - - -The message body is a list of SASL authentication mechanisms, in the -server's order of preference. A zero byte is required as terminator after -the last authentication mechanism name. For each mechanism, there is the -following: - - - - String - - - - Name of a SASL authentication mechanism. - - - - - - - - - - - - -AuthenticationSASLContinue (B) - - - - - - - - Byte1('R') - - - - Identifies the message as an authentication request. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int32(11) - - - - Specifies that this message contains a SASL challenge. - - - - - - Byten - - - - SASL data, specific to the SASL mechanism being used. - - - - - - - - - - - - -AuthenticationSASLFinal (B) - - - - - - - - Byte1('R') - - - - Identifies the message as an authentication request. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int32(12) - - - - Specifies that SASL authentication has completed. - - - - - - Byten - - - - SASL outcome "additional data", specific to the SASL mechanism - being used. - - - - - - - - - - - - -BackendKeyData (B) - - - - - - - - Byte1('K') - - - - Identifies the message as cancellation key data. - The frontend must save these values if it wishes to be - able to issue CancelRequest messages later. - - - - - - Int32(12) - - - - Length of message contents in bytes, including self. - - - - - - Int32 - - - - The process ID of this backend. - - - - - - Int32 - - - - The secret key of this backend. - - - - - - - - - - - - -Bind (F) - - - - - - - - Byte1('B') - - - - Identifies the message as a Bind command. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - String - - - - The name of the destination portal - (an empty string selects the unnamed portal). - - - - - - String - - - - The name of the source prepared statement - (an empty string selects the unnamed prepared statement). - - - - - - Int16 - - - - The number of parameter format codes that follow - (denoted C below). - This can be zero to indicate that there are no parameters - or that the parameters all use the default format (text); - or one, in which case the specified format code is applied - to all parameters; or it can equal the actual number of - parameters. - - - - - - Int16[C] - - - - The parameter format codes. Each must presently be - zero (text) or one (binary). - - - - - - Int16 - - - - The number of parameter values that follow (possibly zero). - This must match the number of parameters needed by the query. - - - - - Next, the following pair of fields appear for each parameter: - - - - Int32 - - - - The length of the parameter value, in bytes (this count - does not include itself). Can be zero. - As a special case, -1 indicates a NULL parameter value. - No value bytes follow in the NULL case. - - - - - - Byten - - - - The value of the parameter, in the format indicated by the - associated format code. - n is the above length. - - - - - After the last parameter, the following fields appear: - - - - Int16 - - - - The number of result-column format codes that follow - (denoted R below). - This can be zero to indicate that there are no result columns - or that the result columns should all use the default format - (text); - or one, in which case the specified format code is applied - to all result columns (if any); or it can equal the actual - number of result columns of the query. - - - - - - Int16[R] - - - - The result-column format codes. Each must presently be - zero (text) or one (binary). - - - - - - - - - - - -BindComplete (B) - - - - - - - - Byte1('2') - - - - Identifies the message as a Bind-complete indicator. - - - - - - Int32(4) - - - - Length of message contents in bytes, including self. - - - - - - - - - - - - -CancelRequest (F) - - - - - - - - Int32(16) - - - - Length of message contents in bytes, including self. - - - - - - Int32(80877102) - - - - The cancel request code. The value is chosen to contain - 1234 in the most significant 16 bits, and 5678 in the - least significant 16 bits. (To avoid confusion, this code - must not be the same as any protocol version number.) - - - - - - Int32 - - - - The process ID of the target backend. - - - - - - Int32 - - - - The secret key for the target backend. - - - - - - - - - - - - -Close (F) - - - - - - - - Byte1('C') - - - - Identifies the message as a Close command. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Byte1 - - - - 'S' to close a prepared statement; or - 'P' to close a portal. - - - - - - String - - - - The name of the prepared statement or portal to close - (an empty string selects the unnamed prepared statement - or portal). - - - - - - - - - - - -CloseComplete (B) - - - - - - - - Byte1('3') - - - - Identifies the message as a Close-complete indicator. - - - - - - Int32(4) - - - - Length of message contents in bytes, including self. - - - - - - - - - - - - -CommandComplete (B) - - - - - - - - Byte1('C') - - - - Identifies the message as a command-completed response. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - String - - - - The command tag. This is usually a single - word that identifies which SQL command was completed. - - - - For an INSERT command, the tag is - INSERT oid - rows, where - rows is the number of rows - inserted. oid used to be the object ID - of the inserted row if rows was 1 - and the target table had OIDs, but OIDs system columns are - not supported anymore; therefore oid - is always 0. - - - - For a DELETE command, the tag is - DELETE rows where - rows is the number of rows deleted. - - - - For an UPDATE command, the tag is - UPDATE rows where - rows is the number of rows updated. - - - - For a SELECT or CREATE TABLE AS - command, the tag is SELECT rows - where rows is the number of rows retrieved. - - - - For a MOVE command, the tag is - MOVE rows where - rows is the number of rows the - cursor's position has been changed by. - - - - For a FETCH command, the tag is - FETCH rows where - rows is the number of rows that - have been retrieved from the cursor. - - - - For a COPY command, the tag is - COPY rows where - rows is the number of rows copied. - (Note: the row count appears only in - PostgreSQL 8.2 and later.) - - - - - - - - - - - - - -CopyData (F & B) - - - - - - - Byte1('d') - - - - Identifies the message as COPY data. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Byten - - - - Data that forms part of a COPY data stream. Messages sent - from the backend will always correspond to single data rows, - but messages sent by frontends might divide the data stream - arbitrarily. - - - - - - - - - - - -CopyDone (F & B) - - - - - - - - Byte1('c') - - - - Identifies the message as a COPY-complete indicator. - - - - - - Int32(4) - - - - Length of message contents in bytes, including self. - - - - - - - - - - - - -CopyFail (F) - - - - - - - - Byte1('f') - - - - Identifies the message as a COPY-failure indicator. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - String - - - - An error message to report as the cause of failure. - - - - - - - - - - - - -CopyInResponse (B) - - - - - - - - Byte1('G') - - - - Identifies the message as a Start Copy In response. - The frontend must now send copy-in data (if not - prepared to do so, send a CopyFail message). - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int8 - - - - 0 indicates the overall COPY format is textual (rows - separated by newlines, columns separated by separator - characters, etc). - 1 indicates the overall copy format is binary (similar - to DataRow format). - See - for more information. - - - - - - Int16 - - - - The number of columns in the data to be copied - (denoted N below). - - - - - - Int16[N] - - - - The format codes to be used for each column. - Each must presently be zero (text) or one (binary). - All must be zero if the overall copy format is textual. - - - - - - - - - - - - -CopyOutResponse (B) - - - - - - - - Byte1('H') - - - - Identifies the message as a Start Copy Out response. - This message will be followed by copy-out data. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int8 - - - - 0 indicates the overall COPY format - is textual (rows separated by newlines, columns - separated by separator characters, etc). 1 indicates - the overall copy format is binary (similar to DataRow - format). See for more information. - - - - - - Int16 - - - - The number of columns in the data to be copied - (denoted N below). - - - - - - Int16[N] - - - - The format codes to be used for each column. - Each must presently be zero (text) or one (binary). - All must be zero if the overall copy format is textual. - - - - - - - - - - - - -CopyBothResponse (B) - - - - - - - - Byte1('W') - - - - Identifies the message as a Start Copy Both response. - This message is used only for Streaming Replication. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int8 - - - - 0 indicates the overall COPY format - is textual (rows separated by newlines, columns - separated by separator characters, etc). 1 indicates - the overall copy format is binary (similar to DataRow - format). See for more information. - - - - - - Int16 - - - - The number of columns in the data to be copied - (denoted N below). - - - - - - Int16[N] - - - - The format codes to be used for each column. - Each must presently be zero (text) or one (binary). - All must be zero if the overall copy format is textual. - - - - - - - - - - - - -DataRow (B) - - - - - - - Byte1('D') - - - - Identifies the message as a data row. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int16 - - - - The number of column values that follow (possibly zero). - - - - - Next, the following pair of fields appear for each column: - - - - Int32 - - - - The length of the column value, in bytes (this count - does not include itself). Can be zero. - As a special case, -1 indicates a NULL column value. - No value bytes follow in the NULL case. - - - - - - Byten - - - - The value of the column, in the format indicated by the - associated format code. - n is the above length. - - - - - - - - - - - - -Describe (F) - - - - - - - - Byte1('D') - - - - Identifies the message as a Describe command. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Byte1 - - - - 'S' to describe a prepared statement; or - 'P' to describe a portal. - - - - - - String - - - - The name of the prepared statement or portal to describe - (an empty string selects the unnamed prepared statement - or portal). - - - - - - - - - - - -EmptyQueryResponse (B) - - - - - - - - Byte1('I') - - - - Identifies the message as a response to an empty query string. - (This substitutes for CommandComplete.) - - - - - - Int32(4) - - - - Length of message contents in bytes, including self. - - - - - - - - - - - - -ErrorResponse (B) - - - - - - - - Byte1('E') - - - - Identifies the message as an error. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - The message body consists of one or more identified fields, - followed by a zero byte as a terminator. Fields can appear in - any order. For each field there is the following: - - - - Byte1 - - - - A code identifying the field type; if zero, this is - the message terminator and no string follows. - The presently defined field types are listed in - . - Since more field types might be added in future, - frontends should silently ignore fields of unrecognized - type. - - - - - - String - - - - The field value. - - - - - - - - - - - - -Execute (F) - - - - - - - - Byte1('E') - - - - Identifies the message as an Execute command. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - String - - - - The name of the portal to execute - (an empty string selects the unnamed portal). - - - - - - Int32 - - - - Maximum number of rows to return, if portal contains - a query that returns rows (ignored otherwise). Zero - denotes no limit. - - - - - - - - - - - -Flush (F) - - - - - - - - Byte1('H') - - - - Identifies the message as a Flush command. - - - - - - Int32(4) - - - - Length of message contents in bytes, including self. - - - - - - - - - - - - -FunctionCall (F) - - - - - - - - Byte1('F') - - - - Identifies the message as a function call. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int32 - - - - Specifies the object ID of the function to call. - - - - - - Int16 - - - - The number of argument format codes that follow - (denoted C below). - This can be zero to indicate that there are no arguments - or that the arguments all use the default format (text); - or one, in which case the specified format code is applied - to all arguments; or it can equal the actual number of - arguments. - - - - - - Int16[C] - - - - The argument format codes. Each must presently be - zero (text) or one (binary). - - - - - - Int16 - - - - Specifies the number of arguments being supplied to the - function. - - - - - Next, the following pair of fields appear for each argument: - - - - Int32 - - - - The length of the argument value, in bytes (this count - does not include itself). Can be zero. - As a special case, -1 indicates a NULL argument value. - No value bytes follow in the NULL case. - - - - - - Byten - - - - The value of the argument, in the format indicated by the - associated format code. - n is the above length. - - - - - After the last argument, the following field appears: - - - - Int16 - - - - The format code for the function result. Must presently be - zero (text) or one (binary). - - - - - - - - - - - - -FunctionCallResponse (B) - - - - - - - - Byte1('V') - - - - Identifies the message as a function call result. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int32 - - - - The length of the function result value, in bytes (this count - does not include itself). Can be zero. - As a special case, -1 indicates a NULL function result. - No value bytes follow in the NULL case. - - - - - - Byten - - - - The value of the function result, in the format indicated by - the associated format code. - n is the above length. - - - - - - - - - - - - -GSSENCRequest (F) - - - - - - - - Int32(8) - - - - Length of message contents in bytes, including self. - - - - - - Int32(80877104) - - - - The GSSAPI Encryption request code. The value is chosen to contain - 1234 in the most significant 16 bits, and 5680 in the - least significant 16 bits. (To avoid confusion, this code - must not be the same as any protocol version number.) - - - - - - - - - - - - -GSSResponse (F) - - - - - - - - Byte1('p') - - - - Identifies the message as a GSSAPI or SSPI response. Note that - this is also used for SASL and password response messages. - The exact message type can be deduced from the context. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Byten - - - - GSSAPI/SSPI specific message data. - - - - - - - - - - -NegotiateProtocolVersion (B) - - - - - - - - Byte1('v') - - - - Identifies the message as a protocol version negotiation - message. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int32 - - - - Newest minor protocol version supported by the server - for the major protocol version requested by the client. - - - - - - Int32 - - - - Number of protocol options not recognized by the server. - - - - - Then, for protocol option not recognized by the server, there - is the following: - - - - String - - - - The option name. - - - - - - - - - - -NoData (B) - - - - - - - - Byte1('n') - - - - Identifies the message as a no-data indicator. - - - - - - Int32(4) - - - - Length of message contents in bytes, including self. - - - - - - - - - - - - -NoticeResponse (B) - - - - - - - - Byte1('N') - - - - Identifies the message as a notice. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - The message body consists of one or more identified fields, - followed by a zero byte as a terminator. Fields can appear in - any order. For each field there is the following: - - - - Byte1 - - - - A code identifying the field type; if zero, this is - the message terminator and no string follows. - The presently defined field types are listed in - . - Since more field types might be added in future, - frontends should silently ignore fields of unrecognized - type. - - - - - - String - - - - The field value. - - - - - - - - - - - - -NotificationResponse (B) - - - - - - - - Byte1('A') - - - - Identifies the message as a notification response. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int32 - - - - The process ID of the notifying backend process. - - - - - - String - - - - The name of the channel that the notify has been raised on. - - - - - - String - - - - The payload string passed from the notifying process. - - - - - - - - - - - - -ParameterDescription (B) - - - - - - - - Byte1('t') - - - - Identifies the message as a parameter description. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int16 - - - - The number of parameters used by the statement - (can be zero). - - - - - Then, for each parameter, there is the following: - - - - Int32 - - - - Specifies the object ID of the parameter data type. - - - - - - - - - - - -ParameterStatus (B) - - - - - - - - Byte1('S') - - - - Identifies the message as a run-time parameter status report. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - String - - - - The name of the run-time parameter being reported. - - - - - - String - - - - The current value of the parameter. - - - - - - - - - - - -Parse (F) - - - - - - - - Byte1('P') - - - - Identifies the message as a Parse command. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - String - - - - The name of the destination prepared statement - (an empty string selects the unnamed prepared statement). - - - - - - String - - - - The query string to be parsed. - - - - - - Int16 - - - - The number of parameter data types specified - (can be zero). Note that this is not an indication of - the number of parameters that might appear in the - query string, only the number that the frontend wants to - prespecify types for. - - - - - Then, for each parameter, there is the following: - - - - Int32 - - - - Specifies the object ID of the parameter data type. - Placing a zero here is equivalent to leaving the type - unspecified. - - - - - - - - - - - -ParseComplete (B) - - - - - - - - Byte1('1') - - - - Identifies the message as a Parse-complete indicator. - - - - - - Int32(4) - - - - Length of message contents in bytes, including self. - - - - - - - - - - - - -PasswordMessage (F) - - - - - - - - Byte1('p') - - - - Identifies the message as a password response. Note that - this is also used for GSSAPI, SSPI and SASL response messages. - The exact message type can be deduced from the context. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - String - - - - The password (encrypted, if requested). - - - - - - - - - - - -PortalSuspended (B) - - - - - - - - Byte1('s') - - - - Identifies the message as a portal-suspended indicator. - Note this only appears if an Execute message's row-count limit - was reached. - - - - - - Int32(4) - - - - Length of message contents in bytes, including self. - - - - - - - - - - - - -Query (F) - - - - - - - - Byte1('Q') - - - - Identifies the message as a simple query. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - String - - - - The query string itself. - - - - - - - - - - - - -ReadyForQuery (B) - - - - - - - - Byte1('Z') - - - - Identifies the message type. ReadyForQuery is sent - whenever the backend is ready for a new query cycle. - - - - - - Int32(5) - - - - Length of message contents in bytes, including self. - - - - - - Byte1 - - - - Current backend transaction status indicator. - Possible values are 'I' if idle (not in - a transaction block); 'T' if in a transaction - block; or 'E' if in a failed transaction - block (queries will be rejected until block is ended). - - - - - - - - - - - - -RowDescription (B) - - - - - - - - Byte1('T') - - - - Identifies the message as a row description. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int16 - - - - Specifies the number of fields in a row (can be zero). - - - - - Then, for each field, there is the following: - - - - String - - - - The field name. - - - - - - Int32 - - - - If the field can be identified as a column of a specific - table, the object ID of the table; otherwise zero. - - - - - - Int16 - - - - If the field can be identified as a column of a specific - table, the attribute number of the column; otherwise zero. - - - - - - Int32 - - - - The object ID of the field's data type. - - - - - - Int16 - - - - The data type size (see pg_type.typlen). - Note that negative values denote variable-width types. - - - - - - Int32 - - - - The type modifier (see pg_attribute.atttypmod). - The meaning of the modifier is type-specific. - - - - - - Int16 - - - - The format code being used for the field. Currently will - be zero (text) or one (binary). In a RowDescription - returned from the statement variant of Describe, the - format code is not yet known and will always be zero. - - - - - - - - - - - - -SASLInitialResponse (F) - - - - - - - - Byte1('p') - - - - Identifies the message as an initial SASL response. Note that - this is also used for GSSAPI, SSPI and password response messages. - The exact message type is deduced from the context. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - String - - - - Name of the SASL authentication mechanism that the client - selected. - - - - - - Int32 - - - - Length of SASL mechanism specific "Initial Client Response" that - follows, or -1 if there is no Initial Response. - - - - - - Byten - - - - SASL mechanism specific "Initial Response". - - - - - - - - - - - -SASLResponse (F) - - - - - - - - Byte1('p') - - - - Identifies the message as a SASL response. Note that - this is also used for GSSAPI, SSPI and password response messages. - The exact message type can be deduced from the context. - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Byten - - - - SASL mechanism specific message data. - - - - - - - - - - - -SSLRequest (F) - - - - - - - - Int32(8) - - - - Length of message contents in bytes, including self. - - - - - - Int32(80877103) - - - - The SSL request code. The value is chosen to contain - 1234 in the most significant 16 bits, and 5679 in the - least significant 16 bits. (To avoid confusion, this code - must not be the same as any protocol version number.) - - - - - - - - - - - - -StartupMessage (F) - - - - - - - - Int32 - - - - Length of message contents in bytes, including self. - - - - - - Int32(196608) - - - - The protocol version number. The most significant 16 bits are - the major version number (3 for the protocol described here). - The least significant 16 bits are the minor version number - (0 for the protocol described here). - - - - - The protocol version number is followed by one or more pairs of - parameter name and value strings. A zero byte is required as a - terminator after the last name/value pair. - Parameters can appear in any - order. user is required, others are optional. - Each parameter is specified as: - - - - String - - - - The parameter name. Currently recognized names are: - - - - - user - - - - The database user name to connect as. Required; - there is no default. - - - - - - database - - - - The database to connect to. Defaults to the user name. - - - - - - options - - - - Command-line arguments for the backend. (This is - deprecated in favor of setting individual run-time - parameters.) Spaces within this string are - considered to separate arguments, unless escaped with - a backslash (\); write \\ to - represent a literal backslash. - - - - - - replication - - - - Used to connect in streaming replication mode, where - a small set of replication commands can be issued - instead of SQL statements. Value can be - true, false, or - database, and the default is - false. See - for details. - - - - - - In addition to the above, other parameters may be listed. - Parameter names beginning with _pq_. are - reserved for use as protocol extensions, while others are - treated as run-time parameters to be set at backend start - time. Such settings will be applied during backend start - (after parsing the command-line arguments if any) and will - act as session defaults. - - - - - - String - - - - The parameter value. - - - - - - - - - - - - -Sync (F) - - - - - - - - Byte1('S') - - - - Identifies the message as a Sync command. - - - - - - Int32(4) - - - - Length of message contents in bytes, including self. - - - - - - - - - - - - -Terminate (F) - - - - - - - - Byte1('X') - - - - Identifies the message as a termination. - - - - - - Int32(4) - - - - Length of message contents in bytes, including self. - - - - - - - - - - - - - - - - -Error and Notice Message Fields - - -This section describes the fields that can appear in ErrorResponse and -NoticeResponse messages. Each field type has a single-byte identification -token. Note that any given field type should appear at most once per -message. - - - - - - -S - - - - Severity: the field contents are - ERROR, FATAL, or - PANIC (in an error message), or - WARNING, NOTICE, DEBUG, - INFO, or LOG (in a notice message), - or a localized translation of one of these. Always present. - - - - - - -V - - - - Severity: the field contents are - ERROR, FATAL, or - PANIC (in an error message), or - WARNING, NOTICE, DEBUG, - INFO, or LOG (in a notice message). - This is identical to the S field except - that the contents are never localized. This is present only in - messages generated by PostgreSQL versions 9.6 - and later. - - - - - - -C - - - - Code: the SQLSTATE code for the error (see ). Not localizable. Always present. - - - - - - -M - - - - Message: the primary human-readable error message. - This should be accurate but terse (typically one line). - Always present. - - - - - - -D - - - - Detail: an optional secondary error message carrying more - detail about the problem. Might run to multiple lines. - - - - - - -H - - - - Hint: an optional suggestion what to do about the problem. - This is intended to differ from Detail in that it offers advice - (potentially inappropriate) rather than hard facts. - Might run to multiple lines. - - - - - - -P - - - - Position: the field value is a decimal ASCII integer, indicating - an error cursor position as an index into the original query string. - The first character has index 1, and positions are measured in - characters not bytes. - - - - - - -p - - - - Internal position: this is defined the same as the P - field, but it is used when the cursor position refers to an internally - generated command rather than the one submitted by the client. - The q field will always appear when this field appears. - - - - - - -q - - - - Internal query: the text of a failed internally-generated command. - This could be, for example, an SQL query issued by a PL/pgSQL function. - - - - - - -W - - - - Where: an indication of the context in which the error occurred. - Presently this includes a call stack traceback of active - procedural language functions and internally-generated queries. - The trace is one entry per line, most recent first. - - - - - - -s - - - - Schema name: if the error was associated with a specific database - object, the name of the schema containing that object, if any. - - - - - - -t - - - - Table name: if the error was associated with a specific table, the - name of the table. (Refer to the schema name field for the name of - the table's schema.) - - - - - - -c - - - - Column name: if the error was associated with a specific table column, - the name of the column. (Refer to the schema and table name fields to - identify the table.) - - - - - - -d - - - - Data type name: if the error was associated with a specific data type, - the name of the data type. (Refer to the schema name field for the - name of the data type's schema.) - - - - - - -n - - - - Constraint name: if the error was associated with a specific - constraint, the name of the constraint. Refer to fields listed above - for the associated table or domain. (For this purpose, indexes are - treated as constraints, even if they weren't created with constraint - syntax.) - - - - - - -F - - - - File: the file name of the source-code location where the error - was reported. - - - - - - -L - - - - Line: the line number of the source-code location where the error - was reported. - - - - - - -R - - - - Routine: the name of the source-code routine reporting the error. - - - - - - - - - The fields for schema name, table name, column name, data type name, and - constraint name are supplied only for a limited number of error types; - see . Frontends should not assume that - the presence of any of these fields guarantees the presence of another - field. Core error sources observe the interrelationships noted above, but - user-defined functions may use these fields in other ways. In the same - vein, clients should not assume that these fields denote contemporary - objects in the current database. - - - -The client is responsible for formatting displayed information to meet its -needs; in particular it should break long lines as needed. Newline characters -appearing in the error message fields should be treated as paragraph breaks, -not line breaks. - - - - - -Logical Replication Message Formats - - -This section describes the detailed format of each logical replication -message. These messages are either returned by the replication slot SQL -interface or are sent by a walsender. In the case of a walsender, they are -encapsulated inside replication protocol WAL messages as described in -, and generally obey the same message -flow as physical replication. - - - - - - -Begin - - - - - - - - Byte1('B') - - - - Identifies the message as a begin message. - - - - - - Int64 (XLogRecPtr) - - - - The final LSN of the transaction. - - - - - - Int64 (TimestampTz) - - - - Commit timestamp of the transaction. The value is in number - of microseconds since PostgreSQL epoch (2000-01-01). - - - - - - Int32 (TransactionId) - - - - Xid of the transaction. - - - - - - - - - - - -Message - - - - - - - - Byte1('M') - - - - Identifies the message as a logical decoding message. - - - - - - Int32 (TransactionId) - - - - Xid of the transaction (only present for streamed transactions). - This field is available since protocol version 2. - - - - - - Int8 - - - - Flags; Either 0 for no flags or 1 if the logical decoding - message is transactional. - - - - - - Int64 (XLogRecPtr) - - - - The LSN of the logical decoding message. - - - - - - String - - - - The prefix of the logical decoding message. - - - - - - - Int32 - - - - Length of the content. - - - - - - - Byten - - - - The content of the logical decoding message. - - - - - - - - - - - -Commit - - - - - - - - Byte1('C') - - - - Identifies the message as a commit message. - - - - - - Int8(0) - - - - Flags; currently unused. - - - - - - Int64 (XLogRecPtr) - - - - The LSN of the commit. - - - - - - Int64 (XLogRecPtr) - - - - The end LSN of the transaction. - - - - - - Int64 (TimestampTz) - - - - Commit timestamp of the transaction. The value is in number - of microseconds since PostgreSQL epoch (2000-01-01). - - - - - - - - - - - -Origin - - - - - - - - Byte1('O') - - - - Identifies the message as an origin message. - - - - - - Int64 (XLogRecPtr) - - - - The LSN of the commit on the origin server. - - - - - - String - - - - Name of the origin. - - - - - - - - - Note that there can be multiple Origin messages inside a single transaction. - - - - - - - -Relation - - - - - - - - Byte1('R') - - - - Identifies the message as a relation message. - - - - - - Int32 (TransactionId) - - - - Xid of the transaction (only present for streamed transactions). - This field is available since protocol version 2. - - - - - - Int32 (Oid) - - - - OID of the relation. - - - - - - String - - - - Namespace (empty string for pg_catalog). - - - - - - String - - - - Relation name. - - - - - - - Int8 - - - - Replica identity setting for the relation (same as - relreplident in pg_class). - - - - - - - Int16 - - - - Number of columns. - - - - - Next, the following message part appears for each column included in - the publication (except generated columns): - - - - Int8 - - - - Flags for the column. Currently can be either 0 for no flags - or 1 which marks the column as part of the key. - - - - - - String - - - - Name of the column. - - - - - - Int32 (Oid) - - - - OID of the column's data type. - - - - - - Int32 - - - - Type modifier of the column (atttypmod). - - - - - - - - - - - -Type - - - - - - - - Byte1('Y') - - - - Identifies the message as a type message. - - - - - - Int32 (TransactionId) - - - - Xid of the transaction (only present for streamed transactions). - This field is available since protocol version 2. - - - - - - Int32 (Oid) - - - - OID of the data type. - - - - - - String - - - - Namespace (empty string for pg_catalog). - - - - - - String - - - - Name of the data type. - - - - - - - - - - - -Insert - - - - - - - - Byte1('I') - - - - Identifies the message as an insert message. - - - - - - Int32 (TransactionId) - - - - Xid of the transaction (only present for streamed transactions). - This field is available since protocol version 2. - - - - - - Int32 (Oid) - - - - OID of the relation corresponding to the ID in the relation - message. - - - - - - Byte1('N') - - - - Identifies the following TupleData message as a new tuple. - - - - - - - TupleData - - - - TupleData message part representing the contents of new tuple. - - - - - - - - - - - -Update - - - - - - - - Byte1('U') - - - - Identifies the message as an update message. - - - - - - Int32 (TransactionId) - - - - Xid of the transaction (only present for streamed transactions). - This field is available since protocol version 2. - - - - - - Int32 (Oid) - - - - OID of the relation corresponding to the ID in the relation - message. - - - - - - - Byte1('K') - - - - Identifies the following TupleData submessage as a key. - This field is optional and is only present if - the update changed data in any of the column(s) that are - part of the REPLICA IDENTITY index. - - - - - - - Byte1('O') - - - - Identifies the following TupleData submessage as an old tuple. - This field is optional and is only present if table in which - the update happened has REPLICA IDENTITY set to FULL. - - - - - - - TupleData - - - - TupleData message part representing the contents of the old tuple - or primary key. Only present if the previous 'O' or 'K' part - is present. - - - - - - - Byte1('N') - - - - Identifies the following TupleData message as a new tuple. - - - - - - - TupleData - - - - TupleData message part representing the contents of a new tuple. - - - - - - - - - The Update message may contain either a 'K' message part or an 'O' message part - or neither of them, but never both of them. - - - - - - - -Delete - - - - - - - - Byte1('D') - - - - Identifies the message as a delete message. - - - - - - Int32 (TransactionId) - - - - Xid of the transaction (only present for streamed transactions). - This field is available since protocol version 2. - - - - - - Int32 (Oid) - - - - OID of the relation corresponding to the ID in the relation - message. - - - - - - - Byte1('K') - - - - Identifies the following TupleData submessage as a key. - This field is present if the table in which the delete has - happened uses an index as REPLICA IDENTITY. - - - - - - - Byte1('O') - - - - Identifies the following TupleData message as an old tuple. - This field is present if the table in which the delete - happened has REPLICA IDENTITY set to FULL. - - - - - - - TupleData - - - - TupleData message part representing the contents of the old tuple - or primary key, depending on the previous field. - - - - - - - - The Delete message may contain either a 'K' message part or an 'O' message part, - but never both of them. - - - - - - - -Truncate - - - - - - - - Byte1('T') - - - - Identifies the message as a truncate message. - - - - - - Int32 (TransactionId) - - - - Xid of the transaction (only present for streamed transactions). - This field is available since protocol version 2. - - - - - - Int32 - - - - Number of relations - - - - - - Int8 - - - - Option bits for TRUNCATE: - 1 for CASCADE, 2 for RESTART IDENTITY - - - - - - Int32 (Oid) - - - - OID of the relation corresponding to the ID in the relation - message. This field is repeated for each relation. - - - - - - - - - - - - - -The following messages (Stream Start, Stream Stop, Stream Commit, and -Stream Abort) are available since protocol version 2. - - - - - - - -Stream Start - - - - - - - - Byte1('S') - - - - Identifies the message as a stream start message. - - - - - - Int32 (TransactionId) - - - - Xid of the transaction. - - - - - - Int8 - - - - A value of 1 indicates this is the first stream segment for - this XID, 0 for any other stream segment. - - - - - - - - - - - -Stream Stop - - - - - - - - Byte1('E') - - - - Identifies the message as a stream stop message. - - - - - - - - - - - -Stream Commit - - - - - - - - Byte1('c') - - - - Identifies the message as a stream commit message. - - - - - - Int32 (TransactionId) - - - - Xid of the transaction. - - - - - - Int8(0) - - - - Flags; currently unused. - - - - - - Int64 (XLogRecPtr) - - - - The LSN of the commit. - - - - - - Int64 (XLogRecPtr) - - - - The end LSN of the transaction. - - - - - - Int64 (TimestampTz) - - - - Commit timestamp of the transaction. The value is in number - of microseconds since PostgreSQL epoch (2000-01-01). - - - - - - - - - - - -Stream Abort - - - - - - - - Byte1('A') - - - - Identifies the message as a stream abort message. - - - - - - Int32 (TransactionId) - - - - Xid of the transaction. - - - - - - Int32 (TransactionId) - - - - Xid of the subtransaction (will be same as xid of the transaction for top-level - transactions). - - - - - - - - - - - - -The following messages (Begin Prepare, Prepare, Commit Prepared, Rollback Prepared, Stream Prepare) -are available since protocol version 3. - - - - - - -Begin Prepare - - - - - - -Byte1('b') - - Identifies the message as the beginning of a two-phase transaction message. - - - - - - Int64 (XLogRecPtr) - - - The LSN of the prepare. - - - - - - Int64 (XLogRecPtr) - - - The end LSN of the prepared transaction. - - - - - - Int64 (TimestampTz) - - - Prepare timestamp of the transaction. The value is in number - of microseconds since PostgreSQL epoch (2000-01-01). - - - - - - Int32 (TransactionId) - - - Xid of the transaction. - - - - -String - - The user defined GID of the two-phase transaction. - - - - - - - - - - - -Prepare - - - - - - -Byte1('P') - - Identifies the message as a two-phase prepared transaction message. - - - - - - Int8(0) - - - Flags; currently unused. - - - - - - Int64 (XLogRecPtr) - - - The LSN of the prepare. - - - - - - Int64 (XLogRecPtr) - - - The end LSN of the prepared transaction. - - - - - - Int64 (TimestampTz) - - - Prepare timestamp of the transaction. The value is in number - of microseconds since PostgreSQL epoch (2000-01-01). - - - - - - Int32 (TransactionId) - - - Xid of the transaction. - - - - -String - - The user defined GID of the two-phase transaction. - - - - - - - - - - - -Commit Prepared - - - - - - -Byte1('K') - - Identifies the message as the commit of a two-phase transaction message. - - - - - - Int8(0) - - - Flags; currently unused. - - - - - - Int64 (XLogRecPtr) - - - The LSN of the commit prepared. - - - - - - Int64 (XLogRecPtr) - - - The end LSN of the commit prepared transaction. - - - - - - Int64 (TimestampTz) - - - Commit timestamp of the transaction. The value is in number - of microseconds since PostgreSQL epoch (2000-01-01). - - - - - - Int32 (TransactionId) - - - Xid of the transaction. - - - - -String - - The user defined GID of the two-phase transaction. - - - - - - - - - - - -Rollback Prepared - - - - - - -Byte1('r') - - Identifies the message as the rollback of a two-phase transaction message. - - - - - - Int8(0) - - - Flags; currently unused. - - - - - - Int64 (XLogRecPtr) - - - The end LSN of the prepared transaction. - - - - - - Int64 (XLogRecPtr) - - - The end LSN of the rollback prepared transaction. - - - - - - Int64 (TimestampTz) - - - Prepare timestamp of the transaction. The value is in number - of microseconds since PostgreSQL epoch (2000-01-01). - - - - - - Int64 (TimestampTz) - - - Rollback timestamp of the transaction. The value is in number - of microseconds since PostgreSQL epoch (2000-01-01). - - - - - - Int32 (TransactionId) - - - Xid of the transaction. - - - - -String - - The user defined GID of the two-phase transaction. - - - - - - - - - - - -Stream Prepare - - - - - - -Byte1('p') - - Identifies the message as a two-phase stream prepare message. - - - - - - Int8(0) - - - Flags; currently unused. - - - - - - Int64 (XLogRecPtr) - - - The LSN of the prepare. - - - - - - Int64 (XLogRecPtr) - - - The end LSN of the prepare transaction. - - - - - - Int64 (TimestampTz) - - - Prepare timestamp of the transaction. The value is in number - of microseconds since PostgreSQL epoch (2000-01-01). - - - - - - Int32 (TransactionId) - - - Xid of the transaction. - - - - -String - - The user defined GID of the two-phase transaction. - - - - - - - - - - - - - -The following message parts are shared by the above messages. - - - - - - - -TupleData - - - - - - - - Int16 - - - - Number of columns. - - - - - Next, one of the following submessages appears for each column (except generated columns): - - - - Byte1('n') - - - - Identifies the data as NULL value. - - - - - Or - - - - Byte1('u') - - - - Identifies unchanged TOASTed value (the actual value is not - sent). - - - - - Or - - - - Byte1('t') - - - - Identifies the data as text formatted value. - - - - - Or - - - - Byte1('b') - - - - Identifies the data as binary formatted value. - - - - - - Int32 - - - - Length of the column value. - - - - - - Byten - - - - The value of the column, either in binary or in text format. - (As specified in the preceding format byte). - n is the above length. - - - - - - - - - - - + + The backend sends ParameterStatus ('S') messages during connection + startup for all parameters it considers interesting to the client library. + Subsequently, a ParameterStatus message is sent whenever the active value + changes for any of these parameters. + - + + The RowDescription ('T') message carries new table OID and column + number fields for each column of the described row. It also shows the format + code for each column. + - -Summary of Changes since Protocol 2.0 - - -This section provides a quick checklist of changes, for the benefit of -developers trying to update existing client libraries to protocol 3.0. - - - -The initial startup packet uses a flexible list-of-strings format -instead of a fixed format. Notice that session default values for run-time -parameters can now be specified directly in the startup packet. (Actually, -you could do that before using the options field, but given the -limited width of options and the lack of any way to quote -whitespace in the values, it wasn't a very safe technique.) - - - -All messages now have a length count immediately following the message type -byte (except for startup packets, which have no type byte). Also note that -PasswordMessage now has a type byte. - - - -ErrorResponse and NoticeResponse ('E' and 'N') -messages now contain multiple fields, from which the client code can -assemble an error message of the desired level of verbosity. Note that -individual fields will typically not end with a newline, whereas the single -string sent in the older protocol always did. - - - -The ReadyForQuery ('Z') message includes a transaction status -indicator. - - - -The distinction between BinaryRow and DataRow message types is gone; the -single DataRow message type serves for returning data in all formats. -Note that the layout of DataRow has changed to make it easier to parse. -Also, the representation of binary values has changed: it is no longer -directly tied to the server's internal representation. - - - -There is a new extended query sub-protocol, which adds the frontend -message types Parse, Bind, Execute, Describe, Close, Flush, and Sync, and the -backend message types ParseComplete, BindComplete, PortalSuspended, -ParameterDescription, NoData, and CloseComplete. Existing clients do not -have to concern themselves with this sub-protocol, but making use of it -might allow improvements in performance or functionality. - - - -COPY data is now encapsulated into CopyData and CopyDone messages. There -is a well-defined way to recover from errors during COPY. The special -\. last line is not needed anymore, and is not sent -during COPY OUT. -(It is still recognized as a terminator during COPY IN, but its use is -deprecated and will eventually be removed.) Binary COPY is supported. -The CopyInResponse and CopyOutResponse messages include fields indicating -the number of columns and the format of each column. - - - -The layout of FunctionCall and FunctionCallResponse messages has changed. -FunctionCall can now support passing NULL arguments to functions. It also -can handle passing parameters and retrieving results in either text or -binary format. There is no longer any reason to consider FunctionCall a -potential security hole, since it does not offer direct access to internal -server data representations. - - - -The backend sends ParameterStatus ('S') messages during connection -startup for all parameters it considers interesting to the client library. -Subsequently, a ParameterStatus message is sent whenever the active value -changes for any of these parameters. - - - -The RowDescription ('T') message carries new table OID and column -number fields for each column of the described row. It also shows the format -code for each column. - - - -The CursorResponse ('P') message is no longer generated by -the backend. - - - -The NotificationResponse ('A') message has an additional string -field, which can carry a payload string passed -from the NOTIFY event sender. - - - -The EmptyQueryResponse ('I') message used to include an empty -string parameter; this has been removed. - + + The CursorResponse ('P') message is no longer generated by + the backend. + - + + The NotificationResponse ('A') message has an additional string + field, which can carry a payload string passed + from the NOTIFY event sender. + + + The EmptyQueryResponse ('I') message used to include an empty + string parameter; this has been removed. + + From 3ab9a63cb638a1fd99475668e2da9c237495aeda Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 13 May 2022 11:40:01 -0400 Subject: [PATCH 669/772] Rename JsonIsPredicate.value_type, fix JSON backend/nodes/ infrastructure. I started out with the intention to rename value_type to item_type to avoid a collision with a typedef name that appears on some platforms. Along the way, I noticed that the adjacent field "format" was not being correctly handled by the backend/nodes/ infrastructure functions: copyfuncs.c erroneously treated it as a scalar, while equalfuncs, outfuncs, and readfuncs omitted handling it at all. This looks like it might be cosmetic at the moment because the field is always NULL after parse analysis; but that's likely a bug in itself, and the code's certainly not very future-proof. Let's fix it while we can still do so without forcing an initdb on beta testers. Further study found a few other inconsistencies in the backend/nodes/ infrastructure for the recently-added JSON node types, so fix those too. catversion bumped because of potential change in stored rules. Discussion: https://postgr.es/m/526703.1652385613@sss.pgh.pa.us --- src/backend/executor/execExprInterp.c | 12 ++++++------ src/backend/nodes/copyfuncs.c | 9 +++++---- src/backend/nodes/equalfuncs.c | 8 +++++--- src/backend/nodes/makefuncs.c | 4 ++-- src/backend/nodes/outfuncs.c | 16 +++++++++------- src/backend/nodes/readfuncs.c | 16 +++++++++------- src/backend/parser/parse_expr.c | 6 +++--- src/backend/utils/adt/ruleutils.c | 4 +++- src/backend/utils/misc/queryjumble.c | 9 +++++---- src/include/catalog/catversion.h | 2 +- src/include/nodes/makefuncs.h | 2 +- src/include/nodes/primnodes.h | 6 +++--- 12 files changed, 52 insertions(+), 42 deletions(-) diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index e024611aa5..e44ad68cda 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -3952,24 +3952,24 @@ ExecEvalJsonIsPredicate(ExprState *state, ExprEvalStep *op) { text *json = DatumGetTextP(js); - if (pred->value_type == JS_TYPE_ANY) + if (pred->item_type == JS_TYPE_ANY) res = true; else { switch (json_get_first_token(json, false)) { case JSON_TOKEN_OBJECT_START: - res = pred->value_type == JS_TYPE_OBJECT; + res = pred->item_type == JS_TYPE_OBJECT; break; case JSON_TOKEN_ARRAY_START: - res = pred->value_type == JS_TYPE_ARRAY; + res = pred->item_type == JS_TYPE_ARRAY; break; case JSON_TOKEN_STRING: case JSON_TOKEN_NUMBER: case JSON_TOKEN_TRUE: case JSON_TOKEN_FALSE: case JSON_TOKEN_NULL: - res = pred->value_type == JS_TYPE_SCALAR; + res = pred->item_type == JS_TYPE_SCALAR; break; default: res = false; @@ -3986,13 +3986,13 @@ ExecEvalJsonIsPredicate(ExprState *state, ExprEvalStep *op) } else if (exprtype == JSONBOID) { - if (pred->value_type == JS_TYPE_ANY) + if (pred->item_type == JS_TYPE_ANY) res = true; else { Jsonb *jb = DatumGetJsonbP(js); - switch (pred->value_type) + switch (pred->item_type) { case JS_TYPE_OBJECT: res = JB_ROOT_IS_OBJECT(jb); diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 205506305b..51d630fa89 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -2557,11 +2557,11 @@ _copyJsonExpr(const JsonExpr *from) COPY_NODE_FIELD(result_coercion); COPY_NODE_FIELD(format); COPY_NODE_FIELD(path_spec); - COPY_NODE_FIELD(passing_values); COPY_NODE_FIELD(passing_names); + COPY_NODE_FIELD(passing_values); COPY_NODE_FIELD(returning); - COPY_NODE_FIELD(on_error); COPY_NODE_FIELD(on_empty); + COPY_NODE_FIELD(on_error); COPY_NODE_FIELD(coercions); COPY_SCALAR_FIELD(wrapper); COPY_SCALAR_FIELD(omit_quotes); @@ -2637,8 +2637,8 @@ _copyJsonIsPredicate(const JsonIsPredicate *from) JsonIsPredicate *newnode = makeNode(JsonIsPredicate); COPY_NODE_FIELD(expr); - COPY_SCALAR_FIELD(format); - COPY_SCALAR_FIELD(value_type); + COPY_NODE_FIELD(format); + COPY_SCALAR_FIELD(item_type); COPY_SCALAR_FIELD(unique_keys); COPY_LOCATION_FIELD(location); @@ -2764,6 +2764,7 @@ _copyJsonTableParent(const JsonTableParent *from) COPY_SCALAR_FIELD(outerJoin); COPY_SCALAR_FIELD(colMin); COPY_SCALAR_FIELD(colMax); + COPY_SCALAR_FIELD(errorOnError); return newnode; } diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 9688b22a4b..e747e1667d 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -186,6 +186,7 @@ _equalJsonTableParent(const JsonTableParent *a, const JsonTableParent *b) COMPARE_SCALAR_FIELD(outerJoin); COMPARE_SCALAR_FIELD(colMin); COMPARE_SCALAR_FIELD(colMax); + COMPARE_SCALAR_FIELD(errorOnError); return true; } @@ -1104,7 +1105,8 @@ _equalJsonIsPredicate(const JsonIsPredicate *a, const JsonIsPredicate *b) { COMPARE_NODE_FIELD(expr); - COMPARE_SCALAR_FIELD(value_type); + COMPARE_NODE_FIELD(format); + COMPARE_SCALAR_FIELD(item_type); COMPARE_SCALAR_FIELD(unique_keys); COMPARE_LOCATION_FIELD(location); @@ -1134,11 +1136,11 @@ _equalJsonExpr(const JsonExpr *a, const JsonExpr *b) COMPARE_NODE_FIELD(result_coercion); COMPARE_NODE_FIELD(format); COMPARE_NODE_FIELD(path_spec); - COMPARE_NODE_FIELD(passing_values); COMPARE_NODE_FIELD(passing_names); + COMPARE_NODE_FIELD(passing_values); COMPARE_NODE_FIELD(returning); - COMPARE_NODE_FIELD(on_error); COMPARE_NODE_FIELD(on_empty); + COMPARE_NODE_FIELD(on_error); COMPARE_NODE_FIELD(coercions); COMPARE_SCALAR_FIELD(wrapper); COMPARE_SCALAR_FIELD(omit_quotes); diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c index 41e26a0fe6..28288dcfc1 100644 --- a/src/backend/nodes/makefuncs.c +++ b/src/backend/nodes/makefuncs.c @@ -927,14 +927,14 @@ makeJsonKeyValue(Node *key, Node *value) * creates a JsonIsPredicate node */ Node * -makeJsonIsPredicate(Node *expr, JsonFormat *format, JsonValueType value_type, +makeJsonIsPredicate(Node *expr, JsonFormat *format, JsonValueType item_type, bool unique_keys, int location) { JsonIsPredicate *n = makeNode(JsonIsPredicate); n->expr = expr; n->format = format; - n->value_type = value_type; + n->item_type = item_type; n->unique_keys = unique_keys; n->location = location; diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 0271ea9d78..ce12915592 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1801,13 +1801,13 @@ _outJsonConstructorExpr(StringInfo str, const JsonConstructorExpr *node) { WRITE_NODE_TYPE("JSONCONSTRUCTOREXPR"); + WRITE_ENUM_FIELD(type, JsonConstructorType); WRITE_NODE_FIELD(args); WRITE_NODE_FIELD(func); WRITE_NODE_FIELD(coercion); - WRITE_ENUM_FIELD(type, JsonConstructorType); WRITE_NODE_FIELD(returning); - WRITE_BOOL_FIELD(unique); WRITE_BOOL_FIELD(absent_on_null); + WRITE_BOOL_FIELD(unique); WRITE_LOCATION_FIELD(location); } @@ -1817,7 +1817,8 @@ _outJsonIsPredicate(StringInfo str, const JsonIsPredicate *node) WRITE_NODE_TYPE("JSONISPREDICATE"); WRITE_NODE_FIELD(expr); - WRITE_ENUM_FIELD(value_type, JsonValueType); + WRITE_NODE_FIELD(format); + WRITE_ENUM_FIELD(item_type, JsonValueType); WRITE_BOOL_FIELD(unique_keys); WRITE_LOCATION_FIELD(location); } @@ -1841,11 +1842,11 @@ _outJsonExpr(StringInfo str, const JsonExpr *node) WRITE_NODE_FIELD(result_coercion); WRITE_NODE_FIELD(format); WRITE_NODE_FIELD(path_spec); - WRITE_NODE_FIELD(passing_values); WRITE_NODE_FIELD(passing_names); + WRITE_NODE_FIELD(passing_values); WRITE_NODE_FIELD(returning); - WRITE_NODE_FIELD(on_error); WRITE_NODE_FIELD(on_empty); + WRITE_NODE_FIELD(on_error); WRITE_NODE_FIELD(coercions); WRITE_ENUM_FIELD(wrapper, JsonWrapper); WRITE_BOOL_FIELD(omit_quotes); @@ -1883,7 +1884,7 @@ _outJsonItemCoercions(StringInfo str, const JsonItemCoercions *node) static void _outJsonTableParent(StringInfo str, const JsonTableParent *node) { - WRITE_NODE_TYPE("JSONTABPNODE"); + WRITE_NODE_TYPE("JSONTABLEPARENT"); WRITE_NODE_FIELD(path); WRITE_STRING_FIELD(name); @@ -1891,12 +1892,13 @@ _outJsonTableParent(StringInfo str, const JsonTableParent *node) WRITE_BOOL_FIELD(outerJoin); WRITE_INT_FIELD(colMin); WRITE_INT_FIELD(colMax); + WRITE_BOOL_FIELD(errorOnError); } static void _outJsonTableSibling(StringInfo str, const JsonTableSibling *node) { - WRITE_NODE_TYPE("JSONTABSNODE"); + WRITE_NODE_TYPE("JSONTABLESIBLING"); WRITE_NODE_FIELD(larg); WRITE_NODE_FIELD(rarg); diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index ddf76ac778..6a05b69415 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -1484,13 +1484,13 @@ _readJsonConstructorExpr(void) { READ_LOCALS(JsonConstructorExpr); + READ_ENUM_FIELD(type, JsonConstructorType); READ_NODE_FIELD(args); READ_NODE_FIELD(func); READ_NODE_FIELD(coercion); - READ_INT_FIELD(type); READ_NODE_FIELD(returning); - READ_BOOL_FIELD(unique); READ_BOOL_FIELD(absent_on_null); + READ_BOOL_FIELD(unique); READ_LOCATION_FIELD(location); READ_DONE(); @@ -1523,11 +1523,11 @@ _readJsonExpr(void) READ_NODE_FIELD(result_coercion); READ_NODE_FIELD(format); READ_NODE_FIELD(path_spec); - READ_NODE_FIELD(passing_values); READ_NODE_FIELD(passing_names); + READ_NODE_FIELD(passing_values); READ_NODE_FIELD(returning); - READ_NODE_FIELD(on_error); READ_NODE_FIELD(on_empty); + READ_NODE_FIELD(on_error); READ_NODE_FIELD(coercions); READ_ENUM_FIELD(wrapper, JsonWrapper); READ_BOOL_FIELD(omit_quotes); @@ -1547,6 +1547,7 @@ _readJsonTableParent(void) READ_BOOL_FIELD(outerJoin); READ_INT_FIELD(colMin); READ_INT_FIELD(colMax); + READ_BOOL_FIELD(errorOnError); READ_DONE(); } @@ -1610,7 +1611,8 @@ _readJsonIsPredicate() READ_LOCALS(JsonIsPredicate); READ_NODE_FIELD(expr); - READ_ENUM_FIELD(value_type, JsonValueType); + READ_NODE_FIELD(format); + READ_ENUM_FIELD(item_type, JsonValueType); READ_BOOL_FIELD(unique_keys); READ_LOCATION_FIELD(location); @@ -3229,9 +3231,9 @@ parseNodeString(void) return_value = _readJsonCoercion(); else if (MATCH("JSONITEMCOERCIONS", 17)) return_value = _readJsonItemCoercions(); - else if (MATCH("JSONTABPNODE", 12)) + else if (MATCH("JSONTABLEPARENT", 15)) return_value = _readJsonTableParent(); - else if (MATCH("JSONTABSNODE", 12)) + else if (MATCH("JSONTABLESIBLING", 16)) return_value = _readJsonTableSibling(); else { diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 17709c3416..0dc2fc472e 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -4018,8 +4018,7 @@ transformJsonParseArg(ParseState *pstate, Node *jsexpr, JsonFormat *format, } /* - * Transform IS JSON predicate into - * json[b]_is_valid(json, value_type [, check_key_uniqueness]) call. + * Transform IS JSON predicate. */ static Node * transformJsonIsPredicate(ParseState *pstate, JsonIsPredicate *pred) @@ -4035,7 +4034,8 @@ transformJsonIsPredicate(ParseState *pstate, JsonIsPredicate *pred) errmsg("cannot use type %s in IS JSON predicate", format_type_be(exprtype)))); - return makeJsonIsPredicate(expr, NULL, pred->value_type, + /* This intentionally(?) drops the format clause. */ + return makeJsonIsPredicate(expr, NULL, pred->item_type, pred->unique_keys, pred->location); } diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index f22ecfc583..49c4201dde 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -9730,7 +9730,9 @@ get_rule_expr(Node *node, deparse_context *context, appendStringInfoString(context->buf, " IS JSON"); - switch (pred->value_type) + /* TODO: handle FORMAT clause */ + + switch (pred->item_type) { case JS_TYPE_SCALAR: appendStringInfoString(context->buf, " SCALAR"); diff --git a/src/backend/utils/misc/queryjumble.c b/src/backend/utils/misc/queryjumble.c index d35027275f..eeaa0b31fe 100644 --- a/src/backend/utils/misc/queryjumble.c +++ b/src/backend/utils/misc/queryjumble.c @@ -741,7 +741,7 @@ JumbleExpr(JumbleState *jstate, Node *node) { JsonFormat *format = (JsonFormat *) node; - APP_JUMB(format->type); + APP_JUMB(format->format_type); APP_JUMB(format->encoding); } break; @@ -767,12 +767,13 @@ JumbleExpr(JumbleState *jstate, Node *node) { JsonConstructorExpr *ctor = (JsonConstructorExpr *) node; + APP_JUMB(ctor->type); + JumbleExpr(jstate, (Node *) ctor->args); JumbleExpr(jstate, (Node *) ctor->func); JumbleExpr(jstate, (Node *) ctor->coercion); JumbleExpr(jstate, (Node *) ctor->returning); - APP_JUMB(ctor->type); - APP_JUMB(ctor->unique); APP_JUMB(ctor->absent_on_null); + APP_JUMB(ctor->unique); } break; case T_JsonIsPredicate: @@ -781,8 +782,8 @@ JumbleExpr(JumbleState *jstate, Node *node) JumbleExpr(jstate, (Node *) pred->expr); JumbleExpr(jstate, (Node *) pred->format); + APP_JUMB(pred->item_type); APP_JUMB(pred->unique_keys); - APP_JUMB(pred->value_type); } break; case T_JsonExpr: diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 805e870842..2cdcfa667a 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202205121 +#define CATALOG_VERSION_NO 202205131 #endif diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h index c717468eb3..06e6369026 100644 --- a/src/include/nodes/makefuncs.h +++ b/src/include/nodes/makefuncs.h @@ -114,7 +114,7 @@ extern Node *makeJsonTableJoinedPlan(JsonTablePlanJoinType type, Node *plan1, Node *plan2, int location); extern Node *makeJsonKeyValue(Node *key, Node *value); extern Node *makeJsonIsPredicate(Node *expr, JsonFormat *format, - JsonValueType vtype, bool unique_keys, + JsonValueType item_type, bool unique_keys, int location); extern JsonEncoding makeJsonEncoding(char *name); diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index 66e179c435..51505eee85 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -1387,14 +1387,14 @@ typedef enum JsonValueType /* * JsonIsPredicate - - * untransformed representation of IS JSON predicate + * representation of IS JSON predicate */ typedef struct JsonIsPredicate { NodeTag type; - Node *expr; /* untransformed expression */ + Node *expr; /* subject expression */ JsonFormat *format; /* FORMAT clause, if specified */ - JsonValueType value_type; /* JSON item type */ + JsonValueType item_type; /* JSON item type */ bool unique_keys; /* check key uniqueness? */ int location; /* token location, or -1 if unknown */ } JsonIsPredicate; From 3715850ecc524544546e696bb0a7bbc44095d12a Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Fri, 13 May 2022 11:50:24 -0400 Subject: [PATCH 670/772] relnotes: add null logical replication item Also move system view item to logical replication, mention "infinite _error_ loops". Reported-by: Euler Taveira, Takamichi Osumi, Amit Langote Discussion: https://postgr.es/m/21e8ef3b-6ffb-49d8-867f-4622a4dffcf3@www.fastmail.com --- doc/src/sgml/release-15.sgml | 44 ++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/doc/src/sgml/release-15.sgml b/doc/src/sgml/release-15.sgml index 79bffcbbbf..d18a4821ae 100644 --- a/doc/src/sgml/release-15.sgml +++ b/doc/src/sgml/release-15.sgml @@ -568,17 +568,6 @@ Previously, such updates ran delete actions on the source partition and insert a - - - - -Remove incorrect duplicate partitions in system view pg_publication_tables (Hou Zhijie) - - - + + + +Prevent logical replication of empty transactions (Ajin Cherian, Hou Zhijie, Euler Taveira) + + + +Previously, write transactions would send empty transactions to subscribers if subscribed tables were not modified. + + + - + + + +Remove incorrect duplicate partitions in system view pg_publication_tables (Hou Zhijie) + From c4f113e8fef900e9e7e7c77a3a21db1535e5be72 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Fri, 13 May 2022 23:52:35 +0200 Subject: [PATCH 671/772] Clean up newlines following left parentheses Like commit c9d297751959. --- src/backend/executor/nodeAgg.c | 4 ++-- src/backend/replication/logical/reorderbuffer.c | 3 +-- src/backend/storage/ipc/standby.c | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 3223d9b24e..139b2bd5f9 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -2656,8 +2656,8 @@ agg_refill_hash_table(AggState *aggstate) prepare_hash_slot(perhash, aggstate->tmpcontext->ecxt_outertuple, hashslot); - entry = LookupTupleHashEntryHash( - perhash->hashtable, hashslot, p_isnew, hash); + entry = LookupTupleHashEntryHash(perhash->hashtable, hashslot, + p_isnew, hash); if (entry != NULL) { diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index da7bd1321c..8da5f9089c 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -2337,8 +2337,7 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, case REORDER_BUFFER_CHANGE_INVALIDATION: /* Execute the invalidation messages locally */ - ReorderBufferExecuteInvalidations( - change->data.inval.ninvalidations, + ReorderBufferExecuteInvalidations(change->data.inval.ninvalidations, change->data.inval.invalidations); break; diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c index 8c5e8432e7..671b00a33c 100644 --- a/src/backend/storage/ipc/standby.c +++ b/src/backend/storage/ipc/standby.c @@ -821,8 +821,7 @@ ResolveRecoveryConflictWithBufferPin(void) * not be so harmful because the period that the buffer is kept pinned * is basically no so long. But we should fix this? */ - SendRecoveryConflictWithBufferPin( - PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK); + SendRecoveryConflictWithBufferPin(PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK); } /* From fcab82a2d79b4533cfdc8e8d5e00dbdf6830d63a Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 14 May 2022 08:27:59 +0900 Subject: [PATCH 672/772] Fix comment in pg_proc.c pgstat_create_function() creates stats for a function in a transactional fashion, so the stats would be dropped if transaction creating the function is aborted, not committed. Author: Amul Sul Discussion: https://postgr.es/m/CAAJ_b97x1T3xgAMWNj4w7kSgN0nTuG-vLrQJ4NB-dsNr0Kudxw@mail.gmail.com --- src/backend/catalog/pg_proc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c index d82221fdb8..9644336ded 100644 --- a/src/backend/catalog/pg_proc.c +++ b/src/backend/catalog/pg_proc.c @@ -710,7 +710,7 @@ ProcedureCreate(const char *procedureName, AtEOXact_GUC(true, save_nestlevel); } - /* ensure that stats are dropped if transaction commits */ + /* ensure that stats are dropped if transaction aborts */ if (!is_update) pgstat_create_function(retval); From 93759c665d482b5bf76ca22c9cac91e713e9386e Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Sat, 14 May 2022 11:58:10 +1200 Subject: [PATCH 673/772] Fix slow animal timeouts in 032_relfilenode_reuse.pl. Per BF animal chipmunk: CREATE DATABASE could apparently fail due to an AV process being in the template database and not quitting fast enough for the 5 second timeout in CountOtherDBBackends(). The test script had autovacuum_naptime=1s to encourage more activity and opening of fds, but that wasn't strictly necessary for this test. Take it out. Per BF animal skink: there was a 300s timeout for all tests in the script, but apparently that was not enough under valgrind. Let's use the standard timeout $PostgreSQL::Test::Utils::timeout_default, but restart it for each query we run. Reviewed-by: Robert Haas Discussion: https://postgr.es/m/CA%2BhUKGKa8HNJaA24gqiiFoGy0ysndeVoJsHvX_q1-DVLFaGAmw%40mail.gmail.com --- src/test/recovery/t/032_relfilenode_reuse.pl | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/test/recovery/t/032_relfilenode_reuse.pl b/src/test/recovery/t/032_relfilenode_reuse.pl index ae7e32763f..92ec510037 100644 --- a/src/test/recovery/t/032_relfilenode_reuse.pl +++ b/src/test/recovery/t/032_relfilenode_reuse.pl @@ -15,7 +15,6 @@ # to avoid "repairing" corruption full_page_writes=off log_min_messages=debug2 -autovacuum_naptime=1s shared_buffers=1MB ]); $node_primary->start; @@ -29,11 +28,8 @@ has_streaming => 1); $node_standby->start; -# To avoid hanging while expecting some specific input from a psql -# instance being driven by us, add a timeout high enough that it -# should never trigger even on very slow machines, unless something -# is really wrong. -my $psql_timeout = IPC::Run::timer(300); +# We'll reset this timeout for each individual query we run. +my $psql_timeout = IPC::Run::timer($PostgreSQL::Test::Utils::timeout_default); my %psql_primary = (stdin => '', stdout => '', stderr => ''); $psql_primary{run} = IPC::Run::start( @@ -208,6 +204,12 @@ sub send_query_and_wait my ($psql, $query, $untl) = @_; my $ret; + # For each query we run, we'll restart the timeout. Otherwise the timeout + # would apply to the whole test script, and would need to be set very high + # to survive when running under Valgrind. + $psql_timeout->reset(); + $psql_timeout->start(); + # send query $$psql{stdin} .= $query; $$psql{stdin} .= "\n"; From dce7072e5106456a1f1f003c2fcc2d7901ab89d8 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Sat, 14 May 2022 09:03:16 +0200 Subject: [PATCH 674/772] Add link to initdb in pg_hba.conf docs Suggested by David G. Johnston Discussion: https://postgr.es/m/CAKFQuwYK4OqwoHscZi3yws-urv3NvVfoKHessyso5D=5qqChYQ@mail.gmail.com --- doc/src/sgml/client-auth.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/client-auth.sgml b/doc/src/sgml/client-auth.sgml index 28c51d7261..b2a459fb0d 100644 --- a/doc/src/sgml/client-auth.sgml +++ b/doc/src/sgml/client-auth.sgml @@ -68,7 +68,7 @@ cluster's data directory. (HBA stands for host-based authentication.) A default pg_hba.conf file is installed when the data - directory is initialized by initdb. It is + directory is initialized by . It is possible to place the authentication configuration file elsewhere, however; see the configuration parameter. From 5bcc4d09332844ae369bcf99f18ace1c982b7301 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Sat, 14 May 2022 09:57:03 +0200 Subject: [PATCH 675/772] Add link to HBA docs in initdb --auth documentation Reaction to a suggestion from jhebert@micron.com, though this doesn't directly address the complaint. Discussion: https://postgr.es/m/165117307860.683.10308862820133754390@wrigleys.postgresql.org --- doc/src/sgml/ref/initdb.sgml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/initdb.sgml b/doc/src/sgml/ref/initdb.sgml index c9ffaaecfb..f01df2dde9 100644 --- a/doc/src/sgml/ref/initdb.sgml +++ b/doc/src/sgml/ref/initdb.sgml @@ -146,7 +146,12 @@ PostgreSQL documentation This option specifies the default authentication method for local users used in pg_hba.conf (host - and local lines). initdb will + and local lines). See + for an overview of valid values. + + + + initdb will prepopulate pg_hba.conf entries using the specified authentication method for non-replication as well as replication connections. @@ -575,6 +580,7 @@ PostgreSQL documentation + From 1e731ed12aac3f2ed99cf13244f5a1571a6eb6e6 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Mon, 16 May 2022 16:07:56 +1200 Subject: [PATCH 676/772] Fix incorrect row estimates used for Memoize costing In order to estimate the cache hit ratio of a Memoize node, one of the inputs we require is the estimated number of times the Memoize node will be rescanned. The higher this number, the large the cache hit ratio is likely to become. Unfortunately, the value being passed as the number of "calls" to the Memoize was incorrectly using the Nested Loop's outer_path->parent->rows instead of outer_path->rows. This failed to account for the fact that the outer_path might be parameterized by some upper-level Nested Loop. This problem could lead to Memoize plans appearing more favorable than they might actually be. It could also lead to extended executor startup times when work_mem values were large due to the planner setting overly large MemoizePath->est_entries resulting in the Memoize hash table being initially made much larger than might be required. Fix this simply by passing outer_path->rows rather than outer_path->parent->rows. Also, adjust the expected regression test output for a plan change. Reported-by: Pavel Stehule Author: David Rowley Discussion: https://postgr.es/m/CAFj8pRAMp%3DQsMi6sPQJ4W3hczoFJRvyXHJV3AZAZaMyTVM312Q%40mail.gmail.com Backpatch-through: 14, where Memoize was introduced --- src/backend/optimizer/path/joinpath.c | 2 +- src/test/regress/expected/join.out | 26 ++++++++++---------------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c index 55206ec54d..2a3f0ab7bf 100644 --- a/src/backend/optimizer/path/joinpath.c +++ b/src/backend/optimizer/path/joinpath.c @@ -610,7 +610,7 @@ get_memoize_path(PlannerInfo *root, RelOptInfo *innerrel, hash_operators, extra->inner_unique, binary_mode, - outer_path->parent->rows); + outer_path->rows); } return NULL; diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out index bf1a2db2cf..bd3375f2ba 100644 --- a/src/test/regress/expected/join.out +++ b/src/test/regress/expected/join.out @@ -3673,8 +3673,8 @@ select * from tenk1 t1 left join (tenk1 t2 join tenk1 t3 on t2.thousand = t3.unique2) on t1.hundred = t2.hundred and t1.ten = t3.ten where t1.unique1 = 1; - QUERY PLAN --------------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------- Nested Loop Left Join -> Index Scan using tenk1_unique1 on tenk1 t1 Index Cond: (unique1 = 1) @@ -3684,20 +3684,17 @@ where t1.unique1 = 1; Recheck Cond: (t1.hundred = hundred) -> Bitmap Index Scan on tenk1_hundred Index Cond: (hundred = t1.hundred) - -> Memoize - Cache Key: t2.thousand - Cache Mode: logical - -> Index Scan using tenk1_unique2 on tenk1 t3 - Index Cond: (unique2 = t2.thousand) -(14 rows) + -> Index Scan using tenk1_unique2 on tenk1 t3 + Index Cond: (unique2 = t2.thousand) +(11 rows) explain (costs off) select * from tenk1 t1 left join (tenk1 t2 join tenk1 t3 on t2.thousand = t3.unique2) on t1.hundred = t2.hundred and t1.ten + t2.ten = t3.ten where t1.unique1 = 1; - QUERY PLAN --------------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------- Nested Loop Left Join -> Index Scan using tenk1_unique1 on tenk1 t1 Index Cond: (unique1 = 1) @@ -3707,12 +3704,9 @@ where t1.unique1 = 1; Recheck Cond: (t1.hundred = hundred) -> Bitmap Index Scan on tenk1_hundred Index Cond: (hundred = t1.hundred) - -> Memoize - Cache Key: t2.thousand - Cache Mode: logical - -> Index Scan using tenk1_unique2 on tenk1 t3 - Index Cond: (unique2 = t2.thousand) -(14 rows) + -> Index Scan using tenk1_unique2 on tenk1 t3 + Index Cond: (unique2 = t2.thousand) +(11 rows) explain (costs off) select count(*) from From cd46d42a515918e88ae8ccb5990d59b3ad451455 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 16 May 2022 08:55:01 +0200 Subject: [PATCH 677/772] pg_upgrade: Add missing gettext triggers prep_status_progress() is new. --- src/bin/pg_upgrade/nls.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bin/pg_upgrade/nls.mk b/src/bin/pg_upgrade/nls.mk index 06308bdf78..01aaa6873b 100644 --- a/src/bin/pg_upgrade/nls.mk +++ b/src/bin/pg_upgrade/nls.mk @@ -9,4 +9,5 @@ GETTEXT_FLAGS = \ pg_fatal:1:c-format \ pg_log:2:c-format \ prep_status:1:c-format \ + prep_status_progress:1:c-format \ report_status:2:c-format From cd690e07fd47f245df02ab461754755956bf3e00 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 16 May 2022 09:41:02 +0200 Subject: [PATCH 678/772] pg_upgrade: Add missing gettext triggers Forgot to add it in one place in the previous commit. --- src/bin/pg_upgrade/nls.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/pg_upgrade/nls.mk b/src/bin/pg_upgrade/nls.mk index 01aaa6873b..bfaacfbb7c 100644 --- a/src/bin/pg_upgrade/nls.mk +++ b/src/bin/pg_upgrade/nls.mk @@ -4,7 +4,7 @@ AVAIL_LANGUAGES = cs de es fr ja ko ru sv tr uk zh_CN GETTEXT_FILES = check.c controldata.c dump.c exec.c file.c function.c \ info.c option.c parallel.c pg_upgrade.c relfilenode.c \ server.c tablespace.c util.c version.c -GETTEXT_TRIGGERS = pg_fatal pg_log:2 prep_status report_status:2 +GETTEXT_TRIGGERS = pg_fatal pg_log:2 prep_status prep_status_progress report_status:2 GETTEXT_FLAGS = \ pg_fatal:1:c-format \ pg_log:2:c-format \ From 6a8a7b1ccbc0e92ce2b301e9aad26a4caedfd9b5 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 16 May 2022 11:12:42 +0200 Subject: [PATCH 679/772] Translation updates Source-Git-URL: https://git.postgresql.org/git/pgtranslation/messages.git Source-Git-Hash: dde45df385dab9032155c1f867b677d55695310c --- src/backend/po/de.po | 15821 ++++++++++--------- src/backend/po/es.po | 8817 +++++------ src/backend/po/fr.po | 10383 ++++++------- src/backend/po/ja.po | 15946 ++++++++++--------- src/backend/po/ru.po | 14433 ++++++++++-------- src/backend/po/sv.po | 17777 ++++++++++++---------- src/backend/po/uk.po | 13491 ++++++++-------- src/bin/initdb/po/de.po | 531 +- src/bin/initdb/po/el.po | 517 +- src/bin/initdb/po/es.po | 284 +- src/bin/initdb/po/fr.po | 901 +- src/bin/initdb/po/ja.po | 595 +- src/bin/initdb/po/ru.po | 335 +- src/bin/initdb/po/sv.po | 595 +- src/bin/initdb/po/uk.po | 339 +- src/bin/initdb/po/zh_CN.po | 416 +- src/bin/pg_amcheck/nls.mk | 2 +- src/bin/pg_amcheck/po/de.po | 330 +- src/bin/pg_amcheck/po/el.po | 345 +- src/bin/pg_amcheck/po/es.po | 249 +- src/bin/pg_amcheck/po/fr.po | 426 +- src/bin/pg_amcheck/po/ja.po | 545 + src/bin/pg_amcheck/po/ru.po | 581 + src/bin/pg_amcheck/po/sv.po | 546 + src/bin/pg_amcheck/po/uk.po | 501 + src/bin/pg_amcheck/po/zh_CN.po | 192 +- src/bin/pg_archivecleanup/po/de.po | 79 +- src/bin/pg_archivecleanup/po/el.po | 28 +- src/bin/pg_archivecleanup/po/es.po | 4 +- src/bin/pg_archivecleanup/po/fr.po | 127 +- src/bin/pg_archivecleanup/po/ja.po | 93 +- src/bin/pg_archivecleanup/po/ru.po | 8 +- src/bin/pg_archivecleanup/po/sv.po | 77 +- src/bin/pg_archivecleanup/po/tr.po | 4 +- src/bin/pg_archivecleanup/po/uk.po | 27 +- src/bin/pg_archivecleanup/po/zh_CN.po | 67 +- src/bin/pg_basebackup/po/de.po | 1117 +- src/bin/pg_basebackup/po/fr.po | 1610 +- src/bin/pg_basebackup/po/ja.po | 1184 +- src/bin/pg_basebackup/po/sv.po | 1130 +- src/bin/pg_checksums/po/de.po | 180 +- src/bin/pg_checksums/po/fr.po | 245 +- src/bin/pg_checksums/po/ja.po | 192 +- src/bin/pg_checksums/po/sv.po | 176 +- src/bin/pg_config/po/el.po | 73 +- src/bin/pg_config/po/es.po | 4 +- src/bin/pg_config/po/fr.po | 30 +- src/bin/pg_config/po/ja.po | 31 +- src/bin/pg_config/po/ru.po | 26 +- src/bin/pg_config/po/sv.po | 28 +- src/bin/pg_config/po/tr.po | 6 +- src/bin/pg_config/po/uk.po | 37 +- src/bin/pg_config/po/zh_CN.po | 59 +- src/bin/pg_controldata/po/de.po | 134 +- src/bin/pg_controldata/po/el.po | 143 +- src/bin/pg_controldata/po/es.po | 4 +- src/bin/pg_controldata/po/fr.po | 210 +- src/bin/pg_controldata/po/ja.po | 166 +- src/bin/pg_controldata/po/ru.po | 116 +- src/bin/pg_controldata/po/sv.po | 134 +- src/bin/pg_controldata/po/uk.po | 116 +- src/bin/pg_controldata/po/zh_CN.po | 182 +- src/bin/pg_ctl/po/cs.po | 6 +- src/bin/pg_ctl/po/de.po | 340 +- src/bin/pg_ctl/po/el.po | 106 +- src/bin/pg_ctl/po/es.po | 4 +- src/bin/pg_ctl/po/fr.po | 511 +- src/bin/pg_ctl/po/ja.po | 384 +- src/bin/pg_ctl/po/ru.po | 282 +- src/bin/pg_ctl/po/sv.po | 344 +- src/bin/pg_ctl/po/uk.po | 291 +- src/bin/pg_ctl/po/zh_CN.po | 355 +- src/bin/pg_dump/po/cs.po | 22 +- src/bin/pg_dump/po/de.po | 1274 +- src/bin/pg_dump/po/el.po | 1142 +- src/bin/pg_dump/po/es.po | 725 +- src/bin/pg_dump/po/fr.po | 2267 +-- src/bin/pg_dump/po/ja.po | 1523 +- src/bin/pg_dump/po/ru.po | 951 +- src/bin/pg_dump/po/sv.po | 1392 +- src/bin/pg_dump/po/uk.po | 1178 +- src/bin/pg_dump/po/zh_CN.po | 1268 +- src/bin/pg_resetwal/nls.mk | 2 +- src/bin/pg_resetwal/po/de.po | 320 +- src/bin/pg_resetwal/po/el.po | 671 + src/bin/pg_resetwal/po/es.po | 286 +- src/bin/pg_resetwal/po/fr.po | 520 +- src/bin/pg_resetwal/po/ja.po | 343 +- src/bin/pg_resetwal/po/ru.po | 319 +- src/bin/pg_resetwal/po/sv.po | 325 +- src/bin/pg_resetwal/po/uk.po | 303 +- src/bin/pg_resetwal/po/zh_CN.po | 361 +- src/bin/pg_rewind/nls.mk | 2 +- src/bin/pg_rewind/po/de.po | 406 +- src/bin/pg_rewind/po/el.po | 959 ++ src/bin/pg_rewind/po/es.po | 4 +- src/bin/pg_rewind/po/fr.po | 790 +- src/bin/pg_rewind/po/ja.po | 682 +- src/bin/pg_rewind/po/ru.po | 537 +- src/bin/pg_rewind/po/sv.po | 666 +- src/bin/pg_rewind/po/uk.po | 546 +- src/bin/pg_rewind/po/zh_CN.po | 48 +- src/bin/pg_test_fsync/po/de.po | 124 +- src/bin/pg_test_fsync/po/fr.po | 148 +- src/bin/pg_test_fsync/po/ja.po | 162 +- src/bin/pg_test_fsync/po/sv.po | 143 +- src/bin/pg_test_timing/po/el.po | 18 +- src/bin/pg_test_timing/po/fr.po | 23 +- src/bin/pg_test_timing/po/ja.po | 62 +- src/bin/pg_test_timing/po/ru.po | 58 +- src/bin/pg_test_timing/po/sv.po | 53 +- src/bin/pg_test_timing/po/uk.po | 62 +- src/bin/pg_test_timing/po/zh_CN.po | 7 +- src/bin/pg_upgrade/po/cs.po | 4 +- src/bin/pg_upgrade/po/de.po | 781 +- src/bin/pg_upgrade/po/es.po | 286 +- src/bin/pg_upgrade/po/fr.po | 1079 +- src/bin/pg_upgrade/po/ja.po | 1122 +- src/bin/pg_upgrade/po/ru.po | 593 +- src/bin/pg_upgrade/po/sv.po | 965 +- src/bin/pg_upgrade/po/uk.po | 578 +- src/bin/pg_upgrade/po/zh_CN.po | 851 +- src/bin/pg_verifybackup/po/de.po | 167 +- src/bin/pg_verifybackup/po/el.po | 104 +- src/bin/pg_verifybackup/po/es.po | 4 +- src/bin/pg_verifybackup/po/fr.po | 195 +- src/bin/pg_verifybackup/po/ja.po | 254 +- src/bin/pg_verifybackup/po/ru.po | 159 +- src/bin/pg_verifybackup/po/sv.po | 246 +- src/bin/pg_verifybackup/po/uk.po | 161 +- src/bin/pg_verifybackup/po/zh_CN.po | 183 +- src/bin/pg_waldump/po/de.po | 200 +- src/bin/pg_waldump/po/fr.po | 327 +- src/bin/pg_waldump/po/ja.po | 223 +- src/bin/pg_waldump/po/sv.po | 196 +- src/bin/psql/po/de.po | 3692 ++--- src/bin/psql/po/el.po | 1842 ++- src/bin/psql/po/es.po | 1797 +-- src/bin/psql/po/fr.po | 4255 +++--- src/bin/psql/po/ja.po | 4151 ++--- src/bin/psql/po/ru.po | 3076 ++-- src/bin/psql/po/sv.po | 3701 ++--- src/bin/psql/po/uk.po | 3032 ++-- src/bin/psql/po/zh_CN.po | 3540 +++-- src/bin/scripts/nls.mk | 2 +- src/bin/scripts/po/cs.po | 12 +- src/bin/scripts/po/de.po | 516 +- src/bin/scripts/po/el.po | 1173 ++ src/bin/scripts/po/es.po | 143 +- src/bin/scripts/po/fr.po | 980 +- src/bin/scripts/po/ja.po | 699 +- src/bin/scripts/po/ru.po | 617 +- src/bin/scripts/po/sv.po | 643 +- src/bin/scripts/po/tr.po | 19 +- src/bin/scripts/po/uk.po | 574 +- src/bin/scripts/po/zh_CN.po | 631 +- src/interfaces/ecpg/ecpglib/nls.mk | 2 +- src/interfaces/ecpg/ecpglib/po/el.po | 200 + src/interfaces/ecpg/ecpglib/po/es.po | 4 +- src/interfaces/ecpg/ecpglib/po/fr.po | 19 +- src/interfaces/ecpg/ecpglib/po/ja.po | 29 +- src/interfaces/ecpg/ecpglib/po/ru.po | 6 +- src/interfaces/ecpg/ecpglib/po/sv.po | 6 +- src/interfaces/ecpg/ecpglib/po/uk.po | 16 +- src/interfaces/ecpg/ecpglib/po/zh_CN.po | 29 +- src/interfaces/ecpg/preproc/nls.mk | 2 +- src/interfaces/ecpg/preproc/po/cs.po | 8 +- src/interfaces/ecpg/preproc/po/de.po | 175 +- src/interfaces/ecpg/preproc/po/el.po | 700 + src/interfaces/ecpg/preproc/po/es.po | 126 +- src/interfaces/ecpg/preproc/po/fr.po | 232 +- src/interfaces/ecpg/preproc/po/ja.po | 322 +- src/interfaces/ecpg/preproc/po/ru.po | 231 +- src/interfaces/ecpg/preproc/po/sv.po | 262 +- src/interfaces/ecpg/preproc/po/tr.po | 8 +- src/interfaces/ecpg/preproc/po/uk.po | 234 +- src/interfaces/ecpg/preproc/po/zh_CN.po | 249 +- src/interfaces/libpq/po/de.po | 654 +- src/interfaces/libpq/po/el.po | 675 +- src/interfaces/libpq/po/es.po | 476 +- src/interfaces/libpq/po/fr.po | 853 +- src/interfaces/libpq/po/ja.po | 966 +- src/interfaces/libpq/po/ru.po | 872 +- src/interfaces/libpq/po/sv.po | 882 +- src/interfaces/libpq/po/uk.po | 746 +- src/interfaces/libpq/po/zh_CN.po | 761 +- src/pl/plperl/po/de.po | 101 +- src/pl/plperl/po/el.po | 24 +- src/pl/plperl/po/es.po | 4 +- src/pl/plperl/po/fr.po | 173 +- src/pl/plperl/po/ja.po | 144 +- src/pl/plperl/po/ru.po | 88 +- src/pl/plperl/po/sv.po | 73 +- src/pl/plperl/po/uk.po | 86 +- src/pl/plperl/po/zh_CN.po | 102 +- src/pl/plpgsql/src/nls.mk | 2 +- src/pl/plpgsql/src/po/de.po | 356 +- src/pl/plpgsql/src/po/el.po | 850 ++ src/pl/plpgsql/src/po/es.po | 362 +- src/pl/plpgsql/src/po/fr.po | 557 +- src/pl/plpgsql/src/po/ja.po | 524 +- src/pl/plpgsql/src/po/ru.po | 385 +- src/pl/plpgsql/src/po/sv.po | 362 +- src/pl/plpgsql/src/po/uk.po | 350 +- src/pl/plpgsql/src/po/zh_CN.po | 400 +- src/pl/plpython/po/el.po | 44 +- src/pl/plpython/po/es.po | 4 +- src/pl/plpython/po/fr.po | 18 +- src/pl/plpython/po/ja.po | 117 +- src/pl/plpython/po/ru.po | 54 +- src/pl/plpython/po/sv.po | 6 +- src/pl/plpython/po/uk.po | 60 +- src/pl/plpython/po/zh_CN.po | 188 +- src/pl/tcl/po/de.po | 49 +- src/pl/tcl/po/el.po | 20 +- src/pl/tcl/po/es.po | 4 +- src/pl/tcl/po/fr.po | 91 +- src/pl/tcl/po/ja.po | 55 +- src/pl/tcl/po/ru.po | 38 +- src/pl/tcl/po/sv.po | 49 +- src/pl/tcl/po/uk.po | 44 +- src/pl/tcl/po/zh_CN.po | 48 +- 222 files changed, 107848 insertions(+), 87562 deletions(-) create mode 100644 src/bin/pg_amcheck/po/ja.po create mode 100644 src/bin/pg_amcheck/po/ru.po create mode 100644 src/bin/pg_amcheck/po/sv.po create mode 100644 src/bin/pg_amcheck/po/uk.po create mode 100644 src/bin/pg_resetwal/po/el.po create mode 100644 src/bin/pg_rewind/po/el.po create mode 100644 src/bin/scripts/po/el.po create mode 100644 src/interfaces/ecpg/ecpglib/po/el.po create mode 100644 src/interfaces/ecpg/preproc/po/el.po create mode 100644 src/pl/plpgsql/src/po/el.po diff --git a/src/backend/po/de.po b/src/backend/po/de.po index 6b136250cf..47d316ac83 100644 --- a/src/backend/po/de.po +++ b/src/backend/po/de.po @@ -1,14 +1,14 @@ # German message translation file for PostgreSQL server -# Peter Eisentraut , 2001 - 2021. +# Peter Eisentraut , 2001 - 2022. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-06-05 07:40+0000\n" -"PO-Revision-Date: 2021-06-05 22:31+0200\n" +"POT-Creation-Date: 2022-05-14 15:40+0000\n" +"PO-Revision-Date: 2022-05-15 17:48+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -17,6 +17,45 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ../common/compression.c:157 +msgid "found empty string where a compression option was expected" +msgstr "" + +#: ../common/compression.c:187 +#, fuzzy, c-format +#| msgid "invalid compression method \"%s\"" +msgid "unknown compression option \"%s\"" +msgstr "ungültige Komprimierungsmethode »%s«" + +#: ../common/compression.c:226 +#, fuzzy, c-format +#| msgid "-c %s requires a value" +msgid "compression option \"%s\" requires a value" +msgstr "-c %s benötigt einen Wert" + +#: ../common/compression.c:235 +#, fuzzy, c-format +#| msgid "btree comparison functions must return integer" +msgid "value for compression option \"%s\" must be an integer" +msgstr "btree-Vergleichsfunktionen müssen Typ integer zurückgeben" + +#: ../common/compression.c:273 +#, fuzzy, c-format +#| msgid "relation \"%s\" does not have a composite type" +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "Relation »%s« hat keinen zusammengesetzten Typ" + +#: ../common/compression.c:277 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d" +msgstr "" + +#: ../common/compression.c:289 +#, fuzzy, c-format +#| msgid "operator class \"%s\" does not accept data type %s" +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "Operatorklasse »%s« akzeptiert Datentyp %s nicht" + #: ../common/config_info.c:134 ../common/config_info.c:142 #: ../common/config_info.c:150 ../common/config_info.c:158 #: ../common/config_info.c:166 ../common/config_info.c:174 @@ -24,68 +63,66 @@ msgstr "" msgid "not recorded" msgstr "nicht aufgezeichnet" -#: ../common/controldata_utils.c:68 ../common/controldata_utils.c:73 -#: commands/copyfrom.c:1516 commands/extension.c:3455 utils/adt/genfile.c:128 +#: ../common/controldata_utils.c:69 ../common/controldata_utils.c:73 +#: commands/copyfrom.c:1515 commands/extension.c:3379 utils/adt/genfile.c:123 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" -#: ../common/controldata_utils.c:86 ../common/controldata_utils.c:89 +#: ../common/controldata_utils.c:84 ../common/controldata_utils.c:86 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1271 access/transam/xlog.c:3547 -#: access/transam/xlog.c:4772 access/transam/xlog.c:11338 -#: access/transam/xlog.c:11351 access/transam/xlog.c:11804 -#: access/transam/xlog.c:11884 access/transam/xlog.c:11921 -#: access/transam/xlog.c:11981 access/transam/xlogfuncs.c:703 -#: access/transam/xlogfuncs.c:722 commands/extension.c:3465 libpq/hba.c:534 -#: replication/basebackup.c:2020 replication/logical/origin.c:729 -#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4880 -#: replication/logical/snapbuild.c:1733 replication/logical/snapbuild.c:1775 -#: replication/logical/snapbuild.c:1802 replication/slot.c:1658 -#: replication/slot.c:1699 replication/walsender.c:544 -#: storage/file/buffile.c:445 storage/file/copydir.c:195 -#: utils/adt/genfile.c:202 utils/adt/misc.c:859 utils/cache/relmapper.c:741 +#: access/transam/twophase.c:1348 access/transam/xlog.c:3207 +#: access/transam/xlog.c:4022 access/transam/xlogrecovery.c:1177 +#: access/transam/xlogrecovery.c:1269 access/transam/xlogrecovery.c:1306 +#: access/transam/xlogrecovery.c:1366 commands/extension.c:3389 libpq/hba.c:505 +#: replication/basebackup.c:1836 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4924 +#: replication/logical/snapbuild.c:1756 replication/logical/snapbuild.c:1798 +#: replication/logical/snapbuild.c:1825 replication/slot.c:1815 +#: replication/slot.c:1856 replication/walsender.c:659 +#: storage/file/buffile.c:463 storage/file/copydir.c:195 +#: utils/adt/genfile.c:197 utils/adt/misc.c:863 utils/cache/relmapper.c:813 #, c-format msgid "could not read file \"%s\": %m" msgstr "konnte Datei »%s« nicht lesen: %m" -#: ../common/controldata_utils.c:97 ../common/controldata_utils.c:101 -#: access/transam/xlog.c:3552 access/transam/xlog.c:4777 -#: replication/basebackup.c:2024 replication/logical/origin.c:734 -#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1738 -#: replication/logical/snapbuild.c:1780 replication/logical/snapbuild.c:1807 -#: replication/slot.c:1662 replication/slot.c:1703 replication/walsender.c:549 -#: utils/cache/relmapper.c:745 +#: ../common/controldata_utils.c:92 ../common/controldata_utils.c:95 +#: access/transam/xlog.c:3212 access/transam/xlog.c:4027 +#: replication/basebackup.c:1840 replication/logical/origin.c:734 +#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1761 +#: replication/logical/snapbuild.c:1803 replication/logical/snapbuild.c:1830 +#: replication/slot.c:1819 replication/slot.c:1860 replication/walsender.c:664 +#: utils/cache/relmapper.c:817 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" -#: ../common/controldata_utils.c:112 ../common/controldata_utils.c:117 -#: ../common/controldata_utils.c:256 ../common/controldata_utils.c:259 -#: access/heap/rewriteheap.c:1185 access/heap/rewriteheap.c:1288 +#: ../common/controldata_utils.c:104 ../common/controldata_utils.c:108 +#: ../common/controldata_utils.c:241 ../common/controldata_utils.c:244 +#: access/heap/rewriteheap.c:1178 access/heap/rewriteheap.c:1281 #: access/transam/timeline.c:392 access/transam/timeline.c:438 -#: access/transam/timeline.c:516 access/transam/twophase.c:1283 -#: access/transam/twophase.c:1680 access/transam/xlog.c:3419 -#: access/transam/xlog.c:3587 access/transam/xlog.c:3592 -#: access/transam/xlog.c:3920 access/transam/xlog.c:4742 -#: access/transam/xlog.c:5667 access/transam/xlogfuncs.c:728 -#: commands/copyfrom.c:1576 commands/copyto.c:328 libpq/be-fsstubs.c:462 -#: libpq/be-fsstubs.c:533 replication/logical/origin.c:667 -#: replication/logical/origin.c:806 replication/logical/reorderbuffer.c:4938 -#: replication/logical/snapbuild.c:1642 replication/logical/snapbuild.c:1815 -#: replication/slot.c:1549 replication/slot.c:1710 replication/walsender.c:559 -#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:738 -#: storage/file/fd.c:3534 storage/file/fd.c:3637 utils/cache/relmapper.c:753 -#: utils/cache/relmapper.c:892 +#: access/transam/timeline.c:516 access/transam/twophase.c:1360 +#: access/transam/twophase.c:1772 access/transam/xlog.c:3054 +#: access/transam/xlog.c:3247 access/transam/xlog.c:3252 +#: access/transam/xlog.c:3390 access/transam/xlog.c:3992 +#: access/transam/xlog.c:4729 commands/copyfrom.c:1575 commands/copyto.c:327 +#: libpq/be-fsstubs.c:455 libpq/be-fsstubs.c:525 +#: replication/logical/origin.c:667 replication/logical/origin.c:806 +#: replication/logical/reorderbuffer.c:4982 +#: replication/logical/snapbuild.c:1665 replication/logical/snapbuild.c:1838 +#: replication/slot.c:1706 replication/slot.c:1867 replication/walsender.c:674 +#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:745 +#: storage/file/fd.c:3643 storage/file/fd.c:3749 utils/cache/relmapper.c:828 +#: utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" msgstr "konnte Datei »%s« nicht schließen: %m" -#: ../common/controldata_utils.c:135 +#: ../common/controldata_utils.c:124 msgid "byte ordering mismatch" msgstr "falsche Byte-Reihenfolge" -#: ../common/controldata_utils.c:137 +#: ../common/controldata_utils.c:126 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -99,132 +136,155 @@ msgstr "" "diesem Fall wären die Ergebnisse unten falsch und die PostgreSQL-Installation\n" "wäre inkompatibel mit diesem Datenverzeichnis." -#: ../common/controldata_utils.c:197 ../common/controldata_utils.c:203 +#: ../common/controldata_utils.c:189 ../common/controldata_utils.c:194 #: ../common/file_utils.c:232 ../common/file_utils.c:291 -#: ../common/file_utils.c:365 access/heap/rewriteheap.c:1271 +#: ../common/file_utils.c:365 access/heap/rewriteheap.c:1264 #: access/transam/timeline.c:111 access/transam/timeline.c:251 -#: access/transam/timeline.c:348 access/transam/twophase.c:1227 -#: access/transam/xlog.c:3305 access/transam/xlog.c:3461 -#: access/transam/xlog.c:3502 access/transam/xlog.c:3700 -#: access/transam/xlog.c:3785 access/transam/xlog.c:3888 -#: access/transam/xlog.c:4762 access/transam/xlogutils.c:803 -#: postmaster/syslogger.c:1488 replication/basebackup.c:616 -#: replication/basebackup.c:1610 replication/logical/origin.c:719 -#: replication/logical/reorderbuffer.c:3548 -#: replication/logical/reorderbuffer.c:4095 -#: replication/logical/reorderbuffer.c:4860 -#: replication/logical/snapbuild.c:1597 replication/logical/snapbuild.c:1704 -#: replication/slot.c:1630 replication/walsender.c:517 -#: replication/walsender.c:2526 storage/file/copydir.c:161 -#: storage/file/fd.c:713 storage/file/fd.c:3521 storage/file/fd.c:3608 -#: storage/smgr/md.c:502 utils/cache/relmapper.c:724 -#: utils/cache/relmapper.c:836 utils/error/elog.c:1938 -#: utils/init/miscinit.c:1346 utils/init/miscinit.c:1480 -#: utils/init/miscinit.c:1557 utils/misc/guc.c:8604 utils/misc/guc.c:8636 +#: access/transam/timeline.c:348 access/transam/twophase.c:1304 +#: access/transam/xlog.c:2941 access/transam/xlog.c:3123 +#: access/transam/xlog.c:3162 access/transam/xlog.c:3357 +#: access/transam/xlog.c:4012 access/transam/xlogrecovery.c:4114 +#: access/transam/xlogrecovery.c:4217 access/transam/xlogutils.c:850 +#: postmaster/syslogger.c:1560 replication/basebackup.c:522 +#: replication/basebackup.c:1513 replication/logical/origin.c:719 +#: replication/logical/reorderbuffer.c:3579 +#: replication/logical/reorderbuffer.c:4128 +#: replication/logical/reorderbuffer.c:4904 +#: replication/logical/snapbuild.c:1620 replication/logical/snapbuild.c:1727 +#: replication/slot.c:1787 replication/walsender.c:632 +#: replication/walsender.c:2723 storage/file/copydir.c:161 +#: storage/file/fd.c:720 storage/file/fd.c:3395 storage/file/fd.c:3630 +#: storage/file/fd.c:3720 storage/smgr/md.c:507 utils/cache/relmapper.c:792 +#: utils/cache/relmapper.c:900 utils/error/elog.c:1933 +#: utils/init/miscinit.c:1366 utils/init/miscinit.c:1500 +#: utils/init/miscinit.c:1577 utils/misc/guc.c:8923 utils/misc/guc.c:8972 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" -#: ../common/controldata_utils.c:221 ../common/controldata_utils.c:224 -#: access/transam/twophase.c:1653 access/transam/twophase.c:1662 -#: access/transam/xlog.c:11095 access/transam/xlog.c:11133 -#: access/transam/xlog.c:11546 access/transam/xlogfuncs.c:782 -#: postmaster/postmaster.c:5659 postmaster/syslogger.c:1499 -#: postmaster/syslogger.c:1512 utils/cache/relmapper.c:870 +#: ../common/controldata_utils.c:210 ../common/controldata_utils.c:213 +#: access/transam/twophase.c:1745 access/transam/twophase.c:1754 +#: access/transam/xlog.c:8652 access/transam/xlogfuncs.c:600 +#: postmaster/postmaster.c:5631 postmaster/syslogger.c:1571 +#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 +#: replication/basebackup_server.c:173 replication/basebackup_server.c:266 +#: utils/cache/relmapper.c:934 #, c-format msgid "could not write file \"%s\": %m" msgstr "konnte Datei »%s« nicht schreiben: %m" -#: ../common/controldata_utils.c:239 ../common/controldata_utils.c:245 +#: ../common/controldata_utils.c:227 ../common/controldata_utils.c:232 #: ../common/file_utils.c:303 ../common/file_utils.c:373 -#: access/heap/rewriteheap.c:967 access/heap/rewriteheap.c:1179 -#: access/heap/rewriteheap.c:1282 access/transam/timeline.c:432 -#: access/transam/timeline.c:510 access/transam/twophase.c:1674 -#: access/transam/xlog.c:3412 access/transam/xlog.c:3581 -#: access/transam/xlog.c:4735 access/transam/xlog.c:10586 -#: access/transam/xlog.c:10627 replication/logical/snapbuild.c:1635 -#: replication/slot.c:1535 replication/slot.c:1640 storage/file/fd.c:730 -#: storage/file/fd.c:3629 storage/smgr/md.c:950 storage/smgr/md.c:991 -#: storage/sync/sync.c:417 utils/cache/relmapper.c:885 utils/misc/guc.c:8391 +#: access/heap/rewriteheap.c:960 access/heap/rewriteheap.c:1172 +#: access/heap/rewriteheap.c:1275 access/transam/timeline.c:432 +#: access/transam/timeline.c:510 access/transam/twophase.c:1766 +#: access/transam/xlog.c:3047 access/transam/xlog.c:3241 +#: access/transam/xlog.c:3985 access/transam/xlog.c:7950 +#: access/transam/xlog.c:7993 replication/basebackup_server.c:207 +#: replication/logical/snapbuild.c:1658 replication/slot.c:1692 +#: replication/slot.c:1797 storage/file/fd.c:737 storage/file/fd.c:3741 +#: storage/smgr/md.c:958 storage/smgr/md.c:999 storage/sync/sync.c:453 +#: utils/cache/relmapper.c:949 utils/misc/guc.c:8692 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" -#: ../common/cryptohash_openssl.c:104 ../common/exec.c:522 ../common/exec.c:567 -#: ../common/exec.c:659 ../common/hmac_openssl.c:103 ../common/psprintf.c:143 -#: ../common/stringinfo.c:305 ../port/path.c:630 ../port/path.c:668 -#: ../port/path.c:685 access/transam/twophase.c:1341 access/transam/xlog.c:6633 -#: lib/dshash.c:246 libpq/auth.c:1482 libpq/auth.c:1550 libpq/auth.c:2108 -#: libpq/be-secure-gssapi.c:520 postmaster/bgworker.c:349 -#: postmaster/bgworker.c:948 postmaster/postmaster.c:2516 -#: postmaster/postmaster.c:4175 postmaster/postmaster.c:4845 -#: postmaster/postmaster.c:5584 postmaster/postmaster.c:5948 -#: replication/libpqwalreceiver/libpqwalreceiver.c:282 -#: replication/logical/logical.c:205 replication/walsender.c:591 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:882 storage/file/fd.c:1352 -#: storage/file/fd.c:1513 storage/file/fd.c:2321 storage/ipc/procarray.c:1388 -#: storage/ipc/procarray.c:2182 storage/ipc/procarray.c:2189 -#: storage/ipc/procarray.c:2678 storage/ipc/procarray.c:3302 -#: utils/adt/cryptohashfuncs.c:46 utils/adt/cryptohashfuncs.c:66 -#: utils/adt/formatting.c:1699 utils/adt/formatting.c:1823 -#: utils/adt/formatting.c:1948 utils/adt/pg_locale.c:450 -#: utils/adt/pg_locale.c:614 utils/adt/regexp.c:223 utils/fmgr/dfmgr.c:229 +#: ../common/cryptohash.c:266 ../common/cryptohash_openssl.c:133 +#: ../common/cryptohash_openssl.c:332 ../common/exec.c:560 ../common/exec.c:605 +#: ../common/exec.c:697 ../common/hmac.c:309 ../common/hmac.c:325 +#: ../common/hmac_openssl.c:132 ../common/hmac_openssl.c:327 +#: ../common/md5_common.c:155 ../common/psprintf.c:143 +#: ../common/scram-common.c:247 ../common/stringinfo.c:305 ../port/path.c:751 +#: ../port/path.c:789 ../port/path.c:806 access/transam/twophase.c:1413 +#: access/transam/xlogrecovery.c:567 lib/dshash.c:254 libpq/auth.c:1338 +#: libpq/auth.c:1406 libpq/auth.c:1964 libpq/be-secure-gssapi.c:520 +#: postmaster/bgworker.c:349 postmaster/bgworker.c:931 +#: postmaster/postmaster.c:2584 postmaster/postmaster.c:4170 +#: postmaster/postmaster.c:4842 postmaster/postmaster.c:5556 +#: postmaster/postmaster.c:5919 +#: replication/libpqwalreceiver/libpqwalreceiver.c:296 +#: replication/logical/logical.c:205 replication/walsender.c:702 +#: storage/buffer/localbuf.c:442 storage/file/fd.c:892 storage/file/fd.c:1434 +#: storage/file/fd.c:1595 storage/file/fd.c:2409 storage/ipc/procarray.c:1432 +#: storage/ipc/procarray.c:2264 storage/ipc/procarray.c:2271 +#: storage/ipc/procarray.c:2777 storage/ipc/procarray.c:3408 +#: utils/adt/formatting.c:1727 utils/adt/formatting.c:1849 +#: utils/adt/formatting.c:1972 utils/adt/pg_locale.c:450 +#: utils/adt/pg_locale.c:614 utils/adt/regexp.c:224 utils/fmgr/dfmgr.c:229 #: utils/hash/dynahash.c:513 utils/hash/dynahash.c:613 #: utils/hash/dynahash.c:1116 utils/mb/mbutils.c:401 utils/mb/mbutils.c:429 -#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5035 -#: utils/misc/guc.c:5051 utils/misc/guc.c:5064 utils/misc/guc.c:8369 +#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5201 +#: utils/misc/guc.c:5217 utils/misc/guc.c:5230 utils/misc/guc.c:8670 #: utils/misc/tzparser.c:467 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:701 -#: utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:234 +#: utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:266 #: utils/mmgr/mcxt.c:888 utils/mmgr/mcxt.c:924 utils/mmgr/mcxt.c:962 -#: utils/mmgr/mcxt.c:1000 utils/mmgr/mcxt.c:1082 utils/mmgr/mcxt.c:1113 -#: utils/mmgr/mcxt.c:1149 utils/mmgr/mcxt.c:1201 utils/mmgr/mcxt.c:1236 -#: utils/mmgr/mcxt.c:1271 utils/mmgr/slab.c:236 +#: utils/mmgr/mcxt.c:1000 utils/mmgr/mcxt.c:1088 utils/mmgr/mcxt.c:1119 +#: utils/mmgr/mcxt.c:1155 utils/mmgr/mcxt.c:1207 utils/mmgr/mcxt.c:1242 +#: utils/mmgr/mcxt.c:1277 utils/mmgr/slab.c:236 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" -#: ../common/exec.c:136 ../common/exec.c:253 ../common/exec.c:299 +#: ../common/cryptohash.c:271 ../common/cryptohash.c:277 +#: ../common/cryptohash_openssl.c:344 ../common/cryptohash_openssl.c:352 +#: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:339 +#: ../common/hmac_openssl.c:347 +msgid "success" +msgstr "" + +#: ../common/cryptohash.c:273 ../common/cryptohash_openssl.c:346 +#: ../common/hmac_openssl.c:341 +#, fuzzy +#| msgid "backup label buffer too small" +msgid "destination buffer too small" +msgstr "Puffer für Backup-Label ist zu klein" + +#: ../common/cryptohash_openssl.c:348 ../common/hmac_openssl.c:343 +msgid "OpenSSL failure" +msgstr "" + +#: ../common/exec.c:149 ../common/exec.c:266 ../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "konnte aktuelles Verzeichnis nicht ermitteln: %m" -#: ../common/exec.c:155 +#: ../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "ungültige Programmdatei »%s«" -#: ../common/exec.c:205 +#: ../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "konnte Programmdatei »%s« nicht lesen" -#: ../common/exec.c:213 +#: ../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "konnte kein »%s« zum Ausführen finden" -#: ../common/exec.c:269 ../common/exec.c:308 utils/init/miscinit.c:425 +#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:439 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m" -#: ../common/exec.c:286 access/transam/xlog.c:10969 -#: replication/basebackup.c:1428 utils/adt/misc.c:340 +#: ../common/exec.c:299 access/transam/xlog.c:8301 +#: replication/basebackup.c:1333 utils/adt/misc.c:342 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m" -#: ../common/exec.c:409 libpq/pqcomm.c:746 storage/ipc/latch.c:1064 -#: storage/ipc/latch.c:1233 storage/ipc/latch.c:1462 storage/ipc/latch.c:1614 -#: storage/ipc/latch.c:1730 +#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1067 +#: storage/ipc/latch.c:1247 storage/ipc/latch.c:1476 storage/ipc/latch.c:1637 +#: storage/ipc/latch.c:1763 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" #: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 #: ../common/fe_memutils.c:98 ../common/fe_memutils.c:162 -#: ../common/psprintf.c:145 ../port/path.c:632 ../port/path.c:670 -#: ../port/path.c:687 utils/misc/ps_status.c:181 utils/misc/ps_status.c:189 +#: ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:791 +#: ../port/path.c:808 utils/misc/ps_status.c:181 utils/misc/ps_status.c:189 #: utils/misc/ps_status.c:219 utils/misc/ps_status.c:227 #, c-format msgid "out of memory\n" @@ -236,166 +296,151 @@ msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" #: ../common/file_utils.c:87 ../common/file_utils.c:451 -#: ../common/file_utils.c:455 access/transam/twophase.c:1239 -#: access/transam/xlog.c:11071 access/transam/xlog.c:11109 -#: access/transam/xlog.c:11326 access/transam/xlogarchive.c:110 -#: access/transam/xlogarchive.c:227 commands/copyfrom.c:1526 -#: commands/copyto.c:734 commands/extension.c:3444 commands/tablespace.c:807 -#: commands/tablespace.c:898 guc-file.l:1060 replication/basebackup.c:439 -#: replication/basebackup.c:622 replication/basebackup.c:698 -#: replication/logical/snapbuild.c:1514 storage/file/copydir.c:68 -#: storage/file/copydir.c:107 storage/file/fd.c:1863 storage/file/fd.c:1949 -#: storage/file/fd.c:3149 storage/file/fd.c:3353 utils/adt/dbsize.c:70 -#: utils/adt/dbsize.c:222 utils/adt/dbsize.c:302 utils/adt/genfile.c:418 -#: utils/adt/genfile.c:644 +#: ../common/file_utils.c:455 access/transam/twophase.c:1316 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:230 +#: commands/copyfrom.c:1525 commands/copyto.c:725 commands/extension.c:3368 +#: commands/tablespace.c:848 commands/tablespace.c:939 guc-file.l:1062 +#: postmaster/pgarch.c:603 replication/basebackup.c:338 +#: replication/basebackup.c:528 replication/basebackup.c:599 +#: replication/logical/snapbuild.c:1537 storage/file/copydir.c:68 +#: storage/file/copydir.c:107 storage/file/fd.c:1951 storage/file/fd.c:2037 +#: storage/file/fd.c:3243 storage/file/fd.c:3450 utils/adt/dbsize.c:92 +#: utils/adt/dbsize.c:244 utils/adt/dbsize.c:324 utils/adt/genfile.c:413 +#: utils/adt/genfile.c:588 utils/adt/misc.c:327 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" -#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:730 -#: commands/tablespace.c:740 postmaster/postmaster.c:1515 -#: storage/file/fd.c:2724 storage/file/reinit.c:122 utils/adt/misc.c:262 +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:771 +#: commands/tablespace.c:781 postmaster/postmaster.c:1576 +#: storage/file/fd.c:2812 storage/file/reinit.c:126 utils/adt/misc.c:235 #: utils/misc/tzparser.c:338 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2736 +#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2824 #, c-format msgid "could not read directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht lesen: %m" -#: ../common/file_utils.c:383 access/transam/xlogarchive.c:412 -#: postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1654 -#: replication/slot.c:668 replication/slot.c:1421 replication/slot.c:1563 -#: storage/file/fd.c:748 storage/file/fd.c:846 utils/time/snapmgr.c:1265 +#: ../common/file_utils.c:383 access/transam/xlogarchive.c:419 +#: postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1677 +#: replication/slot.c:709 replication/slot.c:1578 replication/slot.c:1720 +#: storage/file/fd.c:755 storage/file/fd.c:853 utils/time/snapmgr.c:1282 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" -#: ../common/hex.c:54 -#, c-format -msgid "invalid hexadecimal digit" -msgstr "ungültige hexadezimale Ziffer" - -#: ../common/hex.c:59 -#, c-format -msgid "invalid hexadecimal digit: \"%.*s\"" -msgstr "ungültige hexadezimale Ziffer: »%.*s«" - -#: ../common/hex.c:90 -#, c-format -msgid "overflow of destination buffer in hex encoding" -msgstr "Zielpufferüberlauf bei Hex-Kodierung" - -#: ../common/hex.c:136 ../common/hex.c:141 -#, c-format -msgid "invalid hexadecimal data: odd number of digits" -msgstr "ungültige hexadezimale Daten: ungerade Anzahl Ziffern" - -#: ../common/hex.c:152 -#, c-format -msgid "overflow of destination buffer in hex decoding" -msgstr "Zielpufferüberlauf bei Hex-Dekodierung" +#: ../common/hmac.c:323 +#, fuzzy +#| msgid "syntax error" +msgid "internal error" +msgstr "Syntaxfehler" -#: ../common/jsonapi.c:1066 +#: ../common/jsonapi.c:1075 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Escape-Sequenz »\\%s« ist nicht gültig." -#: ../common/jsonapi.c:1069 +#: ../common/jsonapi.c:1078 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Zeichen mit Wert 0x%02x muss escapt werden." -#: ../common/jsonapi.c:1072 +#: ../common/jsonapi.c:1081 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Ende der Eingabe erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1075 +#: ../common/jsonapi.c:1084 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Array-Element oder »]« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1078 +#: ../common/jsonapi.c:1087 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "»,« oder »]« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1081 +#: ../common/jsonapi.c:1090 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "»:« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1084 +#: ../common/jsonapi.c:1093 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "JSON-Wert erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1087 +#: ../common/jsonapi.c:1096 msgid "The input string ended unexpectedly." msgstr "Die Eingabezeichenkette endete unerwartet." -#: ../common/jsonapi.c:1089 +#: ../common/jsonapi.c:1098 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Zeichenkette oder »}« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1092 +#: ../common/jsonapi.c:1101 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "»,« oder »}« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1095 +#: ../common/jsonapi.c:1104 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Zeichenkette erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1098 +#: ../common/jsonapi.c:1107 #, c-format msgid "Token \"%s\" is invalid." msgstr "Token »%s« ist ungültig." -#: ../common/jsonapi.c:1101 jsonpath_scan.l:499 +#: ../common/jsonapi.c:1110 jsonpath_scan.l:495 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kann nicht in »text« umgewandelt werden." -#: ../common/jsonapi.c:1103 +#: ../common/jsonapi.c:1112 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "Nach »\\u« müssen vier Hexadezimalziffern folgen." -#: ../common/jsonapi.c:1106 +#: ../common/jsonapi.c:1115 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Unicode-Escape-Werte können nicht für Code-Punkt-Werte über 007F verwendet werden, wenn die Kodierung nicht UTF8 ist." -#: ../common/jsonapi.c:1108 jsonpath_scan.l:520 +#: ../common/jsonapi.c:1117 jsonpath_scan.l:516 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicode-High-Surrogate darf nicht auf ein High-Surrogate folgen." -#: ../common/jsonapi.c:1110 jsonpath_scan.l:531 jsonpath_scan.l:541 -#: jsonpath_scan.l:583 +#: ../common/jsonapi.c:1119 jsonpath_scan.l:527 jsonpath_scan.l:537 +#: jsonpath_scan.l:579 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicode-Low-Surrogate muss auf ein High-Surrogate folgen." -#: ../common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "Fatal: " - -#: ../common/logging.c:266 +#: ../common/logging.c:277 #, c-format msgid "error: " msgstr "Fehler: " -#: ../common/logging.c:273 +#: ../common/logging.c:284 #, c-format msgid "warning: " msgstr "Warnung: " +#: ../common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "Tipp: " + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -411,7 +456,7 @@ msgstr "ungültiger Fork-Name" msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." msgstr "Gültige Fork-Namen sind »main«, »fsm«, »vm« und »init«." -#: ../common/restricted_token.c:64 libpq/auth.c:1512 libpq/auth.c:2544 +#: ../common/restricted_token.c:64 libpq/auth.c:1368 libpq/auth.c:2400 #, c-format msgid "could not load library \"%s\": error code %lu" msgstr "konnte Bibliothek »%s« nicht laden: Fehlercode %lu" @@ -446,13 +491,13 @@ msgstr "konnte Prozess für Befehl »%s« nicht starten: Fehlercode %lu" msgid "could not re-execute with restricted token: error code %lu" msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu" -#: ../common/restricted_token.c:194 +#: ../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu" -#: ../common/rmtree.c:79 replication/basebackup.c:1181 -#: replication/basebackup.c:1357 +#: ../common/rmtree.c:79 replication/basebackup.c:1093 +#: replication/basebackup.c:1269 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "konnte »stat« für Datei oder Verzeichnis »%s« nicht ausführen: %m" @@ -462,6 +507,24 @@ msgstr "konnte »stat« für Datei oder Verzeichnis »%s« nicht ausführen: %m" msgid "could not remove file or directory \"%s\": %m" msgstr "konnte Datei oder Verzeichnis »%s« nicht entfernen: %m" +#: ../common/scram-common.c:260 +#, fuzzy +#| msgid "could not encode nonce\n" +msgid "could not encode salt" +msgstr "konnte Nonce nicht kodieren\n" + +#: ../common/scram-common.c:276 +#, fuzzy +#| msgid "could not encode nonce\n" +msgid "could not encode stored key" +msgstr "konnte Nonce nicht kodieren\n" + +#: ../common/scram-common.c:293 +#, fuzzy +#| msgid "could not connect to server" +msgid "could not encode server key" +msgstr "konnte nicht mit Server verbinden" + #: ../common/stringinfo.c:306 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." @@ -483,7 +546,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "konnte effektive Benutzer-ID %ld nicht nachschlagen: %s" -#: ../common/username.c:45 libpq/auth.c:2044 +#: ../common/username.c:45 libpq/auth.c:1900 msgid "user does not exist" msgstr "Benutzer existiert nicht" @@ -522,12 +585,12 @@ msgstr "Kindprozess wurde von Signal %d beendet: %s" msgid "child process exited with unrecognized status %d" msgstr "Kindprozess hat mit unbekanntem Status %d beendet" -#: ../port/chklocale.c:307 +#: ../port/chklocale.c:306 #, c-format msgid "could not determine encoding for codeset \"%s\"" msgstr "konnte Kodierung für Codeset »%s« nicht bestimmen" -#: ../port/chklocale.c:428 ../port/chklocale.c:434 +#: ../port/chklocale.c:427 ../port/chklocale.c:433 #, c-format msgid "could not determine encoding for locale \"%s\": codeset is \"%s\"" msgstr "konnte Kodierung für Locale »%s« nicht bestimmen: Codeset ist »%s«" @@ -552,30 +615,30 @@ msgstr "konnte Junction für »%s« nicht ermitteln: %s" msgid "could not get junction for \"%s\": %s\n" msgstr "konnte Junction für »%s« nicht ermitteln: %s\n" -#: ../port/open.c:126 +#: ../port/open.c:117 #, c-format msgid "could not open file \"%s\": %s" msgstr "konnte Datei »%s« nicht öffnen: %s" -#: ../port/open.c:127 +#: ../port/open.c:118 msgid "lock violation" msgstr "Sperrverletzung" -#: ../port/open.c:127 +#: ../port/open.c:118 msgid "sharing violation" msgstr "Zugriffsverletzung (Sharing Violation)" -#: ../port/open.c:128 +#: ../port/open.c:119 #, c-format msgid "Continuing to retry for 30 seconds." msgstr "Versuche werden für 30 Sekunden wiederholt." -#: ../port/open.c:129 +#: ../port/open.c:120 #, c-format msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "Möglicherweise stört eine Antivirus-, Datensicherungs- oder ähnliche Software das Datenbanksystem." -#: ../port/path.c:654 +#: ../port/path.c:775 #, c-format msgid "could not get current working directory: %s\n" msgstr "konnte aktuelles Arbeitsverzeichnis nicht ermitteln: %s\n" @@ -585,6 +648,16 @@ msgstr "konnte aktuelles Arbeitsverzeichnis nicht ermitteln: %s\n" msgid "operating system error %d" msgstr "Betriebssystemfehler %d" +#: ../port/thread.c:100 ../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "konnte lokale Benutzer-ID %d nicht nachschlagen: %s" + +#: ../port/thread.c:105 ../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "lokaler Benutzer mit ID %d existiert nicht" + #: ../port/win32security.c:62 #, c-format msgid "could not get SID for Administrators group: error code %lu\n" @@ -600,70 +673,71 @@ msgstr "konnte SID der PowerUsers-Gruppe nicht ermitteln: Fehlercode %lu\n" msgid "could not check access token membership: error code %lu\n" msgstr "konnte Access-Token-Mitgliedschaft nicht prüfen: Fehlercode %lu\n" -#: access/brin/brin.c:214 +#: access/brin/brin.c:215 #, c-format msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "Aufforderung für BRIN-Range-Summarization für Index »%s« Seite %u wurde nicht aufgezeichnet" -#: access/brin/brin.c:1015 access/brin/brin.c:1092 access/gin/ginfast.c:1035 -#: access/transam/xlog.c:10748 access/transam/xlog.c:11277 -#: access/transam/xlogfuncs.c:274 access/transam/xlogfuncs.c:301 -#: access/transam/xlogfuncs.c:340 access/transam/xlogfuncs.c:361 -#: access/transam/xlogfuncs.c:382 access/transam/xlogfuncs.c:452 -#: access/transam/xlogfuncs.c:509 +#: access/brin/brin.c:1019 access/brin/brin.c:1114 access/gin/ginfast.c:1035 +#: access/transam/xlogfuncs.c:165 access/transam/xlogfuncs.c:192 +#: access/transam/xlogfuncs.c:231 access/transam/xlogfuncs.c:252 +#: access/transam/xlogfuncs.c:273 access/transam/xlogfuncs.c:343 +#: access/transam/xlogfuncs.c:401 #, c-format msgid "recovery is in progress" msgstr "Wiederherstellung läuft" -#: access/brin/brin.c:1016 access/brin/brin.c:1093 +#: access/brin/brin.c:1020 access/brin/brin.c:1115 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "Während der Wiederherstellung können keine BRIN-Kontrollfunktionen ausgeführt werden." -#: access/brin/brin.c:1024 access/brin/brin.c:1101 -#, c-format -msgid "block number out of range: %s" +#: access/brin/brin.c:1025 access/brin/brin.c:1120 +#, fuzzy, c-format +#| msgid "block number out of range: %s" +msgid "block number out of range: %lld" msgstr "Blocknummer ist außerhalb des gültigen Bereichs: %s" -#: access/brin/brin.c:1047 access/brin/brin.c:1124 +#: access/brin/brin.c:1063 access/brin/brin.c:1146 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "»%s« ist kein BRIN-Index" -#: access/brin/brin.c:1063 access/brin/brin.c:1140 +#: access/brin/brin.c:1079 access/brin/brin.c:1162 #, c-format msgid "could not open parent table of index \"%s\"" msgstr "konnte Basistabelle von Index »%s« nicht öffnen" -#: access/brin/brin_bloom.c:751 access/brin/brin_bloom.c:793 -#: access/brin/brin_minmax_multi.c:2986 access/brin/brin_minmax_multi.c:3129 -#: statistics/dependencies.c:651 statistics/dependencies.c:704 -#: statistics/mcv.c:1480 statistics/mcv.c:1511 statistics/mvdistinct.c:343 -#: statistics/mvdistinct.c:396 utils/adt/pseudotypes.c:43 +#: access/brin/brin_bloom.c:750 access/brin/brin_bloom.c:792 +#: access/brin/brin_minmax_multi.c:3004 access/brin/brin_minmax_multi.c:3147 +#: statistics/dependencies.c:663 statistics/dependencies.c:716 +#: statistics/mcv.c:1484 statistics/mcv.c:1515 statistics/mvdistinct.c:344 +#: statistics/mvdistinct.c:397 utils/adt/pseudotypes.c:43 #: utils/adt/pseudotypes.c:77 utils/adt/pseudotypes.c:252 #, c-format msgid "cannot accept a value of type %s" msgstr "kann keinen Wert vom Typ %s annehmen" -#: access/brin/brin_minmax_multi.c:2144 access/brin/brin_minmax_multi.c:2151 -#: access/brin/brin_minmax_multi.c:2158 utils/adt/timestamp.c:941 -#: utils/adt/timestamp.c:1515 utils/adt/timestamp.c:1982 -#: utils/adt/timestamp.c:3059 utils/adt/timestamp.c:3064 -#: utils/adt/timestamp.c:3069 utils/adt/timestamp.c:3119 -#: utils/adt/timestamp.c:3126 utils/adt/timestamp.c:3133 -#: utils/adt/timestamp.c:3153 utils/adt/timestamp.c:3160 -#: utils/adt/timestamp.c:3167 utils/adt/timestamp.c:3197 -#: utils/adt/timestamp.c:3205 utils/adt/timestamp.c:3249 -#: utils/adt/timestamp.c:3676 utils/adt/timestamp.c:3801 -#: utils/adt/timestamp.c:4349 +#: access/brin/brin_minmax_multi.c:2163 access/brin/brin_minmax_multi.c:2170 +#: access/brin/brin_minmax_multi.c:2177 utils/adt/timestamp.c:938 +#: utils/adt/timestamp.c:1509 utils/adt/timestamp.c:2761 +#: utils/adt/timestamp.c:2778 utils/adt/timestamp.c:2831 +#: utils/adt/timestamp.c:2870 utils/adt/timestamp.c:3115 +#: utils/adt/timestamp.c:3120 utils/adt/timestamp.c:3125 +#: utils/adt/timestamp.c:3175 utils/adt/timestamp.c:3182 +#: utils/adt/timestamp.c:3189 utils/adt/timestamp.c:3209 +#: utils/adt/timestamp.c:3216 utils/adt/timestamp.c:3223 +#: utils/adt/timestamp.c:3253 utils/adt/timestamp.c:3261 +#: utils/adt/timestamp.c:3305 utils/adt/timestamp.c:3731 +#: utils/adt/timestamp.c:3855 utils/adt/timestamp.c:4405 #, c-format msgid "interval out of range" msgstr "interval-Wert ist außerhalb des gültigen Bereichs" #: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 #: access/brin/brin_pageops.c:843 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1441 access/spgist/spgdoinsert.c:2000 -#: access/spgist/spgdoinsert.c:2275 +#: access/gist/gist.c:1443 access/spgist/spgdoinsert.c:2001 +#: access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "Größe %zu der Indexzeile überschreitet Maximum %zu für Index »%s«" @@ -771,109 +845,102 @@ msgstr "Anzahl der Spalten (%d) überschreitet Maximum (%d)" msgid "number of index columns (%d) exceeds limit (%d)" msgstr "Anzahl der Indexspalten (%d) überschreitet Maximum (%d)" -#: access/common/indextuple.c:190 access/spgist/spgutils.c:947 +#: access/common/indextuple.c:190 access/spgist/spgutils.c:959 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "Indexzeile benötigt %zu Bytes, Maximalgröße ist %zu" #: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 -#: tcop/postgres.c:1900 +#: tcop/postgres.c:1914 #, c-format msgid "unsupported format code: %d" msgstr "nicht unterstützter Formatcode: %d" -#: access/common/reloptions.c:506 +#: access/common/reloptions.c:521 access/common/reloptions.c:532 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "Gültige Werte sind »on«, »off« und »auto«." -#: access/common/reloptions.c:517 +#: access/common/reloptions.c:543 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "Gültige Werte sind »local« und »cascaded«." -#: access/common/reloptions.c:665 +#: access/common/reloptions.c:691 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "Wertebereich des Typs für benutzerdefinierte Relationsparameter überschritten" -#: access/common/reloptions.c:1208 +#: access/common/reloptions.c:1234 #, c-format msgid "RESET must not include values for parameters" msgstr "RESET darf keinen Parameterwert enthalten" -#: access/common/reloptions.c:1240 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "unbekannter Parameter-Namensraum »%s«" -#: access/common/reloptions.c:1277 utils/misc/guc.c:12514 +#: access/common/reloptions.c:1303 utils/misc/guc.c:12885 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "Tabellen mit WITH OIDS werden nicht unterstützt" -#: access/common/reloptions.c:1447 +#: access/common/reloptions.c:1473 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "unbekannter Parameter »%s«" -#: access/common/reloptions.c:1559 +#: access/common/reloptions.c:1585 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "Parameter »%s« mehrmals angegeben" -#: access/common/reloptions.c:1575 +#: access/common/reloptions.c:1601 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "ungültiger Wert für Boole’sche Option »%s«: »%s«" -#: access/common/reloptions.c:1587 +#: access/common/reloptions.c:1613 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "ungültiger Wert für ganzzahlige Option »%s«: »%s«" -#: access/common/reloptions.c:1593 access/common/reloptions.c:1613 +#: access/common/reloptions.c:1619 access/common/reloptions.c:1639 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "Wert %s ist außerhalb des gültigen Bereichs für Option »%s«" -#: access/common/reloptions.c:1595 +#: access/common/reloptions.c:1621 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Gültige Werte sind zwischen »%d« und »%d«." -#: access/common/reloptions.c:1607 +#: access/common/reloptions.c:1633 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "ungültiger Wert für Gleitkommaoption »%s«: »%s«" -#: access/common/reloptions.c:1615 +#: access/common/reloptions.c:1641 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Gültige Werte sind zwischen »%f« und »%f«." -#: access/common/reloptions.c:1637 +#: access/common/reloptions.c:1663 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "ungültiger Wert für Enum-Option »%s«: »%s«" #: access/common/toast_compression.c:32 -#, fuzzy, c-format -#| msgid "unlink not supported with compression" -msgid "unsupported LZ4 compression method" -msgstr "Unlink wird bei Komprimierung nicht unterstützt" +#, c-format +msgid "compression method lz4 not supported" +msgstr "Komprimierungsmethode lz4 nicht unterstützt" #: access/common/toast_compression.c:33 #, c-format msgid "This functionality requires the server to be built with lz4 support." msgstr "Diese Funktionalität verlangt, dass der Server mit lz4-Unterstützung gebaut wird." -#: access/common/toast_compression.c:34 utils/adt/pg_locale.c:1589 -#: utils/adt/xml.c:224 -#, c-format -msgid "You need to rebuild PostgreSQL using %s." -msgstr "Sie müssen PostgreSQL mit %s neu bauen." - -#: access/common/tupdesc.c:825 parser/parse_clause.c:772 -#: parser/parse_relation.c:1838 +#: access/common/tupdesc.c:825 parser/parse_clause.c:773 +#: parser/parse_relation.c:1849 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "Spalte »%s« kann nicht als SETOF deklariert werden" @@ -903,7 +970,7 @@ msgstr "»%s« ist kein GIN-Index" msgid "cannot access temporary indexes of other sessions" msgstr "auf temporäre Indexe anderer Sitzungen kann nicht zugegriffen werden" -#: access/gin/ginget.c:270 access/nbtree/nbtinsert.c:759 +#: access/gin/ginget.c:271 access/nbtree/nbtinsert.c:760 #, c-format msgid "failed to re-find tuple within index \"%s\"" msgstr "konnte Tupel mit Index »%s« nicht erneut finden" @@ -918,8 +985,8 @@ msgstr "alte GIN-Indexe unterstützen keine Scans des ganzen Index oder Suchen n msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Um das zu reparieren, führen Sie REINDEX INDEX \"%s\" aus." -#: access/gin/ginutil.c:145 executor/execExpr.c:2166 -#: utils/adt/arrayfuncs.c:3818 utils/adt/arrayfuncs.c:6452 +#: access/gin/ginutil.c:146 executor/execExpr.c:2182 +#: utils/adt/arrayfuncs.c:3819 utils/adt/arrayfuncs.c:6488 #: utils/adt/rowtypes.c:957 #, c-format msgid "could not identify a comparison function for type %s" @@ -942,18 +1009,18 @@ msgstr "in Operatorklasse »%s« für Zugriffsmethode %s fehlt Support-Funktion msgid "support function number %d is invalid for access method %s" msgstr "Support-Funktionsnummer %d ist ungültig für Zugriffsmethode %s" -#: access/gist/gist.c:758 access/gist/gistvacuum.c:420 +#: access/gist/gist.c:760 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "Index »%s« enthält ein inneres Tupel, das als ungültig markiert ist" -#: access/gist/gist.c:760 access/gist/gistvacuum.c:422 +#: access/gist/gist.c:762 access/gist/gistvacuum.c:428 #, c-format msgid "This is caused by an incomplete page split at crash recovery before upgrading to PostgreSQL 9.1." msgstr "Das kommt von einem unvollständigen Page-Split bei der Crash-Recovery vor dem Upgrade auf PostgreSQL 9.1." -#: access/gist/gist.c:761 access/gist/gistutil.c:801 access/gist/gistutil.c:812 -#: access/gist/gistvacuum.c:423 access/hash/hashutil.c:227 +#: access/gist/gist.c:763 access/gist/gistutil.c:801 access/gist/gistutil.c:812 +#: access/gist/gistvacuum.c:429 access/hash/hashutil.c:227 #: access/hash/hashutil.c:238 access/hash/hashutil.c:250 #: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:810 #: access/nbtree/nbtpage.c:821 @@ -961,7 +1028,7 @@ msgstr "Das kommt von einem unvollständigen Page-Split bei der Crash-Recovery v msgid "Please REINDEX it." msgstr "Bitte führen Sie REINDEX für den Index aus." -#: access/gist/gist.c:1175 +#: access/gist/gist.c:1177 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "repariere unvollständiges Teilen in Index »%s«, Block %u" @@ -998,40 +1065,40 @@ msgstr "Operatorfamilie »%s« für Zugriffsmethode %s enthält nicht unterstüt msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY opfamily specification for operator %s" msgstr "Operatorfamilie »%s« für Zugriffsmethode %s enthält ungültige ORDER-BY-Operatorfamilienangabe für Operator %s" -#: access/hash/hashfunc.c:255 access/hash/hashfunc.c:311 -#: utils/adt/varchar.c:993 utils/adt/varchar.c:1053 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:334 +#: utils/adt/varchar.c:1003 utils/adt/varchar.c:1063 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "konnte die für das Zeichenketten-Hashing zu verwendende Sortierfolge nicht bestimmen" -#: access/hash/hashfunc.c:256 access/hash/hashfunc.c:312 catalog/heap.c:713 -#: catalog/heap.c:719 commands/createas.c:206 commands/createas.c:509 -#: commands/indexcmds.c:1869 commands/tablecmds.c:16795 commands/view.c:86 -#: regex/regc_pg_locale.c:263 utils/adt/formatting.c:1666 -#: utils/adt/formatting.c:1790 utils/adt/formatting.c:1915 utils/adt/like.c:194 -#: utils/adt/like_support.c:1003 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:994 utils/adt/varchar.c:1054 utils/adt/varlena.c:1524 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:335 catalog/heap.c:665 +#: catalog/heap.c:671 commands/createas.c:206 commands/createas.c:503 +#: commands/indexcmds.c:1912 commands/tablecmds.c:17413 commands/view.c:86 +#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1685 +#: utils/adt/formatting.c:1807 utils/adt/formatting.c:1930 utils/adt/like.c:190 +#: utils/adt/like_support.c:1024 utils/adt/varchar.c:733 +#: utils/adt/varchar.c:1004 utils/adt/varchar.c:1064 utils/adt/varlena.c:1499 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "Verwenden Sie die COLLATE-Klausel, um die Sortierfolge explizit zu setzen." -#: access/hash/hashinsert.c:82 +#: access/hash/hashinsert.c:83 #, c-format msgid "index row size %zu exceeds hash maximum %zu" msgstr "Größe der Indexzeile %zu überschreitet Maximum für Hash-Index %zu" -#: access/hash/hashinsert.c:84 access/spgist/spgdoinsert.c:2004 -#: access/spgist/spgdoinsert.c:2279 access/spgist/spgutils.c:1008 +#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1020 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "Werte, die größer sind als eine Pufferseite, können nicht indiziert werden." -#: access/hash/hashovfl.c:87 +#: access/hash/hashovfl.c:88 #, c-format msgid "invalid overflow block number %u" msgstr "ungültige Überlaufblocknummer %u" -#: access/hash/hashovfl.c:283 access/hash/hashpage.c:453 +#: access/hash/hashovfl.c:284 access/hash/hashpage.c:454 #, c-format msgid "out of overflow pages in hash index \"%s\"" msgstr "keine Überlaufseiten in Hash-Index »%s« mehr" @@ -1061,385 +1128,307 @@ msgstr "in Operatorfamilie »%s« für Zugriffsmethode %s fehlt Support-Funktion msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "in Operatorfamilie »%s« für Zugriffsmethode %s fehlen typübergreifende Operatoren" -#: access/heap/heapam.c:2260 +#: access/heap/heapam.c:2226 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "in einem parallelen Arbeitsprozess können keine Tupel eingefügt werden" -#: access/heap/heapam.c:2731 +#: access/heap/heapam.c:2697 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "während einer parallelen Operation können keine Tupel gelöscht werden" -#: access/heap/heapam.c:2777 +#: access/heap/heapam.c:2743 #, c-format msgid "attempted to delete invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu löschen" -#: access/heap/heapam.c:3209 access/heap/heapam.c:6010 +#: access/heap/heapam.c:3175 access/heap/heapam.c:6017 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "während einer parallelen Operation können keine Tupel aktualisiert werden" -#: access/heap/heapam.c:3342 +#: access/heap/heapam.c:3299 #, c-format msgid "attempted to update invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu aktualisieren" -#: access/heap/heapam.c:4663 access/heap/heapam.c:4701 -#: access/heap/heapam.c:4957 access/heap/heapam_handler.c:454 +#: access/heap/heapam.c:4661 access/heap/heapam.c:4699 +#: access/heap/heapam.c:4964 access/heap/heapam_handler.c:456 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "konnte Sperre für Zeile in Relation »%s« nicht setzen" -#: access/heap/heapam_handler.c:403 +#: access/heap/heapam_handler.c:401 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update" msgstr "das zu sperrende Tupel wurde schon durch ein gleichzeitiges Update in eine andere Partition verschoben" -#: access/heap/hio.c:360 access/heap/rewriteheap.c:665 +#: access/heap/hio.c:360 access/heap/rewriteheap.c:660 #, c-format msgid "row is too big: size %zu, maximum size %zu" msgstr "Zeile ist zu groß: Größe ist %zu, Maximalgröße ist %zu" -#: access/heap/rewriteheap.c:927 +#: access/heap/rewriteheap.c:920 #, c-format msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "konnte nicht in Datei »%s« schreiben, %d von %d geschrieben: %m" -#: access/heap/rewriteheap.c:1020 access/heap/rewriteheap.c:1138 +#: access/heap/rewriteheap.c:1013 access/heap/rewriteheap.c:1131 #: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:3328 access/transam/xlog.c:3516 -#: access/transam/xlog.c:4714 access/transam/xlog.c:11086 -#: access/transam/xlog.c:11124 access/transam/xlog.c:11529 -#: access/transam/xlogfuncs.c:776 postmaster/postmaster.c:4600 -#: postmaster/postmaster.c:5646 replication/logical/origin.c:587 -#: replication/slot.c:1482 storage/file/copydir.c:167 storage/smgr/md.c:218 -#: utils/time/snapmgr.c:1244 +#: access/transam/xlog.c:2963 access/transam/xlog.c:3176 +#: access/transam/xlog.c:3964 access/transam/xlog.c:8635 +#: access/transam/xlogfuncs.c:594 commands/dbcommands.c:521 +#: postmaster/postmaster.c:4597 postmaster/postmaster.c:5618 +#: replication/basebackup_server.c:149 replication/basebackup_server.c:242 +#: replication/logical/origin.c:587 replication/slot.c:1639 +#: storage/file/copydir.c:167 storage/smgr/md.c:222 utils/time/snapmgr.c:1261 #, c-format msgid "could not create file \"%s\": %m" msgstr "konnte Datei »%s« nicht erstellen: %m" -#: access/heap/rewriteheap.c:1148 +#: access/heap/rewriteheap.c:1141 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "konnte Datei »%s« nicht auf %u kürzen: %m" -#: access/heap/rewriteheap.c:1166 access/transam/timeline.c:384 +#: access/heap/rewriteheap.c:1159 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3400 access/transam/xlog.c:3572 -#: access/transam/xlog.c:4726 postmaster/postmaster.c:4610 -#: postmaster/postmaster.c:4620 replication/logical/origin.c:599 -#: replication/logical/origin.c:641 replication/logical/origin.c:660 -#: replication/logical/snapbuild.c:1611 replication/slot.c:1517 -#: storage/file/buffile.c:506 storage/file/copydir.c:207 -#: utils/init/miscinit.c:1421 utils/init/miscinit.c:1432 -#: utils/init/miscinit.c:1440 utils/misc/guc.c:8352 utils/misc/guc.c:8383 -#: utils/misc/guc.c:10292 utils/misc/guc.c:10306 utils/time/snapmgr.c:1249 -#: utils/time/snapmgr.c:1256 +#: access/transam/xlog.c:3035 access/transam/xlog.c:3232 +#: access/transam/xlog.c:3976 commands/dbcommands.c:533 +#: postmaster/postmaster.c:4607 postmaster/postmaster.c:4617 +#: replication/logical/origin.c:599 replication/logical/origin.c:641 +#: replication/logical/origin.c:660 replication/logical/snapbuild.c:1634 +#: replication/slot.c:1674 storage/file/buffile.c:537 +#: storage/file/copydir.c:207 utils/init/miscinit.c:1441 +#: utils/init/miscinit.c:1452 utils/init/miscinit.c:1460 utils/misc/guc.c:8653 +#: utils/misc/guc.c:8684 utils/misc/guc.c:10655 utils/misc/guc.c:10669 +#: utils/time/snapmgr.c:1266 utils/time/snapmgr.c:1273 #, c-format msgid "could not write to file \"%s\": %m" msgstr "konnte nicht in Datei »%s« schreiben: %m" -#: access/heap/rewriteheap.c:1256 access/transam/twophase.c:1613 -#: access/transam/xlogarchive.c:118 access/transam/xlogarchive.c:422 -#: postmaster/postmaster.c:1096 postmaster/syslogger.c:1465 -#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4362 -#: replication/logical/snapbuild.c:1556 replication/logical/snapbuild.c:1972 -#: replication/slot.c:1614 storage/file/fd.c:788 storage/file/fd.c:3169 -#: storage/file/fd.c:3231 storage/file/reinit.c:250 storage/ipc/dsm.c:315 -#: storage/smgr/md.c:344 storage/smgr/md.c:394 storage/sync/sync.c:231 -#: utils/time/snapmgr.c:1589 +#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1705 +#: access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:429 +#: postmaster/postmaster.c:1157 postmaster/syslogger.c:1537 +#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4397 +#: replication/logical/snapbuild.c:1579 replication/logical/snapbuild.c:1995 +#: replication/slot.c:1771 storage/file/fd.c:795 storage/file/fd.c:3263 +#: storage/file/fd.c:3325 storage/file/reinit.c:262 storage/ipc/dsm.c:317 +#: storage/smgr/md.c:348 storage/smgr/md.c:398 storage/sync/sync.c:250 +#: utils/time/snapmgr.c:1606 #, c-format msgid "could not remove file \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %m" -#: access/heap/vacuumlazy.c:745 +#: access/heap/vacuumlazy.c:407 +#, c-format +msgid "aggressively vacuuming \"%s.%s.%s\"" +msgstr "aggressives Vacuum von »%s.%s.%s«" + +#: access/heap/vacuumlazy.c:412 +#, c-format +msgid "vacuuming \"%s.%s.%s\"" +msgstr "Vacuum von »%s.%s.%s«" + +#: access/heap/vacuumlazy.c:663 +#, fuzzy, c-format +#| msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" +msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" +msgstr "automatisches Vacuum der Tabelle »%s.%s.%s«: Index-Scans: %d\n" + +#: access/heap/vacuumlazy.c:674 #, c-format msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisches aggressives Vacuum um Überlauf zu verhindern in der Tabelle »%s.%s.%s«: Index-Scans: %d\n" -#: access/heap/vacuumlazy.c:747 +#: access/heap/vacuumlazy.c:676 #, c-format msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisches Vacuum um Überlauf zu verhindern in der Tabelle »%s.%s.%s«: Index-Scans: %d\n" -#: access/heap/vacuumlazy.c:752 +#: access/heap/vacuumlazy.c:681 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisches aggressives Vacuum der Tabelle »%s.%s.%s«: Index-Scans: %d\n" -#: access/heap/vacuumlazy.c:754 +#: access/heap/vacuumlazy.c:683 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisches Vacuum der Tabelle »%s.%s.%s«: Index-Scans: %d\n" -#: access/heap/vacuumlazy.c:761 -#, c-format -msgid "pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n" +#: access/heap/vacuumlazy.c:690 +#, fuzzy, c-format +#| msgid "pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n" +msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" msgstr "Seiten: %u entfernt, %u verbleiben, %u übersprungen wegen Pins, %u übersprungen weil eingefroren\n" -#: access/heap/vacuumlazy.c:767 -#, c-format -msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable, oldest xmin: %u\n" -msgstr "Tupel: %lld entfernt, %lld verbleiben, %lld sind tot aber noch nicht entfernbar, ältestes xmin: %u\n" - -#: access/heap/vacuumlazy.c:773 commands/analyze.c:794 +#: access/heap/vacuumlazy.c:697 #, c-format -msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" -msgstr "Puffer-Verwendung: %lld Treffer, %lld Verfehlen, %lld geändert\n" +msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" +msgstr "Tupel: %lld entfernt, %lld verbleiben, %lld sind tot aber noch nicht entfernbar\n" -#: access/heap/vacuumlazy.c:783 +#: access/heap/vacuumlazy.c:703 #, c-format -msgid " %u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" +msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" msgstr "" -#: access/heap/vacuumlazy.c:786 -#, fuzzy -#| msgid "index \"%s\" not found" -msgid "index scan not needed:" -msgstr "Index »%s« nicht gefunden" - -#: access/heap/vacuumlazy.c:788 -#, fuzzy -#| msgid "index \"%s\" was reindexed" -msgid "index scan needed:" -msgstr "Index »%s« wurde neu indiziert" - -#: access/heap/vacuumlazy.c:792 +#: access/heap/vacuumlazy.c:708 #, c-format -msgid " %u pages from table (%.2f%% of total) have %lld dead item identifiers\n" -msgstr "" - -#: access/heap/vacuumlazy.c:795 -msgid "index scan bypassed:" -msgstr "" - -#: access/heap/vacuumlazy.c:797 -msgid "index scan bypassed by failsafe:" +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" msgstr "" -#: access/heap/vacuumlazy.c:813 +#: access/heap/vacuumlazy.c:714 #, c-format -msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" msgstr "" -#: access/heap/vacuumlazy.c:820 commands/analyze.c:798 +#: access/heap/vacuumlazy.c:721 #, c-format -msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" -msgstr "durchschn. Leserate: %.3f MB/s, durchschn. Schreibrate: %.3f MB/s\n" - -#: access/heap/vacuumlazy.c:824 commands/analyze.c:802 -msgid "I/O Timings:" +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" msgstr "" -#: access/heap/vacuumlazy.c:826 commands/analyze.c:804 -#, c-format -msgid " read=%.3f" -msgstr "" +#: access/heap/vacuumlazy.c:727 +msgid "index scan not needed: " +msgstr "Index-Scan nicht benötigt: " -#: access/heap/vacuumlazy.c:829 commands/analyze.c:807 -#, c-format -msgid " write=%.3f" -msgstr "" +#: access/heap/vacuumlazy.c:729 +msgid "index scan needed: " +msgstr "Index-Scan benötigt: " -#: access/heap/vacuumlazy.c:833 +#: access/heap/vacuumlazy.c:731 #, c-format -msgid "system usage: %s\n" -msgstr "Systembenutzung: %s\n" +msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" +msgstr "in %u Seiten der Tabelle (%.2f%% der Gesamtzahl) wurden %lld tote Item-Bezeichner entfernt\n" -#: access/heap/vacuumlazy.c:835 -#, fuzzy, c-format -#| msgid "WAL usage: %ld records, %ld full page images, %llu bytes" -msgid "WAL usage: %lld records, %lld full page images, %llu bytes" -msgstr "WAL-Benutzung: %ld Einträge, %ld Full Page Images, %llu Bytes" +#: access/heap/vacuumlazy.c:736 +msgid "index scan bypassed: " +msgstr "Index-Scan umgangen: " -#: access/heap/vacuumlazy.c:911 -#, c-format -msgid "aggressively vacuuming \"%s.%s\"" -msgstr "aggressives Vacuum von »%s.%s«" +#: access/heap/vacuumlazy.c:738 +msgid "index scan bypassed by failsafe: " +msgstr "Index-Scan umgangen durch Ausfallsicherung: " -#: access/heap/vacuumlazy.c:916 commands/cluster.c:898 +#: access/heap/vacuumlazy.c:740 #, c-format -msgid "vacuuming \"%s.%s\"" -msgstr "Vacuum von »%s.%s«" - -#: access/heap/vacuumlazy.c:1627 -#, fuzzy, c-format -#| msgid "\"%s\": removed %d row versions in %d pages" -msgid "\"%s\": removed %lld dead item identifiers in %u pages" -msgstr "»%s«: %d Zeilenversionen in %d Seiten entfernt" +msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" +msgstr "%u Seiten der Tabelle (%.2f%% der Gesamtzahl) haben %lld tote Item-Bezeichner\n" -#: access/heap/vacuumlazy.c:1633 +#: access/heap/vacuumlazy.c:755 #, c-format -msgid "%lld dead row versions cannot be removed yet, oldest xmin: %u\n" -msgstr "%lld tote Zeilenversionen können noch nicht entfernt werden, ältestes xmin: %u\n" +msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" +msgstr "Index »%s«: Seiten: %u gesamt, %u neu gelöscht, %u gegenwärtig gelöscht, %u wiederverwendbar\n" -#: access/heap/vacuumlazy.c:1635 +#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 #, c-format -msgid "%u page removed.\n" -msgid_plural "%u pages removed.\n" -msgstr[0] "" -msgstr[1] "" +msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" +msgstr "I/O-Zeitmessungen: Lesen: %.3f ms, Schreiben: %.3f ms\n" -#: access/heap/vacuumlazy.c:1639 +#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 #, c-format -msgid "Skipped %u page due to buffer pins, " -msgid_plural "Skipped %u pages due to buffer pins, " -msgstr[0] "%u Seite wegen Buffer-Pins übersprungen, " -msgstr[1] "%u Seiten wegen Buffer-Pins übersprungen, " +msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" +msgstr "durchschn. Leserate: %.3f MB/s, durchschn. Schreibrate: %.3f MB/s\n" -#: access/heap/vacuumlazy.c:1643 +#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 #, c-format -msgid "%u frozen page.\n" -msgid_plural "%u frozen pages.\n" -msgstr[0] "%u eingefrorene Seite.\n" -msgstr[1] "%u eingefrorene Seiten.\n" +msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" +msgstr "Puffer-Verwendung: %lld Treffer, %lld Verfehlen, %lld geändert\n" -#: access/heap/vacuumlazy.c:1647 commands/indexcmds.c:3986 -#: commands/indexcmds.c:4005 +#: access/heap/vacuumlazy.c:785 #, c-format -msgid "%s." -msgstr "%s." +msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" +msgstr "WAL-Benutzung: %lld Einträge, %lld Full Page Images, %llu Bytes\n" -#: access/heap/vacuumlazy.c:1650 +#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 #, c-format -msgid "\"%s\": found %lld removable, %lld nonremovable row versions in %u out of %u pages" -msgstr "»%s«: %lld entfernbare, %lld nicht entfernbare Zeilenversionen in %u von %u Seiten gefunden" +msgid "system usage: %s" +msgstr "Systembenutzung: %s" -#: access/heap/vacuumlazy.c:2155 +#: access/heap/vacuumlazy.c:2463 #, c-format -msgid "\"%s\": index scan bypassed: %u pages from table (%.2f%% of total) have %lld dead item identifiers" -msgstr "" - -#: access/heap/vacuumlazy.c:2366 -#, fuzzy, c-format -#| msgid "\"%s\": removed %d row versions in %d pages" -msgid "\"%s\": removed %d dead item identifiers in %u pages" -msgstr "»%s«: %d Zeilenversionen in %d Seiten entfernt" +msgid "table \"%s\": removed %lld dead item identifiers in %u pages" +msgstr "Tabelle »%s«: %lld tote Item-Bezeichner in %u Seiten entfernt" -#: access/heap/vacuumlazy.c:2598 -#, fuzzy, c-format -#| msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" +#: access/heap/vacuumlazy.c:2629 +#, c-format msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" -msgstr "automatisches Vacuum der Tabelle »%s.%s.%s«: Index-Scans: %d\n" +msgstr "umgehe nicht essentielle Wartung der Tabelle »%s.%s.%s« als Ausfallsicherung nach %d Index-Scans" -#: access/heap/vacuumlazy.c:2603 -#, fuzzy, c-format -#| msgid "oldest xmin is far in the past" -msgid "table's relfrozenxid or relminmxid is too far in the past" -msgstr "älteste xmin ist weit in der Vergangenheit" +#: access/heap/vacuumlazy.c:2634 +#, c-format +msgid "The table's relfrozenxid or relminmxid is too far in the past." +msgstr "relfrozenxid oder relminmxid der Tabelle ist zu weit in der Vergangenheit." -#: access/heap/vacuumlazy.c:2604 +#: access/heap/vacuumlazy.c:2635 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" "You might also need to consider other ways for VACUUM to keep up with the allocation of transaction IDs." msgstr "" +"Erhöhen Sie eventuell die Konfigurationsparameter »maintenance_work_mem« oder »autovacuum_work_mem«.\n" +"Sie müssen möglicherweise auch andere Wege in Betracht ziehen, wie VACUUM mit der Benutzung von Transaktions-IDs mithalten kann." -#: access/heap/vacuumlazy.c:2744 -#, c-format -msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" -msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" -msgstr[0] "%d parallelen Vacuum-Worker für Index-Cleanup gestartet (geplant: %d)" -msgstr[1] "%d parallele Vacuum-Worker für Index-Cleanup gestartet (geplant: %d)" - -#: access/heap/vacuumlazy.c:2750 -#, c-format -msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" -msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" -msgstr[0] "%d parallelen Vacuum-Worker für Index-Vacuum gestartet (geplant: %d)" -msgstr[1] "%d parallele Vacuum-Worker für Index-Vacuum gestartet (geplant: %d)" - -#: access/heap/vacuumlazy.c:3039 -#, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "Index »%s« gelesen und %d Zeilenversionen entfernt" - -#: access/heap/vacuumlazy.c:3096 -#, c-format -msgid "index \"%s\" now contains %.0f row versions in %u pages" -msgstr "Index »%s« enthält %.0f Zeilenversionen in %u Seiten" - -#: access/heap/vacuumlazy.c:3100 -#, fuzzy, c-format -#| msgid "" -#| "%.0f index row versions were removed.\n" -#| "%u index pages have been deleted, %u are currently reusable.\n" -#| "%s." -msgid "" -"%.0f index row versions were removed.\n" -"%u index pages were newly deleted.\n" -"%u index pages are currently deleted, of which %u are currently reusable.\n" -"%s." -msgstr "" -"%.0f Indexzeilenversionen wurde entfernt.\n" -"%u Indexseiten wurden gelöscht, %u sind gegenwärtig wiederverwendbar.\n" -"%s." - -#: access/heap/vacuumlazy.c:3212 +#: access/heap/vacuumlazy.c:2878 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "»%s«: Truncate wird gestoppt wegen Sperrkonflikt" -#: access/heap/vacuumlazy.c:3278 +#: access/heap/vacuumlazy.c:2948 #, c-format -msgid "\"%s\": truncated %u to %u pages" -msgstr "»%s«: von %u auf %u Seiten verkürzt" +msgid "table \"%s\": truncated %u to %u pages" +msgstr "Tabelle »%s«: von %u auf %u Seiten verkürzt" -#: access/heap/vacuumlazy.c:3343 +#: access/heap/vacuumlazy.c:3010 #, c-format -msgid "\"%s\": suspending truncate due to conflicting lock request" -msgstr "»%s«: Truncate wird ausgesetzt wegen Sperrkonflikt" +msgid "table \"%s\": suspending truncate due to conflicting lock request" +msgstr "Tabelle »%s«: Truncate wird ausgesetzt wegen Sperrkonflikt" -#: access/heap/vacuumlazy.c:3489 +#: access/heap/vacuumlazy.c:3170 #, c-format msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" msgstr "Paralleloption für Vacuum von »%s« wird deaktiviert --- Vacuum in temporären Tabellen kann nicht parallel ausgeführt werden" -#: access/heap/vacuumlazy.c:4244 -#, fuzzy, c-format -#| msgid "while scanning block %u of relation \"%s.%s\"" -msgid "while scanning block %u and offset %u of relation \"%s.%s\"" -msgstr "beim Scannen von Block %u von Relation »%s.%s«" +#: access/heap/vacuumlazy.c:3383 +#, c-format +msgid "while scanning block %u offset %u of relation \"%s.%s\"" +msgstr "beim Scannen von Block %u Offset %u von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:4247 +#: access/heap/vacuumlazy.c:3386 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "beim Scannen von Block %u von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:4251 +#: access/heap/vacuumlazy.c:3390 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "beim Scannen von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:4259 -#, fuzzy, c-format -#| msgid "while vacuuming block %u of relation \"%s.%s\"" -msgid "while vacuuming block %u and offset %u of relation \"%s.%s\"" -msgstr "beim Vacuum von Block %u von Relation »%s.%s«" +#: access/heap/vacuumlazy.c:3398 +#, c-format +msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" +msgstr "beim Vacuum von Block %u Offset %u von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:4262 +#: access/heap/vacuumlazy.c:3401 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "beim Vacuum von Block %u von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:4266 +#: access/heap/vacuumlazy.c:3405 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "beim Vacuum von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:4271 +#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1057 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "beim Vacuum von Index »%s« von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:4276 +#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1063 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "beim Säubern von Index »%s« von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:4282 +#: access/heap/vacuumlazy.c:3421 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "beim Trunkieren von Relation »%s.%s« auf %u Blöcke" @@ -1454,14 +1443,14 @@ msgstr "Zugriffsmethode »%s« ist nicht vom Typ %s" msgid "index access method \"%s\" does not have a handler" msgstr "Indexzugriffsmethode »%s« hat keinen Handler" -#: access/index/genam.c:486 +#: access/index/genam.c:489 #, c-format msgid "transaction aborted during system catalog scan" msgstr "Transaktion während eines Systemkatalog-Scans abgebrochen" -#: access/index/indexam.c:142 catalog/objectaddress.c:1355 -#: commands/indexcmds.c:2670 commands/tablecmds.c:267 commands/tablecmds.c:291 -#: commands/tablecmds.c:16493 commands/tablecmds.c:18195 +#: access/index/indexam.c:142 catalog/objectaddress.c:1376 +#: commands/indexcmds.c:2713 commands/tablecmds.c:270 commands/tablecmds.c:294 +#: commands/tablecmds.c:17101 commands/tablecmds.c:18869 #, c-format msgid "\"%s\" is not an index" msgstr "»%s« ist kein Index" @@ -1471,23 +1460,23 @@ msgstr "»%s« ist kein Index" msgid "operator class %s has no options" msgstr "Operatorklasse %s hat keine Optionen" -#: access/nbtree/nbtinsert.c:665 +#: access/nbtree/nbtinsert.c:666 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "doppelter Schlüsselwert verletzt Unique-Constraint »%s«" -#: access/nbtree/nbtinsert.c:667 +#: access/nbtree/nbtinsert.c:668 #, c-format msgid "Key %s already exists." msgstr "Schlüssel »%s« existiert bereits." -#: access/nbtree/nbtinsert.c:761 +#: access/nbtree/nbtinsert.c:762 #, c-format msgid "This may be because of a non-immutable index expression." msgstr "Das kann daran liegen, dass der Indexausdruck nicht »immutable« ist." #: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 -#: parser/parse_utilcmd.c:2329 +#: parser/parse_utilcmd.c:2322 #, c-format msgid "index \"%s\" is not a btree" msgstr "Index »%s« ist kein B-Tree" @@ -1497,27 +1486,27 @@ msgstr "Index »%s« ist kein B-Tree" msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" msgstr "keine Versionsübereinstimmung in Index »%s«: Dateiversion %d, aktuelle Version %d, kleinste unterstützte Version %d" -#: access/nbtree/nbtpage.c:1875 +#: access/nbtree/nbtpage.c:1874 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "Index »%s« enthält eine halbtote interne Seite" -#: access/nbtree/nbtpage.c:1877 +#: access/nbtree/nbtpage.c:1876 #, c-format msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." msgstr "Die Ursache kann ein unterbrochenes VACUUM in Version 9.3 oder älter vor dem Upgrade sein. Bitte REINDEX durchführen." -#: access/nbtree/nbtutils.c:2665 +#: access/nbtree/nbtutils.c:2669 #, c-format msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" msgstr "Größe %zu der Indexzeile überschreitet btree-Version %u Maximum %zu für Index »%s«" -#: access/nbtree/nbtutils.c:2671 +#: access/nbtree/nbtutils.c:2675 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "Indexzeile verweist auf Tupel (%u,%u) in Relation »%s«." -#: access/nbtree/nbtutils.c:2675 +#: access/nbtree/nbtutils.c:2679 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1531,12 +1520,12 @@ msgstr "" msgid "operator family \"%s\" of access method %s is missing support function for types %s and %s" msgstr "in Operatorfamilie »%s« für Zugriffsmethode %s fehlt Support-Funktion für Typen %s und %s" -#: access/spgist/spgutils.c:232 +#: access/spgist/spgutils.c:245 #, c-format msgid "compress method must be defined when leaf type is different from input type" msgstr "Compress-Methode muss definiert sein, wenn der Leaf-Typ verschieden vom Eingabetyp ist" -#: access/spgist/spgutils.c:1005 +#: access/spgist/spgutils.c:1017 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "innere Tupelgröße %zu überschreitet SP-GiST-Maximum %zu" @@ -1552,14 +1541,14 @@ msgid "operator family \"%s\" of access method %s is missing support function %d msgstr "in Operatorfamilie »%s« für Zugriffsmethode %s fehlt Support-Funktion %d für Typ %s" #: access/table/table.c:49 access/table/table.c:83 access/table/table.c:112 -#: access/table/table.c:145 catalog/aclchk.c:1792 +#: access/table/table.c:145 catalog/aclchk.c:1835 #, c-format msgid "\"%s\" is an index" msgstr "»%s« ist ein Index" #: access/table/table.c:54 access/table/table.c:88 access/table/table.c:117 -#: access/table/table.c:150 catalog/aclchk.c:1799 commands/tablecmds.c:13198 -#: commands/tablecmds.c:16502 +#: access/table/table.c:150 catalog/aclchk.c:1842 commands/tablecmds.c:13754 +#: commands/tablecmds.c:17110 #, c-format msgid "\"%s\" is a composite type" msgstr "»%s« ist ein zusammengesetzter Typ" @@ -1574,7 +1563,7 @@ msgstr "tid (%u, %u) ist nicht gültig für Relation »%s«" msgid "%s cannot be empty." msgstr "%s kann nicht leer sein." -#: access/table/tableamapi.c:122 utils/misc/guc.c:12438 +#: access/table/tableamapi.c:122 utils/misc/guc.c:12809 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s ist zu lang (maximal %d Zeichen)." @@ -1594,22 +1583,22 @@ msgstr "Tabellenzugriffsmethode »%s« existiert nicht." msgid "sample percentage must be between 0 and 100" msgstr "Stichprobenprozentsatz muss zwischen 0 und 100 sein" -#: access/transam/commit_ts.c:278 +#: access/transam/commit_ts.c:282 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "Commit-Timestamp von Transaktion %u kann nicht abgefragt werden" -#: access/transam/commit_ts.c:376 +#: access/transam/commit_ts.c:380 #, c-format msgid "could not get commit timestamp data" msgstr "konnte Commit-Timestamp-Daten nicht auslesen" -#: access/transam/commit_ts.c:378 +#: access/transam/commit_ts.c:382 #, c-format msgid "Make sure the configuration parameter \"%s\" is set on the primary server." msgstr "Stellen Sie sicher, dass der Konfigurationsparameter »%s« auf dem Primärserver gesetzt ist." -#: access/transam/commit_ts.c:380 +#: access/transam/commit_ts.c:384 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Stellen Sie sicher, dass der Konfigurationsparameter »%s« gesetzt ist." @@ -1634,14 +1623,14 @@ msgstr "" msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u" msgstr "Datenbank nimmt keine Befehle an, die neue MultiXactIds erzeugen, um Datenverlust wegen Transaktionsnummernüberlauf in Datenbank mit OID %u zu vermeiden" -#: access/transam/multixact.c:1049 access/transam/multixact.c:2330 +#: access/transam/multixact.c:1049 access/transam/multixact.c:2333 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" msgstr[0] "Datenbank »%s« muss gevacuumt werden, bevor %u weitere MultiXactId aufgebraucht ist" msgstr[1] "Datenbank »%s« muss gevacuumt werden, bevor %u weitere MultiXactIds aufgebraucht sind" -#: access/transam/multixact.c:1058 access/transam/multixact.c:2339 +#: access/transam/multixact.c:1058 access/transam/multixact.c:2342 #, c-format msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" @@ -1677,7 +1666,7 @@ msgstr[1] "Datenbank mit OID %u muss gevacuumt werden, bevor %d weitere Multixac msgid "Execute a database-wide VACUUM in that database with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." msgstr "Führen Sie ein datenbankweites VACUUM in dieser Datenbank aus, mit reduzierten Einstellungen für vacuum_multixact_freeze_min_age und vacuum_multixact_freeze_table_age." -#: access/transam/multixact.c:1298 +#: access/transam/multixact.c:1300 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "MultiXactId %u existiert nicht mehr -- anscheinender Überlauf" @@ -1687,7 +1676,7 @@ msgstr "MultiXactId %u existiert nicht mehr -- anscheinender Überlauf" msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "MultiXactId %u wurde noch nicht erzeugt -- anscheinender Überlauf" -#: access/transam/multixact.c:2335 access/transam/multixact.c:2344 +#: access/transam/multixact.c:2338 access/transam/multixact.c:2347 #: access/transam/varsup.c:151 access/transam/varsup.c:158 #: access/transam/varsup.c:466 access/transam/varsup.c:473 #, c-format @@ -1698,119 +1687,183 @@ msgstr "" "Um ein Abschalten der Datenbank zu vermeiden, führen Sie ein komplettes VACUUM über diese Datenbank aus.\n" "Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen oder unbenutzte Replikations-Slots löschen." -#: access/transam/multixact.c:2618 +#: access/transam/multixact.c:2621 #, c-format msgid "MultiXact member wraparound protections are disabled because oldest checkpointed MultiXact %u does not exist on disk" msgstr "MultiXact-Member-Wraparound-Schutz ist deaktiviert, weil die älteste gecheckpointete MultiXact %u nicht auf der Festplatte existiert" -#: access/transam/multixact.c:2640 +#: access/transam/multixact.c:2643 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "MultiXact-Member-Wraparound-Schutz ist jetzt aktiviert" -#: access/transam/multixact.c:3027 +#: access/transam/multixact.c:3030 #, c-format msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" msgstr "älteste MultiXact %u nicht gefunden, älteste ist MultiXact %u, Truncate wird ausgelassen" -#: access/transam/multixact.c:3045 +#: access/transam/multixact.c:3048 #, c-format msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" msgstr "kann nicht bis MultiXact %u trunkieren, weil sie nicht auf der Festplatte existiert, Trunkierung wird ausgelassen" -#: access/transam/multixact.c:3359 +#: access/transam/multixact.c:3362 #, c-format msgid "invalid MultiXactId: %u" msgstr "ungültige MultiXactId: %u" -#: access/transam/parallel.c:707 access/transam/parallel.c:826 +#: access/transam/parallel.c:718 access/transam/parallel.c:837 #, c-format msgid "parallel worker failed to initialize" msgstr "Initialisierung von parallelem Arbeitsprozess fehlgeschlagen" -#: access/transam/parallel.c:708 access/transam/parallel.c:827 +#: access/transam/parallel.c:719 access/transam/parallel.c:838 #, c-format msgid "More details may be available in the server log." msgstr "Weitere Einzelheiten sind möglicherweise im Serverlog zu finden." -#: access/transam/parallel.c:888 +#: access/transam/parallel.c:899 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "Postmaster beendete während einer parallelen Transaktion" -#: access/transam/parallel.c:1075 +#: access/transam/parallel.c:1086 #, c-format msgid "lost connection to parallel worker" msgstr "Verbindung mit parallelem Arbeitsprozess verloren" -#: access/transam/parallel.c:1141 access/transam/parallel.c:1143 +#: access/transam/parallel.c:1152 access/transam/parallel.c:1154 msgid "parallel worker" msgstr "paralleler Arbeitsprozess" -#: access/transam/parallel.c:1294 +#: access/transam/parallel.c:1307 #, c-format msgid "could not map dynamic shared memory segment" msgstr "konnte dynamisches Shared-Memory-Segment nicht mappen" -#: access/transam/parallel.c:1299 +#: access/transam/parallel.c:1312 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "ungültige magische Zahl in dynamischem Shared-Memory-Segment" -#: access/transam/slru.c:712 +#: access/transam/rmgr.c:84 +#, fuzzy, c-format +#| msgid "resource manager \"%s\" does not exist" +msgid "resource manager with ID %d not registered" +msgstr "Resouce-Manager »%s« existiert nicht" + +#: access/transam/rmgr.c:85 +#, c-format +msgid "Include the extension module that implements this resource manager in shared_preload_libraries." +msgstr "" + +#: access/transam/rmgr.c:101 +#, fuzzy, c-format +#| msgid "custom resource manager \"%s\" does not exist" +msgid "custom resource manager name is invalid" +msgstr "Custom-Resouce-Manager »%s« existiert nicht" + +#: access/transam/rmgr.c:102 +#, c-format +msgid "Provide a non-empty name for the custom resource manager." +msgstr "" + +#: access/transam/rmgr.c:105 +#, fuzzy, c-format +#| msgid "custom resource manager \"%s\" does not exist" +msgid "custom resource manager ID %d is out of range" +msgstr "Custom-Resouce-Manager »%s« existiert nicht" + +#: access/transam/rmgr.c:106 +#, fuzzy, c-format +#| msgid "invalid resource manager ID %u at %X/%X" +msgid "Provide a custom resource manager ID between %d and %d." +msgstr "ungültige Resource-Manager-ID %u bei %X/%X" + +#: access/transam/rmgr.c:111 access/transam/rmgr.c:116 +#: access/transam/rmgr.c:128 +#, fuzzy, c-format +#| msgid "custom resource manager \"%s\" does not exist" +msgid "failed to register custom resource manager \"%s\" with ID %d" +msgstr "Custom-Resouce-Manager »%s« existiert nicht" + +#: access/transam/rmgr.c:112 +#, fuzzy, c-format +#| msgid "background worker \"%s\": must be registered in shared_preload_libraries" +msgid "Custom resource manager must be registered while initializing modules in shared_preload_libraries." +msgstr "Background-Worker »%s«: muss in shared_preload_libraries registriert sein" + +#: access/transam/rmgr.c:117 +#, fuzzy, c-format +#| msgid "custom resource manager \"%s\" does not exist" +msgid "Custom resource manager \"%s\" already registered with the same ID." +msgstr "Custom-Resouce-Manager »%s« existiert nicht" + +#: access/transam/rmgr.c:129 +#, c-format +msgid "Existing resource manager with ID %d has the same name." +msgstr "" + +#: access/transam/rmgr.c:135 +#, fuzzy, c-format +#| msgid "custom resource manager \"%s\" does not exist" +msgid "registered custom resource manager \"%s\" with ID %d" +msgstr "Custom-Resouce-Manager »%s« existiert nicht" + +#: access/transam/slru.c:713 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "Datei »%s« existiert nicht, wird als Nullen eingelesen" -#: access/transam/slru.c:944 access/transam/slru.c:950 -#: access/transam/slru.c:958 access/transam/slru.c:963 -#: access/transam/slru.c:970 access/transam/slru.c:975 -#: access/transam/slru.c:982 access/transam/slru.c:989 +#: access/transam/slru.c:945 access/transam/slru.c:951 +#: access/transam/slru.c:959 access/transam/slru.c:964 +#: access/transam/slru.c:971 access/transam/slru.c:976 +#: access/transam/slru.c:983 access/transam/slru.c:990 #, c-format msgid "could not access status of transaction %u" msgstr "konnte auf den Status von Transaktion %u nicht zugreifen" -#: access/transam/slru.c:945 +#: access/transam/slru.c:946 #, c-format msgid "Could not open file \"%s\": %m." msgstr "Konnte Datei »%s« nicht öffnen: %m." -#: access/transam/slru.c:951 +#: access/transam/slru.c:952 #, c-format -msgid "Could not seek in file \"%s\" to offset %u: %m." -msgstr "Konnte Positionszeiger in Datei »%s« nicht auf %u setzen: %m." +msgid "Could not seek in file \"%s\" to offset %d: %m." +msgstr "Konnte Positionszeiger in Datei »%s« nicht auf %d setzen: %m." -#: access/transam/slru.c:959 +#: access/transam/slru.c:960 #, c-format -msgid "Could not read from file \"%s\" at offset %u: %m." -msgstr "Konnte nicht aus Datei »%s« bei Position %u lesen: %m." +msgid "Could not read from file \"%s\" at offset %d: %m." +msgstr "Konnte nicht aus Datei »%s« bei Position %d lesen: %m." -#: access/transam/slru.c:964 +#: access/transam/slru.c:965 #, c-format -msgid "Could not read from file \"%s\" at offset %u: read too few bytes." -msgstr "Konnte nicht aus Datei »%s« bei Position %u lesen: zu wenige Bytes gelesen." +msgid "Could not read from file \"%s\" at offset %d: read too few bytes." +msgstr "Konnte nicht aus Datei »%s« bei Position %d lesen: zu wenige Bytes gelesen." -#: access/transam/slru.c:971 +#: access/transam/slru.c:972 #, c-format -msgid "Could not write to file \"%s\" at offset %u: %m." -msgstr "Konnte nicht in Datei »%s« bei Position %u schreiben: %m." +msgid "Could not write to file \"%s\" at offset %d: %m." +msgstr "Konnte nicht in Datei »%s« bei Position %d schreiben: %m." -#: access/transam/slru.c:976 +#: access/transam/slru.c:977 #, c-format -msgid "Could not write to file \"%s\" at offset %u: wrote too few bytes." -msgstr "Konnte nicht in Datei »%s« bei Position %u schreiben: zu wenige Bytes geschrieben." +msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." +msgstr "Konnte nicht in Datei »%s« bei Position %d schreiben: zu wenige Bytes geschrieben." -#: access/transam/slru.c:983 +#: access/transam/slru.c:984 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "Konnte Datei »%s« nicht fsyncen: %m." -#: access/transam/slru.c:990 +#: access/transam/slru.c:991 #, c-format msgid "Could not close file \"%s\": %m." msgstr "Konnte Datei »%s« nicht schließen: %m." -#: access/transam/slru.c:1251 +#: access/transam/slru.c:1252 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "konnte Verzeichnis »%s« nicht leeren: anscheinender Überlauf" @@ -1855,161 +1908,167 @@ msgstr "Zeitleisten-IDs müssen kleiner als die Zeitleisten-ID des Kindes sein." msgid "requested timeline %u is not in this server's history" msgstr "angeforderte Zeitleiste %u ist nicht in der History dieses Servers" -#: access/transam/twophase.c:381 +#: access/transam/twophase.c:385 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "Transaktionsbezeichner »%s« ist zu lang" -#: access/transam/twophase.c:388 +#: access/transam/twophase.c:392 #, c-format msgid "prepared transactions are disabled" msgstr "vorbereitete Transaktionen sind abgeschaltet" -#: access/transam/twophase.c:389 +#: access/transam/twophase.c:393 #, c-format msgid "Set max_prepared_transactions to a nonzero value." msgstr "Setzen Sie max_prepared_transactions auf einen Wert höher als null." -#: access/transam/twophase.c:408 +#: access/transam/twophase.c:412 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "Transaktionsbezeichner »%s« wird bereits verwendet" -#: access/transam/twophase.c:417 access/transam/twophase.c:2385 +#: access/transam/twophase.c:421 access/transam/twophase.c:2486 #, c-format msgid "maximum number of prepared transactions reached" msgstr "maximale Anzahl vorbereiteter Transaktionen erreicht" -#: access/transam/twophase.c:418 access/transam/twophase.c:2386 +#: access/transam/twophase.c:422 access/transam/twophase.c:2487 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "Erhöhen Sie max_prepared_transactions (aktuell %d)." -#: access/transam/twophase.c:584 +#: access/transam/twophase.c:598 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "vorbereitete Transaktion mit Bezeichner »%s« ist beschäftigt" -#: access/transam/twophase.c:590 +#: access/transam/twophase.c:604 #, c-format msgid "permission denied to finish prepared transaction" msgstr "keine Berechtigung, um vorbereitete Transaktion abzuschließen" -#: access/transam/twophase.c:591 +#: access/transam/twophase.c:605 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "Sie müssen Superuser oder der Benutzer sein, der die Transaktion vorbereitet hat." -#: access/transam/twophase.c:602 +#: access/transam/twophase.c:616 #, c-format msgid "prepared transaction belongs to another database" msgstr "vorbereitete Transaktion gehört zu einer anderen Datenbank" -#: access/transam/twophase.c:603 +#: access/transam/twophase.c:617 #, c-format msgid "Connect to the database where the transaction was prepared to finish it." msgstr "Verbinden Sie sich mit der Datenbank, wo die Transaktion vorbereitet wurde, um sie zu beenden." -#: access/transam/twophase.c:618 +#: access/transam/twophase.c:632 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "vorbereitete Transaktion mit Bezeichner »%s« existiert nicht" -#: access/transam/twophase.c:1093 +#: access/transam/twophase.c:1169 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "maximale Länge der Zweiphasen-Statusdatei überschritten" -#: access/transam/twophase.c:1247 +#: access/transam/twophase.c:1324 #, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" msgstr[0] "falsche Größe von Datei »%s«: %lld Byte" msgstr[1] "falsche Größe von Datei »%s«: %lld Bytes" -#: access/transam/twophase.c:1256 +#: access/transam/twophase.c:1333 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "falsche Ausrichtung des CRC-Offsets für Datei »%s«" -#: access/transam/twophase.c:1274 +#: access/transam/twophase.c:1351 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "konnte Datei »%s« nicht lesen: %d von %lld gelesen" -#: access/transam/twophase.c:1289 +#: access/transam/twophase.c:1366 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "ungültige magische Zahl in Datei »%s gespeichert«" -#: access/transam/twophase.c:1295 +#: access/transam/twophase.c:1372 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "ungültige Größe in Datei »%s« gespeichert" -#: access/transam/twophase.c:1307 +#: access/transam/twophase.c:1384 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "berechnete CRC-Prüfsumme stimmt nicht mit dem Wert in Datei »%s« überein" -#: access/transam/twophase.c:1342 access/transam/xlog.c:6634 +#: access/transam/twophase.c:1414 access/transam/xlogrecovery.c:568 +#: replication/logical/logical.c:206 replication/walsender.c:703 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Fehlgeschlagen beim Anlegen eines WAL-Leseprozessors." -#: access/transam/twophase.c:1357 +#: access/transam/twophase.c:1424 +#, c-format +msgid "could not read two-phase state from WAL at %X/%X: %s" +msgstr "konnte Zweiphasen-Status nicht aus dem WAL bei %X/%X lesen: %s" + +#: access/transam/twophase.c:1429 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "konnte Zweiphasen-Status nicht aus dem WAL bei %X/%X lesen" -#: access/transam/twophase.c:1364 +#: access/transam/twophase.c:1437 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "erwartete Zweiphasen-Status-Daten sind nicht im WAL bei %X/%X vorhanden" -#: access/transam/twophase.c:1641 +#: access/transam/twophase.c:1733 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "konnte Datei »%s« nicht neu erzeugen: %m" -#: access/transam/twophase.c:1768 +#: access/transam/twophase.c:1860 #, c-format msgid "%u two-phase state file was written for a long-running prepared transaction" msgid_plural "%u two-phase state files were written for long-running prepared transactions" msgstr[0] "%u Zweiphasen-Statusdatei wurde für eine lange laufende vorbereitete Transaktion geschrieben" msgstr[1] "%u Zweiphasen-Statusdateien wurden für lange laufende vorbereitete Transaktionen geschrieben" -#: access/transam/twophase.c:2002 +#: access/transam/twophase.c:2094 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "Wiederherstellung der vorbereiteten Transaktion %u aus dem Shared Memory" -#: access/transam/twophase.c:2093 +#: access/transam/twophase.c:2187 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "entferne abgelaufene Zweiphasen-Statusdatei für Transaktion %u" -#: access/transam/twophase.c:2100 +#: access/transam/twophase.c:2194 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "entferne abgelaufenen Zweiphasen-Status aus dem Speicher für Transaktion %u" -#: access/transam/twophase.c:2113 +#: access/transam/twophase.c:2207 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "entferne zukünftige Zweiphasen-Statusdatei für Transaktion %u" -#: access/transam/twophase.c:2120 +#: access/transam/twophase.c:2214 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "entferne zukünftigen Zweiphasen-Status aus dem Speicher für Transaktion %u" -#: access/transam/twophase.c:2145 +#: access/transam/twophase.c:2239 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "verfälschte Zweiphasen-Statusdatei für Transaktion %u" -#: access/transam/twophase.c:2150 +#: access/transam/twophase.c:2244 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "verfälschter Zweiphasen-Status im Speicher für Transaktion %u" @@ -2043,2126 +2102,2053 @@ msgstr "Datenbank »%s« muss innerhalb von %u Transaktionen gevacuumt werden" msgid "database with OID %u must be vacuumed within %u transactions" msgstr "Datenbank mit OID %u muss innerhalb von %u Transaktionen gevacuumt werden" -#: access/transam/xact.c:1045 +#: access/transam/xact.c:1098 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "kann nicht mehr als 2^32-2 Befehle in einer Transaktion ausführen" -#: access/transam/xact.c:1582 +#: access/transam/xact.c:1644 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "maximale Anzahl committeter Subtransaktionen (%d) überschritten" -#: access/transam/xact.c:2423 +#: access/transam/xact.c:2501 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "PREPARE kann nicht für eine Transaktion ausgeführt werden, die temporäre Objekte bearbeitet hat" -#: access/transam/xact.c:2433 +#: access/transam/xact.c:2511 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "PREPARE kann nicht für eine Transaktion ausgeführt werden, die Snapshots exportiert hat" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3388 +#: access/transam/xact.c:3471 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s kann nicht in einem Transaktionsblock laufen" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3398 +#: access/transam/xact.c:3481 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%s kann nicht in einer Subtransaktion laufen" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3408 +#: access/transam/xact.c:3491 #, c-format msgid "%s cannot be executed from a function" msgstr "%s kann nicht aus einer Funktion ausgeführt werden" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3477 access/transam/xact.c:3783 -#: access/transam/xact.c:3862 access/transam/xact.c:3985 -#: access/transam/xact.c:4136 access/transam/xact.c:4205 -#: access/transam/xact.c:4316 +#: access/transam/xact.c:3560 access/transam/xact.c:3866 +#: access/transam/xact.c:3945 access/transam/xact.c:4068 +#: access/transam/xact.c:4219 access/transam/xact.c:4288 +#: access/transam/xact.c:4399 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s kann nur in Transaktionsblöcken verwendet werden" -#: access/transam/xact.c:3669 +#: access/transam/xact.c:3752 #, c-format msgid "there is already a transaction in progress" msgstr "eine Transaktion ist bereits begonnen" -#: access/transam/xact.c:3788 access/transam/xact.c:3867 -#: access/transam/xact.c:3990 +#: access/transam/xact.c:3871 access/transam/xact.c:3950 +#: access/transam/xact.c:4073 #, c-format msgid "there is no transaction in progress" msgstr "keine Transaktion offen" -#: access/transam/xact.c:3878 +#: access/transam/xact.c:3961 #, c-format msgid "cannot commit during a parallel operation" msgstr "während einer parallelen Operation kann nicht committet werden" -#: access/transam/xact.c:4001 +#: access/transam/xact.c:4084 #, c-format msgid "cannot abort during a parallel operation" msgstr "während einer parallelen Operation kann nicht abgebrochen werden" -#: access/transam/xact.c:4100 +#: access/transam/xact.c:4183 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "während einer parallelen Operation können keine Sicherungspunkte definiert werden" -#: access/transam/xact.c:4187 +#: access/transam/xact.c:4270 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "während einer parallelen Operation können keine Sicherungspunkte freigegeben werden" -#: access/transam/xact.c:4197 access/transam/xact.c:4248 -#: access/transam/xact.c:4308 access/transam/xact.c:4357 +#: access/transam/xact.c:4280 access/transam/xact.c:4331 +#: access/transam/xact.c:4391 access/transam/xact.c:4440 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "Sicherungspunkt »%s« existiert nicht" -#: access/transam/xact.c:4254 access/transam/xact.c:4363 +#: access/transam/xact.c:4337 access/transam/xact.c:4446 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "Sicherungspunkt »%s« existiert nicht innerhalb der aktuellen Sicherungspunktebene" -#: access/transam/xact.c:4296 +#: access/transam/xact.c:4379 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "während einer parallelen Operation kann nicht auf einen Sicherungspunkt zurückgerollt werden" -#: access/transam/xact.c:4424 +#: access/transam/xact.c:4507 #, c-format msgid "cannot start subtransactions during a parallel operation" msgstr "während einer parallelen Operation können keine Subtransaktionen gestartet werden" -#: access/transam/xact.c:4492 +#: access/transam/xact.c:4575 #, c-format msgid "cannot commit subtransactions during a parallel operation" msgstr "während einer parallelen Operation können keine Subtransaktionen committet werden" -#: access/transam/xact.c:5133 +#: access/transam/xact.c:5222 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "kann nicht mehr als 2^32-1 Subtransaktionen in einer Transaktion haben" -#: access/transam/xlog.c:1825 +#: access/transam/xlog.c:1463 #, c-format msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" -msgstr "" +msgstr "Flush hinter das Ende des erzeugten WAL angefordert; Anforderung %X/%X, aktuelle Position %X/%X" -#: access/transam/xlog.c:2586 +#: access/transam/xlog.c:2224 #, c-format msgid "could not write to log file %s at offset %u, length %zu: %m" msgstr "konnte nicht in Logdatei %s bei Position %u, Länge %zu schreiben: %m" -#: access/transam/xlog.c:3988 access/transam/xlogutils.c:798 -#: replication/walsender.c:2520 +#: access/transam/xlog.c:3471 access/transam/xlogutils.c:845 +#: replication/walsender.c:2717 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "das angeforderte WAL-Segment %s wurde schon entfernt" -#: access/transam/xlog.c:4263 +#: access/transam/xlog.c:3756 #, c-format msgid "could not rename file \"%s\": %m" msgstr "konnte Datei »%s« nicht umbenennen: %m" -#: access/transam/xlog.c:4305 access/transam/xlog.c:4315 +#: access/transam/xlog.c:3798 access/transam/xlog.c:3808 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "benötigtes WAL-Verzeichnis »%s« existiert nicht" -#: access/transam/xlog.c:4321 +#: access/transam/xlog.c:3814 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "erzeuge fehlendes WAL-Verzeichnis »%s«" -#: access/transam/xlog.c:4324 +#: access/transam/xlog.c:3817 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "konnte fehlendes Verzeichnis »%s« nicht erzeugen: %m" -#: access/transam/xlog.c:4427 -#, c-format -msgid "unexpected timeline ID %u in log segment %s, offset %u" -msgstr "unerwartete Zeitleisten-ID %u in Logsegment %s, Offset %u" - -#: access/transam/xlog.c:4565 -#, c-format -msgid "new timeline %u is not a child of database system timeline %u" -msgstr "neue Zeitleiste %u ist kein Kind der Datenbanksystemzeitleiste %u" - -#: access/transam/xlog.c:4579 -#, c-format -msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" -msgstr "neue Zeitleiste %u zweigte von der aktuellen Datenbanksystemzeitleiste %u vor dem aktuellen Wiederherstellungspunkt %X/%X ab" - -#: access/transam/xlog.c:4598 -#, c-format -msgid "new target timeline is %u" -msgstr "neue Zielzeitleiste ist %u" - -#: access/transam/xlog.c:4634 +#: access/transam/xlog.c:3884 #, c-format msgid "could not generate secret authorization token" msgstr "konnte geheimes Autorisierungstoken nicht erzeugen" -#: access/transam/xlog.c:4793 access/transam/xlog.c:4802 -#: access/transam/xlog.c:4826 access/transam/xlog.c:4833 -#: access/transam/xlog.c:4840 access/transam/xlog.c:4845 -#: access/transam/xlog.c:4852 access/transam/xlog.c:4859 -#: access/transam/xlog.c:4866 access/transam/xlog.c:4873 -#: access/transam/xlog.c:4880 access/transam/xlog.c:4887 -#: access/transam/xlog.c:4896 access/transam/xlog.c:4903 -#: utils/init/miscinit.c:1578 +#: access/transam/xlog.c:4043 access/transam/xlog.c:4052 +#: access/transam/xlog.c:4076 access/transam/xlog.c:4083 +#: access/transam/xlog.c:4090 access/transam/xlog.c:4095 +#: access/transam/xlog.c:4102 access/transam/xlog.c:4109 +#: access/transam/xlog.c:4116 access/transam/xlog.c:4123 +#: access/transam/xlog.c:4130 access/transam/xlog.c:4137 +#: access/transam/xlog.c:4146 access/transam/xlog.c:4153 +#: utils/init/miscinit.c:1598 #, c-format msgid "database files are incompatible with server" msgstr "Datenbankdateien sind inkompatibel mit Server" -#: access/transam/xlog.c:4794 +#: access/transam/xlog.c:4044 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." msgstr "Der Datenbank-Cluster wurde mit PG_CONTROL_VERSION %d (0x%08x) initialisiert, aber der Server wurde mit PG_CONTROL_VERSION %d (0x%08x) kompiliert." -#: access/transam/xlog.c:4798 +#: access/transam/xlog.c:4048 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." msgstr "Das Problem könnte eine falsche Byte-Reihenfolge sein. Es sieht so aus, dass Sie initdb ausführen müssen." -#: access/transam/xlog.c:4803 +#: access/transam/xlog.c:4053 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." msgstr "Der Datenbank-Cluster wurde mit PG_CONTROL_VERSION %d initialisiert, aber der Server wurde mit PG_CONTROL_VERSION %d kompiliert." -#: access/transam/xlog.c:4806 access/transam/xlog.c:4830 -#: access/transam/xlog.c:4837 access/transam/xlog.c:4842 +#: access/transam/xlog.c:4056 access/transam/xlog.c:4080 +#: access/transam/xlog.c:4087 access/transam/xlog.c:4092 #, c-format msgid "It looks like you need to initdb." msgstr "Es sieht so aus, dass Sie initdb ausführen müssen." -#: access/transam/xlog.c:4817 +#: access/transam/xlog.c:4067 #, c-format msgid "incorrect checksum in control file" msgstr "falsche Prüfsumme in Kontrolldatei" -#: access/transam/xlog.c:4827 +#: access/transam/xlog.c:4077 #, c-format msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." msgstr "Der Datenbank-Cluster wurde mit CATALOG_VERSION_NO %d initialisiert, aber der Server wurde mit CATALOG_VERSION_NO %d kompiliert." -#: access/transam/xlog.c:4834 +#: access/transam/xlog.c:4084 #, c-format msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." msgstr "Der Datenbank-Cluster wurde mit MAXALIGN %d initialisiert, aber der Server wurde mit MAXALIGN %d kompiliert." -#: access/transam/xlog.c:4841 +#: access/transam/xlog.c:4091 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "Der Datenbank-Cluster verwendet anscheinend ein anderes Fließkommazahlenformat als das Serverprogramm." -#: access/transam/xlog.c:4846 +#: access/transam/xlog.c:4096 #, c-format msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." msgstr "Der Datenbank-Cluster wurde mit BLCKSZ %d initialisiert, aber der Server wurde mit BLCKSZ %d kompiliert." -#: access/transam/xlog.c:4849 access/transam/xlog.c:4856 -#: access/transam/xlog.c:4863 access/transam/xlog.c:4870 -#: access/transam/xlog.c:4877 access/transam/xlog.c:4884 -#: access/transam/xlog.c:4891 access/transam/xlog.c:4899 -#: access/transam/xlog.c:4906 +#: access/transam/xlog.c:4099 access/transam/xlog.c:4106 +#: access/transam/xlog.c:4113 access/transam/xlog.c:4120 +#: access/transam/xlog.c:4127 access/transam/xlog.c:4134 +#: access/transam/xlog.c:4141 access/transam/xlog.c:4149 +#: access/transam/xlog.c:4156 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Es sieht so aus, dass Sie neu kompilieren oder initdb ausführen müssen." -#: access/transam/xlog.c:4853 +#: access/transam/xlog.c:4103 #, c-format msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." msgstr "Der Datenbank-Cluster wurde mit RELSEG_SIZE %d initialisiert, aber der Server wurde mit RELSEGSIZE %d kompiliert." -#: access/transam/xlog.c:4860 +#: access/transam/xlog.c:4110 #, c-format msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." msgstr "Der Datenbank-Cluster wurde mit XLOG_BLCKSZ %d initialisiert, aber der Server wurde mit XLOG_BLCKSZ %d kompiliert." -#: access/transam/xlog.c:4867 +#: access/transam/xlog.c:4117 #, c-format msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." msgstr "Der Datenbank-Cluster wurde mit NAMEDATALEN %d initialisiert, aber der Server wurde mit NAMEDATALEN %d kompiliert." -#: access/transam/xlog.c:4874 +#: access/transam/xlog.c:4124 #, c-format msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." msgstr "Der Datenbank-Cluster wurde mit INDEX_MAX_KEYS %d initialisiert, aber der Server wurde mit INDEX_MAX_KEYS %d kompiliert." -#: access/transam/xlog.c:4881 +#: access/transam/xlog.c:4131 #, c-format msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." msgstr "Der Datenbank-Cluster wurde mit TOAST_MAX_CHUNK_SIZE %d initialisiert, aber der Server wurde mit TOAST_MAX_CHUNK_SIZE %d kompiliert." -#: access/transam/xlog.c:4888 +#: access/transam/xlog.c:4138 #, c-format msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." msgstr "Der Datenbank-Cluster wurde mit LOBLKSIZE %d initialisiert, aber der Server wurde mit LOBLKSIZE %d kompiliert." -#: access/transam/xlog.c:4897 +#: access/transam/xlog.c:4147 #, c-format msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." msgstr "Der Datenbank-Cluster wurde ohne USE_FLOAT8_BYVAL initialisiert, aber der Server wurde mit USE_FLOAT8_BYVAL kompiliert." -#: access/transam/xlog.c:4904 +#: access/transam/xlog.c:4154 #, c-format msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." msgstr "Der Datenbank-Cluster wurde mit USE_FLOAT8_BYVAL initialisiert, aber der Server wurde ohne USE_FLOAT8_BYVAL kompiliert." -#: access/transam/xlog.c:4913 +#: access/transam/xlog.c:4163 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber die Kontrolldatei gibt %d Byte an" msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber die Kontrolldatei gibt %d Bytes an" -#: access/transam/xlog.c:4925 +#: access/transam/xlog.c:4175 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "»min_wal_size« muss mindestens zweimal so groß wie »wal_segment_size« sein" -#: access/transam/xlog.c:4929 +#: access/transam/xlog.c:4179 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "»max_wal_size« muss mindestens zweimal so groß wie »wal_segment_size« sein" -#: access/transam/xlog.c:5363 +#: access/transam/xlog.c:4611 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "konnte Bootstrap-Write-Ahead-Log-Datei nicht schreiben: %m" -#: access/transam/xlog.c:5371 +#: access/transam/xlog.c:4619 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "konnte Bootstrap-Write-Ahead-Log-Datei nicht fsyncen: %m" -#: access/transam/xlog.c:5377 +#: access/transam/xlog.c:4625 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "konnte Bootstrap-Write-Ahead-Log-Datei nicht schließen: %m" -#: access/transam/xlog.c:5438 +#: access/transam/xlog.c:4843 #, c-format -msgid "using recovery command file \"%s\" is not supported" -msgstr "Verwendung von Recovery-Befehlsdatei »%s« wird nicht unterstützt" +msgid "WAL was generated with wal_level=minimal, cannot continue recovering" +msgstr "WAL wurde mit wal_level=minimal erzeugt, Wiederherstellung kann nicht fortgesetzt werden" -#: access/transam/xlog.c:5503 +#: access/transam/xlog.c:4844 #, c-format -msgid "standby mode is not supported by single-user servers" -msgstr "Standby-Modus wird von Servern im Einzelbenutzermodus nicht unterstützt" +msgid "This happens if you temporarily set wal_level=minimal on the server." +msgstr "Das passiert, wenn auf dem Server vorübergehend wal_level=minimal gesetzt wurde." -#: access/transam/xlog.c:5520 +#: access/transam/xlog.c:4845 #, c-format -msgid "specified neither primary_conninfo nor restore_command" -msgstr "weder primary_conninfo noch restore_command angegeben" +msgid "Use a backup taken after setting wal_level to higher than minimal." +msgstr "Verwenden Sie ein Backup, das durchgeführt wurde, nachdem wal_level auf höher als minimal gesetzt wurde." -#: access/transam/xlog.c:5521 +#: access/transam/xlog.c:4909 #, c-format -msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." -msgstr "Der Datenbankserver prüft das Unterverzeichnis pg_wal regelmäßig auf dort abgelegte Dateien." +msgid "control file contains invalid checkpoint location" +msgstr "Kontrolldatei enthält ungültige Checkpoint-Position" -#: access/transam/xlog.c:5529 +#: access/transam/xlog.c:4920 #, c-format -msgid "must specify restore_command when standby mode is not enabled" -msgstr "restore_command muss angegeben werden, wenn der Standby-Modus nicht eingeschaltet ist" +msgid "database system was shut down at %s" +msgstr "Datenbanksystem wurde am %s heruntergefahren" -#: access/transam/xlog.c:5567 +#: access/transam/xlog.c:4926 #, c-format -msgid "recovery target timeline %u does not exist" -msgstr "recovery_target_timeline %u existiert nicht" +msgid "database system was shut down in recovery at %s" +msgstr "Datenbanksystem wurde während der Wiederherstellung am %s heruntergefahren" -#: access/transam/xlog.c:5689 +#: access/transam/xlog.c:4932 #, c-format -msgid "archive recovery complete" -msgstr "Wiederherstellung aus Archiv abgeschlossen" +msgid "database system shutdown was interrupted; last known up at %s" +msgstr "Datenbanksystem wurde beim Herunterfahren unterbrochen; letzte bekannte Aktion am %s" -#: access/transam/xlog.c:5755 access/transam/xlog.c:6026 +#: access/transam/xlog.c:4938 #, c-format -msgid "recovery stopping after reaching consistency" -msgstr "Wiederherstellung beendet nachdem Konsistenz erreicht wurde" +msgid "database system was interrupted while in recovery at %s" +msgstr "Datenbanksystem wurde während der Wiederherstellung am %s unterbrochen" -#: access/transam/xlog.c:5776 +#: access/transam/xlog.c:4940 #, c-format -msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" -msgstr "Wiederherstellung beendet vor WAL-Position (LSN) »%X/%X«" +msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." +msgstr "Das bedeutet wahrscheinlich, dass einige Daten verfälscht sind und Sie die letzte Datensicherung zur Wiederherstellung verwenden müssen." -#: access/transam/xlog.c:5861 +#: access/transam/xlog.c:4946 #, c-format -msgid "recovery stopping before commit of transaction %u, time %s" -msgstr "Wiederherstellung beendet vor Commit der Transaktion %u, Zeit %s" +msgid "database system was interrupted while in recovery at log time %s" +msgstr "Datenbanksystem wurde während der Wiederherstellung bei Logzeit %s unterbrochen" -#: access/transam/xlog.c:5868 +#: access/transam/xlog.c:4948 #, c-format -msgid "recovery stopping before abort of transaction %u, time %s" -msgstr "Wiederherstellung beendet vor Abbruch der Transaktion %u, Zeit %s" +msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." +msgstr "Wenn dies mehr als einmal vorgekommen ist, dann sind einige Daten möglicherweise verfälscht und Sie müssen ein früheres Wiederherstellungsziel wählen." -#: access/transam/xlog.c:5921 +#: access/transam/xlog.c:4954 #, c-format -msgid "recovery stopping at restore point \"%s\", time %s" -msgstr "Wiederherstellung beendet bei Restore-Punkt »%s«, Zeit %s" +msgid "database system was interrupted; last known up at %s" +msgstr "Datenbanksystem wurde unterbrochen; letzte bekannte Aktion am %s" -#: access/transam/xlog.c:5939 +#: access/transam/xlog.c:4960 #, c-format -msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" -msgstr "Wiederherstellung beendet nach WAL-Position (LSN) »%X/%X«" +msgid "control file contains invalid database cluster state" +msgstr "Kontrolldatei enthält ungültigen Datenbankclusterstatus" -#: access/transam/xlog.c:6006 +#: access/transam/xlog.c:5338 #, c-format -msgid "recovery stopping after commit of transaction %u, time %s" -msgstr "Wiederherstellung beendet nach Commit der Transaktion %u, Zeit %s" +msgid "WAL ends before end of online backup" +msgstr "WAL endet vor dem Ende der Online-Sicherung" -#: access/transam/xlog.c:6014 +#: access/transam/xlog.c:5339 #, c-format -msgid "recovery stopping after abort of transaction %u, time %s" -msgstr "Wiederherstellung beendet nach Abbruch der Transaktion %u, Zeit %s" +msgid "All WAL generated while online backup was taken must be available at recovery." +msgstr "Der komplette WAL, der während der Online-Sicherung erzeugt wurde, muss bei der Wiederherstellung verfügbar sein." -#: access/transam/xlog.c:6059 +#: access/transam/xlog.c:5342 #, c-format -msgid "pausing at the end of recovery" -msgstr "pausiere am Ende der Wiederherstellung" +msgid "WAL ends before consistent recovery point" +msgstr "WAL endet vor einem konsistenten Wiederherstellungspunkt" -#: access/transam/xlog.c:6060 +#: access/transam/xlog.c:5390 #, c-format -msgid "Execute pg_wal_replay_resume() to promote." -msgstr "Führen Sie pg_wal_replay_resume() aus, um den Server zum Primärserver zu befördern." +msgid "selected new timeline ID: %u" +msgstr "gewählte neue Zeitleisten-ID: %u" -#: access/transam/xlog.c:6063 access/transam/xlog.c:6336 +#: access/transam/xlog.c:5423 #, c-format -msgid "recovery has paused" -msgstr "Wiederherstellung wurde pausiert" +msgid "archive recovery complete" +msgstr "Wiederherstellung aus Archiv abgeschlossen" -#: access/transam/xlog.c:6064 +#: access/transam/xlog.c:6017 #, c-format -msgid "Execute pg_wal_replay_resume() to continue." -msgstr "Führen Sie pg_wal_replay_resume() aus um fortzusetzen." +msgid "shutting down" +msgstr "fahre herunter" -#: access/transam/xlog.c:6327 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6056 #, c-format -msgid "hot standby is not possible because of insufficient parameter settings" -msgstr "Hot Standby ist nicht möglich wegen unzureichender Parametereinstellungen" +msgid "restartpoint starting:%s%s%s%s%s%s%s%s" +msgstr "Restart-Punkt beginnt:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6328 access/transam/xlog.c:6355 -#: access/transam/xlog.c:6385 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6068 #, c-format -msgid "%s = %d is a lower setting than on the primary server, where its value was %d." -msgstr "%s = %d ist eine niedrigere Einstellung als auf dem Primärserver, wo der Wert %d war." +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "Checkpoint beginnt:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6337 +#: access/transam/xlog.c:6128 #, c-format -msgid "If recovery is unpaused, the server will shut down." -msgstr "Wenn die Wiederherstellungspause beendet wird, wird der Server herunterfahren." +msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" +msgstr "Restart-Punkt komplett: %d Puffer geschrieben (%.1f%%); %d WAL-Datei(en) hinzugefügt, %d entfernt, %d wiederverwendet; Schreiben=%ld,%03d s, Sync=%ld,%03d s, gesamt=%ld,%03d s; sync. Dateien=%d, längste=%ld,%03d s, Durchschnitt=%ld.%03d s; Entfernung=%d kB, Schätzung=%d kB" -#: access/transam/xlog.c:6338 +#: access/transam/xlog.c:6148 #, c-format -msgid "You can then restart the server after making the necessary configuration changes." -msgstr "Sie können den Server dann neu starten, nachdem die nötigen Konfigurationsänderungen getätigt worden sind." +msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" +msgstr "Checkpoint komplett: %d Puffer geschrieben (%.1f%%); %d WAL-Datei(en) hinzugefügt, %d entfernt, %d wiederverwendet; Schreiben=%ld,%03d s, Sync=%ld,%03d s, gesamt=%ld,%03d s; sync. Dateien=%d, längste=%ld,%03d s, Durchschnitt=%ld.%03d s; Entfernung=%d kB, Schätzung=%d kB" -#: access/transam/xlog.c:6349 +#: access/transam/xlog.c:6583 #, c-format -msgid "promotion is not possible because of insufficient parameter settings" -msgstr "Beförderung ist nicht möglich wegen unzureichender Parametereinstellungen" +msgid "concurrent write-ahead log activity while database system is shutting down" +msgstr "gleichzeitige Write-Ahead-Log-Aktivität während das Datenbanksystem herunterfährt" -#: access/transam/xlog.c:6359 +#: access/transam/xlog.c:7140 #, c-format -msgid "Restart the server after making the necessary configuration changes." -msgstr "Starten Sie den Server neu, nachdem die nötigen Konfigurationsänderungen getätigt worden sind." +msgid "recovery restart point at %X/%X" +msgstr "Recovery-Restart-Punkt bei %X/%X" -#: access/transam/xlog.c:6383 +#: access/transam/xlog.c:7142 #, c-format -msgid "recovery aborted because of insufficient parameter settings" -msgstr "Wiederherstellung abgebrochen wegen unzureichender Parametereinstellungen" +msgid "Last completed transaction was at log time %s." +msgstr "Die letzte vollständige Transaktion war bei Logzeit %s." -#: access/transam/xlog.c:6389 +#: access/transam/xlog.c:7389 #, c-format -msgid "You can restart the server after making the necessary configuration changes." -msgstr "Sie können den Server neu starten, nachdem die nötigen Konfigurationsänderungen getätigt worden sind." +msgid "restore point \"%s\" created at %X/%X" +msgstr "Restore-Punkt »%s« erzeugt bei %X/%X" -#: access/transam/xlog.c:6411 +#: access/transam/xlog.c:7596 #, c-format -msgid "WAL was generated with wal_level=minimal, cannot continue recovering" -msgstr "WAL wurde mit wal_level=minimal erzeugt, Wiederherstellung kann nicht fortgesetzt werden" +msgid "online backup was canceled, recovery cannot continue" +msgstr "Online-Sicherung wurde storniert, Wiederherstellung kann nicht fortgesetzt werden" -#: access/transam/xlog.c:6412 +#: access/transam/xlog.c:7653 #, c-format -msgid "This happens if you temporarily set wal_level=minimal on the server." -msgstr "Das passiert, wenn auf dem Server vorübergehend wal_level=minimal gesetzt wurde." +msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" +msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im Shutdown-Checkpoint-Datensatz" -#: access/transam/xlog.c:6413 +#: access/transam/xlog.c:7711 #, c-format -msgid "Use a backup taken after setting wal_level to higher than minimal." -msgstr "Verwenden Sie ein Backup, das durchgeführt wurde, nachdem wal_level auf höher als minimal gesetzt wurde." +msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" +msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im Online-Checkpoint-Datensatz" -#: access/transam/xlog.c:6482 -#, c-format -msgid "control file contains invalid checkpoint location" -msgstr "Kontrolldatei enthält ungültige Checkpoint-Position" +#: access/transam/xlog.c:7740 +#, fuzzy, c-format +#| msgid "unexpected timeline ID %u (should be %u) in checkpoint record" +msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" +msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im Checkpoint-Datensatz" -#: access/transam/xlog.c:6493 +#: access/transam/xlog.c:7998 #, c-format -msgid "database system was shut down at %s" -msgstr "Datenbanksystem wurde am %s heruntergefahren" +msgid "could not fsync write-through file \"%s\": %m" +msgstr "konnte Write-Through-Logdatei »%s« nicht fsyncen: %m" -#: access/transam/xlog.c:6499 +#: access/transam/xlog.c:8004 #, c-format -msgid "database system was shut down in recovery at %s" -msgstr "Datenbanksystem wurde während der Wiederherstellung am %s heruntergefahren" +msgid "could not fdatasync file \"%s\": %m" +msgstr "konnte Datei »%s« nicht fdatasyncen: %m" -#: access/transam/xlog.c:6505 +#: access/transam/xlog.c:8099 access/transam/xlog.c:8471 #, c-format -msgid "database system shutdown was interrupted; last known up at %s" -msgstr "Datenbanksystem wurde beim Herunterfahren unterbrochen; letzte bekannte Aktion am %s" +msgid "WAL level not sufficient for making an online backup" +msgstr "WAL-Level nicht ausreichend, um Online-Sicherung durchzuführen" -#: access/transam/xlog.c:6511 +#: access/transam/xlog.c:8100 access/transam/xlog.c:8472 +#: access/transam/xlogfuncs.c:199 #, c-format -msgid "database system was interrupted while in recovery at %s" -msgstr "Datenbanksystem wurde während der Wiederherstellung am %s unterbrochen" +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "wal_level muss beim Serverstart auf »replica« oder »logical« gesetzt werden." -#: access/transam/xlog.c:6513 +#: access/transam/xlog.c:8105 #, c-format -msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." -msgstr "Das bedeutet wahrscheinlich, dass einige Daten verfälscht sind und Sie die letzte Datensicherung zur Wiederherstellung verwenden müssen." +msgid "backup label too long (max %d bytes)" +msgstr "Backup-Label zu lang (maximal %d Bytes)" -#: access/transam/xlog.c:6519 +#: access/transam/xlog.c:8221 #, c-format -msgid "database system was interrupted while in recovery at log time %s" -msgstr "Datenbanksystem wurde während der Wiederherstellung bei Logzeit %s unterbrochen" +msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" +msgstr "mit full_page_writes=off erzeugtes WAL wurde seit dem letzten Restart-Punkt zurückgespielt" -#: access/transam/xlog.c:6521 +#: access/transam/xlog.c:8223 access/transam/xlog.c:8584 #, c-format -msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." -msgstr "Wenn dies mehr als einmal vorgekommen ist, dann sind einige Daten möglicherweise verfälscht und Sie müssen ein früheres Wiederherstellungsziel wählen." +msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." +msgstr "Das bedeutet, dass die aktuelle Datensicherung auf dem Standby-Server verfälscht ist und nicht verwendet werden sollte. Schalten Sie auf dem Primärserver full_page_writes ein, führen Sie dort CHECKPOINT aus und versuchen Sie dann die Online-Sicherung erneut." -#: access/transam/xlog.c:6527 +#: access/transam/xlog.c:8308 replication/basebackup.c:1338 +#: utils/adt/misc.c:347 #, c-format -msgid "database system was interrupted; last known up at %s" -msgstr "Datenbanksystem wurde unterbrochen; letzte bekannte Aktion am %s" +msgid "symbolic link \"%s\" target is too long" +msgstr "Ziel für symbolische Verknüpfung »%s« ist zu lang" -#: access/transam/xlog.c:6533 +#: access/transam/xlog.c:8358 commands/tablespace.c:421 +#: commands/tablespace.c:603 replication/basebackup.c:1353 utils/adt/misc.c:355 #, c-format -msgid "control file contains invalid database cluster state" -msgstr "Kontrolldatei enthält ungültigen Datenbankclusterstatus" +msgid "tablespaces are not supported on this platform" +msgstr "Tablespaces werden auf dieser Plattform nicht unterstützt" -#: access/transam/xlog.c:6590 +#: access/transam/xlog.c:8517 access/transam/xlog.c:8530 +#: access/transam/xlogrecovery.c:1191 access/transam/xlogrecovery.c:1198 +#: access/transam/xlogrecovery.c:1257 access/transam/xlogrecovery.c:1337 +#: access/transam/xlogrecovery.c:1361 #, c-format -msgid "entering standby mode" -msgstr "Standby-Modus eingeschaltet" +msgid "invalid data in file \"%s\"" +msgstr "ungültige Daten in Datei »%s«" -#: access/transam/xlog.c:6593 +#: access/transam/xlog.c:8534 replication/basebackup.c:1193 #, c-format -msgid "starting point-in-time recovery to XID %u" -msgstr "starte Point-in-Time-Recovery bis XID %u" +msgid "the standby was promoted during online backup" +msgstr "der Standby-Server wurde während der Online-Sicherung zum Primärserver befördert" -#: access/transam/xlog.c:6597 +#: access/transam/xlog.c:8535 replication/basebackup.c:1194 #, c-format -msgid "starting point-in-time recovery to %s" -msgstr "starte Point-in-Time-Recovery bis %s" +msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." +msgstr "Das bedeutet, dass die aktuelle Online-Sicherung verfälscht ist und nicht verwendet werden sollte. Versuchen Sie, eine neue Online-Sicherung durchzuführen." -#: access/transam/xlog.c:6601 +#: access/transam/xlog.c:8582 #, c-format -msgid "starting point-in-time recovery to \"%s\"" -msgstr "starte Point-in-Time-Recovery bis »%s«" +msgid "WAL generated with full_page_writes=off was replayed during online backup" +msgstr "mit full_page_writes=off erzeugtes WAL wurde während der Online-Sicherung zurückgespielt" -#: access/transam/xlog.c:6605 +#: access/transam/xlog.c:8707 #, c-format -msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" -msgstr "starte Point-in-Time-Recovery bis WAL-Position (LSN) »%X/%X«" +msgid "base backup done, waiting for required WAL segments to be archived" +msgstr "Basissicherung beendet, warte bis die benötigten WAL-Segmente archiviert sind" -#: access/transam/xlog.c:6609 +#: access/transam/xlog.c:8721 #, c-format -msgid "starting point-in-time recovery to earliest consistent point" -msgstr "starte Point-in-Time-Recovery bis zum frühesten konsistenten Punkt" +msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" +msgstr "warte immer noch, bis alle benötigten WAL-Segmente archiviert sind (%d Sekunden abgelaufen)" -#: access/transam/xlog.c:6612 +#: access/transam/xlog.c:8723 #, c-format -msgid "starting archive recovery" -msgstr "starte Wiederherstellung aus Archiv" +msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." +msgstr "Prüfen Sie, ob das archive_command korrekt ausgeführt wird. Dieser Sicherungsvorgang kann gefahrlos abgebrochen werden, aber die Datenbanksicherung wird ohne die fehlenden WAL-Segmente nicht benutzbar sein." -#: access/transam/xlog.c:6686 +#: access/transam/xlog.c:8730 #, c-format -msgid "could not find redo location referenced by checkpoint record" -msgstr "konnte die vom Checkpoint-Datensatz referenzierte Redo-Position nicht finden" +msgid "all required WAL segments have been archived" +msgstr "alle benötigten WAL-Segmente wurden archiviert" -#: access/transam/xlog.c:6687 access/transam/xlog.c:6697 +#: access/transam/xlog.c:8734 #, c-format -msgid "" -"If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" -"If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" -"Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup." -msgstr "" -"Wenn Sie gerade ein Backup wiederherstellen, dann erzeugen Sie »%s/recovery.signal« und setzen Sie die notwendigen Recovery-Optionen.\n" -"Wenn Sie gerade kein Backup wiederherstellen, dann versuchen Sie, die Datei »%s/backup_label« zu entfernen.\n" -"Vorsicht: Wenn ein Backup wiederhergestellt wird und »%s/backup_label« gelöscht wird, dann wird das den Cluster verfälschen." +msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" +msgstr "WAL-Archivierung ist nicht eingeschaltet; Sie müssen dafür sorgen, dass alle benötigten WAL-Segmente auf andere Art kopiert werden, um die Sicherung abzuschließen" -#: access/transam/xlog.c:6696 +#: access/transam/xlog.c:8781 #, c-format -msgid "could not locate required checkpoint record" -msgstr "konnte den nötigen Checkpoint-Datensatz nicht finden" +msgid "aborting backup due to backend exiting before pg_backup_stop was called" +msgstr "Backup wird abgebrochen, weil Backend-Prozess beendete, bevor pg_backup_stop aufgerufen wurde" -#: access/transam/xlog.c:6725 commands/tablespace.c:666 +#: access/transam/xlogarchive.c:208 #, c-format -msgid "could not create symbolic link \"%s\": %m" -msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m" +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "Archivdatei »%s« hat falsche Größe: %lld statt %lld" -#: access/transam/xlog.c:6757 access/transam/xlog.c:6763 +#: access/transam/xlogarchive.c:217 #, c-format -msgid "ignoring file \"%s\" because no file \"%s\" exists" -msgstr "ignoriere Datei »%s«, weil keine Datei »%s« existiert" +msgid "restored log file \"%s\" from archive" +msgstr "Logdatei »%s« aus Archiv wiederhergestellt" -#: access/transam/xlog.c:6759 access/transam/xlog.c:12060 +#: access/transam/xlogarchive.c:231 #, c-format -msgid "File \"%s\" was renamed to \"%s\"." -msgstr "Datei »%s« wurde in »%s« umbenannt." +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "restore_command endete mit Statuscode null, aber stat() schlug fehlt." -#: access/transam/xlog.c:6765 +#: access/transam/xlogarchive.c:263 #, c-format -msgid "Could not rename file \"%s\" to \"%s\": %m." -msgstr "Konnte Datei »%s« nicht in »%s« umbenennen: %m." +msgid "could not restore file \"%s\" from archive: %s" +msgstr "konnte Datei »%s« nicht aus Archiv wiederherstellen: %s" -#: access/transam/xlog.c:6816 +#. translator: First %s represents a postgresql.conf parameter name like +#. "recovery_end_command", the 2nd is the value of that parameter, the +#. third an already translated error message. +#: access/transam/xlogarchive.c:376 #, c-format -msgid "could not locate a valid checkpoint record" -msgstr "konnte keinen gültigen Checkpoint-Datensatz finden" +msgid "%s \"%s\": %s" +msgstr "%s »%s«: %s" -#: access/transam/xlog.c:6854 +#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:566 #, c-format -msgid "requested timeline %u is not a child of this server's history" -msgstr "angeforderte Zeitleiste %u ist kein Kind der History dieses Servers" +msgid "could not create archive status file \"%s\": %m" +msgstr "konnte Archivstatusdatei »%s« nicht erstellen: %m" -#: access/transam/xlog.c:6856 +#: access/transam/xlogarchive.c:494 access/transam/xlogarchive.c:574 #, c-format -msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." -msgstr "Neuester Checkpoint ist bei %X/%X auf Zeitleiste %u, aber in der History der angeforderten Zeitleiste zweigte der Server von dieser Zeitleiste bei %X/%X ab." +msgid "could not write archive status file \"%s\": %m" +msgstr "konnte Archivstatusdatei »%s« nicht schreiben: %m" -#: access/transam/xlog.c:6870 +#: access/transam/xlogfuncs.c:74 #, c-format -msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" -msgstr "angeforderte Zeitleiste %u enthält nicht den minimalen Wiederherstellungspunkt %X/%X auf Zeitleiste %u" +msgid "a backup is already in progress in this session" +msgstr "ein Backup läuft bereits in dieser Sitzung" -#: access/transam/xlog.c:6900 -#, c-format -msgid "invalid next transaction ID" -msgstr "ungültige nächste Transaktions-ID" +#: access/transam/xlogfuncs.c:126 +#, fuzzy, c-format +#| msgid "a backup is not in progress" +msgid "backup is not in progress" +msgstr "es läuft kein Backup" -#: access/transam/xlog.c:7000 -#, c-format -msgid "invalid redo in checkpoint record" -msgstr "ungültiges Redo im Checkpoint-Datensatz" +#: access/transam/xlogfuncs.c:127 +#, fuzzy, c-format +#| msgid "Did you mean to use pg_stop_backup('f')?" +msgid "Did you call pg_backup_start()?" +msgstr "Meinten Sie pg_stop_backup('f')?" -#: access/transam/xlog.c:7011 +#: access/transam/xlogfuncs.c:166 access/transam/xlogfuncs.c:193 +#: access/transam/xlogfuncs.c:232 access/transam/xlogfuncs.c:253 +#: access/transam/xlogfuncs.c:274 #, c-format -msgid "invalid redo record in shutdown checkpoint" -msgstr "ungültiger Redo-Datensatz im Shutdown-Checkpoint" +msgid "WAL control functions cannot be executed during recovery." +msgstr "Während der Wiederherstellung können keine WAL-Kontrollfunktionen ausgeführt werden." -#: access/transam/xlog.c:7045 +#: access/transam/xlogfuncs.c:198 #, c-format -msgid "database system was not properly shut down; automatic recovery in progress" -msgstr "Datenbanksystem wurde nicht richtig heruntergefahren; automatische Wiederherstellung läuft" +msgid "WAL level not sufficient for creating a restore point" +msgstr "WAL-Level nicht ausreichend, um Restore-Punkt anzulegen" -#: access/transam/xlog.c:7049 +#: access/transam/xlogfuncs.c:206 #, c-format -msgid "crash recovery starts in timeline %u and has target timeline %u" -msgstr "Wiederherstellung nach Absturz beginnt in Zeitleiste %u und hat Zielzeitleiste %u" +msgid "value too long for restore point (maximum %d characters)" +msgstr "Wert zu lang für Restore-Punkt (maximal %d Zeichen)" -#: access/transam/xlog.c:7096 +#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 #, c-format -msgid "backup_label contains data inconsistent with control file" -msgstr "Daten in backup_label stimmen nicht mit Kontrolldatei überein" +msgid "%s cannot be executed during recovery." +msgstr "%s kann nicht während der Wiederherstellung ausgeführt werden." -#: access/transam/xlog.c:7097 +#: access/transam/xlogfuncs.c:424 access/transam/xlogfuncs.c:454 +#: access/transam/xlogfuncs.c:478 access/transam/xlogfuncs.c:501 +#: access/transam/xlogfuncs.c:581 #, c-format -msgid "This means that the backup is corrupted and you will have to use another backup for recovery." -msgstr "Das bedeutet, dass die Datensicherung verfälscht ist und Sie eine andere Datensicherung zur Wiederherstellung verwenden werden müssen." +msgid "recovery is not in progress" +msgstr "Wiederherstellung läuft nicht" -#: access/transam/xlog.c:7323 +#: access/transam/xlogfuncs.c:425 access/transam/xlogfuncs.c:455 +#: access/transam/xlogfuncs.c:479 access/transam/xlogfuncs.c:502 +#: access/transam/xlogfuncs.c:582 #, c-format -msgid "redo starts at %X/%X" -msgstr "Redo beginnt bei %X/%X" +msgid "Recovery control functions can only be executed during recovery." +msgstr "Wiederherstellungskontrollfunktionen können nur während der Wiederherstellung ausgeführt werden." -#: access/transam/xlog.c:7548 +#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 #, c-format -msgid "requested recovery stop point is before consistent recovery point" -msgstr "angeforderter Recovery-Endpunkt ist vor konsistentem Recovery-Punkt" - -#: access/transam/xlog.c:7586 -#, fuzzy, c-format -#| msgid "redo done at %X/%X" -msgid "redo done at %X/%X system usage: %s" -msgstr "Redo fertig bei %X/%X" +msgid "standby promotion is ongoing" +msgstr "Beförderung des Standby läuft" -#: access/transam/xlog.c:7592 +#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 #, c-format -msgid "last completed transaction was at log time %s" -msgstr "letzte vollständige Transaktion war bei Logzeit %s" +msgid "%s cannot be executed after promotion is triggered." +msgstr "%s kann nicht ausgeführt werden, nachdem eine Beförderung angestoßen wurde." -#: access/transam/xlog.c:7601 +#: access/transam/xlogfuncs.c:587 #, c-format -msgid "redo is not required" -msgstr "Redo nicht nötig" +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "»wait_seconds« darf nicht negativ oder null sein" -#: access/transam/xlog.c:7613 +#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:252 #, c-format -msgid "recovery ended before configured recovery target was reached" -msgstr "Wiederherstellung endete bevor das konfigurierte Wiederherstellungsziel erreicht wurde" +msgid "failed to send signal to postmaster: %m" +msgstr "konnte Signal nicht an Postmaster senden: %m" -#: access/transam/xlog.c:7692 access/transam/xlog.c:7696 +#: access/transam/xlogfuncs.c:643 #, c-format -msgid "WAL ends before end of online backup" -msgstr "WAL endet vor dem Ende der Online-Sicherung" +msgid "server did not promote within %d second" +msgid_plural "server did not promote within %d seconds" +msgstr[0] "Befördern des Servers wurde nicht innerhalb von %d Sekunde abgeschlossen" +msgstr[1] "Befördern des Servers wurde nicht innerhalb von %d Sekunden abgeschlossen" -#: access/transam/xlog.c:7693 -#, c-format -msgid "All WAL generated while online backup was taken must be available at recovery." -msgstr "Der komplette WAL, der während der Online-Sicherung erzeugt wurde, muss bei der Wiederherstellung verfügbar sein." +#: access/transam/xlogprefetcher.c:1072 +#, fuzzy, c-format +#| msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." +msgid "recovery_prefetch not supported on platforms that lack posix_fadvise()." +msgstr "effective_io_concurrency muss auf Plattformen ohne posix_fadvise() auf 0 gesetzt sein." -#: access/transam/xlog.c:7697 +#: access/transam/xlogreader.c:621 #, c-format -msgid "Online backup started with pg_start_backup() must be ended with pg_stop_backup(), and all WAL up to that point must be available at recovery." -msgstr "Die mit pg_start_backup() begonnene Online-Sicherung muss mit pg_stop_backup() beendet werden und der ganze WAL bis zu diesem Punkt muss bei der Wiederherstellung verfügbar sein." +msgid "invalid record offset at %X/%X" +msgstr "ungültiger Datensatz-Offset bei %X/%X" -#: access/transam/xlog.c:7700 +#: access/transam/xlogreader.c:629 #, c-format -msgid "WAL ends before consistent recovery point" -msgstr "WAL endet vor einem konsistenten Wiederherstellungspunkt" +msgid "contrecord is requested by %X/%X" +msgstr "Contrecord angefordert von %X/%X" -#: access/transam/xlog.c:7735 +#: access/transam/xlogreader.c:670 access/transam/xlogreader.c:1102 #, c-format -msgid "selected new timeline ID: %u" -msgstr "gewählte neue Zeitleisten-ID: %u" +msgid "invalid record length at %X/%X: wanted %u, got %u" +msgstr "ungültige Datensatzlänge bei %X/%X: %u erwartet, %u erhalten" -#: access/transam/xlog.c:8178 +#: access/transam/xlogreader.c:699 #, c-format -msgid "consistent recovery state reached at %X/%X" -msgstr "konsistenter Wiederherstellungszustand erreicht bei %X/%X" +msgid "out of memory while trying to decode a record of length %u" +msgstr "Speicher aufgebraucht beim Versuch einen Datensatz mit Länge %u zu dekodieren" -#: access/transam/xlog.c:8387 +#: access/transam/xlogreader.c:721 #, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "ungültige primäre Checkpoint-Verknüpfung in Kontrolldatei" +msgid "record length %u at %X/%X too long" +msgstr "Datensatzlänge %u bei %X/%X ist zu lang" -#: access/transam/xlog.c:8391 +#: access/transam/xlogreader.c:770 #, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "ungültige Checkpoint-Verknüpfung in backup_label-Datei" +msgid "there is no contrecord flag at %X/%X" +msgstr "keine Contrecord-Flag bei %X/%X" -#: access/transam/xlog.c:8409 +#: access/transam/xlogreader.c:783 #, c-format -msgid "invalid primary checkpoint record" -msgstr "ungültiger primärer Checkpoint-Datensatz" +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "ungültige Contrecord-Länge %u (erwartet %lld) bei %X/%X" -#: access/transam/xlog.c:8413 +#: access/transam/xlogreader.c:1110 #, c-format -msgid "invalid checkpoint record" -msgstr "ungültiger Checkpoint-Datensatz" +msgid "invalid resource manager ID %u at %X/%X" +msgstr "ungültige Resource-Manager-ID %u bei %X/%X" -#: access/transam/xlog.c:8424 +#: access/transam/xlogreader.c:1123 access/transam/xlogreader.c:1139 #, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "ungültige Resource-Manager-ID im primären Checkpoint-Datensatz" +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "Datensatz mit falschem Prev-Link %X/%X bei %X/%X" -#: access/transam/xlog.c:8428 +#: access/transam/xlogreader.c:1175 #, c-format -msgid "invalid resource manager ID in checkpoint record" -msgstr "ungültige Resource-Manager-ID im Checkpoint-Datensatz" +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "ungültige Resource-Manager-Datenprüfsumme in Datensatz bei %X/%X" -#: access/transam/xlog.c:8441 +#: access/transam/xlogreader.c:1212 #, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "ungültige xl_info im primären Checkpoint-Datensatz" +msgid "invalid magic number %04X in log segment %s, offset %u" +msgstr "ungültige magische Zahl %04X in Logsegment %s, Offset %u" -#: access/transam/xlog.c:8445 +#: access/transam/xlogreader.c:1226 access/transam/xlogreader.c:1267 #, c-format -msgid "invalid xl_info in checkpoint record" -msgstr "ungültige xl_info im Checkpoint-Datensatz" +msgid "invalid info bits %04X in log segment %s, offset %u" +msgstr "ungültige Info-Bits %04X in Logsegment %s, Offset %u" -#: access/transam/xlog.c:8456 +#: access/transam/xlogreader.c:1241 #, c-format -msgid "invalid length of primary checkpoint record" -msgstr "ungültige Länge des primären Checkpoint-Datensatzes" +msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" +msgstr "WAL-Datei ist von einem anderen Datenbanksystem: Datenbanksystemidentifikator in WAL-Datei ist %llu, Datenbanksystemidentifikator in pg_control ist %llu" -#: access/transam/xlog.c:8460 +#: access/transam/xlogreader.c:1249 #, c-format -msgid "invalid length of checkpoint record" -msgstr "ungültige Länge des Checkpoint-Datensatzes" +msgid "WAL file is from different database system: incorrect segment size in page header" +msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche Segmentgröße im Seitenkopf" -#: access/transam/xlog.c:8641 +#: access/transam/xlogreader.c:1255 #, c-format -msgid "shutting down" -msgstr "fahre herunter" +msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" +msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche XLOG_BLCKSZ im Seitenkopf" -#. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8680 +#: access/transam/xlogreader.c:1286 #, c-format -msgid "restartpoint starting:%s%s%s%s%s%s%s%s" -msgstr "Restart-Punkt beginnt:%s%s%s%s%s%s%s%s" +msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" +msgstr "unerwartete Pageaddr %X/%X in Logsegment %s, Offset %u" -#. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8692 +#: access/transam/xlogreader.c:1311 #, c-format -msgid "checkpoint starting:%s%s%s%s%s%s%s%s" -msgstr "Checkpoint beginnt:%s%s%s%s%s%s%s%s" +msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" +msgstr "Zeitleisten-ID %u außer der Reihe (nach %u) in Logsegment %s, Offset %u" -#: access/transam/xlog.c:8752 +#: access/transam/xlogreader.c:1706 #, c-format -msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" -msgstr "" +msgid "out-of-order block_id %u at %X/%X" +msgstr "block_id %u außer der Reihe bei %X/%X" -#: access/transam/xlog.c:8772 +#: access/transam/xlogreader.c:1730 #, c-format -msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" -msgstr "" +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATA gesetzt, aber keine Daten enthalten bei %X/%X" -#: access/transam/xlog.c:9205 +#: access/transam/xlogreader.c:1737 #, c-format -msgid "concurrent write-ahead log activity while database system is shutting down" -msgstr "gleichzeitige Write-Ahead-Log-Aktivität während das Datenbanksystem herunterfährt" +msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" +msgstr "BKPBLOCK_HAS_DATA nicht gesetzt, aber Datenlänge ist %u bei %X/%X" -#: access/transam/xlog.c:9661 +#: access/transam/xlogreader.c:1773 #, c-format -msgid "recovery restart point at %X/%X" -msgstr "Recovery-Restart-Punkt bei %X/%X" +msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLE gesetzt, aber Loch Offset %u Länge %u Block-Abbild-Länge %u bei %X/%X" -#: access/transam/xlog.c:9663 +#: access/transam/xlogreader.c:1789 #, c-format -msgid "Last completed transaction was at log time %s." -msgstr "Die letzte vollständige Transaktion war bei Logzeit %s." +msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLE nicht gesetzt, aber Loch Offset %u Länge %u bei %X/%X" -#: access/transam/xlog.c:9903 +#: access/transam/xlogreader.c:1803 #, c-format -msgid "restore point \"%s\" created at %X/%X" -msgstr "Restore-Punkt »%s« erzeugt bei %X/%X" +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge %u bei %X/%X" -#: access/transam/xlog.c:10048 +#: access/transam/xlogreader.c:1818 #, c-format -msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" -msgstr "unerwartete vorherige Zeitleisten-ID %u (aktuelle Zeitleisten-ID %u) im Checkpoint-Datensatz" +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "weder BKPIMAGE_HAS_HOLE noch BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge ist %u bei %X/%X" -#: access/transam/xlog.c:10057 +#: access/transam/xlogreader.c:1834 #, c-format -msgid "unexpected timeline ID %u (after %u) in checkpoint record" -msgstr "unerwartete Zeitleisten-ID %u (nach %u) im Checkpoint-Datensatz" +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "BKPBLOCK_SAME_REL gesetzt, aber keine vorangehende Relation bei %X/%X" -#: access/transam/xlog.c:10073 +#: access/transam/xlogreader.c:1846 #, c-format -msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" -msgstr "unerwartete Zeitleisten-ID %u in Checkpoint-Datensatz, bevor der minimale Wiederherstellungspunkt %X/%X auf Zeitleiste %u erreicht wurde" +msgid "invalid block_id %u at %X/%X" +msgstr "ungültige block_id %u bei %X/%X" -#: access/transam/xlog.c:10148 +#: access/transam/xlogreader.c:1913 #, c-format -msgid "online backup was canceled, recovery cannot continue" -msgstr "Online-Sicherung wurde storniert, Wiederherstellung kann nicht fortgesetzt werden" +msgid "record with invalid length at %X/%X" +msgstr "Datensatz mit ungültiger Länge bei %X/%X" -#: access/transam/xlog.c:10204 access/transam/xlog.c:10260 -#: access/transam/xlog.c:10283 +#: access/transam/xlogreader.c:1938 #, c-format -msgid "unexpected timeline ID %u (should be %u) in checkpoint record" -msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im Checkpoint-Datensatz" +msgid "failed to locate backup block with ID %d in WAL record" +msgstr "konnte Backup-Block mit ID %d nicht im WAL-Eintrag finden" -#: access/transam/xlog.c:10632 +#: access/transam/xlogreader.c:2044 access/transam/xlogreader.c:2061 #, c-format -msgid "could not fsync write-through file \"%s\": %m" -msgstr "konnte Write-Through-Logdatei »%s« nicht fsyncen: %m" +msgid "image at %X/%X compressed with %s not supported by build, block %d" +msgstr "Abbild bei %X/%X komprimiert mit %s nicht unterstützt von dieser Installation, Block %d" -#: access/transam/xlog.c:10638 +#: access/transam/xlogreader.c:2070 #, c-format -msgid "could not fdatasync file \"%s\": %m" -msgstr "konnte Datei »%s« nicht fdatasyncen: %m" +msgid "image at %X/%X compressed with unknown method, block %d" +msgstr "Abbild bei %X/%X, komprimiert mit unbekannter Methode, Block %d" -#: access/transam/xlog.c:10749 access/transam/xlog.c:11278 -#: access/transam/xlogfuncs.c:275 access/transam/xlogfuncs.c:302 -#: access/transam/xlogfuncs.c:341 access/transam/xlogfuncs.c:362 -#: access/transam/xlogfuncs.c:383 +#: access/transam/xlogreader.c:2078 #, c-format -msgid "WAL control functions cannot be executed during recovery." -msgstr "Während der Wiederherstellung können keine WAL-Kontrollfunktionen ausgeführt werden." +msgid "invalid compressed image at %X/%X, block %d" +msgstr "ungültiges komprimiertes Abbild bei %X/%X, Block %d" -#: access/transam/xlog.c:10758 access/transam/xlog.c:11287 +#: access/transam/xlogrecovery.c:525 #, c-format -msgid "WAL level not sufficient for making an online backup" -msgstr "WAL-Level nicht ausreichend, um Online-Sicherung durchzuführen" +msgid "entering standby mode" +msgstr "Standby-Modus eingeschaltet" -#: access/transam/xlog.c:10759 access/transam/xlog.c:11288 -#: access/transam/xlogfuncs.c:308 +#: access/transam/xlogrecovery.c:528 #, c-format -msgid "wal_level must be set to \"replica\" or \"logical\" at server start." -msgstr "wal_level muss beim Serverstart auf »replica« oder »logical« gesetzt werden." +msgid "starting point-in-time recovery to XID %u" +msgstr "starte Point-in-Time-Recovery bis XID %u" -#: access/transam/xlog.c:10764 +#: access/transam/xlogrecovery.c:532 #, c-format -msgid "backup label too long (max %d bytes)" -msgstr "Backup-Label zu lang (maximal %d Bytes)" +msgid "starting point-in-time recovery to %s" +msgstr "starte Point-in-Time-Recovery bis %s" -#: access/transam/xlog.c:10801 access/transam/xlog.c:11077 -#: access/transam/xlog.c:11115 +#: access/transam/xlogrecovery.c:536 #, c-format -msgid "a backup is already in progress" -msgstr "ein Backup läuft bereits" +msgid "starting point-in-time recovery to \"%s\"" +msgstr "starte Point-in-Time-Recovery bis »%s«" -#: access/transam/xlog.c:10802 +#: access/transam/xlogrecovery.c:540 #, c-format -msgid "Run pg_stop_backup() and try again." -msgstr "Führen Sie pg_stop_backup() aus und versuchen Sie es nochmal." +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgstr "starte Point-in-Time-Recovery bis WAL-Position (LSN) »%X/%X«" -#: access/transam/xlog.c:10898 +#: access/transam/xlogrecovery.c:544 #, c-format -msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" -msgstr "mit full_page_writes=off erzeugtes WAL wurde seit dem letzten Restart-Punkt zurückgespielt" +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "starte Point-in-Time-Recovery bis zum frühesten konsistenten Punkt" -#: access/transam/xlog.c:10900 access/transam/xlog.c:11483 +#: access/transam/xlogrecovery.c:547 #, c-format -msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." -msgstr "Das bedeutet, dass die aktuelle Datensicherung auf dem Standby-Server verfälscht ist und nicht verwendet werden sollte. Schalten Sie auf dem Primärserver full_page_writes ein, führen Sie dort CHECKPOINT aus und versuchen Sie dann die Online-Sicherung erneut." +msgid "starting archive recovery" +msgstr "starte Wiederherstellung aus Archiv" -#: access/transam/xlog.c:10976 replication/basebackup.c:1433 -#: utils/adt/misc.c:345 +#: access/transam/xlogrecovery.c:631 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "Ziel für symbolische Verknüpfung »%s« ist zu lang" +msgid "could not find redo location referenced by checkpoint record" +msgstr "konnte die vom Checkpoint-Datensatz referenzierte Redo-Position nicht finden" -#: access/transam/xlog.c:11026 commands/tablespace.c:402 -#: commands/tablespace.c:578 replication/basebackup.c:1448 utils/adt/misc.c:353 +#: access/transam/xlogrecovery.c:632 access/transam/xlogrecovery.c:642 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "Tablespaces werden auf dieser Plattform nicht unterstützt" +msgid "" +"If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" +"If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" +"Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup." +msgstr "" +"Wenn Sie gerade ein Backup wiederherstellen, dann erzeugen Sie »%s/recovery.signal« und setzen Sie die notwendigen Recovery-Optionen.\n" +"Wenn Sie gerade kein Backup wiederherstellen, dann versuchen Sie, die Datei »%s/backup_label« zu entfernen.\n" +"Vorsicht: Wenn ein Backup wiederhergestellt wird und »%s/backup_label« gelöscht wird, dann wird das den Cluster verfälschen." -#: access/transam/xlog.c:11078 access/transam/xlog.c:11116 +#: access/transam/xlogrecovery.c:641 #, c-format -msgid "If you're sure there is no backup in progress, remove file \"%s\" and try again." -msgstr "Wenn Sie sicher sind, dass noch kein Backup läuft, entfernen Sie die Datei »%s« und versuchen Sie es noch einmal." +msgid "could not locate required checkpoint record" +msgstr "konnte den nötigen Checkpoint-Datensatz nicht finden" -#: access/transam/xlog.c:11303 +#: access/transam/xlogrecovery.c:670 commands/tablespace.c:707 #, c-format -msgid "exclusive backup not in progress" -msgstr "es läuft kein exklusives Backup" +msgid "could not create symbolic link \"%s\": %m" +msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m" -#: access/transam/xlog.c:11330 +#: access/transam/xlogrecovery.c:702 access/transam/xlogrecovery.c:708 #, c-format -msgid "a backup is not in progress" -msgstr "es läuft kein Backup" +msgid "ignoring file \"%s\" because no file \"%s\" exists" +msgstr "ignoriere Datei »%s«, weil keine Datei »%s« existiert" -#: access/transam/xlog.c:11416 access/transam/xlog.c:11429 -#: access/transam/xlog.c:11818 access/transam/xlog.c:11824 -#: access/transam/xlog.c:11872 access/transam/xlog.c:11952 -#: access/transam/xlog.c:11976 access/transam/xlogfuncs.c:733 +#: access/transam/xlogrecovery.c:704 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "ungültige Daten in Datei »%s«" +msgid "File \"%s\" was renamed to \"%s\"." +msgstr "Datei »%s« wurde in »%s« umbenannt." -#: access/transam/xlog.c:11433 replication/basebackup.c:1281 +#: access/transam/xlogrecovery.c:710 #, c-format -msgid "the standby was promoted during online backup" -msgstr "der Standby-Server wurde während der Online-Sicherung zum Primärserver befördert" +msgid "Could not rename file \"%s\" to \"%s\": %m." +msgstr "Konnte Datei »%s« nicht in »%s« umbenennen: %m." -#: access/transam/xlog.c:11434 replication/basebackup.c:1282 +#: access/transam/xlogrecovery.c:764 #, c-format -msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." -msgstr "Das bedeutet, dass die aktuelle Online-Sicherung verfälscht ist und nicht verwendet werden sollte. Versuchen Sie, eine neue Online-Sicherung durchzuführen." +msgid "could not locate a valid checkpoint record" +msgstr "konnte keinen gültigen Checkpoint-Datensatz finden" -#: access/transam/xlog.c:11481 +#: access/transam/xlogrecovery.c:788 #, c-format -msgid "WAL generated with full_page_writes=off was replayed during online backup" -msgstr "mit full_page_writes=off erzeugtes WAL wurde während der Online-Sicherung zurückgespielt" +msgid "requested timeline %u is not a child of this server's history" +msgstr "angeforderte Zeitleiste %u ist kein Kind der History dieses Servers" -#: access/transam/xlog.c:11601 +#: access/transam/xlogrecovery.c:790 #, c-format -msgid "base backup done, waiting for required WAL segments to be archived" -msgstr "Basissicherung beendet, warte bis die benötigten WAL-Segmente archiviert sind" +msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." +msgstr "Neuester Checkpoint ist bei %X/%X auf Zeitleiste %u, aber in der History der angeforderten Zeitleiste zweigte der Server von dieser Zeitleiste bei %X/%X ab." + +#: access/transam/xlogrecovery.c:804 +#, c-format +msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" +msgstr "angeforderte Zeitleiste %u enthält nicht den minimalen Wiederherstellungspunkt %X/%X auf Zeitleiste %u" -#: access/transam/xlog.c:11613 +#: access/transam/xlogrecovery.c:832 #, c-format -msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" -msgstr "warte immer noch, bis alle benötigten WAL-Segmente archiviert sind (%d Sekunden abgelaufen)" +msgid "invalid next transaction ID" +msgstr "ungültige nächste Transaktions-ID" -#: access/transam/xlog.c:11615 +#: access/transam/xlogrecovery.c:837 #, c-format -msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." -msgstr "Prüfen Sie, ob das archive_command korrekt ausgeführt wird. Dieser Sicherungsvorgang kann gefahrlos abgebrochen werden, aber die Datenbanksicherung wird ohne die fehlenden WAL-Segmente nicht benutzbar sein." +msgid "invalid redo in checkpoint record" +msgstr "ungültiges Redo im Checkpoint-Datensatz" -#: access/transam/xlog.c:11622 +#: access/transam/xlogrecovery.c:848 #, c-format -msgid "all required WAL segments have been archived" -msgstr "alle benötigten WAL-Segmente wurden archiviert" +msgid "invalid redo record in shutdown checkpoint" +msgstr "ungültiger Redo-Datensatz im Shutdown-Checkpoint" -#: access/transam/xlog.c:11626 +#: access/transam/xlogrecovery.c:877 #, c-format -msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" -msgstr "WAL-Archivierung ist nicht eingeschaltet; Sie müssen dafür sorgen, dass alle benötigten WAL-Segmente auf andere Art kopiert werden, um die Sicherung abzuschließen" +msgid "database system was not properly shut down; automatic recovery in progress" +msgstr "Datenbanksystem wurde nicht richtig heruntergefahren; automatische Wiederherstellung läuft" -#: access/transam/xlog.c:11679 +#: access/transam/xlogrecovery.c:881 #, c-format -msgid "aborting backup due to backend exiting before pg_stop_backup was called" -msgstr "Backup wird abgebrochen, weil Backend-Prozess beendete, bevor pg_stop_backup aufgerufen wurde" +msgid "crash recovery starts in timeline %u and has target timeline %u" +msgstr "Wiederherstellung nach Absturz beginnt in Zeitleiste %u und hat Zielzeitleiste %u" -#: access/transam/xlog.c:11873 +#: access/transam/xlogrecovery.c:924 #, c-format -msgid "Timeline ID parsed is %u, but expected %u." -msgstr "Gelesene Zeitleisten-ID ist %u, aber %u wurde erwartet." +msgid "backup_label contains data inconsistent with control file" +msgstr "Daten in backup_label stimmen nicht mit Kontrolldatei überein" -#. translator: %s is a WAL record description -#: access/transam/xlog.c:12001 +#: access/transam/xlogrecovery.c:925 #, c-format -msgid "WAL redo at %X/%X for %s" -msgstr "WAL-Redo bei %X/%X für %s" +msgid "This means that the backup is corrupted and you will have to use another backup for recovery." +msgstr "Das bedeutet, dass die Datensicherung verfälscht ist und Sie eine andere Datensicherung zur Wiederherstellung verwenden werden müssen." -#: access/transam/xlog.c:12049 +#: access/transam/xlogrecovery.c:979 #, c-format -msgid "online backup mode was not canceled" -msgstr "Online-Sicherungsmodus wurde nicht storniert" +msgid "using recovery command file \"%s\" is not supported" +msgstr "Verwendung von Recovery-Befehlsdatei »%s« wird nicht unterstützt" -#: access/transam/xlog.c:12050 +#: access/transam/xlogrecovery.c:1044 #, c-format -msgid "File \"%s\" could not be renamed to \"%s\": %m." -msgstr "Konnte Datei »%s« nicht in »%s« umbenennen: %m." +msgid "standby mode is not supported by single-user servers" +msgstr "Standby-Modus wird von Servern im Einzelbenutzermodus nicht unterstützt" -#: access/transam/xlog.c:12059 access/transam/xlog.c:12071 -#: access/transam/xlog.c:12081 +#: access/transam/xlogrecovery.c:1061 #, c-format -msgid "online backup mode canceled" -msgstr "Online-Sicherungsmodus storniert" +msgid "specified neither primary_conninfo nor restore_command" +msgstr "weder primary_conninfo noch restore_command angegeben" -#: access/transam/xlog.c:12072 +#: access/transam/xlogrecovery.c:1062 #, c-format -msgid "Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." -msgstr "Dateien »%s« und »%s« wurden in »%s« und »%s« umbenannt." +msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." +msgstr "Der Datenbankserver prüft das Unterverzeichnis pg_wal regelmäßig auf dort abgelegte Dateien." -#: access/transam/xlog.c:12082 +#: access/transam/xlogrecovery.c:1070 #, c-format -msgid "File \"%s\" was renamed to \"%s\", but file \"%s\" could not be renamed to \"%s\": %m." -msgstr "Datei »%s« wurde in »%s« umbenannt, aber Datei »%s« konnte nicht in »%s« umbenannt werden: %m." +msgid "must specify restore_command when standby mode is not enabled" +msgstr "restore_command muss angegeben werden, wenn der Standby-Modus nicht eingeschaltet ist" -#: access/transam/xlog.c:12215 access/transam/xlogutils.c:967 +#: access/transam/xlogrecovery.c:1108 #, c-format -msgid "could not read from log segment %s, offset %u: %m" -msgstr "konnte nicht aus Logsegment %s, Position %u lesen: %m" +msgid "recovery target timeline %u does not exist" +msgstr "recovery_target_timeline %u existiert nicht" -#: access/transam/xlog.c:12221 access/transam/xlogutils.c:974 +#: access/transam/xlogrecovery.c:1258 #, c-format -msgid "could not read from log segment %s, offset %u: read %d of %zu" -msgstr "konnte nicht aus Logsegment %s bei Position %u lesen: %d von %zu gelesen" +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "Gelesene Zeitleisten-ID ist %u, aber %u wurde erwartet." -#: access/transam/xlog.c:12758 +#: access/transam/xlogrecovery.c:1640 #, c-format -msgid "WAL receiver process shutdown requested" -msgstr "Herunterfahren des WAL-Receiver-Prozesses verlangt" +msgid "redo starts at %X/%X" +msgstr "Redo beginnt bei %X/%X" -#: access/transam/xlog.c:12853 +#: access/transam/xlogrecovery.c:1653 #, c-format -msgid "received promote request" -msgstr "Anforderung zum Befördern empfangen" +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "" -#: access/transam/xlog.c:12866 +#: access/transam/xlogrecovery.c:1745 #, c-format -msgid "promote trigger file found: %s" -msgstr "Promote-Triggerdatei gefunden: %s" +msgid "requested recovery stop point is before consistent recovery point" +msgstr "angeforderter Recovery-Endpunkt ist vor konsistentem Recovery-Punkt" -#: access/transam/xlog.c:12874 +#: access/transam/xlogrecovery.c:1777 #, c-format -msgid "could not stat promote trigger file \"%s\": %m" -msgstr "konnte »stat« für Promote-Triggerdatei »%s« nicht ausführen: %m" +msgid "redo done at %X/%X system usage: %s" +msgstr "Redo fertig bei %X/%X Systembenutzung: %s" -#: access/transam/xlogarchive.c:205 +#: access/transam/xlogrecovery.c:1783 #, c-format -msgid "archive file \"%s\" has wrong size: %lld instead of %lld" -msgstr "Archivdatei »%s« hat falsche Größe: %lld statt %lld" +msgid "last completed transaction was at log time %s" +msgstr "letzte vollständige Transaktion war bei Logzeit %s" -#: access/transam/xlogarchive.c:214 +#: access/transam/xlogrecovery.c:1792 #, c-format -msgid "restored log file \"%s\" from archive" -msgstr "Logdatei »%s« aus Archiv wiederhergestellt" +msgid "redo is not required" +msgstr "Redo nicht nötig" -#: access/transam/xlogarchive.c:228 +#: access/transam/xlogrecovery.c:1803 #, c-format -msgid "restore_command returned a zero exit status, but stat() failed." -msgstr "" +msgid "recovery ended before configured recovery target was reached" +msgstr "Wiederherstellung endete bevor das konfigurierte Wiederherstellungsziel erreicht wurde" -#: access/transam/xlogarchive.c:260 +#: access/transam/xlogrecovery.c:1978 #, c-format -msgid "could not restore file \"%s\" from archive: %s" -msgstr "konnte Datei »%s« nicht aus Archiv wiederherstellen: %s" +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "fehlender Contrecord bei %X/%X erfolgreich übersprungen, überschrieben am %s" -#. translator: First %s represents a postgresql.conf parameter name like -#. "recovery_end_command", the 2nd is the value of that parameter, the -#. third an already translated error message. -#: access/transam/xlogarchive.c:369 +#: access/transam/xlogrecovery.c:2073 #, c-format -msgid "%s \"%s\": %s" -msgstr "%s »%s«: %s" +msgid "consistent recovery state reached at %X/%X" +msgstr "konsistenter Wiederherstellungszustand erreicht bei %X/%X" -#: access/transam/xlogarchive.c:479 access/transam/xlogarchive.c:543 +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2111 #, c-format -msgid "could not create archive status file \"%s\": %m" -msgstr "konnte Archivstatusdatei »%s« nicht erstellen: %m" +msgid "WAL redo at %X/%X for %s" +msgstr "WAL-Redo bei %X/%X für %s" -#: access/transam/xlogarchive.c:487 access/transam/xlogarchive.c:551 +#: access/transam/xlogrecovery.c:2207 #, c-format -msgid "could not write archive status file \"%s\": %m" -msgstr "konnte Archivstatusdatei »%s« nicht schreiben: %m" +msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" +msgstr "unerwartete vorherige Zeitleisten-ID %u (aktuelle Zeitleisten-ID %u) im Checkpoint-Datensatz" -#: access/transam/xlogfuncs.c:74 +#: access/transam/xlogrecovery.c:2216 #, c-format -msgid "a backup is already in progress in this session" -msgstr "ein Backup läuft bereits in dieser Sitzung" +msgid "unexpected timeline ID %u (after %u) in checkpoint record" +msgstr "unerwartete Zeitleisten-ID %u (nach %u) im Checkpoint-Datensatz" -#: access/transam/xlogfuncs.c:132 access/transam/xlogfuncs.c:213 +#: access/transam/xlogrecovery.c:2232 #, c-format -msgid "non-exclusive backup in progress" -msgstr "es läuft ein nicht-exklusives Backup" +msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" +msgstr "unerwartete Zeitleisten-ID %u in Checkpoint-Datensatz, bevor der minimale Wiederherstellungspunkt %X/%X auf Zeitleiste %u erreicht wurde" -#: access/transam/xlogfuncs.c:133 access/transam/xlogfuncs.c:214 +#: access/transam/xlogrecovery.c:2414 access/transam/xlogrecovery.c:2685 #, c-format -msgid "Did you mean to use pg_stop_backup('f')?" -msgstr "Meinten Sie pg_stop_backup('f')?" +msgid "recovery stopping after reaching consistency" +msgstr "Wiederherstellung beendet nachdem Konsistenz erreicht wurde" -#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1311 -#: commands/event_trigger.c:1869 commands/extension.c:1944 -#: commands/extension.c:2052 commands/extension.c:2337 commands/prepare.c:712 -#: executor/execExpr.c:2507 executor/execSRF.c:738 executor/functions.c:1058 -#: foreign/foreign.c:520 libpq/hba.c:2718 replication/logical/launcher.c:937 -#: replication/logical/logicalfuncs.c:157 replication/logical/origin.c:1494 -#: replication/slotfuncs.c:255 replication/walsender.c:3291 -#: storage/ipc/shmem.c:554 utils/adt/datetime.c:4812 utils/adt/genfile.c:507 -#: utils/adt/genfile.c:590 utils/adt/jsonfuncs.c:1933 -#: utils/adt/jsonfuncs.c:2045 utils/adt/jsonfuncs.c:2233 -#: utils/adt/jsonfuncs.c:2342 utils/adt/jsonfuncs.c:3803 -#: utils/adt/mcxtfuncs.c:132 utils/adt/misc.c:218 utils/adt/pgstatfuncs.c:477 -#: utils/adt/pgstatfuncs.c:587 utils/adt/pgstatfuncs.c:1887 -#: utils/adt/varlena.c:4832 utils/fmgr/funcapi.c:74 utils/misc/guc.c:9993 -#: utils/mmgr/portalmem.c:1141 +#: access/transam/xlogrecovery.c:2435 #, c-format -msgid "set-valued function called in context that cannot accept a set" -msgstr "Funktion mit Mengenergebnis in einem Zusammenhang aufgerufen, der keine Mengenergebnisse verarbeiten kann" +msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "Wiederherstellung beendet vor WAL-Position (LSN) »%X/%X«" -#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1315 -#: commands/event_trigger.c:1873 commands/extension.c:1948 -#: commands/extension.c:2056 commands/extension.c:2341 commands/prepare.c:716 -#: foreign/foreign.c:525 libpq/hba.c:2722 replication/logical/launcher.c:941 -#: replication/logical/logicalfuncs.c:161 replication/logical/origin.c:1498 -#: replication/slotfuncs.c:259 replication/walsender.c:3295 -#: storage/ipc/shmem.c:558 utils/adt/datetime.c:4816 utils/adt/genfile.c:511 -#: utils/adt/genfile.c:594 utils/adt/mcxtfuncs.c:136 utils/adt/misc.c:222 -#: utils/adt/pgstatfuncs.c:481 utils/adt/pgstatfuncs.c:591 -#: utils/adt/pgstatfuncs.c:1891 utils/adt/varlena.c:4836 utils/misc/guc.c:9997 -#: utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1145 +#: access/transam/xlogrecovery.c:2520 #, c-format -msgid "materialize mode required, but it is not allowed in this context" -msgstr "Materialisierungsmodus wird benötigt, ist aber in diesem Zusammenhang nicht erlaubt" +msgid "recovery stopping before commit of transaction %u, time %s" +msgstr "Wiederherstellung beendet vor Commit der Transaktion %u, Zeit %s" -#: access/transam/xlogfuncs.c:230 +#: access/transam/xlogrecovery.c:2527 #, c-format -msgid "non-exclusive backup is not in progress" -msgstr "es läuft kein nicht-exklusives Backup" +msgid "recovery stopping before abort of transaction %u, time %s" +msgstr "Wiederherstellung beendet vor Abbruch der Transaktion %u, Zeit %s" -#: access/transam/xlogfuncs.c:231 +#: access/transam/xlogrecovery.c:2580 #, c-format -msgid "Did you mean to use pg_stop_backup('t')?" -msgstr "Meinten Sie pg_stop_backup('t')?" +msgid "recovery stopping at restore point \"%s\", time %s" +msgstr "Wiederherstellung beendet bei Restore-Punkt »%s«, Zeit %s" -#: access/transam/xlogfuncs.c:307 +#: access/transam/xlogrecovery.c:2598 #, c-format -msgid "WAL level not sufficient for creating a restore point" -msgstr "WAL-Level nicht ausreichend, um Restore-Punkt anzulegen" +msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" +msgstr "Wiederherstellung beendet nach WAL-Position (LSN) »%X/%X«" -#: access/transam/xlogfuncs.c:315 +#: access/transam/xlogrecovery.c:2665 #, c-format -msgid "value too long for restore point (maximum %d characters)" -msgstr "Wert zu lang für Restore-Punkt (maximal %d Zeichen)" +msgid "recovery stopping after commit of transaction %u, time %s" +msgstr "Wiederherstellung beendet nach Commit der Transaktion %u, Zeit %s" -#: access/transam/xlogfuncs.c:453 access/transam/xlogfuncs.c:510 +#: access/transam/xlogrecovery.c:2673 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "%s kann nicht während der Wiederherstellung ausgeführt werden." +msgid "recovery stopping after abort of transaction %u, time %s" +msgstr "Wiederherstellung beendet nach Abbruch der Transaktion %u, Zeit %s" -#: access/transam/xlogfuncs.c:531 access/transam/xlogfuncs.c:561 -#: access/transam/xlogfuncs.c:585 access/transam/xlogfuncs.c:608 -#: access/transam/xlogfuncs.c:763 +#: access/transam/xlogrecovery.c:2754 #, c-format -msgid "recovery is not in progress" -msgstr "Wiederherstellung läuft nicht" +msgid "pausing at the end of recovery" +msgstr "pausiere am Ende der Wiederherstellung" -#: access/transam/xlogfuncs.c:532 access/transam/xlogfuncs.c:562 -#: access/transam/xlogfuncs.c:586 access/transam/xlogfuncs.c:609 -#: access/transam/xlogfuncs.c:764 +#: access/transam/xlogrecovery.c:2755 #, c-format -msgid "Recovery control functions can only be executed during recovery." -msgstr "Wiederherstellungskontrollfunktionen können nur während der Wiederherstellung ausgeführt werden." +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "Führen Sie pg_wal_replay_resume() aus, um den Server zum Primärserver zu befördern." -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:567 +#: access/transam/xlogrecovery.c:2758 access/transam/xlogrecovery.c:4549 #, c-format -msgid "standby promotion is ongoing" -msgstr "Beförderung des Standby läuft" +msgid "recovery has paused" +msgstr "Wiederherstellung wurde pausiert" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 +#: access/transam/xlogrecovery.c:2759 #, c-format -msgid "%s cannot be executed after promotion is triggered." -msgstr "%s kann nicht ausgeführt werden, nachdem eine Beförderung angestoßen wurde." +msgid "Execute pg_wal_replay_resume() to continue." +msgstr "Führen Sie pg_wal_replay_resume() aus um fortzusetzen." -#: access/transam/xlogfuncs.c:769 +#: access/transam/xlogrecovery.c:3019 #, c-format -msgid "\"wait_seconds\" must not be negative or zero" -msgstr "»wait_seconds« darf nicht negativ oder null sein" +msgid "unexpected timeline ID %u in log segment %s, offset %u" +msgstr "unerwartete Zeitleisten-ID %u in Logsegment %s, Offset %u" -#: access/transam/xlogfuncs.c:789 storage/ipc/signalfuncs.c:281 +#: access/transam/xlogrecovery.c:3224 #, c-format -msgid "failed to send signal to postmaster: %m" -msgstr "konnte Signal nicht an Postmaster senden: %m" +msgid "could not read from log segment %s, offset %u: %m" +msgstr "konnte nicht aus Logsegment %s, Position %u lesen: %m" -#: access/transam/xlogfuncs.c:825 +#: access/transam/xlogrecovery.c:3230 #, c-format -msgid "server did not promote within %d second" -msgid_plural "server did not promote within %d seconds" -msgstr[0] "Befördern des Servers wurde nicht innerhalb von %d Sekunde abgeschlossen" -msgstr[1] "Befördern des Servers wurde nicht innerhalb von %d Sekunden abgeschlossen" +msgid "could not read from log segment %s, offset %u: read %d of %zu" +msgstr "konnte nicht aus Logsegment %s bei Position %u lesen: %d von %zu gelesen" -#: access/transam/xlogreader.c:349 +#: access/transam/xlogrecovery.c:3866 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "ungültiger Datensatz-Offset bei %X/%X" +msgid "invalid primary checkpoint link in control file" +msgstr "ungültige primäre Checkpoint-Verknüpfung in Kontrolldatei" -#: access/transam/xlogreader.c:357 +#: access/transam/xlogrecovery.c:3870 #, c-format -msgid "contrecord is requested by %X/%X" -msgstr "Contrecord angefordert von %X/%X" +msgid "invalid checkpoint link in backup_label file" +msgstr "ungültige Checkpoint-Verknüpfung in backup_label-Datei" -#: access/transam/xlogreader.c:398 access/transam/xlogreader.c:695 +#: access/transam/xlogrecovery.c:3888 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "ungültige Datensatzlänge bei %X/%X: %u erwartet, %u erhalten" +msgid "invalid primary checkpoint record" +msgstr "ungültiger primärer Checkpoint-Datensatz" -#: access/transam/xlogreader.c:422 +#: access/transam/xlogrecovery.c:3892 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "Datensatzlänge %u bei %X/%X ist zu lang" +msgid "invalid checkpoint record" +msgstr "ungültiger Checkpoint-Datensatz" -#: access/transam/xlogreader.c:453 +#: access/transam/xlogrecovery.c:3903 #, c-format -msgid "there is no contrecord flag at %X/%X" -msgstr "keine Contrecord-Flag bei %X/%X" +msgid "invalid resource manager ID in primary checkpoint record" +msgstr "ungültige Resource-Manager-ID im primären Checkpoint-Datensatz" -#: access/transam/xlogreader.c:466 +#: access/transam/xlogrecovery.c:3907 #, c-format -msgid "invalid contrecord length %u (expected %lld) at %X/%X" -msgstr "ungültige Contrecord-Länge %u (erwartet %lld) bei %X/%X" +msgid "invalid resource manager ID in checkpoint record" +msgstr "ungültige Resource-Manager-ID im Checkpoint-Datensatz" -#: access/transam/xlogreader.c:703 +#: access/transam/xlogrecovery.c:3920 #, c-format -msgid "invalid resource manager ID %u at %X/%X" -msgstr "ungültige Resource-Manager-ID %u bei %X/%X" +msgid "invalid xl_info in primary checkpoint record" +msgstr "ungültige xl_info im primären Checkpoint-Datensatz" -#: access/transam/xlogreader.c:716 access/transam/xlogreader.c:732 +#: access/transam/xlogrecovery.c:3924 #, c-format -msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "Datensatz mit falschem Prev-Link %X/%X bei %X/%X" +msgid "invalid xl_info in checkpoint record" +msgstr "ungültige xl_info im Checkpoint-Datensatz" -#: access/transam/xlogreader.c:768 +#: access/transam/xlogrecovery.c:3935 #, c-format -msgid "incorrect resource manager data checksum in record at %X/%X" -msgstr "ungültige Resource-Manager-Datenprüfsumme in Datensatz bei %X/%X" +msgid "invalid length of primary checkpoint record" +msgstr "ungültige Länge des primären Checkpoint-Datensatzes" -#: access/transam/xlogreader.c:805 +#: access/transam/xlogrecovery.c:3939 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "ungültige magische Zahl %04X in Logsegment %s, Offset %u" +msgid "invalid length of checkpoint record" +msgstr "ungültige Länge des Checkpoint-Datensatzes" -#: access/transam/xlogreader.c:819 access/transam/xlogreader.c:860 +#: access/transam/xlogrecovery.c:3995 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "ungültige Info-Bits %04X in Logsegment %s, Offset %u" +msgid "new timeline %u is not a child of database system timeline %u" +msgstr "neue Zeitleiste %u ist kein Kind der Datenbanksystemzeitleiste %u" -#: access/transam/xlogreader.c:834 +#: access/transam/xlogrecovery.c:4009 #, c-format -msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" -msgstr "WAL-Datei ist von einem anderen Datenbanksystem: Datenbanksystemidentifikator in WAL-Datei ist %llu, Datenbanksystemidentifikator in pg_control ist %llu" +msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" +msgstr "neue Zeitleiste %u zweigte von der aktuellen Datenbanksystemzeitleiste %u vor dem aktuellen Wiederherstellungspunkt %X/%X ab" -#: access/transam/xlogreader.c:842 +#: access/transam/xlogrecovery.c:4028 #, c-format -msgid "WAL file is from different database system: incorrect segment size in page header" -msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche Segmentgröße im Seitenkopf" +msgid "new target timeline is %u" +msgstr "neue Zielzeitleiste ist %u" -#: access/transam/xlogreader.c:848 +#: access/transam/xlogrecovery.c:4231 #, c-format -msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" -msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche XLOG_BLCKSZ im Seitenkopf" +msgid "WAL receiver process shutdown requested" +msgstr "Herunterfahren des WAL-Receiver-Prozesses verlangt" -#: access/transam/xlogreader.c:879 +#: access/transam/xlogrecovery.c:4294 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "unerwartete Pageaddr %X/%X in Logsegment %s, Offset %u" +msgid "received promote request" +msgstr "Anforderung zum Befördern empfangen" -#: access/transam/xlogreader.c:904 +#: access/transam/xlogrecovery.c:4307 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "Zeitleisten-ID %u außer der Reihe (nach %u) in Logsegment %s, Offset %u" +msgid "promote trigger file found: %s" +msgstr "Promote-Triggerdatei gefunden: %s" -#: access/transam/xlogreader.c:1249 +#: access/transam/xlogrecovery.c:4315 #, c-format -msgid "out-of-order block_id %u at %X/%X" -msgstr "block_id %u außer der Reihe bei %X/%X" +msgid "could not stat promote trigger file \"%s\": %m" +msgstr "konnte »stat« für Promote-Triggerdatei »%s« nicht ausführen: %m" -#: access/transam/xlogreader.c:1271 +#: access/transam/xlogrecovery.c:4540 #, c-format -msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" -msgstr "BKPBLOCK_HAS_DATA gesetzt, aber keine Daten enthalten bei %X/%X" +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "Hot Standby ist nicht möglich wegen unzureichender Parametereinstellungen" -#: access/transam/xlogreader.c:1278 +#: access/transam/xlogrecovery.c:4541 access/transam/xlogrecovery.c:4568 +#: access/transam/xlogrecovery.c:4598 #, c-format -msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" -msgstr "BKPBLOCK_HAS_DATA nicht gesetzt, aber Datenlänge ist %u bei %X/%X" +msgid "%s = %d is a lower setting than on the primary server, where its value was %d." +msgstr "%s = %d ist eine niedrigere Einstellung als auf dem Primärserver, wo der Wert %d war." -#: access/transam/xlogreader.c:1314 +#: access/transam/xlogrecovery.c:4550 #, c-format -msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLE gesetzt, aber Loch Offset %u Länge %u Block-Abbild-Länge %u bei %X/%X" +msgid "If recovery is unpaused, the server will shut down." +msgstr "Wenn die Wiederherstellungspause beendet wird, wird der Server herunterfahren." -#: access/transam/xlogreader.c:1330 +#: access/transam/xlogrecovery.c:4551 #, c-format -msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLE nicht gesetzt, aber Loch Offset %u Länge %u bei %X/%X" +msgid "You can then restart the server after making the necessary configuration changes." +msgstr "Sie können den Server dann neu starten, nachdem die nötigen Konfigurationsänderungen getätigt worden sind." -#: access/transam/xlogreader.c:1345 +#: access/transam/xlogrecovery.c:4562 #, c-format -msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" -msgstr "BKPIMAGE_IS_COMPRESSED gesetzt, aber Block-Abbild-Länge %u bei %X/%X" +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "Beförderung ist nicht möglich wegen unzureichender Parametereinstellungen" -#: access/transam/xlogreader.c:1360 +#: access/transam/xlogrecovery.c:4572 #, c-format -msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" -msgstr "weder BKPIMAGE_HAS_HOLE noch BKPIMAGE_IS_COMPRESSED gesetzt, aber Block-Abbild-Länge ist %u bei %X/%X" +msgid "Restart the server after making the necessary configuration changes." +msgstr "Starten Sie den Server neu, nachdem die nötigen Konfigurationsänderungen getätigt worden sind." -#: access/transam/xlogreader.c:1376 +#: access/transam/xlogrecovery.c:4596 #, c-format -msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" -msgstr "BKPBLOCK_SAME_REL gesetzt, aber keine vorangehende Relation bei %X/%X" +msgid "recovery aborted because of insufficient parameter settings" +msgstr "Wiederherstellung abgebrochen wegen unzureichender Parametereinstellungen" -#: access/transam/xlogreader.c:1388 +#: access/transam/xlogrecovery.c:4602 #, c-format -msgid "invalid block_id %u at %X/%X" -msgstr "ungültige block_id %u bei %X/%X" +msgid "You can restart the server after making the necessary configuration changes." +msgstr "Sie können den Server neu starten, nachdem die nötigen Konfigurationsänderungen getätigt worden sind." -#: access/transam/xlogreader.c:1475 +#: access/transam/xlogutils.c:1051 #, c-format -msgid "record with invalid length at %X/%X" -msgstr "Datensatz mit ungültiger Länge bei %X/%X" +msgid "could not read from log segment %s, offset %d: %m" +msgstr "konnte nicht aus Logsegment %s, Position %d lesen: %m" -#: access/transam/xlogreader.c:1564 +#: access/transam/xlogutils.c:1058 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "ungültiges komprimiertes Abbild bei %X/%X, Block %d" +msgid "could not read from log segment %s, offset %d: read %d of %d" +msgstr "konnte nicht aus Logsegment %s bei Position %d lesen: %d von %d gelesen" -#: bootstrap/bootstrap.c:270 +#: bootstrap/bootstrap.c:263 #, c-format msgid "-X requires a power of two value between 1 MB and 1 GB" msgstr "-X benötigt eine Zweierpotenz zwischen 1 MB und 1 GB" -#: bootstrap/bootstrap.c:287 postmaster/postmaster.c:847 tcop/postgres.c:3858 +#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3889 #, c-format msgid "--%s requires a value" msgstr "--%s benötigt einen Wert" -#: bootstrap/bootstrap.c:292 postmaster/postmaster.c:852 tcop/postgres.c:3863 +#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3894 #, c-format msgid "-c %s requires a value" msgstr "-c %s benötigt einen Wert" -#: bootstrap/bootstrap.c:303 postmaster/postmaster.c:864 -#: postmaster/postmaster.c:877 +#: bootstrap/bootstrap.c:296 postmaster/postmaster.c:863 +#: postmaster/postmaster.c:876 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" -#: bootstrap/bootstrap.c:312 +#: bootstrap/bootstrap.c:305 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s: ungültige Kommandozeilenargumente\n" -#: catalog/aclchk.c:181 +#: catalog/aclchk.c:185 #, c-format msgid "grant options can only be granted to roles" msgstr "Grant-Optionen können nur Rollen gewährt werden" -#: catalog/aclchk.c:300 +#: catalog/aclchk.c:307 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "es wurden keine Privilegien für Spalte »%s« von Relation »%s« gewährt" -#: catalog/aclchk.c:305 +#: catalog/aclchk.c:312 #, c-format msgid "no privileges were granted for \"%s\"" msgstr "es wurden keine Privilegien für »%s« gewährt" -#: catalog/aclchk.c:313 +#: catalog/aclchk.c:320 #, c-format msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" msgstr "es wurden nicht alle Priviligien für Spalte »%s« von Relation »%s« gewährt" -#: catalog/aclchk.c:318 +#: catalog/aclchk.c:325 #, c-format msgid "not all privileges were granted for \"%s\"" msgstr "es wurden nicht alle Priviligien für »%s« gewährt" -#: catalog/aclchk.c:329 +#: catalog/aclchk.c:336 #, c-format msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "es konnten keine Privilegien für Spalte »%s« von Relation »%s« entzogen werden" -#: catalog/aclchk.c:334 +#: catalog/aclchk.c:341 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "es konnten keine Privilegien für »%s« entzogen werden" -#: catalog/aclchk.c:342 +#: catalog/aclchk.c:349 #, c-format msgid "not all privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "es konnten nicht alle Privilegien für Spalte »%s« von Relation »%s« entzogen werden" -#: catalog/aclchk.c:347 +#: catalog/aclchk.c:354 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "es konnten nicht alle Privilegien für »%s« entzogen werden" -#: catalog/aclchk.c:379 -#, fuzzy, c-format -#| msgid "must be superuser" +#: catalog/aclchk.c:386 +#, c-format msgid "grantor must be current user" -msgstr "Berechtigung nur für Superuser" +msgstr "Grantor muss aktueller Benutzer sein" -#: catalog/aclchk.c:446 catalog/aclchk.c:989 +#: catalog/aclchk.c:454 catalog/aclchk.c:1029 #, c-format msgid "invalid privilege type %s for relation" msgstr "ungültiger Privilegtyp %s für Relation" -#: catalog/aclchk.c:450 catalog/aclchk.c:993 +#: catalog/aclchk.c:458 catalog/aclchk.c:1033 #, c-format msgid "invalid privilege type %s for sequence" msgstr "ungültiger Privilegtyp %s für Sequenz" -#: catalog/aclchk.c:454 +#: catalog/aclchk.c:462 #, c-format msgid "invalid privilege type %s for database" msgstr "ungültiger Privilegtyp %s für Datenbank" -#: catalog/aclchk.c:458 +#: catalog/aclchk.c:466 #, c-format msgid "invalid privilege type %s for domain" msgstr "ungültiger Privilegtyp %s für Domäne" -#: catalog/aclchk.c:462 catalog/aclchk.c:997 +#: catalog/aclchk.c:470 catalog/aclchk.c:1037 #, c-format msgid "invalid privilege type %s for function" msgstr "ungültiger Privilegtyp %s für Funktion" -#: catalog/aclchk.c:466 +#: catalog/aclchk.c:474 #, c-format msgid "invalid privilege type %s for language" msgstr "ungültiger Privilegtyp %s für Sprache" -#: catalog/aclchk.c:470 +#: catalog/aclchk.c:478 #, c-format msgid "invalid privilege type %s for large object" msgstr "ungültiger Privilegtyp %s für Large Object" -#: catalog/aclchk.c:474 catalog/aclchk.c:1013 +#: catalog/aclchk.c:482 catalog/aclchk.c:1053 #, c-format msgid "invalid privilege type %s for schema" msgstr "ungültiger Privilegtyp %s für Schema" -#: catalog/aclchk.c:478 catalog/aclchk.c:1001 +#: catalog/aclchk.c:486 catalog/aclchk.c:1041 #, c-format msgid "invalid privilege type %s for procedure" msgstr "ungültiger Privilegtyp %s für Prozedur" -#: catalog/aclchk.c:482 catalog/aclchk.c:1005 +#: catalog/aclchk.c:490 catalog/aclchk.c:1045 #, c-format msgid "invalid privilege type %s for routine" msgstr "ungültiger Privilegtyp %s für Routine" -#: catalog/aclchk.c:486 +#: catalog/aclchk.c:494 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "ungültiger Privilegtyp %s für Tablespace" -#: catalog/aclchk.c:490 catalog/aclchk.c:1009 +#: catalog/aclchk.c:498 catalog/aclchk.c:1049 #, c-format msgid "invalid privilege type %s for type" msgstr "ungültiger Privilegtyp %s für Typ" -#: catalog/aclchk.c:494 +#: catalog/aclchk.c:502 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "ungültiger Privilegtyp %s für Fremddaten-Wrapper" -#: catalog/aclchk.c:498 +#: catalog/aclchk.c:506 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "ungültiger Privilegtyp %s für Fremdserver" -#: catalog/aclchk.c:537 +#: catalog/aclchk.c:510 +#, c-format +msgid "invalid privilege type %s for parameter" +msgstr "ungültiger Privilegtyp %s für Parameter" + +#: catalog/aclchk.c:549 #, c-format msgid "column privileges are only valid for relations" msgstr "Spaltenprivilegien sind nur für Relation gültig" -#: catalog/aclchk.c:697 catalog/aclchk.c:4164 catalog/aclchk.c:4985 -#: catalog/objectaddress.c:1060 catalog/pg_largeobject.c:116 -#: storage/large_object/inv_api.c:285 +#: catalog/aclchk.c:712 catalog/aclchk.c:4486 catalog/aclchk.c:5333 +#: catalog/objectaddress.c:1072 catalog/pg_largeobject.c:116 +#: storage/large_object/inv_api.c:287 #, c-format msgid "large object %u does not exist" msgstr "Large Object %u existiert nicht" -#: catalog/aclchk.c:926 catalog/aclchk.c:935 commands/collationcmds.c:119 -#: commands/copy.c:362 commands/copy.c:382 commands/copy.c:392 -#: commands/copy.c:401 commands/copy.c:410 commands/copy.c:420 -#: commands/copy.c:429 commands/copy.c:438 commands/copy.c:456 -#: commands/copy.c:472 commands/copy.c:492 commands/copy.c:509 -#: commands/dbcommands.c:157 commands/dbcommands.c:166 -#: commands/dbcommands.c:175 commands/dbcommands.c:184 -#: commands/dbcommands.c:193 commands/dbcommands.c:202 -#: commands/dbcommands.c:211 commands/dbcommands.c:220 -#: commands/dbcommands.c:229 commands/dbcommands.c:238 -#: commands/dbcommands.c:260 commands/dbcommands.c:1502 -#: commands/dbcommands.c:1511 commands/dbcommands.c:1520 -#: commands/dbcommands.c:1529 commands/extension.c:1735 -#: commands/extension.c:1745 commands/extension.c:1755 -#: commands/extension.c:3055 commands/foreigncmds.c:539 -#: commands/foreigncmds.c:548 commands/functioncmds.c:579 -#: commands/functioncmds.c:745 commands/functioncmds.c:754 -#: commands/functioncmds.c:763 commands/functioncmds.c:772 -#: commands/functioncmds.c:2069 commands/functioncmds.c:2077 -#: commands/publicationcmds.c:90 commands/publicationcmds.c:133 -#: commands/sequence.c:1266 commands/sequence.c:1276 commands/sequence.c:1286 -#: commands/sequence.c:1296 commands/sequence.c:1306 commands/sequence.c:1316 -#: commands/sequence.c:1326 commands/sequence.c:1336 commands/sequence.c:1346 -#: commands/subscriptioncmds.c:124 commands/subscriptioncmds.c:134 -#: commands/subscriptioncmds.c:144 commands/subscriptioncmds.c:154 -#: commands/subscriptioncmds.c:168 commands/subscriptioncmds.c:179 -#: commands/subscriptioncmds.c:193 commands/subscriptioncmds.c:203 -#: commands/subscriptioncmds.c:213 commands/tablecmds.c:7500 -#: commands/typecmds.c:335 commands/typecmds.c:1416 commands/typecmds.c:1425 -#: commands/typecmds.c:1433 commands/typecmds.c:1441 commands/typecmds.c:1449 -#: commands/typecmds.c:1457 commands/user.c:133 commands/user.c:147 -#: commands/user.c:156 commands/user.c:165 commands/user.c:174 -#: commands/user.c:183 commands/user.c:192 commands/user.c:201 -#: commands/user.c:210 commands/user.c:219 commands/user.c:228 -#: commands/user.c:237 commands/user.c:246 commands/user.c:582 -#: commands/user.c:590 commands/user.c:598 commands/user.c:606 -#: commands/user.c:614 commands/user.c:622 commands/user.c:630 -#: commands/user.c:638 commands/user.c:647 commands/user.c:655 -#: commands/user.c:663 parser/parse_utilcmd.c:407 -#: replication/pgoutput/pgoutput.c:189 replication/pgoutput/pgoutput.c:210 -#: replication/pgoutput/pgoutput.c:224 replication/pgoutput/pgoutput.c:234 -#: replication/pgoutput/pgoutput.c:244 replication/walsender.c:882 -#: replication/walsender.c:893 replication/walsender.c:903 -#, c-format -msgid "conflicting or redundant options" -msgstr "widersprüchliche oder überflüssige Optionen" - -#: catalog/aclchk.c:1046 +#: catalog/aclchk.c:1086 #, c-format msgid "default privileges cannot be set for columns" msgstr "Vorgabeprivilegien können nicht für Spalten gesetzt werden" -#: catalog/aclchk.c:1206 +#: catalog/aclchk.c:1246 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "Klausel IN SCHEMA kann nicht verwendet werden, wenn GRANT/REVOKE ON SCHEMAS verwendet wird" -#: catalog/aclchk.c:1544 catalog/catalog.c:553 catalog/objectaddress.c:1522 -#: commands/analyze.c:390 commands/copy.c:741 commands/sequence.c:1701 -#: commands/tablecmds.c:6976 commands/tablecmds.c:7119 -#: commands/tablecmds.c:7169 commands/tablecmds.c:7243 -#: commands/tablecmds.c:7313 commands/tablecmds.c:7425 -#: commands/tablecmds.c:7519 commands/tablecmds.c:7578 -#: commands/tablecmds.c:7667 commands/tablecmds.c:7696 -#: commands/tablecmds.c:7851 commands/tablecmds.c:7933 -#: commands/tablecmds.c:8089 commands/tablecmds.c:8207 -#: commands/tablecmds.c:11556 commands/tablecmds.c:11738 -#: commands/tablecmds.c:11898 commands/tablecmds.c:13041 -#: commands/tablecmds.c:15602 commands/trigger.c:924 parser/analyze.c:2413 -#: parser/parse_relation.c:714 parser/parse_target.c:1064 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3453 -#: parser/parse_utilcmd.c:3488 parser/parse_utilcmd.c:3530 utils/adt/acl.c:2845 -#: utils/adt/ruleutils.c:2708 +#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 +#: catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:763 +#: commands/sequence.c:1655 commands/tablecmds.c:7200 commands/tablecmds.c:7356 +#: commands/tablecmds.c:7406 commands/tablecmds.c:7480 +#: commands/tablecmds.c:7550 commands/tablecmds.c:7662 +#: commands/tablecmds.c:7756 commands/tablecmds.c:7815 +#: commands/tablecmds.c:7904 commands/tablecmds.c:7934 +#: commands/tablecmds.c:8062 commands/tablecmds.c:8144 +#: commands/tablecmds.c:8300 commands/tablecmds.c:8418 +#: commands/tablecmds.c:12092 commands/tablecmds.c:12273 +#: commands/tablecmds.c:12433 commands/tablecmds.c:13597 +#: commands/tablecmds.c:16183 commands/trigger.c:958 parser/analyze.c:2468 +#: parser/parse_relation.c:725 parser/parse_target.c:1063 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3424 +#: parser/parse_utilcmd.c:3460 parser/parse_utilcmd.c:3502 utils/adt/acl.c:2869 +#: utils/adt/ruleutils.c:2815 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "Spalte »%s« von Relation »%s« existiert nicht" -#: catalog/aclchk.c:1807 catalog/objectaddress.c:1362 commands/sequence.c:1139 -#: commands/tablecmds.c:249 commands/tablecmds.c:16466 utils/adt/acl.c:2053 -#: utils/adt/acl.c:2083 utils/adt/acl.c:2115 utils/adt/acl.c:2147 -#: utils/adt/acl.c:2175 utils/adt/acl.c:2205 +#: catalog/aclchk.c:1850 catalog/objectaddress.c:1383 commands/sequence.c:1164 +#: commands/tablecmds.c:252 commands/tablecmds.c:17074 utils/adt/acl.c:2077 +#: utils/adt/acl.c:2107 utils/adt/acl.c:2139 utils/adt/acl.c:2171 +#: utils/adt/acl.c:2199 utils/adt/acl.c:2229 #, c-format msgid "\"%s\" is not a sequence" msgstr "»%s« ist keine Sequenz" -#: catalog/aclchk.c:1845 +#: catalog/aclchk.c:1888 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "Sequenz »%s« unterstützt nur die Privilegien USAGE, SELECT und UPDATE" -#: catalog/aclchk.c:1862 +#: catalog/aclchk.c:1905 #, c-format msgid "invalid privilege type %s for table" msgstr "ungültiger Privilegtyp %s für Tabelle" -#: catalog/aclchk.c:2028 +#: catalog/aclchk.c:2071 #, c-format msgid "invalid privilege type %s for column" msgstr "ungültiger Privilegtyp %s für Spalte" -#: catalog/aclchk.c:2041 +#: catalog/aclchk.c:2084 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "Sequenz »%s« unterstützt nur den Spaltenprivilegientyp SELECT" -#: catalog/aclchk.c:2623 +#: catalog/aclchk.c:2666 #, c-format msgid "language \"%s\" is not trusted" msgstr "Sprache »%s« ist nicht »trusted«" -#: catalog/aclchk.c:2625 +#: catalog/aclchk.c:2668 #, c-format msgid "GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages." msgstr "GRANT und REVOKE sind für nicht vertrauenswürdige Sprachen nicht erlaubt, weil nur Superuser nicht vertrauenswürdige Sprachen verwenden können." -#: catalog/aclchk.c:3139 +#: catalog/aclchk.c:3182 #, c-format msgid "cannot set privileges of array types" msgstr "für Array-Typen können keine Privilegien gesetzt werden" -#: catalog/aclchk.c:3140 +#: catalog/aclchk.c:3183 #, c-format msgid "Set the privileges of the element type instead." msgstr "Setzen Sie stattdessen die Privilegien des Elementtyps." -#: catalog/aclchk.c:3147 catalog/objectaddress.c:1656 +#: catalog/aclchk.c:3190 catalog/objectaddress.c:1649 #, c-format msgid "\"%s\" is not a domain" msgstr "»%s« ist keine Domäne" -#: catalog/aclchk.c:3267 +#: catalog/aclchk.c:3462 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "unbekannter Privilegtyp »%s«" -#: catalog/aclchk.c:3328 +#: catalog/aclchk.c:3527 #, c-format msgid "permission denied for aggregate %s" msgstr "keine Berechtigung für Aggregatfunktion %s" -#: catalog/aclchk.c:3331 +#: catalog/aclchk.c:3530 #, c-format msgid "permission denied for collation %s" msgstr "keine Berechtigung für Sortierfolge %s" -#: catalog/aclchk.c:3334 +#: catalog/aclchk.c:3533 #, c-format msgid "permission denied for column %s" msgstr "keine Berechtigung für Spalte %s" -#: catalog/aclchk.c:3337 +#: catalog/aclchk.c:3536 #, c-format msgid "permission denied for conversion %s" msgstr "keine Berechtigung für Konversion %s" -#: catalog/aclchk.c:3340 +#: catalog/aclchk.c:3539 #, c-format msgid "permission denied for database %s" msgstr "keine Berechtigung für Datenbank %s" -#: catalog/aclchk.c:3343 +#: catalog/aclchk.c:3542 #, c-format msgid "permission denied for domain %s" msgstr "keine Berechtigung für Domäne %s" -#: catalog/aclchk.c:3346 +#: catalog/aclchk.c:3545 #, c-format msgid "permission denied for event trigger %s" msgstr "keine Berechtigung für Ereignistrigger %s" -#: catalog/aclchk.c:3349 +#: catalog/aclchk.c:3548 #, c-format msgid "permission denied for extension %s" msgstr "keine Berechtigung für Erweiterung %s" -#: catalog/aclchk.c:3352 +#: catalog/aclchk.c:3551 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "keine Berechtigung für Fremddaten-Wrapper %s" -#: catalog/aclchk.c:3355 +#: catalog/aclchk.c:3554 #, c-format msgid "permission denied for foreign server %s" msgstr "keine Berechtigung für Fremdserver %s" -#: catalog/aclchk.c:3358 +#: catalog/aclchk.c:3557 #, c-format msgid "permission denied for foreign table %s" msgstr "keine Berechtigung für Fremdtabelle %s" -#: catalog/aclchk.c:3361 +#: catalog/aclchk.c:3560 #, c-format msgid "permission denied for function %s" msgstr "keine Berechtigung für Funktion %s" -#: catalog/aclchk.c:3364 +#: catalog/aclchk.c:3563 #, c-format msgid "permission denied for index %s" msgstr "keine Berechtigung für Index %s" -#: catalog/aclchk.c:3367 +#: catalog/aclchk.c:3566 #, c-format msgid "permission denied for language %s" msgstr "keine Berechtigung für Sprache %s" -#: catalog/aclchk.c:3370 +#: catalog/aclchk.c:3569 #, c-format msgid "permission denied for large object %s" msgstr "keine Berechtigung für Large Object %s" -#: catalog/aclchk.c:3373 +#: catalog/aclchk.c:3572 #, c-format msgid "permission denied for materialized view %s" msgstr "keine Berechtigung für materialisierte Sicht %s" -#: catalog/aclchk.c:3376 +#: catalog/aclchk.c:3575 #, c-format msgid "permission denied for operator class %s" msgstr "keine Berechtigung für Operatorklasse %s" -#: catalog/aclchk.c:3379 +#: catalog/aclchk.c:3578 #, c-format msgid "permission denied for operator %s" msgstr "keine Berechtigung für Operator %s" -#: catalog/aclchk.c:3382 +#: catalog/aclchk.c:3581 #, c-format msgid "permission denied for operator family %s" msgstr "keine Berechtigung für Operatorfamilie %s" -#: catalog/aclchk.c:3385 +#: catalog/aclchk.c:3584 +#, c-format +msgid "permission denied for parameter %s" +msgstr "keine Berechtigung für Parameter %s" + +#: catalog/aclchk.c:3587 #, c-format msgid "permission denied for policy %s" msgstr "keine Berechtigung für Policy %s" -#: catalog/aclchk.c:3388 +#: catalog/aclchk.c:3590 #, c-format msgid "permission denied for procedure %s" msgstr "keine Berechtigung für Prozedur %s" -#: catalog/aclchk.c:3391 +#: catalog/aclchk.c:3593 #, c-format msgid "permission denied for publication %s" msgstr "keine Berechtigung für Publikation %s" -#: catalog/aclchk.c:3394 +#: catalog/aclchk.c:3596 #, c-format msgid "permission denied for routine %s" msgstr "keine Berechtigung für Routine %s" -#: catalog/aclchk.c:3397 +#: catalog/aclchk.c:3599 #, c-format msgid "permission denied for schema %s" msgstr "keine Berechtigung für Schema %s" -#: catalog/aclchk.c:3400 commands/sequence.c:610 commands/sequence.c:844 -#: commands/sequence.c:886 commands/sequence.c:927 commands/sequence.c:1799 -#: commands/sequence.c:1863 +#: catalog/aclchk.c:3602 commands/sequence.c:652 commands/sequence.c:878 +#: commands/sequence.c:920 commands/sequence.c:961 commands/sequence.c:1753 +#: commands/sequence.c:1817 #, c-format msgid "permission denied for sequence %s" msgstr "keine Berechtigung für Sequenz %s" -#: catalog/aclchk.c:3403 +#: catalog/aclchk.c:3605 #, c-format msgid "permission denied for statistics object %s" msgstr "keine Berechtigung für Statistikobjekt %s" -#: catalog/aclchk.c:3406 +#: catalog/aclchk.c:3608 #, c-format msgid "permission denied for subscription %s" msgstr "keine Berechtigung für Subskription %s" -#: catalog/aclchk.c:3409 +#: catalog/aclchk.c:3611 #, c-format msgid "permission denied for table %s" msgstr "keine Berechtigung für Tabelle %s" -#: catalog/aclchk.c:3412 +#: catalog/aclchk.c:3614 #, c-format msgid "permission denied for tablespace %s" msgstr "keine Berechtigung für Tablespace %s" -#: catalog/aclchk.c:3415 +#: catalog/aclchk.c:3617 #, c-format msgid "permission denied for text search configuration %s" msgstr "keine Berechtigung für Textsuchekonfiguration %s" -#: catalog/aclchk.c:3418 +#: catalog/aclchk.c:3620 #, c-format msgid "permission denied for text search dictionary %s" msgstr "keine Berechtigung für Textsuchewörterbuch %s" -#: catalog/aclchk.c:3421 +#: catalog/aclchk.c:3623 #, c-format msgid "permission denied for type %s" msgstr "keine Berechtigung für Typ %s" -#: catalog/aclchk.c:3424 +#: catalog/aclchk.c:3626 #, c-format msgid "permission denied for view %s" msgstr "keine Berechtigung für Sicht %s" -#: catalog/aclchk.c:3459 +#: catalog/aclchk.c:3662 #, c-format msgid "must be owner of aggregate %s" msgstr "Berechtigung nur für Eigentümer der Aggregatfunktion %s" -#: catalog/aclchk.c:3462 +#: catalog/aclchk.c:3665 #, c-format msgid "must be owner of collation %s" msgstr "Berechtigung nur für Eigentümer der Sortierfolge %s" -#: catalog/aclchk.c:3465 +#: catalog/aclchk.c:3668 #, c-format msgid "must be owner of conversion %s" msgstr "Berechtigung nur für Eigentümer der Konversion %s" -#: catalog/aclchk.c:3468 +#: catalog/aclchk.c:3671 #, c-format msgid "must be owner of database %s" msgstr "Berechtigung nur für Eigentümer der Datenbank %s" -#: catalog/aclchk.c:3471 +#: catalog/aclchk.c:3674 #, c-format msgid "must be owner of domain %s" msgstr "Berechtigung nur für Eigentümer der Domäne %s" -#: catalog/aclchk.c:3474 +#: catalog/aclchk.c:3677 #, c-format msgid "must be owner of event trigger %s" msgstr "Berechtigung nur für Eigentümer des Ereignistriggers %s" -#: catalog/aclchk.c:3477 +#: catalog/aclchk.c:3680 #, c-format msgid "must be owner of extension %s" msgstr "Berechtigung nur für Eigentümer der Erweiterung %s" -#: catalog/aclchk.c:3480 +#: catalog/aclchk.c:3683 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "Berechtigung nur für Eigentümer des Fremddaten-Wrappers %s" -#: catalog/aclchk.c:3483 +#: catalog/aclchk.c:3686 #, c-format msgid "must be owner of foreign server %s" msgstr "Berechtigung nur für Eigentümer des Fremdservers %s" -#: catalog/aclchk.c:3486 +#: catalog/aclchk.c:3689 #, c-format msgid "must be owner of foreign table %s" msgstr "Berechtigung nur für Eigentümer der Fremdtabelle %s" -#: catalog/aclchk.c:3489 +#: catalog/aclchk.c:3692 #, c-format msgid "must be owner of function %s" msgstr "Berechtigung nur für Eigentümer der Funktion %s" -#: catalog/aclchk.c:3492 +#: catalog/aclchk.c:3695 #, c-format msgid "must be owner of index %s" msgstr "Berechtigung nur für Eigentümer des Index %s" -#: catalog/aclchk.c:3495 +#: catalog/aclchk.c:3698 #, c-format msgid "must be owner of language %s" msgstr "Berechtigung nur für Eigentümer der Sprache %s" -#: catalog/aclchk.c:3498 +#: catalog/aclchk.c:3701 #, c-format msgid "must be owner of large object %s" msgstr "Berechtigung nur für Eigentümer des Large Object %s" -#: catalog/aclchk.c:3501 +#: catalog/aclchk.c:3704 #, c-format msgid "must be owner of materialized view %s" msgstr "Berechtigung nur für Eigentümer der materialisierten Sicht %s" -#: catalog/aclchk.c:3504 +#: catalog/aclchk.c:3707 #, c-format msgid "must be owner of operator class %s" msgstr "Berechtigung nur für Eigentümer der Operatorklasse %s" -#: catalog/aclchk.c:3507 +#: catalog/aclchk.c:3710 #, c-format msgid "must be owner of operator %s" msgstr "Berechtigung nur für Eigentümer des Operators %s" -#: catalog/aclchk.c:3510 +#: catalog/aclchk.c:3713 #, c-format msgid "must be owner of operator family %s" msgstr "Berechtigung nur für Eigentümer der Operatorfamilie %s" -#: catalog/aclchk.c:3513 +#: catalog/aclchk.c:3716 #, c-format msgid "must be owner of procedure %s" msgstr "Berechtigung nur für Eigentümer der Prozedur %s" -#: catalog/aclchk.c:3516 +#: catalog/aclchk.c:3719 #, c-format msgid "must be owner of publication %s" msgstr "Berechtigung nur für Eigentümer der Publikation %s" -#: catalog/aclchk.c:3519 +#: catalog/aclchk.c:3722 #, c-format msgid "must be owner of routine %s" msgstr "Berechtigung nur für Eigentümer der Routine %s" -#: catalog/aclchk.c:3522 +#: catalog/aclchk.c:3725 #, c-format msgid "must be owner of sequence %s" msgstr "Berechtigung nur für Eigentümer der Sequenz %s" -#: catalog/aclchk.c:3525 +#: catalog/aclchk.c:3728 #, c-format msgid "must be owner of subscription %s" msgstr "Berechtigung nur für Eigentümer der Subskription %s" -#: catalog/aclchk.c:3528 +#: catalog/aclchk.c:3731 #, c-format msgid "must be owner of table %s" msgstr "Berechtigung nur für Eigentümer der Tabelle %s" -#: catalog/aclchk.c:3531 +#: catalog/aclchk.c:3734 #, c-format msgid "must be owner of type %s" msgstr "Berechtigung nur für Eigentümer des Typs %s" -#: catalog/aclchk.c:3534 +#: catalog/aclchk.c:3737 #, c-format msgid "must be owner of view %s" msgstr "Berechtigung nur für Eigentümer der Sicht %s" -#: catalog/aclchk.c:3537 +#: catalog/aclchk.c:3740 #, c-format msgid "must be owner of schema %s" msgstr "Berechtigung nur für Eigentümer des Schemas %s" -#: catalog/aclchk.c:3540 +#: catalog/aclchk.c:3743 #, c-format msgid "must be owner of statistics object %s" msgstr "Berechtigung nur für Eigentümer des Statistikobjekts %s" -#: catalog/aclchk.c:3543 +#: catalog/aclchk.c:3746 #, c-format msgid "must be owner of tablespace %s" msgstr "Berechtigung nur für Eigentümer des Tablespace %s" -#: catalog/aclchk.c:3546 +#: catalog/aclchk.c:3749 #, c-format msgid "must be owner of text search configuration %s" msgstr "Berechtigung nur für Eigentümer der Textsuchekonfiguration %s" -#: catalog/aclchk.c:3549 +#: catalog/aclchk.c:3752 #, c-format msgid "must be owner of text search dictionary %s" msgstr "Berechtigung nur für Eigentümer des Textsuchewörterbuches %s" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:3766 #, c-format msgid "must be owner of relation %s" msgstr "Berechtigung nur für Eigentümer der Relation %s" -#: catalog/aclchk.c:3607 +#: catalog/aclchk.c:3812 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "keine Berechtigung für Spalte »%s« von Relation »%s«" -#: catalog/aclchk.c:3750 catalog/aclchk.c:3769 +#: catalog/aclchk.c:3957 catalog/aclchk.c:3976 #, c-format msgid "attribute %d of relation with OID %u does not exist" msgstr "Attribut %d der Relation mit OID %u existiert nicht" -#: catalog/aclchk.c:3864 catalog/aclchk.c:4836 +#: catalog/aclchk.c:4071 catalog/aclchk.c:5184 #, c-format msgid "relation with OID %u does not exist" msgstr "Relation mit OID %u existiert nicht" -#: catalog/aclchk.c:3977 catalog/aclchk.c:5254 +#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2582 #, c-format msgid "database with OID %u does not exist" msgstr "Datenbank mit OID %u existiert nicht" -#: catalog/aclchk.c:4031 catalog/aclchk.c:4914 tcop/fastpath.c:141 -#: utils/fmgr/fmgr.c:2051 +#: catalog/aclchk.c:4299 +#, c-format +msgid "parameter ACL with OID %u does not exist" +msgstr "Parameter-ACL mit OID %u existiert nicht" + +#: catalog/aclchk.c:4353 catalog/aclchk.c:5262 tcop/fastpath.c:141 +#: utils/fmgr/fmgr.c:2037 #, c-format msgid "function with OID %u does not exist" msgstr "Funktion mit OID %u existiert nicht" -#: catalog/aclchk.c:4085 catalog/aclchk.c:4940 +#: catalog/aclchk.c:4407 catalog/aclchk.c:5288 #, c-format msgid "language with OID %u does not exist" msgstr "Sprache mit OID %u existiert nicht" -#: catalog/aclchk.c:4249 catalog/aclchk.c:5012 commands/collationcmds.c:517 +#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 +#: commands/publicationcmds.c:1794 #, c-format msgid "schema with OID %u does not exist" msgstr "Schema mit OID %u existiert nicht" -#: catalog/aclchk.c:4313 catalog/aclchk.c:5039 utils/adt/genfile.c:688 +#: catalog/aclchk.c:4635 catalog/aclchk.c:5387 utils/adt/genfile.c:632 #, c-format msgid "tablespace with OID %u does not exist" msgstr "Tablespace mit OID %u existiert nicht" -#: catalog/aclchk.c:4372 catalog/aclchk.c:5173 commands/foreigncmds.c:325 +#: catalog/aclchk.c:4694 catalog/aclchk.c:5521 commands/foreigncmds.c:325 #, c-format msgid "foreign-data wrapper with OID %u does not exist" msgstr "Fremddaten-Wrapper mit OID %u existiert nicht" -#: catalog/aclchk.c:4434 catalog/aclchk.c:5200 commands/foreigncmds.c:462 +#: catalog/aclchk.c:4756 catalog/aclchk.c:5548 commands/foreigncmds.c:462 #, c-format msgid "foreign server with OID %u does not exist" msgstr "Fremdserver mit OID %u existiert nicht" -#: catalog/aclchk.c:4494 catalog/aclchk.c:4862 utils/cache/typcache.c:384 -#: utils/cache/typcache.c:439 +#: catalog/aclchk.c:4816 catalog/aclchk.c:5210 utils/cache/typcache.c:385 +#: utils/cache/typcache.c:440 #, c-format msgid "type with OID %u does not exist" msgstr "Typ mit OID %u existiert nicht" -#: catalog/aclchk.c:4888 +#: catalog/aclchk.c:5236 #, c-format msgid "operator with OID %u does not exist" msgstr "Operator mit OID %u existiert nicht" -#: catalog/aclchk.c:5065 +#: catalog/aclchk.c:5413 #, c-format msgid "operator class with OID %u does not exist" msgstr "Operatorklasse mit OID %u existiert nicht" -#: catalog/aclchk.c:5092 +#: catalog/aclchk.c:5440 #, c-format msgid "operator family with OID %u does not exist" msgstr "Operatorfamilie mit OID %u existiert nicht" -#: catalog/aclchk.c:5119 +#: catalog/aclchk.c:5467 #, c-format msgid "text search dictionary with OID %u does not exist" msgstr "Textsuchewörterbuch mit OID %u existiert nicht" -#: catalog/aclchk.c:5146 +#: catalog/aclchk.c:5494 #, c-format msgid "text search configuration with OID %u does not exist" msgstr "Textsuchekonfiguration mit OID %u existiert nicht" -#: catalog/aclchk.c:5227 commands/event_trigger.c:453 +#: catalog/aclchk.c:5575 commands/event_trigger.c:453 #, c-format msgid "event trigger with OID %u does not exist" msgstr "Ereignistrigger mit OID %u existiert nicht" -#: catalog/aclchk.c:5280 commands/collationcmds.c:368 +#: catalog/aclchk.c:5628 commands/collationcmds.c:439 #, c-format msgid "collation with OID %u does not exist" msgstr "Sortierfolge mit OID %u existiert nicht" -#: catalog/aclchk.c:5306 +#: catalog/aclchk.c:5654 #, c-format msgid "conversion with OID %u does not exist" msgstr "Konversion mit OID %u existiert nicht" -#: catalog/aclchk.c:5347 +#: catalog/aclchk.c:5695 #, c-format msgid "extension with OID %u does not exist" msgstr "Erweiterung mit OID %u existiert nicht" -#: catalog/aclchk.c:5374 commands/publicationcmds.c:771 +#: catalog/aclchk.c:5722 commands/publicationcmds.c:2048 #, c-format msgid "publication with OID %u does not exist" msgstr "Publikation mit OID %u existiert nicht" -#: catalog/aclchk.c:5400 commands/subscriptioncmds.c:1459 +#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1745 #, c-format msgid "subscription with OID %u does not exist" msgstr "Subskription mit OID %u existiert nicht" -#: catalog/aclchk.c:5426 +#: catalog/aclchk.c:5774 #, c-format msgid "statistics object with OID %u does not exist" msgstr "Statistikobjekt mit OID %u existiert nicht" -#: catalog/catalog.c:378 -#, fuzzy, c-format -#| msgid "while inserting index tuple (%u,%u) in relation \"%s\"" -msgid "still finding an unused OID within relation \"%s\"" -msgstr "beim Einfügen von Indextupel (%u,%u) in Relation »%s«" - -#: catalog/catalog.c:380 +#: catalog/catalog.c:447 #, c-format -msgid "OID candidates were checked \"%llu\" times, but no unused OID is yet found." -msgstr "" +msgid "still searching for an unused OID in relation \"%s\"" +msgstr "suche immer noch nach einer unbenutzten OID in in Relation »%s«" -#: catalog/catalog.c:403 +#: catalog/catalog.c:449 #, c-format -msgid "new OID has been assigned in relation \"%s\" after \"%llu\" retries" -msgstr "" +msgid "OID candidates have been checked %llu time, but no unused OID has been found yet." +msgid_plural "OID candidates have been checked %llu times, but no unused OID has been found yet." +msgstr[0] "OID-Kandidaten wurden %llu mal geprüft, aber es wurde bisher keine unbenutzte OID gefunden." +msgstr[1] "OID-Kandidaten wurden %llu mal geprüft, aber es wurde bisher keine unbenutzte OID gefunden." -#: catalog/catalog.c:532 +#: catalog/catalog.c:474 #, c-format -msgid "must be superuser to call pg_nextoid()" -msgstr "nur Superuser können pg_nextoid() aufrufen" +msgid "new OID has been assigned in relation \"%s\" after %llu retry" +msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" +msgstr[0] "neue OID in Relation »%s« wurde zugewiesen nach %llu Versuch" +msgstr[1] "neue OID in Relation »%s« wurde zugewiesen nach %llu Versuchen" -#: catalog/catalog.c:540 +#: catalog/catalog.c:605 catalog/catalog.c:672 +#, fuzzy, c-format +#| msgid "must be superuser to rename %s" +msgid "must be superuser to call %s()" +msgstr "nur Superuser können %s umbenennen" + +#: catalog/catalog.c:614 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() kann nur mit Systemkatalogen verwendet werden" -#: catalog/catalog.c:545 parser/parse_utilcmd.c:2276 +#: catalog/catalog.c:619 parser/parse_utilcmd.c:2269 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "Index »%s« gehört nicht zu Tabelle »%s«" -#: catalog/catalog.c:562 +#: catalog/catalog.c:636 #, c-format msgid "column \"%s\" is not of type oid" msgstr "Spalte »%s« hat nicht Typ oid" -#: catalog/catalog.c:569 +#: catalog/catalog.c:643 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "»%s« ist kein Index für Spalte »%s«" -#: catalog/dependency.c:821 catalog/dependency.c:1060 +#: catalog/dependency.c:535 catalog/pg_shdepend.c:657 +#, c-format +msgid "cannot drop %s because it is required by the database system" +msgstr "kann %s nicht löschen, wird vom Datenbanksystem benötigt" + +#: catalog/dependency.c:827 catalog/dependency.c:1054 #, c-format msgid "cannot drop %s because %s requires it" msgstr "kann %s nicht löschen, wird von %s benötigt" -#: catalog/dependency.c:823 catalog/dependency.c:1062 +#: catalog/dependency.c:829 catalog/dependency.c:1056 #, c-format msgid "You can drop %s instead." msgstr "Sie können stattdessen %s löschen." -#: catalog/dependency.c:931 catalog/pg_shdepend.c:696 -#, c-format -msgid "cannot drop %s because it is required by the database system" -msgstr "kann %s nicht löschen, wird vom Datenbanksystem benötigt" - #: catalog/dependency.c:1135 catalog/dependency.c:1144 #, c-format msgid "%s depends on %s" msgstr "%s hängt von %s ab" -#: catalog/dependency.c:1156 catalog/dependency.c:1165 +#: catalog/dependency.c:1159 catalog/dependency.c:1168 #, c-format msgid "drop cascades to %s" msgstr "Löschvorgang löscht ebenfalls %s" -#: catalog/dependency.c:1173 catalog/pg_shdepend.c:825 +#: catalog/dependency.c:1176 catalog/pg_shdepend.c:822 #, c-format msgid "" "\n" @@ -4177,674 +4163,697 @@ msgstr[1] "" "\n" "und %d weitere Objekte (Liste im Serverlog)" -#: catalog/dependency.c:1185 +#: catalog/dependency.c:1188 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "kann %s nicht löschen, weil andere Objekte davon abhängen" -#: catalog/dependency.c:1187 catalog/dependency.c:1188 -#: catalog/dependency.c:1194 catalog/dependency.c:1195 -#: catalog/dependency.c:1206 catalog/dependency.c:1207 -#: commands/tablecmds.c:1298 commands/tablecmds.c:13659 -#: commands/tablespace.c:481 commands/user.c:1095 commands/view.c:495 -#: libpq/auth.c:338 replication/syncrep.c:1043 storage/lmgr/deadlock.c:1152 -#: storage/lmgr/proc.c:1433 utils/adt/acl.c:5250 utils/adt/jsonfuncs.c:618 -#: utils/adt/jsonfuncs.c:624 utils/misc/guc.c:7114 utils/misc/guc.c:7150 -#: utils/misc/guc.c:7220 utils/misc/guc.c:11400 utils/misc/guc.c:11434 -#: utils/misc/guc.c:11468 utils/misc/guc.c:11511 utils/misc/guc.c:11553 +#: catalog/dependency.c:1190 catalog/dependency.c:1191 +#: catalog/dependency.c:1197 catalog/dependency.c:1198 +#: catalog/dependency.c:1208 catalog/dependency.c:1209 +#: commands/publicationcmds.c:632 commands/tablecmds.c:1326 +#: commands/tablecmds.c:14239 commands/tablespace.c:498 commands/user.c:1008 +#: commands/view.c:508 libpq/auth.c:329 replication/syncrep.c:1043 +#: storage/lmgr/deadlock.c:1152 storage/lmgr/proc.c:1409 utils/adt/acl.c:5333 +#: utils/adt/jsonfuncs.c:618 utils/adt/jsonfuncs.c:624 utils/misc/guc.c:7394 +#: utils/misc/guc.c:7430 utils/misc/guc.c:7500 utils/misc/guc.c:11763 +#: utils/misc/guc.c:11797 utils/misc/guc.c:11831 utils/misc/guc.c:11874 +#: utils/misc/guc.c:11916 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1189 catalog/dependency.c:1196 +#: catalog/dependency.c:1192 catalog/dependency.c:1199 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "Verwenden Sie DROP ... CASCADE, um die abhängigen Objekte ebenfalls zu löschen." -#: catalog/dependency.c:1193 +#: catalog/dependency.c:1196 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "kann gewünschte Objekte nicht löschen, weil andere Objekte davon abhängen" -#. translator: %d always has a value larger than 1 -#: catalog/dependency.c:1202 +#: catalog/dependency.c:1204 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" msgstr[0] "Löschvorgang löscht ebenfalls %d weiteres Objekt" msgstr[1] "Löschvorgang löscht ebenfalls %d weitere Objekte" -#: catalog/dependency.c:1863 +#: catalog/dependency.c:1873 #, c-format msgid "constant of the type %s cannot be used here" msgstr "Konstante vom Typ %s kann hier nicht verwendet werden" -#: catalog/heap.c:332 +#: catalog/heap.c:324 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "keine Berechtigung, um »%s.%s« zu erzeugen" -#: catalog/heap.c:334 +#: catalog/heap.c:326 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Änderungen an Systemkatalogen sind gegenwärtig nicht erlaubt." -#: catalog/heap.c:511 commands/tablecmds.c:2335 commands/tablecmds.c:2972 -#: commands/tablecmds.c:6567 +#: catalog/heap.c:463 commands/tablecmds.c:2338 commands/tablecmds.c:2975 +#: commands/tablecmds.c:6790 #, c-format msgid "tables can have at most %d columns" msgstr "Tabellen können höchstens %d Spalten haben" -#: catalog/heap.c:529 commands/tablecmds.c:6866 +#: catalog/heap.c:481 commands/tablecmds.c:7090 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "Spaltenname »%s« steht im Konflikt mit dem Namen einer Systemspalte" -#: catalog/heap.c:545 +#: catalog/heap.c:497 #, c-format msgid "column name \"%s\" specified more than once" msgstr "Spaltenname »%s« mehrmals angegeben" #. translator: first %s is an integer not a name -#: catalog/heap.c:620 +#: catalog/heap.c:572 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "Partitionierungsschlüsselspalte %s hat Pseudotyp %s" -#: catalog/heap.c:625 +#: catalog/heap.c:577 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "Spalte »%s« hat Pseudotyp %s" -#: catalog/heap.c:656 +#: catalog/heap.c:608 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "zusammengesetzter Typ %s kann nicht Teil von sich selbst werden" #. translator: first %s is an integer not a name -#: catalog/heap.c:711 +#: catalog/heap.c:663 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "für Partitionierungsschlüsselspalte %s mit sortierbarem Typ %s wurde keine Sortierfolge abgeleitet" -#: catalog/heap.c:717 commands/createas.c:203 commands/createas.c:506 +#: catalog/heap.c:669 commands/createas.c:203 commands/createas.c:500 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "für Spalte »%s« mit sortierbarem Typ %s wurde keine Sortierfolge abgeleitet" -#: catalog/heap.c:1199 catalog/index.c:870 commands/createas.c:411 -#: commands/tablecmds.c:3853 +#: catalog/heap.c:1145 catalog/index.c:874 commands/createas.c:405 +#: commands/tablecmds.c:3880 #, c-format msgid "relation \"%s\" already exists" msgstr "Relation »%s« existiert bereits" -#: catalog/heap.c:1215 catalog/pg_type.c:435 catalog/pg_type.c:773 -#: catalog/pg_type.c:920 commands/typecmds.c:249 commands/typecmds.c:261 -#: commands/typecmds.c:757 commands/typecmds.c:1172 commands/typecmds.c:1398 -#: commands/typecmds.c:1590 commands/typecmds.c:2563 +#: catalog/heap.c:1161 catalog/pg_type.c:436 catalog/pg_type.c:781 +#: catalog/pg_type.c:928 commands/typecmds.c:249 commands/typecmds.c:261 +#: commands/typecmds.c:754 commands/typecmds.c:1169 commands/typecmds.c:1395 +#: commands/typecmds.c:1575 commands/typecmds.c:2547 #, c-format msgid "type \"%s\" already exists" msgstr "Typ »%s« existiert bereits" -#: catalog/heap.c:1216 +#: catalog/heap.c:1162 #, c-format msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." msgstr "Eine Relation hat einen zugehörigen Typ mit dem selben Namen, daher müssen Sie einen Namen wählen, der nicht mit einem bestehenden Typ kollidiert." -#: catalog/heap.c:1245 +#: catalog/heap.c:1202 +#, fuzzy, c-format +#| msgid "pg_class index OID value not set when in binary upgrade mode" +msgid "toast relfilenode value not set when in binary upgrade mode" +msgstr "Index-OID-Wert für pg_class ist im Binary-Upgrade-Modus nicht gesetzt" + +#: catalog/heap.c:1213 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "Heap-OID-Wert für pg_class ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/heap.c:2450 +#: catalog/heap.c:1223 +#, fuzzy, c-format +#| msgid "pg_class index OID value not set when in binary upgrade mode" +msgid "relfilenode value not set when in binary upgrade mode" +msgstr "Index-OID-Wert für pg_class ist im Binary-Upgrade-Modus nicht gesetzt" + +#: catalog/heap.c:2127 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "zur partitionierten Tabelle »%s« kann kein NO-INHERIT-Constraint hinzugefügt werden" -#: catalog/heap.c:2722 +#: catalog/heap.c:2401 #, c-format msgid "check constraint \"%s\" already exists" msgstr "Check-Constraint »%s« existiert bereits" -#: catalog/heap.c:2892 catalog/index.c:884 catalog/pg_constraint.c:670 -#: commands/tablecmds.c:8581 +#: catalog/heap.c:2571 catalog/index.c:888 catalog/pg_constraint.c:689 +#: commands/tablecmds.c:8792 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "Constraint »%s« existiert bereits für Relation »%s«" -#: catalog/heap.c:2899 +#: catalog/heap.c:2578 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "Constraint »%s« kollidiert mit nicht vererbtem Constraint für Relation »%s«" -#: catalog/heap.c:2910 +#: catalog/heap.c:2589 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "Constraint »%s« kollidiert mit vererbtem Constraint für Relation »%s«" -#: catalog/heap.c:2920 +#: catalog/heap.c:2599 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "Constraint »%s« kollidiert mit NOT-VALID-Constraint für Relation »%s«" -#: catalog/heap.c:2925 +#: catalog/heap.c:2604 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "Constraint »%s« wird mit geerbter Definition zusammengeführt" -#: catalog/heap.c:3030 +#: catalog/heap.c:2709 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "generierte Spalte »%s« kann nicht im Spaltengenerierungsausdruck verwendet werden" -#: catalog/heap.c:3032 +#: catalog/heap.c:2711 #, c-format msgid "A generated column cannot reference another generated column." msgstr "Eine generierte Spalte kann nicht auf eine andere generierte Spalte verweisen." -#: catalog/heap.c:3038 +#: catalog/heap.c:2717 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "Variable mit Verweis auf die ganze Zeile kann nicht im Spaltengenerierungsausdruck verwendet werden" -#: catalog/heap.c:3039 +#: catalog/heap.c:2718 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "Dadurch würde die generierte Spalte von ihrem eigenen Wert abhängen." -#: catalog/heap.c:3092 +#: catalog/heap.c:2771 #, c-format msgid "generation expression is not immutable" msgstr "Generierungsausdruck ist nicht »immutable«" -#: catalog/heap.c:3120 rewrite/rewriteHandler.c:1245 +#: catalog/heap.c:2799 rewrite/rewriteHandler.c:1268 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "Spalte »%s« hat Typ %s, aber der Vorgabeausdruck hat Typ %s" -#: catalog/heap.c:3125 commands/prepare.c:367 parser/analyze.c:2637 -#: parser/parse_target.c:595 parser/parse_target.c:883 -#: parser/parse_target.c:893 rewrite/rewriteHandler.c:1250 +#: catalog/heap.c:2804 commands/prepare.c:334 parser/analyze.c:2692 +#: parser/parse_target.c:594 parser/parse_target.c:882 +#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1273 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Sie müssen den Ausdruck umschreiben oder eine Typumwandlung vornehmen." -#: catalog/heap.c:3172 +#: catalog/heap.c:2851 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "nur Verweise auf Tabelle »%s« sind im Check-Constraint zugelassen" -#: catalog/heap.c:3470 +#: catalog/heap.c:3149 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "nicht unterstützte Kombination aus ON COMMIT und Fremdschlüssel" -#: catalog/heap.c:3471 +#: catalog/heap.c:3150 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "Tabelle »%s« verweist auf »%s«, aber sie haben nicht die gleiche ON-COMMIT-Einstellung." -#: catalog/heap.c:3476 +#: catalog/heap.c:3155 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "kann eine Tabelle, die in einen Fremdschlüssel-Constraint eingebunden ist, nicht leeren" -#: catalog/heap.c:3477 +#: catalog/heap.c:3156 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Tabelle »%s« verweist auf »%s«." -#: catalog/heap.c:3479 +#: catalog/heap.c:3158 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Leeren Sie die Tabelle »%s« gleichzeitig oder verwenden Sie TRUNCATE ... CASCADE." -#: catalog/index.c:221 parser/parse_utilcmd.c:2182 +#: catalog/index.c:223 parser/parse_utilcmd.c:2174 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "mehrere Primärschlüssel für Tabelle »%s« nicht erlaubt" -#: catalog/index.c:239 +#: catalog/index.c:241 #, c-format msgid "primary keys cannot be expressions" msgstr "Primärschlüssel können keine Ausdrücke sein" -#: catalog/index.c:256 +#: catalog/index.c:258 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "Primärschlüsselspalte »%s« ist nicht als NOT NULL markiert" -#: catalog/index.c:769 catalog/index.c:1905 +#: catalog/index.c:773 catalog/index.c:1932 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "benutzerdefinierte Indexe für Systemkatalogtabellen werden nicht unterstützt" -#: catalog/index.c:809 +#: catalog/index.c:813 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "nichtdeterministische Sortierfolgen werden von Operatorklasse »%s« nicht unterstützt" -#: catalog/index.c:824 +#: catalog/index.c:828 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "nebenläufige Indexerzeugung für Systemkatalogtabellen wird nicht unterstützt" -#: catalog/index.c:833 catalog/index.c:1284 +#: catalog/index.c:837 catalog/index.c:1305 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "nebenläufige Indexerzeugung für Exclusion-Constraints wird nicht unterstützt" -#: catalog/index.c:842 +#: catalog/index.c:846 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "Cluster-globale Indexe können nicht nach initdb erzeugt werden" -#: catalog/index.c:862 commands/createas.c:417 commands/sequence.c:154 -#: parser/parse_utilcmd.c:211 +#: catalog/index.c:866 commands/createas.c:411 commands/sequence.c:150 +#: parser/parse_utilcmd.c:201 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "Relation »%s« existiert bereits, wird übersprungen" -#: catalog/index.c:912 +#: catalog/index.c:916 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "Index-OID-Wert für pg_class ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/index.c:2191 +#: catalog/index.c:926 +#, fuzzy, c-format +#| msgid "pg_class index OID value not set when in binary upgrade mode" +msgid "index relfilenode value not set when in binary upgrade mode" +msgstr "Index-OID-Wert für pg_class ist im Binary-Upgrade-Modus nicht gesetzt" + +#: catalog/index.c:2231 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY muss die erste Aktion in einer Transaktion sein" -#: catalog/index.c:3576 +#: catalog/index.c:3633 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht reindizieren" -#: catalog/index.c:3587 commands/indexcmds.c:3426 +#: catalog/index.c:3644 commands/indexcmds.c:3466 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "ungültiger Index einer TOAST-Tabelle kann nicht reindiziert werden" -#: catalog/index.c:3603 commands/indexcmds.c:3306 commands/indexcmds.c:3450 -#: commands/tablecmds.c:3292 +#: catalog/index.c:3660 commands/indexcmds.c:3346 commands/indexcmds.c:3490 +#: commands/tablecmds.c:3295 #, c-format msgid "cannot move system relation \"%s\"" msgstr "Systemrelation »%s« kann nicht verschoben werden" -#: catalog/index.c:3747 +#: catalog/index.c:3804 #, c-format msgid "index \"%s\" was reindexed" msgstr "Index »%s« wurde neu indiziert" -#: catalog/index.c:3878 +#: catalog/index.c:3941 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "ungültiger Index »%s.%s« einer TOAST-Tabelle kann nicht reindizert werden, wird übersprungen" -#: catalog/namespace.c:257 catalog/namespace.c:461 catalog/namespace.c:553 -#: commands/trigger.c:5134 +#: catalog/namespace.c:259 catalog/namespace.c:463 catalog/namespace.c:555 +#: commands/trigger.c:5668 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: »%s.%s.%s«" -#: catalog/namespace.c:314 +#: catalog/namespace.c:316 #, c-format msgid "temporary tables cannot specify a schema name" msgstr "temporäre Tabellen können keinen Schemanamen angeben" -#: catalog/namespace.c:395 +#: catalog/namespace.c:397 #, c-format msgid "could not obtain lock on relation \"%s.%s\"" msgstr "konnte Sperre für Relation »%s.%s« nicht setzen" -#: catalog/namespace.c:400 commands/lockcmds.c:143 commands/lockcmds.c:228 +#: catalog/namespace.c:402 commands/lockcmds.c:144 commands/lockcmds.c:233 #, c-format msgid "could not obtain lock on relation \"%s\"" msgstr "konnte Sperre für Relation »%s« nicht setzen" -#: catalog/namespace.c:428 parser/parse_relation.c:1362 +#: catalog/namespace.c:430 parser/parse_relation.c:1373 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "Relation »%s.%s« existiert nicht" -#: catalog/namespace.c:433 parser/parse_relation.c:1375 -#: parser/parse_relation.c:1383 +#: catalog/namespace.c:435 parser/parse_relation.c:1386 +#: parser/parse_relation.c:1394 #, c-format msgid "relation \"%s\" does not exist" msgstr "Relation »%s« existiert nicht" -#: catalog/namespace.c:499 catalog/namespace.c:3029 commands/extension.c:1519 -#: commands/extension.c:1525 +#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1531 +#: commands/extension.c:1537 #, c-format msgid "no schema has been selected to create in" msgstr "kein Schema für die Objekterzeugung ausgewählt" -#: catalog/namespace.c:651 catalog/namespace.c:664 +#: catalog/namespace.c:653 catalog/namespace.c:666 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "kann keine Relationen in temporären Schemas anderer Sitzungen erzeugen" -#: catalog/namespace.c:655 +#: catalog/namespace.c:657 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "kann keine temporäre Relation in einem nicht-temporären Schema erzeugen" -#: catalog/namespace.c:670 +#: catalog/namespace.c:672 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "nur temporäre Relationen können in temporären Schemas erzeugt werden" -#: catalog/namespace.c:2221 +#: catalog/namespace.c:2268 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "Statistikobjekt »%s« existiert nicht" -#: catalog/namespace.c:2344 +#: catalog/namespace.c:2391 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "Textsucheparser »%s« existiert nicht" -#: catalog/namespace.c:2470 +#: catalog/namespace.c:2517 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "Textsuchewörterbuch »%s« existiert nicht" -#: catalog/namespace.c:2597 +#: catalog/namespace.c:2644 #, c-format msgid "text search template \"%s\" does not exist" msgstr "Textsuchevorlage »%s« existiert nicht" -#: catalog/namespace.c:2723 commands/tsearchcmds.c:1121 +#: catalog/namespace.c:2770 commands/tsearchcmds.c:1121 #: utils/cache/ts_cache.c:613 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "Textsuchekonfiguration »%s« existiert nicht" -#: catalog/namespace.c:2836 parser/parse_expr.c:810 parser/parse_target.c:1256 +#: catalog/namespace.c:2883 parser/parse_expr.c:868 parser/parse_target.c:1255 #, c-format msgid "cross-database references are not implemented: %s" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s" -#: catalog/namespace.c:2842 gram.y:15126 gram.y:17084 parser/parse_expr.c:817 -#: parser/parse_target.c:1263 +#: catalog/namespace.c:2889 gram.y:19330 gram.y:19370 parser/parse_expr.c:875 +#: parser/parse_target.c:1262 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "falscher qualifizierter Name (zu viele Namensteile): %s" -#: catalog/namespace.c:2972 +#: catalog/namespace.c:3019 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "Objekte können nicht in oder aus temporären Schemas verschoben werden" -#: catalog/namespace.c:2978 +#: catalog/namespace.c:3025 #, c-format msgid "cannot move objects into or out of TOAST schema" msgstr "Objekte können nicht in oder aus TOAST-Schemas verschoben werden" -#: catalog/namespace.c:3051 commands/schemacmds.c:233 commands/schemacmds.c:313 -#: commands/tablecmds.c:1243 +#: catalog/namespace.c:3098 commands/schemacmds.c:234 commands/schemacmds.c:314 +#: commands/tablecmds.c:1271 #, c-format msgid "schema \"%s\" does not exist" msgstr "Schema »%s« existiert nicht" -#: catalog/namespace.c:3082 +#: catalog/namespace.c:3129 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "falscher Relationsname (zu viele Namensteile): %s" -#: catalog/namespace.c:3645 +#: catalog/namespace.c:3692 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "Sortierfolge »%s« für Kodierung »%s« existiert nicht" -#: catalog/namespace.c:3700 +#: catalog/namespace.c:3747 #, c-format msgid "conversion \"%s\" does not exist" msgstr "Konversion »%s« existiert nicht" -#: catalog/namespace.c:3964 +#: catalog/namespace.c:4011 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "keine Berechtigung, um temporäre Tabellen in Datenbank »%s« zu erzeugen" -#: catalog/namespace.c:3980 +#: catalog/namespace.c:4027 #, c-format msgid "cannot create temporary tables during recovery" msgstr "während der Wiederherstellung können keine temporären Tabellen erzeugt werden" -#: catalog/namespace.c:3986 +#: catalog/namespace.c:4033 #, c-format msgid "cannot create temporary tables during a parallel operation" msgstr "während einer parallelen Operation können keine temporären Tabellen erzeugt werden" -#: catalog/namespace.c:4285 commands/tablespace.c:1217 commands/variable.c:64 -#: utils/misc/guc.c:11585 utils/misc/guc.c:11663 +#: catalog/namespace.c:4334 commands/tablespace.c:1258 commands/variable.c:64 +#: utils/misc/guc.c:11948 utils/misc/guc.c:12050 #, c-format msgid "List syntax is invalid." msgstr "Die Listensyntax ist ungültig." -#: catalog/objectaddress.c:1370 catalog/pg_publication.c:57 -#: commands/policy.c:95 commands/policy.c:375 commands/policy.c:465 -#: commands/tablecmds.c:243 commands/tablecmds.c:285 commands/tablecmds.c:2145 -#: commands/tablecmds.c:6016 commands/tablecmds.c:11673 +#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 +#: commands/tablecmds.c:246 commands/tablecmds.c:288 commands/tablecmds.c:2182 +#: commands/tablecmds.c:12209 #, c-format msgid "\"%s\" is not a table" msgstr "»%s« ist keine Tabelle" -#: catalog/objectaddress.c:1377 commands/tablecmds.c:255 -#: commands/tablecmds.c:6046 commands/tablecmds.c:16471 commands/view.c:119 +#: catalog/objectaddress.c:1398 commands/tablecmds.c:258 +#: commands/tablecmds.c:17079 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "»%s« ist keine Sicht" -#: catalog/objectaddress.c:1384 commands/matview.c:175 commands/tablecmds.c:261 -#: commands/tablecmds.c:16476 +#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:264 +#: commands/tablecmds.c:17084 #, c-format msgid "\"%s\" is not a materialized view" msgstr "»%s« ist keine materialisierte Sicht" -#: catalog/objectaddress.c:1391 commands/tablecmds.c:279 -#: commands/tablecmds.c:6049 commands/tablecmds.c:16481 +#: catalog/objectaddress.c:1412 commands/tablecmds.c:282 +#: commands/tablecmds.c:17089 #, c-format msgid "\"%s\" is not a foreign table" msgstr "»%s« ist keine Fremdtabelle" -#: catalog/objectaddress.c:1432 +#: catalog/objectaddress.c:1453 #, c-format msgid "must specify relation and object name" msgstr "Relations- und Objektname müssen angegeben werden" -#: catalog/objectaddress.c:1508 catalog/objectaddress.c:1561 +#: catalog/objectaddress.c:1529 catalog/objectaddress.c:1582 #, c-format msgid "column name must be qualified" msgstr "Spaltenname muss qualifiziert werden" -#: catalog/objectaddress.c:1608 +#: catalog/objectaddress.c:1601 #, c-format msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "Vorgabewert für Spalte »%s« von Relation »%s« existiert nicht" -#: catalog/objectaddress.c:1645 commands/functioncmds.c:137 -#: commands/tablecmds.c:271 commands/typecmds.c:274 commands/typecmds.c:3713 -#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:791 -#: utils/adt/acl.c:4411 +#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 +#: commands/tablecmds.c:274 commands/typecmds.c:274 commands/typecmds.c:3700 +#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:795 +#: utils/adt/acl.c:4434 #, c-format msgid "type \"%s\" does not exist" msgstr "Typ »%s« existiert nicht" -#: catalog/objectaddress.c:1764 +#: catalog/objectaddress.c:1757 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "Operator %d (%s, %s) von %s existiert nicht" -#: catalog/objectaddress.c:1795 +#: catalog/objectaddress.c:1788 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "Funktion %d (%s, %s) von %s existiert nicht" -#: catalog/objectaddress.c:1846 catalog/objectaddress.c:1872 +#: catalog/objectaddress.c:1839 catalog/objectaddress.c:1865 #, c-format msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "Benutzerabbildung für Benutzer »%s« auf Server »%s« existiert nicht" -#: catalog/objectaddress.c:1861 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:988 commands/foreigncmds.c:1347 foreign/foreign.c:723 +#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:984 commands/foreigncmds.c:1343 foreign/foreign.c:691 #, c-format msgid "server \"%s\" does not exist" msgstr "Server »%s« existiert nicht" -#: catalog/objectaddress.c:1928 +#: catalog/objectaddress.c:1921 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "Publikationsrelation »%s« in Publikation »%s« existiert nicht" -#: catalog/objectaddress.c:1990 +#: catalog/objectaddress.c:1968 +#, fuzzy, c-format +#| msgid "publication relation \"%s\" in publication \"%s\" does not exist" +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "Publikationsrelation »%s« in Publikation »%s« existiert nicht" + +#: catalog/objectaddress.c:2026 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "unbekannter Standard-ACL-Objekttyp »%c«" -#: catalog/objectaddress.c:1991 +#: catalog/objectaddress.c:2027 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "Gültige Objekttypen sind »%c«, »%c«, »%c«, »%c«, »%c«." -#: catalog/objectaddress.c:2042 +#: catalog/objectaddress.c:2078 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "Standard-ACL für Benutzer »%s« in Schema »%s« für %s existiert nicht" -#: catalog/objectaddress.c:2047 +#: catalog/objectaddress.c:2083 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "Standard-ACL für Benutzer »%s« für %s existiert nicht" -#: catalog/objectaddress.c:2074 catalog/objectaddress.c:2132 -#: catalog/objectaddress.c:2189 +#: catalog/objectaddress.c:2110 catalog/objectaddress.c:2168 +#: catalog/objectaddress.c:2225 #, c-format msgid "name or argument lists may not contain nulls" msgstr "Namens- oder Argumentlisten dürfen keine NULL-Werte enthalten" -#: catalog/objectaddress.c:2108 +#: catalog/objectaddress.c:2144 #, c-format msgid "unsupported object type \"%s\"" msgstr "nicht unterstützter Objekttyp »%s«" -#: catalog/objectaddress.c:2128 catalog/objectaddress.c:2146 -#: catalog/objectaddress.c:2287 +#: catalog/objectaddress.c:2164 catalog/objectaddress.c:2182 +#: catalog/objectaddress.c:2325 #, c-format msgid "name list length must be exactly %d" msgstr "Länge der Namensliste muss genau %d sein" -#: catalog/objectaddress.c:2150 +#: catalog/objectaddress.c:2186 #, c-format msgid "large object OID may not be null" msgstr "Large-Object-OID darf nicht NULL sein" -#: catalog/objectaddress.c:2159 catalog/objectaddress.c:2222 -#: catalog/objectaddress.c:2229 +#: catalog/objectaddress.c:2195 catalog/objectaddress.c:2259 +#: catalog/objectaddress.c:2266 #, c-format msgid "name list length must be at least %d" msgstr "Länge der Namensliste muss mindestens %d sein" -#: catalog/objectaddress.c:2215 catalog/objectaddress.c:2236 +#: catalog/objectaddress.c:2252 catalog/objectaddress.c:2273 #, c-format msgid "argument list length must be exactly %d" msgstr "Länge der Argumentliste muss genau %d sein" -#: catalog/objectaddress.c:2488 libpq/be-fsstubs.c:321 +#: catalog/objectaddress.c:2527 libpq/be-fsstubs.c:318 #, c-format msgid "must be owner of large object %u" msgstr "Berechtigung nur für Eigentümer des Large Object %u" -#: catalog/objectaddress.c:2503 commands/functioncmds.c:1556 +#: catalog/objectaddress.c:2542 commands/functioncmds.c:1566 #, c-format msgid "must be owner of type %s or type %s" msgstr "Berechtigung nur für Eigentümer des Typs %s oder des Typs %s" -#: catalog/objectaddress.c:2553 catalog/objectaddress.c:2570 +#: catalog/objectaddress.c:2592 catalog/objectaddress.c:2610 #, c-format msgid "must be superuser" msgstr "Berechtigung nur für Superuser" -#: catalog/objectaddress.c:2560 +#: catalog/objectaddress.c:2599 #, c-format msgid "must have CREATEROLE privilege" msgstr "Berechtigung nur mit CREATEROLE-Privileg" -#: catalog/objectaddress.c:2639 +#: catalog/objectaddress.c:2680 #, c-format msgid "unrecognized object type \"%s\"" msgstr "unbekannter Objekttyp »%s«" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2882 +#: catalog/objectaddress.c:2972 #, c-format msgid "column %s of %s" msgstr "Spalte %s von %s" -#: catalog/objectaddress.c:2897 +#: catalog/objectaddress.c:2987 #, c-format msgid "function %s" msgstr "Funktion %s" -#: catalog/objectaddress.c:2910 +#: catalog/objectaddress.c:3000 #, c-format msgid "type %s" msgstr "Typ %s" -#: catalog/objectaddress.c:2947 +#: catalog/objectaddress.c:3037 #, c-format msgid "cast from %s to %s" msgstr "Typumwandlung von %s in %s" -#: catalog/objectaddress.c:2980 +#: catalog/objectaddress.c:3070 #, c-format msgid "collation %s" msgstr "Sortierfolge %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3011 +#: catalog/objectaddress.c:3101 #, c-format msgid "constraint %s on %s" msgstr "Constraint %s für %s" -#: catalog/objectaddress.c:3017 +#: catalog/objectaddress.c:3107 #, c-format msgid "constraint %s" msgstr "Constraint %s" -#: catalog/objectaddress.c:3049 +#: catalog/objectaddress.c:3139 #, c-format msgid "conversion %s" msgstr "Konversion %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3095 +#: catalog/objectaddress.c:3161 #, c-format msgid "default value for %s" msgstr "Vorgabewert für %s" -#: catalog/objectaddress.c:3109 +#: catalog/objectaddress.c:3172 #, c-format msgid "language %s" msgstr "Sprache %s" -#: catalog/objectaddress.c:3117 +#: catalog/objectaddress.c:3180 #, c-format msgid "large object %u" msgstr "Large Object %u" -#: catalog/objectaddress.c:3130 +#: catalog/objectaddress.c:3193 #, c-format msgid "operator %s" msgstr "Operator %s" -#: catalog/objectaddress.c:3167 +#: catalog/objectaddress.c:3230 #, c-format msgid "operator class %s for access method %s" msgstr "Operatorklasse %s für Zugriffsmethode %s" -#: catalog/objectaddress.c:3195 +#: catalog/objectaddress.c:3258 #, c-format msgid "access method %s" msgstr "Zugriffsmethode %s" @@ -4853,7 +4862,7 @@ msgstr "Zugriffsmethode %s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3244 +#: catalog/objectaddress.c:3307 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "Operator %d (%s, %s) von %s: %s" @@ -4862,221 +4871,232 @@ msgstr "Operator %d (%s, %s) von %s: %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3301 +#: catalog/objectaddress.c:3364 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "Funktion %d (%s, %s) von %s: %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3353 +#: catalog/objectaddress.c:3416 #, c-format msgid "rule %s on %s" msgstr "Regel %s für %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3399 +#: catalog/objectaddress.c:3462 #, c-format msgid "trigger %s on %s" msgstr "Trigger %s für %s" -#: catalog/objectaddress.c:3419 +#: catalog/objectaddress.c:3482 #, c-format msgid "schema %s" msgstr "Schema %s" -#: catalog/objectaddress.c:3447 +#: catalog/objectaddress.c:3510 #, c-format msgid "statistics object %s" msgstr "Statistikobjekt %s" -#: catalog/objectaddress.c:3478 +#: catalog/objectaddress.c:3541 #, c-format msgid "text search parser %s" msgstr "Textsucheparser %s" -#: catalog/objectaddress.c:3509 +#: catalog/objectaddress.c:3572 #, c-format msgid "text search dictionary %s" msgstr "Textsuchewörterbuch %s" -#: catalog/objectaddress.c:3540 +#: catalog/objectaddress.c:3603 #, c-format msgid "text search template %s" msgstr "Textsuchevorlage %s" -#: catalog/objectaddress.c:3571 +#: catalog/objectaddress.c:3634 #, c-format msgid "text search configuration %s" msgstr "Textsuchekonfiguration %s" -#: catalog/objectaddress.c:3584 +#: catalog/objectaddress.c:3647 #, c-format msgid "role %s" msgstr "Rolle %s" -#: catalog/objectaddress.c:3600 +#: catalog/objectaddress.c:3663 #, c-format msgid "database %s" msgstr "Datenbank %s" -#: catalog/objectaddress.c:3616 +#: catalog/objectaddress.c:3679 #, c-format msgid "tablespace %s" msgstr "Tablespace %s" -#: catalog/objectaddress.c:3627 +#: catalog/objectaddress.c:3690 #, c-format msgid "foreign-data wrapper %s" msgstr "Fremddaten-Wrapper %s" -#: catalog/objectaddress.c:3637 +#: catalog/objectaddress.c:3700 #, c-format msgid "server %s" msgstr "Server %s" -#: catalog/objectaddress.c:3670 +#: catalog/objectaddress.c:3733 #, c-format msgid "user mapping for %s on server %s" msgstr "Benutzerabbildung für %s auf Server %s" -#: catalog/objectaddress.c:3722 +#: catalog/objectaddress.c:3785 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "Vorgabeprivilegien für neue Relationen von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3726 +#: catalog/objectaddress.c:3789 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "Vorgabeprivilegien für neue Relationen von Rolle %s" -#: catalog/objectaddress.c:3732 +#: catalog/objectaddress.c:3795 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "Vorgabeprivilegien für neue Sequenzen von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3736 +#: catalog/objectaddress.c:3799 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "Vorgabeprivilegien für neue Sequenzen von Rolle %s" -#: catalog/objectaddress.c:3742 +#: catalog/objectaddress.c:3805 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "Vorgabeprivilegien für neue Funktionen von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3746 +#: catalog/objectaddress.c:3809 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "Vorgabeprivilegien für neue Funktionen von Rolle %s" -#: catalog/objectaddress.c:3752 +#: catalog/objectaddress.c:3815 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "Vorgabeprivilegien für neue Typen von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3756 +#: catalog/objectaddress.c:3819 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "Vorgabeprivilegien für neue Typen von Rolle %s" -#: catalog/objectaddress.c:3762 +#: catalog/objectaddress.c:3825 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "Vorgabeprivilegien für neue Schemas von Rolle %s" -#: catalog/objectaddress.c:3769 +#: catalog/objectaddress.c:3832 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "Vorgabeprivilegien von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3773 +#: catalog/objectaddress.c:3836 #, c-format msgid "default privileges belonging to role %s" msgstr "Vorgabeprivilegien von Rolle %s" -#: catalog/objectaddress.c:3795 +#: catalog/objectaddress.c:3858 #, c-format msgid "extension %s" msgstr "Erweiterung %s" -#: catalog/objectaddress.c:3812 +#: catalog/objectaddress.c:3875 #, c-format msgid "event trigger %s" msgstr "Ereignistrigger %s" +#: catalog/objectaddress.c:3902 +#, c-format +msgid "parameter %s" +msgstr "Parameter %s" + #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3856 +#: catalog/objectaddress.c:3945 #, c-format msgid "policy %s on %s" msgstr "Policy %s für %s" -#: catalog/objectaddress.c:3870 +#: catalog/objectaddress.c:3959 #, c-format msgid "publication %s" msgstr "Publikation %s" +#: catalog/objectaddress.c:3972 +#, fuzzy, c-format +#| msgid "publication of %s in publication %s" +msgid "publication of schema %s in publication %s" +msgstr "Publikation von %s in Publikation %s" + #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:3898 +#: catalog/objectaddress.c:4003 #, c-format msgid "publication of %s in publication %s" msgstr "Publikation von %s in Publikation %s" -#: catalog/objectaddress.c:3911 +#: catalog/objectaddress.c:4016 #, c-format msgid "subscription %s" msgstr "Subskription %s" -#: catalog/objectaddress.c:3932 +#: catalog/objectaddress.c:4037 #, c-format msgid "transform for %s language %s" msgstr "Transformation %s für Sprache %s" -#: catalog/objectaddress.c:4003 +#: catalog/objectaddress.c:4108 #, c-format msgid "table %s" msgstr "Tabelle %s" -#: catalog/objectaddress.c:4008 +#: catalog/objectaddress.c:4113 #, c-format msgid "index %s" msgstr "Index %s" -#: catalog/objectaddress.c:4012 +#: catalog/objectaddress.c:4117 #, c-format msgid "sequence %s" msgstr "Sequenz %s" -#: catalog/objectaddress.c:4016 +#: catalog/objectaddress.c:4121 #, c-format msgid "toast table %s" msgstr "TOAST-Tabelle %s" -#: catalog/objectaddress.c:4020 +#: catalog/objectaddress.c:4125 #, c-format msgid "view %s" msgstr "Sicht %s" -#: catalog/objectaddress.c:4024 +#: catalog/objectaddress.c:4129 #, c-format msgid "materialized view %s" msgstr "materialisierte Sicht %s" -#: catalog/objectaddress.c:4028 +#: catalog/objectaddress.c:4133 #, c-format msgid "composite type %s" msgstr "zusammengesetzter Typ %s" -#: catalog/objectaddress.c:4032 +#: catalog/objectaddress.c:4137 #, c-format msgid "foreign table %s" msgstr "Fremdtabelle %s" -#: catalog/objectaddress.c:4037 +#: catalog/objectaddress.c:4142 #, c-format msgid "relation %s" msgstr "Relation %s" -#: catalog/objectaddress.c:4078 +#: catalog/objectaddress.c:4183 #, c-format msgid "operator family %s for access method %s" msgstr "Operatorfamilie %s für Zugriffsmethode %s" @@ -5118,7 +5138,7 @@ msgstr "Anfangswert darf nicht ausgelassen werden, wenn Übergangsfunktion strik msgid "return type of inverse transition function %s is not %s" msgstr "Rückgabetyp der inversen Übergangsfunktion %s ist nicht %s" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2852 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2978 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "Striktheit der vorwärtigen und inversen Übergangsfunktionen einer Aggregatfunktion müssen übereinstimmen" @@ -5133,7 +5153,7 @@ msgstr "Abschlussfunktion mit zusätzlichen Argumenten darf nicht als STRICT dek msgid "return type of combine function %s is not %s" msgstr "Rückgabetyp der Kombinierfunktion %s ist nicht %s" -#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:4128 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3883 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "Kombinierfunktion mit Übergangstyp %s darf nicht als STRICT deklariert sein" @@ -5148,12 +5168,12 @@ msgstr "Rückgabetyp der Serialisierungsfunktion %s ist nicht %s" msgid "return type of deserialization function %s is not %s" msgstr "Rückgabetyp der Deserialisierungsfunktion %s ist nicht %s" -#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:189 catalog/pg_proc.c:223 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:191 catalog/pg_proc.c:225 #, c-format msgid "cannot determine result data type" msgstr "kann Ergebnisdatentyp nicht bestimmen" -#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:202 catalog/pg_proc.c:231 +#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:204 catalog/pg_proc.c:233 #, c-format msgid "unsafe use of pseudo-type \"internal\"" msgstr "unsichere Verwendung des Pseudotyps »internal«" @@ -5168,7 +5188,7 @@ msgstr "Moving-Aggregat-Implementierung gibt Typ %s zurück, aber die normale Im msgid "sort operator can only be specified for single-argument aggregates" msgstr "Sortieroperator kann nur für Aggregatfunktionen mit einem Argument angegeben werden" -#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:384 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 #, c-format msgid "cannot change routine kind" msgstr "kann Routinenart nicht ändern" @@ -5193,13 +5213,13 @@ msgstr "»%s« ist eine Hypothetical-Set-Aggregatfunktion." msgid "cannot change number of direct arguments of an aggregate function" msgstr "die Anzahl direkter Argumente einer Aggregatfunktion kann nicht geändert werden" -#: catalog/pg_aggregate.c:858 commands/functioncmds.c:676 -#: commands/typecmds.c:1992 commands/typecmds.c:2038 commands/typecmds.c:2090 -#: commands/typecmds.c:2127 commands/typecmds.c:2161 commands/typecmds.c:2195 -#: commands/typecmds.c:2229 commands/typecmds.c:2258 commands/typecmds.c:2345 -#: commands/typecmds.c:2387 parser/parse_func.c:416 parser/parse_func.c:447 -#: parser/parse_func.c:474 parser/parse_func.c:488 parser/parse_func.c:610 -#: parser/parse_func.c:630 parser/parse_func.c:2143 parser/parse_func.c:2334 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:695 +#: commands/typecmds.c:1976 commands/typecmds.c:2022 commands/typecmds.c:2074 +#: commands/typecmds.c:2111 commands/typecmds.c:2145 commands/typecmds.c:2179 +#: commands/typecmds.c:2213 commands/typecmds.c:2242 commands/typecmds.c:2329 +#: commands/typecmds.c:2371 parser/parse_func.c:417 parser/parse_func.c:448 +#: parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 +#: parser/parse_func.c:631 parser/parse_func.c:2173 parser/parse_func.c:2446 #, c-format msgid "function %s does not exist" msgstr "Funktion %s existiert nicht" @@ -5224,37 +5244,97 @@ msgstr "Funktion %s erfordert Typumwandlung zur Laufzeit" msgid "cast from type %s to type %s already exists" msgstr "Typumwandlung von Typ %s in Typ %s existiert bereits" -#: catalog/pg_collation.c:93 catalog/pg_collation.c:140 +#: catalog/pg_class.c:29 +#, fuzzy, c-format +#| msgid "This feature is not yet supported on partitioned tables." +msgid "This operation is not supported for tables." +msgstr "Dieses Feature wird für partitionierte Tabellen noch nicht unterstützt." + +#: catalog/pg_class.c:31 +#, fuzzy, c-format +#| msgid "This feature is not yet supported on partitioned tables." +msgid "This operation is not supported for indexes." +msgstr "Dieses Feature wird für partitionierte Tabellen noch nicht unterstützt." + +#: catalog/pg_class.c:33 +#, fuzzy, c-format +#| msgid "sequence option \"%s\" not supported here" +msgid "This operation is not supported for sequences." +msgstr "Sequenzoption »%s« wird hier nicht unterstützt" + +#: catalog/pg_class.c:35 +#, fuzzy, c-format +#| msgid "This feature is not yet supported on partitioned tables." +msgid "This operation is not supported for TOAST tables." +msgstr "Dieses Feature wird für partitionierte Tabellen noch nicht unterstützt." + +#: catalog/pg_class.c:37 +#, fuzzy, c-format +#| msgid "sequence option \"%s\" not supported here" +msgid "This operation is not supported for views." +msgstr "Sequenzoption »%s« wird hier nicht unterstützt" + +#: catalog/pg_class.c:39 +#, fuzzy, c-format +#| msgid "This feature is not yet supported on partitioned tables." +msgid "This operation is not supported for materialized views." +msgstr "Dieses Feature wird für partitionierte Tabellen noch nicht unterstützt." + +#: catalog/pg_class.c:41 +#, fuzzy, c-format +#| msgid "This feature is not yet supported on partitioned tables." +msgid "This operation is not supported for composite types." +msgstr "Dieses Feature wird für partitionierte Tabellen noch nicht unterstützt." + +#: catalog/pg_class.c:43 +#, fuzzy, c-format +#| msgid "unique constraints are not supported on foreign tables" +msgid "This operation is not supported for foreign tables." +msgstr "Unique-Constraints auf Fremdtabellen werden nicht unterstützt" + +#: catalog/pg_class.c:45 +#, fuzzy, c-format +#| msgid "This feature is not yet supported on partitioned tables." +msgid "This operation is not supported for partitioned tables." +msgstr "Dieses Feature wird für partitionierte Tabellen noch nicht unterstützt." + +#: catalog/pg_class.c:47 +#, fuzzy, c-format +#| msgid "This feature is not yet supported on partitioned tables." +msgid "This operation is not supported for partitioned indexes." +msgstr "Dieses Feature wird für partitionierte Tabellen noch nicht unterstützt." + +#: catalog/pg_collation.c:91 catalog/pg_collation.c:138 #, c-format msgid "collation \"%s\" already exists, skipping" msgstr "Sortierfolge »%s« existiert bereits, wird übersprungen" -#: catalog/pg_collation.c:95 +#: catalog/pg_collation.c:93 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" msgstr "Sortierfolge »%s« für Kodierung »%s« existiert bereits, wird übersprungen" -#: catalog/pg_collation.c:103 catalog/pg_collation.c:147 +#: catalog/pg_collation.c:101 catalog/pg_collation.c:145 #, c-format msgid "collation \"%s\" already exists" msgstr "Sortierfolge »%s« existiert bereits" -#: catalog/pg_collation.c:105 +#: catalog/pg_collation.c:103 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "Sortierfolge »%s« für Kodierung »%s« existiert bereits" -#: catalog/pg_constraint.c:678 +#: catalog/pg_constraint.c:697 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "Constraint »%s« für Domäne %s existiert bereits" -#: catalog/pg_constraint.c:874 catalog/pg_constraint.c:967 +#: catalog/pg_constraint.c:893 catalog/pg_constraint.c:986 #, c-format msgid "constraint \"%s\" for table \"%s\" does not exist" msgstr "Constraint »%s« für Tabelle »%s« existiert nicht" -#: catalog/pg_constraint.c:1056 +#: catalog/pg_constraint.c:1075 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "Constraint »%s« für Domäne %s existiert nicht" @@ -5269,12 +5349,12 @@ msgstr "Konversion »%s« existiert bereits" msgid "default conversion for %s to %s already exists" msgstr "Standardumwandlung von %s nach %s existiert bereits" -#: catalog/pg_depend.c:204 commands/extension.c:3343 +#: catalog/pg_depend.c:215 commands/extension.c:3267 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s ist schon Mitglied der Erweiterung »%s«" -#: catalog/pg_depend.c:580 +#: catalog/pg_depend.c:589 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "kann Abhängigkeit von %s nicht entfernen, weil es ein Systemobjekt ist" @@ -5315,33 +5395,32 @@ msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" msgstr "ALTER TYPE ADD BEFORE/AFTER ist mit Binary Upgrade inkompatibel" #: catalog/pg_inherits.c:593 -#, fuzzy, c-format -#| msgid "cannot inherit from partition \"%s\"" +#, c-format msgid "cannot detach partition \"%s\"" -msgstr "von Partition »%s« kann nicht geerbt werden" +msgstr "Partition »%s« kann nicht abgetrennt werden" #: catalog/pg_inherits.c:595 #, c-format msgid "The partition is being detached concurrently or has an unfinished detach." -msgstr "" +msgstr "Die Partition wird nebenläufig abgetrennt oder hat eine unfertige Abtrennoperation." -#: catalog/pg_inherits.c:596 +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4474 +#: commands/tablecmds.c:15352 #, c-format -msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation" -msgstr "" +msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." +msgstr "Verwendet Sie ALTER TABLE ... DETACH PARTITION ... FINALIZE, um die unerledigte Abtrennoperation abzuschließen." #: catalog/pg_inherits.c:600 -#, fuzzy, c-format -#| msgid "cannot cluster on partial index \"%s\"" +#, c-format msgid "cannot complete detaching partition \"%s\"" -msgstr "kann nicht anhand des partiellen Index »%s« clustern" +msgstr "kann Abtrennen der Partition »%s« nicht abschließen" #: catalog/pg_inherits.c:602 #, c-format msgid "There's no pending concurrent detach." -msgstr "" +msgstr "Es gibt keine unerledigte nebenläufige Abtrennoperation." -#: catalog/pg_namespace.c:64 commands/schemacmds.c:242 +#: catalog/pg_namespace.c:64 commands/schemacmds.c:243 #, c-format msgid "schema \"%s\" already exists" msgstr "Schema »%s« existiert bereits" @@ -5406,44 +5485,54 @@ msgstr "Operator %s existiert bereits" msgid "operator cannot be its own negator or sort operator" msgstr "Operator kann nicht sein eigener Negator oder Sortierungsoperator sein" -#: catalog/pg_proc.c:130 parser/parse_func.c:2205 +#: catalog/pg_parameter_acl.c:52 +#, c-format +msgid "parameter ACL \"%s\" does not exist" +msgstr "Parameter-ACL »%s« existiert nicht" + +#: catalog/pg_parameter_acl.c:87 +#, c-format +msgid "invalid parameter name \"%s\"" +msgstr "ungültiger Parametername »%s«" + +#: catalog/pg_proc.c:132 parser/parse_func.c:2235 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" msgstr[0] "Funktionen können nicht mehr als %d Argument haben" msgstr[1] "Funktionen können nicht mehr als %d Argumente haben" -#: catalog/pg_proc.c:374 +#: catalog/pg_proc.c:376 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "Funktion »%s« existiert bereits mit den selben Argumenttypen" -#: catalog/pg_proc.c:386 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is an aggregate function." msgstr "»%s« ist eine Aggregatfunktion." -#: catalog/pg_proc.c:388 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a function." msgstr "»%s« ist eine Funktion." -#: catalog/pg_proc.c:390 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a procedure." msgstr "»%s« ist eine Prozedur." -#: catalog/pg_proc.c:392 +#: catalog/pg_proc.c:394 #, c-format msgid "\"%s\" is a window function." msgstr "»%s« ist eine Fensterfunktion." -#: catalog/pg_proc.c:412 +#: catalog/pg_proc.c:414 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "man kann nicht ändern, ob eine Prozedur Ausgabeparameter hat" -#: catalog/pg_proc.c:413 catalog/pg_proc.c:443 +#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 #, c-format msgid "cannot change return type of existing function" msgstr "kann Rückgabetyp einer bestehenden Funktion nicht ändern" @@ -5452,13 +5541,13 @@ msgstr "kann Rückgabetyp einer bestehenden Funktion nicht ändern" #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: catalog/pg_proc.c:419 catalog/pg_proc.c:446 catalog/pg_proc.c:493 +#: catalog/pg_proc.c:421 catalog/pg_proc.c:448 catalog/pg_proc.c:493 #: catalog/pg_proc.c:519 catalog/pg_proc.c:545 #, c-format msgid "Use %s %s first." msgstr "Verwenden Sie zuerst %s %s." -#: catalog/pg_proc.c:444 +#: catalog/pg_proc.c:446 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "Der von OUT-Parametern bestimmte Zeilentyp ist verschieden." @@ -5478,63 +5567,106 @@ msgstr "kann Parametervorgabewerte einer bestehenden Funktion nicht entfernen" msgid "cannot change data type of existing parameter default value" msgstr "kann Datentyp eines bestehenden Parametervorgabewerts nicht ändern" -#: catalog/pg_proc.c:753 +#: catalog/pg_proc.c:757 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "es gibt keine eingebaute Funktion namens %s" -#: catalog/pg_proc.c:851 +#: catalog/pg_proc.c:855 #, c-format msgid "SQL functions cannot return type %s" msgstr "SQL-Funktionen können keinen Rückgabetyp »%s« haben" -#: catalog/pg_proc.c:866 +#: catalog/pg_proc.c:870 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "SQL-Funktionen können keine Argumente vom Typ »%s« haben" -#: catalog/pg_proc.c:978 executor/functions.c:1458 +#: catalog/pg_proc.c:1000 executor/functions.c:1458 #, c-format msgid "SQL function \"%s\"" msgstr "SQL-Funktion »%s«" -#: catalog/pg_publication.c:59 -#, c-format -msgid "Only tables can be added to publications." -msgstr "Nur Tabellen können Teil einer Publikationen sein." +#: catalog/pg_publication.c:63 catalog/pg_publication.c:71 +#: catalog/pg_publication.c:79 catalog/pg_publication.c:85 +#, fuzzy, c-format +#| msgid "cannot use relation \"%s.%s\" as logical replication target" +msgid "cannot add relation \"%s\" to publication" +msgstr "Relation »%s.%s« kann nicht als Ziel für logische Replikation verwendet werden" -#: catalog/pg_publication.c:65 -#, c-format -msgid "\"%s\" is a system table" -msgstr "»%s« ist eine Systemtabelle" +#: catalog/pg_publication.c:73 +#, fuzzy, c-format +#| msgid "This feature is not yet supported on partitioned tables." +msgid "This operation is not supported for system tables." +msgstr "Dieses Feature wird für partitionierte Tabellen noch nicht unterstützt." -#: catalog/pg_publication.c:67 -#, c-format -msgid "System tables cannot be added to publications." -msgstr "Systemtabellen können nicht Teil einer Publikationen sein." +#: catalog/pg_publication.c:81 +#, fuzzy, c-format +#| msgid "This feature is not yet supported on partitioned tables." +msgid "This operation is not supported for temporary tables." +msgstr "Dieses Feature wird für partitionierte Tabellen noch nicht unterstützt." -#: catalog/pg_publication.c:73 -#, c-format -msgid "table \"%s\" cannot be replicated" -msgstr "Tabelle »%s« kann nicht repliziert werden" +#: catalog/pg_publication.c:87 +#, fuzzy, c-format +#| msgid "This feature is not yet supported on partitioned tables." +msgid "This operation is not supported for unlogged tables." +msgstr "Dieses Feature wird für partitionierte Tabellen noch nicht unterstützt." -#: catalog/pg_publication.c:75 -#, c-format -msgid "Temporary and unlogged relations cannot be replicated." +#: catalog/pg_publication.c:101 catalog/pg_publication.c:109 +#: commands/publicationcmds.c:238 +#, fuzzy, c-format +#| msgid "cannot add column to a partition" +msgid "cannot add schema \"%s\" to publication" +msgstr "zu einer Partition kann keine Spalte hinzugefügt werden" + +#: catalog/pg_publication.c:103 +#, fuzzy, c-format +#| msgid "The prefix \"pg_\" is reserved for system schemas." +msgid "This operation is not supported for system schemas." +msgstr "Der Präfix »pg_« ist für Systemschemas reserviert." + +#: catalog/pg_publication.c:111 +#, fuzzy, c-format +#| msgid "Temporary and unlogged relations cannot be replicated." +msgid "Temporary schemas cannot be replicated." msgstr "Temporäre und ungeloggte Tabellen können nicht repliziert werden." -#: catalog/pg_publication.c:174 +#: catalog/pg_publication.c:374 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "Relation »%s« ist schon Mitglied der Publikation »%s«" -#: catalog/pg_publication.c:470 commands/publicationcmds.c:451 -#: commands/publicationcmds.c:739 +#: catalog/pg_publication.c:516 +#, fuzzy, c-format +#| msgid "cannot use system column \"%s\" in partition key" +msgid "cannot reference system column \"%s\" in publication column list" +msgstr "Systemspalte »%s« kann nicht im Partitionierungsschlüssel verwendet werden" + +#: catalog/pg_publication.c:522 +#, fuzzy, c-format +#| msgid "cannot use generated column \"%s\" in column generation expression" +msgid "cannot reference generated column \"%s\" in publication column list" +msgstr "generierte Spalte »%s« kann nicht im Spaltengenerierungsausdruck verwendet werden" + +#: catalog/pg_publication.c:528 +#, fuzzy, c-format +#| msgid "publication of %s in publication %s" +msgid "duplicate column \"%s\" in publication column list" +msgstr "Publikation von %s in Publikation %s" + +#: catalog/pg_publication.c:618 +#, fuzzy, c-format +#| msgid "relation \"%s\" is already member of publication \"%s\"" +msgid "schema \"%s\" is already member of publication \"%s\"" +msgstr "Relation »%s« ist schon Mitglied der Publikation »%s«" + +#: catalog/pg_publication.c:1045 commands/publicationcmds.c:1407 +#: commands/publicationcmds.c:1453 commands/publicationcmds.c:2016 #, c-format msgid "publication \"%s\" does not exist" msgstr "Publikation »%s« existiert nicht" -#: catalog/pg_shdepend.c:832 +#: catalog/pg_shdepend.c:829 #, c-format msgid "" "\n" @@ -5564,57 +5696,56 @@ msgstr "Tablespace %u wurde gleichzeitig gelöscht" msgid "database %u was concurrently dropped" msgstr "Datenbank %u wurde gleichzeitig gelöscht" -#: catalog/pg_shdepend.c:1247 +#: catalog/pg_shdepend.c:1253 #, c-format msgid "owner of %s" msgstr "Eigentümer von %s" -#: catalog/pg_shdepend.c:1249 +#: catalog/pg_shdepend.c:1255 #, c-format msgid "privileges for %s" msgstr "Privilegien für %s" -#: catalog/pg_shdepend.c:1251 +#: catalog/pg_shdepend.c:1257 #, c-format msgid "target of %s" msgstr "Ziel von %s" -#: catalog/pg_shdepend.c:1253 +#: catalog/pg_shdepend.c:1259 #, c-format msgid "tablespace for %s" msgstr "Tablespace für %s" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1261 +#: catalog/pg_shdepend.c:1267 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" msgstr[0] "%d Objekt in %s" msgstr[1] "%d Objekte in %s" -#: catalog/pg_shdepend.c:1372 +#: catalog/pg_shdepend.c:1331 #, c-format msgid "cannot drop objects owned by %s because they are required by the database system" msgstr "kann Objekte, die %s gehören, nicht löschen, weil sie vom Datenbanksystem benötigt werden" -#: catalog/pg_shdepend.c:1519 +#: catalog/pg_shdepend.c:1477 #, c-format msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" msgstr "kann den Eigentümer von den Objekten, die %s gehören, nicht ändern, weil die Objekte vom Datenbanksystem benötigt werden" -#: catalog/pg_subscription.c:174 commands/subscriptioncmds.c:775 -#: commands/subscriptioncmds.c:1085 commands/subscriptioncmds.c:1427 +#: catalog/pg_subscription.c:216 commands/subscriptioncmds.c:991 +#: commands/subscriptioncmds.c:1356 commands/subscriptioncmds.c:1713 #, c-format msgid "subscription \"%s\" does not exist" msgstr "Subskription »%s« existiert nicht" -#: catalog/pg_subscription.c:432 -#, fuzzy, c-format -#| msgid "could not find function information for function \"%s\"" +#: catalog/pg_subscription.c:474 +#, c-format msgid "could not drop relation mapping for subscription \"%s\"" -msgstr "konnte Funktionsinformationen für Funktion »%s« nicht finden" +msgstr "konnte Relation-Mapping für Subskription »%s« nicht löschen" -#: catalog/pg_subscription.c:434 +#: catalog/pg_subscription.c:476 #, c-format msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." msgstr "Tabellensynchronisierung für Relation »%s« ist im Gang und hat Status »%c«." @@ -5622,69 +5753,62 @@ msgstr "Tabellensynchronisierung für Relation »%s« ist im Gang und hat Status #. translator: first %s is a SQL ALTER command and second %s is a #. SQL DROP command #. -#: catalog/pg_subscription.c:441 +#: catalog/pg_subscription.c:483 #, c-format msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." msgstr "Verwenden Sie %s um die Subskription zu aktivieren, falls noch nicht aktiviert, oder %s um die Subskription zu löschen." -#: catalog/pg_type.c:136 catalog/pg_type.c:475 +#: catalog/pg_type.c:136 catalog/pg_type.c:476 #, c-format msgid "pg_type OID value not set when in binary upgrade mode" msgstr "OID-Wert für pg_type ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/pg_type.c:255 +#: catalog/pg_type.c:256 #, c-format msgid "invalid type internal size %d" msgstr "ungültige interne Typgröße %d" -#: catalog/pg_type.c:271 catalog/pg_type.c:279 catalog/pg_type.c:287 -#: catalog/pg_type.c:296 +#: catalog/pg_type.c:272 catalog/pg_type.c:280 catalog/pg_type.c:288 +#: catalog/pg_type.c:297 #, c-format msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" msgstr "Ausrichtung »%c« ist ungültig für Typen mit Wertübergabe mit Größe %d" -#: catalog/pg_type.c:303 +#: catalog/pg_type.c:304 #, c-format msgid "internal size %d is invalid for passed-by-value type" msgstr "interne Größe %d ist ungültig für Typen mit Wertübergabe" -#: catalog/pg_type.c:313 catalog/pg_type.c:319 +#: catalog/pg_type.c:314 catalog/pg_type.c:320 #, c-format msgid "alignment \"%c\" is invalid for variable-length type" msgstr "Ausrichtung »%c« ist ungültig für Typen variabler Länge" -#: catalog/pg_type.c:327 commands/typecmds.c:4164 +#: catalog/pg_type.c:328 commands/typecmds.c:4151 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "Typen mit fester Größe müssen Storage-Typ PLAIN haben" -#: catalog/pg_type.c:816 +#: catalog/pg_type.c:824 #, c-format msgid "could not form array type name for type \"%s\"" msgstr "konnte keinen Arraytypnamen für Datentyp »%s« erzeugen" -#: catalog/pg_type.c:921 -#, fuzzy, c-format -#| msgid "Failed while creating memory context \"%s\"." +#: catalog/pg_type.c:929 +#, c-format msgid "Failed while creating a multirange type for type \"%s\"." -msgstr "Fehler während der Erzeugung des Speicherkontexts »%s«." +msgstr "Fehler während der Erzeugung eines Multirange-Typs für Typ »%s«." -#: catalog/pg_type.c:922 +#: catalog/pg_type.c:930 #, c-format -msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute" -msgstr "" +msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." +msgstr "Sie können einen Multirange-Typnamen manuell angeben, mit dem Attribut »multirange_type_name«." -#: catalog/storage.c:450 storage/buffer/bufmgr.c:1026 +#: catalog/storage.c:505 storage/buffer/bufmgr.c:1037 #, c-format msgid "invalid page in block %u of relation %s" msgstr "ungültige Seite in Block %u von Relation %s" -#: catalog/toasting.c:104 commands/indexcmds.c:667 commands/tablecmds.c:6028 -#: commands/tablecmds.c:16336 -#, c-format -msgid "\"%s\" is not a table or materialized view" -msgstr "»%s« ist keine Tabelle oder materialisierte Sicht" - #: commands/aggregatecmds.c:170 #, c-format msgid "only ordered-set aggregates can be hypothetical" @@ -5765,7 +5889,7 @@ msgstr "Serialisierungsfunktionen dürfen nur angegeben werden, wenn der Überga msgid "must specify both or neither of serialization and deserialization functions" msgstr "Serialisierungs- und Deserialisierungsfunktionen müssen zusammen angegeben werden" -#: commands/aggregatecmds.c:437 commands/functioncmds.c:624 +#: commands/aggregatecmds.c:437 commands/functioncmds.c:643 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "Parameter »parallel« muss SAFE, RESTRICTED oder UNSAFE sein" @@ -5780,12 +5904,12 @@ msgstr "Parameter »%s« muss READ_ONLY, SHAREABLE oder READ_WRITE sein" msgid "event trigger \"%s\" already exists" msgstr "Ereignistrigger »%s« existiert bereits" -#: commands/alter.c:87 commands/foreigncmds.c:597 +#: commands/alter.c:87 commands/foreigncmds.c:593 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "Fremddaten-Wrapper »%s« existiert bereits" -#: commands/alter.c:90 commands/foreigncmds.c:879 +#: commands/alter.c:90 commands/foreigncmds.c:875 #, c-format msgid "server \"%s\" already exists" msgstr "Server »%s« existiert bereits" @@ -5795,12 +5919,12 @@ msgstr "Server »%s« existiert bereits" msgid "language \"%s\" already exists" msgstr "Sprache »%s« existiert bereits" -#: commands/alter.c:96 commands/publicationcmds.c:183 +#: commands/alter.c:96 commands/publicationcmds.c:792 #, c-format msgid "publication \"%s\" already exists" msgstr "Publikation »%s« existiert bereits" -#: commands/alter.c:99 commands/subscriptioncmds.c:398 +#: commands/alter.c:99 commands/subscriptioncmds.c:569 #, c-format msgid "subscription \"%s\" already exists" msgstr "Subskription »%s« existiert bereits" @@ -5840,7 +5964,7 @@ msgstr "Textsuchekonfiguration »%s« existiert bereits in Schema »%s«" msgid "must be superuser to rename %s" msgstr "nur Superuser können %s umbenennen" -#: commands/alter.c:744 +#: commands/alter.c:746 #, c-format msgid "must be superuser to set schema of %s" msgstr "nur Superuser können Schema von %s setzen" @@ -5872,179 +5996,173 @@ msgid "handler function is not specified" msgstr "keine Handler-Funktion angegeben" #: commands/amcmds.c:264 commands/event_trigger.c:183 -#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:681 -#: parser/parse_clause.c:941 +#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:713 +#: parser/parse_clause.c:942 #, c-format msgid "function %s must return type %s" msgstr "Funktion %s muss Rückgabetyp %s haben" -#: commands/analyze.c:227 +#: commands/analyze.c:228 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "überspringe »%s« --- kann diese Fremdtabelle nicht analysieren" -#: commands/analyze.c:244 +#: commands/analyze.c:245 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "überspringe »%s« --- kann Nicht-Tabellen oder besondere Systemtabellen nicht analysieren" -#: commands/analyze.c:324 +#: commands/analyze.c:325 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "analysiere Vererbungsbaum von »%s.%s«" -#: commands/analyze.c:329 +#: commands/analyze.c:330 #, c-format msgid "analyzing \"%s.%s\"" msgstr "analysiere »%s.%s«" -#: commands/analyze.c:395 +#: commands/analyze.c:396 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "Spalte »%s« von Relation »%s« erscheint mehrmals" -#: commands/analyze.c:790 -#, fuzzy, c-format -#| msgid "automatic analyze of table \"%s.%s.%s\"" -msgid "automatic analyze of table \"%s.%s.%s\"\n" -msgstr "automatisches Analysieren der Tabelle »%s.%s.%s«" - -#: commands/analyze.c:811 +#: commands/analyze.c:787 #, c-format -msgid "system usage: %s" -msgstr "Systembenutzung: %s" +msgid "automatic analyze of table \"%s.%s.%s\"\n" +msgstr "automatisches Analysieren der Tabelle »%s.%s.%s«\n" -#: commands/analyze.c:1350 +#: commands/analyze.c:1333 #, c-format msgid "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead rows; %d rows in sample, %.0f estimated total rows" msgstr "»%s«: %d von %u Seiten gelesen, enthalten %.0f lebende Zeilen und %.0f tote Zeilen; %d Zeilen in Stichprobe, schätzungsweise %.0f Zeilen insgesamt" -#: commands/analyze.c:1430 +#: commands/analyze.c:1413 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" msgstr "überspringe Analysieren des Vererbungsbaums »%s.%s« --- dieser Vererbungsbaum enthält keine abgeleiteten Tabellen" -#: commands/analyze.c:1528 +#: commands/analyze.c:1511 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no analyzable child tables" msgstr "überspringe Analysieren des Vererbungsbaums »%s.%s« --- dieser Vererbungsbaum enthält keine analysierbaren abgeleiteten Tabellen" -#: commands/async.c:639 +#: commands/async.c:646 #, c-format msgid "channel name cannot be empty" msgstr "Kanalname kann nicht leer sein" -#: commands/async.c:645 +#: commands/async.c:652 #, c-format msgid "channel name too long" msgstr "Kanalname zu lang" -#: commands/async.c:650 +#: commands/async.c:657 #, c-format msgid "payload string too long" msgstr "Payload-Zeichenkette zu lang" -#: commands/async.c:869 +#: commands/async.c:876 #, c-format msgid "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" msgstr "PREPARE kann nicht in einer Transaktion ausgeführt werden, die LISTEN, UNLISTEN oder NOTIFY ausgeführt hat" -#: commands/async.c:975 +#: commands/async.c:980 #, c-format msgid "too many notifications in the NOTIFY queue" msgstr "zu viele Benachrichtigungen in NOTIFY-Schlange" -#: commands/async.c:1646 +#: commands/async.c:1602 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "NOTIFY-Schlange ist %.0f%% voll" -#: commands/async.c:1648 +#: commands/async.c:1604 #, c-format msgid "The server process with PID %d is among those with the oldest transactions." msgstr "Der Serverprozess mit PID %d gehört zu denen mit den ältesten Transaktionen." -#: commands/async.c:1651 +#: commands/async.c:1607 #, c-format msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." msgstr "Die NOTIFY-Schlange kann erst geleert werden, wenn dieser Prozess seine aktuelle Transaktion beendet." -#: commands/cluster.c:119 +#: commands/cluster.c:128 #, c-format msgid "unrecognized CLUSTER option \"%s\"" msgstr "unbekannte CLUSTER-Option »%s«" -#: commands/cluster.c:147 commands/cluster.c:386 +#: commands/cluster.c:158 commands/cluster.c:431 #, c-format msgid "cannot cluster temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht clustern" -#: commands/cluster.c:155 -#, c-format -msgid "cannot cluster a partitioned table" -msgstr "eine partitionierte Tabelle kann nicht geclustert werden" - -#: commands/cluster.c:173 +#: commands/cluster.c:176 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "es gibt keinen bereits geclusterten Index für Tabelle »%s«" -#: commands/cluster.c:187 commands/tablecmds.c:13496 commands/tablecmds.c:15364 +#: commands/cluster.c:190 commands/tablecmds.c:14053 commands/tablecmds.c:15945 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "Index »%s« für Tabelle »%s« existiert nicht" -#: commands/cluster.c:375 +#: commands/cluster.c:420 #, c-format msgid "cannot cluster a shared catalog" msgstr "globaler Katalog kann nicht geclustert werden" -#: commands/cluster.c:390 +#: commands/cluster.c:435 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "temporäre Tabellen anderer Sitzungen können nicht gevacuumt werden" -#: commands/cluster.c:456 commands/tablecmds.c:15374 +#: commands/cluster.c:511 commands/tablecmds.c:15955 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "»%s« ist kein Index für Tabelle »%s«" -#: commands/cluster.c:464 +#: commands/cluster.c:519 #, c-format msgid "cannot cluster on index \"%s\" because access method does not support clustering" msgstr "kann nicht anhand des Index »%s« clustern, weil die Indexmethode Clustern nicht unterstützt" -#: commands/cluster.c:476 +#: commands/cluster.c:531 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "kann nicht anhand des partiellen Index »%s« clustern" -#: commands/cluster.c:490 +#: commands/cluster.c:545 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "kann nicht anhand des ungültigen Index »%s« clustern" -#: commands/cluster.c:514 +#: commands/cluster.c:569 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "ein Index kann nicht als anhand einer partitionierten Tabelle geclustert markiert werden" -#: commands/cluster.c:887 +#: commands/cluster.c:948 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "clustere »%s.%s« durch Index-Scan von »%s«" -#: commands/cluster.c:893 +#: commands/cluster.c:954 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "clustere »%s.%s« durch sequenziellen Scan und Sortieren" -#: commands/cluster.c:924 +#: commands/cluster.c:959 +#, c-format +msgid "vacuuming \"%s.%s\"" +msgstr "Vacuum von »%s.%s«" + +#: commands/cluster.c:985 #, c-format -msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" -msgstr "»%s«: %.0f entfernbare, %.0f nicht entfernbare Zeilenversionen in %u Seiten gefunden" +msgid "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" +msgstr "»%s.%s«: %.0f entfernbare, %.0f nicht entfernbare Zeilenversionen in %u Seiten gefunden" -#: commands/cluster.c:928 +#: commands/cluster.c:990 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -6058,92 +6176,126 @@ msgstr "" msgid "collation attribute \"%s\" not recognized" msgstr "Attribut »%s« für Sortierfolge unbekannt" -#: commands/collationcmds.c:149 +#: commands/collationcmds.c:119 commands/collationcmds.c:125 +#: commands/define.c:356 commands/tablecmds.c:7737 +#: replication/pgoutput/pgoutput.c:311 replication/pgoutput/pgoutput.c:334 +#: replication/pgoutput/pgoutput.c:348 replication/pgoutput/pgoutput.c:358 +#: replication/pgoutput/pgoutput.c:368 replication/pgoutput/pgoutput.c:378 +#: replication/walsender.c:1002 replication/walsender.c:1024 +#: replication/walsender.c:1034 +#, c-format +msgid "conflicting or redundant options" +msgstr "widersprüchliche oder überflüssige Optionen" + +#: commands/collationcmds.c:120 +#, c-format +msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." +msgstr "LOCALE kann nicht zusammen mit LC_COLLATE oder LC_CTYPE angegeben werden." + +#: commands/collationcmds.c:126 +#, fuzzy, c-format +#| msgid "option \"%s\" cannot be specified with other options" +msgid "FROM cannot be specified together with any other options." +msgstr "Option »%s« kann nicht mit anderen Optionen angegeben werden" + +#: commands/collationcmds.c:174 #, c-format msgid "collation \"default\" cannot be copied" msgstr "Sortierfolge »default« kann nicht kopiert werden" -#: commands/collationcmds.c:182 +#: commands/collationcmds.c:204 #, c-format msgid "unrecognized collation provider: %s" msgstr "unbekannter Sortierfolgen-Provider: %s" -#: commands/collationcmds.c:191 +#: commands/collationcmds.c:232 #, c-format msgid "parameter \"lc_collate\" must be specified" msgstr "Parameter »lc_collate« muss angegeben werden" -#: commands/collationcmds.c:196 +#: commands/collationcmds.c:237 #, c-format msgid "parameter \"lc_ctype\" must be specified" msgstr "Parameter »lc_ctype« muss angegeben werden" -#: commands/collationcmds.c:206 +#: commands/collationcmds.c:244 +#, c-format +msgid "parameter \"locale\" must be specified" +msgstr "Parameter »locale« muss angegeben werden" + +#: commands/collationcmds.c:256 #, c-format msgid "nondeterministic collations not supported with this provider" msgstr "nichtdeterministische Sortierfolgen werden von diesem Provider nicht unterstützt" -#: commands/collationcmds.c:266 +#: commands/collationcmds.c:275 +#, c-format +msgid "current database's encoding is not supported with this provider" +msgstr "Kodierung der aktuellen Datenbank wird von diesem Provider nicht unterstützt" + +#: commands/collationcmds.c:334 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "Sortierfolge »%s« für Kodierung »%s« existiert bereits in Schema »%s«" -#: commands/collationcmds.c:277 +#: commands/collationcmds.c:345 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "Sortierfolge »%s« existiert bereits in Schema »%s«" -#: commands/collationcmds.c:325 +#: commands/collationcmds.c:395 commands/dbcommands.c:2399 #, c-format msgid "changing version from %s to %s" msgstr "Version wird von %s in %s geändert" -#: commands/collationcmds.c:340 +#: commands/collationcmds.c:410 commands/dbcommands.c:2412 #, c-format msgid "version has not changed" msgstr "Version hat sich nicht geändert" -#: commands/collationcmds.c:454 +#: commands/collationcmds.c:532 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "konnte Locale-Namen »%s« nicht in Sprach-Tag umwandeln: %s" -#: commands/collationcmds.c:512 +#: commands/collationcmds.c:590 #, c-format msgid "must be superuser to import system collations" msgstr "nur Superuser können Systemsortierfolgen importieren" -#: commands/collationcmds.c:540 commands/copyfrom.c:1500 commands/copyto.c:688 +#: commands/collationcmds.c:618 commands/copyfrom.c:1499 commands/copyto.c:679 #: libpq/be-secure-common.c:81 #, c-format msgid "could not execute command \"%s\": %m" msgstr "konnte Befehl »%s« nicht ausführen: %m" -#: commands/collationcmds.c:671 +#: commands/collationcmds.c:753 #, c-format msgid "no usable system locales were found" msgstr "keine brauchbaren System-Locales gefunden" -#: commands/comment.c:61 commands/dbcommands.c:841 commands/dbcommands.c:1037 -#: commands/dbcommands.c:1150 commands/dbcommands.c:1340 -#: commands/dbcommands.c:1588 commands/dbcommands.c:1702 -#: commands/dbcommands.c:2142 utils/init/postinit.c:887 -#: utils/init/postinit.c:992 utils/init/postinit.c:1009 +#: commands/comment.c:61 commands/dbcommands.c:1539 commands/dbcommands.c:1736 +#: commands/dbcommands.c:1849 commands/dbcommands.c:2043 +#: commands/dbcommands.c:2285 commands/dbcommands.c:2372 +#: commands/dbcommands.c:2482 commands/dbcommands.c:2981 +#: utils/init/postinit.c:923 utils/init/postinit.c:1028 +#: utils/init/postinit.c:1045 #, c-format msgid "database \"%s\" does not exist" msgstr "Datenbank »%s« existiert nicht" -#: commands/comment.c:101 commands/seclabel.c:191 parser/parse_utilcmd.c:989 -#, c-format -msgid "\"%s\" is not a table, view, materialized view, composite type, or foreign table" -msgstr "»%s« ist weder Tabelle, Sicht, materialisierte Sicht, zusammengesetzter Typ noch Fremdtabelle" +#: commands/comment.c:101 +#, fuzzy, c-format +#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgid "cannot set comment on relation \"%s\"" +msgstr "Constraint »%s« von Relation »%s« kann nicht geändert werden" -#: commands/constraint.c:63 utils/adt/ri_triggers.c:1948 +#: commands/constraint.c:63 utils/adt/ri_triggers.c:2014 #, c-format msgid "function \"%s\" was not called by trigger manager" msgstr "Funktion »%s« wurde nicht von Triggermanager aufgerufen" -#: commands/constraint.c:70 utils/adt/ri_triggers.c:1957 +#: commands/constraint.c:70 utils/adt/ri_triggers.c:2023 #, c-format msgid "function \"%s\" must be fired AFTER ROW" msgstr "Funktion »%s« muss AFTER ROW ausgelöst werden" @@ -6179,8 +6331,9 @@ msgid "encoding conversion function %s returned incorrect result for empty input msgstr "Kodierungskonversionsfunktion %s hat falsches Ergebnis für leere Eingabe zurückgegeben" #: commands/copy.c:86 -#, c-format -msgid "must be superuser or a member of the pg_execute_server_program role to COPY to or from an external program" +#, fuzzy, c-format +#| msgid "must be superuser or a member of the pg_execute_server_program role to COPY to or from an external program" +msgid "must be superuser or have privileges of the pg_execute_server_program role to COPY to or from an external program" msgstr "nur Superuser oder Mitglieder von pg_execute_server_program können COPY mit externen Programmen verwenden" #: commands/copy.c:87 commands/copy.c:96 commands/copy.c:103 @@ -6189,13 +6342,15 @@ msgid "Anyone can COPY to stdout or from stdin. psql's \\copy command also works msgstr "Jeder kann COPY mit STDOUT oder STDIN verwenden. Der Befehl \\copy in psql funktioniert auch für jeden." #: commands/copy.c:95 -#, c-format -msgid "must be superuser or a member of the pg_read_server_files role to COPY from a file" +#, fuzzy, c-format +#| msgid "must be superuser or a member of the pg_read_server_files role to COPY from a file" +msgid "must be superuser or have privileges of the pg_read_server_files role to COPY from a file" msgstr "nur Superuser oder Mitglieder von pg_read_server_files können mit COPY aus einer Datei lesen" #: commands/copy.c:102 -#, c-format -msgid "must be superuser or a member of the pg_write_server_files role to COPY to a file" +#, fuzzy, c-format +#| msgid "must be superuser or a member of the pg_write_server_files role to COPY to a file" +msgid "must be superuser or have privileges of the pg_write_server_files role to COPY to a file" msgstr "nur Superuser oder Mitglieder von pg_write_server_files können mit COPY in eine Datei schreiben" #: commands/copy.c:188 @@ -6208,780 +6363,891 @@ msgstr "COPY FROM wird nicht unterstützt mit Sicherheit auf Zeilenebene" msgid "Use INSERT statements instead." msgstr "Verwenden Sie stattdessen INSERT-Anweisungen." -#: commands/copy.c:374 +#: commands/copy.c:369 +#, fuzzy, c-format +#| msgid "%s requires a Boolean value" +msgid "%s requires a Boolean value or \"match\"" +msgstr "%s erfordert einen Boole’schen Wert" + +#: commands/copy.c:428 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "COPY-Format »%s« nicht erkannt" -#: commands/copy.c:447 commands/copy.c:463 commands/copy.c:478 -#: commands/copy.c:500 +#: commands/copy.c:480 commands/copy.c:493 commands/copy.c:506 +#: commands/copy.c:525 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "Argument von Option »%s« muss eine Liste aus Spaltennamen sein" -#: commands/copy.c:515 +#: commands/copy.c:537 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "Argument von Option »%s« muss ein gültiger Kodierungsname sein" -#: commands/copy.c:522 commands/dbcommands.c:253 commands/dbcommands.c:1536 +#: commands/copy.c:544 commands/dbcommands.c:853 commands/dbcommands.c:2233 #, c-format msgid "option \"%s\" not recognized" msgstr "Option »%s« nicht erkannt" -#: commands/copy.c:534 +#: commands/copy.c:556 #, c-format msgid "cannot specify DELIMITER in BINARY mode" msgstr "DELIMITER kann nicht im BINARY-Modus angegeben werden" -#: commands/copy.c:539 +#: commands/copy.c:561 #, c-format msgid "cannot specify NULL in BINARY mode" msgstr "NULL kann nicht im BINARY-Modus angegeben werden" -#: commands/copy.c:561 +#: commands/copy.c:583 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "DELIMITER für COPY muss ein einzelnes Ein-Byte-Zeichen sein" -#: commands/copy.c:568 +#: commands/copy.c:590 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "COPY-Trennzeichen kann nicht Newline oder Carriage Return sein" -#: commands/copy.c:574 +#: commands/copy.c:596 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "COPY NULL-Darstellung kann nicht Newline oder Carriage Return enthalten" -#: commands/copy.c:591 +#: commands/copy.c:613 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "DELIMITER für COPY darf nicht »%s« sein" -#: commands/copy.c:597 +#: commands/copy.c:619 #, c-format -msgid "COPY HEADER available only in CSV mode" -msgstr "COPY HEADER ist nur im CSV-Modus verfügbar" +msgid "cannot specify HEADER in BINARY mode" +msgstr "HEADER kann nicht im BINARY-Modus angegeben werden" -#: commands/copy.c:603 +#: commands/copy.c:625 #, c-format msgid "COPY quote available only in CSV mode" msgstr "Quote-Zeichen für COPY ist nur im CSV-Modus verfügbar" -#: commands/copy.c:608 +#: commands/copy.c:630 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "Quote-Zeichen für COPY muss ein einzelnes Ein-Byte-Zeichen sein" -#: commands/copy.c:613 +#: commands/copy.c:635 #, c-format msgid "COPY delimiter and quote must be different" msgstr "DELIMITER und QUOTE für COPY müssen verschieden sein" -#: commands/copy.c:619 +#: commands/copy.c:641 #, c-format msgid "COPY escape available only in CSV mode" msgstr "Escape-Zeichen für COPY ist nur im CSV-Modus verfügbar" -#: commands/copy.c:624 +#: commands/copy.c:646 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "Escape-Zeichen für COPY muss ein einzelnes Ein-Byte-Zeichen sein" -#: commands/copy.c:630 +#: commands/copy.c:652 #, c-format msgid "COPY force quote available only in CSV mode" msgstr "FORCE_QUOTE für COPY ist nur im CSV-Modus verfügbar" -#: commands/copy.c:634 +#: commands/copy.c:656 #, c-format msgid "COPY force quote only available using COPY TO" msgstr "FORCE_QUOTE ist nur bei COPY TO verfügbar" -#: commands/copy.c:640 +#: commands/copy.c:662 #, c-format msgid "COPY force not null available only in CSV mode" msgstr "FORCE_NOT_NULL für COPY ist nur im CSV-Modus verfügbar" -#: commands/copy.c:644 +#: commands/copy.c:666 #, c-format msgid "COPY force not null only available using COPY FROM" msgstr "FORCE_NOT_NULL ist nur bei COPY FROM verfügbar" -#: commands/copy.c:650 +#: commands/copy.c:672 #, c-format msgid "COPY force null available only in CSV mode" msgstr "FORCE_NULL für COPY ist nur im CSV-Modus verfügbar" -#: commands/copy.c:655 +#: commands/copy.c:677 #, c-format msgid "COPY force null only available using COPY FROM" msgstr "FORCE_NULL ist nur bei COPY FROM verfügbar" -#: commands/copy.c:661 +#: commands/copy.c:683 #, c-format msgid "COPY delimiter must not appear in the NULL specification" msgstr "Trennzeichen für COPY darf nicht in der NULL-Darstellung erscheinen" -#: commands/copy.c:668 +#: commands/copy.c:690 #, c-format msgid "CSV quote character must not appear in the NULL specification" msgstr "CSV-Quote-Zeichen darf nicht in der NULL-Darstellung erscheinen" -#: commands/copy.c:729 +#: commands/copy.c:751 #, c-format msgid "column \"%s\" is a generated column" msgstr "Spalte »%s« ist eine generierte Spalte" -#: commands/copy.c:731 +#: commands/copy.c:753 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "Generierte Spalten können nicht in COPY verwendet werden." -#: commands/copy.c:746 commands/indexcmds.c:1754 commands/statscmds.c:238 -#: commands/tablecmds.c:2366 commands/tablecmds.c:3022 -#: commands/tablecmds.c:3515 parser/parse_relation.c:3593 -#: parser/parse_relation.c:3613 utils/adt/tsvector_op.c:2680 +#: commands/copy.c:768 commands/indexcmds.c:1797 commands/statscmds.c:239 +#: commands/tablecmds.c:2369 commands/tablecmds.c:3025 +#: commands/tablecmds.c:3519 parser/parse_relation.c:3609 +#: parser/parse_relation.c:3629 utils/adt/tsvector_op.c:2685 #, c-format msgid "column \"%s\" does not exist" msgstr "Spalte »%s« existiert nicht" -#: commands/copy.c:753 commands/tablecmds.c:2392 commands/trigger.c:933 -#: parser/parse_target.c:1080 parser/parse_target.c:1091 +#: commands/copy.c:775 commands/tablecmds.c:2395 commands/trigger.c:967 +#: parser/parse_target.c:1079 parser/parse_target.c:1090 #, c-format msgid "column \"%s\" specified more than once" msgstr "Spalte »%s« mehrmals angegeben" -#: commands/copyfrom.c:127 +#: commands/copyfrom.c:123 #, c-format -msgid "COPY %s, line %s, column %s" -msgstr "COPY %s, Zeile %s, Spalte %s" +msgid "COPY %s, line %llu, column %s" +msgstr "COPY %s, Zeile %llu, Spalte %s" -#: commands/copyfrom.c:131 commands/copyfrom.c:172 +#: commands/copyfrom.c:128 commands/copyfrom.c:174 #, c-format -msgid "COPY %s, line %s" -msgstr "COPY %s, Zeile %s" +msgid "COPY %s, line %llu" +msgstr "COPY %s, Zeile %llu" -#: commands/copyfrom.c:142 +#: commands/copyfrom.c:140 #, c-format -msgid "COPY %s, line %s, column %s: \"%s\"" -msgstr "COPY %s, Zeile %s, Spalte %s: »%s«" +msgid "COPY %s, line %llu, column %s: \"%s\"" +msgstr "COPY %s, Zeile %llu, Spalte %s: »%s«" #: commands/copyfrom.c:150 #, c-format -msgid "COPY %s, line %s, column %s: null input" -msgstr "COPY %s, Zeile %s, Spalte %s: NULL Eingabe" +msgid "COPY %s, line %llu, column %s: null input" +msgstr "COPY %s, Zeile %llu, Spalte %s: NULL Eingabe" -#: commands/copyfrom.c:166 +#: commands/copyfrom.c:167 #, c-format -msgid "COPY %s, line %s: \"%s\"" -msgstr "COPY %s, Zeile %s: »%s«" +msgid "COPY %s, line %llu: \"%s\"" +msgstr "COPY %s, Zeile %llu: »%s«" -#: commands/copyfrom.c:566 +#: commands/copyfrom.c:569 #, c-format msgid "cannot copy to view \"%s\"" msgstr "kann nicht in Sicht »%s« kopieren" -#: commands/copyfrom.c:568 +#: commands/copyfrom.c:571 #, c-format msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." msgstr "Um Kopieren in eine Sicht zu ermöglichen, richten Sie einen INSTEAD OF INSERT Trigger ein." -#: commands/copyfrom.c:572 +#: commands/copyfrom.c:575 #, c-format msgid "cannot copy to materialized view \"%s\"" msgstr "kann nicht in materialisierte Sicht »%s« kopieren" -#: commands/copyfrom.c:577 +#: commands/copyfrom.c:580 #, c-format msgid "cannot copy to sequence \"%s\"" msgstr "kann nicht in Sequenz »%s« kopieren" -#: commands/copyfrom.c:582 +#: commands/copyfrom.c:585 #, c-format msgid "cannot copy to non-table relation \"%s\"" msgstr "kann nicht in Relation »%s« kopieren, die keine Tabelle ist" -#: commands/copyfrom.c:622 +#: commands/copyfrom.c:625 #, c-format msgid "cannot perform COPY FREEZE on a partitioned table" msgstr "COPY FREEZE kann nicht in einer partitionierten Tabelle durchgeführt werden" -#: commands/copyfrom.c:637 +#: commands/copyfrom.c:640 #, c-format msgid "cannot perform COPY FREEZE because of prior transaction activity" msgstr "COPY FREEZE kann nicht durchgeführt werden wegen vorheriger Aktivität in dieser Transaktion" -#: commands/copyfrom.c:643 +#: commands/copyfrom.c:646 #, c-format msgid "cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction" msgstr "COPY FREEZE kann nicht durchgeführt werden, weil die Tabelle nicht in der aktuellen Transaktion erzeugt oder geleert wurde" -#: commands/copyfrom.c:1264 commands/copyto.c:618 +#: commands/copyfrom.c:1267 commands/copyto.c:611 #, c-format msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" msgstr "Spalte »%s« mit FORCE_NOT_NULL wird von COPY nicht verwendet" -#: commands/copyfrom.c:1287 commands/copyto.c:641 +#: commands/copyfrom.c:1290 commands/copyto.c:634 #, c-format msgid "FORCE_NULL column \"%s\" not referenced by COPY" msgstr "Spalte »%s« mit FORCE_NULL wird von COPY nicht verwendet" -#: commands/copyfrom.c:1519 +#: commands/copyfrom.c:1518 #, c-format msgid "COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \\copy." msgstr "Mit COPY FROM liest der PostgreSQL-Serverprozess eine Datei. Möglicherweise möchten Sie Funktionalität auf Client-Seite verwenden, wie zum Beispiel \\copy in psql." -#: commands/copyfrom.c:1532 commands/copyto.c:740 +#: commands/copyfrom.c:1531 commands/copyto.c:731 #, c-format msgid "\"%s\" is a directory" msgstr "»%s« ist ein Verzeichnis" -#: commands/copyfrom.c:1600 commands/copyto.c:302 libpq/be-secure-common.c:105 +#: commands/copyfrom.c:1599 commands/copyto.c:301 libpq/be-secure-common.c:105 #, c-format msgid "could not close pipe to external command: %m" msgstr "konnte Pipe zu externem Programm nicht schließen: %m" -#: commands/copyfrom.c:1615 commands/copyto.c:307 +#: commands/copyfrom.c:1614 commands/copyto.c:306 #, c-format msgid "program \"%s\" failed" msgstr "Programm »%s« fehlgeschlagen" -#: commands/copyfromparse.c:199 +#: commands/copyfromparse.c:200 #, c-format msgid "COPY file signature not recognized" msgstr "COPY-Datei-Signatur nicht erkannt" -#: commands/copyfromparse.c:204 +#: commands/copyfromparse.c:205 #, c-format msgid "invalid COPY file header (missing flags)" msgstr "ungültiger COPY-Dateikopf (Flags fehlen)" -#: commands/copyfromparse.c:208 +#: commands/copyfromparse.c:209 #, c-format msgid "invalid COPY file header (WITH OIDS)" msgstr "ungültiger COPY-Dateikopf (WITH OIDS)" -#: commands/copyfromparse.c:213 +#: commands/copyfromparse.c:214 #, c-format msgid "unrecognized critical flags in COPY file header" msgstr "unbekannte kritische Flags im COPY-Dateikopf" -#: commands/copyfromparse.c:219 +#: commands/copyfromparse.c:220 #, c-format msgid "invalid COPY file header (missing length)" msgstr "ungültiger COPY-Dateikopf (Länge fehlt)" -#: commands/copyfromparse.c:226 +#: commands/copyfromparse.c:227 #, c-format msgid "invalid COPY file header (wrong length)" msgstr "ungültiger COPY-Dateikopf (falsche Länge)" -#: commands/copyfromparse.c:255 +#: commands/copyfromparse.c:256 #, c-format msgid "could not read from COPY file: %m" msgstr "konnte nicht aus COPY-Datei lesen: %m" -#: commands/copyfromparse.c:277 commands/copyfromparse.c:302 -#: tcop/postgres.c:360 +#: commands/copyfromparse.c:278 commands/copyfromparse.c:303 +#: tcop/postgres.c:358 #, c-format msgid "unexpected EOF on client connection with an open transaction" msgstr "unerwartetes EOF auf Client-Verbindung mit einer offenen Transaktion" -#: commands/copyfromparse.c:293 +#: commands/copyfromparse.c:294 #, c-format msgid "unexpected message type 0x%02X during COPY from stdin" msgstr "unerwarteter Messagetyp 0x%02X während COPY FROM STDIN" -#: commands/copyfromparse.c:316 +#: commands/copyfromparse.c:317 #, c-format msgid "COPY from stdin failed: %s" msgstr "COPY FROM STDIN fehlgeschlagen: %s" -#: commands/copyfromparse.c:841 commands/copyfromparse.c:1451 -#: commands/copyfromparse.c:1681 +#: commands/copyfromparse.c:785 +#, fuzzy, c-format +#| msgid "wrong number of columns: %d, expected %d" +msgid "wrong number of fields in header line: field count is %d, expected %d" +msgstr "falsche Anzahl der Spalten: %d, erwartet wurden %d" + +#: commands/copyfromparse.c:800 +#, c-format +msgid "column name mismatch in header line field %d: got null value (\"%s\"), expected \"%s\"" +msgstr "" + +#: commands/copyfromparse.c:807 +#, c-format +msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" +msgstr "" + +#: commands/copyfromparse.c:889 commands/copyfromparse.c:1499 +#: commands/copyfromparse.c:1729 #, c-format msgid "extra data after last expected column" msgstr "zusätzliche Daten nach letzter erwarteter Spalte" -#: commands/copyfromparse.c:855 +#: commands/copyfromparse.c:903 #, c-format msgid "missing data for column \"%s\"" msgstr "fehlende Daten für Spalte »%s«" -#: commands/copyfromparse.c:933 +#: commands/copyfromparse.c:981 #, c-format msgid "received copy data after EOF marker" msgstr "COPY-Daten nach EOF-Markierung empfangen" -#: commands/copyfromparse.c:940 +#: commands/copyfromparse.c:988 #, c-format msgid "row field count is %d, expected %d" msgstr "Feldanzahl in Zeile ist %d, erwartet wurden %d" -#: commands/copyfromparse.c:1233 commands/copyfromparse.c:1250 +#: commands/copyfromparse.c:1281 commands/copyfromparse.c:1298 #, c-format msgid "literal carriage return found in data" msgstr "Carriage-Return-Zeichen in Daten gefunden" -#: commands/copyfromparse.c:1234 commands/copyfromparse.c:1251 +#: commands/copyfromparse.c:1282 commands/copyfromparse.c:1299 #, c-format msgid "unquoted carriage return found in data" msgstr "ungequotetes Carriage-Return-Zeichen in Daten gefunden" -#: commands/copyfromparse.c:1236 commands/copyfromparse.c:1253 +#: commands/copyfromparse.c:1284 commands/copyfromparse.c:1301 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "Verwenden Sie »\\r«, um ein Carriage-Return-Zeichen darzustellen." -#: commands/copyfromparse.c:1237 commands/copyfromparse.c:1254 +#: commands/copyfromparse.c:1285 commands/copyfromparse.c:1302 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "Verwenden Sie ein gequotetes CSV-Feld, um ein Carriage-Return-Zeichen darzustellen." -#: commands/copyfromparse.c:1266 +#: commands/copyfromparse.c:1314 #, c-format msgid "literal newline found in data" msgstr "Newline-Zeichen in Daten gefunden" -#: commands/copyfromparse.c:1267 +#: commands/copyfromparse.c:1315 #, c-format msgid "unquoted newline found in data" msgstr "ungequotetes Newline-Zeichen in Daten gefunden" -#: commands/copyfromparse.c:1269 +#: commands/copyfromparse.c:1317 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "Verwenden Sie »\\n«, um ein Newline-Zeichen darzustellen." -#: commands/copyfromparse.c:1270 +#: commands/copyfromparse.c:1318 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "Verwenden Sie ein gequotetes CSV-Feld, um ein Newline-Zeichen darzustellen." -#: commands/copyfromparse.c:1316 commands/copyfromparse.c:1352 +#: commands/copyfromparse.c:1364 commands/copyfromparse.c:1400 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "COPY-Ende-Markierung stimmt nicht mit vorherigem Newline-Stil überein" -#: commands/copyfromparse.c:1325 commands/copyfromparse.c:1341 +#: commands/copyfromparse.c:1373 commands/copyfromparse.c:1389 #, c-format msgid "end-of-copy marker corrupt" msgstr "COPY-Ende-Markierung verfälscht" -#: commands/copyfromparse.c:1765 +#: commands/copyfromparse.c:1813 #, c-format msgid "unterminated CSV quoted field" msgstr "Quotes in CSV-Feld nicht abgeschlossen" -#: commands/copyfromparse.c:1841 commands/copyfromparse.c:1860 +#: commands/copyfromparse.c:1889 commands/copyfromparse.c:1908 #, c-format msgid "unexpected EOF in COPY data" msgstr "unerwartetes EOF in COPY-Daten" -#: commands/copyfromparse.c:1850 +#: commands/copyfromparse.c:1898 #, c-format msgid "invalid field size" msgstr "ungültige Feldgröße" -#: commands/copyfromparse.c:1873 +#: commands/copyfromparse.c:1921 #, c-format msgid "incorrect binary data format" msgstr "falsches Binärdatenformat" -#: commands/copyto.c:235 +#: commands/copyto.c:234 #, c-format msgid "could not write to COPY program: %m" msgstr "konnte nicht zum COPY-Programm schreiben: %m" -#: commands/copyto.c:240 +#: commands/copyto.c:239 #, c-format msgid "could not write to COPY file: %m" msgstr "konnte nicht in COPY-Datei schreiben: %m" -#: commands/copyto.c:370 +#: commands/copyto.c:369 #, c-format msgid "cannot copy from view \"%s\"" msgstr "kann nicht aus Sicht »%s« kopieren" -#: commands/copyto.c:372 commands/copyto.c:378 commands/copyto.c:384 -#: commands/copyto.c:395 +#: commands/copyto.c:371 commands/copyto.c:377 commands/copyto.c:383 +#: commands/copyto.c:394 #, c-format msgid "Try the COPY (SELECT ...) TO variant." msgstr "Versuchen Sie die Variante COPY (SELECT ...) TO." -#: commands/copyto.c:376 +#: commands/copyto.c:375 #, c-format msgid "cannot copy from materialized view \"%s\"" msgstr "kann nicht aus materialisierter Sicht »%s« kopieren" -#: commands/copyto.c:382 +#: commands/copyto.c:381 #, c-format msgid "cannot copy from foreign table \"%s\"" msgstr "kann nicht aus Fremdtabelle »%s« kopieren" -#: commands/copyto.c:388 +#: commands/copyto.c:387 #, c-format msgid "cannot copy from sequence \"%s\"" msgstr "kann nicht aus Sequenz »%s« kopieren" -#: commands/copyto.c:393 +#: commands/copyto.c:392 #, c-format msgid "cannot copy from partitioned table \"%s\"" msgstr "kann nicht aus partitionierter Tabelle »%s« kopieren" -#: commands/copyto.c:399 +#: commands/copyto.c:398 #, c-format msgid "cannot copy from non-table relation \"%s\"" msgstr "kann nicht aus Relation »%s«, die keine Tabelle ist, kopieren" -#: commands/copyto.c:457 +#: commands/copyto.c:450 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for COPY" msgstr "DO-INSTEAD-NOTHING-Regeln werden für COPY nicht unterstützt" -#: commands/copyto.c:471 +#: commands/copyto.c:464 #, c-format msgid "conditional DO INSTEAD rules are not supported for COPY" msgstr "DO-INSTEAD-Regeln mit Bedingung werden für COPY nicht unterstützt" -#: commands/copyto.c:475 +#: commands/copyto.c:468 #, c-format msgid "DO ALSO rules are not supported for the COPY" msgstr "DO-ALSO-Regeln werden für COPY nicht unterstützt" -#: commands/copyto.c:480 +#: commands/copyto.c:473 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for COPY" msgstr "DO-INSTEAD-Regeln mit mehreren Anweisungen werden für COPY nicht unterstützt" -#: commands/copyto.c:490 +#: commands/copyto.c:483 #, c-format msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO) wird nicht unterstützt" -#: commands/copyto.c:507 +#: commands/copyto.c:500 #, c-format msgid "COPY query must have a RETURNING clause" msgstr "COPY-Anfrage muss eine RETURNING-Klausel haben" -#: commands/copyto.c:536 +#: commands/copyto.c:529 #, c-format msgid "relation referenced by COPY statement has changed" msgstr "die von der COPY-Anweisung verwendete Relation hat sich geändert" -#: commands/copyto.c:595 +#: commands/copyto.c:588 #, c-format msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" msgstr "FORCE_QUOTE-Spalte »%s« wird von COPY nicht verwendet" -#: commands/copyto.c:705 +#: commands/copyto.c:696 #, c-format msgid "relative path not allowed for COPY to file" msgstr "relativer Pfad bei COPY in Datei nicht erlaubt" -#: commands/copyto.c:724 +#: commands/copyto.c:715 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "konnte Datei »%s« nicht zum Schreiben öffnen: %m" -#: commands/copyto.c:727 +#: commands/copyto.c:718 #, c-format msgid "COPY TO instructs the PostgreSQL server process to write a file. You may want a client-side facility such as psql's \\copy." msgstr "Mit COPY TO schreibt der PostgreSQL-Serverprozess eine Datei. Möglicherweise möchten Sie Funktionalität auf Client-Seite verwenden, wie zum Beispiel \\copy in psql." -#: commands/createas.c:215 commands/createas.c:517 +#: commands/createas.c:215 commands/createas.c:511 #, c-format msgid "too many column names were specified" msgstr "zu viele Spaltennamen wurden angegeben" -#: commands/createas.c:540 +#: commands/createas.c:534 #, c-format msgid "policies not yet implemented for this command" msgstr "Policys sind für diesen Befehl noch nicht implementiert" -#: commands/dbcommands.c:246 +#: commands/dbcommands.c:504 commands/tablespace.c:165 +#: commands/tablespace.c:182 commands/tablespace.c:193 +#: commands/tablespace.c:201 commands/tablespace.c:636 +#: commands/tablespace.c:681 replication/basebackup_server.c:102 +#: replication/slot.c:1566 storage/file/copydir.c:47 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" + +#: commands/dbcommands.c:816 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATION wird nicht mehr unterstützt" -#: commands/dbcommands.c:247 +#: commands/dbcommands.c:817 #, c-format msgid "Consider using tablespaces instead." msgstr "Verwenden Sie stattdessen Tablespaces." -#: commands/dbcommands.c:261 +#: commands/dbcommands.c:842 #, c-format -msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." -msgstr "LOCALE kann nicht zusammen mit LC_COLLATE oder LC_CTYPE angegeben werden." +msgid "OIDs less than %u are reserved for system objects" +msgstr "" -#: commands/dbcommands.c:279 utils/adt/ascii.c:145 +#: commands/dbcommands.c:873 utils/adt/ascii.c:145 #, c-format msgid "%d is not a valid encoding code" msgstr "%d ist kein gültiger Kodierungscode" -#: commands/dbcommands.c:290 utils/adt/ascii.c:127 +#: commands/dbcommands.c:884 utils/adt/ascii.c:127 #, c-format msgid "%s is not a valid encoding name" msgstr "%s ist kein gültiger Kodierungsname" -#: commands/dbcommands.c:314 commands/dbcommands.c:1569 commands/user.c:275 -#: commands/user.c:691 +#: commands/dbcommands.c:911 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "unbekannter Locale-Provider: %s" + +#: commands/dbcommands.c:917 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "" + +#: commands/dbcommands.c:933 commands/dbcommands.c:2266 commands/user.c:237 +#: commands/user.c:611 #, c-format msgid "invalid connection limit: %d" msgstr "ungültige Verbindungshöchstgrenze: %d" -#: commands/dbcommands.c:333 +#: commands/dbcommands.c:954 #, c-format msgid "permission denied to create database" msgstr "keine Berechtigung, um Datenbank zu erzeugen" -#: commands/dbcommands.c:356 +#: commands/dbcommands.c:978 #, c-format msgid "template database \"%s\" does not exist" msgstr "Template-Datenbank »%s« existiert nicht" -#: commands/dbcommands.c:368 +#: commands/dbcommands.c:990 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "keine Berechtigung, um Datenbank »%s« zu kopieren" -#: commands/dbcommands.c:384 +#: commands/dbcommands.c:1007 +#, fuzzy, c-format +#| msgid "invalid creation date in header" +msgid "invalid create database strategy %s" +msgstr "ungültiges Erstellungsdatum im Kopf" + +#: commands/dbcommands.c:1008 +#, fuzzy, c-format +#| msgid "Valid values are \"local\" and \"cascaded\"." +msgid "Valid strategies are \"wal_log\", and \"file_copy\"." +msgstr "Gültige Werte sind »local« und »cascaded«." + +#: commands/dbcommands.c:1027 #, c-format msgid "invalid server encoding %d" msgstr "ungültige Serverkodierung %d" -#: commands/dbcommands.c:390 commands/dbcommands.c:395 +#: commands/dbcommands.c:1033 commands/dbcommands.c:1038 #, c-format msgid "invalid locale name: \"%s\"" msgstr "ungültiger Locale-Name: »%s«" -#: commands/dbcommands.c:415 +#: commands/dbcommands.c:1052 +#, c-format +msgid "ICU locale must be specified" +msgstr "ICU-Locale muss angegeben werden" + +#: commands/dbcommands.c:1073 #, c-format msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" msgstr "neue Kodierung (%s) ist inkompatibel mit der Kodierung der Template-Datenbank (%s)" -#: commands/dbcommands.c:418 +#: commands/dbcommands.c:1076 #, c-format msgid "Use the same encoding as in the template database, or use template0 as template." msgstr "Verwenden Sie die gleiche Kodierung wie die Template-Datenbank oder verwenden Sie template0 als Template." -#: commands/dbcommands.c:423 +#: commands/dbcommands.c:1081 #, c-format msgid "new collation (%s) is incompatible with the collation of the template database (%s)" msgstr "neue Sortierreihenfolge (%s) ist inkompatibel mit der Sortierreihenfolge der Template-Datenbank (%s)" -#: commands/dbcommands.c:425 +#: commands/dbcommands.c:1083 #, c-format msgid "Use the same collation as in the template database, or use template0 as template." msgstr "Verwenden Sie die gleiche Sortierreihenfolge wie die Template-Datenbank oder verwenden Sie template0 als Template." -#: commands/dbcommands.c:430 +#: commands/dbcommands.c:1088 #, c-format msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" msgstr "neues LC_CTYPE (%s) ist inkompatibel mit dem LC_CTYPE der Template-Datenbank (%s)" -#: commands/dbcommands.c:432 -#, c-format -msgid "Use the same LC_CTYPE as in the template database, or use template0 as template." -msgstr "Verwenden Sie das gleiche LC_CTYPE wie die Template-Datenbank oder verwenden Sie template0 als Template." +#: commands/dbcommands.c:1090 +#, c-format +msgid "Use the same LC_CTYPE as in the template database, or use template0 as template." +msgstr "Verwenden Sie das gleiche LC_CTYPE wie die Template-Datenbank oder verwenden Sie template0 als Template." + +#: commands/dbcommands.c:1095 +#, c-format +msgid "new locale provider (%s) does not match locale provider of the template database (%s)" +msgstr "neuer Locale-Provider (%s) stimmt nicht mit dem Locale-Provider der Template-Datenbank (%s) überein" + +#: commands/dbcommands.c:1097 +#, c-format +msgid "Use the same locale provider as in the template database, or use template0 as template." +msgstr "Verwenden Sie den gleichen Locale-Provider wie die Template-Datenbank oder verwenden Sie template0 als Template." + +#: commands/dbcommands.c:1106 +#, c-format +msgid "new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)" +msgstr "neue ICU-Locale (%s) ist inkompatibel mit der ICU-Locale der Template-Datenbank (%s)" + +#: commands/dbcommands.c:1108 +#, c-format +msgid "Use the same ICU locale as in the template database, or use template0 as template." +msgstr "Verwenden Sie die gleiche ICU-Locale wie die Template-Datenbank oder verwenden Sie template0 als Template." + +#: commands/dbcommands.c:1131 +#, c-format +msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" +msgstr "" + +#: commands/dbcommands.c:1136 +#, fuzzy, c-format +#| msgid "template database \"%s\" does not exist" +msgid "template database \"%s\" has a collation version mismatch" +msgstr "Template-Datenbank »%s« existiert nicht" + +#: commands/dbcommands.c:1138 +#, fuzzy, c-format +#| msgid "The collation in the database was created using version %s, but the operating system provides version %s." +msgid "The template database was created using collation version %s, but the operating system provides version %s." +msgstr "Die Sortierfolge in der Datenbank wurde mit Version %s erzeugt, aber das Betriebssystem hat Version %s." + +#: commands/dbcommands.c:1141 +#, fuzzy, c-format +#| msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." +msgid "Rebuild all objects in the template database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." +msgstr "Bauen Sie alle von dieser Sortierfolge beinflussten Objekte neu und führen Sie ALTER COLLATION %s REFRESH VERSION aus, oder bauen Sie PostgreSQL mit der richtigen Bibliotheksversion." -#: commands/dbcommands.c:454 commands/dbcommands.c:1196 +#: commands/dbcommands.c:1177 commands/dbcommands.c:1895 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "pg_global kann nicht als Standard-Tablespace verwendet werden" -#: commands/dbcommands.c:480 +#: commands/dbcommands.c:1203 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "kann neuen Standard-Tablespace »%s« nicht setzen" -#: commands/dbcommands.c:482 +#: commands/dbcommands.c:1205 #, c-format msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." msgstr "Es gibt einen Konflikt, weil Datenbank »%s« schon einige Tabellen in diesem Tablespace hat." -#: commands/dbcommands.c:512 commands/dbcommands.c:1066 +#: commands/dbcommands.c:1235 commands/dbcommands.c:1765 #, c-format msgid "database \"%s\" already exists" msgstr "Datenbank »%s« existiert bereits" -#: commands/dbcommands.c:526 +#: commands/dbcommands.c:1249 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "auf Quelldatenbank »%s« wird gerade von anderen Benutzern zugegriffen" -#: commands/dbcommands.c:769 commands/dbcommands.c:784 +#: commands/dbcommands.c:1271 +#, fuzzy, c-format +#| msgid "database \"%s\" already exists" +msgid "database OID %u is already in use by database \"%s\"" +msgstr "Datenbank »%s« existiert bereits" + +#: commands/dbcommands.c:1277 +#, c-format +msgid "data directory with the specified OID %u already exists" +msgstr "" + +#: commands/dbcommands.c:1448 commands/dbcommands.c:1463 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "Kodierung »%s« stimmt nicht mit Locale »%s« überein" -#: commands/dbcommands.c:772 +#: commands/dbcommands.c:1451 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "Die gewählte LC_CTYPE-Einstellung verlangt die Kodierung »%s«." -#: commands/dbcommands.c:787 +#: commands/dbcommands.c:1466 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "Die gewählte LC_COLLATE-Einstellung verlangt die Kodierung »%s«." -#: commands/dbcommands.c:848 +#: commands/dbcommands.c:1546 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "Datenbank »%s« existiert nicht, wird übersprungen" -#: commands/dbcommands.c:872 +#: commands/dbcommands.c:1570 #, c-format msgid "cannot drop a template database" msgstr "Template-Datenbank kann nicht gelöscht werden" -#: commands/dbcommands.c:878 +#: commands/dbcommands.c:1576 #, c-format msgid "cannot drop the currently open database" msgstr "kann aktuell geöffnete Datenbank nicht löschen" -#: commands/dbcommands.c:891 +#: commands/dbcommands.c:1589 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "Datenbank »%s« wird von einem aktiven logischen Replikations-Slot verwendet" -#: commands/dbcommands.c:893 +#: commands/dbcommands.c:1591 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." msgstr[0] "%d Slot ist vorhanden." msgstr[1] "%d Slots sind vorhanden." -#: commands/dbcommands.c:907 +#: commands/dbcommands.c:1605 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "Datenbank »%s« wird von einer Subskription für logische Replikation verwendet" -#: commands/dbcommands.c:909 +#: commands/dbcommands.c:1607 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." msgstr[0] "%d Subskription ist vorhanden." msgstr[1] "%d Subskriptionen sind vorhanden." -#: commands/dbcommands.c:930 commands/dbcommands.c:1088 -#: commands/dbcommands.c:1218 +#: commands/dbcommands.c:1628 commands/dbcommands.c:1787 +#: commands/dbcommands.c:1917 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "auf Datenbank »%s« wird von anderen Benutzern zugegriffen" -#: commands/dbcommands.c:1048 +#: commands/dbcommands.c:1747 #, c-format msgid "permission denied to rename database" msgstr "keine Berechtigung, um Datenbank umzubenennen" -#: commands/dbcommands.c:1077 +#: commands/dbcommands.c:1776 #, c-format msgid "current database cannot be renamed" msgstr "aktuelle Datenbank kann nicht umbenannt werden" -#: commands/dbcommands.c:1174 +#: commands/dbcommands.c:1873 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "kann den Tablespace der aktuell geöffneten Datenbank nicht ändern" -#: commands/dbcommands.c:1277 +#: commands/dbcommands.c:1979 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "einige Relationen von Datenbank »%s« ist bereits in Tablespace »%s«" -#: commands/dbcommands.c:1279 +#: commands/dbcommands.c:1981 #, c-format msgid "You must move them back to the database's default tablespace before using this command." msgstr "Sie müssen sie zurück in den Standard-Tablespace der Datenbank verschieben, bevor Sie diesen Befehl verwenden können." -#: commands/dbcommands.c:1404 commands/dbcommands.c:1980 -#: commands/dbcommands.c:2203 commands/dbcommands.c:2261 -#: commands/tablespace.c:631 +#: commands/dbcommands.c:2108 commands/dbcommands.c:2819 +#: commands/dbcommands.c:3043 commands/dbcommands.c:3123 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "einige nutzlose Dateien wurde möglicherweise im alten Datenbankverzeichnis »%s« zurückgelassen" -#: commands/dbcommands.c:1460 +#: commands/dbcommands.c:2169 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "unbekannte DROP-DATABASE-Option »%s«" -#: commands/dbcommands.c:1550 +#: commands/dbcommands.c:2247 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "Option »%s« kann nicht mit anderen Optionen angegeben werden" -#: commands/dbcommands.c:1606 +#: commands/dbcommands.c:2303 #, c-format msgid "cannot disallow connections for current database" msgstr "Verbindungen mit der aktuellen Datenbank können nicht verboten werden" -#: commands/dbcommands.c:1742 +#: commands/dbcommands.c:2522 #, c-format msgid "permission denied to change owner of database" msgstr "keine Berechtigung, um Eigentümer der Datenbank zu ändern" -#: commands/dbcommands.c:2086 +#: commands/dbcommands.c:2925 #, c-format msgid "There are %d other session(s) and %d prepared transaction(s) using the database." msgstr "%d andere Sitzung(en) und %d vorbereitete Transaktion(en) verwenden die Datenbank." -#: commands/dbcommands.c:2089 +#: commands/dbcommands.c:2928 #, c-format msgid "There is %d other session using the database." msgid_plural "There are %d other sessions using the database." msgstr[0] "%d andere Sitzung verwendet die Datenbank." msgstr[1] "%d andere Sitzungen verwenden die Datenbank." -#: commands/dbcommands.c:2094 storage/ipc/procarray.c:3726 +#: commands/dbcommands.c:2933 storage/ipc/procarray.c:3832 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." msgstr[0] "%d vorbereitete Transaktion verwendet die Datenbank." msgstr[1] "%d vorbereitete Transaktionen verwenden die Datenbank." -#: commands/define.c:54 commands/define.c:228 commands/define.c:260 -#: commands/define.c:288 commands/define.c:334 +#: commands/define.c:54 commands/define.c:225 commands/define.c:257 +#: commands/define.c:285 commands/define.c:331 #, c-format msgid "%s requires a parameter" msgstr "%s erfordert einen Parameter" -#: commands/define.c:90 commands/define.c:101 commands/define.c:195 -#: commands/define.c:213 +#: commands/define.c:87 commands/define.c:98 commands/define.c:192 +#: commands/define.c:210 #, c-format msgid "%s requires a numeric value" msgstr "%s erfordert einen numerischen Wert" -#: commands/define.c:157 +#: commands/define.c:154 #, c-format msgid "%s requires a Boolean value" msgstr "%s erfordert einen Boole’schen Wert" -#: commands/define.c:171 commands/define.c:180 commands/define.c:297 +#: commands/define.c:168 commands/define.c:177 commands/define.c:294 #, c-format msgid "%s requires an integer value" msgstr "%s erfordert einen ganzzahligen Wert" -#: commands/define.c:242 +#: commands/define.c:239 #, c-format msgid "argument of %s must be a name" msgstr "Argument von %s muss ein Name sein" -#: commands/define.c:272 +#: commands/define.c:269 #, c-format msgid "argument of %s must be a type name" msgstr "Argument von %s muss ein Typname sein" -#: commands/define.c:318 +#: commands/define.c:315 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "ungültiges Argument für %s: »%s«" -#: commands/dropcmds.c:100 commands/functioncmds.c:1385 -#: utils/adt/ruleutils.c:2806 +#: commands/dropcmds.c:100 commands/functioncmds.c:1394 +#: utils/adt/ruleutils.c:2913 #, c-format msgid "\"%s\" is an aggregate function" msgstr "»%s« ist eine Aggregatfunktion" @@ -6991,19 +7257,19 @@ msgstr "»%s« ist eine Aggregatfunktion" msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "Verwenden Sie DROP AGGREGATE, um Aggregatfunktionen zu löschen." -#: commands/dropcmds.c:158 commands/sequence.c:447 commands/tablecmds.c:3599 -#: commands/tablecmds.c:3757 commands/tablecmds.c:3802 -#: commands/tablecmds.c:15797 tcop/utility.c:1291 +#: commands/dropcmds.c:158 commands/sequence.c:467 commands/tablecmds.c:3603 +#: commands/tablecmds.c:3761 commands/tablecmds.c:3813 +#: commands/tablecmds.c:16378 tcop/utility.c:1332 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "Relation »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1248 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1276 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "Schema »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:272 +#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:275 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "Typ »%s« existiert nicht, wird übersprungen" @@ -7023,7 +7289,7 @@ msgstr "Sortierfolge »%s« existiert nicht, wird übersprungen" msgid "conversion \"%s\" does not exist, skipping" msgstr "Konversion »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:293 commands/statscmds.c:630 +#: commands/dropcmds.c:293 commands/statscmds.c:651 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "Statistikobjekt »%s« existiert nicht, wird übersprungen" @@ -7118,7 +7384,7 @@ msgstr "Regel »%s« für Relation »%s« existiert nicht, wird übersprungen" msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "Fremddaten-Wrapper »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1351 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1347 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "Server »%s« existiert nicht, wird übersprungen" @@ -7195,12 +7461,12 @@ msgstr "Der Eigentümer eines Ereignistriggers muss ein Superuser sein." msgid "%s can only be called in a sql_drop event trigger function" msgstr "%s kann nur in einer sql_drop-Ereignistriggerfunktion aufgerufen werden" -#: commands/event_trigger.c:1424 commands/event_trigger.c:1445 +#: commands/event_trigger.c:1400 commands/event_trigger.c:1421 #, c-format msgid "%s can only be called in a table_rewrite event trigger function" msgstr "%s kann nur in einer table_rewrite-Ereignistriggerfunktion aufgerufen werden" -#: commands/event_trigger.c:1862 +#: commands/event_trigger.c:1834 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s kann nur in einer Ereignistriggerfunktion aufgerufen werden" @@ -7225,7 +7491,7 @@ msgstr "EXPLAIN-Option WAL erfordert ANALYZE" msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "EXPLAIN-Option TIMING erfordert ANALYZE" -#: commands/extension.c:173 commands/extension.c:3013 +#: commands/extension.c:173 commands/extension.c:2932 #, c-format msgid "extension \"%s\" does not exist" msgstr "Erweiterung »%s« existiert nicht" @@ -7282,193 +7548,210 @@ msgstr "Versionsnamen dürfen nicht mit »-« anfangen oder aufhören." msgid "Version names must not contain directory separator characters." msgstr "Versionsnamen dürfen keine Verzeichnistrennzeichen enthalten." -#: commands/extension.c:498 +#: commands/extension.c:502 +#, fuzzy, c-format +#| msgid "extension \"%s\" does not exist" +msgid "extension \"%s\" is not available" +msgstr "Erweiterung »%s« existiert nicht" + +#: commands/extension.c:503 +#, fuzzy, c-format +#| msgid "could not open extension control file \"%s\": %m" +msgid "Could not open extension control file \"%s\": %m." +msgstr "konnte Erweiterungskontrolldatei »%s« nicht öffnen: %m" + +#: commands/extension.c:505 +#, c-format +msgid "The extension must first be installed on the system where PostgreSQL is running." +msgstr "" + +#: commands/extension.c:509 #, c-format msgid "could not open extension control file \"%s\": %m" msgstr "konnte Erweiterungskontrolldatei »%s« nicht öffnen: %m" -#: commands/extension.c:520 commands/extension.c:530 +#: commands/extension.c:531 commands/extension.c:541 #, c-format msgid "parameter \"%s\" cannot be set in a secondary extension control file" msgstr "Parameter »%s« kann nicht in einer sekundären Erweitungskontrolldatei gesetzt werden" -#: commands/extension.c:552 commands/extension.c:560 commands/extension.c:568 -#: utils/misc/guc.c:7092 +#: commands/extension.c:563 commands/extension.c:571 commands/extension.c:579 +#: utils/misc/guc.c:7372 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "Parameter »%s« erfordert einen Boole’schen Wert" -#: commands/extension.c:577 +#: commands/extension.c:588 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "»%s« ist kein gültiger Kodierungsname" -#: commands/extension.c:591 +#: commands/extension.c:602 #, c-format msgid "parameter \"%s\" must be a list of extension names" msgstr "Parameter »%s« muss eine Liste von Erweiterungsnamen sein" -#: commands/extension.c:598 +#: commands/extension.c:609 #, c-format msgid "unrecognized parameter \"%s\" in file \"%s\"" msgstr "unbekannter Parameter »%s« in Datei »%s«" -#: commands/extension.c:607 +#: commands/extension.c:618 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "Parameter »schema« kann nicht angegeben werden, wenn »relocatable« an ist" -#: commands/extension.c:785 +#: commands/extension.c:796 #, c-format msgid "transaction control statements are not allowed within an extension script" msgstr "Transaktionskontrollanweisungen sind nicht in einem Erweiterungsskript erlaubt" -#: commands/extension.c:861 +#: commands/extension.c:873 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "keine Berechtigung, um Erweiterung »%s« zu erzeugen" -#: commands/extension.c:864 +#: commands/extension.c:876 #, c-format msgid "Must have CREATE privilege on current database to create this extension." msgstr "CREATE-Privileg für die aktuelle Datenbank wird benötigt, um diese Erweiterung anzulegen." -#: commands/extension.c:865 +#: commands/extension.c:877 #, c-format msgid "Must be superuser to create this extension." msgstr "Nur Superuser können diese Erweiterung anlegen." -#: commands/extension.c:869 +#: commands/extension.c:881 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "keine Berechtigung, um Erweiterung »%s« zu aktualisieren" -#: commands/extension.c:872 +#: commands/extension.c:884 #, c-format msgid "Must have CREATE privilege on current database to update this extension." msgstr "CREATE-Privileg für die aktuelle Datenbank wird benötigt, um diese Erweiterung zu aktualisieren." -#: commands/extension.c:873 +#: commands/extension.c:885 #, c-format msgid "Must be superuser to update this extension." msgstr "Nur Superuser können diese Erweiterung aktualisieren." -#: commands/extension.c:1200 +#: commands/extension.c:1212 #, c-format msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" msgstr "Erweiterung »%s« hat keinen Aktualisierungspfad von Version »%s« auf Version »%s«" -#: commands/extension.c:1408 commands/extension.c:3074 +#: commands/extension.c:1420 commands/extension.c:2990 #, c-format msgid "version to install must be specified" msgstr "die zu installierende Version muss angegeben werden" -#: commands/extension.c:1445 +#: commands/extension.c:1457 #, c-format msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" msgstr "Erweiterung »%s« hat kein Installationsskript und keinen Aktualisierungspfad für Version »%s«" -#: commands/extension.c:1479 +#: commands/extension.c:1491 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "Erweiterung »%s« muss in Schema »%s« installiert werden" -#: commands/extension.c:1639 +#: commands/extension.c:1651 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "zyklische Abhängigkeit zwischen Erweiterungen »%s« und »%s« entdeckt" -#: commands/extension.c:1644 +#: commands/extension.c:1656 #, c-format msgid "installing required extension \"%s\"" msgstr "installiere benötigte Erweiterung »%s«" -#: commands/extension.c:1667 +#: commands/extension.c:1679 #, c-format msgid "required extension \"%s\" is not installed" msgstr "benötigte Erweiterung »%s« ist nicht installiert" -#: commands/extension.c:1670 +#: commands/extension.c:1682 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "Verwenden Sie CREATE EXTENSION ... CASCADE, um die benötigten Erweiterungen ebenfalls zu installieren." -#: commands/extension.c:1705 +#: commands/extension.c:1717 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "Erweiterung »%s« existiert bereits, wird übersprungen" -#: commands/extension.c:1712 +#: commands/extension.c:1724 #, c-format msgid "extension \"%s\" already exists" msgstr "Erweiterung »%s« existiert bereits" -#: commands/extension.c:1723 +#: commands/extension.c:1735 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "geschachteltes CREATE EXTENSION wird nicht unterstützt" -#: commands/extension.c:1896 +#: commands/extension.c:1899 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "Erweiterung »%s« kann nicht gelöscht werden, weil sie gerade geändert wird" -#: commands/extension.c:2457 +#: commands/extension.c:2376 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "%s kann nur von einem SQL-Skript aufgerufen werden, das von CREATE EXTENSION ausgeführt wird" -#: commands/extension.c:2469 +#: commands/extension.c:2388 #, c-format msgid "OID %u does not refer to a table" msgstr "OID %u bezieht sich nicht auf eine Tabelle" -#: commands/extension.c:2474 +#: commands/extension.c:2393 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "Tabelle »%s« ist kein Mitglied der anzulegenden Erweiterung" -#: commands/extension.c:2828 +#: commands/extension.c:2747 #, c-format msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" msgstr "kann Erweiterung »%s« nicht in Schema »%s« verschieben, weil die Erweiterung das Schema enthält" -#: commands/extension.c:2869 commands/extension.c:2932 +#: commands/extension.c:2788 commands/extension.c:2851 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "Erweiterung »%s« unterstützt SET SCHEMA nicht" -#: commands/extension.c:2934 +#: commands/extension.c:2853 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "%s ist nicht im Schema der Erweiterung (»%s«)" -#: commands/extension.c:2993 +#: commands/extension.c:2912 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "geschachteltes ALTER EXTENSION wird nicht unterstützt" -#: commands/extension.c:3085 +#: commands/extension.c:3001 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "Version »%s« von Erweiterung »%s« ist bereits installiert" -#: commands/extension.c:3297 +#: commands/extension.c:3213 #, c-format msgid "cannot add an object of this type to an extension" msgstr "ein Objekt dieses Typs kann nicht zu einer Erweiterung hinzugefügt werden" -#: commands/extension.c:3355 +#: commands/extension.c:3279 #, c-format msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "kann Schema »%s« nicht zu Erweiterung »%s« hinzufügen, weil das Schema die Erweiterung enthält" -#: commands/extension.c:3383 +#: commands/extension.c:3307 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s ist kein Mitglied der Erweiterung »%s«" -#: commands/extension.c:3449 +#: commands/extension.c:3373 #, c-format msgid "file \"%s\" is too large" msgstr "Datei »%s« ist zu groß" @@ -7498,448 +7781,458 @@ msgstr "Nur Superuser können den Eigentümer eines Fremddaten-Wrappers ändern. msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "Der Eigentümer eines Fremddaten-Wrappers muss ein Superuser sein." -#: commands/foreigncmds.c:291 commands/foreigncmds.c:711 foreign/foreign.c:701 +#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:669 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "Fremddaten-Wrapper »%s« existiert nicht" -#: commands/foreigncmds.c:584 +#: commands/foreigncmds.c:580 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" msgstr "keine Berechtigung, um Fremddaten-Wrapper »%s« zu erzeugen" -#: commands/foreigncmds.c:586 +#: commands/foreigncmds.c:582 #, c-format msgid "Must be superuser to create a foreign-data wrapper." msgstr "Nur Superuser können Fremddaten-Wrapper anlegen." -#: commands/foreigncmds.c:701 +#: commands/foreigncmds.c:697 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" msgstr "keine Berechtigung, um Fremddaten-Wrapper »%s« zu ändern" -#: commands/foreigncmds.c:703 +#: commands/foreigncmds.c:699 #, c-format msgid "Must be superuser to alter a foreign-data wrapper." msgstr "Nur Superuser können Fremddaten-Wrapper ändern." -#: commands/foreigncmds.c:734 +#: commands/foreigncmds.c:730 #, c-format msgid "changing the foreign-data wrapper handler can change behavior of existing foreign tables" msgstr "das Ändern des Handlers des Fremddaten-Wrappers kann das Verhalten von bestehenden Fremdtabellen verändern" -#: commands/foreigncmds.c:749 +#: commands/foreigncmds.c:745 #, c-format msgid "changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid" msgstr "durch Ändern des Validators des Fremddaten-Wrappers können die Optionen von abhängigen Objekten ungültig werden" -#: commands/foreigncmds.c:871 +#: commands/foreigncmds.c:867 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "Server »%s« existiert bereits, wird übersprungen" -#: commands/foreigncmds.c:1135 +#: commands/foreigncmds.c:1131 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "Benutzerabbildung für »%s« existiert bereits für Server »%s«, wird übersprungen" -#: commands/foreigncmds.c:1145 +#: commands/foreigncmds.c:1141 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "Benutzerabbildung für »%s« existiert bereits für Server »%s«" -#: commands/foreigncmds.c:1245 commands/foreigncmds.c:1365 +#: commands/foreigncmds.c:1241 commands/foreigncmds.c:1361 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "Benutzerabbildung für »%s« existiert nicht für Server »%s«" -#: commands/foreigncmds.c:1370 +#: commands/foreigncmds.c:1366 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "Benutzerabbildung für »%s« existiert nicht für Server »%s«, wird übersprungen" -#: commands/foreigncmds.c:1498 foreign/foreign.c:389 +#: commands/foreigncmds.c:1494 foreign/foreign.c:390 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "Fremddaten-Wrapper »%s« hat keinen Handler" -#: commands/foreigncmds.c:1504 +#: commands/foreigncmds.c:1500 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "Fremddaten-Wrapper »%s« unterstützt IMPORT FOREIGN SCHEMA nicht" -#: commands/foreigncmds.c:1607 +#: commands/foreigncmds.c:1602 #, c-format msgid "importing foreign table \"%s\"" msgstr "importiere Fremdtabelle »%s«" -#: commands/functioncmds.c:108 +#: commands/functioncmds.c:109 #, c-format msgid "SQL function cannot return shell type %s" msgstr "SQL-Funktion kann keinen Hüllen-Rückgabetyp %s haben" -#: commands/functioncmds.c:113 +#: commands/functioncmds.c:114 #, c-format msgid "return type %s is only a shell" msgstr "Rückgabetyp %s ist nur eine Hülle" -#: commands/functioncmds.c:143 parser/parse_type.c:354 +#: commands/functioncmds.c:144 parser/parse_type.c:354 #, c-format msgid "type modifier cannot be specified for shell type \"%s\"" msgstr "Typmodifikator kann für Hüllentyp »%s« nicht angegeben werden" -#: commands/functioncmds.c:149 +#: commands/functioncmds.c:150 #, c-format msgid "type \"%s\" is not yet defined" msgstr "Typ »%s« ist noch nicht definiert" -#: commands/functioncmds.c:150 +#: commands/functioncmds.c:151 #, c-format msgid "Creating a shell type definition." msgstr "Hüllentypdefinition wird erzeugt." -#: commands/functioncmds.c:244 +#: commands/functioncmds.c:250 #, c-format msgid "SQL function cannot accept shell type %s" msgstr "SQL-Funktion kann keinen Hüllentyp %s annehmen" -#: commands/functioncmds.c:250 +#: commands/functioncmds.c:256 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "Aggregatfunktion kann keinen Hüllentyp %s annehmen" -#: commands/functioncmds.c:255 +#: commands/functioncmds.c:261 #, c-format msgid "argument type %s is only a shell" msgstr "Argumenttyp %s ist nur eine Hülle" -#: commands/functioncmds.c:265 +#: commands/functioncmds.c:271 #, c-format msgid "type %s does not exist" msgstr "Typ %s existiert nicht" -#: commands/functioncmds.c:279 +#: commands/functioncmds.c:285 #, c-format msgid "aggregates cannot accept set arguments" msgstr "Aggregatfunktionen können keine SETOF-Argumente haben" -#: commands/functioncmds.c:283 +#: commands/functioncmds.c:289 #, c-format msgid "procedures cannot accept set arguments" msgstr "Prozeduren können keine SETOF-Argumente haben" -#: commands/functioncmds.c:287 +#: commands/functioncmds.c:293 #, c-format msgid "functions cannot accept set arguments" msgstr "Funktionen können keine SETOF-Argumente haben" -#: commands/functioncmds.c:307 +#: commands/functioncmds.c:303 +#, c-format +msgid "VARIADIC parameter must be the last input parameter" +msgstr "VARIADIC-Parameter muss der letzte Eingabeparameter sein" + +#: commands/functioncmds.c:323 #, c-format -msgid "VARIADIC parameter must be the last signature parameter" -msgstr "VARIADIC-Parameter muss der letzte Signaturparameter sein" +msgid "VARIADIC parameter must be the last parameter" +msgstr "VARIADIC-Parameter muss der letzte Parameter sein" -#: commands/functioncmds.c:337 +#: commands/functioncmds.c:348 #, c-format msgid "VARIADIC parameter must be an array" msgstr "VARIADIC-Parameter muss ein Array sein" -#: commands/functioncmds.c:377 +#: commands/functioncmds.c:393 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "Parametername »%s« mehrmals angegeben" -#: commands/functioncmds.c:395 +#: commands/functioncmds.c:411 #, c-format msgid "only input parameters can have default values" msgstr "nur Eingabeparameter können Vorgabewerte haben" -#: commands/functioncmds.c:410 +#: commands/functioncmds.c:426 #, c-format msgid "cannot use table references in parameter default value" msgstr "Tabellenverweise können nicht in Parametervorgabewerten verwendet werden" -#: commands/functioncmds.c:434 +#: commands/functioncmds.c:450 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "Eingabeparameter hinter einem mit Vorgabewert müssen auch einen Vorgabewert haben" -#: commands/functioncmds.c:586 commands/functioncmds.c:777 +#: commands/functioncmds.c:460 +#, c-format +msgid "procedure OUT parameters cannot appear after one with a default value" +msgstr "Prozedur-OUT-Parameter können nicht nach einem Parameter mit Vorgabewert stehen" + +#: commands/functioncmds.c:605 commands/functioncmds.c:784 #, c-format msgid "invalid attribute in procedure definition" msgstr "ungültiges Attribut in Prozedurdefinition" -#: commands/functioncmds.c:682 +#: commands/functioncmds.c:701 #, c-format msgid "support function %s must return type %s" msgstr "Unterstützungsfunktion %s muss Rückgabetyp %s haben" -#: commands/functioncmds.c:693 +#: commands/functioncmds.c:712 #, c-format msgid "must be superuser to specify a support function" msgstr "nur Superuser können eine Support-Funktion angeben" -#: commands/functioncmds.c:826 commands/functioncmds.c:1430 +#: commands/functioncmds.c:833 commands/functioncmds.c:1439 #, c-format msgid "COST must be positive" msgstr "COST muss positiv sein" -#: commands/functioncmds.c:834 commands/functioncmds.c:1438 +#: commands/functioncmds.c:841 commands/functioncmds.c:1447 #, c-format msgid "ROWS must be positive" msgstr "ROWS muss positiv sein" -#: commands/functioncmds.c:863 +#: commands/functioncmds.c:870 #, c-format msgid "no function body specified" msgstr "kein Funktionskörper angegeben" -#: commands/functioncmds.c:868 +#: commands/functioncmds.c:875 #, c-format msgid "duplicate function body specified" msgstr "doppelter Funktionskörper angegeben" -#: commands/functioncmds.c:873 +#: commands/functioncmds.c:880 #, c-format msgid "inline SQL function body only valid for language SQL" msgstr "Inline-SQL-Funktionskörper ist nur gültig für Sprache SQL" -#: commands/functioncmds.c:915 +#: commands/functioncmds.c:922 #, c-format msgid "SQL function with unquoted function body cannot have polymorphic arguments" msgstr "SQL-Funktion mit Funktionsrumpf nicht in Anführungszeichen kann keine polymorphen Argumente haben" -#: commands/functioncmds.c:941 commands/functioncmds.c:960 +#: commands/functioncmds.c:948 commands/functioncmds.c:967 #, c-format msgid "%s is not yet supported in unquoted SQL function body" msgstr "%s ist in SQL-Funktionen nicht in Anführungszeichen noch nicht erlaubt" -#: commands/functioncmds.c:988 +#: commands/functioncmds.c:995 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "nur ein AS-Element benötigt für Sprache »%s«" -#: commands/functioncmds.c:1093 +#: commands/functioncmds.c:1100 #, c-format msgid "no language specified" msgstr "keine Sprache angegeben" -#: commands/functioncmds.c:1101 commands/functioncmds.c:2103 +#: commands/functioncmds.c:1108 commands/functioncmds.c:2109 #: commands/proclang.c:237 #, c-format msgid "language \"%s\" does not exist" msgstr "Sprache »%s« existiert nicht" -#: commands/functioncmds.c:1103 commands/functioncmds.c:2105 +#: commands/functioncmds.c:1110 commands/functioncmds.c:2111 #, c-format msgid "Use CREATE EXTENSION to load the language into the database." msgstr "Verwenden Sie CREATE EXTENSION, um die Sprache in die Datenbank zu laden." -#: commands/functioncmds.c:1138 commands/functioncmds.c:1422 +#: commands/functioncmds.c:1145 commands/functioncmds.c:1431 #, c-format msgid "only superuser can define a leakproof function" msgstr "nur Superuser können eine »leakproof«-Funktion definieren" -#: commands/functioncmds.c:1189 +#: commands/functioncmds.c:1196 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "Ergebnistyp der Funktion muss %s sein wegen OUT-Parametern" -#: commands/functioncmds.c:1202 +#: commands/functioncmds.c:1209 #, c-format msgid "function result type must be specified" msgstr "Ergebnistyp der Funktion muss angegeben werden" -#: commands/functioncmds.c:1256 commands/functioncmds.c:1442 +#: commands/functioncmds.c:1263 commands/functioncmds.c:1451 #, c-format msgid "ROWS is not applicable when function does not return a set" msgstr "ROWS ist nicht anwendbar, wenn die Funktion keine Ergebnismenge zurückgibt" -#: commands/functioncmds.c:1542 +#: commands/functioncmds.c:1552 #, c-format msgid "source data type %s is a pseudo-type" msgstr "Quelldatentyp %s ist ein Pseudotyp" -#: commands/functioncmds.c:1548 +#: commands/functioncmds.c:1558 #, c-format msgid "target data type %s is a pseudo-type" msgstr "Zieldatentyp %s ist ein Pseudotyp" -#: commands/functioncmds.c:1572 +#: commands/functioncmds.c:1582 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "Typumwandlung wird ignoriert werden, weil der Quelldatentyp eine Domäne ist" -#: commands/functioncmds.c:1577 +#: commands/functioncmds.c:1587 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "Typumwandlung wird ignoriert werden, weil der Zieldatentyp eine Domäne ist" -#: commands/functioncmds.c:1602 +#: commands/functioncmds.c:1612 #, c-format msgid "cast function must take one to three arguments" msgstr "Typumwandlungsfunktion muss ein bis drei Argumente haben" -#: commands/functioncmds.c:1606 +#: commands/functioncmds.c:1616 #, c-format msgid "argument of cast function must match or be binary-coercible from source data type" msgstr "Argument der Typumwandlungsfunktion muss mit Quelldatentyp übereinstimmen oder in ihn binär-umwandelbar sein" -#: commands/functioncmds.c:1610 +#: commands/functioncmds.c:1620 #, c-format msgid "second argument of cast function must be type %s" msgstr "zweites Argument der Typumwandlungsfunktion muss Typ %s haben" -#: commands/functioncmds.c:1615 +#: commands/functioncmds.c:1625 #, c-format msgid "third argument of cast function must be type %s" msgstr "drittes Argument der Typumwandlungsfunktion muss Typ %s haben" -#: commands/functioncmds.c:1620 +#: commands/functioncmds.c:1630 #, c-format msgid "return data type of cast function must match or be binary-coercible to target data type" msgstr "Rückgabetyp der Typumwandlungsfunktion muss mit Zieldatentyp übereinstimmen oder in ihn binär-umwandelbar sein" -#: commands/functioncmds.c:1631 +#: commands/functioncmds.c:1641 #, c-format msgid "cast function must not be volatile" msgstr "Typumwandlungsfunktion darf nicht VOLATILE sein" -#: commands/functioncmds.c:1636 +#: commands/functioncmds.c:1646 #, c-format msgid "cast function must be a normal function" msgstr "Typumwandlungsfunktion muss eine normale Funktion sein" -#: commands/functioncmds.c:1640 +#: commands/functioncmds.c:1650 #, c-format msgid "cast function must not return a set" msgstr "Typumwandlungsfunktion darf keine Ergebnismenge zurückgeben" -#: commands/functioncmds.c:1666 +#: commands/functioncmds.c:1676 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "nur Superuser können Typumwandlungen mit WITHOUT FUNCTION erzeugen" -#: commands/functioncmds.c:1681 +#: commands/functioncmds.c:1691 #, c-format msgid "source and target data types are not physically compatible" msgstr "Quelldatentyp und Zieldatentyp sind nicht physikalisch kompatibel" -#: commands/functioncmds.c:1696 +#: commands/functioncmds.c:1706 #, c-format msgid "composite data types are not binary-compatible" msgstr "zusammengesetzte Datentypen sind nicht binärkompatibel" -#: commands/functioncmds.c:1702 +#: commands/functioncmds.c:1712 #, c-format msgid "enum data types are not binary-compatible" msgstr "Enum-Datentypen sind nicht binärkompatibel" -#: commands/functioncmds.c:1708 +#: commands/functioncmds.c:1718 #, c-format msgid "array data types are not binary-compatible" msgstr "Array-Datentypen sind nicht binärkompatibel" -#: commands/functioncmds.c:1725 +#: commands/functioncmds.c:1735 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "Domänendatentypen dürfen nicht als binärkompatibel markiert werden" -#: commands/functioncmds.c:1735 +#: commands/functioncmds.c:1745 #, c-format msgid "source data type and target data type are the same" msgstr "Quelldatentyp und Zieldatentyp sind der selbe" -#: commands/functioncmds.c:1768 +#: commands/functioncmds.c:1778 #, c-format msgid "transform function must not be volatile" msgstr "Transformationsfunktion darf nicht VOLATILE sein" -#: commands/functioncmds.c:1772 +#: commands/functioncmds.c:1782 #, c-format msgid "transform function must be a normal function" msgstr "Transformationsfunktion muss eine normale Funktion sein" -#: commands/functioncmds.c:1776 +#: commands/functioncmds.c:1786 #, c-format msgid "transform function must not return a set" msgstr "Transformationsfunktion darf keine Ergebnismenge zurückgeben" -#: commands/functioncmds.c:1780 +#: commands/functioncmds.c:1790 #, c-format msgid "transform function must take one argument" msgstr "Transformationsfunktion muss ein Argument haben" -#: commands/functioncmds.c:1784 +#: commands/functioncmds.c:1794 #, c-format msgid "first argument of transform function must be type %s" msgstr "erstes Argument der Transformationsfunktion muss Typ %s haben" -#: commands/functioncmds.c:1823 +#: commands/functioncmds.c:1833 #, c-format msgid "data type %s is a pseudo-type" msgstr "Datentyp %s ist ein Pseudotyp" -#: commands/functioncmds.c:1829 +#: commands/functioncmds.c:1839 #, c-format msgid "data type %s is a domain" msgstr "Datentyp %s ist eine Domäne" -#: commands/functioncmds.c:1869 +#: commands/functioncmds.c:1879 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "Rückgabetyp der FROM-SQL-Funktion muss %s sein" -#: commands/functioncmds.c:1895 +#: commands/functioncmds.c:1905 #, c-format msgid "return data type of TO SQL function must be the transform data type" msgstr "Rückgabetyp der TO-SQL-Funktion muss der zu transformierende Datentyp sein" -#: commands/functioncmds.c:1924 +#: commands/functioncmds.c:1934 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "Transformation für Typ %s Sprache »%s« existiert bereits" -#: commands/functioncmds.c:2011 +#: commands/functioncmds.c:2021 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "Transformation für Typ %s Sprache »%s« existiert nicht" -#: commands/functioncmds.c:2035 +#: commands/functioncmds.c:2045 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "Funktion %s existiert bereits in Schema »%s«" -#: commands/functioncmds.c:2090 +#: commands/functioncmds.c:2096 #, c-format msgid "no inline code specified" msgstr "kein Inline-Code angegeben" -#: commands/functioncmds.c:2136 +#: commands/functioncmds.c:2142 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "Sprache »%s« unterstützt das Ausführen von Inline-Code nicht" -#: commands/functioncmds.c:2253 +#: commands/functioncmds.c:2237 #, c-format msgid "cannot pass more than %d argument to a procedure" msgid_plural "cannot pass more than %d arguments to a procedure" msgstr[0] "kann nicht mehr als %d Argument an eine Prozedur übergeben" msgstr[1] "kann nicht mehr als %d Argumente an eine Prozedur übergeben" -#: commands/indexcmds.c:618 +#: commands/indexcmds.c:619 #, c-format msgid "must specify at least one column" msgstr "mindestens eine Spalte muss angegeben werden" -#: commands/indexcmds.c:622 +#: commands/indexcmds.c:623 #, c-format msgid "cannot use more than %d columns in an index" msgstr "Index kann nicht mehr als %d Spalten enthalten" -#: commands/indexcmds.c:661 +#: commands/indexcmds.c:666 #, c-format -msgid "cannot create index on foreign table \"%s\"" -msgstr "kann keinen Index für Fremdtabelle »%s« erzeugen" +msgid "cannot create index on relation \"%s\"" +msgstr "kann keinen Index für Relation »%s« erzeugen" #: commands/indexcmds.c:692 #, c-format @@ -7956,12 +8249,12 @@ msgstr "kann keinen Exclusion-Constraint für partitionierte Tabelle »%s« erze msgid "cannot create indexes on temporary tables of other sessions" msgstr "kann keine Indexe für temporäre Tabellen anderer Sitzungen erzeugen" -#: commands/indexcmds.c:745 commands/tablecmds.c:748 commands/tablespace.c:1185 +#: commands/indexcmds.c:745 commands/tablecmds.c:779 commands/tablespace.c:1226 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "für partitionierte Relationen kann kein Standard-Tablespace angegeben werden" -#: commands/indexcmds.c:777 commands/tablecmds.c:783 commands/tablecmds.c:3299 +#: commands/indexcmds.c:777 commands/tablecmds.c:814 commands/tablecmds.c:3302 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "nur geteilte Relationen können in den Tablespace »pg_global« gelegt werden" @@ -7991,264 +8284,268 @@ msgstr "Zugriffsmethode »%s« unterstützt keine mehrspaltigen Indexe" msgid "access method \"%s\" does not support exclusion constraints" msgstr "Zugriffsmethode »%s« unterstützt keine Exclusion-Constraints" -#: commands/indexcmds.c:969 +#: commands/indexcmds.c:970 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "Partitionierungsschlüssel kann nicht mit Zugriffsmethode »%s« mit einem Index gepaart werden" -#: commands/indexcmds.c:979 +#: commands/indexcmds.c:980 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "nicht unterstützter %s-Constraint mit Partitionierungsschlüsseldefinition" -#: commands/indexcmds.c:981 +#: commands/indexcmds.c:982 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "%s-Constraints können nicht verwendet werden, wenn Partitionierungsschlüssel Ausdrücke enthalten." -#: commands/indexcmds.c:1020 +#: commands/indexcmds.c:1021 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "Unique-Constraint für partitionierte Tabelle muss alle Partitionierungsspalten enthalten" -#: commands/indexcmds.c:1021 +#: commands/indexcmds.c:1022 #, c-format msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." msgstr "Im %s-Constraint in Tabelle »%s« fehlt Spalte »%s«, welche Teil des Partitionierungsschlüssels ist." -#: commands/indexcmds.c:1040 commands/indexcmds.c:1059 +#: commands/indexcmds.c:1041 commands/indexcmds.c:1060 #, c-format msgid "index creation on system columns is not supported" msgstr "Indexerzeugung für Systemspalten wird nicht unterstützt" -#: commands/indexcmds.c:1231 tcop/utility.c:1477 +#: commands/indexcmds.c:1254 tcop/utility.c:1518 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "kann keinen Unique Index für partitionierte Tabelle »%s« erzeugen" -#: commands/indexcmds.c:1233 tcop/utility.c:1479 +#: commands/indexcmds.c:1256 tcop/utility.c:1520 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "Tabelle »%s« enthält Partitionen, die Fremdtabellen sind." -#: commands/indexcmds.c:1683 +#: commands/indexcmds.c:1726 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "Funktionen im Indexprädikat müssen als IMMUTABLE markiert sein" -#: commands/indexcmds.c:1749 parser/parse_utilcmd.c:2525 -#: parser/parse_utilcmd.c:2660 +#: commands/indexcmds.c:1792 parser/parse_utilcmd.c:2518 +#: parser/parse_utilcmd.c:2653 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "Spalte »%s«, die im Schlüssel verwendet wird, existiert nicht" -#: commands/indexcmds.c:1773 parser/parse_utilcmd.c:1824 +#: commands/indexcmds.c:1816 parser/parse_utilcmd.c:1815 #, c-format msgid "expressions are not supported in included columns" msgstr "in eingeschlossenen Spalten werden keine Ausdrücke unterstützt" -#: commands/indexcmds.c:1814 +#: commands/indexcmds.c:1857 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "Funktionen im Indexausdruck müssen als IMMUTABLE markiert sein" -#: commands/indexcmds.c:1829 +#: commands/indexcmds.c:1872 #, c-format msgid "including column does not support a collation" msgstr "inkludierte Spalte unterstützt keine Sortierfolge" -#: commands/indexcmds.c:1833 +#: commands/indexcmds.c:1876 #, c-format msgid "including column does not support an operator class" msgstr "inkludierte Spalte unterstützt keine Operatorklasse" -#: commands/indexcmds.c:1837 +#: commands/indexcmds.c:1880 #, c-format msgid "including column does not support ASC/DESC options" msgstr "inkludierte Spalte unterstützt die Optionen ASC/DESC nicht" -#: commands/indexcmds.c:1841 +#: commands/indexcmds.c:1884 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "inkludierte Spalte unterstützt die Optionen NULLS FIRST/LAST nicht" -#: commands/indexcmds.c:1868 +#: commands/indexcmds.c:1911 #, c-format msgid "could not determine which collation to use for index expression" msgstr "konnte die für den Indexausdruck zu verwendende Sortierfolge nicht bestimmen" -#: commands/indexcmds.c:1876 commands/tablecmds.c:16802 commands/typecmds.c:810 -#: parser/parse_expr.c:2680 parser/parse_type.c:566 parser/parse_utilcmd.c:3813 -#: utils/adt/misc.c:599 +#: commands/indexcmds.c:1919 commands/tablecmds.c:17420 commands/typecmds.c:807 +#: parser/parse_expr.c:2744 parser/parse_type.c:570 parser/parse_utilcmd.c:3785 +#: utils/adt/misc.c:601 #, c-format msgid "collations are not supported by type %s" msgstr "Sortierfolgen werden von Typ %s nicht unterstützt" -#: commands/indexcmds.c:1914 +#: commands/indexcmds.c:1957 #, c-format msgid "operator %s is not commutative" msgstr "Operator %s ist nicht kommutativ" -#: commands/indexcmds.c:1916 +#: commands/indexcmds.c:1959 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "In Exclusion-Constraints können nur kommutative Operatoren verwendet werden." -#: commands/indexcmds.c:1942 +#: commands/indexcmds.c:1985 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "Operator %s ist kein Mitglied der Operatorfamilie »%s«" -#: commands/indexcmds.c:1945 +#: commands/indexcmds.c:1988 #, c-format msgid "The exclusion operator must be related to the index operator class for the constraint." msgstr "Der Exklusionsoperator muss in Beziehung zur Indexoperatorklasse des Constraints stehen." -#: commands/indexcmds.c:1980 +#: commands/indexcmds.c:2023 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "Zugriffsmethode »%s« unterstützt die Optionen ASC/DESC nicht" -#: commands/indexcmds.c:1985 +#: commands/indexcmds.c:2028 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "Zugriffsmethode »%s« unterstützt die Optionen NULLS FIRST/LAST nicht" -#: commands/indexcmds.c:2031 commands/tablecmds.c:16827 -#: commands/tablecmds.c:16833 commands/typecmds.c:2318 +#: commands/indexcmds.c:2074 commands/tablecmds.c:17445 +#: commands/tablecmds.c:17451 commands/typecmds.c:2302 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "Datentyp %s hat keine Standardoperatorklasse für Zugriffsmethode »%s«" -#: commands/indexcmds.c:2033 +#: commands/indexcmds.c:2076 #, c-format msgid "You must specify an operator class for the index or define a default operator class for the data type." msgstr "Sie müssen für den Index eine Operatorklasse angeben oder eine Standardoperatorklasse für den Datentyp definieren." -#: commands/indexcmds.c:2062 commands/indexcmds.c:2070 +#: commands/indexcmds.c:2105 commands/indexcmds.c:2113 #: commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "Operatorklasse »%s« existiert nicht für Zugriffsmethode »%s«" -#: commands/indexcmds.c:2084 commands/typecmds.c:2306 +#: commands/indexcmds.c:2127 commands/typecmds.c:2290 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "Operatorklasse »%s« akzeptiert Datentyp %s nicht" -#: commands/indexcmds.c:2174 +#: commands/indexcmds.c:2217 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "es gibt mehrere Standardoperatorklassen für Datentyp %s" -#: commands/indexcmds.c:2502 +#: commands/indexcmds.c:2545 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "unbekannte REINDEX-Option »%s«" -#: commands/indexcmds.c:2726 +#: commands/indexcmds.c:2769 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "Tabelle »%s« hat keine Indexe, die nebenläufig reindiziert werden können" -#: commands/indexcmds.c:2740 +#: commands/indexcmds.c:2783 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "Tabelle »%s« hat keine zu reindizierenden Indexe" -#: commands/indexcmds.c:2780 commands/indexcmds.c:3287 -#: commands/indexcmds.c:3415 +#: commands/indexcmds.c:2823 commands/indexcmds.c:3327 +#: commands/indexcmds.c:3455 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "Systemkataloge können nicht nebenläufig reindiziert werden" -#: commands/indexcmds.c:2803 +#: commands/indexcmds.c:2846 #, c-format msgid "can only reindex the currently open database" msgstr "nur die aktuell geöffnete Datenbank kann reindiziert werden" -#: commands/indexcmds.c:2891 +#: commands/indexcmds.c:2934 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "Systemkataloge können nicht nebenläufig reindiziert werden, werden alle übersprungen" -#: commands/indexcmds.c:2924 +#: commands/indexcmds.c:2967 #, c-format msgid "cannot move system relations, skipping all" msgstr "Systemrelationen können nicht verschoben werden, werden alle übersprungen" -#: commands/indexcmds.c:2971 +#: commands/indexcmds.c:3013 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "beim Reindizieren der partitionierten Tabelle »%s.%s«" -#: commands/indexcmds.c:2974 +#: commands/indexcmds.c:3016 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "beim Reindizieren des partitionierten Index »%s.%s«" -#: commands/indexcmds.c:3167 commands/indexcmds.c:4003 +#: commands/indexcmds.c:3207 commands/indexcmds.c:4063 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "Tabelle »%s.%s« wurde neu indiziert" -#: commands/indexcmds.c:3319 commands/indexcmds.c:3371 +#: commands/indexcmds.c:3359 commands/indexcmds.c:3411 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "ungültiger Index »%s.%s« kann nicht nebenläufig reindizert werden, wird übersprungen" -#: commands/indexcmds.c:3325 +#: commands/indexcmds.c:3365 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "Exclusion-Constraint-Index »%s.%s« kann nicht nebenläufig reindizert werden, wird übersprungen" -#: commands/indexcmds.c:3480 +#: commands/indexcmds.c:3520 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "diese Art Relation kann nicht nebenläufig reindiziert werden" -#: commands/indexcmds.c:3501 +#: commands/indexcmds.c:3541 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "nicht geteilte Relation kann nicht nach Tablespace »%s« verschoben werden" -#: commands/indexcmds.c:3984 commands/indexcmds.c:3996 +#: commands/indexcmds.c:4044 commands/indexcmds.c:4056 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "Index »%s.%s« wurde neu indiziert" -#: commands/lockcmds.c:92 commands/tablecmds.c:6019 commands/trigger.c:289 -#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:938 +#: commands/indexcmds.c:4046 commands/indexcmds.c:4065 +#, c-format +msgid "%s." +msgstr "%s." + +#: commands/lockcmds.c:92 #, c-format -msgid "\"%s\" is not a table or view" -msgstr "»%s« ist keine Tabelle oder Sicht" +msgid "cannot lock relation \"%s\"" +msgstr "kann Relation »%s« nicht sperren" -#: commands/matview.c:182 +#: commands/matview.c:193 #, c-format msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "CONCURRENTLY kann nicht verwendet werden, wenn die materialisierte Sicht nicht befüllt ist" -#: commands/matview.c:188 +#: commands/matview.c:199 gram.y:19067 #, c-format -msgid "CONCURRENTLY and WITH NO DATA options cannot be used together" -msgstr "Optionen CONCURRENTLY und WITH NO DATA können nicht zusammen verwendet werden" +msgid "%s and %s options cannot be used together" +msgstr "Optionen %s und %s können nicht zusammen verwendet werden" -#: commands/matview.c:244 +#: commands/matview.c:256 #, c-format msgid "cannot refresh materialized view \"%s\" concurrently" msgstr "kann materialisierte Sicht »%s« nicht nebenläufig auffrischen" -#: commands/matview.c:247 +#: commands/matview.c:259 #, c-format msgid "Create a unique index with no WHERE clause on one or more columns of the materialized view." msgstr "Erzeugen Sie einen Unique Index ohne WHERE-Klausel für eine oder mehrere Spalten der materialisierten Sicht." -#: commands/matview.c:652 +#: commands/matview.c:653 #, c-format msgid "new data for materialized view \"%s\" contains duplicate rows without any null columns" msgstr "neue Daten für materialisierte Sicht »%s« enthalten doppelte Zeilen ohne Spalten mit NULL-Werten" -#: commands/matview.c:654 +#: commands/matview.c:655 #, c-format msgid "Row: %s" msgstr "Zeile: %s" @@ -8525,58 +8822,53 @@ msgstr "Join-Schätzfunktion %s muss Typ %s zurückgeben" msgid "operator attribute \"%s\" cannot be changed" msgstr "Operator-Attribut »%s« kann nicht geändert werden" -#: commands/policy.c:88 commands/policy.c:381 commands/policy.c:471 -#: commands/statscmds.c:150 commands/tablecmds.c:1561 commands/tablecmds.c:2150 -#: commands/tablecmds.c:3409 commands/tablecmds.c:5998 -#: commands/tablecmds.c:8860 commands/tablecmds.c:16392 -#: commands/tablecmds.c:16427 commands/trigger.c:295 commands/trigger.c:1271 -#: commands/trigger.c:1380 rewrite/rewriteDefine.c:277 -#: rewrite/rewriteDefine.c:943 rewrite/rewriteRemove.c:80 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 +#: commands/tablecmds.c:1607 commands/tablecmds.c:2187 +#: commands/tablecmds.c:3413 commands/tablecmds.c:6281 +#: commands/tablecmds.c:9073 commands/tablecmds.c:17000 +#: commands/tablecmds.c:17035 commands/trigger.c:327 commands/trigger.c:1382 +#: commands/trigger.c:1492 rewrite/rewriteDefine.c:278 +#: rewrite/rewriteDefine.c:945 rewrite/rewriteRemove.c:80 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "keine Berechtigung: »%s« ist ein Systemkatalog" -#: commands/policy.c:171 +#: commands/policy.c:172 #, c-format msgid "ignoring specified roles other than PUBLIC" msgstr "angegebene Rollen außer PUBLIC werden ignoriert" -#: commands/policy.c:172 +#: commands/policy.c:173 #, c-format msgid "All roles are members of the PUBLIC role." msgstr "Alle Rollen sind Mitglieder der Rolle PUBLIC." -#: commands/policy.c:495 -#, c-format -msgid "role \"%s\" could not be removed from policy \"%s\" on \"%s\"" -msgstr "Rolle »%s« konnte nicht aus Policy »%s« für »%s« entfernt werden" - -#: commands/policy.c:704 +#: commands/policy.c:607 #, c-format msgid "WITH CHECK cannot be applied to SELECT or DELETE" msgstr "WITH CHECK kann nicht auf SELECT oder DELETE angewendet werden" -#: commands/policy.c:713 commands/policy.c:1018 +#: commands/policy.c:616 commands/policy.c:921 #, c-format msgid "only WITH CHECK expression allowed for INSERT" msgstr "für INSERT sind nur WITH-CHECK-Ausdrücke erlaubt" -#: commands/policy.c:788 commands/policy.c:1241 +#: commands/policy.c:691 commands/policy.c:1144 #, c-format msgid "policy \"%s\" for table \"%s\" already exists" msgstr "Policy »%s« für Tabelle »%s« existiert bereits" -#: commands/policy.c:990 commands/policy.c:1269 commands/policy.c:1340 +#: commands/policy.c:893 commands/policy.c:1172 commands/policy.c:1243 #, c-format msgid "policy \"%s\" for table \"%s\" does not exist" msgstr "Policy »%s« für Tabelle »%s« existiert nicht" -#: commands/policy.c:1008 +#: commands/policy.c:911 #, c-format msgid "only USING expression allowed for SELECT, DELETE" msgstr "für SELECT und DELETE sind nur USING-Ausdrücke erlaubt" -#: commands/portalcmds.c:60 commands/portalcmds.c:187 commands/portalcmds.c:238 +#: commands/portalcmds.c:60 commands/portalcmds.c:181 commands/portalcmds.c:232 #, c-format msgid "invalid cursor name: must not be empty" msgstr "ungültiger Cursorname: darf nicht leer sein" @@ -8586,53 +8878,43 @@ msgstr "ungültiger Cursorname: darf nicht leer sein" msgid "cannot create a cursor WITH HOLD within security-restricted operation" msgstr "kann WITH-HOLD-Cursor nicht in einer sicherheitsbeschränkten Operation erzeugen" -#: commands/portalcmds.c:195 commands/portalcmds.c:248 -#: executor/execCurrent.c:70 utils/adt/xml.c:2594 utils/adt/xml.c:2764 +#: commands/portalcmds.c:189 commands/portalcmds.c:242 +#: executor/execCurrent.c:70 utils/adt/xml.c:2593 utils/adt/xml.c:2763 #, c-format msgid "cursor \"%s\" does not exist" msgstr "Cursor »%s« existiert nicht" -#: commands/prepare.c:76 +#: commands/prepare.c:75 #, c-format msgid "invalid statement name: must not be empty" msgstr "ungültiger Anweisungsname: darf nicht leer sein" -#: commands/prepare.c:134 parser/parse_param.c:313 tcop/postgres.c:1473 -#, c-format -msgid "could not determine data type of parameter $%d" -msgstr "konnte Datentyp von Parameter $%d nicht ermitteln" - -#: commands/prepare.c:152 -#, c-format -msgid "utility statements cannot be prepared" -msgstr "Utility-Anweisungen können nicht vorbereitet werden" - -#: commands/prepare.c:256 commands/prepare.c:261 +#: commands/prepare.c:230 commands/prepare.c:235 #, c-format msgid "prepared statement is not a SELECT" msgstr "vorbereitete Anweisung ist kein SELECT" -#: commands/prepare.c:328 +#: commands/prepare.c:295 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "falsche Anzahl Parameter für vorbereitete Anweisung »%s«" -#: commands/prepare.c:330 +#: commands/prepare.c:297 #, c-format msgid "Expected %d parameters but got %d." msgstr "%d Parameter erwartet aber %d erhalten." -#: commands/prepare.c:363 +#: commands/prepare.c:330 #, c-format msgid "parameter $%d of type %s cannot be coerced to the expected type %s" msgstr "Parameter $%d mit Typ %s kann nicht in erwarteten Typ %s umgewandelt werden" -#: commands/prepare.c:447 +#: commands/prepare.c:414 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "vorbereitete Anweisung »%s« existiert bereits" -#: commands/prepare.c:486 +#: commands/prepare.c:453 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "vorbereitete Anweisung »%s« existiert nicht" @@ -8642,67 +8924,223 @@ msgstr "vorbereitete Anweisung »%s« existiert nicht" msgid "must be superuser to create custom procedural language" msgstr "nur Superuser können maßgeschneiderte prozedurale Sprachen erzeugen" -#: commands/publicationcmds.c:107 +#: commands/publicationcmds.c:129 #, c-format msgid "invalid list syntax for \"publish\" option" msgstr "ungültige Listensyntax für »publish«-Option" -#: commands/publicationcmds.c:125 +#: commands/publicationcmds.c:147 #, c-format msgid "unrecognized \"publish\" value: \"%s\"" msgstr "unbekannter »publish«-Wert: »%s«" -#: commands/publicationcmds.c:140 +#: commands/publicationcmds.c:160 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "unbekannter Publikationsparameter: »%s«" -#: commands/publicationcmds.c:172 +#: commands/publicationcmds.c:201 +#, fuzzy, c-format +#| msgid "no schema has been selected to create in" +msgid "no schema has been selected for CURRENT_SCHEMA" +msgstr "kein Schema für die Objekterzeugung ausgewählt" + +#: commands/publicationcmds.c:240 +#, c-format +msgid "Table \"%s\" in schema \"%s\" is already part of the publication, adding the same schema is not supported." +msgstr "" + +#: commands/publicationcmds.c:246 +#, fuzzy, c-format +#| msgid "cannot use relation \"%s.%s\" as logical replication target" +msgid "cannot add relation \"%s.%s\" to publication" +msgstr "Relation »%s.%s« kann nicht als Ziel für logische Replikation verwendet werden" + +#: commands/publicationcmds.c:249 +#, c-format +msgid "Table's schema \"%s\" is already part of the publication or part of the specified schema list." +msgstr "" + +#: commands/publicationcmds.c:504 +#, fuzzy +#| msgid "set-returning functions are not allowed in %s" +msgid "User-defined types are not allowed." +msgstr "Funktionen mit Ergebnismenge sind in %s nicht erlaubt" + +#: commands/publicationcmds.c:507 +#, fuzzy +#| msgid "set-returning functions are not allowed in %s" +msgid "User-defined or built-in mutable functions are not allowed." +msgstr "Funktionen mit Ergebnismenge sind in %s nicht erlaubt" + +#: commands/publicationcmds.c:510 +#, fuzzy +#| msgid "set-returning functions are not allowed in %s" +msgid "User-defined collations are not allowed." +msgstr "Funktionen mit Ergebnismenge sind in %s nicht erlaubt" + +#: commands/publicationcmds.c:564 +#, fuzzy +#| msgid "System catalog modifications are currently disallowed." +msgid "System columns are not allowed." +msgstr "Änderungen an Systemkatalogen sind gegenwärtig nicht erlaubt." + +#: commands/publicationcmds.c:571 commands/publicationcmds.c:576 +#: commands/publicationcmds.c:593 +#, fuzzy +#| msgid "grouping operations are not allowed in %s" +msgid "User-defined operators are not allowed." +msgstr "Gruppieroperationen sind in %s nicht erlaubt" + +#: commands/publicationcmds.c:617 +msgid "Expressions only allow columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions." +msgstr "" + +#: commands/publicationcmds.c:631 +#, fuzzy, c-format +#| msgid "invalid publication_names syntax" +msgid "invalid publication WHERE expression" +msgstr "ungültige Syntax für publication_names" + +#: commands/publicationcmds.c:684 +#, fuzzy, c-format +#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgid "cannot use publication WHERE clause for relation \"%s\"" +msgstr "Constraint »%s« von Relation »%s« kann nicht geändert werden" + +#: commands/publicationcmds.c:686 +#, fuzzy, c-format +#| msgid "cannot cluster a partitioned table" +msgid "WHERE clause cannot be used for a partitioned table when %s is false." +msgstr "eine partitionierte Tabelle kann nicht geclustert werden" + +#: commands/publicationcmds.c:744 +#, fuzzy, c-format +#| msgid "cannot alter inherited column \"%s\" of relation \"%s\"" +msgid "cannot use publication column list for relation \"%s\"" +msgstr "geerbte Spalte »%s« von Relation »%s« kann nicht geändert werden" + +#: commands/publicationcmds.c:746 +#, fuzzy, c-format +#| msgid "cannot cluster a partitioned table" +msgid "column list cannot be used for a partitioned table when %s is false." +msgstr "eine partitionierte Tabelle kann nicht geclustert werden" + +#: commands/publicationcmds.c:781 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "nur Superuser können eine Publikation FOR ALL TABLES erzeugen" -#: commands/publicationcmds.c:248 +#: commands/publicationcmds.c:854 +#, fuzzy, c-format +#| msgid "must be superuser to create FOR ALL TABLES publication" +msgid "must be superuser to create FOR ALL TABLES IN SCHEMA publication" +msgstr "nur Superuser können eine Publikation FOR ALL TABLES erzeugen" + +#: commands/publicationcmds.c:893 #, c-format msgid "wal_level is insufficient to publish logical changes" msgstr "wal_level ist nicht ausreichend, um logische Veränderungen zu publizieren" -#: commands/publicationcmds.c:249 +#: commands/publicationcmds.c:894 #, c-format msgid "Set wal_level to logical before creating subscriptions." msgstr "Setzen Sie wal_level auf »logical« bevor Sie Subskriptionen erzeugen." -#: commands/publicationcmds.c:369 +#: commands/publicationcmds.c:991 commands/publicationcmds.c:999 +#, fuzzy, c-format +#| msgid "cannot set parameter \"%s\" within security-definer function" +msgid "cannot set parameter \"%s\" to false for publication \"%s\"" +msgstr "Parameter »%s« kann nicht in einer Security-Definer-Funktion gesetzt werden" + +#: commands/publicationcmds.c:994 +#, c-format +msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "" + +#: commands/publicationcmds.c:1002 +#, c-format +msgid "The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "" + +#: commands/publicationcmds.c:1364 +#, fuzzy, c-format +#| msgid "must be superuser to set schema of %s" +msgid "must be superuser to add or set schemas" +msgstr "nur Superuser können Schema von %s setzen" + +#: commands/publicationcmds.c:1373 commands/publicationcmds.c:1381 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "Publikation »%s« ist als FOR ALL TABLES definiert" -#: commands/publicationcmds.c:371 +#: commands/publicationcmds.c:1375 +#, fuzzy, c-format +#| msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." +msgid "Tables from schema cannot be added to, dropped from, or set on FOR ALL TABLES publications." +msgstr "In einer FOR-ALL-TABLES-Publikation können keine Tabellen hinzugefügt oder entfernt werden." + +#: commands/publicationcmds.c:1383 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "In einer FOR-ALL-TABLES-Publikation können keine Tabellen hinzugefügt oder entfernt werden." -#: commands/publicationcmds.c:660 +#: commands/publicationcmds.c:1642 commands/publicationcmds.c:1705 +#, fuzzy, c-format +#| msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" +msgid "conflicting or redundant WHERE clauses for table \"%s\"" +msgstr "widersprüchliche oder überflüssige NULL/NOT NULL-Deklarationen für Spalte »%s«" + +#: commands/publicationcmds.c:1649 commands/publicationcmds.c:1717 +#, fuzzy, c-format +#| msgid "conflicting or redundant options" +msgid "conflicting or redundant column lists for table \"%s\"" +msgstr "widersprüchliche oder überflüssige Optionen" + +#: commands/publicationcmds.c:1851 +#, fuzzy, c-format +#| msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" +msgid "column list must not be specified in ALTER PUBLICATION ... DROP" +msgstr "Operatorargumenttypen müssen in ALTER OPERATOR FAMILY angegeben werden" + +#: commands/publicationcmds.c:1863 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "Relation »%s« ist nicht Teil der Publikation" -#: commands/publicationcmds.c:703 +#: commands/publicationcmds.c:1870 +#, c-format +msgid "cannot use a WHERE clause when removing a table from a publication" +msgstr "" + +#: commands/publicationcmds.c:1930 +#, fuzzy, c-format +#| msgid "relation \"%s\" is not part of the publication" +msgid "tables from schema \"%s\" are not part of the publication" +msgstr "Relation »%s« ist nicht Teil der Publikation" + +#: commands/publicationcmds.c:1973 commands/publicationcmds.c:1980 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "keine Berechtigung, um Eigentümer der Publikation »%s« zu ändern" -#: commands/publicationcmds.c:705 +#: commands/publicationcmds.c:1975 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "Der Eigentümer einer FOR-ALL-TABLES-Publikation muss ein Superuser sein." -#: commands/schemacmds.c:105 commands/schemacmds.c:258 +#: commands/publicationcmds.c:1982 +#, fuzzy, c-format +#| msgid "The owner of a FOR ALL TABLES publication must be a superuser." +msgid "The owner of a FOR ALL TABLES IN SCHEMA publication must be a superuser." +msgstr "Der Eigentümer einer FOR-ALL-TABLES-Publikation muss ein Superuser sein." + +#: commands/schemacmds.c:105 commands/schemacmds.c:259 #, c-format msgid "unacceptable schema name \"%s\"" msgstr "inakzeptabler Schemaname »%s«" -#: commands/schemacmds.c:106 commands/schemacmds.c:259 +#: commands/schemacmds.c:106 commands/schemacmds.c:260 #, c-format msgid "The prefix \"pg_\" is reserved for system schemas." msgstr "Der Präfix »pg_« ist für Systemschemas reserviert." @@ -8712,2206 +9150,2311 @@ msgstr "Der Präfix »pg_« ist für Systemschemas reserviert." msgid "schema \"%s\" already exists, skipping" msgstr "Schema »%s« existiert bereits, wird übersprungen" -#: commands/seclabel.c:129 +#: commands/seclabel.c:131 #, c-format msgid "no security label providers have been loaded" msgstr "es sind keine Security-Label-Provider geladen" -#: commands/seclabel.c:133 +#: commands/seclabel.c:135 #, c-format msgid "must specify provider when multiple security label providers have been loaded" msgstr "Provider muss angegeben werden, wenn mehrere Security-Label-Provider geladen sind" -#: commands/seclabel.c:151 +#: commands/seclabel.c:153 #, c-format msgid "security label provider \"%s\" is not loaded" msgstr "Security-Label-Provider »%s« ist nicht geladen" -#: commands/seclabel.c:158 +#: commands/seclabel.c:160 #, c-format msgid "security labels are not supported for this type of object" msgstr "Security-Labels werden für diese Art Objekt nicht unterstützt" -#: commands/sequence.c:140 -#, c-format -msgid "unlogged sequences are not supported" -msgstr "ungeloggte Sequenzen werden nicht unterstützt" +#: commands/seclabel.c:193 +#, fuzzy, c-format +#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgid "cannot set security label on relation \"%s\"" +msgstr "Constraint »%s« von Relation »%s« kann nicht geändert werden" -#: commands/sequence.c:709 +#: commands/sequence.c:747 #, c-format -msgid "nextval: reached maximum value of sequence \"%s\" (%s)" -msgstr "nextval: Maximalwert von Sequenz »%s« erreicht (%s)" +msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" +msgstr "nextval: Maximalwert von Sequenz »%s« erreicht (%lld)" -#: commands/sequence.c:732 +#: commands/sequence.c:766 #, c-format -msgid "nextval: reached minimum value of sequence \"%s\" (%s)" -msgstr "nextval: Minimalwert von Sequenz »%s« erreicht (%s)" +msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" +msgstr "nextval: Minimalwert von Sequenz »%s« erreicht (%lld)" -#: commands/sequence.c:850 +#: commands/sequence.c:884 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "currval von Sequenz »%s« ist in dieser Sitzung noch nicht definiert" -#: commands/sequence.c:869 commands/sequence.c:875 +#: commands/sequence.c:903 commands/sequence.c:909 #, c-format msgid "lastval is not yet defined in this session" msgstr "lastval ist in dieser Sitzung noch nicht definiert" -#: commands/sequence.c:963 +#: commands/sequence.c:989 #, c-format -msgid "setval: value %s is out of bounds for sequence \"%s\" (%s..%s)" -msgstr "setval: Wert %s ist außerhalb des gültigen Bereichs von Sequenz »%s« (%s..%s)" +msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" +msgstr "setval: Wert %lld ist außerhalb des gültigen Bereichs von Sequenz »%s« (%lld..%lld)" -#: commands/sequence.c:1359 +#: commands/sequence.c:1357 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "ungültige Sequenzoption SEQUENCE NAME" -#: commands/sequence.c:1385 +#: commands/sequence.c:1383 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "Typ von Identitätsspalte muss smallint, integer oder bigint sein" -#: commands/sequence.c:1386 +#: commands/sequence.c:1384 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "Sequenztyp muss smallint, integer oder bigint sein" -#: commands/sequence.c:1420 +#: commands/sequence.c:1418 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENT darf nicht null sein" -#: commands/sequence.c:1473 -#, c-format -msgid "MAXVALUE (%s) is out of range for sequence data type %s" +#: commands/sequence.c:1466 +#, fuzzy, c-format +#| msgid "MAXVALUE (%s) is out of range for sequence data type %s" +msgid "MAXVALUE (%lld) is out of range for sequence data type %s" msgstr "MAXVALUE (%s) ist außerhalb des gültigen Bereichs für Sequenzdatentyp %s" -#: commands/sequence.c:1510 -#, c-format -msgid "MINVALUE (%s) is out of range for sequence data type %s" +#: commands/sequence.c:1498 +#, fuzzy, c-format +#| msgid "MINVALUE (%s) is out of range for sequence data type %s" +msgid "MINVALUE (%lld) is out of range for sequence data type %s" msgstr "MINVALUE (%s) ist außerhalb des gültigen Bereichs für Sequenzdatentyp %s" -#: commands/sequence.c:1524 -#, c-format -msgid "MINVALUE (%s) must be less than MAXVALUE (%s)" +#: commands/sequence.c:1506 +#, fuzzy, c-format +#| msgid "MINVALUE (%s) must be less than MAXVALUE (%s)" +msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" msgstr "MINVALUE (%s) muss kleiner als MAXVALUE (%s) sein" -#: commands/sequence.c:1551 -#, c-format -msgid "START value (%s) cannot be less than MINVALUE (%s)" +#: commands/sequence.c:1527 +#, fuzzy, c-format +#| msgid "START value (%s) cannot be less than MINVALUE (%s)" +msgid "START value (%lld) cannot be less than MINVALUE (%lld)" msgstr "START-Wert (%s) kann nicht kleiner als MINVALUE (%s) sein" -#: commands/sequence.c:1563 -#, c-format -msgid "START value (%s) cannot be greater than MAXVALUE (%s)" +#: commands/sequence.c:1533 +#, fuzzy, c-format +#| msgid "START value (%s) cannot be greater than MAXVALUE (%s)" +msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" msgstr "START-Wert (%s) kann nicht größer als MAXVALUE (%s) sein" -#: commands/sequence.c:1593 -#, c-format -msgid "RESTART value (%s) cannot be less than MINVALUE (%s)" +#: commands/sequence.c:1557 +#, fuzzy, c-format +#| msgid "RESTART value (%s) cannot be less than MINVALUE (%s)" +msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" msgstr "RESTART-Wert (%s) kann nicht kleiner als MINVALUE (%s) sein" -#: commands/sequence.c:1605 -#, c-format -msgid "RESTART value (%s) cannot be greater than MAXVALUE (%s)" +#: commands/sequence.c:1563 +#, fuzzy, c-format +#| msgid "RESTART value (%s) cannot be greater than MAXVALUE (%s)" +msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" msgstr "RESTART-Wert (%s) kann nicht größer als MAXVALUE (%s) sein" -#: commands/sequence.c:1620 -#, c-format -msgid "CACHE (%s) must be greater than zero" +#: commands/sequence.c:1574 +#, fuzzy, c-format +#| msgid "CACHE (%s) must be greater than zero" +msgid "CACHE (%lld) must be greater than zero" msgstr "CACHE (%s) muss größer als null sein" -#: commands/sequence.c:1657 +#: commands/sequence.c:1610 #, c-format msgid "invalid OWNED BY option" msgstr "ungültige OWNED BY Option" -#: commands/sequence.c:1658 +#: commands/sequence.c:1611 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "Geben Sie OWNED BY tabelle.spalte oder OWNED BY NONE an." -#: commands/sequence.c:1683 -#, c-format -msgid "referenced relation \"%s\" is not a table or foreign table" -msgstr "Relation »%s«, auf die verwiesen wird, ist keine Tabelle oder Fremdtabelle" +#: commands/sequence.c:1636 +#, fuzzy, c-format +#| msgid "cannot move system relation \"%s\"" +msgid "sequence cannot be owned by relation \"%s\"" +msgstr "Systemrelation »%s« kann nicht verschoben werden" -#: commands/sequence.c:1690 +#: commands/sequence.c:1644 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "Sequenz muss selben Eigentümer wie die verknüpfte Tabelle haben" -#: commands/sequence.c:1694 +#: commands/sequence.c:1648 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "Sequenz muss im selben Schema wie die verknüpfte Tabelle sein" -#: commands/sequence.c:1716 +#: commands/sequence.c:1670 #, c-format msgid "cannot change ownership of identity sequence" msgstr "kann Eigentümer einer Identitätssequenz nicht ändern" -#: commands/sequence.c:1717 commands/tablecmds.c:13188 -#: commands/tablecmds.c:15817 +#: commands/sequence.c:1671 commands/tablecmds.c:13744 +#: commands/tablecmds.c:16398 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Sequenz »%s« ist mit Tabelle »%s« verknüpft." -#: commands/statscmds.c:111 commands/statscmds.c:120 tcop/utility.c:1827 +#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1870 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "in CREATE STATISTICS ist nur eine einzelne Relation erlaubt" -#: commands/statscmds.c:138 -#, c-format -msgid "relation \"%s\" is not a table, foreign table, or materialized view" -msgstr "Relation »%s« ist keine Tabelle, Fremdtabelle oder materialisierte Sicht" +#: commands/statscmds.c:136 +#, fuzzy, c-format +#| msgid "cannot rewrite system relation \"%s\"" +msgid "cannot define statistics for relation \"%s\"" +msgstr "Systemrelation »%s« kann nicht neu geschrieben werden" -#: commands/statscmds.c:188 +#: commands/statscmds.c:187 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "Statistikobjekt »%s« existiert bereits, wird übersprungen" -#: commands/statscmds.c:196 +#: commands/statscmds.c:195 #, c-format msgid "statistics object \"%s\" already exists" msgstr "Statistikobjekt »%s« existiert bereits" -#: commands/statscmds.c:207 +#: commands/statscmds.c:206 #, c-format msgid "cannot have more than %d columns in statistics" msgstr "Statistiken können nicht mehr als %d Spalten enthalten" -#: commands/statscmds.c:246 +#: commands/statscmds.c:247 commands/statscmds.c:270 commands/statscmds.c:304 #, c-format msgid "statistics creation on system columns is not supported" msgstr "Statistikerzeugung für Systemspalten wird nicht unterstützt" -#: commands/statscmds.c:253 +#: commands/statscmds.c:254 commands/statscmds.c:277 #, c-format msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" msgstr "Spalte »%s« kann nicht in Statistiken verwendet werden, weil ihr Typ %s keine Standardoperatorklasse für btree hat" -#: commands/statscmds.c:282 +#: commands/statscmds.c:321 #, c-format msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" msgstr "Ausdruck kann nicht in multivariaten Statistiken verwendet werden, weil sein Typ %s keine Standardoperatorklasse für btree hat" -#: commands/statscmds.c:303 +#: commands/statscmds.c:342 #, c-format msgid "when building statistics on a single expression, statistics kinds may not be specified" -msgstr "" +msgstr "wenn Statistiken für einen einzelnen Ausdruck gebaut werden, kann die Statistikart nicht angegeben werden" -#: commands/statscmds.c:332 +#: commands/statscmds.c:371 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "unbekannte Statistikart »%s«" -#: commands/statscmds.c:361 +#: commands/statscmds.c:400 #, c-format msgid "extended statistics require at least 2 columns" msgstr "erweiterte Statistiken benötigen mindestens 2 Spalten" -#: commands/statscmds.c:379 +#: commands/statscmds.c:418 #, c-format msgid "duplicate column name in statistics definition" msgstr "doppelter Spaltenname in Statistikdefinition" -#: commands/statscmds.c:414 +#: commands/statscmds.c:453 #, c-format msgid "duplicate expression in statistics definition" msgstr "doppelter Ausdruck in Statistikdefinition" -#: commands/statscmds.c:595 commands/tablecmds.c:7830 +#: commands/statscmds.c:616 commands/tablecmds.c:8041 #, c-format msgid "statistics target %d is too low" msgstr "Statistikziel %d ist zu niedrig" -#: commands/statscmds.c:603 commands/tablecmds.c:7838 +#: commands/statscmds.c:624 commands/tablecmds.c:8049 #, c-format msgid "lowering statistics target to %d" msgstr "setze Statistikziel auf %d herab" -#: commands/statscmds.c:626 +#: commands/statscmds.c:647 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "Statistikobjekt »%s.%s« existiert nicht, wird übersprungen" -#: commands/subscriptioncmds.c:221 +#: commands/subscriptioncmds.c:251 commands/subscriptioncmds.c:298 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "unbekannter Subskriptionsparameter: »%s«" +#: commands/subscriptioncmds.c:289 +#, fuzzy, c-format +#| msgid "invalid connection type: %s" +msgid "invalid WAL location (LSN): %s" +msgstr "ungültiger Verbindungstyp: %s" + #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:235 commands/subscriptioncmds.c:241 -#: commands/subscriptioncmds.c:247 commands/subscriptioncmds.c:266 -#: commands/subscriptioncmds.c:272 +#: commands/subscriptioncmds.c:313 commands/subscriptioncmds.c:320 +#: commands/subscriptioncmds.c:327 commands/subscriptioncmds.c:349 +#: commands/subscriptioncmds.c:365 #, c-format msgid "%s and %s are mutually exclusive options" msgstr "die Optionen %s und %s schließen einander aus" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:279 commands/subscriptioncmds.c:285 +#: commands/subscriptioncmds.c:355 commands/subscriptioncmds.c:371 #, c-format msgid "subscription with %s must also set %s" msgstr "Subskription mit %s muss auch %s setzen" -#: commands/subscriptioncmds.c:378 +#: commands/subscriptioncmds.c:433 +#, fuzzy, c-format +#| msgid "could not receive list of replicated tables from the publisher: %s" +msgid "could not receive publication from the publisher: %s" +msgid_plural "could not receive list of publications from the publisher: %s" +msgstr[0] "konnte Liste der replizierten Tabellen nicht vom Publikationsserver empfangen: %s" +msgstr[1] "konnte Liste der replizierten Tabellen nicht vom Publikationsserver empfangen: %s" + +#: commands/subscriptioncmds.c:467 +#, fuzzy, c-format +#| msgid "publication \"%s\" does not exist, skipping" +msgid "publication %s does not exist in the publisher" +msgid_plural "publications %s do not exist in the publisher" +msgstr[0] "Publikation »%s« existiert nicht, wird übersprungen" +msgstr[1] "Publikation »%s« existiert nicht, wird übersprungen" + +#: commands/subscriptioncmds.c:549 #, c-format msgid "must be superuser to create subscriptions" msgstr "nur Superuser können Subskriptionen erzeugen" -#: commands/subscriptioncmds.c:471 commands/subscriptioncmds.c:568 -#: replication/logical/tablesync.c:970 replication/logical/worker.c:3143 +#: commands/subscriptioncmds.c:650 commands/subscriptioncmds.c:778 +#: replication/logical/tablesync.c:1238 replication/logical/worker.c:3704 #, c-format msgid "could not connect to the publisher: %s" msgstr "konnte nicht mit dem Publikationsserver verbinden: %s" -#: commands/subscriptioncmds.c:513 +#: commands/subscriptioncmds.c:719 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "Replikations-Slot »%s« wurde auf dem Publikationsserver erzeugt" #. translator: %s is an SQL ALTER statement -#: commands/subscriptioncmds.c:526 +#: commands/subscriptioncmds.c:732 #, c-format msgid "tables were not subscribed, you will have to run %s to subscribe the tables" msgstr "keine Tabellen wurden zur Subskription hinzugefügt; Sie müssen %s ausführen, um Tabellen zur Subskription hinzuzufügen" -#: commands/subscriptioncmds.c:824 +#: commands/subscriptioncmds.c:1035 #, c-format msgid "cannot set %s for enabled subscription" msgstr "für eine aktivierte Subskription kann nicht %s gesetzt werden" -#: commands/subscriptioncmds.c:880 +#: commands/subscriptioncmds.c:1088 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "eine Subskription ohne Slot-Name kann nicht aktiviert werden" -#: commands/subscriptioncmds.c:932 commands/subscriptioncmds.c:980 +#: commands/subscriptioncmds.c:1131 commands/subscriptioncmds.c:1183 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION mit Refresh ist für deaktivierte Subskriptionen nicht erlaubt" -#: commands/subscriptioncmds.c:933 commands/subscriptioncmds.c:981 +#: commands/subscriptioncmds.c:1132 commands/subscriptioncmds.c:1184 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "Verwenden Sie ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1001 +#: commands/subscriptioncmds.c:1141 commands/subscriptioncmds.c:1193 +#, fuzzy, c-format +#| msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" +msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" +msgstr "ALTER SUBSCRIPTION mit Refresh ist für deaktivierte Subskriptionen nicht erlaubt" + +#: commands/subscriptioncmds.c:1142 commands/subscriptioncmds.c:1194 +#, fuzzy, c-format +#| msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." +msgid "Use ALTER SUBSCRIPTION ...SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "Verwenden Sie ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." + +#: commands/subscriptioncmds.c:1214 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH ist für eine deaktivierte Subskription nicht erlaubt" -#: commands/subscriptioncmds.c:1089 +#: commands/subscriptioncmds.c:1239 +#, fuzzy, c-format +#| msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" +msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" +msgstr "ALTER SUBSCRIPTION ... REFRESH ist für eine deaktivierte Subskription nicht erlaubt" + +#: commands/subscriptioncmds.c:1240 +#, c-format +msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "" + +#: commands/subscriptioncmds.c:1260 +#, fuzzy, c-format +#| msgid "must be superuser to set grantor" +msgid "must be superuser to skip transaction" +msgstr "nur Superuser können Grantor setzen" + +#: commands/subscriptioncmds.c:1280 +#, c-format +msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" +msgstr "" + +#: commands/subscriptioncmds.c:1360 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "Subskription »%s« existiert nicht, wird übersprungen" -#: commands/subscriptioncmds.c:1341 +#: commands/subscriptioncmds.c:1624 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "Replikations-Slot »%s« auf dem Publikationsserver wurde gelöscht" -#: commands/subscriptioncmds.c:1350 commands/subscriptioncmds.c:1357 +#: commands/subscriptioncmds.c:1633 commands/subscriptioncmds.c:1641 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" msgstr "konnte Replikations-Slot »%s« auf dem Publikationsserver nicht löschen: %s" -#: commands/subscriptioncmds.c:1391 +#: commands/subscriptioncmds.c:1675 #, c-format msgid "permission denied to change owner of subscription \"%s\"" msgstr "keine Berechtigung, um Eigentümer der Subskription »%s« zu ändern" -#: commands/subscriptioncmds.c:1393 +#: commands/subscriptioncmds.c:1677 #, c-format msgid "The owner of a subscription must be a superuser." msgstr "Der Eigentümer einer Subskription muss ein Superuser sein." -#: commands/subscriptioncmds.c:1508 +#: commands/subscriptioncmds.c:1780 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "konnte Liste der replizierten Tabellen nicht vom Publikationsserver empfangen: %s" -#: commands/subscriptioncmds.c:1572 +#: commands/subscriptioncmds.c:1845 #, c-format msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" msgstr "konnte beim Versuch den Replikations-Slot »%s« zu löschen nicht mit dem Publikationsserver verbinden: %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1575 +#: commands/subscriptioncmds.c:1848 #, c-format msgid "Use %s to disassociate the subscription from the slot." msgstr "Verwenden Sie %s, um die Subskription vom Slot zu trennen." -#: commands/subscriptioncmds.c:1605 +#: commands/subscriptioncmds.c:1878 #, c-format msgid "publication name \"%s\" used more than once" msgstr "Publikationsname »%s« mehrmals angegeben" -#: commands/subscriptioncmds.c:1649 +#: commands/subscriptioncmds.c:1922 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "Publikation »%s« ist bereits in Subskription »%s«" -#: commands/subscriptioncmds.c:1663 +#: commands/subscriptioncmds.c:1936 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "Publikation »%s« ist nicht in Subskription »%s«" -#: commands/subscriptioncmds.c:1674 +#: commands/subscriptioncmds.c:1947 #, c-format -msgid "subscription must contain at least one publication" -msgstr "Subskription muss mindestens eine Publikation enthalten" +msgid "cannot drop all the publications from a subscription" +msgstr "kann nicht alle Publikationen von einer Subskription löschen" -#: commands/tablecmds.c:241 commands/tablecmds.c:283 +#: commands/tablecmds.c:244 commands/tablecmds.c:286 #, c-format msgid "table \"%s\" does not exist" msgstr "Tabelle »%s« existiert nicht" -#: commands/tablecmds.c:242 commands/tablecmds.c:284 +#: commands/tablecmds.c:245 commands/tablecmds.c:287 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "Tabelle »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:244 commands/tablecmds.c:286 +#: commands/tablecmds.c:247 commands/tablecmds.c:289 msgid "Use DROP TABLE to remove a table." msgstr "Verwenden Sie DROP TABLE, um eine Tabelle zu löschen." -#: commands/tablecmds.c:247 +#: commands/tablecmds.c:250 #, c-format msgid "sequence \"%s\" does not exist" msgstr "Sequenz »%s« existiert nicht" -#: commands/tablecmds.c:248 +#: commands/tablecmds.c:251 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "Sequenz »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:250 +#: commands/tablecmds.c:253 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "Verwenden Sie DROP SEQUENCE, um eine Sequenz zu löschen." -#: commands/tablecmds.c:253 +#: commands/tablecmds.c:256 #, c-format msgid "view \"%s\" does not exist" msgstr "Sicht »%s« existiert nicht" -#: commands/tablecmds.c:254 +#: commands/tablecmds.c:257 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "Sicht »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:256 +#: commands/tablecmds.c:259 msgid "Use DROP VIEW to remove a view." msgstr "Verwenden Sie DROP VIEW, um eine Sicht zu löschen." -#: commands/tablecmds.c:259 +#: commands/tablecmds.c:262 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "materialisierte Sicht »%s« existiert nicht" -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:263 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "materialisierte Sicht »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:262 +#: commands/tablecmds.c:265 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "Verwenden Sie DROP MATERIALIZED VIEW, um eine materialisierte Sicht zu löschen." -#: commands/tablecmds.c:265 commands/tablecmds.c:289 commands/tablecmds.c:18238 -#: parser/parse_utilcmd.c:2257 +#: commands/tablecmds.c:268 commands/tablecmds.c:292 commands/tablecmds.c:18912 +#: parser/parse_utilcmd.c:2250 #, c-format msgid "index \"%s\" does not exist" msgstr "Index »%s« existiert nicht" -#: commands/tablecmds.c:266 commands/tablecmds.c:290 +#: commands/tablecmds.c:269 commands/tablecmds.c:293 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "Index »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:268 commands/tablecmds.c:292 +#: commands/tablecmds.c:271 commands/tablecmds.c:295 msgid "Use DROP INDEX to remove an index." msgstr "Verwenden Sie DROP INDEX, um einen Index zu löschen." -#: commands/tablecmds.c:273 +#: commands/tablecmds.c:276 #, c-format msgid "\"%s\" is not a type" msgstr "»%s« ist kein Typ" -#: commands/tablecmds.c:274 +#: commands/tablecmds.c:277 msgid "Use DROP TYPE to remove a type." msgstr "Verwenden Sie DROP TYPE, um einen Typen zu löschen." -#: commands/tablecmds.c:277 commands/tablecmds.c:13027 -#: commands/tablecmds.c:15520 +#: commands/tablecmds.c:280 commands/tablecmds.c:13583 +#: commands/tablecmds.c:16101 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "Fremdtabelle »%s« existiert nicht" -#: commands/tablecmds.c:278 +#: commands/tablecmds.c:281 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "Fremdtabelle »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:280 +#: commands/tablecmds.c:283 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Verwenden Sie DROP FOREIGN TABLE, um eine Fremdtabelle zu löschen." -#: commands/tablecmds.c:664 +#: commands/tablecmds.c:695 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT kann nur mit temporären Tabellen verwendet werden" -#: commands/tablecmds.c:695 +#: commands/tablecmds.c:726 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "kann temporäre Tabelle nicht in einer sicherheitsbeschränkten Operation erzeugen" -#: commands/tablecmds.c:731 commands/tablecmds.c:14311 +#: commands/tablecmds.c:762 commands/tablecmds.c:14888 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "von der Relation »%s« würde mehrmals geerbt werden" -#: commands/tablecmds.c:916 +#: commands/tablecmds.c:947 #, c-format msgid "specifying a table access method is not supported on a partitioned table" msgstr "Angabe einer Tabellenzugriffsmethode wird für partitionierte Tabellen nicht unterstützt" -#: commands/tablecmds.c:1012 +#: commands/tablecmds.c:1040 #, c-format msgid "\"%s\" is not partitioned" msgstr "»%s« ist nicht partitioniert" -#: commands/tablecmds.c:1107 +#: commands/tablecmds.c:1135 #, c-format msgid "cannot partition using more than %d columns" msgstr "Partitionierung kann nicht mehr als %d Spalten verwenden" -#: commands/tablecmds.c:1163 +#: commands/tablecmds.c:1191 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "kann keine Fremdpartition der partitionierten Tabelle »%s« erzeugen" -#: commands/tablecmds.c:1165 +#: commands/tablecmds.c:1193 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "Tabelle »%s« enthält Unique Indexe." -#: commands/tablecmds.c:1328 +#: commands/tablecmds.c:1356 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY unterstützt das Löschen von mehreren Objekten nicht" -#: commands/tablecmds.c:1332 +#: commands/tablecmds.c:1360 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY unterstützt kein CASCADE" -#: commands/tablecmds.c:1433 +#: commands/tablecmds.c:1464 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "kann partitionierten Index »%s« nicht nebenläufig löschen" -#: commands/tablecmds.c:1705 +#: commands/tablecmds.c:1752 #, c-format msgid "cannot truncate only a partitioned table" msgstr "kann nicht nur eine partitionierte Tabelle leeren" -#: commands/tablecmds.c:1706 +#: commands/tablecmds.c:1753 #, c-format msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." msgstr "Lassen Sie das Schlüsselwort ONLY weg oder wenden Sie TRUNCATE ONLY direkt auf die Partitionen an." -#: commands/tablecmds.c:1779 +#: commands/tablecmds.c:1825 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "Truncate-Vorgang leert ebenfalls Tabelle »%s«" -#: commands/tablecmds.c:2138 +#: commands/tablecmds.c:2175 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "kann Fremdtabelle »%s« nicht leeren" -#: commands/tablecmds.c:2187 +#: commands/tablecmds.c:2224 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht leeren" -#: commands/tablecmds.c:2449 commands/tablecmds.c:14208 +#: commands/tablecmds.c:2452 commands/tablecmds.c:14785 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "von partitionierter Tabelle »%s« kann nicht geerbt werden" -#: commands/tablecmds.c:2454 +#: commands/tablecmds.c:2457 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "von Partition »%s« kann nicht geerbt werden" -#: commands/tablecmds.c:2462 parser/parse_utilcmd.c:2487 -#: parser/parse_utilcmd.c:2629 +#: commands/tablecmds.c:2465 parser/parse_utilcmd.c:2480 +#: parser/parse_utilcmd.c:2622 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "geerbte Relation »%s« ist keine Tabelle oder Fremdtabelle" -#: commands/tablecmds.c:2474 +#: commands/tablecmds.c:2477 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "eine temporäre Relation kann nicht als Partition der permanenten Relation »%s« erzeugt werden" -#: commands/tablecmds.c:2483 commands/tablecmds.c:14187 +#: commands/tablecmds.c:2486 commands/tablecmds.c:14764 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "von temporärer Relation »%s« kann nicht geerbt werden" -#: commands/tablecmds.c:2493 commands/tablecmds.c:14195 +#: commands/tablecmds.c:2496 commands/tablecmds.c:14772 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "von temporärer Relation einer anderen Sitzung kann nicht geerbt werden" -#: commands/tablecmds.c:2547 +#: commands/tablecmds.c:2550 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "geerbte Definitionen von Spalte »%s« werden zusammengeführt" -#: commands/tablecmds.c:2555 +#: commands/tablecmds.c:2558 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "geerbte Spalte »%s« hat Typkonflikt" -#: commands/tablecmds.c:2557 commands/tablecmds.c:2580 -#: commands/tablecmds.c:2597 commands/tablecmds.c:2853 -#: commands/tablecmds.c:2883 commands/tablecmds.c:2897 -#: parser/parse_coerce.c:2090 parser/parse_coerce.c:2110 -#: parser/parse_coerce.c:2130 parser/parse_coerce.c:2150 -#: parser/parse_coerce.c:2205 parser/parse_coerce.c:2238 -#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2348 -#: parser/parse_coerce.c:2382 parser/parse_coerce.c:2402 +#: commands/tablecmds.c:2560 commands/tablecmds.c:2583 +#: commands/tablecmds.c:2600 commands/tablecmds.c:2856 +#: commands/tablecmds.c:2886 commands/tablecmds.c:2900 +#: parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 +#: parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 +#: parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 +#: parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 +#: parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 #: parser/parse_param.c:227 #, c-format msgid "%s versus %s" msgstr "%s gegen %s" -#: commands/tablecmds.c:2566 +#: commands/tablecmds.c:2569 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "geerbte Spalte »%s« hat Sortierfolgenkonflikt" -#: commands/tablecmds.c:2568 commands/tablecmds.c:2865 -#: commands/tablecmds.c:6498 +#: commands/tablecmds.c:2571 commands/tablecmds.c:2868 +#: commands/tablecmds.c:6721 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "»%s« gegen »%s«" -#: commands/tablecmds.c:2578 +#: commands/tablecmds.c:2581 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "geerbte Spalte »%s« hat einen Konflikt bei einem Storage-Parameter" -#: commands/tablecmds.c:2595 commands/tablecmds.c:2895 +#: commands/tablecmds.c:2598 commands/tablecmds.c:2898 #, c-format msgid "column \"%s\" has a compression method conflict" msgstr "für Spalte »%s« besteht ein Komprimierungsmethodenkonflikt" -#: commands/tablecmds.c:2610 +#: commands/tablecmds.c:2613 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "geerbte Spalte »%s« hat einen Generierungskonflikt" -#: commands/tablecmds.c:2704 commands/tablecmds.c:2759 -#: commands/tablecmds.c:11772 parser/parse_utilcmd.c:1301 -#: parser/parse_utilcmd.c:1344 parser/parse_utilcmd.c:1752 -#: parser/parse_utilcmd.c:1860 +#: commands/tablecmds.c:2707 commands/tablecmds.c:2762 +#: commands/tablecmds.c:12307 parser/parse_utilcmd.c:1291 +#: parser/parse_utilcmd.c:1334 parser/parse_utilcmd.c:1743 +#: parser/parse_utilcmd.c:1851 #, c-format msgid "cannot convert whole-row table reference" msgstr "kann Verweis auf ganze Zeile der Tabelle nicht umwandeln" -#: commands/tablecmds.c:2705 parser/parse_utilcmd.c:1302 +#: commands/tablecmds.c:2708 parser/parse_utilcmd.c:1292 #, c-format msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." msgstr "Generierungsausdruck für Spalte »%s« enthält einen Verweis auf die ganze Zeile der Tabelle »%s«." -#: commands/tablecmds.c:2760 parser/parse_utilcmd.c:1345 +#: commands/tablecmds.c:2763 parser/parse_utilcmd.c:1335 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "Constraint »%s« enthält einen Verweis auf die ganze Zeile der Tabelle »%s«." -#: commands/tablecmds.c:2839 +#: commands/tablecmds.c:2842 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "Spalte »%s« wird mit geerbter Definition zusammengeführt" -#: commands/tablecmds.c:2843 +#: commands/tablecmds.c:2846 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "Spalte »%s« wird verschoben und mit geerbter Definition zusammengeführt" -#: commands/tablecmds.c:2844 +#: commands/tablecmds.c:2847 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "Benutzerdefinierte Spalte wurde auf die Position der geerbten Spalte verschoben." -#: commands/tablecmds.c:2851 +#: commands/tablecmds.c:2854 #, c-format msgid "column \"%s\" has a type conflict" msgstr "für Spalte »%s« besteht ein Typkonflikt" -#: commands/tablecmds.c:2863 +#: commands/tablecmds.c:2866 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "für Spalte »%s« besteht ein Sortierfolgenkonflikt" -#: commands/tablecmds.c:2881 +#: commands/tablecmds.c:2884 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "für Spalte »%s« besteht ein Konflikt bei einem Storage-Parameter" -#: commands/tablecmds.c:2922 +#: commands/tablecmds.c:2925 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "abgeleitete Spalte »%s« gibt einen Generierungsausdruck an" -#: commands/tablecmds.c:2924 +#: commands/tablecmds.c:2927 #, c-format msgid "Omit the generation expression in the definition of the child table column to inherit the generation expression from the parent table." msgstr "Lassen Sie den Generierungsausdruck in der Definition der abgeleiteten Spalte weg, um den Generierungsausdruck der Elterntabelle zu erben." -#: commands/tablecmds.c:2928 +#: commands/tablecmds.c:2931 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "Spalte »%s« erbt von einer generierten Spalte aber hat einen Vorgabewert angegeben" -#: commands/tablecmds.c:2933 +#: commands/tablecmds.c:2936 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" msgstr "Spalte »%s« erbt von einer generierten Spalte aber ist als Identitätsspalte definiert" -#: commands/tablecmds.c:3042 +#: commands/tablecmds.c:3045 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "Spalte »%s« erbt widersprüchliche Generierungsausdrücke" -#: commands/tablecmds.c:3047 +#: commands/tablecmds.c:3050 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "Spalte »%s« erbt widersprüchliche Vorgabewerte" -#: commands/tablecmds.c:3049 +#: commands/tablecmds.c:3052 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "Um den Konflikt zu lösen, geben Sie einen Vorgabewert ausdrücklich an." -#: commands/tablecmds.c:3095 +#: commands/tablecmds.c:3098 #, c-format msgid "check constraint name \"%s\" appears multiple times but with different expressions" msgstr "Check-Constraint-Name »%s« erscheint mehrmals, aber mit unterschiedlichen Ausdrücken" -#: commands/tablecmds.c:3308 +#: commands/tablecmds.c:3311 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "temporäre Tabellen anderer Sitzungen können nicht verschoben werden" -#: commands/tablecmds.c:3378 +#: commands/tablecmds.c:3381 #, c-format msgid "cannot rename column of typed table" msgstr "Spalte einer getypten Tabelle kann nicht umbenannt werden" -#: commands/tablecmds.c:3397 -#, c-format -msgid "\"%s\" is not a table, view, materialized view, composite type, index, or foreign table" -msgstr "»%s« ist weder Tabelle, Sicht, materialisierte Sicht, zusammengesetzter Typ, Index noch Fremdtabelle" +#: commands/tablecmds.c:3400 +#, fuzzy, c-format +#| msgid "cannot alter inherited column \"%s\" of relation \"%s\"" +msgid "cannot rename columns of relation \"%s\"" +msgstr "geerbte Spalte »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:3491 +#: commands/tablecmds.c:3495 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "vererbte Spalte »%s« muss ebenso in den abgeleiteten Tabellen umbenannt werden" -#: commands/tablecmds.c:3523 +#: commands/tablecmds.c:3527 #, c-format msgid "cannot rename system column \"%s\"" msgstr "Systemspalte »%s« kann nicht umbenannt werden" -#: commands/tablecmds.c:3538 +#: commands/tablecmds.c:3542 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "kann vererbte Spalte »%s« nicht umbenennen" -#: commands/tablecmds.c:3690 +#: commands/tablecmds.c:3694 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "vererbter Constraint »%s« muss ebenso in den abgeleiteten Tabellen umbenannt werden" -#: commands/tablecmds.c:3697 +#: commands/tablecmds.c:3701 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "kann vererbten Constraint »%s« nicht umbenennen" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3930 +#: commands/tablecmds.c:3998 #, c-format msgid "cannot %s \"%s\" because it is being used by active queries in this session" msgstr "%s mit Relation »%s« nicht möglich, weil sie von aktiven Anfragen in dieser Sitzung verwendet wird" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3939 +#: commands/tablecmds.c:4007 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "%s mit Relation »%s« nicht möglich, weil es anstehende Trigger-Ereignisse dafür gibt" -#: commands/tablecmds.c:4403 +#: commands/tablecmds.c:4472 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" -msgstr "kann Partition »%s« mit einem unvollständigen Detach nicht ändern" - -#: commands/tablecmds.c:4405 -#, c-format -msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." -msgstr "Verwendet Sie ALTER TABLE ... DETACH PARTITION ... FINALIZE, um die unerledigte Detach-Operation zu vervollständigen." +msgstr "kann Partition »%s« mit einer unvollständigen Abtrennoperation nicht ändern" -#: commands/tablecmds.c:4597 commands/tablecmds.c:4612 +#: commands/tablecmds.c:4665 commands/tablecmds.c:4680 #, c-format msgid "cannot change persistence setting twice" msgstr "Persistenzeinstellung kann nicht zweimal geändert werden" -#: commands/tablecmds.c:5355 +#: commands/tablecmds.c:4701 +#, fuzzy, c-format +#| msgid "cannot change inheritance of partitioned table" +msgid "cannot change access method of a partitioned table" +msgstr "Vererbung einer partitionierten Tabelle kann nicht geändert werden" + +#: commands/tablecmds.c:4707 +#, fuzzy, c-format +#| msgid "cannot have multiple SET TABLESPACE subcommands" +msgid "cannot have multiple SET ACCESS METHOD subcommands" +msgstr "mehrere SET TABLESPACE Unterbefehle sind ungültig" + +#: commands/tablecmds.c:5445 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "Systemrelation »%s« kann nicht neu geschrieben werden" -#: commands/tablecmds.c:5361 +#: commands/tablecmds.c:5451 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "Tabelle »%s«, die als Katalogtabelle verwendet wird, kann nicht neu geschrieben werden" -#: commands/tablecmds.c:5371 +#: commands/tablecmds.c:5461 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht neu schreiben" -#: commands/tablecmds.c:5832 +#: commands/tablecmds.c:5955 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "Spalte »%s« von Relation »%s« enthält NULL-Werte" -#: commands/tablecmds.c:5849 +#: commands/tablecmds.c:5972 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "Check-Constraint »%s« von Relation »%s« wird von irgendeiner Zeile verletzt" -#: commands/tablecmds.c:5868 partitioning/partbounds.c:3282 +#: commands/tablecmds.c:5991 partitioning/partbounds.c:3403 #, c-format msgid "updated partition constraint for default partition \"%s\" would be violated by some row" msgstr "aktualisierter Partitions-Constraint der Standardpartition »%s« würde von irgendeiner Zeile verletzt werden" -#: commands/tablecmds.c:5874 +#: commands/tablecmds.c:5997 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "Partitions-Constraint von Relation »%s« wird von irgendeiner Zeile verletzt" -#: commands/tablecmds.c:6022 commands/trigger.c:1265 commands/trigger.c:1371 -#, c-format -msgid "\"%s\" is not a table, view, or foreign table" -msgstr "»%s« ist keine Tabelle, Sicht oder Fremdtabelle" - -#: commands/tablecmds.c:6025 -#, c-format -msgid "\"%s\" is not a table, view, materialized view, or index" -msgstr "»%s« ist weder Tabelle, Sicht, materialisierte Sicht noch Index" - -#: commands/tablecmds.c:6031 -#, c-format -msgid "\"%s\" is not a table, materialized view, or index" -msgstr "»%s« ist weder Tabelle, materialisierte Sicht noch Index" - -#: commands/tablecmds.c:6034 -#, c-format -msgid "\"%s\" is not a table, materialized view, or foreign table" -msgstr "»%s« ist weder Tabelle, materialisierte Sicht noch Fremdtabelle" - -#: commands/tablecmds.c:6037 -#, c-format -msgid "\"%s\" is not a table or foreign table" -msgstr "»%s« ist keine Tabelle oder Fremdtabelle" - -#: commands/tablecmds.c:6040 -#, c-format -msgid "\"%s\" is not a table, composite type, or foreign table" -msgstr "»%s« ist weder Tabelle, zusammengesetzter Typ noch Fremdtabelle" - -#: commands/tablecmds.c:6043 -#, c-format -msgid "\"%s\" is not a table, materialized view, index, or foreign table" -msgstr "»%s« ist weder Tabelle, materialisierte Sicht, Index noch Fremdtabelle" - -#: commands/tablecmds.c:6053 -#, c-format -msgid "\"%s\" is of the wrong type" -msgstr "»%s« hat den falschen Typ" +#. translator: %s is a group of some SQL keywords +#: commands/tablecmds.c:6264 +#, fuzzy, c-format +#| msgid "relation \"%s\" is not a parent of relation \"%s\"" +msgid "ALTER action %s cannot be performed on relation \"%s\"" +msgstr "Relation »%s« ist keine Basisrelation von Relation »%s«" -#: commands/tablecmds.c:6256 commands/tablecmds.c:6263 +#: commands/tablecmds.c:6479 commands/tablecmds.c:6486 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "kann Typ »%s« nicht ändern, weil Spalte »%s.%s« ihn verwendet" -#: commands/tablecmds.c:6270 +#: commands/tablecmds.c:6493 #, c-format msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" msgstr "kann Fremdtabelle »%s« nicht ändern, weil Spalte »%s.%s« ihren Zeilentyp verwendet" -#: commands/tablecmds.c:6277 +#: commands/tablecmds.c:6500 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "kann Tabelle »%s« nicht ändern, weil Spalte »%s.%s« ihren Zeilentyp verwendet" -#: commands/tablecmds.c:6333 +#: commands/tablecmds.c:6556 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "kann Typ »%s« nicht ändern, weil er der Typ einer getypten Tabelle ist" -#: commands/tablecmds.c:6335 +#: commands/tablecmds.c:6558 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "Verwenden Sie ALTER ... CASCADE, um die getypten Tabellen ebenfalls zu ändern." -#: commands/tablecmds.c:6381 +#: commands/tablecmds.c:6604 #, c-format msgid "type %s is not a composite type" msgstr "Typ %s ist kein zusammengesetzter Typ" -#: commands/tablecmds.c:6408 +#: commands/tablecmds.c:6631 #, c-format msgid "cannot add column to typed table" msgstr "zu einer getypten Tabelle kann keine Spalte hinzugefügt werden" -#: commands/tablecmds.c:6461 +#: commands/tablecmds.c:6684 #, c-format msgid "cannot add column to a partition" msgstr "zu einer Partition kann keine Spalte hinzugefügt werden" -#: commands/tablecmds.c:6490 commands/tablecmds.c:14438 +#: commands/tablecmds.c:6713 commands/tablecmds.c:15015 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "abgeleitete Tabelle »%s« hat unterschiedlichen Typ für Spalte »%s«" -#: commands/tablecmds.c:6496 commands/tablecmds.c:14445 +#: commands/tablecmds.c:6719 commands/tablecmds.c:15022 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "abgeleitete Tabelle »%s« hat unterschiedliche Sortierfolge für Spalte »%s«" -#: commands/tablecmds.c:6510 +#: commands/tablecmds.c:6733 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "Definition von Spalte »%s« für abgeleitete Tabelle »%s« wird zusammengeführt" -#: commands/tablecmds.c:6553 +#: commands/tablecmds.c:6776 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "eine Identitätsspalte kann nicht rekursiv zu einer Tabelle hinzugefügt werden, die abgeleitete Tabellen hat" -#: commands/tablecmds.c:6796 +#: commands/tablecmds.c:7020 #, c-format msgid "column must be added to child tables too" msgstr "Spalte muss ebenso in den abgeleiteten Tabellen hinzugefügt werden" -#: commands/tablecmds.c:6874 +#: commands/tablecmds.c:7098 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "Spalte »%s« von Relation »%s« existiert bereits, wird übersprungen" -#: commands/tablecmds.c:6881 +#: commands/tablecmds.c:7105 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "Spalte »%s« von Relation »%s« existiert bereits" -#: commands/tablecmds.c:6947 commands/tablecmds.c:11410 +#: commands/tablecmds.c:7171 commands/tablecmds.c:11946 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "Constraint kann nicht nur von der partitionierten Tabelle entfernt werden, wenn Partitionen existieren" -#: commands/tablecmds.c:6948 commands/tablecmds.c:7252 -#: commands/tablecmds.c:8275 commands/tablecmds.c:11411 +#: commands/tablecmds.c:7172 commands/tablecmds.c:7489 +#: commands/tablecmds.c:8486 commands/tablecmds.c:11947 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Lassen Sie das Schlüsselwort ONLY weg." -#: commands/tablecmds.c:6985 commands/tablecmds.c:7178 -#: commands/tablecmds.c:7320 commands/tablecmds.c:7434 -#: commands/tablecmds.c:7528 commands/tablecmds.c:7587 -#: commands/tablecmds.c:7705 commands/tablecmds.c:7871 -#: commands/tablecmds.c:7941 commands/tablecmds.c:8097 -#: commands/tablecmds.c:11565 commands/tablecmds.c:13050 -#: commands/tablecmds.c:15611 +#: commands/tablecmds.c:7209 commands/tablecmds.c:7415 +#: commands/tablecmds.c:7557 commands/tablecmds.c:7671 +#: commands/tablecmds.c:7765 commands/tablecmds.c:7824 +#: commands/tablecmds.c:7943 commands/tablecmds.c:8082 +#: commands/tablecmds.c:8152 commands/tablecmds.c:8308 +#: commands/tablecmds.c:12101 commands/tablecmds.c:13606 +#: commands/tablecmds.c:16192 #, c-format msgid "cannot alter system column \"%s\"" msgstr "Systemspalte »%s« kann nicht geändert werden" -#: commands/tablecmds.c:6991 commands/tablecmds.c:7326 +#: commands/tablecmds.c:7215 commands/tablecmds.c:7563 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "Spalte »%s« von Relation »%s« ist eine Identitätsspalte" -#: commands/tablecmds.c:7027 +#: commands/tablecmds.c:7258 #, c-format msgid "column \"%s\" is in a primary key" msgstr "Spalte »%s« ist in einem Primärschlüssel" -#: commands/tablecmds.c:7049 +#: commands/tablecmds.c:7263 +#, c-format +msgid "column \"%s\" is in index used as replica identity" +msgstr "Spalte »%s« ist in einem Index, der als Replik-Identität verwendet wird" + +#: commands/tablecmds.c:7286 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "Spalte »%s« ist in Elterntabelle als NOT NULL markiert" -#: commands/tablecmds.c:7249 commands/tablecmds.c:8758 +#: commands/tablecmds.c:7486 commands/tablecmds.c:8969 #, c-format msgid "constraint must be added to child tables too" msgstr "Constraint muss ebenso in den abgeleiteten Tabellen hinzugefügt werden" -#: commands/tablecmds.c:7250 +#: commands/tablecmds.c:7487 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "Spalte »%s« von Relation »%s« ist nicht bereits NOT NULL." -#: commands/tablecmds.c:7328 +#: commands/tablecmds.c:7565 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." msgstr "Verwenden Sie stattdessen ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." -#: commands/tablecmds.c:7333 +#: commands/tablecmds.c:7570 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "Spalte »%s« von Relation »%s« ist eine generierte Spalte" -#: commands/tablecmds.c:7336 +#: commands/tablecmds.c:7573 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." msgstr "Verwenden Sie stattdessen ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION." -#: commands/tablecmds.c:7445 +#: commands/tablecmds.c:7682 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "Spalte »%s« von Relation »%s« muss als NOT NULL deklariert werden, bevor Sie Identitätsspalte werden kann" -#: commands/tablecmds.c:7451 +#: commands/tablecmds.c:7688 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "Spalte »%s« von Relation »%s« ist bereits eine Identitätsspalte" -#: commands/tablecmds.c:7457 +#: commands/tablecmds.c:7694 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "Spalte »%s« von Relation »%s« hat bereits einen Vorgabewert" -#: commands/tablecmds.c:7534 commands/tablecmds.c:7595 +#: commands/tablecmds.c:7771 commands/tablecmds.c:7832 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "Spalte »%s« von Relation »%s« ist keine Identitätsspalte" -#: commands/tablecmds.c:7600 +#: commands/tablecmds.c:7837 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "Spalte »%s« von Relation »%s« ist keine Identitätsspalte, wird übersprungen" -#: commands/tablecmds.c:7653 +#: commands/tablecmds.c:7890 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "ALTER TABLE / DROP EXPRESSION muss auch auf abgeleitete Tabellen angewendet werden" -#: commands/tablecmds.c:7675 +#: commands/tablecmds.c:7912 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "Generierungsausdruck von vererbter Spalte kann nicht gelöscht werden" -#: commands/tablecmds.c:7713 +#: commands/tablecmds.c:7951 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "Spalte »%s« von Relation »%s« ist keine gespeicherte generierte Spalte" -#: commands/tablecmds.c:7718 +#: commands/tablecmds.c:7956 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "Spalte »%s« von Relation »%s« ist keine gespeicherte generierte Spalte, wird übersprungen" -#: commands/tablecmds.c:7818 +#: commands/tablecmds.c:8029 #, c-format msgid "cannot refer to non-index column by number" msgstr "auf eine Nicht-Index-Spalte kann nicht per Nummer verwiesen werden" -#: commands/tablecmds.c:7861 +#: commands/tablecmds.c:8072 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "Spalte Nummer %d von Relation »%s« existiert nicht" -#: commands/tablecmds.c:7880 +#: commands/tablecmds.c:8091 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "Statistiken von eingeschlossener Spalte »%s« von Index »%s« können nicht geändert werden" -#: commands/tablecmds.c:7885 +#: commands/tablecmds.c:8096 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "kann Statistiken von Spalte »%s« von Index »%s«, welche kein Ausdruck ist, nicht ändern" -#: commands/tablecmds.c:7887 +#: commands/tablecmds.c:8098 #, c-format msgid "Alter statistics on table column instead." msgstr "Ändern Sie stattdessen die Statistiken für die Tabellenspalte." -#: commands/tablecmds.c:8077 +#: commands/tablecmds.c:8288 #, c-format msgid "invalid storage type \"%s\"" msgstr "ungültiger Storage-Typ »%s«" -#: commands/tablecmds.c:8109 +#: commands/tablecmds.c:8320 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "Spaltendatentyp %s kann nur Storage-Typ PLAIN" -#: commands/tablecmds.c:8154 +#: commands/tablecmds.c:8365 #, c-format msgid "cannot drop column from typed table" msgstr "aus einer getypten Tabelle können keine Spalten gelöscht werden" -#: commands/tablecmds.c:8213 +#: commands/tablecmds.c:8424 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "Spalte »%s« von Relation »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:8226 +#: commands/tablecmds.c:8437 #, c-format msgid "cannot drop system column \"%s\"" msgstr "Systemspalte »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:8236 +#: commands/tablecmds.c:8447 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "geerbte Spalte »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:8249 +#: commands/tablecmds.c:8460 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "Spalte »%s« kann nicht gelöscht werden, weil sie Teil des Partitionierungsschlüssels von Relation »%s« ist" -#: commands/tablecmds.c:8274 +#: commands/tablecmds.c:8485 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "Spalte kann nicht nur aus der partitionierten Tabelle gelöscht werden, wenn Partitionen existieren" -#: commands/tablecmds.c:8478 +#: commands/tablecmds.c:8689 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX wird für partitionierte Tabellen nicht unterstützt" -#: commands/tablecmds.c:8503 +#: commands/tablecmds.c:8714 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX benennt Index »%s« um in »%s«" -#: commands/tablecmds.c:8838 +#: commands/tablecmds.c:9051 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "ONLY nicht möglich für Fremdschlüssel für partitionierte Tabelle »%s« verweisend auf Relation »%s«" -#: commands/tablecmds.c:8844 +#: commands/tablecmds.c:9057 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "Hinzufügen von Fremdschlüssel mit NOT VALID nicht möglich für partitionierte Tabelle »%s« verweisend auf Relation »%s«" -#: commands/tablecmds.c:8847 +#: commands/tablecmds.c:9060 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "Dieses Feature wird für partitionierte Tabellen noch nicht unterstützt." -#: commands/tablecmds.c:8854 commands/tablecmds.c:9259 +#: commands/tablecmds.c:9067 commands/tablecmds.c:9533 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "Relation »%s«, auf die verwiesen wird, ist keine Tabelle" -#: commands/tablecmds.c:8877 +#: commands/tablecmds.c:9090 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "Constraints für permanente Tabellen dürfen nur auf permanente Tabellen verweisen" -#: commands/tablecmds.c:8884 +#: commands/tablecmds.c:9097 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "Constraints für ungeloggte Tabellen dürfen nur auf permanente oder ungeloggte Tabellen verweisen" -#: commands/tablecmds.c:8890 +#: commands/tablecmds.c:9103 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "Constraints für temporäre Tabellen dürfen nur auf temporäre Tabellen verweisen" -#: commands/tablecmds.c:8894 +#: commands/tablecmds.c:9107 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "Constraints für temporäre Tabellen müssen temporäre Tabellen dieser Sitzung beinhalten" -#: commands/tablecmds.c:8960 commands/tablecmds.c:8966 +#: commands/tablecmds.c:9181 commands/tablecmds.c:9187 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "ungültige %s-Aktion für Fremdschlüssel-Constraint, der eine generierte Spalte enthält" -#: commands/tablecmds.c:8982 +#: commands/tablecmds.c:9203 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "Anzahl der Quell- und Zielspalten im Fremdschlüssel stimmt nicht überein" -#: commands/tablecmds.c:9089 +#: commands/tablecmds.c:9310 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "Fremdschlüssel-Constraint »%s« kann nicht implementiert werden" -#: commands/tablecmds.c:9091 +#: commands/tablecmds.c:9312 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Schlüsselspalten »%s« und »%s« haben inkompatible Typen: %s und %s." -#: commands/tablecmds.c:9454 commands/tablecmds.c:9847 -#: parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:925 +#: commands/tablecmds.c:9469 +#, c-format +msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" +msgstr "" + +#: commands/tablecmds.c:9742 commands/tablecmds.c:10189 +#: parser/parse_utilcmd.c:785 parser/parse_utilcmd.c:914 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "Fremdschlüssel-Constraints auf Fremdtabellen werden nicht unterstützt" -#: commands/tablecmds.c:10214 commands/tablecmds.c:10492 -#: commands/tablecmds.c:11367 commands/tablecmds.c:11442 +#: commands/tablecmds.c:10718 commands/tablecmds.c:10996 +#: commands/tablecmds.c:11903 commands/tablecmds.c:11978 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "Constraint »%s« von Relation »%s« existiert nicht" -#: commands/tablecmds.c:10221 +#: commands/tablecmds.c:10725 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "Constraint »%s« von Relation »%s« ist kein Fremdschlüssel-Constraint" -#: commands/tablecmds.c:10259 +#: commands/tablecmds.c:10763 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "Constraint »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:10262 +#: commands/tablecmds.c:10766 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "Constraint »%s« ist von Constraint »%s« von Relation »%s« abgeleitet." -#: commands/tablecmds.c:10264 +#: commands/tablecmds.c:10768 #, c-format msgid "You may alter the constraint it derives from, instead." msgstr "Sie können stattdessen den Constraint, von dem er abgeleitet ist, ändern." -#: commands/tablecmds.c:10500 +#: commands/tablecmds.c:11004 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "Constraint »%s« von Relation »%s« ist kein Fremdschlüssel- oder Check-Constraint" -#: commands/tablecmds.c:10578 +#: commands/tablecmds.c:11082 #, c-format msgid "constraint must be validated on child tables too" msgstr "Constraint muss ebenso in den abgeleiteten Tabellen validiert werden" -#: commands/tablecmds.c:10662 +#: commands/tablecmds.c:11166 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "Spalte »%s«, die im Fremdschlüssel verwendet wird, existiert nicht" -#: commands/tablecmds.c:10667 +#: commands/tablecmds.c:11171 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "Fremdschlüssel kann nicht mehr als %d Schlüssel haben" -#: commands/tablecmds.c:10732 +#: commands/tablecmds.c:11237 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "aufschiebbarer Primärschlüssel kann nicht für Tabelle »%s«, auf die verwiesen wird, verwendet werden" -#: commands/tablecmds.c:10749 +#: commands/tablecmds.c:11254 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "in Tabelle »%s«, auf die verwiesen wird, gibt es keinen Primärschlüssel" -#: commands/tablecmds.c:10814 +#: commands/tablecmds.c:11319 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "die Liste der Spalten, auf die ein Fremdschlüssel verweist, darf keine doppelten Einträge enthalten" -#: commands/tablecmds.c:10908 +#: commands/tablecmds.c:11413 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "aufschiebbarer Unique-Constraint kann nicht für Tabelle »%s«, auf die verwiesen wird, verwendet werden" -#: commands/tablecmds.c:10913 +#: commands/tablecmds.c:11418 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "in Tabelle »%s«, auf die verwiesen wird, gibt es keinen Unique-Constraint, der auf die angegebenen Schlüssel passt" -#: commands/tablecmds.c:11323 +#: commands/tablecmds.c:11859 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "geerbter Constraint »%s« von Relation »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:11373 +#: commands/tablecmds.c:11909 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "Constraint »%s« von Relation »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:11549 +#: commands/tablecmds.c:12085 #, c-format msgid "cannot alter column type of typed table" msgstr "Spaltentyp einer getypten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:11576 +#: commands/tablecmds.c:12112 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "kann vererbte Spalte »%s« nicht ändern" -#: commands/tablecmds.c:11585 +#: commands/tablecmds.c:12121 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "Spalte »%s« kann nicht geändert werden, weil sie Teil des Partitionierungsschlüssels von Relation »%s« ist" -#: commands/tablecmds.c:11635 +#: commands/tablecmds.c:12171 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "Ergebnis der USING-Klausel für Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" -#: commands/tablecmds.c:11638 +#: commands/tablecmds.c:12174 #, c-format msgid "You might need to add an explicit cast." msgstr "Sie müssen möglicherweise eine ausdrückliche Typumwandlung hinzufügen." -#: commands/tablecmds.c:11642 +#: commands/tablecmds.c:12178 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:11645 +#: commands/tablecmds.c:12181 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Sie müssen möglicherweise »USING %s::%s« angeben." -#: commands/tablecmds.c:11745 +#: commands/tablecmds.c:12280 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "geerbte Spalte »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:11773 +#: commands/tablecmds.c:12308 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "USING-Ausdruck enthält einen Verweis auf die ganze Zeile der Tabelle." -#: commands/tablecmds.c:11784 +#: commands/tablecmds.c:12319 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "Typ der vererbten Spalte »%s« muss ebenso in den abgeleiteten Tabellen geändert werden" -#: commands/tablecmds.c:11909 +#: commands/tablecmds.c:12444 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "Typ der Spalte »%s« kann nicht zweimal geändert werden" -#: commands/tablecmds.c:11947 +#: commands/tablecmds.c:12482 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "Generierungsausdruck der Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" -#: commands/tablecmds.c:11952 +#: commands/tablecmds.c:12487 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "Vorgabewert der Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" -#: commands/tablecmds.c:12030 -#, c-format -msgid "cannot alter type of a column used by a generated column" -msgstr "Typ einer Spalte, die von einer generierten Spalte verwendet wird, kann nicht geändert werden" - -#: commands/tablecmds.c:12031 -#, c-format -msgid "Column \"%s\" is used by generated column \"%s\"." -msgstr "Spalte »%s« wird von generierter Spalte »%s« verwendet." - -#: commands/tablecmds.c:12052 +#: commands/tablecmds.c:12568 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "Typ einer Spalte, die von einer Sicht oder Regel verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:12053 commands/tablecmds.c:12072 -#: commands/tablecmds.c:12090 +#: commands/tablecmds.c:12569 commands/tablecmds.c:12588 +#: commands/tablecmds.c:12606 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s hängt von Spalte »%s« ab" -#: commands/tablecmds.c:12071 +#: commands/tablecmds.c:12587 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "Typ einer Spalte, die in einer Trigger-Definition verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:12089 +#: commands/tablecmds.c:12605 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "Typ einer Spalte, die in einer Policy-Definition verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:13158 commands/tablecmds.c:13170 +#: commands/tablecmds.c:12636 +#, c-format +msgid "cannot alter type of a column used by a generated column" +msgstr "Typ einer Spalte, die von einer generierten Spalte verwendet wird, kann nicht geändert werden" + +#: commands/tablecmds.c:12637 +#, c-format +msgid "Column \"%s\" is used by generated column \"%s\"." +msgstr "Spalte »%s« wird von generierter Spalte »%s« verwendet." + +#: commands/tablecmds.c:13714 commands/tablecmds.c:13726 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "kann Eigentümer des Index »%s« nicht ändern" -#: commands/tablecmds.c:13160 commands/tablecmds.c:13172 +#: commands/tablecmds.c:13716 commands/tablecmds.c:13728 #, c-format msgid "Change the ownership of the index's table, instead." msgstr "Ändern Sie stattdessen den Eigentümer der Tabelle des Index." -#: commands/tablecmds.c:13186 +#: commands/tablecmds.c:13742 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "kann Eigentümer der Sequenz »%s« nicht ändern" -#: commands/tablecmds.c:13200 commands/tablecmds.c:16503 +#: commands/tablecmds.c:13756 commands/tablecmds.c:17111 +#: commands/tablecmds.c:17130 #, c-format msgid "Use ALTER TYPE instead." msgstr "Verwenden Sie stattdessen ALTER TYPE." -#: commands/tablecmds.c:13209 +#: commands/tablecmds.c:13765 #, c-format -msgid "\"%s\" is not a table, view, sequence, or foreign table" -msgstr "»%s« ist keine Tabelle, Sicht, Sequenz oder Fremdtabelle" +msgid "cannot change owner of relation \"%s\"" +msgstr "kann Eigentümer der Relation »%s« nicht ändern" -#: commands/tablecmds.c:13548 +#: commands/tablecmds.c:14127 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "mehrere SET TABLESPACE Unterbefehle sind ungültig" -#: commands/tablecmds.c:13625 -#, c-format -msgid "\"%s\" is not a table, view, materialized view, index, or TOAST table" -msgstr "»%s« ist weder Tabelle, Sicht, materialisierte Sicht, Index noch TOAST-Tabelle" +#: commands/tablecmds.c:14204 +#, fuzzy, c-format +#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgid "cannot set options for relation \"%s\"" +msgstr "Constraint »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:13658 commands/view.c:494 +#: commands/tablecmds.c:14238 commands/view.c:507 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTION wird nur für automatisch aktualisierbare Sichten unterstützt" -#: commands/tablecmds.c:13910 +#: commands/tablecmds.c:14488 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "nur Tabellen, Indexe und materialisierte Sichten existieren in Tablespaces" -#: commands/tablecmds.c:13922 +#: commands/tablecmds.c:14500 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "Relationen können nicht in den oder aus dem Tablespace »pg_global« verschoben werden" -#: commands/tablecmds.c:14014 +#: commands/tablecmds.c:14592 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "Abbruch weil Sperre für Relation »%s.%s« nicht verfügbar ist" -#: commands/tablecmds.c:14030 +#: commands/tablecmds.c:14608 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "keine passenden Relationen in Tablespace »%s« gefunden" -#: commands/tablecmds.c:14146 +#: commands/tablecmds.c:14723 #, c-format msgid "cannot change inheritance of typed table" msgstr "Vererbung einer getypten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:14151 commands/tablecmds.c:14707 +#: commands/tablecmds.c:14728 commands/tablecmds.c:15284 #, c-format msgid "cannot change inheritance of a partition" msgstr "Vererbung einer Partition kann nicht geändert werden" -#: commands/tablecmds.c:14156 +#: commands/tablecmds.c:14733 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "Vererbung einer partitionierten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:14202 +#: commands/tablecmds.c:14779 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "an temporäre Relation einer anderen Sitzung kann nicht vererbt werden" -#: commands/tablecmds.c:14215 +#: commands/tablecmds.c:14792 #, c-format msgid "cannot inherit from a partition" msgstr "von einer Partition kann nicht geerbt werden" -#: commands/tablecmds.c:14237 commands/tablecmds.c:17147 +#: commands/tablecmds.c:14814 commands/tablecmds.c:17764 #, c-format msgid "circular inheritance not allowed" msgstr "zirkuläre Vererbung ist nicht erlaubt" -#: commands/tablecmds.c:14238 commands/tablecmds.c:17148 +#: commands/tablecmds.c:14815 commands/tablecmds.c:17765 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "»%s« ist schon von »%s« abgeleitet." -#: commands/tablecmds.c:14251 +#: commands/tablecmds.c:14828 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "Trigger »%s« verhindert, dass Tabelle »%s« ein Vererbungskind werden kann" -#: commands/tablecmds.c:14253 +#: commands/tablecmds.c:14830 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "ROW-Trigger mit Übergangstabellen werden in Vererbungshierarchien nicht unterstützt." -#: commands/tablecmds.c:14456 +#: commands/tablecmds.c:15033 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "Spalte »%s« in abgeleiteter Tabelle muss als NOT NULL markiert sein" -#: commands/tablecmds.c:14465 +#: commands/tablecmds.c:15042 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "Spalte »%s« in abgeleiteter Tabelle muss eine generierte Spalte sein" -#: commands/tablecmds.c:14515 +#: commands/tablecmds.c:15092 #, c-format msgid "column \"%s\" in child table has a conflicting generation expression" msgstr "Spalte »%s« in abgeleiteter Tabelle hat einen widersprüchlichen Generierungsausdruck" -#: commands/tablecmds.c:14543 +#: commands/tablecmds.c:15120 #, c-format msgid "child table is missing column \"%s\"" msgstr "Spalte »%s« fehlt in abgeleiteter Tabelle" -#: commands/tablecmds.c:14631 +#: commands/tablecmds.c:15208 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "abgeleitete Tabelle »%s« hat unterschiedliche Definition für Check-Constraint »%s«" -#: commands/tablecmds.c:14639 +#: commands/tablecmds.c:15216 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "Constraint »%s« kollidiert mit nicht vererbtem Constraint für abgeleitete Tabelle »%s«" -#: commands/tablecmds.c:14650 +#: commands/tablecmds.c:15227 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "Constraint »%s« kollidiert mit NOT-VALID-Constraint für abgeleitete Tabelle »%s«" -#: commands/tablecmds.c:14685 +#: commands/tablecmds.c:15262 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "Constraint »%s« fehlt in abgeleiteter Tabelle" -#: commands/tablecmds.c:14773 -#, fuzzy, c-format -#| msgid "Unlogged partitioned table \"%s.%s\"" -msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" -msgstr "Ungeloggte partitionierte Tabelle »%s.%s«" - -#: commands/tablecmds.c:14777 +#: commands/tablecmds.c:15348 #, c-format -msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the detach operation." -msgstr "Verwenden Sie ALTER TABLE ... DETACH PARTITION ... FINALIZE, um die Detach-Operation zu vervollständigen." +msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" +msgstr "Partition »%s« hat schon eine unerledigte Abtrennoperation in der partitionierten Tabelle »%s.%s«" -#: commands/tablecmds.c:14802 commands/tablecmds.c:14850 +#: commands/tablecmds.c:15377 commands/tablecmds.c:15425 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "Relation »%s« ist keine Partition von Relation »%s«" -#: commands/tablecmds.c:14856 +#: commands/tablecmds.c:15431 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "Relation »%s« ist keine Basisrelation von Relation »%s«" -#: commands/tablecmds.c:15084 +#: commands/tablecmds.c:15659 #, c-format msgid "typed tables cannot inherit" msgstr "getypte Tabellen können nicht erben" -#: commands/tablecmds.c:15114 +#: commands/tablecmds.c:15689 #, c-format msgid "table is missing column \"%s\"" msgstr "Spalte »%s« fehlt in Tabelle" -#: commands/tablecmds.c:15125 +#: commands/tablecmds.c:15700 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "Tabelle hat Spalte »%s«, aber Typ benötigt »%s«" -#: commands/tablecmds.c:15134 +#: commands/tablecmds.c:15709 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "Tabelle »%s« hat unterschiedlichen Typ für Spalte »%s«" -#: commands/tablecmds.c:15148 +#: commands/tablecmds.c:15723 #, c-format msgid "table has extra column \"%s\"" msgstr "Tabelle hat zusätzliche Spalte »%s«" -#: commands/tablecmds.c:15200 +#: commands/tablecmds.c:15775 #, c-format msgid "\"%s\" is not a typed table" msgstr "»%s« ist keine getypte Tabelle" -#: commands/tablecmds.c:15382 +#: commands/tablecmds.c:15963 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "nicht eindeutiger Index »%s« kann nicht als Replik-Identität verwendet werden" -#: commands/tablecmds.c:15388 +#: commands/tablecmds.c:15969 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "Index »%s« kann nicht als Replik-Identität verwendet werden, weil er nicht IMMEDIATE ist" -#: commands/tablecmds.c:15394 +#: commands/tablecmds.c:15975 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "Ausdrucksindex »%s« kann nicht als Replik-Identität verwendet werden" -#: commands/tablecmds.c:15400 +#: commands/tablecmds.c:15981 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "partieller Index »%s« kann nicht als Replik-Identität verwendet werden" -#: commands/tablecmds.c:15406 +#: commands/tablecmds.c:15987 #, c-format msgid "cannot use invalid index \"%s\" as replica identity" msgstr "ungültiger Index »%s« kann nicht als Replik-Identität verwendet werden" -#: commands/tablecmds.c:15423 +#: commands/tablecmds.c:16004 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "Index »%s« kann nicht als Replik-Identität verwendet werden, weil Spalte %d eine Systemspalte ist" -#: commands/tablecmds.c:15430 +#: commands/tablecmds.c:16011 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "Index »%s« kann nicht als Replik-Identität verwendet werden, weil Spalte »%s« NULL-Werte akzeptiert" -#: commands/tablecmds.c:15677 +#: commands/tablecmds.c:16258 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "kann den geloggten Status der Tabelle »%s« nicht ändern, weil sie temporär ist" -#: commands/tablecmds.c:15701 +#: commands/tablecmds.c:16282 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "kann Tabelle »%s« nicht in ungeloggt ändern, weil sie Teil einer Publikation ist" -#: commands/tablecmds.c:15703 +#: commands/tablecmds.c:16284 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Ungeloggte Relationen können nicht repliziert werden." -#: commands/tablecmds.c:15748 +#: commands/tablecmds.c:16329 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "konnte Tabelle »%s« nicht in geloggt ändern, weil sie auf die ungeloggte Tabelle »%s« verweist" -#: commands/tablecmds.c:15758 +#: commands/tablecmds.c:16339 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "konnte Tabelle »%s« nicht in ungeloggt ändern, weil sie auf die geloggte Tabelle »%s« verweist" -#: commands/tablecmds.c:15816 +#: commands/tablecmds.c:16397 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "einer Tabelle zugeordnete Sequenz kann nicht in ein anderes Schema verschoben werden" -#: commands/tablecmds.c:15923 +#: commands/tablecmds.c:16425 +#, fuzzy, c-format +#| msgid "cannot convert partitioned table \"%s\" to a view" +msgid "cannot move table \"%s\" to schema \"%s\"" +msgstr "kann partitionierte Tabelle »%s« nicht in eine Sicht umwandeln" + +#: commands/tablecmds.c:16427 +#, c-format +msgid "The schema \"%s\" and same schema's table \"%s\" cannot be part of the same publication \"%s\"." +msgstr "" + +#: commands/tablecmds.c:16531 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "Relation »%s« existiert bereits in Schema »%s«" -#: commands/tablecmds.c:16486 +#: commands/tablecmds.c:16944 +#, c-format +msgid "\"%s\" is not a table or materialized view" +msgstr "»%s« ist keine Tabelle oder materialisierte Sicht" + +#: commands/tablecmds.c:17094 #, c-format msgid "\"%s\" is not a composite type" msgstr "»%s« ist kein zusammengesetzter Typ" -#: commands/tablecmds.c:16518 +#: commands/tablecmds.c:17122 #, c-format -msgid "\"%s\" is not a table, view, materialized view, sequence, or foreign table" -msgstr "»%s« ist weder Tabelle, Sicht, materialisierte Sicht, Sequenz noch Fremdtabelle" +msgid "cannot change schema of index \"%s\"" +msgstr "kann Schema des Index »%s« nicht ändern" + +#: commands/tablecmds.c:17124 commands/tablecmds.c:17136 +#, fuzzy, c-format +#| msgid "Change the ownership of the index's table, instead." +msgid "Change the schema of the table instead." +msgstr "Ändern Sie stattdessen den Eigentümer der Tabelle des Index." + +#: commands/tablecmds.c:17128 +#, fuzzy, c-format +#| msgid "cannot convert Perl hash to non-composite type %s" +msgid "cannot change schema of composite type \"%s\"" +msgstr "kann Perl-Hash nicht in nicht zusammengesetzten Typ %s umwandeln" + +#: commands/tablecmds.c:17134 +#, fuzzy, c-format +#| msgid "cannot change TOAST relation \"%s\"" +msgid "cannot change schema of TOAST table \"%s\"" +msgstr "kann TOAST-Relation »%s« nicht ändern" -#: commands/tablecmds.c:16553 +#: commands/tablecmds.c:17171 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "unbekannte Partitionierungsstrategie »%s«" -#: commands/tablecmds.c:16561 +#: commands/tablecmds.c:17179 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "Partitionierungsstrategie »list« kann nicht mit mehr als einer Spalte verwendet werden" -#: commands/tablecmds.c:16627 +#: commands/tablecmds.c:17245 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "Spalte »%s«, die im Partitionierungsschlüssel verwendet wird, existiert nicht" -#: commands/tablecmds.c:16635 +#: commands/tablecmds.c:17253 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "Systemspalte »%s« kann nicht im Partitionierungsschlüssel verwendet werden" -#: commands/tablecmds.c:16646 commands/tablecmds.c:16760 +#: commands/tablecmds.c:17264 commands/tablecmds.c:17378 #, c-format msgid "cannot use generated column in partition key" msgstr "generierte Spalte kann nicht im Partitionierungsschlüssel verwendet werden" -#: commands/tablecmds.c:16647 commands/tablecmds.c:16761 commands/trigger.c:635 -#: rewrite/rewriteHandler.c:884 rewrite/rewriteHandler.c:919 +#: commands/tablecmds.c:17265 commands/tablecmds.c:17379 commands/trigger.c:667 +#: rewrite/rewriteHandler.c:907 rewrite/rewriteHandler.c:942 #, c-format msgid "Column \"%s\" is a generated column." msgstr "Spalte »%s« ist eine generierte Spalte." -#: commands/tablecmds.c:16723 +#: commands/tablecmds.c:17341 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "Funktionen im Partitionierungsschlüsselausdruck müssen als IMMUTABLE markiert sein" -#: commands/tablecmds.c:16743 +#: commands/tablecmds.c:17361 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "Partitionierungsschlüsselausdruck kann nicht auf Systemspalten verweisen" -#: commands/tablecmds.c:16773 +#: commands/tablecmds.c:17391 #, c-format msgid "cannot use constant expression as partition key" msgstr "Partitionierungsschlüssel kann kein konstanter Ausdruck sein" -#: commands/tablecmds.c:16794 +#: commands/tablecmds.c:17412 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "konnte die für den Partitionierungsausdruck zu verwendende Sortierfolge nicht bestimmen" -#: commands/tablecmds.c:16829 +#: commands/tablecmds.c:17447 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "Sie müssen eine hash-Operatorklasse angeben oder eine hash-Standardoperatorklasse für den Datentyp definieren." -#: commands/tablecmds.c:16835 +#: commands/tablecmds.c:17453 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "Sie müssen eine btree-Operatorklasse angeben oder eine btree-Standardoperatorklasse für den Datentyp definieren." -#: commands/tablecmds.c:17087 +#: commands/tablecmds.c:17704 #, c-format msgid "\"%s\" is already a partition" msgstr "»%s« ist bereits eine Partition" -#: commands/tablecmds.c:17093 +#: commands/tablecmds.c:17710 #, c-format msgid "cannot attach a typed table as partition" msgstr "eine getypte Tabelle kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:17109 +#: commands/tablecmds.c:17726 #, c-format msgid "cannot attach inheritance child as partition" msgstr "ein Vererbungskind kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:17123 +#: commands/tablecmds.c:17740 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "eine Tabelle mit abgeleiteten Tabellen kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:17157 +#: commands/tablecmds.c:17774 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "eine temporäre Relation kann nicht als Partition an permanente Relation »%s« angefügt werden" -#: commands/tablecmds.c:17165 +#: commands/tablecmds.c:17782 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "eine permanente Relation kann nicht als Partition an temporäre Relation »%s« angefügt werden" -#: commands/tablecmds.c:17173 +#: commands/tablecmds.c:17790 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "kann nicht als Partition an temporäre Relation einer anderen Sitzung anfügen" -#: commands/tablecmds.c:17180 +#: commands/tablecmds.c:17797 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "temporäre Relation einer anderen Sitzung kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:17200 +#: commands/tablecmds.c:17817 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "Tabelle »%s« enthält Spalte »%s«, die nicht in der Elterntabelle »%s« gefunden wurde" -#: commands/tablecmds.c:17203 +#: commands/tablecmds.c:17820 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "Die neue Partition darf nur Spalten enthalten, die auch die Elterntabelle hat." -#: commands/tablecmds.c:17215 +#: commands/tablecmds.c:17832 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "Trigger »%s« verhindert, dass Tabelle »%s« eine Partition werden kann" -#: commands/tablecmds.c:17217 commands/trigger.c:441 +#: commands/tablecmds.c:17834 commands/trigger.c:473 #, c-format msgid "ROW triggers with transition tables are not supported on partitions" msgstr "ROW-Trigger mit Übergangstabellen werden für Partitionen nicht unterstützt" -#: commands/tablecmds.c:17380 +#: commands/tablecmds.c:18013 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "kann Fremdtabelle »%s« nicht als Partition an partitionierte Tabelle »%s« anfügen" -#: commands/tablecmds.c:17383 +#: commands/tablecmds.c:18016 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Partitionierte Tabelle »%s« enthält Unique-Indexe." -#: commands/tablecmds.c:17703 -#, fuzzy, c-format -#| msgid "a hash-partitioned table may not have a default partition" +#: commands/tablecmds.c:18327 +#, c-format msgid "cannot detach partitions concurrently when a default partition exists" -msgstr "eine hashpartitionierte Tabelle kann keine Standardpartition haben" +msgstr "nebenläufiges Abtrennen einer Partition ist nicht möglich, wenn eine Standardpartition existiert" -#: commands/tablecmds.c:17812 +#: commands/tablecmds.c:18436 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "partitionierte Tabelle »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:17818 +#: commands/tablecmds.c:18442 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "Partition »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:18272 commands/tablecmds.c:18292 -#: commands/tablecmds.c:18312 commands/tablecmds.c:18331 -#: commands/tablecmds.c:18373 +#: commands/tablecmds.c:18946 commands/tablecmds.c:18966 +#: commands/tablecmds.c:18986 commands/tablecmds.c:19005 +#: commands/tablecmds.c:19047 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "kann Index »%s« nicht als Partition an Index »%s« anfügen" -#: commands/tablecmds.c:18275 +#: commands/tablecmds.c:18949 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Index »%s« ist bereits an einen anderen Index angefügt." -#: commands/tablecmds.c:18295 +#: commands/tablecmds.c:18969 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Index »%s« ist kein Index irgendeiner Partition von Tabelle »%s«." -#: commands/tablecmds.c:18315 +#: commands/tablecmds.c:18989 #, c-format msgid "The index definitions do not match." msgstr "Die Indexdefinitionen stimmen nicht überein." -#: commands/tablecmds.c:18334 +#: commands/tablecmds.c:19008 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "Der Index »%s« gehört zu einem Constraint in Tabelle »%s«, aber kein Constraint existiert für Index »%s«." -#: commands/tablecmds.c:18376 +#: commands/tablecmds.c:19050 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "Ein anderer Index ist bereits für Partition »%s« angefügt." -#: commands/tablecmds.c:18606 +#: commands/tablecmds.c:19280 #, c-format msgid "column data type %s does not support compression" msgstr "Spaltendatentyp %s unterstützt keine Komprimierung" -#: commands/tablecmds.c:18613 +#: commands/tablecmds.c:19287 #, c-format msgid "invalid compression method \"%s\"" msgstr "ungültige Komprimierungsmethode »%s«" -#: commands/tablespace.c:162 commands/tablespace.c:179 -#: commands/tablespace.c:190 commands/tablespace.c:198 -#: commands/tablespace.c:650 replication/slot.c:1409 storage/file/copydir.c:47 -#, c-format -msgid "could not create directory \"%s\": %m" -msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" - -#: commands/tablespace.c:209 +#: commands/tablespace.c:212 commands/tablespace.c:676 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "konnte »stat« für Verzeichnis »%s« nicht ausführen: %m" -#: commands/tablespace.c:218 +#: commands/tablespace.c:221 commands/tablespace.c:687 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "»%s« existiert, ist aber kein Verzeichnis" -#: commands/tablespace.c:249 +#: commands/tablespace.c:253 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "keine Berechtigung, um Tablespace »%s« zu erzeugen" -#: commands/tablespace.c:251 +#: commands/tablespace.c:255 #, c-format msgid "Must be superuser to create a tablespace." msgstr "Nur Superuser können Tablespaces anlegen." -#: commands/tablespace.c:267 +#: commands/tablespace.c:271 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "Tablespace-Pfad darf keine Apostrophe enthalten" -#: commands/tablespace.c:277 +#: commands/tablespace.c:284 #, c-format msgid "tablespace location must be an absolute path" msgstr "Tablespace-Pfad muss ein absoluter Pfad sein" -#: commands/tablespace.c:289 +#: commands/tablespace.c:296 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "Tablespace-Pfad »%s« ist zu lang" -#: commands/tablespace.c:296 +#: commands/tablespace.c:303 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "Tablespace-Pfad sollte nicht innerhalb des Datenverzeichnisses sein" -#: commands/tablespace.c:305 commands/tablespace.c:977 +#: commands/tablespace.c:312 commands/tablespace.c:1018 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "inakzeptabler Tablespace-Name »%s«" -#: commands/tablespace.c:307 commands/tablespace.c:978 +#: commands/tablespace.c:314 commands/tablespace.c:1019 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "Der Präfix »pg_« ist für System-Tablespaces reserviert." -#: commands/tablespace.c:326 commands/tablespace.c:999 +#: commands/tablespace.c:333 commands/tablespace.c:1040 #, c-format msgid "tablespace \"%s\" already exists" msgstr "Tablespace »%s« existiert bereits" -#: commands/tablespace.c:444 commands/tablespace.c:960 -#: commands/tablespace.c:1049 commands/tablespace.c:1118 -#: commands/tablespace.c:1264 commands/tablespace.c:1467 +#: commands/tablespace.c:351 +#, fuzzy, c-format +#| msgid "pg_type OID value not set when in binary upgrade mode" +msgid "pg_tablespace OID value not set when in binary upgrade mode" +msgstr "OID-Wert für pg_type ist im Binary-Upgrade-Modus nicht gesetzt" + +#: commands/tablespace.c:463 commands/tablespace.c:1001 +#: commands/tablespace.c:1090 commands/tablespace.c:1159 +#: commands/tablespace.c:1305 commands/tablespace.c:1508 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "Tablespace »%s« existiert nicht" -#: commands/tablespace.c:450 +#: commands/tablespace.c:469 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "Tablespace »%s« existiert nicht, wird übersprungen" -#: commands/tablespace.c:478 +#: commands/tablespace.c:495 #, c-format msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" msgstr "kann Tablespace »%s« nicht löschen, weil andere Objekte davon abhängen" -#: commands/tablespace.c:537 +#: commands/tablespace.c:562 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "Tablespace »%s« ist nicht leer" -#: commands/tablespace.c:609 +#: commands/tablespace.c:654 #, c-format msgid "directory \"%s\" does not exist" msgstr "Verzeichnis »%s« existiert nicht" -#: commands/tablespace.c:610 +#: commands/tablespace.c:655 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "Erzeugen Sie dieses Verzeichnis für den Tablespace bevor Sie den Server neu starten." -#: commands/tablespace.c:615 +#: commands/tablespace.c:660 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "konnte Zugriffsrechte für Verzeichnis »%s« nicht setzen: %m" -#: commands/tablespace.c:645 +#: commands/tablespace.c:692 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "Verzeichnis »%s« ist bereits als Tablespace in Verwendung" -#: commands/tablespace.c:769 commands/tablespace.c:782 -#: commands/tablespace.c:818 commands/tablespace.c:910 storage/file/fd.c:3161 -#: storage/file/fd.c:3557 +#: commands/tablespace.c:810 commands/tablespace.c:823 +#: commands/tablespace.c:859 commands/tablespace.c:951 storage/file/fd.c:3255 +#: storage/file/fd.c:3669 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht löschen: %m" -#: commands/tablespace.c:831 commands/tablespace.c:919 +#: commands/tablespace.c:872 commands/tablespace.c:960 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht löschen: %m" -#: commands/tablespace.c:841 commands/tablespace.c:928 +#: commands/tablespace.c:882 commands/tablespace.c:969 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "»%s« ist kein Verzeichnis oder symbolische Verknüpfung" -#: commands/tablespace.c:1123 +#: commands/tablespace.c:1164 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "Tablespace »%s« existiert nicht." -#: commands/tablespace.c:1566 +#: commands/tablespace.c:1610 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "Verzeichnisse für Tablespace %u konnten nicht entfernt werden" -#: commands/tablespace.c:1568 +#: commands/tablespace.c:1612 #, c-format msgid "You can remove the directories manually if necessary." msgstr "Sie können die Verzeichnisse falls nötig manuell entfernen." -#: commands/trigger.c:198 commands/trigger.c:209 +#: commands/trigger.c:229 commands/trigger.c:240 #, c-format msgid "\"%s\" is a table" msgstr "»%s« ist eine Tabelle" -#: commands/trigger.c:200 commands/trigger.c:211 +#: commands/trigger.c:231 commands/trigger.c:242 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "Tabellen können keine INSTEAD OF-Trigger haben." -#: commands/trigger.c:232 +#: commands/trigger.c:263 #, c-format msgid "\"%s\" is a partitioned table" msgstr "»%s« ist eine partitionierte Tabelle" -#: commands/trigger.c:234 +#: commands/trigger.c:265 #, c-format msgid "Triggers on partitioned tables cannot have transition tables." msgstr "Trigger für partitionierte Tabellen können keine Übergangstabellen haben." -#: commands/trigger.c:246 commands/trigger.c:253 commands/trigger.c:423 +#: commands/trigger.c:277 commands/trigger.c:284 commands/trigger.c:455 #, c-format msgid "\"%s\" is a view" msgstr "»%s« ist eine Sicht" -#: commands/trigger.c:248 +#: commands/trigger.c:279 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "Sichten können keine BEFORE- oder AFTER-Trigger auf Zeilenebene haben." -#: commands/trigger.c:255 +#: commands/trigger.c:286 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "Sichten können keine TRUNCATE-Trigger haben." -#: commands/trigger.c:263 commands/trigger.c:270 commands/trigger.c:282 -#: commands/trigger.c:416 +#: commands/trigger.c:294 commands/trigger.c:301 commands/trigger.c:313 +#: commands/trigger.c:448 #, c-format msgid "\"%s\" is a foreign table" msgstr "»%s« ist eine Fremdtabelle" -#: commands/trigger.c:265 +#: commands/trigger.c:296 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "Fremdtabellen können keine INSTEAD OF-Trigger haben." -#: commands/trigger.c:272 +#: commands/trigger.c:303 #, c-format msgid "Foreign tables cannot have TRUNCATE triggers." msgstr "Fremdtabellen können keine TRUNCATE-Trigger haben." -#: commands/trigger.c:284 +#: commands/trigger.c:315 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "Fremdtabellen können keine Constraint-Trigger haben." -#: commands/trigger.c:359 +#: commands/trigger.c:320 commands/trigger.c:1375 commands/trigger.c:1482 +#, c-format +msgid "relation \"%s\" cannot have triggers" +msgstr "Relation »%s« kann keine Trigger haben" + +#: commands/trigger.c:391 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "TRUNCATE FOR EACH ROW-Trigger werden nicht unterstützt" -#: commands/trigger.c:367 +#: commands/trigger.c:399 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "INSTEAD OF-Trigger müssen FOR EACH ROW sein" -#: commands/trigger.c:371 +#: commands/trigger.c:403 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "INSTEAD OF-Trigger können keine WHEN-Bedingungen haben" -#: commands/trigger.c:375 +#: commands/trigger.c:407 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "INSTEAD OF-Trigger können keine Spaltenlisten haben" -#: commands/trigger.c:404 +#: commands/trigger.c:436 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "Benennung von ROW-Variablen in der REFERENCING-Klausel wird nicht unterstützt" -#: commands/trigger.c:405 +#: commands/trigger.c:437 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "Verwenden Sie OLD TABLE und NEW TABLE, um Übergangstabellen zu benennen." -#: commands/trigger.c:418 +#: commands/trigger.c:450 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Trigger für Fremdtabellen können keine Übergangstabellen haben." -#: commands/trigger.c:425 +#: commands/trigger.c:457 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Trigger für Sichten können keine Übergangstabellen haben." -#: commands/trigger.c:445 +#: commands/trigger.c:477 #, c-format msgid "ROW triggers with transition tables are not supported on inheritance children" msgstr "ROW-Trigger mit Übergangstabellen werden für Vererbungskinder nicht unterstützt" -#: commands/trigger.c:451 +#: commands/trigger.c:483 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "Übergangstabellenname kann nur für einen AFTER-Trigger angegeben werden" -#: commands/trigger.c:456 +#: commands/trigger.c:488 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "TRUNCATE-Trigger mit Übergangstabellen werden nicht unterstützt" -#: commands/trigger.c:473 +#: commands/trigger.c:505 #, c-format msgid "transition tables cannot be specified for triggers with more than one event" msgstr "Übergangstabellen können nicht für Trigger mit mehr als einem Ereignis angegeben werden" -#: commands/trigger.c:484 +#: commands/trigger.c:516 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "Übergangstabellen können nicht für Trigger mit Spaltenlisten angegeben werden" -#: commands/trigger.c:501 +#: commands/trigger.c:533 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "NEW TABLE kann nur für INSERT- oder UPDATE-Trigger angegeben werden" -#: commands/trigger.c:506 +#: commands/trigger.c:538 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE kann nicht mehrmals angegeben werden" -#: commands/trigger.c:516 +#: commands/trigger.c:548 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE kann nur für DELETE- oder UPDATE-Trigger angegeben werden" -#: commands/trigger.c:521 +#: commands/trigger.c:553 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE kann nicht mehrmals angegeben werden" -#: commands/trigger.c:531 +#: commands/trigger.c:563 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "Name für OLD TABLE und NEW TABLE kann nicht gleich sein" -#: commands/trigger.c:595 commands/trigger.c:608 +#: commands/trigger.c:627 commands/trigger.c:640 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "WHEN-Bedingung eines Statement-Triggers kann keine Verweise auf Spaltenwerte enthalten" -#: commands/trigger.c:600 +#: commands/trigger.c:632 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "WHEN-Bedingung eines INSERT-Triggers kann keine Verweise auf OLD-Werte enthalten" -#: commands/trigger.c:613 +#: commands/trigger.c:645 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "WHEN-Bedingung eines DELETE-Triggers kann keine Verweise auf NEW-Werte enthalten" -#: commands/trigger.c:618 +#: commands/trigger.c:650 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "WHEN-Bedingung eines BEFORE-Triggers kann keine Verweise auf Systemspalten in NEW enthalten" -#: commands/trigger.c:626 commands/trigger.c:634 +#: commands/trigger.c:658 commands/trigger.c:666 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "WHEN-Bedingung eines BEFORE-Triggers kann keine Verweise auf generierte Spalten in NEW enthalten" -#: commands/trigger.c:627 +#: commands/trigger.c:659 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "Ein Verweis auf die ganze Zeile der Tabelle wird verwendet und die Tabelle enthält generierte Spalten." -#: commands/trigger.c:741 commands/trigger.c:1450 +#: commands/trigger.c:774 commands/trigger.c:1657 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "Trigger »%s« für Relation »%s« existiert bereits" -#: commands/trigger.c:755 -#, c-format -msgid "trigger \"%s\" for relation \"%s\" is an internal trigger" +#: commands/trigger.c:787 +#, fuzzy, c-format +#| msgid "trigger \"%s\" for relation \"%s\" is an internal trigger" +msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" msgstr "Trigger »%s« für Relation »%s« ist ein interner Trigger" -#: commands/trigger.c:774 +#: commands/trigger.c:806 #, c-format msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" msgstr "Trigger »%s« für Relation »%s« ist ein Constraint-Trigger" -#: commands/trigger.c:1336 commands/trigger.c:1497 commands/trigger.c:1612 +#: commands/trigger.c:1447 commands/trigger.c:1600 commands/trigger.c:1846 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "Trigger »%s« für Tabelle »%s« existiert nicht" -#: commands/trigger.c:1580 +#: commands/trigger.c:1572 +#, fuzzy, c-format +#| msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" +msgid "cannot rename trigger \"%s\" on table \"%s\"" +msgstr "kein »pg_constraint«-Eintrag für Trigger »%s« für Tabelle »%s«" + +#: commands/trigger.c:1574 +#, fuzzy, c-format +#| msgid "cannot inherit from partitioned table \"%s\"" +msgid "Rename trigger on partitioned table \"%s\" instead." +msgstr "von partitionierter Tabelle »%s« kann nicht geerbt werden" + +#: commands/trigger.c:1674 +#, fuzzy, c-format +#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgid "renamed trigger \"%s\" on relation \"%s\"" +msgstr "Constraint »%s« von Relation »%s« kann nicht geändert werden" + +#: commands/trigger.c:1814 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "keine Berechtigung: »%s« ist ein Systemtrigger" -#: commands/trigger.c:2160 +#: commands/trigger.c:2394 #, c-format msgid "trigger function %u returned null value" msgstr "Triggerfunktion %u gab NULL-Wert zurück" -#: commands/trigger.c:2220 commands/trigger.c:2434 commands/trigger.c:2673 -#: commands/trigger.c:2977 +#: commands/trigger.c:2454 commands/trigger.c:2672 commands/trigger.c:2922 +#: commands/trigger.c:3255 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "Trigger für BEFORE STATEMENT kann keinen Wert zurückgeben" -#: commands/trigger.c:2294 +#: commands/trigger.c:2530 #, c-format msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" msgstr "Verschieben einer Zeile in eine andere Partition durch einen BEFORE-FOR-EACH-ROW-Trigger wird nicht unterstützt" -#: commands/trigger.c:2295 +#: commands/trigger.c:2531 #, c-format msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "Vor der Ausführung von Trigger »%s« gehörte die Zeile in Partition »%s.%s«." -#: commands/trigger.c:3043 executor/nodeModifyTable.c:1811 -#: executor/nodeModifyTable.c:1893 +#: commands/trigger.c:3329 executor/nodeModifyTable.c:2224 +#: executor/nodeModifyTable.c:2307 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "das zu aktualisierende Tupel wurde schon durch eine vom aktuellen Befehl ausgelöste Operation verändert" -#: commands/trigger.c:3044 executor/nodeModifyTable.c:1193 -#: executor/nodeModifyTable.c:1267 executor/nodeModifyTable.c:1812 -#: executor/nodeModifyTable.c:1894 +#: commands/trigger.c:3330 executor/nodeModifyTable.c:1410 +#: executor/nodeModifyTable.c:1484 executor/nodeModifyTable.c:2225 +#: executor/nodeModifyTable.c:2308 executor/nodeModifyTable.c:2966 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "Verwenden Sie einen AFTER-Trigger anstelle eines BEFORE-Triggers, um Änderungen an andere Zeilen zu propagieren." -#: commands/trigger.c:3073 executor/nodeLockRows.c:225 -#: executor/nodeLockRows.c:234 executor/nodeModifyTable.c:228 -#: executor/nodeModifyTable.c:1209 executor/nodeModifyTable.c:1829 -#: executor/nodeModifyTable.c:2059 +#: commands/trigger.c:3359 executor/nodeLockRows.c:229 +#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:329 +#: executor/nodeModifyTable.c:1426 executor/nodeModifyTable.c:2242 +#: executor/nodeModifyTable.c:2452 #, c-format msgid "could not serialize access due to concurrent update" msgstr "konnte Zugriff nicht serialisieren wegen gleichzeitiger Aktualisierung" -#: commands/trigger.c:3081 executor/nodeModifyTable.c:1299 -#: executor/nodeModifyTable.c:1911 executor/nodeModifyTable.c:2083 +#: commands/trigger.c:3367 executor/nodeModifyTable.c:1516 +#: executor/nodeModifyTable.c:2325 executor/nodeModifyTable.c:2476 +#: executor/nodeModifyTable.c:2832 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "konnte Zugriff nicht serialisieren wegen gleichzeitigem Löschen" -#: commands/trigger.c:4142 +#: commands/trigger.c:4543 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "aufgeschobener Trigger kann nicht in einer sicherheitsbeschränkten Operation ausgelöst werden" -#: commands/trigger.c:5185 +#: commands/trigger.c:5719 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "Constraint »%s« ist nicht aufschiebbar" -#: commands/trigger.c:5208 +#: commands/trigger.c:5742 #, c-format msgid "constraint \"%s\" does not exist" msgstr "Constraint »%s« existiert nicht" @@ -11021,643 +11564,637 @@ msgstr "nur Superuser können Basistypen anlegen" msgid "Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE." msgstr "Erzeugen Sie den Typ als Shell-Typ, legen Sie dann die I/O-Funktionen an und führen Sie dann das volle CREATE TYPE aus." -#: commands/typecmds.c:327 commands/typecmds.c:1465 commands/typecmds.c:4281 +#: commands/typecmds.c:327 commands/typecmds.c:1450 commands/typecmds.c:4268 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "Typ-Attribut »%s« nicht erkannt" -#: commands/typecmds.c:385 +#: commands/typecmds.c:382 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "ungültige Typenkategorie »%s«: muss einfacher ASCII-Wert sein" -#: commands/typecmds.c:404 +#: commands/typecmds.c:401 #, c-format msgid "array element type cannot be %s" msgstr "Arrayelementtyp kann nicht %s sein" -#: commands/typecmds.c:436 +#: commands/typecmds.c:433 #, c-format msgid "alignment \"%s\" not recognized" msgstr "Ausrichtung »%s« nicht erkannt" -#: commands/typecmds.c:453 commands/typecmds.c:4155 +#: commands/typecmds.c:450 commands/typecmds.c:4142 #, c-format msgid "storage \"%s\" not recognized" msgstr "Storage-Typ »%s« nicht erkannt" -#: commands/typecmds.c:464 +#: commands/typecmds.c:461 #, c-format msgid "type input function must be specified" msgstr "Typeingabefunktion muss angegeben werden" -#: commands/typecmds.c:468 +#: commands/typecmds.c:465 #, c-format msgid "type output function must be specified" msgstr "Typausgabefunktion muss angegeben werden" -#: commands/typecmds.c:473 +#: commands/typecmds.c:470 #, c-format msgid "type modifier output function is useless without a type modifier input function" msgstr "Typmodifikatorausgabefunktion ist nutzlos ohne Typmodifikatoreingabefunktion" -#: commands/typecmds.c:515 +#: commands/typecmds.c:512 #, c-format -msgid "element type cannot be specified without a valid subscripting procedure" -msgstr "" +msgid "element type cannot be specified without a subscripting function" +msgstr "Elementtyp kann nicht ohne eine Subscript-Funktion angeben werden" -#: commands/typecmds.c:784 +#: commands/typecmds.c:781 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "»%s« ist kein gültiger Basistyp für eine Domäne" -#: commands/typecmds.c:882 +#: commands/typecmds.c:879 #, c-format msgid "multiple default expressions" msgstr "mehrere Vorgabeausdrücke" -#: commands/typecmds.c:945 commands/typecmds.c:954 +#: commands/typecmds.c:942 commands/typecmds.c:951 #, c-format msgid "conflicting NULL/NOT NULL constraints" msgstr "wiedersprüchliche NULL/NOT NULL-Constraints" -#: commands/typecmds.c:970 +#: commands/typecmds.c:967 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "Check-Constraints für Domänen können nicht als NO INHERIT markiert werden" -#: commands/typecmds.c:979 commands/typecmds.c:2975 +#: commands/typecmds.c:976 commands/typecmds.c:2960 #, c-format msgid "unique constraints not possible for domains" msgstr "Unique-Constraints sind nicht für Domänen möglich" -#: commands/typecmds.c:985 commands/typecmds.c:2981 +#: commands/typecmds.c:982 commands/typecmds.c:2966 #, c-format msgid "primary key constraints not possible for domains" msgstr "Primärschlüssel-Constraints sind nicht fürDomänen möglich" -#: commands/typecmds.c:991 commands/typecmds.c:2987 +#: commands/typecmds.c:988 commands/typecmds.c:2972 #, c-format msgid "exclusion constraints not possible for domains" msgstr "Exclusion-Constraints sind nicht für Domänen möglich" -#: commands/typecmds.c:997 commands/typecmds.c:2993 +#: commands/typecmds.c:994 commands/typecmds.c:2978 #, c-format msgid "foreign key constraints not possible for domains" msgstr "Fremdschlüssel-Constraints sind nicht für Domänen möglich" -#: commands/typecmds.c:1006 commands/typecmds.c:3002 +#: commands/typecmds.c:1003 commands/typecmds.c:2987 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "Setzen des Constraint-Modus wird für Domänen nicht unterstützt" -#: commands/typecmds.c:1320 utils/cache/typcache.c:2545 +#: commands/typecmds.c:1317 utils/cache/typcache.c:2567 #, c-format msgid "%s is not an enum" msgstr "»%s« ist kein Enum" -#: commands/typecmds.c:1473 +#: commands/typecmds.c:1458 #, c-format msgid "type attribute \"subtype\" is required" msgstr "Typ-Attribut »subtype« muss angegeben werden" -#: commands/typecmds.c:1478 +#: commands/typecmds.c:1463 #, c-format msgid "range subtype cannot be %s" msgstr "Bereichtsuntertyp kann nicht %s sein" -#: commands/typecmds.c:1497 +#: commands/typecmds.c:1482 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "Sortierfolge für Bereichstyp angegeben, aber Untertyp unterstützt keine Sortierfolgen" -#: commands/typecmds.c:1507 +#: commands/typecmds.c:1492 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "Canonical-Funktion kann nicht angegeben werden ohne einen vorher angelegten Shell-Typ" -#: commands/typecmds.c:1508 +#: commands/typecmds.c:1493 #, c-format msgid "Create the type as a shell type, then create its canonicalization function, then do a full CREATE TYPE." msgstr "Erzeugen Sie den Typ als Shell-Typ, legen Sie dann die Canonicalization-Funktion an und führen Sie dann das volle CREATE TYPE aus." -#: commands/typecmds.c:1982 +#: commands/typecmds.c:1966 #, c-format msgid "type input function %s has multiple matches" msgstr "Typeingabefunktion %s hat mehrere Übereinstimmungen" -#: commands/typecmds.c:2000 +#: commands/typecmds.c:1984 #, c-format msgid "type input function %s must return type %s" msgstr "Typeingabefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2016 +#: commands/typecmds.c:2000 #, c-format msgid "type input function %s should not be volatile" msgstr "Typeingabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2044 +#: commands/typecmds.c:2028 #, c-format msgid "type output function %s must return type %s" msgstr "Typausgabefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2051 +#: commands/typecmds.c:2035 #, c-format msgid "type output function %s should not be volatile" msgstr "Typausgabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2080 +#: commands/typecmds.c:2064 #, c-format msgid "type receive function %s has multiple matches" msgstr "Typempfangsfunktion %s hat mehrere Übereinstimmungen" -#: commands/typecmds.c:2098 +#: commands/typecmds.c:2082 #, c-format msgid "type receive function %s must return type %s" msgstr "Typempfangsfunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2105 +#: commands/typecmds.c:2089 #, c-format msgid "type receive function %s should not be volatile" msgstr "Typempfangsfunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2133 +#: commands/typecmds.c:2117 #, c-format msgid "type send function %s must return type %s" msgstr "Typsendefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2140 +#: commands/typecmds.c:2124 #, c-format msgid "type send function %s should not be volatile" msgstr "Typsendefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2167 +#: commands/typecmds.c:2151 #, c-format msgid "typmod_in function %s must return type %s" msgstr "typmod_in-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2174 +#: commands/typecmds.c:2158 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "Typmodifikatoreingabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2201 +#: commands/typecmds.c:2185 #, c-format msgid "typmod_out function %s must return type %s" msgstr "typmod_out-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2208 +#: commands/typecmds.c:2192 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "Typmodifikatorausgabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2235 +#: commands/typecmds.c:2219 #, c-format msgid "type analyze function %s must return type %s" msgstr "Typanalysefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2264 -#, fuzzy, c-format -#| msgid "type input function %s must return type %s" +#: commands/typecmds.c:2248 +#, c-format msgid "type subscripting function %s must return type %s" -msgstr "Typeingabefunktion %s muss Typ %s zurückgeben" +msgstr "Typ-Subscript-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2274 +#: commands/typecmds.c:2258 #, c-format msgid "user-defined types cannot use subscripting function %s" -msgstr "" +msgstr "benutzerdefinierte Typen können Subscript-Funktion %s nicht verwenden" -#: commands/typecmds.c:2320 +#: commands/typecmds.c:2304 #, c-format msgid "You must specify an operator class for the range type or define a default operator class for the subtype." msgstr "Sie müssen für den Bereichstyp eine Operatorklasse angeben oder eine Standardoperatorklasse für den Untertyp definieren." -#: commands/typecmds.c:2351 +#: commands/typecmds.c:2335 #, c-format msgid "range canonical function %s must return range type" msgstr "Bereichstyp-Canonical-Funktion %s muss Bereichstyp zurückgeben" -#: commands/typecmds.c:2357 +#: commands/typecmds.c:2341 #, c-format msgid "range canonical function %s must be immutable" msgstr "Bereichstyp-Canonical-Funktion %s muss »immutable« sein" -#: commands/typecmds.c:2393 +#: commands/typecmds.c:2377 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "Bereichstyp-Untertyp-Diff-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2400 +#: commands/typecmds.c:2384 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "Bereichstyp-Untertyp-Diff-Funktion %s muss »immutable« sein" -#: commands/typecmds.c:2427 +#: commands/typecmds.c:2411 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "Array-OID-Wert für pg_type ist im Binary-Upgrade-Modus nicht gesetzt" -#: commands/typecmds.c:2460 +#: commands/typecmds.c:2444 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "Multirange-OID-Wert für pg_type ist im Binary-Upgrade-Modus nicht gesetzt" -#: commands/typecmds.c:2493 +#: commands/typecmds.c:2477 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" msgstr "Multirange-Array-OID-Wert für pg_type ist im Binary-Upgrade-Modus nicht gesetzt" -#: commands/typecmds.c:2791 +#: commands/typecmds.c:2776 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "Spalte »%s« von Tabelle »%s« enthält NULL-Werte" -#: commands/typecmds.c:2904 commands/typecmds.c:3106 +#: commands/typecmds.c:2889 commands/typecmds.c:3091 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "Constraint »%s« von Domäne »%s« existiert nicht" -#: commands/typecmds.c:2908 +#: commands/typecmds.c:2893 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "Constraint »%s« von Domäne »%s« existiert nicht, wird übersprungen" -#: commands/typecmds.c:3113 +#: commands/typecmds.c:3098 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "Constraint »%s« von Domäne »%s« ist kein Check-Constraint" -#: commands/typecmds.c:3219 +#: commands/typecmds.c:3204 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "Spalte »%s« von Tabelle »%s« enthält Werte, die den neuen Constraint verletzen" -#: commands/typecmds.c:3448 commands/typecmds.c:3646 commands/typecmds.c:3727 -#: commands/typecmds.c:3913 +#: commands/typecmds.c:3433 commands/typecmds.c:3633 commands/typecmds.c:3714 +#: commands/typecmds.c:3900 #, c-format msgid "%s is not a domain" msgstr "%s ist keine Domäne" -#: commands/typecmds.c:3480 +#: commands/typecmds.c:3465 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "Constraint »%s« für Domäne »%s« existiert bereits" -#: commands/typecmds.c:3531 +#: commands/typecmds.c:3516 #, c-format msgid "cannot use table references in domain check constraint" msgstr "Tabellenverweise können in Domänen-Check-Constraints nicht verwendet werden" -#: commands/typecmds.c:3658 commands/typecmds.c:3739 commands/typecmds.c:4030 +#: commands/typecmds.c:3645 commands/typecmds.c:3726 commands/typecmds.c:4017 #, c-format msgid "%s is a table's row type" msgstr "%s ist der Zeilentyp einer Tabelle" -#: commands/typecmds.c:3660 commands/typecmds.c:3741 commands/typecmds.c:4032 +#: commands/typecmds.c:3647 commands/typecmds.c:3728 commands/typecmds.c:4019 #, c-format msgid "Use ALTER TABLE instead." msgstr "Verwenden Sie stattdessen ALTER TABLE." -#: commands/typecmds.c:3666 commands/typecmds.c:3747 commands/typecmds.c:3945 +#: commands/typecmds.c:3653 commands/typecmds.c:3734 commands/typecmds.c:3932 #, c-format msgid "cannot alter array type %s" msgstr "Array-Typ %s kann nicht verändert werden" -#: commands/typecmds.c:3668 commands/typecmds.c:3749 commands/typecmds.c:3947 +#: commands/typecmds.c:3655 commands/typecmds.c:3736 commands/typecmds.c:3934 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "Sie können den Typ %s ändern, wodurch der Array-Typ ebenfalls geändert wird." -#: commands/typecmds.c:4015 +#: commands/typecmds.c:4002 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "Typ %s existiert bereits in Schema »%s«" -#: commands/typecmds.c:4183 +#: commands/typecmds.c:4170 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "Storage-Typ eines Typs kann nicht in PLAIN geändert werden" -#: commands/typecmds.c:4276 +#: commands/typecmds.c:4263 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "Typ-Attribut »%s« kann nicht geändert werden" -#: commands/typecmds.c:4294 +#: commands/typecmds.c:4281 #, c-format msgid "must be superuser to alter a type" msgstr "nur Superuser können Typen ändern" -#: commands/typecmds.c:4315 commands/typecmds.c:4324 +#: commands/typecmds.c:4302 commands/typecmds.c:4311 #, c-format msgid "%s is not a base type" msgstr "%s ist kein Basistyp" -#: commands/user.c:140 +#: commands/user.c:138 #, c-format msgid "SYSID can no longer be specified" msgstr "SYSID kann nicht mehr angegeben werden" -#: commands/user.c:294 +#: commands/user.c:256 #, c-format msgid "must be superuser to create superusers" msgstr "nur Superuser können Superuser anlegen" -#: commands/user.c:301 +#: commands/user.c:263 #, c-format msgid "must be superuser to create replication users" msgstr "nur Superuser können Replikationsbenutzer anlegen" -#: commands/user.c:308 +#: commands/user.c:270 #, c-format msgid "must be superuser to create bypassrls users" msgstr "nur Superuser können Benutzer mit »bypassrls« anlegen" -#: commands/user.c:315 +#: commands/user.c:277 #, c-format msgid "permission denied to create role" msgstr "keine Berechtigung, um Rolle zu erzeugen" -#: commands/user.c:325 commands/user.c:1226 commands/user.c:1233 gram.y:15283 -#: gram.y:15328 utils/adt/acl.c:5248 utils/adt/acl.c:5254 +#: commands/user.c:287 commands/user.c:1139 commands/user.c:1146 gram.y:17457 +#: gram.y:17503 utils/adt/acl.c:5331 utils/adt/acl.c:5337 #, c-format msgid "role name \"%s\" is reserved" msgstr "Rollenname »%s« ist reserviert" -#: commands/user.c:327 commands/user.c:1228 commands/user.c:1235 +#: commands/user.c:289 commands/user.c:1141 commands/user.c:1148 #, c-format msgid "Role names starting with \"pg_\" are reserved." msgstr "Rollennamen, die mit »pg_« anfangen, sind reserviert." -#: commands/user.c:348 commands/user.c:1250 +#: commands/user.c:310 commands/user.c:1163 #, c-format msgid "role \"%s\" already exists" msgstr "Rolle »%s« existiert bereits" -#: commands/user.c:414 commands/user.c:845 +#: commands/user.c:376 commands/user.c:754 #, c-format msgid "empty string is not a valid password, clearing password" msgstr "leere Zeichenkette ist kein gültiges Passwort, Passwort wird entfernt" -#: commands/user.c:443 +#: commands/user.c:405 #, c-format msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "OID-Wert für pg_auth ist im Binary-Upgrade-Modus nicht gesetzt" -#: commands/user.c:722 -#, fuzzy, c-format -#| msgid "must be superuser to change bypassrls attribute" +#: commands/user.c:638 +#, c-format msgid "must be superuser to alter superuser roles or change superuser attribute" -msgstr "nur Superuser können das Attribut »bypassrls« ändern" +msgstr "nur Superuser können Superuser-Rollen oder das Superuser-Attribut ändern" -#: commands/user.c:729 -#, fuzzy, c-format -#| msgid "must be superuser or replication role to use replication slots" +#: commands/user.c:645 +#, c-format msgid "must be superuser to alter replication roles or change replication attribute" -msgstr "nur Superuser und Replikationsrollen können Replikations-Slots verwenden" +msgstr "nur Superuser können Replikationsrollen oder das Replikationsattribut ändern" -#: commands/user.c:736 +#: commands/user.c:652 #, c-format msgid "must be superuser to change bypassrls attribute" msgstr "nur Superuser können das Attribut »bypassrls« ändern" -#: commands/user.c:752 commands/user.c:953 +#: commands/user.c:661 commands/user.c:866 #, c-format msgid "permission denied" msgstr "keine Berechtigung" -#: commands/user.c:946 commands/user.c:1487 commands/user.c:1665 +#: commands/user.c:859 commands/user.c:1400 commands/user.c:1573 #, c-format msgid "must be superuser to alter superusers" msgstr "nur Superuser können Superuser ändern" -#: commands/user.c:983 +#: commands/user.c:896 #, c-format msgid "must be superuser to alter settings globally" msgstr "nur Superuser können globale Einstellungen ändern" -#: commands/user.c:1005 +#: commands/user.c:918 #, c-format msgid "permission denied to drop role" msgstr "keine Berechtigung, um Rolle zu entfernen" -#: commands/user.c:1030 +#: commands/user.c:943 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "in DROP ROLE kann kein Rollenplatzhalter verwendet werden" -#: commands/user.c:1040 commands/user.c:1197 commands/variable.c:778 +#: commands/user.c:953 commands/user.c:1110 commands/variable.c:778 #: commands/variable.c:781 commands/variable.c:865 commands/variable.c:868 -#: utils/adt/acl.c:5103 utils/adt/acl.c:5151 utils/adt/acl.c:5179 -#: utils/adt/acl.c:5198 utils/init/miscinit.c:705 +#: utils/adt/acl.c:5186 utils/adt/acl.c:5234 utils/adt/acl.c:5262 +#: utils/adt/acl.c:5281 utils/init/miscinit.c:725 #, c-format msgid "role \"%s\" does not exist" msgstr "Rolle »%s« existiert nicht" -#: commands/user.c:1045 +#: commands/user.c:958 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "Rolle »%s« existiert nicht, wird übersprungen" -#: commands/user.c:1058 commands/user.c:1062 +#: commands/user.c:971 commands/user.c:975 #, c-format msgid "current user cannot be dropped" msgstr "aktueller Benutzer kann nicht entfernt werden" -#: commands/user.c:1066 +#: commands/user.c:979 #, c-format msgid "session user cannot be dropped" msgstr "aktueller Sitzungsbenutzer kann nicht entfernt werden" -#: commands/user.c:1076 +#: commands/user.c:989 #, c-format msgid "must be superuser to drop superusers" msgstr "nur Superuser können Superuser löschen" -#: commands/user.c:1092 +#: commands/user.c:1005 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "kann Rolle »%s« nicht löschen, weil andere Objekte davon abhängen" -#: commands/user.c:1213 +#: commands/user.c:1126 #, c-format msgid "session user cannot be renamed" msgstr "aktueller Sitzungsbenutzer kann nicht umbenannt werden" -#: commands/user.c:1217 +#: commands/user.c:1130 #, c-format msgid "current user cannot be renamed" msgstr "aktueller Benutzer kann nicht umbenannt werden" -#: commands/user.c:1260 +#: commands/user.c:1173 #, c-format msgid "must be superuser to rename superusers" msgstr "nur Superuser können Superuser umbenennen" -#: commands/user.c:1267 +#: commands/user.c:1180 #, c-format msgid "permission denied to rename role" msgstr "keine Berechtigung, um Rolle umzubenennen" -#: commands/user.c:1288 +#: commands/user.c:1201 #, c-format msgid "MD5 password cleared because of role rename" msgstr "MD5-Passwort wegen Rollenumbenennung gelöscht" -#: commands/user.c:1348 +#: commands/user.c:1261 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "bei GRANT/REVOKE ROLE können keine Spaltennamen angegeben werden" -#: commands/user.c:1386 +#: commands/user.c:1299 #, c-format msgid "permission denied to drop objects" msgstr "keine Berechtigung, um Objekte zu löschen" -#: commands/user.c:1413 commands/user.c:1422 +#: commands/user.c:1326 commands/user.c:1335 #, c-format msgid "permission denied to reassign objects" msgstr "keine Berechtigung, um Objekte neu zuzuordnen" -#: commands/user.c:1495 commands/user.c:1673 +#: commands/user.c:1408 commands/user.c:1581 #, c-format msgid "must have admin option on role \"%s\"" msgstr "Admin-Option für Rolle »%s« wird benötigt" -#: commands/user.c:1509 -#, fuzzy, c-format -#| msgid "table \"%s\" cannot be replicated" +#: commands/user.c:1422 +#, c-format msgid "role \"%s\" cannot have explicit members" -msgstr "Tabelle »%s« kann nicht repliziert werden" +msgstr "Rolle »%s« kann keine expliziten Mitglieder haben" -#: commands/user.c:1524 +#: commands/user.c:1432 #, c-format msgid "must be superuser to set grantor" msgstr "nur Superuser können Grantor setzen" -#: commands/user.c:1560 -#, fuzzy, c-format -#| msgid "role \"%s\" is not a member of role \"%s\"" +#: commands/user.c:1468 +#, c-format msgid "role \"%s\" cannot be a member of any role" -msgstr "Rolle »%s« ist kein Mitglied der Rolle »%s«" +msgstr "Rolle »%s« kann kein Mitglied einer Rolle sein" -#: commands/user.c:1573 +#: commands/user.c:1481 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "Rolle »%s« ist ein Mitglied der Rolle »%s«" -#: commands/user.c:1588 +#: commands/user.c:1496 #, c-format msgid "role \"%s\" is already a member of role \"%s\"" msgstr "Rolle »%s« ist schon Mitglied der Rolle »%s«" -#: commands/user.c:1695 +#: commands/user.c:1603 #, c-format msgid "role \"%s\" is not a member of role \"%s\"" msgstr "Rolle »%s« ist kein Mitglied der Rolle »%s«" -#: commands/vacuum.c:132 +#: commands/vacuum.c:139 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "unbekannte ANALYZE-Option »%s«" -#: commands/vacuum.c:156 +#: commands/vacuum.c:177 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "Option PARALLEL benötigt einen Wert zwischen 0 und %d" -#: commands/vacuum.c:168 -#, fuzzy, c-format -#| msgid "parallel vacuum degree must be between 0 and %d" +#: commands/vacuum.c:189 +#, c-format msgid "parallel workers for vacuum must be between 0 and %d" -msgstr "Grad für paralleles Vacuum muss zwischen 0 und %d sein" +msgstr "parallele Arbeitsprozesse für Vacuum müssen zwischen 0 und %d sein" -#: commands/vacuum.c:185 +#: commands/vacuum.c:206 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "unbekannte VACUUM-Option »%s«" -#: commands/vacuum.c:208 +#: commands/vacuum.c:229 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULL kann nicht parallel ausgeführt werden" -#: commands/vacuum.c:224 +#: commands/vacuum.c:245 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "Option ANALYZE muss angegeben werden, wenn eine Spaltenliste angegeben ist" -#: commands/vacuum.c:314 +#: commands/vacuum.c:335 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s kann nicht aus VACUUM oder ANALYZE ausgeführt werden" -#: commands/vacuum.c:324 +#: commands/vacuum.c:345 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "VACUUM-Option DISABLE_PAGE_SKIPPING kann nicht zusammen mit FULL verwendet werden" -#: commands/vacuum.c:331 +#: commands/vacuum.c:352 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" msgstr "PROCESS_TOAST benötigt VACUUM FULL" -#: commands/vacuum.c:572 +#: commands/vacuum.c:586 #, c-format msgid "skipping \"%s\" --- only superuser can vacuum it" msgstr "überspringe »%s« --- nur Superuser kann sie vacuumen" -#: commands/vacuum.c:576 +#: commands/vacuum.c:590 #, c-format msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" msgstr "überspringe »%s« --- nur Superuser oder Eigentümer der Datenbank kann sie vacuumen" -#: commands/vacuum.c:580 +#: commands/vacuum.c:594 #, c-format msgid "skipping \"%s\" --- only table or database owner can vacuum it" msgstr "überspringe »%s« --- nur Eigentümer der Tabelle oder der Datenbank kann sie vacuumen" -#: commands/vacuum.c:595 +#: commands/vacuum.c:609 #, c-format msgid "skipping \"%s\" --- only superuser can analyze it" msgstr "überspringe »%s« --- nur Superuser kann sie analysieren" -#: commands/vacuum.c:599 +#: commands/vacuum.c:613 #, c-format msgid "skipping \"%s\" --- only superuser or database owner can analyze it" msgstr "überspringe »%s« --- nur Superuser oder Eigentümer der Datenbank kann sie analysieren" -#: commands/vacuum.c:603 +#: commands/vacuum.c:617 #, c-format msgid "skipping \"%s\" --- only table or database owner can analyze it" msgstr "überspringe »%s« --- nur Eigentümer der Tabelle oder der Datenbank kann sie analysieren" -#: commands/vacuum.c:682 commands/vacuum.c:778 +#: commands/vacuum.c:696 commands/vacuum.c:792 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "überspringe Vacuum von »%s« --- Sperre nicht verfügbar" -#: commands/vacuum.c:687 +#: commands/vacuum.c:701 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "überspringe Vacuum von »%s« --- Relation existiert nicht mehr" -#: commands/vacuum.c:703 commands/vacuum.c:783 +#: commands/vacuum.c:717 commands/vacuum.c:797 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "überspringe Analyze von »%s« --- Sperre nicht verfügbar" -#: commands/vacuum.c:708 +#: commands/vacuum.c:722 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "überspringe Analyze von »%s« --- Relation existiert nicht mehr" -#: commands/vacuum.c:1026 +#: commands/vacuum.c:1041 #, c-format msgid "oldest xmin is far in the past" msgstr "älteste xmin ist weit in der Vergangenheit" -#: commands/vacuum.c:1027 +#: commands/vacuum.c:1042 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -11666,32 +12203,67 @@ msgstr "" "Schließen Sie bald alle offenen Transaktionen, um Überlaufprobleme zu vermeiden.\n" "Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen oder unbenutzte Replikations-Slots löschen." -#: commands/vacuum.c:1068 +#: commands/vacuum.c:1085 #, c-format msgid "oldest multixact is far in the past" msgstr "älteste Multixact ist weit in der Vergangenheit" -#: commands/vacuum.c:1069 +#: commands/vacuum.c:1086 #, c-format msgid "Close open transactions with multixacts soon to avoid wraparound problems." msgstr "Schließen Sie bald alle offenen Transaktionen mit Multixacts, um Überlaufprobleme zu vermeiden." -#: commands/vacuum.c:1726 +#: commands/vacuum.c:1798 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "einige Datenbanken sind seit über 2 Milliarden Transaktionen nicht gevacuumt worden" -#: commands/vacuum.c:1727 +#: commands/vacuum.c:1799 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "Sie haben möglicherweise bereits Daten wegen Transaktionsnummernüberlauf verloren." -#: commands/vacuum.c:1891 +#: commands/vacuum.c:1963 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "überspringe »%s« --- kann Nicht-Tabellen oder besondere Systemtabellen nicht vacuumen" -#: commands/variable.c:165 utils/misc/guc.c:11625 utils/misc/guc.c:11687 +#: commands/vacuum.c:2334 +#, c-format +msgid "scanned index \"%s\" to remove %d row versions" +msgstr "Index »%s« gelesen und %d Zeilenversionen entfernt" + +#: commands/vacuum.c:2353 +#, c-format +msgid "index \"%s\" now contains %.0f row versions in %u pages" +msgstr "Index »%s« enthält %.0f Zeilenversionen in %u Seiten" + +#: commands/vacuum.c:2357 +#, c-format +msgid "" +"%.0f index row versions were removed.\n" +"%u index pages were newly deleted.\n" +"%u index pages are currently deleted, of which %u are currently reusable." +msgstr "" +"%.0f Indexzeilenversionen wurde entfernt.\n" +"%u Indexseiten wurden neu gelöscht.\n" +"%u Indexseiten sind gegenwärtig gelöscht, wovon %u gegenwärtig wiederverwendbar sind." + +#: commands/vacuumparallel.c:663 +#, c-format +msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" +msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" +msgstr[0] "%d parallelen Vacuum-Worker für Index-Vacuum gestartet (geplant: %d)" +msgstr[1] "%d parallele Vacuum-Worker für Index-Vacuum gestartet (geplant: %d)" + +#: commands/vacuumparallel.c:669 +#, c-format +msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" +msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" +msgstr[0] "%d parallelen Vacuum-Worker für Index-Cleanup gestartet (geplant: %d)" +msgstr[1] "%d parallele Vacuum-Worker für Index-Cleanup gestartet (geplant: %d)" + +#: commands/variable.c:165 utils/misc/guc.c:11998 utils/misc/guc.c:12076 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "Unbekanntes Schlüsselwort: »%s«." @@ -11751,7 +12323,7 @@ msgstr "SET TRANSACTION ISOLATION LEVEL muss vor allen Anfragen aufgerufen werde msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" msgstr "SET TRANSACTION ISOLATION LEVEL kann nicht in einer Subtransaktion aufgerufen werden" -#: commands/variable.c:548 storage/lmgr/predicate.c:1693 +#: commands/variable.c:548 storage/lmgr/predicate.c:1694 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "kann serialisierbaren Modus nicht in einem Hot Standby verwenden" @@ -11816,32 +12388,38 @@ msgstr "kann Namen der Sichtspalte »%s« nicht in »%s« ändern" msgid "Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead." msgstr "Verwenden Sie stattdessen ALTER VIEW ... RENAME COLUMN ..., um den Namen einer Sichtspalte zu ändern." -#: commands/view.c:290 +#: commands/view.c:295 #, c-format msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "kann Datentyp der Sichtspalte »%s« nicht von %s in %s ändern" -#: commands/view.c:441 +#: commands/view.c:309 +#, fuzzy, c-format +#| msgid "cannot change data type of view column \"%s\" from %s to %s" +msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" +msgstr "kann Datentyp der Sichtspalte »%s« nicht von %s in %s ändern" + +#: commands/view.c:454 #, c-format msgid "views must not contain SELECT INTO" msgstr "Sichten dürfen kein SELECT INTO enthalten" -#: commands/view.c:453 +#: commands/view.c:466 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "Sichten dürfen keine datenmodifizierenden Anweisungen in WITH enthalten" -#: commands/view.c:523 +#: commands/view.c:536 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "CREATE VIEW gibt mehr Spaltennamen als Spalten an" -#: commands/view.c:531 +#: commands/view.c:544 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "Sichten können nicht ungeloggt sein, weil sie keinen Speicherplatz verwenden" -#: commands/view.c:545 +#: commands/view.c:558 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "Sicht »%s« wird eine temporäre Sicht" @@ -11877,37 +12455,37 @@ msgstr "Cursor »%s« ist nicht auf eine Zeile positioniert" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "Cursor »%s« ist kein einfach aktualisierbarer Scan der Tabelle »%s«" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2451 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2483 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "Typ von Parameter %d (%s) stimmt nicht mit dem überein, als der Plan vorbereitet worden ist (%s)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2463 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2495 #, c-format msgid "no value found for parameter %d" msgstr "kein Wert für Parameter %d gefunden" #: executor/execExpr.c:632 executor/execExpr.c:639 executor/execExpr.c:645 -#: executor/execExprInterp.c:4023 executor/execExprInterp.c:4040 -#: executor/execExprInterp.c:4141 executor/nodeModifyTable.c:117 -#: executor/nodeModifyTable.c:128 executor/nodeModifyTable.c:145 -#: executor/nodeModifyTable.c:153 +#: executor/execExprInterp.c:4149 executor/execExprInterp.c:4166 +#: executor/execExprInterp.c:4265 executor/nodeModifyTable.c:218 +#: executor/nodeModifyTable.c:229 executor/nodeModifyTable.c:246 +#: executor/nodeModifyTable.c:254 #, c-format msgid "table row type and query-specified row type do not match" msgstr "Zeilentyp der Tabelle und der von der Anfrage angegebene Zeilentyp stimmen nicht überein" -#: executor/execExpr.c:633 executor/nodeModifyTable.c:118 +#: executor/execExpr.c:633 executor/nodeModifyTable.c:219 #, c-format msgid "Query has too many columns." msgstr "Anfrage hat zu viele Spalten." -#: executor/execExpr.c:640 executor/nodeModifyTable.c:146 +#: executor/execExpr.c:640 executor/nodeModifyTable.c:247 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "Anfrage liefert einen Wert für eine gelöschte Spalte auf Position %d." -#: executor/execExpr.c:646 executor/execExprInterp.c:4041 -#: executor/nodeModifyTable.c:129 +#: executor/execExpr.c:646 executor/execExprInterp.c:4167 +#: executor/nodeModifyTable.c:230 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "Tabelle hat Typ %s auf Position %d, aber Anfrage erwartet %s." @@ -11917,116 +12495,130 @@ msgstr "Tabelle hat Typ %s auf Position %d, aber Anfrage erwartet %s." msgid "window function calls cannot be nested" msgstr "Aufrufe von Fensterfunktionen können nicht geschachtelt werden" -#: executor/execExpr.c:1615 +#: executor/execExpr.c:1631 #, c-format msgid "target type is not an array" msgstr "Zieltyp ist kein Array" -#: executor/execExpr.c:1955 +#: executor/execExpr.c:1971 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "ROW()-Spalte hat Typ %s statt Typ %s" -#: executor/execExpr.c:2480 executor/execSRF.c:718 parser/parse_func.c:136 -#: parser/parse_func.c:654 parser/parse_func.c:1030 +#: executor/execExpr.c:2744 executor/execSRF.c:718 parser/parse_func.c:138 +#: parser/parse_func.c:655 parser/parse_func.c:1031 #, c-format msgid "cannot pass more than %d argument to a function" msgid_plural "cannot pass more than %d arguments to a function" msgstr[0] "kann nicht mehr als %d Argument an eine Funktion übergeben" msgstr[1] "kann nicht mehr als %d Argumente an eine Funktion übergeben" -#: executor/execExpr.c:2866 parser/parse_node.c:277 parser/parse_node.c:327 -#, fuzzy, c-format -#| msgid "cannot subscript type %s because it is not an array" +#: executor/execExpr.c:2771 executor/execSRF.c:738 executor/functions.c:1058 +#: utils/adt/jsonfuncs.c:3736 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "Funktion mit Mengenergebnis in einem Zusammenhang aufgerufen, der keine Mengenergebnisse verarbeiten kann" + +#: executor/execExpr.c:3130 parser/parse_node.c:276 parser/parse_node.c:326 +#, c-format msgid "cannot subscript type %s because it does not support subscripting" -msgstr "kann aus Typ %s kein Element auswählen, weil er kein Array ist" +msgstr "kann aus Typ %s kein Element auswählen, weil er Subscripting nicht unterstützt" -#: executor/execExpr.c:2994 executor/execExpr.c:3016 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support subscriptions." +#: executor/execExpr.c:3258 executor/execExpr.c:3280 +#, c-format msgid "type %s does not support subscripted assignment" -msgstr "Der Server (Version %s) unterstützt keine Subskriptionen." +msgstr "Typ %s unterstützt Wertzuweisungen in Elemente nicht" -#: executor/execExprInterp.c:1916 +#: executor/execExprInterp.c:1948 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "Attribut %d von Typ %s wurde gelöscht" -#: executor/execExprInterp.c:1922 +#: executor/execExprInterp.c:1954 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "Attribut %d von Typ %s hat falschen Typ" -#: executor/execExprInterp.c:1924 executor/execExprInterp.c:3052 -#: executor/execExprInterp.c:3098 +#: executor/execExprInterp.c:1956 executor/execExprInterp.c:3084 +#: executor/execExprInterp.c:3130 #, c-format msgid "Table has type %s, but query expects %s." msgstr "Tabelle hat Typ %s, aber Anfrage erwartet %s." -#: executor/execExprInterp.c:2003 utils/adt/expandedrecord.c:99 -#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1748 -#: utils/cache/typcache.c:1904 utils/cache/typcache.c:2033 -#: utils/fmgr/funcapi.c:458 +#: executor/execExprInterp.c:2035 utils/adt/expandedrecord.c:99 +#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1749 +#: utils/cache/typcache.c:1908 utils/cache/typcache.c:2055 +#: utils/fmgr/funcapi.c:527 #, c-format msgid "type %s is not composite" msgstr "Typ %s ist kein zusammengesetzter Typ" -#: executor/execExprInterp.c:2541 +#: executor/execExprInterp.c:2573 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF wird für diesen Tabellentyp nicht unterstützt" -#: executor/execExprInterp.c:2754 +#: executor/execExprInterp.c:2786 #, c-format msgid "cannot merge incompatible arrays" msgstr "kann inkompatible Arrays nicht verschmelzen" -#: executor/execExprInterp.c:2755 +#: executor/execExprInterp.c:2787 #, c-format msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." msgstr "Arrayelement mit Typ %s kann nicht in ARRAY-Konstrukt mit Elementtyp %s verwendet werden." -#: executor/execExprInterp.c:2776 utils/adt/arrayfuncs.c:262 -#: utils/adt/arrayfuncs.c:562 utils/adt/arrayfuncs.c:1304 -#: utils/adt/arrayfuncs.c:3374 utils/adt/arrayfuncs.c:5336 -#: utils/adt/arrayfuncs.c:5853 utils/adt/arraysubs.c:150 +#: executor/execExprInterp.c:2808 utils/adt/arrayfuncs.c:263 +#: utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 +#: utils/adt/arrayfuncs.c:3375 utils/adt/arrayfuncs.c:5372 +#: utils/adt/arrayfuncs.c:5889 utils/adt/arraysubs.c:150 #: utils/adt/arraysubs.c:488 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "Anzahl der Arraydimensionen (%d) überschreitet erlaubtes Maximum (%d)" -#: executor/execExprInterp.c:2796 executor/execExprInterp.c:2826 +#: executor/execExprInterp.c:2828 executor/execExprInterp.c:2858 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "mehrdimensionale Arrays müssen Arraysausdrücke mit gleicher Anzahl Dimensionen haben" -#: executor/execExprInterp.c:3051 executor/execExprInterp.c:3097 +#: executor/execExprInterp.c:3083 executor/execExprInterp.c:3129 #, c-format msgid "attribute %d has wrong type" msgstr "Attribut %d hat falschen Typ" -#: executor/execExprInterp.c:3652 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3697 utils/adt/domains.c:149 #, c-format msgid "domain %s does not allow null values" msgstr "Domäne %s erlaubt keine NULL-Werte" -#: executor/execExprInterp.c:3667 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3712 utils/adt/domains.c:184 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "Wert für Domäne %s verletzt Check-Constraint »%s«" -#: executor/execExprInterp.c:4024 +#: executor/execExprInterp.c:4150 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." msgstr[0] "Tabellenzeile enthält %d Attribut, aber Anfrage erwartet %d." msgstr[1] "Tabellenzeile enthält %d Attribute, aber Anfrage erwartet %d." -#: executor/execExprInterp.c:4142 executor/execSRF.c:977 +#: executor/execExprInterp.c:4266 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "Physischer Speicher stimmt nicht überein mit gelöschtem Attribut auf Position %d." +#: executor/execExprInterp.c:4965 +#, c-format +msgid "SQL/JSON item cannot be cast to target type" +msgstr "" + +#: executor/execExprInterp.c:5019 +#, c-format +msgid "no SQL/JSON item" +msgstr "" + #: executor/execIndexing.c:571 #, c-format msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" @@ -12062,175 +12654,187 @@ msgstr "Schlüssel %s kollidiert mit vorhandenem Schlüssel %s." msgid "Key conflicts with existing key." msgstr "Der Schlüssel kollidiert mit einem vorhandenen Schlüssel." -#: executor/execMain.c:1007 +#: executor/execMain.c:1009 #, c-format msgid "cannot change sequence \"%s\"" msgstr "kann Sequenz »%s« nicht ändern" -#: executor/execMain.c:1013 +#: executor/execMain.c:1015 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "kann TOAST-Relation »%s« nicht ändern" -#: executor/execMain.c:1031 rewrite/rewriteHandler.c:3041 -#: rewrite/rewriteHandler.c:3824 +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3068 +#: rewrite/rewriteHandler.c:3904 #, c-format msgid "cannot insert into view \"%s\"" msgstr "kann nicht in Sicht »%s« einfügen" -#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3044 -#: rewrite/rewriteHandler.c:3827 +#: executor/execMain.c:1035 rewrite/rewriteHandler.c:3071 +#: rewrite/rewriteHandler.c:3907 #, c-format msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." msgstr "Um Einfügen in die Sicht zu ermöglichen, richten Sie einen INSTEAD OF INSERT Trigger oder eine ON INSERT DO INSTEAD Regel ohne Bedingung ein." -#: executor/execMain.c:1039 rewrite/rewriteHandler.c:3049 -#: rewrite/rewriteHandler.c:3832 +#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3076 +#: rewrite/rewriteHandler.c:3912 #, c-format msgid "cannot update view \"%s\"" msgstr "kann Sicht »%s« nicht aktualisieren" -#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3052 -#: rewrite/rewriteHandler.c:3835 +#: executor/execMain.c:1043 rewrite/rewriteHandler.c:3079 +#: rewrite/rewriteHandler.c:3915 #, c-format msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." msgstr "Um Aktualisieren der Sicht zu ermöglichen, richten Sie einen INSTEAD OF UPDATE Trigger oder eine ON UPDATE DO INSTEAD Regel ohne Bedingung ein." -#: executor/execMain.c:1047 rewrite/rewriteHandler.c:3057 -#: rewrite/rewriteHandler.c:3840 +#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3084 +#: rewrite/rewriteHandler.c:3920 #, c-format msgid "cannot delete from view \"%s\"" msgstr "kann nicht aus Sicht »%s« löschen" -#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3060 -#: rewrite/rewriteHandler.c:3843 +#: executor/execMain.c:1051 rewrite/rewriteHandler.c:3087 +#: rewrite/rewriteHandler.c:3923 #, c-format msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." msgstr "Um Löschen aus der Sicht zu ermöglichen, richten Sie einen INSTEAD OF DELETE Trigger oder eine ON DELETE DO INSTEAD Regel ohne Bedingung ein." -#: executor/execMain.c:1060 +#: executor/execMain.c:1062 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "kann materialisierte Sicht »%s« nicht ändern" -#: executor/execMain.c:1072 +#: executor/execMain.c:1074 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "kann nicht in Fremdtabelle »%s« einfügen" -#: executor/execMain.c:1078 +#: executor/execMain.c:1080 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "Fremdtabelle »%s« erlaubt kein Einfügen" -#: executor/execMain.c:1085 +#: executor/execMain.c:1087 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "kann Fremdtabelle »%s« nicht aktualisieren" -#: executor/execMain.c:1091 +#: executor/execMain.c:1093 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "Fremdtabelle »%s« erlaubt kein Aktualisieren" -#: executor/execMain.c:1098 +#: executor/execMain.c:1100 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "kann nicht aus Fremdtabelle »%s« löschen" -#: executor/execMain.c:1104 +#: executor/execMain.c:1106 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "Fremdtabelle »%s« erlaubt kein Löschen" -#: executor/execMain.c:1115 +#: executor/execMain.c:1117 #, c-format msgid "cannot change relation \"%s\"" msgstr "kann Relation »%s« nicht ändern" -#: executor/execMain.c:1142 +#: executor/execMain.c:1144 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "kann Zeilen in Sequenz »%s« nicht sperren" -#: executor/execMain.c:1149 +#: executor/execMain.c:1151 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "kann Zeilen in TOAST-Relation »%s« nicht sperren" -#: executor/execMain.c:1156 +#: executor/execMain.c:1158 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "kann Zeilen in Sicht »%s« nicht sperren" -#: executor/execMain.c:1164 +#: executor/execMain.c:1166 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "kann Zeilen in materialisierter Sicht »%s« nicht sperren" -#: executor/execMain.c:1173 executor/execMain.c:2555 -#: executor/nodeLockRows.c:132 +#: executor/execMain.c:1175 executor/execMain.c:2653 +#: executor/nodeLockRows.c:136 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "kann Zeilen in Fremdtabelle »%s« nicht sperren" -#: executor/execMain.c:1179 +#: executor/execMain.c:1181 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "kann Zeilen in Relation »%s« nicht sperren" -#: executor/execMain.c:1803 +#: executor/execMain.c:1888 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "neue Zeile für Relation »%s« verletzt Partitions-Constraint" -#: executor/execMain.c:1805 executor/execMain.c:1888 executor/execMain.c:1938 -#: executor/execMain.c:2047 +#: executor/execMain.c:1890 executor/execMain.c:1973 executor/execMain.c:2023 +#: executor/execMain.c:2132 #, c-format msgid "Failing row contains %s." msgstr "Fehlgeschlagene Zeile enthält %s." -#: executor/execMain.c:1885 +#: executor/execMain.c:1970 #, c-format msgid "null value in column \"%s\" of relation \"%s\" violates not-null constraint" msgstr "NULL-Wert in Spalte »%s« von Relation »%s« verletzt Not-Null-Constraint" -#: executor/execMain.c:1936 +#: executor/execMain.c:2021 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "neue Zeile für Relation »%s« verletzt Check-Constraint »%s«" -#: executor/execMain.c:2045 +#: executor/execMain.c:2130 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "neue Zeile verletzt Check-Option für Sicht »%s«" -#: executor/execMain.c:2055 +#: executor/execMain.c:2140 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "neue Zeile verletzt Policy für Sicherheit auf Zeilenebene »%s« für Tabelle »%s«" -#: executor/execMain.c:2060 +#: executor/execMain.c:2145 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "neue Zeile verletzt Policy für Sicherheit auf Zeilenebene für Tabelle »%s«" -#: executor/execMain.c:2067 +#: executor/execMain.c:2153 +#, fuzzy, c-format +#| msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" +msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" +msgstr "neue Zeile verletzt Policy für Sicherheit auf Zeilenebene »%s« (USING-Ausdruck) für Tabelle »%s«" + +#: executor/execMain.c:2158 +#, fuzzy, c-format +#| msgid "new row violates row-level security policy (USING expression) for table \"%s\"" +msgid "target row violates row-level security policy (USING expression) for table \"%s\"" +msgstr "neue Zeile verletzt Policy für Sicherheit auf Zeilenebene (USING-Ausdruck) für Tabelle »%s«" + +#: executor/execMain.c:2165 #, c-format msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "neue Zeile verletzt Policy für Sicherheit auf Zeilenebene »%s« (USING-Ausdruck) für Tabelle »%s«" -#: executor/execMain.c:2072 +#: executor/execMain.c:2170 #, c-format msgid "new row violates row-level security policy (USING expression) for table \"%s\"" msgstr "neue Zeile verletzt Policy für Sicherheit auf Zeilenebene (USING-Ausdruck) für Tabelle »%s«" -#: executor/execPartition.c:322 +#: executor/execPartition.c:330 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "keine Partition von Relation »%s« für die Zeile gefunden" -#: executor/execPartition.c:325 +#: executor/execPartition.c:333 #, c-format msgid "Partition key of the failing row contains %s." msgstr "Partitionierungsschlüssel der fehlgeschlagenen Zeile enthält %s." @@ -12252,48 +12856,58 @@ msgstr "gleichzeitiges Löschen, versuche erneut" #: executor/execReplication.c:269 parser/parse_cte.c:502 #: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:720 -#: utils/adt/array_userfuncs.c:859 utils/adt/arrayfuncs.c:3654 -#: utils/adt/arrayfuncs.c:4174 utils/adt/arrayfuncs.c:6166 +#: utils/adt/array_userfuncs.c:859 utils/adt/arrayfuncs.c:3655 +#: utils/adt/arrayfuncs.c:4210 utils/adt/arrayfuncs.c:6202 #: utils/adt/rowtypes.c:1203 #, c-format msgid "could not identify an equality operator for type %s" msgstr "konnte keinen Ist-Gleich-Operator für Typ %s ermitteln" -#: executor/execReplication.c:590 +#: executor/execReplication.c:592 executor/execReplication.c:598 +#, c-format +msgid "cannot update table \"%s\"" +msgstr "kann Tabelle »%s« nicht aktualisieren" + +#: executor/execReplication.c:594 executor/execReplication.c:606 +#, c-format +msgid "Column used in the publication WHERE expression is not part of the replica identity." +msgstr "" + +#: executor/execReplication.c:600 executor/execReplication.c:612 +#, c-format +msgid "Column list used by the publication does not cover the replica identity." +msgstr "" + +#: executor/execReplication.c:604 executor/execReplication.c:610 +#, c-format +msgid "cannot delete from table \"%s\"" +msgstr "kann nicht aus Tabelle »%s« löschen" + +#: executor/execReplication.c:630 #, c-format msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" msgstr "Tabelle »%s« kann nicht aktualisiert werden, weil sie keine Replik-Identität hat und Updates publiziert" -#: executor/execReplication.c:592 +#: executor/execReplication.c:632 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Um Aktualisieren der Tabelle zu ermöglichen, setzen Sie REPLICA IDENTITY mit ALTER TABLE." -#: executor/execReplication.c:596 +#: executor/execReplication.c:636 #, c-format msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" msgstr "aus Tabelle »%s« kann nicht gelöscht werden, weil sie keine Replik-Identität hat und Deletes publiziert" -#: executor/execReplication.c:598 +#: executor/execReplication.c:638 #, c-format msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Um Löschen in der Tabelle zu ermöglichen, setzen Sie REPLICA IDENTITY mit ALTER TABLE." -#: executor/execReplication.c:617 executor/execReplication.c:625 +#: executor/execReplication.c:654 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "Relation »%s.%s« kann nicht als Ziel für logische Replikation verwendet werden" -#: executor/execReplication.c:619 -#, c-format -msgid "\"%s.%s\" is a foreign table." -msgstr "»%s.%s« ist eine Fremdtabelle." - -#: executor/execReplication.c:627 -#, c-format -msgid "\"%s.%s\" is not a table." -msgstr "»%s.%s« ist keine Tabelle." - #: executor/execSRF.c:315 #, c-format msgid "rows returned by function are not all of the same row type" @@ -12357,19 +12971,19 @@ msgstr "Verwenden Sie den Befehl REFRESH MATERIALIZED VIEW." msgid "could not determine actual type of argument declared %s" msgstr "konnte tatsächlichen Typ von Argument mit deklarierten Typ %s nicht bestimmen" -#: executor/functions.c:515 +#: executor/functions.c:514 #, c-format -msgid "cannot COPY to/from client in a SQL function" +msgid "cannot COPY to/from client in an SQL function" msgstr "COPY vom/zum Client funktioniert in einer SQL-Funktion nicht" #. translator: %s is a SQL statement name -#: executor/functions.c:521 +#: executor/functions.c:520 #, c-format -msgid "%s is not allowed in a SQL function" +msgid "%s is not allowed in an SQL function" msgstr "%s ist in SQL-Funktionen nicht erlaubt" #. translator: %s is a SQL statement name -#: executor/functions.c:529 executor/spi.c:1633 executor/spi.c:2485 +#: executor/functions.c:528 executor/spi.c:1742 executor/spi.c:2631 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "%s ist in als nicht »volatile« markierten Funktionen nicht erlaubt" @@ -12384,68 +12998,68 @@ msgstr "SQL-Funktion »%s« Anweisung %d" msgid "SQL function \"%s\" during startup" msgstr "SQL-Funktion »%s« beim Start" -#: executor/functions.c:1571 +#: executor/functions.c:1553 #, c-format msgid "calling procedures with output arguments is not supported in SQL functions" msgstr "Aufruf von Prozeduren mit Ausgabeargumenten wird in SQL-Funktionen nicht unterstützt" -#: executor/functions.c:1705 executor/functions.c:1743 -#: executor/functions.c:1757 executor/functions.c:1847 -#: executor/functions.c:1880 executor/functions.c:1894 +#: executor/functions.c:1686 executor/functions.c:1724 +#: executor/functions.c:1738 executor/functions.c:1828 +#: executor/functions.c:1861 executor/functions.c:1875 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "Rückgabetyp von Funktion stimmt nicht überein; deklariert als %s" -#: executor/functions.c:1707 +#: executor/functions.c:1688 #, c-format msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." msgstr "Die letzte Anweisung der Funktion muss ein SELECT oder INSERT/UPDATE/DELETE RETURNING sein." -#: executor/functions.c:1745 +#: executor/functions.c:1726 #, c-format msgid "Final statement must return exactly one column." msgstr "Die letzte Anweisung muss genau eine Spalte zurückgeben." -#: executor/functions.c:1759 +#: executor/functions.c:1740 #, c-format msgid "Actual return type is %s." msgstr "Eigentlicher Rückgabetyp ist %s." -#: executor/functions.c:1849 +#: executor/functions.c:1830 #, c-format msgid "Final statement returns too many columns." msgstr "Die letzte Anweisung gibt zu viele Spalten zurück." -#: executor/functions.c:1882 +#: executor/functions.c:1863 #, c-format msgid "Final statement returns %s instead of %s at column %d." msgstr "Die letzte Anweisung ergibt %s statt %s in Spalte %d." -#: executor/functions.c:1896 +#: executor/functions.c:1877 #, c-format msgid "Final statement returns too few columns." msgstr "Die letzte Anweisung gibt zu wenige Spalten zurück." -#: executor/functions.c:1924 +#: executor/functions.c:1905 #, c-format msgid "return type %s is not supported for SQL functions" msgstr "Rückgabetyp %s wird von SQL-Funktionen nicht unterstützt" -#: executor/nodeAgg.c:3083 executor/nodeAgg.c:3092 executor/nodeAgg.c:3104 -#, c-format -msgid "unexpected EOF for tape %d: requested %zu bytes, read %zu bytes" -msgstr "unerwartetes EOF für Tape %d: %zu Bytes angefordert, %zu Bytes gelesen" - -#: executor/nodeAgg.c:3977 parser/parse_agg.c:666 parser/parse_agg.c:696 +#: executor/nodeAgg.c:3006 executor/nodeAgg.c:3015 executor/nodeAgg.c:3027 #, c-format -msgid "aggregate function calls cannot be nested" -msgstr "Aufrufe von Aggregatfunktionen können nicht geschachtelt werden" +msgid "unexpected EOF for tape %p: requested %zu bytes, read %zu bytes" +msgstr "unerwartetes EOF für Tape %p: %zu Bytes angefordert, %zu Bytes gelesen" -#: executor/nodeAgg.c:4185 executor/nodeWindowAgg.c:2836 +#: executor/nodeAgg.c:3917 executor/nodeWindowAgg.c:2962 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "Aggregatfunktion %u muss kompatiblen Eingabe- und Übergangstyp haben" +#: executor/nodeAgg.c:3947 parser/parse_agg.c:668 parser/parse_agg.c:696 +#, c-format +msgid "aggregate function calls cannot be nested" +msgstr "Aufrufe von Aggregatfunktionen können nicht geschachtelt werden" + #: executor/nodeCustom.c:145 executor/nodeCustom.c:156 #, c-format msgid "custom scan \"%s\" does not support MarkPos" @@ -12461,7 +13075,7 @@ msgstr "konnte Position in temporärer Datei für Hash-Verbund nicht auf Anfang msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" msgstr "konnte nicht aus temporärer Datei für Hash-Verbund lesen: es wurden nur %zu von %zu Bytes gelesen" -#: executor/nodeIndexonlyscan.c:242 +#: executor/nodeIndexonlyscan.c:240 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "verlustbehaftete Abstandsfunktionen werden in Index-Only-Scans nicht unterstützt" @@ -12486,42 +13100,76 @@ msgstr "RIGHT JOIN wird nur für Merge-Verbund-fähige Verbundbedingungen unters msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOIN wird nur für Merge-Verbund-fähige Verbundbedingungen unterstützt" -#: executor/nodeModifyTable.c:154 +#: executor/nodeModifyTable.c:255 #, c-format msgid "Query has too few columns." msgstr "Anfrage hat zu wenige Spalten." -#: executor/nodeModifyTable.c:1192 executor/nodeModifyTable.c:1266 +#: executor/nodeModifyTable.c:1409 executor/nodeModifyTable.c:1483 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "das zu löschende Tupel wurde schon durch eine vom aktuellen Befehl ausgelöste Operation verändert" -#: executor/nodeModifyTable.c:1441 +#: executor/nodeModifyTable.c:1640 #, c-format msgid "invalid ON UPDATE specification" msgstr "ungültige ON-UPDATE-Angabe" -#: executor/nodeModifyTable.c:1442 +#: executor/nodeModifyTable.c:1641 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "Das Ergebnistupel würde in einer anderen Partition erscheinen als das ursprüngliche Tupel." -#: executor/nodeModifyTable.c:2038 +#: executor/nodeModifyTable.c:2082 +#, c-format +msgid "cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key" +msgstr "" + +#: executor/nodeModifyTable.c:2083 #, c-format -msgid "ON CONFLICT DO UPDATE command cannot affect row a second time" +msgid "A foreign key points to ancestor \"%s\", but not the root ancestor \"%s\"." +msgstr "" + +#: executor/nodeModifyTable.c:2086 +#, fuzzy, c-format +#| msgid "cannot insert into foreign table \"%s\"" +msgid "Consider defining the foreign key on \"%s\"." +msgstr "kann nicht in Fremdtabelle »%s« einfügen" + +#. translator: %s is a SQL command name +#: executor/nodeModifyTable.c:2430 executor/nodeModifyTable.c:2821 +#, fuzzy, c-format +#| msgid "ON CONFLICT DO UPDATE command cannot affect row a second time" +msgid "%s command cannot affect row a second time" msgstr "Befehl in ON CONFLICT DO UPDATE kann eine Zeile nicht ein zweites Mal ändern" -#: executor/nodeModifyTable.c:2039 +#: executor/nodeModifyTable.c:2432 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "Stellen Sie sicher, dass keine im selben Befehl fürs Einfügen vorgesehene Zeilen doppelte Werte haben, die einen Constraint verletzen würden." -#: executor/nodeSamplescan.c:259 +#: executor/nodeModifyTable.c:2823 +#, c-format +msgid "Ensure that not more than one source row matches any one target row." +msgstr "" + +#: executor/nodeModifyTable.c:2926 +#, c-format +msgid "tuple to be deleted was already moved to another partition due to concurrent update" +msgstr "das zu löschende Tupel wurde schon durch ein gleichzeitiges Update in eine andere Partition verschoben" + +#: executor/nodeModifyTable.c:2965 +#, fuzzy, c-format +#| msgid "tuple to be updated was already modified by an operation triggered by the current command" +msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" +msgstr "das zu aktualisierende Tupel wurde schon durch eine vom aktuellen Befehl ausgelöste Operation verändert" + +#: executor/nodeSamplescan.c:260 #, c-format msgid "TABLESAMPLE parameter cannot be null" msgstr "Parameter von TABLESAMPLE darf nicht NULL sein" -#: executor/nodeSamplescan.c:271 +#: executor/nodeSamplescan.c:272 #, c-format msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "Parameter von TABLESAMPLE REPEATABLE darf nicht NULL sein" @@ -12532,27 +13180,27 @@ msgstr "Parameter von TABLESAMPLE REPEATABLE darf nicht NULL sein" msgid "more than one row returned by a subquery used as an expression" msgstr "als Ausdruck verwendete Unteranfrage ergab mehr als eine Zeile" -#: executor/nodeTableFuncscan.c:375 +#: executor/nodeTableFuncscan.c:377 #, c-format msgid "namespace URI must not be null" msgstr "Namensraum-URI darf nicht NULL sein" -#: executor/nodeTableFuncscan.c:389 +#: executor/nodeTableFuncscan.c:393 #, c-format msgid "row filter expression must not be null" msgstr "Zeilenfilterausdruck darf nicht NULL sein" -#: executor/nodeTableFuncscan.c:415 +#: executor/nodeTableFuncscan.c:420 #, c-format msgid "column filter expression must not be null" msgstr "Spaltenfilterausdruck darf nicht NULL sein" -#: executor/nodeTableFuncscan.c:416 +#: executor/nodeTableFuncscan.c:421 #, c-format msgid "Filter for column \"%s\" is null." msgstr "Filter für Spalte »%s« ist NULL." -#: executor/nodeTableFuncscan.c:506 +#: executor/nodeTableFuncscan.c:511 #, c-format msgid "null is not allowed in column \"%s\"" msgstr "NULL ist in Spalte »%s« nicht erlaubt" @@ -12562,93 +13210,104 @@ msgstr "NULL ist in Spalte »%s« nicht erlaubt" msgid "moving-aggregate transition function must not return null" msgstr "Moving-Aggregat-Übergangsfunktion darf nicht NULL zurückgeben" -#: executor/nodeWindowAgg.c:2058 +#: executor/nodeWindowAgg.c:2080 #, c-format msgid "frame starting offset must not be null" msgstr "Frame-Start-Offset darf nicht NULL sein" -#: executor/nodeWindowAgg.c:2071 +#: executor/nodeWindowAgg.c:2093 #, c-format msgid "frame starting offset must not be negative" msgstr "Frame-Start-Offset darf nicht negativ sein" -#: executor/nodeWindowAgg.c:2083 +#: executor/nodeWindowAgg.c:2105 #, c-format msgid "frame ending offset must not be null" msgstr "Frame-Ende-Offset darf nicht NULL sein" -#: executor/nodeWindowAgg.c:2096 +#: executor/nodeWindowAgg.c:2118 #, c-format msgid "frame ending offset must not be negative" msgstr "Frame-Ende-Offset darf nicht negativ sein" -#: executor/nodeWindowAgg.c:2752 +#: executor/nodeWindowAgg.c:2878 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "Aggregatfunktion %s unterstützt die Verwendung als Fensterfunktion nicht" -#: executor/spi.c:237 executor/spi.c:302 +#: executor/spi.c:242 executor/spi.c:342 #, c-format msgid "invalid transaction termination" msgstr "ungültige Transaktionsbeendung" -#: executor/spi.c:251 +#: executor/spi.c:257 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "während eine Subtransaktion aktiv ist kann nicht committet werden" -#: executor/spi.c:308 +#: executor/spi.c:348 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "während eine Subtransaktion aktiv ist kann nicht zurückgerollt werden" -#: executor/spi.c:380 +#: executor/spi.c:472 #, c-format msgid "transaction left non-empty SPI stack" msgstr "Transaktion ließ nicht-leeren SPI-Stack zurück" -#: executor/spi.c:381 executor/spi.c:443 +#: executor/spi.c:473 executor/spi.c:533 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "Prüfen Sie, ob Aufrufe von »SPI_finish« fehlen." -#: executor/spi.c:442 +#: executor/spi.c:532 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "Subtransaktion ließ nicht-leeren SPI-Stack zurück" -#: executor/spi.c:1495 +#: executor/spi.c:1600 #, c-format msgid "cannot open multi-query plan as cursor" msgstr "Plan mit mehreren Anfragen kann nicht als Cursor geöffnet werden" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:1500 +#: executor/spi.c:1610 #, c-format msgid "cannot open %s query as cursor" msgstr "%s kann nicht als Cursor geöffnet werden" -#: executor/spi.c:1607 +#: executor/spi.c:1716 #, c-format msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE wird nicht unterstützt" -#: executor/spi.c:1608 parser/analyze.c:2806 +#: executor/spi.c:1717 parser/analyze.c:2861 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Scrollbare Cursor müssen READ ONLY sein." -#: executor/spi.c:2808 +#: executor/spi.c:2470 +#, c-format +msgid "empty query does not return tuples" +msgstr "leere Anfrage gibt keine Tupel zurück" + +#. translator: %s is name of a SQL command, eg INSERT +#: executor/spi.c:2544 +#, c-format +msgid "%s query does not return tuples" +msgstr "%s-Anfrage gibt keine Tupel zurück" + +#: executor/spi.c:2959 #, c-format msgid "SQL expression \"%s\"" msgstr "SQL-Ausdruck »%s«" -#: executor/spi.c:2813 +#: executor/spi.c:2964 #, c-format msgid "PL/pgSQL assignment \"%s\"" msgstr "PL/pgSQL-Zuweisung »%s«" -#: executor/spi.c:2816 +#: executor/spi.c:2967 #, c-format msgid "SQL statement \"%s\"" msgstr "SQL-Anweisung »%s«" @@ -12658,1299 +13317,1347 @@ msgstr "SQL-Anweisung »%s«" msgid "could not send tuple to shared-memory queue" msgstr "konnte Tupel nicht an Shared-Memory-Queue senden" -#: foreign/foreign.c:220 +#: foreign/foreign.c:221 #, c-format msgid "user mapping not found for \"%s\"" msgstr "Benutzerabbildung für »%s« nicht gefunden" -#: foreign/foreign.c:672 +#: foreign/foreign.c:638 #, c-format msgid "invalid option \"%s\"" msgstr "ungültige Option »%s«" -#: foreign/foreign.c:673 +#: foreign/foreign.c:640 #, c-format msgid "Valid options in this context are: %s" msgstr "Gültige Optionen in diesem Zusammenhang sind: %s" -#: gram.y:1107 +#: foreign/foreign.c:642 +#, fuzzy, c-format +#| msgid "Valid options in this context are: %s" +msgid "There are no valid options in this context." +msgstr "Gültige Optionen in diesem Zusammenhang sind: %s" + +#: gram.y:1260 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD wird nicht mehr unterstützt" -#: gram.y:1108 +#: gram.y:1261 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "Lassen Sie UNENCRYPTED weg, um das Passwort stattdessen in verschlüsselter Form zu speichern." -#: gram.y:1170 +#: gram.y:1323 #, c-format msgid "unrecognized role option \"%s\"" msgstr "unbekannte Rollenoption »%s«" -#: gram.y:1417 gram.y:1432 +#: gram.y:1588 gram.y:1604 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTS kann keine Schemaelemente enthalten" -#: gram.y:1578 +#: gram.y:1761 #, c-format msgid "current database cannot be changed" msgstr "aktuelle Datenbank kann nicht geändert werden" -#: gram.y:1702 +#: gram.y:1894 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "Zeitzonenintervall muss HOUR oder HOUR TO MINUTE sein" -#: gram.y:2270 +#: gram.y:2511 #, c-format msgid "column number must be in range from 1 to %d" msgstr "Spaltennummer muss im Bereich 1 bis %d sein" -#: gram.y:2811 +#: gram.y:3113 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "Sequenzoption »%s« wird hier nicht unterstützt" -#: gram.y:2840 +#: gram.y:3142 #, c-format msgid "modulus for hash partition provided more than once" msgstr "Modulus für Hashpartition mehrmals angegeben" -#: gram.y:2849 +#: gram.y:3151 #, c-format msgid "remainder for hash partition provided more than once" msgstr "Rest für Hashpartition mehrmals angegeben" -#: gram.y:2856 +#: gram.y:3158 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "unbekannte Hashpartitionsbegrenzungsangabe »%s«" -#: gram.y:2864 +#: gram.y:3166 #, c-format msgid "modulus for hash partition must be specified" msgstr "Modulus für Hashpartition muss angegeben werden" -#: gram.y:2868 +#: gram.y:3170 #, c-format msgid "remainder for hash partition must be specified" msgstr "Rest für Hashpartition muss angegeben werden" -#: gram.y:3069 gram.y:3102 +#: gram.y:3378 gram.y:3412 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "STDIN/STDOUT sind nicht mit PROGRAM erlaubt" -#: gram.y:3075 +#: gram.y:3384 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "mit COPY TO ist keine WHERE-Klausel erlaubt" -#: gram.y:3407 gram.y:3414 gram.y:11689 gram.y:11697 +#: gram.y:3723 gram.y:3730 gram.y:12873 gram.y:12881 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "die Verwendung von GLOBAL beim Erzeugen einer temporären Tabelle ist veraltet" -#: gram.y:3665 +#: gram.y:3995 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "für eine generierte Spalte muss GENERATED ALWAYS angegeben werden" -#: gram.y:3933 utils/adt/ri_triggers.c:2032 +#: gram.y:4286 utils/adt/ri_triggers.c:2098 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "MATCH PARTIAL ist noch nicht implementiert" -#: gram.y:4634 +#: gram.y:4378 +#, fuzzy, c-format +#| msgid "return type %s is not supported for SQL functions" +msgid "a column list with %s is only supported for ON DELETE actions" +msgstr "Rückgabetyp %s wird von SQL-Funktionen nicht unterstützt" + +#: gram.y:5088 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM wird nicht mehr unterstützt" -#: gram.y:5297 +#: gram.y:5786 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "unbekannte Zeilensicherheitsoption »%s«" -#: gram.y:5298 +#: gram.y:5787 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "Aktuell werden nur PERMISSIVE und RESTRICTIVE unterstützt." -#: gram.y:5380 +#: gram.y:5872 #, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER wird nicht unterstützt" -#: gram.y:5417 +#: gram.y:5909 msgid "duplicate trigger events specified" msgstr "mehrere Trigger-Ereignisse angegeben" -#: gram.y:5558 parser/parse_utilcmd.c:3734 parser/parse_utilcmd.c:3760 +#: gram.y:6051 parser/parse_utilcmd.c:3706 parser/parse_utilcmd.c:3732 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "Constraint, der als INITIALLY DEFERRED deklariert wurde, muss DEFERRABLE sein" -#: gram.y:5565 +#: gram.y:6058 #, c-format msgid "conflicting constraint properties" msgstr "widersprüchliche Constraint-Eigentschaften" -#: gram.y:5661 +#: gram.y:6157 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTION ist noch nicht implementiert" -#: gram.y:6044 +#: gram.y:6565 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK wird nicht mehr benötigt" -#: gram.y:6045 +#: gram.y:6566 #, c-format msgid "Update your data type." msgstr "Aktualisieren Sie Ihren Datentyp." -#: gram.y:7770 +#: gram.y:8422 #, c-format msgid "aggregates cannot have output arguments" msgstr "Aggregatfunktionen können keine OUT-Argumente haben" -#: gram.y:8212 utils/adt/regproc.c:709 utils/adt/regproc.c:750 +#: gram.y:8885 utils/adt/regproc.c:710 utils/adt/regproc.c:751 #, c-format msgid "missing argument" msgstr "Argument fehlt" -#: gram.y:8213 utils/adt/regproc.c:710 utils/adt/regproc.c:751 +#: gram.y:8886 utils/adt/regproc.c:711 utils/adt/regproc.c:752 #, c-format msgid "Use NONE to denote the missing argument of a unary operator." msgstr "Verwenden Sie NONE, um das fehlende Argument eines unären Operators anzugeben." -#: gram.y:10152 gram.y:10170 +#: gram.y:11107 gram.y:11126 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTION wird für rekursive Sichten nicht unterstützt" -#: gram.y:11826 +#: gram.y:13012 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "Syntax LIMIT x,y wird nicht unterstützt" -#: gram.y:11827 +#: gram.y:13013 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "Verwenden Sie die getrennten Klauseln LIMIT und OFFSET." -#: gram.y:12165 gram.y:12190 +#: gram.y:13366 gram.y:13392 #, c-format msgid "VALUES in FROM must have an alias" msgstr "VALUES in FROM muss Aliasnamen erhalten" -#: gram.y:12166 gram.y:12191 +#: gram.y:13367 gram.y:13393 #, c-format msgid "For example, FROM (VALUES ...) [AS] foo." msgstr "Zum Beispiel FROM (VALUES ...) [AS] xyz." -#: gram.y:12171 gram.y:12196 +#: gram.y:13372 gram.y:13398 #, c-format msgid "subquery in FROM must have an alias" msgstr "Unteranfrage in FROM muss Aliasnamen erhalten" -#: gram.y:12172 gram.y:12197 +#: gram.y:13373 gram.y:13399 #, c-format msgid "For example, FROM (SELECT ...) [AS] foo." msgstr "Zum Beispiel FROM (SELECT ...) [AS] xyz." -#: gram.y:12692 +#: gram.y:13932 #, c-format msgid "only one DEFAULT value is allowed" msgstr "nur ein DEFAULT-Wert ist erlaubt" -#: gram.y:12701 +#: gram.y:13941 #, c-format msgid "only one PATH value per column is allowed" msgstr "nur ein PATH-Wert pro Spalte ist erlaubt" -#: gram.y:12710 +#: gram.y:13950 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "widersprüchliche oder überflüssige NULL/NOT NULL-Deklarationen für Spalte »%s«" -#: gram.y:12719 +#: gram.y:13959 #, c-format msgid "unrecognized column option \"%s\"" msgstr "unbekannte Spaltenoption »%s«" -#: gram.y:12973 +#: gram.y:14217 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "Präzision von Typ float muss mindestens 1 Bit sein" -#: gram.y:12982 +#: gram.y:14226 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "Präzision von Typ float muss weniger als 54 Bits sein" -#: gram.y:13480 +#: gram.y:14736 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "falsche Anzahl Parameter auf linker Seite von OVERLAPS-Ausdruck" -#: gram.y:13485 +#: gram.y:14741 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "falsche Anzahl Parameter auf rechter Seite von OVERLAPS-Ausdruck" -#: gram.y:13653 +#: gram.y:14918 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "UNIQUE-Prädikat ist noch nicht implementiert" -#: gram.y:14012 +#: gram.y:15356 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "in WITHIN GROUP können nicht mehrere ORDER-BY-Klauseln verwendet werden" -#: gram.y:14017 +#: gram.y:15361 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT kann nicht mit WITHIN GROUP verwendet werden" -#: gram.y:14022 +#: gram.y:15366 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC kann nicht mit WITHIN GROUP verwendet werden" -#: gram.y:14546 gram.y:14569 +#: gram.y:15916 gram.y:15940 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "Frame-Beginn kann nicht UNBOUNDED FOLLOWING sein" -#: gram.y:14551 +#: gram.y:15921 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "Frame der in der folgenden Zeile beginnt kann nicht in der aktuellen Zeile enden" -#: gram.y:14574 +#: gram.y:15945 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "Frame-Ende kann nicht UNBOUNDED PRECEDING sein" -#: gram.y:14580 +#: gram.y:15951 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "Frame der in der aktuellen Zeile beginnt kann keine vorhergehenden Zeilen haben" -#: gram.y:14587 +#: gram.y:15958 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "Frame der in der folgenden Zeile beginnt kann keine vorhergehenden Zeilen haben" -#: gram.y:15219 +#: gram.y:16644 gram.y:16836 +#, c-format +msgid "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" +msgstr "" + +#: gram.y:17390 #, c-format msgid "type modifier cannot have parameter name" msgstr "Typmodifikator kann keinen Parameternamen haben" -#: gram.y:15225 +#: gram.y:17396 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "Typmodifikator kann kein ORDER BY haben" -#: gram.y:15290 gram.y:15297 gram.y:15304 +#: gram.y:17464 gram.y:17471 gram.y:17478 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s kann hier nicht als Rollenname verwendet werden" -#: gram.y:15393 gram.y:16825 +#: gram.y:17568 gram.y:19055 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIES kann nicht ohne ORDER-BY-Klausel angegeben werden" -#: gram.y:16501 gram.y:16690 +#: gram.y:18734 gram.y:18921 msgid "improper use of \"*\"" msgstr "unzulässige Verwendung von »*«" -#: gram.y:16653 gram.y:16670 tsearch/spell.c:982 tsearch/spell.c:999 +#: gram.y:18884 gram.y:18901 tsearch/spell.c:982 tsearch/spell.c:999 #: tsearch/spell.c:1016 tsearch/spell.c:1033 tsearch/spell.c:1098 #, c-format msgid "syntax error" msgstr "Syntaxfehler" -#: gram.y:16755 +#: gram.y:18985 #, c-format msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" msgstr "eine Ordered-Set-Aggregatfunktion mit einem direkten VARIADIC-Argument muss ein aggregiertes VARIADIC-Argument des selben Datentyps haben" -#: gram.y:16792 +#: gram.y:19022 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "mehrere ORDER-BY-Klauseln sind nicht erlaubt" -#: gram.y:16803 +#: gram.y:19033 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "mehrere OFFSET-Klauseln sind nicht erlaubt" -#: gram.y:16812 +#: gram.y:19042 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "mehrere LIMIT-Klauseln sind nicht erlaubt" -#: gram.y:16821 +#: gram.y:19051 #, c-format msgid "multiple limit options not allowed" msgstr "mehrere Limit-Optionen sind nicht erlaubt" -#: gram.y:16833 +#: gram.y:19078 #, c-format msgid "multiple WITH clauses not allowed" msgstr "mehrere WITH-Klauseln sind nicht erlaubt" -#: gram.y:17025 +#: gram.y:19271 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "OUT- und INOUT-Argumente sind in TABLE-Funktionen nicht erlaubt" -#: gram.y:17121 +#: gram.y:19404 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "mehrere COLLATE-Klauseln sind nicht erlaubt" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17159 gram.y:17172 +#: gram.y:19442 gram.y:19455 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "%s-Constraints können nicht als DEFERRABLE markiert werden" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17185 +#: gram.y:19468 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "%s-Constraints können nicht als NOT VALID markiert werden" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17198 +#: gram.y:19481 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "%s-Constraints können nicht als NO INHERIT markiert werden" +#: gram.y:19505 +#, fuzzy, c-format +#| msgid "invalid publication_names syntax" +msgid "invalid publication object list" +msgstr "ungültige Syntax für publication_names" + +#: gram.y:19506 +#, c-format +msgid "One of TABLE or ALL TABLES IN SCHEMA must be specified before a standalone table or schema name." +msgstr "" + +#: gram.y:19522 +#, fuzzy, c-format +#| msgid "invalid file name argument" +msgid "invalid table name at or near" +msgstr "ungültiges Dateinamenargument" + +#: gram.y:19543 +#, fuzzy, c-format +#| msgid "WHERE clause not allowed with COPY TO" +msgid "WHERE clause not allowed for schema" +msgstr "mit COPY TO ist keine WHERE-Klausel erlaubt" + +#: gram.y:19550 +#, fuzzy, c-format +#| msgid "interval specification not allowed here" +msgid "column specification not allowed for schema" +msgstr "Intervallangabe hier nicht erlaubt" + +#: gram.y:19564 +#, fuzzy, c-format +#| msgid "invalid statement name \"%s\" on line %d" +msgid "invalid schema name at or near" +msgstr "ungültiger Anweisungsname »%s« auf Zeile %d" + #: guc-file.l:314 #, c-format msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" msgstr "unbekannter Konfigurationsparameter »%s« in Datei »%s« Zeile %d" -#: guc-file.l:351 utils/misc/guc.c:7360 utils/misc/guc.c:7558 -#: utils/misc/guc.c:7652 utils/misc/guc.c:7746 utils/misc/guc.c:7866 -#: utils/misc/guc.c:7965 +#: guc-file.l:353 utils/misc/guc.c:7640 utils/misc/guc.c:7859 +#: utils/misc/guc.c:7953 utils/misc/guc.c:8047 utils/misc/guc.c:8167 +#: utils/misc/guc.c:8266 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "Parameter »%s« kann nicht geändert werden, ohne den Server neu zu starten" -#: guc-file.l:387 +#: guc-file.l:389 #, c-format msgid "parameter \"%s\" removed from configuration file, reset to default" msgstr "Parameter »%s« wurde aus Konfigurationsdatei entfernt, wird auf Standardwert zurückgesetzt" -#: guc-file.l:453 +#: guc-file.l:455 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "Parameter »%s« auf »%s« gesetzt" -#: guc-file.l:495 +#: guc-file.l:497 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "Konfigurationsdatei »%s« enthält Fehler" -#: guc-file.l:500 +#: guc-file.l:502 #, c-format msgid "configuration file \"%s\" contains errors; unaffected changes were applied" msgstr "Konfigurationsdatei »%s« enthält Fehler; nicht betroffene Änderungen wurden durchgeführt" -#: guc-file.l:505 +#: guc-file.l:507 #, c-format msgid "configuration file \"%s\" contains errors; no changes were applied" msgstr "Konfigurationsdatei »%s« enthält Fehler; keine Änderungen wurden durchgeführt" -#: guc-file.l:577 +#: guc-file.l:579 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "leerer Konfigurationsdateiname: »%s«" -#: guc-file.l:594 +#: guc-file.l:596 #, c-format msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" msgstr "konnte Konfigurationsdatei »%s« nicht öffnen: maximale Verschachtelungstiefe überschritten" -#: guc-file.l:614 +#: guc-file.l:616 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "Konfigurationsdateirekursion in »%s«" -#: guc-file.l:630 libpq/hba.c:2251 libpq/hba.c:2665 +#: guc-file.l:632 libpq/hba.c:2223 utils/adt/hbafuncs.c:376 #, c-format msgid "could not open configuration file \"%s\": %m" msgstr "konnte Konfigurationsdatei »%s« nicht öffnen: %m" -#: guc-file.l:641 +#: guc-file.l:643 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "fehlende Konfigurationsdatei »%s« wird übersprungen" -#: guc-file.l:895 +#: guc-file.l:897 #, c-format msgid "syntax error in file \"%s\" line %u, near end of line" msgstr "Syntaxfehler in Datei »%s«, Zeile %u, am Ende der Zeile" -#: guc-file.l:905 +#: guc-file.l:907 #, c-format msgid "syntax error in file \"%s\" line %u, near token \"%s\"" msgstr "Syntaxfehler in Datei »%s«, Zeile %u, bei »%s«" -#: guc-file.l:925 +#: guc-file.l:927 #, c-format msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "zu viele Syntaxfehler gefunden, Datei »%s« wird aufgegeben" -#: guc-file.l:980 +#: guc-file.l:982 #, c-format msgid "empty configuration directory name: \"%s\"" msgstr "leerer Konfigurationsverzeichnisname: »%s«" -#: guc-file.l:999 +#: guc-file.l:1001 #, c-format msgid "could not open configuration directory \"%s\": %m" msgstr "konnte Konfigurationsverzeichnis »%s« nicht öffnen: %m" -#: jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:417 -#: utils/fmgr/dfmgr.c:465 +#: jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:415 #, c-format msgid "could not access file \"%s\": %m" msgstr "konnte nicht auf Datei »%s« zugreifen: %m" -#: jsonpath_gram.y:528 jsonpath_scan.l:519 jsonpath_scan.l:530 -#: jsonpath_scan.l:540 jsonpath_scan.l:582 utils/adt/encode.c:435 -#: utils/adt/encode.c:501 utils/adt/jsonfuncs.c:623 utils/adt/varlena.c:339 -#: utils/adt/varlena.c:380 +#: jsonpath_gram.y:529 jsonpath_scan.l:515 jsonpath_scan.l:526 +#: jsonpath_scan.l:536 jsonpath_scan.l:578 utils/adt/encode.c:482 +#: utils/adt/encode.c:547 utils/adt/jsonfuncs.c:623 utils/adt/varlena.c:335 +#: utils/adt/varlena.c:376 #, c-format msgid "invalid input syntax for type %s" msgstr "ungültige Eingabesyntax für Typ %s" -#: jsonpath_gram.y:529 +#: jsonpath_gram.y:530 #, c-format msgid "unrecognized flag character \"%.*s\" in LIKE_REGEX predicate" msgstr "unbekanntes Flag-Zeichen »%.*s« in LIKE_REGEX-Prädikat" -#: jsonpath_gram.y:583 +#: jsonpath_gram.y:584 #, c-format msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" msgstr "XQuery-Flag »x« (expanded regular expression) ist nicht implementiert" #. translator: %s is typically "syntax error" -#: jsonpath_scan.l:286 +#: jsonpath_scan.l:282 #, c-format msgid "%s at end of jsonpath input" msgstr "%s am Ende der jsonpath-Eingabe" #. translator: first %s is typically "syntax error" -#: jsonpath_scan.l:293 +#: jsonpath_scan.l:289 #, c-format msgid "%s at or near \"%s\" of jsonpath input" msgstr "%s bei »%s« in jsonpath-Eingabe" -#: jsonpath_scan.l:498 utils/adt/jsonfuncs.c:617 +#: jsonpath_scan.l:494 utils/adt/jsonfuncs.c:617 #, c-format msgid "unsupported Unicode escape sequence" msgstr "nicht unterstützte Unicode-Escape-Sequenz" -#: lib/dshash.c:247 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 +#: lib/dshash.c:255 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 #: utils/mmgr/dsa.c:805 #, c-format msgid "Failed on DSA request of size %zu." msgstr "Fehler bei DSA-Anfrage mit Größe %zu." -#: libpq/auth-scram.c:249 +#: libpq/auth-sasl.c:97 +#, c-format +msgid "expected SASL response, got message type %d" +msgstr "SASL-Antwort erwartet, Message-Typ %d empfangen" + +#: libpq/auth-scram.c:258 #, c-format msgid "client selected an invalid SASL authentication mechanism" msgstr "Client hat einen ungültigen SASL-Authentifizierungsmechanismums gewählt" -#: libpq/auth-scram.c:270 libpq/auth-scram.c:510 libpq/auth-scram.c:521 +#: libpq/auth-scram.c:279 libpq/auth-scram.c:523 libpq/auth-scram.c:534 #, c-format msgid "invalid SCRAM secret for user \"%s\"" msgstr "ungültiges SCRAM-Geheimnis für Benutzer »%s«" -#: libpq/auth-scram.c:281 +#: libpq/auth-scram.c:290 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "Benutzer »%s« hat kein gültiges SCRAM-Geheimnis." -#: libpq/auth-scram.c:359 libpq/auth-scram.c:364 libpq/auth-scram.c:701 -#: libpq/auth-scram.c:709 libpq/auth-scram.c:814 libpq/auth-scram.c:827 -#: libpq/auth-scram.c:837 libpq/auth-scram.c:945 libpq/auth-scram.c:952 -#: libpq/auth-scram.c:967 libpq/auth-scram.c:982 libpq/auth-scram.c:996 -#: libpq/auth-scram.c:1014 libpq/auth-scram.c:1029 libpq/auth-scram.c:1340 -#: libpq/auth-scram.c:1348 +#: libpq/auth-scram.c:368 libpq/auth-scram.c:373 libpq/auth-scram.c:714 +#: libpq/auth-scram.c:722 libpq/auth-scram.c:827 libpq/auth-scram.c:840 +#: libpq/auth-scram.c:850 libpq/auth-scram.c:958 libpq/auth-scram.c:965 +#: libpq/auth-scram.c:980 libpq/auth-scram.c:995 libpq/auth-scram.c:1009 +#: libpq/auth-scram.c:1027 libpq/auth-scram.c:1042 libpq/auth-scram.c:1355 +#: libpq/auth-scram.c:1363 #, c-format msgid "malformed SCRAM message" msgstr "fehlerhafte SCRAM-Nachricht" -#: libpq/auth-scram.c:360 +#: libpq/auth-scram.c:369 #, c-format msgid "The message is empty." msgstr "Die Nachricht ist leer." -#: libpq/auth-scram.c:365 +#: libpq/auth-scram.c:374 #, c-format msgid "Message length does not match input length." msgstr "Länge der Nachricht stimmt nicht mit Länge der Eingabe überein." -#: libpq/auth-scram.c:397 +#: libpq/auth-scram.c:406 #, c-format msgid "invalid SCRAM response" msgstr "ungültige SCRAM-Antwort" -#: libpq/auth-scram.c:398 +#: libpq/auth-scram.c:407 #, c-format msgid "Nonce does not match." msgstr "Nonce stimmt nicht überein." -#: libpq/auth-scram.c:472 +#: libpq/auth-scram.c:483 #, c-format msgid "could not generate random salt" msgstr "konnte zufälliges Salt nicht erzeugen" -#: libpq/auth-scram.c:702 +#: libpq/auth-scram.c:715 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "Attribut »%c« wurde erwartet, aber »%s« wurde gefunden." -#: libpq/auth-scram.c:710 libpq/auth-scram.c:838 +#: libpq/auth-scram.c:723 libpq/auth-scram.c:851 #, c-format msgid "Expected character \"=\" for attribute \"%c\"." msgstr "Zeichen »=« für Attribut »%c« wurde erwartet." -#: libpq/auth-scram.c:815 +#: libpq/auth-scram.c:828 #, c-format msgid "Attribute expected, but found end of string." msgstr "Attribut wurde erwartet, aber Ende der Zeichenkette wurde gefunden." -#: libpq/auth-scram.c:828 +#: libpq/auth-scram.c:841 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "Attribut wurde erwartet, aber ungültiges Zeichen »%s« wurde gefunden." -#: libpq/auth-scram.c:946 libpq/auth-scram.c:968 +#: libpq/auth-scram.c:959 libpq/auth-scram.c:981 #, c-format msgid "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not include channel binding data." msgstr "Der Client hat SCRAM-SHA-256-PLUS gewählt, aber die SCRAM-Nachricht enthielt keine Channel-Binding-Daten." -#: libpq/auth-scram.c:953 libpq/auth-scram.c:983 +#: libpq/auth-scram.c:966 libpq/auth-scram.c:996 #, c-format msgid "Comma expected, but found character \"%s\"." msgstr "Komma wurde erwartet, aber Zeichen »%s« wurde gefunden." -#: libpq/auth-scram.c:974 +#: libpq/auth-scram.c:987 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "Fehler bei der Aushandlung von SCRAM-Channel-Binding" -#: libpq/auth-scram.c:975 +#: libpq/auth-scram.c:988 #, c-format msgid "The client supports SCRAM channel binding but thinks the server does not. However, this server does support channel binding." msgstr "Der Client unterstützt SCRAM-Channel-Binding aber glaubt dass der Server es nicht tut. Dieser Server unterstützt jedoch Channel-Binding." -#: libpq/auth-scram.c:997 +#: libpq/auth-scram.c:1010 #, c-format msgid "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM message includes channel binding data." msgstr "Der Client hat SCRAM-SHA-256 ohne Channel-Binding gewählt, aber die SCRAM-Nachricht enthält Channel-Binding-Daten." -#: libpq/auth-scram.c:1008 +#: libpq/auth-scram.c:1021 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "nicht unterstützter SCRAM-Channel-Binding-Typ »%s«" -#: libpq/auth-scram.c:1015 +#: libpq/auth-scram.c:1028 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "Unerwartetes Channel-Binding-Flag »%s«." -#: libpq/auth-scram.c:1025 +#: libpq/auth-scram.c:1038 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "Client verwendet Autorisierungsidentität, was nicht unterstützt wird" -#: libpq/auth-scram.c:1030 +#: libpq/auth-scram.c:1043 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "Unerwartetes Attribut »%s« in »client-first-message«." -#: libpq/auth-scram.c:1046 +#: libpq/auth-scram.c:1059 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "Client verlangt eine nicht unterstützte SCRAM-Erweiterung" -#: libpq/auth-scram.c:1060 +#: libpq/auth-scram.c:1073 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "nicht druckbare Zeichen in SCRAM-Nonce" -#: libpq/auth-scram.c:1188 +#: libpq/auth-scram.c:1203 #, c-format msgid "could not generate random nonce" msgstr "konnte zufällige Nonce nicht erzeugen" -#: libpq/auth-scram.c:1198 +#: libpq/auth-scram.c:1213 #, c-format msgid "could not encode random nonce" msgstr "konnte zufällige Nonce nicht kodieren" -#: libpq/auth-scram.c:1304 +#: libpq/auth-scram.c:1319 #, c-format msgid "SCRAM channel binding check failed" msgstr "SCRAM-Channel-Binding-Prüfung fehlgeschlagen" -#: libpq/auth-scram.c:1322 +#: libpq/auth-scram.c:1337 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" msgstr "unerwartetes SCRAM-Channel-Binding-Attribut in »client-final-message«" -#: libpq/auth-scram.c:1341 +#: libpq/auth-scram.c:1356 #, c-format msgid "Malformed proof in client-final-message." msgstr "Fehlerhafter Proof in »client-final-message«." -#: libpq/auth-scram.c:1349 +#: libpq/auth-scram.c:1364 #, c-format msgid "Garbage found at the end of client-final-message." msgstr "Müll am Ende der »client-final-message« gefunden." -#: libpq/auth.c:284 +#: libpq/auth.c:275 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "Authentifizierung für Benutzer »%s« fehlgeschlagen: Host abgelehnt" -#: libpq/auth.c:287 +#: libpq/auth.c:278 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "»trust«-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:290 +#: libpq/auth.c:281 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "Ident-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:293 +#: libpq/auth.c:284 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "Peer-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:298 +#: libpq/auth.c:289 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "Passwort-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:303 +#: libpq/auth.c:294 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "GSSAPI-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:306 +#: libpq/auth.c:297 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "SSPI-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:309 +#: libpq/auth.c:300 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "PAM-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:312 +#: libpq/auth.c:303 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "BSD-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:315 +#: libpq/auth.c:306 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "LDAP-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:318 +#: libpq/auth.c:309 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "Zertifikatauthentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:321 +#: libpq/auth.c:312 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "RADIUS-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:324 +#: libpq/auth.c:315 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "Authentifizierung für Benutzer »%s« fehlgeschlagen: ungültige Authentifizierungsmethode" -#: libpq/auth.c:328 +#: libpq/auth.c:319 #, c-format msgid "Connection matched pg_hba.conf line %d: \"%s\"" msgstr "Verbindung stimmte mit pg_hba.conf-Zeile %d überein: »%s«" -#: libpq/auth.c:371 -#, fuzzy, c-format -#| msgid "Connections and Authentication" -msgid "connection was re-authenticated" -msgstr "Verbindungen und Authentifizierung" +#: libpq/auth.c:362 +#, c-format +msgid "authentication identifier set more than once" +msgstr "Authentifizierungsbezeichner mehrmals gesetzt" -#: libpq/auth.c:372 +#: libpq/auth.c:363 #, c-format -msgid "previous ID: \"%s\"; new ID: \"%s\"" -msgstr "" +msgid "previous identifier: \"%s\"; new identifier: \"%s\"" +msgstr "vorheriger Bezeichner: »%s«; neuer Bezeichner: »%s«" -#: libpq/auth.c:381 +#: libpq/auth.c:372 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" -msgstr "" +msgstr "Verbindung authentifiziert: Identität=»%s« Methode=%s (%s:%d)" -#: libpq/auth.c:420 +#: libpq/auth.c:411 #, c-format msgid "client certificates can only be checked if a root certificate store is available" msgstr "Client-Zertifikate können nur überprüft werden, wenn Wurzelzertifikat verfügbar ist" -#: libpq/auth.c:431 +#: libpq/auth.c:422 #, c-format msgid "connection requires a valid client certificate" msgstr "Verbindung erfordert ein gültiges Client-Zertifikat" -#: libpq/auth.c:462 libpq/auth.c:508 +#: libpq/auth.c:453 libpq/auth.c:499 msgid "GSS encryption" msgstr "GSS-Verschlüsselung" -#: libpq/auth.c:465 libpq/auth.c:511 +#: libpq/auth.c:456 libpq/auth.c:502 msgid "SSL encryption" msgstr "SSL-Verschlüsselung" -#: libpq/auth.c:467 libpq/auth.c:513 +#: libpq/auth.c:458 libpq/auth.c:504 msgid "no encryption" msgstr "keine Verschlüsselung" #. translator: last %s describes encryption state -#: libpq/auth.c:473 +#: libpq/auth.c:464 #, c-format msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" msgstr "pg_hba.conf lehnt Replikationsverbindung ab für Host »%s«, Benutzer »%s«, %s" #. translator: last %s describes encryption state -#: libpq/auth.c:480 +#: libpq/auth.c:471 #, c-format msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "pg_hba.conf lehnt Verbindung ab für Host »%s«, Benutzer »%s«, Datenbank »%s«, %s" -#: libpq/auth.c:518 +#: libpq/auth.c:509 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "Auflösung der Client-IP-Adresse ergab »%s«, Vorwärtsauflösung stimmt überein." -#: libpq/auth.c:521 +#: libpq/auth.c:512 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "Auflösung der Client-IP-Adresse ergab »%s«, Vorwärtsauflösung nicht geprüft." -#: libpq/auth.c:524 +#: libpq/auth.c:515 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "Auflösung der Client-IP-Adresse ergab »%s«, Vorwärtsauflösung stimmt nicht überein." -#: libpq/auth.c:527 +#: libpq/auth.c:518 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "Konnte Client-Hostnamen »%s« nicht in IP-Adresse übersetzen: %s." -#: libpq/auth.c:532 +#: libpq/auth.c:523 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "Konnte Client-IP-Adresse nicht in einen Hostnamen auflösen: %s." #. translator: last %s describes encryption state -#: libpq/auth.c:540 +#: libpq/auth.c:531 #, c-format msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" msgstr "kein pg_hba.conf-Eintrag für Replikationsverbindung von Host »%s«, Benutzer »%s«, %s" #. translator: last %s describes encryption state -#: libpq/auth.c:548 +#: libpq/auth.c:539 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "kein pg_hba.conf-Eintrag für Host »%s«, Benutzer »%s«, Datenbank »%s«, %s" -#: libpq/auth.c:721 +#: libpq/auth.c:712 #, c-format msgid "expected password response, got message type %d" msgstr "Passwort-Antwort erwartet, Message-Typ %d empfangen" -#: libpq/auth.c:742 +#: libpq/auth.c:733 #, c-format msgid "invalid password packet size" msgstr "ungültige Größe des Passwortpakets" -#: libpq/auth.c:760 +#: libpq/auth.c:751 #, c-format msgid "empty password returned by client" msgstr "Client gab leeres Passwort zurück" -#: libpq/auth.c:887 libpq/hba.c:1366 +#: libpq/auth.c:880 libpq/hba.c:1335 #, c-format msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" msgstr "MD5-Authentifizierung wird nicht unterstützt, wenn »db_user_namespace« angeschaltet ist" -#: libpq/auth.c:893 +#: libpq/auth.c:886 #, c-format msgid "could not generate random MD5 salt" msgstr "konnte zufälliges MD5-Salt nicht erzeugen" -#: libpq/auth.c:959 -#, c-format -msgid "expected SASL response, got message type %d" -msgstr "SASL-Antwort erwartet, Message-Typ %d empfangen" - -#: libpq/auth.c:1088 libpq/be-secure-gssapi.c:535 +#: libpq/auth.c:935 libpq/be-secure-gssapi.c:535 #, c-format msgid "could not set environment: %m" msgstr "konnte Umgebung nicht setzen: %m" -#: libpq/auth.c:1124 +#: libpq/auth.c:971 #, c-format msgid "expected GSS response, got message type %d" msgstr "GSS-Antwort erwartet, Message-Typ %d empfangen" -#: libpq/auth.c:1184 +#: libpq/auth.c:1031 msgid "accepting GSS security context failed" msgstr "Annahme des GSS-Sicherheitskontexts fehlgeschlagen" -#: libpq/auth.c:1224 +#: libpq/auth.c:1072 msgid "retrieving GSS user name failed" msgstr "Abfrage des GSS-Benutzernamens fehlgeschlagen" -#: libpq/auth.c:1365 +#: libpq/auth.c:1221 msgid "could not acquire SSPI credentials" msgstr "konnte SSPI-Credentials nicht erhalten" -#: libpq/auth.c:1390 +#: libpq/auth.c:1246 #, c-format msgid "expected SSPI response, got message type %d" msgstr "SSPI-Antwort erwartet, Message-Typ %d empfangen" -#: libpq/auth.c:1468 +#: libpq/auth.c:1324 msgid "could not accept SSPI security context" msgstr "konnte SSPI-Sicherheitskontext nicht akzeptieren" -#: libpq/auth.c:1530 +#: libpq/auth.c:1386 msgid "could not get token from SSPI security context" msgstr "konnte kein Token vom SSPI-Sicherheitskontext erhalten" -#: libpq/auth.c:1669 libpq/auth.c:1688 +#: libpq/auth.c:1525 libpq/auth.c:1544 #, c-format msgid "could not translate name" msgstr "konnte Namen nicht umwandeln" -#: libpq/auth.c:1701 +#: libpq/auth.c:1557 #, c-format msgid "realm name too long" msgstr "Realm-Name zu lang" -#: libpq/auth.c:1716 +#: libpq/auth.c:1572 #, c-format msgid "translated account name too long" msgstr "umgewandelter Account-Name zu lang" -#: libpq/auth.c:1897 +#: libpq/auth.c:1753 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "konnte Socket für Ident-Verbindung nicht erzeugen: %m" -#: libpq/auth.c:1912 +#: libpq/auth.c:1768 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "konnte nicht mit lokaler Adresse »%s« verbinden: %m" -#: libpq/auth.c:1924 +#: libpq/auth.c:1780 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "konnte nicht mit Ident-Server auf Adresse »%s«, Port %s verbinden: %m" -#: libpq/auth.c:1946 +#: libpq/auth.c:1802 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "konnte Anfrage an Ident-Server auf Adresse »%s«, Port %s nicht senden: %m" -#: libpq/auth.c:1963 +#: libpq/auth.c:1819 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "konnte Antwort von Ident-Server auf Adresse »%s«, Port %s nicht empfangen: %m" -#: libpq/auth.c:1973 +#: libpq/auth.c:1829 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "ungültig formatierte Antwort vom Ident-Server: »%s«" -#: libpq/auth.c:2026 +#: libpq/auth.c:1882 #, c-format msgid "peer authentication is not supported on this platform" msgstr "Peer-Authentifizierung wird auf dieser Plattform nicht unterstützt" -#: libpq/auth.c:2030 +#: libpq/auth.c:1886 #, c-format msgid "could not get peer credentials: %m" msgstr "konnte Credentials von Gegenstelle nicht ermitteln: %m" -#: libpq/auth.c:2042 +#: libpq/auth.c:1898 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "konnte lokale Benutzer-ID %ld nicht nachschlagen: %s" -#: libpq/auth.c:2143 +#: libpq/auth.c:1999 #, c-format msgid "error from underlying PAM layer: %s" msgstr "Fehler von der unteren PAM-Ebene: %s" -#: libpq/auth.c:2154 -#, fuzzy, c-format -#| msgid "unsupported format code: %d" +#: libpq/auth.c:2010 +#, c-format msgid "unsupported PAM conversation %d/\"%s\"" -msgstr "nicht unterstützter Formatcode: %d" +msgstr "nicht unterstützte PAM-Conversation: %d/»%s«" -#: libpq/auth.c:2214 +#: libpq/auth.c:2070 #, c-format msgid "could not create PAM authenticator: %s" msgstr "konnte PAM-Authenticator nicht erzeugen: %s" -#: libpq/auth.c:2225 +#: libpq/auth.c:2081 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER) fehlgeschlagen: %s" -#: libpq/auth.c:2257 +#: libpq/auth.c:2113 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST) fehlgeschlagen: %s" -#: libpq/auth.c:2269 +#: libpq/auth.c:2125 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "pam_set_item(PAM_CONV) fehlgeschlagen: %s" -#: libpq/auth.c:2282 +#: libpq/auth.c:2138 #, c-format msgid "pam_authenticate failed: %s" msgstr "pam_authenticate fehlgeschlagen: %s" -#: libpq/auth.c:2295 +#: libpq/auth.c:2151 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmt fehlgeschlagen: %s" -#: libpq/auth.c:2306 +#: libpq/auth.c:2162 #, c-format msgid "could not release PAM authenticator: %s" msgstr "konnte PAM-Authenticator nicht freigeben: %s" -#: libpq/auth.c:2386 +#: libpq/auth.c:2242 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "konnte LDAP nicht initialisieren: Fehlercode %d" -#: libpq/auth.c:2423 +#: libpq/auth.c:2279 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "konnte keinen Domain-Namen aus ldapbasedn herauslesen" -#: libpq/auth.c:2431 +#: libpq/auth.c:2287 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "LDAP-Authentifizierung konnte keine DNS-SRV-Einträge für »%s« finden" -#: libpq/auth.c:2433 +#: libpq/auth.c:2289 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Geben Sie einen LDAP-Servernamen explizit an." -#: libpq/auth.c:2485 +#: libpq/auth.c:2341 #, c-format msgid "could not initialize LDAP: %s" msgstr "konnte LDAP nicht initialisieren: %s" -#: libpq/auth.c:2495 +#: libpq/auth.c:2351 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ldaps wird mit dieser LDAP-Bibliothek nicht unterstützt" -#: libpq/auth.c:2503 +#: libpq/auth.c:2359 #, c-format msgid "could not initialize LDAP: %m" msgstr "konnte LDAP nicht initialisieren: %m" -#: libpq/auth.c:2513 +#: libpq/auth.c:2369 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "konnte LDAP-Protokollversion nicht setzen: %s" -#: libpq/auth.c:2553 +#: libpq/auth.c:2409 #, c-format msgid "could not load function _ldap_start_tls_sA in wldap32.dll" msgstr "konnte Funktion _ldap_start_tls_sA in wldap32.dll nicht laden" -#: libpq/auth.c:2554 +#: libpq/auth.c:2410 #, c-format msgid "LDAP over SSL is not supported on this platform." msgstr "LDAP über SSL wird auf dieser Plattform nicht unterstützt." -#: libpq/auth.c:2570 +#: libpq/auth.c:2426 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "konnte LDAP-TLS-Sitzung nicht starten: %s" -#: libpq/auth.c:2641 +#: libpq/auth.c:2497 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP-Server nicht angegeben, und kein ldapbasedn" -#: libpq/auth.c:2648 +#: libpq/auth.c:2504 #, c-format msgid "LDAP server not specified" msgstr "LDAP-Server nicht angegeben" -#: libpq/auth.c:2710 +#: libpq/auth.c:2566 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "ungültiges Zeichen im Benutzernamen für LDAP-Authentifizierung" -#: libpq/auth.c:2727 +#: libpq/auth.c:2583 #, c-format msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" msgstr "erstes LDAP-Binden für ldapbinddn »%s« auf Server »%s« fehlgeschlagen: %s" -#: libpq/auth.c:2756 +#: libpq/auth.c:2612 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "konnte LDAP nicht mit Filter »%s« auf Server »%s« durchsuchen: %s" -#: libpq/auth.c:2770 +#: libpq/auth.c:2626 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "LDAP-Benutzer »%s« existiert nicht" -#: libpq/auth.c:2771 +#: libpq/auth.c:2627 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "LDAP-Suche nach Filter »%s« auf Server »%s« gab keine Einträge zurück." -#: libpq/auth.c:2775 +#: libpq/auth.c:2631 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "LDAP-Benutzer »%s« ist nicht eindeutig" -#: libpq/auth.c:2776 +#: libpq/auth.c:2632 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." msgstr[0] "LDAP-Suche nach Filter »%s« auf Server »%s« gab %d Eintrag zurück." msgstr[1] "LDAP-Suche nach Filter »%s« auf Server »%s« gab %d Einträge zurück." -#: libpq/auth.c:2796 +#: libpq/auth.c:2652 #, c-format msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" msgstr "konnte DN fũr den ersten Treffer für »%s« auf Server »%s« nicht lesen: %s" -#: libpq/auth.c:2817 +#: libpq/auth.c:2673 #, c-format msgid "could not unbind after searching for user \"%s\" on server \"%s\"" msgstr "Losbinden fehlgeschlagen nach Suche nach Benutzer »%s« auf Server »%s«" -#: libpq/auth.c:2848 +#: libpq/auth.c:2704 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "LDAP-Login fehlgeschlagen für Benutzer »%s« auf Server »%s«: %s" -#: libpq/auth.c:2880 +#: libpq/auth.c:2736 #, c-format msgid "LDAP diagnostics: %s" msgstr "LDAP-Diagnostik: %s" -#: libpq/auth.c:2918 +#: libpq/auth.c:2774 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "Zertifikatauthentifizierung für Benutzer »%s« fehlgeschlagen: Client-Zertifikat enthält keinen Benutzernamen" -#: libpq/auth.c:2939 -#, fuzzy, c-format -#| msgid "certificate authentication failed for user \"%s\"" +#: libpq/auth.c:2795 +#, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" -msgstr "Zertifikatauthentifizierung für Benutzer »%s« fehlgeschlagen" +msgstr "Zertifikatauthentifizierung für Benutzer »%s« fehlgeschlagen: konnte Subject-DN nicht abfragen" -#: libpq/auth.c:2962 +#: libpq/auth.c:2818 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" msgstr "Zertifikatüberprüfung (clientcert=verify=full) für Benutzer »%s« fehlgeschlagen: DN stimmt nicht überein" -#: libpq/auth.c:2967 +#: libpq/auth.c:2823 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "Zertifikatüberprüfung (clientcert=verify=full) für Benutzer »%s« fehlgeschlagen: CN stimmt nicht überein" -#: libpq/auth.c:3069 +#: libpq/auth.c:2925 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-Server nicht angegeben" -#: libpq/auth.c:3076 +#: libpq/auth.c:2932 #, c-format msgid "RADIUS secret not specified" msgstr "RADIUS-Geheimnis nicht angegeben" -#: libpq/auth.c:3090 +#: libpq/auth.c:2946 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "RADIUS-Authentifizierung unterstützt keine Passwörter länger als %d Zeichen" -#: libpq/auth.c:3197 libpq/hba.c:2004 +#: libpq/auth.c:3053 libpq/hba.c:1976 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "konnte RADIUS-Servername »%s« nicht in Adresse übersetzen: %s" -#: libpq/auth.c:3211 +#: libpq/auth.c:3067 #, c-format msgid "could not generate random encryption vector" msgstr "konnte zufälligen Verschlüsselungsvektor nicht erzeugen" -#: libpq/auth.c:3245 +#: libpq/auth.c:3104 #, c-format -msgid "could not perform MD5 encryption of password" -msgstr "konnte MD5-Verschlüsselung des Passworts nicht durchführen" +msgid "could not perform MD5 encryption of password: %s" +msgstr "konnte MD5-Verschlüsselung des Passworts nicht durchführen: %s" -#: libpq/auth.c:3271 +#: libpq/auth.c:3131 #, c-format msgid "could not create RADIUS socket: %m" msgstr "konnte RADIUS-Socket nicht erstellen: %m" -#: libpq/auth.c:3293 +#: libpq/auth.c:3153 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "konnte lokales RADIUS-Socket nicht binden: %m" -#: libpq/auth.c:3303 +#: libpq/auth.c:3163 #, c-format msgid "could not send RADIUS packet: %m" msgstr "konnte RADIUS-Paket nicht senden: %m" -#: libpq/auth.c:3336 libpq/auth.c:3362 +#: libpq/auth.c:3197 libpq/auth.c:3223 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "Zeitüberschreitung beim Warten auf RADIUS-Antwort von %s" -#: libpq/auth.c:3355 +#: libpq/auth.c:3216 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "konnte Status des RADIUS-Sockets nicht prüfen: %m" -#: libpq/auth.c:3385 +#: libpq/auth.c:3246 #, c-format msgid "could not read RADIUS response: %m" msgstr "konnte RADIUS-Antwort nicht lesen: %m" -#: libpq/auth.c:3398 libpq/auth.c:3402 +#: libpq/auth.c:3259 libpq/auth.c:3263 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "RADIUS-Antwort von %s wurde von falschem Port gesendet: %d" -#: libpq/auth.c:3411 +#: libpq/auth.c:3272 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "RADIUS-Antwort von %s zu kurz: %d" -#: libpq/auth.c:3418 +#: libpq/auth.c:3279 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "RADIUS-Antwort von %s hat verfälschte Länge: %d (tatsächliche Länge %d)" -#: libpq/auth.c:3426 +#: libpq/auth.c:3287 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "RADIUS-Antwort von %s unterscheidet sich von Anfrage: %d (sollte %d sein)" -#: libpq/auth.c:3451 +#: libpq/auth.c:3312 #, c-format -msgid "could not perform MD5 encryption of received packet" -msgstr "konnte MD5-Verschlüsselung des empfangenen Pakets nicht durchführen" +msgid "could not perform MD5 encryption of received packet: %s" +msgstr "konnte MD5-Verschlüsselung des empfangenen Pakets nicht durchführen: %s" -#: libpq/auth.c:3460 +#: libpq/auth.c:3322 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "RADIUS-Antwort von %s hat falsche MD5-Signatur" -#: libpq/auth.c:3478 +#: libpq/auth.c:3340 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "RADIUS-Antwort von %s hat ungültigen Code (%d) für Benutzer »%s«" -#: libpq/be-fsstubs.c:119 libpq/be-fsstubs.c:150 libpq/be-fsstubs.c:178 -#: libpq/be-fsstubs.c:204 libpq/be-fsstubs.c:229 libpq/be-fsstubs.c:277 -#: libpq/be-fsstubs.c:300 libpq/be-fsstubs.c:553 +#: libpq/be-fsstubs.c:128 libpq/be-fsstubs.c:157 libpq/be-fsstubs.c:185 +#: libpq/be-fsstubs.c:211 libpq/be-fsstubs.c:236 libpq/be-fsstubs.c:274 +#: libpq/be-fsstubs.c:297 libpq/be-fsstubs.c:545 #, c-format msgid "invalid large-object descriptor: %d" msgstr "ungültiger Large-Object-Deskriptor: %d" -#: libpq/be-fsstubs.c:161 +#: libpq/be-fsstubs.c:168 #, c-format msgid "large object descriptor %d was not opened for reading" msgstr "Large-Objekt-Deskriptor %d wurde nicht zum Lesen geöffnet" -#: libpq/be-fsstubs.c:185 libpq/be-fsstubs.c:560 +#: libpq/be-fsstubs.c:192 libpq/be-fsstubs.c:552 #, c-format msgid "large object descriptor %d was not opened for writing" msgstr "Large-Objekt-Deskriptor %d wurde nicht zum Schreiben geöffnet" -#: libpq/be-fsstubs.c:212 +#: libpq/be-fsstubs.c:219 #, c-format msgid "lo_lseek result out of range for large-object descriptor %d" msgstr "Ergebnis von lo_lseek ist außerhalb des gültigen Bereichs für Large-Object-Deskriptor %d" -#: libpq/be-fsstubs.c:285 +#: libpq/be-fsstubs.c:282 #, c-format msgid "lo_tell result out of range for large-object descriptor %d" msgstr "Ergebnis von lo_tell ist außerhalb des gültigen Bereichs für Large-Object-Deskriptor: %d" -#: libpq/be-fsstubs.c:432 +#: libpq/be-fsstubs.c:424 #, c-format msgid "could not open server file \"%s\": %m" msgstr "konnte Serverdatei »%s« nicht öffnen: %m" -#: libpq/be-fsstubs.c:454 +#: libpq/be-fsstubs.c:447 #, c-format msgid "could not read server file \"%s\": %m" msgstr "konnte Serverdatei »%s« nicht lesen: %m" -#: libpq/be-fsstubs.c:514 +#: libpq/be-fsstubs.c:506 #, c-format msgid "could not create server file \"%s\": %m" msgstr "konnte Serverdatei »%s« nicht erstellen: %m" -#: libpq/be-fsstubs.c:526 +#: libpq/be-fsstubs.c:518 #, c-format msgid "could not write server file \"%s\": %m" msgstr "konnte Serverdatei »%s« nicht schreiben: %m" -#: libpq/be-fsstubs.c:760 +#: libpq/be-fsstubs.c:758 #, c-format msgid "large object read request is too large" msgstr "Large-Object-Leseaufforderung ist zu groß" -#: libpq/be-fsstubs.c:802 utils/adt/genfile.c:267 utils/adt/genfile.c:306 -#: utils/adt/genfile.c:342 +#: libpq/be-fsstubs.c:800 utils/adt/genfile.c:262 utils/adt/genfile.c:301 +#: utils/adt/genfile.c:337 #, c-format msgid "requested length cannot be negative" msgstr "verlangte Länge darf nicht negativ sein" -#: libpq/be-fsstubs.c:855 storage/large_object/inv_api.c:297 -#: storage/large_object/inv_api.c:309 storage/large_object/inv_api.c:513 -#: storage/large_object/inv_api.c:624 storage/large_object/inv_api.c:814 +#: libpq/be-fsstubs.c:851 storage/large_object/inv_api.c:299 +#: storage/large_object/inv_api.c:311 storage/large_object/inv_api.c:508 +#: storage/large_object/inv_api.c:619 storage/large_object/inv_api.c:809 #, c-format msgid "permission denied for large object %u" msgstr "keine Berechtigung für Large Object %u" @@ -13970,22 +14677,22 @@ msgstr "Befehl »%s« fehlgeschlagen" msgid "could not access private key file \"%s\": %m" msgstr "konnte auf private Schlüsseldatei »%s« nicht zugreifen: %m" -#: libpq/be-secure-common.c:150 +#: libpq/be-secure-common.c:151 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "private Schlüsseldatei »%s« ist keine normale Datei" -#: libpq/be-secure-common.c:165 +#: libpq/be-secure-common.c:176 #, c-format msgid "private key file \"%s\" must be owned by the database user or root" msgstr "private Schlüsseldatei »%s« muss als Eigentümer den Datenbankbenutzer oder »root« haben" -#: libpq/be-secure-common.c:188 +#: libpq/be-secure-common.c:186 #, c-format msgid "private key file \"%s\" has group or world access" msgstr "private Schlüsseldatei »%s« erlaubt Zugriff von Gruppe oder Welt" -#: libpq/be-secure-common.c:190 +#: libpq/be-secure-common.c:188 #, c-format msgid "File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root." msgstr "Dateirechte müssen u=rw (0600) oder weniger sein, wenn der Eigentümer der Datenbankbenutzer ist, oder u=rw,g=r (0640) oder weniger, wenn der Eigentümer »root« ist." @@ -14031,207 +14738,206 @@ msgstr "konnte GSSAPI-Sicherheitskontext nicht akzeptieren" msgid "GSSAPI size check error" msgstr "GSSAPI-Fehler bei der Größenprüfung" -#: libpq/be-secure-openssl.c:115 +#: libpq/be-secure-openssl.c:122 #, c-format msgid "could not create SSL context: %s" msgstr "konnte SSL-Kontext nicht erzeugen: %s" -#: libpq/be-secure-openssl.c:141 +#: libpq/be-secure-openssl.c:148 #, c-format msgid "could not load server certificate file \"%s\": %s" msgstr "konnte Serverzertifikatsdatei »%s« nicht laden: %s" -#: libpq/be-secure-openssl.c:161 +#: libpq/be-secure-openssl.c:168 #, c-format msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" msgstr "private Schlüsseldatei »%s« kann nicht neu geladen werden, weil sie eine Passphrase benötigt" -#: libpq/be-secure-openssl.c:166 +#: libpq/be-secure-openssl.c:173 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "konnte private Schlüsseldatei »%s« nicht laden: %s" -#: libpq/be-secure-openssl.c:175 +#: libpq/be-secure-openssl.c:182 #, c-format msgid "check of private key failed: %s" msgstr "Überprüfung des privaten Schlüssels fehlgeschlagen: %s" #. translator: first %s is a GUC option name, second %s is its value -#: libpq/be-secure-openssl.c:188 libpq/be-secure-openssl.c:211 +#: libpq/be-secure-openssl.c:195 libpq/be-secure-openssl.c:218 #, c-format msgid "\"%s\" setting \"%s\" not supported by this build" msgstr "»%s«-Wert »%s« wird von dieser Installation nicht unterstützt" -#: libpq/be-secure-openssl.c:198 +#: libpq/be-secure-openssl.c:205 #, c-format msgid "could not set minimum SSL protocol version" msgstr "konnte minimale SSL-Protokollversion nicht setzen" -#: libpq/be-secure-openssl.c:221 +#: libpq/be-secure-openssl.c:228 #, c-format msgid "could not set maximum SSL protocol version" msgstr "konnte maximale SSL-Protokollversion nicht setzen" -#: libpq/be-secure-openssl.c:237 +#: libpq/be-secure-openssl.c:244 #, c-format msgid "could not set SSL protocol version range" msgstr "konnte SSL-Protokollversionsbereich nicht setzen" -#: libpq/be-secure-openssl.c:238 +#: libpq/be-secure-openssl.c:245 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "»%s« kann nicht höher als »%s« sein" -#: libpq/be-secure-openssl.c:275 +#: libpq/be-secure-openssl.c:282 #, c-format msgid "could not set the cipher list (no valid ciphers available)" msgstr "konnte Cipher-Liste nicht setzen (keine gültigen Ciphers verfügbar)" -#: libpq/be-secure-openssl.c:295 +#: libpq/be-secure-openssl.c:302 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "konnte Root-Zertifikat-Datei »%s« nicht laden: %s" -#: libpq/be-secure-openssl.c:344 +#: libpq/be-secure-openssl.c:351 #, c-format msgid "could not load SSL certificate revocation list file \"%s\": %s" msgstr "konnte SSL-Certificate-Revocation-List-Datei »%s« nicht laden: %s" -#: libpq/be-secure-openssl.c:352 +#: libpq/be-secure-openssl.c:359 #, c-format msgid "could not load SSL certificate revocation list directory \"%s\": %s" msgstr "konnte SSL-Certificate-Revocation-List-Verzeichnis »%s« nicht laden: %s" -#: libpq/be-secure-openssl.c:360 +#: libpq/be-secure-openssl.c:367 #, c-format msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" msgstr "konnte SSL-Certificate-Revocation-List-Datei »%s« oder -Verzeichnis »%s« nicht laden: %s" -#: libpq/be-secure-openssl.c:418 +#: libpq/be-secure-openssl.c:425 #, c-format msgid "could not initialize SSL connection: SSL context not set up" msgstr "konnte SSL-Verbindung nicht initialisieren: SSL-Kontext nicht eingerichtet" -#: libpq/be-secure-openssl.c:429 +#: libpq/be-secure-openssl.c:436 #, c-format msgid "could not initialize SSL connection: %s" msgstr "konnte SSL-Verbindung nicht initialisieren: %s" -#: libpq/be-secure-openssl.c:437 +#: libpq/be-secure-openssl.c:444 #, c-format msgid "could not set SSL socket: %s" msgstr "konnte SSL-Socket nicht setzen: %s" -#: libpq/be-secure-openssl.c:492 +#: libpq/be-secure-openssl.c:499 #, c-format msgid "could not accept SSL connection: %m" msgstr "konnte SSL-Verbindung nicht annehmen: %m" -#: libpq/be-secure-openssl.c:496 libpq/be-secure-openssl.c:549 +#: libpq/be-secure-openssl.c:503 libpq/be-secure-openssl.c:556 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "konnte SSL-Verbindung nicht annehmen: EOF entdeckt" -#: libpq/be-secure-openssl.c:535 +#: libpq/be-secure-openssl.c:542 #, c-format msgid "could not accept SSL connection: %s" msgstr "konnte SSL-Verbindung nicht annehmen: %s" -#: libpq/be-secure-openssl.c:538 +#: libpq/be-secure-openssl.c:545 #, c-format msgid "This may indicate that the client does not support any SSL protocol version between %s and %s." msgstr "Das zeigt möglicherweise an, dass der Client keine SSL-Protokollversion zwischen %s und %s unterstützt." -#: libpq/be-secure-openssl.c:554 libpq/be-secure-openssl.c:734 -#: libpq/be-secure-openssl.c:798 +#: libpq/be-secure-openssl.c:561 libpq/be-secure-openssl.c:741 +#: libpq/be-secure-openssl.c:805 #, c-format msgid "unrecognized SSL error code: %d" msgstr "unbekannter SSL-Fehlercode: %d" -#: libpq/be-secure-openssl.c:600 +#: libpq/be-secure-openssl.c:607 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "Common-Name im SSL-Zertifikat enthält Null-Byte" -#: libpq/be-secure-openssl.c:640 +#: libpq/be-secure-openssl.c:647 #, c-format msgid "SSL certificate's distinguished name contains embedded null" msgstr "Distinguished Name im SSL-Zertifikat enthält Null-Byte" -#: libpq/be-secure-openssl.c:723 libpq/be-secure-openssl.c:782 +#: libpq/be-secure-openssl.c:730 libpq/be-secure-openssl.c:789 #, c-format msgid "SSL error: %s" msgstr "SSL-Fehler: %s" -#: libpq/be-secure-openssl.c:963 +#: libpq/be-secure-openssl.c:971 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "konnte DH-Parameterdatei »%s« nicht öffnen: %m" -#: libpq/be-secure-openssl.c:975 +#: libpq/be-secure-openssl.c:983 #, c-format msgid "could not load DH parameters file: %s" msgstr "konnte DH-Parameterdatei nicht laden: %s" -#: libpq/be-secure-openssl.c:985 +#: libpq/be-secure-openssl.c:993 #, c-format msgid "invalid DH parameters: %s" msgstr "ungültige DH-Parameter: %s" -#: libpq/be-secure-openssl.c:994 +#: libpq/be-secure-openssl.c:1002 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "ungültige DH-Parameter: p ist keine Primzahl" -#: libpq/be-secure-openssl.c:1003 +#: libpq/be-secure-openssl.c:1011 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "ungültige DH-Parameter: weder geeigneter Generator noch sichere Primzahl" -#: libpq/be-secure-openssl.c:1164 +#: libpq/be-secure-openssl.c:1172 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: konnte DH-Parameter nicht laden" -#: libpq/be-secure-openssl.c:1172 +#: libpq/be-secure-openssl.c:1180 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: konnte DH-Parameter nicht setzen: %s" -#: libpq/be-secure-openssl.c:1199 +#: libpq/be-secure-openssl.c:1207 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: unbekannter Kurvenname: %s" -#: libpq/be-secure-openssl.c:1208 +#: libpq/be-secure-openssl.c:1216 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: konnte Schlüssel nicht erzeugen" -#: libpq/be-secure-openssl.c:1236 +#: libpq/be-secure-openssl.c:1244 msgid "no SSL error reported" msgstr "kein SSL-Fehler berichtet" -#: libpq/be-secure-openssl.c:1240 +#: libpq/be-secure-openssl.c:1248 #, c-format msgid "SSL error code %lu" msgstr "SSL-Fehlercode %lu" -#: libpq/be-secure-openssl.c:1394 +#: libpq/be-secure-openssl.c:1402 #, c-format -msgid "failed to create BIO" -msgstr "" +msgid "could not create BIO" +msgstr "konnte BIO nicht erzeugen" -#: libpq/be-secure-openssl.c:1404 +#: libpq/be-secure-openssl.c:1412 #, c-format msgid "could not get NID for ASN1_OBJECT object" -msgstr "" +msgstr "konnte NID für ASN1_OBJECT-Objekt nicht ermitteln" -#: libpq/be-secure-openssl.c:1412 -#, fuzzy, c-format -#| msgid "could not create LDAP structure\n" +#: libpq/be-secure-openssl.c:1420 +#, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" -msgstr "konnte LDAP-Struktur nicht erzeugen\n" +msgstr "konnte NID %d nicht in eine ASN1_OBJECT-Struktur umwandeln" #: libpq/be-secure.c:209 libpq/be-secure.c:305 #, c-format @@ -14253,397 +14959,387 @@ msgstr "Benutzer »%s« hat kein Passwort zugewiesen." msgid "User \"%s\" has an expired password." msgstr "Benutzer »%s« hat ein abgelaufenes Passwort." -#: libpq/crypt.c:179 +#: libpq/crypt.c:181 #, c-format msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "Benutzer »%s« hat ein Passwort, das nicht mit MD5-Authentifizierung verwendet werden kann." -#: libpq/crypt.c:203 libpq/crypt.c:244 libpq/crypt.c:268 +#: libpq/crypt.c:202 libpq/crypt.c:244 libpq/crypt.c:264 #, c-format msgid "Password does not match for user \"%s\"." msgstr "Passwort stimmt nicht überein für Benutzer »%s«." -#: libpq/crypt.c:287 +#: libpq/crypt.c:283 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "Passwort von Benutzer »%s« hat unbekanntes Format." -#: libpq/hba.c:241 +#: libpq/hba.c:209 #, c-format msgid "authentication file token too long, skipping: \"%s\"" msgstr "Token in Authentifizierungsdatei zu lang, wird übersprungen: »%s«" -#: libpq/hba.c:413 +#: libpq/hba.c:381 #, c-format msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" msgstr "konnte sekundäre Authentifizierungsdatei »@%s« nicht als »%s« öffnen: %m" -#: libpq/hba.c:859 +#: libpq/hba.c:832 #, c-format msgid "error enumerating network interfaces: %m" msgstr "Fehler beim Aufzählen der Netzwerkschnittstellen: %m" #. translator: the second %s is a list of auth methods -#: libpq/hba.c:886 +#: libpq/hba.c:859 #, c-format msgid "authentication option \"%s\" is only valid for authentication methods %s" msgstr "Authentifizierungsoption »%s« ist nur gültig für Authentifizierungsmethoden %s" -#: libpq/hba.c:888 libpq/hba.c:908 libpq/hba.c:946 libpq/hba.c:996 -#: libpq/hba.c:1010 libpq/hba.c:1034 libpq/hba.c:1043 libpq/hba.c:1056 -#: libpq/hba.c:1077 libpq/hba.c:1090 libpq/hba.c:1110 libpq/hba.c:1132 -#: libpq/hba.c:1144 libpq/hba.c:1203 libpq/hba.c:1223 libpq/hba.c:1237 -#: libpq/hba.c:1257 libpq/hba.c:1268 libpq/hba.c:1283 libpq/hba.c:1302 -#: libpq/hba.c:1318 libpq/hba.c:1330 libpq/hba.c:1367 libpq/hba.c:1408 -#: libpq/hba.c:1421 libpq/hba.c:1443 libpq/hba.c:1455 libpq/hba.c:1473 -#: libpq/hba.c:1523 libpq/hba.c:1567 libpq/hba.c:1578 libpq/hba.c:1594 -#: libpq/hba.c:1611 libpq/hba.c:1622 libpq/hba.c:1641 libpq/hba.c:1657 -#: libpq/hba.c:1673 libpq/hba.c:1727 libpq/hba.c:1744 libpq/hba.c:1757 -#: libpq/hba.c:1769 libpq/hba.c:1788 libpq/hba.c:1875 libpq/hba.c:1893 -#: libpq/hba.c:1987 libpq/hba.c:2006 libpq/hba.c:2035 libpq/hba.c:2048 -#: libpq/hba.c:2071 libpq/hba.c:2093 libpq/hba.c:2107 tsearch/ts_locale.c:232 +#: libpq/hba.c:861 libpq/hba.c:881 libpq/hba.c:916 libpq/hba.c:967 +#: libpq/hba.c:981 libpq/hba.c:1005 libpq/hba.c:1013 libpq/hba.c:1025 +#: libpq/hba.c:1046 libpq/hba.c:1059 libpq/hba.c:1079 libpq/hba.c:1101 +#: libpq/hba.c:1113 libpq/hba.c:1172 libpq/hba.c:1192 libpq/hba.c:1206 +#: libpq/hba.c:1226 libpq/hba.c:1237 libpq/hba.c:1252 libpq/hba.c:1271 +#: libpq/hba.c:1287 libpq/hba.c:1299 libpq/hba.c:1336 libpq/hba.c:1377 +#: libpq/hba.c:1390 libpq/hba.c:1412 libpq/hba.c:1424 libpq/hba.c:1442 +#: libpq/hba.c:1492 libpq/hba.c:1536 libpq/hba.c:1547 libpq/hba.c:1563 +#: libpq/hba.c:1580 libpq/hba.c:1591 libpq/hba.c:1610 libpq/hba.c:1626 +#: libpq/hba.c:1642 libpq/hba.c:1700 libpq/hba.c:1717 libpq/hba.c:1730 +#: libpq/hba.c:1742 libpq/hba.c:1761 libpq/hba.c:1847 libpq/hba.c:1865 +#: libpq/hba.c:1959 libpq/hba.c:1978 libpq/hba.c:2007 libpq/hba.c:2020 +#: libpq/hba.c:2043 libpq/hba.c:2065 libpq/hba.c:2079 tsearch/ts_locale.c:232 #, c-format msgid "line %d of configuration file \"%s\"" msgstr "Zeile %d in Konfigurationsdatei »%s«" -#: libpq/hba.c:906 +#: libpq/hba.c:879 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "Authentifizierungsmethode »%s« benötigt Argument »%s«" -#: libpq/hba.c:934 +#: libpq/hba.c:903 #, c-format msgid "missing entry in file \"%s\" at end of line %d" msgstr "fehlender Eintrag in Datei »%s« am Ende von Zeile %d" -#: libpq/hba.c:945 +#: libpq/hba.c:915 #, c-format msgid "multiple values in ident field" msgstr "mehrere Werte in Ident-Feld" -#: libpq/hba.c:994 +#: libpq/hba.c:965 #, c-format msgid "multiple values specified for connection type" msgstr "mehrere Werte angegeben für Verbindungstyp" -#: libpq/hba.c:995 +#: libpq/hba.c:966 #, c-format msgid "Specify exactly one connection type per line." msgstr "Geben Sie genau einen Verbindungstyp pro Zeile an." -#: libpq/hba.c:1009 +#: libpq/hba.c:980 #, c-format msgid "local connections are not supported by this build" msgstr "lokale Verbindungen werden von dieser Installation nicht unterstützt" -#: libpq/hba.c:1032 +#: libpq/hba.c:1003 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "hostssl-Eintrag kann nicht angewendet werden, weil SSL deaktiviert ist" -#: libpq/hba.c:1033 +#: libpq/hba.c:1004 #, c-format msgid "Set ssl = on in postgresql.conf." msgstr "Setzen Sie ssl = on in postgresql.conf." -#: libpq/hba.c:1041 +#: libpq/hba.c:1012 #, c-format msgid "hostssl record cannot match because SSL is not supported by this build" msgstr "hostssl-Eintrag kann nicht angewendet werden, weil SSL von dieser Installation nicht unterstützt wird" -#: libpq/hba.c:1042 -#, c-format -msgid "Compile with --with-ssl to use SSL connections." -msgstr "Kompilieren Sie mit --with-ssl, um SSL-Verbindungen zu verwenden." - -#: libpq/hba.c:1054 +#: libpq/hba.c:1024 #, c-format msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" msgstr "hostgssenc-Eintrag kann nicht angewendet werden, weil GSSAPI von dieser Installation nicht unterstützt wird" -#: libpq/hba.c:1055 -#, c-format -msgid "Compile with --with-gssapi to use GSSAPI connections." -msgstr "Kompilieren Sie mit --with-gssapi, um GSSAPI-Verbindungen zu verwenden." - -#: libpq/hba.c:1075 +#: libpq/hba.c:1044 #, c-format msgid "invalid connection type \"%s\"" msgstr "ungültiger Verbindungstyp »%s«" -#: libpq/hba.c:1089 +#: libpq/hba.c:1058 #, c-format msgid "end-of-line before database specification" msgstr "Zeilenende vor Datenbankangabe" -#: libpq/hba.c:1109 +#: libpq/hba.c:1078 #, c-format msgid "end-of-line before role specification" msgstr "Zeilenende vor Rollenangabe" -#: libpq/hba.c:1131 +#: libpq/hba.c:1100 #, c-format msgid "end-of-line before IP address specification" msgstr "Zeilenende vor IP-Adressangabe" -#: libpq/hba.c:1142 +#: libpq/hba.c:1111 #, c-format msgid "multiple values specified for host address" msgstr "mehrere Werte für Hostadresse angegeben" -#: libpq/hba.c:1143 +#: libpq/hba.c:1112 #, c-format msgid "Specify one address range per line." msgstr "Geben Sie einen Adressbereich pro Zeile an." -#: libpq/hba.c:1201 +#: libpq/hba.c:1170 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "ungültige IP-Adresse »%s«: %s" -#: libpq/hba.c:1221 +#: libpq/hba.c:1190 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "Angabe von sowohl Hostname als auch CIDR-Maske ist ungültig: »%s«" -#: libpq/hba.c:1235 +#: libpq/hba.c:1204 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "ungültige CIDR-Maske in Adresse »%s«" -#: libpq/hba.c:1255 +#: libpq/hba.c:1224 #, c-format msgid "end-of-line before netmask specification" msgstr "Zeilenende vor Netzmaskenangabe" -#: libpq/hba.c:1256 +#: libpq/hba.c:1225 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "Geben Sie einen Adressbereich in CIDR-Schreibweise oder eine separate Netzmaske an." -#: libpq/hba.c:1267 +#: libpq/hba.c:1236 #, c-format msgid "multiple values specified for netmask" msgstr "mehrere Werte für Netzmaske angegeben" -#: libpq/hba.c:1281 +#: libpq/hba.c:1250 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "ungültige IP-Maske »%s«: %s" -#: libpq/hba.c:1301 +#: libpq/hba.c:1270 #, c-format msgid "IP address and mask do not match" msgstr "IP-Adresse und -Maske passen nicht zusammen" -#: libpq/hba.c:1317 +#: libpq/hba.c:1286 #, c-format msgid "end-of-line before authentication method" msgstr "Zeilenende vor Authentifizierungsmethode" -#: libpq/hba.c:1328 +#: libpq/hba.c:1297 #, c-format msgid "multiple values specified for authentication type" msgstr "mehrere Werte für Authentifizierungstyp angegeben" -#: libpq/hba.c:1329 +#: libpq/hba.c:1298 #, c-format msgid "Specify exactly one authentication type per line." msgstr "Geben Sie genau einen Authentifizierungstyp pro Zeile an." -#: libpq/hba.c:1406 +#: libpq/hba.c:1375 #, c-format msgid "invalid authentication method \"%s\"" msgstr "ungültige Authentifizierungsmethode »%s«" -#: libpq/hba.c:1419 +#: libpq/hba.c:1388 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "ungültige Authentifizierungsmethode »%s«: von dieser Installation nicht unterstützt" -#: libpq/hba.c:1442 +#: libpq/hba.c:1411 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "gssapi-Authentifizierung wird auf lokalen Sockets nicht unterstützt" -#: libpq/hba.c:1454 +#: libpq/hba.c:1423 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "peer-Authentifizierung wird nur auf lokalen Sockets unterstützt" -#: libpq/hba.c:1472 +#: libpq/hba.c:1441 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "cert-Authentifizierung wird nur auf »hostssl«-Verbindungen unterstützt" -#: libpq/hba.c:1522 +#: libpq/hba.c:1491 #, c-format msgid "authentication option not in name=value format: %s" msgstr "Authentifizierungsoption nicht im Format name=wert: %s" -#: libpq/hba.c:1566 +#: libpq/hba.c:1535 #, c-format msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" msgstr "ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter oder ldapurl kann nicht zusammen mit ldapprefix verwendet werden" -#: libpq/hba.c:1577 +#: libpq/hba.c:1546 #, c-format msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" msgstr "Authentifizierungsmethode »ldap« benötigt Argument »ldapbasedn«, »ldapprefix« oder »ldapsuffix«" -#: libpq/hba.c:1593 +#: libpq/hba.c:1562 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "ldapsearchattribute kann nicht zusammen mit ldapsearchfilter verwendet werden" -#: libpq/hba.c:1610 +#: libpq/hba.c:1579 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "List der RADIUS-Server darf nicht leer sein" -#: libpq/hba.c:1621 +#: libpq/hba.c:1590 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "Liste der RADIUS-Geheimnisse darf nicht leer sein" -#: libpq/hba.c:1638 +#: libpq/hba.c:1607 #, c-format msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "die Anzahl der RADIUS-Geheimnisse (%d) muss 1 oder gleich der Anzahl der RADIUS-Server (%d) sein" -#: libpq/hba.c:1654 +#: libpq/hba.c:1623 #, c-format msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "die Anzahl der RADIUS-Ports (%d) muss 1 oder gleich der Anzahl der RADIUS-Server (%d) sein" -#: libpq/hba.c:1670 +#: libpq/hba.c:1639 #, c-format msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "die Anzahl der RADIUS-Bezeichner (%d) muss 1 oder gleich der Anzahl der RADIUS-Server (%d) sein" -#: libpq/hba.c:1717 +#: libpq/hba.c:1690 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi und cert" -#: libpq/hba.c:1726 +#: libpq/hba.c:1699 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert kann nur für »hostssl«-Zeilen konfiguriert werden" -#: libpq/hba.c:1743 +#: libpq/hba.c:1716 #, c-format msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" msgstr "clientcert akzeptiert »verify-full« nur, wenn »cert«-Authentifizierung verwendet wird" -#: libpq/hba.c:1756 +#: libpq/hba.c:1729 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "ungültiger Wert für clientcert: »%s«" -#: libpq/hba.c:1768 +#: libpq/hba.c:1741 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" msgstr "clientname kann nur für »hostssl«-Zeilen konfiguriert werden" -#: libpq/hba.c:1787 +#: libpq/hba.c:1760 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "ungültiger Wert für clientname: »%s«" -#: libpq/hba.c:1821 +#: libpq/hba.c:1793 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "konnte LDAP-URL »%s« nicht interpretieren: %s" -#: libpq/hba.c:1832 +#: libpq/hba.c:1804 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "nicht unterstütztes LDAP-URL-Schema: %s" -#: libpq/hba.c:1856 +#: libpq/hba.c:1828 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "LDAP-URLs werden auf dieser Plattform nicht unterstützt" -#: libpq/hba.c:1874 +#: libpq/hba.c:1846 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "ungültiger ldapscheme-Wert: »%s«" -#: libpq/hba.c:1892 +#: libpq/hba.c:1864 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "ungültige LDAP-Portnummer: »%s«" -#: libpq/hba.c:1938 libpq/hba.c:1945 +#: libpq/hba.c:1910 libpq/hba.c:1917 msgid "gssapi and sspi" msgstr "gssapi und sspi" -#: libpq/hba.c:1954 libpq/hba.c:1963 +#: libpq/hba.c:1926 libpq/hba.c:1935 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1985 +#: libpq/hba.c:1957 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "konnte RADIUS-Serverliste »%s« nicht parsen" -#: libpq/hba.c:2033 +#: libpq/hba.c:2005 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "konnte RADIUS-Portliste »%s« nicht parsen" -#: libpq/hba.c:2047 +#: libpq/hba.c:2019 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "ungültige RADIUS-Portnummer: »%s«" -#: libpq/hba.c:2069 +#: libpq/hba.c:2041 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "konnte RADIUS-Geheimnisliste »%s« nicht parsen" -#: libpq/hba.c:2091 +#: libpq/hba.c:2063 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "konnte RADIUS-Bezeichnerliste »%s« nicht parsen" -#: libpq/hba.c:2105 +#: libpq/hba.c:2077 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "unbekannter Authentifizierungsoptionsname: »%s«" -#: libpq/hba.c:2302 +#: libpq/hba.c:2274 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "Konfigurationsdatei »%s« enthält keine Einträge" -#: libpq/hba.c:2820 +#: libpq/hba.c:2374 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "ungültiger regulärer Ausdruck »%s«: %s" -#: libpq/hba.c:2880 +#: libpq/hba.c:2437 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "Suche nach regulärem Ausdruck für »%s« fehlgeschlagen: %s" -#: libpq/hba.c:2899 +#: libpq/hba.c:2456 #, c-format msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" msgstr "regulärer Ausdruck »%s« hat keine Teilausdrücke wie von der Backreference in »%s« verlangt" -#: libpq/hba.c:2995 +#: libpq/hba.c:2552 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "angegebener Benutzername (%s) und authentifizierter Benutzername (%s) stimmen nicht überein" -#: libpq/hba.c:3015 +#: libpq/hba.c:2572 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "kein passender Eintrag in Usermap »%s« für Benutzer »%s«, authentifiziert als »%s«" -#: libpq/hba.c:3048 +#: libpq/hba.c:2605 utils/adt/hbafuncs.c:512 #, c-format msgid "could not open usermap file \"%s\": %m" msgstr "konnte Usermap-Datei »%s« nicht öffnen: %m" @@ -14756,10 +15452,9 @@ msgid "could not accept new connection: %m" msgstr "konnte neue Verbindung nicht akzeptieren: %m" #: libpq/pqcomm.c:766 libpq/pqcomm.c:775 libpq/pqcomm.c:807 libpq/pqcomm.c:817 -#: libpq/pqcomm.c:1630 libpq/pqcomm.c:1675 libpq/pqcomm.c:1715 -#: libpq/pqcomm.c:1759 libpq/pqcomm.c:1798 libpq/pqcomm.c:1837 -#: libpq/pqcomm.c:1873 libpq/pqcomm.c:1912 postmaster/pgstat.c:618 -#: postmaster/pgstat.c:629 +#: libpq/pqcomm.c:1642 libpq/pqcomm.c:1687 libpq/pqcomm.c:1727 +#: libpq/pqcomm.c:1771 libpq/pqcomm.c:1810 libpq/pqcomm.c:1849 +#: libpq/pqcomm.c:1885 libpq/pqcomm.c:1924 #, c-format msgid "%s(%s) failed: %m" msgstr "%s(%s) fehlgeschlagen: %m" @@ -14774,60 +15469,53 @@ msgstr "es besteht keine Client-Verbindung" msgid "could not receive data from client: %m" msgstr "konnte Daten vom Client nicht empfangen: %m" -#: libpq/pqcomm.c:1161 tcop/postgres.c:4290 +#: libpq/pqcomm.c:1173 tcop/postgres.c:4334 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "Verbindung wird abgebrochen, weil Protokollsynchronisierung verloren wurde" -#: libpq/pqcomm.c:1227 +#: libpq/pqcomm.c:1239 #, c-format msgid "unexpected EOF within message length word" msgstr "unerwartetes EOF im Message-Längenwort" -#: libpq/pqcomm.c:1237 +#: libpq/pqcomm.c:1249 #, c-format msgid "invalid message length" msgstr "ungültige Message-Länge" -#: libpq/pqcomm.c:1259 libpq/pqcomm.c:1272 +#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 #, c-format msgid "incomplete message from client" msgstr "unvollständige Message vom Client" -#: libpq/pqcomm.c:1383 +#: libpq/pqcomm.c:1395 #, c-format msgid "could not send data to client: %m" msgstr "konnte Daten nicht an den Client senden: %m" -#: libpq/pqcomm.c:1598 +#: libpq/pqcomm.c:1610 #, c-format msgid "%s(%s) failed: error code %d" msgstr "%s(%s) fehlgeschlagen: Fehlercode %d" -#: libpq/pqcomm.c:1687 -#, fuzzy, c-format -#| msgid "using recovery command file \"%s\" is not supported" +#: libpq/pqcomm.c:1699 +#, c-format msgid "setting the keepalive idle time is not supported" -msgstr "Verwendung von Recovery-Befehlsdatei »%s« wird nicht unterstützt" +msgstr "Setzen der Keepalive-Idle-Zeit wird nicht unterstützt" -#: libpq/pqcomm.c:1771 libpq/pqcomm.c:1846 libpq/pqcomm.c:1921 +#: libpq/pqcomm.c:1783 libpq/pqcomm.c:1858 libpq/pqcomm.c:1933 #, c-format msgid "%s(%s) not supported" msgstr "%s(%s) nicht unterstützt" -#: libpq/pqcomm.c:1956 -#, fuzzy, c-format -#| msgid "could not set SSL socket: %s" -msgid "could not poll socket: %m" -msgstr "konnte SSL-Socket nicht setzen: %s" - #: libpq/pqformat.c:406 #, c-format msgid "no data left in message" msgstr "keine Daten in Message übrig" #: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 -#: utils/adt/arrayfuncs.c:1481 utils/adt/rowtypes.c:588 +#: utils/adt/arrayfuncs.c:1482 utils/adt/rowtypes.c:588 #, c-format msgid "insufficient data left in message" msgstr "nicht genug Daten in Message übrig" @@ -14842,12 +15530,12 @@ msgstr "ungültige Zeichenkette in Message" msgid "invalid message format" msgstr "ungültiges Message-Format" -#: main/main.c:245 +#: main/main.c:239 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: WSAStartup fehlgeschlagen: %d\n" -#: main/main.c:309 +#: main/main.c:350 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -14856,7 +15544,7 @@ msgstr "" "%s ist der PostgreSQL-Server.\n" "\n" -#: main/main.c:310 +#: main/main.c:351 #, c-format msgid "" "Usage:\n" @@ -14867,107 +15555,107 @@ msgstr "" " %s [OPTION]...\n" "\n" -#: main/main.c:311 +#: main/main.c:352 #, c-format msgid "Options:\n" msgstr "Optionen:\n" -#: main/main.c:312 +#: main/main.c:353 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B ZAHL Anzahl der geteilten Puffer\n" -#: main/main.c:313 +#: main/main.c:354 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NAME=WERT setze Konfigurationsparameter\n" -#: main/main.c:314 +#: main/main.c:355 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C NAME Wert des Konfigurationsparameters ausgeben, dann beenden\n" -#: main/main.c:315 +#: main/main.c:356 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 Debug-Level\n" -#: main/main.c:316 +#: main/main.c:357 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D VERZEICHNIS Datenbankverzeichnis\n" -#: main/main.c:317 +#: main/main.c:358 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e verwende europäisches Datumseingabeformat (DMY)\n" -#: main/main.c:318 +#: main/main.c:359 #, c-format msgid " -F turn fsync off\n" msgstr " -F »fsync« ausschalten\n" -#: main/main.c:319 +#: main/main.c:360 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h HOSTNAME horche auf Hostname oder IP-Adresse\n" -#: main/main.c:320 +#: main/main.c:361 #, c-format msgid " -i enable TCP/IP connections\n" msgstr " -i ermögliche TCP/IP-Verbindungen\n" -#: main/main.c:321 +#: main/main.c:362 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k VERZEICHNIS Ort der Unix-Domain-Socket\n" -#: main/main.c:323 +#: main/main.c:364 #, c-format msgid " -l enable SSL connections\n" msgstr " -l ermögliche SSL-Verbindungen\n" -#: main/main.c:325 +#: main/main.c:366 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N ZAHL Anzahl der erlaubten Verbindungen\n" -#: main/main.c:326 +#: main/main.c:367 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT auf dieser Portnummer horchen\n" -#: main/main.c:327 +#: main/main.c:368 #, c-format msgid " -s show statistics after each query\n" msgstr " -s zeige Statistiken nach jeder Anfrage\n" -#: main/main.c:328 +#: main/main.c:369 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S ZAHL setze Speicher für Sortiervorgänge (in kB)\n" -#: main/main.c:329 +#: main/main.c:370 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: main/main.c:330 +#: main/main.c:371 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NAME=WERT setze Konfigurationsparameter\n" -#: main/main.c:331 +#: main/main.c:372 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config zeige Konfigurationsparameter und beende\n" -#: main/main.c:332 +#: main/main.c:373 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: main/main.c:334 +#: main/main.c:375 #, c-format msgid "" "\n" @@ -14976,42 +15664,42 @@ msgstr "" "\n" "Entwickleroptionen:\n" -#: main/main.c:335 +#: main/main.c:376 #, c-format msgid " -f s|i|n|m|h forbid use of some plan types\n" msgstr " -f s|i|n|m|h verbiete Verwendung einiger Plantypen\n" -#: main/main.c:336 +#: main/main.c:377 #, c-format msgid " -n do not reinitialize shared memory after abnormal exit\n" msgstr " -n Shared Memory nach abnormalem Ende nicht neu initialisieren\n" -#: main/main.c:337 +#: main/main.c:378 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O erlaube Änderungen an Systemtabellenstruktur\n" -#: main/main.c:338 +#: main/main.c:379 #, c-format msgid " -P disable system indexes\n" msgstr " -P schalte Systemindexe aus\n" -#: main/main.c:339 +#: main/main.c:380 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex zeige Zeitmessung nach jeder Anfrage\n" -#: main/main.c:340 +#: main/main.c:381 #, c-format msgid " -T send SIGSTOP to all backend processes if one dies\n" msgstr " -T SIGSTOP an alle Backend-Prozesse senden wenn einer stirbt\n" -#: main/main.c:341 +#: main/main.c:382 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr " -W ZAHL warte ZAHL Sekunden, um Debugger starten zu können\n" -#: main/main.c:343 +#: main/main.c:384 #, c-format msgid "" "\n" @@ -15020,39 +15708,39 @@ msgstr "" "\n" "Optionen für Einzelbenutzermodus:\n" -#: main/main.c:344 +#: main/main.c:385 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr " --single wählt den Einzelbenutzermodus (muss erstes Argument sein)\n" -#: main/main.c:345 +#: main/main.c:386 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAME Datenbankname (Vorgabe: Benutzername)\n" -#: main/main.c:346 +#: main/main.c:387 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 Debug-Level setzen\n" -#: main/main.c:347 +#: main/main.c:388 #, c-format msgid " -E echo statement before execution\n" msgstr " -E gebe Befehl vor der Ausführung aus\n" -#: main/main.c:348 +#: main/main.c:389 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr "" " -j verwende Zeilenende nicht als Anfrageende im interaktiven\n" " Modus\n" -#: main/main.c:349 main/main.c:354 +#: main/main.c:390 main/main.c:396 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr " -r DATEINAME sende stdout und stderr in genannte Datei\n" -#: main/main.c:351 +#: main/main.c:392 #, c-format msgid "" "\n" @@ -15061,22 +15749,23 @@ msgstr "" "\n" "Optionen für Bootstrap-Modus:\n" -#: main/main.c:352 +#: main/main.c:393 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot wählt den Bootstrap-Modus (muss erstes Argument sein)\n" -#: main/main.c:353 +#: main/main.c:394 +#, fuzzy, c-format +#| msgid " --single selects single-user mode (must be first argument)\n" +msgid " --check selects check mode (must be first argument)\n" +msgstr " --single wählt den Einzelbenutzermodus (muss erstes Argument sein)\n" + +#: main/main.c:395 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr " DBNAME Datenbankname (Pflichtangabe im Bootstrap-Modus)\n" -#: main/main.c:355 -#, c-format -msgid " -x NUM internal use\n" -msgstr " -x NUM interne Verwendung\n" - -#: main/main.c:357 +#: main/main.c:398 #, c-format msgid "" "\n" @@ -15093,12 +15782,12 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: main/main.c:361 +#: main/main.c:402 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: main/main.c:372 +#: main/main.c:413 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -15112,12 +15801,12 @@ msgstr "" "Dokumentation finden Sie weitere Informationen darüber, wie der\n" "Server richtig gestartet wird.\n" -#: main/main.c:389 +#: main/main.c:430 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: reelle und effektive Benutzer-IDs müssen übereinstimmen\n" -#: main/main.c:396 +#: main/main.c:437 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -15142,15 +15831,21 @@ msgstr "erweiterbarer Knotentyp »%s« existiert bereits" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods »%s« wurde nicht registriert" -#: nodes/makefuncs.c:150 +#: nodes/makefuncs.c:151 statistics/extended_stats.c:2283 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "Relation »%s« hat keinen zusammengesetzten Typ" -#: nodes/nodeFuncs.c:114 nodes/nodeFuncs.c:145 parser/parse_coerce.c:2472 -#: parser/parse_coerce.c:2584 parser/parse_coerce.c:2630 -#: parser/parse_expr.c:2021 parser/parse_func.c:709 parser/parse_oper.c:883 -#: utils/fmgr/funcapi.c:558 +#: nodes/makefuncs.c:905 +#, fuzzy, c-format +#| msgid "unrecognized encoding: \"%s\"" +msgid "unrecognized JSON encoding: %s" +msgstr "unbekannte Kodierung: »%s«" + +#: nodes/nodeFuncs.c:114 nodes/nodeFuncs.c:145 parser/parse_coerce.c:2567 +#: parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 +#: parser/parse_expr.c:2085 parser/parse_func.c:710 parser/parse_oper.c:883 +#: utils/fmgr/funcapi.c:627 #, c-format msgid "could not find array type for data type %s" msgstr "konnte Arraytyp für Datentyp %s nicht finden" @@ -15177,53 +15872,48 @@ msgid "%s cannot be applied to the nullable side of an outer join" msgstr "%s kann nicht auf die nullbare Seite eines äußeren Verbundes angewendet werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1315 parser/analyze.c:1675 parser/analyze.c:1919 -#: parser/analyze.c:3013 +#: optimizer/plan/planner.c:1341 parser/analyze.c:1714 parser/analyze.c:1970 +#: parser/analyze.c:3152 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s ist nicht in UNION/INTERSECT/EXCEPT erlaubt" -#: optimizer/plan/planner.c:1978 optimizer/plan/planner.c:3634 +#: optimizer/plan/planner.c:2048 optimizer/plan/planner.c:3704 #, c-format msgid "could not implement GROUP BY" msgstr "konnte GROUP BY nicht implementieren" -#: optimizer/plan/planner.c:1979 optimizer/plan/planner.c:3635 -#: optimizer/plan/planner.c:4392 optimizer/prep/prepunion.c:1046 +#: optimizer/plan/planner.c:2049 optimizer/plan/planner.c:3705 +#: optimizer/plan/planner.c:4348 optimizer/prep/prepunion.c:1046 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "Einige Datentypen unterstützen nur Hashing, während andere nur Sortieren unterstützen." -#: optimizer/plan/planner.c:4391 +#: optimizer/plan/planner.c:4347 #, c-format msgid "could not implement DISTINCT" msgstr "konnte DISTINCT nicht implementieren" -#: optimizer/plan/planner.c:5239 +#: optimizer/plan/planner.c:5468 #, c-format msgid "could not implement window PARTITION BY" msgstr "konnte PARTITION BY für Fenster nicht implementieren" -#: optimizer/plan/planner.c:5240 +#: optimizer/plan/planner.c:5469 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Fensterpartitionierungsspalten müssen sortierbare Datentypen haben." -#: optimizer/plan/planner.c:5244 +#: optimizer/plan/planner.c:5473 #, c-format msgid "could not implement window ORDER BY" msgstr "konnte ORDER BY für Fenster nicht implementieren" -#: optimizer/plan/planner.c:5245 +#: optimizer/plan/planner.c:5474 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Fenstersortierspalten müssen sortierbare Datentypen haben." -#: optimizer/plan/setrefs.c:479 -#, c-format -msgid "too many range table entries" -msgstr "zu viele Range-Table-Einträge" - #: optimizer/prep/prepunion.c:509 #, c-format msgid "could not implement recursive UNION" @@ -15240,247 +15930,247 @@ msgstr "Alle Spaltendatentypen müssen hashbar sein." msgid "could not implement %s" msgstr "konnte %s nicht implementieren" -#: optimizer/util/clauses.c:4670 +#: optimizer/util/clauses.c:4854 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "SQL-Funktion »%s« beim Inlining" -#: optimizer/util/plancat.c:132 +#: optimizer/util/plancat.c:133 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "während der Wiederherstellung kann nicht auf temporäre oder ungeloggte Tabellen zugegriffen werden" -#: optimizer/util/plancat.c:672 +#: optimizer/util/plancat.c:673 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "Inferenzangaben mit Unique-Index über die gesamte Zeile werden nicht unterstützt" -#: optimizer/util/plancat.c:689 +#: optimizer/util/plancat.c:690 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "Constraint in der ON-CONFLICT-Klausel hat keinen zugehörigen Index" -#: optimizer/util/plancat.c:739 +#: optimizer/util/plancat.c:740 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATE nicht unterstützt mit Exclusion-Constraints" -#: optimizer/util/plancat.c:844 +#: optimizer/util/plancat.c:845 #, c-format msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "es gibt keinen Unique-Constraint oder Exclusion-Constraint, der auf die ON-CONFLICT-Angabe passt" -#: parser/analyze.c:735 parser/analyze.c:1449 +#: parser/analyze.c:780 parser/analyze.c:1494 #, c-format msgid "VALUES lists must all be the same length" msgstr "VALUES-Listen müssen alle die gleiche Länge haben" -#: parser/analyze.c:936 +#: parser/analyze.c:981 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT hat mehr Ausdrücke als Zielspalten" -#: parser/analyze.c:954 +#: parser/analyze.c:999 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT hat mehr Zielspalten als Ausdrücke" -#: parser/analyze.c:958 +#: parser/analyze.c:1003 #, c-format msgid "The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?" msgstr "Der einzufügende Wert ist ein Zeilenausdruck mit der gleichen Anzahl Spalten wie von INSERT erwartet. Haben Sie versehentlich zu viele Klammern gesetzt?" -#: parser/analyze.c:1257 parser/analyze.c:1648 +#: parser/analyze.c:1302 parser/analyze.c:1687 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "SELECT ... INTO ist hier nicht erlaubt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1578 parser/analyze.c:3192 +#: parser/analyze.c:1617 parser/analyze.c:3346 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s kann nicht auf VALUES angewendet werden" -#: parser/analyze.c:1814 +#: parser/analyze.c:1853 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "ungültige ORDER-BY-Klausel mit UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:1815 +#: parser/analyze.c:1854 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "Es können nur Ergebnisspaltennamen verwendet werden, keine Ausdrücke oder Funktionen." -#: parser/analyze.c:1816 +#: parser/analyze.c:1855 #, c-format msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." msgstr "Fügen Sie den Ausdrück/die Funktion jedem SELECT hinzu oder verlegen Sie die UNION in eine FROM-Klausel." -#: parser/analyze.c:1909 +#: parser/analyze.c:1960 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTO ist nur im ersten SELECT von UNION/INTERSECT/EXCEPT erlaubt" -#: parser/analyze.c:1981 +#: parser/analyze.c:2032 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "Teilanweisung von UNION/INTERSECT/EXCEPT kann nicht auf andere Relationen auf der selben Anfrageebene verweisen" -#: parser/analyze.c:2068 +#: parser/analyze.c:2119 #, c-format msgid "each %s query must have the same number of columns" msgstr "jede %s-Anfrage muss die gleiche Anzahl Spalten haben" -#: parser/analyze.c:2468 +#: parser/analyze.c:2523 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNING muss mindestens eine Spalte haben" -#: parser/analyze.c:2571 +#: parser/analyze.c:2626 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" msgstr[0] "Quelle der Wertzuweisung hat %d Spalte zurückgegeben" msgstr[1] "Quelle der Wertzuweisung hat %d Spalten zurückgegeben" -#: parser/analyze.c:2632 +#: parser/analyze.c:2687 #, c-format msgid "variable \"%s\" is of type %s but expression is of type %s" msgstr "Variable »%s« hat Typ %s, aber der Ausdruck hat Typ %s" #. translator: %s is a SQL keyword -#: parser/analyze.c:2756 parser/analyze.c:2764 +#: parser/analyze.c:2811 parser/analyze.c:2819 #, c-format msgid "cannot specify both %s and %s" msgstr "%s und %s können nicht beide angegeben werden" -#: parser/analyze.c:2784 +#: parser/analyze.c:2839 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR darf keine datenmodifizierenden Anweisungen in WITH enthalten" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2792 +#: parser/analyze.c:2847 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s wird nicht unterstützt" -#: parser/analyze.c:2795 +#: parser/analyze.c:2850 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "Haltbare Cursor müssen READ ONLY sein." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2803 +#: parser/analyze.c:2858 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %s wird nicht unterstützt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2814 +#: parser/analyze.c:2869 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s ist nicht gültig" -#: parser/analyze.c:2817 +#: parser/analyze.c:2872 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Insensitive Cursor müssen READ ONLY sein." -#: parser/analyze.c:2883 +#: parser/analyze.c:2938 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "materialisierte Sichten dürfen keine datenmodifizierenden Anweisungen in WITH verwenden" -#: parser/analyze.c:2893 +#: parser/analyze.c:2948 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "materialisierte Sichten dürfen keine temporären Tabellen oder Sichten verwenden" -#: parser/analyze.c:2903 +#: parser/analyze.c:2958 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "materialisierte Sichten können nicht unter Verwendung von gebundenen Parametern definiert werden" -#: parser/analyze.c:2915 +#: parser/analyze.c:2970 #, c-format msgid "materialized views cannot be unlogged" msgstr "materialisierte Sichten können nicht ungeloggt sein" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3020 +#: parser/analyze.c:3159 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "%s ist nicht mit DISTINCT-Klausel erlaubt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3027 +#: parser/analyze.c:3166 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "%s ist nicht mit GROUP-BY-Klausel erlaubt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3034 +#: parser/analyze.c:3173 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "%s ist nicht mit HAVING-Klausel erlaubt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3041 +#: parser/analyze.c:3180 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "%s ist nicht mit Aggregatfunktionen erlaubt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3048 +#: parser/analyze.c:3187 #, c-format msgid "%s is not allowed with window functions" msgstr "%s ist nicht mit Fensterfunktionen erlaubt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3055 +#: parser/analyze.c:3194 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "%s ist nicht mit Funktionen mit Ergebnismenge in der Targetliste erlaubt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3134 +#: parser/analyze.c:3286 #, c-format msgid "%s must specify unqualified relation names" msgstr "%s muss unqualifizierte Relationsnamen angeben" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3165 +#: parser/analyze.c:3319 #, c-format msgid "%s cannot be applied to a join" msgstr "%s kann nicht auf einen Verbund angewendet werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3174 +#: parser/analyze.c:3328 #, c-format msgid "%s cannot be applied to a function" msgstr "%s kann nicht auf eine Funktion angewendet werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3183 +#: parser/analyze.c:3337 #, c-format msgid "%s cannot be applied to a table function" msgstr "%s kann nicht auf eine Tabellenfunktion angewendet werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3201 +#: parser/analyze.c:3355 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%s kann nicht auf eine WITH-Anfrage angewendet werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3210 +#: parser/analyze.c:3364 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s kann nicht auf einen benannten Tupelstore angewendet werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3230 +#: parser/analyze.c:3384 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "Relation »%s« in %s nicht in der FROM-Klausel gefunden" @@ -15556,118 +16246,130 @@ msgstr "Aggregatfunktionen sind in der Fenster-GROUPS-Klausel nicht erlaubt" msgid "grouping operations are not allowed in window GROUPS" msgstr "Gruppieroperationen sind in der Fenster-GROUPS-Klausel nicht erlaubt" -#: parser/parse_agg.c:460 +#: parser/parse_agg.c:439 +#, fuzzy +#| msgid "aggregate functions are not allowed in trigger WHEN conditions" +msgid "aggregate functions are not allowed in MERGE WHEN conditions" +msgstr "Aggregatfunktionen sind in der WHEN-Bedingung eines Triggers nicht erlaubt" + +#: parser/parse_agg.c:441 +#, fuzzy +#| msgid "grouping operations are not allowed in trigger WHEN conditions" +msgid "grouping operations are not allowed in MERGE WHEN conditions" +msgstr "Gruppieroperationen sind in der WHEN-Bedingung eines Triggers nicht erlaubt" + +#: parser/parse_agg.c:467 msgid "aggregate functions are not allowed in check constraints" msgstr "Aggregatfunktionen sind in Check-Constraints nicht erlaubt" -#: parser/parse_agg.c:462 +#: parser/parse_agg.c:469 msgid "grouping operations are not allowed in check constraints" msgstr "Gruppieroperationen sind in Check-Constraints nicht erlaubt" -#: parser/parse_agg.c:469 +#: parser/parse_agg.c:476 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "Aggregatfunktionen sind in DEFAULT-Ausdrücken nicht erlaubt" -#: parser/parse_agg.c:471 +#: parser/parse_agg.c:478 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "Gruppieroperationen sind in DEFAULT-Ausdrücken nicht erlaubt" -#: parser/parse_agg.c:476 +#: parser/parse_agg.c:483 msgid "aggregate functions are not allowed in index expressions" msgstr "Aggregatfunktionen sind in Indexausdrücken nicht erlaubt" -#: parser/parse_agg.c:478 +#: parser/parse_agg.c:485 msgid "grouping operations are not allowed in index expressions" msgstr "Gruppieroperationen sind in Indexausdrücken nicht erlaubt" -#: parser/parse_agg.c:483 +#: parser/parse_agg.c:490 msgid "aggregate functions are not allowed in index predicates" msgstr "Aggregatfunktionen sind in Indexprädikaten nicht erlaubt" -#: parser/parse_agg.c:485 +#: parser/parse_agg.c:492 msgid "grouping operations are not allowed in index predicates" msgstr "Gruppieroperationen sind in Indexprädikaten nicht erlaubt" -#: parser/parse_agg.c:490 +#: parser/parse_agg.c:497 msgid "aggregate functions are not allowed in statistics expressions" msgstr "Aggregatfunktionen sind in Statistikausdrücken nicht erlaubt" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:499 msgid "grouping operations are not allowed in statistics expressions" msgstr "Gruppieroperationen sind in Statistikausdrücken nicht erlaubt" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:504 msgid "aggregate functions are not allowed in transform expressions" msgstr "Aggregatfunktionen sind in Umwandlungsausdrücken nicht erlaubt" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:506 msgid "grouping operations are not allowed in transform expressions" msgstr "Gruppieroperationen sind in Umwandlungsausdrücken nicht erlaubt" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:511 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "Aggregatfunktionen sind in EXECUTE-Parametern nicht erlaubt" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:513 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "Gruppieroperationen sind in EXECUTE-Parametern nicht erlaubt" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:518 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "Aggregatfunktionen sind in der WHEN-Bedingung eines Triggers nicht erlaubt" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:520 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "Gruppieroperationen sind in der WHEN-Bedingung eines Triggers nicht erlaubt" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:525 msgid "aggregate functions are not allowed in partition bound" msgstr "Aggregatfunktionen sind in Partitionsbegrenzungen nicht erlaubt" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:527 msgid "grouping operations are not allowed in partition bound" msgstr "Gruppieroperationen sind in Partitionsbegrenzungen nicht erlaubt" -#: parser/parse_agg.c:525 +#: parser/parse_agg.c:532 msgid "aggregate functions are not allowed in partition key expressions" msgstr "Aggregatfunktionen sind in Partitionierungsschlüsselausdrücken nicht erlaubt" -#: parser/parse_agg.c:527 +#: parser/parse_agg.c:534 msgid "grouping operations are not allowed in partition key expressions" msgstr "Gruppieroperationen sind in Partitionierungsschlüsselausdrücken nicht erlaubt" -#: parser/parse_agg.c:533 +#: parser/parse_agg.c:540 msgid "aggregate functions are not allowed in column generation expressions" msgstr "Aggregatfunktionen sind in Spaltengenerierungsausdrücken nicht erlaubt" -#: parser/parse_agg.c:535 +#: parser/parse_agg.c:542 msgid "grouping operations are not allowed in column generation expressions" msgstr "Gruppieroperationen sind in Spaltengenerierungsausdrücken nicht erlaubt" -#: parser/parse_agg.c:541 +#: parser/parse_agg.c:548 msgid "aggregate functions are not allowed in CALL arguments" msgstr "Aggregatfunktionen sind in CALL-Argumenten nicht erlaubt" -#: parser/parse_agg.c:543 +#: parser/parse_agg.c:550 msgid "grouping operations are not allowed in CALL arguments" msgstr "Gruppieroperationen sind in CALL-Argumenten nicht erlaubt" -#: parser/parse_agg.c:549 +#: parser/parse_agg.c:556 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "Aggregatfunktionen sind in COPY-FROM-WHERE-Bedingungen nicht erlaubt" -#: parser/parse_agg.c:551 +#: parser/parse_agg.c:558 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "Gruppieroperationen sind in COPY-FROM-WHERE-Bedingungen nicht erlaubt" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:578 parser/parse_clause.c:1847 +#: parser/parse_agg.c:585 parser/parse_clause.c:1852 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "Aggregatfunktionen sind in %s nicht erlaubt" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:581 +#: parser/parse_agg.c:588 #, c-format msgid "grouping operations are not allowed in %s" msgstr "Gruppieroperationen sind in %s nicht erlaubt" @@ -15682,8 +16384,8 @@ msgstr "Aggregatfunktion auf äußerer Ebene kann keine Variable einer unteren E msgid "aggregate function calls cannot contain set-returning function calls" msgstr "Aufrufe von Aggregatfunktionen können keine Aufrufe von Funktionen mit Ergebnismenge enthalten" -#: parser/parse_agg.c:769 parser/parse_expr.c:1673 parser/parse_expr.c:2146 -#: parser/parse_func.c:882 +#: parser/parse_agg.c:769 parser/parse_expr.c:1736 parser/parse_expr.c:2210 +#: parser/parse_func.c:883 #, c-format msgid "You might be able to move the set-returning function into a LATERAL FROM item." msgstr "Sie können möglicherweise die Funktion mit Ergebnismenge in ein LATERAL-FROM-Element verschieben." @@ -15709,95 +16411,101 @@ msgstr "Fensterfunktionen sind in Policy-Ausdrücken nicht erlaubt" msgid "window functions are not allowed in window definitions" msgstr "Fensterfunktionen sind in Fensterdefinitionen nicht erlaubt" -#: parser/parse_agg.c:911 +#: parser/parse_agg.c:890 +#, fuzzy +#| msgid "window functions are not allowed in trigger WHEN conditions" +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "Fensterfunktionen sind in der WHEN-Bedingung eines Triggers nicht erlaubt" + +#: parser/parse_agg.c:914 msgid "window functions are not allowed in check constraints" msgstr "Fensterfunktionen sind in Check-Constraints nicht erlaubt" -#: parser/parse_agg.c:915 +#: parser/parse_agg.c:918 msgid "window functions are not allowed in DEFAULT expressions" msgstr "Fensterfunktionen sind in DEFAULT-Ausdrücken nicht erlaubt" -#: parser/parse_agg.c:918 +#: parser/parse_agg.c:921 msgid "window functions are not allowed in index expressions" msgstr "Fensterfunktionen sind in Indexausdrücken nicht erlaubt" -#: parser/parse_agg.c:921 +#: parser/parse_agg.c:924 msgid "window functions are not allowed in statistics expressions" msgstr "Fensterfunktionen sind in Statistikausdrücken nicht erlaubt" -#: parser/parse_agg.c:924 +#: parser/parse_agg.c:927 msgid "window functions are not allowed in index predicates" msgstr "Fensterfunktionen sind in Indexprädikaten nicht erlaubt" -#: parser/parse_agg.c:927 +#: parser/parse_agg.c:930 msgid "window functions are not allowed in transform expressions" msgstr "Fensterfunktionen sind in Umwandlungsausdrücken nicht erlaubt" -#: parser/parse_agg.c:930 +#: parser/parse_agg.c:933 msgid "window functions are not allowed in EXECUTE parameters" msgstr "Fensterfunktionen sind in EXECUTE-Parametern nicht erlaubt" -#: parser/parse_agg.c:933 +#: parser/parse_agg.c:936 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "Fensterfunktionen sind in der WHEN-Bedingung eines Triggers nicht erlaubt" -#: parser/parse_agg.c:936 +#: parser/parse_agg.c:939 msgid "window functions are not allowed in partition bound" msgstr "Fensterfunktionen sind in Partitionsbegrenzungen nicht erlaubt" -#: parser/parse_agg.c:939 +#: parser/parse_agg.c:942 msgid "window functions are not allowed in partition key expressions" msgstr "Fensterfunktionen sind in Partitionierungsschlüsselausdrücken nicht erlaubt" -#: parser/parse_agg.c:942 +#: parser/parse_agg.c:945 msgid "window functions are not allowed in CALL arguments" msgstr "Fensterfunktionen sind in CALL-Argumenten nicht erlaubt" -#: parser/parse_agg.c:945 +#: parser/parse_agg.c:948 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "Fensterfunktionen sind in COPY-FROM-WHERE-Bedingungen nicht erlaubt" -#: parser/parse_agg.c:948 +#: parser/parse_agg.c:951 msgid "window functions are not allowed in column generation expressions" msgstr "Fensterfunktionen sind in Spaltengenerierungsausdrücken nicht erlaubt" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:971 parser/parse_clause.c:1856 +#: parser/parse_agg.c:974 parser/parse_clause.c:1861 #, c-format msgid "window functions are not allowed in %s" msgstr "Fensterfunktionen sind in %s nicht erlaubt" -#: parser/parse_agg.c:1005 parser/parse_clause.c:2690 +#: parser/parse_agg.c:1008 parser/parse_clause.c:2694 #, c-format msgid "window \"%s\" does not exist" msgstr "Fenster »%s« existiert nicht" -#: parser/parse_agg.c:1089 +#: parser/parse_agg.c:1092 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "zu viele Grouping-Sets vorhanden (maximal 4096)" -#: parser/parse_agg.c:1229 +#: parser/parse_agg.c:1232 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "Aggregatfunktionen sind nicht im rekursiven Ausdruck einer rekursiven Anfrage erlaubt" -#: parser/parse_agg.c:1422 +#: parser/parse_agg.c:1425 #, c-format msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" msgstr "Spalte »%s.%s« muss in der GROUP-BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden" -#: parser/parse_agg.c:1425 +#: parser/parse_agg.c:1428 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "Direkte Argumente einer Ordered-Set-Aggregatfunktion dürfen nur gruppierte Spalten verwenden." -#: parser/parse_agg.c:1430 +#: parser/parse_agg.c:1433 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "Unteranfrage verwendet nicht gruppierte Spalte »%s.%s« aus äußerer Anfrage" -#: parser/parse_agg.c:1594 +#: parser/parse_agg.c:1597 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "Argumente von GROUPING müssen Gruppierausdrücke der zugehörigen Anfrageebene sein" @@ -15807,443 +16515,446 @@ msgstr "Argumente von GROUPING müssen Gruppierausdrücke der zugehörigen Anfra msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "Relation »%s« kann nicht das Ziel einer datenverändernden Anweisung sein" -#: parser/parse_clause.c:571 parser/parse_clause.c:599 parser/parse_func.c:2438 +#: parser/parse_clause.c:570 parser/parse_clause.c:598 parser/parse_func.c:2554 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "Funktionen mit Ergebnismenge müssen auf oberster Ebene von FROM erscheinen" -#: parser/parse_clause.c:611 +#: parser/parse_clause.c:610 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "mehrere Spaltendefinitionslisten für die selbe Funktion sind nicht erlaubt" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:643 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "ROWS FROM() mit mehreren Funktionen kann keine Spaltendefinitionsliste haben" -#: parser/parse_clause.c:645 +#: parser/parse_clause.c:644 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "Geben Sie innerhalb von ROWS FROM() jeder Funktion eine eigene Spaltendefinitionsliste." -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:650 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "UNNEST() mit mehreren Argumenten kann keine Spaltendefinitionsliste haben" -#: parser/parse_clause.c:652 +#: parser/parse_clause.c:651 #, c-format msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." msgstr "Verwenden Sie getrennte UNNEST()-Aufrufe innerhalb von ROWS FROM() und geben Sie jeder eine eigene Spaltendefinitionsliste." -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:658 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY kann nicht mit einer Spaltendefinitionsliste verwendet werden" -#: parser/parse_clause.c:660 +#: parser/parse_clause.c:659 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "Geben Sie die Spaltendefinitionsliste innerhalb von ROWS FROM() an." -#: parser/parse_clause.c:760 +#: parser/parse_clause.c:761 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "nur eine FOR-ORDINALITY-Spalte ist erlaubt" -#: parser/parse_clause.c:821 +#: parser/parse_clause.c:822 parser/parse_jsontable.c:445 #, c-format msgid "column name \"%s\" is not unique" msgstr "Spaltenname »%s« ist nicht eindeutig" -#: parser/parse_clause.c:863 +#: parser/parse_clause.c:864 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "Namensraumname »%s« ist nicht eindeutig" -#: parser/parse_clause.c:873 +#: parser/parse_clause.c:874 #, c-format msgid "only one default namespace is allowed" msgstr "nur ein Standardnamensraum ist erlaubt" -#: parser/parse_clause.c:933 +#: parser/parse_clause.c:934 #, c-format msgid "tablesample method %s does not exist" msgstr "Tablesample-Methode %s existiert nicht" -#: parser/parse_clause.c:955 +#: parser/parse_clause.c:956 #, c-format msgid "tablesample method %s requires %d argument, not %d" msgid_plural "tablesample method %s requires %d arguments, not %d" msgstr[0] "Tablesample-Methode %s benötigt %d Argument, nicht %d" msgstr[1] "Tablesample-Methode %s benötigt %d Argumente, nicht %d" -#: parser/parse_clause.c:989 +#: parser/parse_clause.c:990 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "Tablesample-Methode %s unterstützt REPEATABLE nicht" -#: parser/parse_clause.c:1135 +#: parser/parse_clause.c:1140 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "TABLESAMPLE-Klausel kann nur auf Tabellen und materialisierte Sichten angewendet werden" -#: parser/parse_clause.c:1325 +#: parser/parse_clause.c:1330 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "Spaltenname »%s« erscheint mehrmals in der USING-Klausel" -#: parser/parse_clause.c:1340 +#: parser/parse_clause.c:1345 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "gemeinsamer Spaltenname »%s« erscheint mehrmals in der linken Tabelle" -#: parser/parse_clause.c:1349 +#: parser/parse_clause.c:1354 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "Spalte »%s« aus der USING-Klausel existiert nicht in der linken Tabelle" -#: parser/parse_clause.c:1364 +#: parser/parse_clause.c:1369 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "gemeinsamer Spaltenname »%s« erscheint mehrmals in der rechten Tabelle" -#: parser/parse_clause.c:1373 +#: parser/parse_clause.c:1378 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "Spalte »%s« aus der USING-Klausel existiert nicht in der rechten Tabelle" -#: parser/parse_clause.c:1452 +#: parser/parse_clause.c:1457 #, c-format msgid "column alias list for \"%s\" has too many entries" msgstr "Spaltenaliasliste für »%s« hat zu viele Einträge" -#: parser/parse_clause.c:1792 +#: parser/parse_clause.c:1797 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" msgstr "Zeilenzahl in FETCH FIRST ... WITH TIES darf nicht NULL sein" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1817 +#: parser/parse_clause.c:1822 #, c-format msgid "argument of %s must not contain variables" msgstr "Argument von %s darf keine Variablen enthalten" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1982 +#: parser/parse_clause.c:1987 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "%s »%s« ist nicht eindeutig" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2011 +#: parser/parse_clause.c:2015 #, c-format msgid "non-integer constant in %s" msgstr "Konstante in %s ist keine ganze Zahl" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2033 +#: parser/parse_clause.c:2037 #, c-format msgid "%s position %d is not in select list" msgstr "%s Position %d ist nicht in der Select-Liste" -#: parser/parse_clause.c:2472 +#: parser/parse_clause.c:2476 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE ist auf 12 Elemente begrenzt" -#: parser/parse_clause.c:2678 +#: parser/parse_clause.c:2682 #, c-format msgid "window \"%s\" is already defined" msgstr "Fenster »%s« ist bereits definiert" -#: parser/parse_clause.c:2739 +#: parser/parse_clause.c:2743 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "PARTITION-BY-Klausel von Fenster »%s« kann nicht aufgehoben werden" -#: parser/parse_clause.c:2751 +#: parser/parse_clause.c:2755 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "ORDER-BY-Klausel von Fenster »%s« kann nicht aufgehoben werden" -#: parser/parse_clause.c:2781 parser/parse_clause.c:2787 +#: parser/parse_clause.c:2785 parser/parse_clause.c:2791 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "kann Fenster »%s« nicht kopieren, weil es eine Frame-Klausel hat" -#: parser/parse_clause.c:2789 +#: parser/parse_clause.c:2793 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Lassen Sie die Klammern in dieser OVER-Klausel weg." -#: parser/parse_clause.c:2809 +#: parser/parse_clause.c:2813 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "RANGE mit Offset PRECEDING/FOLLOWING benötigt genau eine ORDER-BY-Spalte" -#: parser/parse_clause.c:2832 +#: parser/parse_clause.c:2836 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "GROUPS-Modus erfordert eine ORDER-BY-Klausel" -#: parser/parse_clause.c:2902 +#: parser/parse_clause.c:2906 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "in einer Aggregatfunktion mit DISTINCT müssen ORDER-BY-Ausdrücke in der Argumentliste erscheinen" -#: parser/parse_clause.c:2903 +#: parser/parse_clause.c:2907 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "bei SELECT DISTINCT müssen ORDER-BY-Ausdrücke in der Select-Liste erscheinen" -#: parser/parse_clause.c:2935 +#: parser/parse_clause.c:2939 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "eine Aggregatfunktion mit DISTINCT muss mindestens ein Argument haben" -#: parser/parse_clause.c:2936 +#: parser/parse_clause.c:2940 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT muss mindestens eine Spalte haben" -#: parser/parse_clause.c:3002 parser/parse_clause.c:3034 +#: parser/parse_clause.c:3006 parser/parse_clause.c:3038 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "Ausdrücke in SELECT DISTINCT ON müssen mit den ersten Ausdrücken in ORDER BY übereinstimmen" -#: parser/parse_clause.c:3112 +#: parser/parse_clause.c:3116 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC ist in der ON-CONFLICT-Klausel nicht erlaubt" -#: parser/parse_clause.c:3118 +#: parser/parse_clause.c:3122 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST ist in der ON-CONFLICT-Klausel nicht erlaubt" -#: parser/parse_clause.c:3197 +#: parser/parse_clause.c:3201 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE benötigt Inferenzangabe oder Constraint-Namen" -#: parser/parse_clause.c:3198 +#: parser/parse_clause.c:3202 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Zum Bespiel ON CONFLICT (Spaltenname)." -#: parser/parse_clause.c:3209 +#: parser/parse_clause.c:3213 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT wird nicht mit Systemkatalogtabellen unterstützt" -#: parser/parse_clause.c:3217 +#: parser/parse_clause.c:3221 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT wird nicht unterstützt mit Tabelle »%s«, die als Katalogtabelle verwendet wird" -#: parser/parse_clause.c:3347 +#: parser/parse_clause.c:3351 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "Operator %s ist kein gültiger Sortieroperator" -#: parser/parse_clause.c:3349 +#: parser/parse_clause.c:3353 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "Sortieroperatoren müssen die Mitglieder »<« oder »>« einer »btree«-Operatorfamilie sein." -#: parser/parse_clause.c:3660 +#: parser/parse_clause.c:3664 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "RANGE mit Offset PRECEDING/FOLLOWING wird für Spaltentyp %s nicht unterstützt" -#: parser/parse_clause.c:3666 +#: parser/parse_clause.c:3670 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" msgstr "RANGE mit Offset PRECEDING/FOLLOWING wird für Spaltentyp %s und Offset-Typ %s nicht unterstützt" -#: parser/parse_clause.c:3669 +#: parser/parse_clause.c:3673 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Wandeln Sie den Offset-Wert in einen passenden Typ um." -#: parser/parse_clause.c:3674 +#: parser/parse_clause.c:3678 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" msgstr "RANGE mit Offset PRECEDING/FOLLOWING hat mehrere Interpretationen für Spaltentyp %s und Offset-Typ %s" -#: parser/parse_clause.c:3677 +#: parser/parse_clause.c:3681 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "Wandeln Sie den Offset-Wert in den genauen beabsichtigten Typ um." -#: parser/parse_coerce.c:1034 parser/parse_coerce.c:1072 -#: parser/parse_coerce.c:1090 parser/parse_coerce.c:1105 -#: parser/parse_expr.c:2055 parser/parse_expr.c:2649 parser/parse_target.c:995 +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 +#: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 +#: parser/parse_expr.c:2119 parser/parse_expr.c:2713 parser/parse_expr.c:3370 +#: parser/parse_expr.c:3603 parser/parse_expr.c:4439 parser/parse_target.c:994 #, c-format msgid "cannot cast type %s to %s" msgstr "kann Typ %s nicht in Typ %s umwandeln" -#: parser/parse_coerce.c:1075 +#: parser/parse_coerce.c:1091 #, c-format msgid "Input has too few columns." msgstr "Eingabe hat zu wenige Spalten." -#: parser/parse_coerce.c:1093 +#: parser/parse_coerce.c:1109 #, c-format msgid "Cannot cast type %s to %s in column %d." msgstr "Kann in Spalte %3$d Typ %1$s nicht in Typ %2$s umwandeln." -#: parser/parse_coerce.c:1108 +#: parser/parse_coerce.c:1124 #, c-format msgid "Input has too many columns." msgstr "Eingabe hat zu viele Spalten." #. translator: first %s is name of a SQL construct, eg WHERE #. translator: first %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1163 parser/parse_coerce.c:1211 +#: parser/parse_coerce.c:1179 parser/parse_coerce.c:1227 #, c-format msgid "argument of %s must be type %s, not type %s" msgstr "Argument von %s muss Typ %s haben, nicht Typ %s" #. translator: %s is name of a SQL construct, eg WHERE #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1174 parser/parse_coerce.c:1223 +#: parser/parse_coerce.c:1190 parser/parse_coerce.c:1239 #, c-format msgid "argument of %s must not return a set" msgstr "Argument von %s darf keine Ergebnismenge zurückgeben" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1363 +#: parser/parse_coerce.c:1383 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "%s-Typen %s und %s passen nicht zusammen" -#: parser/parse_coerce.c:1475 +#: parser/parse_coerce.c:1499 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "Argumenttypen %s und %s passen nicht zusammen" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1527 +#: parser/parse_coerce.c:1551 #, c-format msgid "%s could not convert type %s to %s" msgstr "%s konnte Typ %s nicht in %s umwandeln" -#: parser/parse_coerce.c:2089 parser/parse_coerce.c:2109 -#: parser/parse_coerce.c:2129 parser/parse_coerce.c:2149 -#: parser/parse_coerce.c:2204 parser/parse_coerce.c:2237 +#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 +#: parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 +#: parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 #, c-format msgid "arguments declared \"%s\" are not all alike" msgstr "als »%s« deklarierte Argumente sind nicht alle gleich" -#: parser/parse_coerce.c:2183 parser/parse_coerce.c:2297 -#: utils/fmgr/funcapi.c:489 +#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 +#: utils/fmgr/funcapi.c:558 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "als %s deklariertes Argument ist kein Array sondern Typ %s" -#: parser/parse_coerce.c:2216 parser/parse_coerce.c:2329 -#: utils/fmgr/funcapi.c:503 +#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 +#: utils/fmgr/funcapi.c:572 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "als %s deklariertes Argument ist kein Bereichstyp sondern Typ %s" -#: parser/parse_coerce.c:2250 parser/parse_coerce.c:2363 -#: utils/fmgr/funcapi.c:521 utils/fmgr/funcapi.c:586 +#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 +#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:590 utils/fmgr/funcapi.c:655 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "als %s deklariertes Argument ist kein Multirange-Typ sondern Typ %s" -#: parser/parse_coerce.c:2288 +#: parser/parse_coerce.c:2353 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "kann Elementtyp des Arguments mit Typ »anyarray« nicht bestimmen" -#: parser/parse_coerce.c:2314 parser/parse_coerce.c:2346 -#: parser/parse_coerce.c:2380 parser/parse_coerce.c:2400 +#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 +#: parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "als %s deklariertes Argument ist nicht mit als %s deklariertem Argument konsistent" -#: parser/parse_coerce.c:2427 +#: parser/parse_coerce.c:2474 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "konnte polymorphischen Typ nicht bestimmen, weil Eingabe Typ %s hat" -#: parser/parse_coerce.c:2441 +#: parser/parse_coerce.c:2488 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "mit »anynonarray« gepaarter Typ ist ein Array-Typ: %s" -#: parser/parse_coerce.c:2451 +#: parser/parse_coerce.c:2498 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "mit »anyenum« gepaarter Typ ist kein Enum-Typ: %s" -#: parser/parse_coerce.c:2482 parser/parse_coerce.c:2532 -#: parser/parse_coerce.c:2596 parser/parse_coerce.c:2643 +#: parser/parse_coerce.c:2559 +#, c-format +msgid "arguments of anycompatible family cannot be cast to a common type" +msgstr "Argumente der anycompatible-Familie können nicht in einen gemeinsamen Typ umgewandelt werden" + +#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 +#: parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 +#: parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "konnte polymorphischen Typ %s nicht bestimmen, weil Eingabe Typ %s hat" -#: parser/parse_coerce.c:2492 +#: parser/parse_coerce.c:2587 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "anycompatiblerange-Typ %s stimmt nicht mit anycompatible-Typ %s überein" -#: parser/parse_coerce.c:2506 +#: parser/parse_coerce.c:2608 +#, c-format +msgid "anycompatiblemultirange type %s does not match anycompatible type %s" +msgstr "anycompatiblemultirange-Typ %s stimmt nicht mit anycompatible-Typ %s überein" + +#: parser/parse_coerce.c:2622 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "mit »anycompatiblenonarray« gepaarter Typ ist ein Array-Typ: %s" -#: parser/parse_coerce.c:2607 parser/parse_coerce.c:2658 -#: utils/fmgr/funcapi.c:614 +#: parser/parse_coerce.c:2857 #, c-format -msgid "could not find multirange type for data type %s" -msgstr "konnte Multirange-Typ für Datentyp %s nicht finden" - -#: parser/parse_coerce.c:2739 -#, fuzzy, c-format -#| msgid "A result of type %s requires at least one input of type %s." msgid "A result of type %s requires at least one input of type anyrange or anymultirange." -msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ %s." +msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anyrange oder anymultirange." -#: parser/parse_coerce.c:2756 -#, fuzzy, c-format -#| msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, or anycompatiblerange." +#: parser/parse_coerce.c:2874 +#, c-format msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." -msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anycompatible, anycompatiblearray, anycompatiblenonarray oder anycompatiblerange." +msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anycompatiblerange oder anycompatiblemultirange." -#: parser/parse_coerce.c:2768 -#, fuzzy, c-format -#| msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, or anyrange." +#: parser/parse_coerce.c:2886 +#, c-format msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." -msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anyelement, anyarray, anynonarray, anyenum oder anyrange." +msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anyelement, anyarray, anynonarray, anyenum, anyrange oder anymultirange." -#: parser/parse_coerce.c:2780 +#: parser/parse_coerce.c:2898 #, c-format -msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, or anycompatiblerange." -msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anycompatible, anycompatiblearray, anycompatiblenonarray oder anycompatiblerange." +msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." +msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange oder anycompatiblemultirange." -#: parser/parse_coerce.c:2810 +#: parser/parse_coerce.c:2928 msgid "A result of type internal requires at least one input of type internal." msgstr "Ein Ergebnis mit Typ internal benötigt mindestens eine Eingabe mit Typ internal." #: parser/parse_collate.c:228 parser/parse_collate.c:475 -#: parser/parse_collate.c:1004 +#: parser/parse_collate.c:1012 #, c-format msgid "collation mismatch between implicit collations \"%s\" and \"%s\"" msgstr "implizite Sortierfolgen »%s« und »%s« stimmen nicht überein" #: parser/parse_collate.c:231 parser/parse_collate.c:478 -#: parser/parse_collate.c:1007 +#: parser/parse_collate.c:1015 #, c-format msgid "You can choose the collation by applying the COLLATE clause to one or both expressions." msgstr "Sie können die Sortierfolge auswählen, indem Sie die COLLATE-Klausel auf einen oder beide Ausdrücke anwenden." -#: parser/parse_collate.c:854 +#: parser/parse_collate.c:862 #, c-format msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" msgstr "explizite Sortierfolgen »%s« und »%s« stimmen nicht überein" @@ -16418,574 +17129,788 @@ msgstr "FOR UPDATE/SHARE in einer rekursiven Anfrage ist nicht implementiert" msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "rekursiver Verweis auf Anfrage »%s« darf nicht mehrmals erscheinen" -#: parser/parse_expr.c:287 +#: parser/parse_expr.c:300 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT ist in diesem Zusammenhang nicht erlaubt" -#: parser/parse_expr.c:340 parser/parse_relation.c:3592 -#: parser/parse_relation.c:3612 +#: parser/parse_expr.c:397 parser/parse_relation.c:3608 +#: parser/parse_relation.c:3628 #, c-format msgid "column %s.%s does not exist" msgstr "Spalte %s.%s existiert nicht" -#: parser/parse_expr.c:352 +#: parser/parse_expr.c:409 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "Spalte »%s« nicht gefunden im Datentyp %s" -#: parser/parse_expr.c:358 +#: parser/parse_expr.c:415 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "konnte Spalte »%s« im Record-Datentyp nicht identifizieren" -#: parser/parse_expr.c:364 +#: parser/parse_expr.c:421 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "Spaltenschreibweise .%s mit Typ %s verwendet, der kein zusammengesetzter Typ ist" -#: parser/parse_expr.c:395 parser/parse_target.c:740 +#: parser/parse_expr.c:452 parser/parse_target.c:739 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "Zeilenexpansion mit »*« wird hier nicht unterstützt" -#: parser/parse_expr.c:516 +#: parser/parse_expr.c:574 msgid "cannot use column reference in DEFAULT expression" msgstr "Spaltenverweise können nicht in DEFAULT-Ausdrücken verwendet werden" -#: parser/parse_expr.c:519 +#: parser/parse_expr.c:577 msgid "cannot use column reference in partition bound expression" msgstr "Spaltenverweise können nicht in Partitionsbegrenzungsausdrücken verwendet werden" -#: parser/parse_expr.c:788 parser/parse_relation.c:807 -#: parser/parse_relation.c:889 parser/parse_target.c:1235 +#: parser/parse_expr.c:846 parser/parse_relation.c:818 +#: parser/parse_relation.c:900 parser/parse_target.c:1234 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "Spaltenverweis »%s« ist nicht eindeutig" -#: parser/parse_expr.c:844 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_expr.c:902 parser/parse_param.c:110 parser/parse_param.c:142 #: parser/parse_param.c:208 parser/parse_param.c:307 #, c-format msgid "there is no parameter $%d" msgstr "es gibt keinen Parameter $%d" -#: parser/parse_expr.c:1044 +#: parser/parse_expr.c:1102 #, c-format msgid "NULLIF requires = operator to yield boolean" msgstr "NULLIF erfordert, dass Operator = boolean ergibt" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1050 parser/parse_expr.c:2965 +#: parser/parse_expr.c:1108 parser/parse_expr.c:3029 #, c-format msgid "%s must not return a set" msgstr "%s darf keine Ergebnismenge zurückgeben" -#: parser/parse_expr.c:1430 parser/parse_expr.c:1462 +#: parser/parse_expr.c:1493 parser/parse_expr.c:1525 #, c-format msgid "number of columns does not match number of values" msgstr "Anzahl der Spalten stimmt nicht mit der Anzahl der Werte überein" -#: parser/parse_expr.c:1476 +#: parser/parse_expr.c:1539 #, c-format msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" msgstr "die Quelle für ein UPDATE-Element mit mehreren Spalten muss ein Sub-SELECT oder ein ROW()-Ausdruck sein" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1671 parser/parse_expr.c:2144 parser/parse_func.c:2560 +#: parser/parse_expr.c:1734 parser/parse_expr.c:2208 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "Funktionen mit Ergebnismenge sind in %s nicht erlaubt" -#: parser/parse_expr.c:1733 +#: parser/parse_expr.c:1797 msgid "cannot use subquery in check constraint" msgstr "Unteranfragen können nicht in Check-Constraints verwendet werden" -#: parser/parse_expr.c:1737 +#: parser/parse_expr.c:1801 msgid "cannot use subquery in DEFAULT expression" msgstr "Unteranfragen können nicht in DEFAULT-Ausdrücken verwendet werden" -#: parser/parse_expr.c:1740 +#: parser/parse_expr.c:1804 msgid "cannot use subquery in index expression" msgstr "Unteranfragen können nicht in Indexausdrücken verwendet werden" -#: parser/parse_expr.c:1743 +#: parser/parse_expr.c:1807 msgid "cannot use subquery in index predicate" msgstr "Unteranfragen können nicht im Indexprädikat verwendet werden" -#: parser/parse_expr.c:1746 +#: parser/parse_expr.c:1810 msgid "cannot use subquery in statistics expression" msgstr "Unteranfragen können nicht in Statistikausdrücken verwendet werden" -#: parser/parse_expr.c:1749 +#: parser/parse_expr.c:1813 msgid "cannot use subquery in transform expression" msgstr "Unteranfragen können in Umwandlungsausdrücken nicht verwendet werden" -#: parser/parse_expr.c:1752 +#: parser/parse_expr.c:1816 msgid "cannot use subquery in EXECUTE parameter" msgstr "Unteranfragen können nicht in EXECUTE-Parameter verwendet werden" -#: parser/parse_expr.c:1755 +#: parser/parse_expr.c:1819 msgid "cannot use subquery in trigger WHEN condition" msgstr "Unteranfragen können nicht in der WHEN-Bedingung eines Triggers verwendet werden" -#: parser/parse_expr.c:1758 +#: parser/parse_expr.c:1822 msgid "cannot use subquery in partition bound" msgstr "Unteranfragen können nicht in Partitionsbegrenzungen verwendet werden" -#: parser/parse_expr.c:1761 +#: parser/parse_expr.c:1825 msgid "cannot use subquery in partition key expression" msgstr "Unteranfragen können nicht in Partitionierungsschlüsselausdrücken verwendet werden" -#: parser/parse_expr.c:1764 +#: parser/parse_expr.c:1828 msgid "cannot use subquery in CALL argument" msgstr "Unteranfragen können nicht in CALL-Argument verwendet werden" -#: parser/parse_expr.c:1767 +#: parser/parse_expr.c:1831 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "Unteranfragen können nicht in COPY-FROM-WHERE-Bedingungen verwendet werden" -#: parser/parse_expr.c:1770 +#: parser/parse_expr.c:1834 msgid "cannot use subquery in column generation expression" msgstr "Unteranfragen können nicht in Spaltengenerierungsausdrücken verwendet werden" -#: parser/parse_expr.c:1823 +#: parser/parse_expr.c:1887 parser/parse_expr.c:3716 #, c-format msgid "subquery must return only one column" msgstr "Unteranfrage darf nur eine Spalte zurückgeben" -#: parser/parse_expr.c:1894 +#: parser/parse_expr.c:1958 #, c-format msgid "subquery has too many columns" msgstr "Unteranfrage hat zu viele Spalten" -#: parser/parse_expr.c:1899 +#: parser/parse_expr.c:1963 #, c-format msgid "subquery has too few columns" msgstr "Unteranfrage hat zu wenige Spalten" -#: parser/parse_expr.c:1995 +#: parser/parse_expr.c:2059 #, c-format msgid "cannot determine type of empty array" msgstr "kann Typ eines leeren Arrays nicht bestimmen" -#: parser/parse_expr.c:1996 +#: parser/parse_expr.c:2060 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "Wandeln Sie ausdrücklich in den gewünschten Typ um, zum Beispiel ARRAY[]::integer[]." -#: parser/parse_expr.c:2010 +#: parser/parse_expr.c:2074 #, c-format msgid "could not find element type for data type %s" msgstr "konnte Elementtyp für Datentyp %s nicht finden" -#: parser/parse_expr.c:2290 +#: parser/parse_expr.c:2354 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "unbenannter XML-Attributwert muss ein Spaltenverweis sein" -#: parser/parse_expr.c:2291 +#: parser/parse_expr.c:2355 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "unbenannter XML-Elementwert muss ein Spaltenverweis sein" -#: parser/parse_expr.c:2306 +#: parser/parse_expr.c:2370 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "XML-Attributname »%s« einscheint mehrmals" -#: parser/parse_expr.c:2413 +#: parser/parse_expr.c:2477 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "kann das Ergebnis von XMLSERIALIZE nicht in Typ %s umwandeln" -#: parser/parse_expr.c:2722 parser/parse_expr.c:2918 +#: parser/parse_expr.c:2786 parser/parse_expr.c:2982 #, c-format msgid "unequal number of entries in row expressions" msgstr "ungleiche Anzahl Einträge in Zeilenausdrücken" -#: parser/parse_expr.c:2732 +#: parser/parse_expr.c:2796 #, c-format msgid "cannot compare rows of zero length" msgstr "kann Zeilen mit Länge null nicht vergleichen" -#: parser/parse_expr.c:2757 +#: parser/parse_expr.c:2821 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "Zeilenvergleichsoperator muss Typ boolean zurückgeben, nicht Typ %s" -#: parser/parse_expr.c:2764 +#: parser/parse_expr.c:2828 #, c-format msgid "row comparison operator must not return a set" msgstr "Zeilenvergleichsoperator darf keine Ergebnismenge zurückgeben" -#: parser/parse_expr.c:2823 parser/parse_expr.c:2864 +#: parser/parse_expr.c:2887 parser/parse_expr.c:2928 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "konnte Interpretation des Zeilenvergleichsoperators %s nicht bestimmen" -#: parser/parse_expr.c:2825 +#: parser/parse_expr.c:2889 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "Zeilenvergleichsoperatoren müssen einer »btree«-Operatorfamilie zugeordnet sein." -#: parser/parse_expr.c:2866 +#: parser/parse_expr.c:2930 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Es gibt mehrere gleichermaßen plausible Kandidaten." -#: parser/parse_expr.c:2959 +#: parser/parse_expr.c:3023 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "IS DISTINCT FROM erfordert, dass Operator = boolean ergibt" -#: parser/parse_func.c:192 +#: parser/parse_expr.c:3275 +#, c-format +msgid "JSON ENCODING clause is only allowed for bytea input type" +msgstr "" + +#: parser/parse_expr.c:3282 +#, c-format +msgid "FORMAT JSON has no effect for json and jsonb types" +msgstr "" + +#: parser/parse_expr.c:3337 +#, c-format +msgid "cannot use non-string types with implicit FORMAT JSON clause" +msgstr "" + +#: parser/parse_expr.c:3441 +#, fuzzy, c-format +#| msgid "cannot cast jsonb string to type %s" +msgid "cannot use JSON format with non-string output types" +msgstr "kann jsonb-Zeichenkette nicht in Typ %s umwandeln" + +#: parser/parse_expr.c:3454 +#, c-format +msgid "cannot set JSON encoding for non-bytea output types" +msgstr "" + +#: parser/parse_expr.c:3459 +#, fuzzy, c-format +#| msgid "unsupported format code: %d" +msgid "unsupported JSON encoding" +msgstr "nicht unterstützter Formatcode: %d" + +#: parser/parse_expr.c:3460 +#, c-format +msgid "only UTF8 JSON encoding is supported" +msgstr "" + +#: parser/parse_expr.c:3497 +#, fuzzy, c-format +#| msgid "return type %s is not supported for SQL functions" +msgid "returning SETOF types is not supported in SQL/JSON functions" +msgstr "Rückgabetyp %s wird von SQL-Funktionen nicht unterstützt" + +#: parser/parse_expr.c:3797 parser/parse_func.c:864 +#, c-format +msgid "aggregate ORDER BY is not implemented for window functions" +msgstr "ORDER BY in Aggregatfunktion ist für Fensterfunktionen nicht implementiert" + +#: parser/parse_expr.c:4014 +#, c-format +msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" +msgstr "" + +#: parser/parse_expr.c:4034 +#, fuzzy, c-format +#| msgid "cannot use subquery in index predicate" +msgid "cannot use type %s in IS JSON predicate" +msgstr "Unteranfragen können nicht im Indexprädikat verwendet werden" + +#: parser/parse_expr.c:4100 +#, fuzzy, c-format +#| msgid "SELECT ... INTO is not allowed here" +msgid "JSON_TABLE path name is not allowed here" +msgstr "SELECT ... INTO ist hier nicht erlaubt" + +#: parser/parse_expr.c:4127 +#, fuzzy, c-format +#| msgid "argument of %s must be type %s, not type %s" +msgid "JSON path expression must be type %s, not type %s" +msgstr "Argument von %s muss Typ %s haben, nicht Typ %s" + +#: parser/parse_expr.c:4289 +#, fuzzy, c-format +#| msgid "cannot cast type %s to %s" +msgid "cannot cast DEFAULT expression type %s to %s" +msgstr "kann Typ %s nicht in Typ %s umwandeln" + +#: parser/parse_expr.c:4458 +#, fuzzy, c-format +#| msgid "policies not yet implemented for this command" +msgid "JSON_TABLE() is not yet implemented for the json type" +msgstr "Policys sind für diesen Befehl noch nicht implementiert" + +#: parser/parse_expr.c:4459 parser/parse_expr.c:4469 +#, fuzzy, c-format +#| msgid "query string argument of EXECUTE is null" +msgid "Try casting the argument to jsonb" +msgstr "Anfrageargument von EXECUTE ist NULL" + +#: parser/parse_expr.c:4468 +#, fuzzy, c-format +#| msgid "policies not yet implemented for this command" +msgid "%s() is not yet implemented for the json type" +msgstr "Policys sind für diesen Befehl noch nicht implementiert" + +#: parser/parse_expr.c:4489 +#, fuzzy, c-format +#| msgid "cannot cast type %s to %s" +msgid "cannot use RETURNING type %s in %s" +msgstr "kann Typ %s nicht in Typ %s umwandeln" + +#: parser/parse_expr.c:4532 +#, c-format +msgid "cannot use non-string types with WITH UNIQUE KEYS clause" +msgstr "" + +#: parser/parse_func.c:194 #, c-format msgid "argument name \"%s\" used more than once" msgstr "Argumentname »%s« mehrmals angegeben" -#: parser/parse_func.c:203 +#: parser/parse_func.c:205 #, c-format msgid "positional argument cannot follow named argument" msgstr "Positionsargument kann nicht hinter benanntem Argument stehen" -#: parser/parse_func.c:286 parser/parse_func.c:2257 +#: parser/parse_func.c:287 parser/parse_func.c:2369 #, c-format msgid "%s is not a procedure" msgstr "%s ist keine Prozedur" -#: parser/parse_func.c:290 +#: parser/parse_func.c:291 #, c-format msgid "To call a function, use SELECT." msgstr "Um eine Funktion aufzurufen, verwenden Sie SELECT." -#: parser/parse_func.c:296 +#: parser/parse_func.c:297 #, c-format msgid "%s is a procedure" msgstr "%s ist eine Prozedur" -#: parser/parse_func.c:300 +#: parser/parse_func.c:301 #, c-format msgid "To call a procedure, use CALL." msgstr "Um eine Prozedur aufzurufen, verwenden Sie CALL." -#: parser/parse_func.c:314 +#: parser/parse_func.c:315 #, c-format msgid "%s(*) specified, but %s is not an aggregate function" msgstr "%s(*) angegeben, aber %s ist keine Aggregatfunktion" -#: parser/parse_func.c:321 +#: parser/parse_func.c:322 #, c-format msgid "DISTINCT specified, but %s is not an aggregate function" msgstr "DISTINCT wurde angegeben, aber %s ist keine Aggregatfunktion" -#: parser/parse_func.c:327 +#: parser/parse_func.c:328 #, c-format msgid "WITHIN GROUP specified, but %s is not an aggregate function" msgstr "WITHIN GROUP wurde angegeben, aber %s ist keine Aggregatfunktion" -#: parser/parse_func.c:333 +#: parser/parse_func.c:334 #, c-format msgid "ORDER BY specified, but %s is not an aggregate function" msgstr "ORDER BY angegeben, aber %s ist keine Aggregatfunktion" -#: parser/parse_func.c:339 +#: parser/parse_func.c:340 #, c-format msgid "FILTER specified, but %s is not an aggregate function" msgstr "FILTER wurde angegeben, aber %s ist keine Aggregatfunktion" -#: parser/parse_func.c:345 +#: parser/parse_func.c:346 #, c-format msgid "OVER specified, but %s is not a window function nor an aggregate function" msgstr "OVER angegeben, aber %s ist keine Fensterfunktion oder Aggregatfunktion" -#: parser/parse_func.c:383 +#: parser/parse_func.c:384 #, c-format msgid "WITHIN GROUP is required for ordered-set aggregate %s" msgstr "WITHIN GROUP muss angegeben werden für Ordered-Set-Aggregatfunktion %s" -#: parser/parse_func.c:389 +#: parser/parse_func.c:390 #, c-format msgid "OVER is not supported for ordered-set aggregate %s" msgstr "OVER wird für Ordered-Set-Aggregatfunktion %s nicht unterstützt" -#: parser/parse_func.c:420 parser/parse_func.c:451 +#: parser/parse_func.c:421 parser/parse_func.c:452 #, c-format msgid "There is an ordered-set aggregate %s, but it requires %d direct argument, not %d." msgid_plural "There is an ordered-set aggregate %s, but it requires %d direct arguments, not %d." msgstr[0] "Es gibt eine Ordered-Set-Aggregatfunktion %s, aber sie benötigt %d direktes Argument, nicht %d." msgstr[1] "Es gibt eine Ordered-Set-Aggregatfunktion %s, aber sie benötigt %d direkte Argumente, nicht %d." -#: parser/parse_func.c:478 +#: parser/parse_func.c:479 #, c-format msgid "To use the hypothetical-set aggregate %s, the number of hypothetical direct arguments (here %d) must match the number of ordering columns (here %d)." msgstr "Um die Hypothetical-Set-Aggregatfunktion %s zu verwenden, muss die Anzahl der hypothetischen direkten Argumente (hier %d) mit der Anzahl der Sortierspalten (hier %d) übereinstimmen." -#: parser/parse_func.c:492 +#: parser/parse_func.c:493 #, c-format msgid "There is an ordered-set aggregate %s, but it requires at least %d direct argument." msgid_plural "There is an ordered-set aggregate %s, but it requires at least %d direct arguments." msgstr[0] "Es gibt eine Ordered-Set-Aggregatfunktion %s, aber sie benötigt mindestens %d direktes Argument." msgstr[1] "Es gibt eine Ordered-Set-Aggregatfunktion %s, aber sie benötigt mindestens %d direkte Argumente." -#: parser/parse_func.c:513 +#: parser/parse_func.c:514 #, c-format msgid "%s is not an ordered-set aggregate, so it cannot have WITHIN GROUP" msgstr "%s ist keine Ordered-Set-Aggregatfunktion und kann deshalb kein WITHIN GROUP haben" -#: parser/parse_func.c:526 +#: parser/parse_func.c:527 #, c-format msgid "window function %s requires an OVER clause" msgstr "Fensterfunktion %s erfordert eine OVER-Klausel" -#: parser/parse_func.c:533 +#: parser/parse_func.c:534 #, c-format msgid "window function %s cannot have WITHIN GROUP" msgstr "Fensterfunktion %s kann kein WITHIN GROUP haben" -#: parser/parse_func.c:562 +#: parser/parse_func.c:563 #, c-format msgid "procedure %s is not unique" msgstr "Prozedur %s ist nicht eindeutig" -#: parser/parse_func.c:565 +#: parser/parse_func.c:566 #, c-format msgid "Could not choose a best candidate procedure. You might need to add explicit type casts." msgstr "Konnte keine beste Kandidatprozedur auswählen. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen." -#: parser/parse_func.c:571 +#: parser/parse_func.c:572 #, c-format msgid "function %s is not unique" msgstr "Funktion %s ist nicht eindeutig" -#: parser/parse_func.c:574 +#: parser/parse_func.c:575 #, c-format msgid "Could not choose a best candidate function. You might need to add explicit type casts." msgstr "Konnte keine beste Kandidatfunktion auswählen. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen." -#: parser/parse_func.c:613 +#: parser/parse_func.c:614 #, c-format msgid "No aggregate function matches the given name and argument types. Perhaps you misplaced ORDER BY; ORDER BY must appear after all regular arguments of the aggregate." msgstr "Keine Aggregatfunktion stimmt mit dem angegebenen Namen und den Argumenttypen überein. Mõglicherweise steht ORDER BY an der falschen Stelle; ORDER BY muss hinter allen normalen Argumenten der Aggregatfunktion stehen." -#: parser/parse_func.c:621 parser/parse_func.c:2300 +#: parser/parse_func.c:622 parser/parse_func.c:2412 #, c-format msgid "procedure %s does not exist" msgstr "Prozedur %s existiert nicht" -#: parser/parse_func.c:624 +#: parser/parse_func.c:625 #, c-format msgid "No procedure matches the given name and argument types. You might need to add explicit type casts." msgstr "Keine Prozedur stimmt mit dem angegebenen Namen und den Argumenttypen überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen." -#: parser/parse_func.c:633 +#: parser/parse_func.c:634 #, c-format msgid "No function matches the given name and argument types. You might need to add explicit type casts." msgstr "Keine Funktion stimmt mit dem angegebenen Namen und den Argumenttypen überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen." -#: parser/parse_func.c:735 +#: parser/parse_func.c:736 #, c-format msgid "VARIADIC argument must be an array" msgstr "VARIADIC-Argument muss ein Array sein" -#: parser/parse_func.c:789 parser/parse_func.c:853 +#: parser/parse_func.c:790 parser/parse_func.c:854 #, c-format msgid "%s(*) must be used to call a parameterless aggregate function" msgstr "beim Aufruf einer parameterlosen Aggregatfunktion muss %s(*) angegeben werden" -#: parser/parse_func.c:796 +#: parser/parse_func.c:797 #, c-format msgid "aggregates cannot return sets" msgstr "Aggregatfunktionen können keine Ergebnismengen zurückgeben" -#: parser/parse_func.c:811 +#: parser/parse_func.c:812 #, c-format msgid "aggregates cannot use named arguments" msgstr "Aggregatfunktionen können keine benannten Argumente verwenden" -#: parser/parse_func.c:843 +#: parser/parse_func.c:844 #, c-format msgid "DISTINCT is not implemented for window functions" msgstr "DISTINCT ist für Fensterfunktionen nicht implementiert" -#: parser/parse_func.c:863 -#, c-format -msgid "aggregate ORDER BY is not implemented for window functions" -msgstr "ORDER BY in Aggregatfunktion ist für Fensterfunktionen nicht implementiert" - -#: parser/parse_func.c:872 +#: parser/parse_func.c:873 #, c-format msgid "FILTER is not implemented for non-aggregate window functions" msgstr "FILTER ist für Fensterfunktionen, die keine Aggregatfunktionen sind, nicht implementiert" -#: parser/parse_func.c:881 +#: parser/parse_func.c:882 #, c-format msgid "window function calls cannot contain set-returning function calls" msgstr "Aufrufe von Fensterfunktionen können keine Aufrufe von Funktionen mit Ergebnismenge enthalten" -#: parser/parse_func.c:889 +#: parser/parse_func.c:890 #, c-format msgid "window functions cannot return sets" msgstr "Fensterfunktionen können keine Ergebnismengen zurückgeben" -#: parser/parse_func.c:2138 parser/parse_func.c:2329 +#: parser/parse_func.c:2168 parser/parse_func.c:2441 #, c-format msgid "could not find a function named \"%s\"" msgstr "konnte keine Funktion namens »%s« finden" -#: parser/parse_func.c:2152 parser/parse_func.c:2347 +#: parser/parse_func.c:2182 parser/parse_func.c:2459 #, c-format msgid "function name \"%s\" is not unique" msgstr "Funktionsname »%s« ist nicht eindeutig" -#: parser/parse_func.c:2154 parser/parse_func.c:2349 +#: parser/parse_func.c:2184 parser/parse_func.c:2462 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "Geben Sie eine Argumentliste an, um die Funktion eindeutig auszuwählen." -#: parser/parse_func.c:2198 +#: parser/parse_func.c:2228 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" msgstr[0] "Prozeduren können nicht mehr als %d Argument haben" msgstr[1] "Prozeduren können nicht mehr als %d Argumente haben" -#: parser/parse_func.c:2247 +#: parser/parse_func.c:2359 #, c-format msgid "%s is not a function" msgstr "%s ist keine Funktion" -#: parser/parse_func.c:2267 +#: parser/parse_func.c:2379 #, c-format msgid "function %s is not an aggregate" msgstr "Funktion %s ist keine Aggregatfunktion" -#: parser/parse_func.c:2295 +#: parser/parse_func.c:2407 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "konnte keine Prozedur namens »%s« finden" -#: parser/parse_func.c:2309 +#: parser/parse_func.c:2421 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "konnte keine Aggregatfunktion namens »%s« finden" -#: parser/parse_func.c:2314 +#: parser/parse_func.c:2426 #, c-format msgid "aggregate %s(*) does not exist" msgstr "Aggregatfunktion %s(*) existiert nicht" -#: parser/parse_func.c:2319 +#: parser/parse_func.c:2431 #, c-format msgid "aggregate %s does not exist" msgstr "Aggregatfunktion %s existiert nicht" -#: parser/parse_func.c:2354 +#: parser/parse_func.c:2467 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "Prozedurname »%s« ist nicht eindeutig" -#: parser/parse_func.c:2356 +#: parser/parse_func.c:2470 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "Geben Sie eine Argumentliste an, um die Prozedur eindeutig auszuwählen." -#: parser/parse_func.c:2361 +#: parser/parse_func.c:2475 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "Aggregatfunktionsname »%s« ist nicht eindeutig" -#: parser/parse_func.c:2363 +#: parser/parse_func.c:2478 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "Geben Sie eine Argumentliste an, um die Aggregatfunktion eindeutig auszuwählen." -#: parser/parse_func.c:2368 +#: parser/parse_func.c:2483 #, c-format msgid "routine name \"%s\" is not unique" msgstr "Routinenname »%s« ist nicht eindeutig" -#: parser/parse_func.c:2370 +#: parser/parse_func.c:2486 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "Geben Sie eine Argumentliste an, um die Routine eindeutig auszuwählen." -#: parser/parse_func.c:2425 +#: parser/parse_func.c:2541 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "Funktionen mit Ergebnismenge sind in JOIN-Bedingungen nicht erlaubt" -#: parser/parse_func.c:2446 +#: parser/parse_func.c:2562 msgid "set-returning functions are not allowed in policy expressions" msgstr "Funktionen mit Ergebnismenge sind in Policy-Ausdrücken nicht erlaubt" -#: parser/parse_func.c:2462 +#: parser/parse_func.c:2578 msgid "set-returning functions are not allowed in window definitions" msgstr "Funktionen mit Ergebnismenge sind in Fensterdefinitionen nicht erlaubt" -#: parser/parse_func.c:2500 +#: parser/parse_func.c:2615 +#, fuzzy +#| msgid "set-returning functions are not allowed in trigger WHEN conditions" +msgid "set-returning functions are not allowed in MERGE WHEN conditions" +msgstr "Funktionen mit Ergebnismenge sind in der WHEN-Bedingung eines Triggers nicht erlaubt" + +#: parser/parse_func.c:2619 msgid "set-returning functions are not allowed in check constraints" msgstr "Funktionen mit Ergebnismenge sind in Check-Constraints nicht erlaubt" -#: parser/parse_func.c:2504 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "Funktionen mit Ergebnismenge sind in DEFAULT-Ausdrücken nicht erlaubt" -#: parser/parse_func.c:2507 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index expressions" msgstr "Funktionen mit Ergebnismenge sind in Indexausdrücken nicht erlaubt" -#: parser/parse_func.c:2510 +#: parser/parse_func.c:2629 msgid "set-returning functions are not allowed in index predicates" msgstr "Funktionen mit Ergebnismenge sind in Indexprädikaten nicht erlaubt" -#: parser/parse_func.c:2513 +#: parser/parse_func.c:2632 msgid "set-returning functions are not allowed in statistics expressions" msgstr "Funktionen mit Ergebnismenge sind in Statistikausdrücken nicht erlaubt" -#: parser/parse_func.c:2516 +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in transform expressions" msgstr "Funktionen mit Ergebnismenge sind in Umwandlungsausdrücken nicht erlaubt" -#: parser/parse_func.c:2519 +#: parser/parse_func.c:2638 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "Funktionen mit Ergebnismenge sind in EXECUTE-Parametern nicht erlaubt" -#: parser/parse_func.c:2522 +#: parser/parse_func.c:2641 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "Funktionen mit Ergebnismenge sind in der WHEN-Bedingung eines Triggers nicht erlaubt" -#: parser/parse_func.c:2525 +#: parser/parse_func.c:2644 msgid "set-returning functions are not allowed in partition bound" msgstr "Funktionen mit Ergebnismenge sind in Partitionsbegrenzungen nicht erlaubt" -#: parser/parse_func.c:2528 +#: parser/parse_func.c:2647 msgid "set-returning functions are not allowed in partition key expressions" msgstr "Funktionen mit Ergebnismenge sind in Partitionierungsschlüsselausdrücken nicht erlaubt" -#: parser/parse_func.c:2531 +#: parser/parse_func.c:2650 msgid "set-returning functions are not allowed in CALL arguments" msgstr "Funktionen mit Ergebnismenge sind in CALL-Argumenten nicht erlaubt" -#: parser/parse_func.c:2534 +#: parser/parse_func.c:2653 msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" msgstr "Funktionen mit Ergebnismenge sind in COPY-FROM-WHERE-Bedingungen nicht erlaubt" -#: parser/parse_func.c:2537 +#: parser/parse_func.c:2656 msgid "set-returning functions are not allowed in column generation expressions" msgstr "Funktionen mit Ergebnismenge sind in Spaltengenerierungsausdrücken nicht erlaubt" -#: parser/parse_node.c:87 +#: parser/parse_jsontable.c:143 +#, c-format +msgid "duplicate JSON_TABLE column name: %s" +msgstr "" + +#: parser/parse_jsontable.c:144 +#, c-format +msgid "JSON_TABLE column names must be distinct from one another" +msgstr "" + +#: parser/parse_jsontable.c:247 +#, c-format +msgid "nested JSON_TABLE columns must contain an explicit AS pathname specification if an explicit PLAN clause is used" +msgstr "" + +#: parser/parse_jsontable.c:260 parser/parse_jsontable.c:271 +#: parser/parse_jsontable.c:387 parser/parse_jsontable.c:591 +#: parser/parse_jsontable.c:610 +#, fuzzy, c-format +#| msgid "invalid OWNED BY option" +msgid "invalid JSON_TABLE plan" +msgstr "ungültige OWNED BY Option" + +#: parser/parse_jsontable.c:261 +#, c-format +msgid "plan node for nested path %s was not found in plan" +msgstr "" + +#: parser/parse_jsontable.c:272 +#, c-format +msgid "plan node contains some extra or duplicate sibling nodes" +msgstr "" + +#: parser/parse_jsontable.c:388 +#, fuzzy, c-format +#| msgid "old database \"%s\" not found in the new cluster\n" +msgid "path name was %s not found in nested columns list" +msgstr "alte Datenbank »%s« nicht im neuen Cluster gefunden\n" + +#: parser/parse_jsontable.c:477 +#, c-format +msgid "cannot use WITH WRAPPER clause with scalar columns" +msgstr "" + +#: parser/parse_jsontable.c:482 +#, c-format +msgid "cannot use OMIT QUOTES clause with scalar columns" +msgstr "" + +#: parser/parse_jsontable.c:569 +#, fuzzy, c-format +#| msgid "invalid regular expression: %s" +msgid "invalid JSON_TABLE expression" +msgstr "ungültiger regulärer Ausdruck: %s" + +#: parser/parse_jsontable.c:570 +#, c-format +msgid "JSON_TABLE columns must contain explicit AS pathname specification if explicit PLAN clause is used" +msgstr "" + +#: parser/parse_jsontable.c:592 +#, c-format +msgid "expected INNER or OUTER JSON_TABLE plan node" +msgstr "" + +#: parser/parse_jsontable.c:611 +#, c-format +msgid "path name mismatch: expected %s but %s is given" +msgstr "" + +#: parser/parse_jsontable.c:712 +#, c-format +msgid "only string constants supported in JSON_TABLE path specification" +msgstr "" + +#: parser/parse_merge.c:119 +#, fuzzy, c-format +#| msgid "WHERE CURRENT OF is not supported for this table type" +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "WHERE CURRENT OF wird für diesen Tabellentyp nicht unterstützt" + +#: parser/parse_merge.c:163 +#, c-format +msgid "unreachable WHEN clause specified after unconditional WHEN clause" +msgstr "" + +#: parser/parse_merge.c:178 parser/parse_merge.c:184 +#, fuzzy, c-format +#| msgid "cannot change relation \"%s\"" +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "kann Relation »%s« nicht ändern" + +#: parser/parse_merge.c:186 +#, fuzzy, c-format +#| msgid "LIKE is not supported for creating foreign tables" +msgid "MERGE is not supported for relations with rules." +msgstr "LIKE wird für das Erzeugen von Fremdtabellen nicht unterstützt" + +#: parser/parse_merge.c:203 +#, c-format +msgid "name \"%s\" specified more than once" +msgstr "Name »%s« mehrmals angegeben" + +#: parser/parse_merge.c:205 +#, c-format +msgid "The name is used both as MERGE target table and data source." +msgstr "" + +#: parser/parse_node.c:86 #, c-format msgid "target lists can have at most %d entries" msgstr "Targetlisten können höchstens %d Einträge haben" #: parser/parse_oper.c:123 parser/parse_oper.c:690 -#, fuzzy, c-format -#| msgid "postfix operators are not supported anymore (operator \"%s\")" +#, c-format msgid "postfix operators are not supported" -msgstr "Postfix-Operatoren werden nicht mehr unterstützt (Operator »%s«)" +msgstr "Postfix-Operatoren werden nicht unterstützt" -#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:538 -#: utils/adt/regproc.c:722 +#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:539 +#: utils/adt/regproc.c:723 #, c-format msgid "operator does not exist: %s" msgstr "Operator existiert nicht: %s" @@ -17045,6 +17970,11 @@ msgstr "op ANY/ALL (array) erfordert, dass Operator keine Ergebnismenge zurückg msgid "inconsistent types deduced for parameter $%d" msgstr "inkonsistente Typen für Parameter $%d ermittelt" +#: parser/parse_param.c:313 tcop/postgres.c:709 +#, c-format +msgid "could not determine data type of parameter $%d" +msgstr "konnte Datentyp von Parameter $%d nicht ermitteln" + #: parser/parse_relation.c:201 #, c-format msgid "table reference \"%s\" is ambiguous" @@ -17060,12 +17990,12 @@ msgstr "Tabellenbezug %u ist nicht eindeutig" msgid "table name \"%s\" specified more than once" msgstr "Tabellenname »%s« mehrmals angegeben" -#: parser/parse_relation.c:474 parser/parse_relation.c:3532 +#: parser/parse_relation.c:474 parser/parse_relation.c:3548 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "ungültiger Verweis auf FROM-Klausel-Eintrag für Tabelle »%s«" -#: parser/parse_relation.c:478 parser/parse_relation.c:3537 +#: parser/parse_relation.c:478 parser/parse_relation.c:3553 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "Es gibt einen Eintrag für Tabelle »%s«, aber auf ihn kann aus diesem Teil der Anfrage nicht verwiesen werden." @@ -17085,131 +18015,134 @@ msgstr "Verweis auf Systemspalte »%s« im Check-Constraint ist ungültig" msgid "cannot use system column \"%s\" in column generation expression" msgstr "Systemspalte »%s« kann nicht in Spaltengenerierungsausdruck verwendet werden" -#: parser/parse_relation.c:1173 parser/parse_relation.c:1625 -#: parser/parse_relation.c:2302 +#: parser/parse_relation.c:711 +#, fuzzy, c-format +#| msgid "cannot use system column \"%s\" in partition key" +msgid "cannot use system column \"%s\" in MERGE WHEN condition" +msgstr "Systemspalte »%s« kann nicht im Partitionierungsschlüssel verwendet werden" + +#: parser/parse_relation.c:1184 parser/parse_relation.c:1636 +#: parser/parse_relation.c:2314 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "Tabelle »%s« hat %d Spalten, aber %d Spalten wurden angegeben" -#: parser/parse_relation.c:1377 +#: parser/parse_relation.c:1388 #, c-format msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." msgstr "Es gibt ein WITH-Element namens »%s«, aber darauf kann aus diesem Teil der Anfrage kein Bezug genommen werden." -#: parser/parse_relation.c:1379 +#: parser/parse_relation.c:1390 #, c-format msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." msgstr "Verwenden Sie WITH RECURSIVE oder sortieren Sie die WITH-Ausdrücke um, um Vorwärtsreferenzen zu entfernen." -#: parser/parse_relation.c:1767 -#, fuzzy, c-format -#| msgid "a column definition list is required for functions returning \"record\"" +#: parser/parse_relation.c:1778 +#, c-format msgid "a column definition list is redundant for a function with OUT parameters" -msgstr "eine Spaltendefinitionsliste ist erforderlich bei Funktionen, die »record« zurückgeben" +msgstr "eine Spaltendefinitionsliste ist überflüssig bei einer Funktion mit OUT-Parametern" -#: parser/parse_relation.c:1773 -#, fuzzy, c-format -#| msgid "a column definition list is required for functions returning \"record\"" +#: parser/parse_relation.c:1784 +#, c-format msgid "a column definition list is redundant for a function returning a named composite type" -msgstr "eine Spaltendefinitionsliste ist erforderlich bei Funktionen, die »record« zurückgeben" +msgstr "eine Spaltendefinitionsliste ist überflüssig bei einer Funktion, die einen benannten zusammengesetzten Typ zurückgibt" -#: parser/parse_relation.c:1780 +#: parser/parse_relation.c:1791 #, c-format msgid "a column definition list is only allowed for functions returning \"record\"" msgstr "eine Spaltendefinitionsliste ist nur erlaubt bei Funktionen, die »record« zurückgeben" -#: parser/parse_relation.c:1791 +#: parser/parse_relation.c:1802 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "eine Spaltendefinitionsliste ist erforderlich bei Funktionen, die »record« zurückgeben" -#: parser/parse_relation.c:1880 +#: parser/parse_relation.c:1891 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "Funktion »%s« in FROM hat nicht unterstützten Rückgabetyp %s" -#: parser/parse_relation.c:2089 +#: parser/parse_relation.c:2101 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "VALUES-Liste »%s« hat %d Spalten verfügbar, aber %d Spalten wurden angegeben" -#: parser/parse_relation.c:2161 +#: parser/parse_relation.c:2173 #, c-format msgid "joins can have at most %d columns" msgstr "Verbunde können höchstens %d Spalten haben" -#: parser/parse_relation.c:2275 +#: parser/parse_relation.c:2287 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "WITH-Anfrage »%s« hat keine RETURNING-Klausel" -#: parser/parse_relation.c:3307 parser/parse_relation.c:3317 +#: parser/parse_relation.c:3323 parser/parse_relation.c:3333 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "Spalte %d von Relation »%s« existiert nicht" -#: parser/parse_relation.c:3535 +#: parser/parse_relation.c:3551 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Vielleicht wurde beabsichtigt, auf den Tabellenalias »%s« zu verweisen." -#: parser/parse_relation.c:3543 +#: parser/parse_relation.c:3559 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "fehlender Eintrag in FROM-Klausel für Tabelle »%s«" -#: parser/parse_relation.c:3595 +#: parser/parse_relation.c:3611 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "Vielleicht wurde beabsichtigt, auf die Spalte »%s.%s« zu verweisen." -#: parser/parse_relation.c:3597 +#: parser/parse_relation.c:3613 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "Es gibt eine Spalte namens »%s« in Tabelle »%s«, aber auf sie kann aus diesem Teil der Anfrage nicht verwiesen werden." -#: parser/parse_relation.c:3614 +#: parser/parse_relation.c:3630 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "Vielleicht wurde beabsichtigt, auf die Spalte »%s.%s« oder die Spalte »%s.%s« zu verweisen." -#: parser/parse_target.c:483 parser/parse_target.c:804 +#: parser/parse_target.c:482 parser/parse_target.c:803 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "kann Systemspalte »%s« keinen Wert zuweisen" -#: parser/parse_target.c:511 +#: parser/parse_target.c:510 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "kann Arrayelement nicht auf DEFAULT setzen" -#: parser/parse_target.c:516 +#: parser/parse_target.c:515 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "kann Subfeld nicht auf DEFAULT setzen" -#: parser/parse_target.c:590 +#: parser/parse_target.c:589 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "Spalte »%s« hat Typ %s, aber der Ausdruck hat Typ %s" -#: parser/parse_target.c:788 +#: parser/parse_target.c:787 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" msgstr "kann Feld »%s« in Spalte »%s« nicht setzen, weil ihr Typ %s kein zusammengesetzter Typ ist" -#: parser/parse_target.c:797 +#: parser/parse_target.c:796 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" msgstr "kann Feld »%s« in Spalte »%s« nicht setzen, weil es keine solche Spalte in Datentyp %s gibt" -#: parser/parse_target.c:878 -#, fuzzy, c-format -#| msgid "array assignment to \"%s\" requires type %s but expression is of type %s" +#: parser/parse_target.c:877 +#, c-format msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" -msgstr "Wertzuweisung für »%s« erfordert Typ %s, aber Ausdruck hat Typ %s" +msgstr "Wertzuweisung in Elemente von »%s« erfordert Typ %s, aber Ausdruck hat Typ %s" -#: parser/parse_target.c:888 +#: parser/parse_target.c:887 #, c-format msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "Subfeld »%s« hat Typ %s, aber der Ausdruck hat Typ %s" @@ -17234,8 +18167,8 @@ msgstr "falscher %%TYPE-Verweis (zu viele Namensteile): %s" msgid "type reference %s converted to %s" msgstr "Typverweis %s in %s umgewandelt" -#: parser/parse_type.c:278 parser/parse_type.c:803 utils/cache/typcache.c:389 -#: utils/cache/typcache.c:444 +#: parser/parse_type.c:278 parser/parse_type.c:807 utils/cache/typcache.c:390 +#: utils/cache/typcache.c:445 #, c-format msgid "type \"%s\" is only a shell" msgstr "Typ »%s« ist nur eine Hülle" @@ -17245,369 +18178,375 @@ msgstr "Typ »%s« ist nur eine Hülle" msgid "type modifier is not allowed for type \"%s\"" msgstr "Typmodifikator ist für Typ »%s« nicht erlaubt" -#: parser/parse_type.c:405 +#: parser/parse_type.c:409 #, c-format msgid "type modifiers must be simple constants or identifiers" msgstr "Typmodifikatoren müssen einfache Konstanten oder Bezeichner sein" -#: parser/parse_type.c:721 parser/parse_type.c:766 +#: parser/parse_type.c:725 parser/parse_type.c:770 #, c-format msgid "invalid type name \"%s\"" msgstr "ungültiger Typname: »%s«" -#: parser/parse_utilcmd.c:266 +#: parser/parse_utilcmd.c:256 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "partitionierte Tabelle kann nicht als Vererbungskind erzeugt werden" -#: parser/parse_utilcmd.c:580 +#: parser/parse_utilcmd.c:569 #, c-format msgid "array of serial is not implemented" msgstr "Array aus Typ serial ist nicht implementiert" -#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 -#: parser/parse_utilcmd.c:730 +#: parser/parse_utilcmd.c:648 parser/parse_utilcmd.c:660 +#: parser/parse_utilcmd.c:719 #, c-format msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "widersprüchliche NULL/NOT NULL-Deklarationen für Spalte »%s« von Tabelle »%s«" -#: parser/parse_utilcmd.c:683 +#: parser/parse_utilcmd.c:672 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "mehrere Vorgabewerte angegeben für Spalte »%s« von Tabelle »%s«" -#: parser/parse_utilcmd.c:700 +#: parser/parse_utilcmd.c:689 #, c-format msgid "identity columns are not supported on typed tables" msgstr "Identitätsspalten in getypten Tabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:704 +#: parser/parse_utilcmd.c:693 #, c-format msgid "identity columns are not supported on partitions" msgstr "Identitätsspalten in partitionierten Tabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:713 +#: parser/parse_utilcmd.c:702 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "mehrere Identitätsangaben für Spalte »%s« von Tabelle »%s«" -#: parser/parse_utilcmd.c:743 +#: parser/parse_utilcmd.c:732 #, c-format msgid "generated columns are not supported on typed tables" msgstr "generierte Spalten in getypten Tabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:747 +#: parser/parse_utilcmd.c:736 #, c-format msgid "generated columns are not supported on partitions" msgstr "generierte Spalten in partitionierten Tabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:752 +#: parser/parse_utilcmd.c:741 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "mehrere Generierungsklauseln angegeben für Spalte »%s« von Tabelle »%s«" -#: parser/parse_utilcmd.c:770 parser/parse_utilcmd.c:885 +#: parser/parse_utilcmd.c:759 parser/parse_utilcmd.c:874 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "Primärschlüssel für Fremdtabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:779 parser/parse_utilcmd.c:895 +#: parser/parse_utilcmd.c:768 parser/parse_utilcmd.c:884 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "Unique-Constraints auf Fremdtabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:824 +#: parser/parse_utilcmd.c:813 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "sowohl Vorgabewert als auch Identität angegeben für Spalte »%s« von Tabelle »%s«" -#: parser/parse_utilcmd.c:832 +#: parser/parse_utilcmd.c:821 #, c-format msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" msgstr "sowohl Vorgabewert als auch Generierungsausdruck angegeben für Spalte »%s« von Tabelle »%s«" -#: parser/parse_utilcmd.c:840 +#: parser/parse_utilcmd.c:829 #, c-format msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" msgstr "sowohl Identität als auch Generierungsausdruck angegeben für Spalte »%s« von Tabelle »%s«" -#: parser/parse_utilcmd.c:905 +#: parser/parse_utilcmd.c:894 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "Exclusion-Constraints auf Fremdtabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:911 +#: parser/parse_utilcmd.c:900 #, c-format msgid "exclusion constraints are not supported on partitioned tables" msgstr "Exclusion-Constraints auf partitionierten Tabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:976 +#: parser/parse_utilcmd.c:965 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE wird für das Erzeugen von Fremdtabellen nicht unterstützt" -#: parser/parse_utilcmd.c:1753 parser/parse_utilcmd.c:1861 +#: parser/parse_utilcmd.c:978 +#, fuzzy, c-format +#| msgid "relation \"%s\" in %s clause not found in FROM clause" +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "Relation »%s« in %s nicht in der FROM-Klausel gefunden" + +#: parser/parse_utilcmd.c:1744 parser/parse_utilcmd.c:1852 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "Index »%s« enthält einen Verweis auf die ganze Zeile der Tabelle." -#: parser/parse_utilcmd.c:2248 +#: parser/parse_utilcmd.c:2241 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "bestehender Index kann nicht in CREATE TABLE verwendet werden" -#: parser/parse_utilcmd.c:2268 +#: parser/parse_utilcmd.c:2261 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "Index »%s« gehört bereits zu einem Constraint" -#: parser/parse_utilcmd.c:2283 +#: parser/parse_utilcmd.c:2276 #, c-format msgid "index \"%s\" is not valid" msgstr "Index »%s« ist nicht gültig" -#: parser/parse_utilcmd.c:2289 +#: parser/parse_utilcmd.c:2282 #, c-format msgid "\"%s\" is not a unique index" msgstr "»%s« ist kein Unique Index" -#: parser/parse_utilcmd.c:2290 parser/parse_utilcmd.c:2297 -#: parser/parse_utilcmd.c:2304 parser/parse_utilcmd.c:2381 +#: parser/parse_utilcmd.c:2283 parser/parse_utilcmd.c:2290 +#: parser/parse_utilcmd.c:2297 parser/parse_utilcmd.c:2374 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "Ein Primärschlüssel oder Unique-Constraint kann nicht mit einem solchen Index erzeugt werden." -#: parser/parse_utilcmd.c:2296 +#: parser/parse_utilcmd.c:2289 #, c-format msgid "index \"%s\" contains expressions" msgstr "Index »%s« enthält Ausdrücke" -#: parser/parse_utilcmd.c:2303 +#: parser/parse_utilcmd.c:2296 #, c-format msgid "\"%s\" is a partial index" msgstr "»%s« ist ein partieller Index" -#: parser/parse_utilcmd.c:2315 +#: parser/parse_utilcmd.c:2308 #, c-format msgid "\"%s\" is a deferrable index" msgstr "»%s« ist ein aufschiebbarer Index" -#: parser/parse_utilcmd.c:2316 +#: parser/parse_utilcmd.c:2309 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "Ein nicht aufschiebbarer Constraint kann nicht mit einem aufschiebbaren Index erzeugt werden." -#: parser/parse_utilcmd.c:2380 +#: parser/parse_utilcmd.c:2373 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "Index »%s« Spalte Nummer %d hat nicht das Standardsortierverhalten" -#: parser/parse_utilcmd.c:2537 +#: parser/parse_utilcmd.c:2530 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "Spalte »%s« erscheint zweimal im Primärschlüssel-Constraint" -#: parser/parse_utilcmd.c:2543 +#: parser/parse_utilcmd.c:2536 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "Spalte »%s« erscheint zweimal im Unique-Constraint" -#: parser/parse_utilcmd.c:2896 +#: parser/parse_utilcmd.c:2883 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "Indexausdrücke und -prädikate können nur auf die zu indizierende Tabelle verweisen" -#: parser/parse_utilcmd.c:2974 +#: parser/parse_utilcmd.c:2955 #, c-format -msgid "statistics expressions can refer only to the table being indexed" -msgstr "Statistikausdrücke können nur auf die zu indizierende Tabelle verweisen" +msgid "statistics expressions can refer only to the table being referenced" +msgstr "Statistikausdrücke können nur auf die referenzierte Tabelle verweisen" -#: parser/parse_utilcmd.c:3020 +#: parser/parse_utilcmd.c:2998 #, c-format msgid "rules on materialized views are not supported" msgstr "Regeln für materialisierte Sichten werden nicht unterstützt" -#: parser/parse_utilcmd.c:3083 +#: parser/parse_utilcmd.c:3061 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "WHERE-Bedingung einer Regel kann keine Verweise auf andere Relationen enthalten" -#: parser/parse_utilcmd.c:3157 +#: parser/parse_utilcmd.c:3134 #, c-format msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "Regeln mit WHERE-Bedingungen können als Aktion nur SELECT, INSERT, UPDATE oder DELETE haben" -#: parser/parse_utilcmd.c:3175 parser/parse_utilcmd.c:3276 +#: parser/parse_utilcmd.c:3152 parser/parse_utilcmd.c:3253 #: rewrite/rewriteHandler.c:508 rewrite/rewriteManip.c:1018 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "UNION/INTERSECTION/EXCEPT mit Bedingung sind nicht implementiert" -#: parser/parse_utilcmd.c:3193 +#: parser/parse_utilcmd.c:3170 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "ON-SELECT-Regel kann nicht OLD verwenden" -#: parser/parse_utilcmd.c:3197 +#: parser/parse_utilcmd.c:3174 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "ON-SELECT-Regel kann nicht NEW verwenden" -#: parser/parse_utilcmd.c:3206 +#: parser/parse_utilcmd.c:3183 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "ON-INSERT-Regel kann nicht OLD verwenden" -#: parser/parse_utilcmd.c:3212 +#: parser/parse_utilcmd.c:3189 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "ON-DELETE-Regel kann nicht NEW verwenden" -#: parser/parse_utilcmd.c:3240 +#: parser/parse_utilcmd.c:3217 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "in WITH-Anfrage kann nicht auf OLD verweisen werden" -#: parser/parse_utilcmd.c:3247 +#: parser/parse_utilcmd.c:3224 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "in WITH-Anfrage kann nicht auf NEW verwiesen werden" -#: parser/parse_utilcmd.c:3706 +#: parser/parse_utilcmd.c:3678 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "falsch platzierte DEFERRABLE-Klausel" -#: parser/parse_utilcmd.c:3711 parser/parse_utilcmd.c:3726 +#: parser/parse_utilcmd.c:3683 parser/parse_utilcmd.c:3698 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "mehrere DEFERRABLE/NOT DEFERRABLE-Klauseln sind nicht erlaubt" -#: parser/parse_utilcmd.c:3721 +#: parser/parse_utilcmd.c:3693 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "falsch platzierte NOT DEFERRABLE-Klausel" -#: parser/parse_utilcmd.c:3742 +#: parser/parse_utilcmd.c:3714 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "falsch platzierte INITIALLY DEFERRED-Klausel" -#: parser/parse_utilcmd.c:3747 parser/parse_utilcmd.c:3773 +#: parser/parse_utilcmd.c:3719 parser/parse_utilcmd.c:3745 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "mehrere INITIALLY IMMEDIATE/DEFERRED-Klauseln sind nicht erlaubt" -#: parser/parse_utilcmd.c:3768 +#: parser/parse_utilcmd.c:3740 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "falsch platzierte INITIALLY IMMEDIATE-Klausel" -#: parser/parse_utilcmd.c:3959 +#: parser/parse_utilcmd.c:3931 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATE gibt ein Schema an (%s) welches nicht gleich dem zu erzeugenden Schema ist (%s)" -#: parser/parse_utilcmd.c:3994 +#: parser/parse_utilcmd.c:3966 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "»%s« ist keine partitionierte Tabelle" -#: parser/parse_utilcmd.c:4001 +#: parser/parse_utilcmd.c:3973 #, c-format msgid "table \"%s\" is not partitioned" msgstr "Tabelle »%s« ist nicht partitioniert" -#: parser/parse_utilcmd.c:4008 +#: parser/parse_utilcmd.c:3980 #, c-format msgid "index \"%s\" is not partitioned" msgstr "Index »%s« ist nicht partitioniert" -#: parser/parse_utilcmd.c:4048 +#: parser/parse_utilcmd.c:4020 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "eine hashpartitionierte Tabelle kann keine Standardpartition haben" -#: parser/parse_utilcmd.c:4065 +#: parser/parse_utilcmd.c:4037 #, c-format msgid "invalid bound specification for a hash partition" msgstr "ungültige Begrenzungsangabe für eine Hash-Partition" -#: parser/parse_utilcmd.c:4071 partitioning/partbounds.c:4701 +#: parser/parse_utilcmd.c:4043 partitioning/partbounds.c:4823 #, c-format -msgid "modulus for hash partition must be a positive integer" -msgstr "Modulus für Hashpartition muss eine positive ganze Zahl sein" +msgid "modulus for hash partition must be an integer value greater than zero" +msgstr "Modulus für Hashpartition muss eine ganze Zahl größer als null sein" -#: parser/parse_utilcmd.c:4078 partitioning/partbounds.c:4709 +#: parser/parse_utilcmd.c:4050 partitioning/partbounds.c:4831 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "Rest für Hashpartition muss kleiner als Modulus sein" -#: parser/parse_utilcmd.c:4091 +#: parser/parse_utilcmd.c:4063 #, c-format msgid "invalid bound specification for a list partition" msgstr "ungültige Begrenzungsangabe für eine Listenpartition" -#: parser/parse_utilcmd.c:4144 +#: parser/parse_utilcmd.c:4116 #, c-format msgid "invalid bound specification for a range partition" msgstr "ungültige Begrenzungsangabe für eine Bereichspartition" -#: parser/parse_utilcmd.c:4150 +#: parser/parse_utilcmd.c:4122 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROM muss genau einen Wert pro Partitionierungsspalte angeben" -#: parser/parse_utilcmd.c:4154 +#: parser/parse_utilcmd.c:4126 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TO muss genau einen Wert pro Partitionierungsspalte angeben" -#: parser/parse_utilcmd.c:4268 +#: parser/parse_utilcmd.c:4240 #, c-format msgid "cannot specify NULL in range bound" msgstr "NULL kann nicht in der Bereichsgrenze angegeben werden" -#: parser/parse_utilcmd.c:4317 +#: parser/parse_utilcmd.c:4289 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "jede Begrenzung, die auf MAXVALUE folgt, muss auch MAXVALUE sein" -#: parser/parse_utilcmd.c:4324 +#: parser/parse_utilcmd.c:4296 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "jede Begrenzung, die auf MINVALUE folgt, muss auch MINVALUE sein" -#: parser/parse_utilcmd.c:4367 +#: parser/parse_utilcmd.c:4339 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "angegebener Wert kann nicht in Typ %s für Spalte »%s« umgewandelt werden" -#: parser/parser.c:247 +#: parser/parser.c:263 msgid "UESCAPE must be followed by a simple string literal" msgstr "auf UESCAPE muss eine einfache Zeichenkettenkonstante folgen" -#: parser/parser.c:252 +#: parser/parser.c:268 msgid "invalid Unicode escape character" msgstr "ungültiges Unicode-Escape-Zeichen" -#: parser/parser.c:321 scan.l:1329 +#: parser/parser.c:337 scan.l:1338 #, c-format msgid "invalid Unicode escape value" msgstr "ungültiger Unicode-Escape-Wert" -#: parser/parser.c:468 scan.l:677 utils/adt/varlena.c:6566 +#: parser/parser.c:484 scan.l:684 utils/adt/varlena.c:6533 #, c-format msgid "invalid Unicode escape" msgstr "ungültiges Unicode-Escape" -#: parser/parser.c:469 +#: parser/parser.c:485 #, c-format msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Unicode-Escapes müssen \\XXXX oder \\+XXXXXX sein." -#: parser/parser.c:497 scan.l:638 scan.l:654 scan.l:670 -#: utils/adt/varlena.c:6591 +#: parser/parser.c:513 scan.l:645 scan.l:661 scan.l:677 +#: utils/adt/varlena.c:6558 #, c-format msgid "invalid Unicode surrogate pair" msgstr "ungültiges Unicode-Surrogatpaar" @@ -17617,89 +18556,89 @@ msgstr "ungültiges Unicode-Surrogatpaar" msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "Bezeichner »%s« wird auf »%.*s« gekürzt" -#: partitioning/partbounds.c:2821 +#: partitioning/partbounds.c:2932 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "Partition »%s« kollidiert mit bestehender Standardpartition »%s«" -#: partitioning/partbounds.c:2870 partitioning/partbounds.c:2888 -#: partitioning/partbounds.c:2904 +#: partitioning/partbounds.c:2984 partitioning/partbounds.c:3003 +#: partitioning/partbounds.c:3025 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "der Modulus jeder Hashpartition muss ein Faktor des nächstgrößeren Modulus sein" -#: partitioning/partbounds.c:2871 partitioning/partbounds.c:2905 +#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3026 #, c-format msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." msgstr "Der neue Modulus %d ist kein Faktor von %d, dem Modulus der bestehenden Partition »%s«." -#: partitioning/partbounds.c:2889 +#: partitioning/partbounds.c:3004 #, c-format msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." msgstr "Der neue Modulus %d ist nicht durch %d, den Modulus der bestehenden Parition »%s«, teilbar." -#: partitioning/partbounds.c:3018 +#: partitioning/partbounds.c:3139 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "leere Bereichsgrenze angegeben für Partition »%s«" -#: partitioning/partbounds.c:3020 +#: partitioning/partbounds.c:3141 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "Angegebene Untergrenze %s ist größer als oder gleich der Obergrenze %s." -#: partitioning/partbounds.c:3132 +#: partitioning/partbounds.c:3253 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "Partition »%s« würde sich mit Partition »%s« überlappen" -#: partitioning/partbounds.c:3249 +#: partitioning/partbounds.c:3370 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "Scannen von Fremdtabelle »%s«, die eine Partition der Standardpartition »%s« ist, wurde übersprungen" -#: partitioning/partbounds.c:4705 +#: partitioning/partbounds.c:4827 #, c-format -msgid "remainder for hash partition must be a non-negative integer" -msgstr "Rest für Hashpartition muss eine nichtnegative ganze Zahl sein" +msgid "remainder for hash partition must be an integer value greater than or equal to zero" +msgstr "Rest für Hashpartition muss eine ganze Zahl größer als oder gleich null sein" -#: partitioning/partbounds.c:4729 +#: partitioning/partbounds.c:4851 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "»%s« ist keine Hash-partitionierte Tabelle" -#: partitioning/partbounds.c:4740 partitioning/partbounds.c:4857 +#: partitioning/partbounds.c:4862 partitioning/partbounds.c:4979 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "Anzahl der Partitionierungsspalten (%d) stimmt nicht mit der Anzahl der angegebenen Partitionierungsschlüssel (%d) überein" -#: partitioning/partbounds.c:4762 +#: partitioning/partbounds.c:4884 #, c-format msgid "column %d of the partition key has type %s, but supplied value is of type %s" msgstr "Spalte %d des Partitionierungsschlüssels hat Typ %s, aber der angegebene Wert hat Typ %s" -#: partitioning/partbounds.c:4794 +#: partitioning/partbounds.c:4916 #, c-format msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" msgstr "Spalte %d des Partitionierungsschlüssels hat Typ »%s«, aber der angegebene Wert hat Typ »%s«" -#: port/pg_sema.c:209 port/pg_shmem.c:668 port/posix_sema.c:209 -#: port/sysv_sema.c:327 port/sysv_shmem.c:668 +#: port/pg_sema.c:209 port/pg_shmem.c:695 port/posix_sema.c:209 +#: port/sysv_sema.c:327 port/sysv_shmem.c:695 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "konnte »stat« für Datenverzeichnis »%s« nicht ausführen: %m" -#: port/pg_shmem.c:217 port/sysv_shmem.c:217 +#: port/pg_shmem.c:227 port/sysv_shmem.c:227 #, c-format msgid "could not create shared memory segment: %m" msgstr "konnte Shared-Memory-Segment nicht erzeugen: %m" -#: port/pg_shmem.c:218 port/sysv_shmem.c:218 +#: port/pg_shmem.c:228 port/sysv_shmem.c:228 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "Fehlgeschlagener Systemaufruf war shmget(Key=%lu, Größe=%zu, 0%o)." -#: port/pg_shmem.c:222 port/sysv_shmem.c:222 +#: port/pg_shmem.c:232 port/sysv_shmem.c:232 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" @@ -17708,7 +18647,7 @@ msgstr "" "Dieser Fehler bedeutet gewöhnlich, dass das von PostgreSQL angeforderte Shared-Memory-Segment den Kernel-Parameter SHMMAX überschreitet, oder eventuell, dass es kleiner als der Kernel-Parameter SHMMIN ist.\n" "Die PostgreSQL-Dokumentation enthält weitere Informationen über die Konfiguration von Shared Memory." -#: port/pg_shmem.c:229 port/sysv_shmem.c:229 +#: port/pg_shmem.c:239 port/sysv_shmem.c:239 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" @@ -17717,7 +18656,7 @@ msgstr "" "Dieser Fehler bedeutet gewöhnlich, dass das von PostgreSQL angeforderte Shared-Memory-Segment den Kernel-Parameter SHMALL überschreitet. Sie müssen eventuell den Kernel mit einem größeren SHMALL neu konfigurieren.\n" "Die PostgreSQL-Dokumentation enthält weitere Informationen über die Konfiguration von Shared Memory." -#: port/pg_shmem.c:235 port/sysv_shmem.c:235 +#: port/pg_shmem.c:245 port/sysv_shmem.c:245 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" @@ -17726,29 +18665,34 @@ msgstr "" "Dieser Fehler bedeutet *nicht*, dass kein Platz mehr auf der Festplatte ist. Er tritt auf, wenn entweder alle verfügbaren Shared-Memory-IDs aufgebraucht sind, dann müssen den Kernelparameter SHMMNI erhöhen, oder weil die Systemhöchstgrenze für Shared Memory insgesamt erreicht wurde.\n" "Die PostgreSQL-Dokumentation enthält weitere Informationen über die Konfiguration von Shared Memory." -#: port/pg_shmem.c:606 port/sysv_shmem.c:606 +#: port/pg_shmem.c:633 port/sysv_shmem.c:633 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "konnte anonymes Shared Memory nicht mappen: %m" -#: port/pg_shmem.c:608 port/sysv_shmem.c:608 +#: port/pg_shmem.c:635 port/sysv_shmem.c:635 #, c-format msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections." msgstr "" "Dieser Fehler bedeutet gewöhnlich, dass das von PostgreSQL angeforderte Shared-Memory-Segment den verfügbaren Speicher, Swap-Space oder Huge Pages überschreitet. Um die benötigte Shared-Memory-Größe zu reduzieren (aktuell %zu Bytes), reduzieren Sie den Shared-Memory-Verbrauch von PostgreSQL, beispielsweise indem Sie »shared_buffers« oder »max_connections« reduzieren.\n" "Die PostgreSQL-Dokumentation enthält weitere Informationen über die Konfiguration von Shared Memory." -#: port/pg_shmem.c:676 port/sysv_shmem.c:676 +#: port/pg_shmem.c:703 port/sysv_shmem.c:703 #, c-format msgid "huge pages not supported on this platform" msgstr "Huge Pages werden auf dieser Plattform nicht unterstützt" -#: port/pg_shmem.c:737 port/sysv_shmem.c:737 utils/init/miscinit.c:1167 +#: port/pg_shmem.c:710 port/sysv_shmem.c:710 +#, c-format +msgid "huge pages not supported with the current shared_memory_type setting" +msgstr "Huge Pages werden mit der aktuellen shared_memory_type-Einstellung nicht unterstützt" + +#: port/pg_shmem.c:770 port/sysv_shmem.c:770 utils/init/miscinit.c:1187 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "bereits bestehender Shared-Memory-Block (Schlüssel %lu, ID %lu) wird noch benutzt" -#: port/pg_shmem.c:740 port/sysv_shmem.c:740 utils/init/miscinit.c:1169 +#: port/pg_shmem.c:773 port/sysv_shmem.c:773 utils/init/miscinit.c:1189 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "Beenden Sie alle alten Serverprozesse, die zum Datenverzeichnis »%s« gehören." @@ -17777,37 +18721,37 @@ msgstr "" msgid "You possibly need to raise your kernel's SEMVMX value to be at least %d. Look into the PostgreSQL documentation for details." msgstr "Sie müssen möglicherweise den Kernelparameter SEMVMX auf mindestens %d erhöhen. Weitere Informationen finden Sie in der PostgreSQL-Dokumentation." -#: port/win32/crashdump.c:121 +#: port/win32/crashdump.c:119 #, c-format msgid "could not load dbghelp.dll, cannot write crash dump\n" msgstr "konnte dbghelp.dll nicht laden, kann Crash-Dump nicht schreiben\n" -#: port/win32/crashdump.c:129 +#: port/win32/crashdump.c:127 #, c-format msgid "could not load required functions in dbghelp.dll, cannot write crash dump\n" msgstr "konnte benötigte Funktionen in dbghelp.dll nicht laden, kann Crash-Dump nicht schreiben\n" -#: port/win32/crashdump.c:160 +#: port/win32/crashdump.c:158 #, c-format msgid "could not open crash dump file \"%s\" for writing: error code %lu\n" msgstr "konnte Crash-Dump-Datei »%s« nicht zum Schreiben öffnen: Fehlercode %lu\n" -#: port/win32/crashdump.c:167 +#: port/win32/crashdump.c:165 #, c-format msgid "wrote crash dump to file \"%s\"\n" msgstr "Crash-Dump nach Datei »%s« geschrieben\n" -#: port/win32/crashdump.c:169 +#: port/win32/crashdump.c:167 #, c-format msgid "could not write crash dump to file \"%s\": error code %lu\n" msgstr "konnte Crash-Dump nicht nach Datei »%s« schreiben: Fehlercode %lu\n" -#: port/win32/signal.c:196 +#: port/win32/signal.c:206 #, c-format msgid "could not create signal listener pipe for PID %d: error code %lu" msgstr "konnte Listener-Pipe für Signale für PID %d nicht erzeugen: Fehlercode %lu" -#: port/win32/signal.c:251 +#: port/win32/signal.c:261 #, c-format msgid "could not create signal listener pipe: error code %lu; retrying\n" msgstr "konnte Listener-Pipe für Signale nicht erzeugen: Fehlercode %lu; wiederhole Versuch\n" @@ -17897,42 +18841,47 @@ msgstr "Fehlgeschlagener Systemaufruf war DuplicateHandle." msgid "Failed system call was MapViewOfFileEx." msgstr "Fehlgeschlagener Systemaufruf war MapViewOfFileEx." -#: postmaster/autovacuum.c:411 +#: postmaster/autovacuum.c:404 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "konnte Autovacuum-Launcher-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/autovacuum.c:1489 +#: postmaster/autovacuum.c:752 +#, c-format +msgid "autovacuum worker took too long to start; canceled" +msgstr "" + +#: postmaster/autovacuum.c:1482 #, c-format msgid "could not fork autovacuum worker process: %m" msgstr "konnte Autovacuum-Worker-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/autovacuum.c:2326 +#: postmaster/autovacuum.c:2261 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "Autovacuum: lösche verwaiste temporäre Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2555 +#: postmaster/autovacuum.c:2486 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "automatisches Vacuum der Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2558 +#: postmaster/autovacuum.c:2489 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "automatisches Analysieren der Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2751 +#: postmaster/autovacuum.c:2682 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "verarbeite Arbeitseintrag für Relation »%s.%s.%s«" -#: postmaster/autovacuum.c:3432 +#: postmaster/autovacuum.c:3293 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "Autovacuum wegen Fehlkonfiguration nicht gestartet" -#: postmaster/autovacuum.c:3433 +#: postmaster/autovacuum.c:3294 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Schalten Sie die Option »track_counts« ein." @@ -17942,406 +18891,249 @@ msgstr "Schalten Sie die Option »track_counts« ein." msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" msgstr "inkonsistenter Background-Worker-Zustand (max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:661 -#, c-format -msgid "background worker \"%s\": must attach to shared memory in order to request a database connection" -msgstr "Background-Worker »%s«: muss mit Shared Memory verbinden, um eine Datenbankverbindung anzufordern" +#: postmaster/bgworker.c:666 +#, fuzzy, c-format +#| msgid "background worker \"%s\": only dynamic background workers can request notification" +msgid "background worker \"%s\": background worker without shared memory access are not supported" +msgstr "Background-Worker »%s«: nur dynamische Background-Worker können Benachrichtigung verlangen" -#: postmaster/bgworker.c:670 +#: postmaster/bgworker.c:677 #, c-format msgid "background worker \"%s\": cannot request database access if starting at postmaster start" msgstr "Background-Worker »%s«: kann kein Datenbankzugriff anfordern, wenn er nach Postmaster-Start gestartet hat" -#: postmaster/bgworker.c:684 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "Background-Worker »%s«: ungültiges Neustart-Intervall" -#: postmaster/bgworker.c:699 +#: postmaster/bgworker.c:706 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "Background-Worker »%s«: parallele Arbeitsprozesse dürfen nicht für Neustart konfiguriert sein" -#: postmaster/bgworker.c:723 tcop/postgres.c:3188 +#: postmaster/bgworker.c:730 tcop/postgres.c:3201 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "Background-Worker »%s« wird abgebrochen aufgrund von Anweisung des Administrators" -#: postmaster/bgworker.c:904 +#: postmaster/bgworker.c:887 #, c-format msgid "background worker \"%s\": must be registered in shared_preload_libraries" msgstr "Background-Worker »%s«: muss in shared_preload_libraries registriert sein" -#: postmaster/bgworker.c:916 +#: postmaster/bgworker.c:899 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "Background-Worker »%s«: nur dynamische Background-Worker können Benachrichtigung verlangen" -#: postmaster/bgworker.c:931 +#: postmaster/bgworker.c:914 #, c-format msgid "too many background workers" msgstr "zu viele Background-Worker" -#: postmaster/bgworker.c:932 +#: postmaster/bgworker.c:915 #, c-format msgid "Up to %d background worker can be registered with the current settings." msgid_plural "Up to %d background workers can be registered with the current settings." msgstr[0] "Mit den aktuellen Einstellungen können bis zu %d Background-Worker registriert werden." msgstr[1] "Mit den aktuellen Einstellungen können bis zu %d Background-Worker registriert werden." -#: postmaster/bgworker.c:936 +#: postmaster/bgworker.c:919 #, c-format msgid "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "Erhöhen Sie eventuell den Konfigurationsparameter »max_worker_processes«." -#: postmaster/checkpointer.c:428 +#: postmaster/checkpointer.c:432 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" msgstr[0] "Checkpoints passieren zu oft (alle %d Sekunde)" msgstr[1] "Checkpoints passieren zu oft (alle %d Sekunden)" -#: postmaster/checkpointer.c:432 +#: postmaster/checkpointer.c:436 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "Erhöhen Sie eventuell den Konfigurationsparameter »max_wal_size«." -#: postmaster/checkpointer.c:1056 +#: postmaster/checkpointer.c:1060 #, c-format msgid "checkpoint request failed" msgstr "Checkpoint-Anforderung fehlgeschlagen" -#: postmaster/checkpointer.c:1057 +#: postmaster/checkpointer.c:1061 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Einzelheiten finden Sie in den letzten Meldungen im Serverlog." -#: postmaster/pgarch.c:372 -#, c-format -msgid "archive_mode enabled, yet archive_command is not set" +#: postmaster/pgarch.c:429 +#, fuzzy, c-format +#| msgid "archive_mode enabled, yet archive_command is not set" +msgid "archive_mode enabled, yet archiving is not configured" msgstr "archive_mode ist an, aber archive_command ist nicht gesetzt" -#: postmaster/pgarch.c:394 +#: postmaster/pgarch.c:451 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "verwaiste Archivstatusdatei »%s« wurde entfernt" -#: postmaster/pgarch.c:404 +#: postmaster/pgarch.c:461 #, c-format msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" msgstr "Entfernen der verwaisten Archivstatusdatei »%s« schlug zu oft fehl, wird später erneut versucht" -#: postmaster/pgarch.c:440 +#: postmaster/pgarch.c:497 #, c-format msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" msgstr "Archivieren der Write-Ahead-Log-Datei »%s« schlug zu oft fehl, wird später erneut versucht" -#: postmaster/pgarch.c:541 -#, c-format -msgid "archive command failed with exit code %d" -msgstr "Archivbefehl ist fehlgeschlagen mit Statuscode %d" - -#: postmaster/pgarch.c:543 postmaster/pgarch.c:553 postmaster/pgarch.c:559 -#: postmaster/pgarch.c:568 -#, c-format -msgid "The failed archive command was: %s" -msgstr "Der fehlgeschlagene Archivbefehl war: %s" - -#: postmaster/pgarch.c:550 -#, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "Archivbefehl wurde durch Ausnahme 0x%X beendet" - -#: postmaster/pgarch.c:552 postmaster/postmaster.c:3724 -#, c-format -msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." -msgstr "Sehen Sie die Beschreibung des Hexadezimalwerts in der C-Include-Datei »ntstatus.h« nach." - -#: postmaster/pgarch.c:557 -#, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "Archivbefehl wurde von Signal %d beendet: %s" - -#: postmaster/pgarch.c:566 -#, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "Archivbefehl hat mit unbekanntem Status %d beendet" - -#: postmaster/pgstat.c:417 -#, c-format -msgid "could not resolve \"localhost\": %s" -msgstr "konnte »localhost« nicht auflösen: %s" - -#: postmaster/pgstat.c:440 -#, c-format -msgid "trying another address for the statistics collector" -msgstr "andere Adresse für Statistiksammelprozess wird versucht" - -#: postmaster/pgstat.c:449 -#, c-format -msgid "could not create socket for statistics collector: %m" -msgstr "konnte Socket für Statistiksammelprozess nicht erzeugen: %m" - -#: postmaster/pgstat.c:461 -#, c-format -msgid "could not bind socket for statistics collector: %m" -msgstr "konnte Socket für Statistiksammelprozess nicht binden: %m" - -#: postmaster/pgstat.c:472 -#, c-format -msgid "could not get address of socket for statistics collector: %m" -msgstr "konnte Adresse für Socket für Statistiksammelprozess nicht ermitteln: %m" - -#: postmaster/pgstat.c:488 -#, c-format -msgid "could not connect socket for statistics collector: %m" -msgstr "konnte nicht mit Socket für Statistiksammelprozess verbinden: %m" - -#: postmaster/pgstat.c:509 -#, c-format -msgid "could not send test message on socket for statistics collector: %m" -msgstr "konnte Testnachricht auf Socket für Statistiksammelprozess nicht senden: %m" - -#: postmaster/pgstat.c:535 -#, c-format -msgid "select() failed in statistics collector: %m" -msgstr "select() im Statistiksammelprozess fehlgeschlagen: %m" - -#: postmaster/pgstat.c:550 -#, c-format -msgid "test message did not get through on socket for statistics collector" -msgstr "Testnachricht auf Socket für Statistiksammelprozess kam nicht durch" - -#: postmaster/pgstat.c:565 +#: postmaster/pgarch.c:809 #, c-format -msgid "could not receive test message on socket for statistics collector: %m" -msgstr "konnte Testnachricht auf Socket für Statistiksammelprozess nicht empfangen: %m" - -#: postmaster/pgstat.c:575 -#, c-format -msgid "incorrect test message transmission on socket for statistics collector" -msgstr "fehlerhafte Übertragung der Testnachricht auf Socket für Statistiksammelprozess" - -#: postmaster/pgstat.c:598 -#, c-format -msgid "could not set statistics collector socket to nonblocking mode: %m" -msgstr "konnte Socket von Statistiksammelprozess nicht auf nicht blockierenden Modus setzen: %m" - -#: postmaster/pgstat.c:642 -#, c-format -msgid "disabling statistics collector for lack of working socket" -msgstr "Statistiksammelprozess abgeschaltet wegen nicht funkionierender Socket" - -#: postmaster/pgstat.c:789 -#, c-format -msgid "could not fork statistics collector: %m" -msgstr "konnte Statistiksammelprozess nicht starten (fork-Fehler): %m" - -#: postmaster/pgstat.c:1459 -#, c-format -msgid "unrecognized reset target: \"%s\"" -msgstr "unbekanntes Reset-Ziel: »%s«" - -#: postmaster/pgstat.c:1460 -#, fuzzy, c-format -#| msgid "Target must be \"archiver\" or \"bgwriter\"." -msgid "Target must be \"archiver\", \"bgwriter\" or \"wal\"." -msgstr "Das Reset-Ziel muss »archiver« oder »bgwriter« sein." - -#: postmaster/pgstat.c:3298 -#, c-format -msgid "could not read statistics message: %m" -msgstr "konnte Statistiknachricht nicht lesen: %m" - -#: postmaster/pgstat.c:3644 postmaster/pgstat.c:3829 -#, c-format -msgid "could not open temporary statistics file \"%s\": %m" -msgstr "konnte temporäre Statistikdatei »%s« nicht öffnen: %m" - -#: postmaster/pgstat.c:3739 postmaster/pgstat.c:3874 -#, c-format -msgid "could not write temporary statistics file \"%s\": %m" -msgstr "konnte temporäre Statistikdatei »%s« nicht schreiben: %m" - -#: postmaster/pgstat.c:3748 postmaster/pgstat.c:3883 -#, c-format -msgid "could not close temporary statistics file \"%s\": %m" -msgstr "konnte temporäre Statistikdatei »%s« nicht schließen: %m" - -#: postmaster/pgstat.c:3756 postmaster/pgstat.c:3891 -#, c-format -msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" -msgstr "konnte temporäre Statistikdatei »%s« nicht in »%s« umbenennen: %m" - -#: postmaster/pgstat.c:3989 postmaster/pgstat.c:4255 postmaster/pgstat.c:4412 -#, c-format -msgid "could not open statistics file \"%s\": %m" -msgstr "konnte Statistikdatei »%s« nicht öffnen: %m" - -#: postmaster/pgstat.c:4001 postmaster/pgstat.c:4011 postmaster/pgstat.c:4032 -#: postmaster/pgstat.c:4043 postmaster/pgstat.c:4054 postmaster/pgstat.c:4076 -#: postmaster/pgstat.c:4091 postmaster/pgstat.c:4161 postmaster/pgstat.c:4192 -#: postmaster/pgstat.c:4267 postmaster/pgstat.c:4287 postmaster/pgstat.c:4305 -#: postmaster/pgstat.c:4321 postmaster/pgstat.c:4339 postmaster/pgstat.c:4355 -#: postmaster/pgstat.c:4424 postmaster/pgstat.c:4436 postmaster/pgstat.c:4448 -#: postmaster/pgstat.c:4459 postmaster/pgstat.c:4470 postmaster/pgstat.c:4495 -#: postmaster/pgstat.c:4522 postmaster/pgstat.c:4535 -#, c-format -msgid "corrupted statistics file \"%s\"" -msgstr "verfälschte Statistikdatei »%s«" - -#: postmaster/pgstat.c:4644 -#, c-format -msgid "statistics collector's time %s is later than backend local time %s" +msgid "restarting archiver process because value of \"archive_library\" was changed" msgstr "" -#: postmaster/pgstat.c:4667 -#, c-format -msgid "using stale statistics instead of current ones because stats collector is not responding" -msgstr "verwende veraltete Statistiken anstatt aktueller, weil der Statistiksammelprozess nicht antwortet" - -#: postmaster/pgstat.c:4794 +#: postmaster/pgarch.c:842 #, c-format -msgid "stats_timestamp %s is later than collector's time %s for database %u" +msgid "archive modules have to declare the _PG_archive_module_init symbol" msgstr "" -#: postmaster/pgstat.c:5004 +#: postmaster/pgarch.c:848 #, c-format -msgid "database hash table corrupted during cleanup --- abort" -msgstr "Datenbank-Hash-Tabelle beim Aufräumen verfälscht --- Abbruch" +msgid "archive modules must register an archive callback" +msgstr "" -#: postmaster/postmaster.c:745 +#: postmaster/postmaster.c:744 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: ungültiges Argument für Option -f: »%s«\n" -#: postmaster/postmaster.c:824 +#: postmaster/postmaster.c:823 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: ungültiges Argument für Option -t: »%s«\n" -#: postmaster/postmaster.c:875 +#: postmaster/postmaster.c:874 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: ungültiges Argument: »%s«\n" -#: postmaster/postmaster.c:917 +#: postmaster/postmaster.c:942 #, c-format msgid "%s: superuser_reserved_connections (%d) must be less than max_connections (%d)\n" msgstr "%s: superuser_reserved_connections (%d) muss kleiner als max_connections (%d) sein\n" -#: postmaster/postmaster.c:924 +#: postmaster/postmaster.c:949 #, c-format msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" msgstr "WAL-Archivierung kann nicht eingeschaltet werden, wenn wal_level »minimal« ist" -#: postmaster/postmaster.c:927 +#: postmaster/postmaster.c:952 #, c-format msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" msgstr "WAL-Streaming (max_wal_senders > 0) benötigt wal_level »replica« oder »logical«" -#: postmaster/postmaster.c:935 +#: postmaster/postmaster.c:960 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: ungültige datetoken-Tabellen, bitte reparieren\n" -#: postmaster/postmaster.c:1052 +#: postmaster/postmaster.c:1113 #, c-format msgid "could not create I/O completion port for child queue" msgstr "konnte Ein-/Ausgabe-Completion-Port für Child-Queue nicht erzeugen" -#: postmaster/postmaster.c:1117 +#: postmaster/postmaster.c:1178 #, c-format msgid "ending log output to stderr" msgstr "Logausgabe nach stderr endet" -#: postmaster/postmaster.c:1118 +#: postmaster/postmaster.c:1179 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "Die weitere Logausgabe geht an Logziel »%s«." -#: postmaster/postmaster.c:1129 +#: postmaster/postmaster.c:1190 #, c-format msgid "starting %s" msgstr "%s startet" -#: postmaster/postmaster.c:1158 postmaster/postmaster.c:1257 -#: utils/init/miscinit.c:1627 +#: postmaster/postmaster.c:1219 postmaster/postmaster.c:1318 +#: utils/init/miscinit.c:1651 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "ungültige Listensyntax für Parameter »%s«" -#: postmaster/postmaster.c:1189 +#: postmaster/postmaster.c:1250 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "konnte Listen-Socket für »%s« nicht erzeugen" -#: postmaster/postmaster.c:1195 +#: postmaster/postmaster.c:1256 #, c-format msgid "could not create any TCP/IP sockets" msgstr "konnte keine TCP/IP-Sockets erstellen" -#: postmaster/postmaster.c:1227 +#: postmaster/postmaster.c:1288 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "DNSServiceRegister() fehlgeschlagen: Fehlercode %ld" -#: postmaster/postmaster.c:1279 +#: postmaster/postmaster.c:1340 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "konnte Unix-Domain-Socket in Verzeichnis »%s« nicht erzeugen" -#: postmaster/postmaster.c:1285 +#: postmaster/postmaster.c:1346 #, c-format msgid "could not create any Unix-domain sockets" msgstr "konnte keine Unix-Domain-Sockets erzeugen" -#: postmaster/postmaster.c:1297 +#: postmaster/postmaster.c:1358 #, c-format msgid "no socket created for listening" msgstr "keine Listen-Socket erzeugt" -#: postmaster/postmaster.c:1328 +#: postmaster/postmaster.c:1389 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %s\n" msgstr "%s: konnte Rechte der externen PID-Datei »%s« nicht ändern: %s\n" -#: postmaster/postmaster.c:1332 +#: postmaster/postmaster.c:1393 #, c-format msgid "%s: could not write external PID file \"%s\": %s\n" msgstr "%s: konnte externe PID-Datei »%s« nicht schreiben: %s\n" -#: postmaster/postmaster.c:1365 utils/init/postinit.c:216 +#: postmaster/postmaster.c:1420 utils/init/postinit.c:220 #, c-format msgid "could not load pg_hba.conf" msgstr "konnte pg_hba.conf nicht laden" -#: postmaster/postmaster.c:1391 +#: postmaster/postmaster.c:1446 #, c-format msgid "postmaster became multithreaded during startup" msgstr "Postmaster ist während des Starts multithreaded geworden" -#: postmaster/postmaster.c:1392 +#: postmaster/postmaster.c:1447 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Setzen Sie die Umgebungsvariable LC_ALL auf eine gültige Locale." -#: postmaster/postmaster.c:1487 +#: postmaster/postmaster.c:1548 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: konnte Pfad des eigenen Programs nicht finden" -#: postmaster/postmaster.c:1494 +#: postmaster/postmaster.c:1555 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: konnte kein passendes Programm »postgres« finden" -#: postmaster/postmaster.c:1517 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1578 utils/misc/tzparser.c:340 #, c-format msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." msgstr "Dies kann auf eine unvollständige PostgreSQL-Installation hindeuten, oder darauf, dass die Datei »%s« von ihrer richtigen Stelle verschoben worden ist." -#: postmaster/postmaster.c:1544 +#: postmaster/postmaster.c:1605 #, c-format msgid "" "%s: could not find the database system\n" @@ -18352,801 +19144,945 @@ msgstr "" "Es wurde im Verzeichnis »%s« erwartet,\n" "aber die Datei »%s« konnte nicht geöffnet werden: %s\n" -#: postmaster/postmaster.c:1721 +#: postmaster/postmaster.c:1782 #, c-format msgid "select() failed in postmaster: %m" msgstr "select() fehlgeschlagen im Postmaster: %m" -#: postmaster/postmaster.c:1857 +#: postmaster/postmaster.c:1913 #, c-format msgid "issuing SIGKILL to recalcitrant children" -msgstr "" +msgstr "SIGKILL wird an ungehorsame Kinder gesendet" -#: postmaster/postmaster.c:1878 +#: postmaster/postmaster.c:1934 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "führe sofortiges Herunterfahren durch, weil Sperrdatei im Datenverzeichnis ungültig ist" -#: postmaster/postmaster.c:1981 postmaster/postmaster.c:2009 +#: postmaster/postmaster.c:2037 postmaster/postmaster.c:2065 #, c-format msgid "incomplete startup packet" msgstr "unvollständiges Startpaket" -#: postmaster/postmaster.c:1993 +#: postmaster/postmaster.c:2049 #, c-format msgid "invalid length of startup packet" msgstr "ungültige Länge des Startpakets" -#: postmaster/postmaster.c:2048 +#: postmaster/postmaster.c:2104 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "konnte SSL-Verhandlungsantwort nicht senden: %m" -#: postmaster/postmaster.c:2080 +#: postmaster/postmaster.c:2122 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "unverschlüsselte Daten nach SSL-Anforderung empfangen" + +#: postmaster/postmaster.c:2123 postmaster/postmaster.c:2167 +#, c-format +msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." +msgstr "Das könnte entweder ein Fehler in der Client-Software oder ein Hinweis auf einen versuchten Man-in-the-Middle-Angriff sein." + +#: postmaster/postmaster.c:2148 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "konnte GSSAPI-Verhandlungsantwort nicht senden: %m" -#: postmaster/postmaster.c:2110 +#: postmaster/postmaster.c:2166 +#, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "unverschlüsselte Daten nach GSSAPI-Verschlüsselungsanforderung empfangen" + +#: postmaster/postmaster.c:2190 #, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "nicht unterstütztes Frontend-Protokoll %u.%u: Server unterstützt %u.0 bis %u.%u" -#: postmaster/postmaster.c:2174 utils/misc/guc.c:7112 utils/misc/guc.c:7148 -#: utils/misc/guc.c:7218 utils/misc/guc.c:8550 utils/misc/guc.c:11506 -#: utils/misc/guc.c:11547 +#: postmaster/postmaster.c:2254 utils/misc/guc.c:7392 utils/misc/guc.c:7428 +#: utils/misc/guc.c:7498 utils/misc/guc.c:8869 utils/misc/guc.c:11869 +#: utils/misc/guc.c:11910 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "ungültiger Wert für Parameter »%s«: »%s«" -#: postmaster/postmaster.c:2177 +#: postmaster/postmaster.c:2257 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Gültige Werte sind: »false«, 0, »true«, 1, »database«." -#: postmaster/postmaster.c:2222 +#: postmaster/postmaster.c:2302 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "ungültiges Layout des Startpakets: Abschluss als letztes Byte erwartet" -#: postmaster/postmaster.c:2239 +#: postmaster/postmaster.c:2319 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "kein PostgreSQL-Benutzername im Startpaket angegeben" -#: postmaster/postmaster.c:2303 +#: postmaster/postmaster.c:2383 #, c-format msgid "the database system is starting up" msgstr "das Datenbanksystem startet" -#: postmaster/postmaster.c:2309 +#: postmaster/postmaster.c:2389 #, c-format msgid "the database system is not yet accepting connections" msgstr "das Datenbanksystem nimmt noch keine Verbindungen an" -#: postmaster/postmaster.c:2310 +#: postmaster/postmaster.c:2390 #, c-format msgid "Consistent recovery state has not been yet reached." msgstr "Konsistenter Wiederherstellungszustand wurde noch nicht erreicht." -#: postmaster/postmaster.c:2314 +#: postmaster/postmaster.c:2394 #, c-format msgid "the database system is not accepting connections" msgstr "das Datenbanksystem nimmt keine Verbindungen an" -#: postmaster/postmaster.c:2315 +#: postmaster/postmaster.c:2395 #, c-format msgid "Hot standby mode is disabled." msgstr "Hot-Standby-Modus ist deaktiviert." -#: postmaster/postmaster.c:2320 +#: postmaster/postmaster.c:2400 #, c-format msgid "the database system is shutting down" msgstr "das Datenbanksystem fährt herunter" -#: postmaster/postmaster.c:2325 +#: postmaster/postmaster.c:2405 #, c-format msgid "the database system is in recovery mode" msgstr "das Datenbanksystem ist im Wiederherstellungsmodus" -#: postmaster/postmaster.c:2330 storage/ipc/procarray.c:463 -#: storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:361 +#: postmaster/postmaster.c:2410 storage/ipc/procarray.c:474 +#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:359 #, c-format msgid "sorry, too many clients already" msgstr "tut mir leid, schon zu viele Verbindungen" -#: postmaster/postmaster.c:2420 +#: postmaster/postmaster.c:2497 #, c-format msgid "wrong key in cancel request for process %d" msgstr "falscher Schlüssel in Stornierungsanfrage für Prozess %d" -#: postmaster/postmaster.c:2432 +#: postmaster/postmaster.c:2509 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "PID %d in Stornierungsanfrage stimmte mit keinem Prozess überein" -#: postmaster/postmaster.c:2686 +#: postmaster/postmaster.c:2763 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "SIGHUP empfangen, Konfigurationsdateien werden neu geladen" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2712 postmaster/postmaster.c:2716 +#: postmaster/postmaster.c:2787 postmaster/postmaster.c:2791 #, c-format msgid "%s was not reloaded" msgstr "%s wurde nicht neu geladen" -#: postmaster/postmaster.c:2726 +#: postmaster/postmaster.c:2801 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL-Konfiguration wurde nicht neu geladen" -#: postmaster/postmaster.c:2782 +#: postmaster/postmaster.c:2857 #, c-format msgid "received smart shutdown request" msgstr "intelligentes Herunterfahren verlangt" -#: postmaster/postmaster.c:2828 +#: postmaster/postmaster.c:2898 #, c-format msgid "received fast shutdown request" msgstr "schnelles Herunterfahren verlangt" -#: postmaster/postmaster.c:2846 +#: postmaster/postmaster.c:2916 #, c-format msgid "aborting any active transactions" msgstr "etwaige aktive Transaktionen werden abgebrochen" -#: postmaster/postmaster.c:2870 +#: postmaster/postmaster.c:2940 #, c-format msgid "received immediate shutdown request" msgstr "sofortiges Herunterfahren verlangt" -#: postmaster/postmaster.c:2947 +#: postmaster/postmaster.c:3017 #, c-format msgid "shutdown at recovery target" msgstr "Herunterfahren beim Wiederherstellungsziel" -#: postmaster/postmaster.c:2965 postmaster/postmaster.c:3001 +#: postmaster/postmaster.c:3035 postmaster/postmaster.c:3071 msgid "startup process" msgstr "Startprozess" -#: postmaster/postmaster.c:2968 +#: postmaster/postmaster.c:3038 #, c-format msgid "aborting startup due to startup process failure" msgstr "Serverstart abgebrochen wegen Startprozessfehler" -#: postmaster/postmaster.c:3043 +#: postmaster/postmaster.c:3111 #, c-format msgid "database system is ready to accept connections" msgstr "Datenbanksystem ist bereit, um Verbindungen anzunehmen" -#: postmaster/postmaster.c:3064 +#: postmaster/postmaster.c:3132 msgid "background writer process" msgstr "Background-Writer-Prozess" -#: postmaster/postmaster.c:3118 +#: postmaster/postmaster.c:3179 msgid "checkpointer process" msgstr "Checkpointer-Prozess" -#: postmaster/postmaster.c:3134 +#: postmaster/postmaster.c:3195 msgid "WAL writer process" msgstr "WAL-Schreibprozess" -#: postmaster/postmaster.c:3149 +#: postmaster/postmaster.c:3210 msgid "WAL receiver process" msgstr "WAL-Receiver-Prozess" -#: postmaster/postmaster.c:3164 +#: postmaster/postmaster.c:3225 msgid "autovacuum launcher process" msgstr "Autovacuum-Launcher-Prozess" -#: postmaster/postmaster.c:3182 +#: postmaster/postmaster.c:3243 msgid "archiver process" msgstr "Archivierprozess" -#: postmaster/postmaster.c:3197 -msgid "statistics collector process" -msgstr "Statistiksammelprozess" - -#: postmaster/postmaster.c:3211 +#: postmaster/postmaster.c:3256 msgid "system logger process" msgstr "Systemlogger-Prozess" -#: postmaster/postmaster.c:3275 +#: postmaster/postmaster.c:3320 #, c-format msgid "background worker \"%s\"" msgstr "Background-Worker »%s«" -#: postmaster/postmaster.c:3359 postmaster/postmaster.c:3379 -#: postmaster/postmaster.c:3386 postmaster/postmaster.c:3404 +#: postmaster/postmaster.c:3399 postmaster/postmaster.c:3419 +#: postmaster/postmaster.c:3426 postmaster/postmaster.c:3444 msgid "server process" msgstr "Serverprozess" -#: postmaster/postmaster.c:3458 +#: postmaster/postmaster.c:3498 #, c-format msgid "terminating any other active server processes" msgstr "aktive Serverprozesse werden abgebrochen" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3711 +#: postmaster/postmaster.c:3735 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) beendete mit Status %d" -#: postmaster/postmaster.c:3713 postmaster/postmaster.c:3725 -#: postmaster/postmaster.c:3735 postmaster/postmaster.c:3746 +#: postmaster/postmaster.c:3737 postmaster/postmaster.c:3749 +#: postmaster/postmaster.c:3759 postmaster/postmaster.c:3770 #, c-format msgid "Failed process was running: %s" msgstr "Der fehlgeschlagene Prozess führte aus: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3722 +#: postmaster/postmaster.c:3746 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) wurde durch Ausnahme 0x%X beendet" +#: postmaster/postmaster.c:3748 postmaster/shell_archive.c:132 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "Sehen Sie die Beschreibung des Hexadezimalwerts in der C-Include-Datei »ntstatus.h« nach." + #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3732 +#: postmaster/postmaster.c:3756 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) wurde von Signal %d beendet: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3744 +#: postmaster/postmaster.c:3768 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) beendete mit unbekanntem Status %d" -#: postmaster/postmaster.c:3959 +#: postmaster/postmaster.c:3968 #, c-format msgid "abnormal database system shutdown" msgstr "abnormales Herunterfahren des Datenbanksystems" -#: postmaster/postmaster.c:3997 -#, fuzzy, c-format -#| msgid "aborting startup due to startup process failure" +#: postmaster/postmaster.c:3994 +#, c-format msgid "shutting down due to startup process failure" -msgstr "Serverstart abgebrochen wegen Startprozessfehler" +msgstr "fahre herunter wegen Startprozessfehler" -#: postmaster/postmaster.c:4003 +#: postmaster/postmaster.c:4000 #, c-format msgid "shutting down because restart_after_crash is off" -msgstr "" +msgstr "fahre herunter, weil restart_after_crash aus ist" -#: postmaster/postmaster.c:4015 +#: postmaster/postmaster.c:4012 #, c-format msgid "all server processes terminated; reinitializing" msgstr "alle Serverprozesse beendet; initialisiere neu" -#: postmaster/postmaster.c:4189 postmaster/postmaster.c:5548 -#: postmaster/postmaster.c:5939 +#: postmaster/postmaster.c:4184 postmaster/postmaster.c:5520 +#: postmaster/postmaster.c:5910 #, c-format msgid "could not generate random cancel key" msgstr "konnte zufälligen Stornierungsschlüssel nicht erzeugen" -#: postmaster/postmaster.c:4243 +#: postmaster/postmaster.c:4246 #, c-format msgid "could not fork new process for connection: %m" msgstr "konnte neuen Prozess für Verbindung nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:4285 +#: postmaster/postmaster.c:4288 msgid "could not fork new process for connection: " msgstr "konnte neuen Prozess für Verbindung nicht starten (fork-Fehler): " -#: postmaster/postmaster.c:4391 +#: postmaster/postmaster.c:4394 #, c-format msgid "connection received: host=%s port=%s" msgstr "Verbindung empfangen: Host=%s Port=%s" -#: postmaster/postmaster.c:4396 +#: postmaster/postmaster.c:4399 #, c-format msgid "connection received: host=%s" msgstr "Verbindung empfangen: Host=%s" -#: postmaster/postmaster.c:4639 +#: postmaster/postmaster.c:4636 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "konnte Serverprozess »%s« nicht ausführen: %m" -#: postmaster/postmaster.c:4697 -#, fuzzy, c-format -#| msgid "could not close handle to backend parameter variables: error code %lu\n" +#: postmaster/postmaster.c:4694 +#, c-format msgid "could not create backend parameter file mapping: error code %lu" -msgstr "konnte Handle für Backend-Parametervariablen nicht schließen: Fehlercode %lu\n" +msgstr "konnte Backend-Parameter-Datei-Mapping nicht erzeugen: Fehlercode %lu" -#: postmaster/postmaster.c:4706 -#, fuzzy, c-format -#| msgid "could not map view of backend variables: error code %lu\n" +#: postmaster/postmaster.c:4703 +#, c-format msgid "could not map backend parameter memory: error code %lu" -msgstr "konnte Sicht der Backend-Variablen nicht mappen: Fehlercode %lu\n" +msgstr "konnte Backend-Parameter-Speicher nicht mappen: Fehlercode %lu" -#: postmaster/postmaster.c:4733 -#, fuzzy, c-format -#| msgid "command too long\n" +#: postmaster/postmaster.c:4730 +#, c-format msgid "subprocess command line too long" -msgstr "Befehl zu lang\n" +msgstr "Kommandozeile für Subprozess zu lang" -#: postmaster/postmaster.c:4751 -#, fuzzy, c-format -#| msgid "pgpipe: getsockname() failed: error code %d" +#: postmaster/postmaster.c:4748 +#, c-format msgid "CreateProcess() call failed: %m (error code %lu)" -msgstr "pgpipe: getsockname() fehlgeschlagen: Fehlercode %d" +msgstr "Aufruf von CreateProcess() fehlgeschlagen: %m (Fehlercode %lu)" -#: postmaster/postmaster.c:4778 -#, fuzzy, c-format -#| msgid "could not unmap view of backend variables: error code %lu\n" +#: postmaster/postmaster.c:4775 +#, c-format msgid "could not unmap view of backend parameter file: error code %lu" -msgstr "konnte Sicht der Backend-Variablen nicht unmappen: Fehlercode %lu\n" +msgstr "konnte Sicht der Backend-Parameter-Datei nicht unmappen: Fehlercode %lu" -#: postmaster/postmaster.c:4782 -#, fuzzy, c-format -#| msgid "could not close handle to backend parameter variables: error code %lu\n" +#: postmaster/postmaster.c:4779 +#, c-format msgid "could not close handle to backend parameter file: error code %lu" -msgstr "konnte Handle für Backend-Parametervariablen nicht schließen: Fehlercode %lu\n" +msgstr "konnte Handle für Backend-Parameter-Datei nicht schließen: Fehlercode %lu" -#: postmaster/postmaster.c:4804 +#: postmaster/postmaster.c:4801 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "Aufgabe nach zu vielen Versuchen, Shared Memory zu reservieren" -#: postmaster/postmaster.c:4805 +#: postmaster/postmaster.c:4802 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "Dies kann durch ASLR oder Antivirus-Software verursacht werden." -#: postmaster/postmaster.c:4995 +#: postmaster/postmaster.c:4983 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "SSL-Konfiguration konnte im Kindprozess nicht geladen werden" -#: postmaster/postmaster.c:5121 +#: postmaster/postmaster.c:5108 #, c-format msgid "Please report this to <%s>." msgstr "Bitte berichten Sie dies an <%s>." -#: postmaster/postmaster.c:5208 +#: postmaster/postmaster.c:5180 #, c-format -msgid "database system is ready to accept read only connections" +msgid "database system is ready to accept read-only connections" msgstr "Datenbanksystem ist bereit, um lesende Verbindungen anzunehmen" -#: postmaster/postmaster.c:5472 +#: postmaster/postmaster.c:5444 #, c-format msgid "could not fork startup process: %m" msgstr "konnte Startprozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5476 +#: postmaster/postmaster.c:5448 #, c-format msgid "could not fork archiver process: %m" msgstr "konnte Archivierer-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5480 +#: postmaster/postmaster.c:5452 #, c-format msgid "could not fork background writer process: %m" msgstr "konnte Background-Writer-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5484 +#: postmaster/postmaster.c:5456 #, c-format msgid "could not fork checkpointer process: %m" msgstr "konnte Checkpointer-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5488 +#: postmaster/postmaster.c:5460 #, c-format msgid "could not fork WAL writer process: %m" msgstr "konnte WAL-Writer-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5492 +#: postmaster/postmaster.c:5464 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "konnte WAL-Receiver-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5496 +#: postmaster/postmaster.c:5468 #, c-format msgid "could not fork process: %m" msgstr "konnte Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5697 postmaster/postmaster.c:5720 +#: postmaster/postmaster.c:5669 postmaster/postmaster.c:5692 #, c-format msgid "database connection requirement not indicated during registration" msgstr "die Notwendigkeit, Datenbankverbindungen zu erzeugen, wurde bei der Registrierung nicht angezeigt" -#: postmaster/postmaster.c:5704 postmaster/postmaster.c:5727 +#: postmaster/postmaster.c:5676 postmaster/postmaster.c:5699 #, c-format msgid "invalid processing mode in background worker" msgstr "ungültiger Verarbeitungsmodus in Background-Worker" -#: postmaster/postmaster.c:5812 +#: postmaster/postmaster.c:5784 #, c-format msgid "could not fork worker process: %m" msgstr "konnte Worker-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5925 +#: postmaster/postmaster.c:5896 #, c-format msgid "no slot available for new worker process" msgstr "kein Slot für neuen Worker-Prozess verfügbar" -#: postmaster/postmaster.c:6259 +#: postmaster/postmaster.c:6227 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "konnte Socket %d nicht für Verwendung in Backend duplizieren: Fehlercode %d" -#: postmaster/postmaster.c:6291 +#: postmaster/postmaster.c:6259 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "konnte geerbtes Socket nicht erzeugen: Fehlercode %d\n" -#: postmaster/postmaster.c:6320 +#: postmaster/postmaster.c:6288 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "konnte Servervariablendatei »%s« nicht öffnen: %s\n" -#: postmaster/postmaster.c:6327 +#: postmaster/postmaster.c:6295 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "konnte nicht aus Servervariablendatei »%s« lesen: %s\n" -#: postmaster/postmaster.c:6336 +#: postmaster/postmaster.c:6304 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "konnte Datei »%s« nicht löschen: %s\n" -#: postmaster/postmaster.c:6353 +#: postmaster/postmaster.c:6321 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "konnte Sicht der Backend-Variablen nicht mappen: Fehlercode %lu\n" -#: postmaster/postmaster.c:6362 +#: postmaster/postmaster.c:6330 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "konnte Sicht der Backend-Variablen nicht unmappen: Fehlercode %lu\n" -#: postmaster/postmaster.c:6369 +#: postmaster/postmaster.c:6337 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "konnte Handle für Backend-Parametervariablen nicht schließen: Fehlercode %lu\n" -#: postmaster/postmaster.c:6546 +#: postmaster/postmaster.c:6511 #, c-format msgid "could not read exit code for process\n" msgstr "konnte Exitcode des Prozesses nicht lesen\n" -#: postmaster/postmaster.c:6551 +#: postmaster/postmaster.c:6516 #, c-format msgid "could not post child completion status\n" msgstr "konnte Child-Completion-Status nicht versenden\n" -#: postmaster/syslogger.c:474 postmaster/syslogger.c:1153 +#: postmaster/shell_archive.c:121 +#, c-format +msgid "archive command failed with exit code %d" +msgstr "Archivbefehl ist fehlgeschlagen mit Statuscode %d" + +#: postmaster/shell_archive.c:123 postmaster/shell_archive.c:133 +#: postmaster/shell_archive.c:139 postmaster/shell_archive.c:148 +#, c-format +msgid "The failed archive command was: %s" +msgstr "Der fehlgeschlagene Archivbefehl war: %s" + +#: postmaster/shell_archive.c:130 +#, c-format +msgid "archive command was terminated by exception 0x%X" +msgstr "Archivbefehl wurde durch Ausnahme 0x%X beendet" + +#: postmaster/shell_archive.c:137 +#, c-format +msgid "archive command was terminated by signal %d: %s" +msgstr "Archivbefehl wurde von Signal %d beendet: %s" + +#: postmaster/shell_archive.c:146 +#, c-format +msgid "archive command exited with unrecognized status %d" +msgstr "Archivbefehl hat mit unbekanntem Status %d beendet" + +#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 #, c-format msgid "could not read from logger pipe: %m" msgstr "konnte nicht aus Logger-Pipe lesen: %m" -#: postmaster/syslogger.c:571 postmaster/syslogger.c:585 +#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 #, c-format msgid "could not create pipe for syslog: %m" msgstr "konnte Pipe für Syslog nicht erzeugen: %m" -#: postmaster/syslogger.c:636 +#: postmaster/syslogger.c:677 #, c-format msgid "could not fork system logger: %m" msgstr "konnte Systemlogger nicht starten (fork-Fehler): %m" -#: postmaster/syslogger.c:672 +#: postmaster/syslogger.c:713 #, c-format msgid "redirecting log output to logging collector process" msgstr "Logausgabe wird an Logsammelprozess umgeleitet" -#: postmaster/syslogger.c:673 +#: postmaster/syslogger.c:714 #, c-format msgid "Future log output will appear in directory \"%s\"." msgstr "Die weitere Logausgabe wird im Verzeichnis »%s« erscheinen." -#: postmaster/syslogger.c:681 +#: postmaster/syslogger.c:722 #, c-format msgid "could not redirect stdout: %m" msgstr "konnte Standardausgabe nicht umleiten: %m" -#: postmaster/syslogger.c:686 postmaster/syslogger.c:703 +#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 #, c-format msgid "could not redirect stderr: %m" msgstr "konnte Standardfehlerausgabe nicht umleiten: %m" -#: postmaster/syslogger.c:1108 +#: postmaster/syslogger.c:1177 #, c-format msgid "could not write to log file: %s\n" msgstr "konnte nicht in Logdatei schreiben: %s\n" -#: postmaster/syslogger.c:1225 +#: postmaster/syslogger.c:1295 #, c-format msgid "could not open log file \"%s\": %m" msgstr "konnte Logdatei »%s« nicht öffnen: %m" -#: postmaster/syslogger.c:1287 postmaster/syslogger.c:1337 +#: postmaster/syslogger.c:1385 #, c-format msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "automatische Rotation abgeschaltet (SIGHUP zum Wiederanschalten verwenden)" -#: regex/regc_pg_locale.c:262 +#: regex/regc_pg_locale.c:242 #, c-format msgid "could not determine which collation to use for regular expression" msgstr "konnte die für den regulären Ausdruck zu verwendende Sortierfolge nicht bestimmen" -#: regex/regc_pg_locale.c:269 +#: regex/regc_pg_locale.c:265 #, c-format msgid "nondeterministic collations are not supported for regular expressions" msgstr "nichtdeterministische Sortierfolgen werden von regulären Ausdrücken nicht unterstützt" -#: repl_gram.y:349 repl_gram.y:381 +#: repl_gram.y:303 repl_gram.y:335 #, c-format msgid "invalid timeline %u" msgstr "ungültige Zeitleiste %u" -#: repl_scanner.l:131 +#: repl_scanner.l:142 msgid "invalid streaming start location" msgstr "ungültige Streaming-Startposition" -#: repl_scanner.l:182 scan.l:717 +#: repl_scanner.l:199 scan.l:724 msgid "unterminated quoted string" msgstr "Zeichenkette in Anführungszeichen nicht abgeschlossen" -#: replication/backup_manifest.c:255 +#: replication/backup_manifest.c:253 #, c-format msgid "expected end timeline %u but found timeline %u" msgstr "End-Zeitleiste %u wurde erwartet, aber Zeitleiste %u wurde gefunden" -#: replication/backup_manifest.c:272 +#: replication/backup_manifest.c:277 #, c-format msgid "expected start timeline %u but found timeline %u" msgstr "Start-Zeitleiste %u wurde erwartet, aber Zeitleiste %u wurde gefunden" -#: replication/backup_manifest.c:299 +#: replication/backup_manifest.c:304 #, c-format msgid "start timeline %u not found in history of timeline %u" msgstr "Start-Zeitleiste %u nicht in der History der Zeitleiste %u gefunden" -#: replication/backup_manifest.c:352 +#: replication/backup_manifest.c:355 #, c-format msgid "could not rewind temporary file" msgstr "konnte Position in temporärer Datei nicht auf Anfang setzen" -#: replication/backup_manifest.c:379 +#: replication/backup_manifest.c:374 #, c-format msgid "could not read from temporary file: %m" msgstr "konnte nicht aus temporärer Datei lesen: %m" -#: replication/basebackup.c:546 +#: replication/basebackup.c:454 #, c-format msgid "could not find any WAL files" msgstr "konnte keine WAL-Dateien finden" -#: replication/basebackup.c:561 replication/basebackup.c:577 -#: replication/basebackup.c:586 +#: replication/basebackup.c:469 replication/basebackup.c:484 +#: replication/basebackup.c:493 #, c-format msgid "could not find WAL file \"%s\"" msgstr "konnte WAL-Datei »%s« nicht finden" -#: replication/basebackup.c:629 replication/basebackup.c:659 +#: replication/basebackup.c:535 replication/basebackup.c:560 #, c-format msgid "unexpected WAL file size \"%s\"" msgstr "unerwartete WAL-Dateigröße »%s«" -#: replication/basebackup.c:644 replication/basebackup.c:1771 -#, c-format -msgid "base backup could not send data, aborting backup" -msgstr "Basissicherung konnte keine Daten senden, Sicherung abgebrochen" - -#: replication/basebackup.c:722 +#: replication/basebackup.c:630 #, c-format msgid "%lld total checksum verification failure" msgid_plural "%lld total checksum verification failures" msgstr[0] "%lld Prüfsummenfehler insgesamt" msgstr[1] "%lld Prüfsummenfehler insgesamt" -#: replication/basebackup.c:729 +#: replication/basebackup.c:637 #, c-format msgid "checksum verification failure during base backup" msgstr "Prüfsummenüberprüfung bei der Basissicherung fehlgeschlagen" -#: replication/basebackup.c:789 replication/basebackup.c:798 -#: replication/basebackup.c:807 replication/basebackup.c:816 -#: replication/basebackup.c:825 replication/basebackup.c:836 -#: replication/basebackup.c:853 replication/basebackup.c:862 -#: replication/basebackup.c:874 replication/basebackup.c:898 +#: replication/basebackup.c:706 replication/basebackup.c:715 +#: replication/basebackup.c:726 replication/basebackup.c:743 +#: replication/basebackup.c:752 replication/basebackup.c:763 +#: replication/basebackup.c:780 replication/basebackup.c:789 +#: replication/basebackup.c:801 replication/basebackup.c:825 +#: replication/basebackup.c:839 replication/basebackup.c:850 +#: replication/basebackup.c:861 replication/basebackup.c:874 #, c-format msgid "duplicate option \"%s\"" msgstr "doppelte Option »%s«" -#: replication/basebackup.c:842 +#: replication/basebackup.c:734 +#, c-format +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "unbekannter Checkpoint-Typ: »%s«" + +#: replication/basebackup.c:769 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d ist außerhalb des gültigen Bereichs für Parameter »%s« (%d ... %d)" -#: replication/basebackup.c:887 +#: replication/basebackup.c:814 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "unbekannte Manifestoption: »%s«" -#: replication/basebackup.c:903 +#: replication/basebackup.c:830 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "unbekannter Prüfsummenalgorithmus: »%s«" -#: replication/basebackup.c:918 +#: replication/basebackup.c:865 +#, c-format +msgid "unrecognized compression algorithm \"%s\"" +msgstr "unbekannter Komprimierungsalgorithmus »%s«" + +#: replication/basebackup.c:881 +#, fuzzy, c-format +#| msgid "unrecognized column option \"%s\"" +msgid "unrecognized base backup option: \"%s\"" +msgstr "unbekannte Spaltenoption »%s«" + +#: replication/basebackup.c:892 #, c-format msgid "manifest checksums require a backup manifest" msgstr "Manifest-Prüfsummen benötigen ein Backup-Manifest" -#: replication/basebackup.c:1519 +#: replication/basebackup.c:901 +#, fuzzy, c-format +#| msgid "--no-slot cannot be used with slot name" +msgid "target detail cannot be used without target" +msgstr "--no-slot kann nicht zusammen mit einem Slot-Namen verwendet werden" + +#: replication/basebackup.c:910 replication/basebackup_target.c:218 +#, c-format +msgid "target '%s' does not accept a target detail" +msgstr "" + +#: replication/basebackup.c:921 +#, c-format +msgid "compression detail requires compression" +msgstr "" + +#: replication/basebackup.c:934 +#, fuzzy, c-format +#| msgid "invalid compression code: %d" +msgid "invalid compression specification: %s" +msgstr "ungültiger Komprimierungscode: %d" + +#: replication/basebackup.c:1424 #, c-format msgid "skipping special file \"%s\"" msgstr "überspringe besondere Datei »%s«" -#: replication/basebackup.c:1640 +#: replication/basebackup.c:1543 #, c-format msgid "invalid segment number %d in file \"%s\"" msgstr "ungültige Segmentnummer %d in Datei »%s«" -#: replication/basebackup.c:1678 +#: replication/basebackup.c:1583 #, c-format msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" msgstr "konnte Prüfsumme in Datei »%s«, Block %u nicht überprüfen: gelesene Puffergröße %d und Seitengröße %d sind verschieden" -#: replication/basebackup.c:1751 +#: replication/basebackup.c:1657 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" msgstr "Prüfsummenüberprüfung fehlgeschlagen in Datei »%s«, Block %u: berechnet %X, aber erwartet %X" -#: replication/basebackup.c:1758 +#: replication/basebackup.c:1664 #, c-format msgid "further checksum verification failures in file \"%s\" will not be reported" msgstr "weitere Prüfsummenfehler in Datei »%s« werden nicht berichtet werden" -#: replication/basebackup.c:1816 +#: replication/basebackup.c:1711 #, c-format msgid "file \"%s\" has a total of %d checksum verification failure" msgid_plural "file \"%s\" has a total of %d checksum verification failures" msgstr[0] "Datei »%s« hat insgesamt %d Prüfsummenfehler" msgstr[1] "Datei »%s« hat insgesamt %d Prüfsummenfehler" -#: replication/basebackup.c:1852 +#: replication/basebackup.c:1757 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "Dateiname zu lang für Tar-Format: »%s«" -#: replication/basebackup.c:1857 +#: replication/basebackup.c:1762 #, c-format msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" msgstr "Ziel der symbolischen Verknüpfung zu lang für Tar-Format: Dateiname »%s«, Ziel »%s«" -#: replication/libpqwalreceiver/libpqwalreceiver.c:227 +#: replication/basebackup_gzip.c:67 +#, fuzzy, c-format +#| msgid "Bonjour is not supported by this build" +msgid "gzip compression is not supported by this build" +msgstr "Bonjour wird von dieser Installation nicht unterstützt" + +#: replication/basebackup_gzip.c:147 +#, c-format +msgid "could not initialize compression library" +msgstr "konnte Komprimierungsbibliothek nicht initialisieren" + +#: replication/basebackup_lz4.c:67 +#, fuzzy, c-format +#| msgid "Bonjour is not supported by this build" +msgid "lz4 compression is not supported by this build" +msgstr "Bonjour wird von dieser Installation nicht unterstützt" + +#: replication/basebackup_server.c:75 +#, fuzzy, c-format +#| msgid "must be superuser or a member of the pg_write_server_files role to COPY to a file" +msgid "must be superuser or a role with privileges of the pg_write_server_files role to create server backup" +msgstr "nur Superuser oder Mitglieder von pg_write_server_files können mit COPY in eine Datei schreiben" + +#: replication/basebackup_server.c:89 +#, fuzzy, c-format +#| msgid "relative path not allowed for COPY to file" +msgid "relative path not allowed for server backup" +msgstr "relativer Pfad bei COPY in Datei nicht erlaubt" + +#: replication/basebackup_server.c:115 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "Verzeichnis »%s« existiert aber ist nicht leer" + +#: replication/basebackup_server.c:123 utils/init/postinit.c:1052 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" + +#: replication/basebackup_server.c:175 replication/basebackup_server.c:182 +#: replication/basebackup_server.c:268 replication/basebackup_server.c:275 +#: storage/smgr/md.c:456 storage/smgr/md.c:463 storage/smgr/md.c:754 +#, c-format +msgid "Check free disk space." +msgstr "Prüfen Sie den freien Festplattenplatz." + +#: replication/basebackup_server.c:179 replication/basebackup_server.c:272 +#, fuzzy, c-format +#| msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "konnte Datei »%s« nicht erweitern: es wurden nur %d von %d Bytes bei Block %u geschrieben" + +#: replication/basebackup_target.c:146 +#, fuzzy, c-format +#| msgid "unrecognized reset target: \"%s\"" +msgid "unrecognized target: \"%s\"" +msgstr "unbekanntes Reset-Ziel: »%s«" + +#: replication/basebackup_target.c:237 +#, fuzzy, c-format +#| msgid "%s requires a parameter" +msgid "target '%s' requires a target detail" +msgstr "%s erfordert einen Parameter" + +#: replication/basebackup_zstd.c:66 +#, fuzzy, c-format +#| msgid "Bonjour is not supported by this build" +msgid "zstd compression is not supported by this build" +msgstr "Bonjour wird von dieser Installation nicht unterstützt" + +#: replication/basebackup_zstd.c:120 +#, fuzzy, c-format +#| msgid "could not set compression level %d: %s" +msgid "could not set compression worker count to %d: %s" +msgstr "konnte Komprimierungsniveau %d nicht setzen: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:240 #, c-format msgid "could not clear search path: %s" msgstr "konnte Suchpfad nicht auf leer setzen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:256 +#: replication/libpqwalreceiver/libpqwalreceiver.c:269 #, c-format msgid "invalid connection string syntax: %s" msgstr "ungültige Syntax für Verbindungszeichenkette: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:281 +#: replication/libpqwalreceiver/libpqwalreceiver.c:295 #, c-format msgid "could not parse connection string: %s" msgstr "konnte Verbindungsparameter nicht interpretieren: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:353 +#: replication/libpqwalreceiver/libpqwalreceiver.c:368 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "konnte Datenbanksystemidentifikator und Zeitleisten-ID nicht vom Primärserver empfangen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:364 -#: replication/libpqwalreceiver/libpqwalreceiver.c:588 +#: replication/libpqwalreceiver/libpqwalreceiver.c:380 +#: replication/libpqwalreceiver/libpqwalreceiver.c:618 #, c-format msgid "invalid response from primary server" msgstr "ungültige Antwort vom Primärserver" -#: replication/libpqwalreceiver/libpqwalreceiver.c:365 +#: replication/libpqwalreceiver/libpqwalreceiver.c:381 #, c-format msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." msgstr "Konnte System nicht identifizieren: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet." -#: replication/libpqwalreceiver/libpqwalreceiver.c:440 -#: replication/libpqwalreceiver/libpqwalreceiver.c:446 -#: replication/libpqwalreceiver/libpqwalreceiver.c:475 +#: replication/libpqwalreceiver/libpqwalreceiver.c:461 +#: replication/libpqwalreceiver/libpqwalreceiver.c:468 +#: replication/libpqwalreceiver/libpqwalreceiver.c:498 #, c-format msgid "could not start WAL streaming: %s" msgstr "konnte WAL-Streaming nicht starten: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:498 +#: replication/libpqwalreceiver/libpqwalreceiver.c:522 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "konnte End-of-Streaming-Nachricht nicht an Primärserver senden: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:520 +#: replication/libpqwalreceiver/libpqwalreceiver.c:545 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "unerwartete Ergebnismenge nach End-of-Streaming" -#: replication/libpqwalreceiver/libpqwalreceiver.c:534 +#: replication/libpqwalreceiver/libpqwalreceiver.c:560 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "Fehler beim Beenden des COPY-Datenstroms: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:543 +#: replication/libpqwalreceiver/libpqwalreceiver.c:570 #, c-format msgid "error reading result of streaming command: %s" msgstr "Fehler beim Lesen des Ergebnisses von Streaming-Befehl: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:551 -#: replication/libpqwalreceiver/libpqwalreceiver.c:785 +#: replication/libpqwalreceiver/libpqwalreceiver.c:579 +#: replication/libpqwalreceiver/libpqwalreceiver.c:817 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "unerwartetes Ergebnis nach CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:577 +#: replication/libpqwalreceiver/libpqwalreceiver.c:606 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "konnte Zeitleisten-History-Datei nicht vom Primärserver empfangen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:589 +#: replication/libpqwalreceiver/libpqwalreceiver.c:619 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "1 Tupel mit 2 Feldern erwartet, %d Tupel mit %d Feldern erhalten." -#: replication/libpqwalreceiver/libpqwalreceiver.c:749 -#: replication/libpqwalreceiver/libpqwalreceiver.c:800 -#: replication/libpqwalreceiver/libpqwalreceiver.c:806 +#: replication/libpqwalreceiver/libpqwalreceiver.c:780 +#: replication/libpqwalreceiver/libpqwalreceiver.c:833 +#: replication/libpqwalreceiver/libpqwalreceiver.c:840 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "konnte keine Daten vom WAL-Stream empfangen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:825 +#: replication/libpqwalreceiver/libpqwalreceiver.c:860 #, c-format msgid "could not send data to WAL stream: %s" msgstr "konnte keine Daten an den WAL-Stream senden: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:878 +#: replication/libpqwalreceiver/libpqwalreceiver.c:952 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "konnte Replikations-Slot »%s« nicht erzeugen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:923 +#: replication/libpqwalreceiver/libpqwalreceiver.c:998 #, c-format msgid "invalid query response" msgstr "ungültige Antwort auf Anfrage" -#: replication/libpqwalreceiver/libpqwalreceiver.c:924 +#: replication/libpqwalreceiver/libpqwalreceiver.c:999 #, c-format msgid "Expected %d fields, got %d fields." msgstr "%d Felder erwartet, %d Feldern erhalten." -#: replication/libpqwalreceiver/libpqwalreceiver.c:994 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1069 #, c-format msgid "the query interface requires a database connection" msgstr "Ausführen von Anfragen benötigt eine Datenbankverbindung" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1025 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1100 msgid "empty query" msgstr "leere Anfrage" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1031 -#, fuzzy -#| msgid "unexpected delimiter" +#: replication/libpqwalreceiver/libpqwalreceiver.c:1106 msgid "unexpected pipeline mode" -msgstr "unerwartetes Trennzeichen" +msgstr "unerwarteter Pipeline-Modus" -#: replication/logical/launcher.c:286 +#: replication/logical/launcher.c:285 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "Arbeitsprozesse für logische Replikation können nicht gestartet werden, wenn max_replication_slots = 0" -#: replication/logical/launcher.c:366 +#: replication/logical/launcher.c:365 #, c-format msgid "out of logical replication worker slots" msgstr "alle Slots für Arbeitsprozesse für logische Replikation belegt" -#: replication/logical/launcher.c:367 +#: replication/logical/launcher.c:366 #, c-format msgid "You might need to increase max_logical_replication_workers." msgstr "Sie müssen möglicherweise max_logical_replication_workers erhöhen." @@ -19186,148 +20122,106 @@ msgstr "logische Dekodierung benötigt eine Datenbankverbindung" msgid "logical decoding cannot be used while in recovery" msgstr "logische Dekodierung kann nicht während der Wiederherstellung verwendet werden" -#: replication/logical/logical.c:347 replication/logical/logical.c:499 +#: replication/logical/logical.c:348 replication/logical/logical.c:502 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "physischer Replikations-Slot kann nicht für logisches Dekodieren verwendet werden" -#: replication/logical/logical.c:352 replication/logical/logical.c:504 +#: replication/logical/logical.c:353 replication/logical/logical.c:507 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "Replikations-Slot »%s« wurde nicht in dieser Datenbank erzeugt" -#: replication/logical/logical.c:359 +#: replication/logical/logical.c:360 #, c-format msgid "cannot create logical replication slot in transaction that has performed writes" msgstr "logischer Replikations-Slot kann nicht in einer Transaktion erzeugt werden, die Schreibvorgänge ausgeführt hat" -#: replication/logical/logical.c:549 +#: replication/logical/logical.c:568 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "starte logisches Dekodieren für Slot »%s«" -#: replication/logical/logical.c:551 -#, c-format -msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." -msgstr "Streaming beginnt bei Transaktionen, die nach %X/%X committen; lese WAL ab %X/%X." - -#: replication/logical/logical.c:696 -#, c-format -msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" -msgstr "Slot »%s«, Ausgabe-Plugin »%s«, im Callback %s, zugehörige LSN %X/%X" - -#: replication/logical/logical.c:702 -#, c-format -msgid "slot \"%s\", output plugin \"%s\", in the %s callback" -msgstr "Slot »%s«, Ausgabe-Plugin »%s«, im Callback %s" - -#: replication/logical/logical.c:868 -#, c-format -msgid "logical replication at prepare time requires begin_prepare_cb callback" -msgstr "" - -#: replication/logical/logical.c:911 -#, c-format -msgid "logical replication at prepare time requires prepare_cb callback" -msgstr "" - -#: replication/logical/logical.c:954 -#, c-format -msgid "logical replication at prepare time requires commit_prepared_cb callback" -msgstr "" - -#: replication/logical/logical.c:998 -#, c-format -msgid "logical replication at prepare time requires rollback_prepared_cb callback" -msgstr "" - -#: replication/logical/logical.c:1220 -#, fuzzy, c-format -#| msgid "logical decoding requires a database connection" -msgid "logical streaming requires a stream_start_cb callback" -msgstr "logische Dekodierung benötigt eine Datenbankverbindung" - -#: replication/logical/logical.c:1266 -#, fuzzy, c-format -#| msgid "logical decoding requires a database connection" -msgid "logical streaming requires a stream_stop_cb callback" -msgstr "logische Dekodierung benötigt eine Datenbankverbindung" - -#: replication/logical/logical.c:1305 -#, fuzzy, c-format -#| msgid "logical decoding requires a database connection" -msgid "logical streaming requires a stream_abort_cb callback" -msgstr "logische Dekodierung benötigt eine Datenbankverbindung" +#: replication/logical/logical.c:570 +#, c-format +msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." +msgstr "Streaming beginnt bei Transaktionen, die nach %X/%X committen; lese WAL ab %X/%X." -#: replication/logical/logical.c:1348 +#: replication/logical/logical.c:718 #, c-format -msgid "logical streaming at prepare time requires a stream_prepare_cb callback" -msgstr "" +msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" +msgstr "Slot »%s«, Ausgabe-Plugin »%s«, im Callback %s, zugehörige LSN %X/%X" -#: replication/logical/logical.c:1387 +#: replication/logical/logical.c:724 #, c-format -msgid "logical streaming requires a stream_commit_cb callback" -msgstr "" +msgid "slot \"%s\", output plugin \"%s\", in the %s callback" +msgstr "Slot »%s«, Ausgabe-Plugin »%s«, im Callback %s" -#: replication/logical/logical.c:1433 -#, fuzzy, c-format -#| msgid "logical decoding requires a database connection" -msgid "logical streaming requires a stream_change_cb callback" -msgstr "logische Dekodierung benötigt eine Datenbankverbindung" +#: replication/logical/logical.c:895 replication/logical/logical.c:940 +#: replication/logical/logical.c:985 replication/logical/logical.c:1031 +#, c-format +msgid "logical replication at prepare time requires a %s callback" +msgstr "logische Replikation bei PREPARE TRANSACTION benötigt einen %s-Callback" -#: replication/logical/logicalfuncs.c:104 replication/slotfuncs.c:34 +#: replication/logical/logical.c:1263 replication/logical/logical.c:1312 +#: replication/logical/logical.c:1353 replication/logical/logical.c:1439 +#: replication/logical/logical.c:1488 #, c-format -msgid "must be superuser or replication role to use replication slots" -msgstr "nur Superuser und Replikationsrollen können Replikations-Slots verwenden" +msgid "logical streaming requires a %s callback" +msgstr "logisches Streaming benötigt einen %s-Callback" -#: replication/logical/logicalfuncs.c:134 +#: replication/logical/logical.c:1398 +#, c-format +msgid "logical streaming at prepare time requires a %s callback" +msgstr "logisches Streaming bei PREPARE TRANSACTION benötigt einen %s-Callback" + +#: replication/logical/logicalfuncs.c:126 #, c-format msgid "slot name must not be null" msgstr "Slot-Name darf nicht NULL sein" -#: replication/logical/logicalfuncs.c:150 +#: replication/logical/logicalfuncs.c:142 #, c-format msgid "options array must not be null" msgstr "Optionen-Array darf nicht NULL sein" -#: replication/logical/logicalfuncs.c:181 +#: replication/logical/logicalfuncs.c:159 #, c-format msgid "array must be one-dimensional" msgstr "Array muss eindimensional sein" -#: replication/logical/logicalfuncs.c:187 +#: replication/logical/logicalfuncs.c:165 #, c-format msgid "array must not contain nulls" msgstr "Array darf keine NULL-Werte enthalten" -#: replication/logical/logicalfuncs.c:203 utils/adt/json.c:1128 -#: utils/adt/jsonb.c:1303 +#: replication/logical/logicalfuncs.c:181 utils/adt/json.c:1437 +#: utils/adt/jsonb.c:1365 #, c-format msgid "array must have even number of elements" msgstr "Array muss eine gerade Anzahl Elemente haben" -#: replication/logical/logicalfuncs.c:251 +#: replication/logical/logicalfuncs.c:227 #, c-format msgid "can no longer get changes from replication slot \"%s\"" msgstr "aus Replikations-Slot »%s« können keine Änderungen mehr gelesen werden" -#: replication/logical/logicalfuncs.c:253 replication/slotfuncs.c:650 -#, fuzzy, c-format -#| msgid "This slot has never previously reserved WAL, or has been invalidated." +#: replication/logical/logicalfuncs.c:229 replication/slotfuncs.c:616 +#, c-format msgid "This slot has never previously reserved WAL, or it has been invalidated." msgstr "Diese Slot hat nie zuvor WAL reserviert oder er wurde ungültig gemacht." -#: replication/logical/logicalfuncs.c:265 +#: replication/logical/logicalfuncs.c:241 #, c-format msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" msgstr "Ausgabe-Plugin »%s« erzeugt binäre Ausgabe, aber Funktion »%s« erwartet Textdaten" -#: replication/logical/origin.c:188 +#: replication/logical/origin.c:189 #, c-format msgid "cannot query or manipulate replication origin when max_replication_slots = 0" msgstr "Replication-Origin kann nicht abgefragt oder geändert werden, wenn max_replication_slots = 0" -#: replication/logical/origin.c:193 +#: replication/logical/origin.c:194 #, c-format msgid "cannot manipulate replication origins during recovery" msgstr "Replication-Origins können nicht während der Wiederherstellung geändert werden" @@ -19363,510 +20257,595 @@ msgid "could not find free replication state, increase max_replication_slots" msgstr "konnte keinen freien Replication-State finden, erhöhen Sie max_replication_slots" #: replication/logical/origin.c:790 -#, fuzzy, c-format -#| msgid "recovery restart point at %X/%X" +#, c-format msgid "recovered replication state of node %u to %X/%X" -msgstr "Recovery-Restart-Punkt bei %X/%X" +msgstr "Replikationszustand von Knoten %u auf %X/%X wiederhergestellt" #: replication/logical/origin.c:800 #, c-format msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "Replikations-Slot-Checkpoint hat falsche Prüfsumme %u, erwartet wurde %u" -#: replication/logical/origin.c:928 replication/logical/origin.c:1114 +#: replication/logical/origin.c:928 replication/logical/origin.c:1117 #, c-format msgid "replication origin with OID %d is already active for PID %d" msgstr "Replication-Origin mit OID %d ist bereits aktiv für PID %d" -#: replication/logical/origin.c:939 replication/logical/origin.c:1126 +#: replication/logical/origin.c:939 replication/logical/origin.c:1129 #, c-format msgid "could not find free replication state slot for replication origin with OID %u" msgstr "konnte keinen freien Replication-State-Slot für Replication-Origin mit OID %u finden" -#: replication/logical/origin.c:941 replication/logical/origin.c:1128 -#: replication/slot.c:1798 +#: replication/logical/origin.c:941 replication/logical/origin.c:1131 +#: replication/slot.c:1955 #, c-format msgid "Increase max_replication_slots and try again." msgstr "Erhöhen Sie max_replication_slots und versuchen Sie es erneut." -#: replication/logical/origin.c:1085 +#: replication/logical/origin.c:1088 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "kann Replication-Origin nicht einrichten, wenn schon einer eingerichtet ist" -#: replication/logical/origin.c:1165 replication/logical/origin.c:1377 -#: replication/logical/origin.c:1397 +#: replication/logical/origin.c:1168 replication/logical/origin.c:1380 +#: replication/logical/origin.c:1400 #, c-format msgid "no replication origin is configured" msgstr "kein Replication-Origin konfiguriert" -#: replication/logical/origin.c:1248 +#: replication/logical/origin.c:1251 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "Replication-Origin-Name »%s« ist reserviert" -#: replication/logical/origin.c:1250 +#: replication/logical/origin.c:1253 #, c-format msgid "Origin names starting with \"pg_\" are reserved." msgstr "Replication-Origin-Namen, die mit »pg_« anfangen, sind reserviert." -#: replication/logical/relation.c:248 +#: replication/logical/relation.c:234 #, c-format msgid "\"%s\"" msgstr "»%s«" -#: replication/logical/relation.c:251 +#: replication/logical/relation.c:237 #, c-format msgid ", \"%s\"" msgstr ", »%s«" -#: replication/logical/relation.c:257 +#: replication/logical/relation.c:243 #, c-format msgid "logical replication target relation \"%s.%s\" is missing replicated column: %s" msgid_plural "logical replication target relation \"%s.%s\" is missing replicated columns: %s" msgstr[0] "in Zielrelation für logische Replikation »%s.%s« fehlt eine replizierte Spalte: %s" msgstr[1] "in Zielrelation für logische Replikation »%s.%s« fehlen replizierte Spalten: %s" -#: replication/logical/relation.c:337 +#: replication/logical/relation.c:323 #, c-format msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "Zielrelation für logische Replikation »%s.%s« existiert nicht" -#: replication/logical/relation.c:418 +#: replication/logical/relation.c:404 #, c-format msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" msgstr "Zielrelation für logische Replikation »%s.%s« verwendet Systemspalten in REPLICA-IDENTITY-Index" -#: replication/logical/reorderbuffer.c:3777 +#: replication/logical/reorderbuffer.c:3809 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "konnte nicht in Datendatei für XID %u schreiben: %m" -#: replication/logical/reorderbuffer.c:4120 -#: replication/logical/reorderbuffer.c:4145 +#: replication/logical/reorderbuffer.c:4153 +#: replication/logical/reorderbuffer.c:4178 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "konnte nicht aus Reorder-Buffer-Spill-Datei lesen: %m" -#: replication/logical/reorderbuffer.c:4124 -#: replication/logical/reorderbuffer.c:4149 +#: replication/logical/reorderbuffer.c:4157 +#: replication/logical/reorderbuffer.c:4182 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "konnte nicht aus Reorder-Buffer-Spill-Datei lesen: %d statt %u Bytes gelesen" -#: replication/logical/reorderbuffer.c:4397 +#: replication/logical/reorderbuffer.c:4432 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "konnte Datei »%s« nicht löschen, bei Löschen von pg_replslot/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:4887 +#: replication/logical/reorderbuffer.c:4931 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "konnte nicht aus Datei »%s« lesen: %d statt %d Bytes gelesen" -#: replication/logical/snapbuild.c:588 +#: replication/logical/snapbuild.c:597 #, c-format msgid "initial slot snapshot too large" msgstr "initialer Slot-Snapshot ist zu groß" -#: replication/logical/snapbuild.c:642 +#: replication/logical/snapbuild.c:651 #, c-format msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" msgstr[0] "logischer Dekodierungs-Snapshot exportiert: »%s« mit %u Transaktions-ID" msgstr[1] "logischer Dekodierungs-Snapshot exportiert: »%s« mit %u Transaktions-IDs" -#: replication/logical/snapbuild.c:1254 replication/logical/snapbuild.c:1347 -#: replication/logical/snapbuild.c:1878 +#: replication/logical/snapbuild.c:1279 replication/logical/snapbuild.c:1372 +#: replication/logical/snapbuild.c:1901 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "logisches Dekodieren fand konsistenten Punkt bei %X/%X" -#: replication/logical/snapbuild.c:1256 +#: replication/logical/snapbuild.c:1281 #, c-format msgid "There are no running transactions." msgstr "Keine laufenden Transaktionen." -#: replication/logical/snapbuild.c:1298 +#: replication/logical/snapbuild.c:1323 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "logisches Dekodieren fand initialen Startpunkt bei %X/%X" -#: replication/logical/snapbuild.c:1300 replication/logical/snapbuild.c:1324 +#: replication/logical/snapbuild.c:1325 replication/logical/snapbuild.c:1349 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "Warten auf Abschluss der Transaktionen (ungefähr %d), die älter als %u sind." -#: replication/logical/snapbuild.c:1322 +#: replication/logical/snapbuild.c:1347 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "logisches Dekodieren fand initialen konsistenten Punkt bei %X/%X" -#: replication/logical/snapbuild.c:1349 +#: replication/logical/snapbuild.c:1374 #, c-format msgid "There are no old transactions anymore." msgstr "Es laufen keine alten Transaktionen mehr." -#: replication/logical/snapbuild.c:1746 +#: replication/logical/snapbuild.c:1769 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "Scanbuild-State-Datei »%s« hat falsche magische Zahl %u statt %u" -#: replication/logical/snapbuild.c:1752 +#: replication/logical/snapbuild.c:1775 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "Snapbuild-State-Datei »%s« hat nicht unterstützte Version: %u statt %u" -#: replication/logical/snapbuild.c:1823 +#: replication/logical/snapbuild.c:1846 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "Prüfsummenfehler bei Snapbuild-State-Datei »%s«: ist %u, sollte %u sein" -#: replication/logical/snapbuild.c:1880 +#: replication/logical/snapbuild.c:1903 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Logische Dekodierung beginnt mit gespeichertem Snapshot." -#: replication/logical/snapbuild.c:1952 +#: replication/logical/snapbuild.c:1975 #, c-format msgid "could not parse file name \"%s\"" msgstr "konnte Dateinamen »%s« nicht parsen" -#: replication/logical/tablesync.c:144 +#: replication/logical/tablesync.c:151 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" msgstr "Arbeitsprozess für logische Replikation für Tabellensynchronisation für Subskription »%s«, Tabelle »%s« hat abgeschlossen" -#: replication/logical/tablesync.c:726 replication/logical/tablesync.c:767 +#: replication/logical/tablesync.c:422 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" +msgid "logical replication apply worker for subscription \"%s\" will restart so that two_phase can be enabled" +msgstr "Apply-Worker für logische Replikation für Subskription »%s« wird neu starten wegen einer Parameteränderung" + +#: replication/logical/tablesync.c:732 replication/logical/tablesync.c:875 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "konnte Tabelleninformationen für Tabelle »%s.%s« nicht vom Publikationsserver holen: %s" -#: replication/logical/tablesync.c:732 +#: replication/logical/tablesync.c:739 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "Tabelle »%s.%s« nicht auf dem Publikationsserver gefunden" -#: replication/logical/tablesync.c:854 +#: replication/logical/tablesync.c:815 +#, fuzzy, c-format +#| msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "konnte Tabelleninformationen für Tabelle »%s.%s« nicht vom Publikationsserver holen: %s" + +#: replication/logical/tablesync.c:983 +#, fuzzy, c-format +#| msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" +msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" +msgstr "konnte Tabelleninformationen für Tabelle »%s.%s« nicht vom Publikationsserver holen: %s" + +#: replication/logical/tablesync.c:1120 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "konnte Kopieren des Anfangsinhalts für Tabelle »%s.%s« nicht starten: %s" -#: replication/logical/tablesync.c:1053 -#, fuzzy, c-format -#| msgid "table copy could not start transaction on publisher" +#: replication/logical/tablesync.c:1332 replication/logical/worker.c:1631 +#, c-format +msgid "\"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "" + +#: replication/logical/tablesync.c:1347 +#, c-format msgid "table copy could not start transaction on publisher: %s" -msgstr "beim Kopieren der Tabelle konnte die Transaktion auf dem Publikationsserver nicht gestartet werden" +msgstr "beim Kopieren der Tabelle konnte die Transaktion auf dem Publikationsserver nicht gestartet werden: %s" -#: replication/logical/tablesync.c:1101 +#: replication/logical/tablesync.c:1396 #, c-format msgid "replication origin \"%s\" already exists" msgstr "Replication-Origin »%s« existiert bereits" -#: replication/logical/tablesync.c:1113 -#, fuzzy, c-format -#| msgid "table copy could not finish transaction on publisher" +#: replication/logical/tablesync.c:1409 +#, c-format msgid "table copy could not finish transaction on publisher: %s" -msgstr "beim Kopieren der Tabelle konnte die Transaktion auf dem Publikationsserver nicht beenden werden" +msgstr "beim Kopieren der Tabelle konnte die Transaktion auf dem Publikationsserver nicht beenden werden: %s" -#: replication/logical/worker.c:525 +#: replication/logical/worker.c:671 replication/logical/worker.c:786 #, c-format -msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\", remote type %s, local type %s" -msgstr "Verarbeiten empfangener Daten für Replikationszielrelation »%s.%s« Spalte »%s«, entfernter Typ %s, lokaler Typ %s" - -#: replication/logical/worker.c:605 replication/logical/worker.c:734 -#, fuzzy, c-format -#| msgid "incorrect binary data format in function argument %d" msgid "incorrect binary data format in logical replication column %d" -msgstr "falsches Binärdatenformat in Funktionsargument %d" +msgstr "falsches Binärdatenformat in Spalte %d in logischer Replikation" -#: replication/logical/worker.c:813 +#: replication/logical/worker.c:1417 replication/logical/worker.c:1431 #, c-format -msgid "ORIGIN message sent out of order" -msgstr "ORIGIN-Nachricht in falscher Reihenfolge gesendet" - -#: replication/logical/worker.c:1072 replication/logical/worker.c:1084 -#, fuzzy, c-format -#| msgid "could not read from backend variables file \"%s\": %s\n" msgid "could not read from streaming transaction's changes file \"%s\": %m" -msgstr "konnte nicht aus Servervariablendatei »%s« lesen: %s\n" +msgstr "konnte nicht aus der Änderungsdatei »%s« einer gestreamten Transaktion lesen: %m" -#: replication/logical/worker.c:1313 +#: replication/logical/worker.c:1750 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" msgstr "Publikationsserver hat nicht die Replikidentitätsspalten gesendet, die von Replikationszielrelation »%s.%s« erwartet wurden" -#: replication/logical/worker.c:1320 +#: replication/logical/worker.c:1757 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "Zielrelation für logische Replikation »%s.%s« hat weder REPLICA-IDENTITY-Index noch Primärschlüssel und die publizierte Relation hat kein REPLICA IDENTITY FULL" -#: replication/logical/worker.c:2039 -#, c-format +#: replication/logical/worker.c:2552 +#, fuzzy, c-format +#| msgid "invalid standby message type \"%c\"" msgid "invalid logical replication message type \"%c\"" -msgstr "ungültiger Nachrichtentyp für logische Replikation »%c«" +msgstr "ungültiger Standby-Message-Typ »%c«" -#: replication/logical/worker.c:2190 +#: replication/logical/worker.c:2716 #, c-format msgid "data stream from publisher has ended" msgstr "Datenstrom vom Publikationsserver endete" -#: replication/logical/worker.c:2340 +#: replication/logical/worker.c:2867 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "Arbeitsprozess für logische Replikation wird abgebrochen wegen Zeitüberschreitung" -#: replication/logical/worker.c:2488 +#: replication/logical/worker.c:3029 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" msgstr "Apply-Worker für logische Replikation für Subskription »%s« wird anhalten, weil die Subskription entfernt wurde" -#: replication/logical/worker.c:2502 +#: replication/logical/worker.c:3040 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "Apply-Worker für logische Replikation für Subskription »%s« wird anhalten, weil die Subskription deaktiviert wurde" -#: replication/logical/worker.c:2524 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" will restart because subscription was renamed" +#: replication/logical/worker.c:3066 +#, c-format msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" -msgstr "Apply-Worker für logische Replikation für Subskription »%s« wird neu starten, weil die Subskription umbenannt wurde" +msgstr "Apply-Worker für logische Replikation für Subskription »%s« wird neu starten wegen einer Parameteränderung" -#: replication/logical/worker.c:2687 replication/logical/worker.c:2709 -#, fuzzy, c-format -#| msgid "could not read from file \"%s\": %m" +#: replication/logical/worker.c:3190 replication/logical/worker.c:3212 +#, c-format msgid "could not read from streaming transaction's subxact file \"%s\": %m" -msgstr "konnte nicht aus Datei »%s« lesen: %m" +msgstr "konnte nicht aus der subxact-Datei »%s« einer gestreamten Transaktion lesen: %m" -#: replication/logical/worker.c:3055 +#: replication/logical/worker.c:3611 #, c-format msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" msgstr "Apply-Worker für logische Replikation für Subskription %u« wird nicht starten, weil die Subskription während des Starts deaktiviert wurde" -#: replication/logical/worker.c:3067 +#: replication/logical/worker.c:3623 #, c-format msgid "logical replication apply worker for subscription \"%s\" will not start because the subscription was disabled during startup" msgstr "Apply-Worker für logische Replikation für Subskription »%s« wird nicht starten, weil die Subskription während des Starts deaktiviert wurde" -#: replication/logical/worker.c:3085 +#: replication/logical/worker.c:3641 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "Arbeitsprozess für logische Replikation für Tabellensynchronisation für Subskription »%s«, Tabelle »%s« hat gestartet" -#: replication/logical/worker.c:3089 +#: replication/logical/worker.c:3645 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "Apply-Worker für logische Replikation für Subskription »%s« hat gestartet" -#: replication/logical/worker.c:3126 +#: replication/logical/worker.c:3686 #, c-format msgid "subscription has no replication slot set" msgstr "für die Subskription ist kein Replikations-Slot gesetzt" -#: replication/pgoutput/pgoutput.c:195 +#: replication/logical/worker.c:3773 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription \"%s\" has started" +msgid "logical replication apply worker for subscription \"%s\" two_phase is %s" +msgstr "Apply-Worker für logische Replikation für Subskription »%s« hat gestartet" + +#: replication/logical/worker.c:3822 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription \"%s\" has started" +msgid "logical replication subscription \"%s\" has been disabled due to an error" +msgstr "Apply-Worker für logische Replikation für Subskription »%s« hat gestartet" + +#: replication/logical/worker.c:3861 +#, c-format +msgid "start skipping logical replication transaction finished at %X/%X" +msgstr "" + +#: replication/logical/worker.c:3875 +#, c-format +msgid "done skipping logical replication transaction finished at %X/%X" +msgstr "" + +#: replication/logical/worker.c:3957 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription \"%s\" has started" +msgid "skip-LSN of logical replication subscription \"%s\" cleared" +msgstr "Apply-Worker für logische Replikation für Subskription »%s« hat gestartet" + +#: replication/logical/worker.c:3958 +#, c-format +msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X" +msgstr "" + +#: replication/logical/worker.c:3984 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during \"%s\"" +msgstr "Verarbeiten empfangener Daten für Replikationszielrelation »%s.%s« Spalte »%s«" + +#: replication/logical/worker.c:3988 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during \"%s\" in transaction %u" +msgstr "Verarbeiten empfangener Daten für Replikationszielrelation »%s.%s« Spalte »%s«" + +#: replication/logical/worker.c:3993 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during \"%s\" in transaction %u finished at %X/%X" +msgstr "Verarbeiten empfangener Daten für Replikationszielrelation »%s.%s« Spalte »%s«" + +#: replication/logical/worker.c:4000 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during \"%s\" for replication target relation \"%s.%s\" in transaction %u finished at %X/%X" +msgstr "Verarbeiten empfangener Daten für Replikationszielrelation »%s.%s« Spalte »%s«" + +#: replication/logical/worker.c:4008 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u finished at %X/%X" +msgstr "Verarbeiten empfangener Daten für Replikationszielrelation »%s.%s« Spalte »%s«" + +#: replication/pgoutput/pgoutput.c:319 #, c-format msgid "invalid proto_version" msgstr "ungültige proto_version" -#: replication/pgoutput/pgoutput.c:200 +#: replication/pgoutput/pgoutput.c:324 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version »%s« ist außerhalb des gültigen Bereichs" -#: replication/pgoutput/pgoutput.c:217 +#: replication/pgoutput/pgoutput.c:341 #, c-format msgid "invalid publication_names syntax" msgstr "ungültige Syntax für publication_names" -#: replication/pgoutput/pgoutput.c:287 +#: replication/pgoutput/pgoutput.c:425 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or lower" msgstr "Client sendete proto_version=%d, aber wir unterstützen nur Protokoll %d oder niedriger" -#: replication/pgoutput/pgoutput.c:293 +#: replication/pgoutput/pgoutput.c:431 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or higher" msgstr "Client sendete proto_version=%d, aber wir unterstützen nur Protokoll %d oder höher" -#: replication/pgoutput/pgoutput.c:299 +#: replication/pgoutput/pgoutput.c:437 #, c-format msgid "publication_names parameter missing" msgstr "Parameter »publication_names« fehlt" -#: replication/pgoutput/pgoutput.c:312 -#, fuzzy, c-format -#| msgid "client sent proto_version=%d but we only support protocol %d or higher" +#: replication/pgoutput/pgoutput.c:450 +#, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" -msgstr "Client sendete proto_version=%d, aber wir unterstützen nur Protokoll %d oder höher" +msgstr "angeforderte proto_version=%d unterstützt Streaming nicht, benötigt %d oder höher" -#: replication/pgoutput/pgoutput.c:317 -#, fuzzy, c-format -#| msgid "integer of size %lu not supported by pqPutInt" +#: replication/pgoutput/pgoutput.c:455 +#, c-format msgid "streaming requested, but not supported by output plugin" -msgstr "Integer der Größe %lu wird von pqPutInt nicht unterstützt" +msgstr "Streaming angefordert, aber wird vom Ausgabe-Plugin nicht unterstützt" + +#: replication/pgoutput/pgoutput.c:472 +#, fuzzy, c-format +#| msgid "requested proto_version=%d does not support streaming, need %d or higher" +msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" +msgstr "angeforderte proto_version=%d unterstützt Streaming nicht, benötigt %d oder höher" + +#: replication/pgoutput/pgoutput.c:477 +#, fuzzy, c-format +#| msgid "streaming requested, but not supported by output plugin" +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "Streaming angefordert, aber wird vom Ausgabe-Plugin nicht unterstützt" -#: replication/slot.c:182 +#: replication/slot.c:209 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "Replikations-Slot-Name »%s« ist zu kurz" -#: replication/slot.c:191 +#: replication/slot.c:218 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "Replikations-Slot-Name »%s« ist zu lang" -#: replication/slot.c:204 +#: replication/slot.c:231 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "Replikations-Slot-Name »%s« enthält ungültiges Zeichen" -#: replication/slot.c:206 +#: replication/slot.c:233 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "Replikations-Slot-Namen dürfen nur Kleinbuchstaben, Zahlen und Unterstriche enthalten." -#: replication/slot.c:260 +#: replication/slot.c:287 #, c-format msgid "replication slot \"%s\" already exists" msgstr "Replikations-Slot »%s« existiert bereits" -#: replication/slot.c:270 +#: replication/slot.c:297 #, c-format msgid "all replication slots are in use" msgstr "alle Replikations-Slots sind in Benutzung" -#: replication/slot.c:271 +#: replication/slot.c:298 #, c-format msgid "Free one or increase max_replication_slots." msgstr "Geben Sie einen frei oder erhöhen Sie max_replication_slots." -#: replication/slot.c:424 replication/slotfuncs.c:761 -#: utils/adt/pgstatfuncs.c:2227 +#: replication/slot.c:448 replication/slotfuncs.c:727 +#: utils/activity/pgstat_replslot.c:55 utils/adt/genfile.c:704 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "Replikations-Slot »%s« existiert nicht" -#: replication/slot.c:462 replication/slot.c:1043 +#: replication/slot.c:494 replication/slot.c:1089 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "Replikations-Slot »%s« ist aktiv für PID %d" -#: replication/slot.c:701 replication/slot.c:1350 replication/slot.c:1733 +#: replication/slot.c:752 replication/slot.c:1507 replication/slot.c:1890 #, c-format msgid "could not remove directory \"%s\"" msgstr "konnte Verzeichnis »%s« nicht löschen" -#: replication/slot.c:1078 +#: replication/slot.c:1124 #, c-format msgid "replication slots can only be used if max_replication_slots > 0" msgstr "Replikations-Slots können nur verwendet werden, wenn max_replication_slots > 0" -#: replication/slot.c:1083 +#: replication/slot.c:1129 #, c-format msgid "replication slots can only be used if wal_level >= replica" msgstr "Replikations-Slots können nur verwendet werden, wenn wal_level >= replica" -#: replication/slot.c:1239 +#: replication/slot.c:1141 +#, c-format +msgid "must be superuser or replication role to use replication slots" +msgstr "nur Superuser und Replikationsrollen können Replikations-Slots verwenden" + +#: replication/slot.c:1326 #, c-format -msgid "terminating process %d because replication slot \"%s\" is too far behind" -msgstr "Prozess %d wird beendet, weil Replikations-Slot »%s« zu weit zurück liegt" +msgid "terminating process %d to release replication slot \"%s\"" +msgstr "Prozess %d wird beendet, um Replikations-Slot »%s« freizugeben" -#: replication/slot.c:1258 +#: replication/slot.c:1370 #, c-format msgid "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds max_slot_wal_keep_size" msgstr "Slot »%s« wird ungültig gemacht, weil seine restart_lsn %X/%X max_slot_wal_keep_size überschreitet" -#: replication/slot.c:1671 +#: replication/slot.c:1828 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "Replikations-Slot-Datei »%s« hat falsche magische Zahl: %u statt %u" -#: replication/slot.c:1678 +#: replication/slot.c:1835 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "Replikations-Slot-Datei »%s« hat nicht unterstützte Version %u" -#: replication/slot.c:1685 +#: replication/slot.c:1842 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "Replikations-Slot-Datei »%s« hat falsche Länge %u" -#: replication/slot.c:1721 +#: replication/slot.c:1878 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "Prüfsummenfehler bei Replikations-Slot-Datei »%s«: ist %u, sollte %u sein" -#: replication/slot.c:1755 +#: replication/slot.c:1912 #, c-format msgid "logical replication slot \"%s\" exists, but wal_level < logical" msgstr "logischer Replikations-Slot »%s« existiert, aber wal_level < logical" -#: replication/slot.c:1757 +#: replication/slot.c:1914 #, c-format msgid "Change wal_level to be logical or higher." msgstr "Ändern Sie wal_level in logical oder höher." -#: replication/slot.c:1761 +#: replication/slot.c:1918 #, c-format msgid "physical replication slot \"%s\" exists, but wal_level < replica" msgstr "physischer Replikations-Slot »%s« existiert, aber wal_level < replica" -#: replication/slot.c:1763 +#: replication/slot.c:1920 #, c-format msgid "Change wal_level to be replica or higher." msgstr "Ändern Sie wal_level in replica oder höher." -#: replication/slot.c:1797 +#: replication/slot.c:1954 #, c-format msgid "too many replication slots active before shutdown" msgstr "zu viele aktive Replikations-Slots vor dem Herunterfahren" -#: replication/slotfuncs.c:626 +#: replication/slotfuncs.c:592 #, c-format msgid "invalid target WAL LSN" msgstr "ungültige Ziel-WAL-LSN" -#: replication/slotfuncs.c:648 +#: replication/slotfuncs.c:614 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "Replikations-Slot »%s« kann nicht vorwärtsgesetzt werden" -#: replication/slotfuncs.c:666 +#: replication/slotfuncs.c:632 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" msgstr "Replikations-Slot kann nicht auf %X/%X vorwärtsgesetzt werden, Minimum ist %X/%X" -#: replication/slotfuncs.c:773 +#: replication/slotfuncs.c:739 #, c-format msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" msgstr "physischer Replikations-Slot »%s« kann nicht als logischer Replikations-Slot kopiert werden" -#: replication/slotfuncs.c:775 +#: replication/slotfuncs.c:741 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "logischer Replikations-Slot »%s« kann nicht als physischer Replikations-Slot kopiert werden" -#: replication/slotfuncs.c:782 +#: replication/slotfuncs.c:748 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "ein Replikations-Slot, der kein WAL reserviert, kann nicht kopiert werden" -#: replication/slotfuncs.c:859 +#: replication/slotfuncs.c:825 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "konnte Replikations-Slot »%s« nicht kopieren" -#: replication/slotfuncs.c:861 +#: replication/slotfuncs.c:827 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "Der Quell-Replikations-Slot wurde während der Kopieroperation inkompatibel geändert." -#: replication/slotfuncs.c:867 +#: replication/slotfuncs.c:833 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "kann unfertigen Replikations-Slot »%s« nicht kopieren" -#: replication/slotfuncs.c:869 +#: replication/slotfuncs.c:835 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "Versuchen Sie es erneut, wenn confirmed_flush_lsn des Quell-Replikations-Slots gültig ist." @@ -19906,597 +20885,618 @@ msgstr "Parser für synchronous_standby_names fehlgeschlagen" msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "Anzahl synchroner Standbys (%d) muss größer als null sein" -#: replication/walreceiver.c:160 +#: replication/walreceiver.c:164 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "WAL-Receiver-Prozess wird abgebrochen aufgrund von Anweisung des Administrators" -#: replication/walreceiver.c:285 +#: replication/walreceiver.c:292 #, c-format msgid "could not connect to the primary server: %s" msgstr "konnte nicht mit dem Primärserver verbinden: %s" -#: replication/walreceiver.c:331 +#: replication/walreceiver.c:339 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "Datenbanksystemidentifikator unterscheidet sich zwischen Primär- und Standby-Server" -#: replication/walreceiver.c:332 +#: replication/walreceiver.c:340 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "Identifikator des Primärservers ist %s, Identifikator des Standby ist %s." -#: replication/walreceiver.c:342 +#: replication/walreceiver.c:351 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "höchste Zeitleiste %u des primären Servers liegt hinter Wiederherstellungszeitleiste %u zurück" -#: replication/walreceiver.c:396 +#: replication/walreceiver.c:404 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "WAL-Streaming vom Primärserver gestartet bei %X/%X auf Zeitleiste %u" -#: replication/walreceiver.c:400 +#: replication/walreceiver.c:408 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "WAL-Streaming neu gestartet bei %X/%X auf Zeitleiste %u" -#: replication/walreceiver.c:428 +#: replication/walreceiver.c:437 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "kann WAL-Streaming nicht fortsetzen, Wiederherstellung ist bereits beendet" -#: replication/walreceiver.c:465 +#: replication/walreceiver.c:475 #, c-format msgid "replication terminated by primary server" msgstr "Replikation wurde durch Primärserver beendet" -#: replication/walreceiver.c:466 +#: replication/walreceiver.c:476 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "WAL-Ende erreicht auf Zeitleiste %u bei %X/%X." -#: replication/walreceiver.c:554 +#: replication/walreceiver.c:565 #, c-format msgid "terminating walreceiver due to timeout" msgstr "WAL-Receiver-Prozess wird abgebrochen wegen Zeitüberschreitung" -#: replication/walreceiver.c:592 +#: replication/walreceiver.c:603 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "Primärserver enthält kein WAL mehr auf angeforderter Zeitleiste %u" -#: replication/walreceiver.c:608 replication/walreceiver.c:903 +#: replication/walreceiver.c:619 replication/walreceiver.c:1045 #, c-format msgid "could not close log segment %s: %m" msgstr "konnte Logsegment %s nicht schließen: %m" -#: replication/walreceiver.c:727 +#: replication/walreceiver.c:738 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "hole Zeitleisten-History-Datei für Zeitleiste %u vom Primärserver" -#: replication/walreceiver.c:950 +#: replication/walreceiver.c:933 #, c-format msgid "could not write to log segment %s at offset %u, length %lu: %m" msgstr "konnte nicht in Logsegment %s bei Position %u, Länge %lu schreiben: %m" -#: replication/walsender.c:524 storage/smgr/md.c:1320 +#: replication/walsender.c:521 +#, fuzzy, c-format +#| msgid "cannot read from logical replication slot \"%s\"" +msgid "cannot use \"%s\" with logical replication slot \"%s\"" +msgstr "kann nicht aus logischem Replikations-Slot »%s« lesen" + +#: replication/walsender.c:639 storage/smgr/md.c:1333 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "konnte Positionszeiger nicht ans Ende der Datei »%s« setzen: %m" -#: replication/walsender.c:528 +#: replication/walsender.c:643 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "konnte Positionszeiger nicht den Anfang der Datei »%s« setzen: %m" -#: replication/walsender.c:579 -#, c-format -msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" -msgstr "IDENTIFY_SYSTEM wurde nicht vor START_REPLICATION ausgeführt" - -#: replication/walsender.c:608 +#: replication/walsender.c:720 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "logischer Replikations-Slot kann nicht für physische Replikation verwendet werden" -#: replication/walsender.c:677 +#: replication/walsender.c:786 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "angeforderter Startpunkt %X/%X auf Zeitleiste %u ist nicht in der History dieses Servers" -#: replication/walsender.c:680 +#: replication/walsender.c:789 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "Die History dieses Servers zweigte von Zeitleiste %u bei %X/%X ab." -#: replication/walsender.c:724 +#: replication/walsender.c:833 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "angeforderter Startpunkt %X/%X ist vor der WAL-Flush-Position dieses Servers %X/%X" +#: replication/walsender.c:1016 +#, fuzzy, c-format +#| msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" +msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" +msgstr "unbekannter Wert für EXPLAIN-Option »%s«: »%s«" + #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:974 +#: replication/walsender.c:1101 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s darf nicht in einer Transaktion aufgerufen werden" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:984 +#: replication/walsender.c:1111 #, c-format msgid "%s must be called inside a transaction" msgstr "%s muss in einer Transaktion aufgerufen werden" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:990 +#: replication/walsender.c:1117 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s muss in einer Transaktion im Isolationsmodus REPEATABLE READ aufgerufen werden" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:996 +#: replication/walsender.c:1123 #, c-format msgid "%s must be called before any query" msgstr "%s muss vor allen Anfragen aufgerufen werden" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1002 +#: replication/walsender.c:1129 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s darf nicht in einer Subtransaktion aufgerufen werden" -#: replication/walsender.c:1145 +#: replication/walsender.c:1272 #, c-format msgid "cannot read from logical replication slot \"%s\"" msgstr "kann nicht aus logischem Replikations-Slot »%s« lesen" -#: replication/walsender.c:1147 +#: replication/walsender.c:1274 #, c-format msgid "This slot has been invalidated because it exceeded the maximum reserved size." msgstr "Dieser Slot wurde ungültig gemacht, weil er die maximale reservierte Größe überschritten hat." -#: replication/walsender.c:1157 +#: replication/walsender.c:1284 #, c-format msgid "terminating walsender process after promotion" msgstr "WAL-Sender-Prozess wird nach Beförderung abgebrochen" -#: replication/walsender.c:1523 +#: replication/walsender.c:1705 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "während der WAL-Sender im Stoppmodus ist können keine neuen Befehle ausgeführt werden" -#: replication/walsender.c:1560 +#: replication/walsender.c:1740 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "im WAL-Sender für physische Replikation können keine SQL-Befehle ausgeführt werden" -#: replication/walsender.c:1583 +#: replication/walsender.c:1773 #, c-format msgid "received replication command: %s" msgstr "Replikationsbefehl empfangen: %s" -#: replication/walsender.c:1591 tcop/fastpath.c:208 tcop/postgres.c:1078 -#: tcop/postgres.c:1430 tcop/postgres.c:1691 tcop/postgres.c:2176 -#: tcop/postgres.c:2586 tcop/postgres.c:2665 +#: replication/walsender.c:1781 tcop/fastpath.c:208 tcop/postgres.c:1114 +#: tcop/postgres.c:1465 tcop/postgres.c:1705 tcop/postgres.c:2190 +#: tcop/postgres.c:2600 tcop/postgres.c:2678 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "aktuelle Transaktion wurde abgebrochen, Befehle werden bis zum Ende der Transaktion ignoriert" -#: replication/walsender.c:1726 replication/walsender.c:1761 +#: replication/walsender.c:1923 replication/walsender.c:1958 #, c-format msgid "unexpected EOF on standby connection" msgstr "unerwartetes EOF auf Standby-Verbindung" -#: replication/walsender.c:1749 +#: replication/walsender.c:1946 #, c-format msgid "invalid standby message type \"%c\"" msgstr "ungültiger Standby-Message-Typ »%c«" -#: replication/walsender.c:1838 +#: replication/walsender.c:2035 #, c-format msgid "unexpected message type \"%c\"" msgstr "unerwarteter Message-Typ »%c«" -#: replication/walsender.c:2251 +#: replication/walsender.c:2448 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "WAL-Sender-Prozess wird abgebrochen wegen Zeitüberschreitung bei der Replikation" -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:999 +#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1001 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "Regel »%s« für Relation »%s« existiert bereits" -#: rewrite/rewriteDefine.c:301 +#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:939 +#, c-format +msgid "relation \"%s\" cannot have rules" +msgstr "Relation »%s« kann keine Regeln haben" + +#: rewrite/rewriteDefine.c:302 #, c-format msgid "rule actions on OLD are not implemented" msgstr "Regelaktionen für OLD sind nicht implementiert" -#: rewrite/rewriteDefine.c:302 +#: rewrite/rewriteDefine.c:303 #, c-format msgid "Use views or triggers instead." msgstr "Verwenden Sie stattdessen Sichten oder Trigger." -#: rewrite/rewriteDefine.c:306 +#: rewrite/rewriteDefine.c:307 #, c-format msgid "rule actions on NEW are not implemented" msgstr "Regelaktionen für NEW sind nicht implementiert" -#: rewrite/rewriteDefine.c:307 +#: rewrite/rewriteDefine.c:308 #, c-format msgid "Use triggers instead." msgstr "Verwenden Sie stattdessen Trigger." -#: rewrite/rewriteDefine.c:320 +#: rewrite/rewriteDefine.c:321 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "INSTEAD-NOTHING-Regeln für SELECT sind nicht implementiert" -#: rewrite/rewriteDefine.c:321 +#: rewrite/rewriteDefine.c:322 #, c-format msgid "Use views instead." msgstr "Verwenden Sie stattdessen Sichten." -#: rewrite/rewriteDefine.c:329 +#: rewrite/rewriteDefine.c:330 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "mehrere Regelaktionen für SELECT-Regeln sind nicht implementiert" -#: rewrite/rewriteDefine.c:339 +#: rewrite/rewriteDefine.c:340 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "Regeln für SELECT müssen als Aktion INSTEAD SELECT haben" -#: rewrite/rewriteDefine.c:347 +#: rewrite/rewriteDefine.c:348 #, c-format msgid "rules on SELECT must not contain data-modifying statements in WITH" msgstr "Regeln für SELECT dürfen keine datenmodifizierenden Anweisungen in WITH enthalten" -#: rewrite/rewriteDefine.c:355 +#: rewrite/rewriteDefine.c:356 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "Ereignisqualifikationen sind nicht implementiert für SELECT-Regeln" -#: rewrite/rewriteDefine.c:382 +#: rewrite/rewriteDefine.c:383 #, c-format msgid "\"%s\" is already a view" msgstr "»%s« ist bereits eine Sicht" -#: rewrite/rewriteDefine.c:406 +#: rewrite/rewriteDefine.c:407 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "Sicht-Regel für »%s« muss »%s« heißen" -#: rewrite/rewriteDefine.c:435 +#: rewrite/rewriteDefine.c:436 #, c-format msgid "cannot convert partitioned table \"%s\" to a view" msgstr "kann partitionierte Tabelle »%s« nicht in eine Sicht umwandeln" -#: rewrite/rewriteDefine.c:444 +#: rewrite/rewriteDefine.c:445 #, c-format msgid "cannot convert partition \"%s\" to a view" msgstr "kann Partition »%s« nicht in eine Sicht umwandeln" -#: rewrite/rewriteDefine.c:453 +#: rewrite/rewriteDefine.c:454 #, c-format msgid "could not convert table \"%s\" to a view because it is not empty" msgstr "konnte Tabelle »%s« nicht in Sicht umwandeln, weil sie nicht leer ist" -#: rewrite/rewriteDefine.c:462 +#: rewrite/rewriteDefine.c:463 #, c-format msgid "could not convert table \"%s\" to a view because it has triggers" msgstr "konnte Tabelle »%s« nicht in Sicht umwandeln, weil sie Trigger hat" -#: rewrite/rewriteDefine.c:464 +#: rewrite/rewriteDefine.c:465 #, c-format msgid "In particular, the table cannot be involved in any foreign key relationships." msgstr "Insbesondere darf die Tabelle nicht in Fremschlüsselverhältnisse eingebunden sein." -#: rewrite/rewriteDefine.c:469 +#: rewrite/rewriteDefine.c:470 #, c-format msgid "could not convert table \"%s\" to a view because it has indexes" msgstr "konnte Tabelle »%s« nicht in Sicht umwandeln, weil sie Indexe hat" -#: rewrite/rewriteDefine.c:475 +#: rewrite/rewriteDefine.c:476 #, c-format msgid "could not convert table \"%s\" to a view because it has child tables" msgstr "konnte Tabelle »%s« nicht in Sicht umwandeln, weil sie abgeleitete Tabellen hat" -#: rewrite/rewriteDefine.c:481 +#: rewrite/rewriteDefine.c:482 #, c-format msgid "could not convert table \"%s\" to a view because it has parent tables" msgstr "konnte Tabelle »%s« nicht in Sicht umwandeln, weil sie Elterntabellen hat" -#: rewrite/rewriteDefine.c:487 +#: rewrite/rewriteDefine.c:488 #, c-format msgid "could not convert table \"%s\" to a view because it has row security enabled" msgstr "konnte Tabelle »%s« nicht in Sicht umwandeln, weil sie Sicherheit auf Zeilenebene eingeschaltet hat" -#: rewrite/rewriteDefine.c:493 +#: rewrite/rewriteDefine.c:494 #, c-format msgid "could not convert table \"%s\" to a view because it has row security policies" msgstr "konnte Tabelle »%s« nicht in Sicht umwandeln, weil sie Policys für Sicherheit auf Zeilenebene hat" -#: rewrite/rewriteDefine.c:520 +#: rewrite/rewriteDefine.c:521 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "Regel kann nicht mehrere RETURNING-Listen enthalten" -#: rewrite/rewriteDefine.c:525 +#: rewrite/rewriteDefine.c:526 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "RETURNING-Listen werden in Regeln mit Bedingung nicht unterstützt" -#: rewrite/rewriteDefine.c:529 +#: rewrite/rewriteDefine.c:530 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "RETURNING-Listen werden nur in INSTEAD-Regeln unterstützt" -#: rewrite/rewriteDefine.c:693 +#: rewrite/rewriteDefine.c:694 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "Targetliste von SELECT-Regel hat zu viele Einträge" -#: rewrite/rewriteDefine.c:694 +#: rewrite/rewriteDefine.c:695 #, c-format msgid "RETURNING list has too many entries" msgstr "RETURNING-Liste hat zu viele Einträge" -#: rewrite/rewriteDefine.c:721 +#: rewrite/rewriteDefine.c:722 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "kann Relation mit gelöschten Spalten nicht in Sicht umwandeln" -#: rewrite/rewriteDefine.c:722 +#: rewrite/rewriteDefine.c:723 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "für eine Relation mit gelöschten Spalten kann keine RETURNING-Liste erzeugt werden" -#: rewrite/rewriteDefine.c:728 +#: rewrite/rewriteDefine.c:729 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "Spaltenname in Targeteintrag %d von SELECT-Regel unterscheidet sich von Spalte »%s«" -#: rewrite/rewriteDefine.c:730 +#: rewrite/rewriteDefine.c:731 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "SELECT-Targeteintrag heißt »%s«." -#: rewrite/rewriteDefine.c:739 +#: rewrite/rewriteDefine.c:740 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "Typ von Targeteintrag %d von SELECT-Regel unterscheidet sich von Spalte »%s«" -#: rewrite/rewriteDefine.c:741 +#: rewrite/rewriteDefine.c:742 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "Eintrag %d in RETURNING-Liste hat anderen Typ als Spalte »%s«" -#: rewrite/rewriteDefine.c:744 rewrite/rewriteDefine.c:768 +#: rewrite/rewriteDefine.c:745 rewrite/rewriteDefine.c:769 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "SELECT-Targeteintrag hat Typ %s, aber Spalte hat Typ %s." -#: rewrite/rewriteDefine.c:747 rewrite/rewriteDefine.c:772 +#: rewrite/rewriteDefine.c:748 rewrite/rewriteDefine.c:773 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "Eintrag in RETURNING-Liste hat Typ %s, aber Spalte hat Typ %s." -#: rewrite/rewriteDefine.c:763 +#: rewrite/rewriteDefine.c:764 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "Größe von Targeteintrag %d von SELECT-Regel unterscheidet sich von Spalte »%s«" -#: rewrite/rewriteDefine.c:765 +#: rewrite/rewriteDefine.c:766 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "Eintrag %d in RETURNING-Liste hat andere Größe als Spalte »%s«" -#: rewrite/rewriteDefine.c:782 +#: rewrite/rewriteDefine.c:783 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "Targetliste von SELECT-Regeln hat zu wenige Einträge" -#: rewrite/rewriteDefine.c:783 +#: rewrite/rewriteDefine.c:784 #, c-format msgid "RETURNING list has too few entries" msgstr "RETURNING-Liste hat zu wenige Einträge" -#: rewrite/rewriteDefine.c:876 rewrite/rewriteDefine.c:990 +#: rewrite/rewriteDefine.c:877 rewrite/rewriteDefine.c:992 #: rewrite/rewriteSupport.c:109 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "Regel »%s« für Relation »%s« existiert nicht" -#: rewrite/rewriteDefine.c:1009 +#: rewrite/rewriteDefine.c:1011 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "Umbenennen einer ON-SELECT-Regel ist nicht erlaubt" -#: rewrite/rewriteHandler.c:551 +#: rewrite/rewriteHandler.c:554 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "WITH-Anfragename »%s« erscheint sowohl in der Regelaktion als auch in der umzuschreibenden Anfrage" -#: rewrite/rewriteHandler.c:611 +#: rewrite/rewriteHandler.c:581 +#, c-format +msgid "INSERT...SELECT rule actions are not supported for queries having data-modifying statements in WITH" +msgstr "INSTEAD...SELECT-Regelaktionen werden für Anfrangen mit datenmodifizierenden Anweisungen in WITH nicht unterstützt" + +#: rewrite/rewriteHandler.c:634 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "RETURNING-Listen können nicht in mehreren Regeln auftreten" -#: rewrite/rewriteHandler.c:843 rewrite/rewriteHandler.c:882 -#, fuzzy, c-format -#| msgid "cannot insert into column \"%s\"" +#: rewrite/rewriteHandler.c:866 rewrite/rewriteHandler.c:905 +#, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" -msgstr "kann nicht in Spalte »%s« einfügen" +msgstr "kann keinen Wert außer DEFAULT in Spalte »%s« einfügen" -#: rewrite/rewriteHandler.c:845 rewrite/rewriteHandler.c:911 +#: rewrite/rewriteHandler.c:868 rewrite/rewriteHandler.c:934 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "Spalte »%s« ist eine Identitätsspalte, die als GENERATED ALWAYS definiert ist." -#: rewrite/rewriteHandler.c:847 +#: rewrite/rewriteHandler.c:870 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Verwenden Sie OVERRIDING SYSTEM VALUE, um diese Einschränkung außer Kraft zu setzen." -#: rewrite/rewriteHandler.c:909 rewrite/rewriteHandler.c:917 +#: rewrite/rewriteHandler.c:932 rewrite/rewriteHandler.c:940 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "Spalte »%s« kann nur auf DEFAULT aktualisiert werden" -#: rewrite/rewriteHandler.c:1064 rewrite/rewriteHandler.c:1082 +#: rewrite/rewriteHandler.c:1087 rewrite/rewriteHandler.c:1105 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "mehrere Zuweisungen zur selben Spalte »%s«" -#: rewrite/rewriteHandler.c:2084 rewrite/rewriteHandler.c:3898 +#: rewrite/rewriteHandler.c:2111 rewrite/rewriteHandler.c:3978 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "unendliche Rekursion entdeckt in Regeln für Relation »%s«" -#: rewrite/rewriteHandler.c:2169 +#: rewrite/rewriteHandler.c:2196 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "unendliche Rekursion entdeckt in Policys für Relation »%s«" -#: rewrite/rewriteHandler.c:2489 +#: rewrite/rewriteHandler.c:2516 msgid "Junk view columns are not updatable." msgstr "Junk-Sichtspalten sind nicht aktualisierbar." -#: rewrite/rewriteHandler.c:2494 +#: rewrite/rewriteHandler.c:2521 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Sichtspalten, die nicht Spalten ihrer Basisrelation sind, sind nicht aktualisierbar." -#: rewrite/rewriteHandler.c:2497 +#: rewrite/rewriteHandler.c:2524 msgid "View columns that refer to system columns are not updatable." msgstr "Sichtspalten, die auf Systemspalten verweisen, sind nicht aktualisierbar." -#: rewrite/rewriteHandler.c:2500 +#: rewrite/rewriteHandler.c:2527 msgid "View columns that return whole-row references are not updatable." msgstr "Sichtspalten, die Verweise auf ganze Zeilen zurückgeben, sind nicht aktualisierbar." -#: rewrite/rewriteHandler.c:2561 +#: rewrite/rewriteHandler.c:2588 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Sichten, die DISTINCT enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2564 +#: rewrite/rewriteHandler.c:2591 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Sichten, die GROUP BY enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2567 +#: rewrite/rewriteHandler.c:2594 msgid "Views containing HAVING are not automatically updatable." msgstr "Sichten, die HAVING enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2570 +#: rewrite/rewriteHandler.c:2597 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Sichten, die UNION, INTERSECT oder EXCEPT enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2573 +#: rewrite/rewriteHandler.c:2600 msgid "Views containing WITH are not automatically updatable." msgstr "Sichten, die WITH enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2576 +#: rewrite/rewriteHandler.c:2603 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Sichten, die LIMIT oder OFFSET enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2588 +#: rewrite/rewriteHandler.c:2615 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Sichten, die Aggregatfunktionen zurückgeben, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2591 +#: rewrite/rewriteHandler.c:2618 msgid "Views that return window functions are not automatically updatable." msgstr "Sichten, die Fensterfunktionen zurückgeben, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2594 +#: rewrite/rewriteHandler.c:2621 msgid "Views that return set-returning functions are not automatically updatable." msgstr "Sichten, die Funktionen mit Ergebnismenge zurückgeben, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2601 rewrite/rewriteHandler.c:2605 -#: rewrite/rewriteHandler.c:2613 +#: rewrite/rewriteHandler.c:2628 rewrite/rewriteHandler.c:2632 +#: rewrite/rewriteHandler.c:2640 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "Sichten, die nicht aus einer einzigen Tabelle oder Sicht lesen, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2616 +#: rewrite/rewriteHandler.c:2643 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Sichten, die TABLESAMPLE enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2640 +#: rewrite/rewriteHandler.c:2667 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Sichten, die keine aktualisierbaren Spalten haben, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:3117 +#: rewrite/rewriteHandler.c:3144 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "kann nicht in Spalte »%s« von Sicht »%s« einfügen" -#: rewrite/rewriteHandler.c:3125 +#: rewrite/rewriteHandler.c:3152 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "kann Spalte »%s« von Sicht »%s« nicht aktualisieren" -#: rewrite/rewriteHandler.c:3603 +#: rewrite/rewriteHandler.c:3639 +#, c-format +msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" +msgstr "DO-INSTEAD-NOTIFY-Regeln werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" + +#: rewrite/rewriteHandler.c:3650 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "DO-INSTEAD-NOTHING-Regeln werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:3617 +#: rewrite/rewriteHandler.c:3664 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "DO-INSTEAD-Regeln mit Bedingung werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:3621 +#: rewrite/rewriteHandler.c:3668 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "DO-ALSO-Regeln werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:3626 +#: rewrite/rewriteHandler.c:3673 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "DO-INSTEAD-Regeln mit mehreren Anweisungen werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:3826 rewrite/rewriteHandler.c:3834 -#: rewrite/rewriteHandler.c:3842 +#: rewrite/rewriteHandler.c:3906 rewrite/rewriteHandler.c:3914 +#: rewrite/rewriteHandler.c:3922 #, c-format msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "Sichten mit DO-INSTEAD-Regeln mit Bedingung sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:3935 +#: rewrite/rewriteHandler.c:4015 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "INSERT RETURNING kann in Relation »%s« nicht ausgeführt werden" -#: rewrite/rewriteHandler.c:3937 +#: rewrite/rewriteHandler.c:4017 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "Sie benötigen eine ON INSERT DO INSTEAD Regel ohne Bedingung, mit RETURNING-Klausel." -#: rewrite/rewriteHandler.c:3942 +#: rewrite/rewriteHandler.c:4022 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "UPDATE RETURNING kann in Relation »%s« nicht ausgeführt werden" -#: rewrite/rewriteHandler.c:3944 +#: rewrite/rewriteHandler.c:4024 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "Sie benötigen eine ON UPDATE DO INSTEAD Regel ohne Bedingung, mit RETURNING-Klausel." -#: rewrite/rewriteHandler.c:3949 +#: rewrite/rewriteHandler.c:4029 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "DELETE RETURNING kann in Relation »%s« nicht ausgeführt werden" -#: rewrite/rewriteHandler.c:3951 +#: rewrite/rewriteHandler.c:4031 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "Sie benötigen eine ON DELETE DO INSTEAD Regel ohne Bedingung, mit RETURNING-Klausel." -#: rewrite/rewriteHandler.c:3969 +#: rewrite/rewriteHandler.c:4049 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "INSERT mit ON-CONFLICT-Klausel kann nicht mit Tabelle verwendet werden, die INSERT- oder UPDATE-Regeln hat" -#: rewrite/rewriteHandler.c:4026 +#: rewrite/rewriteHandler.c:4106 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH kann nicht in einer Anfrage verwendet werden, die durch Regeln in mehrere Anfragen umgeschrieben wird" @@ -20516,101 +21516,115 @@ msgstr "WHERE CURRENT OF mit einer Sicht ist nicht implementiert" msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" msgstr "NEW-Variablen in ON UPDATE-Regeln können nicht auf Spalten verweisen, die Teil einer Mehrfachzuweisung in dem UPDATE-Befehl sind" -#: scan.l:458 +#: rewrite/rewriteSearchCycle.c:410 +#, fuzzy, c-format +#| msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" +msgid "with a SEARCH or CYCLE clause, the recursive reference to WITH query \"%s\" must be at the top level of its right-hand SELECT" +msgstr "mit einer SEARCH- oder CYCLE-Klausel muss die linke Seite von UNION ein SELECT sein" + +#: scan.l:465 msgid "unterminated /* comment" msgstr "/*-Kommentar nicht abgeschlossen" -#: scan.l:478 +#: scan.l:485 msgid "unterminated bit string literal" msgstr "Bitkettenkonstante nicht abgeschlossen" -#: scan.l:492 +#: scan.l:499 msgid "unterminated hexadecimal string literal" msgstr "hexadezimale Zeichenkette nicht abgeschlossen" -#: scan.l:542 +#: scan.l:549 #, c-format msgid "unsafe use of string constant with Unicode escapes" msgstr "unsichere Verwendung von Zeichenkette mit Unicode-Escapes" -#: scan.l:543 +#: scan.l:550 #, c-format msgid "String constants with Unicode escapes cannot be used when standard_conforming_strings is off." msgstr "Zeichenketten mit Unicode-Escapes können nicht verwendet werden, wenn standard_conforming_strings aus ist." -#: scan.l:604 +#: scan.l:611 msgid "unhandled previous state in xqs" msgstr "unbehandelter vorheriger Zustand in xqs" -#: scan.l:678 +#: scan.l:685 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "Unicode-Escapes müssen \\uXXXX oder \\UXXXXXXXX sein." -#: scan.l:689 +#: scan.l:696 #, c-format msgid "unsafe use of \\' in a string literal" msgstr "unsichere Verwendung von \\' in Zeichenkettenkonstante" -#: scan.l:690 +#: scan.l:697 #, c-format msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." msgstr "Verwenden Sie '', um Quotes in Zeichenketten zu schreiben. \\' ist in bestimmten Client-seitigen Kodierungen unsicher." -#: scan.l:762 +#: scan.l:769 msgid "unterminated dollar-quoted string" msgstr "Dollar-Quotes nicht abgeschlossen" -#: scan.l:779 scan.l:789 +#: scan.l:786 scan.l:796 msgid "zero-length delimited identifier" msgstr "Bezeichner in Anführungszeichen hat Länge null" -#: scan.l:800 syncrep_scanner.l:91 +#: scan.l:807 syncrep_scanner.l:91 msgid "unterminated quoted identifier" msgstr "Bezeichner in Anführungszeichen nicht abgeschlossen" -#: scan.l:963 +#: scan.l:970 msgid "operator too long" msgstr "Operator zu lang" +#: scan.l:983 +msgid "trailing junk after parameter" +msgstr "Müll folgt auf Parameter" + +#: scan.l:1008 scan.l:1012 scan.l:1016 scan.l:1020 +msgid "trailing junk after numeric literal" +msgstr "Müll folgt auf numerische Konstante" + #. translator: %s is typically the translation of "syntax error" -#: scan.l:1171 +#: scan.l:1183 #, c-format msgid "%s at end of input" msgstr "%s am Ende der Eingabe" #. translator: first %s is typically the translation of "syntax error" -#: scan.l:1179 +#: scan.l:1191 #, c-format msgid "%s at or near \"%s\"" msgstr "%s bei »%s«" -#: scan.l:1373 +#: scan.l:1382 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "nicht standardkonforme Verwendung von \\' in Zeichenkettenkonstante" -#: scan.l:1374 +#: scan.l:1383 #, c-format msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "Verwenden Sie '', um Quotes in Zeichenketten zu schreiben, oder verwenden Sie die Syntax für Escape-Zeichenketten (E'...')." -#: scan.l:1383 +#: scan.l:1392 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "nicht standardkonforme Verwendung von \\\\ in Zeichenkettenkonstante" -#: scan.l:1384 +#: scan.l:1393 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "Verwenden Sie die Syntax für Escape-Zeichenketten für Backslashes, z.B. E'\\\\'." -#: scan.l:1398 +#: scan.l:1407 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "nicht standardkonforme Verwendung von Escape in Zeichenkettenkonstante" -#: scan.l:1399 +#: scan.l:1408 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "Verwenden Sie die Syntax für Escape-Zeichenketten, z.B. E'\\r\\n'." @@ -20641,58 +21655,57 @@ msgstr "unbekannter Snowball-Parameter: »%s«" msgid "missing Language parameter" msgstr "Parameter »Language« fehlt" -#: statistics/extended_stats.c:175 +#: statistics/extended_stats.c:179 #, c-format msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "Statistikobjekt »%s.%s« konnte für Relation »%s.%s« nicht berechnet werden" -#: statistics/extended_stats.c:2277 -#, fuzzy, c-format -#| msgid "relation \"%s\" does not have a composite type" -msgid "relation \"pg_statistic\" does not have a composite type" -msgstr "Relation »%s« hat keinen zusammengesetzten Typ" - -#: statistics/mcv.c:1368 utils/adt/jsonfuncs.c:1941 +#: statistics/mcv.c:1372 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "Funktion, die einen Record zurückgibt, in einem Zusammenhang aufgerufen, der Typ record nicht verarbeiten kann" -#: storage/buffer/bufmgr.c:601 storage/buffer/bufmgr.c:761 +#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:763 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "auf temporäre Tabellen anderer Sitzungen kann nicht zugegriffen werden" -#: storage/buffer/bufmgr.c:917 +#: storage/buffer/bufmgr.c:841 +#, c-format +msgid "cannot extend relation %s beyond %u blocks" +msgstr "kann Relation %s nicht auf über %u Blöcke erweitern" + +#: storage/buffer/bufmgr.c:928 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "unerwartete Daten hinter Dateiende in Block %u von Relation %s" -#: storage/buffer/bufmgr.c:919 +#: storage/buffer/bufmgr.c:930 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "Das scheint mit fehlerhaften Kernels vorzukommen; Sie sollten eine Systemaktualisierung in Betracht ziehen." -#: storage/buffer/bufmgr.c:1018 +#: storage/buffer/bufmgr.c:1029 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "ungültige Seite in Block %u von Relation %s; fülle Seite mit Nullen" -#: storage/buffer/bufmgr.c:4524 +#: storage/buffer/bufmgr.c:4657 #, c-format msgid "could not write block %u of %s" msgstr "konnte Block %u von %s nicht schreiben" -#: storage/buffer/bufmgr.c:4526 +#: storage/buffer/bufmgr.c:4659 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Mehrere Fehlschläge --- Schreibfehler ist möglicherweise dauerhaft." -#: storage/buffer/bufmgr.c:4547 storage/buffer/bufmgr.c:4566 +#: storage/buffer/bufmgr.c:4680 storage/buffer/bufmgr.c:4699 #, c-format msgid "writing block %u of relation %s" msgstr "schreibe Block %u von Relation %s" -#: storage/buffer/bufmgr.c:4870 +#: storage/buffer/bufmgr.c:5003 #, c-format msgid "snapshot too old" msgstr "Snapshot zu alt" @@ -20707,156 +21720,174 @@ msgstr "kein leerer lokaler Puffer verfügbar" msgid "cannot access temporary tables during a parallel operation" msgstr "während einer parallelen Operation kann nicht auf temporäre Tabellen zugegriffen werden" -#: storage/file/buffile.c:323 +#: storage/file/buffile.c:333 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "konnte temporäre Datei »%s« von BufFile »%s« nicht öffnen: %m" -#: storage/file/buffile.c:684 storage/file/buffile.c:805 +#: storage/file/buffile.c:723 storage/file/buffile.c:844 #, c-format msgid "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" msgstr "konnte Größe von temporärer Datei »%s« von BufFile »%s« nicht bestimmen: %m" -#: storage/file/buffile.c:884 +#: storage/file/buffile.c:923 #, fuzzy, c-format #| msgid "could not delete file \"%s\": %m" -msgid "could not delete shared fileset \"%s\": %m" +msgid "could not delete fileset \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %m" -#: storage/file/buffile.c:902 storage/smgr/md.c:306 storage/smgr/md.c:865 +#: storage/file/buffile.c:941 storage/smgr/md.c:310 storage/smgr/md.c:873 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "kann Datei »%s« nicht kürzen: %m" -#: storage/file/fd.c:515 storage/file/fd.c:587 storage/file/fd.c:623 +#: storage/file/fd.c:522 storage/file/fd.c:594 storage/file/fd.c:630 #, c-format msgid "could not flush dirty data: %m" msgstr "konnte schmutzige Daten nicht flushen: %m" -#: storage/file/fd.c:545 +#: storage/file/fd.c:552 #, c-format msgid "could not determine dirty data size: %m" msgstr "konnte Größe der schmutzigen Daten nicht bestimmen: %m" -#: storage/file/fd.c:597 +#: storage/file/fd.c:604 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "munmap() fehlgeschlagen beim Flushen von Daten: %m" -#: storage/file/fd.c:836 +#: storage/file/fd.c:843 #, c-format msgid "could not link file \"%s\" to \"%s\": %m" msgstr "konnte Datei »%s« nicht nach »%s« linken: %m" -#: storage/file/fd.c:929 +#: storage/file/fd.c:967 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit fehlgeschlagen: %m" -#: storage/file/fd.c:1019 +#: storage/file/fd.c:1057 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "nicht genug Dateideskriptoren verfügbar, um Serverprozess zu starten" -#: storage/file/fd.c:1020 +#: storage/file/fd.c:1058 #, c-format msgid "System allows %d, we need at least %d." msgstr "System erlaubt %d, wir benötigen mindestens %d." -#: storage/file/fd.c:1071 storage/file/fd.c:2408 storage/file/fd.c:2518 -#: storage/file/fd.c:2669 +#: storage/file/fd.c:1153 storage/file/fd.c:2496 storage/file/fd.c:2606 +#: storage/file/fd.c:2757 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "keine Dateideskriptoren mehr: %m; freigeben und nochmal versuchen" -#: storage/file/fd.c:1445 +#: storage/file/fd.c:1527 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "temporäre Datei: Pfad »%s«, Größe %lu" -#: storage/file/fd.c:1576 +#: storage/file/fd.c:1658 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "konnte temporäres Verzeichnis »%s« nicht erzeugen: %m" -#: storage/file/fd.c:1583 +#: storage/file/fd.c:1665 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "konnte temporäres Unterverzeichnis »%s« nicht erzeugen: %m" -#: storage/file/fd.c:1776 +#: storage/file/fd.c:1862 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht erzeugen: %m" -#: storage/file/fd.c:1810 +#: storage/file/fd.c:1898 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht öffnen: %m" -#: storage/file/fd.c:1851 +#: storage/file/fd.c:1939 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht löschen: %m" -#: storage/file/fd.c:1939 +#: storage/file/fd.c:2027 #, c-format msgid "could not delete file \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %m" -#: storage/file/fd.c:2119 +#: storage/file/fd.c:2207 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "Größe der temporären Datei überschreitet temp_file_limit (%dkB)" -#: storage/file/fd.c:2384 storage/file/fd.c:2443 +#: storage/file/fd.c:2472 storage/file/fd.c:2531 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "maxAllocatedDescs (%d) überschritten beim Versuch, die Datei »%s« zu öffnen" -#: storage/file/fd.c:2488 +#: storage/file/fd.c:2576 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "maxAllocatedDescs (%d) überschritten beim Versuch, den Befehl »%s« auszuführen" -#: storage/file/fd.c:2645 +#: storage/file/fd.c:2733 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "maxAllocatedDescs (%d) überschritten beim Versuch, das Verzeichnis »%s« zu öffnen" -#: storage/file/fd.c:3175 +#: storage/file/fd.c:3269 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "unerwartete Datei im Verzeichnis für temporäre Dateien gefunden: »%s«" -#: storage/file/fd.c:3298 -#, fuzzy, c-format -#| msgid "could not open file \"%s\": %m" -msgid "could not open %s: %m" -msgstr "konnte Datei »%s« nicht öffnen: %m" +#: storage/file/fd.c:3387 +#, c-format +msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" +msgstr "" -#: storage/file/fd.c:3304 -#, fuzzy, c-format -#| msgid "could not fsync file \"%s\": %m" -msgid "could not sync filesystem for \"%s\": %m" -msgstr "konnte Datei »%s« nicht fsyncen: %m" +#: storage/file/fd.c:3401 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" + +#: storage/file/fd.c:3619 +#, c-format +msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/fd.c:3651 +#, c-format +msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/reinit.c:145 +#, c-format +msgid "resetting unlogged relations (init), elapsed time: %ld.%02d s, current path: %s" +msgstr "" -#: storage/file/sharedfileset.c:144 +#: storage/file/reinit.c:148 +#, c-format +msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/sharedfileset.c:79 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "konnte nicht an ein SharedFileSet anbinden, das schon zerstört ist" -#: storage/ipc/dsm.c:351 +#: storage/ipc/dsm.c:353 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "Kontrollsegment von dynamischem Shared Memory ist verfälscht" -#: storage/ipc/dsm.c:415 +#: storage/ipc/dsm.c:418 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "Kontrollsegment von dynamischem Shared Memory ist ungültig" -#: storage/ipc/dsm.c:592 +#: storage/ipc/dsm.c:600 #, c-format msgid "too many dynamic shared memory segments" msgstr "zu viele dynamische Shared-Memory-Segmente" @@ -20911,41 +21942,46 @@ msgstr "konnte Shared-Memory-Segment »%s« nicht erzeugen: %m" msgid "could not close shared memory segment \"%s\": %m" msgstr "konnte Shared-Memory-Segment »%s« nicht schließen: %m" -#: storage/ipc/dsm_impl.c:975 storage/ipc/dsm_impl.c:1023 +#: storage/ipc/dsm_impl.c:976 storage/ipc/dsm_impl.c:1025 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "konnte Handle für »%s« nicht duplizieren: %m" -#: storage/ipc/procarray.c:3724 +#: storage/ipc/procarray.c:3830 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "Datenbank »%s« wird von vorbereiteten Transaktionen verwendet" -#: storage/ipc/procarray.c:3756 storage/ipc/signalfuncs.c:219 +#: storage/ipc/procarray.c:3862 storage/ipc/signalfuncs.c:226 #, c-format msgid "must be a superuser to terminate superuser process" msgstr "nur Superuser können Prozesse eines Superusers beenden" -#: storage/ipc/procarray.c:3763 storage/ipc/signalfuncs.c:224 +#: storage/ipc/procarray.c:3869 storage/ipc/signalfuncs.c:231 #, c-format msgid "must be a member of the role whose process is being terminated or member of pg_signal_backend" msgstr "muss Mitglied der Rolle sein, deren Prozess beendet wird, oder Mitglied von pg_signal_backend" -#: storage/ipc/shm_mq.c:368 +#: storage/ipc/procsignal.c:419 +#, c-format +msgid "still waiting for backend with PID %lu to accept ProcSignalBarrier" +msgstr "" + +#: storage/ipc/shm_mq.c:384 #, c-format msgid "cannot send a message of size %zu via shared memory queue" msgstr "kann Nachricht mit Größe %zu nicht über Shared-Memory-Queue senden" -#: storage/ipc/shm_mq.c:694 +#: storage/ipc/shm_mq.c:720 #, c-format msgid "invalid message size %zu in shared memory queue" msgstr "ungültige Nachrichtengröße %zu in Shared-Memory-Queue" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:981 -#: storage/lmgr/lock.c:1019 storage/lmgr/lock.c:2844 storage/lmgr/lock.c:4173 -#: storage/lmgr/lock.c:4238 storage/lmgr/lock.c:4545 -#: storage/lmgr/predicate.c:2470 storage/lmgr/predicate.c:2485 -#: storage/lmgr/predicate.c:3967 storage/lmgr/predicate.c:5078 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:982 +#: storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 storage/lmgr/lock.c:4259 +#: storage/lmgr/lock.c:4324 storage/lmgr/lock.c:4674 +#: storage/lmgr/predicate.c:2472 storage/lmgr/predicate.c:2487 +#: storage/lmgr/predicate.c:3969 storage/lmgr/predicate.c:5081 #: utils/hash/dynahash.c:1112 #, c-format msgid "out of shared memory" @@ -20976,137 +22012,125 @@ msgstr "nicht genug Shared-Memory für Datenstruktur »%s« (%zu Bytes angeforde msgid "requested shared memory size overflows size_t" msgstr "angeforderte Shared-Memory-Größe übersteigt Kapazität von size_t" -#: storage/ipc/signalfuncs.c:68 storage/ipc/signalfuncs.c:261 -#: utils/adt/mcxtfuncs.c:196 -#, c-format -msgid "PID %d is not a PostgreSQL server process" +#: storage/ipc/signalfuncs.c:72 +#, fuzzy, c-format +#| msgid "PID %d is not a PostgreSQL server process" +msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %d ist kein PostgreSQL-Serverprozess" -#: storage/ipc/signalfuncs.c:99 storage/lmgr/proc.c:1454 -#: utils/adt/mcxtfuncs.c:210 +#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1430 +#: utils/adt/mcxtfuncs.c:190 #, c-format msgid "could not send signal to process %d: %m" msgstr "konnte Signal nicht an Prozess %d senden: %m" -#: storage/ipc/signalfuncs.c:119 +#: storage/ipc/signalfuncs.c:124 #, c-format msgid "must be a superuser to cancel superuser query" msgstr "nur Superuser können Anfragen eines Superusers stornieren" -#: storage/ipc/signalfuncs.c:124 +#: storage/ipc/signalfuncs.c:129 #, c-format msgid "must be a member of the role whose query is being canceled or member of pg_signal_backend" msgstr "muss Mitglied der Rolle sein, deren Anfrage storniert wird, oder Mitglied von pg_signal_backend" -#: storage/ipc/signalfuncs.c:165 +#: storage/ipc/signalfuncs.c:170 #, c-format msgid "could not check the existence of the backend with PID %d: %m" msgstr "konnte die Existenz des Backend mit PID %d nicht prüfen: %m" -#: storage/ipc/signalfuncs.c:183 -#, fuzzy, c-format -#| msgid "server did not promote within %d seconds" -msgid "backend with PID %d did not terminate within %lld milliseconds" -msgstr "Befördern des Servers wurde nicht innerhalb von %d Sekunden abgeschlossen" +#: storage/ipc/signalfuncs.c:188 +#, c-format +msgid "backend with PID %d did not terminate within %lld millisecond" +msgid_plural "backend with PID %d did not terminate within %lld milliseconds" +msgstr[0] "Backend mit PID %d wurde nicht innerhalb von %lld Millisekunde beendet" +msgstr[1] "Backend mit PID %d wurde nicht innerhalb von %lld Millisekunden beendet" -#: storage/ipc/signalfuncs.c:212 +#: storage/ipc/signalfuncs.c:219 #, c-format msgid "\"timeout\" must not be negative" msgstr "»timeout« darf nicht negativ sein" -#: storage/ipc/signalfuncs.c:254 -#, c-format -msgid "\"timeout\" must not be negative or zero" -msgstr "»timeout« darf nicht negativ oder null sein" - -#: storage/ipc/signalfuncs.c:300 +#: storage/ipc/signalfuncs.c:271 #, c-format msgid "must be superuser to rotate log files with adminpack 1.0" msgstr "nur Superuser können mit adminpack 1.0 Logdateien rotieren" #. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:302 utils/adt/genfile.c:255 +#: storage/ipc/signalfuncs.c:273 utils/adt/genfile.c:250 #, c-format msgid "Consider using %s, which is part of core, instead." msgstr "Verwenden Sie stattdessen %s, was im Kernsystem enthalten ist." -#: storage/ipc/signalfuncs.c:308 storage/ipc/signalfuncs.c:328 +#: storage/ipc/signalfuncs.c:279 storage/ipc/signalfuncs.c:299 #, c-format msgid "rotation not possible because log collection not active" msgstr "Rotierung nicht möglich, weil Logsammlung nicht aktiv ist" -#: storage/ipc/standby.c:305 -#, fuzzy, c-format -#| msgid "process %d still waiting for %s on %s after %ld.%03d ms" +#: storage/ipc/standby.c:307 +#, c-format msgid "recovery still waiting after %ld.%03d ms: %s" -msgstr "Prozess %d wartet immer noch auf %s-Sperre auf %s nach %ld,%03d ms" +msgstr "Wiederherstellung wartet immer noch nach %ld,%03d ms: %s" -#: storage/ipc/standby.c:314 -#, fuzzy, c-format -#| msgid "process %d still waiting for %s on %s after %ld.%03d ms" +#: storage/ipc/standby.c:316 +#, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" -msgstr "Prozess %d wartet immer noch auf %s-Sperre auf %s nach %ld,%03d ms" +msgstr "Warten der Wiederherstellung beendet nach %ld,%03d ms: %s" -#: storage/ipc/standby.c:878 tcop/postgres.c:3317 +#: storage/ipc/standby.c:883 tcop/postgres.c:3330 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "storniere Anfrage wegen Konflikt mit der Wiederherstellung" -#: storage/ipc/standby.c:879 tcop/postgres.c:2471 +#: storage/ipc/standby.c:884 tcop/postgres.c:2485 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "Benutzertransaktion hat Verklemmung (Deadlock) mit Wiederherstellung verursacht." -#: storage/ipc/standby.c:1421 +#: storage/ipc/standby.c:1423 msgid "unknown reason" msgstr "unbekannter Grund" -#: storage/ipc/standby.c:1426 +#: storage/ipc/standby.c:1428 msgid "recovery conflict on buffer pin" -msgstr "" +msgstr "Konflikt bei der Wiederherstellung wegen Buffer-Pin" -#: storage/ipc/standby.c:1429 -#, fuzzy -#| msgid "abort reason: recovery conflict" +#: storage/ipc/standby.c:1431 msgid "recovery conflict on lock" -msgstr "Abbruchgrund: Konflikt bei Wiederherstellung" +msgstr "Konflikt bei Wiederherstellung wegen Sperre" -#: storage/ipc/standby.c:1432 -#, fuzzy -#| msgid "remove a tablespace" +#: storage/ipc/standby.c:1434 msgid "recovery conflict on tablespace" -msgstr "entfernt einen Tablespace" +msgstr "Konflikt bei Wiederherstellung wegen Tablespace" -#: storage/ipc/standby.c:1435 +#: storage/ipc/standby.c:1437 msgid "recovery conflict on snapshot" -msgstr "" +msgstr "Konflikt bei der Wiederherstellung wegen Snapshot" -#: storage/ipc/standby.c:1438 +#: storage/ipc/standby.c:1440 msgid "recovery conflict on buffer deadlock" -msgstr "" +msgstr "Konflikt bei der Wiederherstellung wegen Buffer-Deadlock" -#: storage/ipc/standby.c:1441 -#, fuzzy -#| msgid "already connected to a database" +#: storage/ipc/standby.c:1443 msgid "recovery conflict on database" -msgstr "bereits mit einer Datenbank verbunden" +msgstr "Konflikt bei Wiederherstellung wegen Datenbank" #: storage/large_object/inv_api.c:191 #, c-format msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" msgstr "pg_largeobject-Eintrag für OID %u, Seite %d hat ungültige Datenfeldgröße %d" -#: storage/large_object/inv_api.c:272 +#: storage/large_object/inv_api.c:274 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "ungültige Flags zum Öffnen eines Large Objects: %d" -#: storage/large_object/inv_api.c:462 +#: storage/large_object/inv_api.c:457 #, c-format msgid "invalid whence setting: %d" msgstr "ungültige »whence«-Angabe: %d" -#: storage/large_object/inv_api.c:634 +#: storage/large_object/inv_api.c:629 #, c-format msgid "invalid large object write request size: %d" msgstr "ungültige Größe der Large-Object-Schreibaufforderung: %d" @@ -21131,123 +22155,123 @@ msgstr "Verklemmung (Deadlock) entdeckt" msgid "See server log for query details." msgstr "Einzelheiten zur Anfrage finden Sie im Serverlog." -#: storage/lmgr/lmgr.c:831 +#: storage/lmgr/lmgr.c:859 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "beim Aktualisieren von Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:834 +#: storage/lmgr/lmgr.c:862 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "beim Löschen von Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:837 +#: storage/lmgr/lmgr.c:865 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "beim Sperren von Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:840 +#: storage/lmgr/lmgr.c:868 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "beim Sperren von aktualisierter Version (%u,%u) von Tupel in Relation »%s«" -#: storage/lmgr/lmgr.c:843 +#: storage/lmgr/lmgr.c:871 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "beim Einfügen von Indextupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:846 +#: storage/lmgr/lmgr.c:874 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "beim Prüfen der Eindeutigkeit von Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:849 +#: storage/lmgr/lmgr.c:877 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "beim erneuten Prüfen des aktualisierten Tupels (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:852 +#: storage/lmgr/lmgr.c:880 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "beim Prüfen eines Exclusion-Constraints für Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:1106 +#: storage/lmgr/lmgr.c:1135 #, c-format msgid "relation %u of database %u" msgstr "Relation %u der Datenbank %u" -#: storage/lmgr/lmgr.c:1112 +#: storage/lmgr/lmgr.c:1141 #, c-format msgid "extension of relation %u of database %u" msgstr "Erweiterung von Relation %u in Datenbank %u" -#: storage/lmgr/lmgr.c:1118 +#: storage/lmgr/lmgr.c:1147 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid der Datenbank %u" -#: storage/lmgr/lmgr.c:1123 +#: storage/lmgr/lmgr.c:1152 #, c-format msgid "page %u of relation %u of database %u" msgstr "Seite %u von Relation %u von Datenbank %u" -#: storage/lmgr/lmgr.c:1130 +#: storage/lmgr/lmgr.c:1159 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "Tupel (%u, %u) von Relation %u von Datenbank %u" -#: storage/lmgr/lmgr.c:1138 +#: storage/lmgr/lmgr.c:1167 #, c-format msgid "transaction %u" msgstr "Transaktion %u" -#: storage/lmgr/lmgr.c:1143 +#: storage/lmgr/lmgr.c:1172 #, c-format msgid "virtual transaction %d/%u" msgstr "virtuelle Transaktion %d/%u" -#: storage/lmgr/lmgr.c:1149 +#: storage/lmgr/lmgr.c:1178 #, c-format msgid "speculative token %u of transaction %u" msgstr "spekulatives Token %u von Transaktion %u" -#: storage/lmgr/lmgr.c:1155 +#: storage/lmgr/lmgr.c:1184 #, c-format msgid "object %u of class %u of database %u" msgstr "Objekt %u von Klasse %u von Datenbank %u" -#: storage/lmgr/lmgr.c:1163 +#: storage/lmgr/lmgr.c:1192 #, c-format msgid "user lock [%u,%u,%u]" msgstr "Benutzersperre [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1170 +#: storage/lmgr/lmgr.c:1199 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "Benutzersperre [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1178 +#: storage/lmgr/lmgr.c:1207 #, c-format msgid "unrecognized locktag type %d" msgstr "unbekannter Locktag-Typ %d" -#: storage/lmgr/lock.c:802 +#: storage/lmgr/lock.c:803 #, c-format msgid "cannot acquire lock mode %s on database objects while recovery is in progress" msgstr "Sperrmodus %s kann während der Wiederherstellung nicht auf Datenbankobjekte gesetzt werden" -#: storage/lmgr/lock.c:804 +#: storage/lmgr/lock.c:805 #, c-format msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." msgstr "Nur Sperren gleich oder unter RowExclusiveLock können während der Wiederherstellung auf Datenbankobjekte gesetzt werden." -#: storage/lmgr/lock.c:982 storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 -#: storage/lmgr/lock.c:4174 storage/lmgr/lock.c:4239 storage/lmgr/lock.c:4546 +#: storage/lmgr/lock.c:983 storage/lmgr/lock.c:1021 storage/lmgr/lock.c:2846 +#: storage/lmgr/lock.c:4260 storage/lmgr/lock.c:4325 storage/lmgr/lock.c:4675 #, c-format msgid "You might need to increase max_locks_per_transaction." msgstr "Sie müssen möglicherweise max_locks_per_transaction erhöhen." -#: storage/lmgr/lock.c:3283 storage/lmgr/lock.c:3399 +#: storage/lmgr/lock.c:3301 storage/lmgr/lock.c:3369 storage/lmgr/lock.c:3485 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" msgstr "PREPARE kann nicht ausgeführt werden, wenn für das selbe Objekt Sperren auf Sitzungsebene und auf Transaktionsebene gehalten werden" @@ -21267,82 +22291,82 @@ msgstr "Sie müssten entweder weniger Transaktionen auf einmal ausführen oder m msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "nicht genügend Elemente in RWConflictPool, um einen möglichen Lese-/Schreibkonflikt aufzuzeichnen" -#: storage/lmgr/predicate.c:1694 +#: storage/lmgr/predicate.c:1695 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "»default_transaction_isolation« ist auf »serializable« gesetzt." -#: storage/lmgr/predicate.c:1695 +#: storage/lmgr/predicate.c:1696 #, c-format msgid "You can use \"SET default_transaction_isolation = 'repeatable read'\" to change the default." msgstr "Mit »SET default_transaction_isolation = 'repeatable read'« können Sie die Voreinstellung ändern." -#: storage/lmgr/predicate.c:1746 +#: storage/lmgr/predicate.c:1747 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "eine Transaktion, die einen Snapshot importiert, must READ ONLY DEFERRABLE sein" -#: storage/lmgr/predicate.c:1825 utils/time/snapmgr.c:567 -#: utils/time/snapmgr.c:573 +#: storage/lmgr/predicate.c:1826 utils/time/snapmgr.c:569 +#: utils/time/snapmgr.c:575 #, c-format msgid "could not import the requested snapshot" msgstr "konnte den angeforderten Snapshot nicht importieren" -#: storage/lmgr/predicate.c:1826 utils/time/snapmgr.c:574 +#: storage/lmgr/predicate.c:1827 utils/time/snapmgr.c:576 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "Der Ausgangsprozess mit PID %d läuft nicht mehr." -#: storage/lmgr/predicate.c:2471 storage/lmgr/predicate.c:2486 -#: storage/lmgr/predicate.c:3968 +#: storage/lmgr/predicate.c:2473 storage/lmgr/predicate.c:2488 +#: storage/lmgr/predicate.c:3970 #, c-format msgid "You might need to increase max_pred_locks_per_transaction." msgstr "Sie müssen möglicherweise max_pred_locks_per_transaction erhöhen." -#: storage/lmgr/predicate.c:4099 storage/lmgr/predicate.c:4135 -#: storage/lmgr/predicate.c:4168 storage/lmgr/predicate.c:4176 -#: storage/lmgr/predicate.c:4215 storage/lmgr/predicate.c:4457 -#: storage/lmgr/predicate.c:4794 storage/lmgr/predicate.c:4806 -#: storage/lmgr/predicate.c:4849 storage/lmgr/predicate.c:4887 -#, c-format -msgid "could not serialize access due to read/write dependencies among transactions" -msgstr "konnte Zugriff nicht serialisieren wegen Lese-/Schreib-Abhängigkeiten zwischen Transaktionen" - #: storage/lmgr/predicate.c:4101 storage/lmgr/predicate.c:4137 #: storage/lmgr/predicate.c:4170 storage/lmgr/predicate.c:4178 #: storage/lmgr/predicate.c:4217 storage/lmgr/predicate.c:4459 #: storage/lmgr/predicate.c:4796 storage/lmgr/predicate.c:4808 #: storage/lmgr/predicate.c:4851 storage/lmgr/predicate.c:4889 #, c-format +msgid "could not serialize access due to read/write dependencies among transactions" +msgstr "konnte Zugriff nicht serialisieren wegen Lese-/Schreib-Abhängigkeiten zwischen Transaktionen" + +#: storage/lmgr/predicate.c:4103 storage/lmgr/predicate.c:4139 +#: storage/lmgr/predicate.c:4172 storage/lmgr/predicate.c:4180 +#: storage/lmgr/predicate.c:4219 storage/lmgr/predicate.c:4461 +#: storage/lmgr/predicate.c:4798 storage/lmgr/predicate.c:4810 +#: storage/lmgr/predicate.c:4853 storage/lmgr/predicate.c:4891 +#, c-format msgid "The transaction might succeed if retried." msgstr "Die Transaktion könnte erfolgreich sein, wenn sie erneut versucht würde." -#: storage/lmgr/proc.c:357 +#: storage/lmgr/proc.c:355 #, c-format msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" msgstr "Anzahl angeforderter Standby-Verbindungen überschreitet max_wal_senders (aktuell %d)" -#: storage/lmgr/proc.c:1551 +#: storage/lmgr/proc.c:1527 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "Prozess %d vermied Verklemmung wegen %s-Sperre auf %s durch Umordnen der Queue nach %ld,%03d ms" -#: storage/lmgr/proc.c:1566 +#: storage/lmgr/proc.c:1542 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "Prozess %d hat Verklemmung festgestellt beim Warten auf %s-Sperre auf %s nach %ld,%03d ms" -#: storage/lmgr/proc.c:1575 +#: storage/lmgr/proc.c:1551 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "Prozess %d wartet immer noch auf %s-Sperre auf %s nach %ld,%03d ms" -#: storage/lmgr/proc.c:1582 +#: storage/lmgr/proc.c:1558 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "Prozess %d erlangte %s-Sperre auf %s nach %ld,%03d ms" -#: storage/lmgr/proc.c:1599 +#: storage/lmgr/proc.c:1575 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "Prozess %d konnte %s-Sperre auf %s nach %ld,%03d ms nicht erlangen" @@ -21352,101 +22376,96 @@ msgstr "Prozess %d konnte %s-Sperre auf %s nach %ld,%03d ms nicht erlangen" msgid "page verification failed, calculated checksum %u but expected %u" msgstr "Seitenüberprüfung fehlgeschlagen, berechnete Prüfsumme %u, aber erwartet %u" -#: storage/page/bufpage.c:217 storage/page/bufpage.c:739 -#: storage/page/bufpage.c:1066 storage/page/bufpage.c:1201 -#: storage/page/bufpage.c:1307 storage/page/bufpage.c:1419 +#: storage/page/bufpage.c:217 storage/page/bufpage.c:730 +#: storage/page/bufpage.c:1073 storage/page/bufpage.c:1208 +#: storage/page/bufpage.c:1314 storage/page/bufpage.c:1426 #, c-format msgid "corrupted page pointers: lower = %u, upper = %u, special = %u" msgstr "verfälschte Seitenzeiger: lower = %u, upper = %u, special = %u" -#: storage/page/bufpage.c:768 +#: storage/page/bufpage.c:759 #, c-format msgid "corrupted line pointer: %u" msgstr "verfälschter Line-Pointer: %u" -#: storage/page/bufpage.c:795 storage/page/bufpage.c:1259 +#: storage/page/bufpage.c:789 storage/page/bufpage.c:1266 #, c-format msgid "corrupted item lengths: total %u, available space %u" msgstr "verfälschte Item-Längen: gesamt %u, verfügbarer Platz %u" -#: storage/page/bufpage.c:1085 storage/page/bufpage.c:1226 -#: storage/page/bufpage.c:1323 storage/page/bufpage.c:1435 +#: storage/page/bufpage.c:1092 storage/page/bufpage.c:1233 +#: storage/page/bufpage.c:1330 storage/page/bufpage.c:1442 #, c-format msgid "corrupted line pointer: offset = %u, size = %u" msgstr "verfälschter Line-Pointer: offset = %u, size = %u" -#: storage/smgr/md.c:434 +#: storage/smgr/md.c:439 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "kann Datei »%s« nicht auf über %u Blöcke erweitern" -#: storage/smgr/md.c:449 +#: storage/smgr/md.c:454 #, c-format msgid "could not extend file \"%s\": %m" msgstr "konnte Datei »%s« nicht erweitern: %m" -#: storage/smgr/md.c:451 storage/smgr/md.c:458 storage/smgr/md.c:746 -#, c-format -msgid "Check free disk space." -msgstr "Prüfen Sie den freien Festplattenplatz." - -#: storage/smgr/md.c:455 +#: storage/smgr/md.c:460 #, c-format msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgstr "konnte Datei »%s« nicht erweitern: es wurden nur %d von %d Bytes bei Block %u geschrieben" -#: storage/smgr/md.c:667 +#: storage/smgr/md.c:675 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "konnte Block %u in Datei »%s« nicht lesen: %m" -#: storage/smgr/md.c:683 +#: storage/smgr/md.c:691 #, c-format msgid "could not read block %u in file \"%s\": read only %d of %d bytes" msgstr "konnte Block %u in Datei »%s« nicht lesen: es wurden nur %d von %d Bytes gelesen" -#: storage/smgr/md.c:737 +#: storage/smgr/md.c:745 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "konnte Block %u in Datei »%s« nicht schreiben: %m" -#: storage/smgr/md.c:742 +#: storage/smgr/md.c:750 #, c-format msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" msgstr "konnte Block %u in Datei »%s« nicht schreiben: es wurden nur %d von %d Bytes geschrieben" -#: storage/smgr/md.c:836 +#: storage/smgr/md.c:844 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "konnte Datei »%s« nicht auf %u Blöcke kürzen: es sind jetzt nur %u Blöcke" -#: storage/smgr/md.c:891 +#: storage/smgr/md.c:899 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "konnte Datei »%s« nicht auf %u Blöcke kürzen: %m" -#: storage/smgr/md.c:1285 +#: storage/smgr/md.c:1298 #, c-format msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" msgstr "konnte Datei »%s« nicht öffnen (Zielblock %u): vorhergehendes Segment hat nur %u Blöcke" -#: storage/smgr/md.c:1299 +#: storage/smgr/md.c:1312 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "konnte Datei »%s« nicht öffnen (Zielblock %u): %m" #: tcop/fastpath.c:148 #, c-format -msgid "cannot call function %s via fastpath interface" -msgstr "Funktion %s kann nicht via Fastpath-Interface aufgerufen werden" +msgid "cannot call function \"%s\" via fastpath interface" +msgstr "Funktion »%s« kann nicht via Fastpath-Interface aufgerufen werden" #: tcop/fastpath.c:233 #, c-format msgid "fastpath function call: \"%s\" (OID %u)" msgstr "Fastpath-Funktionsaufruf: »%s« (OID %u)" -#: tcop/fastpath.c:312 tcop/postgres.c:1298 tcop/postgres.c:1556 -#: tcop/postgres.c:2015 tcop/postgres.c:2252 +#: tcop/fastpath.c:312 tcop/postgres.c:1334 tcop/postgres.c:1570 +#: tcop/postgres.c:2029 tcop/postgres.c:2266 #, c-format msgid "duration: %s ms" msgstr "Dauer: %s ms" @@ -21476,342 +22495,348 @@ msgstr "ungültige Argumentgröße %d in Funktionsaufruf-Message" msgid "incorrect binary data format in function argument %d" msgstr "falsches Binärdatenformat in Funktionsargument %d" -#: tcop/postgres.c:446 tcop/postgres.c:4716 +#: tcop/postgres.c:444 tcop/postgres.c:4774 #, c-format msgid "invalid frontend message type %d" msgstr "ungültiger Frontend-Message-Typ %d" -#: tcop/postgres.c:1015 +#: tcop/postgres.c:1051 #, c-format msgid "statement: %s" msgstr "Anweisung: %s" -#: tcop/postgres.c:1303 +#: tcop/postgres.c:1339 #, c-format msgid "duration: %s ms statement: %s" msgstr "Dauer: %s ms Anweisung: %s" -#: tcop/postgres.c:1409 +#: tcop/postgres.c:1445 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "kann nicht mehrere Befehle in vorbereitete Anweisung einfügen" -#: tcop/postgres.c:1561 +#: tcop/postgres.c:1575 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "Dauer: %s ms Parsen %s: %s" -#: tcop/postgres.c:1627 tcop/postgres.c:2567 +#: tcop/postgres.c:1641 tcop/postgres.c:2581 #, c-format msgid "unnamed prepared statement does not exist" msgstr "unbenannte vorbereitete Anweisung existiert nicht" -#: tcop/postgres.c:1668 +#: tcop/postgres.c:1682 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "Binden-Nachricht hat %d Parameterformate aber %d Parameter" -#: tcop/postgres.c:1674 +#: tcop/postgres.c:1688 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "Binden-Nachricht enthält %d Parameter, aber vorbereitete Anweisung »%s« erfordert %d" -#: tcop/postgres.c:1893 +#: tcop/postgres.c:1907 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "falsches Binärdatenformat in Binden-Parameter %d" -#: tcop/postgres.c:2020 +#: tcop/postgres.c:2034 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "Dauer: %s ms Binden %s%s%s: %s" -#: tcop/postgres.c:2070 tcop/postgres.c:2651 +#: tcop/postgres.c:2084 tcop/postgres.c:2664 #, c-format msgid "portal \"%s\" does not exist" msgstr "Portal »%s« existiert nicht" -#: tcop/postgres.c:2155 +#: tcop/postgres.c:2169 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2157 tcop/postgres.c:2260 +#: tcop/postgres.c:2171 tcop/postgres.c:2274 msgid "execute fetch from" msgstr "Ausführen Fetch von" -#: tcop/postgres.c:2158 tcop/postgres.c:2261 +#: tcop/postgres.c:2172 tcop/postgres.c:2275 msgid "execute" msgstr "Ausführen" -#: tcop/postgres.c:2257 +#: tcop/postgres.c:2271 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "Dauer: %s ms %s %s%s%s: %s" -#: tcop/postgres.c:2403 +#: tcop/postgres.c:2417 #, c-format msgid "prepare: %s" msgstr "Vorbereiten: %s" -#: tcop/postgres.c:2428 +#: tcop/postgres.c:2442 #, c-format msgid "parameters: %s" msgstr "Parameter: %s" -#: tcop/postgres.c:2443 +#: tcop/postgres.c:2457 #, c-format msgid "abort reason: recovery conflict" msgstr "Abbruchgrund: Konflikt bei Wiederherstellung" -#: tcop/postgres.c:2459 +#: tcop/postgres.c:2473 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "Benutzer hat Shared-Buffer-Pin zu lange gehalten." -#: tcop/postgres.c:2462 +#: tcop/postgres.c:2476 #, c-format msgid "User was holding a relation lock for too long." msgstr "Benutzer hat Relationssperre zu lange gehalten." -#: tcop/postgres.c:2465 +#: tcop/postgres.c:2479 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "Benutzer hat (möglicherweise) einen Tablespace verwendet, der gelöscht werden muss." -#: tcop/postgres.c:2468 +#: tcop/postgres.c:2482 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "Benutzeranfrage hat möglicherweise Zeilenversionen sehen müssen, die entfernt werden müssen." -#: tcop/postgres.c:2474 +#: tcop/postgres.c:2488 #, c-format msgid "User was connected to a database that must be dropped." msgstr "Benutzer war mit einer Datenbank verbunden, die gelöscht werden muss." -#: tcop/postgres.c:2513 +#: tcop/postgres.c:2527 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "Portal »%s« Parameter $%d = %s" -#: tcop/postgres.c:2516 +#: tcop/postgres.c:2530 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "Portal »%s« Parameter $%d" -#: tcop/postgres.c:2522 +#: tcop/postgres.c:2536 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "unbenanntes Portal Parameter $%d = %s" -#: tcop/postgres.c:2525 +#: tcop/postgres.c:2539 #, c-format msgid "unnamed portal parameter $%d" msgstr "unbenanntes Portal Parameter $%d" -#: tcop/postgres.c:2871 +#: tcop/postgres.c:2884 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "Verbindung wird abgebrochen wegen unerwartetem SIGQUIT-Signal" -#: tcop/postgres.c:2877 +#: tcop/postgres.c:2890 #, c-format msgid "terminating connection because of crash of another server process" msgstr "Verbindung wird abgebrochen wegen Absturz eines anderen Serverprozesses" -#: tcop/postgres.c:2878 +#: tcop/postgres.c:2891 #, c-format msgid "The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory." msgstr "Der Postmaster hat diesen Serverprozess angewiesen, die aktuelle Transaktion zurückzurollen und die Sitzung zu beenden, weil ein anderer Serverprozess abnormal beendet wurde und möglicherweise das Shared Memory verfälscht hat." -#: tcop/postgres.c:2882 tcop/postgres.c:3243 +#: tcop/postgres.c:2895 tcop/postgres.c:3256 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "In einem Moment sollten Sie wieder mit der Datenbank verbinden und Ihren Befehl wiederholen können." -#: tcop/postgres.c:2889 -#, fuzzy, c-format -#| msgid "terminating connection due to administrator command" +#: tcop/postgres.c:2902 +#, c-format msgid "terminating connection due to immediate shutdown command" -msgstr "Verbindung wird abgebrochen aufgrund von Anweisung des Administrators" +msgstr "Verbindung wird abgebrochen aufgrund von Befehl für sofortiges Herunterfahren" -#: tcop/postgres.c:2975 +#: tcop/postgres.c:2988 #, c-format msgid "floating-point exception" msgstr "Fließkommafehler" -#: tcop/postgres.c:2976 +#: tcop/postgres.c:2989 #, c-format msgid "An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, such as division by zero." msgstr "Eine ungültige Fließkommaoperation wurde signalisiert. Das bedeutet wahrscheinlich ein Ergebnis außerhalb des gültigen Bereichs oder eine ungültige Operation, zum Beispiel Division durch null." -#: tcop/postgres.c:3147 +#: tcop/postgres.c:3160 #, c-format msgid "canceling authentication due to timeout" msgstr "storniere Authentifizierung wegen Zeitüberschreitung" -#: tcop/postgres.c:3151 +#: tcop/postgres.c:3164 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "Autovacuum-Prozess wird abgebrochen aufgrund von Anweisung des Administrators" -#: tcop/postgres.c:3155 +#: tcop/postgres.c:3168 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "Arbeitsprozess für logische Replikation wird abgebrochen aufgrund von Anweisung des Administrators" -#: tcop/postgres.c:3172 tcop/postgres.c:3182 tcop/postgres.c:3241 +#: tcop/postgres.c:3185 tcop/postgres.c:3195 tcop/postgres.c:3254 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "Verbindung wird abgebrochen wegen Konflikt mit der Wiederherstellung" -#: tcop/postgres.c:3193 +#: tcop/postgres.c:3206 #, c-format msgid "terminating connection due to administrator command" msgstr "Verbindung wird abgebrochen aufgrund von Anweisung des Administrators" -#: tcop/postgres.c:3224 +#: tcop/postgres.c:3237 #, c-format msgid "connection to client lost" msgstr "Verbindung zum Client wurde verloren" -#: tcop/postgres.c:3294 +#: tcop/postgres.c:3307 #, c-format msgid "canceling statement due to lock timeout" msgstr "storniere Anfrage wegen Zeitüberschreitung einer Sperre" -#: tcop/postgres.c:3301 +#: tcop/postgres.c:3314 #, c-format msgid "canceling statement due to statement timeout" msgstr "storniere Anfrage wegen Zeitüberschreitung der Anfrage" -#: tcop/postgres.c:3308 +#: tcop/postgres.c:3321 #, c-format msgid "canceling autovacuum task" msgstr "storniere Autovacuum-Aufgabe" -#: tcop/postgres.c:3331 +#: tcop/postgres.c:3344 #, c-format msgid "canceling statement due to user request" msgstr "storniere Anfrage wegen Benutzeraufforderung" -#: tcop/postgres.c:3345 +#: tcop/postgres.c:3358 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "Verbindung wird abgebrochen wegen Zeitüberschreitung in inaktiver Transaktion" -#: tcop/postgres.c:3356 +#: tcop/postgres.c:3369 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "Verbindung wird abgebrochen wegen Zeitüberschreitung in inaktiver Sitzung" -#: tcop/postgres.c:3475 +#: tcop/postgres.c:3506 #, c-format msgid "stack depth limit exceeded" msgstr "Grenze für Stacktiefe überschritten" -#: tcop/postgres.c:3476 +#: tcop/postgres.c:3507 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "Erhöhen Sie den Konfigurationsparameter »max_stack_depth« (aktuell %dkB), nachdem Sie sichergestellt haben, dass die Stacktiefenbegrenzung Ihrer Plattform ausreichend ist." -#: tcop/postgres.c:3539 +#: tcop/postgres.c:3570 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "»max_stack_depth« darf %ldkB nicht überschreiten." -#: tcop/postgres.c:3541 +#: tcop/postgres.c:3572 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "Erhöhen Sie die Stacktiefenbegrenzung Ihrer Plattform mit »ulimit -s« oder der lokalen Entsprechung." -#: tcop/postgres.c:3897 +#: tcop/postgres.c:3928 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "ungültiges Kommandozeilenargument für Serverprozess: %s" -#: tcop/postgres.c:3898 tcop/postgres.c:3904 +#: tcop/postgres.c:3929 tcop/postgres.c:3935 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: tcop/postgres.c:3902 +#: tcop/postgres.c:3933 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: ungültiges Kommandozeilenargument: %s" -#: tcop/postgres.c:3965 +#: tcop/postgres.c:3986 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: weder Datenbankname noch Benutzername angegeben" -#: tcop/postgres.c:4618 +#: tcop/postgres.c:4676 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "ungültiger Subtyp %d von CLOSE-Message" -#: tcop/postgres.c:4653 +#: tcop/postgres.c:4711 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "ungültiger Subtyp %d von DESCRIBE-Message" -#: tcop/postgres.c:4737 +#: tcop/postgres.c:4795 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "Fastpath-Funktionsaufrufe werden auf einer Replikationsverbindung nicht unterstützt" -#: tcop/postgres.c:4741 +#: tcop/postgres.c:4799 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "erweitertes Anfrageprotokoll wird nicht auf einer Replikationsverbindung unterstützt" -#: tcop/postgres.c:4918 +#: tcop/postgres.c:4976 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" msgstr "Verbindungsende: Sitzungszeit: %d:%02d:%02d.%03d Benutzer=%s Datenbank=%s Host=%s%s%s" -#: tcop/pquery.c:636 +#: tcop/pquery.c:641 #, c-format msgid "bind message has %d result formats but query has %d columns" msgstr "Bind-Message hat %d Ergebnisspalten, aber Anfrage hat %d Spalten" -#: tcop/pquery.c:939 +#: tcop/pquery.c:944 tcop/pquery.c:1701 #, c-format msgid "cursor can only scan forward" msgstr "Cursor kann nur vorwärts scannen" -#: tcop/pquery.c:940 +#: tcop/pquery.c:945 tcop/pquery.c:1702 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Deklarieren Sie ihn mit der Option SCROLL, um rückwarts scannen zu können." #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:414 +#: tcop/utility.c:417 #, c-format msgid "cannot execute %s in a read-only transaction" msgstr "%s kann nicht in einer Read-Only-Transaktion ausgeführt werden" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:432 +#: tcop/utility.c:435 #, c-format msgid "cannot execute %s during a parallel operation" msgstr "%s kann nicht während einer parallelen Operation ausgeführt werden" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:451 +#: tcop/utility.c:454 #, c-format msgid "cannot execute %s during recovery" msgstr "%s kann nicht während der Wiederherstellung ausgeführt werden" #. translator: %s is name of a SQL command, eg PREPARE -#: tcop/utility.c:469 +#: tcop/utility.c:472 #, c-format msgid "cannot execute %s within security-restricted operation" msgstr "kann %s nicht in einer sicherheitsbeschränkten Operation ausführen" -#: tcop/utility.c:913 +#. translator: %s is name of a SQL command, eg LISTEN +#: tcop/utility.c:828 #, c-format -msgid "must be superuser to do CHECKPOINT" +msgid "cannot execute %s within a background process" +msgstr "%s kann nicht in einem Hintergrundprozess ausgeführt werden" + +#: tcop/utility.c:953 +#, fuzzy, c-format +#| msgid "must be superuser to do CHECKPOINT" +msgid "must be superuser or have privileges of pg_checkpointer to do CHECKPOINT" msgstr "nur Superuser können CHECKPOINT ausführen" #: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 @@ -21960,13 +22985,13 @@ msgstr "ungültiges Affix-Flag »%s« mit Flag-Wert »long«" msgid "could not open dictionary file \"%s\": %m" msgstr "konnte Wörterbuchdatei »%s« nicht öffnen: %m" -#: tsearch/spell.c:763 utils/adt/regexp.c:208 +#: tsearch/spell.c:763 utils/adt/regexp.c:209 #, c-format msgid "invalid regular expression: %s" msgstr "ungültiger regulärer Ausdruck: %s" -#: tsearch/spell.c:1189 tsearch/spell.c:1201 tsearch/spell.c:1760 -#: tsearch/spell.c:1765 tsearch/spell.c:1770 +#: tsearch/spell.c:1189 tsearch/spell.c:1201 tsearch/spell.c:1761 +#: tsearch/spell.c:1766 tsearch/spell.c:1771 #, c-format msgid "invalid affix alias \"%s\"" msgstr "ungültiges Affixalias »%s«" @@ -21996,7 +23021,7 @@ msgstr "Anzahl der Aliasse überschreitet angegebene Zahl %d" msgid "affix file contains both old-style and new-style commands" msgstr "Affixdatei enthält Befehle im alten und im neuen Stil" -#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1121 +#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1127 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "Zeichenkette ist zu lang für tsvector (%d Bytes, maximal %d Bytes)" @@ -22030,162 +23055,221 @@ msgstr "ungültiger Textsuchekonfigurationsdateiname »%s«" #: tsearch/ts_utils.c:83 #, c-format -msgid "could not open stop-word file \"%s\": %m" -msgstr "konnte Stoppwortdatei »%s« nicht öffnen: %m" +msgid "could not open stop-word file \"%s\": %m" +msgstr "konnte Stoppwortdatei »%s« nicht öffnen: %m" + +#: tsearch/wparser.c:313 tsearch/wparser.c:401 tsearch/wparser.c:478 +#, c-format +msgid "text search parser does not support headline creation" +msgstr "Textsucheparser unterstützt das Erzeugen von Headlines nicht" + +#: tsearch/wparser_def.c:2578 +#, c-format +msgid "unrecognized headline parameter: \"%s\"" +msgstr "unbekannter Headline-Parameter: »%s«" + +#: tsearch/wparser_def.c:2597 +#, c-format +msgid "MinWords should be less than MaxWords" +msgstr "»MinWords« sollte kleiner als »MaxWords« sein" + +#: tsearch/wparser_def.c:2601 +#, c-format +msgid "MinWords should be positive" +msgstr "»MinWords« sollte positiv sein" + +#: tsearch/wparser_def.c:2605 +#, c-format +msgid "ShortWord should be >= 0" +msgstr "»ShortWord« sollte >= 0 sein" + +#: tsearch/wparser_def.c:2609 +#, c-format +msgid "MaxFragments should be >= 0" +msgstr "»MaxFragments« sollte >= 0 sein" + +#: utils/activity/pgstat.c:420 +#, fuzzy, c-format +#| msgid "could not open statistics file \"%s\": %m" +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "konnte Statistikdatei »%s« nicht öffnen: %m" + +#: utils/activity/pgstat.c:427 +#, fuzzy, c-format +#| msgid "could not open statistics file \"%s\": %m" +msgid "unlinked permanent statistics file \"%s\"" +msgstr "konnte Statistikdatei »%s« nicht öffnen: %m" + +#: utils/activity/pgstat.c:1199 +#, fuzzy, c-format +#| msgid "unrecognized statistics kind \"%s\"" +msgid "invalid statistics kind: \"%s\"" +msgstr "unbekannte Statistikart »%s«" + +#: utils/activity/pgstat.c:1279 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "konnte temporäre Statistikdatei »%s« nicht öffnen: %m" -#: tsearch/wparser.c:313 tsearch/wparser.c:401 tsearch/wparser.c:478 +#: utils/activity/pgstat.c:1385 #, c-format -msgid "text search parser does not support headline creation" -msgstr "Textsucheparser unterstützt das Erzeugen von Headlines nicht" +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "konnte temporäre Statistikdatei »%s« nicht schreiben: %m" -#: tsearch/wparser_def.c:2578 +#: utils/activity/pgstat.c:1394 #, c-format -msgid "unrecognized headline parameter: \"%s\"" -msgstr "unbekannter Headline-Parameter: »%s«" +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "konnte temporäre Statistikdatei »%s« nicht schließen: %m" -#: tsearch/wparser_def.c:2597 +#: utils/activity/pgstat.c:1402 #, c-format -msgid "MinWords should be less than MaxWords" -msgstr "»MinWords« sollte kleiner als »MaxWords« sein" +msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" +msgstr "konnte temporäre Statistikdatei »%s« nicht in »%s« umbenennen: %m" -#: tsearch/wparser_def.c:2601 +#: utils/activity/pgstat.c:1451 #, c-format -msgid "MinWords should be positive" -msgstr "»MinWords« sollte positiv sein" +msgid "could not open statistics file \"%s\": %m" +msgstr "konnte Statistikdatei »%s« nicht öffnen: %m" -#: tsearch/wparser_def.c:2605 +#: utils/activity/pgstat.c:1607 #, c-format -msgid "ShortWord should be >= 0" -msgstr "»ShortWord« sollte >= 0 sein" +msgid "corrupted statistics file \"%s\"" +msgstr "verfälschte Statistikdatei »%s«" -#: tsearch/wparser_def.c:2609 +#: utils/activity/pgstat_function.c:118 +#, fuzzy, c-format +#| msgid "cast function must be a normal function" +msgid "function call to dropped function" +msgstr "Typumwandlungsfunktion muss eine normale Funktion sein" + +#: utils/activity/pgstat_xact.c:371 #, c-format -msgid "MaxFragments should be >= 0" -msgstr "»MaxFragments« sollte >= 0 sein" +msgid "resetting existing stats for type %s, db=%u, oid=%u" +msgstr "" -#: utils/adt/acl.c:165 utils/adt/name.c:93 +#: utils/adt/acl.c:168 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "Bezeichner zu lang" -#: utils/adt/acl.c:166 utils/adt/name.c:94 +#: utils/adt/acl.c:169 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "Bezeichner muss weniger als %d Zeichen haben." -#: utils/adt/acl.c:249 +#: utils/adt/acl.c:252 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "unbekanntes Schlüsselwort: »%s«" -#: utils/adt/acl.c:250 +#: utils/adt/acl.c:253 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "ACL-Schlüsselwort muss »group« oder »user« sein." -#: utils/adt/acl.c:255 +#: utils/adt/acl.c:258 #, c-format msgid "missing name" msgstr "Name fehlt" -#: utils/adt/acl.c:256 +#: utils/adt/acl.c:259 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "Auf das Schlüsselwort »group« oder »user« muss ein Name folgen." -#: utils/adt/acl.c:262 +#: utils/adt/acl.c:265 #, c-format msgid "missing \"=\" sign" msgstr "»=«-Zeichen fehlt" -#: utils/adt/acl.c:315 +#: utils/adt/acl.c:324 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "ungültiges Moduszeichen: muss eines aus »%s« sein" -#: utils/adt/acl.c:337 +#: utils/adt/acl.c:346 #, c-format msgid "a name must follow the \"/\" sign" msgstr "auf das »/«-Zeichen muss ein Name folgen" -#: utils/adt/acl.c:345 +#: utils/adt/acl.c:354 #, c-format msgid "defaulting grantor to user ID %u" msgstr "nicht angegebener Grantor wird auf user ID %u gesetzt" -#: utils/adt/acl.c:531 +#: utils/adt/acl.c:540 #, c-format msgid "ACL array contains wrong data type" msgstr "ACL-Array enthält falschen Datentyp" -#: utils/adt/acl.c:535 +#: utils/adt/acl.c:544 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "ACL-Arrays müssen eindimensional sein" -#: utils/adt/acl.c:539 +#: utils/adt/acl.c:548 #, c-format msgid "ACL arrays must not contain null values" msgstr "ACL-Array darf keine NULL-Werte enthalten" -#: utils/adt/acl.c:563 +#: utils/adt/acl.c:572 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "überflüssiger Müll am Ende der ACL-Angabe" -#: utils/adt/acl.c:1198 +#: utils/adt/acl.c:1214 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "Grant-Optionen können nicht an den eigenen Grantor gegeben werden" -#: utils/adt/acl.c:1259 +#: utils/adt/acl.c:1275 #, c-format msgid "dependent privileges exist" msgstr "abhängige Privilegien existieren" -#: utils/adt/acl.c:1260 +#: utils/adt/acl.c:1276 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Verwenden Sie CASCADE, um diese auch zu entziehen." -#: utils/adt/acl.c:1514 +#: utils/adt/acl.c:1530 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert wird nicht mehr unterstützt" -#: utils/adt/acl.c:1524 +#: utils/adt/acl.c:1540 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove wird nicht mehr unterstützt" -#: utils/adt/acl.c:1610 utils/adt/acl.c:1664 +#: utils/adt/acl.c:1630 utils/adt/acl.c:1684 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "unbekannter Privilegtyp: »%s«" -#: utils/adt/acl.c:3446 utils/adt/regproc.c:101 utils/adt/regproc.c:276 +#: utils/adt/acl.c:3469 utils/adt/regproc.c:101 utils/adt/regproc.c:277 #, c-format msgid "function \"%s\" does not exist" msgstr "Funktion »%s« existiert nicht" -#: utils/adt/acl.c:4898 +#: utils/adt/acl.c:5008 #, c-format msgid "must be member of role \"%s\"" msgstr "Berechtigung nur für Mitglied von Rolle »%s«" -#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:935 -#: utils/adt/arrayfuncs.c:1543 utils/adt/arrayfuncs.c:3262 -#: utils/adt/arrayfuncs.c:3404 utils/adt/arrayfuncs.c:5945 -#: utils/adt/arrayfuncs.c:6286 utils/adt/arrayutils.c:94 +#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:936 +#: utils/adt/arrayfuncs.c:1544 utils/adt/arrayfuncs.c:3263 +#: utils/adt/arrayfuncs.c:3405 utils/adt/arrayfuncs.c:5981 +#: utils/adt/arrayfuncs.c:6322 utils/adt/arrayutils.c:94 #: utils/adt/arrayutils.c:103 utils/adt/arrayutils.c:110 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "Arraygröße überschreitet erlaubtes Maximum (%d)" #: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:467 -#: utils/adt/array_userfuncs.c:547 utils/adt/json.c:645 utils/adt/json.c:740 -#: utils/adt/json.c:778 utils/adt/jsonb.c:1115 utils/adt/jsonb.c:1144 -#: utils/adt/jsonb.c:1538 utils/adt/jsonb.c:1702 utils/adt/jsonb.c:1712 +#: utils/adt/array_userfuncs.c:547 utils/adt/json.c:667 utils/adt/json.c:803 +#: utils/adt/json.c:837 utils/adt/jsonb.c:1104 utils/adt/jsonb.c:1177 +#: utils/adt/jsonb.c:1598 utils/adt/jsonb.c:1785 utils/adt/jsonb.c:1795 #, c-format msgid "could not determine input data type" msgstr "konnte Eingabedatentypen nicht bestimmen" @@ -22196,16 +23280,16 @@ msgid "input data type is not an array" msgstr "Eingabedatentyp ist kein Array" #: utils/adt/array_userfuncs.c:129 utils/adt/array_userfuncs.c:181 -#: utils/adt/float.c:1233 utils/adt/float.c:1307 utils/adt/float.c:4052 -#: utils/adt/float.c:4066 utils/adt/int.c:757 utils/adt/int.c:779 -#: utils/adt/int.c:793 utils/adt/int.c:807 utils/adt/int.c:838 -#: utils/adt/int.c:859 utils/adt/int.c:976 utils/adt/int.c:990 -#: utils/adt/int.c:1004 utils/adt/int.c:1037 utils/adt/int.c:1051 -#: utils/adt/int.c:1065 utils/adt/int.c:1096 utils/adt/int.c:1178 -#: utils/adt/int.c:1242 utils/adt/int.c:1310 utils/adt/int.c:1316 -#: utils/adt/int8.c:1299 utils/adt/numeric.c:1776 utils/adt/numeric.c:4207 -#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1121 -#: utils/adt/varlena.c:3433 +#: utils/adt/float.c:1234 utils/adt/float.c:1308 utils/adt/float.c:4046 +#: utils/adt/float.c:4060 utils/adt/int.c:781 utils/adt/int.c:803 +#: utils/adt/int.c:817 utils/adt/int.c:831 utils/adt/int.c:862 +#: utils/adt/int.c:883 utils/adt/int.c:1000 utils/adt/int.c:1014 +#: utils/adt/int.c:1028 utils/adt/int.c:1061 utils/adt/int.c:1075 +#: utils/adt/int.c:1089 utils/adt/int.c:1120 utils/adt/int.c:1202 +#: utils/adt/int.c:1266 utils/adt/int.c:1334 utils/adt/int.c:1340 +#: utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4265 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 +#: utils/adt/varlena.c:3395 #, c-format msgid "integer out of range" msgstr "integer ist außerhalb des gültigen Bereichs" @@ -22252,255 +23336,254 @@ msgstr "Suche nach Elementen in mehrdimensionalen Arrays wird nicht unterstützt msgid "initial position must not be null" msgstr "Startposition darf nicht NULL sein" -#: utils/adt/arrayfuncs.c:270 utils/adt/arrayfuncs.c:284 -#: utils/adt/arrayfuncs.c:295 utils/adt/arrayfuncs.c:317 -#: utils/adt/arrayfuncs.c:332 utils/adt/arrayfuncs.c:346 -#: utils/adt/arrayfuncs.c:352 utils/adt/arrayfuncs.c:359 -#: utils/adt/arrayfuncs.c:492 utils/adt/arrayfuncs.c:508 -#: utils/adt/arrayfuncs.c:519 utils/adt/arrayfuncs.c:534 -#: utils/adt/arrayfuncs.c:555 utils/adt/arrayfuncs.c:585 -#: utils/adt/arrayfuncs.c:592 utils/adt/arrayfuncs.c:600 -#: utils/adt/arrayfuncs.c:634 utils/adt/arrayfuncs.c:657 -#: utils/adt/arrayfuncs.c:677 utils/adt/arrayfuncs.c:789 -#: utils/adt/arrayfuncs.c:798 utils/adt/arrayfuncs.c:828 -#: utils/adt/arrayfuncs.c:843 utils/adt/arrayfuncs.c:896 +#: utils/adt/arrayfuncs.c:271 utils/adt/arrayfuncs.c:285 +#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:318 +#: utils/adt/arrayfuncs.c:333 utils/adt/arrayfuncs.c:347 +#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 +#: utils/adt/arrayfuncs.c:493 utils/adt/arrayfuncs.c:509 +#: utils/adt/arrayfuncs.c:520 utils/adt/arrayfuncs.c:535 +#: utils/adt/arrayfuncs.c:556 utils/adt/arrayfuncs.c:586 +#: utils/adt/arrayfuncs.c:593 utils/adt/arrayfuncs.c:601 +#: utils/adt/arrayfuncs.c:635 utils/adt/arrayfuncs.c:658 +#: utils/adt/arrayfuncs.c:678 utils/adt/arrayfuncs.c:790 +#: utils/adt/arrayfuncs.c:799 utils/adt/arrayfuncs.c:829 +#: utils/adt/arrayfuncs.c:844 utils/adt/arrayfuncs.c:897 #, c-format msgid "malformed array literal: \"%s\"" msgstr "fehlerhafte Arraykonstante: »%s«" -#: utils/adt/arrayfuncs.c:271 +#: utils/adt/arrayfuncs.c:272 #, c-format msgid "\"[\" must introduce explicitly-specified array dimensions." msgstr "Auf »[« müssen explizit angegebene Array-Dimensionen folgen." -#: utils/adt/arrayfuncs.c:285 +#: utils/adt/arrayfuncs.c:286 #, c-format msgid "Missing array dimension value." msgstr "Dimensionswert fehlt." -#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:333 +#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "»%s« fehlt nach Arraydimensionen." -#: utils/adt/arrayfuncs.c:305 utils/adt/arrayfuncs.c:2909 -#: utils/adt/arrayfuncs.c:2941 utils/adt/arrayfuncs.c:2956 +#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2910 +#: utils/adt/arrayfuncs.c:2942 utils/adt/arrayfuncs.c:2957 #, c-format msgid "upper bound cannot be less than lower bound" msgstr "Obergrenze kann nicht kleiner als Untergrenze sein" -#: utils/adt/arrayfuncs.c:318 +#: utils/adt/arrayfuncs.c:319 #, c-format msgid "Array value must start with \"{\" or dimension information." msgstr "Arraywert muss mit »{« oder Dimensionsinformationen anfangen." -#: utils/adt/arrayfuncs.c:347 +#: utils/adt/arrayfuncs.c:348 #, c-format msgid "Array contents must start with \"{\"." msgstr "Array-Inhalt muss mit {« anfangen." -#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 +#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 #, c-format msgid "Specified array dimensions do not match array contents." msgstr "Angegebene Array-Dimensionen stimmen nicht mit dem Array-Inhalt überein." -#: utils/adt/arrayfuncs.c:493 utils/adt/arrayfuncs.c:520 -#: utils/adt/multirangetypes.c:162 utils/adt/rangetypes.c:2310 +#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:521 +#: utils/adt/multirangetypes.c:164 utils/adt/rangetypes.c:2310 #: utils/adt/rangetypes.c:2318 utils/adt/rowtypes.c:211 #: utils/adt/rowtypes.c:219 #, c-format msgid "Unexpected end of input." msgstr "Unerwartetes Ende der Eingabe." -#: utils/adt/arrayfuncs.c:509 utils/adt/arrayfuncs.c:556 -#: utils/adt/arrayfuncs.c:586 utils/adt/arrayfuncs.c:635 +#: utils/adt/arrayfuncs.c:510 utils/adt/arrayfuncs.c:557 +#: utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 #, c-format msgid "Unexpected \"%c\" character." msgstr "Unerwartetes Zeichen »%c«." -#: utils/adt/arrayfuncs.c:535 utils/adt/arrayfuncs.c:658 +#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 #, c-format msgid "Unexpected array element." msgstr "Unerwartetes Arrayelement." -#: utils/adt/arrayfuncs.c:593 +#: utils/adt/arrayfuncs.c:594 #, c-format msgid "Unmatched \"%c\" character." msgstr "Zeichen »%c« ohne Gegenstück." -#: utils/adt/arrayfuncs.c:601 utils/adt/jsonfuncs.c:2593 +#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2482 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "Mehrdimensionale Arrays müssen Arraysausdrücke mit gleicher Anzahl Dimensionen haben." -#: utils/adt/arrayfuncs.c:678 +#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:287 #, c-format msgid "Junk after closing right brace." msgstr "Müll nach schließender rechter geschweifter Klammer." -#: utils/adt/arrayfuncs.c:1300 utils/adt/arrayfuncs.c:3370 -#: utils/adt/arrayfuncs.c:5849 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3371 +#: utils/adt/arrayfuncs.c:5885 #, c-format msgid "invalid number of dimensions: %d" msgstr "ungültige Anzahl Dimensionen: %d" -#: utils/adt/arrayfuncs.c:1311 +#: utils/adt/arrayfuncs.c:1312 #, c-format msgid "invalid array flags" msgstr "ungültige Array-Flags" -#: utils/adt/arrayfuncs.c:1333 +#: utils/adt/arrayfuncs.c:1334 #, c-format msgid "binary data has array element type %u (%s) instead of expected %u (%s)" msgstr "binäre Daten haben Array-Elementtyp %u (%s) statt erwartet %u (%s)" -#: utils/adt/arrayfuncs.c:1377 utils/adt/multirangetypes.c:443 -#: utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2905 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:445 +#: utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2915 #, c-format msgid "no binary input function available for type %s" msgstr "keine binäre Eingabefunktion verfügbar für Typ %s" -#: utils/adt/arrayfuncs.c:1517 +#: utils/adt/arrayfuncs.c:1518 #, c-format msgid "improper binary format in array element %d" msgstr "falsches Binärformat in Arrayelement %d" -#: utils/adt/arrayfuncs.c:1598 utils/adt/multirangetypes.c:448 -#: utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2938 +#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:450 +#: utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2948 #, c-format msgid "no binary output function available for type %s" msgstr "keine binäre Ausgabefunktion verfügbar für Typ %s" -#: utils/adt/arrayfuncs.c:2077 +#: utils/adt/arrayfuncs.c:2078 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "Auswählen von Stücken aus Arrays mit fester Länge ist nicht implementiert" -#: utils/adt/arrayfuncs.c:2255 utils/adt/arrayfuncs.c:2277 -#: utils/adt/arrayfuncs.c:2326 utils/adt/arrayfuncs.c:2565 -#: utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5835 -#: utils/adt/arrayfuncs.c:5861 utils/adt/arrayfuncs.c:5872 -#: utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 -#: utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4427 utils/adt/jsonfuncs.c:4580 -#: utils/adt/jsonfuncs.c:4692 utils/adt/jsonfuncs.c:4741 +#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 +#: utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2566 +#: utils/adt/arrayfuncs.c:2888 utils/adt/arrayfuncs.c:5871 +#: utils/adt/arrayfuncs.c:5897 utils/adt/arrayfuncs.c:5908 +#: utils/adt/json.c:1450 utils/adt/json.c:1524 utils/adt/jsonb.c:1378 +#: utils/adt/jsonb.c:1464 utils/adt/jsonfuncs.c:4363 utils/adt/jsonfuncs.c:4516 +#: utils/adt/jsonfuncs.c:4628 utils/adt/jsonfuncs.c:4677 #, c-format msgid "wrong number of array subscripts" msgstr "falsche Anzahl Arrayindizes" -#: utils/adt/arrayfuncs.c:2260 utils/adt/arrayfuncs.c:2368 -#: utils/adt/arrayfuncs.c:2632 utils/adt/arrayfuncs.c:2946 +#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 +#: utils/adt/arrayfuncs.c:2633 utils/adt/arrayfuncs.c:2947 #, c-format msgid "array subscript out of range" msgstr "Arrayindex außerhalb des gültigen Bereichs" -#: utils/adt/arrayfuncs.c:2265 +#: utils/adt/arrayfuncs.c:2266 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "Array mit fester Länge kann keinen NULL-Wert enthalten" -#: utils/adt/arrayfuncs.c:2834 +#: utils/adt/arrayfuncs.c:2835 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "Aktualisieren von Stücken aus Arrays mit fester Länge ist nicht implementiert" -#: utils/adt/arrayfuncs.c:2865 +#: utils/adt/arrayfuncs.c:2866 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "Array-Slice-Index muss beide Begrenzungen angeben" -#: utils/adt/arrayfuncs.c:2866 +#: utils/adt/arrayfuncs.c:2867 #, c-format msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." msgstr "Wenn ein Slice eines leeren Array-Wertes zugewiesen wird, dann müssen die Slice-Begrenzungen vollständig angegeben werden." -#: utils/adt/arrayfuncs.c:2877 utils/adt/arrayfuncs.c:2973 +#: utils/adt/arrayfuncs.c:2878 utils/adt/arrayfuncs.c:2974 #, c-format msgid "source array too small" msgstr "Quellarray ist zu klein" -#: utils/adt/arrayfuncs.c:3528 +#: utils/adt/arrayfuncs.c:3529 #, c-format msgid "null array element not allowed in this context" msgstr "NULL-Werte im Array sind in diesem Zusammenhang nicht erlaubt" -#: utils/adt/arrayfuncs.c:3630 utils/adt/arrayfuncs.c:3801 -#: utils/adt/arrayfuncs.c:4157 +#: utils/adt/arrayfuncs.c:3631 utils/adt/arrayfuncs.c:3802 +#: utils/adt/arrayfuncs.c:4193 #, c-format msgid "cannot compare arrays of different element types" msgstr "kann Arrays mit verschiedenen Elementtypen nicht vergleichen" -#: utils/adt/arrayfuncs.c:3979 utils/adt/multirangetypes.c:2670 -#: utils/adt/multirangetypes.c:2742 utils/adt/rangetypes.c:1343 +#: utils/adt/arrayfuncs.c:3980 utils/adt/multirangetypes.c:2799 +#: utils/adt/multirangetypes.c:2871 utils/adt/rangetypes.c:1343 #: utils/adt/rangetypes.c:1407 utils/adt/rowtypes.c:1858 #, c-format msgid "could not identify a hash function for type %s" msgstr "konnte keine Hash-Funktion für Typ %s ermitteln" -#: utils/adt/arrayfuncs.c:4072 utils/adt/rowtypes.c:1979 +#: utils/adt/arrayfuncs.c:4108 utils/adt/rowtypes.c:1979 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "konnte keine erweiterte Hash-Funktion für Typ %s ermitteln" -#: utils/adt/arrayfuncs.c:5249 +#: utils/adt/arrayfuncs.c:5285 #, c-format msgid "data type %s is not an array type" msgstr "Datentyp %s ist kein Array-Typ" -#: utils/adt/arrayfuncs.c:5304 +#: utils/adt/arrayfuncs.c:5340 #, c-format msgid "cannot accumulate null arrays" msgstr "Arrays, die NULL sind, können nicht akkumuliert werden" -#: utils/adt/arrayfuncs.c:5332 +#: utils/adt/arrayfuncs.c:5368 #, c-format msgid "cannot accumulate empty arrays" msgstr "leere Arrays können nicht akkumuliert werden" -#: utils/adt/arrayfuncs.c:5359 utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:5395 utils/adt/arrayfuncs.c:5401 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "Arrays unterschiedlicher Dimensionalität können nicht akkumuliert werden" -#: utils/adt/arrayfuncs.c:5733 utils/adt/arrayfuncs.c:5773 +#: utils/adt/arrayfuncs.c:5769 utils/adt/arrayfuncs.c:5809 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "Dimensions-Array oder Untergrenzen-Array darf nicht NULL sein" -#: utils/adt/arrayfuncs.c:5836 utils/adt/arrayfuncs.c:5862 +#: utils/adt/arrayfuncs.c:5872 utils/adt/arrayfuncs.c:5898 #, c-format msgid "Dimension array must be one dimensional." msgstr "Dimensions-Array muss eindimensional sein." -#: utils/adt/arrayfuncs.c:5841 utils/adt/arrayfuncs.c:5867 +#: utils/adt/arrayfuncs.c:5877 utils/adt/arrayfuncs.c:5903 #, c-format msgid "dimension values cannot be null" msgstr "Dimensionswerte dürfen nicht NULL sein" -#: utils/adt/arrayfuncs.c:5873 +#: utils/adt/arrayfuncs.c:5909 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Untergrenzen-Array hat andere Größe als Dimensions-Array." -#: utils/adt/arrayfuncs.c:6151 +#: utils/adt/arrayfuncs.c:6187 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "Entfernen von Elementen aus mehrdimensionalen Arrays wird nicht unterstützt" -#: utils/adt/arrayfuncs.c:6428 +#: utils/adt/arrayfuncs.c:6464 #, c-format msgid "thresholds must be one-dimensional array" msgstr "Parameter »thresholds« muss ein eindimensionales Array sein" -#: utils/adt/arrayfuncs.c:6433 +#: utils/adt/arrayfuncs.c:6469 #, c-format msgid "thresholds array must not contain NULLs" msgstr "»thresholds«-Array darf keine NULL-Werte enthalten" -#: utils/adt/arrayfuncs.c:6666 -#, fuzzy, c-format -#| msgid "number of parameters must be between 0 and 65535\n" +#: utils/adt/arrayfuncs.c:6702 +#, c-format msgid "number of elements to trim must be between 0 and %d" -msgstr "Anzahl der Parameter muss zwischen 0 und 65535 sein\n" +msgstr "Anzahl der zu entfernenden Elemente muss zwischen 0 und %d sein" #: utils/adt/arraysubs.c:93 utils/adt/arraysubs.c:130 #, c-format @@ -22538,46 +23621,46 @@ msgid "encoding conversion from %s to ASCII not supported" msgstr "Kodierungsumwandlung zwischen %s und ASCII wird nicht unterstützt" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:3802 -#: utils/adt/float.c:187 utils/adt/float.c:271 utils/adt/float.c:283 -#: utils/adt/float.c:400 utils/adt/float.c:485 utils/adt/float.c:501 +#: utils/adt/bool.c:153 utils/adt/cash.c:276 utils/adt/datetime.c:4058 +#: utils/adt/float.c:188 utils/adt/float.c:272 utils/adt/float.c:284 +#: utils/adt/float.c:401 utils/adt/float.c:486 utils/adt/float.c:502 #: utils/adt/geo_ops.c:220 utils/adt/geo_ops.c:230 utils/adt/geo_ops.c:242 #: utils/adt/geo_ops.c:274 utils/adt/geo_ops.c:316 utils/adt/geo_ops.c:326 #: utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1389 utils/adt/geo_ops.c:1424 -#: utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3488 utils/adt/geo_ops.c:4657 -#: utils/adt/geo_ops.c:4672 utils/adt/geo_ops.c:4679 utils/adt/int8.c:126 -#: utils/adt/jsonpath.c:182 utils/adt/mac.c:94 utils/adt/mac8.c:93 -#: utils/adt/mac8.c:166 utils/adt/mac8.c:184 utils/adt/mac8.c:202 -#: utils/adt/mac8.c:221 utils/adt/network.c:100 utils/adt/numeric.c:702 -#: utils/adt/numeric.c:721 utils/adt/numeric.c:6861 utils/adt/numeric.c:6885 -#: utils/adt/numeric.c:6909 utils/adt/numeric.c:7878 utils/adt/numutils.c:116 -#: utils/adt/numutils.c:126 utils/adt/numutils.c:170 utils/adt/numutils.c:246 -#: utils/adt/numutils.c:322 utils/adt/oid.c:44 utils/adt/oid.c:58 -#: utils/adt/oid.c:64 utils/adt/oid.c:86 utils/adt/pg_lsn.c:74 -#: utils/adt/tid.c:76 utils/adt/tid.c:84 utils/adt/tid.c:92 -#: utils/adt/timestamp.c:496 utils/adt/uuid.c:136 utils/adt/xid8funcs.c:346 +#: utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3392 utils/adt/geo_ops.c:4604 +#: utils/adt/geo_ops.c:4619 utils/adt/geo_ops.c:4626 utils/adt/int.c:165 +#: utils/adt/int.c:177 utils/adt/jsonpath.c:184 utils/adt/mac.c:93 +#: utils/adt/mac8.c:93 utils/adt/mac8.c:166 utils/adt/mac8.c:184 +#: utils/adt/mac8.c:202 utils/adt/mac8.c:221 utils/adt/network.c:99 +#: utils/adt/numeric.c:698 utils/adt/numeric.c:717 utils/adt/numeric.c:6854 +#: utils/adt/numeric.c:6878 utils/adt/numeric.c:6902 utils/adt/numeric.c:7904 +#: utils/adt/numutils.c:158 utils/adt/numutils.c:234 utils/adt/numutils.c:318 +#: utils/adt/oid.c:44 utils/adt/oid.c:58 utils/adt/oid.c:64 utils/adt/oid.c:86 +#: utils/adt/pg_lsn.c:74 utils/adt/tid.c:76 utils/adt/tid.c:84 +#: utils/adt/tid.c:98 utils/adt/tid.c:107 utils/adt/timestamp.c:497 +#: utils/adt/uuid.c:135 utils/adt/xid8funcs.c:345 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "ungültige Eingabesyntax für Typ %s: »%s«" -#: utils/adt/cash.c:215 utils/adt/cash.c:240 utils/adt/cash.c:250 -#: utils/adt/cash.c:290 utils/adt/int8.c:118 utils/adt/numutils.c:140 -#: utils/adt/numutils.c:147 utils/adt/numutils.c:240 utils/adt/numutils.c:316 -#: utils/adt/oid.c:70 utils/adt/oid.c:109 +#: utils/adt/cash.c:214 utils/adt/cash.c:239 utils/adt/cash.c:249 +#: utils/adt/cash.c:289 utils/adt/int.c:171 utils/adt/numutils.c:152 +#: utils/adt/numutils.c:228 utils/adt/numutils.c:312 utils/adt/oid.c:70 +#: utils/adt/oid.c:109 #, c-format msgid "value \"%s\" is out of range for type %s" msgstr "Wert »%s« ist außerhalb des gültigen Bereichs für Typ %s" -#: utils/adt/cash.c:652 utils/adt/cash.c:702 utils/adt/cash.c:753 -#: utils/adt/cash.c:802 utils/adt/cash.c:854 utils/adt/cash.c:904 -#: utils/adt/float.c:104 utils/adt/int.c:822 utils/adt/int.c:938 -#: utils/adt/int.c:1018 utils/adt/int.c:1080 utils/adt/int.c:1118 -#: utils/adt/int.c:1146 utils/adt/int8.c:600 utils/adt/int8.c:658 -#: utils/adt/int8.c:985 utils/adt/int8.c:1065 utils/adt/int8.c:1127 -#: utils/adt/int8.c:1207 utils/adt/numeric.c:3032 utils/adt/numeric.c:3055 -#: utils/adt/numeric.c:3140 utils/adt/numeric.c:3158 utils/adt/numeric.c:3254 -#: utils/adt/numeric.c:8427 utils/adt/numeric.c:8717 utils/adt/numeric.c:10299 -#: utils/adt/timestamp.c:3281 +#: utils/adt/cash.c:651 utils/adt/cash.c:701 utils/adt/cash.c:752 +#: utils/adt/cash.c:801 utils/adt/cash.c:853 utils/adt/cash.c:903 +#: utils/adt/float.c:105 utils/adt/int.c:846 utils/adt/int.c:962 +#: utils/adt/int.c:1042 utils/adt/int.c:1104 utils/adt/int.c:1142 +#: utils/adt/int.c:1170 utils/adt/int8.c:515 utils/adt/int8.c:573 +#: utils/adt/int8.c:943 utils/adt/int8.c:1023 utils/adt/int8.c:1085 +#: utils/adt/int8.c:1165 utils/adt/numeric.c:3093 utils/adt/numeric.c:3116 +#: utils/adt/numeric.c:3201 utils/adt/numeric.c:3219 utils/adt/numeric.c:3315 +#: utils/adt/numeric.c:8453 utils/adt/numeric.c:8743 utils/adt/numeric.c:9068 +#: utils/adt/numeric.c:10525 utils/adt/timestamp.c:3337 #, c-format msgid "division by zero" msgstr "Division durch Null" @@ -22587,184 +23670,192 @@ msgstr "Division durch Null" msgid "\"char\" out of range" msgstr "\"char\" ist außerhalb des gültigen Bereichs" -#: utils/adt/date.c:62 utils/adt/timestamp.c:97 utils/adt/varbit.c:105 +#: utils/adt/cryptohashfuncs.c:47 utils/adt/cryptohashfuncs.c:69 +#, fuzzy, c-format +#| msgid "could not compress data: %s" +msgid "could not compute %s hash: %s" +msgstr "konnte Daten nicht komprimieren: %s" + +#: utils/adt/date.c:63 utils/adt/timestamp.c:98 utils/adt/varbit.c:105 #: utils/adt/varchar.c:48 #, c-format msgid "invalid type modifier" msgstr "ungültige Typmodifikation" -#: utils/adt/date.c:74 +#: utils/adt/date.c:75 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "Präzision von TIME(%d)%s darf nicht negativ sein" -#: utils/adt/date.c:80 +#: utils/adt/date.c:81 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "Präzision von TIME(%d)%s auf erlaubten Höchstwert %d reduziert" -#: utils/adt/date.c:159 utils/adt/date.c:167 utils/adt/formatting.c:4252 -#: utils/adt/formatting.c:4261 utils/adt/formatting.c:4367 -#: utils/adt/formatting.c:4377 +#: utils/adt/date.c:160 utils/adt/date.c:168 utils/adt/formatting.c:4294 +#: utils/adt/formatting.c:4303 utils/adt/formatting.c:4409 +#: utils/adt/formatting.c:4419 #, c-format msgid "date out of range: \"%s\"" msgstr "date ist außerhalb des gültigen Bereichs: »%s«" -#: utils/adt/date.c:214 utils/adt/date.c:525 utils/adt/date.c:549 -#: utils/adt/xml.c:2210 +#: utils/adt/date.c:215 utils/adt/date.c:513 utils/adt/date.c:537 +#: utils/adt/xml.c:2209 #, c-format msgid "date out of range" msgstr "date ist außerhalb des gültigen Bereichs" -#: utils/adt/date.c:260 utils/adt/timestamp.c:580 +#: utils/adt/date.c:261 utils/adt/timestamp.c:581 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "Datum-Feldwert ist außerhalb des gültigen Bereichs: %d-%02d-%02d" -#: utils/adt/date.c:267 utils/adt/date.c:276 utils/adt/timestamp.c:586 +#: utils/adt/date.c:268 utils/adt/date.c:277 utils/adt/timestamp.c:587 #, c-format msgid "date out of range: %d-%02d-%02d" msgstr "date ist außerhalb des gültigen Bereichs: %d-%02d-%02d" -#: utils/adt/date.c:500 +#: utils/adt/date.c:488 #, c-format msgid "cannot subtract infinite dates" msgstr "kann unendliche date-Werte nicht subtrahieren" -#: utils/adt/date.c:598 utils/adt/date.c:661 utils/adt/date.c:697 -#: utils/adt/date.c:2881 utils/adt/date.c:2891 +#: utils/adt/date.c:586 utils/adt/date.c:649 utils/adt/date.c:685 +#: utils/adt/date.c:2868 utils/adt/date.c:2878 #, c-format msgid "date out of range for timestamp" msgstr "Datum ist außerhalb des gültigen Bereichs für Typ »timestamp«" -#: utils/adt/date.c:1127 utils/adt/date.c:1210 utils/adt/date.c:1226 -#, c-format -msgid "date units \"%s\" not supported" +#: utils/adt/date.c:1115 utils/adt/date.c:1198 utils/adt/date.c:1214 +#: utils/adt/date.c:2195 utils/adt/date.c:2973 utils/adt/timestamp.c:4032 +#: utils/adt/timestamp.c:4225 utils/adt/timestamp.c:4397 +#: utils/adt/timestamp.c:4650 utils/adt/timestamp.c:4851 +#: utils/adt/timestamp.c:4898 utils/adt/timestamp.c:5122 +#: utils/adt/timestamp.c:5169 utils/adt/timestamp.c:5299 +#, fuzzy, c-format +#| msgid "date units \"%s\" not supported" +msgid "unit \"%s\" not supported for type %s" msgstr "»date«-Einheit »%s« nicht unterstützt" -#: utils/adt/date.c:1235 -#, c-format -msgid "date units \"%s\" not recognized" +#: utils/adt/date.c:1223 utils/adt/date.c:2211 utils/adt/date.c:2993 +#: utils/adt/timestamp.c:4046 utils/adt/timestamp.c:4242 +#: utils/adt/timestamp.c:4411 utils/adt/timestamp.c:4610 +#: utils/adt/timestamp.c:4907 utils/adt/timestamp.c:5178 +#: utils/adt/timestamp.c:5360 +#, fuzzy, c-format +#| msgid "date units \"%s\" not recognized" +msgid "unit \"%s\" not recognized for type %s" msgstr "»date«-Einheit »%s« nicht erkannt" -#: utils/adt/date.c:1318 utils/adt/date.c:1364 utils/adt/date.c:1920 -#: utils/adt/date.c:1951 utils/adt/date.c:1980 utils/adt/date.c:2844 -#: utils/adt/datetime.c:405 utils/adt/datetime.c:1700 -#: utils/adt/formatting.c:4109 utils/adt/formatting.c:4141 -#: utils/adt/formatting.c:4221 utils/adt/formatting.c:4343 utils/adt/json.c:418 -#: utils/adt/json.c:457 utils/adt/timestamp.c:224 utils/adt/timestamp.c:256 -#: utils/adt/timestamp.c:698 utils/adt/timestamp.c:707 -#: utils/adt/timestamp.c:785 utils/adt/timestamp.c:818 -#: utils/adt/timestamp.c:2860 utils/adt/timestamp.c:2881 -#: utils/adt/timestamp.c:2894 utils/adt/timestamp.c:2903 -#: utils/adt/timestamp.c:2911 utils/adt/timestamp.c:2966 -#: utils/adt/timestamp.c:2989 utils/adt/timestamp.c:3002 -#: utils/adt/timestamp.c:3013 utils/adt/timestamp.c:3021 -#: utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3806 -#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:3981 -#: utils/adt/timestamp.c:4069 utils/adt/timestamp.c:4172 -#: utils/adt/timestamp.c:4674 utils/adt/timestamp.c:4948 -#: utils/adt/timestamp.c:5401 utils/adt/timestamp.c:5415 -#: utils/adt/timestamp.c:5420 utils/adt/timestamp.c:5434 -#: utils/adt/timestamp.c:5467 utils/adt/timestamp.c:5554 -#: utils/adt/timestamp.c:5595 utils/adt/timestamp.c:5599 -#: utils/adt/timestamp.c:5668 utils/adt/timestamp.c:5672 -#: utils/adt/timestamp.c:5686 utils/adt/timestamp.c:5720 utils/adt/xml.c:2232 -#: utils/adt/xml.c:2239 utils/adt/xml.c:2259 utils/adt/xml.c:2266 +#: utils/adt/date.c:1307 utils/adt/date.c:1353 utils/adt/date.c:1907 +#: utils/adt/date.c:1938 utils/adt/date.c:1967 utils/adt/date.c:2831 +#: utils/adt/date.c:3078 utils/adt/datetime.c:420 utils/adt/datetime.c:1869 +#: utils/adt/formatting.c:4136 utils/adt/formatting.c:4172 +#: utils/adt/formatting.c:4263 utils/adt/formatting.c:4385 utils/adt/json.c:440 +#: utils/adt/json.c:479 utils/adt/timestamp.c:225 utils/adt/timestamp.c:257 +#: utils/adt/timestamp.c:699 utils/adt/timestamp.c:708 +#: utils/adt/timestamp.c:786 utils/adt/timestamp.c:819 +#: utils/adt/timestamp.c:2916 utils/adt/timestamp.c:2937 +#: utils/adt/timestamp.c:2950 utils/adt/timestamp.c:2959 +#: utils/adt/timestamp.c:2967 utils/adt/timestamp.c:3022 +#: utils/adt/timestamp.c:3045 utils/adt/timestamp.c:3058 +#: utils/adt/timestamp.c:3069 utils/adt/timestamp.c:3077 +#: utils/adt/timestamp.c:3736 utils/adt/timestamp.c:3860 +#: utils/adt/timestamp.c:3950 utils/adt/timestamp.c:4040 +#: utils/adt/timestamp.c:4133 utils/adt/timestamp.c:4236 +#: utils/adt/timestamp.c:4715 utils/adt/timestamp.c:4989 +#: utils/adt/timestamp.c:5439 utils/adt/timestamp.c:5453 +#: utils/adt/timestamp.c:5458 utils/adt/timestamp.c:5472 +#: utils/adt/timestamp.c:5505 utils/adt/timestamp.c:5592 +#: utils/adt/timestamp.c:5633 utils/adt/timestamp.c:5637 +#: utils/adt/timestamp.c:5706 utils/adt/timestamp.c:5710 +#: utils/adt/timestamp.c:5724 utils/adt/timestamp.c:5758 utils/adt/xml.c:2231 +#: utils/adt/xml.c:2238 utils/adt/xml.c:2258 utils/adt/xml.c:2265 #, c-format msgid "timestamp out of range" msgstr "timestamp ist außerhalb des gültigen Bereichs" -#: utils/adt/date.c:1537 utils/adt/date.c:2339 utils/adt/formatting.c:4429 +#: utils/adt/date.c:1524 utils/adt/date.c:2326 utils/adt/formatting.c:4471 #, c-format msgid "time out of range" msgstr "time ist außerhalb des gültigen Bereichs" -#: utils/adt/date.c:1589 utils/adt/timestamp.c:595 +#: utils/adt/date.c:1576 utils/adt/timestamp.c:596 #, c-format msgid "time field value out of range: %d:%02d:%02g" msgstr "Zeit-Feldwert ist außerhalb des gültigen Bereichs: %d:%02d:%02g" -#: utils/adt/date.c:2109 utils/adt/date.c:2643 utils/adt/float.c:1047 -#: utils/adt/float.c:1123 utils/adt/int.c:614 utils/adt/int.c:661 -#: utils/adt/int.c:696 utils/adt/int8.c:499 utils/adt/numeric.c:2443 -#: utils/adt/timestamp.c:3330 utils/adt/timestamp.c:3361 -#: utils/adt/timestamp.c:3392 +#: utils/adt/date.c:2096 utils/adt/date.c:2630 utils/adt/float.c:1048 +#: utils/adt/float.c:1124 utils/adt/int.c:638 utils/adt/int.c:685 +#: utils/adt/int.c:720 utils/adt/int8.c:414 utils/adt/numeric.c:2497 +#: utils/adt/timestamp.c:3386 utils/adt/timestamp.c:3417 +#: utils/adt/timestamp.c:3448 #, c-format msgid "invalid preceding or following size in window function" msgstr "ungültige vorhergehende oder folgende Größe in Fensterfunktion" -#: utils/adt/date.c:2208 utils/adt/date.c:2224 -#, c-format -msgid "\"time\" units \"%s\" not recognized" -msgstr "»time«-Einheit »%s« nicht erkannt" - -#: utils/adt/date.c:2347 +#: utils/adt/date.c:2334 #, c-format msgid "time zone displacement out of range" msgstr "Zeitzonenunterschied ist außerhalb des gültigen Bereichs" -#: utils/adt/date.c:2986 utils/adt/date.c:3006 -#, c-format -msgid "\"time with time zone\" units \"%s\" not recognized" -msgstr "»time with time zone«-Einheit »%s« nicht erkannt" - -#: utils/adt/date.c:3095 utils/adt/datetime.c:951 utils/adt/datetime.c:1858 -#: utils/adt/datetime.c:4648 utils/adt/timestamp.c:515 -#: utils/adt/timestamp.c:542 utils/adt/timestamp.c:4255 -#: utils/adt/timestamp.c:5426 utils/adt/timestamp.c:5678 +#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 +#: utils/adt/datetime.c:4906 utils/adt/timestamp.c:516 +#: utils/adt/timestamp.c:543 utils/adt/timestamp.c:4319 +#: utils/adt/timestamp.c:5464 utils/adt/timestamp.c:5716 #, c-format msgid "time zone \"%s\" not recognized" msgstr "Zeitzone »%s« nicht erkannt" -#: utils/adt/date.c:3127 utils/adt/timestamp.c:5456 utils/adt/timestamp.c:5709 +#: utils/adt/date.c:3116 utils/adt/timestamp.c:5494 utils/adt/timestamp.c:5747 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "Intervall-Zeitzone »%s« darf keine Monate oder Tage enthalten" -#: utils/adt/datetime.c:3775 utils/adt/datetime.c:3782 +#: utils/adt/datetime.c:4031 utils/adt/datetime.c:4038 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "Datum/Zeit-Feldwert ist außerhalb des gültigen Bereichs: »%s«" -#: utils/adt/datetime.c:3784 +#: utils/adt/datetime.c:4040 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Möglicherweise benötigen Sie eine andere »datestyle«-Einstellung." -#: utils/adt/datetime.c:3789 +#: utils/adt/datetime.c:4045 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "»interval«-Feldwert ist außerhalb des gültigen Bereichs: »%s«" -#: utils/adt/datetime.c:3795 +#: utils/adt/datetime.c:4051 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "Zeitzonenunterschied ist außerhalb des gültigen Bereichs: »%s«" -#: utils/adt/datetime.c:4650 +#: utils/adt/datetime.c:4908 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "Dieser Zeitzonenname erscheint in der Konfigurationsdatei für Zeitzonenabkürzung »%s«." -#: utils/adt/datum.c:89 utils/adt/datum.c:101 +#: utils/adt/datum.c:90 utils/adt/datum.c:102 #, c-format msgid "invalid Datum pointer" msgstr "ungültiger »Datum«-Zeiger" -#: utils/adt/dbsize.c:749 utils/adt/dbsize.c:817 +#: utils/adt/dbsize.c:747 utils/adt/dbsize.c:813 #, c-format msgid "invalid size: \"%s\"" msgstr "ungültige Größe: »%s«" -#: utils/adt/dbsize.c:818 +#: utils/adt/dbsize.c:814 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Ungültige Größeneinheit: »%s«." -#: utils/adt/dbsize.c:819 -#, c-format -msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." +#: utils/adt/dbsize.c:815 +#, fuzzy, c-format +#| msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." +msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." msgstr "Gültige Einheiten sind »kB«, »MB«, »GB« und »TB«." #: utils/adt/domains.c:92 @@ -22772,37 +23863,47 @@ msgstr "Gültige Einheiten sind »kB«, »MB«, »GB« und »TB«." msgid "type %s is not a domain" msgstr "Typ %s ist keine Domäne" -#: utils/adt/encode.c:68 utils/adt/encode.c:112 +#: utils/adt/encode.c:65 utils/adt/encode.c:113 #, c-format msgid "unrecognized encoding: \"%s\"" msgstr "unbekannte Kodierung: »%s«" -#: utils/adt/encode.c:82 +#: utils/adt/encode.c:79 #, c-format msgid "result of encoding conversion is too large" msgstr "Ergebnis der Kodierungsumwandlung ist zu groß" -#: utils/adt/encode.c:126 +#: utils/adt/encode.c:127 #, c-format msgid "result of decoding conversion is too large" msgstr "Ergebnis der Dekodierungsumwandlung ist zu groß" -#: utils/adt/encode.c:261 +#: utils/adt/encode.c:186 +#, c-format +msgid "invalid hexadecimal digit: \"%.*s\"" +msgstr "ungültige hexadezimale Ziffer: »%.*s«" + +#: utils/adt/encode.c:216 +#, c-format +msgid "invalid hexadecimal data: odd number of digits" +msgstr "ungültige hexadezimale Daten: ungerade Anzahl Ziffern" + +#: utils/adt/encode.c:334 #, c-format msgid "unexpected \"=\" while decoding base64 sequence" msgstr "unerwartetes »=« beim Dekodieren von Base64-Sequenz" -#: utils/adt/encode.c:273 +#: utils/adt/encode.c:346 #, c-format msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" msgstr "ungültiges Symbol »%.*s« beim Dekodieren von Base64-Sequenz" -#: utils/adt/encode.c:304 +#: utils/adt/encode.c:367 #, c-format msgid "invalid base64 end sequence" msgstr "ungültige Base64-Endsequenz" -#: utils/adt/encode.c:305 +#: utils/adt/encode.c:368 #, c-format msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "Die Eingabedaten haben fehlendes Padding, sind zu kurz oder sind anderweitig verfälscht." @@ -22839,390 +23940,385 @@ msgstr "konnte tatsächlichen Enum-Typen nicht bestimmen" msgid "enum %s contains no values" msgstr "Enum %s enthält keine Werte" -#: utils/adt/float.c:88 +#: utils/adt/float.c:89 #, c-format msgid "value out of range: overflow" msgstr "Wert ist außerhalb des gültigen Bereichs: Überlauf" -#: utils/adt/float.c:96 +#: utils/adt/float.c:97 #, c-format msgid "value out of range: underflow" msgstr "Wert ist außerhalb des gültigen Bereichs: Unterlauf" -#: utils/adt/float.c:265 +#: utils/adt/float.c:266 #, c-format msgid "\"%s\" is out of range for type real" msgstr "»%s« ist außerhalb des gültigen Bereichs für Typ real" -#: utils/adt/float.c:477 +#: utils/adt/float.c:478 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "»%s« ist außerhalb des gültigen Bereichs für Typ double precision" -#: utils/adt/float.c:1258 utils/adt/float.c:1332 utils/adt/int.c:334 -#: utils/adt/int.c:872 utils/adt/int.c:894 utils/adt/int.c:908 -#: utils/adt/int.c:922 utils/adt/int.c:954 utils/adt/int.c:1192 -#: utils/adt/int8.c:1320 utils/adt/numeric.c:4317 utils/adt/numeric.c:4326 +#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:358 +#: utils/adt/int.c:896 utils/adt/int.c:918 utils/adt/int.c:932 +#: utils/adt/int.c:946 utils/adt/int.c:978 utils/adt/int.c:1216 +#: utils/adt/int8.c:1278 utils/adt/numeric.c:4377 utils/adt/numeric.c:4382 #, c-format msgid "smallint out of range" msgstr "smallint ist außerhalb des gültigen Bereichs" -#: utils/adt/float.c:1458 utils/adt/numeric.c:3550 utils/adt/numeric.c:9310 +#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9482 #, c-format msgid "cannot take square root of a negative number" msgstr "Quadratwurzel von negativer Zahl kann nicht ermittelt werden" -#: utils/adt/float.c:1526 utils/adt/numeric.c:3825 utils/adt/numeric.c:3935 +#: utils/adt/float.c:1527 utils/adt/numeric.c:3886 utils/adt/numeric.c:3998 #, c-format msgid "zero raised to a negative power is undefined" msgstr "null hoch eine negative Zahl ist undefiniert" -#: utils/adt/float.c:1530 utils/adt/numeric.c:3829 utils/adt/numeric.c:3940 +#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10378 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "eine negative Zahl hoch eine nicht ganze Zahl ergibt ein komplexes Ergebnis" -#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3737 -#: utils/adt/numeric.c:9974 +#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 +#: utils/adt/numeric.c:10153 #, c-format msgid "cannot take logarithm of zero" msgstr "Logarithmus von null kann nicht ermittelt werden" -#: utils/adt/float.c:1710 utils/adt/float.c:1743 utils/adt/numeric.c:3675 -#: utils/adt/numeric.c:3732 utils/adt/numeric.c:9978 +#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 +#: utils/adt/numeric.c:3793 utils/adt/numeric.c:10157 #, c-format msgid "cannot take logarithm of a negative number" msgstr "Logarithmus negativer Zahlen kann nicht ermittelt werden" -#: utils/adt/float.c:1776 utils/adt/float.c:1807 utils/adt/float.c:1902 -#: utils/adt/float.c:1929 utils/adt/float.c:1957 utils/adt/float.c:1984 -#: utils/adt/float.c:2131 utils/adt/float.c:2168 utils/adt/float.c:2338 -#: utils/adt/float.c:2394 utils/adt/float.c:2459 utils/adt/float.c:2516 -#: utils/adt/float.c:2707 utils/adt/float.c:2731 +#: utils/adt/float.c:1777 utils/adt/float.c:1808 utils/adt/float.c:1903 +#: utils/adt/float.c:1930 utils/adt/float.c:1958 utils/adt/float.c:1985 +#: utils/adt/float.c:2132 utils/adt/float.c:2169 utils/adt/float.c:2339 +#: utils/adt/float.c:2395 utils/adt/float.c:2460 utils/adt/float.c:2517 +#: utils/adt/float.c:2708 utils/adt/float.c:2732 #, c-format msgid "input is out of range" msgstr "Eingabe ist außerhalb des gültigen Bereichs" -#: utils/adt/float.c:2798 +#: utils/adt/float.c:2796 #, c-format msgid "setseed parameter %g is out of allowed range [-1,1]" msgstr "setseed-Parameter %g ist außerhalb des gültigen Bereichs [-1;-1]" -#: utils/adt/float.c:4030 utils/adt/numeric.c:1716 +#: utils/adt/float.c:4024 utils/adt/numeric.c:1770 #, c-format msgid "count must be greater than zero" msgstr "Anzahl muss größer als null sein" -#: utils/adt/float.c:4035 utils/adt/numeric.c:1727 +#: utils/adt/float.c:4029 utils/adt/numeric.c:1781 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "Operand, Untergrenze und Obergrenze dürfen nicht NaN sein" -#: utils/adt/float.c:4041 utils/adt/numeric.c:1732 +#: utils/adt/float.c:4035 utils/adt/numeric.c:1786 #, c-format msgid "lower and upper bounds must be finite" msgstr "Untergrenze und Obergrenze müssen endlich sein" -#: utils/adt/float.c:4075 utils/adt/numeric.c:1746 +#: utils/adt/float.c:4069 utils/adt/numeric.c:1800 #, c-format msgid "lower bound cannot equal upper bound" msgstr "Untergrenze kann nicht gleich der Obergrenze sein" -#: utils/adt/formatting.c:532 +#: utils/adt/formatting.c:561 #, c-format msgid "invalid format specification for an interval value" msgstr "ungültige Formatangabe für Intervall-Wert" -#: utils/adt/formatting.c:533 +#: utils/adt/formatting.c:562 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "Intervalle beziehen sich nicht auf bestimmte Kalenderdaten." -#: utils/adt/formatting.c:1157 +#: utils/adt/formatting.c:1187 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "»EEEE« muss das letzte Muster sein" -#: utils/adt/formatting.c:1165 +#: utils/adt/formatting.c:1195 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "»9« muss vor »PR« stehen" -#: utils/adt/formatting.c:1181 +#: utils/adt/formatting.c:1211 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "»0« muss vor »PR« stehen" -#: utils/adt/formatting.c:1208 +#: utils/adt/formatting.c:1238 #, c-format msgid "multiple decimal points" msgstr "mehrere Dezimalpunkte" -#: utils/adt/formatting.c:1212 utils/adt/formatting.c:1295 +#: utils/adt/formatting.c:1242 utils/adt/formatting.c:1325 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "»V« und Dezimalpunkt können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1224 +#: utils/adt/formatting.c:1254 #, c-format msgid "cannot use \"S\" twice" msgstr "»S« kann nicht zweimal verwendet werden" -#: utils/adt/formatting.c:1228 +#: utils/adt/formatting.c:1258 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "»S« und »PL«/»MI«/»SG«/»PR« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1248 +#: utils/adt/formatting.c:1278 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "»S« und »MI« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1258 +#: utils/adt/formatting.c:1288 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "»S« und »PL« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1268 +#: utils/adt/formatting.c:1298 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "»S« und »SG« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1277 +#: utils/adt/formatting.c:1307 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "»PR« und »S«/»PL«/»MI«/»SG« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1303 +#: utils/adt/formatting.c:1333 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "»EEEE« kann nicht zweimal verwendet werden" -#: utils/adt/formatting.c:1309 +#: utils/adt/formatting.c:1339 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "»EEEE« ist mit anderen Formaten inkompatibel" -#: utils/adt/formatting.c:1310 +#: utils/adt/formatting.c:1340 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "»EEEE« kann nur zusammen mit Platzhaltern für Ziffern oder Dezimalpunkt verwendet werden." -#: utils/adt/formatting.c:1394 +#: utils/adt/formatting.c:1424 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "ungültiges Datum-/Zeit-Formattrennzeichen: »%s«" -#: utils/adt/formatting.c:1521 +#: utils/adt/formatting.c:1551 #, c-format msgid "\"%s\" is not a number" msgstr "»%s« ist keine Zahl" -#: utils/adt/formatting.c:1599 +#: utils/adt/formatting.c:1629 #, c-format msgid "case conversion failed: %s" msgstr "Groß/Klein-Umwandlung fehlgeschlagen: %s" -#: utils/adt/formatting.c:1664 utils/adt/formatting.c:1788 -#: utils/adt/formatting.c:1913 +#: utils/adt/formatting.c:1683 utils/adt/formatting.c:1805 +#: utils/adt/formatting.c:1928 #, c-format msgid "could not determine which collation to use for %s function" msgstr "konnte die für die Funktion %s zu verwendende Sortierfolge nicht bestimmen" -#: utils/adt/formatting.c:2285 +#: utils/adt/formatting.c:2309 #, c-format msgid "invalid combination of date conventions" msgstr "ungültige Kombination von Datumskonventionen" -#: utils/adt/formatting.c:2286 +#: utils/adt/formatting.c:2310 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "Die Gregorianische und die ISO-Konvention für Wochendaten können nicht einer Formatvorlage gemischt werden." -#: utils/adt/formatting.c:2309 +#: utils/adt/formatting.c:2333 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "widersprüchliche Werte für das Feld »%s« in Formatzeichenkette" -#: utils/adt/formatting.c:2312 +#: utils/adt/formatting.c:2336 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Der Wert widerspricht einer vorherigen Einstellung für den selben Feldtyp." -#: utils/adt/formatting.c:2383 +#: utils/adt/formatting.c:2407 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "Quellzeichenkette zu kurz für Formatfeld »%s»" -#: utils/adt/formatting.c:2386 +#: utils/adt/formatting.c:2410 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Feld benötigt %d Zeichen, aber nur %d verbleiben." -#: utils/adt/formatting.c:2389 utils/adt/formatting.c:2404 +#: utils/adt/formatting.c:2413 utils/adt/formatting.c:2428 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "Wenn die Quellzeichenkette keine feste Breite hat, versuchen Sie den Modifikator »FM«." -#: utils/adt/formatting.c:2399 utils/adt/formatting.c:2413 -#: utils/adt/formatting.c:2636 +#: utils/adt/formatting.c:2423 utils/adt/formatting.c:2437 +#: utils/adt/formatting.c:2660 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "ungültiger Wert »%s« für »%s«" -#: utils/adt/formatting.c:2401 +#: utils/adt/formatting.c:2425 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Feld benötigt %d Zeichen, aber nur %d konnten geparst werden." -#: utils/adt/formatting.c:2415 +#: utils/adt/formatting.c:2439 #, c-format msgid "Value must be an integer." msgstr "Der Wert muss eine ganze Zahl sein." -#: utils/adt/formatting.c:2420 +#: utils/adt/formatting.c:2444 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "Wert für »%s« in der Eingabezeichenkette ist außerhalb des gültigen Bereichs" -#: utils/adt/formatting.c:2422 +#: utils/adt/formatting.c:2446 #, c-format msgid "Value must be in the range %d to %d." msgstr "Der Wert muss im Bereich %d bis %d sein." -#: utils/adt/formatting.c:2638 +#: utils/adt/formatting.c:2662 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "Der angegebene Wert stimmte mit keinem der für dieses Feld zulässigen Werte überein." -#: utils/adt/formatting.c:2855 utils/adt/formatting.c:2875 -#: utils/adt/formatting.c:2895 utils/adt/formatting.c:2915 -#: utils/adt/formatting.c:2934 utils/adt/formatting.c:2953 -#: utils/adt/formatting.c:2977 utils/adt/formatting.c:2995 -#: utils/adt/formatting.c:3013 utils/adt/formatting.c:3031 -#: utils/adt/formatting.c:3048 utils/adt/formatting.c:3065 +#: utils/adt/formatting.c:2881 utils/adt/formatting.c:2901 +#: utils/adt/formatting.c:2921 utils/adt/formatting.c:2941 +#: utils/adt/formatting.c:2960 utils/adt/formatting.c:2979 +#: utils/adt/formatting.c:3003 utils/adt/formatting.c:3021 +#: utils/adt/formatting.c:3039 utils/adt/formatting.c:3057 +#: utils/adt/formatting.c:3074 utils/adt/formatting.c:3091 #, c-format msgid "localized string format value too long" msgstr "lokalisierter Formatwert ist zu lang" -#: utils/adt/formatting.c:3342 +#: utils/adt/formatting.c:3368 #, c-format msgid "unmatched format separator \"%c\"" msgstr "Formattrennzeichen »%c« ohne passende Eingabe" -#: utils/adt/formatting.c:3403 +#: utils/adt/formatting.c:3429 #, c-format msgid "unmatched format character \"%s\"" msgstr "Formatzeichen »%s« ohne passende Eingabe" -#: utils/adt/formatting.c:3509 utils/adt/formatting.c:3853 +#: utils/adt/formatting.c:3535 utils/adt/formatting.c:3879 #, c-format msgid "formatting field \"%s\" is only supported in to_char" msgstr "Formatfeld »%s« wird nur in to_char unterstützt" -#: utils/adt/formatting.c:3684 +#: utils/adt/formatting.c:3710 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "ungültige Eingabe für »Y,YYY«" -#: utils/adt/formatting.c:3770 +#: utils/adt/formatting.c:3796 #, c-format msgid "input string is too short for datetime format" msgstr "Eingabezeichenkette ist zu kurz für Datum-/Zeitformat" -#: utils/adt/formatting.c:3778 +#: utils/adt/formatting.c:3804 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "nach dem Datum-/Zeitformat bleiben noch Zeichen in der Eingabezeichenkette" -#: utils/adt/formatting.c:4323 +#: utils/adt/formatting.c:4365 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "Zeitzone fehlt in Eingabezeichenkette für Typ timestamptz" -#: utils/adt/formatting.c:4329 +#: utils/adt/formatting.c:4371 #, c-format msgid "timestamptz out of range" msgstr "timestamptz ist außerhalb des gültigen Bereichs" -#: utils/adt/formatting.c:4357 +#: utils/adt/formatting.c:4399 #, c-format msgid "datetime format is zoned but not timed" msgstr "Datum-/Zeitformat hat Zeitzone aber keine Zeit" -#: utils/adt/formatting.c:4409 +#: utils/adt/formatting.c:4451 #, c-format msgid "missing time zone in input string for type timetz" msgstr "Zeitzone fehlt in Eingabezeichenkette für Typ timetz" -#: utils/adt/formatting.c:4415 +#: utils/adt/formatting.c:4457 #, c-format msgid "timetz out of range" msgstr "timetz ist außerhalb des gültigen Bereichs" -#: utils/adt/formatting.c:4441 +#: utils/adt/formatting.c:4483 #, c-format msgid "datetime format is not dated and not timed" msgstr "Datum-/Zeitformat hat kein Datum und keine Zeit" -#: utils/adt/formatting.c:4574 +#: utils/adt/formatting.c:4616 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "Stunde »%d« ist bei einer 12-Stunden-Uhr ungültig" -#: utils/adt/formatting.c:4576 +#: utils/adt/formatting.c:4618 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Verwenden Sie die 24-Stunden-Uhr oder geben Sie eine Stunde zwischen 1 und 12 an." -#: utils/adt/formatting.c:4687 +#: utils/adt/formatting.c:4729 #, c-format msgid "cannot calculate day of year without year information" msgstr "kann Tag des Jahres nicht berechnen ohne Jahrinformationen" -#: utils/adt/formatting.c:5606 +#: utils/adt/formatting.c:5648 #, c-format msgid "\"EEEE\" not supported for input" msgstr "»E« wird nicht bei der Eingabe unterstützt" -#: utils/adt/formatting.c:5618 +#: utils/adt/formatting.c:5660 #, c-format msgid "\"RN\" not supported for input" msgstr "»RN« wird nicht bei der Eingabe unterstützt" -#: utils/adt/genfile.c:78 -#, c-format -msgid "reference to parent directory (\"..\") not allowed" -msgstr "Verweis auf übergeordnetes Verzeichnis (»..«) nicht erlaubt" - -#: utils/adt/genfile.c:89 +#: utils/adt/genfile.c:84 #, c-format msgid "absolute path not allowed" msgstr "absoluter Pfad nicht erlaubt" -#: utils/adt/genfile.c:94 +#: utils/adt/genfile.c:89 #, c-format msgid "path must be in or below the current directory" msgstr "Pfad muss in oder unter aktuellem Verzeichnis sein" -#: utils/adt/genfile.c:119 utils/adt/oracle_compat.c:187 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:187 #: utils/adt/oracle_compat.c:285 utils/adt/oracle_compat.c:833 -#: utils/adt/oracle_compat.c:1128 +#: utils/adt/oracle_compat.c:1134 #, c-format msgid "requested length too large" msgstr "verlangte Länge zu groß" -#: utils/adt/genfile.c:136 +#: utils/adt/genfile.c:131 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "konnte Positionszeiger in Datei »%s« nicht setzen: %m" -#: utils/adt/genfile.c:176 +#: utils/adt/genfile.c:171 #, c-format msgid "file length too large" msgstr "Dateilänge zu groß" -#: utils/adt/genfile.c:253 +#: utils/adt/genfile.c:248 #, c-format msgid "must be superuser to read files with adminpack 1.0" msgstr "nur Superuser können mit adminpack 1.0 Dateien lesen" @@ -23237,8 +24333,8 @@ msgstr "ungültige »line«-Angabe: A und B können nicht beide null sein" msgid "invalid line specification: must be two distinct points" msgstr "ungültige »line«-Angabe: es müssen zwei verschiedene Punkte angegeben werden" -#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3498 utils/adt/geo_ops.c:4366 -#: utils/adt/geo_ops.c:5260 +#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4327 +#: utils/adt/geo_ops.c:5207 #, c-format msgid "too many points requested" msgstr "zu viele Punkte verlangt" @@ -23248,608 +24344,609 @@ msgstr "zu viele Punkte verlangt" msgid "invalid number of points in external \"path\" value" msgstr "ungültige Anzahl Punkte in externem »path«-Wert" -#: utils/adt/geo_ops.c:2549 -#, c-format -msgid "function \"dist_lb\" not implemented" -msgstr "Funktion »dist_lb« ist nicht implementiert" - -#: utils/adt/geo_ops.c:2568 -#, c-format -msgid "function \"dist_bl\" not implemented" -msgstr "Funktion »dist_bl« ist nicht implementiert" - -#: utils/adt/geo_ops.c:2987 -#, c-format -msgid "function \"close_sl\" not implemented" -msgstr "Funktion »close_sl« ist nicht implementiert" - -#: utils/adt/geo_ops.c:3134 -#, c-format -msgid "function \"close_lb\" not implemented" -msgstr "Funktion »close_lb« ist nicht implementiert" - -#: utils/adt/geo_ops.c:3545 +#: utils/adt/geo_ops.c:3449 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "ungültige Anzahl Punkte in externem »polygon«-Wert" -#: utils/adt/geo_ops.c:4081 -#, c-format -msgid "function \"poly_distance\" not implemented" -msgstr "Funktion »poly_distance« ist nicht implementiert" - -#: utils/adt/geo_ops.c:4458 -#, c-format -msgid "function \"path_center\" not implemented" -msgstr "Funktion »path_center« ist nicht implementiert" - -#: utils/adt/geo_ops.c:4475 +#: utils/adt/geo_ops.c:4422 #, c-format msgid "open path cannot be converted to polygon" msgstr "offener Pfad kann nicht in Polygon umgewandelt werden" -#: utils/adt/geo_ops.c:4725 +#: utils/adt/geo_ops.c:4672 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "ungültiger Radius in externem »circle«-Wert" -#: utils/adt/geo_ops.c:5246 +#: utils/adt/geo_ops.c:5193 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "kann Kreis mit Radius null nicht in Polygon umwandeln" -#: utils/adt/geo_ops.c:5251 +#: utils/adt/geo_ops.c:5198 #, c-format msgid "must request at least 2 points" msgstr "mindestens 2 Punkte müssen angefordert werden" -#: utils/adt/int.c:164 +#: utils/adt/int.c:188 #, c-format msgid "int2vector has too many elements" msgstr "int2vector-Wert hat zu viele Elemente" -#: utils/adt/int.c:237 +#: utils/adt/int.c:261 #, c-format msgid "invalid int2vector data" msgstr "ungültige int2vector-Daten" -#: utils/adt/int.c:243 utils/adt/oid.c:215 utils/adt/oid.c:296 +#: utils/adt/int.c:267 utils/adt/oid.c:215 utils/adt/oid.c:296 #, c-format msgid "oidvector has too many elements" msgstr "oidvector-Wert hat zu viele Elemente" -#: utils/adt/int.c:1508 utils/adt/int8.c:1446 utils/adt/numeric.c:1624 -#: utils/adt/timestamp.c:5771 utils/adt/timestamp.c:5851 +#: utils/adt/int.c:1532 utils/adt/int8.c:1404 utils/adt/numeric.c:1678 +#: utils/adt/timestamp.c:5809 utils/adt/timestamp.c:5889 #, c-format msgid "step size cannot equal zero" msgstr "Schrittgröße kann nicht gleich null sein" -#: utils/adt/int8.c:534 utils/adt/int8.c:557 utils/adt/int8.c:571 -#: utils/adt/int8.c:585 utils/adt/int8.c:616 utils/adt/int8.c:640 -#: utils/adt/int8.c:722 utils/adt/int8.c:790 utils/adt/int8.c:796 -#: utils/adt/int8.c:822 utils/adt/int8.c:836 utils/adt/int8.c:860 -#: utils/adt/int8.c:873 utils/adt/int8.c:942 utils/adt/int8.c:956 -#: utils/adt/int8.c:970 utils/adt/int8.c:1001 utils/adt/int8.c:1023 -#: utils/adt/int8.c:1037 utils/adt/int8.c:1051 utils/adt/int8.c:1084 -#: utils/adt/int8.c:1098 utils/adt/int8.c:1112 utils/adt/int8.c:1143 -#: utils/adt/int8.c:1165 utils/adt/int8.c:1179 utils/adt/int8.c:1193 -#: utils/adt/int8.c:1355 utils/adt/int8.c:1390 utils/adt/numeric.c:4276 +#: utils/adt/int8.c:449 utils/adt/int8.c:472 utils/adt/int8.c:486 +#: utils/adt/int8.c:500 utils/adt/int8.c:531 utils/adt/int8.c:555 +#: utils/adt/int8.c:637 utils/adt/int8.c:705 utils/adt/int8.c:711 +#: utils/adt/int8.c:737 utils/adt/int8.c:751 utils/adt/int8.c:775 +#: utils/adt/int8.c:788 utils/adt/int8.c:900 utils/adt/int8.c:914 +#: utils/adt/int8.c:928 utils/adt/int8.c:959 utils/adt/int8.c:981 +#: utils/adt/int8.c:995 utils/adt/int8.c:1009 utils/adt/int8.c:1042 +#: utils/adt/int8.c:1056 utils/adt/int8.c:1070 utils/adt/int8.c:1101 +#: utils/adt/int8.c:1123 utils/adt/int8.c:1137 utils/adt/int8.c:1151 +#: utils/adt/int8.c:1313 utils/adt/int8.c:1348 utils/adt/numeric.c:4336 #: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigint ist außerhalb des gültigen Bereichs" -#: utils/adt/int8.c:1403 +#: utils/adt/int8.c:1361 #, c-format msgid "OID out of range" msgstr "OID ist außerhalb des gültigen Bereichs" -#: utils/adt/json.c:271 utils/adt/jsonb.c:757 +#: utils/adt/json.c:293 utils/adt/jsonb.c:747 #, c-format msgid "key value must be scalar, not array, composite, or json" msgstr "Schlüsselwert muss skalar sein, nicht Array, zusammengesetzt oder json" -#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:1994 +#: utils/adt/json.c:1069 utils/adt/json.c:1079 utils/fmgr/funcapi.c:2061 #, c-format msgid "could not determine data type for argument %d" msgstr "konnte Datentyp von Argument %d nicht ermitteln" -#: utils/adt/json.c:926 utils/adt/jsonb.c:1728 +#: utils/adt/json.c:1102 utils/adt/jsonb.c:1811 #, c-format msgid "field name must not be null" msgstr "Feldname darf nicht NULL sein" -#: utils/adt/json.c:1010 utils/adt/jsonb.c:1178 +#: utils/adt/json.c:1141 utils/adt/json.c:1305 +#, fuzzy, c-format +#| msgid "Duplicate keys exist." +msgid "duplicate JSON key %s" +msgstr "Es existieren doppelte Schlüssel." + +#: utils/adt/json.c:1249 utils/adt/jsonb.c:1195 #, c-format msgid "argument list must have even number of elements" msgstr "Argumentliste muss gerade Anzahl Elemente haben" #. translator: %s is a SQL function name -#: utils/adt/json.c:1012 utils/adt/jsonb.c:1180 +#: utils/adt/json.c:1251 utils/adt/jsonb.c:1197 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "Die Argumente von %s müssen abwechselnd Schlüssel und Werte sein." -#: utils/adt/json.c:1028 +#: utils/adt/json.c:1289 #, c-format msgid "argument %d cannot be null" msgstr "Argument %d darf nicht NULL sein" -#: utils/adt/json.c:1029 +#: utils/adt/json.c:1290 #, c-format msgid "Object keys should be text." msgstr "Objektschlüssel sollten Text sein." -#: utils/adt/json.c:1135 utils/adt/jsonb.c:1310 +#: utils/adt/json.c:1444 utils/adt/jsonb.c:1372 #, c-format msgid "array must have two columns" msgstr "Array muss zwei Spalten haben" -#: utils/adt/json.c:1159 utils/adt/json.c:1243 utils/adt/jsonb.c:1334 -#: utils/adt/jsonb.c:1429 +#: utils/adt/json.c:1468 utils/adt/json.c:1551 utils/adt/jsonb.c:1396 +#: utils/adt/jsonb.c:1491 #, c-format msgid "null value not allowed for object key" msgstr "NULL-Werte sind nicht als Objektschlüssel erlaubt" -#: utils/adt/json.c:1232 utils/adt/jsonb.c:1418 +#: utils/adt/json.c:1540 utils/adt/jsonb.c:1480 #, c-format msgid "mismatched array dimensions" msgstr "Array-Dimensionen passen nicht" -#: utils/adt/jsonb.c:287 +#: utils/adt/json.c:1720 utils/adt/jsonb_util.c:1958 +#, c-format +msgid "duplicate JSON object key value" +msgstr "" + +#: utils/adt/jsonb.c:276 #, c-format msgid "string too long to represent as jsonb string" msgstr "Zeichenkette ist zu lang für jsonb" -#: utils/adt/jsonb.c:288 +#: utils/adt/jsonb.c:277 #, c-format msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "Aufgrund einer Einschränkung der Implementierung können jsonb-Zeichenketten nicht länger als %d Bytes sein." -#: utils/adt/jsonb.c:1193 +#: utils/adt/jsonb.c:1214 #, c-format msgid "argument %d: key must not be null" msgstr "Argument %d: Schlüssel darf nicht NULL sein" -#: utils/adt/jsonb.c:1781 +#: utils/adt/jsonb.c:1873 #, c-format msgid "object keys must be strings" msgstr "Objektschlüssel müssen Zeichenketten sein" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:2083 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "kann jsonb-Null-Wert nicht in Typ %s umwandeln" -#: utils/adt/jsonb.c:1945 +#: utils/adt/jsonb.c:2084 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "kann jsonb-Zeichenkette nicht in Typ %s umwandeln" -#: utils/adt/jsonb.c:1946 +#: utils/adt/jsonb.c:2085 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "kann jsonb numerischen Wert nicht in Typ %s umwandeln" -#: utils/adt/jsonb.c:1947 +#: utils/adt/jsonb.c:2086 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "kann jsonb-boolean nicht in Typ %s umwandeln" -#: utils/adt/jsonb.c:1948 +#: utils/adt/jsonb.c:2087 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "kann jsonb-Array nicht in Typ %s umwandeln" -#: utils/adt/jsonb.c:1949 +#: utils/adt/jsonb.c:2088 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "kann jsonb-Objekt nicht in Typ %s umwandeln" -#: utils/adt/jsonb.c:1950 +#: utils/adt/jsonb.c:2089 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "kann jsonb-Array oder -Objekt nicht in Typ %s umwandeln" -#: utils/adt/jsonb_util.c:751 +#: utils/adt/jsonb_util.c:758 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "Anzahl der jsonb-Objekte-Paare überschreitet erlaubtes Maximum (%zu)" -#: utils/adt/jsonb_util.c:792 +#: utils/adt/jsonb_util.c:799 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "Anzahl der jsonb-Arrayelemente überschreitet erlaubtes Maximum (%zu)" -#: utils/adt/jsonb_util.c:1666 utils/adt/jsonb_util.c:1686 +#: utils/adt/jsonb_util.c:1673 utils/adt/jsonb_util.c:1693 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %u bytes" msgstr "Gesamtgröße der jsonb-Array-Elemente überschreitet die maximale Größe von %u Bytes" -#: utils/adt/jsonb_util.c:1747 utils/adt/jsonb_util.c:1782 -#: utils/adt/jsonb_util.c:1802 +#: utils/adt/jsonb_util.c:1754 utils/adt/jsonb_util.c:1789 +#: utils/adt/jsonb_util.c:1809 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %u bytes" msgstr "Gesamtgröße der jsonb-Objektelemente überschreitet die maximale Größe von %u Bytes" -#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:152 -#, fuzzy, c-format -#| msgid "this build does not support compression" +#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 +#, c-format msgid "jsonb subscript does not support slices" -msgstr "diese Installation unterstützt keine Komprimierung" +msgstr "jsonb-Index unterstützt keine Slices" -#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:118 -#, fuzzy, c-format -#| msgid "log format \"%s\" is not supported" -msgid "subscript type is not supported" -msgstr "Logformat »%s« wird nicht unterstützt" +#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 +#, c-format +msgid "subscript type %s is not supported" +msgstr "Subscript-Typ %s wird nicht unterstützt" #: utils/adt/jsonbsubs.c:104 #, c-format -msgid "Jsonb subscript must be coerced only to one type, integer or text." -msgstr "" +msgid "jsonb subscript must be coercible to only one type, integer or text." +msgstr "jsonb-Index darf nur in einen Typ umwandelbar sein, integer oder text." -#: utils/adt/jsonbsubs.c:119 +#: utils/adt/jsonbsubs.c:118 #, c-format -msgid "Jsonb subscript must be coerced to either integer or text" -msgstr "" +msgid "jsonb subscript must be coercible to either integer or text." +msgstr "jsonb-Index muss in entweder integer oder text umwandelbar sein." -#: utils/adt/jsonbsubs.c:140 -#, fuzzy, c-format -#| msgid "array subscript must have type integer" +#: utils/adt/jsonbsubs.c:139 +#, c-format msgid "jsonb subscript must have text type" -msgstr "Arrayindex muss Typ integer haben" +msgstr "jsonb-Index muss Typ text haben" -#: utils/adt/jsonbsubs.c:208 -#, fuzzy, c-format -#| msgid "array subscript in assignment must not be null" +#: utils/adt/jsonbsubs.c:207 +#, c-format msgid "jsonb subscript in assignment must not be null" -msgstr "Arrayindex in Zuweisung darf nicht NULL sein" +msgstr "jsonb-Index in Zuweisung darf nicht NULL sein" -#: utils/adt/jsonfuncs.c:555 utils/adt/jsonfuncs.c:789 -#: utils/adt/jsonfuncs.c:2471 utils/adt/jsonfuncs.c:2911 -#: utils/adt/jsonfuncs.c:3700 utils/adt/jsonfuncs.c:4030 +#: utils/adt/jsonfuncs.c:555 utils/adt/jsonfuncs.c:791 +#: utils/adt/jsonfuncs.c:2360 utils/adt/jsonfuncs.c:2800 +#: utils/adt/jsonfuncs.c:3634 utils/adt/jsonfuncs.c:3967 #, c-format msgid "cannot call %s on a scalar" msgstr "%s kann nicht mit einem skalaren Wert aufgerufen werden" -#: utils/adt/jsonfuncs.c:560 utils/adt/jsonfuncs.c:776 -#: utils/adt/jsonfuncs.c:2913 utils/adt/jsonfuncs.c:3689 +#: utils/adt/jsonfuncs.c:560 utils/adt/jsonfuncs.c:778 +#: utils/adt/jsonfuncs.c:2802 utils/adt/jsonfuncs.c:3623 #, c-format msgid "cannot call %s on an array" msgstr "%s kann nicht mit einem Array aufgerufen werden" -#: utils/adt/jsonfuncs.c:685 +#: utils/adt/jsonfuncs.c:687 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "JSON-Daten, Zeile %d: %s%s%s" -#: utils/adt/jsonfuncs.c:1823 utils/adt/jsonfuncs.c:1858 +#: utils/adt/jsonfuncs.c:1825 utils/adt/jsonfuncs.c:1860 #, c-format msgid "cannot get array length of a scalar" msgstr "kann nicht die Arraylänge eines skalaren Wertes ermitteln" -#: utils/adt/jsonfuncs.c:1827 utils/adt/jsonfuncs.c:1846 +#: utils/adt/jsonfuncs.c:1829 utils/adt/jsonfuncs.c:1848 #, c-format msgid "cannot get array length of a non-array" msgstr "kann nicht die Arraylänge eines Nicht-Arrays ermitteln" -#: utils/adt/jsonfuncs.c:1923 +#: utils/adt/jsonfuncs.c:1922 #, c-format msgid "cannot call %s on a non-object" msgstr "%s kann nicht mit etwas aufgerufen werden, das kein Objekt ist" -#: utils/adt/jsonfuncs.c:2162 +#: utils/adt/jsonfuncs.c:2106 #, c-format msgid "cannot deconstruct an array as an object" msgstr "kann Array nicht in ein Objekt zerlegen" -#: utils/adt/jsonfuncs.c:2174 +#: utils/adt/jsonfuncs.c:2118 #, c-format msgid "cannot deconstruct a scalar" msgstr "kann skalaren Wert nicht zerlegen" -#: utils/adt/jsonfuncs.c:2220 +#: utils/adt/jsonfuncs.c:2161 #, c-format msgid "cannot extract elements from a scalar" msgstr "kann keine Elemente aus einem skalaren Wert auswählen" -#: utils/adt/jsonfuncs.c:2224 +#: utils/adt/jsonfuncs.c:2165 #, c-format msgid "cannot extract elements from an object" msgstr "kann keine Elemente aus einem Objekt auswählen" -#: utils/adt/jsonfuncs.c:2458 utils/adt/jsonfuncs.c:3915 +#: utils/adt/jsonfuncs.c:2347 utils/adt/jsonfuncs.c:3852 #, c-format msgid "cannot call %s on a non-array" msgstr "%s kann nicht mit etwas aufgerufen werden, das kein Array ist" -#: utils/adt/jsonfuncs.c:2528 utils/adt/jsonfuncs.c:2533 -#: utils/adt/jsonfuncs.c:2550 utils/adt/jsonfuncs.c:2556 +#: utils/adt/jsonfuncs.c:2417 utils/adt/jsonfuncs.c:2422 +#: utils/adt/jsonfuncs.c:2439 utils/adt/jsonfuncs.c:2445 #, c-format msgid "expected JSON array" msgstr "JSON-Array wurde erwartet" -#: utils/adt/jsonfuncs.c:2529 +#: utils/adt/jsonfuncs.c:2418 #, c-format msgid "See the value of key \"%s\"." msgstr "Prüfen Sie den Wert des Schlüssels »%s«." -#: utils/adt/jsonfuncs.c:2551 +#: utils/adt/jsonfuncs.c:2440 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Prüfen Sie das Arrayelement %s des Schlüssels »%s«." -#: utils/adt/jsonfuncs.c:2557 +#: utils/adt/jsonfuncs.c:2446 #, c-format msgid "See the array element %s." msgstr "Prüfen Sie das Arrayelement %s." -#: utils/adt/jsonfuncs.c:2592 +#: utils/adt/jsonfuncs.c:2481 #, c-format msgid "malformed JSON array" msgstr "fehlerhaftes JSON-Array" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3419 +#: utils/adt/jsonfuncs.c:3353 #, c-format msgid "first argument of %s must be a row type" msgstr "erstes Argument von %s muss ein Zeilentyp sein" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3443 +#: utils/adt/jsonfuncs.c:3377 #, c-format msgid "could not determine row type for result of %s" msgstr "konnte Zeilentyp für Ergebnis von %s nicht ermitteln" -#: utils/adt/jsonfuncs.c:3445 +#: utils/adt/jsonfuncs.c:3379 #, c-format msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." msgstr "Geben Sie ein »record«-Argument, das nicht NULL ist, an oder rufen Sie die Funktion in der FROM-Klausel mit einer Spaltendefinitionsliste auf." -#: utils/adt/jsonfuncs.c:3932 utils/adt/jsonfuncs.c:4012 +#: utils/adt/jsonfuncs.c:3741 utils/fmgr/funcapi.c:94 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "Materialisierungsmodus wird benötigt, ist aber in diesem Zusammenhang nicht erlaubt" + +#: utils/adt/jsonfuncs.c:3869 utils/adt/jsonfuncs.c:3949 #, c-format msgid "argument of %s must be an array of objects" msgstr "Argument von %s muss ein Array von Objekten sein" -#: utils/adt/jsonfuncs.c:3965 +#: utils/adt/jsonfuncs.c:3902 #, c-format msgid "cannot call %s on an object" msgstr "%s kann nicht mit einem Objekt aufgerufen werden" -#: utils/adt/jsonfuncs.c:4373 utils/adt/jsonfuncs.c:4432 -#: utils/adt/jsonfuncs.c:4512 +#: utils/adt/jsonfuncs.c:4309 utils/adt/jsonfuncs.c:4368 +#: utils/adt/jsonfuncs.c:4448 #, c-format msgid "cannot delete from scalar" msgstr "kann nicht aus skalarem Wert löschen" -#: utils/adt/jsonfuncs.c:4517 +#: utils/adt/jsonfuncs.c:4453 #, c-format msgid "cannot delete from object using integer index" msgstr "aus einem Objekt kann nicht per numerischem Index gelöscht werden" -#: utils/adt/jsonfuncs.c:4585 utils/adt/jsonfuncs.c:4746 +#: utils/adt/jsonfuncs.c:4521 utils/adt/jsonfuncs.c:4682 #, c-format msgid "cannot set path in scalar" msgstr "in einem skalaren Wert kann kein Pfad gesetzt werden" -#: utils/adt/jsonfuncs.c:4627 utils/adt/jsonfuncs.c:4669 +#: utils/adt/jsonfuncs.c:4563 utils/adt/jsonfuncs.c:4605 #, c-format msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" msgstr "null_value_treatment muss »delete_key«, »return_target«, »use_json_null« oder »raise_exception« sein" -#: utils/adt/jsonfuncs.c:4640 +#: utils/adt/jsonfuncs.c:4576 #, c-format msgid "JSON value must not be null" msgstr "JSON-Wert darf nicht NULL sein" -#: utils/adt/jsonfuncs.c:4641 +#: utils/adt/jsonfuncs.c:4577 #, c-format msgid "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "Ausnahme wurde ausgelöst, weil null_value_treatment »raise_exception« ist." -#: utils/adt/jsonfuncs.c:4642 +#: utils/adt/jsonfuncs.c:4578 #, c-format msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." msgstr "Um dies zu vermeiden, ändern Sie das Argument null_value_treatment oder sorgen Sie dafür, dass kein SQL NULL übergeben wird." -#: utils/adt/jsonfuncs.c:4697 +#: utils/adt/jsonfuncs.c:4633 #, c-format msgid "cannot delete path in scalar" msgstr "in einem skalaren Wert kann kein Pfad gelöscht werden" -#: utils/adt/jsonfuncs.c:4913 +#: utils/adt/jsonfuncs.c:4849 #, c-format msgid "path element at position %d is null" msgstr "Pfadelement auf Position %d ist NULL" -#: utils/adt/jsonfuncs.c:4932 utils/adt/jsonfuncs.c:4963 -#: utils/adt/jsonfuncs.c:5030 +#: utils/adt/jsonfuncs.c:4868 utils/adt/jsonfuncs.c:4899 +#: utils/adt/jsonfuncs.c:4966 #, c-format msgid "cannot replace existing key" msgstr "existierender Schlüssel kann nicht ersetzt werden" -#: utils/adt/jsonfuncs.c:4933 utils/adt/jsonfuncs.c:4964 +#: utils/adt/jsonfuncs.c:4869 utils/adt/jsonfuncs.c:4900 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." -msgstr "" +msgstr "Der Pfad nimmt an, dass der Schlüssel ein zusammengesetztes Objekt ist, aber er ist ein skalarer Wert." -#: utils/adt/jsonfuncs.c:5031 +#: utils/adt/jsonfuncs.c:4967 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Verwenden Sie die Funktion jsonb_set, um den Schlüsselwert zu ersetzen." -#: utils/adt/jsonfuncs.c:5135 +#: utils/adt/jsonfuncs.c:5071 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "Pfadelement auf Position %d ist keine ganze Zahl: »%s«" -#: utils/adt/jsonfuncs.c:5152 -#, fuzzy, c-format -#| msgid "path element at position %d is not an integer: \"%s\"" +#: utils/adt/jsonfuncs.c:5088 +#, c-format msgid "path element at position %d is out of range: %d" -msgstr "Pfadelement auf Position %d ist keine ganze Zahl: »%s«" +msgstr "Pfadelement auf Position %d ist außerhalb des gültigen Bereichs: %d" -#: utils/adt/jsonfuncs.c:5304 +#: utils/adt/jsonfuncs.c:5240 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "falscher Flag-Typ, nur Arrays und skalare Werte sind erlaubt" -#: utils/adt/jsonfuncs.c:5311 +#: utils/adt/jsonfuncs.c:5247 #, c-format msgid "flag array element is not a string" msgstr "Flag-Array-Element ist keine Zeichenkette" -#: utils/adt/jsonfuncs.c:5312 utils/adt/jsonfuncs.c:5334 +#: utils/adt/jsonfuncs.c:5248 utils/adt/jsonfuncs.c:5270 #, c-format msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." msgstr "Mögliche Werte sind: »string«, »numeric«, »boolean«, »key« und »all«." -#: utils/adt/jsonfuncs.c:5332 +#: utils/adt/jsonfuncs.c:5268 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "falsche Flag im Flag-Array: »%s«" -#: utils/adt/jsonpath.c:362 +#: utils/adt/jsonpath.c:364 #, c-format msgid "@ is not allowed in root expressions" msgstr "@ ist nicht erlaubt in Wurzelausdrücken" -#: utils/adt/jsonpath.c:368 +#: utils/adt/jsonpath.c:370 #, c-format msgid "LAST is allowed only in array subscripts" msgstr "LAST ist nur in Arrayindizes erlaubt" -#: utils/adt/jsonpath_exec.c:360 +#: utils/adt/jsonpath_exec.c:434 #, c-format msgid "single boolean result is expected" msgstr "ein einzelnes Ergebnis mit Typ boolean wird erwartet" -#: utils/adt/jsonpath_exec.c:556 -#, c-format -msgid "\"vars\" argument is not an object" -msgstr "Argument »vars« ist kein Objekt" - -#: utils/adt/jsonpath_exec.c:557 -#, c-format -msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." -msgstr "JSON-Path-Parameter sollten als Schüssel-Wert-Paare im »vars«-Objekt kodiert werden." - -#: utils/adt/jsonpath_exec.c:674 +#: utils/adt/jsonpath_exec.c:746 #, c-format msgid "JSON object does not contain key \"%s\"" msgstr "JSON-Objekt enthält Schlüssel »%s« nicht" -#: utils/adt/jsonpath_exec.c:686 +#: utils/adt/jsonpath_exec.c:758 #, c-format msgid "jsonpath member accessor can only be applied to an object" msgstr "JSON-Path-Member-Zugriff kann nur auf ein Objekt angewendet werden" -#: utils/adt/jsonpath_exec.c:715 +#: utils/adt/jsonpath_exec.c:787 #, c-format msgid "jsonpath wildcard array accessor can only be applied to an array" msgstr "JSON-Path-Wildcard-Array-Indizierung kann nur auf ein Array angewendet werden" -#: utils/adt/jsonpath_exec.c:763 +#: utils/adt/jsonpath_exec.c:835 #, c-format msgid "jsonpath array subscript is out of bounds" msgstr "JSON-Path-Arrayindex ist außerhalb des gültigen Bereichs" -#: utils/adt/jsonpath_exec.c:820 +#: utils/adt/jsonpath_exec.c:892 #, c-format msgid "jsonpath array accessor can only be applied to an array" msgstr "JSON-Path-Array-Indizierung kann nur auf ein Array angewendet werden" -#: utils/adt/jsonpath_exec.c:872 +#: utils/adt/jsonpath_exec.c:944 #, c-format msgid "jsonpath wildcard member accessor can only be applied to an object" msgstr "JSON-Path-Wildcard-Member-Zugriff kann nur auf ein Objekt angwendet werden" -#: utils/adt/jsonpath_exec.c:1002 +#: utils/adt/jsonpath_exec.c:1074 #, c-format msgid "jsonpath item method .%s() can only be applied to an array" msgstr "Jsonpath-Item-Methode .%s() kann nur auf ein Array angewendet werden" -#: utils/adt/jsonpath_exec.c:1055 +#: utils/adt/jsonpath_exec.c:1127 #, c-format msgid "numeric argument of jsonpath item method .%s() is out of range for type double precision" msgstr "numerisches Argument der JSON-Path-Item-Methode .%s() ist außerhalb des gültigen Bereichs für Typ double precision" -#: utils/adt/jsonpath_exec.c:1076 +#: utils/adt/jsonpath_exec.c:1148 #, c-format msgid "string argument of jsonpath item method .%s() is not a valid representation of a double precision number" msgstr "Zeichenkettenargument der JSON-Path-Item-Methode .%s() ist nicht gültig für Typ double precision" -#: utils/adt/jsonpath_exec.c:1089 +#: utils/adt/jsonpath_exec.c:1161 #, c-format msgid "jsonpath item method .%s() can only be applied to a string or numeric value" msgstr "JSON-Path-Item-Methode .%s() kann nur auf eine Zeichenkette oder einen numerischen Wert angewendet werden" -#: utils/adt/jsonpath_exec.c:1579 +#: utils/adt/jsonpath_exec.c:1651 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "linker Operand des JSON-Path-Operators %s ist kein einzelner numerischer Wert" -#: utils/adt/jsonpath_exec.c:1586 +#: utils/adt/jsonpath_exec.c:1658 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "rechter Operand des JSON-Path-Operators %s ist kein einzelner numerischer Wert" -#: utils/adt/jsonpath_exec.c:1654 +#: utils/adt/jsonpath_exec.c:1726 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "Operand des unären JSON-Path-Operators %s ist kein numerischer Wert" -#: utils/adt/jsonpath_exec.c:1752 +#: utils/adt/jsonpath_exec.c:1824 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "JSON-Path-Item-Methode .%s() kann nur auf einen numerischen Wert angewendet werden" -#: utils/adt/jsonpath_exec.c:1792 +#: utils/adt/jsonpath_exec.c:1864 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "JSON-Path-Item-Methode .%s() kann nur auf eine Zeichenkette angewendet werden" -#: utils/adt/jsonpath_exec.c:1886 +#: utils/adt/jsonpath_exec.c:1958 #, c-format msgid "datetime format is not recognized: \"%s\"" msgstr "Datum-/Zeitformat nicht erkannt: »%s«" -#: utils/adt/jsonpath_exec.c:1888 +#: utils/adt/jsonpath_exec.c:1960 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "Verwenden Sie das Template-Argument für .datetime(), um das Eingabeformat anzugeben." -#: utils/adt/jsonpath_exec.c:1956 +#: utils/adt/jsonpath_exec.c:2028 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "JSON-Path-Item-Methode .%s() kann nur auf ein Objekt angewendet werden" -#: utils/adt/jsonpath_exec.c:2138 +#: utils/adt/jsonpath_exec.c:2195 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "konnte JSON-Path-Variable »%s« nicht finden" -#: utils/adt/jsonpath_exec.c:2402 +#: utils/adt/jsonpath_exec.c:2216 +#, c-format +msgid "\"vars\" argument is not an object" +msgstr "Argument »vars« ist kein Objekt" + +#: utils/adt/jsonpath_exec.c:2217 +#, c-format +msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." +msgstr "JSON-Path-Parameter sollten als Schüssel-Wert-Paare im »vars«-Objekt kodiert werden." + +#: utils/adt/jsonpath_exec.c:2495 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "JSON-Path-Arrayindex ist kein einzelner numerischer Wert" -#: utils/adt/jsonpath_exec.c:2414 +#: utils/adt/jsonpath_exec.c:2507 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "JSON-Path-Arrayindex außerhalb des gültigen Bereichs für ganze Zahlen" -#: utils/adt/jsonpath_exec.c:2591 +#: utils/adt/jsonpath_exec.c:2691 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "Wert kann nicht von %s nach %s konvertiert werden ohne Verwendung von Zeitzonen" -#: utils/adt/jsonpath_exec.c:2593 +#: utils/adt/jsonpath_exec.c:2693 #, c-format msgid "Use *_tz() function for time zone support." msgstr "Verwenden Sie die *_tz()-Funktion für Zeitzonenunterstützung." +#: utils/adt/jsonpath_exec.c:2974 +#, c-format +msgid "JSON path expression in JSON_QUERY should return singleton item without wrapper" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2976 +#, c-format +msgid "use WITH WRAPPER clause to wrap SQL/JSON item sequence into array" +msgstr "" + +#: utils/adt/jsonpath_exec.c:3024 utils/adt/jsonpath_exec.c:3044 +#, c-format +msgid "JSON path expression in JSON_VALUE should return singleton scalar item" +msgstr "" + +#: utils/adt/jsonpath_exec.c:3137 +#, c-format +msgid "only bool, numeric, and text types could be casted to supported jsonpath types." +msgstr "" + #: utils/adt/levenshtein.c:133 #, c-format msgid "levenshtein argument exceeds maximum length of %d characters" @@ -23860,7 +24957,7 @@ msgstr "Levenshtein-Argument überschreitet die maximale Länge von %d Zeichen" msgid "nondeterministic collations are not supported for LIKE" msgstr "nichtdeterministische Sortierfolgen werden von LIKE nicht unterstützt" -#: utils/adt/like.c:193 utils/adt/like_support.c:1002 +#: utils/adt/like.c:189 utils/adt/like_support.c:1023 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "konnte die für ILIKE zu verwendende Sortierfolge nicht bestimmen" @@ -23875,27 +24972,27 @@ msgstr "nichtdeterministische Sortierfolgen werden von ILIKE nicht unterstützt" msgid "LIKE pattern must not end with escape character" msgstr "LIKE-Muster darf nicht mit Escape-Zeichen enden" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:700 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:786 #, c-format msgid "invalid escape string" msgstr "ungültige ESCAPE-Zeichenkette" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:701 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:787 #, c-format msgid "Escape string must be empty or one character." msgstr "ESCAPE-Zeichenkette muss null oder ein Zeichen lang sein." -#: utils/adt/like_support.c:987 +#: utils/adt/like_support.c:1013 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "Mustersuche ohne Rücksicht auf Groß-/Kleinschreibung wird für Typ bytea nicht unterstützt" -#: utils/adt/like_support.c:1089 +#: utils/adt/like_support.c:1114 #, c-format msgid "regular-expression matching not supported on type bytea" msgstr "Mustersuche mit regulären Ausdrücken wird für Typ bytea nicht unterstützt" -#: utils/adt/mac.c:102 +#: utils/adt/mac.c:101 #, c-format msgid "invalid octet value in \"macaddr\" value: \"%s\"" msgstr "ungültiger Oktettwert in »macaddr«-Wert: »%s«" @@ -23910,391 +25007,325 @@ msgstr "macaddr8-Daten außerhalb des gültigen Bereichs für Umwandlung in maca msgid "Only addresses that have FF and FE as values in the 4th and 5th bytes from the left, for example xx:xx:xx:ff:fe:xx:xx:xx, are eligible to be converted from macaddr8 to macaddr." msgstr "Nur Adressen, die FF und FE als Werte im 4. und 5. Byte von links haben, zum Beispiel xx:xx:xx:ff:fe:xx:xx:xx, kommen für eine Umwandlung von macaddr8 nach macaddr in Frage." -#: utils/adt/mcxtfuncs.c:204 -#, fuzzy, c-format -#| msgid "must be superuser to alter a type" -msgid "must be a superuser to log memory contexts" -msgstr "nur Superuser können Typen ändern" +#: utils/adt/mcxtfuncs.c:182 +#, c-format +msgid "PID %d is not a PostgreSQL server process" +msgstr "PID %d ist kein PostgreSQL-Serverprozess" -#: utils/adt/misc.c:243 +#: utils/adt/misc.c:216 #, c-format msgid "global tablespace never has databases" msgstr "globaler Tablespace hat niemals Datenbanken" -#: utils/adt/misc.c:265 +#: utils/adt/misc.c:238 #, c-format msgid "%u is not a tablespace OID" msgstr "%u ist keine Tablespace-OID" -#: utils/adt/misc.c:455 +#: utils/adt/misc.c:457 msgid "unreserved" msgstr "unreserviert" -#: utils/adt/misc.c:459 +#: utils/adt/misc.c:461 msgid "unreserved (cannot be function or type name)" msgstr "unreserviert (kann nicht Funktions- oder Typname sein)" -#: utils/adt/misc.c:463 +#: utils/adt/misc.c:465 msgid "reserved (can be function or type name)" msgstr "reserviert (kann Funktions- oder Typname sein)" -#: utils/adt/misc.c:467 +#: utils/adt/misc.c:469 msgid "reserved" msgstr "reserviert" -#: utils/adt/misc.c:478 +#: utils/adt/misc.c:480 msgid "can be bare label" -msgstr "" +msgstr "kann alleinstehendes Label sein" -#: utils/adt/misc.c:483 +#: utils/adt/misc.c:485 msgid "requires AS" -msgstr "" +msgstr "benötigt AS" -#: utils/adt/misc.c:730 utils/adt/misc.c:744 utils/adt/misc.c:783 -#: utils/adt/misc.c:789 utils/adt/misc.c:795 utils/adt/misc.c:818 +#: utils/adt/misc.c:732 utils/adt/misc.c:746 utils/adt/misc.c:785 +#: utils/adt/misc.c:791 utils/adt/misc.c:797 utils/adt/misc.c:820 #, c-format msgid "string is not a valid identifier: \"%s\"" msgstr "Zeichenkette ist kein gültiger Bezeichner: »%s«" -#: utils/adt/misc.c:732 +#: utils/adt/misc.c:734 #, c-format msgid "String has unclosed double quotes." msgstr "Zeichenkette hat nicht geschlossene doppelte Anführungszeichen." -#: utils/adt/misc.c:746 +#: utils/adt/misc.c:748 #, c-format msgid "Quoted identifier must not be empty." msgstr "Bezeichner in Anführungszeichen darf nicht leer sein." -#: utils/adt/misc.c:785 +#: utils/adt/misc.c:787 #, c-format msgid "No valid identifier before \".\"." msgstr "Kein gültiger Bezeichner vor ».«." -#: utils/adt/misc.c:791 +#: utils/adt/misc.c:793 #, c-format msgid "No valid identifier after \".\"." msgstr "Kein gültiger Bezeichner nach ».«." -#: utils/adt/misc.c:849 +#: utils/adt/misc.c:853 #, c-format msgid "log format \"%s\" is not supported" msgstr "Logformat »%s« wird nicht unterstützt" -#: utils/adt/misc.c:850 +#: utils/adt/misc.c:854 #, c-format -msgid "The supported log formats are \"stderr\" and \"csvlog\"." -msgstr "Die unterstützten Logformate sind »stderr« und »csvlog«." +msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." +msgstr "Die unterstützten Logformate sind »stderr«, »csvlog« und »jsonlog«." -#: utils/adt/multirangetypes.c:147 utils/adt/multirangetypes.c:160 -#: utils/adt/multirangetypes.c:189 utils/adt/multirangetypes.c:259 -#: utils/adt/multirangetypes.c:283 -#, fuzzy, c-format -#| msgid "malformed range literal: \"%s\"" +#: utils/adt/multirangetypes.c:149 utils/adt/multirangetypes.c:162 +#: utils/adt/multirangetypes.c:191 utils/adt/multirangetypes.c:261 +#: utils/adt/multirangetypes.c:285 +#, c-format msgid "malformed multirange literal: \"%s\"" -msgstr "fehlerhafte Bereichskonstante: »%s«" +msgstr "fehlerhafte Multirange-Konstante: »%s«" -#: utils/adt/multirangetypes.c:149 -#, fuzzy, c-format -#| msgid "Missing left parenthesis." +#: utils/adt/multirangetypes.c:151 +#, c-format msgid "Missing left brace." -msgstr "Linke Klammer fehlt." +msgstr "Linke geschweifte Klammer fehlt." -#: utils/adt/multirangetypes.c:191 -#, fuzzy, c-format -#| msgid "unexpected array start" +#: utils/adt/multirangetypes.c:193 +#, c-format msgid "Expected range start." -msgstr "unerwarteter Array-Start" +msgstr "Start einer Range erwartet." -#: utils/adt/multirangetypes.c:261 -#, fuzzy, c-format -#| msgid "unexpected end of line" +#: utils/adt/multirangetypes.c:263 +#, c-format msgid "Expected comma or end of multirange." -msgstr "unerwartetes Ende der Zeile" - -#: utils/adt/multirangetypes.c:285 -#, fuzzy, c-format -#| msgid "Junk after closing right brace." -msgid "Junk after right brace." -msgstr "Müll nach schließender rechter geschweifter Klammer." - -#: utils/adt/multirangetypes.c:971 -#, fuzzy, c-format -#| msgid "thresholds must be one-dimensional array" -msgid "multiranges cannot be constructed from multi-dimensional arrays" -msgstr "Parameter »thresholds« muss ein eindimensionales Array sein" +msgstr "Komma oder Ende der Multirange erwartet." -#: utils/adt/multirangetypes.c:977 utils/adt/multirangetypes.c:1042 -#, fuzzy, c-format -#| msgid "type %s is not a composite type" -msgid "type %u does not match constructor type" -msgstr "Typ %s ist kein zusammengesetzter Typ" - -#: utils/adt/multirangetypes.c:999 +#: utils/adt/multirangetypes.c:976 #, c-format -msgid "multirange values cannot contain NULL members" -msgstr "" +msgid "multiranges cannot be constructed from multidimensional arrays" +msgstr "Multiranges können nicht aus mehrdimensionalen Arrays konstruiert werden" -#: utils/adt/multirangetypes.c:1349 -#, fuzzy, c-format -#| msgid "%s must be called inside a transaction" -msgid "range_agg must be called with a range" -msgstr "%s muss in einer Transaktion aufgerufen werden" - -#: utils/adt/multirangetypes.c:1420 +#: utils/adt/multirangetypes.c:1002 #, c-format -msgid "range_intersect_agg must be called with a multirange" -msgstr "" +msgid "multirange values cannot contain null members" +msgstr "Multirange-Werte können keine Mitglieder, die NULL sind, haben" -#: utils/adt/network.c:111 +#: utils/adt/network.c:110 #, c-format msgid "invalid cidr value: \"%s\"" msgstr "ungültiger cidr-Wert: »%s«" -#: utils/adt/network.c:112 utils/adt/network.c:242 +#: utils/adt/network.c:111 utils/adt/network.c:241 #, c-format msgid "Value has bits set to right of mask." msgstr "Wert hat gesetzte Bits rechts von der Maske." -#: utils/adt/network.c:153 utils/adt/network.c:1199 utils/adt/network.c:1224 -#: utils/adt/network.c:1249 +#: utils/adt/network.c:152 utils/adt/network.c:1184 utils/adt/network.c:1209 +#: utils/adt/network.c:1234 #, c-format msgid "could not format inet value: %m" msgstr "konnte inet-Wert nicht formatieren: %m" #. translator: %s is inet or cidr -#: utils/adt/network.c:210 +#: utils/adt/network.c:209 #, c-format msgid "invalid address family in external \"%s\" value" msgstr "ungültige Adressfamilie in externem »%s«-Wert" #. translator: %s is inet or cidr -#: utils/adt/network.c:217 +#: utils/adt/network.c:216 #, c-format msgid "invalid bits in external \"%s\" value" msgstr "ungültige Bits in externem »%s«-Wert" #. translator: %s is inet or cidr -#: utils/adt/network.c:226 +#: utils/adt/network.c:225 #, c-format msgid "invalid length in external \"%s\" value" msgstr "ungültige Länge in externem »%s«-Wert" -#: utils/adt/network.c:241 +#: utils/adt/network.c:240 #, c-format msgid "invalid external \"cidr\" value" msgstr "ungültiger externer »cidr«-Wert" -#: utils/adt/network.c:337 utils/adt/network.c:360 +#: utils/adt/network.c:336 utils/adt/network.c:359 #, c-format msgid "invalid mask length: %d" msgstr "ungültige Maskenlänge: %d" -#: utils/adt/network.c:1267 +#: utils/adt/network.c:1252 #, c-format msgid "could not format cidr value: %m" msgstr "konnte cidr-Wert nicht formatieren: %m" -#: utils/adt/network.c:1500 +#: utils/adt/network.c:1485 #, c-format msgid "cannot merge addresses from different families" msgstr "Adressen verschiedener Familien können nicht zusammengeführt werden" -#: utils/adt/network.c:1916 +#: utils/adt/network.c:1901 #, c-format msgid "cannot AND inet values of different sizes" msgstr "binäres »Und« nicht mit »inet«-Werten unterschiedlicher Größe möglich" -#: utils/adt/network.c:1948 +#: utils/adt/network.c:1933 #, c-format msgid "cannot OR inet values of different sizes" msgstr "binäres »Oder« nicht mit »inet«-Werten unterschiedlicher Größe möglich" -#: utils/adt/network.c:2009 utils/adt/network.c:2085 +#: utils/adt/network.c:1994 utils/adt/network.c:2070 #, c-format msgid "result is out of range" msgstr "Ergebnis ist außerhalb des gültigen Bereichs" -#: utils/adt/network.c:2050 +#: utils/adt/network.c:2035 #, c-format msgid "cannot subtract inet values of different sizes" msgstr "Subtraktion von »inet«-Werten unterschiedlicher Größe nicht möglich" -#: utils/adt/numeric.c:975 +#: utils/adt/numeric.c:1027 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "ungültiges Vorzeichen in externem »numeric«-Wert" -#: utils/adt/numeric.c:981 +#: utils/adt/numeric.c:1033 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "ungültige Skala in externem »numeric«-Wert" -#: utils/adt/numeric.c:990 +#: utils/adt/numeric.c:1042 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "ungültige Ziffer in externem »numeric«-Wert" -#: utils/adt/numeric.c:1203 utils/adt/numeric.c:1217 +#: utils/adt/numeric.c:1257 utils/adt/numeric.c:1271 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "Präzision von NUMERIC (%d) muss zwischen 1 und %d liegen" -#: utils/adt/numeric.c:1208 -#, c-format -msgid "NUMERIC scale %d must be between 0 and precision %d" +#: utils/adt/numeric.c:1262 +#, fuzzy, c-format +#| msgid "NUMERIC scale %d must be between 0 and precision %d" +msgid "NUMERIC scale %d must be between %d and %d" msgstr "Skala von NUMERIC (%d) muss zwischen 0 und %d liegen" -#: utils/adt/numeric.c:1226 +#: utils/adt/numeric.c:1280 #, c-format msgid "invalid NUMERIC type modifier" msgstr "ungültiker Modifikator für Typ NUMERIC" -#: utils/adt/numeric.c:1584 +#: utils/adt/numeric.c:1638 #, c-format msgid "start value cannot be NaN" msgstr "Startwert kann nicht NaN sein" -#: utils/adt/numeric.c:1588 -#, fuzzy, c-format -#| msgid "start value cannot be NaN" +#: utils/adt/numeric.c:1642 +#, c-format msgid "start value cannot be infinity" -msgstr "Startwert kann nicht NaN sein" +msgstr "Startwert kann nicht unendlich sein" -#: utils/adt/numeric.c:1595 +#: utils/adt/numeric.c:1649 #, c-format msgid "stop value cannot be NaN" msgstr "Stoppwert kann nicht NaN sein" -#: utils/adt/numeric.c:1599 -#, fuzzy, c-format -#| msgid "stop value cannot be NaN" +#: utils/adt/numeric.c:1653 +#, c-format msgid "stop value cannot be infinity" -msgstr "Stoppwert kann nicht NaN sein" +msgstr "Stoppwert kann nicht unendlich sein" -#: utils/adt/numeric.c:1612 +#: utils/adt/numeric.c:1666 #, c-format msgid "step size cannot be NaN" msgstr "Schrittgröße kann nicht NaN sein" -#: utils/adt/numeric.c:1616 -#, fuzzy, c-format -#| msgid "step size cannot be NaN" +#: utils/adt/numeric.c:1670 +#, c-format msgid "step size cannot be infinity" -msgstr "Schrittgröße kann nicht NaN sein" +msgstr "Schrittgröße kann nicht unendlich sein" -#: utils/adt/numeric.c:3490 -#, fuzzy, c-format -#| msgid "zero raised to a negative power is undefined" +#: utils/adt/numeric.c:3551 +#, c-format msgid "factorial of a negative number is undefined" -msgstr "null hoch eine negative Zahl ist undefiniert" +msgstr "Fakultät einer negativen Zahl ist undefiniert" -#: utils/adt/numeric.c:3500 utils/adt/numeric.c:6924 utils/adt/numeric.c:7408 -#: utils/adt/numeric.c:9783 utils/adt/numeric.c:10221 utils/adt/numeric.c:10335 -#: utils/adt/numeric.c:10408 +#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6917 utils/adt/numeric.c:7432 +#: utils/adt/numeric.c:9956 utils/adt/numeric.c:10435 utils/adt/numeric.c:10561 +#: utils/adt/numeric.c:10634 #, c-format msgid "value overflows numeric format" msgstr "Wert verursacht Überlauf im »numeric«-Format" -#: utils/adt/numeric.c:4185 +#: utils/adt/numeric.c:4243 utils/adt/numeric.c:4323 utils/adt/numeric.c:4364 +#: utils/adt/numeric.c:4558 #, c-format -msgid "cannot convert NaN to integer" -msgstr "kann NaN nicht in integer umwandeln" - -#: utils/adt/numeric.c:4189 -#, fuzzy, c-format -#| msgid "cannot convert infinity to numeric" -msgid "cannot convert infinity to integer" -msgstr "kann Unendlich nicht in numeric umwandeln" +msgid "cannot convert NaN to %s" +msgstr "kann NaN nicht in %s umwandeln" -#: utils/adt/numeric.c:4263 +#: utils/adt/numeric.c:4247 utils/adt/numeric.c:4327 utils/adt/numeric.c:4368 +#: utils/adt/numeric.c:4562 #, c-format -msgid "cannot convert NaN to bigint" -msgstr "kann NaN nicht in bigint umwandeln" +msgid "cannot convert infinity to %s" +msgstr "kann Unendlich nicht in %s umwandeln" -#: utils/adt/numeric.c:4267 -#, fuzzy, c-format -#| msgid "cannot convert infinity to numeric" -msgid "cannot convert infinity to bigint" -msgstr "kann Unendlich nicht in numeric umwandeln" - -#: utils/adt/numeric.c:4304 +#: utils/adt/numeric.c:4571 #, c-format -msgid "cannot convert NaN to smallint" -msgstr "kann NaN nicht in smallint umwandeln" - -#: utils/adt/numeric.c:4308 -#, fuzzy, c-format -#| msgid "cannot convert infinity to numeric" -msgid "cannot convert infinity to smallint" -msgstr "kann Unendlich nicht in numeric umwandeln" - -#: utils/adt/numeric.c:4499 -#, fuzzy, c-format -#| msgid "cannot convert NaN to bigint" -msgid "cannot convert NaN to pg_lsn" -msgstr "kann NaN nicht in bigint umwandeln" - -#: utils/adt/numeric.c:4503 -#, fuzzy, c-format -#| msgid "cannot convert infinity to numeric" -msgid "cannot convert infinity to pg_lsn" -msgstr "kann Unendlich nicht in numeric umwandeln" - -#: utils/adt/numeric.c:4512 -#, fuzzy, c-format -#| msgid "bigint out of range" msgid "pg_lsn out of range" -msgstr "bigint ist außerhalb des gültigen Bereichs" +msgstr "pg_lsn ist außerhalb des gültigen Bereichs" -#: utils/adt/numeric.c:7492 utils/adt/numeric.c:7539 +#: utils/adt/numeric.c:7519 utils/adt/numeric.c:7565 #, c-format msgid "numeric field overflow" msgstr "Feldüberlauf bei Typ »numeric«" -#: utils/adt/numeric.c:7493 +#: utils/adt/numeric.c:7520 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "Ein Feld mit Präzision %d, Skala %d muss beim Runden einen Betrag von weniger als %s%d ergeben." -#: utils/adt/numeric.c:7540 -#, fuzzy, c-format -#| msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." -msgid "A field with precision %d, scale %d cannot hold an infinite value." -msgstr "Ein Feld mit Präzision %d, Skala %d muss beim Runden einen Betrag von weniger als %s%d ergeben." - -#: utils/adt/numutils.c:154 +#: utils/adt/numeric.c:7566 #, c-format -msgid "value \"%s\" is out of range for 8-bit integer" -msgstr "Wert »%s« ist außerhalb des gültigen Bereichs für 8-Bit-Ganzzahl" +msgid "A field with precision %d, scale %d cannot hold an infinite value." +msgstr "Ein Feld mit Präzision %d, Skala %d kann keinen unendlichen Wert enthalten." #: utils/adt/oid.c:290 #, c-format msgid "invalid oidvector data" msgstr "ungültige oidvector-Daten" -#: utils/adt/oracle_compat.c:970 +#: utils/adt/oracle_compat.c:969 #, c-format msgid "requested character too large" msgstr "verlangtes Zeichen zu groß" -#: utils/adt/oracle_compat.c:1020 utils/adt/oracle_compat.c:1082 +#: utils/adt/oracle_compat.c:1013 +#, fuzzy, c-format +#| msgid "COST must be positive" +msgid "character number must be positive" +msgstr "COST muss positiv sein" + +#: utils/adt/oracle_compat.c:1017 #, c-format -msgid "requested character too large for encoding: %d" -msgstr "gewünschtes Zeichen ist zu groß für die Kodierung: %d" +msgid "null character not permitted" +msgstr "Null-Zeichen ist nicht erlaubt" -#: utils/adt/oracle_compat.c:1061 +#: utils/adt/oracle_compat.c:1035 utils/adt/oracle_compat.c:1088 #, c-format -msgid "requested character not valid for encoding: %d" -msgstr "gewünschtes Zeichen ist nicht gültig für die Kodierung: %d" +msgid "requested character too large for encoding: %u" +msgstr "gewünschtes Zeichen ist zu groß für die Kodierung: %u" -#: utils/adt/oracle_compat.c:1075 +#: utils/adt/oracle_compat.c:1076 #, c-format -msgid "null character not permitted" -msgstr "Null-Zeichen ist nicht erlaubt" +msgid "requested character not valid for encoding: %u" +msgstr "gewünschtes Zeichen ist nicht gültig für die Kodierung: %u" -#: utils/adt/orderedsetaggs.c:442 utils/adt/orderedsetaggs.c:546 -#: utils/adt/orderedsetaggs.c:684 +#: utils/adt/orderedsetaggs.c:448 utils/adt/orderedsetaggs.c:552 +#: utils/adt/orderedsetaggs.c:690 #, c-format msgid "percentile value %g is not between 0 and 1" msgstr "Perzentilwert %g ist nicht zwischen 0 und 1" @@ -24304,121 +25335,130 @@ msgstr "Perzentilwert %g ist nicht zwischen 0 und 1" msgid "Apply system library package updates." msgstr "Aktualisieren Sie die Systembibliotheken." -#: utils/adt/pg_locale.c:1442 +#: utils/adt/pg_locale.c:1452 utils/adt/pg_locale.c:1700 +#: utils/adt/pg_locale.c:1979 utils/adt/pg_locale.c:2001 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "konnte Collator für Locale »%s« nicht öffnen: %s" + +#: utils/adt/pg_locale.c:1465 utils/adt/pg_locale.c:2010 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ICU wird in dieser Installation nicht unterstützt" + +#: utils/adt/pg_locale.c:1494 #, c-format msgid "could not create locale \"%s\": %m" msgstr "konnte Locale »%s« nicht erzeugen: %m" -#: utils/adt/pg_locale.c:1445 +#: utils/adt/pg_locale.c:1497 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "Das Betriebssystem konnte keine Locale-Daten für den Locale-Namen »%s« finden." -#: utils/adt/pg_locale.c:1547 +#: utils/adt/pg_locale.c:1605 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "Sortierfolgen mit unterschiedlichen »collate«- und »ctype«-Werten werden auf dieser Plattform nicht unterstützt" -#: utils/adt/pg_locale.c:1556 +#: utils/adt/pg_locale.c:1614 #, c-format msgid "collation provider LIBC is not supported on this platform" msgstr "Sortierfolgen-Provider LIBC wird auf dieser Plattform nicht unterstützt" -#: utils/adt/pg_locale.c:1568 -#, c-format -msgid "collations with different collate and ctype values are not supported by ICU" -msgstr "Sortierfolgen mit unterschiedlichen »collate«- und »ctype«-Werten werden von ICU nicht unterstützt" - -#: utils/adt/pg_locale.c:1574 utils/adt/pg_locale.c:1661 -#: utils/adt/pg_locale.c:1940 -#, c-format -msgid "could not open collator for locale \"%s\": %s" -msgstr "konnte Collator für Locale »%s« nicht öffnen: %s" - -#: utils/adt/pg_locale.c:1588 -#, c-format -msgid "ICU is not supported in this build" -msgstr "ICU wird in dieser Installation nicht unterstützt" - -#: utils/adt/pg_locale.c:1609 +#: utils/adt/pg_locale.c:1649 #, c-format -msgid "collation \"%s\" has no actual version, but a version was specified" -msgstr "Sortierfolge »%s« hat keine tatsächliche Version, aber eine Version wurde angegeben" +msgid "collation \"%s\" has no actual version, but a version was recorded" +msgstr "Sortierfolge »%s« hat keine tatsächliche Version, aber eine Version wurde aufgezeichnet" -#: utils/adt/pg_locale.c:1616 +#: utils/adt/pg_locale.c:1655 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "Version von Sortierfolge »%s« stimmt nicht überein" -#: utils/adt/pg_locale.c:1618 +#: utils/adt/pg_locale.c:1657 #, c-format msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgstr "Die Sortierfolge in der Datenbank wurde mit Version %s erzeugt, aber das Betriebssystem hat Version %s." -#: utils/adt/pg_locale.c:1621 +#: utils/adt/pg_locale.c:1660 #, c-format msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." msgstr "Bauen Sie alle von dieser Sortierfolge beinflussten Objekte neu und führen Sie ALTER COLLATION %s REFRESH VERSION aus, oder bauen Sie PostgreSQL mit der richtigen Bibliotheksversion." -#: utils/adt/pg_locale.c:1692 -#, fuzzy, c-format -#| msgid "could not create locale \"%s\": %m" +#: utils/adt/pg_locale.c:1731 +#, c-format msgid "could not load locale \"%s\"" -msgstr "konnte Locale »%s« nicht erzeugen: %m" +msgstr "konnte Locale »%s« nicht laden" -#: utils/adt/pg_locale.c:1717 +#: utils/adt/pg_locale.c:1756 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "konnte Sortierfolgenversion für Locale »%s« nicht ermitteln: Fehlercode %lu" -#: utils/adt/pg_locale.c:1755 +#: utils/adt/pg_locale.c:1794 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "Kodierung »%s« wird von ICU nicht unterstützt" -#: utils/adt/pg_locale.c:1762 +#: utils/adt/pg_locale.c:1801 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "konnte ICU-Konverter für Kodierung »%s« nicht öffnen: %s" -#: utils/adt/pg_locale.c:1793 utils/adt/pg_locale.c:1802 -#: utils/adt/pg_locale.c:1831 utils/adt/pg_locale.c:1841 +#: utils/adt/pg_locale.c:1832 utils/adt/pg_locale.c:1841 +#: utils/adt/pg_locale.c:1870 utils/adt/pg_locale.c:1880 #, c-format msgid "%s failed: %s" msgstr "%s fehlgeschlagen: %s" -#: utils/adt/pg_locale.c:2113 +#: utils/adt/pg_locale.c:2179 #, c-format msgid "invalid multibyte character for locale" msgstr "ungültiges Mehrbytezeichen für Locale" -#: utils/adt/pg_locale.c:2114 +#: utils/adt/pg_locale.c:2180 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "Die LC_CTYPE-Locale des Servers ist wahrscheinlich mit der Kodierung der Datenbank inkompatibel." #: utils/adt/pg_lsn.c:263 -#, fuzzy, c-format -#| msgid "cannot convert NaN to bigint" +#, c-format msgid "cannot add NaN to pg_lsn" -msgstr "kann NaN nicht in bigint umwandeln" +msgstr "NaN kann nicht zu pg_lsn addiert werden" #: utils/adt/pg_lsn.c:297 -#, fuzzy, c-format -#| msgid "cannot subtract infinite dates" +#, c-format msgid "cannot subtract NaN from pg_lsn" -msgstr "kann unendliche date-Werte nicht subtrahieren" +msgstr "NaN kann nicht von pg_lsn subtrahiert werden" #: utils/adt/pg_upgrade_support.c:29 #, c-format msgid "function can only be called when server is in binary upgrade mode" msgstr "Funktion kann nur aufgerufen werden, wenn der Server im Binary-Upgrade-Modus ist" -#: utils/adt/pgstatfuncs.c:503 +#: utils/adt/pgstatfuncs.c:482 #, c-format msgid "invalid command name: \"%s\"" msgstr "ungültiger Befehlsname: »%s«" +#: utils/adt/pgstatfuncs.c:2114 +#, c-format +msgid "unrecognized reset target: \"%s\"" +msgstr "unbekanntes Reset-Ziel: »%s«" + +#: utils/adt/pgstatfuncs.c:2115 +#, fuzzy, c-format +#| msgid "Target must be \"archiver\", \"bgwriter\", or \"wal\"." +msgid "Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." +msgstr "Das Reset-Ziel muss »archiver«, »bgwriter« oder »wal« sein." + +#: utils/adt/pgstatfuncs.c:2193 +#, fuzzy, c-format +#| msgid "invalid role OID: %u" +msgid "invalid subscription OID %u" +msgstr "ungültige Rollen-OID: %u" + #: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 #, c-format msgid "cannot display a value of type %s" @@ -24449,11 +25489,6 @@ msgstr "Ergebnis von Bereichsdifferenz würde nicht zusammenhängend sein" msgid "result of range union would not be contiguous" msgstr "Ergebnis von Bereichsvereinigung würde nicht zusammenhängend sein" -#: utils/adt/rangetypes.c:1214 -#, c-format -msgid "range_intersect_agg must be called with a range" -msgstr "" - #: utils/adt/rangetypes.c:1689 #, c-format msgid "range lower bound must be less than or equal to range upper bound" @@ -24504,33 +25539,48 @@ msgstr "Zu viele Kommas." msgid "Junk after right parenthesis or bracket." msgstr "Müll nach rechter runder oder eckiger Klammer." -#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4560 +#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4532 #, c-format msgid "regular expression failed: %s" msgstr "regulärer Ausdruck fehlgeschlagen: %s" -#: utils/adt/regexp.c:426 +#: utils/adt/regexp.c:431 utils/adt/regexp.c:666 +#, c-format +msgid "invalid regular expression option: \"%.*s\"" +msgstr "ungültige Option für regulären Ausdruck: »%.*s«" + +#: utils/adt/regexp.c:668 +#, c-format +msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." +msgstr "" + +#: utils/adt/regexp.c:702 utils/adt/regexp.c:711 utils/adt/regexp.c:1068 +#: utils/adt/regexp.c:1132 utils/adt/regexp.c:1141 utils/adt/regexp.c:1150 +#: utils/adt/regexp.c:1159 utils/adt/regexp.c:1839 utils/adt/regexp.c:1848 +#: utils/adt/regexp.c:1857 utils/misc/guc.c:11758 utils/misc/guc.c:11792 #, c-format -msgid "invalid regular expression option: \"%.*s\"" -msgstr "ungültige Option für regulären Ausdruck: »%.*s«" +msgid "invalid value for parameter \"%s\": %d" +msgstr "ungültiger Wert für Parameter »%s«: %d" -#: utils/adt/regexp.c:836 +#: utils/adt/regexp.c:922 #, c-format msgid "SQL regular expression may not contain more than two escape-double-quote separators" msgstr "SQL regulärer Ausdruck darf nicht mehr als zwei Escape-Double-Quote-Separatoren enthalten" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:981 utils/adt/regexp.c:1363 utils/adt/regexp.c:1418 +#: utils/adt/regexp.c:1079 utils/adt/regexp.c:1170 utils/adt/regexp.c:1257 +#: utils/adt/regexp.c:1296 utils/adt/regexp.c:1684 utils/adt/regexp.c:1739 +#: utils/adt/regexp.c:1868 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s unterstützt die »Global«-Option nicht" -#: utils/adt/regexp.c:983 +#: utils/adt/regexp.c:1298 #, c-format msgid "Use the regexp_matches function instead." msgstr "Verwenden Sie stattdessen die Funktion regexp_matches." -#: utils/adt/regexp.c:1165 +#: utils/adt/regexp.c:1486 #, c-format msgid "too many regular expression matches" msgstr "zu viele Treffer für regulären Ausdruck" @@ -24540,121 +25590,121 @@ msgstr "zu viele Treffer für regulären Ausdruck" msgid "more than one function named \"%s\"" msgstr "es gibt mehrere Funktionen namens »%s«" -#: utils/adt/regproc.c:542 +#: utils/adt/regproc.c:543 #, c-format msgid "more than one operator named %s" msgstr "es gibt mehrere Operatoren namens %s" -#: utils/adt/regproc.c:714 utils/adt/regproc.c:755 utils/adt/regproc.c:2054 -#: utils/adt/ruleutils.c:9642 utils/adt/ruleutils.c:9811 +#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 +#: utils/adt/ruleutils.c:10056 utils/adt/ruleutils.c:10338 #, c-format msgid "too many arguments" msgstr "zu viele Argumente" -#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 +#: utils/adt/regproc.c:716 utils/adt/regproc.c:757 #, c-format msgid "Provide two argument types for operator." msgstr "Geben Sie zwei Argumente für den Operator an." -#: utils/adt/regproc.c:1638 utils/adt/regproc.c:1662 utils/adt/regproc.c:1763 -#: utils/adt/regproc.c:1787 utils/adt/regproc.c:1889 utils/adt/regproc.c:1894 -#: utils/adt/varlena.c:3709 utils/adt/varlena.c:3714 +#: utils/adt/regproc.c:1639 utils/adt/regproc.c:1663 utils/adt/regproc.c:1764 +#: utils/adt/regproc.c:1788 utils/adt/regproc.c:1890 utils/adt/regproc.c:1895 +#: utils/adt/varlena.c:3671 utils/adt/varlena.c:3676 #, c-format msgid "invalid name syntax" msgstr "ungültige Namenssyntax" -#: utils/adt/regproc.c:1952 +#: utils/adt/regproc.c:1953 #, c-format msgid "expected a left parenthesis" msgstr "linke Klammer erwartet" -#: utils/adt/regproc.c:1968 +#: utils/adt/regproc.c:1969 #, c-format msgid "expected a right parenthesis" msgstr "rechte Klammer erwartet" -#: utils/adt/regproc.c:1987 +#: utils/adt/regproc.c:1988 #, c-format msgid "expected a type name" msgstr "Typname erwartet" -#: utils/adt/regproc.c:2019 +#: utils/adt/regproc.c:2020 #, c-format msgid "improper type name" msgstr "falscher Typname" -#: utils/adt/ri_triggers.c:300 utils/adt/ri_triggers.c:1545 -#: utils/adt/ri_triggers.c:2530 +#: utils/adt/ri_triggers.c:307 utils/adt/ri_triggers.c:1611 +#: utils/adt/ri_triggers.c:2598 #, c-format msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" msgstr "Einfügen oder Aktualisieren in Tabelle »%s« verletzt Fremdschlüssel-Constraint »%s«" -#: utils/adt/ri_triggers.c:303 utils/adt/ri_triggers.c:1548 +#: utils/adt/ri_triggers.c:310 utils/adt/ri_triggers.c:1614 #, c-format msgid "MATCH FULL does not allow mixing of null and nonnull key values." msgstr "MATCH FULL erlaubt das Mischen von Schlüsseln, die NULL und nicht NULL sind, nicht." -#: utils/adt/ri_triggers.c:1965 +#: utils/adt/ri_triggers.c:2031 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "Funktion »%s« muss von INSERT ausgelöst werden" -#: utils/adt/ri_triggers.c:1971 +#: utils/adt/ri_triggers.c:2037 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "Funktion »%s« muss von UPDATE ausgelöst werden" -#: utils/adt/ri_triggers.c:1977 +#: utils/adt/ri_triggers.c:2043 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "Funktion »%s« muss von DELETE ausgelöst werden" -#: utils/adt/ri_triggers.c:2000 +#: utils/adt/ri_triggers.c:2066 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "kein »pg_constraint«-Eintrag für Trigger »%s« für Tabelle »%s«" -#: utils/adt/ri_triggers.c:2002 +#: utils/adt/ri_triggers.c:2068 #, c-format msgid "Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT." msgstr "Entfernen Sie diesen Referentielle-Integritäts-Trigger und seine Partner und führen Sie dann ALTER TABLE ADD CONSTRAINT aus." -#: utils/adt/ri_triggers.c:2355 +#: utils/adt/ri_triggers.c:2423 #, c-format msgid "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result" msgstr "RI-Anfrage in Tabelle »%s« für Constraint »%s« von Tabelle »%s« ergab unerwartetes Ergebnis" -#: utils/adt/ri_triggers.c:2359 +#: utils/adt/ri_triggers.c:2427 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "Das liegt höchstwahrscheinlich daran, dass eine Regel die Anfrage umgeschrieben hat." -#: utils/adt/ri_triggers.c:2520 +#: utils/adt/ri_triggers.c:2588 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "Entfernen der Partition »%s« verletzt Fremdschlüssel-Constraint »%s«" -#: utils/adt/ri_triggers.c:2523 utils/adt/ri_triggers.c:2548 +#: utils/adt/ri_triggers.c:2591 utils/adt/ri_triggers.c:2616 #, c-format msgid "Key (%s)=(%s) is still referenced from table \"%s\"." msgstr "Auf Schlüssel (%s)=(%s) wird noch aus Tabelle »%s« verwiesen." -#: utils/adt/ri_triggers.c:2534 +#: utils/adt/ri_triggers.c:2602 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "Schlüssel (%s)=(%s) ist nicht in Tabelle »%s« vorhanden." -#: utils/adt/ri_triggers.c:2537 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key is not present in table \"%s\"." msgstr "Der Schlüssel ist nicht in Tabelle »%s« vorhanden." -#: utils/adt/ri_triggers.c:2543 +#: utils/adt/ri_triggers.c:2611 #, c-format msgid "update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"" msgstr "Aktualisieren oder Löschen in Tabelle »%s« verletzt Fremdschlüssel-Constraint »%s« von Tabelle »%s«" -#: utils/adt/ri_triggers.c:2551 +#: utils/adt/ri_triggers.c:2619 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "Auf den Schlüssel wird noch aus Tabelle »%s« verwiesen." @@ -24717,132 +25767,121 @@ msgstr "kann unterschiedliche Spaltentyp %s und %s in Record-Spalte %d nicht ver msgid "cannot compare record types with different numbers of columns" msgstr "kann Record-Typen mit unterschiedlicher Anzahl Spalten nicht vergleichen" -#: utils/adt/ruleutils.c:5069 +#: utils/adt/ruleutils.c:2710 +#, fuzzy, c-format +#| msgid "cannot use subquery in index expression" +msgid "input is a query, not an expression" +msgstr "Unteranfragen können nicht in Indexausdrücken verwendet werden" + +#: utils/adt/ruleutils.c:2722 +#, fuzzy, c-format +#| msgid "USING expression contains a whole-row table reference." +msgid "expression contains variables of more than one relation" +msgstr "USING-Ausdruck enthält einen Verweis auf die ganze Zeile der Tabelle." + +#: utils/adt/ruleutils.c:2729 +#, fuzzy, c-format +#| msgid "argument of %s must not contain variables" +msgid "expression contains variables" +msgstr "Argument von %s darf keine Variablen enthalten" + +#: utils/adt/ruleutils.c:5228 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "Regel »%s« hat nicht unterstützten Ereignistyp %d" -#: utils/adt/timestamp.c:109 +#: utils/adt/timestamp.c:110 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "Präzision von TIMESTAMP(%d)%s darf nicht negativ sein" -#: utils/adt/timestamp.c:115 +#: utils/adt/timestamp.c:116 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "Präzision von TIMESTAMP(%d)%s auf erlaubten Höchstwert %d reduziert" -#: utils/adt/timestamp.c:178 utils/adt/timestamp.c:436 utils/misc/guc.c:12411 +#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12782 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestamp ist außerhalb des gültigen Bereichs: »%s«" -#: utils/adt/timestamp.c:374 +#: utils/adt/timestamp.c:375 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "Präzision von timestamp(%d) muss zwischen %d und %d sein" -#: utils/adt/timestamp.c:498 +#: utils/adt/timestamp.c:499 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "Numerische Zeitzonen müssen »-« oder »+« als erstes Zeichen haben." -#: utils/adt/timestamp.c:511 +#: utils/adt/timestamp.c:512 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "numerische Zeitzone »%s« ist außerhalb des gültigen Bereichs" -#: utils/adt/timestamp.c:607 utils/adt/timestamp.c:617 -#: utils/adt/timestamp.c:625 +#: utils/adt/timestamp.c:608 utils/adt/timestamp.c:618 +#: utils/adt/timestamp.c:626 #, c-format msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" msgstr "timestamp ist außerhalb des gültigen Bereichs: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:726 +#: utils/adt/timestamp.c:727 #, c-format msgid "timestamp cannot be NaN" msgstr "timestamp kann nicht NaN sein" -#: utils/adt/timestamp.c:744 utils/adt/timestamp.c:756 +#: utils/adt/timestamp.c:745 utils/adt/timestamp.c:757 #, c-format msgid "timestamp out of range: \"%g\"" msgstr "timestamp ist außerhalb des gültigen Bereichs: »%g«" -#: utils/adt/timestamp.c:1068 utils/adt/timestamp.c:1101 +#: utils/adt/timestamp.c:1062 utils/adt/timestamp.c:1095 #, c-format msgid "invalid INTERVAL type modifier" msgstr "ungültiger Modifikator für Typ INTERVAL" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1078 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "INTERVAL(%d)-Präzision darf nicht negativ sein" -#: utils/adt/timestamp.c:1090 +#: utils/adt/timestamp.c:1084 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "INTERVAL(%d)-Präzision auf erlaubtes Maximum %d reduziert" -#: utils/adt/timestamp.c:1472 +#: utils/adt/timestamp.c:1466 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "Präzision von interval(%d) muss zwischen %d und %d sein" -#: utils/adt/timestamp.c:2660 +#: utils/adt/timestamp.c:2689 #, c-format msgid "cannot subtract infinite timestamps" msgstr "kann unendliche timestamp-Werte nicht subtrahieren" -#: utils/adt/timestamp.c:3837 utils/adt/timestamp.c:4015 -#, fuzzy, c-format -#| msgid "bigint out of range" +#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:4074 +#, c-format msgid "origin out of range" -msgstr "bigint ist außerhalb des gültigen Bereichs" +msgstr "Anfangspunkt ist außerhalb des gültigen Bereichs" -#: utils/adt/timestamp.c:3842 utils/adt/timestamp.c:4020 +#: utils/adt/timestamp.c:3896 utils/adt/timestamp.c:4079 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" -msgstr "" - -#: utils/adt/timestamp.c:3973 utils/adt/timestamp.c:4610 -#: utils/adt/timestamp.c:4810 utils/adt/timestamp.c:4857 -#, c-format -msgid "timestamp units \"%s\" not supported" -msgstr "»timestamp«-Einheit »%s« nicht unterstützt" - -#: utils/adt/timestamp.c:3987 utils/adt/timestamp.c:4564 -#: utils/adt/timestamp.c:4867 -#, c-format -msgid "timestamp units \"%s\" not recognized" -msgstr "»timestamp«-Einheit »%s« nicht erkannt" - -#: utils/adt/timestamp.c:4161 utils/adt/timestamp.c:4605 -#: utils/adt/timestamp.c:5081 utils/adt/timestamp.c:5129 -#, c-format -msgid "timestamp with time zone units \"%s\" not supported" -msgstr "»timestamp with time zone«-Einheit »%s« nicht unterstützt" +msgstr "timestamp-Werte können nicht in Intervalle, die Monate oder Jahre enthalten, einsortiert werden" -#: utils/adt/timestamp.c:4178 utils/adt/timestamp.c:4559 -#: utils/adt/timestamp.c:5138 +#: utils/adt/timestamp.c:3903 utils/adt/timestamp.c:4086 #, c-format -msgid "timestamp with time zone units \"%s\" not recognized" -msgstr "»timestamp with time zone«-Einheit »%s« nicht erkannt" +msgid "stride must be greater than zero" +msgstr "Schrittgröße muss größer als null sein" -#: utils/adt/timestamp.c:4336 -#, c-format -msgid "interval units \"%s\" not supported because months usually have fractional weeks" +#: utils/adt/timestamp.c:4399 +#, fuzzy, c-format +#| msgid "interval units \"%s\" not supported because months usually have fractional weeks" +msgid "Months usually have fractional weeks." msgstr "»interval«-Einheit »%s« wird nicht unterstützt, weil Monate gewöhnlich partielle Wochen haben" -#: utils/adt/timestamp.c:4342 utils/adt/timestamp.c:5261 -#, c-format -msgid "interval units \"%s\" not supported" -msgstr "»interval«-Einheit »%s« nicht unterstützt" - -#: utils/adt/timestamp.c:4358 utils/adt/timestamp.c:5322 -#, c-format -msgid "interval units \"%s\" not recognized" -msgstr "»interval«-Einheit »%s« nicht erkannt" - #: utils/adt/trigfuncs.c:42 #, c-format msgid "suppress_redundant_updates_trigger: must be called as trigger" @@ -24868,10 +25907,10 @@ msgstr "suppress_redundant_updates_trigger: muss für jede Zeile aufgerufen werd msgid "gtsvector_in not implemented" msgstr "gtsvector_in ist nicht implementiert" -#: utils/adt/tsquery.c:199 +#: utils/adt/tsquery.c:199 utils/adt/tsquery_op.c:124 #, c-format -msgid "distance in phrase operator should not be greater than %d" -msgstr "Abstand im Phrasenoperator sollte nicht größer als %d sein" +msgid "distance in phrase operator must be an integer value between zero and %d inclusive" +msgstr "Abstand im Phrasenoperator muss eine ganze Zahl zwischen einschließlich null und %d sein" #: utils/adt/tsquery.c:306 utils/adt/tsquery.c:691 #: utils/adt/tsvector_parser.c:133 @@ -24914,11 +25953,6 @@ msgstr "tsquery ist zu groß" msgid "text-search query contains only stop words or doesn't contain lexemes, ignored" msgstr "Textsucheanfrage enthält nur Stoppwörter oder enthält keine Lexeme, ignoriert" -#: utils/adt/tsquery_op.c:124 -#, c-format -msgid "distance in phrase operator should be non-negative and less than %d" -msgstr "Abstand im Phrasenoperator sollte nicht negativ und kleiner als %d sein" - #: utils/adt/tsquery_rewrite.c:321 #, c-format msgid "ts_rewrite query must return two tsquery columns" @@ -24954,58 +25988,63 @@ msgstr "Wort ist zu lang (%ld Bytes, maximal %ld Bytes)" msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "Zeichenkette ist zu lang für tsvector (%ld Bytes, maximal %ld Bytes)" -#: utils/adt/tsvector_op.c:328 utils/adt/tsvector_op.c:608 -#: utils/adt/tsvector_op.c:770 +#: utils/adt/tsvector_op.c:771 #, c-format msgid "lexeme array may not contain nulls" msgstr "Lexem-Array darf keine NULL-Werte enthalten" -#: utils/adt/tsvector_op.c:840 +#: utils/adt/tsvector_op.c:776 +#, fuzzy, c-format +#| msgid "lexeme array may not contain nulls" +msgid "lexeme array may not contain empty strings" +msgstr "Lexem-Array darf keine NULL-Werte enthalten" + +#: utils/adt/tsvector_op.c:846 #, c-format msgid "weight array may not contain nulls" msgstr "Gewichtungs-Array darf keine NULL-Werte enthalten" -#: utils/adt/tsvector_op.c:864 +#: utils/adt/tsvector_op.c:870 #, c-format msgid "unrecognized weight: \"%c\"" msgstr "unbekannte Gewichtung: »%c«" -#: utils/adt/tsvector_op.c:2426 +#: utils/adt/tsvector_op.c:2431 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "ts_stat-Anfrage muss eine tsvector-Spalte zurückgeben" -#: utils/adt/tsvector_op.c:2615 +#: utils/adt/tsvector_op.c:2620 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "tsvector-Spalte »%s« existiert nicht" -#: utils/adt/tsvector_op.c:2622 +#: utils/adt/tsvector_op.c:2627 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "Spalte »%s« hat nicht Typ tsvector" -#: utils/adt/tsvector_op.c:2634 +#: utils/adt/tsvector_op.c:2639 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "Konfigurationsspalte »%s« existiert nicht" -#: utils/adt/tsvector_op.c:2640 +#: utils/adt/tsvector_op.c:2645 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "Spalte »%s« hat nicht Typ regconfig" -#: utils/adt/tsvector_op.c:2647 +#: utils/adt/tsvector_op.c:2652 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "Konfigurationsspalte »%s« darf nicht NULL sein" -#: utils/adt/tsvector_op.c:2660 +#: utils/adt/tsvector_op.c:2665 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "Textsuchekonfigurationsname »%s« muss Schemaqualifikation haben" -#: utils/adt/tsvector_op.c:2685 +#: utils/adt/tsvector_op.c:2690 #, c-format msgid "column \"%s\" is not of a character type" msgstr "Spalte »%s« hat keinen Zeichentyp" @@ -25025,7 +26064,7 @@ msgstr "es gibt kein escaptes Zeichen: »%s«" msgid "wrong position info in tsvector: \"%s\"" msgstr "falsche Positionsinformationen in tsvector: »%s«" -#: utils/adt/uuid.c:428 +#: utils/adt/uuid.c:413 #, c-format msgid "could not generate random values" msgstr "konnte keine Zufallswerte erzeugen" @@ -25070,9 +26109,9 @@ msgstr "ungültige Länge in externer Bitkette" msgid "bit string too long for type bit varying(%d)" msgstr "Bitkette ist zu lang für Typ bit varying(%d)" -#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:897 -#: utils/adt/varlena.c:960 utils/adt/varlena.c:1117 utils/adt/varlena.c:3351 -#: utils/adt/varlena.c:3429 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:889 +#: utils/adt/varlena.c:952 utils/adt/varlena.c:1109 utils/adt/varlena.c:3313 +#: utils/adt/varlena.c:3391 #, c-format msgid "negative substring length not allowed" msgstr "negative Teilzeichenkettenlänge nicht erlaubt" @@ -25097,7 +26136,7 @@ msgstr "binäres »Exklusiv-Oder« nicht mit Bitketten unterschiedlicher Länge msgid "bit index %d out of valid range (0..%d)" msgstr "Bitindex %d ist außerhalb des gültigen Bereichs (0..%d)" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3633 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3595 #, c-format msgid "new bit must be 0 or 1" msgstr "neues Bit muss 0 oder 1 sein" @@ -25112,128 +26151,127 @@ msgstr "Wert zu lang für Typ character(%d)" msgid "value too long for type character varying(%d)" msgstr "Wert zu lang für Typ character varying(%d)" -#: utils/adt/varchar.c:732 utils/adt/varlena.c:1523 +#: utils/adt/varchar.c:732 utils/adt/varlena.c:1498 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "konnte die für den Zeichenkettenvergleich zu verwendende Sortierfolge nicht bestimmen" -#: utils/adt/varlena.c:1216 utils/adt/varlena.c:1963 +#: utils/adt/varlena.c:1208 utils/adt/varlena.c:1947 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "nichtdeterministische Sortierfolgen werden für Teilzeichenkettensuchen nicht unterstützt" -#: utils/adt/varlena.c:1622 utils/adt/varlena.c:1635 +#: utils/adt/varlena.c:1596 utils/adt/varlena.c:1609 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "konnte Zeichenkette nicht in UTF-16 umwandeln: Fehlercode %lu" -#: utils/adt/varlena.c:1650 +#: utils/adt/varlena.c:1624 #, c-format msgid "could not compare Unicode strings: %m" msgstr "konnte Unicode-Zeichenketten nicht vergleichen: %m" -#: utils/adt/varlena.c:1701 utils/adt/varlena.c:2415 +#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2398 #, c-format msgid "collation failed: %s" msgstr "Vergleichung fehlgeschlagen: %s" -#: utils/adt/varlena.c:2623 +#: utils/adt/varlena.c:2585 #, c-format msgid "sort key generation failed: %s" msgstr "Sortierschlüsselerzeugung fehlgeschlagen: %s" -#: utils/adt/varlena.c:3517 utils/adt/varlena.c:3584 +#: utils/adt/varlena.c:3479 utils/adt/varlena.c:3546 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "Index %d ist außerhalb des gültigen Bereichs, 0..%d" -#: utils/adt/varlena.c:3548 utils/adt/varlena.c:3620 +#: utils/adt/varlena.c:3510 utils/adt/varlena.c:3582 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "Index %lld ist außerhalb des gültigen Bereichs, 0..%lld" -#: utils/adt/varlena.c:4656 +#: utils/adt/varlena.c:4644 #, c-format msgid "field position must not be zero" msgstr "Feldposition darf nicht null sein" -#: utils/adt/varlena.c:5697 +#: utils/adt/varlena.c:5664 #, c-format msgid "unterminated format() type specifier" msgstr "Typspezifikation in format() nicht abgeschlossen" -#: utils/adt/varlena.c:5698 utils/adt/varlena.c:5832 utils/adt/varlena.c:5953 +#: utils/adt/varlena.c:5665 utils/adt/varlena.c:5799 utils/adt/varlena.c:5920 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Für ein einzelnes »%%« geben Sie »%%%%« an." -#: utils/adt/varlena.c:5830 utils/adt/varlena.c:5951 +#: utils/adt/varlena.c:5797 utils/adt/varlena.c:5918 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "unbekannte Typspezifikation in format(): »%.*s«" -#: utils/adt/varlena.c:5843 utils/adt/varlena.c:5900 +#: utils/adt/varlena.c:5810 utils/adt/varlena.c:5867 #, c-format msgid "too few arguments for format()" msgstr "zu wenige Argumente für format()" -#: utils/adt/varlena.c:5996 utils/adt/varlena.c:6178 +#: utils/adt/varlena.c:5963 utils/adt/varlena.c:6145 #, c-format msgid "number is out of range" msgstr "Zahl ist außerhalb des gültigen Bereichs" -#: utils/adt/varlena.c:6059 utils/adt/varlena.c:6087 +#: utils/adt/varlena.c:6026 utils/adt/varlena.c:6054 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "Format gibt Argument 0 an, aber die Argumente sind von 1 an nummeriert" -#: utils/adt/varlena.c:6080 +#: utils/adt/varlena.c:6047 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "Argumentposition der Breitenangabe muss mit »$« enden" -#: utils/adt/varlena.c:6125 +#: utils/adt/varlena.c:6092 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "NULL-Werte können nicht als SQL-Bezeichner formatiert werden" -#: utils/adt/varlena.c:6251 +#: utils/adt/varlena.c:6218 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "Unicode-Normalisierung kann nur durchgeführt werden, wenn die Serverkodierung UTF8 ist" -#: utils/adt/varlena.c:6264 +#: utils/adt/varlena.c:6231 #, c-format msgid "invalid normalization form: %s" msgstr "ungültige Normalisierungsform: %s" -#: utils/adt/varlena.c:6467 utils/adt/varlena.c:6502 utils/adt/varlena.c:6537 +#: utils/adt/varlena.c:6434 utils/adt/varlena.c:6469 utils/adt/varlena.c:6504 #, c-format msgid "invalid Unicode code point: %04X" msgstr "ungültiger Unicode-Codepunkt: %04X" -#: utils/adt/varlena.c:6567 -#, fuzzy, c-format -#| msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." +#: utils/adt/varlena.c:6534 +#, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." -msgstr "Unicode-Escapes müssen \\uXXXX oder \\UXXXXXXXX sein." +msgstr "Unicode-Escapes müssen \\XXXX, \\+XXXXXX, \\uXXXX oder \\UXXXXXXXX sein." -#: utils/adt/windowfuncs.c:243 +#: utils/adt/windowfuncs.c:306 #, c-format msgid "argument of ntile must be greater than zero" msgstr "Argument von ntile muss größer als null sein" -#: utils/adt/windowfuncs.c:465 +#: utils/adt/windowfuncs.c:528 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "Argument von nth_value muss größer als null sein" #: utils/adt/xid8funcs.c:116 #, c-format -msgid "transaction ID %s is in the future" -msgstr "Transaktions-ID %s ist in der Zukunft" +msgid "transaction ID %llu is in the future" +msgstr "Transaktions-ID %llu ist in der Zukunft" -#: utils/adt/xid8funcs.c:547 +#: utils/adt/xid8funcs.c:546 #, c-format msgid "invalid external pg_snapshot data" msgstr "ungültige externe pg_snapshot-Daten" @@ -25248,146 +26286,146 @@ msgstr "nicht unterstützte XML-Funktionalität" msgid "This functionality requires the server to be built with libxml support." msgstr "Diese Funktionalität verlangt, dass der Server mit Libxml-Unterstützung gebaut wird." -#: utils/adt/xml.c:243 utils/mb/mbutils.c:627 +#: utils/adt/xml.c:242 utils/mb/mbutils.c:627 #, c-format msgid "invalid encoding name \"%s\"" msgstr "ungültiger Kodierungsname »%s«" -#: utils/adt/xml.c:486 utils/adt/xml.c:491 +#: utils/adt/xml.c:485 utils/adt/xml.c:490 #, c-format msgid "invalid XML comment" msgstr "ungültiger XML-Kommentar" -#: utils/adt/xml.c:620 +#: utils/adt/xml.c:619 #, c-format msgid "not an XML document" msgstr "kein XML-Dokument" -#: utils/adt/xml.c:779 utils/adt/xml.c:802 +#: utils/adt/xml.c:778 utils/adt/xml.c:801 #, c-format msgid "invalid XML processing instruction" msgstr "ungültige XML-Verarbeitungsanweisung" -#: utils/adt/xml.c:780 +#: utils/adt/xml.c:779 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "Die Zielangabe der XML-Verarbeitungsanweisung darf nicht »%s« sein." -#: utils/adt/xml.c:803 +#: utils/adt/xml.c:802 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML-Verarbeitungsanweisung darf nicht »?>« enthalten." -#: utils/adt/xml.c:882 +#: utils/adt/xml.c:881 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidate ist nicht implementiert" -#: utils/adt/xml.c:961 +#: utils/adt/xml.c:960 #, c-format msgid "could not initialize XML library" msgstr "konnte XML-Bibliothek nicht initialisieren" -#: utils/adt/xml.c:962 +#: utils/adt/xml.c:961 #, c-format -msgid "libxml2 has incompatible char type: sizeof(char)=%u, sizeof(xmlChar)=%u." -msgstr "libxml2 hat inkompatiblen char-Typ: sizeof(char)=%u, sizeof(xmlChar)=%u." +msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." +msgstr "libxml2 hat inkompatiblen char-Typ: sizeof(char)=%zu, sizeof(xmlChar)=%zu." -#: utils/adt/xml.c:1048 +#: utils/adt/xml.c:1047 #, c-format msgid "could not set up XML error handler" msgstr "konnte XML-Fehlerbehandlung nicht einrichten" -#: utils/adt/xml.c:1049 +#: utils/adt/xml.c:1048 #, c-format msgid "This probably indicates that the version of libxml2 being used is not compatible with the libxml2 header files that PostgreSQL was built with." msgstr "Das deutet wahrscheinlich darauf hin, dass die verwendete Version von libxml2 nicht mit den Header-Dateien der Version, mit der PostgreSQL gebaut wurde, kompatibel ist." -#: utils/adt/xml.c:1936 +#: utils/adt/xml.c:1935 msgid "Invalid character value." msgstr "Ungültiger Zeichenwert." -#: utils/adt/xml.c:1939 +#: utils/adt/xml.c:1938 msgid "Space required." msgstr "Leerzeichen benötigt." -#: utils/adt/xml.c:1942 +#: utils/adt/xml.c:1941 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone akzeptiert nur »yes« oder »no«." -#: utils/adt/xml.c:1945 +#: utils/adt/xml.c:1944 msgid "Malformed declaration: missing version." msgstr "Fehlerhafte Deklaration: Version fehlt." -#: utils/adt/xml.c:1948 +#: utils/adt/xml.c:1947 msgid "Missing encoding in text declaration." msgstr "Fehlende Kodierung in Textdeklaration." -#: utils/adt/xml.c:1951 +#: utils/adt/xml.c:1950 msgid "Parsing XML declaration: '?>' expected." msgstr "Beim Parsen der XML-Deklaration: »?>« erwartet." -#: utils/adt/xml.c:1954 +#: utils/adt/xml.c:1953 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Unbekannter Libxml-Fehlercode: %d." -#: utils/adt/xml.c:2211 +#: utils/adt/xml.c:2210 #, c-format msgid "XML does not support infinite date values." msgstr "XML unterstützt keine unendlichen Datumswerte." -#: utils/adt/xml.c:2233 utils/adt/xml.c:2260 +#: utils/adt/xml.c:2232 utils/adt/xml.c:2259 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML unterstützt keine unendlichen timestamp-Werte." -#: utils/adt/xml.c:2676 +#: utils/adt/xml.c:2675 #, c-format msgid "invalid query" msgstr "ungültige Anfrage" -#: utils/adt/xml.c:4016 +#: utils/adt/xml.c:4015 #, c-format msgid "invalid array for XML namespace mapping" msgstr "ungültiges Array for XML-Namensraumabbildung" -#: utils/adt/xml.c:4017 +#: utils/adt/xml.c:4016 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "Das Array muss zweidimensional sein und die Länge der zweiten Achse muss gleich 2 sein." -#: utils/adt/xml.c:4041 +#: utils/adt/xml.c:4040 #, c-format msgid "empty XPath expression" msgstr "leerer XPath-Ausdruck" -#: utils/adt/xml.c:4093 +#: utils/adt/xml.c:4092 #, c-format msgid "neither namespace name nor URI may be null" msgstr "weder Namensraumname noch URI dürfen NULL sein" -#: utils/adt/xml.c:4100 +#: utils/adt/xml.c:4099 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "konnte XML-Namensraum mit Namen »%s« und URI »%s« nicht registrieren" -#: utils/adt/xml.c:4451 +#: utils/adt/xml.c:4450 #, c-format msgid "DEFAULT namespace is not supported" msgstr "DEFAULT-Namensraum wird nicht unterstützt" -#: utils/adt/xml.c:4480 +#: utils/adt/xml.c:4479 #, c-format msgid "row path filter must not be empty string" msgstr "Zeilenpfadfilter darf nicht leer sein" -#: utils/adt/xml.c:4511 +#: utils/adt/xml.c:4510 #, c-format msgid "column path filter must not be empty string" msgstr "Spaltenpfadfilter darf nicht leer sein" -#: utils/adt/xml.c:4655 +#: utils/adt/xml.c:4654 #, c-format msgid "more than one value returned by column XPath expression" msgstr "XPath-Ausdruck für Spalte gab mehr als einen Wert zurück" @@ -25397,18 +26435,18 @@ msgstr "XPath-Ausdruck für Spalte gab mehr als einen Wert zurück" msgid "cast from type %s to type %s does not exist" msgstr "Typumwandlung von Typ %s in Typ %s existiert nicht" -#: utils/cache/lsyscache.c:2834 utils/cache/lsyscache.c:2867 -#: utils/cache/lsyscache.c:2900 utils/cache/lsyscache.c:2933 +#: utils/cache/lsyscache.c:2844 utils/cache/lsyscache.c:2877 +#: utils/cache/lsyscache.c:2910 utils/cache/lsyscache.c:2943 #, c-format msgid "type %s is only a shell" msgstr "Typ %s ist nur eine Hülle" -#: utils/cache/lsyscache.c:2839 +#: utils/cache/lsyscache.c:2849 #, c-format msgid "no input function available for type %s" msgstr "keine Eingabefunktion verfügbar für Typ %s" -#: utils/cache/lsyscache.c:2872 +#: utils/cache/lsyscache.c:2882 #, c-format msgid "no output function available for type %s" msgstr "keine Ausgabefunktion verfügbar für Typ %s" @@ -25423,148 +26461,146 @@ msgstr "in Operatorklasse »%s« für Zugriffsmethode %s fehlt Support-Funktion msgid "cached plan must not change result type" msgstr "gecachter Plan darf den Ergebnistyp nicht ändern" -#: utils/cache/relcache.c:6213 +#: utils/cache/relcache.c:6402 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "konnte Initialisierungsdatei für Relationscache »%s« nicht erzeugen: %m" -#: utils/cache/relcache.c:6215 +#: utils/cache/relcache.c:6404 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Setze trotzdem fort, aber irgendwas stimmt nicht." -#: utils/cache/relcache.c:6537 +#: utils/cache/relcache.c:6726 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "konnte Cache-Datei »%s« nicht löschen: %m" -#: utils/cache/relmapper.c:531 +#: utils/cache/relmapper.c:590 #, c-format msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "PREPARE kann nicht in einer Transaktion ausgeführt werden, die das Relation-Mapping geändert hat" -#: utils/cache/relmapper.c:761 +#: utils/cache/relmapper.c:836 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "Relation-Mapping-Datei »%s« enthält ungültige Daten" -#: utils/cache/relmapper.c:771 +#: utils/cache/relmapper.c:846 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "Relation-Mapping-Datei »%s« enthält falsche Prüfsumme" -#: utils/cache/typcache.c:1808 utils/fmgr/funcapi.c:463 +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:532 #, c-format msgid "record type has not been registered" msgstr "Record-Typ wurde nicht registriert" #: utils/error/assert.c:39 -#, fuzzy, c-format -#| msgid "TRAP: ExceptionalCondition: bad arguments\n" +#, c-format msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" -msgstr "TRAP: ExceptionalCondition: fehlerhafte Argumente\n" +msgstr "TRAP: ExceptionalCondition: fehlerhafte Argumente in PID %d\n" #: utils/error/assert.c:42 -#, fuzzy, c-format -#| msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d)\n" +#, c-format msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" -msgstr "TRAP: %s(»%s«, Datei: »%s«, Zeile: %d)\n" +msgstr "TRAP: %s(»%s«, Datei: »%s«, Zeile: %d, PID: %d)\n" -#: utils/error/elog.c:409 +#: utils/error/elog.c:404 #, c-format msgid "error occurred before error message processing is available\n" msgstr "Fehler geschah bevor Fehlermeldungsverarbeitung bereit war\n" -#: utils/error/elog.c:1948 +#: utils/error/elog.c:1943 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "konnte Datei »%s« nicht als stderr neu öffnen: %m" -#: utils/error/elog.c:1961 +#: utils/error/elog.c:1956 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "konnte Datei »%s« nicht als stdout neu öffnen: %m" -#: utils/error/elog.c:2456 utils/error/elog.c:2490 utils/error/elog.c:2506 +#: utils/error/elog.c:2521 utils/error/elog.c:2548 utils/error/elog.c:2564 msgid "[unknown]" msgstr "[unbekannt]" -#: utils/error/elog.c:3026 utils/error/elog.c:3344 utils/error/elog.c:3451 +#: utils/error/elog.c:2837 utils/error/elog.c:3158 utils/error/elog.c:3265 msgid "missing error text" msgstr "fehlender Fehlertext" -#: utils/error/elog.c:3029 utils/error/elog.c:3032 +#: utils/error/elog.c:2840 utils/error/elog.c:2843 #, c-format msgid " at character %d" msgstr " bei Zeichen %d" -#: utils/error/elog.c:3042 utils/error/elog.c:3049 +#: utils/error/elog.c:2853 utils/error/elog.c:2860 msgid "DETAIL: " msgstr "DETAIL: " -#: utils/error/elog.c:3056 +#: utils/error/elog.c:2867 msgid "HINT: " msgstr "TIPP: " -#: utils/error/elog.c:3063 +#: utils/error/elog.c:2874 msgid "QUERY: " msgstr "ANFRAGE: " -#: utils/error/elog.c:3070 +#: utils/error/elog.c:2881 msgid "CONTEXT: " msgstr "ZUSAMMENHANG: " -#: utils/error/elog.c:3080 +#: utils/error/elog.c:2891 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "ORT: %s, %s:%d\n" -#: utils/error/elog.c:3087 +#: utils/error/elog.c:2898 #, c-format msgid "LOCATION: %s:%d\n" msgstr "ORT: %s:%d\n" -#: utils/error/elog.c:3094 +#: utils/error/elog.c:2905 msgid "BACKTRACE: " msgstr "BACKTRACE: " -#: utils/error/elog.c:3108 +#: utils/error/elog.c:2917 msgid "STATEMENT: " msgstr "ANWEISUNG: " -#: utils/error/elog.c:3496 +#: utils/error/elog.c:3310 msgid "DEBUG" msgstr "DEBUG" -#: utils/error/elog.c:3500 +#: utils/error/elog.c:3314 msgid "LOG" msgstr "LOG" -#: utils/error/elog.c:3503 +#: utils/error/elog.c:3317 msgid "INFO" msgstr "INFO" -#: utils/error/elog.c:3506 +#: utils/error/elog.c:3320 msgid "NOTICE" msgstr "HINWEIS" -#: utils/error/elog.c:3510 +#: utils/error/elog.c:3324 msgid "WARNING" msgstr "WARNUNG" -#: utils/error/elog.c:3513 +#: utils/error/elog.c:3327 msgid "ERROR" msgstr "FEHLER" -#: utils/error/elog.c:3516 +#: utils/error/elog.c:3330 msgid "FATAL" msgstr "FATAL" -#: utils/error/elog.c:3519 +#: utils/error/elog.c:3333 msgid "PANIC" msgstr "PANIK" -#: utils/fmgr/dfmgr.c:130 +#: utils/fmgr/dfmgr.c:128 #, c-format msgid "could not find function \"%s\" in file \"%s\"" msgstr "konnte Funktion »%s« nicht in Datei »%s« finden" @@ -25594,51 +26630,61 @@ msgstr "inkompatible Bibliothek »%s«: Version stimmt nicht überein" msgid "Server is version %d, library is version %s." msgstr "Serverversion ist %d, Bibliotheksversion ist %s." -#: utils/fmgr/dfmgr.c:346 +#: utils/fmgr/dfmgr.c:341 +#, c-format +msgid "incompatible library \"%s\": ABI mismatch" +msgstr "inkompatible Bibliothek »%s«: ABI stimmt nicht überein" + +#: utils/fmgr/dfmgr.c:343 +#, c-format +msgid "Server has ABI \"%s\", library has \"%s\"." +msgstr "Server hat ABI »%s«, Bibliothek hat »%s«." + +#: utils/fmgr/dfmgr.c:361 #, c-format msgid "Server has FUNC_MAX_ARGS = %d, library has %d." msgstr "Server hat FUNC_MAX_ARGS = %d, Bibliothek hat %d." -#: utils/fmgr/dfmgr.c:355 +#: utils/fmgr/dfmgr.c:370 #, c-format msgid "Server has INDEX_MAX_KEYS = %d, library has %d." msgstr "Server hat INDEX_MAX_KEYS = %d, Bibliothek hat %d." -#: utils/fmgr/dfmgr.c:364 +#: utils/fmgr/dfmgr.c:379 #, c-format msgid "Server has NAMEDATALEN = %d, library has %d." msgstr "Server hat NAMEDATALEN = %d, Bibliothek hat %d." -#: utils/fmgr/dfmgr.c:373 +#: utils/fmgr/dfmgr.c:388 #, c-format msgid "Server has FLOAT8PASSBYVAL = %s, library has %s." msgstr "Server hat FLOAT8PASSBYVAL = %s, Bibliothek hat %s." -#: utils/fmgr/dfmgr.c:380 +#: utils/fmgr/dfmgr.c:395 msgid "Magic block has unexpected length or padding difference." msgstr "Magischer Block hat unerwartete Länge oder unterschiedliches Padding." -#: utils/fmgr/dfmgr.c:383 +#: utils/fmgr/dfmgr.c:398 #, c-format msgid "incompatible library \"%s\": magic block mismatch" msgstr "inkompatible Bibliothek »%s«: magischer Block stimmt überein" -#: utils/fmgr/dfmgr.c:547 +#: utils/fmgr/dfmgr.c:492 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "Zugriff auf Bibliothek »%s« ist nicht erlaubt" -#: utils/fmgr/dfmgr.c:573 +#: utils/fmgr/dfmgr.c:518 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "ungültiger Makroname in Parameter »dynamic_library_path«: %s" -#: utils/fmgr/dfmgr.c:613 +#: utils/fmgr/dfmgr.c:558 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "eine Komponente im Parameter »dynamic_library_path« hat Länge null" -#: utils/fmgr/dfmgr.c:632 +#: utils/fmgr/dfmgr.c:577 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "eine Komponente im Parameter »dynamic_library_path« ist kein absoluter Pfad" @@ -25663,368 +26709,380 @@ msgstr "Von SQL aufrufbare Funktionen benötigen ein begleitendes PG_FUNCTION_IN msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "Info-Funktion »%2$s« berichtete unbekannte API-Version %1$d" -#: utils/fmgr/fmgr.c:1999 +#: utils/fmgr/fmgr.c:1985 #, c-format msgid "operator class options info is absent in function call context" msgstr "Operatorklassenoptionsinformationen fehlen im Funktionsaufrufkontext" -#: utils/fmgr/fmgr.c:2066 +#: utils/fmgr/fmgr.c:2052 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "Sprachvalidierungsfunktion %u wurde für Sprache %u statt %u aufgerufen" -#: utils/fmgr/funcapi.c:386 +#: utils/fmgr/funcapi.c:455 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" msgstr "konnte tatsächlichen Ergebnistyp von Funktion »%s« mit deklarierten Rückgabetyp %s nicht bestimmen" -#: utils/fmgr/funcapi.c:531 -#, fuzzy, c-format -#| msgid "argument declared %s is not a range type but type %s" +#: utils/fmgr/funcapi.c:600 +#, c-format msgid "argument declared %s does not contain a range type but type %s" -msgstr "als %s deklariertes Argument ist kein Bereichstyp sondern Typ %s" +msgstr "als %s deklariertes Argument enthält keinen Bereichstyp sondern Typ %s" + +#: utils/fmgr/funcapi.c:683 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "konnte Multirange-Typ für Datentyp %s nicht finden" -#: utils/fmgr/funcapi.c:1833 utils/fmgr/funcapi.c:1865 +#: utils/fmgr/funcapi.c:1900 utils/fmgr/funcapi.c:1932 #, c-format msgid "number of aliases does not match number of columns" msgstr "Anzahl der Aliasnamen stimmt nicht mit der Anzahl der Spalten überein" -#: utils/fmgr/funcapi.c:1859 +#: utils/fmgr/funcapi.c:1926 #, c-format msgid "no column alias was provided" msgstr "Spaltenalias fehlt" -#: utils/fmgr/funcapi.c:1883 +#: utils/fmgr/funcapi.c:1950 #, c-format msgid "could not determine row description for function returning record" msgstr "konnte Zeilenbeschreibung für Funktion, die »record« zurückgibt, nicht ermitteln" -#: utils/init/miscinit.c:315 +#: utils/init/miscinit.c:329 #, c-format msgid "data directory \"%s\" does not exist" msgstr "Datenverzeichnis »%s« existiert nicht" -#: utils/init/miscinit.c:320 +#: utils/init/miscinit.c:334 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %m" -#: utils/init/miscinit.c:328 +#: utils/init/miscinit.c:342 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "angegebenes Datenverzeichnis »%s« ist kein Verzeichnis" -#: utils/init/miscinit.c:344 +#: utils/init/miscinit.c:358 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "Datenverzeichnis »%s« hat falschen Eigentümer" -#: utils/init/miscinit.c:346 +#: utils/init/miscinit.c:360 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "Der Server muss von dem Benutzer gestartet werden, dem das Datenverzeichnis gehört." -#: utils/init/miscinit.c:364 +#: utils/init/miscinit.c:378 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "Datenverzeichnis »%s« hat ungültige Zugriffsrechte" -#: utils/init/miscinit.c:366 +#: utils/init/miscinit.c:380 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "Rechte sollten u=rwx (0700) oder u=rwx,g=rx (0750) sein." -#: utils/init/miscinit.c:645 utils/misc/guc.c:7481 +#: utils/init/miscinit.c:665 utils/misc/guc.c:7782 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "kann Parameter »%s« nicht in einer sicherheitsbeschränkten Operation setzen" -#: utils/init/miscinit.c:713 +#: utils/init/miscinit.c:733 #, c-format msgid "role with OID %u does not exist" msgstr "Rolle mit OID %u existiert nicht" -#: utils/init/miscinit.c:743 +#: utils/init/miscinit.c:763 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "Rolle »%s« hat keine Berechtigung zum Einloggen" -#: utils/init/miscinit.c:761 +#: utils/init/miscinit.c:781 #, c-format msgid "too many connections for role \"%s\"" msgstr "zu viele Verbindungen von Rolle »%s«" -#: utils/init/miscinit.c:821 +#: utils/init/miscinit.c:841 #, c-format msgid "permission denied to set session authorization" msgstr "keine Berechtigung, um Sitzungsautorisierung zu setzen" -#: utils/init/miscinit.c:904 +#: utils/init/miscinit.c:924 #, c-format msgid "invalid role OID: %u" msgstr "ungültige Rollen-OID: %u" -#: utils/init/miscinit.c:958 +#: utils/init/miscinit.c:978 #, c-format msgid "database system is shut down" msgstr "Datenbanksystem ist heruntergefahren" -#: utils/init/miscinit.c:1045 +#: utils/init/miscinit.c:1065 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht erstellen: %m" -#: utils/init/miscinit.c:1059 +#: utils/init/miscinit.c:1079 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht öffnen: %m" -#: utils/init/miscinit.c:1066 +#: utils/init/miscinit.c:1086 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht lesen: %m" -#: utils/init/miscinit.c:1075 +#: utils/init/miscinit.c:1095 #, c-format msgid "lock file \"%s\" is empty" msgstr "Sperrdatei »%s« ist leer" -#: utils/init/miscinit.c:1076 +#: utils/init/miscinit.c:1096 #, c-format msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." msgstr "Entweder startet gerade ein anderer Server oder die Sperrdatei ist von einen Absturz übrig geblieben." -#: utils/init/miscinit.c:1120 +#: utils/init/miscinit.c:1140 #, c-format msgid "lock file \"%s\" already exists" msgstr "Sperrdatei »%s« existiert bereits" -#: utils/init/miscinit.c:1124 +#: utils/init/miscinit.c:1144 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "Läuft bereits ein anderer postgres-Prozess (PID %d) im Datenverzeichnis »%s«?" -#: utils/init/miscinit.c:1126 +#: utils/init/miscinit.c:1146 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "Läuft bereits ein anderer postmaster-Prozess (PID %d) im Datenverzeichnis »%s«?" -#: utils/init/miscinit.c:1129 +#: utils/init/miscinit.c:1149 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "Verwendet bereits ein anderer postgres-Prozess (PID %d) die Socketdatei »%s«?" -#: utils/init/miscinit.c:1131 +#: utils/init/miscinit.c:1151 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "Verwendet bereits ein anderer postmaster-Prozess (PID %d) die Socketdatei »%s«?" -#: utils/init/miscinit.c:1182 +#: utils/init/miscinit.c:1202 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "konnte alte Sperrdatei »%s« nicht löschen: %m" -#: utils/init/miscinit.c:1184 +#: utils/init/miscinit.c:1204 #, c-format msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." msgstr "Die Datei ist anscheinend aus Versehen übrig geblieben, konnte aber nicht gelöscht werden. Bitte entfernen Sie die Datei von Hand und versuchen Sie es erneut." -#: utils/init/miscinit.c:1221 utils/init/miscinit.c:1235 -#: utils/init/miscinit.c:1246 +#: utils/init/miscinit.c:1241 utils/init/miscinit.c:1255 +#: utils/init/miscinit.c:1266 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht schreiben: %m" -#: utils/init/miscinit.c:1357 utils/init/miscinit.c:1499 utils/misc/guc.c:10377 +#: utils/init/miscinit.c:1377 utils/init/miscinit.c:1519 utils/misc/guc.c:10740 #, c-format msgid "could not read from file \"%s\": %m" msgstr "konnte nicht aus Datei »%s« lesen: %m" -#: utils/init/miscinit.c:1487 +#: utils/init/miscinit.c:1507 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "konnte Datei »%s« nicht öffnen: %m; setze trotzdem fort" -#: utils/init/miscinit.c:1512 +#: utils/init/miscinit.c:1532 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "Sperrdatei »%s« enthält falsche PID: %ld statt %ld" -#: utils/init/miscinit.c:1551 utils/init/miscinit.c:1567 +#: utils/init/miscinit.c:1571 utils/init/miscinit.c:1587 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "»%s« ist kein gültiges Datenverzeichnis" -#: utils/init/miscinit.c:1553 +#: utils/init/miscinit.c:1573 #, c-format msgid "File \"%s\" is missing." msgstr "Die Datei »%s« fehlt." -#: utils/init/miscinit.c:1569 +#: utils/init/miscinit.c:1589 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Die Datei »%s« enthält keine gültigen Daten." -#: utils/init/miscinit.c:1571 +#: utils/init/miscinit.c:1591 #, c-format msgid "You might need to initdb." msgstr "Sie müssen möglicherweise initdb ausführen." -#: utils/init/miscinit.c:1579 +#: utils/init/miscinit.c:1599 #, c-format msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." msgstr "Das Datenverzeichnis wurde von PostgreSQL Version %s initialisiert, welche nicht mit dieser Version %s kompatibel ist." -#: utils/init/postinit.c:254 +#: utils/init/postinit.c:258 #, c-format msgid "replication connection authorized: user=%s" msgstr "Replikationsverbindung autorisiert: Benutzer=%s" -#: utils/init/postinit.c:257 +#: utils/init/postinit.c:261 #, c-format msgid "connection authorized: user=%s" msgstr "Verbindung autorisiert: Benutzer=%s" -#: utils/init/postinit.c:260 +#: utils/init/postinit.c:264 #, c-format msgid " database=%s" msgstr " Datenbank=%s" -#: utils/init/postinit.c:263 +#: utils/init/postinit.c:267 #, c-format msgid " application_name=%s" msgstr " application_name=%s" -#: utils/init/postinit.c:268 +#: utils/init/postinit.c:272 #, c-format msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" -msgstr "SSL an (Protokoll=%s, Verschlüsselungsmethode=%s, Bits=%d)" +msgstr " SSL an (Protokoll=%s, Verschlüsselungsmethode=%s, Bits=%d)" -#: utils/init/postinit.c:280 +#: utils/init/postinit.c:284 #, c-format msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" msgstr " GSS (authentifiziert=%s, verschlüsselt=%s, Principal=%s)" -#: utils/init/postinit.c:281 utils/init/postinit.c:282 -#: utils/init/postinit.c:287 utils/init/postinit.c:288 +#: utils/init/postinit.c:285 utils/init/postinit.c:286 +#: utils/init/postinit.c:291 utils/init/postinit.c:292 msgid "no" msgstr "nein" -#: utils/init/postinit.c:281 utils/init/postinit.c:282 -#: utils/init/postinit.c:287 utils/init/postinit.c:288 +#: utils/init/postinit.c:285 utils/init/postinit.c:286 +#: utils/init/postinit.c:291 utils/init/postinit.c:292 msgid "yes" msgstr "ja" -#: utils/init/postinit.c:286 +#: utils/init/postinit.c:290 #, c-format msgid " GSS (authenticated=%s, encrypted=%s)" msgstr " GSS (authentifiziert=%s, verschlüsselt=%s)" -#: utils/init/postinit.c:323 +#: utils/init/postinit.c:330 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "Datenbank »%s« ist aus pg_database verschwunden" -#: utils/init/postinit.c:325 +#: utils/init/postinit.c:332 #, c-format msgid "Database OID %u now seems to belong to \"%s\"." msgstr "Datenbank-OID %u gehört jetzt anscheinend zu »%s«." -#: utils/init/postinit.c:345 +#: utils/init/postinit.c:352 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "Datenbank »%s« akzeptiert gegenwärtig keine Verbindungen" -#: utils/init/postinit.c:358 +#: utils/init/postinit.c:365 #, c-format msgid "permission denied for database \"%s\"" msgstr "keine Berechtigung für Datenbank »%s«" -#: utils/init/postinit.c:359 +#: utils/init/postinit.c:366 #, c-format msgid "User does not have CONNECT privilege." msgstr "Benutzer hat das CONNECT-Privileg nicht." -#: utils/init/postinit.c:376 +#: utils/init/postinit.c:383 #, c-format msgid "too many connections for database \"%s\"" msgstr "zu viele Verbindungen für Datenbank »%s«" -#: utils/init/postinit.c:398 utils/init/postinit.c:405 +#: utils/init/postinit.c:409 utils/init/postinit.c:416 #, c-format msgid "database locale is incompatible with operating system" msgstr "Datenbank-Locale ist inkompatibel mit Betriebssystem" -#: utils/init/postinit.c:399 +#: utils/init/postinit.c:410 #, c-format msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." msgstr "Die Datenbank wurde mit LC_COLLATE »%s« initialisiert, was von setlocale() nicht erkannt wird." -#: utils/init/postinit.c:401 utils/init/postinit.c:408 +#: utils/init/postinit.c:412 utils/init/postinit.c:419 #, c-format msgid "Recreate the database with another locale or install the missing locale." msgstr "Erzeugen Sie die Datenbank neu mit einer anderen Locale oder installieren Sie die fehlende Locale." -#: utils/init/postinit.c:406 +#: utils/init/postinit.c:417 #, c-format msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." msgstr "Die Datenbank wurde mit LC_CTYPE »%s« initialisiert, was von setlocale() nicht erkannt wird." -#: utils/init/postinit.c:761 +#: utils/init/postinit.c:457 +#, c-format +msgid "database \"%s\" has no actual collation version, but a version was recorded" +msgstr "Datenbank »%s« hat keine tatsächliche Sortierfolgenversion, aber eine Version wurde aufgezeichnet" + +#: utils/init/postinit.c:461 +#, fuzzy, c-format +#| msgid "collation \"%s\" has version mismatch" +msgid "database \"%s\" has a collation version mismatch" +msgstr "Version von Sortierfolge »%s« stimmt nicht überein" + +#: utils/init/postinit.c:463 +#, fuzzy, c-format +#| msgid "The collation in the database was created using version %s, but the operating system provides version %s." +msgid "The database was created using collation version %s, but the operating system provides version %s." +msgstr "Die Sortierfolge in der Datenbank wurde mit Version %s erzeugt, aber das Betriebssystem hat Version %s." + +#: utils/init/postinit.c:466 +#, fuzzy, c-format +#| msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." +msgid "Rebuild all objects in this database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." +msgstr "Bauen Sie alle von dieser Sortierfolge beinflussten Objekte neu und führen Sie ALTER COLLATION %s REFRESH VERSION aus, oder bauen Sie PostgreSQL mit der richtigen Bibliotheksversion." + +#: utils/init/postinit.c:815 #, c-format msgid "no roles are defined in this database system" msgstr "in diesem Datenbanksystem sind keine Rollen definiert" -#: utils/init/postinit.c:762 +#: utils/init/postinit.c:816 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "Sie sollten sofort CREATE USER \"%s\" SUPERUSER; ausführen." -#: utils/init/postinit.c:798 -#, c-format -msgid "new replication connections are not allowed during database shutdown" -msgstr "während des Herunterfahrens der Datenbank sind keine neuen Replikationsverbindungen erlaubt" - -#: utils/init/postinit.c:802 -#, c-format -msgid "must be superuser to connect during database shutdown" -msgstr "nur Superuser können während des Herunterfahrens der Datenbank verbinden" - -#: utils/init/postinit.c:812 +#: utils/init/postinit.c:848 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "nur Superuser können im Binary-Upgrade-Modus verbinden" -#: utils/init/postinit.c:825 +#: utils/init/postinit.c:861 #, c-format msgid "remaining connection slots are reserved for non-replication superuser connections" msgstr "die verbleibenden Verbindungen sind für Superuser auf Nicht-Replikationsverbindungen reserviert" -#: utils/init/postinit.c:835 +#: utils/init/postinit.c:871 #, c-format msgid "must be superuser or replication role to start walsender" msgstr "nur Superuser und Replikationsrollen können WAL-Sender starten" -#: utils/init/postinit.c:904 +#: utils/init/postinit.c:940 #, c-format msgid "database %u does not exist" msgstr "Datenbank %u existiert nicht" -#: utils/init/postinit.c:993 +#: utils/init/postinit.c:1029 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Sie wurde anscheinend gerade gelöscht oder umbenannt." -#: utils/init/postinit.c:1011 +#: utils/init/postinit.c:1047 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Das Datenbankunterverzeichnis »%s« fehlt." -#: utils/init/postinit.c:1016 -#, c-format -msgid "could not access directory \"%s\": %m" -msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" - #: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" @@ -26093,1949 +27151,2008 @@ msgstr "ungültige Byte-Sequenz für Kodierung »%s«: %s" msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "Zeichen mit Byte-Folge %s in Kodierung »%s« hat keine Entsprechung in Kodierung »%s«" -#: utils/misc/guc.c:718 +#: utils/misc/guc.c:776 msgid "Ungrouped" msgstr "Ungruppiert" -#: utils/misc/guc.c:720 +#: utils/misc/guc.c:778 msgid "File Locations" msgstr "Dateipfade" -#: utils/misc/guc.c:722 +#: utils/misc/guc.c:780 msgid "Connections and Authentication / Connection Settings" msgstr "Verbindungen und Authentifizierung / Verbindungseinstellungen" -#: utils/misc/guc.c:724 +#: utils/misc/guc.c:782 msgid "Connections and Authentication / Authentication" msgstr "Verbindungen und Authentifizierung / Authentifizierung" -#: utils/misc/guc.c:726 +#: utils/misc/guc.c:784 msgid "Connections and Authentication / SSL" msgstr "Verbindungen und Authentifizierung / SSL" -#: utils/misc/guc.c:728 +#: utils/misc/guc.c:786 msgid "Resource Usage / Memory" msgstr "Resourcenbenutzung / Speicher" -#: utils/misc/guc.c:730 +#: utils/misc/guc.c:788 msgid "Resource Usage / Disk" msgstr "Resourcenbenutzung / Festplatte" -#: utils/misc/guc.c:732 +#: utils/misc/guc.c:790 msgid "Resource Usage / Kernel Resources" msgstr "Resourcenbenutzung / Kernelresourcen" -#: utils/misc/guc.c:734 +#: utils/misc/guc.c:792 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Resourcenbenutzung / Kostenbasierte Vacuum-Verzögerung" -#: utils/misc/guc.c:736 +#: utils/misc/guc.c:794 msgid "Resource Usage / Background Writer" msgstr "Resourcenbenutzung / Background-Writer" -#: utils/misc/guc.c:738 +#: utils/misc/guc.c:796 msgid "Resource Usage / Asynchronous Behavior" msgstr "Resourcenbenutzung / Asynchrones Verhalten" -#: utils/misc/guc.c:740 +#: utils/misc/guc.c:798 msgid "Write-Ahead Log / Settings" msgstr "Write-Ahead-Log / Einstellungen" -#: utils/misc/guc.c:742 +#: utils/misc/guc.c:800 msgid "Write-Ahead Log / Checkpoints" msgstr "Write-Ahead-Log / Checkpoints" -#: utils/misc/guc.c:744 +#: utils/misc/guc.c:802 msgid "Write-Ahead Log / Archiving" msgstr "Write-Ahead-Log / Archivierung" -#: utils/misc/guc.c:746 +#: utils/misc/guc.c:804 +msgid "Write-Ahead Log / Recovery" +msgstr "Write-Ahead-Log / Wiederherstellung" + +#: utils/misc/guc.c:806 msgid "Write-Ahead Log / Archive Recovery" msgstr "Write-Ahead-Log / Archivwiederherstellung" -#: utils/misc/guc.c:748 +#: utils/misc/guc.c:808 msgid "Write-Ahead Log / Recovery Target" msgstr "Write-Ahead-Log / Wiederherstellungsziele" -#: utils/misc/guc.c:750 +#: utils/misc/guc.c:810 msgid "Replication / Sending Servers" msgstr "Replikation / sendende Server" -#: utils/misc/guc.c:752 +#: utils/misc/guc.c:812 msgid "Replication / Primary Server" msgstr "Replikation / Primärserver" -#: utils/misc/guc.c:754 +#: utils/misc/guc.c:814 msgid "Replication / Standby Servers" msgstr "Replikation / Standby-Server" -#: utils/misc/guc.c:756 +#: utils/misc/guc.c:816 msgid "Replication / Subscribers" msgstr "Replikation / Subskriptionsserver" -#: utils/misc/guc.c:758 +#: utils/misc/guc.c:818 msgid "Query Tuning / Planner Method Configuration" msgstr "Anfragetuning / Planermethoden" -#: utils/misc/guc.c:760 +#: utils/misc/guc.c:820 msgid "Query Tuning / Planner Cost Constants" msgstr "Anfragetuning / Planerkosten" -#: utils/misc/guc.c:762 +#: utils/misc/guc.c:822 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Anfragetuning / Genetischer Anfrageoptimierer" -#: utils/misc/guc.c:764 +#: utils/misc/guc.c:824 msgid "Query Tuning / Other Planner Options" msgstr "Anfragetuning / Andere Planeroptionen" -#: utils/misc/guc.c:766 +#: utils/misc/guc.c:826 msgid "Reporting and Logging / Where to Log" msgstr "Berichte und Logging / Wohin geloggt wird" -#: utils/misc/guc.c:768 +#: utils/misc/guc.c:828 msgid "Reporting and Logging / When to Log" msgstr "Berichte und Logging / Wann geloggt wird" -#: utils/misc/guc.c:770 +#: utils/misc/guc.c:830 msgid "Reporting and Logging / What to Log" msgstr "Berichte und Logging / Was geloggt wird" -#: utils/misc/guc.c:772 +#: utils/misc/guc.c:832 msgid "Reporting and Logging / Process Title" msgstr "Berichte und Logging / Prozesstitel" -#: utils/misc/guc.c:774 +#: utils/misc/guc.c:834 msgid "Statistics / Monitoring" msgstr "Statistiken / Überwachung" -#: utils/misc/guc.c:776 -msgid "Statistics / Query and Index Statistics Collector" +#: utils/misc/guc.c:836 +#, fuzzy +#| msgid "Statistics / Query and Index Statistics Collector" +msgid "Statistics / Cumulative Query and Index Statistics" msgstr "Statistiken / Statistiksammler für Anfragen und Indexe" -#: utils/misc/guc.c:778 +#: utils/misc/guc.c:838 msgid "Autovacuum" msgstr "Autovacuum" -#: utils/misc/guc.c:780 +#: utils/misc/guc.c:840 msgid "Client Connection Defaults / Statement Behavior" msgstr "Standardeinstellungen für Clientverbindungen / Anweisungsverhalten" -#: utils/misc/guc.c:782 +#: utils/misc/guc.c:842 msgid "Client Connection Defaults / Locale and Formatting" msgstr "Standardeinstellungen für Clientverbindungen / Locale und Formatierung" -#: utils/misc/guc.c:784 +#: utils/misc/guc.c:844 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "Standardeinstellungen für Clientverbindungen / Shared Library Preloading" -#: utils/misc/guc.c:786 +#: utils/misc/guc.c:846 msgid "Client Connection Defaults / Other Defaults" msgstr "Standardeinstellungen für Clientverbindungen / Andere" -#: utils/misc/guc.c:788 +#: utils/misc/guc.c:848 msgid "Lock Management" msgstr "Sperrenverwaltung" -#: utils/misc/guc.c:790 +#: utils/misc/guc.c:850 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Versions- und Plattformkompatibilität / Frühere PostgreSQL-Versionen" -#: utils/misc/guc.c:792 +#: utils/misc/guc.c:852 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "Versions- und Plattformkompatibilität / Andere Plattformen und Clients" -#: utils/misc/guc.c:794 +#: utils/misc/guc.c:854 msgid "Error Handling" msgstr "Fehlerbehandlung" -#: utils/misc/guc.c:796 +#: utils/misc/guc.c:856 msgid "Preset Options" msgstr "Voreingestellte Optionen" -#: utils/misc/guc.c:798 +#: utils/misc/guc.c:858 msgid "Customized Options" msgstr "Angepasste Optionen" -#: utils/misc/guc.c:800 +#: utils/misc/guc.c:860 msgid "Developer Options" msgstr "Entwickleroptionen" -#: utils/misc/guc.c:858 +#: utils/misc/guc.c:918 msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." msgstr "Gültige Einheiten für diesen Parameter sind »B«, »kB«, »MB«, »GB« und »TB«." -#: utils/misc/guc.c:895 +#: utils/misc/guc.c:955 msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." msgstr "Gültige Einheiten für diesen Parameter sind »us«, »ms«, »s«, »min«, »h« und »d«." -#: utils/misc/guc.c:957 +#: utils/misc/guc.c:1017 msgid "Enables the planner's use of sequential-scan plans." msgstr "Ermöglicht sequenzielle Scans in Planer." -#: utils/misc/guc.c:967 +#: utils/misc/guc.c:1027 msgid "Enables the planner's use of index-scan plans." msgstr "Ermöglicht Index-Scans im Planer." -#: utils/misc/guc.c:977 +#: utils/misc/guc.c:1037 msgid "Enables the planner's use of index-only-scan plans." msgstr "Ermöglicht Index-Only-Scans im Planer." -#: utils/misc/guc.c:987 +#: utils/misc/guc.c:1047 msgid "Enables the planner's use of bitmap-scan plans." msgstr "Ermöglicht Bitmap-Scans im Planer." -#: utils/misc/guc.c:997 +#: utils/misc/guc.c:1057 msgid "Enables the planner's use of TID scan plans." msgstr "Ermöglicht TID-Scans im Planer." -#: utils/misc/guc.c:1007 +#: utils/misc/guc.c:1067 msgid "Enables the planner's use of explicit sort steps." msgstr "Ermöglicht Sortierschritte im Planer." -#: utils/misc/guc.c:1017 +#: utils/misc/guc.c:1077 msgid "Enables the planner's use of incremental sort steps." msgstr "Ermöglicht inkrementelle Sortierschritte im Planer." -#: utils/misc/guc.c:1026 +#: utils/misc/guc.c:1087 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Ermöglicht Hash-Aggregierung im Planer." -#: utils/misc/guc.c:1036 +#: utils/misc/guc.c:1097 msgid "Enables the planner's use of materialization." msgstr "Ermöglicht Materialisierung im Planer." -#: utils/misc/guc.c:1046 -#, fuzzy -#| msgid "Enables the planner's use of parallel hash plans." -msgid "Enables the planner's use of result caching." -msgstr "Ermöglicht parallele Hash-Pläne im Planer." +#: utils/misc/guc.c:1107 +msgid "Enables the planner's use of memoization." +msgstr "Ermöglicht Memoization im Planer." -#: utils/misc/guc.c:1056 +#: utils/misc/guc.c:1117 msgid "Enables the planner's use of nested-loop join plans." msgstr "Ermöglicht Nested-Loop-Verbunde im Planer." -#: utils/misc/guc.c:1066 +#: utils/misc/guc.c:1127 msgid "Enables the planner's use of merge join plans." msgstr "Ermöglicht Merge-Verbunde im Planer." -#: utils/misc/guc.c:1076 +#: utils/misc/guc.c:1137 msgid "Enables the planner's use of hash join plans." msgstr "Ermöglicht Hash-Verbunde im Planer." -#: utils/misc/guc.c:1086 +#: utils/misc/guc.c:1147 msgid "Enables the planner's use of gather merge plans." msgstr "Ermöglicht Gather-Merge-Pläne im Planer." -#: utils/misc/guc.c:1096 +#: utils/misc/guc.c:1157 msgid "Enables partitionwise join." msgstr "Ermöglicht partitionsweise Verbunde." -#: utils/misc/guc.c:1106 +#: utils/misc/guc.c:1167 msgid "Enables partitionwise aggregation and grouping." msgstr "Ermöglicht partitionsweise Aggregierung und Gruppierung." -#: utils/misc/guc.c:1116 +#: utils/misc/guc.c:1177 msgid "Enables the planner's use of parallel append plans." msgstr "Ermöglicht parallele Append-Pläne im Planer." -#: utils/misc/guc.c:1126 +#: utils/misc/guc.c:1187 msgid "Enables the planner's use of parallel hash plans." msgstr "Ermöglicht parallele Hash-Pläne im Planer." -#: utils/misc/guc.c:1136 +#: utils/misc/guc.c:1197 msgid "Enables plan-time and execution-time partition pruning." msgstr "Ermöglicht Partition-Pruning zur Planzeit und zur Ausführungszeit." -#: utils/misc/guc.c:1137 +#: utils/misc/guc.c:1198 msgid "Allows the query planner and executor to compare partition bounds to conditions in the query to determine which partitions must be scanned." msgstr "Erlaubt es dem Planer und dem Executor, Partitionsbegrenzungen mit Bedingungen in der Anfrage zu vergleichen, um festzustellen, welche Partitionen gelesen werden müssen." -#: utils/misc/guc.c:1148 -#, fuzzy -#| msgid "Enables the planner's use of parallel append plans." +#: utils/misc/guc.c:1209 msgid "Enables the planner's use of async append plans." -msgstr "Ermöglicht parallele Append-Pläne im Planer." +msgstr "Ermöglicht asynchrone Append-Pläne im Planer." + +#: utils/misc/guc.c:1219 +msgid "enable reordering of GROUP BY key" +msgstr "" -#: utils/misc/guc.c:1158 +#: utils/misc/guc.c:1229 msgid "Enables genetic query optimization." msgstr "Ermöglicht genetische Anfrageoptimierung." -#: utils/misc/guc.c:1159 +#: utils/misc/guc.c:1230 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Dieser Algorithmus versucht das Planen ohne erschöpfende Suche durchzuführen." -#: utils/misc/guc.c:1170 +#: utils/misc/guc.c:1241 msgid "Shows whether the current user is a superuser." msgstr "Zeigt, ob der aktuelle Benutzer ein Superuser ist." -#: utils/misc/guc.c:1180 +#: utils/misc/guc.c:1251 msgid "Enables advertising the server via Bonjour." msgstr "Ermöglicht die Bekanntgabe des Servers mit Bonjour." -#: utils/misc/guc.c:1189 +#: utils/misc/guc.c:1260 msgid "Collects transaction commit time." msgstr "Sammelt Commit-Timestamps von Transaktionen." -#: utils/misc/guc.c:1198 +#: utils/misc/guc.c:1269 msgid "Enables SSL connections." msgstr "Ermöglicht SSL-Verbindungen." -#: utils/misc/guc.c:1207 -msgid "Also use ssl_passphrase_command during server reload." +#: utils/misc/guc.c:1278 +#, fuzzy +#| msgid "Also use ssl_passphrase_command during server reload." +msgid "Controls whether ssl_passphrase_command is called during server reload." msgstr "ssl_passphrase_command auch beim Neuladen des Servers verwenden." -#: utils/misc/guc.c:1216 +#: utils/misc/guc.c:1287 msgid "Give priority to server ciphersuite order." msgstr "Der Ciphersuite-Reihenfolge des Servers Vorrang geben." -#: utils/misc/guc.c:1225 +#: utils/misc/guc.c:1296 msgid "Forces synchronization of updates to disk." msgstr "Erzwingt die Synchronisierung von Aktualisierungen auf Festplatte." -#: utils/misc/guc.c:1226 +#: utils/misc/guc.c:1297 msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This insures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "Der Server verwendet den Systemaufruf fsync() an mehreren Stellen, um sicherzustellen, dass Datenänderungen physikalisch auf die Festplatte geschrieben werden. Das stellt sicher, dass der Datenbankcluster nach einem Betriebssystemabsturz oder Hardwarefehler in einem korrekten Zustand wiederhergestellt werden kann." -#: utils/misc/guc.c:1237 +#: utils/misc/guc.c:1308 msgid "Continues processing after a checksum failure." msgstr "Setzt die Verarbeitung trotz Prüfsummenfehler fort." -#: utils/misc/guc.c:1238 +#: utils/misc/guc.c:1309 msgid "Detection of a checksum failure normally causes PostgreSQL to report an error, aborting the current transaction. Setting ignore_checksum_failure to true causes the system to ignore the failure (but still report a warning), and continue processing. This behavior could cause crashes or other serious problems. Only has an effect if checksums are enabled." msgstr "Wenn eine fehlerhafte Prüfsumme entdeckt wird, gibt PostgreSQL normalerweise ein Fehler aus und bricht die aktuelle Transaktion ab. Wenn »ignore_checksum_failure« an ist, dann wird der Fehler ignoriert (aber trotzdem eine Warnung ausgegeben) und die Verarbeitung geht weiter. Dieses Verhalten kann Abstürze und andere ernsthafte Probleme verursachen. Es hat keine Auswirkungen, wenn Prüfsummen nicht eingeschaltet sind." -#: utils/misc/guc.c:1252 +#: utils/misc/guc.c:1323 msgid "Continues processing past damaged page headers." msgstr "Setzt die Verarbeitung trotz kaputter Seitenköpfe fort." -#: utils/misc/guc.c:1253 +#: utils/misc/guc.c:1324 msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting zero_damaged_pages to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." msgstr "Wenn ein kaputter Seitenkopf entdeckt wird, gibt PostgreSQL normalerweise einen Fehler aus und bricht die aktuelle Transaktion ab. Wenn »zero_damaged_pages« an ist, dann wird eine Warnung ausgegeben, die kaputte Seite mit Nullen gefüllt und die Verarbeitung geht weiter. Dieses Verhalten zerstört Daten, nämlich alle Zeilen in der kaputten Seite." -#: utils/misc/guc.c:1266 +#: utils/misc/guc.c:1337 msgid "Continues recovery after an invalid pages failure." msgstr "Setzt die Wiederherstellung trotz Fehler durch ungültige Seiten fort." -#: utils/misc/guc.c:1267 +#: utils/misc/guc.c:1338 msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting ignore_invalid_pages to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." msgstr "Wenn WAL-Einträge mit Verweisen auf ungültige Seiten bei der Wiederherstellung erkannt werden, verursacht das einen PANIC-Fehler, wodurch die Wiederherstellung abgebrochen wird. Wenn »ignore_invalid_pages« an ist, dann werden ungültige Seitenverweise in WAL-Einträgen ignoriert (aber trotzen eine Warnung ausgegeben) und die Wiederherstellung wird fortgesetzt. Dieses Verhalten kann Abstürze und Datenverlust verursachen, Datenverfälschung verbreiten oder verstecken sowie andere ernsthafte Probleme verursachen. Es hat nur Auswirkungen im Wiederherstellungs- oder Standby-Modus." -#: utils/misc/guc.c:1285 +#: utils/misc/guc.c:1356 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "Schreibt volle Seiten in den WAL, sobald sie nach einem Checkpoint geändert werden." -#: utils/misc/guc.c:1286 +#: utils/misc/guc.c:1357 msgid "A page write in process during an operating system crash might be only partially written to disk. During recovery, the row changes stored in WAL are not enough to recover. This option writes pages when first modified after a checkpoint to WAL so full recovery is possible." msgstr "Ein Seitenschreibvorgang während eines Betriebssystemabsturzes könnte eventuell nur teilweise geschrieben worden sein. Bei der Wiederherstellung sind die im WAL gespeicherten Zeilenänderungen nicht ausreichend. Diese Option schreibt Seiten, sobald sie nach einem Checkpoint geändert worden sind, damit eine volle Wiederherstellung möglich ist." -#: utils/misc/guc.c:1299 +#: utils/misc/guc.c:1370 msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." msgstr "Schreibt volle Seiten in den WAL, sobald sie nach einem Checkpoint geändert werden, auch für eine nicht kritische Änderung." -#: utils/misc/guc.c:1309 -msgid "Compresses full-page writes written in WAL file." -msgstr "Komprimiert in WAL-Dateien geschriebene volle Seiten." - -#: utils/misc/guc.c:1319 +#: utils/misc/guc.c:1380 msgid "Writes zeroes to new WAL files before first use." msgstr "Schreibt Nullen in neue WAL-Dateien vor der ersten Verwendung." -#: utils/misc/guc.c:1329 +#: utils/misc/guc.c:1390 msgid "Recycles WAL files by renaming them." msgstr "WAL-Dateien werden durch Umbenennen wiederverwendet." -#: utils/misc/guc.c:1339 +#: utils/misc/guc.c:1400 msgid "Logs each checkpoint." msgstr "Schreibt jeden Checkpoint in den Log." -#: utils/misc/guc.c:1348 +#: utils/misc/guc.c:1409 msgid "Logs each successful connection." msgstr "Schreibt jede erfolgreiche Verbindung in den Log." -#: utils/misc/guc.c:1357 +#: utils/misc/guc.c:1418 msgid "Logs end of a session, including duration." msgstr "Schreibt jedes Verbindungsende mit Sitzungszeit in den Log." -#: utils/misc/guc.c:1366 +#: utils/misc/guc.c:1427 msgid "Logs each replication command." msgstr "Schreibt jeden Replikationsbefehl in den Log." -#: utils/misc/guc.c:1375 +#: utils/misc/guc.c:1436 msgid "Shows whether the running server has assertion checks enabled." msgstr "Zeigt, ob der laufende Server Assertion-Prüfungen aktiviert hat." -#: utils/misc/guc.c:1390 +#: utils/misc/guc.c:1451 msgid "Terminate session on any error." msgstr "Sitzung bei jedem Fehler abbrechen." -#: utils/misc/guc.c:1399 +#: utils/misc/guc.c:1460 msgid "Reinitialize server after backend crash." msgstr "Server nach Absturz eines Serverprozesses reinitialisieren." -#: utils/misc/guc.c:1408 -#, fuzzy -#| msgid "Reinitialize server after backend crash." +#: utils/misc/guc.c:1469 msgid "Remove temporary files after backend crash." -msgstr "Server nach Absturz eines Serverprozesses reinitialisieren." +msgstr "Temporäre Dateien nach Absturz eines Serverprozesses löschen." -#: utils/misc/guc.c:1418 +#: utils/misc/guc.c:1480 msgid "Logs the duration of each completed SQL statement." msgstr "Loggt die Dauer jeder abgeschlossenen SQL-Anweisung." -#: utils/misc/guc.c:1427 +#: utils/misc/guc.c:1489 msgid "Logs each query's parse tree." msgstr "Scheibt den Parsebaum jeder Anfrage in den Log." -#: utils/misc/guc.c:1436 +#: utils/misc/guc.c:1498 msgid "Logs each query's rewritten parse tree." msgstr "Schreibt den umgeschriebenen Parsebaum jeder Anfrage in den Log." -#: utils/misc/guc.c:1445 +#: utils/misc/guc.c:1507 msgid "Logs each query's execution plan." msgstr "Schreibt den Ausführungsplan jeder Anfrage in den Log." -#: utils/misc/guc.c:1454 +#: utils/misc/guc.c:1516 msgid "Indents parse and plan tree displays." msgstr "Rückt die Anzeige von Parse- und Planbäumen ein." -#: utils/misc/guc.c:1463 +#: utils/misc/guc.c:1525 msgid "Writes parser performance statistics to the server log." msgstr "Schreibt Parser-Leistungsstatistiken in den Serverlog." -#: utils/misc/guc.c:1472 +#: utils/misc/guc.c:1534 msgid "Writes planner performance statistics to the server log." msgstr "Schreibt Planer-Leistungsstatistiken in den Serverlog." -#: utils/misc/guc.c:1481 +#: utils/misc/guc.c:1543 msgid "Writes executor performance statistics to the server log." msgstr "Schreibt Executor-Leistungsstatistiken in den Serverlog." -#: utils/misc/guc.c:1490 +#: utils/misc/guc.c:1552 msgid "Writes cumulative performance statistics to the server log." msgstr "Schreibt Gesamtleistungsstatistiken in den Serverlog." -#: utils/misc/guc.c:1500 +#: utils/misc/guc.c:1562 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "Loggt Statistiken über Systemressourcen (Speicher und CPU) während diverser B-Baum-Operationen." -#: utils/misc/guc.c:1512 +#: utils/misc/guc.c:1574 msgid "Collects information about executing commands." msgstr "Sammelt Informationen über ausgeführte Befehle." -#: utils/misc/guc.c:1513 +#: utils/misc/guc.c:1575 msgid "Enables the collection of information on the currently executing command of each session, along with the time at which that command began execution." msgstr "Schaltet die Sammlung von Informationen über den aktuell ausgeführten Befehl jeder Sitzung ein, einschließlich der Zeit, and dem die Befehlsausführung begann." -#: utils/misc/guc.c:1523 +#: utils/misc/guc.c:1585 msgid "Collects statistics on database activity." msgstr "Sammelt Statistiken über Datenbankaktivität." -#: utils/misc/guc.c:1532 +#: utils/misc/guc.c:1594 msgid "Collects timing statistics for database I/O activity." msgstr "Sammelt Zeitmessungsstatistiken über Datenbank-I/O-Aktivität." -#: utils/misc/guc.c:1541 -#, fuzzy -#| msgid "Collects timing statistics for database I/O activity." +#: utils/misc/guc.c:1603 msgid "Collects timing statistics for WAL I/O activity." -msgstr "Sammelt Zeitmessungsstatistiken über Datenbank-I/O-Aktivität." +msgstr "Sammelt Zeitmessungsstatistiken über WAL-I/O-Aktivität." -#: utils/misc/guc.c:1551 +#: utils/misc/guc.c:1613 msgid "Updates the process title to show the active SQL command." msgstr "Der Prozesstitel wird aktualisiert, um den aktuellen SQL-Befehl anzuzeigen." -#: utils/misc/guc.c:1552 +#: utils/misc/guc.c:1614 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "Ermöglicht das Aktualisieren des Prozesstitels bei jedem von Server empfangenen neuen SQL-Befehl." -#: utils/misc/guc.c:1565 +#: utils/misc/guc.c:1627 msgid "Starts the autovacuum subprocess." msgstr "Startet den Autovacuum-Prozess." -#: utils/misc/guc.c:1575 +#: utils/misc/guc.c:1637 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Erzeugt Debug-Ausgabe für LISTEN und NOTIFY." -#: utils/misc/guc.c:1587 +#: utils/misc/guc.c:1649 msgid "Emits information about lock usage." msgstr "Gibt Informationen über Sperrenverwendung aus." -#: utils/misc/guc.c:1597 +#: utils/misc/guc.c:1659 msgid "Emits information about user lock usage." msgstr "Gibt Informationen über Benutzersperrenverwendung aus." -#: utils/misc/guc.c:1607 +#: utils/misc/guc.c:1669 msgid "Emits information about lightweight lock usage." msgstr "Gibt Informationen über die Verwendung von Lightweight Locks aus." -#: utils/misc/guc.c:1617 +#: utils/misc/guc.c:1679 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "Gibt Informationen über alle aktuellen Sperren aus, wenn eine Verklemmung auftritt." -#: utils/misc/guc.c:1629 +#: utils/misc/guc.c:1691 msgid "Logs long lock waits." msgstr "Schreibt Meldungen über langes Warten auf Sperren in den Log." -#: utils/misc/guc.c:1638 -#, fuzzy -#| msgid "abort reason: recovery conflict" +#: utils/misc/guc.c:1700 msgid "Logs standby recovery conflict waits." -msgstr "Abbruchgrund: Konflikt bei Wiederherstellung" +msgstr "Schreibt Meldungen über Warten wegen Konflikten bei Wiederherstellung in den Log." -#: utils/misc/guc.c:1647 +#: utils/misc/guc.c:1709 msgid "Logs the host name in the connection logs." msgstr "Schreibt den Hostnamen jeder Verbindung in den Log." -#: utils/misc/guc.c:1648 +#: utils/misc/guc.c:1710 msgid "By default, connection logs only show the IP address of the connecting host. If you want them to show the host name you can turn this on, but depending on your host name resolution setup it might impose a non-negligible performance penalty." msgstr "In der Standardeinstellung zeigen die Verbindungslogs nur die IP-Adresse der Clienthosts. Wenn Sie den Hostnamen auch anzeigen wollen, dann können Sie diese Option anschalten, aber je nachdem, wie Ihr DNS eingerichtet ist, kann das die Leistung nicht unerheblich beeinträchtigen." -#: utils/misc/guc.c:1659 +#: utils/misc/guc.c:1721 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Behandelt »ausdruck=NULL« als »ausdruck IS NULL«." -#: utils/misc/guc.c:1660 +#: utils/misc/guc.c:1722 msgid "When turned on, expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL, that is, they return true if expr evaluates to the null value, and false otherwise. The correct behavior of expr = NULL is to always return null (unknown)." msgstr "Wenn an, dann werden Ausdrücke der Form ausdruck = NULL (oder NULL = ausdruck) wie ausdruck IS NULL behandelt, das heißt, sie ergeben wahr, wenn das Ergebnis von ausdruck der NULL-Wert ist, und ansonsten falsch. Das korrekte Verhalten von ausdruck = NULL ist immer den NULL-Wert (für unbekannt) zurückzugeben." -#: utils/misc/guc.c:1672 +#: utils/misc/guc.c:1734 msgid "Enables per-database user names." msgstr "Ermöglicht Datenbank-lokale Benutzernamen." -#: utils/misc/guc.c:1681 +#: utils/misc/guc.c:1743 msgid "Sets the default read-only status of new transactions." msgstr "Setzt den Standardwert für die Read-Only-Einstellung einer neuen Transaktion." -#: utils/misc/guc.c:1691 +#: utils/misc/guc.c:1753 msgid "Sets the current transaction's read-only status." msgstr "Setzt die Read-Only-Einstellung der aktuellen Transaktion." -#: utils/misc/guc.c:1701 +#: utils/misc/guc.c:1763 msgid "Sets the default deferrable status of new transactions." msgstr "Setzt den Standardwert für die Deferrable-Einstellung einer neuen Transaktion." -#: utils/misc/guc.c:1710 +#: utils/misc/guc.c:1772 msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." msgstr "Ob eine serialisierbare Read-Only-Transaktion aufgeschoben werden soll, bis sie ohne mögliche Serialisierungsfehler ausgeführt werden kann." -#: utils/misc/guc.c:1720 +#: utils/misc/guc.c:1782 msgid "Enable row security." msgstr "Schaltet Sicherheit auf Zeilenebene ein." -#: utils/misc/guc.c:1721 +#: utils/misc/guc.c:1783 msgid "When enabled, row security will be applied to all users." msgstr "Wenn eingeschaltet, wird Sicherheit auf Zeilenebene auf alle Benutzer angewendet." -#: utils/misc/guc.c:1729 +#: utils/misc/guc.c:1791 msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." msgstr "Prüft Funktionskörper bei der Ausführung von CREATE FUNCTION und CREATE PROCEDURE." -#: utils/misc/guc.c:1738 +#: utils/misc/guc.c:1800 msgid "Enable input of NULL elements in arrays." msgstr "Ermöglicht die Eingabe von NULL-Elementen in Arrays." -#: utils/misc/guc.c:1739 +#: utils/misc/guc.c:1801 msgid "When turned on, unquoted NULL in an array input value means a null value; otherwise it is taken literally." msgstr "Wenn dies eingeschaltet ist, wird ein nicht gequotetes NULL in einem Array-Eingabewert als NULL-Wert interpretiert, ansonsten als Zeichenkette." -#: utils/misc/guc.c:1755 +#: utils/misc/guc.c:1817 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS wird nicht mehr unterstützt; kann nur auf falsch gesetzt werden." -#: utils/misc/guc.c:1765 +#: utils/misc/guc.c:1827 msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "Startet einen Subprozess, um die Stderr-Ausgabe und/oder CSV-Logs in Logdateien auszugeben." -#: utils/misc/guc.c:1774 +#: utils/misc/guc.c:1836 msgid "Truncate existing log files of same name during log rotation." msgstr "Kürzt existierende Logdateien mit dem selben Namen beim Rotieren." -#: utils/misc/guc.c:1785 +#: utils/misc/guc.c:1847 msgid "Emit information about resource usage in sorting." msgstr "Gibt Informationen über die Ressourcenverwendung beim Sortieren aus." -#: utils/misc/guc.c:1799 +#: utils/misc/guc.c:1861 msgid "Generate debugging output for synchronized scanning." msgstr "Erzeugt Debug-Ausgabe für synchronisiertes Scannen." -#: utils/misc/guc.c:1814 +#: utils/misc/guc.c:1876 msgid "Enable bounded sorting using heap sort." msgstr "Ermöglicht Bounded Sorting mittels Heap-Sort." -#: utils/misc/guc.c:1827 +#: utils/misc/guc.c:1889 msgid "Emit WAL-related debugging output." msgstr "Gibt diverse Debug-Meldungen über WAL aus." -#: utils/misc/guc.c:1839 -#, fuzzy -#| msgid "Datetimes are integer based." +#: utils/misc/guc.c:1901 msgid "Shows whether datetimes are integer based." -msgstr "Datum/Zeit verwendet intern ganze Zahlen." +msgstr "Zeigt ob Datum/Zeit intern ganze Zahlen verwendet." -#: utils/misc/guc.c:1850 +#: utils/misc/guc.c:1912 msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgstr "Bestimmt, ob Groß-/Kleinschreibung bei Kerberos- und GSSAPI-Benutzernamen ignoriert werden soll." -#: utils/misc/guc.c:1860 +#: utils/misc/guc.c:1922 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Warnt bei Backslash-Escapes in normalen Zeichenkettenkonstanten." -#: utils/misc/guc.c:1870 +#: utils/misc/guc.c:1932 msgid "Causes '...' strings to treat backslashes literally." msgstr "Bewirkt, dass Zeichenketten der Art '...' Backslashes als normales Zeichen behandeln." -#: utils/misc/guc.c:1881 +#: utils/misc/guc.c:1943 msgid "Enable synchronized sequential scans." msgstr "Ermöglicht synchronisierte sequenzielle Scans." -#: utils/misc/guc.c:1891 +#: utils/misc/guc.c:1953 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "Setzt ob die Transaktion mit dem Wiederherstellungsziel einbezogen oder ausgeschlossen wird." -#: utils/misc/guc.c:1901 +#: utils/misc/guc.c:1963 msgid "Allows connections and queries during recovery." msgstr "Erlaubt Verbindungen und Anfragen während der Wiederherstellung." -#: utils/misc/guc.c:1911 +#: utils/misc/guc.c:1973 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "Erlaubt Rückmeldungen von einem Hot Standby an den Primärserver, um Anfragekonflikte zu vermeiden." -#: utils/misc/guc.c:1921 +#: utils/misc/guc.c:1983 msgid "Shows whether hot standby is currently active." msgstr "Zeigt, ob Hot Standby aktuell aktiv ist." -#: utils/misc/guc.c:1932 +#: utils/misc/guc.c:1994 msgid "Allows modifications of the structure of system tables." msgstr "Erlaubt Änderungen an der Struktur von Systemtabellen." -#: utils/misc/guc.c:1943 +#: utils/misc/guc.c:2005 msgid "Disables reading from system indexes." msgstr "Schaltet das Lesen aus Systemindexen ab." -#: utils/misc/guc.c:1944 +#: utils/misc/guc.c:2006 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "Das Aktualisieren der Indexe wird nicht verhindert, also ist die Verwendung unbedenklich. Schlimmstenfalls wird alles langsamer." -#: utils/misc/guc.c:1955 +#: utils/misc/guc.c:2017 +msgid "Allows tablespaces directly inside pg_tblspc, for testing." +msgstr "" + +#: utils/misc/guc.c:2028 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "Schaltet den rückwärtskompatiblen Modus für Privilegienprüfungen bei Large Objects ein." -#: utils/misc/guc.c:1956 +#: utils/misc/guc.c:2029 msgid "Skips privilege checks when reading or modifying large objects, for compatibility with PostgreSQL releases prior to 9.0." msgstr "Überspringt Privilegienprüfungen beim Lesen oder Ändern von Large Objects, zur Kompatibilität mit PostgreSQL-Versionen vor 9.0." -#: utils/misc/guc.c:1966 +#: utils/misc/guc.c:2039 msgid "When generating SQL fragments, quote all identifiers." msgstr "Wenn SQL-Fragmente erzeugt werden, alle Bezeichner quoten." -#: utils/misc/guc.c:1976 +#: utils/misc/guc.c:2049 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Zeigt, ob Datenprüfsummen in diesem Cluster angeschaltet sind." -#: utils/misc/guc.c:1987 +#: utils/misc/guc.c:2060 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "Syslog-Nachrichten mit Sequenznummern versehen, um Unterdrückung doppelter Nachrichten zu unterbinden." -#: utils/misc/guc.c:1997 +#: utils/misc/guc.c:2070 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "An Syslog gesendete Nachrichten nach Zeilen und in maximal 1024 Bytes aufteilen." -#: utils/misc/guc.c:2007 +#: utils/misc/guc.c:2080 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "Kontrolliert, ob Gather und Gather Merge auch Subpläne ausführen." -#: utils/misc/guc.c:2008 +#: utils/misc/guc.c:2081 msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "Sollen Gather-Knoten auch Subpläne ausführen oder nur Tupel sammeln?" -#: utils/misc/guc.c:2018 +#: utils/misc/guc.c:2091 msgid "Allow JIT compilation." msgstr "Erlaubt JIT-Kompilierung." -#: utils/misc/guc.c:2029 +#: utils/misc/guc.c:2102 msgid "Register JIT-compiled functions with debugger." msgstr "JIT-kompilierte Funktionen im Debugger registrieren." -#: utils/misc/guc.c:2046 +#: utils/misc/guc.c:2119 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "LLVM-Bitcode in Dateien schreiben, um Debuggen von JIT zu erleichtern." -#: utils/misc/guc.c:2057 +#: utils/misc/guc.c:2130 msgid "Allow JIT compilation of expressions." msgstr "Erlaubt JIT-Kompilierung von Ausdrücken." -#: utils/misc/guc.c:2068 +#: utils/misc/guc.c:2141 msgid "Register JIT-compiled functions with perf profiler." msgstr "JIT-kompilierte Funktionen im Profiler perf registrieren." -#: utils/misc/guc.c:2085 +#: utils/misc/guc.c:2158 msgid "Allow JIT compilation of tuple deforming." msgstr "Erlaubt JIT-Kompilierung von Tuple-Deforming." -#: utils/misc/guc.c:2096 +#: utils/misc/guc.c:2169 msgid "Whether to continue running after a failure to sync data files." msgstr "Ob nach fehlgeschlagenem Synchronisieren von Datendateien fortgesetzt werden soll." -#: utils/misc/guc.c:2105 +#: utils/misc/guc.c:2178 msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." msgstr "Bestimmt, ob der WAL-Receiver einen temporären Replikations-Slot erzeugen soll, wenn kein permanenter Slot konfiguriert ist." -#: utils/misc/guc.c:2123 -msgid "Forces a switch to the next WAL file if a new file has not been started within N seconds." -msgstr "Erzwingt das Umschalten zur nächsten WAL-Datei, wenn seit N Sekunden keine neue Datei begonnen worden ist." +#: utils/misc/guc.c:2196 +#, fuzzy +#| msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." +msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." +msgstr "Setzt die Zeit, die gewartet wird, bevor nach einem fehlgeschlagenen Versuch neue WAL-Daten angefordert werden." -#: utils/misc/guc.c:2134 -msgid "Waits N seconds on connection startup after authentication." -msgstr "Wartet beim Starten einer Verbindung N Sekunden nach der Authentifizierung." +#: utils/misc/guc.c:2207 +#, fuzzy +#| msgid "Sets the maximum time to wait for WAL replication." +msgid "Sets the amount of time to wait after authentication on connection startup." +msgstr "Setzt die maximale Zeit, um auf WAL-Replikation zu warten." -#: utils/misc/guc.c:2135 utils/misc/guc.c:2733 +#: utils/misc/guc.c:2209 utils/misc/guc.c:2830 msgid "This allows attaching a debugger to the process." msgstr "Das ermöglicht es, einen Debugger in den Prozess einzuhängen." -#: utils/misc/guc.c:2144 +#: utils/misc/guc.c:2218 msgid "Sets the default statistics target." msgstr "Setzt das voreingestellte Statistikziel." -#: utils/misc/guc.c:2145 +#: utils/misc/guc.c:2219 msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." msgstr "Diese Einstellung gilt für Tabellenspalten, für die kein spaltenspezifisches Ziel mit ALTER TABLE SET STATISTICS gesetzt worden ist." -#: utils/misc/guc.c:2154 +#: utils/misc/guc.c:2228 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "Setzt die Größe der FROM-Liste, ab der Unteranfragen nicht kollabiert werden." -#: utils/misc/guc.c:2156 +#: utils/misc/guc.c:2230 msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." msgstr "Der Planer bindet Unteranfragen in die übergeordneten Anfragen ein, wenn die daraus resultierende FROM-Liste nicht mehr als so viele Elemente haben würde." -#: utils/misc/guc.c:2167 +#: utils/misc/guc.c:2241 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "Setzt die Größe der FROM-Liste, ab der JOIN-Konstrukte nicht aufgelöst werden." -#: utils/misc/guc.c:2169 +#: utils/misc/guc.c:2243 msgid "The planner will flatten explicit JOIN constructs into lists of FROM items whenever a list of no more than this many items would result." msgstr "Der Planer löst ausdrückliche JOIN-Konstrukte in FROM-Listen auf, wenn die daraus resultierende FROM-Liste nicht mehr als so viele Elemente haben würde." -#: utils/misc/guc.c:2180 +#: utils/misc/guc.c:2254 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "Setzt die Anzahl der Elemente in der FROM-Liste, ab der GEQO verwendet wird." -#: utils/misc/guc.c:2190 +#: utils/misc/guc.c:2264 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: wird für die Berechnung der Vorgabewerte anderer GEQO-Parameter verwendet." -#: utils/misc/guc.c:2200 +#: utils/misc/guc.c:2274 msgid "GEQO: number of individuals in the population." msgstr "GEQO: Anzahl der Individien in der Bevölkerung." -#: utils/misc/guc.c:2201 utils/misc/guc.c:2211 +#: utils/misc/guc.c:2275 utils/misc/guc.c:2285 msgid "Zero selects a suitable default value." msgstr "Null wählt einen passenden Vorgabewert." -#: utils/misc/guc.c:2210 +#: utils/misc/guc.c:2284 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: Anzahl der Iterationen im Algorithmus." -#: utils/misc/guc.c:2222 +#: utils/misc/guc.c:2296 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Setzt die Zeit, die gewartet wird, bis auf Verklemmung geprüft wird." -#: utils/misc/guc.c:2233 +#: utils/misc/guc.c:2307 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "Setzt die maximale Verzögerung bevor Anfragen storniert werden, wenn ein Hot-Standby-Server archivierte WAL-Daten verarbeitet." -#: utils/misc/guc.c:2244 +#: utils/misc/guc.c:2318 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "Setzt die maximale Verzögerung bevor Anfragen storniert werden, wenn ein Hot-Standby-Server gestreamte WAL-Daten verarbeitet." -#: utils/misc/guc.c:2255 +#: utils/misc/guc.c:2329 msgid "Sets the minimum delay for applying changes during recovery." msgstr "Setzt die minimale Verzögerung für das Einspielen von Änderungen während der Wiederherstellung." -#: utils/misc/guc.c:2266 +#: utils/misc/guc.c:2340 msgid "Sets the maximum interval between WAL receiver status reports to the sending server." msgstr "Setzt das maximale Intervall zwischen Statusberichten des WAL-Receivers an den sendenden Server." -#: utils/misc/guc.c:2277 +#: utils/misc/guc.c:2351 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "Setzt die maximale Zeit, um auf den Empfang von Daten vom sendenden Server zu warten." -#: utils/misc/guc.c:2288 +#: utils/misc/guc.c:2362 msgid "Sets the maximum number of concurrent connections." msgstr "Setzt die maximale Anzahl gleichzeitiger Verbindungen." -#: utils/misc/guc.c:2299 +#: utils/misc/guc.c:2373 msgid "Sets the number of connection slots reserved for superusers." msgstr "Setzt die Anzahl der für Superuser reservierten Verbindungen." -#: utils/misc/guc.c:2309 -#, fuzzy -#| msgid "could not map dynamic shared memory segment" +#: utils/misc/guc.c:2383 msgid "Amount of dynamic shared memory reserved at startup." -msgstr "konnte dynamisches Shared-Memory-Segment nicht mappen" +msgstr "Menge des beim Start reservierten dynamischen Shared Memory." -#: utils/misc/guc.c:2324 +#: utils/misc/guc.c:2398 msgid "Sets the number of shared memory buffers used by the server." msgstr "Setzt die Anzahl der vom Server verwendeten Shared-Memory-Puffer." -#: utils/misc/guc.c:2335 +#: utils/misc/guc.c:2409 +msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." +msgstr "" + +#: utils/misc/guc.c:2420 +#, fuzzy +#| msgid "Sets the number of disk-page buffers in shared memory for WAL." +msgid "Shows the number of huge pages needed for the main shared memory area." +msgstr "Setzt die Anzahl Diskseitenpuffer für WAL im Shared Memory." + +#: utils/misc/guc.c:2421 +msgid "-1 indicates that the value could not be determined." +msgstr "" + +#: utils/misc/guc.c:2431 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Setzt die maximale Anzahl der von jeder Sitzung verwendeten temporären Puffer." -#: utils/misc/guc.c:2346 +#: utils/misc/guc.c:2442 msgid "Sets the TCP port the server listens on." msgstr "Setzt den TCP-Port, auf dem der Server auf Verbindungen wartet." -#: utils/misc/guc.c:2356 +#: utils/misc/guc.c:2452 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Setzt die Zugriffsrechte für die Unix-Domain-Socket." -#: utils/misc/guc.c:2357 +#: utils/misc/guc.c:2453 msgid "Unix-domain sockets use the usual Unix file system permission set. The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Unix-Domain-Sockets verwenden die üblichen Zugriffsrechte für Unix-Dateisysteme. Der Wert dieser Option muss ein numerischer Wert in der von den Systemaufrufen chmod und umask verwendeten Form sein. (Um das gebräuchliche Oktalformat zu verwenden, muss die Zahl mit 0 (einer Null) anfangen.)" -#: utils/misc/guc.c:2371 +#: utils/misc/guc.c:2467 msgid "Sets the file permissions for log files." msgstr "Setzt die Dateizugriffsrechte für Logdateien." -#: utils/misc/guc.c:2372 +#: utils/misc/guc.c:2468 msgid "The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Der Wert dieser Option muss ein numerischer Wert in der von den Systemaufrufen chmod und umask verwendeten Form sein. (Um das gebräuchliche Oktalformat zu verwenden, muss die Zahl mit 0 (einer Null) anfangen.)" -#: utils/misc/guc.c:2386 -#, fuzzy -#| msgid "Mode of the data directory." +#: utils/misc/guc.c:2482 msgid "Shows the mode of the data directory." -msgstr "Zugriffsrechte des Datenverzeichnisses." +msgstr "Zeigt die Zugriffsrechte des Datenverzeichnisses." -#: utils/misc/guc.c:2387 +#: utils/misc/guc.c:2483 msgid "The parameter value is a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Der Wert dieser Option muss ein numerischer Wert in der von den Systemaufrufen chmod und umask verwendeten Form sein. (Um das gebräuchliche Oktalformat zu verwenden, muss die Zahl mit 0 (einer Null) anfangen.)" -#: utils/misc/guc.c:2400 +#: utils/misc/guc.c:2496 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Setzt die maximale Speichergröße für Anfrage-Arbeitsbereiche." -#: utils/misc/guc.c:2401 +#: utils/misc/guc.c:2497 msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." msgstr "Gibt die Speichermenge an, die für interne Sortiervorgänge und Hashtabellen verwendet werden kann, bevor auf temporäre Dateien umgeschaltet wird." -#: utils/misc/guc.c:2413 +#: utils/misc/guc.c:2509 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Setzt die maximale Speichergröße für Wartungsoperationen." -#: utils/misc/guc.c:2414 +#: utils/misc/guc.c:2510 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Das schließt Operationen wie VACUUM und CREATE INDEX ein." -#: utils/misc/guc.c:2424 +#: utils/misc/guc.c:2520 msgid "Sets the maximum memory to be used for logical decoding." msgstr "Setzt die maximale Speichergröße für logische Dekodierung." -#: utils/misc/guc.c:2425 +#: utils/misc/guc.c:2521 msgid "This much memory can be used by each internal reorder buffer before spilling to disk." msgstr "Gibt die Speichermenge an, die für jeden internen Reorder-Puffer verwendet werden kann, bevor auf Festplatte ausgelagert wird." -#: utils/misc/guc.c:2441 +#: utils/misc/guc.c:2537 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Setzt die maximale Stackgröße, in Kilobytes." -#: utils/misc/guc.c:2452 +#: utils/misc/guc.c:2548 msgid "Limits the total size of all temporary files used by each process." msgstr "Beschränkt die Gesamtgröße aller temporären Dateien, die von einem Prozess verwendet werden." -#: utils/misc/guc.c:2453 +#: utils/misc/guc.c:2549 msgid "-1 means no limit." msgstr "-1 bedeutet keine Grenze." -#: utils/misc/guc.c:2463 +#: utils/misc/guc.c:2559 msgid "Vacuum cost for a page found in the buffer cache." msgstr "Vacuum-Kosten für eine im Puffer-Cache gefundene Seite." -#: utils/misc/guc.c:2473 +#: utils/misc/guc.c:2569 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "Vacuum-Kosten für eine nicht im Puffer-Cache gefundene Seite." -#: utils/misc/guc.c:2483 +#: utils/misc/guc.c:2579 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Vacuum-Kosten für eine durch Vacuum schmutzig gemachte Seite." -#: utils/misc/guc.c:2493 +#: utils/misc/guc.c:2589 msgid "Vacuum cost amount available before napping." msgstr "Verfügbare Vacuum-Kosten vor Nickerchen." -#: utils/misc/guc.c:2503 +#: utils/misc/guc.c:2599 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Verfügbare Vacuum-Kosten vor Nickerchen, für Autovacuum." -#: utils/misc/guc.c:2513 +#: utils/misc/guc.c:2609 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "Setzt die maximale Zahl gleichzeitig geöffneter Dateien für jeden Serverprozess." -#: utils/misc/guc.c:2526 +#: utils/misc/guc.c:2622 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Setzt die maximale Anzahl von gleichzeitig vorbereiteten Transaktionen." -#: utils/misc/guc.c:2537 +#: utils/misc/guc.c:2633 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Setzt die minimale Tabellen-OID für das Verfolgen von Sperren." -#: utils/misc/guc.c:2538 +#: utils/misc/guc.c:2634 msgid "Is used to avoid output on system tables." msgstr "Wird verwendet, um Ausgabe für Systemtabellen zu vermeiden." -#: utils/misc/guc.c:2547 +#: utils/misc/guc.c:2643 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Setzt die OID der Tabelle mit bedingungsloser Sperrenverfolgung." -#: utils/misc/guc.c:2559 +#: utils/misc/guc.c:2655 msgid "Sets the maximum allowed duration of any statement." msgstr "Setzt die maximal erlaubte Dauer jeder Anweisung." -#: utils/misc/guc.c:2560 utils/misc/guc.c:2571 utils/misc/guc.c:2582 -#: utils/misc/guc.c:2593 +#: utils/misc/guc.c:2656 utils/misc/guc.c:2667 utils/misc/guc.c:2678 +#: utils/misc/guc.c:2689 msgid "A value of 0 turns off the timeout." msgstr "Der Wert 0 schaltet die Zeitprüfung aus." -#: utils/misc/guc.c:2570 +#: utils/misc/guc.c:2666 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Setzt die maximal erlaubte Dauer, um auf eine Sperre zu warten." -#: utils/misc/guc.c:2581 -#, fuzzy -#| msgid "Sets the maximum allowed duration of any idling transaction." +#: utils/misc/guc.c:2677 msgid "Sets the maximum allowed idle time between queries, when in a transaction." -msgstr "Setzt die maximal erlaubte Dauer einer inaktiven Transaktion." +msgstr "Setzt die maximal erlaubte inaktive Zeit zwischen Anfragen, wenn in einer Transaktion." -#: utils/misc/guc.c:2592 -#, fuzzy -#| msgid "Sets the maximum allowed duration of any idling transaction." +#: utils/misc/guc.c:2688 msgid "Sets the maximum allowed idle time between queries, when not in a transaction." -msgstr "Setzt die maximal erlaubte Dauer einer inaktiven Transaktion." +msgstr "Setzt die maximal erlaubte inaktive Zeit zwischen Anfragen, wenn nicht in einer Transaktion." -#: utils/misc/guc.c:2603 +#: utils/misc/guc.c:2699 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "Mindestalter, bei dem VACUUM eine Tabellenzeile einfrieren soll." -#: utils/misc/guc.c:2613 +#: utils/misc/guc.c:2709 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "Alter, bei dem VACUUM die ganze Tabelle durchsuchen soll, um Zeilen einzufrieren." -#: utils/misc/guc.c:2623 +#: utils/misc/guc.c:2719 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "Mindestalter, bei dem VACUUM eine MultiXactId in einer Tabellenzeile einfrieren soll." -#: utils/misc/guc.c:2633 +#: utils/misc/guc.c:2729 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "Multixact-Alter, bei dem VACUUM die ganze Tabelle durchsuchen soll, um Zeilen einzufrieren." -#: utils/misc/guc.c:2643 +#: utils/misc/guc.c:2739 msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." msgstr "Anzahl Transaktionen, um die VACUUM- und HOT-Aufräumen aufgeschoben werden soll." -#: utils/misc/guc.c:2652 -#, fuzzy -#| msgid "Age at which VACUUM should scan whole table to freeze tuples." +#: utils/misc/guc.c:2748 msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." -msgstr "Alter, bei dem VACUUM die ganze Tabelle durchsuchen soll, um Zeilen einzufrieren." +msgstr "Alter, bei dem VACUUM die Ausfallsicherung auslösen soll, um Ausfall wegen Transaktionsnummernüberlauf zu verhindern." -#: utils/misc/guc.c:2661 -#, fuzzy -#| msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." +#: utils/misc/guc.c:2757 msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." -msgstr "Multixact-Alter, bei dem VACUUM die ganze Tabelle durchsuchen soll, um Zeilen einzufrieren." +msgstr "Multixact-Alter, bei dem VACUUM die Ausfallsicherung auslösen soll, um Ausfall wegen Transaktionsnummernüberlauf zu verhindern." -#: utils/misc/guc.c:2674 +#: utils/misc/guc.c:2770 msgid "Sets the maximum number of locks per transaction." msgstr "Setzt die maximale Anzahl Sperren pro Transaktion." -#: utils/misc/guc.c:2675 +#: utils/misc/guc.c:2771 msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." msgstr "Die globale Sperrentabelle wird mit der Annahme angelegt, das höchstens max_locks_per_transaction * max_connections verschiedene Objekte gleichzeitig gesperrt werden müssen." -#: utils/misc/guc.c:2686 +#: utils/misc/guc.c:2782 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Setzt die maximale Anzahl Prädikatsperren pro Transaktion." -#: utils/misc/guc.c:2687 +#: utils/misc/guc.c:2783 msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." msgstr "Die globale Prädikatsperrentabelle wird mit der Annahme angelegt, das höchstens max_pred_locks_per_transaction * max_connections verschiedene Objekte gleichzeitig gesperrt werden müssen." -#: utils/misc/guc.c:2698 +#: utils/misc/guc.c:2794 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "Setzt die maximale Anzahl Prädikatsperren für Seiten und Tupel pro Relation." -#: utils/misc/guc.c:2699 +#: utils/misc/guc.c:2795 msgid "If more than this total of pages and tuples in the same relation are locked by a connection, those locks are replaced by a relation-level lock." msgstr "Wenn mehr als diese Gesamtzahl Seiten und Tupel in der selben Relation von einer Verbindung gesperrt sind, werden diese Sperren durch eine Sperre auf Relationsebene ersetzt." -#: utils/misc/guc.c:2709 +#: utils/misc/guc.c:2805 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "Setzt die maximale Anzahl Prädikatsperren für Tupel pro Seite." -#: utils/misc/guc.c:2710 +#: utils/misc/guc.c:2806 msgid "If more than this number of tuples on the same page are locked by a connection, those locks are replaced by a page-level lock." msgstr "Wenn mehr als diese Anzahl Tupel auf der selben Seite von einer Verbindung gesperrt sind, werden diese Sperren durch eine Sperre auf Seitenebene ersetzt." -#: utils/misc/guc.c:2720 +#: utils/misc/guc.c:2816 msgid "Sets the maximum allowed time to complete client authentication." msgstr "Setzt die maximale Zeit, um die Client-Authentifizierung zu beenden." -#: utils/misc/guc.c:2732 -msgid "Waits N seconds on connection startup before authentication." -msgstr "Wartet beim Starten einer Verbindung N Sekunden vor der Authentifizierung." +#: utils/misc/guc.c:2828 +#, fuzzy +#| msgid "Sets the maximum time to wait for WAL replication." +msgid "Sets the amount of time to wait before authentication on connection startup." +msgstr "Setzt die maximale Zeit, um auf WAL-Replikation zu warten." + +#: utils/misc/guc.c:2840 +msgid "Maximum buffer size for reading ahead in the WAL during recovery." +msgstr "" -#: utils/misc/guc.c:2743 +#: utils/misc/guc.c:2841 +msgid "This controls the maximum distance we can read ahead in the WAL to prefetch referenced blocks." +msgstr "" + +#: utils/misc/guc.c:2851 msgid "Sets the size of WAL files held for standby servers." msgstr "Setzt die Größe der für Standby-Server vorgehaltenen WAL-Dateien." -#: utils/misc/guc.c:2754 +#: utils/misc/guc.c:2862 msgid "Sets the minimum size to shrink the WAL to." msgstr "Setzt die minimale Größe, auf die der WAL geschrumpft wird." -#: utils/misc/guc.c:2766 +#: utils/misc/guc.c:2874 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Setzt die WAL-Größe, die einen Checkpoint auslöst." -#: utils/misc/guc.c:2778 +#: utils/misc/guc.c:2886 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "Setzt die maximale Zeit zwischen automatischen WAL-Checkpoints." -#: utils/misc/guc.c:2789 -msgid "Enables warnings if checkpoint segments are filled more frequently than this." -msgstr "Schreibt eine Logmeldung, wenn Checkpoint-Segmente häufiger als dieser Wert gefüllt werden." +#: utils/misc/guc.c:2897 +msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." +msgstr "" -#: utils/misc/guc.c:2791 -msgid "Write a message to the server log if checkpoints caused by the filling of checkpoint segment files happens more frequently than this number of seconds. Zero turns off the warning." +#: utils/misc/guc.c:2899 +#, fuzzy +#| msgid "Write a message to the server log if checkpoints caused by the filling of checkpoint segment files happens more frequently than this number of seconds. Zero turns off the warning." +msgid "Write a message to the server log if checkpoints caused by the filling of WAL segment files happen more frequently than this amount of time. Zero turns off the warning." msgstr "Schreibe Meldung in den Serverlog, wenn Checkpoints, die durch Füllen der Checkpoint-Segmente ausgelöst werden, häufiger als dieser Wert in Sekunden passieren. Null schaltet die Warnung ab." -#: utils/misc/guc.c:2803 utils/misc/guc.c:3019 utils/misc/guc.c:3066 +#: utils/misc/guc.c:2912 utils/misc/guc.c:3130 utils/misc/guc.c:3178 msgid "Number of pages after which previously performed writes are flushed to disk." msgstr "Anzahl der Seiten, nach denen getätigte Schreibvorgänge auf die Festplatte zurückgeschrieben werden." -#: utils/misc/guc.c:2814 +#: utils/misc/guc.c:2923 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "Setzt die Anzahl Diskseitenpuffer für WAL im Shared Memory." -#: utils/misc/guc.c:2825 +#: utils/misc/guc.c:2934 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Zeit zwischen WAL-Flush-Operationen im WAL-Writer." -#: utils/misc/guc.c:2836 +#: utils/misc/guc.c:2945 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "Ein Flush wird ausgelöst, wenn diese Menge WAL vom WAL-Writer geschrieben worden ist." -#: utils/misc/guc.c:2847 -#, fuzzy -#| msgid "Size of new file to fsync instead of writing WAL." +#: utils/misc/guc.c:2956 msgid "Minimum size of new file to fsync instead of writing WAL." -msgstr "Größe ab der neue Datei gefsynct wird statt WAL zu schreiben." +msgstr "Mindestgröße ab der neue Datei gefsynct wird statt WAL zu schreiben." -#: utils/misc/guc.c:2858 +#: utils/misc/guc.c:2967 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "Setzt die maximale Anzahl gleichzeitig laufender WAL-Sender-Prozesse." -#: utils/misc/guc.c:2869 +#: utils/misc/guc.c:2978 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Setzt die maximale Anzahl von gleichzeitig definierten Replikations-Slots." -#: utils/misc/guc.c:2879 +#: utils/misc/guc.c:2988 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "Setzt die maximale WAL-Größe, die von Replikations-Slots reserviert werden kann." -#: utils/misc/guc.c:2880 +#: utils/misc/guc.c:2989 msgid "Replication slots will be marked as failed, and segments released for deletion or recycling, if this much space is occupied by WAL on disk." msgstr "Replikations-Slots werden als fehlgeschlagen markiert, und Segmente zum Löschen oder Wiederverwenden freigegeben, wenn so viel Platz von WAL auf der Festplatte belegt wird." -#: utils/misc/guc.c:2892 +#: utils/misc/guc.c:3001 msgid "Sets the maximum time to wait for WAL replication." msgstr "Setzt die maximale Zeit, um auf WAL-Replikation zu warten." -#: utils/misc/guc.c:2903 +#: utils/misc/guc.c:3012 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "Setzt die Verzögerung in Millisekunden zwischen Transaktionsabschluss und dem Schreiben von WAL auf die Festplatte." -#: utils/misc/guc.c:2915 -msgid "Sets the minimum concurrent open transactions before performing commit_delay." +#: utils/misc/guc.c:3024 +#, fuzzy +#| msgid "Sets the minimum concurrent open transactions before performing commit_delay." +msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." msgstr "Setzt die minimale Anzahl gleichzeitig offener Transaktionen bevor »commit_delay« angewendet wird." -#: utils/misc/guc.c:2926 +#: utils/misc/guc.c:3035 msgid "Sets the number of digits displayed for floating-point values." msgstr "Setzt die Anzahl ausgegebener Ziffern für Fließkommawerte." -#: utils/misc/guc.c:2927 +#: utils/misc/guc.c:3036 msgid "This affects real, double precision, and geometric data types. A zero or negative parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate). Any value greater than zero selects precise output mode." msgstr "Diese Einstellung betrifft real, double precision und geometrische Datentypen. Null oder ein negativer Parameterwert wird zur Standardziffernanzahl (FLT_DIG bzw. DBL_DIG) hinzuaddiert. Ein Wert größer als Null wählt präzisen Ausgabemodus." -#: utils/misc/guc.c:2939 +#: utils/misc/guc.c:3048 msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." msgstr "Setzt die minimale Ausführungszeit, über der Stichproben aller Anweisungen geloggt werden. Die Stichproben werden durch log_statement_sample_rate bestimmt." -#: utils/misc/guc.c:2942 +#: utils/misc/guc.c:3051 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "Null loggt eine Stichprobe aller Anfragen. -1 schaltet dieses Feature aus." -#: utils/misc/guc.c:2952 +#: utils/misc/guc.c:3061 msgid "Sets the minimum execution time above which all statements will be logged." msgstr "Setzt die minimale Ausführungszeit, über der alle Anweisungen geloggt werden." -#: utils/misc/guc.c:2954 +#: utils/misc/guc.c:3063 msgid "Zero prints all queries. -1 turns this feature off." msgstr "Null zeigt alle Anfragen. -1 schaltet dieses Feature aus." -#: utils/misc/guc.c:2964 +#: utils/misc/guc.c:3073 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "Setzt die minimale Ausführungszeit, über der Autovacuum-Aktionen geloggt werden." -#: utils/misc/guc.c:2966 +#: utils/misc/guc.c:3075 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "Null gibt alls Aktionen aus. -1 schaltet die Log-Aufzeichnung über Autovacuum aus." -#: utils/misc/guc.c:2976 -msgid "When logging statements, limit logged parameter values to first N bytes." -msgstr "Wenn Anweisungen geloggt werden, die geloggten Parameterwerte auf die ersten N Bytes begrenzen." +#: utils/misc/guc.c:3085 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." +msgstr "" -#: utils/misc/guc.c:2977 utils/misc/guc.c:2988 +#: utils/misc/guc.c:3087 utils/misc/guc.c:3099 msgid "-1 to print values in full." msgstr "-1 um die Werte vollständig auszugeben." -#: utils/misc/guc.c:2987 -msgid "When reporting an error, limit logged parameter values to first N bytes." -msgstr "Wenn ein Fehler ausgegeben wird, die geloggten Parameterwerte auf die ersten N Bytes begrenzen." +#: utils/misc/guc.c:3097 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." +msgstr "" -#: utils/misc/guc.c:2998 +#: utils/misc/guc.c:3109 msgid "Background writer sleep time between rounds." msgstr "Schlafzeit zwischen Durchläufen des Background-Writers." -#: utils/misc/guc.c:3009 +#: utils/misc/guc.c:3120 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "Maximale Anzahl der vom Background-Writer pro Durchlauf zu flushenden LRU-Seiten." -#: utils/misc/guc.c:3032 +#: utils/misc/guc.c:3143 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "Anzahl simultaner Anfragen, die das Festplattensubsystem effizient bearbeiten kann." -#: utils/misc/guc.c:3050 +#: utils/misc/guc.c:3161 msgid "A variant of effective_io_concurrency that is used for maintenance work." msgstr "Eine Variante von effective_io_concurrency, die für Wartungsarbeiten verwendet wird." -#: utils/misc/guc.c:3079 +#: utils/misc/guc.c:3191 msgid "Maximum number of concurrent worker processes." msgstr "Maximale Anzahl gleichzeitiger Worker-Prozesse." -#: utils/misc/guc.c:3091 +#: utils/misc/guc.c:3203 msgid "Maximum number of logical replication worker processes." msgstr "Maximale Anzahl Arbeitsprozesse für logische Replikation." -#: utils/misc/guc.c:3103 +#: utils/misc/guc.c:3215 msgid "Maximum number of table synchronization workers per subscription." msgstr "Maximale Anzahl Arbeitsprozesse für Tabellensynchronisation pro Subskription." -#: utils/misc/guc.c:3113 -msgid "Automatic log file rotation will occur after N minutes." -msgstr "Automatische Rotation der Logdateien geschieht nach N Minuten." +#: utils/misc/guc.c:3225 +#, fuzzy +#| msgid "Sets the maximum time to wait for WAL replication." +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "Setzt die maximale Zeit, um auf WAL-Replikation zu warten." -#: utils/misc/guc.c:3124 -msgid "Automatic log file rotation will occur after N kilobytes." -msgstr "Automatische Rotation der Logdateien geschieht nach N Kilobytes." +#: utils/misc/guc.c:3237 +#, fuzzy +#| msgid "Sets the maximum WAL size that can be reserved by replication slots." +msgid "Sets the maximum size a log file can reach before being rotated." +msgstr "Setzt die maximale WAL-Größe, die von Replikations-Slots reserviert werden kann." -#: utils/misc/guc.c:3135 +#: utils/misc/guc.c:3249 msgid "Shows the maximum number of function arguments." msgstr "Setzt die maximale Anzahl von Funktionsargumenten." -#: utils/misc/guc.c:3146 +#: utils/misc/guc.c:3260 msgid "Shows the maximum number of index keys." msgstr "Zeigt die maximale Anzahl von Indexschlüsseln." -#: utils/misc/guc.c:3157 +#: utils/misc/guc.c:3271 msgid "Shows the maximum identifier length." msgstr "Zeigt die maximale Länge von Bezeichnern." -#: utils/misc/guc.c:3168 +#: utils/misc/guc.c:3282 msgid "Shows the size of a disk block." msgstr "Zeigt die Größe eines Diskblocks." -#: utils/misc/guc.c:3179 +#: utils/misc/guc.c:3293 msgid "Shows the number of pages per disk file." msgstr "Zeigt die Anzahl Seiten pro Diskdatei." -#: utils/misc/guc.c:3190 +#: utils/misc/guc.c:3304 msgid "Shows the block size in the write ahead log." msgstr "Zeigt die Blockgröße im Write-Ahead-Log." -#: utils/misc/guc.c:3201 +#: utils/misc/guc.c:3315 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "Setzt die Zeit, die gewartet wird, bevor nach einem fehlgeschlagenen Versuch neue WAL-Daten angefordert werden." -#: utils/misc/guc.c:3213 +#: utils/misc/guc.c:3327 msgid "Shows the size of write ahead log segments." msgstr "Zeigt die Größe eines Write-Ahead-Log-Segments." -#: utils/misc/guc.c:3226 +#: utils/misc/guc.c:3340 msgid "Time to sleep between autovacuum runs." msgstr "Wartezeit zwischen Autovacuum-Durchläufen." -#: utils/misc/guc.c:3236 +#: utils/misc/guc.c:3350 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Mindestanzahl an geänderten oder gelöschten Tupeln vor einem Vacuum." -#: utils/misc/guc.c:3245 +#: utils/misc/guc.c:3359 msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." msgstr "Mindestanzahl an Einfügeoperationen vor einem Vacuum, oder -1 um auszuschalten." -#: utils/misc/guc.c:3254 +#: utils/misc/guc.c:3368 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "Mindestanzahl an Einfüge-, Änderungs- oder Löschoperationen vor einem Analyze." -#: utils/misc/guc.c:3264 +#: utils/misc/guc.c:3378 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "Alter, nach dem eine Tabelle automatisch gevacuumt wird, um Transaktionsnummernüberlauf zu verhindern." -#: utils/misc/guc.c:3279 +#: utils/misc/guc.c:3390 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "Multixact-Alter, nach dem eine Tabelle automatisch gevacuumt wird, um Transaktionsnummernüberlauf zu verhindern." -#: utils/misc/guc.c:3289 +#: utils/misc/guc.c:3400 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "Setzt die maximale Anzahl gleichzeitig laufender Autovacuum-Worker-Prozesse." -#: utils/misc/guc.c:3299 +#: utils/misc/guc.c:3410 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "Setzt die maximale Anzahl paralleler Prozesse pro Wartungsoperation." -#: utils/misc/guc.c:3309 +#: utils/misc/guc.c:3420 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Setzt die maximale Anzahl paralleler Prozesse pro Executor-Knoten." -#: utils/misc/guc.c:3320 +#: utils/misc/guc.c:3431 msgid "Sets the maximum number of parallel workers that can be active at one time." msgstr "Setzt die maximale Anzahl paralleler Arbeitsprozesse, die gleichzeitig aktiv sein können." -#: utils/misc/guc.c:3331 +#: utils/misc/guc.c:3442 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "Setzt die maximale Speichergröße für jeden Autovacuum-Worker-Prozess." -#: utils/misc/guc.c:3342 +#: utils/misc/guc.c:3453 msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." msgstr "Zeit bevor ein Snapshot zu alt ist, um Seiten zu lesen, die geändert wurden, nachdem der Snapshot gemacht wurde." -#: utils/misc/guc.c:3343 +#: utils/misc/guc.c:3454 msgid "A value of -1 disables this feature." msgstr "Der Wert -1 schaltet dieses Feature aus." -#: utils/misc/guc.c:3353 +#: utils/misc/guc.c:3464 msgid "Time between issuing TCP keepalives." msgstr "Zeit zwischen TCP-Keepalive-Sendungen." -#: utils/misc/guc.c:3354 utils/misc/guc.c:3365 utils/misc/guc.c:3489 +#: utils/misc/guc.c:3465 utils/misc/guc.c:3476 utils/misc/guc.c:3600 msgid "A value of 0 uses the system default." msgstr "Der Wert 0 verwendet die Systemvoreinstellung." -#: utils/misc/guc.c:3364 +#: utils/misc/guc.c:3475 msgid "Time between TCP keepalive retransmits." msgstr "Zeit zwischen TCP-Keepalive-Neuübertragungen." -#: utils/misc/guc.c:3375 +#: utils/misc/guc.c:3486 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "SSL-Renegotiation wird nicht mehr unterstützt; kann nur auf 0 gesetzt werden." -#: utils/misc/guc.c:3386 +#: utils/misc/guc.c:3497 msgid "Maximum number of TCP keepalive retransmits." msgstr "Maximale Anzahl an TCP-Keepalive-Neuübertragungen." -#: utils/misc/guc.c:3387 +#: utils/misc/guc.c:3498 msgid "This controls the number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." msgstr "Dies bestimmt die Anzahl von aufeinanderfolgenden Keepalive-Neuübertragungen, die verloren gehen dürfen, bis die Verbindung als tot betrachtet wird. Der Wert 0 verwendet die Betriebssystemvoreinstellung." -#: utils/misc/guc.c:3398 +#: utils/misc/guc.c:3509 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "Setzt die maximal erlaubte Anzahl Ergebnisse für eine genaue Suche mit GIN." -#: utils/misc/guc.c:3409 +#: utils/misc/guc.c:3520 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "Setzt die Annahme des Planers über die Gesamtgröße der Daten-Caches." -#: utils/misc/guc.c:3410 +#: utils/misc/guc.c:3521 msgid "That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." msgstr "Das heißt, die Gesamtgröße der Caches (Kernel-Cache und Shared Buffers), die für Datendateien von PostgreSQL verwendet wird. Das wird in Diskseiten gemessen, welche normalerweise 8 kB groß sind." -#: utils/misc/guc.c:3421 +#: utils/misc/guc.c:3532 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "Setzt die Mindestmenge an Tabellendaten für einen parallelen Scan." -#: utils/misc/guc.c:3422 +#: utils/misc/guc.c:3533 msgid "If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered." msgstr "Wenn der Planer schätzt, dass zu wenige Tabellenseiten gelesen werden werden um diesen Wert zu erreichen, dann wird kein paralleler Scan in Erwägung gezogen werden." -#: utils/misc/guc.c:3432 +#: utils/misc/guc.c:3543 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "Setzt die Mindestmenge an Indexdaten für einen parallelen Scan." -#: utils/misc/guc.c:3433 +#: utils/misc/guc.c:3544 msgid "If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered." msgstr "Wenn der Planer schätzt, dass zu wenige Indexseiten gelesen werden werden um diesen Wert zu erreichen, dann wird kein paralleler Scan in Erwägung gezogen werden." -#: utils/misc/guc.c:3444 +#: utils/misc/guc.c:3555 msgid "Shows the server version as an integer." msgstr "Zeigt die Serverversion als Zahl." -#: utils/misc/guc.c:3455 +#: utils/misc/guc.c:3566 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "Schreibt Meldungen über die Verwendung von temporären Dateien in den Log, wenn sie größer als diese Anzahl an Kilobytes sind." -#: utils/misc/guc.c:3456 +#: utils/misc/guc.c:3567 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "Null loggt alle Dateien. Die Standardeinstellung ist -1 (wodurch dieses Feature ausgeschaltet wird)." -#: utils/misc/guc.c:3466 +#: utils/misc/guc.c:3577 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Setzt die für pg_stat_activity.query reservierte Größe, in Bytes." -#: utils/misc/guc.c:3477 +#: utils/misc/guc.c:3588 msgid "Sets the maximum size of the pending list for GIN index." msgstr "Setzt die maximale Größe der Pending-Liste eines GIN-Index." -#: utils/misc/guc.c:3488 +#: utils/misc/guc.c:3599 msgid "TCP user timeout." msgstr "TCP-User-Timeout." -#: utils/misc/guc.c:3499 +#: utils/misc/guc.c:3610 msgid "The size of huge page that should be requested." -msgstr "" +msgstr "Huge-Page-Größe, die angefordert werden soll." -#: utils/misc/guc.c:3510 -msgid "Aggressively invalidate system caches for debugging purposes." +#: utils/misc/guc.c:3621 +msgid "Aggressively flush system caches for debugging purposes." +msgstr "System-Caches aggressiv flushen, zum Debuggen." + +#: utils/misc/guc.c:3644 +msgid "Sets the time interval between checks for disconnection while running queries." +msgstr "Setzt das Zeitintervall zwischen Prüfungen auf Verbindungsabbruch während Anfragen laufen." + +#: utils/misc/guc.c:3655 +msgid "Time between progress updates for long-running startup operations." msgstr "" -#: utils/misc/guc.c:3533 +#: utils/misc/guc.c:3657 #, fuzzy -#| msgid "Sets the maximum interval between WAL receiver status reports to the sending server." -msgid "Sets the time interval between checks for disconnection while running queries." -msgstr "Setzt das maximale Intervall zwischen Statusberichten des WAL-Receivers an den sendenden Server." +#| msgid "Zero prints all queries. -1 turns this feature off." +msgid "0 turns this feature off." +msgstr "Null zeigt alle Anfragen. -1 schaltet dieses Feature aus." -#: utils/misc/guc.c:3553 +#: utils/misc/guc.c:3676 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "Setzt den vom Planer geschätzten Aufwand, um eine sequenzielle Diskseite zu lesen." -#: utils/misc/guc.c:3564 +#: utils/misc/guc.c:3687 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "Setzt den vom Planer geschätzten Aufwand, um eine nichtsequenzielle Diskseite zu lesen." -#: utils/misc/guc.c:3575 +#: utils/misc/guc.c:3698 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "Setzt den vom Planer geschätzten Aufwand für die Verarbeitung einer Zeile." -#: utils/misc/guc.c:3586 +#: utils/misc/guc.c:3709 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." msgstr "Setzt den vom Planer geschätzten Aufwand für die Verarbeitung eines Indexeintrags während eines Index-Scans." -#: utils/misc/guc.c:3597 +#: utils/misc/guc.c:3720 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "Setzt den vom Planer geschätzten Aufwand für die Verarbeitung eines Operators oder Funktionsaufrufs." -#: utils/misc/guc.c:3608 -#, fuzzy -#| msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to master backend." +#: utils/misc/guc.c:3731 msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." -msgstr "Setzt den vom Planer geschätzten Aufwand, um eine Zeile vom Arbeitsprozess and das Master-Backend zu senden." +msgstr "Setzt den vom Planer geschätzten Aufwand, um eine Zeile vom Arbeitsprozess an das Leader-Backend zu senden." -#: utils/misc/guc.c:3619 +#: utils/misc/guc.c:3742 msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." msgstr "Setzt den vom Planer geschätzten Aufwand für das Starten von Arbeitsprozessen für parallele Anfragen." -#: utils/misc/guc.c:3631 +#: utils/misc/guc.c:3754 msgid "Perform JIT compilation if query is more expensive." msgstr "JIT-Kompilierung durchführen, wenn die Anfrage teurer ist." -#: utils/misc/guc.c:3632 +#: utils/misc/guc.c:3755 msgid "-1 disables JIT compilation." msgstr "-1 schaltet JIT-Kompilierung aus." -#: utils/misc/guc.c:3642 +#: utils/misc/guc.c:3765 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "JIT-kompilierte Funktionen optimieren, wenn die Anfrage teurer ist." -#: utils/misc/guc.c:3643 +#: utils/misc/guc.c:3766 msgid "-1 disables optimization." msgstr "-1 schaltet Optimierung aus." -#: utils/misc/guc.c:3653 +#: utils/misc/guc.c:3776 msgid "Perform JIT inlining if query is more expensive." msgstr "JIT-Inlining durchführen, wenn die Anfrage teurer ist." -#: utils/misc/guc.c:3654 +#: utils/misc/guc.c:3777 msgid "-1 disables inlining." msgstr "-1 schaltet Inlining aus." -#: utils/misc/guc.c:3664 +#: utils/misc/guc.c:3787 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgstr "Setzt den vom Planer geschätzten Anteil der Cursor-Zeilen, die ausgelesen werden werden." -#: utils/misc/guc.c:3676 +#: utils/misc/guc.c:3799 +#, fuzzy +#| msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." +msgid "Sets the planner's estimate of the average size of a recursive query's working table." +msgstr "Setzt den vom Planer geschätzten Anteil der Cursor-Zeilen, die ausgelesen werden werden." + +#: utils/misc/guc.c:3811 msgid "GEQO: selective pressure within the population." msgstr "GEQO: selektiver Auswahldruck in der Bevölkerung." -#: utils/misc/guc.c:3687 +#: utils/misc/guc.c:3822 msgid "GEQO: seed for random path selection." msgstr "GEQO: Ausgangswert für die zufällige Pfadauswahl." -#: utils/misc/guc.c:3698 +#: utils/misc/guc.c:3833 msgid "Multiple of work_mem to use for hash tables." msgstr "Vielfaches von work_mem zur Verwendung bei Hash-Tabellen." -#: utils/misc/guc.c:3709 +#: utils/misc/guc.c:3844 msgid "Multiple of the average buffer usage to free per round." msgstr "Vielfaches der durchschnittlichen freizugebenden Pufferverwendung pro Runde." -#: utils/misc/guc.c:3719 +#: utils/misc/guc.c:3854 msgid "Sets the seed for random-number generation." msgstr "Setzt den Ausgangswert für die Zufallszahlenerzeugung." -#: utils/misc/guc.c:3730 +#: utils/misc/guc.c:3865 msgid "Vacuum cost delay in milliseconds." msgstr "Vacuum-Kosten-Verzögerung in Millisekunden." -#: utils/misc/guc.c:3741 +#: utils/misc/guc.c:3876 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Vacuum-Kosten-Verzögerung in Millisekunden, für Autovacuum." -#: utils/misc/guc.c:3752 +#: utils/misc/guc.c:3887 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "Anzahl geänderter oder gelöschter Tupel vor einem Vacuum, relativ zu reltuples." -#: utils/misc/guc.c:3762 +#: utils/misc/guc.c:3897 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "Anzahl eingefügter Tupel vor einem Vacuum, relativ zu reltuples." -#: utils/misc/guc.c:3772 +#: utils/misc/guc.c:3907 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "Anzahl eingefügter, geänderter oder gelöschter Tupel vor einem Analyze, relativ zu reltuples." -#: utils/misc/guc.c:3782 +#: utils/misc/guc.c:3917 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." msgstr "Zeit, die damit verbracht wird, modifizierte Puffer während eines Checkpoints zurückzuschreiben, als Bruchteil des Checkpoint-Intervalls." -#: utils/misc/guc.c:3792 +#: utils/misc/guc.c:3927 msgid "Fraction of statements exceeding log_min_duration_sample to be logged." msgstr "Anteil der zu loggenden Anweisungen, die log_min_duration_sample überschreiten." -#: utils/misc/guc.c:3793 +#: utils/misc/guc.c:3928 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "Verwenden Sie einen Wert zwischen 0.0 (nie loggen) und 1.0 (immer loggen)." -#: utils/misc/guc.c:3802 -#, fuzzy -#| msgid "Sets the fraction of transactions to log for new transactions." +#: utils/misc/guc.c:3937 msgid "Sets the fraction of transactions from which to log all statements." -msgstr "Setzt den Bruchteil zu loggender Transaktionen." +msgstr "Setzt den Bruchteil der Transaktionen, aus denen alle Anweisungen geloggt werden." -#: utils/misc/guc.c:3803 -#, fuzzy -#| msgid "Logs all statements from a fraction of transactions. Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." +#: utils/misc/guc.c:3938 msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." -msgstr "Loggt alle Anweisungen in einem Bruchteil der Transaktionen. Verwenden Sie einen Wert zwischen 0.0 (nie loggen) und 1.0 (alle Anweisungen für alle Transaktionen loggen)." +msgstr "Verwenden Sie einen Wert zwischen 0.0 (nie loggen) und 1.0 (alle Anweisungen für alle Transaktionen loggen)." + +#: utils/misc/guc.c:3957 +msgid "Sets the shell command that will be called to archive a WAL file." +msgstr "Setzt den Shell-Befehl, der aufgerufen wird, um eine WAL-Datei zu archivieren." + +#: utils/misc/guc.c:3958 +msgid "This is used only if \"archive_library\" is not set." +msgstr "" -#: utils/misc/guc.c:3822 -msgid "Sets the shell command that will be called to archive a WAL file." +#: utils/misc/guc.c:3967 +#, fuzzy +#| msgid "Sets the shell command that will be called to archive a WAL file." +msgid "Sets the library that will be called to archive a WAL file." msgstr "Setzt den Shell-Befehl, der aufgerufen wird, um eine WAL-Datei zu archivieren." -#: utils/misc/guc.c:3832 +#: utils/misc/guc.c:3968 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "" + +#: utils/misc/guc.c:3977 msgid "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "Setzt den Shell-Befehl, der aufgerufen wird, um eine archivierte WAL-Datei zurückzuholen." -#: utils/misc/guc.c:3842 +#: utils/misc/guc.c:3987 msgid "Sets the shell command that will be executed at every restart point." msgstr "Setzt den Shell-Befehl, der bei jedem Restart-Punkt ausgeführt wird." -#: utils/misc/guc.c:3852 +#: utils/misc/guc.c:3997 msgid "Sets the shell command that will be executed once at the end of recovery." msgstr "Setzt den Shell-Befehl, der einmal am Ende der Wiederherstellung ausgeführt wird." -#: utils/misc/guc.c:3862 +#: utils/misc/guc.c:4007 msgid "Specifies the timeline to recover into." msgstr "Gibt die Zeitleiste für die Wiederherstellung an." -#: utils/misc/guc.c:3872 +#: utils/misc/guc.c:4017 msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." msgstr "Auf »immediate« setzen, um die Wiederherstellung zu beenden, sobald ein konsistenter Zustand erreicht ist." -#: utils/misc/guc.c:3881 +#: utils/misc/guc.c:4026 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "Setzt die Transaktions-ID, bis zu der die Wiederherstellung voranschreiten wird." -#: utils/misc/guc.c:3890 +#: utils/misc/guc.c:4035 msgid "Sets the time stamp up to which recovery will proceed." msgstr "Setzt den Zeitstempel, bis zu dem die Wiederherstellung voranschreiten wird." -#: utils/misc/guc.c:3899 +#: utils/misc/guc.c:4044 msgid "Sets the named restore point up to which recovery will proceed." msgstr "Setzt den benannten Restore-Punkt, bis zu dem die Wiederherstellung voranschreiten wird." -#: utils/misc/guc.c:3908 +#: utils/misc/guc.c:4053 msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." msgstr "Setzt die LSN der Write-Ahead-Log-Position, bis zu der die Wiederherstellung voranschreiten wird." -#: utils/misc/guc.c:3918 +#: utils/misc/guc.c:4063 msgid "Specifies a file name whose presence ends recovery in the standby." msgstr "Gibt einen Dateinamen an, dessen Präsenz die Wiederherstellung im Standby beendet." -#: utils/misc/guc.c:3928 +#: utils/misc/guc.c:4073 msgid "Sets the connection string to be used to connect to the sending server." msgstr "Setzt die Verbindungszeichenkette zur Verbindung mit dem sendenden Server." -#: utils/misc/guc.c:3939 +#: utils/misc/guc.c:4084 msgid "Sets the name of the replication slot to use on the sending server." msgstr "Setzt den Namen des zu verwendenden Replikations-Slots auf dem sendenden Server." -#: utils/misc/guc.c:3949 +#: utils/misc/guc.c:4094 msgid "Sets the client's character set encoding." msgstr "Setzt die Zeichensatzkodierung des Clients." -#: utils/misc/guc.c:3960 +#: utils/misc/guc.c:4105 msgid "Controls information prefixed to each log line." msgstr "Bestimmt die Informationen, die vor jede Logzeile geschrieben werden." -#: utils/misc/guc.c:3961 +#: utils/misc/guc.c:4106 msgid "If blank, no prefix is used." msgstr "Wenn leer, dann wird kein Präfix verwendet." -#: utils/misc/guc.c:3970 +#: utils/misc/guc.c:4115 msgid "Sets the time zone to use in log messages." msgstr "Setzt die in Logmeldungen verwendete Zeitzone." -#: utils/misc/guc.c:3980 +#: utils/misc/guc.c:4125 msgid "Sets the display format for date and time values." msgstr "Setzt das Ausgabeformat für Datums- und Zeitwerte." -#: utils/misc/guc.c:3981 +#: utils/misc/guc.c:4126 msgid "Also controls interpretation of ambiguous date inputs." msgstr "Kontrolliert auch die Interpretation von zweideutigen Datumseingaben." -#: utils/misc/guc.c:3992 +#: utils/misc/guc.c:4137 msgid "Sets the default table access method for new tables." msgstr "Setzt die Standard-Tabellenzugriffsmethode für neue Tabellen." -#: utils/misc/guc.c:4003 +#: utils/misc/guc.c:4148 msgid "Sets the default tablespace to create tables and indexes in." msgstr "Setzt den Standard-Tablespace für Tabellen und Indexe." -#: utils/misc/guc.c:4004 +#: utils/misc/guc.c:4149 msgid "An empty string selects the database's default tablespace." msgstr "Eine leere Zeichenkette wählt den Standard-Tablespace der Datenbank." -#: utils/misc/guc.c:4014 +#: utils/misc/guc.c:4159 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "Setzt den oder die Tablespaces für temporäre Tabellen und Sortierdateien." -#: utils/misc/guc.c:4025 +#: utils/misc/guc.c:4170 msgid "Sets the path for dynamically loadable modules." msgstr "Setzt den Pfad für ladbare dynamische Bibliotheken." -#: utils/misc/guc.c:4026 +#: utils/misc/guc.c:4171 msgid "If a dynamically loadable module needs to be opened and the specified name does not have a directory component (i.e., the name does not contain a slash), the system will search this path for the specified file." msgstr "Wenn ein dynamisch ladbares Modul geöffnet werden muss und der angegebene Name keine Verzeichniskomponente hat (das heißt er enthält keinen Schrägstrich), dann sucht das System in diesem Pfad nach der angegebenen Datei." -#: utils/misc/guc.c:4039 +#: utils/misc/guc.c:4184 msgid "Sets the location of the Kerberos server key file." msgstr "Setzt den Ort der Kerberos-Server-Schlüsseldatei." -#: utils/misc/guc.c:4050 +#: utils/misc/guc.c:4195 msgid "Sets the Bonjour service name." msgstr "Setzt den Bonjour-Servicenamen." -#: utils/misc/guc.c:4062 +#: utils/misc/guc.c:4207 msgid "Shows the collation order locale." msgstr "Zeigt die Locale für die Sortierreihenfolge." -#: utils/misc/guc.c:4073 +#: utils/misc/guc.c:4218 msgid "Shows the character classification and case conversion locale." msgstr "Zeigt die Locale für Zeichenklassifizierung und Groß-/Kleinschreibung." -#: utils/misc/guc.c:4084 +#: utils/misc/guc.c:4229 msgid "Sets the language in which messages are displayed." msgstr "Setzt die Sprache, in der Mitteilungen ausgegeben werden." -#: utils/misc/guc.c:4094 +#: utils/misc/guc.c:4239 msgid "Sets the locale for formatting monetary amounts." msgstr "Setzt die Locale für die Formatierung von Geldbeträgen." -#: utils/misc/guc.c:4104 +#: utils/misc/guc.c:4249 msgid "Sets the locale for formatting numbers." msgstr "Setzt die Locale für die Formatierung von Zahlen." -#: utils/misc/guc.c:4114 +#: utils/misc/guc.c:4259 msgid "Sets the locale for formatting date and time values." msgstr "Setzt die Locale für die Formatierung von Datums- und Zeitwerten." -#: utils/misc/guc.c:4124 +#: utils/misc/guc.c:4269 msgid "Lists shared libraries to preload into each backend." msgstr "Listet dynamische Bibliotheken, die vorab in jeden Serverprozess geladen werden." -#: utils/misc/guc.c:4135 +#: utils/misc/guc.c:4280 msgid "Lists shared libraries to preload into server." msgstr "Listet dynamische Bibliotheken, die vorab in den Server geladen werden." -#: utils/misc/guc.c:4146 +#: utils/misc/guc.c:4291 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "Listet unprivilegierte dynamische Bibliotheken, die vorab in jeden Serverprozess geladen werden." -#: utils/misc/guc.c:4157 +#: utils/misc/guc.c:4302 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "Setzt die Schemasuchreihenfolge für Namen ohne Schemaqualifikation." -#: utils/misc/guc.c:4169 -#, fuzzy -#| msgid "Sets the server (database) character set encoding." +#: utils/misc/guc.c:4314 msgid "Shows the server (database) character set encoding." -msgstr "Setzt die Zeichensatzkodierung des Servers (der Datenbank)." +msgstr "Zeigt die Zeichensatzkodierung des Servers (der Datenbank)." -#: utils/misc/guc.c:4181 +#: utils/misc/guc.c:4326 msgid "Shows the server version." msgstr "Zeigt die Serverversion." -#: utils/misc/guc.c:4193 +#: utils/misc/guc.c:4338 msgid "Sets the current role." msgstr "Setzt die aktuelle Rolle." -#: utils/misc/guc.c:4205 +#: utils/misc/guc.c:4350 msgid "Sets the session user name." msgstr "Setzt den Sitzungsbenutzernamen." -#: utils/misc/guc.c:4216 +#: utils/misc/guc.c:4361 msgid "Sets the destination for server log output." msgstr "Setzt das Ziel für die Serverlogausgabe." -#: utils/misc/guc.c:4217 -msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and \"eventlog\", depending on the platform." +#: utils/misc/guc.c:4362 +#, fuzzy +#| msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and \"eventlog\", depending on the platform." +msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", depending on the platform." msgstr "Gültige Werte sind Kombinationen von »stderr«, »syslog«, »csvlog« und »eventlog«, je nach Plattform." -#: utils/misc/guc.c:4228 +#: utils/misc/guc.c:4373 msgid "Sets the destination directory for log files." msgstr "Bestimmt das Zielverzeichnis für Logdateien." -#: utils/misc/guc.c:4229 +#: utils/misc/guc.c:4374 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "Kann relativ zum Datenverzeichnis oder als absoluter Pfad angegeben werden." -#: utils/misc/guc.c:4239 +#: utils/misc/guc.c:4384 msgid "Sets the file name pattern for log files." msgstr "Bestimmt das Dateinamenmuster für Logdateien." -#: utils/misc/guc.c:4250 +#: utils/misc/guc.c:4395 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "Setzt den Programmnamen, mit dem PostgreSQL-Meldungen im Syslog identifiziert werden." -#: utils/misc/guc.c:4261 +#: utils/misc/guc.c:4406 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "Setzt den Programmnamen, mit dem PostgreSQL-Meldungen im Ereignisprotokoll identifiziert werden." -#: utils/misc/guc.c:4272 +#: utils/misc/guc.c:4417 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "Setzt die Zeitzone, in der Zeitangaben interpretiert und ausgegeben werden." -#: utils/misc/guc.c:4282 +#: utils/misc/guc.c:4427 msgid "Selects a file of time zone abbreviations." msgstr "Wählt eine Datei mit Zeitzonenabkürzungen." -#: utils/misc/guc.c:4292 +#: utils/misc/guc.c:4437 msgid "Sets the owning group of the Unix-domain socket." msgstr "Setzt die Eigentümergruppe der Unix-Domain-Socket." -#: utils/misc/guc.c:4293 +#: utils/misc/guc.c:4438 msgid "The owning user of the socket is always the user that starts the server." msgstr "Der Eigentümer ist immer der Benutzer, der den Server startet." -#: utils/misc/guc.c:4303 +#: utils/misc/guc.c:4448 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Setzt die Verzeichnisse, in denen Unix-Domain-Sockets erzeugt werden sollen." -#: utils/misc/guc.c:4318 +#: utils/misc/guc.c:4463 msgid "Sets the host name or IP address(es) to listen to." msgstr "Setzt den Hostnamen oder die IP-Adresse(n), auf der auf Verbindungen gewartet wird." -#: utils/misc/guc.c:4333 +#: utils/misc/guc.c:4478 msgid "Sets the server's data directory." msgstr "Setzt das Datenverzeichnis des Servers." -#: utils/misc/guc.c:4344 +#: utils/misc/guc.c:4489 msgid "Sets the server's main configuration file." msgstr "Setzt die Hauptkonfigurationsdatei des Servers." -#: utils/misc/guc.c:4355 +#: utils/misc/guc.c:4500 msgid "Sets the server's \"hba\" configuration file." msgstr "Setzt die »hba«-Konfigurationsdatei des Servers." -#: utils/misc/guc.c:4366 +#: utils/misc/guc.c:4511 msgid "Sets the server's \"ident\" configuration file." msgstr "Setzt die »ident«-Konfigurationsdatei des Servers." -#: utils/misc/guc.c:4377 +#: utils/misc/guc.c:4522 msgid "Writes the postmaster PID to the specified file." msgstr "Schreibt die Postmaster-PID in die angegebene Datei." -#: utils/misc/guc.c:4388 -#, fuzzy -#| msgid "Name of the SSL library." +#: utils/misc/guc.c:4533 msgid "Shows the name of the SSL library." -msgstr "Name der SSL-Bibliothek." +msgstr "Zeigt den Namen der SSL-Bibliothek." -#: utils/misc/guc.c:4403 +#: utils/misc/guc.c:4548 msgid "Location of the SSL server certificate file." msgstr "Ort der SSL-Serverzertifikatsdatei." -#: utils/misc/guc.c:4413 +#: utils/misc/guc.c:4558 msgid "Location of the SSL server private key file." msgstr "Setzt den Ort der Datei mit dem privaten SSL-Server-Schlüssel." -#: utils/misc/guc.c:4423 +#: utils/misc/guc.c:4568 msgid "Location of the SSL certificate authority file." msgstr "Ort der SSL-Certificate-Authority-Datei." -#: utils/misc/guc.c:4433 +#: utils/misc/guc.c:4578 msgid "Location of the SSL certificate revocation list file." msgstr "Ort der SSL-Certificate-Revocation-List-Datei." -#: utils/misc/guc.c:4443 -#, fuzzy -#| msgid "Location of the SSL certificate revocation list file." +#: utils/misc/guc.c:4588 msgid "Location of the SSL certificate revocation list directory." -msgstr "Ort der SSL-Certificate-Revocation-List-Datei." - -#: utils/misc/guc.c:4453 -msgid "Writes temporary statistics files to the specified directory." -msgstr "Schreibt temporäre Statistikdateien in das angegebene Verzeichnis." +msgstr "Ort des SSL-Certificate-Revocation-List-Verzeichnisses." -#: utils/misc/guc.c:4464 +#: utils/misc/guc.c:4598 msgid "Number of synchronous standbys and list of names of potential synchronous ones." msgstr "Anzahl synchroner Standbys und Liste der Namen der möglichen synchronen Standbys." -#: utils/misc/guc.c:4475 +#: utils/misc/guc.c:4609 msgid "Sets default text search configuration." msgstr "Setzt die vorgegebene Textsuchekonfiguration." -#: utils/misc/guc.c:4485 +#: utils/misc/guc.c:4619 msgid "Sets the list of allowed SSL ciphers." msgstr "Setzt die Liste der erlaubten SSL-Verschlüsselungsalgorithmen." -#: utils/misc/guc.c:4500 +#: utils/misc/guc.c:4634 msgid "Sets the curve to use for ECDH." msgstr "Setzt die für ECDH zu verwendende Kurve." -#: utils/misc/guc.c:4515 +#: utils/misc/guc.c:4649 msgid "Location of the SSL DH parameters file." msgstr "Setzt den Ort der SSL-DH-Parameter-Datei." -#: utils/misc/guc.c:4526 +#: utils/misc/guc.c:4660 msgid "Command to obtain passphrases for SSL." msgstr "Befehl zum Einlesen von Passphrasen für SSL." -#: utils/misc/guc.c:4537 +#: utils/misc/guc.c:4671 msgid "Sets the application name to be reported in statistics and logs." msgstr "Setzt den Anwendungsnamen, der in Statistiken und Logs verzeichnet wird." -#: utils/misc/guc.c:4548 +#: utils/misc/guc.c:4682 msgid "Sets the name of the cluster, which is included in the process title." msgstr "Setzt den Namen des Clusters, welcher im Prozesstitel angezeigt wird." -#: utils/misc/guc.c:4559 +#: utils/misc/guc.c:4693 msgid "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "Setzt die WAL-Resource-Manager, für die WAL-Konsistenzprüfungen durchgeführt werden." -#: utils/misc/guc.c:4560 +#: utils/misc/guc.c:4694 msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." msgstr "Volle Seitenabbilder werden für alle Datenblöcke geloggt und gegen die Resultate der WAL-Wiederherstellung geprüft." -#: utils/misc/guc.c:4570 +#: utils/misc/guc.c:4704 msgid "JIT provider to use." msgstr "Zu verwendender JIT-Provider." -#: utils/misc/guc.c:4581 +#: utils/misc/guc.c:4715 msgid "Log backtrace for errors in these functions." msgstr "Backtrace für Fehler in diesen Funktionen loggen." -#: utils/misc/guc.c:4601 +#: utils/misc/guc.c:4735 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Bestimmt, ob »\\'« in Zeichenkettenkonstanten erlaubt ist." -#: utils/misc/guc.c:4611 +#: utils/misc/guc.c:4745 msgid "Sets the output format for bytea." msgstr "Setzt das Ausgabeformat für bytea." -#: utils/misc/guc.c:4621 +#: utils/misc/guc.c:4755 msgid "Sets the message levels that are sent to the client." msgstr "Setzt die Meldungstypen, die an den Client gesendet werden." -#: utils/misc/guc.c:4622 utils/misc/guc.c:4708 utils/misc/guc.c:4719 -#: utils/misc/guc.c:4795 +#: utils/misc/guc.c:4756 utils/misc/guc.c:4842 utils/misc/guc.c:4853 +#: utils/misc/guc.c:4929 msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." msgstr "Jeder Wert schließt alle ihm folgenden Werte mit ein. Je weiter hinten der Wert steht, desto weniger Meldungen werden gesendet werden." -#: utils/misc/guc.c:4632 +#: utils/misc/guc.c:4766 #, fuzzy -#| msgid "unterminated quoted identifier" -msgid "Compute query identifiers." -msgstr "Bezeichner in Anführungszeichen nicht abgeschlossen" +#| msgid "Compute query identifiers." +msgid "Enables in-core computation of query identifiers." +msgstr "Anfragebezeichner berechnen." -#: utils/misc/guc.c:4642 +#: utils/misc/guc.c:4776 msgid "Enables the planner to use constraints to optimize queries." msgstr "Ermöglicht dem Planer die Verwendung von Constraints, um Anfragen zu optimieren." -#: utils/misc/guc.c:4643 +#: utils/misc/guc.c:4777 msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." msgstr "Tabellen-Scans werden übersprungen, wenn deren Constraints garantieren, dass keine Zeile mit der Abfrage übereinstimmt." -#: utils/misc/guc.c:4654 -#, fuzzy -#| msgid "Sets the default table access method for new tables." +#: utils/misc/guc.c:4788 msgid "Sets the default compression method for compressible values." -msgstr "Setzt die Standard-Tabellenzugriffsmethode für neue Tabellen." +msgstr "Setzt die Standard-Komprimierungsmethode für komprimierbare Werte." -#: utils/misc/guc.c:4665 +#: utils/misc/guc.c:4799 msgid "Sets the transaction isolation level of each new transaction." msgstr "Setzt den Transaktionsisolationsgrad neuer Transaktionen." -#: utils/misc/guc.c:4675 +#: utils/misc/guc.c:4809 msgid "Sets the current transaction's isolation level." msgstr "Zeigt den Isolationsgrad der aktuellen Transaktion." -#: utils/misc/guc.c:4686 +#: utils/misc/guc.c:4820 msgid "Sets the display format for interval values." msgstr "Setzt das Ausgabeformat für Intervallwerte." -#: utils/misc/guc.c:4697 +#: utils/misc/guc.c:4831 msgid "Sets the verbosity of logged messages." msgstr "Setzt den Detailgrad von geloggten Meldungen." -#: utils/misc/guc.c:4707 +#: utils/misc/guc.c:4841 msgid "Sets the message levels that are logged." msgstr "Setzt die Meldungstypen, die geloggt werden." -#: utils/misc/guc.c:4718 +#: utils/misc/guc.c:4852 msgid "Causes all statements generating error at or above this level to be logged." msgstr "Schreibt alle Anweisungen, die einen Fehler auf dieser Stufe oder höher verursachen, in den Log." -#: utils/misc/guc.c:4729 +#: utils/misc/guc.c:4863 msgid "Sets the type of statements logged." msgstr "Setzt die Anweisungsarten, die geloggt werden." -#: utils/misc/guc.c:4739 +#: utils/misc/guc.c:4873 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "Setzt die zu verwendende Syslog-»Facility«, wenn Syslog angeschaltet ist." -#: utils/misc/guc.c:4754 +#: utils/misc/guc.c:4888 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "Setzt das Sitzungsverhalten für Trigger und Regeln." -#: utils/misc/guc.c:4764 +#: utils/misc/guc.c:4898 msgid "Sets the current transaction's synchronization level." msgstr "Setzt den Synchronisationsgrad der aktuellen Transaktion." -#: utils/misc/guc.c:4774 +#: utils/misc/guc.c:4908 msgid "Allows archiving of WAL files using archive_command." msgstr "Erlaubt die Archivierung von WAL-Dateien mittels archive_command." -#: utils/misc/guc.c:4784 +#: utils/misc/guc.c:4918 msgid "Sets the action to perform upon reaching the recovery target." msgstr "Setzt die Aktion, die beim Erreichen des Wiederherstellungsziels durchgeführt wird." -#: utils/misc/guc.c:4794 +#: utils/misc/guc.c:4928 msgid "Enables logging of recovery-related debugging information." msgstr "Ermöglicht das Loggen von Debug-Informationen über die Wiederherstellung." -#: utils/misc/guc.c:4810 +#: utils/misc/guc.c:4945 msgid "Collects function-level statistics on database activity." msgstr "Sammelt Statistiken auf Funktionsebene über Datenbankaktivität." -#: utils/misc/guc.c:4820 +#: utils/misc/guc.c:4956 +#, fuzzy +#| msgid "Sets the default statistics target." +msgid "Sets the consistency of accesses to statistics data" +msgstr "Setzt das voreingestellte Statistikziel." + +#: utils/misc/guc.c:4966 #, fuzzy -#| msgid "Set the level of information written to the WAL." +#| msgid "Compresses full-page writes written in WAL file." +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "Komprimiert in WAL-Dateien geschriebene volle Seiten." + +#: utils/misc/guc.c:4976 msgid "Sets the level of information written to the WAL." msgstr "Setzt den Umfang der in den WAL geschriebenen Informationen." -#: utils/misc/guc.c:4830 +#: utils/misc/guc.c:4986 msgid "Selects the dynamic shared memory implementation used." msgstr "Wählt die zu verwendende Implementierung von dynamischem Shared Memory." -#: utils/misc/guc.c:4840 +#: utils/misc/guc.c:4996 msgid "Selects the shared memory implementation used for the main shared memory region." msgstr "Wählt die Shared-Memory-Implementierung, die für den Haupt-Shared-Memory-Bereich verwendet wird." -#: utils/misc/guc.c:4850 +#: utils/misc/guc.c:5006 msgid "Selects the method used for forcing WAL updates to disk." msgstr "Wählt die Methode, um das Schreiben von WAL-Änderungen auf die Festplatte zu erzwingen." -#: utils/misc/guc.c:4860 +#: utils/misc/guc.c:5016 msgid "Sets how binary values are to be encoded in XML." msgstr "Setzt, wie binäre Werte in XML kodiert werden." -#: utils/misc/guc.c:4870 +#: utils/misc/guc.c:5026 msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." msgstr "Setzt, ob XML-Daten in impliziten Parse- und Serialisierungsoperationen als Dokument oder Fragment betrachtet werden sollen." -#: utils/misc/guc.c:4881 +#: utils/misc/guc.c:5037 msgid "Use of huge pages on Linux or Windows." msgstr "Huge Pages auf Linux oder Windows verwenden." -#: utils/misc/guc.c:4891 +#: utils/misc/guc.c:5047 +#, fuzzy +#| msgid "cannot execute %s during recovery" +msgid "Prefetch referenced blocks during recovery" +msgstr "%s kann nicht während der Wiederherstellung ausgeführt werden" + +#: utils/misc/guc.c:5048 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "" + +#: utils/misc/guc.c:5057 msgid "Forces use of parallel query facilities." msgstr "Verwendung der Einrichtungen für parallele Anfragen erzwingen." -#: utils/misc/guc.c:4892 +#: utils/misc/guc.c:5058 msgid "If possible, run query using a parallel worker and with parallel restrictions." msgstr "Wenn möglich werden Anfragen in einem parallelen Arbeitsprozess und mit parallelen Beschränkungen ausgeführt." -#: utils/misc/guc.c:4902 +#: utils/misc/guc.c:5068 msgid "Chooses the algorithm for encrypting passwords." msgstr "Wählt den Algorithmus zum Verschlüsseln von Passwörtern." -#: utils/misc/guc.c:4912 +#: utils/misc/guc.c:5078 msgid "Controls the planner's selection of custom or generic plan." msgstr "Kontrolliert, ob der Planer einen maßgeschneiderten oder einen allgemeinen Plan verwendet." -#: utils/misc/guc.c:4913 +#: utils/misc/guc.c:5079 msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." msgstr "Vorbereitete Anweisungen können maßgeschneiderte oder allgemeine Pläne haben und der Planer wird versuchen, den besseren auszuwählen. Diese Einstellung kann das Standardverhalten außer Kraft setzen." -#: utils/misc/guc.c:4925 +#: utils/misc/guc.c:5091 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "Setzt die minimale zu verwendende SSL/TLS-Protokollversion." -#: utils/misc/guc.c:4937 +#: utils/misc/guc.c:5103 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "Setzt die maximale zu verwendende SSL/TLS-Protokollversion." -#: utils/misc/guc.c:4949 +#: utils/misc/guc.c:5115 msgid "Sets the method for synchronizing the data directory before crash recovery." -msgstr "" +msgstr "Setzt die Methode für das Synchronisieren des Datenverzeichnisses vor der Wiederherstellung nach einem Absturz." -#: utils/misc/guc.c:5518 -#, fuzzy, c-format -#| msgid "unrecognized configuration parameter \"%s\"" +#: utils/misc/guc.c:5689 utils/misc/guc.c:5705 +#, c-format msgid "invalid configuration parameter name \"%s\"" -msgstr "unbekannter Konfigurationsparameter »%s«" +msgstr "ungültiger Konfigurationsparametername »%s«" -#: utils/misc/guc.c:5520 +#: utils/misc/guc.c:5691 #, c-format msgid "Custom parameter names must be two or more simple identifiers separated by dots." -msgstr "" +msgstr "Selbstdefinierte Parameternamen müssen zwei oder mehr einfache Bezeichner getrennt durch Punkte sein." -#: utils/misc/guc.c:5529 utils/misc/guc.c:9288 +#: utils/misc/guc.c:5707 +#, fuzzy, c-format +#| msgid "\"%s\" is a procedure." +msgid "\"%s\" is a reserved prefix." +msgstr "»%s« ist eine Prozedur." + +#: utils/misc/guc.c:5721 #, c-format msgid "unrecognized configuration parameter \"%s\"" msgstr "unbekannter Konfigurationsparameter »%s«" -#: utils/misc/guc.c:5822 +#: utils/misc/guc.c:6102 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s: konnte nicht auf Verzeichnis »%s« zugreifen: %s\n" -#: utils/misc/guc.c:5827 +#: utils/misc/guc.c:6107 #, c-format msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" msgstr "Führen Sie initdb oder pg_basebackup aus, um ein PostgreSQL-Datenverzeichnis zu initialisieren.\n" -#: utils/misc/guc.c:5847 +#: utils/misc/guc.c:6127 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -28045,12 +29162,12 @@ msgstr "" "Sie müssen die Kommandozeilenoption --config-file oder -D angegeben oder\n" "die Umgebungsvariable PGDATA setzen.\n" -#: utils/misc/guc.c:5866 +#: utils/misc/guc.c:6146 #, c-format msgid "%s: could not access the server configuration file \"%s\": %s\n" msgstr "%s: konnte nicht auf die Serverkonfigurationsdatei »%s« zugreifen: %s\n" -#: utils/misc/guc.c:5892 +#: utils/misc/guc.c:6172 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -28060,7 +29177,7 @@ msgstr "" "zu finden sind. Sie können dies mit »data_directory« in »%s«, mit der\n" "Kommandozeilenoption -D oder der Umgebungsvariable PGDATA angeben.\n" -#: utils/misc/guc.c:5940 +#: utils/misc/guc.c:6220 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -28070,7 +29187,7 @@ msgstr "" "Sie können dies mit »hba_file« in »%s«, mit der\n" "Kommandozeilenoption -D oder der Umgebungsvariable PGDATA angeben.\n" -#: utils/misc/guc.c:5963 +#: utils/misc/guc.c:6243 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -28080,183 +29197,192 @@ msgstr "" "Sie können dies mit »ident_file« in »%s«, mit der\n" "Kommandozeilenoption -D oder der Umgebungsvariable PGDATA angeben.\n" -#: utils/misc/guc.c:6888 +#: utils/misc/guc.c:7168 msgid "Value exceeds integer range." msgstr "Wert überschreitet Bereich für ganze Zahlen." -#: utils/misc/guc.c:7124 +#: utils/misc/guc.c:7404 #, c-format msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d%s%s ist außerhalb des gültigen Bereichs für Parameter »%s« (%d ... %d)" -#: utils/misc/guc.c:7160 +#: utils/misc/guc.c:7440 #, c-format msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" msgstr "%g%s%s ist außerhalb des gültigen Bereichs für Parameter »%s« (%g ... %g)" -#: utils/misc/guc.c:7320 utils/misc/guc.c:8692 +#: utils/misc/guc.c:7600 utils/misc/guc.c:9028 #, c-format msgid "cannot set parameters during a parallel operation" msgstr "während einer parallelen Operation können keine Parameter gesetzt werden" -#: utils/misc/guc.c:7337 utils/misc/guc.c:8533 +#: utils/misc/guc.c:7617 utils/misc/guc.c:8852 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "Parameter »%s« kann nicht geändert werden" -#: utils/misc/guc.c:7370 +#: utils/misc/guc.c:7650 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "Parameter »%s« kann jetzt nicht geändert werden" -#: utils/misc/guc.c:7388 utils/misc/guc.c:7435 utils/misc/guc.c:11333 +#: utils/misc/guc.c:7677 utils/misc/guc.c:7735 utils/misc/guc.c:8828 +#: utils/misc/guc.c:11696 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "keine Berechtigung, um Parameter »%s« zu setzen" -#: utils/misc/guc.c:7425 +#: utils/misc/guc.c:7715 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "Parameter »%s« kann nach Start der Verbindung nicht geändert werden" -#: utils/misc/guc.c:7473 +#: utils/misc/guc.c:7774 #, c-format msgid "cannot set parameter \"%s\" within security-definer function" msgstr "Parameter »%s« kann nicht in einer Security-Definer-Funktion gesetzt werden" -#: utils/misc/guc.c:8106 utils/misc/guc.c:8153 utils/misc/guc.c:9550 -#, c-format -msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" +#: utils/misc/guc.c:8407 utils/misc/guc.c:8454 utils/misc/guc.c:9917 +#, fuzzy, c-format +#| msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" +msgid "must be superuser or have privileges of pg_read_all_settings to examine \"%s\"" msgstr "nur Superuser oder Mitglieder von pg_read_all_settings können »%s« ansehen" -#: utils/misc/guc.c:8237 +#: utils/misc/guc.c:8538 #, c-format msgid "SET %s takes only one argument" msgstr "SET %s darf nur ein Argument haben" -#: utils/misc/guc.c:8485 -#, c-format -msgid "must be superuser to execute ALTER SYSTEM command" -msgstr "nur Superuser können den Befehl ALTER SYSTEM ausführen" +#: utils/misc/guc.c:8818 +#, fuzzy, c-format +#| msgid "permission denied for operator %s" +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "keine Berechtigung für Operator %s" -#: utils/misc/guc.c:8566 +#: utils/misc/guc.c:8885 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "Parameterwert für ALTER SYSTEM darf keine Newline enthalten" -#: utils/misc/guc.c:8611 +#: utils/misc/guc.c:8930 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "konnte Inhalt der Datei »%s« nicht parsen" -#: utils/misc/guc.c:8768 +#: utils/misc/guc.c:9104 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOT ist nicht implementiert" -#: utils/misc/guc.c:8852 +#: utils/misc/guc.c:9191 #, c-format msgid "SET requires parameter name" msgstr "SET benötigt Parameternamen" -#: utils/misc/guc.c:8985 +#: utils/misc/guc.c:9324 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "Versuch, den Parameter »%s« zu redefinieren" -#: utils/misc/guc.c:10780 +#: utils/misc/guc.c:9645 +#, fuzzy, c-format +#| msgid "invalid configuration parameter name \"%s\"" +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "ungültiger Konfigurationsparametername »%s«" + +#: utils/misc/guc.c:9647 +#, fuzzy, c-format +#| msgid "\"%s\" is not a sequence" +msgid "\"%s\" is now a reserved prefix." +msgstr "»%s« ist keine Sequenz" + +#: utils/misc/guc.c:11143 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "beim Setzen von Parameter »%s« auf »%s«" -#: utils/misc/guc.c:10945 +#: utils/misc/guc.c:11308 #, c-format msgid "parameter \"%s\" could not be set" msgstr "Parameter »%s« kann nicht gesetzt werden" -#: utils/misc/guc.c:11037 +#: utils/misc/guc.c:11400 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "konnte Wert von Parameter »%s« nicht lesen" -#: utils/misc/guc.c:11395 utils/misc/guc.c:11429 -#, c-format -msgid "invalid value for parameter \"%s\": %d" -msgstr "ungültiger Wert für Parameter »%s«: %d" - -#: utils/misc/guc.c:11463 +#: utils/misc/guc.c:11826 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "ungültiger Wert für Parameter »%s«: %g" -#: utils/misc/guc.c:11750 +#: utils/misc/guc.c:12139 #, c-format msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." msgstr "»temp_buffers« kann nicht geändert werden, nachdem in der Sitzung auf temporäre Tabellen zugriffen wurde." -#: utils/misc/guc.c:11762 +#: utils/misc/guc.c:12151 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour wird von dieser Installation nicht unterstützt" -#: utils/misc/guc.c:11775 +#: utils/misc/guc.c:12164 #, c-format msgid "SSL is not supported by this build" msgstr "SSL wird von dieser Installation nicht unterstützt" -#: utils/misc/guc.c:11787 +#: utils/misc/guc.c:12176 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "Kann Parameter nicht einschalten, wenn »log_statement_stats« an ist." -#: utils/misc/guc.c:11799 +#: utils/misc/guc.c:12188 #, c-format msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." msgstr "Kann »log_statement_stats« nicht einschalten, wenn »log_parser_stats«, »log_planner_stats« oder »log_executor_stats« an ist." -#: utils/misc/guc.c:12029 +#: utils/misc/guc.c:12418 #, c-format msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "effective_io_concurrency muss auf Plattformen ohne posix_fadvise() auf 0 gesetzt sein." -#: utils/misc/guc.c:12042 +#: utils/misc/guc.c:12431 #, c-format msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "maintenance_io_concurrency muss auf Plattformen ohne posix_fadvise() auf 0 gesetzt sein." -#: utils/misc/guc.c:12056 -#, fuzzy, c-format -#| msgid "huge pages not supported on this platform" +#: utils/misc/guc.c:12445 +#, c-format msgid "huge_page_size must be 0 on this platform." -msgstr "Huge Pages werden auf dieser Plattform nicht unterstützt" +msgstr "huge_page_size muss auf dieser Plattform 0 sein." -#: utils/misc/guc.c:12070 +#: utils/misc/guc.c:12457 #, fuzzy, c-format -#| msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." -msgid "client_connection_check_interval must be set to 0 on platforms that lack POLLRDHUP." -msgstr "maintenance_io_concurrency muss auf Plattformen ohne posix_fadvise() auf 0 gesetzt sein." +#| msgid "client_connection_check_interval must be set to 0 on platforms that lack POLLRDHUP." +msgid "client_connection_check_interval must be set to 0 on this platform" +msgstr "client_connection_check_interval muss auf Plattformen ohne POLLRDHUP auf 0 gesetzt sein." -#: utils/misc/guc.c:12198 +#: utils/misc/guc.c:12569 #, c-format msgid "invalid character" msgstr "ungültiges Zeichen" -#: utils/misc/guc.c:12258 +#: utils/misc/guc.c:12629 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timeline ist keine gültige Zahl." -#: utils/misc/guc.c:12298 +#: utils/misc/guc.c:12669 #, c-format msgid "multiple recovery targets specified" msgstr "mehrere Wiederherstellungsziele angegeben" -#: utils/misc/guc.c:12299 +#: utils/misc/guc.c:12670 #, c-format msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." msgstr "Höchstens eins aus recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid darf gesetzt sein." -#: utils/misc/guc.c:12307 +#: utils/misc/guc.c:12678 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "Der einzige erlaubte Wert ist »immediate«." @@ -28266,11 +29392,6 @@ msgstr "Der einzige erlaubte Wert ist »immediate«." msgid "internal error: unrecognized run-time parameter type\n" msgstr "interner Fehler: unbekannter Parametertyp\n" -#: utils/misc/pg_config.c:60 -#, c-format -msgid "query-specified return tuple and function return type are not compatible" -msgstr "in der Anfrage angegebenes Rückgabetupel und Rückgabetyp der Funktion sind nicht kompatibel" - #: utils/misc/pg_controldata.c:60 utils/misc/pg_controldata.c:138 #: utils/misc/pg_controldata.c:241 utils/misc/pg_controldata.c:306 #, c-format @@ -28292,7 +29413,7 @@ msgstr "Policy für Sicherheit auf Zeilenebene für Tabelle »%s« würde Auswir msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." msgstr "Um die Policy für den Tabelleneigentümer zu deaktivieren, verwenden Sie ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/timeout.c:484 +#: utils/misc/timeout.c:524 #, c-format msgid "cannot add more timeout reasons" msgstr "kann keine weiteren Gründe für Zeitüberschreitungen hinzufügen" @@ -28362,7 +29483,7 @@ msgstr "Zeile ist zu lang in Zeitzonendatei »%s«, Zeile %d" msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "@INCLUDE ohne Dateiname in Zeitzonendatei »%s«, Zeile %d" -#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:235 utils/mmgr/slab.c:237 +#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:237 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Fehler während der Erzeugung des Speicherkontexts »%s«." @@ -28373,101 +29494,101 @@ msgid "could not attach to dynamic shared area" msgstr "konnte nicht an dynamische Shared Area anbinden" #: utils/mmgr/mcxt.c:889 utils/mmgr/mcxt.c:925 utils/mmgr/mcxt.c:963 -#: utils/mmgr/mcxt.c:1001 utils/mmgr/mcxt.c:1083 utils/mmgr/mcxt.c:1114 -#: utils/mmgr/mcxt.c:1150 utils/mmgr/mcxt.c:1202 utils/mmgr/mcxt.c:1237 -#: utils/mmgr/mcxt.c:1272 +#: utils/mmgr/mcxt.c:1001 utils/mmgr/mcxt.c:1089 utils/mmgr/mcxt.c:1120 +#: utils/mmgr/mcxt.c:1156 utils/mmgr/mcxt.c:1208 utils/mmgr/mcxt.c:1243 +#: utils/mmgr/mcxt.c:1278 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "Fehler bei Anfrage mit Größe %zu im Speicherkontext »%s«." -#: utils/mmgr/mcxt.c:1046 +#: utils/mmgr/mcxt.c:1052 #, c-format msgid "logging memory contexts of PID %d" -msgstr "" +msgstr "logge Speicherkontexte von PID %d" -#: utils/mmgr/portalmem.c:187 +#: utils/mmgr/portalmem.c:188 #, c-format msgid "cursor \"%s\" already exists" msgstr "Cursor »%s« existiert bereits" -#: utils/mmgr/portalmem.c:191 +#: utils/mmgr/portalmem.c:192 #, c-format msgid "closing existing cursor \"%s\"" msgstr "bestehender Cursor »%s« wird geschlossen" -#: utils/mmgr/portalmem.c:400 +#: utils/mmgr/portalmem.c:402 #, c-format msgid "portal \"%s\" cannot be run" msgstr "Portal »%s« kann nicht ausgeführt werden" -#: utils/mmgr/portalmem.c:478 +#: utils/mmgr/portalmem.c:480 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "gepinntes Portal »%s« kann nicht gelöscht werden" -#: utils/mmgr/portalmem.c:486 +#: utils/mmgr/portalmem.c:488 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "aktives Portal »%s« kann nicht gelöscht werden" -#: utils/mmgr/portalmem.c:736 +#: utils/mmgr/portalmem.c:739 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "PREPARE kann nicht in einer Transaktion ausgeführt werden, die einen Cursor mit WITH HOLD erzeugt hat" -#: utils/mmgr/portalmem.c:1275 +#: utils/mmgr/portalmem.c:1232 #, c-format msgid "cannot perform transaction commands inside a cursor loop that is not read-only" msgstr "in einer Cursor-Schleife, die nicht nur liest, können keine Transaktionsbefehle ausgeführt werden" -#: utils/sort/logtape.c:268 utils/sort/logtape.c:291 +#: utils/sort/logtape.c:266 utils/sort/logtape.c:289 #, c-format msgid "could not seek to block %ld of temporary file" msgstr "konnte Positionszeiger in temporärer Datei nicht auf Block %ld setzen" -#: utils/sort/logtape.c:297 +#: utils/sort/logtape.c:295 #, c-format msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" msgstr "konnte Block %ld von temporärer Datei nicht lesen: es wurden nur %zu von %zu Bytes gelesen" -#: utils/sort/sharedtuplestore.c:430 utils/sort/sharedtuplestore.c:439 -#: utils/sort/sharedtuplestore.c:462 utils/sort/sharedtuplestore.c:479 -#: utils/sort/sharedtuplestore.c:496 +#: utils/sort/sharedtuplestore.c:431 utils/sort/sharedtuplestore.c:440 +#: utils/sort/sharedtuplestore.c:463 utils/sort/sharedtuplestore.c:480 +#: utils/sort/sharedtuplestore.c:497 #, c-format msgid "could not read from shared tuplestore temporary file" msgstr "konnte nicht aus temporärer Datei für Shared-Tuplestore lesen" -#: utils/sort/sharedtuplestore.c:485 +#: utils/sort/sharedtuplestore.c:486 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "unerwarteter Chunk in temporärer Datei für Shared-Tuplestore" -#: utils/sort/sharedtuplestore.c:569 +#: utils/sort/sharedtuplestore.c:571 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "konnte Positionszeiger in temporärer Datei für Shared-Tuplestore nicht auf Block %u setzen" -#: utils/sort/sharedtuplestore.c:576 +#: utils/sort/sharedtuplestore.c:578 #, c-format msgid "could not read from shared tuplestore temporary file: read only %zu of %zu bytes" msgstr "konnte nicht aus temporärer Datei für Shared-Tuplestore lesen: es wurden nur %zu von %zu Bytes gelesen" -#: utils/sort/tuplesort.c:3216 +#: utils/sort/tuplesort.c:3321 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "ein externer Sortiervorgang kann nicht mehr als %d Durchgänge haben" -#: utils/sort/tuplesort.c:4297 +#: utils/sort/tuplesort.c:4429 #, c-format msgid "could not create unique index \"%s\"" msgstr "konnte Unique Index »%s« nicht erstellen" -#: utils/sort/tuplesort.c:4299 +#: utils/sort/tuplesort.c:4431 #, c-format msgid "Key %s is duplicated." msgstr "Schlüssel %s ist doppelt vorhanden." -#: utils/sort/tuplesort.c:4300 +#: utils/sort/tuplesort.c:4432 #, c-format msgid "Duplicate keys exist." msgstr "Es existieren doppelte Schlüssel." @@ -28487,52 +29608,434 @@ msgstr "konnte Positionszeiger in temporärer Datei für Tuplestore nicht setzen msgid "could not read from tuplestore temporary file: read only %zu of %zu bytes" msgstr "konnte nicht aus temporärer Datei für Tuplestore lesen: es wurden nur %zu von %zu Bytes gelesen" -#: utils/time/snapmgr.c:568 +#: utils/time/snapmgr.c:570 #, c-format msgid "The source transaction is not running anymore." msgstr "Die Quelltransaktion läuft nicht mehr." -#: utils/time/snapmgr.c:1147 +#: utils/time/snapmgr.c:1164 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "aus einer Subtransaktion kann kein Snapshot exportiert werden" -#: utils/time/snapmgr.c:1306 utils/time/snapmgr.c:1311 -#: utils/time/snapmgr.c:1316 utils/time/snapmgr.c:1331 -#: utils/time/snapmgr.c:1336 utils/time/snapmgr.c:1341 -#: utils/time/snapmgr.c:1356 utils/time/snapmgr.c:1361 -#: utils/time/snapmgr.c:1366 utils/time/snapmgr.c:1468 -#: utils/time/snapmgr.c:1484 utils/time/snapmgr.c:1509 +#: utils/time/snapmgr.c:1323 utils/time/snapmgr.c:1328 +#: utils/time/snapmgr.c:1333 utils/time/snapmgr.c:1348 +#: utils/time/snapmgr.c:1353 utils/time/snapmgr.c:1358 +#: utils/time/snapmgr.c:1373 utils/time/snapmgr.c:1378 +#: utils/time/snapmgr.c:1383 utils/time/snapmgr.c:1485 +#: utils/time/snapmgr.c:1501 utils/time/snapmgr.c:1526 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "ungültige Snapshot-Daten in Datei »%s«" -#: utils/time/snapmgr.c:1403 +#: utils/time/snapmgr.c:1420 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "SET TRANSACTION SNAPSHOT muss vor allen Anfragen aufgerufen werden" -#: utils/time/snapmgr.c:1412 +#: utils/time/snapmgr.c:1429 #, c-format msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" msgstr "eine Snapshot-importierende Transaktion muss Isolationsgrad SERIALIZABLE oder REPEATABLE READ haben" -#: utils/time/snapmgr.c:1421 utils/time/snapmgr.c:1430 +#: utils/time/snapmgr.c:1438 utils/time/snapmgr.c:1447 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "ungültiger Snapshot-Bezeichner: »%s«" -#: utils/time/snapmgr.c:1522 +#: utils/time/snapmgr.c:1539 #, c-format msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" msgstr "eine serialisierbare Transaktion kann keinen Snapshot aus einer nicht-serialisierbaren Transaktion importieren" -#: utils/time/snapmgr.c:1526 +#: utils/time/snapmgr.c:1543 #, c-format msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" msgstr "eine serialisierbare Transaktion, die nicht im Read-Only-Modus ist, kann keinen Snapshot aus einer Read-Only-Transaktion importieren" -#: utils/time/snapmgr.c:1541 +#: utils/time/snapmgr.c:1558 #, c-format msgid "cannot import a snapshot from a different database" msgstr "kann keinen Snapshot aus einer anderen Datenbank importieren" + +#, c-format +#~ msgid "\"%s\" is a system table" +#~ msgstr "»%s« ist eine Systemtabelle" + +#, c-format +#~ msgid "\"%s\" is of the wrong type" +#~ msgstr "»%s« hat den falschen Typ" + +#, c-format +#~ msgid "\"%s.%s\" is a foreign table." +#~ msgstr "»%s.%s« ist eine Fremdtabelle." + +#, c-format +#~ msgid "\"%s.%s\" is not a table." +#~ msgstr "»%s.%s« ist keine Tabelle." + +#, c-format +#~ msgid "\"time with time zone\" units \"%s\" not recognized" +#~ msgstr "»time with time zone«-Einheit »%s« nicht erkannt" + +#, c-format +#~ msgid "\"time\" units \"%s\" not recognized" +#~ msgstr "»time«-Einheit »%s« nicht erkannt" + +#, c-format +#~ msgid "%lld dead row versions cannot be removed yet, oldest xmin: %u\n" +#~ msgstr "%lld tote Zeilenversionen können noch nicht entfernt werden, ältestes xmin: %u\n" + +#, c-format +#~ msgid "%u frozen page.\n" +#~ msgid_plural "%u frozen pages.\n" +#~ msgstr[0] "%u eingefrorene Seite.\n" +#~ msgstr[1] "%u eingefrorene Seiten.\n" + +#~ msgid "Automatic log file rotation will occur after N kilobytes." +#~ msgstr "Automatische Rotation der Logdateien geschieht nach N Kilobytes." + +#~ msgid "Automatic log file rotation will occur after N minutes." +#~ msgstr "Automatische Rotation der Logdateien geschieht nach N Minuten." + +#, c-format +#~ msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" +#~ msgstr "BKPIMAGE_IS_COMPRESSED gesetzt, aber Block-Abbild-Länge %u bei %X/%X" + +#, c-format +#~ msgid "COPY HEADER available only in CSV mode" +#~ msgstr "COPY HEADER ist nur im CSV-Modus verfügbar" + +#, c-format +#~ msgid "Compile with --with-gssapi to use GSSAPI connections." +#~ msgstr "Kompilieren Sie mit --with-gssapi, um GSSAPI-Verbindungen zu verwenden." + +#, c-format +#~ msgid "Compile with --with-ssl to use SSL connections." +#~ msgstr "Kompilieren Sie mit --with-ssl, um SSL-Verbindungen zu verwenden." + +#, c-format +#~ msgid "Did you mean to use pg_stop_backup('t')?" +#~ msgstr "Meinten Sie pg_stop_backup('t')?" + +#~ msgid "Enables warnings if checkpoint segments are filled more frequently than this." +#~ msgstr "Schreibt eine Logmeldung, wenn Checkpoint-Segmente häufiger als dieser Wert gefüllt werden." + +#, c-format +#~ msgid "File \"%s\" could not be renamed to \"%s\": %m." +#~ msgstr "Konnte Datei »%s« nicht in »%s« umbenennen: %m." + +#, c-format +#~ msgid "File \"%s\" was renamed to \"%s\", but file \"%s\" could not be renamed to \"%s\": %m." +#~ msgstr "Datei »%s« wurde in »%s« umbenannt, aber Datei »%s« konnte nicht in »%s« umbenannt werden: %m." + +#, c-format +#~ msgid "Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." +#~ msgstr "Dateien »%s« und »%s« wurden in »%s« und »%s« umbenannt." + +#~ msgid "Forces a switch to the next WAL file if a new file has not been started within N seconds." +#~ msgstr "Erzwingt das Umschalten zur nächsten WAL-Datei, wenn seit N Sekunden keine neue Datei begonnen worden ist." + +#, c-format +#~ msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" +#~ msgstr "IDENTIFY_SYSTEM wurde nicht vor START_REPLICATION ausgeführt" + +#, c-format +#~ msgid "If you're sure there is no backup in progress, remove file \"%s\" and try again." +#~ msgstr "Wenn Sie sicher sind, dass noch kein Backup läuft, entfernen Sie die Datei »%s« und versuchen Sie es noch einmal." + +#, c-format +#~ msgid "Online backup started with pg_start_backup() must be ended with pg_stop_backup(), and all WAL up to that point must be available at recovery." +#~ msgstr "Die mit pg_start_backup() begonnene Online-Sicherung muss mit pg_stop_backup() beendet werden und der ganze WAL bis zu diesem Punkt muss bei der Wiederherstellung verfügbar sein." + +#, c-format +#~ msgid "Only tables can be added to publications." +#~ msgstr "Nur Tabellen können Teil einer Publikationen sein." + +#, c-format +#~ msgid "Run pg_stop_backup() and try again." +#~ msgstr "Führen Sie pg_stop_backup() aus und versuchen Sie es nochmal." + +#, c-format +#~ msgid "Skipped %u page due to buffer pins, " +#~ msgid_plural "Skipped %u pages due to buffer pins, " +#~ msgstr[0] "%u Seite wegen Buffer-Pins übersprungen, " +#~ msgstr[1] "%u Seiten wegen Buffer-Pins übersprungen, " + +#, c-format +#~ msgid "System tables cannot be added to publications." +#~ msgstr "Systemtabellen können nicht Teil einer Publikationen sein." + +#~ msgid "Waits N seconds on connection startup after authentication." +#~ msgstr "Wartet beim Starten einer Verbindung N Sekunden nach der Authentifizierung." + +#~ msgid "Waits N seconds on connection startup before authentication." +#~ msgstr "Wartet beim Starten einer Verbindung N Sekunden vor der Authentifizierung." + +#~ msgid "When logging statements, limit logged parameter values to first N bytes." +#~ msgstr "Wenn Anweisungen geloggt werden, die geloggten Parameterwerte auf die ersten N Bytes begrenzen." + +#~ msgid "When reporting an error, limit logged parameter values to first N bytes." +#~ msgstr "Wenn ein Fehler ausgegeben wird, die geloggten Parameterwerte auf die ersten N Bytes begrenzen." + +#~ msgid "Writes temporary statistics files to the specified directory." +#~ msgstr "Schreibt temporäre Statistikdateien in das angegebene Verzeichnis." + +#, c-format +#~ msgid "You need to rebuild PostgreSQL using %s." +#~ msgstr "Sie müssen PostgreSQL mit %s neu bauen." + +#, c-format +#~ msgid "a backup is already in progress" +#~ msgstr "ein Backup läuft bereits" + +#, c-format +#~ msgid "background worker \"%s\": must attach to shared memory in order to request a database connection" +#~ msgstr "Background-Worker »%s«: muss mit Shared Memory verbinden, um eine Datenbankverbindung anzufordern" + +#, c-format +#~ msgid "base backup could not send data, aborting backup" +#~ msgstr "Basissicherung konnte keine Daten senden, Sicherung abgebrochen" + +#, c-format +#~ msgid "collations with different collate and ctype values are not supported by ICU" +#~ msgstr "Sortierfolgen mit unterschiedlichen »collate«- und »ctype«-Werten werden von ICU nicht unterstützt" + +#, c-format +#~ msgid "could not bind socket for statistics collector: %m" +#~ msgstr "konnte Socket für Statistiksammelprozess nicht binden: %m" + +#, c-format +#~ msgid "could not connect socket for statistics collector: %m" +#~ msgstr "konnte nicht mit Socket für Statistiksammelprozess verbinden: %m" + +#, c-format +#~ msgid "could not create socket for statistics collector: %m" +#~ msgstr "konnte Socket für Statistiksammelprozess nicht erzeugen: %m" + +#, c-format +#~ msgid "could not delete shared fileset \"%s\": %m" +#~ msgstr "konnte geteiltes Datei-Set »%s« nicht löschen: %m" + +#, c-format +#~ msgid "could not fork statistics collector: %m" +#~ msgstr "konnte Statistiksammelprozess nicht starten (fork-Fehler): %m" + +#, c-format +#~ msgid "could not get address of socket for statistics collector: %m" +#~ msgstr "konnte Adresse für Socket für Statistiksammelprozess nicht ermitteln: %m" + +#, c-format +#~ msgid "could not poll socket: %m" +#~ msgstr "konnte Socket nicht pollen: %m" + +#, c-format +#~ msgid "could not read statistics message: %m" +#~ msgstr "konnte Statistiknachricht nicht lesen: %m" + +#, c-format +#~ msgid "could not receive test message on socket for statistics collector: %m" +#~ msgstr "konnte Testnachricht auf Socket für Statistiksammelprozess nicht empfangen: %m" + +#, c-format +#~ msgid "could not resolve \"localhost\": %s" +#~ msgstr "konnte »localhost« nicht auflösen: %s" + +#, c-format +#~ msgid "could not send test message on socket for statistics collector: %m" +#~ msgstr "konnte Testnachricht auf Socket für Statistiksammelprozess nicht senden: %m" + +#, c-format +#~ msgid "could not set statistics collector socket to nonblocking mode: %m" +#~ msgstr "konnte Socket von Statistiksammelprozess nicht auf nicht blockierenden Modus setzen: %m" + +#, c-format +#~ msgid "database hash table corrupted during cleanup --- abort" +#~ msgstr "Datenbank-Hash-Tabelle beim Aufräumen verfälscht --- Abbruch" + +#, c-format +#~ msgid "disabling statistics collector for lack of working socket" +#~ msgstr "Statistiksammelprozess abgeschaltet wegen nicht funkionierender Socket" + +#, c-format +#~ msgid "exclusive backup not in progress" +#~ msgstr "es läuft kein exklusives Backup" + +#, c-format +#~ msgid "fatal: " +#~ msgstr "Fatal: " + +#, c-format +#~ msgid "function \"close_lb\" not implemented" +#~ msgstr "Funktion »close_lb« ist nicht implementiert" + +#, c-format +#~ msgid "function \"close_sl\" not implemented" +#~ msgstr "Funktion »close_sl« ist nicht implementiert" + +#, c-format +#~ msgid "function \"dist_bl\" not implemented" +#~ msgstr "Funktion »dist_bl« ist nicht implementiert" + +#, c-format +#~ msgid "function \"dist_lb\" not implemented" +#~ msgstr "Funktion »dist_lb« ist nicht implementiert" + +#, c-format +#~ msgid "function \"path_center\" not implemented" +#~ msgstr "Funktion »path_center« ist nicht implementiert" + +#, c-format +#~ msgid "function \"poly_distance\" not implemented" +#~ msgstr "Funktion »poly_distance« ist nicht implementiert" + +#, c-format +#~ msgid "incorrect test message transmission on socket for statistics collector" +#~ msgstr "fehlerhafte Übertragung der Testnachricht auf Socket für Statistiksammelprozess" + +#, c-format +#~ msgid "interval units \"%s\" not recognized" +#~ msgstr "»interval«-Einheit »%s« nicht erkannt" + +#, c-format +#~ msgid "interval units \"%s\" not supported" +#~ msgstr "»interval«-Einheit »%s« nicht unterstützt" + +#, c-format +#~ msgid "must be a superuser to log memory contexts" +#~ msgstr "nur Superuser können Speicherkontexte loggen" + +#, c-format +#~ msgid "must be superuser to call pg_nextoid()" +#~ msgstr "nur Superuser können pg_nextoid() aufrufen" + +#, c-format +#~ msgid "must be superuser to connect during database shutdown" +#~ msgstr "nur Superuser können während des Herunterfahrens der Datenbank verbinden" + +#, c-format +#~ msgid "must be superuser to execute ALTER SYSTEM command" +#~ msgstr "nur Superuser können den Befehl ALTER SYSTEM ausführen" + +#, c-format +#~ msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" +#~ msgstr "weder BKPIMAGE_HAS_HOLE noch BKPIMAGE_IS_COMPRESSED gesetzt, aber Block-Abbild-Länge ist %u bei %X/%X" + +#, c-format +#~ msgid "new replication connections are not allowed during database shutdown" +#~ msgstr "während des Herunterfahrens der Datenbank sind keine neuen Replikationsverbindungen erlaubt" + +#, c-format +#~ msgid "non-exclusive backup in progress" +#~ msgstr "es läuft ein nicht-exklusives Backup" + +#, c-format +#~ msgid "non-exclusive backup is not in progress" +#~ msgstr "es läuft kein nicht-exklusives Backup" + +#, c-format +#~ msgid "online backup mode canceled" +#~ msgstr "Online-Sicherungsmodus storniert" + +#, c-format +#~ msgid "online backup mode was not canceled" +#~ msgstr "Online-Sicherungsmodus wurde nicht storniert" + +#, c-format +#~ msgid "query-specified return tuple and function return type are not compatible" +#~ msgstr "in der Anfrage angegebenes Rückgabetupel und Rückgabetyp der Funktion sind nicht kompatibel" + +#, c-format +#~ msgid "range_agg must be called with a range" +#~ msgstr "range_agg muss mit einem Range-Type aufgerufen werden" + +#, c-format +#~ msgid "range_intersect_agg must be called with a multirange" +#~ msgstr "range_intersect_agg muss mit einem Multirange-Typ aufgerufen werden" + +#, c-format +#~ msgid "range_intersect_agg must be called with a range" +#~ msgstr "range_intersect_agg muss mit einem Bereichstyp aufgerufen werden" + +#, c-format +#~ msgid "reference to parent directory (\"..\") not allowed" +#~ msgstr "Verweis auf übergeordnetes Verzeichnis (»..«) nicht erlaubt" + +#, c-format +#~ msgid "referenced relation \"%s\" is not a table or foreign table" +#~ msgstr "Relation »%s«, auf die verwiesen wird, ist keine Tabelle oder Fremdtabelle" + +#, c-format +#~ msgid "relation \"%s\" is not a table, foreign table, or materialized view" +#~ msgstr "Relation »%s« ist keine Tabelle, Fremdtabelle oder materialisierte Sicht" + +#, c-format +#~ msgid "select() failed in statistics collector: %m" +#~ msgstr "select() im Statistiksammelprozess fehlgeschlagen: %m" + +#~ msgid "statistics collector process" +#~ msgstr "Statistiksammelprozess" + +#, c-format +#~ msgid "statistics collector's time %s is later than backend local time %s" +#~ msgstr "Zeit im Statistiksammelprozess %s ist später als die lokale Zeit im Backend %s" + +#, c-format +#~ msgid "stats_timestamp %s is later than collector's time %s for database %u" +#~ msgstr "stats_timestamp %s ist später als die Zeit %s des Statistiksammelprozesses für Datenbank %u" + +#, c-format +#~ msgid "table \"%s\" cannot be replicated" +#~ msgstr "Tabelle »%s« kann nicht repliziert werden" + +#, c-format +#~ msgid "table \"%s\": found %lld removable, %lld nonremovable row versions in %u out of %u pages" +#~ msgstr "Tabelle »%s«: %lld entfernbare, %lld nicht entfernbare Zeilenversionen in %u von %u Seiten gefunden" + +#, c-format +#~ msgid "table \"%s\": index scan bypassed: %u pages from table (%.2f%% of total) have %lld dead item identifiers" +#~ msgstr "Tabelle »%s«: Index-Scan umgangen: %u Seiten der Tabelle (%.2f%% der Gesamtzahl) haben %lld tote Item-Bezeichner" + +#, c-format +#~ msgid "test message did not get through on socket for statistics collector" +#~ msgstr "Testnachricht auf Socket für Statistiksammelprozess kam nicht durch" + +#, c-format +#~ msgid "timestamp units \"%s\" not recognized" +#~ msgstr "»timestamp«-Einheit »%s« nicht erkannt" + +#, c-format +#~ msgid "timestamp units \"%s\" not supported" +#~ msgstr "»timestamp«-Einheit »%s« nicht unterstützt" + +#, c-format +#~ msgid "timestamp with time zone units \"%s\" not recognized" +#~ msgstr "»timestamp with time zone«-Einheit »%s« nicht erkannt" + +#, c-format +#~ msgid "timestamp with time zone units \"%s\" not supported" +#~ msgstr "»timestamp with time zone«-Einheit »%s« nicht unterstützt" + +#, c-format +#~ msgid "too many range table entries" +#~ msgstr "zu viele Range-Table-Einträge" + +#, c-format +#~ msgid "trying another address for the statistics collector" +#~ msgstr "andere Adresse für Statistiksammelprozess wird versucht" + +#, c-format +#~ msgid "unlogged sequences are not supported" +#~ msgstr "ungeloggte Sequenzen werden nicht unterstützt" + +#, c-format +#~ msgid "using stale statistics instead of current ones because stats collector is not responding" +#~ msgstr "verwende veraltete Statistiken anstatt aktueller, weil der Statistiksammelprozess nicht antwortet" + +#, c-format +#~ msgid "utility statements cannot be prepared" +#~ msgstr "Utility-Anweisungen können nicht vorbereitet werden" + +#, c-format +#~ msgid "value \"%s\" is out of range for 8-bit integer" +#~ msgstr "Wert »%s« ist außerhalb des gültigen Bereichs für 8-Bit-Ganzzahl" diff --git a/src/backend/po/es.po b/src/backend/po/es.po index f935c37165..0bcb2fd399 100644 --- a/src/backend/po/es.po +++ b/src/backend/po/es.po @@ -1,12 +1,13 @@ # Spanish message translation file for PostgreSQL server # -# Copyright (c) 2002-2019, PostgreSQL Global Development Group +# Copyright (c) 2002-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Karim Mribti 2002. # Alvaro Herrera 2003-2014 # Jaime Casanova 2005, 2006, 2014 # Emanuel Calvo Franco 2008 +# Carlos Chapi 2021 # # Glosario: # @@ -59,17 +60,18 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL server 12\n" +"Project-Id-Version: PostgreSQL server 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-06-11 16:40+0000\n" -"PO-Revision-Date: 2021-06-21 12:29+0200\n" -"Last-Translator: Álvaro Herrera \n" +"POT-Creation-Date: 2022-01-19 16:40+0000\n" +"PO-Revision-Date: 2022-03-31 16:45+0200\n" +"Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: BlackCAT 1.1\n" #: ../common/config_info.c:134 ../common/config_info.c:142 #: ../common/config_info.c:150 ../common/config_info.c:158 @@ -79,37 +81,37 @@ msgid "not recorded" msgstr "no registrado" #: ../common/controldata_utils.c:68 ../common/controldata_utils.c:73 -#: commands/copyfrom.c:1516 commands/extension.c:3455 utils/adt/genfile.c:128 +#: commands/copyfrom.c:1516 commands/extension.c:3464 utils/adt/genfile.c:128 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "no se pudo abrir archivo «%s» para lectura: %m" #: ../common/controldata_utils.c:86 ../common/controldata_utils.c:89 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1271 access/transam/xlog.c:3547 -#: access/transam/xlog.c:4772 access/transam/xlog.c:11338 -#: access/transam/xlog.c:11351 access/transam/xlog.c:11804 -#: access/transam/xlog.c:11884 access/transam/xlog.c:11921 -#: access/transam/xlog.c:11981 access/transam/xlogfuncs.c:703 -#: access/transam/xlogfuncs.c:722 commands/extension.c:3465 libpq/hba.c:534 +#: access/transam/twophase.c:1327 access/transam/xlog.c:3569 +#: access/transam/xlog.c:4807 access/transam/xlog.c:11516 +#: access/transam/xlog.c:11529 access/transam/xlog.c:11982 +#: access/transam/xlog.c:12062 access/transam/xlog.c:12099 +#: access/transam/xlog.c:12159 access/transam/xlogfuncs.c:703 +#: access/transam/xlogfuncs.c:722 commands/extension.c:3474 libpq/hba.c:534 #: replication/basebackup.c:2020 replication/logical/origin.c:729 -#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4880 -#: replication/logical/snapbuild.c:1733 replication/logical/snapbuild.c:1775 -#: replication/logical/snapbuild.c:1802 replication/slot.c:1725 -#: replication/slot.c:1766 replication/walsender.c:544 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4917 +#: replication/logical/snapbuild.c:1749 replication/logical/snapbuild.c:1791 +#: replication/logical/snapbuild.c:1818 replication/slot.c:1720 +#: replication/slot.c:1761 replication/walsender.c:544 #: storage/file/buffile.c:445 storage/file/copydir.c:195 -#: utils/adt/genfile.c:202 utils/adt/misc.c:859 utils/cache/relmapper.c:741 +#: utils/adt/genfile.c:202 utils/adt/misc.c:859 utils/cache/relmapper.c:744 #, c-format msgid "could not read file \"%s\": %m" msgstr "no se pudo leer el archivo «%s»: %m" #: ../common/controldata_utils.c:97 ../common/controldata_utils.c:101 -#: access/transam/xlog.c:3552 access/transam/xlog.c:4777 +#: access/transam/xlog.c:3574 access/transam/xlog.c:4812 #: replication/basebackup.c:2024 replication/logical/origin.c:734 -#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1738 -#: replication/logical/snapbuild.c:1780 replication/logical/snapbuild.c:1807 -#: replication/slot.c:1729 replication/slot.c:1770 replication/walsender.c:549 -#: utils/cache/relmapper.c:745 +#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1754 +#: replication/logical/snapbuild.c:1796 replication/logical/snapbuild.c:1823 +#: replication/slot.c:1724 replication/slot.c:1765 replication/walsender.c:549 +#: utils/cache/relmapper.c:748 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu" @@ -118,19 +120,19 @@ msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu" #: ../common/controldata_utils.c:256 ../common/controldata_utils.c:259 #: access/heap/rewriteheap.c:1185 access/heap/rewriteheap.c:1288 #: access/transam/timeline.c:392 access/transam/timeline.c:438 -#: access/transam/timeline.c:516 access/transam/twophase.c:1283 -#: access/transam/twophase.c:1680 access/transam/xlog.c:3419 -#: access/transam/xlog.c:3587 access/transam/xlog.c:3592 -#: access/transam/xlog.c:3920 access/transam/xlog.c:4742 -#: access/transam/xlog.c:5667 access/transam/xlogfuncs.c:728 -#: commands/copyfrom.c:1576 commands/copyto.c:328 libpq/be-fsstubs.c:462 -#: libpq/be-fsstubs.c:533 replication/logical/origin.c:667 -#: replication/logical/origin.c:806 replication/logical/reorderbuffer.c:4938 -#: replication/logical/snapbuild.c:1642 replication/logical/snapbuild.c:1815 -#: replication/slot.c:1616 replication/slot.c:1777 replication/walsender.c:559 +#: access/transam/timeline.c:516 access/transam/twophase.c:1339 +#: access/transam/twophase.c:1744 access/transam/xlog.c:3441 +#: access/transam/xlog.c:3609 access/transam/xlog.c:3614 +#: access/transam/xlog.c:3942 access/transam/xlog.c:4777 +#: access/transam/xlog.c:5702 access/transam/xlogfuncs.c:728 +#: commands/copyfrom.c:1576 commands/copyto.c:328 libpq/be-fsstubs.c:455 +#: libpq/be-fsstubs.c:525 replication/logical/origin.c:667 +#: replication/logical/origin.c:806 replication/logical/reorderbuffer.c:4975 +#: replication/logical/snapbuild.c:1658 replication/logical/snapbuild.c:1831 +#: replication/slot.c:1611 replication/slot.c:1772 replication/walsender.c:559 #: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:738 -#: storage/file/fd.c:3534 storage/file/fd.c:3637 utils/cache/relmapper.c:753 -#: utils/cache/relmapper.c:892 +#: storage/file/fd.c:3536 storage/file/fd.c:3639 utils/cache/relmapper.c:759 +#: utils/cache/relmapper.c:898 #, c-format msgid "could not close file \"%s\": %m" msgstr "no se pudo cerrar el archivo «%s»: %m" @@ -157,34 +159,34 @@ msgstr "" #: ../common/file_utils.c:232 ../common/file_utils.c:291 #: ../common/file_utils.c:365 access/heap/rewriteheap.c:1271 #: access/transam/timeline.c:111 access/transam/timeline.c:251 -#: access/transam/timeline.c:348 access/transam/twophase.c:1227 -#: access/transam/xlog.c:3305 access/transam/xlog.c:3461 -#: access/transam/xlog.c:3502 access/transam/xlog.c:3700 -#: access/transam/xlog.c:3785 access/transam/xlog.c:3888 -#: access/transam/xlog.c:4762 access/transam/xlogutils.c:803 +#: access/transam/timeline.c:348 access/transam/twophase.c:1283 +#: access/transam/xlog.c:3327 access/transam/xlog.c:3483 +#: access/transam/xlog.c:3524 access/transam/xlog.c:3722 +#: access/transam/xlog.c:3807 access/transam/xlog.c:3910 +#: access/transam/xlog.c:4797 access/transam/xlogutils.c:803 #: postmaster/syslogger.c:1488 replication/basebackup.c:616 #: replication/basebackup.c:1610 replication/logical/origin.c:719 -#: replication/logical/reorderbuffer.c:3548 -#: replication/logical/reorderbuffer.c:4095 -#: replication/logical/reorderbuffer.c:4860 -#: replication/logical/snapbuild.c:1597 replication/logical/snapbuild.c:1704 -#: replication/slot.c:1697 replication/walsender.c:517 +#: replication/logical/reorderbuffer.c:3572 +#: replication/logical/reorderbuffer.c:4121 +#: replication/logical/reorderbuffer.c:4897 +#: replication/logical/snapbuild.c:1613 replication/logical/snapbuild.c:1720 +#: replication/slot.c:1692 replication/walsender.c:517 #: replication/walsender.c:2526 storage/file/copydir.c:161 -#: storage/file/fd.c:713 storage/file/fd.c:3521 storage/file/fd.c:3608 -#: storage/smgr/md.c:502 utils/cache/relmapper.c:724 -#: utils/cache/relmapper.c:836 utils/error/elog.c:1938 +#: storage/file/fd.c:713 storage/file/fd.c:3300 storage/file/fd.c:3523 +#: storage/file/fd.c:3610 storage/smgr/md.c:503 utils/cache/relmapper.c:724 +#: utils/cache/relmapper.c:842 utils/error/elog.c:1938 #: utils/init/miscinit.c:1346 utils/init/miscinit.c:1480 -#: utils/init/miscinit.c:1557 utils/misc/guc.c:8604 utils/misc/guc.c:8636 +#: utils/init/miscinit.c:1557 utils/misc/guc.c:8605 utils/misc/guc.c:8637 #, c-format msgid "could not open file \"%s\": %m" msgstr "no se pudo abrir el archivo «%s»: %m" #: ../common/controldata_utils.c:221 ../common/controldata_utils.c:224 -#: access/transam/twophase.c:1653 access/transam/twophase.c:1662 -#: access/transam/xlog.c:11095 access/transam/xlog.c:11133 -#: access/transam/xlog.c:11546 access/transam/xlogfuncs.c:782 -#: postmaster/postmaster.c:5659 postmaster/syslogger.c:1499 -#: postmaster/syslogger.c:1512 utils/cache/relmapper.c:870 +#: access/transam/twophase.c:1717 access/transam/twophase.c:1726 +#: access/transam/xlog.c:11273 access/transam/xlog.c:11311 +#: access/transam/xlog.c:11724 access/transam/xlogfuncs.c:782 +#: postmaster/postmaster.c:5682 postmaster/syslogger.c:1499 +#: postmaster/syslogger.c:1512 utils/cache/relmapper.c:876 #, c-format msgid "could not write file \"%s\": %m" msgstr "no se pudo escribir el archivo «%s»: %m" @@ -193,40 +195,40 @@ msgstr "no se pudo escribir el archivo «%s»: %m" #: ../common/file_utils.c:303 ../common/file_utils.c:373 #: access/heap/rewriteheap.c:967 access/heap/rewriteheap.c:1179 #: access/heap/rewriteheap.c:1282 access/transam/timeline.c:432 -#: access/transam/timeline.c:510 access/transam/twophase.c:1674 -#: access/transam/xlog.c:3412 access/transam/xlog.c:3581 -#: access/transam/xlog.c:4735 access/transam/xlog.c:10586 -#: access/transam/xlog.c:10627 replication/logical/snapbuild.c:1635 -#: replication/slot.c:1602 replication/slot.c:1707 storage/file/fd.c:730 -#: storage/file/fd.c:3629 storage/smgr/md.c:950 storage/smgr/md.c:991 -#: storage/sync/sync.c:417 utils/cache/relmapper.c:885 utils/misc/guc.c:8391 +#: access/transam/timeline.c:510 access/transam/twophase.c:1738 +#: access/transam/xlog.c:3434 access/transam/xlog.c:3603 +#: access/transam/xlog.c:4770 access/transam/xlog.c:10764 +#: access/transam/xlog.c:10805 replication/logical/snapbuild.c:1651 +#: replication/slot.c:1597 replication/slot.c:1702 storage/file/fd.c:730 +#: storage/file/fd.c:3631 storage/smgr/md.c:951 storage/smgr/md.c:992 +#: storage/sync/sync.c:441 utils/cache/relmapper.c:891 utils/misc/guc.c:8392 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" #: ../common/cryptohash_openssl.c:104 ../common/exec.c:522 ../common/exec.c:567 -#: ../common/exec.c:659 ../common/hmac_openssl.c:103 ../common/psprintf.c:143 +#: ../common/exec.c:659 ../common/hmac_openssl.c:101 ../common/psprintf.c:143 #: ../common/stringinfo.c:305 ../port/path.c:630 ../port/path.c:668 -#: ../port/path.c:685 access/transam/twophase.c:1341 access/transam/xlog.c:6633 -#: lib/dshash.c:246 libpq/auth.c:1482 libpq/auth.c:1550 libpq/auth.c:2108 +#: ../port/path.c:685 access/transam/twophase.c:1397 access/transam/xlog.c:6677 +#: lib/dshash.c:246 libpq/auth.c:1491 libpq/auth.c:1559 libpq/auth.c:2117 #: libpq/be-secure-gssapi.c:520 postmaster/bgworker.c:349 -#: postmaster/bgworker.c:948 postmaster/postmaster.c:2516 -#: postmaster/postmaster.c:4175 postmaster/postmaster.c:4845 -#: postmaster/postmaster.c:5584 postmaster/postmaster.c:5948 -#: replication/libpqwalreceiver/libpqwalreceiver.c:282 +#: postmaster/bgworker.c:948 postmaster/postmaster.c:2540 +#: postmaster/postmaster.c:4198 postmaster/postmaster.c:4868 +#: postmaster/postmaster.c:5607 postmaster/postmaster.c:5971 +#: replication/libpqwalreceiver/libpqwalreceiver.c:283 #: replication/logical/logical.c:205 replication/walsender.c:591 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:882 storage/file/fd.c:1352 -#: storage/file/fd.c:1513 storage/file/fd.c:2321 storage/ipc/procarray.c:1388 -#: storage/ipc/procarray.c:2182 storage/ipc/procarray.c:2189 -#: storage/ipc/procarray.c:2678 storage/ipc/procarray.c:3302 +#: storage/buffer/localbuf.c:442 storage/file/fd.c:882 storage/file/fd.c:1354 +#: storage/file/fd.c:1515 storage/file/fd.c:2323 storage/ipc/procarray.c:1422 +#: storage/ipc/procarray.c:2247 storage/ipc/procarray.c:2254 +#: storage/ipc/procarray.c:2756 storage/ipc/procarray.c:3380 #: utils/adt/cryptohashfuncs.c:46 utils/adt/cryptohashfuncs.c:66 #: utils/adt/formatting.c:1699 utils/adt/formatting.c:1823 #: utils/adt/formatting.c:1948 utils/adt/pg_locale.c:450 #: utils/adt/pg_locale.c:614 utils/adt/regexp.c:223 utils/fmgr/dfmgr.c:229 #: utils/hash/dynahash.c:513 utils/hash/dynahash.c:613 #: utils/hash/dynahash.c:1116 utils/mb/mbutils.c:401 utils/mb/mbutils.c:429 -#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5035 -#: utils/misc/guc.c:5051 utils/misc/guc.c:5064 utils/misc/guc.c:8369 +#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5036 +#: utils/misc/guc.c:5052 utils/misc/guc.c:5065 utils/misc/guc.c:8370 #: utils/misc/tzparser.c:467 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:701 #: utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:234 #: utils/mmgr/mcxt.c:888 utils/mmgr/mcxt.c:924 utils/mmgr/mcxt.c:962 @@ -262,19 +264,18 @@ msgstr "no se pudo encontrar un «%s» para ejecutar" msgid "could not change directory to \"%s\": %m" msgstr "no se pudo cambiar al directorio «%s»: %m" -#: ../common/exec.c:286 access/transam/xlog.c:10969 +#: ../common/exec.c:286 access/transam/xlog.c:11147 #: replication/basebackup.c:1428 utils/adt/misc.c:340 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "no se pudo leer el enlace simbólico «%s»: %m" -#: ../common/exec.c:409 libpq/pqcomm.c:746 storage/ipc/latch.c:1064 +#: ../common/exec.c:409 libpq/pqcomm.c:761 storage/ipc/latch.c:1064 #: storage/ipc/latch.c:1233 storage/ipc/latch.c:1462 storage/ipc/latch.c:1614 #: storage/ipc/latch.c:1730 -#, fuzzy, c-format -#| msgid "%s failed: %m" +#, c-format msgid "%s() failed: %m" -msgstr "%s falló: %m" +msgstr "%s() falló: %m" #: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 #: ../common/fe_memutils.c:98 ../common/fe_memutils.c:162 @@ -291,70 +292,43 @@ msgid "cannot duplicate null pointer (internal error)\n" msgstr "no se puede duplicar un puntero nulo (error interno)\n" #: ../common/file_utils.c:87 ../common/file_utils.c:451 -#: ../common/file_utils.c:455 access/transam/twophase.c:1239 -#: access/transam/xlog.c:11071 access/transam/xlog.c:11109 -#: access/transam/xlog.c:11326 access/transam/xlogarchive.c:110 +#: ../common/file_utils.c:455 access/transam/twophase.c:1295 +#: access/transam/xlog.c:11249 access/transam/xlog.c:11287 +#: access/transam/xlog.c:11504 access/transam/xlogarchive.c:110 #: access/transam/xlogarchive.c:227 commands/copyfrom.c:1526 -#: commands/copyto.c:734 commands/extension.c:3444 commands/tablespace.c:807 -#: commands/tablespace.c:898 guc-file.l:1060 replication/basebackup.c:439 +#: commands/copyto.c:728 commands/extension.c:3453 commands/tablespace.c:803 +#: commands/tablespace.c:894 guc-file.l:1062 replication/basebackup.c:439 #: replication/basebackup.c:622 replication/basebackup.c:698 -#: replication/logical/snapbuild.c:1514 storage/file/copydir.c:68 -#: storage/file/copydir.c:107 storage/file/fd.c:1863 storage/file/fd.c:1949 -#: storage/file/fd.c:3149 storage/file/fd.c:3353 utils/adt/dbsize.c:70 +#: replication/logical/snapbuild.c:1530 storage/file/copydir.c:68 +#: storage/file/copydir.c:107 storage/file/fd.c:1865 storage/file/fd.c:1951 +#: storage/file/fd.c:3151 storage/file/fd.c:3355 utils/adt/dbsize.c:70 #: utils/adt/dbsize.c:222 utils/adt/dbsize.c:302 utils/adt/genfile.c:418 #: utils/adt/genfile.c:644 #, c-format msgid "could not stat file \"%s\": %m" msgstr "no se pudo hacer stat al archivo «%s»: %m" -#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:730 -#: commands/tablespace.c:740 postmaster/postmaster.c:1515 -#: storage/file/fd.c:2724 storage/file/reinit.c:122 utils/adt/misc.c:262 +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:726 +#: commands/tablespace.c:736 postmaster/postmaster.c:1515 +#: storage/file/fd.c:2726 storage/file/reinit.c:122 utils/adt/misc.c:262 #: utils/misc/tzparser.c:338 #, c-format msgid "could not open directory \"%s\": %m" msgstr "no se pudo abrir el directorio «%s»: %m" -#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2736 +#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2738 #, c-format msgid "could not read directory \"%s\": %m" msgstr "no se pudo leer el directorio «%s»: %m" #: ../common/file_utils.c:383 access/transam/xlogarchive.c:412 -#: postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1654 -#: replication/slot.c:668 replication/slot.c:1488 replication/slot.c:1630 -#: storage/file/fd.c:748 storage/file/fd.c:846 utils/time/snapmgr.c:1265 +#: postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1670 +#: replication/slot.c:643 replication/slot.c:1483 replication/slot.c:1625 +#: storage/file/fd.c:748 storage/file/fd.c:846 utils/time/snapmgr.c:1280 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" -#: ../common/hex.c:54 -#, fuzzy, c-format -#| msgid "invalid hexadecimal digit: \"%c\"" -msgid "invalid hexadecimal digit" -msgstr "el dígito hexadecimal no es válido: «%c»" - -#: ../common/hex.c:59 -#, fuzzy, c-format -#| msgid "invalid hexadecimal digit: \"%c\"" -msgid "invalid hexadecimal digit: \"%.*s\"" -msgstr "el dígito hexadecimal no es válido: «%c»" - -#: ../common/hex.c:90 -#, c-format -msgid "overflow of destination buffer in hex encoding" -msgstr "" - -#: ../common/hex.c:136 ../common/hex.c:141 -#, c-format -msgid "invalid hexadecimal data: odd number of digits" -msgstr "el dato hexadecimal no es válido: tiene un número impar de dígitos" - -#: ../common/hex.c:152 -#, c-format -msgid "overflow of destination buffer in hex decoding" -msgstr "" - #: ../common/jsonapi.c:1066 #, c-format msgid "Escape sequence \"\\%s\" is invalid." @@ -468,7 +442,7 @@ msgstr "nombre de «fork» no válido" msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." msgstr "Los nombres de «fork» válidos son «main», «fsm», «vm» e «init»." -#: ../common/restricted_token.c:64 libpq/auth.c:1512 libpq/auth.c:2544 +#: ../common/restricted_token.c:64 libpq/auth.c:1521 libpq/auth.c:2553 #, c-format msgid "could not load library \"%s\": error code %lu" msgstr "no se pudo cargar la biblioteca «%s»: código de error %lu" @@ -540,7 +514,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "no se pudo encontrar el ID de usuario efectivo %ld: %s" -#: ../common/username.c:45 libpq/auth.c:2044 +#: ../common/username.c:45 libpq/auth.c:2053 msgid "user does not exist" msgstr "usuario no existe" @@ -663,7 +637,7 @@ msgid "request for BRIN range summarization for index \"%s\" page %u was not rec msgstr "petición para sumarización BRIN de rango para el índice «%s» página %u no fue registrada" #: access/brin/brin.c:1015 access/brin/brin.c:1092 access/gin/ginfast.c:1035 -#: access/transam/xlog.c:10748 access/transam/xlog.c:11277 +#: access/transam/xlog.c:10926 access/transam/xlog.c:11455 #: access/transam/xlogfuncs.c:274 access/transam/xlogfuncs.c:301 #: access/transam/xlogfuncs.c:340 access/transam/xlogfuncs.c:361 #: access/transam/xlogfuncs.c:382 access/transam/xlogfuncs.c:452 @@ -688,14 +662,13 @@ msgid "\"%s\" is not a BRIN index" msgstr "«%s» no es un índice BRIN" #: access/brin/brin.c:1063 access/brin/brin.c:1140 -#, fuzzy, c-format -#| msgid "could not open parent table of index %s" +#, c-format msgid "could not open parent table of index \"%s\"" -msgstr "no se pudo abrir la tabla padre del índice %s" +msgstr "no se pudo abrir la tabla padre del índice «%s»" #: access/brin/brin_bloom.c:751 access/brin/brin_bloom.c:793 -#: access/brin/brin_minmax_multi.c:2987 access/brin/brin_minmax_multi.c:3130 -#: statistics/dependencies.c:651 statistics/dependencies.c:704 +#: access/brin/brin_minmax_multi.c:3004 access/brin/brin_minmax_multi.c:3147 +#: statistics/dependencies.c:662 statistics/dependencies.c:715 #: statistics/mcv.c:1483 statistics/mcv.c:1514 statistics/mvdistinct.c:343 #: statistics/mvdistinct.c:396 utils/adt/pseudotypes.c:43 #: utils/adt/pseudotypes.c:77 utils/adt/pseudotypes.c:252 @@ -703,8 +676,8 @@ msgstr "no se pudo abrir la tabla padre del índice %s" msgid "cannot accept a value of type %s" msgstr "no se puede aceptar un valor de tipo %s" -#: access/brin/brin_minmax_multi.c:2146 access/brin/brin_minmax_multi.c:2153 -#: access/brin/brin_minmax_multi.c:2160 utils/adt/timestamp.c:941 +#: access/brin/brin_minmax_multi.c:2163 access/brin/brin_minmax_multi.c:2170 +#: access/brin/brin_minmax_multi.c:2177 utils/adt/timestamp.c:941 #: utils/adt/timestamp.c:1515 utils/adt/timestamp.c:1982 #: utils/adt/timestamp.c:3059 utils/adt/timestamp.c:3064 #: utils/adt/timestamp.c:3069 utils/adt/timestamp.c:3119 @@ -713,7 +686,7 @@ msgstr "no se puede aceptar un valor de tipo %s" #: utils/adt/timestamp.c:3167 utils/adt/timestamp.c:3197 #: utils/adt/timestamp.c:3205 utils/adt/timestamp.c:3249 #: utils/adt/timestamp.c:3676 utils/adt/timestamp.c:3801 -#: utils/adt/timestamp.c:4349 +#: utils/adt/timestamp.c:4359 #, c-format msgid "interval out of range" msgstr "interval fuera de rango" @@ -829,7 +802,7 @@ msgstr "el número de columnas (%d) excede el límite (%d)" msgid "number of index columns (%d) exceeds limit (%d)" msgstr "el número de columnas del índice (%d) excede el límite (%d)" -#: access/common/indextuple.c:190 access/spgist/spgutils.c:947 +#: access/common/indextuple.c:190 access/spgist/spgutils.c:959 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "fila de índice requiere %zu bytes, tamaño máximo es %zu" @@ -840,97 +813,94 @@ msgstr "fila de índice requiere %zu bytes, tamaño máximo es %zu" msgid "unsupported format code: %d" msgstr "código de formato no soportado: %d" -#: access/common/reloptions.c:506 +#: access/common/reloptions.c:512 access/common/reloptions.c:523 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "Los valores aceptables son «on», «off» y «auto»." -#: access/common/reloptions.c:517 +#: access/common/reloptions.c:534 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "Los valores aceptables son «local» y «cascaded»." -#: access/common/reloptions.c:665 +#: access/common/reloptions.c:682 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "el límite de tipos de parámetros de relación definidos por el usuario ha sido excedido" -#: access/common/reloptions.c:1208 +#: access/common/reloptions.c:1225 #, c-format msgid "RESET must not include values for parameters" msgstr "RESET no debe incluir valores de parámetros" -#: access/common/reloptions.c:1240 +#: access/common/reloptions.c:1257 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "espacio de nombre de parámetro «%s» no reconocido" -#: access/common/reloptions.c:1277 utils/misc/guc.c:12514 +#: access/common/reloptions.c:1294 utils/misc/guc.c:12515 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "las tablas declaradas WITH OIDS no está soportado" -#: access/common/reloptions.c:1447 +#: access/common/reloptions.c:1464 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "parámetro «%s» no reconocido" -#: access/common/reloptions.c:1559 +#: access/common/reloptions.c:1576 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "el parámetro «%s» fue especificado más de una vez" -#: access/common/reloptions.c:1575 +#: access/common/reloptions.c:1592 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "valor no válido para la opción booleana «%s»: «%s»" -#: access/common/reloptions.c:1587 +#: access/common/reloptions.c:1604 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "valor no válido para la opción entera «%s»: «%s»" -#: access/common/reloptions.c:1593 access/common/reloptions.c:1613 +#: access/common/reloptions.c:1610 access/common/reloptions.c:1630 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "el valor %s está fuera del rango de la opción «%s»" -#: access/common/reloptions.c:1595 +#: access/common/reloptions.c:1612 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Los valores aceptables están entre «%d» y «%d»." -#: access/common/reloptions.c:1607 +#: access/common/reloptions.c:1624 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "valor no válido para la opción de coma flotante «%s»: «%s»" -#: access/common/reloptions.c:1615 +#: access/common/reloptions.c:1632 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Valores aceptables están entre «%f» y «%f»." -#: access/common/reloptions.c:1637 +#: access/common/reloptions.c:1654 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "valor no válido para la opción enum «%s»: %s" #: access/common/toast_compression.c:32 -#, fuzzy, c-format -#| msgid "unlink not supported with compression" -msgid "unsupported LZ4 compression method" -msgstr "unlink no soportado con compresión" +#, c-format +msgid "compression method lz4 not supported" +msgstr "el método de compresión lz4 no está soportado" #: access/common/toast_compression.c:33 -#, fuzzy, c-format -#| msgid "This functionality requires the server to be built with libxml support." +#, c-format msgid "This functionality requires the server to be built with lz4 support." -msgstr "Esta funcionalidad requiere que el servidor haya sido construido con soporte libxml." +msgstr "Esta funcionalidad requiere que el servidor haya sido construido con soporte lz4." #: access/common/toast_compression.c:34 utils/adt/pg_locale.c:1589 #: utils/adt/xml.c:224 -#, fuzzy, c-format -#| msgid "You need to rebuild PostgreSQL using --with-icu." +#, c-format msgid "You need to rebuild PostgreSQL using %s." -msgstr "Necesita reconstruir PostgreSQL usando --with-icu." +msgstr "Necesita reconstruir PostgreSQL usando %s." #: access/common/tupdesc.c:825 parser/parse_clause.c:771 #: parser/parse_relation.c:1838 @@ -979,7 +949,7 @@ msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Para corregir esto, ejecute REINDEX INDEX \"%s\"." #: access/gin/ginutil.c:145 executor/execExpr.c:2166 -#: utils/adt/arrayfuncs.c:3818 utils/adt/arrayfuncs.c:6452 +#: utils/adt/arrayfuncs.c:3819 utils/adt/arrayfuncs.c:6487 #: utils/adt/rowtypes.c:957 #, c-format msgid "could not identify a comparison function for type %s" @@ -998,10 +968,9 @@ msgstr "falta la función de soporte %3$d o %4$d de la clase de operadores «%1$ #: access/gin/ginvalidate.c:333 access/gist/gistvalidate.c:350 #: access/spgist/spgvalidate.c:387 -#, fuzzy, c-format -#| msgid "operator family %s for access method %s" +#, c-format msgid "support function number %d is invalid for access method %s" -msgstr "familia de operadores %s para el método de acceso %s" +msgstr "el número de función de soporte %d no es válido para el método de acceso %s" #: access/gist/gist.c:758 access/gist/gistvacuum.c:420 #, c-format @@ -1013,7 +982,7 @@ msgstr "el índice «%s» contiene una tupla interna marcada como no válida" msgid "This is caused by an incomplete page split at crash recovery before upgrading to PostgreSQL 9.1." msgstr "Esto es causado por una división de página incompleta durante una recuperación antes de actualizar a PostgreSQL 9.1." -#: access/gist/gist.c:761 access/gist/gistutil.c:801 access/gist/gistutil.c:812 +#: access/gist/gist.c:761 access/gist/gistutil.c:800 access/gist/gistutil.c:811 #: access/gist/gistvacuum.c:423 access/hash/hashutil.c:227 #: access/hash/hashutil.c:238 access/hash/hashutil.c:250 #: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:810 @@ -1023,10 +992,9 @@ msgid "Please REINDEX it." msgstr "Por favor aplíquele REINDEX." #: access/gist/gist.c:1175 -#, fuzzy, c-format -#| msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" +#, c-format msgid "fixing incomplete split in index \"%s\", block %u" -msgstr "tipo de página 0x%04X inesperado en el índice BRIN «%s» bloque %u" +msgstr "arreglando división incompleta en el índice «%s», bloque %u" #: access/gist/gistsplit.c:446 #, c-format @@ -1038,13 +1006,13 @@ msgstr "el método picksplit para la columna %d del índice «%s» falló" msgid "The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command." msgstr "El índice no es óptimo. Para optimizarlo, contacte un desarrollador o trate de usar la columna en segunda posición en la orden CREATE INDEX." -#: access/gist/gistutil.c:798 access/hash/hashutil.c:224 +#: access/gist/gistutil.c:797 access/hash/hashutil.c:224 #: access/nbtree/nbtpage.c:807 #, c-format msgid "index \"%s\" contains unexpected zero page at block %u" msgstr "índice «%s» contiene páginas vacías no esperadas en el bloque %u" -#: access/gist/gistutil.c:809 access/hash/hashutil.c:235 +#: access/gist/gistutil.c:808 access/hash/hashutil.c:235 #: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:818 #, c-format msgid "index \"%s\" contains corrupted page at block %u" @@ -1060,19 +1028,19 @@ msgstr "la familia de operadores «%s» del método de acceso %s contiene una es msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY opfamily specification for operator %s" msgstr "la familia de operadores «%s» del método de acceso %s contiene una especificación de familia en ORDER BY incorrecta para el operador %s" -#: access/hash/hashfunc.c:255 access/hash/hashfunc.c:311 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:334 #: utils/adt/varchar.c:993 utils/adt/varchar.c:1053 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "no se pudo determinar qué ordenamiento usar para el hashing de cadenas" -#: access/hash/hashfunc.c:256 access/hash/hashfunc.c:312 catalog/heap.c:713 -#: catalog/heap.c:719 commands/createas.c:206 commands/createas.c:509 -#: commands/indexcmds.c:1869 commands/tablecmds.c:16795 commands/view.c:86 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:335 catalog/heap.c:713 +#: catalog/heap.c:719 commands/createas.c:206 commands/createas.c:503 +#: commands/indexcmds.c:1869 commands/tablecmds.c:16839 commands/view.c:86 #: regex/regc_pg_locale.c:263 utils/adt/formatting.c:1666 #: utils/adt/formatting.c:1790 utils/adt/formatting.c:1915 utils/adt/like.c:194 #: utils/adt/like_support.c:1003 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:994 utils/adt/varchar.c:1054 utils/adt/varlena.c:1524 +#: utils/adt/varchar.c:994 utils/adt/varchar.c:1054 utils/adt/varlena.c:1517 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "Use la cláusula COLLATE para establecer el ordenamiento explícitamente." @@ -1083,7 +1051,7 @@ msgid "index row size %zu exceeds hash maximum %zu" msgstr "el tamaño de fila de índice %zu excede el máximo para hash %zu" #: access/hash/hashinsert.c:84 access/spgist/spgdoinsert.c:2004 -#: access/spgist/spgdoinsert.c:2279 access/spgist/spgutils.c:1008 +#: access/spgist/spgdoinsert.c:2279 access/spgist/spgutils.c:1020 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "Valores mayores a una página del buffer no pueden ser indexados." @@ -1138,7 +1106,7 @@ msgstr "no se pueden eliminar tuplas durante una operación paralela" msgid "attempted to delete invisible tuple" msgstr "se intentó eliminar una tupla invisible" -#: access/heap/heapam.c:3209 access/heap/heapam.c:6010 +#: access/heap/heapam.c:3209 access/heap/heapam.c:6019 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "no se pueden actualizar tuplas durante una operación paralela" @@ -1149,12 +1117,12 @@ msgid "attempted to update invisible tuple" msgstr "se intentó actualizar una tupla invisible" #: access/heap/heapam.c:4663 access/heap/heapam.c:4701 -#: access/heap/heapam.c:4957 access/heap/heapam_handler.c:454 +#: access/heap/heapam.c:4966 access/heap/heapam_handler.c:456 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "no se pudo bloquear un candado en la fila de la relación «%s»" -#: access/heap/heapam_handler.c:403 +#: access/heap/heapam_handler.c:401 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update" msgstr "el registro a ser bloqueado ya fue movido a otra partición por un update concurrente" @@ -1171,13 +1139,13 @@ msgstr "no se pudo escribir al archivo «%s», se escribió %d de %d: %m" #: access/heap/rewriteheap.c:1020 access/heap/rewriteheap.c:1138 #: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:3328 access/transam/xlog.c:3516 -#: access/transam/xlog.c:4714 access/transam/xlog.c:11086 -#: access/transam/xlog.c:11124 access/transam/xlog.c:11529 -#: access/transam/xlogfuncs.c:776 postmaster/postmaster.c:4600 -#: postmaster/postmaster.c:5646 replication/logical/origin.c:587 -#: replication/slot.c:1549 storage/file/copydir.c:167 storage/smgr/md.c:218 -#: utils/time/snapmgr.c:1244 +#: access/transam/xlog.c:3350 access/transam/xlog.c:3538 +#: access/transam/xlog.c:4749 access/transam/xlog.c:11264 +#: access/transam/xlog.c:11302 access/transam/xlog.c:11707 +#: access/transam/xlogfuncs.c:776 postmaster/postmaster.c:4623 +#: postmaster/postmaster.c:5669 replication/logical/origin.c:587 +#: replication/slot.c:1544 storage/file/copydir.c:167 storage/smgr/md.c:218 +#: utils/time/snapmgr.c:1259 #, c-format msgid "could not create file \"%s\": %m" msgstr "no se pudo crear archivo «%s»: %m" @@ -1189,249 +1157,214 @@ msgstr "no se pudo truncar el archivo «%s» a %u: %m" #: access/heap/rewriteheap.c:1166 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3400 access/transam/xlog.c:3572 -#: access/transam/xlog.c:4726 postmaster/postmaster.c:4610 -#: postmaster/postmaster.c:4620 replication/logical/origin.c:599 +#: access/transam/xlog.c:3422 access/transam/xlog.c:3594 +#: access/transam/xlog.c:4761 postmaster/postmaster.c:4633 +#: postmaster/postmaster.c:4643 replication/logical/origin.c:599 #: replication/logical/origin.c:641 replication/logical/origin.c:660 -#: replication/logical/snapbuild.c:1611 replication/slot.c:1584 +#: replication/logical/snapbuild.c:1627 replication/slot.c:1579 #: storage/file/buffile.c:506 storage/file/copydir.c:207 #: utils/init/miscinit.c:1421 utils/init/miscinit.c:1432 -#: utils/init/miscinit.c:1440 utils/misc/guc.c:8352 utils/misc/guc.c:8383 -#: utils/misc/guc.c:10292 utils/misc/guc.c:10306 utils/time/snapmgr.c:1249 -#: utils/time/snapmgr.c:1256 +#: utils/init/miscinit.c:1440 utils/misc/guc.c:8353 utils/misc/guc.c:8384 +#: utils/misc/guc.c:10293 utils/misc/guc.c:10307 utils/time/snapmgr.c:1264 +#: utils/time/snapmgr.c:1271 #, c-format msgid "could not write to file \"%s\": %m" msgstr "no se pudo escribir a archivo «%s»: %m" -#: access/heap/rewriteheap.c:1256 access/transam/twophase.c:1613 +#: access/heap/rewriteheap.c:1256 access/transam/twophase.c:1677 #: access/transam/xlogarchive.c:118 access/transam/xlogarchive.c:422 #: postmaster/postmaster.c:1096 postmaster/syslogger.c:1465 -#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4362 -#: replication/logical/snapbuild.c:1556 replication/logical/snapbuild.c:1972 -#: replication/slot.c:1681 storage/file/fd.c:788 storage/file/fd.c:3169 -#: storage/file/fd.c:3231 storage/file/reinit.c:250 storage/ipc/dsm.c:315 -#: storage/smgr/md.c:344 storage/smgr/md.c:394 storage/sync/sync.c:231 -#: utils/time/snapmgr.c:1589 +#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4390 +#: replication/logical/snapbuild.c:1572 replication/logical/snapbuild.c:1988 +#: replication/slot.c:1676 storage/file/fd.c:788 storage/file/fd.c:3171 +#: storage/file/fd.c:3233 storage/file/reinit.c:250 storage/ipc/dsm.c:315 +#: storage/smgr/md.c:344 storage/smgr/md.c:394 storage/sync/sync.c:237 +#: utils/time/snapmgr.c:1604 #, c-format msgid "could not remove file \"%s\": %m" msgstr "no se pudo eliminar el archivo «%s»: %m" -#: access/heap/vacuumlazy.c:745 +#: access/heap/vacuumlazy.c:773 #, c-format msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "vacuum agresivo automático para prevenir wraparound de la tabla «%s.%s.%s»: recorridos de índice: %d\n" -#: access/heap/vacuumlazy.c:747 +#: access/heap/vacuumlazy.c:775 #, c-format msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "vacuum automático para prevenir wraparound de la tabla «%s.%s.%s»: recorridos de índice: %d\n" -#: access/heap/vacuumlazy.c:752 +#: access/heap/vacuumlazy.c:780 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "vacuum agresivo automático de la tabla «%s.%s.%s»: recorridos de índice: %d\n" -#: access/heap/vacuumlazy.c:754 +#: access/heap/vacuumlazy.c:782 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "vacuum automático de la tabla «%s.%s.%s»: recorridos de índice: %d\n" -#: access/heap/vacuumlazy.c:761 +#: access/heap/vacuumlazy.c:789 #, c-format msgid "pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n" msgstr "páginas: %u eliminadas, %u quedan, %u saltadas debido a «pins», %u congeladas saltadas\n" -#: access/heap/vacuumlazy.c:767 -#, fuzzy, c-format -#| msgid "tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable, oldest xmin: %u\n" +#: access/heap/vacuumlazy.c:795 +#, c-format msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable, oldest xmin: %u\n" -msgstr "tuplas: %.0f removidas, %.0f permanecen ,%.0f están muertas pero aún no se pueden quitar, el xmin más antiguo: %u\n" +msgstr "tuplas: %lld removidas, %lld permanecen ,%lld están muertas pero aún no se pueden quitar, el xmin más antiguo: %u\n" -#: access/heap/vacuumlazy.c:773 commands/analyze.c:794 -#, c-format -msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" -msgstr "uso de búfers: %lld aciertos, %lld fallos, %lld ensuciados\n" +#: access/heap/vacuumlazy.c:806 +msgid "index scan not needed: " +msgstr "recorrido de índice no necesario: " + +#: access/heap/vacuumlazy.c:808 +msgid "index scan needed: " +msgstr "recorrido de índice necesario: " -#: access/heap/vacuumlazy.c:783 +#: access/heap/vacuumlazy.c:810 #, c-format -msgid " %u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" -msgstr "" +msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" +msgstr "en %u páginas de la tabla (%.2f%% del total) se eliminaron %lld identificadores de elementos muertos\n" -#: access/heap/vacuumlazy.c:786 -#, fuzzy -#| msgid "index \"%s\" not found" -msgid "index scan not needed:" -msgstr "índice «%s» no encontrado" +#: access/heap/vacuumlazy.c:815 +msgid "index scan bypassed: " +msgstr "recorrido de índice pasado por alto: " -#: access/heap/vacuumlazy.c:788 -#, fuzzy -#| msgid "index \"%s\" was reindexed" -msgid "index scan needed:" -msgstr "el índice «%s» fue reindexado" +#: access/heap/vacuumlazy.c:817 +msgid "index scan bypassed by failsafe: " +msgstr "recorrido de índice pasado por alto debido a modo failsafe: " -#: access/heap/vacuumlazy.c:792 +#: access/heap/vacuumlazy.c:819 #, c-format -msgid " %u pages from table (%.2f%% of total) have %lld dead item identifiers\n" -msgstr "" - -#: access/heap/vacuumlazy.c:795 -msgid "index scan bypassed:" -msgstr "" +msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" +msgstr "%u páginas de la tabla (%.2f%% del total) tienen %lld identificadores de elementos muertos\n" -#: access/heap/vacuumlazy.c:797 -msgid "index scan bypassed by failsafe:" -msgstr "" - -#: access/heap/vacuumlazy.c:813 +#: access/heap/vacuumlazy.c:834 #, c-format msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" -msgstr "" +msgstr "índice «%s»: páginas: %u en total, %u recientemente eliminadas, %u eliminadas hasta ahora, %u reusables\n" + +#: access/heap/vacuumlazy.c:846 commands/analyze.c:814 +#, c-format +msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" +msgstr "tiempos de E/S: lectura: %.3f ms, escritura: %.3f ms\n" -#: access/heap/vacuumlazy.c:820 commands/analyze.c:798 +#: access/heap/vacuumlazy.c:849 commands/analyze.c:817 #, c-format msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" msgstr "tasa lectura promedio: %.3f MB/s, tasa escritura promedio: %.3f MB/s\n" -#: access/heap/vacuumlazy.c:824 commands/analyze.c:802 -msgid "I/O Timings:" -msgstr "" - -#: access/heap/vacuumlazy.c:826 commands/analyze.c:804 +#: access/heap/vacuumlazy.c:852 commands/analyze.c:819 #, c-format -msgid " read=%.3f" -msgstr "" +msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" +msgstr "uso de búfers: %lld aciertos, %lld fallos, %lld ensuciados\n" -#: access/heap/vacuumlazy.c:829 commands/analyze.c:807 +#: access/heap/vacuumlazy.c:857 #, c-format -msgid " write=%.3f" -msgstr "" +msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" +msgstr "uso de WAL: %lld registros, %lld imágenes de página completa, %llu bytes\n" -#: access/heap/vacuumlazy.c:833 +#: access/heap/vacuumlazy.c:861 commands/analyze.c:823 #, c-format -msgid "system usage: %s\n" -msgstr "uso de sistema: %s\n" - -#: access/heap/vacuumlazy.c:835 -#, fuzzy, c-format -#| msgid "WAL usage: %ld records, %ld full page images, " -msgid "WAL usage: %lld records, %lld full page images, %llu bytes" -msgstr "uso de WAL: %ld registros, %ld imágenes de página, " +msgid "system usage: %s" +msgstr "uso de sistema: %s" -#: access/heap/vacuumlazy.c:911 +#: access/heap/vacuumlazy.c:933 #, c-format msgid "aggressively vacuuming \"%s.%s\"" msgstr "haciendo vacuum agresivamente a «%s.%s»" -#: access/heap/vacuumlazy.c:916 commands/cluster.c:898 +#: access/heap/vacuumlazy.c:938 commands/cluster.c:898 #, c-format msgid "vacuuming \"%s.%s\"" msgstr "haciendo vacuum a «%s.%s»" -#: access/heap/vacuumlazy.c:1627 -#, fuzzy, c-format -#| msgid "\"%s\": removed %d row versions in %d pages" -msgid "\"%s\": removed %lld dead item identifiers in %u pages" -msgstr "«%s»: se eliminaron %d versiones de filas en %d páginas" - -#: access/heap/vacuumlazy.c:1633 -#, fuzzy, c-format -#| msgid "%.0f dead row versions cannot be removed yet, oldest xmin: %u\n" -msgid "%lld dead row versions cannot be removed yet, oldest xmin: %u\n" -msgstr "%.0f versiones muertas de filas no pueden ser eliminadas aún, xmin máx antiguo: %u\n" +#: access/heap/vacuumlazy.c:1640 access/heap/vacuumlazy.c:2385 +#, c-format +msgid "table \"%s\": removed %lld dead item identifiers in %u pages" +msgstr "tabla «%s»: se eliminaron %lld identificadores de elementos muertos en %u páginas" -#: access/heap/vacuumlazy.c:1635 +#: access/heap/vacuumlazy.c:1656 #, c-format -msgid "%u page removed.\n" -msgid_plural "%u pages removed.\n" -msgstr[0] "" -msgstr[1] "" +msgid "%lld dead row versions cannot be removed yet, oldest xmin: %u\n" +msgstr "%lld versiones muertas de registros no pueden ser eliminadas aún, xmin más antiguo: %u\n" -#: access/heap/vacuumlazy.c:1639 +#: access/heap/vacuumlazy.c:1658 #, c-format msgid "Skipped %u page due to buffer pins, " msgid_plural "Skipped %u pages due to buffer pins, " msgstr[0] "Omitiendo %u página debido a «pins» de página, " msgstr[1] "Omitiendo %u páginas debido a «pins» de página, " -#: access/heap/vacuumlazy.c:1643 +#: access/heap/vacuumlazy.c:1662 #, c-format msgid "%u frozen page.\n" msgid_plural "%u frozen pages.\n" msgstr[0] "%u página marcadas «frozen».\n" msgstr[1] "%u páginas marcadas «frozen».\n" -#: access/heap/vacuumlazy.c:1647 commands/indexcmds.c:3986 +#: access/heap/vacuumlazy.c:1666 commands/indexcmds.c:3986 #: commands/indexcmds.c:4005 #, c-format msgid "%s." msgstr "%s." -#: access/heap/vacuumlazy.c:1650 -#, fuzzy, c-format -#| msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u out of %u pages" -msgid "\"%s\": found %lld removable, %lld nonremovable row versions in %u out of %u pages" -msgstr "«%s»: se encontraron %.0f versiones de filas eliminables y %.0f no eliminables en %u de %u páginas" - -#: access/heap/vacuumlazy.c:2155 +#: access/heap/vacuumlazy.c:1669 #, c-format -msgid "\"%s\": index scan bypassed: %u pages from table (%.2f%% of total) have %lld dead item identifiers" -msgstr "" +msgid "table \"%s\": found %lld removable, %lld nonremovable row versions in %u out of %u pages" +msgstr "tabla «%s»: se encontraron %lld versiones de registros eliminables y %lld no eliminables en %u de %u páginas" -#: access/heap/vacuumlazy.c:2366 -#, fuzzy, c-format -#| msgid "\"%s\": removed %d row versions in %d pages" -msgid "\"%s\": removed %d dead item identifiers in %u pages" -msgstr "«%s»: se eliminaron %d versiones de filas en %d páginas" +#: access/heap/vacuumlazy.c:2173 +#, c-format +msgid "table \"%s\": index scan bypassed: %u pages from table (%.2f%% of total) have %lld dead item identifiers" +msgstr "tabla «%s»: recorrido de índice pasado por alto: %u páginas de la tabla (%.2f%% del total) tienen %lld identificadores de elementos muertos" -#: access/heap/vacuumlazy.c:2598 -#, fuzzy, c-format -#| msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" +#: access/heap/vacuumlazy.c:2617 +#, c-format msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" -msgstr "vacuum automático de la tabla «%s.%s.%s»: recorridos de índice: %d\n" +msgstr "pasando por alto el mantenimiento no esencial de la tabla «%s.%s.%s» como mecanismo de seguridad (failsafe) luego de %d recorridos de índice" -#: access/heap/vacuumlazy.c:2603 -#, fuzzy, c-format -#| msgid "oldest xmin is far in the past" -msgid "table's relfrozenxid or relminmxid is too far in the past" -msgstr "xmin más antiguo es demasiado antiguo" +#: access/heap/vacuumlazy.c:2622 +#, c-format +msgid "The table's relfrozenxid or relminmxid is too far in the past." +msgstr "El relfrozenxid o el relminmxid de la tabla es demasiado antiguo." -#: access/heap/vacuumlazy.c:2604 +#: access/heap/vacuumlazy.c:2623 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" "You might also need to consider other ways for VACUUM to keep up with the allocation of transaction IDs." msgstr "" +"Considere incrementar el parámetro de configuración «maintenance_work_mem» o «autovacuum_work_mem».\n" +"Es probable que también deba considerar otras formas para que VACUUM pueda mantener el paso de la asignación de IDs de transacción." -#: access/heap/vacuumlazy.c:2744 +#: access/heap/vacuumlazy.c:2763 #, c-format msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" msgstr[0] "se lanzó %d proceso asistente para «cleanup» de índices (planeados: %d)" msgstr[1] "se lanzaron %d procesos asistentes para «cleanup» de índices (planeados: %d)" -#: access/heap/vacuumlazy.c:2750 +#: access/heap/vacuumlazy.c:2769 #, c-format msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" msgstr[0] "se lanzó %d proceso asistente para «vacuum» de índices (planeados: %d)" msgstr[1] "se lanzaron %d procesos asistentes para «vacuum» índices (planeados: %d)" -#: access/heap/vacuumlazy.c:3039 +#: access/heap/vacuumlazy.c:3063 #, c-format msgid "scanned index \"%s\" to remove %d row versions" msgstr "se recorrió el índice «%s» para eliminar %d versiones de filas" -#: access/heap/vacuumlazy.c:3096 +#: access/heap/vacuumlazy.c:3120 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "el índice «%s» ahora contiene %.0f versiones de filas en %u páginas" -#: access/heap/vacuumlazy.c:3100 -#, fuzzy, c-format -#| msgid "" -#| "%.0f index row versions were removed.\n" -#| "%u index pages have been deleted, %u are currently reusable.\n" -#| "%s." +#: access/heap/vacuumlazy.c:3124 +#, c-format msgid "" "%.0f index row versions were removed.\n" "%u index pages were newly deleted.\n" @@ -1439,72 +1372,71 @@ msgid "" "%s." msgstr "" "%.0f versiones de filas del índice fueron eliminadas.\n" -"%u páginas de índice han sido eliminadas, %u son reusables.\n" +"%u páginas de índice fueron eliminadas recientemente.\n" +"%u páginas de índices han sido eliminadas hasta ahora, de las cuales %u son reusables.\n" "%s." -#: access/heap/vacuumlazy.c:3212 +#: access/heap/vacuumlazy.c:3233 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "«%s»: suspendiendo el truncado debido a una petición de candado en conflicto" -#: access/heap/vacuumlazy.c:3278 +#: access/heap/vacuumlazy.c:3299 #, c-format -msgid "\"%s\": truncated %u to %u pages" -msgstr "«%s»: truncadas %u a %u páginas" +msgid "table \"%s\": truncated %u to %u pages" +msgstr "tabla «%s»: truncadas %u a %u páginas" -#: access/heap/vacuumlazy.c:3343 +#: access/heap/vacuumlazy.c:3363 #, c-format -msgid "\"%s\": suspending truncate due to conflicting lock request" -msgstr "«%s»: suspendiendo el truncado debido a una petición de candado en conflicto" +msgid "table \"%s\": suspending truncate due to conflicting lock request" +msgstr "tabla «%s»: suspendiendo el truncado debido a una petición de bloqueo en conflicto" -#: access/heap/vacuumlazy.c:3489 +#: access/heap/vacuumlazy.c:3508 #, c-format msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" msgstr "desactivando el comportamiento paralelo de vacuum en «%s» --- no se puede hacer vacuum de tablas temporales en paralelo" -#: access/heap/vacuumlazy.c:4244 -#, fuzzy, c-format -#| msgid "while scanning block %u of relation \"%s.%s\"" -msgid "while scanning block %u and offset %u of relation \"%s.%s\"" -msgstr "recorriendo el bloque %u de la relación «%s.%s»" +#: access/heap/vacuumlazy.c:4274 +#, c-format +msgid "while scanning block %u offset %u of relation \"%s.%s\"" +msgstr "recorriendo el bloque %u posición %u de la relación «%s.%s»" -#: access/heap/vacuumlazy.c:4247 +#: access/heap/vacuumlazy.c:4277 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "recorriendo el bloque %u de la relación «%s.%s»" -#: access/heap/vacuumlazy.c:4251 +#: access/heap/vacuumlazy.c:4281 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "recorriendo la relación «%s.%s»" -#: access/heap/vacuumlazy.c:4259 -#, fuzzy, c-format -#| msgid "while vacuuming block %u of relation \"%s.%s\"" -msgid "while vacuuming block %u and offset %u of relation \"%s.%s\"" -msgstr "haciendo «vacuum» al bloque %u de la relación «%s.%s»" +#: access/heap/vacuumlazy.c:4289 +#, c-format +msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" +msgstr "haciendo «vacuum» al bloque %u posición %u de la relación «%s.%s»" -#: access/heap/vacuumlazy.c:4262 +#: access/heap/vacuumlazy.c:4292 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "haciendo «vacuum» al bloque %u de la relación «%s.%s»" -#: access/heap/vacuumlazy.c:4266 +#: access/heap/vacuumlazy.c:4296 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "mientras se hacía «vacuum» a la relación «%s.%s»" -#: access/heap/vacuumlazy.c:4271 +#: access/heap/vacuumlazy.c:4301 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "mientras se hacía «vacuum» al índice «%s» de la relación «%s.%s»" -#: access/heap/vacuumlazy.c:4276 +#: access/heap/vacuumlazy.c:4306 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "mientras se limpiaba el índice «%s» de la relación «%s.%s»" -#: access/heap/vacuumlazy.c:4282 +#: access/heap/vacuumlazy.c:4312 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "error mientras se truncaba la relación «%s.%s» a %u bloques" @@ -1520,14 +1452,13 @@ msgid "index access method \"%s\" does not have a handler" msgstr "el método de acceso «%s» no tiene manejador" #: access/index/genam.c:486 -#, fuzzy, c-format -#| msgid "cannot reindex system catalogs concurrently" +#, c-format msgid "transaction aborted during system catalog scan" -msgstr "no se pueden reindexar catálogos de sistema concurrentemente" +msgstr "transacción abortada durante recorrido de catálogos de sistema" #: access/index/indexam.c:142 catalog/objectaddress.c:1355 #: commands/indexcmds.c:2670 commands/tablecmds.c:267 commands/tablecmds.c:291 -#: commands/tablecmds.c:16493 commands/tablecmds.c:18195 +#: commands/tablecmds.c:16537 commands/tablecmds.c:18274 #, c-format msgid "\"%s\" is not an index" msgstr "«%s» no es un índice" @@ -1553,7 +1484,7 @@ msgid "This may be because of a non-immutable index expression." msgstr "Esto puede deberse a una expresión de índice no inmutable." #: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 -#: parser/parse_utilcmd.c:2329 +#: parser/parse_utilcmd.c:2319 #, c-format msgid "index \"%s\" is not a btree" msgstr "el índice «%s» no es un btree" @@ -1597,21 +1528,20 @@ msgstr "" msgid "operator family \"%s\" of access method %s is missing support function for types %s and %s" msgstr "falta una función de soporte para los tipos %3$s y %4$s en la familia de operadores «%1$s» del método de acceso %2$s" -#: access/spgist/spgutils.c:232 +#: access/spgist/spgutils.c:244 #, c-format msgid "compress method must be defined when leaf type is different from input type" msgstr "método «compress» debe estar definido cuando el tipo hoja es distinto del tipo de entrada" -#: access/spgist/spgutils.c:1005 +#: access/spgist/spgutils.c:1017 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "el tamaño de tupla interna SP-GiST %zu excede el máximo %zu" #: access/spgist/spgvalidate.c:136 -#, fuzzy, c-format -#| msgid "anycompatiblerange type %s does not match anycompatible type %s" +#, c-format msgid "SP-GiST leaf data type %s does not match declared type %s" -msgstr "el tipo anycompatiblerange %s no coincide con el tipo anycompatible %s" +msgstr "el tipo de dato hoja SP-GiST %s no coincide con el tipo declarado %s" #: access/spgist/spgvalidate.c:302 #, c-format @@ -1625,8 +1555,8 @@ msgid "\"%s\" is an index" msgstr "«%s» es un índice" #: access/table/table.c:54 access/table/table.c:88 access/table/table.c:117 -#: access/table/table.c:150 catalog/aclchk.c:1799 commands/tablecmds.c:13198 -#: commands/tablecmds.c:16502 +#: access/table/table.c:150 catalog/aclchk.c:1799 commands/tablecmds.c:13238 +#: commands/tablecmds.c:16546 #, c-format msgid "\"%s\" is a composite type" msgstr "«%s» es un tipo compuesto" @@ -1641,7 +1571,7 @@ msgstr "el tid (%u, %u) no es válido para la relación «%s»" msgid "%s cannot be empty." msgstr "%s no puede ser vacío." -#: access/table/tableamapi.c:122 utils/misc/guc.c:12438 +#: access/table/tableamapi.c:122 utils/misc/guc.c:12439 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s es demasiado largo (máximo %d caracteres)." @@ -1672,10 +1602,9 @@ msgid "could not get commit timestamp data" msgstr "no se pudo obtener datos de compromiso de transacción" #: access/transam/commit_ts.c:378 -#, fuzzy, c-format -#| msgid "Make sure the configuration parameter \"%s\" is set on the master server." +#, c-format msgid "Make sure the configuration parameter \"%s\" is set on the primary server." -msgstr "Asegúrese que el parámetro de configuración «%s» esté definido en el servidor maestro." +msgstr "Asegúrese que el parámetro de configuración «%s» esté definido en el servidor primario." #: access/transam/commit_ts.c:380 #, c-format @@ -1702,14 +1631,14 @@ msgstr "" msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u" msgstr "la base de datos no está aceptando órdenes que generen nuevos MultiXactIds para evitar pérdida de datos debido al problema del reciclaje de transacciones en la base con OID %u" -#: access/transam/multixact.c:1049 access/transam/multixact.c:2330 +#: access/transam/multixact.c:1049 access/transam/multixact.c:2333 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" msgstr[0] "base de datos «%s» debe ser limpiada antes de que %u más MultiXactId sea usado" msgstr[1] "base de datos «%s» debe ser limpiada dentro de que %u más MultiXactIds sean usados" -#: access/transam/multixact.c:1058 access/transam/multixact.c:2339 +#: access/transam/multixact.c:1058 access/transam/multixact.c:2342 #, c-format msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" @@ -1745,7 +1674,7 @@ msgstr[1] "base de datos con OID %u debe ser limpiada antes de que %d más miemb msgid "Execute a database-wide VACUUM in that database with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." msgstr "Ejecute un VACUUM de la base completa en esa base de datos con vacuum_multixact_freeze_min_age y vacuum_multixact_freeze_table_age reducidos." -#: access/transam/multixact.c:1298 +#: access/transam/multixact.c:1300 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "el MultiXactId %u ya no existe -- aparente problema por reciclaje" @@ -1755,7 +1684,7 @@ msgstr "el MultiXactId %u ya no existe -- aparente problema por reciclaje" msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "el MultiXactId %u no se ha creado aún -- aparente problema por reciclaje" -#: access/transam/multixact.c:2335 access/transam/multixact.c:2344 +#: access/transam/multixact.c:2338 access/transam/multixact.c:2347 #: access/transam/varsup.c:151 access/transam/varsup.c:158 #: access/transam/varsup.c:466 access/transam/varsup.c:473 #, c-format @@ -1766,61 +1695,61 @@ msgstr "" "Para evitar que la base de datos se desactive, ejecute VACUUM en esa base de datos.\n" "Puede que además necesite comprometer o abortar transacciones preparadas antiguas, o eliminar slots de replicación añejos." -#: access/transam/multixact.c:2618 +#: access/transam/multixact.c:2621 #, c-format msgid "MultiXact member wraparound protections are disabled because oldest checkpointed MultiXact %u does not exist on disk" msgstr "las protecciones de reciclaje de miembros de multixact están inhabilitadas porque el multixact más antiguo %u en checkpoint no existe en disco" -#: access/transam/multixact.c:2640 +#: access/transam/multixact.c:2643 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "las protecciones de reciclaje de miembros de multixact están habilitadas" -#: access/transam/multixact.c:3027 +#: access/transam/multixact.c:3030 #, c-format msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" msgstr "multixact más antiguo %u no encontrado, multixact más antiguo es %u, omitiendo el truncado" -#: access/transam/multixact.c:3045 +#: access/transam/multixact.c:3048 #, c-format msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" msgstr "no se puede truncar hasta el MultiXact %u porque no existe en disco, omitiendo el truncado" -#: access/transam/multixact.c:3359 +#: access/transam/multixact.c:3362 #, c-format msgid "invalid MultiXactId: %u" msgstr "el MultiXactId no es válido: %u" -#: access/transam/parallel.c:707 access/transam/parallel.c:826 +#: access/transam/parallel.c:718 access/transam/parallel.c:837 #, c-format msgid "parallel worker failed to initialize" msgstr "el ayudante paralelo no pudo iniciar" -#: access/transam/parallel.c:708 access/transam/parallel.c:827 +#: access/transam/parallel.c:719 access/transam/parallel.c:838 #, c-format msgid "More details may be available in the server log." msgstr "Puede haber más detalles disponibles en el log del servidor." -#: access/transam/parallel.c:888 +#: access/transam/parallel.c:899 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "postmaster terminó durante una transacción paralela" -#: access/transam/parallel.c:1075 +#: access/transam/parallel.c:1086 #, c-format msgid "lost connection to parallel worker" msgstr "se ha perdido la conexión al ayudante paralelo" -#: access/transam/parallel.c:1141 access/transam/parallel.c:1143 +#: access/transam/parallel.c:1152 access/transam/parallel.c:1154 msgid "parallel worker" msgstr "ayudante paralelo" -#: access/transam/parallel.c:1294 +#: access/transam/parallel.c:1307 #, c-format msgid "could not map dynamic shared memory segment" msgstr "no se pudo mapear el segmento de memoria compartida dinámica" -#: access/transam/parallel.c:1299 +#: access/transam/parallel.c:1312 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "número mágico no válido en segmento de memoria compartida dinámica" @@ -1943,144 +1872,146 @@ msgstr "Defina max_prepared_transactions a un valor distinto de cero." msgid "transaction identifier \"%s\" is already in use" msgstr "identificador de transacción «%s» ya está siendo utilizado" -#: access/transam/twophase.c:417 access/transam/twophase.c:2385 +#: access/transam/twophase.c:417 access/transam/twophase.c:2449 #, c-format msgid "maximum number of prepared transactions reached" msgstr "se alcanzó el número máximo de transacciones preparadas" -#: access/transam/twophase.c:418 access/transam/twophase.c:2386 +#: access/transam/twophase.c:418 access/transam/twophase.c:2450 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "Incremente max_prepared_transactions (actualmente es %d)." -#: access/transam/twophase.c:584 +#: access/transam/twophase.c:594 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "transacción preparada con identificador «%s» está ocupada" -#: access/transam/twophase.c:590 +#: access/transam/twophase.c:600 #, c-format msgid "permission denied to finish prepared transaction" msgstr "se ha denegado el permiso para finalizar la transacción preparada" -#: access/transam/twophase.c:591 +#: access/transam/twophase.c:601 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "Debe ser superusuario o el usuario que preparó la transacción." -#: access/transam/twophase.c:602 +#: access/transam/twophase.c:612 #, c-format msgid "prepared transaction belongs to another database" msgstr "la transacción preparada pertenece a otra base de datos" -#: access/transam/twophase.c:603 +#: access/transam/twophase.c:613 #, c-format msgid "Connect to the database where the transaction was prepared to finish it." msgstr "Conéctese a la base de datos donde la transacción fue preparada para terminarla." -#: access/transam/twophase.c:618 +#: access/transam/twophase.c:628 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "transacción preparada con identificador «%s» no existe" -#: access/transam/twophase.c:1093 +#: access/transam/twophase.c:1149 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "el largo máximo del archivo de estado de dos fases fue excedido" -#: access/transam/twophase.c:1247 -#, fuzzy, c-format -#| msgid "incorrect size of file \"%s\": %zu byte" -#| msgid_plural "incorrect size of file \"%s\": %zu bytes" +#: access/transam/twophase.c:1303 +#, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" -msgstr[0] "tamaño incorrecto de archivo «%s»: %zu byte" -msgstr[1] "tamaño incorrecto de archivo «%s»: %zu bytes" +msgstr[0] "tamaño incorrecto de archivo «%s»: %lld byte" +msgstr[1] "tamaño incorrecto de archivo «%s»: %lld bytes" -#: access/transam/twophase.c:1256 +#: access/transam/twophase.c:1312 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "alineamiento incorrecto del offset del CRC para el archivo «%s»" -#: access/transam/twophase.c:1274 -#, fuzzy, c-format -#| msgid "could not read file \"%s\": read %d of %zu" +#: access/transam/twophase.c:1330 +#, c-format msgid "could not read file \"%s\": read %d of %lld" -msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu" +msgstr "no se pudo leer el archivo «%s»: leídos %d de %lld" -#: access/transam/twophase.c:1289 +#: access/transam/twophase.c:1345 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "número mágico no válido almacenado en archivo «%s»" -#: access/transam/twophase.c:1295 +#: access/transam/twophase.c:1351 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "tamaño no válido en archivo «%s»" -#: access/transam/twophase.c:1307 +#: access/transam/twophase.c:1363 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "la suma de verificación calculada no coincide con el valor almacenado en el archivo «%s»" -#: access/transam/twophase.c:1342 access/transam/xlog.c:6634 +#: access/transam/twophase.c:1398 access/transam/xlog.c:6678 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Falló mientras se emplazaba un procesador de lectura de WAL." -#: access/transam/twophase.c:1357 +#: access/transam/twophase.c:1415 +#, c-format +msgid "could not read two-phase state from WAL at %X/%X: %s" +msgstr "no se pudo leer el archivo de estado de dos fases desde WAL en %X/%X: %s" + +#: access/transam/twophase.c:1420 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "no se pudo leer el archivo de estado de dos fases desde WAL en %X/%X" -#: access/transam/twophase.c:1364 +#: access/transam/twophase.c:1428 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "los datos de estado de dos fases esperados no están presentes en WAL en %X/%X" -#: access/transam/twophase.c:1641 +#: access/transam/twophase.c:1705 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "no se pudo recrear archivo «%s»: %m" -#: access/transam/twophase.c:1768 +#: access/transam/twophase.c:1832 #, c-format msgid "%u two-phase state file was written for a long-running prepared transaction" msgid_plural "%u two-phase state files were written for long-running prepared transactions" msgstr[0] "%u archivo de estado de dos fases fue escrito para transacción de larga duración" msgstr[1] "%u archivos de estado de dos fases fueron escritos para transacciones de larga duración" -#: access/transam/twophase.c:2002 +#: access/transam/twophase.c:2066 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "recuperando transacción preparada %u desde memoria compartida" -#: access/transam/twophase.c:2093 +#: access/transam/twophase.c:2157 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "eliminando archivo obsoleto de estado de dos fases para transacción %u" -#: access/transam/twophase.c:2100 +#: access/transam/twophase.c:2164 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "eliminando de memoria estado de dos fases obsoleto para transacción %u" -#: access/transam/twophase.c:2113 +#: access/transam/twophase.c:2177 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "eliminando archivo futuro de estado de dos fases para transacción %u" -#: access/transam/twophase.c:2120 +#: access/transam/twophase.c:2184 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "eliminando estado de dos fases futuro de memoria para transacción %u" -#: access/transam/twophase.c:2145 +#: access/transam/twophase.c:2209 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "archivo de estado de dos fases corrupto para transacción %u" -#: access/transam/twophase.c:2150 +#: access/transam/twophase.c:2214 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "estado de dos fases en memoria corrupto para transacción %u" @@ -2114,564 +2045,558 @@ msgstr "base de datos «%s» debe ser limpiada dentro de %u transacciones" msgid "database with OID %u must be vacuumed within %u transactions" msgstr "base de datos con OID %u debe ser limpiada dentro de %u transacciones" -#: access/transam/xact.c:1045 +#: access/transam/xact.c:1046 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "no se pueden tener más de 2^32-2 órdenes en una transacción" -#: access/transam/xact.c:1582 +#: access/transam/xact.c:1583 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "se superó el número máximo de subtransacciones comprometidas (%d)" -#: access/transam/xact.c:2423 +#: access/transam/xact.c:2434 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "no se puede hacer PREPARE de una transacción que ha operado en objetos temporales" -#: access/transam/xact.c:2433 +#: access/transam/xact.c:2444 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "no se puede hacer PREPARE de una transacción que ha exportado snapshots" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3388 +#: access/transam/xact.c:3408 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s no puede ser ejecutado dentro de un bloque de transacción" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3398 +#: access/transam/xact.c:3418 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%s no puede ser ejecutado dentro de una subtransacción" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3408 +#: access/transam/xact.c:3428 #, c-format msgid "%s cannot be executed from a function" msgstr "%s no puede ser ejecutado desde una función" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3477 access/transam/xact.c:3783 -#: access/transam/xact.c:3862 access/transam/xact.c:3985 -#: access/transam/xact.c:4136 access/transam/xact.c:4205 -#: access/transam/xact.c:4316 +#: access/transam/xact.c:3497 access/transam/xact.c:3803 +#: access/transam/xact.c:3882 access/transam/xact.c:4005 +#: access/transam/xact.c:4156 access/transam/xact.c:4225 +#: access/transam/xact.c:4336 #, c-format msgid "%s can only be used in transaction blocks" msgstr "la orden %s sólo puede ser usada en bloques de transacción" -#: access/transam/xact.c:3669 +#: access/transam/xact.c:3689 #, c-format msgid "there is already a transaction in progress" msgstr "ya hay una transacción en curso" -#: access/transam/xact.c:3788 access/transam/xact.c:3867 -#: access/transam/xact.c:3990 +#: access/transam/xact.c:3808 access/transam/xact.c:3887 +#: access/transam/xact.c:4010 #, c-format msgid "there is no transaction in progress" msgstr "no hay una transacción en curso" -#: access/transam/xact.c:3878 +#: access/transam/xact.c:3898 #, c-format msgid "cannot commit during a parallel operation" msgstr "no se puede comprometer una transacción durante una operación paralela" -#: access/transam/xact.c:4001 +#: access/transam/xact.c:4021 #, c-format msgid "cannot abort during a parallel operation" msgstr "no se puede abortar durante una operación paralela" -#: access/transam/xact.c:4100 +#: access/transam/xact.c:4120 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "no se pueden definir savepoints durante una operación paralela" -#: access/transam/xact.c:4187 +#: access/transam/xact.c:4207 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "no se pueden liberar savepoints durante una operación paralela" -#: access/transam/xact.c:4197 access/transam/xact.c:4248 -#: access/transam/xact.c:4308 access/transam/xact.c:4357 +#: access/transam/xact.c:4217 access/transam/xact.c:4268 +#: access/transam/xact.c:4328 access/transam/xact.c:4377 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "no existe el «savepoint» «%s»" -#: access/transam/xact.c:4254 access/transam/xact.c:4363 +#: access/transam/xact.c:4274 access/transam/xact.c:4383 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "el «savepoint» «%s» no existe dentro del nivel de savepoint actual" -#: access/transam/xact.c:4296 +#: access/transam/xact.c:4316 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "no se puede hacer rollback a un savepoint durante una operación paralela" -#: access/transam/xact.c:4424 +#: access/transam/xact.c:4444 #, c-format msgid "cannot start subtransactions during a parallel operation" msgstr "no se pueden iniciar subtransacciones durante una operación paralela" -#: access/transam/xact.c:4492 +#: access/transam/xact.c:4512 #, c-format msgid "cannot commit subtransactions during a parallel operation" msgstr "no se pueden comprometer subtransacciones durante una operación paralela" -#: access/transam/xact.c:5133 +#: access/transam/xact.c:5159 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "no se pueden tener más de 2^32-1 subtransacciones en una transacción" -#: access/transam/xlog.c:1825 +#: access/transam/xlog.c:1835 #, c-format msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" -msgstr "" +msgstr "petición para sincronizar (flush) más allá del final del WAL generado; petición %X/%X, posición actual %X/%X" -#: access/transam/xlog.c:2586 +#: access/transam/xlog.c:2608 #, c-format msgid "could not write to log file %s at offset %u, length %zu: %m" msgstr "no se pudo escribir archivo de registro %s en la posición %u, largo %zu: %m" -#: access/transam/xlog.c:3988 access/transam/xlogutils.c:798 +#: access/transam/xlog.c:4010 access/transam/xlogutils.c:798 #: replication/walsender.c:2520 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "el segmento de WAL solicitado %s ya ha sido eliminado" -#: access/transam/xlog.c:4263 +#: access/transam/xlog.c:4285 #, c-format msgid "could not rename file \"%s\": %m" msgstr "no se pudo renombrar el archivo «%s»: %m" -#: access/transam/xlog.c:4305 access/transam/xlog.c:4315 +#: access/transam/xlog.c:4327 access/transam/xlog.c:4337 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "no existe el directorio WAL «%s»" -#: access/transam/xlog.c:4321 +#: access/transam/xlog.c:4343 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "creando el directorio WAL faltante «%s»" -#: access/transam/xlog.c:4324 +#: access/transam/xlog.c:4346 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "no se pudo crear el directorio faltante «%s»: %m" -#: access/transam/xlog.c:4427 +#: access/transam/xlog.c:4462 #, c-format msgid "unexpected timeline ID %u in log segment %s, offset %u" msgstr "ID de timeline %u inesperado en archivo %s, posición %u" -#: access/transam/xlog.c:4565 +#: access/transam/xlog.c:4600 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "el nuevo timeline %u especificado no es hijo del timeline de sistema %u" -#: access/transam/xlog.c:4579 +#: access/transam/xlog.c:4614 #, c-format msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" msgstr "el nuevo timeline %u bifurcó del timeline del sistema actual %u antes del punto re recuperación actual %X/%X" -#: access/transam/xlog.c:4598 +#: access/transam/xlog.c:4633 #, c-format msgid "new target timeline is %u" msgstr "el nuevo timeline destino es %u" -#: access/transam/xlog.c:4634 +#: access/transam/xlog.c:4669 #, c-format msgid "could not generate secret authorization token" msgstr "no se pudo generar un token de autorización secreto" -#: access/transam/xlog.c:4793 access/transam/xlog.c:4802 -#: access/transam/xlog.c:4826 access/transam/xlog.c:4833 -#: access/transam/xlog.c:4840 access/transam/xlog.c:4845 -#: access/transam/xlog.c:4852 access/transam/xlog.c:4859 -#: access/transam/xlog.c:4866 access/transam/xlog.c:4873 -#: access/transam/xlog.c:4880 access/transam/xlog.c:4887 -#: access/transam/xlog.c:4896 access/transam/xlog.c:4903 +#: access/transam/xlog.c:4828 access/transam/xlog.c:4837 +#: access/transam/xlog.c:4861 access/transam/xlog.c:4868 +#: access/transam/xlog.c:4875 access/transam/xlog.c:4880 +#: access/transam/xlog.c:4887 access/transam/xlog.c:4894 +#: access/transam/xlog.c:4901 access/transam/xlog.c:4908 +#: access/transam/xlog.c:4915 access/transam/xlog.c:4922 +#: access/transam/xlog.c:4931 access/transam/xlog.c:4938 #: utils/init/miscinit.c:1578 #, c-format msgid "database files are incompatible with server" msgstr "los archivos de base de datos son incompatibles con el servidor" -#: access/transam/xlog.c:4794 +#: access/transam/xlog.c:4829 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." msgstr "Los archivos de base de datos fueron inicializados con PG_CONTROL_VERSION %d (0x%08x), pero el servidor fue compilado con PG_CONTROL_VERSION %d (0x%08x)." -#: access/transam/xlog.c:4798 +#: access/transam/xlog.c:4833 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." msgstr "Este puede ser un problema de discordancia en el orden de bytes. Parece que necesitará ejecutar initdb." -#: access/transam/xlog.c:4803 +#: access/transam/xlog.c:4838 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." msgstr "Los archivos de base de datos fueron inicializados con PG_CONTROL_VERSION %d, pero el servidor fue compilado con PG_CONTROL_VERSION %d." -#: access/transam/xlog.c:4806 access/transam/xlog.c:4830 -#: access/transam/xlog.c:4837 access/transam/xlog.c:4842 +#: access/transam/xlog.c:4841 access/transam/xlog.c:4865 +#: access/transam/xlog.c:4872 access/transam/xlog.c:4877 #, c-format msgid "It looks like you need to initdb." msgstr "Parece que necesita ejecutar initdb." -#: access/transam/xlog.c:4817 +#: access/transam/xlog.c:4852 #, c-format msgid "incorrect checksum in control file" msgstr "la suma de verificación es incorrecta en el archivo de control" -#: access/transam/xlog.c:4827 +#: access/transam/xlog.c:4862 #, c-format msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." msgstr "Los archivos de base de datos fueron inicializados con CATALOG_VERSION_NO %d, pero el servidor fue compilado con CATALOG_VERSION_NO %d." -#: access/transam/xlog.c:4834 +#: access/transam/xlog.c:4869 #, c-format msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." msgstr "Los archivos de la base de datos fueron inicializados con MAXALIGN %d, pero el servidor fue compilado con MAXALIGN %d." -#: access/transam/xlog.c:4841 +#: access/transam/xlog.c:4876 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "Los archivos de la base de datos parecen usar un formato de número de coma flotante distinto al del ejecutable del servidor." -#: access/transam/xlog.c:4846 +#: access/transam/xlog.c:4881 #, c-format msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." msgstr "Los archivos de base de datos fueron inicializados con BLCKSZ %d, pero el servidor fue compilado con BLCKSZ %d." -#: access/transam/xlog.c:4849 access/transam/xlog.c:4856 -#: access/transam/xlog.c:4863 access/transam/xlog.c:4870 -#: access/transam/xlog.c:4877 access/transam/xlog.c:4884 -#: access/transam/xlog.c:4891 access/transam/xlog.c:4899 -#: access/transam/xlog.c:4906 +#: access/transam/xlog.c:4884 access/transam/xlog.c:4891 +#: access/transam/xlog.c:4898 access/transam/xlog.c:4905 +#: access/transam/xlog.c:4912 access/transam/xlog.c:4919 +#: access/transam/xlog.c:4926 access/transam/xlog.c:4934 +#: access/transam/xlog.c:4941 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Parece que necesita recompilar o ejecutar initdb." -#: access/transam/xlog.c:4853 +#: access/transam/xlog.c:4888 #, c-format msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." msgstr "Los archivos de la base de datos fueron inicializados con RELSEG_SIZE %d, pero el servidor fue compilado con RELSEG_SIZE %d." -#: access/transam/xlog.c:4860 +#: access/transam/xlog.c:4895 #, c-format msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." msgstr "Los archivos de base de datos fueron inicializados con XLOG_BLCKSZ %d, pero el servidor fue compilado con XLOG_BLCKSZ %d." -#: access/transam/xlog.c:4867 +#: access/transam/xlog.c:4902 #, c-format msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." msgstr "Los archivos de la base de datos fueron inicializados con NAMEDATALEN %d, pero el servidor fue compilado con NAMEDATALEN %d." -#: access/transam/xlog.c:4874 +#: access/transam/xlog.c:4909 #, c-format msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." msgstr "Los archivos de la base de datos fueron inicializados con INDEX_MAX_KEYS %d, pero el servidor fue compilado con INDEX_MAX_KEYS %d." -#: access/transam/xlog.c:4881 +#: access/transam/xlog.c:4916 #, c-format msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." msgstr "Los archivos de la base de datos fueron inicializados con TOAST_MAX_CHUNK_SIZE %d, pero el servidor fue compilado con TOAST_MAX_CHUNK_SIZE %d." -#: access/transam/xlog.c:4888 +#: access/transam/xlog.c:4923 #, c-format msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." msgstr "Los archivos de base de datos fueron inicializados con LOBLKSIZE %d, pero el servidor fue compilado con LOBLKSIZE %d." -#: access/transam/xlog.c:4897 +#: access/transam/xlog.c:4932 #, c-format msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." msgstr "Los archivos de base de datos fueron inicializados sin USE_FLOAT8_BYVAL, pero el servidor fue compilado con USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4904 +#: access/transam/xlog.c:4939 #, c-format msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." msgstr "Los archivos de base de datos fueron inicializados con USE_FLOAT8_BYVAL, pero el servidor fue compilado sin USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4913 +#: access/transam/xlog.c:4948 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" msgstr[0] "El tamaño del segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el archivo de control especifica %d byte" msgstr[1] "El tamaño del segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el archivo de control especifica %d bytes" -#: access/transam/xlog.c:4925 +#: access/transam/xlog.c:4960 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "«min_wal_size» debe ser al menos el doble de «wal_segment_size»" -#: access/transam/xlog.c:4929 +#: access/transam/xlog.c:4964 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "«max_wal_size» debe ser al menos el doble de «wal_segment_size»" -#: access/transam/xlog.c:5363 +#: access/transam/xlog.c:5398 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "no se pudo escribir el archivo WAL de boostrap: %m" -#: access/transam/xlog.c:5371 +#: access/transam/xlog.c:5406 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "no se pudo sincronizar (fsync) el archivo de WAL de bootstrap: %m" -#: access/transam/xlog.c:5377 +#: access/transam/xlog.c:5412 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "no se pudo cerrar el archivo WAL de bootstrap: %m" -#: access/transam/xlog.c:5438 +#: access/transam/xlog.c:5473 #, c-format msgid "using recovery command file \"%s\" is not supported" msgstr "el uso del archivo de configuración de recuperación «%s» no está soportado" -#: access/transam/xlog.c:5503 +#: access/transam/xlog.c:5538 #, c-format msgid "standby mode is not supported by single-user servers" msgstr "el modo standby no está soportado en el modo mono-usuario" -#: access/transam/xlog.c:5520 +#: access/transam/xlog.c:5555 #, c-format msgid "specified neither primary_conninfo nor restore_command" msgstr "no se especifica primary_conninfo ni restore_command" -#: access/transam/xlog.c:5521 +#: access/transam/xlog.c:5556 #, c-format msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." msgstr "El servidor de bases de datos monitoreará el subdirectorio pg_wal con regularidad en búsqueda de archivos almacenados ahí." -#: access/transam/xlog.c:5529 +#: access/transam/xlog.c:5564 #, c-format msgid "must specify restore_command when standby mode is not enabled" msgstr "debe especificarse restore_command cuando el modo standby no está activo" -#: access/transam/xlog.c:5567 +#: access/transam/xlog.c:5602 #, c-format msgid "recovery target timeline %u does not exist" msgstr "no existe el timeline %u especificado como destino de recuperación" -#: access/transam/xlog.c:5689 +#: access/transam/xlog.c:5724 #, c-format msgid "archive recovery complete" msgstr "recuperación completa" -#: access/transam/xlog.c:5755 access/transam/xlog.c:6026 +#: access/transam/xlog.c:5790 access/transam/xlog.c:6061 #, c-format msgid "recovery stopping after reaching consistency" msgstr "deteniendo recuperación al alcanzar un estado consistente" -#: access/transam/xlog.c:5776 +#: access/transam/xlog.c:5811 #, c-format msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" msgstr "deteniendo recuperación antes de la ubicación (LSN) de WAL «%X/%X»" -#: access/transam/xlog.c:5861 +#: access/transam/xlog.c:5896 #, c-format msgid "recovery stopping before commit of transaction %u, time %s" msgstr "deteniendo recuperación antes de comprometer la transacción %u, hora %s" -#: access/transam/xlog.c:5868 +#: access/transam/xlog.c:5903 #, c-format msgid "recovery stopping before abort of transaction %u, time %s" msgstr "deteniendo recuperación antes de abortar la transacción %u, hora %s" -#: access/transam/xlog.c:5921 +#: access/transam/xlog.c:5956 #, c-format msgid "recovery stopping at restore point \"%s\", time %s" msgstr "deteniendo recuperación en el punto de recuperación «%s», hora %s" -#: access/transam/xlog.c:5939 +#: access/transam/xlog.c:5974 #, c-format msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" msgstr "deteniendo recuperación después de la ubicación (LSN) de WAL «%X/%X»" -#: access/transam/xlog.c:6006 +#: access/transam/xlog.c:6041 #, c-format msgid "recovery stopping after commit of transaction %u, time %s" msgstr "deteniendo recuperación de comprometer la transacción %u, hora %s" -#: access/transam/xlog.c:6014 +#: access/transam/xlog.c:6049 #, c-format msgid "recovery stopping after abort of transaction %u, time %s" msgstr "deteniendo recuperación después de abortar la transacción %u, hora %s" -#: access/transam/xlog.c:6059 +#: access/transam/xlog.c:6094 #, c-format msgid "pausing at the end of recovery" msgstr "pausando al final de la recuperación" -#: access/transam/xlog.c:6060 +#: access/transam/xlog.c:6095 #, c-format msgid "Execute pg_wal_replay_resume() to promote." msgstr "Ejecute pg_wal_replay_resume() para promover." -#: access/transam/xlog.c:6063 access/transam/xlog.c:6336 +#: access/transam/xlog.c:6098 access/transam/xlog.c:6380 #, c-format msgid "recovery has paused" msgstr "la recuperación está en pausa" -#: access/transam/xlog.c:6064 +#: access/transam/xlog.c:6099 #, c-format msgid "Execute pg_wal_replay_resume() to continue." msgstr "Ejecute pg_wal_replay_resume() para continuar." -#: access/transam/xlog.c:6327 -#, fuzzy, c-format -#| msgid "hot standby is not possible because wal_level was not set to \"replica\" or higher on the master server" +#: access/transam/xlog.c:6371 +#, c-format msgid "hot standby is not possible because of insufficient parameter settings" -msgstr "hot standby no es posible porque wal_level no estaba configurado como «replica» o superior en el servidor maestro" +msgstr "hot standby no es posible porque la configuración de parámetros no es suficiente" -#: access/transam/xlog.c:6328 access/transam/xlog.c:6355 -#: access/transam/xlog.c:6385 -#, fuzzy, c-format -#| msgid "hot standby is not possible because %s = %d is a lower setting than on the master server (its value was %d)" +#: access/transam/xlog.c:6372 access/transam/xlog.c:6399 +#: access/transam/xlog.c:6429 +#, c-format msgid "%s = %d is a lower setting than on the primary server, where its value was %d." -msgstr "hot standby no es posible puesto que %s = %d es una configuración menor que en el servidor maestro (su valor era %d)" +msgstr "%s = %d es una configuración menor que en el servidor primario, donde su valor era %d." -#: access/transam/xlog.c:6337 +#: access/transam/xlog.c:6381 #, c-format msgid "If recovery is unpaused, the server will shut down." -msgstr "" +msgstr "Si se continúa con la recuperación, el servidor se apagará." -#: access/transam/xlog.c:6338 +#: access/transam/xlog.c:6382 #, c-format msgid "You can then restart the server after making the necessary configuration changes." -msgstr "" +msgstr "Luego puede reiniciar el servidor después de hacer los cambios necesarios en la configuración." -#: access/transam/xlog.c:6349 -#, fuzzy, c-format -#| msgid "rotation not possible because log collection not active" +#: access/transam/xlog.c:6393 +#, c-format msgid "promotion is not possible because of insufficient parameter settings" -msgstr "la rotación no es posible porque la recoleccion de log no está activa" +msgstr "la promoción no es posible porque la configuración de parámetros no es suficiente" -#: access/transam/xlog.c:6359 -#, fuzzy, c-format -#| msgid "Sets the server's main configuration file." +#: access/transam/xlog.c:6403 +#, c-format msgid "Restart the server after making the necessary configuration changes." -msgstr "Define la ubicación del archivo principal de configuración del servidor." +msgstr "Reinicie el servidor luego de hacer los cambios necesarios en la configuración." -#: access/transam/xlog.c:6383 +#: access/transam/xlog.c:6427 #, c-format msgid "recovery aborted because of insufficient parameter settings" -msgstr "" +msgstr "se abortó la recuperación porque la configuración de parámetros no es suficiente" -#: access/transam/xlog.c:6389 +#: access/transam/xlog.c:6433 #, c-format msgid "You can restart the server after making the necessary configuration changes." -msgstr "" +msgstr "Puede reiniciar el servidor luego de hacer los cambios necesarios en la configuración." -#: access/transam/xlog.c:6411 -#, fuzzy, c-format -#| msgid "WAL was generated with wal_level=minimal, data may be missing" +#: access/transam/xlog.c:6455 +#, c-format msgid "WAL was generated with wal_level=minimal, cannot continue recovering" -msgstr "WAL fue generado con wal_level=minimal, puede haber datos faltantes" +msgstr "el WAL fue generado con wal_level=minimal, no se puede continuar con la recuperación" -#: access/transam/xlog.c:6412 -#, fuzzy, c-format -#| msgid "This happens if you temporarily set wal_level=minimal without taking a new base backup." +#: access/transam/xlog.c:6456 +#, c-format msgid "This happens if you temporarily set wal_level=minimal on the server." -msgstr "Esto sucede si temporalmente define wal_level=minimal sin tomar un nuevo respaldo base." +msgstr "Esto sucede si temporalmente define wal_level=minimal en el servidor." -#: access/transam/xlog.c:6413 +#: access/transam/xlog.c:6457 #, c-format msgid "Use a backup taken after setting wal_level to higher than minimal." -msgstr "" +msgstr "Utilice un respaldo tomado después de establecer wal_level a un valor superior a minimal." -#: access/transam/xlog.c:6482 +#: access/transam/xlog.c:6526 #, c-format msgid "control file contains invalid checkpoint location" msgstr "el archivo de control contiene una ubicación no válida de punto de control" -#: access/transam/xlog.c:6493 +#: access/transam/xlog.c:6537 #, c-format msgid "database system was shut down at %s" msgstr "el sistema de bases de datos fue apagado en %s" -#: access/transam/xlog.c:6499 +#: access/transam/xlog.c:6543 #, c-format msgid "database system was shut down in recovery at %s" msgstr "el sistema de bases de datos fue apagado durante la recuperación en %s" -#: access/transam/xlog.c:6505 +#: access/transam/xlog.c:6549 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "el apagado del sistema de datos fue interrumpido; última vez registrada en funcionamiento en %s" -#: access/transam/xlog.c:6511 +#: access/transam/xlog.c:6555 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "el sistema de bases de datos fue interrumpido durante la recuperación en %s" -#: access/transam/xlog.c:6513 +#: access/transam/xlog.c:6557 #, c-format msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." msgstr "Esto probablemente significa que algunos datos están corruptos y tendrá que usar el respaldo más reciente para la recuperación." -#: access/transam/xlog.c:6519 +#: access/transam/xlog.c:6563 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "el sistema de bases de datos fue interrumpido durante la recuperación en el instante de registro %s" -#: access/transam/xlog.c:6521 +#: access/transam/xlog.c:6565 #, c-format msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." msgstr "Si esto ha ocurrido más de una vez, algunos datos podrían estar corruptos y podría ser necesario escoger un punto de recuperación anterior." -#: access/transam/xlog.c:6527 +#: access/transam/xlog.c:6571 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "el sistema de bases de datos fue interrumpido; última vez en funcionamiento en %s" -#: access/transam/xlog.c:6533 +#: access/transam/xlog.c:6577 #, c-format msgid "control file contains invalid database cluster state" msgstr "el archivo de control contiene un estado no válido del clúster" -#: access/transam/xlog.c:6590 +#: access/transam/xlog.c:6634 #, c-format msgid "entering standby mode" msgstr "entrando al modo standby" -#: access/transam/xlog.c:6593 +#: access/transam/xlog.c:6637 #, c-format msgid "starting point-in-time recovery to XID %u" msgstr "comenzando el proceso de recuperación hasta el XID %u" -#: access/transam/xlog.c:6597 +#: access/transam/xlog.c:6641 #, c-format msgid "starting point-in-time recovery to %s" msgstr "comenzando el proceso de recuperación hasta %s" -#: access/transam/xlog.c:6601 +#: access/transam/xlog.c:6645 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "comenzando el proceso de recuperación hasta «%s»" -#: access/transam/xlog.c:6605 +#: access/transam/xlog.c:6649 #, c-format msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" msgstr "comenzando el proceso de recuperación punto-en-el-tiempo a la ubicación (LSN) de WAL «%X/%X»" -#: access/transam/xlog.c:6609 +#: access/transam/xlog.c:6653 #, c-format msgid "starting point-in-time recovery to earliest consistent point" msgstr "comenzando recuperación a un punto en el tiempo hasta alcanzar un estado consistente" -#: access/transam/xlog.c:6612 +#: access/transam/xlog.c:6656 #, c-format msgid "starting archive recovery" msgstr "comenzando proceso de recuperación" -#: access/transam/xlog.c:6686 +#: access/transam/xlog.c:6730 #, c-format msgid "could not find redo location referenced by checkpoint record" msgstr "no se pudo encontrar la ubicación de redo referida por el registro de punto de control" # Purposefully deviate from quoting convention here, since argument is a shell command. -#: access/transam/xlog.c:6687 access/transam/xlog.c:6697 +#: access/transam/xlog.c:6731 access/transam/xlog.c:6741 #, c-format msgid "" "If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" @@ -2682,281 +2607,285 @@ msgstr "" "Si no está restaurando de un respaldo, intente eliminar el archivo \"%s/backup_label\".\n" "Tenga cuidado: eliminar \"%s/backup_label\" resultará en un clúster corrupto si está restaurando de un respaldo." -#: access/transam/xlog.c:6696 +#: access/transam/xlog.c:6740 #, c-format msgid "could not locate required checkpoint record" msgstr "no se pudo localizar el registro del punto de control requerido" -#: access/transam/xlog.c:6725 commands/tablespace.c:666 +#: access/transam/xlog.c:6769 commands/tablespace.c:662 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "no se pudo crear el enlace simbólico «%s»: %m" -#: access/transam/xlog.c:6757 access/transam/xlog.c:6763 +#: access/transam/xlog.c:6801 access/transam/xlog.c:6807 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "ignorando el archivo «%s» porque no existe un archivo «%s»" -#: access/transam/xlog.c:6759 access/transam/xlog.c:12060 +#: access/transam/xlog.c:6803 access/transam/xlog.c:12238 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "El archivo «%s» fue renombrado a «%s»." -#: access/transam/xlog.c:6765 +#: access/transam/xlog.c:6809 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "No se pudo renombrar el archivo de «%s» a «%s»: %m." -#: access/transam/xlog.c:6816 +#: access/transam/xlog.c:6860 #, c-format msgid "could not locate a valid checkpoint record" msgstr "no se pudo localizar un registro de punto de control válido" -#: access/transam/xlog.c:6854 +#: access/transam/xlog.c:6898 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "el timeline solicitado %u no es un hijo de la historia de este servidor" -#: access/transam/xlog.c:6856 +#: access/transam/xlog.c:6900 #, c-format msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." msgstr "El punto de control más reciente está en %X/%X en el timeline %u, pero en la historia del timeline solicitado, el servidor se desvió desde ese timeline en %X/%X." -#: access/transam/xlog.c:6870 +#: access/transam/xlog.c:6914 #, c-format msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" msgstr "el timeline solicitado %u no contiene el punto mínimo de recuperación %X/%X en el timeline %u" -#: access/transam/xlog.c:6900 +#: access/transam/xlog.c:6944 #, c-format msgid "invalid next transaction ID" msgstr "el siguiente ID de transacción no es válido" -#: access/transam/xlog.c:7000 +#: access/transam/xlog.c:7044 #, c-format msgid "invalid redo in checkpoint record" msgstr "redo no es válido en el registro de punto de control" -#: access/transam/xlog.c:7011 +#: access/transam/xlog.c:7055 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "registro redo no es válido en el punto de control de apagado" -#: access/transam/xlog.c:7045 +#: access/transam/xlog.c:7095 #, c-format msgid "database system was not properly shut down; automatic recovery in progress" msgstr "el sistema de bases de datos no fue apagado apropiadamente; se está efectuando la recuperación automática" -#: access/transam/xlog.c:7049 +#: access/transam/xlog.c:7099 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "la recuperación comienza en el timeline %u y tiene un timeline de destino %u" -#: access/transam/xlog.c:7096 +#: access/transam/xlog.c:7146 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_label contiene datos inconsistentes con el archivo de control" -#: access/transam/xlog.c:7097 +#: access/transam/xlog.c:7147 #, c-format msgid "This means that the backup is corrupted and you will have to use another backup for recovery." msgstr "Esto significa que el respaldo está corrupto y deberá usar otro respaldo para la recuperación." -#: access/transam/xlog.c:7323 +#: access/transam/xlog.c:7373 #, c-format msgid "redo starts at %X/%X" msgstr "redo comienza en %X/%X" -#: access/transam/xlog.c:7548 +#: access/transam/xlog.c:7598 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "el punto de detención de recuperación pedido es antes del punto de recuperación consistente" -#: access/transam/xlog.c:7586 -#, fuzzy, c-format -#| msgid "redo done at %X/%X" +#: access/transam/xlog.c:7636 +#, c-format msgid "redo done at %X/%X system usage: %s" -msgstr "redo listo en %X/%X" +msgstr "redo listo en %X/%X utilización del sistema: %s" -#: access/transam/xlog.c:7592 +#: access/transam/xlog.c:7642 #, c-format msgid "last completed transaction was at log time %s" msgstr "última transacción completada al tiempo de registro %s" -#: access/transam/xlog.c:7601 +#: access/transam/xlog.c:7651 #, c-format msgid "redo is not required" msgstr "no se requiere redo" -#: access/transam/xlog.c:7613 +#: access/transam/xlog.c:7663 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "la recuperación terminó antes de alcanzar el punto configurado como destino de recuperación" -#: access/transam/xlog.c:7692 access/transam/xlog.c:7696 +#: access/transam/xlog.c:7747 access/transam/xlog.c:7751 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL termina antes del fin del respaldo en línea" -#: access/transam/xlog.c:7693 +#: access/transam/xlog.c:7748 #, c-format msgid "All WAL generated while online backup was taken must be available at recovery." msgstr "Todo el WAL generado durante el respaldo en línea debe estar disponible durante la recuperación." -#: access/transam/xlog.c:7697 +#: access/transam/xlog.c:7752 #, c-format msgid "Online backup started with pg_start_backup() must be ended with pg_stop_backup(), and all WAL up to that point must be available at recovery." msgstr "Un respaldo en línea iniciado con pg_start_backup() debe ser terminado con pg_stop_backup(), y todos los archivos WAL hasta ese punto deben estar disponibles durante la recuperación." -#: access/transam/xlog.c:7700 +#: access/transam/xlog.c:7755 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL termina antes del punto de recuperación consistente" -#: access/transam/xlog.c:7735 +#: access/transam/xlog.c:7790 #, c-format msgid "selected new timeline ID: %u" msgstr "seleccionado nuevo ID de timeline: %u" -#: access/transam/xlog.c:8178 +#: access/transam/xlog.c:8260 #, c-format msgid "consistent recovery state reached at %X/%X" msgstr "el estado de recuperación consistente fue alcanzado en %X/%X" -#: access/transam/xlog.c:8387 +#: access/transam/xlog.c:8469 #, c-format msgid "invalid primary checkpoint link in control file" msgstr "el enlace de punto de control primario en archivo de control no es válido" -#: access/transam/xlog.c:8391 +#: access/transam/xlog.c:8473 #, c-format msgid "invalid checkpoint link in backup_label file" msgstr "el enlace del punto de control en backup_label no es válido" -#: access/transam/xlog.c:8409 +#: access/transam/xlog.c:8491 #, c-format msgid "invalid primary checkpoint record" msgstr "el registro del punto de control primario no es válido" -#: access/transam/xlog.c:8413 +#: access/transam/xlog.c:8495 #, c-format msgid "invalid checkpoint record" msgstr "el registro del punto de control no es válido" -#: access/transam/xlog.c:8424 +#: access/transam/xlog.c:8506 #, c-format msgid "invalid resource manager ID in primary checkpoint record" msgstr "el ID de gestor de recursos en el registro del punto de control primario no es válido" -#: access/transam/xlog.c:8428 +#: access/transam/xlog.c:8510 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "el ID de gestor de recursos en el registro del punto de control no es válido" -#: access/transam/xlog.c:8441 +#: access/transam/xlog.c:8523 #, c-format msgid "invalid xl_info in primary checkpoint record" msgstr "xl_info en el registro del punto de control primario no es válido" -#: access/transam/xlog.c:8445 +#: access/transam/xlog.c:8527 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "xl_info en el registro del punto de control no es válido" -#: access/transam/xlog.c:8456 +#: access/transam/xlog.c:8538 #, c-format msgid "invalid length of primary checkpoint record" msgstr "la longitud del registro del punto de control primario no es válida" -#: access/transam/xlog.c:8460 +#: access/transam/xlog.c:8542 #, c-format msgid "invalid length of checkpoint record" msgstr "la longitud del registro de punto de control no es válida" -#: access/transam/xlog.c:8641 +#: access/transam/xlog.c:8723 #, c-format msgid "shutting down" msgstr "apagando" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8680 +#: access/transam/xlog.c:8762 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" -msgstr "" +msgstr "empezando restartpoint:%s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8692 +#: access/transam/xlog.c:8774 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" -msgstr "" +msgstr "empezando checkpoint:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:8752 +#: access/transam/xlog.c:8834 #, c-format msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" -msgstr "" +msgstr "restartpoint completado: se escribió %d buffers (%.1f%%); %d archivo(s) de WAL añadido(s), %d eliminado(s), %d reciclado(s); escritura=%ld.%03d s, sincronización=%ld.%03d s, total=%ld.%03d s; archivos sincronizados=%d, más largo=%ld.%03d s, promedio=%ld.%03d s; distancia=%d kB, estimado=%d kB" -#: access/transam/xlog.c:8772 +#: access/transam/xlog.c:8854 #, c-format msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" -msgstr "" +msgstr "checkpoint completado: se escribió %d buffers (%.1f%%); %d archivo(s) de WAL añadido(s), %d eliminado(s), %d reciclado(s); escritura=%ld.%03d s, sincronización=%ld.%03d s, total=%ld.%03d s; archivos sincronizados=%d, más largo=%ld.%03d s, promedio=%ld.%03d s; distancia=%d kB, estimado=%d kB" -#: access/transam/xlog.c:9205 +#: access/transam/xlog.c:9287 #, c-format msgid "concurrent write-ahead log activity while database system is shutting down" msgstr "hay actividad de WAL mientras el sistema se está apagando" -#: access/transam/xlog.c:9661 +#: access/transam/xlog.c:9806 #, c-format msgid "recovery restart point at %X/%X" msgstr "restartpoint de recuperación en %X/%X" -#: access/transam/xlog.c:9663 +#: access/transam/xlog.c:9808 #, c-format msgid "Last completed transaction was at log time %s." msgstr "Última transacción completada al tiempo de registro %s." -#: access/transam/xlog.c:9903 +#: access/transam/xlog.c:10054 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "punto de recuperación «%s» creado en %X/%X" -#: access/transam/xlog.c:10048 +#: access/transam/xlog.c:10199 #, c-format msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" msgstr "ID de timeline previo %u inesperado (timeline actual %u) en el registro de punto de control" -#: access/transam/xlog.c:10057 +#: access/transam/xlog.c:10208 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "ID de timeline %u inesperado (después de %u) en el registro de punto de control" -#: access/transam/xlog.c:10073 +#: access/transam/xlog.c:10224 #, c-format msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" msgstr "timeline ID %u inesperado en registro de checkpoint, antes de alcanzar el punto mínimo de recuperación %X/%X en el timeline %u" -#: access/transam/xlog.c:10148 +#: access/transam/xlog.c:10299 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "el respaldo en línea fue cancelado, la recuperación no puede continuar" -#: access/transam/xlog.c:10204 access/transam/xlog.c:10260 -#: access/transam/xlog.c:10283 +#: access/transam/xlog.c:10355 access/transam/xlog.c:10411 +#: access/transam/xlog.c:10441 #, c-format msgid "unexpected timeline ID %u (should be %u) in checkpoint record" msgstr "ID de timeline %u inesperado (debería ser %u) en el registro de punto de control" -#: access/transam/xlog.c:10632 +#: access/transam/xlog.c:10595 +#, c-format +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "se omitió con éxito contrecord no encontrado en %X/%X, sobrescrito en %s" + +#: access/transam/xlog.c:10810 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "no se pudo sincronizar (fsync write-through) el archivo «%s»: %m" -#: access/transam/xlog.c:10638 +#: access/transam/xlog.c:10816 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "no se pudo sincronizar (fdatasync) archivo «%s»: %m" -#: access/transam/xlog.c:10749 access/transam/xlog.c:11278 +#: access/transam/xlog.c:10927 access/transam/xlog.c:11456 #: access/transam/xlogfuncs.c:275 access/transam/xlogfuncs.c:302 #: access/transam/xlogfuncs.c:341 access/transam/xlogfuncs.c:362 #: access/transam/xlogfuncs.c:383 @@ -2964,199 +2893,196 @@ msgstr "no se pudo sincronizar (fdatasync) archivo «%s»: %m" msgid "WAL control functions cannot be executed during recovery." msgstr "Las funciones de control de WAL no pueden ejecutarse durante la recuperación." -#: access/transam/xlog.c:10758 access/transam/xlog.c:11287 +#: access/transam/xlog.c:10936 access/transam/xlog.c:11465 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "el nivel de WAL no es suficiente para hacer un respaldo en línea" -#: access/transam/xlog.c:10759 access/transam/xlog.c:11288 +#: access/transam/xlog.c:10937 access/transam/xlog.c:11466 #: access/transam/xlogfuncs.c:308 #, c-format msgid "wal_level must be set to \"replica\" or \"logical\" at server start." msgstr "wal_level debe ser definido a «replica» o «logical» al inicio del servidor." -#: access/transam/xlog.c:10764 +#: access/transam/xlog.c:10942 #, c-format msgid "backup label too long (max %d bytes)" msgstr "la etiqueta de respaldo es demasiado larga (máximo %d bytes)" -#: access/transam/xlog.c:10801 access/transam/xlog.c:11077 -#: access/transam/xlog.c:11115 +#: access/transam/xlog.c:10979 access/transam/xlog.c:11255 +#: access/transam/xlog.c:11293 #, c-format msgid "a backup is already in progress" msgstr "ya hay un respaldo en curso" -#: access/transam/xlog.c:10802 +#: access/transam/xlog.c:10980 #, c-format msgid "Run pg_stop_backup() and try again." msgstr "Ejecute pg_stop_backup() e intente nuevamente." -#: access/transam/xlog.c:10898 +#: access/transam/xlog.c:11076 #, c-format msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" msgstr "el WAL generado con full_page_writes=off fue restaurado desde el último restartpoint" -#: access/transam/xlog.c:10900 access/transam/xlog.c:11483 -#, fuzzy, c-format -#| msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the master, and then try an online backup again." +#: access/transam/xlog.c:11078 access/transam/xlog.c:11661 +#, c-format msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." -msgstr "Esto significa que el respaldo que estaba siendo tomado en el standby está corrupto y no debería usarse. Active full_page_writes y ejecute CHECKPOINT en el maestro, luego trate de ejecutar un respaldo en línea nuevamente." +msgstr "Esto significa que el respaldo que estaba siendo tomado en el standby está corrupto y no debería usarse. Active full_page_writes y ejecute CHECKPOINT en el primario, luego trate de ejecutar un respaldo en línea nuevamente." -#: access/transam/xlog.c:10976 replication/basebackup.c:1433 +#: access/transam/xlog.c:11154 replication/basebackup.c:1433 #: utils/adt/misc.c:345 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "la ruta «%s» del enlace simbólico es demasiado larga" -#: access/transam/xlog.c:11026 commands/tablespace.c:402 +#: access/transam/xlog.c:11204 commands/tablespace.c:402 #: commands/tablespace.c:578 replication/basebackup.c:1448 utils/adt/misc.c:353 #, c-format msgid "tablespaces are not supported on this platform" msgstr "tablespaces no están soportados en esta plataforma" -#: access/transam/xlog.c:11078 access/transam/xlog.c:11116 +#: access/transam/xlog.c:11256 access/transam/xlog.c:11294 #, c-format msgid "If you're sure there is no backup in progress, remove file \"%s\" and try again." msgstr "Si está seguro que no hay un respaldo en curso, elimine el archivo «%s» e intente nuevamente." -#: access/transam/xlog.c:11303 +#: access/transam/xlog.c:11481 #, c-format msgid "exclusive backup not in progress" msgstr "no hay un respaldo exclusivo en curso" -#: access/transam/xlog.c:11330 +#: access/transam/xlog.c:11508 #, c-format msgid "a backup is not in progress" msgstr "no hay un respaldo en curso" -#: access/transam/xlog.c:11416 access/transam/xlog.c:11429 -#: access/transam/xlog.c:11818 access/transam/xlog.c:11824 -#: access/transam/xlog.c:11872 access/transam/xlog.c:11952 -#: access/transam/xlog.c:11976 access/transam/xlogfuncs.c:733 +#: access/transam/xlog.c:11594 access/transam/xlog.c:11607 +#: access/transam/xlog.c:11996 access/transam/xlog.c:12002 +#: access/transam/xlog.c:12050 access/transam/xlog.c:12130 +#: access/transam/xlog.c:12154 access/transam/xlogfuncs.c:733 #, c-format msgid "invalid data in file \"%s\"" msgstr "datos no válidos en archivo «%s»" -#: access/transam/xlog.c:11433 replication/basebackup.c:1281 +#: access/transam/xlog.c:11611 replication/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "el standby fue promovido durante el respaldo en línea" -#: access/transam/xlog.c:11434 replication/basebackup.c:1282 +#: access/transam/xlog.c:11612 replication/basebackup.c:1282 #, c-format msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "Esto significa que el respaldo que se estaba tomando está corrupto y no debería ser usado. Trate de ejecutar un nuevo respaldo en línea." -#: access/transam/xlog.c:11481 +#: access/transam/xlog.c:11659 #, c-format msgid "WAL generated with full_page_writes=off was replayed during online backup" msgstr "el WAL generado con full_page_writes=off fue restaurado durante el respaldo en línea" -#: access/transam/xlog.c:11601 +#: access/transam/xlog.c:11779 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "respaldo base completo, esperando que se archiven los segmentos WAL requeridos" -#: access/transam/xlog.c:11613 +#: access/transam/xlog.c:11791 #, c-format msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" msgstr "todavía en espera de que todos los segmentos WAL requeridos sean archivados (han pasado %d segundos)" -#: access/transam/xlog.c:11615 +#: access/transam/xlog.c:11793 #, c-format msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." msgstr "Verifique que su archive_command se esté ejecutando con normalidad. Puede cancelar este respaldo con confianza, pero el respaldo de la base de datos no será utilizable a menos que disponga de todos los segmentos de WAL." -#: access/transam/xlog.c:11622 +#: access/transam/xlog.c:11800 #, c-format msgid "all required WAL segments have been archived" msgstr "todos los segmentos de WAL requeridos han sido archivados" -#: access/transam/xlog.c:11626 +#: access/transam/xlog.c:11804 #, c-format msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" msgstr "el archivado de WAL no está activo; debe asegurarse que todos los segmentos WAL requeridos se copian por algún otro mecanismo para completar el respaldo" -#: access/transam/xlog.c:11679 +#: access/transam/xlog.c:11857 #, c-format msgid "aborting backup due to backend exiting before pg_stop_backup was called" msgstr "abortando el backup porque el proceso servidor terminó antes de que pg_stop_backup fuera invocada" -#: access/transam/xlog.c:11873 +#: access/transam/xlog.c:12051 #, c-format msgid "Timeline ID parsed is %u, but expected %u." msgstr "El ID de timeline interpretado es %u, pero se esperaba %u." #. translator: %s is a WAL record description -#: access/transam/xlog.c:12001 +#: access/transam/xlog.c:12179 #, c-format msgid "WAL redo at %X/%X for %s" msgstr "redo WAL en %X/%X para %s" -#: access/transam/xlog.c:12049 +#: access/transam/xlog.c:12227 #, c-format msgid "online backup mode was not canceled" msgstr "el modo de respaldo en línea no fue cancelado" -#: access/transam/xlog.c:12050 +#: access/transam/xlog.c:12228 #, c-format msgid "File \"%s\" could not be renamed to \"%s\": %m." msgstr "El archivo «%s» no se pudo renombrar a «%s»: %m." -#: access/transam/xlog.c:12059 access/transam/xlog.c:12071 -#: access/transam/xlog.c:12081 +#: access/transam/xlog.c:12237 access/transam/xlog.c:12249 +#: access/transam/xlog.c:12259 #, c-format msgid "online backup mode canceled" msgstr "el modo de respaldo en línea fue cancelado" -#: access/transam/xlog.c:12072 +#: access/transam/xlog.c:12250 #, c-format msgid "Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." msgstr "Los archivos «%s» y «%s» fueron renombrados a «%s» y «%s», respectivamente." -#: access/transam/xlog.c:12082 +#: access/transam/xlog.c:12260 #, c-format msgid "File \"%s\" was renamed to \"%s\", but file \"%s\" could not be renamed to \"%s\": %m." msgstr "El archivo «%s» fue renombrado a «%s», pero el archivo «%s» no pudo ser renombrado a «%s»: %m." # XXX why talk about "log segment" instead of "file"? -#: access/transam/xlog.c:12215 access/transam/xlogutils.c:967 +#: access/transam/xlog.c:12393 access/transam/xlogutils.c:967 #, c-format msgid "could not read from log segment %s, offset %u: %m" msgstr "no se pudo leer del archivo de segmento %s, posición %u: %m" # XXX why talk about "log segment" instead of "file"? -#: access/transam/xlog.c:12221 access/transam/xlogutils.c:974 +#: access/transam/xlog.c:12399 access/transam/xlogutils.c:974 #, c-format msgid "could not read from log segment %s, offset %u: read %d of %zu" msgstr "no se pudo leer del archivo de segmento %s, posición %u: leídos %d de %zu" -#: access/transam/xlog.c:12766 -#, fuzzy, c-format -#| msgid "WAL receiver process shutdown requested" +#: access/transam/xlog.c:12944 +#, c-format msgid "WAL receiver process shutdown requested" -msgstr "se recibió una petición de apagado del proceso receptor de wal" +msgstr "se recibió una petición de apagado para el proceso receptor de wal" -#: access/transam/xlog.c:12861 +#: access/transam/xlog.c:13039 #, c-format msgid "received promote request" msgstr "se recibió petición de promoción" -#: access/transam/xlog.c:12874 +#: access/transam/xlog.c:13052 #, c-format msgid "promote trigger file found: %s" msgstr "se encontró el archivo disparador de promoción: %s" -#: access/transam/xlog.c:12882 +#: access/transam/xlog.c:13060 #, c-format msgid "could not stat promote trigger file \"%s\": %m" msgstr "no se pudo hacer stat al archivo disparador de promoción «%s»: %m" #: access/transam/xlogarchive.c:205 -#, fuzzy, c-format -#| msgid "archive file \"%s\" has wrong size: %lu instead of %lu" +#, c-format msgid "archive file \"%s\" has wrong size: %lld instead of %lld" -msgstr "el archivo «%s» tiene tamaño erróneo: %lu en lugar de %lu" +msgstr "el archivo «%s» tiene tamaño erróneo: %lld en lugar de %lld" #: access/transam/xlogarchive.c:214 #, c-format @@ -3166,7 +3092,7 @@ msgstr "se ha restaurado el archivo «%s» desde el área de archivado" #: access/transam/xlogarchive.c:228 #, c-format msgid "restore_command returned a zero exit status, but stat() failed." -msgstr "" +msgstr "restore_command retornó un estado de salida cero, pero stat() falló." #: access/transam/xlogarchive.c:260 #, c-format @@ -3207,35 +3133,35 @@ msgid "Did you mean to use pg_stop_backup('f')?" msgstr "¿Quiso usar pg_stop_backup('f')?" #: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1311 -#: commands/event_trigger.c:1869 commands/extension.c:1944 -#: commands/extension.c:2052 commands/extension.c:2337 commands/prepare.c:712 -#: executor/execExpr.c:2507 executor/execSRF.c:738 executor/functions.c:1057 +#: commands/event_trigger.c:1869 commands/extension.c:1945 +#: commands/extension.c:2053 commands/extension.c:2338 commands/prepare.c:713 +#: executor/execExpr.c:2507 executor/execSRF.c:738 executor/functions.c:1058 #: foreign/foreign.c:520 libpq/hba.c:2718 replication/logical/launcher.c:937 #: replication/logical/logicalfuncs.c:157 replication/logical/origin.c:1494 #: replication/slotfuncs.c:255 replication/walsender.c:3291 #: storage/ipc/shmem.c:554 utils/adt/datetime.c:4812 utils/adt/genfile.c:507 -#: utils/adt/genfile.c:590 utils/adt/jsonfuncs.c:1933 -#: utils/adt/jsonfuncs.c:2045 utils/adt/jsonfuncs.c:2233 -#: utils/adt/jsonfuncs.c:2342 utils/adt/jsonfuncs.c:3803 +#: utils/adt/genfile.c:590 utils/adt/jsonfuncs.c:1935 +#: utils/adt/jsonfuncs.c:2047 utils/adt/jsonfuncs.c:2235 +#: utils/adt/jsonfuncs.c:2344 utils/adt/jsonfuncs.c:3805 #: utils/adt/mcxtfuncs.c:132 utils/adt/misc.c:218 utils/adt/pgstatfuncs.c:477 #: utils/adt/pgstatfuncs.c:587 utils/adt/pgstatfuncs.c:1887 -#: utils/adt/varlena.c:4832 utils/fmgr/funcapi.c:74 utils/misc/guc.c:9993 -#: utils/mmgr/portalmem.c:1141 +#: utils/adt/varlena.c:4825 utils/fmgr/funcapi.c:74 utils/misc/guc.c:9994 +#: utils/mmgr/portalmem.c:1145 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "se llamó una función que retorna un conjunto en un contexto que no puede aceptarlo" #: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1315 -#: commands/event_trigger.c:1873 commands/extension.c:1948 -#: commands/extension.c:2056 commands/extension.c:2341 commands/prepare.c:716 +#: commands/event_trigger.c:1873 commands/extension.c:1949 +#: commands/extension.c:2057 commands/extension.c:2342 commands/prepare.c:717 #: foreign/foreign.c:525 libpq/hba.c:2722 replication/logical/launcher.c:941 #: replication/logical/logicalfuncs.c:161 replication/logical/origin.c:1498 #: replication/slotfuncs.c:259 replication/walsender.c:3295 #: storage/ipc/shmem.c:558 utils/adt/datetime.c:4816 utils/adt/genfile.c:511 #: utils/adt/genfile.c:594 utils/adt/mcxtfuncs.c:136 utils/adt/misc.c:222 #: utils/adt/pgstatfuncs.c:481 utils/adt/pgstatfuncs.c:591 -#: utils/adt/pgstatfuncs.c:1891 utils/adt/varlena.c:4836 utils/misc/guc.c:9997 -#: utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1145 +#: utils/adt/pgstatfuncs.c:1891 utils/adt/varlena.c:4829 utils/misc/guc.c:9998 +#: utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1149 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "se requiere un nodo «materialize», pero no está permitido en este contexto" @@ -3285,8 +3211,7 @@ msgid "standby promotion is ongoing" msgstr "la promoción del standby está en curso" #: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 -#, fuzzy, c-format -#| msgid "%s cannot be executed from a function" +#, c-format msgid "%s cannot be executed after promotion is triggered." msgstr "%s no puede ser ejecutado después que una promoción es solicitada." @@ -3295,151 +3220,149 @@ msgstr "%s no puede ser ejecutado después que una promoción es solicitada." msgid "\"wait_seconds\" must not be negative or zero" msgstr "«wait_seconds» no puede ser negativo o cero" -#: access/transam/xlogfuncs.c:789 storage/ipc/signalfuncs.c:281 +#: access/transam/xlogfuncs.c:789 storage/ipc/signalfuncs.c:247 #, c-format msgid "failed to send signal to postmaster: %m" msgstr "no se pudo enviar señal a postmaster: %m" #: access/transam/xlogfuncs.c:825 -#, fuzzy, c-format -#| msgid "server did not promote within %d seconds" +#, c-format msgid "server did not promote within %d second" msgid_plural "server did not promote within %d seconds" -msgstr[0] "el servidor no promovió en %d segundos" -msgstr[1] "el servidor no promovió en %d segundos" +msgstr[0] "el servidor no se promovió en %d segundo" +msgstr[1] "el servidor no se promovió en %d segundos" -#: access/transam/xlogreader.c:349 +#: access/transam/xlogreader.c:354 #, c-format msgid "invalid record offset at %X/%X" msgstr "posición de registro no válida en %X/%X" -#: access/transam/xlogreader.c:357 +#: access/transam/xlogreader.c:362 #, c-format msgid "contrecord is requested by %X/%X" msgstr "contrecord solicitado por %X/%X" -#: access/transam/xlogreader.c:398 access/transam/xlogreader.c:695 +#: access/transam/xlogreader.c:403 access/transam/xlogreader.c:733 #, c-format msgid "invalid record length at %X/%X: wanted %u, got %u" msgstr "largo de registro no válido en %X/%X: se esperaba %u, se obtuvo %u" -#: access/transam/xlogreader.c:422 +#: access/transam/xlogreader.c:429 #, c-format msgid "record length %u at %X/%X too long" msgstr "largo de registro %u en %X/%X demasiado largo" -#: access/transam/xlogreader.c:453 +#: access/transam/xlogreader.c:477 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "no hay bandera de contrecord en %X/%X" -#: access/transam/xlogreader.c:466 -#, fuzzy, c-format -#| msgid "invalid contrecord length %u at %X/%X" +#: access/transam/xlogreader.c:490 +#, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" -msgstr "largo de contrecord %u no válido en %X/%X" +msgstr "largo de contrecord %u no válido (se esperaba %lld) en %X/%X" -#: access/transam/xlogreader.c:703 +#: access/transam/xlogreader.c:741 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ID de gestor de recursos %u no válido en %X/%X" -#: access/transam/xlogreader.c:716 access/transam/xlogreader.c:732 +#: access/transam/xlogreader.c:754 access/transam/xlogreader.c:770 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "registro con prev-link %X/%X incorrecto en %X/%X" -#: access/transam/xlogreader.c:768 +#: access/transam/xlogreader.c:806 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "suma de verificación de los datos del gestor de recursos incorrecta en el registro en %X/%X" -#: access/transam/xlogreader.c:805 +#: access/transam/xlogreader.c:843 #, c-format msgid "invalid magic number %04X in log segment %s, offset %u" msgstr "número mágico %04X no válido en archivo %s, posición %u" -#: access/transam/xlogreader.c:819 access/transam/xlogreader.c:860 +#: access/transam/xlogreader.c:857 access/transam/xlogreader.c:898 #, c-format msgid "invalid info bits %04X in log segment %s, offset %u" msgstr "info bits %04X no válidos en archivo %s, posición %u" -#: access/transam/xlogreader.c:834 +#: access/transam/xlogreader.c:872 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "archivo WAL es de un sistema de bases de datos distinto: identificador de sistema en archivo WAL es %llu, identificador en pg_control es %llu" -#: access/transam/xlogreader.c:842 +#: access/transam/xlogreader.c:880 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "archivo WAL es de un sistema de bases de datos distinto: tamaño de segmento incorrecto en cabecera de paǵina" -#: access/transam/xlogreader.c:848 +#: access/transam/xlogreader.c:886 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "archivo WAL es de un sistema de bases de datos distinto: XLOG_BLCKSZ incorrecto en cabecera de paǵina" -#: access/transam/xlogreader.c:879 +#: access/transam/xlogreader.c:917 #, c-format msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" msgstr "pageaddr %X/%X inesperado en archivo %s, posición %u" -#: access/transam/xlogreader.c:904 +#: access/transam/xlogreader.c:942 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" msgstr "ID de timeline %u fuera de secuencia (después de %u) en archivo %s, posición %u" -#: access/transam/xlogreader.c:1249 +#: access/transam/xlogreader.c:1287 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u fuera de orden en %X/%X" -#: access/transam/xlogreader.c:1271 +#: access/transam/xlogreader.c:1309 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA está definido, pero no hay datos en %X/%X" -#: access/transam/xlogreader.c:1278 +#: access/transam/xlogreader.c:1316 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA no está definido, pero el largo de los datos es %u en %X/%X" -#: access/transam/xlogreader.c:1314 +#: access/transam/xlogreader.c:1352 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE está definido, pero posición del agujero es %u largo %u largo de imagen %u en %X/%X" -#: access/transam/xlogreader.c:1330 +#: access/transam/xlogreader.c:1368 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE no está definido, pero posición del agujero es %u largo %u en %X/%X" -#: access/transam/xlogreader.c:1345 +#: access/transam/xlogreader.c:1383 #, c-format msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_IS_COMPRESSED definido, pero largo de imagen de bloque es %u en %X/%X" -#: access/transam/xlogreader.c:1360 +#: access/transam/xlogreader.c:1398 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_IS_COMPRESSED está definido, pero largo de imagen de bloque es %u en %X/%X" -#: access/transam/xlogreader.c:1376 +#: access/transam/xlogreader.c:1414 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL está definido, pero no hay «rel» anterior en %X/%X " -#: access/transam/xlogreader.c:1388 +#: access/transam/xlogreader.c:1426 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "block_id %u no válido en %X/%X" -#: access/transam/xlogreader.c:1475 +#: access/transam/xlogreader.c:1513 #, c-format msgid "record with invalid length at %X/%X" msgstr "registro con largo no válido en %X/%X" -#: access/transam/xlogreader.c:1564 +#: access/transam/xlogreader.c:1602 #, c-format msgid "invalid compressed image at %X/%X, block %d" msgstr "imagen comprimida no válida en %X/%X, bloque %d" @@ -3516,10 +3439,9 @@ msgid "not all privileges could be revoked for \"%s\"" msgstr "no todos los privilegios pudieron ser revocados para «%s»" #: catalog/aclchk.c:379 -#, fuzzy, c-format -#| msgid "must be superuser" +#, c-format msgid "grantor must be current user" -msgstr "debe ser superusuario" +msgstr "el cedente (grantor) debe ser el usuario actual" #: catalog/aclchk.c:446 catalog/aclchk.c:989 #, c-format @@ -3598,7 +3520,7 @@ msgstr "los privilegios de columna son sólo válidos para relaciones" #: catalog/aclchk.c:697 catalog/aclchk.c:4164 catalog/aclchk.c:4985 #: catalog/objectaddress.c:1060 catalog/pg_largeobject.c:116 -#: storage/large_object/inv_api.c:285 +#: storage/large_object/inv_api.c:287 #, c-format msgid "large object %u does not exist" msgstr "no existe el objeto grande %u" @@ -3615,22 +3537,22 @@ msgstr "no existe el objeto grande %u" #: commands/dbcommands.c:229 commands/dbcommands.c:238 #: commands/dbcommands.c:260 commands/dbcommands.c:1502 #: commands/dbcommands.c:1511 commands/dbcommands.c:1520 -#: commands/dbcommands.c:1529 commands/extension.c:1735 -#: commands/extension.c:1745 commands/extension.c:1755 -#: commands/extension.c:3055 commands/foreigncmds.c:539 -#: commands/foreigncmds.c:548 commands/functioncmds.c:604 -#: commands/functioncmds.c:770 commands/functioncmds.c:779 -#: commands/functioncmds.c:788 commands/functioncmds.c:797 -#: commands/functioncmds.c:2094 commands/functioncmds.c:2102 -#: commands/publicationcmds.c:90 commands/publicationcmds.c:133 +#: commands/dbcommands.c:1529 commands/extension.c:1736 +#: commands/extension.c:1746 commands/extension.c:1756 +#: commands/extension.c:3056 commands/foreigncmds.c:539 +#: commands/foreigncmds.c:548 commands/functioncmds.c:605 +#: commands/functioncmds.c:771 commands/functioncmds.c:780 +#: commands/functioncmds.c:789 commands/functioncmds.c:798 +#: commands/functioncmds.c:2095 commands/functioncmds.c:2103 +#: commands/publicationcmds.c:87 commands/publicationcmds.c:130 #: commands/sequence.c:1266 commands/sequence.c:1276 commands/sequence.c:1286 #: commands/sequence.c:1296 commands/sequence.c:1306 commands/sequence.c:1316 #: commands/sequence.c:1326 commands/sequence.c:1336 commands/sequence.c:1346 #: commands/subscriptioncmds.c:124 commands/subscriptioncmds.c:134 #: commands/subscriptioncmds.c:144 commands/subscriptioncmds.c:154 -#: commands/subscriptioncmds.c:168 commands/subscriptioncmds.c:179 -#: commands/subscriptioncmds.c:193 commands/subscriptioncmds.c:203 -#: commands/subscriptioncmds.c:213 commands/tablecmds.c:7500 +#: commands/subscriptioncmds.c:170 commands/subscriptioncmds.c:181 +#: commands/subscriptioncmds.c:195 commands/subscriptioncmds.c:205 +#: commands/subscriptioncmds.c:215 commands/tablecmds.c:7541 #: commands/typecmds.c:335 commands/typecmds.c:1416 commands/typecmds.c:1425 #: commands/typecmds.c:1433 commands/typecmds.c:1441 commands/typecmds.c:1449 #: commands/typecmds.c:1457 commands/user.c:133 commands/user.c:147 @@ -3641,7 +3563,7 @@ msgstr "no existe el objeto grande %u" #: commands/user.c:590 commands/user.c:598 commands/user.c:606 #: commands/user.c:614 commands/user.c:622 commands/user.c:630 #: commands/user.c:638 commands/user.c:647 commands/user.c:655 -#: commands/user.c:663 parser/parse_utilcmd.c:407 +#: commands/user.c:663 parser/parse_utilcmd.c:397 #: replication/pgoutput/pgoutput.c:189 replication/pgoutput/pgoutput.c:210 #: replication/pgoutput/pgoutput.c:224 replication/pgoutput/pgoutput.c:234 #: replication/pgoutput/pgoutput.c:244 replication/walsender.c:882 @@ -3660,28 +3582,28 @@ msgstr "los privilegios por omisión no pueden definirse para columnas" msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "No puede utilizar la cláusula IN SCHEMA cuando se utiliza GRANT / REVOKE ON SCHEMAS" -#: catalog/aclchk.c:1544 catalog/catalog.c:553 catalog/objectaddress.c:1522 +#: catalog/aclchk.c:1544 catalog/catalog.c:557 catalog/objectaddress.c:1522 #: commands/analyze.c:390 commands/copy.c:741 commands/sequence.c:1701 -#: commands/tablecmds.c:6976 commands/tablecmds.c:7119 -#: commands/tablecmds.c:7169 commands/tablecmds.c:7243 -#: commands/tablecmds.c:7313 commands/tablecmds.c:7425 -#: commands/tablecmds.c:7519 commands/tablecmds.c:7578 -#: commands/tablecmds.c:7667 commands/tablecmds.c:7696 -#: commands/tablecmds.c:7851 commands/tablecmds.c:7933 -#: commands/tablecmds.c:8089 commands/tablecmds.c:8207 -#: commands/tablecmds.c:11556 commands/tablecmds.c:11738 -#: commands/tablecmds.c:11898 commands/tablecmds.c:13041 -#: commands/tablecmds.c:15602 commands/trigger.c:924 parser/analyze.c:2415 -#: parser/parse_relation.c:714 parser/parse_target.c:1064 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3453 -#: parser/parse_utilcmd.c:3488 parser/parse_utilcmd.c:3530 utils/adt/acl.c:2845 -#: utils/adt/ruleutils.c:2708 +#: commands/tablecmds.c:7004 commands/tablecmds.c:7160 +#: commands/tablecmds.c:7210 commands/tablecmds.c:7284 +#: commands/tablecmds.c:7354 commands/tablecmds.c:7466 +#: commands/tablecmds.c:7560 commands/tablecmds.c:7619 +#: commands/tablecmds.c:7708 commands/tablecmds.c:7737 +#: commands/tablecmds.c:7892 commands/tablecmds.c:7974 +#: commands/tablecmds.c:8130 commands/tablecmds.c:8248 +#: commands/tablecmds.c:11597 commands/tablecmds.c:11778 +#: commands/tablecmds.c:11938 commands/tablecmds.c:13081 +#: commands/tablecmds.c:15646 commands/trigger.c:942 parser/analyze.c:2428 +#: parser/parse_relation.c:714 parser/parse_target.c:1063 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3421 +#: parser/parse_utilcmd.c:3456 parser/parse_utilcmd.c:3498 utils/adt/acl.c:2845 +#: utils/adt/ruleutils.c:2712 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "no existe la columna «%s» en la relación «%s»" #: catalog/aclchk.c:1807 catalog/objectaddress.c:1362 commands/sequence.c:1139 -#: commands/tablecmds.c:249 commands/tablecmds.c:16466 utils/adt/acl.c:2053 +#: commands/tablecmds.c:249 commands/tablecmds.c:16510 utils/adt/acl.c:2053 #: utils/adt/acl.c:2083 utils/adt/acl.c:2115 utils/adt/acl.c:2147 #: utils/adt/acl.c:2175 utils/adt/acl.c:2205 #, c-format @@ -4096,7 +4018,7 @@ msgstr "no existe la función con OID %u" msgid "language with OID %u does not exist" msgstr "no existe el lenguaje con OID %u" -#: catalog/aclchk.c:4249 catalog/aclchk.c:5012 commands/collationcmds.c:517 +#: catalog/aclchk.c:4249 catalog/aclchk.c:5012 commands/collationcmds.c:536 #, c-format msgid "schema with OID %u does not exist" msgstr "no existe el esquema con OID %u" @@ -4152,7 +4074,7 @@ msgstr "no existe la configuración de búsqueda en texto con OID %u" msgid "event trigger with OID %u does not exist" msgstr "no existe el disparador por eventos con OID %u" -#: catalog/aclchk.c:5280 commands/collationcmds.c:368 +#: catalog/aclchk.c:5280 commands/collationcmds.c:387 #, c-format msgid "collation with OID %u does not exist" msgstr "no existe el ordenamiento (collation) con OID %u" @@ -4167,12 +4089,12 @@ msgstr "no existe la conversión con OID %u" msgid "extension with OID %u does not exist" msgstr "no existe la extensión con OID %u" -#: catalog/aclchk.c:5374 commands/publicationcmds.c:771 +#: catalog/aclchk.c:5374 commands/publicationcmds.c:818 #, c-format msgid "publication with OID %u does not exist" msgstr "no existe la publicación con OID %u" -#: catalog/aclchk.c:5400 commands/subscriptioncmds.c:1459 +#: catalog/aclchk.c:5400 commands/subscriptioncmds.c:1463 #, c-format msgid "subscription with OID %u does not exist" msgstr "no existe la suscripción con OID %u" @@ -4183,42 +4105,45 @@ msgid "statistics object with OID %u does not exist" msgstr "no existe el objeto de estadísticas con OID %u" #: catalog/catalog.c:378 -#, fuzzy, c-format -#| msgid "while inserting index tuple (%u,%u) in relation \"%s\"" -msgid "still finding an unused OID within relation \"%s\"" -msgstr "mientras se insertaba la tupla de índice (%u,%u) en la relación «%s»" +#, c-format +msgid "still searching for an unused OID in relation \"%s\"" +msgstr "aún se está buscando algún OID sin utilizar en la relación «%s»" #: catalog/catalog.c:380 #, c-format -msgid "OID candidates were checked \"%llu\" times, but no unused OID is yet found." -msgstr "" +msgid "OID candidates have been checked %llu time, but no unused OID has been found yet." +msgid_plural "OID candidates have been checked %llu times, but no unused OID has been found yet." +msgstr[0] "se han revisado los OID candidatos %llu vez, pero aún no se ha encontrado algún OID sin utilizar." +msgstr[1] "se han revisado los OID candidatos %llu veces, pero aún no se ha encontrado algún OID sin utilizar." -#: catalog/catalog.c:403 +#: catalog/catalog.c:405 #, c-format -msgid "new OID has been assigned in relation \"%s\" after \"%llu\" retries" -msgstr "" +msgid "new OID has been assigned in relation \"%s\" after %llu retry" +msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" +msgstr[0] "se ha asignado un nuevo OID en la relación «%s» luego de %llu reintento" +msgstr[1] "se ha asignado un nuevo OID en la relación «%s» luego de %llu reintentos" -#: catalog/catalog.c:532 +#: catalog/catalog.c:536 #, c-format msgid "must be superuser to call pg_nextoid()" msgstr "debe ser superusuario para invocar pg_nextoid()" -#: catalog/catalog.c:540 +#: catalog/catalog.c:544 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() sólo puede usarse en catálogos de sistema" -#: catalog/catalog.c:545 parser/parse_utilcmd.c:2276 +#: catalog/catalog.c:549 parser/parse_utilcmd.c:2266 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "el índice «%s» no pertenece a la tabla «%s»" -#: catalog/catalog.c:562 +#: catalog/catalog.c:566 #, c-format msgid "column \"%s\" is not of type oid" msgstr "la columna «%s» no es de tipo oid" -#: catalog/catalog.c:569 +#: catalog/catalog.c:573 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "«el índice %s» no es el índice para la columna «%s»" @@ -4233,22 +4158,22 @@ msgstr "no se puede eliminar %s porque %s lo requiere" msgid "You can drop %s instead." msgstr "Puede eliminar %s en su lugar." -#: catalog/dependency.c:931 catalog/pg_shdepend.c:696 +#: catalog/dependency.c:931 catalog/pg_shdepend.c:697 #, c-format msgid "cannot drop %s because it is required by the database system" msgstr "no se puede eliminar %s porque es requerido por el sistema" -#: catalog/dependency.c:1135 catalog/dependency.c:1144 +#: catalog/dependency.c:1141 catalog/dependency.c:1150 #, c-format msgid "%s depends on %s" msgstr "%s depende de %s" -#: catalog/dependency.c:1156 catalog/dependency.c:1165 +#: catalog/dependency.c:1165 catalog/dependency.c:1174 #, c-format msgid "drop cascades to %s" msgstr "eliminando además %s" -#: catalog/dependency.c:1173 catalog/pg_shdepend.c:825 +#: catalog/dependency.c:1182 catalog/pg_shdepend.c:826 #, c-format msgid "" "\n" @@ -4263,44 +4188,44 @@ msgstr[1] "" "\n" "y otros %d objetos (vea el registro del servidor para obtener la lista)" -#: catalog/dependency.c:1185 +#: catalog/dependency.c:1194 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "no se puede eliminar %s porque otros objetos dependen de él" -#: catalog/dependency.c:1187 catalog/dependency.c:1188 -#: catalog/dependency.c:1194 catalog/dependency.c:1195 -#: catalog/dependency.c:1206 catalog/dependency.c:1207 -#: commands/tablecmds.c:1298 commands/tablecmds.c:13659 -#: commands/tablespace.c:481 commands/user.c:1095 commands/view.c:495 +#: catalog/dependency.c:1196 catalog/dependency.c:1197 +#: catalog/dependency.c:1203 catalog/dependency.c:1204 +#: catalog/dependency.c:1215 catalog/dependency.c:1216 +#: commands/tablecmds.c:1297 commands/tablecmds.c:13699 +#: commands/tablespace.c:481 commands/user.c:1095 commands/view.c:492 #: libpq/auth.c:338 replication/syncrep.c:1043 storage/lmgr/deadlock.c:1152 #: storage/lmgr/proc.c:1433 utils/adt/acl.c:5250 utils/adt/jsonfuncs.c:618 -#: utils/adt/jsonfuncs.c:624 utils/misc/guc.c:7114 utils/misc/guc.c:7150 -#: utils/misc/guc.c:7220 utils/misc/guc.c:11400 utils/misc/guc.c:11434 -#: utils/misc/guc.c:11468 utils/misc/guc.c:11511 utils/misc/guc.c:11553 +#: utils/adt/jsonfuncs.c:624 utils/misc/guc.c:7115 utils/misc/guc.c:7151 +#: utils/misc/guc.c:7221 utils/misc/guc.c:11401 utils/misc/guc.c:11435 +#: utils/misc/guc.c:11469 utils/misc/guc.c:11512 utils/misc/guc.c:11554 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1189 catalog/dependency.c:1196 +#: catalog/dependency.c:1198 catalog/dependency.c:1205 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "Use DROP ... CASCADE para eliminar además los objetos dependientes." -#: catalog/dependency.c:1193 +#: catalog/dependency.c:1202 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "no se puede eliminar el o los objetos deseados porque otros objetos dependen de ellos" #. translator: %d always has a value larger than 1 -#: catalog/dependency.c:1202 +#: catalog/dependency.c:1211 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" msgstr[0] "eliminando además %d objeto más" msgstr[1] "eliminando además %d objetos más" -#: catalog/dependency.c:1863 +#: catalog/dependency.c:1875 #, c-format msgid "constant of the type %s cannot be used here" msgstr "no se puede usar una constante de tipo %s aquí" @@ -4315,13 +4240,13 @@ msgstr "se ha denegado el permiso para crear «%s.%s»" msgid "System catalog modifications are currently disallowed." msgstr "Las modificaciones al catálogo del sistema están actualmente deshabilitadas." -#: catalog/heap.c:511 commands/tablecmds.c:2335 commands/tablecmds.c:2972 -#: commands/tablecmds.c:6567 +#: catalog/heap.c:511 commands/tablecmds.c:2290 commands/tablecmds.c:2927 +#: commands/tablecmds.c:6595 #, c-format msgid "tables can have at most %d columns" msgstr "las tablas pueden tener a lo más %d columnas" -#: catalog/heap.c:529 commands/tablecmds.c:6866 +#: catalog/heap.c:529 commands/tablecmds.c:6894 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "el nombre de columna «%s» colisiona con nombre de una columna de sistema" @@ -4353,223 +4278,222 @@ msgstr "un tipo compuesto %s no puede ser hecho miembro de sí mismo" msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "no se derivó ningún ordenamiento (collate) para la columna %s de llave de partición con tipo ordenable %s" -#: catalog/heap.c:717 commands/createas.c:203 commands/createas.c:506 +#: catalog/heap.c:717 commands/createas.c:203 commands/createas.c:500 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "no se derivó ningún ordenamiento (collate) para la columna «%s» con tipo ordenable %s" -#: catalog/heap.c:1199 catalog/index.c:870 commands/createas.c:411 -#: commands/tablecmds.c:3853 +#: catalog/heap.c:1202 catalog/index.c:871 commands/createas.c:405 +#: commands/tablecmds.c:3832 #, c-format msgid "relation \"%s\" already exists" msgstr "la relación «%s» ya existe" -#: catalog/heap.c:1215 catalog/pg_type.c:435 catalog/pg_type.c:773 -#: catalog/pg_type.c:920 commands/typecmds.c:249 commands/typecmds.c:261 +#: catalog/heap.c:1218 catalog/pg_type.c:436 catalog/pg_type.c:781 +#: catalog/pg_type.c:928 commands/typecmds.c:249 commands/typecmds.c:261 #: commands/typecmds.c:757 commands/typecmds.c:1172 commands/typecmds.c:1398 -#: commands/typecmds.c:1590 commands/typecmds.c:2563 +#: commands/typecmds.c:1590 commands/typecmds.c:2562 #, c-format msgid "type \"%s\" already exists" msgstr "ya existe un tipo «%s»" -#: catalog/heap.c:1216 +#: catalog/heap.c:1219 #, c-format msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." msgstr "Una relación tiene un tipo asociado del mismo nombre, de modo que debe usar un nombre que no entre en conflicto con un tipo existente." -#: catalog/heap.c:1245 +#: catalog/heap.c:1248 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "el valor de OID de heap de pg_class no se definió en modo de actualización binaria" -#: catalog/heap.c:2450 +#: catalog/heap.c:2461 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "no se puede agregar una restricción NO INHERIT a la tabla particionada «%s»" -#: catalog/heap.c:2722 +#: catalog/heap.c:2733 #, c-format msgid "check constraint \"%s\" already exists" msgstr "la restricción «check» «%s» ya existe" -#: catalog/heap.c:2892 catalog/index.c:884 catalog/pg_constraint.c:670 -#: commands/tablecmds.c:8581 +#: catalog/heap.c:2903 catalog/index.c:885 catalog/pg_constraint.c:670 +#: commands/tablecmds.c:8622 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "la restricción «%s» para la relación «%s» ya existe" -#: catalog/heap.c:2899 +#: catalog/heap.c:2910 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "la restricción «%s» está en conflicto con la restricción no heredada de la relación «%s»" -#: catalog/heap.c:2910 +#: catalog/heap.c:2921 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "la restricción «%s» está en conflicto con la restricción heredada de la relación «%s»" -#: catalog/heap.c:2920 +#: catalog/heap.c:2931 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "la restricción «%s» está en conflicto con la restricción NOT VALID de la relación «%s»" -#: catalog/heap.c:2925 +#: catalog/heap.c:2936 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "mezclando la restricción «%s» con la definición heredada" -#: catalog/heap.c:3030 +#: catalog/heap.c:3041 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "no se puede usar la columna generada «%s» en una expresión de generación de columna" -#: catalog/heap.c:3032 +#: catalog/heap.c:3043 #, c-format msgid "A generated column cannot reference another generated column." msgstr "Una columna generada no puede hacer referencia a otra columna generada." -#: catalog/heap.c:3038 -#, fuzzy, c-format -#| msgid "cannot use subquery in column generation expression" +#: catalog/heap.c:3049 +#, c-format msgid "cannot use whole-row variable in column generation expression" -msgstr "no se puede usar una subconsulta en una expresión de generación de columna" +msgstr "no se puede usar una variable de fila completa (whole-row) en una expresión de generación de columna" -#: catalog/heap.c:3039 +#: catalog/heap.c:3050 #, c-format msgid "This would cause the generated column to depend on its own value." -msgstr "" +msgstr "Esto causaría que la columna generada dependa de su propio valor." -#: catalog/heap.c:3092 +#: catalog/heap.c:3103 #, c-format msgid "generation expression is not immutable" msgstr "la expresión de generación no es inmutable" -#: catalog/heap.c:3120 rewrite/rewriteHandler.c:1245 +#: catalog/heap.c:3131 rewrite/rewriteHandler.c:1268 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "la columna «%s» es de tipo %s pero la expresión default es de tipo %s" -#: catalog/heap.c:3125 commands/prepare.c:367 parser/analyze.c:2639 -#: parser/parse_target.c:595 parser/parse_target.c:883 -#: parser/parse_target.c:893 rewrite/rewriteHandler.c:1250 +#: catalog/heap.c:3136 commands/prepare.c:368 parser/analyze.c:2652 +#: parser/parse_target.c:594 parser/parse_target.c:882 +#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1273 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Necesitará reescribir la expresión o aplicarle una conversión de tipo." -#: catalog/heap.c:3172 +#: catalog/heap.c:3183 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "sólo la tabla «%s» puede ser referenciada en una restricción «check»" -#: catalog/heap.c:3470 +#: catalog/heap.c:3481 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "combinación de ON COMMIT y llaves foráneas no soportada" -#: catalog/heap.c:3471 +#: catalog/heap.c:3482 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "La tabla «%s» se refiere a «%s», pero no tienen la misma expresión para ON COMMIT." -#: catalog/heap.c:3476 +#: catalog/heap.c:3487 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "no se puede truncar una tabla referida en una llave foránea" -#: catalog/heap.c:3477 +#: catalog/heap.c:3488 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "La tabla «%s» hace referencia a «%s»." -#: catalog/heap.c:3479 +#: catalog/heap.c:3490 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Trunque la tabla «%s» al mismo tiempo, o utilice TRUNCATE ... CASCADE." -#: catalog/index.c:221 parser/parse_utilcmd.c:2182 +#: catalog/index.c:222 parser/parse_utilcmd.c:2172 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "no se permiten múltiples llaves primarias para la tabla «%s»" -#: catalog/index.c:239 +#: catalog/index.c:240 #, c-format msgid "primary keys cannot be expressions" msgstr "las llaves primarias no pueden ser expresiones" -#: catalog/index.c:256 +#: catalog/index.c:257 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "columna de llave primaria «%s» no está marcada NOT NULL" -#: catalog/index.c:769 catalog/index.c:1905 +#: catalog/index.c:770 catalog/index.c:1915 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "los usuarios no pueden crear índices en tablas del sistema" -#: catalog/index.c:809 +#: catalog/index.c:810 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "los ordenamientos no determinísticos no están soportados para la clase de operadores «%s»" -#: catalog/index.c:824 +#: catalog/index.c:825 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "no se pueden crear índices de forma concurrente en tablas del sistema" -#: catalog/index.c:833 catalog/index.c:1284 +#: catalog/index.c:834 catalog/index.c:1285 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "no se pueden crear índices para restricciones de exclusión de forma concurrente" -#: catalog/index.c:842 +#: catalog/index.c:843 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "no se pueden crear índices compartidos después de initdb" -#: catalog/index.c:862 commands/createas.c:417 commands/sequence.c:154 -#: parser/parse_utilcmd.c:211 +#: catalog/index.c:863 commands/createas.c:411 commands/sequence.c:154 +#: parser/parse_utilcmd.c:201 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "la relación «%s» ya existe, omitiendo" -#: catalog/index.c:912 +#: catalog/index.c:913 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "el valor de OID de índice de pg_class no se definió en modo de actualización binaria" -#: catalog/index.c:2191 +#: catalog/index.c:2201 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY debe ser la primera acción en una transacción" -#: catalog/index.c:3576 +#: catalog/index.c:3586 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "no se puede hacer reindex de tablas temporales de otras sesiones" -#: catalog/index.c:3587 commands/indexcmds.c:3426 +#: catalog/index.c:3597 commands/indexcmds.c:3426 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "no es posible reindexar un índice no válido en tabla TOAST" -#: catalog/index.c:3603 commands/indexcmds.c:3306 commands/indexcmds.c:3450 -#: commands/tablecmds.c:3292 +#: catalog/index.c:3613 commands/indexcmds.c:3306 commands/indexcmds.c:3450 +#: commands/tablecmds.c:3247 #, c-format msgid "cannot move system relation \"%s\"" msgstr "no se puede mover la relación de sistema «%s»" -#: catalog/index.c:3747 +#: catalog/index.c:3757 #, c-format msgid "index \"%s\" was reindexed" msgstr "el índice «%s» fue reindexado" -#: catalog/index.c:3878 +#: catalog/index.c:3888 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "no se puede reindexar el índice no válido «%s.%s» en tabla TOAST, omitiendo" #: catalog/namespace.c:258 catalog/namespace.c:462 catalog/namespace.c:554 -#: commands/trigger.c:5134 +#: commands/trigger.c:5152 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "no están implementadas las referencias entre bases de datos: «%s.%s.%s»" @@ -4600,8 +4524,8 @@ msgstr "no existe la relación «%s.%s»" msgid "relation \"%s\" does not exist" msgstr "no existe la relación «%s»" -#: catalog/namespace.c:500 catalog/namespace.c:3075 commands/extension.c:1519 -#: commands/extension.c:1525 +#: catalog/namespace.c:500 catalog/namespace.c:3075 commands/extension.c:1520 +#: commands/extension.c:1526 #, c-format msgid "no schema has been selected to create in" msgstr "no se ha seleccionado ningún esquema dentro del cual crear" @@ -4647,13 +4571,13 @@ msgstr "no existe la plantilla de búsqueda en texto «%s»" msgid "text search configuration \"%s\" does not exist" msgstr "no existe la configuración de búsqueda en texto «%s»" -#: catalog/namespace.c:2882 parser/parse_expr.c:810 parser/parse_target.c:1256 +#: catalog/namespace.c:2882 parser/parse_expr.c:810 parser/parse_target.c:1255 #, c-format msgid "cross-database references are not implemented: %s" msgstr "no están implementadas las referencias entre bases de datos: %s" -#: catalog/namespace.c:2888 gram.y:15102 gram.y:17061 parser/parse_expr.c:817 -#: parser/parse_target.c:1263 +#: catalog/namespace.c:2888 gram.y:15102 gram.y:17076 parser/parse_expr.c:817 +#: parser/parse_target.c:1262 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "el nombre no es válido (demasiados puntos): %s" @@ -4668,8 +4592,8 @@ msgstr "no se puede mover objetos hacia o desde esquemas temporales" msgid "cannot move objects into or out of TOAST schema" msgstr "no se puede mover objetos hacia o desde el esquema TOAST" -#: catalog/namespace.c:3097 commands/schemacmds.c:233 commands/schemacmds.c:313 -#: commands/tablecmds.c:1243 +#: catalog/namespace.c:3097 commands/schemacmds.c:234 commands/schemacmds.c:314 +#: commands/tablecmds.c:1242 #, c-format msgid "schema \"%s\" does not exist" msgstr "no existe el esquema «%s»" @@ -4704,34 +4628,34 @@ msgstr "no se pueden crear tablas temporales durante la recuperación" msgid "cannot create temporary tables during a parallel operation" msgstr "no se pueden crear tablas temporales durante una operación paralela" -#: catalog/namespace.c:4331 commands/tablespace.c:1217 commands/variable.c:64 -#: utils/misc/guc.c:11585 utils/misc/guc.c:11663 +#: catalog/namespace.c:4331 commands/tablespace.c:1213 commands/variable.c:64 +#: utils/misc/guc.c:11586 utils/misc/guc.c:11664 #, c-format msgid "List syntax is invalid." msgstr "La sintaxis de lista no es válida." -#: catalog/objectaddress.c:1370 catalog/pg_publication.c:57 -#: commands/policy.c:95 commands/policy.c:375 commands/policy.c:465 -#: commands/tablecmds.c:243 commands/tablecmds.c:285 commands/tablecmds.c:2145 -#: commands/tablecmds.c:6016 commands/tablecmds.c:11673 +#: catalog/objectaddress.c:1370 catalog/pg_publication.c:58 +#: commands/policy.c:96 commands/policy.c:376 commands/tablecmds.c:243 +#: commands/tablecmds.c:285 commands/tablecmds.c:2134 commands/tablecmds.c:6035 +#: commands/tablecmds.c:11714 #, c-format msgid "\"%s\" is not a table" msgstr "«%s» no es una tabla" #: catalog/objectaddress.c:1377 commands/tablecmds.c:255 -#: commands/tablecmds.c:6046 commands/tablecmds.c:16471 commands/view.c:119 +#: commands/tablecmds.c:6074 commands/tablecmds.c:16515 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "«%s» no es una vista" #: catalog/objectaddress.c:1384 commands/matview.c:175 commands/tablecmds.c:261 -#: commands/tablecmds.c:16476 +#: commands/tablecmds.c:16520 #, c-format msgid "\"%s\" is not a materialized view" msgstr "«%s» no es una vista materializada" #: catalog/objectaddress.c:1391 commands/tablecmds.c:279 -#: commands/tablecmds.c:6049 commands/tablecmds.c:16481 +#: commands/tablecmds.c:6077 commands/tablecmds.c:16525 #, c-format msgid "\"%s\" is not a foreign table" msgstr "«%s» no es una tabla foránea" @@ -4751,7 +4675,7 @@ msgstr "el nombre de columna debe ser calificado" msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "no existe el valor por omisión para la columna «%s» de la relación «%s»" -#: catalog/objectaddress.c:1645 commands/functioncmds.c:137 +#: catalog/objectaddress.c:1645 commands/functioncmds.c:138 #: commands/tablecmds.c:271 commands/typecmds.c:274 commands/typecmds.c:3713 #: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:791 #: utils/adt/acl.c:4411 @@ -4838,12 +4762,12 @@ msgstr "el largo de la lista de nombres debe ser al menos %d" msgid "argument list length must be exactly %d" msgstr "el largo de la lista de argumentos debe ser exactamente %d" -#: catalog/objectaddress.c:2488 libpq/be-fsstubs.c:321 +#: catalog/objectaddress.c:2488 libpq/be-fsstubs.c:318 #, c-format msgid "must be owner of large object %u" msgstr "debe ser dueño del objeto grande %u" -#: catalog/objectaddress.c:2503 commands/functioncmds.c:1581 +#: catalog/objectaddress.c:2503 commands/functioncmds.c:1582 #, c-format msgid "must be owner of type %s or type %s" msgstr "debe ser dueño del tipo %s o el tipo %s" @@ -4858,80 +4782,80 @@ msgstr "debe ser superusuario" msgid "must have CREATEROLE privilege" msgstr "debe tener privilegio CREATEROLE" -#: catalog/objectaddress.c:2639 +#: catalog/objectaddress.c:2640 #, c-format msgid "unrecognized object type \"%s\"" msgstr "tipo de objeto «%s» no reconocido" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2882 +#: catalog/objectaddress.c:2883 #, c-format msgid "column %s of %s" msgstr " columna %s de %s" -#: catalog/objectaddress.c:2897 +#: catalog/objectaddress.c:2898 #, c-format msgid "function %s" msgstr "función %s" -#: catalog/objectaddress.c:2910 +#: catalog/objectaddress.c:2911 #, c-format msgid "type %s" msgstr "tipo %s" -#: catalog/objectaddress.c:2947 +#: catalog/objectaddress.c:2948 #, c-format msgid "cast from %s to %s" msgstr "conversión de %s a %s" -#: catalog/objectaddress.c:2980 +#: catalog/objectaddress.c:2981 #, c-format msgid "collation %s" msgstr "ordenamiento (collation) %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3011 +#: catalog/objectaddress.c:3012 #, c-format msgid "constraint %s on %s" msgstr "restricción «%s» en %s" -#: catalog/objectaddress.c:3017 +#: catalog/objectaddress.c:3018 #, c-format msgid "constraint %s" msgstr "restricción %s" -#: catalog/objectaddress.c:3049 +#: catalog/objectaddress.c:3050 #, c-format msgid "conversion %s" msgstr "conversión %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3095 +#: catalog/objectaddress.c:3096 #, c-format msgid "default value for %s" msgstr "valor por omisión para %s" -#: catalog/objectaddress.c:3109 +#: catalog/objectaddress.c:3110 #, c-format msgid "language %s" msgstr "lenguaje %s" -#: catalog/objectaddress.c:3117 +#: catalog/objectaddress.c:3118 #, c-format msgid "large object %u" msgstr "objeto grande %u" -#: catalog/objectaddress.c:3130 +#: catalog/objectaddress.c:3131 #, c-format msgid "operator %s" msgstr "operador %s" -#: catalog/objectaddress.c:3167 +#: catalog/objectaddress.c:3168 #, c-format msgid "operator class %s for access method %s" msgstr "clase de operadores «%s» para el método de acceso «%s»" -#: catalog/objectaddress.c:3195 +#: catalog/objectaddress.c:3196 #, c-format msgid "access method %s" msgstr "método de acceso %s" @@ -4940,7 +4864,7 @@ msgstr "método de acceso %s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3244 +#: catalog/objectaddress.c:3245 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "operador %d (%s, %s) de %s: %s" @@ -4949,221 +4873,221 @@ msgstr "operador %d (%s, %s) de %s: %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3301 +#: catalog/objectaddress.c:3302 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "función %d (%s, %s) de %s: %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3353 +#: catalog/objectaddress.c:3354 #, c-format msgid "rule %s on %s" msgstr "regla %s en %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3399 +#: catalog/objectaddress.c:3400 #, c-format msgid "trigger %s on %s" msgstr "disparador %s en %s" -#: catalog/objectaddress.c:3419 +#: catalog/objectaddress.c:3420 #, c-format msgid "schema %s" msgstr "esquema %s" -#: catalog/objectaddress.c:3447 +#: catalog/objectaddress.c:3448 #, c-format msgid "statistics object %s" msgstr "object de estadísticas %s" -#: catalog/objectaddress.c:3478 +#: catalog/objectaddress.c:3479 #, c-format msgid "text search parser %s" msgstr "analizador de búsqueda en texto %s" -#: catalog/objectaddress.c:3509 +#: catalog/objectaddress.c:3510 #, c-format msgid "text search dictionary %s" msgstr "diccionario de búsqueda en texto %s" -#: catalog/objectaddress.c:3540 +#: catalog/objectaddress.c:3541 #, c-format msgid "text search template %s" msgstr "plantilla de búsqueda en texto %s" -#: catalog/objectaddress.c:3571 +#: catalog/objectaddress.c:3572 #, c-format msgid "text search configuration %s" msgstr "configuración de búsqueda en texto %s" -#: catalog/objectaddress.c:3584 +#: catalog/objectaddress.c:3585 #, c-format msgid "role %s" msgstr "rol %s" -#: catalog/objectaddress.c:3600 +#: catalog/objectaddress.c:3601 #, c-format msgid "database %s" msgstr "base de datos %s" -#: catalog/objectaddress.c:3616 +#: catalog/objectaddress.c:3617 #, c-format msgid "tablespace %s" msgstr "tablespace %s" -#: catalog/objectaddress.c:3627 +#: catalog/objectaddress.c:3628 #, c-format msgid "foreign-data wrapper %s" msgstr "conector de datos externos %s" -#: catalog/objectaddress.c:3637 +#: catalog/objectaddress.c:3638 #, c-format msgid "server %s" msgstr "servidor %s" -#: catalog/objectaddress.c:3670 +#: catalog/objectaddress.c:3671 #, c-format msgid "user mapping for %s on server %s" msgstr "mapeo para el usuario %s en el servidor %s" -#: catalog/objectaddress.c:3722 +#: catalog/objectaddress.c:3723 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "privilegios por omisión en nuevas relaciones pertenecientes al rol %s en el esquema %s" -#: catalog/objectaddress.c:3726 +#: catalog/objectaddress.c:3727 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "privilegios por omisión en nuevas relaciones pertenecientes al rol %s" -#: catalog/objectaddress.c:3732 +#: catalog/objectaddress.c:3733 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "privilegios por omisión en nuevas secuencias pertenecientes al rol %s en el esquema %s" -#: catalog/objectaddress.c:3736 +#: catalog/objectaddress.c:3737 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "privilegios por omisión en nuevas secuencias pertenecientes al rol %s" -#: catalog/objectaddress.c:3742 +#: catalog/objectaddress.c:3743 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "privilegios por omisión en nuevas funciones pertenecientes al rol %s en el esquema %s" -#: catalog/objectaddress.c:3746 +#: catalog/objectaddress.c:3747 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "privilegios por omisión en nuevas funciones pertenecientes al rol %s" -#: catalog/objectaddress.c:3752 +#: catalog/objectaddress.c:3753 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "privilegios por omisión en nuevos tipos pertenecientes al rol %s en el esquema %s" -#: catalog/objectaddress.c:3756 +#: catalog/objectaddress.c:3757 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "privilegios por omisión en nuevos tipos pertenecientes al rol %s" -#: catalog/objectaddress.c:3762 +#: catalog/objectaddress.c:3763 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "privilegios por omisión en nuevos esquemas pertenecientes al rol %s" -#: catalog/objectaddress.c:3769 +#: catalog/objectaddress.c:3770 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "privilegios por omisión pertenecientes al rol %s en el esquema %s" -#: catalog/objectaddress.c:3773 +#: catalog/objectaddress.c:3774 #, c-format msgid "default privileges belonging to role %s" msgstr "privilegios por omisión pertenecientes al rol %s" -#: catalog/objectaddress.c:3795 +#: catalog/objectaddress.c:3796 #, c-format msgid "extension %s" msgstr "extensión %s" -#: catalog/objectaddress.c:3812 +#: catalog/objectaddress.c:3813 #, c-format msgid "event trigger %s" msgstr "disparador por eventos %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3856 +#: catalog/objectaddress.c:3857 #, c-format msgid "policy %s on %s" msgstr "política %s en %s" -#: catalog/objectaddress.c:3870 +#: catalog/objectaddress.c:3871 #, c-format msgid "publication %s" msgstr "publicación %s" #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:3898 +#: catalog/objectaddress.c:3899 #, c-format msgid "publication of %s in publication %s" msgstr "publicación de %s en la publicación %s" -#: catalog/objectaddress.c:3911 +#: catalog/objectaddress.c:3912 #, c-format msgid "subscription %s" msgstr "suscripción %s" -#: catalog/objectaddress.c:3932 +#: catalog/objectaddress.c:3933 #, c-format msgid "transform for %s language %s" msgstr "transformación para %s lenguaje %s" -#: catalog/objectaddress.c:4003 +#: catalog/objectaddress.c:4004 #, c-format msgid "table %s" msgstr "tabla %s" -#: catalog/objectaddress.c:4008 +#: catalog/objectaddress.c:4009 #, c-format msgid "index %s" msgstr "índice %s" -#: catalog/objectaddress.c:4012 +#: catalog/objectaddress.c:4013 #, c-format msgid "sequence %s" msgstr "secuencia %s" -#: catalog/objectaddress.c:4016 +#: catalog/objectaddress.c:4017 #, c-format msgid "toast table %s" msgstr "tabla toast %s" -#: catalog/objectaddress.c:4020 +#: catalog/objectaddress.c:4021 #, c-format msgid "view %s" msgstr "vista %s" -#: catalog/objectaddress.c:4024 +#: catalog/objectaddress.c:4025 #, c-format msgid "materialized view %s" msgstr "vista materializada %s" -#: catalog/objectaddress.c:4028 +#: catalog/objectaddress.c:4029 #, c-format msgid "composite type %s" msgstr "tipo compuesto %s" -#: catalog/objectaddress.c:4032 +#: catalog/objectaddress.c:4033 #, c-format msgid "foreign table %s" msgstr "tabla foránea %s" -#: catalog/objectaddress.c:4037 +#: catalog/objectaddress.c:4038 #, c-format msgid "relation %s" msgstr "relación %s" -#: catalog/objectaddress.c:4078 +#: catalog/objectaddress.c:4079 #, c-format msgid "operator family %s for access method %s" msgstr "familia de operadores %s para el método de acceso %s" @@ -5220,7 +5144,7 @@ msgstr "la función final con argumentos extra no debe declararse STRICT" msgid "return type of combine function %s is not %s" msgstr "el tipo de retorno de la función «combine» %s no es %s" -#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:4128 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:4125 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "la función «combine» con tipo de transición %s no debe declararse STRICT" @@ -5235,12 +5159,12 @@ msgstr "el tipo de retorno de la función de serialización %s no es %s" msgid "return type of deserialization function %s is not %s" msgstr "el tipo de retorno de la función de deserialización %s no es %s" -#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:189 catalog/pg_proc.c:223 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:190 catalog/pg_proc.c:224 #, c-format msgid "cannot determine result data type" msgstr "no se puede determinar el tipo de dato del resultado" -#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:202 catalog/pg_proc.c:231 +#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:203 catalog/pg_proc.c:232 #, c-format msgid "unsafe use of pseudo-type \"internal\"" msgstr "uso inseguro de pseudotipo «internal»" @@ -5255,7 +5179,7 @@ msgstr "la implementación de la función de agregación en modo «moving» devu msgid "sort operator can only be specified for single-argument aggregates" msgstr "el operador de ordenamiento sólo puede ser especificado para funciones de agregación de un solo argumento" -#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:384 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:385 #, c-format msgid "cannot change routine kind" msgstr "no se puede cambiar el tipo de rutina" @@ -5280,11 +5204,11 @@ msgstr "«%s» es una agregación de conjunto hipotético." msgid "cannot change number of direct arguments of an aggregate function" msgstr "no se puede cambiar cantidad de argumentos directos de una función de agregación" -#: catalog/pg_aggregate.c:858 commands/functioncmds.c:701 -#: commands/typecmds.c:1992 commands/typecmds.c:2038 commands/typecmds.c:2090 -#: commands/typecmds.c:2127 commands/typecmds.c:2161 commands/typecmds.c:2195 -#: commands/typecmds.c:2229 commands/typecmds.c:2258 commands/typecmds.c:2345 -#: commands/typecmds.c:2387 parser/parse_func.c:417 parser/parse_func.c:448 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:702 +#: commands/typecmds.c:1991 commands/typecmds.c:2037 commands/typecmds.c:2089 +#: commands/typecmds.c:2126 commands/typecmds.c:2160 commands/typecmds.c:2194 +#: commands/typecmds.c:2228 commands/typecmds.c:2257 commands/typecmds.c:2344 +#: commands/typecmds.c:2386 parser/parse_func.c:417 parser/parse_func.c:448 #: parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 #: parser/parse_func.c:631 parser/parse_func.c:2173 parser/parse_func.c:2446 #, c-format @@ -5356,12 +5280,12 @@ msgstr "ya existe la conversión «%s»" msgid "default conversion for %s to %s already exists" msgstr "ya existe una conversión por omisión desde %s a %s" -#: catalog/pg_depend.c:204 commands/extension.c:3343 +#: catalog/pg_depend.c:211 commands/extension.c:3352 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "«%s» ya es un miembro de la extensión «%s»" -#: catalog/pg_depend.c:580 +#: catalog/pg_depend.c:587 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "no se puede eliminar dependencia a %s porque es un objeto requerido por el sistema" @@ -5372,10 +5296,9 @@ msgid "invalid enum label \"%s\"" msgstr "la etiqueta enum «%s» no es válida" #: catalog/pg_enum.c:129 catalog/pg_enum.c:231 catalog/pg_enum.c:526 -#, fuzzy, c-format -#| msgid "Labels must be %d characters or less." +#, c-format msgid "Labels must be %d bytes or less." -msgstr "Las etiquetas deben ser de %d caracteres o menos." +msgstr "Las etiquetas deben ser de %d bytes o menos." #: catalog/pg_enum.c:259 #, c-format @@ -5403,33 +5326,32 @@ msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" msgstr "ALTER TYPE ADD BEFORE/AFTER es incompatible con la actualización binaria" #: catalog/pg_inherits.c:593 -#, fuzzy, c-format -#| msgid "cannot inherit from partition \"%s\"" +#, c-format msgid "cannot detach partition \"%s\"" -msgstr "no se puede heredar de la partición «%s»" +msgstr "no se puede desprender la partición «%s»" #: catalog/pg_inherits.c:595 #, c-format msgid "The partition is being detached concurrently or has an unfinished detach." -msgstr "" +msgstr "La partición está siendo desprendida de forma concurrente o tiene un desprendimiento sin terminar." -#: catalog/pg_inherits.c:596 +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4425 +#: commands/tablecmds.c:14815 #, c-format -msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation" -msgstr "" +msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." +msgstr "Utilice ALTER TABLE ... DETACH PARTITION ... FINALIZE para completar la operación de desprendimiento pendiente." #: catalog/pg_inherits.c:600 -#, fuzzy, c-format -#| msgid "cannot cluster on partial index \"%s\"" +#, c-format msgid "cannot complete detaching partition \"%s\"" -msgstr "no se puede reordenar en índice parcial «%s»" +msgstr "no se puede completar el desprendimiento de la partición «%s»" #: catalog/pg_inherits.c:602 #, c-format msgid "There's no pending concurrent detach." -msgstr "" +msgstr "No hay desprendimientos concurrentes pendientes." -#: catalog/pg_namespace.c:64 commands/schemacmds.c:242 +#: catalog/pg_namespace.c:64 commands/schemacmds.c:243 #, c-format msgid "schema \"%s\" already exists" msgstr "ya existe el esquema «%s»" @@ -5494,44 +5416,44 @@ msgstr "ya existe un operador %s" msgid "operator cannot be its own negator or sort operator" msgstr "un operador no puede ser su propio negador u operador de ordenamiento" -#: catalog/pg_proc.c:130 parser/parse_func.c:2235 +#: catalog/pg_proc.c:131 parser/parse_func.c:2235 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" msgstr[0] "las funciones no pueden tener más de %d argumento" msgstr[1] "las funciones no pueden tener más de %d argumentos" -#: catalog/pg_proc.c:374 +#: catalog/pg_proc.c:375 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "ya existe una función «%s» con los mismos argumentos" -#: catalog/pg_proc.c:386 +#: catalog/pg_proc.c:387 #, c-format msgid "\"%s\" is an aggregate function." msgstr "«%s» es una función de agregación." -#: catalog/pg_proc.c:388 +#: catalog/pg_proc.c:389 #, c-format msgid "\"%s\" is a function." msgstr "«%s» es una función de agregación." -#: catalog/pg_proc.c:390 +#: catalog/pg_proc.c:391 #, c-format msgid "\"%s\" is a procedure." msgstr "«%s» es un índice parcial." -#: catalog/pg_proc.c:392 +#: catalog/pg_proc.c:393 #, c-format msgid "\"%s\" is a window function." msgstr "«%s» es una función de ventana deslizante." -#: catalog/pg_proc.c:412 +#: catalog/pg_proc.c:413 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "no se puede cambiar que un procedimiento tenga parámetros de salida" -#: catalog/pg_proc.c:413 catalog/pg_proc.c:443 +#: catalog/pg_proc.c:414 catalog/pg_proc.c:444 #, c-format msgid "cannot change return type of existing function" msgstr "no se puede cambiar el tipo de retorno de una función existente" @@ -5540,89 +5462,89 @@ msgstr "no se puede cambiar el tipo de retorno de una función existente" #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: catalog/pg_proc.c:419 catalog/pg_proc.c:446 catalog/pg_proc.c:491 -#: catalog/pg_proc.c:517 catalog/pg_proc.c:543 +#: catalog/pg_proc.c:420 catalog/pg_proc.c:447 catalog/pg_proc.c:492 +#: catalog/pg_proc.c:518 catalog/pg_proc.c:544 #, c-format msgid "Use %s %s first." msgstr "Use %s %s primero." -#: catalog/pg_proc.c:444 +#: catalog/pg_proc.c:445 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "Tipo de registro definido por parámetros OUT es diferente." -#: catalog/pg_proc.c:488 +#: catalog/pg_proc.c:489 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "no se puede cambiar el nombre del parámetro de entrada «%s»" -#: catalog/pg_proc.c:515 +#: catalog/pg_proc.c:516 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "no se puede eliminar el valor por omisión de funciones existentes" -#: catalog/pg_proc.c:541 +#: catalog/pg_proc.c:542 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "no se puede cambiar el tipo de dato del valor por omisión de un parámetro" -#: catalog/pg_proc.c:751 +#: catalog/pg_proc.c:752 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "no hay ninguna función interna llamada «%s»" -#: catalog/pg_proc.c:849 +#: catalog/pg_proc.c:850 #, c-format msgid "SQL functions cannot return type %s" msgstr "las funciones SQL no pueden retornar el tipo %s" -#: catalog/pg_proc.c:864 +#: catalog/pg_proc.c:865 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "las funciones SQL no pueden tener argumentos de tipo %s" -#: catalog/pg_proc.c:976 executor/functions.c:1457 +#: catalog/pg_proc.c:995 executor/functions.c:1458 #, c-format msgid "SQL function \"%s\"" msgstr "función SQL «%s»" -#: catalog/pg_publication.c:59 +#: catalog/pg_publication.c:60 #, c-format msgid "Only tables can be added to publications." msgstr "Sólo se pueden agregar tablas a las publicaciones." -#: catalog/pg_publication.c:65 +#: catalog/pg_publication.c:66 #, c-format msgid "\"%s\" is a system table" msgstr "«%s» es una tabla de sistema" -#: catalog/pg_publication.c:67 +#: catalog/pg_publication.c:68 #, c-format msgid "System tables cannot be added to publications." msgstr "Las tablas de sistema no pueden agregarse a publicaciones." -#: catalog/pg_publication.c:73 +#: catalog/pg_publication.c:74 #, c-format msgid "table \"%s\" cannot be replicated" msgstr "la tabla «%s» no puede replicarse" -#: catalog/pg_publication.c:75 +#: catalog/pg_publication.c:76 #, c-format msgid "Temporary and unlogged relations cannot be replicated." msgstr "Las tablas temporales o «unlogged» no pueden replicarse." -#: catalog/pg_publication.c:174 +#: catalog/pg_publication.c:251 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "la relación «%s» ya es un miembro de la publicación «%s»" -#: catalog/pg_publication.c:470 commands/publicationcmds.c:451 -#: commands/publicationcmds.c:739 +#: catalog/pg_publication.c:533 commands/publicationcmds.c:458 +#: commands/publicationcmds.c:786 #, c-format msgid "publication \"%s\" does not exist" msgstr "no existe la publicación «%s»" -#: catalog/pg_shdepend.c:832 +#: catalog/pg_shdepend.c:833 #, c-format msgid "" "\n" @@ -5637,76 +5559,74 @@ msgstr[1] "" "\n" "y objetos en otras %d bases de datos (vea el registro del servidor para obtener la lista)" -#: catalog/pg_shdepend.c:1176 +#: catalog/pg_shdepend.c:1180 #, c-format msgid "role %u was concurrently dropped" msgstr "el rol %u fue eliminado por una transacción concurrente" -#: catalog/pg_shdepend.c:1188 +#: catalog/pg_shdepend.c:1192 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "el tablespace %u fue eliminado por una transacción concurrente" -#: catalog/pg_shdepend.c:1202 +#: catalog/pg_shdepend.c:1206 #, c-format msgid "database %u was concurrently dropped" msgstr "la base de datos %u fue eliminado por una transacción concurrente" -#: catalog/pg_shdepend.c:1247 +#: catalog/pg_shdepend.c:1257 #, c-format msgid "owner of %s" msgstr "dueño de %s" -#: catalog/pg_shdepend.c:1249 +#: catalog/pg_shdepend.c:1259 #, c-format msgid "privileges for %s" msgstr "privilegios para %s" -#: catalog/pg_shdepend.c:1251 +#: catalog/pg_shdepend.c:1261 #, c-format msgid "target of %s" msgstr "destino de %s" -#: catalog/pg_shdepend.c:1253 -#, fuzzy, c-format -#| msgid "tablespace %s" +#: catalog/pg_shdepend.c:1263 +#, c-format msgid "tablespace for %s" -msgstr "tablespace %s" +msgstr "tablespace para %s" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1261 +#: catalog/pg_shdepend.c:1271 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" msgstr[0] "%d objeto en %s" msgstr[1] "%d objetos en %s" -#: catalog/pg_shdepend.c:1372 +#: catalog/pg_shdepend.c:1382 #, c-format msgid "cannot drop objects owned by %s because they are required by the database system" msgstr "no se puede eliminar objetos de propiedad de %s porque son requeridos por el sistema" -#: catalog/pg_shdepend.c:1519 +#: catalog/pg_shdepend.c:1529 #, c-format msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" msgstr "no se puede reasignar la propiedad de objetos de %s porque son requeridos por el sistema" -#: catalog/pg_subscription.c:174 commands/subscriptioncmds.c:775 -#: commands/subscriptioncmds.c:1085 commands/subscriptioncmds.c:1427 +#: catalog/pg_subscription.c:174 commands/subscriptioncmds.c:779 +#: commands/subscriptioncmds.c:1088 commands/subscriptioncmds.c:1431 #, c-format msgid "subscription \"%s\" does not exist" msgstr "no existe la suscripción «%s»" #: catalog/pg_subscription.c:432 -#, fuzzy, c-format -#| msgid "could not find function information for function \"%s\"" +#, c-format msgid "could not drop relation mapping for subscription \"%s\"" -msgstr "no se pudo encontrar información de función para la función «%s»" +msgstr "no se pudo eliminar mapeo de relación para suscripción «%s»" #: catalog/pg_subscription.c:434 #, c-format msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." -msgstr "" +msgstr "La sincronización de tabla para la relación «%s» está en progreso y su estado es «%c»." #. translator: first %s is a SQL ALTER command and second %s is a #. SQL DROP command @@ -5714,62 +5634,61 @@ msgstr "" #: catalog/pg_subscription.c:441 #, c-format msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." -msgstr "" +msgstr "Utilice %s para activar la suscripción si aún no está activada, o utilice %s para eliminar la suscripción." -#: catalog/pg_type.c:136 catalog/pg_type.c:475 +#: catalog/pg_type.c:136 catalog/pg_type.c:476 #, c-format msgid "pg_type OID value not set when in binary upgrade mode" msgstr "el valor de OID de pg_type no se definió en modo de actualización binaria" -#: catalog/pg_type.c:255 +#: catalog/pg_type.c:256 #, c-format msgid "invalid type internal size %d" msgstr "el tamaño interno de tipo %d no es válido" -#: catalog/pg_type.c:271 catalog/pg_type.c:279 catalog/pg_type.c:287 -#: catalog/pg_type.c:296 +#: catalog/pg_type.c:272 catalog/pg_type.c:280 catalog/pg_type.c:288 +#: catalog/pg_type.c:297 #, c-format msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" msgstr "el alineamiento «%c» no es válido para un tipo pasado por valor de tamaño %d" -#: catalog/pg_type.c:303 +#: catalog/pg_type.c:304 #, c-format msgid "internal size %d is invalid for passed-by-value type" msgstr "el tamaño interno %d no es válido para un tipo pasado por valor" -#: catalog/pg_type.c:313 catalog/pg_type.c:319 +#: catalog/pg_type.c:314 catalog/pg_type.c:320 #, c-format msgid "alignment \"%c\" is invalid for variable-length type" msgstr "el alineamiento «%c» no es válido para un tipo de largo variable" -#: catalog/pg_type.c:327 commands/typecmds.c:4164 +#: catalog/pg_type.c:328 commands/typecmds.c:4164 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "los tipos de tamaño fijo deben tener almacenamiento PLAIN" -#: catalog/pg_type.c:816 +#: catalog/pg_type.c:824 #, c-format msgid "could not form array type name for type \"%s\"" msgstr "no se pudo formar un nombre de tipo de array para el tipo «%s»" -#: catalog/pg_type.c:921 -#, fuzzy, c-format -#| msgid "Failed while creating memory context \"%s\"." +#: catalog/pg_type.c:929 +#, c-format msgid "Failed while creating a multirange type for type \"%s\"." -msgstr "Falla al crear el contexto de memoria «%s»." +msgstr "Falla al crear un tipo de multirango para el tipo «%s»." -#: catalog/pg_type.c:922 +#: catalog/pg_type.c:930 #, c-format -msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute" -msgstr "" +msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." +msgstr "Puede especificar manualmente un nombre para el tipo de multirango usando el atributo «multirange_type_name»." -#: catalog/storage.c:450 storage/buffer/bufmgr.c:1026 +#: catalog/storage.c:450 storage/buffer/bufmgr.c:1035 #, c-format msgid "invalid page in block %u of relation %s" msgstr "la página no es válida en el bloque %u de la relación %s" -#: catalog/toasting.c:104 commands/indexcmds.c:667 commands/tablecmds.c:6028 -#: commands/tablecmds.c:16336 +#: catalog/toasting.c:110 commands/indexcmds.c:667 commands/tablecmds.c:6047 +#: commands/tablecmds.c:16380 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "«%s» no es una tabla o vista materializada" @@ -5854,7 +5773,7 @@ msgstr "las funciones de serialización pueden especificarse sólo cuando el tip msgid "must specify both or neither of serialization and deserialization functions" msgstr "debe especificar ambas o ninguna de las funciones de serialización y deserialización" -#: commands/aggregatecmds.c:437 commands/functioncmds.c:649 +#: commands/aggregatecmds.c:437 commands/functioncmds.c:650 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "el parámetro «parallel» debe ser SAFE, RESTRICTED o UNSAFE" @@ -5884,12 +5803,12 @@ msgstr "el servidor «%s» ya existe" msgid "language \"%s\" already exists" msgstr "ya existe el lenguaje «%s»" -#: commands/alter.c:96 commands/publicationcmds.c:183 +#: commands/alter.c:96 commands/publicationcmds.c:180 #, c-format msgid "publication \"%s\" already exists" msgstr "la publicación «%s» ya existe" -#: commands/alter.c:99 commands/subscriptioncmds.c:398 +#: commands/alter.c:99 commands/subscriptioncmds.c:400 #, c-format msgid "subscription \"%s\" already exists" msgstr "la suscripción «%s» ya existe" @@ -5961,7 +5880,7 @@ msgid "handler function is not specified" msgstr "no se ha especificado una función manejadora" #: commands/amcmds.c:264 commands/event_trigger.c:183 -#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:681 +#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:699 #: parser/parse_clause.c:940 #, c-format msgid "function %s must return type %s" @@ -5992,78 +5911,70 @@ msgstr "analizando «%s.%s»" msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "la columna «%s» aparece más de una vez en la relación «%s»" -#: commands/analyze.c:790 -#, fuzzy, c-format -#| msgid "automatic analyze of table \"%s.%s.%s\"" +#: commands/analyze.c:805 +#, c-format msgid "automatic analyze of table \"%s.%s.%s\"\n" -msgstr "análisis automático de la tabla «%s.%s.%s»" - -#: commands/analyze.c:811 -#, fuzzy, c-format -#| msgid "system usage: %s\n" -msgid "system usage: %s" -msgstr "uso de sistema: %s\n" +msgstr "análisis automático de la tabla «%s.%s.%s»\n" -#: commands/analyze.c:1350 +#: commands/analyze.c:1351 #, c-format msgid "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead rows; %d rows in sample, %.0f estimated total rows" msgstr "«%s»: se procesaron %d de %u páginas, que contenían %.0f filas vigentes y %.0f filas no vigentes; %d filas en la muestra, %.0f total de filas estimadas" -#: commands/analyze.c:1430 +#: commands/analyze.c:1431 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" msgstr "omitiendo el análisis del árbol de herencia «%s.%s» --- este árbol no contiene tablas hijas" -#: commands/analyze.c:1528 +#: commands/analyze.c:1529 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no analyzable child tables" msgstr "omitiendo el análisis del árbol de herencia «%s.%s» --- este árbol no contiene tablas hijas analizables" -#: commands/async.c:639 +#: commands/async.c:646 #, c-format msgid "channel name cannot be empty" msgstr "el nombre de canal no puede ser vacío" -#: commands/async.c:645 +#: commands/async.c:652 #, c-format msgid "channel name too long" msgstr "el nombre de canal es demasiado largo" -#: commands/async.c:650 +#: commands/async.c:657 #, c-format msgid "payload string too long" msgstr "la cadena de carga es demasiado larga" -#: commands/async.c:869 +#: commands/async.c:876 #, c-format msgid "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" msgstr "no se puede hacer PREPARE de una transacción que ha ejecutado LISTEN, UNLISTEN o NOTIFY" -#: commands/async.c:975 +#: commands/async.c:980 #, c-format msgid "too many notifications in the NOTIFY queue" msgstr "demasiadas notificaciones en la cola NOTIFY" -#: commands/async.c:1646 +#: commands/async.c:1616 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "la cola NOTIFY está %.0f%% llena" -#: commands/async.c:1648 +#: commands/async.c:1618 #, c-format msgid "The server process with PID %d is among those with the oldest transactions." msgstr "El proceso servidor con PID %d está entre aquellos con transacciones más antiguas." -#: commands/async.c:1651 +#: commands/async.c:1621 #, c-format msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." msgstr "La cola NOTIFY no puede vaciarse hasta que ese proceso cierre su transacción actual." #: commands/cluster.c:119 -#, fuzzy, c-format -#| msgid "unrecognized VACUUM option \"%s\"" +#, c-format msgid "unrecognized CLUSTER option \"%s\"" -msgstr "opción de VACUUM «%s» no reconocida" +msgstr "opción de CLUSTER «%s» no reconocida" #: commands/cluster.c:147 commands/cluster.c:386 #, c-format @@ -6080,7 +5991,7 @@ msgstr "no se puede hacer «cluster» a una tabla particionada" msgid "there is no previously clustered index for table \"%s\"" msgstr "no hay un índice de ordenamiento definido para la tabla «%s»" -#: commands/cluster.c:187 commands/tablecmds.c:13496 commands/tablecmds.c:15364 +#: commands/cluster.c:187 commands/tablecmds.c:13536 commands/tablecmds.c:15408 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "no existe el índice «%s» en la tabla «%s»" @@ -6095,7 +6006,7 @@ msgstr "no se puede reordenar un catálogo compartido" msgid "cannot vacuum temporary tables of other sessions" msgstr "no se puede hacer vacuum a tablas temporales de otras sesiones" -#: commands/cluster.c:456 commands/tablecmds.c:15374 +#: commands/cluster.c:456 commands/tablecmds.c:15418 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "«%s» no es un índice de la tabla «%s»" @@ -6174,43 +6085,48 @@ msgstr "debe especificarse el parámetro «lc_ctype»" msgid "nondeterministic collations not supported with this provider" msgstr "los ordenamientos no determinísticos no están soportados con este proveedor" -#: commands/collationcmds.c:266 +#: commands/collationcmds.c:227 +#, c-format +msgid "current database's encoding is not supported with this provider" +msgstr "la codificación de la base de datos actual no está soportada con este proveedor" + +#: commands/collationcmds.c:285 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "ya existe un ordenamiento (collation) llamado «%s» para la codificación «%s» en el esquema «%s»" -#: commands/collationcmds.c:277 +#: commands/collationcmds.c:296 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "ya existe un ordenamiento llamado «%s» en el esquema «%s»" -#: commands/collationcmds.c:325 +#: commands/collationcmds.c:344 #, c-format msgid "changing version from %s to %s" msgstr "cambiando versión de %s a %s" -#: commands/collationcmds.c:340 +#: commands/collationcmds.c:359 #, c-format msgid "version has not changed" msgstr "la versión no ha cambiado" -#: commands/collationcmds.c:454 +#: commands/collationcmds.c:473 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "no se pudo convertir el nombre de configuración regional «%s» a etiqueta de lenguaje: %s" -#: commands/collationcmds.c:512 +#: commands/collationcmds.c:531 #, c-format msgid "must be superuser to import system collations" msgstr "debe ser superusuario para importar ordenamientos del sistema" -#: commands/collationcmds.c:540 commands/copyfrom.c:1500 commands/copyto.c:688 +#: commands/collationcmds.c:559 commands/copyfrom.c:1500 commands/copyto.c:682 #: libpq/be-secure-common.c:81 #, c-format msgid "could not execute command \"%s\": %m" msgstr "no se pudo ejecutar la orden «%s»: %m" -#: commands/collationcmds.c:671 +#: commands/collationcmds.c:690 #, c-format msgid "no usable system locales were found" msgstr "no se encontraron locales de sistema utilizables" @@ -6224,7 +6140,7 @@ msgstr "no se encontraron locales de sistema utilizables" msgid "database \"%s\" does not exist" msgstr "no existe la base de datos «%s»" -#: commands/comment.c:101 commands/seclabel.c:191 parser/parse_utilcmd.c:989 +#: commands/comment.c:101 commands/seclabel.c:191 parser/parse_utilcmd.c:979 #, c-format msgid "\"%s\" is not a table, view, materialized view, composite type, or foreign table" msgstr "«%s» no es una tabla, vista, vista materializada, tipo compuesto, o tabla foránea" @@ -6265,10 +6181,9 @@ msgid "encoding conversion function %s must return type %s" msgstr "la función de conversión de codificación %s debe retornar tipo %s" #: commands/conversioncmds.c:130 -#, fuzzy, c-format -#| msgid "encoding conversion function %s must return type %s" +#, c-format msgid "encoding conversion function %s returned incorrect result for empty input" -msgstr "la función de conversión de codificación %s debe retornar tipo %s" +msgstr "la función de conversión de codificación %s retornó un resultado incorrecto para una entrada vacía" #: commands/copy.c:86 #, c-format @@ -6431,16 +6346,16 @@ msgstr "la columna «%s» es una columna generada" msgid "Generated columns cannot be used in COPY." msgstr "Las columnas generadas no pueden usarse en COPY." -#: commands/copy.c:746 commands/indexcmds.c:1754 commands/statscmds.c:238 -#: commands/tablecmds.c:2366 commands/tablecmds.c:3022 -#: commands/tablecmds.c:3515 parser/parse_relation.c:3593 +#: commands/copy.c:746 commands/indexcmds.c:1754 commands/statscmds.c:241 +#: commands/tablecmds.c:2321 commands/tablecmds.c:2977 +#: commands/tablecmds.c:3470 parser/parse_relation.c:3593 #: parser/parse_relation.c:3613 utils/adt/tsvector_op.c:2680 #, c-format msgid "column \"%s\" does not exist" msgstr "no existe la columna «%s»" -#: commands/copy.c:753 commands/tablecmds.c:2392 commands/trigger.c:933 -#: parser/parse_target.c:1080 parser/parse_target.c:1091 +#: commands/copy.c:753 commands/tablecmds.c:2347 commands/trigger.c:951 +#: parser/parse_target.c:1079 parser/parse_target.c:1090 #, c-format msgid "column \"%s\" specified more than once" msgstr "la columna «%s» fue especificada más de una vez" @@ -6510,12 +6425,12 @@ msgstr "no se puede ejecutar COPY FREEZE debido a actividad anterior en la trans msgid "cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction" msgstr "no se puede ejecutar COPY FREEZE porque la tabla no fue creada ni truncada en la subtransacción en curso" -#: commands/copyfrom.c:1264 commands/copyto.c:618 +#: commands/copyfrom.c:1264 commands/copyto.c:612 #, c-format msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" msgstr "la columna FORCE_NOT_NULL «%s» no es referenciada en COPY" -#: commands/copyfrom.c:1287 commands/copyto.c:641 +#: commands/copyfrom.c:1287 commands/copyto.c:635 #, c-format msgid "FORCE_NULL column \"%s\" not referenced by COPY" msgstr "la columna FORCE_NULL «%s» no es referenciada en COPY" @@ -6525,7 +6440,7 @@ msgstr "la columna FORCE_NULL «%s» no es referenciada en COPY" msgid "COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \\copy." msgstr "COPY FROM indica al proceso servidor de PostgreSQL leer un archivo. Puede desear usar una facilidad del lado del cliente como \\copy de psql." -#: commands/copyfrom.c:1532 commands/copyto.c:740 +#: commands/copyfrom.c:1532 commands/copyto.c:734 #, c-format msgid "\"%s\" is a directory" msgstr "«%s» es un directorio" @@ -6728,67 +6643,67 @@ msgstr "no se puede hacer copy de la tabla particionada «%s»" msgid "cannot copy from non-table relation \"%s\"" msgstr "no se puede copiar desde la relación «%s» porque no es una tabla" -#: commands/copyto.c:457 +#: commands/copyto.c:451 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for COPY" msgstr "las reglas DO INSTEAD NOTHING no están soportadas para COPY" -#: commands/copyto.c:471 +#: commands/copyto.c:465 #, c-format msgid "conditional DO INSTEAD rules are not supported for COPY" msgstr "las reglas DO INSTEAD condicionales no están soportadas para COPY" -#: commands/copyto.c:475 +#: commands/copyto.c:469 #, c-format msgid "DO ALSO rules are not supported for the COPY" msgstr "las reglas DO ALSO no están soportadas para COPY" -#: commands/copyto.c:480 +#: commands/copyto.c:474 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for COPY" msgstr "las reglas DO INSTEAD de múltiples sentencias no están soportadas para COPY" -#: commands/copyto.c:490 +#: commands/copyto.c:484 #, c-format msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO) no está soportado" -#: commands/copyto.c:507 +#: commands/copyto.c:501 #, c-format msgid "COPY query must have a RETURNING clause" msgstr "la consulta COPY debe tener una cláusula RETURNING" -#: commands/copyto.c:536 +#: commands/copyto.c:530 #, c-format msgid "relation referenced by COPY statement has changed" msgstr "la relación referenciada por la sentencia COPY ha cambiado" -#: commands/copyto.c:595 +#: commands/copyto.c:589 #, c-format msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" msgstr "la columna FORCE_QUOTE «%s» no es referenciada en COPY" -#: commands/copyto.c:705 +#: commands/copyto.c:699 #, c-format msgid "relative path not allowed for COPY to file" msgstr "no se permiten rutas relativas para COPY hacia un archivo" -#: commands/copyto.c:724 +#: commands/copyto.c:718 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "no se pudo abrir el archivo «%s» para escritura: %m" -#: commands/copyto.c:727 +#: commands/copyto.c:721 #, c-format msgid "COPY TO instructs the PostgreSQL server process to write a file. You may want a client-side facility such as psql's \\copy." msgstr "COPY TO indica al proceso servidor PostgreSQL escribir a un archivo. Puede desear usar facilidades del lado del cliente, como \\copy de psql." -#: commands/createas.c:215 commands/createas.c:517 +#: commands/createas.c:215 commands/createas.c:511 #, c-format msgid "too many column names were specified" msgstr "se especificaron demasiados nombres de columna" -#: commands/createas.c:540 +#: commands/createas.c:534 #, c-format msgid "policies not yet implemented for this command" msgstr "las políticas no están implementadas para esta orden" @@ -6991,7 +6906,6 @@ msgstr "Debe moverlas de vuelta al tablespace por omisión de la base de datos a #: commands/dbcommands.c:1404 commands/dbcommands.c:1980 #: commands/dbcommands.c:2203 commands/dbcommands.c:2261 -#: commands/tablespace.c:631 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "algunos archivos inútiles pueden haber quedado en el directorio \"%s\"" @@ -7028,7 +6942,7 @@ msgid_plural "There are %d other sessions using the database." msgstr[0] "Hay %d otra sesión usando la base de datos." msgstr[1] "Hay otras %d sesiones usando la base de datos." -#: commands/dbcommands.c:2094 storage/ipc/procarray.c:3726 +#: commands/dbcommands.c:2094 storage/ipc/procarray.c:3804 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." @@ -7072,8 +6986,8 @@ msgstr "el argumento de %s debe ser un nombre de tipo" msgid "invalid argument for %s: \"%s\"" msgstr "argumento no válido para %s: «%s»" -#: commands/dropcmds.c:100 commands/functioncmds.c:1410 -#: utils/adt/ruleutils.c:2806 +#: commands/dropcmds.c:100 commands/functioncmds.c:1411 +#: utils/adt/ruleutils.c:2810 #, c-format msgid "\"%s\" is an aggregate function" msgstr "«%s» es una función de agregación" @@ -7083,14 +6997,14 @@ msgstr "«%s» es una función de agregación" msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "Use DROP AGGREGATE para eliminar funciones de agregación." -#: commands/dropcmds.c:158 commands/sequence.c:447 commands/tablecmds.c:3599 -#: commands/tablecmds.c:3757 commands/tablecmds.c:3802 -#: commands/tablecmds.c:15797 tcop/utility.c:1291 +#: commands/dropcmds.c:158 commands/sequence.c:447 commands/tablecmds.c:3554 +#: commands/tablecmds.c:3712 commands/tablecmds.c:3765 +#: commands/tablecmds.c:15841 tcop/utility.c:1324 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "no existe la relación «%s», omitiendo" -#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1248 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1247 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "el esquema «%s» no existe, omitiendo" @@ -7115,7 +7029,7 @@ msgstr "no existe el ordenamiento (collation) «%s», omitiendo" msgid "conversion \"%s\" does not exist, skipping" msgstr "no existe la conversión «%s», omitiendo" -#: commands/dropcmds.c:293 commands/statscmds.c:630 +#: commands/dropcmds.c:293 commands/statscmds.c:670 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "no existe el objeto de estadísticas «%s», omitiendo" @@ -7317,7 +7231,7 @@ msgstr "la opción WAL de EXPLAIN requiere ANALYZE" msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "la opción TIMING de EXPLAIN requiere ANALYZE" -#: commands/extension.c:173 commands/extension.c:3013 +#: commands/extension.c:173 commands/extension.c:3014 #, c-format msgid "extension \"%s\" does not exist" msgstr "no existe la extensión «%s»" @@ -7385,7 +7299,7 @@ msgid "parameter \"%s\" cannot be set in a secondary extension control file" msgstr "el parámetro «%s» no se puede cambiar en un archivo control secundario de extensión" #: commands/extension.c:552 commands/extension.c:560 commands/extension.c:568 -#: utils/misc/guc.c:7092 +#: utils/misc/guc.c:7093 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "el parámetro «%s» requiere un valor lógico (booleano)" @@ -7415,153 +7329,152 @@ msgstr "el parámetro «schema» no puede ser especificado cuando «relocatable msgid "transaction control statements are not allowed within an extension script" msgstr "las sentencias de control de transacción no están permitidos dentro de un guión de transacción" -#: commands/extension.c:861 +#: commands/extension.c:862 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "se ha denegado el permiso para crear la extensión «%s»" -#: commands/extension.c:864 +#: commands/extension.c:865 #, c-format msgid "Must have CREATE privilege on current database to create this extension." msgstr "Debe tener privilegio CREATE en la base de datos actual para crear esta extensión." -#: commands/extension.c:865 +#: commands/extension.c:866 #, c-format msgid "Must be superuser to create this extension." msgstr "Debe ser superusuario para crear esta extensión." -#: commands/extension.c:869 +#: commands/extension.c:870 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "se ha denegado el permiso para actualizar la extensión «%s»" -#: commands/extension.c:872 +#: commands/extension.c:873 #, c-format msgid "Must have CREATE privilege on current database to update this extension." msgstr "Debe tener privilegio CREATE en la base de datos actual para actualizar esta extensión." -#: commands/extension.c:873 +#: commands/extension.c:874 #, c-format msgid "Must be superuser to update this extension." msgstr "Debe ser superusuario para actualizar esta extensión." -#: commands/extension.c:1200 +#: commands/extension.c:1201 #, c-format msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" msgstr "la extensión «%s» no tiene ruta de actualización desde la versión «%s» hasta la versión «%s»" -#: commands/extension.c:1408 commands/extension.c:3074 +#: commands/extension.c:1409 commands/extension.c:3075 #, c-format msgid "version to install must be specified" msgstr "la versión a instalar debe ser especificada" -#: commands/extension.c:1445 +#: commands/extension.c:1446 #, c-format msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" msgstr "la extensión «%s» no tiene script de instalación ni ruta de actualización para la versión «%s»" -#: commands/extension.c:1479 +#: commands/extension.c:1480 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "la extensión «%s» debe ser instalada en el esquema «%s»" -#: commands/extension.c:1639 +#: commands/extension.c:1640 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "detectada una dependencia cíclica entre las extensiones «%s» y «%s»" -#: commands/extension.c:1644 +#: commands/extension.c:1645 #, c-format msgid "installing required extension \"%s\"" msgstr "instalando la extensión requerida «%s»" -#: commands/extension.c:1667 +#: commands/extension.c:1668 #, c-format msgid "required extension \"%s\" is not installed" msgstr "la extensión requerida «%s» no está instalada" -#: commands/extension.c:1670 +#: commands/extension.c:1671 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "Use CREATE EXTENSION ... CASCADE para instalar además las extensiones requeridas." -#: commands/extension.c:1705 +#: commands/extension.c:1706 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "la extensión «%s» ya existe, omitiendo" -#: commands/extension.c:1712 +#: commands/extension.c:1713 #, c-format msgid "extension \"%s\" already exists" msgstr "la extensión «%s» ya existe" -#: commands/extension.c:1723 +#: commands/extension.c:1724 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "los CREATE EXTENSION anidados no están soportados" -#: commands/extension.c:1896 +#: commands/extension.c:1897 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "no se puede eliminar la extensión «%s» porque está siendo modificada" -#: commands/extension.c:2457 +#: commands/extension.c:2458 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "%s sólo puede invocarse desde un script SQL ejecutado por CREATE EXTENSION" -#: commands/extension.c:2469 +#: commands/extension.c:2470 #, c-format msgid "OID %u does not refer to a table" msgstr "el OID %u no hace referencia a una tabla" -#: commands/extension.c:2474 +#: commands/extension.c:2475 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "el tabla «%s» no es un miembro de la extensión que se está creando" -#: commands/extension.c:2828 +#: commands/extension.c:2829 #, c-format msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" msgstr "no se puede mover la extensión «%s» al esquema «%s» porque la extensión contiene al esquema" -#: commands/extension.c:2869 commands/extension.c:2932 +#: commands/extension.c:2870 commands/extension.c:2933 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "la extensión «%s» no soporta SET SCHEMA" -#: commands/extension.c:2934 +#: commands/extension.c:2935 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "%s no está en el esquema de la extensión, «%s»" -#: commands/extension.c:2993 +#: commands/extension.c:2994 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "los ALTER EXTENSION anidados no están soportados" -#: commands/extension.c:3085 +#: commands/extension.c:3086 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "la versión «%s» de la extensión «%s» ya está instalada" -#: commands/extension.c:3297 -#, fuzzy, c-format -#| msgid "cannot cast jsonb object to type %s" +#: commands/extension.c:3298 +#, c-format msgid "cannot add an object of this type to an extension" -msgstr "no se puede convertir un objeto jsonb a tipo %s" +msgstr "no se puede añadir un objeto de este tipo a una extensión" -#: commands/extension.c:3355 +#: commands/extension.c:3364 #, c-format msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "no se puede agregar el esquema «%s» a la extensión «%s» porque el esquema contiene la extensión" -#: commands/extension.c:3383 +#: commands/extension.c:3392 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s no es un miembro de la extensión «%s»" -#: commands/extension.c:3449 +#: commands/extension.c:3458 #, c-format msgid "file \"%s\" is too large" msgstr "el archivo «%s» es demasiado grande" @@ -7661,374 +7574,368 @@ msgstr "el conector de datos externos «%s» no tiene manejador" msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "el conector de datos externos «%s» no soporta IMPORT FOREIGN SCHEMA" -#: commands/foreigncmds.c:1607 +#: commands/foreigncmds.c:1606 #, c-format msgid "importing foreign table \"%s\"" msgstr "importando la tabla foránea «%s»" -#: commands/functioncmds.c:108 +#: commands/functioncmds.c:109 #, c-format msgid "SQL function cannot return shell type %s" msgstr "una función SQL no puede retornar el tipo inconcluso %s" -#: commands/functioncmds.c:113 +#: commands/functioncmds.c:114 #, c-format msgid "return type %s is only a shell" msgstr "el tipo de retorno %s está inconcluso" -#: commands/functioncmds.c:143 parser/parse_type.c:354 +#: commands/functioncmds.c:144 parser/parse_type.c:354 #, c-format msgid "type modifier cannot be specified for shell type \"%s\"" msgstr "no se puede especificar un modificador de tipo para el tipo inconcluso «%s»" -#: commands/functioncmds.c:149 +#: commands/functioncmds.c:150 #, c-format msgid "type \"%s\" is not yet defined" msgstr "el tipo «%s» no ha sido definido aún" -#: commands/functioncmds.c:150 +#: commands/functioncmds.c:151 #, c-format msgid "Creating a shell type definition." msgstr "Creando una definición de tipo inconclusa." -#: commands/functioncmds.c:249 +#: commands/functioncmds.c:250 #, c-format msgid "SQL function cannot accept shell type %s" msgstr "las funciones SQL no pueden aceptar el tipo inconcluso %s" -#: commands/functioncmds.c:255 +#: commands/functioncmds.c:256 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "las funciones de agregación no pueden aceptar el tipo inconcluso %s" -#: commands/functioncmds.c:260 +#: commands/functioncmds.c:261 #, c-format msgid "argument type %s is only a shell" msgstr "el tipo de argumento %s está inconcluso" -#: commands/functioncmds.c:270 +#: commands/functioncmds.c:271 #, c-format msgid "type %s does not exist" msgstr "no existe el tipo %s" -#: commands/functioncmds.c:284 +#: commands/functioncmds.c:285 #, c-format msgid "aggregates cannot accept set arguments" msgstr "las funciones de agregación no pueden aceptar argumentos de conjunto" -#: commands/functioncmds.c:288 +#: commands/functioncmds.c:289 #, c-format msgid "procedures cannot accept set arguments" msgstr "los procedimientos no pueden aceptar argumentos de conjunto" -#: commands/functioncmds.c:292 +#: commands/functioncmds.c:293 #, c-format msgid "functions cannot accept set arguments" msgstr "funciones no pueden aceptar argumentos de conjunto" -#: commands/functioncmds.c:302 -#, fuzzy, c-format -#| msgid "VARIADIC parameter must be the last input parameter" +#: commands/functioncmds.c:303 +#, c-format msgid "VARIADIC parameter must be the last input parameter" msgstr "el parámetro VARIADIC debe ser el último parámetro de entrada" -#: commands/functioncmds.c:322 -#, fuzzy, c-format -#| msgid "VARIADIC parameter must be the last input parameter" +#: commands/functioncmds.c:323 +#, c-format msgid "VARIADIC parameter must be the last parameter" -msgstr "el parámetro VARIADIC debe ser el último parámetro de entrada" +msgstr "el parámetro VARIADIC debe ser el último parámetro" -#: commands/functioncmds.c:347 +#: commands/functioncmds.c:348 #, c-format msgid "VARIADIC parameter must be an array" msgstr "el parámetro VARIADIC debe ser un array" -#: commands/functioncmds.c:392 +#: commands/functioncmds.c:393 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "nombre de parámetro «%s» usado más de una vez" -#: commands/functioncmds.c:410 +#: commands/functioncmds.c:411 #, c-format msgid "only input parameters can have default values" msgstr "solo los parámetros de entrada pueden tener valores por omisión" -#: commands/functioncmds.c:425 +#: commands/functioncmds.c:426 #, c-format msgid "cannot use table references in parameter default value" msgstr "no se pueden usar referencias a tablas en el valor por omisión de un parámetro" -#: commands/functioncmds.c:449 +#: commands/functioncmds.c:450 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "los parámetros de entrada después de uno que tenga valor por omisión también deben tener valores por omisión" -#: commands/functioncmds.c:459 -#, fuzzy, c-format -#| msgid "input parameters after one with a default value must also have defaults" +#: commands/functioncmds.c:460 +#, c-format msgid "procedure OUT parameters cannot appear after one with a default value" -msgstr "los parámetros de entrada después de uno que tenga valor por omisión también deben tener valores por omisión" +msgstr "los parámetros OUT no pueden aparecer después de uno que tenga valor por omisión" -#: commands/functioncmds.c:611 commands/functioncmds.c:802 +#: commands/functioncmds.c:612 commands/functioncmds.c:803 #, c-format msgid "invalid attribute in procedure definition" msgstr "atributo no válido en definición de procedimiento" -#: commands/functioncmds.c:707 +#: commands/functioncmds.c:708 #, c-format msgid "support function %s must return type %s" msgstr "la función de soporte %s debe retornar el tipo %s" -#: commands/functioncmds.c:718 +#: commands/functioncmds.c:719 #, c-format msgid "must be superuser to specify a support function" msgstr "debe ser superusuario para especificar una función de soporte" -#: commands/functioncmds.c:851 commands/functioncmds.c:1455 +#: commands/functioncmds.c:852 commands/functioncmds.c:1456 #, c-format msgid "COST must be positive" msgstr "COST debe ser positivo" -#: commands/functioncmds.c:859 commands/functioncmds.c:1463 +#: commands/functioncmds.c:860 commands/functioncmds.c:1464 #, c-format msgid "ROWS must be positive" msgstr "ROWS debe ser positivo" -#: commands/functioncmds.c:888 +#: commands/functioncmds.c:889 #, c-format msgid "no function body specified" msgstr "no se ha especificado un cuerpo para la función" -#: commands/functioncmds.c:893 -#, fuzzy, c-format -#| msgid "no function body specified" +#: commands/functioncmds.c:894 +#, c-format msgid "duplicate function body specified" -msgstr "no se ha especificado un cuerpo para la función" +msgstr "se ha especificado por duplicado el cuerpo para la función" -#: commands/functioncmds.c:898 +#: commands/functioncmds.c:899 #, c-format msgid "inline SQL function body only valid for language SQL" -msgstr "" +msgstr "cuerpo de función SQL en línea solo es válido para lenguaje SQL" -#: commands/functioncmds.c:940 -#, fuzzy, c-format -#| msgid "event trigger functions cannot have declared arguments" +#: commands/functioncmds.c:941 +#, c-format msgid "SQL function with unquoted function body cannot have polymorphic arguments" -msgstr "las funciones de disparador por eventos no pueden tener argumentos declarados" +msgstr "una función SQL con el cuerpo de la función fuera de comillas no puede tener argumentos polimórficos" -#: commands/functioncmds.c:966 commands/functioncmds.c:985 -#, fuzzy, c-format -#| msgid "%s is not allowed in a SQL function" +#: commands/functioncmds.c:967 commands/functioncmds.c:986 +#, c-format msgid "%s is not yet supported in unquoted SQL function body" -msgstr "%s no está permitido en una función SQL" +msgstr "%s aún no está soportado en una función SQL con el cuerpo fuera de comillas" -#: commands/functioncmds.c:1013 +#: commands/functioncmds.c:1014 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "sólo se requiere un item AS para el lenguaje «%s»" -#: commands/functioncmds.c:1118 +#: commands/functioncmds.c:1119 #, c-format msgid "no language specified" msgstr "no se ha especificado el lenguaje" -#: commands/functioncmds.c:1126 commands/functioncmds.c:2128 +#: commands/functioncmds.c:1127 commands/functioncmds.c:2129 #: commands/proclang.c:237 #, c-format msgid "language \"%s\" does not exist" msgstr "no existe el lenguaje «%s»" -#: commands/functioncmds.c:1128 commands/functioncmds.c:2130 +#: commands/functioncmds.c:1129 commands/functioncmds.c:2131 #, c-format msgid "Use CREATE EXTENSION to load the language into the database." msgstr "Use CREATE EXTENSION para cargar el lenguaje en la base de datos." -#: commands/functioncmds.c:1163 commands/functioncmds.c:1447 +#: commands/functioncmds.c:1164 commands/functioncmds.c:1448 #, c-format msgid "only superuser can define a leakproof function" msgstr "sólo un superusuario puede definir funciones «leakproof»" -#: commands/functioncmds.c:1214 +#: commands/functioncmds.c:1215 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "tipo de retorno de función debe ser %s debido a los parámetros OUT" -#: commands/functioncmds.c:1227 +#: commands/functioncmds.c:1228 #, c-format msgid "function result type must be specified" msgstr "el tipo de retorno de la función debe ser especificado" -#: commands/functioncmds.c:1281 commands/functioncmds.c:1467 +#: commands/functioncmds.c:1282 commands/functioncmds.c:1468 #, c-format msgid "ROWS is not applicable when function does not return a set" msgstr "ROWS no es aplicable cuando una función no retorna un conjunto" -#: commands/functioncmds.c:1567 +#: commands/functioncmds.c:1568 #, c-format msgid "source data type %s is a pseudo-type" msgstr "el tipo de origen %s es un pseudotipo" -#: commands/functioncmds.c:1573 +#: commands/functioncmds.c:1574 #, c-format msgid "target data type %s is a pseudo-type" msgstr "el tipo de retorno %s es un pseudotipo" -#: commands/functioncmds.c:1597 +#: commands/functioncmds.c:1598 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "el cast será ignorado porque el tipo de datos de origen es un dominio" -#: commands/functioncmds.c:1602 +#: commands/functioncmds.c:1603 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "el cast será ignorado porque el tipo de datos de destino es un dominio" -#: commands/functioncmds.c:1627 +#: commands/functioncmds.c:1628 #, c-format msgid "cast function must take one to three arguments" msgstr "la función de conversión lleva de uno a tres argumentos" -#: commands/functioncmds.c:1631 +#: commands/functioncmds.c:1632 #, c-format msgid "argument of cast function must match or be binary-coercible from source data type" msgstr "el argumento de la función de conversión debe coincidir o ser binario-convertible con el tipo de origen" -#: commands/functioncmds.c:1635 +#: commands/functioncmds.c:1636 #, c-format msgid "second argument of cast function must be type %s" msgstr "el segundo argumento de la función de conversión debe ser de tipo %s" -#: commands/functioncmds.c:1640 +#: commands/functioncmds.c:1641 #, c-format msgid "third argument of cast function must be type %s" msgstr "el tercer argumento de la función de conversión debe ser de tipo %s" -#: commands/functioncmds.c:1645 +#: commands/functioncmds.c:1646 #, c-format msgid "return data type of cast function must match or be binary-coercible to target data type" msgstr "el tipo de salida de la función de conversión debe coincidir o ser binario-convertible con el tipo de retorno" -#: commands/functioncmds.c:1656 +#: commands/functioncmds.c:1657 #, c-format msgid "cast function must not be volatile" msgstr "la función de conversión no debe ser volatile" -#: commands/functioncmds.c:1661 +#: commands/functioncmds.c:1662 #, c-format msgid "cast function must be a normal function" msgstr "la función de conversión debe ser una función normal" -#: commands/functioncmds.c:1665 +#: commands/functioncmds.c:1666 #, c-format msgid "cast function must not return a set" msgstr "la función de conversión no debe retornar un conjunto" -#: commands/functioncmds.c:1691 +#: commands/functioncmds.c:1692 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "debe ser superusuario para crear una conversión sin especificar función" -#: commands/functioncmds.c:1706 +#: commands/functioncmds.c:1707 #, c-format msgid "source and target data types are not physically compatible" msgstr "los tipos de datos de origen y destino no son físicamente compatibles" -#: commands/functioncmds.c:1721 +#: commands/functioncmds.c:1722 #, c-format msgid "composite data types are not binary-compatible" msgstr "los tipos de datos compuestos no son binario-compatibles" -#: commands/functioncmds.c:1727 +#: commands/functioncmds.c:1728 #, c-format msgid "enum data types are not binary-compatible" msgstr "los tipos de datos enum no son binario-compatibles" -#: commands/functioncmds.c:1733 +#: commands/functioncmds.c:1734 #, c-format msgid "array data types are not binary-compatible" msgstr "los tipos de datos de array no son binario-compatibles" -#: commands/functioncmds.c:1750 +#: commands/functioncmds.c:1751 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "los tipos de dato de dominio no deben ser marcados binario-compatibles" -#: commands/functioncmds.c:1760 +#: commands/functioncmds.c:1761 #, c-format msgid "source data type and target data type are the same" msgstr "el tipo de origen y el tipo de retorno son el mismo" -#: commands/functioncmds.c:1793 +#: commands/functioncmds.c:1794 #, c-format msgid "transform function must not be volatile" msgstr "la función de transformación no debe ser volatile" -#: commands/functioncmds.c:1797 +#: commands/functioncmds.c:1798 #, c-format msgid "transform function must be a normal function" msgstr "la función de transformación debe ser una función normal" -#: commands/functioncmds.c:1801 +#: commands/functioncmds.c:1802 #, c-format msgid "transform function must not return a set" msgstr "la función de transformación no debe retornar un conjunto" -#: commands/functioncmds.c:1805 +#: commands/functioncmds.c:1806 #, c-format msgid "transform function must take one argument" msgstr "la función de transformación debe recibir un argumento" -#: commands/functioncmds.c:1809 +#: commands/functioncmds.c:1810 #, c-format msgid "first argument of transform function must be type %s" msgstr "el primer argumento de la función de transformación debe ser de tipo %s" -#: commands/functioncmds.c:1848 +#: commands/functioncmds.c:1849 #, c-format msgid "data type %s is a pseudo-type" msgstr "el tipo de dato %s es un pseudo-tipo" -#: commands/functioncmds.c:1854 +#: commands/functioncmds.c:1855 #, c-format msgid "data type %s is a domain" msgstr "tipo de dato «%s» es un dominio" -#: commands/functioncmds.c:1894 +#: commands/functioncmds.c:1895 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "el tipo de dato de retorno de la función FROM SQL debe ser %s" -#: commands/functioncmds.c:1920 +#: commands/functioncmds.c:1921 #, c-format msgid "return data type of TO SQL function must be the transform data type" msgstr "el tipo de dato de retorno de la función TO SQL debe ser el tipo de dato de la transformación" -#: commands/functioncmds.c:1949 +#: commands/functioncmds.c:1950 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "la transformación para el tipo %s lenguaje «%s» ya existe" -#: commands/functioncmds.c:2036 +#: commands/functioncmds.c:2037 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "la transformación para el tipo %s lenguaje «%s» no existe" -#: commands/functioncmds.c:2060 +#: commands/functioncmds.c:2061 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "ya existe una función llamada %s en el esquema «%s»" -#: commands/functioncmds.c:2115 +#: commands/functioncmds.c:2116 #, c-format msgid "no inline code specified" msgstr "no se ha especificado código" -#: commands/functioncmds.c:2161 +#: commands/functioncmds.c:2162 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "el lenguaje «%s» no soporta ejecución de código en línea" -#: commands/functioncmds.c:2256 +#: commands/functioncmds.c:2257 #, c-format msgid "cannot pass more than %d argument to a procedure" msgid_plural "cannot pass more than %d arguments to a procedure" @@ -8065,12 +7972,12 @@ msgstr "no se pueden create restricciones de exclusión en la tabla particionada msgid "cannot create indexes on temporary tables of other sessions" msgstr "no se pueden crear índices en tablas temporales de otras sesiones" -#: commands/indexcmds.c:745 commands/tablecmds.c:748 commands/tablespace.c:1185 +#: commands/indexcmds.c:745 commands/tablecmds.c:747 commands/tablespace.c:1181 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "no se puede especificar el tablespace por omisión para las relaciones particionadas" -#: commands/indexcmds.c:777 commands/tablecmds.c:783 commands/tablecmds.c:3299 +#: commands/indexcmds.c:777 commands/tablecmds.c:782 commands/tablecmds.c:3254 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "sólo relaciones compartidas pueden ser puestas en el tablespace pg_global" @@ -8116,10 +8023,9 @@ msgid "%s constraints cannot be used when partition keys include expressions." msgstr "No se pueden usar restricciones %s cuando las llaves de particionamiento incluyen expresiones." #: commands/indexcmds.c:1020 -#, fuzzy, c-format -#| msgid "cannot remove constraint from only the partitioned table when partitions exist" +#, c-format msgid "unique constraint on partitioned table must include all partitioning columns" -msgstr "no se pueden eliminar restricciones sólo de la tabla particionada cuando existen particiones" +msgstr "las restricciones unique en tablas particionadas deben incluir todas las columnas de particionamiento" #: commands/indexcmds.c:1021 #, c-format @@ -8131,12 +8037,12 @@ msgstr "La restricción %s en la tabla «%s» no incluye la columna «%s» que e msgid "index creation on system columns is not supported" msgstr "la creación de índices en columnas de sistema no está soportada" -#: commands/indexcmds.c:1231 tcop/utility.c:1477 +#: commands/indexcmds.c:1231 tcop/utility.c:1510 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "no se puede crear un índice único en la tabla particionada «%s»" -#: commands/indexcmds.c:1233 tcop/utility.c:1479 +#: commands/indexcmds.c:1233 tcop/utility.c:1512 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "La tabla «%s» contiene particiones que son tablas foráneas." @@ -8146,13 +8052,13 @@ msgstr "La tabla «%s» contiene particiones que son tablas foráneas." msgid "functions in index predicate must be marked IMMUTABLE" msgstr "las funciones utilizadas en predicados de índice deben estar marcadas IMMUTABLE" -#: commands/indexcmds.c:1749 parser/parse_utilcmd.c:2525 -#: parser/parse_utilcmd.c:2660 +#: commands/indexcmds.c:1749 parser/parse_utilcmd.c:2515 +#: parser/parse_utilcmd.c:2650 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "no existe la columna «%s» en la llave" -#: commands/indexcmds.c:1773 parser/parse_utilcmd.c:1824 +#: commands/indexcmds.c:1773 parser/parse_utilcmd.c:1814 #, c-format msgid "expressions are not supported in included columns" msgstr "las expresiones no están soportadas en columnas incluidas" @@ -8187,8 +8093,8 @@ msgstr "la columna incluida no permite las opciones NULLS FIRST/LAST" msgid "could not determine which collation to use for index expression" msgstr "no se pudo determinar qué ordenamiento (collation) usar para la expresión de índice" -#: commands/indexcmds.c:1876 commands/tablecmds.c:16802 commands/typecmds.c:810 -#: parser/parse_expr.c:2680 parser/parse_type.c:566 parser/parse_utilcmd.c:3813 +#: commands/indexcmds.c:1876 commands/tablecmds.c:16846 commands/typecmds.c:810 +#: parser/parse_expr.c:2680 parser/parse_type.c:566 parser/parse_utilcmd.c:3781 #: utils/adt/misc.c:599 #, c-format msgid "collations are not supported by type %s" @@ -8224,8 +8130,8 @@ msgstr "el método de acceso «%s» no soporta las opciones ASC/DESC" msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "el método de acceso «%s» no soporta las opciones NULLS FIRST/LAST" -#: commands/indexcmds.c:2031 commands/tablecmds.c:16827 -#: commands/tablecmds.c:16833 commands/typecmds.c:2318 +#: commands/indexcmds.c:2031 commands/tablecmds.c:16871 +#: commands/tablecmds.c:16877 commands/typecmds.c:2317 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "el tipo de dato %s no tiene una clase de operadores por omisión para el método de acceso «%s»" @@ -8241,7 +8147,7 @@ msgstr "Debe especificar una clase de operadores para el índice, o definir una msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "no existe la clase de operadores «%s» para el método de acceso «%s»" -#: commands/indexcmds.c:2084 commands/typecmds.c:2306 +#: commands/indexcmds.c:2084 commands/typecmds.c:2305 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "la clase de operadores «%s» no acepta el tipo de datos %s" @@ -8252,10 +8158,9 @@ msgid "there are multiple default operator classes for data type %s" msgstr "hay múltiples clases de operadores por omisión para el tipo de datos %s" #: commands/indexcmds.c:2502 -#, fuzzy, c-format -#| msgid "unrecognized EXPLAIN option \"%s\"" +#, c-format msgid "unrecognized REINDEX option \"%s\"" -msgstr "opción de EXPLAIN «%s» no reconocida" +msgstr "opción de REINDEX «%s» no reconocida" #: commands/indexcmds.c:2726 #, c-format @@ -8284,22 +8189,19 @@ msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "no se puede reindexar un catálogo de sistema concurrentemente, omitiéndolos todos" #: commands/indexcmds.c:2924 -#, fuzzy, c-format -#| msgid "cannot move system relation \"%s\"" +#, c-format msgid "cannot move system relations, skipping all" -msgstr "no se puede mover la relación de sistema «%s»" +msgstr "no se puede mover las relaciones de sistema, omitiendo todas" #: commands/indexcmds.c:2971 -#, fuzzy, c-format -#| msgid "Unlogged partitioned table \"%s.%s\"" +#, c-format msgid "while reindexing partitioned table \"%s.%s\"" -msgstr "Tabla unlogged particionada «%s.%s»" +msgstr "al reindexar tabla particionada «%s.%s»" #: commands/indexcmds.c:2974 -#, fuzzy, c-format -#| msgid "Unlogged partitioned index \"%s.%s\"" +#, c-format msgid "while reindexing partitioned index \"%s.%s\"" -msgstr "Índice particionado unlogged «%s.%s»" +msgstr "al reindexar índice particionado «%s.%s»" #: commands/indexcmds.c:3167 commands/indexcmds.c:4003 #, c-format @@ -8322,17 +8224,16 @@ msgid "cannot reindex this type of relation concurrently" msgstr "no se puede reindexar este tipo de relación concurrentemente" #: commands/indexcmds.c:3501 -#, fuzzy, c-format -#| msgid "cannot move system relation \"%s\"" +#, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" -msgstr "no se puede mover la relación de sistema «%s»" +msgstr "no se puede mover relación no compartida al tablespace «%s»" #: commands/indexcmds.c:3984 commands/indexcmds.c:3996 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "el índice «%s.%s» fue reindexado" -#: commands/lockcmds.c:92 commands/tablecmds.c:6019 commands/trigger.c:289 +#: commands/lockcmds.c:92 commands/tablecmds.c:6038 commands/trigger.c:307 #: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:938 #, c-format msgid "\"%s\" is not a table or view" @@ -8343,27 +8244,27 @@ msgstr "«%s» no es una tabla o vista" msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "no se puede usar CONCURRENTLY cuando la vista materializada no contiene datos" -#: commands/matview.c:188 +#: commands/matview.c:188 gram.y:16812 #, c-format -msgid "CONCURRENTLY and WITH NO DATA options cannot be used together" -msgstr "las opciones CONCURRENTLY y WITH NO DATA no pueden usarse juntas" +msgid "%s and %s options cannot be used together" +msgstr "las opciones %s y %s no pueden usarse juntas" -#: commands/matview.c:244 +#: commands/matview.c:245 #, c-format msgid "cannot refresh materialized view \"%s\" concurrently" msgstr "no se puede refrescar la vista materializada «%s» concurrentemente" -#: commands/matview.c:247 +#: commands/matview.c:248 #, c-format msgid "Create a unique index with no WHERE clause on one or more columns of the materialized view." msgstr "Cree un índice único sin cláusula WHERE en una o más columnas de la vista materializada." -#: commands/matview.c:652 +#: commands/matview.c:660 #, c-format msgid "new data for materialized view \"%s\" contains duplicate rows without any null columns" msgstr "nuevos datos para la vista materializada «%s» contiene filas duplicadas sin columnas nulas" -#: commands/matview.c:654 +#: commands/matview.c:662 #, c-format msgid "Row: %s" msgstr "Fila: %s" @@ -8461,26 +8362,22 @@ msgid "index search operators must return boolean" msgstr "los operadores de búsqueda en índices deben retornar boolean" #: commands/opclasscmds.c:1215 -#, fuzzy, c-format -#| msgid "associated data types for opclass options parsing functions must match opclass input type" +#, c-format msgid "associated data types for operator class options parsing functions must match opclass input type" msgstr "los tipos de dato asociados a las funciones de interpretación de opciones de la clase de operadores deben coincidir exactamente con el tipo de entrada de la clase de operadores" #: commands/opclasscmds.c:1222 -#, fuzzy, c-format -#| msgid "left and right associated data types for opclass options parsing functions must match" +#, c-format msgid "left and right associated data types for operator class options parsing functions must match" msgstr "los tipos de dato izquierdo y derecho asociados a las funciones de interpretación de opciones de la clase de operadores deben coincidir" #: commands/opclasscmds.c:1230 -#, fuzzy, c-format -#| msgid "invalid opclass options parsing function" +#, c-format msgid "invalid operator class options parsing function" msgstr "función de interpretación de opciones de la clase de operadores no válida" #: commands/opclasscmds.c:1231 -#, fuzzy, c-format -#| msgid "Valid signature of opclass options parsing function is '%s'." +#, c-format msgid "Valid signature of operator class options parsing function is %s." msgstr "La signatura válida para la función de interpretación de opciones de una clase de operadores es '%s'." @@ -8610,22 +8507,19 @@ msgid "operator function must be specified" msgstr "la función del operador debe especificarse" #: commands/operatorcmds.c:181 -#, fuzzy, c-format -#| msgid "one or two argument types must be specified" +#, c-format msgid "operator argument types must be specified" -msgstr "uno o dos tipos de argumento debe/n ser especificado" +msgstr "los tipos de los argumentos del operador deben ser especificados" #: commands/operatorcmds.c:185 -#, fuzzy, c-format -#| msgid "one or two argument types must be specified" +#, c-format msgid "operator right argument type must be specified" -msgstr "uno o dos tipos de argumento debe/n ser especificado" +msgstr "el tipo del argumento derecho del operador debe ser especificado" #: commands/operatorcmds.c:186 -#, fuzzy, c-format -#| msgid "log format \"%s\" is not supported" +#, c-format msgid "Postfix operators are not supported." -msgstr "el formato de log «%s» no está soportado" +msgstr "los operadores Postfix no están soportado" #: commands/operatorcmds.c:290 #, c-format @@ -8647,69 +8541,63 @@ msgstr "la función de estimación de join %s debe retornar tipo %s" msgid "operator attribute \"%s\" cannot be changed" msgstr "el atributo de operador «%s» no puede ser cambiado" -#: commands/policy.c:88 commands/policy.c:381 commands/policy.c:471 -#: commands/statscmds.c:150 commands/tablecmds.c:1561 commands/tablecmds.c:2150 -#: commands/tablecmds.c:3409 commands/tablecmds.c:5998 -#: commands/tablecmds.c:8860 commands/tablecmds.c:16392 -#: commands/tablecmds.c:16427 commands/trigger.c:295 commands/trigger.c:1271 -#: commands/trigger.c:1380 rewrite/rewriteDefine.c:277 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:151 +#: commands/tablecmds.c:1560 commands/tablecmds.c:2139 +#: commands/tablecmds.c:3364 commands/tablecmds.c:6017 +#: commands/tablecmds.c:8901 commands/tablecmds.c:16436 +#: commands/tablecmds.c:16471 commands/trigger.c:313 commands/trigger.c:1289 +#: commands/trigger.c:1398 rewrite/rewriteDefine.c:277 #: rewrite/rewriteDefine.c:943 rewrite/rewriteRemove.c:80 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "permiso denegado: «%s» es un catálogo de sistema" -#: commands/policy.c:171 +#: commands/policy.c:172 #, c-format msgid "ignoring specified roles other than PUBLIC" msgstr "ignorando los roles especificados que no son PUBLIC" -#: commands/policy.c:172 +#: commands/policy.c:173 #, c-format msgid "All roles are members of the PUBLIC role." msgstr "Todos los roles son miembros del rol PUBLIC." -#: commands/policy.c:495 -#, c-format -msgid "role \"%s\" could not be removed from policy \"%s\" on \"%s\"" -msgstr "el rol «%s» no pudo ser eliminado de la política «%s» en «%s»" - -#: commands/policy.c:704 +#: commands/policy.c:607 #, c-format msgid "WITH CHECK cannot be applied to SELECT or DELETE" msgstr "WITH CHECK no puede ser aplicado a SELECT o DELETE" -#: commands/policy.c:713 commands/policy.c:1018 +#: commands/policy.c:616 commands/policy.c:921 #, c-format msgid "only WITH CHECK expression allowed for INSERT" msgstr "sólo se permite una expresión WITH CHECK para INSERT" -#: commands/policy.c:788 commands/policy.c:1241 +#: commands/policy.c:691 commands/policy.c:1144 #, c-format msgid "policy \"%s\" for table \"%s\" already exists" msgstr "la política «%s» para la tabla «%s» ya existe" -#: commands/policy.c:990 commands/policy.c:1269 commands/policy.c:1340 +#: commands/policy.c:893 commands/policy.c:1172 commands/policy.c:1243 #, c-format msgid "policy \"%s\" for table \"%s\" does not exist" msgstr "no existe la política «%s» para la tabla «%s»" -#: commands/policy.c:1008 +#: commands/policy.c:911 #, c-format msgid "only USING expression allowed for SELECT, DELETE" msgstr "sólo se permite una expresión USING para SELECT, DELETE" -#: commands/portalcmds.c:60 commands/portalcmds.c:187 commands/portalcmds.c:238 +#: commands/portalcmds.c:60 commands/portalcmds.c:181 commands/portalcmds.c:232 #, c-format msgid "invalid cursor name: must not be empty" msgstr "el nombre de cursor no es válido: no debe ser vacío" #: commands/portalcmds.c:72 -#, fuzzy, c-format -#| msgid "cannot create temporary table within security-restricted operation" +#, c-format msgid "cannot create a cursor WITH HOLD within security-restricted operation" -msgstr "no se puede crear una tabla temporal dentro una operación restringida por seguridad" +msgstr "no se puede crear un cursor WITH HOLD dentro de una operación restringida por seguridad" -#: commands/portalcmds.c:195 commands/portalcmds.c:248 +#: commands/portalcmds.c:189 commands/portalcmds.c:242 #: executor/execCurrent.c:70 utils/adt/xml.c:2594 utils/adt/xml.c:2764 #, c-format msgid "cursor \"%s\" does not exist" @@ -8720,42 +8608,42 @@ msgstr "no existe el cursor «%s»" msgid "invalid statement name: must not be empty" msgstr "el nombre de sentencia no es válido: no debe ser vacío" -#: commands/prepare.c:134 parser/parse_param.c:313 tcop/postgres.c:1473 +#: commands/prepare.c:131 parser/parse_param.c:313 tcop/postgres.c:1473 #, c-format msgid "could not determine data type of parameter $%d" msgstr "no se pudo determinar el tipo del parámetro $%d" -#: commands/prepare.c:152 +#: commands/prepare.c:149 #, c-format msgid "utility statements cannot be prepared" msgstr "sentencias de utilidad no pueden ser preparadas" -#: commands/prepare.c:256 commands/prepare.c:261 +#: commands/prepare.c:264 commands/prepare.c:269 #, c-format msgid "prepared statement is not a SELECT" msgstr "la sentencia preparada no es un SELECT" -#: commands/prepare.c:328 +#: commands/prepare.c:329 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "el número de parámetros es incorrecto en la sentencia preparada «%s»" -#: commands/prepare.c:330 +#: commands/prepare.c:331 #, c-format msgid "Expected %d parameters but got %d." msgstr "Se esperaban %d parámetros pero se obtuvieron %d." -#: commands/prepare.c:363 +#: commands/prepare.c:364 #, c-format msgid "parameter $%d of type %s cannot be coerced to the expected type %s" msgstr "el parámetro $%d de tipo %s no puede ser convertido al tipo esperado %s" -#: commands/prepare.c:447 +#: commands/prepare.c:448 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "la sentencia preparada «%s» ya existe" -#: commands/prepare.c:486 +#: commands/prepare.c:487 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "no existe la sentencia preparada «%s»" @@ -8765,67 +8653,67 @@ msgstr "no existe la sentencia preparada «%s»" msgid "must be superuser to create custom procedural language" msgstr "debe ser superusuario para crear un lenguaje procedural personalizado" -#: commands/publicationcmds.c:107 +#: commands/publicationcmds.c:104 #, c-format msgid "invalid list syntax for \"publish\" option" msgstr "sintaxis de entrada no válida para la opción «publish»" -#: commands/publicationcmds.c:125 +#: commands/publicationcmds.c:122 #, c-format msgid "unrecognized \"publish\" value: \"%s\"" msgstr "valor de «publish» no reconocido: «%s»" -#: commands/publicationcmds.c:140 +#: commands/publicationcmds.c:137 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "parámetro de publicación no reconocido: «%s»" -#: commands/publicationcmds.c:172 +#: commands/publicationcmds.c:169 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "debe ser superusuario para crear publicaciones FOR ALL TABLES" -#: commands/publicationcmds.c:248 +#: commands/publicationcmds.c:250 #, c-format msgid "wal_level is insufficient to publish logical changes" msgstr "wal_level es insuficiente para publicar cambios lógicos" -#: commands/publicationcmds.c:249 +#: commands/publicationcmds.c:251 #, c-format msgid "Set wal_level to logical before creating subscriptions." msgstr "Cambie wal_level a logical antes de crear suscripciones." -#: commands/publicationcmds.c:369 +#: commands/publicationcmds.c:376 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "la publicación \"%s\" se define como FOR ALL TABLES" -#: commands/publicationcmds.c:371 +#: commands/publicationcmds.c:378 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "Las tablas no se pueden agregar ni eliminar de las publicaciones FOR ALL TABLES." -#: commands/publicationcmds.c:660 +#: commands/publicationcmds.c:707 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "relación «%s» no es parte de la publicación" -#: commands/publicationcmds.c:703 +#: commands/publicationcmds.c:750 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "se ha denegado el permiso para cambiar el dueño de la publicación «%s»" -#: commands/publicationcmds.c:705 +#: commands/publicationcmds.c:752 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "El dueño de una publicación FOR ALL TABLES debe ser un superusuario." -#: commands/schemacmds.c:105 commands/schemacmds.c:258 +#: commands/schemacmds.c:105 commands/schemacmds.c:259 #, c-format msgid "unacceptable schema name \"%s\"" msgstr "el nombre de schema «%s» es inaceptable" -#: commands/schemacmds.c:106 commands/schemacmds.c:259 +#: commands/schemacmds.c:106 commands/schemacmds.c:260 #, c-format msgid "The prefix \"pg_\" is reserved for system schemas." msgstr "El prefijo «pg_» está reservado para esquemas del sistema." @@ -8851,10 +8739,9 @@ msgid "security label provider \"%s\" is not loaded" msgstr "el proveedor de etiquetas de seguridad «%s» no está cargado" #: commands/seclabel.c:158 -#, fuzzy, c-format -#| msgid "tablespaces are not supported on this platform" +#, c-format msgid "security labels are not supported for this type of object" -msgstr "tablespaces no están soportados en esta plataforma" +msgstr "las etiquetas de seguirdad no están soportadas para este tipo de objeto" #: commands/sequence.c:140 #, c-format @@ -8976,225 +8863,218 @@ msgstr "la secuencia debe estar en el mismo esquema que la tabla a la que está msgid "cannot change ownership of identity sequence" msgstr "no se puede cambiar el dueño de la secuencia de identidad" -#: commands/sequence.c:1717 commands/tablecmds.c:13188 -#: commands/tablecmds.c:15817 +#: commands/sequence.c:1717 commands/tablecmds.c:13228 +#: commands/tablecmds.c:15861 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "La secuencia «%s» está enlazada a la tabla «%s»." -#: commands/statscmds.c:111 commands/statscmds.c:120 tcop/utility.c:1827 +#: commands/statscmds.c:112 commands/statscmds.c:121 tcop/utility.c:1860 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "sólo se permite una relación en CREATE STATISTICS" -#: commands/statscmds.c:138 +#: commands/statscmds.c:139 #, c-format msgid "relation \"%s\" is not a table, foreign table, or materialized view" msgstr "la relación «%s» no es una tabla, tabla foránea o vista materializada" -#: commands/statscmds.c:188 +#: commands/statscmds.c:189 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "el objeto de estadísticas «%s» ya existe, omitiendo" -#: commands/statscmds.c:196 +#: commands/statscmds.c:197 #, c-format msgid "statistics object \"%s\" already exists" msgstr "el objeto de estadísticas «%s» ya existe" -#: commands/statscmds.c:207 +#: commands/statscmds.c:208 #, c-format msgid "cannot have more than %d columns in statistics" msgstr "no se puede tener más de %d columnas en estadísticas" -#: commands/statscmds.c:246 +#: commands/statscmds.c:249 commands/statscmds.c:272 commands/statscmds.c:305 #, c-format msgid "statistics creation on system columns is not supported" msgstr "la creación de estadísticas en columnas de sistema no está soportada" -#: commands/statscmds.c:253 +#: commands/statscmds.c:256 commands/statscmds.c:279 #, c-format msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" msgstr "la columna «%s» no puede ser usado en estadísticas porque su tipo %s no tiene una clase de operadores por omisión para btree" -#: commands/statscmds.c:282 -#, fuzzy, c-format -#| msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" +#: commands/statscmds.c:322 +#, c-format msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" -msgstr "la columna «%s» no puede ser usado en estadísticas porque su tipo %s no tiene una clase de operadores por omisión para btree" +msgstr "la expresión no puede ser usada en estadísticas multivariantes porque su tipo %s no tiene una clase de operadores por omisión para btree" -#: commands/statscmds.c:303 +#: commands/statscmds.c:343 #, c-format msgid "when building statistics on a single expression, statistics kinds may not be specified" -msgstr "" +msgstr "al crear estadísticas sobre una sola expresión, no se deben especificar tipos de estadísticas" -#: commands/statscmds.c:332 +#: commands/statscmds.c:372 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "tipo de estadísticas «%s» no reconocido" -#: commands/statscmds.c:361 +#: commands/statscmds.c:401 #, c-format msgid "extended statistics require at least 2 columns" msgstr "las estadísticas extendidas requieren al menos 2 columnas" -#: commands/statscmds.c:379 +#: commands/statscmds.c:419 #, c-format msgid "duplicate column name in statistics definition" msgstr "nombre de columna duplicado en definición de estadísticas" -#: commands/statscmds.c:414 -#, fuzzy, c-format -#| msgid "duplicate column name in statistics definition" +#: commands/statscmds.c:454 +#, c-format msgid "duplicate expression in statistics definition" -msgstr "nombre de columna duplicado en definición de estadísticas" +msgstr "expresión duplicada en definición de estadísticas" -#: commands/statscmds.c:595 commands/tablecmds.c:7830 +#: commands/statscmds.c:635 commands/tablecmds.c:7871 #, c-format msgid "statistics target %d is too low" msgstr "el valor de estadísticas %d es demasiado bajo" -#: commands/statscmds.c:603 commands/tablecmds.c:7838 +#: commands/statscmds.c:643 commands/tablecmds.c:7879 #, c-format msgid "lowering statistics target to %d" msgstr "bajando el valor de estadísticas a %d" -#: commands/statscmds.c:626 +#: commands/statscmds.c:666 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "no existe el objeto de estadísticas «%s.%s», omitiendo" -#: commands/subscriptioncmds.c:221 +#: commands/subscriptioncmds.c:223 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "parámetro de suscripción no reconocido: «%s»" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:235 commands/subscriptioncmds.c:241 -#: commands/subscriptioncmds.c:247 commands/subscriptioncmds.c:266 -#: commands/subscriptioncmds.c:272 +#: commands/subscriptioncmds.c:237 commands/subscriptioncmds.c:243 +#: commands/subscriptioncmds.c:249 commands/subscriptioncmds.c:268 +#: commands/subscriptioncmds.c:274 #, c-format msgid "%s and %s are mutually exclusive options" msgstr "%s y %s son opciones mutuamente excluyentes" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:279 commands/subscriptioncmds.c:285 +#: commands/subscriptioncmds.c:281 commands/subscriptioncmds.c:287 #, c-format msgid "subscription with %s must also set %s" msgstr "suscripción con %s también debe activar %s" -#: commands/subscriptioncmds.c:378 +#: commands/subscriptioncmds.c:380 #, c-format msgid "must be superuser to create subscriptions" msgstr "debe ser superusuario para crear suscripciones" -#: commands/subscriptioncmds.c:471 commands/subscriptioncmds.c:568 -#: replication/logical/tablesync.c:970 replication/logical/worker.c:3154 +#: commands/subscriptioncmds.c:474 commands/subscriptioncmds.c:572 +#: replication/logical/tablesync.c:975 replication/logical/worker.c:3192 #, c-format msgid "could not connect to the publisher: %s" msgstr "no se pudo connectar con el editor (publisher): %s" -#: commands/subscriptioncmds.c:513 +#: commands/subscriptioncmds.c:516 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "se creó el slot de replicación «%s» en el editor (publisher)" #. translator: %s is an SQL ALTER statement -#: commands/subscriptioncmds.c:526 +#: commands/subscriptioncmds.c:529 #, c-format msgid "tables were not subscribed, you will have to run %s to subscribe the tables" msgstr "las tablas no se suscribieron, tendrá que ejecutar %s para suscribir las tablas" -#: commands/subscriptioncmds.c:824 +#: commands/subscriptioncmds.c:828 #, c-format msgid "cannot set %s for enabled subscription" msgstr "no se puede establecer %s para la suscripción activada" -#: commands/subscriptioncmds.c:880 +#: commands/subscriptioncmds.c:884 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "no se puede habilitar la suscripción que no tiene un nombre de slot" -#: commands/subscriptioncmds.c:932 commands/subscriptioncmds.c:980 +#: commands/subscriptioncmds.c:936 commands/subscriptioncmds.c:983 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION con actualización no está permitido para las suscripciones desactivadas" -#: commands/subscriptioncmds.c:933 commands/subscriptioncmds.c:981 +#: commands/subscriptioncmds.c:937 commands/subscriptioncmds.c:984 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1001 +#: commands/subscriptioncmds.c:1004 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH no está permitido para las suscripciones desactivadas" -#: commands/subscriptioncmds.c:1089 +#: commands/subscriptioncmds.c:1092 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "no existe la suscripción «%s», omitiendo" -#: commands/subscriptioncmds.c:1341 +#: commands/subscriptioncmds.c:1344 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "eliminando el slot de replicación «%s» en editor (publisher)" -#: commands/subscriptioncmds.c:1350 commands/subscriptioncmds.c:1357 -#, fuzzy, c-format -#| msgid "could not drop the replication slot \"%s\" on publisher" +#: commands/subscriptioncmds.c:1353 commands/subscriptioncmds.c:1361 +#, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" -msgstr "no se pudo eliminar el slot de replicación «%s» en editor (publisher)" +msgstr "no se pudo eliminar el slot de replicación «%s» en editor (publisher): %s" -#: commands/subscriptioncmds.c:1391 +#: commands/subscriptioncmds.c:1395 #, c-format msgid "permission denied to change owner of subscription \"%s\"" msgstr "se ha denegado el permiso para cambiar el dueño de la suscripción «%s»" -#: commands/subscriptioncmds.c:1393 +#: commands/subscriptioncmds.c:1397 #, c-format msgid "The owner of a subscription must be a superuser." msgstr "El dueño de una suscripción debe ser un superusuario." -#: commands/subscriptioncmds.c:1508 +#: commands/subscriptioncmds.c:1513 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "no se pudo recibir la lista de tablas replicadas desde el editor (publisher): %s" -#: commands/subscriptioncmds.c:1572 -#, fuzzy, c-format -#| msgid "could not connect to publisher when attempting to drop the replication slot \"%s\"" +#: commands/subscriptioncmds.c:1578 +#, c-format msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" -msgstr "no se pudo conectar con el editor (publisher) al intentar eliminar el slot \"%s\"" +msgstr "no se pudo conectar con el editor (publisher) al intentar eliminar el slot de replicación \"%s\": %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1575 +#: commands/subscriptioncmds.c:1581 #, c-format msgid "Use %s to disassociate the subscription from the slot." msgstr "Use %s para disociar la suscripción del slot." -#: commands/subscriptioncmds.c:1605 +#: commands/subscriptioncmds.c:1611 #, c-format msgid "publication name \"%s\" used more than once" msgstr "nombre de publicación «%s» usado más de una vez" -#: commands/subscriptioncmds.c:1649 -#, fuzzy, c-format -#| msgid "publication \"%s\" already exists" +#: commands/subscriptioncmds.c:1655 +#, c-format msgid "publication \"%s\" is already in subscription \"%s\"" -msgstr "la publicación «%s» ya existe" +msgstr "la publicación «%s» ya existe en la suscripción «%s»" -#: commands/subscriptioncmds.c:1663 -#, fuzzy, c-format -#| msgid "publication of %s in publication %s" +#: commands/subscriptioncmds.c:1669 +#, c-format msgid "publication \"%s\" is not in subscription \"%s\"" -msgstr "publicación de %s en la publicación %s" +msgstr "la publicación «%s» no está en la suscripción «%s»" -#: commands/subscriptioncmds.c:1674 -#, fuzzy, c-format -#| msgid "relation \"%s\" is not part of the publication" -msgid "subscription must contain at least one publication" -msgstr "relación «%s» no es parte de la publicación" +#: commands/subscriptioncmds.c:1680 +#, c-format +msgid "cannot drop all the publications from a subscription" +msgstr "no se puede eliminar todas las publicaciones de una suscripción" #: commands/tablecmds.c:241 commands/tablecmds.c:283 #, c-format @@ -9252,8 +9132,8 @@ msgstr "la vista materializada «%s» no existe, omitiendo" msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "Use DROP MATERIALIZED VIEW para eliminar una vista materializada." -#: commands/tablecmds.c:265 commands/tablecmds.c:289 commands/tablecmds.c:18238 -#: parser/parse_utilcmd.c:2257 +#: commands/tablecmds.c:265 commands/tablecmds.c:289 commands/tablecmds.c:18317 +#: parser/parse_utilcmd.c:2247 #, c-format msgid "index \"%s\" does not exist" msgstr "no existe el índice «%s»" @@ -9276,8 +9156,8 @@ msgstr "«%s» no es un tipo" msgid "Use DROP TYPE to remove a type." msgstr "Use DROP TYPE para eliminar un tipo." -#: commands/tablecmds.c:277 commands/tablecmds.c:13027 -#: commands/tablecmds.c:15520 +#: commands/tablecmds.c:277 commands/tablecmds.c:13067 +#: commands/tablecmds.c:15564 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "no existe la tabla foránea «%s»" @@ -9291,1388 +9171,1383 @@ msgstr "la tabla foránea «%s» no existe, omitiendo" msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Use DROP FOREIGN TABLE para eliminar una tabla foránea." -#: commands/tablecmds.c:664 +#: commands/tablecmds.c:663 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT sólo puede ser usado en tablas temporales" -#: commands/tablecmds.c:695 +#: commands/tablecmds.c:694 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "no se puede crear una tabla temporal dentro una operación restringida por seguridad" -#: commands/tablecmds.c:731 commands/tablecmds.c:14311 +#: commands/tablecmds.c:730 commands/tablecmds.c:14351 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "se heredaría de la relación «%s» más de una vez" -#: commands/tablecmds.c:916 +#: commands/tablecmds.c:915 #, c-format msgid "specifying a table access method is not supported on a partitioned table" msgstr "especificar un método de acceso de tablas no está soportado en tablas particionadas." -#: commands/tablecmds.c:1012 +#: commands/tablecmds.c:1011 #, c-format msgid "\"%s\" is not partitioned" msgstr "«%s» no está particionada" -#: commands/tablecmds.c:1107 +#: commands/tablecmds.c:1106 #, c-format msgid "cannot partition using more than %d columns" msgstr "no se puede particionar usando más de %d columnas" -#: commands/tablecmds.c:1163 +#: commands/tablecmds.c:1162 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "no se puede crear una partición foránea en la tabla particionada «%s»" -#: commands/tablecmds.c:1165 +#: commands/tablecmds.c:1164 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "La tabla «%s» contiene índices que son únicos." -#: commands/tablecmds.c:1328 +#: commands/tablecmds.c:1327 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY no soporta eliminar múltiples objetos" -#: commands/tablecmds.c:1332 +#: commands/tablecmds.c:1331 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY no soporta CASCADE" -#: commands/tablecmds.c:1433 +#: commands/tablecmds.c:1432 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "no se puede eliminar el índice particionado «%s» concurrentemente" -#: commands/tablecmds.c:1705 +#: commands/tablecmds.c:1704 #, c-format msgid "cannot truncate only a partitioned table" msgstr "no se puede truncar ONLY una tabla particionada" -#: commands/tablecmds.c:1706 +#: commands/tablecmds.c:1705 #, c-format msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." msgstr "No especifique la opción ONLY, o ejecute TRUNCATE ONLY en las particiones directamente." -#: commands/tablecmds.c:1779 +#: commands/tablecmds.c:1777 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "truncando además la tabla «%s»" -#: commands/tablecmds.c:2138 -#, fuzzy, c-format -#| msgid "cannot update foreign table \"%s\"" +#: commands/tablecmds.c:2127 +#, c-format msgid "cannot truncate foreign table \"%s\"" -msgstr "no se puede actualizar la tabla foránea «%s»" +msgstr "no se puede truncar la tabla foránea «%s»" -#: commands/tablecmds.c:2187 +#: commands/tablecmds.c:2176 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "no se pueden truncar tablas temporales de otras sesiones" -#: commands/tablecmds.c:2449 commands/tablecmds.c:14208 +#: commands/tablecmds.c:2404 commands/tablecmds.c:14248 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "no se puede heredar de la tabla particionada «%s»" -#: commands/tablecmds.c:2454 +#: commands/tablecmds.c:2409 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "no se puede heredar de la partición «%s»" -#: commands/tablecmds.c:2462 parser/parse_utilcmd.c:2487 -#: parser/parse_utilcmd.c:2629 +#: commands/tablecmds.c:2417 parser/parse_utilcmd.c:2477 +#: parser/parse_utilcmd.c:2619 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "la relación heredada «%s» no es una tabla o tabla foránea" -#: commands/tablecmds.c:2474 +#: commands/tablecmds.c:2429 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "no se puede crear una relación temporal como partición de la relación permanente «%s»" -#: commands/tablecmds.c:2483 commands/tablecmds.c:14187 +#: commands/tablecmds.c:2438 commands/tablecmds.c:14227 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "no se puede heredar de la tabla temporal «%s»" -#: commands/tablecmds.c:2493 commands/tablecmds.c:14195 +#: commands/tablecmds.c:2448 commands/tablecmds.c:14235 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "no se puede heredar de una tabla temporal de otra sesión" -#: commands/tablecmds.c:2547 +#: commands/tablecmds.c:2502 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "mezclando múltiples definiciones heredadas de la columna «%s»" -#: commands/tablecmds.c:2555 +#: commands/tablecmds.c:2510 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "columna heredada «%s» tiene conflicto de tipos" -#: commands/tablecmds.c:2557 commands/tablecmds.c:2580 -#: commands/tablecmds.c:2597 commands/tablecmds.c:2853 -#: commands/tablecmds.c:2883 commands/tablecmds.c:2897 -#: parser/parse_coerce.c:2090 parser/parse_coerce.c:2110 -#: parser/parse_coerce.c:2130 parser/parse_coerce.c:2150 -#: parser/parse_coerce.c:2205 parser/parse_coerce.c:2238 -#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2348 -#: parser/parse_coerce.c:2382 parser/parse_coerce.c:2402 +#: commands/tablecmds.c:2512 commands/tablecmds.c:2535 +#: commands/tablecmds.c:2552 commands/tablecmds.c:2808 +#: commands/tablecmds.c:2838 commands/tablecmds.c:2852 +#: parser/parse_coerce.c:2099 parser/parse_coerce.c:2119 +#: parser/parse_coerce.c:2139 parser/parse_coerce.c:2160 +#: parser/parse_coerce.c:2215 parser/parse_coerce.c:2249 +#: parser/parse_coerce.c:2325 parser/parse_coerce.c:2356 +#: parser/parse_coerce.c:2395 parser/parse_coerce.c:2462 #: parser/parse_param.c:227 #, c-format msgid "%s versus %s" msgstr "%s versus %s" -#: commands/tablecmds.c:2566 +#: commands/tablecmds.c:2521 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "columna heredada «%s» tiene conflicto de ordenamiento (collation)" -#: commands/tablecmds.c:2568 commands/tablecmds.c:2865 -#: commands/tablecmds.c:6498 +#: commands/tablecmds.c:2523 commands/tablecmds.c:2820 +#: commands/tablecmds.c:6526 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "«%s» versus «%s»" -#: commands/tablecmds.c:2578 +#: commands/tablecmds.c:2533 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "columna heredada «%s» tiene conflicto de parámetros de almacenamiento" -#: commands/tablecmds.c:2595 commands/tablecmds.c:2895 -#, fuzzy, c-format -#| msgid "column \"%s\" has a collation conflict" +#: commands/tablecmds.c:2550 commands/tablecmds.c:2850 +#, c-format msgid "column \"%s\" has a compression method conflict" -msgstr "la columna «%s» tiene conflicto de ordenamientos (collation)" +msgstr "la columna «%s» tiene conflicto de método de compresión" -#: commands/tablecmds.c:2610 +#: commands/tablecmds.c:2565 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "columna heredada «%s» tiene conflicto de generación" -#: commands/tablecmds.c:2704 commands/tablecmds.c:2759 -#: commands/tablecmds.c:11772 parser/parse_utilcmd.c:1301 -#: parser/parse_utilcmd.c:1344 parser/parse_utilcmd.c:1752 -#: parser/parse_utilcmd.c:1860 +#: commands/tablecmds.c:2659 commands/tablecmds.c:2714 +#: commands/tablecmds.c:11812 parser/parse_utilcmd.c:1291 +#: parser/parse_utilcmd.c:1334 parser/parse_utilcmd.c:1742 +#: parser/parse_utilcmd.c:1850 #, c-format msgid "cannot convert whole-row table reference" msgstr "no se puede convertir una referencia a la fila completa (whole-row)" -#: commands/tablecmds.c:2705 parser/parse_utilcmd.c:1302 +#: commands/tablecmds.c:2660 parser/parse_utilcmd.c:1292 #, c-format msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." msgstr "La expresión de generación para la columna «%s» contiene una referencia a la fila completa (whole-row) de la tabla «%s»." -#: commands/tablecmds.c:2760 parser/parse_utilcmd.c:1345 +#: commands/tablecmds.c:2715 parser/parse_utilcmd.c:1335 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "La restricción «%s» contiene una referencia a la fila completa (whole-row) de la tabla «%s»." -#: commands/tablecmds.c:2839 +#: commands/tablecmds.c:2794 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "mezclando la columna «%s» con la definición heredada" -#: commands/tablecmds.c:2843 +#: commands/tablecmds.c:2798 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "moviendo y mezclando la columna «%s» con la definición heredada" -#: commands/tablecmds.c:2844 +#: commands/tablecmds.c:2799 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "La columna especificada por el usuario fue movida a la posición de la columna heredada." -#: commands/tablecmds.c:2851 +#: commands/tablecmds.c:2806 #, c-format msgid "column \"%s\" has a type conflict" msgstr "la columna «%s» tiene conflicto de tipos" -#: commands/tablecmds.c:2863 +#: commands/tablecmds.c:2818 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "la columna «%s» tiene conflicto de ordenamientos (collation)" -#: commands/tablecmds.c:2881 +#: commands/tablecmds.c:2836 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "la columna «%s» tiene conflicto de parámetros de almacenamiento" -#: commands/tablecmds.c:2922 +#: commands/tablecmds.c:2877 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "la columna hija «%s» especifica una expresión de generación de columna" -#: commands/tablecmds.c:2924 +#: commands/tablecmds.c:2879 #, c-format msgid "Omit the generation expression in the definition of the child table column to inherit the generation expression from the parent table." msgstr "Omita la expresión de generación en la definición de la columna en la tabla hija para heredar la expresión de generación de la tabla padre." -#: commands/tablecmds.c:2928 +#: commands/tablecmds.c:2883 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "la columna «%s» hereda de una columna generada pero especifica un valor por omisión" -#: commands/tablecmds.c:2933 +#: commands/tablecmds.c:2888 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" msgstr "la columna «%s» hereda de una columna generada pero especifica una identidad" -#: commands/tablecmds.c:3042 +#: commands/tablecmds.c:2997 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "la columna «%s» hereda expresiones de generación en conflicto" -#: commands/tablecmds.c:3047 +#: commands/tablecmds.c:3002 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "la columna «%s» hereda valores por omisión no coincidentes" -#: commands/tablecmds.c:3049 +#: commands/tablecmds.c:3004 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "Para resolver el conflicto, indique explícitamente un valor por omisión." -#: commands/tablecmds.c:3095 +#: commands/tablecmds.c:3050 #, c-format msgid "check constraint name \"%s\" appears multiple times but with different expressions" msgstr "la restricción «check» «%s» aparece más de una vez con diferentes expresiones" -#: commands/tablecmds.c:3308 +#: commands/tablecmds.c:3263 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "no se pueden mover tablas temporales de otras sesiones" -#: commands/tablecmds.c:3378 +#: commands/tablecmds.c:3333 #, c-format msgid "cannot rename column of typed table" msgstr "no se puede cambiar el nombre a una columna de una tabla tipada" -#: commands/tablecmds.c:3397 +#: commands/tablecmds.c:3352 #, c-format msgid "\"%s\" is not a table, view, materialized view, composite type, index, or foreign table" msgstr "«%s» no es una tabla, vista, vista materializada, tipo compuesto, índice o tabla foránea" -#: commands/tablecmds.c:3491 +#: commands/tablecmds.c:3446 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "debe cambiar el nombre a la columna heredada «%s» en las tablas hijas también" -#: commands/tablecmds.c:3523 +#: commands/tablecmds.c:3478 #, c-format msgid "cannot rename system column \"%s\"" msgstr "no se puede cambiar el nombre a la columna de sistema «%s»" -#: commands/tablecmds.c:3538 +#: commands/tablecmds.c:3493 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "no se puede cambiar el nombre a la columna heredada «%s»" -#: commands/tablecmds.c:3690 +#: commands/tablecmds.c:3645 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "debe cambiar el nombre a la restricción heredada «%s» en las tablas hijas también" -#: commands/tablecmds.c:3697 +#: commands/tablecmds.c:3652 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "no se puede cambiar el nombre a la restricción heredada «%s»" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3930 +#: commands/tablecmds.c:3950 #, c-format msgid "cannot %s \"%s\" because it is being used by active queries in this session" msgstr "no se puede hacer %s en «%s» porque está siendo usada por consultas activas en esta sesión" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3939 +#: commands/tablecmds.c:3959 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "no se puede hacer %s en «%s» porque tiene eventos de disparador pendientes" -#: commands/tablecmds.c:4403 -#, fuzzy, c-format -#| msgid "cannot convert partition \"%s\" to a view" -msgid "cannot alter partition \"%s\" with an incomplete detach" -msgstr "no se puede convertir la partición «%s» en vista" - -#: commands/tablecmds.c:4405 +#: commands/tablecmds.c:4423 #, c-format -msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." -msgstr "" +msgid "cannot alter partition \"%s\" with an incomplete detach" +msgstr "no se puede modificar la partición «%s» teniendo un desprendimiento incompleto" -#: commands/tablecmds.c:4597 commands/tablecmds.c:4612 +#: commands/tablecmds.c:4616 commands/tablecmds.c:4631 #, c-format msgid "cannot change persistence setting twice" msgstr "no se puede cambiar la opción de persistencia dos veces" -#: commands/tablecmds.c:5355 +#: commands/tablecmds.c:5374 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "no se puede reescribir la relación de sistema «%s»" -#: commands/tablecmds.c:5361 +#: commands/tablecmds.c:5380 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "no se puede reescribir la tabla «%s» que es usada como tabla de catálogo" -#: commands/tablecmds.c:5371 +#: commands/tablecmds.c:5390 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "no se puede reescribir tablas temporales de otras sesiones" -#: commands/tablecmds.c:5832 +#: commands/tablecmds.c:5851 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "la columna «%s» de la relación «%s» contiene valores null" -#: commands/tablecmds.c:5849 +#: commands/tablecmds.c:5868 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "la restricción check «%s» de la relación «%s» es violada por alguna fila" -#: commands/tablecmds.c:5868 partitioning/partbounds.c:3282 +#: commands/tablecmds.c:5887 partitioning/partbounds.c:3292 #, c-format msgid "updated partition constraint for default partition \"%s\" would be violated by some row" msgstr "la restricción de partición actualizada para la partición default «%s» sería violada por alguna fila" -#: commands/tablecmds.c:5874 +#: commands/tablecmds.c:5893 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "la restricción de partición de la relación «%s» es violada por alguna fila" -#: commands/tablecmds.c:6022 commands/trigger.c:1265 commands/trigger.c:1371 +#: commands/tablecmds.c:6041 commands/trigger.c:1283 commands/trigger.c:1389 #, c-format msgid "\"%s\" is not a table, view, or foreign table" msgstr "«%s» no es una tabla, vista o tabla foránea" -#: commands/tablecmds.c:6025 +#: commands/tablecmds.c:6044 #, c-format msgid "\"%s\" is not a table, view, materialized view, or index" msgstr "«%s» no es una tabla, vista, vista materializada, o índice" -#: commands/tablecmds.c:6031 +#: commands/tablecmds.c:6050 #, c-format msgid "\"%s\" is not a table, materialized view, or index" msgstr "«%s» no es una tabla, vista materializada, o índice" -#: commands/tablecmds.c:6034 +#: commands/tablecmds.c:6053 +#, c-format +msgid "\"%s\" is not a table, materialized view, index, or partitioned index" +msgstr "«%s» no es una tabla, vista materializada, índice o índice particionado" + +#: commands/tablecmds.c:6056 +#, c-format +msgid "\"%s\" is not a table, materialized view, index, partitioned index, or foreign table" +msgstr "«%s» no es una tabla, vista materializada, índice, índice particionado o tabla foránea" + +#: commands/tablecmds.c:6059 #, c-format msgid "\"%s\" is not a table, materialized view, or foreign table" msgstr "«%s» no es una tabla, vista materializada o tabla foránea" -#: commands/tablecmds.c:6037 +#: commands/tablecmds.c:6062 #, c-format msgid "\"%s\" is not a table or foreign table" msgstr "«%s» no es una tabla o tabla foránea" -#: commands/tablecmds.c:6040 +#: commands/tablecmds.c:6065 #, c-format msgid "\"%s\" is not a table, composite type, or foreign table" msgstr "«%s» no es una tabla, tipo compuesto, o tabla foránea" -#: commands/tablecmds.c:6043 +#: commands/tablecmds.c:6068 #, c-format msgid "\"%s\" is not a table, materialized view, index, or foreign table" msgstr "«%s» no es una tabla, vista materializada, índice o tabla foránea" -#: commands/tablecmds.c:6053 +#: commands/tablecmds.c:6071 +#, c-format +msgid "\"%s\" is not a table or partitioned index" +msgstr "«%s» no es una tabla o índice particionado" + +#: commands/tablecmds.c:6081 #, c-format msgid "\"%s\" is of the wrong type" msgstr "«%s» es tipo equivocado" -#: commands/tablecmds.c:6256 commands/tablecmds.c:6263 +#: commands/tablecmds.c:6284 commands/tablecmds.c:6291 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "no se puede alterar el tipo «%s» porque la columna «%s.%s» lo usa" -#: commands/tablecmds.c:6270 +#: commands/tablecmds.c:6298 #, c-format msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" msgstr "no se puede alterar la tabla foránea «%s» porque la columna «%s.%s» usa su tipo de registro" -#: commands/tablecmds.c:6277 +#: commands/tablecmds.c:6305 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "no se puede alterar la tabla «%s» porque la columna «%s.%s» usa su tipo de registro" -#: commands/tablecmds.c:6333 +#: commands/tablecmds.c:6361 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "no se puede cambiar el tipo «%s» porque es el tipo de una tabla tipada" -#: commands/tablecmds.c:6335 +#: commands/tablecmds.c:6363 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "Use ALTER ... CASCADE para eliminar además las tablas tipadas." -#: commands/tablecmds.c:6381 +#: commands/tablecmds.c:6409 #, c-format msgid "type %s is not a composite type" msgstr "el tipo %s no es un tipo compuesto" -#: commands/tablecmds.c:6408 +#: commands/tablecmds.c:6436 #, c-format msgid "cannot add column to typed table" msgstr "no se puede agregar una columna a una tabla tipada" -#: commands/tablecmds.c:6461 +#: commands/tablecmds.c:6489 #, c-format msgid "cannot add column to a partition" msgstr "no se puede agregar una columna a una partición" -#: commands/tablecmds.c:6490 commands/tablecmds.c:14438 +#: commands/tablecmds.c:6518 commands/tablecmds.c:14478 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "la tabla hija «%s» tiene un tipo diferente para la columna «%s»" -#: commands/tablecmds.c:6496 commands/tablecmds.c:14445 +#: commands/tablecmds.c:6524 commands/tablecmds.c:14485 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "la tabla hija «%s» tiene un ordenamiento (collation) diferente para la columna «%s»" -#: commands/tablecmds.c:6510 +#: commands/tablecmds.c:6538 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "mezclando la definición de la columna «%s» en la tabla hija «%s»" -#: commands/tablecmds.c:6553 +#: commands/tablecmds.c:6581 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "no se puede agregar una columna de identidad recursivamente a una tabla que tiene tablas hijas" -#: commands/tablecmds.c:6796 +#: commands/tablecmds.c:6824 #, c-format msgid "column must be added to child tables too" msgstr "la columna debe ser agregada a las tablas hijas también" -#: commands/tablecmds.c:6874 +#: commands/tablecmds.c:6902 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "la columna «%s» de la relación «%s» ya existe, omitiendo" -#: commands/tablecmds.c:6881 +#: commands/tablecmds.c:6909 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "ya existe la columna «%s» en la relación «%s»" -#: commands/tablecmds.c:6947 commands/tablecmds.c:11410 +#: commands/tablecmds.c:6975 commands/tablecmds.c:11451 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "no se pueden eliminar restricciones sólo de la tabla particionada cuando existen particiones" -#: commands/tablecmds.c:6948 commands/tablecmds.c:7252 -#: commands/tablecmds.c:8275 commands/tablecmds.c:11411 +#: commands/tablecmds.c:6976 commands/tablecmds.c:7293 +#: commands/tablecmds.c:8316 commands/tablecmds.c:11452 #, c-format msgid "Do not specify the ONLY keyword." msgstr "No especifique la opción ONLY." -#: commands/tablecmds.c:6985 commands/tablecmds.c:7178 -#: commands/tablecmds.c:7320 commands/tablecmds.c:7434 -#: commands/tablecmds.c:7528 commands/tablecmds.c:7587 -#: commands/tablecmds.c:7705 commands/tablecmds.c:7871 -#: commands/tablecmds.c:7941 commands/tablecmds.c:8097 -#: commands/tablecmds.c:11565 commands/tablecmds.c:13050 -#: commands/tablecmds.c:15611 +#: commands/tablecmds.c:7013 commands/tablecmds.c:7219 +#: commands/tablecmds.c:7361 commands/tablecmds.c:7475 +#: commands/tablecmds.c:7569 commands/tablecmds.c:7628 +#: commands/tablecmds.c:7746 commands/tablecmds.c:7912 +#: commands/tablecmds.c:7982 commands/tablecmds.c:8138 +#: commands/tablecmds.c:11606 commands/tablecmds.c:13090 +#: commands/tablecmds.c:15655 #, c-format msgid "cannot alter system column \"%s\"" msgstr "no se puede alterar columna de sistema «%s»" -#: commands/tablecmds.c:6991 commands/tablecmds.c:7326 +#: commands/tablecmds.c:7019 commands/tablecmds.c:7367 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "la columna «%s» en la relación «%s» es una columna de identidad" -#: commands/tablecmds.c:7027 +#: commands/tablecmds.c:7062 #, c-format msgid "column \"%s\" is in a primary key" msgstr "la columna «%s» está en la llave primaria" -#: commands/tablecmds.c:7049 +#: commands/tablecmds.c:7067 +#, c-format +msgid "column \"%s\" is in index used as replica identity" +msgstr "la columna «%s» se encuentra en un índice utilizado como identidad de réplica" + +#: commands/tablecmds.c:7090 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "columna «%s» está marcada NOT NULL en la tabla padre" -#: commands/tablecmds.c:7249 commands/tablecmds.c:8758 +#: commands/tablecmds.c:7290 commands/tablecmds.c:8799 #, c-format msgid "constraint must be added to child tables too" msgstr "la restricción debe ser agregada a las tablas hijas también" -#: commands/tablecmds.c:7250 +#: commands/tablecmds.c:7291 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "La columna «%s» de la relación «%s» no está previamente marcada NOT NULL." -#: commands/tablecmds.c:7328 +#: commands/tablecmds.c:7369 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." msgstr "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY en su lugar." -#: commands/tablecmds.c:7333 +#: commands/tablecmds.c:7374 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "la columna «%s» en la relación «%s» es una columna generada" -#: commands/tablecmds.c:7336 +#: commands/tablecmds.c:7377 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." msgstr "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION en su lugar." -#: commands/tablecmds.c:7445 +#: commands/tablecmds.c:7486 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "la columna «%s» en la relación «%s» debe ser declarada NOT NULL antes de que una identidad pueda agregarse" -#: commands/tablecmds.c:7451 +#: commands/tablecmds.c:7492 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "la columna «%s» en la relación «%s» ya es una columna de identidad" -#: commands/tablecmds.c:7457 +#: commands/tablecmds.c:7498 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "la columna «%s» en la relación «%s» ya tiene un valor por omisión" -#: commands/tablecmds.c:7534 commands/tablecmds.c:7595 +#: commands/tablecmds.c:7575 commands/tablecmds.c:7636 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "la columna «%s» en la relación «%s» no es una columna identidad" -#: commands/tablecmds.c:7600 +#: commands/tablecmds.c:7641 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "la columna «%s» de la relación «%s» no es una columna identidad, omitiendo" -#: commands/tablecmds.c:7653 -#, fuzzy, c-format -#| msgid "column must be added to child tables too" +#: commands/tablecmds.c:7694 +#, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" -msgstr "la columna debe ser agregada a las tablas hijas también" +msgstr "ALTER TABLE / DROP EXPRESSION se debe aplicar a las tablas hijas también" -#: commands/tablecmds.c:7675 +#: commands/tablecmds.c:7716 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "no se puede eliminar la expresión de generación de una columna heredada" -#: commands/tablecmds.c:7713 +#: commands/tablecmds.c:7754 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "la columna «%s» en la relación «%s» no es una columna generada almacenada" -#: commands/tablecmds.c:7718 +#: commands/tablecmds.c:7759 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "la columna «%s» de la relación «%s» no es una columna generada almacenada, omitiendo" -#: commands/tablecmds.c:7818 +#: commands/tablecmds.c:7859 #, c-format msgid "cannot refer to non-index column by number" msgstr "no se puede referir a columnas que no son de índice por número" -#: commands/tablecmds.c:7861 +#: commands/tablecmds.c:7902 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "no existe la columna número %d en la relación «%s»" -#: commands/tablecmds.c:7880 +#: commands/tablecmds.c:7921 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "no se puede alterar estadísticas en la columna incluida «%s» del índice «%s»" -#: commands/tablecmds.c:7885 +#: commands/tablecmds.c:7926 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "no se puede alterar estadísticas en la columna no-de-expresión «%s» del índice «%s»" -#: commands/tablecmds.c:7887 +#: commands/tablecmds.c:7928 #, c-format msgid "Alter statistics on table column instead." msgstr "Altere las estadísticas en la columna de la tabla en su lugar." -#: commands/tablecmds.c:8077 +#: commands/tablecmds.c:8118 #, c-format msgid "invalid storage type \"%s\"" msgstr "tipo de almacenamiento no válido «%s»" -#: commands/tablecmds.c:8109 +#: commands/tablecmds.c:8150 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "el tipo de datos %s de la columna sólo puede tener almacenamiento PLAIN" -#: commands/tablecmds.c:8154 +#: commands/tablecmds.c:8195 #, c-format msgid "cannot drop column from typed table" msgstr "no se pueden eliminar columnas de una tabla tipada" -#: commands/tablecmds.c:8213 +#: commands/tablecmds.c:8254 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "no existe la columna «%s» en la relación «%s», omitiendo" -#: commands/tablecmds.c:8226 +#: commands/tablecmds.c:8267 #, c-format msgid "cannot drop system column \"%s\"" msgstr "no se puede eliminar la columna de sistema «%s»" -#: commands/tablecmds.c:8236 +#: commands/tablecmds.c:8277 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "no se puede eliminar la columna heredada «%s»" -#: commands/tablecmds.c:8249 +#: commands/tablecmds.c:8290 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "no se puede eliminar la columna «%s» porque es parte de la llave de partición de la relación «%s»" -#: commands/tablecmds.c:8274 +#: commands/tablecmds.c:8315 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "no se pueden eliminar columnas sólo de una tabla particionada cuando existe particiones" -#: commands/tablecmds.c:8478 +#: commands/tablecmds.c:8519 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX no está soportado en tablas particionadas" -#: commands/tablecmds.c:8503 +#: commands/tablecmds.c:8544 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX renombrará el índice «%s» a «%s»" -#: commands/tablecmds.c:8838 +#: commands/tablecmds.c:8879 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "no se puede usar ONLY para una llave foránea en la tabla particionada «%s» haciendo referencia a la relación «%s»" -#: commands/tablecmds.c:8844 +#: commands/tablecmds.c:8885 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "no se puede agregar una llave foránea NOT VALID a la tabla particionada «%s» haciendo referencia a la relación «%s»" -#: commands/tablecmds.c:8847 +#: commands/tablecmds.c:8888 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "Esta característica no está aún soportada en tablas particionadas." -#: commands/tablecmds.c:8854 commands/tablecmds.c:9259 +#: commands/tablecmds.c:8895 commands/tablecmds.c:9300 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "la relación referida «%s» no es una tabla" -#: commands/tablecmds.c:8877 +#: commands/tablecmds.c:8918 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "las restricciones en tablas permanentes sólo pueden hacer referencia a tablas permanentes" -#: commands/tablecmds.c:8884 +#: commands/tablecmds.c:8925 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "las restricciones en tablas «unlogged» sólo pueden hacer referencia a tablas permanentes o «unlogged»" -#: commands/tablecmds.c:8890 +#: commands/tablecmds.c:8931 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "las restricciones en tablas temporales sólo pueden hacer referencia a tablas temporales" -#: commands/tablecmds.c:8894 +#: commands/tablecmds.c:8935 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "las restricciones en tablas temporales sólo pueden hacer referencia a tablas temporales de esta sesión" -#: commands/tablecmds.c:8960 commands/tablecmds.c:8966 +#: commands/tablecmds.c:9001 commands/tablecmds.c:9007 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "acción %s no válida para restricción de llave foránea que contiene columnas generadas" -#: commands/tablecmds.c:8982 +#: commands/tablecmds.c:9023 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "el número de columnas referidas en la llave foránea no coincide con el número de columnas de referencia" -#: commands/tablecmds.c:9089 +#: commands/tablecmds.c:9130 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "la restricción de llave foránea «%s» no puede ser implementada" -#: commands/tablecmds.c:9091 +#: commands/tablecmds.c:9132 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Las columnas llave «%s» y «%s» son de tipos incompatibles: %s y %s" -#: commands/tablecmds.c:9454 commands/tablecmds.c:9847 -#: parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:925 +#: commands/tablecmds.c:9495 commands/tablecmds.c:9888 +#: parser/parse_utilcmd.c:786 parser/parse_utilcmd.c:915 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "las restricciones de llave foránea no están soportadas en tablas foráneas" -#: commands/tablecmds.c:10214 commands/tablecmds.c:10492 -#: commands/tablecmds.c:11367 commands/tablecmds.c:11442 +#: commands/tablecmds.c:10255 commands/tablecmds.c:10533 +#: commands/tablecmds.c:11408 commands/tablecmds.c:11483 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "no existe la restricción «%s» en la relación «%s»" -#: commands/tablecmds.c:10221 +#: commands/tablecmds.c:10262 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "la restricción «%s» de la relación «%s» no es una restriccion de llave foránea" -#: commands/tablecmds.c:10259 -#, fuzzy, c-format -#| msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" +#: commands/tablecmds.c:10300 +#, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" -msgstr "no se puede eliminar la restricción «%s» heredada de la relación «%s»" +msgstr "no se puede modificar la restricción «%s» en la relación «%s»" -#: commands/tablecmds.c:10262 -#, fuzzy, c-format -#| msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" +#: commands/tablecmds.c:10303 +#, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." -msgstr "la restricción «%s» está en conflicto con la restricción heredada de la relación «%s»" +msgstr "La restricción «%s» deriva de la restricción «%s» de la relación «%s»." -#: commands/tablecmds.c:10264 +#: commands/tablecmds.c:10305 #, c-format msgid "You may alter the constraint it derives from, instead." -msgstr "" +msgstr "En su lugar, puede modificar la restricción de la cual deriva." -#: commands/tablecmds.c:10500 +#: commands/tablecmds.c:10541 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "la restricción «%s» de la relación «%s» no es una llave foránea o restricción «check»" -#: commands/tablecmds.c:10578 +#: commands/tablecmds.c:10619 #, c-format msgid "constraint must be validated on child tables too" msgstr "la restricción debe ser validada en las tablas hijas también" -#: commands/tablecmds.c:10662 +#: commands/tablecmds.c:10703 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "no existe la columna «%s» referida en la llave foránea" -#: commands/tablecmds.c:10667 +#: commands/tablecmds.c:10708 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "no se puede tener más de %d columnas en una llave foránea" -#: commands/tablecmds.c:10732 +#: commands/tablecmds.c:10773 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "no se puede usar una llave primaria postergable para la tabla referenciada «%s»" -#: commands/tablecmds.c:10749 +#: commands/tablecmds.c:10790 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "no hay llave primaria para la tabla referida «%s»" -#: commands/tablecmds.c:10814 +#: commands/tablecmds.c:10855 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "la lista de columnas referidas en una llave foránea no debe contener duplicados" -#: commands/tablecmds.c:10908 +#: commands/tablecmds.c:10949 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "no se puede usar una restricción unique postergable para la tabla referenciada «%s»" -#: commands/tablecmds.c:10913 +#: commands/tablecmds.c:10954 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "no hay restricción unique que coincida con las columnas dadas en la tabla referida «%s»" -#: commands/tablecmds.c:11323 +#: commands/tablecmds.c:11364 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "no se puede eliminar la restricción «%s» heredada de la relación «%s»" -#: commands/tablecmds.c:11373 +#: commands/tablecmds.c:11414 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "no existe la restricción «%s» en la relación «%s», omitiendo" -#: commands/tablecmds.c:11549 +#: commands/tablecmds.c:11590 #, c-format msgid "cannot alter column type of typed table" msgstr "no se puede cambiar el tipo de una columna de una tabla tipada" -#: commands/tablecmds.c:11576 +#: commands/tablecmds.c:11617 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "no se puede alterar la columna heredada «%s»" -#: commands/tablecmds.c:11585 +#: commands/tablecmds.c:11626 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "no se puede alterar la columna «%s» porque es parte de la llave de partición de la relación «%s»" -#: commands/tablecmds.c:11635 +#: commands/tablecmds.c:11676 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "el resultado de la cláusula USING para la columna «%s» no puede ser convertido automáticamente al tipo %s" -#: commands/tablecmds.c:11638 +#: commands/tablecmds.c:11679 #, c-format msgid "You might need to add an explicit cast." msgstr "Puede ser necesario agregar un cast explícito." -#: commands/tablecmds.c:11642 +#: commands/tablecmds.c:11683 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "la columna «%s» no puede convertirse automáticamente al tipo %s" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:11645 +#: commands/tablecmds.c:11686 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Puede ser necesario especificar «USING %s::%s»." -#: commands/tablecmds.c:11745 +#: commands/tablecmds.c:11785 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "no se puede alterar la columna heredada «%s» de la relación «%s»" -#: commands/tablecmds.c:11773 +#: commands/tablecmds.c:11813 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "La expresión USING contiene una referencia a la fila completa (whole-row)." -#: commands/tablecmds.c:11784 +#: commands/tablecmds.c:11824 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "debe cambiar el tipo a la columna heredada «%s» en las tablas hijas también" -#: commands/tablecmds.c:11909 +#: commands/tablecmds.c:11949 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "no se puede alterar el tipo de la columna «%s» dos veces" -#: commands/tablecmds.c:11947 +#: commands/tablecmds.c:11987 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "la expresión de generación para la columna «%s» no puede ser convertido automáticamente al tipo %s" -#: commands/tablecmds.c:11952 +#: commands/tablecmds.c:11992 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "el valor por omisión para la columna «%s» no puede ser convertido automáticamente al tipo %s" -#: commands/tablecmds.c:12030 +#: commands/tablecmds.c:12070 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "no se puede alterar el tipo de una columna usada por una columna generada" -#: commands/tablecmds.c:12031 +#: commands/tablecmds.c:12071 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "La columna «%s» es usada por la columna generada «%s»." -#: commands/tablecmds.c:12052 +#: commands/tablecmds.c:12092 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "no se puede alterar el tipo de una columna usada en una regla o vista" -#: commands/tablecmds.c:12053 commands/tablecmds.c:12072 -#: commands/tablecmds.c:12090 +#: commands/tablecmds.c:12093 commands/tablecmds.c:12112 +#: commands/tablecmds.c:12130 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s depende de la columna «%s»" -#: commands/tablecmds.c:12071 +#: commands/tablecmds.c:12111 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "no se puede alterar el tipo de una columna usada en una definición de trigger" -#: commands/tablecmds.c:12089 +#: commands/tablecmds.c:12129 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "no se puede alterar el tipo de una columna usada en una definición de política" -#: commands/tablecmds.c:13158 commands/tablecmds.c:13170 +#: commands/tablecmds.c:13198 commands/tablecmds.c:13210 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "no se puede cambiar el dueño del índice «%s»" -#: commands/tablecmds.c:13160 commands/tablecmds.c:13172 +#: commands/tablecmds.c:13200 commands/tablecmds.c:13212 #, c-format msgid "Change the ownership of the index's table, instead." msgstr "Considere cambiar el dueño de la tabla en vez de cambiar el dueño del índice." -#: commands/tablecmds.c:13186 +#: commands/tablecmds.c:13226 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "no se puede cambiar el dueño de la secuencia «%s»" -#: commands/tablecmds.c:13200 commands/tablecmds.c:16503 +#: commands/tablecmds.c:13240 commands/tablecmds.c:16547 #, c-format msgid "Use ALTER TYPE instead." msgstr "Considere usar ALTER TYPE." -#: commands/tablecmds.c:13209 +#: commands/tablecmds.c:13249 #, c-format msgid "\"%s\" is not a table, view, sequence, or foreign table" msgstr "«%s» no es una tabla, vista, secuencia o tabla foránea" -#: commands/tablecmds.c:13548 +#: commands/tablecmds.c:13588 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "no se pueden tener múltiples subórdenes SET TABLESPACE" -#: commands/tablecmds.c:13625 +#: commands/tablecmds.c:13665 #, c-format msgid "\"%s\" is not a table, view, materialized view, index, or TOAST table" msgstr "«%s» no es una tabla, vista, tabla materializada, índice o tabla TOAST" -#: commands/tablecmds.c:13658 commands/view.c:494 +#: commands/tablecmds.c:13698 commands/view.c:491 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTION sólo puede usarse en vistas automáticamente actualizables" -#: commands/tablecmds.c:13910 +#: commands/tablecmds.c:13950 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "solamente tablas, índices y vistas materializadas existen en tablespaces" -#: commands/tablecmds.c:13922 +#: commands/tablecmds.c:13962 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "no se puede mover objetos hacia o desde el tablespace pg_global" -#: commands/tablecmds.c:14014 +#: commands/tablecmds.c:14054 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "cancelando porque el lock en la relación «%s.%s» no está disponible" -#: commands/tablecmds.c:14030 +#: commands/tablecmds.c:14070 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "no se encontraron relaciones coincidentes en el tablespace «%s»" -#: commands/tablecmds.c:14146 +#: commands/tablecmds.c:14186 #, c-format msgid "cannot change inheritance of typed table" msgstr "no se puede cambiar la herencia de una tabla tipada" -#: commands/tablecmds.c:14151 commands/tablecmds.c:14707 +#: commands/tablecmds.c:14191 commands/tablecmds.c:14747 #, c-format msgid "cannot change inheritance of a partition" msgstr "no puede cambiar la herencia de una partición" -#: commands/tablecmds.c:14156 +#: commands/tablecmds.c:14196 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "no se puede cambiar la herencia de una tabla particionada" -#: commands/tablecmds.c:14202 +#: commands/tablecmds.c:14242 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "no se puede agregar herencia a tablas temporales de otra sesión" -#: commands/tablecmds.c:14215 +#: commands/tablecmds.c:14255 #, c-format msgid "cannot inherit from a partition" msgstr "no se puede heredar de una partición" -#: commands/tablecmds.c:14237 commands/tablecmds.c:17147 +#: commands/tablecmds.c:14277 commands/tablecmds.c:17191 #, c-format msgid "circular inheritance not allowed" msgstr "la herencia circular no está permitida" -#: commands/tablecmds.c:14238 commands/tablecmds.c:17148 +#: commands/tablecmds.c:14278 commands/tablecmds.c:17192 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "«%s» ya es un hijo de «%s»." -#: commands/tablecmds.c:14251 +#: commands/tablecmds.c:14291 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "el trigger «%s» impide a la tabla «%s» convertirse en hija de herencia" -#: commands/tablecmds.c:14253 +#: commands/tablecmds.c:14293 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "Los triggers ROW con tablas de transición no están permitidos en jerarquías de herencia." -#: commands/tablecmds.c:14456 +#: commands/tablecmds.c:14496 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "columna «%s» en tabla hija debe marcarse como NOT NULL" -#: commands/tablecmds.c:14465 -#, fuzzy, c-format -#| msgid "column \"%s\" in child table must be marked NOT NULL" +#: commands/tablecmds.c:14505 +#, c-format msgid "column \"%s\" in child table must be a generated column" -msgstr "columna «%s» en tabla hija debe marcarse como NOT NULL" +msgstr "columna «%s» en tabla hija debe ser una columna generada" -#: commands/tablecmds.c:14515 -#, fuzzy, c-format -#| msgid "column \"%s\" inherits conflicting generation expressions" +#: commands/tablecmds.c:14555 +#, c-format msgid "column \"%s\" in child table has a conflicting generation expression" -msgstr "la columna «%s» hereda expresiones de generación en conflicto" +msgstr "la columna «%s» en tabla hija tiene una expresión de generación en conflicto" -#: commands/tablecmds.c:14543 +#: commands/tablecmds.c:14583 #, c-format msgid "child table is missing column \"%s\"" msgstr "tabla hija no tiene la columna «%s»" -#: commands/tablecmds.c:14631 +#: commands/tablecmds.c:14671 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "la tabla hija «%s» tiene una definición diferente para la restricción «check» «%s»" -#: commands/tablecmds.c:14639 +#: commands/tablecmds.c:14679 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "la restricción «%s» está en conflicto con la restricción no heredada en la tabla hija «%s»" -#: commands/tablecmds.c:14650 +#: commands/tablecmds.c:14690 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "la restricción «%s» está en conflicto con la restricción NOT VALID en la tabla hija «%s»" -#: commands/tablecmds.c:14685 +#: commands/tablecmds.c:14725 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "tabla hija no tiene la restricción «%s»" -#: commands/tablecmds.c:14773 -#, fuzzy, c-format -#| msgid "partition \"%s\" would overlap partition \"%s\"" -msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" -msgstr "la partición «%s» traslaparía con la partición «%s»" - -#: commands/tablecmds.c:14777 +#: commands/tablecmds.c:14811 #, c-format -msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the detach operation." -msgstr "" +msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" +msgstr "la partición «%s» ya tiene un desprendimiento pendiente en la tabla particionada «%s.%s»" -#: commands/tablecmds.c:14802 commands/tablecmds.c:14850 +#: commands/tablecmds.c:14840 commands/tablecmds.c:14888 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "relación «%s» no es una partición de la relación «%s»" -#: commands/tablecmds.c:14856 +#: commands/tablecmds.c:14894 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "relación «%s» no es un padre de la relación «%s»" -#: commands/tablecmds.c:15084 +#: commands/tablecmds.c:15122 #, c-format msgid "typed tables cannot inherit" msgstr "las tablas tipadas no pueden heredar" -#: commands/tablecmds.c:15114 +#: commands/tablecmds.c:15152 #, c-format msgid "table is missing column \"%s\"" msgstr "la tabla no tiene la columna «%s»" -#: commands/tablecmds.c:15125 +#: commands/tablecmds.c:15163 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "la tabla tiene columna «%s» en la posición en que el tipo requiere «%s»." -#: commands/tablecmds.c:15134 +#: commands/tablecmds.c:15172 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "la tabla «%s» tiene un tipo diferente para la columna «%s»" -#: commands/tablecmds.c:15148 +#: commands/tablecmds.c:15186 #, c-format msgid "table has extra column \"%s\"" msgstr "tabla tiene la columna extra «%s»" -#: commands/tablecmds.c:15200 +#: commands/tablecmds.c:15238 #, c-format msgid "\"%s\" is not a typed table" msgstr "«%s» no es una tabla tipada" -#: commands/tablecmds.c:15382 +#: commands/tablecmds.c:15426 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "no se puede usar el índice no-único «%s» como identidad de réplica" -#: commands/tablecmds.c:15388 +#: commands/tablecmds.c:15432 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "no puede usar el índice no-inmediato «%s» como identidad de réplica" -#: commands/tablecmds.c:15394 +#: commands/tablecmds.c:15438 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "no se puede usar el índice funcional «%s» como identidad de réplica" -#: commands/tablecmds.c:15400 +#: commands/tablecmds.c:15444 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "no se puede usar el índice parcial «%s» como identidad de réplica" -#: commands/tablecmds.c:15406 +#: commands/tablecmds.c:15450 #, c-format msgid "cannot use invalid index \"%s\" as replica identity" msgstr "no se puede usar el índice no válido «%s» como identidad de réplica" -#: commands/tablecmds.c:15423 +#: commands/tablecmds.c:15467 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "el índice «%s» no puede usarse como identidad de réplica porque la column %d es una columna de sistema" -#: commands/tablecmds.c:15430 +#: commands/tablecmds.c:15474 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "el índice «%s» no puede usarse como identidad de réplica porque la column «%s» acepta valores nulos" -#: commands/tablecmds.c:15677 +#: commands/tablecmds.c:15721 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "no se puede cambiar el estado «logged» de la tabla «%s» porque es temporal" -#: commands/tablecmds.c:15701 +#: commands/tablecmds.c:15745 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "no se pudo cambiar la tabla «%s» a «unlogged» porque es parte de una publicación" -#: commands/tablecmds.c:15703 +#: commands/tablecmds.c:15747 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Las tablas «unlogged» no pueden replicarse." -#: commands/tablecmds.c:15748 +#: commands/tablecmds.c:15792 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "no se pudo cambiar la tabla «%s» a «logged» porque hace referencia a la tabla «unlogged» «%s»" -#: commands/tablecmds.c:15758 +#: commands/tablecmds.c:15802 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "no se pudo cambiar la tabla «%s» a «unlogged» porque hace referencia a la tabla «logged» «%s»" -#: commands/tablecmds.c:15816 +#: commands/tablecmds.c:15860 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "no se puede mover una secuencia enlazada a una tabla hacia otro esquema" -#: commands/tablecmds.c:15923 +#: commands/tablecmds.c:15967 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "ya existe una relación llamada «%s» en el esquema «%s»" -#: commands/tablecmds.c:16486 +#: commands/tablecmds.c:16530 #, c-format msgid "\"%s\" is not a composite type" msgstr "«%s» no es un tipo compuesto" -#: commands/tablecmds.c:16518 +#: commands/tablecmds.c:16562 #, c-format msgid "\"%s\" is not a table, view, materialized view, sequence, or foreign table" msgstr "«%s» no es una tabla, vista, vista materializada, secuencia o tabla foránea" -#: commands/tablecmds.c:16553 +#: commands/tablecmds.c:16597 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "estrategia de particionamiento «%s» no reconocida" -#: commands/tablecmds.c:16561 +#: commands/tablecmds.c:16605 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "no se puede usar la estrategia de particionamiento «list» con más de una columna" -#: commands/tablecmds.c:16627 +#: commands/tablecmds.c:16671 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "la columna «%s» nombrada en llave de particionamiento no existe" -#: commands/tablecmds.c:16635 +#: commands/tablecmds.c:16679 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "no se puede usar la columna de sistema «%s» en llave de particionamiento" -#: commands/tablecmds.c:16646 commands/tablecmds.c:16760 +#: commands/tablecmds.c:16690 commands/tablecmds.c:16804 #, c-format msgid "cannot use generated column in partition key" msgstr "no se puede usar una columna generada en llave de particionamiento" -#: commands/tablecmds.c:16647 commands/tablecmds.c:16761 commands/trigger.c:635 -#: rewrite/rewriteHandler.c:884 rewrite/rewriteHandler.c:919 +#: commands/tablecmds.c:16691 commands/tablecmds.c:16805 commands/trigger.c:653 +#: rewrite/rewriteHandler.c:907 rewrite/rewriteHandler.c:942 #, c-format msgid "Column \"%s\" is a generated column." msgstr "La columna «%s» es una columna generada." -#: commands/tablecmds.c:16723 +#: commands/tablecmds.c:16767 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "las funciones utilizadas en expresiones de la llave de particionamiento deben estar marcadas IMMUTABLE" -#: commands/tablecmds.c:16743 +#: commands/tablecmds.c:16787 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "las expresiones en la llave de particionamiento no pueden contener referencias a columnas de sistema" -#: commands/tablecmds.c:16773 +#: commands/tablecmds.c:16817 #, c-format msgid "cannot use constant expression as partition key" msgstr "no se pueden usar expresiones constantes como llave de particionamiento" -#: commands/tablecmds.c:16794 +#: commands/tablecmds.c:16838 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "no se pudo determinar qué ordenamiento (collation) usar para la expresión de particionamiento" -#: commands/tablecmds.c:16829 +#: commands/tablecmds.c:16873 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "Debe especificar una clase de operadores hash, o definir una clase de operadores por omisión para hash para el tipo de datos." -#: commands/tablecmds.c:16835 +#: commands/tablecmds.c:16879 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "Debe especificar una clase de operadores btree, o definir una clase de operadores por omisión para btree para el tipo de datos." -#: commands/tablecmds.c:17087 +#: commands/tablecmds.c:17131 #, c-format msgid "\"%s\" is already a partition" msgstr "«%s» ya es una partición" -#: commands/tablecmds.c:17093 +#: commands/tablecmds.c:17137 #, c-format msgid "cannot attach a typed table as partition" msgstr "no puede adjuntar tabla tipada como partición" -#: commands/tablecmds.c:17109 +#: commands/tablecmds.c:17153 #, c-format msgid "cannot attach inheritance child as partition" msgstr "no puede adjuntar hija de herencia como partición" -#: commands/tablecmds.c:17123 +#: commands/tablecmds.c:17167 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "no puede adjuntar ancestro de herencia como partición" -#: commands/tablecmds.c:17157 +#: commands/tablecmds.c:17201 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "no se puede adjuntar una relación temporal como partición de la relación permanente «%s»" -#: commands/tablecmds.c:17165 +#: commands/tablecmds.c:17209 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "no se puede adjuntar una relación permanente como partición de la relación temporal «%s»" -#: commands/tablecmds.c:17173 +#: commands/tablecmds.c:17217 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "no se puede adjuntar como partición de una relación temporal de otra sesión" -#: commands/tablecmds.c:17180 +#: commands/tablecmds.c:17224 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "no se adjuntar una relación temporal de otra sesión como partición" -#: commands/tablecmds.c:17200 +#: commands/tablecmds.c:17244 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "la tabla «%s» contiene la columna «%s» no encontrada en el padre «%s»" -#: commands/tablecmds.c:17203 +#: commands/tablecmds.c:17247 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "La nueva partición sólo puede contener las columnas presentes en el padre." -#: commands/tablecmds.c:17215 +#: commands/tablecmds.c:17259 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "el trigger «%s» impide a la tabla «%s» devenir partición" -#: commands/tablecmds.c:17217 commands/trigger.c:441 +#: commands/tablecmds.c:17261 commands/trigger.c:459 #, c-format msgid "ROW triggers with transition tables are not supported on partitions" msgstr "los triggers ROW con tablas de transición no están soportados en particiones" -#: commands/tablecmds.c:17380 +#: commands/tablecmds.c:17440 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "no se puede adjuntar la tabla foránea «%s» como partición de la tabla particionada «%s»" -#: commands/tablecmds.c:17383 -#, fuzzy, c-format -#| msgid "Table \"%s\" contains unique indexes." +#: commands/tablecmds.c:17443 +#, c-format msgid "Partitioned table \"%s\" contains unique indexes." -msgstr "La tabla «%s» contiene índices únicos." +msgstr "La tabla particionada «%s» contiene índices únicos." -#: commands/tablecmds.c:17703 -#, fuzzy, c-format -#| msgid "a hash-partitioned table may not have a default partition" +#: commands/tablecmds.c:17763 +#, c-format msgid "cannot detach partitions concurrently when a default partition exists" -msgstr "una tabla particionada por hash no puede tener una partición default" +msgstr "no se puede desprender particiones concurrentemente cuando existe una partición por omisión" -#: commands/tablecmds.c:17812 -#, fuzzy, c-format -#| msgid "cannot create index on partitioned table \"%s\" concurrently" +#: commands/tablecmds.c:17872 +#, c-format msgid "partitioned table \"%s\" was removed concurrently" -msgstr "no se puede crear un índice en la tabla particionada «%s» concurrentemente" +msgstr "la tabla particionada «%s» fue eliminada concurrentemente" -#: commands/tablecmds.c:17818 -#, fuzzy, c-format -#| msgid "cannot drop partitioned index \"%s\" concurrently" +#: commands/tablecmds.c:17878 +#, c-format msgid "partition \"%s\" was removed concurrently" -msgstr "no se puede eliminar el índice particionado «%s» concurrentemente" +msgstr "la partición «%s» fue eliminada concurrentemente" -#: commands/tablecmds.c:18272 commands/tablecmds.c:18292 -#: commands/tablecmds.c:18312 commands/tablecmds.c:18331 -#: commands/tablecmds.c:18373 +#: commands/tablecmds.c:18351 commands/tablecmds.c:18371 +#: commands/tablecmds.c:18391 commands/tablecmds.c:18410 +#: commands/tablecmds.c:18452 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "no se puede adjuntar el índice «%s» como partición del índice «%s»" -#: commands/tablecmds.c:18275 +#: commands/tablecmds.c:18354 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "El índice «%s» ya está adjunto a otro índice." -#: commands/tablecmds.c:18295 +#: commands/tablecmds.c:18374 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "El índice «%s» no es un índice en una partición de la tabla «%s»." -#: commands/tablecmds.c:18315 +#: commands/tablecmds.c:18394 #, c-format msgid "The index definitions do not match." msgstr "Las definiciones de los índices no coinciden." -#: commands/tablecmds.c:18334 +#: commands/tablecmds.c:18413 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "El índice «%s» pertenece a una restricción en la tabla «%s», pero no existe una restricción para el índice «%s»." -#: commands/tablecmds.c:18376 +#: commands/tablecmds.c:18455 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "Otro índice ya está adjunto para la partición «%s»." -#: commands/tablecmds.c:18606 -#, fuzzy, c-format -#| msgid "this build does not support compression" +#: commands/tablecmds.c:18685 +#, c-format msgid "column data type %s does not support compression" -msgstr "esta instalación no soporta compresión" +msgstr "el tipo de dato de columna %s no soporta compresión" -#: commands/tablecmds.c:18613 -#, fuzzy, c-format -#| msgid "invalid compression level \"%s\"" +#: commands/tablecmds.c:18692 +#, c-format msgid "invalid compression method \"%s\"" -msgstr "valor de compresión «%s» no válido" +msgstr "método de compresión «%s» no válido" #: commands/tablespace.c:162 commands/tablespace.c:179 #: commands/tablespace.c:190 commands/tablespace.c:198 -#: commands/tablespace.c:650 replication/slot.c:1476 storage/file/copydir.c:47 +#: commands/tablespace.c:636 replication/slot.c:1471 storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" msgstr "no se pudo crear el directorio «%s»: %m" -#: commands/tablespace.c:209 +#: commands/tablespace.c:209 commands/tablespace.c:631 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "no se pudo hacer stat al directorio «%s»: %m" -#: commands/tablespace.c:218 +#: commands/tablespace.c:218 commands/tablespace.c:642 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "«%s» existe pero no es un directorio" @@ -10707,24 +10582,24 @@ msgstr "la ruta «%s» del tablespace es demasiado larga" msgid "tablespace location should not be inside the data directory" msgstr "la ubicación del tablespace no debe estar dentro del directorio de datos" -#: commands/tablespace.c:305 commands/tablespace.c:977 +#: commands/tablespace.c:305 commands/tablespace.c:973 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "el nombre de tablespace «%s» es inaceptable" -#: commands/tablespace.c:307 commands/tablespace.c:978 +#: commands/tablespace.c:307 commands/tablespace.c:974 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "El prefijo «pg_» está reservado para tablespaces del sistema." -#: commands/tablespace.c:326 commands/tablespace.c:999 +#: commands/tablespace.c:326 commands/tablespace.c:995 #, c-format msgid "tablespace \"%s\" already exists" msgstr "el tablespace «%s» ya existe" -#: commands/tablespace.c:444 commands/tablespace.c:960 -#: commands/tablespace.c:1049 commands/tablespace.c:1118 -#: commands/tablespace.c:1264 commands/tablespace.c:1467 +#: commands/tablespace.c:444 commands/tablespace.c:956 +#: commands/tablespace.c:1045 commands/tablespace.c:1114 +#: commands/tablespace.c:1260 commands/tablespace.c:1463 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "no existe el tablespace «%s»" @@ -10735,10 +10610,9 @@ msgid "tablespace \"%s\" does not exist, skipping" msgstr "el tablespace «%s» no existe, omitiendo" #: commands/tablespace.c:478 -#, fuzzy, c-format -#| msgid "role \"%s\" cannot be dropped because some objects depend on it" +#, c-format msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" -msgstr "no se puede eliminar el rol «%s» porque otros objetos dependen de él" +msgstr "no se puede eliminar el tablespace «%s» porque otros objetos dependen de él" #: commands/tablespace.c:537 #, c-format @@ -10760,306 +10634,303 @@ msgstr "Cree este directorio para el tablespace antes de reiniciar el servidor." msgid "could not set permissions on directory \"%s\": %m" msgstr "no se pudo definir los permisos del directorio «%s»: %m" -#: commands/tablespace.c:645 +#: commands/tablespace.c:647 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "el directorio «%s» ya está siendo usado como tablespace" -#: commands/tablespace.c:769 commands/tablespace.c:782 -#: commands/tablespace.c:818 commands/tablespace.c:910 storage/file/fd.c:3161 -#: storage/file/fd.c:3557 +#: commands/tablespace.c:765 commands/tablespace.c:778 +#: commands/tablespace.c:814 commands/tablespace.c:906 storage/file/fd.c:3163 +#: storage/file/fd.c:3559 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "no se pudo eliminar el directorio «%s»: %m" -#: commands/tablespace.c:831 commands/tablespace.c:919 +#: commands/tablespace.c:827 commands/tablespace.c:915 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "no se pudo eliminar el enlace simbólico «%s»: %m" -#: commands/tablespace.c:841 commands/tablespace.c:928 +#: commands/tablespace.c:837 commands/tablespace.c:924 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "«%s» no es un directorio o enlace simbólico" -#: commands/tablespace.c:1123 +#: commands/tablespace.c:1119 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "No existe el tablespace «%s»." -#: commands/tablespace.c:1566 +#: commands/tablespace.c:1562 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "algunos directorios para el tablespace %u no pudieron eliminarse" -#: commands/tablespace.c:1568 +#: commands/tablespace.c:1564 #, c-format msgid "You can remove the directories manually if necessary." msgstr "Puede eliminar los directorios manualmente, si es necesario." -#: commands/trigger.c:198 commands/trigger.c:209 +#: commands/trigger.c:216 commands/trigger.c:227 #, c-format msgid "\"%s\" is a table" msgstr "«%s» es una tabla" -#: commands/trigger.c:200 commands/trigger.c:211 +#: commands/trigger.c:218 commands/trigger.c:229 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "Las tablas no pueden tener disparadores INSTEAD OF." -#: commands/trigger.c:232 +#: commands/trigger.c:250 #, c-format msgid "\"%s\" is a partitioned table" msgstr "«%s» es una tabla particionada" -#: commands/trigger.c:234 +#: commands/trigger.c:252 #, c-format msgid "Triggers on partitioned tables cannot have transition tables." msgstr "Los triggers en tablas particionadas no pueden tener tablas de transición." -#: commands/trigger.c:246 commands/trigger.c:253 commands/trigger.c:423 +#: commands/trigger.c:264 commands/trigger.c:271 commands/trigger.c:441 #, c-format msgid "\"%s\" is a view" msgstr "«%s» es una vista" -#: commands/trigger.c:248 +#: commands/trigger.c:266 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "Las vistas no pueden tener disparadores BEFORE o AFTER a nivel de fila." -#: commands/trigger.c:255 +#: commands/trigger.c:273 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "Las vistas no pueden tener disparadores TRUNCATE." -#: commands/trigger.c:263 commands/trigger.c:270 commands/trigger.c:282 -#: commands/trigger.c:416 +#: commands/trigger.c:281 commands/trigger.c:288 commands/trigger.c:300 +#: commands/trigger.c:434 #, c-format msgid "\"%s\" is a foreign table" msgstr "«%s» es una tabla foránea" -#: commands/trigger.c:265 +#: commands/trigger.c:283 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "Las tablas foráneas no pueden tener disparadores INSTEAD OF." -#: commands/trigger.c:272 +#: commands/trigger.c:290 #, c-format msgid "Foreign tables cannot have TRUNCATE triggers." msgstr "Las tablas foráneas no pueden tener disparadores TRUNCATE." -#: commands/trigger.c:284 +#: commands/trigger.c:302 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "Las tablas foráneas no pueden tener disparadores de restricción." -#: commands/trigger.c:359 +#: commands/trigger.c:377 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "los disparadores TRUNCATE FOR EACH ROW no están soportados" -#: commands/trigger.c:367 +#: commands/trigger.c:385 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "los disparadores INSTEAD OF deben ser FOR EACH ROW" -#: commands/trigger.c:371 +#: commands/trigger.c:389 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "los disparadores INSTEAD OF no pueden tener condiciones WHEN" -#: commands/trigger.c:375 +#: commands/trigger.c:393 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "los disparadores INSTEAD OF no pueden tener listas de columnas" -#: commands/trigger.c:404 +#: commands/trigger.c:422 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "dar nombre a una variable ROW en la cláusula REFERENCING no está soportado" -#: commands/trigger.c:405 +#: commands/trigger.c:423 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "utilice OLD TABLE o NEW TABLE para nombrar tablas de transición." -#: commands/trigger.c:418 +#: commands/trigger.c:436 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Las tablas foráneas no pueden tener tablas de transición." -#: commands/trigger.c:425 +#: commands/trigger.c:443 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Las triggers en vistas no pueden tener tablas de transición." -#: commands/trigger.c:445 +#: commands/trigger.c:463 #, c-format msgid "ROW triggers with transition tables are not supported on inheritance children" msgstr "los triggers ROW con tablas de transición no están soportados con hijas de herencia" -#: commands/trigger.c:451 +#: commands/trigger.c:469 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "el nombre de la tabla de transición solo se puede especificar para un disparador AFTER" -#: commands/trigger.c:456 +#: commands/trigger.c:474 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "los triggers TRUNCATE con tablas de transición no están soportados" -#: commands/trigger.c:473 +#: commands/trigger.c:491 #, c-format msgid "transition tables cannot be specified for triggers with more than one event" msgstr "las tablas de transición no pueden especificarse para triggers con más de un evento" -#: commands/trigger.c:484 +#: commands/trigger.c:502 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "las tablas de transición no pueden especificarse para triggers con lista de columnas" -#: commands/trigger.c:501 +#: commands/trigger.c:519 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "NEW TABLE sólo se puede especificar para un disparador INSERT o UPDATE" -#: commands/trigger.c:506 +#: commands/trigger.c:524 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE no se puede especificar varias veces" -#: commands/trigger.c:516 +#: commands/trigger.c:534 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE sólo se puede especificar para un disparador DELETE o UPDATE" -#: commands/trigger.c:521 +#: commands/trigger.c:539 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE no se puede especificar varias veces" -#: commands/trigger.c:531 +#: commands/trigger.c:549 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "el nombre de OLD TABLE y el nombre de NEW TABLE no pueden ser iguales" -#: commands/trigger.c:595 commands/trigger.c:608 +#: commands/trigger.c:613 commands/trigger.c:626 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "la condición WHEN de un disparador por sentencias no pueden referirse a los valores de las columnas" -#: commands/trigger.c:600 +#: commands/trigger.c:618 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "la condición WHEN de un disparador en INSERT no puede referirse a valores OLD" -#: commands/trigger.c:613 +#: commands/trigger.c:631 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "la condición WHEN de un disparador en DELETE no puede referirse a valores NEW" -#: commands/trigger.c:618 +#: commands/trigger.c:636 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "la condición WHEN de un disparador BEFORE no puede referirse a columnas de sistema de NEW" -#: commands/trigger.c:626 commands/trigger.c:634 +#: commands/trigger.c:644 commands/trigger.c:652 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "la condición WHEN del trigger BEFORE no puede hacer referencia a columnas NEW generadas" -#: commands/trigger.c:627 +#: commands/trigger.c:645 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "Se utiliza una referencia de la tupla completa, y la tabla contiene columnas generadas" -#: commands/trigger.c:741 commands/trigger.c:1450 +#: commands/trigger.c:759 commands/trigger.c:1468 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "ya existe un trigger «%s» para la relación «%s»" -#: commands/trigger.c:755 -#, fuzzy, c-format -#| msgid "trigger \"%s\" for relation \"%s\" does not exist, skipping" +#: commands/trigger.c:773 +#, c-format msgid "trigger \"%s\" for relation \"%s\" is an internal trigger" -msgstr "disparador «%s» para la relación «%s» no existe, omitiendo" +msgstr "disparador «%s» para la relación «%s» es un disparador interno" -#: commands/trigger.c:774 -#, fuzzy, c-format -#| msgid "trigger \"%s\" for relation \"%s\" does not exist, skipping" +#: commands/trigger.c:792 +#, c-format msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" -msgstr "disparador «%s» para la relación «%s» no existe, omitiendo" +msgstr "disparador «%s» para la relación «%s» es un disparador de restricción" -#: commands/trigger.c:1336 commands/trigger.c:1497 commands/trigger.c:1612 +#: commands/trigger.c:1354 commands/trigger.c:1515 commands/trigger.c:1630 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "no existe el trigger «%s» para la tabla «%s»" -#: commands/trigger.c:1580 +#: commands/trigger.c:1598 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "permiso denegado: «%s» es un trigger de sistema" -#: commands/trigger.c:2160 +#: commands/trigger.c:2178 #, c-format msgid "trigger function %u returned null value" msgstr "la función de trigger %u ha retornado un valor null" -#: commands/trigger.c:2220 commands/trigger.c:2434 commands/trigger.c:2673 -#: commands/trigger.c:2977 +#: commands/trigger.c:2238 commands/trigger.c:2452 commands/trigger.c:2691 +#: commands/trigger.c:2995 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "un trigger BEFORE STATEMENT no puede retornar un valor" -#: commands/trigger.c:2294 +#: commands/trigger.c:2312 #, c-format msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" msgstr "mover registros a otra partición durante un trigger BEFORE FOR EACH ROW no está soportado" -#: commands/trigger.c:2295 +#: commands/trigger.c:2313 #, c-format msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "Antes de ejecutar el trigger «%s», la fila iba a estar en la partición «%s.%s»." -#: commands/trigger.c:3043 executor/nodeModifyTable.c:1811 -#: executor/nodeModifyTable.c:1893 +#: commands/trigger.c:3061 executor/nodeModifyTable.c:1824 +#: executor/nodeModifyTable.c:1906 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "el registro a ser actualizado ya fue modificado por una operación disparada por la orden actual" -#: commands/trigger.c:3044 executor/nodeModifyTable.c:1193 -#: executor/nodeModifyTable.c:1267 executor/nodeModifyTable.c:1812 -#: executor/nodeModifyTable.c:1894 +#: commands/trigger.c:3062 executor/nodeModifyTable.c:1206 +#: executor/nodeModifyTable.c:1280 executor/nodeModifyTable.c:1825 +#: executor/nodeModifyTable.c:1907 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "Considere usar un disparador AFTER en lugar de un disparador BEFORE para propagar cambios a otros registros." -#: commands/trigger.c:3073 executor/nodeLockRows.c:229 +#: commands/trigger.c:3091 executor/nodeLockRows.c:229 #: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:228 -#: executor/nodeModifyTable.c:1209 executor/nodeModifyTable.c:1829 -#: executor/nodeModifyTable.c:2059 +#: executor/nodeModifyTable.c:1222 executor/nodeModifyTable.c:1842 +#: executor/nodeModifyTable.c:2072 #, c-format msgid "could not serialize access due to concurrent update" msgstr "no se pudo serializar el acceso debido a un update concurrente" -#: commands/trigger.c:3081 executor/nodeModifyTable.c:1299 -#: executor/nodeModifyTable.c:1911 executor/nodeModifyTable.c:2083 +#: commands/trigger.c:3099 executor/nodeModifyTable.c:1312 +#: executor/nodeModifyTable.c:1924 executor/nodeModifyTable.c:2096 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "no se pudo serializar el acceso debido a un delete concurrente" -#: commands/trigger.c:4142 -#, fuzzy, c-format -#| msgid "cannot create temporary table within security-restricted operation" +#: commands/trigger.c:4160 +#, c-format msgid "cannot fire deferred trigger within security-restricted operation" -msgstr "no se puede crear una tabla temporal dentro una operación restringida por seguridad" +msgstr "no se puede ejecutar un disparador postergado dentro de una operación restringida por seguridad" -#: commands/trigger.c:5185 +#: commands/trigger.c:5203 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "la restricción «%s» no es postergable" -#: commands/trigger.c:5208 +#: commands/trigger.c:5226 #, c-format msgid "constraint \"%s\" does not exist" msgstr "no existe la restricción «%s»" @@ -11211,8 +11082,8 @@ msgstr "la función de salida de modificadores de tipo es inútil sin una funci #: commands/typecmds.c:515 #, c-format -msgid "element type cannot be specified without a valid subscripting procedure" -msgstr "" +msgid "element type cannot be specified without a subscripting function" +msgstr "no se puede especificar tipo de elemento sin una función de subindexación" #: commands/typecmds.c:784 #, c-format @@ -11259,7 +11130,7 @@ msgstr "no se pueden poner restricciones de llave foránea a un dominio" msgid "specifying constraint deferrability not supported for domains" msgstr "no se puede especificar la postergabilidad de las restricciones a un dominio" -#: commands/typecmds.c:1320 utils/cache/typcache.c:2545 +#: commands/typecmds.c:1320 utils/cache/typcache.c:2566 #, c-format msgid "%s is not an enum" msgstr "%s no es un enum" @@ -11289,133 +11160,130 @@ msgstr "no se puede especificar una función canónica sin antes crear un tipo i msgid "Create the type as a shell type, then create its canonicalization function, then do a full CREATE TYPE." msgstr "Cree el tipo como un tipo inconcluso, luego cree su función de canonicalización, luego haga un CREATE TYPE completo." -#: commands/typecmds.c:1982 +#: commands/typecmds.c:1981 #, c-format msgid "type input function %s has multiple matches" msgstr "la función de entrada %s del tipo tiene múltiples coincidencias" -#: commands/typecmds.c:2000 +#: commands/typecmds.c:1999 #, c-format msgid "type input function %s must return type %s" msgstr "la función de entrada %s del tipo debe retornar %s" -#: commands/typecmds.c:2016 +#: commands/typecmds.c:2015 #, c-format msgid "type input function %s should not be volatile" msgstr "la función de entrada %s no debe ser volatile" -#: commands/typecmds.c:2044 +#: commands/typecmds.c:2043 #, c-format msgid "type output function %s must return type %s" msgstr "la función de salida %s del tipo debe retornar %s" -#: commands/typecmds.c:2051 +#: commands/typecmds.c:2050 #, c-format msgid "type output function %s should not be volatile" msgstr "la función de salida %s no debe ser volatile" -#: commands/typecmds.c:2080 +#: commands/typecmds.c:2079 #, c-format msgid "type receive function %s has multiple matches" msgstr "la función de recepción %s del tipo tiene múltiples coincidencias" -#: commands/typecmds.c:2098 +#: commands/typecmds.c:2097 #, c-format msgid "type receive function %s must return type %s" msgstr "la función de recepción %s del tipo debe retornar %s" -#: commands/typecmds.c:2105 +#: commands/typecmds.c:2104 #, c-format msgid "type receive function %s should not be volatile" msgstr "la función «receive» %s del tipo no debe ser volatile" -#: commands/typecmds.c:2133 +#: commands/typecmds.c:2132 #, c-format msgid "type send function %s must return type %s" msgstr "la función «send» %s del tipo debe retornar %s" -#: commands/typecmds.c:2140 +#: commands/typecmds.c:2139 #, c-format msgid "type send function %s should not be volatile" msgstr "la función «send» %s no debe ser volatile" -#: commands/typecmds.c:2167 +#: commands/typecmds.c:2166 #, c-format msgid "typmod_in function %s must return type %s" msgstr "la función typmod_in %s debe retornar tipo %s" -#: commands/typecmds.c:2174 +#: commands/typecmds.c:2173 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "la función de modificadores de tipo %s no debe ser volatile" -#: commands/typecmds.c:2201 +#: commands/typecmds.c:2200 #, c-format msgid "typmod_out function %s must return type %s" msgstr "la función typmod_out %s debe retornar tipo %s" -#: commands/typecmds.c:2208 +#: commands/typecmds.c:2207 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "la función de salida de modificadores de tipo %s no debe ser volatile" -#: commands/typecmds.c:2235 +#: commands/typecmds.c:2234 #, c-format msgid "type analyze function %s must return type %s" msgstr "la función de análisis %s del tipo debe retornar %s" -#: commands/typecmds.c:2264 -#, fuzzy, c-format -#| msgid "type input function %s must return type %s" +#: commands/typecmds.c:2263 +#, c-format msgid "type subscripting function %s must return type %s" -msgstr "la función de entrada %s del tipo debe retornar %s" +msgstr "la función de subindexación %s del tipo debe retornar %s" -#: commands/typecmds.c:2274 +#: commands/typecmds.c:2273 #, c-format msgid "user-defined types cannot use subscripting function %s" -msgstr "" +msgstr "los tipos definidos por el usuario no pueden usar la función de subindexación %s" -#: commands/typecmds.c:2320 +#: commands/typecmds.c:2319 #, c-format msgid "You must specify an operator class for the range type or define a default operator class for the subtype." msgstr "Debe especificar una clase de operadores para el tipo de rango, o definir una clase de operadores por omisión para el subtipo." -#: commands/typecmds.c:2351 +#: commands/typecmds.c:2350 #, c-format msgid "range canonical function %s must return range type" msgstr "la función canónica %s del rango debe retornar tipo de rango" -#: commands/typecmds.c:2357 +#: commands/typecmds.c:2356 #, c-format msgid "range canonical function %s must be immutable" msgstr "la función canónica %s del rango debe ser inmutable" -#: commands/typecmds.c:2393 +#: commands/typecmds.c:2392 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "la función «diff» de subtipo, %s, debe retornar tipo %s" -#: commands/typecmds.c:2400 +#: commands/typecmds.c:2399 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "la función «diff» de subtipo, %s, debe ser inmutable" -#: commands/typecmds.c:2427 +#: commands/typecmds.c:2426 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "el valor de OID de pg_type no se definió en modo de actualización binaria" -#: commands/typecmds.c:2460 -#, fuzzy, c-format -#| msgid "pg_type array OID value not set when in binary upgrade mode" +#: commands/typecmds.c:2459 +#, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" -msgstr "el valor de OID de pg_type no se definió en modo de actualización binaria" +msgstr "el valor de OID de multirango de pg_type no se definió en modo de actualización binaria" -#: commands/typecmds.c:2493 -#, fuzzy, c-format -#| msgid "pg_type array OID value not set when in binary upgrade mode" +#: commands/typecmds.c:2492 +#, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" -msgstr "el valor de OID de pg_type no se definió en modo de actualización binaria" +msgstr "el valor de OID de arreglo de multirango de pg_type no se definió en modo de actualización binaria" #: commands/typecmds.c:2791 #, c-format @@ -11519,10 +11387,9 @@ msgid "must be superuser to create replication users" msgstr "debe ser superusuario para crear usuarios de replicación" #: commands/user.c:308 -#, fuzzy, c-format -#| msgid "must be superuser to create superusers" +#, c-format msgid "must be superuser to create bypassrls users" -msgstr "debe ser superusuario para crear superusuarios" +msgstr "debe ser superusuario para crear usuarios con bypassrls" #: commands/user.c:315 #, c-format @@ -11556,16 +11423,14 @@ msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "el valor de OID de pg_authid no se definió en modo de actualización binaria" #: commands/user.c:722 -#, fuzzy, c-format -#| msgid "must be superuser to change bypassrls attribute" +#, c-format msgid "must be superuser to alter superuser roles or change superuser attribute" -msgstr "debe ser superusuario para cambiar el atributo bypassrls" +msgstr "debe ser superusuario para modificar roles de superusuario o cambiar atributos de superusuario" #: commands/user.c:729 -#, fuzzy, c-format -#| msgid "must be superuser or replication role to use replication slots" +#, c-format msgid "must be superuser to alter replication roles or change replication attribute" -msgstr "debe ser superusuario o rol de replicación para usar slots de replicación" +msgstr "debe ser superusuario para modificar roles de replicación o cambiar atributos de replicación" #: commands/user.c:736 #, c-format @@ -11676,10 +11541,9 @@ msgid "must have admin option on role \"%s\"" msgstr "debe tener opción de admin en rol «%s»" #: commands/user.c:1509 -#, fuzzy, c-format -#| msgid "table \"%s\" cannot be replicated" +#, c-format msgid "role \"%s\" cannot have explicit members" -msgstr "la tabla «%s» no puede replicarse" +msgstr "el rol «%s» no puede tener miembros explícitos" #: commands/user.c:1524 #, c-format @@ -11687,10 +11551,9 @@ msgid "must be superuser to set grantor" msgstr "debe ser superusuario para especificar el cedente (grantor)" #: commands/user.c:1560 -#, fuzzy, c-format -#| msgid "role \"%s\" is not a member of role \"%s\"" +#, c-format msgid "role \"%s\" cannot be a member of any role" -msgstr "el rol «%s» no es un miembro del rol «%s»" +msgstr "el rol «%s» no puede ser miembro de ningún rol" #: commands/user.c:1573 #, c-format @@ -11712,103 +11575,102 @@ msgstr "el rol «%s» no es un miembro del rol «%s»" msgid "unrecognized ANALYZE option \"%s\"" msgstr "opción de ANALYZE «%s» no reconocida" -#: commands/vacuum.c:156 +#: commands/vacuum.c:170 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "la opción parallel requiere un valor entre 0 y %d" -#: commands/vacuum.c:168 -#, fuzzy, c-format -#| msgid "parallel vacuum degree must be between 0 and %d" +#: commands/vacuum.c:182 +#, c-format msgid "parallel workers for vacuum must be between 0 and %d" -msgstr "el grado de paralelismo de vacuum debe estar entre 0 y %d" +msgstr "el número de procesos paralelos para vacuum debe estar entre 0 y %d" -#: commands/vacuum.c:185 +#: commands/vacuum.c:199 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "opción de VACUUM «%s» no reconocida" -#: commands/vacuum.c:208 +#: commands/vacuum.c:222 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULL no puede ser ejecutado en paralelo" -#: commands/vacuum.c:224 +#: commands/vacuum.c:238 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "la opción ANALYZE debe especificarse cuando se provee una lista de columnas" -#: commands/vacuum.c:314 +#: commands/vacuum.c:328 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s no puede ejecutarse desde VACUUM o ANALYZE" -#: commands/vacuum.c:324 +#: commands/vacuum.c:338 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "la opción DISABLE_PAGE_SKIPPING de VACUUM no puede usarse con FULL" -#: commands/vacuum.c:331 +#: commands/vacuum.c:345 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" -msgstr "" +msgstr "se requiere especificar PROCESS_TOAST al hacer VACUUM FULL" -#: commands/vacuum.c:572 +#: commands/vacuum.c:586 #, c-format msgid "skipping \"%s\" --- only superuser can vacuum it" msgstr "omitiendo «%s»: sólo un superusuario puede aplicarle VACUUM" -#: commands/vacuum.c:576 +#: commands/vacuum.c:590 #, c-format msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" msgstr "omitiendo «%s»: sólo un superusuario o el dueño de la base de datos puede aplicarle VACUUM" -#: commands/vacuum.c:580 +#: commands/vacuum.c:594 #, c-format msgid "skipping \"%s\" --- only table or database owner can vacuum it" msgstr "omitiendo «%s»: sólo su dueño o el de la base de datos puede aplicarle VACUUM" -#: commands/vacuum.c:595 +#: commands/vacuum.c:609 #, c-format msgid "skipping \"%s\" --- only superuser can analyze it" msgstr "omitiendo «%s»: sólo un superusuario puede analizarla" -#: commands/vacuum.c:599 +#: commands/vacuum.c:613 #, c-format msgid "skipping \"%s\" --- only superuser or database owner can analyze it" msgstr "omitiendo «%s»: sólo un superusuario o el dueño de la base de datos puede analizarla" -#: commands/vacuum.c:603 +#: commands/vacuum.c:617 #, c-format msgid "skipping \"%s\" --- only table or database owner can analyze it" msgstr "omitiendo «%s»: sólo su dueño o el de la base de datos puede analizarla" -#: commands/vacuum.c:682 commands/vacuum.c:778 +#: commands/vacuum.c:696 commands/vacuum.c:792 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "omitiendo el vacuum de «%s»: el candado no está disponible" -#: commands/vacuum.c:687 +#: commands/vacuum.c:701 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "omitiendo el vacuum de «%s» --- la relación ya no existe" -#: commands/vacuum.c:703 commands/vacuum.c:783 +#: commands/vacuum.c:717 commands/vacuum.c:797 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "omitiendo analyze de «%s»: el candado no está disponible" -#: commands/vacuum.c:708 +#: commands/vacuum.c:722 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "omitiendo analyze de «%s» --- la relación ya no existe" -#: commands/vacuum.c:1026 +#: commands/vacuum.c:1040 #, c-format msgid "oldest xmin is far in the past" msgstr "xmin más antiguo es demasiado antiguo" -#: commands/vacuum.c:1027 +#: commands/vacuum.c:1041 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -11817,32 +11679,32 @@ msgstr "" "Cierre transaciones abiertas pronto para impedir problemas por reciclaje de contadores.\n" "Puede que además necesite comprometer o abortar transacciones preparadas antiguas, o eliminar slots de replicación añejos." -#: commands/vacuum.c:1068 +#: commands/vacuum.c:1082 #, c-format msgid "oldest multixact is far in the past" msgstr "multixact más antiguo es demasiado antiguo" -#: commands/vacuum.c:1069 +#: commands/vacuum.c:1083 #, c-format msgid "Close open transactions with multixacts soon to avoid wraparound problems." msgstr "Cierre transacciones con multixact pronto para prevenir problemas por reciclaje del contador." -#: commands/vacuum.c:1726 +#: commands/vacuum.c:1740 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "algunas bases de datos no han tenido VACUUM en más de 2 mil millones de transacciones" -#: commands/vacuum.c:1727 +#: commands/vacuum.c:1741 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "Puede haber sufrido ya problemas de pérdida de datos por reciclaje del contador de transacciones." -#: commands/vacuum.c:1891 +#: commands/vacuum.c:1905 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "omitiendo «%s»: no se puede aplicar VACUUM a objetos que no son tablas o a tablas especiales de sistema" -#: commands/variable.c:165 utils/misc/guc.c:11625 utils/misc/guc.c:11687 +#: commands/variable.c:165 utils/misc/guc.c:11626 utils/misc/guc.c:11688 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "Palabra clave no reconocida: «%s»." @@ -11938,10 +11800,9 @@ msgid "cannot change client_encoding during a parallel operation" msgstr "no se puede cambiar «client_encoding» durante una operación paralela" #: commands/variable.c:890 -#, fuzzy, c-format -#| msgid "permission denied to set role \"%s\"" +#, c-format msgid "permission will be denied to set role \"%s\"" -msgstr "se ha denegado el permiso para definir el rol «%s»" +msgstr "se denegará el permiso para definir el rol «%s»" #: commands/variable.c:895 #, c-format @@ -11973,27 +11834,27 @@ msgstr "Use ALTER VIEW ... RENAME COLUMN ... para cambiar el nombre de una colum msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "no se puede cambiar el tipo de dato de la columna «%s» de la vista de %s a %s" -#: commands/view.c:441 +#: commands/view.c:438 #, c-format msgid "views must not contain SELECT INTO" msgstr "una vista no puede tener SELECT INTO" -#: commands/view.c:453 +#: commands/view.c:450 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "las vistas no deben contener sentencias que modifiquen datos en WITH" -#: commands/view.c:523 +#: commands/view.c:520 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "CREATE VIEW especifica más nombres de columna que columnas" -#: commands/view.c:531 +#: commands/view.c:528 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "las vistas no pueden ser «unlogged» porque no tienen almacenamiento" -#: commands/view.c:545 +#: commands/view.c:542 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "la vista «%s» será una vista temporal" @@ -12064,7 +11925,7 @@ msgstr "La consulta entrega un valor para una columna eliminada en la posición msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "La tabla tiene tipo %s en posición ordinal %d, pero la consulta esperaba %s." -#: executor/execExpr.c:1110 parser/parse_agg.c:827 +#: executor/execExpr.c:1110 parser/parse_agg.c:820 #, c-format msgid "window function calls cannot be nested" msgstr "no se pueden anidar llamadas a funciones de ventana deslizante" @@ -12088,16 +11949,14 @@ msgstr[0] "no se pueden pasar más de %d argumento a una función" msgstr[1] "no se pueden pasar más de %d argumentos a una función" #: executor/execExpr.c:2866 parser/parse_node.c:277 parser/parse_node.c:327 -#, fuzzy, c-format -#| msgid "cannot subscript type %s because it is not an array" +#, c-format msgid "cannot subscript type %s because it does not support subscripting" -msgstr "no se puede poner subíndices al tipo %s porque no es un array" +msgstr "no se puede poner subíndices al tipo %s porque no soporta subíndices" #: executor/execExpr.c:2994 executor/execExpr.c:3016 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support subscriptions." +#, c-format msgid "type %s does not support subscripted assignment" -msgstr "El servidor (versión %s) no soporta suscripciones." +msgstr "el tipo %s no soporta asignación subindexada" #: executor/execExprInterp.c:1916 #, c-format @@ -12116,8 +11975,8 @@ msgid "Table has type %s, but query expects %s." msgstr "La tabla tiene tipo %s, pero la consulta esperaba %s." #: executor/execExprInterp.c:2003 utils/adt/expandedrecord.c:99 -#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1748 -#: utils/cache/typcache.c:1904 utils/cache/typcache.c:2033 +#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1751 +#: utils/cache/typcache.c:1907 utils/cache/typcache.c:2054 #: utils/fmgr/funcapi.c:458 #, c-format msgid "type %s is not composite" @@ -12138,10 +11997,10 @@ msgstr "no se puede mezclar arrays incompatibles" msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." msgstr "El array con tipo de elemento %s no puede ser incluido en una sentencia ARRAY con tipo de elemento %s." -#: executor/execExprInterp.c:2776 utils/adt/arrayfuncs.c:262 -#: utils/adt/arrayfuncs.c:562 utils/adt/arrayfuncs.c:1304 -#: utils/adt/arrayfuncs.c:3374 utils/adt/arrayfuncs.c:5336 -#: utils/adt/arrayfuncs.c:5853 utils/adt/arraysubs.c:150 +#: executor/execExprInterp.c:2776 utils/adt/arrayfuncs.c:263 +#: utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 +#: utils/adt/arrayfuncs.c:3375 utils/adt/arrayfuncs.c:5371 +#: utils/adt/arrayfuncs.c:5888 utils/adt/arraysubs.c:150 #: utils/adt/arraysubs.c:488 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" @@ -12179,37 +12038,37 @@ msgstr[1] "La fila de la tabla contiene %d atributos, pero la consulta esperaba msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "Discordancia de almacenamiento físico en atributo eliminado en la posición %d." -#: executor/execIndexing.c:571 +#: executor/execIndexing.c:567 #, c-format msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" msgstr "ON CONFLICT no soporta las restricciones únicas o de exclusión postergables como árbitros" -#: executor/execIndexing.c:842 +#: executor/execIndexing.c:838 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "no se pudo crear la restricción de exclusión «%s»" -#: executor/execIndexing.c:845 +#: executor/execIndexing.c:841 #, c-format msgid "Key %s conflicts with key %s." msgstr "La llave %s está en conflicto con la llave %s." -#: executor/execIndexing.c:847 +#: executor/execIndexing.c:843 #, c-format msgid "Key conflicts exist." msgstr "Existe un conflicto de llave." -#: executor/execIndexing.c:853 +#: executor/execIndexing.c:849 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "llave en conflicto viola la restricción de exclusión «%s»" -#: executor/execIndexing.c:856 +#: executor/execIndexing.c:852 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "La llave %s está en conflicto con la llave existente %s." -#: executor/execIndexing.c:858 +#: executor/execIndexing.c:854 #, c-format msgid "Key conflicts with existing key." msgstr "La llave está en conflicto con una llave existente." @@ -12224,38 +12083,38 @@ msgstr "no se puede cambiar la secuencia «%s»" msgid "cannot change TOAST relation \"%s\"" msgstr "no se puede cambiar la relación TOAST «%s»" -#: executor/execMain.c:1031 rewrite/rewriteHandler.c:3041 -#: rewrite/rewriteHandler.c:3824 +#: executor/execMain.c:1031 rewrite/rewriteHandler.c:3064 +#: rewrite/rewriteHandler.c:3861 #, c-format msgid "cannot insert into view \"%s\"" msgstr "no se puede insertar en la vista «%s»" -#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3044 -#: rewrite/rewriteHandler.c:3827 +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3067 +#: rewrite/rewriteHandler.c:3864 #, c-format msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." msgstr "Para posibilitar las inserciones en la vista, provea un disparador INSTEAD OF INSERT o una regla incodicional ON INSERT DO INSTEAD." -#: executor/execMain.c:1039 rewrite/rewriteHandler.c:3049 -#: rewrite/rewriteHandler.c:3832 +#: executor/execMain.c:1039 rewrite/rewriteHandler.c:3072 +#: rewrite/rewriteHandler.c:3869 #, c-format msgid "cannot update view \"%s\"" msgstr "no se puede actualizar la vista «%s»" -#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3052 -#: rewrite/rewriteHandler.c:3835 +#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3075 +#: rewrite/rewriteHandler.c:3872 #, c-format msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." msgstr "Para posibilitar las actualizaciones en la vista, provea un disparador INSTEAD OF UPDATE o una regla incondicional ON UPDATE DO INSTEAD." -#: executor/execMain.c:1047 rewrite/rewriteHandler.c:3057 -#: rewrite/rewriteHandler.c:3840 +#: executor/execMain.c:1047 rewrite/rewriteHandler.c:3080 +#: rewrite/rewriteHandler.c:3877 #, c-format msgid "cannot delete from view \"%s\"" msgstr "no se puede eliminar de la vista «%s»" -#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3060 -#: rewrite/rewriteHandler.c:3843 +#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3083 +#: rewrite/rewriteHandler.c:3880 #, c-format msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." msgstr "Para posibilitar las eliminaciones en la vista, provea un disparador INSTEAD OF DELETE o una regla incondicional ON DELETE DO INSTEAD." @@ -12404,8 +12263,8 @@ msgstr "eliminacón concurrente, reintentando" #: executor/execReplication.c:269 parser/parse_cte.c:502 #: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:720 -#: utils/adt/array_userfuncs.c:859 utils/adt/arrayfuncs.c:3654 -#: utils/adt/arrayfuncs.c:4174 utils/adt/arrayfuncs.c:6166 +#: utils/adt/array_userfuncs.c:859 utils/adt/arrayfuncs.c:3655 +#: utils/adt/arrayfuncs.c:4209 utils/adt/arrayfuncs.c:6201 #: utils/adt/rowtypes.c:1203 #, c-format msgid "could not identify an equality operator for type %s" @@ -12452,10 +12311,9 @@ msgid "rows returned by function are not all of the same row type" msgstr "las filas retornadas por la función no tienen todas el mismo tipo de registro" #: executor/execSRF.c:365 -#, fuzzy, c-format -#| msgid "table-function protocol for materialize mode was not followed" +#, c-format msgid "table-function protocol for value-per-call mode was not followed" -msgstr "no se siguió el protocolo de función tabular para el modo de materialización" +msgstr "no se siguió el protocolo de función tabular para el modo de valor por llamada" #: executor/execSRF.c:373 executor/execSRF.c:667 #, c-format @@ -12491,10 +12349,9 @@ msgstr "Tipo retornado %s en posición ordinal %d, pero la consulta esperaba %s. #: executor/execTuples.c:146 executor/execTuples.c:353 #: executor/execTuples.c:521 executor/execTuples.c:712 -#, fuzzy, c-format -#| msgid "cannot use system column \"%s\" in partition key" +#, c-format msgid "cannot retrieve a system column in this context" -msgstr "no se puede usar la columna de sistema «%s» en llave de particionamiento" +msgstr "no se puede obtener una columna de sistema en este contexto" #: executor/execUtils.c:736 #, c-format @@ -12512,92 +12369,90 @@ msgid "could not determine actual type of argument declared %s" msgstr "no se pudo determinar el tipo de argumento declarado %s" #: executor/functions.c:514 -#, fuzzy, c-format -#| msgid "cannot COPY to/from client in a SQL function" +#, c-format msgid "cannot COPY to/from client in an SQL function" msgstr "no se puede ejecutar COPY desde/a un cliente en una función SQL" #. translator: %s is a SQL statement name #: executor/functions.c:520 -#, fuzzy, c-format -#| msgid "%s is not allowed in a SQL function" +#, c-format msgid "%s is not allowed in an SQL function" msgstr "%s no está permitido en una función SQL" #. translator: %s is a SQL statement name -#: executor/functions.c:528 executor/spi.c:1633 executor/spi.c:2485 +#: executor/functions.c:528 executor/spi.c:1649 executor/spi.c:2538 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "%s no está permitido en una función no-«volatile»" -#: executor/functions.c:1441 +#: executor/functions.c:1442 #, c-format msgid "SQL function \"%s\" statement %d" msgstr "función SQL «%s» en la sentencia %d" -#: executor/functions.c:1467 +#: executor/functions.c:1468 #, c-format msgid "SQL function \"%s\" during startup" msgstr "función SQL «%s» durante el inicio" -#: executor/functions.c:1552 +#: executor/functions.c:1553 #, c-format msgid "calling procedures with output arguments is not supported in SQL functions" msgstr "no está permitido invocar procedimientos con arguments de salida en funciones SQL" -#: executor/functions.c:1685 executor/functions.c:1723 -#: executor/functions.c:1737 executor/functions.c:1827 -#: executor/functions.c:1860 executor/functions.c:1874 +#: executor/functions.c:1686 executor/functions.c:1724 +#: executor/functions.c:1738 executor/functions.c:1828 +#: executor/functions.c:1861 executor/functions.c:1875 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "el tipo de retorno de función declarada para retornar %s no concuerda" -#: executor/functions.c:1687 +#: executor/functions.c:1688 #, c-format msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." msgstr "La sentencia final de la función debe ser un SELECT o INSERT/UPDATE/DELETE RETURNING." -#: executor/functions.c:1725 +#: executor/functions.c:1726 #, c-format msgid "Final statement must return exactly one column." msgstr "La sentencia final debe retornar exactamente una columna." -#: executor/functions.c:1739 +#: executor/functions.c:1740 #, c-format msgid "Actual return type is %s." msgstr "El verdadero tipo de retorno es %s." -#: executor/functions.c:1829 +#: executor/functions.c:1830 #, c-format msgid "Final statement returns too many columns." msgstr "La sentencia final retorna demasiadas columnas." -#: executor/functions.c:1862 +#: executor/functions.c:1863 #, c-format msgid "Final statement returns %s instead of %s at column %d." msgstr "La sentencia final retorna %s en lugar de %s en la columna %d." -#: executor/functions.c:1876 +#: executor/functions.c:1877 #, c-format msgid "Final statement returns too few columns." msgstr "La sentencia final retorna muy pocas columnas." -#: executor/functions.c:1904 +#: executor/functions.c:1905 #, c-format msgid "return type %s is not supported for SQL functions" msgstr "el tipo de retorno %s no es soportado en funciones SQL" -#: executor/nodeAgg.c:3083 executor/nodeAgg.c:3092 executor/nodeAgg.c:3104 +#: executor/nodeAgg.c:3088 executor/nodeAgg.c:3097 executor/nodeAgg.c:3109 #, c-format msgid "unexpected EOF for tape %d: requested %zu bytes, read %zu bytes" msgstr "EOF inesperado para la cinta %d: se requerían %zu bytes, se leyeron %zu bytes" -#: executor/nodeAgg.c:3977 parser/parse_agg.c:666 parser/parse_agg.c:696 +#: executor/nodeAgg.c:3974 parser/parse_agg.c:661 parser/parse_agg.c:689 #, c-format msgid "aggregate function calls cannot be nested" msgstr "no se pueden anidar llamadas a funciones de agregación" -#: executor/nodeAgg.c:4185 executor/nodeWindowAgg.c:2836 +#: executor/nodeAgg.c:4182 executor/nodeWindowAgg.c:2836 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "la función de agregación %u necesita tener tipos de entrada y transición compatibles" @@ -12617,7 +12472,7 @@ msgstr "no se puede rebobinar el archivo temporal del hash-join" msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" msgstr "no se pudo leer el archivo temporal de hash-join: se leyeron sólo %zu de %zu bytes" -#: executor/nodeIndexonlyscan.c:242 +#: executor/nodeIndexonlyscan.c:240 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "no se permiten funciones de ventana deslizante en predicados de índice" @@ -12647,27 +12502,27 @@ msgstr "FULL JOIN sólo está soportado con condiciones que se pueden usar con m msgid "Query has too few columns." msgstr "La consulta tiene muy pocas columnas." -#: executor/nodeModifyTable.c:1192 executor/nodeModifyTable.c:1266 +#: executor/nodeModifyTable.c:1205 executor/nodeModifyTable.c:1279 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "el registro a ser eliminado ya fue modificado por una operación disparada por la orden actual" -#: executor/nodeModifyTable.c:1441 +#: executor/nodeModifyTable.c:1454 #, c-format msgid "invalid ON UPDATE specification" msgstr "especificación ON UPDATE no válida" -#: executor/nodeModifyTable.c:1442 +#: executor/nodeModifyTable.c:1455 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "La tupla de resultado aparecería en una partición diferente que la tupla original." -#: executor/nodeModifyTable.c:2038 +#: executor/nodeModifyTable.c:2051 #, c-format msgid "ON CONFLICT DO UPDATE command cannot affect row a second time" msgstr "la orden ON CONFLICT DO UPDATE no puede afectar el registro una segunda vez" -#: executor/nodeModifyTable.c:2039 +#: executor/nodeModifyTable.c:2052 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "Asegúrese de que ningún registro propuesto para inserción dentro de la misma orden tenga valores duplicados restringidos." @@ -12743,70 +12598,79 @@ msgstr "la posición final del marco no debe ser negativa" msgid "aggregate function %s does not support use as a window function" msgstr "la función de agregación %s no permite ser usada como función ventana" -#: executor/spi.c:237 executor/spi.c:302 +#: executor/spi.c:234 executor/spi.c:299 #, c-format msgid "invalid transaction termination" msgstr "terminación de transacción no válida" -#: executor/spi.c:251 +#: executor/spi.c:248 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "no se puede comprometer mientras hay una subtransacción activa" -#: executor/spi.c:308 +#: executor/spi.c:305 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "no se puede hacer rollback mientras hay una subtransacción activa" -#: executor/spi.c:380 +#: executor/spi.c:377 #, c-format msgid "transaction left non-empty SPI stack" msgstr "transacción dejó un stack SPI no vacío" -#: executor/spi.c:381 executor/spi.c:443 +#: executor/spi.c:378 executor/spi.c:440 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "Revise llamadas a «SPI_finish» faltantes." -#: executor/spi.c:442 +#: executor/spi.c:439 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "subtransacción dejó un stack SPI no vacío" -#: executor/spi.c:1495 +#: executor/spi.c:1507 #, c-format msgid "cannot open multi-query plan as cursor" msgstr "no se puede abrir plan de varias consultas como cursor" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:1500 +#: executor/spi.c:1517 #, c-format msgid "cannot open %s query as cursor" msgstr "no se puede abrir consulta %s como cursor" -#: executor/spi.c:1607 +#: executor/spi.c:1623 #, c-format msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE no está soportado" -#: executor/spi.c:1608 parser/analyze.c:2808 +#: executor/spi.c:1624 parser/analyze.c:2821 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Los cursores declarados SCROLL deben ser READ ONLY." -#: executor/spi.c:2808 -#, fuzzy, c-format -#| msgid "SQL function \"%s\"" +#: executor/spi.c:2377 +#, c-format +msgid "empty query does not return tuples" +msgstr "la consulta vacía no retorna tuplas" + +#. translator: %s is name of a SQL command, eg INSERT +#: executor/spi.c:2451 +#, c-format +msgid "%s query does not return tuples" +msgstr "la consulta «%s» no retorna tuplas" + +#: executor/spi.c:2863 +#, c-format msgid "SQL expression \"%s\"" -msgstr "función SQL «%s»" +msgstr "expresión SQL «%s»" -#: executor/spi.c:2813 -#, fuzzy, c-format -#| msgid "SQL statement \"%s\"" +#: executor/spi.c:2868 +#, c-format msgid "PL/pgSQL assignment \"%s\"" -msgstr "sentencia SQL: «%s»" +msgstr "asignación PL/pgSQL «%s»" -#: executor/spi.c:2816 +#: executor/spi.c:2871 #, c-format msgid "SQL statement \"%s\"" msgstr "sentencia SQL: «%s»" @@ -12937,16 +12801,15 @@ msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "sólo se admiten actualmente políticas PERMISSIVE o RESTRICTIVE." #: gram.y:5380 -#, fuzzy, c-format -#| msgid "nested CREATE EXTENSION is not supported" +#, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" -msgstr "los CREATE EXTENSION anidados no están soportados" +msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER no está soportado" #: gram.y:5417 msgid "duplicate trigger events specified" msgstr "se han especificado eventos de disparador duplicados" -#: gram.y:5558 parser/parse_utilcmd.c:3734 parser/parse_utilcmd.c:3760 +#: gram.y:5558 parser/parse_utilcmd.c:3702 parser/parse_utilcmd.c:3728 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "una restricción declarada INITIALLY DEFERRED debe ser DEFERRABLE" @@ -13122,8 +12985,7 @@ msgid "%s cannot be used as a role name here" msgstr "%s no puede ser usado como nombre de rol aquí" #: gram.y:15369 gram.y:16800 -#, fuzzy, c-format -#| msgid "WITH TIES cannot be specified without ORDER BY clause" +#, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "la opción WITH TIES no puede ser especificada sin una cláusula ORDER BY" @@ -13162,123 +13024,122 @@ msgstr "no se permiten múltiples cláusulas LIMIT" msgid "multiple limit options not allowed" msgstr "no se permiten múltiples opciones limit" -#: gram.y:16808 +#: gram.y:16823 #, c-format msgid "multiple WITH clauses not allowed" msgstr "no se permiten múltiples cláusulas WITH" -#: gram.y:17002 +#: gram.y:17017 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "los argumentos OUT e INOUT no están permitidos en funciones TABLE" -#: gram.y:17098 +#: gram.y:17113 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "no se permiten múltiples cláusulas COLLATE" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17136 gram.y:17149 +#: gram.y:17151 gram.y:17164 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "las restricciones %s no pueden ser marcadas DEFERRABLE" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17162 +#: gram.y:17177 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "las restricciones %s no pueden ser marcadas NOT VALID" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17175 +#: gram.y:17190 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "las restricciones %s no pueden ser marcadas NO INHERIT" #: guc-file.l:314 -#, fuzzy, c-format -#| msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %u" +#, c-format msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" -msgstr "parámetro de configuración «%s» no reconocido en el archivo «%s» línea %u" +msgstr "parámetro de configuración «%s» no reconocido en el archivo «%s» línea %d" -#: guc-file.l:351 utils/misc/guc.c:7360 utils/misc/guc.c:7558 -#: utils/misc/guc.c:7652 utils/misc/guc.c:7746 utils/misc/guc.c:7866 -#: utils/misc/guc.c:7965 +#: guc-file.l:353 utils/misc/guc.c:7361 utils/misc/guc.c:7559 +#: utils/misc/guc.c:7653 utils/misc/guc.c:7747 utils/misc/guc.c:7867 +#: utils/misc/guc.c:7966 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "el parámetro «%s» no se puede cambiar sin reiniciar el servidor" -#: guc-file.l:387 +#: guc-file.l:389 #, c-format msgid "parameter \"%s\" removed from configuration file, reset to default" msgstr "parámetro «%s» eliminado del archivo de configuración, volviendo al valor por omisión" -#: guc-file.l:453 +#: guc-file.l:455 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "el parámetro «%s» fue cambiado a «%s»" -#: guc-file.l:495 +#: guc-file.l:497 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "el archivo de configuración «%s» contiene errores" -#: guc-file.l:500 +#: guc-file.l:502 #, c-format msgid "configuration file \"%s\" contains errors; unaffected changes were applied" msgstr "el archivo de configuración «%s» contiene errores; los cambios no afectados fueron aplicados" -#: guc-file.l:505 +#: guc-file.l:507 #, c-format msgid "configuration file \"%s\" contains errors; no changes were applied" msgstr "el archivo de configuración «%s» contiene errores; no se aplicó ningún cambio" -#: guc-file.l:577 +#: guc-file.l:579 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "nombre de archivo de configuración vacío: «%s»" -#: guc-file.l:594 +#: guc-file.l:596 #, c-format msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" msgstr "no se pudo abrir el archivo de configuración «%s»: nivel de anidamiento máximo excedido" -#: guc-file.l:614 +#: guc-file.l:616 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "recursión de archivos de configuración en «%s»" -#: guc-file.l:630 libpq/hba.c:2251 libpq/hba.c:2665 +#: guc-file.l:632 libpq/hba.c:2251 libpq/hba.c:2665 #, c-format msgid "could not open configuration file \"%s\": %m" msgstr "no se pudo abrir el archivo de configuración «%s»: %m" -#: guc-file.l:641 +#: guc-file.l:643 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "omitiendo el archivo de configuración faltante «%s»" -#: guc-file.l:895 +#: guc-file.l:897 #, c-format msgid "syntax error in file \"%s\" line %u, near end of line" msgstr "error de sintaxis en el archivo «%s» línea %u, cerca del fin de línea" -#: guc-file.l:905 +#: guc-file.l:907 #, c-format msgid "syntax error in file \"%s\" line %u, near token \"%s\"" msgstr "error de sintaxis en el archivo «%s» línea %u, cerca de la palabra «%s»" -#: guc-file.l:925 +#: guc-file.l:927 #, c-format msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "se encontraron demasiados errores de sintaxis, abandonando el archivo «%s»" -#: guc-file.l:980 +#: guc-file.l:982 #, c-format msgid "empty configuration directory name: \"%s\"" msgstr "nombre de directorio de configuración vacío: «%s»" -#: guc-file.l:999 +#: guc-file.l:1001 #, c-format msgid "could not open configuration directory \"%s\": %m" msgstr "no se pudo abrir el directorio de configuración «%s»: %m" @@ -13290,18 +13151,17 @@ msgid "could not access file \"%s\": %m" msgstr "no se pudo acceder al archivo «%s»: %m" #: jsonpath_gram.y:528 jsonpath_scan.l:519 jsonpath_scan.l:530 -#: jsonpath_scan.l:540 jsonpath_scan.l:582 utils/adt/encode.c:435 -#: utils/adt/encode.c:501 utils/adt/jsonfuncs.c:623 utils/adt/varlena.c:339 -#: utils/adt/varlena.c:380 +#: jsonpath_scan.l:540 jsonpath_scan.l:582 utils/adt/encode.c:482 +#: utils/adt/encode.c:547 utils/adt/jsonfuncs.c:623 utils/adt/varlena.c:336 +#: utils/adt/varlena.c:377 #, c-format msgid "invalid input syntax for type %s" msgstr "sintaxis de entrada no válida para tipo %s" #: jsonpath_gram.y:529 -#, fuzzy, c-format -#| msgid "unrecognized flag character \"%c\" in LIKE_REGEX predicate" +#, c-format msgid "unrecognized flag character \"%.*s\" in LIKE_REGEX predicate" -msgstr "parámetro no reconocido «%c» en predicado LIKE_REGEX" +msgstr "parámetro «%.*s» no reconocido en predicado LIKE_REGEX" #: jsonpath_gram.y:583 #, c-format @@ -13557,20 +13417,19 @@ msgid "Connection matched pg_hba.conf line %d: \"%s\"" msgstr "La conexión coincidió con la línea %d de pg_hba.conf: «%s»" #: libpq/auth.c:371 -#, fuzzy, c-format -#| msgid "Connections and Authentication" -msgid "connection was re-authenticated" -msgstr "Conexiones y Autentificación" +#, c-format +msgid "authentication identifier set more than once" +msgstr "identificador de autentificación establecido más de una vez" #: libpq/auth.c:372 #, c-format -msgid "previous ID: \"%s\"; new ID: \"%s\"" -msgstr "" +msgid "previous identifier: \"%s\"; new identifier: \"%s\"" +msgstr "identificador anterior: «%s»; nuevo identificador: «%s»" #: libpq/auth.c:381 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" -msgstr "" +msgstr "conexión autenticada: identidad=«%s» método=%s (%s:%d)" #: libpq/auth.c:420 #, c-format @@ -13583,20 +13442,16 @@ msgid "connection requires a valid client certificate" msgstr "la conexión requiere un certificado de cliente válido" #: libpq/auth.c:462 libpq/auth.c:508 -#, fuzzy -#| msgid "GSSAPI-encrypted connection\n" msgid "GSS encryption" -msgstr "Conexión Cifrada GSSAPI\n" +msgstr "cifrado GSS" #: libpq/auth.c:465 libpq/auth.c:511 -#, fuzzy -#| msgid "SSL on" msgid "SSL encryption" -msgstr "SSL activo" +msgstr "cifrado SSL" #: libpq/auth.c:467 libpq/auth.c:513 msgid "no encryption" -msgstr "" +msgstr "sin cifrado" #. translator: last %s describes encryption state #: libpq/auth.c:473 @@ -13678,10 +13533,9 @@ msgid "expected SASL response, got message type %d" msgstr "se esperaba una respuesta SASL, se obtuvo mensaje de tipo %d" #: libpq/auth.c:1088 libpq/be-secure-gssapi.c:535 -#, fuzzy, c-format -#| msgid "could not send data to client: %m" +#, c-format msgid "could not set environment: %m" -msgstr "no se pudo enviar datos al cliente: %m" +msgstr "no se pudo establecer el ambiente: %m" #: libpq/auth.c:1124 #, c-format @@ -13692,433 +13546,430 @@ msgstr "se esperaba una respuesta GSS, se obtuvo mensaje de tipo %d" msgid "accepting GSS security context failed" msgstr "falló la aceptación del contexto de seguridad GSS" -#: libpq/auth.c:1224 +#: libpq/auth.c:1225 msgid "retrieving GSS user name failed" msgstr "falló la obtención del nombre de usuario GSS" -#: libpq/auth.c:1365 +#: libpq/auth.c:1374 msgid "could not acquire SSPI credentials" msgstr "no se pudo obtener las credenciales SSPI" -#: libpq/auth.c:1390 +#: libpq/auth.c:1399 #, c-format msgid "expected SSPI response, got message type %d" msgstr "se esperaba una respuesta SSPI, se obtuvo mensaje de tipo %d" -#: libpq/auth.c:1468 +#: libpq/auth.c:1477 msgid "could not accept SSPI security context" msgstr "no se pudo aceptar un contexto SSPI" -#: libpq/auth.c:1530 +#: libpq/auth.c:1539 msgid "could not get token from SSPI security context" msgstr "no se pudo obtener un testigo (token) desde el contexto de seguridad SSPI" -#: libpq/auth.c:1669 libpq/auth.c:1688 +#: libpq/auth.c:1678 libpq/auth.c:1697 #, c-format msgid "could not translate name" msgstr "no se pudo traducir el nombre" -#: libpq/auth.c:1701 +#: libpq/auth.c:1710 #, c-format msgid "realm name too long" msgstr "nombre de «realm» demasiado largo" -#: libpq/auth.c:1716 +#: libpq/auth.c:1725 #, c-format msgid "translated account name too long" msgstr "nombre de cuenta traducido demasiado largo" -#: libpq/auth.c:1897 +#: libpq/auth.c:1906 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "no se pudo crear un socket para conexión Ident: %m" -#: libpq/auth.c:1912 +#: libpq/auth.c:1921 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "no se pudo enlazar a la dirección local «%s»: %m" -#: libpq/auth.c:1924 +#: libpq/auth.c:1933 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "no se pudo conectar al servidor Ident en dirección «%s», port %s: %m" -#: libpq/auth.c:1946 +#: libpq/auth.c:1955 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "no se pudo enviar consulta Ident al servidor «%s», port %s: %m" -#: libpq/auth.c:1963 +#: libpq/auth.c:1972 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "no se pudo recibir respuesta Ident desde el servidor «%s», port %s: %m" -#: libpq/auth.c:1973 +#: libpq/auth.c:1982 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "respuesta del servidor Ident en formato no válido: «%s»" -#: libpq/auth.c:2026 +#: libpq/auth.c:2035 #, c-format msgid "peer authentication is not supported on this platform" msgstr "método de autentificación peer no está soportado en esta plataforma" -#: libpq/auth.c:2030 +#: libpq/auth.c:2039 #, c-format msgid "could not get peer credentials: %m" msgstr "no se pudo recibir credenciales: %m" -#: libpq/auth.c:2042 +#: libpq/auth.c:2051 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "no se pudo encontrar el ID del usuario local %ld: %s" -#: libpq/auth.c:2143 +#: libpq/auth.c:2152 #, c-format msgid "error from underlying PAM layer: %s" msgstr "se ha recibido un error de la biblioteca PAM: %s" -#: libpq/auth.c:2154 -#, fuzzy, c-format -#| msgid "unsupported format code: %d" +#: libpq/auth.c:2163 +#, c-format msgid "unsupported PAM conversation %d/\"%s\"" -msgstr "código de formato no soportado: %d" +msgstr "conversación PAM no soportada: %d/«%s»" -#: libpq/auth.c:2214 +#: libpq/auth.c:2223 #, c-format msgid "could not create PAM authenticator: %s" msgstr "no se pudo crear autenticador PAM: %s" -#: libpq/auth.c:2225 +#: libpq/auth.c:2234 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER) falló: %s" -#: libpq/auth.c:2257 +#: libpq/auth.c:2266 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST) falló: %s" -#: libpq/auth.c:2269 +#: libpq/auth.c:2278 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "pam_set_item(PAM_CONV) falló: %s" -#: libpq/auth.c:2282 +#: libpq/auth.c:2291 #, c-format msgid "pam_authenticate failed: %s" msgstr "pam_authenticate falló: %s" -#: libpq/auth.c:2295 +#: libpq/auth.c:2304 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmt falló: %s" -#: libpq/auth.c:2306 +#: libpq/auth.c:2315 #, c-format msgid "could not release PAM authenticator: %s" msgstr "no se pudo liberar autenticador PAM: %s" -#: libpq/auth.c:2386 +#: libpq/auth.c:2395 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "no se pudo inicializar LDAP: código de error %d" -#: libpq/auth.c:2423 +#: libpq/auth.c:2432 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "no se pudo extraer el nombre de dominio de ldapbasedn" -#: libpq/auth.c:2431 +#: libpq/auth.c:2440 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "la autentificación LDAP no pudo encontrar registros DNS SRV para «%s»" -#: libpq/auth.c:2433 +#: libpq/auth.c:2442 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Defina un nombre de servidor LDAP explícitamente." -#: libpq/auth.c:2485 +#: libpq/auth.c:2494 #, c-format msgid "could not initialize LDAP: %s" msgstr "no se pudo inicializar LDAP: %s" -#: libpq/auth.c:2495 +#: libpq/auth.c:2504 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ldaps no está soportado con esta biblioteca LDAP" -#: libpq/auth.c:2503 +#: libpq/auth.c:2512 #, c-format msgid "could not initialize LDAP: %m" msgstr "no se pudo inicializar LDAP: %m" -#: libpq/auth.c:2513 +#: libpq/auth.c:2522 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "no se pudo definir la versión de protocolo LDAP: %s" -#: libpq/auth.c:2553 +#: libpq/auth.c:2562 #, c-format msgid "could not load function _ldap_start_tls_sA in wldap32.dll" msgstr "no se pudo cargar la función _ldap_start_tls_sA en wldap32.dll" -#: libpq/auth.c:2554 +#: libpq/auth.c:2563 #, c-format msgid "LDAP over SSL is not supported on this platform." msgstr "LDAP sobre SSL no está soportado en esta plataforma." -#: libpq/auth.c:2570 +#: libpq/auth.c:2579 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "no se pudo iniciar sesión de LDAP TLS: %s" -#: libpq/auth.c:2641 +#: libpq/auth.c:2650 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "servidor LDAP no especificado, y no hay ldapbasedn" -#: libpq/auth.c:2648 +#: libpq/auth.c:2657 #, c-format msgid "LDAP server not specified" msgstr "servidor LDAP no especificado" -#: libpq/auth.c:2710 +#: libpq/auth.c:2719 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "carácter no válido en nombre de usuario para autentificación LDAP" -#: libpq/auth.c:2727 +#: libpq/auth.c:2736 #, c-format msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" msgstr "no se pudo hacer el enlace LDAP inicial para el ldapbinddb «%s» en el servidor «%s»: %s" -#: libpq/auth.c:2756 +#: libpq/auth.c:2765 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "no se pudo hacer la búsqueda LDAP para el filtro «%s» en el servidor «%s»: %s" -#: libpq/auth.c:2770 +#: libpq/auth.c:2779 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "no existe el usuario LDAP «%s»" -#: libpq/auth.c:2771 +#: libpq/auth.c:2780 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "La búsqueda LDAP para el filtro «%s» en el servidor «%s» no retornó elementos." -#: libpq/auth.c:2775 +#: libpq/auth.c:2784 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "el usuario LDAP «%s» no es única" -#: libpq/auth.c:2776 +#: libpq/auth.c:2785 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." msgstr[0] "La búsqueda LDAP para el filtro «%s» en el servidor «%s» retornó %d elemento." msgstr[1] "La búsqueda LDAP para el filtro «%s» en el servidor «%s» retornó %d elementos." -#: libpq/auth.c:2796 +#: libpq/auth.c:2805 #, c-format msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" msgstr "no se pudo obtener el dn para la primera entrada que coincide con «%s» en el servidor «%s»: %s" -#: libpq/auth.c:2817 +#: libpq/auth.c:2826 #, c-format msgid "could not unbind after searching for user \"%s\" on server \"%s\"" msgstr "no se pudo desconectar (unbind) después de buscar al usuario «%s» en el servidor «%s»" -#: libpq/auth.c:2848 +#: libpq/auth.c:2857 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "falló el inicio de sesión LDAP para el usuario «%s» en el servidor «%s»: %s" -#: libpq/auth.c:2880 +#: libpq/auth.c:2889 #, c-format msgid "LDAP diagnostics: %s" msgstr "Diagnóstico LDAP: %s" -#: libpq/auth.c:2918 +#: libpq/auth.c:2927 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "la autentificación con certificado falló para el usuario «%s»: el certificado de cliente no contiene un nombre de usuario" -#: libpq/auth.c:2939 -#, fuzzy, c-format -#| msgid "certificate authentication failed for user \"%s\"" +#: libpq/auth.c:2948 +#, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" -msgstr "la autentificación por certificado falló para el usuario «%s»" +msgstr "la autentificación por certificado falló para el usuario «%s»: no se pudo obtener el DN del sujeto" -#: libpq/auth.c:2962 -#, fuzzy, c-format -#| msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" +#: libpq/auth.c:2971 +#, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" -msgstr "la validación de certificado (clientcert=verify-full) falló para el usuario «%s»: discordancia de CN" +msgstr "la validación de certificado (clientcert=verify-full) falló para el usuario «%s»: discordancia de DN" -#: libpq/auth.c:2967 +#: libpq/auth.c:2976 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "la validación de certificado (clientcert=verify-full) falló para el usuario «%s»: discordancia de CN" -#: libpq/auth.c:3069 +#: libpq/auth.c:3078 #, c-format msgid "RADIUS server not specified" msgstr "servidor RADIUS no especificado" -#: libpq/auth.c:3076 +#: libpq/auth.c:3085 #, c-format msgid "RADIUS secret not specified" msgstr "secreto RADIUS no especificado" -#: libpq/auth.c:3090 +#: libpq/auth.c:3099 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "la autentificación RADIUS no soporta contraseñas más largas de %d caracteres" -#: libpq/auth.c:3197 libpq/hba.c:2004 +#: libpq/auth.c:3206 libpq/hba.c:2004 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "no se pudo traducir el nombre de servidor RADIUS «%s» a dirección: %s" -#: libpq/auth.c:3211 +#: libpq/auth.c:3220 #, c-format msgid "could not generate random encryption vector" msgstr "no se pudo generar un vector aleatorio de encriptación" -#: libpq/auth.c:3245 +#: libpq/auth.c:3254 #, c-format msgid "could not perform MD5 encryption of password" msgstr "no se pudo efectuar cifrado MD5 de la contraseña" -#: libpq/auth.c:3271 +#: libpq/auth.c:3280 #, c-format msgid "could not create RADIUS socket: %m" msgstr "no se pudo crear el socket RADIUS: %m" -#: libpq/auth.c:3293 +#: libpq/auth.c:3302 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "no se pudo enlazar el socket RADIUS local: %m" -#: libpq/auth.c:3303 +#: libpq/auth.c:3312 #, c-format msgid "could not send RADIUS packet: %m" msgstr "no se pudo enviar el paquete RADIUS: %m" -#: libpq/auth.c:3336 libpq/auth.c:3362 +#: libpq/auth.c:3345 libpq/auth.c:3371 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "se agotó el tiempo de espera de la respuesta RADIUS desde %s" -#: libpq/auth.c:3355 +#: libpq/auth.c:3364 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "no se pudo verificar el estado en el socket %m" -#: libpq/auth.c:3385 +#: libpq/auth.c:3394 #, c-format msgid "could not read RADIUS response: %m" msgstr "no se pudo leer la respuesta RADIUS: %m" -#: libpq/auth.c:3398 libpq/auth.c:3402 +#: libpq/auth.c:3407 libpq/auth.c:3411 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "la respuesta RADIUS desde %s fue enviada desde el port incorrecto: %d" -#: libpq/auth.c:3411 +#: libpq/auth.c:3420 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "la respuesta RADIUS desde %s es demasiado corta: %d" -#: libpq/auth.c:3418 +#: libpq/auth.c:3427 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "la respuesta RADIUS desde %ss tiene largo corrupto: %d (largo real %d)" -#: libpq/auth.c:3426 +#: libpq/auth.c:3435 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "la respuesta RADIUS desde %s es a una petición diferente: %d (debería ser %d)" -#: libpq/auth.c:3451 +#: libpq/auth.c:3460 #, c-format msgid "could not perform MD5 encryption of received packet" msgstr "no se pudo realizar cifrado MD5 del paquete recibido" -#: libpq/auth.c:3460 +#: libpq/auth.c:3469 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "la respuesta RADIUS desde %s tiene firma MD5 incorrecta" -#: libpq/auth.c:3478 +#: libpq/auth.c:3487 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "la respuesta RADIUS desde %s tiene código no válido (%d) para el usuario «%s»" -#: libpq/be-fsstubs.c:119 libpq/be-fsstubs.c:150 libpq/be-fsstubs.c:178 -#: libpq/be-fsstubs.c:204 libpq/be-fsstubs.c:229 libpq/be-fsstubs.c:277 -#: libpq/be-fsstubs.c:300 libpq/be-fsstubs.c:553 +#: libpq/be-fsstubs.c:128 libpq/be-fsstubs.c:157 libpq/be-fsstubs.c:185 +#: libpq/be-fsstubs.c:211 libpq/be-fsstubs.c:236 libpq/be-fsstubs.c:274 +#: libpq/be-fsstubs.c:297 libpq/be-fsstubs.c:545 #, c-format msgid "invalid large-object descriptor: %d" msgstr "el descriptor de objeto grande no es válido: %d" -#: libpq/be-fsstubs.c:161 +#: libpq/be-fsstubs.c:168 #, c-format msgid "large object descriptor %d was not opened for reading" msgstr "el descriptor de objeto grande %d no fue abierto para lectura" -#: libpq/be-fsstubs.c:185 libpq/be-fsstubs.c:560 +#: libpq/be-fsstubs.c:192 libpq/be-fsstubs.c:552 #, c-format msgid "large object descriptor %d was not opened for writing" msgstr "el descriptor de objeto grande %d no fue abierto para escritura" -#: libpq/be-fsstubs.c:212 +#: libpq/be-fsstubs.c:219 #, c-format msgid "lo_lseek result out of range for large-object descriptor %d" msgstr "resultado de lo_lseek fuera de rango para el descriptor de objeto grande %d" -#: libpq/be-fsstubs.c:285 +#: libpq/be-fsstubs.c:282 #, c-format msgid "lo_tell result out of range for large-object descriptor %d" msgstr "resultado de lo_tell fuera de rango para el descriptor de objeto grande %d" -#: libpq/be-fsstubs.c:432 +#: libpq/be-fsstubs.c:424 #, c-format msgid "could not open server file \"%s\": %m" msgstr "no se pudo abrir el archivo de servidor «%s»: %m" -#: libpq/be-fsstubs.c:454 +#: libpq/be-fsstubs.c:447 #, c-format msgid "could not read server file \"%s\": %m" msgstr "no se pudo leer el archivo de servidor «%s»: %m" -#: libpq/be-fsstubs.c:514 +#: libpq/be-fsstubs.c:506 #, c-format msgid "could not create server file \"%s\": %m" msgstr "no se pudo crear el archivo del servidor «%s»: %m" -#: libpq/be-fsstubs.c:526 +#: libpq/be-fsstubs.c:518 #, c-format msgid "could not write server file \"%s\": %m" msgstr "no se pudo escribir el archivo del servidor «%s»: %m" -#: libpq/be-fsstubs.c:760 +#: libpq/be-fsstubs.c:758 #, c-format msgid "large object read request is too large" msgstr "el tamaño de petición de lectura de objeto grande es muy grande" -#: libpq/be-fsstubs.c:802 utils/adt/genfile.c:267 utils/adt/genfile.c:306 +#: libpq/be-fsstubs.c:800 utils/adt/genfile.c:267 utils/adt/genfile.c:306 #: utils/adt/genfile.c:342 #, c-format msgid "requested length cannot be negative" msgstr "el tamaño solicitado no puede ser negativo" -#: libpq/be-fsstubs.c:855 storage/large_object/inv_api.c:297 -#: storage/large_object/inv_api.c:309 storage/large_object/inv_api.c:513 -#: storage/large_object/inv_api.c:624 storage/large_object/inv_api.c:814 +#: libpq/be-fsstubs.c:851 storage/large_object/inv_api.c:299 +#: storage/large_object/inv_api.c:311 storage/large_object/inv_api.c:508 +#: storage/large_object/inv_api.c:619 storage/large_object/inv_api.c:809 #, c-format msgid "permission denied for large object %u" msgstr "permiso denegado al objeto grande %u" @@ -14266,16 +14117,14 @@ msgid "could not load SSL certificate revocation list file \"%s\": %s" msgstr "no se pudo cargar el archivo de lista de revocación de certificados SSL «%s»: %s" #: libpq/be-secure-openssl.c:352 -#, fuzzy, c-format -#| msgid "could not load SSL certificate revocation list file \"%s\": %s" +#, c-format msgid "could not load SSL certificate revocation list directory \"%s\": %s" -msgstr "no se pudo cargar el archivo de lista de revocación de certificados SSL «%s»: %s" +msgstr "no se pudo cargar el directorio de lista de revocación de certificados SSL «%s»: %s" #: libpq/be-secure-openssl.c:360 -#, fuzzy, c-format -#| msgid "could not load SSL certificate revocation list file \"%s\": %s" +#, c-format msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" -msgstr "no se pudo cargar el archivo de lista de revocación de certificados SSL «%s»: %s" +msgstr "no se pudo cargar el archivo de lista de revocación de certificados SSL «%s» o directorio «%s»: %s" #: libpq/be-secure-openssl.c:418 #, c-format @@ -14324,85 +14173,83 @@ msgid "SSL certificate's common name contains embedded null" msgstr "el «common name» del certificado SSL contiene un carácter null" #: libpq/be-secure-openssl.c:640 -#, fuzzy, c-format -#| msgid "SSL certificate's name contains embedded null\n" +#, c-format msgid "SSL certificate's distinguished name contains embedded null" -msgstr "el elemento de nombre en el certificado SSL contiene un carácter null\n" +msgstr "el elemento de nombre distinguido en el certificado SSL contiene un carácter null" #: libpq/be-secure-openssl.c:723 libpq/be-secure-openssl.c:782 #, c-format msgid "SSL error: %s" msgstr "error de SSL: %s" -#: libpq/be-secure-openssl.c:963 +#: libpq/be-secure-openssl.c:964 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "no se pudo abrir el archivo de parámetros DH «%s»: %m" -#: libpq/be-secure-openssl.c:975 +#: libpq/be-secure-openssl.c:976 #, c-format msgid "could not load DH parameters file: %s" msgstr "no se pudo cargar el archivo de parámetros DH: %s" -#: libpq/be-secure-openssl.c:985 +#: libpq/be-secure-openssl.c:986 #, c-format msgid "invalid DH parameters: %s" msgstr "parámetros DH no válidos: %s" -#: libpq/be-secure-openssl.c:994 +#: libpq/be-secure-openssl.c:995 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "parámetros DH no válidos: p no es primo" -#: libpq/be-secure-openssl.c:1003 +#: libpq/be-secure-openssl.c:1004 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "parámetros DH no válidos: no hay generador apropiado o primo seguro" -#: libpq/be-secure-openssl.c:1164 +#: libpq/be-secure-openssl.c:1165 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: no se pudo cargar los parámetros DH" -#: libpq/be-secure-openssl.c:1172 +#: libpq/be-secure-openssl.c:1173 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: no se pudo definir los parámetros DH: %s" -#: libpq/be-secure-openssl.c:1199 +#: libpq/be-secure-openssl.c:1200 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: nombre de curva no reconocida: %s" -#: libpq/be-secure-openssl.c:1208 +#: libpq/be-secure-openssl.c:1209 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: no se pudo crear la llave" -#: libpq/be-secure-openssl.c:1236 +#: libpq/be-secure-openssl.c:1237 msgid "no SSL error reported" msgstr "código de error SSL no reportado" -#: libpq/be-secure-openssl.c:1240 +#: libpq/be-secure-openssl.c:1241 #, c-format msgid "SSL error code %lu" msgstr "código de error SSL %lu" -#: libpq/be-secure-openssl.c:1394 +#: libpq/be-secure-openssl.c:1395 #, c-format -msgid "failed to create BIO" -msgstr "" +msgid "could not create BIO" +msgstr "no se pudo crear BIO" -#: libpq/be-secure-openssl.c:1404 +#: libpq/be-secure-openssl.c:1405 #, c-format msgid "could not get NID for ASN1_OBJECT object" -msgstr "" +msgstr "no se pudo obtener NID para objeto ASN1_OBJECT" -#: libpq/be-secure-openssl.c:1412 -#, fuzzy, c-format -#| msgid "could not create LDAP structure\n" +#: libpq/be-secure-openssl.c:1413 +#, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" -msgstr "no se pudo crear estructura LDAP\n" +msgstr "no se pudo convertir NID %d en una estructura ASN1_OBJECT" #: libpq/be-secure.c:209 libpq/be-secure.c:305 #, c-format @@ -14450,10 +14297,9 @@ msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" msgstr "no se pudo abrir el archivo secundario de autentificación «@%s» como «%s»: %m" #: libpq/hba.c:859 -#, fuzzy, c-format -#| msgid "error during file seek: %m" +#, c-format msgid "error enumerating network interfaces: %m" -msgstr "error durante el posicionamiento (seek) en el archivo: %m" +msgstr "error al enumerar interfaces de red: %m" #. translator: the second %s is a list of auth methods #: libpq/hba.c:886 @@ -14524,10 +14370,9 @@ msgid "hostssl record cannot match because SSL is not supported by this build" msgstr "el registro hostssl no puede coincidir porque SSL no está soportado en esta instalación" #: libpq/hba.c:1042 -#, fuzzy, c-format -#| msgid "Compile with --with-openssl to use SSL connections." +#, c-format msgid "Compile with --with-ssl to use SSL connections." -msgstr "Compile con --with-openssl para usar conexiones SSL." +msgstr "Compile con --with-ssl para usar conexiones SSL." #: libpq/hba.c:1054 #, c-format @@ -14680,22 +14525,19 @@ msgid "list of RADIUS secrets cannot be empty" msgstr "la lista de secretos RADIUS no puede ser vacía" #: libpq/hba.c:1638 -#, fuzzy, c-format -#| msgid "the number of %s (%d) must be 1 or the same as the number of %s (%d)" +#, c-format msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" -msgstr "el número de %s (%d) debe ser 1 o igual al número de %s (%d)" +msgstr "el número de secretos RADIUS (%d) debe ser 1 o igual al número de servidores RADIUS (%d)" #: libpq/hba.c:1654 -#, fuzzy, c-format -#| msgid "the number of %s (%d) must be 1 or the same as the number of %s (%d)" +#, c-format msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" -msgstr "el número de %s (%d) debe ser 1 o igual al número de %s (%d)" +msgstr "el número de puertos RADIUS (%d) debe ser 1 o igual al número de servidores RADIUS (%d)" #: libpq/hba.c:1670 -#, fuzzy, c-format -#| msgid "the number of %s (%d) must be 1 or the same as the number of %s (%d)" +#, c-format msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" -msgstr "el número de %s (%d) debe ser 1 o igual al número de %s (%d)" +msgstr "el número de identificadores RADIUS (%d) debe ser 1 o igual al número de servidores RADIUS (%d)" #: libpq/hba.c:1717 msgid "ident, peer, gssapi, sspi, and cert" @@ -14707,10 +14549,9 @@ msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert sólo puede ser configurado en líneas «hostssl»" #: libpq/hba.c:1743 -#, fuzzy, c-format -#| msgid "clientcert can not be set to \"no-verify\" when using \"cert\" authentication" +#, c-format msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" -msgstr "clientcert no puede establecerse a «no-verify» cuando se emplea autentificación «cert»" +msgstr "clientcert solo acepta «verify-full» cuando se emplea autentificación «cert»" #: libpq/hba.c:1756 #, c-format @@ -14718,16 +14559,14 @@ msgid "invalid value for clientcert: \"%s\"" msgstr "valor no válido para el parámetro clientcert: «%s»" #: libpq/hba.c:1768 -#, fuzzy, c-format -#| msgid "clientcert can only be configured for \"hostssl\" rows" +#, c-format msgid "clientname can only be configured for \"hostssl\" rows" -msgstr "clientcert sólo puede ser configurado en líneas «hostssl»" +msgstr "clientname solo puede ser configurado en líneas «hostssl»" #: libpq/hba.c:1787 -#, fuzzy, c-format -#| msgid "invalid value for clientcert: \"%s\"" +#, c-format msgid "invalid value for clientname: \"%s\"" -msgstr "valor no válido para el parámetro clientcert: «%s»" +msgstr "valor no válido para el parámetro clientname: «%s»" #: libpq/hba.c:1821 #, c-format @@ -14832,178 +14671,171 @@ msgstr "no se pudo abrir el archivo de mapa de usuarios «%s»: %m" msgid "could not set socket to nonblocking mode: %m" msgstr "no se pudo establecer el socket en modo no bloqueante: %m" -#: libpq/pqcomm.c:362 +#: libpq/pqcomm.c:377 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "la ruta al socket de dominio Unix «%s» es demasiado larga (máximo %d bytes)" -#: libpq/pqcomm.c:383 +#: libpq/pqcomm.c:398 #, c-format msgid "could not translate host name \"%s\", service \"%s\" to address: %s" msgstr "no se pudo traducir el nombre de host «%s», servicio «%s» a dirección: %s" -#: libpq/pqcomm.c:387 +#: libpq/pqcomm.c:402 #, c-format msgid "could not translate service \"%s\" to address: %s" msgstr "no se pudo traducir el servicio «%s» a dirección: %s" -#: libpq/pqcomm.c:414 +#: libpq/pqcomm.c:429 #, c-format msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" msgstr "no se pudo enlazar a todas las direcciones pedidas: MAXLISTEN (%d) fue excedido" -#: libpq/pqcomm.c:423 +#: libpq/pqcomm.c:438 msgid "IPv4" msgstr "IPv4" -#: libpq/pqcomm.c:427 +#: libpq/pqcomm.c:442 msgid "IPv6" msgstr "IPv6" -#: libpq/pqcomm.c:432 +#: libpq/pqcomm.c:447 msgid "Unix" msgstr "Unix" -#: libpq/pqcomm.c:437 +#: libpq/pqcomm.c:452 #, c-format msgid "unrecognized address family %d" msgstr "la familia de direcciones %d no reconocida" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:463 +#: libpq/pqcomm.c:478 #, c-format msgid "could not create %s socket for address \"%s\": %m" msgstr "no se pudo crear el socket %s de escucha para la dirección «%s»: %m" #. translator: third %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:489 libpq/pqcomm.c:507 -#, fuzzy, c-format -#| msgid "setsockopt(IPV6_V6ONLY) failed for %s address \"%s\": %m" +#: libpq/pqcomm.c:504 libpq/pqcomm.c:522 +#, c-format msgid "%s(%s) failed for %s address \"%s\": %m" -msgstr "setsockopt(IPV6_V6ONLY) falló para la dirección %s «%s»: %m" +msgstr "%s(%s) falló para la dirección %s «%s»: %m" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:530 +#: libpq/pqcomm.c:545 #, c-format msgid "could not bind %s address \"%s\": %m" msgstr "no se pudo enlazar a la dirección %s «%s»: %m" -#: libpq/pqcomm.c:534 -#, fuzzy, c-format -#| msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." +#: libpq/pqcomm.c:549 +#, c-format msgid "Is another postmaster already running on port %d?" -msgstr "¿Hay otro postmaster corriendo en el puerto %d? Si no, aguarde unos segundos y reintente." +msgstr "¿Hay otro postmaster corriendo en el puerto %d?" -#: libpq/pqcomm.c:536 +#: libpq/pqcomm.c:551 #, c-format msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." msgstr "¿Hay otro postmaster corriendo en el puerto %d? Si no, aguarde unos segundos y reintente." #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:569 +#: libpq/pqcomm.c:584 #, c-format msgid "could not listen on %s address \"%s\": %m" msgstr "no se pudo escuchar en la dirección %s «%s»: %m" -#: libpq/pqcomm.c:578 +#: libpq/pqcomm.c:593 #, c-format msgid "listening on Unix socket \"%s\"" msgstr "escuchando en el socket Unix «%s»" #. translator: first %s is IPv4 or IPv6 -#: libpq/pqcomm.c:584 +#: libpq/pqcomm.c:599 #, c-format msgid "listening on %s address \"%s\", port %d" msgstr "escuchando en la dirección %s «%s», port %d" -#: libpq/pqcomm.c:675 +#: libpq/pqcomm.c:690 #, c-format msgid "group \"%s\" does not exist" msgstr "no existe el grupo «%s»" -#: libpq/pqcomm.c:685 +#: libpq/pqcomm.c:700 #, c-format msgid "could not set group of file \"%s\": %m" msgstr "no se pudo definir el grupo del archivo «%s»: %m" -#: libpq/pqcomm.c:696 +#: libpq/pqcomm.c:711 #, c-format msgid "could not set permissions of file \"%s\": %m" msgstr "no se pudo definir los permisos del archivo «%s»: %m" -#: libpq/pqcomm.c:726 +#: libpq/pqcomm.c:741 #, c-format msgid "could not accept new connection: %m" msgstr "no se pudo aceptar una nueva conexión: %m" -#: libpq/pqcomm.c:766 libpq/pqcomm.c:775 libpq/pqcomm.c:807 libpq/pqcomm.c:817 -#: libpq/pqcomm.c:1630 libpq/pqcomm.c:1675 libpq/pqcomm.c:1715 -#: libpq/pqcomm.c:1759 libpq/pqcomm.c:1798 libpq/pqcomm.c:1837 -#: libpq/pqcomm.c:1873 libpq/pqcomm.c:1912 postmaster/pgstat.c:618 -#: postmaster/pgstat.c:629 -#, fuzzy, c-format -#| msgid "%s failed: %m" +#: libpq/pqcomm.c:781 libpq/pqcomm.c:790 libpq/pqcomm.c:822 libpq/pqcomm.c:832 +#: libpq/pqcomm.c:1657 libpq/pqcomm.c:1702 libpq/pqcomm.c:1742 +#: libpq/pqcomm.c:1786 libpq/pqcomm.c:1825 libpq/pqcomm.c:1864 +#: libpq/pqcomm.c:1900 libpq/pqcomm.c:1939 postmaster/pgstat.c:619 +#: postmaster/pgstat.c:630 +#, c-format msgid "%s(%s) failed: %m" -msgstr "%s falló: %m" +msgstr "%s(%s) falló: %m" -#: libpq/pqcomm.c:921 +#: libpq/pqcomm.c:936 #, c-format msgid "there is no client connection" msgstr "no hay conexión de cliente" -#: libpq/pqcomm.c:972 libpq/pqcomm.c:1068 +#: libpq/pqcomm.c:987 libpq/pqcomm.c:1083 #, c-format msgid "could not receive data from client: %m" msgstr "no se pudo recibir datos del cliente: %m" -#: libpq/pqcomm.c:1161 tcop/postgres.c:4290 +#: libpq/pqcomm.c:1188 tcop/postgres.c:4292 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "terminando la conexión por pérdida de sincronía del protocolo" -#: libpq/pqcomm.c:1227 +#: libpq/pqcomm.c:1254 #, c-format msgid "unexpected EOF within message length word" msgstr "EOF inesperado dentro de la palabra de tamaño del mensaje" -#: libpq/pqcomm.c:1237 +#: libpq/pqcomm.c:1264 #, c-format msgid "invalid message length" msgstr "el largo de mensaje no es válido" -#: libpq/pqcomm.c:1259 libpq/pqcomm.c:1272 +#: libpq/pqcomm.c:1286 libpq/pqcomm.c:1299 #, c-format msgid "incomplete message from client" msgstr "mensaje incompleto del cliente" -#: libpq/pqcomm.c:1383 +#: libpq/pqcomm.c:1410 #, c-format msgid "could not send data to client: %m" msgstr "no se pudo enviar datos al cliente: %m" -#: libpq/pqcomm.c:1598 -#, fuzzy, c-format -#| msgid "pgpipe: getsockname() failed: error code %d" +#: libpq/pqcomm.c:1625 +#, c-format msgid "%s(%s) failed: error code %d" -msgstr "pgpipe: getsockname() falló: código de error %d" +msgstr "%s(%s) falló: código de error %d" -#: libpq/pqcomm.c:1687 -#, fuzzy, c-format -#| msgid "using recovery command file \"%s\" is not supported" +#: libpq/pqcomm.c:1714 +#, c-format msgid "setting the keepalive idle time is not supported" -msgstr "el uso del archivo de configuración de recuperación «%s» no está soportado" +msgstr "establecer el tiempo de inactividad para keepalive no está soportado" -#: libpq/pqcomm.c:1771 libpq/pqcomm.c:1846 libpq/pqcomm.c:1921 -#, fuzzy, c-format -#| msgid "log format \"%s\" is not supported" +#: libpq/pqcomm.c:1798 libpq/pqcomm.c:1873 libpq/pqcomm.c:1948 +#, c-format msgid "%s(%s) not supported" -msgstr "el formato de log «%s» no está soportado" +msgstr "%s(%s) no está soportado" -#: libpq/pqcomm.c:1956 -#, fuzzy, c-format -#| msgid "could not set SSL socket: %s" +#: libpq/pqcomm.c:1983 +#, c-format msgid "could not poll socket: %m" -msgstr "no se definir un socket SSL: %s" +msgstr "no se pudo monitorear socket: %m" #: libpq/pqformat.c:406 #, c-format @@ -15011,7 +14843,7 @@ msgid "no data left in message" msgstr "no hay datos restantes en el mensaje" #: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 -#: utils/adt/arrayfuncs.c:1481 utils/adt/rowtypes.c:588 +#: utils/adt/arrayfuncs.c:1482 utils/adt/rowtypes.c:588 #, c-format msgid "insufficient data left in message" msgstr "los datos restantes del mensaje son insuficientes" @@ -15328,14 +15160,13 @@ msgstr "el tipo de nodo extensible «%s» ya existe" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods «%s» no fue registrado" -#: nodes/makefuncs.c:150 -#, fuzzy, c-format -#| msgid "\"%s\" is not a composite type" +#: nodes/makefuncs.c:150 statistics/extended_stats.c:2293 +#, c-format msgid "relation \"%s\" does not have a composite type" -msgstr "«%s» no es un tipo compuesto" +msgstr "la relación «%s» no tiene un tipo compuesto" -#: nodes/nodeFuncs.c:114 nodes/nodeFuncs.c:145 parser/parse_coerce.c:2472 -#: parser/parse_coerce.c:2584 parser/parse_coerce.c:2630 +#: nodes/nodeFuncs.c:114 nodes/nodeFuncs.c:145 parser/parse_coerce.c:2503 +#: parser/parse_coerce.c:2641 parser/parse_coerce.c:2688 #: parser/parse_expr.c:2021 parser/parse_func.c:710 parser/parse_oper.c:883 #: utils/fmgr/funcapi.c:558 #, c-format @@ -15343,16 +15174,14 @@ msgid "could not find array type for data type %s" msgstr "no se pudo encontrar un tipo de array para el tipo de dato %s" #: nodes/params.c:417 -#, fuzzy, c-format -#| msgid "extended query \"%s\" with parameters: %s" +#, c-format msgid "portal \"%s\" with parameters: %s" -msgstr "consulta extendida «%s» con parámetros: %s" +msgstr "portal «%s» con parámetros: %s" #: nodes/params.c:420 -#, fuzzy, c-format -#| msgid "extended query with parameters: %s" +#, c-format msgid "unnamed portal with parameters: %s" -msgstr "consulta extendida con parámetros: %s" +msgstr "portal sin nombre con parámetros: %s" #: optimizer/path/joinrels.c:855 #, c-format @@ -15366,49 +15195,49 @@ msgid "%s cannot be applied to the nullable side of an outer join" msgstr "%s no puede ser aplicado al lado nulable de un outer join" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1315 parser/analyze.c:1677 parser/analyze.c:1921 -#: parser/analyze.c:3099 +#: optimizer/plan/planner.c:1316 parser/analyze.c:1677 parser/analyze.c:1933 +#: parser/analyze.c:3112 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s no está permitido con UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:1978 optimizer/plan/planner.c:3634 +#: optimizer/plan/planner.c:1979 optimizer/plan/planner.c:3635 #, c-format msgid "could not implement GROUP BY" msgstr "no se pudo implementar GROUP BY" -#: optimizer/plan/planner.c:1979 optimizer/plan/planner.c:3635 -#: optimizer/plan/planner.c:4392 optimizer/prep/prepunion.c:1046 +#: optimizer/plan/planner.c:1980 optimizer/plan/planner.c:3636 +#: optimizer/plan/planner.c:4393 optimizer/prep/prepunion.c:1046 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "Algunos de los tipos sólo soportan hashing, mientras que otros sólo soportan ordenamiento." -#: optimizer/plan/planner.c:4391 +#: optimizer/plan/planner.c:4392 #, c-format msgid "could not implement DISTINCT" msgstr "no se pudo implementar DISTINCT" -#: optimizer/plan/planner.c:5239 +#: optimizer/plan/planner.c:5240 #, c-format msgid "could not implement window PARTITION BY" msgstr "No se pudo implementar PARTITION BY de ventana" -#: optimizer/plan/planner.c:5240 +#: optimizer/plan/planner.c:5241 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Las columnas de particionamiento de ventana deben de tipos que se puedan ordenar." -#: optimizer/plan/planner.c:5244 +#: optimizer/plan/planner.c:5245 #, c-format msgid "could not implement window ORDER BY" msgstr "no se pudo implementar ORDER BY de ventana" -#: optimizer/plan/planner.c:5245 +#: optimizer/plan/planner.c:5246 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Las columnas de ordenamiento de ventana debe ser de tipos que se puedan ordenar." -#: optimizer/plan/setrefs.c:479 +#: optimizer/plan/setrefs.c:516 #, c-format msgid "too many range table entries" msgstr "demasiadas «range table entries»" @@ -15429,7 +15258,7 @@ msgstr "Todos los tipos de dato de las columnas deben ser tipos de los que se pu msgid "could not implement %s" msgstr "no se pudo implementar %s" -#: optimizer/util/clauses.c:4721 +#: optimizer/util/clauses.c:4729 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "función SQL «%s», durante expansión en línea" @@ -15485,7 +15314,7 @@ msgid "SELECT ... INTO is not allowed here" msgstr "SELECT ... INTO no está permitido aquí" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1580 parser/analyze.c:3278 +#: parser/analyze.c:1580 parser/analyze.c:3306 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s no puede ser aplicado a VALUES" @@ -15505,176 +15334,171 @@ msgstr "Sólo nombres de columna del resultado pueden usarse, no expresiones o f msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." msgstr "Agregue la función o expresión a todos los SELECT, o mueva el UNION dentro de una cláusula FROM." -#: parser/analyze.c:1911 +#: parser/analyze.c:1923 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "sólo se permite INTO en el primer SELECT de UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:1983 +#: parser/analyze.c:1995 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "una sentencia miembro de UNION/INSERT/EXCEPT no puede referirse a otras relaciones del mismo nivel de la consulta" -#: parser/analyze.c:2070 +#: parser/analyze.c:2082 #, c-format msgid "each %s query must have the same number of columns" msgstr "cada consulta %s debe tener el mismo número de columnas" -#: parser/analyze.c:2470 +#: parser/analyze.c:2483 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNING debe tener al menos una columna" -#: parser/analyze.c:2573 -#, fuzzy, c-format -#| msgid "query \"%s\" returned %d column" -#| msgid_plural "query \"%s\" returned %d columns" +#: parser/analyze.c:2586 +#, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" -msgstr[0] "la consulta «%s» retornó %d columna" -msgstr[1] "la consulta «%s» retornó %d columnas" +msgstr[0] "fuente de asignación retornó %d columna" +msgstr[1] "fuente de asignación retornó %d columnas" -#: parser/analyze.c:2634 -#, fuzzy, c-format -#| msgid "subfield \"%s\" is of type %s but expression is of type %s" +#: parser/analyze.c:2647 +#, c-format msgid "variable \"%s\" is of type %s but expression is of type %s" -msgstr "el subcampo «%s» es de tipo %s pero la expresión es de tipo %s" +msgstr "la variable «%s» es de tipo %s pero la expresión es de tipo %s" #. translator: %s is a SQL keyword -#: parser/analyze.c:2758 parser/analyze.c:2766 -#, fuzzy, c-format -#| msgid "cannot specify both SCROLL and NO SCROLL" +#: parser/analyze.c:2771 parser/analyze.c:2779 +#, c-format msgid "cannot specify both %s and %s" -msgstr "no se puede especificar SCROLL y NO SCROLL" +msgstr "no se puede especificar %s junto con %s" -#: parser/analyze.c:2786 +#: parser/analyze.c:2799 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR no debe contener sentencias que modifiquen datos en WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2794 +#: parser/analyze.c:2807 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s no está soportado" -#: parser/analyze.c:2797 +#: parser/analyze.c:2810 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "Los cursores declarados HOLD deben ser READ ONLY." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2805 +#: parser/analyze.c:2818 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %s no está soportado" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2816 -#, fuzzy, c-format -#| msgid "DECLARE INSENSITIVE CURSOR ... %s is not supported" +#: parser/analyze.c:2829 +#, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" -msgstr "DECLARE INSENSITIVE CURSOR ... %s no está soportado" +msgstr "DECLARE INSENSITIVE CURSOR ... %s no es válido" -#: parser/analyze.c:2819 +#: parser/analyze.c:2832 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Los cursores insensitivos deben ser READ ONLY." -#: parser/analyze.c:2885 +#: parser/analyze.c:2898 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "las vistas materializadas no deben usar sentencias que modifiquen datos en WITH" -#: parser/analyze.c:2895 +#: parser/analyze.c:2908 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "las vistas materializadas no deben usar tablas temporales o vistas" -#: parser/analyze.c:2905 +#: parser/analyze.c:2918 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "las vistas materializadas no pueden definirse usando parámetros enlazados" -#: parser/analyze.c:2917 +#: parser/analyze.c:2930 #, c-format msgid "materialized views cannot be unlogged" msgstr "las vistas materializadas no pueden ser «unlogged»" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3106 +#: parser/analyze.c:3119 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "%s no está permitido con cláusulas DISTINCT" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3113 +#: parser/analyze.c:3126 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "%s no está permitido con cláusulas GROUP BY" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3120 +#: parser/analyze.c:3133 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "%s no está permitido con cláusulas HAVING" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3127 +#: parser/analyze.c:3140 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "%s no está permitido con funciones de agregación" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3134 +#: parser/analyze.c:3147 #, c-format msgid "%s is not allowed with window functions" msgstr "%s no está permitido con funciones de ventana deslizante" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3141 +#: parser/analyze.c:3154 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "%s no está permitido con funciones que retornan conjuntos en la lista de resultados" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3220 +#: parser/analyze.c:3246 #, c-format msgid "%s must specify unqualified relation names" msgstr "%s debe especificar nombres de relaciones sin calificar" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3251 +#: parser/analyze.c:3279 #, c-format msgid "%s cannot be applied to a join" msgstr "%s no puede ser aplicado a un join" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3260 +#: parser/analyze.c:3288 #, c-format msgid "%s cannot be applied to a function" msgstr "%s no puede ser aplicado a una función" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3269 +#: parser/analyze.c:3297 #, c-format msgid "%s cannot be applied to a table function" msgstr "%s no puede ser aplicado a una función de tabla" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3287 +#: parser/analyze.c:3315 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%s no puede ser aplicado a una consulta WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3296 +#: parser/analyze.c:3324 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s no puede ser aplicado a un «tuplestore» con nombre" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3316 +#: parser/analyze.c:3344 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "la relación «%s» en la cláusula %s no fue encontrada en la cláusula FROM" @@ -15783,16 +15607,12 @@ msgid "grouping operations are not allowed in index predicates" msgstr "no se permiten operaciones «grouping» en predicados de índice" #: parser/parse_agg.c:490 -#, fuzzy -#| msgid "aggregate functions are not allowed in policy expressions" msgid "aggregate functions are not allowed in statistics expressions" -msgstr "no se permiten funciones de agregación en expresiones de políticas" +msgstr "no se permiten funciones de agregación en expresiones de estadísticas" #: parser/parse_agg.c:492 -#, fuzzy -#| msgid "grouping operations are not allowed in policy expressions" msgid "grouping operations are not allowed in statistics expressions" -msgstr "no se permiten operaciones «grouping» en expresiones de políticas" +msgstr "no se permiten operaciones «grouping» en expresiones de estadísticas" #: parser/parse_agg.c:497 msgid "aggregate functions are not allowed in transform expressions" @@ -15870,134 +15690,132 @@ msgstr "no se permiten funciones de agregación en %s" msgid "grouping operations are not allowed in %s" msgstr "no se permiten operaciones «grouping» en %s" -#: parser/parse_agg.c:689 +#: parser/parse_agg.c:682 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" msgstr "una función de agregación de nivel exterior no puede contener una variable de nivel inferior en sus argumentos directos" -#: parser/parse_agg.c:768 +#: parser/parse_agg.c:761 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "las llamadas a funciones de agregación no pueden contener llamadas a funciones que retornan conjuntos" -#: parser/parse_agg.c:769 parser/parse_expr.c:1673 parser/parse_expr.c:2146 +#: parser/parse_agg.c:762 parser/parse_expr.c:1673 parser/parse_expr.c:2146 #: parser/parse_func.c:883 #, c-format msgid "You might be able to move the set-returning function into a LATERAL FROM item." -msgstr "Puede intentar mover la funci[on que retorna conjuntos a un elemento LATERAL FROM." +msgstr "Puede intentar mover la función que retorna conjuntos a un elemento LATERAL FROM." -#: parser/parse_agg.c:774 +#: parser/parse_agg.c:767 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "las llamadas a funciones de agregación no pueden contener llamadas a funciones de ventana deslizante" -#: parser/parse_agg.c:853 +#: parser/parse_agg.c:846 msgid "window functions are not allowed in JOIN conditions" msgstr "no se permiten funciones de ventana deslizante en condiciones JOIN" -#: parser/parse_agg.c:860 +#: parser/parse_agg.c:853 msgid "window functions are not allowed in functions in FROM" msgstr "no se permiten funciones de ventana deslizante en funciones en FROM" -#: parser/parse_agg.c:866 +#: parser/parse_agg.c:859 msgid "window functions are not allowed in policy expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones de políticas" -#: parser/parse_agg.c:879 +#: parser/parse_agg.c:872 msgid "window functions are not allowed in window definitions" msgstr "no se permiten funciones de ventana deslizante en definiciones de ventana deslizante" -#: parser/parse_agg.c:911 +#: parser/parse_agg.c:904 msgid "window functions are not allowed in check constraints" msgstr "no se permiten funciones de ventana deslizante en restricciones «check»" -#: parser/parse_agg.c:915 +#: parser/parse_agg.c:908 msgid "window functions are not allowed in DEFAULT expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones DEFAULT" -#: parser/parse_agg.c:918 +#: parser/parse_agg.c:911 msgid "window functions are not allowed in index expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones de índice" -#: parser/parse_agg.c:921 -#, fuzzy -#| msgid "window functions are not allowed in policy expressions" +#: parser/parse_agg.c:914 msgid "window functions are not allowed in statistics expressions" -msgstr "no se permiten funciones de ventana deslizante en expresiones de políticas" +msgstr "no se permiten funciones de ventana deslizante en expresiones de estadísticas" -#: parser/parse_agg.c:924 +#: parser/parse_agg.c:917 msgid "window functions are not allowed in index predicates" msgstr "no se permiten funciones de ventana deslizante en predicados de índice" -#: parser/parse_agg.c:927 +#: parser/parse_agg.c:920 msgid "window functions are not allowed in transform expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones de transformación" -#: parser/parse_agg.c:930 +#: parser/parse_agg.c:923 msgid "window functions are not allowed in EXECUTE parameters" msgstr "no se permiten funciones de ventana deslizante en parámetros a EXECUTE" -#: parser/parse_agg.c:933 +#: parser/parse_agg.c:926 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "no se permiten funciones de ventana deslizante en condiciones WHEN de un disparador" -#: parser/parse_agg.c:936 +#: parser/parse_agg.c:929 msgid "window functions are not allowed in partition bound" msgstr "no se permiten funciones de ventana deslizante en borde de partición" -#: parser/parse_agg.c:939 +#: parser/parse_agg.c:932 msgid "window functions are not allowed in partition key expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones de llave de particionamiento" -#: parser/parse_agg.c:942 +#: parser/parse_agg.c:935 msgid "window functions are not allowed in CALL arguments" msgstr "no se permiten funciones de ventana deslizante en argumentos de CALL" -#: parser/parse_agg.c:945 +#: parser/parse_agg.c:938 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "no se permiten funciones de ventana deslizante en las condiciones WHERE de COPY FROM" -#: parser/parse_agg.c:948 +#: parser/parse_agg.c:941 msgid "window functions are not allowed in column generation expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones de generación de columna" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:971 parser/parse_clause.c:1855 +#: parser/parse_agg.c:964 parser/parse_clause.c:1855 #, c-format msgid "window functions are not allowed in %s" msgstr "no se permiten funciones de ventana deslizante en %s" -#: parser/parse_agg.c:1005 parser/parse_clause.c:2689 +#: parser/parse_agg.c:998 parser/parse_clause.c:2689 #, c-format msgid "window \"%s\" does not exist" msgstr "la ventana «%s» no existe" -#: parser/parse_agg.c:1089 +#: parser/parse_agg.c:1082 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "demasiados conjuntos «grouping» presentes (máximo 4096)" -#: parser/parse_agg.c:1229 +#: parser/parse_agg.c:1222 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "no se permiten funciones de agregación en el término recursivo de una consulta recursiva" -#: parser/parse_agg.c:1422 +#: parser/parse_agg.c:1415 #, c-format msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" msgstr "la columna «%s.%s» debe aparecer en la cláusula GROUP BY o ser usada en una función de agregación" -#: parser/parse_agg.c:1425 +#: parser/parse_agg.c:1418 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "Argumentos directos de una función de agregación de conjuntos ordenados debe usar sólo columnas agrupadas." -#: parser/parse_agg.c:1430 +#: parser/parse_agg.c:1423 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "la subconsulta usa la columna «%s.%s» no agrupada de una consulta exterior" -#: parser/parse_agg.c:1594 +#: parser/parse_agg.c:1587 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "los argumentos de GROUPING deben ser expresiones agrupantes del nivel de consulta asociado" @@ -16120,10 +15938,9 @@ msgid "column alias list for \"%s\" has too many entries" msgstr "la lista de alias de columnas para «%s» tiene demasiadas entradas" #: parser/parse_clause.c:1791 -#, fuzzy, c-format -#| msgid "row count cannot be NULL in FETCH FIRST ... WITH TIES clause" +#, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" -msgstr "la cantidad de registros no puede ser nula en la cláusula FETCH FIRST ... WITH TIES" +msgstr "la cantidad de registros no puede ser NULL en la cláusula FETCH FIRST ... WITH TIES" #. translator: %s is name of a SQL construct, eg LIMIT #: parser/parse_clause.c:1816 @@ -16279,159 +16096,153 @@ msgstr "RANGE con desplazamiento PRECEDING/FOLLOWING tiene múltiples interpreta msgid "Cast the offset value to the exact intended type." msgstr "Convierta el valor de desplazamiento al tipo deseado exacto." -#: parser/parse_coerce.c:1034 parser/parse_coerce.c:1072 -#: parser/parse_coerce.c:1090 parser/parse_coerce.c:1105 -#: parser/parse_expr.c:2055 parser/parse_expr.c:2649 parser/parse_target.c:995 +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 +#: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 +#: parser/parse_expr.c:2055 parser/parse_expr.c:2649 parser/parse_target.c:994 #, c-format msgid "cannot cast type %s to %s" msgstr "no se puede convertir el tipo %s a %s" -#: parser/parse_coerce.c:1075 +#: parser/parse_coerce.c:1091 #, c-format msgid "Input has too few columns." msgstr "La entrada tiene muy pocas columnas." -#: parser/parse_coerce.c:1093 +#: parser/parse_coerce.c:1109 #, c-format msgid "Cannot cast type %s to %s in column %d." msgstr "No se puede convertir el tipo %s a %s en la columna %d." -#: parser/parse_coerce.c:1108 +#: parser/parse_coerce.c:1124 #, c-format msgid "Input has too many columns." msgstr "La entrada tiene demasiadas columnas." #. translator: first %s is name of a SQL construct, eg WHERE #. translator: first %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1163 parser/parse_coerce.c:1211 +#: parser/parse_coerce.c:1179 parser/parse_coerce.c:1227 #, c-format msgid "argument of %s must be type %s, not type %s" msgstr "el argumento de %s debe ser de tipo %s, no tipo %s" #. translator: %s is name of a SQL construct, eg WHERE #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1174 parser/parse_coerce.c:1223 +#: parser/parse_coerce.c:1190 parser/parse_coerce.c:1239 #, c-format msgid "argument of %s must not return a set" msgstr "el argumento de %s no debe retornar un conjunto" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1363 +#: parser/parse_coerce.c:1379 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "los tipos %2$s y %3$s no son coincidentes en %1$s" -#: parser/parse_coerce.c:1475 +#: parser/parse_coerce.c:1491 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "los tipos de argumento %s y %s no pueden hacerse coincidir" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1527 +#: parser/parse_coerce.c:1543 #, c-format msgid "%s could not convert type %s to %s" msgstr "%s no pudo convertir el tipo %s a %s" -#: parser/parse_coerce.c:2089 parser/parse_coerce.c:2109 -#: parser/parse_coerce.c:2129 parser/parse_coerce.c:2149 -#: parser/parse_coerce.c:2204 parser/parse_coerce.c:2237 -#, fuzzy, c-format -#| msgid "arguments declared \"anyarray\" are not all alike" +#: parser/parse_coerce.c:2098 parser/parse_coerce.c:2118 +#: parser/parse_coerce.c:2138 parser/parse_coerce.c:2159 +#: parser/parse_coerce.c:2214 parser/parse_coerce.c:2248 +#, c-format msgid "arguments declared \"%s\" are not all alike" -msgstr "los argumentos declarados «anyarray» no son de tipos compatibles" +msgstr "los argumentos declarados «%s» no son de tipos compatibles" -#: parser/parse_coerce.c:2183 parser/parse_coerce.c:2297 +#: parser/parse_coerce.c:2193 parser/parse_coerce.c:2306 #: utils/fmgr/funcapi.c:489 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "el argumento declarado %s no es un array sino de tipo %s" -#: parser/parse_coerce.c:2216 parser/parse_coerce.c:2329 +#: parser/parse_coerce.c:2226 parser/parse_coerce.c:2376 #: utils/fmgr/funcapi.c:503 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "el argumento declarado %s no es un tipo de rango sino tipo %s" -#: parser/parse_coerce.c:2250 parser/parse_coerce.c:2363 -#: utils/fmgr/funcapi.c:521 utils/fmgr/funcapi.c:586 -#, fuzzy, c-format -#| msgid "argument declared %s is not a range type but type %s" +#: parser/parse_coerce.c:2260 parser/parse_coerce.c:2340 +#: parser/parse_coerce.c:2473 utils/fmgr/funcapi.c:521 utils/fmgr/funcapi.c:586 +#, c-format msgid "argument declared %s is not a multirange type but type %s" -msgstr "el argumento declarado %s no es un tipo de rango sino tipo %s" +msgstr "el argumento declarado %s no es un tipo de multirango sino tipo %s" -#: parser/parse_coerce.c:2288 +#: parser/parse_coerce.c:2297 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "no se puede determinar el tipo del argumento «anyarray»" -#: parser/parse_coerce.c:2314 parser/parse_coerce.c:2346 -#: parser/parse_coerce.c:2380 parser/parse_coerce.c:2400 +#: parser/parse_coerce.c:2323 parser/parse_coerce.c:2354 +#: parser/parse_coerce.c:2393 parser/parse_coerce.c:2459 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "el argumento declarado %s no es consistente con el argumento declarado %s" -#: parser/parse_coerce.c:2427 +#: parser/parse_coerce.c:2418 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "no se pudo determinar el tipo polimórfico porque la entrada es de tipo %s" -#: parser/parse_coerce.c:2441 +#: parser/parse_coerce.c:2432 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "el argumento emparejado con anynonarray es un array: %s" -#: parser/parse_coerce.c:2451 +#: parser/parse_coerce.c:2442 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "el tipo emparejado con anyenum no es un tipo enum: %s" -#: parser/parse_coerce.c:2482 parser/parse_coerce.c:2532 -#: parser/parse_coerce.c:2596 parser/parse_coerce.c:2643 +#: parser/parse_coerce.c:2513 parser/parse_coerce.c:2534 +#: parser/parse_coerce.c:2584 parser/parse_coerce.c:2589 +#: parser/parse_coerce.c:2653 parser/parse_coerce.c:2665 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "no se pudo determinar el tipo polimórfico %s porque la entrada es de tipo %s" -#: parser/parse_coerce.c:2492 +#: parser/parse_coerce.c:2523 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "el tipo anycompatiblerange %s no coincide con el tipo anycompatible %s" -#: parser/parse_coerce.c:2506 +#: parser/parse_coerce.c:2544 +#, c-format +msgid "anycompatiblemultirange type %s does not match anycompatible type %s" +msgstr "el tipo anycompatiblemultirange %s no coincide con el tipo anycompatible %s" + +#: parser/parse_coerce.c:2558 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "el argumento emparejado a anycompatiblenonarray es un array: %s" -#: parser/parse_coerce.c:2607 parser/parse_coerce.c:2658 -#: utils/fmgr/funcapi.c:614 -#, fuzzy, c-format -#| msgid "could not find array type for data type %s" -msgid "could not find multirange type for data type %s" -msgstr "no se pudo encontrar un tipo de array para el tipo de dato %s" - -#: parser/parse_coerce.c:2739 -#, fuzzy, c-format -#| msgid "A result of type %s requires at least one input of type %s." +#: parser/parse_coerce.c:2793 +#, c-format msgid "A result of type %s requires at least one input of type anyrange or anymultirange." -msgstr "Un resultado de tipo %s requiere al menos un argumento de tipo %s." +msgstr "Un resultado de tipo %s requiere al menos una entrada de tipo anyrange o anymultirange." -#: parser/parse_coerce.c:2756 -#, fuzzy, c-format -#| msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, or anycompatiblerange." +#: parser/parse_coerce.c:2810 +#, c-format msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." -msgstr "Un resultado de tipo %s requiere al menos una entrada de tipo anycompatible, anycompatiblearray, anycompatiblenonarray, o anycompatiblerange." +msgstr "Un resultado de tipo %s requiere al menos una entrada de tipo anycompatiblerange o anycompatiblemultirange." -#: parser/parse_coerce.c:2768 -#, fuzzy, c-format -#| msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, or anyrange." +#: parser/parse_coerce.c:2822 +#, c-format msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." -msgstr "Un resultado de tipo %s requiere al menos una entrada de tipo anyelement, anyarray, anynonarray, anyenum, o anyrange." +msgstr "Un resultado de tipo %s requiere al menos una entrada de tipo anyelement, anyarray, anynonarray, anyenum, anyrange o anymultirange." -#: parser/parse_coerce.c:2780 +#: parser/parse_coerce.c:2834 #, c-format -msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, or anycompatiblerange." -msgstr "Un resultado de tipo %s requiere al menos una entrada de tipo anycompatible, anycompatiblearray, anycompatiblenonarray, o anycompatiblerange." +msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." +msgstr "Un resultado de tipo %s requiere al menos una entrada de tipo anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange o anycompatiblemultirange." -#: parser/parse_coerce.c:2810 +#: parser/parse_coerce.c:2864 msgid "A result of type internal requires at least one input of type internal." msgstr "Un resultado de tipo internal requiere al menos una entrada de tipo internal." @@ -16510,76 +16321,72 @@ msgstr "Use la clásula COLLATE para definir el ordenamiento del término no-rec #: parser/parse_cte.c:350 #, c-format msgid "WITH query is not recursive" -msgstr "" +msgstr "la consulta WITH no es recursiva" #: parser/parse_cte.c:381 #, c-format msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" -msgstr "" +msgstr "con una cláusula SEARCH o CYCLE, el lado izquierdo de UNION debe ser un SELECT" #: parser/parse_cte.c:386 #, c-format msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" -msgstr "" +msgstr "con una cláusula SEARCH o CYCLE, el lado derecho de UNION debe ser un SELECT" #: parser/parse_cte.c:401 #, c-format msgid "search column \"%s\" not in WITH query column list" -msgstr "" +msgstr "columna de búsqueda «%s» no se encuentra en la lista de columnas de la consulta WITH" #: parser/parse_cte.c:408 -#, fuzzy, c-format -#| msgid "column \"%s\" specified more than once" +#, c-format msgid "search column \"%s\" specified more than once" -msgstr "la columna «%s» fue especificada más de una vez" +msgstr "columna de búsqueda «%s» fue especificada más de una vez" #: parser/parse_cte.c:417 #, c-format msgid "search sequence column name \"%s\" already used in WITH query column list" -msgstr "" +msgstr "el nombre para la columna de secuencia de búsqueda «%s» ya ha sido utilizado en la lista de columnas de la consulta WITH" #: parser/parse_cte.c:436 -#, fuzzy, c-format -#| msgid "column \"%s\" named in key does not exist" +#, c-format msgid "cycle column \"%s\" not in WITH query column list" -msgstr "no existe la columna «%s» en la llave" +msgstr "la columna de ciclo «%s» no se encuentra en la lista de columnas de la consulta WITH" #: parser/parse_cte.c:443 -#, fuzzy, c-format -#| msgid "column \"%s\" specified more than once" +#, c-format msgid "cycle column \"%s\" specified more than once" -msgstr "la columna «%s» fue especificada más de una vez" +msgstr "columna de ciclo «%s» fue especificada más de una vez" #: parser/parse_cte.c:452 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" -msgstr "" +msgstr "el nombre para la columna de marca de ciclo «%s» ya ha sido utilizada en la lista de columnas de la consulta WITH" #: parser/parse_cte.c:464 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" -msgstr "" +msgstr "el nombre para la columna de ruta de ciclo «%s» ya ha sido utilizada en la lista de columnas de la consulta WITH" #: parser/parse_cte.c:472 #, c-format msgid "cycle mark column name and cycle path column name are the same" -msgstr "" +msgstr "el nombre para la columna de marca de ciclo es igual que el nombre para la columna de ruta de ciclo" #: parser/parse_cte.c:508 -#, fuzzy, c-format -#| msgid "could not identify an equality operator for type %s" +#, c-format msgid "could not identify an inequality operator for type %s" -msgstr "no se pudo identificar un operador de igualdad para el tipo %s" +msgstr "no se pudo identificar un operador de desigualdad para el tipo %s" #: parser/parse_cte.c:520 #, c-format msgid "search sequence column name and cycle mark column name are the same" -msgstr "" +msgstr "el nombre para la columna de secuencia de búsqueda es igual que el nombre para la columna de marca de ciclo" #: parser/parse_cte.c:527 #, c-format msgid "search sequence column name and cycle path column name are the same" -msgstr "" +msgstr "el nombre para la columna de secuencia de búsqueda es igual que el nombre para la columna de ruta de ciclo" #: parser/parse_cte.c:611 #, c-format @@ -16652,7 +16459,7 @@ msgstr "no se pudo identificar la columna «%s» en el tipo de dato record" msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "la notación de columna .%s fue aplicada al tipo %s, que no es un tipo compuesto" -#: parser/parse_expr.c:395 parser/parse_target.c:740 +#: parser/parse_expr.c:395 parser/parse_target.c:739 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "la expansión de filas a través de «*» no está soportado aquí" @@ -16666,7 +16473,7 @@ msgid "cannot use column reference in partition bound expression" msgstr "no se pueden usar referencias a columnas en expresión de borde de partición" #: parser/parse_expr.c:788 parser/parse_relation.c:807 -#: parser/parse_relation.c:889 parser/parse_target.c:1235 +#: parser/parse_relation.c:889 parser/parse_target.c:1234 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "la referencia a la columna «%s» es ambigua" @@ -16721,10 +16528,8 @@ msgid "cannot use subquery in index predicate" msgstr "no se puede usar una subconsulta en un predicado de índice" #: parser/parse_expr.c:1746 -#, fuzzy -#| msgid "cannot use subquery in partition key expression" msgid "cannot use subquery in statistics expression" -msgstr "no se puede usar una subconsulta en una expresión de llave de partición" +msgstr "no se puede usar una subconsulta en una expresión de estadísticas" #: parser/parse_expr.c:1749 msgid "cannot use subquery in transform expression" @@ -16919,11 +16724,10 @@ msgid "OVER is not supported for ordered-set aggregate %s" msgstr "OVER no está soportado para la función de agregación de conjuntos ordenados %s" #: parser/parse_func.c:421 parser/parse_func.c:452 -#, fuzzy, c-format -#| msgid "There is an ordered-set aggregate %s, but it requires %d direct arguments, not %d." +#, c-format msgid "There is an ordered-set aggregate %s, but it requires %d direct argument, not %d." msgid_plural "There is an ordered-set aggregate %s, but it requires %d direct arguments, not %d." -msgstr[0] "Hay una función de agregación de conjuntos ordenados %s, pero requiere %d argumentos directos, no %d." +msgstr[0] "Hay una función de agregación de conjuntos ordenados %s, pero requiere %d argumento directo, no %d." msgstr[1] "Hay una función de agregación de conjuntos ordenados %s, pero requiere %d argumentos directos, no %d." #: parser/parse_func.c:479 @@ -16932,12 +16736,11 @@ msgid "To use the hypothetical-set aggregate %s, the number of hypothetical dire msgstr "Para usar la función de agregación de conjunto hipotética %s, el número de argumentos hipotéticos directos (acá %d) debe coincidir con el número de columnas del ordenamiento (acá %d)." #: parser/parse_func.c:493 -#, fuzzy, c-format -#| msgid "There is an ordered-set aggregate %s, but it requires at least %d direct arguments." +#, c-format msgid "There is an ordered-set aggregate %s, but it requires at least %d direct argument." msgid_plural "There is an ordered-set aggregate %s, but it requires at least %d direct arguments." -msgstr[0] "Hay una función de agregación de conjuntos ordenados %s, pero requiere al menos %d argumentos directos" -msgstr[1] "Hay una función de agregación de conjuntos ordenados %s, pero requiere al menos %d argumentos directos" +msgstr[0] "Hay una función de agregación de conjuntos ordenados %s, pero requiere al menos %d argumento directo." +msgstr[1] "Hay una función de agregación de conjuntos ordenados %s, pero requiere al menos %d argumentos directos." #: parser/parse_func.c:514 #, c-format @@ -17150,10 +16953,8 @@ msgid "set-returning functions are not allowed in index predicates" msgstr "no se permiten funciones que retornan conjuntos en predicados de índice" #: parser/parse_func.c:2629 -#, fuzzy -#| msgid "set-returning functions are not allowed in policy expressions" msgid "set-returning functions are not allowed in statistics expressions" -msgstr "no se permiten funciones que retornan conjuntos en expresiones de política" +msgstr "no se permiten funciones que retornan conjuntos en expresiones de estadísticas" #: parser/parse_func.c:2632 msgid "set-returning functions are not allowed in transform expressions" @@ -17193,10 +16994,9 @@ msgid "target lists can have at most %d entries" msgstr "las listas de resultados pueden tener a lo más %d entradas" #: parser/parse_oper.c:123 parser/parse_oper.c:690 -#, fuzzy, c-format -#| msgid "log format \"%s\" is not supported" +#, c-format msgid "postfix operators are not supported" -msgstr "el formato de log «%s» no está soportado" +msgstr "los operadores postfix no están soportados" #: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:539 #: utils/adt/regproc.c:723 @@ -17316,16 +17116,14 @@ msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward referenc msgstr "Use WITH RECURSIVE, o reordene los elementos de WITH para eliminar referencias hacia adelante." #: parser/parse_relation.c:1767 -#, fuzzy, c-format -#| msgid "a column definition list is required for functions returning \"record\"" +#, c-format msgid "a column definition list is redundant for a function with OUT parameters" -msgstr "la lista de definición de columnas es obligatoria para funciones que retornan «record»" +msgstr "una lista de definición de columnas es redundante para una función con parámetros OUT" #: parser/parse_relation.c:1773 -#, fuzzy, c-format -#| msgid "a column definition list is required for functions returning \"record\"" +#, c-format msgid "a column definition list is redundant for a function returning a named composite type" -msgstr "la lista de definición de columnas es obligatoria para funciones que retornan «record»" +msgstr "una lista de definición de columnas es redundante para una función que retorna un tipo compuesto especificado" #: parser/parse_relation.c:1780 #, c-format @@ -17387,48 +17185,47 @@ msgstr "Hay una columna llamada «%s» en la tabla «%s», pero no puede ser ref msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "Probablemente quiera hacer referencia a la columna «%s.%s» o la columna «%s.%s»." -#: parser/parse_target.c:483 parser/parse_target.c:804 +#: parser/parse_target.c:482 parser/parse_target.c:803 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "no se puede asignar a la columna de sistema «%s»" -#: parser/parse_target.c:511 +#: parser/parse_target.c:510 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "no se puede definir un elemento de array a DEFAULT" -#: parser/parse_target.c:516 +#: parser/parse_target.c:515 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "no se puede definir un subcampo a DEFAULT" -#: parser/parse_target.c:590 +#: parser/parse_target.c:589 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "la columna «%s» es de tipo %s pero la expresión es de tipo %s" -#: parser/parse_target.c:788 +#: parser/parse_target.c:787 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" msgstr "no se puede asignar al campo «%s» de la columna «%s» porque su tipo %s no es un tipo compuesto" -#: parser/parse_target.c:797 +#: parser/parse_target.c:796 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" msgstr "no se puede asignar al campo «%s» de la columna «%s» porque no existe esa columna en el tipo de dato %s" -#: parser/parse_target.c:878 -#, fuzzy, c-format -#| msgid "array assignment to \"%s\" requires type %s but expression is of type %s" +#: parser/parse_target.c:877 +#, c-format msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" -msgstr "la asignación de array a «%s» requiere tipo %s pero la expresión es de tipo %s" +msgstr "la asignación subindexada a «%s» requiere tipo %s pero la expresión es de tipo %s" -#: parser/parse_target.c:888 +#: parser/parse_target.c:887 #, c-format msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "el subcampo «%s» es de tipo %s pero la expresión es de tipo %s" -#: parser/parse_target.c:1323 +#: parser/parse_target.c:1322 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * sin especificar tablas no es válido" @@ -17469,331 +17266,330 @@ msgstr "los modificadores de tipo deben ser constantes simples o identificadores msgid "invalid type name \"%s\"" msgstr "el nombre de tipo «%s» no es válido" -#: parser/parse_utilcmd.c:266 +#: parser/parse_utilcmd.c:256 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "no se puede crear una tabla particionada como hija de herencia" -#: parser/parse_utilcmd.c:580 +#: parser/parse_utilcmd.c:570 #, c-format msgid "array of serial is not implemented" msgstr "array de serial no está implementado" -#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 -#: parser/parse_utilcmd.c:730 +#: parser/parse_utilcmd.c:649 parser/parse_utilcmd.c:661 +#: parser/parse_utilcmd.c:720 #, c-format msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "las declaraciones NULL/NOT NULL no son coincidentes para la columna «%s» de la tabla «%s»" -#: parser/parse_utilcmd.c:683 +#: parser/parse_utilcmd.c:673 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "múltiples valores default especificados para columna «%s» de tabla «%s»" -#: parser/parse_utilcmd.c:700 +#: parser/parse_utilcmd.c:690 #, c-format msgid "identity columns are not supported on typed tables" msgstr "las columnas identidad no está soportadas en tablas tipadas" -#: parser/parse_utilcmd.c:704 +#: parser/parse_utilcmd.c:694 #, c-format msgid "identity columns are not supported on partitions" msgstr "las columnas identidad no están soportadas en particiones" -#: parser/parse_utilcmd.c:713 +#: parser/parse_utilcmd.c:703 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "múltiples especificaciones de identidad para columna «%s» de tabla «%s»" -#: parser/parse_utilcmd.c:743 +#: parser/parse_utilcmd.c:733 #, c-format msgid "generated columns are not supported on typed tables" msgstr "las columnas generadas no están soportadas en tablas tipadas" -#: parser/parse_utilcmd.c:747 +#: parser/parse_utilcmd.c:737 #, c-format msgid "generated columns are not supported on partitions" msgstr "las columnas generadas no están soportadas en particiones" -#: parser/parse_utilcmd.c:752 +#: parser/parse_utilcmd.c:742 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "múltiples cláusulas de generación especificadas para columna «%s» de tabla «%s»" -#: parser/parse_utilcmd.c:770 parser/parse_utilcmd.c:885 +#: parser/parse_utilcmd.c:760 parser/parse_utilcmd.c:875 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "las restricciones de llave primaria no están soportadas en tablas foráneas" -#: parser/parse_utilcmd.c:779 parser/parse_utilcmd.c:895 +#: parser/parse_utilcmd.c:769 parser/parse_utilcmd.c:885 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "las restricciones unique no están soportadas en tablas foráneas" -#: parser/parse_utilcmd.c:824 +#: parser/parse_utilcmd.c:814 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "tanto el valor por omisión como identidad especificados para columna «%s» de tabla «%s»" -#: parser/parse_utilcmd.c:832 +#: parser/parse_utilcmd.c:822 #, c-format msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" msgstr "tanto el valor por omisión como expresión de generación especificados para columna «%s» de tabla «%s»" -#: parser/parse_utilcmd.c:840 +#: parser/parse_utilcmd.c:830 #, c-format msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" msgstr "tanto identidad como expresión de generación especificados para columna «%s» de tabla «%s»" -#: parser/parse_utilcmd.c:905 +#: parser/parse_utilcmd.c:895 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "las restricciones de exclusión no están soportadas en tablas foráneas" -#: parser/parse_utilcmd.c:911 +#: parser/parse_utilcmd.c:901 #, c-format msgid "exclusion constraints are not supported on partitioned tables" msgstr "las restricciones de exclusión no están soportadas en tablas particionadas" -#: parser/parse_utilcmd.c:976 +#: parser/parse_utilcmd.c:966 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE no está soportado para la creación de tablas foráneas" -#: parser/parse_utilcmd.c:1753 parser/parse_utilcmd.c:1861 +#: parser/parse_utilcmd.c:1743 parser/parse_utilcmd.c:1851 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "El índice «%s» contiene una referencia a la fila completa (whole-row)." -#: parser/parse_utilcmd.c:2248 +#: parser/parse_utilcmd.c:2238 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "no se puede usar un índice existente en CREATE TABLE" -#: parser/parse_utilcmd.c:2268 +#: parser/parse_utilcmd.c:2258 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "el índice «%s» ya está asociado a una restricción" -#: parser/parse_utilcmd.c:2283 +#: parser/parse_utilcmd.c:2273 #, c-format msgid "index \"%s\" is not valid" msgstr "el índice «%s» no es válido" -#: parser/parse_utilcmd.c:2289 +#: parser/parse_utilcmd.c:2279 #, c-format msgid "\"%s\" is not a unique index" msgstr "«%s» no es un índice único" -#: parser/parse_utilcmd.c:2290 parser/parse_utilcmd.c:2297 -#: parser/parse_utilcmd.c:2304 parser/parse_utilcmd.c:2381 +#: parser/parse_utilcmd.c:2280 parser/parse_utilcmd.c:2287 +#: parser/parse_utilcmd.c:2294 parser/parse_utilcmd.c:2371 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "No se puede crear una restricción de llave primaria o única usando un índice así." -#: parser/parse_utilcmd.c:2296 +#: parser/parse_utilcmd.c:2286 #, c-format msgid "index \"%s\" contains expressions" msgstr "el índice «%s» contiene expresiones" -#: parser/parse_utilcmd.c:2303 +#: parser/parse_utilcmd.c:2293 #, c-format msgid "\"%s\" is a partial index" msgstr "«%s» es un índice parcial" -#: parser/parse_utilcmd.c:2315 +#: parser/parse_utilcmd.c:2305 #, c-format msgid "\"%s\" is a deferrable index" msgstr "«%s» no es un índice postergable (deferrable)" -#: parser/parse_utilcmd.c:2316 +#: parser/parse_utilcmd.c:2306 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "No se puede crear una restricción no postergable usando un índice postergable." -#: parser/parse_utilcmd.c:2380 +#: parser/parse_utilcmd.c:2370 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "el índice «%s» columna número %d no tiene comportamiento de ordenamiento por omisión" -#: parser/parse_utilcmd.c:2537 +#: parser/parse_utilcmd.c:2527 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "la columna «%s» aparece dos veces en llave primaria" -#: parser/parse_utilcmd.c:2543 +#: parser/parse_utilcmd.c:2533 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "la columna «%s» aparece dos veces en restricción unique" -#: parser/parse_utilcmd.c:2896 +#: parser/parse_utilcmd.c:2880 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "las expresiones y predicados de índice sólo pueden referirse a la tabla en indexación" -#: parser/parse_utilcmd.c:2974 -#, fuzzy, c-format -#| msgid "index expressions and predicates can refer only to the table being indexed" -msgid "statistics expressions can refer only to the table being indexed" -msgstr "las expresiones y predicados de índice sólo pueden referirse a la tabla en indexación" +#: parser/parse_utilcmd.c:2952 +#, c-format +msgid "statistics expressions can refer only to the table being referenced" +msgstr "las expresiones estadísticas sólo pueden referirse a la tabla que está siendo referida" -#: parser/parse_utilcmd.c:3020 +#: parser/parse_utilcmd.c:2995 #, c-format msgid "rules on materialized views are not supported" msgstr "las reglas en vistas materializadas no están soportadas" -#: parser/parse_utilcmd.c:3083 +#: parser/parse_utilcmd.c:3058 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "la condición WHERE de la regla no puede contener referencias a otras relaciones" -#: parser/parse_utilcmd.c:3157 +#: parser/parse_utilcmd.c:3131 #, c-format msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "las reglas con condiciones WHERE sólo pueden tener acciones SELECT, INSERT, UPDATE o DELETE" -#: parser/parse_utilcmd.c:3175 parser/parse_utilcmd.c:3276 +#: parser/parse_utilcmd.c:3149 parser/parse_utilcmd.c:3250 #: rewrite/rewriteHandler.c:508 rewrite/rewriteManip.c:1018 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "las sentencias UNION/INTERSECT/EXCEPT condicionales no están implementadas" -#: parser/parse_utilcmd.c:3193 +#: parser/parse_utilcmd.c:3167 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "una regla ON SELECT no puede usar OLD" -#: parser/parse_utilcmd.c:3197 +#: parser/parse_utilcmd.c:3171 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "una regla ON SELECT no puede usar NEW" -#: parser/parse_utilcmd.c:3206 +#: parser/parse_utilcmd.c:3180 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "una regla ON INSERT no puede usar OLD" -#: parser/parse_utilcmd.c:3212 +#: parser/parse_utilcmd.c:3186 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "una regla ON DELETE no puede usar NEW" -#: parser/parse_utilcmd.c:3240 +#: parser/parse_utilcmd.c:3214 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "no se puede hacer referencia a OLD dentro de una consulta WITH" -#: parser/parse_utilcmd.c:3247 +#: parser/parse_utilcmd.c:3221 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "no se puede hacer referencia a NEW dentro de una consulta WITH" -#: parser/parse_utilcmd.c:3706 +#: parser/parse_utilcmd.c:3674 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "cláusula DEFERRABLE mal puesta" -#: parser/parse_utilcmd.c:3711 parser/parse_utilcmd.c:3726 +#: parser/parse_utilcmd.c:3679 parser/parse_utilcmd.c:3694 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "no se permiten múltiples cláusulas DEFERRABLE/NOT DEFERRABLE" -#: parser/parse_utilcmd.c:3721 +#: parser/parse_utilcmd.c:3689 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "la cláusula NOT DEFERRABLE está mal puesta" -#: parser/parse_utilcmd.c:3742 +#: parser/parse_utilcmd.c:3710 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "la cláusula INITIALLY DEFERRED está mal puesta" -#: parser/parse_utilcmd.c:3747 parser/parse_utilcmd.c:3773 +#: parser/parse_utilcmd.c:3715 parser/parse_utilcmd.c:3741 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "no se permiten múltiples cláusulas INITIALLY IMMEDIATE/DEFERRED" -#: parser/parse_utilcmd.c:3768 +#: parser/parse_utilcmd.c:3736 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "la cláusula INITIALLY IMMEDIATE está mal puesta" -#: parser/parse_utilcmd.c:3959 +#: parser/parse_utilcmd.c:3927 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATE especifica un esquema (%s) diferente del que se está creando (%s)" -#: parser/parse_utilcmd.c:3994 +#: parser/parse_utilcmd.c:3962 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "«%s» no es una tabla particionada" -#: parser/parse_utilcmd.c:4001 +#: parser/parse_utilcmd.c:3969 #, c-format msgid "table \"%s\" is not partitioned" msgstr "«la tabla %s» no está particionada" -#: parser/parse_utilcmd.c:4008 +#: parser/parse_utilcmd.c:3976 #, c-format msgid "index \"%s\" is not partitioned" msgstr "el índice «%s» no está particionado" -#: parser/parse_utilcmd.c:4048 +#: parser/parse_utilcmd.c:4016 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "una tabla particionada por hash no puede tener una partición default" -#: parser/parse_utilcmd.c:4065 +#: parser/parse_utilcmd.c:4033 #, c-format msgid "invalid bound specification for a hash partition" msgstr "especificación de borde no válida para partición de hash" -#: parser/parse_utilcmd.c:4071 partitioning/partbounds.c:4701 +#: parser/parse_utilcmd.c:4039 partitioning/partbounds.c:4711 #, c-format -msgid "modulus for hash partition must be a positive integer" -msgstr "el módulo para una partición hash debe ser un entero positivo" +msgid "modulus for hash partition must be an integer value greater than zero" +msgstr "el módulo para una partición hash debe ser un valor entero mayor que cero" -#: parser/parse_utilcmd.c:4078 partitioning/partbounds.c:4709 +#: parser/parse_utilcmd.c:4046 partitioning/partbounds.c:4719 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "remanente en partición hash debe ser menor que el módulo" -#: parser/parse_utilcmd.c:4091 +#: parser/parse_utilcmd.c:4059 #, c-format msgid "invalid bound specification for a list partition" msgstr "especificación de borde no válida para partición de lista" -#: parser/parse_utilcmd.c:4144 +#: parser/parse_utilcmd.c:4112 #, c-format msgid "invalid bound specification for a range partition" msgstr "especificación de borde no válida para partición de rango" -#: parser/parse_utilcmd.c:4150 +#: parser/parse_utilcmd.c:4118 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROM debe especificar exactamente un valor por cada columna de particionado" -#: parser/parse_utilcmd.c:4154 +#: parser/parse_utilcmd.c:4122 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TO debe especificar exactamente un valor por cada columna de particionado" -#: parser/parse_utilcmd.c:4268 +#: parser/parse_utilcmd.c:4236 #, c-format msgid "cannot specify NULL in range bound" msgstr "no se puede especificar NULL en borde de rango" -#: parser/parse_utilcmd.c:4317 +#: parser/parse_utilcmd.c:4285 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "cada borde que sigue a un MAXVALUE debe ser también MAXVALUE" -#: parser/parse_utilcmd.c:4324 +#: parser/parse_utilcmd.c:4292 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "cada borde que siga a un MINVALUE debe ser también MINVALUE" -#: parser/parse_utilcmd.c:4367 +#: parser/parse_utilcmd.c:4335 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "el valor especificado no puede ser convertido al tipo %s para la columna «%s»" @@ -17811,7 +17607,7 @@ msgstr "carácter de escape Unicode no válido" msgid "invalid Unicode escape value" msgstr "valor de escape Unicode no válido" -#: parser/parser.c:468 scan.l:677 utils/adt/varlena.c:6566 +#: parser/parser.c:468 scan.l:677 utils/adt/varlena.c:6559 #, c-format msgid "invalid Unicode escape" msgstr "valor de escape Unicode no válido" @@ -17822,101 +17618,99 @@ msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Los escapes Unicode deben ser \\XXXX o \\+XXXXXX." #: parser/parser.c:497 scan.l:638 scan.l:654 scan.l:670 -#: utils/adt/varlena.c:6591 +#: utils/adt/varlena.c:6584 #, c-format msgid "invalid Unicode surrogate pair" msgstr "par sustituto (surrogate) Unicode no válido" #: parser/scansup.c:101 -#, fuzzy, c-format -#| msgid "identifier \"%s\" will be truncated to \"%s\"" +#, c-format msgid "identifier \"%s\" will be truncated to \"%.*s\"" -msgstr "el identificador «%s» se truncará a «%s»" +msgstr "el identificador «%s» se truncará a «%.*s»" #: partitioning/partbounds.c:2821 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "la partición «%s» está en conflicto con la partición default «%s» existente" -#: partitioning/partbounds.c:2870 partitioning/partbounds.c:2888 -#: partitioning/partbounds.c:2904 +#: partitioning/partbounds.c:2873 partitioning/partbounds.c:2892 +#: partitioning/partbounds.c:2914 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "cada módulo de partición hash debe ser un factor del próximo mayor módulo" -#: partitioning/partbounds.c:2871 partitioning/partbounds.c:2905 +#: partitioning/partbounds.c:2874 partitioning/partbounds.c:2915 #, c-format msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." -msgstr "" +msgstr "El nuevo módulo %d no es un factor de %d, el módulo de la partición existente «%s»." -#: partitioning/partbounds.c:2889 +#: partitioning/partbounds.c:2893 #, c-format msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." -msgstr "" +msgstr "El nuevo módulo %d no es divisible para %d, el módulo de la partición existente «%s»." -#: partitioning/partbounds.c:3018 +#: partitioning/partbounds.c:3028 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "borde de rango vació especificado para la partición «%s»" -#: partitioning/partbounds.c:3020 +#: partitioning/partbounds.c:3030 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "El límite inferior %s especificado es mayor o igual al límite superior %s." -#: partitioning/partbounds.c:3132 +#: partitioning/partbounds.c:3142 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "la partición «%s» traslaparía con la partición «%s»" -#: partitioning/partbounds.c:3249 +#: partitioning/partbounds.c:3259 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "se omitió recorrer la tabla foránea «%s» que es una partición de la partición default «%s»" -#: partitioning/partbounds.c:4705 +#: partitioning/partbounds.c:4715 #, c-format -msgid "remainder for hash partition must be a non-negative integer" -msgstr "remanente en partición hash debe ser un entero no negativo" +msgid "remainder for hash partition must be an integer value greater than or equal to zero" +msgstr "remanente en partición hash debe ser un valor entero mayor que o igual a cero" -#: partitioning/partbounds.c:4729 +#: partitioning/partbounds.c:4739 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "«%s» es una tabla particionada por hash" -#: partitioning/partbounds.c:4740 partitioning/partbounds.c:4857 +#: partitioning/partbounds.c:4750 partitioning/partbounds.c:4867 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "el número de columnas de particionamiento (%d) no coincide con el número de llaves de particionamiento provistas (%d)" -#: partitioning/partbounds.c:4762 -#, fuzzy, c-format -#| msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" +#: partitioning/partbounds.c:4772 +#, c-format msgid "column %d of the partition key has type %s, but supplied value is of type %s" msgstr "la columna %d de la llave de particionamiento tiene tipo «%s», pero el valor dado es de tipo «%s»" -#: partitioning/partbounds.c:4794 +#: partitioning/partbounds.c:4804 #, c-format msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" msgstr "la columna %d de la llave de particionamiento tiene tipo «%s», pero el valor dado es de tipo «%s»" -#: port/pg_sema.c:209 port/pg_shmem.c:668 port/posix_sema.c:209 -#: port/sysv_sema.c:327 port/sysv_shmem.c:668 +#: port/pg_sema.c:209 port/pg_shmem.c:678 port/posix_sema.c:209 +#: port/sysv_sema.c:327 port/sysv_shmem.c:678 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "no se pudo hacer stat al directorio de datos «%s»: %m" -#: port/pg_shmem.c:217 port/sysv_shmem.c:217 +#: port/pg_shmem.c:227 port/sysv_shmem.c:227 #, c-format msgid "could not create shared memory segment: %m" msgstr "no se pudo crear el segmento de memoria compartida: %m" -#: port/pg_shmem.c:218 port/sysv_shmem.c:218 +#: port/pg_shmem.c:228 port/sysv_shmem.c:228 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "La llamada a sistema fallida fue shmget(key=%lu, size=%zu, 0%o)." -#: port/pg_shmem.c:222 port/sysv_shmem.c:222 +#: port/pg_shmem.c:232 port/sysv_shmem.c:232 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" @@ -17925,7 +17719,7 @@ msgstr "" "Este error normalmente significa que la petición de un segmento de memoria compartida de PostgreSQL excedió el parámetro SHMMAX del kernel, o posiblemente que es menor que el parámetro SHMMIN del kernel.\n" "La documentación de PostgreSQL contiene más información acerca de la configuración de memoria compartida." -#: port/pg_shmem.c:229 port/sysv_shmem.c:229 +#: port/pg_shmem.c:239 port/sysv_shmem.c:239 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" @@ -17934,7 +17728,7 @@ msgstr "" "Este error normalmente significa que la petición de un segmento de memoria compartida de PostgreSQL excedió el parámetro SHMALL del kernel. Puede ser necesario reconfigurar el kernel con un SHMALL mayor.\n" "La documentación de PostgreSQL contiene más información acerca de la configuración de memoria compartida." -#: port/pg_shmem.c:235 port/sysv_shmem.c:235 +#: port/pg_shmem.c:245 port/sysv_shmem.c:245 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" @@ -17943,27 +17737,32 @@ msgstr "" "Este error *no* significa que se haya quedado sin espacio en disco. Ocurre cuando se han usado todos los IDs de memoria compartida disponibles, en cuyo caso puede incrementar el parámetro SHMMNI del kernel, o bien porque se ha alcanzado el límite total de memoria compartida.\n" "La documentación de PostgreSQL contiene más información acerca de la configuración de memoria compartida." -#: port/pg_shmem.c:606 port/sysv_shmem.c:606 +#: port/pg_shmem.c:616 port/sysv_shmem.c:616 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "no se pudo mapear memoria compartida anónima: %m" -#: port/pg_shmem.c:608 port/sysv_shmem.c:608 +#: port/pg_shmem.c:618 port/sysv_shmem.c:618 #, c-format msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections." msgstr "Este error normalmente significa que la petición de un segmento de memoria compartida de PostgreSQL excedía la memoria disponible, el espacio de intercambio (swap), o las huge pages. Para reducir el tamaño de la petición (actualmente %zu bytes), reduzca el uso de memoria compartida de PostgreSQL, quizás reduciendo el parámetro shared_buffers o el parámetro max_connections." -#: port/pg_shmem.c:676 port/sysv_shmem.c:676 +#: port/pg_shmem.c:686 port/sysv_shmem.c:686 #, c-format msgid "huge pages not supported on this platform" -msgstr "las huge pages no están soportados en esta plataforma" +msgstr "las huge pages no están soportadas en esta plataforma" + +#: port/pg_shmem.c:693 port/sysv_shmem.c:693 +#, c-format +msgid "huge pages not supported with the current shared_memory_type setting" +msgstr "las huge pages no están soportadas con la configuración actual de shared_memory_type" -#: port/pg_shmem.c:737 port/sysv_shmem.c:737 utils/init/miscinit.c:1167 +#: port/pg_shmem.c:753 port/sysv_shmem.c:753 utils/init/miscinit.c:1167 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "el bloque de memoria compartida preexistente (clave %lu, ID %lu) aún está en uso" -#: port/pg_shmem.c:740 port/sysv_shmem.c:740 utils/init/miscinit.c:1169 +#: port/pg_shmem.c:756 port/sysv_shmem.c:756 utils/init/miscinit.c:1169 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "Termine cualquier proceso de servidor asociado al directorio de datos «%s»." @@ -18050,20 +17849,17 @@ msgstr "no se pudo intentar-bloquear (try-lock) el semáforo: código de error % #: port/win32_shmem.c:144 port/win32_shmem.c:159 port/win32_shmem.c:171 #: port/win32_shmem.c:187 -#, fuzzy, c-format -#| msgid "%s: could not open service \"%s\": error code %lu\n" +#, c-format msgid "could not enable user right \"%s\": error code %lu" -msgstr "%s: no se pudo abrir el servicio «%s»: código de error %lu\n" +msgstr "no se pudo habilitar el privilegio de usuario «%s»: código de error %lu" #. translator: This is a term from Windows and should be translated to #. match the Windows localization. #. #: port/win32_shmem.c:150 port/win32_shmem.c:159 port/win32_shmem.c:171 #: port/win32_shmem.c:182 port/win32_shmem.c:184 port/win32_shmem.c:187 -#, fuzzy -#| msgid "Resource Usage / Memory" msgid "Lock pages in memory" -msgstr "Uso de Recursos / Memoria" +msgstr "Bloquear páginas en la memoria" #: port/win32_shmem.c:152 port/win32_shmem.c:160 port/win32_shmem.c:172 #: port/win32_shmem.c:188 @@ -18072,16 +17868,14 @@ msgid "Failed system call was %s." msgstr "La llamada a sistema fallida fue %s." #: port/win32_shmem.c:182 -#, fuzzy, c-format -#| msgid "could not parse limit \"%s\"" +#, c-format msgid "could not enable user right \"%s\"" -msgstr "no se pudo interpretar el límite «%s»" +msgstr "no se pudo habilitar el privilegio de usuario «%s»" #: port/win32_shmem.c:183 -#, fuzzy, c-format -#| msgid "Assign Lock Pages in Memory user right to the Windows user account which runs PostgreSQL." +#, c-format msgid "Assign user right \"%s\" to the Windows user account which runs PostgreSQL." -msgstr "Asigne el privilegio «Bloquear páginas en la memoria» a la cuenta de usuario de Windows que ejecuta PostgreSQL." +msgstr "Asigne el privilegio «%s» a la cuenta de usuario de Windows que ejecuta PostgreSQL." #: port/win32_shmem.c:241 #, c-format @@ -18118,42 +17912,42 @@ msgstr "La llamada a sistema fallida fue DuplicateHandle." msgid "Failed system call was MapViewOfFileEx." msgstr "La llamada a sistema fallida fue MapViewOfFileEx." -#: postmaster/autovacuum.c:411 +#: postmaster/autovacuum.c:410 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "no se pudo iniciar el lanzador autovacuum: %m" -#: postmaster/autovacuum.c:1489 +#: postmaster/autovacuum.c:1492 #, c-format msgid "could not fork autovacuum worker process: %m" msgstr "no se pudo lanzar el proceso «autovacuum worker»: %m" -#: postmaster/autovacuum.c:2326 +#: postmaster/autovacuum.c:2283 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "autovacuum: eliminando tabla temporal huérfana «%s.%s.%s»" -#: postmaster/autovacuum.c:2555 +#: postmaster/autovacuum.c:2512 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "vacuum automático de la tabla «%s.%s.%s»" -#: postmaster/autovacuum.c:2558 +#: postmaster/autovacuum.c:2515 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "análisis automático de la tabla «%s.%s.%s»" -#: postmaster/autovacuum.c:2751 +#: postmaster/autovacuum.c:2708 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "procesando elemento de tarea de la tabla «%s.%s.%s»" -#: postmaster/autovacuum.c:3432 +#: postmaster/autovacuum.c:3394 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "autovacuum no fue iniciado debido a un error de configuración" -#: postmaster/autovacuum.c:3433 +#: postmaster/autovacuum.c:3395 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Active la opción «track_counts»." @@ -18161,7 +17955,7 @@ msgstr "Active la opción «track_counts»." #: postmaster/bgworker.c:256 #, c-format msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" -msgstr "" +msgstr "estado inconsistente de proceso ayudante (max_worker_processes=%d, total_slots=%d)" #: postmaster/bgworker.c:661 #, c-format @@ -18239,196 +18033,195 @@ msgstr "falló la petición de punto de control" msgid "Consult recent messages in the server log for details." msgstr "Vea los mensajes recientes en el registro del servidor para obtener más detalles." -#: postmaster/pgarch.c:372 +#: postmaster/pgarch.c:365 #, c-format msgid "archive_mode enabled, yet archive_command is not set" msgstr "archive_mode activado, pero archive_command no está definido" -#: postmaster/pgarch.c:394 +#: postmaster/pgarch.c:387 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "eliminando archivo de estado huérfano «%s»" -#: postmaster/pgarch.c:404 +#: postmaster/pgarch.c:397 #, c-format msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" msgstr "la eliminación del archivo de estado huérfano «%s» falló demasiadas veces, se tratará de nuevo después" -#: postmaster/pgarch.c:440 +#: postmaster/pgarch.c:433 #, c-format msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" msgstr "el archivado del archivo de WAL «%s» falló demasiadas veces, se tratará de nuevo más tarde" -#: postmaster/pgarch.c:541 +#: postmaster/pgarch.c:534 #, c-format msgid "archive command failed with exit code %d" msgstr "la orden de archivado falló con código de retorno %d" -#: postmaster/pgarch.c:543 postmaster/pgarch.c:553 postmaster/pgarch.c:559 -#: postmaster/pgarch.c:568 +#: postmaster/pgarch.c:536 postmaster/pgarch.c:546 postmaster/pgarch.c:552 +#: postmaster/pgarch.c:561 #, c-format msgid "The failed archive command was: %s" msgstr "La orden fallida era: «%s»" -#: postmaster/pgarch.c:550 +#: postmaster/pgarch.c:543 #, c-format msgid "archive command was terminated by exception 0x%X" msgstr "la orden de archivado fue terminada por una excepción 0x%X" -#: postmaster/pgarch.c:552 postmaster/postmaster.c:3724 +#: postmaster/pgarch.c:545 postmaster/postmaster.c:3748 #, c-format msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." msgstr "Vea el archivo «ntstatus.h» para una descripción del valor hexadecimal." -#: postmaster/pgarch.c:557 +#: postmaster/pgarch.c:550 #, c-format msgid "archive command was terminated by signal %d: %s" msgstr "la orden de archivado fue terminada por una señal %d: %s" -#: postmaster/pgarch.c:566 +#: postmaster/pgarch.c:559 #, c-format msgid "archive command exited with unrecognized status %d" msgstr "la orden de archivado fue terminada con código %d no reconocido" -#: postmaster/pgstat.c:417 +#: postmaster/pgstat.c:418 #, c-format msgid "could not resolve \"localhost\": %s" msgstr "no se pudo resolver «localhost»: %s" -#: postmaster/pgstat.c:440 +#: postmaster/pgstat.c:441 #, c-format msgid "trying another address for the statistics collector" msgstr "intentando otra dirección para el recolector de estadísticas" -#: postmaster/pgstat.c:449 +#: postmaster/pgstat.c:450 #, c-format msgid "could not create socket for statistics collector: %m" msgstr "no se pudo crear el socket para el recolector de estadísticas: %m" -#: postmaster/pgstat.c:461 +#: postmaster/pgstat.c:462 #, c-format msgid "could not bind socket for statistics collector: %m" msgstr "no se pudo enlazar (bind) el socket para el recolector de estadísticas: %m" -#: postmaster/pgstat.c:472 +#: postmaster/pgstat.c:473 #, c-format msgid "could not get address of socket for statistics collector: %m" msgstr "no se pudo obtener la dirección del socket de estadísticas: %m" -#: postmaster/pgstat.c:488 +#: postmaster/pgstat.c:489 #, c-format msgid "could not connect socket for statistics collector: %m" msgstr "no se pudo conectar el socket para el recolector de estadísticas: %m" -#: postmaster/pgstat.c:509 +#: postmaster/pgstat.c:510 #, c-format msgid "could not send test message on socket for statistics collector: %m" msgstr "no se pudo enviar el mensaje de prueba al recolector de estadísticas: %m" -#: postmaster/pgstat.c:535 +#: postmaster/pgstat.c:536 #, c-format msgid "select() failed in statistics collector: %m" msgstr "select() falló en el recolector de estadísticas: %m" -#: postmaster/pgstat.c:550 +#: postmaster/pgstat.c:551 #, c-format msgid "test message did not get through on socket for statistics collector" msgstr "el mensaje de prueba al recolector de estadísticas no ha sido recibido en el socket" -#: postmaster/pgstat.c:565 +#: postmaster/pgstat.c:566 #, c-format msgid "could not receive test message on socket for statistics collector: %m" msgstr "no se pudo recibir el mensaje de prueba en el socket del recolector de estadísticas: %m" -#: postmaster/pgstat.c:575 +#: postmaster/pgstat.c:576 #, c-format msgid "incorrect test message transmission on socket for statistics collector" msgstr "transmisión del mensaje de prueba incorrecta en el socket del recolector de estadísticas" -#: postmaster/pgstat.c:598 +#: postmaster/pgstat.c:599 #, c-format msgid "could not set statistics collector socket to nonblocking mode: %m" msgstr "no se pudo poner el socket de estadísticas en modo no bloqueante: %m" -#: postmaster/pgstat.c:642 +#: postmaster/pgstat.c:643 #, c-format msgid "disabling statistics collector for lack of working socket" msgstr "desactivando el recolector de estadísticas por falla del socket" -#: postmaster/pgstat.c:789 +#: postmaster/pgstat.c:790 #, c-format msgid "could not fork statistics collector: %m" msgstr "no se pudo crear el proceso para el recolector de estadísticas: %m" -#: postmaster/pgstat.c:1459 +#: postmaster/pgstat.c:1444 #, c-format msgid "unrecognized reset target: \"%s\"" msgstr "destino de reset no reconocido: «%s»" -#: postmaster/pgstat.c:1460 -#, fuzzy, c-format -#| msgid "Target must be \"archiver\" or \"bgwriter\"." -msgid "Target must be \"archiver\", \"bgwriter\" or \"wal\"." -msgstr "El destino debe ser «archiver» o «bgwriter»." +#: postmaster/pgstat.c:1445 +#, c-format +msgid "Target must be \"archiver\", \"bgwriter\", or \"wal\"." +msgstr "El destino debe ser «archiver», «bgwriter» o «wal»." -#: postmaster/pgstat.c:3298 +#: postmaster/pgstat.c:3289 #, c-format msgid "could not read statistics message: %m" msgstr "no se pudo leer un mensaje de estadísticas: %m" -#: postmaster/pgstat.c:3644 postmaster/pgstat.c:3829 +#: postmaster/pgstat.c:3634 postmaster/pgstat.c:3819 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "no se pudo abrir el archivo temporal de estadísticas «%s»: %m" -#: postmaster/pgstat.c:3739 postmaster/pgstat.c:3874 +#: postmaster/pgstat.c:3729 postmaster/pgstat.c:3864 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "no se pudo escribir el archivo temporal de estadísticas «%s»: %m" -#: postmaster/pgstat.c:3748 postmaster/pgstat.c:3883 +#: postmaster/pgstat.c:3738 postmaster/pgstat.c:3873 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "no se pudo cerrar el archivo temporal de estadísticas «%s»: %m" -#: postmaster/pgstat.c:3756 postmaster/pgstat.c:3891 +#: postmaster/pgstat.c:3746 postmaster/pgstat.c:3881 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "no se pudo cambiar el nombre al archivo temporal de estadísticas de «%s» a «%s»: %m" -#: postmaster/pgstat.c:3989 postmaster/pgstat.c:4255 postmaster/pgstat.c:4412 +#: postmaster/pgstat.c:3979 postmaster/pgstat.c:4245 postmaster/pgstat.c:4402 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "no se pudo abrir el archivo de estadísticas «%s»: %m" -#: postmaster/pgstat.c:4001 postmaster/pgstat.c:4011 postmaster/pgstat.c:4032 -#: postmaster/pgstat.c:4043 postmaster/pgstat.c:4054 postmaster/pgstat.c:4076 -#: postmaster/pgstat.c:4091 postmaster/pgstat.c:4161 postmaster/pgstat.c:4192 -#: postmaster/pgstat.c:4267 postmaster/pgstat.c:4287 postmaster/pgstat.c:4305 -#: postmaster/pgstat.c:4321 postmaster/pgstat.c:4339 postmaster/pgstat.c:4355 -#: postmaster/pgstat.c:4424 postmaster/pgstat.c:4436 postmaster/pgstat.c:4448 -#: postmaster/pgstat.c:4459 postmaster/pgstat.c:4470 postmaster/pgstat.c:4495 -#: postmaster/pgstat.c:4522 postmaster/pgstat.c:4535 +#: postmaster/pgstat.c:3991 postmaster/pgstat.c:4001 postmaster/pgstat.c:4022 +#: postmaster/pgstat.c:4033 postmaster/pgstat.c:4044 postmaster/pgstat.c:4066 +#: postmaster/pgstat.c:4081 postmaster/pgstat.c:4151 postmaster/pgstat.c:4182 +#: postmaster/pgstat.c:4257 postmaster/pgstat.c:4277 postmaster/pgstat.c:4295 +#: postmaster/pgstat.c:4311 postmaster/pgstat.c:4329 postmaster/pgstat.c:4345 +#: postmaster/pgstat.c:4414 postmaster/pgstat.c:4426 postmaster/pgstat.c:4438 +#: postmaster/pgstat.c:4449 postmaster/pgstat.c:4460 postmaster/pgstat.c:4485 +#: postmaster/pgstat.c:4512 postmaster/pgstat.c:4525 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "el archivo de estadísticas «%s» está corrupto" -#: postmaster/pgstat.c:4644 +#: postmaster/pgstat.c:4634 #, c-format msgid "statistics collector's time %s is later than backend local time %s" -msgstr "" +msgstr "la fecha del colector de estadísticas %s es posterior a la fecha local del servidor %s" -#: postmaster/pgstat.c:4667 +#: postmaster/pgstat.c:4657 #, c-format msgid "using stale statistics instead of current ones because stats collector is not responding" msgstr "usando estadísticas añejas en vez de actualizadas porque el recolector de estadísticas no está respondiendo" -#: postmaster/pgstat.c:4794 +#: postmaster/pgstat.c:4784 #, c-format msgid "stats_timestamp %s is later than collector's time %s for database %u" -msgstr "" +msgstr "stats_timestamp %s es posterior a la fecha del colector %s para la base de datos %u" -#: postmaster/pgstat.c:5004 +#: postmaster/pgstat.c:4997 #, c-format msgid "database hash table corrupted during cleanup --- abort" msgstr "el hash de bases de datos se corrompió durante la finalización; abortando" @@ -18505,10 +18298,9 @@ msgid "could not create any TCP/IP sockets" msgstr "no se pudo crear ningún socket TCP/IP" #: postmaster/postmaster.c:1227 -#, fuzzy, c-format -#| msgid "pgpipe: getsockname() failed: error code %d" +#, c-format msgid "DNSServiceRegister() failed: error code %ld" -msgstr "pgpipe: getsockname() falló: código de error %d" +msgstr "DNSServiceRegister() falló: código de error %ld" #: postmaster/postmaster.c:1279 #, c-format @@ -18551,10 +18343,9 @@ msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Defina la variable de ambiente LC_ALL a un valor válido." #: postmaster/postmaster.c:1487 -#, fuzzy, c-format -#| msgid "%s: could not locate my own executable path\n" +#, c-format msgid "%s: could not locate my own executable path" -msgstr "%s: no se pudo localizar la ruta de mi propio ejecutable\n" +msgstr "%s: no se pudo localizar la ruta de mi propio ejecutable" #: postmaster/postmaster.c:1494 #, c-format @@ -18585,7 +18376,7 @@ msgstr "select() falló en postmaster: %m" #: postmaster/postmaster.c:1857 #, c-format msgid "issuing SIGKILL to recalcitrant children" -msgstr "" +msgstr "enviando SIGKILL a procesos hijos recalcitrantes" #: postmaster/postmaster.c:1878 #, c-format @@ -18607,442 +18398,446 @@ msgstr "el de paquete de inicio tiene largo incorrecto" msgid "failed to send SSL negotiation response: %m" msgstr "no se pudo enviar la respuesta de negociación SSL: %m" -#: postmaster/postmaster.c:2080 +#: postmaster/postmaster.c:2066 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "se recibieron datos no cifrados después de petición SSL" + +#: postmaster/postmaster.c:2067 postmaster/postmaster.c:2111 +#, c-format +msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." +msgstr "Esto podría ser un error en el software cliente o evidencia de un intento de ataque man-in-the-middle." + +#: postmaster/postmaster.c:2092 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "no se pudo enviar la respuesta de negociación GSSAPI: %m" #: postmaster/postmaster.c:2110 #, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "se recibieron datos no cifrados después de petición de cifrado GSSAPI" + +#: postmaster/postmaster.c:2134 +#, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "el protocolo %u.%u no está soportado: servidor soporta %u.0 hasta %u.%u" -#: postmaster/postmaster.c:2174 utils/misc/guc.c:7112 utils/misc/guc.c:7148 -#: utils/misc/guc.c:7218 utils/misc/guc.c:8550 utils/misc/guc.c:11506 -#: utils/misc/guc.c:11547 +#: postmaster/postmaster.c:2198 utils/misc/guc.c:7113 utils/misc/guc.c:7149 +#: utils/misc/guc.c:7219 utils/misc/guc.c:8551 utils/misc/guc.c:11507 +#: utils/misc/guc.c:11548 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "valor no válido para el parámetro «%s»: «%s»" -#: postmaster/postmaster.c:2177 +#: postmaster/postmaster.c:2201 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Los valores válidos son: «false», 0, «true», 1, «database»." -#: postmaster/postmaster.c:2222 +#: postmaster/postmaster.c:2246 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "el paquete de inicio no es válido: se esperaba un terminador en el último byte" -#: postmaster/postmaster.c:2239 +#: postmaster/postmaster.c:2263 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "no se especifica un nombre de usuario en el paquete de inicio" -#: postmaster/postmaster.c:2303 +#: postmaster/postmaster.c:2327 #, c-format msgid "the database system is starting up" msgstr "el sistema de base de datos está iniciándose" -#: postmaster/postmaster.c:2309 -#, fuzzy, c-format -#| msgid "database system is ready to accept connections" +#: postmaster/postmaster.c:2333 +#, c-format msgid "the database system is not yet accepting connections" -msgstr "el sistema de bases de datos está listo para aceptar conexiones" +msgstr "el sistema de bases de datos aún no está aceptando conexiones" -#: postmaster/postmaster.c:2310 -#, fuzzy, c-format -#| msgid "consistent recovery state reached at %X/%X" +#: postmaster/postmaster.c:2334 +#, c-format msgid "Consistent recovery state has not been yet reached." -msgstr "el estado de recuperación consistente fue alcanzado en %X/%X" +msgstr "Aún no se ha alcanzado un estado de recuperación consistente." -#: postmaster/postmaster.c:2314 -#, fuzzy, c-format -#| msgid "database system is ready to accept connections" +#: postmaster/postmaster.c:2338 +#, c-format msgid "the database system is not accepting connections" -msgstr "el sistema de bases de datos está listo para aceptar conexiones" +msgstr "el sistema de bases de datos no está aceptando conexiones" -#: postmaster/postmaster.c:2315 +#: postmaster/postmaster.c:2339 #, c-format msgid "Hot standby mode is disabled." -msgstr "" +msgstr "El modo hot standby está desactivado." -#: postmaster/postmaster.c:2320 +#: postmaster/postmaster.c:2344 #, c-format msgid "the database system is shutting down" msgstr "el sistema de base de datos está apagándose" -#: postmaster/postmaster.c:2325 +#: postmaster/postmaster.c:2349 #, c-format msgid "the database system is in recovery mode" msgstr "el sistema de base de datos está en modo de recuperación" -#: postmaster/postmaster.c:2330 storage/ipc/procarray.c:463 +#: postmaster/postmaster.c:2354 storage/ipc/procarray.c:475 #: storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:361 #, c-format msgid "sorry, too many clients already" msgstr "lo siento, ya tenemos demasiados clientes" -#: postmaster/postmaster.c:2420 +#: postmaster/postmaster.c:2444 #, c-format msgid "wrong key in cancel request for process %d" msgstr "llave incorrecta en la petición de cancelación para el proceso %d" -#: postmaster/postmaster.c:2432 +#: postmaster/postmaster.c:2456 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "el PID %d en la petición de cancelación no coincidió con ningún proceso" -#: postmaster/postmaster.c:2686 +#: postmaster/postmaster.c:2710 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "se recibió SIGHUP, volviendo a cargar archivos de configuración" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2712 postmaster/postmaster.c:2716 +#: postmaster/postmaster.c:2736 postmaster/postmaster.c:2740 #, c-format msgid "%s was not reloaded" msgstr "%s no fue vuelto a cargar" -#: postmaster/postmaster.c:2726 +#: postmaster/postmaster.c:2750 #, c-format msgid "SSL configuration was not reloaded" msgstr "la configuración SSL no fue vuelta a cargar" -#: postmaster/postmaster.c:2782 +#: postmaster/postmaster.c:2806 #, c-format msgid "received smart shutdown request" msgstr "se recibió petición de apagado inteligente" -#: postmaster/postmaster.c:2828 +#: postmaster/postmaster.c:2852 #, c-format msgid "received fast shutdown request" msgstr "se recibió petición de apagado rápido" -#: postmaster/postmaster.c:2846 +#: postmaster/postmaster.c:2870 #, c-format msgid "aborting any active transactions" msgstr "abortando transacciones activas" -#: postmaster/postmaster.c:2870 +#: postmaster/postmaster.c:2894 #, c-format msgid "received immediate shutdown request" msgstr "se recibió petición de apagado inmediato" -#: postmaster/postmaster.c:2947 +#: postmaster/postmaster.c:2971 #, c-format msgid "shutdown at recovery target" msgstr "apagándose al alcanzar el destino de recuperación" -#: postmaster/postmaster.c:2965 postmaster/postmaster.c:3001 +#: postmaster/postmaster.c:2989 postmaster/postmaster.c:3025 msgid "startup process" msgstr "proceso de inicio" -#: postmaster/postmaster.c:2968 +#: postmaster/postmaster.c:2992 #, c-format msgid "aborting startup due to startup process failure" msgstr "abortando el inicio debido a una falla en el procesamiento de inicio" -#: postmaster/postmaster.c:3043 +#: postmaster/postmaster.c:3067 #, c-format msgid "database system is ready to accept connections" msgstr "el sistema de bases de datos está listo para aceptar conexiones" -#: postmaster/postmaster.c:3064 +#: postmaster/postmaster.c:3088 msgid "background writer process" msgstr "proceso background writer" -#: postmaster/postmaster.c:3118 +#: postmaster/postmaster.c:3142 msgid "checkpointer process" msgstr "proceso checkpointer" -#: postmaster/postmaster.c:3134 +#: postmaster/postmaster.c:3158 msgid "WAL writer process" msgstr "proceso escritor de WAL" -#: postmaster/postmaster.c:3149 +#: postmaster/postmaster.c:3173 msgid "WAL receiver process" msgstr "proceso receptor de WAL" -#: postmaster/postmaster.c:3164 +#: postmaster/postmaster.c:3188 msgid "autovacuum launcher process" msgstr "proceso lanzador de autovacuum" -#: postmaster/postmaster.c:3182 +#: postmaster/postmaster.c:3206 msgid "archiver process" msgstr "proceso de archivado" -#: postmaster/postmaster.c:3197 +#: postmaster/postmaster.c:3221 msgid "statistics collector process" msgstr "recolector de estadísticas" -#: postmaster/postmaster.c:3211 +#: postmaster/postmaster.c:3235 msgid "system logger process" msgstr "proceso de log" -#: postmaster/postmaster.c:3275 +#: postmaster/postmaster.c:3299 #, c-format msgid "background worker \"%s\"" msgstr "proceso ayudante «%s»" -#: postmaster/postmaster.c:3359 postmaster/postmaster.c:3379 -#: postmaster/postmaster.c:3386 postmaster/postmaster.c:3404 +#: postmaster/postmaster.c:3383 postmaster/postmaster.c:3403 +#: postmaster/postmaster.c:3410 postmaster/postmaster.c:3428 msgid "server process" msgstr "proceso de servidor" -#: postmaster/postmaster.c:3458 +#: postmaster/postmaster.c:3482 #, c-format msgid "terminating any other active server processes" msgstr "terminando todos los otros procesos de servidor activos" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3711 +#: postmaster/postmaster.c:3735 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) terminó con código de salida %d" -#: postmaster/postmaster.c:3713 postmaster/postmaster.c:3725 -#: postmaster/postmaster.c:3735 postmaster/postmaster.c:3746 +#: postmaster/postmaster.c:3737 postmaster/postmaster.c:3749 +#: postmaster/postmaster.c:3759 postmaster/postmaster.c:3770 #, c-format msgid "Failed process was running: %s" msgstr "El proceso que falló estaba ejecutando: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3722 +#: postmaster/postmaster.c:3746 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) fue terminado por una excepción 0x%X" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3732 +#: postmaster/postmaster.c:3756 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) fue terminado por una señal %d: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3744 +#: postmaster/postmaster.c:3768 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) terminó con código %d no reconocido" -#: postmaster/postmaster.c:3959 +#: postmaster/postmaster.c:3982 #, c-format msgid "abnormal database system shutdown" msgstr "apagado anormal del sistema de bases de datos" -#: postmaster/postmaster.c:3997 -#, fuzzy, c-format -#| msgid "aborting startup due to startup process failure" +#: postmaster/postmaster.c:4020 +#, c-format msgid "shutting down due to startup process failure" -msgstr "abortando el inicio debido a una falla en el procesamiento de inicio" +msgstr "apagando debido a una falla en el procesamiento de inicio" -#: postmaster/postmaster.c:4003 +#: postmaster/postmaster.c:4026 #, c-format msgid "shutting down because restart_after_crash is off" -msgstr "" +msgstr "apagando debido a que restart_after_crash está desactivado" -#: postmaster/postmaster.c:4015 +#: postmaster/postmaster.c:4038 #, c-format msgid "all server processes terminated; reinitializing" msgstr "todos los procesos fueron terminados; reinicializando" -#: postmaster/postmaster.c:4189 postmaster/postmaster.c:5548 -#: postmaster/postmaster.c:5939 +#: postmaster/postmaster.c:4212 postmaster/postmaster.c:5571 +#: postmaster/postmaster.c:5962 #, c-format msgid "could not generate random cancel key" msgstr "no se pudo generar una llave de cancelación aleatoria" -#: postmaster/postmaster.c:4243 +#: postmaster/postmaster.c:4266 #, c-format msgid "could not fork new process for connection: %m" msgstr "no se pudo lanzar el nuevo proceso para la conexión: %m" -#: postmaster/postmaster.c:4285 +#: postmaster/postmaster.c:4308 msgid "could not fork new process for connection: " msgstr "no se pudo lanzar el nuevo proceso para la conexión: " -#: postmaster/postmaster.c:4391 +#: postmaster/postmaster.c:4414 #, c-format msgid "connection received: host=%s port=%s" msgstr "conexión recibida: host=%s port=%s" -#: postmaster/postmaster.c:4396 +#: postmaster/postmaster.c:4419 #, c-format msgid "connection received: host=%s" msgstr "conexión recibida: host=%s" -#: postmaster/postmaster.c:4639 +#: postmaster/postmaster.c:4662 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "no se pudo lanzar el proceso servidor «%s»: %m" -#: postmaster/postmaster.c:4697 -#, fuzzy, c-format -#| msgid "could not close handle to backend parameter variables: error code %lu\n" +#: postmaster/postmaster.c:4720 +#, c-format msgid "could not create backend parameter file mapping: error code %lu" -msgstr "no se pudo cerrar el archivo de variables de servidor: código de error %lu\n" +msgstr "no se pudo crear mapeo de archivo de parámetros de servidor: código de error %lu" -#: postmaster/postmaster.c:4706 -#, fuzzy, c-format -#| msgid "could not map view of backend variables: error code %lu\n" +#: postmaster/postmaster.c:4729 +#, c-format msgid "could not map backend parameter memory: error code %lu" -msgstr "no se pudo mapear la vista del archivo de variables: código de error %lu\n" +msgstr "no se pudo mapear memoria para parámetros de servidor: código de error %lu" -#: postmaster/postmaster.c:4733 -#, fuzzy, c-format -#| msgid "command too long\n" +#: postmaster/postmaster.c:4756 +#, c-format msgid "subprocess command line too long" -msgstr "orden demasiado larga\n" +msgstr "orden de subproceso demasiado larga" -#: postmaster/postmaster.c:4751 -#, fuzzy, c-format -#| msgid "pgpipe: getsockname() failed: error code %d" +#: postmaster/postmaster.c:4774 +#, c-format msgid "CreateProcess() call failed: %m (error code %lu)" -msgstr "pgpipe: getsockname() falló: código de error %d" +msgstr "llamada a CreateProcess() falló: %m (código de error %lu)" -#: postmaster/postmaster.c:4778 -#, fuzzy, c-format -#| msgid "could not unmap view of backend variables: error code %lu\n" +#: postmaster/postmaster.c:4801 +#, c-format msgid "could not unmap view of backend parameter file: error code %lu" -msgstr "no se pudo desmapear la vista del archivo de variables: código de error %lu\n" +msgstr "no se pudo desmapear la vista del archivo de parámetros de servidor: código de error %lu" -#: postmaster/postmaster.c:4782 -#, fuzzy, c-format -#| msgid "could not close handle to backend parameter variables: error code %lu\n" +#: postmaster/postmaster.c:4805 +#, c-format msgid "could not close handle to backend parameter file: error code %lu" -msgstr "no se pudo cerrar el archivo de variables de servidor: código de error %lu\n" +msgstr "no se pudo cerrar el archivo de parámetros de servidor: código de error %lu" -#: postmaster/postmaster.c:4804 +#: postmaster/postmaster.c:4827 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "renunciar después de demasiados intentos de reservar memoria compartida" -#: postmaster/postmaster.c:4805 +#: postmaster/postmaster.c:4828 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "Esto podría deberse a ASLR o un software antivirus." -#: postmaster/postmaster.c:4995 +#: postmaster/postmaster.c:5018 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "No se pudo cargar la configuración SSL en proceso secundario" -#: postmaster/postmaster.c:5121 +#: postmaster/postmaster.c:5144 #, c-format msgid "Please report this to <%s>." msgstr "Por favor reporte esto a <%s>." -#: postmaster/postmaster.c:5208 +#: postmaster/postmaster.c:5231 #, c-format -msgid "database system is ready to accept read only connections" +msgid "database system is ready to accept read-only connections" msgstr "el sistema de bases de datos está listo para aceptar conexiones de sólo lectura" -#: postmaster/postmaster.c:5472 +#: postmaster/postmaster.c:5495 #, c-format msgid "could not fork startup process: %m" msgstr "no se pudo lanzar el proceso de inicio: %m" -#: postmaster/postmaster.c:5476 -#, fuzzy, c-format -#| msgid "could not fork WAL receiver process: %m" +#: postmaster/postmaster.c:5499 +#, c-format msgid "could not fork archiver process: %m" -msgstr "no se pudo lanzar el proceso receptor de WAL: %m" +msgstr "no se pudo lanzar el proceso de archivado: %m" -#: postmaster/postmaster.c:5480 +#: postmaster/postmaster.c:5503 #, c-format msgid "could not fork background writer process: %m" msgstr "no se pudo lanzar el background writer: %m" -#: postmaster/postmaster.c:5484 +#: postmaster/postmaster.c:5507 #, c-format msgid "could not fork checkpointer process: %m" msgstr "no se pudo lanzar el checkpointer: %m" -#: postmaster/postmaster.c:5488 +#: postmaster/postmaster.c:5511 #, c-format msgid "could not fork WAL writer process: %m" msgstr "no se pudo lanzar el proceso escritor de WAL: %m" -#: postmaster/postmaster.c:5492 +#: postmaster/postmaster.c:5515 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "no se pudo lanzar el proceso receptor de WAL: %m" -#: postmaster/postmaster.c:5496 +#: postmaster/postmaster.c:5519 #, c-format msgid "could not fork process: %m" msgstr "no se pudo lanzar el proceso: %m" -#: postmaster/postmaster.c:5697 postmaster/postmaster.c:5720 +#: postmaster/postmaster.c:5720 postmaster/postmaster.c:5743 #, c-format msgid "database connection requirement not indicated during registration" msgstr "el requerimiento de conexión a base de datos no fue indicado durante el registro" -#: postmaster/postmaster.c:5704 postmaster/postmaster.c:5727 +#: postmaster/postmaster.c:5727 postmaster/postmaster.c:5750 #, c-format msgid "invalid processing mode in background worker" msgstr "modo de procesamiento no válido en proceso ayudante" -#: postmaster/postmaster.c:5812 +#: postmaster/postmaster.c:5835 #, c-format msgid "could not fork worker process: %m" msgstr "no se pudo lanzar el proceso ayudante: %m" -#: postmaster/postmaster.c:5925 +#: postmaster/postmaster.c:5948 #, c-format msgid "no slot available for new worker process" msgstr "no hay slot disponible para un nuevo proceso ayudante" -#: postmaster/postmaster.c:6259 +#: postmaster/postmaster.c:6282 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "no se pudo duplicar el socket %d para su empleo en el backend: código de error %d" -#: postmaster/postmaster.c:6291 +#: postmaster/postmaster.c:6314 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "no se pudo crear el socket heradado: código de error %d\n" -#: postmaster/postmaster.c:6320 +#: postmaster/postmaster.c:6343 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "no se pudo abrir el archivo de variables de servidor «%s»: %s\n" -#: postmaster/postmaster.c:6327 +#: postmaster/postmaster.c:6350 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "no se pudo leer el archivo de variables de servidor «%s»: %s\n" -#: postmaster/postmaster.c:6336 +#: postmaster/postmaster.c:6359 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "no se pudo eliminar el archivo «%s»: %s\n" -#: postmaster/postmaster.c:6353 +#: postmaster/postmaster.c:6376 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "no se pudo mapear la vista del archivo de variables: código de error %lu\n" -#: postmaster/postmaster.c:6362 +#: postmaster/postmaster.c:6385 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "no se pudo desmapear la vista del archivo de variables: código de error %lu\n" -#: postmaster/postmaster.c:6369 +#: postmaster/postmaster.c:6392 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "no se pudo cerrar el archivo de variables de servidor: código de error %lu\n" -#: postmaster/postmaster.c:6546 +#: postmaster/postmaster.c:6569 #, c-format msgid "could not read exit code for process\n" msgstr "no se pudo leer el código de salida del proceso\n" -#: postmaster/postmaster.c:6551 +#: postmaster/postmaster.c:6574 #, c-format msgid "could not post child completion status\n" msgstr "no se pudo publicar el estado de completitud del proceso hijo\n" @@ -19120,27 +18915,27 @@ msgstr "posición de inicio de flujo de WAL no válida" msgid "unterminated quoted string" msgstr "una cadena de caracteres entre comillas está inconclusa" -#: replication/backup_manifest.c:255 +#: replication/backup_manifest.c:251 #, c-format msgid "expected end timeline %u but found timeline %u" msgstr "se esperaba el timeline de término %u pero se encontró el tieneline %u" -#: replication/backup_manifest.c:272 +#: replication/backup_manifest.c:275 #, c-format msgid "expected start timeline %u but found timeline %u" msgstr "se esperaba el timeline de inicio %u pero se encontró el timeline %u" -#: replication/backup_manifest.c:299 +#: replication/backup_manifest.c:302 #, c-format msgid "start timeline %u not found in history of timeline %u" msgstr "el timeline de inicio %u no fue encontrado en la historia del timeline %u" -#: replication/backup_manifest.c:352 +#: replication/backup_manifest.c:353 #, c-format msgid "could not rewind temporary file" msgstr "no se puede rebobinar el archivo temporal" -#: replication/backup_manifest.c:379 +#: replication/backup_manifest.c:380 #, c-format msgid "could not read from temporary file: %m" msgstr "no se pudo leer del archivo temporal: %m" @@ -19167,11 +18962,10 @@ msgid "base backup could not send data, aborting backup" msgstr "el respaldo base no pudo enviar datos, abortando el respaldo" #: replication/basebackup.c:722 -#, fuzzy, c-format -#| msgid "%lld total checksum verification failures" +#, c-format msgid "%lld total checksum verification failure" msgid_plural "%lld total checksum verification failures" -msgstr[0] "%lld fallas de verificación de suma de comprobación en total" +msgstr[0] "%lld falla de verificación de suma de comprobación en total" msgstr[1] "%lld fallas de verificación de suma de comprobación en total" #: replication/basebackup.c:729 @@ -19204,10 +18998,9 @@ msgid "unrecognized checksum algorithm: \"%s\"" msgstr "algoritmo de suma de comprobación no reconocido: \"%s\"" #: replication/basebackup.c:918 -#, fuzzy, c-format -#| msgid "manifest checksum mismatch" +#, c-format msgid "manifest checksums require a backup manifest" -msgstr "discordancia en la suma de comprobación del manifiesto" +msgstr "la suma de comprobación del manifiesto requiere un manifiesto de la copia de seguridad" #: replication/basebackup.c:1519 #, c-format @@ -19220,16 +19013,14 @@ msgid "invalid segment number %d in file \"%s\"" msgstr "número de segmento %d no válido en archivo «%s»" #: replication/basebackup.c:1678 -#, fuzzy, c-format -#| msgid "could not verify checksum in file \"%s\", block %d: read buffer size %d and page size %d differ" +#, c-format msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" -msgstr "no se pudo verificar el checksum en el archivo «%s», bloque %d: el tamaño leído %d y el tamaño de página %d difieren" +msgstr "no se pudo verificar el checksum en el archivo «%s», bloque %u: el tamaño de búfer de lectura %d y el tamaño de página %d difieren" #: replication/basebackup.c:1751 -#, fuzzy, c-format -#| msgid "checksum verification failed in file \"%s\", block %d: calculated %X but expected %X" +#, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" -msgstr "verificación de checksums falló en archivo «%s», bloque %d: calculado %X pero se esperaba %X" +msgstr "verificación de checksums falló en archivo «%s», bloque %u: calculado %X pero se esperaba %X" #: replication/basebackup.c:1758 #, c-format @@ -19254,121 +19045,118 @@ msgid "symbolic link target too long for tar format: file name \"%s\", target \" msgstr "destino de enlace simbólico demasiado largo para el formato tar: nombre de archivo «%s», destino «%s»" #: replication/libpqwalreceiver/libpqwalreceiver.c:227 -#, fuzzy, c-format -#| msgid "could not clear search_path: %s" +#, c-format msgid "could not clear search path: %s" -msgstr "no se pudo limpiar search_path: %s" +msgstr "no se pudo limpiar la ruta de búsqueda: %s" #: replication/libpqwalreceiver/libpqwalreceiver.c:256 #, c-format msgid "invalid connection string syntax: %s" msgstr "sintaxis de cadena de conexión no válida: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:281 +#: replication/libpqwalreceiver/libpqwalreceiver.c:282 #, c-format msgid "could not parse connection string: %s" msgstr "no se pudo interpretar la cadena de conexión: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:353 +#: replication/libpqwalreceiver/libpqwalreceiver.c:355 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "no se pudo recibir el identificador de sistema y el ID de timeline del servidor primario: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:364 -#: replication/libpqwalreceiver/libpqwalreceiver.c:588 +#: replication/libpqwalreceiver/libpqwalreceiver.c:367 +#: replication/libpqwalreceiver/libpqwalreceiver.c:601 #, c-format msgid "invalid response from primary server" msgstr "respuesta no válida del servidor primario" -#: replication/libpqwalreceiver/libpqwalreceiver.c:365 +#: replication/libpqwalreceiver/libpqwalreceiver.c:368 #, c-format msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." msgstr "No se pudo identificar el sistema: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d o más campos." -#: replication/libpqwalreceiver/libpqwalreceiver.c:440 -#: replication/libpqwalreceiver/libpqwalreceiver.c:446 -#: replication/libpqwalreceiver/libpqwalreceiver.c:475 +#: replication/libpqwalreceiver/libpqwalreceiver.c:444 +#: replication/libpqwalreceiver/libpqwalreceiver.c:451 +#: replication/libpqwalreceiver/libpqwalreceiver.c:481 #, c-format msgid "could not start WAL streaming: %s" msgstr "no se pudo iniciar el flujo de WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:498 +#: replication/libpqwalreceiver/libpqwalreceiver.c:505 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "no se pudo enviar el mensaje fin-de-flujo al primario: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:520 +#: replication/libpqwalreceiver/libpqwalreceiver.c:528 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "conjunto de resultados inesperado después del fin-de-flujo" -#: replication/libpqwalreceiver/libpqwalreceiver.c:534 +#: replication/libpqwalreceiver/libpqwalreceiver.c:543 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "ocurrió un error mientras se apagaba el flujo COPY: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:543 +#: replication/libpqwalreceiver/libpqwalreceiver.c:553 #, c-format msgid "error reading result of streaming command: %s" msgstr "ocurrió un error mientras se leía la orden de flujo: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:551 -#: replication/libpqwalreceiver/libpqwalreceiver.c:785 +#: replication/libpqwalreceiver/libpqwalreceiver.c:562 +#: replication/libpqwalreceiver/libpqwalreceiver.c:800 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "resultado inesperado después de CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:577 +#: replication/libpqwalreceiver/libpqwalreceiver.c:589 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "no se pudo recibir el archivo de historia de timeline del servidor primario: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:589 +#: replication/libpqwalreceiver/libpqwalreceiver.c:602 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "Se esperaba 1 tupla con 2 campos, se obtuvieron %d tuplas con %d campos." -#: replication/libpqwalreceiver/libpqwalreceiver.c:749 -#: replication/libpqwalreceiver/libpqwalreceiver.c:800 -#: replication/libpqwalreceiver/libpqwalreceiver.c:806 +#: replication/libpqwalreceiver/libpqwalreceiver.c:763 +#: replication/libpqwalreceiver/libpqwalreceiver.c:816 +#: replication/libpqwalreceiver/libpqwalreceiver.c:823 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "no se pudo recibir datos desde el flujo de WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:825 +#: replication/libpqwalreceiver/libpqwalreceiver.c:843 #, c-format msgid "could not send data to WAL stream: %s" msgstr "no se pudo enviar datos al flujo de WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:878 +#: replication/libpqwalreceiver/libpqwalreceiver.c:897 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "no se pudo create el slot de replicación «%s»: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:923 +#: replication/libpqwalreceiver/libpqwalreceiver.c:943 #, c-format msgid "invalid query response" msgstr "respuesta no válida a consulta" -#: replication/libpqwalreceiver/libpqwalreceiver.c:924 +#: replication/libpqwalreceiver/libpqwalreceiver.c:944 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Se esperaban %d campos, se obtuvieron %d campos." -#: replication/libpqwalreceiver/libpqwalreceiver.c:994 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1014 #, c-format msgid "the query interface requires a database connection" msgstr "la interfaz de consulta requiere una conexión a base de datos" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1025 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1045 msgid "empty query" msgstr "consulta vacía" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1031 -#, fuzzy -#| msgid "unexpected delimiter" +#: replication/libpqwalreceiver/libpqwalreceiver.c:1051 msgid "unexpected pipeline mode" -msgstr "delimitador inesperado" +msgstr "modo pipeline inesperado" #: replication/logical/launcher.c:286 #, c-format @@ -19457,64 +19245,28 @@ msgstr "slot «%s», plugin de salida «%s», en el callback %s, LSN asociado %X msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "slot «%s», plugin de salida «%s», en el callback %s" -#: replication/logical/logical.c:868 +#: replication/logical/logical.c:868 replication/logical/logical.c:912 +#: replication/logical/logical.c:956 replication/logical/logical.c:1001 #, c-format -msgid "logical replication at prepare time requires begin_prepare_cb callback" -msgstr "" +msgid "logical replication at prepare time requires a %s callback" +msgstr "durante la preparación, la replicación lógica requiere una función callback %s" -#: replication/logical/logical.c:911 +#: replication/logical/logical.c:1224 replication/logical/logical.c:1271 +#: replication/logical/logical.c:1311 replication/logical/logical.c:1395 +#: replication/logical/logical.c:1442 #, c-format -msgid "logical replication at prepare time requires prepare_cb callback" -msgstr "" +msgid "logical streaming requires a %s callback" +msgstr "el flujo lógico requiere una función callback %s" -#: replication/logical/logical.c:954 +#: replication/logical/logical.c:1355 #, c-format -msgid "logical replication at prepare time requires commit_prepared_cb callback" -msgstr "" +msgid "logical streaming at prepare time requires a %s callback" +msgstr "durante la preparación, el flujo lógico requiere una función callback %s" -#: replication/logical/logical.c:998 +#: replication/logical/logicalfuncs.c:104 replication/slotfuncs.c:34 #, c-format -msgid "logical replication at prepare time requires rollback_prepared_cb callback" -msgstr "" - -#: replication/logical/logical.c:1220 -#, fuzzy, c-format -#| msgid "logical decoding requires a database connection" -msgid "logical streaming requires a stream_start_cb callback" -msgstr "decodificación lógica requiere una conexión a una base de datos" - -#: replication/logical/logical.c:1266 -#, fuzzy, c-format -#| msgid "logical decoding requires a database connection" -msgid "logical streaming requires a stream_stop_cb callback" -msgstr "decodificación lógica requiere una conexión a una base de datos" - -#: replication/logical/logical.c:1305 -#, fuzzy, c-format -#| msgid "logical decoding requires a database connection" -msgid "logical streaming requires a stream_abort_cb callback" -msgstr "decodificación lógica requiere una conexión a una base de datos" - -#: replication/logical/logical.c:1348 -#, c-format -msgid "logical streaming at prepare time requires a stream_prepare_cb callback" -msgstr "" - -#: replication/logical/logical.c:1387 -#, c-format -msgid "logical streaming requires a stream_commit_cb callback" -msgstr "" - -#: replication/logical/logical.c:1433 -#, fuzzy, c-format -#| msgid "logical decoding requires a database connection" -msgid "logical streaming requires a stream_change_cb callback" -msgstr "decodificación lógica requiere una conexión a una base de datos" - -#: replication/logical/logicalfuncs.c:104 replication/slotfuncs.c:34 -#, c-format -msgid "must be superuser or replication role to use replication slots" -msgstr "debe ser superusuario o rol de replicación para usar slots de replicación" +msgid "must be superuser or replication role to use replication slots" +msgstr "debe ser superusuario o rol de replicación para usar slots de replicación" #: replication/logical/logicalfuncs.c:134 #, c-format @@ -19543,14 +19295,12 @@ msgid "array must have even number of elements" msgstr "el array debe tener un número par de elementos" #: replication/logical/logicalfuncs.c:251 -#, fuzzy, c-format -#| msgid "cannot change relation \"%s\"" +#, c-format msgid "can no longer get changes from replication slot \"%s\"" -msgstr "no se puede cambiar la relación «%s»" +msgstr "ya no se pueden recibir cambios desde el slot de replicación «%s»" #: replication/logical/logicalfuncs.c:253 replication/slotfuncs.c:650 -#, fuzzy, c-format -#| msgid "This slot has never previously reserved WAL, or has been invalidated." +#, c-format msgid "This slot has never previously reserved WAL, or it has been invalidated." msgstr "Este slot nunca ha reservado WAL previamente, o ha sido invalidado." @@ -19600,10 +19350,9 @@ msgid "could not find free replication state, increase max_replication_slots" msgstr "no se pudo encontrar una estructura de replicación libre, incremente max_replication_slots" #: replication/logical/origin.c:790 -#, fuzzy, c-format -#| msgid "recovery restart point at %X/%X" +#, c-format msgid "recovered replication state of node %u to %X/%X" -msgstr "restartpoint de recuperación en %X/%X" +msgstr "se recuperó estado de replicación de nodo %u a %X/%X" #: replication/logical/origin.c:800 #, c-format @@ -19621,7 +19370,7 @@ msgid "could not find free replication state slot for replication origin with OI msgstr "no se pudo encontrar un slot libre para el estado del origen de replicación con OID %u" #: replication/logical/origin.c:941 replication/logical/origin.c:1128 -#: replication/slot.c:1865 +#: replication/slot.c:1860 #, c-format msgid "Increase max_replication_slots and try again." msgstr "Aumente max_replication_slots y reintente." @@ -19647,58 +19396,57 @@ msgstr "el nombre de origen de replicación «%s» está reservado" msgid "Origin names starting with \"pg_\" are reserved." msgstr "Los nombres de origen que empiezan con «pg_» están reservados." -#: replication/logical/relation.c:248 +#: replication/logical/relation.c:234 #, c-format msgid "\"%s\"" -msgstr "" +msgstr "«%s»" -#: replication/logical/relation.c:251 +#: replication/logical/relation.c:237 #, c-format msgid ", \"%s\"" -msgstr "" +msgstr ", «%s»" -#: replication/logical/relation.c:257 -#, fuzzy, c-format -#| msgid "logical replication target relation \"%s.%s\" is missing some replicated columns" +#: replication/logical/relation.c:243 +#, c-format msgid "logical replication target relation \"%s.%s\" is missing replicated column: %s" msgid_plural "logical replication target relation \"%s.%s\" is missing replicated columns: %s" -msgstr[0] "a la relación destino de replicación lógica «%s.%s» le faltan algunas columnas replicadas" -msgstr[1] "a la relación destino de replicación lógica «%s.%s» le faltan algunas columnas replicadas" +msgstr[0] "a la relación destino de replicación lógica «%s.%s» le falta la columna replicada: %s" +msgstr[1] "a la relación destino de replicación lógica «%s.%s» le faltan las columnas replicadas: %s" -#: replication/logical/relation.c:337 +#: replication/logical/relation.c:323 #, c-format msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "la relación destino de replicación lógica «%s.%s» no existe" -#: replication/logical/relation.c:418 +#: replication/logical/relation.c:404 #, c-format msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" msgstr "la relación de destino de replicación lógica «%s.%s» usa columnas de sistemas en el índice REPLICA IDENTITY" -#: replication/logical/reorderbuffer.c:3777 +#: replication/logical/reorderbuffer.c:3802 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "no se pudo escribir al archivo de datos para el XID %u: %m" -#: replication/logical/reorderbuffer.c:4120 -#: replication/logical/reorderbuffer.c:4145 +#: replication/logical/reorderbuffer.c:4146 +#: replication/logical/reorderbuffer.c:4171 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "no se pudo leer desde el archivo de desborde de reorderbuffer: %m" -#: replication/logical/reorderbuffer.c:4124 -#: replication/logical/reorderbuffer.c:4149 +#: replication/logical/reorderbuffer.c:4150 +#: replication/logical/reorderbuffer.c:4175 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "no se pudo leer desde el archivo de desborde de reorderbuffer: se leyeron sólo %d en ve de %u bytes" -#: replication/logical/reorderbuffer.c:4397 +#: replication/logical/reorderbuffer.c:4425 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "no se pudo borrar el archivo «%s» durante la eliminación de pg_replslot/%s/xid*: %m" # FIXME almost duplicated again!? -#: replication/logical/reorderbuffer.c:4887 +#: replication/logical/reorderbuffer.c:4924 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "no se pudo leer del archivo «%s»: se leyeron %d en lugar de %d bytes" @@ -19716,59 +19464,59 @@ msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs msgstr[0] "se exportó un snapshot de decodificación lógica: «%s» con %u ID de transacción" msgstr[1] "se exportó un snapshot de decodificación lógica: «%s» con %u IDs de transacción" -#: replication/logical/snapbuild.c:1254 replication/logical/snapbuild.c:1347 -#: replication/logical/snapbuild.c:1878 +#: replication/logical/snapbuild.c:1270 replication/logical/snapbuild.c:1363 +#: replication/logical/snapbuild.c:1894 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "la decodificación lógica encontró un punto consistente en %X/%X" -#: replication/logical/snapbuild.c:1256 +#: replication/logical/snapbuild.c:1272 #, c-format msgid "There are no running transactions." msgstr "No hay transacciones en ejecución." -#: replication/logical/snapbuild.c:1298 +#: replication/logical/snapbuild.c:1314 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "decodificación lógica encontró punto de inicio en %X/%X" -#: replication/logical/snapbuild.c:1300 replication/logical/snapbuild.c:1324 +#: replication/logical/snapbuild.c:1316 replication/logical/snapbuild.c:1340 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "Esperando que las (aproximadamente %d) transacciones más antiguas que %u terminen." -#: replication/logical/snapbuild.c:1322 +#: replication/logical/snapbuild.c:1338 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "la decodificación lógica encontró un punto consistente inicial en %X/%X" -#: replication/logical/snapbuild.c:1349 +#: replication/logical/snapbuild.c:1365 #, c-format msgid "There are no old transactions anymore." msgstr "Ya no hay transacciones antiguas en ejecución." # FIXME "snapbuild"? -#: replication/logical/snapbuild.c:1746 +#: replication/logical/snapbuild.c:1762 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "el archivo de estado de snapbuild «%s» tiene número mágico erróneo: %u en lugar de %u" -#: replication/logical/snapbuild.c:1752 +#: replication/logical/snapbuild.c:1768 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "el archivo de estado de snapbuild «%s» tiene versión no soportada: %u en vez de %u" -#: replication/logical/snapbuild.c:1823 +#: replication/logical/snapbuild.c:1839 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "suma de verificación no coincidente para el archivo de estado de snapbuild «%s»: es %u, debería ser %u" -#: replication/logical/snapbuild.c:1880 +#: replication/logical/snapbuild.c:1896 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "La decodificación lógica comenzará usando el snapshot guardado." -#: replication/logical/snapbuild.c:1952 +#: replication/logical/snapbuild.c:1968 #, c-format msgid "could not parse file name \"%s\"" msgstr "no se pudo interpretar el nombre de archivo «%s»" @@ -19778,129 +19526,112 @@ msgstr "no se pudo interpretar el nombre de archivo «%s»" msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" msgstr "el ayudante de sincronización de tabla de replicación lógica para la suscripción «%s», tabla «%s» ha terminado" -#: replication/logical/tablesync.c:726 replication/logical/tablesync.c:767 +#: replication/logical/tablesync.c:727 replication/logical/tablesync.c:770 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "no se pudo obtener información de la tabla «%s.%s» del editor (publisher): %s" -#: replication/logical/tablesync.c:732 +#: replication/logical/tablesync.c:734 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "la tabla \"%s.%s\" no fue encontrada en el editor (publisher)" -#: replication/logical/tablesync.c:854 +#: replication/logical/tablesync.c:858 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "no se pudo iniciar la copia de contenido inicial para de la tabla «%s.%s»: %s" -#: replication/logical/tablesync.c:1053 -#, fuzzy, c-format -#| msgid "table copy could not start transaction on publisher" +#: replication/logical/tablesync.c:1059 +#, c-format msgid "table copy could not start transaction on publisher: %s" -msgstr "la copia de la tabla no pudo iniciar una transacción en el editor (publisher)" +msgstr "la copia de la tabla no pudo iniciar una transacción en el editor (publisher): %s" -#: replication/logical/tablesync.c:1101 -#, fuzzy, c-format -#| msgid "replication slot \"%s\" already exists" +#: replication/logical/tablesync.c:1107 +#, c-format msgid "replication origin \"%s\" already exists" -msgstr "el slot de replicación «%s» ya existe" +msgstr "el origen de replicación «%s» ya existe" -#: replication/logical/tablesync.c:1113 -#, fuzzy, c-format -#| msgid "table copy could not finish transaction on publisher" +#: replication/logical/tablesync.c:1120 +#, c-format msgid "table copy could not finish transaction on publisher: %s" -msgstr "la copia de tabla no pudo terminar la transacción en el editor (publisher)" +msgstr "la copia de tabla no pudo terminar la transacción en el editor (publisher): %s" -#: replication/logical/worker.c:527 +#: replication/logical/worker.c:518 #, c-format -msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\", remote type %s, local type %s" -msgstr "Procesamiento de datos remotos para la relación de destino de replicación \"%s.%s\" columna \"%s\", tipo remoto %s, tipo local %s" +msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgstr "Procesamiento de datos remotos para la relación de destino de replicación \"%s.%s\" columna \"%s\"" -#: replication/logical/worker.c:607 replication/logical/worker.c:736 -#, fuzzy, c-format -#| msgid "incorrect binary data format in function argument %d" +#: replication/logical/worker.c:593 replication/logical/worker.c:719 +#, c-format msgid "incorrect binary data format in logical replication column %d" -msgstr "el formato de datos binarios es incorrecto en argumento %d a función" +msgstr "el formato de datos binarios es incorrecto en columna de replicación lógica %d" -#: replication/logical/worker.c:815 +#: replication/logical/worker.c:1090 replication/logical/worker.c:1104 #, c-format -msgid "ORIGIN message sent out of order" -msgstr "mensaje ORIGIN enviado fuera de orden" - -#: replication/logical/worker.c:1080 replication/logical/worker.c:1092 -#, fuzzy, c-format -#| msgid "could not read from backend variables file \"%s\": %s\n" msgid "could not read from streaming transaction's changes file \"%s\": %m" -msgstr "no se pudo leer el archivo de variables de servidor «%s»: %s\n" +msgstr "no se pudo leer el archivo de cambios de transacción en flujo «%s»: %m" -#: replication/logical/worker.c:1322 +#: replication/logical/worker.c:1335 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" msgstr "el editor (publisher) no envía la columna identidad de réplica esperada por la relación de destino de replicación lógica «%s.%s»" -#: replication/logical/worker.c:1329 +#: replication/logical/worker.c:1342 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "la relación destino de replicación lógica «%s.%s» no tiene índice REPLICA IDENTITY ni PRIMARY KEY y la relación publicada no tiene REPLICA IDENTITY FULL" -#: replication/logical/worker.c:2050 -#, c-format -msgid "invalid logical replication message type \"%c\"" -msgstr "tipo de mensaje de replicación lógica «%c» no válido" - -#: replication/logical/worker.c:2201 +#: replication/logical/worker.c:2221 #, c-format msgid "data stream from publisher has ended" msgstr "el flujo de datos del publisher ha terminado" -#: replication/logical/worker.c:2351 +#: replication/logical/worker.c:2372 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "terminando el proceso de replicación lógica debido a que se agotó el tiempo de espera" -#: replication/logical/worker.c:2499 +#: replication/logical/worker.c:2520 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se detendrá porque la suscripción fue eliminada" -#: replication/logical/worker.c:2513 +#: replication/logical/worker.c:2534 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se detendrá porque la suscripción fue inhabilitada" -#: replication/logical/worker.c:2535 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" will restart because subscription was renamed" +#: replication/logical/worker.c:2556 +#, c-format msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" -msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se reiniciará porque a la suscripción se le cambió el nombre" +msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se reiniciará por un cambio de parámetro" -#: replication/logical/worker.c:2698 replication/logical/worker.c:2720 -#, fuzzy, c-format -#| msgid "could not read from file \"%s\": %m" +#: replication/logical/worker.c:2721 replication/logical/worker.c:2743 +#, c-format msgid "could not read from streaming transaction's subxact file \"%s\": %m" -msgstr "no se pudo leer el archivo «%s»: %m" +msgstr "no se pudo leer el archivo subxact de transacción en flujo «%s»: %m" -#: replication/logical/worker.c:3066 +#: replication/logical/worker.c:3102 #, c-format msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" msgstr "el ayudante «apply» de replicación lógica para la suscripción %u no se iniciará porque la suscripción fue eliminada durante el inicio" -#: replication/logical/worker.c:3078 +#: replication/logical/worker.c:3114 #, c-format msgid "logical replication apply worker for subscription \"%s\" will not start because the subscription was disabled during startup" msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» no se iniciará porque la suscripción fue inhabilitada durante el inicio" -#: replication/logical/worker.c:3096 +#: replication/logical/worker.c:3132 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "el ayudante de sincronización de tabla de replicación lógica para la suscripción «%s», tabla «%s» ha iniciado" -#: replication/logical/worker.c:3100 +#: replication/logical/worker.c:3136 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» ha iniciado" -#: replication/logical/worker.c:3137 +#: replication/logical/worker.c:3174 #, c-format msgid "subscription has no replication slot set" msgstr "la suscripción no tiene un slot de replicación establecido" @@ -19936,134 +19667,131 @@ msgid "publication_names parameter missing" msgstr "parámetro publication_names faltante" #: replication/pgoutput/pgoutput.c:312 -#, fuzzy, c-format -#| msgid "client sent proto_version=%d but we only support protocol %d or higher" +#, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" -msgstr "el cliente envió proto_version=%d pero sólo soportamos el protocolo %d o superior" +msgstr "la proto_version=%d no soporta flujo, se necesita %d o superior" #: replication/pgoutput/pgoutput.c:317 -#, fuzzy, c-format -#| msgid "integer of size %lu not supported by pqPutInt" +#, c-format msgid "streaming requested, but not supported by output plugin" -msgstr "el entero de tamaño %lu no está soportado por pqPutInt" +msgstr "se solicitó flujo, pero no está soportado por plugin de salida" -#: replication/slot.c:182 +#: replication/slot.c:180 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "el nombre de slot de replicación «%s» es demasiado corto" -#: replication/slot.c:191 +#: replication/slot.c:189 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "el nombre de slot de replicación «%s» es demasiado largo" -#: replication/slot.c:204 +#: replication/slot.c:202 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "el nombre de slot de replicación «%s» contiene caracteres no válidos" -#: replication/slot.c:206 +#: replication/slot.c:204 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "Los nombres de slots de replicación sólo pueden contener letras minúsculas, números y el carácter «_»." -#: replication/slot.c:260 +#: replication/slot.c:258 #, c-format msgid "replication slot \"%s\" already exists" msgstr "el slot de replicación «%s» ya existe" -#: replication/slot.c:270 +#: replication/slot.c:268 #, c-format msgid "all replication slots are in use" msgstr "todos los slots de replicación están en uso" -#: replication/slot.c:271 +#: replication/slot.c:269 #, c-format msgid "Free one or increase max_replication_slots." msgstr "Libere uno o incremente max_replication_slots." -#: replication/slot.c:424 replication/slotfuncs.c:761 -#: utils/adt/pgstatfuncs.c:2227 +#: replication/slot.c:402 replication/slotfuncs.c:761 +#: utils/adt/pgstatfuncs.c:2228 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "no existe el slot de replicación «%s»" -#: replication/slot.c:462 replication/slot.c:1043 +#: replication/slot.c:448 replication/slot.c:1018 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "el slot de replicación «%s» está activo para el PID %d" -#: replication/slot.c:701 replication/slot.c:1417 replication/slot.c:1800 +#: replication/slot.c:676 replication/slot.c:1412 replication/slot.c:1795 #, c-format msgid "could not remove directory \"%s\"" msgstr "no se pudo eliminar el directorio «%s»" -#: replication/slot.c:1078 +#: replication/slot.c:1053 #, c-format msgid "replication slots can only be used if max_replication_slots > 0" msgstr "los slots de replicación sólo pueden usarse si max_replication_slots > 0" # FIXME see logical.c:81 -#: replication/slot.c:1083 +#: replication/slot.c:1058 #, c-format msgid "replication slots can only be used if wal_level >= replica" msgstr "los slots de replicación sólo pueden usarse si wal_level >= replica" -#: replication/slot.c:1262 -#, fuzzy, c-format -#| msgid "terminating walsender process due to replication timeout" +#: replication/slot.c:1243 +#, c-format msgid "terminating process %d to release replication slot \"%s\"" -msgstr "terminando el proceso walsender debido a que se agotó el tiempo de espera de replicación" +msgstr "terminando el proceso %d para liberar el slot de replicación «%s»" -#: replication/slot.c:1300 +#: replication/slot.c:1281 #, c-format msgid "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds max_slot_wal_keep_size" msgstr "invalidando el slot «%s» porque su restart_lsn %X/%X excede max_slot_wal_keep_size" -#: replication/slot.c:1738 +#: replication/slot.c:1733 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "el archivo de slot de replicación «%s» tiene número mágico erróneo: %u en lugar de %u" -#: replication/slot.c:1745 +#: replication/slot.c:1740 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "el archivo de slot de replicación «%s» tiene versión no soportada %u" -#: replication/slot.c:1752 +#: replication/slot.c:1747 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "el archivo de slot de replicación «%s» tiene largo corrupto %u" -#: replication/slot.c:1788 +#: replication/slot.c:1783 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "suma de verificación no coincidenete en archivo de slot de replicación «%s»: es %u, debería ser %u" # FIXME see slot.c:779. See also postmaster.c:835 -#: replication/slot.c:1822 +#: replication/slot.c:1817 #, c-format msgid "logical replication slot \"%s\" exists, but wal_level < logical" msgstr "existe el slot de replicación lógica «%s», pero wal_level < logical" -#: replication/slot.c:1824 +#: replication/slot.c:1819 #, c-format msgid "Change wal_level to be logical or higher." msgstr "Cambie wal_level a logical o superior." # FIXME see slot.c:779. See also postmaster.c:835 -#: replication/slot.c:1828 +#: replication/slot.c:1823 #, c-format msgid "physical replication slot \"%s\" exists, but wal_level < replica" msgstr "existe el slot de replicación lógica «%s», pero wal_level < logical" # <> hello vim -#: replication/slot.c:1830 +#: replication/slot.c:1825 #, c-format msgid "Change wal_level to be replica or higher." msgstr "Cambie wal_level a replica o superior." -#: replication/slot.c:1864 +#: replication/slot.c:1859 #, c-format msgid "too many replication slots active before shutdown" msgstr "demasiados slots de replicacion activos antes del apagado" @@ -20074,10 +19802,9 @@ msgid "invalid target WAL LSN" msgstr "el LSN de wal de destino no es válido" #: replication/slotfuncs.c:648 -#, fuzzy, c-format -#| msgid "replication slot \"%s\" does not exist" +#, c-format msgid "replication slot \"%s\" cannot be advanced" -msgstr "no existe el slot de replicación «%s»" +msgstr "no se puede avanzar el slot de replicación «%s»" #: replication/slotfuncs.c:666 #, c-format @@ -20110,10 +19837,9 @@ msgid "The source replication slot was modified incompatibly during the copy ope msgstr "El slot de replicación de origen fue modificado incompatiblemente durante la operación de copia." #: replication/slotfuncs.c:867 -#, fuzzy, c-format -#| msgid "could not copy replication slot \"%s\"" +#, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" -msgstr "no se pudo copiar el slot de replicación «%s»" +msgstr "no se puede copiar el slot de replicación lógica no terminado «%s»" #: replication/slotfuncs.c:869 #, c-format @@ -20155,82 +19881,82 @@ msgstr "falló la interpretación de synchronous_standby_names" msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "el argumento de standby sincrónicos (%d) debe ser mayor que cero" -#: replication/walreceiver.c:160 +#: replication/walreceiver.c:161 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "terminando el proceso walreceiver debido a una orden del administrador" -#: replication/walreceiver.c:285 +#: replication/walreceiver.c:289 #, c-format msgid "could not connect to the primary server: %s" msgstr "no se pudo conectar al servidor primario: %s" -#: replication/walreceiver.c:331 +#: replication/walreceiver.c:336 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "el identificador de sistema difiere entre el primario y el standby" -#: replication/walreceiver.c:332 +#: replication/walreceiver.c:337 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "El identificador del primario es %s, el identificador del standby es %s." -#: replication/walreceiver.c:342 +#: replication/walreceiver.c:348 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "el timeline más alto del primario, %u, está más atrás que el timeline de recuperación %u" -#: replication/walreceiver.c:396 +#: replication/walreceiver.c:402 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "iniciando el flujo de WAL desde el primario en %X/%X en el timeline %u" -#: replication/walreceiver.c:400 +#: replication/walreceiver.c:406 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "reiniciando el flujo de WAL en %X/%X en el timeline %u" -#: replication/walreceiver.c:428 +#: replication/walreceiver.c:435 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "no se puede continuar el flujo de WAL; la recuperación ya ha terminado" -#: replication/walreceiver.c:465 +#: replication/walreceiver.c:472 #, c-format msgid "replication terminated by primary server" msgstr "replicación terminada por el servidor primario" -#: replication/walreceiver.c:466 +#: replication/walreceiver.c:473 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "Se alcanzó el fin de WAL en el timeline %u en la posición %X/%X." -#: replication/walreceiver.c:554 +#: replication/walreceiver.c:562 #, c-format msgid "terminating walreceiver due to timeout" msgstr "terminando el proceso walreceiver debido a que se agotó el tiempo de espera" -#: replication/walreceiver.c:592 +#: replication/walreceiver.c:600 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "el servidor primario no contiene más WAL en el timeline %u solicitado" -#: replication/walreceiver.c:608 replication/walreceiver.c:903 +#: replication/walreceiver.c:616 replication/walreceiver.c:1036 #, c-format msgid "could not close log segment %s: %m" msgstr "no se pudo cerrar archivo de segmento %s: %m" -#: replication/walreceiver.c:727 +#: replication/walreceiver.c:735 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "trayendo el archivo de historia del timeline para el timeline %u desde el servidor primario" -#: replication/walreceiver.c:950 +#: replication/walreceiver.c:927 #, c-format msgid "could not write to log segment %s at offset %u, length %lu: %m" msgstr "no se pudo escribir al segmento de log %s en la posición %u, largo %lu: %m" -#: replication/walsender.c:524 storage/smgr/md.c:1320 +#: replication/walsender.c:524 storage/smgr/md.c:1321 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "no se pudo posicionar (seek) al fin del archivo «%s»: %m" @@ -20296,10 +20022,9 @@ msgid "%s must not be called in a subtransaction" msgstr "%s no está permitido en una subtransacción" #: replication/walsender.c:1145 -#, fuzzy, c-format -#| msgid "created temporary replication slot \"%s\"" +#, c-format msgid "cannot read from logical replication slot \"%s\"" -msgstr "se creó slot temporal de replicación «%s»" +msgstr "no se puede leer del slot de replicación lógica «%s»" #: replication/walsender.c:1147 #, c-format @@ -20454,10 +20179,9 @@ msgid "could not convert table \"%s\" to a view because it has child tables" msgstr "no se pudo convertir la tabla «%s» en vista porque tiene tablas hijas" #: rewrite/rewriteDefine.c:481 -#, fuzzy, c-format -#| msgid "could not convert table \"%s\" to a view because it has child tables" +#, c-format msgid "could not convert table \"%s\" to a view because it has parent tables" -msgstr "no se pudo convertir la tabla «%s» en vista porque tiene tablas hijas" +msgstr "no se pudo convertir la tabla «%s» en vista porque tiene tablas padres" #: rewrite/rewriteDefine.c:487 #, c-format @@ -20565,192 +20289,200 @@ msgstr "no existe la regla «%s» para la relación «%s»" msgid "renaming an ON SELECT rule is not allowed" msgstr "no se permite cambiar el nombre de una regla ON SELECT" -#: rewrite/rewriteHandler.c:551 +#: rewrite/rewriteHandler.c:554 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "el nombre de consulta WITH «%s» aparece tanto en una acción de regla y en la consulta que está siendo reescrita" -#: rewrite/rewriteHandler.c:611 +#: rewrite/rewriteHandler.c:581 +#, c-format +msgid "INSERT...SELECT rule actions are not supported for queries having data-modifying statements in WITH" +msgstr "las acciones de reglas INSERT...SELECT no están soportadas para consultas que tengan sentencias que modifiquen datos en WITH" + +#: rewrite/rewriteHandler.c:634 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "no se puede usar RETURNING en múltiples reglas" -#: rewrite/rewriteHandler.c:843 rewrite/rewriteHandler.c:882 -#, fuzzy, c-format -#| msgid "cannot insert into column \"%s\"" +#: rewrite/rewriteHandler.c:866 rewrite/rewriteHandler.c:905 +#, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" -msgstr "no se puede insertar en la columna «%s»" +msgstr "no se puede insertar un valor no-predeterminado en la columna «%s»" -#: rewrite/rewriteHandler.c:845 rewrite/rewriteHandler.c:911 +#: rewrite/rewriteHandler.c:868 rewrite/rewriteHandler.c:934 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "La columna \"%s\" es una columna de identidad definida como GENERATED ALWAYS." -#: rewrite/rewriteHandler.c:847 +#: rewrite/rewriteHandler.c:870 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Use OVERRIDING SYSTEM VALUE para controlar manualmente." -#: rewrite/rewriteHandler.c:909 rewrite/rewriteHandler.c:917 +#: rewrite/rewriteHandler.c:932 rewrite/rewriteHandler.c:940 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "la columna «%s» sólo puede actualizarse a DEFAULT" -#: rewrite/rewriteHandler.c:1064 rewrite/rewriteHandler.c:1082 +#: rewrite/rewriteHandler.c:1087 rewrite/rewriteHandler.c:1105 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "hay múltiples asignaciones a la misma columna «%s»" -#: rewrite/rewriteHandler.c:2084 rewrite/rewriteHandler.c:3898 +#: rewrite/rewriteHandler.c:2107 rewrite/rewriteHandler.c:3935 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "se detectó recursión infinita en las reglas de la relación «%s»" -#: rewrite/rewriteHandler.c:2169 +#: rewrite/rewriteHandler.c:2192 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "se detectó recursión infinita en la política para la relación «%s»" -#: rewrite/rewriteHandler.c:2489 +#: rewrite/rewriteHandler.c:2512 msgid "Junk view columns are not updatable." msgstr "Las columnas «basura» de vistas no son actualizables." -#: rewrite/rewriteHandler.c:2494 +#: rewrite/rewriteHandler.c:2517 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Las columnas de vistas que no son columnas de su relación base no son actualizables." -#: rewrite/rewriteHandler.c:2497 +#: rewrite/rewriteHandler.c:2520 msgid "View columns that refer to system columns are not updatable." msgstr "Las columnas de vistas que se refieren a columnas de sistema no son actualizables." -#: rewrite/rewriteHandler.c:2500 +#: rewrite/rewriteHandler.c:2523 msgid "View columns that return whole-row references are not updatable." msgstr "Las columnas de vistas que retornan referencias a la fila completa no son actualizables." # XXX a %s here would be nice ... -#: rewrite/rewriteHandler.c:2561 +#: rewrite/rewriteHandler.c:2584 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Las vistas que contienen DISTINCT no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2564 +#: rewrite/rewriteHandler.c:2587 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Las vistas que contienen GROUP BY no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2567 +#: rewrite/rewriteHandler.c:2590 msgid "Views containing HAVING are not automatically updatable." msgstr "Las vistas que contienen HAVING no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2570 +#: rewrite/rewriteHandler.c:2593 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Las vistas que contienen UNION, INTERSECT o EXCEPT no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2573 +#: rewrite/rewriteHandler.c:2596 msgid "Views containing WITH are not automatically updatable." msgstr "Las vistas que contienen WITH no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2576 +#: rewrite/rewriteHandler.c:2599 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Las vistas que contienen LIMIT u OFFSET no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2588 +#: rewrite/rewriteHandler.c:2611 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Las vistas que retornan funciones de agregación no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2591 +#: rewrite/rewriteHandler.c:2614 msgid "Views that return window functions are not automatically updatable." msgstr "Las vistas que retornan funciones ventana no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2594 +#: rewrite/rewriteHandler.c:2617 msgid "Views that return set-returning functions are not automatically updatable." msgstr "Las vistas que retornan funciones-que-retornan-conjuntos no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2601 rewrite/rewriteHandler.c:2605 -#: rewrite/rewriteHandler.c:2613 +#: rewrite/rewriteHandler.c:2624 rewrite/rewriteHandler.c:2628 +#: rewrite/rewriteHandler.c:2636 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "Las vistas que no extraen desde una única tabla o vista no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2616 +#: rewrite/rewriteHandler.c:2639 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Las vistas que contienen TABLESAMPLE no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2640 +#: rewrite/rewriteHandler.c:2663 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Las vistas que no tienen columnas actualizables no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:3117 +#: rewrite/rewriteHandler.c:3140 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "no se puede insertar en la columna «%s» de la vista «%s»" -#: rewrite/rewriteHandler.c:3125 +#: rewrite/rewriteHandler.c:3148 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "no se puede actualizar la columna «%s» vista «%s»" -#: rewrite/rewriteHandler.c:3603 +#: rewrite/rewriteHandler.c:3629 +#, c-format +msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" +msgstr "las reglas DO INSTEAD NOTIFY no están soportadas para sentencias que modifiquen datos en WITH" + +#: rewrite/rewriteHandler.c:3640 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "las reglas DO INSTEAD NOTHING no están soportadas para sentencias que modifiquen datos en WITH" -#: rewrite/rewriteHandler.c:3617 +#: rewrite/rewriteHandler.c:3654 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "las reglas DO INSTEAD condicionales no están soportadas para sentencias que modifiquen datos en WITH" -#: rewrite/rewriteHandler.c:3621 +#: rewrite/rewriteHandler.c:3658 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "las reglas DO ALSO no están soportadas para sentencias que modifiquen datos en WITH" -#: rewrite/rewriteHandler.c:3626 +#: rewrite/rewriteHandler.c:3663 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "las reglas DO INSTEAD de múltiples sentencias no están soportadas para sentencias que modifiquen datos en WITH" # XXX a %s here would be nice ... -#: rewrite/rewriteHandler.c:3826 rewrite/rewriteHandler.c:3834 -#: rewrite/rewriteHandler.c:3842 -#, fuzzy, c-format -#| msgid "Views containing DISTINCT are not automatically updatable." +#: rewrite/rewriteHandler.c:3863 rewrite/rewriteHandler.c:3871 +#: rewrite/rewriteHandler.c:3879 +#, c-format msgid "Views with conditional DO INSTEAD rules are not automatically updatable." -msgstr "Las vistas que contienen DISTINCT no son automáticamente actualizables." +msgstr "Las vistas con reglas DO INSTEAD condicionales no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:3935 +#: rewrite/rewriteHandler.c:3972 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "no se puede hacer INSERT RETURNING a la relación «%s»" -#: rewrite/rewriteHandler.c:3937 +#: rewrite/rewriteHandler.c:3974 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "Necesita un regla incondicional ON INSERT DO INSTEAD con una cláusula RETURNING." -#: rewrite/rewriteHandler.c:3942 +#: rewrite/rewriteHandler.c:3979 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "no se puede hacer UPDATE RETURNING a la relación «%s»" -#: rewrite/rewriteHandler.c:3944 +#: rewrite/rewriteHandler.c:3981 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "Necesita un regla incondicional ON UPDATE DO INSTEAD con una cláusula RETURNING." -#: rewrite/rewriteHandler.c:3949 +#: rewrite/rewriteHandler.c:3986 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "no se puede hacer DELETE RETURNING a la relación «%s»" -#: rewrite/rewriteHandler.c:3951 +#: rewrite/rewriteHandler.c:3988 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "Necesita un regla incondicional ON DELETE DO INSTEAD con una clásula RETURNING." -#: rewrite/rewriteHandler.c:3969 +#: rewrite/rewriteHandler.c:4006 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "INSERT con una cláusula ON CONFLICT no puede usarse con una tabla que tiene reglas INSERT o UPDATE" -#: rewrite/rewriteHandler.c:4026 +#: rewrite/rewriteHandler.c:4063 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH no puede ser usado en una consulta que está siendo convertida en múltiples consultas a través de reglas" @@ -20895,18 +20627,12 @@ msgstr "parámetro Snowball no reconocido: «%s»" msgid "missing Language parameter" msgstr "falta un parámetro Language" -#: statistics/extended_stats.c:175 +#: statistics/extended_stats.c:178 #, c-format msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "el objeto de estadísticas «%s.%s» no pudo ser calculado para la relación «%s.%s»" -#: statistics/extended_stats.c:2277 -#, fuzzy, c-format -#| msgid "\"%s\" is not a composite type" -msgid "relation \"pg_statistic\" does not have a composite type" -msgstr "«%s» no es un tipo compuesto" - -#: statistics/mcv.c:1371 utils/adt/jsonfuncs.c:1941 +#: statistics/mcv.c:1371 utils/adt/jsonfuncs.c:1943 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "se llamó una función que retorna un registro en un contexto que no puede aceptarlo" @@ -20916,37 +20642,42 @@ msgstr "se llamó una función que retorna un registro en un contexto que no pue msgid "cannot access temporary tables of other sessions" msgstr "no se pueden acceder tablas temporales de otras sesiones" -#: storage/buffer/bufmgr.c:917 +#: storage/buffer/bufmgr.c:839 +#, c-format +msgid "cannot extend relation %s beyond %u blocks" +msgstr "no se puede extender la relación %s más allá de %u bloques" + +#: storage/buffer/bufmgr.c:926 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "datos inesperados más allá del EOF en el bloque %u de relación %s" -#: storage/buffer/bufmgr.c:919 +#: storage/buffer/bufmgr.c:928 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "Esto parece ocurrir sólo con kernels defectuosos; considere actualizar su sistema." -#: storage/buffer/bufmgr.c:1018 +#: storage/buffer/bufmgr.c:1027 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "la página no es válida en el bloque %u de la relación «%s»; reinicializando la página" -#: storage/buffer/bufmgr.c:4524 +#: storage/buffer/bufmgr.c:4533 #, c-format msgid "could not write block %u of %s" msgstr "no se pudo escribir el bloque %u de %s" -#: storage/buffer/bufmgr.c:4526 +#: storage/buffer/bufmgr.c:4535 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Múltiples fallas --- el error de escritura puede ser permanente." -#: storage/buffer/bufmgr.c:4547 storage/buffer/bufmgr.c:4566 +#: storage/buffer/bufmgr.c:4556 storage/buffer/bufmgr.c:4575 #, c-format msgid "writing block %u of relation %s" msgstr "escribiendo el bloque %u de la relación %s" -#: storage/buffer/bufmgr.c:4870 +#: storage/buffer/bufmgr.c:4879 #, c-format msgid "snapshot too old" msgstr "snapshot demasiado antiguo" @@ -20972,12 +20703,11 @@ msgid "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m msgstr "no se pudo determinar el tamaño del archivo temporal «%s» del BufFile «%s»: %m" #: storage/file/buffile.c:884 -#, fuzzy, c-format -#| msgid "could not delete file \"%s\": %m" +#, c-format msgid "could not delete shared fileset \"%s\": %m" -msgstr "no se pudo borrar el archivo «%s»: %m" +msgstr "no se pudo borrar el conjunto de archivos compartidos «%s»: %m" -#: storage/file/buffile.c:902 storage/smgr/md.c:306 storage/smgr/md.c:865 +#: storage/file/buffile.c:902 storage/smgr/md.c:306 storage/smgr/md.c:866 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "no se pudo truncar el archivo «%s»: %m" @@ -21002,98 +20732,91 @@ msgstr "no se pudo ejecutar munmap() mientras se sincronizaban (flush) datos: %m msgid "could not link file \"%s\" to \"%s\": %m" msgstr "no se pudo enlazar (link) el archivo «%s» a «%s»: %m" -#: storage/file/fd.c:929 +#: storage/file/fd.c:931 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit falló: %m" -#: storage/file/fd.c:1019 +#: storage/file/fd.c:1021 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "los descriptores de archivo disponibles son insuficientes para iniciar un proceso servidor" -#: storage/file/fd.c:1020 +#: storage/file/fd.c:1022 #, c-format msgid "System allows %d, we need at least %d." msgstr "El sistema permite %d, se requieren al menos %d." -#: storage/file/fd.c:1071 storage/file/fd.c:2408 storage/file/fd.c:2518 -#: storage/file/fd.c:2669 +#: storage/file/fd.c:1073 storage/file/fd.c:2410 storage/file/fd.c:2520 +#: storage/file/fd.c:2671 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "se agotaron los descriptores de archivo: %m; libere e intente nuevamente" -#: storage/file/fd.c:1445 +#: storage/file/fd.c:1447 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "archivo temporal: ruta «%s», tamaño %lu" -#: storage/file/fd.c:1576 +#: storage/file/fd.c:1578 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "no se pudo crear el directorio temporal «%s»: %m" -#: storage/file/fd.c:1583 +#: storage/file/fd.c:1585 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "no se pudo crear el subdirectorio temporal «%s»: %m" -#: storage/file/fd.c:1776 +#: storage/file/fd.c:1778 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "no se pudo crear el archivo temporal «%s»: %m" -#: storage/file/fd.c:1810 +#: storage/file/fd.c:1812 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "no se pudo abrir el archivo temporal «%s»: %m" -#: storage/file/fd.c:1851 +#: storage/file/fd.c:1853 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "no se pudo eliminar (unlink) el archivo temporal «%s»: %m" -#: storage/file/fd.c:1939 +#: storage/file/fd.c:1941 #, c-format msgid "could not delete file \"%s\": %m" msgstr "no se pudo borrar el archivo «%s»: %m" -#: storage/file/fd.c:2119 +#: storage/file/fd.c:2121 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "el tamaño del archivo temporal excede temp_file_limit permitido (%dkB)" -#: storage/file/fd.c:2384 storage/file/fd.c:2443 +#: storage/file/fd.c:2386 storage/file/fd.c:2445 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "se excedió maxAllocatedDescs (%d) mientras se trataba de abrir el archivo «%s»" -#: storage/file/fd.c:2488 +#: storage/file/fd.c:2490 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "se excedió maxAllocatedDescs (%d) mientras se trataba de ejecutar la orden «%s»" -#: storage/file/fd.c:2645 +#: storage/file/fd.c:2647 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "se excedió maxAllocatedDescs (%d) mientras se trataba de abrir el directorio «%s»" -#: storage/file/fd.c:3175 +#: storage/file/fd.c:3177 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "archivo inesperado en directorio de archivos temporales: «%s»" -#: storage/file/fd.c:3298 -#, fuzzy, c-format -#| msgid "could not open file \"%s\": %m" -msgid "could not open %s: %m" -msgstr "no se pudo abrir el archivo «%s»: %m" - -#: storage/file/fd.c:3304 -#, fuzzy, c-format -#| msgid "could not fsync file \"%s\": %m" -msgid "could not sync filesystem for \"%s\": %m" -msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" +#: storage/file/fd.c:3306 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "no se pudo sincronizar el sistema de archivos para el archivo «%s»: %m" #: storage/file/sharedfileset.c:144 #, c-format @@ -21170,37 +20893,34 @@ msgstr "no se pudo cerrar el segmento de memoria compartida «%s»: %m" msgid "could not duplicate handle for \"%s\": %m" msgstr "no se pudo duplicar el «handle» para «%s»: %m" -#: storage/ipc/procarray.c:3724 -#, fuzzy, c-format -#| msgid "database \"%s\" is being used by logical replication subscription" +#: storage/ipc/procarray.c:3802 +#, c-format msgid "database \"%s\" is being used by prepared transactions" -msgstr "la base de datos «%s» está siendo utilizada por suscripciones de replicación lógica" +msgstr "la base de datos «%s» está siendo utilizada por transacciones preparadas" -#: storage/ipc/procarray.c:3756 storage/ipc/signalfuncs.c:219 +#: storage/ipc/procarray.c:3834 storage/ipc/signalfuncs.c:221 #, c-format msgid "must be a superuser to terminate superuser process" msgstr "debe ser superusuario para terminar proceso de superusuario" -#: storage/ipc/procarray.c:3763 storage/ipc/signalfuncs.c:224 +#: storage/ipc/procarray.c:3841 storage/ipc/signalfuncs.c:226 #, c-format msgid "must be a member of the role whose process is being terminated or member of pg_signal_backend" msgstr "debe ser miembro del rol cuyo proceso se está terminando o ser miembro de pg_signal_backend" #: storage/ipc/shm_mq.c:368 -#, fuzzy, c-format -#| msgid "could not send tuple to shared-memory queue" +#, c-format msgid "cannot send a message of size %zu via shared memory queue" -msgstr "no se pudo enviar la tupla a la cola en memoria compartida" +msgstr "no se puede enviar un mensaje de tamaño %zu mediante la cola de memoria compartida" #: storage/ipc/shm_mq.c:694 -#, fuzzy, c-format -#| msgid "invalid magic number in dynamic shared memory segment" +#, c-format msgid "invalid message size %zu in shared memory queue" -msgstr "número mágico no válido en segmento de memoria compartida dinámica" +msgstr "tamaño no válido de mensaje %zu en cola de memoria compartida" #: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:981 -#: storage/lmgr/lock.c:1019 storage/lmgr/lock.c:2844 storage/lmgr/lock.c:4173 -#: storage/lmgr/lock.c:4238 storage/lmgr/lock.c:4545 +#: storage/lmgr/lock.c:1019 storage/lmgr/lock.c:2844 storage/lmgr/lock.c:4258 +#: storage/lmgr/lock.c:4323 storage/lmgr/lock.c:4673 #: storage/lmgr/predicate.c:2470 storage/lmgr/predicate.c:2485 #: storage/lmgr/predicate.c:3967 storage/lmgr/predicate.c:5078 #: utils/hash/dynahash.c:1112 @@ -21233,8 +20953,7 @@ msgstr "el espacio de memoria compartida es insuficiente para la estructura «%s msgid "requested shared memory size overflows size_t" msgstr "la petición de tamaño de memoria compartida desborda size_t" -#: storage/ipc/signalfuncs.c:68 storage/ipc/signalfuncs.c:261 -#: utils/adt/mcxtfuncs.c:204 +#: storage/ipc/signalfuncs.c:68 utils/adt/mcxtfuncs.c:204 #, c-format msgid "PID %d is not a PostgreSQL server process" msgstr "PID %d no es un proceso servidor de PostgreSQL" @@ -21258,53 +20977,45 @@ msgstr "debe ser miembro del rol cuya consulta se está cancelando o ser miembro #: storage/ipc/signalfuncs.c:165 #, c-format msgid "could not check the existence of the backend with PID %d: %m" -msgstr "" +msgstr "no se pudo comprobar la existencia del proceso de servidor con PID %d: %m" #: storage/ipc/signalfuncs.c:183 -#, fuzzy, c-format -#| msgid "server did not promote within %d seconds" -msgid "backend with PID %d did not terminate within %lld milliseconds" -msgstr "el servidor no promovió en %d segundos" - -#: storage/ipc/signalfuncs.c:212 -#, fuzzy, c-format -#| msgid "LIMIT must not be negative" -msgid "\"timeout\" must not be negative" -msgstr "LIMIT no debe ser negativo" +#, c-format +msgid "backend with PID %d did not terminate within %lld millisecond" +msgid_plural "backend with PID %d did not terminate within %lld milliseconds" +msgstr[0] "el proceso de servidor con PID %d no terminó dentro de %lld milisegundo" +msgstr[1] "el proceso de servidor con PID %d no terminó dentro de %lld milisegundos" -#: storage/ipc/signalfuncs.c:254 -#, fuzzy, c-format -#| msgid "\"wait_seconds\" must not be negative or zero" -msgid "\"timeout\" must not be negative or zero" -msgstr "«wait_seconds» no puede ser negativo o cero" +#: storage/ipc/signalfuncs.c:214 +#, c-format +msgid "\"timeout\" must not be negative" +msgstr "\"timeout\" no debe ser negativo" -#: storage/ipc/signalfuncs.c:300 +#: storage/ipc/signalfuncs.c:266 #, c-format msgid "must be superuser to rotate log files with adminpack 1.0" msgstr "bebe ser superusuario para rotar archivos de log con adminpack 1.0" #. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:302 utils/adt/genfile.c:255 +#: storage/ipc/signalfuncs.c:268 utils/adt/genfile.c:255 #, c-format msgid "Consider using %s, which is part of core, instead." msgstr "Considere usar %s, que es parte del servidor, en su lugar." -#: storage/ipc/signalfuncs.c:308 storage/ipc/signalfuncs.c:328 +#: storage/ipc/signalfuncs.c:274 storage/ipc/signalfuncs.c:294 #, c-format msgid "rotation not possible because log collection not active" msgstr "la rotación no es posible porque la recoleccion de log no está activa" #: storage/ipc/standby.c:305 -#, fuzzy, c-format -#| msgid "process %d still waiting for %s on %s after %ld.%03d ms" +#, c-format msgid "recovery still waiting after %ld.%03d ms: %s" -msgstr "el proceso %d aún espera %s en %s después de %ld.%03d ms" +msgstr "la recuperación aún está esperando después de %ld.%03d ms: %s" #: storage/ipc/standby.c:314 -#, fuzzy, c-format -#| msgid "process %d still waiting for %s on %s after %ld.%03d ms" +#, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" -msgstr "el proceso %d aún espera %s en %s después de %ld.%03d ms" +msgstr "la recuperación terminó de esperar después de %ld.%03d ms: %s" #: storage/ipc/standby.c:878 tcop/postgres.c:3317 #, c-format @@ -21316,58 +21027,50 @@ msgstr "cancelando la sentencia debido a un conflicto con la recuperación" msgid "User transaction caused buffer deadlock with recovery." msgstr "La transacción del usuario causó un «deadlock» con la recuperación." -#: storage/ipc/standby.c:1421 -#, fuzzy -#| msgid "unknown" +#: storage/ipc/standby.c:1423 msgid "unknown reason" -msgstr "desconocido" +msgstr "razón desconocida" -#: storage/ipc/standby.c:1426 +#: storage/ipc/standby.c:1428 msgid "recovery conflict on buffer pin" -msgstr "" +msgstr "conflicto de recuperación en «pin» de búfer" -#: storage/ipc/standby.c:1429 -#, fuzzy -#| msgid "abort reason: recovery conflict" +#: storage/ipc/standby.c:1431 msgid "recovery conflict on lock" -msgstr "razón para abortar: conflicto en la recuperación" +msgstr "conflicto de recuperación en bloqueo" -#: storage/ipc/standby.c:1432 -#, fuzzy -#| msgid "remove a tablespace" +#: storage/ipc/standby.c:1434 msgid "recovery conflict on tablespace" -msgstr "elimina un tablespace" +msgstr "conflicto de recuperación en tablespace" -#: storage/ipc/standby.c:1435 +#: storage/ipc/standby.c:1437 msgid "recovery conflict on snapshot" -msgstr "" +msgstr "conflicto de recuperación en snapshot" -#: storage/ipc/standby.c:1438 +#: storage/ipc/standby.c:1440 msgid "recovery conflict on buffer deadlock" -msgstr "" +msgstr "conflicto de recuperación en deadlock de búfer" -#: storage/ipc/standby.c:1441 -#, fuzzy -#| msgid "already connected to a database" +#: storage/ipc/standby.c:1443 msgid "recovery conflict on database" -msgstr "ya está conectado a una base de datos" +msgstr "conflicto de recuperación en base de datos" #: storage/large_object/inv_api.c:191 #, c-format msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" msgstr "la entrada pg_largeobject para el OID %u, página %d tiene tamaño de campo %d no válido" -#: storage/large_object/inv_api.c:272 +#: storage/large_object/inv_api.c:274 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "opciones no válidas para abrir un objeto grande: %d" -#: storage/large_object/inv_api.c:462 +#: storage/large_object/inv_api.c:457 #, c-format msgid "invalid whence setting: %d" msgstr "parámetro «whence» no válido: %d" -#: storage/large_object/inv_api.c:634 +#: storage/large_object/inv_api.c:629 #, c-format msgid "invalid large object write request size: %d" msgstr "tamaño de petición de escritura de objeto grande no válido: %d" @@ -21432,64 +21135,63 @@ msgstr "mientras se verificaba la tupla actualizada (%u,%u) en la relación «%s msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "mientras se verificaba una restricción de exclusión en la tupla (%u,%u) en la relación «%s»" -#: storage/lmgr/lmgr.c:1106 +#: storage/lmgr/lmgr.c:1107 #, c-format msgid "relation %u of database %u" msgstr "relación %u de la base de datos %u" -#: storage/lmgr/lmgr.c:1112 +#: storage/lmgr/lmgr.c:1113 #, c-format msgid "extension of relation %u of database %u" msgstr "extensión de la relación %u de la base de datos %u" -#: storage/lmgr/lmgr.c:1118 -#, fuzzy, c-format -#| msgid "relation %u of database %u" +#: storage/lmgr/lmgr.c:1119 +#, c-format msgid "pg_database.datfrozenxid of database %u" -msgstr "relación %u de la base de datos %u" +msgstr "pg_database.datfrozenxid de la base de datos %u" -#: storage/lmgr/lmgr.c:1123 +#: storage/lmgr/lmgr.c:1124 #, c-format msgid "page %u of relation %u of database %u" msgstr "página %u de la relación %u de la base de datos %u" -#: storage/lmgr/lmgr.c:1130 +#: storage/lmgr/lmgr.c:1131 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "tupla (%u,%u) de la relación %u de la base de datos %u" -#: storage/lmgr/lmgr.c:1138 +#: storage/lmgr/lmgr.c:1139 #, c-format msgid "transaction %u" msgstr "transacción %u" -#: storage/lmgr/lmgr.c:1143 +#: storage/lmgr/lmgr.c:1144 #, c-format msgid "virtual transaction %d/%u" msgstr "transacción virtual %d/%u" -#: storage/lmgr/lmgr.c:1149 +#: storage/lmgr/lmgr.c:1150 #, c-format msgid "speculative token %u of transaction %u" msgstr "token especulativo %u de la transacción %u" -#: storage/lmgr/lmgr.c:1155 +#: storage/lmgr/lmgr.c:1156 #, c-format msgid "object %u of class %u of database %u" msgstr "objeto %u de clase %u de la base de datos %u" -#: storage/lmgr/lmgr.c:1163 +#: storage/lmgr/lmgr.c:1164 #, c-format msgid "user lock [%u,%u,%u]" msgstr "candado de usuario [%u,%u,%u]" # XXX is this a good translation? -#: storage/lmgr/lmgr.c:1170 +#: storage/lmgr/lmgr.c:1171 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "candado consultivo [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1178 +#: storage/lmgr/lmgr.c:1179 #, c-format msgid "unrecognized locktag type %d" msgstr "tipo de locktag %d no reconocido" @@ -21505,12 +21207,12 @@ msgid "Only RowExclusiveLock or less can be acquired on database objects during msgstr "Sólo candados RowExclusiveLock o menor pueden ser adquiridos en objetos de la base de datos durante la recuperación." #: storage/lmgr/lock.c:982 storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 -#: storage/lmgr/lock.c:4174 storage/lmgr/lock.c:4239 storage/lmgr/lock.c:4546 +#: storage/lmgr/lock.c:4259 storage/lmgr/lock.c:4324 storage/lmgr/lock.c:4674 #, c-format msgid "You might need to increase max_locks_per_transaction." msgstr "Puede ser necesario incrementar max_locks_per_transaction." -#: storage/lmgr/lock.c:3283 storage/lmgr/lock.c:3399 +#: storage/lmgr/lock.c:3300 storage/lmgr/lock.c:3368 storage/lmgr/lock.c:3484 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" msgstr "no se puede hacer PREPARE mientras se mantienen candados a nivel de sesión y transacción simultáneamente sobre el mismo objeto" @@ -21638,70 +21340,70 @@ msgstr "los largos de ítem están corruptos: total %u, espacio disponible %u" msgid "corrupted line pointer: offset = %u, size = %u" msgstr "puntero de ítem corrupto: desplazamiento = %u, tamaño = %u" -#: storage/smgr/md.c:434 +#: storage/smgr/md.c:435 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "no se pudo extender el archivo «%s» más allá de %u bloques" -#: storage/smgr/md.c:449 +#: storage/smgr/md.c:450 #, c-format msgid "could not extend file \"%s\": %m" msgstr "no se pudo extender el archivo «%s»: %m" -#: storage/smgr/md.c:451 storage/smgr/md.c:458 storage/smgr/md.c:746 +#: storage/smgr/md.c:452 storage/smgr/md.c:459 storage/smgr/md.c:747 #, c-format msgid "Check free disk space." msgstr "Verifique el espacio libre en disco." -#: storage/smgr/md.c:455 +#: storage/smgr/md.c:456 #, c-format msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgstr "no se pudo extender el archivo «%s»: sólo se escribieron %d de %d bytes en el bloque %u" -#: storage/smgr/md.c:667 +#: storage/smgr/md.c:668 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "no se pudo leer el bloque %u del archivo «%s»: %m" -#: storage/smgr/md.c:683 +#: storage/smgr/md.c:684 #, c-format msgid "could not read block %u in file \"%s\": read only %d of %d bytes" msgstr "no se pudo leer el bloque %u del archivo «%s»: se leyeron sólo %d de %d bytes" -#: storage/smgr/md.c:737 +#: storage/smgr/md.c:738 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "no se pudo escribir el bloque %u en el archivo «%s»: %m" -#: storage/smgr/md.c:742 +#: storage/smgr/md.c:743 #, c-format msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" msgstr "no se pudo escribir el bloque %u en el archivo «%s»: se escribieron sólo %d de %d bytes" -#: storage/smgr/md.c:836 +#: storage/smgr/md.c:837 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "no se pudo truncar el archivo «%s» a %u bloques: es de sólo %u bloques ahora" -#: storage/smgr/md.c:891 +#: storage/smgr/md.c:892 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "no se pudo truncar el archivo «%s» a %u bloques: %m" -#: storage/smgr/md.c:1285 +#: storage/smgr/md.c:1286 #, c-format msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" msgstr "no se pudo abrir el archivo «%s» (bloque buscado %u): el segmento previo sólo tiene %u bloques" -#: storage/smgr/md.c:1299 +#: storage/smgr/md.c:1300 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "no se pudo abrir el archivo «%s» (bloque buscado %u): %m" #: tcop/fastpath.c:148 #, c-format -msgid "cannot call function %s via fastpath interface" -msgstr "" +msgid "cannot call function \"%s\" via fastpath interface" +msgstr "no se puede llamar a la función «%s» mediante la interfaz fastpath" #: tcop/fastpath.c:233 #, c-format @@ -21853,34 +21555,29 @@ msgid "User was connected to a database that must be dropped." msgstr "El usuario estaba conectado a una base de datos que debía ser eliminada." #: tcop/postgres.c:2513 -#, fuzzy, c-format -#| msgid "there is no parameter $%d" +#, c-format msgid "portal \"%s\" parameter $%d = %s" -msgstr "no hay parámetro $%d" +msgstr "portal «%s» parámetro $%d = %s" #: tcop/postgres.c:2516 -#, fuzzy, c-format -#| msgid "there is no parameter $%d" +#, c-format msgid "portal \"%s\" parameter $%d" -msgstr "no hay parámetro $%d" +msgstr "portal «%s» parámetro $%d" #: tcop/postgres.c:2522 -#, fuzzy, c-format -#| msgid "unrecognized Snowball parameter: \"%s\"" +#, c-format msgid "unnamed portal parameter $%d = %s" -msgstr "parámetro Snowball no reconocido: «%s»" +msgstr "portal sin nombre, parámetro %d = %s" #: tcop/postgres.c:2525 -#, fuzzy, c-format -#| msgid "no value found for parameter %d" +#, c-format msgid "unnamed portal parameter $%d" -msgstr "no se encontró un valor para parámetro %d" +msgstr "portal sin nombre, parámetro %d" #: tcop/postgres.c:2871 -#, fuzzy, c-format -#| msgid "terminating connection due to unexpected postmaster exit" +#, c-format msgid "terminating connection because of unexpected SIGQUIT signal" -msgstr "terminando la conexión debido al término inesperado de postmaster" +msgstr "terminando la conexión debido a una señal SIGQUIT inesperada" #: tcop/postgres.c:2877 #, c-format @@ -21898,10 +21595,9 @@ msgid "In a moment you should be able to reconnect to the database and repeat yo msgstr "Dentro de un momento debería poder reconectarse y repetir la consulta." #: tcop/postgres.c:2889 -#, fuzzy, c-format -#| msgid "terminating connection due to administrator command" +#, c-format msgid "terminating connection due to immediate shutdown command" -msgstr "terminando la conexión debido a una orden del administrador" +msgstr "terminando la conexión debido a una orden de apagado inmediato" #: tcop/postgres.c:2975 #, c-format @@ -21969,10 +21665,9 @@ msgid "terminating connection due to idle-in-transaction timeout" msgstr "terminando la conexión debido a que se agotó el tiempo de espera para transacciones abiertas inactivas" #: tcop/postgres.c:3356 -#, fuzzy, c-format -#| msgid "terminating connection due to idle-in-transaction timeout" +#, c-format msgid "terminating connection due to idle-session timeout" -msgstr "terminando la conexión debido a que se agotó el tiempo de espera para transacciones abiertas inactivas" +msgstr "terminando la conexión debido a que se agotó el tiempo de espera para sesiones abiertas inactivas" #: tcop/postgres.c:3475 #, c-format @@ -22039,17 +21734,17 @@ msgstr "el protocolo extendido de consultas no está soportado en conexiones de msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" msgstr "desconexión: duración de sesión: %d:%02d:%02d.%03d usuario=%s base=%s host=%s%s%s" -#: tcop/pquery.c:636 +#: tcop/pquery.c:638 #, c-format msgid "bind message has %d result formats but query has %d columns" msgstr "el mensaje de enlace (bind) tiene %d formatos de resultado pero la consulta tiene %d columnas" -#: tcop/pquery.c:939 +#: tcop/pquery.c:941 tcop/pquery.c:1703 #, c-format msgid "cursor can only scan forward" msgstr "el cursor sólo se puede desplazar hacia adelante" -#: tcop/pquery.c:940 +#: tcop/pquery.c:942 tcop/pquery.c:1704 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Declárelo con SCROLL para permitirle desplazar hacia atrás." @@ -22078,7 +21773,13 @@ msgstr "no se puede ejecutar %s durante la recuperación" msgid "cannot execute %s within security-restricted operation" msgstr "no se puede ejecutar %s durante una operación restringida por seguridad" -#: tcop/utility.c:913 +#. translator: %s is name of a SQL command, eg LISTEN +#: tcop/utility.c:820 +#, c-format +msgid "cannot execute %s within a background process" +msgstr "no se puede ejecutar %s dentro de un proceso en segundo plano" + +#: tcop/utility.c:945 #, c-format msgid "must be superuser to do CHECKPOINT" msgstr "debe ser superusuario para ejecutar CHECKPOINT" @@ -22445,10 +22146,10 @@ msgstr "no existe la función «%s»" msgid "must be member of role \"%s\"" msgstr "debe ser miembro del rol «%s»" -#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:935 -#: utils/adt/arrayfuncs.c:1543 utils/adt/arrayfuncs.c:3262 -#: utils/adt/arrayfuncs.c:3404 utils/adt/arrayfuncs.c:5945 -#: utils/adt/arrayfuncs.c:6286 utils/adt/arrayutils.c:94 +#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:936 +#: utils/adt/arrayfuncs.c:1544 utils/adt/arrayfuncs.c:3263 +#: utils/adt/arrayfuncs.c:3405 utils/adt/arrayfuncs.c:5980 +#: utils/adt/arrayfuncs.c:6321 utils/adt/arrayutils.c:94 #: utils/adt/arrayutils.c:103 utils/adt/arrayutils.c:110 #, c-format msgid "array size exceeds the maximum allowed (%d)" @@ -22475,9 +22176,9 @@ msgstr "el tipo de entrada no es un array" #: utils/adt/int.c:1004 utils/adt/int.c:1037 utils/adt/int.c:1051 #: utils/adt/int.c:1065 utils/adt/int.c:1096 utils/adt/int.c:1178 #: utils/adt/int.c:1242 utils/adt/int.c:1310 utils/adt/int.c:1316 -#: utils/adt/int8.c:1299 utils/adt/numeric.c:1776 utils/adt/numeric.c:4207 -#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1121 -#: utils/adt/varlena.c:3433 +#: utils/adt/int8.c:1299 utils/adt/numeric.c:1768 utils/adt/numeric.c:4203 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1114 +#: utils/adt/varlena.c:3426 #, c-format msgid "integer out of range" msgstr "entero fuera de rango" @@ -22524,255 +22225,254 @@ msgstr "no está soportada la búsqueda de elementos en arrays multidimensionale msgid "initial position must not be null" msgstr "la posición inicial no debe ser null" -#: utils/adt/arrayfuncs.c:270 utils/adt/arrayfuncs.c:284 -#: utils/adt/arrayfuncs.c:295 utils/adt/arrayfuncs.c:317 -#: utils/adt/arrayfuncs.c:332 utils/adt/arrayfuncs.c:346 -#: utils/adt/arrayfuncs.c:352 utils/adt/arrayfuncs.c:359 -#: utils/adt/arrayfuncs.c:492 utils/adt/arrayfuncs.c:508 -#: utils/adt/arrayfuncs.c:519 utils/adt/arrayfuncs.c:534 -#: utils/adt/arrayfuncs.c:555 utils/adt/arrayfuncs.c:585 -#: utils/adt/arrayfuncs.c:592 utils/adt/arrayfuncs.c:600 -#: utils/adt/arrayfuncs.c:634 utils/adt/arrayfuncs.c:657 -#: utils/adt/arrayfuncs.c:677 utils/adt/arrayfuncs.c:789 -#: utils/adt/arrayfuncs.c:798 utils/adt/arrayfuncs.c:828 -#: utils/adt/arrayfuncs.c:843 utils/adt/arrayfuncs.c:896 +#: utils/adt/arrayfuncs.c:271 utils/adt/arrayfuncs.c:285 +#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:318 +#: utils/adt/arrayfuncs.c:333 utils/adt/arrayfuncs.c:347 +#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 +#: utils/adt/arrayfuncs.c:493 utils/adt/arrayfuncs.c:509 +#: utils/adt/arrayfuncs.c:520 utils/adt/arrayfuncs.c:535 +#: utils/adt/arrayfuncs.c:556 utils/adt/arrayfuncs.c:586 +#: utils/adt/arrayfuncs.c:593 utils/adt/arrayfuncs.c:601 +#: utils/adt/arrayfuncs.c:635 utils/adt/arrayfuncs.c:658 +#: utils/adt/arrayfuncs.c:678 utils/adt/arrayfuncs.c:790 +#: utils/adt/arrayfuncs.c:799 utils/adt/arrayfuncs.c:829 +#: utils/adt/arrayfuncs.c:844 utils/adt/arrayfuncs.c:897 #, c-format msgid "malformed array literal: \"%s\"" msgstr "literal de array mal formado: «%s»" -#: utils/adt/arrayfuncs.c:271 +#: utils/adt/arrayfuncs.c:272 #, c-format msgid "\"[\" must introduce explicitly-specified array dimensions." msgstr "Un «[» debe introducir dimensiones de array especificadas explícitamente." -#: utils/adt/arrayfuncs.c:285 +#: utils/adt/arrayfuncs.c:286 #, c-format msgid "Missing array dimension value." msgstr "Falta un valor de dimensión de array." -#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:333 +#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "Falta «%s» luego de las dimensiones de array." -#: utils/adt/arrayfuncs.c:305 utils/adt/arrayfuncs.c:2909 -#: utils/adt/arrayfuncs.c:2941 utils/adt/arrayfuncs.c:2956 +#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2910 +#: utils/adt/arrayfuncs.c:2942 utils/adt/arrayfuncs.c:2957 #, c-format msgid "upper bound cannot be less than lower bound" msgstr "el límite superior no puede ser menor que el límite inferior" -#: utils/adt/arrayfuncs.c:318 +#: utils/adt/arrayfuncs.c:319 #, c-format msgid "Array value must start with \"{\" or dimension information." msgstr "El valor de array debe comenzar con «{» o información de dimensión." -#: utils/adt/arrayfuncs.c:347 +#: utils/adt/arrayfuncs.c:348 #, c-format msgid "Array contents must start with \"{\"." msgstr "El contenido del array debe empezar con «{»." -#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 +#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 #, c-format msgid "Specified array dimensions do not match array contents." msgstr "Las dimensiones del array especificadas no coinciden con el contenido del array." -#: utils/adt/arrayfuncs.c:493 utils/adt/arrayfuncs.c:520 -#: utils/adt/multirangetypes.c:162 utils/adt/rangetypes.c:2310 +#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:521 +#: utils/adt/multirangetypes.c:163 utils/adt/rangetypes.c:2310 #: utils/adt/rangetypes.c:2318 utils/adt/rowtypes.c:211 #: utils/adt/rowtypes.c:219 #, c-format msgid "Unexpected end of input." msgstr "Fin inesperado de la entrada." -#: utils/adt/arrayfuncs.c:509 utils/adt/arrayfuncs.c:556 -#: utils/adt/arrayfuncs.c:586 utils/adt/arrayfuncs.c:635 +#: utils/adt/arrayfuncs.c:510 utils/adt/arrayfuncs.c:557 +#: utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 #, c-format msgid "Unexpected \"%c\" character." msgstr "Carácter «%c» inesperado." -#: utils/adt/arrayfuncs.c:535 utils/adt/arrayfuncs.c:658 +#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 #, c-format msgid "Unexpected array element." msgstr "Elemento de array inesperado." -#: utils/adt/arrayfuncs.c:593 +#: utils/adt/arrayfuncs.c:594 #, c-format msgid "Unmatched \"%c\" character." msgstr "Carácter «%c» desemparejado." -#: utils/adt/arrayfuncs.c:601 utils/adt/jsonfuncs.c:2593 +#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2595 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "Los arrays multidimensionales deben tener sub-arrays con dimensiones coincidentes." -#: utils/adt/arrayfuncs.c:678 +#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:286 #, c-format msgid "Junk after closing right brace." msgstr "Basura después de la llave derecha de cierre." -#: utils/adt/arrayfuncs.c:1300 utils/adt/arrayfuncs.c:3370 -#: utils/adt/arrayfuncs.c:5849 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3371 +#: utils/adt/arrayfuncs.c:5884 #, c-format msgid "invalid number of dimensions: %d" msgstr "número incorrecto de dimensiones: %d" -#: utils/adt/arrayfuncs.c:1311 +#: utils/adt/arrayfuncs.c:1312 #, c-format msgid "invalid array flags" msgstr "opciones de array no válidas" -#: utils/adt/arrayfuncs.c:1333 +#: utils/adt/arrayfuncs.c:1334 #, c-format msgid "binary data has array element type %u (%s) instead of expected %u (%s)" -msgstr "" +msgstr "los datos binarios tienen el tipo de elemento de array %u (%s) en lugar del esperado %u (%s)" -#: utils/adt/arrayfuncs.c:1377 utils/adt/multirangetypes.c:443 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:444 #: utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2905 #, c-format msgid "no binary input function available for type %s" msgstr "no hay una función binaria de entrada para el tipo %s" -#: utils/adt/arrayfuncs.c:1517 +#: utils/adt/arrayfuncs.c:1518 #, c-format msgid "improper binary format in array element %d" msgstr "el formato binario no es válido en elemento %d de array" -#: utils/adt/arrayfuncs.c:1598 utils/adt/multirangetypes.c:448 +#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:449 #: utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2938 #, c-format msgid "no binary output function available for type %s" msgstr "no hay una función binaria de salida para el tipo %s" -#: utils/adt/arrayfuncs.c:2077 +#: utils/adt/arrayfuncs.c:2078 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "no está implementada la obtención de segmentos de arrays de largo fijo" -#: utils/adt/arrayfuncs.c:2255 utils/adt/arrayfuncs.c:2277 -#: utils/adt/arrayfuncs.c:2326 utils/adt/arrayfuncs.c:2565 -#: utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5835 -#: utils/adt/arrayfuncs.c:5861 utils/adt/arrayfuncs.c:5872 +#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 +#: utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2566 +#: utils/adt/arrayfuncs.c:2888 utils/adt/arrayfuncs.c:5870 +#: utils/adt/arrayfuncs.c:5896 utils/adt/arrayfuncs.c:5907 #: utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 -#: utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4427 utils/adt/jsonfuncs.c:4580 -#: utils/adt/jsonfuncs.c:4692 utils/adt/jsonfuncs.c:4741 +#: utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4429 utils/adt/jsonfuncs.c:4582 +#: utils/adt/jsonfuncs.c:4694 utils/adt/jsonfuncs.c:4743 #, c-format msgid "wrong number of array subscripts" msgstr "número incorrecto de subíndices del array" -#: utils/adt/arrayfuncs.c:2260 utils/adt/arrayfuncs.c:2368 -#: utils/adt/arrayfuncs.c:2632 utils/adt/arrayfuncs.c:2946 +#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 +#: utils/adt/arrayfuncs.c:2633 utils/adt/arrayfuncs.c:2947 #, c-format msgid "array subscript out of range" msgstr "subíndice de array fuera de rango" -#: utils/adt/arrayfuncs.c:2265 +#: utils/adt/arrayfuncs.c:2266 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "no se puede asignar un valor nulo a un elemento de un array de longitud fija" -#: utils/adt/arrayfuncs.c:2834 +#: utils/adt/arrayfuncs.c:2835 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "no están implementadas las actualizaciones en segmentos de arrays de largo fija" -#: utils/adt/arrayfuncs.c:2865 +#: utils/adt/arrayfuncs.c:2866 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "los subíndices del segmento de array deben especificar ambos bordes" -#: utils/adt/arrayfuncs.c:2866 +#: utils/adt/arrayfuncs.c:2867 #, c-format msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." msgstr "Cuando se asigna a un segmento de un array vacío, los bordes del segmento deben ser especificados completamente." -#: utils/adt/arrayfuncs.c:2877 utils/adt/arrayfuncs.c:2973 +#: utils/adt/arrayfuncs.c:2878 utils/adt/arrayfuncs.c:2974 #, c-format msgid "source array too small" msgstr "el array de origen es demasiado pequeño" -#: utils/adt/arrayfuncs.c:3528 +#: utils/adt/arrayfuncs.c:3529 #, c-format msgid "null array element not allowed in this context" msgstr "los arrays con elementos null no son permitidos en este contexto" -#: utils/adt/arrayfuncs.c:3630 utils/adt/arrayfuncs.c:3801 -#: utils/adt/arrayfuncs.c:4157 +#: utils/adt/arrayfuncs.c:3631 utils/adt/arrayfuncs.c:3802 +#: utils/adt/arrayfuncs.c:4192 #, c-format msgid "cannot compare arrays of different element types" msgstr "no se pueden comparar arrays con elementos de distintos tipos" -#: utils/adt/arrayfuncs.c:3979 utils/adt/multirangetypes.c:2670 -#: utils/adt/multirangetypes.c:2742 utils/adt/rangetypes.c:1343 +#: utils/adt/arrayfuncs.c:3980 utils/adt/multirangetypes.c:2742 +#: utils/adt/multirangetypes.c:2814 utils/adt/rangetypes.c:1343 #: utils/adt/rangetypes.c:1407 utils/adt/rowtypes.c:1858 #, c-format msgid "could not identify a hash function for type %s" msgstr "no se pudo identificar una función de hash para el tipo %s" -#: utils/adt/arrayfuncs.c:4072 utils/adt/rowtypes.c:1979 +#: utils/adt/arrayfuncs.c:4107 utils/adt/rowtypes.c:1979 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "no se pudo identificar una función de hash extendida para el tipo %s" -#: utils/adt/arrayfuncs.c:5249 +#: utils/adt/arrayfuncs.c:5284 #, c-format msgid "data type %s is not an array type" msgstr "el tipo %s no es un array" -#: utils/adt/arrayfuncs.c:5304 +#: utils/adt/arrayfuncs.c:5339 #, c-format msgid "cannot accumulate null arrays" msgstr "no se pueden acumular arrays nulos" -#: utils/adt/arrayfuncs.c:5332 +#: utils/adt/arrayfuncs.c:5367 #, c-format msgid "cannot accumulate empty arrays" msgstr "no se pueden acumular arrays vacíos" -#: utils/adt/arrayfuncs.c:5359 utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:5394 utils/adt/arrayfuncs.c:5400 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "no se pueden acumular arrays de distinta dimensionalidad" -#: utils/adt/arrayfuncs.c:5733 utils/adt/arrayfuncs.c:5773 +#: utils/adt/arrayfuncs.c:5768 utils/adt/arrayfuncs.c:5808 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "el array de dimensiones o el array de límites inferiores debe ser no nulo" -#: utils/adt/arrayfuncs.c:5836 utils/adt/arrayfuncs.c:5862 +#: utils/adt/arrayfuncs.c:5871 utils/adt/arrayfuncs.c:5897 #, c-format msgid "Dimension array must be one dimensional." msgstr "El array de dimensiones debe ser unidimensional." -#: utils/adt/arrayfuncs.c:5841 utils/adt/arrayfuncs.c:5867 +#: utils/adt/arrayfuncs.c:5876 utils/adt/arrayfuncs.c:5902 #, c-format msgid "dimension values cannot be null" msgstr "los valores de dimensión no pueden ser null" -#: utils/adt/arrayfuncs.c:5873 +#: utils/adt/arrayfuncs.c:5908 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "El array de límites inferiores tiene tamaño diferente que el array de dimensiones." -#: utils/adt/arrayfuncs.c:6151 +#: utils/adt/arrayfuncs.c:6186 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "la eliminación de elementos desde arrays multidimensionales no está soportada" -#: utils/adt/arrayfuncs.c:6428 +#: utils/adt/arrayfuncs.c:6463 #, c-format msgid "thresholds must be one-dimensional array" msgstr "los umbrales deben ser un array unidimensional" -#: utils/adt/arrayfuncs.c:6433 +#: utils/adt/arrayfuncs.c:6468 #, c-format msgid "thresholds array must not contain NULLs" msgstr "el array de umbrales no debe contener nulos" -#: utils/adt/arrayfuncs.c:6666 -#, fuzzy, c-format -#| msgid "number of parameters must be between 0 and 65535\n" +#: utils/adt/arrayfuncs.c:6701 +#, c-format msgid "number of elements to trim must be between 0 and %d" -msgstr "el número de parámetros debe estar entre 0 y 65535\n" +msgstr "el número de elementos a recortar debe estar entre 0 y %d" #: utils/adt/arraysubs.c:93 utils/adt/arraysubs.c:130 #, c-format @@ -22787,7 +22487,7 @@ msgstr "subíndice de array en asignación no puede ser nulo" #: utils/adt/arrayutils.c:140 #, c-format msgid "array lower bound is too large: %d" -msgstr "" +msgstr "el límite inferior del array es demasiado grande: %d" #: utils/adt/arrayutils.c:240 #, c-format @@ -22820,9 +22520,9 @@ msgstr "la conversión de codificación de %s a ASCII no está soportada" #: utils/adt/geo_ops.c:4672 utils/adt/geo_ops.c:4679 utils/adt/int8.c:126 #: utils/adt/jsonpath.c:182 utils/adt/mac.c:94 utils/adt/mac8.c:93 #: utils/adt/mac8.c:166 utils/adt/mac8.c:184 utils/adt/mac8.c:202 -#: utils/adt/mac8.c:221 utils/adt/network.c:100 utils/adt/numeric.c:702 -#: utils/adt/numeric.c:721 utils/adt/numeric.c:6861 utils/adt/numeric.c:6885 -#: utils/adt/numeric.c:6909 utils/adt/numeric.c:7878 utils/adt/numutils.c:116 +#: utils/adt/mac8.c:221 utils/adt/network.c:100 utils/adt/numeric.c:694 +#: utils/adt/numeric.c:713 utils/adt/numeric.c:6858 utils/adt/numeric.c:6882 +#: utils/adt/numeric.c:6906 utils/adt/numeric.c:7864 utils/adt/numutils.c:116 #: utils/adt/numutils.c:126 utils/adt/numutils.c:170 utils/adt/numutils.c:246 #: utils/adt/numutils.c:322 utils/adt/oid.c:44 utils/adt/oid.c:58 #: utils/adt/oid.c:64 utils/adt/oid.c:86 utils/adt/pg_lsn.c:74 @@ -22846,9 +22546,9 @@ msgstr "el valor «%s» está fuera de rango para el tipo %s" #: utils/adt/int.c:1018 utils/adt/int.c:1080 utils/adt/int.c:1118 #: utils/adt/int.c:1146 utils/adt/int8.c:600 utils/adt/int8.c:658 #: utils/adt/int8.c:985 utils/adt/int8.c:1065 utils/adt/int8.c:1127 -#: utils/adt/int8.c:1207 utils/adt/numeric.c:3032 utils/adt/numeric.c:3055 -#: utils/adt/numeric.c:3140 utils/adt/numeric.c:3158 utils/adt/numeric.c:3254 -#: utils/adt/numeric.c:8427 utils/adt/numeric.c:8717 utils/adt/numeric.c:10299 +#: utils/adt/int8.c:1207 utils/adt/numeric.c:3031 utils/adt/numeric.c:3054 +#: utils/adt/numeric.c:3139 utils/adt/numeric.c:3157 utils/adt/numeric.c:3253 +#: utils/adt/numeric.c:8413 utils/adt/numeric.c:8703 utils/adt/numeric.c:10340 #: utils/adt/timestamp.c:3281 #, c-format msgid "division by zero" @@ -22910,16 +22610,14 @@ msgid "date out of range for timestamp" msgstr "fecha fuera de rango para timestamp" #: utils/adt/date.c:1127 utils/adt/date.c:1210 utils/adt/date.c:1226 -#, fuzzy, c-format -#| msgid "interval units \"%s\" not supported" +#, c-format msgid "date units \"%s\" not supported" -msgstr "las unidades de interval «%s» no están soportadas" +msgstr "las unidades de «date» «%s» no están soportadas" #: utils/adt/date.c:1235 -#, fuzzy, c-format -#| msgid "\"time\" units \"%s\" not recognized" +#, c-format msgid "date units \"%s\" not recognized" -msgstr "las unidades de «time» «%s» no son reconocidas" +msgstr "las unidades de «date» «%s» no son reconocidas" #: utils/adt/date.c:1318 utils/adt/date.c:1364 utils/adt/date.c:1920 #: utils/adt/date.c:1951 utils/adt/date.c:1980 utils/adt/date.c:2844 @@ -22935,15 +22633,15 @@ msgstr "las unidades de «time» «%s» no son reconocidas" #: utils/adt/timestamp.c:2989 utils/adt/timestamp.c:3002 #: utils/adt/timestamp.c:3013 utils/adt/timestamp.c:3021 #: utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3806 -#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:3981 -#: utils/adt/timestamp.c:4069 utils/adt/timestamp.c:4172 -#: utils/adt/timestamp.c:4674 utils/adt/timestamp.c:4948 -#: utils/adt/timestamp.c:5401 utils/adt/timestamp.c:5415 -#: utils/adt/timestamp.c:5420 utils/adt/timestamp.c:5434 -#: utils/adt/timestamp.c:5467 utils/adt/timestamp.c:5554 -#: utils/adt/timestamp.c:5595 utils/adt/timestamp.c:5599 -#: utils/adt/timestamp.c:5668 utils/adt/timestamp.c:5672 -#: utils/adt/timestamp.c:5686 utils/adt/timestamp.c:5720 utils/adt/xml.c:2232 +#: utils/adt/timestamp.c:3896 utils/adt/timestamp.c:3986 +#: utils/adt/timestamp.c:4079 utils/adt/timestamp.c:4182 +#: utils/adt/timestamp.c:4684 utils/adt/timestamp.c:4958 +#: utils/adt/timestamp.c:5411 utils/adt/timestamp.c:5425 +#: utils/adt/timestamp.c:5430 utils/adt/timestamp.c:5444 +#: utils/adt/timestamp.c:5477 utils/adt/timestamp.c:5564 +#: utils/adt/timestamp.c:5605 utils/adt/timestamp.c:5609 +#: utils/adt/timestamp.c:5678 utils/adt/timestamp.c:5682 +#: utils/adt/timestamp.c:5696 utils/adt/timestamp.c:5730 utils/adt/xml.c:2232 #: utils/adt/xml.c:2239 utils/adt/xml.c:2259 utils/adt/xml.c:2266 #, c-format msgid "timestamp out of range" @@ -22961,7 +22659,7 @@ msgstr "valor en campo de hora fuera de rango: %d:%02d:%02g" #: utils/adt/date.c:2109 utils/adt/date.c:2643 utils/adt/float.c:1047 #: utils/adt/float.c:1123 utils/adt/int.c:614 utils/adt/int.c:661 -#: utils/adt/int.c:696 utils/adt/int8.c:499 utils/adt/numeric.c:2443 +#: utils/adt/int.c:696 utils/adt/int8.c:499 utils/adt/numeric.c:2435 #: utils/adt/timestamp.c:3330 utils/adt/timestamp.c:3361 #: utils/adt/timestamp.c:3392 #, c-format @@ -22983,15 +22681,15 @@ msgstr "desplazamiento de huso horario fuera de rango" msgid "\"time with time zone\" units \"%s\" not recognized" msgstr "las unidades de «timestamp with time zone» «%s» no son reconocidas" -#: utils/adt/date.c:3095 utils/adt/datetime.c:951 utils/adt/datetime.c:1858 +#: utils/adt/date.c:3097 utils/adt/datetime.c:951 utils/adt/datetime.c:1858 #: utils/adt/datetime.c:4648 utils/adt/timestamp.c:515 -#: utils/adt/timestamp.c:542 utils/adt/timestamp.c:4255 -#: utils/adt/timestamp.c:5426 utils/adt/timestamp.c:5678 +#: utils/adt/timestamp.c:542 utils/adt/timestamp.c:4265 +#: utils/adt/timestamp.c:5436 utils/adt/timestamp.c:5688 #, c-format msgid "time zone \"%s\" not recognized" msgstr "el huso horario «%s» no es reconocido" -#: utils/adt/date.c:3127 utils/adt/timestamp.c:5456 utils/adt/timestamp.c:5709 +#: utils/adt/date.c:3129 utils/adt/timestamp.c:5466 utils/adt/timestamp.c:5719 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "el intervalo de huso horario «%s» no debe especificar meses o días" @@ -23021,22 +22719,22 @@ msgstr "desplazamiento de huso horario fuera de rango: «%s»" msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "Este nombre de huso horario aparece en el archivo de configuración para abreviaciones de husos horarios «%s»." -#: utils/adt/datum.c:89 utils/adt/datum.c:101 +#: utils/adt/datum.c:90 utils/adt/datum.c:102 #, c-format msgid "invalid Datum pointer" msgstr "puntero a Datum no válido" -#: utils/adt/dbsize.c:749 utils/adt/dbsize.c:817 +#: utils/adt/dbsize.c:754 utils/adt/dbsize.c:822 #, c-format msgid "invalid size: \"%s\"" msgstr "tamaño no válido: «%s»" -#: utils/adt/dbsize.c:818 +#: utils/adt/dbsize.c:823 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Nombre de unidad de tamaño no válido: «%s»." -#: utils/adt/dbsize.c:819 +#: utils/adt/dbsize.c:824 #, c-format msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." msgstr "Unidades válidas son «bytes«, «kB», «MB», «GB» y «TB»." @@ -23046,39 +22744,47 @@ msgstr "Unidades válidas son «bytes«, «kB», «MB», «GB» y «TB»." msgid "type %s is not a domain" msgstr "tipo «%s» no es un dominio" -#: utils/adt/encode.c:68 utils/adt/encode.c:112 +#: utils/adt/encode.c:65 utils/adt/encode.c:113 #, c-format msgid "unrecognized encoding: \"%s\"" msgstr "no se reconoce la codificación: «%s»" -#: utils/adt/encode.c:82 -#, fuzzy, c-format -#| msgid "result of decoding conversion is too large" +#: utils/adt/encode.c:79 +#, c-format msgid "result of encoding conversion is too large" msgstr "el resultado de la conversión de codificación es demasiado grande" -#: utils/adt/encode.c:126 +#: utils/adt/encode.c:127 #, c-format msgid "result of decoding conversion is too large" -msgstr "el resultado de la conversión de codificación es demasiado grande" +msgstr "el resultado de la conversión de decodificación es demasiado grande" + +#: utils/adt/encode.c:186 +#, c-format +msgid "invalid hexadecimal digit: \"%.*s\"" +msgstr "dígito hexadecimal no válido: «%.*s»" + +#: utils/adt/encode.c:216 +#, c-format +msgid "invalid hexadecimal data: odd number of digits" +msgstr "el dato hexadecimal no es válido: tiene un número impar de dígitos" -#: utils/adt/encode.c:261 +#: utils/adt/encode.c:334 #, c-format msgid "unexpected \"=\" while decoding base64 sequence" msgstr "«=» inesperado mientras se decodificaba la secuencia base64" -#: utils/adt/encode.c:273 -#, fuzzy, c-format -#| msgid "invalid symbol \"%c\" while decoding base64 sequence" +#: utils/adt/encode.c:346 +#, c-format msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" -msgstr "símbolo «%c» no válido al decodificar secuencia base64" +msgstr "se encontró símbolo no válido «%.*s» al decodificar secuencia base64" -#: utils/adt/encode.c:304 +#: utils/adt/encode.c:367 #, c-format msgid "invalid base64 end sequence" msgstr "secuencia de término base64 no válida" -#: utils/adt/encode.c:305 +#: utils/adt/encode.c:368 #, c-format msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "A los datos de entrada les falta relleno, o están truncados, o están corruptos de alguna otra forma." @@ -23138,34 +22844,34 @@ msgstr "«%s» está fuera de rango para el tipo double precision" #: utils/adt/float.c:1258 utils/adt/float.c:1332 utils/adt/int.c:334 #: utils/adt/int.c:872 utils/adt/int.c:894 utils/adt/int.c:908 #: utils/adt/int.c:922 utils/adt/int.c:954 utils/adt/int.c:1192 -#: utils/adt/int8.c:1320 utils/adt/numeric.c:4317 utils/adt/numeric.c:4326 +#: utils/adt/int8.c:1320 utils/adt/numeric.c:4315 utils/adt/numeric.c:4320 #, c-format msgid "smallint out of range" msgstr "smallint fuera de rango" -#: utils/adt/float.c:1458 utils/adt/numeric.c:3550 utils/adt/numeric.c:9310 +#: utils/adt/float.c:1458 utils/adt/numeric.c:3549 utils/adt/numeric.c:9296 #, c-format msgid "cannot take square root of a negative number" msgstr "no se puede calcular la raíz cuadrada un de número negativo" -#: utils/adt/float.c:1526 utils/adt/numeric.c:3825 utils/adt/numeric.c:3935 +#: utils/adt/float.c:1526 utils/adt/numeric.c:3824 utils/adt/numeric.c:3936 #, c-format msgid "zero raised to a negative power is undefined" msgstr "cero elevado a una potencia negativa es indefinido" -#: utils/adt/float.c:1530 utils/adt/numeric.c:3829 utils/adt/numeric.c:3940 +#: utils/adt/float.c:1530 utils/adt/numeric.c:3828 utils/adt/numeric.c:10193 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "un número negativo elevado a una potencia no positiva entrega un resultado complejo" -#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3737 -#: utils/adt/numeric.c:9974 +#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3736 +#: utils/adt/numeric.c:9966 #, c-format msgid "cannot take logarithm of zero" msgstr "no se puede calcular logaritmo de cero" -#: utils/adt/float.c:1710 utils/adt/float.c:1743 utils/adt/numeric.c:3675 -#: utils/adt/numeric.c:3732 utils/adt/numeric.c:9978 +#: utils/adt/float.c:1710 utils/adt/float.c:1743 utils/adt/numeric.c:3674 +#: utils/adt/numeric.c:3731 utils/adt/numeric.c:9970 #, c-format msgid "cannot take logarithm of a negative number" msgstr "no se puede calcular logaritmo de un número negativo" @@ -23184,22 +22890,22 @@ msgstr "la entrada está fuera de rango" msgid "setseed parameter %g is out of allowed range [-1,1]" msgstr "parámetro setseed %g fuera del rango permitido [-1,1]" -#: utils/adt/float.c:4030 utils/adt/numeric.c:1716 +#: utils/adt/float.c:4030 utils/adt/numeric.c:1708 #, c-format msgid "count must be greater than zero" msgstr "count debe ser mayor que cero" -#: utils/adt/float.c:4035 utils/adt/numeric.c:1727 +#: utils/adt/float.c:4035 utils/adt/numeric.c:1719 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "el operando, límite inferior y límite superior no pueden ser NaN" -#: utils/adt/float.c:4041 utils/adt/numeric.c:1732 +#: utils/adt/float.c:4041 utils/adt/numeric.c:1724 #, c-format msgid "lower and upper bounds must be finite" msgstr "los límites inferior y superior deben ser finitos" -#: utils/adt/float.c:4075 utils/adt/numeric.c:1746 +#: utils/adt/float.c:4075 utils/adt/numeric.c:1738 #, c-format msgid "lower bound cannot equal upper bound" msgstr "el límite superior no puede ser igual al límite inferior" @@ -23285,10 +22991,9 @@ msgid "\"EEEE\" may only be used together with digit and decimal point patterns. msgstr "«EEEE» sólo puede ser usado en conjunción con patrones de dígitos y puntos decimales." #: utils/adt/formatting.c:1394 -#, fuzzy, c-format -#| msgid "unmatched format separator \"%c\"" +#, c-format msgid "invalid datetime format separator: \"%s\"" -msgstr "separador de formato «%c» desemparejado" +msgstr "separador de formato «datetime» no válido: «%s»" #: utils/adt/formatting.c:1521 #, c-format @@ -23388,10 +23093,9 @@ msgid "unmatched format separator \"%c\"" msgstr "separador de formato «%c» desemparejado" #: utils/adt/formatting.c:3403 -#, fuzzy, c-format -#| msgid "unmatched format separator \"%c\"" +#, c-format msgid "unmatched format character \"%s\"" -msgstr "separador de formato «%c» desemparejado" +msgstr "carácter de formato «%s» desemparejado" #: utils/adt/formatting.c:3509 utils/adt/formatting.c:3853 #, c-format @@ -23496,10 +23200,9 @@ msgid "could not seek in file \"%s\": %m" msgstr "no se pudo posicionar (seek) el archivo «%s»: %m" #: utils/adt/genfile.c:176 -#, fuzzy, c-format -#| msgid "requested length too large" +#, c-format msgid "file length too large" -msgstr "el tamaño solicitado es demasiado grande" +msgstr "el tamaño del archivo es demasiado grande" #: utils/adt/genfile.c:253 #, c-format @@ -23533,10 +23236,9 @@ msgid "function \"dist_lb\" not implemented" msgstr "la función «dist_lb» no está implementada" #: utils/adt/geo_ops.c:2568 -#, fuzzy, c-format -#| msgid "function \"dist_lb\" not implemented" +#, c-format msgid "function \"dist_bl\" not implemented" -msgstr "la función «dist_lb» no está implementada" +msgstr "la función «dist_bl» no está implementada" #: utils/adt/geo_ops.c:2987 #, c-format @@ -23598,8 +23300,8 @@ msgstr "datos de int2vector no válidos" msgid "oidvector has too many elements" msgstr "el oidvector tiene demasiados elementos" -#: utils/adt/int.c:1508 utils/adt/int8.c:1446 utils/adt/numeric.c:1624 -#: utils/adt/timestamp.c:5771 utils/adt/timestamp.c:5851 +#: utils/adt/int.c:1508 utils/adt/int8.c:1446 utils/adt/numeric.c:1616 +#: utils/adt/timestamp.c:5781 utils/adt/timestamp.c:5861 #, c-format msgid "step size cannot equal zero" msgstr "el tamaño de paso no puede ser cero" @@ -23613,7 +23315,7 @@ msgstr "el tamaño de paso no puede ser cero" #: utils/adt/int8.c:1037 utils/adt/int8.c:1051 utils/adt/int8.c:1084 #: utils/adt/int8.c:1098 utils/adt/int8.c:1112 utils/adt/int8.c:1143 #: utils/adt/int8.c:1165 utils/adt/int8.c:1179 utils/adt/int8.c:1193 -#: utils/adt/int8.c:1355 utils/adt/int8.c:1390 utils/adt/numeric.c:4276 +#: utils/adt/int8.c:1355 utils/adt/int8.c:1390 utils/adt/numeric.c:4274 #: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" @@ -23752,241 +23454,235 @@ msgstr "el tamaño total de los elementos del array jsonb excede el máximo de % msgid "total size of jsonb object elements exceeds the maximum of %u bytes" msgstr "el tamaño total de los elementos del objeto jsonb excede el máximo de %u bytes" -#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:152 -#, fuzzy, c-format -#| msgid "this build does not support compression" +#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 +#, c-format msgid "jsonb subscript does not support slices" -msgstr "esta instalación no soporta compresión" +msgstr "el subíndice jsonb no soporta segmentos" -#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:118 -#, fuzzy, c-format -#| msgid "log format \"%s\" is not supported" -msgid "subscript type is not supported" -msgstr "el formato de log «%s» no está soportado" +#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 +#, c-format +msgid "subscript type %s is not supported" +msgstr "el tipo de subíndice %s no está soportado" #: utils/adt/jsonbsubs.c:104 #, c-format -msgid "Jsonb subscript must be coerced only to one type, integer or text." -msgstr "" +msgid "jsonb subscript must be coercible to only one type, integer or text." +msgstr "subíndice jsonb debe ser coercible solo para un tipo, integer o text." -#: utils/adt/jsonbsubs.c:119 +#: utils/adt/jsonbsubs.c:118 #, c-format -msgid "Jsonb subscript must be coerced to either integer or text" -msgstr "" +msgid "jsonb subscript must be coercible to either integer or text." +msgstr "subíndice jsonb debe ser coercible ya sea para integer o para text." -#: utils/adt/jsonbsubs.c:140 -#, fuzzy, c-format -#| msgid "array subscript must have type integer" +#: utils/adt/jsonbsubs.c:139 +#, c-format msgid "jsonb subscript must have text type" -msgstr "los subíndices de arrays deben tener tipo entero" +msgstr "subíndice jsonb debe tener tipo text" -#: utils/adt/jsonbsubs.c:208 -#, fuzzy, c-format -#| msgid "array subscript in assignment must not be null" +#: utils/adt/jsonbsubs.c:207 +#, c-format msgid "jsonb subscript in assignment must not be null" -msgstr "subíndice de array en asignación no puede ser nulo" +msgstr "subíndice jsonb en asignación no puede ser nulo" -#: utils/adt/jsonfuncs.c:555 utils/adt/jsonfuncs.c:789 -#: utils/adt/jsonfuncs.c:2471 utils/adt/jsonfuncs.c:2911 -#: utils/adt/jsonfuncs.c:3700 utils/adt/jsonfuncs.c:4030 +#: utils/adt/jsonfuncs.c:555 utils/adt/jsonfuncs.c:791 +#: utils/adt/jsonfuncs.c:2473 utils/adt/jsonfuncs.c:2913 +#: utils/adt/jsonfuncs.c:3702 utils/adt/jsonfuncs.c:4032 #, c-format msgid "cannot call %s on a scalar" msgstr "no se puede invocar %s en un escalar" -#: utils/adt/jsonfuncs.c:560 utils/adt/jsonfuncs.c:776 -#: utils/adt/jsonfuncs.c:2913 utils/adt/jsonfuncs.c:3689 +#: utils/adt/jsonfuncs.c:560 utils/adt/jsonfuncs.c:778 +#: utils/adt/jsonfuncs.c:2915 utils/adt/jsonfuncs.c:3691 #, c-format msgid "cannot call %s on an array" msgstr "no se puede invocar %s en un array" -#: utils/adt/jsonfuncs.c:685 +#: utils/adt/jsonfuncs.c:687 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "Datos JSON, línea %d: %s%s%s" -#: utils/adt/jsonfuncs.c:1823 utils/adt/jsonfuncs.c:1858 +#: utils/adt/jsonfuncs.c:1825 utils/adt/jsonfuncs.c:1860 #, c-format msgid "cannot get array length of a scalar" msgstr "no se puede obtener el largo de array de un escalar" -#: utils/adt/jsonfuncs.c:1827 utils/adt/jsonfuncs.c:1846 +#: utils/adt/jsonfuncs.c:1829 utils/adt/jsonfuncs.c:1848 #, c-format msgid "cannot get array length of a non-array" msgstr "no se puede obtener el largo de array de un no-array" -#: utils/adt/jsonfuncs.c:1923 +#: utils/adt/jsonfuncs.c:1925 #, c-format msgid "cannot call %s on a non-object" msgstr "no se puede invocar %s en un no-objeto" -#: utils/adt/jsonfuncs.c:2162 +#: utils/adt/jsonfuncs.c:2164 #, c-format msgid "cannot deconstruct an array as an object" msgstr "no se puede desconstruir un array como un objeto" -#: utils/adt/jsonfuncs.c:2174 +#: utils/adt/jsonfuncs.c:2176 #, c-format msgid "cannot deconstruct a scalar" msgstr "no se puede desconstruir un escalar" -#: utils/adt/jsonfuncs.c:2220 +#: utils/adt/jsonfuncs.c:2222 #, c-format msgid "cannot extract elements from a scalar" msgstr "no se pueden extraer elementos de un escalar" -#: utils/adt/jsonfuncs.c:2224 +#: utils/adt/jsonfuncs.c:2226 #, c-format msgid "cannot extract elements from an object" msgstr "no se pudo extraer elementos de un objeto" -#: utils/adt/jsonfuncs.c:2458 utils/adt/jsonfuncs.c:3915 +#: utils/adt/jsonfuncs.c:2460 utils/adt/jsonfuncs.c:3917 #, c-format msgid "cannot call %s on a non-array" msgstr "no se puede invocar %s en un no-array" -#: utils/adt/jsonfuncs.c:2528 utils/adt/jsonfuncs.c:2533 -#: utils/adt/jsonfuncs.c:2550 utils/adt/jsonfuncs.c:2556 +#: utils/adt/jsonfuncs.c:2530 utils/adt/jsonfuncs.c:2535 +#: utils/adt/jsonfuncs.c:2552 utils/adt/jsonfuncs.c:2558 #, c-format msgid "expected JSON array" msgstr "se esperaba un array JSON" -#: utils/adt/jsonfuncs.c:2529 +#: utils/adt/jsonfuncs.c:2531 #, c-format msgid "See the value of key \"%s\"." msgstr "Vea el valor de la llave «%s»." -#: utils/adt/jsonfuncs.c:2551 +#: utils/adt/jsonfuncs.c:2553 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Vea el elemento %s de la llave «%s»." -#: utils/adt/jsonfuncs.c:2557 +#: utils/adt/jsonfuncs.c:2559 #, c-format msgid "See the array element %s." msgstr "Veo el elemento de array %s." -#: utils/adt/jsonfuncs.c:2592 +#: utils/adt/jsonfuncs.c:2594 #, c-format msgid "malformed JSON array" msgstr "array JSON mal formado" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3419 +#: utils/adt/jsonfuncs.c:3421 #, c-format msgid "first argument of %s must be a row type" msgstr "el primer argumento de %s debe ser un tipo de registro" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3443 +#: utils/adt/jsonfuncs.c:3445 #, c-format msgid "could not determine row type for result of %s" msgstr "no se pudo determinar el tipo de dato para el resultado de %s" -#: utils/adt/jsonfuncs.c:3445 +#: utils/adt/jsonfuncs.c:3447 #, c-format msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." msgstr "Provea un argumento de registro no-nulo, o invoque la función en la cláusula FROM usando una lista de definición de columnas." -#: utils/adt/jsonfuncs.c:3932 utils/adt/jsonfuncs.c:4012 +#: utils/adt/jsonfuncs.c:3934 utils/adt/jsonfuncs.c:4014 #, c-format msgid "argument of %s must be an array of objects" msgstr "el argumento de %s debe ser un array de objetos" -#: utils/adt/jsonfuncs.c:3965 +#: utils/adt/jsonfuncs.c:3967 #, c-format msgid "cannot call %s on an object" msgstr "no se puede invocar %s en un objeto" -#: utils/adt/jsonfuncs.c:4373 utils/adt/jsonfuncs.c:4432 -#: utils/adt/jsonfuncs.c:4512 +#: utils/adt/jsonfuncs.c:4375 utils/adt/jsonfuncs.c:4434 +#: utils/adt/jsonfuncs.c:4514 #, c-format msgid "cannot delete from scalar" msgstr "no se puede eliminar de un escalar" -#: utils/adt/jsonfuncs.c:4517 +#: utils/adt/jsonfuncs.c:4519 #, c-format msgid "cannot delete from object using integer index" msgstr "no se puede eliminar de un objeto usando un índice numérico" -#: utils/adt/jsonfuncs.c:4585 utils/adt/jsonfuncs.c:4746 +#: utils/adt/jsonfuncs.c:4587 utils/adt/jsonfuncs.c:4748 #, c-format msgid "cannot set path in scalar" msgstr "no se puede definir una ruta en un escalar" -#: utils/adt/jsonfuncs.c:4627 utils/adt/jsonfuncs.c:4669 +#: utils/adt/jsonfuncs.c:4629 utils/adt/jsonfuncs.c:4671 #, c-format msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" msgstr "null_value_treatment debe ser «delete_key», «return_target», «use_json_null», o «raise_exception»" -#: utils/adt/jsonfuncs.c:4640 -#, fuzzy, c-format -#| msgid "slot name must not be null" +#: utils/adt/jsonfuncs.c:4642 +#, c-format msgid "JSON value must not be null" -msgstr "el nombre de slot no debe ser null" +msgstr "valor JSON no debe ser null" -#: utils/adt/jsonfuncs.c:4641 +#: utils/adt/jsonfuncs.c:4643 #, c-format msgid "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "Una excepción fue lanzada porque null_value_treatment es «raise_exception»." -#: utils/adt/jsonfuncs.c:4642 +#: utils/adt/jsonfuncs.c:4644 #, c-format msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." msgstr "Para impedir esto, puede cambiar el argumento null_value_treatment o asegurarse que no se pase un nulo SQL." -#: utils/adt/jsonfuncs.c:4697 +#: utils/adt/jsonfuncs.c:4699 #, c-format msgid "cannot delete path in scalar" msgstr "no se puede eliminar una ruta en un escalar" -#: utils/adt/jsonfuncs.c:4913 +#: utils/adt/jsonfuncs.c:4915 #, c-format msgid "path element at position %d is null" msgstr "el elemento en la posición %d de la ruta es null" -#: utils/adt/jsonfuncs.c:4932 utils/adt/jsonfuncs.c:4963 -#: utils/adt/jsonfuncs.c:5030 +#: utils/adt/jsonfuncs.c:4934 utils/adt/jsonfuncs.c:4965 +#: utils/adt/jsonfuncs.c:5032 #, c-format msgid "cannot replace existing key" msgstr "no se puede reemplazar una llave existente" -#: utils/adt/jsonfuncs.c:4933 utils/adt/jsonfuncs.c:4964 +#: utils/adt/jsonfuncs.c:4935 utils/adt/jsonfuncs.c:4966 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." -msgstr "" +msgstr "La ruta asume que la llave es un objeto compuesto, pero es un valor escalar." -#: utils/adt/jsonfuncs.c:5031 +#: utils/adt/jsonfuncs.c:5033 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Intente usar la función jsonb_set para reemplazar el valor de la llave." -#: utils/adt/jsonfuncs.c:5135 +#: utils/adt/jsonfuncs.c:5137 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "el elemento de ruta en la posición %d no es un entero: «%s»" -#: utils/adt/jsonfuncs.c:5152 -#, fuzzy, c-format -#| msgid "path element at position %d is not an integer: \"%s\"" +#: utils/adt/jsonfuncs.c:5154 +#, c-format msgid "path element at position %d is out of range: %d" -msgstr "el elemento de ruta en la posición %d no es un entero: «%s»" +msgstr "el elemento de ruta en la posición %d está fuera de rango: %d" -#: utils/adt/jsonfuncs.c:5304 +#: utils/adt/jsonfuncs.c:5306 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "indicador de tipo errónea, sólo se permiten arrays y tipos escalares" -#: utils/adt/jsonfuncs.c:5311 +#: utils/adt/jsonfuncs.c:5313 #, c-format msgid "flag array element is not a string" msgstr "elemento del array de opciones no es un string" -#: utils/adt/jsonfuncs.c:5312 utils/adt/jsonfuncs.c:5334 +#: utils/adt/jsonfuncs.c:5314 utils/adt/jsonfuncs.c:5336 #, c-format msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." msgstr "Los valores posibles son: «string», «numeric», «boolean», «key» y «all»." -#: utils/adt/jsonfuncs.c:5332 +#: utils/adt/jsonfuncs.c:5334 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "indicador erróneo en array de indicadores: «%s»" @@ -24052,10 +23748,9 @@ msgid "jsonpath item method .%s() can only be applied to an array" msgstr "el método de ítem jsonpath .%s() sólo puede aplicase a un array" #: utils/adt/jsonpath_exec.c:1055 -#, fuzzy, c-format -#| msgid "string argument of jsonpath item method .%s() is not a valid representation of a double precision number" +#, c-format msgid "numeric argument of jsonpath item method .%s() is out of range for type double precision" -msgstr "el argumento cadena del método de item jsonpath .%s() no es una representación válida de un número de precisión doble" +msgstr "el argumento numérico del método de item jsonpath .%s() está fuera de rango para el tipo de precisión doble" #: utils/adt/jsonpath_exec.c:1076 #, c-format @@ -24123,14 +23818,12 @@ msgid "jsonpath array subscript is out of integer range" msgstr "subíndice de array jsonpath fuera del rango entero" #: utils/adt/jsonpath_exec.c:2591 -#, fuzzy, c-format -#| msgid "cannot convert value from %s to %s without timezone usage" +#, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "no se puede convertir el valor de %s a %s sin uso de huso horario" #: utils/adt/jsonpath_exec.c:2593 -#, fuzzy, c-format -#| msgid "Use *_tz() function for timezone support." +#, c-format msgid "Use *_tz() function for time zone support." msgstr "Utilice una función *_tz() para el soporte de huso horario." @@ -24195,10 +23888,9 @@ msgid "Only addresses that have FF and FE as values in the 4th and 5th bytes fro msgstr "Sólo las direcciones que tienen FF y FF como valores en el cuarto y quinto bytes desde la izquierda, por ejemplo xx:xx:xx:ff:fe:xx:xx:xx se pueden convertir de macaddr8 a macaddr." #: utils/adt/mcxtfuncs.c:184 -#, fuzzy, c-format -#| msgid "must be superuser to alter a type" +#, c-format msgid "must be a superuser to log memory contexts" -msgstr "debe ser superusuario para alterar un tipo" +msgstr "debe ser superusuario para registrar contextos de memoria" #: utils/adt/misc.c:243 #, c-format @@ -24228,11 +23920,11 @@ msgstr "reservado" #: utils/adt/misc.c:478 msgid "can be bare label" -msgstr "" +msgstr "puede ser una etiqueta sola" #: utils/adt/misc.c:483 msgid "requires AS" -msgstr "" +msgstr "requiere AS" #: utils/adt/misc.c:730 utils/adt/misc.c:744 utils/adt/misc.c:783 #: utils/adt/misc.c:789 utils/adt/misc.c:795 utils/adt/misc.c:818 @@ -24270,65 +23962,47 @@ msgstr "el formato de log «%s» no está soportado" msgid "The supported log formats are \"stderr\" and \"csvlog\"." msgstr "Los formatos de registro admitidos son \"stderr\" y \"csvlog\"." -#: utils/adt/multirangetypes.c:147 utils/adt/multirangetypes.c:160 -#: utils/adt/multirangetypes.c:189 utils/adt/multirangetypes.c:259 -#: utils/adt/multirangetypes.c:283 -#, fuzzy, c-format -#| msgid "malformed range literal: \"%s\"" +#: utils/adt/multirangetypes.c:148 utils/adt/multirangetypes.c:161 +#: utils/adt/multirangetypes.c:190 utils/adt/multirangetypes.c:260 +#: utils/adt/multirangetypes.c:284 +#, c-format msgid "malformed multirange literal: \"%s\"" -msgstr "literal de rango mal formado: «%s»" +msgstr "literal de multirango mal formado: «%s»" -#: utils/adt/multirangetypes.c:149 -#, fuzzy, c-format -#| msgid "Missing left parenthesis." +#: utils/adt/multirangetypes.c:150 +#, c-format msgid "Missing left brace." -msgstr "Falta paréntesis izquierdo." +msgstr "Falta llave izquierda." -#: utils/adt/multirangetypes.c:191 -#, fuzzy, c-format -#| msgid "unexpected array start" +#: utils/adt/multirangetypes.c:192 +#, c-format msgid "Expected range start." -msgstr "inicio de array inesperado" +msgstr "Se esperaba inicio de rango." -#: utils/adt/multirangetypes.c:261 -#, fuzzy, c-format -#| msgid "unexpected end of line" +#: utils/adt/multirangetypes.c:262 +#, c-format msgid "Expected comma or end of multirange." -msgstr "fin de línea inesperado" - -#: utils/adt/multirangetypes.c:285 -#, fuzzy, c-format -#| msgid "Junk after closing right brace." -msgid "Junk after right brace." -msgstr "Basura después de la llave derecha de cierre." - -#: utils/adt/multirangetypes.c:971 -#, fuzzy, c-format -#| msgid "thresholds must be one-dimensional array" -msgid "multiranges cannot be constructed from multi-dimensional arrays" -msgstr "los umbrales deben ser un array unidimensional" +msgstr "Se esperaba una coma o el final del multirango." -#: utils/adt/multirangetypes.c:977 utils/adt/multirangetypes.c:1042 -#, fuzzy, c-format -#| msgid "type %s is not a composite type" -msgid "type %u does not match constructor type" -msgstr "el tipo %s no es un tipo compuesto" +#: utils/adt/multirangetypes.c:975 +#, c-format +msgid "multiranges cannot be constructed from multidimensional arrays" +msgstr "no se puede construir multirangos a partir de arrays multidimensionales" -#: utils/adt/multirangetypes.c:999 +#: utils/adt/multirangetypes.c:1001 #, c-format -msgid "multirange values cannot contain NULL members" -msgstr "" +msgid "multirange values cannot contain null members" +msgstr "valores de multirango no pueden contener miembros nulos" #: utils/adt/multirangetypes.c:1349 -#, fuzzy, c-format -#| msgid "%s must be called inside a transaction" +#, c-format msgid "range_agg must be called with a range" -msgstr "%s no debe ser ejecutado dentro de una transacción" +msgstr "range_agg debe ser ejecutado con un rango" #: utils/adt/multirangetypes.c:1420 #, c-format msgid "range_intersect_agg must be called with a multirange" -msgstr "" +msgstr "range_intersect_agg debe ser ejecutado con un multirango" #: utils/adt/network.c:111 #, c-format @@ -24404,148 +24078,109 @@ msgstr "el resultado está fuera de rango" msgid "cannot subtract inet values of different sizes" msgstr "no se puede sustraer valores inet de distintos tamaños" -#: utils/adt/numeric.c:975 +#: utils/adt/numeric.c:967 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "el signo no es válido en el valor «numeric» externo" -#: utils/adt/numeric.c:981 +#: utils/adt/numeric.c:973 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "la escala no es válida en el valor «numeric» externo" -#: utils/adt/numeric.c:990 +#: utils/adt/numeric.c:982 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "hay un dígito no válido en el valor «numeric» externo" -#: utils/adt/numeric.c:1203 utils/adt/numeric.c:1217 +#: utils/adt/numeric.c:1195 utils/adt/numeric.c:1209 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "la precisión %d de NUMERIC debe estar entre 1 y %d" -#: utils/adt/numeric.c:1208 +#: utils/adt/numeric.c:1200 #, c-format msgid "NUMERIC scale %d must be between 0 and precision %d" msgstr "la escala de NUMERIC, %d, debe estar entre 0 y la precisión %d" -#: utils/adt/numeric.c:1226 +#: utils/adt/numeric.c:1218 #, c-format msgid "invalid NUMERIC type modifier" msgstr "modificador de tipo NUMERIC no es válido" -#: utils/adt/numeric.c:1584 +#: utils/adt/numeric.c:1576 #, c-format msgid "start value cannot be NaN" msgstr "el valor de inicio no puede ser NaN" -#: utils/adt/numeric.c:1588 -#, fuzzy, c-format -#| msgid "start value cannot be NaN" +#: utils/adt/numeric.c:1580 +#, c-format msgid "start value cannot be infinity" -msgstr "el valor de inicio no puede ser NaN" +msgstr "el valor de inicio no puede ser infinito" -#: utils/adt/numeric.c:1595 +#: utils/adt/numeric.c:1587 #, c-format msgid "stop value cannot be NaN" msgstr "el valor de término no puede ser NaN" -#: utils/adt/numeric.c:1599 -#, fuzzy, c-format -#| msgid "stop value cannot be NaN" +#: utils/adt/numeric.c:1591 +#, c-format msgid "stop value cannot be infinity" -msgstr "el valor de término no puede ser NaN" +msgstr "el valor de término no puede ser infinito" -#: utils/adt/numeric.c:1612 +#: utils/adt/numeric.c:1604 #, c-format msgid "step size cannot be NaN" msgstr "el tamaño de paso no puede ser NaN" -#: utils/adt/numeric.c:1616 -#, fuzzy, c-format -#| msgid "step size cannot be NaN" +#: utils/adt/numeric.c:1608 +#, c-format msgid "step size cannot be infinity" -msgstr "el tamaño de paso no puede ser NaN" +msgstr "el tamaño de paso no puede ser infinito" -#: utils/adt/numeric.c:3490 -#, fuzzy, c-format -#| msgid "zero raised to a negative power is undefined" +#: utils/adt/numeric.c:3489 +#, c-format msgid "factorial of a negative number is undefined" -msgstr "cero elevado a una potencia negativa es indefinido" +msgstr "el factorial de un número negativo es indefinido" -#: utils/adt/numeric.c:3500 utils/adt/numeric.c:6924 utils/adt/numeric.c:7408 -#: utils/adt/numeric.c:9783 utils/adt/numeric.c:10221 utils/adt/numeric.c:10335 -#: utils/adt/numeric.c:10408 +#: utils/adt/numeric.c:3499 utils/adt/numeric.c:6921 utils/adt/numeric.c:7394 +#: utils/adt/numeric.c:9771 utils/adt/numeric.c:10250 utils/adt/numeric.c:10376 +#: utils/adt/numeric.c:10449 #, c-format msgid "value overflows numeric format" msgstr "el valor excede el formato numeric" -#: utils/adt/numeric.c:4185 +#: utils/adt/numeric.c:4181 utils/adt/numeric.c:4261 utils/adt/numeric.c:4302 +#: utils/adt/numeric.c:4496 #, c-format -msgid "cannot convert NaN to integer" -msgstr "no se puede convertir NaN a entero" - -#: utils/adt/numeric.c:4189 -#, fuzzy, c-format -#| msgid "cannot convert infinity to numeric" -msgid "cannot convert infinity to integer" -msgstr "no se puede convertir infinito a numeric" +msgid "cannot convert NaN to %s" +msgstr "no se puede convertir NaN a %s" -#: utils/adt/numeric.c:4263 +#: utils/adt/numeric.c:4185 utils/adt/numeric.c:4265 utils/adt/numeric.c:4306 +#: utils/adt/numeric.c:4500 #, c-format -msgid "cannot convert NaN to bigint" -msgstr "no se puede convertir NaN a bigint" +msgid "cannot convert infinity to %s" +msgstr "no se puede convertir infinito a %s" -#: utils/adt/numeric.c:4267 -#, fuzzy, c-format -#| msgid "cannot convert infinity to numeric" -msgid "cannot convert infinity to bigint" -msgstr "no se puede convertir infinito a numeric" - -#: utils/adt/numeric.c:4304 +#: utils/adt/numeric.c:4509 #, c-format -msgid "cannot convert NaN to smallint" -msgstr "no se puede convertir NaN a smallint" - -#: utils/adt/numeric.c:4308 -#, fuzzy, c-format -#| msgid "cannot convert infinity to numeric" -msgid "cannot convert infinity to smallint" -msgstr "no se puede convertir infinito a numeric" - -#: utils/adt/numeric.c:4499 -#, fuzzy, c-format -#| msgid "cannot convert NaN to bigint" -msgid "cannot convert NaN to pg_lsn" -msgstr "no se puede convertir NaN a bigint" - -#: utils/adt/numeric.c:4503 -#, fuzzy, c-format -#| msgid "cannot convert infinity to numeric" -msgid "cannot convert infinity to pg_lsn" -msgstr "no se puede convertir infinito a numeric" - -#: utils/adt/numeric.c:4512 -#, fuzzy, c-format -#| msgid "bigint out of range" msgid "pg_lsn out of range" -msgstr "bigint fuera de rango" +msgstr "pg_lsn fuera de rango" -#: utils/adt/numeric.c:7492 utils/adt/numeric.c:7539 +#: utils/adt/numeric.c:7478 utils/adt/numeric.c:7525 #, c-format msgid "numeric field overflow" msgstr "desbordamiento de campo numeric" -#: utils/adt/numeric.c:7493 +#: utils/adt/numeric.c:7479 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "Un campo con precisión %d, escala %d debe redondear a un valor absoluto menor que %s%d." -#: utils/adt/numeric.c:7540 -#, fuzzy, c-format -#| msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." +#: utils/adt/numeric.c:7526 +#, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." -msgstr "Un campo con precisión %d, escala %d debe redondear a un valor absoluto menor que %s%d." +msgstr "Un campo con precisión %d, escala %d no puede contener un valor infinito." #: utils/adt/numutils.c:154 #, c-format @@ -24645,10 +24280,9 @@ msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s msgstr "Reconstruya todos los objetos afectados por este ordenamiento y ejecute ALTER COLLATION %s REFRESH VERSION, o construya PostgreSQL con la versión correcta de la biblioteca." #: utils/adt/pg_locale.c:1692 -#, fuzzy, c-format -#| msgid "could not create locale \"%s\": %m" +#, c-format msgid "could not load locale \"%s\"" -msgstr "no se pudo crear la configuración regional «%s»: %m" +msgstr "no se pudo cargar la configuración regional «%s»" #: utils/adt/pg_locale.c:1717 #, c-format @@ -24682,16 +24316,14 @@ msgid "The server's LC_CTYPE locale is probably incompatible with the database e msgstr "La configuración regional LC_CTYPE del servidor es probablemente incompatible con la codificación de la base de datos." #: utils/adt/pg_lsn.c:263 -#, fuzzy, c-format -#| msgid "cannot convert NaN to bigint" +#, c-format msgid "cannot add NaN to pg_lsn" -msgstr "no se puede convertir NaN a bigint" +msgstr "no se puede sumar NaN a bigint" #: utils/adt/pg_lsn.c:297 -#, fuzzy, c-format -#| msgid "cannot subtract infinite dates" +#, c-format msgid "cannot subtract NaN from pg_lsn" -msgstr "no se pueden restar fechas infinitas" +msgstr "no se puede restar NaN de pg_lsn" #: utils/adt/pg_upgrade_support.c:29 #, c-format @@ -24736,7 +24368,7 @@ msgstr "el resultado de la unión de rangos no sería contiguo" #: utils/adt/rangetypes.c:1214 #, c-format msgid "range_intersect_agg must be called with a range" -msgstr "" +msgstr "range_intersect_agg debe ser ejecutado con un rango" #: utils/adt/rangetypes.c:1689 #, c-format @@ -24788,16 +24420,15 @@ msgstr "Demasiadas comas." msgid "Junk after right parenthesis or bracket." msgstr "Basura después del paréntesis o corchete derecho." -#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4560 +#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4553 #, c-format msgid "regular expression failed: %s" msgstr "la expresión regular falló: %s" #: utils/adt/regexp.c:426 -#, fuzzy, c-format -#| msgid "invalid regular expression option: \"%c\"" +#, c-format msgid "invalid regular expression option: \"%.*s\"" -msgstr "opción de expresión regular no válida: «%c»" +msgstr "opción de expresión regular no válida: «%.*s»" #: utils/adt/regexp.c:836 #, c-format @@ -24831,7 +24462,7 @@ msgid "more than one operator named %s" msgstr "existe más de un operador llamado %s" #: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 -#: utils/adt/ruleutils.c:9650 utils/adt/ruleutils.c:9819 +#: utils/adt/ruleutils.c:9706 utils/adt/ruleutils.c:9875 #, c-format msgid "too many arguments" msgstr "demasiados argumentos" @@ -24843,7 +24474,7 @@ msgstr "Provea dos tipos de argumento para un operador." #: utils/adt/regproc.c:1639 utils/adt/regproc.c:1663 utils/adt/regproc.c:1764 #: utils/adt/regproc.c:1788 utils/adt/regproc.c:1890 utils/adt/regproc.c:1895 -#: utils/adt/varlena.c:3709 utils/adt/varlena.c:3714 +#: utils/adt/varlena.c:3702 utils/adt/varlena.c:3707 #, c-format msgid "invalid name syntax" msgstr "la sintaxis de nombre no es válida" @@ -24983,7 +24614,7 @@ msgstr "número de columnas erróneo: %d, se esperaban %d" #: utils/adt/rowtypes.c:574 #, c-format msgid "binary data has type %u (%s) instead of expected %u (%s) in record column %d" -msgstr "" +msgstr "los datos binarios tienen tipo %u (%s) en lugar del esperado %u (%s) en columna de registro %d" #: utils/adt/rowtypes.c:641 #, c-format @@ -25002,7 +24633,7 @@ msgstr "no se pueden comparar los tipos de columnas disímiles %s y %s en la col msgid "cannot compare record types with different numbers of columns" msgstr "no se pueden comparar registros con cantidad distinta de columnas" -#: utils/adt/ruleutils.c:5077 +#: utils/adt/ruleutils.c:5118 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "la regla «%s» tiene el tipo de evento no soportado %d" @@ -25017,7 +24648,7 @@ msgstr "la precisión de TIMESTAMP(%d)%s no debe ser negativa" msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "la precisión de TIMESTAMP(%d)%s fue reducida al máximo permitido, %d" -#: utils/adt/timestamp.c:178 utils/adt/timestamp.c:436 utils/misc/guc.c:12411 +#: utils/adt/timestamp.c:178 utils/adt/timestamp.c:436 utils/misc/guc.c:12412 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestamp fuera de rango: «%s»" @@ -25078,52 +24709,56 @@ msgstr "la precisión de interval(%d) debe estar entre %d y %d" msgid "cannot subtract infinite timestamps" msgstr "no se pueden restar timestamps infinitos" -#: utils/adt/timestamp.c:3837 utils/adt/timestamp.c:4015 -#, fuzzy, c-format -#| msgid "bigint out of range" +#: utils/adt/timestamp.c:3837 utils/adt/timestamp.c:4020 +#, c-format msgid "origin out of range" -msgstr "bigint fuera de rango" +msgstr "origen fuera de rango" -#: utils/adt/timestamp.c:3842 utils/adt/timestamp.c:4020 +#: utils/adt/timestamp.c:3842 utils/adt/timestamp.c:4025 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" -msgstr "" +msgstr "no se puede aproximar (bin) timestamps hacia intervalos que contengan meses o años" + +#: utils/adt/timestamp.c:3849 utils/adt/timestamp.c:4032 +#, c-format +msgid "stride must be greater than zero" +msgstr "el intervalo de paso (stride) debe ser mayor que cero" -#: utils/adt/timestamp.c:3973 utils/adt/timestamp.c:4610 -#: utils/adt/timestamp.c:4810 utils/adt/timestamp.c:4857 +#: utils/adt/timestamp.c:3978 utils/adt/timestamp.c:4620 +#: utils/adt/timestamp.c:4820 utils/adt/timestamp.c:4867 #, c-format msgid "timestamp units \"%s\" not supported" msgstr "las unidades de timestamp «%s» no están soportadas" -#: utils/adt/timestamp.c:3987 utils/adt/timestamp.c:4564 -#: utils/adt/timestamp.c:4867 +#: utils/adt/timestamp.c:3992 utils/adt/timestamp.c:4574 +#: utils/adt/timestamp.c:4877 #, c-format msgid "timestamp units \"%s\" not recognized" msgstr "las unidades de timestamp «%s» no son reconocidas" -#: utils/adt/timestamp.c:4161 utils/adt/timestamp.c:4605 -#: utils/adt/timestamp.c:5081 utils/adt/timestamp.c:5129 +#: utils/adt/timestamp.c:4171 utils/adt/timestamp.c:4615 +#: utils/adt/timestamp.c:5091 utils/adt/timestamp.c:5139 #, c-format msgid "timestamp with time zone units \"%s\" not supported" msgstr "las unidades de timestamp with time zone «%s» no están soportadas" -#: utils/adt/timestamp.c:4178 utils/adt/timestamp.c:4559 -#: utils/adt/timestamp.c:5138 +#: utils/adt/timestamp.c:4188 utils/adt/timestamp.c:4569 +#: utils/adt/timestamp.c:5148 #, c-format msgid "timestamp with time zone units \"%s\" not recognized" msgstr "las unidades de timestamp with time zone «%s» no son reconocidas" -#: utils/adt/timestamp.c:4336 +#: utils/adt/timestamp.c:4346 #, c-format msgid "interval units \"%s\" not supported because months usually have fractional weeks" msgstr "las unidades de intervalo «%s» no están soportadas porque los meses normalmente tienen semanas fraccionales" -#: utils/adt/timestamp.c:4342 utils/adt/timestamp.c:5261 +#: utils/adt/timestamp.c:4352 utils/adt/timestamp.c:5271 #, c-format msgid "interval units \"%s\" not supported" msgstr "las unidades de interval «%s» no están soportadas" -#: utils/adt/timestamp.c:4358 utils/adt/timestamp.c:5322 +#: utils/adt/timestamp.c:4368 utils/adt/timestamp.c:5332 #, c-format msgid "interval units \"%s\" not recognized" msgstr "las unidades de interval «%s» no son reconocidas" @@ -25153,10 +24788,10 @@ msgstr "suppress_redundant_updates_trigger: debe ser invocado «FOR EACH ROW»" msgid "gtsvector_in not implemented" msgstr "gtsvector_in no está implementado" -#: utils/adt/tsquery.c:199 +#: utils/adt/tsquery.c:199 utils/adt/tsquery_op.c:124 #, c-format -msgid "distance in phrase operator should not be greater than %d" -msgstr "distancia en operador de frases no debe ser mayor que %d" +msgid "distance in phrase operator must be an integer value between zero and %d inclusive" +msgstr "distancia en operador de frases debe ser un valor entero entre zero y %d inclusive" #: utils/adt/tsquery.c:306 utils/adt/tsquery.c:691 #: utils/adt/tsvector_parser.c:133 @@ -25199,11 +24834,6 @@ msgstr "el tsquery es demasiado grande" msgid "text-search query contains only stop words or doesn't contain lexemes, ignored" msgstr "la consulta de búsqueda en texto contiene sólo stopwords o no contiene lexemas; ignorada" -#: utils/adt/tsquery_op.c:124 -#, c-format -msgid "distance in phrase operator should be non-negative and less than %d" -msgstr "la distancia en el operador de frases debe ser no negativa y menor que %d" - #: utils/adt/tsquery_rewrite.c:321 #, c-format msgid "ts_rewrite query must return two tsquery columns" @@ -25336,16 +24966,14 @@ msgid "bit string length %d does not match type bit(%d)" msgstr "el largo de la cadena de bits %d no coincide con el tipo bit(%d)" #: utils/adt/varbit.c:234 utils/adt/varbit.c:535 -#, fuzzy, c-format -#| msgid "\"%c\" is not a valid binary digit" +#, c-format msgid "\"%.*s\" is not a valid binary digit" -msgstr "«%c» no es un dígito binario válido" +msgstr "«%.*s» no es un dígito binario válido" #: utils/adt/varbit.c:259 utils/adt/varbit.c:560 -#, fuzzy, c-format -#| msgid "\"%c\" is not a valid hexadecimal digit" +#, c-format msgid "\"%.*s\" is not a valid hexadecimal digit" -msgstr "«%c» no es un dígito hexadecimal válido" +msgstr "«%.*s» no es un dígito hexadecimal válido" #: utils/adt/varbit.c:347 utils/adt/varbit.c:652 #, c-format @@ -25357,9 +24985,9 @@ msgstr "el largo no es válido en cadena de bits externa" msgid "bit string too long for type bit varying(%d)" msgstr "la cadena de bits es demasiado larga para el tipo bit varying(%d)" -#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:897 -#: utils/adt/varlena.c:960 utils/adt/varlena.c:1117 utils/adt/varlena.c:3351 -#: utils/adt/varlena.c:3429 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:890 +#: utils/adt/varlena.c:953 utils/adt/varlena.c:1110 utils/adt/varlena.c:3344 +#: utils/adt/varlena.c:3422 #, c-format msgid "negative substring length not allowed" msgstr "no se permite un largo negativo de subcadena" @@ -25384,7 +25012,7 @@ msgstr "no se puede hacer XOR entre cadenas de bits de distintos tamaños" msgid "bit index %d out of valid range (0..%d)" msgstr "el índice de bit %d está fuera del rango válido (0..%d)" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3633 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3626 #, c-format msgid "new bit must be 0 or 1" msgstr "el nuevo bit debe ser 0 o 1" @@ -25399,114 +25027,110 @@ msgstr "el valor es demasiado largo para el tipo character(%d)" msgid "value too long for type character varying(%d)" msgstr "el valor es demasiado largo para el tipo character varying(%d)" -#: utils/adt/varchar.c:732 utils/adt/varlena.c:1523 +#: utils/adt/varchar.c:732 utils/adt/varlena.c:1516 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "no se pudo determinar qué ordenamiento usar para la comparación de cadenas" -#: utils/adt/varlena.c:1216 utils/adt/varlena.c:1963 +#: utils/adt/varlena.c:1209 utils/adt/varlena.c:1956 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "los ordenamientos no determinísticos no están soportados para búsquedas de sub-cadenas" -#: utils/adt/varlena.c:1622 utils/adt/varlena.c:1635 +#: utils/adt/varlena.c:1615 utils/adt/varlena.c:1628 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "no se pudo convertir la cadena a UTF-16: código de error %lu" -#: utils/adt/varlena.c:1650 +#: utils/adt/varlena.c:1643 #, c-format msgid "could not compare Unicode strings: %m" msgstr "no se pudieron comparar las cadenas Unicode: %m" -#: utils/adt/varlena.c:1701 utils/adt/varlena.c:2415 +#: utils/adt/varlena.c:1694 utils/adt/varlena.c:2408 #, c-format msgid "collation failed: %s" msgstr "el ordenamiento falló: %s" -#: utils/adt/varlena.c:2623 +#: utils/adt/varlena.c:2616 #, c-format msgid "sort key generation failed: %s" msgstr "la generación de la llave de ordenamiento falló: %s" -#: utils/adt/varlena.c:3517 utils/adt/varlena.c:3584 +#: utils/adt/varlena.c:3510 utils/adt/varlena.c:3577 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "el índice %d está fuera de rango [0..%d]" -#: utils/adt/varlena.c:3548 utils/adt/varlena.c:3620 +#: utils/adt/varlena.c:3541 utils/adt/varlena.c:3613 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "el índice %lld está fuera de rango, 0..%lld" -#: utils/adt/varlena.c:4656 -#, fuzzy, c-format -#| msgid "field position must be greater than zero" +#: utils/adt/varlena.c:4649 +#, c-format msgid "field position must not be zero" -msgstr "la posición del campo debe ser mayor que cero" +msgstr "la posición del campo no debe ser cero" -#: utils/adt/varlena.c:5697 +#: utils/adt/varlena.c:5690 #, c-format msgid "unterminated format() type specifier" msgstr "especificador de tipo inconcluso en format()" -#: utils/adt/varlena.c:5698 utils/adt/varlena.c:5832 utils/adt/varlena.c:5953 +#: utils/adt/varlena.c:5691 utils/adt/varlena.c:5825 utils/adt/varlena.c:5946 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Para un «%%» solo, use «%%%%»." -#: utils/adt/varlena.c:5830 utils/adt/varlena.c:5951 -#, fuzzy, c-format -#| msgid "unrecognized format() type specifier \"%c\"" +#: utils/adt/varlena.c:5823 utils/adt/varlena.c:5944 +#, c-format msgid "unrecognized format() type specifier \"%.*s\"" -msgstr "especificador de tipo no reconocido «%c» en format()" +msgstr "especificador de tipo no reconocido «%.*s» en format()" -#: utils/adt/varlena.c:5843 utils/adt/varlena.c:5900 +#: utils/adt/varlena.c:5836 utils/adt/varlena.c:5893 #, c-format msgid "too few arguments for format()" msgstr "muy pocos argumentos para format()" -#: utils/adt/varlena.c:5996 utils/adt/varlena.c:6178 +#: utils/adt/varlena.c:5989 utils/adt/varlena.c:6171 #, c-format msgid "number is out of range" msgstr "el número está fuera de rango" -#: utils/adt/varlena.c:6059 utils/adt/varlena.c:6087 +#: utils/adt/varlena.c:6052 utils/adt/varlena.c:6080 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "la conversión especifica el argumento 0, pero los argumentos se numeran desde 1" -#: utils/adt/varlena.c:6080 +#: utils/adt/varlena.c:6073 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "la posición del argumento de anchura debe terminar con «$»" -#: utils/adt/varlena.c:6125 +#: utils/adt/varlena.c:6118 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "los valores nulos no pueden ser formateados como un identificador SQL" -#: utils/adt/varlena.c:6251 +#: utils/adt/varlena.c:6244 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "la normalización Unicode sólo puede ser hecha si la codificación de servidor es UTF8" -#: utils/adt/varlena.c:6264 +#: utils/adt/varlena.c:6257 #, c-format msgid "invalid normalization form: %s" msgstr "forma de normalización no válida: %s" -#: utils/adt/varlena.c:6467 utils/adt/varlena.c:6502 utils/adt/varlena.c:6537 -#, fuzzy, c-format -#| msgid "invalid Unicode escape" +#: utils/adt/varlena.c:6460 utils/adt/varlena.c:6495 utils/adt/varlena.c:6530 +#, c-format msgid "invalid Unicode code point: %04X" -msgstr "valor de escape Unicode no válido" +msgstr "punto de código Unicode no válido: %04X" -#: utils/adt/varlena.c:6567 -#, fuzzy, c-format -#| msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." +#: utils/adt/varlena.c:6560 +#, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." -msgstr "Los escapes Unicode deben ser \\uXXXX o \\UXXXXXXXX." +msgstr "Los escapes Unicode deben ser \\XXXX, \\+XXXXXX, \\uXXXX o \\UXXXXXXXX." #: utils/adt/windowfuncs.c:243 #, c-format @@ -25713,17 +25337,17 @@ msgstr "falta la función de soporte %3$d para el tipo %4$s de la clase de opera msgid "cached plan must not change result type" msgstr "el plan almacenado no debe cambiar el tipo de resultado" -#: utils/cache/relcache.c:6213 +#: utils/cache/relcache.c:6324 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "no se pudo crear el archivo de cache de catálogos de sistema «%s»: %m" -#: utils/cache/relcache.c:6215 +#: utils/cache/relcache.c:6326 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Prosiguiendo de todas maneras, pero hay algo mal." -#: utils/cache/relcache.c:6537 +#: utils/cache/relcache.c:6648 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "no se pudo eliminar el archivo de cache «%s»: %m" @@ -25733,32 +25357,30 @@ msgstr "no se pudo eliminar el archivo de cache «%s»: %m" msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "no se puede hacer PREPARE de una transacción que ha modificado el mapeo de relaciones" -#: utils/cache/relmapper.c:761 +#: utils/cache/relmapper.c:767 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "el archivo de mapeo de relaciones «%s» contiene datos no válidos" -#: utils/cache/relmapper.c:771 +#: utils/cache/relmapper.c:777 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "el archivo de mapeo de relaciones «%s» tiene una suma de verificación incorrecta" -#: utils/cache/typcache.c:1808 utils/fmgr/funcapi.c:463 +#: utils/cache/typcache.c:1811 utils/fmgr/funcapi.c:463 #, c-format msgid "record type has not been registered" msgstr "el tipo record no ha sido registrado" #: utils/error/assert.c:39 -#, fuzzy, c-format -#| msgid "TRAP: ExceptionalCondition: bad arguments\n" +#, c-format msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" -msgstr "TRAP: ExceptionalConditions: argumentos erróneos\n" +msgstr "TRAP: ExceptionalCondition: argumentos erróneos en PID %d\n" #: utils/error/assert.c:42 -#, fuzzy, c-format -#| msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d)\n" +#, c-format msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" -msgstr "TRAP: %s(«%s», Archivo: «%s», Línea: %d)\n" +msgstr "TRAP: %s(«%s», Archivo: «%s», Línea: %d, PID: %d)\n" #: utils/error/elog.c:409 #, c-format @@ -25954,8 +25576,7 @@ msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "la versión de API %d no reconocida fue reportada por la función «%s»" #: utils/fmgr/fmgr.c:1999 -#, fuzzy, c-format -#| msgid "operator class options info is absent in function call context" +#, c-format msgid "operator class options info is absent in function call context" msgstr "la información de opciones de la clase de operadores está ausente en el contexto de llamada a función" @@ -25970,10 +25591,14 @@ msgid "could not determine actual result type for function \"%s\" declared to re msgstr "no se pudo determinar el tipo verdadero de resultado para la función «%s» declarada retornando tipo %s" #: utils/fmgr/funcapi.c:531 -#, fuzzy, c-format -#| msgid "argument declared %s is not a range type but type %s" +#, c-format msgid "argument declared %s does not contain a range type but type %s" -msgstr "el argumento declarado %s no es un tipo de rango sino tipo %s" +msgstr "el argumento declarado %s no contiene un tipo de rango sino tipo %s" + +#: utils/fmgr/funcapi.c:614 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "no se pudo encontrar un tipo de multirango para el tipo de dato %s" #: utils/fmgr/funcapi.c:1831 utils/fmgr/funcapi.c:1863 #, c-format @@ -26025,7 +25650,7 @@ msgstr "el directorio de datos «%s» tiene permisos no válidos" msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "Los permisos deberían ser u=rwx (0700) o u=rwx,g=rx (0750)." -#: utils/init/miscinit.c:645 utils/misc/guc.c:7481 +#: utils/init/miscinit.c:645 utils/misc/guc.c:7482 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "no se puede definir el parámetro «%s» dentro de una operación restringida por seguridad" @@ -26126,7 +25751,7 @@ msgstr "El archivo parece accidentalmente abandonado, pero no pudo ser eliminado msgid "could not write lock file \"%s\": %m" msgstr "no se pudo escribir el archivo de bloqueo «%s»: %m" -#: utils/init/miscinit.c:1357 utils/init/miscinit.c:1499 utils/misc/guc.c:10377 +#: utils/init/miscinit.c:1357 utils/init/miscinit.c:1499 utils/misc/guc.c:10378 #, c-format msgid "could not read from file \"%s\": %m" msgstr "no se pudo leer el archivo «%s»: %m" @@ -26172,33 +25797,29 @@ msgid "replication connection authorized: user=%s" msgstr "conexión de replicación autorizada: usuario=%s" #: utils/init/postinit.c:257 -#, fuzzy, c-format -#| msgid "replication connection authorized: user=%s" +#, c-format msgid "connection authorized: user=%s" -msgstr "conexión de replicación autorizada: usuario=%s" +msgstr "conexión autorizada: usuario=%s" #: utils/init/postinit.c:260 -#, fuzzy, c-format -#| msgid "database %s" +#, c-format msgid " database=%s" -msgstr "base de datos %s" +msgstr " base_de_datos=%s" #: utils/init/postinit.c:263 -#, fuzzy, c-format -#| msgid "publication_name" +#, c-format msgid " application_name=%s" -msgstr "nombre_de_publicación" +msgstr " nombre_de_aplicación=%s" #: utils/init/postinit.c:268 -#, fuzzy, c-format -#| msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" +#, c-format msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" -msgstr "Conexión SSL (protocolo: %s, cifrado: %s, bits: %s, compresión: %s)\n" +msgstr " SSL habilitado (protocolo=%s, cifrado=%s, bits=%d)" #: utils/init/postinit.c:280 #, c-format msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" -msgstr "" +msgstr " GSS (autenticado=%s, cifrado=%s, principal=%s)" #: utils/init/postinit.c:281 utils/init/postinit.c:282 #: utils/init/postinit.c:287 utils/init/postinit.c:288 @@ -26213,7 +25834,7 @@ msgstr "sí" #: utils/init/postinit.c:286 #, c-format msgid " GSS (authenticated=%s, encrypted=%s)" -msgstr "" +msgstr " GSS (autenticado=%s, cifrado=%s)" #: utils/init/postinit.c:323 #, c-format @@ -26369,10 +25990,9 @@ msgid "invalid byte value for encoding \"%s\": 0x%02x" msgstr "byte no válido para codificación «%s»: 0x%02x" #: utils/mb/mbutils.c:877 -#, fuzzy, c-format -#| msgid "invalid Unicode escape" +#, c-format msgid "invalid Unicode code point" -msgstr "valor de escape Unicode no válido" +msgstr "punto de código Unicode no válido" #: utils/mb/mbutils.c:1146 #, c-format @@ -26458,10 +26078,8 @@ msgid "Replication / Sending Servers" msgstr "Replicación / Servidores de Envío" #: utils/misc/guc.c:752 -#, fuzzy -#| msgid "Replication / Master Server" msgid "Replication / Primary Server" -msgstr "Replicación / Servidor Maestro" +msgstr "Replicación / Servidor Primario" #: utils/misc/guc.c:754 msgid "Replication / Standby Servers" @@ -26489,7 +26107,7 @@ msgstr "Afinamiento de Consultas / Otras Opciones del Planner" #: utils/misc/guc.c:766 msgid "Reporting and Logging / Where to Log" -msgstr "Reporte y Registro / Cuándo Registrar" +msgstr "Reporte y Registro / Dónde Registrar" #: utils/misc/guc.c:768 msgid "Reporting and Logging / When to Log" @@ -26500,10 +26118,8 @@ msgid "Reporting and Logging / What to Log" msgstr "Reporte y Registro / Qué Registrar" #: utils/misc/guc.c:772 -#, fuzzy -#| msgid "Reporting and Logging / Where to Log" msgid "Reporting and Logging / Process Title" -msgstr "Reporte y Registro / Cuándo Registrar" +msgstr "Reporte y Registro / Título del Proceso" #: utils/misc/guc.c:774 msgid "Statistics / Monitoring" @@ -26594,10 +26210,8 @@ msgid "Enables the planner's use of explicit sort steps." msgstr "Permitir el uso de pasos explícitos de ordenamiento." #: utils/misc/guc.c:1017 -#, fuzzy -#| msgid "Enables the planner's use of explicit sort steps." msgid "Enables the planner's use of incremental sort steps." -msgstr "Permitir el uso de pasos explícitos de ordenamiento." +msgstr "Permitir el uso de pasos incrementales de ordenamiento." #: utils/misc/guc.c:1026 msgid "Enables the planner's use of hashed aggregation plans." @@ -26608,10 +26222,8 @@ msgid "Enables the planner's use of materialization." msgstr "Permitir el uso de materialización de planes." #: utils/misc/guc.c:1046 -#, fuzzy -#| msgid "Enables the planner's use of parallel hash plans." -msgid "Enables the planner's use of result caching." -msgstr "Permitir el uso de planes «hash join» paralelos." +msgid "Enables the planner's use of memoization." +msgstr "Permitir el uso de memoización de planes." #: utils/misc/guc.c:1056 msgid "Enables the planner's use of nested-loop join plans." @@ -26646,8 +26258,6 @@ msgid "Enables the planner's use of parallel hash plans." msgstr "Permitir el uso de planes «hash join» paralelos." #: utils/misc/guc.c:1136 -#, fuzzy -#| msgid "Enables plan-time and run-time partition pruning." msgid "Enables plan-time and execution-time partition pruning." msgstr "Permitir el uso de poda de particiones en tiempo de plan y ejecución." @@ -26656,10 +26266,8 @@ msgid "Allows the query planner and executor to compare partition bounds to cond msgstr "Permite al optimizador de consultas y al ejecutor a comparar bordes de particiones a condiciones en las consultas para determinar qué particiones deben recorrerse." #: utils/misc/guc.c:1148 -#, fuzzy -#| msgid "Enables the planner's use of parallel append plans." msgid "Enables the planner's use of async append plans." -msgstr "Permitir el uso de planes «append» paralelos." +msgstr "Permitir el uso de planes «append» asíncronos." #: utils/misc/guc.c:1158 msgid "Enables genetic query optimization." @@ -26718,16 +26326,12 @@ msgid "Detection of a damaged page header normally causes PostgreSQL to report a msgstr "La detección de un encabezado de página dañado normalmente hace que PostgreSQL reporte un error, abortando la transacción en curso. Definiendo zero_damaged_pages a true hace que el sistema reporte un mensaje de warning, escriba ceros en toda la página, y continúe el procesamiento. Este comportamiento destruirá datos; en particular, todas las tuplas en la página dañada." #: utils/misc/guc.c:1266 -#, fuzzy -#| msgid "Continues processing after a checksum failure." msgid "Continues recovery after an invalid pages failure." -msgstr "Continuar procesando después de una falla de suma de verificación." +msgstr "Continuar procesando después de una falla de páginas no válidas." #: utils/misc/guc.c:1267 -#, fuzzy -#| msgid "Detection of a checksum failure normally causes PostgreSQL to report an error, aborting the current transaction. Setting ignore_checksum_failure to true causes the system to ignore the failure (but still report a warning), and continue processing. This behavior could cause crashes or other serious problems. Only has an effect if checksums are enabled." msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting ignore_invalid_pages to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." -msgstr "La detección de una suma de verificación que no coincide normalmente hace que PostgreSQL reporte un error, abortando la transacción en curso. Definiendo ignore_checksum_failure a true hace que el sistema ignore la falla (pero aún así reporta un mensaje de warning), y continúe el procesamiento. Este comportamiento podría causar caídas del sistema u otros problemas serios. Sólo tiene efecto si las sumas de verificación están activadas." +msgstr "La detección de que registros de WAL tengan referencias a páginas no válidas durante la recuperación hace que PostgreSQL produzca un error de nivel PANIC, abortando la recuperación. Establecer el valor de ignore_invalid_pages a true hace que el sistema ignore las referencias a páginas no válidas en registros de WAL (pero aún así reporta un mensaje de warning), y continúe la recuperación. Este comportamiento podría causar caídas del sistema, pérdida de datos, propagar u ocultar corrupción, u otros problemas serios. Sólo tiene efecto durante la recuperación o en modo standby." #: utils/misc/guc.c:1285 msgid "Writes full pages to WAL when first modified after a checkpoint." @@ -26738,10 +26342,8 @@ msgid "A page write in process during an operating system crash might be only pa msgstr "Una escritura de página que está siendo procesada durante una caída del sistema operativo puede ser completada sólo parcialmente. Durante la recuperación, los cambios de registros (tuplas) almacenados en WAL no son suficientes para la recuperación. Esta opción activa la escritura de las páginas a WAL cuando son modificadas por primera vez después de un punto de control, de manera que una recuperación total es posible." #: utils/misc/guc.c:1299 -#, fuzzy -#| msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modifications." msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." -msgstr "Escribir páginas completas a WAL cuando son modificadas después de un punto de control, incluso para modificaciones no críticas." +msgstr "Escribir páginas completas al WAL cuando son modificadas después de un punto de control, incluso para una modificación no crítica." #: utils/misc/guc.c:1309 msgid "Compresses full-page writes written in WAL file." @@ -26784,1600 +26386,1525 @@ msgid "Reinitialize server after backend crash." msgstr "Reinicializar el servidor después de una caída de un proceso servidor." #: utils/misc/guc.c:1408 -#, fuzzy -#| msgid "Reinitialize server after backend crash." msgid "Remove temporary files after backend crash." -msgstr "Reinicializar el servidor después de una caída de un proceso servidor." +msgstr "Eliminar archivos temporales después de una caída de un proceso servidor." -#: utils/misc/guc.c:1418 +#: utils/misc/guc.c:1419 msgid "Logs the duration of each completed SQL statement." msgstr "Registrar la duración de cada sentencia SQL ejecutada." -#: utils/misc/guc.c:1427 +#: utils/misc/guc.c:1428 msgid "Logs each query's parse tree." msgstr "Registrar cada arbol analizado de consulta " -#: utils/misc/guc.c:1436 +#: utils/misc/guc.c:1437 msgid "Logs each query's rewritten parse tree." msgstr "Registrar cada reescritura del arból analizado de consulta" -#: utils/misc/guc.c:1445 +#: utils/misc/guc.c:1446 msgid "Logs each query's execution plan." msgstr "Registrar el plan de ejecución de cada consulta." -#: utils/misc/guc.c:1454 +#: utils/misc/guc.c:1455 msgid "Indents parse and plan tree displays." msgstr "Indentar los árboles de parse y plan." -#: utils/misc/guc.c:1463 +#: utils/misc/guc.c:1464 msgid "Writes parser performance statistics to the server log." msgstr "Escribir estadísticas de parser al registro del servidor." -#: utils/misc/guc.c:1472 +#: utils/misc/guc.c:1473 msgid "Writes planner performance statistics to the server log." msgstr "Escribir estadísticas de planner al registro del servidor." -#: utils/misc/guc.c:1481 +#: utils/misc/guc.c:1482 msgid "Writes executor performance statistics to the server log." msgstr "Escribir estadísticas del executor al registro del servidor." -#: utils/misc/guc.c:1490 +#: utils/misc/guc.c:1491 msgid "Writes cumulative performance statistics to the server log." msgstr "Escribir estadísticas acumulativas al registro del servidor." -#: utils/misc/guc.c:1500 +#: utils/misc/guc.c:1501 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "Registrar uso de recursos de sistema (memoria y CPU) en varias operaciones B-tree." -#: utils/misc/guc.c:1512 +#: utils/misc/guc.c:1513 msgid "Collects information about executing commands." msgstr "Recolectar estadísticas sobre órdenes en ejecución." -#: utils/misc/guc.c:1513 +#: utils/misc/guc.c:1514 msgid "Enables the collection of information on the currently executing command of each session, along with the time at which that command began execution." msgstr "Activa la recolección de información sobre la orden actualmente en ejecución en cada sesión, junto con el momento en el cual esa orden comenzó la ejecución." -#: utils/misc/guc.c:1523 +#: utils/misc/guc.c:1524 msgid "Collects statistics on database activity." msgstr "Recolectar estadísticas de actividad de la base de datos." -#: utils/misc/guc.c:1532 +#: utils/misc/guc.c:1533 msgid "Collects timing statistics for database I/O activity." msgstr "Recolectar estadísticas de tiempos en las operaciones de I/O de la base de datos." -#: utils/misc/guc.c:1541 -#, fuzzy -#| msgid "Collects timing statistics for database I/O activity." +#: utils/misc/guc.c:1542 msgid "Collects timing statistics for WAL I/O activity." -msgstr "Recolectar estadísticas de tiempos en las operaciones de I/O de la base de datos." +msgstr "Recolectar estadísticas de tiempos en las operaciones de I/O del WAL." -#: utils/misc/guc.c:1551 +#: utils/misc/guc.c:1552 msgid "Updates the process title to show the active SQL command." msgstr "Actualiza el título del proceso para mostrar la orden SQL activo." -#: utils/misc/guc.c:1552 +#: utils/misc/guc.c:1553 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "Habilita que se actualice el título del proceso cada vez que una orden SQL es recibido por el servidor." -#: utils/misc/guc.c:1565 +#: utils/misc/guc.c:1566 msgid "Starts the autovacuum subprocess." msgstr "Iniciar el subproceso de autovacuum." -#: utils/misc/guc.c:1575 +#: utils/misc/guc.c:1576 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Generar salida de depuración para LISTEN y NOTIFY." -#: utils/misc/guc.c:1587 +#: utils/misc/guc.c:1588 msgid "Emits information about lock usage." msgstr "Emitir información acerca del uso de locks." -#: utils/misc/guc.c:1597 +#: utils/misc/guc.c:1598 msgid "Emits information about user lock usage." msgstr "Emitir información acerca del uso de locks de usuario." -#: utils/misc/guc.c:1607 +#: utils/misc/guc.c:1608 msgid "Emits information about lightweight lock usage." msgstr "Emitir información acerca del uso de «lightweight locks»." -#: utils/misc/guc.c:1617 +#: utils/misc/guc.c:1618 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "Volcar información acerca de los locks existentes cuando se agota el tiempo de deadlock." -#: utils/misc/guc.c:1629 +#: utils/misc/guc.c:1630 msgid "Logs long lock waits." msgstr "Registrar esperas largas de bloqueos." -#: utils/misc/guc.c:1638 -#, fuzzy -#| msgid "abort reason: recovery conflict" +#: utils/misc/guc.c:1639 msgid "Logs standby recovery conflict waits." -msgstr "razón para abortar: conflicto en la recuperación" +msgstr "Registrar esperas por conflictos en recuperación de standby" -#: utils/misc/guc.c:1647 +#: utils/misc/guc.c:1648 msgid "Logs the host name in the connection logs." msgstr "Registrar el nombre del host en la conexión." -#: utils/misc/guc.c:1648 +#: utils/misc/guc.c:1649 msgid "By default, connection logs only show the IP address of the connecting host. If you want them to show the host name you can turn this on, but depending on your host name resolution setup it might impose a non-negligible performance penalty." msgstr "Por omisión, los registros de conexión sólo muestran la dirección IP del host que establece la conexión. Si desea que se despliegue el nombre del host puede activar esta opción, pero dependiendo de su configuración de resolución de nombres esto puede imponer una penalización de rendimiento no despreciable." -#: utils/misc/guc.c:1659 +#: utils/misc/guc.c:1660 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Tratar expr=NULL como expr IS NULL." -#: utils/misc/guc.c:1660 +#: utils/misc/guc.c:1661 msgid "When turned on, expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL, that is, they return true if expr evaluates to the null value, and false otherwise. The correct behavior of expr = NULL is to always return null (unknown)." msgstr "Cuando está activado, expresiones de la forma expr = NULL (o NULL = expr) son tratadas como expr IS NULL, esto es, retornarán verdadero si expr es evaluada al valor nulo, y falso en caso contrario. El comportamiento correcto de expr = NULL es retornar siempre null (desconocido)." -#: utils/misc/guc.c:1672 +#: utils/misc/guc.c:1673 msgid "Enables per-database user names." msgstr "Activar el uso de nombre de usuario locales a cada base de datos." -#: utils/misc/guc.c:1681 +#: utils/misc/guc.c:1682 msgid "Sets the default read-only status of new transactions." msgstr "Estado por omisión de sólo lectura de nuevas transacciones." -#: utils/misc/guc.c:1691 +#: utils/misc/guc.c:1692 msgid "Sets the current transaction's read-only status." msgstr "Activa el estado de sólo lectura de la transacción en curso." -#: utils/misc/guc.c:1701 +#: utils/misc/guc.c:1702 msgid "Sets the default deferrable status of new transactions." msgstr "Estado por omisión de postergable de nuevas transacciones." -#: utils/misc/guc.c:1710 +#: utils/misc/guc.c:1711 msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." msgstr "Si está activo, las transacciones serializables de sólo lectura serán pausadas hasta que puedan ejecutarse sin posibles fallas de serialización." -#: utils/misc/guc.c:1720 +#: utils/misc/guc.c:1721 msgid "Enable row security." msgstr "Activar seguridad de registros." -#: utils/misc/guc.c:1721 +#: utils/misc/guc.c:1722 msgid "When enabled, row security will be applied to all users." msgstr "Cuando está activada, la seguridad de registros se aplicará a todos los usuarios." -#: utils/misc/guc.c:1729 -#, fuzzy -#| msgid "Check function bodies during CREATE FUNCTION." +#: utils/misc/guc.c:1730 msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." -msgstr "Verificar definición de funciones durante CREATE FUNCTION." +msgstr "Verificar definición de rutinas durante CREATE FUNCTION y CREATE PROCEDURE." -#: utils/misc/guc.c:1738 +#: utils/misc/guc.c:1739 msgid "Enable input of NULL elements in arrays." msgstr "Habilita el ingreso de elementos nulos en arrays." -#: utils/misc/guc.c:1739 +#: utils/misc/guc.c:1740 msgid "When turned on, unquoted NULL in an array input value means a null value; otherwise it is taken literally." msgstr "Cuando está activo, un valor NULL sin comillas en la entrada de un array significa un valor nulo; en caso contrario es tomado literalmente." -#: utils/misc/guc.c:1755 +#: utils/misc/guc.c:1756 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS ya no está soportado; esto sólo puede ser false." -#: utils/misc/guc.c:1765 +#: utils/misc/guc.c:1766 msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "Lanzar un subproceso para capturar stderr y/o logs CSV en archivos de log." -#: utils/misc/guc.c:1774 +#: utils/misc/guc.c:1775 msgid "Truncate existing log files of same name during log rotation." msgstr "Truncar archivos de log del mismo nombre durante la rotación." -#: utils/misc/guc.c:1785 +#: utils/misc/guc.c:1786 msgid "Emit information about resource usage in sorting." msgstr "Emitir información acerca de uso de recursos durante los ordenamientos." -#: utils/misc/guc.c:1799 +#: utils/misc/guc.c:1800 msgid "Generate debugging output for synchronized scanning." msgstr "Generar salida de depuración para recorrido sincronizado." -#: utils/misc/guc.c:1814 +#: utils/misc/guc.c:1815 msgid "Enable bounded sorting using heap sort." msgstr "Activar ordenamiento acotado usando «heap sort»." -#: utils/misc/guc.c:1827 +#: utils/misc/guc.c:1828 msgid "Emit WAL-related debugging output." msgstr "Activar salida de depuración de WAL." -#: utils/misc/guc.c:1839 -#, fuzzy -#| msgid "Datetimes are integer based." +#: utils/misc/guc.c:1840 msgid "Shows whether datetimes are integer based." -msgstr "Las fechas y horas se basan en tipos enteros." +msgstr "Mostrar si las fechas y horas se basan en tipos enteros." -#: utils/misc/guc.c:1850 +#: utils/misc/guc.c:1851 msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgstr "Define que los nombres de usuario Kerberos y GSSAPI deberían ser tratados sin distinción de mayúsculas." -#: utils/misc/guc.c:1860 +#: utils/misc/guc.c:1861 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Avisa acerca de escapes de backslash en literales de cadena corrientes." -#: utils/misc/guc.c:1870 +#: utils/misc/guc.c:1871 msgid "Causes '...' strings to treat backslashes literally." msgstr "Provoca que las cadenas '...' traten las barras inclinadas inversas (\\) en forma literal." -#: utils/misc/guc.c:1881 +#: utils/misc/guc.c:1882 msgid "Enable synchronized sequential scans." msgstr "Permitir la sincronización de recorridos secuenciales." -#: utils/misc/guc.c:1891 +#: utils/misc/guc.c:1892 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "Define si incluir o excluir la transacción con el destino de recuperación." -#: utils/misc/guc.c:1901 +#: utils/misc/guc.c:1902 msgid "Allows connections and queries during recovery." msgstr "Permite conexiones y consultas durante la recuperación." -#: utils/misc/guc.c:1911 +#: utils/misc/guc.c:1912 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "Permite retroalimentación desde un hot standby hacia el primario que evitará conflictos en consultas." -#: utils/misc/guc.c:1921 +#: utils/misc/guc.c:1922 msgid "Shows whether hot standby is currently active." -msgstr "" +msgstr "Muestra si hot standby está activo actualmente." -#: utils/misc/guc.c:1932 +#: utils/misc/guc.c:1933 msgid "Allows modifications of the structure of system tables." msgstr "Permite modificaciones de la estructura de las tablas del sistema." -#: utils/misc/guc.c:1943 +#: utils/misc/guc.c:1944 msgid "Disables reading from system indexes." msgstr "Deshabilita lectura de índices del sistema." -#: utils/misc/guc.c:1944 +#: utils/misc/guc.c:1945 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "No evita la actualización de índices, así que es seguro. Lo peor que puede ocurrir es lentitud del sistema." -#: utils/misc/guc.c:1955 +#: utils/misc/guc.c:1956 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "Activa el modo de compatibilidad con versiones anteriores de las comprobaciones de privilegios de objetos grandes." -#: utils/misc/guc.c:1956 +#: utils/misc/guc.c:1957 msgid "Skips privilege checks when reading or modifying large objects, for compatibility with PostgreSQL releases prior to 9.0." msgstr "Omite las comprobaciones de privilegios cuando se leen o modifican los objetos grandes, para compatibilidad con versiones de PostgreSQL anteriores a 9.0." -#: utils/misc/guc.c:1966 +#: utils/misc/guc.c:1967 msgid "When generating SQL fragments, quote all identifiers." msgstr "Al generar fragmentos SQL, entrecomillar todos los identificadores." -#: utils/misc/guc.c:1976 +#: utils/misc/guc.c:1977 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Indica si las sumas de verificación están activas en este cluster." -#: utils/misc/guc.c:1987 +#: utils/misc/guc.c:1988 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "Agregar número de secuencia a mensajes syslog para evitar supresión de duplicados." -#: utils/misc/guc.c:1997 +#: utils/misc/guc.c:1998 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "Dividir mensajes enviados a syslog en líneas y que quepan en 1024 bytes." -#: utils/misc/guc.c:2007 +#: utils/misc/guc.c:2008 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "Controla si los Gather y Gather Merge también ejecutan subplanes." -#: utils/misc/guc.c:2008 -#, fuzzy -#| msgid "Should gather nodes also run subplans, or just gather tuples?" +#: utils/misc/guc.c:2009 msgid "Should gather nodes also run subplans or just gather tuples?" -msgstr "¿Deben los nodos de recolección ejecutar subplanes, o sólo recolectar tuplas?" +msgstr "¿Deben los nodos de recolección ejecutar subplanes o sólo recolectar tuplas?" -#: utils/misc/guc.c:2018 +#: utils/misc/guc.c:2019 msgid "Allow JIT compilation." msgstr "Permitir compilación JIT." -#: utils/misc/guc.c:2029 -#, fuzzy -#| msgid "Register JIT compiled function with debugger." +#: utils/misc/guc.c:2030 msgid "Register JIT-compiled functions with debugger." -msgstr "Registra la función JIT compilada con el depurador." +msgstr "Registrar las funciones JIT compiladas con el depurador." -#: utils/misc/guc.c:2046 +#: utils/misc/guc.c:2047 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "Escribe el bitcode LLVM para facilitar depuración de JIT." -#: utils/misc/guc.c:2057 +#: utils/misc/guc.c:2058 msgid "Allow JIT compilation of expressions." msgstr "Permitir compilación JIT de expresiones." -#: utils/misc/guc.c:2068 -#, fuzzy -#| msgid "Register JIT compiled function with perf profiler." +#: utils/misc/guc.c:2069 msgid "Register JIT-compiled functions with perf profiler." -msgstr "Registrar funciones JIT-compiladas con el analizador «perf»." +msgstr "Registrar las funciones JIT compiladas con el analizador «perf»." -#: utils/misc/guc.c:2085 +#: utils/misc/guc.c:2086 msgid "Allow JIT compilation of tuple deforming." msgstr "Permitir compilación JIT de deformación de tuplas." -#: utils/misc/guc.c:2096 +#: utils/misc/guc.c:2097 msgid "Whether to continue running after a failure to sync data files." msgstr "Si continuar ejecutando después de una falla al sincronizar archivos de datos." -#: utils/misc/guc.c:2105 +#: utils/misc/guc.c:2106 msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." msgstr "Definir si un receptor de WAL debe crear un slot de replicación temporal en caso de no haber configurado un slot permanente." -#: utils/misc/guc.c:2123 +#: utils/misc/guc.c:2124 msgid "Forces a switch to the next WAL file if a new file has not been started within N seconds." msgstr "Fuerza a que utilizar el siguiente archivo de WAL si no se ha comenzado un nuevo archivo de WAL dentro de N segundos." -#: utils/misc/guc.c:2134 +#: utils/misc/guc.c:2135 msgid "Waits N seconds on connection startup after authentication." msgstr "Espera N segundos al inicio de la conexión después de la autentificación." -#: utils/misc/guc.c:2135 utils/misc/guc.c:2733 +#: utils/misc/guc.c:2136 utils/misc/guc.c:2734 msgid "This allows attaching a debugger to the process." msgstr "Esto permite adjuntar un depurador al proceso." -#: utils/misc/guc.c:2144 +#: utils/misc/guc.c:2145 msgid "Sets the default statistics target." msgstr "Definir el valor por omisión de toma de estadísticas." -#: utils/misc/guc.c:2145 +#: utils/misc/guc.c:2146 msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." msgstr "Esto se aplica a columnas de tablas que no tienen un valor definido a través de ALTER TABLE SET STATISTICS." -#: utils/misc/guc.c:2154 +#: utils/misc/guc.c:2155 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "Tamaño de lista de FROM a partir del cual subconsultas no serán colapsadas." -#: utils/misc/guc.c:2156 +#: utils/misc/guc.c:2157 msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." msgstr "El planner mezclará subconsultas en consultas de nivel superior si la lista FROM resultante es menor que esta cantidad de ítems." -#: utils/misc/guc.c:2167 +#: utils/misc/guc.c:2168 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "Tamaño de lista de FROM a partir del cual constructos JOIN no serán aplanados." -#: utils/misc/guc.c:2169 +#: utils/misc/guc.c:2170 msgid "The planner will flatten explicit JOIN constructs into lists of FROM items whenever a list of no more than this many items would result." msgstr "El planner aplanará constructos JOIN explícitos en listas de ítems FROM siempre que la lista resultante no tenga más que esta cantidad de ítems." -#: utils/misc/guc.c:2180 +#: utils/misc/guc.c:2181 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "Umbral de ítems en FROM a partir del cual se usará GEQO." -#: utils/misc/guc.c:2190 +#: utils/misc/guc.c:2191 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: effort se usa para determinar los valores por defecto para otros parámetros." -#: utils/misc/guc.c:2200 +#: utils/misc/guc.c:2201 msgid "GEQO: number of individuals in the population." msgstr "GEQO: número de individuos en una población." -#: utils/misc/guc.c:2201 utils/misc/guc.c:2211 +#: utils/misc/guc.c:2202 utils/misc/guc.c:2212 msgid "Zero selects a suitable default value." msgstr "Cero selecciona un valor por omisión razonable." -#: utils/misc/guc.c:2210 +#: utils/misc/guc.c:2211 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: número de iteraciones del algoritmo." -#: utils/misc/guc.c:2222 +#: utils/misc/guc.c:2223 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Define el tiempo a esperar un lock antes de buscar un deadlock." -#: utils/misc/guc.c:2233 +#: utils/misc/guc.c:2234 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "Define el máximo retardo antes de cancelar consultas cuando un servidor hot standby está procesando datos de WAL archivado." -#: utils/misc/guc.c:2244 +#: utils/misc/guc.c:2245 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "Define el máximo retardo antes de cancelar consultas cuando un servidor hot standby está procesando datos de WAL en flujo." -#: utils/misc/guc.c:2255 +#: utils/misc/guc.c:2256 msgid "Sets the minimum delay for applying changes during recovery." msgstr "Define el retraso mínimo para aplicar cambios durante la recuperación." -#: utils/misc/guc.c:2266 +#: utils/misc/guc.c:2267 msgid "Sets the maximum interval between WAL receiver status reports to the sending server." msgstr "Define el intervalo máximo entre reportes de estado que el receptor de WAL envía al servidor origen." -#: utils/misc/guc.c:2277 +#: utils/misc/guc.c:2278 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "Define el máximo tiempo de espera para recibir datos desde el servidor origen." -#: utils/misc/guc.c:2288 +#: utils/misc/guc.c:2289 msgid "Sets the maximum number of concurrent connections." msgstr "Número máximo de conexiones concurrentes." -#: utils/misc/guc.c:2299 +#: utils/misc/guc.c:2300 msgid "Sets the number of connection slots reserved for superusers." msgstr "Número de conexiones reservadas para superusuarios." -#: utils/misc/guc.c:2309 -#, fuzzy -#| msgid "could not map dynamic shared memory segment" +#: utils/misc/guc.c:2310 msgid "Amount of dynamic shared memory reserved at startup." -msgstr "no se pudo mapear el segmento de memoria compartida dinámica" +msgstr "Cantidad de memoria compartida dinámica reservada al iniciar." -#: utils/misc/guc.c:2324 +#: utils/misc/guc.c:2325 msgid "Sets the number of shared memory buffers used by the server." msgstr "Número de búfers de memoria compartida usados por el servidor." -#: utils/misc/guc.c:2335 +#: utils/misc/guc.c:2336 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Número de búfers de memoria temporal usados por cada sesión." -#: utils/misc/guc.c:2346 +#: utils/misc/guc.c:2347 msgid "Sets the TCP port the server listens on." msgstr "Puerto TCP en el cual escuchará el servidor." -#: utils/misc/guc.c:2356 +#: utils/misc/guc.c:2357 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Privilegios de acceso al socket Unix." -#: utils/misc/guc.c:2357 +#: utils/misc/guc.c:2358 msgid "Unix-domain sockets use the usual Unix file system permission set. The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Los sockets de dominio Unix usan la funcionalidad de permisos de archivos estándar de Unix. Se espera que el valor de esta opción sea una especificación numérica de modo, en la forma aceptada por las llamadas a sistema chmod y umask. Para usar el modo octal acostumbrado, comience el número con un 0 (cero)." -#: utils/misc/guc.c:2371 +#: utils/misc/guc.c:2372 msgid "Sets the file permissions for log files." msgstr "Define los privilegios para los archivos del registro del servidor." -#: utils/misc/guc.c:2372 +#: utils/misc/guc.c:2373 msgid "The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Se espera que el valor de esta opción sea una especificación numérica de modo, en la forma aceptada por las llamadas a sistema chmod y umask. Para usar el modo octal acostumbrado, comience el número con un 0 (cero)." -#: utils/misc/guc.c:2386 -#, fuzzy -#| msgid "Mode of the data directory." +#: utils/misc/guc.c:2387 msgid "Shows the mode of the data directory." -msgstr "Modo del directorio de datos." +msgstr "Muestra el modo del directorio de datos." -#: utils/misc/guc.c:2387 +#: utils/misc/guc.c:2388 msgid "The parameter value is a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "El valor del parámetro es una especificación numérica de modo, en la forma aceptada por las llamadas a sistema chmod y umask. (Para usar el modo octal acostumbrado, comience el número con un 0 (cero).)" -#: utils/misc/guc.c:2400 +#: utils/misc/guc.c:2401 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Establece el límite de memoria que se usará para espacios de trabajo de consultas." -#: utils/misc/guc.c:2401 +#: utils/misc/guc.c:2402 msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." msgstr "Esta es la cantidad máxima de memoria que se usará para operaciones internas de ordenamiento y tablas de hashing, antes de comenzar a usar archivos temporales en disco." -#: utils/misc/guc.c:2413 +#: utils/misc/guc.c:2414 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Establece el límite de memoria que se usará para operaciones de mantención." -#: utils/misc/guc.c:2414 +#: utils/misc/guc.c:2415 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Esto incluye operaciones como VACUUM y CREATE INDEX." -#: utils/misc/guc.c:2424 -#, fuzzy -#| msgid "Sets the maximum memory to be used for maintenance operations." +#: utils/misc/guc.c:2425 msgid "Sets the maximum memory to be used for logical decoding." -msgstr "Establece el límite de memoria que se usará para operaciones de mantención." +msgstr "Establece el límite de memoria que se usará para decodificación lógica." -#: utils/misc/guc.c:2425 -#, fuzzy -#| msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." +#: utils/misc/guc.c:2426 msgid "This much memory can be used by each internal reorder buffer before spilling to disk." -msgstr "Esta es la cantidad máxima de memoria que se usará para operaciones internas de ordenamiento y tablas de hashing, antes de comenzar a usar archivos temporales en disco." +msgstr "Esta es la cantidad máxima de memoria que puede ser usada para cada búfer interno de ordenamiento, antes de comenzar a usar disco." -#: utils/misc/guc.c:2441 +#: utils/misc/guc.c:2442 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Establece el tamaño máximo del stack, en kilobytes." -#: utils/misc/guc.c:2452 +#: utils/misc/guc.c:2453 msgid "Limits the total size of all temporary files used by each process." msgstr "Limita el tamaño total de todos los archivos temporales usados en cada proceso." -#: utils/misc/guc.c:2453 +#: utils/misc/guc.c:2454 msgid "-1 means no limit." msgstr "-1 significa sin límite." -#: utils/misc/guc.c:2463 +#: utils/misc/guc.c:2464 msgid "Vacuum cost for a page found in the buffer cache." msgstr "Costo de Vacuum de una página encontrada en el buffer." -#: utils/misc/guc.c:2473 +#: utils/misc/guc.c:2474 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "Costo de Vacuum de una página no encontrada en el cache." -#: utils/misc/guc.c:2483 +#: utils/misc/guc.c:2484 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Costo de Vacuum de una página ensuciada por vacuum." -#: utils/misc/guc.c:2493 +#: utils/misc/guc.c:2494 msgid "Vacuum cost amount available before napping." msgstr "Costo de Vacuum disponible antes de descansar." -#: utils/misc/guc.c:2503 +#: utils/misc/guc.c:2504 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Costo de Vacuum disponible antes de descansar, para autovacuum." -#: utils/misc/guc.c:2513 +#: utils/misc/guc.c:2514 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "Define la cantidad máxima de archivos abiertos por cada subproceso." -#: utils/misc/guc.c:2526 +#: utils/misc/guc.c:2527 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Define la cantidad máxima de transacciones preparadas simultáneas." -#: utils/misc/guc.c:2537 +#: utils/misc/guc.c:2538 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Define el OID mínimo para hacer seguimiento de locks." -#: utils/misc/guc.c:2538 +#: utils/misc/guc.c:2539 msgid "Is used to avoid output on system tables." msgstr "Se usa para evitar salida excesiva por tablas de sistema." -#: utils/misc/guc.c:2547 +#: utils/misc/guc.c:2548 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Define el OID de una tabla con trazado incondicional de locks." -#: utils/misc/guc.c:2559 +#: utils/misc/guc.c:2560 msgid "Sets the maximum allowed duration of any statement." msgstr "Define la duración máxima permitida de sentencias." -#: utils/misc/guc.c:2560 utils/misc/guc.c:2571 utils/misc/guc.c:2582 -#: utils/misc/guc.c:2593 +#: utils/misc/guc.c:2561 utils/misc/guc.c:2572 utils/misc/guc.c:2583 +#: utils/misc/guc.c:2594 msgid "A value of 0 turns off the timeout." msgstr "Un valor de 0 desactiva el máximo." -#: utils/misc/guc.c:2570 +#: utils/misc/guc.c:2571 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Define la duración máxima permitida de cualquier espera por un lock." -#: utils/misc/guc.c:2581 -#, fuzzy -#| msgid "Sets the maximum allowed duration of any idling transaction." +#: utils/misc/guc.c:2582 msgid "Sets the maximum allowed idle time between queries, when in a transaction." -msgstr "Define la duración máxima permitida de transacciones inactivas." +msgstr "Define el tiempo máximo permitido de inactividad entre consultas, cuando están dentro de una transacción." -#: utils/misc/guc.c:2592 -#, fuzzy -#| msgid "Sets the maximum allowed duration of any idling transaction." +#: utils/misc/guc.c:2593 msgid "Sets the maximum allowed idle time between queries, when not in a transaction." -msgstr "Define la duración máxima permitida de transacciones inactivas." +msgstr "Define el tiempo máximo permitido de inactividad entre consultas, cuando no están dentro de una transacción." -#: utils/misc/guc.c:2603 +#: utils/misc/guc.c:2604 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "Mínima edad a la cual VACUUM debería congelar (freeze) una fila de una tabla." -#: utils/misc/guc.c:2613 +#: utils/misc/guc.c:2614 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "Edad a la cual VACUUM debería recorrer una tabla completa para congelar (freeze) las filas." -#: utils/misc/guc.c:2623 +#: utils/misc/guc.c:2624 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "Mínima edad a la cual VACUUM debería congelar (freeze) el multixact en una fila." -#: utils/misc/guc.c:2633 +#: utils/misc/guc.c:2634 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "Edad de multixact a la cual VACUUM debería recorrer una tabla completa para congelar (freeze) las filas." -#: utils/misc/guc.c:2643 +#: utils/misc/guc.c:2644 msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." msgstr "Número de transacciones por las cuales VACUUM y la limpieza HOT deberían postergarse." -#: utils/misc/guc.c:2652 -#, fuzzy -#| msgid "Age at which VACUUM should scan whole table to freeze tuples." +#: utils/misc/guc.c:2653 msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." -msgstr "Edad a la cual VACUUM debería recorrer una tabla completa para congelar (freeze) las filas." +msgstr "Edad a la cual VACUUM debería activar el modo failsafe para evitar pérdida de servicio por reciclaje (wraparound)." -#: utils/misc/guc.c:2661 -#, fuzzy -#| msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." +#: utils/misc/guc.c:2662 msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." -msgstr "Edad de multixact a la cual VACUUM debería recorrer una tabla completa para congelar (freeze) las filas." +msgstr "Edad de multixact a la cual VACUUM debería activar el modo failsafe para evitar pérdida de servicio por reciclaje (wraparound)." -#: utils/misc/guc.c:2674 +#: utils/misc/guc.c:2675 msgid "Sets the maximum number of locks per transaction." msgstr "Cantidad máxima de candados (locks) por transacción." -#: utils/misc/guc.c:2675 +#: utils/misc/guc.c:2676 msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." msgstr "El tamaño de la tabla compartida de candados se calcula usando la suposición de que a lo más max_locks_per_transaction * max_connections objetos necesitarán ser bloqueados simultáneamente." -#: utils/misc/guc.c:2686 +#: utils/misc/guc.c:2687 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Cantidad máxima de candados (locks) de predicado por transacción." -#: utils/misc/guc.c:2687 +#: utils/misc/guc.c:2688 msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." msgstr "El tamaño de la tabla compartida de candados se calcula usando la suposición de que a lo más max_pred_locks_per_transaction * max_connections objetos necesitarán ser bloqueados simultáneamente." -#: utils/misc/guc.c:2698 +#: utils/misc/guc.c:2699 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "Cantidad máxima de páginas y tuplas bloqueadas por predicado." -#: utils/misc/guc.c:2699 +#: utils/misc/guc.c:2700 msgid "If more than this total of pages and tuples in the same relation are locked by a connection, those locks are replaced by a relation-level lock." msgstr "Si más que este total de páginas y tuplas en la misma relación están bloqueadas por una conexión, esos locks son reemplazados por un lock a nivel de relación." -#: utils/misc/guc.c:2709 +#: utils/misc/guc.c:2710 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "Cantidad máxima de locks de predicado por página." -#: utils/misc/guc.c:2710 +#: utils/misc/guc.c:2711 msgid "If more than this number of tuples on the same page are locked by a connection, those locks are replaced by a page-level lock." msgstr "Si más que este número de tuplas de la misma página están bloqueadas por una conexión, esos locks son reemplazados por un lock a nivel de página." -#: utils/misc/guc.c:2720 +#: utils/misc/guc.c:2721 msgid "Sets the maximum allowed time to complete client authentication." msgstr "Define el tiempo máximo para completar proceso de autentificación." -#: utils/misc/guc.c:2732 +#: utils/misc/guc.c:2733 msgid "Waits N seconds on connection startup before authentication." msgstr "Espera N segundos al inicio de la conexión antes de la autentificación." -#: utils/misc/guc.c:2743 -#, fuzzy -#| msgid "Shows the size of write ahead log segments." +#: utils/misc/guc.c:2744 msgid "Sets the size of WAL files held for standby servers." -msgstr "Muestra el tamaño de los segmentos de WAL." +msgstr "Establece el tamaño de los archivos de WAL retenidos para los servidores standby." -#: utils/misc/guc.c:2754 +#: utils/misc/guc.c:2755 msgid "Sets the minimum size to shrink the WAL to." msgstr "Define el tamaño mínimo al cual reducir el WAL." -#: utils/misc/guc.c:2766 +#: utils/misc/guc.c:2767 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Define el tamaño de WAL que desencadena un checkpoint." -#: utils/misc/guc.c:2778 +#: utils/misc/guc.c:2779 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "Define el tiempo máximo entre puntos de control de WAL automáticos." -#: utils/misc/guc.c:2789 +#: utils/misc/guc.c:2790 msgid "Enables warnings if checkpoint segments are filled more frequently than this." msgstr "Registrar si el llenado de segmentos de WAL es más frecuente que esto." -#: utils/misc/guc.c:2791 +#: utils/misc/guc.c:2792 msgid "Write a message to the server log if checkpoints caused by the filling of checkpoint segment files happens more frequently than this number of seconds. Zero turns off the warning." msgstr "Envía un mensaje a los registros del servidor si los punto de control causados por el llenado de archivos de segmento sucede con más frecuencia que este número de segundos. Un valor de 0 (cero) desactiva la opción." -#: utils/misc/guc.c:2803 utils/misc/guc.c:3019 utils/misc/guc.c:3066 +#: utils/misc/guc.c:2804 utils/misc/guc.c:3020 utils/misc/guc.c:3067 msgid "Number of pages after which previously performed writes are flushed to disk." msgstr "Número de páginas después del cual las escrituras previamente ejecutadas se sincronizan a disco." -#: utils/misc/guc.c:2814 +#: utils/misc/guc.c:2815 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "Búfers en memoria compartida para páginas de WAL." -#: utils/misc/guc.c:2825 +#: utils/misc/guc.c:2826 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Tiempo entre sincronizaciones de WAL ejecutadas por el proceso escritor de WAL." -#: utils/misc/guc.c:2836 +#: utils/misc/guc.c:2837 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "Cantidad de WAL escrito por el proceso escritor de WAL que desencadena una sincronización (flush)." -#: utils/misc/guc.c:2847 -#, fuzzy -#| msgid "Size of new file to fsync instead of writing WAL." +#: utils/misc/guc.c:2848 msgid "Minimum size of new file to fsync instead of writing WAL." -msgstr "Tamaño del nuevo archivo para hacer fsync en lugar de escribir WAL." +msgstr "Tamaño mínimo del nuevo archivo para hacer fsync en lugar de escribir WAL." -#: utils/misc/guc.c:2858 +#: utils/misc/guc.c:2859 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "Define la cantidad máxima de procesos «WAL sender» simultáneos." -#: utils/misc/guc.c:2869 +#: utils/misc/guc.c:2870 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Define la cantidad máxima de slots de replicación definidos simultáneamente." -#: utils/misc/guc.c:2879 -#, fuzzy -#| msgid "Sets the maximum number of simultaneously defined replication slots." +#: utils/misc/guc.c:2880 msgid "Sets the maximum WAL size that can be reserved by replication slots." -msgstr "Define la cantidad máxima de slots de replicación definidos simultáneamente." +msgstr "Define el tamaño máximo de WAL que puede ser reservado por slots de replicación." -#: utils/misc/guc.c:2880 +#: utils/misc/guc.c:2881 msgid "Replication slots will be marked as failed, and segments released for deletion or recycling, if this much space is occupied by WAL on disk." msgstr "Los slots de replicación serán invalidados, y los segmentos de WAL eliminados o reciclados, si se usa esta cantidad de espacio de disco en WAL." -#: utils/misc/guc.c:2892 +#: utils/misc/guc.c:2893 msgid "Sets the maximum time to wait for WAL replication." msgstr "Define el tiempo máximo a esperar la replicación de WAL." -#: utils/misc/guc.c:2903 +#: utils/misc/guc.c:2904 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "Retardo en microsegundos entre completar una transacción y escribir WAL a disco." -#: utils/misc/guc.c:2915 +#: utils/misc/guc.c:2916 msgid "Sets the minimum concurrent open transactions before performing commit_delay." msgstr "Mínimo de transacciones concurrentes para esperar commit_delay." -#: utils/misc/guc.c:2926 +#: utils/misc/guc.c:2927 msgid "Sets the number of digits displayed for floating-point values." msgstr "Ajustar el número de dígitos mostrados para valores de coma flotante." -#: utils/misc/guc.c:2927 +#: utils/misc/guc.c:2928 msgid "This affects real, double precision, and geometric data types. A zero or negative parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate). Any value greater than zero selects precise output mode." msgstr "Esto afecta los tipos real, de doble precisión, y geométricos. Un valor del parámetro cero o negativo se agrega a la cantidad estándar de dígitos (FLT_DIG o DBL_DIG, según sea apropiado). Cualquier valor mayor que cero selecciona el modo de salida preciso." -#: utils/misc/guc.c:2939 -#, fuzzy -#| msgid "Sets the minimum execution time above which autovacuum actions will be logged." +#: utils/misc/guc.c:2940 msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." -msgstr "Tiempo mínimo de ejecución a partir del cual se registran las acciones de autovacuum." +msgstr "Establece el tiempo mínimo de ejecución a partir del cual se registra una muestra de la sentencia. El muestreo es determinado por log_statement_sample_rate." -#: utils/misc/guc.c:2942 -#, fuzzy -#| msgid "Zero prints all queries. -1 turns this feature off." +#: utils/misc/guc.c:2943 msgid "Zero logs a sample of all queries. -1 turns this feature off." -msgstr "Cero imprime todas las consultas. -1 desactiva esta funcionalidad." +msgstr "Cero registra una muestra de todas las consultas. -1 desactiva esta funcionalidad." -#: utils/misc/guc.c:2952 -#, fuzzy -#| msgid "Sets the minimum execution time above which autovacuum actions will be logged." +#: utils/misc/guc.c:2953 msgid "Sets the minimum execution time above which all statements will be logged." -msgstr "Tiempo mínimo de ejecución a partir del cual se registran las acciones de autovacuum." +msgstr "Establece el tiempo mínimo de ejecución a partir del cual se registran todas las sentencias." -#: utils/misc/guc.c:2954 +#: utils/misc/guc.c:2955 msgid "Zero prints all queries. -1 turns this feature off." msgstr "Cero imprime todas las consultas. -1 desactiva esta funcionalidad." -#: utils/misc/guc.c:2964 +#: utils/misc/guc.c:2965 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "Tiempo mínimo de ejecución a partir del cual se registran las acciones de autovacuum." -#: utils/misc/guc.c:2966 +#: utils/misc/guc.c:2967 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "Cero registra todas las acciones. -1 desactiva el registro de autovacuum." -#: utils/misc/guc.c:2976 +#: utils/misc/guc.c:2977 msgid "When logging statements, limit logged parameter values to first N bytes." msgstr "Cuando se registren sentencias, limitar los valores de parámetros registrados a los primeros N bytes." -#: utils/misc/guc.c:2977 utils/misc/guc.c:2988 +#: utils/misc/guc.c:2978 utils/misc/guc.c:2989 msgid "-1 to print values in full." msgstr "-1 para mostrar los valores completos." -#: utils/misc/guc.c:2987 +#: utils/misc/guc.c:2988 msgid "When reporting an error, limit logged parameter values to first N bytes." msgstr "Cuando se reporta un error, limitar los valores de parámetros registrados a los primeros N bytes." -#: utils/misc/guc.c:2998 +#: utils/misc/guc.c:2999 msgid "Background writer sleep time between rounds." msgstr "Tiempo de descanso entre rondas del background writer" -#: utils/misc/guc.c:3009 +#: utils/misc/guc.c:3010 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "Número máximo de páginas LRU a escribir en cada ronda del background writer" -#: utils/misc/guc.c:3032 +#: utils/misc/guc.c:3033 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "Cantidad máxima de peticiones simultáneas que pueden ser manejadas eficientemente por el sistema de disco." -#: utils/misc/guc.c:3050 +#: utils/misc/guc.c:3051 msgid "A variant of effective_io_concurrency that is used for maintenance work." msgstr "Una variante de effective_io_concurrency que se usa para tareas de mantención." -#: utils/misc/guc.c:3079 +#: utils/misc/guc.c:3080 msgid "Maximum number of concurrent worker processes." msgstr "Número máximo de procesos ayudantes concurrentes." -#: utils/misc/guc.c:3091 +#: utils/misc/guc.c:3092 msgid "Maximum number of logical replication worker processes." msgstr "Número máximo de procesos ayudantes de replicación lógica." -#: utils/misc/guc.c:3103 +#: utils/misc/guc.c:3104 msgid "Maximum number of table synchronization workers per subscription." msgstr "Número máximo de procesos ayudantes de sincronización por suscripción." -#: utils/misc/guc.c:3113 +#: utils/misc/guc.c:3114 msgid "Automatic log file rotation will occur after N minutes." msgstr "La rotación automática de archivos de log se efectuará después de N minutos." -#: utils/misc/guc.c:3124 +#: utils/misc/guc.c:3125 msgid "Automatic log file rotation will occur after N kilobytes." msgstr "La rotación automática de archivos de log se efectuará después de N kilobytes." -#: utils/misc/guc.c:3135 +#: utils/misc/guc.c:3136 msgid "Shows the maximum number of function arguments." msgstr "Muestra la cantidad máxima de argumentos de funciones." -#: utils/misc/guc.c:3146 +#: utils/misc/guc.c:3147 msgid "Shows the maximum number of index keys." msgstr "Muestra la cantidad máxima de claves de índices." -#: utils/misc/guc.c:3157 +#: utils/misc/guc.c:3158 msgid "Shows the maximum identifier length." msgstr "Muestra el largo máximo de identificadores." -#: utils/misc/guc.c:3168 +#: utils/misc/guc.c:3169 msgid "Shows the size of a disk block." msgstr "Muestra el tamaño de un bloque de disco." -#: utils/misc/guc.c:3179 +#: utils/misc/guc.c:3180 msgid "Shows the number of pages per disk file." msgstr "Muestra el número de páginas por archivo en disco." -#: utils/misc/guc.c:3190 +#: utils/misc/guc.c:3191 msgid "Shows the block size in the write ahead log." msgstr "Muestra el tamaño de bloque en el write-ahead log." -#: utils/misc/guc.c:3201 +#: utils/misc/guc.c:3202 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "Define el tiempo a esperar antes de reintentar obtener WAL después de un intento fallido." -#: utils/misc/guc.c:3213 +#: utils/misc/guc.c:3214 msgid "Shows the size of write ahead log segments." msgstr "Muestra el tamaño de los segmentos de WAL." -#: utils/misc/guc.c:3226 +#: utils/misc/guc.c:3227 msgid "Time to sleep between autovacuum runs." msgstr "Tiempo de descanso entre ejecuciones de autovacuum." -#: utils/misc/guc.c:3236 +#: utils/misc/guc.c:3237 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Número mínimo de updates o deletes antes de ejecutar vacuum." -#: utils/misc/guc.c:3245 -#, fuzzy -#| msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." +#: utils/misc/guc.c:3246 msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." -msgstr "Número mínimo de inserciones, actualizaciones y eliminaciones de tuplas antes de ejecutar analyze." +msgstr "Número mínimo de inserciones de tuplas antes de ejecutar vacuum, o -1 para desactivar vacuums por inserciones." -#: utils/misc/guc.c:3254 +#: utils/misc/guc.c:3255 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "Número mínimo de inserciones, actualizaciones y eliminaciones de tuplas antes de ejecutar analyze." -#: utils/misc/guc.c:3264 +#: utils/misc/guc.c:3265 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "Edad a la cual aplicar VACUUM automáticamente a una tabla para prevenir problemas por reciclaje de ID de transacción." -#: utils/misc/guc.c:3279 +#: utils/misc/guc.c:3280 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "Edad de multixact a la cual aplicar VACUUM automáticamente a una tabla para prevenir problemas por reciclaje de ID de multixacts." -#: utils/misc/guc.c:3289 +#: utils/misc/guc.c:3290 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "Define la cantidad máxima de procesos «autovacuum worker» simultáneos." -#: utils/misc/guc.c:3299 +#: utils/misc/guc.c:3300 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "Cantidad máxima de procesos ayudantes paralelos por operación de mantención." -#: utils/misc/guc.c:3309 +#: utils/misc/guc.c:3310 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Cantidad máxima de locks de predicado por nodo de ejecución." -#: utils/misc/guc.c:3320 +#: utils/misc/guc.c:3321 msgid "Sets the maximum number of parallel workers that can be active at one time." msgstr "Define la cantidad máxima de procesos ayudantes que pueden estar activos en un momento dado." -#: utils/misc/guc.c:3331 +#: utils/misc/guc.c:3332 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "Establece el límite de memoria que cada proceso «autovacuum worker» usará." -#: utils/misc/guc.c:3342 +#: utils/misc/guc.c:3343 msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." msgstr "Tiempo antes de que un snapshot sea demasiado antiguo para leer páginas después de que el snapshot fue tomado." -#: utils/misc/guc.c:3343 +#: utils/misc/guc.c:3344 msgid "A value of -1 disables this feature." msgstr "El valor -1 desactiva esta característica." -#: utils/misc/guc.c:3353 +#: utils/misc/guc.c:3354 msgid "Time between issuing TCP keepalives." msgstr "Tiempo entre cada emisión de TCP keepalive." -#: utils/misc/guc.c:3354 utils/misc/guc.c:3365 utils/misc/guc.c:3489 +#: utils/misc/guc.c:3355 utils/misc/guc.c:3366 utils/misc/guc.c:3490 msgid "A value of 0 uses the system default." msgstr "Un valor 0 usa el valor por omisión del sistema." -#: utils/misc/guc.c:3364 +#: utils/misc/guc.c:3365 msgid "Time between TCP keepalive retransmits." msgstr "Tiempo entre retransmisiones TCP keepalive." -#: utils/misc/guc.c:3375 +#: utils/misc/guc.c:3376 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "La renegociación SSL ya no está soportada; esto sólo puede ser 0." -#: utils/misc/guc.c:3386 +#: utils/misc/guc.c:3387 msgid "Maximum number of TCP keepalive retransmits." msgstr "Cantidad máxima de retransmisiones TCP keepalive." -#: utils/misc/guc.c:3387 +#: utils/misc/guc.c:3388 msgid "This controls the number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." msgstr "Esto controla el número de retransmisiones consecutivas de keepalive que pueden ser perdidas antes que la conexión sea considerada muerta. Un valor 0 usa el valor por omisión del sistema." -#: utils/misc/guc.c:3398 +#: utils/misc/guc.c:3399 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "Define el máximo de resultados permitidos por búsquedas exactas con GIN." -#: utils/misc/guc.c:3409 +#: utils/misc/guc.c:3410 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "Define la suposición del optimizador sobre el tamaño total de los caches de datos." -#: utils/misc/guc.c:3410 +#: utils/misc/guc.c:3411 msgid "That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." msgstr "Esto es, el tamaño total de caches (cache del kernel y búfers compartidos) usados por archivos de datos de PostgreSQL. Esto se mide en páginas de disco, que normalmente son de 8 kB cada una." -#: utils/misc/guc.c:3421 +#: utils/misc/guc.c:3422 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "Define la cantidad mínima de datos en una tabla para un recorrido paralelo." -#: utils/misc/guc.c:3422 +#: utils/misc/guc.c:3423 msgid "If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered." msgstr "Si el planificador estima que leerá un número de páginas de tabla demasiado pequeñas para alcanzar este límite, no se considerará una búsqueda paralela." -#: utils/misc/guc.c:3432 +#: utils/misc/guc.c:3433 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "Define la cantidad mínima de datos en un índice para un recorrido paralelo." -#: utils/misc/guc.c:3433 +#: utils/misc/guc.c:3434 msgid "If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered." msgstr "Si el planificador estima que leerá un número de páginas de índice demasiado pequeñas para alcanzar este límite, no se considerará una búsqueda paralela." -#: utils/misc/guc.c:3444 +#: utils/misc/guc.c:3445 msgid "Shows the server version as an integer." msgstr "Muestra la versión del servidor como un número entero." -#: utils/misc/guc.c:3455 +#: utils/misc/guc.c:3456 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "Registra el uso de archivos temporales que crezcan más allá de este número de kilobytes." -#: utils/misc/guc.c:3456 +#: utils/misc/guc.c:3457 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "Cero registra todos los archivos. El valor por omisión es -1 (lo cual desactiva el registro)." -#: utils/misc/guc.c:3466 +#: utils/misc/guc.c:3467 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Tamaño reservado para pg_stat_activity.query, en bytes." -#: utils/misc/guc.c:3477 +#: utils/misc/guc.c:3478 msgid "Sets the maximum size of the pending list for GIN index." msgstr "Define el tamaño máximo de la lista de pendientes de un índice GIN." -#: utils/misc/guc.c:3488 +#: utils/misc/guc.c:3489 msgid "TCP user timeout." msgstr "Tiempo de expiración de TCP." -#: utils/misc/guc.c:3499 +#: utils/misc/guc.c:3500 msgid "The size of huge page that should be requested." -msgstr "" +msgstr "El tamaño de huge page que se debería solicitar." -#: utils/misc/guc.c:3510 -msgid "Aggressively invalidate system caches for debugging purposes." -msgstr "" +#: utils/misc/guc.c:3511 +msgid "Aggressively flush system caches for debugging purposes." +msgstr "Escribir cachés de sistema de forma agresiva para propósitos de depuración." -#: utils/misc/guc.c:3533 -#, fuzzy -#| msgid "Sets the maximum interval between WAL receiver status reports to the sending server." +#: utils/misc/guc.c:3534 msgid "Sets the time interval between checks for disconnection while running queries." -msgstr "Define el intervalo máximo entre reportes de estado que el receptor de WAL envía al servidor origen." +msgstr "Establece el intervalo entre revisiones de desconexión mientras se ejecutan consultas." -#: utils/misc/guc.c:3553 +#: utils/misc/guc.c:3554 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "Estimación del costo de una página leída secuencialmente." -#: utils/misc/guc.c:3564 +#: utils/misc/guc.c:3565 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "Estimación del costo de una página leída no secuencialmente." -#: utils/misc/guc.c:3575 +#: utils/misc/guc.c:3576 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "Estimación del costo de procesar cada tupla (fila)." -#: utils/misc/guc.c:3586 +#: utils/misc/guc.c:3587 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." msgstr "Estimación del costo de procesar cada fila de índice durante un recorrido de índice." -#: utils/misc/guc.c:3597 +#: utils/misc/guc.c:3598 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "Estimación del costo de procesar cada operador o llamada a función." -#: utils/misc/guc.c:3608 -#, fuzzy -#| msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to master backend." +#: utils/misc/guc.c:3609 msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." msgstr "Estimación del costo de pasar cada tupla (fila) desde un proceso ayudante al proceso servidor principal." -#: utils/misc/guc.c:3619 +#: utils/misc/guc.c:3620 msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." msgstr "Estimación del costo de lanzar procesos ayudantes para consultas en paralelo." -#: utils/misc/guc.c:3631 +#: utils/misc/guc.c:3632 msgid "Perform JIT compilation if query is more expensive." msgstr "Ejecutar compilación JIT si la consulta es más cara." -#: utils/misc/guc.c:3632 +#: utils/misc/guc.c:3633 msgid "-1 disables JIT compilation." msgstr "-1 inhabilita compilación JIT." -#: utils/misc/guc.c:3642 -#, fuzzy -#| msgid "Optimize JITed functions if query is more expensive." +#: utils/misc/guc.c:3643 msgid "Optimize JIT-compiled functions if query is more expensive." -msgstr "Optimizar funciones JIT-compiladas si la consulta es más cara." +msgstr "Optimizar funciones compiladas en tiempo de ejecución (JIT) si la consulta es más cara." -#: utils/misc/guc.c:3643 +#: utils/misc/guc.c:3644 msgid "-1 disables optimization." msgstr "-1 inhabilita la optimización." -#: utils/misc/guc.c:3653 +#: utils/misc/guc.c:3654 msgid "Perform JIT inlining if query is more expensive." msgstr "Ejecutar «inlining» JIT si la consulta es más cara." -#: utils/misc/guc.c:3654 +#: utils/misc/guc.c:3655 msgid "-1 disables inlining." msgstr "-1 inhabilita el «inlining»." -#: utils/misc/guc.c:3664 +#: utils/misc/guc.c:3665 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgstr "Estimación de la fracción de filas de un cursor que serán extraídas." -#: utils/misc/guc.c:3676 +#: utils/misc/guc.c:3677 msgid "GEQO: selective pressure within the population." msgstr "GEQO: presión selectiva dentro de la población." -#: utils/misc/guc.c:3687 +#: utils/misc/guc.c:3688 msgid "GEQO: seed for random path selection." msgstr "GEQO: semilla para la selección aleatoria de caminos." -#: utils/misc/guc.c:3698 +#: utils/misc/guc.c:3699 msgid "Multiple of work_mem to use for hash tables." msgstr "Múltiplo de work_mem para el uso de tablas de hash." -#: utils/misc/guc.c:3709 +#: utils/misc/guc.c:3710 msgid "Multiple of the average buffer usage to free per round." msgstr "Múltiplo del uso promedio de búfers que liberar en cada ronda." -#: utils/misc/guc.c:3719 +#: utils/misc/guc.c:3720 msgid "Sets the seed for random-number generation." msgstr "Semilla para la generación de números aleatorios." -#: utils/misc/guc.c:3730 +#: utils/misc/guc.c:3731 msgid "Vacuum cost delay in milliseconds." msgstr "Tiempo de descanso de vacuum en milisegundos." -#: utils/misc/guc.c:3741 +#: utils/misc/guc.c:3742 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Tiempo de descanso de vacuum en milisegundos, para autovacuum." -#: utils/misc/guc.c:3752 +#: utils/misc/guc.c:3753 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "Número de updates o deletes de tuplas antes de ejecutar un vacuum, como fracción de reltuples." -#: utils/misc/guc.c:3762 -#, fuzzy -#| msgid "Number of tuple inserts prior to index cleanup as a fraction of reltuples." +#: utils/misc/guc.c:3763 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." -msgstr "Número de inserts de tuplas antes de ejecutar una limpieza de índice, como fracción de reltuples." +msgstr "Número de inserts de tuplas antes de ejecutar un vacuum, como fracción de reltuples." -#: utils/misc/guc.c:3772 +#: utils/misc/guc.c:3773 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "Número mínimo de inserciones, actualizaciones y eliminaciones de tuplas antes de ejecutar analyze, como fracción de reltuples." -#: utils/misc/guc.c:3782 +#: utils/misc/guc.c:3783 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." msgstr "Tiempo utilizado en escribir páginas «sucias» durante los puntos de control, medido como fracción del intervalo del punto de control." -#: utils/misc/guc.c:3792 +#: utils/misc/guc.c:3793 msgid "Fraction of statements exceeding log_min_duration_sample to be logged." msgstr "Fracción de sentencias que duren más de log_min_duration_sample a ser registradas." -#: utils/misc/guc.c:3793 +#: utils/misc/guc.c:3794 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "Use un valor entre 0.0 (no registrar nunca) y 1.0 (registrar siempre)." -#: utils/misc/guc.c:3802 -#, fuzzy -#| msgid "Set the fraction of transactions to log for new transactions." +#: utils/misc/guc.c:3803 msgid "Sets the fraction of transactions from which to log all statements." -msgstr "Define la fracción de transacciones que registrar en el log, para nuevas transacciones." +msgstr "Define la fracción de transacciones desde la cual registrar en el log todas las sentencias." -#: utils/misc/guc.c:3803 -#, fuzzy -#| msgid "Logs all statements from a fraction of transactions. Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." +#: utils/misc/guc.c:3804 msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." -msgstr "Registra todas las sentencias de una fracción de transacciones. Use un valor entre 0.0 (nunca registrar) y 1.0 (registrar todas las sentencias de todas las transacciones)." +msgstr "Use un valor entre 0.0 (nunca registrar) y 1.0 (registrar todas las sentencias de todas las transacciones)." -#: utils/misc/guc.c:3822 +#: utils/misc/guc.c:3823 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "Orden de shell que se invocará para archivar un archivo WAL." -#: utils/misc/guc.c:3832 -#, fuzzy -#| msgid "Sets the shell command that will be called to archive a WAL file." +#: utils/misc/guc.c:3833 msgid "Sets the shell command that will be called to retrieve an archived WAL file." -msgstr "Orden de shell que se invocará para archivar un archivo WAL." +msgstr "Orden de shell que se invocará para recuperar un archivo WAL archivado." -#: utils/misc/guc.c:3842 +#: utils/misc/guc.c:3843 msgid "Sets the shell command that will be executed at every restart point." msgstr "Orden de shell que se invocará en cada «restart point»." -#: utils/misc/guc.c:3852 +#: utils/misc/guc.c:3853 msgid "Sets the shell command that will be executed once at the end of recovery." msgstr "Orden de shell que se invocará una vez al terminar la recuperación." -#: utils/misc/guc.c:3862 +#: utils/misc/guc.c:3863 msgid "Specifies the timeline to recover into." msgstr "Especifica la línea de tiempo a la cual recuperar." -#: utils/misc/guc.c:3872 +#: utils/misc/guc.c:3873 msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." msgstr "Defina a «immediate» para terminar la recuperación en cuando se alcance el estado consistente." -#: utils/misc/guc.c:3881 +#: utils/misc/guc.c:3882 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "Define el ID de transacción hasta el cual se ejecutará la recuperación." -#: utils/misc/guc.c:3890 +#: utils/misc/guc.c:3891 msgid "Sets the time stamp up to which recovery will proceed." msgstr "Define la marca de tiempo hasta la cual se ejecutará la recuperación." -#: utils/misc/guc.c:3899 +#: utils/misc/guc.c:3900 msgid "Sets the named restore point up to which recovery will proceed." msgstr "Define el nombre del punto de restauración hasta el cual se ejecutará la recuperación." -#: utils/misc/guc.c:3908 +#: utils/misc/guc.c:3909 msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." msgstr "Define el LSN de la ubicación de WAL hasta la cual se ejecutará la recuperación." -#: utils/misc/guc.c:3918 +#: utils/misc/guc.c:3919 msgid "Specifies a file name whose presence ends recovery in the standby." msgstr "Especifica un nombre de archivo cuya presencia termina la recuperación en el standby." -#: utils/misc/guc.c:3928 +#: utils/misc/guc.c:3929 msgid "Sets the connection string to be used to connect to the sending server." msgstr "Define la cadena de conexión que se usará para conectarse al servidor de origen." -#: utils/misc/guc.c:3939 +#: utils/misc/guc.c:3940 msgid "Sets the name of the replication slot to use on the sending server." msgstr "Define el nombre del slot de replicación a utilizar en el servidor de origen." -#: utils/misc/guc.c:3949 +#: utils/misc/guc.c:3950 msgid "Sets the client's character set encoding." msgstr "Codificación del juego de caracteres del cliente." -#: utils/misc/guc.c:3960 +#: utils/misc/guc.c:3961 msgid "Controls information prefixed to each log line." msgstr "Controla el prefijo que antecede cada línea registrada." -#: utils/misc/guc.c:3961 +#: utils/misc/guc.c:3962 msgid "If blank, no prefix is used." msgstr "si está en blanco, no se usa prefijo." -#: utils/misc/guc.c:3970 +#: utils/misc/guc.c:3971 msgid "Sets the time zone to use in log messages." msgstr "Define el huso horario usando en los mensajes registrados." -#: utils/misc/guc.c:3980 +#: utils/misc/guc.c:3981 msgid "Sets the display format for date and time values." msgstr "Formato de salida para valores de horas y fechas." -#: utils/misc/guc.c:3981 +#: utils/misc/guc.c:3982 msgid "Also controls interpretation of ambiguous date inputs." msgstr "También controla la interpretación de entradas ambiguas de fechas" -#: utils/misc/guc.c:3992 +#: utils/misc/guc.c:3993 msgid "Sets the default table access method for new tables." msgstr "Define el método de acceso a tablas por omisión para nuevas tablas." -#: utils/misc/guc.c:4003 +#: utils/misc/guc.c:4004 msgid "Sets the default tablespace to create tables and indexes in." msgstr "Define el tablespace en el cual crear tablas e índices." -#: utils/misc/guc.c:4004 +#: utils/misc/guc.c:4005 msgid "An empty string selects the database's default tablespace." msgstr "Una cadena vacía especifica el tablespace por omisión de la base de datos." -#: utils/misc/guc.c:4014 +#: utils/misc/guc.c:4015 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "Define el/los tablespace/s en el cual crear tablas temporales y archivos de ordenamiento." -#: utils/misc/guc.c:4025 +#: utils/misc/guc.c:4026 msgid "Sets the path for dynamically loadable modules." msgstr "Ruta para módulos dinámicos." -#: utils/misc/guc.c:4026 +#: utils/misc/guc.c:4027 msgid "If a dynamically loadable module needs to be opened and the specified name does not have a directory component (i.e., the name does not contain a slash), the system will search this path for the specified file." msgstr "Si se necesita abrir un módulo dinámico y el nombre especificado no tiene un componente de directorio (es decir, no contiene un slash), el sistema buscará el archivo especificado en esta ruta." -#: utils/misc/guc.c:4039 +#: utils/misc/guc.c:4040 msgid "Sets the location of the Kerberos server key file." msgstr "Ubicación del archivo de llave del servidor Kerberos." -#: utils/misc/guc.c:4050 +#: utils/misc/guc.c:4051 msgid "Sets the Bonjour service name." msgstr "Nombre del servicio Bonjour." -#: utils/misc/guc.c:4062 +#: utils/misc/guc.c:4063 msgid "Shows the collation order locale." msgstr "Configuración regional de ordenamiento de cadenas (collation)." -#: utils/misc/guc.c:4073 +#: utils/misc/guc.c:4074 msgid "Shows the character classification and case conversion locale." msgstr "Configuración regional de clasificación de caracteres y conversión de mayúsculas." -#: utils/misc/guc.c:4084 +#: utils/misc/guc.c:4085 msgid "Sets the language in which messages are displayed." msgstr "Idioma en el que se despliegan los mensajes." -#: utils/misc/guc.c:4094 +#: utils/misc/guc.c:4095 msgid "Sets the locale for formatting monetary amounts." msgstr "Configuración regional para formatos de moneda." -#: utils/misc/guc.c:4104 +#: utils/misc/guc.c:4105 msgid "Sets the locale for formatting numbers." msgstr "Configuración regional para formatos de números." -#: utils/misc/guc.c:4114 +#: utils/misc/guc.c:4115 msgid "Sets the locale for formatting date and time values." msgstr "Configuración regional para formatos de horas y fechas." -#: utils/misc/guc.c:4124 +#: utils/misc/guc.c:4125 msgid "Lists shared libraries to preload into each backend." msgstr "Bibliotecas compartidas a precargar en cada proceso." -#: utils/misc/guc.c:4135 +#: utils/misc/guc.c:4136 msgid "Lists shared libraries to preload into server." msgstr "Bibliotecas compartidas a precargar en el servidor." -#: utils/misc/guc.c:4146 +#: utils/misc/guc.c:4147 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "Bibliotecas compartidas no privilegiadas a precargar en cada proceso." -#: utils/misc/guc.c:4157 +#: utils/misc/guc.c:4158 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "Orden de búsqueda en schemas para nombres que no especifican schema." -#: utils/misc/guc.c:4169 -#, fuzzy -#| msgid "Sets the server (database) character set encoding." +#: utils/misc/guc.c:4170 msgid "Shows the server (database) character set encoding." -msgstr "Codificación de caracteres del servidor (bases de datos)." +msgstr "Muestra la codificación de caracteres del servidor (base de datos)." -#: utils/misc/guc.c:4181 +#: utils/misc/guc.c:4182 msgid "Shows the server version." msgstr "Versión del servidor." -#: utils/misc/guc.c:4193 +#: utils/misc/guc.c:4194 msgid "Sets the current role." msgstr "Define el rol actual." -#: utils/misc/guc.c:4205 +#: utils/misc/guc.c:4206 msgid "Sets the session user name." msgstr "Define el nombre del usuario de sesión." -#: utils/misc/guc.c:4216 +#: utils/misc/guc.c:4217 msgid "Sets the destination for server log output." msgstr "Define el destino de la salida del registro del servidor." -#: utils/misc/guc.c:4217 +#: utils/misc/guc.c:4218 msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and \"eventlog\", depending on the platform." msgstr "Los valores aceptables son combinaciones de «stderr», «syslog», «csvlog» y «eventlog», dependiendo de la plataforma." -#: utils/misc/guc.c:4228 +#: utils/misc/guc.c:4229 msgid "Sets the destination directory for log files." msgstr "Define el directorio de destino de los archivos del registro del servidor." -#: utils/misc/guc.c:4229 +#: utils/misc/guc.c:4230 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "Puede ser una ruta relativa al directorio de datos o una ruta absoluta." -#: utils/misc/guc.c:4239 +#: utils/misc/guc.c:4240 msgid "Sets the file name pattern for log files." msgstr "Define el patrón para los nombres de archivo del registro del servidor." -#: utils/misc/guc.c:4250 +#: utils/misc/guc.c:4251 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "Nombre de programa para identificar PostgreSQL en mensajes de syslog." -#: utils/misc/guc.c:4261 +#: utils/misc/guc.c:4262 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "Nombre de programa para identificar PostgreSQL en mensajes del log de eventos." -#: utils/misc/guc.c:4272 +#: utils/misc/guc.c:4273 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "Huso horario para desplegar e interpretar valores de tiempo." -#: utils/misc/guc.c:4282 +#: utils/misc/guc.c:4283 msgid "Selects a file of time zone abbreviations." msgstr "Selecciona un archivo de abreviaciones de huso horario." -#: utils/misc/guc.c:4292 +#: utils/misc/guc.c:4293 msgid "Sets the owning group of the Unix-domain socket." msgstr "Grupo dueño del socket de dominio Unix." -#: utils/misc/guc.c:4293 +#: utils/misc/guc.c:4294 msgid "The owning user of the socket is always the user that starts the server." msgstr "El usuario dueño del socket siempre es el usuario que inicia el servidor." -#: utils/misc/guc.c:4303 +#: utils/misc/guc.c:4304 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Directorios donde se crearán los sockets de dominio Unix." -#: utils/misc/guc.c:4318 +#: utils/misc/guc.c:4319 msgid "Sets the host name or IP address(es) to listen to." msgstr "Define el nombre de anfitrión o dirección IP en la cual escuchar." -#: utils/misc/guc.c:4333 +#: utils/misc/guc.c:4334 msgid "Sets the server's data directory." msgstr "Define la ubicación del directorio de datos." -#: utils/misc/guc.c:4344 +#: utils/misc/guc.c:4345 msgid "Sets the server's main configuration file." msgstr "Define la ubicación del archivo principal de configuración del servidor." -#: utils/misc/guc.c:4355 +#: utils/misc/guc.c:4356 msgid "Sets the server's \"hba\" configuration file." msgstr "Define la ubicación del archivo de configuración «hba» del servidor." -#: utils/misc/guc.c:4366 +#: utils/misc/guc.c:4367 msgid "Sets the server's \"ident\" configuration file." msgstr "Define la ubicación del archivo de configuración «ident» del servidor." -#: utils/misc/guc.c:4377 +#: utils/misc/guc.c:4378 msgid "Writes the postmaster PID to the specified file." msgstr "Registra el PID de postmaster en el archivo especificado." -#: utils/misc/guc.c:4388 -#, fuzzy -#| msgid "Name of the SSL library." +#: utils/misc/guc.c:4389 msgid "Shows the name of the SSL library." -msgstr "Nombre de la biblioteca SSL." +msgstr "Muestra el nombre de la biblioteca SSL." -#: utils/misc/guc.c:4403 +#: utils/misc/guc.c:4404 msgid "Location of the SSL server certificate file." msgstr "Ubicación del archivo de certificado SSL del servidor." -#: utils/misc/guc.c:4413 +#: utils/misc/guc.c:4414 msgid "Location of the SSL server private key file." msgstr "Ubicación del archivo de la llave SSL privada del servidor." -#: utils/misc/guc.c:4423 +#: utils/misc/guc.c:4424 msgid "Location of the SSL certificate authority file." msgstr "Ubicación del archivo de autoridad certificadora SSL." -#: utils/misc/guc.c:4433 +#: utils/misc/guc.c:4434 msgid "Location of the SSL certificate revocation list file." msgstr "Ubicación del archivo de lista de revocación de certificados SSL" -#: utils/misc/guc.c:4443 -#, fuzzy -#| msgid "Location of the SSL certificate revocation list file." +#: utils/misc/guc.c:4444 msgid "Location of the SSL certificate revocation list directory." -msgstr "Ubicación del archivo de lista de revocación de certificados SSL" +msgstr "Ubicación del directorio de lista de revocación de certificados SSL" -#: utils/misc/guc.c:4453 +#: utils/misc/guc.c:4454 msgid "Writes temporary statistics files to the specified directory." msgstr "Escribe los archivos temporales de estadísticas al directorio especificado." -#: utils/misc/guc.c:4464 +#: utils/misc/guc.c:4465 msgid "Number of synchronous standbys and list of names of potential synchronous ones." msgstr "Número de standbys sincrónicos y lista de nombres de los potenciales sincrónicos." -#: utils/misc/guc.c:4475 +#: utils/misc/guc.c:4476 msgid "Sets default text search configuration." msgstr "Define la configuración de búsqueda en texto por omisión." -#: utils/misc/guc.c:4485 +#: utils/misc/guc.c:4486 msgid "Sets the list of allowed SSL ciphers." msgstr "Define la lista de cifrados SSL permitidos." -#: utils/misc/guc.c:4500 +#: utils/misc/guc.c:4501 msgid "Sets the curve to use for ECDH." msgstr "Define la curva a usar para ECDH." -#: utils/misc/guc.c:4515 +#: utils/misc/guc.c:4516 msgid "Location of the SSL DH parameters file." msgstr "Ubicación del archivo de parámetros DH para SSL." -#: utils/misc/guc.c:4526 +#: utils/misc/guc.c:4527 msgid "Command to obtain passphrases for SSL." msgstr "Orden para obtener frases clave para SSL." -#: utils/misc/guc.c:4537 +#: utils/misc/guc.c:4538 msgid "Sets the application name to be reported in statistics and logs." msgstr "Define el nombre de aplicación a reportarse en estadísticas y logs." -#: utils/misc/guc.c:4548 +#: utils/misc/guc.c:4549 msgid "Sets the name of the cluster, which is included in the process title." msgstr "Define el nombre del clúster, el cual se incluye en el título de proceso." -#: utils/misc/guc.c:4559 +#: utils/misc/guc.c:4560 msgid "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "Define los gestores de recursos WAL para los cuales hacer verificaciones de consistencia WAL." -#: utils/misc/guc.c:4560 +#: utils/misc/guc.c:4561 msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." msgstr "Se registrarán imágenes de página completa para todos los bloques de datos, y comparados con los resultados de la aplicación de WAL." -#: utils/misc/guc.c:4570 +#: utils/misc/guc.c:4571 msgid "JIT provider to use." msgstr "Proveedor JIT a usar." -#: utils/misc/guc.c:4581 -#, fuzzy -#| msgid "Logs the host name in the connection logs." +#: utils/misc/guc.c:4582 msgid "Log backtrace for errors in these functions." -msgstr "Registrar el nombre del host en la conexión." +msgstr "Registrar el backtrace para errores que se produzcan en estas funciones." -#: utils/misc/guc.c:4601 +#: utils/misc/guc.c:4602 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Define si «\\'» está permitido en literales de cadena." -#: utils/misc/guc.c:4611 +#: utils/misc/guc.c:4612 msgid "Sets the output format for bytea." msgstr "Formato de salida para bytea." -#: utils/misc/guc.c:4621 +#: utils/misc/guc.c:4622 msgid "Sets the message levels that are sent to the client." msgstr "Nivel de mensajes enviados al cliente." -#: utils/misc/guc.c:4622 utils/misc/guc.c:4708 utils/misc/guc.c:4719 -#: utils/misc/guc.c:4795 +#: utils/misc/guc.c:4623 utils/misc/guc.c:4709 utils/misc/guc.c:4720 +#: utils/misc/guc.c:4796 msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." msgstr "Cada nivel incluye todos los niveles que lo siguen. Mientras más posterior el nivel, menos mensajes se enviarán." -#: utils/misc/guc.c:4632 -#, fuzzy -#| msgid "unterminated quoted identifier" +#: utils/misc/guc.c:4633 msgid "Compute query identifiers." -msgstr "un identificador entre comillas está inconcluso" +msgstr "Calcular identificadores de consulta." -#: utils/misc/guc.c:4642 +#: utils/misc/guc.c:4643 msgid "Enables the planner to use constraints to optimize queries." msgstr "Permitir el uso de restricciones para limitar los accesos a tablas." -#: utils/misc/guc.c:4643 +#: utils/misc/guc.c:4644 msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." msgstr "Las tablas no serán recorridas si sus restricciones garantizan que ninguna fila coincidirá con la consulta." -#: utils/misc/guc.c:4654 -#, fuzzy -#| msgid "Sets the default table access method for new tables." +#: utils/misc/guc.c:4655 msgid "Sets the default compression method for compressible values." -msgstr "Define el método de acceso a tablas por omisión para nuevas tablas." +msgstr "Define el método de compresión por omisión para valores comprimibles." -#: utils/misc/guc.c:4665 +#: utils/misc/guc.c:4666 msgid "Sets the transaction isolation level of each new transaction." msgstr "Nivel de aislación (isolation level) de transacciones nuevas." -#: utils/misc/guc.c:4675 +#: utils/misc/guc.c:4676 msgid "Sets the current transaction's isolation level." msgstr "Define el nivel de aislación de la transacción en curso." -#: utils/misc/guc.c:4686 +#: utils/misc/guc.c:4687 msgid "Sets the display format for interval values." msgstr "Formato de salida para valores de intervalos." -#: utils/misc/guc.c:4697 +#: utils/misc/guc.c:4698 msgid "Sets the verbosity of logged messages." msgstr "Verbosidad de los mensajes registrados." -#: utils/misc/guc.c:4707 +#: utils/misc/guc.c:4708 msgid "Sets the message levels that are logged." msgstr "Nivel de mensajes registrados." -#: utils/misc/guc.c:4718 +#: utils/misc/guc.c:4719 msgid "Causes all statements generating error at or above this level to be logged." msgstr "Registrar sentencias que generan error de nivel superior o igual a éste." -#: utils/misc/guc.c:4729 +#: utils/misc/guc.c:4730 msgid "Sets the type of statements logged." msgstr "Define el tipo de sentencias que se registran." -#: utils/misc/guc.c:4739 +#: utils/misc/guc.c:4740 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "«Facility» de syslog que se usará cuando syslog esté habilitado." -#: utils/misc/guc.c:4754 +#: utils/misc/guc.c:4755 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "Define el comportamiento de la sesión con respecto a disparadores y reglas de reescritura." -#: utils/misc/guc.c:4764 +#: utils/misc/guc.c:4765 msgid "Sets the current transaction's synchronization level." msgstr "Define el nivel de sincronización de la transacción en curso." -#: utils/misc/guc.c:4774 +#: utils/misc/guc.c:4775 msgid "Allows archiving of WAL files using archive_command." msgstr "Permite el archivado de WAL usando archive_command." -#: utils/misc/guc.c:4784 +#: utils/misc/guc.c:4785 msgid "Sets the action to perform upon reaching the recovery target." msgstr "Acción a ejecutar al alcanzar el destino de recuperación." -#: utils/misc/guc.c:4794 +#: utils/misc/guc.c:4795 msgid "Enables logging of recovery-related debugging information." msgstr "Recolectar información de depuración relacionada con la recuperación." -#: utils/misc/guc.c:4810 +#: utils/misc/guc.c:4811 msgid "Collects function-level statistics on database activity." msgstr "Recolectar estadísticas de actividad de funciones en la base de datos." -#: utils/misc/guc.c:4820 -#, fuzzy -#| msgid "Set the level of information written to the WAL." +#: utils/misc/guc.c:4821 msgid "Sets the level of information written to the WAL." -msgstr "Nivel de información escrita a WAL." +msgstr "Establece el nivel de información escrita al WAL." -#: utils/misc/guc.c:4830 +#: utils/misc/guc.c:4831 msgid "Selects the dynamic shared memory implementation used." msgstr "Escoge la implementación de memoria compartida dinámica que se usará." -#: utils/misc/guc.c:4840 +#: utils/misc/guc.c:4841 msgid "Selects the shared memory implementation used for the main shared memory region." msgstr "Escoge la implementación de memoria compartida dinámica que se usará para la región principal de memoria compartida." -#: utils/misc/guc.c:4850 +#: utils/misc/guc.c:4851 msgid "Selects the method used for forcing WAL updates to disk." msgstr "Selecciona el método usado para forzar escritura de WAL a disco." -#: utils/misc/guc.c:4860 +#: utils/misc/guc.c:4861 msgid "Sets how binary values are to be encoded in XML." msgstr "Define cómo se codificarán los valores binarios en XML." -#: utils/misc/guc.c:4870 +#: utils/misc/guc.c:4871 msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." msgstr "Define si los datos XML implícitos en operaciones de análisis y serialización serán considerados documentos o fragmentos de contenido." -#: utils/misc/guc.c:4881 +#: utils/misc/guc.c:4882 msgid "Use of huge pages on Linux or Windows." msgstr "Usar páginas grandes (huge) en Linux o Windows." -#: utils/misc/guc.c:4891 +#: utils/misc/guc.c:4892 msgid "Forces use of parallel query facilities." msgstr "Obliga al uso de la funcionalidad de consultas paralelas." -#: utils/misc/guc.c:4892 +#: utils/misc/guc.c:4893 msgid "If possible, run query using a parallel worker and with parallel restrictions." msgstr "Si es posible, ejecuta cada consulta en un ayudante paralelo y con restricciones de paralelismo." -#: utils/misc/guc.c:4902 +#: utils/misc/guc.c:4903 msgid "Chooses the algorithm for encrypting passwords." msgstr "Escoge el algoritmo para cifrar contraseñas." -#: utils/misc/guc.c:4912 +#: utils/misc/guc.c:4913 msgid "Controls the planner's selection of custom or generic plan." msgstr "Controla la selección del optimizador de planes genéricos o «custom»." -#: utils/misc/guc.c:4913 +#: utils/misc/guc.c:4914 msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." msgstr "Las sentencias preparadas pueden tener planes genéricos y «custom», y el optimizador intentará escoger cuál es mejor. Esto puede usarse para controlar manualmente el comportamiento." -#: utils/misc/guc.c:4925 +#: utils/misc/guc.c:4926 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "Define la versión mínima del protocolo SSL/TLS a usar." -#: utils/misc/guc.c:4937 +#: utils/misc/guc.c:4938 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "Define la versión máxima del protocolo SSL/TLS a usar." -#: utils/misc/guc.c:4949 +#: utils/misc/guc.c:4950 msgid "Sets the method for synchronizing the data directory before crash recovery." -msgstr "" +msgstr "Establece el método para sincronizar el directorio de datos antes de la recuperación ante una caída." -#: utils/misc/guc.c:5518 -#, fuzzy, c-format -#| msgid "unrecognized configuration parameter \"%s\"" +#: utils/misc/guc.c:5519 +#, c-format msgid "invalid configuration parameter name \"%s\"" -msgstr "parámetro de configuración «%s» no reconocido" +msgstr "nombre de parámetro de configuración «%s» no válido" -#: utils/misc/guc.c:5520 +#: utils/misc/guc.c:5521 #, c-format msgid "Custom parameter names must be two or more simple identifiers separated by dots." -msgstr "" +msgstr "Los nombres de los parámetros personalizados deben ser dos o más identificadores sencillos separados por puntos." -#: utils/misc/guc.c:5529 utils/misc/guc.c:9288 +#: utils/misc/guc.c:5530 utils/misc/guc.c:9289 #, c-format msgid "unrecognized configuration parameter \"%s\"" msgstr "parámetro de configuración «%s» no reconocido" -#: utils/misc/guc.c:5822 +#: utils/misc/guc.c:5823 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s: no se pudo acceder al directorio «%s»: %s\n" -#: utils/misc/guc.c:5827 +#: utils/misc/guc.c:5828 #, c-format msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" msgstr "Ejecute initdb o pg_basebackup para inicializar un directorio de datos de PostgreSQL.\n" -#: utils/misc/guc.c:5847 +#: utils/misc/guc.c:5848 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -28386,12 +27913,12 @@ msgstr "" "%s no sabe dónde encontrar el archivo de configuración del servidor.\n" "Debe especificar la opción --config-file o -D o definir la variable de ambiente PGDATA.\n" -#: utils/misc/guc.c:5866 +#: utils/misc/guc.c:5867 #, c-format msgid "%s: could not access the server configuration file \"%s\": %s\n" msgstr "%s: no se pudo acceder al archivo de configuración «%s»: %s\n" -#: utils/misc/guc.c:5892 +#: utils/misc/guc.c:5893 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -28400,7 +27927,7 @@ msgstr "" "%s no sabe dónde encontrar los archivos de sistema de la base de datos.\n" "Esto puede especificarse como «data_directory» en «%s», o usando la opción -D, o a través de la variable de ambiente PGDATA.\n" -#: utils/misc/guc.c:5940 +#: utils/misc/guc.c:5941 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -28409,7 +27936,7 @@ msgstr "" "%s no sabe dónde encontrar el archivo de configuración «hba».\n" "Esto puede especificarse como «hba_file» en «%s», o usando la opción -D, o a través de la variable de ambiente PGDATA.\n" -#: utils/misc/guc.c:5963 +#: utils/misc/guc.c:5964 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -28418,186 +27945,181 @@ msgstr "" "%s no sabe dónde encontrar el archivo de configuración «ident».\n" "Esto puede especificarse como «ident_file» en «%s», o usando la opción -D, o a través de la variable de ambiente PGDATA.\n" -#: utils/misc/guc.c:6888 +#: utils/misc/guc.c:6889 msgid "Value exceeds integer range." msgstr "El valor excede el rango para enteros." -#: utils/misc/guc.c:7124 +#: utils/misc/guc.c:7125 #, c-format msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d%s%s está fuera del rango aceptable para el parámetro «%s» (%d .. %d)" -#: utils/misc/guc.c:7160 +#: utils/misc/guc.c:7161 #, c-format msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" msgstr "%g%s%s está fuera del rango aceptable para el parámetro «%s» (%g .. %g)" -#: utils/misc/guc.c:7320 utils/misc/guc.c:8692 +#: utils/misc/guc.c:7321 utils/misc/guc.c:8693 #, c-format msgid "cannot set parameters during a parallel operation" msgstr "no se puede definir parámetros durante una operación paralela" -#: utils/misc/guc.c:7337 utils/misc/guc.c:8533 +#: utils/misc/guc.c:7338 utils/misc/guc.c:8534 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "no se puede cambiar el parámetro «%s»" -#: utils/misc/guc.c:7370 +#: utils/misc/guc.c:7371 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "el parámetro «%s» no se puede cambiar en este momento" -#: utils/misc/guc.c:7388 utils/misc/guc.c:7435 utils/misc/guc.c:11333 +#: utils/misc/guc.c:7389 utils/misc/guc.c:7436 utils/misc/guc.c:11334 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "se ha denegado el permiso para cambiar la opción «%s»" -#: utils/misc/guc.c:7425 +#: utils/misc/guc.c:7426 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "el parámetro «%s» no se puede cambiar después de efectuar la conexión" -#: utils/misc/guc.c:7473 +#: utils/misc/guc.c:7474 #, c-format msgid "cannot set parameter \"%s\" within security-definer function" msgstr "no se puede definir el parámetro «%s» dentro una función security-definer" -#: utils/misc/guc.c:8106 utils/misc/guc.c:8153 utils/misc/guc.c:9550 +#: utils/misc/guc.c:8107 utils/misc/guc.c:8154 utils/misc/guc.c:9551 #, c-format msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" msgstr "debe ser superusuario o miembro del rol pg_read_all settings para examinar «%s»" -#: utils/misc/guc.c:8237 +#: utils/misc/guc.c:8238 #, c-format msgid "SET %s takes only one argument" msgstr "SET %s lleva sólo un argumento" -#: utils/misc/guc.c:8485 +#: utils/misc/guc.c:8486 #, c-format msgid "must be superuser to execute ALTER SYSTEM command" msgstr "debe ser superusuario para ejecutar la orden ALTER SYSTEM" -#: utils/misc/guc.c:8566 +#: utils/misc/guc.c:8567 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "los valores de parámetros para ALTER SYSTEM no deben contener saltos de línea" -#: utils/misc/guc.c:8611 +#: utils/misc/guc.c:8612 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "no se pudo interpretar el contenido del archivo «%s»" -#: utils/misc/guc.c:8768 +#: utils/misc/guc.c:8769 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOT no está implementado" -#: utils/misc/guc.c:8852 +#: utils/misc/guc.c:8853 #, c-format msgid "SET requires parameter name" msgstr "SET requiere el nombre de un parámetro" -#: utils/misc/guc.c:8985 +#: utils/misc/guc.c:8986 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "intento de cambiar la opción «%s»" -#: utils/misc/guc.c:10780 -#, fuzzy, c-format -#| msgid "parameter \"%s\" changed to \"%s\"" +#: utils/misc/guc.c:10781 +#, c-format msgid "while setting parameter \"%s\" to \"%s\"" -msgstr "el parámetro «%s» fue cambiado a «%s»" +msgstr "al establecer el parámetro «%s» a «%s»" -#: utils/misc/guc.c:10945 +#: utils/misc/guc.c:10946 #, c-format msgid "parameter \"%s\" could not be set" msgstr "no se pudo cambiar el parámetro «%s»" -#: utils/misc/guc.c:11037 +#: utils/misc/guc.c:11038 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "no se pudo interpretar el valor de para el parámetro «%s»" -#: utils/misc/guc.c:11395 utils/misc/guc.c:11429 +#: utils/misc/guc.c:11396 utils/misc/guc.c:11430 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "valor no válido para el parámetro «%s»: %d" -#: utils/misc/guc.c:11463 +#: utils/misc/guc.c:11464 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "valor no válido para el parámetro «%s»: %g" -#: utils/misc/guc.c:11750 +#: utils/misc/guc.c:11751 #, c-format msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." msgstr "«temp_buffers» no puede ser cambiado después de que cualquier tabla temporal haya sido accedida en la sesión." -#: utils/misc/guc.c:11762 +#: utils/misc/guc.c:11763 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour no está soportado en este servidor" -#: utils/misc/guc.c:11775 +#: utils/misc/guc.c:11776 #, c-format msgid "SSL is not supported by this build" msgstr "SSL no está soportado en este servidor" -#: utils/misc/guc.c:11787 +#: utils/misc/guc.c:11788 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "No se puede activar el parámetro cuando «log_statement_stats» está activo." -#: utils/misc/guc.c:11799 +#: utils/misc/guc.c:11800 #, c-format msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." msgstr "No se puede activar «log_statement_stats» cuando «log_parser_stats», «log_planner_stats» o «log_executor_stats» están activos." -#: utils/misc/guc.c:12029 +#: utils/misc/guc.c:12030 #, c-format msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "effective_io_concurrency debe ser 0 en plataformas que no tienen posix_fadvise()." -#: utils/misc/guc.c:12042 -#, fuzzy, c-format -#| msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." +#: utils/misc/guc.c:12043 +#, c-format msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." -msgstr "effective_io_concurrency debe ser 0 en plataformas que no tienen posix_fadvise()." +msgstr "maintenance_io_concurrency debe ser 0 en plataformas que no tienen posix_fadvise()." -#: utils/misc/guc.c:12056 -#, fuzzy, c-format -#| msgid "huge pages not supported on this platform" +#: utils/misc/guc.c:12057 +#, c-format msgid "huge_page_size must be 0 on this platform." -msgstr "las huge pages no están soportados en esta plataforma" +msgstr "huge_page_size debe ser 0 en esta plataforma." -#: utils/misc/guc.c:12070 -#, fuzzy, c-format -#| msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." +#: utils/misc/guc.c:12071 +#, c-format msgid "client_connection_check_interval must be set to 0 on platforms that lack POLLRDHUP." -msgstr "effective_io_concurrency debe ser 0 en plataformas que no tienen posix_fadvise()." +msgstr "client_connection_check_interval debe ser 0 en plataformas que no tienen POLLRDHUP." -#: utils/misc/guc.c:12198 -#, fuzzy, c-format -#| msgid "Invalid character value." +#: utils/misc/guc.c:12199 +#, c-format msgid "invalid character" -msgstr "Valor de carácter no válido." +msgstr "carácter no válido" -#: utils/misc/guc.c:12258 +#: utils/misc/guc.c:12259 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timeline no es un número válido." -#: utils/misc/guc.c:12298 +#: utils/misc/guc.c:12299 #, c-format msgid "multiple recovery targets specified" msgstr "múltiples valores de destino de recuperación especificados" -#: utils/misc/guc.c:12299 +#: utils/misc/guc.c:12300 #, c-format msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." msgstr "A lo más uno de recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid puede estar definido." -#: utils/misc/guc.c:12307 +#: utils/misc/guc.c:12308 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "El único valor permitido es «immediate»." @@ -28724,7 +28246,7 @@ msgstr "Falló una petición de tamaño %zu en el contexto de memoria «%s»." #: utils/mmgr/mcxt.c:1046 #, c-format msgid "logging memory contexts of PID %d" -msgstr "" +msgstr "registrando contextos de memoria del PID %d" #: utils/mmgr/portalmem.c:187 #, c-format @@ -28736,42 +28258,40 @@ msgstr "el cursor «%s» ya existe" msgid "closing existing cursor \"%s\"" msgstr "cerrando el cursor «%s» preexistente" -#: utils/mmgr/portalmem.c:400 +#: utils/mmgr/portalmem.c:401 #, c-format msgid "portal \"%s\" cannot be run" msgstr "el portal «%s» no puede ser ejecutado" -#: utils/mmgr/portalmem.c:478 +#: utils/mmgr/portalmem.c:479 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "no se puede eliminar el portal «pinned» «%s»" -#: utils/mmgr/portalmem.c:486 +#: utils/mmgr/portalmem.c:487 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "no se puede eliminar el portal activo «%s»" -#: utils/mmgr/portalmem.c:736 +#: utils/mmgr/portalmem.c:738 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "no se puede hacer PREPARE de una transacción que ha creado un cursor WITH HOLD" -#: utils/mmgr/portalmem.c:1275 +#: utils/mmgr/portalmem.c:1279 #, c-format msgid "cannot perform transaction commands inside a cursor loop that is not read-only" msgstr "no se pueden ejecutar órdenes de transacción dentro de un bucle de cursor que no es de sólo lectura" #: utils/sort/logtape.c:268 utils/sort/logtape.c:291 -#, fuzzy, c-format -#| msgid "could not rewind temporary file" +#, c-format msgid "could not seek to block %ld of temporary file" -msgstr "no se puede rebobinar el archivo temporal" +msgstr "no se pudo posicionar (seek) en el bloque %ld del archivo temporal" #: utils/sort/logtape.c:297 -#, fuzzy, c-format -#| msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" +#, c-format msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" -msgstr "no se pudo leer el archivo temporal de hash-join: se leyeron sólo %zu de %zu bytes" +msgstr "no se pudo leer el bloque %ld del archivo temporal: se leyeron sólo %zu de %zu bytes" #: utils/sort/sharedtuplestore.c:430 utils/sort/sharedtuplestore.c:439 #: utils/sort/sharedtuplestore.c:462 utils/sort/sharedtuplestore.c:479 @@ -28786,16 +28306,14 @@ msgid "unexpected chunk in shared tuplestore temporary file" msgstr "trozo inesperado en archivo temporal del tuplestore compartido" #: utils/sort/sharedtuplestore.c:569 -#, fuzzy, c-format -#| msgid "could not seek block %u in shared tuplestore temporary file" +#, c-format msgid "could not seek to block %u in shared tuplestore temporary file" -msgstr "no se pudo posicionar (seek) al bloque %u en el archivo temporal del tuplestore compartido" +msgstr "no se pudo posicionar (seek) en el bloque %u en el archivo temporal del tuplestore compartido" #: utils/sort/sharedtuplestore.c:576 -#, fuzzy, c-format -#| msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" +#, c-format msgid "could not read from shared tuplestore temporary file: read only %zu of %zu bytes" -msgstr "no se pudo leer el archivo temporal de hash-join: se leyeron sólo %zu de %zu bytes" +msgstr "no se pudo leer el archivo temporal del tuplestore compartido: se leyeron sólo %zu de %zu bytes" #: utils/sort/tuplesort.c:3216 #, c-format @@ -28828,225 +28346,219 @@ msgstr "no se pudo posicionar (seek) en el archivo temporal del tuplestore" #: utils/sort/tuplestore.c:1477 utils/sort/tuplestore.c:1540 #: utils/sort/tuplestore.c:1548 -#, fuzzy, c-format -#| msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" +#, c-format msgid "could not read from tuplestore temporary file: read only %zu of %zu bytes" -msgstr "no se pudo leer el archivo temporal de hash-join: se leyeron sólo %zu de %zu bytes" +msgstr "no se pudo leer el archivo temporal del tuplestore: se leyeron sólo %zu de %zu bytes" #: utils/time/snapmgr.c:568 #, c-format msgid "The source transaction is not running anymore." msgstr "La transacción de origen ya no está en ejecución." -#: utils/time/snapmgr.c:1147 +#: utils/time/snapmgr.c:1162 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "no se puede exportar snapshots desde una subtransacción" -#: utils/time/snapmgr.c:1306 utils/time/snapmgr.c:1311 -#: utils/time/snapmgr.c:1316 utils/time/snapmgr.c:1331 -#: utils/time/snapmgr.c:1336 utils/time/snapmgr.c:1341 -#: utils/time/snapmgr.c:1356 utils/time/snapmgr.c:1361 -#: utils/time/snapmgr.c:1366 utils/time/snapmgr.c:1468 -#: utils/time/snapmgr.c:1484 utils/time/snapmgr.c:1509 +#: utils/time/snapmgr.c:1321 utils/time/snapmgr.c:1326 +#: utils/time/snapmgr.c:1331 utils/time/snapmgr.c:1346 +#: utils/time/snapmgr.c:1351 utils/time/snapmgr.c:1356 +#: utils/time/snapmgr.c:1371 utils/time/snapmgr.c:1376 +#: utils/time/snapmgr.c:1381 utils/time/snapmgr.c:1483 +#: utils/time/snapmgr.c:1499 utils/time/snapmgr.c:1524 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "datos no válidos en archivo de snapshot «%s»" -#: utils/time/snapmgr.c:1403 +#: utils/time/snapmgr.c:1418 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "SET TRANSACTION SNAPSHOT debe ser llamado antes de cualquier consulta" -#: utils/time/snapmgr.c:1412 +#: utils/time/snapmgr.c:1427 #, c-format msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" msgstr "una transacción que importa un snapshot no debe tener nivel de aislación SERIALIZABLE o REPEATABLE READ" -#: utils/time/snapmgr.c:1421 utils/time/snapmgr.c:1430 +#: utils/time/snapmgr.c:1436 utils/time/snapmgr.c:1445 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "identificador de snapshot no válido: «%s»" -#: utils/time/snapmgr.c:1522 +#: utils/time/snapmgr.c:1537 #, c-format msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" msgstr "una transacción serializable no puede importar un snapshot desde una transacción no serializable" -#: utils/time/snapmgr.c:1526 +#: utils/time/snapmgr.c:1541 #, c-format msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" msgstr "una transacción serializable que no es de sólo lectura no puede importar un snapshot de una transacción de sólo lectura" -#: utils/time/snapmgr.c:1541 +#: utils/time/snapmgr.c:1556 #, c-format msgid "cannot import a snapshot from a different database" msgstr "no se puede importar un snapshot desde una base de datos diferente" -#~ msgid "Number of tuple inserts prior to index cleanup as a fraction of reltuples." -#~ msgstr "Número de inserts de tuplas antes de ejecutar una limpieza de índice, como fracción de reltuples." - -#~ msgid "For RAID arrays, this should be approximately the number of drive spindles in the array." -#~ msgstr "Para arrays RAID, esto debería ser aproximadamente la cantidad de discos en el array." +#~ msgid " -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n" +#~ msgstr " -o OPCIONES pasar «OPCIONES» a cada proceso servidor (obsoleto)\n" -#~ msgid "Emit a warning for constructs that changed meaning since PostgreSQL 9.4." -#~ msgstr "Emitir una advertencia en constructos que cambiaron significado desde PostgreSQL 9.4." +#~ msgid " read=%.3f" +#~ msgstr " lectura=%.3f" -#~ msgid "Version and Platform Compatibility" -#~ msgstr "Compatibilidad de Versión y Plataforma" +#~ msgid " write=%.3f" +#~ msgstr " escritura=%.3f" -#~ msgid "Client Connection Defaults" -#~ msgstr "Valores por Omisión de Conexiones" +#~ msgid "\"%s\" has now caught up with upstream server" +#~ msgstr "«%s» ha alcanzado al servidor de origen" -#~ msgid "Statistics" -#~ msgstr "Estadísticas" +#~ msgid "\"%s\": removed %.0f row versions in %u pages" +#~ msgstr "«%s»: se eliminaron %.0f versiones de filas en %u páginas" -#~ msgid "Process Title" -#~ msgstr "Título de Proceso" +#~ msgid "\"%s\": removed %d dead item identifiers in %u pages" +#~ msgstr "«%s»: se eliminaron %d identificadores de elementos muertos en %u páginas" -#~ msgid "Reporting and Logging" -#~ msgstr "Reporte y Registro" +#~ msgid "%s %s will create implicit index \"%s\" for table \"%s\"" +#~ msgstr "%s %s creará el índice implícito «%s» para la tabla «%s»" -#~ msgid "Query Tuning" -#~ msgstr "Afinamiento de Consultas" +#~ msgid "%s will create implicit sequence \"%s\" for serial column \"%s.%s\"" +#~ msgstr "%s creará una secuencia implícita «%s» para la columna serial «%s.%s»" -#~ msgid "Replication" -#~ msgstr "Replicación" +#~ msgid "%u page is entirely empty.\n" +#~ msgid_plural "%u pages are entirely empty.\n" +#~ msgstr[0] "%u página está completamente vacía.\n" +#~ msgstr[1] "%u páginas están completamente vacías.\n" -#~ msgid "Write-Ahead Log" -#~ msgstr "Write-Ahead Log" +#~ msgid "%u page removed.\n" +#~ msgid_plural "%u pages removed.\n" +#~ msgstr[0] "%u página eliminada.\n" +#~ msgstr[1] "%u páginas eliminadas.\n" -#~ msgid "Resource Usage" -#~ msgstr "Uso de Recursos" +#~ msgid "COPY BINARY is not supported to stdout or from stdin" +#~ msgstr "COPY BINARY no está soportado a la salida estándar o desde la entrada estándar" -#~ msgid "connection authorized: user=%s database=%s" -#~ msgstr "conexión autorizada: usuario=%s database=%s" +#~ msgid "Client Connection Defaults" +#~ msgstr "Valores por Omisión de Conexiones" -#~ msgid "connection authorized: user=%s database=%s application_name=%s" -#~ msgstr "conexión autorizada: usuario=%s base de datos=%s application_name=%s" +#~ msgid "Either set wal_level to \"replica\" on the master, or turn off hot_standby here." +#~ msgstr "Defina wal_level a «replica» en el maestro, o bien desactive hot_standby en este servidor." -#~ msgid "connection authorized: user=%s database=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -#~ msgstr "conexión autorizada: usuario=%s base de datos=%s SSL activo (protocolo=%s, cifrado=%s, bits=%d, compresión=%s" +#~ msgid "Emit a warning for constructs that changed meaning since PostgreSQL 9.4." +#~ msgstr "Emitir una advertencia en constructos que cambiaron significado desde PostgreSQL 9.4." -#~ msgid "connection authorized: user=%s database=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -#~ msgstr "conexión autorizada: usuario=%s base_de_datos=%s application_name=%s SSL activo (protocolo=%s, cifrado=%s, bits=%d, compresión=%s)" +#~ msgid "For RAID arrays, this should be approximately the number of drive spindles in the array." +#~ msgstr "Para arrays RAID, esto debería ser aproximadamente la cantidad de discos en el array." -#~ msgid "replication connection authorized: user=%s application_name=%s" -#~ msgstr "conexión de replicación autorizada: usuario=%s application_name=%s" +#~ msgid "GSSAPI encryption can only be used with gss, trust, or reject authentication methods" +#~ msgstr "el cifrado GSSAPI sólo puede ser usado con los métodos gss, trust o reject" -#~ msgid "replication connection authorized: user=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -#~ msgstr "conexión de replicación autorizada: usuario=%s SSL activo (protocolo=%s, cifrado=%s, bits=%d, compresión=%s)" +#~ msgid "GSSAPI encryption only supports gss, trust, or reject authentication" +#~ msgstr "El cifrado GSSAPI sólo soporta autentificación gss, trust o reject" -#~ msgid "on" -#~ msgstr "activado" +#~ msgid "GSSAPI is not supported in protocol version 2" +#~ msgstr "GSSAPI no está soportado por el protocolo versión 2" -#~ msgid "off" -#~ msgstr "desactivado" +#~ msgid "I/O Timings:" +#~ msgstr "Tiempos de E/S:" -#~ msgid "replication connection authorized: user=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -#~ msgstr "conexión de replicación autorizada: usuario=%s application_name=%s SSL activo (protocolo=%s, cifrado=%s, bits=%d, compresión=%s)" +#~ msgid "INOUT arguments are permitted." +#~ msgstr "Argumentos INOUT están permitidos." -#~ msgid "loaded library \"%s\"" -#~ msgstr "biblioteca «%s» cargada" +#~ msgid "Is another postmaster already running on port %d? If not, remove socket file \"%s\" and retry." +#~ msgstr "¿Hay otro postmaster corriendo en el puerto %d? Si no, elimine el socket «%s» y reintente." -#~ msgid "You need to rebuild PostgreSQL using --with-libxml." -#~ msgstr "Necesita reconstruir PostgreSQL usando --with-libxml." +#~ msgid "MultiXact member stop limit is now %u based on MultiXact %u" +#~ msgstr "el límite de detención de miembros de multixact es ahora %u basado en el multixact %u" -#~ msgid "wrong data type: %u, expected %u" -#~ msgstr "tipo de dato erróneo: %u, se esperaba %u" +#~ msgid "MultiXactId wrap limit is %u, limited by database with OID %u" +#~ msgstr "el límite para el reciclaje de MultiXactId es %u, limitado por base de datos con OID %u" -#~ msgid "invalid concatenation of jsonb objects" -#~ msgstr "concatenación no válida de objetos jsonb" +#~ msgid "Number of tuple inserts prior to index cleanup as a fraction of reltuples." +#~ msgstr "Número de inserts de tuplas antes de ejecutar una limpieza de índice, como fracción de reltuples." -#~ msgid "wrong element type" -#~ msgstr "el tipo de elemento es erróneo" +#~ msgid "ORIGIN message sent out of order" +#~ msgstr "mensaje ORIGIN enviado fuera de orden" -#~ msgid "logical replication launcher shutting down" -#~ msgstr "lanzador de replicación lógica apagándose" +#~ msgid "OpenSSL failure" +#~ msgstr "falla de OpenSSL" -#~ msgid "bind %s to %s" -#~ msgstr "bind %s a %s" +#~ msgid "Process %d waits for %s on %s." +#~ msgstr "El proceso %d espera %s en %s." -#~ msgid "parse %s: %s" -#~ msgstr "parse %s: %s" +#~ msgid "Process Title" +#~ msgstr "Título de Proceso" -#~ msgid "unexpected EOF on client connection" -#~ msgstr "se encontró fin de archivo inesperado en la conexión del cliente" +#~ msgid "Query Tuning" +#~ msgstr "Afinamiento de Consultas" -#~ msgid "could not fsync file \"%s\" but retrying: %m" -#~ msgstr "no se pudo sincronizar (fsync) archivo «%s» pero reintentando: %m" +#~ msgid "REINDEX is not yet implemented for partitioned indexes" +#~ msgstr "REINDEX no está implementado aún para tablas particionadas" -#~ msgid "could not forward fsync request because request queue is full" -#~ msgstr "no se pudo enviar una petición fsync porque la cola de peticiones está llena" +#~ msgid "REINDEX of partitioned tables is not yet implemented, skipping \"%s\"" +#~ msgstr "REINDEX de tablas particionadas no está implementado aún, omitiendo «%s»" -#~ msgid "sending cancel to blocking autovacuum PID %d" -#~ msgstr "enviando señal de cancelación a la tarea autovacuum bloqueante con PID %d" +#~ msgid "Replication" +#~ msgstr "Replicación" -#~ msgid "Process %d waits for %s on %s." -#~ msgstr "El proceso %d espera %s en %s." - -#~ msgid "deferrable snapshot was unsafe; trying a new one" -#~ msgstr "la instantánea postergada era insegura; intentando con una nueva" - -#~ msgid "\"%s\" has now caught up with upstream server" -#~ msgstr "«%s» ha alcanzado al servidor de origen" +#~ msgid "Reporting and Logging" +#~ msgstr "Reporte y Registro" -#~ msgid "unexpected standby message type \"%c\", after receiving CopyDone" -#~ msgstr "mensaje de standby de tipo «%c» inesperado, después de recibir CopyDone" +#~ msgid "Resource Usage" +#~ msgstr "Uso de Recursos" -#~ msgid "standby \"%s\" now has synchronous standby priority %u" -#~ msgstr "el standby «%s» ahora tiene prioridad sincrónica %u" +#~ msgid "SASL authentication is not supported in protocol version 2" +#~ msgstr "autentificación SASL no está soportada en el protocolo versión 2" -#~ msgid "logical replication apply worker for subscription \"%s\" will restart because subscription's publications were changed" -#~ msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se reiniciará porque las publicaciones de la suscripción fueron cambiadas" +#~ msgid "SSL connection from \"%s\"" +#~ msgstr "conexión SSL desde «%s»" -#~ msgid "logical replication apply worker for subscription \"%s\" will restart because the replication slot name was changed" -#~ msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se reiniciará porque el nombre del slot de replicación fue cambiado" +#~ msgid "SSL off" +#~ msgstr "SSL inactivo" -#~ msgid "logical replication apply worker for subscription \"%s\" will restart because the connection information was changed" -#~ msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se reiniciará porque la información de conexión fue cambiada" +#~ msgid "SSPI is not supported in protocol version 2" +#~ msgstr "SSPI no está soportado por el protocolo versión 2" -#~ msgid "could not fetch table info for table \"%s.%s\": %s" -#~ msgstr "no se pudo obtener información de la tabla «%s.%s»: %s" +#~ msgid "Statistics" +#~ msgstr "Estadísticas" -#~ msgid "only superusers can query or manipulate replication origins" -#~ msgstr "debe ser superusuario para consultar o manipular orígenes de replicación" +#~ msgid "The error was: %s" +#~ msgstr "El error fue: %s" -#~ msgid "logical replication launcher started" -#~ msgstr "lanzador de replicación lógica iniciado" +#~ msgid "There were %.0f unused item identifiers.\n" +#~ msgstr "Hubo %.0f identificadores de ítem sin usar.\n" -#~ msgid "starting logical replication worker for subscription \"%s\"" -#~ msgstr "iniciando el proceso ayudante de replicación lógica para la suscripción «%s»" +#~ msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation" +#~ msgstr "Utilice ALTER TABLE ... DETACH PARTITION ... FINALIZE para completar la operación de desprendimiento pendiente" -#~ msgid "could not reread block %d of file \"%s\": %m" -#~ msgstr "no se pudo leer el bloque %d del archivo «%s»: %m" +#~ msgid "Version and Platform Compatibility" +#~ msgstr "Compatibilidad de Versión y Plataforma" -#~ msgid "could not fseek in file \"%s\": %m" -#~ msgstr "no se pudo posicionar (fseek) el archivo «%s»: %m" +#~ msgid "Write-Ahead Log" +#~ msgstr "Write-Ahead Log" -#~ msgid "could not read from file \"%s\"" -#~ msgstr "no se pudo leer del archivo «%s»" +#~ msgid "You need to rebuild PostgreSQL using --with-libxml." +#~ msgstr "Necesita reconstruir PostgreSQL usando --with-libxml." -#~ msgid "logger shutting down" -#~ msgstr "proceso logger apagándose" +#~ msgid "arguments declared \"anycompatiblerange\" are not all alike" +#~ msgstr "los argumentos declarados «anycompatiblerange» no son todos parecidos" -#~ msgid "starting background worker process \"%s\"" -#~ msgstr "iniciando el proceso ayudante «%s»" +#~ msgid "arguments declared \"anyelement\" are not all alike" +#~ msgstr "los argumentos declarados «anyelement» no son de tipos compatibles" -#~ msgid "could not fork archiver: %m" -#~ msgstr "no se pudo lanzar el proceso archivador: %m" +#~ msgid "arguments declared \"anyrange\" are not all alike" +#~ msgstr "los argumentos declarados «anyrange» no son de tipos compatibles" -#~ msgid "compacted fsync request queue from %d entries to %d entries" -#~ msgstr "la cola de peticiones de fsync fue compactada de %d a %d elementos" +#~ msgid "array assignment requires type %s but expression is of type %s" +#~ msgstr "la asignación de array debe tener tipo %s pero la expresión es de tipo %s" -#~ msgid "unregistering background worker \"%s\"" -#~ msgstr "des-registrando el proceso ayudante «%s»" +#~ msgid "at least one of leftarg or rightarg must be specified" +#~ msgstr "debe especificar al menos uno de los argumentos izquierdo o derecho" -#~ msgid "registering background worker \"%s\"" -#~ msgstr "registrando el proceso ayudante «%s»" +#~ msgid "authentication file line too long" +#~ msgstr "línea en el archivo de autentificación demasiado larga" -#~ msgid "autovacuum: processing database \"%s\"" -#~ msgstr "autovacuum: procesando la base de datos «%s»" +#~ msgid "automatic analyze of table \"%s.%s.%s\" system usage: %s" +#~ msgstr "analyze automático de la tabla «%s.%s.%s»: uso del sistema: %s" #~ msgid "autovacuum launcher shutting down" #~ msgstr "lanzador de autovacuum apagándose" @@ -29054,172 +28566,254 @@ msgstr "no se puede importar un snapshot desde una base de datos diferente" #~ msgid "autovacuum launcher started" #~ msgstr "lanzador de autovacuum iniciado" -#~ msgid "disabling huge pages" -#~ msgstr "desactivando «huge pages»" +#~ msgid "autovacuum: processing database \"%s\"" +#~ msgstr "autovacuum: procesando la base de datos «%s»" -#~ msgid "could not enable Lock Pages in Memory user right" -#~ msgstr "no se pudo activar el privilegio «Bloquear páginas en la memoria»" +#~ msgid "backup label %s in file \"%s\"" +#~ msgstr "etiqueta de respaldo %s en archivo «%s»" -#~ msgid "could not enable Lock Pages in Memory user right: error code %lu" -#~ msgstr "no se pudo activar el privilegio «Bloquear páginas en la memoria»: código de error %lu" +#~ msgid "backup time %s in file \"%s\"" +#~ msgstr "tiempo de respaldo %s en archivo «%s»" + +#~ msgid "backup timeline %u in file \"%s\"" +#~ msgstr "línea de tiempo %u en archivo «%s»" + +#~ msgid "bind %s to %s" +#~ msgstr "bind %s a %s" + +#~ msgid "building index \"%s\" on table \"%s\" serially" +#~ msgstr "construyendo índice «%s» en la tabla «%s» en forma serial" + +#~ msgid "building index \"%s\" on table \"%s\" with request for %d parallel worker" +#~ msgid_plural "building index \"%s\" on table \"%s\" with request for %d parallel workers" +#~ msgstr[0] "construyendo índice «%s» en la tabla «%s» solicitando %d ayudante paralelo" +#~ msgstr[1] "construyendo índice «%s» en la tabla «%s» solicitando %d ayudantes paralelos" + +#~ msgid "cannot PREPARE a transaction that has manipulated logical replication workers" +#~ msgstr "no se puede hacer PREPARE de una transacción que ha manipulado procesos ayudantes de replicación lógica" + +#~ msgid "cannot convert NaN to bigint" +#~ msgstr "no se puede convertir NaN a bigint" + +#~ msgid "cannot convert NaN to integer" +#~ msgstr "no se puede convertir NaN a entero" + +#~ msgid "cannot convert NaN to smallint" +#~ msgstr "no se puede convertir NaN a smallint" + +#~ msgid "cannot reindex invalid index on TOAST table concurrently" +#~ msgstr "no se puede reindexar el índice no válido en una tabla TOAST concurrentemente" + +#~ msgid "checkpoint record is at %X/%X" +#~ msgstr "el registro del punto de control está en %X/%X" + +#~ msgid "checkpoint skipped because system is idle" +#~ msgstr "omitiendo checkpoint porque el sistema está inactivo" #~ msgid "collation of partition bound value for column \"%s\" does not match partition key collation \"%s\"" #~ msgstr "el ordenamiento (collation) del valor de borde de partición para la columna «%s» no coincide con el ordenamiento de la llave de particionamiento «%s»" +#~ msgid "compacted fsync request queue from %d entries to %d entries" +#~ msgstr "la cola de peticiones de fsync fue compactada de %d a %d elementos" + +#~ msgid "connection authorized: user=%s database=%s" +#~ msgstr "conexión autorizada: usuario=%s database=%s" + +#~ msgid "connection authorized: user=%s database=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" +#~ msgstr "conexión autorizada: usuario=%s base de datos=%s SSL activo (protocolo=%s, cifrado=%s, bits=%d, compresión=%s" + +#~ msgid "connection authorized: user=%s database=%s application_name=%s" +#~ msgstr "conexión autorizada: usuario=%s base de datos=%s application_name=%s" + +#~ msgid "connection authorized: user=%s database=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" +#~ msgstr "conexión autorizada: usuario=%s base_de_datos=%s application_name=%s SSL activo (protocolo=%s, cifrado=%s, bits=%d, compresión=%s)" + +#~ msgid "connection lost during COPY to stdout" +#~ msgstr "se perdió la conexión durante COPY a la salida estándar" + +#~ msgid "connection was re-authenticated" +#~ msgstr "la conexión fue reautenticada" + +#, c-format +#~ msgid "could not compute %s hash: %s" +#~ msgstr "no se pudo calcular el hash %s: %s" + #~ msgid "could not determine which collation to use for partition bound expression" #~ msgstr "no se pudo determinar qué ordenamiento (collation) usar para la expresión de borde de particionamiento" -#~ msgid "%s will create implicit sequence \"%s\" for serial column \"%s.%s\"" -#~ msgstr "%s creará una secuencia implícita «%s» para la columna serial «%s.%s»" +#~ msgid "could not enable Lock Pages in Memory user right" +#~ msgstr "no se pudo activar el privilegio «Bloquear páginas en la memoria»" -#~ msgid "array assignment requires type %s but expression is of type %s" -#~ msgstr "la asignación de array debe tener tipo %s pero la expresión es de tipo %s" +#~ msgid "could not enable Lock Pages in Memory user right: error code %lu" +#~ msgstr "no se pudo activar el privilegio «Bloquear páginas en la memoria»: código de error %lu" -#~ msgid "operator precedence change: %s is now lower precedence than %s" -#~ msgstr "cambio de precedencia de operadores: %s es ahora de menor precedencia que %s" +#~ msgid "could not fetch table info for table \"%s.%s\": %s" +#~ msgstr "no se pudo obtener información de la tabla «%s.%s»: %s" -#~ msgid "arguments declared \"anycompatiblerange\" are not all alike" -#~ msgstr "los argumentos declarados «anycompatiblerange» no son todos parecidos" +#~ msgid "could not fork archiver: %m" +#~ msgstr "no se pudo lanzar el proceso archivador: %m" -#~ msgid "arguments declared \"anyrange\" are not all alike" -#~ msgstr "los argumentos declarados «anyrange» no son de tipos compatibles" +#~ msgid "could not forward fsync request because request queue is full" +#~ msgstr "no se pudo enviar una petición fsync porque la cola de peticiones está llena" -#~ msgid "arguments declared \"anyelement\" are not all alike" -#~ msgstr "los argumentos declarados «anyelement» no son de tipos compatibles" +#~ msgid "could not fseek in file \"%s\": %m" +#~ msgstr "no se pudo posicionar (fseek) el archivo «%s»: %m" -#~ msgid " -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n" -#~ msgstr " -o OPCIONES pasar «OPCIONES» a cada proceso servidor (obsoleto)\n" +#~ msgid "could not fsync file \"%s\" but retrying: %m" +#~ msgstr "no se pudo sincronizar (fsync) archivo «%s» pero reintentando: %m" -#~ msgid "Is another postmaster already running on port %d? If not, remove socket file \"%s\" and retry." -#~ msgstr "¿Hay otro postmaster corriendo en el puerto %d? Si no, elimine el socket «%s» y reintente." +#~ msgid "could not read from file \"%s\"" +#~ msgstr "no se pudo leer del archivo «%s»" -#~ msgid "setsockopt(SO_REUSEADDR) failed for %s address \"%s\": %m" -#~ msgstr "setsockopt(SO_REUSEADDR) falló para la dirección %s «%s»: %m" +#~ msgid "could not reread block %d of file \"%s\": %m" +#~ msgstr "no se pudo leer el bloque %d del archivo «%s»: %m" -#~ msgid "GSSAPI encryption only supports gss, trust, or reject authentication" -#~ msgstr "El cifrado GSSAPI sólo soporta autentificación gss, trust o reject" +#~ msgid "deferrable snapshot was unsafe; trying a new one" +#~ msgstr "la instantánea postergada era insegura; intentando con una nueva" -#~ msgid "authentication file line too long" -#~ msgstr "línea en el archivo de autentificación demasiado larga" +#~ msgid "destination buffer too small" +#~ msgstr "el búfer destino es demasiado pequeño" -#~ msgid "SSL connection from \"%s\"" -#~ msgstr "conexión SSL desde «%s»" +#~ msgid "disabling huge pages" +#~ msgstr "desactivando «huge pages»" -#~ msgid "SSPI is not supported in protocol version 2" -#~ msgstr "SSPI no está soportado por el protocolo versión 2" +#~ msgid "distance in phrase operator should be non-negative and less than %d" +#~ msgstr "la distancia en el operador de frases debe ser no negativa y menor que %d" -#~ msgid "GSSAPI is not supported in protocol version 2" -#~ msgstr "GSSAPI no está soportado por el protocolo versión 2" +#~ msgid "distance in phrase operator should not be greater than %d" +#~ msgstr "distancia en operador de frases no debe ser mayor que %d" -#~ msgid "SASL authentication is not supported in protocol version 2" -#~ msgstr "autentificación SASL no está soportada en el protocolo versión 2" +#~ msgid "drop auto-cascades to %s" +#~ msgstr "eliminando automáticamente %s" -#~ msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\"" -#~ msgstr "no hay una línea en pg_hba.conf para «%s», usuario «%s», base de datos «%s»" +#~ msgid "initializing for hot standby" +#~ msgstr "inicializando para hot standby" -#~ msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\"" -#~ msgstr "no hay una línea en pg_hba.conf para la conexión de replicación desde el servidor «%s», usuario «%s»" +#~ msgid "insufficient columns in %s constraint definition" +#~ msgstr "columnas insuficientes en definición de restricción %s" -#~ msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\"" -#~ msgstr "pg_hba.conf rechaza la conexión para el servidor «%s», usuario «%s», base de datos «%s»" +#~ msgid "invalid concatenation of jsonb objects" +#~ msgstr "concatenación no válida de objetos jsonb" -#~ msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\"" -#~ msgstr "pg_hba.conf rechaza la conexión de replicación para el servidor «%s», usuario «%s»" +#~ msgid "invalid hexadecimal digit" +#~ msgstr "dígito hexadecimal no válido" -#~ msgid "SSL off" -#~ msgstr "SSL inactivo" +#~ msgid "invalid logical replication message type \"%c\"" +#~ msgstr "tipo de mensaje de replicación lógica «%c» no válido" -#~ msgid "GSSAPI encryption can only be used with gss, trust, or reject authentication methods" -#~ msgstr "el cifrado GSSAPI sólo puede ser usado con los métodos gss, trust o reject" +#~ msgid "loaded library \"%s\"" +#~ msgstr "biblioteca «%s» cargada" -#~ msgid "time to inline: %.3fs, opt: %.3fs, emit: %.3fs" -#~ msgstr "tiempo en «inline»: %.3fs, opt: %.3fs, emisión: %.3fs" +#~ msgid "logger shutting down" +#~ msgstr "proceso logger apagándose" -#~ msgid "must be superuser to alter replication users" -#~ msgstr "debe ser superusuario para alterar usuarios de replicación" +#~ msgid "logical replication apply worker for subscription \"%s\" will restart because subscription's publications were changed" +#~ msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se reiniciará porque las publicaciones de la suscripción fueron cambiadas" + +#~ msgid "logical replication apply worker for subscription \"%s\" will restart because the connection information was changed" +#~ msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se reiniciará porque la información de conexión fue cambiada" + +#~ msgid "logical replication apply worker for subscription \"%s\" will restart because the replication slot name was changed" +#~ msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se reiniciará porque el nombre del slot de replicación fue cambiado" + +#~ msgid "logical replication launcher shutting down" +#~ msgstr "lanzador de replicación lógica apagándose" + +#~ msgid "logical replication launcher started" +#~ msgstr "lanzador de replicación lógica iniciado" + +#~ msgid "modulus for hash partition must be a positive integer" +#~ msgstr "el módulo para una partición hash debe ser un entero positivo" #~ msgid "moving row to another partition during a BEFORE trigger is not supported" #~ msgstr "mover registros a otra partición durante un trigger BEFORE no está soportado" -#~ msgid "updated partition constraint for default partition \"%s\" is implied by existing constraints" -#~ msgstr "la restricción de partición actualizada para la partición por omisión \"%s\" está implícita en las restricciones existentes" +#~ msgid "must be superuser to alter replication users" +#~ msgstr "debe ser superusuario para alterar usuarios de replicación" -#~ msgid "partition constraint for table \"%s\" is implied by existing constraints" -#~ msgstr "la restricción de partición para la tabla \"%s\" está implícita en las restricciones existentes" +#~ msgid "must be superuser to drop access methods" +#~ msgstr "debe ser superusuario para eliminar métodos de acceso" -#~ msgid "validating foreign key constraint \"%s\"" -#~ msgstr "validando restricción de llave foránea «%s»" +#~ msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\"" +#~ msgstr "no hay una línea en pg_hba.conf para «%s», usuario «%s», base de datos «%s»" -#~ msgid "verifying table \"%s\"" -#~ msgstr "verificando tabla «%s»" +#~ msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\"" +#~ msgstr "no hay una línea en pg_hba.conf para la conexión de replicación desde el servidor «%s», usuario «%s»" -#~ msgid "rewriting table \"%s\"" -#~ msgstr "reescribiendo tabla «%s»" +#~ msgid "off" +#~ msgstr "desactivado" -#~ msgid "The error was: %s" -#~ msgstr "El error fue: %s" +#~ msgid "oldest MultiXactId member is at offset %u" +#~ msgstr "el miembro de multixact más antiguo está en la posición %u" -#~ msgid "table \"%s.%s\" removed from subscription \"%s\"" -#~ msgstr "tabla «%s.%s» eliminada de suscripción «%s»" +#~ msgid "on" +#~ msgstr "activado" -#~ msgid "table \"%s.%s\" added to subscription \"%s\"" -#~ msgstr "tabla «%s.%s» agregada a suscripción «%s»" +#~ msgid "only superusers can query or manipulate replication origins" +#~ msgstr "debe ser superusuario para consultar o manipular orígenes de replicación" -#~ msgid "at least one of leftarg or rightarg must be specified" -#~ msgstr "debe especificar al menos uno de los argumentos izquierdo o derecho" +#~ msgid "operator precedence change: %s is now lower precedence than %s" +#~ msgstr "cambio de precedencia de operadores: %s es ahora de menor precedencia que %s" -#~ msgid "REINDEX is not yet implemented for partitioned indexes" -#~ msgstr "REINDEX no está implementado aún para tablas particionadas" +#~ msgid "overflow of destination buffer in hex decoding" +#~ msgstr "desbordamiento de búfer destino en decodificación hexadecimal" -#~ msgid "cannot reindex invalid index on TOAST table concurrently" -#~ msgstr "no se puede reindexar el índice no válido en una tabla TOAST concurrentemente" +#~ msgid "overflow of destination buffer in hex encoding" +#~ msgstr "desbordamiento de búfer destino en codificación hexadecimal" -#~ msgid "%s %s will create implicit index \"%s\" for table \"%s\"" -#~ msgstr "%s %s creará el índice implícito «%s» para la tabla «%s»" +#~ msgid "parse %s: %s" +#~ msgstr "parse %s: %s" -#~ msgid "insufficient columns in %s constraint definition" -#~ msgstr "columnas insuficientes en definición de restricción %s" +#~ msgid "partition constraint for table \"%s\" is implied by existing constraints" +#~ msgstr "la restricción de partición para la tabla \"%s\" está implícita en las restricciones existentes" -#~ msgid "INOUT arguments are permitted." -#~ msgstr "Argumentos INOUT están permitidos." +#~ msgid "password too long" +#~ msgstr "la contraseña es demasiado larga" + +#~ msgid "pclose failed: %m" +#~ msgstr "pclose falló: %m" + +#~ msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\"" +#~ msgstr "pg_hba.conf rechaza la conexión para el servidor «%s», usuario «%s», base de datos «%s»" + +#~ msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\"" +#~ msgstr "pg_hba.conf rechaza la conexión de replicación para el servidor «%s», usuario «%s»" #~ msgid "procedures cannot have OUT arguments" #~ msgstr "los procedimientos no pueden tener argumentos OUT" -#~ msgid "connection lost during COPY to stdout" -#~ msgstr "se perdió la conexión durante COPY a la salida estándar" +#~ msgid "recycled write-ahead log file \"%s\"" +#~ msgstr "reciclado archivo de WAL «%s»" -#~ msgid "COPY BINARY is not supported to stdout or from stdin" -#~ msgstr "COPY BINARY no está soportado a la salida estándar o desde la entrada estándar" +#~ msgid "registering background worker \"%s\"" +#~ msgstr "registrando el proceso ayudante «%s»" -#~ msgid "automatic analyze of table \"%s.%s.%s\" system usage: %s" -#~ msgstr "analyze automático de la tabla «%s.%s.%s»: uso del sistema: %s" +#~ msgid "removing file \"%s\"" +#~ msgstr "eliminando el archivo «%s»" -#~ msgid "must be superuser to drop access methods" -#~ msgstr "debe ser superusuario para eliminar métodos de acceso" +#~ msgid "removing write-ahead log file \"%s\"" +#~ msgstr "eliminando archivo de WAL «%s»" -#~ msgid "REINDEX of partitioned tables is not yet implemented, skipping \"%s\"" -#~ msgstr "REINDEX de tablas particionadas no está implementado aún, omitiendo «%s»" +#~ msgid "replication connection authorized: user=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" +#~ msgstr "conexión de replicación autorizada: usuario=%s SSL activo (protocolo=%s, cifrado=%s, bits=%d, compresión=%s)" -#~ msgid "building index \"%s\" on table \"%s\" with request for %d parallel worker" -#~ msgid_plural "building index \"%s\" on table \"%s\" with request for %d parallel workers" -#~ msgstr[0] "construyendo índice «%s» en la tabla «%s» solicitando %d ayudante paralelo" -#~ msgstr[1] "construyendo índice «%s» en la tabla «%s» solicitando %d ayudantes paralelos" +#~ msgid "replication connection authorized: user=%s application_name=%s" +#~ msgstr "conexión de replicación autorizada: usuario=%s application_name=%s" -#~ msgid "building index \"%s\" on table \"%s\" serially" -#~ msgstr "construyendo índice «%s» en la tabla «%s» en forma serial" +#~ msgid "replication connection authorized: user=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" +#~ msgstr "conexión de replicación autorizada: usuario=%s application_name=%s SSL activo (protocolo=%s, cifrado=%s, bits=%d, compresión=%s)" -#~ msgid "drop auto-cascades to %s" -#~ msgstr "eliminando automáticamente %s" +#~ msgid "rewriting table \"%s\"" +#~ msgstr "reescribiendo tabla «%s»" -#~ msgid "backup timeline %u in file \"%s\"" -#~ msgstr "línea de tiempo %u en archivo «%s»" +#~ msgid "role \"%s\" could not be removed from policy \"%s\" on \"%s\"" +#~ msgstr "el rol «%s» no pudo ser eliminado de la política «%s» en «%s»" -#~ msgid "backup label %s in file \"%s\"" -#~ msgstr "etiqueta de respaldo %s en archivo «%s»" +#~ msgid "sending cancel to blocking autovacuum PID %d" +#~ msgstr "enviando señal de cancelación a la tarea autovacuum bloqueante con PID %d" -#~ msgid "backup time %s in file \"%s\"" -#~ msgstr "tiempo de respaldo %s en archivo «%s»" +#~ msgid "setsockopt(SO_REUSEADDR) failed for %s address \"%s\": %m" +#~ msgstr "setsockopt(SO_REUSEADDR) falló para la dirección %s «%s»: %m" #~ msgid "skipping restartpoint, already performed at %X/%X" #~ msgstr "omitiendo el restartpoint, ya fue llevado a cabo en %X/%X" @@ -29227,58 +28821,59 @@ msgstr "no se puede importar un snapshot desde una base de datos diferente" #~ msgid "skipping restartpoint, recovery has already ended" #~ msgstr "omitiendo el restartpoint, la recuperación ya ha terminado" -#~ msgid "checkpoint skipped because system is idle" -#~ msgstr "omitiendo checkpoint porque el sistema está inactivo" +#~ msgid "standby \"%s\" now has synchronous standby priority %u" +#~ msgstr "el standby «%s» ahora tiene prioridad sincrónica %u" -#~ msgid "initializing for hot standby" -#~ msgstr "inicializando para hot standby" +#~ msgid "starting background worker process \"%s\"" +#~ msgstr "iniciando el proceso ayudante «%s»" -#~ msgid "checkpoint record is at %X/%X" -#~ msgstr "el registro del punto de control está en %X/%X" +#~ msgid "starting logical replication worker for subscription \"%s\"" +#~ msgstr "iniciando el proceso ayudante de replicación lógica para la suscripción «%s»" -#~ msgid "Either set wal_level to \"replica\" on the master, or turn off hot_standby here." -#~ msgstr "Defina wal_level a «replica» en el maestro, o bien desactive hot_standby en este servidor." +#~ msgid "success" +#~ msgstr "éxito" -#~ msgid "removing write-ahead log file \"%s\"" -#~ msgstr "eliminando archivo de WAL «%s»" +#~ msgid "system usage: %s\n" +#~ msgstr "uso de sistema: %s\n" -#~ msgid "recycled write-ahead log file \"%s\"" -#~ msgstr "reciclado archivo de WAL «%s»" +#~ msgid "table \"%s.%s\" added to subscription \"%s\"" +#~ msgstr "tabla «%s.%s» agregada a suscripción «%s»" -#~ msgid "updated min recovery point to %X/%X on timeline %u" -#~ msgstr "el punto mínimo de recuperación fue actualizado a %X/%X en el timeline %u" +#~ msgid "table \"%s.%s\" removed from subscription \"%s\"" +#~ msgstr "tabla «%s.%s» eliminada de suscripción «%s»" -#~ msgid "cannot PREPARE a transaction that has manipulated logical replication workers" -#~ msgstr "no se puede hacer PREPARE de una transacción que ha manipulado procesos ayudantes de replicación lógica" +#~ msgid "time to inline: %.3fs, opt: %.3fs, emit: %.3fs" +#~ msgstr "tiempo en «inline»: %.3fs, opt: %.3fs, emisión: %.3fs" #~ msgid "transaction ID wrap limit is %u, limited by database with OID %u" #~ msgstr "el límite para el reciclaje de ID de transacciones es %u, limitado por base de datos con OID %u" -#~ msgid "removing file \"%s\"" -#~ msgstr "eliminando el archivo «%s»" +#~ msgid "unexpected EOF on client connection" +#~ msgstr "se encontró fin de archivo inesperado en la conexión del cliente" -#~ msgid "MultiXact member stop limit is now %u based on MultiXact %u" -#~ msgstr "el límite de detención de miembros de multixact es ahora %u basado en el multixact %u" +#~ msgid "unexpected standby message type \"%c\", after receiving CopyDone" +#~ msgstr "mensaje de standby de tipo «%c» inesperado, después de recibir CopyDone" -#~ msgid "oldest MultiXactId member is at offset %u" -#~ msgstr "el miembro de multixact más antiguo está en la posición %u" +#~ msgid "unregistering background worker \"%s\"" +#~ msgstr "des-registrando el proceso ayudante «%s»" -#~ msgid "MultiXactId wrap limit is %u, limited by database with OID %u" -#~ msgstr "el límite para el reciclaje de MultiXactId es %u, limitado por base de datos con OID %u" +#~ msgid "unsupported LZ4 compression method" +#~ msgstr "método de compresión LZ4 no soportado" -#~ msgid "%u page is entirely empty.\n" -#~ msgid_plural "%u pages are entirely empty.\n" -#~ msgstr[0] "%u página está completamente vacía.\n" -#~ msgstr[1] "%u páginas están completamente vacías.\n" +#~ msgid "updated min recovery point to %X/%X on timeline %u" +#~ msgstr "el punto mínimo de recuperación fue actualizado a %X/%X en el timeline %u" -#~ msgid "There were %.0f unused item identifiers.\n" -#~ msgstr "Hubo %.0f identificadores de ítem sin usar.\n" +#~ msgid "updated partition constraint for default partition \"%s\" is implied by existing constraints" +#~ msgstr "la restricción de partición actualizada para la partición por omisión \"%s\" está implícita en las restricciones existentes" -#~ msgid "\"%s\": removed %.0f row versions in %u pages" -#~ msgstr "«%s»: se eliminaron %.0f versiones de filas en %u páginas" +#~ msgid "validating foreign key constraint \"%s\"" +#~ msgstr "validando restricción de llave foránea «%s»" -#~ msgid "password too long" -#~ msgstr "la contraseña es demasiado larga" +#~ msgid "verifying table \"%s\"" +#~ msgstr "verificando tabla «%s»" -#~ msgid "pclose failed: %m" -#~ msgstr "pclose falló: %m" +#~ msgid "wrong data type: %u, expected %u" +#~ msgstr "tipo de dato erróneo: %u, se esperaba %u" + +#~ msgid "wrong element type" +#~ msgstr "el tipo de elemento es erróneo" diff --git a/src/backend/po/fr.po b/src/backend/po/fr.po index 0d953bc457..aaba6e56f8 100644 --- a/src/backend/po/fr.po +++ b/src/backend/po/fr.po @@ -1,53 +1,55 @@ -# translation of postgres.po to fr_fr -# french message translation file for postgres +# LANGUAGE message translation file for postgres +# Copyright (C) 2003-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the postgres (PostgreSQL) package. # # Use these quotes: « %s » -# Guillaume Lelarge , 2003-2009. +# +# Guillaume Lelarge , 2003-2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-06-19 16:10+0000\n" -"PO-Revision-Date: 2021-06-21 12:29+0200\n" -"Last-Translator: Christophe Courtois \n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 2.4.3\n" +"X-Generator: Poedit 3.0.1\n" #: ../common/config_info.c:134 ../common/config_info.c:142 ../common/config_info.c:150 ../common/config_info.c:158 ../common/config_info.c:166 ../common/config_info.c:174 ../common/config_info.c:182 ../common/config_info.c:190 msgid "not recorded" msgstr "non enregistré" -#: ../common/controldata_utils.c:68 ../common/controldata_utils.c:73 commands/copyfrom.c:1516 commands/extension.c:3456 utils/adt/genfile.c:128 +#: ../common/controldata_utils.c:68 ../common/controldata_utils.c:73 commands/copyfrom.c:1516 commands/extension.c:3464 utils/adt/genfile.c:128 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" -#: ../common/controldata_utils.c:86 ../common/controldata_utils.c:89 access/transam/timeline.c:143 access/transam/timeline.c:362 access/transam/twophase.c:1271 access/transam/xlog.c:3545 access/transam/xlog.c:4770 access/transam/xlog.c:11336 access/transam/xlog.c:11349 access/transam/xlog.c:11802 access/transam/xlog.c:11882 access/transam/xlog.c:11919 access/transam/xlog.c:11979 access/transam/xlogfuncs.c:703 access/transam/xlogfuncs.c:722 commands/extension.c:3466 libpq/hba.c:534 replication/basebackup.c:2020 replication/logical/origin.c:729 replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4905 replication/logical/snapbuild.c:1733 -#: replication/logical/snapbuild.c:1775 replication/logical/snapbuild.c:1802 replication/slot.c:1700 replication/slot.c:1741 replication/walsender.c:544 storage/file/buffile.c:445 storage/file/copydir.c:195 utils/adt/genfile.c:202 utils/adt/misc.c:859 utils/cache/relmapper.c:741 +#: ../common/controldata_utils.c:86 ../common/controldata_utils.c:89 access/transam/timeline.c:143 access/transam/timeline.c:362 access/transam/twophase.c:1327 access/transam/xlog.c:3569 access/transam/xlog.c:4807 access/transam/xlog.c:11516 access/transam/xlog.c:11529 access/transam/xlog.c:11982 access/transam/xlog.c:12062 access/transam/xlog.c:12099 access/transam/xlog.c:12159 access/transam/xlogfuncs.c:703 access/transam/xlogfuncs.c:722 commands/extension.c:3474 libpq/hba.c:534 replication/basebackup.c:2020 replication/logical/origin.c:729 replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4917 replication/logical/snapbuild.c:1749 +#: replication/logical/snapbuild.c:1791 replication/logical/snapbuild.c:1818 replication/slot.c:1720 replication/slot.c:1761 replication/walsender.c:544 storage/file/buffile.c:445 storage/file/copydir.c:195 utils/adt/genfile.c:202 utils/adt/misc.c:859 utils/cache/relmapper.c:744 #, c-format msgid "could not read file \"%s\": %m" msgstr "n'a pas pu lire le fichier « %s » : %m" -#: ../common/controldata_utils.c:97 ../common/controldata_utils.c:101 access/transam/xlog.c:3550 access/transam/xlog.c:4775 replication/basebackup.c:2024 replication/logical/origin.c:734 replication/logical/origin.c:773 replication/logical/snapbuild.c:1738 replication/logical/snapbuild.c:1780 replication/logical/snapbuild.c:1807 replication/slot.c:1704 replication/slot.c:1745 replication/walsender.c:549 utils/cache/relmapper.c:745 +#: ../common/controldata_utils.c:97 ../common/controldata_utils.c:101 access/transam/xlog.c:3574 access/transam/xlog.c:4812 replication/basebackup.c:2024 replication/logical/origin.c:734 replication/logical/origin.c:773 replication/logical/snapbuild.c:1754 replication/logical/snapbuild.c:1796 replication/logical/snapbuild.c:1823 replication/slot.c:1724 replication/slot.c:1765 replication/walsender.c:549 utils/cache/relmapper.c:748 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" -#: ../common/controldata_utils.c:112 ../common/controldata_utils.c:117 ../common/controldata_utils.c:256 ../common/controldata_utils.c:259 access/heap/rewriteheap.c:1185 access/heap/rewriteheap.c:1288 access/transam/timeline.c:392 access/transam/timeline.c:438 access/transam/timeline.c:516 access/transam/twophase.c:1283 access/transam/twophase.c:1680 access/transam/xlog.c:3417 access/transam/xlog.c:3585 access/transam/xlog.c:3590 access/transam/xlog.c:3918 access/transam/xlog.c:4740 access/transam/xlog.c:5665 access/transam/xlogfuncs.c:728 commands/copyfrom.c:1576 commands/copyto.c:328 libpq/be-fsstubs.c:462 libpq/be-fsstubs.c:533 replication/logical/origin.c:667 -#: replication/logical/origin.c:806 replication/logical/reorderbuffer.c:4963 replication/logical/snapbuild.c:1642 replication/logical/snapbuild.c:1815 replication/slot.c:1591 replication/slot.c:1752 replication/walsender.c:559 storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:738 storage/file/fd.c:3534 storage/file/fd.c:3637 utils/cache/relmapper.c:753 utils/cache/relmapper.c:892 +#: ../common/controldata_utils.c:112 ../common/controldata_utils.c:117 ../common/controldata_utils.c:256 ../common/controldata_utils.c:259 access/heap/rewriteheap.c:1185 access/heap/rewriteheap.c:1288 access/transam/timeline.c:392 access/transam/timeline.c:438 access/transam/timeline.c:516 access/transam/twophase.c:1339 access/transam/twophase.c:1744 access/transam/xlog.c:3441 access/transam/xlog.c:3609 access/transam/xlog.c:3614 access/transam/xlog.c:3942 access/transam/xlog.c:4777 access/transam/xlog.c:5702 access/transam/xlogfuncs.c:728 commands/copyfrom.c:1576 commands/copyto.c:328 libpq/be-fsstubs.c:455 libpq/be-fsstubs.c:525 replication/logical/origin.c:667 +#: replication/logical/origin.c:806 replication/logical/reorderbuffer.c:4975 replication/logical/snapbuild.c:1658 replication/logical/snapbuild.c:1831 replication/slot.c:1611 replication/slot.c:1772 replication/walsender.c:559 storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:738 storage/file/fd.c:3536 storage/file/fd.c:3639 utils/cache/relmapper.c:759 utils/cache/relmapper.c:898 #, c-format msgid "could not close file \"%s\": %m" msgstr "n'a pas pu fermer le fichier « %s » : %m" #: ../common/controldata_utils.c:135 msgid "byte ordering mismatch" -msgstr "incohérence dans l'ordre des octets" +msgstr "différence de l'ordre des octets" #: ../common/controldata_utils.c:137 #, c-format @@ -57,32 +59,32 @@ msgid "" "used by this program. In that case the results below would be incorrect, and\n" "the PostgreSQL installation would be incompatible with this data directory." msgstr "" -"ATTENTION : possible incohérence dans l'ordre des octets\n" +"possible incohérence dans l'ordre des octets\n" "L'ordre des octets utilisé pour enregistrer le fichier pg_control peut ne\n" "pas correspondre à celui utilisé par ce programme. Dans ce cas, les\n" "résultats ci-dessous sont incorrects, et l'installation de PostgreSQL\n" "est incompatible avec ce répertoire des données." -#: ../common/controldata_utils.c:197 ../common/controldata_utils.c:203 ../common/file_utils.c:232 ../common/file_utils.c:291 ../common/file_utils.c:365 access/heap/rewriteheap.c:1271 access/transam/timeline.c:111 access/transam/timeline.c:251 access/transam/timeline.c:348 access/transam/twophase.c:1227 access/transam/xlog.c:3303 access/transam/xlog.c:3459 access/transam/xlog.c:3500 access/transam/xlog.c:3698 access/transam/xlog.c:3783 access/transam/xlog.c:3886 access/transam/xlog.c:4760 access/transam/xlogutils.c:803 postmaster/syslogger.c:1488 replication/basebackup.c:616 replication/basebackup.c:1610 replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3570 -#: replication/logical/reorderbuffer.c:4119 replication/logical/reorderbuffer.c:4885 replication/logical/snapbuild.c:1597 replication/logical/snapbuild.c:1704 replication/slot.c:1672 replication/walsender.c:517 replication/walsender.c:2526 storage/file/copydir.c:161 storage/file/fd.c:713 storage/file/fd.c:3521 storage/file/fd.c:3608 storage/smgr/md.c:502 utils/cache/relmapper.c:724 utils/cache/relmapper.c:836 utils/error/elog.c:1938 utils/init/miscinit.c:1346 utils/init/miscinit.c:1480 utils/init/miscinit.c:1557 utils/misc/guc.c:8604 utils/misc/guc.c:8636 +#: ../common/controldata_utils.c:197 ../common/controldata_utils.c:203 ../common/file_utils.c:232 ../common/file_utils.c:291 ../common/file_utils.c:365 access/heap/rewriteheap.c:1271 access/transam/timeline.c:111 access/transam/timeline.c:251 access/transam/timeline.c:348 access/transam/twophase.c:1283 access/transam/xlog.c:3327 access/transam/xlog.c:3483 access/transam/xlog.c:3524 access/transam/xlog.c:3722 access/transam/xlog.c:3807 access/transam/xlog.c:3910 access/transam/xlog.c:4797 access/transam/xlogutils.c:803 postmaster/syslogger.c:1488 replication/basebackup.c:616 replication/basebackup.c:1610 replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3572 +#: replication/logical/reorderbuffer.c:4121 replication/logical/reorderbuffer.c:4897 replication/logical/snapbuild.c:1613 replication/logical/snapbuild.c:1720 replication/slot.c:1692 replication/walsender.c:517 replication/walsender.c:2535 storage/file/copydir.c:161 storage/file/fd.c:713 storage/file/fd.c:3300 storage/file/fd.c:3523 storage/file/fd.c:3610 storage/smgr/md.c:503 utils/cache/relmapper.c:724 utils/cache/relmapper.c:842 utils/error/elog.c:1938 utils/init/miscinit.c:1346 utils/init/miscinit.c:1480 utils/init/miscinit.c:1557 utils/misc/guc.c:8605 utils/misc/guc.c:8637 #, c-format msgid "could not open file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier « %s » : %m" -#: ../common/controldata_utils.c:221 ../common/controldata_utils.c:224 access/transam/twophase.c:1653 access/transam/twophase.c:1662 access/transam/xlog.c:11093 access/transam/xlog.c:11131 access/transam/xlog.c:11544 access/transam/xlogfuncs.c:782 postmaster/postmaster.c:5659 postmaster/syslogger.c:1499 postmaster/syslogger.c:1512 utils/cache/relmapper.c:870 +#: ../common/controldata_utils.c:221 ../common/controldata_utils.c:224 access/transam/twophase.c:1717 access/transam/twophase.c:1726 access/transam/xlog.c:11273 access/transam/xlog.c:11311 access/transam/xlog.c:11724 access/transam/xlogfuncs.c:782 postmaster/postmaster.c:5682 postmaster/syslogger.c:1499 postmaster/syslogger.c:1512 utils/cache/relmapper.c:876 #, c-format msgid "could not write file \"%s\": %m" msgstr "impossible d'écrire le fichier « %s » : %m" -#: ../common/controldata_utils.c:239 ../common/controldata_utils.c:245 ../common/file_utils.c:303 ../common/file_utils.c:373 access/heap/rewriteheap.c:967 access/heap/rewriteheap.c:1179 access/heap/rewriteheap.c:1282 access/transam/timeline.c:432 access/transam/timeline.c:510 access/transam/twophase.c:1674 access/transam/xlog.c:3410 access/transam/xlog.c:3579 access/transam/xlog.c:4733 access/transam/xlog.c:10584 access/transam/xlog.c:10625 replication/logical/snapbuild.c:1635 replication/slot.c:1577 replication/slot.c:1682 storage/file/fd.c:730 storage/file/fd.c:3629 storage/smgr/md.c:950 storage/smgr/md.c:991 storage/sync/sync.c:417 utils/cache/relmapper.c:885 -#: utils/misc/guc.c:8391 +#: ../common/controldata_utils.c:239 ../common/controldata_utils.c:245 ../common/file_utils.c:303 ../common/file_utils.c:373 access/heap/rewriteheap.c:967 access/heap/rewriteheap.c:1179 access/heap/rewriteheap.c:1282 access/transam/timeline.c:432 access/transam/timeline.c:510 access/transam/twophase.c:1738 access/transam/xlog.c:3434 access/transam/xlog.c:3603 access/transam/xlog.c:4770 access/transam/xlog.c:10764 access/transam/xlog.c:10805 replication/logical/snapbuild.c:1651 replication/slot.c:1597 replication/slot.c:1702 storage/file/fd.c:730 storage/file/fd.c:3631 storage/smgr/md.c:951 storage/smgr/md.c:992 storage/sync/sync.c:441 utils/cache/relmapper.c:891 +#: utils/misc/guc.c:8392 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" -#: ../common/cryptohash_openssl.c:104 ../common/exec.c:522 ../common/exec.c:567 ../common/exec.c:659 ../common/hmac_openssl.c:103 ../common/psprintf.c:143 ../common/stringinfo.c:305 ../port/path.c:630 ../port/path.c:668 ../port/path.c:685 access/transam/twophase.c:1341 access/transam/xlog.c:6631 lib/dshash.c:246 libpq/auth.c:1482 libpq/auth.c:1550 libpq/auth.c:2108 libpq/be-secure-gssapi.c:520 postmaster/bgworker.c:349 postmaster/bgworker.c:948 postmaster/postmaster.c:2516 postmaster/postmaster.c:4175 postmaster/postmaster.c:4845 postmaster/postmaster.c:5584 postmaster/postmaster.c:5948 replication/libpqwalreceiver/libpqwalreceiver.c:283 replication/logical/logical.c:205 -#: replication/walsender.c:591 storage/buffer/localbuf.c:442 storage/file/fd.c:882 storage/file/fd.c:1352 storage/file/fd.c:1513 storage/file/fd.c:2321 storage/ipc/procarray.c:1411 storage/ipc/procarray.c:2205 storage/ipc/procarray.c:2212 storage/ipc/procarray.c:2701 storage/ipc/procarray.c:3325 utils/adt/cryptohashfuncs.c:46 utils/adt/cryptohashfuncs.c:66 utils/adt/formatting.c:1699 utils/adt/formatting.c:1823 utils/adt/formatting.c:1948 utils/adt/pg_locale.c:450 utils/adt/pg_locale.c:614 utils/adt/regexp.c:223 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:513 utils/hash/dynahash.c:613 utils/hash/dynahash.c:1116 utils/mb/mbutils.c:401 utils/mb/mbutils.c:429 utils/mb/mbutils.c:814 -#: utils/mb/mbutils.c:841 utils/misc/guc.c:5035 utils/misc/guc.c:5051 utils/misc/guc.c:5064 utils/misc/guc.c:8369 utils/misc/tzparser.c:467 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:701 utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:234 utils/mmgr/mcxt.c:888 utils/mmgr/mcxt.c:924 utils/mmgr/mcxt.c:962 utils/mmgr/mcxt.c:1000 utils/mmgr/mcxt.c:1082 utils/mmgr/mcxt.c:1113 utils/mmgr/mcxt.c:1149 utils/mmgr/mcxt.c:1201 utils/mmgr/mcxt.c:1236 utils/mmgr/mcxt.c:1271 utils/mmgr/slab.c:236 +#: ../common/cryptohash_openssl.c:104 ../common/exec.c:522 ../common/exec.c:567 ../common/exec.c:659 ../common/hmac_openssl.c:101 ../common/psprintf.c:143 ../common/stringinfo.c:305 ../port/path.c:630 ../port/path.c:668 ../port/path.c:685 access/transam/twophase.c:1397 access/transam/xlog.c:6677 lib/dshash.c:246 libpq/auth.c:1491 libpq/auth.c:1559 libpq/auth.c:2117 libpq/be-secure-gssapi.c:520 postmaster/bgworker.c:349 postmaster/bgworker.c:948 postmaster/postmaster.c:2540 postmaster/postmaster.c:4198 postmaster/postmaster.c:4868 postmaster/postmaster.c:5607 postmaster/postmaster.c:5971 replication/libpqwalreceiver/libpqwalreceiver.c:283 replication/logical/logical.c:205 +#: replication/walsender.c:591 storage/buffer/localbuf.c:442 storage/file/fd.c:882 storage/file/fd.c:1354 storage/file/fd.c:1515 storage/file/fd.c:2323 storage/ipc/procarray.c:1427 storage/ipc/procarray.c:2252 storage/ipc/procarray.c:2259 storage/ipc/procarray.c:2761 storage/ipc/procarray.c:3385 utils/adt/cryptohashfuncs.c:46 utils/adt/cryptohashfuncs.c:66 utils/adt/formatting.c:1699 utils/adt/formatting.c:1823 utils/adt/formatting.c:1948 utils/adt/pg_locale.c:450 utils/adt/pg_locale.c:614 utils/adt/regexp.c:223 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:513 utils/hash/dynahash.c:613 utils/hash/dynahash.c:1116 utils/mb/mbutils.c:401 utils/mb/mbutils.c:429 utils/mb/mbutils.c:814 +#: utils/mb/mbutils.c:841 utils/misc/guc.c:5036 utils/misc/guc.c:5052 utils/misc/guc.c:5065 utils/misc/guc.c:8370 utils/misc/tzparser.c:467 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:701 utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:234 utils/mmgr/mcxt.c:888 utils/mmgr/mcxt.c:924 utils/mmgr/mcxt.c:962 utils/mmgr/mcxt.c:1000 utils/mmgr/mcxt.c:1088 utils/mmgr/mcxt.c:1119 utils/mmgr/mcxt.c:1155 utils/mmgr/mcxt.c:1207 utils/mmgr/mcxt.c:1242 utils/mmgr/mcxt.c:1277 utils/mmgr/slab.c:236 #, c-format msgid "out of memory" msgstr "mémoire épuisée" @@ -112,7 +114,7 @@ msgstr "n'a pas pu trouver un « %s » à exécuter" msgid "could not change directory to \"%s\": %m" msgstr "n'a pas pu modifier le répertoire par « %s » : %m" -#: ../common/exec.c:286 access/transam/xlog.c:10967 replication/basebackup.c:1428 utils/adt/misc.c:340 +#: ../common/exec.c:286 access/transam/xlog.c:11147 replication/basebackup.c:1428 utils/adt/misc.c:340 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "n'a pas pu lire le lien symbolique « %s » : %m" @@ -132,52 +134,27 @@ msgstr "mémoire épuisée\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" -#: ../common/file_utils.c:87 ../common/file_utils.c:451 ../common/file_utils.c:455 access/transam/twophase.c:1239 access/transam/xlog.c:11069 access/transam/xlog.c:11107 access/transam/xlog.c:11324 access/transam/xlogarchive.c:110 access/transam/xlogarchive.c:227 commands/copyfrom.c:1526 commands/copyto.c:728 commands/extension.c:3445 commands/tablespace.c:807 commands/tablespace.c:898 guc-file.l:1060 replication/basebackup.c:439 replication/basebackup.c:622 replication/basebackup.c:698 replication/logical/snapbuild.c:1514 storage/file/copydir.c:68 storage/file/copydir.c:107 storage/file/fd.c:1863 storage/file/fd.c:1949 storage/file/fd.c:3149 storage/file/fd.c:3353 +#: ../common/file_utils.c:87 ../common/file_utils.c:451 ../common/file_utils.c:455 access/transam/twophase.c:1295 access/transam/xlog.c:11249 access/transam/xlog.c:11287 access/transam/xlog.c:11504 access/transam/xlogarchive.c:110 access/transam/xlogarchive.c:227 commands/copyfrom.c:1526 commands/copyto.c:726 commands/extension.c:3453 commands/tablespace.c:803 commands/tablespace.c:894 guc-file.l:1062 replication/basebackup.c:439 replication/basebackup.c:622 replication/basebackup.c:698 replication/logical/snapbuild.c:1530 storage/file/copydir.c:68 storage/file/copydir.c:107 storage/file/fd.c:1865 storage/file/fd.c:1951 storage/file/fd.c:3151 storage/file/fd.c:3355 #: utils/adt/dbsize.c:70 utils/adt/dbsize.c:222 utils/adt/dbsize.c:302 utils/adt/genfile.c:418 utils/adt/genfile.c:644 #, c-format msgid "could not stat file \"%s\": %m" msgstr "n'a pas pu tester le fichier « %s » : %m" -#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:730 commands/tablespace.c:740 postmaster/postmaster.c:1515 storage/file/fd.c:2724 storage/file/reinit.c:122 utils/adt/misc.c:262 utils/misc/tzparser.c:338 +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:726 commands/tablespace.c:736 postmaster/postmaster.c:1515 storage/file/fd.c:2726 storage/file/reinit.c:122 utils/adt/misc.c:262 utils/misc/tzparser.c:338 #, c-format msgid "could not open directory \"%s\": %m" msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" -#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2736 +#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2738 #, c-format msgid "could not read directory \"%s\": %m" msgstr "n'a pas pu lire le répertoire « %s » : %m" -#: ../common/file_utils.c:383 access/transam/xlogarchive.c:412 postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1654 replication/slot.c:643 replication/slot.c:1463 replication/slot.c:1605 storage/file/fd.c:748 storage/file/fd.c:846 utils/time/snapmgr.c:1265 +#: ../common/file_utils.c:383 access/transam/xlogarchive.c:412 postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1670 replication/slot.c:643 replication/slot.c:1483 replication/slot.c:1625 storage/file/fd.c:748 storage/file/fd.c:846 utils/time/snapmgr.c:1280 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" -#: ../common/hex.c:54 -#, c-format -msgid "invalid hexadecimal digit" -msgstr "chiffre hexadécimal invalide" - -#: ../common/hex.c:59 -#, c-format -msgid "invalid hexadecimal digit: \"%.*s\"" -msgstr "chiffre hexadécimal invalide : « %.*s »" - -#: ../common/hex.c:90 -#, c-format -msgid "overflow of destination buffer in hex encoding" -msgstr "Calcule les identifiants de requête" - -#: ../common/hex.c:136 ../common/hex.c:141 -#, c-format -msgid "invalid hexadecimal data: odd number of digits" -msgstr "donnée hexadécimale invalide : nombre pair de chiffres" - -#: ../common/hex.c:152 -#, c-format -msgid "overflow of destination buffer in hex decoding" -msgstr "" - #: ../common/jsonapi.c:1066 #, c-format msgid "Escape sequence \"\\%s\" is invalid." @@ -196,17 +173,17 @@ msgstr "Attendait une fin de l'entrée, mais a trouvé « %s »." #: ../common/jsonapi.c:1075 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "Élément de tableau ou « ] » attendu, mais trouvé « %s »." +msgstr "Élément de tableau ou « ] » attendu, mais « %s » trouvé." #: ../common/jsonapi.c:1078 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "« , » ou « ] » attendu, mais trouvé « %s »." +msgstr "« , » ou « ] » attendu, mais « %s » trouvé." #: ../common/jsonapi.c:1081 #, c-format msgid "Expected \":\", but found \"%s\"." -msgstr "« : » attendu, mais trouvé « %s »." +msgstr "« : » attendu, mais « %s » trouvé." #: ../common/jsonapi.c:1084 #, c-format @@ -220,12 +197,12 @@ msgstr "La chaîne en entrée se ferme de manière inattendue." #: ../common/jsonapi.c:1089 #, c-format msgid "Expected string or \"}\", but found \"%s\"." -msgstr "Chaîne ou « } » attendu, mais « %s » trouvé" +msgstr "Chaîne ou « } » attendu, mais « %s » trouvé." #: ../common/jsonapi.c:1092 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "« , » ou « } » attendu, mais trouvé « %s »." +msgstr "« , » ou « } » attendu, mais « %s » trouvé." #: ../common/jsonapi.c:1095 #, c-format @@ -290,7 +267,7 @@ msgstr "nom du fork invalide" msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." msgstr "Les noms de fork valides sont « main », « fsm », « vm » et « init »." -#: ../common/restricted_token.c:64 libpq/auth.c:1512 libpq/auth.c:2544 +#: ../common/restricted_token.c:64 libpq/auth.c:1521 libpq/auth.c:2553 #, c-format msgid "could not load library \"%s\": error code %lu" msgstr "n'a pas pu charger la bibliothèque « %s » : code d'erreur %lu" @@ -363,7 +340,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "n'a pas pu trouver l'identifiant réel %ld de l'utilisateur : %s" -#: ../common/username.c:45 libpq/auth.c:2044 +#: ../common/username.c:45 libpq/auth.c:2053 msgid "user does not exist" msgstr "l'utilisateur n'existe pas" @@ -489,7 +466,7 @@ msgstr "n'a pas pu vérifier l'appartenance du jeton d'accès : code d'erreur %l msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "requête de résumé d'intervalle BRIN pour la page « %s » de l'index « %u » n'a pas été enregistrée" -#: access/brin/brin.c:1015 access/brin/brin.c:1092 access/gin/ginfast.c:1035 access/transam/xlog.c:10746 access/transam/xlog.c:11275 access/transam/xlogfuncs.c:274 access/transam/xlogfuncs.c:301 access/transam/xlogfuncs.c:340 access/transam/xlogfuncs.c:361 access/transam/xlogfuncs.c:382 access/transam/xlogfuncs.c:452 access/transam/xlogfuncs.c:509 +#: access/brin/brin.c:1015 access/brin/brin.c:1092 access/gin/ginfast.c:1035 access/transam/xlog.c:10926 access/transam/xlog.c:11455 access/transam/xlogfuncs.c:274 access/transam/xlogfuncs.c:301 access/transam/xlogfuncs.c:340 access/transam/xlogfuncs.c:361 access/transam/xlogfuncs.c:382 access/transam/xlogfuncs.c:452 access/transam/xlogfuncs.c:509 #, c-format msgid "recovery is in progress" msgstr "restauration en cours" @@ -514,12 +491,12 @@ msgstr "« %s » n'est pas un index BRIN" msgid "could not open parent table of index \"%s\"" msgstr "n'a pas pu ouvrir la table parent de l'index « %s »" -#: access/brin/brin_bloom.c:751 access/brin/brin_bloom.c:793 access/brin/brin_minmax_multi.c:2987 access/brin/brin_minmax_multi.c:3130 statistics/dependencies.c:651 statistics/dependencies.c:704 statistics/mcv.c:1483 statistics/mcv.c:1514 statistics/mvdistinct.c:343 statistics/mvdistinct.c:396 utils/adt/pseudotypes.c:43 utils/adt/pseudotypes.c:77 utils/adt/pseudotypes.c:252 +#: access/brin/brin_bloom.c:751 access/brin/brin_bloom.c:793 access/brin/brin_minmax_multi.c:3004 access/brin/brin_minmax_multi.c:3147 statistics/dependencies.c:662 statistics/dependencies.c:715 statistics/mcv.c:1483 statistics/mcv.c:1514 statistics/mvdistinct.c:343 statistics/mvdistinct.c:396 utils/adt/pseudotypes.c:43 utils/adt/pseudotypes.c:77 utils/adt/pseudotypes.c:252 #, c-format msgid "cannot accept a value of type %s" msgstr "ne peut pas accepter une valeur de type %s" -#: access/brin/brin_minmax_multi.c:2146 access/brin/brin_minmax_multi.c:2153 access/brin/brin_minmax_multi.c:2160 utils/adt/timestamp.c:941 utils/adt/timestamp.c:1515 utils/adt/timestamp.c:1982 utils/adt/timestamp.c:3059 utils/adt/timestamp.c:3064 utils/adt/timestamp.c:3069 utils/adt/timestamp.c:3119 utils/adt/timestamp.c:3126 utils/adt/timestamp.c:3133 utils/adt/timestamp.c:3153 utils/adt/timestamp.c:3160 utils/adt/timestamp.c:3167 utils/adt/timestamp.c:3197 utils/adt/timestamp.c:3205 utils/adt/timestamp.c:3249 utils/adt/timestamp.c:3676 utils/adt/timestamp.c:3801 utils/adt/timestamp.c:4349 +#: access/brin/brin_minmax_multi.c:2163 access/brin/brin_minmax_multi.c:2170 access/brin/brin_minmax_multi.c:2177 utils/adt/timestamp.c:941 utils/adt/timestamp.c:1515 utils/adt/timestamp.c:1982 utils/adt/timestamp.c:3059 utils/adt/timestamp.c:3064 utils/adt/timestamp.c:3069 utils/adt/timestamp.c:3119 utils/adt/timestamp.c:3126 utils/adt/timestamp.c:3133 utils/adt/timestamp.c:3153 utils/adt/timestamp.c:3160 utils/adt/timestamp.c:3167 utils/adt/timestamp.c:3197 utils/adt/timestamp.c:3205 utils/adt/timestamp.c:3249 utils/adt/timestamp.c:3676 utils/adt/timestamp.c:3801 utils/adt/timestamp.c:4359 #, c-format msgid "interval out of range" msgstr "intervalle en dehors des limites" @@ -633,7 +610,7 @@ msgstr "le nombre de colonnes (%d) dépasse la limite (%d)" msgid "number of index columns (%d) exceeds limit (%d)" msgstr "le nombre de colonnes indexées (%d) dépasse la limite (%d)" -#: access/common/indextuple.c:190 access/spgist/spgutils.c:947 +#: access/common/indextuple.c:190 access/spgist/spgutils.c:959 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "la ligne index requiert %zu octets, la taille maximum est %zu" @@ -666,7 +643,7 @@ msgstr "RESET ne doit pas inclure de valeurs pour les paramètres" msgid "unrecognized parameter namespace \"%s\"" msgstr "espace de nom du paramètre « %s » non reconnu" -#: access/common/reloptions.c:1294 utils/misc/guc.c:12514 +#: access/common/reloptions.c:1294 utils/misc/guc.c:12515 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "les tables avec WITH OIDS ne sont pas supportées" @@ -718,8 +695,8 @@ msgstr "valeur invalide pour l'option enum « %s » : %s" #: access/common/toast_compression.c:32 #, c-format -msgid "unsupported LZ4 compression method" -msgstr "méthode compression LZ4 non supportée" +msgid "compression method lz4 not supported" +msgstr "méthode de compression lz4 non supportée" #: access/common/toast_compression.c:33 #, c-format @@ -778,7 +755,7 @@ msgstr "" msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Pour corriger ceci, faites un REINDEX INDEX « %s »." -#: access/gin/ginutil.c:145 executor/execExpr.c:2166 utils/adt/arrayfuncs.c:3818 utils/adt/arrayfuncs.c:6452 utils/adt/rowtypes.c:957 +#: access/gin/ginutil.c:145 executor/execExpr.c:2166 utils/adt/arrayfuncs.c:3819 utils/adt/arrayfuncs.c:6487 utils/adt/rowtypes.c:957 #, c-format msgid "could not identify a comparison function for type %s" msgstr "n'a pas pu identifier une fonction de comparaison pour le type %s" @@ -812,7 +789,7 @@ msgstr "" "Ceci est dû à la division d'une page incomplète à la restauration suite à un\n" "crash avant la mise à jour en 9.1." -#: access/gist/gist.c:761 access/gist/gistutil.c:801 access/gist/gistutil.c:812 access/gist/gistvacuum.c:423 access/hash/hashutil.c:227 access/hash/hashutil.c:238 access/hash/hashutil.c:250 access/hash/hashutil.c:271 access/nbtree/nbtpage.c:810 access/nbtree/nbtpage.c:821 +#: access/gist/gist.c:761 access/gist/gistutil.c:800 access/gist/gistutil.c:811 access/gist/gistvacuum.c:423 access/hash/hashutil.c:227 access/hash/hashutil.c:238 access/hash/hashutil.c:250 access/hash/hashutil.c:271 access/nbtree/nbtpage.c:810 access/nbtree/nbtpage.c:821 #, c-format msgid "Please REINDEX it." msgstr "Merci d'exécuter REINDEX sur cet objet." @@ -820,7 +797,7 @@ msgstr "Merci d'exécuter REINDEX sur cet objet." #: access/gist/gist.c:1175 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" -msgstr "" +msgstr "correction d'une division non terminée dans l'index « %s », bloc %u" #: access/gist/gistsplit.c:446 #, c-format @@ -835,12 +812,12 @@ msgstr "" "ou essayez d'utiliser la colonne comme second dans la commande\n" "CREATE INDEX." -#: access/gist/gistutil.c:798 access/hash/hashutil.c:224 access/nbtree/nbtpage.c:807 +#: access/gist/gistutil.c:797 access/hash/hashutil.c:224 access/nbtree/nbtpage.c:807 #, c-format msgid "index \"%s\" contains unexpected zero page at block %u" msgstr "l'index « %s » contient une page zéro inattendue au bloc %u" -#: access/gist/gistutil.c:809 access/hash/hashutil.c:235 access/hash/hashutil.c:247 access/nbtree/nbtpage.c:818 +#: access/gist/gistutil.c:808 access/hash/hashutil.c:235 access/hash/hashutil.c:247 access/nbtree/nbtpage.c:818 #, c-format msgid "index \"%s\" contains corrupted page at block %u" msgstr "l'index « %s » contient une page corrompue au bloc %u" @@ -859,12 +836,12 @@ msgstr "" "la famille d'opérateur « %s » de la méthode d'accès %s contient la spécification opfamily ORDER BY\n" "incorrecte pour l'opérateur %s" -#: access/hash/hashfunc.c:255 access/hash/hashfunc.c:311 utils/adt/varchar.c:993 utils/adt/varchar.c:1053 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:334 utils/adt/varchar.c:993 utils/adt/varchar.c:1053 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "n'a pas pu déterminer le collationnement à utiliser pour le hachage de chaîne" -#: access/hash/hashfunc.c:256 access/hash/hashfunc.c:312 catalog/heap.c:713 catalog/heap.c:719 commands/createas.c:206 commands/createas.c:503 commands/indexcmds.c:1869 commands/tablecmds.c:16794 commands/view.c:86 regex/regc_pg_locale.c:263 utils/adt/formatting.c:1666 utils/adt/formatting.c:1790 utils/adt/formatting.c:1915 utils/adt/like.c:194 utils/adt/like_support.c:1003 utils/adt/varchar.c:733 utils/adt/varchar.c:994 utils/adt/varchar.c:1054 utils/adt/varlena.c:1524 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:335 catalog/heap.c:713 catalog/heap.c:719 commands/createas.c:206 commands/createas.c:503 commands/indexcmds.c:1869 commands/tablecmds.c:16839 commands/view.c:86 regex/regc_pg_locale.c:263 utils/adt/formatting.c:1666 utils/adt/formatting.c:1790 utils/adt/formatting.c:1915 utils/adt/like.c:194 utils/adt/like_support.c:1003 utils/adt/varchar.c:733 utils/adt/varchar.c:994 utils/adt/varchar.c:1054 utils/adt/varlena.c:1517 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "Utilisez la clause COLLARE pour configurer explicitement le collationnement." @@ -874,7 +851,7 @@ msgstr "Utilisez la clause COLLARE pour configurer explicitement le collationnem msgid "index row size %zu exceeds hash maximum %zu" msgstr "la taille de la ligne index, %zu, dépasse le hachage maximum, %zu" -#: access/hash/hashinsert.c:84 access/spgist/spgdoinsert.c:2004 access/spgist/spgdoinsert.c:2279 access/spgist/spgutils.c:1008 +#: access/hash/hashinsert.c:84 access/spgist/spgdoinsert.c:2004 access/spgist/spgdoinsert.c:2279 access/spgist/spgutils.c:1020 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "Les valeurs plus larges qu'une page de tampon ne peuvent pas être indexées." @@ -931,7 +908,7 @@ msgstr "ne peut pas supprimer les lignes lors d'une opération parallèle" msgid "attempted to delete invisible tuple" msgstr "tentative de supprimer une ligne invisible" -#: access/heap/heapam.c:3209 access/heap/heapam.c:6010 +#: access/heap/heapam.c:3209 access/heap/heapam.c:6019 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "ne peut pas mettre à jour les lignes lors d'une opération parallèle" @@ -941,7 +918,7 @@ msgstr "ne peut pas mettre à jour les lignes lors d'une opération parallèle" msgid "attempted to update invisible tuple" msgstr "tentative de mettre à jour une ligne invisible" -#: access/heap/heapam.c:4663 access/heap/heapam.c:4701 access/heap/heapam.c:4957 access/heap/heapam_handler.c:452 +#: access/heap/heapam.c:4663 access/heap/heapam.c:4701 access/heap/heapam.c:4966 access/heap/heapam_handler.c:456 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "n'a pas pu obtenir un verrou sur la relation « %s »" @@ -961,7 +938,7 @@ msgstr "la ligne est trop grande : taille %zu, taille maximale %zu" msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "n'a pas pu écrire le fichier « %s », a écrit %d de %d : %m" -#: access/heap/rewriteheap.c:1020 access/heap/rewriteheap.c:1138 access/transam/timeline.c:329 access/transam/timeline.c:485 access/transam/xlog.c:3326 access/transam/xlog.c:3514 access/transam/xlog.c:4712 access/transam/xlog.c:11084 access/transam/xlog.c:11122 access/transam/xlog.c:11527 access/transam/xlogfuncs.c:776 postmaster/postmaster.c:4600 postmaster/postmaster.c:5646 replication/logical/origin.c:587 replication/slot.c:1524 storage/file/copydir.c:167 storage/smgr/md.c:218 utils/time/snapmgr.c:1244 +#: access/heap/rewriteheap.c:1020 access/heap/rewriteheap.c:1138 access/transam/timeline.c:329 access/transam/timeline.c:485 access/transam/xlog.c:3350 access/transam/xlog.c:3538 access/transam/xlog.c:4749 access/transam/xlog.c:11264 access/transam/xlog.c:11302 access/transam/xlog.c:11707 access/transam/xlogfuncs.c:776 postmaster/postmaster.c:4623 postmaster/postmaster.c:5669 replication/logical/origin.c:587 replication/slot.c:1544 storage/file/copydir.c:167 storage/smgr/md.c:218 utils/time/snapmgr.c:1259 #, c-format msgid "could not create file \"%s\": %m" msgstr "n'a pas pu créer le fichier « %s » : %m" @@ -971,184 +948,165 @@ msgstr "n'a pas pu créer le fichier « %s » : %m" msgid "could not truncate file \"%s\" to %u: %m" msgstr "n'a pas pu tronquer le fichier « %s » en %u : %m" -#: access/heap/rewriteheap.c:1166 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:502 access/transam/xlog.c:3398 access/transam/xlog.c:3570 access/transam/xlog.c:4724 postmaster/postmaster.c:4610 postmaster/postmaster.c:4620 replication/logical/origin.c:599 replication/logical/origin.c:641 replication/logical/origin.c:660 replication/logical/snapbuild.c:1611 replication/slot.c:1559 storage/file/buffile.c:506 storage/file/copydir.c:207 utils/init/miscinit.c:1421 utils/init/miscinit.c:1432 utils/init/miscinit.c:1440 utils/misc/guc.c:8352 utils/misc/guc.c:8383 utils/misc/guc.c:10292 utils/misc/guc.c:10306 utils/time/snapmgr.c:1249 -#: utils/time/snapmgr.c:1256 +#: access/heap/rewriteheap.c:1166 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:502 access/transam/xlog.c:3422 access/transam/xlog.c:3594 access/transam/xlog.c:4761 postmaster/postmaster.c:4633 postmaster/postmaster.c:4643 replication/logical/origin.c:599 replication/logical/origin.c:641 replication/logical/origin.c:660 replication/logical/snapbuild.c:1627 replication/slot.c:1579 storage/file/buffile.c:506 storage/file/copydir.c:207 utils/init/miscinit.c:1421 utils/init/miscinit.c:1432 utils/init/miscinit.c:1440 utils/misc/guc.c:8353 utils/misc/guc.c:8384 utils/misc/guc.c:10293 utils/misc/guc.c:10307 utils/time/snapmgr.c:1264 +#: utils/time/snapmgr.c:1271 #, c-format msgid "could not write to file \"%s\": %m" msgstr "n'a pas pu écrire dans le fichier « %s » : %m" -#: access/heap/rewriteheap.c:1256 access/transam/twophase.c:1613 access/transam/xlogarchive.c:118 access/transam/xlogarchive.c:422 postmaster/postmaster.c:1096 postmaster/syslogger.c:1465 replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4387 replication/logical/snapbuild.c:1556 replication/logical/snapbuild.c:1972 replication/slot.c:1656 storage/file/fd.c:788 storage/file/fd.c:3169 storage/file/fd.c:3231 storage/file/reinit.c:250 storage/ipc/dsm.c:315 storage/smgr/md.c:344 storage/smgr/md.c:394 storage/sync/sync.c:231 utils/time/snapmgr.c:1589 +#: access/heap/rewriteheap.c:1256 access/transam/twophase.c:1677 access/transam/xlogarchive.c:118 access/transam/xlogarchive.c:422 postmaster/postmaster.c:1096 postmaster/syslogger.c:1465 replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4390 replication/logical/snapbuild.c:1572 replication/logical/snapbuild.c:1988 replication/slot.c:1676 storage/file/fd.c:788 storage/file/fd.c:3171 storage/file/fd.c:3233 storage/file/reinit.c:250 storage/ipc/dsm.c:315 storage/smgr/md.c:344 storage/smgr/md.c:394 storage/sync/sync.c:237 utils/time/snapmgr.c:1604 #, c-format msgid "could not remove file \"%s\": %m" msgstr "n'a pas pu supprimer le fichier « %s » : %m" -#: access/heap/vacuumlazy.c:772 +#: access/heap/vacuumlazy.c:773 #, c-format msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "VACUUM automatique agressif pour éviter un rebouclage des identifiants de transaction dans la table « %s.%s.%s » : %d parcours d'index\n" -#: access/heap/vacuumlazy.c:774 +#: access/heap/vacuumlazy.c:775 #, c-format msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "VACUUM automatique pour éviter un rebouclage des identifiants de transaction dans la table « %s.%s.%s » : parcours d'index : %d\n" -#: access/heap/vacuumlazy.c:779 +#: access/heap/vacuumlazy.c:780 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "VACUUM automatique agressif de la table « %s.%s.%s » : %d parcours d'index\n" -#: access/heap/vacuumlazy.c:781 +#: access/heap/vacuumlazy.c:782 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "VACUUM automatique de la table « %s.%s.%s » : %d parcours d'index\n" -#: access/heap/vacuumlazy.c:788 +#: access/heap/vacuumlazy.c:789 #, c-format msgid "pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n" msgstr "pages : %u supprimées, %u restants, %u ignorées à cause de verrous; %u ignorées car gelées\n" -#: access/heap/vacuumlazy.c:794 +#: access/heap/vacuumlazy.c:795 #, c-format msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable, oldest xmin: %u\n" msgstr "lignes : %lld supprimées, %lld restantes, %lld sont mortes mais pas encore supprimables, plus ancien xmin : %u\n" -#: access/heap/vacuumlazy.c:800 commands/analyze.c:794 -#, c-format -msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" -msgstr "utilisation du cache : %lld récupérés, %lld ratés, %lld modifiés\n" +#: access/heap/vacuumlazy.c:806 +msgid "index scan not needed: " +msgstr "parcours d'index non nécessaire : " + +#: access/heap/vacuumlazy.c:808 +msgid "index scan needed: " +msgstr "parcours d'index nécessaire : " #: access/heap/vacuumlazy.c:810 #, c-format -msgid " %u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" -msgstr "" - -#: access/heap/vacuumlazy.c:813 -msgid "index scan not needed:" -msgstr "parcours d'index non nécessaire :" +msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" +msgstr "%u blocs de la table (%.2f%% au total) ont %lld versions mortes de lignes supprimées\n" #: access/heap/vacuumlazy.c:815 -msgid "index scan needed:" -msgstr "parcours d'index nécessaire :" +msgid "index scan bypassed: " +msgstr "parcours d'index contourné : " + +#: access/heap/vacuumlazy.c:817 +msgid "index scan bypassed by failsafe: " +msgstr "parcours d'index contourné par failsafe : " #: access/heap/vacuumlazy.c:819 #, c-format -msgid " %u pages from table (%.2f%% of total) have %lld dead item identifiers\n" -msgstr "" +msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" +msgstr "%u pages de la table (%.2f%% au total) ont %lld identifiants d'élément mort\n" -#: access/heap/vacuumlazy.c:822 -msgid "index scan bypassed:" -msgstr "" - -#: access/heap/vacuumlazy.c:824 -msgid "index scan bypassed by failsafe:" -msgstr "" - -#: access/heap/vacuumlazy.c:840 +#: access/heap/vacuumlazy.c:834 #, c-format msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" msgstr "index \"%s\": blocs : %u au total, %u nouvellement supprimés, %u actuellement supprimés, %u réutilisables\n" -#: access/heap/vacuumlazy.c:847 commands/analyze.c:798 +#: access/heap/vacuumlazy.c:846 commands/analyze.c:814 #, c-format -msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" -msgstr "vitesse moyenne de lecture : %.3f Mo/s, vitesse moyenne d'écriture : %.3f Mo/s\n" - -#: access/heap/vacuumlazy.c:851 commands/analyze.c:802 -msgid "I/O Timings:" -msgstr "Chronométrages I/O :" +msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" +msgstr "" +"chronométrage I/O : lecture : %.3f ms, écriture : %.3f ms\n" +"\n" -#: access/heap/vacuumlazy.c:853 commands/analyze.c:804 +#: access/heap/vacuumlazy.c:849 commands/analyze.c:817 #, c-format -msgid " read=%.3f" -msgstr " lu=%.3f" +msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" +msgstr "vitesse moyenne de lecture : %.3f Mo/s, vitesse moyenne d'écriture : %.3f Mo/s\n" -#: access/heap/vacuumlazy.c:856 commands/analyze.c:807 +#: access/heap/vacuumlazy.c:852 commands/analyze.c:819 #, c-format -msgid " write=%.3f" -msgstr " écrit=%.3f" +msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" +msgstr "utilisation du cache : %lld récupérés, %lld ratés, %lld modifiés\n" -#: access/heap/vacuumlazy.c:860 +#: access/heap/vacuumlazy.c:857 #, c-format -msgid "system usage: %s\n" -msgstr "utilisation du système : %s\n" +msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" +msgstr "utilisation des WAL : %lld enregistrements, %lld images complètes de blocs, %llu octets\n" -#: access/heap/vacuumlazy.c:862 +#: access/heap/vacuumlazy.c:861 commands/analyze.c:823 #, c-format -msgid "WAL usage: %lld records, %lld full page images, %llu bytes" -msgstr "utilisation des WAL : %lld enregistrements, %lld images complètes de blocs, %llu octets" +msgid "system usage: %s" +msgstr "utilisation du système : %s" -#: access/heap/vacuumlazy.c:937 +#: access/heap/vacuumlazy.c:933 #, c-format msgid "aggressively vacuuming \"%s.%s\"" msgstr "exécution d'un VACUUM agressif sur « %s.%s »" -#: access/heap/vacuumlazy.c:942 commands/cluster.c:898 +#: access/heap/vacuumlazy.c:938 commands/cluster.c:898 #, c-format msgid "vacuuming \"%s.%s\"" msgstr "exécution du VACUUM sur « %s.%s »" -#: access/heap/vacuumlazy.c:1652 +#: access/heap/vacuumlazy.c:1640 access/heap/vacuumlazy.c:2385 #, c-format -msgid "\"%s\": removed %lld dead item identifiers in %u pages" -msgstr "« %s »: %lld versions de ligne supprimées dans %u blocs" +msgid "table \"%s\": removed %lld dead item identifiers in %u pages" +msgstr "table « %s »: %lld versions mortes de ligne supprimées dans %u blocs" -#: access/heap/vacuumlazy.c:1658 +#: access/heap/vacuumlazy.c:1656 #, c-format msgid "%lld dead row versions cannot be removed yet, oldest xmin: %u\n" msgstr "%lld versions de lignes mortes ne peuvent pas encore être supprimées, plus ancien xmin : %u\n" -#: access/heap/vacuumlazy.c:1660 -#, c-format -msgid "%u page removed.\n" -msgid_plural "%u pages removed.\n" -msgstr[0] "%u bloc supprimé.\n" -msgstr[1] "%u blocs supprimés.\n" - -#: access/heap/vacuumlazy.c:1664 +#: access/heap/vacuumlazy.c:1658 #, c-format msgid "Skipped %u page due to buffer pins, " msgid_plural "Skipped %u pages due to buffer pins, " msgstr[0] "Ignore %u page à cause des verrous de blocs, " msgstr[1] "Ignore %u pages à cause des verrous de blocs, " -#: access/heap/vacuumlazy.c:1668 +#: access/heap/vacuumlazy.c:1662 #, c-format msgid "%u frozen page.\n" msgid_plural "%u frozen pages.\n" msgstr[0] "%u page gelée.\n" msgstr[1] "%u pages gelées.\n" -#: access/heap/vacuumlazy.c:1672 commands/indexcmds.c:3986 commands/indexcmds.c:4005 +#: access/heap/vacuumlazy.c:1666 commands/indexcmds.c:3986 commands/indexcmds.c:4005 #, c-format msgid "%s." msgstr "%s." -#: access/heap/vacuumlazy.c:1675 -#, c-format -msgid "\"%s\": found %lld removable, %lld nonremovable row versions in %u out of %u pages" -msgstr "« %s » : trouvé %lld versions de ligne supprimables, %lld non supprimables, dans %u blocs sur %u" - -#: access/heap/vacuumlazy.c:2179 +#: access/heap/vacuumlazy.c:1669 #, c-format -msgid "\"%s\": index scan bypassed: %u pages from table (%.2f%% of total) have %lld dead item identifiers" -msgstr "" +msgid "table \"%s\": found %lld removable, %lld nonremovable row versions in %u out of %u pages" +msgstr "table « %s » : trouvé %lld versions de ligne supprimables, %lld non supprimables, dans %u blocs sur %u" -#: access/heap/vacuumlazy.c:2390 +#: access/heap/vacuumlazy.c:2173 #, c-format -msgid "\"%s\": removed %d dead item identifiers in %u pages" -msgstr "« %s »: %d versions de lignes mortes supprimées dans %u blocs" +msgid "table \"%s\": index scan bypassed: %u pages from table (%.2f%% of total) have %lld dead item identifiers" +msgstr "table \"%s\" : parcours d'index ignoré : %u pages de la table (%.2f%% au total) ont %lld identifiants de ligne morte" -#: access/heap/vacuumlazy.c:2625 +#: access/heap/vacuumlazy.c:2617 #, c-format msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" -msgstr "" +msgstr "ignore la maintenance non essentielle de la table \"%s.%s.%s\" comme mesure de sécurité après %d parcours d'index" -#: access/heap/vacuumlazy.c:2630 +#: access/heap/vacuumlazy.c:2622 #, c-format -msgid "table's relfrozenxid or relminmxid is too far in the past" -msgstr "le relfrozenxid ou le relminmxid de la table est loin dans le passé" +msgid "The table's relfrozenxid or relminmxid is too far in the past." +msgstr "le relfrozenxid ou le relminmxid de la table est trop loin dans le passé" -#: access/heap/vacuumlazy.c:2631 +#: access/heap/vacuumlazy.c:2623 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" @@ -1157,31 +1115,31 @@ msgstr "" "Réfléchissez à augmenter la valeur du paramètre de configuration « maintenance_work_mem » ou « autovacuum_work_mem ».\n" "Vous pouvez aussi réfléchir à d'autres façons d'exécuter un VACUUM pour tenir sur l'allocation des identifiants de transaction." -#: access/heap/vacuumlazy.c:2771 +#: access/heap/vacuumlazy.c:2763 #, c-format msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" msgstr[0] "a lancé %d worker parallélisé pour le nettoyage d'index du VACUUM (planifié : %d)" msgstr[1] "a lancé %d workers parallélisés pour le nettoyage d'index du VACUUM (planifié : %d)" -#: access/heap/vacuumlazy.c:2777 +#: access/heap/vacuumlazy.c:2769 #, c-format msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" msgstr[0] "a lancé %d worker parallélisé pour le vacuum d'index (planifié : %d)" msgstr[1] "a lancé %d workers parallélisés pour le vacuum d'index (planifié : %d)" -#: access/heap/vacuumlazy.c:3066 +#: access/heap/vacuumlazy.c:3063 #, c-format msgid "scanned index \"%s\" to remove %d row versions" msgstr "a parcouru l'index « %s » pour supprimer %d versions de lignes" -#: access/heap/vacuumlazy.c:3123 +#: access/heap/vacuumlazy.c:3120 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "l'index « %s » contient maintenant %.0f versions de ligne dans %u pages" -#: access/heap/vacuumlazy.c:3127 +#: access/heap/vacuumlazy.c:3124 #, c-format msgid "" "%.0f index row versions were removed.\n" @@ -1194,67 +1152,67 @@ msgstr "" "%u blocs d'index sont actuellement supprimés, dont %u sont actuellement réutilisables.\n" "%s." -#: access/heap/vacuumlazy.c:3236 +#: access/heap/vacuumlazy.c:3233 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "« %s » : arrêt du TRUNCATE à cause d'un conflit dans la demande de verrou" -#: access/heap/vacuumlazy.c:3302 +#: access/heap/vacuumlazy.c:3299 #, c-format -msgid "\"%s\": truncated %u to %u pages" -msgstr "« %s » : %u pages tronqués en %u" +msgid "table \"%s\": truncated %u to %u pages" +msgstr "table « %s » : %u pages tronqués en %u" -#: access/heap/vacuumlazy.c:3366 +#: access/heap/vacuumlazy.c:3363 #, c-format -msgid "\"%s\": suspending truncate due to conflicting lock request" -msgstr "« %s » : mis en suspens du TRUNCATE à cause d'un conflit dans la demande de verrou" +msgid "table \"%s\": suspending truncate due to conflicting lock request" +msgstr "table « %s » : mis en suspens du TRUNCATE à cause d'un conflit dans la demande de verrou" -#: access/heap/vacuumlazy.c:3511 +#: access/heap/vacuumlazy.c:3508 #, c-format msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" msgstr "désactivation de l'option de parallélisation du VACUUM sur « %s » --- ne peut pas exécuter un VACUUM parallélisé sur des tables temporaires" -#: access/heap/vacuumlazy.c:4266 +#: access/heap/vacuumlazy.c:4274 #, c-format -msgid "while scanning block %u and offset %u of relation \"%s.%s\"" -msgstr "lors du parcours du bloc %u et du décalage %u de la relation « %s.%s »" +msgid "while scanning block %u offset %u of relation \"%s.%s\"" +msgstr "lors du parcours du bloc %u au décalage %u de la relation « %s.%s »" -#: access/heap/vacuumlazy.c:4269 +#: access/heap/vacuumlazy.c:4277 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "lors du parcours du bloc %u de la relation « %s.%s »" -#: access/heap/vacuumlazy.c:4273 +#: access/heap/vacuumlazy.c:4281 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "lors du parcours de la relation « %s.%s »" -#: access/heap/vacuumlazy.c:4281 +#: access/heap/vacuumlazy.c:4289 #, c-format -msgid "while vacuuming block %u and offset %u of relation \"%s.%s\"" -msgstr "lors du traitement par VACUUM du bloc %u et du décalage %u de la relation « %s.%s »" +msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" +msgstr "lors du traitement par VACUUM du bloc %u au décalage %u de la relation « %s.%s »" -#: access/heap/vacuumlazy.c:4284 +#: access/heap/vacuumlazy.c:4292 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "lors du VACUUM du bloc %u de la relation « %s.%s »" -#: access/heap/vacuumlazy.c:4288 +#: access/heap/vacuumlazy.c:4296 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "lors du vacuum de la relation « %s.%s »" -#: access/heap/vacuumlazy.c:4293 +#: access/heap/vacuumlazy.c:4301 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "lors du nettoyage de l'index « %s » dans la relation « %s.%s »" -#: access/heap/vacuumlazy.c:4298 +#: access/heap/vacuumlazy.c:4306 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "lors du nettoyage de l'index « %s » dans la relation « %s.%s »" -#: access/heap/vacuumlazy.c:4304 +#: access/heap/vacuumlazy.c:4312 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "lors du tronquage de la relation « %s.%s » à %u blocs" @@ -1274,7 +1232,7 @@ msgstr "la méthode d'accès « %s » n'a pas de handler" msgid "transaction aborted during system catalog scan" msgstr "transaction annulée lors du parcours du catalogue système" -#: access/index/indexam.c:142 catalog/objectaddress.c:1355 commands/indexcmds.c:2670 commands/tablecmds.c:267 commands/tablecmds.c:291 commands/tablecmds.c:16492 commands/tablecmds.c:18194 +#: access/index/indexam.c:142 catalog/objectaddress.c:1355 commands/indexcmds.c:2670 commands/tablecmds.c:267 commands/tablecmds.c:291 commands/tablecmds.c:16537 commands/tablecmds.c:18274 #, c-format msgid "\"%s\" is not an index" msgstr "« %s » n'est pas un index" @@ -1347,12 +1305,12 @@ msgstr "" "la famille d'opérateur « %s » de la méthode d'accès %s nécessite une fonction de support\n" "manquante pour les types %s et %s" -#: access/spgist/spgutils.c:232 +#: access/spgist/spgutils.c:244 #, c-format msgid "compress method must be defined when leaf type is different from input type" msgstr "la méthode de compression doit être définie quand le type feuille est différent du type d'entrée" -#: access/spgist/spgutils.c:1005 +#: access/spgist/spgutils.c:1017 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "la taille de la ligne interne SP-GiST, %zu, dépasse le maximum %zu" @@ -1374,7 +1332,7 @@ msgstr "" msgid "\"%s\" is an index" msgstr "« %s » est un index" -#: access/table/table.c:54 access/table/table.c:88 access/table/table.c:117 access/table/table.c:150 catalog/aclchk.c:1799 commands/tablecmds.c:13197 commands/tablecmds.c:16501 +#: access/table/table.c:54 access/table/table.c:88 access/table/table.c:117 access/table/table.c:150 catalog/aclchk.c:1799 commands/tablecmds.c:13238 commands/tablecmds.c:16546 #, c-format msgid "\"%s\" is a composite type" msgstr "« %s » est un type composite" @@ -1389,7 +1347,7 @@ msgstr "le tid (%u, %u) n'est pas valide pour la relation « %s »" msgid "%s cannot be empty." msgstr "%s ne peut pas être vide." -#: access/table/tableamapi.c:122 utils/misc/guc.c:12438 +#: access/table/tableamapi.c:122 utils/misc/guc.c:12439 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s est trop long (%d caractères maximum)." @@ -1409,22 +1367,22 @@ msgstr "La méthode d'accès « %s » n'existe pas." msgid "sample percentage must be between 0 and 100" msgstr "le pourcentage de l'échantillonnage doit être compris entre 0 et 100" -#: access/transam/commit_ts.c:278 +#: access/transam/commit_ts.c:280 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "ne peut pas récupérer l'horodatage de la validation pour la transaction %u" -#: access/transam/commit_ts.c:376 +#: access/transam/commit_ts.c:378 #, c-format msgid "could not get commit timestamp data" msgstr "n'a pas pu récupérer les données d'horodatage de la validation" -#: access/transam/commit_ts.c:378 +#: access/transam/commit_ts.c:380 #, c-format msgid "Make sure the configuration parameter \"%s\" is set on the primary server." msgstr "Assurez-vous que le paramètre de configuration « %s » soit configuré sur le serveur primaire." -#: access/transam/commit_ts.c:380 +#: access/transam/commit_ts.c:382 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Assurez-vous que le paramètre de configuration « %s » soit configuré." @@ -1538,36 +1496,36 @@ msgstr "ne peut pas tronquer jusqu'au MutiXact %u car il n'existe pas sur disque msgid "invalid MultiXactId: %u" msgstr "MultiXactId invalide : %u" -#: access/transam/parallel.c:707 access/transam/parallel.c:826 +#: access/transam/parallel.c:718 access/transam/parallel.c:837 #, c-format msgid "parallel worker failed to initialize" msgstr "échec de l'initialisation du worker parallèle" -#: access/transam/parallel.c:708 access/transam/parallel.c:827 +#: access/transam/parallel.c:719 access/transam/parallel.c:838 #, c-format msgid "More details may be available in the server log." msgstr "Plus de détails sont disponibles dans les traces du serveur." -#: access/transam/parallel.c:888 +#: access/transam/parallel.c:899 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "postmaster a quitté pendant une transaction parallèle" -#: access/transam/parallel.c:1075 +#: access/transam/parallel.c:1086 #, c-format msgid "lost connection to parallel worker" msgstr "perte de la connexion au processus parallèle" -#: access/transam/parallel.c:1141 access/transam/parallel.c:1143 +#: access/transam/parallel.c:1152 access/transam/parallel.c:1154 msgid "parallel worker" msgstr "processus parallèle" -#: access/transam/parallel.c:1294 +#: access/transam/parallel.c:1307 #, c-format msgid "could not map dynamic shared memory segment" msgstr "n'a pas pu mapper le segment de mémoire partagée dynamique" -#: access/transam/parallel.c:1299 +#: access/transam/parallel.c:1312 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "numéro magique invalide dans le segment de mémoire partagée dynamique" @@ -1689,147 +1647,152 @@ msgstr "Configure max_prepared_transactions à une valeur différente de zéro." msgid "transaction identifier \"%s\" is already in use" msgstr "l'identifiant de la transaction « %s » est déjà utilisé" -#: access/transam/twophase.c:417 access/transam/twophase.c:2385 +#: access/transam/twophase.c:417 access/transam/twophase.c:2449 #, c-format msgid "maximum number of prepared transactions reached" msgstr "nombre maximum de transactions préparées obtenu" -#: access/transam/twophase.c:418 access/transam/twophase.c:2386 +#: access/transam/twophase.c:418 access/transam/twophase.c:2450 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "Augmentez max_prepared_transactions (actuellement %d)." -#: access/transam/twophase.c:584 +#: access/transam/twophase.c:594 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "la transaction préparée d'identifiant « %s » est occupée" -#: access/transam/twophase.c:590 +#: access/transam/twophase.c:600 #, c-format msgid "permission denied to finish prepared transaction" msgstr "droit refusé pour terminer la transaction préparée" -#: access/transam/twophase.c:591 +#: access/transam/twophase.c:601 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "Doit être super-utilisateur ou l'utilisateur qui a préparé la transaction." -#: access/transam/twophase.c:602 +#: access/transam/twophase.c:612 #, c-format msgid "prepared transaction belongs to another database" msgstr "la transaction préparée appartient à une autre base de données" -#: access/transam/twophase.c:603 +#: access/transam/twophase.c:613 #, c-format msgid "Connect to the database where the transaction was prepared to finish it." msgstr "" "Connectez-vous à la base de données où la transaction a été préparée pour\n" "la terminer." -#: access/transam/twophase.c:618 +#: access/transam/twophase.c:628 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "la transaction préparée d'identifiant « %s » n'existe pas" -#: access/transam/twophase.c:1093 +#: access/transam/twophase.c:1149 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "" "longueur maximale dépassée pour le fichier de statut de la validation en\n" "deux phase" -#: access/transam/twophase.c:1247 +#: access/transam/twophase.c:1303 #, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" msgstr[0] "taille incorrecte du fichier « %s » : %lld octet" msgstr[1] "taille incorrecte du fichier « %s » : %lld octets" -#: access/transam/twophase.c:1256 +#: access/transam/twophase.c:1312 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "alignement incorrect du décalage CRC pour le fichier « %s »" -#: access/transam/twophase.c:1274 +#: access/transam/twophase.c:1330 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %lld" -#: access/transam/twophase.c:1289 +#: access/transam/twophase.c:1345 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "nombre magique invalide dans le fichier « %s »" -#: access/transam/twophase.c:1295 +#: access/transam/twophase.c:1351 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "taille invalide stockée dans le fichier « %s »" -#: access/transam/twophase.c:1307 +#: access/transam/twophase.c:1363 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "la somme de contrôle CRC calculée ne correspond par à la valeur enregistrée dans le fichier « %s »" -#: access/transam/twophase.c:1342 access/transam/xlog.c:6632 +#: access/transam/twophase.c:1398 access/transam/xlog.c:6678 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Échec lors de l'allocation d'un processeur de lecture de journaux de transactions." -#: access/transam/twophase.c:1357 +#: access/transam/twophase.c:1415 +#, c-format +msgid "could not read two-phase state from WAL at %X/%X: %s" +msgstr "n'a pas pu lire le fichier d'état de la validation en deux phases depuis les journaux de transactions à %X/%X : %s" + +#: access/transam/twophase.c:1420 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "n'a pas pu lire le fichier d'état de la validation en deux phases depuis les journaux de transactions à %X/%X" -#: access/transam/twophase.c:1364 +#: access/transam/twophase.c:1428 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "" "le fichier d'état de la validation en deux phases attendu n'est pas présent\n" "dans les journaux de transaction à %X/%X" -#: access/transam/twophase.c:1641 +#: access/transam/twophase.c:1705 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "n'a pas pu recréer le fichier « %s » : %m" -#: access/transam/twophase.c:1768 +#: access/transam/twophase.c:1832 #, c-format msgid "%u two-phase state file was written for a long-running prepared transaction" msgid_plural "%u two-phase state files were written for long-running prepared transactions" msgstr[0] "le fichier d'état de la validation en deux phases %u a été écrit pour une transaction préparée de longue durée" msgstr[1] "les fichiers d'état de la validation en deux phases %u ont été écrits pour des transactions préparées de longue durée" -#: access/transam/twophase.c:2002 +#: access/transam/twophase.c:2066 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "récupération de la transaction préparée %u à partir de la mémoire partagée" -#: access/transam/twophase.c:2093 +#: access/transam/twophase.c:2157 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "suppression du vieux fichier d'état de la validation en deux phases pour la transaction %u" -#: access/transam/twophase.c:2100 +#: access/transam/twophase.c:2164 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "suppression du vieux fichier d'état de la validation en deux phases de la mémoire pour la transaction %u" -#: access/transam/twophase.c:2113 +#: access/transam/twophase.c:2177 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "suppression du futur fichier d'état de la validation en deux phases pour la transaction %u" -#: access/transam/twophase.c:2120 +#: access/transam/twophase.c:2184 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "suppression du futur fichier d'état de la validation en deux phases en mémoire pour la transaction %u" -#: access/transam/twophase.c:2145 +#: access/transam/twophase.c:2209 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "fichier d'état de la validation en deux phases pour la transaction %u corrompu" -#: access/transam/twophase.c:2150 +#: access/transam/twophase.c:2214 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "mémoire d'état de la validation en deux phases pour la transaction %u corrompue" @@ -1875,180 +1838,180 @@ msgstr "" "un VACUUM doit être exécuté sur la base de données d'OID %u dans un maximum de\n" "%u transactions" -#: access/transam/xact.c:1045 +#: access/transam/xact.c:1046 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "ne peux pas avoir plus de 2^32-2 commandes dans une transaction" -#: access/transam/xact.c:1582 +#: access/transam/xact.c:1583 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "nombre maximum de sous-transactions validées (%d) dépassé" -#: access/transam/xact.c:2423 +#: access/transam/xact.c:2434 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "" "ne peut pas préparer (PREPARE) une transaction qui a travaillé sur des\n" "objets temporaires" -#: access/transam/xact.c:2433 +#: access/transam/xact.c:2444 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "ne peut pas préparer (PREPARE) une transaction qui a exporté des snapshots" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3388 +#: access/transam/xact.c:3408 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s ne peut pas être exécuté dans un bloc de transaction" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3398 +#: access/transam/xact.c:3418 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%s ne peut pas être exécuté dans une sous-transaction" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3408 +#: access/transam/xact.c:3428 #, c-format msgid "%s cannot be executed from a function" msgstr "%s ne peut pas être exécuté à partir d'une fonction" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3477 access/transam/xact.c:3783 access/transam/xact.c:3862 access/transam/xact.c:3985 access/transam/xact.c:4136 access/transam/xact.c:4205 access/transam/xact.c:4316 +#: access/transam/xact.c:3497 access/transam/xact.c:3803 access/transam/xact.c:3882 access/transam/xact.c:4005 access/transam/xact.c:4156 access/transam/xact.c:4225 access/transam/xact.c:4336 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s peut seulement être utilisé dans des blocs de transaction" -#: access/transam/xact.c:3669 +#: access/transam/xact.c:3689 #, c-format msgid "there is already a transaction in progress" msgstr "une transaction est déjà en cours" -#: access/transam/xact.c:3788 access/transam/xact.c:3867 access/transam/xact.c:3990 +#: access/transam/xact.c:3808 access/transam/xact.c:3887 access/transam/xact.c:4010 #, c-format msgid "there is no transaction in progress" msgstr "aucune transaction en cours" -#: access/transam/xact.c:3878 +#: access/transam/xact.c:3898 #, c-format msgid "cannot commit during a parallel operation" msgstr "ne peut pas valider pendant une opération parallèle" -#: access/transam/xact.c:4001 +#: access/transam/xact.c:4021 #, c-format msgid "cannot abort during a parallel operation" msgstr "ne peut pas annuler pendant une opération en parallèle" -#: access/transam/xact.c:4100 +#: access/transam/xact.c:4120 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "ne peut pas définir de points de sauvegarde lors d'une opération parallèle" -#: access/transam/xact.c:4187 +#: access/transam/xact.c:4207 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "ne peut pas relâcher de points de sauvegarde pendant une opération parallèle" -#: access/transam/xact.c:4197 access/transam/xact.c:4248 access/transam/xact.c:4308 access/transam/xact.c:4357 +#: access/transam/xact.c:4217 access/transam/xact.c:4268 access/transam/xact.c:4328 access/transam/xact.c:4377 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "le point de sauvegarde « %s » n'existe pas" -#: access/transam/xact.c:4254 access/transam/xact.c:4363 +#: access/transam/xact.c:4274 access/transam/xact.c:4383 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "le point de sauvegarde « %s » n'existe pas dans le niveau de point de sauvegarde actuel" -#: access/transam/xact.c:4296 +#: access/transam/xact.c:4316 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "ne peut pas retourner à un point de sauvegarde pendant un opération parallèle" -#: access/transam/xact.c:4424 +#: access/transam/xact.c:4444 #, c-format msgid "cannot start subtransactions during a parallel operation" msgstr "ne peut pas lancer de sous-transactions pendant une opération parallèle" -#: access/transam/xact.c:4492 +#: access/transam/xact.c:4512 #, c-format msgid "cannot commit subtransactions during a parallel operation" msgstr "ne peut pas valider de sous-transactions pendant une opération parallèle" -#: access/transam/xact.c:5133 +#: access/transam/xact.c:5159 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "ne peut pas avoir plus de 2^32-1 sous-transactions dans une transaction" -#: access/transam/xlog.c:1823 +#: access/transam/xlog.c:1835 #, c-format msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" -msgstr "" +msgstr "demande pour vider après la fin du WAL généré ; demande %X/%X, position actuelle %X/%X" -#: access/transam/xlog.c:2584 +#: access/transam/xlog.c:2608 #, c-format msgid "could not write to log file %s at offset %u, length %zu: %m" msgstr "n'a pas pu écrire le fichier de transactions %s au décalage %u, longueur %zu : %m" -#: access/transam/xlog.c:3986 access/transam/xlogutils.c:798 replication/walsender.c:2520 +#: access/transam/xlog.c:4010 access/transam/xlogutils.c:798 replication/walsender.c:2529 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "le segment demandé du journal de transaction, %s, a déjà été supprimé" -#: access/transam/xlog.c:4261 +#: access/transam/xlog.c:4285 #, c-format msgid "could not rename file \"%s\": %m" msgstr "n'a pas pu renommer le fichier « %s » : %m" -#: access/transam/xlog.c:4303 access/transam/xlog.c:4313 +#: access/transam/xlog.c:4327 access/transam/xlog.c:4337 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "le répertoire « %s » requis pour les journaux de transactions n'existe pas" -#: access/transam/xlog.c:4319 +#: access/transam/xlog.c:4343 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "création du répertoire manquant pour les journaux de transactions « %s »" -#: access/transam/xlog.c:4322 +#: access/transam/xlog.c:4346 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "n'a pas pu créer le répertoire « %s » manquant : %m" -#: access/transam/xlog.c:4425 +#: access/transam/xlog.c:4462 #, c-format msgid "unexpected timeline ID %u in log segment %s, offset %u" msgstr "identifiant timeline %u inattendu dans le journal de transactions %s, décalage %u" -#: access/transam/xlog.c:4563 +#: access/transam/xlog.c:4600 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "la nouvelle timeline %u n'est pas une enfant de la timeline %u du système" -#: access/transam/xlog.c:4577 +#: access/transam/xlog.c:4614 #, c-format msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" msgstr "" "la nouvelle timeline %u a été créée à partir de la timeline de la base de données système %u\n" "avant le point de restauration courant %X/%X" -#: access/transam/xlog.c:4596 +#: access/transam/xlog.c:4633 #, c-format msgid "new target timeline is %u" msgstr "la nouvelle timeline cible est %u" -#: access/transam/xlog.c:4632 +#: access/transam/xlog.c:4669 #, c-format msgid "could not generate secret authorization token" msgstr "n'a pas pu générer le jeton secret d'autorisation" -#: access/transam/xlog.c:4791 access/transam/xlog.c:4800 access/transam/xlog.c:4824 access/transam/xlog.c:4831 access/transam/xlog.c:4838 access/transam/xlog.c:4843 access/transam/xlog.c:4850 access/transam/xlog.c:4857 access/transam/xlog.c:4864 access/transam/xlog.c:4871 access/transam/xlog.c:4878 access/transam/xlog.c:4885 access/transam/xlog.c:4894 access/transam/xlog.c:4901 utils/init/miscinit.c:1578 +#: access/transam/xlog.c:4828 access/transam/xlog.c:4837 access/transam/xlog.c:4861 access/transam/xlog.c:4868 access/transam/xlog.c:4875 access/transam/xlog.c:4880 access/transam/xlog.c:4887 access/transam/xlog.c:4894 access/transam/xlog.c:4901 access/transam/xlog.c:4908 access/transam/xlog.c:4915 access/transam/xlog.c:4922 access/transam/xlog.c:4931 access/transam/xlog.c:4938 utils/init/miscinit.c:1578 #, c-format msgid "database files are incompatible with server" msgstr "les fichiers de la base de données sont incompatibles avec le serveur" -#: access/transam/xlog.c:4792 +#: access/transam/xlog.c:4829 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." msgstr "" @@ -2056,149 +2019,149 @@ msgstr "" "%d (0x%08x) alors que le serveur a été compilé avec un PG_CONTROL_VERSION à\n" "%d (0x%08x)." -#: access/transam/xlog.c:4796 +#: access/transam/xlog.c:4833 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." msgstr "" "Ceci peut être un problème d'incohérence dans l'ordre des octets.\n" "Il se peut que vous ayez besoin d'initdb." -#: access/transam/xlog.c:4801 +#: access/transam/xlog.c:4838 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." msgstr "" "Le cluster de base de données a été initialisé avec un PG_CONTROL_VERSION à\n" "%d alors que le serveur a été compilé avec un PG_CONTROL_VERSION à %d." -#: access/transam/xlog.c:4804 access/transam/xlog.c:4828 access/transam/xlog.c:4835 access/transam/xlog.c:4840 +#: access/transam/xlog.c:4841 access/transam/xlog.c:4865 access/transam/xlog.c:4872 access/transam/xlog.c:4877 #, c-format msgid "It looks like you need to initdb." msgstr "Il semble que vous avez besoin d'initdb." -#: access/transam/xlog.c:4815 +#: access/transam/xlog.c:4852 #, c-format msgid "incorrect checksum in control file" msgstr "somme de contrôle incorrecte dans le fichier de contrôle" -#: access/transam/xlog.c:4825 +#: access/transam/xlog.c:4862 #, c-format msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." msgstr "" "Le cluster de base de données a été initialisé avec un CATALOG_VERSION_NO à\n" "%d alors que le serveur a été compilé avec un CATALOG_VERSION_NO à %d." -#: access/transam/xlog.c:4832 +#: access/transam/xlog.c:4869 #, c-format msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." msgstr "" "Le cluster de bases de données a été initialisé avec un MAXALIGN à %d alors\n" "que le serveur a été compilé avec un MAXALIGN à %d." -#: access/transam/xlog.c:4839 +#: access/transam/xlog.c:4876 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "" "Le cluster de bases de données semble utiliser un format différent pour les\n" "nombres à virgule flottante de celui de l'exécutable serveur." -#: access/transam/xlog.c:4844 +#: access/transam/xlog.c:4881 #, c-format msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." msgstr "" "Le cluster de base de données a été initialisé avec un BLCKSZ à %d alors que\n" "le serveur a été compilé avec un BLCKSZ à %d." -#: access/transam/xlog.c:4847 access/transam/xlog.c:4854 access/transam/xlog.c:4861 access/transam/xlog.c:4868 access/transam/xlog.c:4875 access/transam/xlog.c:4882 access/transam/xlog.c:4889 access/transam/xlog.c:4897 access/transam/xlog.c:4904 +#: access/transam/xlog.c:4884 access/transam/xlog.c:4891 access/transam/xlog.c:4898 access/transam/xlog.c:4905 access/transam/xlog.c:4912 access/transam/xlog.c:4919 access/transam/xlog.c:4926 access/transam/xlog.c:4934 access/transam/xlog.c:4941 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Il semble que vous avez besoin de recompiler ou de relancer initdb." -#: access/transam/xlog.c:4851 +#: access/transam/xlog.c:4888 #, c-format msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." msgstr "" "Le cluster de bases de données a été initialisé avec un RELSEG_SIZE à %d\n" "alors que le serveur a été compilé avec un RELSEG_SIZE à %d." -#: access/transam/xlog.c:4858 +#: access/transam/xlog.c:4895 #, c-format msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." msgstr "" "Le cluster de base de données a été initialisé avec un XLOG_BLCKSZ à %d\n" "alors que le serveur a été compilé avec un XLOG_BLCKSZ à %d." -#: access/transam/xlog.c:4865 +#: access/transam/xlog.c:4902 #, c-format msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." msgstr "" "Le cluster de bases de données a été initialisé avec un NAMEDATALEN à %d\n" "alors que le serveur a été compilé avec un NAMEDATALEN à %d." -#: access/transam/xlog.c:4872 +#: access/transam/xlog.c:4909 #, c-format msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." msgstr "" "Le groupe de bases de données a été initialisé avec un INDEX_MAX_KEYS à %d\n" "alors que le serveur a été compilé avec un INDEX_MAX_KEYS à %d." -#: access/transam/xlog.c:4879 +#: access/transam/xlog.c:4916 #, c-format msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." msgstr "" "Le cluster de bases de données a été initialisé avec un TOAST_MAX_CHUNK_SIZE\n" "à %d alors que le serveur a été compilé avec un TOAST_MAX_CHUNK_SIZE à %d." -#: access/transam/xlog.c:4886 +#: access/transam/xlog.c:4923 #, c-format msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." msgstr "" "Le cluster de base de données a été initialisé avec un LOBLKSIZE à %d alors que\n" "le serveur a été compilé avec un LOBLKSIZE à %d." -#: access/transam/xlog.c:4895 +#: access/transam/xlog.c:4932 #, c-format msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." msgstr "" "Le cluster de base de données a été initialisé sans USE_FLOAT8_BYVAL\n" "alors que le serveur a été compilé avec USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4902 +#: access/transam/xlog.c:4939 #, c-format msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." msgstr "" "Le cluster de base de données a été initialisé avec USE_FLOAT8_BYVAL\n" "alors que le serveur a été compilé sans USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4911 +#: access/transam/xlog.c:4948 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" msgstr[0] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octet" msgstr[1] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octets" -#: access/transam/xlog.c:4923 +#: access/transam/xlog.c:4960 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "« min_wal_size » doit être au moins le double de « wal_segment_size »" -#: access/transam/xlog.c:4927 +#: access/transam/xlog.c:4964 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "« max_wal_size » doit être au moins le double de « wal_segment_size »" -#: access/transam/xlog.c:5361 +#: access/transam/xlog.c:5398 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "n'a pas pu écrire le « bootstrap » du journal des transactions : %m" -#: access/transam/xlog.c:5369 +#: access/transam/xlog.c:5406 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "" "n'a pas pu synchroniser sur disque (fsync) le « bootstrap » du journal des\n" "transactions : %m" -#: access/transam/xlog.c:5375 +#: access/transam/xlog.c:5412 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "n'a pas pu fermer le « bootstrap » du journal des transactions : %m" @@ -2206,255 +2169,255 @@ msgstr "n'a pas pu fermer le « bootstrap » du journal des transactions : %m" # /* # * Check for old recovery API file: recovery.conf # */ -#: access/transam/xlog.c:5436 +#: access/transam/xlog.c:5473 #, c-format msgid "using recovery command file \"%s\" is not supported" msgstr "utiliser le fichier de commande de la restauration « %s » n'est plus supporté" -#: access/transam/xlog.c:5501 +#: access/transam/xlog.c:5538 #, c-format msgid "standby mode is not supported by single-user servers" msgstr "le mode de restauration n'est pas supporté pour les serveurs mono-utilisateur" -#: access/transam/xlog.c:5518 +#: access/transam/xlog.c:5555 #, c-format msgid "specified neither primary_conninfo nor restore_command" msgstr "ni primary_conninfo ni restore_command n'est spécifié" -#: access/transam/xlog.c:5519 +#: access/transam/xlog.c:5556 #, c-format msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." msgstr "" "Le serveur de la base de données va régulièrement interroger le sous-répertoire\n" "pg_wal pour vérifier les fichiers placés ici." -#: access/transam/xlog.c:5527 +#: access/transam/xlog.c:5564 #, c-format msgid "must specify restore_command when standby mode is not enabled" msgstr "doit spécifier une restore_command quand le mode standby n'est pas activé" -#: access/transam/xlog.c:5565 +#: access/transam/xlog.c:5602 #, c-format msgid "recovery target timeline %u does not exist" msgstr "le timeline cible, %u, de la restauration n'existe pas" -#: access/transam/xlog.c:5687 +#: access/transam/xlog.c:5724 #, c-format msgid "archive recovery complete" msgstr "restauration de l'archive terminée" -#: access/transam/xlog.c:5753 access/transam/xlog.c:6024 +#: access/transam/xlog.c:5790 access/transam/xlog.c:6061 #, c-format msgid "recovery stopping after reaching consistency" msgstr "arrêt de la restauration après avoir atteint le point de cohérence" -#: access/transam/xlog.c:5774 +#: access/transam/xlog.c:5811 #, c-format msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" msgstr "arrêt de la restauration avant l'emplacement WAL (LSN) « %X/%X »" -#: access/transam/xlog.c:5859 +#: access/transam/xlog.c:5896 #, c-format msgid "recovery stopping before commit of transaction %u, time %s" msgstr "arrêt de la restauration avant validation de la transaction %u, %s" -#: access/transam/xlog.c:5866 +#: access/transam/xlog.c:5903 #, c-format msgid "recovery stopping before abort of transaction %u, time %s" msgstr "arrêt de la restauration avant annulation de la transaction %u, %s" -#: access/transam/xlog.c:5919 +#: access/transam/xlog.c:5956 #, c-format msgid "recovery stopping at restore point \"%s\", time %s" msgstr "restauration en arrêt au point de restauration « %s », heure %s" -#: access/transam/xlog.c:5937 +#: access/transam/xlog.c:5974 #, c-format msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" msgstr "arrêt de la restauration après l'emplacement WAL (LSN) « %X/%X »" -#: access/transam/xlog.c:6004 +#: access/transam/xlog.c:6041 #, c-format msgid "recovery stopping after commit of transaction %u, time %s" msgstr "arrêt de la restauration après validation de la transaction %u, %s" -#: access/transam/xlog.c:6012 +#: access/transam/xlog.c:6049 #, c-format msgid "recovery stopping after abort of transaction %u, time %s" msgstr "arrêt de la restauration après annulation de la transaction %u, %s" -#: access/transam/xlog.c:6057 +#: access/transam/xlog.c:6094 #, c-format msgid "pausing at the end of recovery" msgstr "pause à la fin de la restauration" -#: access/transam/xlog.c:6058 +#: access/transam/xlog.c:6095 #, c-format msgid "Execute pg_wal_replay_resume() to promote." msgstr "Exécuter pg_wal_replay_resume() pour promouvoir." -#: access/transam/xlog.c:6061 access/transam/xlog.c:6334 +#: access/transam/xlog.c:6098 access/transam/xlog.c:6380 #, c-format msgid "recovery has paused" msgstr "restauration en pause" -#: access/transam/xlog.c:6062 +#: access/transam/xlog.c:6099 #, c-format msgid "Execute pg_wal_replay_resume() to continue." msgstr "Exécuter pg_wal_replay_resume() pour continuer." -#: access/transam/xlog.c:6325 +#: access/transam/xlog.c:6371 #, c-format msgid "hot standby is not possible because of insufficient parameter settings" msgstr "le hot standby n'est pas possible à cause d'un paramétrage insuffisant" -#: access/transam/xlog.c:6326 access/transam/xlog.c:6353 access/transam/xlog.c:6383 +#: access/transam/xlog.c:6372 access/transam/xlog.c:6399 access/transam/xlog.c:6429 #, c-format msgid "%s = %d is a lower setting than on the primary server, where its value was %d." msgstr "%s = %d est un paramétrage plus bas que celui du serveur primaire, où sa valeur était %d." -#: access/transam/xlog.c:6335 +#: access/transam/xlog.c:6381 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "Si la restauration sort de la pause, le serveur sera arrêté." -#: access/transam/xlog.c:6336 +#: access/transam/xlog.c:6382 #, c-format msgid "You can then restart the server after making the necessary configuration changes." msgstr "Vous pouvez alors redémarrer le serveur après avoir réaliser les modifications nécessaires sur la configuration." -#: access/transam/xlog.c:6347 +#: access/transam/xlog.c:6393 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "la promotion n'est pas possible à cause d'une configuration insuffisante des paramètres" -#: access/transam/xlog.c:6357 +#: access/transam/xlog.c:6403 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "Redémarre le serveur après avoir effectuer les changements nécessaires de configuration." -#: access/transam/xlog.c:6381 +#: access/transam/xlog.c:6427 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "restauration annulée à cause d'un paramétrage insuffisant" -#: access/transam/xlog.c:6387 +#: access/transam/xlog.c:6433 #, c-format msgid "You can restart the server after making the necessary configuration changes." msgstr "Vous pouvez redémarrer le serveur après avoir réalisé les modifications nécessaires sur la configuration." -#: access/transam/xlog.c:6409 +#: access/transam/xlog.c:6455 #, c-format msgid "WAL was generated with wal_level=minimal, cannot continue recovering" msgstr "le journal de transactions a été généré avec le paramètre wal_level=minimal, ne peut pas continuer la restauration" -#: access/transam/xlog.c:6410 +#: access/transam/xlog.c:6456 #, c-format msgid "This happens if you temporarily set wal_level=minimal on the server." msgstr "Ceci peut arriver si vous configurez temporairement wal_level à minimal sur le serveur." -#: access/transam/xlog.c:6411 +#: access/transam/xlog.c:6457 #, c-format msgid "Use a backup taken after setting wal_level to higher than minimal." msgstr "Utilisez la sauvegarde prise lors que la configuration de wal_level était au-dessus du niveau minimal." -#: access/transam/xlog.c:6480 +#: access/transam/xlog.c:6526 #, c-format msgid "control file contains invalid checkpoint location" msgstr "le fichier de contrôle contient un emplacement de checkpoint invalide" -#: access/transam/xlog.c:6491 +#: access/transam/xlog.c:6537 #, c-format msgid "database system was shut down at %s" msgstr "le système de bases de données a été arrêté à %s" -#: access/transam/xlog.c:6497 +#: access/transam/xlog.c:6543 #, c-format msgid "database system was shut down in recovery at %s" msgstr "le système de bases de données a été arrêté pendant la restauration à %s" -#: access/transam/xlog.c:6503 +#: access/transam/xlog.c:6549 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "le système de bases de données a été interrompu ; dernier lancement connu à %s" -#: access/transam/xlog.c:6509 +#: access/transam/xlog.c:6555 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "le système de bases de données a été interrompu lors d'une restauration à %s" -#: access/transam/xlog.c:6511 +#: access/transam/xlog.c:6557 #, c-format msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." msgstr "" "Ceci signifie probablement que des données ont été corrompues et que vous\n" "devrez utiliser la dernière sauvegarde pour la restauration." -#: access/transam/xlog.c:6517 +#: access/transam/xlog.c:6563 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "" "le système de bases de données a été interrompu lors d'une récupération à %s\n" "(moment de la journalisation)" -#: access/transam/xlog.c:6519 +#: access/transam/xlog.c:6565 #, c-format msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." msgstr "" "Si c'est arrivé plus d'une fois, des données ont pu être corrompues et vous\n" "pourriez avoir besoin de choisir une cible de récupération antérieure." -#: access/transam/xlog.c:6525 +#: access/transam/xlog.c:6571 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "le système de bases de données a été interrompu ; dernier lancement connu à %s" -#: access/transam/xlog.c:6531 +#: access/transam/xlog.c:6577 #, c-format msgid "control file contains invalid database cluster state" msgstr "le fichier de contrôle contient un état invalide de l'instance" -#: access/transam/xlog.c:6588 +#: access/transam/xlog.c:6634 #, c-format msgid "entering standby mode" msgstr "entre en mode standby" -#: access/transam/xlog.c:6591 +#: access/transam/xlog.c:6637 #, c-format msgid "starting point-in-time recovery to XID %u" msgstr "début de la restauration de l'archive au XID %u" -#: access/transam/xlog.c:6595 +#: access/transam/xlog.c:6641 #, c-format msgid "starting point-in-time recovery to %s" msgstr "début de la restauration de l'archive à %s" -#: access/transam/xlog.c:6599 +#: access/transam/xlog.c:6645 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "début de la restauration PITR à « %s »" -#: access/transam/xlog.c:6603 +#: access/transam/xlog.c:6649 #, c-format msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" msgstr "début de la restauration PITR à l'emplacement WAL (LSN) « %X/%X »" -#: access/transam/xlog.c:6607 +#: access/transam/xlog.c:6653 #, c-format msgid "starting point-in-time recovery to earliest consistent point" msgstr "début de la restauration de l'archive jusqu'au point de cohérence le plus proche" -#: access/transam/xlog.c:6610 +#: access/transam/xlog.c:6656 #, c-format msgid "starting archive recovery" msgstr "début de la restauration de l'archive" -#: access/transam/xlog.c:6684 +#: access/transam/xlog.c:6730 #, c-format msgid "could not find redo location referenced by checkpoint record" msgstr "n'a pas pu localiser l'enregistrement redo référencé par le point de vérification" -#: access/transam/xlog.c:6685 access/transam/xlog.c:6695 +#: access/transam/xlog.c:6731 access/transam/xlog.c:6741 #, c-format msgid "" "If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" @@ -2465,133 +2428,133 @@ msgstr "" "Si vous ne restaurez pas depuis une sauvegarde, essayez de supprimer « %s/backup_label ».\n" "Attention : supprimer « %s/backup_label » lors d'une restauration de sauvegarde entraînera la corruption de l'instance." -#: access/transam/xlog.c:6694 +#: access/transam/xlog.c:6740 #, c-format msgid "could not locate required checkpoint record" msgstr "n'a pas pu localiser l'enregistrement d'un point de vérification requis" -#: access/transam/xlog.c:6723 commands/tablespace.c:666 +#: access/transam/xlog.c:6769 commands/tablespace.c:662 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "n'a pas pu créer le lien symbolique « %s » : %m" -#: access/transam/xlog.c:6755 access/transam/xlog.c:6761 +#: access/transam/xlog.c:6801 access/transam/xlog.c:6807 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "ignore le fichier « %s » car le fichier « %s » n'existe pas" -#: access/transam/xlog.c:6757 access/transam/xlog.c:12058 +#: access/transam/xlog.c:6803 access/transam/xlog.c:12238 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "Le fichier « %s » a été renommé en « %s »." -#: access/transam/xlog.c:6763 +#: access/transam/xlog.c:6809 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "N'a pas pu renommer le fichier « %s » en « %s » : %m." -#: access/transam/xlog.c:6814 +#: access/transam/xlog.c:6860 #, c-format msgid "could not locate a valid checkpoint record" msgstr "n'a pas pu localiser un enregistrement d'un point de vérification valide" -#: access/transam/xlog.c:6852 +#: access/transam/xlog.c:6898 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "la timeline requise %u n'est pas un fils de l'historique de ce serveur" -#: access/transam/xlog.c:6854 +#: access/transam/xlog.c:6900 #, c-format msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." msgstr "Le dernier checkpoint est à %X/%X sur la timeline %u, mais dans l'historique de la timeline demandée, le serveur est sorti de cette timeline à %X/%X." -#: access/transam/xlog.c:6868 +#: access/transam/xlog.c:6914 #, c-format msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" msgstr "la timeline requise, %u, ne contient pas le point de restauration minimum (%X/%X) sur la timeline %u" -#: access/transam/xlog.c:6898 +#: access/transam/xlog.c:6944 #, c-format msgid "invalid next transaction ID" msgstr "prochain ID de transaction invalide" -#: access/transam/xlog.c:6998 +#: access/transam/xlog.c:7044 #, c-format msgid "invalid redo in checkpoint record" msgstr "ré-exécution invalide dans l'enregistrement du point de vérification" -#: access/transam/xlog.c:7009 +#: access/transam/xlog.c:7055 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "enregistrement de ré-exécution invalide dans le point de vérification d'arrêt" -#: access/transam/xlog.c:7043 +#: access/transam/xlog.c:7095 #, c-format msgid "database system was not properly shut down; automatic recovery in progress" msgstr "" "le système de bases de données n'a pas été arrêté proprement ; restauration\n" "automatique en cours" -#: access/transam/xlog.c:7047 +#: access/transam/xlog.c:7099 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "la restauration après crash commence par la timeline %u et a la timeline %u en cible" -#: access/transam/xlog.c:7094 +#: access/transam/xlog.c:7146 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_label contient des données incohérentes avec le fichier de contrôle" -#: access/transam/xlog.c:7095 +#: access/transam/xlog.c:7147 #, c-format msgid "This means that the backup is corrupted and you will have to use another backup for recovery." msgstr "" "Ceci signifie que la sauvegarde a été corrompue et que vous devrez utiliser\n" "la dernière sauvegarde pour la restauration." -#: access/transam/xlog.c:7321 +#: access/transam/xlog.c:7373 #, c-format msgid "redo starts at %X/%X" msgstr "la ré-exécution commence à %X/%X" -#: access/transam/xlog.c:7546 +#: access/transam/xlog.c:7598 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "" "le point d'arrêt de la restauration demandée se trouve avant le point\n" "cohérent de restauration" -#: access/transam/xlog.c:7584 +#: access/transam/xlog.c:7636 #, c-format msgid "redo done at %X/%X system usage: %s" msgstr "rejeu exécuté à %X/%X utilisation système : %s" -#: access/transam/xlog.c:7590 +#: access/transam/xlog.c:7642 #, c-format msgid "last completed transaction was at log time %s" msgstr "la dernière transaction a eu lieu à %s (moment de la journalisation)" -#: access/transam/xlog.c:7599 +#: access/transam/xlog.c:7651 #, c-format msgid "redo is not required" msgstr "la ré-exécution n'est pas nécessaire" -#: access/transam/xlog.c:7611 +#: access/transam/xlog.c:7663 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "la restauration s'est terminée avant d'avoir atteint la cible configurée pour la restauration" -#: access/transam/xlog.c:7690 access/transam/xlog.c:7694 +#: access/transam/xlog.c:7747 access/transam/xlog.c:7751 #, c-format msgid "WAL ends before end of online backup" msgstr "le journal de transactions se termine avant la fin de la sauvegarde de base" -#: access/transam/xlog.c:7691 +#: access/transam/xlog.c:7748 #, c-format msgid "All WAL generated while online backup was taken must be available at recovery." msgstr "Tous les journaux de transactions générés pendant la sauvegarde en ligne doivent être disponibles pour la restauration." -#: access/transam/xlog.c:7695 +#: access/transam/xlog.c:7752 #, c-format msgid "Online backup started with pg_start_backup() must be ended with pg_stop_backup(), and all WAL up to that point must be available at recovery." msgstr "" @@ -2599,187 +2562,192 @@ msgstr "" "pg_stop_backup() et tous les journaux de transactions générés entre les deux\n" "doivent être disponibles pour la restauration." -#: access/transam/xlog.c:7698 +#: access/transam/xlog.c:7755 #, c-format msgid "WAL ends before consistent recovery point" msgstr "Le journal de transaction se termine avant un point de restauration cohérent" -#: access/transam/xlog.c:7733 +#: access/transam/xlog.c:7790 #, c-format msgid "selected new timeline ID: %u" msgstr "identifiant d'un timeline nouvellement sélectionné : %u" -#: access/transam/xlog.c:8176 +#: access/transam/xlog.c:8260 #, c-format msgid "consistent recovery state reached at %X/%X" msgstr "état de restauration cohérent atteint à %X/%X" -#: access/transam/xlog.c:8385 +#: access/transam/xlog.c:8469 #, c-format msgid "invalid primary checkpoint link in control file" msgstr "lien du point de vérification primaire invalide dans le fichier de contrôle" -#: access/transam/xlog.c:8389 +#: access/transam/xlog.c:8473 #, c-format msgid "invalid checkpoint link in backup_label file" msgstr "lien du point de vérification invalide dans le fichier backup_label" -#: access/transam/xlog.c:8407 +#: access/transam/xlog.c:8491 #, c-format msgid "invalid primary checkpoint record" msgstr "enregistrement du point de vérification primaire invalide" -#: access/transam/xlog.c:8411 +#: access/transam/xlog.c:8495 #, c-format msgid "invalid checkpoint record" msgstr "enregistrement du point de vérification invalide" -#: access/transam/xlog.c:8422 +#: access/transam/xlog.c:8506 #, c-format msgid "invalid resource manager ID in primary checkpoint record" msgstr "identifiant du gestionnaire de ressource invalide dans l'enregistrement primaire du point de vérification" -#: access/transam/xlog.c:8426 +#: access/transam/xlog.c:8510 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "identifiant du gestionnaire de ressource invalide dans l'enregistrement du point de vérification" -#: access/transam/xlog.c:8439 +#: access/transam/xlog.c:8523 #, c-format msgid "invalid xl_info in primary checkpoint record" msgstr "xl_info invalide dans l'enregistrement du point de vérification primaire" -#: access/transam/xlog.c:8443 +#: access/transam/xlog.c:8527 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "xl_info invalide dans l'enregistrement du point de vérification" -#: access/transam/xlog.c:8454 +#: access/transam/xlog.c:8538 #, c-format msgid "invalid length of primary checkpoint record" msgstr "longueur invalide de l'enregistrement primaire du point de vérification" -#: access/transam/xlog.c:8458 +#: access/transam/xlog.c:8542 #, c-format msgid "invalid length of checkpoint record" msgstr "longueur invalide de l'enregistrement du point de vérification" -#: access/transam/xlog.c:8639 +#: access/transam/xlog.c:8723 #, c-format msgid "shutting down" msgstr "arrêt en cours" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8678 +#: access/transam/xlog.c:8762 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" msgstr "début du restartpoint :%s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8690 +#: access/transam/xlog.c:8774 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" msgstr "début du checkpoint :%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:8750 +#: access/transam/xlog.c:8834 #, c-format msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" -msgstr "" +msgstr "restartpoint terminé : a écrit %d tampons (%.1f%%); %d fichiers WAL ajoutés, %d supprimés, %d recyclés ; écriture=%ld.%03d s, synchronisation=%ld.%03d s, total=%ld.%03d s; fichiers synchronisés=%d, plus long=%ld.%03d s, moyenne=%ld.%03d s; distance=%d kB, estimation=%d kB" -#: access/transam/xlog.c:8770 +#: access/transam/xlog.c:8854 #, c-format msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" -msgstr "" +msgstr "checkpoint terminé : a écrit %d tampons (%.1f%%); %d fichiers WAL ajoutés, %d supprimés, %d recyclés ; écriture=%ld.%03d s, synchronisation=%ld.%03d s, total=%ld.%03d s; fichiers synchronisés=%d, plus long=%ld.%03d s, moyenne=%ld.%03d s; distance=%d kB, estimation=%d kB" -#: access/transam/xlog.c:9203 +#: access/transam/xlog.c:9287 #, c-format msgid "concurrent write-ahead log activity while database system is shutting down" msgstr "" "activité en cours du journal de transactions alors que le système de bases\n" "de données est en cours d'arrêt" -#: access/transam/xlog.c:9659 +#: access/transam/xlog.c:9806 #, c-format msgid "recovery restart point at %X/%X" msgstr "la ré-exécution en restauration commence à %X/%X" -#: access/transam/xlog.c:9661 +#: access/transam/xlog.c:9808 #, c-format msgid "Last completed transaction was at log time %s." msgstr "La dernière transaction a eu lieu à %s (moment de la journalisation)." -#: access/transam/xlog.c:9901 +#: access/transam/xlog.c:10054 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "point de restauration « %s » créé à %X/%X" -#: access/transam/xlog.c:10046 +#: access/transam/xlog.c:10199 #, c-format msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" msgstr "identifiant de timeline précédent %u inattendu (identifiant de la timeline courante %u) dans l'enregistrement du point de vérification" -#: access/transam/xlog.c:10055 +#: access/transam/xlog.c:10208 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "" "identifiant timeline %u inattendu (après %u) dans l'enregistrement du point\n" "de vérification" -#: access/transam/xlog.c:10071 +#: access/transam/xlog.c:10224 #, c-format msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" msgstr "identifiant timeline %u inattendu dans l'enregistrement du checkpoint, avant d'atteindre le point de restauration minimum %X/%X sur la timeline %u" -#: access/transam/xlog.c:10146 +#: access/transam/xlog.c:10299 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "la sauvegarde en ligne a été annulée, la restauration ne peut pas continuer" -#: access/transam/xlog.c:10202 access/transam/xlog.c:10258 access/transam/xlog.c:10281 +#: access/transam/xlog.c:10355 access/transam/xlog.c:10411 access/transam/xlog.c:10441 #, c-format msgid "unexpected timeline ID %u (should be %u) in checkpoint record" msgstr "" "identifiant timeline %u inattendu (devrait être %u) dans l'enregistrement du\n" "point de vérification" -#: access/transam/xlog.c:10630 +#: access/transam/xlog.c:10595 +#, c-format +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "ignore avec succès le contrecord manquant à %X/%X, surchargé à %s" + +#: access/transam/xlog.c:10810 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier %s : %m" -#: access/transam/xlog.c:10636 +#: access/transam/xlog.c:10816 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "n'a pas pu synchroniser sur disque (fdatasync) le fichier « %s » : %m" -#: access/transam/xlog.c:10747 access/transam/xlog.c:11276 access/transam/xlogfuncs.c:275 access/transam/xlogfuncs.c:302 access/transam/xlogfuncs.c:341 access/transam/xlogfuncs.c:362 access/transam/xlogfuncs.c:383 +#: access/transam/xlog.c:10927 access/transam/xlog.c:11456 access/transam/xlogfuncs.c:275 access/transam/xlogfuncs.c:302 access/transam/xlogfuncs.c:341 access/transam/xlogfuncs.c:362 access/transam/xlogfuncs.c:383 #, c-format msgid "WAL control functions cannot be executed during recovery." msgstr "les fonctions de contrôle des journaux de transactions ne peuvent pas être exécutées lors de la restauration." -#: access/transam/xlog.c:10756 access/transam/xlog.c:11285 +#: access/transam/xlog.c:10936 access/transam/xlog.c:11465 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "Le niveau de journalisation n'est pas suffisant pour faire une sauvegarde en ligne" -#: access/transam/xlog.c:10757 access/transam/xlog.c:11286 access/transam/xlogfuncs.c:308 +#: access/transam/xlog.c:10937 access/transam/xlog.c:11466 access/transam/xlogfuncs.c:308 #, c-format msgid "wal_level must be set to \"replica\" or \"logical\" at server start." msgstr "" "wal_level doit être configuré à « replica » ou « logical »\n" "au démarrage du serveur." -#: access/transam/xlog.c:10762 +#: access/transam/xlog.c:10942 #, c-format msgid "backup label too long (max %d bytes)" msgstr "label de sauvegarde trop long (%d octets maximum)" -#: access/transam/xlog.c:10799 access/transam/xlog.c:11075 access/transam/xlog.c:11113 +#: access/transam/xlog.c:10979 access/transam/xlog.c:11255 access/transam/xlog.c:11293 #, c-format msgid "a backup is already in progress" msgstr "une sauvegarde est déjà en cours" -#: access/transam/xlog.c:10800 +#: access/transam/xlog.c:10980 #, c-format msgid "Run pg_stop_backup() and try again." msgstr "Exécutez pg_stop_backup() et tentez de nouveau." @@ -2789,157 +2757,157 @@ msgstr "Exécutez pg_stop_backup() et tentez de nouveau." # * (i.e., since last restartpoint used as backup starting # * checkpoint) contain full-page writes. # */ -#: access/transam/xlog.c:10896 +#: access/transam/xlog.c:11076 #, c-format msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" msgstr "Un journal de transaction généré avec full_page_writes=off a été rejoué depuis le dernier point de reprise (restartpoint)" -#: access/transam/xlog.c:10898 access/transam/xlog.c:11481 +#: access/transam/xlog.c:11078 access/transam/xlog.c:11661 #, c-format msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." msgstr "Cela signifie que la sauvegarde en cours de réalisation sur le secondaire est corrompue et ne devrait pas être utilisée. Activez full_page_writes et lancez CHECKPOINT sur le primaire, puis recommencez la sauvegarde." -#: access/transam/xlog.c:10974 replication/basebackup.c:1433 utils/adt/misc.c:345 +#: access/transam/xlog.c:11154 replication/basebackup.c:1433 utils/adt/misc.c:345 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "la cible du lien symbolique « %s » est trop longue" -#: access/transam/xlog.c:11024 commands/tablespace.c:402 commands/tablespace.c:578 replication/basebackup.c:1448 utils/adt/misc.c:353 +#: access/transam/xlog.c:11204 commands/tablespace.c:402 commands/tablespace.c:578 replication/basebackup.c:1448 utils/adt/misc.c:353 #, c-format msgid "tablespaces are not supported on this platform" msgstr "les tablespaces ne sont pas supportés sur cette plateforme" -#: access/transam/xlog.c:11076 access/transam/xlog.c:11114 +#: access/transam/xlog.c:11256 access/transam/xlog.c:11294 #, c-format msgid "If you're sure there is no backup in progress, remove file \"%s\" and try again." msgstr "" "Si vous êtes certain qu'aucune sauvegarde n'est en cours, supprimez le\n" "fichier « %s » et recommencez de nouveau." -#: access/transam/xlog.c:11301 +#: access/transam/xlog.c:11481 #, c-format msgid "exclusive backup not in progress" msgstr "une sauvegarde exclusive n'est pas en cours" -#: access/transam/xlog.c:11328 +#: access/transam/xlog.c:11508 #, c-format msgid "a backup is not in progress" msgstr "aucune sauvegarde n'est en cours" -#: access/transam/xlog.c:11414 access/transam/xlog.c:11427 access/transam/xlog.c:11816 access/transam/xlog.c:11822 access/transam/xlog.c:11870 access/transam/xlog.c:11950 access/transam/xlog.c:11974 access/transam/xlogfuncs.c:733 +#: access/transam/xlog.c:11594 access/transam/xlog.c:11607 access/transam/xlog.c:11996 access/transam/xlog.c:12002 access/transam/xlog.c:12050 access/transam/xlog.c:12130 access/transam/xlog.c:12154 access/transam/xlogfuncs.c:733 #, c-format msgid "invalid data in file \"%s\"" msgstr "données invalides dans le fichier « %s »" -#: access/transam/xlog.c:11431 replication/basebackup.c:1281 +#: access/transam/xlog.c:11611 replication/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "le standby a été promu lors de la sauvegarde en ligne" -#: access/transam/xlog.c:11432 replication/basebackup.c:1282 +#: access/transam/xlog.c:11612 replication/basebackup.c:1282 #, c-format msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "" "Cela signifie que la sauvegarde en cours de réalisation est corrompue et ne\n" "doit pas être utilisée. Recommencez la sauvegarde." -#: access/transam/xlog.c:11479 +#: access/transam/xlog.c:11659 #, c-format msgid "WAL generated with full_page_writes=off was replayed during online backup" msgstr "Un journal de transaction généré avec full_page_writes=off a été rejoué pendant la sauvegarde en ligne" -#: access/transam/xlog.c:11599 +#: access/transam/xlog.c:11779 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "backup de base terminé, en attente de l'archivage des journaux de transactions nécessaires" -#: access/transam/xlog.c:11611 +#: access/transam/xlog.c:11791 #, c-format msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" msgstr "toujours en attente de la fin de l'archivage de tous les segments de journaux de transactions requis (%d secondes passées)" -#: access/transam/xlog.c:11613 +#: access/transam/xlog.c:11793 #, c-format msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." msgstr "Vérifiez que votre archive_command s'exécute correctement. Vous pouvez annuler cette sauvegarde sans souci, mais elle ne sera pas utilisable sans tous les segments WAL." -#: access/transam/xlog.c:11620 +#: access/transam/xlog.c:11800 #, c-format msgid "all required WAL segments have been archived" msgstr "tous les journaux de transactions requis ont été archivés" -#: access/transam/xlog.c:11624 +#: access/transam/xlog.c:11804 #, c-format msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" msgstr "L'archivage des journaux de transactions n'est pas activé ; vous devez vous assurer que tous les des journaux de transactions requis sont copiés par d'autres moyens pour terminer la sauvegarde" -#: access/transam/xlog.c:11677 +#: access/transam/xlog.c:11857 #, c-format msgid "aborting backup due to backend exiting before pg_stop_backup was called" msgstr "annulation de la sauvegarde due à la déconnexion du processus serveur avant que pg_stop_backup ne soit appelé" -#: access/transam/xlog.c:11871 +#: access/transam/xlog.c:12051 #, c-format msgid "Timeline ID parsed is %u, but expected %u." msgstr "L'identifiant de timeline parsé est %u, mais %u était attendu." #. translator: %s is a WAL record description -#: access/transam/xlog.c:11999 +#: access/transam/xlog.c:12179 #, c-format msgid "WAL redo at %X/%X for %s" msgstr "rejeu des WAL à %X/%X pour %s" -#: access/transam/xlog.c:12047 +#: access/transam/xlog.c:12227 #, c-format msgid "online backup mode was not canceled" msgstr "le mode de sauvegarde en ligne n'a pas été annulé" -#: access/transam/xlog.c:12048 +#: access/transam/xlog.c:12228 #, c-format msgid "File \"%s\" could not be renamed to \"%s\": %m." msgstr "Le fichier « %s » n'a pas pu être renommé en « %s » : %m." -#: access/transam/xlog.c:12057 access/transam/xlog.c:12069 access/transam/xlog.c:12079 +#: access/transam/xlog.c:12237 access/transam/xlog.c:12249 access/transam/xlog.c:12259 #, c-format msgid "online backup mode canceled" msgstr "mode de sauvegarde en ligne annulé" -#: access/transam/xlog.c:12070 +#: access/transam/xlog.c:12250 #, c-format msgid "Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." msgstr "Les fichiers « %s » et « %s » sont renommés respectivement « %s » et « %s »." -#: access/transam/xlog.c:12080 +#: access/transam/xlog.c:12260 #, c-format msgid "File \"%s\" was renamed to \"%s\", but file \"%s\" could not be renamed to \"%s\": %m." msgstr "Le fichier « %s » a été renommé en « %s », mais le fichier « %s » n'a pas pu être renommé en « %s » : %m." -#: access/transam/xlog.c:12213 access/transam/xlogutils.c:967 +#: access/transam/xlog.c:12393 access/transam/xlogutils.c:967 #, c-format msgid "could not read from log segment %s, offset %u: %m" msgstr "n'a pas pu lire le journal de transactions %s, décalage %u : %m" -#: access/transam/xlog.c:12219 access/transam/xlogutils.c:974 +#: access/transam/xlog.c:12399 access/transam/xlogutils.c:974 #, c-format msgid "could not read from log segment %s, offset %u: read %d of %zu" msgstr "n'a pas pu lire à partir du segment %s du journal de transactions, décalage %u: lu %d sur %zu" -#: access/transam/xlog.c:12764 +#: access/transam/xlog.c:12944 #, c-format msgid "WAL receiver process shutdown requested" msgstr "le processus wal receiver a reçu une demande d'arrêt" -#: access/transam/xlog.c:12859 +#: access/transam/xlog.c:13039 #, c-format msgid "received promote request" msgstr "a reçu une demande de promotion" -#: access/transam/xlog.c:12872 +#: access/transam/xlog.c:13052 #, c-format msgid "promote trigger file found: %s" msgstr "fichier trigger de promotion trouvé : %s" -#: access/transam/xlog.c:12880 +#: access/transam/xlog.c:13060 #, c-format msgid "could not stat promote trigger file \"%s\": %m" msgstr "n'a pas pu récupérer les propriétés du fichier trigger pour la promotion « %s » : %m" @@ -2997,16 +2965,16 @@ msgstr "une sauvegarde non exclusive est en cours" msgid "Did you mean to use pg_stop_backup('f')?" msgstr "Souhaitiez-vous utiliser pg_stop_backup('f') ?" -#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1311 commands/event_trigger.c:1869 commands/extension.c:1945 commands/extension.c:2053 commands/extension.c:2338 commands/prepare.c:713 executor/execExpr.c:2507 executor/execSRF.c:738 executor/functions.c:1058 foreign/foreign.c:520 libpq/hba.c:2718 replication/logical/launcher.c:937 replication/logical/logicalfuncs.c:157 replication/logical/origin.c:1494 replication/slotfuncs.c:255 replication/walsender.c:3291 storage/ipc/shmem.c:554 utils/adt/datetime.c:4812 utils/adt/genfile.c:507 utils/adt/genfile.c:590 utils/adt/jsonfuncs.c:1933 utils/adt/jsonfuncs.c:2045 utils/adt/jsonfuncs.c:2233 utils/adt/jsonfuncs.c:2342 -#: utils/adt/jsonfuncs.c:3803 utils/adt/mcxtfuncs.c:132 utils/adt/misc.c:218 utils/adt/pgstatfuncs.c:477 utils/adt/pgstatfuncs.c:587 utils/adt/pgstatfuncs.c:1887 utils/adt/varlena.c:4832 utils/fmgr/funcapi.c:74 utils/misc/guc.c:9993 utils/mmgr/portalmem.c:1141 +#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1311 commands/event_trigger.c:1869 commands/extension.c:1945 commands/extension.c:2053 commands/extension.c:2338 commands/prepare.c:713 executor/execExpr.c:2507 executor/execSRF.c:738 executor/functions.c:1058 foreign/foreign.c:520 libpq/hba.c:2722 replication/logical/launcher.c:937 replication/logical/logicalfuncs.c:157 replication/logical/origin.c:1494 replication/slotfuncs.c:255 replication/walsender.c:3300 storage/ipc/shmem.c:554 utils/adt/datetime.c:4812 utils/adt/genfile.c:507 utils/adt/genfile.c:590 utils/adt/jsonfuncs.c:1935 utils/adt/jsonfuncs.c:2047 utils/adt/jsonfuncs.c:2235 utils/adt/jsonfuncs.c:2344 +#: utils/adt/jsonfuncs.c:3805 utils/adt/mcxtfuncs.c:132 utils/adt/misc.c:218 utils/adt/pgstatfuncs.c:477 utils/adt/pgstatfuncs.c:587 utils/adt/pgstatfuncs.c:1887 utils/adt/varlena.c:4825 utils/fmgr/funcapi.c:74 utils/misc/guc.c:9994 utils/mmgr/portalmem.c:1145 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" -"la fonction avec set-value a été appelée dans un contexte qui n'accepte pas\n" +"la fonction renvoyant un ensemble a été appelée dans un contexte qui n'accepte pas\n" "un ensemble" -#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1315 commands/event_trigger.c:1873 commands/extension.c:1949 commands/extension.c:2057 commands/extension.c:2342 commands/prepare.c:717 foreign/foreign.c:525 libpq/hba.c:2722 replication/logical/launcher.c:941 replication/logical/logicalfuncs.c:161 replication/logical/origin.c:1498 replication/slotfuncs.c:259 replication/walsender.c:3295 storage/ipc/shmem.c:558 utils/adt/datetime.c:4816 utils/adt/genfile.c:511 utils/adt/genfile.c:594 utils/adt/mcxtfuncs.c:136 utils/adt/misc.c:222 utils/adt/pgstatfuncs.c:481 utils/adt/pgstatfuncs.c:591 utils/adt/pgstatfuncs.c:1891 utils/adt/varlena.c:4836 utils/misc/guc.c:9997 -#: utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1145 +#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1315 commands/event_trigger.c:1873 commands/extension.c:1949 commands/extension.c:2057 commands/extension.c:2342 commands/prepare.c:717 foreign/foreign.c:525 libpq/hba.c:2726 replication/logical/launcher.c:941 replication/logical/logicalfuncs.c:161 replication/logical/origin.c:1498 replication/slotfuncs.c:259 replication/walsender.c:3304 storage/ipc/shmem.c:558 utils/adt/datetime.c:4816 utils/adt/genfile.c:511 utils/adt/genfile.c:594 utils/adt/mcxtfuncs.c:136 utils/adt/misc.c:222 utils/adt/pgstatfuncs.c:481 utils/adt/pgstatfuncs.c:591 utils/adt/pgstatfuncs.c:1891 utils/adt/varlena.c:4829 utils/misc/guc.c:9998 +#: utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1149 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "mode matérialisé requis mais interdit dans ce contexte" @@ -3063,7 +3031,7 @@ msgstr "%s ne peut pas être exécuté une fois la promotion en cours d'exécuti msgid "\"wait_seconds\" must not be negative or zero" msgstr "« wait_seconds » ne doit pas être négatif ou nul" -#: access/transam/xlogfuncs.c:789 storage/ipc/signalfuncs.c:245 +#: access/transam/xlogfuncs.c:789 storage/ipc/signalfuncs.c:247 #, c-format msgid "failed to send signal to postmaster: %m" msgstr "n'a pas pu envoyer le signal au postmaster : %m" @@ -3075,139 +3043,139 @@ msgid_plural "server did not promote within %d seconds" msgstr[0] "le serveur ne s'est pas promu en %d seconde" msgstr[1] "le serveur ne s'est pas promu dans les %d secondes" -#: access/transam/xlogreader.c:349 +#: access/transam/xlogreader.c:354 #, c-format msgid "invalid record offset at %X/%X" msgstr "décalage invalide de l'enregistrement %X/%X" -#: access/transam/xlogreader.c:357 +#: access/transam/xlogreader.c:362 #, c-format msgid "contrecord is requested by %X/%X" msgstr "« contrecord » est requis par %X/%X" -#: access/transam/xlogreader.c:398 access/transam/xlogreader.c:695 +#: access/transam/xlogreader.c:403 access/transam/xlogreader.c:733 #, c-format msgid "invalid record length at %X/%X: wanted %u, got %u" msgstr "longueur invalide de l'enregistrement à %X/%X : voulait %u, a eu %u" -#: access/transam/xlogreader.c:422 +#: access/transam/xlogreader.c:429 #, c-format msgid "record length %u at %X/%X too long" msgstr "longueur trop importante de l'enregistrement %u à %X/%X" -#: access/transam/xlogreader.c:453 +#: access/transam/xlogreader.c:477 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "il n'existe pas de drapeau contrecord à %X/%X" -#: access/transam/xlogreader.c:466 +#: access/transam/xlogreader.c:490 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "longueur %u invalide du contrecord (%lld attendu) à %X/%X" -#: access/transam/xlogreader.c:703 +#: access/transam/xlogreader.c:741 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "identifiant du gestionnaire de ressources invalide %u à %X/%X" -#: access/transam/xlogreader.c:716 access/transam/xlogreader.c:732 +#: access/transam/xlogreader.c:754 access/transam/xlogreader.c:770 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "enregistrement avec prev-link %X/%X incorrect à %X/%X" -#: access/transam/xlogreader.c:768 +#: access/transam/xlogreader.c:806 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" "somme de contrôle des données du gestionnaire de ressources incorrecte à\n" "l'enregistrement %X/%X" -#: access/transam/xlogreader.c:805 +#: access/transam/xlogreader.c:843 #, c-format msgid "invalid magic number %04X in log segment %s, offset %u" msgstr "numéro magique invalide %04X dans le segment %s, décalage %u" -#: access/transam/xlogreader.c:819 access/transam/xlogreader.c:860 +#: access/transam/xlogreader.c:857 access/transam/xlogreader.c:898 #, c-format msgid "invalid info bits %04X in log segment %s, offset %u" msgstr "bits d'information %04X invalides dans le segment %s, décalage %u" -#: access/transam/xlogreader.c:834 +#: access/transam/xlogreader.c:872 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" -msgstr "le fichier WAL provient d'un système différent : l'identifiant système de la base dans le fichier WAL est %llu, alors que l'identifiant système de la base dans pg_control est %llu" +msgstr "Le fichier WAL provient d'une instance différente : l'identifiant système de la base dans le fichier WAL est %llu, alors que l'identifiant système de la base dans pg_control est %llu" -#: access/transam/xlogreader.c:842 +#: access/transam/xlogreader.c:880 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" -msgstr "Le fichier WAL provient d'un système différent : taille invalide du segment dans l'en-tête de page" +msgstr "Le fichier WAL provient d'une instance différente : taille invalide du segment dans l'en-tête de page" -#: access/transam/xlogreader.c:848 +#: access/transam/xlogreader.c:886 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" -msgstr "le fichier WAL provient d'une instance différente : XLOG_BLCKSZ incorrect dans l'en-tête de page" +msgstr "Le fichier WAL provient d'une instance différente : XLOG_BLCKSZ incorrect dans l'en-tête de page" -#: access/transam/xlogreader.c:879 +#: access/transam/xlogreader.c:917 #, c-format msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" msgstr "pageaddr %X/%X inattendue dans le journal de transactions %s, segment %u" -#: access/transam/xlogreader.c:904 +#: access/transam/xlogreader.c:942 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" msgstr "identifiant timeline %u hors de la séquence (après %u) dans le segment %s, décalage %u" -#: access/transam/xlogreader.c:1249 +#: access/transam/xlogreader.c:1287 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u désordonné à %X/%X" -#: access/transam/xlogreader.c:1271 +#: access/transam/xlogreader.c:1309 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA configuré, mais aucune donnée inclus à %X/%X" -#: access/transam/xlogreader.c:1278 +#: access/transam/xlogreader.c:1316 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA non configuré, mais la longueur des données est %u à %X/%X" -#: access/transam/xlogreader.c:1314 +#: access/transam/xlogreader.c:1352 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLE configué, mais du trou rencontré à l'offset %u longueur %u longueur de l'image du bloc %u à %X/%X" +msgstr "BKPIMAGE_HAS_HOLE activé, mais décalage trou %u longueur %u longueur image bloc %u à %X/%X" -#: access/transam/xlogreader.c:1330 +#: access/transam/xlogreader.c:1368 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLE non configuré, mais trou rencontré à l'offset %u longueur %u à %X/%X" +msgstr "BKPIMAGE_HAS_HOLE désactivé, mais décalage trou %u longueur %u à %X/%X" -#: access/transam/xlogreader.c:1345 +#: access/transam/xlogreader.c:1383 #, c-format msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_IS_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X" -#: access/transam/xlogreader.c:1360 +#: access/transam/xlogreader.c:1398 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_IS_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X" -#: access/transam/xlogreader.c:1376 +#: access/transam/xlogreader.c:1414 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL configuré, mais pas de relation précédente à %X/%X" -#: access/transam/xlogreader.c:1388 +#: access/transam/xlogreader.c:1426 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "block_id %u invalide à %X/%X" -#: access/transam/xlogreader.c:1475 +#: access/transam/xlogreader.c:1513 #, c-format msgid "record with invalid length at %X/%X" msgstr "enregistrement de longueur invalide à %X/%X" -#: access/transam/xlogreader.c:1564 +#: access/transam/xlogreader.c:1602 #, c-format msgid "invalid compressed image at %X/%X, block %d" msgstr "image compressée invalide à %X/%X, bloc %d" @@ -3362,14 +3330,14 @@ msgstr "type de droit %s invalide pour le serveur distant" msgid "column privileges are only valid for relations" msgstr "les droits sur la colonne sont seulement valides pour les relations" -#: catalog/aclchk.c:697 catalog/aclchk.c:4164 catalog/aclchk.c:4985 catalog/objectaddress.c:1060 catalog/pg_largeobject.c:116 storage/large_object/inv_api.c:285 +#: catalog/aclchk.c:697 catalog/aclchk.c:4164 catalog/aclchk.c:4985 catalog/objectaddress.c:1060 catalog/pg_largeobject.c:116 storage/large_object/inv_api.c:287 #, c-format msgid "large object %u does not exist" msgstr "le « Large Object » %u n'existe pas" #: catalog/aclchk.c:926 catalog/aclchk.c:935 commands/collationcmds.c:119 commands/copy.c:362 commands/copy.c:382 commands/copy.c:392 commands/copy.c:401 commands/copy.c:410 commands/copy.c:420 commands/copy.c:429 commands/copy.c:438 commands/copy.c:456 commands/copy.c:472 commands/copy.c:492 commands/copy.c:509 commands/dbcommands.c:157 commands/dbcommands.c:166 commands/dbcommands.c:175 commands/dbcommands.c:184 commands/dbcommands.c:193 commands/dbcommands.c:202 commands/dbcommands.c:211 commands/dbcommands.c:220 commands/dbcommands.c:229 commands/dbcommands.c:238 commands/dbcommands.c:260 commands/dbcommands.c:1502 commands/dbcommands.c:1511 commands/dbcommands.c:1520 -#: commands/dbcommands.c:1529 commands/extension.c:1736 commands/extension.c:1746 commands/extension.c:1756 commands/extension.c:3056 commands/foreigncmds.c:539 commands/foreigncmds.c:548 commands/functioncmds.c:604 commands/functioncmds.c:770 commands/functioncmds.c:779 commands/functioncmds.c:788 commands/functioncmds.c:797 commands/functioncmds.c:2094 commands/functioncmds.c:2102 commands/publicationcmds.c:90 commands/publicationcmds.c:133 commands/sequence.c:1266 commands/sequence.c:1276 commands/sequence.c:1286 commands/sequence.c:1296 commands/sequence.c:1306 commands/sequence.c:1316 commands/sequence.c:1326 commands/sequence.c:1336 commands/sequence.c:1346 -#: commands/subscriptioncmds.c:124 commands/subscriptioncmds.c:134 commands/subscriptioncmds.c:144 commands/subscriptioncmds.c:154 commands/subscriptioncmds.c:168 commands/subscriptioncmds.c:179 commands/subscriptioncmds.c:193 commands/subscriptioncmds.c:203 commands/subscriptioncmds.c:213 commands/tablecmds.c:7499 commands/typecmds.c:335 commands/typecmds.c:1416 commands/typecmds.c:1425 commands/typecmds.c:1433 commands/typecmds.c:1441 commands/typecmds.c:1449 commands/typecmds.c:1457 commands/user.c:133 commands/user.c:147 commands/user.c:156 commands/user.c:165 commands/user.c:174 commands/user.c:183 commands/user.c:192 commands/user.c:201 commands/user.c:210 commands/user.c:219 +#: commands/dbcommands.c:1529 commands/extension.c:1736 commands/extension.c:1746 commands/extension.c:1756 commands/extension.c:3056 commands/foreigncmds.c:539 commands/foreigncmds.c:548 commands/functioncmds.c:605 commands/functioncmds.c:771 commands/functioncmds.c:780 commands/functioncmds.c:789 commands/functioncmds.c:798 commands/functioncmds.c:2095 commands/functioncmds.c:2103 commands/publicationcmds.c:87 commands/publicationcmds.c:130 commands/sequence.c:1266 commands/sequence.c:1276 commands/sequence.c:1286 commands/sequence.c:1296 commands/sequence.c:1306 commands/sequence.c:1316 commands/sequence.c:1326 commands/sequence.c:1336 commands/sequence.c:1346 +#: commands/subscriptioncmds.c:124 commands/subscriptioncmds.c:134 commands/subscriptioncmds.c:144 commands/subscriptioncmds.c:154 commands/subscriptioncmds.c:170 commands/subscriptioncmds.c:181 commands/subscriptioncmds.c:195 commands/subscriptioncmds.c:205 commands/subscriptioncmds.c:215 commands/tablecmds.c:7541 commands/typecmds.c:335 commands/typecmds.c:1416 commands/typecmds.c:1425 commands/typecmds.c:1433 commands/typecmds.c:1441 commands/typecmds.c:1449 commands/typecmds.c:1457 commands/user.c:133 commands/user.c:147 commands/user.c:156 commands/user.c:165 commands/user.c:174 commands/user.c:183 commands/user.c:192 commands/user.c:201 commands/user.c:210 commands/user.c:219 #: commands/user.c:228 commands/user.c:237 commands/user.c:246 commands/user.c:582 commands/user.c:590 commands/user.c:598 commands/user.c:606 commands/user.c:614 commands/user.c:622 commands/user.c:630 commands/user.c:638 commands/user.c:647 commands/user.c:655 commands/user.c:663 parser/parse_utilcmd.c:397 replication/pgoutput/pgoutput.c:189 replication/pgoutput/pgoutput.c:210 replication/pgoutput/pgoutput.c:224 replication/pgoutput/pgoutput.c:234 replication/pgoutput/pgoutput.c:244 replication/walsender.c:882 replication/walsender.c:893 replication/walsender.c:903 #, c-format msgid "conflicting or redundant options" @@ -3385,13 +3353,13 @@ msgstr "les droits par défaut ne peuvent pas être configurés pour les colonne msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "ne peut pas utiliser la clause IN SCHEMA lors de l'utilisation de GRANT/REVOKE ON SCHEMAS" -#: catalog/aclchk.c:1544 catalog/catalog.c:553 catalog/objectaddress.c:1522 commands/analyze.c:390 commands/copy.c:741 commands/sequence.c:1701 commands/tablecmds.c:6975 commands/tablecmds.c:7118 commands/tablecmds.c:7168 commands/tablecmds.c:7242 commands/tablecmds.c:7312 commands/tablecmds.c:7424 commands/tablecmds.c:7518 commands/tablecmds.c:7577 commands/tablecmds.c:7666 commands/tablecmds.c:7695 commands/tablecmds.c:7850 commands/tablecmds.c:7932 commands/tablecmds.c:8088 commands/tablecmds.c:8206 commands/tablecmds.c:11555 commands/tablecmds.c:11737 commands/tablecmds.c:11897 commands/tablecmds.c:13040 commands/tablecmds.c:15601 commands/trigger.c:924 parser/analyze.c:2415 -#: parser/parse_relation.c:714 parser/parse_target.c:1064 parser/parse_type.c:144 parser/parse_utilcmd.c:3421 parser/parse_utilcmd.c:3456 parser/parse_utilcmd.c:3498 utils/adt/acl.c:2845 utils/adt/ruleutils.c:2708 +#: catalog/aclchk.c:1544 catalog/catalog.c:557 catalog/objectaddress.c:1522 commands/analyze.c:390 commands/copy.c:741 commands/sequence.c:1701 commands/tablecmds.c:7004 commands/tablecmds.c:7160 commands/tablecmds.c:7210 commands/tablecmds.c:7284 commands/tablecmds.c:7354 commands/tablecmds.c:7466 commands/tablecmds.c:7560 commands/tablecmds.c:7619 commands/tablecmds.c:7708 commands/tablecmds.c:7737 commands/tablecmds.c:7892 commands/tablecmds.c:7974 commands/tablecmds.c:8130 commands/tablecmds.c:8248 commands/tablecmds.c:11597 commands/tablecmds.c:11778 commands/tablecmds.c:11938 commands/tablecmds.c:13081 commands/tablecmds.c:15646 commands/trigger.c:942 parser/analyze.c:2428 +#: parser/parse_relation.c:714 parser/parse_target.c:1063 parser/parse_type.c:144 parser/parse_utilcmd.c:3421 parser/parse_utilcmd.c:3456 parser/parse_utilcmd.c:3498 utils/adt/acl.c:2845 utils/adt/ruleutils.c:2712 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "la colonne « %s » de la relation « %s » n'existe pas" -#: catalog/aclchk.c:1807 catalog/objectaddress.c:1362 commands/sequence.c:1139 commands/tablecmds.c:249 commands/tablecmds.c:16465 utils/adt/acl.c:2053 utils/adt/acl.c:2083 utils/adt/acl.c:2115 utils/adt/acl.c:2147 utils/adt/acl.c:2175 utils/adt/acl.c:2205 +#: catalog/aclchk.c:1807 catalog/objectaddress.c:1362 commands/sequence.c:1139 commands/tablecmds.c:249 commands/tablecmds.c:16510 utils/adt/acl.c:2053 utils/adt/acl.c:2083 utils/adt/acl.c:2115 utils/adt/acl.c:2147 utils/adt/acl.c:2175 utils/adt/acl.c:2205 #, c-format msgid "\"%s\" is not a sequence" msgstr "« %s » n'est pas une séquence" @@ -3801,7 +3769,7 @@ msgstr "la fonction d'OID %u n'existe pas" msgid "language with OID %u does not exist" msgstr "le langage d'OID %u n'existe pas" -#: catalog/aclchk.c:4249 catalog/aclchk.c:5012 commands/collationcmds.c:517 +#: catalog/aclchk.c:4249 catalog/aclchk.c:5012 commands/collationcmds.c:536 #, c-format msgid "schema with OID %u does not exist" msgstr "le schéma d'OID %u n'existe pas" @@ -3856,7 +3824,7 @@ msgstr "la configuration de recherche plein texte d'OID %u n'existe pas" msgid "event trigger with OID %u does not exist" msgstr "le trigger sur événement d'OID %u n'existe pas" -#: catalog/aclchk.c:5280 commands/collationcmds.c:368 +#: catalog/aclchk.c:5280 commands/collationcmds.c:387 #, c-format msgid "collation with OID %u does not exist" msgstr "le collationnement d'OID %u n'existe pas" @@ -3871,12 +3839,12 @@ msgstr "la conversion d'OID %u n'existe pas" msgid "extension with OID %u does not exist" msgstr "l'extension d'OID %u n'existe pas" -#: catalog/aclchk.c:5374 commands/publicationcmds.c:771 +#: catalog/aclchk.c:5374 commands/publicationcmds.c:818 #, c-format msgid "publication with OID %u does not exist" msgstr "la publication d'OID %u n'existe pas" -#: catalog/aclchk.c:5400 commands/subscriptioncmds.c:1462 +#: catalog/aclchk.c:5400 commands/subscriptioncmds.c:1463 #, c-format msgid "subscription with OID %u does not exist" msgstr "la souscription d'OID %u n'existe pas" @@ -3888,40 +3856,44 @@ msgstr "l'objet statistique d'OID %u n'existe pas" #: catalog/catalog.c:378 #, c-format -msgid "still finding an unused OID within relation \"%s\"" -msgstr "trouve de nouveau un OID inutilisé dans la relation « %s »" +msgid "still searching for an unused OID in relation \"%s\"" +msgstr "recherche toujours un OID inutilisé dans la relation « %s »" #: catalog/catalog.c:380 #, c-format -msgid "OID candidates were checked \"%llu\" times, but no unused OID is yet found." -msgstr "Les candidats OID ont été vérifiés « %llu » fois, mais aucun OID inutilisé n'a encore été trouvé." +msgid "OID candidates have been checked %llu time, but no unused OID has been found yet." +msgid_plural "OID candidates have been checked %llu times, but no unused OID has been found yet." +msgstr[0] "Les candidats OID ont été vérifiés %llu fois, mais aucun OID inutilisé n'a encore été trouvé." +msgstr[1] "Les candidats OID ont été vérifiés %llu fois, mais aucun OID inutilisé n'a encore été trouvé." -#: catalog/catalog.c:403 +#: catalog/catalog.c:405 #, c-format -msgid "new OID has been assigned in relation \"%s\" after \"%llu\" retries" -msgstr "le nouvel OID a été affecté à la relation « %s » après « %llu » tentatives" +msgid "new OID has been assigned in relation \"%s\" after %llu retry" +msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" +msgstr[0] "le nouvel OID a été affecté à la relation « %s » après %llu tentative" +msgstr[1] "le nouvel OID a été affecté à la relation « %s » après %llu tentatives" -#: catalog/catalog.c:532 +#: catalog/catalog.c:536 #, c-format msgid "must be superuser to call pg_nextoid()" msgstr "doit être un super-utilisateur pour appeller pg_nextoid()" -#: catalog/catalog.c:540 +#: catalog/catalog.c:544 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() ne peut être utilisé que pour les catalogues système" -#: catalog/catalog.c:545 parser/parse_utilcmd.c:2266 +#: catalog/catalog.c:549 parser/parse_utilcmd.c:2266 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "l'index « %s » n'appartient pas à la table « %s »" -#: catalog/catalog.c:562 +#: catalog/catalog.c:566 #, c-format msgid "column \"%s\" is not of type oid" msgstr "la colonne « %s » n'est pas de type oid" -#: catalog/catalog.c:569 +#: catalog/catalog.c:573 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "l'index « %s » n'est pas un index de la colonne « %s »" @@ -3936,22 +3908,22 @@ msgstr "n'a pas pu supprimer %s car il est requis par %s" msgid "You can drop %s instead." msgstr "Vous pouvez supprimer %s à la place." -#: catalog/dependency.c:931 catalog/pg_shdepend.c:696 +#: catalog/dependency.c:931 catalog/pg_shdepend.c:697 #, c-format msgid "cannot drop %s because it is required by the database system" msgstr "n'a pas pu supprimer %s car il est requis par le système de bases de données" -#: catalog/dependency.c:1135 catalog/dependency.c:1144 +#: catalog/dependency.c:1141 catalog/dependency.c:1150 #, c-format msgid "%s depends on %s" msgstr "%s dépend de %s" -#: catalog/dependency.c:1156 catalog/dependency.c:1165 +#: catalog/dependency.c:1165 catalog/dependency.c:1174 #, c-format msgid "drop cascades to %s" msgstr "DROP cascade sur %s" -#: catalog/dependency.c:1173 catalog/pg_shdepend.c:825 +#: catalog/dependency.c:1182 catalog/pg_shdepend.c:826 #, c-format msgid "" "\n" @@ -3966,35 +3938,35 @@ msgstr[1] "" "\n" "et %d autres objets (voir le journal applicatif du serveur pour une liste)" -#: catalog/dependency.c:1185 +#: catalog/dependency.c:1194 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "n'a pas pu supprimer %s car d'autres objets en dépendent" -#: catalog/dependency.c:1187 catalog/dependency.c:1188 catalog/dependency.c:1194 catalog/dependency.c:1195 catalog/dependency.c:1206 catalog/dependency.c:1207 commands/tablecmds.c:1298 commands/tablecmds.c:13658 commands/tablespace.c:481 commands/user.c:1095 commands/view.c:492 libpq/auth.c:338 replication/syncrep.c:1043 storage/lmgr/deadlock.c:1152 storage/lmgr/proc.c:1433 utils/adt/acl.c:5250 utils/adt/jsonfuncs.c:618 utils/adt/jsonfuncs.c:624 utils/misc/guc.c:7114 utils/misc/guc.c:7150 utils/misc/guc.c:7220 utils/misc/guc.c:11400 utils/misc/guc.c:11434 utils/misc/guc.c:11468 utils/misc/guc.c:11511 utils/misc/guc.c:11553 +#: catalog/dependency.c:1196 catalog/dependency.c:1197 catalog/dependency.c:1203 catalog/dependency.c:1204 catalog/dependency.c:1215 catalog/dependency.c:1216 commands/tablecmds.c:1297 commands/tablecmds.c:13699 commands/tablespace.c:481 commands/user.c:1095 commands/view.c:492 libpq/auth.c:338 replication/syncrep.c:1043 storage/lmgr/deadlock.c:1152 storage/lmgr/proc.c:1433 utils/adt/acl.c:5250 utils/adt/jsonfuncs.c:618 utils/adt/jsonfuncs.c:624 utils/misc/guc.c:7115 utils/misc/guc.c:7151 utils/misc/guc.c:7221 utils/misc/guc.c:11401 utils/misc/guc.c:11435 utils/misc/guc.c:11469 utils/misc/guc.c:11512 utils/misc/guc.c:11554 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1189 catalog/dependency.c:1196 +#: catalog/dependency.c:1198 catalog/dependency.c:1205 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "Utilisez DROP ... CASCADE pour supprimer aussi les objets dépendants." -#: catalog/dependency.c:1193 +#: catalog/dependency.c:1202 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "ne peut pas supprimer les objets désirés car d'autres objets en dépendent" #. translator: %d always has a value larger than 1 -#: catalog/dependency.c:1202 +#: catalog/dependency.c:1211 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" msgstr[0] "DROP cascade sur %d autre objet" msgstr[1] "DROP cascade sur %d autres objets" -#: catalog/dependency.c:1863 +#: catalog/dependency.c:1875 #, c-format msgid "constant of the type %s cannot be used here" msgstr "la constante de type %s ne peut pas être utilisée ici" @@ -4009,12 +3981,12 @@ msgstr "droit refusé pour créer « %s.%s »" msgid "System catalog modifications are currently disallowed." msgstr "Les modifications du catalogue système sont actuellement interdites." -#: catalog/heap.c:511 commands/tablecmds.c:2335 commands/tablecmds.c:2972 commands/tablecmds.c:6566 +#: catalog/heap.c:511 commands/tablecmds.c:2290 commands/tablecmds.c:2927 commands/tablecmds.c:6595 #, c-format msgid "tables can have at most %d columns" msgstr "les tables peuvent avoir au plus %d colonnes" -#: catalog/heap.c:529 commands/tablecmds.c:6865 +#: catalog/heap.c:529 commands/tablecmds.c:6894 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "le nom de la colonne « %s » entre en conflit avec le nom d'une colonne système" @@ -4051,211 +4023,211 @@ msgstr "aucun collationnement n'a été dérivé pour la colonne « %s » sur la msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "aucun collationnement n'a été dérivé pour la colonne « %s » de type collationnable %s" -#: catalog/heap.c:1199 catalog/index.c:870 commands/createas.c:405 commands/tablecmds.c:3853 +#: catalog/heap.c:1202 catalog/index.c:871 commands/createas.c:405 commands/tablecmds.c:3832 #, c-format msgid "relation \"%s\" already exists" msgstr "la relation « %s » existe déjà" -#: catalog/heap.c:1215 catalog/pg_type.c:435 catalog/pg_type.c:773 catalog/pg_type.c:920 commands/typecmds.c:249 commands/typecmds.c:261 commands/typecmds.c:757 commands/typecmds.c:1172 commands/typecmds.c:1398 commands/typecmds.c:1590 commands/typecmds.c:2563 +#: catalog/heap.c:1218 catalog/pg_type.c:436 catalog/pg_type.c:781 catalog/pg_type.c:928 commands/typecmds.c:249 commands/typecmds.c:261 commands/typecmds.c:757 commands/typecmds.c:1172 commands/typecmds.c:1398 commands/typecmds.c:1590 commands/typecmds.c:2562 #, c-format msgid "type \"%s\" already exists" msgstr "le type « %s » existe déjà" -#: catalog/heap.c:1216 +#: catalog/heap.c:1219 #, c-format msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." msgstr "Une relation a un type associé du même nom, donc vous devez utiliser un nom qui n'entre pas en conflit avec un type existant." -#: catalog/heap.c:1245 +#: catalog/heap.c:1248 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "OID du heap de pg_class non configuré en mode de mise à jour binaire" -#: catalog/heap.c:2458 +#: catalog/heap.c:2461 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "ne peut pas ajouter une contrainte NO INHERIT pour la table partitionnée « %s »" -#: catalog/heap.c:2730 +#: catalog/heap.c:2733 #, c-format msgid "check constraint \"%s\" already exists" msgstr "la contrainte de vérification « %s » existe déjà" -#: catalog/heap.c:2900 catalog/index.c:884 catalog/pg_constraint.c:670 commands/tablecmds.c:8580 +#: catalog/heap.c:2903 catalog/index.c:885 catalog/pg_constraint.c:670 commands/tablecmds.c:8622 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "la contrainte « %s » de la relation « %s » existe déjà" -#: catalog/heap.c:2907 +#: catalog/heap.c:2910 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "la contrainte « %s » entre en conflit avec la constrainte non héritée sur la relation « %s »" -#: catalog/heap.c:2918 +#: catalog/heap.c:2921 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "la contrainte « %s » entre en conflit avec une contrainte héritée sur la relation « %s »" -#: catalog/heap.c:2928 +#: catalog/heap.c:2931 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "la contrainte « %s » entre en conflit avec une contrainte NOT VALID sur la relation « %s »" -#: catalog/heap.c:2933 +#: catalog/heap.c:2936 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "assemblage de la contrainte « %s » avec une définition héritée" -#: catalog/heap.c:3038 +#: catalog/heap.c:3041 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "ne peut pas utiliser la colonne générée « %s » dans une expression de génération de colonne" -#: catalog/heap.c:3040 +#: catalog/heap.c:3043 #, c-format msgid "A generated column cannot reference another generated column." msgstr "Une colonne générée ne peut référencer une autre colonne générée." -#: catalog/heap.c:3046 +#: catalog/heap.c:3049 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "ne peut pas utiliser une variable de ligne dans l'expression de génération d'une colonne" -#: catalog/heap.c:3047 +#: catalog/heap.c:3050 #, c-format msgid "This would cause the generated column to depend on its own value." -msgstr "" +msgstr "Ceci ferait que la colonne générée dépendrait de sa propre valeur." -#: catalog/heap.c:3100 +#: catalog/heap.c:3103 #, c-format msgid "generation expression is not immutable" msgstr "l'expression de génération n'est pas immuable" -#: catalog/heap.c:3128 rewrite/rewriteHandler.c:1245 +#: catalog/heap.c:3131 rewrite/rewriteHandler.c:1268 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "la colonne « %s » est de type %s alors que l'expression par défaut est de type %s" -#: catalog/heap.c:3133 commands/prepare.c:368 parser/analyze.c:2639 parser/parse_target.c:595 parser/parse_target.c:883 parser/parse_target.c:893 rewrite/rewriteHandler.c:1250 +#: catalog/heap.c:3136 commands/prepare.c:368 parser/analyze.c:2652 parser/parse_target.c:594 parser/parse_target.c:882 parser/parse_target.c:892 rewrite/rewriteHandler.c:1273 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Vous devez réécrire l'expression ou lui appliquer une transformation de type." -#: catalog/heap.c:3180 +#: catalog/heap.c:3183 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "seule la table « %s » peut être référencée dans la contrainte de vérification" -#: catalog/heap.c:3478 +#: catalog/heap.c:3481 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "combinaison ON COMMIT et clé étrangère non supportée" -#: catalog/heap.c:3479 +#: catalog/heap.c:3482 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "" "La table « %s » référence « %s » mais elles n'ont pas la même valeur pour le\n" "paramètre ON COMMIT." -#: catalog/heap.c:3484 +#: catalog/heap.c:3487 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "ne peut pas tronquer une table référencée dans une contrainte de clé étrangère" -#: catalog/heap.c:3485 +#: catalog/heap.c:3488 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "La table « %s » référence « %s »." -#: catalog/heap.c:3487 +#: catalog/heap.c:3490 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Tronquez la table « %s » en même temps, ou utilisez TRUNCATE ... CASCADE." -#: catalog/index.c:221 parser/parse_utilcmd.c:2172 +#: catalog/index.c:222 parser/parse_utilcmd.c:2172 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "les clés primaires multiples ne sont pas autorisées pour la table « %s »" -#: catalog/index.c:239 +#: catalog/index.c:240 #, c-format msgid "primary keys cannot be expressions" msgstr "les clés primaires ne peuvent pas être des expressions" -#: catalog/index.c:256 +#: catalog/index.c:257 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "la colonne de clé primaire « %s » n'est pas marquée NOT NULL" -#: catalog/index.c:769 catalog/index.c:1905 +#: catalog/index.c:770 catalog/index.c:1915 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "les index définis par l'utilisateur sur les tables du catalogue système ne sont pas supportés" -#: catalog/index.c:809 +#: catalog/index.c:810 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "les collationnements non-déterministes ne sont pas supportés pour la classe d'opérateurs « %s »" -#: catalog/index.c:824 +#: catalog/index.c:825 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "" "la création en parallèle d'un index sur les tables du catalogue système\n" "n'est pas supportée" -#: catalog/index.c:833 catalog/index.c:1284 +#: catalog/index.c:834 catalog/index.c:1285 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "la création de manière concurrente d'un index pour les contraintes d'exclusion n'est pas supportée" -#: catalog/index.c:842 +#: catalog/index.c:843 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "les index partagés ne peuvent pas être créés après initdb" -#: catalog/index.c:862 commands/createas.c:411 commands/sequence.c:154 parser/parse_utilcmd.c:201 +#: catalog/index.c:863 commands/createas.c:411 commands/sequence.c:154 parser/parse_utilcmd.c:201 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "la relation « %s » existe déjà, poursuite du traitement" -#: catalog/index.c:912 +#: catalog/index.c:913 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "OID de l'index de pg_class non configuré en mode de mise à jour binaire" -#: catalog/index.c:2191 +#: catalog/index.c:2212 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY doit être la première action dans une transaction" -#: catalog/index.c:3576 +#: catalog/index.c:3597 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "ne peut pas ré-indexer les tables temporaires des autres sessions" -#: catalog/index.c:3587 commands/indexcmds.c:3426 +#: catalog/index.c:3608 commands/indexcmds.c:3426 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "ne peut pas réindexer un index invalide sur une table TOAST" -#: catalog/index.c:3603 commands/indexcmds.c:3306 commands/indexcmds.c:3450 commands/tablecmds.c:3292 +#: catalog/index.c:3624 commands/indexcmds.c:3306 commands/indexcmds.c:3450 commands/tablecmds.c:3247 #, c-format msgid "cannot move system relation \"%s\"" msgstr "ne peut pas déplacer la colonne système « %s »" -#: catalog/index.c:3747 +#: catalog/index.c:3768 #, c-format msgid "index \"%s\" was reindexed" msgstr "l'index « %s » a été réindexée" -#: catalog/index.c:3878 +#: catalog/index.c:3899 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "ne peut pas réindexer l'index invalide « %s.%s » sur une table TOAST, ignoré" -#: catalog/namespace.c:258 catalog/namespace.c:462 catalog/namespace.c:554 commands/trigger.c:5134 +#: catalog/namespace.c:258 catalog/namespace.c:462 catalog/namespace.c:554 commands/trigger.c:5152 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "les références entre bases de données ne sont pas implémentées : « %s.%s.%s »" @@ -4330,12 +4302,12 @@ msgstr "le modèle de recherche plein texte « %s » n'existe pas" msgid "text search configuration \"%s\" does not exist" msgstr "la configuration de recherche plein texte « %s » n'existe pas" -#: catalog/namespace.c:2882 parser/parse_expr.c:810 parser/parse_target.c:1256 +#: catalog/namespace.c:2882 parser/parse_expr.c:810 parser/parse_target.c:1255 #, c-format msgid "cross-database references are not implemented: %s" msgstr "les références entre bases de données ne sont pas implémentées : %s" -#: catalog/namespace.c:2888 gram.y:15102 gram.y:17061 parser/parse_expr.c:817 parser/parse_target.c:1263 +#: catalog/namespace.c:2888 gram.y:15102 gram.y:17076 parser/parse_expr.c:817 parser/parse_target.c:1262 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "mauvaise qualification du nom (trop de points entre les noms) : %s" @@ -4350,7 +4322,7 @@ msgstr "ne peut pas déplacer les objets dans ou à partir des schémas temporai msgid "cannot move objects into or out of TOAST schema" msgstr "ne peut pas déplacer les objets dans ou à partir des schémas TOAST" -#: catalog/namespace.c:3097 commands/schemacmds.c:234 commands/schemacmds.c:314 commands/tablecmds.c:1243 +#: catalog/namespace.c:3097 commands/schemacmds.c:234 commands/schemacmds.c:314 commands/tablecmds.c:1242 #, c-format msgid "schema \"%s\" does not exist" msgstr "le schéma « %s » n'existe pas" @@ -4385,27 +4357,27 @@ msgstr "ne peut pas créer des tables temporaires lors de la restauration" msgid "cannot create temporary tables during a parallel operation" msgstr "ne peut pas créer de tables temporaires pendant une opération parallèle" -#: catalog/namespace.c:4331 commands/tablespace.c:1217 commands/variable.c:64 utils/misc/guc.c:11585 utils/misc/guc.c:11663 +#: catalog/namespace.c:4331 commands/tablespace.c:1213 commands/variable.c:64 utils/misc/guc.c:11586 utils/misc/guc.c:11664 #, c-format msgid "List syntax is invalid." msgstr "La syntaxe de la liste est invalide." -#: catalog/objectaddress.c:1370 catalog/pg_publication.c:57 commands/policy.c:96 commands/policy.c:376 commands/policy.c:465 commands/tablecmds.c:243 commands/tablecmds.c:285 commands/tablecmds.c:2145 commands/tablecmds.c:6015 commands/tablecmds.c:11672 +#: catalog/objectaddress.c:1370 catalog/pg_publication.c:58 commands/policy.c:96 commands/policy.c:376 commands/tablecmds.c:243 commands/tablecmds.c:285 commands/tablecmds.c:2134 commands/tablecmds.c:6035 commands/tablecmds.c:11714 #, c-format msgid "\"%s\" is not a table" msgstr "« %s » n'est pas une table" -#: catalog/objectaddress.c:1377 commands/tablecmds.c:255 commands/tablecmds.c:6045 commands/tablecmds.c:16470 commands/view.c:119 +#: catalog/objectaddress.c:1377 commands/tablecmds.c:255 commands/tablecmds.c:6074 commands/tablecmds.c:16515 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "« %s » n'est pas une vue" -#: catalog/objectaddress.c:1384 commands/matview.c:175 commands/tablecmds.c:261 commands/tablecmds.c:16475 +#: catalog/objectaddress.c:1384 commands/matview.c:175 commands/tablecmds.c:261 commands/tablecmds.c:16520 #, c-format msgid "\"%s\" is not a materialized view" msgstr "« %s » n'est pas une vue matérialisée" -#: catalog/objectaddress.c:1391 commands/tablecmds.c:279 commands/tablecmds.c:6048 commands/tablecmds.c:16480 +#: catalog/objectaddress.c:1391 commands/tablecmds.c:279 commands/tablecmds.c:6077 commands/tablecmds.c:16525 #, c-format msgid "\"%s\" is not a foreign table" msgstr "« %s » n'est pas une table distante" @@ -4425,7 +4397,7 @@ msgstr "le nom de la colonne doit être qualifié" msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "la valeur par défaut de la colonne « %s » de la relation « %s » n'existe pas" -#: catalog/objectaddress.c:1645 commands/functioncmds.c:137 commands/tablecmds.c:271 commands/typecmds.c:274 commands/typecmds.c:3713 parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:791 utils/adt/acl.c:4411 +#: catalog/objectaddress.c:1645 commands/functioncmds.c:138 commands/tablecmds.c:271 commands/typecmds.c:274 commands/typecmds.c:3713 parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:791 utils/adt/acl.c:4411 #, c-format msgid "type \"%s\" does not exist" msgstr "le type « %s » n'existe pas" @@ -4505,12 +4477,12 @@ msgstr "la longueur de la liste de nom doit au moins être %d" msgid "argument list length must be exactly %d" msgstr "la longueur de la liste d'arguments doit être %d exactement" -#: catalog/objectaddress.c:2488 libpq/be-fsstubs.c:321 +#: catalog/objectaddress.c:2488 libpq/be-fsstubs.c:318 #, c-format msgid "must be owner of large object %u" msgstr "doit être le propriétaire du Large Object %u" -#: catalog/objectaddress.c:2503 commands/functioncmds.c:1581 +#: catalog/objectaddress.c:2503 commands/functioncmds.c:1582 #, c-format msgid "must be owner of type %s or type %s" msgstr "doit être le propriétaire du type %s ou du type %s" @@ -4525,80 +4497,80 @@ msgstr "doit être super-utilisateur" msgid "must have CREATEROLE privilege" msgstr "doit avoir l'attribut CREATEROLE" -#: catalog/objectaddress.c:2639 +#: catalog/objectaddress.c:2640 #, c-format msgid "unrecognized object type \"%s\"" msgstr "type d'objet non reconnu « %s »" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2882 +#: catalog/objectaddress.c:2883 #, c-format msgid "column %s of %s" msgstr "colonne %s de %s" -#: catalog/objectaddress.c:2897 +#: catalog/objectaddress.c:2898 #, c-format msgid "function %s" msgstr "fonction %s" -#: catalog/objectaddress.c:2910 +#: catalog/objectaddress.c:2911 #, c-format msgid "type %s" msgstr "type %s" -#: catalog/objectaddress.c:2947 +#: catalog/objectaddress.c:2948 #, c-format msgid "cast from %s to %s" msgstr "conversion de %s en %s" -#: catalog/objectaddress.c:2980 +#: catalog/objectaddress.c:2981 #, c-format msgid "collation %s" msgstr "collationnement %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3011 +#: catalog/objectaddress.c:3012 #, c-format msgid "constraint %s on %s" msgstr "contrainte %s sur %s" -#: catalog/objectaddress.c:3017 +#: catalog/objectaddress.c:3018 #, c-format msgid "constraint %s" msgstr "contrainte %s" -#: catalog/objectaddress.c:3049 +#: catalog/objectaddress.c:3050 #, c-format msgid "conversion %s" msgstr "conversion %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3095 +#: catalog/objectaddress.c:3096 #, c-format msgid "default value for %s" msgstr "valeur par défaut pour %s" -#: catalog/objectaddress.c:3109 +#: catalog/objectaddress.c:3110 #, c-format msgid "language %s" msgstr "langage %s" -#: catalog/objectaddress.c:3117 +#: catalog/objectaddress.c:3118 #, c-format msgid "large object %u" msgstr "« Large Object » %u" -#: catalog/objectaddress.c:3130 +#: catalog/objectaddress.c:3131 #, c-format msgid "operator %s" msgstr "opérateur %s" -#: catalog/objectaddress.c:3167 +#: catalog/objectaddress.c:3168 #, c-format msgid "operator class %s for access method %s" msgstr "classe d'opérateur %s pour la méthode d'accès %s" -#: catalog/objectaddress.c:3195 +#: catalog/objectaddress.c:3196 #, c-format msgid "access method %s" msgstr "méthode d'accès %s" @@ -4607,7 +4579,7 @@ msgstr "méthode d'accès %s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3244 +#: catalog/objectaddress.c:3245 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "opérateur %d (%s, %s) de %s : %s" @@ -4616,221 +4588,221 @@ msgstr "opérateur %d (%s, %s) de %s : %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3301 +#: catalog/objectaddress.c:3302 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "fonction %d (%s, %s) de %s : %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3353 +#: catalog/objectaddress.c:3354 #, c-format msgid "rule %s on %s" msgstr "règle %s sur %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3399 +#: catalog/objectaddress.c:3400 #, c-format msgid "trigger %s on %s" msgstr "trigger %s sur %s" -#: catalog/objectaddress.c:3419 +#: catalog/objectaddress.c:3420 #, c-format msgid "schema %s" msgstr "schéma %s" -#: catalog/objectaddress.c:3447 +#: catalog/objectaddress.c:3448 #, c-format msgid "statistics object %s" msgstr "objet statistique %s" -#: catalog/objectaddress.c:3478 +#: catalog/objectaddress.c:3479 #, c-format msgid "text search parser %s" msgstr "analyseur %s de la recherche plein texte" -#: catalog/objectaddress.c:3509 +#: catalog/objectaddress.c:3510 #, c-format msgid "text search dictionary %s" msgstr "dictionnaire %s de la recherche plein texte" -#: catalog/objectaddress.c:3540 +#: catalog/objectaddress.c:3541 #, c-format msgid "text search template %s" msgstr "modèle %s de la recherche plein texte" -#: catalog/objectaddress.c:3571 +#: catalog/objectaddress.c:3572 #, c-format msgid "text search configuration %s" msgstr "configuration %s de recherche plein texte" -#: catalog/objectaddress.c:3584 +#: catalog/objectaddress.c:3585 #, c-format msgid "role %s" msgstr "rôle %s" -#: catalog/objectaddress.c:3600 +#: catalog/objectaddress.c:3601 #, c-format msgid "database %s" msgstr "base de données %s" -#: catalog/objectaddress.c:3616 +#: catalog/objectaddress.c:3617 #, c-format msgid "tablespace %s" msgstr "tablespace %s" -#: catalog/objectaddress.c:3627 +#: catalog/objectaddress.c:3628 #, c-format msgid "foreign-data wrapper %s" msgstr "wrapper de données distantes %s" -#: catalog/objectaddress.c:3637 +#: catalog/objectaddress.c:3638 #, c-format msgid "server %s" msgstr "serveur %s" -#: catalog/objectaddress.c:3670 +#: catalog/objectaddress.c:3671 #, c-format msgid "user mapping for %s on server %s" msgstr "correspondance utilisateur pour %s sur le serveur %s" -#: catalog/objectaddress.c:3722 +#: catalog/objectaddress.c:3723 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "droits par défaut pour les nouvelles relations appartenant au rôle %s dans le schéma %s" -#: catalog/objectaddress.c:3726 +#: catalog/objectaddress.c:3727 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "droits par défaut pour les nouvelles relations appartenant au rôle %s" -#: catalog/objectaddress.c:3732 +#: catalog/objectaddress.c:3733 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "droits par défaut pour les nouvelles séquences appartenant au rôle %s dans le schéma %s" -#: catalog/objectaddress.c:3736 +#: catalog/objectaddress.c:3737 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "droits par défaut pour les nouvelles séquences appartenant au rôle %s" -#: catalog/objectaddress.c:3742 +#: catalog/objectaddress.c:3743 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "droits par défaut pour les nouvelles fonctions appartenant au rôle %s dans le schéma %s" -#: catalog/objectaddress.c:3746 +#: catalog/objectaddress.c:3747 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "droits par défaut pour les nouvelles fonctions appartenant au rôle %s" -#: catalog/objectaddress.c:3752 +#: catalog/objectaddress.c:3753 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "droits par défaut pour les nouveaux types appartenant au rôle %s dans le schéma %s" -#: catalog/objectaddress.c:3756 +#: catalog/objectaddress.c:3757 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "droits par défaut pour les nouveaux types appartenant au rôle %s" -#: catalog/objectaddress.c:3762 +#: catalog/objectaddress.c:3763 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "droits par défaut pour les nouveaux schémas appartenant au rôle %s" -#: catalog/objectaddress.c:3769 +#: catalog/objectaddress.c:3770 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "droits par défaut appartenant au rôle %s dans le schéma %s" -#: catalog/objectaddress.c:3773 +#: catalog/objectaddress.c:3774 #, c-format msgid "default privileges belonging to role %s" msgstr "droits par défaut appartenant au rôle %s" -#: catalog/objectaddress.c:3795 +#: catalog/objectaddress.c:3796 #, c-format msgid "extension %s" msgstr "extension %s" -#: catalog/objectaddress.c:3812 +#: catalog/objectaddress.c:3813 #, c-format msgid "event trigger %s" msgstr "trigger sur événement %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3856 +#: catalog/objectaddress.c:3857 #, c-format msgid "policy %s on %s" msgstr "politique %s sur %s" -#: catalog/objectaddress.c:3870 +#: catalog/objectaddress.c:3871 #, c-format msgid "publication %s" msgstr "publication %s" #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:3898 +#: catalog/objectaddress.c:3899 #, c-format msgid "publication of %s in publication %s" msgstr "publication de %s dans la publication %s" -#: catalog/objectaddress.c:3911 +#: catalog/objectaddress.c:3912 #, c-format msgid "subscription %s" msgstr "souscription %s" -#: catalog/objectaddress.c:3932 +#: catalog/objectaddress.c:3933 #, c-format msgid "transform for %s language %s" msgstr "transformation pour %s langage %s" -#: catalog/objectaddress.c:4003 +#: catalog/objectaddress.c:4004 #, c-format msgid "table %s" msgstr "table %s" -#: catalog/objectaddress.c:4008 +#: catalog/objectaddress.c:4009 #, c-format msgid "index %s" msgstr "index %s" -#: catalog/objectaddress.c:4012 +#: catalog/objectaddress.c:4013 #, c-format msgid "sequence %s" msgstr "séquence %s" -#: catalog/objectaddress.c:4016 +#: catalog/objectaddress.c:4017 #, c-format msgid "toast table %s" msgstr "table TOAST %s" -#: catalog/objectaddress.c:4020 +#: catalog/objectaddress.c:4021 #, c-format msgid "view %s" msgstr "vue %s" -#: catalog/objectaddress.c:4024 +#: catalog/objectaddress.c:4025 #, c-format msgid "materialized view %s" msgstr "vue matérialisée %s" -#: catalog/objectaddress.c:4028 +#: catalog/objectaddress.c:4029 #, c-format msgid "composite type %s" msgstr "type composite %s" -#: catalog/objectaddress.c:4032 +#: catalog/objectaddress.c:4033 #, c-format msgid "foreign table %s" msgstr "table distante %s" -#: catalog/objectaddress.c:4037 +#: catalog/objectaddress.c:4038 #, c-format msgid "relation %s" msgstr "relation %s" -#: catalog/objectaddress.c:4078 +#: catalog/objectaddress.c:4079 #, c-format msgid "operator family %s for access method %s" msgstr "famille d'opérateur %s pour la méthode d'accès %s" @@ -4890,7 +4862,7 @@ msgstr "la fonction finale avec des arguments supplémentaires ne doit pas être msgid "return type of combine function %s is not %s" msgstr "le type de retour de la fonction de d'unification %s n'est pas %s" -#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:4128 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:4125 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "la fonction d'unification avec le type de transaction %s ne doit pas être déclaré STRICT" @@ -4905,12 +4877,12 @@ msgstr "le type de retour de la fonction de sérialisation %s n'est pas %s" msgid "return type of deserialization function %s is not %s" msgstr "le type de retour de la fonction de désérialisation %s n'est pas %s" -#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:189 catalog/pg_proc.c:223 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:190 catalog/pg_proc.c:224 #, c-format msgid "cannot determine result data type" msgstr "n'a pas pu déterminer le type de données en résultat" -#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:202 catalog/pg_proc.c:231 +#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:203 catalog/pg_proc.c:232 #, c-format msgid "unsafe use of pseudo-type \"internal\"" msgstr "utilisation non sûre des pseudo-types « INTERNAL »" @@ -4925,7 +4897,7 @@ msgstr "l'impémentation d'aggrégat glissant retourne le type %s, mais l'implé msgid "sort operator can only be specified for single-argument aggregates" msgstr "l'opérateur de tri peut seulement être indiqué pour des agrégats à un seul argument" -#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:384 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:385 #, c-format msgid "cannot change routine kind" msgstr "ne peut pas modifier le type de routine" @@ -4950,7 +4922,7 @@ msgstr "« %s » est un agrégat d'ensemble hypothétique." msgid "cannot change number of direct arguments of an aggregate function" msgstr "ne peut pas changer le nombre d'arguments directs d'une fonction d'agrégation" -#: catalog/pg_aggregate.c:858 commands/functioncmds.c:701 commands/typecmds.c:1992 commands/typecmds.c:2038 commands/typecmds.c:2090 commands/typecmds.c:2127 commands/typecmds.c:2161 commands/typecmds.c:2195 commands/typecmds.c:2229 commands/typecmds.c:2258 commands/typecmds.c:2345 commands/typecmds.c:2387 parser/parse_func.c:417 parser/parse_func.c:448 parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 parser/parse_func.c:631 parser/parse_func.c:2173 parser/parse_func.c:2446 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:702 commands/typecmds.c:1991 commands/typecmds.c:2037 commands/typecmds.c:2089 commands/typecmds.c:2126 commands/typecmds.c:2160 commands/typecmds.c:2194 commands/typecmds.c:2228 commands/typecmds.c:2257 commands/typecmds.c:2344 commands/typecmds.c:2386 parser/parse_func.c:417 parser/parse_func.c:448 parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 parser/parse_func.c:631 parser/parse_func.c:2173 parser/parse_func.c:2446 #, c-format msgid "function %s does not exist" msgstr "la fonction %s n'existe pas" @@ -5020,12 +4992,12 @@ msgstr "la conversion « %s » existe déjà" msgid "default conversion for %s to %s already exists" msgstr "la conversion par défaut de %s vers %s existe déjà" -#: catalog/pg_depend.c:204 commands/extension.c:3344 +#: catalog/pg_depend.c:211 commands/extension.c:3352 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s est déjà un membre de l'extension « %s »" -#: catalog/pg_depend.c:580 +#: catalog/pg_depend.c:587 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "ne peut pas supprimer la dépendance sur %s car il s'agit d'un objet système" @@ -5075,10 +5047,10 @@ msgstr "ne peut pas détacher la partition « %s »" msgid "The partition is being detached concurrently or has an unfinished detach." msgstr "La partition est en cours de détachement ou à un détachement non terminé." -#: catalog/pg_inherits.c:596 +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4425 commands/tablecmds.c:14815 #, c-format -msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation" -msgstr "Utilisez ALTER TABLE ... DETACH PARTITION ... FINALIZE pour terminer l'opération de détachement en attente" +msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." +msgstr "Utiliser ALTER TABLE ... DETACH PARTITION ... FINALIZE pour terminer l'opération de détachement en attente." #: catalog/pg_inherits.c:600 #, c-format @@ -5155,44 +5127,44 @@ msgstr "l'opérateur %s existe déjà" msgid "operator cannot be its own negator or sort operator" msgstr "l'opérateur ne peut pas être son propre opérateur de négation ou de tri" -#: catalog/pg_proc.c:130 parser/parse_func.c:2235 +#: catalog/pg_proc.c:131 parser/parse_func.c:2235 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" msgstr[0] "les fonctions ne peuvent avoir plus de %d argument" msgstr[1] "les fonctions ne peuvent avoir plus de %d arguments" -#: catalog/pg_proc.c:374 +#: catalog/pg_proc.c:375 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "la fonction « %s » existe déjà avec des types d'arguments identiques" -#: catalog/pg_proc.c:386 +#: catalog/pg_proc.c:387 #, c-format msgid "\"%s\" is an aggregate function." msgstr "« %s » est une fonction d'agrégat." -#: catalog/pg_proc.c:388 +#: catalog/pg_proc.c:389 #, c-format msgid "\"%s\" is a function." msgstr "« %s » est une fonction." -#: catalog/pg_proc.c:390 +#: catalog/pg_proc.c:391 #, c-format msgid "\"%s\" is a procedure." msgstr "« %s » est une procédure." -#: catalog/pg_proc.c:392 +#: catalog/pg_proc.c:393 #, c-format msgid "\"%s\" is a window function." msgstr "la fonction « %s » est une fonction window." -#: catalog/pg_proc.c:412 +#: catalog/pg_proc.c:413 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "ne peut pas changer le fait qu'une procédure ait des paramètres en sortie ou non" -#: catalog/pg_proc.c:413 catalog/pg_proc.c:443 +#: catalog/pg_proc.c:414 catalog/pg_proc.c:444 #, c-format msgid "cannot change return type of existing function" msgstr "ne peut pas modifier le type de retour d'une fonction existante" @@ -5201,91 +5173,91 @@ msgstr "ne peut pas modifier le type de retour d'une fonction existante" #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: catalog/pg_proc.c:419 catalog/pg_proc.c:446 catalog/pg_proc.c:491 catalog/pg_proc.c:517 catalog/pg_proc.c:543 +#: catalog/pg_proc.c:420 catalog/pg_proc.c:447 catalog/pg_proc.c:492 catalog/pg_proc.c:518 catalog/pg_proc.c:544 #, c-format msgid "Use %s %s first." msgstr "Utilisez tout d'abord %s %s." -#: catalog/pg_proc.c:444 +#: catalog/pg_proc.c:445 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "Le type de ligne défini par les paramètres OUT est différent." -#: catalog/pg_proc.c:488 +#: catalog/pg_proc.c:489 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "ne peut pas modifier le nom du paramètre en entrée « %s »" -#: catalog/pg_proc.c:515 +#: catalog/pg_proc.c:516 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "" "ne peut pas supprimer les valeurs par défaut des paramètres de la\n" "fonction existante" -#: catalog/pg_proc.c:541 +#: catalog/pg_proc.c:542 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "" "ne peut pas modifier le type de données d'un paramètre avec une valeur\n" "par défaut" -#: catalog/pg_proc.c:751 +#: catalog/pg_proc.c:752 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "il n'existe pas de fonction intégrée nommée « %s »" -#: catalog/pg_proc.c:849 +#: catalog/pg_proc.c:850 #, c-format msgid "SQL functions cannot return type %s" msgstr "les fonctions SQL ne peuvent pas renvoyer un type %s" -#: catalog/pg_proc.c:864 +#: catalog/pg_proc.c:865 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "les fonctions SQL ne peuvent avoir d'arguments du type %s" -#: catalog/pg_proc.c:976 executor/functions.c:1458 +#: catalog/pg_proc.c:995 executor/functions.c:1458 #, c-format msgid "SQL function \"%s\"" msgstr "Fonction SQL « %s »" -#: catalog/pg_publication.c:59 +#: catalog/pg_publication.c:60 #, c-format msgid "Only tables can be added to publications." msgstr "Seules des tables peuvent être ajoutées aux publications." -#: catalog/pg_publication.c:65 +#: catalog/pg_publication.c:66 #, c-format msgid "\"%s\" is a system table" msgstr "« %s » est une table système" -#: catalog/pg_publication.c:67 +#: catalog/pg_publication.c:68 #, c-format msgid "System tables cannot be added to publications." msgstr "Les tables systèmes ne peuvent pas être ajoutées à une publication." -#: catalog/pg_publication.c:73 +#: catalog/pg_publication.c:74 #, c-format msgid "table \"%s\" cannot be replicated" msgstr "la table « %s » ne peut pas être répliquée" -#: catalog/pg_publication.c:75 +#: catalog/pg_publication.c:76 #, c-format msgid "Temporary and unlogged relations cannot be replicated." msgstr "Les tables tremporaires et les tables non journalisées ne peuvent pas être répliquées." -#: catalog/pg_publication.c:174 +#: catalog/pg_publication.c:251 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "la relation « %s » est déjà un membre de la publication « %s »" -#: catalog/pg_publication.c:470 commands/publicationcmds.c:451 commands/publicationcmds.c:739 +#: catalog/pg_publication.c:533 commands/publicationcmds.c:458 commands/publicationcmds.c:786 #, c-format msgid "publication \"%s\" does not exist" msgstr "la publication « %s » n'existe pas" -#: catalog/pg_shdepend.c:832 +#: catalog/pg_shdepend.c:833 #, c-format msgid "" "\n" @@ -5300,62 +5272,62 @@ msgstr[1] "" "\n" "et des objets dans %d autres bases de données (voir le journal applicatif du serveur pour une liste)" -#: catalog/pg_shdepend.c:1176 +#: catalog/pg_shdepend.c:1180 #, c-format msgid "role %u was concurrently dropped" msgstr "le rôle %u a été supprimé simultanément" -#: catalog/pg_shdepend.c:1188 +#: catalog/pg_shdepend.c:1192 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "le tablespace %u a été supprimé simultanément" -#: catalog/pg_shdepend.c:1202 +#: catalog/pg_shdepend.c:1206 #, c-format msgid "database %u was concurrently dropped" msgstr "la base de données %u a été supprimé simultanément" -#: catalog/pg_shdepend.c:1247 +#: catalog/pg_shdepend.c:1257 #, c-format msgid "owner of %s" msgstr "propriétaire de %s" -#: catalog/pg_shdepend.c:1249 +#: catalog/pg_shdepend.c:1259 #, c-format msgid "privileges for %s" msgstr "droits pour %s" -#: catalog/pg_shdepend.c:1251 +#: catalog/pg_shdepend.c:1261 #, c-format msgid "target of %s" msgstr "cible de %s" -#: catalog/pg_shdepend.c:1253 +#: catalog/pg_shdepend.c:1263 #, c-format msgid "tablespace for %s" msgstr "tablespace pour %s" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1261 +#: catalog/pg_shdepend.c:1271 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" msgstr[0] "%d objet dans %s" msgstr[1] "%d objets dans %s" -#: catalog/pg_shdepend.c:1372 +#: catalog/pg_shdepend.c:1382 #, c-format msgid "cannot drop objects owned by %s because they are required by the database system" msgstr "n'a pas pu supprimer les objets appartenant à %s car ils sont nécessaires au système de bases de données" -#: catalog/pg_shdepend.c:1519 +#: catalog/pg_shdepend.c:1529 #, c-format msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" msgstr "" "ne peut pas réaffecter les objets appartenant à %s car ils sont nécessaires au\n" "système de bases de données" -#: catalog/pg_subscription.c:174 commands/subscriptioncmds.c:777 commands/subscriptioncmds.c:1087 commands/subscriptioncmds.c:1430 +#: catalog/pg_subscription.c:174 commands/subscriptioncmds.c:779 commands/subscriptioncmds.c:1088 commands/subscriptioncmds.c:1431 #, c-format msgid "subscription \"%s\" does not exist" msgstr "la souscription « %s » n'existe pas" @@ -5378,57 +5350,57 @@ msgstr "La synchronization de la table « %s » est en cours et est dans l'état msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." msgstr "Utiliser %s pour activer la souscription si elle n'est pas déjà activée ou utiliser %s pour supprimer la souscription." -#: catalog/pg_type.c:136 catalog/pg_type.c:475 +#: catalog/pg_type.c:136 catalog/pg_type.c:476 #, c-format msgid "pg_type OID value not set when in binary upgrade mode" msgstr "OID de pg_type non configuré en mode de mise à jour binaire" -#: catalog/pg_type.c:255 +#: catalog/pg_type.c:256 #, c-format msgid "invalid type internal size %d" msgstr "taille interne de type invalide %d" -#: catalog/pg_type.c:271 catalog/pg_type.c:279 catalog/pg_type.c:287 catalog/pg_type.c:296 +#: catalog/pg_type.c:272 catalog/pg_type.c:280 catalog/pg_type.c:288 catalog/pg_type.c:297 #, c-format msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" msgstr "l'alignement « %c » est invalide pour le type passé par valeur de taille %d" -#: catalog/pg_type.c:303 +#: catalog/pg_type.c:304 #, c-format msgid "internal size %d is invalid for passed-by-value type" msgstr "la taille interne %d est invalide pour le type passé par valeur" -#: catalog/pg_type.c:313 catalog/pg_type.c:319 +#: catalog/pg_type.c:314 catalog/pg_type.c:320 #, c-format msgid "alignment \"%c\" is invalid for variable-length type" msgstr "l'alignement « %c » est invalide pour le type de longueur variable" -#: catalog/pg_type.c:327 commands/typecmds.c:4164 +#: catalog/pg_type.c:328 commands/typecmds.c:4164 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "les types de taille fixe doivent avoir un stockage de base" -#: catalog/pg_type.c:816 +#: catalog/pg_type.c:824 #, c-format msgid "could not form array type name for type \"%s\"" msgstr "n'a pas pu former le nom du type array pour le type de données « %s »" -#: catalog/pg_type.c:921 +#: catalog/pg_type.c:929 #, c-format msgid "Failed while creating a multirange type for type \"%s\"." msgstr "Échec lors de la création d'un type multirange pour le type « %s »." -#: catalog/pg_type.c:922 +#: catalog/pg_type.c:930 #, c-format -msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute" -msgstr "Vous pouvez modifier manuellement un nom de type multirange en utilisant l'attribut « multirange_type_name »" +msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." +msgstr "Vous pouvez spécifier manuellement un nom de type multirange en utilisant l'attribut « multirange_type_name »" -#: catalog/storage.c:450 storage/buffer/bufmgr.c:1026 +#: catalog/storage.c:450 storage/buffer/bufmgr.c:1035 #, c-format msgid "invalid page in block %u of relation %s" msgstr "page invalide dans le bloc %u de la relation %s" -#: catalog/toasting.c:104 commands/indexcmds.c:667 commands/tablecmds.c:6027 commands/tablecmds.c:16335 +#: catalog/toasting.c:110 commands/indexcmds.c:667 commands/tablecmds.c:6047 commands/tablecmds.c:16380 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "« %s » n'est ni une table ni une vue matérialisée" @@ -5513,7 +5485,7 @@ msgstr "les fonctions de sérialisation ne peuvent être spécifiées que quand msgid "must specify both or neither of serialization and deserialization functions" msgstr "doit spécifier soit toutes soit aucunes des fonctions de sérialisation et désérialisation" -#: commands/aggregatecmds.c:437 commands/functioncmds.c:649 +#: commands/aggregatecmds.c:437 commands/functioncmds.c:650 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "le paramètre « parallel » doit être SAFE, RESTRICTED ou UNSAFE" @@ -5543,12 +5515,12 @@ msgstr "le serveur « %s » existe déjà" msgid "language \"%s\" already exists" msgstr "le langage « %s » existe déjà" -#: commands/alter.c:96 commands/publicationcmds.c:183 +#: commands/alter.c:96 commands/publicationcmds.c:180 #, c-format msgid "publication \"%s\" already exists" msgstr "la publication « %s » existe déjà" -#: commands/alter.c:99 commands/subscriptioncmds.c:398 +#: commands/alter.c:99 commands/subscriptioncmds.c:400 #, c-format msgid "subscription \"%s\" already exists" msgstr "la souscription « %s » existe déjà" @@ -5618,7 +5590,7 @@ msgstr "la méthode d'accès « %s » n'existe pas" msgid "handler function is not specified" msgstr "la fonction handler n'est pas spécifiée" -#: commands/amcmds.c:264 commands/event_trigger.c:183 commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:681 parser/parse_clause.c:940 +#: commands/amcmds.c:264 commands/event_trigger.c:183 commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:699 parser/parse_clause.c:940 #, c-format msgid "function %s must return type %s" msgstr "la fonction %s doit renvoyer le type %s" @@ -5652,69 +5624,64 @@ msgstr "analyse « %s.%s »" msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "la colonne « %s » de la relation « %s » apparait plus d'une fois" -#: commands/analyze.c:790 +#: commands/analyze.c:805 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"\n" msgstr "ANALYZE automatique de la table « %s.%s.%s »\n" -#: commands/analyze.c:811 -#, c-format -msgid "system usage: %s" -msgstr "utilisation du système : %s" - -#: commands/analyze.c:1350 +#: commands/analyze.c:1351 #, c-format msgid "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead rows; %d rows in sample, %.0f estimated total rows" msgstr "« %s » : %d pages parcourues parmi %u, contenant %.0f lignes à conserver et %.0f lignes à supprimer ; %d lignes dans l'échantillon, %.0f lignes totales estimées" -#: commands/analyze.c:1430 +#: commands/analyze.c:1431 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" msgstr "ignore l'analyse de l'arbre d'héritage « %s.%s » --- cet arbre d'héritage ne contient pas de tables enfants" -#: commands/analyze.c:1528 +#: commands/analyze.c:1529 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no analyzable child tables" msgstr "ignore l'analyse de l'arbre d'héritage « %s.%s » --- cet arbre d'héritage ne contient pas de tables enfants analysables" -#: commands/async.c:639 +#: commands/async.c:646 #, c-format msgid "channel name cannot be empty" msgstr "le nom du canal ne peut pas être vide" -#: commands/async.c:645 +#: commands/async.c:652 #, c-format msgid "channel name too long" msgstr "nom du canal trop long" -#: commands/async.c:650 +#: commands/async.c:657 #, c-format msgid "payload string too long" msgstr "chaîne de charge trop longue" -#: commands/async.c:869 +#: commands/async.c:876 #, c-format msgid "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" msgstr "" "ne peut pas exécuter PREPARE sur une transaction qui a exécuté LISTEN,\n" "UNLISTEN ou NOTIFY" -#: commands/async.c:975 +#: commands/async.c:980 #, c-format msgid "too many notifications in the NOTIFY queue" msgstr "trop de notifications dans la queue NOTIFY" -#: commands/async.c:1646 +#: commands/async.c:1616 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "la queue NOTIFY est pleine à %.0f%%" -#: commands/async.c:1648 +#: commands/async.c:1618 #, c-format msgid "The server process with PID %d is among those with the oldest transactions." msgstr "Le processus serveur de PID %d est parmi ceux qui ont les transactions les plus anciennes." -#: commands/async.c:1651 +#: commands/async.c:1621 #, c-format msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." msgstr "" @@ -5741,7 +5708,7 @@ msgstr "ne peut pas exécuter CLUSTER sur une table partitionnée" msgid "there is no previously clustered index for table \"%s\"" msgstr "il n'y a pas d'index CLUSTER précédent pour la table « %s »" -#: commands/cluster.c:187 commands/tablecmds.c:13495 commands/tablecmds.c:15363 +#: commands/cluster.c:187 commands/tablecmds.c:13536 commands/tablecmds.c:15408 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "l'index « %s » pour la table « %s » n'existe pas" @@ -5756,7 +5723,7 @@ msgstr "ne peut pas exécuter CLUSTER sur un catalogue partagé" msgid "cannot vacuum temporary tables of other sessions" msgstr "ne peut pas exécuter VACUUM sur les tables temporaires des autres sessions" -#: commands/cluster.c:456 commands/tablecmds.c:15373 +#: commands/cluster.c:456 commands/tablecmds.c:15418 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "« %s » n'est pas un index de la table « %s »" @@ -5837,42 +5804,47 @@ msgstr "le paramètre « lc_ctype » doit être spécifié" msgid "nondeterministic collations not supported with this provider" msgstr "les collationnements non déterministes ne sont pas supportés avec ce fournisseur" -#: commands/collationcmds.c:266 +#: commands/collationcmds.c:227 +#, c-format +msgid "current database's encoding is not supported with this provider" +msgstr "l'encodage de la base de données courante n'est pas supporté avec ce fournisseur" + +#: commands/collationcmds.c:285 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "le collationnament « %s » pour l'encodage « %s » existe déjà dans le schéma « %s »" -#: commands/collationcmds.c:277 +#: commands/collationcmds.c:296 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "le collationnement « %s » existe déjà dans le schéma « %s »" -#: commands/collationcmds.c:325 +#: commands/collationcmds.c:344 #, c-format msgid "changing version from %s to %s" msgstr "changement de version de %s à %s" -#: commands/collationcmds.c:340 +#: commands/collationcmds.c:359 #, c-format msgid "version has not changed" msgstr "la version n'a pas changé" -#: commands/collationcmds.c:454 +#: commands/collationcmds.c:473 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "n'a pas pu convertir le nom de locale « %s » en balise de langage : %s" -#: commands/collationcmds.c:512 +#: commands/collationcmds.c:531 #, c-format msgid "must be superuser to import system collations" msgstr "doit être super-utilisateur pour importer les collationnements systèmes" -#: commands/collationcmds.c:540 commands/copyfrom.c:1500 commands/copyto.c:682 libpq/be-secure-common.c:81 +#: commands/collationcmds.c:559 commands/copyfrom.c:1500 commands/copyto.c:680 libpq/be-secure-common.c:81 #, c-format msgid "could not execute command \"%s\": %m" msgstr "n'a pas pu exécuter la commande « %s » : %m" -#: commands/collationcmds.c:671 +#: commands/collationcmds.c:690 #, c-format msgid "no usable system locales were found" msgstr "aucune locale système utilisable n'a été trouvée" @@ -6087,12 +6059,12 @@ msgstr "la colonne « %s » est une colonne générée" msgid "Generated columns cannot be used in COPY." msgstr "Les colonnes générées ne peuvent pas être utilisées dans COPY." -#: commands/copy.c:746 commands/indexcmds.c:1754 commands/statscmds.c:238 commands/tablecmds.c:2366 commands/tablecmds.c:3022 commands/tablecmds.c:3515 parser/parse_relation.c:3593 parser/parse_relation.c:3613 utils/adt/tsvector_op.c:2680 +#: commands/copy.c:746 commands/indexcmds.c:1754 commands/statscmds.c:241 commands/tablecmds.c:2321 commands/tablecmds.c:2977 commands/tablecmds.c:3470 parser/parse_relation.c:3593 parser/parse_relation.c:3613 utils/adt/tsvector_op.c:2680 #, c-format msgid "column \"%s\" does not exist" msgstr "la colonne « %s » n'existe pas" -#: commands/copy.c:753 commands/tablecmds.c:2392 commands/trigger.c:933 parser/parse_target.c:1080 parser/parse_target.c:1091 +#: commands/copy.c:753 commands/tablecmds.c:2347 commands/trigger.c:951 parser/parse_target.c:1079 parser/parse_target.c:1090 #, c-format msgid "column \"%s\" specified more than once" msgstr "la colonne « %s » est spécifiée plus d'une fois" @@ -6177,7 +6149,7 @@ msgstr "la colonne « %s » FORCE_NULL n'est pas référencée par COPY" msgid "COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \\copy." msgstr "COPY TO indique au serveur PostgreSQL de lire un fichier. Vous pourriez vouloir utiliser la fonctionnalité \\copy de psql pour lire en local." -#: commands/copyfrom.c:1532 commands/copyto.c:734 +#: commands/copyfrom.c:1532 commands/copyto.c:732 #, c-format msgid "\"%s\" is a directory" msgstr "« %s » est un répertoire" @@ -6419,17 +6391,17 @@ msgstr "la relation référencée par l'instruction COPY a changé" msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" msgstr "la colonne « %s » FORCE_QUOTE n'est pas référencée par COPY" -#: commands/copyto.c:699 +#: commands/copyto.c:697 #, c-format msgid "relative path not allowed for COPY to file" msgstr "un chemin relatif n'est pas autorisé à utiliser COPY vers un fichier" -#: commands/copyto.c:718 +#: commands/copyto.c:716 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "n'a pas pu ouvrir le fichier « %s » en écriture : %m" -#: commands/copyto.c:721 +#: commands/copyto.c:719 #, c-format msgid "COPY TO instructs the PostgreSQL server process to write a file. You may want a client-side facility such as psql's \\copy." msgstr "COPY TO indique au serveur PostgreSQL d'écrire un fichier. Vous pourriez vouloir utiliser la fonctionnalité \\copy de psql pour écrire en local." @@ -6656,7 +6628,7 @@ msgstr "" "Vous devez d'abord les déplacer dans le tablespace par défaut de la base\n" "de données avant d'utiliser cette commande." -#: commands/dbcommands.c:1404 commands/dbcommands.c:1980 commands/dbcommands.c:2203 commands/dbcommands.c:2261 commands/tablespace.c:631 +#: commands/dbcommands.c:1404 commands/dbcommands.c:1980 commands/dbcommands.c:2203 commands/dbcommands.c:2261 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "" @@ -6695,7 +6667,7 @@ msgid_plural "There are %d other sessions using the database." msgstr[0] "%d autre session utilise la base de données." msgstr[1] "%d autres sessions utilisent la base de données." -#: commands/dbcommands.c:2094 storage/ipc/procarray.c:3749 +#: commands/dbcommands.c:2094 storage/ipc/procarray.c:3809 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." @@ -6737,7 +6709,7 @@ msgstr "l'argument de %s doit être un nom de type" msgid "invalid argument for %s: \"%s\"" msgstr "argument invalide pour %s : « %s »" -#: commands/dropcmds.c:100 commands/functioncmds.c:1410 utils/adt/ruleutils.c:2806 +#: commands/dropcmds.c:100 commands/functioncmds.c:1411 utils/adt/ruleutils.c:2810 #, c-format msgid "\"%s\" is an aggregate function" msgstr "« %s » est une fonction d'agrégat" @@ -6747,12 +6719,12 @@ msgstr "« %s » est une fonction d'agrégat" msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "Utiliser DROP AGGREGATE pour supprimer les fonctions d'agrégat." -#: commands/dropcmds.c:158 commands/sequence.c:447 commands/tablecmds.c:3599 commands/tablecmds.c:3757 commands/tablecmds.c:3802 commands/tablecmds.c:15796 tcop/utility.c:1307 +#: commands/dropcmds.c:158 commands/sequence.c:447 commands/tablecmds.c:3554 commands/tablecmds.c:3712 commands/tablecmds.c:3765 commands/tablecmds.c:15841 tcop/utility.c:1324 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "la relation « %s » n'existe pas, poursuite du traitement" -#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1248 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1247 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "le schéma « %s » n'existe pas, poursuite du traitement" @@ -6777,7 +6749,7 @@ msgstr "le collationnement « %s » n'existe pas, poursuite du traitement" msgid "conversion \"%s\" does not exist, skipping" msgstr "la conversion « %s » n'existe pas, poursuite du traitement" -#: commands/dropcmds.c:293 commands/statscmds.c:630 +#: commands/dropcmds.c:293 commands/statscmds.c:670 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "l'objet statistique « %s » n'existe pas, poursuite du traitement" @@ -7053,7 +7025,7 @@ msgstr "" "le paramètre « %s » ne peut pas être configuré dans un fichier de contrôle\n" "secondaire de l'extension" -#: commands/extension.c:552 commands/extension.c:560 commands/extension.c:568 utils/misc/guc.c:7092 +#: commands/extension.c:552 commands/extension.c:560 commands/extension.c:568 utils/misc/guc.c:7093 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "le paramètre « %s » requiert une valeur booléenne" @@ -7222,19 +7194,19 @@ msgstr "la version « %s » de l'extension « %s » est déjà installée" msgid "cannot add an object of this type to an extension" msgstr "ne peut pas ajouter un objet de ce type à une extension" -#: commands/extension.c:3356 +#: commands/extension.c:3364 #, c-format msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "" "ne peut pas ajouter le schéma « %s » à l'extension « %s » car le schéma\n" "contient l'extension" -#: commands/extension.c:3384 +#: commands/extension.c:3392 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s n'est pas un membre de l'extension « %s »" -#: commands/extension.c:3450 +#: commands/extension.c:3458 #, c-format msgid "file \"%s\" is too large" msgstr "le fichier « %s » est trop gros" @@ -7345,366 +7317,366 @@ msgstr "le wrapper de données distantes « %s » ne supporte pas IMPORT FOREIGN msgid "importing foreign table \"%s\"" msgstr "import de la table distante « %s »" -#: commands/functioncmds.c:108 +#: commands/functioncmds.c:109 #, c-format msgid "SQL function cannot return shell type %s" msgstr "la fonction SQL ne peut pas retourner le type shell %s" -#: commands/functioncmds.c:113 +#: commands/functioncmds.c:114 #, c-format msgid "return type %s is only a shell" msgstr "le type de retour %s est seulement un shell" -#: commands/functioncmds.c:143 parser/parse_type.c:354 +#: commands/functioncmds.c:144 parser/parse_type.c:354 #, c-format msgid "type modifier cannot be specified for shell type \"%s\"" msgstr "le modificateur de type ne peut pas être précisé pour le type shell « %s »" -#: commands/functioncmds.c:149 +#: commands/functioncmds.c:150 #, c-format msgid "type \"%s\" is not yet defined" msgstr "le type « %s » n'est pas encore défini" -#: commands/functioncmds.c:150 +#: commands/functioncmds.c:151 #, c-format msgid "Creating a shell type definition." msgstr "Création d'une définition d'un type shell." -#: commands/functioncmds.c:249 +#: commands/functioncmds.c:250 #, c-format msgid "SQL function cannot accept shell type %s" msgstr "la fonction SQL ne peut pas accepter le type shell %s" -#: commands/functioncmds.c:255 +#: commands/functioncmds.c:256 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "l'agrégat ne peut pas accepter le type shell %s" -#: commands/functioncmds.c:260 +#: commands/functioncmds.c:261 #, c-format msgid "argument type %s is only a shell" msgstr "le type d'argument %s n'est qu'une enveloppe" -#: commands/functioncmds.c:270 +#: commands/functioncmds.c:271 #, c-format msgid "type %s does not exist" msgstr "le type %s n'existe pas" -#: commands/functioncmds.c:284 +#: commands/functioncmds.c:285 #, c-format msgid "aggregates cannot accept set arguments" msgstr "les agrégats ne peuvent pas utiliser des ensembles comme arguments" -#: commands/functioncmds.c:288 +#: commands/functioncmds.c:289 #, c-format msgid "procedures cannot accept set arguments" msgstr "les procédures ne peuvent pas utiliser des arguments d'ensemble" -#: commands/functioncmds.c:292 +#: commands/functioncmds.c:293 #, c-format msgid "functions cannot accept set arguments" msgstr "les fonctions ne peuvent pas accepter des arguments d'ensemble" -#: commands/functioncmds.c:302 +#: commands/functioncmds.c:303 #, c-format msgid "VARIADIC parameter must be the last input parameter" msgstr "le paramètre VARIADIC doit être le dernier paramètre en entrée" -#: commands/functioncmds.c:322 +#: commands/functioncmds.c:323 #, c-format msgid "VARIADIC parameter must be the last parameter" msgstr "le paramètre VARIADIC doit être le dernier paramètre" -#: commands/functioncmds.c:347 +#: commands/functioncmds.c:348 #, c-format msgid "VARIADIC parameter must be an array" msgstr "le paramètre VARIADIC doit être un tableau" -#: commands/functioncmds.c:392 +#: commands/functioncmds.c:393 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "le nom du paramètre « %s » est utilisé plus d'une fois" -#: commands/functioncmds.c:410 +#: commands/functioncmds.c:411 #, c-format msgid "only input parameters can have default values" msgstr "seuls les paramètres en entrée peuvent avoir des valeurs par défaut" -#: commands/functioncmds.c:425 +#: commands/functioncmds.c:426 #, c-format msgid "cannot use table references in parameter default value" msgstr "" "ne peut pas utiliser les références de tables dans la valeur par défaut des\n" "paramètres" -#: commands/functioncmds.c:449 +#: commands/functioncmds.c:450 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "les paramètres en entrée suivant un paramètre avec valeur par défaut doivent aussi avoir des valeurs par défaut" -#: commands/functioncmds.c:459 +#: commands/functioncmds.c:460 #, c-format msgid "procedure OUT parameters cannot appear after one with a default value" msgstr "les paramètres OUT d'une procédure ne peuvent pas apparaître après un paramètre ayant une valeur par défaut" -#: commands/functioncmds.c:611 commands/functioncmds.c:802 +#: commands/functioncmds.c:612 commands/functioncmds.c:803 #, c-format msgid "invalid attribute in procedure definition" msgstr "attribute invalide dans la définition de la procédure" -#: commands/functioncmds.c:707 +#: commands/functioncmds.c:708 #, c-format msgid "support function %s must return type %s" msgstr "la fonction de support %s doit renvoyer le type %s" -#: commands/functioncmds.c:718 +#: commands/functioncmds.c:719 #, c-format msgid "must be superuser to specify a support function" msgstr "doit être super-utilisateur pour spécifier une fonction de support" -#: commands/functioncmds.c:851 commands/functioncmds.c:1455 +#: commands/functioncmds.c:852 commands/functioncmds.c:1456 #, c-format msgid "COST must be positive" msgstr "COST doit être positif" -#: commands/functioncmds.c:859 commands/functioncmds.c:1463 +#: commands/functioncmds.c:860 commands/functioncmds.c:1464 #, c-format msgid "ROWS must be positive" msgstr "ROWS doit être positif" -#: commands/functioncmds.c:888 +#: commands/functioncmds.c:889 #, c-format msgid "no function body specified" msgstr "aucun corps de fonction spécifié" -#: commands/functioncmds.c:893 +#: commands/functioncmds.c:894 #, c-format msgid "duplicate function body specified" msgstr "corps de fonction dupliqué spécifié" -#: commands/functioncmds.c:898 +#: commands/functioncmds.c:899 #, c-format msgid "inline SQL function body only valid for language SQL" -msgstr "" +msgstr "le corps d'une fonction SQL est seulement valide pour le langage SQL" -#: commands/functioncmds.c:940 +#: commands/functioncmds.c:941 #, c-format msgid "SQL function with unquoted function body cannot have polymorphic arguments" -msgstr "la fonction SQL avec un corps de fonction sans guillemets ne peuvent pas avoir des arguments polymorphiques" +msgstr "la fonction SQL avec un corps de fonction sans guillemets ne peut pas avoir des arguments polymorphiques" -#: commands/functioncmds.c:966 commands/functioncmds.c:985 +#: commands/functioncmds.c:967 commands/functioncmds.c:986 #, c-format msgid "%s is not yet supported in unquoted SQL function body" msgstr "%s n'est pas encore accepté dans une corps de fonction SQL sans guillemets" -#: commands/functioncmds.c:1013 +#: commands/functioncmds.c:1014 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "seul un élément AS est nécessaire pour le langage « %s »" -#: commands/functioncmds.c:1118 +#: commands/functioncmds.c:1119 #, c-format msgid "no language specified" msgstr "aucun langage spécifié" -#: commands/functioncmds.c:1126 commands/functioncmds.c:2128 commands/proclang.c:237 +#: commands/functioncmds.c:1127 commands/functioncmds.c:2129 commands/proclang.c:237 #, c-format msgid "language \"%s\" does not exist" msgstr "le langage « %s » n'existe pas" -#: commands/functioncmds.c:1128 commands/functioncmds.c:2130 +#: commands/functioncmds.c:1129 commands/functioncmds.c:2131 #, c-format msgid "Use CREATE EXTENSION to load the language into the database." msgstr "Utiliser CREATE EXTENSION pour charger le langage dans la base de données." -#: commands/functioncmds.c:1163 commands/functioncmds.c:1447 +#: commands/functioncmds.c:1164 commands/functioncmds.c:1448 #, c-format msgid "only superuser can define a leakproof function" msgstr "seul un superutilisateur peut définir une fonction leakproof" -#: commands/functioncmds.c:1214 +#: commands/functioncmds.c:1215 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "le type de résultat de la fonction doit être %s à cause des paramètres OUT" -#: commands/functioncmds.c:1227 +#: commands/functioncmds.c:1228 #, c-format msgid "function result type must be specified" msgstr "le type de résultat de la fonction doit être spécifié" -#: commands/functioncmds.c:1281 commands/functioncmds.c:1467 +#: commands/functioncmds.c:1282 commands/functioncmds.c:1468 #, c-format msgid "ROWS is not applicable when function does not return a set" msgstr "ROWS n'est pas applicable quand la fonction ne renvoie pas un ensemble" -#: commands/functioncmds.c:1567 +#: commands/functioncmds.c:1568 #, c-format msgid "source data type %s is a pseudo-type" msgstr "le type de données source %s est un pseudo-type" -#: commands/functioncmds.c:1573 +#: commands/functioncmds.c:1574 #, c-format msgid "target data type %s is a pseudo-type" msgstr "le type de données cible %s est un pseudo-type" -#: commands/functioncmds.c:1597 +#: commands/functioncmds.c:1598 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "la conversion sera ignorée car le type de données source est un domaine" -#: commands/functioncmds.c:1602 +#: commands/functioncmds.c:1603 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "la conversion sera ignorée car le type de données cible est un domaine" -#: commands/functioncmds.c:1627 +#: commands/functioncmds.c:1628 #, c-format msgid "cast function must take one to three arguments" msgstr "la fonction de conversion doit prendre de un à trois arguments" -#: commands/functioncmds.c:1631 +#: commands/functioncmds.c:1632 #, c-format msgid "argument of cast function must match or be binary-coercible from source data type" msgstr "l'argument de la fonction de conversion doit correspondre ou être binary-coercible à partir du type de la donnée source" -#: commands/functioncmds.c:1635 +#: commands/functioncmds.c:1636 #, c-format msgid "second argument of cast function must be type %s" msgstr "le second argument de la fonction de conversion doit être de type %s" -#: commands/functioncmds.c:1640 +#: commands/functioncmds.c:1641 #, c-format msgid "third argument of cast function must be type %s" msgstr "le troisième argument de la fonction de conversion doit être de type %s" -#: commands/functioncmds.c:1645 +#: commands/functioncmds.c:1646 #, c-format msgid "return data type of cast function must match or be binary-coercible to target data type" msgstr "" "le type de donnée en retour de la fonction de conversion doit correspondre\n" "ou être coercible binairement au type de données cible" -#: commands/functioncmds.c:1656 +#: commands/functioncmds.c:1657 #, c-format msgid "cast function must not be volatile" msgstr "la fonction de conversion ne doit pas être volatile" -#: commands/functioncmds.c:1661 +#: commands/functioncmds.c:1662 #, c-format msgid "cast function must be a normal function" msgstr "la fonction de conversion doit être une fonction normale" -#: commands/functioncmds.c:1665 +#: commands/functioncmds.c:1666 #, c-format msgid "cast function must not return a set" msgstr "la fonction de conversion ne doit pas renvoyer un ensemble" -#: commands/functioncmds.c:1691 +#: commands/functioncmds.c:1692 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "doit être super-utilisateur pour créer une fonction de conversion SANS FONCTION" -#: commands/functioncmds.c:1706 +#: commands/functioncmds.c:1707 #, c-format msgid "source and target data types are not physically compatible" msgstr "les types de données source et cible ne sont pas physiquement compatibles" -#: commands/functioncmds.c:1721 +#: commands/functioncmds.c:1722 #, c-format msgid "composite data types are not binary-compatible" msgstr "les types de données composites ne sont pas compatibles binairement" -#: commands/functioncmds.c:1727 +#: commands/functioncmds.c:1728 #, c-format msgid "enum data types are not binary-compatible" msgstr "les types de données enum ne sont pas compatibles binairement" -#: commands/functioncmds.c:1733 +#: commands/functioncmds.c:1734 #, c-format msgid "array data types are not binary-compatible" msgstr "les types de données tableau ne sont pas compatibles binairement" -#: commands/functioncmds.c:1750 +#: commands/functioncmds.c:1751 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "les types de données domaines ne sont pas compatibles binairement" -#: commands/functioncmds.c:1760 +#: commands/functioncmds.c:1761 #, c-format msgid "source data type and target data type are the same" msgstr "les types de données source et cible sont identiques" -#: commands/functioncmds.c:1793 +#: commands/functioncmds.c:1794 #, c-format msgid "transform function must not be volatile" msgstr "la fonction de transformation ne doit pas être volatile" -#: commands/functioncmds.c:1797 +#: commands/functioncmds.c:1798 #, c-format msgid "transform function must be a normal function" msgstr "la fonction de transformation doit être une fonction normale" -#: commands/functioncmds.c:1801 +#: commands/functioncmds.c:1802 #, c-format msgid "transform function must not return a set" msgstr "la fonction de transformation ne doit pas renvoyer un ensemble" -#: commands/functioncmds.c:1805 +#: commands/functioncmds.c:1806 #, c-format msgid "transform function must take one argument" msgstr "la fonction de transformation doit prendre de un argument" -#: commands/functioncmds.c:1809 +#: commands/functioncmds.c:1810 #, c-format msgid "first argument of transform function must be type %s" msgstr "le premier argument de la fonction de transformation doit être de type %s" -#: commands/functioncmds.c:1848 +#: commands/functioncmds.c:1849 #, c-format msgid "data type %s is a pseudo-type" msgstr "le type de données %s est un pseudo-type" -#: commands/functioncmds.c:1854 +#: commands/functioncmds.c:1855 #, c-format msgid "data type %s is a domain" msgstr "le type de données %s est un domaine" -#: commands/functioncmds.c:1894 +#: commands/functioncmds.c:1895 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "le type de donnée en retour de la fonction FROM SQL doit être %s" -#: commands/functioncmds.c:1920 +#: commands/functioncmds.c:1921 #, c-format msgid "return data type of TO SQL function must be the transform data type" msgstr "le type de donnée en retour de la fonction TO SQL doit être du type de données de la transformation" -#: commands/functioncmds.c:1949 +#: commands/functioncmds.c:1950 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "la transformation pour le type %s et le langage « %s » existe déjà" -#: commands/functioncmds.c:2036 +#: commands/functioncmds.c:2037 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "la transformation pour le type %s et le langage « %s » n'existe pas" -#: commands/functioncmds.c:2060 +#: commands/functioncmds.c:2061 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "la fonction %s existe déjà dans le schéma « %s »" -#: commands/functioncmds.c:2115 +#: commands/functioncmds.c:2116 #, c-format msgid "no inline code specified" msgstr "aucun code en ligne spécifié" -#: commands/functioncmds.c:2161 +#: commands/functioncmds.c:2162 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "le langage « %s » ne supporte pas l'exécution de code en ligne" -#: commands/functioncmds.c:2256 +#: commands/functioncmds.c:2257 #, c-format msgid "cannot pass more than %d argument to a procedure" msgid_plural "cannot pass more than %d arguments to a procedure" @@ -7741,12 +7713,12 @@ msgstr "ne peut pas créer de contraintes d'exclusion sur la table partitionnée msgid "cannot create indexes on temporary tables of other sessions" msgstr "ne peut pas créer les index sur les tables temporaires des autres sessions" -#: commands/indexcmds.c:745 commands/tablecmds.c:748 commands/tablespace.c:1185 +#: commands/indexcmds.c:745 commands/tablecmds.c:747 commands/tablespace.c:1181 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "ne peut pas spécifier un tablespace par défaut pour les relations partitionnées" -#: commands/indexcmds.c:777 commands/tablecmds.c:783 commands/tablecmds.c:3299 +#: commands/indexcmds.c:777 commands/tablecmds.c:782 commands/tablecmds.c:3254 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "seules les relations partagées peuvent être placées dans le tablespace pg_global" @@ -7806,12 +7778,12 @@ msgstr "la contrainte %s sur la table « %s » ne contient pas la colonne « %s msgid "index creation on system columns is not supported" msgstr "la création d'un index sur les tables du catalogue système n'est pas supportée" -#: commands/indexcmds.c:1231 tcop/utility.c:1493 +#: commands/indexcmds.c:1231 tcop/utility.c:1510 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "ne peut pas créer un index unique sur la table partitionnée « %s »" -#: commands/indexcmds.c:1233 tcop/utility.c:1495 +#: commands/indexcmds.c:1233 tcop/utility.c:1512 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "La table « %s » contient des partitions qui ne sont pas des tables distantes." @@ -7863,7 +7835,7 @@ msgstr "une colonne incluse ne supporte pas d'options NULLS FIRST/LAST" msgid "could not determine which collation to use for index expression" msgstr "n'a pas pu déterminer le collationnement à utiliser pour l'expression d'index" -#: commands/indexcmds.c:1876 commands/tablecmds.c:16801 commands/typecmds.c:810 parser/parse_expr.c:2680 parser/parse_type.c:566 parser/parse_utilcmd.c:3781 utils/adt/misc.c:599 +#: commands/indexcmds.c:1876 commands/tablecmds.c:16846 commands/typecmds.c:810 parser/parse_expr.c:2685 parser/parse_type.c:566 parser/parse_utilcmd.c:3781 utils/adt/misc.c:599 #, c-format msgid "collations are not supported by type %s" msgstr "les collationnements ne sont pas supportés par le type %s" @@ -7900,7 +7872,7 @@ msgstr "la méthode d'accès « %s » ne supporte pas les options ASC/DESC" msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "la méthode d'accès « %s » ne supporte pas les options NULLS FIRST/LAST" -#: commands/indexcmds.c:2031 commands/tablecmds.c:16826 commands/tablecmds.c:16832 commands/typecmds.c:2318 +#: commands/indexcmds.c:2031 commands/tablecmds.c:16871 commands/tablecmds.c:16877 commands/typecmds.c:2317 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "" @@ -7919,7 +7891,7 @@ msgstr "" msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "la classe d'opérateur « %s » n'existe pas pour la méthode d'accès « %s »" -#: commands/indexcmds.c:2084 commands/typecmds.c:2306 +#: commands/indexcmds.c:2084 commands/typecmds.c:2305 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "la classe d'opérateur « %s » n'accepte pas le type de données %s" @@ -8006,7 +7978,7 @@ msgstr "ne peut pas déplacer la relation non partagée dans le tablespace « %s msgid "index \"%s.%s\" was reindexed" msgstr "l'index « %s.%s » a été réindexé" -#: commands/lockcmds.c:92 commands/tablecmds.c:6018 commands/trigger.c:289 rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:938 +#: commands/lockcmds.c:92 commands/tablecmds.c:6038 commands/trigger.c:307 rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:938 #, c-format msgid "\"%s\" is not a table or view" msgstr "« %s » n'est ni une table ni une vue" @@ -8016,27 +7988,27 @@ msgstr "« %s » n'est ni une table ni une vue" msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "CONCURRENTLY ne peut pas être utilisé quand la vue matérialisée n'est pas peuplée" -#: commands/matview.c:188 +#: commands/matview.c:188 gram.y:16812 #, c-format -msgid "CONCURRENTLY and WITH NO DATA options cannot be used together" -msgstr "Les options CONCURRENTLY et WITH NO DATA ne peuvent pas être utilisées ensemble" +msgid "%s and %s options cannot be used together" +msgstr "les options %s et %s ne peuvent pas être utilisées ensemble" -#: commands/matview.c:244 +#: commands/matview.c:245 #, c-format msgid "cannot refresh materialized view \"%s\" concurrently" msgstr "ne peut pas rafraîchir de manière concurrente la vue matérialisée « %s »" -#: commands/matview.c:247 +#: commands/matview.c:248 #, c-format msgid "Create a unique index with no WHERE clause on one or more columns of the materialized view." msgstr "Crée un index unique sans clause WHERE sur une ou plusieurs colonnes de la vue matérialisée." -#: commands/matview.c:652 +#: commands/matview.c:660 #, c-format msgid "new data for materialized view \"%s\" contains duplicate rows without any null columns" msgstr "les nouvelles données pour la vue matérialisée « %s » contiennent des lignes dupliquées sans colonnes NULL" -#: commands/matview.c:654 +#: commands/matview.c:662 #, c-format msgid "Row: %s" msgstr "Ligne : %s" @@ -8323,7 +8295,7 @@ msgstr "" msgid "operator attribute \"%s\" cannot be changed" msgstr "l'attribut « %s » de l'opérateur ne peut pas être changé" -#: commands/policy.c:89 commands/policy.c:382 commands/policy.c:471 commands/statscmds.c:150 commands/tablecmds.c:1561 commands/tablecmds.c:2150 commands/tablecmds.c:3409 commands/tablecmds.c:5997 commands/tablecmds.c:8859 commands/tablecmds.c:16391 commands/tablecmds.c:16426 commands/trigger.c:295 commands/trigger.c:1271 commands/trigger.c:1380 rewrite/rewriteDefine.c:277 rewrite/rewriteDefine.c:943 rewrite/rewriteRemove.c:80 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:151 commands/tablecmds.c:1560 commands/tablecmds.c:2139 commands/tablecmds.c:3364 commands/tablecmds.c:6017 commands/tablecmds.c:8901 commands/tablecmds.c:16436 commands/tablecmds.c:16471 commands/trigger.c:313 commands/trigger.c:1289 commands/trigger.c:1398 rewrite/rewriteDefine.c:277 rewrite/rewriteDefine.c:943 rewrite/rewriteRemove.c:80 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "droit refusé : « %s » est un catalogue système" @@ -8338,32 +8310,27 @@ msgstr "ingore les rôles spécifiés autre que PUBLIC" msgid "All roles are members of the PUBLIC role." msgstr "Tous les rôles sont membres du rôle PUBLIC." -#: commands/policy.c:488 -#, c-format -msgid "role \"%s\" could not be removed from policy \"%s\" on \"%s\"" -msgstr "le rôle « %s » n'a pas pu être supprimé de la politique « %s » sur « %s »" - -#: commands/policy.c:708 +#: commands/policy.c:607 #, c-format msgid "WITH CHECK cannot be applied to SELECT or DELETE" msgstr "WITH CHECK ne peut pas être appliqué à SELECT et DELETE" -#: commands/policy.c:717 commands/policy.c:1022 +#: commands/policy.c:616 commands/policy.c:921 #, c-format msgid "only WITH CHECK expression allowed for INSERT" msgstr "seule une expression WITH CHECK est autorisée pour INSERT" -#: commands/policy.c:792 commands/policy.c:1245 +#: commands/policy.c:691 commands/policy.c:1144 #, c-format msgid "policy \"%s\" for table \"%s\" already exists" msgstr "la politique « %s » pour la table « %s » existe déjà" -#: commands/policy.c:994 commands/policy.c:1273 commands/policy.c:1344 +#: commands/policy.c:893 commands/policy.c:1172 commands/policy.c:1243 #, c-format msgid "policy \"%s\" for table \"%s\" does not exist" msgstr "la politique « %s » pour la table « %s » n'existe pas" -#: commands/policy.c:1012 +#: commands/policy.c:911 #, c-format msgid "only USING expression allowed for SELECT, DELETE" msgstr "seule une expression USING est autorisée pour SELECT, DELETE" @@ -8435,57 +8402,57 @@ msgstr "l'instruction préparée « %s » n'existe pas" msgid "must be superuser to create custom procedural language" msgstr "doit être super-utilisateur pour créer un langage de procédures personnalisé" -#: commands/publicationcmds.c:107 +#: commands/publicationcmds.c:104 #, c-format msgid "invalid list syntax for \"publish\" option" msgstr "syntaxe de liste invalide pour l'option « publish »" -#: commands/publicationcmds.c:125 +#: commands/publicationcmds.c:122 #, c-format msgid "unrecognized \"publish\" value: \"%s\"" msgstr "type « publish » non reconnu : « %s »" -#: commands/publicationcmds.c:140 +#: commands/publicationcmds.c:137 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "paramètre de publication non reconnu : « %s »" -#: commands/publicationcmds.c:172 +#: commands/publicationcmds.c:169 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "doit être super-utilisateur pour créer une publication « FOR ALL TABLES »" -#: commands/publicationcmds.c:248 +#: commands/publicationcmds.c:250 #, c-format msgid "wal_level is insufficient to publish logical changes" msgstr "la valeur de wal_level est insuffisante pour publier des modifications logiques" -#: commands/publicationcmds.c:249 +#: commands/publicationcmds.c:251 #, c-format msgid "Set wal_level to logical before creating subscriptions." msgstr "Configurez wal_level à la valeur logical pour créer des souscriptions." -#: commands/publicationcmds.c:369 +#: commands/publicationcmds.c:376 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "la publication « %s » est définie avec FOR ALL TABLES" -#: commands/publicationcmds.c:371 +#: commands/publicationcmds.c:378 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "Les tables ne peuvent pas être ajoutées ou supprimées à des publications FOR ALL TABLES." -#: commands/publicationcmds.c:660 +#: commands/publicationcmds.c:707 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "la relation « %s » ne fait pas partie de la publication" -#: commands/publicationcmds.c:703 +#: commands/publicationcmds.c:750 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "droit refusé pour modifier le propriétaire de la publication « %s »" -#: commands/publicationcmds.c:705 +#: commands/publicationcmds.c:752 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "Le propriétaire d'une publication FOR ALL TABLES doit être un super-utilisateur." @@ -8647,214 +8614,214 @@ msgstr "la séquence doit être dans le même schéma que la table avec laquelle msgid "cannot change ownership of identity sequence" msgstr "ne peut pas modifier le propriétaire de la séquence d'identité" -#: commands/sequence.c:1717 commands/tablecmds.c:13187 commands/tablecmds.c:15816 +#: commands/sequence.c:1717 commands/tablecmds.c:13228 commands/tablecmds.c:15861 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "La séquence « %s » est liée à la table « %s »." -#: commands/statscmds.c:111 commands/statscmds.c:120 tcop/utility.c:1843 +#: commands/statscmds.c:112 commands/statscmds.c:121 tcop/utility.c:1860 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "seule une relation seule est acceptée dans CREATE STATISTICS" -#: commands/statscmds.c:138 +#: commands/statscmds.c:139 #, c-format msgid "relation \"%s\" is not a table, foreign table, or materialized view" msgstr "la relation « %s » n'est pas une table, une table distante ou une vue matérialisée" -#: commands/statscmds.c:188 +#: commands/statscmds.c:189 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "l'objet statistique « %s » existe déjà, poursuite du traitement" -#: commands/statscmds.c:196 +#: commands/statscmds.c:197 #, c-format msgid "statistics object \"%s\" already exists" msgstr "l'objet statistique « %s » existe déjà" -#: commands/statscmds.c:207 +#: commands/statscmds.c:208 #, c-format msgid "cannot have more than %d columns in statistics" msgstr "ne peut pas avoir plus de %d colonnes dans des statistiques" -#: commands/statscmds.c:246 +#: commands/statscmds.c:249 commands/statscmds.c:272 commands/statscmds.c:305 #, c-format msgid "statistics creation on system columns is not supported" msgstr "la création de statistiques sur les colonnes systèmes n'est pas supportée" -#: commands/statscmds.c:253 +#: commands/statscmds.c:256 commands/statscmds.c:279 #, c-format msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" msgstr "la colonne « %s » ne peut pas être utilisée dans des statistiques parce que son type %s n'a pas de classe d'opérateur btree par défaut" -#: commands/statscmds.c:282 +#: commands/statscmds.c:322 #, c-format msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" msgstr "l'expression ne peut pas être utilisée dans des statistiques multivariates parce que son type %s n'a pas de classe d'opérateur btree par défaut" -#: commands/statscmds.c:303 +#: commands/statscmds.c:343 #, c-format msgid "when building statistics on a single expression, statistics kinds may not be specified" -msgstr "" +msgstr "lors de la construction de statistiques sur une simple expression, les types de statistiques n'ont pas besoin d'être spécifiés" -#: commands/statscmds.c:332 +#: commands/statscmds.c:372 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "type de statistique « %s » non reconnu" -#: commands/statscmds.c:361 +#: commands/statscmds.c:401 #, c-format msgid "extended statistics require at least 2 columns" msgstr "les statistiques étendues requièrent au moins 2 colonnes" -#: commands/statscmds.c:379 +#: commands/statscmds.c:419 #, c-format msgid "duplicate column name in statistics definition" msgstr "nom de colonne dupliqué dans la définition des statistiques" -#: commands/statscmds.c:414 +#: commands/statscmds.c:454 #, c-format msgid "duplicate expression in statistics definition" msgstr "expression dupliquée dans la définition des statistiques" -#: commands/statscmds.c:595 commands/tablecmds.c:7829 +#: commands/statscmds.c:635 commands/tablecmds.c:7871 #, c-format msgid "statistics target %d is too low" msgstr "la cible statistique %d est trop basse" -#: commands/statscmds.c:603 commands/tablecmds.c:7837 +#: commands/statscmds.c:643 commands/tablecmds.c:7879 #, c-format msgid "lowering statistics target to %d" msgstr "abaissement de la cible statistique à %d" -#: commands/statscmds.c:626 +#: commands/statscmds.c:666 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "l'objet statistique « %s.%s » n'existe pas, poursuite du traitement" -#: commands/subscriptioncmds.c:221 +#: commands/subscriptioncmds.c:223 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "paramètre de souscription non reconnu : « %s »" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:235 commands/subscriptioncmds.c:241 commands/subscriptioncmds.c:247 commands/subscriptioncmds.c:266 commands/subscriptioncmds.c:272 +#: commands/subscriptioncmds.c:237 commands/subscriptioncmds.c:243 commands/subscriptioncmds.c:249 commands/subscriptioncmds.c:268 commands/subscriptioncmds.c:274 #, c-format msgid "%s and %s are mutually exclusive options" msgstr "%s et %s sont des options mutuellement exclusives" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:279 commands/subscriptioncmds.c:285 +#: commands/subscriptioncmds.c:281 commands/subscriptioncmds.c:287 #, c-format msgid "subscription with %s must also set %s" msgstr "la souscription avec %s doit aussi configurer %s" -#: commands/subscriptioncmds.c:378 +#: commands/subscriptioncmds.c:380 #, c-format msgid "must be superuser to create subscriptions" msgstr "doit être super-utilisateur pour créer des souscriptions" -#: commands/subscriptioncmds.c:472 commands/subscriptioncmds.c:570 replication/logical/tablesync.c:975 replication/logical/worker.c:3212 +#: commands/subscriptioncmds.c:474 commands/subscriptioncmds.c:572 replication/logical/tablesync.c:975 replication/logical/worker.c:3192 #, c-format msgid "could not connect to the publisher: %s" msgstr "n'a pas pu se connecter au publieur : %s" -#: commands/subscriptioncmds.c:514 +#: commands/subscriptioncmds.c:516 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "création du slot de réplication « %s » sur le publieur" #. translator: %s is an SQL ALTER statement -#: commands/subscriptioncmds.c:527 +#: commands/subscriptioncmds.c:529 #, c-format msgid "tables were not subscribed, you will have to run %s to subscribe the tables" msgstr "les tables n'étaient pas souscrites, vous devrez exécuter %s pour souscrire aux tables" -#: commands/subscriptioncmds.c:826 +#: commands/subscriptioncmds.c:828 #, c-format msgid "cannot set %s for enabled subscription" msgstr "ne peut définir %s pour une souscription active" -#: commands/subscriptioncmds.c:882 +#: commands/subscriptioncmds.c:884 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "ne peut pas activer une souscription qui n'a pas de nom de slot" -#: commands/subscriptioncmds.c:934 commands/subscriptioncmds.c:982 +#: commands/subscriptioncmds.c:936 commands/subscriptioncmds.c:983 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION avec rafraîchissement n'est pas autorisé pour les souscriptions désactivées" -#: commands/subscriptioncmds.c:935 commands/subscriptioncmds.c:983 +#: commands/subscriptioncmds.c:937 commands/subscriptioncmds.c:984 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "Utilisez ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1003 +#: commands/subscriptioncmds.c:1004 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH n'est pas autorisé pour les souscriptions désactivées" -#: commands/subscriptioncmds.c:1091 +#: commands/subscriptioncmds.c:1092 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "la souscription « %s » n'existe pas, poursuite du traitement" -#: commands/subscriptioncmds.c:1343 +#: commands/subscriptioncmds.c:1344 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "slot de réplication « %s » supprimé sur le publieur" -#: commands/subscriptioncmds.c:1352 commands/subscriptioncmds.c:1360 +#: commands/subscriptioncmds.c:1353 commands/subscriptioncmds.c:1361 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" msgstr "n'a pas pu supprimer le slot de réplication « %s » sur le publieur : %s" -#: commands/subscriptioncmds.c:1394 +#: commands/subscriptioncmds.c:1395 #, c-format msgid "permission denied to change owner of subscription \"%s\"" msgstr "droit refusé pour modifier le propriétaire de la souscription « %s »" -#: commands/subscriptioncmds.c:1396 +#: commands/subscriptioncmds.c:1397 #, c-format msgid "The owner of a subscription must be a superuser." msgstr "Le propriétaire d'une souscription doit être un super-utilisateur." -#: commands/subscriptioncmds.c:1512 +#: commands/subscriptioncmds.c:1513 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "n'a pas pu recevoir la liste des tables répliquées à partir du publieur : %s" -#: commands/subscriptioncmds.c:1577 +#: commands/subscriptioncmds.c:1578 #, c-format msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" msgstr "n'a pas pu se connecter au publieur lors de la tentative de suppression du slot de réplication « %s » : %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1580 +#: commands/subscriptioncmds.c:1581 #, c-format msgid "Use %s to disassociate the subscription from the slot." msgstr "Utilisez %s pour dissocier la souscription du slot." -#: commands/subscriptioncmds.c:1610 +#: commands/subscriptioncmds.c:1611 #, c-format msgid "publication name \"%s\" used more than once" msgstr "nom de publication « %s » utilisé plus d'une fois" -#: commands/subscriptioncmds.c:1654 +#: commands/subscriptioncmds.c:1655 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "la publication « %s » est déjà dans la souscription « %s »" -#: commands/subscriptioncmds.c:1668 +#: commands/subscriptioncmds.c:1669 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "la publication « %s » n'est pas dans la souscription « %s »" -#: commands/subscriptioncmds.c:1679 +#: commands/subscriptioncmds.c:1680 #, c-format -msgid "subscription must contain at least one publication" -msgstr "la souscription doit contenir au moins une publication" +msgid "cannot drop all the publications from a subscription" +msgstr "ne peut pas supprimer toutes les publications d'une souscription" #: commands/tablecmds.c:241 commands/tablecmds.c:283 #, c-format @@ -8912,7 +8879,7 @@ msgstr "la vue matérialisée « %s » n'existe pas, poursuite du traitement" msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "Utilisez DROP MATERIALIZED VIEW pour supprimer une vue matérialisée." -#: commands/tablecmds.c:265 commands/tablecmds.c:289 commands/tablecmds.c:18237 parser/parse_utilcmd.c:2247 +#: commands/tablecmds.c:265 commands/tablecmds.c:289 commands/tablecmds.c:18317 parser/parse_utilcmd.c:2247 #, c-format msgid "index \"%s\" does not exist" msgstr "l'index « %s » n'existe pas" @@ -8935,7 +8902,7 @@ msgstr "« %s » n'est pas un type" msgid "Use DROP TYPE to remove a type." msgstr "Utilisez DROP TYPE pour supprimer un type." -#: commands/tablecmds.c:277 commands/tablecmds.c:13026 commands/tablecmds.c:15519 +#: commands/tablecmds.c:277 commands/tablecmds.c:13067 commands/tablecmds.c:15564 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "la table distante « %s » n'existe pas" @@ -8949,287 +8916,287 @@ msgstr "la table distante « %s » n'existe pas, poursuite du traitement" msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Utilisez DROP FOREIGN TABLE pour supprimer une table distante." -#: commands/tablecmds.c:664 +#: commands/tablecmds.c:663 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT peut seulement être utilisé sur des tables temporaires" -#: commands/tablecmds.c:695 +#: commands/tablecmds.c:694 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "" "ne peut pas créer une table temporaire à l'intérieur d'une fonction\n" "restreinte pour sécurité" -#: commands/tablecmds.c:731 commands/tablecmds.c:14310 +#: commands/tablecmds.c:730 commands/tablecmds.c:14351 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "la relation « %s » serait héritée plus d'une fois" -#: commands/tablecmds.c:916 +#: commands/tablecmds.c:915 #, c-format msgid "specifying a table access method is not supported on a partitioned table" msgstr "spécifier une méthode d'accès à la table n'est pas supporté sur une partitionnée" -#: commands/tablecmds.c:1012 +#: commands/tablecmds.c:1011 #, c-format msgid "\"%s\" is not partitioned" msgstr "« %s » n'est pas partitionné" -#: commands/tablecmds.c:1107 +#: commands/tablecmds.c:1106 #, c-format msgid "cannot partition using more than %d columns" msgstr "ne peut pas partitionner en utilisant plus de %d colonnes" -#: commands/tablecmds.c:1163 +#: commands/tablecmds.c:1162 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "ne peut pas créer une partition distante sur la table partitionnée « %s »" -#: commands/tablecmds.c:1165 +#: commands/tablecmds.c:1164 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "La table « %s » contient des index qui sont uniques." -#: commands/tablecmds.c:1328 +#: commands/tablecmds.c:1327 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY ne permet pas de supprimer plusieurs objets" -#: commands/tablecmds.c:1332 +#: commands/tablecmds.c:1331 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY ne permet pas la CASCADE" -#: commands/tablecmds.c:1433 +#: commands/tablecmds.c:1432 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "ne peut pas supprimer l'index partitionné « %s » de manière concurrente" -#: commands/tablecmds.c:1705 +#: commands/tablecmds.c:1704 #, c-format msgid "cannot truncate only a partitioned table" msgstr "ne peut pas seulement tronquer une table partitionnée" -#: commands/tablecmds.c:1706 +#: commands/tablecmds.c:1705 #, c-format msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." msgstr "Ne spécifiez pas le mot clé ONLY ou utilisez TRUNCATE ONLY directement sur les partitions." -#: commands/tablecmds.c:1779 +#: commands/tablecmds.c:1777 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "TRUNCATE cascade sur la table « %s »" -#: commands/tablecmds.c:2138 +#: commands/tablecmds.c:2127 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "ne peut pas tronquer la table distante « %s »" -#: commands/tablecmds.c:2187 +#: commands/tablecmds.c:2176 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "ne peut pas tronquer les tables temporaires des autres sessions" -#: commands/tablecmds.c:2449 commands/tablecmds.c:14207 +#: commands/tablecmds.c:2404 commands/tablecmds.c:14248 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "ne peut pas hériter de la table partitionnée « %s »" -#: commands/tablecmds.c:2454 +#: commands/tablecmds.c:2409 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "ne peut pas hériter de la partition « %s »" -#: commands/tablecmds.c:2462 parser/parse_utilcmd.c:2477 parser/parse_utilcmd.c:2619 +#: commands/tablecmds.c:2417 parser/parse_utilcmd.c:2477 parser/parse_utilcmd.c:2619 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "la relation héritée « %s » n'est ni une table ni une table distante" -#: commands/tablecmds.c:2474 +#: commands/tablecmds.c:2429 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "ne peut pas créer une relation temporaire comme partition de la relation permanente « %s »" -#: commands/tablecmds.c:2483 commands/tablecmds.c:14186 +#: commands/tablecmds.c:2438 commands/tablecmds.c:14227 #, c-format msgid "cannot inherit from temporary relation \"%s\"" -msgstr "ine peut pas hériter à partir d'une relation temporaire « %s »" +msgstr "ne peut pas hériter à partir d'une relation temporaire « %s »" -#: commands/tablecmds.c:2493 commands/tablecmds.c:14194 +#: commands/tablecmds.c:2448 commands/tablecmds.c:14235 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "ne peut pas hériter de la table temporaire d'une autre session" -#: commands/tablecmds.c:2547 +#: commands/tablecmds.c:2502 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "assemblage de plusieurs définitions d'héritage pour la colonne « %s »" -#: commands/tablecmds.c:2555 +#: commands/tablecmds.c:2510 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "la colonne héritée « %s » a un conflit de type" -#: commands/tablecmds.c:2557 commands/tablecmds.c:2580 commands/tablecmds.c:2597 commands/tablecmds.c:2853 commands/tablecmds.c:2883 commands/tablecmds.c:2897 parser/parse_coerce.c:2090 parser/parse_coerce.c:2110 parser/parse_coerce.c:2130 parser/parse_coerce.c:2150 parser/parse_coerce.c:2205 parser/parse_coerce.c:2238 parser/parse_coerce.c:2316 parser/parse_coerce.c:2348 parser/parse_coerce.c:2382 parser/parse_coerce.c:2402 parser/parse_param.c:227 +#: commands/tablecmds.c:2512 commands/tablecmds.c:2535 commands/tablecmds.c:2552 commands/tablecmds.c:2808 commands/tablecmds.c:2838 commands/tablecmds.c:2852 parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 parser/parse_param.c:227 #, c-format msgid "%s versus %s" msgstr "%s versus %s" -#: commands/tablecmds.c:2566 +#: commands/tablecmds.c:2521 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "la colonne héritée « %s » a un conflit sur le collationnement" -#: commands/tablecmds.c:2568 commands/tablecmds.c:2865 commands/tablecmds.c:6497 +#: commands/tablecmds.c:2523 commands/tablecmds.c:2820 commands/tablecmds.c:6526 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "« %s » versus « %s »" -#: commands/tablecmds.c:2578 +#: commands/tablecmds.c:2533 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "la colonne héritée « %s » a un conflit de paramètre de stockage" -#: commands/tablecmds.c:2595 commands/tablecmds.c:2895 +#: commands/tablecmds.c:2550 commands/tablecmds.c:2850 #, c-format msgid "column \"%s\" has a compression method conflict" msgstr "la colonne « %s » a un conflit sur la méthode de compression" -#: commands/tablecmds.c:2610 +#: commands/tablecmds.c:2565 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "la colonne héritée « %s » a un conflit de génération" -#: commands/tablecmds.c:2704 commands/tablecmds.c:2759 commands/tablecmds.c:11771 parser/parse_utilcmd.c:1291 parser/parse_utilcmd.c:1334 parser/parse_utilcmd.c:1742 parser/parse_utilcmd.c:1850 +#: commands/tablecmds.c:2659 commands/tablecmds.c:2714 commands/tablecmds.c:11812 parser/parse_utilcmd.c:1291 parser/parse_utilcmd.c:1334 parser/parse_utilcmd.c:1742 parser/parse_utilcmd.c:1850 #, c-format msgid "cannot convert whole-row table reference" msgstr "ne peut pas convertir une référence de ligne complète de table" -#: commands/tablecmds.c:2705 parser/parse_utilcmd.c:1292 +#: commands/tablecmds.c:2660 parser/parse_utilcmd.c:1292 #, c-format msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." msgstr "L'expression de génération de la colonne « %s » contient une référence de ligne complète vers la table « %s »." -#: commands/tablecmds.c:2760 parser/parse_utilcmd.c:1335 +#: commands/tablecmds.c:2715 parser/parse_utilcmd.c:1335 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." -msgstr "La constrainte « %s » contient une référence de ligne complète vers la table « %s »." +msgstr "La contrainte « %s » contient une référence de ligne complète vers la table « %s »." -#: commands/tablecmds.c:2839 +#: commands/tablecmds.c:2794 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "assemblage de la colonne « %s » avec une définition héritée" -#: commands/tablecmds.c:2843 +#: commands/tablecmds.c:2798 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "déplacement et assemblage de la colonne « %s » avec une définition héritée" -#: commands/tablecmds.c:2844 +#: commands/tablecmds.c:2799 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "Colonne utilisateur déplacée à la position de la colonne héritée." -#: commands/tablecmds.c:2851 +#: commands/tablecmds.c:2806 #, c-format msgid "column \"%s\" has a type conflict" msgstr "la colonne « %s » a un conflit de type" -#: commands/tablecmds.c:2863 +#: commands/tablecmds.c:2818 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "la colonne « %s » a un conflit sur le collationnement" -#: commands/tablecmds.c:2881 +#: commands/tablecmds.c:2836 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "la colonne « %s » a un conflit de paramètre de stockage" -#: commands/tablecmds.c:2922 +#: commands/tablecmds.c:2877 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "la colonne enfant « %s » précise une expression de génération" -#: commands/tablecmds.c:2924 +#: commands/tablecmds.c:2879 #, c-format msgid "Omit the generation expression in the definition of the child table column to inherit the generation expression from the parent table." msgstr "Omettre l'expression de génération dans la définition de la colonne de la table fille pour hériter de l'expression de génération de la table parent." -#: commands/tablecmds.c:2928 +#: commands/tablecmds.c:2883 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "la colonne « %s » hérite d'une colonne générée mais indique une valeur par défaut" -#: commands/tablecmds.c:2933 +#: commands/tablecmds.c:2888 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" msgstr "la colonne « %s » hérite d'une colonne générée mais précise une identité" -#: commands/tablecmds.c:3042 +#: commands/tablecmds.c:2997 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "la colonne « %s » hérite d'expressions de génération en conflit" -#: commands/tablecmds.c:3047 +#: commands/tablecmds.c:3002 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "la colonne « %s » hérite de valeurs par défaut conflictuelles" -#: commands/tablecmds.c:3049 +#: commands/tablecmds.c:3004 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "Pour résoudre le conflit, spécifiez explicitement une valeur par défaut." -#: commands/tablecmds.c:3095 +#: commands/tablecmds.c:3050 #, c-format msgid "check constraint name \"%s\" appears multiple times but with different expressions" msgstr "" "le nom de la contrainte de vérification, « %s », apparaît plusieurs fois\n" "mais avec des expressions différentes" -#: commands/tablecmds.c:3308 +#: commands/tablecmds.c:3263 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "ne peut pas déplacer les tables temporaires d'autres sessions" -#: commands/tablecmds.c:3378 +#: commands/tablecmds.c:3333 #, c-format msgid "cannot rename column of typed table" msgstr "ne peut pas renommer une colonne d'une table typée" -#: commands/tablecmds.c:3397 +#: commands/tablecmds.c:3352 #, c-format msgid "\"%s\" is not a table, view, materialized view, composite type, index, or foreign table" msgstr "« %s » n'est ni une table, ni une vue, ni une vue matérialisée, ni un type composite, ni un index, ni une table distante" -#: commands/tablecmds.c:3491 +#: commands/tablecmds.c:3446 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "la colonne héritée « %s » doit aussi être renommée pour les tables filles" -#: commands/tablecmds.c:3523 +#: commands/tablecmds.c:3478 #, c-format msgid "cannot rename system column \"%s\"" msgstr "ne peut pas renommer la colonne système « %s »" -#: commands/tablecmds.c:3538 +#: commands/tablecmds.c:3493 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "ne peut pas renommer la colonne héritée « %s »" -#: commands/tablecmds.c:3690 +#: commands/tablecmds.c:3645 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "la contrainte héritée « %s » doit aussi être renommée pour les tables enfants" -#: commands/tablecmds.c:3697 +#: commands/tablecmds.c:3652 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "ne peut pas renommer la colonne héritée « %s »" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3930 +#: commands/tablecmds.c:3950 #, c-format msgid "cannot %s \"%s\" because it is being used by active queries in this session" msgstr "" @@ -9237,1081 +9204,1091 @@ msgstr "" "des requêtes actives dans cette session" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3939 +#: commands/tablecmds.c:3959 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "ne peut pas exécuter %s « %s » car il reste des événements sur les triggers" -#: commands/tablecmds.c:4403 +#: commands/tablecmds.c:4423 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" msgstr "ne peut pas modifier la partition « %s » avec un détachement incomplet" -#: commands/tablecmds.c:4405 -#, c-format -msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." -msgstr "Utiliser ALTER TABLE ... DETACH PARTITION ... FINALIZE pour terminer l'opération de détachement en attente." - -#: commands/tablecmds.c:4596 commands/tablecmds.c:4611 +#: commands/tablecmds.c:4616 commands/tablecmds.c:4631 #, c-format msgid "cannot change persistence setting twice" msgstr "ne peut pas modifier la configuration de la persistence deux fois" -#: commands/tablecmds.c:5354 +#: commands/tablecmds.c:5374 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "ne peut pas ré-écrire la relation système « %s »" -#: commands/tablecmds.c:5360 +#: commands/tablecmds.c:5380 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "ne peut pas réécrire la table « %s » utilisée comme une table catalogue" -#: commands/tablecmds.c:5370 +#: commands/tablecmds.c:5390 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "ne peut pas ré-écrire les tables temporaires des autres sessions" -#: commands/tablecmds.c:5831 +#: commands/tablecmds.c:5851 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "la colonne « %s » de la table « %s » contient des valeurs NULL" -#: commands/tablecmds.c:5848 +#: commands/tablecmds.c:5868 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "la contrainte de vérification « %s » de la relation « %s » est violée par une ligne" -#: commands/tablecmds.c:5867 partitioning/partbounds.c:3282 +#: commands/tablecmds.c:5887 partitioning/partbounds.c:3292 #, c-format msgid "updated partition constraint for default partition \"%s\" would be violated by some row" msgstr "la contrainte de partition mise à jour pour la partition par défaut « %s » serait transgressée par des lignes" -#: commands/tablecmds.c:5873 +#: commands/tablecmds.c:5893 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "la contrainte de partition de la relation « %s » est violée par une ligne" -#: commands/tablecmds.c:6021 commands/trigger.c:1265 commands/trigger.c:1371 +#: commands/tablecmds.c:6041 commands/trigger.c:1283 commands/trigger.c:1389 #, c-format msgid "\"%s\" is not a table, view, or foreign table" msgstr "« %s » n'est ni une table, ni une vue, ni une table distante" -#: commands/tablecmds.c:6024 +#: commands/tablecmds.c:6044 #, c-format msgid "\"%s\" is not a table, view, materialized view, or index" msgstr "« %s » n'est ni une table, ni une vue, ni une vue matérialisée, ni une séquence, ni une table distante" -#: commands/tablecmds.c:6030 +#: commands/tablecmds.c:6050 #, c-format msgid "\"%s\" is not a table, materialized view, or index" msgstr "« %s » n'est ni une table, ni une vue matérialisée, ni un index" -#: commands/tablecmds.c:6033 +#: commands/tablecmds.c:6053 +#, c-format +msgid "\"%s\" is not a table, materialized view, index, or partitioned index" +msgstr "« %s » n'est ni une table, ni une vue matérialisée, ni un index, ni un index partitionné" + +#: commands/tablecmds.c:6056 +#, c-format +msgid "\"%s\" is not a table, materialized view, index, partitioned index, or foreign table" +msgstr "« %s » n'est ni une table, ni une vue matérialisée, ni un index, ni un index partitionné, ni une table distante" + +#: commands/tablecmds.c:6059 #, c-format msgid "\"%s\" is not a table, materialized view, or foreign table" msgstr "« %s » n'est ni une table, ni une vue matérialisée, ni une table distante" -#: commands/tablecmds.c:6036 +#: commands/tablecmds.c:6062 #, c-format msgid "\"%s\" is not a table or foreign table" msgstr "« %s » n'est ni une table ni une table distante" -#: commands/tablecmds.c:6039 +#: commands/tablecmds.c:6065 #, c-format msgid "\"%s\" is not a table, composite type, or foreign table" msgstr "« %s » n'est ni une table, ni un type composite, ni une table distante" -#: commands/tablecmds.c:6042 +#: commands/tablecmds.c:6068 #, c-format msgid "\"%s\" is not a table, materialized view, index, or foreign table" msgstr "« %s » n'est ni une table, ni une vue matérialisée, ni un index, ni une table distante" -#: commands/tablecmds.c:6052 +#: commands/tablecmds.c:6071 +#, c-format +msgid "\"%s\" is not a table or partitioned index" +msgstr "« %s » n'est ni une table ni un index partitionné" + +#: commands/tablecmds.c:6081 #, c-format msgid "\"%s\" is of the wrong type" msgstr "« %s » est du mauvais type" -#: commands/tablecmds.c:6255 commands/tablecmds.c:6262 +#: commands/tablecmds.c:6284 commands/tablecmds.c:6291 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "ne peux pas modifier le type « %s » car la colonne « %s.%s » l'utilise" -#: commands/tablecmds.c:6269 +#: commands/tablecmds.c:6298 #, c-format msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" msgstr "" "ne peut pas modifier la table distante « %s » car la colonne « %s.%s » utilise\n" "son type de ligne" -#: commands/tablecmds.c:6276 +#: commands/tablecmds.c:6305 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "" "ne peut pas modifier la table « %s » car la colonne « %s.%s » utilise\n" "son type de ligne" -#: commands/tablecmds.c:6332 +#: commands/tablecmds.c:6361 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "ne peut pas modifier le type « %s » car il s'agit du type d'une table de type" -#: commands/tablecmds.c:6334 +#: commands/tablecmds.c:6363 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "Utilisez ALTER ... CASCADE pour modifier aussi les tables de type." -#: commands/tablecmds.c:6380 +#: commands/tablecmds.c:6409 #, c-format msgid "type %s is not a composite type" msgstr "le type %s n'est pas un type composite" -#: commands/tablecmds.c:6407 +#: commands/tablecmds.c:6436 #, c-format msgid "cannot add column to typed table" msgstr "ne peut pas ajouter une colonne à une table typée" -#: commands/tablecmds.c:6460 +#: commands/tablecmds.c:6489 #, c-format msgid "cannot add column to a partition" msgstr "ne peut pas ajouter une colonne à une partition" -#: commands/tablecmds.c:6489 commands/tablecmds.c:14437 +#: commands/tablecmds.c:6518 commands/tablecmds.c:14478 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "la table fille « %s » a un type différent pour la colonne « %s »" -#: commands/tablecmds.c:6495 commands/tablecmds.c:14444 +#: commands/tablecmds.c:6524 commands/tablecmds.c:14485 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "la table fille « %s » a un collationnement différent pour la colonne « %s »" -#: commands/tablecmds.c:6509 +#: commands/tablecmds.c:6538 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "assemblage de la définition de la colonne « %s » pour le fils « %s »" -#: commands/tablecmds.c:6552 +#: commands/tablecmds.c:6581 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "ne peut pas ajouter récursivement la colonne identité à une table qui a des tables filles" -#: commands/tablecmds.c:6795 +#: commands/tablecmds.c:6824 #, c-format msgid "column must be added to child tables too" msgstr "la colonne doit aussi être ajoutée aux tables filles" -#: commands/tablecmds.c:6873 +#: commands/tablecmds.c:6902 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "la colonne « %s » de la relation « %s » existe déjà, poursuite du traitement" -#: commands/tablecmds.c:6880 +#: commands/tablecmds.c:6909 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "la colonne « %s » de la relation « %s » existe déjà" -#: commands/tablecmds.c:6946 commands/tablecmds.c:11409 +#: commands/tablecmds.c:6975 commands/tablecmds.c:11451 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "ne peut pas supprimer une contrainte uniquement d'une table partitionnée quand des partitions existent" -#: commands/tablecmds.c:6947 commands/tablecmds.c:7251 commands/tablecmds.c:8274 commands/tablecmds.c:11410 +#: commands/tablecmds.c:6976 commands/tablecmds.c:7293 commands/tablecmds.c:8316 commands/tablecmds.c:11452 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Ne spécifiez pas le mot clé ONLY." -#: commands/tablecmds.c:6984 commands/tablecmds.c:7177 commands/tablecmds.c:7319 commands/tablecmds.c:7433 commands/tablecmds.c:7527 commands/tablecmds.c:7586 commands/tablecmds.c:7704 commands/tablecmds.c:7870 commands/tablecmds.c:7940 commands/tablecmds.c:8096 commands/tablecmds.c:11564 commands/tablecmds.c:13049 commands/tablecmds.c:15610 +#: commands/tablecmds.c:7013 commands/tablecmds.c:7219 commands/tablecmds.c:7361 commands/tablecmds.c:7475 commands/tablecmds.c:7569 commands/tablecmds.c:7628 commands/tablecmds.c:7746 commands/tablecmds.c:7912 commands/tablecmds.c:7982 commands/tablecmds.c:8138 commands/tablecmds.c:11606 commands/tablecmds.c:13090 commands/tablecmds.c:15655 #, c-format msgid "cannot alter system column \"%s\"" msgstr "n'a pas pu modifier la colonne système « %s »" -#: commands/tablecmds.c:6990 commands/tablecmds.c:7325 +#: commands/tablecmds.c:7019 commands/tablecmds.c:7367 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "la colonne « %s » de la relation « %s » n'est pas une colonne d'identité" -#: commands/tablecmds.c:7026 +#: commands/tablecmds.c:7062 #, c-format msgid "column \"%s\" is in a primary key" msgstr "la colonne « %s » est dans une clé primaire" -#: commands/tablecmds.c:7048 +#: commands/tablecmds.c:7067 +#, c-format +msgid "column \"%s\" is in index used as replica identity" +msgstr "la colonne « %s » est dans un index utilisé comme identité de réplicat" + +#: commands/tablecmds.c:7090 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "la colonne « %s » est marquée NOT NULL dans la table parent" -#: commands/tablecmds.c:7248 commands/tablecmds.c:8757 +#: commands/tablecmds.c:7290 commands/tablecmds.c:8799 #, c-format msgid "constraint must be added to child tables too" msgstr "la contrainte doit aussi être ajoutée aux tables filles" -#: commands/tablecmds.c:7249 +#: commands/tablecmds.c:7291 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "la colonne « %s » de la relation « %s » n'est pas déjà NOT NULL." -#: commands/tablecmds.c:7327 +#: commands/tablecmds.c:7369 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." msgstr "Utilisez à la place ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." -#: commands/tablecmds.c:7332 +#: commands/tablecmds.c:7374 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "la colonne « %s » de la relation « %s » est une colonne générée" -#: commands/tablecmds.c:7335 +#: commands/tablecmds.c:7377 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." msgstr "Utilisez à la place ALTER TABLE ... ALTER COLUMN ... DROP EXTENSION." -#: commands/tablecmds.c:7444 +#: commands/tablecmds.c:7486 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "la colonne « %s » de la relation « %s » doit être déclarée NOT NULL avant que la colonne identité puisse être ajoutée" -#: commands/tablecmds.c:7450 +#: commands/tablecmds.c:7492 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "la colonne « %s » de la relation « %s » est déjà une colonne d'identité" -#: commands/tablecmds.c:7456 +#: commands/tablecmds.c:7498 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "la colonne « %s » de la relation « %s » a déjà une valeur par défaut" -#: commands/tablecmds.c:7533 commands/tablecmds.c:7594 +#: commands/tablecmds.c:7575 commands/tablecmds.c:7636 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "la colonne « %s » de la relation « %s » n'est pas une colonne d'identité" -#: commands/tablecmds.c:7599 +#: commands/tablecmds.c:7641 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "la colonne « %s » de la relation « %s » n'est pas une colonne d'identité, poursuite du traitement" -#: commands/tablecmds.c:7652 +#: commands/tablecmds.c:7694 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "ALTER TABLE / DROP EXPRESSION doit aussi être appliqué aux tables filles" -#: commands/tablecmds.c:7674 +#: commands/tablecmds.c:7716 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "ne peut pas supprimer l'expression de génération à partir d'une colonne héritée" -#: commands/tablecmds.c:7712 +#: commands/tablecmds.c:7754 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "la colonne « %s » de la relation « %s » n'est pas une colonne générée stockée" -#: commands/tablecmds.c:7717 +#: commands/tablecmds.c:7759 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "la colonne « %s » de la relation « %s » n'est pas une colonne générée stockée, ignoré" -#: commands/tablecmds.c:7817 +#: commands/tablecmds.c:7859 #, c-format msgid "cannot refer to non-index column by number" -msgstr "impossible de référence une colonne non liée à une table par un nombre" +msgstr "impossible de référencer une colonne non liée à une table par un nombre" -#: commands/tablecmds.c:7860 +#: commands/tablecmds.c:7902 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "la colonne numéro %d de la relation « %s » n'existe pas" -#: commands/tablecmds.c:7879 +#: commands/tablecmds.c:7921 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "ne peut modifier les statistiques sur la colonne incluse « %s » de l'index « %s »" -#: commands/tablecmds.c:7884 +#: commands/tablecmds.c:7926 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "ne peut modifier les statistiques sur la colonne « %s » de l'index « %s », qui n'est pas une expression" -#: commands/tablecmds.c:7886 +#: commands/tablecmds.c:7928 #, c-format msgid "Alter statistics on table column instead." -msgstr "Modifie les statistiques sur la colonne de la table à la place." +msgstr "Modifiez les statistiques sur la colonne de la table à la place." -#: commands/tablecmds.c:8076 +#: commands/tablecmds.c:8118 #, c-format msgid "invalid storage type \"%s\"" msgstr "type de stockage « %s » invalide" -#: commands/tablecmds.c:8108 +#: commands/tablecmds.c:8150 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "le type de données %s de la colonne peut seulement avoir un stockage PLAIN" -#: commands/tablecmds.c:8153 +#: commands/tablecmds.c:8195 #, c-format msgid "cannot drop column from typed table" msgstr "ne peut pas supprimer une colonne à une table typée" -#: commands/tablecmds.c:8212 +#: commands/tablecmds.c:8254 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "la colonne « %s » de la relation « %s » n'existe pas, ignore" -#: commands/tablecmds.c:8225 +#: commands/tablecmds.c:8267 #, c-format msgid "cannot drop system column \"%s\"" msgstr "ne peut pas supprimer la colonne système « %s »" -#: commands/tablecmds.c:8235 +#: commands/tablecmds.c:8277 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "ne peut pas supprimer la colonne héritée « %s »" -#: commands/tablecmds.c:8248 +#: commands/tablecmds.c:8290 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "ne peut supprimer la colonne « %s » car elle fait partie de la clé de partitionnement de la relation « %s »" -#: commands/tablecmds.c:8273 +#: commands/tablecmds.c:8315 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "ne peut pas supprimer une colonne sur une seule partition quand plusieurs partitions existent" -#: commands/tablecmds.c:8477 +#: commands/tablecmds.c:8519 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX n'est pas supporté sur les tables partitionnées" -#: commands/tablecmds.c:8502 +#: commands/tablecmds.c:8544 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX renommera l'index « %s » en « %s »" -#: commands/tablecmds.c:8837 +#: commands/tablecmds.c:8879 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "ne peut pas utiliser ONLY pour une clé étrangère sur la table partitionnée « %s » référençant la relation « %s »" -#: commands/tablecmds.c:8843 +#: commands/tablecmds.c:8885 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "ne peut pas ajouter de clé étrangère NOT VALID sur la table partitionnée « %s » référençant la relation « %s »" -#: commands/tablecmds.c:8846 +#: commands/tablecmds.c:8888 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "Cette fonctionnalité n'est pas encore implémentée sur les tables partitionnées." -#: commands/tablecmds.c:8853 commands/tablecmds.c:9258 +#: commands/tablecmds.c:8895 commands/tablecmds.c:9300 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "la relation référencée « %s » n'est pas une table" -#: commands/tablecmds.c:8876 +#: commands/tablecmds.c:8918 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "les contraintes sur les tables permanentes peuvent seulement référencer des tables permanentes" -#: commands/tablecmds.c:8883 +#: commands/tablecmds.c:8925 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "les contraintes sur les tables non tracées peuvent seulement référencer des tables permanentes ou non tracées" -#: commands/tablecmds.c:8889 +#: commands/tablecmds.c:8931 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "" "les contraintes sur des tables temporaires ne peuvent référencer que des\n" "tables temporaires" -#: commands/tablecmds.c:8893 +#: commands/tablecmds.c:8935 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "" "les contraintes sur des tables temporaires doivent référencer les tables\n" "temporaires de cette session" -#: commands/tablecmds.c:8959 commands/tablecmds.c:8965 +#: commands/tablecmds.c:9001 commands/tablecmds.c:9007 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "action %s invalide pour une clé étrangère contenant une colonne générée" -#: commands/tablecmds.c:8981 +#: commands/tablecmds.c:9023 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "nombre de colonnes de référence et référencées pour la clé étrangère en désaccord" -#: commands/tablecmds.c:9088 +#: commands/tablecmds.c:9130 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "la contrainte de clé étrangère « %s » ne peut pas être implémentée" -#: commands/tablecmds.c:9090 +#: commands/tablecmds.c:9132 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Les colonnes clés « %s » et « %s » sont de types incompatibles : %s et %s." -#: commands/tablecmds.c:9453 commands/tablecmds.c:9846 parser/parse_utilcmd.c:786 parser/parse_utilcmd.c:915 +#: commands/tablecmds.c:9495 commands/tablecmds.c:9888 parser/parse_utilcmd.c:786 parser/parse_utilcmd.c:915 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "les clés étrangères ne sont pas supportées par les tables distantes" -#: commands/tablecmds.c:10213 commands/tablecmds.c:10491 commands/tablecmds.c:11366 commands/tablecmds.c:11441 +#: commands/tablecmds.c:10255 commands/tablecmds.c:10533 commands/tablecmds.c:11408 commands/tablecmds.c:11483 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "la contrainte « %s » de la relation « %s » n'existe pas" -#: commands/tablecmds.c:10220 +#: commands/tablecmds.c:10262 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "la contrainte « %s » de la relation « %s » n'est pas une clé étrangère" -#: commands/tablecmds.c:10258 +#: commands/tablecmds.c:10300 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "ne peut pas modifier la contrainte « %s » de la relation « %s »" -#: commands/tablecmds.c:10261 +#: commands/tablecmds.c:10303 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "La contrainte « %s » est dérivée de la contrainte « %s » de la relation « %s »" -#: commands/tablecmds.c:10263 +#: commands/tablecmds.c:10305 #, c-format msgid "You may alter the constraint it derives from, instead." msgstr "Vous pouvez modifier la contrainte dont elle dérive à la place." -#: commands/tablecmds.c:10499 +#: commands/tablecmds.c:10541 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "la contrainte « %s » de la relation « %s » n'est pas une clé étrangère ou une contrainte de vérification" -#: commands/tablecmds.c:10577 +#: commands/tablecmds.c:10619 #, c-format msgid "constraint must be validated on child tables too" msgstr "la contrainte doit aussi être validée sur les tables enfants" -#: commands/tablecmds.c:10661 +#: commands/tablecmds.c:10703 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "la colonne « %s » référencée dans la contrainte de clé étrangère n'existe pas" -#: commands/tablecmds.c:10666 +#: commands/tablecmds.c:10708 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "ne peut pas avoir plus de %d clés dans une clé étrangère" -#: commands/tablecmds.c:10731 +#: commands/tablecmds.c:10773 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "ne peut pas utiliser une clé primaire déferrable pour la table « %s » référencée" -#: commands/tablecmds.c:10748 +#: commands/tablecmds.c:10790 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "il n'y a pas de clé primaire pour la table « %s » référencée" -#: commands/tablecmds.c:10813 +#: commands/tablecmds.c:10855 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "la liste de colonnes référencées dans la clé étrangère ne doit pas contenir de duplicats" -#: commands/tablecmds.c:10907 +#: commands/tablecmds.c:10949 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "" "ne peut pas utiliser une contrainte unique déferrable pour la table\n" "référencée « %s »" -#: commands/tablecmds.c:10912 +#: commands/tablecmds.c:10954 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "il n'existe aucune contrainte unique correspondant aux clés données pour la table « %s » référencée" -#: commands/tablecmds.c:11322 +#: commands/tablecmds.c:11364 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "ne peut pas supprimer la contrainte héritée « %s » de la relation « %s »" -#: commands/tablecmds.c:11372 +#: commands/tablecmds.c:11414 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "la contrainte « %s » de la relation « %s » n'existe pas, ignore" -#: commands/tablecmds.c:11548 +#: commands/tablecmds.c:11590 #, c-format msgid "cannot alter column type of typed table" msgstr "ne peut pas modifier le type d'une colonne appartenant à une table typée" -#: commands/tablecmds.c:11575 +#: commands/tablecmds.c:11617 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "ne peut pas modifier la colonne héritée « %s »" -#: commands/tablecmds.c:11584 +#: commands/tablecmds.c:11626 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "ne peut pas modifier la colonne « %s » car elle fait partie de la clé de partitionnement de la relation « %s »" -#: commands/tablecmds.c:11634 +#: commands/tablecmds.c:11676 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "le résultat de la clause USING pour la colonne « %s » ne peut pas être converti automatiquement vers le type %s" -#: commands/tablecmds.c:11637 +#: commands/tablecmds.c:11679 #, c-format msgid "You might need to add an explicit cast." msgstr "Vous pouvez avoir besoin d'ajouter une conversion explicite." -#: commands/tablecmds.c:11641 +#: commands/tablecmds.c:11683 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "la colonne « %s » ne peut pas être convertie vers le type %s" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:11644 +#: commands/tablecmds.c:11686 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Vous pouvez avoir besoin de spécifier \"USING %s::%s\"." -#: commands/tablecmds.c:11744 +#: commands/tablecmds.c:11785 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "ne peut pas modifier la colonne héritée « %s » de la relation « %s »" -#: commands/tablecmds.c:11772 +#: commands/tablecmds.c:11813 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "l'expression USING contient une référence de table de ligne complète." -#: commands/tablecmds.c:11783 +#: commands/tablecmds.c:11824 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "le type de colonne héritée « %s » doit aussi être renommée pour les tables filles" -#: commands/tablecmds.c:11908 +#: commands/tablecmds.c:11949 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "ne peut pas modifier la colonne « %s » deux fois" -#: commands/tablecmds.c:11946 +#: commands/tablecmds.c:11987 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "l'expression de génération de la colonne « %s » ne peut pas être convertie vers le type %s automatiquement" -#: commands/tablecmds.c:11951 +#: commands/tablecmds.c:11992 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "" "la valeur par défaut de la colonne « %s » ne peut pas être convertie vers le\n" "type %s automatiquement" -#: commands/tablecmds.c:12029 +#: commands/tablecmds.c:12070 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "ne peut pas modifier le type d'une colonne utilisée dans colonne générée" -#: commands/tablecmds.c:12030 +#: commands/tablecmds.c:12071 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "La colonne « %s » est utilisée par la colonne générée « %s »" -#: commands/tablecmds.c:12051 +#: commands/tablecmds.c:12092 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "ne peut pas modifier le type d'une colonne utilisée dans une vue ou une règle" -#: commands/tablecmds.c:12052 commands/tablecmds.c:12071 commands/tablecmds.c:12089 +#: commands/tablecmds.c:12093 commands/tablecmds.c:12112 commands/tablecmds.c:12130 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s dépend de la colonne « %s »" -#: commands/tablecmds.c:12070 +#: commands/tablecmds.c:12111 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "ne peut pas modifier le type d'une colonne utilisée dans la définition d'un trigger" -#: commands/tablecmds.c:12088 +#: commands/tablecmds.c:12129 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "ne peut pas modifier le type d'une colonne utilisée dans la définition d'une politique" -#: commands/tablecmds.c:13157 commands/tablecmds.c:13169 +#: commands/tablecmds.c:13198 commands/tablecmds.c:13210 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "ne peut pas modifier le propriétaire de l'index « %s »" -#: commands/tablecmds.c:13159 commands/tablecmds.c:13171 +#: commands/tablecmds.c:13200 commands/tablecmds.c:13212 #, c-format msgid "Change the ownership of the index's table, instead." msgstr "Modifier à la place le propriétaire de la table concernée par l'index." -#: commands/tablecmds.c:13185 +#: commands/tablecmds.c:13226 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "ne peut pas modifier le propriétaire de la séquence « %s »" -#: commands/tablecmds.c:13199 commands/tablecmds.c:16502 +#: commands/tablecmds.c:13240 commands/tablecmds.c:16547 #, c-format msgid "Use ALTER TYPE instead." msgstr "Utilisez ALTER TYPE à la place." -#: commands/tablecmds.c:13208 +#: commands/tablecmds.c:13249 #, c-format msgid "\"%s\" is not a table, view, sequence, or foreign table" msgstr "« %s » n'est ni une table, ni une vue, ni une séquence, ni une table distante" -#: commands/tablecmds.c:13547 +#: commands/tablecmds.c:13588 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "ne peut pas avoir de nombreuses sous-commandes SET TABLESPACE" -#: commands/tablecmds.c:13624 +#: commands/tablecmds.c:13665 #, c-format msgid "\"%s\" is not a table, view, materialized view, index, or TOAST table" msgstr "« %s » n'est ni une table, ni une vue, ni une vue matérialisée, ni un index, ni une table TOAST" -#: commands/tablecmds.c:13657 commands/view.c:491 +#: commands/tablecmds.c:13698 commands/view.c:491 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTION est uniquement accepté pour les vues dont la mise à jour est automatique" -#: commands/tablecmds.c:13909 +#: commands/tablecmds.c:13950 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "seuls les tables, index et vues matérialisées existent dans les tablespaces" -#: commands/tablecmds.c:13921 +#: commands/tablecmds.c:13962 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "ne peut pas déplacer les relations dans ou à partir du tablespace pg_global" -#: commands/tablecmds.c:14013 +#: commands/tablecmds.c:14054 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "annulation car le verrou sur la relation « %s.%s » n'est pas disponible" -#: commands/tablecmds.c:14029 +#: commands/tablecmds.c:14070 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "aucune relation correspondante trouvée dans le tablespace « %s »" -#: commands/tablecmds.c:14145 +#: commands/tablecmds.c:14186 #, c-format msgid "cannot change inheritance of typed table" msgstr "ne peut pas modifier l'héritage d'une table typée" -#: commands/tablecmds.c:14150 commands/tablecmds.c:14706 +#: commands/tablecmds.c:14191 commands/tablecmds.c:14747 #, c-format msgid "cannot change inheritance of a partition" msgstr "ne peut pas modifier l'héritage d'une partition" -#: commands/tablecmds.c:14155 +#: commands/tablecmds.c:14196 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "ne peut pas modifier l'héritage d'une table partitionnée" -#: commands/tablecmds.c:14201 +#: commands/tablecmds.c:14242 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "ne peut pas hériter à partir d'une relation temporaire d'une autre session" -#: commands/tablecmds.c:14214 +#: commands/tablecmds.c:14255 #, c-format msgid "cannot inherit from a partition" msgstr "ne peut pas hériter d'une partition" -#: commands/tablecmds.c:14236 commands/tablecmds.c:17146 +#: commands/tablecmds.c:14277 commands/tablecmds.c:17191 #, c-format msgid "circular inheritance not allowed" msgstr "héritage circulaire interdit" -#: commands/tablecmds.c:14237 commands/tablecmds.c:17147 +#: commands/tablecmds.c:14278 commands/tablecmds.c:17192 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "« %s » est déjà un enfant de « %s »." -#: commands/tablecmds.c:14250 +#: commands/tablecmds.c:14291 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "le trigger « %s » empêche la table « %s » de devenir une fille dans l'héritage" -#: commands/tablecmds.c:14252 +#: commands/tablecmds.c:14293 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "les triggers ROW avec des tables de transition ne sont pas supportés dans les hiérarchies d'héritage." -#: commands/tablecmds.c:14455 +#: commands/tablecmds.c:14496 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "la colonne « %s » de la table enfant doit être marquée comme NOT NULL" -#: commands/tablecmds.c:14464 +#: commands/tablecmds.c:14505 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "la colonne « %s » de la table enfant doit être une colonne générée" -#: commands/tablecmds.c:14514 +#: commands/tablecmds.c:14555 #, c-format msgid "column \"%s\" in child table has a conflicting generation expression" msgstr "la colonne « %s » de la table enfant a une expression de génération en conflit" -#: commands/tablecmds.c:14542 +#: commands/tablecmds.c:14583 #, c-format msgid "child table is missing column \"%s\"" msgstr "la table enfant n'a pas de colonne « %s »" -#: commands/tablecmds.c:14630 +#: commands/tablecmds.c:14671 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "la table fille « %s » a un type différent pour la contrainte de vérification « %s »" -#: commands/tablecmds.c:14638 +#: commands/tablecmds.c:14679 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "la contrainte « %s » entre en conflit avec une contrainte non héritée sur la table fille « %s »" -#: commands/tablecmds.c:14649 +#: commands/tablecmds.c:14690 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "la contrainte « %s » entre en conflit avec une contrainte NOT VALID sur la table fille « %s »" -#: commands/tablecmds.c:14684 +#: commands/tablecmds.c:14725 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "la table enfant n'a pas de contrainte « %s »" -#: commands/tablecmds.c:14772 +#: commands/tablecmds.c:14811 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "la partition « %s » déjà en attente de détachement de la table partitionnée « %s.%s »" -#: commands/tablecmds.c:14776 -#, c-format -msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the detach operation." -msgstr "Utiliser ALTER TABLE ... DETACH PARTITION ... FINALIZE pour terminer l'opération de détachement." - -#: commands/tablecmds.c:14801 commands/tablecmds.c:14849 +#: commands/tablecmds.c:14840 commands/tablecmds.c:14888 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "la relation « %s » n'est pas une partition de la relation « %s »" -#: commands/tablecmds.c:14855 +#: commands/tablecmds.c:14894 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "la relation « %s » n'est pas un parent de la relation « %s »" -#: commands/tablecmds.c:15083 +#: commands/tablecmds.c:15122 #, c-format msgid "typed tables cannot inherit" msgstr "les tables avec type ne peuvent pas hériter d'autres tables" -#: commands/tablecmds.c:15113 +#: commands/tablecmds.c:15152 #, c-format msgid "table is missing column \"%s\"" msgstr "la colonne « %s » manque à la table" -#: commands/tablecmds.c:15124 +#: commands/tablecmds.c:15163 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "la table a une colonne « %s » alors que le type impose « %s »" -#: commands/tablecmds.c:15133 +#: commands/tablecmds.c:15172 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "la table « %s » a un type différent pour la colonne « %s »" -#: commands/tablecmds.c:15147 +#: commands/tablecmds.c:15186 #, c-format msgid "table has extra column \"%s\"" msgstr "la table a une colonne supplémentaire « %s »" -#: commands/tablecmds.c:15199 +#: commands/tablecmds.c:15238 #, c-format msgid "\"%s\" is not a typed table" msgstr "« %s » n'est pas une table typée" -#: commands/tablecmds.c:15381 +#: commands/tablecmds.c:15426 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "ne peut pas utiliser l'index non unique « %s » comme identité de réplicat" -#: commands/tablecmds.c:15387 +#: commands/tablecmds.c:15432 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "ne peut pas utiliser l'index « %s » immédiat comme identité de réplicat" -#: commands/tablecmds.c:15393 +#: commands/tablecmds.c:15438 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "ne peut pas utiliser un index par expression « %s » comme identité de réplicat" -#: commands/tablecmds.c:15399 +#: commands/tablecmds.c:15444 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "ne peut pas utiliser l'index partiel « %s » comme identité de réplicat" -#: commands/tablecmds.c:15405 +#: commands/tablecmds.c:15450 #, c-format msgid "cannot use invalid index \"%s\" as replica identity" msgstr "ne peut pas utiliser l'index invalide « %s » comme identité de réplicat" -#: commands/tablecmds.c:15422 +#: commands/tablecmds.c:15467 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "l'index « %s » ne peut pas être utilisé comme identité de réplicat car la colonne %d est une colonne système" -#: commands/tablecmds.c:15429 +#: commands/tablecmds.c:15474 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "l'index « %s » ne peut pas être utilisé comme identité de réplicat car la colonne « %s » peut être NULL" -#: commands/tablecmds.c:15676 +#: commands/tablecmds.c:15721 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "ne peut pas modifier le statut de journalisation de la table « %s » parce qu'elle est temporaire" -#: commands/tablecmds.c:15700 +#: commands/tablecmds.c:15745 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "ne peut pas modifier la table « %s » en non journalisée car elle fait partie d'une publication" -#: commands/tablecmds.c:15702 +#: commands/tablecmds.c:15747 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Les relations non journalisées ne peuvent pas être répliquées." -#: commands/tablecmds.c:15747 +#: commands/tablecmds.c:15792 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "n'a pas pu passer la table « %s » en journalisé car elle référence la table non journalisée « %s »" -#: commands/tablecmds.c:15757 +#: commands/tablecmds.c:15802 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "n'a pas pu passer la table « %s » en non journalisé car elle référence la table journalisée « %s »" -#: commands/tablecmds.c:15815 +#: commands/tablecmds.c:15860 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "ne peut pas déplacer une séquence OWNED BY dans un autre schéma" -#: commands/tablecmds.c:15922 +#: commands/tablecmds.c:15967 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "la relation « %s » existe déjà dans le schéma « %s »" -#: commands/tablecmds.c:16485 +#: commands/tablecmds.c:16530 #, c-format msgid "\"%s\" is not a composite type" msgstr "« %s » n'est pas un type composite" -#: commands/tablecmds.c:16517 +#: commands/tablecmds.c:16562 #, c-format msgid "\"%s\" is not a table, view, materialized view, sequence, or foreign table" msgstr "« %s » n'est ni une table, ni une vue, ni une vue matérialisée, ni une séquence, ni une table distante" -#: commands/tablecmds.c:16552 +#: commands/tablecmds.c:16597 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "stratégie de partitionnement « %s » non reconnue" -#: commands/tablecmds.c:16560 +#: commands/tablecmds.c:16605 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "ne peut pas utiliser la stratégie de partitionnement « list » avec plus d'une colonne" -#: commands/tablecmds.c:16626 +#: commands/tablecmds.c:16671 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "la colonne « %s » nommée dans la clé de partitionnement n'existe pas" -#: commands/tablecmds.c:16634 +#: commands/tablecmds.c:16679 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "ne peut pas utiliser la colonne système « %s » comme clé de partitionnement" -#: commands/tablecmds.c:16645 commands/tablecmds.c:16759 +#: commands/tablecmds.c:16690 commands/tablecmds.c:16804 #, c-format msgid "cannot use generated column in partition key" msgstr "ne peut pas utiliser une colonne générée dans une clé de partitionnement" -#: commands/tablecmds.c:16646 commands/tablecmds.c:16760 commands/trigger.c:635 rewrite/rewriteHandler.c:884 rewrite/rewriteHandler.c:919 +#: commands/tablecmds.c:16691 commands/tablecmds.c:16805 commands/trigger.c:653 rewrite/rewriteHandler.c:907 rewrite/rewriteHandler.c:942 #, c-format msgid "Column \"%s\" is a generated column." msgstr "la colonne « %s » est une colonne générée." -#: commands/tablecmds.c:16722 +#: commands/tablecmds.c:16767 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "" "les fonctions dans une expression de clé de partitionnement doivent être marquées comme\n" "IMMUTABLE" -#: commands/tablecmds.c:16742 +#: commands/tablecmds.c:16787 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "les expressions de la clé de partitionnement ne peuvent pas contenir des références aux colonnes systèmes" -#: commands/tablecmds.c:16772 +#: commands/tablecmds.c:16817 #, c-format msgid "cannot use constant expression as partition key" msgstr "ne peut pas utiliser une expression constante comme clé de partitionnement" -#: commands/tablecmds.c:16793 +#: commands/tablecmds.c:16838 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "n'a pas pu déterminer le collationnement à utiliser pour l'expression de partitionnement" -#: commands/tablecmds.c:16828 +#: commands/tablecmds.c:16873 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "" "Vous devez spécifier une classe d'opérateur hash ou définir une\n" "classe d'opérateur hash par défaut pour le type de données." -#: commands/tablecmds.c:16834 +#: commands/tablecmds.c:16879 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "" "Vous devez spécifier une classe d'opérateur btree ou définir une\n" "classe d'opérateur btree par défaut pour le type de données." -#: commands/tablecmds.c:17086 +#: commands/tablecmds.c:17131 #, c-format msgid "\"%s\" is already a partition" msgstr "« %s » est déjà une partition" -#: commands/tablecmds.c:17092 +#: commands/tablecmds.c:17137 #, c-format msgid "cannot attach a typed table as partition" msgstr "ne peut pas attacher une table typée à une partition" -#: commands/tablecmds.c:17108 +#: commands/tablecmds.c:17153 #, c-format msgid "cannot attach inheritance child as partition" msgstr "ne peut pas ajouter la table en héritage comme une partition" -#: commands/tablecmds.c:17122 +#: commands/tablecmds.c:17167 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "ne peut pas attacher le parent d'héritage comme partition" -#: commands/tablecmds.c:17156 +#: commands/tablecmds.c:17201 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "ne peut pas attacher une relation temporaire comme partition de la relation permanente « %s »" -#: commands/tablecmds.c:17164 +#: commands/tablecmds.c:17209 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "ne peut pas attacher une relation permanente comme partition de la relation temporaire « %s »" -#: commands/tablecmds.c:17172 +#: commands/tablecmds.c:17217 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "ne peut pas attacher comme partition d'une relation temporaire d'une autre session" -#: commands/tablecmds.c:17179 +#: commands/tablecmds.c:17224 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "ne peut pas attacher une relation temporaire d'une autre session comme partition" -#: commands/tablecmds.c:17199 +#: commands/tablecmds.c:17244 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "la table « %s » contient la colonne « %s » introuvable dans le parent « %s »" -#: commands/tablecmds.c:17202 +#: commands/tablecmds.c:17247 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "La nouvelle partition pourrait seulement contenir les colonnes présentes dans le parent." -#: commands/tablecmds.c:17214 +#: commands/tablecmds.c:17259 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "le trigger « %s » empêche la table « %s » de devenir une partition" -#: commands/tablecmds.c:17216 commands/trigger.c:441 +#: commands/tablecmds.c:17261 commands/trigger.c:459 #, c-format msgid "ROW triggers with transition tables are not supported on partitions" msgstr "les triggers ROW avec des tables de transition ne sont pas supportés sur les partitions" -#: commands/tablecmds.c:17379 +#: commands/tablecmds.c:17440 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "ne peut pas attacher la table distante « %s » comme partition de la table partitionnée « %s »" -#: commands/tablecmds.c:17382 +#: commands/tablecmds.c:17443 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "La table partitionnée « %s » contient des index uniques." -#: commands/tablecmds.c:17702 +#: commands/tablecmds.c:17763 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "ne peut pas détacher les partitions en parallèle quand une partition par défaut existe" -#: commands/tablecmds.c:17811 +#: commands/tablecmds.c:17872 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "la table partitionnée « %s » a été supprimée de manière concurrente" -#: commands/tablecmds.c:17817 +#: commands/tablecmds.c:17878 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "la partition « %s » a été supprimée de façon concurrente" -#: commands/tablecmds.c:18271 commands/tablecmds.c:18291 commands/tablecmds.c:18311 commands/tablecmds.c:18330 commands/tablecmds.c:18372 +#: commands/tablecmds.c:18351 commands/tablecmds.c:18371 commands/tablecmds.c:18391 commands/tablecmds.c:18410 commands/tablecmds.c:18452 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "ne peut pas attacher l'index « %s » comme une partition de l'index « %s »" -#: commands/tablecmds.c:18274 +#: commands/tablecmds.c:18354 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "L'index « %s » est déjà attaché à un autre index." -#: commands/tablecmds.c:18294 +#: commands/tablecmds.c:18374 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "L'index « %s » n'est un index sur aucune des partitions de la table « %s »." -#: commands/tablecmds.c:18314 +#: commands/tablecmds.c:18394 #, c-format msgid "The index definitions do not match." msgstr "La définition de l'index correspond pas." -#: commands/tablecmds.c:18333 +#: commands/tablecmds.c:18413 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "L'index « %s » appartient à une contrainte dans la table « %s » mais aucune contrainte n'existe pour l'index « %s »." -#: commands/tablecmds.c:18375 +#: commands/tablecmds.c:18455 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "Un autre index est déjà attaché pour la partition « %s »." -#: commands/tablecmds.c:18605 +#: commands/tablecmds.c:18685 #, c-format msgid "column data type %s does not support compression" msgstr "le type de données %s ne supporte pas la compression" -#: commands/tablecmds.c:18612 +#: commands/tablecmds.c:18692 #, c-format msgid "invalid compression method \"%s\"" msgstr "méthode de compression « %s » invalide" -#: commands/tablespace.c:162 commands/tablespace.c:179 commands/tablespace.c:190 commands/tablespace.c:198 commands/tablespace.c:650 replication/slot.c:1451 storage/file/copydir.c:47 +#: commands/tablespace.c:162 commands/tablespace.c:179 commands/tablespace.c:190 commands/tablespace.c:198 commands/tablespace.c:636 replication/slot.c:1471 storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" msgstr "n'a pas pu créer le répertoire « %s » : %m" -#: commands/tablespace.c:209 +#: commands/tablespace.c:209 commands/tablespace.c:631 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "n'a pas pu lire les informations sur le répertoire « %s » : %m" -#: commands/tablespace.c:218 +#: commands/tablespace.c:218 commands/tablespace.c:642 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "« %s » existe mais n'est pas un répertoire" @@ -10346,22 +10323,22 @@ msgstr "le chemin du tablespace « %s » est trop long" msgid "tablespace location should not be inside the data directory" msgstr "l'emplacement du tablespace ne doit pas être dans le répertoire de données" -#: commands/tablespace.c:305 commands/tablespace.c:977 +#: commands/tablespace.c:305 commands/tablespace.c:973 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "nom inacceptable pour le tablespace « %s »" -#: commands/tablespace.c:307 commands/tablespace.c:978 +#: commands/tablespace.c:307 commands/tablespace.c:974 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "Le préfixe « pg_ » est réservé pour les tablespaces système." -#: commands/tablespace.c:326 commands/tablespace.c:999 +#: commands/tablespace.c:326 commands/tablespace.c:995 #, c-format msgid "tablespace \"%s\" already exists" msgstr "le tablespace « %s » existe déjà" -#: commands/tablespace.c:444 commands/tablespace.c:960 commands/tablespace.c:1049 commands/tablespace.c:1118 commands/tablespace.c:1264 commands/tablespace.c:1467 +#: commands/tablespace.c:444 commands/tablespace.c:956 commands/tablespace.c:1045 commands/tablespace.c:1114 commands/tablespace.c:1260 commands/tablespace.c:1463 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "le tablespace « %s » n'existe pas" @@ -10396,294 +10373,294 @@ msgstr "Créer le répertoire pour ce tablespace avant de redémarrer le serveur msgid "could not set permissions on directory \"%s\": %m" msgstr "n'a pas pu configurer les droits du répertoire « %s » : %m" -#: commands/tablespace.c:645 +#: commands/tablespace.c:647 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "répertoire « %s » déjà utilisé comme tablespace" -#: commands/tablespace.c:769 commands/tablespace.c:782 commands/tablespace.c:818 commands/tablespace.c:910 storage/file/fd.c:3161 storage/file/fd.c:3557 +#: commands/tablespace.c:765 commands/tablespace.c:778 commands/tablespace.c:814 commands/tablespace.c:906 storage/file/fd.c:3163 storage/file/fd.c:3559 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "n'a pas pu supprimer le répertoire « %s » : %m" -#: commands/tablespace.c:831 commands/tablespace.c:919 +#: commands/tablespace.c:827 commands/tablespace.c:915 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "n'a pas pu supprimer le lien symbolique « %s » : %m" -#: commands/tablespace.c:841 commands/tablespace.c:928 +#: commands/tablespace.c:837 commands/tablespace.c:924 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "« %s » n'est ni un répertoire ni un lien symbolique" -#: commands/tablespace.c:1123 +#: commands/tablespace.c:1119 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "Le tablespace « %s » n'existe pas." -#: commands/tablespace.c:1566 +#: commands/tablespace.c:1562 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "les répertoires du tablespace %u n'ont pas pu être supprimés" -#: commands/tablespace.c:1568 +#: commands/tablespace.c:1564 #, c-format msgid "You can remove the directories manually if necessary." msgstr "Vous pouvez supprimer les répertoires manuellement si nécessaire." -#: commands/trigger.c:198 commands/trigger.c:209 +#: commands/trigger.c:216 commands/trigger.c:227 #, c-format msgid "\"%s\" is a table" msgstr "« %s » est une table" -#: commands/trigger.c:200 commands/trigger.c:211 +#: commands/trigger.c:218 commands/trigger.c:229 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "Les tables ne peuvent pas avoir de triggers INSTEAD OF." -#: commands/trigger.c:232 +#: commands/trigger.c:250 #, c-format msgid "\"%s\" is a partitioned table" msgstr "« %s » est une table partitionnée" -#: commands/trigger.c:234 +#: commands/trigger.c:252 #, c-format msgid "Triggers on partitioned tables cannot have transition tables." msgstr "Les triggers sur les tables partitionnées ne peuvent pas avoir de tables de transition." -#: commands/trigger.c:246 commands/trigger.c:253 commands/trigger.c:423 +#: commands/trigger.c:264 commands/trigger.c:271 commands/trigger.c:441 #, c-format msgid "\"%s\" is a view" msgstr "« %s » est une vue" -#: commands/trigger.c:248 +#: commands/trigger.c:266 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "Les vues ne peuvent pas avoir de trigger BEFORE ou AFTER au niveau ligne." -#: commands/trigger.c:255 +#: commands/trigger.c:273 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "Les vues ne peuvent pas avoir de triggers TRUNCATE." -#: commands/trigger.c:263 commands/trigger.c:270 commands/trigger.c:282 commands/trigger.c:416 +#: commands/trigger.c:281 commands/trigger.c:288 commands/trigger.c:300 commands/trigger.c:434 #, c-format msgid "\"%s\" is a foreign table" msgstr "« %s » est une table distante" -#: commands/trigger.c:265 +#: commands/trigger.c:283 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "Les tables distantes ne peuvent pas avoir de triggers INSTEAD OF." -#: commands/trigger.c:272 +#: commands/trigger.c:290 #, c-format msgid "Foreign tables cannot have TRUNCATE triggers." msgstr "Les tables distantes ne peuvent pas avoir de triggers TRUNCATE." -#: commands/trigger.c:284 +#: commands/trigger.c:302 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "Les tables distantes ne peuvent pas avoir de triggers de contrainte." -#: commands/trigger.c:359 +#: commands/trigger.c:377 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "les triggers TRUNCATE FOR EACH ROW ne sont pas supportés" -#: commands/trigger.c:367 +#: commands/trigger.c:385 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "les triggers INSTEAD OF doivent être FOR EACH ROW" -#: commands/trigger.c:371 +#: commands/trigger.c:389 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "les triggers INSTEAD OF ne peuvent pas avoir de conditions WHEN" -#: commands/trigger.c:375 +#: commands/trigger.c:393 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "les triggers INSTEAD OF ne peuvent pas avoir de liste de colonnes" -#: commands/trigger.c:404 +#: commands/trigger.c:422 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "le nommage de variable ROW dans la clause REFERENCING n'est pas supporté" -#: commands/trigger.c:405 +#: commands/trigger.c:423 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "Utilisez OLD TABLE ou NEW TABLE pour nommer les tables de transition." -#: commands/trigger.c:418 +#: commands/trigger.c:436 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Les triggers sur les tables distantes ne peuvent pas avoir de tables de transition." -#: commands/trigger.c:425 +#: commands/trigger.c:443 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Les triggers sur les vues ne peuvent pas avoir de tables de transition." -#: commands/trigger.c:445 +#: commands/trigger.c:463 #, c-format msgid "ROW triggers with transition tables are not supported on inheritance children" msgstr "les triggers ROW avec des tables de transition ne sont pas supportés sur les filles en héritage" -#: commands/trigger.c:451 +#: commands/trigger.c:469 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "le nom de la table de transition peut seulement être spécifié pour un trigger AFTER" -#: commands/trigger.c:456 +#: commands/trigger.c:474 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "les triggers TRUNCATE avec des tables de transition ne sont pas supportés" -#: commands/trigger.c:473 +#: commands/trigger.c:491 #, c-format msgid "transition tables cannot be specified for triggers with more than one event" msgstr "les tables de transition ne peuvent pas être spécifiées pour les triggers avec plus d'un événement" -#: commands/trigger.c:484 +#: commands/trigger.c:502 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "les tables de transition ne peuvent pas être spécifiées pour les triggers avec des listes de colonnes" -#: commands/trigger.c:501 +#: commands/trigger.c:519 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "OLD TABLE peut seulement être spécifié pour un trigger INSERT ou UPDATE" -#: commands/trigger.c:506 +#: commands/trigger.c:524 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE ne peut pas être spécifié plusieurs fois" -#: commands/trigger.c:516 +#: commands/trigger.c:534 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE peut seulement être spécifié pour un trigger DELETE ou UPDATE" -#: commands/trigger.c:521 +#: commands/trigger.c:539 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE ne peut pas être spécifié plusieurs fois" -#: commands/trigger.c:531 +#: commands/trigger.c:549 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "les noms de OLD TABLE et NEW TABLE ne peuvent pas être identiques" -#: commands/trigger.c:595 commands/trigger.c:608 +#: commands/trigger.c:613 commands/trigger.c:626 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "" "la condition WHEN de l'instruction du trigger ne peut pas référencer les valeurs\n" "des colonnes" -#: commands/trigger.c:600 +#: commands/trigger.c:618 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "la condition WHEN du trigger INSERT ne peut pas référencer les valeurs OLD" -#: commands/trigger.c:613 +#: commands/trigger.c:631 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "la condition WHEN du trigger DELETE ne peut pas référencer les valeurs NEW" -#: commands/trigger.c:618 +#: commands/trigger.c:636 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "la condition WHEN d'un trigger BEFORE ne doit pas référencer dans NEW les colonnes système" -#: commands/trigger.c:626 commands/trigger.c:634 +#: commands/trigger.c:644 commands/trigger.c:652 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "la condition WHEN d'un trigger BEFORE ne doit pas référencer dans NEW les colonnes générées" -#: commands/trigger.c:627 +#: commands/trigger.c:645 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "Une référence comprenant toute une ligne est utilisée et la table contient des colonnes générées." -#: commands/trigger.c:741 commands/trigger.c:1450 +#: commands/trigger.c:759 commands/trigger.c:1468 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "le trigger « %s » de la relation « %s » existe déjà" -#: commands/trigger.c:755 +#: commands/trigger.c:773 #, c-format msgid "trigger \"%s\" for relation \"%s\" is an internal trigger" msgstr "le trigger « %s » de la relation « %s » est un trigger interne" -#: commands/trigger.c:774 +#: commands/trigger.c:792 #, c-format msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" msgstr "le trigger « %s » de la relation « %s » est un trigger de contrainte" -#: commands/trigger.c:1336 commands/trigger.c:1497 commands/trigger.c:1612 +#: commands/trigger.c:1354 commands/trigger.c:1515 commands/trigger.c:1630 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "le trigger « %s » de la table « %s » n'existe pas" -#: commands/trigger.c:1580 +#: commands/trigger.c:1598 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "droit refusé : « %s » est un trigger système" -#: commands/trigger.c:2160 +#: commands/trigger.c:2178 #, c-format msgid "trigger function %u returned null value" msgstr "la fonction trigger %u a renvoyé la valeur NULL" -#: commands/trigger.c:2220 commands/trigger.c:2434 commands/trigger.c:2673 commands/trigger.c:2977 +#: commands/trigger.c:2238 commands/trigger.c:2452 commands/trigger.c:2691 commands/trigger.c:2995 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "un trigger BEFORE STATEMENT ne peut pas renvoyer une valeur" -#: commands/trigger.c:2294 +#: commands/trigger.c:2312 #, c-format msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" msgstr "le déplacement de la ligne vers une autre partition par un trigger BEFORE FOR EACH ROW n'est pas supporté" -#: commands/trigger.c:2295 +#: commands/trigger.c:2313 #, c-format msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "Avant d'exécuter le trigger « %s », la ligne devait aller dans la partition « %s.%s »." -#: commands/trigger.c:3043 executor/nodeModifyTable.c:1822 executor/nodeModifyTable.c:1904 +#: commands/trigger.c:3061 executor/nodeModifyTable.c:1824 executor/nodeModifyTable.c:1906 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "la ligne à mettre à jour était déjà modifiée par une opération déclenchée par la commande courante" -#: commands/trigger.c:3044 executor/nodeModifyTable.c:1204 executor/nodeModifyTable.c:1278 executor/nodeModifyTable.c:1823 executor/nodeModifyTable.c:1905 +#: commands/trigger.c:3062 executor/nodeModifyTable.c:1206 executor/nodeModifyTable.c:1280 executor/nodeModifyTable.c:1825 executor/nodeModifyTable.c:1907 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "Considérez l'utilisation d'un trigger AFTER au lieu d'un trigger BEFORE pour propager les changements sur les autres lignes." -#: commands/trigger.c:3073 executor/nodeLockRows.c:229 executor/nodeLockRows.c:238 executor/nodeModifyTable.c:228 executor/nodeModifyTable.c:1220 executor/nodeModifyTable.c:1840 executor/nodeModifyTable.c:2070 +#: commands/trigger.c:3091 executor/nodeLockRows.c:229 executor/nodeLockRows.c:238 executor/nodeModifyTable.c:228 executor/nodeModifyTable.c:1222 executor/nodeModifyTable.c:1842 executor/nodeModifyTable.c:2072 #, c-format msgid "could not serialize access due to concurrent update" msgstr "n'a pas pu sérialiser un accès à cause d'une mise à jour en parallèle" -#: commands/trigger.c:3081 executor/nodeModifyTable.c:1310 executor/nodeModifyTable.c:1922 executor/nodeModifyTable.c:2094 +#: commands/trigger.c:3099 executor/nodeModifyTable.c:1312 executor/nodeModifyTable.c:1924 executor/nodeModifyTable.c:2096 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "n'a pas pu sérialiser un accès à cause d'une suppression en parallèle" -#: commands/trigger.c:4142 +#: commands/trigger.c:4160 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "ne peut pas déclencher un trigger déferré à l'intérieur d'une opération restreinte pour sécurité" -#: commands/trigger.c:5185 +#: commands/trigger.c:5203 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "la contrainte « %s » n'est pas DEFERRABLE" -#: commands/trigger.c:5208 +#: commands/trigger.c:5226 #, c-format msgid "constraint \"%s\" does not exist" msgstr "la contrainte « %s » n'existe pas" @@ -10839,8 +10816,8 @@ msgstr "" #: commands/typecmds.c:515 #, c-format -msgid "element type cannot be specified without a valid subscripting procedure" -msgstr "" +msgid "element type cannot be specified without a subscripting function" +msgstr "le type élément ne peut pas être spécifié sans une fonction d'indiçage" #: commands/typecmds.c:784 #, c-format @@ -10887,7 +10864,7 @@ msgstr "contraintes de clé étrangère impossible pour les domaines" msgid "specifying constraint deferrability not supported for domains" msgstr "spécifier des contraintes déferrantes n'est pas supporté par les domaines" -#: commands/typecmds.c:1320 utils/cache/typcache.c:2545 +#: commands/typecmds.c:1320 utils/cache/typcache.c:2566 #, c-format msgid "%s is not an enum" msgstr "%s n'est pas un enum" @@ -10917,133 +10894,133 @@ msgstr "ne peut pas spécifier une fonction canonique sans un type shell précé msgid "Create the type as a shell type, then create its canonicalization function, then do a full CREATE TYPE." msgstr "Créez le type comme un type shell, puis créez sa fonction canonisée, puis faites un vrai CREATE TYPE." -#: commands/typecmds.c:1982 +#: commands/typecmds.c:1981 #, c-format msgid "type input function %s has multiple matches" msgstr "la fonction d'entrée du type %s a plusieurs correspondances" -#: commands/typecmds.c:2000 +#: commands/typecmds.c:1999 #, c-format msgid "type input function %s must return type %s" msgstr "le type d'entrée de la fonction %s doit être %s" -#: commands/typecmds.c:2016 +#: commands/typecmds.c:2015 #, c-format msgid "type input function %s should not be volatile" msgstr "la fonction en entrée du type %s ne doit pas être volatile" -#: commands/typecmds.c:2044 +#: commands/typecmds.c:2043 #, c-format msgid "type output function %s must return type %s" msgstr "le type de sortie de la fonction %s doit être %s" -#: commands/typecmds.c:2051 +#: commands/typecmds.c:2050 #, c-format msgid "type output function %s should not be volatile" msgstr "la fonction en entrée du type %s ne doit pas être volatile" -#: commands/typecmds.c:2080 +#: commands/typecmds.c:2079 #, c-format msgid "type receive function %s has multiple matches" msgstr "la fonction receive du type %s a plusieurs correspondances" -#: commands/typecmds.c:2098 +#: commands/typecmds.c:2097 #, c-format msgid "type receive function %s must return type %s" msgstr "la fonction receive du type %s doit renvoyer le type %s" -#: commands/typecmds.c:2105 +#: commands/typecmds.c:2104 #, c-format msgid "type receive function %s should not be volatile" msgstr "la fonction receive du type %s ne doit pas être volatile" -#: commands/typecmds.c:2133 +#: commands/typecmds.c:2132 #, c-format msgid "type send function %s must return type %s" msgstr "le type de sortie de la fonction d'envoi %s doit être %s" -#: commands/typecmds.c:2140 +#: commands/typecmds.c:2139 #, c-format msgid "type send function %s should not be volatile" msgstr "la fonction send du type %s ne doit pas être volatile" -#: commands/typecmds.c:2167 +#: commands/typecmds.c:2166 #, c-format msgid "typmod_in function %s must return type %s" msgstr "le type de sortie de la fonction typmod_in %s doit être %s" -#: commands/typecmds.c:2174 +#: commands/typecmds.c:2173 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "la fonction en entrée du modificateur de type %s ne devrait pas être volatile" -#: commands/typecmds.c:2201 +#: commands/typecmds.c:2200 #, c-format msgid "typmod_out function %s must return type %s" msgstr "le type de sortie de la fonction typmod_out %s doit être %s" -#: commands/typecmds.c:2208 +#: commands/typecmds.c:2207 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "la fonction en sortie du modificateur de type %s ne devrait pas être volatile" -#: commands/typecmds.c:2235 +#: commands/typecmds.c:2234 #, c-format msgid "type analyze function %s must return type %s" msgstr "la fonction analyze du type %s doit renvoyer le type %s" -#: commands/typecmds.c:2264 +#: commands/typecmds.c:2263 #, c-format msgid "type subscripting function %s must return type %s" msgstr "la fonction %s d'indiçage de type doit renvoyer le type %s" -#: commands/typecmds.c:2274 +#: commands/typecmds.c:2273 #, c-format msgid "user-defined types cannot use subscripting function %s" -msgstr "" +msgstr "les types utilisateurs ne peuvent pas utiliser la fonction d'indiçage %s" -#: commands/typecmds.c:2320 +#: commands/typecmds.c:2319 #, c-format msgid "You must specify an operator class for the range type or define a default operator class for the subtype." msgstr "" "Vous devez spécifier une classe d'opérateur pour le type range ou définir une\n" "classe d'opérateur par défaut pour le sous-type." -#: commands/typecmds.c:2351 +#: commands/typecmds.c:2350 #, c-format msgid "range canonical function %s must return range type" msgstr "la fonction canonical %s du range doit renvoyer le type range" -#: commands/typecmds.c:2357 +#: commands/typecmds.c:2356 #, c-format msgid "range canonical function %s must be immutable" msgstr "la fonction canonical %s du range doit être immutable" -#: commands/typecmds.c:2393 +#: commands/typecmds.c:2392 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "" "la fonction %s de calcul de différence pour le sous-type d'un intervalle de\n" "valeur doit renvoyer le type %s" -#: commands/typecmds.c:2400 +#: commands/typecmds.c:2399 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "" "la fonction %s de calcul de différence pour le sous-type d'un intervalle de\n" "valeur doit être immutable" -#: commands/typecmds.c:2427 +#: commands/typecmds.c:2426 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "les valeurs d'OID du tableau pgtype ne sont pas positionnées en mode de mise à jour binaire" -#: commands/typecmds.c:2460 +#: commands/typecmds.c:2459 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "valeur d'OID du multirange de pg_type non positionnée en mode de mise à jour binaire" -#: commands/typecmds.c:2493 +#: commands/typecmds.c:2492 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" msgstr "valeur d'OID du tableau multirange de pg_type non positionnée en mode de mise à jour binaire" @@ -11482,7 +11459,7 @@ msgstr "" "ignore « %s » --- n'a pas pu exécuter un VACUUM sur les objets autres que\n" "des tables et les tables systèmes" -#: commands/variable.c:165 utils/misc/guc.c:11625 utils/misc/guc.c:11687 +#: commands/variable.c:165 utils/misc/guc.c:11626 utils/misc/guc.c:11688 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "Mot clé non reconnu : « %s »." @@ -11680,7 +11657,7 @@ msgstr "le curseur « %s » n'est pas un parcours modifiable de la table « %s #: executor/execCurrent.c:280 executor/execExprInterp.c:2451 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" -msgstr "le type de paramètre %d (%s) ne correspond pas à ce qui est préparé dans le plan (%s)" +msgstr "le type de paramètre %d (%s) ne correspond pas à celui préparé dans le plan (%s)" #: executor/execCurrent.c:292 executor/execExprInterp.c:2463 #, c-format @@ -11709,7 +11686,7 @@ msgstr "" msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "La table a le type %s à la position ordinale %d alors que la requête attend %s." -#: executor/execExpr.c:1110 parser/parse_agg.c:827 +#: executor/execExpr.c:1110 parser/parse_agg.c:820 #, c-format msgid "window function calls cannot be nested" msgstr "les appels à la fonction window ne peuvent pas être imbriqués" @@ -11756,7 +11733,7 @@ msgstr "l'attribut %d de type %s a un mauvais type" msgid "Table has type %s, but query expects %s." msgstr "La table a le type %s alors que la requête attend %s." -#: executor/execExprInterp.c:2003 utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1748 utils/cache/typcache.c:1904 utils/cache/typcache.c:2033 utils/fmgr/funcapi.c:458 +#: executor/execExprInterp.c:2003 utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1751 utils/cache/typcache.c:1907 utils/cache/typcache.c:2054 utils/fmgr/funcapi.c:458 #, c-format msgid "type %s is not composite" msgstr "le type %s n'est pas un type composite" @@ -11776,7 +11753,7 @@ msgstr "ne peut pas fusionner les tableaux incompatibles" msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." msgstr "Le tableau avec le type d'élément %s ne peut pas être inclus dans la construction ARRAY avec le type d'élément %s." -#: executor/execExprInterp.c:2776 utils/adt/arrayfuncs.c:262 utils/adt/arrayfuncs.c:562 utils/adt/arrayfuncs.c:1304 utils/adt/arrayfuncs.c:3374 utils/adt/arrayfuncs.c:5336 utils/adt/arrayfuncs.c:5853 utils/adt/arraysubs.c:150 utils/adt/arraysubs.c:488 +#: executor/execExprInterp.c:2776 utils/adt/arrayfuncs.c:263 utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 utils/adt/arrayfuncs.c:3375 utils/adt/arrayfuncs.c:5371 utils/adt/arrayfuncs.c:5888 utils/adt/arraysubs.c:150 utils/adt/arraysubs.c:488 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "le nombre de dimensions du tableau (%d) dépasse le maximum autorisé (%d)" @@ -11817,37 +11794,37 @@ msgstr "" "Le stockage physique ne correspond pas à l'attribut supprimé à la position\n" "ordinale %d." -#: executor/execIndexing.c:571 +#: executor/execIndexing.c:567 #, c-format msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" msgstr "ON CONFLICT ne supporte pas les contraintes uniques diferrables et les contraintes d'exclusion différables comme arbitres" -#: executor/execIndexing.c:842 +#: executor/execIndexing.c:838 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "n'a pas pu créer la contrainte d'exclusion « %s »" -#: executor/execIndexing.c:845 +#: executor/execIndexing.c:841 #, c-format msgid "Key %s conflicts with key %s." msgstr "La clé %s est en conflit avec la clé %s." -#: executor/execIndexing.c:847 +#: executor/execIndexing.c:843 #, c-format msgid "Key conflicts exist." msgstr "Un conflit de clés est présent." -#: executor/execIndexing.c:853 +#: executor/execIndexing.c:849 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "la valeur d'une clé en conflit rompt la contrainte d'exclusion « %s »" -#: executor/execIndexing.c:856 +#: executor/execIndexing.c:852 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "La clé %s est en conflit avec la clé existante %s." -#: executor/execIndexing.c:858 +#: executor/execIndexing.c:854 #, c-format msgid "Key conflicts with existing key." msgstr "La clé est en conflit avec une clé existante." @@ -11862,32 +11839,32 @@ msgstr "ne peut pas modifier la séquence « %s »" msgid "cannot change TOAST relation \"%s\"" msgstr "ne peut pas modifier la relation TOAST « %s »" -#: executor/execMain.c:1031 rewrite/rewriteHandler.c:3041 rewrite/rewriteHandler.c:3824 +#: executor/execMain.c:1031 rewrite/rewriteHandler.c:3064 rewrite/rewriteHandler.c:3861 #, c-format msgid "cannot insert into view \"%s\"" msgstr "ne peut pas insérer dans la vue « %s »" -#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3044 rewrite/rewriteHandler.c:3827 +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3067 rewrite/rewriteHandler.c:3864 #, c-format msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." msgstr "Pour activer l'insertion dans la vue, fournissez un trigger INSTEAD OF INSERT ou une règle ON INSERT DO INSTEAD sans condition." -#: executor/execMain.c:1039 rewrite/rewriteHandler.c:3049 rewrite/rewriteHandler.c:3832 +#: executor/execMain.c:1039 rewrite/rewriteHandler.c:3072 rewrite/rewriteHandler.c:3869 #, c-format msgid "cannot update view \"%s\"" msgstr "ne peut pas mettre à jour la vue « %s »" -#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3052 rewrite/rewriteHandler.c:3835 +#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3075 rewrite/rewriteHandler.c:3872 #, c-format msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." msgstr "Pour activer la mise à jour dans la vue, fournissez un trigger INSTEAD OF UPDATE ou une règle ON UPDATE DO INSTEAD sans condition." -#: executor/execMain.c:1047 rewrite/rewriteHandler.c:3057 rewrite/rewriteHandler.c:3840 +#: executor/execMain.c:1047 rewrite/rewriteHandler.c:3080 rewrite/rewriteHandler.c:3877 #, c-format msgid "cannot delete from view \"%s\"" msgstr "ne peut pas supprimer à partir de la vue « %s »" -#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3060 rewrite/rewriteHandler.c:3843 +#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3083 rewrite/rewriteHandler.c:3880 #, c-format msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." msgstr "Pour activer la suppression dans la vue, fournissez un trigger INSTEAD OF DELETE ou une règle ON DELETE DO INSTEAD sans condition." @@ -12032,7 +12009,7 @@ msgstr "mise à jour concurrente, nouvelle tentative" msgid "concurrent delete, retrying" msgstr "suppression concurrente, nouvelle tentative" -#: executor/execReplication.c:269 parser/parse_cte.c:502 parser/parse_oper.c:233 utils/adt/array_userfuncs.c:720 utils/adt/array_userfuncs.c:859 utils/adt/arrayfuncs.c:3654 utils/adt/arrayfuncs.c:4174 utils/adt/arrayfuncs.c:6166 utils/adt/rowtypes.c:1203 +#: executor/execReplication.c:269 parser/parse_cte.c:502 parser/parse_oper.c:233 utils/adt/array_userfuncs.c:720 utils/adt/array_userfuncs.c:859 utils/adt/arrayfuncs.c:3655 utils/adt/arrayfuncs.c:4209 utils/adt/arrayfuncs.c:6201 utils/adt/rowtypes.c:1203 #, c-format msgid "could not identify an equality operator for type %s" msgstr "n'a pas pu identifier un opérateur d'égalité pour le type %s" @@ -12148,7 +12125,7 @@ msgid "%s is not allowed in an SQL function" msgstr "%s n'est pas autorisé dans une fonction SQL" #. translator: %s is a SQL statement name -#: executor/functions.c:528 executor/spi.c:1633 executor/spi.c:2485 +#: executor/functions.c:528 executor/spi.c:1649 executor/spi.c:2538 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "%s n'est pas autorisé dans une fonction non volatile" @@ -12210,17 +12187,17 @@ msgstr "L'instruction finale renvoie trop peu de colonnes." msgid "return type %s is not supported for SQL functions" msgstr "le type de retour %s n'est pas supporté pour les fonctions SQL" -#: executor/nodeAgg.c:3083 executor/nodeAgg.c:3092 executor/nodeAgg.c:3104 +#: executor/nodeAgg.c:3088 executor/nodeAgg.c:3097 executor/nodeAgg.c:3109 #, c-format msgid "unexpected EOF for tape %d: requested %zu bytes, read %zu bytes" msgstr "fin de fichier inattendu pour la cassette %d : attendait %zu octets, a lu %zu octets" -#: executor/nodeAgg.c:3977 parser/parse_agg.c:666 parser/parse_agg.c:696 +#: executor/nodeAgg.c:3974 parser/parse_agg.c:661 parser/parse_agg.c:689 #, c-format msgid "aggregate function calls cannot be nested" msgstr "les appels à la fonction d'agrégat ne peuvent pas être imbriqués" -#: executor/nodeAgg.c:4185 executor/nodeWindowAgg.c:2836 +#: executor/nodeAgg.c:4182 executor/nodeWindowAgg.c:2836 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "l'agrégat %u a besoin d'avoir des types compatibles en entrée et en transition" @@ -12240,7 +12217,7 @@ msgstr "n'a pas pu revenir au début du fichier temporaire pour la jointure de h msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" msgstr "n'a pas pu lire le fichier temporaire pour la jointure de hachage : a lu seulement %zu octets sur %zu" -#: executor/nodeIndexonlyscan.c:242 +#: executor/nodeIndexonlyscan.c:240 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "les fonctions de distance à perte ne sont pas supportées dans les parcours d'index seul" @@ -12270,27 +12247,27 @@ msgstr "FULL JOIN est supporté seulement avec les conditions de jointures MERGE msgid "Query has too few columns." msgstr "La requête n'a pas assez de colonnes." -#: executor/nodeModifyTable.c:1203 executor/nodeModifyTable.c:1277 +#: executor/nodeModifyTable.c:1205 executor/nodeModifyTable.c:1279 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "la ligne à supprimer était déjà modifiée par une opération déclenchée par la commande courante" -#: executor/nodeModifyTable.c:1452 +#: executor/nodeModifyTable.c:1454 #, c-format msgid "invalid ON UPDATE specification" msgstr "spécification ON UPDATE invalide" -#: executor/nodeModifyTable.c:1453 +#: executor/nodeModifyTable.c:1455 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "La ligne résultante apparaîtrait dans une partition différente de la ligne originale." -#: executor/nodeModifyTable.c:2049 +#: executor/nodeModifyTable.c:2051 #, c-format msgid "ON CONFLICT DO UPDATE command cannot affect row a second time" msgstr "la commande ON CONFLICT DO UPDATE ne peut pas affecter une ligne la deuxième fois" -#: executor/nodeModifyTable.c:2050 +#: executor/nodeModifyTable.c:2052 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "S'assure qu'aucune ligne proposée à l'insertion dans la même commande n'a de valeurs contraintes dupliquées." @@ -12365,68 +12342,79 @@ msgstr "l'offset de fin de frame ne doit pas être négatif" msgid "aggregate function %s does not support use as a window function" msgstr "la fonction d'agrégat %s ne supporte pas l'utilisation en tant que fonction de fenêtrage" -#: executor/spi.c:237 executor/spi.c:302 +#: executor/spi.c:234 executor/spi.c:299 #, c-format msgid "invalid transaction termination" msgstr "arrêt de transaction invalide" -#: executor/spi.c:251 +#: executor/spi.c:248 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "ne peut pas valider la transaction pendant qu'une sous-transaction est active" -#: executor/spi.c:308 +#: executor/spi.c:305 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "ne peut pas annuler la transaction pendant qu'une sous-transaction est active" -#: executor/spi.c:380 +#: executor/spi.c:377 #, c-format msgid "transaction left non-empty SPI stack" msgstr "transaction gauche non vide dans la pile SPI" -#: executor/spi.c:381 executor/spi.c:443 +#: executor/spi.c:378 executor/spi.c:440 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "Vérifiez les appels manquants à « SPI_finish »." -#: executor/spi.c:442 +#: executor/spi.c:439 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "sous-transaction gauche non vide dans la pile SPI" -#: executor/spi.c:1495 +#: executor/spi.c:1507 #, c-format msgid "cannot open multi-query plan as cursor" msgstr "ne peut pas ouvrir le plan à plusieurs requêtes comme curseur" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:1500 +#: executor/spi.c:1517 #, c-format msgid "cannot open %s query as cursor" msgstr "ne peut pas ouvrir la requête %s comme curseur" -#: executor/spi.c:1607 +#: executor/spi.c:1623 #, c-format msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE n'est pas supporté" -#: executor/spi.c:1608 parser/analyze.c:2808 +#: executor/spi.c:1624 parser/analyze.c:2821 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Les curseurs déplaçables doivent être en lecture seule (READ ONLY)." -#: executor/spi.c:2809 +#: executor/spi.c:2377 +#, c-format +msgid "empty query does not return tuples" +msgstr "la requête vide ne renvoie pas de lignes" + +#. translator: %s is name of a SQL command, eg INSERT +#: executor/spi.c:2451 +#, c-format +msgid "%s query does not return tuples" +msgstr "la requête %s ne renvoie pas de lignes" + +#: executor/spi.c:2863 #, c-format msgid "SQL expression \"%s\"" msgstr "expression SQL « %s »" -#: executor/spi.c:2814 +#: executor/spi.c:2868 #, c-format msgid "PL/pgSQL assignment \"%s\"" msgstr "affectation PL/pgSQL « %s »" -#: executor/spi.c:2817 +#: executor/spi.c:2871 #, c-format msgid "SQL statement \"%s\"" msgstr "instruction SQL « %s »" @@ -12494,7 +12482,7 @@ msgstr "option de séquence « %s » non supportée ici" #: gram.y:2840 #, c-format msgid "modulus for hash partition provided more than once" -msgstr "le modulus pour la partition hash est spécifié plus d'une fois" +msgstr "le modulo pour la partition hash est spécifié plus d'une fois" #: gram.y:2849 #, c-format @@ -12509,7 +12497,7 @@ msgstr "spécification de limite de partition hash non reconnue « %s »" #: gram.y:2864 #, c-format msgid "modulus for hash partition must be specified" -msgstr "le modulus pour les partition hash doit être spécifié" +msgstr "le modulo pour les partitions hash doit être spécifié" #: gram.y:2868 #, c-format @@ -12779,35 +12767,35 @@ msgstr "clauses LIMIT multiples non autorisées" msgid "multiple limit options not allowed" msgstr "options limite multiples non autorisées" -#: gram.y:16808 +#: gram.y:16823 #, c-format msgid "multiple WITH clauses not allowed" msgstr "clauses WITH multiples non autorisées" -#: gram.y:17002 +#: gram.y:17017 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "les arguments OUT et INOUT ne sont pas autorisés dans des fonctions TABLE" -#: gram.y:17098 +#: gram.y:17113 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "clauses COLLATE multiples non autorisées" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17136 gram.y:17149 +#: gram.y:17151 gram.y:17164 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "les contraintes %s ne peuvent pas être marquées comme DEFERRABLE" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17162 +#: gram.y:17177 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "les contraintes %s ne peuvent pas être marquées comme NOT VALID" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17175 +#: gram.y:17190 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "les contraintes %s ne peuvent pas être marquées NO INHERIT" @@ -12817,86 +12805,86 @@ msgstr "les contraintes %s ne peuvent pas être marquées NO INHERIT" msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" msgstr "paramètre de configuration « %s » non reconnu dans le fichier « %s », ligne %d" -#: guc-file.l:351 utils/misc/guc.c:7360 utils/misc/guc.c:7558 utils/misc/guc.c:7652 utils/misc/guc.c:7746 utils/misc/guc.c:7866 utils/misc/guc.c:7965 +#: guc-file.l:353 utils/misc/guc.c:7361 utils/misc/guc.c:7559 utils/misc/guc.c:7653 utils/misc/guc.c:7747 utils/misc/guc.c:7867 utils/misc/guc.c:7966 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "le paramètre « %s » ne peut pas être modifié sans redémarrer le serveur" -#: guc-file.l:387 +#: guc-file.l:389 #, c-format msgid "parameter \"%s\" removed from configuration file, reset to default" msgstr "" "paramètre « %s » supprimé du fichier de configuration ;\n" "réinitialisation à la valeur par défaut" -#: guc-file.l:453 +#: guc-file.l:455 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "paramètre « %s » modifié par « %s »" -#: guc-file.l:495 +#: guc-file.l:497 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "le fichier de configuration « %s » contient des erreurs" -#: guc-file.l:500 +#: guc-file.l:502 #, c-format msgid "configuration file \"%s\" contains errors; unaffected changes were applied" msgstr "le fichier de configuration « %s » contient des erreurs ; les modifications non affectées ont été appliquées" -#: guc-file.l:505 +#: guc-file.l:507 #, c-format msgid "configuration file \"%s\" contains errors; no changes were applied" msgstr "le fichier de configuration « %s » contient des erreurs ; aucune modification n'a été appliquée" -#: guc-file.l:577 +#: guc-file.l:579 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "nom de fichier de configuration vide : « %s »" -#: guc-file.l:594 +#: guc-file.l:596 #, c-format msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" msgstr "" "n'a pas pu ouvrir le fichier de configuration « %s » : profondeur\n" "d'imbrication dépassé" -#: guc-file.l:614 +#: guc-file.l:616 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "le fichier de configuration « %s » contient une récursion" -#: guc-file.l:630 libpq/hba.c:2251 libpq/hba.c:2665 +#: guc-file.l:632 libpq/hba.c:2255 libpq/hba.c:2669 #, c-format msgid "could not open configuration file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier de configuration « %s » : %m" -#: guc-file.l:641 +#: guc-file.l:643 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "ignore le fichier de configuration « %s » manquant" -#: guc-file.l:895 +#: guc-file.l:897 #, c-format msgid "syntax error in file \"%s\" line %u, near end of line" msgstr "erreur de syntaxe dans le fichier « %s », ligne %u, près de la fin de ligne" -#: guc-file.l:905 +#: guc-file.l:907 #, c-format msgid "syntax error in file \"%s\" line %u, near token \"%s\"" msgstr "erreur de syntaxe dans le fichier « %s », ligne %u, près du mot clé « %s »" -#: guc-file.l:925 +#: guc-file.l:927 #, c-format msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "trop d'erreurs de syntaxe trouvées, abandon du fichier « %s »" -#: guc-file.l:980 +#: guc-file.l:982 #, c-format msgid "empty configuration directory name: \"%s\"" msgstr "nom de répertoire de configuration vide : « %s »" -#: guc-file.l:999 +#: guc-file.l:1001 #, c-format msgid "could not open configuration directory \"%s\": %m" msgstr "n'a pas pu ouvrir le répertoire de configuration « %s » : %m" @@ -12906,7 +12894,7 @@ msgstr "n'a pas pu ouvrir le répertoire de configuration « %s » : %m" msgid "could not access file \"%s\": %m" msgstr "n'a pas pu accéder au fichier « %s » : %m" -#: jsonpath_gram.y:528 jsonpath_scan.l:519 jsonpath_scan.l:530 jsonpath_scan.l:540 jsonpath_scan.l:582 utils/adt/encode.c:435 utils/adt/encode.c:501 utils/adt/jsonfuncs.c:623 utils/adt/varlena.c:339 utils/adt/varlena.c:380 +#: jsonpath_gram.y:528 jsonpath_scan.l:519 jsonpath_scan.l:530 jsonpath_scan.l:540 jsonpath_scan.l:582 utils/adt/encode.c:482 utils/adt/encode.c:547 utils/adt/jsonfuncs.c:623 utils/adt/varlena.c:336 utils/adt/varlena.c:377 #, c-format msgid "invalid input syntax for type %s" msgstr "syntaxe en entrée invalide pour le type %s" @@ -13001,12 +12989,12 @@ msgstr "Caractère « = » attendu pour l'attribut « %c »." #: libpq/auth-scram.c:815 #, c-format msgid "Attribute expected, but found end of string." -msgstr "Attribut attendu, mais a trouvé une fin de chaîne." +msgstr "Attribut attendu, mais fin de chaîne trouvée." #: libpq/auth-scram.c:828 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." -msgstr "Attribut attendu, mais a trouvé le caractère invalide « %s »." +msgstr "Attribut attendu, mais caractère invalide « %s » trouvé." #: libpq/auth-scram.c:946 libpq/auth-scram.c:968 #, c-format @@ -13165,13 +13153,13 @@ msgstr "La connexion correspond à la ligne %d du pg_hba.conf : « %s »" #: libpq/auth.c:371 #, c-format -msgid "connection was re-authenticated" -msgstr "la connexion a été ré-authentifiée" +msgid "authentication identifier set more than once" +msgstr "identifiant d'authentification configuré plus d'une fois" #: libpq/auth.c:372 #, c-format -msgid "previous ID: \"%s\"; new ID: \"%s\"" -msgstr "ID précédent : « %s » ; nouvel ID : « %s »" +msgid "previous identifier: \"%s\"; new identifier: \"%s\"" +msgstr "identifiant précédent : « %s » ; nouvel identifiant : « %s »" #: libpq/auth.c:381 #, c-format @@ -13303,433 +13291,433 @@ msgstr "en attente d'une réponse GSS, a reçu un message de type %d" msgid "accepting GSS security context failed" msgstr "échec de l'acceptation du contexte de sécurité GSS" -#: libpq/auth.c:1224 +#: libpq/auth.c:1225 msgid "retrieving GSS user name failed" msgstr "échec lors de la récupération du nom de l'utilisateur avec GSS" -#: libpq/auth.c:1365 +#: libpq/auth.c:1374 msgid "could not acquire SSPI credentials" msgstr "n'a pas pu obtenir les pièces d'identité SSPI" -#: libpq/auth.c:1390 +#: libpq/auth.c:1399 #, c-format msgid "expected SSPI response, got message type %d" msgstr "en attente d'une réponse SSPI, a reçu un message de type %d" -#: libpq/auth.c:1468 +#: libpq/auth.c:1477 msgid "could not accept SSPI security context" msgstr "n'a pas pu accepter le contexte de sécurité SSPI" -#: libpq/auth.c:1530 +#: libpq/auth.c:1539 msgid "could not get token from SSPI security context" msgstr "n'a pas pu obtenir le jeton du contexte de sécurité SSPI" -#: libpq/auth.c:1669 libpq/auth.c:1688 +#: libpq/auth.c:1678 libpq/auth.c:1697 #, c-format msgid "could not translate name" msgstr "n'a pas pu traduit le nom" -#: libpq/auth.c:1701 +#: libpq/auth.c:1710 #, c-format msgid "realm name too long" msgstr "nom du royaume trop long" -#: libpq/auth.c:1716 +#: libpq/auth.c:1725 #, c-format msgid "translated account name too long" msgstr "traduction du nom de compte trop longue" -#: libpq/auth.c:1897 +#: libpq/auth.c:1906 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "n'a pas pu créer le socket pour la connexion Ident : %m" -#: libpq/auth.c:1912 +#: libpq/auth.c:1921 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "n'a pas pu se lier à l'adresse locale « %s » : %m" -#: libpq/auth.c:1924 +#: libpq/auth.c:1933 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "n'a pas pu se connecter au serveur Ident à l'adresse « %s », port %s : %m" -#: libpq/auth.c:1946 +#: libpq/auth.c:1955 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "n'a pas pu envoyer la requête au serveur Ident à l'adresse « %s », port %s : %m" -#: libpq/auth.c:1963 +#: libpq/auth.c:1972 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "" "n'a pas pu recevoir la réponse du serveur Ident à l'adresse « %s », port %s :\n" "%m" -#: libpq/auth.c:1973 +#: libpq/auth.c:1982 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "réponse mal formatée du serveur Ident : « %s »" -#: libpq/auth.c:2026 +#: libpq/auth.c:2035 #, c-format msgid "peer authentication is not supported on this platform" msgstr "la méthode d'authentification «peer n'est pas supportée sur cette plateforme" -#: libpq/auth.c:2030 +#: libpq/auth.c:2039 #, c-format msgid "could not get peer credentials: %m" msgstr "n'a pas pu obtenir l'authentification de l'autre : %m" -#: libpq/auth.c:2042 +#: libpq/auth.c:2051 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "n'a pas pu rechercher l'identifiant %ld de l'utilisateur local : %s" -#: libpq/auth.c:2143 +#: libpq/auth.c:2152 #, c-format msgid "error from underlying PAM layer: %s" msgstr "erreur provenant de la couche PAM : %s" -#: libpq/auth.c:2154 +#: libpq/auth.c:2163 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "conversation PAM %d/\"%s\" non supportée" -#: libpq/auth.c:2214 +#: libpq/auth.c:2223 #, c-format msgid "could not create PAM authenticator: %s" msgstr "n'a pas pu créer l'authenticateur PAM : %s" -#: libpq/auth.c:2225 +#: libpq/auth.c:2234 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER) a échoué : %s" -#: libpq/auth.c:2257 +#: libpq/auth.c:2266 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST) a échoué : %s" -#: libpq/auth.c:2269 +#: libpq/auth.c:2278 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "pam_set_item(PAM_CONV) a échoué : %s" -#: libpq/auth.c:2282 +#: libpq/auth.c:2291 #, c-format msgid "pam_authenticate failed: %s" msgstr "pam_authenticate a échoué : %s" -#: libpq/auth.c:2295 +#: libpq/auth.c:2304 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmt a échoué : %s" -#: libpq/auth.c:2306 +#: libpq/auth.c:2315 #, c-format msgid "could not release PAM authenticator: %s" msgstr "n'a pas pu fermer l'authenticateur PAM : %s" -#: libpq/auth.c:2386 +#: libpq/auth.c:2395 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "n'a pas pu initialiser LDAP : code d'erreur %d" -#: libpq/auth.c:2423 +#: libpq/auth.c:2432 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "n'a pas pu extraire le nom de domaine depuis ldapbasedn" -#: libpq/auth.c:2431 +#: libpq/auth.c:2440 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "l'authentification LDAP n'a pu trouver les enregistrement DNS SRV pour « %s »" -#: libpq/auth.c:2433 +#: libpq/auth.c:2442 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Définit un nom de serveur LDAP explicitement." -#: libpq/auth.c:2485 +#: libpq/auth.c:2494 #, c-format msgid "could not initialize LDAP: %s" msgstr "n'a pas pu initialiser LDAP : %s" -#: libpq/auth.c:2495 +#: libpq/auth.c:2504 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ldaps non supporté avec cette bibliothèque LDAP" -#: libpq/auth.c:2503 +#: libpq/auth.c:2512 #, c-format msgid "could not initialize LDAP: %m" msgstr "n'a pas pu initialiser LDAP : %m" -#: libpq/auth.c:2513 +#: libpq/auth.c:2522 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "n'a pas pu initialiser la version du protocole LDAP : %s" -#: libpq/auth.c:2553 +#: libpq/auth.c:2562 #, c-format msgid "could not load function _ldap_start_tls_sA in wldap32.dll" msgstr "n'a pas pu charger la fonction _ldap_start_tls_sA de wldap32.dll" -#: libpq/auth.c:2554 +#: libpq/auth.c:2563 #, c-format msgid "LDAP over SSL is not supported on this platform." msgstr "LDAP via SSL n'est pas supporté sur cette plateforme." -#: libpq/auth.c:2570 +#: libpq/auth.c:2579 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "n'a pas pu démarrer la session TLS LDAP : %s" -#: libpq/auth.c:2641 +#: libpq/auth.c:2650 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "serveur LDAP non précisé, et il n'y a pas de ldapbasedn" -#: libpq/auth.c:2648 +#: libpq/auth.c:2657 #, c-format msgid "LDAP server not specified" msgstr "serveur LDAP non précisé" -#: libpq/auth.c:2710 +#: libpq/auth.c:2719 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "caractère invalide dans le nom de l'utilisateur pour l'authentification LDAP" -#: libpq/auth.c:2727 +#: libpq/auth.c:2736 #, c-format msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" msgstr "n'a pas pu réaliser le lien LDAP initiale pour ldapbinddn « %s » sur le serveur « %s » : %s" -#: libpq/auth.c:2756 +#: libpq/auth.c:2765 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "n'a pas pu rechercher dans LDAP pour filtrer « %s » sur le serveur « %s » : %s" -#: libpq/auth.c:2770 +#: libpq/auth.c:2779 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "l'utilisateur LDAP « %s » n'existe pas" -#: libpq/auth.c:2771 +#: libpq/auth.c:2780 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "la recherche LDAP pour le filtre « %s » sur le serveur « %s » n'a renvoyé aucun enregistrement." -#: libpq/auth.c:2775 +#: libpq/auth.c:2784 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "l'utilisateur LDAP « %s » n'est pas unique" -#: libpq/auth.c:2776 +#: libpq/auth.c:2785 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." msgstr[0] "la recherche LDAP pour le filtre « %s » sur le serveur « %s » a renvoyé %d enregistrement." msgstr[1] "la recherche LDAP pour le filtre « %s » sur le serveur « %s » a renvoyé %d enregistrements." -#: libpq/auth.c:2796 +#: libpq/auth.c:2805 #, c-format msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" msgstr "" "n'a pas pu obtenir le dn pour la première entrée correspondante « %s » sur\n" "le serveur « %s » : %s" -#: libpq/auth.c:2817 +#: libpq/auth.c:2826 #, c-format msgid "could not unbind after searching for user \"%s\" on server \"%s\"" msgstr "" "n'a pas pu exécuter le unbind après la recherche de l'utilisateur « %s »\n" "sur le serveur « %s »" -#: libpq/auth.c:2848 +#: libpq/auth.c:2857 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "échec de connexion LDAP pour l'utilisateur « %s » sur le serveur « %s » : %s" -#: libpq/auth.c:2880 +#: libpq/auth.c:2889 #, c-format msgid "LDAP diagnostics: %s" msgstr "diagnostique LDAP: %s" -#: libpq/auth.c:2918 +#: libpq/auth.c:2927 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "" "l'authentification par le certificat a échoué pour l'utilisateur « %s » :\n" "le certificat du client ne contient aucun nom d'utilisateur" -#: libpq/auth.c:2939 +#: libpq/auth.c:2948 #, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" msgstr "authentification par certificat échouée pour l'utilisateur « %s » : incapable de récupérer le DN sujet" -#: libpq/auth.c:2962 +#: libpq/auth.c:2971 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" msgstr "la validation du certificat (clientcert=verify-full) a échoué pour l'utilisateur « %s » : incohérence de DN" -#: libpq/auth.c:2967 +#: libpq/auth.c:2976 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "l'authentification par certificat (clientcert=verify-full) a échoué pour l'utilisateur « %s » : incohérence de CN" -#: libpq/auth.c:3069 +#: libpq/auth.c:3078 #, c-format msgid "RADIUS server not specified" msgstr "serveur RADIUS non précisé" -#: libpq/auth.c:3076 +#: libpq/auth.c:3085 #, c-format msgid "RADIUS secret not specified" msgstr "secret RADIUS non précisé" -#: libpq/auth.c:3090 +#: libpq/auth.c:3099 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "l'authentification RADIUS ne supporte pas les mots de passe de plus de %d caractères" -#: libpq/auth.c:3197 libpq/hba.c:2004 +#: libpq/auth.c:3206 libpq/hba.c:2008 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "n'a pas pu traduire le nom du serveur RADIUS « %s » en une adresse : %s" -#: libpq/auth.c:3211 +#: libpq/auth.c:3220 #, c-format msgid "could not generate random encryption vector" msgstr "n'a pas pu générer le vecteur de chiffrement aléatoire" -#: libpq/auth.c:3245 +#: libpq/auth.c:3254 #, c-format msgid "could not perform MD5 encryption of password" msgstr "n'a pas pu réaliser le chiffrement MD5 du mot de passe" -#: libpq/auth.c:3271 +#: libpq/auth.c:3280 #, c-format msgid "could not create RADIUS socket: %m" msgstr "n'a pas pu créer le socket RADIUS : %m" -#: libpq/auth.c:3293 +#: libpq/auth.c:3302 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "n'a pas pu se lier à la socket RADIUS : %m" -#: libpq/auth.c:3303 +#: libpq/auth.c:3312 #, c-format msgid "could not send RADIUS packet: %m" msgstr "n'a pas pu transmettre le paquet RADIUS : %m" -#: libpq/auth.c:3336 libpq/auth.c:3362 +#: libpq/auth.c:3345 libpq/auth.c:3371 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "dépassement du délai pour la réponse du RADIUS à partir de %s" -#: libpq/auth.c:3355 +#: libpq/auth.c:3364 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "n'a pas pu vérifier le statut sur la socket RADIUS : %m" -#: libpq/auth.c:3385 +#: libpq/auth.c:3394 #, c-format msgid "could not read RADIUS response: %m" msgstr "n'a pas pu lire la réponse RADIUS : %m" -#: libpq/auth.c:3398 libpq/auth.c:3402 +#: libpq/auth.c:3407 libpq/auth.c:3411 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "la réponse RADIUS de %s a été envoyée à partir d'un mauvais port : %d" -#: libpq/auth.c:3411 +#: libpq/auth.c:3420 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "réponse RADIUS de %s trop courte : %d" -#: libpq/auth.c:3418 +#: libpq/auth.c:3427 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "la réponse RADIUS de %s a une longueur corrompue : %d (longueur réelle %d)" -#: libpq/auth.c:3426 +#: libpq/auth.c:3435 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "la réponse RADIUS de %s correspond à une demande différente : %d (devrait être %d)" -#: libpq/auth.c:3451 +#: libpq/auth.c:3460 #, c-format msgid "could not perform MD5 encryption of received packet" msgstr "n'a pas pu réaliser le chiffrement MD5 du paquet reçu" -#: libpq/auth.c:3460 +#: libpq/auth.c:3469 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "la réponse RADIUS de %s a une signature MD5 invalide" -#: libpq/auth.c:3478 +#: libpq/auth.c:3487 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "la réponse RADIUS de %s a un code invalide (%d) pour l'utilisateur « %s »" -#: libpq/be-fsstubs.c:119 libpq/be-fsstubs.c:150 libpq/be-fsstubs.c:178 libpq/be-fsstubs.c:204 libpq/be-fsstubs.c:229 libpq/be-fsstubs.c:277 libpq/be-fsstubs.c:300 libpq/be-fsstubs.c:553 +#: libpq/be-fsstubs.c:128 libpq/be-fsstubs.c:157 libpq/be-fsstubs.c:185 libpq/be-fsstubs.c:211 libpq/be-fsstubs.c:236 libpq/be-fsstubs.c:274 libpq/be-fsstubs.c:297 libpq/be-fsstubs.c:545 #, c-format msgid "invalid large-object descriptor: %d" msgstr "descripteur invalide de « Large Object » : %d" -#: libpq/be-fsstubs.c:161 +#: libpq/be-fsstubs.c:168 #, c-format msgid "large object descriptor %d was not opened for reading" msgstr "le descripteur %d du « Large Object » n'a pas été ouvert pour la lecture" -#: libpq/be-fsstubs.c:185 libpq/be-fsstubs.c:560 +#: libpq/be-fsstubs.c:192 libpq/be-fsstubs.c:552 #, c-format msgid "large object descriptor %d was not opened for writing" msgstr "le descripteur %d du « Large Object » n'a pas été ouvert pour l'écriture" -#: libpq/be-fsstubs.c:212 +#: libpq/be-fsstubs.c:219 #, c-format msgid "lo_lseek result out of range for large-object descriptor %d" msgstr "résultat de lo_lseek en dehors de l'intervalle pour le descripteur de Large Object %d" -#: libpq/be-fsstubs.c:285 +#: libpq/be-fsstubs.c:282 #, c-format msgid "lo_tell result out of range for large-object descriptor %d" msgstr "résultat de lo_tell en dehors de l'intervalle pour le descripteur de Large Object %d" -#: libpq/be-fsstubs.c:432 +#: libpq/be-fsstubs.c:424 #, c-format msgid "could not open server file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier serveur « %s » : %m" -#: libpq/be-fsstubs.c:454 +#: libpq/be-fsstubs.c:447 #, c-format msgid "could not read server file \"%s\": %m" msgstr "n'a pas pu lire le fichier serveur « %s » : %m" -#: libpq/be-fsstubs.c:514 +#: libpq/be-fsstubs.c:506 #, c-format msgid "could not create server file \"%s\": %m" msgstr "n'a pas pu créer le fichier serveur « %s » : %m" -#: libpq/be-fsstubs.c:526 +#: libpq/be-fsstubs.c:518 #, c-format msgid "could not write server file \"%s\": %m" msgstr "n'a pas pu écrire le fichier serveur « %s » : %m" -#: libpq/be-fsstubs.c:760 +#: libpq/be-fsstubs.c:758 #, c-format msgid "large object read request is too large" msgstr "la demande de lecture du Large Object est trop grande" -#: libpq/be-fsstubs.c:802 utils/adt/genfile.c:267 utils/adt/genfile.c:306 utils/adt/genfile.c:342 +#: libpq/be-fsstubs.c:800 utils/adt/genfile.c:267 utils/adt/genfile.c:306 utils/adt/genfile.c:342 #, c-format msgid "requested length cannot be negative" msgstr "la longueur demandée ne peut pas être négative" -#: libpq/be-fsstubs.c:855 storage/large_object/inv_api.c:297 storage/large_object/inv_api.c:309 storage/large_object/inv_api.c:513 storage/large_object/inv_api.c:624 storage/large_object/inv_api.c:814 +#: libpq/be-fsstubs.c:851 storage/large_object/inv_api.c:299 storage/large_object/inv_api.c:311 storage/large_object/inv_api.c:508 storage/large_object/inv_api.c:619 storage/large_object/inv_api.c:809 #, c-format msgid "permission denied for large object %u" msgstr "droit refusé pour le Large Object %u" @@ -13780,7 +13768,7 @@ msgstr "erreur d'empaquetage GSSAPI" #: libpq/be-secure-gssapi.c:211 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" -msgstr "le message sortant GSSAPI n'utilliserait pas la confidentialité" +msgstr "le message sortant GSSAPI n'utiliserait pas la confidentialité" #: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:622 #, c-format @@ -13799,7 +13787,7 @@ msgstr "erreur de dépaquetage GSSAPI" #: libpq/be-secure-gssapi.c:396 #, c-format msgid "incoming GSSAPI message did not use confidentiality" -msgstr "le message GSSAPI en entrée n'a pas utilisé la confidentialité" +msgstr "le message entrant GSSAPI n'a pas utilisé la confidentialité" #: libpq/be-secure-gssapi.c:570 #, c-format @@ -13812,7 +13800,7 @@ msgstr "n'a pas pu accepter le contexte de sécurité GSSAPI" #: libpq/be-secure-gssapi.c:689 msgid "GSSAPI size check error" -msgstr "erreur de vérification de taille GSSAPI" +msgstr "erreur de vérification de la taille GSSAPI" #: libpq/be-secure-openssl.c:115 #, c-format @@ -13948,71 +13936,71 @@ msgstr "le nom distingué du certificat SSL contient des NULL" msgid "SSL error: %s" msgstr "erreur SSL : %s" -#: libpq/be-secure-openssl.c:963 +#: libpq/be-secure-openssl.c:964 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier de paramètres DH « %s » : %m" -#: libpq/be-secure-openssl.c:975 +#: libpq/be-secure-openssl.c:976 #, c-format msgid "could not load DH parameters file: %s" msgstr "n'a pas pu charger le fichier de paramètres DH : %s" -#: libpq/be-secure-openssl.c:985 +#: libpq/be-secure-openssl.c:986 #, c-format msgid "invalid DH parameters: %s" msgstr "paramètres DH invalides : %s" -#: libpq/be-secure-openssl.c:994 +#: libpq/be-secure-openssl.c:995 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "paramètres DH invalides : p n'est pas premier" -#: libpq/be-secure-openssl.c:1003 +#: libpq/be-secure-openssl.c:1004 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "paramètres DH invalides : pas de générateur convenable ou de premier sûr" -#: libpq/be-secure-openssl.c:1164 +#: libpq/be-secure-openssl.c:1165 #, c-format msgid "DH: could not load DH parameters" msgstr "DH : n'a pas pu charger les paramètres DH" -#: libpq/be-secure-openssl.c:1172 +#: libpq/be-secure-openssl.c:1173 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH : n'a pas pu configurer les paramètres DH : %s" -#: libpq/be-secure-openssl.c:1199 +#: libpq/be-secure-openssl.c:1200 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH : nome de courbe non reconnu : %s" -#: libpq/be-secure-openssl.c:1208 +#: libpq/be-secure-openssl.c:1209 #, c-format msgid "ECDH: could not create key" msgstr "ECDH : n'a pas pu créer la clé" -#: libpq/be-secure-openssl.c:1236 +#: libpq/be-secure-openssl.c:1237 msgid "no SSL error reported" msgstr "aucune erreur SSL reportée" -#: libpq/be-secure-openssl.c:1240 +#: libpq/be-secure-openssl.c:1241 #, c-format msgid "SSL error code %lu" -msgstr "erreur SSL de code %lu" +msgstr "code d'erreur SSL %lu" -#: libpq/be-secure-openssl.c:1394 +#: libpq/be-secure-openssl.c:1395 #, c-format -msgid "failed to create BIO" -msgstr "échec pour la création de BIO" +msgid "could not create BIO" +msgstr "n'a pas pu créer BIO" -#: libpq/be-secure-openssl.c:1404 +#: libpq/be-secure-openssl.c:1405 #, c-format msgid "could not get NID for ASN1_OBJECT object" msgstr "n'a pas pu obtenir un NID pour l'objet ASN1_OBJECT" -#: libpq/be-secure-openssl.c:1412 +#: libpq/be-secure-openssl.c:1413 #, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" msgstr "n'a pas pu convertir le NID %d en une structure ASN1_OBJECT" @@ -14075,8 +14063,8 @@ msgstr "erreur lors de l'énumération des interfaces réseau : %m" msgid "authentication option \"%s\" is only valid for authentication methods %s" msgstr "l'option d'authentification « %s » n'est valide que pour les méthodes d'authentification « %s »" -#: libpq/hba.c:888 libpq/hba.c:908 libpq/hba.c:946 libpq/hba.c:996 libpq/hba.c:1010 libpq/hba.c:1034 libpq/hba.c:1043 libpq/hba.c:1056 libpq/hba.c:1077 libpq/hba.c:1090 libpq/hba.c:1110 libpq/hba.c:1132 libpq/hba.c:1144 libpq/hba.c:1203 libpq/hba.c:1223 libpq/hba.c:1237 libpq/hba.c:1257 libpq/hba.c:1268 libpq/hba.c:1283 libpq/hba.c:1302 libpq/hba.c:1318 libpq/hba.c:1330 libpq/hba.c:1367 libpq/hba.c:1408 libpq/hba.c:1421 libpq/hba.c:1443 libpq/hba.c:1455 libpq/hba.c:1473 libpq/hba.c:1523 libpq/hba.c:1567 libpq/hba.c:1578 libpq/hba.c:1594 libpq/hba.c:1611 libpq/hba.c:1622 libpq/hba.c:1641 libpq/hba.c:1657 libpq/hba.c:1673 libpq/hba.c:1727 libpq/hba.c:1744 libpq/hba.c:1757 -#: libpq/hba.c:1769 libpq/hba.c:1788 libpq/hba.c:1875 libpq/hba.c:1893 libpq/hba.c:1987 libpq/hba.c:2006 libpq/hba.c:2035 libpq/hba.c:2048 libpq/hba.c:2071 libpq/hba.c:2093 libpq/hba.c:2107 tsearch/ts_locale.c:232 +#: libpq/hba.c:888 libpq/hba.c:908 libpq/hba.c:946 libpq/hba.c:996 libpq/hba.c:1010 libpq/hba.c:1034 libpq/hba.c:1043 libpq/hba.c:1056 libpq/hba.c:1077 libpq/hba.c:1090 libpq/hba.c:1110 libpq/hba.c:1132 libpq/hba.c:1144 libpq/hba.c:1203 libpq/hba.c:1223 libpq/hba.c:1237 libpq/hba.c:1257 libpq/hba.c:1268 libpq/hba.c:1283 libpq/hba.c:1302 libpq/hba.c:1318 libpq/hba.c:1330 libpq/hba.c:1367 libpq/hba.c:1408 libpq/hba.c:1421 libpq/hba.c:1443 libpq/hba.c:1455 libpq/hba.c:1473 libpq/hba.c:1523 libpq/hba.c:1567 libpq/hba.c:1578 libpq/hba.c:1594 libpq/hba.c:1611 libpq/hba.c:1622 libpq/hba.c:1641 libpq/hba.c:1657 libpq/hba.c:1673 libpq/hba.c:1731 libpq/hba.c:1748 libpq/hba.c:1761 +#: libpq/hba.c:1773 libpq/hba.c:1792 libpq/hba.c:1879 libpq/hba.c:1897 libpq/hba.c:1991 libpq/hba.c:2010 libpq/hba.c:2039 libpq/hba.c:2052 libpq/hba.c:2075 libpq/hba.c:2097 libpq/hba.c:2111 tsearch/ts_locale.c:232 #, c-format msgid "line %d of configuration file \"%s\"" msgstr "ligne %d du fichier de configuration « %s »" @@ -14288,152 +14276,149 @@ msgid "list of RADIUS secrets cannot be empty" msgstr "la liste des secrets RADIUS ne peut pas être vide" #: libpq/hba.c:1638 -#, fuzzy, c-format -#| msgid "the number of %s (%d) must be 1 or the same as the number of %s (%d)" +#, c-format msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" -msgstr "le nombre de %s (%d) doit valoir 1 ou être identique au nombre de %s (%d)" +msgstr "le nombre de secrets RADIUS (%d) doit valoir 1 ou être identique au nombre de serveurs RADIUS (%d)" #: libpq/hba.c:1654 -#, fuzzy, c-format -#| msgid "the number of %s (%d) must be 1 or the same as the number of %s (%d)" +#, c-format msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" -msgstr "le nombre de %s (%d) doit valoir 1 ou être identique au nombre de %s (%d)" +msgstr "le nombre de ports RADIUS (%d) doit valoir 1 ou être identique au nombre de serveurs RADIUS (%d)" #: libpq/hba.c:1670 -#, fuzzy, c-format -#| msgid "the number of %s (%d) must be 1 or the same as the number of %s (%d)" +#, c-format msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" -msgstr "le nombre de %s (%d) doit valoir 1 ou être identique au nombre de %s (%d)" +msgstr "le nombre d'identifiants RADIUS (%d) doit valoir 1 ou être identique au nombre de serveurs RADIUS (%d)" -#: libpq/hba.c:1717 +#: libpq/hba.c:1721 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi et cert" -#: libpq/hba.c:1726 +#: libpq/hba.c:1730 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert ne peut être configuré que pour les lignes « hostssl »" -#: libpq/hba.c:1743 +#: libpq/hba.c:1747 #, c-format msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" msgstr "clientcert accepte seulement « verify-full » lors de l'utilisation de l'authentification « cert »" -#: libpq/hba.c:1756 +#: libpq/hba.c:1760 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "valeur invalide pour clientcert : « %s »" -#: libpq/hba.c:1768 +#: libpq/hba.c:1772 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" msgstr "clientname peut seulement être configuré pour les lignes « hostssl »" -#: libpq/hba.c:1787 +#: libpq/hba.c:1791 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "valeur invalide pour clientname : « %s »" -#: libpq/hba.c:1821 +#: libpq/hba.c:1825 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "n'a pas pu analyser l'URL LDAP « %s » : %s" -#: libpq/hba.c:1832 +#: libpq/hba.c:1836 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "méthode URL LDAP non supporté : %s" -#: libpq/hba.c:1856 +#: libpq/hba.c:1860 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "URLs LDAP non supportées sur cette plateforme" -#: libpq/hba.c:1874 +#: libpq/hba.c:1878 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "valeur ldapscheme invalide : « %s »" -#: libpq/hba.c:1892 +#: libpq/hba.c:1896 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "numéro de port LDAP invalide : « %s »" -#: libpq/hba.c:1938 libpq/hba.c:1945 +#: libpq/hba.c:1942 libpq/hba.c:1949 msgid "gssapi and sspi" msgstr "gssapi et sspi" -#: libpq/hba.c:1954 libpq/hba.c:1963 +#: libpq/hba.c:1958 libpq/hba.c:1967 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1985 +#: libpq/hba.c:1989 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "n'a pas pu analyser la liste de serveurs RADIUS « %s »" -#: libpq/hba.c:2033 +#: libpq/hba.c:2037 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "n'a pas pu analyser la liste de ports RADIUS « %s »" -#: libpq/hba.c:2047 +#: libpq/hba.c:2051 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "numéro de port RADIUS invalide : « %s »" -#: libpq/hba.c:2069 +#: libpq/hba.c:2073 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "n'a pas pu analyser la liste de secrets RADIUS « %s »" -#: libpq/hba.c:2091 +#: libpq/hba.c:2095 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "n'a pas pu analyser la liste des identifieurs RADIUS « %s »" -#: libpq/hba.c:2105 +#: libpq/hba.c:2109 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "nom d'option de l'authentification inconnu : « %s »" -#: libpq/hba.c:2302 +#: libpq/hba.c:2306 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "le fichier de configuration « %s » ne contient aucun enregistrement" -#: libpq/hba.c:2820 +#: libpq/hba.c:2824 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "expression rationnelle invalide « %s » : %s" -#: libpq/hba.c:2880 +#: libpq/hba.c:2884 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "la correspondance de l'expression rationnelle pour « %s » a échoué : %s" -#: libpq/hba.c:2899 +#: libpq/hba.c:2903 #, c-format msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" msgstr "" "l'expression rationnelle « %s » n'a pas de sous-expressions comme celle\n" "demandée par la référence dans « %s »" -#: libpq/hba.c:2995 +#: libpq/hba.c:2999 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "" "le nom d'utilisateur (%s) et le nom d'utilisateur authentifié (%s) fournis ne\n" "correspondent pas" -#: libpq/hba.c:3015 +#: libpq/hba.c:3019 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "" "pas de correspondance dans la usermap « %s » pour l'utilisateur « %s »\n" "authentifié en tant que « %s »" -#: libpq/hba.c:3048 +#: libpq/hba.c:3052 #, c-format msgid "could not open usermap file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier usermap « %s » : %m" @@ -14547,7 +14532,7 @@ msgstr "n'a pas pu initialiser les droits du fichier « %s » : %m" msgid "could not accept new connection: %m" msgstr "n'a pas pu accepter la nouvelle connexion : %m" -#: libpq/pqcomm.c:766 libpq/pqcomm.c:775 libpq/pqcomm.c:807 libpq/pqcomm.c:817 libpq/pqcomm.c:1630 libpq/pqcomm.c:1675 libpq/pqcomm.c:1715 libpq/pqcomm.c:1759 libpq/pqcomm.c:1798 libpq/pqcomm.c:1837 libpq/pqcomm.c:1873 libpq/pqcomm.c:1912 postmaster/pgstat.c:618 postmaster/pgstat.c:629 +#: libpq/pqcomm.c:766 libpq/pqcomm.c:775 libpq/pqcomm.c:807 libpq/pqcomm.c:817 libpq/pqcomm.c:1642 libpq/pqcomm.c:1687 libpq/pqcomm.c:1727 libpq/pqcomm.c:1771 libpq/pqcomm.c:1810 libpq/pqcomm.c:1849 libpq/pqcomm.c:1885 libpq/pqcomm.c:1924 postmaster/pgstat.c:619 postmaster/pgstat.c:630 #, c-format msgid "%s(%s) failed: %m" msgstr "échec de %s(%s) : %m" @@ -14562,32 +14547,32 @@ msgstr "il n'y a pas de connexion client" msgid "could not receive data from client: %m" msgstr "n'a pas pu recevoir les données du client : %m" -#: libpq/pqcomm.c:1161 tcop/postgres.c:4290 +#: libpq/pqcomm.c:1173 tcop/postgres.c:4292 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "arrêt de la connexion à cause d'une perte de synchronisation du protocole" -#: libpq/pqcomm.c:1227 +#: libpq/pqcomm.c:1239 #, c-format msgid "unexpected EOF within message length word" msgstr "fin de fichier (EOF) inattendue à l'intérieur de la longueur du message" -#: libpq/pqcomm.c:1237 +#: libpq/pqcomm.c:1249 #, c-format msgid "invalid message length" msgstr "longueur du message invalide" -#: libpq/pqcomm.c:1259 libpq/pqcomm.c:1272 +#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 #, c-format msgid "incomplete message from client" msgstr "message incomplet du client" -#: libpq/pqcomm.c:1383 +#: libpq/pqcomm.c:1395 #, c-format msgid "could not send data to client: %m" msgstr "n'a pas pu envoyer les données au client : %m" -#: libpq/pqcomm.c:1598 +#: libpq/pqcomm.c:1610 #, c-format msgid "%s(%s) failed: error code %d" msgstr "échec de %s(%s) : code d'erreur %d" @@ -14595,17 +14580,17 @@ msgstr "échec de %s(%s) : code d'erreur %d" # /* # * Check for old recovery API file: recovery.conf # */ -#: libpq/pqcomm.c:1687 +#: libpq/pqcomm.c:1699 #, c-format msgid "setting the keepalive idle time is not supported" msgstr "configurer le temps d'attente du keepalive n'est pas supporté" -#: libpq/pqcomm.c:1771 libpq/pqcomm.c:1846 libpq/pqcomm.c:1921 +#: libpq/pqcomm.c:1783 libpq/pqcomm.c:1858 libpq/pqcomm.c:1933 #, c-format msgid "%s(%s) not supported" msgstr "%s(%s) non supporté" -#: libpq/pqcomm.c:1956 +#: libpq/pqcomm.c:1968 #, c-format msgid "could not poll socket: %m" msgstr "n'a pas pu interroger la socket : %m" @@ -14615,7 +14600,7 @@ msgstr "n'a pas pu interroger la socket : %m" msgid "no data left in message" msgstr "pas de données dans le message" -#: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 utils/adt/arrayfuncs.c:1481 utils/adt/rowtypes.c:588 +#: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 utils/adt/arrayfuncs.c:1482 utils/adt/rowtypes.c:588 #, c-format msgid "insufficient data left in message" msgstr "données insuffisantes laissées dans le message" @@ -14663,7 +14648,7 @@ msgstr "Options :\n" #: main/main.c:312 #, c-format msgid " -B NBUFFERS number of shared buffers\n" -msgstr " -B NBUFFERS nombre de tampons partagés (shared buffers)\n" +msgstr " -B NBUFFERS nombre de blocs dans le cache disque de PostgreSQL\n" #: main/main.c:313 #, c-format @@ -14673,9 +14658,7 @@ msgstr " -c NOM=VALEUR configure un paramètre d'exécution\n" #: main/main.c:314 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" -msgstr "" -" -C NOM affiche la valeur d'un paramètre en exécution,\n" -" puis quitte\n" +msgstr " -C NOM affiche la valeur d'un paramètre en exécution, puis quitte\n" #: main/main.c:315 #, c-format @@ -14685,7 +14668,7 @@ msgstr " -d 1-5 niveau de débogage\n" #: main/main.c:316 #, c-format msgid " -D DATADIR database directory\n" -msgstr " -D RÉPDONNEES répertoire de la base de données\n" +msgstr " -D RÉP_DONNÉES répertoire de la base de données\n" #: main/main.c:317 #, c-format @@ -14700,7 +14683,7 @@ msgstr " -F désactive fsync\n" #: main/main.c:319 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" -msgstr " -h NOMHÔTE nom d'hôte ou adresse IP à écouter\n" +msgstr " -h HÔTE nom d'hôte ou adresse IP à écouter\n" #: main/main.c:320 #, c-format @@ -14781,9 +14764,7 @@ msgstr "" #: main/main.c:337 #, c-format msgid " -O allow system table structure changes\n" -msgstr "" -" -O autorise les modifications de structure des tables\n" -" système\n" +msgstr " -O autorise les modifications de structure des tables systèmes\n" #: main/main.c:338 #, c-format @@ -14799,8 +14780,8 @@ msgstr " -t pa|pl|ex affiche les horodatages pour chaque requête\n" #, c-format msgid " -T send SIGSTOP to all backend processes if one dies\n" msgstr "" -" -T envoie SIGSTOP à tous les processus serveur si l'un\n" -" d'entre eux meurt\n" +" -T envoie SIGSTOP à tous les processus serveur si l'un d'entre\n" +" eux meurt\n" #: main/main.c:341 #, c-format @@ -14822,13 +14803,13 @@ msgstr "" #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr "" -" --single sélectionne le mode mono-utilisateur (doit être le\n" -" premier argument)\n" +" --single sélectionne le mode mono-utilisateur (doit être le premier\n" +" argument)\n" #: main/main.c:345 #, c-format msgid " DBNAME database name (defaults to user name)\n" -msgstr " NOMBASE nom de la base (par défaut, le même que l'utilisateur)\n" +msgstr " BASE nom de la base (par défaut, le même que l'utilisateur)\n" #: main/main.c:346 #, c-format @@ -14865,14 +14846,14 @@ msgstr "" #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr "" -" --boot sélectionne le mode « bootstrapping » (doit être le\n" -" premier argument)\n" +" --boot sélectionne le mode « bootstrapping » (doit être le premier\n" +" argument)\n" #: main/main.c:353 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr "" -" NOMBASE nom de la base (argument obligatoire dans le mode\n" +" BASE nom de la base (argument obligatoire dans le mode\n" " « bootstrapping »)\n" #: main/main.c:355 @@ -14891,16 +14872,16 @@ msgid "" "Report bugs to <%s>.\n" msgstr "" "\n" -"Merci de lire la documentation pour la liste complète des paramètres\n" -"de configuration et pour savoir comment les configurer sur la\n" -"ligne de commande ou dans le fichier de configuration.\n" +"Merci de lire la documentation pour la liste complète des paramètres de\n" +"configuration et pour savoir comment les configurer sur la ligne de commande\n" +"ou dans le fichier de configuration.\n" "\n" "Rapportez les bogues à <%s>.\n" #: main/main.c:361 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil de %s : <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" #: main/main.c:372 #, c-format @@ -14944,12 +14925,12 @@ msgstr "le type de nœud extensible « %s » existe déjà" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods \"%s\" n'a pas été enregistré" -#: nodes/makefuncs.c:150 +#: nodes/makefuncs.c:150 statistics/extended_stats.c:2293 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "la relation « %s » n'a pas un type composite" -#: nodes/nodeFuncs.c:114 nodes/nodeFuncs.c:145 parser/parse_coerce.c:2472 parser/parse_coerce.c:2584 parser/parse_coerce.c:2630 parser/parse_expr.c:2021 parser/parse_func.c:710 parser/parse_oper.c:883 utils/fmgr/funcapi.c:558 +#: nodes/nodeFuncs.c:114 nodes/nodeFuncs.c:145 parser/parse_coerce.c:2567 parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 parser/parse_expr.c:2026 parser/parse_func.c:710 parser/parse_oper.c:883 utils/fmgr/funcapi.c:558 #, c-format msgid "could not find array type for data type %s" msgstr "n'a pas pu trouver de type tableau pour le type de données %s" @@ -14978,51 +14959,51 @@ msgid "%s cannot be applied to the nullable side of an outer join" msgstr "%s ne peut être appliqué sur le côté possiblement NULL d'une jointure externe" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1315 parser/analyze.c:1677 parser/analyze.c:1921 parser/analyze.c:3099 +#: optimizer/plan/planner.c:1316 parser/analyze.c:1677 parser/analyze.c:1933 parser/analyze.c:3112 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s n'est pas autorisé avec UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:1978 optimizer/plan/planner.c:3634 +#: optimizer/plan/planner.c:1979 optimizer/plan/planner.c:3635 #, c-format msgid "could not implement GROUP BY" msgstr "n'a pas pu implanter GROUP BY" -#: optimizer/plan/planner.c:1979 optimizer/plan/planner.c:3635 optimizer/plan/planner.c:4392 optimizer/prep/prepunion.c:1046 +#: optimizer/plan/planner.c:1980 optimizer/plan/planner.c:3636 optimizer/plan/planner.c:4393 optimizer/prep/prepunion.c:1046 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "" "Certains des types de données supportent seulement le hachage,\n" "alors que les autres supportent seulement le tri." -#: optimizer/plan/planner.c:4391 +#: optimizer/plan/planner.c:4392 #, c-format msgid "could not implement DISTINCT" msgstr "n'a pas pu implanter DISTINCT" -#: optimizer/plan/planner.c:5239 +#: optimizer/plan/planner.c:5240 #, c-format msgid "could not implement window PARTITION BY" msgstr "n'a pas pu implanter PARTITION BY de window" -#: optimizer/plan/planner.c:5240 +#: optimizer/plan/planner.c:5241 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "" "Les colonnes de partitionnement de window doivent être d'un type de données\n" "triables." -#: optimizer/plan/planner.c:5244 +#: optimizer/plan/planner.c:5245 #, c-format msgid "could not implement window ORDER BY" msgstr "n'a pas pu implanter ORDER BY dans le window" -#: optimizer/plan/planner.c:5245 +#: optimizer/plan/planner.c:5246 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Les colonnes de tri de la window doivent être d'un type de données triable." -#: optimizer/plan/setrefs.c:479 +#: optimizer/plan/setrefs.c:516 #, c-format msgid "too many range table entries" msgstr "trop d'enregistrements dans la table range" @@ -15043,7 +15024,7 @@ msgstr "Tous les types de données des colonnes doivent être hachables." msgid "could not implement %s" msgstr "n'a pas pu implanter %s" -#: optimizer/util/clauses.c:4721 +#: optimizer/util/clauses.c:4729 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "fonction SQL « %s » durant « inlining »" @@ -15102,7 +15083,7 @@ msgid "SELECT ... INTO is not allowed here" msgstr "SELECT ... INTO n'est pas autorisé ici" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1580 parser/analyze.c:3278 +#: parser/analyze.c:1580 parser/analyze.c:3306 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s ne peut pas être appliqué à VALUES" @@ -15124,173 +15105,173 @@ msgstr "" msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." msgstr "Ajouter l'expression/fonction à chaque SELECT, ou déplacer l'UNION dans une clause FROM." -#: parser/analyze.c:1911 +#: parser/analyze.c:1923 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTO est autorisé uniquement sur le premier SELECT d'un UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:1983 +#: parser/analyze.c:1995 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "" "L'instruction membre UNION/INTERSECT/EXCEPT ne peut pas faire référence à\n" "d'autres relations que celles de la requête de même niveau" -#: parser/analyze.c:2070 +#: parser/analyze.c:2082 #, c-format msgid "each %s query must have the same number of columns" msgstr "chaque requête %s doit avoir le même nombre de colonnes" -#: parser/analyze.c:2470 +#: parser/analyze.c:2483 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNING doit avoir au moins une colonne" -#: parser/analyze.c:2573 +#: parser/analyze.c:2586 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" msgstr[0] "la source d'affectation a renvoyé %d colonne" msgstr[1] "la source d'affectation a renvoyé %d colonnes" -#: parser/analyze.c:2634 +#: parser/analyze.c:2647 #, c-format msgid "variable \"%s\" is of type %s but expression is of type %s" msgstr "la variable « %s » est de type %s mais l'expression est de type %s" #. translator: %s is a SQL keyword -#: parser/analyze.c:2758 parser/analyze.c:2766 +#: parser/analyze.c:2771 parser/analyze.c:2779 #, c-format msgid "cannot specify both %s and %s" msgstr "ne peut pas spécifier à la fois %s et %s" -#: parser/analyze.c:2786 +#: parser/analyze.c:2799 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR ne doit pas contenir des instructions de modification de données dans WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2794 +#: parser/analyze.c:2807 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s n'est pas supporté" -#: parser/analyze.c:2797 +#: parser/analyze.c:2810 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "Les curseurs détenables doivent être en lecture seule (READ ONLY)." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2805 +#: parser/analyze.c:2818 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %s n'est pas supporté" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2816 +#: parser/analyze.c:2829 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s n'est pas valide" -#: parser/analyze.c:2819 +#: parser/analyze.c:2832 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Les curseurs insensibles doivent être en lecture seule (READ ONLY)." -#: parser/analyze.c:2885 +#: parser/analyze.c:2898 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "les vues matérialisées ne peuvent pas contenir d'instructions de modifications de données avec WITH" -#: parser/analyze.c:2895 +#: parser/analyze.c:2908 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "les vues matérialisées ne doivent pas utiliser de tables temporaires ou de vues" -#: parser/analyze.c:2905 +#: parser/analyze.c:2918 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "les vues matérialisées ne peuvent pas être définies en utilisant des paramètres liés" -#: parser/analyze.c:2917 +#: parser/analyze.c:2930 #, c-format msgid "materialized views cannot be unlogged" msgstr "les vues matérialisées ne peuvent pas être non journalisées (UNLOGGED)" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3106 +#: parser/analyze.c:3119 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "%s n'est pas autorisé avec la clause DISTINCT" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3113 +#: parser/analyze.c:3126 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "%s n'est pas autorisé avec la clause GROUP BY" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3120 +#: parser/analyze.c:3133 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "%s n'est pas autorisé avec la clause HAVING" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3127 +#: parser/analyze.c:3140 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "%s n'est pas autorisé avec les fonctions d'agrégat" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3134 +#: parser/analyze.c:3147 #, c-format msgid "%s is not allowed with window functions" msgstr "%s n'est pas autorisé avec les fonctions de fenêtrage" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3141 +#: parser/analyze.c:3154 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "%s n'est pas autorisé avec les fonctions renvoyant plusieurs lignes dans la liste cible" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3220 +#: parser/analyze.c:3246 #, c-format msgid "%s must specify unqualified relation names" msgstr "%s doit indiquer les noms de relation non qualifiés" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3251 +#: parser/analyze.c:3279 #, c-format msgid "%s cannot be applied to a join" msgstr "%s ne peut pas être appliqué à une jointure" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3260 +#: parser/analyze.c:3288 #, c-format msgid "%s cannot be applied to a function" msgstr "%s ne peut pas être appliqué à une fonction" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3269 +#: parser/analyze.c:3297 #, c-format msgid "%s cannot be applied to a table function" msgstr "%s ne peut pas être appliqué à une fonction de table" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3287 +#: parser/analyze.c:3315 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%s ne peut pas être appliqué à une requête WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3296 +#: parser/analyze.c:3324 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s ne peut pas être appliqué à une tuplestore nommé" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3316 +#: parser/analyze.c:3344 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "relation « %s » dans une clause %s introuvable dans la clause FROM" @@ -15482,133 +15463,133 @@ msgstr "les fonctions d'agrégat ne sont pas autorisées dans %s" msgid "grouping operations are not allowed in %s" msgstr "les fonctions de regroupement ne sont pas autorisés dans %s" -#: parser/parse_agg.c:689 +#: parser/parse_agg.c:682 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" msgstr "un aggrégat de niveau externe ne peut pas contenir de variable de niveau inférieur dans ses arguments directs" -#: parser/parse_agg.c:768 +#: parser/parse_agg.c:761 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "les appels à la fonction d'agrégat ne peuvent pas contenir des appels à des fonctions retournant des ensembles" -#: parser/parse_agg.c:769 parser/parse_expr.c:1673 parser/parse_expr.c:2146 parser/parse_func.c:883 +#: parser/parse_agg.c:762 parser/parse_expr.c:1678 parser/parse_expr.c:2151 parser/parse_func.c:883 #, c-format msgid "You might be able to move the set-returning function into a LATERAL FROM item." msgstr "Vous devriez être capable de déplacer la fonction SETOF dans un élément LATERAL FROM." -#: parser/parse_agg.c:774 +#: parser/parse_agg.c:767 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "les appels à la fonction d'agrégat ne peuvent pas contenir des appels à une fonction de fenêtrage" -#: parser/parse_agg.c:853 +#: parser/parse_agg.c:846 msgid "window functions are not allowed in JOIN conditions" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans les conditions de jointure" -#: parser/parse_agg.c:860 +#: parser/parse_agg.c:853 msgid "window functions are not allowed in functions in FROM" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans les fonctions contenues dans la clause FROM" -#: parser/parse_agg.c:866 +#: parser/parse_agg.c:859 msgid "window functions are not allowed in policy expressions" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans les expressions de politique" -#: parser/parse_agg.c:879 +#: parser/parse_agg.c:872 msgid "window functions are not allowed in window definitions" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans les définitions de fenêtres" -#: parser/parse_agg.c:911 +#: parser/parse_agg.c:904 msgid "window functions are not allowed in check constraints" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans les contraintes CHECK" -#: parser/parse_agg.c:915 +#: parser/parse_agg.c:908 msgid "window functions are not allowed in DEFAULT expressions" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans les expressions par défaut" -#: parser/parse_agg.c:918 +#: parser/parse_agg.c:911 msgid "window functions are not allowed in index expressions" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans les expressions d'index" -#: parser/parse_agg.c:921 +#: parser/parse_agg.c:914 msgid "window functions are not allowed in statistics expressions" msgstr "les fonctions de fenêtrage ne sont pas autorisées dans les expressions statistiques" -#: parser/parse_agg.c:924 +#: parser/parse_agg.c:917 msgid "window functions are not allowed in index predicates" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans les prédicats d'index" -#: parser/parse_agg.c:927 +#: parser/parse_agg.c:920 msgid "window functions are not allowed in transform expressions" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans les expressions de transformation" -#: parser/parse_agg.c:930 +#: parser/parse_agg.c:923 msgid "window functions are not allowed in EXECUTE parameters" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans les paramètres d'EXECUTE" -#: parser/parse_agg.c:933 +#: parser/parse_agg.c:926 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans les conditions WHEN des triggers" -#: parser/parse_agg.c:936 +#: parser/parse_agg.c:929 msgid "window functions are not allowed in partition bound" msgstr "les fonctions de fenêtrage ne sont pas autorisées dans les limites de partition" -#: parser/parse_agg.c:939 +#: parser/parse_agg.c:932 msgid "window functions are not allowed in partition key expressions" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans les expressions de clé de partitionnement" -#: parser/parse_agg.c:942 +#: parser/parse_agg.c:935 msgid "window functions are not allowed in CALL arguments" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans les arguments de CALL" -#: parser/parse_agg.c:945 +#: parser/parse_agg.c:938 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "les fonctions de fenêtrage ne sont pas autorisées dans les conditions WHERE d'un COPY FROM" -#: parser/parse_agg.c:948 +#: parser/parse_agg.c:941 msgid "window functions are not allowed in column generation expressions" msgstr "les fonctions de fenêtrage ne sont pas autorisées dans les expressions de génération de colonne" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:971 parser/parse_clause.c:1855 +#: parser/parse_agg.c:964 parser/parse_clause.c:1855 #, c-format msgid "window functions are not allowed in %s" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans %s" -#: parser/parse_agg.c:1005 parser/parse_clause.c:2689 +#: parser/parse_agg.c:998 parser/parse_clause.c:2689 #, c-format msgid "window \"%s\" does not exist" msgstr "le window « %s » n'existe pas" -#: parser/parse_agg.c:1089 +#: parser/parse_agg.c:1082 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "trop d'ensembles de regroupement présents (4096 maximum)" -#: parser/parse_agg.c:1229 +#: parser/parse_agg.c:1222 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "les fonctions d'agrégat ne sont pas autorisées dans le terme récursif d'une requête récursive" -#: parser/parse_agg.c:1422 +#: parser/parse_agg.c:1415 #, c-format msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" msgstr "la colonne « %s.%s » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat" -#: parser/parse_agg.c:1425 +#: parser/parse_agg.c:1418 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "Les arguments directs d'un agégat par ensemble ordonné doivent seulement utiliser des colonnes groupées." -#: parser/parse_agg.c:1430 +#: parser/parse_agg.c:1423 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "" "la sous-requête utilise une colonne « %s.%s » non groupée dans la requête\n" "externe" -#: parser/parse_agg.c:1594 +#: parser/parse_agg.c:1587 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "les arguments de la clause GROUPING doivent être des expressions de regroupement du niveau associé de la requête" @@ -15903,145 +15884,150 @@ msgstr "RANGE avec offset PRECEDING/FOLLOWING a de multiples interprétations po msgid "Cast the offset value to the exact intended type." msgstr "Transtypez la valeur d'offset vers exactement le type attendu." -#: parser/parse_coerce.c:1034 parser/parse_coerce.c:1072 parser/parse_coerce.c:1090 parser/parse_coerce.c:1105 parser/parse_expr.c:2055 parser/parse_expr.c:2649 parser/parse_target.c:995 +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 parser/parse_expr.c:2060 parser/parse_expr.c:2654 parser/parse_target.c:994 #, c-format msgid "cannot cast type %s to %s" msgstr "ne peut pas convertir le type %s en %s" -#: parser/parse_coerce.c:1075 +#: parser/parse_coerce.c:1091 #, c-format msgid "Input has too few columns." msgstr "L'entrée n'a pas assez de colonnes." -#: parser/parse_coerce.c:1093 +#: parser/parse_coerce.c:1109 #, c-format msgid "Cannot cast type %s to %s in column %d." msgstr "Ne peut pas convertir le type %s en %s dans la colonne %d." -#: parser/parse_coerce.c:1108 +#: parser/parse_coerce.c:1124 #, c-format msgid "Input has too many columns." msgstr "L'entrée a trop de colonnes." #. translator: first %s is name of a SQL construct, eg WHERE #. translator: first %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1163 parser/parse_coerce.c:1211 +#: parser/parse_coerce.c:1179 parser/parse_coerce.c:1227 #, c-format msgid "argument of %s must be type %s, not type %s" msgstr "l'argument de %s doit être de type %s, et non du type %s" #. translator: %s is name of a SQL construct, eg WHERE #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1174 parser/parse_coerce.c:1223 +#: parser/parse_coerce.c:1190 parser/parse_coerce.c:1239 #, c-format msgid "argument of %s must not return a set" msgstr "l'argument de %s ne doit pas renvoyer un ensemble" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1363 +#: parser/parse_coerce.c:1383 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "les %s types %s et %s ne peuvent pas correspondre" -#: parser/parse_coerce.c:1475 +#: parser/parse_coerce.c:1499 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "les types d'argument %s et %s ne se correspondent pas" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1527 +#: parser/parse_coerce.c:1551 #, c-format msgid "%s could not convert type %s to %s" msgstr "%s n'a pas pu convertir le type %s en %s" -#: parser/parse_coerce.c:2089 parser/parse_coerce.c:2109 parser/parse_coerce.c:2129 parser/parse_coerce.c:2149 parser/parse_coerce.c:2204 parser/parse_coerce.c:2237 +#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 #, c-format msgid "arguments declared \"%s\" are not all alike" msgstr "les arguments déclarés « %s » ne sont pas tous identiques" -#: parser/parse_coerce.c:2183 parser/parse_coerce.c:2297 utils/fmgr/funcapi.c:489 +#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 utils/fmgr/funcapi.c:489 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "l'argument déclaré %s n'est pas un tableau mais est du type %s" -#: parser/parse_coerce.c:2216 parser/parse_coerce.c:2329 utils/fmgr/funcapi.c:503 +#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 utils/fmgr/funcapi.c:503 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "l'argument déclaré %s n'est pas un type d'intervalle mais est du type %s" -#: parser/parse_coerce.c:2250 parser/parse_coerce.c:2363 utils/fmgr/funcapi.c:521 utils/fmgr/funcapi.c:586 +#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:521 utils/fmgr/funcapi.c:586 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "l'argument déclaré %s n'est pas un type multirange mais est du type %s" -#: parser/parse_coerce.c:2288 +#: parser/parse_coerce.c:2353 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "ne peut pas déterminer le type d'élément d'un argument « anyarray »" -#: parser/parse_coerce.c:2314 parser/parse_coerce.c:2346 parser/parse_coerce.c:2380 parser/parse_coerce.c:2400 +#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "l'argument déclaré %s n'est pas cohérent avec l'argument déclaré %s" -#: parser/parse_coerce.c:2427 +#: parser/parse_coerce.c:2474 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "" "n'a pas pu déterminer le type polymorphique car l'entrée dispose\n" "du type %s" -#: parser/parse_coerce.c:2441 +#: parser/parse_coerce.c:2488 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "le type déclaré anynonarray est un type tableau : %s" -#: parser/parse_coerce.c:2451 +#: parser/parse_coerce.c:2498 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "le type déclaré anyenum n'est pas un type enum : %s" -#: parser/parse_coerce.c:2482 parser/parse_coerce.c:2532 parser/parse_coerce.c:2596 parser/parse_coerce.c:2643 +#: parser/parse_coerce.c:2559 +#, c-format +msgid "arguments of anycompatible family cannot be cast to a common type" +msgstr "les arguments d'une famille anycompatible ne peuvent pas être convertis vers un type commun" + +#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "n'a pas pu déterminer le type polymorphique %s car l'entrée dispose du type %s" -#: parser/parse_coerce.c:2492 +#: parser/parse_coerce.c:2587 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "le type anycompatiblerange %s ne correspond pas au type anycompatible %s." -#: parser/parse_coerce.c:2506 +#: parser/parse_coerce.c:2608 #, c-format -msgid "type matched to anycompatiblenonarray is an array type: %s" -msgstr "le type correspondant à anycompatiblenonarray est un type tableau : %s" +msgid "anycompatiblemultirange type %s does not match anycompatible type %s" +msgstr "le type anycompatiblemultirange %s ne correspond pas au type anycompatible %s." -#: parser/parse_coerce.c:2607 parser/parse_coerce.c:2658 utils/fmgr/funcapi.c:614 +#: parser/parse_coerce.c:2622 #, c-format -msgid "could not find multirange type for data type %s" -msgstr "n'a pas pu trouver le type multirange pour le type de données %s" +msgid "type matched to anycompatiblenonarray is an array type: %s" +msgstr "le type correspondant à anycompatiblenonarray est un type tableau : %s" -#: parser/parse_coerce.c:2739 +#: parser/parse_coerce.c:2857 #, c-format msgid "A result of type %s requires at least one input of type anyrange or anymultirange." msgstr "Un résultat de type %s nécessite au moins une entrée de type anyrange ou anymultirange." -#: parser/parse_coerce.c:2756 +#: parser/parse_coerce.c:2874 #, c-format msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." msgstr "Un résultat de type %s requiert au moins une entrée de type anycompatiblerange ou anycompatiblemultirange." -#: parser/parse_coerce.c:2768 +#: parser/parse_coerce.c:2886 #, c-format msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." msgstr "Un résultat de type %s requiert au moins une entrée de type anyelement, anyarray, anynonarray, anyenum, anyrange ou anymultirange." -#: parser/parse_coerce.c:2780 +#: parser/parse_coerce.c:2898 #, c-format -msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, or anycompatiblerange." -msgstr "Un résultat de type %s requiert au moins une entrée de type anycompatible, anycompatiblearray, anycompatiblenonarray ou anycompatiblerange." +msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." +msgstr "Un résultat de type %s requiert au moins une entrée de type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange ou anycompatiblemultirange." -#: parser/parse_coerce.c:2810 +#: parser/parse_coerce.c:2928 msgid "A result of type internal requires at least one input of type internal." msgstr "Un résultat de type internal nécessite au moins une entrée de type internal." @@ -16115,7 +16101,7 @@ msgstr "" #: parser/parse_cte.c:323 #, c-format msgid "Cast the output of the non-recursive term to the correct type." -msgstr "Convertit la sortie du terme non récursif dans le bon type." +msgstr "Convertissez la sortie du terme non récursif dans le bon type." #: parser/parse_cte.c:328 #, c-format @@ -16145,7 +16131,7 @@ msgstr "avec une clause SEARCH ou CYCLE, le côté droit de l'UNION doit être u #: parser/parse_cte.c:401 #, c-format msgid "search column \"%s\" not in WITH query column list" -msgstr "colonne de recherche « %s » non présent dans la liste des colonnes de la requête WITH" +msgstr "colonne de recherche « %s » non présente dans la liste des colonnes de la requête WITH" #: parser/parse_cte.c:408 #, c-format @@ -16269,10 +16255,10 @@ msgstr "n'a pas pu identifier la colonne « %s » dans le type de données de l' msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "notation d'attribut .%s appliqué au type %s, qui n'est pas un type composé" -#: parser/parse_expr.c:395 parser/parse_target.c:740 +#: parser/parse_expr.c:395 parser/parse_target.c:739 #, c-format msgid "row expansion via \"*\" is not supported here" -msgstr "l'expansion de ligne via « * » n'est pas supporté ici" +msgstr "l'expansion de ligne via « * » n'est pas supportée ici" #: parser/parse_expr.c:516 msgid "cannot use column reference in DEFAULT expression" @@ -16282,188 +16268,188 @@ msgstr "ne peut pas utiliser une référence de colonne dans l'expression par d msgid "cannot use column reference in partition bound expression" msgstr "ne peut pas utiliser une référence de colonne dans une expression de limite de partition" -#: parser/parse_expr.c:788 parser/parse_relation.c:807 parser/parse_relation.c:889 parser/parse_target.c:1235 +#: parser/parse_expr.c:788 parser/parse_relation.c:807 parser/parse_relation.c:889 parser/parse_target.c:1234 #, c-format msgid "column reference \"%s\" is ambiguous" -msgstr "la référence à la colonne « %s » est ambigu" +msgstr "la référence à la colonne « %s » est ambigüe" #: parser/parse_expr.c:844 parser/parse_param.c:110 parser/parse_param.c:142 parser/parse_param.c:208 parser/parse_param.c:307 #, c-format msgid "there is no parameter $%d" -msgstr "Il n'y a pas de paramètre $%d" +msgstr "il n'y a pas de paramètre $%d" #: parser/parse_expr.c:1044 #, c-format msgid "NULLIF requires = operator to yield boolean" -msgstr "NULLIF requiert l'opérateur = pour comparer des booleéns" +msgstr "NULLIF requiert que l'opérateur = retourne une valeur de type booléen" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1050 parser/parse_expr.c:2965 +#: parser/parse_expr.c:1050 parser/parse_expr.c:2970 #, c-format msgid "%s must not return a set" msgstr "%s ne doit pas renvoyer un ensemble" -#: parser/parse_expr.c:1430 parser/parse_expr.c:1462 +#: parser/parse_expr.c:1435 parser/parse_expr.c:1467 #, c-format msgid "number of columns does not match number of values" msgstr "le nombre de colonnes ne correspond pas au nombre de valeurs" -#: parser/parse_expr.c:1476 +#: parser/parse_expr.c:1481 #, c-format msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" msgstr "la source d'un élément UPDATE multi-colonnes doit être un sous-SELECT ou une expression ROW()" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1671 parser/parse_expr.c:2144 parser/parse_func.c:2676 +#: parser/parse_expr.c:1676 parser/parse_expr.c:2149 parser/parse_func.c:2676 #, c-format msgid "set-returning functions are not allowed in %s" -msgstr "les fonctions renvoyant un ensemble ne sont pas autorisés dans %s" +msgstr "les fonctions renvoyant un ensemble ne sont pas autorisées dans %s" -#: parser/parse_expr.c:1733 +#: parser/parse_expr.c:1738 msgid "cannot use subquery in check constraint" msgstr "ne peut pas utiliser une sous-requête dans la contrainte de vérification" -#: parser/parse_expr.c:1737 +#: parser/parse_expr.c:1742 msgid "cannot use subquery in DEFAULT expression" msgstr "ne peut pas utiliser de sous-requête dans une expression DEFAULT" -#: parser/parse_expr.c:1740 +#: parser/parse_expr.c:1745 msgid "cannot use subquery in index expression" msgstr "ne peut pas utiliser la sous-requête dans l'expression de l'index" -#: parser/parse_expr.c:1743 +#: parser/parse_expr.c:1748 msgid "cannot use subquery in index predicate" msgstr "ne peut pas utiliser une sous-requête dans un prédicat d'index" -#: parser/parse_expr.c:1746 +#: parser/parse_expr.c:1751 msgid "cannot use subquery in statistics expression" msgstr "ne peut pas utiliser une sous-requête dans l'expression des statistiques" -#: parser/parse_expr.c:1749 +#: parser/parse_expr.c:1754 msgid "cannot use subquery in transform expression" msgstr "ne peut pas utiliser une sous-requête dans l'expression de transformation" -#: parser/parse_expr.c:1752 +#: parser/parse_expr.c:1757 msgid "cannot use subquery in EXECUTE parameter" msgstr "ne peut pas utiliser les sous-requêtes dans le paramètre EXECUTE" -#: parser/parse_expr.c:1755 +#: parser/parse_expr.c:1760 msgid "cannot use subquery in trigger WHEN condition" msgstr "ne peut pas utiliser une sous-requête dans la condition WHEN d'un trigger" -#: parser/parse_expr.c:1758 +#: parser/parse_expr.c:1763 msgid "cannot use subquery in partition bound" msgstr "ne peut pas utiliser de sous-requête dans une limite de partition" -#: parser/parse_expr.c:1761 +#: parser/parse_expr.c:1766 msgid "cannot use subquery in partition key expression" msgstr "ne peut pas utiliser de sous-requête dans l'expression de clé de partitionnement" -#: parser/parse_expr.c:1764 +#: parser/parse_expr.c:1769 msgid "cannot use subquery in CALL argument" msgstr "ne peut pas utiliser de sous-requête dans l'argument CALL" -#: parser/parse_expr.c:1767 +#: parser/parse_expr.c:1772 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "ne peut pas utiliser une sous-requête dans la condition WHERE d'un COPY FROM" -#: parser/parse_expr.c:1770 +#: parser/parse_expr.c:1775 msgid "cannot use subquery in column generation expression" msgstr "ne peut pas utiliser une sous-requête dans l'expression de génération d'une colonne" -#: parser/parse_expr.c:1823 +#: parser/parse_expr.c:1828 #, c-format msgid "subquery must return only one column" msgstr "la sous-requête doit renvoyer une seule colonne" -#: parser/parse_expr.c:1894 +#: parser/parse_expr.c:1899 #, c-format msgid "subquery has too many columns" msgstr "la sous-requête a trop de colonnes" -#: parser/parse_expr.c:1899 +#: parser/parse_expr.c:1904 #, c-format msgid "subquery has too few columns" msgstr "la sous-requête n'a pas assez de colonnes" -#: parser/parse_expr.c:1995 +#: parser/parse_expr.c:2000 #, c-format msgid "cannot determine type of empty array" msgstr "ne peut pas déterminer le type d'un tableau vide" -#: parser/parse_expr.c:1996 +#: parser/parse_expr.c:2001 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "Convertit explicitement vers le type désiré, par exemple ARRAY[]::integer[]." -#: parser/parse_expr.c:2010 +#: parser/parse_expr.c:2015 #, c-format msgid "could not find element type for data type %s" msgstr "n'a pas pu trouver le type d'élément pour le type de données %s" -#: parser/parse_expr.c:2290 +#: parser/parse_expr.c:2295 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "la valeur d'un attribut XML sans nom doit être une référence de colonne" -#: parser/parse_expr.c:2291 +#: parser/parse_expr.c:2296 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "la valeur d'un élément XML sans nom doit être une référence de colonne" -#: parser/parse_expr.c:2306 +#: parser/parse_expr.c:2311 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "le nom de l'attribut XML « %s » apparaît plus d'une fois" -#: parser/parse_expr.c:2413 +#: parser/parse_expr.c:2418 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "ne peut pas convertir le résultat XMLSERIALIZE en %s" -#: parser/parse_expr.c:2722 parser/parse_expr.c:2918 +#: parser/parse_expr.c:2727 parser/parse_expr.c:2923 #, c-format msgid "unequal number of entries in row expressions" msgstr "nombre différent d'entrées dans les expressions de ligne" -#: parser/parse_expr.c:2732 +#: parser/parse_expr.c:2737 #, c-format msgid "cannot compare rows of zero length" msgstr "n'a pas pu comparer des lignes de taille zéro" -#: parser/parse_expr.c:2757 +#: parser/parse_expr.c:2762 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "" "l'opérateur de comparaison de ligne doit renvoyer le type booléen, et non le\n" "type %s" -#: parser/parse_expr.c:2764 +#: parser/parse_expr.c:2769 #, c-format msgid "row comparison operator must not return a set" msgstr "l'opérateur de comparaison de ligne ne doit pas renvoyer un ensemble" -#: parser/parse_expr.c:2823 parser/parse_expr.c:2864 +#: parser/parse_expr.c:2828 parser/parse_expr.c:2869 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "n'a pas pu déterminer l'interprétation de l'opérateur de comparaison de ligne %s" -#: parser/parse_expr.c:2825 +#: parser/parse_expr.c:2830 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "" "Les opérateurs de comparaison de lignes doivent être associés à des familles\n" "d'opérateurs btree." -#: parser/parse_expr.c:2866 +#: parser/parse_expr.c:2871 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Il existe de nombreus candidats également plausibles." -#: parser/parse_expr.c:2959 +#: parser/parse_expr.c:2964 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" -msgstr "IS DISTINCT FROM requiert l'opérateur = pour comparer des booléens" +msgstr "IS DISTINCT FROM requiert que l'opérateur = retourne une valeur de type booléen" #: parser/parse_func.c:194 #, c-format @@ -16727,7 +16713,7 @@ msgstr "le nom de la procédure « %s » n'est pas unique" #: parser/parse_func.c:2470 #, c-format msgid "Specify the argument list to select the procedure unambiguously." -msgstr "Définit la liste d'arguments pour sélectionner la procédure sans ambiguïté." +msgstr "Indiquez la liste d'arguments pour sélectionner la procédure sans ambiguïté." #: parser/parse_func.c:2475 #, c-format @@ -16737,7 +16723,7 @@ msgstr "le nom d'agrégat « %s » n'est pas unique" #: parser/parse_func.c:2478 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." -msgstr "Définit la liste d'arguments pour sélectionner l'agrégat sans ambiguïté." +msgstr "Indiquez la liste d'arguments pour sélectionner l'agrégat sans ambiguïté." #: parser/parse_func.c:2483 #, c-format @@ -16747,7 +16733,7 @@ msgstr "le nom de la routine « %s » n'est pas unique" #: parser/parse_func.c:2486 #, c-format msgid "Specify the argument list to select the routine unambiguously." -msgstr "Définit la liste d'arguments pour sélectionner la routine sans ambiguïté." +msgstr "Indiquez la liste d'arguments pour sélectionner la routine sans ambiguïté." #: parser/parse_func.c:2541 msgid "set-returning functions are not allowed in JOIN conditions" @@ -16892,12 +16878,12 @@ msgstr "types incohérents déduit pour le paramètre $%d" #: parser/parse_relation.c:201 #, c-format msgid "table reference \"%s\" is ambiguous" -msgstr "la référence à la table « %s » est ambigu" +msgstr "la référence à la table « %s » est ambigüe" #: parser/parse_relation.c:245 #, c-format msgid "table reference %u is ambiguous" -msgstr "la référence à la table %u est ambigu" +msgstr "la référence à la table %u est ambigüe" #: parser/parse_relation.c:445 #, c-format @@ -17020,51 +17006,51 @@ msgstr "Il existe une colonne nommée « %s » pour la table « %s » mais elle msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "Peut-être que vous souhaitiez référencer la colonne « %s.%s » ou la colonne « %s.%s »." -#: parser/parse_target.c:483 parser/parse_target.c:804 +#: parser/parse_target.c:482 parser/parse_target.c:803 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "ne peut pas affecter à une colonne système « %s »" -#: parser/parse_target.c:511 +#: parser/parse_target.c:510 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "ne peut pas initialiser un élément d'un tableau avec DEFAULT" -#: parser/parse_target.c:516 +#: parser/parse_target.c:515 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "ne peut pas initialiser un sous-champ avec DEFAULT" -#: parser/parse_target.c:590 +#: parser/parse_target.c:589 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "la colonne « %s » est de type %s mais l'expression est de type %s" -#: parser/parse_target.c:788 +#: parser/parse_target.c:787 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" msgstr "" "ne peut pas l'affecter au champ « %s » de la colonne « %s » parce que son\n" "type %s n'est pas un type composé" -#: parser/parse_target.c:797 +#: parser/parse_target.c:796 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" msgstr "" "ne peut pas l'affecter au champ « %s » de la colonne « %s » parce qu'il n'existe\n" "pas une telle colonne dans le type de données %s" -#: parser/parse_target.c:878 +#: parser/parse_target.c:877 #, c-format msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" -msgstr "" +msgstr "l'affectation indicée à « %s » nécessite le type %s mais son expression est de type %s" -#: parser/parse_target.c:888 +#: parser/parse_target.c:887 #, c-format msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "le sous-champ « %s » est de type %s mais l'expression est de type %s" -#: parser/parse_target.c:1323 +#: parser/parse_target.c:1322 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "Un SELECT * sans table spécifiée n'est pas valide" @@ -17087,7 +17073,7 @@ msgstr "référence de type %s convertie en %s" #: parser/parse_type.c:278 parser/parse_type.c:803 utils/cache/typcache.c:389 utils/cache/typcache.c:444 #, c-format msgid "type \"%s\" is only a shell" -msgstr "le type « %s » est seulement un shell" +msgstr "le type « %s » n'est qu'une coquille" #: parser/parse_type.c:363 #, c-format @@ -17268,8 +17254,8 @@ msgstr "les expressions et prédicats d'index peuvent seulement faire référenc #: parser/parse_utilcmd.c:2952 #, c-format -msgid "statistics expressions can refer only to the table being indexed" -msgstr "les expressions statistiques peuvent seulement faire référence à la table en cours d'indexage" +msgid "statistics expressions can refer only to the table being referenced" +msgstr "les expressions statistiques peuvent seulement faire référence à la table référencée" #: parser/parse_utilcmd.c:2995 #, c-format @@ -17368,7 +17354,7 @@ msgstr "« %s » n'est pas une table partitionnée" #: parser/parse_utilcmd.c:3969 #, c-format msgid "table \"%s\" is not partitioned" -msgstr "la table « %s » n'est pas partitionné" +msgstr "la table « %s » n'est pas partitionnée" #: parser/parse_utilcmd.c:3976 #, c-format @@ -17378,22 +17364,22 @@ msgstr "l'index « %s » n'est pas partitionné" #: parser/parse_utilcmd.c:4016 #, c-format msgid "a hash-partitioned table may not have a default partition" -msgstr "une table partitionnées par hash ne peut pas avoir de partition par défaut" +msgstr "une table partitionnée par hachage ne peut pas avoir de partition par défaut" #: parser/parse_utilcmd.c:4033 #, c-format msgid "invalid bound specification for a hash partition" -msgstr "spécification de limite invalide pour une partition par hash" +msgstr "spécification de limite invalide pour une partition par hachage" -#: parser/parse_utilcmd.c:4039 partitioning/partbounds.c:4701 +#: parser/parse_utilcmd.c:4039 partitioning/partbounds.c:4711 #, c-format -msgid "modulus for hash partition must be a positive integer" -msgstr "le modulus pour une partition par hash doit être un entier positif" +msgid "modulus for hash partition must be an integer value greater than zero" +msgstr "le modulo pour une partition par hachage doit être un entier dont la valeur est supérieure à zéro" -#: parser/parse_utilcmd.c:4046 partitioning/partbounds.c:4709 +#: parser/parse_utilcmd.c:4046 partitioning/partbounds.c:4719 #, c-format msgid "remainder for hash partition must be less than modulus" -msgstr "le modulus pour une partition par hash doit être inférieur au modulus" +msgstr "le reste pour une partition par hachage doit être inférieur au modulo" #: parser/parse_utilcmd.c:4059 #, c-format @@ -17448,7 +17434,7 @@ msgstr "chaîne d'échappement Unicode invalide" msgid "invalid Unicode escape value" msgstr "valeur d'échappement Unicode invalide" -#: parser/parser.c:468 scan.l:677 utils/adt/varlena.c:6566 +#: parser/parser.c:468 scan.l:677 utils/adt/varlena.c:6559 #, c-format msgid "invalid Unicode escape" msgstr "échappement Unicode invalide" @@ -17458,7 +17444,7 @@ msgstr "échappement Unicode invalide" msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Les échappements Unicode doivent être de la forme \\XXXX ou \\+XXXXXX." -#: parser/parser.c:497 scan.l:638 scan.l:654 scan.l:670 utils/adt/varlena.c:6591 +#: parser/parser.c:497 scan.l:638 scan.l:654 scan.l:670 utils/adt/varlena.c:6584 #, c-format msgid "invalid Unicode surrogate pair" msgstr "paire surrogate Unicode invalide" @@ -17473,82 +17459,82 @@ msgstr "l'identifiant « %s » sera tronqué en « %.*s »" msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "la partition « %s » est en conflit avec la partition par défaut existante « %s »" -#: partitioning/partbounds.c:2870 partitioning/partbounds.c:2888 partitioning/partbounds.c:2904 +#: partitioning/partbounds.c:2873 partitioning/partbounds.c:2892 partitioning/partbounds.c:2914 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "chaque modulo de partition hash doit être un facteur du prochain plus gros modulo" -#: partitioning/partbounds.c:2871 partitioning/partbounds.c:2905 +#: partitioning/partbounds.c:2874 partitioning/partbounds.c:2915 #, c-format msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." -msgstr "" +msgstr "Le nouveau modulo %d n'est pas un facteur de %d, le modulo de la partition existante « %s »." -#: partitioning/partbounds.c:2889 +#: partitioning/partbounds.c:2893 #, c-format msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." -msgstr "" +msgstr "Le nouveau modulo %d n'est pas divisible par %d, le modulo de la partition existante « %s »." -#: partitioning/partbounds.c:3018 +#: partitioning/partbounds.c:3028 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "limite d'intervalle vide indiquée pour la partition « %s »" -#: partitioning/partbounds.c:3020 +#: partitioning/partbounds.c:3030 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "La limite inférieure spécifiée %s est supérieure ou égale à la limite supérieure %s." -#: partitioning/partbounds.c:3132 +#: partitioning/partbounds.c:3142 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "la partition « %s » surchargerait la partition « %s »" -#: partitioning/partbounds.c:3249 +#: partitioning/partbounds.c:3259 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "parcours ignoré pour la table distante « %s » qui n'est pas une partition ou partition par défaut « %s »" -#: partitioning/partbounds.c:4705 +#: partitioning/partbounds.c:4715 #, c-format -msgid "remainder for hash partition must be a non-negative integer" -msgstr "le reste pour une partition hash doit être un entier non négatif" +msgid "remainder for hash partition must be an integer value greater than or equal to zero" +msgstr "le reste pour une partition hash doit être un entier dont la valeur est égale ou supérieure à 0" -#: partitioning/partbounds.c:4729 +#: partitioning/partbounds.c:4739 #, c-format msgid "\"%s\" is not a hash partitioned table" -msgstr "« %s » n'est pas une table partitionnée par hash" +msgstr "« %s » n'est pas une table partitionnée par hachage" -#: partitioning/partbounds.c:4740 partitioning/partbounds.c:4857 +#: partitioning/partbounds.c:4750 partitioning/partbounds.c:4867 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "le nombre de colonnes de partitionnement (%d) ne correspond pas au nombre de clés de partitionnement fourni (%d)" -#: partitioning/partbounds.c:4762 +#: partitioning/partbounds.c:4772 #, c-format msgid "column %d of the partition key has type %s, but supplied value is of type %s" msgstr "la colonne %d de la clé de partitionnement a pour type %s, mais la valeur fournie est de type %s" -#: partitioning/partbounds.c:4794 +#: partitioning/partbounds.c:4804 #, c-format msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" msgstr "la colonne %d de la clé de partitionnement a pour type « %s », mais la valeur fournie a pour type « %s »" -#: port/pg_sema.c:209 port/pg_shmem.c:668 port/posix_sema.c:209 port/sysv_sema.c:327 port/sysv_shmem.c:668 +#: port/pg_sema.c:209 port/pg_shmem.c:678 port/posix_sema.c:209 port/sysv_sema.c:327 port/sysv_shmem.c:678 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "n'a pas pu lire les informations sur le répertoire des données « %s » : %m" -#: port/pg_shmem.c:217 port/sysv_shmem.c:217 +#: port/pg_shmem.c:227 port/sysv_shmem.c:227 #, c-format msgid "could not create shared memory segment: %m" msgstr "n'a pas pu créer le segment de mémoire partagée : %m" -#: port/pg_shmem.c:218 port/sysv_shmem.c:218 +#: port/pg_shmem.c:228 port/sysv_shmem.c:228 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "L'appel système qui a échoué était shmget(clé=%lu, taille=%zu, 0%o)." -#: port/pg_shmem.c:222 port/sysv_shmem.c:222 +#: port/pg_shmem.c:232 port/sysv_shmem.c:232 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" @@ -17557,7 +17543,7 @@ msgstr "" "Cette erreur signifie habituellement que la demande de PostgreSQL pour un segment de mémoire partagée dépasse la valeur du paramètre SHMMAX du noyau, ou est plus petite\n" "que votre paramètre SHMMIN du noyau. La documentation PostgreSQL contient plus d'information sur la configuration de la mémoire partagée." -#: port/pg_shmem.c:229 port/sysv_shmem.c:229 +#: port/pg_shmem.c:239 port/sysv_shmem.c:239 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" @@ -17566,7 +17552,7 @@ msgstr "" "Cette erreur signifie habituellement que la demande de PostgreSQL pour un segment de mémoire partagée dépasse le paramètre SHMALL du noyau. Vous pourriez avoir besoin de reconfigurer\n" "le noyau avec un SHMALL plus important. La documentation PostgreSQL contient plus d'information sur la configuration de la mémoire partagée." -#: port/pg_shmem.c:235 port/sysv_shmem.c:235 +#: port/pg_shmem.c:245 port/sysv_shmem.c:245 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" @@ -17575,12 +17561,12 @@ msgstr "" "Cette erreur ne signifie *pas* que vous manquez d'espace disque. Elle survient si tous les identifiants de mémoire partagé disponibles ont été pris, auquel cas vous devez augmenter le paramètre SHMMNI de votre noyau, ou parce que la limite maximum de la mémoire partagée\n" "de votre système a été atteinte. La documentation de PostgreSQL contient plus d'informations sur la configuration de la mémoire partagée." -#: port/pg_shmem.c:606 port/sysv_shmem.c:606 +#: port/pg_shmem.c:616 port/sysv_shmem.c:616 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "n'a pas pu créer le segment de mémoire partagée anonyme : %m" -#: port/pg_shmem.c:608 port/sysv_shmem.c:608 +#: port/pg_shmem.c:618 port/sysv_shmem.c:618 #, c-format msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections." msgstr "" @@ -17591,22 +17577,27 @@ msgstr "" "valeur du paramètre shared_buffers de PostgreSQL ou le paramètre\n" "max_connections." -#: port/pg_shmem.c:676 port/sysv_shmem.c:676 +#: port/pg_shmem.c:686 port/sysv_shmem.c:686 #, c-format msgid "huge pages not supported on this platform" msgstr "Huge Pages non supportées sur cette plateforme" -#: port/pg_shmem.c:737 port/sysv_shmem.c:737 utils/init/miscinit.c:1167 +#: port/pg_shmem.c:693 port/sysv_shmem.c:693 +#, c-format +msgid "huge pages not supported with the current shared_memory_type setting" +msgstr "huge pages non supportées avec la configuration actuelle de shared_memory_type" + +#: port/pg_shmem.c:753 port/sysv_shmem.c:753 utils/init/miscinit.c:1167 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "" "le bloc de mémoire partagé pré-existant (clé %lu, ID %lu) est en cours\n" "d'utilisation" -#: port/pg_shmem.c:740 port/sysv_shmem.c:740 utils/init/miscinit.c:1169 +#: port/pg_shmem.c:756 port/sysv_shmem.c:756 utils/init/miscinit.c:1169 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." -msgstr "Termine les anciens processus serveurs associés avec le répertoire de données « %s »." +msgstr "Terminez les anciens processus serveurs associés avec le répertoire de données « %s »." #: port/sysv_sema.c:124 #, c-format @@ -17761,42 +17752,42 @@ msgstr "L'appel système qui a échoué était DuplicateHandle." msgid "Failed system call was MapViewOfFileEx." msgstr "L'appel système qui a échoué était MapViewOfFileEx." -#: postmaster/autovacuum.c:411 +#: postmaster/autovacuum.c:410 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "n'a pas pu exécuter le processus autovacuum maître : %m" -#: postmaster/autovacuum.c:1489 +#: postmaster/autovacuum.c:1492 #, c-format msgid "could not fork autovacuum worker process: %m" msgstr "n'a pas pu exécuter le processus autovacuum worker : %m" -#: postmaster/autovacuum.c:2326 +#: postmaster/autovacuum.c:2283 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "autovacuum : suppression de la table temporaire orpheline « %s.%s.%s »" -#: postmaster/autovacuum.c:2555 +#: postmaster/autovacuum.c:2512 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "VACUUM automatique de la table « %s.%s.%s »" -#: postmaster/autovacuum.c:2558 +#: postmaster/autovacuum.c:2515 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "ANALYZE automatique de la table « %s.%s.%s »" -#: postmaster/autovacuum.c:2751 +#: postmaster/autovacuum.c:2708 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "traitement de l'enregistrement de travail pour la relation « %s.%s.%s »" -#: postmaster/autovacuum.c:3438 +#: postmaster/autovacuum.c:3394 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "autovacuum non démarré à cause d'une mauvaise configuration" -#: postmaster/autovacuum.c:3439 +#: postmaster/autovacuum.c:3395 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Activez l'option « track_counts »." @@ -17804,7 +17795,7 @@ msgstr "Activez l'option « track_counts »." #: postmaster/bgworker.c:256 #, c-format msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" -msgstr "" +msgstr "état du background worker incohérent (max_worker_processes=%d, slots total =%d)" #: postmaster/bgworker.c:661 #, c-format @@ -17921,7 +17912,7 @@ msgstr "La commande d'archivage qui a échoué était : %s" msgid "archive command was terminated by exception 0x%X" msgstr "la commande d'archivage a été terminée par l'exception 0x%X" -#: postmaster/pgarch.c:545 postmaster/postmaster.c:3724 +#: postmaster/pgarch.c:545 postmaster/postmaster.c:3748 #, c-format msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." msgstr "" @@ -17938,155 +17929,155 @@ msgstr "la commande d'archivage a été terminée par le signal %d : %s" msgid "archive command exited with unrecognized status %d" msgstr "la commande d'archivage a quitté avec le statut non reconnu %d" -#: postmaster/pgstat.c:417 +#: postmaster/pgstat.c:418 #, c-format msgid "could not resolve \"localhost\": %s" msgstr "n'a pas pu résoudre « localhost » : %s" -#: postmaster/pgstat.c:440 +#: postmaster/pgstat.c:441 #, c-format msgid "trying another address for the statistics collector" msgstr "nouvelle tentative avec une autre adresse pour le récupérateur de statistiques" -#: postmaster/pgstat.c:449 +#: postmaster/pgstat.c:450 #, c-format msgid "could not create socket for statistics collector: %m" msgstr "n'a pas pu créer la socket pour le récupérateur de statistiques : %m" -#: postmaster/pgstat.c:461 +#: postmaster/pgstat.c:462 #, c-format msgid "could not bind socket for statistics collector: %m" msgstr "n'a pas pu lier la socket au récupérateur de statistiques : %m" -#: postmaster/pgstat.c:472 +#: postmaster/pgstat.c:473 #, c-format msgid "could not get address of socket for statistics collector: %m" msgstr "n'a pas pu obtenir l'adresse de la socket du récupérateur de statistiques : %m" -#: postmaster/pgstat.c:488 +#: postmaster/pgstat.c:489 #, c-format msgid "could not connect socket for statistics collector: %m" msgstr "n'a pas pu connecter la socket au récupérateur de statistiques : %m" -#: postmaster/pgstat.c:509 +#: postmaster/pgstat.c:510 #, c-format msgid "could not send test message on socket for statistics collector: %m" msgstr "" "n'a pas pu envoyer le message de tests sur la socket du récupérateur de\n" "statistiques : %m" -#: postmaster/pgstat.c:535 +#: postmaster/pgstat.c:536 #, c-format msgid "select() failed in statistics collector: %m" msgstr "échec du select() dans le récupérateur de statistiques : %m" -#: postmaster/pgstat.c:550 +#: postmaster/pgstat.c:551 #, c-format msgid "test message did not get through on socket for statistics collector" msgstr "" "le message de test n'a pas pu arriver sur la socket du récupérateur de\n" "statistiques : %m" -#: postmaster/pgstat.c:565 +#: postmaster/pgstat.c:566 #, c-format msgid "could not receive test message on socket for statistics collector: %m" msgstr "" "n'a pas pu recevoir le message de tests sur la socket du récupérateur de\n" "statistiques : %m" -#: postmaster/pgstat.c:575 +#: postmaster/pgstat.c:576 #, c-format msgid "incorrect test message transmission on socket for statistics collector" msgstr "" "transmission incorrecte du message de tests sur la socket du récupérateur de\n" "statistiques" -#: postmaster/pgstat.c:598 +#: postmaster/pgstat.c:599 #, c-format msgid "could not set statistics collector socket to nonblocking mode: %m" msgstr "" "n'a pas pu initialiser la socket du récupérateur de statistiques dans le mode\n" "non bloquant : %m" -#: postmaster/pgstat.c:642 +#: postmaster/pgstat.c:643 #, c-format msgid "disabling statistics collector for lack of working socket" msgstr "" "désactivation du récupérateur de statistiques à cause du manque de socket\n" "fonctionnel" -#: postmaster/pgstat.c:789 +#: postmaster/pgstat.c:790 #, c-format msgid "could not fork statistics collector: %m" msgstr "" "n'a pas pu lancer le processus fils correspondant au récupérateur de\n" "statistiques : %m" -#: postmaster/pgstat.c:1459 +#: postmaster/pgstat.c:1444 #, c-format msgid "unrecognized reset target: \"%s\"" msgstr "cible reset non reconnu : « %s »" -#: postmaster/pgstat.c:1460 +#: postmaster/pgstat.c:1445 #, c-format -msgid "Target must be \"archiver\", \"bgwriter\" or \"wal\"." +msgid "Target must be \"archiver\", \"bgwriter\", or \"wal\"." msgstr "La cible doit être « archiver », « bgwriter » ou « wal »." -#: postmaster/pgstat.c:3298 +#: postmaster/pgstat.c:3289 #, c-format msgid "could not read statistics message: %m" msgstr "n'a pas pu lire le message des statistiques : %m" -#: postmaster/pgstat.c:3644 postmaster/pgstat.c:3829 +#: postmaster/pgstat.c:3634 postmaster/pgstat.c:3819 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier temporaire des statistiques « %s » : %m" -#: postmaster/pgstat.c:3739 postmaster/pgstat.c:3874 +#: postmaster/pgstat.c:3729 postmaster/pgstat.c:3864 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "n'a pas pu écrire le fichier temporaire des statistiques « %s » : %m" -#: postmaster/pgstat.c:3748 postmaster/pgstat.c:3883 +#: postmaster/pgstat.c:3738 postmaster/pgstat.c:3873 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "n'a pas pu fermer le fichier temporaire des statistiques « %s » : %m" -#: postmaster/pgstat.c:3756 postmaster/pgstat.c:3891 +#: postmaster/pgstat.c:3746 postmaster/pgstat.c:3881 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "" "n'a pas pu renommer le fichier temporaire des statistiques « %s » en\n" "« %s » : %m" -#: postmaster/pgstat.c:3989 postmaster/pgstat.c:4255 postmaster/pgstat.c:4412 +#: postmaster/pgstat.c:3979 postmaster/pgstat.c:4245 postmaster/pgstat.c:4402 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier de statistiques « %s » : %m" -#: postmaster/pgstat.c:4001 postmaster/pgstat.c:4011 postmaster/pgstat.c:4032 postmaster/pgstat.c:4043 postmaster/pgstat.c:4054 postmaster/pgstat.c:4076 postmaster/pgstat.c:4091 postmaster/pgstat.c:4161 postmaster/pgstat.c:4192 postmaster/pgstat.c:4267 postmaster/pgstat.c:4287 postmaster/pgstat.c:4305 postmaster/pgstat.c:4321 postmaster/pgstat.c:4339 postmaster/pgstat.c:4355 postmaster/pgstat.c:4424 postmaster/pgstat.c:4436 postmaster/pgstat.c:4448 postmaster/pgstat.c:4459 postmaster/pgstat.c:4470 postmaster/pgstat.c:4495 postmaster/pgstat.c:4522 postmaster/pgstat.c:4535 +#: postmaster/pgstat.c:3991 postmaster/pgstat.c:4001 postmaster/pgstat.c:4022 postmaster/pgstat.c:4033 postmaster/pgstat.c:4044 postmaster/pgstat.c:4066 postmaster/pgstat.c:4081 postmaster/pgstat.c:4151 postmaster/pgstat.c:4182 postmaster/pgstat.c:4257 postmaster/pgstat.c:4277 postmaster/pgstat.c:4295 postmaster/pgstat.c:4311 postmaster/pgstat.c:4329 postmaster/pgstat.c:4345 postmaster/pgstat.c:4414 postmaster/pgstat.c:4426 postmaster/pgstat.c:4438 postmaster/pgstat.c:4449 postmaster/pgstat.c:4460 postmaster/pgstat.c:4485 postmaster/pgstat.c:4512 postmaster/pgstat.c:4525 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "fichier de statistiques « %s » corrompu" -#: postmaster/pgstat.c:4644 +#: postmaster/pgstat.c:4634 #, c-format msgid "statistics collector's time %s is later than backend local time %s" msgstr "l'heure du collecteur de statistiques %s est plus avancé que l'heure locale du processus serveur %s" -#: postmaster/pgstat.c:4667 +#: postmaster/pgstat.c:4657 #, c-format msgid "using stale statistics instead of current ones because stats collector is not responding" msgstr "" "utilise de vieilles statistiques à la place des actuelles car le collecteur de\n" "statistiques ne répond pas" -#: postmaster/pgstat.c:4794 +#: postmaster/pgstat.c:4784 #, c-format msgid "stats_timestamp %s is later than collector's time %s for database %u" msgstr "stats_timestamp %s est plus avancé que l'heure du collecteur %s pour la base de données %u" -#: postmaster/pgstat.c:5004 +#: postmaster/pgstat.c:4997 #, c-format msgid "database hash table corrupted during cleanup --- abort" msgstr "" @@ -18264,439 +18255,454 @@ msgstr "longueur invalide du paquet de démarrage" msgid "failed to send SSL negotiation response: %m" msgstr "échec lors de l'envoi de la réponse de négotiation SSL : %m" -#: postmaster/postmaster.c:2080 +#: postmaster/postmaster.c:2066 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "a reçu des données non chiffrées après la demande SSL" + +#: postmaster/postmaster.c:2067 postmaster/postmaster.c:2111 +#, c-format +msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." +msgstr "Ceci peut être soit un bug du client soit la preuve d'une tentative d'attaque du type man-in-the-middle." + +#: postmaster/postmaster.c:2092 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "échec lors de l'envoi de la réponse à la négociation GSSAPI : %m" #: postmaster/postmaster.c:2110 #, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "a reçu des données non chiffrées après la demande de chiffrement GSSAPI" + +#: postmaster/postmaster.c:2134 +#, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "protocole frontal %u.%u non supporté : le serveur supporte de %u.0 à %u.%u" -#: postmaster/postmaster.c:2174 utils/misc/guc.c:7112 utils/misc/guc.c:7148 utils/misc/guc.c:7218 utils/misc/guc.c:8550 utils/misc/guc.c:11506 utils/misc/guc.c:11547 +#: postmaster/postmaster.c:2198 utils/misc/guc.c:7113 utils/misc/guc.c:7149 utils/misc/guc.c:7219 utils/misc/guc.c:8551 utils/misc/guc.c:11507 utils/misc/guc.c:11548 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "valeur invalide pour le paramètre « %s » : « %s »" -#: postmaster/postmaster.c:2177 +#: postmaster/postmaster.c:2201 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Les valeurs valides sont : « false », « 0 », « true », « 1 », « database »." -#: postmaster/postmaster.c:2222 +#: postmaster/postmaster.c:2246 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "" "configuration invalide du paquet de démarrage : terminaison attendue comme\n" "dernier octet" -#: postmaster/postmaster.c:2239 +#: postmaster/postmaster.c:2263 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "aucun nom d'utilisateur PostgreSQL n'a été spécifié dans le paquet de démarrage" -#: postmaster/postmaster.c:2303 +#: postmaster/postmaster.c:2327 #, c-format msgid "the database system is starting up" msgstr "le système de bases de données se lance" -#: postmaster/postmaster.c:2309 +#: postmaster/postmaster.c:2333 #, c-format msgid "the database system is not yet accepting connections" msgstr "le système de bases de données n'accepte pas encore de connexions" -#: postmaster/postmaster.c:2310 +#: postmaster/postmaster.c:2334 #, c-format msgid "Consistent recovery state has not been yet reached." msgstr "L'état de restauration cohérent n'a pas encore été atteint." -#: postmaster/postmaster.c:2314 +#: postmaster/postmaster.c:2338 #, c-format msgid "the database system is not accepting connections" msgstr "le système de bases de données n'accepte pas de connexions" -#: postmaster/postmaster.c:2315 +#: postmaster/postmaster.c:2339 #, c-format msgid "Hot standby mode is disabled." msgstr "Le mode Hot Standby est désactivé" -#: postmaster/postmaster.c:2320 +#: postmaster/postmaster.c:2344 #, c-format msgid "the database system is shutting down" msgstr "le système de base de données s'arrête" -#: postmaster/postmaster.c:2325 +#: postmaster/postmaster.c:2349 #, c-format msgid "the database system is in recovery mode" msgstr "le système de bases de données est en cours de restauration" -#: postmaster/postmaster.c:2330 storage/ipc/procarray.c:464 storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:361 +#: postmaster/postmaster.c:2354 storage/ipc/procarray.c:475 storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:361 #, c-format msgid "sorry, too many clients already" msgstr "désolé, trop de clients sont déjà connectés" -#: postmaster/postmaster.c:2420 +#: postmaster/postmaster.c:2444 #, c-format msgid "wrong key in cancel request for process %d" msgstr "mauvaise clé dans la demande d'annulation pour le processus %d" -#: postmaster/postmaster.c:2432 +#: postmaster/postmaster.c:2456 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "le PID %d dans la demande d'annulation ne correspond à aucun processus" -#: postmaster/postmaster.c:2686 +#: postmaster/postmaster.c:2710 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "a reçu SIGHUP, rechargement des fichiers de configuration" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2712 postmaster/postmaster.c:2716 +#: postmaster/postmaster.c:2736 postmaster/postmaster.c:2740 #, c-format msgid "%s was not reloaded" msgstr "%s n'a pas été rechargé" -#: postmaster/postmaster.c:2726 +#: postmaster/postmaster.c:2750 #, c-format msgid "SSL configuration was not reloaded" msgstr "la configuration SSL n'a pas été rechargée" -#: postmaster/postmaster.c:2782 +#: postmaster/postmaster.c:2806 #, c-format msgid "received smart shutdown request" msgstr "a reçu une demande d'arrêt intelligent" -#: postmaster/postmaster.c:2828 +#: postmaster/postmaster.c:2852 #, c-format msgid "received fast shutdown request" msgstr "a reçu une demande d'arrêt rapide" -#: postmaster/postmaster.c:2846 +#: postmaster/postmaster.c:2870 #, c-format msgid "aborting any active transactions" msgstr "annulation des transactions actives" -#: postmaster/postmaster.c:2870 +#: postmaster/postmaster.c:2894 #, c-format msgid "received immediate shutdown request" msgstr "a reçu une demande d'arrêt immédiat" -#: postmaster/postmaster.c:2947 +#: postmaster/postmaster.c:2971 #, c-format msgid "shutdown at recovery target" msgstr "arrêt sur la cible de restauration" -#: postmaster/postmaster.c:2965 postmaster/postmaster.c:3001 +#: postmaster/postmaster.c:2989 postmaster/postmaster.c:3025 msgid "startup process" msgstr "processus de lancement" -#: postmaster/postmaster.c:2968 +#: postmaster/postmaster.c:2992 #, c-format msgid "aborting startup due to startup process failure" msgstr "annulation du démarrage à cause d'un échec dans le processus de lancement" -#: postmaster/postmaster.c:3043 +#: postmaster/postmaster.c:3067 #, c-format msgid "database system is ready to accept connections" msgstr "le système de bases de données est prêt pour accepter les connexions" -#: postmaster/postmaster.c:3064 +#: postmaster/postmaster.c:3088 msgid "background writer process" msgstr "processus d'écriture en tâche de fond" -#: postmaster/postmaster.c:3118 +#: postmaster/postmaster.c:3142 msgid "checkpointer process" msgstr "processus checkpointer" -#: postmaster/postmaster.c:3134 +#: postmaster/postmaster.c:3158 msgid "WAL writer process" msgstr "processus d'écriture des journaux de transaction" -#: postmaster/postmaster.c:3149 +#: postmaster/postmaster.c:3173 msgid "WAL receiver process" msgstr "processus de réception des journaux de transaction" -#: postmaster/postmaster.c:3164 +#: postmaster/postmaster.c:3188 msgid "autovacuum launcher process" msgstr "processus de lancement de l'autovacuum" -#: postmaster/postmaster.c:3182 +#: postmaster/postmaster.c:3206 msgid "archiver process" msgstr "processus d'archivage" -#: postmaster/postmaster.c:3197 +#: postmaster/postmaster.c:3221 msgid "statistics collector process" msgstr "processus de récupération des statistiques" -#: postmaster/postmaster.c:3211 +#: postmaster/postmaster.c:3235 msgid "system logger process" msgstr "processus des journaux applicatifs" -#: postmaster/postmaster.c:3275 +#: postmaster/postmaster.c:3299 #, c-format msgid "background worker \"%s\"" msgstr "processus en tâche de fond « %s »" -#: postmaster/postmaster.c:3359 postmaster/postmaster.c:3379 postmaster/postmaster.c:3386 postmaster/postmaster.c:3404 +#: postmaster/postmaster.c:3383 postmaster/postmaster.c:3403 postmaster/postmaster.c:3410 postmaster/postmaster.c:3428 msgid "server process" msgstr "processus serveur" -#: postmaster/postmaster.c:3458 +#: postmaster/postmaster.c:3482 #, c-format msgid "terminating any other active server processes" msgstr "arrêt des autres processus serveur actifs" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3711 +#: postmaster/postmaster.c:3735 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) a quitté avec le code de sortie %d" -#: postmaster/postmaster.c:3713 postmaster/postmaster.c:3725 postmaster/postmaster.c:3735 postmaster/postmaster.c:3746 +#: postmaster/postmaster.c:3737 postmaster/postmaster.c:3749 postmaster/postmaster.c:3759 postmaster/postmaster.c:3770 #, c-format msgid "Failed process was running: %s" msgstr "Le processus qui a échoué exécutait : %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3722 +#: postmaster/postmaster.c:3746 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) a été arrêté par l'exception 0x%X" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3732 +#: postmaster/postmaster.c:3756 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) a été arrêté par le signal %d : %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3744 +#: postmaster/postmaster.c:3768 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) a quitté avec le statut inattendu %d" -#: postmaster/postmaster.c:3959 +#: postmaster/postmaster.c:3982 #, c-format msgid "abnormal database system shutdown" msgstr "le système de base de données a été arrêté anormalement" -#: postmaster/postmaster.c:3997 +#: postmaster/postmaster.c:4020 #, c-format msgid "shutting down due to startup process failure" msgstr "arrêt à cause d'un échec du processus startup" -#: postmaster/postmaster.c:4003 +#: postmaster/postmaster.c:4026 #, c-format msgid "shutting down because restart_after_crash is off" -msgstr "" +msgstr "arrêt parce que restart_after_crash est configuré à off" -#: postmaster/postmaster.c:4015 +#: postmaster/postmaster.c:4038 #, c-format msgid "all server processes terminated; reinitializing" msgstr "tous les processus serveur sont arrêtés ; réinitialisation" -#: postmaster/postmaster.c:4189 postmaster/postmaster.c:5548 postmaster/postmaster.c:5939 +#: postmaster/postmaster.c:4212 postmaster/postmaster.c:5571 postmaster/postmaster.c:5962 #, c-format msgid "could not generate random cancel key" msgstr "n'a pas pu générer la clé d'annulation aléatoire" -#: postmaster/postmaster.c:4243 +#: postmaster/postmaster.c:4266 #, c-format msgid "could not fork new process for connection: %m" msgstr "n'a pas pu lancer le nouveau processus fils pour la connexion : %m" -#: postmaster/postmaster.c:4285 +#: postmaster/postmaster.c:4308 msgid "could not fork new process for connection: " msgstr "n'a pas pu lancer le nouveau processus fils pour la connexion : " -#: postmaster/postmaster.c:4391 +#: postmaster/postmaster.c:4414 #, c-format msgid "connection received: host=%s port=%s" msgstr "connexion reçue : hôte=%s port=%s" -#: postmaster/postmaster.c:4396 +#: postmaster/postmaster.c:4419 #, c-format msgid "connection received: host=%s" msgstr "connexion reçue : hôte=%s" -#: postmaster/postmaster.c:4639 +#: postmaster/postmaster.c:4662 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "n'a pas pu exécuter le processus serveur « %s » : %m" -#: postmaster/postmaster.c:4697 +#: postmaster/postmaster.c:4720 #, c-format msgid "could not create backend parameter file mapping: error code %lu" msgstr "n'a pas pu créer le lien vers le fichier de paramètres du processus serveur : code d'erreur %lu" -#: postmaster/postmaster.c:4706 +#: postmaster/postmaster.c:4729 #, c-format msgid "could not map backend parameter memory: error code %lu" msgstr "n'a pas pu mapper la mémoire des paramètres du processus serveur : code d'erreur %lu" -#: postmaster/postmaster.c:4733 +#: postmaster/postmaster.c:4756 #, c-format msgid "subprocess command line too long" msgstr "ligne de commande du sous-processus trop longue" -#: postmaster/postmaster.c:4751 +#: postmaster/postmaster.c:4774 #, c-format msgid "CreateProcess() call failed: %m (error code %lu)" msgstr "échec de l'appel à CreateProcess() : %m (code d'erreur %lu)" -#: postmaster/postmaster.c:4778 +#: postmaster/postmaster.c:4801 #, c-format msgid "could not unmap view of backend parameter file: error code %lu" -msgstr "" +msgstr "n'a pas pu supprimer la vue du fichier paramètre du backend : code d'erreur %lu" -#: postmaster/postmaster.c:4782 +#: postmaster/postmaster.c:4805 #, c-format msgid "could not close handle to backend parameter file: error code %lu" msgstr "n'a pas pu fermer le lien vers le fichier de paramètres du processus serveur : code d'erreur %lu" -#: postmaster/postmaster.c:4804 +#: postmaster/postmaster.c:4827 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "abandon après trop de tentatives pour réserver la mémoire partagée" -#: postmaster/postmaster.c:4805 +#: postmaster/postmaster.c:4828 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "Ceci pourrait être causé par un logiciel ASLR ou un antivirus." -#: postmaster/postmaster.c:4995 +#: postmaster/postmaster.c:5018 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "la configuration SSL n'a pas pu être chargée dans le processus fils" -#: postmaster/postmaster.c:5121 +#: postmaster/postmaster.c:5144 #, c-format msgid "Please report this to <%s>." msgstr "Merci de signaler ceci à <%s>." -#: postmaster/postmaster.c:5208 +#: postmaster/postmaster.c:5231 #, c-format -msgid "database system is ready to accept read only connections" +msgid "database system is ready to accept read-only connections" msgstr "le système de bases de données est prêt pour accepter les connexions en lecture seule" -#: postmaster/postmaster.c:5472 +#: postmaster/postmaster.c:5495 #, c-format msgid "could not fork startup process: %m" msgstr "n'a pas pu lancer le processus fils de démarrage : %m" -#: postmaster/postmaster.c:5476 +#: postmaster/postmaster.c:5499 #, c-format msgid "could not fork archiver process: %m" msgstr "n'a pas pu créer un processus fils d'archivage des journaux de transactions : %m" -#: postmaster/postmaster.c:5480 +#: postmaster/postmaster.c:5503 #, c-format msgid "could not fork background writer process: %m" msgstr "" "n'a pas pu créer un processus fils du processus d'écriture en tâche de\n" "fond : %m" -#: postmaster/postmaster.c:5484 +#: postmaster/postmaster.c:5507 #, c-format msgid "could not fork checkpointer process: %m" msgstr "n'a pas pu créer le processus checkpointer : %m" -#: postmaster/postmaster.c:5488 +#: postmaster/postmaster.c:5511 #, c-format msgid "could not fork WAL writer process: %m" msgstr "" "n'a pas pu créer un processus fils du processus d'écriture des journaux de\n" "transaction : %m" -#: postmaster/postmaster.c:5492 +#: postmaster/postmaster.c:5515 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "" "n'a pas pu créer un processus fils de réception des journaux de\n" "transactions : %m" -#: postmaster/postmaster.c:5496 +#: postmaster/postmaster.c:5519 #, c-format msgid "could not fork process: %m" msgstr "n'a pas pu lancer le processus fils : %m" -#: postmaster/postmaster.c:5697 postmaster/postmaster.c:5720 +#: postmaster/postmaster.c:5720 postmaster/postmaster.c:5743 #, c-format msgid "database connection requirement not indicated during registration" msgstr "pré-requis de la connexion à la base non indiqué lors de l'enregistrement" -#: postmaster/postmaster.c:5704 postmaster/postmaster.c:5727 +#: postmaster/postmaster.c:5727 postmaster/postmaster.c:5750 #, c-format msgid "invalid processing mode in background worker" msgstr "mode de traitement invalide dans le processus en tâche de fond" -#: postmaster/postmaster.c:5812 +#: postmaster/postmaster.c:5835 #, c-format msgid "could not fork worker process: %m" msgstr "n'a pas pu créer un processus fils du processus en tâche de fond : %m" -#: postmaster/postmaster.c:5925 +#: postmaster/postmaster.c:5948 #, c-format msgid "no slot available for new worker process" msgstr "aucun slot disponible pour le nouveau processus worker" -#: postmaster/postmaster.c:6259 +#: postmaster/postmaster.c:6282 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "n'a pas pu dupliquer la socket %d pour le serveur : code d'erreur %d" -#: postmaster/postmaster.c:6291 +#: postmaster/postmaster.c:6314 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "n'a pas pu créer la socket héritée : code d'erreur %d\n" -#: postmaster/postmaster.c:6320 +#: postmaster/postmaster.c:6343 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "n'a pas pu ouvrir le fichier des variables moteurs « %s » : %s\n" -#: postmaster/postmaster.c:6327 +#: postmaster/postmaster.c:6350 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "n'a pas pu lire le fichier de configuration serveur « %s » : %s\n" -#: postmaster/postmaster.c:6336 +#: postmaster/postmaster.c:6359 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "n'a pas pu supprimer le fichier « %s » : %s\n" -#: postmaster/postmaster.c:6353 +#: postmaster/postmaster.c:6376 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "" "n'a pas pu exécuter \"map\" la vue des variables serveurs : code\n" "d'erreur %lu\n" -#: postmaster/postmaster.c:6362 +#: postmaster/postmaster.c:6385 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "" "n'a pas pu exécuter \"unmap\" sur la vue des variables serveurs : code\n" "d'erreur %lu\n" -#: postmaster/postmaster.c:6369 +#: postmaster/postmaster.c:6392 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "" "n'a pas pu fermer le lien vers les variables des paramètres du serveur :\n" "code d'erreur %lu\n" -#: postmaster/postmaster.c:6546 +#: postmaster/postmaster.c:6569 #, c-format msgid "could not read exit code for process\n" msgstr "n'a pas pu lire le code de sortie du processus\n" -#: postmaster/postmaster.c:6551 +#: postmaster/postmaster.c:6574 #, c-format msgid "could not post child completion status\n" msgstr "n'a pas pu poster le statut de fin de l'enfant\n" @@ -18744,7 +18750,7 @@ msgstr "n'a pas pu écrire dans le journal applicatif : %s\n" #: postmaster/syslogger.c:1225 #, c-format msgid "could not open log file \"%s\": %m" -msgstr "n'a pas pu ouvrir le fichier applicatif « %s » : %m" +msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m" #: postmaster/syslogger.c:1287 postmaster/syslogger.c:1337 #, c-format @@ -18761,40 +18767,40 @@ msgstr "n'a pas pu déterminer le collationnement à utiliser pour une expressio msgid "nondeterministic collations are not supported for regular expressions" msgstr "les collationnements non déterministes ne sont pas supportés pour les expressions rationnelles" -#: repl_gram.y:349 repl_gram.y:381 +#: repl_gram.y:345 repl_gram.y:377 #, c-format msgid "invalid timeline %u" msgstr "timeline %u invalide" -#: repl_scanner.l:131 +#: repl_scanner.l:150 msgid "invalid streaming start location" msgstr "emplacement de démarrage du flux de réplication invalide" -#: repl_scanner.l:182 scan.l:717 +#: repl_scanner.l:206 scan.l:717 msgid "unterminated quoted string" msgstr "chaîne entre guillemets non terminée" -#: replication/backup_manifest.c:255 +#: replication/backup_manifest.c:251 #, c-format msgid "expected end timeline %u but found timeline %u" msgstr "timeline de fin attendue %u mais a trouvé la timeline %u" -#: replication/backup_manifest.c:272 +#: replication/backup_manifest.c:275 #, c-format msgid "expected start timeline %u but found timeline %u" msgstr "timeline de début attendue %u mais a trouvé la timeline %u" -#: replication/backup_manifest.c:299 +#: replication/backup_manifest.c:302 #, c-format msgid "start timeline %u not found in history of timeline %u" msgstr "timeline de début %u non trouvée dans l'historique de la timeline %u" -#: replication/backup_manifest.c:352 +#: replication/backup_manifest.c:353 #, c-format msgid "could not rewind temporary file" msgstr "n'a pas pu revenir au début du fichier temporaire" -#: replication/backup_manifest.c:379 +#: replication/backup_manifest.c:380 #, c-format msgid "could not read from temporary file: %m" msgstr "n'a pas pu lire le fichier temporaire : %m" @@ -19095,55 +19101,20 @@ msgstr "slot « %s », plugin de sortie « %s », dans la fonction d'appel %s, a msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "slot « %s », plugin de sortie « %s », dans la fonction d'appel %s" -#: replication/logical/logical.c:868 -#, c-format -msgid "logical replication at prepare time requires begin_prepare_cb callback" -msgstr "la réplication logique lors de la préparation requiert la fonction begin_prepare_cb" - -#: replication/logical/logical.c:911 -#, c-format -msgid "logical replication at prepare time requires prepare_cb callback" -msgstr "la réplication logique lors de la préparation requiert la fonction prepare_cb" - -#: replication/logical/logical.c:954 -#, c-format -msgid "logical replication at prepare time requires commit_prepared_cb callback" -msgstr "la réplication logique lors de la préparation requiert la fonction commit_prepared_cb" - -#: replication/logical/logical.c:998 -#, c-format -msgid "logical replication at prepare time requires rollback_prepared_cb callback" -msgstr "la réplication logique lors de la préparation requiert la fonction rollback_prepared_cb" - -#: replication/logical/logical.c:1220 -#, c-format -msgid "logical streaming requires a stream_start_cb callback" -msgstr "le flux logique requiert une fonction stream_start_cb" - -#: replication/logical/logical.c:1266 -#, c-format -msgid "logical streaming requires a stream_stop_cb callback" -msgstr "le flux logique requiert une fonction stream_stop_cb" - -#: replication/logical/logical.c:1305 -#, c-format -msgid "logical streaming requires a stream_abort_cb callback" -msgstr "le flux logique requiert une fonction stream_abort_cb" - -#: replication/logical/logical.c:1348 +#: replication/logical/logical.c:868 replication/logical/logical.c:912 replication/logical/logical.c:956 replication/logical/logical.c:1001 #, c-format -msgid "logical streaming at prepare time requires a stream_prepare_cb callback" -msgstr "la réplication logique lors de la préparation requiert la fonction stream_prepare_cb" +msgid "logical replication at prepare time requires a %s callback" +msgstr "la réplication logique lors de la préparation requiert la fonction %s" -#: replication/logical/logical.c:1387 +#: replication/logical/logical.c:1224 replication/logical/logical.c:1271 replication/logical/logical.c:1311 replication/logical/logical.c:1395 replication/logical/logical.c:1442 #, c-format -msgid "logical streaming requires a stream_commit_cb callback" -msgstr "la réplication logique requiert la fonction stream_commit_cb" +msgid "logical streaming requires a %s callback" +msgstr "le flux logique requiert une fonction %s" -#: replication/logical/logical.c:1433 +#: replication/logical/logical.c:1355 #, c-format -msgid "logical streaming requires a stream_change_cb callback" -msgstr "le flux logique requiert une fonction stream_change_cb" +msgid "logical streaming at prepare time requires a %s callback" +msgstr "le flux logique lors de la préparation requiert la fonction %s" #: replication/logical/logicalfuncs.c:104 replication/slotfuncs.c:34 #, c-format @@ -19252,7 +19223,7 @@ msgstr "l'origine de réplication d'OID %d est déjà active pour le PID %d" msgid "could not find free replication state slot for replication origin with OID %u" msgstr "n'a pas pu trouver de slot d'état de réplication libre pour l'origine de réplication d'OID %u" -#: replication/logical/origin.c:941 replication/logical/origin.c:1128 replication/slot.c:1840 +#: replication/logical/origin.c:941 replication/logical/origin.c:1128 replication/slot.c:1860 #, c-format msgid "Increase max_replication_slots and try again." msgstr "Augmentez max_replication_slots et recommencez." @@ -19277,56 +19248,56 @@ msgstr "le nom d'origine de réplication « %s » est réservé" msgid "Origin names starting with \"pg_\" are reserved." msgstr "Les noms d'origine commençant par « pg_ » sont réservés." -#: replication/logical/relation.c:248 +#: replication/logical/relation.c:234 #, c-format msgid "\"%s\"" msgstr "\"%s\"" -#: replication/logical/relation.c:251 +#: replication/logical/relation.c:237 #, c-format msgid ", \"%s\"" msgstr ", \"%s\"" -#: replication/logical/relation.c:257 +#: replication/logical/relation.c:243 #, c-format msgid "logical replication target relation \"%s.%s\" is missing replicated column: %s" msgid_plural "logical replication target relation \"%s.%s\" is missing replicated columns: %s" msgstr[0] "il manque une colonne répliquée à la relation cible de la réplication logique « %s.%s » : %s" msgstr[1] "il manque plusieurs colonnes répliquées à la relation cible de la réplication logique « %s.%s » : %s" -#: replication/logical/relation.c:337 +#: replication/logical/relation.c:323 #, c-format msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "la relation cible de la réplication logique « %s.%s » n'existe pas" -#: replication/logical/relation.c:418 +#: replication/logical/relation.c:404 #, c-format msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" msgstr "la relation cible « %s.%s » de réplication logique utilise des colonnes systèmes dans l'index REPLICA IDENTITY" -#: replication/logical/reorderbuffer.c:3800 +#: replication/logical/reorderbuffer.c:3802 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "n'a pas pu écrire dans le fichier pour le XID %u : %m" -#: replication/logical/reorderbuffer.c:4144 replication/logical/reorderbuffer.c:4169 +#: replication/logical/reorderbuffer.c:4146 replication/logical/reorderbuffer.c:4171 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "n'a pas pu lire le fichier « reorderbuffer spill » : %m" -#: replication/logical/reorderbuffer.c:4148 replication/logical/reorderbuffer.c:4173 +#: replication/logical/reorderbuffer.c:4150 replication/logical/reorderbuffer.c:4175 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "" "n'a pas pu lire à partir du fichier « reorderbuffer spill » : a lu seulement %d octets\n" "sur %u" -#: replication/logical/reorderbuffer.c:4422 +#: replication/logical/reorderbuffer.c:4425 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "n'a pas pu supprimer le fichier « %s » pendant la suppression de pg_replslot/%s/xid* : %m" -#: replication/logical/reorderbuffer.c:4912 +#: replication/logical/reorderbuffer.c:4924 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "n'a pas pu lire à partir du fichier « %s » : lu %d octets au lieu de %d octets" @@ -19343,59 +19314,59 @@ msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs msgstr[0] "snapshot exporté pour le décodage logique : « %s » avec %u identifiant de transaction" msgstr[1] "snapshot exporté pour le décodage logique : « %s » avec %u identifiants de transaction" -#: replication/logical/snapbuild.c:1254 replication/logical/snapbuild.c:1347 replication/logical/snapbuild.c:1878 +#: replication/logical/snapbuild.c:1270 replication/logical/snapbuild.c:1363 replication/logical/snapbuild.c:1894 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "le décodage logique a trouvé le point de cohérence à %X/%X" -#: replication/logical/snapbuild.c:1256 +#: replication/logical/snapbuild.c:1272 #, c-format msgid "There are no running transactions." msgstr "Il n'existe pas de transactions en cours." -#: replication/logical/snapbuild.c:1298 +#: replication/logical/snapbuild.c:1314 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "le décodage logique a trouvé le point de démarrage à %X/%X" -#: replication/logical/snapbuild.c:1300 replication/logical/snapbuild.c:1324 +#: replication/logical/snapbuild.c:1316 replication/logical/snapbuild.c:1340 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "En attente de transactions (approximativement %d) plus anciennes que %u pour terminer." -#: replication/logical/snapbuild.c:1322 +#: replication/logical/snapbuild.c:1338 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "le décodage logique a trouvé le point de cohérence initial à %X/%X" -#: replication/logical/snapbuild.c:1349 +#: replication/logical/snapbuild.c:1365 #, c-format msgid "There are no old transactions anymore." msgstr "Il n'existe plus d'anciennes transactions." -#: replication/logical/snapbuild.c:1746 +#: replication/logical/snapbuild.c:1762 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "le fichier d'état snapbuild « %s » a le nombre magique: %u au lieu de %u" -#: replication/logical/snapbuild.c:1752 +#: replication/logical/snapbuild.c:1768 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "le fichier d'état snapbuild « %s » a une version non supportée : %u au lieu de %u" -#: replication/logical/snapbuild.c:1823 +#: replication/logical/snapbuild.c:1839 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "" "différence de somme de contrôle pour lefichier d'état snapbuild %s :\n" "est %u, devrait être %u" -#: replication/logical/snapbuild.c:1880 +#: replication/logical/snapbuild.c:1896 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Le décodage logique commencera en utilisant un snapshot sauvegardé." -#: replication/logical/snapbuild.c:1952 +#: replication/logical/snapbuild.c:1968 #, c-format msgid "could not parse file name \"%s\"" msgstr "n'a pas pu analyser le mode du fichier « %s »" @@ -19435,82 +19406,82 @@ msgstr "l'origine de réplication « %s » existe déjà" msgid "table copy could not finish transaction on publisher: %s" msgstr "la copie de table n'a pas pu finir la transaction sur le publieur : %s" -#: replication/logical/worker.c:530 +#: replication/logical/worker.c:518 #, c-format -msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\", remote type %s, local type %s" -msgstr "traitement des données distantes pour la relation cible « %s.%s » de réplication logique, colonne « %s », type distant %s, type local %s" +msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgstr "traitement des données distantes pour la relation cible « %s.%s » de réplication logique, colonne « %s »" -#: replication/logical/worker.c:610 replication/logical/worker.c:739 +#: replication/logical/worker.c:593 replication/logical/worker.c:719 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "format des données binaires incorrect dans la colonne de réplication logique %d" -#: replication/logical/worker.c:1111 replication/logical/worker.c:1125 +#: replication/logical/worker.c:1090 replication/logical/worker.c:1104 #, c-format msgid "could not read from streaming transaction's changes file \"%s\": %m" msgstr "n'a pas pu lire à partir du fichier de changements de transaction en flux « %s » : %m" -#: replication/logical/worker.c:1355 +#: replication/logical/worker.c:1335 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" msgstr "le publieur n'a pas envoyé la colonne d'identité du réplicat attendue par la relation cible « %s.%s » de la réplication logique" -#: replication/logical/worker.c:1362 +#: replication/logical/worker.c:1342 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "la relation cible « %s.%s » de réplication logique n'a ni un index REPLICA IDENTITY ni une clé primaire, et la relation publiée n'a pas REPLICA IDENTITY FULL" -#: replication/logical/worker.c:2241 +#: replication/logical/worker.c:2221 #, c-format msgid "data stream from publisher has ended" msgstr "le flux de données provenant du publieur s'est terminé" -#: replication/logical/worker.c:2392 +#: replication/logical/worker.c:2372 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "arrêt du processus worker de la réplication logique suite à l'expiration du délai de réplication" -#: replication/logical/worker.c:2540 +#: replication/logical/worker.c:2520 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" msgstr "le processus apply de réplication logique pour la souscription « %s » s'arrêtera car la souscription a été supprimée" -#: replication/logical/worker.c:2554 +#: replication/logical/worker.c:2534 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "le processus apply de réplication logique pour la souscription « %s » s'arrêtera car la souscription a été désactivée" -#: replication/logical/worker.c:2576 +#: replication/logical/worker.c:2556 #, c-format msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" msgstr "le processus apply de réplication logique pour la souscription « %s » redémarrera car un paramètre a été modifié" -#: replication/logical/worker.c:2741 replication/logical/worker.c:2763 +#: replication/logical/worker.c:2721 replication/logical/worker.c:2743 #, c-format msgid "could not read from streaming transaction's subxact file \"%s\": %m" msgstr "n'a pas pu lire à partir du fichier subxact de transaction en flux « %s » : %m" -#: replication/logical/worker.c:3122 +#: replication/logical/worker.c:3102 #, c-format msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" msgstr "le processus apply de réplication logique pour la souscription %u ne démarrera pas car la souscription a été désactivée au démarrage" -#: replication/logical/worker.c:3134 +#: replication/logical/worker.c:3114 #, c-format msgid "logical replication apply worker for subscription \"%s\" will not start because the subscription was disabled during startup" msgstr "le processus apply de réplication logique pour la souscription « %s » ne démarrera pas car la souscription a été désactivée au démarrage" -#: replication/logical/worker.c:3152 +#: replication/logical/worker.c:3132 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "le processus de synchronisation des tables en réplication logique pour la souscription « %s », table « %s » a démarré" -#: replication/logical/worker.c:3156 +#: replication/logical/worker.c:3136 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "le processus apply de réplication logique pour la souscription « %s » a démarré" -#: replication/logical/worker.c:3194 +#: replication/logical/worker.c:3174 #, c-format msgid "subscription has no replication slot set" msgstr "la souscription n'a aucun ensemble de slot de réplication" @@ -19590,7 +19561,7 @@ msgstr "tous les slots de réplication sont utilisés" msgid "Free one or increase max_replication_slots." msgstr "Libérez un slot ou augmentez max_replication_slots." -#: replication/slot.c:402 replication/slotfuncs.c:761 utils/adt/pgstatfuncs.c:2227 +#: replication/slot.c:402 replication/slotfuncs.c:761 utils/adt/pgstatfuncs.c:2228 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "le slot de réplication « %s » n'existe pas" @@ -19600,7 +19571,7 @@ msgstr "le slot de réplication « %s » n'existe pas" msgid "replication slot \"%s\" is active for PID %d" msgstr "le slot de réplication « %s » est actif pour le PID %d" -#: replication/slot.c:676 replication/slot.c:1392 replication/slot.c:1775 +#: replication/slot.c:676 replication/slot.c:1412 replication/slot.c:1795 #, c-format msgid "could not remove directory \"%s\"" msgstr "n'a pas pu supprimer le répertoire « %s »" @@ -19615,57 +19586,57 @@ msgstr "les slots de réplications peuvent seulement être utilisés si max_repl msgid "replication slots can only be used if wal_level >= replica" msgstr "les slots de réplication peuvent seulement être utilisés si wal_level >= replica" -#: replication/slot.c:1237 +#: replication/slot.c:1243 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "arrêt du processus %d pour relâcher le slot de réplication « %s »" -#: replication/slot.c:1275 +#: replication/slot.c:1281 #, c-format msgid "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds max_slot_wal_keep_size" msgstr "invalidation du slot « %s » parce que son restart_lsn %X/%X dépasse max_slot_wal_keep_size" -#: replication/slot.c:1713 +#: replication/slot.c:1733 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "le fichier « %s » du slot de réplication a le nombre magique %u au lieu de %u" -#: replication/slot.c:1720 +#: replication/slot.c:1740 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "le fichier « %s » du slot de réplication a une version %u non supportée" -#: replication/slot.c:1727 +#: replication/slot.c:1747 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "le slot de réplication « %s » a une taille %u corrompue" -#: replication/slot.c:1763 +#: replication/slot.c:1783 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "différence de somme de contrôle pour le fichier de slot de réplication « %s » : est %u, devrait être %u" -#: replication/slot.c:1797 +#: replication/slot.c:1817 #, c-format msgid "logical replication slot \"%s\" exists, but wal_level < logical" msgstr "le slot de réplication logique « %s » existe mais, wal_level < logical" -#: replication/slot.c:1799 +#: replication/slot.c:1819 #, c-format msgid "Change wal_level to be logical or higher." msgstr "Modifiez wal_level pour valoir logical ou supérieur." -#: replication/slot.c:1803 +#: replication/slot.c:1823 #, c-format msgid "physical replication slot \"%s\" exists, but wal_level < replica" msgstr "le slot de réplication physique « %s » existe mais, wal_level < replica" -#: replication/slot.c:1805 +#: replication/slot.c:1825 #, c-format msgid "Change wal_level to be replica or higher." msgstr "Modifiez wal_level pour valoir replica ou supérieur." -#: replication/slot.c:1839 +#: replication/slot.c:1859 #, c-format msgid "too many replication slots active before shutdown" msgstr "trop de slots de réplication actifs avant l'arrêt" @@ -19759,86 +19730,86 @@ msgstr "l'analyseur du paramètre synchronous_standby_names a échoué" msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "le nombre de standbys synchrones (%d) doit être supérieur à zéro" -#: replication/walreceiver.c:160 +#: replication/walreceiver.c:161 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "arrêt du processus walreceiver suite à la demande de l'administrateur" -#: replication/walreceiver.c:288 +#: replication/walreceiver.c:289 #, c-format msgid "could not connect to the primary server: %s" msgstr "n'a pas pu se connecter au serveur principal : %s" -#: replication/walreceiver.c:335 +#: replication/walreceiver.c:336 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "" "l'identifiant du système de bases de données diffère entre le serveur principal\n" "et le serveur en attente" -#: replication/walreceiver.c:336 +#: replication/walreceiver.c:337 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "" "L'identifiant du serveur principal est %s, l'identifiant du serveur en attente\n" "est %s." -#: replication/walreceiver.c:347 +#: replication/walreceiver.c:348 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "la plus grande timeline %u du serveur principal est derrière la timeline de restauration %u" -#: replication/walreceiver.c:401 +#: replication/walreceiver.c:402 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "démarré le flux des journaux depuis le principal à %X/%X sur la timeline %u" -#: replication/walreceiver.c:405 +#: replication/walreceiver.c:406 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "recommence le flux WAL à %X/%X sur la timeline %u" -#: replication/walreceiver.c:434 +#: replication/walreceiver.c:435 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "ne peut pas continuer le flux de journaux de transactions, la récupération est déjà terminée" -#: replication/walreceiver.c:471 +#: replication/walreceiver.c:472 #, c-format msgid "replication terminated by primary server" msgstr "réplication terminée par le serveur primaire" -#: replication/walreceiver.c:472 +#: replication/walreceiver.c:473 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "Fin du WAL atteint sur la timeline %u à %X/%X." -#: replication/walreceiver.c:561 +#: replication/walreceiver.c:562 #, c-format msgid "terminating walreceiver due to timeout" msgstr "arrêt du processus walreceiver suite à l'expiration du délai de réplication" -#: replication/walreceiver.c:599 +#: replication/walreceiver.c:600 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "le serveur principal ne contient plus de WAL sur la timeline %u demandée" -#: replication/walreceiver.c:615 replication/walreceiver.c:910 +#: replication/walreceiver.c:616 replication/walreceiver.c:1036 #, c-format msgid "could not close log segment %s: %m" msgstr "n'a pas pu fermer le journal de transactions %s : %m" -#: replication/walreceiver.c:734 +#: replication/walreceiver.c:735 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "récupération du fichier historique pour la timeline %u à partir du serveur principal" -#: replication/walreceiver.c:957 +#: replication/walreceiver.c:927 #, c-format msgid "could not write to log segment %s at offset %u, length %lu: %m" msgstr "n'a pas pu écrire le journal de transactions %s au décalage %u, longueur %lu : %m" -#: replication/walsender.c:524 storage/smgr/md.c:1320 +#: replication/walsender.c:524 storage/smgr/md.c:1321 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "n'a pas pu trouver la fin du fichier « %s » : %m" @@ -19918,44 +19889,44 @@ msgstr "Ce slot a été invalidé parce qu'il dépassait la taille maximale rés msgid "terminating walsender process after promotion" msgstr "arrêt du processus walreceiver suite promotion" -#: replication/walsender.c:1523 +#: replication/walsender.c:1524 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "ne peut pas exécuter de nouvelles commandes alors que le walsender est en mode d'arrêt" -#: replication/walsender.c:1560 +#: replication/walsender.c:1559 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "ne peut pas exécuter des commandes SQL dans le walsender pour la réplication physique" -#: replication/walsender.c:1583 +#: replication/walsender.c:1592 #, c-format msgid "received replication command: %s" msgstr "commande de réplication reçu : %s" -#: replication/walsender.c:1591 tcop/fastpath.c:208 tcop/postgres.c:1078 tcop/postgres.c:1430 tcop/postgres.c:1691 tcop/postgres.c:2176 tcop/postgres.c:2586 tcop/postgres.c:2665 +#: replication/walsender.c:1600 tcop/fastpath.c:208 tcop/postgres.c:1078 tcop/postgres.c:1430 tcop/postgres.c:1691 tcop/postgres.c:2176 tcop/postgres.c:2586 tcop/postgres.c:2665 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "" "la transaction est annulée, les commandes sont ignorées jusqu'à la fin du bloc\n" "de la transaction" -#: replication/walsender.c:1726 replication/walsender.c:1761 +#: replication/walsender.c:1735 replication/walsender.c:1770 #, c-format msgid "unexpected EOF on standby connection" msgstr "fin de fichier (EOF) inattendue de la connexion du serveur en attente" -#: replication/walsender.c:1749 +#: replication/walsender.c:1758 #, c-format msgid "invalid standby message type \"%c\"" msgstr "type de message « %c » invalide pour le serveur en standby" -#: replication/walsender.c:1838 +#: replication/walsender.c:1847 #, c-format msgid "unexpected message type \"%c\"" msgstr "type de message « %c » inattendu" -#: replication/walsender.c:2251 +#: replication/walsender.c:2260 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "arrêt du processus walreceiver suite à l'expiration du délai de réplication" @@ -20176,196 +20147,206 @@ msgstr "la règle « %s » de la relation « %s » n'existe pas" msgid "renaming an ON SELECT rule is not allowed" msgstr "le renommage d'une règle ON SELECT n'est pas autorisé" -#: rewrite/rewriteHandler.c:551 +#: rewrite/rewriteHandler.c:554 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "Le nom de la requête WITH « %s » apparaît à la fois dans l'action d'une règle et dans la requête en cours de ré-écriture" -#: rewrite/rewriteHandler.c:611 +#: rewrite/rewriteHandler.c:581 +#, c-format +msgid "INSERT...SELECT rule actions are not supported for queries having data-modifying statements in WITH" +msgstr "les actions de règle INSERT...SELECT ne sont pas supportées par les requêtes de modification de données dans WITH" + +#: rewrite/rewriteHandler.c:634 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "ne peut pas avoir des listes RETURNING dans plusieurs règles" -#: rewrite/rewriteHandler.c:843 rewrite/rewriteHandler.c:882 +#: rewrite/rewriteHandler.c:866 rewrite/rewriteHandler.c:905 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "ne peut pas insérer une valeur pas par défaut dans la colonne « %s »" -#: rewrite/rewriteHandler.c:845 rewrite/rewriteHandler.c:911 +#: rewrite/rewriteHandler.c:868 rewrite/rewriteHandler.c:934 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "La colonne « %s » est une colonne d'identité définie comme GENERATED ALWAYS." -#: rewrite/rewriteHandler.c:847 +#: rewrite/rewriteHandler.c:870 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Utilisez OVERRIDING SYSTEM VALUE pour surcharger." -#: rewrite/rewriteHandler.c:909 rewrite/rewriteHandler.c:917 +#: rewrite/rewriteHandler.c:932 rewrite/rewriteHandler.c:940 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "la colonne « %s » peut seulement être mise à jour en DEFAULT" -#: rewrite/rewriteHandler.c:1064 rewrite/rewriteHandler.c:1082 +#: rewrite/rewriteHandler.c:1087 rewrite/rewriteHandler.c:1105 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "affectations multiples pour la même colonne « %s »" -#: rewrite/rewriteHandler.c:2084 rewrite/rewriteHandler.c:3898 +#: rewrite/rewriteHandler.c:2107 rewrite/rewriteHandler.c:3935 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "récursion infinie détectée dans les règles de la relation « %s »" -#: rewrite/rewriteHandler.c:2169 +#: rewrite/rewriteHandler.c:2192 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "récursion infinie détectée dans la politique pour la relation « %s »" -#: rewrite/rewriteHandler.c:2489 +#: rewrite/rewriteHandler.c:2512 msgid "Junk view columns are not updatable." msgstr "Les colonnes « junk » des vues ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2494 +#: rewrite/rewriteHandler.c:2517 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Les colonnes des vues qui ne font pas référence à des colonnes de la relation de base ne sont pas automatiquement modifiables." -#: rewrite/rewriteHandler.c:2497 +#: rewrite/rewriteHandler.c:2520 msgid "View columns that refer to system columns are not updatable." msgstr "Les colonnes des vues qui font référence à des colonnes systèmes ne sont pas automatiquement modifiables." -#: rewrite/rewriteHandler.c:2500 +#: rewrite/rewriteHandler.c:2523 msgid "View columns that return whole-row references are not updatable." msgstr "Les colonnes de vue qui font références à des lignes complètes ne sont pas automatiquement modifiables." -#: rewrite/rewriteHandler.c:2561 +#: rewrite/rewriteHandler.c:2584 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Les vues contenant DISTINCT ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2564 +#: rewrite/rewriteHandler.c:2587 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Les vues contenant GROUP BY ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2567 +#: rewrite/rewriteHandler.c:2590 msgid "Views containing HAVING are not automatically updatable." msgstr "Les vues contenant HAVING ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2570 +#: rewrite/rewriteHandler.c:2593 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Les vues contenant UNION, INTERSECT ou EXCEPT ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2573 +#: rewrite/rewriteHandler.c:2596 msgid "Views containing WITH are not automatically updatable." msgstr "Les vues contenant WITH ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2576 +#: rewrite/rewriteHandler.c:2599 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Les vues contenant LIMIT ou OFFSET ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2588 +#: rewrite/rewriteHandler.c:2611 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Les vues qui renvoient des fonctions d'agrégat ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2591 +#: rewrite/rewriteHandler.c:2614 msgid "Views that return window functions are not automatically updatable." msgstr "Les vues qui renvoient des fonctions de fenêtrage ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2594 +#: rewrite/rewriteHandler.c:2617 msgid "Views that return set-returning functions are not automatically updatable." msgstr "Les vues qui renvoient des fonctions à plusieurs lignes ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2601 rewrite/rewriteHandler.c:2605 rewrite/rewriteHandler.c:2613 +#: rewrite/rewriteHandler.c:2624 rewrite/rewriteHandler.c:2628 rewrite/rewriteHandler.c:2636 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "Les vues qui lisent plusieurs tables ou vues ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2616 +#: rewrite/rewriteHandler.c:2639 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Les vues contenant TABLESAMPLE ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2640 +#: rewrite/rewriteHandler.c:2663 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Les vues qui possèdent des colonnes non modifiables ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:3117 +#: rewrite/rewriteHandler.c:3140 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "ne peut pas insérer dans la colonne « %s » de la vue « %s »" -#: rewrite/rewriteHandler.c:3125 +#: rewrite/rewriteHandler.c:3148 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "ne peut pas mettre à jour la colonne « %s » de la vue « %s »" -#: rewrite/rewriteHandler.c:3603 +#: rewrite/rewriteHandler.c:3629 +#, c-format +msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" +msgstr "les règles DO INSTEAD NOTHING ne sont pas supportées par les instructions de modification de données dans WITH" + +#: rewrite/rewriteHandler.c:3640 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "les règles DO INSTEAD NOTHING ne sont pas supportées par les instructions de modification de données dans WITH" -#: rewrite/rewriteHandler.c:3617 +#: rewrite/rewriteHandler.c:3654 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "" "les règles DO INSTEAD conditionnelles ne sont pas supportées par les\n" "instructions de modification de données dans WITH" -#: rewrite/rewriteHandler.c:3621 +#: rewrite/rewriteHandler.c:3658 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "les règles DO ALSO ne sont pas supportées par les instructions de modification de données dans WITH" -#: rewrite/rewriteHandler.c:3626 +#: rewrite/rewriteHandler.c:3663 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "" "les règles DO INSTEAD multi-instructions ne sont pas supportées pour les\n" "instructions de modification de données dans WITH" -#: rewrite/rewriteHandler.c:3826 rewrite/rewriteHandler.c:3834 rewrite/rewriteHandler.c:3842 +#: rewrite/rewriteHandler.c:3863 rewrite/rewriteHandler.c:3871 rewrite/rewriteHandler.c:3879 #, c-format msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "Les vues contenant des règles DO INSTEAD conditionnelles ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:3935 +#: rewrite/rewriteHandler.c:3972 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "ne peut pas exécuter INSERT RETURNING sur la relation « %s »" -#: rewrite/rewriteHandler.c:3937 +#: rewrite/rewriteHandler.c:3974 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "" "Vous avez besoin d'une règle ON INSERT DO INSTEAD sans condition avec une\n" "clause RETURNING." -#: rewrite/rewriteHandler.c:3942 +#: rewrite/rewriteHandler.c:3979 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "ne peut pas exécuter UPDATE RETURNING sur la relation « %s »" -#: rewrite/rewriteHandler.c:3944 +#: rewrite/rewriteHandler.c:3981 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "" "Vous avez besoin d'une règle ON UPDATE DO INSTEAD sans condition avec une\n" "clause RETURNING." -#: rewrite/rewriteHandler.c:3949 +#: rewrite/rewriteHandler.c:3986 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "ne peut pas exécuter DELETE RETURNING sur la relation « %s »" -#: rewrite/rewriteHandler.c:3951 +#: rewrite/rewriteHandler.c:3988 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "" "Vous avez besoin d'une règle ON DELETE DO INSTEAD sans condition avec une\n" "clause RETURNING." -#: rewrite/rewriteHandler.c:3969 +#: rewrite/rewriteHandler.c:4006 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "INSERT avec une clause ON CONFLICT ne peut pas être utilisée avec une table qui a des règles pour INSERT ou UPDATE" -#: rewrite/rewriteHandler.c:4026 +#: rewrite/rewriteHandler.c:4063 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH ne peut pas être utilisé dans une requête réécrite par des règles en plusieurs requêtes" @@ -20391,11 +20372,11 @@ msgstr "commentaire /* non terminé" #: scan.l:478 msgid "unterminated bit string literal" -msgstr "chaîne littérale bit non terminée" +msgstr "chaîne bit litérale non terminée" #: scan.l:492 msgid "unterminated hexadecimal string literal" -msgstr "chaîne littérale hexadécimale non terminée" +msgstr "chaîne hexadécimale litérale non terminée" #: scan.l:542 #, c-format @@ -20517,17 +20498,12 @@ msgstr "paramètre Snowball non reconnu : « %s »" msgid "missing Language parameter" msgstr "paramètre Language manquant" -#: statistics/extended_stats.c:175 +#: statistics/extended_stats.c:178 #, c-format msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "l'objet de statistiques « %s.%s » n'a pas pu être calculé pour la relation « %s.%s »" -#: statistics/extended_stats.c:2277 -#, c-format -msgid "relation \"pg_statistic\" does not have a composite type" -msgstr "la relation « pg_statistic » n'a pas un type composite" - -#: statistics/mcv.c:1371 utils/adt/jsonfuncs.c:1941 +#: statistics/mcv.c:1371 utils/adt/jsonfuncs.c:1943 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "" @@ -20539,41 +20515,46 @@ msgstr "" msgid "cannot access temporary tables of other sessions" msgstr "ne peut pas accéder aux tables temporaires d'autres sessions" -#: storage/buffer/bufmgr.c:917 +#: storage/buffer/bufmgr.c:839 +#, c-format +msgid "cannot extend relation %s beyond %u blocks" +msgstr "ne peut pas étendre la relation %s de plus de %u blocs" + +#: storage/buffer/bufmgr.c:926 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "" "données inattendues après la fin de fichier dans le bloc %u de la relation\n" "%s" -#: storage/buffer/bufmgr.c:919 +#: storage/buffer/bufmgr.c:928 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "" "Ceci s'est déjà vu avec des noyaux buggés ; pensez à mettre à jour votre\n" "système." -#: storage/buffer/bufmgr.c:1018 +#: storage/buffer/bufmgr.c:1027 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "page invalide dans le bloc %u de la relation %s ; remplacement de la page par des zéros" -#: storage/buffer/bufmgr.c:4524 +#: storage/buffer/bufmgr.c:4533 #, c-format msgid "could not write block %u of %s" msgstr "n'a pas pu écrire le bloc %u de %s" -#: storage/buffer/bufmgr.c:4526 +#: storage/buffer/bufmgr.c:4535 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Échecs multiples --- l'erreur d'écriture pourrait être permanente." -#: storage/buffer/bufmgr.c:4547 storage/buffer/bufmgr.c:4566 +#: storage/buffer/bufmgr.c:4556 storage/buffer/bufmgr.c:4575 #, c-format msgid "writing block %u of relation %s" msgstr "écriture du bloc %u de la relation %s" -#: storage/buffer/bufmgr.c:4870 +#: storage/buffer/bufmgr.c:4879 #, c-format msgid "snapshot too old" msgstr "snapshot trop ancien" @@ -20603,7 +20584,7 @@ msgstr "n'a pas pu déterminer la taille du fichier temporaire « %s » à parti msgid "could not delete shared fileset \"%s\": %m" msgstr "n'a pas pu supprimer l'ensemble de fichiers partagés « %s » : %m" -#: storage/file/buffile.c:902 storage/smgr/md.c:306 storage/smgr/md.c:865 +#: storage/file/buffile.c:902 storage/smgr/md.c:306 storage/smgr/md.c:866 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "n'a pas pu tronquer le fichier « %s » : %m" @@ -20628,95 +20609,90 @@ msgstr "n'a pas exécuter munmap() durant la synchronisation des données : %m" msgid "could not link file \"%s\" to \"%s\": %m" msgstr "n'a pas pu lier le fichier « %s » à « %s » : %m" -#: storage/file/fd.c:929 +#: storage/file/fd.c:931 #, c-format msgid "getrlimit failed: %m" msgstr "échec de getrlimit : %m" -#: storage/file/fd.c:1019 +#: storage/file/fd.c:1021 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "nombre de descripteurs de fichier insuffisant pour lancer le processus serveur" -#: storage/file/fd.c:1020 +#: storage/file/fd.c:1022 #, c-format msgid "System allows %d, we need at least %d." msgstr "Le système autorise %d, nous avons besoin d'au moins %d." -#: storage/file/fd.c:1071 storage/file/fd.c:2408 storage/file/fd.c:2518 storage/file/fd.c:2669 +#: storage/file/fd.c:1073 storage/file/fd.c:2410 storage/file/fd.c:2520 storage/file/fd.c:2671 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "plus de descripteurs de fichiers : %m; quittez et ré-essayez" -#: storage/file/fd.c:1445 +#: storage/file/fd.c:1447 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "fichier temporaire : chemin « %s », taille %lu" -#: storage/file/fd.c:1576 +#: storage/file/fd.c:1578 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "ne peut pas créer le répertoire temporaire « %s » : %m" -#: storage/file/fd.c:1583 +#: storage/file/fd.c:1585 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "ne peut pas créer le sous-répertoire temporaire « %s » : %m" -#: storage/file/fd.c:1776 +#: storage/file/fd.c:1778 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "n'a pas pu créer le fichier temporaire « %s » : %m" -#: storage/file/fd.c:1810 +#: storage/file/fd.c:1812 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier temporaire « %s » : %m" -#: storage/file/fd.c:1851 +#: storage/file/fd.c:1853 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "n'a pas pu supprimer le fichier temporaire « %s » : %m" -#: storage/file/fd.c:1939 +#: storage/file/fd.c:1941 #, c-format msgid "could not delete file \"%s\": %m" msgstr "n'a pas pu supprimer le fichier « %s » : %m" -#: storage/file/fd.c:2119 +#: storage/file/fd.c:2121 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "la taille du fichier temporaire dépasse temp_file_limit (%d Ko)" -#: storage/file/fd.c:2384 storage/file/fd.c:2443 +#: storage/file/fd.c:2386 storage/file/fd.c:2445 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "dépassement de maxAllocatedDescs (%d) lors de la tentative d'ouverture du fichier « %s »" -#: storage/file/fd.c:2488 +#: storage/file/fd.c:2490 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "dépassement de maxAllocatedDescs (%d) lors de la tentative d'exécution de la commande « %s »" -#: storage/file/fd.c:2645 +#: storage/file/fd.c:2647 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "dépassement de maxAllocatedDescs (%d) lors de la tentative d'ouverture du répertoire « %s »" -#: storage/file/fd.c:3175 +#: storage/file/fd.c:3177 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "fichier non attendu dans le répertoire des fichiers temporaires : « %s »" -#: storage/file/fd.c:3298 -#, c-format -msgid "could not open %s: %m" -msgstr "n'a pas pu ouvrir %s : %m" - -#: storage/file/fd.c:3304 +#: storage/file/fd.c:3306 #, c-format -msgid "could not sync filesystem for \"%s\": %m" -msgstr "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour « %s » : %m" +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour le fichier « %s » : %m" #: storage/file/sharedfileset.c:144 #, c-format @@ -20788,17 +20764,17 @@ msgstr "n'a pas pu fermer le segment de mémoire partagée « %s » : %m" msgid "could not duplicate handle for \"%s\": %m" msgstr "n'a pas pu dupliquer le lien pour « %s » : %m" -#: storage/ipc/procarray.c:3747 +#: storage/ipc/procarray.c:3807 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "la base de données « %s » est utilisée par des transactions préparées." -#: storage/ipc/procarray.c:3779 storage/ipc/signalfuncs.c:219 +#: storage/ipc/procarray.c:3839 storage/ipc/signalfuncs.c:221 #, c-format msgid "must be a superuser to terminate superuser process" msgstr "doit être super-utilisateur pour terminer le processus d'un super-utilisateur" -#: storage/ipc/procarray.c:3786 storage/ipc/signalfuncs.c:224 +#: storage/ipc/procarray.c:3846 storage/ipc/signalfuncs.c:226 #, c-format msgid "must be a member of the role whose process is being terminated or member of pg_signal_backend" msgstr "doit être un membre du rôle dont le processus est en cours d'arrêt ou membre de pg_signal_backend" @@ -20813,7 +20789,7 @@ msgstr "ne peut pas envoyer un message de taille %zu via la queue en mémoire pa msgid "invalid message size %zu in shared memory queue" msgstr "taille %zu invalide pour le message dans la queue de mémoire partagée" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:981 storage/lmgr/lock.c:1019 storage/lmgr/lock.c:2844 storage/lmgr/lock.c:4173 storage/lmgr/lock.c:4238 storage/lmgr/lock.c:4545 storage/lmgr/predicate.c:2470 storage/lmgr/predicate.c:2485 storage/lmgr/predicate.c:3967 storage/lmgr/predicate.c:5078 utils/hash/dynahash.c:1112 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:981 storage/lmgr/lock.c:1019 storage/lmgr/lock.c:2844 storage/lmgr/lock.c:4258 storage/lmgr/lock.c:4323 storage/lmgr/lock.c:4673 storage/lmgr/predicate.c:2470 storage/lmgr/predicate.c:2485 storage/lmgr/predicate.c:3967 storage/lmgr/predicate.c:5078 utils/hash/dynahash.c:1112 #, c-format msgid "out of shared memory" msgstr "mémoire partagée épuisée" @@ -20870,26 +20846,28 @@ msgstr "n'a pas pu vérifier l'existence du processus serveur de PID %d : %m" #: storage/ipc/signalfuncs.c:183 #, c-format -msgid "backend with PID %d did not terminate within %lld milliseconds" -msgstr "le processus serveur de PID %d ne s'est pas terminé dans les %lld secondes" +msgid "backend with PID %d did not terminate within %lld millisecond" +msgid_plural "backend with PID %d did not terminate within %lld milliseconds" +msgstr[0] "le processus serveur de PID %d ne s'est pas terminé en %lld seconde" +msgstr[1] "le processus serveur de PID %d ne s'est pas terminé en %lld secondes" -#: storage/ipc/signalfuncs.c:212 +#: storage/ipc/signalfuncs.c:214 #, c-format msgid "\"timeout\" must not be negative" msgstr "« timeout » ne doit pas être négatif" -#: storage/ipc/signalfuncs.c:264 +#: storage/ipc/signalfuncs.c:266 #, c-format msgid "must be superuser to rotate log files with adminpack 1.0" msgstr "doit être super-utilisateur pour exécuter la rotation des journaux applicatifs avec adminpack 1.0" #. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:266 utils/adt/genfile.c:255 +#: storage/ipc/signalfuncs.c:268 utils/adt/genfile.c:255 #, c-format msgid "Consider using %s, which is part of core, instead." msgstr "Considérer l'utilisation de %s, qui fait partie de l'installation par défaut, à la place." -#: storage/ipc/signalfuncs.c:272 storage/ipc/signalfuncs.c:292 +#: storage/ipc/signalfuncs.c:274 storage/ipc/signalfuncs.c:294 #, c-format msgid "rotation not possible because log collection not active" msgstr "rotation impossible car la récupération des journaux applicatifs n'est pas activée" @@ -20914,31 +20892,31 @@ msgstr "annulation de la requête à cause d'un conflit avec la restauration" msgid "User transaction caused buffer deadlock with recovery." msgstr "La transaction de l'utilisateur causait un verrou mortel lors de la restauration." -#: storage/ipc/standby.c:1421 +#: storage/ipc/standby.c:1423 msgid "unknown reason" msgstr "raison inconnue" -#: storage/ipc/standby.c:1426 +#: storage/ipc/standby.c:1428 msgid "recovery conflict on buffer pin" -msgstr "" +msgstr "conflit de restauration sur un verrou de tampon" -#: storage/ipc/standby.c:1429 +#: storage/ipc/standby.c:1431 msgid "recovery conflict on lock" msgstr "conflit de restauration sur le verrou" -#: storage/ipc/standby.c:1432 +#: storage/ipc/standby.c:1434 msgid "recovery conflict on tablespace" msgstr "conflit lors de la restauration sur un tablespace" -#: storage/ipc/standby.c:1435 +#: storage/ipc/standby.c:1437 msgid "recovery conflict on snapshot" -msgstr "" +msgstr "conflit de restauration sur une image" -#: storage/ipc/standby.c:1438 +#: storage/ipc/standby.c:1440 msgid "recovery conflict on buffer deadlock" -msgstr "" +msgstr "conflit de restauration sur un deadlock de tampon" -#: storage/ipc/standby.c:1441 +#: storage/ipc/standby.c:1443 msgid "recovery conflict on database" msgstr "conflit de restauration sur la base de données" @@ -20947,17 +20925,17 @@ msgstr "conflit de restauration sur la base de données" msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" msgstr "l'entrée du Large Object d'OID %u, en page %d, a une taille de champ de données invalide, %d" -#: storage/large_object/inv_api.c:272 +#: storage/large_object/inv_api.c:274 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "drapeaux invalides pour l'ouverture d'un « Large Object » : %d" -#: storage/large_object/inv_api.c:462 +#: storage/large_object/inv_api.c:457 #, c-format msgid "invalid whence setting: %d" msgstr "paramétrage de « whence » invalide : %d" -#: storage/large_object/inv_api.c:634 +#: storage/large_object/inv_api.c:629 #, c-format msgid "invalid large object write request size: %d" msgstr "taille de la requête d'écriture du « Large Object » invalide : %d" @@ -21022,62 +21000,62 @@ msgstr "lors de la re-vérification de l'enregistrement mis à jour (%u,%u) dans msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "lors de la vérification de la contrainte d'exclusion sur l'enregistrement (%u,%u) dans la relation « %s »" -#: storage/lmgr/lmgr.c:1106 +#: storage/lmgr/lmgr.c:1107 #, c-format msgid "relation %u of database %u" msgstr "relation %u de la base de données %u" -#: storage/lmgr/lmgr.c:1112 +#: storage/lmgr/lmgr.c:1113 #, c-format msgid "extension of relation %u of database %u" msgstr "extension de la relation %u de la base de données %u" -#: storage/lmgr/lmgr.c:1118 +#: storage/lmgr/lmgr.c:1119 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid de la base %u" -#: storage/lmgr/lmgr.c:1123 +#: storage/lmgr/lmgr.c:1124 #, c-format msgid "page %u of relation %u of database %u" msgstr "page %u de la relation %u de la base de données %u" -#: storage/lmgr/lmgr.c:1130 +#: storage/lmgr/lmgr.c:1131 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "ligne (%u,%u) de la relation %u de la base de données %u" -#: storage/lmgr/lmgr.c:1138 +#: storage/lmgr/lmgr.c:1139 #, c-format msgid "transaction %u" msgstr "transaction %u" -#: storage/lmgr/lmgr.c:1143 +#: storage/lmgr/lmgr.c:1144 #, c-format msgid "virtual transaction %d/%u" msgstr "transaction virtuelle %d/%u" -#: storage/lmgr/lmgr.c:1149 +#: storage/lmgr/lmgr.c:1150 #, c-format msgid "speculative token %u of transaction %u" msgstr "jeton spéculatif %u de la transaction %u" -#: storage/lmgr/lmgr.c:1155 +#: storage/lmgr/lmgr.c:1156 #, c-format msgid "object %u of class %u of database %u" msgstr "objet %u de la classe %u de la base de données %u" -#: storage/lmgr/lmgr.c:1163 +#: storage/lmgr/lmgr.c:1164 #, c-format msgid "user lock [%u,%u,%u]" msgstr "verrou utilisateur [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1170 +#: storage/lmgr/lmgr.c:1171 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "verrou informatif [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1178 +#: storage/lmgr/lmgr.c:1179 #, c-format msgid "unrecognized locktag type %d" msgstr "type locktag non reconnu %d" @@ -21096,12 +21074,12 @@ msgstr "" "Seuls RowExclusiveLock et les verrous inférieurs peuvent être acquis sur les\n" "objets d'une base pendant une restauration." -#: storage/lmgr/lock.c:982 storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 storage/lmgr/lock.c:4174 storage/lmgr/lock.c:4239 storage/lmgr/lock.c:4546 +#: storage/lmgr/lock.c:982 storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 storage/lmgr/lock.c:4259 storage/lmgr/lock.c:4324 storage/lmgr/lock.c:4674 #, c-format msgid "You might need to increase max_locks_per_transaction." msgstr "Vous pourriez avoir besoin d'augmenter max_locks_per_transaction." -#: storage/lmgr/lock.c:3283 storage/lmgr/lock.c:3399 +#: storage/lmgr/lock.c:3300 storage/lmgr/lock.c:3368 storage/lmgr/lock.c:3484 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" msgstr "ne peut pas utiliser PREPARE lorsque des verrous de niveau session et deniveau transaction sont détenus sur le même objet" @@ -21228,76 +21206,76 @@ msgstr "longueurs d'élément corrompues : total %u, espace disponible %u" msgid "corrupted line pointer: offset = %u, size = %u" msgstr "pointeur de ligne corrompu : décalage = %u, taille = %u" -#: storage/smgr/md.c:434 +#: storage/smgr/md.c:435 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "ne peut pas étendre le fichier « %s » de plus de %u blocs" -#: storage/smgr/md.c:449 +#: storage/smgr/md.c:450 #, c-format msgid "could not extend file \"%s\": %m" msgstr "n'a pas pu étendre le fichier « %s » : %m" -#: storage/smgr/md.c:451 storage/smgr/md.c:458 storage/smgr/md.c:746 +#: storage/smgr/md.c:452 storage/smgr/md.c:459 storage/smgr/md.c:747 #, c-format msgid "Check free disk space." msgstr "Vérifiez l'espace disque disponible." -#: storage/smgr/md.c:455 +#: storage/smgr/md.c:456 #, c-format msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgstr "" "n'a pas pu étendre le fichier « %s » : a écrit seulement %d octets sur %d\n" "au bloc %u" -#: storage/smgr/md.c:667 +#: storage/smgr/md.c:668 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "n'a pas pu lire le bloc %u dans le fichier « %s » : %m" -#: storage/smgr/md.c:683 +#: storage/smgr/md.c:684 #, c-format msgid "could not read block %u in file \"%s\": read only %d of %d bytes" msgstr "" "n'a pas pu lire le bloc %u du fichier « %s » : a lu seulement %d octets\n" "sur %d" -#: storage/smgr/md.c:737 +#: storage/smgr/md.c:738 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "n'a pas pu écrire le bloc %u dans le fichier « %s » : %m" -#: storage/smgr/md.c:742 +#: storage/smgr/md.c:743 #, c-format msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" msgstr "" "n'a pas pu écrire le bloc %u du fichier « %s » : a seulement écrit %d\n" "octets sur %d" -#: storage/smgr/md.c:836 +#: storage/smgr/md.c:837 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "n'a pas pu tronquer le fichier « %s » en %u blocs : il y a seulement %u blocs" -#: storage/smgr/md.c:891 +#: storage/smgr/md.c:892 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "n'a pas pu tronquer le fichier « %s » en %u blocs : %m" -#: storage/smgr/md.c:1285 +#: storage/smgr/md.c:1286 #, c-format msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" msgstr "n'a pas pu ouvrir le fichier « %s » (bloc cible %u) : le segment précédent ne fait que %u blocs" -#: storage/smgr/md.c:1299 +#: storage/smgr/md.c:1300 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "n'a pas pu ouvrir le fichier « %s » (bloc cible %u) : %m" #: tcop/fastpath.c:148 #, c-format -msgid "cannot call function %s via fastpath interface" -msgstr "ne peut pas appeler la fonction %s via l'interface fastpath" +msgid "cannot call function \"%s\" via fastpath interface" +msgstr "ne peut pas appeler la fonction « %s » via l'interface fastpath" #: tcop/fastpath.c:233 #, c-format @@ -21645,17 +21623,17 @@ msgstr "" "déconnexion : durée de la session : %d:%02d:%02d.%03d\n" "utilisateur=%s base=%s hôte=%s%s%s" -#: tcop/pquery.c:636 +#: tcop/pquery.c:638 #, c-format msgid "bind message has %d result formats but query has %d columns" msgstr "le message bind a %d formats de résultat mais la requête a %d colonnes" -#: tcop/pquery.c:939 +#: tcop/pquery.c:941 tcop/pquery.c:1703 #, c-format msgid "cursor can only scan forward" msgstr "le curseur peut seulement parcourir en avant" -#: tcop/pquery.c:940 +#: tcop/pquery.c:942 tcop/pquery.c:1704 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Déclarez-le avec l'option SCROLL pour activer le parcours inverse." @@ -21686,7 +21664,13 @@ msgstr "" "ne peut pas exécuter %s à l'intérieur d'une fonction restreinte\n" "pour sécurité" -#: tcop/utility.c:928 +#. translator: %s is name of a SQL command, eg LISTEN +#: tcop/utility.c:820 +#, c-format +msgid "cannot execute %s within a background process" +msgstr "ne peut pas exécuter %s dans un processus en tâche de fond" + +#: tcop/utility.c:945 #, c-format msgid "must be superuser to do CHECKPOINT" msgstr "doit être super-utilisateur pour exécuter un point de vérification (CHECKPOINT)" @@ -22050,7 +22034,7 @@ msgstr "la fonction « %s » n'existe pas" msgid "must be member of role \"%s\"" msgstr "doit être un membre du rôle « %s »" -#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:935 utils/adt/arrayfuncs.c:1543 utils/adt/arrayfuncs.c:3262 utils/adt/arrayfuncs.c:3404 utils/adt/arrayfuncs.c:5945 utils/adt/arrayfuncs.c:6286 utils/adt/arrayutils.c:94 utils/adt/arrayutils.c:103 utils/adt/arrayutils.c:110 +#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:936 utils/adt/arrayfuncs.c:1544 utils/adt/arrayfuncs.c:3263 utils/adt/arrayfuncs.c:3405 utils/adt/arrayfuncs.c:5980 utils/adt/arrayfuncs.c:6321 utils/adt/arrayutils.c:94 utils/adt/arrayutils.c:103 utils/adt/arrayutils.c:110 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "la taille du tableau dépasse le maximum permis (%d)" @@ -22065,7 +22049,7 @@ msgstr "n'a pas pu déterminer le type de données date en entrée" msgid "input data type is not an array" msgstr "le type de données en entrée n'est pas un tableau" -#: utils/adt/array_userfuncs.c:129 utils/adt/array_userfuncs.c:181 utils/adt/float.c:1233 utils/adt/float.c:1307 utils/adt/float.c:4052 utils/adt/float.c:4066 utils/adt/int.c:757 utils/adt/int.c:779 utils/adt/int.c:793 utils/adt/int.c:807 utils/adt/int.c:838 utils/adt/int.c:859 utils/adt/int.c:976 utils/adt/int.c:990 utils/adt/int.c:1004 utils/adt/int.c:1037 utils/adt/int.c:1051 utils/adt/int.c:1065 utils/adt/int.c:1096 utils/adt/int.c:1178 utils/adt/int.c:1242 utils/adt/int.c:1310 utils/adt/int.c:1316 utils/adt/int8.c:1299 utils/adt/numeric.c:1776 utils/adt/numeric.c:4207 utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1121 utils/adt/varlena.c:3433 +#: utils/adt/array_userfuncs.c:129 utils/adt/array_userfuncs.c:181 utils/adt/float.c:1233 utils/adt/float.c:1307 utils/adt/float.c:4052 utils/adt/float.c:4066 utils/adt/int.c:757 utils/adt/int.c:779 utils/adt/int.c:793 utils/adt/int.c:807 utils/adt/int.c:838 utils/adt/int.c:859 utils/adt/int.c:976 utils/adt/int.c:990 utils/adt/int.c:1004 utils/adt/int.c:1037 utils/adt/int.c:1051 utils/adt/int.c:1065 utils/adt/int.c:1096 utils/adt/int.c:1178 utils/adt/int.c:1242 utils/adt/int.c:1310 utils/adt/int.c:1316 utils/adt/int8.c:1299 utils/adt/numeric.c:1768 utils/adt/numeric.c:4203 utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1114 utils/adt/varlena.c:3426 #, c-format msgid "integer out of range" msgstr "entier en dehors des limites" @@ -22110,224 +22094,224 @@ msgstr "la recherche d'éléments dans des tableaux multidimensionnels n'est pas msgid "initial position must not be null" msgstr "la position initiale ne doit pas être NULL" -#: utils/adt/arrayfuncs.c:270 utils/adt/arrayfuncs.c:284 utils/adt/arrayfuncs.c:295 utils/adt/arrayfuncs.c:317 utils/adt/arrayfuncs.c:332 utils/adt/arrayfuncs.c:346 utils/adt/arrayfuncs.c:352 utils/adt/arrayfuncs.c:359 utils/adt/arrayfuncs.c:492 utils/adt/arrayfuncs.c:508 utils/adt/arrayfuncs.c:519 utils/adt/arrayfuncs.c:534 utils/adt/arrayfuncs.c:555 utils/adt/arrayfuncs.c:585 utils/adt/arrayfuncs.c:592 utils/adt/arrayfuncs.c:600 utils/adt/arrayfuncs.c:634 utils/adt/arrayfuncs.c:657 utils/adt/arrayfuncs.c:677 utils/adt/arrayfuncs.c:789 utils/adt/arrayfuncs.c:798 utils/adt/arrayfuncs.c:828 utils/adt/arrayfuncs.c:843 utils/adt/arrayfuncs.c:896 +#: utils/adt/arrayfuncs.c:271 utils/adt/arrayfuncs.c:285 utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:318 utils/adt/arrayfuncs.c:333 utils/adt/arrayfuncs.c:347 utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 utils/adt/arrayfuncs.c:493 utils/adt/arrayfuncs.c:509 utils/adt/arrayfuncs.c:520 utils/adt/arrayfuncs.c:535 utils/adt/arrayfuncs.c:556 utils/adt/arrayfuncs.c:586 utils/adt/arrayfuncs.c:593 utils/adt/arrayfuncs.c:601 utils/adt/arrayfuncs.c:635 utils/adt/arrayfuncs.c:658 utils/adt/arrayfuncs.c:678 utils/adt/arrayfuncs.c:790 utils/adt/arrayfuncs.c:799 utils/adt/arrayfuncs.c:829 utils/adt/arrayfuncs.c:844 utils/adt/arrayfuncs.c:897 #, c-format msgid "malformed array literal: \"%s\"" msgstr "tableau litéral mal formé : « %s »" -#: utils/adt/arrayfuncs.c:271 +#: utils/adt/arrayfuncs.c:272 #, c-format msgid "\"[\" must introduce explicitly-specified array dimensions." msgstr "« [ » doit introduire des dimensions explicites de tableau." -#: utils/adt/arrayfuncs.c:285 +#: utils/adt/arrayfuncs.c:286 #, c-format msgid "Missing array dimension value." msgstr "Valeur manquante de la dimension du tableau." -#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:333 +#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "« %s » manquant après les dimensions du tableau." -#: utils/adt/arrayfuncs.c:305 utils/adt/arrayfuncs.c:2909 utils/adt/arrayfuncs.c:2941 utils/adt/arrayfuncs.c:2956 +#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2910 utils/adt/arrayfuncs.c:2942 utils/adt/arrayfuncs.c:2957 #, c-format msgid "upper bound cannot be less than lower bound" msgstr "la limite supérieure ne peut pas être plus petite que la limite inférieure" -#: utils/adt/arrayfuncs.c:318 +#: utils/adt/arrayfuncs.c:319 #, c-format msgid "Array value must start with \"{\" or dimension information." msgstr "La valeur du tableau doit commencer par « { » ou par l'information de la dimension." -#: utils/adt/arrayfuncs.c:347 +#: utils/adt/arrayfuncs.c:348 #, c-format msgid "Array contents must start with \"{\"." msgstr "Le contenu du tableau doit commencer par « { »." -#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 +#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 #, c-format msgid "Specified array dimensions do not match array contents." msgstr "Les dimensions spécifiées du tableau ne correspondent pas au contenu du tableau." -#: utils/adt/arrayfuncs.c:493 utils/adt/arrayfuncs.c:520 utils/adt/multirangetypes.c:162 utils/adt/rangetypes.c:2310 utils/adt/rangetypes.c:2318 utils/adt/rowtypes.c:211 utils/adt/rowtypes.c:219 +#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:521 utils/adt/multirangetypes.c:163 utils/adt/rangetypes.c:2310 utils/adt/rangetypes.c:2318 utils/adt/rowtypes.c:211 utils/adt/rowtypes.c:219 #, c-format msgid "Unexpected end of input." msgstr "Fin de l'entrée inattendue." -#: utils/adt/arrayfuncs.c:509 utils/adt/arrayfuncs.c:556 utils/adt/arrayfuncs.c:586 utils/adt/arrayfuncs.c:635 +#: utils/adt/arrayfuncs.c:510 utils/adt/arrayfuncs.c:557 utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 #, c-format msgid "Unexpected \"%c\" character." msgstr "Caractère « %c » inattendu." -#: utils/adt/arrayfuncs.c:535 utils/adt/arrayfuncs.c:658 +#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 #, c-format msgid "Unexpected array element." msgstr "Élément de tableau inattendu." -#: utils/adt/arrayfuncs.c:593 +#: utils/adt/arrayfuncs.c:594 #, c-format msgid "Unmatched \"%c\" character." msgstr "Caractère « %c » sans correspondance." -#: utils/adt/arrayfuncs.c:601 utils/adt/jsonfuncs.c:2593 +#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2595 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "Les tableaux multidimensionnels doivent avoir des sous-tableaux avec les dimensions correspondantes" -#: utils/adt/arrayfuncs.c:678 +#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:286 #, c-format msgid "Junk after closing right brace." msgstr "Problème après la parenthèse droite fermante." -#: utils/adt/arrayfuncs.c:1300 utils/adt/arrayfuncs.c:3370 utils/adt/arrayfuncs.c:5849 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3371 utils/adt/arrayfuncs.c:5884 #, c-format msgid "invalid number of dimensions: %d" msgstr "nombre de dimensions invalide : %d" -#: utils/adt/arrayfuncs.c:1311 +#: utils/adt/arrayfuncs.c:1312 #, c-format msgid "invalid array flags" msgstr "drapeaux de tableau invalides" -#: utils/adt/arrayfuncs.c:1333 +#: utils/adt/arrayfuncs.c:1334 #, c-format msgid "binary data has array element type %u (%s) instead of expected %u (%s)" -msgstr "" +msgstr "la donnée binaire a le type des éléments du tableau, %u (%s), au lieu de l'attendu %u (%s)" -#: utils/adt/arrayfuncs.c:1377 utils/adt/multirangetypes.c:443 utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2905 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:444 utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2905 #, c-format msgid "no binary input function available for type %s" msgstr "aucune fonction d'entrée binaire disponible pour le type %s" -#: utils/adt/arrayfuncs.c:1517 +#: utils/adt/arrayfuncs.c:1518 #, c-format msgid "improper binary format in array element %d" msgstr "format binaire mal conçu dans l'élément du tableau %d" -#: utils/adt/arrayfuncs.c:1598 utils/adt/multirangetypes.c:448 utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2938 +#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:449 utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2938 #, c-format msgid "no binary output function available for type %s" msgstr "aucune fonction de sortie binaire disponible pour le type %s" -#: utils/adt/arrayfuncs.c:2077 +#: utils/adt/arrayfuncs.c:2078 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "les morceaux des tableaux à longueur fixe ne sont pas implémentés" -#: utils/adt/arrayfuncs.c:2255 utils/adt/arrayfuncs.c:2277 utils/adt/arrayfuncs.c:2326 utils/adt/arrayfuncs.c:2565 utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5835 utils/adt/arrayfuncs.c:5861 utils/adt/arrayfuncs.c:5872 utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4427 utils/adt/jsonfuncs.c:4580 utils/adt/jsonfuncs.c:4692 utils/adt/jsonfuncs.c:4741 +#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2566 utils/adt/arrayfuncs.c:2888 utils/adt/arrayfuncs.c:5870 utils/adt/arrayfuncs.c:5896 utils/adt/arrayfuncs.c:5907 utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4429 utils/adt/jsonfuncs.c:4582 utils/adt/jsonfuncs.c:4694 utils/adt/jsonfuncs.c:4743 #, c-format msgid "wrong number of array subscripts" msgstr "mauvais nombre d'indices du tableau" -#: utils/adt/arrayfuncs.c:2260 utils/adt/arrayfuncs.c:2368 utils/adt/arrayfuncs.c:2632 utils/adt/arrayfuncs.c:2946 +#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 utils/adt/arrayfuncs.c:2633 utils/adt/arrayfuncs.c:2947 #, c-format msgid "array subscript out of range" msgstr "indice du tableau en dehors de l'intervalle" -#: utils/adt/arrayfuncs.c:2265 +#: utils/adt/arrayfuncs.c:2266 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "ne peut pas affecter une valeur NULL à un élément d'un tableau à longueur fixe" -#: utils/adt/arrayfuncs.c:2834 +#: utils/adt/arrayfuncs.c:2835 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "" "les mises à jour de morceaux des tableaux à longueur fixe ne sont pas\n" "implémentées" -#: utils/adt/arrayfuncs.c:2865 +#: utils/adt/arrayfuncs.c:2866 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "la tranche d'indice de tableau doit fournir les deux limites" -#: utils/adt/arrayfuncs.c:2866 +#: utils/adt/arrayfuncs.c:2867 #, c-format msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." msgstr "Les limites de tranches doivent être entièrement spécifiées lors de l'assignation d'une valeur d'un tableau vide à une tranche." -#: utils/adt/arrayfuncs.c:2877 utils/adt/arrayfuncs.c:2973 +#: utils/adt/arrayfuncs.c:2878 utils/adt/arrayfuncs.c:2974 #, c-format msgid "source array too small" msgstr "tableau source trop petit" -#: utils/adt/arrayfuncs.c:3528 +#: utils/adt/arrayfuncs.c:3529 #, c-format msgid "null array element not allowed in this context" msgstr "élément NULL de tableau interdit dans ce contexte" -#: utils/adt/arrayfuncs.c:3630 utils/adt/arrayfuncs.c:3801 utils/adt/arrayfuncs.c:4157 +#: utils/adt/arrayfuncs.c:3631 utils/adt/arrayfuncs.c:3802 utils/adt/arrayfuncs.c:4192 #, c-format msgid "cannot compare arrays of different element types" msgstr "ne peut pas comparer des tableaux ayant des types d'éléments différents" -#: utils/adt/arrayfuncs.c:3979 utils/adt/multirangetypes.c:2670 utils/adt/multirangetypes.c:2742 utils/adt/rangetypes.c:1343 utils/adt/rangetypes.c:1407 utils/adt/rowtypes.c:1858 +#: utils/adt/arrayfuncs.c:3980 utils/adt/multirangetypes.c:2742 utils/adt/multirangetypes.c:2814 utils/adt/rangetypes.c:1343 utils/adt/rangetypes.c:1407 utils/adt/rowtypes.c:1858 #, c-format msgid "could not identify a hash function for type %s" msgstr "n'a pas pu identifier une fonction de hachage pour le type %s" -#: utils/adt/arrayfuncs.c:4072 utils/adt/rowtypes.c:1979 +#: utils/adt/arrayfuncs.c:4107 utils/adt/rowtypes.c:1979 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "n'a pas pu identifier une fonction de hachage étendue pour le type %s" -#: utils/adt/arrayfuncs.c:5249 +#: utils/adt/arrayfuncs.c:5284 #, c-format msgid "data type %s is not an array type" msgstr "le type de données %s n'est pas un type tableau" -#: utils/adt/arrayfuncs.c:5304 +#: utils/adt/arrayfuncs.c:5339 #, c-format msgid "cannot accumulate null arrays" msgstr "ne peut pas accumuler des tableaux NULL" -#: utils/adt/arrayfuncs.c:5332 +#: utils/adt/arrayfuncs.c:5367 #, c-format msgid "cannot accumulate empty arrays" msgstr "ne peut pas concaténer des tableaux vides" -#: utils/adt/arrayfuncs.c:5359 utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:5394 utils/adt/arrayfuncs.c:5400 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "ne peut pas accumuler des tableaux de dimensions différentes" -#: utils/adt/arrayfuncs.c:5733 utils/adt/arrayfuncs.c:5773 +#: utils/adt/arrayfuncs.c:5768 utils/adt/arrayfuncs.c:5808 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "la dimension ou la limite basse du tableau ne peut pas être NULL" -#: utils/adt/arrayfuncs.c:5836 utils/adt/arrayfuncs.c:5862 +#: utils/adt/arrayfuncs.c:5871 utils/adt/arrayfuncs.c:5897 #, c-format msgid "Dimension array must be one dimensional." msgstr "Le tableau doit avoir une seule dimension." -#: utils/adt/arrayfuncs.c:5841 utils/adt/arrayfuncs.c:5867 +#: utils/adt/arrayfuncs.c:5876 utils/adt/arrayfuncs.c:5902 #, c-format msgid "dimension values cannot be null" msgstr "les valeurs de dimension ne peuvent pas être NULL" -#: utils/adt/arrayfuncs.c:5873 +#: utils/adt/arrayfuncs.c:5908 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "La limite basse du tableau a une taille différentes des dimensions du tableau." -#: utils/adt/arrayfuncs.c:6151 +#: utils/adt/arrayfuncs.c:6186 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "la suppression d'éléments de tableaux multidimensionnels n'est pas supportée" -#: utils/adt/arrayfuncs.c:6428 +#: utils/adt/arrayfuncs.c:6463 #, c-format msgid "thresholds must be one-dimensional array" msgstr "les limites doivent être un tableau à une dimension" -#: utils/adt/arrayfuncs.c:6433 +#: utils/adt/arrayfuncs.c:6468 #, c-format msgid "thresholds array must not contain NULLs" msgstr "le tableau de limites ne doit pas contenir de valeurs NULL" -#: utils/adt/arrayfuncs.c:6666 +#: utils/adt/arrayfuncs.c:6701 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "le nombre d'éléments à couper doit être compris entre 0 et %d" @@ -22345,7 +22329,7 @@ msgstr "l'indice du tableau dans l'affectation ne doit pas être NULL" #: utils/adt/arrayutils.c:140 #, c-format msgid "array lower bound is too large: %d" -msgstr "" +msgstr "la limite basse du tableau est trop grande : %d" #: utils/adt/arrayutils.c:240 #, c-format @@ -22369,7 +22353,7 @@ msgstr "la conversion de l'encodage de %s vers l'ASCII n'est pas supportée" #. translator: first %s is inet or cidr #: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:3802 utils/adt/float.c:187 utils/adt/float.c:271 utils/adt/float.c:283 utils/adt/float.c:400 utils/adt/float.c:485 utils/adt/float.c:501 utils/adt/geo_ops.c:220 utils/adt/geo_ops.c:230 utils/adt/geo_ops.c:242 utils/adt/geo_ops.c:274 utils/adt/geo_ops.c:316 utils/adt/geo_ops.c:326 utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1389 utils/adt/geo_ops.c:1424 utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3488 utils/adt/geo_ops.c:4657 utils/adt/geo_ops.c:4672 utils/adt/geo_ops.c:4679 utils/adt/int8.c:126 utils/adt/jsonpath.c:182 utils/adt/mac.c:94 utils/adt/mac8.c:93 utils/adt/mac8.c:166 utils/adt/mac8.c:184 -#: utils/adt/mac8.c:202 utils/adt/mac8.c:221 utils/adt/network.c:100 utils/adt/numeric.c:702 utils/adt/numeric.c:721 utils/adt/numeric.c:6861 utils/adt/numeric.c:6885 utils/adt/numeric.c:6909 utils/adt/numeric.c:7878 utils/adt/numutils.c:116 utils/adt/numutils.c:126 utils/adt/numutils.c:170 utils/adt/numutils.c:246 utils/adt/numutils.c:322 utils/adt/oid.c:44 utils/adt/oid.c:58 utils/adt/oid.c:64 utils/adt/oid.c:86 utils/adt/pg_lsn.c:74 utils/adt/tid.c:76 utils/adt/tid.c:84 utils/adt/tid.c:92 utils/adt/timestamp.c:496 utils/adt/uuid.c:136 utils/adt/xid8funcs.c:346 +#: utils/adt/mac8.c:202 utils/adt/mac8.c:221 utils/adt/network.c:100 utils/adt/numeric.c:694 utils/adt/numeric.c:713 utils/adt/numeric.c:6858 utils/adt/numeric.c:6882 utils/adt/numeric.c:6906 utils/adt/numeric.c:7864 utils/adt/numutils.c:116 utils/adt/numutils.c:126 utils/adt/numutils.c:170 utils/adt/numutils.c:246 utils/adt/numutils.c:322 utils/adt/oid.c:44 utils/adt/oid.c:58 utils/adt/oid.c:64 utils/adt/oid.c:86 utils/adt/pg_lsn.c:74 utils/adt/tid.c:76 utils/adt/tid.c:84 utils/adt/tid.c:92 utils/adt/timestamp.c:496 utils/adt/uuid.c:136 utils/adt/xid8funcs.c:346 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "syntaxe en entrée invalide pour le type %s : « %s »" @@ -22379,7 +22363,7 @@ msgstr "syntaxe en entrée invalide pour le type %s : « %s »" msgid "value \"%s\" is out of range for type %s" msgstr "la valeur « %s » est en dehors des limites pour le type %s" -#: utils/adt/cash.c:652 utils/adt/cash.c:702 utils/adt/cash.c:753 utils/adt/cash.c:802 utils/adt/cash.c:854 utils/adt/cash.c:904 utils/adt/float.c:104 utils/adt/int.c:822 utils/adt/int.c:938 utils/adt/int.c:1018 utils/adt/int.c:1080 utils/adt/int.c:1118 utils/adt/int.c:1146 utils/adt/int8.c:600 utils/adt/int8.c:658 utils/adt/int8.c:985 utils/adt/int8.c:1065 utils/adt/int8.c:1127 utils/adt/int8.c:1207 utils/adt/numeric.c:3032 utils/adt/numeric.c:3055 utils/adt/numeric.c:3140 utils/adt/numeric.c:3158 utils/adt/numeric.c:3254 utils/adt/numeric.c:8427 utils/adt/numeric.c:8717 utils/adt/numeric.c:10299 utils/adt/timestamp.c:3281 +#: utils/adt/cash.c:652 utils/adt/cash.c:702 utils/adt/cash.c:753 utils/adt/cash.c:802 utils/adt/cash.c:854 utils/adt/cash.c:904 utils/adt/float.c:104 utils/adt/int.c:822 utils/adt/int.c:938 utils/adt/int.c:1018 utils/adt/int.c:1080 utils/adt/int.c:1118 utils/adt/int.c:1146 utils/adt/int8.c:600 utils/adt/int8.c:658 utils/adt/int8.c:985 utils/adt/int8.c:1065 utils/adt/int8.c:1127 utils/adt/int8.c:1207 utils/adt/numeric.c:3031 utils/adt/numeric.c:3054 utils/adt/numeric.c:3139 utils/adt/numeric.c:3157 utils/adt/numeric.c:3253 utils/adt/numeric.c:8413 utils/adt/numeric.c:8703 utils/adt/numeric.c:10340 utils/adt/timestamp.c:3281 #, c-format msgid "division by zero" msgstr "division par zéro" @@ -22445,7 +22429,7 @@ msgid "date units \"%s\" not recognized" msgstr "unités de date « %s » non reconnues" #: utils/adt/date.c:1318 utils/adt/date.c:1364 utils/adt/date.c:1920 utils/adt/date.c:1951 utils/adt/date.c:1980 utils/adt/date.c:2844 utils/adt/datetime.c:405 utils/adt/datetime.c:1700 utils/adt/formatting.c:4109 utils/adt/formatting.c:4141 utils/adt/formatting.c:4221 utils/adt/formatting.c:4343 utils/adt/json.c:418 utils/adt/json.c:457 utils/adt/timestamp.c:224 utils/adt/timestamp.c:256 utils/adt/timestamp.c:698 utils/adt/timestamp.c:707 utils/adt/timestamp.c:785 utils/adt/timestamp.c:818 utils/adt/timestamp.c:2860 utils/adt/timestamp.c:2881 utils/adt/timestamp.c:2894 utils/adt/timestamp.c:2903 utils/adt/timestamp.c:2911 utils/adt/timestamp.c:2966 utils/adt/timestamp.c:2989 -#: utils/adt/timestamp.c:3002 utils/adt/timestamp.c:3013 utils/adt/timestamp.c:3021 utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3806 utils/adt/timestamp.c:3891 utils/adt/timestamp.c:3981 utils/adt/timestamp.c:4069 utils/adt/timestamp.c:4172 utils/adt/timestamp.c:4674 utils/adt/timestamp.c:4948 utils/adt/timestamp.c:5401 utils/adt/timestamp.c:5415 utils/adt/timestamp.c:5420 utils/adt/timestamp.c:5434 utils/adt/timestamp.c:5467 utils/adt/timestamp.c:5554 utils/adt/timestamp.c:5595 utils/adt/timestamp.c:5599 utils/adt/timestamp.c:5668 utils/adt/timestamp.c:5672 utils/adt/timestamp.c:5686 utils/adt/timestamp.c:5720 utils/adt/xml.c:2232 utils/adt/xml.c:2239 utils/adt/xml.c:2259 +#: utils/adt/timestamp.c:3002 utils/adt/timestamp.c:3013 utils/adt/timestamp.c:3021 utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3806 utils/adt/timestamp.c:3896 utils/adt/timestamp.c:3986 utils/adt/timestamp.c:4079 utils/adt/timestamp.c:4182 utils/adt/timestamp.c:4684 utils/adt/timestamp.c:4958 utils/adt/timestamp.c:5411 utils/adt/timestamp.c:5425 utils/adt/timestamp.c:5430 utils/adt/timestamp.c:5444 utils/adt/timestamp.c:5477 utils/adt/timestamp.c:5564 utils/adt/timestamp.c:5605 utils/adt/timestamp.c:5609 utils/adt/timestamp.c:5678 utils/adt/timestamp.c:5682 utils/adt/timestamp.c:5696 utils/adt/timestamp.c:5730 utils/adt/xml.c:2232 utils/adt/xml.c:2239 utils/adt/xml.c:2259 #: utils/adt/xml.c:2266 #, c-format msgid "timestamp out of range" @@ -22461,7 +22445,7 @@ msgstr "heure en dehors des limites" msgid "time field value out of range: %d:%02d:%02g" msgstr "valeur du champ time en dehors des limites : %d:%02d:%02g" -#: utils/adt/date.c:2109 utils/adt/date.c:2643 utils/adt/float.c:1047 utils/adt/float.c:1123 utils/adt/int.c:614 utils/adt/int.c:661 utils/adt/int.c:696 utils/adt/int8.c:499 utils/adt/numeric.c:2443 utils/adt/timestamp.c:3330 utils/adt/timestamp.c:3361 utils/adt/timestamp.c:3392 +#: utils/adt/date.c:2109 utils/adt/date.c:2643 utils/adt/float.c:1047 utils/adt/float.c:1123 utils/adt/int.c:614 utils/adt/int.c:661 utils/adt/int.c:696 utils/adt/int8.c:499 utils/adt/numeric.c:2435 utils/adt/timestamp.c:3330 utils/adt/timestamp.c:3361 utils/adt/timestamp.c:3392 #, c-format msgid "invalid preceding or following size in window function" msgstr "taille précédente ou suivante invalide dans la fonction de fenêtrage" @@ -22481,12 +22465,12 @@ msgstr "déplacement du fuseau horaire en dehors des limites" msgid "\"time with time zone\" units \"%s\" not recognized" msgstr "unités « %s » non reconnues pour le type « time with time zone »" -#: utils/adt/date.c:3095 utils/adt/datetime.c:951 utils/adt/datetime.c:1858 utils/adt/datetime.c:4648 utils/adt/timestamp.c:515 utils/adt/timestamp.c:542 utils/adt/timestamp.c:4255 utils/adt/timestamp.c:5426 utils/adt/timestamp.c:5678 +#: utils/adt/date.c:3097 utils/adt/datetime.c:951 utils/adt/datetime.c:1858 utils/adt/datetime.c:4648 utils/adt/timestamp.c:515 utils/adt/timestamp.c:542 utils/adt/timestamp.c:4265 utils/adt/timestamp.c:5436 utils/adt/timestamp.c:5688 #, c-format msgid "time zone \"%s\" not recognized" msgstr "le fuseau horaire « %s » n'est pas reconnu" -#: utils/adt/date.c:3127 utils/adt/timestamp.c:5456 utils/adt/timestamp.c:5709 +#: utils/adt/date.c:3129 utils/adt/timestamp.c:5466 utils/adt/timestamp.c:5719 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "l'intervalle de fuseau horaire « %s » ne doit pas spécifier de mois ou de jours" @@ -22516,22 +22500,22 @@ msgstr "déplacement du fuseau horaire en dehors des limites : « %s »" msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "Ce nom du fuseau horaire apparaît dans le fichier de configuration des abréviations de fuseaux horaires « %s »." -#: utils/adt/datum.c:89 utils/adt/datum.c:101 +#: utils/adt/datum.c:90 utils/adt/datum.c:102 #, c-format msgid "invalid Datum pointer" msgstr "pointeur Datum invalide" -#: utils/adt/dbsize.c:749 utils/adt/dbsize.c:817 +#: utils/adt/dbsize.c:754 utils/adt/dbsize.c:822 #, c-format msgid "invalid size: \"%s\"" msgstr "taille invalide : « %s »" -#: utils/adt/dbsize.c:818 +#: utils/adt/dbsize.c:823 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Unité invalide pour une taille : « %s »." -#: utils/adt/dbsize.c:819 +#: utils/adt/dbsize.c:824 #, c-format msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." msgstr "Les unités valides pour ce paramètre sont « bytes », « kB », « MB », « GB » et « TB »." @@ -22541,37 +22525,47 @@ msgstr "Les unités valides pour ce paramètre sont « bytes », « kB », « MB msgid "type %s is not a domain" msgstr "le type %s n'est pas un domaine" -#: utils/adt/encode.c:68 utils/adt/encode.c:112 +#: utils/adt/encode.c:65 utils/adt/encode.c:113 #, c-format msgid "unrecognized encoding: \"%s\"" msgstr "encodage non reconnu : « %s »" -#: utils/adt/encode.c:82 +#: utils/adt/encode.c:79 #, c-format msgid "result of encoding conversion is too large" msgstr "la résultat de la conversion d'encodage est trop importante" -#: utils/adt/encode.c:126 +#: utils/adt/encode.c:127 #, c-format msgid "result of decoding conversion is too large" msgstr "le résultat de la conversion du décodage est trop grand" -#: utils/adt/encode.c:261 +#: utils/adt/encode.c:186 +#, c-format +msgid "invalid hexadecimal digit: \"%.*s\"" +msgstr "chiffre hexadécimal invalide : « %.*s »" + +#: utils/adt/encode.c:216 +#, c-format +msgid "invalid hexadecimal data: odd number of digits" +msgstr "donnée hexadécimale invalide : nombre impair de chiffres" + +#: utils/adt/encode.c:334 #, c-format msgid "unexpected \"=\" while decoding base64 sequence" msgstr "« = » inattendu lors du décodage de la séquence en base64" -#: utils/adt/encode.c:273 +#: utils/adt/encode.c:346 #, c-format msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" msgstr "symbole « %.*s » invalide trouvé lors du décodage de la séquence en base64" -#: utils/adt/encode.c:304 +#: utils/adt/encode.c:367 #, c-format msgid "invalid base64 end sequence" msgstr "séquence base64 de fin invalide" -#: utils/adt/encode.c:305 +#: utils/adt/encode.c:368 #, c-format msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "Les données en entrée manquent un alignement, sont tronquées ou ont une corruption autre." @@ -22626,32 +22620,32 @@ msgstr "« %s » est en dehors des limites du type real" msgid "\"%s\" is out of range for type double precision" msgstr "« %s » est en dehors des limites du type double precision" -#: utils/adt/float.c:1258 utils/adt/float.c:1332 utils/adt/int.c:334 utils/adt/int.c:872 utils/adt/int.c:894 utils/adt/int.c:908 utils/adt/int.c:922 utils/adt/int.c:954 utils/adt/int.c:1192 utils/adt/int8.c:1320 utils/adt/numeric.c:4317 utils/adt/numeric.c:4326 +#: utils/adt/float.c:1258 utils/adt/float.c:1332 utils/adt/int.c:334 utils/adt/int.c:872 utils/adt/int.c:894 utils/adt/int.c:908 utils/adt/int.c:922 utils/adt/int.c:954 utils/adt/int.c:1192 utils/adt/int8.c:1320 utils/adt/numeric.c:4315 utils/adt/numeric.c:4320 #, c-format msgid "smallint out of range" msgstr "smallint en dehors des limites" -#: utils/adt/float.c:1458 utils/adt/numeric.c:3550 utils/adt/numeric.c:9310 +#: utils/adt/float.c:1458 utils/adt/numeric.c:3549 utils/adt/numeric.c:9296 #, c-format msgid "cannot take square root of a negative number" msgstr "ne peut pas calculer la racine carré d'un nombre négatif" -#: utils/adt/float.c:1526 utils/adt/numeric.c:3825 utils/adt/numeric.c:3935 +#: utils/adt/float.c:1526 utils/adt/numeric.c:3824 utils/adt/numeric.c:3936 #, c-format msgid "zero raised to a negative power is undefined" msgstr "zéro à une puissance négative est indéfini" -#: utils/adt/float.c:1530 utils/adt/numeric.c:3829 utils/adt/numeric.c:3940 +#: utils/adt/float.c:1530 utils/adt/numeric.c:3828 utils/adt/numeric.c:10193 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "un nombre négatif élevé à une puissance non entière donne un résultat complexe" -#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3737 utils/adt/numeric.c:9974 +#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3736 utils/adt/numeric.c:9966 #, c-format msgid "cannot take logarithm of zero" msgstr "ne peut pas calculer le logarithme de zéro" -#: utils/adt/float.c:1710 utils/adt/float.c:1743 utils/adt/numeric.c:3675 utils/adt/numeric.c:3732 utils/adt/numeric.c:9978 +#: utils/adt/float.c:1710 utils/adt/float.c:1743 utils/adt/numeric.c:3674 utils/adt/numeric.c:3731 utils/adt/numeric.c:9970 #, c-format msgid "cannot take logarithm of a negative number" msgstr "ne peut pas calculer le logarithme sur un nombre négatif" @@ -22666,22 +22660,22 @@ msgstr "l'entrée est en dehors des limites" msgid "setseed parameter %g is out of allowed range [-1,1]" msgstr "le paramètre setseed %g est en dehors de la fenêtre permise [-1,1]" -#: utils/adt/float.c:4030 utils/adt/numeric.c:1716 +#: utils/adt/float.c:4030 utils/adt/numeric.c:1708 #, c-format msgid "count must be greater than zero" msgstr "le total doit être supérieur à zéro" -#: utils/adt/float.c:4035 utils/adt/numeric.c:1727 +#: utils/adt/float.c:4035 utils/adt/numeric.c:1719 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "la limite inférieure et supérieure de l'opérande ne peuvent pas être NaN" -#: utils/adt/float.c:4041 utils/adt/numeric.c:1732 +#: utils/adt/float.c:4041 utils/adt/numeric.c:1724 #, c-format msgid "lower and upper bounds must be finite" msgstr "les limites basse et haute doivent être finies" -#: utils/adt/float.c:4075 utils/adt/numeric.c:1746 +#: utils/adt/float.c:4075 utils/adt/numeric.c:1738 #, c-format msgid "lower bound cannot equal upper bound" msgstr "la limite inférieure ne peut pas être plus égale à la limite supérieure" @@ -23070,12 +23064,12 @@ msgstr "données int2vector invalide" msgid "oidvector has too many elements" msgstr "oidvector a trop d'éléments" -#: utils/adt/int.c:1508 utils/adt/int8.c:1446 utils/adt/numeric.c:1624 utils/adt/timestamp.c:5771 utils/adt/timestamp.c:5851 +#: utils/adt/int.c:1508 utils/adt/int8.c:1446 utils/adt/numeric.c:1616 utils/adt/timestamp.c:5781 utils/adt/timestamp.c:5861 #, c-format msgid "step size cannot equal zero" msgstr "la taille du pas ne peut pas valoir zéro" -#: utils/adt/int8.c:534 utils/adt/int8.c:557 utils/adt/int8.c:571 utils/adt/int8.c:585 utils/adt/int8.c:616 utils/adt/int8.c:640 utils/adt/int8.c:722 utils/adt/int8.c:790 utils/adt/int8.c:796 utils/adt/int8.c:822 utils/adt/int8.c:836 utils/adt/int8.c:860 utils/adt/int8.c:873 utils/adt/int8.c:942 utils/adt/int8.c:956 utils/adt/int8.c:970 utils/adt/int8.c:1001 utils/adt/int8.c:1023 utils/adt/int8.c:1037 utils/adt/int8.c:1051 utils/adt/int8.c:1084 utils/adt/int8.c:1098 utils/adt/int8.c:1112 utils/adt/int8.c:1143 utils/adt/int8.c:1165 utils/adt/int8.c:1179 utils/adt/int8.c:1193 utils/adt/int8.c:1355 utils/adt/int8.c:1390 utils/adt/numeric.c:4276 utils/adt/varbit.c:1676 +#: utils/adt/int8.c:534 utils/adt/int8.c:557 utils/adt/int8.c:571 utils/adt/int8.c:585 utils/adt/int8.c:616 utils/adt/int8.c:640 utils/adt/int8.c:722 utils/adt/int8.c:790 utils/adt/int8.c:796 utils/adt/int8.c:822 utils/adt/int8.c:836 utils/adt/int8.c:860 utils/adt/int8.c:873 utils/adt/int8.c:942 utils/adt/int8.c:956 utils/adt/int8.c:970 utils/adt/int8.c:1001 utils/adt/int8.c:1023 utils/adt/int8.c:1037 utils/adt/int8.c:1051 utils/adt/int8.c:1084 utils/adt/int8.c:1098 utils/adt/int8.c:1112 utils/adt/int8.c:1143 utils/adt/int8.c:1165 utils/adt/int8.c:1179 utils/adt/int8.c:1193 utils/adt/int8.c:1355 utils/adt/int8.c:1390 utils/adt/numeric.c:4274 utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigint en dehors des limites" @@ -23211,229 +23205,229 @@ msgstr "la taille totale des éléments du tableau jsonb dépasse le maximum de msgid "total size of jsonb object elements exceeds the maximum of %u bytes" msgstr "la taille totale des éléments de l'objet JSON dépasse le maximum de %u octets" -#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:152 +#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 #, c-format msgid "jsonb subscript does not support slices" -msgstr "" +msgstr "l'indice jsonb ne prend pas en charge les tranches" -#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:118 +#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 #, c-format -msgid "subscript type is not supported" -msgstr "le type subscript n'est pas supporté" +msgid "subscript type %s is not supported" +msgstr "le type d'indice %s n'est pas supporté" #: utils/adt/jsonbsubs.c:104 #, c-format -msgid "Jsonb subscript must be coerced only to one type, integer or text." -msgstr "" +msgid "jsonb subscript must be coercible to only one type, integer or text." +msgstr "l'indice jsonb doit être onvertible en un seul type, entier ou texte." -#: utils/adt/jsonbsubs.c:119 +#: utils/adt/jsonbsubs.c:118 #, c-format -msgid "Jsonb subscript must be coerced to either integer or text" -msgstr "" +msgid "jsonb subscript must be coercible to either integer or text." +msgstr "l'indice d'un jsonb doit être soit de type integer, soit de type text" -#: utils/adt/jsonbsubs.c:140 +#: utils/adt/jsonbsubs.c:139 #, c-format msgid "jsonb subscript must have text type" msgstr "l'indice d'un jsonb doit être de type text" -#: utils/adt/jsonbsubs.c:208 +#: utils/adt/jsonbsubs.c:207 #, c-format msgid "jsonb subscript in assignment must not be null" msgstr "l'indice d'un jsonb lors d'une affectation ne doit pas être NULL" -#: utils/adt/jsonfuncs.c:555 utils/adt/jsonfuncs.c:789 utils/adt/jsonfuncs.c:2471 utils/adt/jsonfuncs.c:2911 utils/adt/jsonfuncs.c:3700 utils/adt/jsonfuncs.c:4030 +#: utils/adt/jsonfuncs.c:555 utils/adt/jsonfuncs.c:791 utils/adt/jsonfuncs.c:2473 utils/adt/jsonfuncs.c:2913 utils/adt/jsonfuncs.c:3702 utils/adt/jsonfuncs.c:4032 #, c-format msgid "cannot call %s on a scalar" msgstr "ne peut pas appeler %s sur un scalaire" -#: utils/adt/jsonfuncs.c:560 utils/adt/jsonfuncs.c:776 utils/adt/jsonfuncs.c:2913 utils/adt/jsonfuncs.c:3689 +#: utils/adt/jsonfuncs.c:560 utils/adt/jsonfuncs.c:778 utils/adt/jsonfuncs.c:2915 utils/adt/jsonfuncs.c:3691 #, c-format msgid "cannot call %s on an array" msgstr "ne peut pas appeler %s sur un tableau" -#: utils/adt/jsonfuncs.c:685 +#: utils/adt/jsonfuncs.c:687 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "données JSON, ligne %d : %s%s%s" -#: utils/adt/jsonfuncs.c:1823 utils/adt/jsonfuncs.c:1858 +#: utils/adt/jsonfuncs.c:1825 utils/adt/jsonfuncs.c:1860 #, c-format msgid "cannot get array length of a scalar" msgstr "ne peut pas obtenir la longueur d'un scalaire" -#: utils/adt/jsonfuncs.c:1827 utils/adt/jsonfuncs.c:1846 +#: utils/adt/jsonfuncs.c:1829 utils/adt/jsonfuncs.c:1848 #, c-format msgid "cannot get array length of a non-array" msgstr "ne peut pas obtenir la longueur du tableau d'un objet qui n'est pas un tableau" -#: utils/adt/jsonfuncs.c:1923 +#: utils/adt/jsonfuncs.c:1925 #, c-format msgid "cannot call %s on a non-object" msgstr "ne peut pas appeler %s sur un non objet" -#: utils/adt/jsonfuncs.c:2162 +#: utils/adt/jsonfuncs.c:2164 #, c-format msgid "cannot deconstruct an array as an object" msgstr "ne peut pas déconstruire un tableau sous la forme d'un objet" -#: utils/adt/jsonfuncs.c:2174 +#: utils/adt/jsonfuncs.c:2176 #, c-format msgid "cannot deconstruct a scalar" msgstr "ne peut pas décomposer un scalaire" -#: utils/adt/jsonfuncs.c:2220 +#: utils/adt/jsonfuncs.c:2222 #, c-format msgid "cannot extract elements from a scalar" msgstr "ne peut pas extraire des éléments d'un scalaire" -#: utils/adt/jsonfuncs.c:2224 +#: utils/adt/jsonfuncs.c:2226 #, c-format msgid "cannot extract elements from an object" msgstr "ne peut pas extraire des éléments d'un objet" -#: utils/adt/jsonfuncs.c:2458 utils/adt/jsonfuncs.c:3915 +#: utils/adt/jsonfuncs.c:2460 utils/adt/jsonfuncs.c:3917 #, c-format msgid "cannot call %s on a non-array" msgstr "ne peut pas appeler %s sur un type non tableau" -#: utils/adt/jsonfuncs.c:2528 utils/adt/jsonfuncs.c:2533 utils/adt/jsonfuncs.c:2550 utils/adt/jsonfuncs.c:2556 +#: utils/adt/jsonfuncs.c:2530 utils/adt/jsonfuncs.c:2535 utils/adt/jsonfuncs.c:2552 utils/adt/jsonfuncs.c:2558 #, c-format msgid "expected JSON array" msgstr "attendait un tableau JSON" -#: utils/adt/jsonfuncs.c:2529 +#: utils/adt/jsonfuncs.c:2531 #, c-format msgid "See the value of key \"%s\"." msgstr "Voir la valeur de la clé « %s »." -#: utils/adt/jsonfuncs.c:2551 +#: utils/adt/jsonfuncs.c:2553 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Voir l'élément de tableau %s de la clé « %s »." -#: utils/adt/jsonfuncs.c:2557 +#: utils/adt/jsonfuncs.c:2559 #, c-format msgid "See the array element %s." msgstr "Voir l'élément de tableau %s." -#: utils/adt/jsonfuncs.c:2592 +#: utils/adt/jsonfuncs.c:2594 #, c-format msgid "malformed JSON array" msgstr "tableau JSON mal formé" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3419 +#: utils/adt/jsonfuncs.c:3421 #, c-format msgid "first argument of %s must be a row type" msgstr "le premier argument de %s doit être un type row" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3443 +#: utils/adt/jsonfuncs.c:3445 #, c-format msgid "could not determine row type for result of %s" msgstr "n'a pas pu déterminer le type de ligne pour le résultat %s" -#: utils/adt/jsonfuncs.c:3445 +#: utils/adt/jsonfuncs.c:3447 #, c-format msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." msgstr "Fournissez comme argument un enregistrement non NULL, ou appelez la fonction dans la clause FROM en utilisant une liste de définition de colonnes." -#: utils/adt/jsonfuncs.c:3932 utils/adt/jsonfuncs.c:4012 +#: utils/adt/jsonfuncs.c:3934 utils/adt/jsonfuncs.c:4014 #, c-format msgid "argument of %s must be an array of objects" msgstr "l'argument de %s doit être un tableau d'objets" -#: utils/adt/jsonfuncs.c:3965 +#: utils/adt/jsonfuncs.c:3967 #, c-format msgid "cannot call %s on an object" msgstr "ne peut pas appeler %s sur un objet" -#: utils/adt/jsonfuncs.c:4373 utils/adt/jsonfuncs.c:4432 utils/adt/jsonfuncs.c:4512 +#: utils/adt/jsonfuncs.c:4375 utils/adt/jsonfuncs.c:4434 utils/adt/jsonfuncs.c:4514 #, c-format msgid "cannot delete from scalar" msgstr "ne peut pas supprimer à partir du scalaire" -#: utils/adt/jsonfuncs.c:4517 +#: utils/adt/jsonfuncs.c:4519 #, c-format msgid "cannot delete from object using integer index" msgstr "ne peut pas supprimer à partir de l'objet en utilisant l'index de l'entier" -#: utils/adt/jsonfuncs.c:4585 utils/adt/jsonfuncs.c:4746 +#: utils/adt/jsonfuncs.c:4587 utils/adt/jsonfuncs.c:4748 #, c-format msgid "cannot set path in scalar" msgstr "ne peut pas initialiser le chemin dans le scalaire" -#: utils/adt/jsonfuncs.c:4627 utils/adt/jsonfuncs.c:4669 +#: utils/adt/jsonfuncs.c:4629 utils/adt/jsonfuncs.c:4671 #, c-format msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" msgstr "null_value_treatment doit valoir \"delete_key\", \"return_target\", \"use_json_null\" ou \"raise_exception\"" -#: utils/adt/jsonfuncs.c:4640 +#: utils/adt/jsonfuncs.c:4642 #, c-format msgid "JSON value must not be null" msgstr "la valeur JSON ne doit pas être NULL" -#: utils/adt/jsonfuncs.c:4641 +#: utils/adt/jsonfuncs.c:4643 #, c-format msgid "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "Une exception a été levée parce que null_value_treatment vaut « raise_exception »." -#: utils/adt/jsonfuncs.c:4642 +#: utils/adt/jsonfuncs.c:4644 #, c-format msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." msgstr "Pour éviter cela, soit vous changez l'argument null_value_treatment soit vous vous assurez qu'un NULL SQL n'est pas fourni" -#: utils/adt/jsonfuncs.c:4697 +#: utils/adt/jsonfuncs.c:4699 #, c-format msgid "cannot delete path in scalar" msgstr "ne peut pas supprimer un chemin dans le scalaire" -#: utils/adt/jsonfuncs.c:4913 +#: utils/adt/jsonfuncs.c:4915 #, c-format msgid "path element at position %d is null" msgstr "l'élément de chemin à la position %d est nul" -#: utils/adt/jsonfuncs.c:4932 utils/adt/jsonfuncs.c:4963 utils/adt/jsonfuncs.c:5030 +#: utils/adt/jsonfuncs.c:4934 utils/adt/jsonfuncs.c:4965 utils/adt/jsonfuncs.c:5032 #, c-format msgid "cannot replace existing key" msgstr "ne peut pas remplacer une clé existante" -#: utils/adt/jsonfuncs.c:4933 utils/adt/jsonfuncs.c:4964 +#: utils/adt/jsonfuncs.c:4935 utils/adt/jsonfuncs.c:4966 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." msgstr "Le chemin assume que la clé est un objet composite, alors qu'il s'agit d'une valeur scalaire." -#: utils/adt/jsonfuncs.c:5031 +#: utils/adt/jsonfuncs.c:5033 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Essayez d'utiliser la fonction jsonb_set pour remplacer la valeur de la clé." -#: utils/adt/jsonfuncs.c:5135 +#: utils/adt/jsonfuncs.c:5137 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "l'élément du chemin à la position %d n'est pas un entier : « %s »" -#: utils/adt/jsonfuncs.c:5152 +#: utils/adt/jsonfuncs.c:5154 #, c-format msgid "path element at position %d is out of range: %d" msgstr "l'élément du chemin à la position %d est en dehors de l'échelle : %d" -#: utils/adt/jsonfuncs.c:5304 +#: utils/adt/jsonfuncs.c:5306 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "mauvais type de drapeau, seuls les tableaux et scalaires sont autorisés" -#: utils/adt/jsonfuncs.c:5311 +#: utils/adt/jsonfuncs.c:5313 #, c-format msgid "flag array element is not a string" msgstr "le drapeau d'élément de tableau n'est pas une chaîne" -#: utils/adt/jsonfuncs.c:5312 utils/adt/jsonfuncs.c:5334 +#: utils/adt/jsonfuncs.c:5314 utils/adt/jsonfuncs.c:5336 #, c-format msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." msgstr "Les valeurs possibles sont : « string », « numeric », « boolean », « key » et « all »." -#: utils/adt/jsonfuncs.c:5332 +#: utils/adt/jsonfuncs.c:5334 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "mauvais drapeau dans le drapeau de tableau : « %s »" @@ -23712,45 +23706,34 @@ msgstr "le format de trace « %s » n'est pas supporté" msgid "The supported log formats are \"stderr\" and \"csvlog\"." msgstr "Les formats de traces supportés sont « stderr » et « csvlog »." -#: utils/adt/multirangetypes.c:147 utils/adt/multirangetypes.c:160 utils/adt/multirangetypes.c:189 utils/adt/multirangetypes.c:259 utils/adt/multirangetypes.c:283 +#: utils/adt/multirangetypes.c:148 utils/adt/multirangetypes.c:161 utils/adt/multirangetypes.c:190 utils/adt/multirangetypes.c:260 utils/adt/multirangetypes.c:284 #, c-format msgid "malformed multirange literal: \"%s\"" msgstr "litéral multirange mal formé : « %s »" -#: utils/adt/multirangetypes.c:149 +#: utils/adt/multirangetypes.c:150 #, c-format msgid "Missing left brace." msgstr "Parenthèse gauche manquante." -#: utils/adt/multirangetypes.c:191 +#: utils/adt/multirangetypes.c:192 #, c-format msgid "Expected range start." msgstr "Début d'intervalle attendu." -#: utils/adt/multirangetypes.c:261 +#: utils/adt/multirangetypes.c:262 #, c-format msgid "Expected comma or end of multirange." msgstr "Virgule ou fin de multirange attendue." -#: utils/adt/multirangetypes.c:285 -#, fuzzy, c-format -#| msgid "Junk after right bracket." -msgid "Junk after right brace." -msgstr "Problème après la parenthèse droite." - -#: utils/adt/multirangetypes.c:971 +#: utils/adt/multirangetypes.c:975 #, c-format -msgid "multiranges cannot be constructed from multi-dimensional arrays" +msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "des multiranges ne peuvent pas être construits à partir de tableaux multidimensionnels" -#: utils/adt/multirangetypes.c:977 utils/adt/multirangetypes.c:1042 -#, c-format -msgid "type %u does not match constructor type" -msgstr "le type %u ne correspond pas un type constructeur" - -#: utils/adt/multirangetypes.c:999 +#: utils/adt/multirangetypes.c:1001 #, c-format -msgid "multirange values cannot contain NULL members" +msgid "multirange values cannot contain null members" msgstr "les valeurs multirange ne peuvent pas contenir des membres NULL" #: utils/adt/multirangetypes.c:1349 @@ -23840,132 +23823,102 @@ msgstr "le résultat est en dehors des limites" msgid "cannot subtract inet values of different sizes" msgstr "ne peut pas soustraire des valeurs inet de tailles différentes" -#: utils/adt/numeric.c:975 +#: utils/adt/numeric.c:967 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "signe invalide dans la valeur externe « numeric »" -#: utils/adt/numeric.c:981 +#: utils/adt/numeric.c:973 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "échelle invalide dans la valeur externe « numeric »" -#: utils/adt/numeric.c:990 +#: utils/adt/numeric.c:982 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "chiffre invalide dans la valeur externe « numeric »" -#: utils/adt/numeric.c:1203 utils/adt/numeric.c:1217 +#: utils/adt/numeric.c:1195 utils/adt/numeric.c:1209 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "la précision NUMERIC %d doit être comprise entre 1 et %d" -#: utils/adt/numeric.c:1208 +#: utils/adt/numeric.c:1200 #, c-format msgid "NUMERIC scale %d must be between 0 and precision %d" msgstr "l'échelle NUMERIC %d doit être comprise entre 0 et le précision %d" -#: utils/adt/numeric.c:1226 +#: utils/adt/numeric.c:1218 #, c-format msgid "invalid NUMERIC type modifier" msgstr "modificateur de type NUMERIC invalide" -#: utils/adt/numeric.c:1584 +#: utils/adt/numeric.c:1576 #, c-format msgid "start value cannot be NaN" msgstr "la valeur de démarrage ne peut pas être NaN" -#: utils/adt/numeric.c:1588 +#: utils/adt/numeric.c:1580 #, c-format msgid "start value cannot be infinity" msgstr "la valeur de démarrage ne peut pas être infinity" -#: utils/adt/numeric.c:1595 +#: utils/adt/numeric.c:1587 #, c-format msgid "stop value cannot be NaN" msgstr "la valeur d'arrêt ne peut pas être NaN" -#: utils/adt/numeric.c:1599 +#: utils/adt/numeric.c:1591 #, c-format msgid "stop value cannot be infinity" msgstr "la valeur d'arrêt ne peut pas être infinity" -#: utils/adt/numeric.c:1612 +#: utils/adt/numeric.c:1604 #, c-format msgid "step size cannot be NaN" msgstr "la taille du pas ne peut pas être NaN" -#: utils/adt/numeric.c:1616 +#: utils/adt/numeric.c:1608 #, c-format msgid "step size cannot be infinity" msgstr "la taille du pas ne peut pas être infinity" -#: utils/adt/numeric.c:3490 +#: utils/adt/numeric.c:3489 #, c-format msgid "factorial of a negative number is undefined" msgstr "la factorielle d'un nombre négatif est indéfini" -#: utils/adt/numeric.c:3500 utils/adt/numeric.c:6924 utils/adt/numeric.c:7408 utils/adt/numeric.c:9783 utils/adt/numeric.c:10221 utils/adt/numeric.c:10335 utils/adt/numeric.c:10408 +#: utils/adt/numeric.c:3499 utils/adt/numeric.c:6921 utils/adt/numeric.c:7394 utils/adt/numeric.c:9771 utils/adt/numeric.c:10250 utils/adt/numeric.c:10376 utils/adt/numeric.c:10449 #, c-format msgid "value overflows numeric format" msgstr "la valeur dépasse le format numeric" -#: utils/adt/numeric.c:4185 -#, c-format -msgid "cannot convert NaN to integer" -msgstr "ne peut pas convertir NaN en un entier" - -#: utils/adt/numeric.c:4189 -#, c-format -msgid "cannot convert infinity to integer" -msgstr "ne peut pas convertir infinity en integer" - -#: utils/adt/numeric.c:4263 -#, c-format -msgid "cannot convert NaN to bigint" -msgstr "ne peut pas convertir NaN en un entier de type bigint" - -#: utils/adt/numeric.c:4267 -#, c-format -msgid "cannot convert infinity to bigint" -msgstr "ne peut pas convertir infinity en bigint" - -#: utils/adt/numeric.c:4304 -#, c-format -msgid "cannot convert NaN to smallint" -msgstr "ne peut pas convertir NaN en un entier de type smallint" - -#: utils/adt/numeric.c:4308 -#, c-format -msgid "cannot convert infinity to smallint" -msgstr "ne peut pas convertir infinity en smallint" - -#: utils/adt/numeric.c:4499 +#: utils/adt/numeric.c:4181 utils/adt/numeric.c:4261 utils/adt/numeric.c:4302 utils/adt/numeric.c:4496 #, c-format -msgid "cannot convert NaN to pg_lsn" -msgstr "ne peut pas convertir NaN en un pg_lsn" +msgid "cannot convert NaN to %s" +msgstr "ne peut pas convertir NaN en %s" -#: utils/adt/numeric.c:4503 +#: utils/adt/numeric.c:4185 utils/adt/numeric.c:4265 utils/adt/numeric.c:4306 utils/adt/numeric.c:4500 #, c-format -msgid "cannot convert infinity to pg_lsn" -msgstr "ne peut pas convertir infinity en pg_lsn" +msgid "cannot convert infinity to %s" +msgstr "ne peut pas convertir infinity en %s" -#: utils/adt/numeric.c:4512 +#: utils/adt/numeric.c:4509 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn hors des limites" -#: utils/adt/numeric.c:7492 utils/adt/numeric.c:7539 +#: utils/adt/numeric.c:7478 utils/adt/numeric.c:7525 #, c-format msgid "numeric field overflow" msgstr "champ numérique en dehors des limites" -#: utils/adt/numeric.c:7493 +#: utils/adt/numeric.c:7479 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "Un champ de précision %d et d'échelle %d doit être arrondi à une valeur absolue inférieure à %s%d." -#: utils/adt/numeric.c:7540 +#: utils/adt/numeric.c:7526 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "Un champ de précision %d et d'échelle %d ne peut pas contenir une valeur infinie." @@ -24206,7 +24159,7 @@ msgstr "Trop de virgules." msgid "Junk after right parenthesis or bracket." msgstr "Problème après la parenthèse droite ou le crochet droit." -#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4560 +#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4553 #, c-format msgid "regular expression failed: %s" msgstr "l'expression rationnelle a échoué : %s" @@ -24247,7 +24200,7 @@ msgstr "il existe plus d'une fonction nommée « %s »" msgid "more than one operator named %s" msgstr "il existe plus d'un opérateur nommé%s" -#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 utils/adt/ruleutils.c:9650 utils/adt/ruleutils.c:9819 +#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 utils/adt/ruleutils.c:9706 utils/adt/ruleutils.c:9875 #, c-format msgid "too many arguments" msgstr "trop d'arguments" @@ -24257,7 +24210,7 @@ msgstr "trop d'arguments" msgid "Provide two argument types for operator." msgstr "Fournit deux types d'argument pour l'opérateur." -#: utils/adt/regproc.c:1639 utils/adt/regproc.c:1663 utils/adt/regproc.c:1764 utils/adt/regproc.c:1788 utils/adt/regproc.c:1890 utils/adt/regproc.c:1895 utils/adt/varlena.c:3709 utils/adt/varlena.c:3714 +#: utils/adt/regproc.c:1639 utils/adt/regproc.c:1663 utils/adt/regproc.c:1764 utils/adt/regproc.c:1788 utils/adt/regproc.c:1890 utils/adt/regproc.c:1895 utils/adt/varlena.c:3702 utils/adt/varlena.c:3707 #, c-format msgid "invalid name syntax" msgstr "syntaxe du nom invalide" @@ -24401,7 +24354,7 @@ msgstr "mauvais nombre de colonnes : %d, alors que %d attendu" #: utils/adt/rowtypes.c:574 #, c-format msgid "binary data has type %u (%s) instead of expected %u (%s) in record column %d" -msgstr "" +msgstr "la donnée binaire a le type %u (%s) au lieu de %u (%s) dans la colonne %d de l'enregistrement" #: utils/adt/rowtypes.c:641 #, c-format @@ -24422,7 +24375,7 @@ msgstr "" "ne peut pas comparer les types d'enregistrement avec des numéros différents\n" "des colonnes" -#: utils/adt/ruleutils.c:5077 +#: utils/adt/ruleutils.c:5118 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "la règle « %s » a un type d'événement %d non supporté" @@ -24437,7 +24390,7 @@ msgstr "la précision de TIMESTAMP(%d)%s ne doit pas être négative" msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "la précision de TIMESTAMP(%d)%s est réduite au maximum autorisé, %d" -#: utils/adt/timestamp.c:178 utils/adt/timestamp.c:436 utils/misc/guc.c:12411 +#: utils/adt/timestamp.c:178 utils/adt/timestamp.c:436 utils/misc/guc.c:12412 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestamp en dehors de limites : « %s »" @@ -24497,47 +24450,52 @@ msgstr "la précision de interval(%d) doit être comprise entre %d et %d" msgid "cannot subtract infinite timestamps" msgstr "ne peut pas soustraire les valeurs timestamps infinies" -#: utils/adt/timestamp.c:3837 utils/adt/timestamp.c:4015 +#: utils/adt/timestamp.c:3837 utils/adt/timestamp.c:4020 #, c-format msgid "origin out of range" msgstr "origine hors des limites" -#: utils/adt/timestamp.c:3842 utils/adt/timestamp.c:4020 +#: utils/adt/timestamp.c:3842 utils/adt/timestamp.c:4025 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" -msgstr "" +msgstr "Les données de type timestamp ne peuvent pas être rangées dans des intervalles contenant des mois ou des années." + +#: utils/adt/timestamp.c:3849 utils/adt/timestamp.c:4032 +#, c-format +msgid "stride must be greater than zero" +msgstr "le pas doit être supérieur à zéro" -#: utils/adt/timestamp.c:3973 utils/adt/timestamp.c:4610 utils/adt/timestamp.c:4810 utils/adt/timestamp.c:4857 +#: utils/adt/timestamp.c:3978 utils/adt/timestamp.c:4620 utils/adt/timestamp.c:4820 utils/adt/timestamp.c:4867 #, c-format msgid "timestamp units \"%s\" not supported" msgstr "les unités timestamp « %s » ne sont pas supportées" -#: utils/adt/timestamp.c:3987 utils/adt/timestamp.c:4564 utils/adt/timestamp.c:4867 +#: utils/adt/timestamp.c:3992 utils/adt/timestamp.c:4574 utils/adt/timestamp.c:4877 #, c-format msgid "timestamp units \"%s\" not recognized" msgstr "les unité « %s » ne sont pas reconnues pour le type timestamp" -#: utils/adt/timestamp.c:4161 utils/adt/timestamp.c:4605 utils/adt/timestamp.c:5081 utils/adt/timestamp.c:5129 +#: utils/adt/timestamp.c:4171 utils/adt/timestamp.c:4615 utils/adt/timestamp.c:5091 utils/adt/timestamp.c:5139 #, c-format msgid "timestamp with time zone units \"%s\" not supported" msgstr "les unités « %s » ne sont pas supportées pour le type « timestamp with time zone »" -#: utils/adt/timestamp.c:4178 utils/adt/timestamp.c:4559 utils/adt/timestamp.c:5138 +#: utils/adt/timestamp.c:4188 utils/adt/timestamp.c:4569 utils/adt/timestamp.c:5148 #, c-format msgid "timestamp with time zone units \"%s\" not recognized" msgstr "les unités « %s » ne sont pas reconnues pour le type « timestamp with time zone »" -#: utils/adt/timestamp.c:4336 +#: utils/adt/timestamp.c:4346 #, c-format msgid "interval units \"%s\" not supported because months usually have fractional weeks" msgstr "unités d'intervalle « %s » non supportées car les mois ont généralement des semaines fractionnaires" -#: utils/adt/timestamp.c:4342 utils/adt/timestamp.c:5261 +#: utils/adt/timestamp.c:4352 utils/adt/timestamp.c:5271 #, c-format msgid "interval units \"%s\" not supported" msgstr "les unités « %s » ne sont pas supportées pour le type interval" -#: utils/adt/timestamp.c:4358 utils/adt/timestamp.c:5322 +#: utils/adt/timestamp.c:4368 utils/adt/timestamp.c:5332 #, c-format msgid "interval units \"%s\" not recognized" msgstr "les unités « %s » ne sont pas reconnues pour le type interval" @@ -24567,10 +24525,10 @@ msgstr "suppress_redundant_updates_trigger : doit être appelé pour chaque lign msgid "gtsvector_in not implemented" msgstr "gtsvector_in n'est pas encore implémenté" -#: utils/adt/tsquery.c:199 +#: utils/adt/tsquery.c:199 utils/adt/tsquery_op.c:124 #, c-format -msgid "distance in phrase operator should not be greater than %d" -msgstr "la distance dans l'opérateur de phrase ne devrait pas être plus que %d" +msgid "distance in phrase operator must be an integer value between zero and %d inclusive" +msgstr "la distance dans l'opérateur de phrase doit être un entier compris entre zéro et %d inclus" #: utils/adt/tsquery.c:306 utils/adt/tsquery.c:691 utils/adt/tsvector_parser.c:133 #, c-format @@ -24614,11 +24572,6 @@ msgstr "" "la requête de recherche plein texte ne contient que des termes courants\n" "ou ne contient pas de lexemes, ignoré" -#: utils/adt/tsquery_op.c:124 -#, c-format -msgid "distance in phrase operator should be non-negative and less than %d" -msgstr "la distance dans l'opérateur de phrase devrait être non négative et inférieure à %d" - #: utils/adt/tsquery_rewrite.c:321 #, c-format msgid "ts_rewrite query must return two tsquery columns" @@ -24771,7 +24724,7 @@ msgstr "longueur invalide dans la chaîne bit externe" msgid "bit string too long for type bit varying(%d)" msgstr "la chaîne de bits est trop longue pour le type bit varying(%d)" -#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:897 utils/adt/varlena.c:960 utils/adt/varlena.c:1117 utils/adt/varlena.c:3351 utils/adt/varlena.c:3429 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:890 utils/adt/varlena.c:953 utils/adt/varlena.c:1110 utils/adt/varlena.c:3344 utils/adt/varlena.c:3422 #, c-format msgid "negative substring length not allowed" msgstr "longueur de sous-chaîne négative non autorisée" @@ -24796,7 +24749,7 @@ msgstr "ne peut pas utiliser l'opérateur XOR sur des chaînes bit de tailles di msgid "bit index %d out of valid range (0..%d)" msgstr "index de bit %d en dehors des limites valides (0..%d)" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3633 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3626 #, c-format msgid "new bit must be 0 or 1" msgstr "le nouveau bit doit valoir soit 0 soit 1" @@ -24811,107 +24764,107 @@ msgstr "valeur trop longue pour le type character(%d)" msgid "value too long for type character varying(%d)" msgstr "valeur trop longue pour le type character varying(%d)" -#: utils/adt/varchar.c:732 utils/adt/varlena.c:1523 +#: utils/adt/varchar.c:732 utils/adt/varlena.c:1516 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "n'a pas pu déterminer le collationnement à utiliser pour la comparaison de chaîne" -#: utils/adt/varlena.c:1216 utils/adt/varlena.c:1963 +#: utils/adt/varlena.c:1209 utils/adt/varlena.c:1956 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "les collationnements non déterministes ne sont pas supportés pour les recherches de sous-chaînes" -#: utils/adt/varlena.c:1622 utils/adt/varlena.c:1635 +#: utils/adt/varlena.c:1615 utils/adt/varlena.c:1628 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "n'a pas pu convertir la chaîne en UTF-16 : erreur %lu" -#: utils/adt/varlena.c:1650 +#: utils/adt/varlena.c:1643 #, c-format msgid "could not compare Unicode strings: %m" msgstr "n'a pas pu comparer les chaînes unicode : %m" -#: utils/adt/varlena.c:1701 utils/adt/varlena.c:2415 +#: utils/adt/varlena.c:1694 utils/adt/varlena.c:2408 #, c-format msgid "collation failed: %s" msgstr "échec du collationnement : %s" -#: utils/adt/varlena.c:2623 +#: utils/adt/varlena.c:2616 #, c-format msgid "sort key generation failed: %s" msgstr "échec de génération de la clé de tri : %s" -#: utils/adt/varlena.c:3517 utils/adt/varlena.c:3584 +#: utils/adt/varlena.c:3510 utils/adt/varlena.c:3577 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "index %d en dehors des limites valides, 0..%d" -#: utils/adt/varlena.c:3548 utils/adt/varlena.c:3620 +#: utils/adt/varlena.c:3541 utils/adt/varlena.c:3613 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "index %lld en dehors des limites valides, 0..%lld" -#: utils/adt/varlena.c:4656 +#: utils/adt/varlena.c:4649 #, c-format msgid "field position must not be zero" msgstr "la position du champ ne doit pas être zéro" -#: utils/adt/varlena.c:5697 +#: utils/adt/varlena.c:5690 #, c-format msgid "unterminated format() type specifier" msgstr "spécificateur de type pour format() non terminé" -#: utils/adt/varlena.c:5698 utils/adt/varlena.c:5832 utils/adt/varlena.c:5953 +#: utils/adt/varlena.c:5691 utils/adt/varlena.c:5825 utils/adt/varlena.c:5946 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Pour un unique \"%%\" utilisez \"%%%%\"." -#: utils/adt/varlena.c:5830 utils/adt/varlena.c:5951 +#: utils/adt/varlena.c:5823 utils/adt/varlena.c:5944 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "spécificateur de type « %.*s » pour format() non reconnu" -#: utils/adt/varlena.c:5843 utils/adt/varlena.c:5900 +#: utils/adt/varlena.c:5836 utils/adt/varlena.c:5893 #, c-format msgid "too few arguments for format()" msgstr "trop peu d'arguments pour format()" -#: utils/adt/varlena.c:5996 utils/adt/varlena.c:6178 +#: utils/adt/varlena.c:5989 utils/adt/varlena.c:6171 #, c-format msgid "number is out of range" msgstr "le nombre est en dehors des limites" -#: utils/adt/varlena.c:6059 utils/adt/varlena.c:6087 +#: utils/adt/varlena.c:6052 utils/adt/varlena.c:6080 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "le format indique l'argument 0 mais les arguments sont numérotés à partir de 1" -#: utils/adt/varlena.c:6080 +#: utils/adt/varlena.c:6073 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "la position de l'argument width doit se terminer par « $ »" -#: utils/adt/varlena.c:6125 +#: utils/adt/varlena.c:6118 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "les valeurs NULL ne peuvent pas être formatés comme un identifiant SQL" -#: utils/adt/varlena.c:6251 +#: utils/adt/varlena.c:6244 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "La normalisation Unicode peut seulement être exécutée si l'encodage serveur est UTF8" -#: utils/adt/varlena.c:6264 +#: utils/adt/varlena.c:6257 #, c-format msgid "invalid normalization form: %s" msgstr "forme de normalisation invalide : %s" -#: utils/adt/varlena.c:6467 utils/adt/varlena.c:6502 utils/adt/varlena.c:6537 +#: utils/adt/varlena.c:6460 utils/adt/varlena.c:6495 utils/adt/varlena.c:6530 #, c-format msgid "invalid Unicode code point: %04X" msgstr "point code Unicode invalide : %04X" -#: utils/adt/varlena.c:6567 +#: utils/adt/varlena.c:6560 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." msgstr "Les échappements Unicode doivent être de la forme \\XXXX, \\+XXXXXX, \\uXXXX ou \\UXXXXXXXX." @@ -25127,17 +25080,17 @@ msgstr "la classe d'opérateur « %s » de la méthode d'accès %s nécessite la msgid "cached plan must not change result type" msgstr "le plan en cache ne doit pas modifier le type en résultat" -#: utils/cache/relcache.c:6223 +#: utils/cache/relcache.c:6324 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "n'a pas pu créer le fichier d'initialisation relation-cache « %s » : %m" -#: utils/cache/relcache.c:6225 +#: utils/cache/relcache.c:6326 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Continue malgré tout, mais quelque chose s'est mal passé." -#: utils/cache/relcache.c:6547 +#: utils/cache/relcache.c:6648 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "n'a pas pu supprimer le fichier cache « %s » : %m" @@ -25149,19 +25102,19 @@ msgstr "" "ne peut pas préparer (PREPARE) une transaction qui a modifié la correspondance\n" "de relation" -#: utils/cache/relmapper.c:761 +#: utils/cache/relmapper.c:767 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "le fichier de correspondance des relations « %s » contient des données invalides" -#: utils/cache/relmapper.c:771 +#: utils/cache/relmapper.c:777 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "" "le fichier de correspondance des relations « %s » contient une somme de\n" "contrôle incorrecte" -#: utils/cache/typcache.c:1808 utils/fmgr/funcapi.c:463 +#: utils/cache/typcache.c:1811 utils/fmgr/funcapi.c:463 #, c-format msgid "record type has not been registered" msgstr "le type d'enregistrement n'a pas été enregistré" @@ -25393,6 +25346,11 @@ msgstr "" msgid "argument declared %s does not contain a range type but type %s" msgstr "l'argument déclaré %s ne contient pas un type d'intervalle mais un type %s" +#: utils/fmgr/funcapi.c:614 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "n'a pas pu trouver le type multirange pour le type de données %s" + #: utils/fmgr/funcapi.c:1831 utils/fmgr/funcapi.c:1863 #, c-format msgid "number of aliases does not match number of columns" @@ -25447,7 +25405,7 @@ msgstr "le répertoire des données « %s » a des permissions non valides" msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "Les droits devraient être u=rwx (0700) ou u=rwx,g=rx (0750)." -#: utils/init/miscinit.c:645 utils/misc/guc.c:7481 +#: utils/init/miscinit.c:645 utils/misc/guc.c:7482 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "" @@ -25555,7 +25513,7 @@ msgstr "" msgid "could not write lock file \"%s\": %m" msgstr "n'a pas pu écrire le fichier verrou « %s » : %m" -#: utils/init/miscinit.c:1357 utils/init/miscinit.c:1499 utils/misc/guc.c:10377 +#: utils/init/miscinit.c:1357 utils/init/miscinit.c:1499 utils/misc/guc.c:10378 #, c-format msgid "could not read from file \"%s\": %m" msgstr "n'a pas pu lire à partir du fichier « %s » : %m" @@ -26041,8 +25999,8 @@ msgid "Enables the planner's use of materialization." msgstr "Active l'utilisation de la matérialisation par le planificateur." #: utils/misc/guc.c:1046 -msgid "Enables the planner's use of result caching." -msgstr "Active l'utilisation du cache de résultat par le planificateur." +msgid "Enables the planner's use of memoization." +msgstr "Active l'utilisation de la mémorisation par le planificateur." #: utils/misc/guc.c:1056 msgid "Enables the planner's use of nested-loop join plans." @@ -26219,133 +26177,133 @@ msgstr "Réinitialisation du serveur après un arrêt brutal d'un processus serv msgid "Remove temporary files after backend crash." msgstr "Suppression des fichiers temporaires après un arrêt brutal d'un processus serveur." -#: utils/misc/guc.c:1418 +#: utils/misc/guc.c:1419 msgid "Logs the duration of each completed SQL statement." msgstr "Trace la durée de chaque instruction SQL terminée." -#: utils/misc/guc.c:1427 +#: utils/misc/guc.c:1428 msgid "Logs each query's parse tree." msgstr "Trace l'arbre d'analyse de chaque requête." -#: utils/misc/guc.c:1436 +#: utils/misc/guc.c:1437 msgid "Logs each query's rewritten parse tree." msgstr "Trace l'arbre d'analyse réécrit de chaque requête." -#: utils/misc/guc.c:1445 +#: utils/misc/guc.c:1446 msgid "Logs each query's execution plan." msgstr "Trace le plan d'exécution de chaque requête." -#: utils/misc/guc.c:1454 +#: utils/misc/guc.c:1455 msgid "Indents parse and plan tree displays." msgstr "Indente l'affichage des arbres d'analyse et de planification." -#: utils/misc/guc.c:1463 +#: utils/misc/guc.c:1464 msgid "Writes parser performance statistics to the server log." msgstr "" "Écrit les statistiques de performance de l'analyseur dans les journaux applicatifs\n" "du serveur." -#: utils/misc/guc.c:1472 +#: utils/misc/guc.c:1473 msgid "Writes planner performance statistics to the server log." msgstr "" "Écrit les statistiques de performance de planification dans les journaux\n" "applicatifs du serveur." -#: utils/misc/guc.c:1481 +#: utils/misc/guc.c:1482 msgid "Writes executor performance statistics to the server log." msgstr "" "Écrit les statistiques de performance de l'exécuteur dans les journaux applicatifs\n" "du serveur." -#: utils/misc/guc.c:1490 +#: utils/misc/guc.c:1491 msgid "Writes cumulative performance statistics to the server log." msgstr "" "Écrit les statistiques de performance cumulatives dans les journaux applicatifs\n" "du serveur." -#: utils/misc/guc.c:1500 +#: utils/misc/guc.c:1501 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "Trace les statistiques d'utilisation des ressources systèmes (mémoire et CPU) sur les différentes opérations B-tree." -#: utils/misc/guc.c:1512 +#: utils/misc/guc.c:1513 msgid "Collects information about executing commands." msgstr "Récupère les statistiques sur les commandes en exécution." -#: utils/misc/guc.c:1513 +#: utils/misc/guc.c:1514 msgid "Enables the collection of information on the currently executing command of each session, along with the time at which that command began execution." msgstr "" "Active la récupération d'informations sur la commande en cours d'exécution\n" "pour chaque session, avec l'heure de début de l'exécution de la commande." -#: utils/misc/guc.c:1523 +#: utils/misc/guc.c:1524 msgid "Collects statistics on database activity." msgstr "Récupère les statistiques sur l'activité de la base de données." -#: utils/misc/guc.c:1532 +#: utils/misc/guc.c:1533 msgid "Collects timing statistics for database I/O activity." msgstr "Récupère les statistiques d'horodatage sur l'activité en entrées/sorties de la base de données." -#: utils/misc/guc.c:1541 +#: utils/misc/guc.c:1542 msgid "Collects timing statistics for WAL I/O activity." msgstr "Récupère les statistiques d'horodatage sur l'activité en entrées/sorties des journaux de transactions." -#: utils/misc/guc.c:1551 +#: utils/misc/guc.c:1552 msgid "Updates the process title to show the active SQL command." msgstr "" "Met à jour le titre du processus pour indiquer la commande SQL en cours\n" "d'exécution." -#: utils/misc/guc.c:1552 +#: utils/misc/guc.c:1553 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "" "Active la mise à jour du titre du processus chaque fois qu'une nouvelle\n" "commande SQL est reçue par le serveur." -#: utils/misc/guc.c:1565 +#: utils/misc/guc.c:1566 msgid "Starts the autovacuum subprocess." msgstr "Exécute le sous-processus de l'autovacuum." -#: utils/misc/guc.c:1575 +#: utils/misc/guc.c:1576 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Génère une sortie de débogage pour LISTEN et NOTIFY." -#: utils/misc/guc.c:1587 +#: utils/misc/guc.c:1588 msgid "Emits information about lock usage." msgstr "Émet des informations sur l'utilisation des verrous." -#: utils/misc/guc.c:1597 +#: utils/misc/guc.c:1598 msgid "Emits information about user lock usage." msgstr "Émet des informations sur l'utilisation des verrous utilisateurs." -#: utils/misc/guc.c:1607 +#: utils/misc/guc.c:1608 msgid "Emits information about lightweight lock usage." msgstr "Émet des informations sur l'utilisation des verrous légers." -#: utils/misc/guc.c:1617 +#: utils/misc/guc.c:1618 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "Trace les informations sur les verrous actuels lorsqu'un délai sur le deadlock est dépassé." -#: utils/misc/guc.c:1629 +#: utils/misc/guc.c:1630 msgid "Logs long lock waits." msgstr "Trace les attentes longues de verrou." -#: utils/misc/guc.c:1638 +#: utils/misc/guc.c:1639 msgid "Logs standby recovery conflict waits." -msgstr "" +msgstr "Trace les attentes sur les conflits de restauration du secondaire." -#: utils/misc/guc.c:1647 +#: utils/misc/guc.c:1648 msgid "Logs the host name in the connection logs." msgstr "Trace le nom d'hôte dans les traces de connexion." -#: utils/misc/guc.c:1648 +#: utils/misc/guc.c:1649 msgid "By default, connection logs only show the IP address of the connecting host. If you want them to show the host name you can turn this on, but depending on your host name resolution setup it might impose a non-negligible performance penalty." msgstr "Par défaut, une connexion ne trace que l'adresse IP de l'hôte se connectant. Si vous voulez que s'affiche le nom de l'hôte, vous pouvez activer cette option mais, selon la configuration de la résolution de noms de votre hôte, cela peut imposer un coût en performances non négligeable." -#: utils/misc/guc.c:1659 +#: utils/misc/guc.c:1660 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Traite « expr=NULL » comme « expr IS NULL »." -#: utils/misc/guc.c:1660 +#: utils/misc/guc.c:1661 msgid "When turned on, expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL, that is, they return true if expr evaluates to the null value, and false otherwise. The correct behavior of expr = NULL is to always return null (unknown)." msgstr "" "Une fois activé, les expressions de la forme expr = NULL (ou NULL = expr)\n" @@ -26353,329 +26311,329 @@ msgstr "" "l'expression est évaluée comme étant NULL et false sinon. Le comportement\n" "correct de expr = NULL est de toujours renvoyer NULL (inconnu)." -#: utils/misc/guc.c:1672 +#: utils/misc/guc.c:1673 msgid "Enables per-database user names." msgstr "Active les noms d'utilisateur par base de données." -#: utils/misc/guc.c:1681 +#: utils/misc/guc.c:1682 msgid "Sets the default read-only status of new transactions." msgstr "Initialise le statut de lecture seule par défaut des nouvelles transactions." -#: utils/misc/guc.c:1691 +#: utils/misc/guc.c:1692 msgid "Sets the current transaction's read-only status." msgstr "Affiche le statut de lecture seule de la transaction actuelle." -#: utils/misc/guc.c:1701 +#: utils/misc/guc.c:1702 msgid "Sets the default deferrable status of new transactions." msgstr "Initialise le statut déferrable par défaut des nouvelles transactions." -#: utils/misc/guc.c:1710 +#: utils/misc/guc.c:1711 msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." msgstr "" "S'il faut repousser une transaction sérialisable en lecture seule jusqu'à ce qu'elle\n" "puisse être exécutée sans échecs possibles de sérialisation." -#: utils/misc/guc.c:1720 +#: utils/misc/guc.c:1721 msgid "Enable row security." msgstr "Active la sécurité niveau ligne." -#: utils/misc/guc.c:1721 +#: utils/misc/guc.c:1722 msgid "When enabled, row security will be applied to all users." msgstr "Lorsqu'il est activé, le mode de sécurité niveau ligne sera appliqué à tous les utilisateurs." -#: utils/misc/guc.c:1729 +#: utils/misc/guc.c:1730 msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." msgstr "Vérifie les corps de routine lors du CREATE FUNCTION et du CREATE PROCEDURE." -#: utils/misc/guc.c:1738 +#: utils/misc/guc.c:1739 msgid "Enable input of NULL elements in arrays." msgstr "Active la saisie d'éléments NULL dans les tableaux." -#: utils/misc/guc.c:1739 +#: utils/misc/guc.c:1740 msgid "When turned on, unquoted NULL in an array input value means a null value; otherwise it is taken literally." msgstr "" "Si activé, un NULL sans guillemets en tant que valeur d'entrée dans un\n" "tableau signifie une valeur NULL ; sinon, il sera pris littéralement." -#: utils/misc/guc.c:1755 +#: utils/misc/guc.c:1756 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OID n'est plus supporté ; ce paramètre ne peut être positionné qu'à false (faux)." -#: utils/misc/guc.c:1765 +#: utils/misc/guc.c:1766 msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "" "Lance un sous-processus pour capturer la sortie d'erreurs (stderr) et/ou\n" "csvlogs dans des journaux applicatifs." -#: utils/misc/guc.c:1774 +#: utils/misc/guc.c:1775 msgid "Truncate existing log files of same name during log rotation." msgstr "" "Tronque les journaux applicatifs existants du même nom lors de la rotation\n" "des journaux applicatifs." -#: utils/misc/guc.c:1785 +#: utils/misc/guc.c:1786 msgid "Emit information about resource usage in sorting." msgstr "Émet des informations sur l'utilisation des ressources lors d'un tri." -#: utils/misc/guc.c:1799 +#: utils/misc/guc.c:1800 msgid "Generate debugging output for synchronized scanning." msgstr "Génère une sortie de débogage pour les parcours synchronisés." -#: utils/misc/guc.c:1814 +#: utils/misc/guc.c:1815 msgid "Enable bounded sorting using heap sort." msgstr "Active le tri limité en utilisant le tri de heap." -#: utils/misc/guc.c:1827 +#: utils/misc/guc.c:1828 msgid "Emit WAL-related debugging output." msgstr "Émet une sortie de débogage concernant les journaux de transactions." -#: utils/misc/guc.c:1839 +#: utils/misc/guc.c:1840 msgid "Shows whether datetimes are integer based." msgstr "Indique si les types datetime sont basés sur des entiers." -#: utils/misc/guc.c:1850 +#: utils/misc/guc.c:1851 msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgstr "" "Indique si les noms d'utilisateurs Kerberos et GSSAPI devraient être traités\n" "sans se soucier de la casse." -#: utils/misc/guc.c:1860 +#: utils/misc/guc.c:1861 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Avertie sur les échappements par antislash dans les chaînes ordinaires." -#: utils/misc/guc.c:1870 +#: utils/misc/guc.c:1871 msgid "Causes '...' strings to treat backslashes literally." msgstr "Fait que les chaînes '...' traitent les antislashs littéralement." -#: utils/misc/guc.c:1881 +#: utils/misc/guc.c:1882 msgid "Enable synchronized sequential scans." msgstr "Active l'utilisation des parcours séquentiels synchronisés." -#: utils/misc/guc.c:1891 +#: utils/misc/guc.c:1892 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "Définit s'il faut inclure ou exclure la transaction de la cible de restauration." -#: utils/misc/guc.c:1901 +#: utils/misc/guc.c:1902 msgid "Allows connections and queries during recovery." msgstr "Autorise les connexions et les requêtes pendant la restauration." -#: utils/misc/guc.c:1911 +#: utils/misc/guc.c:1912 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "Permet l'envoi d'informations d'un serveur en hot standby vers le serveur principal pour éviter les conflits de requêtes." -#: utils/misc/guc.c:1921 +#: utils/misc/guc.c:1922 msgid "Shows whether hot standby is currently active." msgstr "Affiche si le hot standby est actuellement actif." -#: utils/misc/guc.c:1932 +#: utils/misc/guc.c:1933 msgid "Allows modifications of the structure of system tables." msgstr "Permet les modifications de la structure des tables systèmes." -#: utils/misc/guc.c:1943 +#: utils/misc/guc.c:1944 msgid "Disables reading from system indexes." msgstr "Désactive la lecture des index système." -#: utils/misc/guc.c:1944 +#: utils/misc/guc.c:1945 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "" "Cela n'empêche pas la mise à jour des index, donc vous pouvez l'utiliser en\n" "toute sécurité. La pire conséquence est la lenteur." -#: utils/misc/guc.c:1955 +#: utils/misc/guc.c:1956 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "" "Active la compatibilité ascendante pour la vérification des droits sur les\n" "Large Objects." -#: utils/misc/guc.c:1956 +#: utils/misc/guc.c:1957 msgid "Skips privilege checks when reading or modifying large objects, for compatibility with PostgreSQL releases prior to 9.0." msgstr "" "Ignore la vérification des droits lors de la lecture et de la modification\n" "des Larges Objects, pour la compatibilité avec les versions antérieures à la\n" "9.0." -#: utils/misc/guc.c:1966 +#: utils/misc/guc.c:1967 msgid "When generating SQL fragments, quote all identifiers." msgstr "Lors de la génération des rragments SQL, mettre entre guillemets tous les identifiants." -#: utils/misc/guc.c:1976 +#: utils/misc/guc.c:1977 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Affiche si les sommes de contrôle sont activées sur les données pour cette instance." -#: utils/misc/guc.c:1987 +#: utils/misc/guc.c:1988 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "Ajoute un numéro de séquence aux messages syslog pour éviter des suppressions de doublons." -#: utils/misc/guc.c:1997 +#: utils/misc/guc.c:1998 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "Sépare les messages envoyés à syslog par lignes afin de les faire tenir dans 1024 octets." -#: utils/misc/guc.c:2007 +#: utils/misc/guc.c:2008 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "Controle si les nœuds Gather et Gather Merge doivent également exécuter des sous-plans." -#: utils/misc/guc.c:2008 +#: utils/misc/guc.c:2009 msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "Est-ce que les nœuds Gather devraient également exécuter des sous-plans, ou juste recueillir des lignes ?" -#: utils/misc/guc.c:2018 +#: utils/misc/guc.c:2019 msgid "Allow JIT compilation." msgstr "Autorise la compilation JIT." -#: utils/misc/guc.c:2029 +#: utils/misc/guc.c:2030 msgid "Register JIT-compiled functions with debugger." msgstr "Enregistre les fonctions compilées avec JIT avec le debugger." -#: utils/misc/guc.c:2046 +#: utils/misc/guc.c:2047 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "Écrire le bitcode LLVM pour faciliter de débugage JIT." -#: utils/misc/guc.c:2057 +#: utils/misc/guc.c:2058 msgid "Allow JIT compilation of expressions." msgstr "Autorise la compilation JIT des expressions." -#: utils/misc/guc.c:2068 +#: utils/misc/guc.c:2069 msgid "Register JIT-compiled functions with perf profiler." msgstr "Enregistre les fonctions compilées avec JIT avec l'outil de profilage perf." -#: utils/misc/guc.c:2085 +#: utils/misc/guc.c:2086 msgid "Allow JIT compilation of tuple deforming." msgstr "Autorise la compilation JIT de la décomposition des lignes." -#: utils/misc/guc.c:2096 +#: utils/misc/guc.c:2097 msgid "Whether to continue running after a failure to sync data files." msgstr "Soit de continuer à s'exécuter après un échec lors de la synchronisation des fichiers de données." -#: utils/misc/guc.c:2105 +#: utils/misc/guc.c:2106 msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." msgstr "Configure si un wal receiver doit créer un slot de réplication temporaire si aucun slot permanent n'est configuré." -#: utils/misc/guc.c:2123 +#: utils/misc/guc.c:2124 msgid "Forces a switch to the next WAL file if a new file has not been started within N seconds." msgstr "" "Force un changement du journal de transaction si un nouveau fichier n'a pas\n" "été créé depuis N secondes." -#: utils/misc/guc.c:2134 +#: utils/misc/guc.c:2135 msgid "Waits N seconds on connection startup after authentication." msgstr "Attends N secondes après l'authentification." -#: utils/misc/guc.c:2135 utils/misc/guc.c:2733 +#: utils/misc/guc.c:2136 utils/misc/guc.c:2734 msgid "This allows attaching a debugger to the process." msgstr "Ceci permet d'attacher un débogueur au processus." -#: utils/misc/guc.c:2144 +#: utils/misc/guc.c:2145 msgid "Sets the default statistics target." msgstr "Initialise la cible par défaut des statistiques." -#: utils/misc/guc.c:2145 +#: utils/misc/guc.c:2146 msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." msgstr "" "Ceci s'applique aux colonnes de tables qui n'ont pas de cible spécifique\n" "pour la colonne initialisée via ALTER TABLE SET STATISTICS." -#: utils/misc/guc.c:2154 +#: utils/misc/guc.c:2155 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "" "Initialise la taille de la liste FROM en dehors de laquelle les\n" "sous-requêtes ne sont pas rassemblées." -#: utils/misc/guc.c:2156 +#: utils/misc/guc.c:2157 msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." msgstr "" "Le planificateur fusionne les sous-requêtes dans des requêtes supérieures\n" "si la liste FROM résultante n'a pas plus de ce nombre d'éléments." -#: utils/misc/guc.c:2167 +#: utils/misc/guc.c:2168 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "" "Initialise la taille de la liste FROM en dehors de laquelle les contructions\n" "JOIN ne sont pas aplanies." -#: utils/misc/guc.c:2169 +#: utils/misc/guc.c:2170 msgid "The planner will flatten explicit JOIN constructs into lists of FROM items whenever a list of no more than this many items would result." msgstr "" "La planificateur applanira les constructions JOIN explicites dans des listes\n" "d'éléments FROM lorsqu'une liste d'au plus ce nombre d'éléments en\n" "résulterait." -#: utils/misc/guc.c:2180 +#: utils/misc/guc.c:2181 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "Initialise la limite des éléments FROM en dehors de laquelle GEQO est utilisé." -#: utils/misc/guc.c:2190 +#: utils/misc/guc.c:2191 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "" "GEQO : l'effort est utilisé pour initialiser une valeur par défaut pour les\n" "autres paramètres GEQO." -#: utils/misc/guc.c:2200 +#: utils/misc/guc.c:2201 msgid "GEQO: number of individuals in the population." msgstr "GEQO : nombre d'individus dans une population." -#: utils/misc/guc.c:2201 utils/misc/guc.c:2211 +#: utils/misc/guc.c:2202 utils/misc/guc.c:2212 msgid "Zero selects a suitable default value." msgstr "Zéro sélectionne une valeur par défaut convenable." -#: utils/misc/guc.c:2210 +#: utils/misc/guc.c:2211 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO : nombre d'itérations dans l'algorithme." -#: utils/misc/guc.c:2222 +#: utils/misc/guc.c:2223 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Temps d'attente du verrou avant de vérifier les verrous bloqués." -#: utils/misc/guc.c:2233 +#: utils/misc/guc.c:2234 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "Définit le délai maximum avant d'annuler les requêtes lorsqu'un serveur « hot standby » traite les données des journaux de transactions archivés" -#: utils/misc/guc.c:2244 +#: utils/misc/guc.c:2245 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "" "Initialise le délai maximum avant d'annuler les requêtes lorsqu'un serveur en\n" "hotstandby traite les données des journaux de transactions envoyés en flux." -#: utils/misc/guc.c:2255 +#: utils/misc/guc.c:2256 msgid "Sets the minimum delay for applying changes during recovery." msgstr "Définit la durée minimale pour appliquer des changements lors de la restauration." -#: utils/misc/guc.c:2266 +#: utils/misc/guc.c:2267 msgid "Sets the maximum interval between WAL receiver status reports to the sending server." msgstr "Définit l'intervalle maximum entre les rapports du statut du walreceiver au serveur émetteur." -#: utils/misc/guc.c:2277 +#: utils/misc/guc.c:2278 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "Définit la durée maximale d'attente pour réceptionner des donnés du serveur émetteur." -#: utils/misc/guc.c:2288 +#: utils/misc/guc.c:2289 msgid "Sets the maximum number of concurrent connections." msgstr "Nombre maximum de connexions simultanées." -#: utils/misc/guc.c:2299 +#: utils/misc/guc.c:2300 msgid "Sets the number of connection slots reserved for superusers." msgstr "Nombre de connexions réservées aux super-utilisateurs." -#: utils/misc/guc.c:2309 +#: utils/misc/guc.c:2310 msgid "Amount of dynamic shared memory reserved at startup." msgstr "Quantité de mémoire partagée dynamique réservée au démarrage." -#: utils/misc/guc.c:2324 +#: utils/misc/guc.c:2325 msgid "Sets the number of shared memory buffers used by the server." msgstr "Nombre de tampons en mémoire partagée utilisé par le serveur." -#: utils/misc/guc.c:2335 +#: utils/misc/guc.c:2336 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Nombre maximum de tampons en mémoire partagée utilisés par chaque session." -#: utils/misc/guc.c:2346 +#: utils/misc/guc.c:2347 msgid "Sets the TCP port the server listens on." msgstr "Port TCP sur lequel le serveur écoutera." -#: utils/misc/guc.c:2356 +#: utils/misc/guc.c:2357 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Droits d'accès au socket domaine Unix." -#: utils/misc/guc.c:2357 +#: utils/misc/guc.c:2358 msgid "Unix-domain sockets use the usual Unix file system permission set. The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "" "Les sockets de domaine Unix utilise l'ensemble des droits habituels du système\n" @@ -26683,231 +26641,231 @@ msgstr "" "mode numérique de la forme acceptée par les appels système chmod et umask\n" "(pour utiliser le format octal, le nombre doit commencer par un zéro)." -#: utils/misc/guc.c:2371 +#: utils/misc/guc.c:2372 msgid "Sets the file permissions for log files." msgstr "Initialise les droits des fichiers de trace." -#: utils/misc/guc.c:2372 +#: utils/misc/guc.c:2373 msgid "The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "" "La valeur du paramètre est attendue dans le format numérique du mode accepté\n" "par les appels système chmod et umask (pour utiliser le format octal\n" "personnalisé, le numéro doit commencer par un zéro)." -#: utils/misc/guc.c:2386 +#: utils/misc/guc.c:2387 msgid "Shows the mode of the data directory." msgstr "Affiche le mode du répertoire des données." -#: utils/misc/guc.c:2387 +#: utils/misc/guc.c:2388 msgid "The parameter value is a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "" "La valeur du paramètre est une spécification numérique de mode dans la forme acceptée\n" "par les appels système chmod et umask (pour utiliser le format octal\n" "personnalisé, le numéro doit commencer par un 0 (zéro).)" -#: utils/misc/guc.c:2400 +#: utils/misc/guc.c:2401 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Initialise la mémoire maximum utilisée pour les espaces de travail des requêtes." -#: utils/misc/guc.c:2401 +#: utils/misc/guc.c:2402 msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." msgstr "" "Spécifie la mémoire à utiliser par les opérations de tris internes et par\n" "les tables de hachage avant de passer sur des fichiers temporaires sur disque." -#: utils/misc/guc.c:2413 +#: utils/misc/guc.c:2414 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Initialise la mémoire maximum utilisée pour les opérations de maintenance." -#: utils/misc/guc.c:2414 +#: utils/misc/guc.c:2415 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Ceci inclut les opérations comme VACUUM et CREATE INDEX." -#: utils/misc/guc.c:2424 +#: utils/misc/guc.c:2425 msgid "Sets the maximum memory to be used for logical decoding." msgstr "Initialise la mémoire maximum utilisée pour le décodage logique." -#: utils/misc/guc.c:2425 +#: utils/misc/guc.c:2426 msgid "This much memory can be used by each internal reorder buffer before spilling to disk." msgstr "Cette quantité de mémoire peut être utilisée par chaque cache de tri interne avant de passer sur des fichiers temporaires sur disque." -#: utils/misc/guc.c:2441 +#: utils/misc/guc.c:2442 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Initialise la profondeur maximale de la pile, en Ko." -#: utils/misc/guc.c:2452 +#: utils/misc/guc.c:2453 msgid "Limits the total size of all temporary files used by each process." msgstr "Limite la taille totale de tous les fichiers temporaires utilisés par chaque processus." -#: utils/misc/guc.c:2453 +#: utils/misc/guc.c:2454 msgid "-1 means no limit." msgstr "-1 signifie sans limite." -#: utils/misc/guc.c:2463 +#: utils/misc/guc.c:2464 msgid "Vacuum cost for a page found in the buffer cache." msgstr "Coût d'un VACUUM pour une page trouvée dans le cache du tampon." -#: utils/misc/guc.c:2473 +#: utils/misc/guc.c:2474 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "Coût d'un VACUUM pour une page introuvable dans le cache du tampon." -#: utils/misc/guc.c:2483 +#: utils/misc/guc.c:2484 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Coût d'un VACUUM pour une page modifiée par VACUUM." -#: utils/misc/guc.c:2493 +#: utils/misc/guc.c:2494 msgid "Vacuum cost amount available before napping." msgstr "Coût du VACUUM disponible avant un repos." -#: utils/misc/guc.c:2503 +#: utils/misc/guc.c:2504 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Coût du VACUUM disponible avant un repos, pour autovacuum." -#: utils/misc/guc.c:2513 +#: utils/misc/guc.c:2514 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "" "Initialise le nombre maximum de fichiers ouverts simultanément pour chaque\n" "processus serveur." -#: utils/misc/guc.c:2526 +#: utils/misc/guc.c:2527 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Initialise le nombre maximum de transactions préparées simultanément." -#: utils/misc/guc.c:2537 +#: utils/misc/guc.c:2538 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Initialise l'OID minimum des tables pour tracer les verrous." -#: utils/misc/guc.c:2538 +#: utils/misc/guc.c:2539 msgid "Is used to avoid output on system tables." msgstr "Est utilisé pour éviter la sortie sur des tables systèmes." -#: utils/misc/guc.c:2547 +#: utils/misc/guc.c:2548 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Configure l'OID de la table avec une trace des verrous sans condition." -#: utils/misc/guc.c:2559 +#: utils/misc/guc.c:2560 msgid "Sets the maximum allowed duration of any statement." msgstr "Initialise la durée maximum permise pour toute instruction." -#: utils/misc/guc.c:2560 utils/misc/guc.c:2571 utils/misc/guc.c:2582 utils/misc/guc.c:2593 +#: utils/misc/guc.c:2561 utils/misc/guc.c:2572 utils/misc/guc.c:2583 utils/misc/guc.c:2594 msgid "A value of 0 turns off the timeout." msgstr "Une valeur de 0 désactive le timeout." -#: utils/misc/guc.c:2570 +#: utils/misc/guc.c:2571 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Initialise la durée maximum permise pour toute attente d'un verrou." -#: utils/misc/guc.c:2581 +#: utils/misc/guc.c:2582 msgid "Sets the maximum allowed idle time between queries, when in a transaction." msgstr "Configure la durée maximale autorisée d'attente entre deux requêtes dans une transaction." -#: utils/misc/guc.c:2592 +#: utils/misc/guc.c:2593 msgid "Sets the maximum allowed idle time between queries, when not in a transaction." msgstr "Configure la durée maximale autorisée d'attente entre deux requêtes hors d'une transaction." -#: utils/misc/guc.c:2603 +#: utils/misc/guc.c:2604 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "Âge minimum à partir duquel VACUUM devra geler une ligne de table." -#: utils/misc/guc.c:2613 +#: utils/misc/guc.c:2614 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "Âge à partir duquel VACUUM devra parcourir une table complète pour geler les lignes." -#: utils/misc/guc.c:2623 +#: utils/misc/guc.c:2624 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "Âge minimum à partir duquel VACUUM devra geler un MultiXactId dans une ligne de table." -#: utils/misc/guc.c:2633 +#: utils/misc/guc.c:2634 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "" "Âge Multixact à partir duquel VACUUM devra parcourir une table complète pour geler les\n" "lignes." -#: utils/misc/guc.c:2643 +#: utils/misc/guc.c:2644 msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." msgstr "Nombre de transactions à partir duquel les nettoyages VACUUM et HOT doivent être déferrés." -#: utils/misc/guc.c:2652 +#: utils/misc/guc.c:2653 msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." -msgstr "" +msgstr "Âge à partir duquel le VACUUM doit déclencher le système de sécurité pour éviter un problème de réutilisation des identifiants de transaction." -#: utils/misc/guc.c:2661 +#: utils/misc/guc.c:2662 msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." -msgstr "" +msgstr "Âge du multixact à partir duquel le VACUUM doit déclencher le système de sécurité pour éviter un problème de réutilisation des identifiants de transaction." -#: utils/misc/guc.c:2674 +#: utils/misc/guc.c:2675 msgid "Sets the maximum number of locks per transaction." msgstr "Initialise le nombre maximum de verrous par transaction." -#: utils/misc/guc.c:2675 +#: utils/misc/guc.c:2676 msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." msgstr "" "La table des verrous partagés est dimensionnée sur l'idée qu'au plus\n" "max_locks_per_transaction * max_connections objets distincts auront besoin\n" "d'être verrouillés à tout moment." -#: utils/misc/guc.c:2686 +#: utils/misc/guc.c:2687 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Initialise le nombre maximum de verrous prédicats par transaction." -#: utils/misc/guc.c:2687 +#: utils/misc/guc.c:2688 msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." msgstr "" "La table des verrous de prédicat partagés est dimensionnée sur l'idée qu'au plus\n" "max_pred_locks_per_transaction * max_connections objets distincts auront besoin\n" "d'être verrouillés à tout moment." -#: utils/misc/guc.c:2698 +#: utils/misc/guc.c:2699 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "Initialise le nombre maximum de pages et lignes verrouillées avec prédicats par transaction." -#: utils/misc/guc.c:2699 +#: utils/misc/guc.c:2700 msgid "If more than this total of pages and tuples in the same relation are locked by a connection, those locks are replaced by a relation-level lock." msgstr "Si plus que ce nombre de pages et lignes dans la même relation sont verrouillées par une connexion, ces verrous sont remplacés par un verrou de niveau relation." -#: utils/misc/guc.c:2709 +#: utils/misc/guc.c:2710 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "Initialise le nombre maximum de lignes verrouillées avec prédicat par transaction." -#: utils/misc/guc.c:2710 +#: utils/misc/guc.c:2711 msgid "If more than this number of tuples on the same page are locked by a connection, those locks are replaced by a page-level lock." msgstr "Si plus que ce nombre de lignes sur la même page sont verrouillées par une connexion, ces verrous sont remplacés par un verrou de niveau de page." -#: utils/misc/guc.c:2720 +#: utils/misc/guc.c:2721 msgid "Sets the maximum allowed time to complete client authentication." msgstr "" "Initialise le temps maximum en secondes pour terminer l'authentification du\n" "client." -#: utils/misc/guc.c:2732 +#: utils/misc/guc.c:2733 msgid "Waits N seconds on connection startup before authentication." msgstr "Attends N secondes au lancement de la connexion avant l'authentification." -#: utils/misc/guc.c:2743 +#: utils/misc/guc.c:2744 msgid "Sets the size of WAL files held for standby servers." msgstr "Initialise la volumétrie de journaux de transactions conservés pour les serveurs standby." -#: utils/misc/guc.c:2754 +#: utils/misc/guc.c:2755 msgid "Sets the minimum size to shrink the WAL to." msgstr "Initialise la taille minimale à laquelle réduire l'espace des journaux de transaction." -#: utils/misc/guc.c:2766 +#: utils/misc/guc.c:2767 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Initialise la volumétrie de journaux de transaction qui déclenche un checkpoint." -#: utils/misc/guc.c:2778 +#: utils/misc/guc.c:2779 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "" "Initialise le temps maximum entre des points de vérification (checkpoints)\n" "pour les journaux de transactions." -#: utils/misc/guc.c:2789 +#: utils/misc/guc.c:2790 msgid "Enables warnings if checkpoint segments are filled more frequently than this." msgstr "" "Active des messages d'avertissement si les segments des points de\n" "vérifications se remplissent plus fréquemment que cette durée." -#: utils/misc/guc.c:2791 +#: utils/misc/guc.c:2792 msgid "Write a message to the server log if checkpoints caused by the filling of checkpoint segment files happens more frequently than this number of seconds. Zero turns off the warning." msgstr "" "Écrit un message dans les journaux applicatifs du serveur si les points de\n" @@ -26915,973 +26873,973 @@ msgstr "" "des points de vérification qui arrivent plus fréquemment que ce nombre de\n" "secondes. Une valeur 0 désactive l'avertissement." -#: utils/misc/guc.c:2803 utils/misc/guc.c:3019 utils/misc/guc.c:3066 +#: utils/misc/guc.c:2804 utils/misc/guc.c:3020 utils/misc/guc.c:3067 msgid "Number of pages after which previously performed writes are flushed to disk." msgstr "Nombre de pages après lequel les précédentes écritures seront synchronisées sur disque." -#: utils/misc/guc.c:2814 +#: utils/misc/guc.c:2815 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "" "Initialise le nombre de tampons de pages disque dans la mémoire partagée\n" "pour les journaux de transactions." -#: utils/misc/guc.c:2825 +#: utils/misc/guc.c:2826 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Temps entre les synchronisations des WAL sur disque effectuées par le processus d'écriture des journaux de transaction." -#: utils/misc/guc.c:2836 +#: utils/misc/guc.c:2837 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "Quantité de WAL écrits par le processus d'écriture des journaux de transaction devant déclencher une synchronisation sur disque." -#: utils/misc/guc.c:2847 +#: utils/misc/guc.c:2848 msgid "Minimum size of new file to fsync instead of writing WAL." msgstr "Taille minimale d'un nouveau fichier à synchroniser sur disque au lieu d'écrire dans les journaux de transactions." -#: utils/misc/guc.c:2858 +#: utils/misc/guc.c:2859 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "" "Initialise le nombre maximum de processus d'envoi des journaux de transactions\n" "exécutés simultanément." -#: utils/misc/guc.c:2869 +#: utils/misc/guc.c:2870 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Initialise le nombre maximum de slots de réplication définis simultanément." -#: utils/misc/guc.c:2879 +#: utils/misc/guc.c:2880 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "Initialise la volumétrie maximale des journaux de transactions pouvant être réservée pour les slots de réplication." -#: utils/misc/guc.c:2880 +#: utils/misc/guc.c:2881 msgid "Replication slots will be marked as failed, and segments released for deletion or recycling, if this much space is occupied by WAL on disk." msgstr "Les slots de réplication seront marqués comme échoués, et les segments relâchés pour suppression ou recyclage si autant d'espace est occupé par les journaux sur disque." -#: utils/misc/guc.c:2892 +#: utils/misc/guc.c:2893 msgid "Sets the maximum time to wait for WAL replication." msgstr "Initialise le temps maximum à attendre pour la réplication des WAL." -#: utils/misc/guc.c:2903 +#: utils/misc/guc.c:2904 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "" "Initialise le délai en microsecondes entre l'acceptation de la transaction\n" "et le vidage du journal de transaction sur disque." -#: utils/misc/guc.c:2915 +#: utils/misc/guc.c:2916 msgid "Sets the minimum concurrent open transactions before performing commit_delay." msgstr "" "Initialise le nombre minimum de transactions ouvertes simultanément avant le\n" "commit_delay." -#: utils/misc/guc.c:2926 +#: utils/misc/guc.c:2927 msgid "Sets the number of digits displayed for floating-point values." msgstr "Initialise le nombre de chiffres affichés pour les valeurs à virgule flottante." -#: utils/misc/guc.c:2927 +#: utils/misc/guc.c:2928 msgid "This affects real, double precision, and geometric data types. A zero or negative parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate). Any value greater than zero selects precise output mode." msgstr "Ceci affecte les types de données real, double precision et géométriques. Une valeur zéro ou négative du paramètre est ajoutée au nombre standard de chiffres (FLT_DIG ou DBL_DIG comme approprié). Toute valeur plus grande que zéro sélectionne le mode de sortie précis." -#: utils/misc/guc.c:2939 +#: utils/misc/guc.c:2940 msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." msgstr "Initialise le temps d'exécution minimum au-dessus duquel un échantillon de requêtes est tracé. L'échantillonnage est déterminé par log_statement_sample_rate." -#: utils/misc/guc.c:2942 +#: utils/misc/guc.c:2943 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "Zéro trace un échantillon de toutes les requêtes. -1 désactive cette fonctionnalité." -#: utils/misc/guc.c:2952 +#: utils/misc/guc.c:2953 msgid "Sets the minimum execution time above which all statements will be logged." msgstr "Initialise le temps d'exécution minimum au-dessus duquel toutes les requêtes seront tracées." -#: utils/misc/guc.c:2954 +#: utils/misc/guc.c:2955 msgid "Zero prints all queries. -1 turns this feature off." msgstr "Zéro affiche toutes les requêtes. -1 désactive cette fonctionnalité." -#: utils/misc/guc.c:2964 +#: utils/misc/guc.c:2965 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "" "Initialise le temps d'exécution minimum au-dessus duquel les actions\n" "autovacuum seront tracées." -#: utils/misc/guc.c:2966 +#: utils/misc/guc.c:2967 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "Zéro affiche toutes les requêtes. -1 désactive cette fonctionnalité." -#: utils/misc/guc.c:2976 +#: utils/misc/guc.c:2977 msgid "When logging statements, limit logged parameter values to first N bytes." msgstr "Lors de la trace des requêtes, limite les valeurs des paramètres tracés aux N premiers octets." -#: utils/misc/guc.c:2977 utils/misc/guc.c:2988 +#: utils/misc/guc.c:2978 utils/misc/guc.c:2989 msgid "-1 to print values in full." msgstr "-1 pour afficher les valeurs complètement." -#: utils/misc/guc.c:2987 +#: utils/misc/guc.c:2988 msgid "When reporting an error, limit logged parameter values to first N bytes." msgstr "Lors de la trace d'une erreur, limite les valeurs des paramètres tracés aux N premiers octets." -#: utils/misc/guc.c:2998 +#: utils/misc/guc.c:2999 msgid "Background writer sleep time between rounds." msgstr "Durée d'endormissement du processus d'écriture en tâche de fond (background writer) entre deux cycles." -#: utils/misc/guc.c:3009 +#: utils/misc/guc.c:3010 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "Nombre maximum de pages LRU à nettoyer par le processus d'écriture en tâche de fond (background writer)" -#: utils/misc/guc.c:3032 +#: utils/misc/guc.c:3033 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "Nombre de requêtes simultanées pouvant être gérées efficacement par le sous-système disque." -#: utils/misc/guc.c:3050 +#: utils/misc/guc.c:3051 msgid "A variant of effective_io_concurrency that is used for maintenance work." msgstr "Une variante de effective_io_concurrency pouvant être utilisée pour les travaux de maintenance." -#: utils/misc/guc.c:3079 +#: utils/misc/guc.c:3080 msgid "Maximum number of concurrent worker processes." msgstr "Nombre maximum de background workers simultanés." -#: utils/misc/guc.c:3091 +#: utils/misc/guc.c:3092 msgid "Maximum number of logical replication worker processes." msgstr "Nombre maximum de processus workers de réplication logique." -#: utils/misc/guc.c:3103 +#: utils/misc/guc.c:3104 msgid "Maximum number of table synchronization workers per subscription." msgstr "Nombre maximum de workers de synchronisation par souscription." -#: utils/misc/guc.c:3113 +#: utils/misc/guc.c:3114 msgid "Automatic log file rotation will occur after N minutes." msgstr "La rotation automatique des journaux applicatifs s'effectuera toutes les N minutes." -#: utils/misc/guc.c:3124 +#: utils/misc/guc.c:3125 msgid "Automatic log file rotation will occur after N kilobytes." msgstr "La rotation automatique des journaux applicatifs s'effectuera après N kilooctets." -#: utils/misc/guc.c:3135 +#: utils/misc/guc.c:3136 msgid "Shows the maximum number of function arguments." msgstr "Affiche le nombre maximum d'arguments de fonction." -#: utils/misc/guc.c:3146 +#: utils/misc/guc.c:3147 msgid "Shows the maximum number of index keys." msgstr "Affiche le nombre maximum de clés d'index." -#: utils/misc/guc.c:3157 +#: utils/misc/guc.c:3158 msgid "Shows the maximum identifier length." msgstr "Affiche la longueur maximum d'un identifiant." -#: utils/misc/guc.c:3168 +#: utils/misc/guc.c:3169 msgid "Shows the size of a disk block." msgstr "Affiche la taille d'un bloc de disque." -#: utils/misc/guc.c:3179 +#: utils/misc/guc.c:3180 msgid "Shows the number of pages per disk file." msgstr "Affiche le nombre de pages par fichier." -#: utils/misc/guc.c:3190 +#: utils/misc/guc.c:3191 msgid "Shows the block size in the write ahead log." msgstr "Affiche la taille du bloc dans les journaux de transactions." -#: utils/misc/guc.c:3201 +#: utils/misc/guc.c:3202 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "Initalise le temps à attendre avant de retenter de récupérer un WAL après une tentative infructueuse." -#: utils/misc/guc.c:3213 +#: utils/misc/guc.c:3214 msgid "Shows the size of write ahead log segments." msgstr "Affiche la taille des journaux de transactions." -#: utils/misc/guc.c:3226 +#: utils/misc/guc.c:3227 msgid "Time to sleep between autovacuum runs." msgstr "Durée d'endormissement entre deux exécutions d'autovacuum." -#: utils/misc/guc.c:3236 +#: utils/misc/guc.c:3237 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Nombre minimum de lignes mises à jour ou supprimées avant le VACUUM." -#: utils/misc/guc.c:3245 +#: utils/misc/guc.c:3246 msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." msgstr "Nombre minimum de lignes insérées avant un ANALYZE, ou -1 pour désactiver ce comportement" -#: utils/misc/guc.c:3254 +#: utils/misc/guc.c:3255 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "Nombre minimum de lignes insérées, mises à jour ou supprimées avant un ANALYZE." -#: utils/misc/guc.c:3264 +#: utils/misc/guc.c:3265 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "Âge à partir duquel l'autovacuum se déclenche sur une table pour empêcher un rebouclage des identifiants de transaction." -#: utils/misc/guc.c:3279 +#: utils/misc/guc.c:3280 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "Âge multixact à partir duquel l'autovacuum se déclenche sur une table pour empêcher la réinitialisation du multixact" -#: utils/misc/guc.c:3289 +#: utils/misc/guc.c:3290 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "Initialise le nombre maximum de processus autovacuum exécutés simultanément." -#: utils/misc/guc.c:3299 +#: utils/misc/guc.c:3300 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "Initialise le nombre maximum de processus parallèles par opération de maintenance." -#: utils/misc/guc.c:3309 +#: utils/misc/guc.c:3310 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Initialise le nombre maximum de processus parallèles par nœud d'exécution." -#: utils/misc/guc.c:3320 +#: utils/misc/guc.c:3321 msgid "Sets the maximum number of parallel workers that can be active at one time." msgstr "Configure le nombre maximum de processus parallélisés pouvant être actifs en même temps." -#: utils/misc/guc.c:3331 +#: utils/misc/guc.c:3332 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "Initialise la mémoire maximum utilisée par chaque processus autovacuum worker." -#: utils/misc/guc.c:3342 +#: utils/misc/guc.c:3343 msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." msgstr "Temps à partir duquel un snapshot est trop ancien pour lire des pages ayant changées après que le snapshot ait été effectué." -#: utils/misc/guc.c:3343 +#: utils/misc/guc.c:3344 msgid "A value of -1 disables this feature." msgstr "Une valeur de -1 désactive cette fonctionnalité." -#: utils/misc/guc.c:3353 +#: utils/misc/guc.c:3354 msgid "Time between issuing TCP keepalives." msgstr "Secondes entre l'exécution de « TCP keepalives »." -#: utils/misc/guc.c:3354 utils/misc/guc.c:3365 utils/misc/guc.c:3489 +#: utils/misc/guc.c:3355 utils/misc/guc.c:3366 utils/misc/guc.c:3490 msgid "A value of 0 uses the system default." msgstr "Une valeur de 0 utilise la valeur par défaut du système." -#: utils/misc/guc.c:3364 +#: utils/misc/guc.c:3365 msgid "Time between TCP keepalive retransmits." msgstr "Secondes entre les retransmissions de « TCP keepalive »." -#: utils/misc/guc.c:3375 +#: utils/misc/guc.c:3376 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "La renégociation SSL n'est plus supportée; ce paramètre ne peut être positionné qu'à 0." -#: utils/misc/guc.c:3386 +#: utils/misc/guc.c:3387 msgid "Maximum number of TCP keepalive retransmits." msgstr "Nombre maximum de retransmissions de « TCP keepalive »." -#: utils/misc/guc.c:3387 +#: utils/misc/guc.c:3388 msgid "This controls the number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." msgstr "" "Ceci contrôle le nombre de retransmissions keepalive consécutives qui\n" "peuvent être perdues avant qu'une connexion ne soit considérée morte. Une\n" "valeur de 0 utilise la valeur par défaut du système." -#: utils/misc/guc.c:3398 +#: utils/misc/guc.c:3399 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "Configure le nombre maximum de résultats lors d'une recherche par GIN." -#: utils/misc/guc.c:3409 +#: utils/misc/guc.c:3410 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "Initialise le sentiment du planificateur sur la taille des caches disques." -#: utils/misc/guc.c:3410 +#: utils/misc/guc.c:3411 msgid "That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." msgstr "" "C'est-à-dire, la portion des caches disques (noyau et PostgreSQL) qui sera utilisé pour les\n" "fichiers de données de PostgreSQL. C'est mesuré en pages disque, qui font\n" "normalement 8 Ko chaque." -#: utils/misc/guc.c:3421 +#: utils/misc/guc.c:3422 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "Configure la quantité minimale de données de table pour un parcours parallèle." -#: utils/misc/guc.c:3422 +#: utils/misc/guc.c:3423 msgid "If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered." msgstr "Si le planificateur estime qu'il lira un nombre de blocs de table trop petit pour atteindre cette limite, un parcours parallèle ne sera pas considéré." -#: utils/misc/guc.c:3432 +#: utils/misc/guc.c:3433 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "Configure la quantité minimale de données d'index pour un parcours parallèle." -#: utils/misc/guc.c:3433 +#: utils/misc/guc.c:3434 msgid "If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered." msgstr "Si le planificateur estime qu'il lira un nombre de blocs d'index trop petit pour atteindre cette limite, un parcours parallèle ne sera pas considéré." -#: utils/misc/guc.c:3444 +#: utils/misc/guc.c:3445 msgid "Shows the server version as an integer." msgstr "Affiche la version du serveur sous la forme d'un entier." -#: utils/misc/guc.c:3455 +#: utils/misc/guc.c:3456 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "" "Trace l'utilisation de fichiers temporaires plus gros que ce nombre de\n" "kilooctets." -#: utils/misc/guc.c:3456 +#: utils/misc/guc.c:3457 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "" "Zéro trace toutes les requêtes. La valeur par défaut est -1 (désactivant\n" "cette fonctionnalité)." -#: utils/misc/guc.c:3466 +#: utils/misc/guc.c:3467 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Configure la taille réservée pour pg_stat_activity.query, en octets." -#: utils/misc/guc.c:3477 +#: utils/misc/guc.c:3478 msgid "Sets the maximum size of the pending list for GIN index." msgstr "Configure la taille maximale de la pending list d'un index GIN." -#: utils/misc/guc.c:3488 +#: utils/misc/guc.c:3489 msgid "TCP user timeout." msgstr "Délai d'attente maximal TCP utilisateur." -#: utils/misc/guc.c:3499 +#: utils/misc/guc.c:3500 msgid "The size of huge page that should be requested." msgstr "La taille du Huge Page devant être réclamé." -#: utils/misc/guc.c:3510 -msgid "Aggressively invalidate system caches for debugging purposes." -msgstr "" +#: utils/misc/guc.c:3511 +msgid "Aggressively flush system caches for debugging purposes." +msgstr "Vide agressivement les caches systèmes pour du débogage." -#: utils/misc/guc.c:3533 +#: utils/misc/guc.c:3534 msgid "Sets the time interval between checks for disconnection while running queries." msgstr "Configure l'intervalle de temps entre des vérifications de déconnexion lors de l'exécution de requêtes." -#: utils/misc/guc.c:3553 +#: utils/misc/guc.c:3554 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "" "Initialise l'estimation du planificateur pour le coût d'une page disque\n" "récupérée séquentiellement." -#: utils/misc/guc.c:3564 +#: utils/misc/guc.c:3565 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "" "Initialise l'estimation du plnnificateur pour le coût d'une page disque\n" "récupérée non séquentiellement." -#: utils/misc/guc.c:3575 +#: utils/misc/guc.c:3576 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "" "Initialise l'estimation du planificateur pour le coût d'exécution sur chaque\n" "ligne." -#: utils/misc/guc.c:3586 +#: utils/misc/guc.c:3587 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." msgstr "" "Initialise l'estimation du planificateur pour le coût de traitement de\n" "chaque ligne indexée lors d'un parcours d'index." -#: utils/misc/guc.c:3597 +#: utils/misc/guc.c:3598 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "" "Initialise l'estimation du planificateur pour le coût de traitement de\n" "chaque opérateur ou appel de fonction." -#: utils/misc/guc.c:3608 +#: utils/misc/guc.c:3609 msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." msgstr "Configure l'estimation du planificateur pour le coût de passage de chaque ligne d'un processus worker vers son processus leader." -#: utils/misc/guc.c:3619 +#: utils/misc/guc.c:3620 msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." msgstr "Initialise l'estimation du planificateur pour le coût de démarrage des processus d'exécution de requêtes parallèles." -#: utils/misc/guc.c:3631 +#: utils/misc/guc.c:3632 msgid "Perform JIT compilation if query is more expensive." msgstr "Effectuer une compilation JIT si la requête est plus coûteuse." -#: utils/misc/guc.c:3632 +#: utils/misc/guc.c:3633 msgid "-1 disables JIT compilation." msgstr "-1 désactive la compilation JIT." -#: utils/misc/guc.c:3642 +#: utils/misc/guc.c:3643 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "Optimise les fonctions compilées avec JIT si la requête est plus coûteuse." -#: utils/misc/guc.c:3643 +#: utils/misc/guc.c:3644 msgid "-1 disables optimization." msgstr "-1 désactive l'optimisation." -#: utils/misc/guc.c:3653 +#: utils/misc/guc.c:3654 msgid "Perform JIT inlining if query is more expensive." msgstr "Effectuer un inlining JIT si la requête est plus coûteuse." -#: utils/misc/guc.c:3654 +#: utils/misc/guc.c:3655 msgid "-1 disables inlining." msgstr "-1 désactive l'inlining." -#: utils/misc/guc.c:3664 +#: utils/misc/guc.c:3665 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgstr "Initialise l'estimation du planificateur de la fraction des lignes d'un curseur à récupérer." -#: utils/misc/guc.c:3676 +#: utils/misc/guc.c:3677 msgid "GEQO: selective pressure within the population." msgstr "GEQO : pression sélective dans la population." -#: utils/misc/guc.c:3687 +#: utils/misc/guc.c:3688 msgid "GEQO: seed for random path selection." msgstr "GEQO : graine pour la sélection du chemin aléatoire." -#: utils/misc/guc.c:3698 +#: utils/misc/guc.c:3699 msgid "Multiple of work_mem to use for hash tables." msgstr "Multiple de work_mem à utiliser pour les tables de hachage." -#: utils/misc/guc.c:3709 +#: utils/misc/guc.c:3710 msgid "Multiple of the average buffer usage to free per round." msgstr "Multiplede l'utilisation moyenne des tampons à libérer à chaque tour." -#: utils/misc/guc.c:3719 +#: utils/misc/guc.c:3720 msgid "Sets the seed for random-number generation." msgstr "Initialise la clé pour la génération de nombres aléatoires." -#: utils/misc/guc.c:3730 +#: utils/misc/guc.c:3731 msgid "Vacuum cost delay in milliseconds." msgstr "Délai d'un coût de VACUUM en millisecondes." -#: utils/misc/guc.c:3741 +#: utils/misc/guc.c:3742 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Délai d'un coût de VACUUM en millisecondes, pour autovacuum." -#: utils/misc/guc.c:3752 +#: utils/misc/guc.c:3753 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "" "Nombre de lignes modifiées ou supprimées avant d'exécuter un VACUUM\n" "(fraction de reltuples)." -#: utils/misc/guc.c:3762 +#: utils/misc/guc.c:3763 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "Nombre de lignes insérées avant d'effectuer un VACUUM (fraction de reltuples)." -#: utils/misc/guc.c:3772 +#: utils/misc/guc.c:3773 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "" "Nombre de lignes insérées, mises à jour ou supprimées avant d'analyser\n" "une fraction de reltuples." -#: utils/misc/guc.c:3782 +#: utils/misc/guc.c:3783 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." msgstr "" "Temps passé à vider les tampons lors du point de vérification, en tant que\n" "fraction de l'intervalle du point de vérification." -#: utils/misc/guc.c:3792 +#: utils/misc/guc.c:3793 msgid "Fraction of statements exceeding log_min_duration_sample to be logged." msgstr "Fraction de requêtes dépassant log_min_duration_sample à tracer" -#: utils/misc/guc.c:3793 +#: utils/misc/guc.c:3794 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "Utilisez une valeur entre 0,0 (pas de trace) et 1.0 (tracer tout)." -#: utils/misc/guc.c:3802 +#: utils/misc/guc.c:3803 msgid "Sets the fraction of transactions from which to log all statements." msgstr "Configure la fraction des transactions pour lesquelles il faut tracer toutes les requêtes" -#: utils/misc/guc.c:3803 +#: utils/misc/guc.c:3804 msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." msgstr "Utiliser une valeur entre 0.0 (aucune trace) et 1.0 (trace tous les requêtes de toutes les transactions)." -#: utils/misc/guc.c:3822 +#: utils/misc/guc.c:3823 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "La commande shell qui sera appelée pour archiver un journal de transaction." -#: utils/misc/guc.c:3832 +#: utils/misc/guc.c:3833 msgid "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "Définit la commande shell qui sera appelée pour récupérer un fichier WAL archivé." -#: utils/misc/guc.c:3842 +#: utils/misc/guc.c:3843 msgid "Sets the shell command that will be executed at every restart point." msgstr "Définit la commande shell qui sera appelée à chaque point de reprise (restart point)." -#: utils/misc/guc.c:3852 +#: utils/misc/guc.c:3853 msgid "Sets the shell command that will be executed once at the end of recovery." msgstr "Définit la commande shell qui sera appelée une fois à la fin de la restauration." -#: utils/misc/guc.c:3862 +#: utils/misc/guc.c:3863 msgid "Specifies the timeline to recover into." msgstr "Définit la timeline cible de la restauration." -#: utils/misc/guc.c:3872 +#: utils/misc/guc.c:3873 msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." msgstr "Positionner à « immediate » pour arrêter la restauration dès qu'un état consistent est atteint." -#: utils/misc/guc.c:3881 +#: utils/misc/guc.c:3882 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "Définit l'identifiant de transaction jusqu'où la restauration s'effectuera." -#: utils/misc/guc.c:3890 +#: utils/misc/guc.c:3891 msgid "Sets the time stamp up to which recovery will proceed." msgstr "Définit le point dans le temps jusqu'où la restauration s'effectuera." -#: utils/misc/guc.c:3899 +#: utils/misc/guc.c:3900 msgid "Sets the named restore point up to which recovery will proceed." msgstr "Définit le point de restauration nommé jusqu'où la restauration va procéder." -#: utils/misc/guc.c:3908 +#: utils/misc/guc.c:3909 msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." msgstr "Définit le LSN des journaux de transactions jusqu'où la restauration s'effectuera." # trigger_file -#: utils/misc/guc.c:3918 +#: utils/misc/guc.c:3919 msgid "Specifies a file name whose presence ends recovery in the standby." msgstr "Définit un nom de fichier dont la présence termine la restauration du serveur secondaire." -#: utils/misc/guc.c:3928 +#: utils/misc/guc.c:3929 msgid "Sets the connection string to be used to connect to the sending server." msgstr "Définit la chaîne de connexion à utiliser pour se connecter au serveur émetteur." -#: utils/misc/guc.c:3939 +#: utils/misc/guc.c:3940 msgid "Sets the name of the replication slot to use on the sending server." msgstr "Définit le nom du slot de réplication à utiliser sur le serveur émetteur." -#: utils/misc/guc.c:3949 +#: utils/misc/guc.c:3950 msgid "Sets the client's character set encoding." msgstr "Initialise l'encodage du client." -#: utils/misc/guc.c:3960 +#: utils/misc/guc.c:3961 msgid "Controls information prefixed to each log line." msgstr "Contrôle l'information préfixée sur chaque ligne de trace." -#: utils/misc/guc.c:3961 +#: utils/misc/guc.c:3962 msgid "If blank, no prefix is used." msgstr "Si vide, aucun préfixe n'est utilisé." -#: utils/misc/guc.c:3970 +#: utils/misc/guc.c:3971 msgid "Sets the time zone to use in log messages." msgstr "Initialise le fuseau horaire à utiliser pour les journaux applicatifs." -#: utils/misc/guc.c:3980 +#: utils/misc/guc.c:3981 msgid "Sets the display format for date and time values." msgstr "Initialise le format d'affichage des valeurs date et time." -#: utils/misc/guc.c:3981 +#: utils/misc/guc.c:3982 msgid "Also controls interpretation of ambiguous date inputs." -msgstr "Contrôle aussi l'interprétation des dates ambiguës en entrée." +msgstr "Contrôle aussi l'interprétation des dates ambigües en entrée." -#: utils/misc/guc.c:3992 +#: utils/misc/guc.c:3993 msgid "Sets the default table access method for new tables." msgstr "Définit la méthode d'accès par défaut pour les nouvelles tables." -#: utils/misc/guc.c:4003 +#: utils/misc/guc.c:4004 msgid "Sets the default tablespace to create tables and indexes in." msgstr "Initialise le tablespace par défaut pour créer les tables et index." -#: utils/misc/guc.c:4004 +#: utils/misc/guc.c:4005 msgid "An empty string selects the database's default tablespace." msgstr "Une chaîne vide sélectionne le tablespace par défaut de la base de données." -#: utils/misc/guc.c:4014 +#: utils/misc/guc.c:4015 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "" "Initialise le(s) tablespace(s) à utiliser pour les tables temporaires et les\n" "fichiers de tri." -#: utils/misc/guc.c:4025 +#: utils/misc/guc.c:4026 msgid "Sets the path for dynamically loadable modules." msgstr "Initialise le chemin des modules chargeables dynamiquement." -#: utils/misc/guc.c:4026 +#: utils/misc/guc.c:4027 msgid "If a dynamically loadable module needs to be opened and the specified name does not have a directory component (i.e., the name does not contain a slash), the system will search this path for the specified file." msgstr "" "Si un module chargeable dynamiquement a besoin d'être ouvert et que le nom\n" "spécifié n'a pas une composante répertoire (c'est-à-dire que le nom ne\n" "contient pas un '/'), le système cherche le fichier spécifié sur ce chemin." -#: utils/misc/guc.c:4039 +#: utils/misc/guc.c:4040 msgid "Sets the location of the Kerberos server key file." msgstr "Initalise l'emplacement du fichier de la clé serveur pour Kerberos." -#: utils/misc/guc.c:4050 +#: utils/misc/guc.c:4051 msgid "Sets the Bonjour service name." msgstr "Initialise le nom du service Bonjour." -#: utils/misc/guc.c:4062 +#: utils/misc/guc.c:4063 msgid "Shows the collation order locale." msgstr "Affiche la locale de tri et de groupement." -#: utils/misc/guc.c:4073 +#: utils/misc/guc.c:4074 msgid "Shows the character classification and case conversion locale." msgstr "Affiche la classification des caractères et la locale de conversions." -#: utils/misc/guc.c:4084 +#: utils/misc/guc.c:4085 msgid "Sets the language in which messages are displayed." msgstr "Initialise le langage dans lequel les messages sont affichés." -#: utils/misc/guc.c:4094 +#: utils/misc/guc.c:4095 msgid "Sets the locale for formatting monetary amounts." msgstr "Initialise la locale pour le formattage des montants monétaires." -#: utils/misc/guc.c:4104 +#: utils/misc/guc.c:4105 msgid "Sets the locale for formatting numbers." msgstr "Initialise la locale pour formater les nombres." -#: utils/misc/guc.c:4114 +#: utils/misc/guc.c:4115 msgid "Sets the locale for formatting date and time values." msgstr "Initialise la locale pour formater les valeurs date et time." -#: utils/misc/guc.c:4124 +#: utils/misc/guc.c:4125 msgid "Lists shared libraries to preload into each backend." msgstr "Liste les bibliothèques partagées à précharger dans chaque processus serveur." -#: utils/misc/guc.c:4135 +#: utils/misc/guc.c:4136 msgid "Lists shared libraries to preload into server." msgstr "Liste les bibliothèques partagées à précharger dans le serveur." -#: utils/misc/guc.c:4146 +#: utils/misc/guc.c:4147 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "Liste les bibliothèques partagées non privilégiées à précharger dans chaque processus serveur." -#: utils/misc/guc.c:4157 +#: utils/misc/guc.c:4158 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "" "Initialise l'ordre de recherche des schémas pour les noms qui ne précisent\n" "pas le schéma." -#: utils/misc/guc.c:4169 +#: utils/misc/guc.c:4170 msgid "Shows the server (database) character set encoding." msgstr "Affiche l'encodage des caractères pour le serveur (base de données)." -#: utils/misc/guc.c:4181 +#: utils/misc/guc.c:4182 msgid "Shows the server version." msgstr "Affiche la version du serveur." -#: utils/misc/guc.c:4193 +#: utils/misc/guc.c:4194 msgid "Sets the current role." msgstr "Initialise le rôle courant." -#: utils/misc/guc.c:4205 +#: utils/misc/guc.c:4206 msgid "Sets the session user name." msgstr "Initialise le nom de l'utilisateur de la session." -#: utils/misc/guc.c:4216 +#: utils/misc/guc.c:4217 msgid "Sets the destination for server log output." msgstr "Initialise la destination des journaux applicatifs du serveur." -#: utils/misc/guc.c:4217 +#: utils/misc/guc.c:4218 msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and \"eventlog\", depending on the platform." msgstr "" "Les valeurs valides sont une combinaison de « stderr », « syslog »,\n" "« csvlog » et « eventlog », suivant la plateforme." -#: utils/misc/guc.c:4228 +#: utils/misc/guc.c:4229 msgid "Sets the destination directory for log files." msgstr "Initialise le répertoire de destination pour les journaux applicatifs." -#: utils/misc/guc.c:4229 +#: utils/misc/guc.c:4230 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "Accepte un chemin relatif ou absolu pour le répertoire des données." -#: utils/misc/guc.c:4239 +#: utils/misc/guc.c:4240 msgid "Sets the file name pattern for log files." msgstr "Initialise le modèle de nom de fichiers pour les journaux applicatifs." -#: utils/misc/guc.c:4250 +#: utils/misc/guc.c:4251 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "" "Initialise le nom du programme utilisé pour identifier les messages de\n" "PostgreSQL dans syslog." -#: utils/misc/guc.c:4261 +#: utils/misc/guc.c:4262 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "" "Initialise le nom de l'application, utilisé pour identifier les messages de\n" "PostgreSQL dans eventlog." -#: utils/misc/guc.c:4272 +#: utils/misc/guc.c:4273 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "Initialise la zone horaire pour afficher et interpréter les dates/heures." -#: utils/misc/guc.c:4282 +#: utils/misc/guc.c:4283 msgid "Selects a file of time zone abbreviations." msgstr "Sélectionne un fichier contenant les abréviations des fuseaux horaires." -#: utils/misc/guc.c:4292 +#: utils/misc/guc.c:4293 msgid "Sets the owning group of the Unix-domain socket." msgstr "Initialise le groupe d'appartenance du socket domaine Unix." -#: utils/misc/guc.c:4293 +#: utils/misc/guc.c:4294 msgid "The owning user of the socket is always the user that starts the server." msgstr "Le propriétaire du socket est toujours l'utilisateur qui a lancé le serveur." -#: utils/misc/guc.c:4303 +#: utils/misc/guc.c:4304 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Initialise les répertoires où les sockets de domaine Unix seront créés." -#: utils/misc/guc.c:4318 +#: utils/misc/guc.c:4319 msgid "Sets the host name or IP address(es) to listen to." msgstr "Initialise le nom de l'hôte ou l'adresse IP à écouter." -#: utils/misc/guc.c:4333 +#: utils/misc/guc.c:4334 msgid "Sets the server's data directory." msgstr "Initialise le répertoire des données du serveur." -#: utils/misc/guc.c:4344 +#: utils/misc/guc.c:4345 msgid "Sets the server's main configuration file." msgstr "Voir le fichier de configuration principal du serveur." -#: utils/misc/guc.c:4355 +#: utils/misc/guc.c:4356 msgid "Sets the server's \"hba\" configuration file." msgstr "Initialise le fichier de configuration « hba » du serveur." -#: utils/misc/guc.c:4366 +#: utils/misc/guc.c:4367 msgid "Sets the server's \"ident\" configuration file." msgstr "Initialise le fichier de configuration « ident » du serveur." -#: utils/misc/guc.c:4377 +#: utils/misc/guc.c:4378 msgid "Writes the postmaster PID to the specified file." msgstr "Écrit le PID du postmaster PID dans le fichier spécifié." -#: utils/misc/guc.c:4388 +#: utils/misc/guc.c:4389 msgid "Shows the name of the SSL library." msgstr "Affiche le nom de la bibliothèque SSL." -#: utils/misc/guc.c:4403 +#: utils/misc/guc.c:4404 msgid "Location of the SSL server certificate file." msgstr "Emplacement du fichier du certificat serveur SSL." -#: utils/misc/guc.c:4413 +#: utils/misc/guc.c:4414 msgid "Location of the SSL server private key file." msgstr "Emplacement du fichier de la clé privée SSL du serveur." -#: utils/misc/guc.c:4423 +#: utils/misc/guc.c:4424 msgid "Location of the SSL certificate authority file." msgstr "Emplacement du fichier du certificat autorité SSL." -#: utils/misc/guc.c:4433 +#: utils/misc/guc.c:4434 msgid "Location of the SSL certificate revocation list file." msgstr "Emplacement du fichier de liste de révocation des certificats SSL." -#: utils/misc/guc.c:4443 +#: utils/misc/guc.c:4444 msgid "Location of the SSL certificate revocation list directory." msgstr "Emplacement du répertoire de liste de révocation des certificats SSL." -#: utils/misc/guc.c:4453 +#: utils/misc/guc.c:4454 msgid "Writes temporary statistics files to the specified directory." msgstr "Écrit les fichiers statistiques temporaires dans le répertoire indiqué." -#: utils/misc/guc.c:4464 +#: utils/misc/guc.c:4465 msgid "Number of synchronous standbys and list of names of potential synchronous ones." msgstr "Nombre de standbys synchrones et liste des noms des synchrones potentiels." -#: utils/misc/guc.c:4475 +#: utils/misc/guc.c:4476 msgid "Sets default text search configuration." msgstr "Initialise la configuration par défaut de la recherche plein texte." -#: utils/misc/guc.c:4485 +#: utils/misc/guc.c:4486 msgid "Sets the list of allowed SSL ciphers." msgstr "Initialise la liste des chiffrements SSL autorisés." -#: utils/misc/guc.c:4500 +#: utils/misc/guc.c:4501 msgid "Sets the curve to use for ECDH." msgstr "Initialise la courbe à utiliser pour ECDH." -#: utils/misc/guc.c:4515 +#: utils/misc/guc.c:4516 msgid "Location of the SSL DH parameters file." msgstr "Emplacement du fichier des paramètres DH SSL." -#: utils/misc/guc.c:4526 +#: utils/misc/guc.c:4527 msgid "Command to obtain passphrases for SSL." msgstr "Commande pour obtenir la phrase de passe pour SSL." -#: utils/misc/guc.c:4537 +#: utils/misc/guc.c:4538 msgid "Sets the application name to be reported in statistics and logs." msgstr "Configure le nom de l'application à indiquer dans les statistiques et les journaux." -#: utils/misc/guc.c:4548 +#: utils/misc/guc.c:4549 msgid "Sets the name of the cluster, which is included in the process title." msgstr "Configure le nom du cluster, qui est inclus dans le titre du processus." -#: utils/misc/guc.c:4559 +#: utils/misc/guc.c:4560 msgid "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "Configure les gestionnaires de ressource des WAL pour lesquels des vérifications de cohérence sont effectuées." -#: utils/misc/guc.c:4560 +#: utils/misc/guc.c:4561 msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." msgstr "Des images complètes de bloc seront tracées pour tous les blocs de données et vérifiées avec le résultat du rejeu des journaux de transactions." -#: utils/misc/guc.c:4570 +#: utils/misc/guc.c:4571 msgid "JIT provider to use." msgstr "Fournisseur JIT à utiliser." -#: utils/misc/guc.c:4581 +#: utils/misc/guc.c:4582 msgid "Log backtrace for errors in these functions." msgstr "Trace la pile pour les erreurs dans ces fonctions." -#: utils/misc/guc.c:4601 +#: utils/misc/guc.c:4602 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Indique si « \\' » est autorisé dans une constante de chaîne." -#: utils/misc/guc.c:4611 +#: utils/misc/guc.c:4612 msgid "Sets the output format for bytea." msgstr "Initialise le format de sortie pour bytea." -#: utils/misc/guc.c:4621 +#: utils/misc/guc.c:4622 msgid "Sets the message levels that are sent to the client." msgstr "Initialise les niveaux de message envoyés au client." -#: utils/misc/guc.c:4622 utils/misc/guc.c:4708 utils/misc/guc.c:4719 utils/misc/guc.c:4795 +#: utils/misc/guc.c:4623 utils/misc/guc.c:4709 utils/misc/guc.c:4720 utils/misc/guc.c:4796 msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." msgstr "" "Chaque niveau inclut les niveaux qui suivent. Plus loin sera le niveau,\n" "moindre sera le nombre de messages envoyés." -#: utils/misc/guc.c:4632 +#: utils/misc/guc.c:4633 msgid "Compute query identifiers." msgstr "Calcule les identifiants de requête." -#: utils/misc/guc.c:4642 +#: utils/misc/guc.c:4643 msgid "Enables the planner to use constraints to optimize queries." msgstr "Active l'utilisation des contraintes par le planificateur pour optimiser les requêtes." -#: utils/misc/guc.c:4643 +#: utils/misc/guc.c:4644 msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." msgstr "" "Les parcours de tables seront ignorés si leur contraintes garantissent\n" "qu'aucune ligne ne correspond à la requête." -#: utils/misc/guc.c:4654 +#: utils/misc/guc.c:4655 msgid "Sets the default compression method for compressible values." msgstr "Définit la méthode de compression par défaut pour les valeurs compressibles." -#: utils/misc/guc.c:4665 +#: utils/misc/guc.c:4666 msgid "Sets the transaction isolation level of each new transaction." msgstr "Initialise le niveau d'isolation des transactions pour chaque nouvelle transaction." -#: utils/misc/guc.c:4675 +#: utils/misc/guc.c:4676 msgid "Sets the current transaction's isolation level." msgstr "Initialise le niveau d'isolation de la transaction courante." -#: utils/misc/guc.c:4686 +#: utils/misc/guc.c:4687 msgid "Sets the display format for interval values." msgstr "Initialise le format d'affichage des valeurs interval." -#: utils/misc/guc.c:4697 +#: utils/misc/guc.c:4698 msgid "Sets the verbosity of logged messages." msgstr "Initialise la verbosité des messages tracés." -#: utils/misc/guc.c:4707 +#: utils/misc/guc.c:4708 msgid "Sets the message levels that are logged." msgstr "Initialise les niveaux de messages tracés." -#: utils/misc/guc.c:4718 +#: utils/misc/guc.c:4719 msgid "Causes all statements generating error at or above this level to be logged." msgstr "" "Génère une trace pour toutes les instructions qui produisent une erreur de\n" "ce niveau ou de niveaux plus importants." -#: utils/misc/guc.c:4729 +#: utils/misc/guc.c:4730 msgid "Sets the type of statements logged." msgstr "Initialise le type d'instructions tracées." -#: utils/misc/guc.c:4739 +#: utils/misc/guc.c:4740 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "" "Initialise le niveau (« facility ») de syslog à utiliser lors de l'activation\n" "de syslog." -#: utils/misc/guc.c:4754 +#: utils/misc/guc.c:4755 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "" "Configure le comportement des sessions pour les triggers et les règles de\n" "ré-écriture." -#: utils/misc/guc.c:4764 +#: utils/misc/guc.c:4765 msgid "Sets the current transaction's synchronization level." msgstr "Initialise le niveau d'isolation de la transaction courante." -#: utils/misc/guc.c:4774 +#: utils/misc/guc.c:4775 msgid "Allows archiving of WAL files using archive_command." msgstr "Autorise l'archivage des journaux de transactions en utilisant archive_command." -#: utils/misc/guc.c:4784 +#: utils/misc/guc.c:4785 msgid "Sets the action to perform upon reaching the recovery target." msgstr "Définit l'action à exécuter à l'arrivée à la cible de la restauration." -#: utils/misc/guc.c:4794 +#: utils/misc/guc.c:4795 msgid "Enables logging of recovery-related debugging information." msgstr "Active les traces sur les informations de débogage relatives à la restauration." -#: utils/misc/guc.c:4810 +#: utils/misc/guc.c:4811 msgid "Collects function-level statistics on database activity." msgstr "Récupère les statistiques niveau fonction sur l'activité de la base de données." -#: utils/misc/guc.c:4820 +#: utils/misc/guc.c:4821 msgid "Sets the level of information written to the WAL." msgstr "Configure le niveau des informations écrites dans les journaux de transactions." -#: utils/misc/guc.c:4830 +#: utils/misc/guc.c:4831 msgid "Selects the dynamic shared memory implementation used." msgstr "Sélectionne l'implémentation de la mémoire partagée dynamique." -#: utils/misc/guc.c:4840 +#: utils/misc/guc.c:4841 msgid "Selects the shared memory implementation used for the main shared memory region." msgstr "Sélectionne l'implémentation de mémoire partagée utilisée pour la principale région de mémoire partagée." -#: utils/misc/guc.c:4850 +#: utils/misc/guc.c:4851 msgid "Selects the method used for forcing WAL updates to disk." msgstr "" "Sélectionne la méthode utilisée pour forcer la mise à jour des journaux de\n" "transactions sur le disque." -#: utils/misc/guc.c:4860 +#: utils/misc/guc.c:4861 msgid "Sets how binary values are to be encoded in XML." msgstr "Configure comment les valeurs binaires seront codées en XML." -#: utils/misc/guc.c:4870 +#: utils/misc/guc.c:4871 msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." msgstr "" "Configure si les données XML dans des opérations d'analyse et de\n" "sérialisation implicite doivent être considérées comme des documents\n" "ou des fragments de contenu." -#: utils/misc/guc.c:4881 +#: utils/misc/guc.c:4882 msgid "Use of huge pages on Linux or Windows." msgstr "Utilisation des HugePages sur Linux ou Windows." -#: utils/misc/guc.c:4891 +#: utils/misc/guc.c:4892 msgid "Forces use of parallel query facilities." msgstr "Force l'utilisation des fonctionnalités de requête parallèle." -#: utils/misc/guc.c:4892 +#: utils/misc/guc.c:4893 msgid "If possible, run query using a parallel worker and with parallel restrictions." msgstr "Si possible, exécute des requêtes utilisant des processus parallèles et avec les restrictions parallèles." -#: utils/misc/guc.c:4902 +#: utils/misc/guc.c:4903 msgid "Chooses the algorithm for encrypting passwords." msgstr "Choisit l'algorithme pour le chiffrement des mots de passe." -#: utils/misc/guc.c:4912 +#: utils/misc/guc.c:4913 msgid "Controls the planner's selection of custom or generic plan." msgstr "Contrôle le choix par le planificateur du plan personnalisé ou du plan générique." -#: utils/misc/guc.c:4913 +#: utils/misc/guc.c:4914 msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." msgstr "Les requêtes préparées peuvent avoir des plans particulier et générique, et le planificateur tentera de choisir le meilleur. Ceci peut être utilisé pour remplacer le comportement par défaut." -#: utils/misc/guc.c:4925 +#: utils/misc/guc.c:4926 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "Définit la version minimale du protocole SSL/TLS à utiliser." -#: utils/misc/guc.c:4937 +#: utils/misc/guc.c:4938 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "Définit la version maximum du protocole SSL/TLS à utiliser." -#: utils/misc/guc.c:4949 +#: utils/misc/guc.c:4950 msgid "Sets the method for synchronizing the data directory before crash recovery." msgstr "Configure la méthode de synchronisation du répertoire de données avant la restauration après crash." -#: utils/misc/guc.c:5518 +#: utils/misc/guc.c:5519 #, c-format msgid "invalid configuration parameter name \"%s\"" msgstr "paramètre de configuration « %s » invalide" -#: utils/misc/guc.c:5520 +#: utils/misc/guc.c:5521 #, c-format msgid "Custom parameter names must be two or more simple identifiers separated by dots." msgstr "Les noms de paramètres personnalisés doivent avoir deux ou plusieurs identifiants simples séparés par des points." -#: utils/misc/guc.c:5529 utils/misc/guc.c:9288 +#: utils/misc/guc.c:5530 utils/misc/guc.c:9289 #, c-format msgid "unrecognized configuration parameter \"%s\"" msgstr "paramètre de configuration « %s » non reconnu" -#: utils/misc/guc.c:5822 +#: utils/misc/guc.c:5823 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n" -#: utils/misc/guc.c:5827 +#: utils/misc/guc.c:5828 #, c-format msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" msgstr "Lancer initdb ou pg_basebackup pour initialiser un répertoire de données PostgreSQL.\n" -#: utils/misc/guc.c:5847 +#: utils/misc/guc.c:5848 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -27890,12 +27848,12 @@ msgstr "" "%s ne sait pas où trouver le fichier de configuration du serveur.\n" "Vous devez soit spécifier l'option --config-file, soit spécifier l'option -D, soit initialiser la variable d'environnement PGDATA.\n" -#: utils/misc/guc.c:5866 +#: utils/misc/guc.c:5867 #, c-format msgid "%s: could not access the server configuration file \"%s\": %s\n" msgstr "%s : n'a pas pu accéder au fichier de configuration « %s » : %s\n" -#: utils/misc/guc.c:5892 +#: utils/misc/guc.c:5893 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -27904,7 +27862,7 @@ msgstr "" "%s ne sait pas où trouver les données du système de bases de données.\n" "Il est configurable avec « data_directory » dans « %s » ou avec l'option -D ou encore avec la variable d'environnement PGDATA.\n" -#: utils/misc/guc.c:5940 +#: utils/misc/guc.c:5941 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -27913,7 +27871,7 @@ msgstr "" "%s ne sait pas où trouver le fichier de configuration « hba ».\n" "Il est configurable avec « hba_file » dans « %s » ou avec l'option -D ou encore avec la variable d'environnement PGDATA.\n" -#: utils/misc/guc.c:5963 +#: utils/misc/guc.c:5964 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -27922,185 +27880,185 @@ msgstr "" "%s ne sait pas où trouver le fichier de configuration « hba ».\n" "Il est configurable avec « ident_file » dans « %s » ou avec l'option -D ou encore avec la variable d'environnement PGDATA.\n" -#: utils/misc/guc.c:6888 +#: utils/misc/guc.c:6889 msgid "Value exceeds integer range." msgstr "La valeur dépasse l'échelle des entiers." -#: utils/misc/guc.c:7124 +#: utils/misc/guc.c:7125 #, c-format msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d%s%s est en dehors des limites valides pour le paramètre « %s » (%d .. %d)" -#: utils/misc/guc.c:7160 +#: utils/misc/guc.c:7161 #, c-format msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" msgstr "%g%s%s est en dehors des limites valides pour le paramètre « %s » (%g .. %g)" -#: utils/misc/guc.c:7320 utils/misc/guc.c:8692 +#: utils/misc/guc.c:7321 utils/misc/guc.c:8693 #, c-format msgid "cannot set parameters during a parallel operation" msgstr "ne peut pas configurer les paramètres lors d'une opération parallèle" -#: utils/misc/guc.c:7337 utils/misc/guc.c:8533 +#: utils/misc/guc.c:7338 utils/misc/guc.c:8534 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "le paramètre « %s » ne peut pas être changé" -#: utils/misc/guc.c:7370 +#: utils/misc/guc.c:7371 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "le paramètre « %s » ne peut pas être modifié maintenant" -#: utils/misc/guc.c:7388 utils/misc/guc.c:7435 utils/misc/guc.c:11333 +#: utils/misc/guc.c:7389 utils/misc/guc.c:7436 utils/misc/guc.c:11334 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "droit refusé pour initialiser le paramètre « %s »" -#: utils/misc/guc.c:7425 +#: utils/misc/guc.c:7426 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "le paramètre « %s » ne peut pas être initialisé après le lancement du serveur" -#: utils/misc/guc.c:7473 +#: utils/misc/guc.c:7474 #, c-format msgid "cannot set parameter \"%s\" within security-definer function" msgstr "" "ne peut pas configurer le paramètre « %s » à l'intérieur d'une fonction\n" "SECURITY DEFINER" -#: utils/misc/guc.c:8106 utils/misc/guc.c:8153 utils/misc/guc.c:9550 +#: utils/misc/guc.c:8107 utils/misc/guc.c:8154 utils/misc/guc.c:9551 #, c-format msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" msgstr "doit être super-utilisateur ou membre de pg_read_all_settings pour examiner « %s »" -#: utils/misc/guc.c:8237 +#: utils/misc/guc.c:8238 #, c-format msgid "SET %s takes only one argument" msgstr "SET %s prend un seul argument" -#: utils/misc/guc.c:8485 +#: utils/misc/guc.c:8486 #, c-format msgid "must be superuser to execute ALTER SYSTEM command" msgstr "doit être super-utilisateur pour exécuter la commande ALTER SYSTEM" -#: utils/misc/guc.c:8566 +#: utils/misc/guc.c:8567 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "la valeur du paramètre pour ALTER SYSTEM ne doit pas contenir de caractère de retour à la ligne" -#: utils/misc/guc.c:8611 +#: utils/misc/guc.c:8612 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "n'a pas pu analyser le contenu du fichier « %s »" -#: utils/misc/guc.c:8768 +#: utils/misc/guc.c:8769 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOT n'est pas implémenté" -#: utils/misc/guc.c:8852 +#: utils/misc/guc.c:8853 #, c-format msgid "SET requires parameter name" msgstr "SET requiert le nom du paramètre" -#: utils/misc/guc.c:8985 +#: utils/misc/guc.c:8986 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "tentative de redéfinition du paramètre « %s »" -#: utils/misc/guc.c:10780 +#: utils/misc/guc.c:10781 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "lors de la configuration du paramètre « %s » en « %s »" -#: utils/misc/guc.c:10945 +#: utils/misc/guc.c:10946 #, c-format msgid "parameter \"%s\" could not be set" msgstr "le paramètre « %s » n'a pas pu être configuré" -#: utils/misc/guc.c:11037 +#: utils/misc/guc.c:11038 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "n'a pas pu analyser la configuration du paramètre « %s »" -#: utils/misc/guc.c:11395 utils/misc/guc.c:11429 +#: utils/misc/guc.c:11396 utils/misc/guc.c:11430 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "valeur invalide pour le paramètre « %s » : %d" -#: utils/misc/guc.c:11463 +#: utils/misc/guc.c:11464 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "valeur invalide pour le paramètre « %s » : %g" -#: utils/misc/guc.c:11750 +#: utils/misc/guc.c:11751 #, c-format msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." msgstr "« temp_buffers » ne peut pas être modifié après que des tables temporaires aient été utilisées dans la session." -#: utils/misc/guc.c:11762 +#: utils/misc/guc.c:11763 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour n'est pas supporté dans cette installation" -#: utils/misc/guc.c:11775 +#: utils/misc/guc.c:11776 #, c-format msgid "SSL is not supported by this build" msgstr "SSL n'est pas supporté dans cette installation" -#: utils/misc/guc.c:11787 +#: utils/misc/guc.c:11788 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "Ne peut pas activer le paramètre avec « log_statement_stats » à true." -#: utils/misc/guc.c:11799 +#: utils/misc/guc.c:11800 #, c-format msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." msgstr "" "Ne peut pas activer « log_statement_stats » lorsque « log_parser_stats »,\n" "« log_planner_stats » ou « log_executor_stats » est true." -#: utils/misc/guc.c:12029 +#: utils/misc/guc.c:12030 #, c-format msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "effective_io_concurrency doit être positionné à 0 sur les plateformes où manque posix_fadvise()" -#: utils/misc/guc.c:12042 +#: utils/misc/guc.c:12043 #, c-format msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "maintenance_io_concurrency doit être positionné à 0 sur les plateformes où manque posix_fadvise()" -#: utils/misc/guc.c:12056 +#: utils/misc/guc.c:12057 #, c-format msgid "huge_page_size must be 0 on this platform." msgstr "huge_page_size doit valoir 0 sur cette plateforme" -#: utils/misc/guc.c:12070 +#: utils/misc/guc.c:12071 #, c-format msgid "client_connection_check_interval must be set to 0 on platforms that lack POLLRDHUP." msgstr "client_connection_check_interval doit être positionné à 0 sur les plateformes où POLLRDHUP manque" -#: utils/misc/guc.c:12198 +#: utils/misc/guc.c:12199 #, c-format msgid "invalid character" msgstr "caractère invalide" -#: utils/misc/guc.c:12258 +#: utils/misc/guc.c:12259 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timeline n'est pas un nombre valide ." -#: utils/misc/guc.c:12298 +#: utils/misc/guc.c:12299 #, c-format msgid "multiple recovery targets specified" msgstr "multiples cibles de restauration spécifiées" -#: utils/misc/guc.c:12299 +#: utils/misc/guc.c:12300 #, c-format msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." msgstr "Une seule valeur peut être spécifiée, parmi recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid." -#: utils/misc/guc.c:12307 +#: utils/misc/guc.c:12308 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "La seule valeur autorisée est « immediate »." @@ -28227,15 +28185,15 @@ msgstr "Échec lors de la création du contexte mémoire « %s »." msgid "could not attach to dynamic shared area" msgstr "n'a pas pu attacher le segment de mémoire partagée dynamique" -#: utils/mmgr/mcxt.c:889 utils/mmgr/mcxt.c:925 utils/mmgr/mcxt.c:963 utils/mmgr/mcxt.c:1001 utils/mmgr/mcxt.c:1083 utils/mmgr/mcxt.c:1114 utils/mmgr/mcxt.c:1150 utils/mmgr/mcxt.c:1202 utils/mmgr/mcxt.c:1237 utils/mmgr/mcxt.c:1272 +#: utils/mmgr/mcxt.c:889 utils/mmgr/mcxt.c:925 utils/mmgr/mcxt.c:963 utils/mmgr/mcxt.c:1001 utils/mmgr/mcxt.c:1089 utils/mmgr/mcxt.c:1120 utils/mmgr/mcxt.c:1156 utils/mmgr/mcxt.c:1208 utils/mmgr/mcxt.c:1243 utils/mmgr/mcxt.c:1278 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "Échec d'une requête de taille %zu dans le contexte mémoire « %s »." -#: utils/mmgr/mcxt.c:1046 +#: utils/mmgr/mcxt.c:1052 #, c-format msgid "logging memory contexts of PID %d" -msgstr "" +msgstr "trace des contextes mémoires du PID %d" #: utils/mmgr/portalmem.c:187 #, c-format @@ -28247,27 +28205,27 @@ msgstr "le curseur « %s » existe déjà" msgid "closing existing cursor \"%s\"" msgstr "fermeture du curseur existant « %s »" -#: utils/mmgr/portalmem.c:400 +#: utils/mmgr/portalmem.c:401 #, c-format msgid "portal \"%s\" cannot be run" msgstr "le portail « %s » ne peut pas être exécuté de nouveau" -#: utils/mmgr/portalmem.c:478 +#: utils/mmgr/portalmem.c:479 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "ne peut pas supprimer le portail épinglé « %s »" -#: utils/mmgr/portalmem.c:486 +#: utils/mmgr/portalmem.c:487 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "ne peut pas supprimer le portail actif « %s »" -#: utils/mmgr/portalmem.c:736 +#: utils/mmgr/portalmem.c:738 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "ne peut pas préparer une transaction qui a créé un curseur WITH HOLD" -#: utils/mmgr/portalmem.c:1275 +#: utils/mmgr/portalmem.c:1279 #, c-format msgid "cannot perform transaction commands inside a cursor loop that is not read-only" msgstr "ne peut pas effectuer de commandes de transaction dans une boucle de curseur qui n'est pas en lecture seule" @@ -28337,1143 +28295,1198 @@ msgstr "n'a pas pu lire le fichier temporaire tuplestore : a lu seulement %zu oc msgid "The source transaction is not running anymore." msgstr "La transaction source n'est plus en cours d'exécution." -#: utils/time/snapmgr.c:1147 +#: utils/time/snapmgr.c:1162 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "ne peut pas exporter un snapshot dans un sous-transaction" -#: utils/time/snapmgr.c:1306 utils/time/snapmgr.c:1311 utils/time/snapmgr.c:1316 utils/time/snapmgr.c:1331 utils/time/snapmgr.c:1336 utils/time/snapmgr.c:1341 utils/time/snapmgr.c:1356 utils/time/snapmgr.c:1361 utils/time/snapmgr.c:1366 utils/time/snapmgr.c:1468 utils/time/snapmgr.c:1484 utils/time/snapmgr.c:1509 +#: utils/time/snapmgr.c:1321 utils/time/snapmgr.c:1326 utils/time/snapmgr.c:1331 utils/time/snapmgr.c:1346 utils/time/snapmgr.c:1351 utils/time/snapmgr.c:1356 utils/time/snapmgr.c:1371 utils/time/snapmgr.c:1376 utils/time/snapmgr.c:1381 utils/time/snapmgr.c:1483 utils/time/snapmgr.c:1499 utils/time/snapmgr.c:1524 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "données invalides du snapshot dans le fichier « %s »" -#: utils/time/snapmgr.c:1403 +#: utils/time/snapmgr.c:1418 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "SET TRANSACTION SNAPSHOT doit être appelé avant toute requête" -#: utils/time/snapmgr.c:1412 +#: utils/time/snapmgr.c:1427 #, c-format msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" msgstr "une transaction important un snapshot doit avoir le niveau d'isolation SERIALIZABLE ou REPEATABLE READ" -#: utils/time/snapmgr.c:1421 utils/time/snapmgr.c:1430 +#: utils/time/snapmgr.c:1436 utils/time/snapmgr.c:1445 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "identifiant invalide du snapshot : « %s »" -#: utils/time/snapmgr.c:1522 +#: utils/time/snapmgr.c:1537 #, c-format msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" msgstr "une transaction sérialisable ne peut pas importer un snapshot provenant d'une transaction non sérialisable" -#: utils/time/snapmgr.c:1526 +#: utils/time/snapmgr.c:1541 #, c-format msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" msgstr "une transaction sérialisable en écriture ne peut pas importer un snapshot provenant d'une transaction en lecture seule" -#: utils/time/snapmgr.c:1541 +#: utils/time/snapmgr.c:1556 #, c-format msgid "cannot import a snapshot from a different database" msgstr "ne peut pas importer un snapshot à partir d'une base de données différente" -#~ msgid "only simple column references and expressions are allowed in CREATE STATISTICS" -#~ msgstr "seules des références et expressions à une seule colonne sont acceptées dans CREATE STATISTICS" +#~ msgid " --help show this help, then exit\n" +#~ msgstr " --help affiche cette aide, puis quitte\n" -#~ msgid "ORIGIN message sent out of order" -#~ msgstr "message ORIGIN en désordre" +#~ msgid " --version output version information, then exit\n" +#~ msgstr " --version affiche la version, puis quitte\n" -#~ msgid "invalid logical replication message type \"%c\"" -#~ msgstr "type de message « %c » de la réplication logique invalide" +#~ msgid " -A 1|0 enable/disable run-time assert checking\n" +#~ msgstr "" +#~ " -A 1|0 active/désactive la vérification des limites (assert) à\n" +#~ " l'exécution\n" -#~ msgid "there is no contrecord flag at %X/%X reading %X/%X" -#~ msgstr "il n'existe pas de drapeau contrecord à %X/%X en lisant %X/%X" +#~ msgid " -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n" +#~ msgstr " -o OPTIONS passe « OPTIONS » à chaque processus serveur (obsolète)\n" -#~ msgid "invalid contrecord length %u at %X/%X reading %X/%X, expected %u" -#~ msgstr "longueur %u invalide du contrecord à %X/%X en lisant %X/%X, attendait %u" +#~ msgid " in schema %s" +#~ msgstr " dans le schéma %s" -#~ msgid "Connections and Authentication" -#~ msgstr "Connexions et authentification" +#~ msgid "\"%s\" has now caught up with upstream server" +#~ msgstr "« %s » a maintenant rattrapé le serveur en amont" -#~ msgid "Resource Usage" -#~ msgstr "Utilisation des ressources" +#~ msgid "\"%s\" is already an attribute of type %s" +#~ msgstr "« %s » est déjà un attribut du type %s" -#~ msgid "Write-Ahead Log" -#~ msgstr "Write-Ahead Log" +#~ msgid "\"%s\" is not a table or a view" +#~ msgstr "« %s » n'est pas une table ou une vue" -#~ msgid "Replication" -#~ msgstr "Réplication" +#~ msgid "\"%s\" is not a table, materialized view, composite type, or foreign table" +#~ msgstr "« %s » n'est ni une table, ni une vue matérialisée, ni un type composite, ni une table distante" -#~ msgid "Query Tuning" -#~ msgstr "Optimisation des requêtes" +#~ msgid "\"%s\" is not a table, view, or composite type" +#~ msgstr "« %s » n'est pas une table, une vue ou un type composite" -#~ msgid "Reporting and Logging" -#~ msgstr "Rapports et traces" +#~ msgid "\"%s\": moved %u row versions, truncated %u to %u pages" +#~ msgstr "« %s » : %u versions de ligne déplacées, %u pages tronquées sur %u" -#~ msgid "Process Title" -#~ msgstr "Titre du processus" +#~ msgid "\"%s\": removed %.0f row versions in %u pages" +#~ msgstr "« %s » : %.0f versions de ligne supprimées dans %u pages" -#~ msgid "Statistics" -#~ msgstr "Statistiques" +#~ msgid "\"%s\": removed %d dead item identifiers in %u pages" +#~ msgstr "« %s »: %d versions de lignes mortes supprimées dans %u blocs" -#~ msgid "Client Connection Defaults" -#~ msgstr "Valeurs par défaut pour les connexions client" +#~ msgid "\"%s.%s\" is a partitioned table." +#~ msgstr "« %s.%s » est une table partitionnée." -#~ msgid "Version and Platform Compatibility" -#~ msgstr "Compatibilité des versions et des plateformes" +#~ msgid "\"TZ\"/\"tz\" not supported" +#~ msgstr "« TZ »/« tz » non supporté" -#~ msgid "For RAID arrays, this should be approximately the number of drive spindles in the array." -#~ msgstr "" -#~ "Pour les systèmes RAID, cela devrait être approximativement le nombre de\n" -#~ "têtes de lecture du système." +#~ msgid "\"TZ\"/\"tz\"/\"OF\" format patterns are not supported in to_date" +#~ msgstr "les motifs de format « TZ »/« tz »/« OF » ne sont pas supportés dans to_date" -#~ msgid "GSSAPI encryption can only be used with gss, trust, or reject authentication methods" -#~ msgstr "le chiffrement GSSAPI ne peut être utilisé qu'avec les méthodes d'authentification gss, trust ou reject" +#~ msgid "\"interval\" time zone \"%s\" not valid" +#~ msgstr "le fuseau horaire « %s » n'est pas valide pour le type « interval »" -#~ msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\"" -#~ msgstr "" -#~ "pg_hba.conf rejette la connexion de la réplication pour l'hôte « %s »,\n" -#~ "utilisateur « %s »" +#~ msgid "\"timeout\" must not be negative or zero" +#~ msgstr "« timeout » ne doit pas être négatif ou nul" -#~ msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\"" +#~ msgid "" +#~ "%.0f dead row versions cannot be removed yet.\n" +#~ "Nonremovable row versions range from %lu to %lu bytes long.\n" +#~ "There were %.0f unused item pointers.\n" +#~ "Total free space (including removable row versions) is %.0f bytes.\n" +#~ "%u pages are or will become empty, including %u at the end of the table.\n" +#~ "%u pages containing %.0f free bytes are potential move destinations.\n" +#~ "%s." #~ msgstr "" -#~ "pg_hba.conf rejette la connexion pour l'hôte « %s », utilisateur « %s », base\n" -#~ "de données « %s »" +#~ "%.0f versions de lignes mortes ne peuvent pas encore être supprimées.\n" +#~ "Les versions non supprimables de ligne vont de %lu to %lu octets.\n" +#~ "Il existait %.0f pointeurs d'éléments inutilisés.\n" +#~ "L'espace libre total (incluant les versions supprimables de ligne) est de\n" +#~ "%.0f octets.\n" +#~ "%u pages sont ou deviendront vides, ceci incluant %u pages en fin de la\n" +#~ "table.\n" +#~ "%u pages contenant %.0f octets libres sont des destinations de déplacement\n" +#~ "disponibles.\n" +#~ "%s." -#~ msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\"" +#~ msgid "" +#~ "%.0f dead row versions cannot be removed yet.\n" +#~ "There were %.0f unused item pointers.\n" +#~ "%u pages are entirely empty.\n" +#~ "%s." #~ msgstr "" -#~ "aucune entrée dans pg_hba.conf pour la connexion de la réplication à partir de\n" -#~ "l'hôte « %s », utilisateur « %s »" +#~ "%.0f versions de lignes mortes ne peuvent pas encore être supprimées.\n" +#~ "Il y avait %.0f pointeurs d'éléments inutilisés.\n" +#~ "%u pages sont entièrement vides.\n" +#~ "%s." -#~ msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\"" -#~ msgstr "" -#~ "aucune entrée dans pg_hba.conf pour l'hôte « %s », utilisateur « %s »,\n" -#~ "base de données « %s »" +#~ msgid "%s \"%s\": return code %d" +#~ msgstr "%s « %s » : code de retour %d" -#~ msgid "GSSAPI encryption only supports gss, trust, or reject authentication" -#~ msgstr "le chiffrement GSSAPI ne supporte que l'authentification gss, trust ou reject" +#~ msgid "%s %s will create implicit index \"%s\" for table \"%s\"" +#~ msgstr "%s %s créera un index implicite « %s » pour la table « %s »" -#~ msgid "unexpected standby message type \"%c\", after receiving CopyDone" -#~ msgstr "type de message standby « %c » inattendu, après avoir reçu CopyDone" +#~ msgid "%s (%x)" +#~ msgstr "%s (%x)" -#~ msgid "invalid concatenation of jsonb objects" -#~ msgstr "concaténation invalide d'objets jsonb" +#~ msgid "%s (PID %d) was terminated by signal %d" +#~ msgstr "%s (PID %d) a été arrêté par le signal %d" -#~ msgid "replication connection authorized: user=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -#~ msgstr "connexion de réplication autorisée : utilisateur=%s, nom d'application=%s, SSL activé (protocole=%s, chiffrement=%s, bits=%d, compression=%s)" +#~ msgid "%s already exists in schema \"%s\"" +#~ msgstr "%s existe déjà dans le schéma « %s »" -#~ msgid "replication connection authorized: user=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -#~ msgstr "connexion autorisée : utilisateur=%s, SSL activé (protocole=%s, chiffrement=%s, bits=%d, compression=%s)" +#~ msgid "%s cannot be executed from a function or multi-command string" +#~ msgstr "" +#~ "%s ne peut pas être exécuté à partir d'une fonction ou d'une chaîne\n" +#~ "contenant plusieurs commandes" -#~ msgid "replication connection authorized: user=%s application_name=%s" -#~ msgstr "connexion de réplication autorisée : utilisateur=%s nom d'application=%s" +#~ msgid "%s failed: %m" +#~ msgstr "échec de %s : %m" -#~ msgid "connection authorized: user=%s database=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -#~ msgstr "connexion autorisée : utilisateur=%s base de données=%s nom d'application=%s SSL activé (protocole=%s, chiffrement=%s, bits=%d, compression=%s)" +#~ msgid "%s in publication %s" +#~ msgstr "%s dans la publication %s" -#~ msgid "connection authorized: user=%s database=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -#~ msgstr "connexion autorisée : utilisateur=%s, base de données=%s, SSL activé (protocole=%s, chiffrement=%s, bits=%d, compression=%s)" +#~ msgid "%s is already in schema \"%s\"" +#~ msgstr "%s existe déjà dans le schéma « %s »" -#~ msgid "connection authorized: user=%s database=%s application_name=%s" -#~ msgstr "connexion autorisée : utilisateur=%s base de données=%s nom d'application=%s" +#~ msgid "%s will create implicit sequence \"%s\" for serial column \"%s.%s\"" +#~ msgstr "%s créera des séquences implicites « %s » pour la colonne serial « %s.%s »" -#~ msgid "connection authorized: user=%s database=%s" -#~ msgstr "connexion autorisée : utilisateur=%s, base de données=%s" +#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n" +#~ msgstr "%s : ATTENTION : ne peut pas créer les jetons restreints sur cette plateforme\n" -#~ msgid "cannot create restricted tokens on this platform" -#~ msgstr "ne peut pas créer les jetons restreints sur cette plateforme" +#~ msgid "%s: could not allocate SIDs: error code %lu\n" +#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n" -#~ msgid "leftover placeholder tuple detected in BRIN index \"%s\", deleting" -#~ msgstr "reste d'espace de ligne réservé dans l'index BRIN « %s », suppression" +#~ msgid "%s: could not create restricted token: error code %lu\n" +#~ msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n" -#~ msgid "invalid value for \"buffering\" option" -#~ msgstr "valeur invalide pour l'option « buffering »" - -#~ msgid "could not write block %ld of temporary file: %m" -#~ msgstr "n'a pas pu écrire le bloc %ld du fichier temporaire : %m" +#~ msgid "%s: could not determine user name (GetUserName failed)\n" +#~ msgstr "%s : n'a pas pu déterminer le nom de l'utilisateur (GetUserName a échoué)\n" -#~ msgid "skipping redundant vacuum to prevent wraparound of table \"%s.%s.%s\"" -#~ msgstr "ignore un VACUUM redondant pour éviter le rebouclage des identifiants dans la table \"%s.%s.%s\"" +#~ msgid "%s: could not dissociate from controlling TTY: %s\n" +#~ msgstr "%s : n'a pas pu se dissocier du TTY contrôlant : %s\n" -#~ msgid "The database cluster was initialized without USE_FLOAT4_BYVAL but the server was compiled with USE_FLOAT4_BYVAL." -#~ msgstr "" -#~ "Le cluster de base de données a été initialisé sans USE_FLOAT4_BYVAL\n" -#~ "alors que le serveur a été compilé avec USE_FLOAT4_BYVAL." +#~ msgid "%s: could not fork background process: %s\n" +#~ msgstr "%s : n'a pas pu créer un processus fils : %s\n" -#~ msgid "The database cluster was initialized with USE_FLOAT4_BYVAL but the server was compiled without USE_FLOAT4_BYVAL." -#~ msgstr "" -#~ "Le cluster de base de données a été initialisé avec USE_FLOAT4_BYVAL\n" -#~ "alors que le serveur a été compilé sans USE_FLOAT4_BYVAL." +#~ msgid "%s: could not fsync file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n" -#~ msgid "WAL file is from different database system: WAL file database system identifier is %s, pg_control database system identifier is %s" -#~ msgstr "le fichier WAL provient d'une instance différente : l'identifiant système de la base dans le fichier WAL est %s, alors que l'identifiant système de l'instance dans pg_control est %s" +#~ msgid "%s: could not get exit code from subprocess: error code %lu\n" +#~ msgstr "%s : n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu\n" -#~ msgid "could not seek in log segment %s to offset %u: %m" -#~ msgstr "n'a pas pu se déplacer dans le journal de transactions %s au décalage %u : %m" +#~ msgid "%s: could not open directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n" -#~ msgid "could not read from log segment %s, offset %u, length %lu: %m" -#~ msgstr "n'a pas pu lire le journal de transactions %s, décalage %u, longueur %lu : %m" +#~ msgid "%s: could not open file \"%s\" for reading: %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n" -#~ msgid "An aggregate using a polymorphic transition type must have at least one polymorphic argument." -#~ msgstr "Un agrégat utilisant un type de transition polymorphique doit avoir au moins un argument polymorphique." +#~ msgid "%s: could not open file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" -#~ msgid "An aggregate returning a polymorphic type must have at least one polymorphic argument." -#~ msgstr "Un agrégat renvoyant un type polymorphique doit avoir au moins un argument de type polymorphique." +#~ msgid "%s: could not open log file \"%s/%s\": %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s/%s » : %s\n" -#~ msgid "A function returning \"internal\" must have at least one \"internal\" argument." -#~ msgstr "Une fonction renvoyant « internal » doit avoir au moins un argument du type « internal »." +#~ msgid "%s: could not open process token: error code %lu\n" +#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n" -#~ msgid "A function returning a polymorphic type must have at least one polymorphic argument." -#~ msgstr "Une fonction renvoyant un type polymorphique doit avoir au moins un argument de type polymorphique." +#~ msgid "%s: could not re-execute with restricted token: error code %lu\n" +#~ msgstr "%s : n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu\n" -#~ msgid "A function returning \"anyrange\" must have at least one \"anyrange\" argument." -#~ msgstr "Une fonction renvoyant « anyrange » doit avoir au moins un argument du type « anyrange »." +#~ msgid "%s: could not read directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n" -#~ msgid "Adding partitioned tables to publications is not supported." -#~ msgstr "Ajouter des tables partitionnées à des publications n'est pas supporté." +#~ msgid "%s: could not read file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu lire le fichier « %s » : %s\n" -#~ msgid "You can add the table partitions individually." -#~ msgstr "Vous pouvez ajouter les partitions de table individuellement." +#~ msgid "%s: could not read file \"%s\": read %d of %d\n" +#~ msgstr "%s : n'a pas pu lire le fichier « %s » : a lu %d sur %d\n" -#~ msgid "EXPLAIN option BUFFERS requires ANALYZE" -#~ msgstr "l'option BUFFERS d'EXPLAIN nécessite ANALYZE" +#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu renommer le fichier « %s » en « %s » : %s\n" -#~ msgid "FROM version must be different from installation target version \"%s\"" -#~ msgstr "la version FROM doit être différente de la version cible d'installation « %s »" +#~ msgid "%s: could not start process for command \"%s\": error code %lu\n" +#~ msgstr "%s : n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu\n" -#~ msgid "using pg_pltemplate information instead of CREATE LANGUAGE parameters" -#~ msgstr "" -#~ "utilisation des informations de pg_pltemplate au lieu des paramètres de\n" -#~ "CREATE LANGUAGE" +#~ msgid "%s: could not stat file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n" -#~ msgid "must be superuser to create procedural language \"%s\"" -#~ msgstr "doit être super-utilisateur pour créer le langage de procédures « %s »" +#~ msgid "%s: invalid effective UID: %d\n" +#~ msgstr "%s : UID effectif invalide : %d\n" -#~ msgid "unsupported language \"%s\"" -#~ msgstr "langage non supporté « %s »" +#~ msgid "%s: max_wal_senders must be less than max_connections\n" +#~ msgstr "%s : max_wal_senders doit être inférieur à max_connections\n" -#~ msgid "The supported languages are listed in the pg_pltemplate system catalog." -#~ msgstr "Les langages supportés sont listés dans le catalogue système pg_pltemplate." +#~ msgid "%s: setsysinfo failed: %s\n" +#~ msgstr "%s : setsysinfo a échoué : %s\n" -#~ msgid "changing return type of function %s from %s to %s" -#~ msgstr "changement du type de retour de la fonction %s de %s vers %s" +#~ msgid "%s: the number of buffers (-B) must be at least twice the number of allowed connections (-N) and at least 16\n" +#~ msgstr "" +#~ "%s : le nombre de tampons (-B) doit être au moins deux fois le nombre de\n" +#~ "connexions disponibles (-N) et au moins 16\n" -#~ msgid "column \"%s\" contains null values" -#~ msgstr "la colonne « %s » contient des valeurs NULL" +#~ msgid "%u page is entirely empty.\n" +#~ msgid_plural "%u pages are entirely empty.\n" +#~ msgstr[0] "%u page est entièrement vide.\n" +#~ msgstr[1] "%u pages sont entièrement vides.\n" -#~ msgid "updated partition constraint for default partition would be violated by some row" -#~ msgstr "la contrainte de partition mise à jour pour la partition par défaut serait transgressée par des lignes" +#~ msgid "%u page removed.\n" +#~ msgid_plural "%u pages removed.\n" +#~ msgstr[0] "%u bloc supprimé.\n" +#~ msgstr[1] "%u blocs supprimés.\n" -#~ msgid "partition key expressions cannot contain whole-row references" -#~ msgstr "les expressions de clé de partitionnement ne peuvent pas contenir des références à des lignes complètes" +#~ msgid "%u transaction needs to finish." +#~ msgid_plural "%u transactions need to finish." +#~ msgstr[0] "La transaction %u doit se terminer." +#~ msgstr[1] "Les transactions %u doivent se terminer." -#~ msgid "Partitioned tables cannot have BEFORE / FOR EACH ROW triggers." -#~ msgstr "Les tables partitionnées ne peuvent pas avoir de triggers BEFORE / FOR EACH ROW." +#~ msgid "=> is deprecated as an operator name" +#~ msgstr "=> est un nom d'opérateur obsolète" -#~ msgid "Found referenced table's UPDATE trigger." -#~ msgstr "Trigger UPDATE de la table référencée trouvé." +#~ msgid "@@ operator does not support lexeme weight restrictions in GIN index searches" +#~ msgstr "" +#~ "l'opérateur @@ ne supporte pas les restrictions de poids de lexeme dans les\n" +#~ "recherches par index GIN" -#~ msgid "Found referenced table's DELETE trigger." -#~ msgstr "Trigger DELETE de la table référencée trouvé." +#~ msgid "A function returning \"anyrange\" must have at least one \"anyrange\" argument." +#~ msgstr "Une fonction renvoyant « anyrange » doit avoir au moins un argument du type « anyrange »." -#~ msgid "Found referencing table's trigger." -#~ msgstr "Trigger de la table référencée trouvé." +#~ msgid "A function returning \"internal\" must have at least one \"internal\" argument." +#~ msgstr "Une fonction renvoyant « internal » doit avoir au moins un argument du type « internal »." -#~ msgid "ignoring incomplete trigger group for constraint \"%s\" %s" -#~ msgstr "ignore le groupe de trigger incomplet pour la contrainte « %s » %s" +#~ msgid "A function returning ANYRANGE must have at least one ANYRANGE argument." +#~ msgstr "" +#~ "Une fonction renvoyant ANYRANGE doit avoir au moins un argument du type\n" +#~ "ANYRANGE." -#~ msgid "converting trigger group into constraint \"%s\" %s" -#~ msgstr "conversion du groupe de trigger en une contrainte « %s » %s" +#~ msgid "A function returning a polymorphic type must have at least one polymorphic argument." +#~ msgstr "Une fonction renvoyant un type polymorphique doit avoir au moins un argument de type polymorphique." -#~ msgid "changing argument type of function %s from \"opaque\" to \"cstring\"" -#~ msgstr "changement du type d'argument de la fonction %s d'« opaque » à « cstring »" +#~ msgid "" +#~ "A total of %.0f page slots are in use (including overhead).\n" +#~ "%.0f page slots are required to track all free space.\n" +#~ "Current limits are: %d page slots, %d relations, using %.0f kB." +#~ msgstr "" +#~ "Un total de %.0f emplacements de pages est utilisé (ceci incluant la\n" +#~ "surcharge).\n" +#~ "%.0f emplacements de pages sont requis pour tracer tout l'espace libre.\n" +#~ "Les limites actuelles sont : %d emplacements de pages, %d relations,\n" +#~ "utilisant %.0f Ko." -#~ msgid "changing argument type of function %s from \"opaque\" to %s" -#~ msgstr "changement du type d'argument de la fonction %s d'« opaque » à %s" +#~ msgid "ALTER TYPE USING is only supported on plain tables" +#~ msgstr "ALTER TYPE USING est seulement supportés sur les tables standards" -#~ msgid "invalid value for \"check_option\" option" -#~ msgstr "valeur invalide pour l'option « check_option »" +#~ msgid "AM/PM hour must be between 1 and 12" +#~ msgstr "l'heure AM/PM doit être compris entre 1 et 12" -#~ msgid "\"%s.%s\" is a partitioned table." -#~ msgstr "« %s.%s » est une table partitionnée." +#~ msgid "Adding partitioned tables to publications is not supported." +#~ msgstr "Ajouter des tables partitionnées à des publications n'est pas supporté." -#~ msgid "could not determine actual result type for function declared to return type %s" +#~ msgid "All SQL statements that cause an error of the specified level or a higher level are logged." #~ msgstr "" -#~ "n'a pas pu déterminer le type du résultat actuel pour la fonction déclarant\n" -#~ "renvoyer le type %s" +#~ "Toutes les instructions SQL causant une erreur du niveau spécifié ou d'un\n" +#~ "niveau supérieur sont tracées." -#~ msgid "could not write to hash-join temporary file: %m" -#~ msgstr "n'a pas pu écrire le fichier temporaire de la jointure hâchée : %m" +#~ msgid "An aggregate returning a polymorphic type must have at least one polymorphic argument." +#~ msgstr "Un agrégat renvoyant un type polymorphique doit avoir au moins un argument de type polymorphique." -#~ msgid "Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8." -#~ msgstr "" -#~ "Les valeurs d'échappement unicode ne peuvent pas être utilisées pour les valeurs de point de code\n" -#~ "au-dessus de 007F quand l'encodage serveur n'est pas UTF8." +#~ msgid "An aggregate using a polymorphic transition type must have at least one polymorphic argument." +#~ msgstr "Un agrégat utilisant un type de transition polymorphique doit avoir au moins un argument polymorphique." -#~ msgid "could not load wldap32.dll" -#~ msgstr "n'a pas pu charger wldap32.dll" +#~ msgid "Anyone can use the client-side lo_export() provided by libpq." +#~ msgstr "Tout le monde peut utiliser lo_export(), fournie par libpq, du côté client." -#~ msgid "SSL certificate revocation list file \"%s\" ignored" -#~ msgstr "liste de révocation des certificats SSL « %s » ignorée" +#~ msgid "Anyone can use the client-side lo_import() provided by libpq." +#~ msgstr "Tout le monde peut utiliser lo_import(), fourni par libpq, du côté client." -#~ msgid "SSL library does not support certificate revocation lists." -#~ msgstr "La bibliothèque SSL ne supporte pas les listes de révocation des certificats." +#~ msgid "Apr" +#~ msgstr "Avr" -#~ msgid "could not create signal dispatch thread: error code %lu\n" -#~ msgstr "n'a pas pu créer le thread de répartition des signaux : code d'erreur %lu\n" +#~ msgid "April" +#~ msgstr "Avril" -#~ msgid "Please report this to ." -#~ msgstr "Veuillez rapporter ceci à ." +#~ msgid "Aug" +#~ msgstr "Aoû" -#~ msgid "replication origin %d is already active for PID %d" -#~ msgstr "l'origine de réplication %d est déjà active pour le PID %d" +#~ msgid "August" +#~ msgstr "Août" -#~ msgid "cannot advance replication slot that has not previously reserved WAL" -#~ msgstr "impossible d'avancer un slot de réplication qui n'a pas auparavant réservé de WAL" +#~ msgid "Automatically adds missing table references to FROM clauses." +#~ msgstr "" +#~ "Ajoute automatiquement les références à la table manquant dans les clauses\n" +#~ "FROM." -#~ msgid "could not read from log segment %s, offset %u, length %zu: %m" -#~ msgstr "n'a pas pu lire le segment %s du journal de transactions, décalage %u, longueur %zu : %m" +#~ msgid "COPY BINARY is not supported to stdout or from stdin" +#~ msgstr "COPY BINARY n'est pas supporté vers stdout ou à partir de stdin" -#~ msgid "Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8" -#~ msgstr "" -#~ "Les valeurs d'échappement unicode ne peuvent pas être utilisées pour les\n" -#~ "valeurs de point de code au-dessus de 007F quand l'encodage serveur n'est\n" -#~ "pas UTF8" +#~ msgid "CREATE TABLE AS cannot specify INTO" +#~ msgstr "CREATE TABLE AS ne peut pas spécifier INTO" -#~ msgid "cannot use advisory locks during a parallel operation" -#~ msgstr "ne peut pas utiliser les verrous informatifs lors d'une opération parallèle" +#~ msgid "CREATE TABLE AS specifies too many column names" +#~ msgstr "CREATE TABLE AS spécifie trop de noms de colonnes" -#~ msgid "cannot output a value of type %s" -#~ msgstr "ne peut pas afficher une valeur de type %s" +#~ msgid "CREATE_REPLICATION_SLOT ... EXPORT_SNAPSHOT must not be called inside a transaction" +#~ msgstr "CREATE_REPLICATION_SLOT ... EXPORT_SNAPSHOT ne doit pas être appelé dans une sous-transaction" -#~ msgid "Server has FLOAT4PASSBYVAL = %s, library has %s." -#~ msgstr "Le serveur a FLOAT4PASSBYVAL = %s, la bibliothèque a %s." +#~ msgid "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT must be called before any query" +#~ msgstr "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT doit être appelé avant toute requête" -#~ msgid "encoding name too long" -#~ msgstr "nom d'encodage trop long" +#~ msgid "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT must be called inside a transaction" +#~ msgstr "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT doit être appelé dans une transaction" -#~ msgid "Encrypt passwords." -#~ msgstr "Chiffre les mots de passe." +#~ msgid "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT must not be called in a subtransaction" +#~ msgstr "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT ne doit pas être appelé dans une sous-transaction" -#~ msgid "When a password is specified in CREATE USER or ALTER USER without writing either ENCRYPTED or UNENCRYPTED, this parameter determines whether the password is to be encrypted." +#~ msgid "Causes subtables to be included by default in various commands." #~ msgstr "" -#~ "Lorsqu'un mot de passe est spécifié dans CREATE USER ou ALTER USER sans\n" -#~ "indiquer ENCRYPTED ou UNENCRYPTED, ce paramètre détermine si le mot de passe\n" -#~ "doit être chiffré." +#~ "Fait que les sous-tables soient incluses par défaut dans les différentes\n" +#~ "commandes." -#~ msgid "could not write to temporary file: %m" -#~ msgstr "n'a pas pu écrire dans le fichier temporaire : %m" +#~ msgid "Certificates will not be checked against revocation list." +#~ msgstr "Les certificats ne seront pas vérifiés avec la liste de révocation." -#~ msgid "could not write to tuplestore temporary file: %m" -#~ msgstr "n'a pas pu écrire le fichier temporaire tuplestore : %m" +#~ msgid "Client Connection Defaults" +#~ msgstr "Valeurs par défaut pour les connexions client" -#~ msgid "cannot PREPARE a transaction that has operated on temporary namespace" +#~ msgid "Close open transactions soon to avoid wraparound problems." #~ msgstr "" -#~ "ne peut pas préparer (PREPARE) une transaction qui a travaillé sur un\n" -#~ "schéma temporaire" - -#~ msgid "view must have at least one column" -#~ msgstr "la vue doit avoir au moins une colonne" +#~ "Fermez les transactions ouvertes rapidement pour éviter des problèmes de\n" +#~ "réinitialisation." -#~ msgid "If you're sure there are no old server processes still running, remove the shared memory block or just delete the file \"%s\"." -#~ msgstr "" -#~ "Si vous êtes sûr qu'aucun processus serveur n'est toujours en cours\n" -#~ "d'exécution, supprimez le bloc de mémoire partagée\n" -#~ "ou supprimez simplement le fichier « %s »." +#~ msgid "Connections and Authentication" +#~ msgstr "Connexions et authentification" -#~ msgid "foreign key referencing partitioned table \"%s\" must not be ONLY" -#~ msgstr "la clé étrangère référençant la table partitionnée « %s » ne doit pas être ONLY" +#~ msgid "Consider increasing the configuration parameter \"checkpoint_segments\"." +#~ msgstr "Considèrez l'augmentation du paramètre « checkpoint_segments »." -#~ msgid "invalid number of arguments: object must be matched key value pairs" -#~ msgstr "nombre d'arguments invalide : l'objet doit correspond aux paires clé/valeur" +#~ msgid "Consider increasing the configuration parameter \"max_fsm_pages\" to a value over %.0f." +#~ msgstr "" +#~ "Considérez l'augmentation du paramètre de configuration « max_fsm_pages »\n" +#~ "à une valeur supérieure à %.0f." -#~ msgid "" -#~ "WARNING: Calculated CRC checksum does not match value stored in file.\n" -#~ "Either the file is corrupt, or it has a different layout than this program\n" -#~ "is expecting. The results below are untrustworthy.\n" -#~ "\n" +#~ msgid "Consider using VACUUM FULL on this relation or increasing the configuration parameter \"max_fsm_pages\"." #~ msgstr "" -#~ "ATTENTION : Les sommes de contrôle (CRC) calculées ne correspondent pas aux\n" -#~ "valeurs stockées dans le fichier.\n" -#~ "Soit le fichier est corrompu, soit son organisation diffère de celle\n" -#~ "attendue par le programme.\n" -#~ "Les résultats ci-dessous ne sont pas dignes de confiance.\n" -#~ "\n" +#~ "Pensez à compacter cette relation en utilisant VACUUM FULL ou à augmenter le\n" +#~ "paramètre de configuration « max_fsm_pages »." -#~ msgid "index row size %lu exceeds maximum %lu for index \"%s\"" -#~ msgstr "la taille de la ligne index, %lu, dépasse le maximum, %lu, pour l'index « %s »" +#~ msgid "Consider using pg_logfile_rotate(), which is part of core, instead." +#~ msgstr "Considérer l'utilisation de pg_logfile_rotate(), qui est présent par défaut, à la place." -#~ msgid "brin operator family \"%s\" contains function %s with invalid support number %d" -#~ msgstr "" -#~ "la famille d'opérateur brin « %s » contient la fonction %s\n" -#~ "avec le numéro de support %d invalide" +#~ msgid "Create new tables with OIDs by default." +#~ msgstr "Crée des nouvelles tables avec des OID par défaut." -#~ msgid "brin operator family \"%s\" contains function %s with wrong signature for support number %d" -#~ msgstr "" -#~ "la famille d'opérateur brin « %s » contient la fonction %s\n" -#~ "avec une mauvaise signature pour le numéro de support %d" +#~ msgid "DECLARE CURSOR cannot specify INTO" +#~ msgstr "DECLARE CURSOR ne peut pas spécifier INTO" -#~ msgid "brin operator family \"%s\" contains operator %s with invalid strategy number %d" -#~ msgstr "" -#~ "la famille d'opérateur brin « %s » contient l'opérateur %s\n" -#~ "avec le numéro de stratégie %d invalide" +#~ msgid "DEFAULT can only appear in a VALUES list within INSERT" +#~ msgstr "DEFAULT peut seulement apparaître dans la liste VALUES comprise dans un INSERT" -#~ msgid "brin operator family \"%s\" contains invalid ORDER BY specification for operator %s" -#~ msgstr "" -#~ "la famille d'opérateur brin « %s » contient une spécification\n" -#~ "ORDER BY invalide pour l'opérateur %s" +#~ msgid "DISTINCT is supported only for single-argument aggregates" +#~ msgstr "DISTINCT est seulement supporté pour les agrégats à un seul argument" -#~ msgid "brin operator family \"%s\" contains operator %s with wrong signature" -#~ msgstr "la famille d'opérateur brin « %s » contient l'opérateur %s avec une mauvaise signature" +#~ msgid "DROP ASSERTION is not yet implemented" +#~ msgstr "DROP ASSERTION n'est pas encore implémenté" -#~ msgid "gist operator family \"%s\" contains support procedure %s with cross-type registration" -#~ msgstr "" -#~ "la famille d'opérateur gist « %s » contient la procédure de support\n" -#~ "%s avec un enregistrement inter-type" +#~ msgid "Dec" +#~ msgstr "Déc" -#~ msgid "gist operator family \"%s\" contains function %s with invalid support number %d" -#~ msgstr "" -#~ "la famille d'opérateur gist « %s » contient la fonction %s avec\n" -#~ "le numéro de support invalide %d" +#~ msgid "December" +#~ msgstr "Décembre" -#~ msgid "gist operator family \"%s\" contains function %s with wrong signature for support number %d" +#~ msgid "During recovery, allows connections and queries. During normal running, causes additional info to be written to WAL to enable hot standby mode on WAL standby nodes." #~ msgstr "" -#~ "la famille d'opérateur gist « %s » contient la fonction %s avec une mauvaise\n" -#~ "signature pour le numéro de support %d" +#~ "Lors de la restauration, autorise les connexions et les requêtes. Lors d'une\n" +#~ "exécution normale, fait que des informations supplémentaires sont écrites dans\n" +#~ "les journaux de transactions pour activer le mode Hot Standby sur les nœuds\n" +#~ "en attente." -#~ msgid "gist operator family \"%s\" contains operator %s with invalid strategy number %d" +#~ msgid "EXPLAIN option BUFFERS requires ANALYZE" +#~ msgstr "l'option BUFFERS d'EXPLAIN nécessite ANALYZE" + +#~ msgid "Each SQL transaction has an isolation level, which can be either \"read uncommitted\", \"read committed\", \"repeatable read\", or \"serializable\"." #~ msgstr "" -#~ "la famille d'opérateur gist « %s » contient l'opérateur %s avec le numéro\n" -#~ "de stratégie invalide %d" +#~ "Chaque transaction SQL a un niveau d'isolation qui peut être soit « read\n" +#~ "uncommitted », soit « read committed », soit « repeatable read », soit\n" +#~ "« serializable »." -#~ msgid "gist operator family \"%s\" contains operator %s with wrong signature" -#~ msgstr "la famille d'opérateur gist « %s » contient l'opérateur %s avec une mauvaise signature" +#~ msgid "Each session can be either \"origin\", \"replica\", or \"local\"." +#~ msgstr "Chaque session peut valoir soit « origin » soit « replica » soit « local »." -#~ msgid "hash operator family \"%s\" contains support procedure %s with cross-type registration" +#~ msgid "Either set wal_level to \"replica\" on the master, or turn off hot_standby here." #~ msgstr "" -#~ "la famille d'opérateur hash « %s » contient la procédure de support\n" -#~ "%s avec un enregistrement inter-type" +#~ "Vous devez soit positionner le paramètre wal_level à « replica » sur le maître,\n" +#~ "soit désactiver le hot_standby ici." -#~ msgid "hash operator family \"%s\" contains function %s with wrong signature for support number %d" -#~ msgstr "" -#~ "la famille d'opérateur hash « %s » contient la fonction %s avec une mauvaise\n" -#~ "signature pour le numéro de support %d" +#~ msgid "Emit a warning for constructs that changed meaning since PostgreSQL 9.4." +#~ msgstr "Émet un avertissement pour les constructions dont la signification a changé depuis PostgreSQL 9.4." -#~ msgid "hash operator family \"%s\" contains function %s with invalid support number %d" -#~ msgstr "" -#~ "la famille d'opérateur hash « %s » contient la fonction %s avec\n" -#~ "le numéro de support invalide %d" +#~ msgid "Enables the planner's use of result caching." +#~ msgstr "Active l'utilisation du cache de résultat par le planificateur." -#~ msgid "hash operator family \"%s\" contains operator %s with invalid strategy number %d" -#~ msgstr "" -#~ "la famille d'opérateur hash « %s » contient l'opérateur %s avec le numéro\n" -#~ "de stratégie invalide %d" +#~ msgid "Encrypt passwords." +#~ msgstr "Chiffre les mots de passe." -#~ msgid "hash operator family \"%s\" contains invalid ORDER BY specification for operator %s" -#~ msgstr "" -#~ "la famille d'opérateur hash « %s » contient la spécification ORDER BY\n" -#~ "non supportée pour l'opérateur %s" +#~ msgid "EnumValuesCreate() can only set a single OID" +#~ msgstr "EnumValuesCreate() peut seulement initialiser un seul OID" -#~ msgid "hash operator family \"%s\" contains operator %s with wrong signature" -#~ msgstr "la famille d'opérateur hash « %s » contient l'opérateur %s avec une mauvaise signature" +#~ msgid "Expected 1 tuple with 3 fields, got %d tuples with %d fields." +#~ msgstr "Attendait 1 ligne avec 3 champs, a obtenu %d lignes avec %d champs." -#~ msgid "hash operator family \"%s\" is missing operator(s) for types %s and %s" -#~ msgstr "" -#~ "la famille d'opérateur hash « %s » nécessite des opérateurs supplémentaires\n" -#~ "pour les types %s et %s" +#~ msgid "Expected a transaction log switchpoint location." +#~ msgstr "Attendait un emplacement de bascule dans le journal de transactions." -#~ msgid "hash operator class \"%s\" is missing operator(s)" -#~ msgstr "il manque des opérateurs pour la classe d'opérateur hash « %s »" +#~ msgid "FROM version must be different from installation target version \"%s\"" +#~ msgstr "la version FROM doit être différente de la version cible d'installation « %s »" -#~ msgid "btree operator family \"%s\" contains function %s with invalid support number %d" -#~ msgstr "" -#~ "la famille d'opérateur btree « %s » contient la fonction %s\n" -#~ "avec le numéro de support invalide %d" +#~ msgid "Feb" +#~ msgstr "Fév" -#~ msgid "btree operator family \"%s\" contains function %s with wrong signature for support number %d" -#~ msgstr "" -#~ "la famille d'opérateur btree « %s » contient la fonction %s\n" -#~ "avec une mauvaise signature pour le numéro de support %d" +#~ msgid "February" +#~ msgstr "Février" -#~ msgid "btree operator family \"%s\" contains operator %s with invalid strategy number %d" +#~ msgid "File must be owned by the database user and must have no permissions for \"group\" or \"other\"." #~ msgstr "" -#~ "la famille d'opérateur btree « %s » contient l'opérateur %s\n" -#~ "avec le numéro de stratégie invalide %d" +#~ "Le fichier doit appartenir au propriétaire de la base de données et ne doit\n" +#~ "pas avoir de droits pour un groupe ou pour les autres." -#~ msgid "btree operator family \"%s\" contains invalid ORDER BY specification for operator %s" +#~ msgid "For RAID arrays, this should be approximately the number of drive spindles in the array." #~ msgstr "" -#~ "la famille d'opérateur btree « %s » contient une spécification\n" -#~ "ORDER BY invalide pour l'opérateur %s" +#~ "Pour les systèmes RAID, cela devrait être approximativement le nombre de\n" +#~ "têtes de lecture du système." -#~ msgid "btree operator family \"%s\" contains operator %s with wrong signature" -#~ msgstr "la famille d'opérateur btree « %s » contient l'opérateur %s avec une mauvaise signature" +#~ msgid "Found referenced table's DELETE trigger." +#~ msgstr "Trigger DELETE de la table référencée trouvé." -#~ msgid "btree operator family \"%s\" is missing operator(s) for types %s and %s" -#~ msgstr "" -#~ "la famille d'opérateur btree « %s » nécessite des opérateurs supplémentaires\n" -#~ "pour les types %s et %s" +#~ msgid "Found referenced table's UPDATE trigger." +#~ msgstr "Trigger UPDATE de la table référencée trouvé." -#~ msgid "btree operator class \"%s\" is missing operator(s)" -#~ msgstr "il manque des opérateurs pour la classe d'opérateur btree « %s »" +#~ msgid "Found referencing table's trigger." +#~ msgstr "Trigger de la table référencée trouvé." -#~ msgid "btree operator family \"%s\" is missing cross-type operator(s)" -#~ msgstr "il manque des opérateurs inter-type pour la famille d'opérateur btree « %s »" +#~ msgid "Fri" +#~ msgstr "Ven" -#~ msgid "spgist operator family \"%s\" contains support procedure %s with cross-type registration" -#~ msgstr "" -#~ "la famille d'opérateur spgist « %s » contient la procédure de support\n" -#~ "%s avec un enregistrement inter-type" +#~ msgid "Friday" +#~ msgstr "Vendredi" -#~ msgid "spgist operator family \"%s\" contains function %s with invalid support number %d" -#~ msgstr "" -#~ "la famille d'opérateur spgist « %s » contient la fonction %s\n" -#~ "avec le numéro de support %d invalide" +#~ msgid "GIN index does not support search with void query" +#~ msgstr "les index GIN ne supportent pas la recherche avec des requêtes vides" -#~ msgid "spgist operator family \"%s\" contains function %s with wrong signature for support number %d" -#~ msgstr "" -#~ "la famille d'opérateur spgist « %s » contient la fonction %s\n" -#~ "avec une mauvaise signature pour le numéro de support %d" +#~ msgid "GSSAPI encryption can only be used with gss, trust, or reject authentication methods" +#~ msgstr "le chiffrement GSSAPI ne peut être utilisé qu'avec les méthodes d'authentification gss, trust ou reject" -#~ msgid "spgist operator family \"%s\" contains operator %s with invalid strategy number %d" -#~ msgstr "" -#~ "la famille d'opérateur spgist « %s » contient l'opérateur %s\n" -#~ "avec le numéro de stratégie invalide %d" +#~ msgid "GSSAPI encryption only supports gss, trust, or reject authentication" +#~ msgstr "le chiffrement GSSAPI ne supporte que l'authentification gss, trust ou reject" -#~ msgid "spgist operator family \"%s\" contains invalid ORDER BY specification for operator %s" -#~ msgstr "" -#~ "la famille d'opérateur spgist « %s » contient une spécification\n" -#~ "ORDER BY invalide pour l'opérateur %s" +#~ msgid "GSSAPI is not supported in protocol version 2" +#~ msgstr "GSSAPI n'est pas supporté dans le protocole de version 2" -#~ msgid "spgist operator family \"%s\" contains operator %s with wrong signature" -#~ msgstr "la famille d'opérateur spgist « %s » contient l'opérateur %s avec une mauvaise signature" +#~ msgid "GSSAPI not implemented on this server" +#~ msgstr "GSSAPI non implémenté sur ce serveur" -#~ msgid "spgist operator family \"%s\" is missing operator(s) for types %s and %s" -#~ msgstr "" -#~ "la famille d'opérateur spgist « %s » nécessite des opérateurs supplémentaires\n" -#~ "pour les types %s et %s" +#~ msgid "INOUT arguments are permitted." +#~ msgstr "les arguments INOUT ne sont pas autorisés." -#~ msgid "spgist operator class \"%s\" is missing operator(s)" -#~ msgstr "il manque des opérateurs pour la classe d'opérateur spgist « %s »" +#~ msgid "INSERT ... SELECT cannot specify INTO" +#~ msgstr "INSERT ... SELECT ne peut pas avoir INTO" -#~ msgid "Expected a transaction log switchpoint location." -#~ msgstr "Attendait un emplacement de bascule dans le journal de transactions." +#~ msgid "IS DISTINCT FROM does not support set arguments" +#~ msgstr "IS DISTINCT FROM ne supporte pas les arguments d'ensemble" -#~ msgid "could not remove old transaction log file \"%s\": %m" -#~ msgstr "n'a pas pu supprimer l'ancien journal de transaction « %s » : %m" +#~ msgid "Ident authentication is not supported on local connections on this platform" +#~ msgstr "l'authentification Ident n'est pas supportée sur les connexions locales sur cette plateforme" -#~ msgid "removing transaction log backup history file \"%s\"" -#~ msgstr "suppression du fichier historique des journaux de transaction « %s »" +#~ msgid "Ident protocol identifies remote user as \"%s\"" +#~ msgstr "le protocole Ident identifie l'utilisateur distant comme « %s »" -#~ msgid "The database cluster was initialized without HAVE_INT64_TIMESTAMP but the server was compiled with HAVE_INT64_TIMESTAMP." -#~ msgstr "Le cluster de bases de données a été initialisé sans HAVE_INT64_TIMESTAMPalors que le serveur a été compilé avec." +#~ msgid "If this parameter is set, the server will automatically run in the background and any controlling terminals are dissociated." +#~ msgstr "" +#~ "Si ce paramètre est initialisé, le serveur sera exécuté automatiquement en\n" +#~ "tâche de fond et les terminaux de contrôles seront dés-associés." -#~ msgid "The database cluster was initialized with HAVE_INT64_TIMESTAMP but the server was compiled without HAVE_INT64_TIMESTAMP." +#~ msgid "If you are not restoring from a backup, try removing the file \"%s/backup_label\"." #~ msgstr "" -#~ "Le cluster de bases de données a été initialisé avec HAVE_INT64_TIMESTAMP\n" -#~ "alors que le serveur a été compilé sans." +#~ "Si vous n'avez pas pu restaurer une sauvegarde, essayez de supprimer le\n" +#~ "fichier « %s/backup_label »." -#~ msgid "invalid privilege type USAGE for table" -#~ msgstr "droit USAGE invalide pour la table" +#~ msgid "If you're sure there are no old server processes still running, remove the shared memory block or just delete the file \"%s\"." +#~ msgstr "" +#~ "Si vous êtes sûr qu'aucun processus serveur n'est toujours en cours\n" +#~ "d'exécution, supprimez le bloc de mémoire partagée\n" +#~ "ou supprimez simplement le fichier « %s »." -#~ msgid "column \"%s\" has type \"unknown\"" -#~ msgstr "la colonne « %s » est de type « unknown »" +#~ msgid "Incomplete insertion detected during crash replay." +#~ msgstr "" +#~ "Insertion incomplète détectée lors de la ré-exécution des requêtes suite à\n" +#~ "l'arrêt brutal." -#~ msgid "Proceeding with relation creation anyway." -#~ msgstr "Poursuit malgré tout la création de la relation." +#~ msgid "Incorrect XLOG_BLCKSZ in page header." +#~ msgstr "XLOG_BLCKSZ incorrect dans l'en-tête de page." -#~ msgid "default expression must not return a set" -#~ msgstr "l'expression par défaut ne doit pas renvoyer un ensemble" +#~ msgid "Incorrect XLOG_SEG_SIZE in page header." +#~ msgstr "XLOG_SEG_SIZE incorrecte dans l'en-tête de page." -#~ msgid "access method name cannot be qualified" -#~ msgstr "le nom de la méthode d'accès ne peut pas être qualifiée" +#~ msgid "Is another postmaster already running on port %d? If not, remove socket file \"%s\" and retry." +#~ msgstr "Un autre postmaster fonctionne-t'il déjà sur le port %d ?Sinon, supprimez le fichier socket « %s » et réessayez." -#~ msgid "database name cannot be qualified" -#~ msgstr "le nom de la base de donnée ne peut être qualifié" +#~ msgid "It looks like you need to initdb or install locale support." +#~ msgstr "" +#~ "Il semble que vous avez besoin d'exécuter initdb ou d'installer le support\n" +#~ "des locales." -#~ msgid "extension name cannot be qualified" -#~ msgstr "le nom de l'extension ne peut pas être qualifié" +#~ msgid "It's just here so that we won't choke on SET AUTOCOMMIT TO ON from 7.3-vintage clients." +#~ msgstr "" +#~ "C'est ici uniquement pour ne pas avoir de problèmes avec le SET AUTOCOMMIT\n" +#~ "TO ON des clients 7.3." -#~ msgid "tablespace name cannot be qualified" -#~ msgstr "le nom du tablespace ne peut pas être qualifié" +#~ msgid "JOIN/ON clause refers to \"%s\", which is not part of JOIN" +#~ msgstr "la clause JOIN/ON se réfère à « %s », qui ne fait pas partie du JOIN" -#~ msgid "role name cannot be qualified" -#~ msgstr "le nom du rôle ne peut pas être qualifié" +#~ msgid "JSON does not support infinite date values." +#~ msgstr "JSON ne supporte pas les valeurs infinies de date." -#~ msgid "schema name cannot be qualified" -#~ msgstr "le nom du schéma ne peut pas être qualifié" +#~ msgid "JSON does not support infinite timestamp values." +#~ msgstr "JSON ne supporte pas les valeurs infinies de timestamp." -#~ msgid "language name cannot be qualified" -#~ msgstr "le nom du langage ne peut pas être qualifié" +#~ msgid "Jan" +#~ msgstr "Jan" -#~ msgid "foreign-data wrapper name cannot be qualified" -#~ msgstr "le nom du wrapper de données distantes ne peut pas être qualifié" +#~ msgid "January" +#~ msgstr "Janvier" -#~ msgid "server name cannot be qualified" -#~ msgstr "le nom du serveur ne peut pas être qualifié" +#~ msgid "Jul" +#~ msgstr "Juil" -#~ msgid "event trigger name cannot be qualified" -#~ msgstr "le nom du trigger sur événement ne peut pas être qualifié" +#~ msgid "July" +#~ msgstr "Juillet" -#~ msgid "hash indexes are not WAL-logged and their use is discouraged" -#~ msgstr "les index hash ne sont pas journalisés, leur utilisation est donc déconseillée" +#~ msgid "Jun" +#~ msgstr "Juin" -#~ msgid "changing return type of function %s from \"opaque\" to \"language_handler\"" -#~ msgstr "" -#~ "changement du type du code retour de la fonction %s d'« opaque » à\n" -#~ "« language_handler »" +#~ msgid "June" +#~ msgstr "Juin" -#~ msgid "changing return type of function %s from \"opaque\" to \"trigger\"" -#~ msgstr "changement du type de retour de la fonction %s de « opaque » vers « trigger »" +#~ msgid "Kerberos 5 authentication failed for user \"%s\"" +#~ msgstr "authentification Kerberos 5 échouée pour l'utilisateur « %s »" -#~ msgid "functions and operators can take at most one set argument" -#~ msgstr "les fonctions et opérateurs peuvent prendre au plus un argument d'ensemble" +#~ msgid "Kerberos 5 not implemented on this server" +#~ msgstr "Kerberos 5 non implémenté sur ce serveur" -#~ msgid "IS DISTINCT FROM does not support set arguments" -#~ msgstr "IS DISTINCT FROM ne supporte pas les arguments d'ensemble" +#~ msgid "Kerberos initialization returned error %d" +#~ msgstr "l'initialisation de Kerberos a retourné l'erreur %d" -#~ msgid "op ANY/ALL (array) does not support set arguments" -#~ msgstr "" -#~ "l'opérateur ANY/ALL (pour les types array) ne supporte pas les arguments\n" -#~ "d'ensemble" +#~ msgid "Kerberos keytab resolving returned error %d" +#~ msgstr "la résolution keytab de Kerberos a renvoyé l'erreur %d" -#~ msgid "NULLIF does not support set arguments" -#~ msgstr "NULLIF ne supporte pas les arguments d'ensemble" +#~ msgid "Kerberos recvauth returned error %d" +#~ msgstr "recvauth de Kerberos a renvoyé l'erreur %d" -#~ msgid "hostssl requires SSL to be turned on" -#~ msgstr "hostssl requiert que SSL soit activé" +#~ msgid "Kerberos sname_to_principal(\"%s\", \"%s\") returned error %d" +#~ msgstr "sname_to_principal(« %s », « %s ») de Kerberos a renvoyé l'erreur %d" -#~ msgid "could not create %s socket: %m" -#~ msgstr "n'a pas pu créer le socket %s : %m" +#~ msgid "Kerberos unparse_name returned error %d" +#~ msgstr "unparse_name de Kerberos a renvoyé l'erreur %d" -#~ msgid "WHERE CURRENT OF is not supported on a view with no underlying relation" -#~ msgstr "WHERE CURRENT OF n'est pas supporté pour une vue sans table sous-jacente" +#~ msgid "LDAP search failed for filter \"%s\" on server \"%s\": user is not unique (%ld matches)" +#~ msgstr "" +#~ "échec de la recherche LDAP pour le filtre « %s » sur le serveur « %s » :\n" +#~ "utilisateur non unique (%ld correspondances)" -#~ msgid "WHERE CURRENT OF is not supported on a view with more than one underlying relation" -#~ msgstr "WHERE CURRENT OF n'est pas supporté pour une vue avec plus d'une table sous-jacente" +#~ msgid "Lines should have the format parameter = 'value'." +#~ msgstr "Les lignes devraient avoir le format paramètre = 'valeur'" -#~ msgid "WHERE CURRENT OF is not supported on a view with grouping or aggregation" -#~ msgstr "WHERE CURRENT OF n'est pas supporté pour une vue avec regroupement ou agrégat" +#~ msgid "Lower bound of dimension array must be one." +#~ msgstr "La limite inférieure du tableau doit valoir un." -#~ msgid "DEFAULT can only appear in a VALUES list within INSERT" -#~ msgstr "DEFAULT peut seulement apparaître dans la liste VALUES comprise dans un INSERT" +#~ msgid "Make sure the root.crt file is present and readable." +#~ msgstr "Assurez-vous que le certificat racine (root.crt) est présent et lisible" -#~ msgid "argument of %s must be type boolean, not type %s" -#~ msgstr "l'argument de %s doit être de type booléen, et non du type %s" +#~ msgid "Mar" +#~ msgstr "Mar" -#~ msgid "argument declared \"anyrange\" is not consistent with argument declared \"anyelement\"" -#~ msgstr "" -#~ "l'argument déclaré « anyrange » n'est pas cohérent avec l'argument déclaré\n" -#~ "« anyelement »" +#~ msgid "March" +#~ msgstr "Mars" -#~ msgid "index expression cannot return a set" -#~ msgstr "l'expression de l'index ne peut pas renvoyer un ensemble" +#~ msgid "May" +#~ msgstr "Mai" -#~ msgid "transform expression must not return a set" -#~ msgstr "l'expression de transformation ne doit pas renvoyer un ensemble" +#~ msgid "Mon" +#~ msgstr "Lun" -#~ msgid "autovacuum: found orphan temp table \"%s\".\"%s\" in database \"%s\"" -#~ msgstr "" -#~ "autovacuum : a trouvé la table temporaire orpheline « %s.%s » dans la base de\n" -#~ "données « %s »" +#~ msgid "Monday" +#~ msgstr "Lundi" -#~ msgid "transaction log switch forced (archive_timeout=%d)" -#~ msgstr "changement forcé du journal de transaction (archive_timeout=%d)" +#~ msgid "MultiXact member stop limit is now %u based on MultiXact %u" +#~ msgstr "La limite d'arrêt d'un membre MultiXact est maintenant %u, basée sur le MultiXact %u" -#~ msgid "archived transaction log file \"%s\"" -#~ msgstr "journal des transactions archivé « %s »" +#~ msgid "MultiXactId wrap limit is %u, limited by database with OID %u" +#~ msgstr "La limite de réinitialisation MultiXactId est %u, limité par la base de données d'OID %u" -#~ msgid "syntax error: unexpected character \"%s\"" -#~ msgstr "erreur de syntaxe : caractère « %s » inattendu" +#~ msgid "Must be superuser to drop a foreign-data wrapper." +#~ msgstr "Doit être super-utilisateur pour supprimer un wrapper de données distantes." -#~ msgid "invalid socket: %s" -#~ msgstr "socket invalide : %s" +#~ msgid "NEW used in query that is not in a rule" +#~ msgstr "NEW utilisé dans une requête qui ne fait pas partie d'une règle" -#~ msgid "select() failed: %m" -#~ msgstr "échec de select() : %m" +#~ msgid "NULLIF does not support set arguments" +#~ msgstr "NULLIF ne supporte pas les arguments d'ensemble" -#~ msgid "Transaction ID %u finished; no more running transactions." -#~ msgstr "Identifiant de transaction %u terminé ; plus de transactions en cours." +#~ msgid "No description available." +#~ msgstr "Aucune description disponible." -#~ msgid "%u transaction needs to finish." -#~ msgid_plural "%u transactions need to finish." -#~ msgstr[0] "La transaction %u doit se terminer." -#~ msgstr[1] "Les transactions %u doivent se terminer." +#~ msgid "No rows were found in \"%s\"." +#~ msgstr "Aucune ligne trouvée dans « %s »." -#~ msgid "rule \"%s\" does not exist" -#~ msgstr "la règle « %s » n'existe pas" +#~ msgid "Not enough memory for reassigning the prepared transaction's locks." +#~ msgstr "Pas assez de mémoire pour réaffecter les verrous des transactions préparées." -#~ msgid "there are multiple rules named \"%s\"" -#~ msgstr "il existe de nombreuses règles nommées « %s »" +#~ msgid "Not safe to send CSV data\n" +#~ msgstr "Envoi non sûr des données CSV\n" -#~ msgid "Specify a relation name as well as a rule name." -#~ msgstr "Spécifier un nom de relation ainsi qu'un nom de règle." +#~ msgid "Nov" +#~ msgstr "Nov" -#~ msgid "not enough shared memory for elements of data structure \"%s\" (%zu bytes requested)" +#~ msgid "November" +#~ msgstr "Novembre" + +#~ msgid "Number of tuple inserts prior to index cleanup as a fraction of reltuples." #~ msgstr "" -#~ "pas assez de mémoire partagée pour les éléments de la structure de données\n" -#~ "« %s » (%zu octets demandés)" +#~ "Nombre de lignes insérées avant d'effectuer un nettoyage des index\n" +#~ "(fraction de reltuples)." -#~ msgid "invalid input syntax for type boolean: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type booléen : « %s »" +#~ msgid "OLD used in query that is not in a rule" +#~ msgstr "OLD utilisé dans une requête qui n'est pas une règle" -#~ msgid "invalid input syntax for type money: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type money : « %s »" +#~ msgid "ON CONFLICT clause is not supported with partitioned tables" +#~ msgstr "la clause ON CONFLICT n'est pas supporté avec les tables partitionnées" -#~ msgid "invalid input syntax for type bytea" -#~ msgstr "syntaxe en entrée invalide pour le type bytea" +#~ msgid "ORIGIN message sent out of order" +#~ msgstr "message ORIGIN en désordre" -#~ msgid "invalid input syntax for type real: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type real : « %s »" +#~ msgid "Oct" +#~ msgstr "Oct" -#~ msgid "\"TZ\"/\"tz\"/\"OF\" format patterns are not supported in to_date" -#~ msgstr "les motifs de format « TZ »/« tz »/« OF » ne sont pas supportés dans to_date" +#~ msgid "October" +#~ msgstr "Octobre" -#~ msgid "value \"%s\" is out of range for type bigint" -#~ msgstr "la valeur « %s » est en dehors des limites du type bigint" +#~ msgid "Only superusers can use untrusted languages." +#~ msgstr "" +#~ "Seuls les super-utilisateurs peuvent utiliser des langages qui ne sont pas\n" +#~ "de confiance." -#~ msgid "could not determine data type for argument 1" -#~ msgstr "n'a pas pu déterminer le type de données pour l'argument 1" +#~ msgid "OpenSSL failure" +#~ msgstr "échec OpenSSL" -#~ msgid "could not determine data type for argument 2" -#~ msgstr "n'a pas pu déterminer le type de données pour l'argument 2" +#~ msgid "PID %d is among the slowest backends." +#~ msgstr "Le PID %d est parmi les processus serveur les plus lents." -#~ msgid "argument %d: could not determine data type" -#~ msgstr "argument %d : n'a pas pu déterminer le type de données" +#~ msgid "Partitioned tables cannot have BEFORE / FOR EACH ROW triggers." +#~ msgstr "Les tables partitionnées ne peuvent pas avoir de triggers BEFORE / FOR EACH ROW." -#~ msgid "invalid input syntax for type macaddr: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type macaddr : « %s »" +#~ msgid "Perhaps out of disk space?" +#~ msgstr "Peut-être manquez-vous de place disque ?" -#~ msgid "invalid input syntax for type tinterval: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type tinterval : « %s »" +#~ msgid "Permissions should be u=rw (0600) or less." +#~ msgstr "Les droits devraient être u=rwx (0600) ou inférieures." -#~ msgid "invalid input syntax for type numeric: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type numeric : « %s »" +#~ msgid "Please report this to ." +#~ msgstr "Veuillez rapporter ceci à ." -#~ msgid "invalid input syntax for type double precision: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type double precision : « %s »" +#~ msgid "Prints the execution plan to server log." +#~ msgstr "Affiche le plan d'exécution dans les journaux applicatifs du serveur." -#~ msgid "value \"%s\" is out of range for type integer" -#~ msgstr "la valeur « %s » est en dehors des limites du type integer" +#~ msgid "Prints the parse tree after rewriting to server log." +#~ msgstr "Affiche l'arbre d'analyse après ré-écriture dans les journaux applicatifs du serveur." -#~ msgid "value \"%s\" is out of range for type smallint" -#~ msgstr "la valeur « %s » est en dehors des limites du type smallint" +#~ msgid "Prints the parse tree to the server log." +#~ msgstr "Affiche l'arbre d'analyse dans les journaux applicatifs du serveur." -#~ msgid "invalid input syntax for type oid: \"%s\"" -#~ msgstr "syntaxe invalide en entrée pour le type oid : « %s »" +#~ msgid "Proceeding with relation creation anyway." +#~ msgstr "Poursuit malgré tout la création de la relation." -#~ msgid "invalid input syntax for type pg_lsn: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type pg_lsn : « %s »" +#~ msgid "Process %d waits for %s on %s." +#~ msgstr "Le processus %d attend %s sur %s." -#~ msgid "cannot accept a value of type any" -#~ msgstr "ne peut pas accepter une valeur de type any" +#~ msgid "Process Title" +#~ msgstr "Titre du processus" -#~ msgid "cannot accept a value of type anyarray" -#~ msgstr "ne peut pas accepter une valeur de type anyarray" +#~ msgid "Query Tuning" +#~ msgstr "Optimisation des requêtes" -#~ msgid "cannot accept a value of type anyenum" -#~ msgstr "ne peut pas accepter une valeur de type anyenum" +#~ msgid "RANGE FOLLOWING is only supported with UNBOUNDED" +#~ msgstr "RANGE FOLLOWING est seulement supporté avec UNBOUNDED" -#~ msgid "cannot accept a value of type anyrange" -#~ msgstr "ne peut pas accepter une valeur de type anyrange" +#~ msgid "RANGE PRECEDING is only supported with UNBOUNDED" +#~ msgstr "RANGE PRECEDING est seulement supporté avec UNBOUNDED" -#~ msgid "cannot accept a value of type trigger" -#~ msgstr "ne peut pas accepter une valeur de type trigger" +#~ msgid "REINDEX is not yet implemented for partitioned indexes" +#~ msgstr "REINDEX n'est pas implémenté pour des index partitionnés" -#~ msgid "cannot display a value of type trigger" -#~ msgstr "ne peut pas afficher une valeur de type trigger" +#~ msgid "REINDEX of partitioned tables is not yet implemented, skipping \"%s\"" +#~ msgstr "REINDEX n'est pas encore implémenté pour les tables partitionnées, « %s » ignoré" -#~ msgid "cannot accept a value of type event_trigger" -#~ msgstr "ne peut pas accepter une valeur de type event_trigger" +#~ msgid "RETURNING cannot contain references to other relations" +#~ msgstr "RETURNING ne doit pas contenir de références à d'autres relations" -#~ msgid "cannot display a value of type event_trigger" -#~ msgstr "ne peut pas afficher une valeur de type event_trigger" +#~ msgid "Rebuild the index with REINDEX." +#~ msgstr "Reconstruisez l'index avec REINDEX." -#~ msgid "cannot accept a value of type language_handler" -#~ msgstr "ne peut pas accepter une valeur de type language_handler" +#~ msgid "Replication" +#~ msgstr "Réplication" -#~ msgid "cannot display a value of type language_handler" -#~ msgstr "ne peut pas afficher une valeur de type language_handler" +#~ msgid "Reporting and Logging" +#~ msgstr "Rapports et traces" -#~ msgid "cannot accept a value of type fdw_handler" -#~ msgstr "ne peut pas accepter une valeur de type fdw_handler" +#~ msgid "Resource Usage" +#~ msgstr "Utilisation des ressources" -#~ msgid "cannot display a value of type fdw_handler" -#~ msgstr "ne peut pas afficher une valeur de type fdw_handler" +#~ msgid "Runs the server silently." +#~ msgstr "Lance le serveur de manière silencieuse." -#~ msgid "cannot accept a value of type index_am_handler" -#~ msgstr "ne peut pas accepter une valeur de type index_am_handler" +#~ msgid "S:May" +#~ msgstr "S:Mai" -#~ msgid "cannot display a value of type index_am_handler" -#~ msgstr "ne peut pas afficher une valeur de type index_am_handler" +#~ msgid "SASL authentication is not supported in protocol version 2" +#~ msgstr "l'authentification SASL n'est pas supportée dans le protocole de version 2" -#~ msgid "cannot accept a value of type tsm_handler" -#~ msgstr "ne peut pas accepter une valeur de type tsm_handler" +#~ msgid "SELECT FOR UPDATE/SHARE cannot be used with foreign table \"%s\"" +#~ msgstr "SELECT FOR UPDATE/SHARE ne peut pas être utilisé avec une table distante « %s »" -#~ msgid "cannot display a value of type tsm_handler" -#~ msgstr "ne peut pas afficher une valeur de type tsm_handler" +#~ msgid "SELECT FOR UPDATE/SHARE is not allowed in subqueries" +#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé dans les sous-requêtes" -#~ msgid "cannot accept a value of type internal" -#~ msgstr "ne peut pas accepter une valeur de type internal" +#~ msgid "SELECT FOR UPDATE/SHARE is not allowed with GROUP BY clause" +#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé avec la clause GROUP BY" -#~ msgid "cannot display a value of type internal" -#~ msgstr "ne peut pas afficher une valeur de type internal" +#~ msgid "SELECT FOR UPDATE/SHARE is not allowed with HAVING clause" +#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé avec la clause HAVING" -#~ msgid "cannot accept a value of type opaque" -#~ msgstr "ne peut pas accepter une valeur de type opaque" +#~ msgid "SELECT FOR UPDATE/SHARE is not allowed with aggregate functions" +#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé avec les fonctions d'agrégats" -#~ msgid "cannot display a value of type opaque" -#~ msgstr "ne peut pas afficher une valeur de type opaque" +#~ msgid "SELECT FOR UPDATE/SHARE is not allowed with window functions" +#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé avec les fonctions window" -#~ msgid "cannot accept a value of type anyelement" -#~ msgstr "ne peut pas accepter une valeur de type anyelement" +#~ msgid "SELECT FOR UPDATE/SHARE is not supported for inheritance queries" +#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas supporté pour les requêtes d'héritage" -#~ msgid "cannot display a value of type anyelement" -#~ msgstr "ne peut pas afficher une valeur de type anyelement" +#~ msgid "SELECT FOR UPDATE/SHARE is not supported within a query with multiple result relations" +#~ msgstr "" +#~ "SELECT FOR UPDATE/SHARE n'est pas supporté dans une requête avec plusieurs\n" +#~ "relations" -#~ msgid "cannot accept a value of type anynonarray" -#~ msgstr "ne peut pas accepter une valeur de type anynonarray" +#~ msgid "SSL certificate revocation list file \"%s\" ignored" +#~ msgstr "liste de révocation des certificats SSL « %s » ignorée" -#~ msgid "cannot display a value of type anynonarray" -#~ msgstr "ne peut pas afficher une valeur de type anynonarray" +#~ msgid "SSL certificate revocation list file \"%s\" not found, skipping: %s" +#~ msgstr "liste de révocation des certificats SSL « %s » introuvable, continue : %s" -#~ msgid "invalid input syntax for type tid: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type tid : « %s »" +#~ msgid "SSL connection from \"%s\"" +#~ msgstr "connexion SSL de « %s »" -#~ msgid "invalid input syntax for type txid_snapshot: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type txid_snapshot : « %s »" +#~ msgid "SSL failed to renegotiate connection before limit expired" +#~ msgstr "SSL a échoué à renégotier la connexion avant l'expiration du délai" -#~ msgid "invalid input syntax for uuid: \"%s\"" -#~ msgstr "syntaxe invalide en entrée pour l'uuid : « %s »" +#~ msgid "SSL failure during renegotiation start" +#~ msgstr "échec SSL au début de la re-négotiation" -#~ msgid "function %u has too many arguments (%d, maximum is %d)" -#~ msgstr "la fonction %u a trop d'arguments (%d, le maximum étant %d)" +#~ msgid "SSL handshake failure on renegotiation, retrying" +#~ msgstr "échec du handshake SSL lors de la renégotiation, nouvelle tentative" -#~ msgid "Causes subtables to be included by default in various commands." -#~ msgstr "" -#~ "Fait que les sous-tables soient incluses par défaut dans les différentes\n" -#~ "commandes." +#~ msgid "SSL library does not support certificate revocation lists." +#~ msgstr "La bibliothèque SSL ne supporte pas les listes de révocation des certificats." -#~ msgid "could not create two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu créer le fichier de statut de la validation en deux phases nommé\n" -#~ "« %s » : %m" +#~ msgid "SSL off" +#~ msgstr "SSL inactif" -#~ msgid "could not seek in two-phase state file: %m" -#~ msgstr "" -#~ "n'a pas pu se déplacer dans le fichier de statut de la validation en deux\n" -#~ "phases : %m" +#~ msgid "SSL on" +#~ msgstr "SSL actif" -#~ msgid "two-phase state file for transaction %u is corrupt" -#~ msgstr "" -#~ "le fichier d'état de la validation en deux phases est corrompu pour la\n" -#~ "transaction %u" +#~ msgid "SSL renegotiation failure" +#~ msgstr "échec lors de la re-négotiation SSL" -#~ msgid "could not fsync two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu synchroniser sur disque (fsync) le fichier d'état de la\n" -#~ "validation en deux phases nommé « %s » : %m" +#~ msgid "SSPI error %x" +#~ msgstr "erreur SSPI : %x" -#~ msgid "could not close two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu fermer le fichier d'état de la validation en deux phases nommé\n" -#~ "« %s » : %m" +#~ msgid "SSPI is not supported in protocol version 2" +#~ msgstr "SSPI n'est pas supporté dans le protocole de version 2" -#~ msgid "could not link file \"%s\" to \"%s\" (initialization of log file): %m" -#~ msgstr "n'a pas pu lier le fichier « %s » à « %s » (initialisation du journal de transactions) : %m" +#~ msgid "Sat" +#~ msgstr "Sam" -#~ msgid "could not rename file \"%s\" to \"%s\" (initialization of log file): %m" -#~ msgstr "n'a pas pu renommer le fichier « %s » en « %s » (initialisation du journal de transactions) : %m" +#~ msgid "Saturday" +#~ msgstr "Samedi" -#~ msgid "ignoring \"%s\" file because no \"%s\" file exists" -#~ msgstr "ignore le fichier « %s » parce que le fichier « %s » n'existe pas" +#~ msgid "Security-barrier views are not automatically updatable." +#~ msgstr "Les vues avec barrière de sécurité ne sont pas automatiquement disponibles en écriture." -#~ msgid "must be superuser or replication role to run a backup" -#~ msgstr "doit être super-utilisateur ou avoir l'attribut de réplication pour exécuter une sauvegarde" +#~ msgid "See server log for details." +#~ msgstr "Voir les journaux applicatifs du serveur pour plus de détails." -#~ msgid "must be superuser to switch transaction log files" -#~ msgstr "doit être super-utilisateur pour changer de journal de transactions" +#~ msgid "Sep" +#~ msgstr "Sep" -#~ msgid "must be superuser to create a restore point" -#~ msgstr "doit être super-utilisateur pour créer un point de restauration" +#~ msgid "September" +#~ msgstr "Septembre" -#~ msgid "must be superuser to control recovery" -#~ msgstr "doit être super-utilisateur pour contrôler la restauration" +#~ msgid "Server has FLOAT4PASSBYVAL = %s, library has %s." +#~ msgstr "Le serveur a FLOAT4PASSBYVAL = %s, la bibliothèque a %s." -#~ msgid "invalid record length at %X/%X" -#~ msgstr "longueur invalide de l'enregistrement à %X/%X" +#~ msgid "Set dynamic_shared_memory_type to a value other than \"none\"." +#~ msgstr "Configurez dynamic_shared_memory_type à une valeur autre que « none »." -#~ msgid "%s is already in schema \"%s\"" -#~ msgstr "%s existe déjà dans le schéma « %s »" +#~ msgid "Set the amount of traffic to send and receive before renegotiating the encryption keys." +#~ msgstr "" +#~ "Configure la quantité de trafic à envoyer et recevoir avant la renégotiation\n" +#~ "des clés d'enchiffrement." -#~ msgid "function \"%s\" must return type \"event_trigger\"" -#~ msgstr "la fonction « %s » doit renvoyer le type « event_trigger »" +#~ msgid "Sets immediate fsync at commit." +#~ msgstr "Configure un fsync immédiat lors du commit." -#~ msgid "function %s must return type \"fdw_handler\"" -#~ msgstr "la fonction %s doit renvoyer le type « fdw_handler »" +#~ msgid "Sets realm to match Kerberos and GSSAPI users against." +#~ msgstr "" +#~ "Indique le royaume pour l'authentification des utilisateurs via Kerberos et\n" +#~ "GSSAPI." -#~ msgid "could not reposition held cursor" -#~ msgstr "n'a pas pu repositionner le curseur détenu" +#~ msgid "Sets the hostname of the Kerberos server." +#~ msgstr "Initalise le nom d'hôte du serveur Kerberos." -#~ msgid "function %s must return type \"language_handler\"" -#~ msgstr "la fonction %s doit renvoyer le type « language_handler »" +#~ msgid "Sets the language used in DO statement if LANGUAGE is not specified." +#~ msgstr "" +#~ "Configure le langage utilisé dans une instruction DO si la clause LANGUAGE n'est\n" +#~ "pas spécifiée." -#~ msgid "function %s must return type \"trigger\"" -#~ msgstr "la fonction %s doit renvoyer le type « trigger »" +#~ msgid "Sets the list of known custom variable classes." +#~ msgstr "Initialise la liste des classes variables personnalisées connues." -#~ msgid "changing return type of function %s from \"opaque\" to \"cstring\"" -#~ msgstr "changement du type de retour de la fonction %s d'« opaque » vers « cstring »" +#~ msgid "Sets the maximum distance in log segments between automatic WAL checkpoints." +#~ msgstr "" +#~ "Initialise la distance maximale dans les journaux de transaction entre chaque\n" +#~ "point de vérification (checkpoints) des journaux." -#~ msgid "type output function %s must return type \"cstring\"" -#~ msgstr "le type de sortie de la fonction %s doit être « cstring »" +#~ msgid "Sets the maximum number of tables and indexes for which free space is tracked." +#~ msgstr "" +#~ "Initialise le nombre maximum de tables et index pour lesquels l'espace libre\n" +#~ "est tracé." -#~ msgid "type send function %s must return type \"bytea\"" -#~ msgstr "la fonction send du type %s doit renvoyer le type « bytea »" +#~ msgid "Sets the maximum number of tuples to be sorted using replacement selection." +#~ msgstr "Configure le nombre maximum de lignes à trier en utilisant la sélection de remplacement." -#~ msgid "typmod_in function %s must return type \"integer\"" -#~ msgstr "la fonction typmod_in %s doit renvoyer le type « entier »" +#~ msgid "Sets the name of the Kerberos service." +#~ msgstr "Initialise le nom du service Kerberos." -#~ msgid "Permissions should be u=rw (0600) or less." -#~ msgstr "Les droits devraient être u=rwx (0600) ou inférieures." +#~ msgid "Sets the regular expression \"flavor\"." +#~ msgstr "Initialise l'expression rationnelle « flavor »." -#~ msgid "function %s must return type \"tsm_handler\"" -#~ msgstr "la fonction %s doit renvoyer le type « tsm_handler »" +#~ msgid "Specify a USING expression to perform the conversion." +#~ msgstr "Donnez une expression USING pour réaliser la conversion." -#~ msgid "must be superuser to reset statistics counters" -#~ msgstr "doit être super-utilisateur pour réinitialiser les compteurs statistiques" +#~ msgid "Specify a relation name as well as a rule name." +#~ msgstr "Spécifier un nom de relation ainsi qu'un nom de règle." -#~ msgid "socket not open" -#~ msgstr "socket non ouvert" +#~ msgid "Statistics" +#~ msgstr "Statistiques" -#~ msgid "multibyte flag character is not allowed" -#~ msgstr "un caractère drapeau multi-octet n'est pas autorisé" +#~ msgid "Sun" +#~ msgstr "Dim" -#~ msgid "could not format \"path\" value" -#~ msgstr "n'a pas pu formater la valeur « path »" +#~ msgid "Sunday" +#~ msgstr "Dimanche" -#~ msgid "invalid input syntax for type box: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type box : « %s »" +#~ msgid "Table contains duplicated values." +#~ msgstr "La table contient des valeurs dupliquées." -#~ msgid "invalid input syntax for type line: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type line: « %s »" +#~ msgid "The arguments of jsonb_build_object() must consist of alternating keys and values." +#~ msgstr "Les arguments de jsonb_build_object() doivent consister en des clés et valeurs alternées" -#~ msgid "invalid input syntax for type path: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type path : « %s »" +#~ msgid "The cast requires a non-immutable conversion." +#~ msgstr "Cette conversion requiert une conversion non immutable." -#~ msgid "invalid input syntax for type point: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type point : « %s »" +#~ msgid "The database cluster was initialized with HAVE_INT64_TIMESTAMP but the server was compiled without HAVE_INT64_TIMESTAMP." +#~ msgstr "" +#~ "Le cluster de bases de données a été initialisé avec HAVE_INT64_TIMESTAMP\n" +#~ "alors que le serveur a été compilé sans." -#~ msgid "invalid input syntax for type lseg: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type lseg : « %s »" +#~ msgid "The database cluster was initialized with LOCALE_NAME_BUFLEN %d, but the server was compiled with LOCALE_NAME_BUFLEN %d." +#~ msgstr "" +#~ "Le cluster de bases de données a été initialisé avec un LOCALE_NAME_BUFLEN\n" +#~ "à %d alors que le serveur a été compilé avec un LOCALE_NAME_BUFLEN à %d." -#~ msgid "invalid input syntax for type polygon: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type polygon : « %s »" +#~ msgid "The database cluster was initialized with USE_FLOAT4_BYVAL but the server was compiled without USE_FLOAT4_BYVAL." +#~ msgstr "" +#~ "Le cluster de base de données a été initialisé avec USE_FLOAT4_BYVAL\n" +#~ "alors que le serveur a été compilé sans USE_FLOAT4_BYVAL." -#~ msgid "invalid input syntax for type circle: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type circle : « %s »" +#~ msgid "The database cluster was initialized with XLOG_SEG_SIZE %d, but the server was compiled with XLOG_SEG_SIZE %d." +#~ msgstr "" +#~ "Le cluster de bases de données a été initialisé avec un XLOG_SEG_SIZE à %d\n" +#~ "alors que le serveur a été compilé avec un XLOG_SEG_SIZE à %d." -#~ msgid "could not format \"circle\" value" -#~ msgstr "n'a pas pu formater la valeur « circle »" +#~ msgid "The database cluster was initialized without HAVE_INT64_TIMESTAMP but the server was compiled with HAVE_INT64_TIMESTAMP." +#~ msgstr "Le cluster de bases de données a été initialisé sans HAVE_INT64_TIMESTAMPalors que le serveur a été compilé avec." -#~ msgid "must be superuser to signal the postmaster" -#~ msgstr "doit être super-utilisateur pour envoyer un signal au postmaster" +#~ msgid "The database cluster was initialized without USE_FLOAT4_BYVAL but the server was compiled with USE_FLOAT4_BYVAL." +#~ msgstr "" +#~ "Le cluster de base de données a été initialisé sans USE_FLOAT4_BYVAL\n" +#~ "alors que le serveur a été compilé avec USE_FLOAT4_BYVAL." -#~ msgid "argument for function \"exp\" too big" -#~ msgstr "l'argument de la fonction « exp » est trop gros" +#~ msgid "The error was: %s" +#~ msgstr "L'erreur était : %s" -#~ msgid "WAL writer sleep time between WAL flushes." -#~ msgstr "" -#~ "Temps d'endormissement du processus d'écriture pendant le vidage des\n" -#~ "journaux de transactions en millisecondes." +#~ msgid "The supported languages are listed in the pg_pltemplate system catalog." +#~ msgstr "Les langages supportés sont listés dans le catalogue système pg_pltemplate." -#~ msgid "JSON does not support infinite date values." -#~ msgstr "JSON ne supporte pas les valeurs infinies de date." +#~ msgid "There might be an idle transaction or a forgotten prepared transaction causing this." +#~ msgstr "" +#~ "Il pourait y avoir une transaction en attente ou une transaction préparée\n" +#~ "oubliée causant cela." -#~ msgid "JSON does not support infinite timestamp values." -#~ msgstr "JSON ne supporte pas les valeurs infinies de timestamp." +#~ msgid "There were %.0f unused item identifiers.\n" +#~ msgstr "Il y avait %.0f identifiants d'éléments inutilisés.\n" -#~ msgid "cannot override frame clause of window \"%s\"" -#~ msgstr "ne peut pas surcharger la frame clause du window « %s »" +#~ msgid "This can be caused by having a publisher with a higher PostgreSQL major version than the subscriber." +#~ msgstr "Ceci peut avoir pour cause un publieur ayant une version majeure de PostgreSQL supérieure à l'abonné" -#~ msgid "window functions cannot use named arguments" -#~ msgstr "les fonctions window ne peuvent pas renvoyer des arguments nommés" +#~ msgid "This can be set to advanced, extended, or basic." +#~ msgstr "" +#~ "Ceci peut être initialisé avec advanced (avancé), extended (étendu) ou\n" +#~ "basic (basique)." -#~ msgid "invalid list syntax for \"unix_socket_directories\"" -#~ msgstr "syntaxe de liste invalide pour le paramètre « unix_socket_directories »" +#~ msgid "This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by \"client_encoding\"." +#~ msgstr "" +#~ "Cette erreur peut aussi survenir si la séquence d'octets ne correspond pas\n" +#~ "au jeu de caractères attendu par le serveur, le jeu étant contrôlé par\n" +#~ "« client_encoding »." -#~ msgid "Valid values are '[]', '[)', '(]', and '()'." -#~ msgstr "Les valeurs valides sont « [] », « [) », « (] » et « () »." +#~ msgid "" +#~ "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter. You can either reduce the request size or reconfigure the kernel with larger SHMMAX. To reduce the request size (currently %lu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.\n" +#~ "If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for.\n" +#~ "The PostgreSQL documentation contains more information about shared memory configuration." +#~ msgstr "" +#~ "Cette erreur signifie habituellement que la demande de PostgreSQL pour un\n" +#~ "segment de mémoire partagée a dépassé le paramètre SHMMAX de votre noyau.\n" +#~ "Vous pouvez soit réduire la taille de la requête soit reconfigurer le noyau\n" +#~ "avec un SHMMAX plus important. Pour réduire la taille de la requête\n" +#~ "(actuellement %lu octets), réduisez l'utilisation de la mémoire partagée par PostgreSQL,par exemple en réduisant shared_buffers ou max_connections\n" +#~ "Si la taille de la requête est déjà petite, il est possible qu'elle soit\n" +#~ "moindre que le paramètre SHMMIN de votre noyau, auquel cas, augmentez la\n" +#~ "taille de la requête ou reconfigurez SHMMIN.\n" +#~ "La documentation de PostgreSQL contient plus d'informations sur la\n" +#~ "configuration de la mémoire partagée." -#~ msgid "poll() failed in statistics collector: %m" -#~ msgstr "échec du poll() dans le récupérateur de statistiques : %m" +#~ msgid "This is a debugging aid." +#~ msgstr "C'est une aide de débogage." -#~ msgid "select() failed in logger process: %m" -#~ msgstr "échec de select() dans le processus des journaux applicatifs : %m" +#~ msgid "This name may be disallowed altogether in future versions of PostgreSQL." +#~ msgstr "Ce nom pourrait être interdit dans les prochaines versions de PostgreSQL." -#~ msgid "%s: could not open log file \"%s/%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s/%s » : %s\n" +#~ msgid "This parameter cannot be changed after server start." +#~ msgstr "Ce paramètre ne peut pas être modifié après le lancement du serveur" -#~ msgid "%s: could not fork background process: %s\n" -#~ msgstr "%s : n'a pas pu créer un processus fils : %s\n" +#~ msgid "This parameter doesn't do anything." +#~ msgstr "Ce paramètre ne fait rien." -#~ msgid "%s: could not dissociate from controlling TTY: %s\n" -#~ msgstr "%s : n'a pas pu se dissocier du TTY contrôlant : %s\n" +#~ msgid "Thu" +#~ msgstr "Jeu" -#~ msgid "Runs the server silently." -#~ msgstr "Lance le serveur de manière silencieuse." +#~ msgid "Thursday" +#~ msgstr "Jeudi" -#~ msgid "If this parameter is set, the server will automatically run in the background and any controlling terminals are dissociated." -#~ msgstr "" -#~ "Si ce paramètre est initialisé, le serveur sera exécuté automatiquement en\n" -#~ "tâche de fond et les terminaux de contrôles seront dés-associés." +#~ msgid "Transaction ID %u finished; no more running transactions." +#~ msgstr "Identifiant de transaction %u terminé ; plus de transactions en cours." -#~ msgid "WAL sender sleep time between WAL replications." -#~ msgstr "" -#~ "Temps d'endormissement du processus d'envoi des journaux de transactions entre\n" -#~ "les réplications des journaux de transactions." +#~ msgid "Try putting the literal value in single quotes." +#~ msgstr "Placer la valeur littérale en guillemets simples." -#~ msgid "Sets the list of known custom variable classes." -#~ msgstr "Initialise la liste des classes variables personnalisées connues." +#~ msgid "Tue" +#~ msgstr "Mar" -#~ msgid "foreign key constraint \"%s\" of relation \"%s\" does not exist" -#~ msgstr "la clé étrangère « %s » de la relation « %s » n'existe pas" +#~ msgid "Tuesday" +#~ msgstr "Mardi" -#~ msgid "removing built-in function \"%s\"" -#~ msgstr "suppression de la fonction interne « %s »" +#~ msgid "Turns on various assertion checks." +#~ msgstr "Active les différentes vérifications des assertions." -#~ msgid "permission denied to drop foreign-data wrapper \"%s\"" -#~ msgstr "droit refusé pour supprimer le wrapper de données distantes « %s »" +#~ msgid "UTF-16 to UTF-8 translation failed: %lu" +#~ msgstr "échec de la conversion d'UTF16 vers UTF8 : %lu" -#~ msgid "Must be superuser to drop a foreign-data wrapper." -#~ msgstr "Doit être super-utilisateur pour supprimer un wrapper de données distantes." +#~ msgid "Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8" +#~ msgstr "" +#~ "Les valeurs d'échappement unicode ne peuvent pas être utilisées pour les\n" +#~ "valeurs de point de code au-dessus de 007F quand l'encodage serveur n'est\n" +#~ "pas UTF8" -#~ msgid "must be superuser to drop text search parsers" +#~ msgid "Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8." #~ msgstr "" -#~ "doit être super-utilisateur pour supprimer des analyseurs de recherche plein\n" -#~ "texte" +#~ "Les valeurs d'échappement unicode ne peuvent pas être utilisées pour les valeurs de point de code\n" +#~ "au-dessus de 007F quand l'encodage serveur n'est pas UTF8." -#~ msgid "must be superuser to drop text search templates" -#~ msgstr "doit être super-utilisateur pour supprimer des modèles de recherche plein texte" +#~ msgid "Use ALTER AGGREGATE to change owner of aggregate functions." +#~ msgstr "Utiliser ALTER AGGREGATE pour changer le propriétaire des fonctions d'agrégat." -#~ msgid "recovery is still in progress, can't accept WAL streaming connections" -#~ msgstr "la restauration est en cours, ne peut pas accepter les connexions de flux WAL" +#~ msgid "Use ALTER AGGREGATE to rename aggregate functions." +#~ msgstr "Utiliser ALTER AGGREGATE pour renommer les fonctions d'agrégat." -#~ msgid "standby connections not allowed because wal_level=minimal" -#~ msgstr "connexions standby non autorisées car wal_level=minimal" +#~ msgid "Use ALTER FOREIGN TABLE instead." +#~ msgstr "Utilisez ALTER FOREIGN TABLE à la place." -#~ msgid "could not open directory \"pg_tblspc\": %m" -#~ msgstr "n'a pas pu ouvrir le répertoire « pg_tblspc » : %m" +#~ msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the detach operation." +#~ msgstr "Utiliser ALTER TABLE ... DETACH PARTITION ... FINALIZE pour terminer l'opération de détachement." -#~ msgid "could not access root certificate file \"%s\": %m" -#~ msgstr "n'a pas pu accéder au fichier du certificat racine « %s » : %m" +#~ msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation" +#~ msgstr "Utilisez ALTER TABLE ... DETACH PARTITION ... FINALIZE pour terminer l'opération de détachement en attente" -#~ msgid "SSL certificate revocation list file \"%s\" not found, skipping: %s" -#~ msgstr "liste de révocation des certificats SSL « %s » introuvable, continue : %s" +#~ msgid "Use SELECT ... UNION ALL ... instead." +#~ msgstr "Utilisez à la place SELECT ... UNION ALL ..." -#~ msgid "Certificates will not be checked against revocation list." -#~ msgstr "Les certificats ne seront pas vérifiés avec la liste de révocation." +#~ msgid "User \"%s\" has an empty password." +#~ msgstr "L'utilisateur « %s » a un mot de passe vide." -#~ msgid "missing or erroneous pg_hba.conf file" -#~ msgstr "fichier pg_hba.conf manquant ou erroné" +#~ msgid "Uses the indented output format for EXPLAIN VERBOSE." +#~ msgstr "Utilise le format de sortie indenté pour EXPLAIN VERBOSE." -#~ msgid "See server log for details." -#~ msgstr "Voir les journaux applicatifs du serveur pour plus de détails." +#~ msgid "VALUES must not contain OLD or NEW references" +#~ msgstr "VALUES ne doit pas contenir des références à OLD et NEW" -#~ msgid "Make sure the root.crt file is present and readable." -#~ msgstr "Assurez-vous que le certificat racine (root.crt) est présent et lisible" +#~ msgid "VALUES must not contain table references" +#~ msgstr "VALUES ne doit pas contenir de références de table" -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide, puis quitte\n" +#~ msgid "Valid values are \"pause\", \"promote\", and \"shutdown\"." +#~ msgstr "Les valeurs valides sont « pause », « promote » et « shutdown »." -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version, puis quitte\n" +#~ msgid "Valid values are '[]', '[)', '(]', and '()'." +#~ msgstr "Les valeurs valides sont « [] », « [) », « (] » et « () »." -#~ msgid "CREATE TABLE AS cannot specify INTO" -#~ msgstr "CREATE TABLE AS ne peut pas spécifier INTO" +#~ msgid "Valid values are DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO, NOTICE, WARNING, ERROR, LOG, FATAL, and PANIC. Each level includes all the levels that follow it." +#~ msgstr "" +#~ "Les valeurs valides sont DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO,\n" +#~ "NOTICE, WARNING, ERROR, LOG, FATAL et PANIC. Chaque niveau incut tous les\n" +#~ "niveaux qui le suit." -#~ msgid "column name list not allowed in CREATE TABLE / AS EXECUTE" -#~ msgstr "la liste de noms de colonnes n'est pas autorisée dans CREATE TABLE / AS EXECUTE" +#~ msgid "Valid values are DOCUMENT and CONTENT." +#~ msgstr "Les valeurs valides sont DOCUMENT et CONTENT." -#~ msgid "INSERT ... SELECT cannot specify INTO" -#~ msgstr "INSERT ... SELECT ne peut pas avoir INTO" +#~ msgid "Valid values are LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7." +#~ msgstr "" +#~ "Les valeurs valides sont LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5,\n" +#~ "LOCAL6, LOCAL7." -#~ msgid "DECLARE CURSOR cannot specify INTO" -#~ msgstr "DECLARE CURSOR ne peut pas spécifier INTO" +#~ msgid "Valid values are ON, OFF, and SAFE_ENCODING." +#~ msgstr "Les valeurs valides sont ON, OFF et SAFE_ENCODING." -#~ msgid "subquery in FROM cannot have SELECT INTO" -#~ msgstr "la sous-requête du FROM ne peut pas avoir de SELECT INTO" +#~ msgid "Version and Platform Compatibility" +#~ msgstr "Compatibilité des versions et des plateformes" -#~ msgid "subquery cannot have SELECT INTO" -#~ msgstr "la sous-requête ne peut pas avoir de SELECT INTO" +#~ msgid "Views that return the same column more than once are not automatically updatable." +#~ msgstr "Les vues qui renvoient la même colonne plus d'une fois ne sont pas automatiquement disponibles en écriture." -#~ msgid "subquery in WITH cannot have SELECT INTO" -#~ msgstr "la sous-requête du WITH ne peut pas avoir de SELECT INTO" +#~ msgid "WAL archival (archive_mode=on) requires wal_level \"archive\", \"hot_standby\", or \"logical\"" +#~ msgstr "" +#~ "l'archivage des journaux de transactions (archive_mode=on) nécessite que\n" +#~ "le paramètre wal_level soit initialisé avec « archive », « hot_standby » ou « logical »" -#~ msgid "tablespace %u is not empty" -#~ msgstr "le tablespace %u n'est pas vide" +#~ msgid "WAL archiving is not active" +#~ msgstr "l'archivage des journaux de transactions n'est pas actif" -#~ msgid "consistent state delayed because recovery snapshot incomplete" -#~ msgstr "état de cohérence pas encore atteint à cause d'un snapshot de restauration incomplet" +#~ msgid "WAL file SYSID is %s, pg_control SYSID is %s" +#~ msgstr "le SYSID du journal de transactions WAL est %s, celui de pg_control est %s" -#~ msgid "SSPI error %x" -#~ msgstr "erreur SSPI : %x" +#~ msgid "WAL file is from different database system: Incorrect XLOG_BLCKSZ in page header." +#~ msgstr "" +#~ "le journal de transactions provient d'un système de bases de données différent :\n" +#~ "XLOG_BLCKSZ incorrect dans l'en-tête de page." -#~ msgid "%s (%x)" -#~ msgstr "%s (%x)" +#~ msgid "WAL file is from different database system: Incorrect XLOG_SEG_SIZE in page header." +#~ msgstr "" +#~ "le journal de transactions provient d'un système de bases de données différent :\n" +#~ "XLOG_SEG_SIZE incorrect dans l'en-tête de page." -#~ msgid "resetting unlogged relations: cleanup %d init %d" -#~ msgstr "réinitialisation des relations non tracées : nettoyage %d initialisation %d" +#~ msgid "WAL file is from different database system: WAL file database system identifier is %s, pg_control database system identifier is %s" +#~ msgstr "le fichier WAL provient d'une instance différente : l'identifiant système de la base dans le fichier WAL est %s, alors que l'identifiant système de l'instance dans pg_control est %s" -#~ msgid "ALTER TYPE USING is only supported on plain tables" -#~ msgstr "ALTER TYPE USING est seulement supportés sur les tables standards" +#~ msgid "WAL file is from different database system: WAL file database system identifier is %s, pg_control database system identifier is %s." +#~ msgstr "" +#~ "L'identifiant du journal de transactions du système de base de données est %s,\n" +#~ "l'identifiant pg_control du système de base de données dans pg_control est %s." -#~ msgid "index \"%s\" is not a b-tree" -#~ msgstr "l'index « %s » n'est pas un btree" +#~ msgid "WAL file is from different database system: incorrect XLOG_SEG_SIZE in page header" +#~ msgstr "le fichier WAL provient d'un système différent : XLOG_SEG_SIZE invalide dans l'en-tête de page" -#~ msgid "unable to read symbolic link %s: %m" -#~ msgstr "incapable de lire le lien symbolique %s : %m" +#~ msgid "WAL sender sleep time between WAL replications." +#~ msgstr "" +#~ "Temps d'endormissement du processus d'envoi des journaux de transactions entre\n" +#~ "les réplications des journaux de transactions." -#~ msgid "unable to open directory pg_tblspc: %m" -#~ msgstr "impossible d'ouvrir le répertoire p_tblspc : %m" +#~ msgid "WAL writer sleep time between WAL flushes." +#~ msgstr "" +#~ "Temps d'endormissement du processus d'écriture pendant le vidage des\n" +#~ "journaux de transactions en millisecondes." -#~ msgid "Write-Ahead Log / Streaming Replication" -#~ msgstr "Write-Ahead Log / Réplication en flux" +#~ msgid "" +#~ "WARNING: Calculated CRC checksum does not match value stored in file.\n" +#~ "Either the file is corrupt, or it has a different layout than this program\n" +#~ "is expecting. The results below are untrustworthy.\n" +#~ "\n" +#~ msgstr "" +#~ "ATTENTION : Les sommes de contrôle (CRC) calculées ne correspondent pas aux\n" +#~ "valeurs stockées dans le fichier.\n" +#~ "Soit le fichier est corrompu, soit son organisation diffère de celle\n" +#~ "attendue par le programme.\n" +#~ "Les résultats ci-dessous ne sont pas dignes de confiance.\n" +#~ "\n" -#~ msgid "syntax error in recovery command file: %s" -#~ msgstr "erreur de syntaxe dans le fichier de restauration : %s" +#~ msgid "" +#~ "WARNING: possible byte ordering mismatch\n" +#~ "The byte ordering used to store the pg_control file might not match the one\n" +#~ "used by this program. In that case the results below would be incorrect, and\n" +#~ "the PostgreSQL installation would be incompatible with this data directory.\n" +#~ msgstr "" +#~ "ATTENTION : possible incohérence dans l'ordre des octets\n" +#~ "L'ordre des octets utilisé pour enregistrer le fichier pg_control peut ne\n" +#~ "pas correspondre à celui utilisé par ce programme. Dans ce cas, les\n" +#~ "résultats ci-dessous sont incorrects, et l'installation PostgreSQL\n" +#~ "incompatible avec ce répertoire des données.\n" -#~ msgid "Lines should have the format parameter = 'value'." -#~ msgstr "Les lignes devraient avoir le format paramètre = 'valeur'" +#~ msgid "WHERE CURRENT OF is not supported on a view with grouping or aggregation" +#~ msgstr "WHERE CURRENT OF n'est pas supporté pour une vue avec regroupement ou agrégat" -#~ msgid "index %u/%u/%u needs VACUUM FULL or REINDEX to finish crash recovery" -#~ msgstr "" -#~ "l'index %u/%u/%u a besoin d'un VACUUM FULL ou d'un REINDEX pour terminer la\n" -#~ "récupération suite à un arrêt brutal" +#~ msgid "WHERE CURRENT OF is not supported on a view with more than one underlying relation" +#~ msgstr "WHERE CURRENT OF n'est pas supporté pour une vue avec plus d'une table sous-jacente" -#~ msgid "Incomplete insertion detected during crash replay." -#~ msgstr "" -#~ "Insertion incomplète détectée lors de la ré-exécution des requêtes suite à\n" -#~ "l'arrêt brutal." +#~ msgid "WHERE CURRENT OF is not supported on a view with no underlying relation" +#~ msgstr "WHERE CURRENT OF n'est pas supporté pour une vue sans table sous-jacente" -#~ msgid "index \"%s\" needs VACUUM or REINDEX to finish crash recovery" -#~ msgstr "" -#~ "l'index « %s » a besoin d'un VACUUM ou d'un REINDEX pour terminer la\n" -#~ "récupération suite à un arrêt brutal" +#~ msgid "Wed" +#~ msgstr "Mer" -#~ msgid "index \"%s\" needs VACUUM FULL or REINDEX to finish crash recovery" +#~ msgid "Wednesday" +#~ msgstr "Mercredi" + +#~ msgid "When a password is specified in CREATE USER or ALTER USER without writing either ENCRYPTED or UNENCRYPTED, this parameter determines whether the password is to be encrypted." #~ msgstr "" -#~ "l'index « %s » a besoin d'un VACUUM FULL ou d'un REINDEX pour terminer la\n" -#~ "récupération suite à un arrêt brutal" +#~ "Lorsqu'un mot de passe est spécifié dans CREATE USER ou ALTER USER sans\n" +#~ "indiquer ENCRYPTED ou UNENCRYPTED, ce paramètre détermine si le mot de passe\n" +#~ "doit être chiffré." -#~ msgid "EnumValuesCreate() can only set a single OID" -#~ msgstr "EnumValuesCreate() peut seulement initialiser un seul OID" +#~ msgid "When more tuples than this are present, quicksort will be used." +#~ msgstr "Quand plus de lignes que ça sont présentes, quicksort sera utilisé." -#~ msgid "clustering \"%s.%s\"" -#~ msgstr "exécution de CLUSTER sur « %s.%s »" +#~ msgid "Write-Ahead Log" +#~ msgstr "Write-Ahead Log" -#~ msgid "cannot cluster on index \"%s\" because access method does not handle null values" +#~ msgid "Write-Ahead Log / Streaming Replication" +#~ msgstr "Write-Ahead Log / Réplication en flux" + +#~ msgid "You can add the table partitions individually." +#~ msgstr "Vous pouvez ajouter les partitions de table individuellement." + +#~ msgid "You have at least %d relations. Consider increasing the configuration parameter \"max_fsm_relations\"." #~ msgstr "" -#~ "ne peut pas créer un cluster sur l'index « %s » car la méthode d'accès de\n" -#~ "l'index ne gère pas les valeurs NULL" +#~ "Vous avez au moins %d relations.Considèrez l'augmentation du paramètre de\n" +#~ "configuration « max_fsm_relations »." #~ msgid "You might be able to work around this by marking column \"%s\" NOT NULL, or use ALTER TABLE ... SET WITHOUT CLUSTER to remove the cluster specification from the table." #~ msgstr "" @@ -29484,2350 +29497,2400 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "You might be able to work around this by marking column \"%s\" NOT NULL." #~ msgstr "Vous pouvez contourner ceci en marquant la colonne « %s » comme NOT NULL." -#~ msgid "cannot cluster on expressional index \"%s\" because its index access method does not handle null values" -#~ msgstr "" -#~ "ne peut pas exécuter CLUSTER sur l'index à expression « %s » car sa méthode\n" -#~ "d'accès ne gère pas les valeurs NULL" +#~ msgid "You need an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger." +#~ msgstr "Vous avez besoin d'une règle inconditionnelle ON DELETE DO INSTEAD ou d'un trigger INSTEAD OF DELETE." -#~ msgid "\"%s\" is not a table, view, or composite type" -#~ msgstr "« %s » n'est pas une table, une vue ou un type composite" +#~ msgid "You need an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger." +#~ msgstr "Vous avez besoin d'une règle ON INSERT DO INSTEAD sans condition ou d'un trigger INSTEAD OF INSERT." -#~ msgid "must be superuser to comment on procedural language" -#~ msgstr "" -#~ "doit être super-utilisateur pour ajouter un commentaire sur un langage de\n" -#~ "procédures" +#~ msgid "You need an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger." +#~ msgstr "Vous avez besoin d'une règle non conditionnelle ON UPDATE DO INSTEAD ou d'un trigger INSTEAD OF UPDATE." -#~ msgid "must be superuser to comment on text search parser" -#~ msgstr "" -#~ "doit être super-utilisateur pour ajouter un commentaire sur l'analyseur de\n" -#~ "recherche plein texte" +#~ msgid "You need to rebuild PostgreSQL using --with-icu." +#~ msgstr "Vous devez recompiler PostgreSQL en utilisant --with-icu." -#~ msgid "must be superuser to comment on text search template" -#~ msgstr "" -#~ "doit être super-utilisateur pour ajouter un commentaire sur un modèle de\n" -#~ "recherche plein texte" +#~ msgid "You need to rebuild PostgreSQL using --with-libxml." +#~ msgstr "Vous devez recompiler PostgreSQL en utilisant --with-libxml." -#~ msgid "cannot reference temporary table from permanent table constraint" -#~ msgstr "" -#~ "ne peut pas référencer une table temporaire à partir d'une contrainte de\n" -#~ "table permanente" +#~ msgid "aborted" +#~ msgstr "annulé" -#~ msgid "cannot reference permanent table from temporary table constraint" -#~ msgstr "" -#~ "ne peut pas référencer une table permanente à partir de la contrainte de\n" -#~ "table temporaire" +#~ msgid "abstime out of range for date" +#~ msgstr "abstime en dehors des limites pour une date" -#~ msgid "composite type must have at least one attribute" -#~ msgstr "le type composite doit avoir au moins un attribut" +#~ msgid "access method name cannot be qualified" +#~ msgstr "le nom de la méthode d'accès ne peut pas être qualifiée" -#~ msgid "database \"%s\" not found" -#~ msgstr "base de données « %s » non trouvée" +#~ msgid "added subscription for table %s.%s" +#~ msgstr "souscription ajoutée pour la table %s.%s" -#~ msgid "invalid list syntax for parameter \"datestyle\"" -#~ msgstr "syntaxe de liste invalide pour le paramètre « datestyle »" +#~ msgid "adding missing FROM-clause entry for table \"%s\"" +#~ msgstr "ajout d'une entrée manquante dans FROM (table « %s »)" -#~ msgid "unrecognized \"datestyle\" key word: \"%s\"" -#~ msgstr "mot clé « datestyle » non reconnu : « %s »" +#~ msgid "adding missing FROM-clause entry in subquery for table \"%s\"" +#~ msgstr "entrée manquante de la clause FROM dans la sous-requête pour la table « %s »" -#~ msgid "invalid interval value for time zone: month not allowed" -#~ msgstr "valeur d'intervalle invalide pour le fuseau horaire : les mois ne sont pas autorisés" +#~ msgid "aggregates not allowed in WHERE clause" +#~ msgstr "agrégats non autorisés dans une clause WHERE" -#~ msgid "invalid interval value for time zone: day not allowed" -#~ msgstr "valeur d'intervalle invalide pour le fuseau horaire : jour non autorisé" +#~ msgid "archive command was terminated by signal %d" +#~ msgstr "la commande d'archivage a été terminée par le signal %d" -#~ msgid "argument to pg_get_expr() must come from system catalogs" -#~ msgstr "l'argument de pg_get_expr() doit provenir des catalogues systèmes" +#~ msgid "archive member \"%s\" too large for tar format" +#~ msgstr "membre « %s » de l'archive trop volumineux pour le format tar" -#~ msgid "could not enable credential reception: %m" -#~ msgstr "n'a pas pu activer la réception de lettres de créance : %m" +#~ msgid "archive_command must be defined before online backups can be made safely." +#~ msgstr "" +#~ "archive_command doit être défini avant que les sauvegardes à chaud puissent\n" +#~ "s'effectuer correctement." -#~ msgid "could not get effective UID from peer credentials: %m" -#~ msgstr "n'a pas pu obtenir l'UID réel à partir des pièces d'identité de l'autre : %m" +#~ msgid "archive_mode must be enabled at server start." +#~ msgstr "archive_mode doit être activé au lancement du serveur." -#~ msgid "Ident authentication is not supported on local connections on this platform" -#~ msgstr "l'authentification Ident n'est pas supportée sur les connexions locales sur cette plateforme" +#~ msgid "archived transaction log file \"%s\"" +#~ msgstr "journal des transactions archivé « %s »" -#~ msgid "could not create log file \"%s\": %m" -#~ msgstr "n'a pas pu créer le journal applicatif « %s » : %m" +#~ msgid "argument %d: could not determine data type" +#~ msgstr "argument %d : n'a pas pu déterminer le type de données" -#~ msgid "could not open new log file \"%s\": %m" -#~ msgstr "n'a pas pu ouvrir le nouveau journal applicatif « %s » : %m" +#~ msgid "argument declared \"anyrange\" is not consistent with argument declared \"anyelement\"" +#~ msgstr "" +#~ "l'argument déclaré « anyrange » n'est pas cohérent avec l'argument déclaré\n" +#~ "« anyelement »" -#~ msgid "Sets immediate fsync at commit." -#~ msgstr "Configure un fsync immédiat lors du commit." +#~ msgid "argument for function \"exp\" too big" +#~ msgstr "l'argument de la fonction « exp » est trop gros" -#~ msgid "invalid list syntax for parameter \"log_destination\"" -#~ msgstr "syntaxe de liste invalide pour le paramètre « log_destination »" +#~ msgid "argument number is out of range" +#~ msgstr "le nombre en argument est en dehors des limites" -#~ msgid "unrecognized \"log_destination\" key word: \"%s\"" -#~ msgstr "mot clé « log_destination » non reconnu : « %s »" +#~ msgid "argument of %s must be type boolean, not type %s" +#~ msgstr "l'argument de %s doit être de type booléen, et non du type %s" -#~ msgid "cannot drop \"%s\" because it is being used by active queries in this session" -#~ msgstr "" -#~ "ne peut pas supprimer « %s » car cet objet est en cours d'utilisation par\n" -#~ "des requêtes actives dans cette session" +#~ msgid "argument of %s must not contain aggregate functions" +#~ msgstr "l'argument de %s ne doit pas contenir de fonctions d'agrégats" -#~ msgid "parameter \"recovery_target_inclusive\" requires a Boolean value" -#~ msgstr "le paramètre « recovery_target_inclusive » requiert une valeur booléenne" +#~ msgid "argument of %s must not contain window functions" +#~ msgstr "l'argument de %s ne doit pas contenir des fonctions window" -#~ msgid "parameter \"standby_mode\" requires a Boolean value" -#~ msgstr "le paramètre « standby_mode » requiert une valeur booléenne" +#~ msgid "argument to pg_get_expr() must come from system catalogs" +#~ msgstr "l'argument de pg_get_expr() doit provenir des catalogues systèmes" -#~ msgid "Not safe to send CSV data\n" -#~ msgstr "Envoi non sûr des données CSV\n" +#~ msgid "arguments declared \"anycompatiblemultirange\" are not all alike" +#~ msgstr "les arguments déclarés « anycompatiblemultirange » ne sont pas tous identiques" -#~ msgid "recovery restart point at %X/%X with latest known log time %s" -#~ msgstr "" -#~ "point de relancement de la restauration sur %X/%X avec %s comme dernière\n" -#~ "date connue du journal" +#~ msgid "arguments declared \"anycompatiblerange\" are not all alike" +#~ msgstr "les arguments déclarés « anycompatiblerange » ne sont pas tous identiques" -#~ msgid "restartpoint_command = '%s'" -#~ msgstr "restartpoint_command = '%s'" +#~ msgid "arguments declared \"anyelement\" are not all alike" +#~ msgstr "les arguments déclarés « anyelement » ne sont pas tous identiques" -#~ msgid "usermap \"%s\"" -#~ msgstr "correspondance utilisateur « %s »" +#~ msgid "arguments declared \"anymultirange\" are not all alike" +#~ msgstr "les arguments déclarés « anymultirange » ne sont pas tous identiques" -#~ msgid "WAL archiving is not active" -#~ msgstr "l'archivage des journaux de transactions n'est pas actif" +#~ msgid "arguments declared \"anyrange\" are not all alike" +#~ msgstr "les arguments déclarés « anyrange » ne sont pas tous identiques" -#~ msgid "archive_mode must be enabled at server start." -#~ msgstr "archive_mode doit être activé au lancement du serveur." +#~ msgid "arguments of row IN must all be row expressions" +#~ msgstr "les arguments de la ligne IN doivent tous être des expressions de ligne" -#~ msgid "archive_command must be defined before online backups can be made safely." -#~ msgstr "" -#~ "archive_command doit être défini avant que les sauvegardes à chaud puissent\n" -#~ "s'effectuer correctement." +#~ msgid "array assignment requires type %s but expression is of type %s" +#~ msgstr "l'affectation de tableaux requiert le type %s mais l'expression est de type %s" -#~ msgid "During recovery, allows connections and queries. During normal running, causes additional info to be written to WAL to enable hot standby mode on WAL standby nodes." -#~ msgstr "" -#~ "Lors de la restauration, autorise les connexions et les requêtes. Lors d'une\n" -#~ "exécution normale, fait que des informations supplémentaires sont écrites dans\n" -#~ "les journaux de transactions pour activer le mode Hot Standby sur les nœuds\n" -#~ "en attente." +#~ msgid "assertion checking is not supported by this build" +#~ msgstr "la vérification de l'assertion n'a pas été intégrée lors de la compilation" -#~ msgid "unlogged operation performed, data may be missing" -#~ msgstr "opération réalisée non tracée, les données pourraient manquer" +#~ msgid "at least one of leftarg or rightarg must be specified" +#~ msgstr "au moins un des arguments (le gauche ou le droit) doit être spécifié" -#~ msgid "not enough shared memory for walsender" -#~ msgstr "pas assez de mémoire partagée pour le processus d'envoi des journaux de transactions" +#~ msgid "attempted change of parameter \"%s\" ignored" +#~ msgstr "tentative de modification du paramètre « %s » ignoré" -#~ msgid "not enough shared memory for walreceiver" -#~ msgstr "" -#~ "pas assez de mémoire partagée pour le processus de réception des journaux de\n" -#~ "transactions" +#~ msgid "authentication file line too long" +#~ msgstr "ligne du fichier d'authentification trop longue" -#~ msgid "connection limit exceeded for non-superusers" -#~ msgstr "limite de connexions dépassée pour les utilisateurs standards" +#~ msgid "automatic analyze of table \"%s.%s.%s\" system usage: %s" +#~ msgstr "ANALYZE automatique de la table « %s.%s.%s » ; utilisation système : %s" -#~ msgid "not enough shared memory for background writer" -#~ msgstr "pas assez de mémoire partagée pour le processus d'écriture en tâche de fond" +#~ msgid "automatic vacuum of table \"%s.%s.%s\": cannot (re)acquire exclusive lock for truncate scan" +#~ msgstr "vacuum automatique de la table « %s.%s.%s » : ne peut pas acquérir le verrou exclusif pour la tronquer" -#, fuzzy -#~ msgid "couldn't put socket to non-blocking mode: %m" -#~ msgstr "n'a pas pu activer le mode non-bloquant pour la socket : %s\n" +#~ msgid "" +#~ "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" +#~ "pages: %d removed, %d remain\n" +#~ "tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable\n" +#~ "buffer usage: %d hits, %d misses, %d dirtied\n" +#~ "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" +#~ "system usage: %s" +#~ msgstr "" +#~ "VACUUM automatique de la table « %s.%s.%s » : parcours d'index : %d\n" +#~ "pages : %d supprimées, %d restantes\n" +#~ "lignes : %.0f supprimées, %.0f restantes, %.0f sont mortes mais non supprimables\n" +#~ "utilisation des tampons : %d lus dans le cache, %d lus hors du cache, %d modifiés\n" +#~ "taux moyen de lecture : %.3f Mo/s, taux moyen d'écriture : %.3f Mo/s\n" +#~ "utilisation système : %s" -#, fuzzy -#~ msgid "couldn't put socket to blocking mode: %m" -#~ msgstr "n'a pas pu activer le mode bloquant pour la socket : %s\n" +#~ msgid "autovacuum launcher shutting down" +#~ msgstr "arrêt du processus de lancement de l'autovacuum" -#~ msgid "WAL file SYSID is %s, pg_control SYSID is %s" -#~ msgstr "le SYSID du journal de transactions WAL est %s, celui de pg_control est %s" +#~ msgid "autovacuum launcher started" +#~ msgstr "démarrage du processus de lancement de l'autovacuum" -#, fuzzy -#~ msgid "sorry, too many standbys already" -#~ msgstr "désolé, trop de clients sont déjà connectés" +#~ msgid "autovacuum: found orphan temp table \"%s\".\"%s\" in database \"%s\"" +#~ msgstr "" +#~ "autovacuum : a trouvé la table temporaire orpheline « %s.%s » dans la base de\n" +#~ "données « %s »" -#, fuzzy -#~ msgid "invalid WAL message received from primary" -#~ msgstr "format du message invalide" +#~ msgid "autovacuum: processing database \"%s\"" +#~ msgstr "autovacuum : traitement de la base de données « %s »" -#~ msgid "PID %d is among the slowest backends." -#~ msgstr "Le PID %d est parmi les processus serveur les plus lents." +#~ msgid "backup label %s in file \"%s\"" +#~ msgstr "label de sauvegarde %s dans le fichier « %s »" -#~ msgid "transaction is read-only" -#~ msgstr "la transaction est en lecture seule" +#~ msgid "backup time %s in file \"%s\"" +#~ msgstr "heure de sauvegarde %s dans le fichier « %s »" + +#~ msgid "backup timeline %u in file \"%s\"" +#~ msgstr "timeline de sauvegarde %u dans le fichier « %s »" #~ msgid "binary value is out of range for type bigint" #~ msgstr "la valeur binaire est en dehors des limites du type bigint" -#~ msgid "redo starts at %X/%X, consistency will be reached at %X/%X" -#~ msgstr "la restauration comme à %X/%X, la cohérence sera atteinte à %X/%X" +#~ msgid "bind %s to %s" +#~ msgstr "lie %s à %s" -#~ msgid "This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by \"client_encoding\"." +#~ msgid "brin operator family \"%s\" contains function %s with invalid support number %d" #~ msgstr "" -#~ "Cette erreur peut aussi survenir si la séquence d'octets ne correspond pas\n" -#~ "au jeu de caractères attendu par le serveur, le jeu étant contrôlé par\n" -#~ "« client_encoding »." +#~ "la famille d'opérateur brin « %s » contient la fonction %s\n" +#~ "avec le numéro de support %d invalide" -#~ msgid "Sets the language used in DO statement if LANGUAGE is not specified." +#~ msgid "brin operator family \"%s\" contains function %s with wrong signature for support number %d" #~ msgstr "" -#~ "Configure le langage utilisé dans une instruction DO si la clause LANGUAGE n'est\n" -#~ "pas spécifiée." +#~ "la famille d'opérateur brin « %s » contient la fonction %s\n" +#~ "avec une mauvaise signature pour le numéro de support %d" -#~ msgid "shared index \"%s\" can only be reindexed in stand-alone mode" -#~ msgstr "un index partagé « %s » peut seulement être réindexé en mode autonome" +#~ msgid "brin operator family \"%s\" contains invalid ORDER BY specification for operator %s" +#~ msgstr "" +#~ "la famille d'opérateur brin « %s » contient une spécification\n" +#~ "ORDER BY invalide pour l'opérateur %s" -#~ msgid "shared table \"%s\" can only be reindexed in stand-alone mode" -#~ msgstr "la table partagée « %s » peut seulement être réindexé en mode autonome" +#~ msgid "brin operator family \"%s\" contains operator %s with invalid strategy number %d" +#~ msgstr "" +#~ "la famille d'opérateur brin « %s » contient l'opérateur %s\n" +#~ "avec le numéro de stratégie %d invalide" -#~ msgid "cannot truncate system relation \"%s\"" -#~ msgstr "ne peut pas tronquer la relation système « %s »" +#~ msgid "brin operator family \"%s\" contains operator %s with wrong signature" +#~ msgstr "la famille d'opérateur brin « %s » contient l'opérateur %s avec une mauvaise signature" -#~ msgid "number of distinct values %g is too low" -#~ msgstr "le nombre de valeurs distinctes %g est trop basse" +#~ msgid "btree operator class \"%s\" is missing operator(s)" +#~ msgstr "il manque des opérateurs pour la classe d'opérateur btree « %s »" -#~ msgid "directory \"%s\" is not empty" -#~ msgstr "le répertoire « %s » n'est pas vide" +#~ msgid "btree operator family \"%s\" contains function %s with invalid support number %d" +#~ msgstr "" +#~ "la famille d'opérateur btree « %s » contient la fonction %s\n" +#~ "avec le numéro de support invalide %d" -#~ msgid "relation \"%s\" TID %u/%u: XMIN_COMMITTED not set for transaction %u --- cannot shrink relation" +#~ msgid "btree operator family \"%s\" contains function %s with wrong signature for support number %d" #~ msgstr "" -#~ "relation « %s », TID %u/%u : XMIN_COMMITTED non configuré pour la\n" -#~ "transaction %u --- n'a pas pu diminuer la taille de la relation" +#~ "la famille d'opérateur btree « %s » contient la fonction %s\n" +#~ "avec une mauvaise signature pour le numéro de support %d" -#~ msgid "relation \"%s\" TID %u/%u: dead HOT-updated tuple --- cannot shrink relation" +#~ msgid "btree operator family \"%s\" contains invalid ORDER BY specification for operator %s" #~ msgstr "" -#~ "relation « %s », TID %u/%u : ligne morte mise à jour par HOT --- n'a pas pu\n" -#~ "diminuer la taille de la relation" +#~ "la famille d'opérateur btree « %s » contient une spécification\n" +#~ "ORDER BY invalide pour l'opérateur %s" -#~ msgid "relation \"%s\" TID %u/%u: InsertTransactionInProgress %u --- cannot shrink relation" +#~ msgid "btree operator family \"%s\" contains operator %s with invalid strategy number %d" #~ msgstr "" -#~ "relation « %s », TID %u/%u : InsertTransactionInProgress %u --- n'a pas pu\n" -#~ "diminuer la taille de la relation" +#~ "la famille d'opérateur btree « %s » contient l'opérateur %s\n" +#~ "avec le numéro de stratégie invalide %d" -#~ msgid "relation \"%s\" TID %u/%u: DeleteTransactionInProgress %u --- cannot shrink relation" +#~ msgid "btree operator family \"%s\" contains operator %s with wrong signature" +#~ msgstr "la famille d'opérateur btree « %s » contient l'opérateur %s avec une mauvaise signature" + +#~ msgid "btree operator family \"%s\" is missing cross-type operator(s)" +#~ msgstr "il manque des opérateurs inter-type pour la famille d'opérateur btree « %s »" + +#~ msgid "btree operator family \"%s\" is missing operator(s) for types %s and %s" #~ msgstr "" -#~ "relation « %s », TID %u/%u : DeleteTransactionInProgress %u --- n'a pas pu\n" -#~ "diminuer la taille de la relation" +#~ "la famille d'opérateur btree « %s » nécessite des opérateurs supplémentaires\n" +#~ "pour les types %s et %s" -#~ msgid "" -#~ "%.0f dead row versions cannot be removed yet.\n" -#~ "Nonremovable row versions range from %lu to %lu bytes long.\n" -#~ "There were %.0f unused item pointers.\n" -#~ "Total free space (including removable row versions) is %.0f bytes.\n" -#~ "%u pages are or will become empty, including %u at the end of the table.\n" -#~ "%u pages containing %.0f free bytes are potential move destinations.\n" -#~ "%s." +#~ msgid "building index \"%s\" on table \"%s\" serially" +#~ msgstr "construction de l'index « %s » sur la table « %s » séquentiellement" + +#~ msgid "building index \"%s\" on table \"%s\" with request for %d parallel worker" +#~ msgid_plural "building index \"%s\" on table \"%s\" with request for %d parallel workers" +#~ msgstr[0] "construction de l'index « %s » sur la table « %s » avec une demande de %d processus parallèle" +#~ msgstr[1] "construction de l'index « %s » sur la table « %s » avec une demande de %d processus parallèles" + +#~ msgid "built-in type %u not found" +#~ msgstr "type interne %u non trouvé" + +#~ msgid "cannot PREPARE a transaction that has manipulated logical replication workers" #~ msgstr "" -#~ "%.0f versions de lignes mortes ne peuvent pas encore être supprimées.\n" -#~ "Les versions non supprimables de ligne vont de %lu to %lu octets.\n" -#~ "Il existait %.0f pointeurs d'éléments inutilisés.\n" -#~ "L'espace libre total (incluant les versions supprimables de ligne) est de\n" -#~ "%.0f octets.\n" -#~ "%u pages sont ou deviendront vides, ceci incluant %u pages en fin de la\n" -#~ "table.\n" -#~ "%u pages contenant %.0f octets libres sont des destinations de déplacement\n" -#~ "disponibles.\n" -#~ "%s." +#~ "ne peut pas préparer (PREPARE) une transaction qui a travaillé sur des\n" +#~ "workers de réplication logique" -#~ msgid "\"%s\": moved %u row versions, truncated %u to %u pages" -#~ msgstr "« %s » : %u versions de ligne déplacées, %u pages tronquées sur %u" +#~ msgid "cannot PREPARE a transaction that has operated on temporary namespace" +#~ msgstr "" +#~ "ne peut pas préparer (PREPARE) une transaction qui a travaillé sur un\n" +#~ "schéma temporaire" -#~ msgid "Rebuild the index with REINDEX." -#~ msgstr "Reconstruisez l'index avec REINDEX." +#~ msgid "cannot PREPARE a transaction that has operated on temporary tables" +#~ msgstr "" +#~ "ne peut pas préparer (PREPARE) une transaction qui a travaillé sur des\n" +#~ "tables temporaires" -#~ msgid "frame start at CURRENT ROW is not implemented" -#~ msgstr "début du frame à CURRENT ROW n'est pas implémenté" +#~ msgid "cannot accept a value of type any" +#~ msgstr "ne peut pas accepter une valeur de type any" -#~ msgid "database system is in consistent recovery mode" -#~ msgstr "le système de bases de données est dans un mode de restauration cohérent" +#~ msgid "cannot accept a value of type anyarray" +#~ msgstr "ne peut pas accepter une valeur de type anyarray" -#~ msgid "DISTINCT is supported only for single-argument aggregates" -#~ msgstr "DISTINCT est seulement supporté pour les agrégats à un seul argument" +#~ msgid "cannot accept a value of type anyelement" +#~ msgstr "ne peut pas accepter une valeur de type anyelement" -#~ msgid "index row size %lu exceeds btree maximum, %lu" -#~ msgstr "la taille de la ligne index %lu dépasse le maximum de btree, %lu" +#~ msgid "cannot accept a value of type anyenum" +#~ msgstr "ne peut pas accepter une valeur de type anyenum" -#~ msgid "Table contains duplicated values." -#~ msgstr "La table contient des valeurs dupliquées." +#~ msgid "cannot accept a value of type anynonarray" +#~ msgstr "ne peut pas accepter une valeur de type anynonarray" -#~ msgid "Automatically adds missing table references to FROM clauses." -#~ msgstr "" -#~ "Ajoute automatiquement les références à la table manquant dans les clauses\n" -#~ "FROM." +#~ msgid "cannot accept a value of type anyrange" +#~ msgstr "ne peut pas accepter une valeur de type anyrange" + +#~ msgid "cannot accept a value of type event_trigger" +#~ msgstr "ne peut pas accepter une valeur de type event_trigger" + +#~ msgid "cannot accept a value of type fdw_handler" +#~ msgstr "ne peut pas accepter une valeur de type fdw_handler" + +#~ msgid "cannot accept a value of type index_am_handler" +#~ msgstr "ne peut pas accepter une valeur de type index_am_handler" + +#~ msgid "cannot accept a value of type internal" +#~ msgstr "ne peut pas accepter une valeur de type internal" + +#~ msgid "cannot accept a value of type language_handler" +#~ msgstr "ne peut pas accepter une valeur de type language_handler" + +#~ msgid "cannot accept a value of type opaque" +#~ msgstr "ne peut pas accepter une valeur de type opaque" -#~ msgid "Sets the regular expression \"flavor\"." -#~ msgstr "Initialise l'expression rationnelle « flavor »." +#~ msgid "cannot accept a value of type pg_node_tree" +#~ msgstr "ne peut pas accepter une valeur de type pg_node_tree" -#~ msgid "attempted change of parameter \"%s\" ignored" -#~ msgstr "tentative de modification du paramètre « %s » ignoré" +#~ msgid "cannot accept a value of type trigger" +#~ msgstr "ne peut pas accepter une valeur de type trigger" -#~ msgid "This parameter cannot be changed after server start." -#~ msgstr "Ce paramètre ne peut pas être modifié après le lancement du serveur" +#~ msgid "cannot accept a value of type tsm_handler" +#~ msgstr "ne peut pas accepter une valeur de type tsm_handler" -#~ msgid "invalid database name \"%s\"" -#~ msgstr "nom de base de données « %s » invalide" +#~ msgid "cannot advance replication slot that has not previously reserved WAL" +#~ msgstr "impossible d'avancer un slot de réplication qui n'a pas auparavant réservé de WAL" -#~ msgid "invalid role name \"%s\"" -#~ msgstr "nom de rôle « %s » invalide" +#~ msgid "cannot alter type of column named in partition key" +#~ msgstr "ne peut pas modifier le type d'une colonne nommée dans une clé de partitionnement" -#~ msgid "invalid role password \"%s\"" -#~ msgstr "mot de passe « %s » de l'utilisateur invalide" +#~ msgid "cannot alter type of column referenced in partition key expression" +#~ msgstr "ne peut pas utiliser le type d'une colonne référencée dans l'expression d'une clé de partitionnement" -#~ msgid "cannot specify CSV in BINARY mode" -#~ msgstr "ne peut pas spécifier CSV en mode binaire (BINARY)" +#~ msgid "cannot attach table \"%s\" with OIDs as partition of table \"%s\" without OIDs" +#~ msgstr "ne peut pas attacher la table « %s » avec OID comme partition de la table « %s » sans OID" -#~ msgid "cannot set session authorization within security-definer function" -#~ msgstr "ne peut pas exécuter SESSION AUTHORIZATION sur la fonction SECURITY DEFINER" +#~ msgid "cannot attach table \"%s\" without OIDs as partition of table \"%s\" with OIDs" +#~ msgstr "ne peut pas attacher la table « %s » sans OID comme partition de la table « %s » avec OID" -#~ msgid "SELECT FOR UPDATE/SHARE is not supported within a query with multiple result relations" -#~ msgstr "" -#~ "SELECT FOR UPDATE/SHARE n'est pas supporté dans une requête avec plusieurs\n" -#~ "relations" +#~ msgid "cannot calculate week number without year information" +#~ msgstr "ne peut pas calculer le numéro de la semaine sans informations sur l'année" -#~ msgid "could not remove relation %s: %m" -#~ msgstr "n'a pas pu supprimer la relation %s : %m" +#~ msgid "cannot call json_array_elements on a non-array" +#~ msgstr "ne peut pas appeler json_array_elements sur un objet qui n'est pas un tableau" -#~ msgid "could not remove segment %u of relation %s: %m" -#~ msgstr "n'a pas pu supprimer le segment %u de la relation %s : %m" +#~ msgid "cannot call json_array_elements on a scalar" +#~ msgstr "ne peut pas appeler json_array_elements sur un scalaire" -#~ msgid "could not seek to block %u of relation %s: %m" -#~ msgstr "n'a pas pu se positionner sur le bloc %u de la relation %s : %m" +#~ msgid "cannot call json_object_keys on an array" +#~ msgstr "ne peut pas appeler json_object_keys sur un tableau" -#~ msgid "could not extend relation %s: %m" -#~ msgstr "n'a pas pu étendre la relation %s : %m" +#~ msgid "cannot call json_populate_recordset on a nested object" +#~ msgstr "ne peut pas appeler json_populate_recordset sur un objet imbriqué" -#~ msgid "could not open relation %s: %m" -#~ msgstr "n'a pas pu ouvrir la relation %s : %m" +#~ msgid "cannot call json_populate_recordset on a scalar" +#~ msgstr "ne peut pas appeler json_populate_recordset sur un scalaire" -#~ msgid "could not read block %u of relation %s: %m" -#~ msgstr "n'a pas pu lire le bloc %u de la relation %s : %m" +#~ msgid "cannot call json_populate_recordset on an object" +#~ msgstr "ne peut pas appeler json_populate_recordset sur un objet" -#~ msgid "could not write block %u of relation %s: %m" -#~ msgstr "n'a pas pu écrire le bloc %u de la relation %s : %m" +#~ msgid "cannot call json_populate_recordset with nested arrays" +#~ msgstr "ne peut pas appeler json_populate_recordset avec des tableaux imbriqués" -#~ msgid "could not open segment %u of relation %s: %m" -#~ msgstr "n'a pas pu ouvrir le segment %u de la relation %s : %m" +#~ msgid "cannot call json_populate_recordset with nested objects" +#~ msgstr "ne peut pas appeler json_populate_recordset sur des objets imbriqués" -#~ msgid "could not fsync segment %u of relation %s: %m" +#~ msgid "cannot change number of columns in view" +#~ msgstr "ne peut pas modifier le nombre de colonnes dans la vue" + +#~ msgid "cannot cluster on expressional index \"%s\" because its index access method does not handle null values" #~ msgstr "" -#~ "n'a pas pu synchroniser sur disque (fsync) le segment %u de la relation\n" -#~ "%s : %m" +#~ "ne peut pas exécuter CLUSTER sur l'index à expression « %s » car sa méthode\n" +#~ "d'accès ne gère pas les valeurs NULL" -#~ msgid "could not fsync segment %u of relation %s but retrying: %m" +#~ msgid "cannot cluster on index \"%s\" because access method does not handle null values" #~ msgstr "" -#~ "n'a pas pu synchroniser sur disque (fsync) le segment %u de la relation\n" -#~ "%s, nouvelle tentative : %m" +#~ "ne peut pas créer un cluster sur l'index « %s » car la méthode d'accès de\n" +#~ "l'index ne gère pas les valeurs NULL" -#~ msgid "could not seek to end of segment %u of relation %s: %m" -#~ msgstr "n'a pas pu se déplacer à la fin du segment %u de la relation %s : %m" +#~ msgid "cannot convert NaN to bigint" +#~ msgstr "ne peut pas convertir NaN en un entier de type bigint" -#~ msgid "SELECT FOR UPDATE/SHARE is not allowed in subqueries" -#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé dans les sous-requêtes" +#~ msgid "cannot convert NaN to integer" +#~ msgstr "ne peut pas convertir NaN en un entier" -#~ msgid "adding missing FROM-clause entry for table \"%s\"" -#~ msgstr "ajout d'une entrée manquante dans FROM (table « %s »)" +#~ msgid "cannot convert NaN to smallint" +#~ msgstr "ne peut pas convertir NaN en un entier de type smallint" -#~ msgid "OLD used in query that is not in a rule" -#~ msgstr "OLD utilisé dans une requête qui n'est pas une règle" +#~ msgid "cannot convert abstime \"invalid\" to timestamp" +#~ msgstr "ne peut pas convertir un abstime « invalid » en timestamp" -#~ msgid "NEW used in query that is not in a rule" -#~ msgstr "NEW utilisé dans une requête qui ne fait pas partie d'une règle" +#~ msgid "cannot convert empty polygon to circle" +#~ msgstr "ne peut pas convertir un polygône vide en cercle" -#~ msgid "hurrying in-progress restartpoint" -#~ msgstr "accélération du restartpoint en cours" +#~ msgid "cannot convert infinity to bigint" +#~ msgstr "ne peut pas convertir infinity en bigint" -#~ msgid "multiple DELETE events specified" -#~ msgstr "multiples événements DELETE spécifiés" +#~ msgid "cannot convert infinity to integer" +#~ msgstr "ne peut pas convertir infinity en integer" -#~ msgid "multiple TRUNCATE events specified" -#~ msgstr "multiples événements TRUNCATE spécifiés" +#~ msgid "cannot convert infinity to smallint" +#~ msgstr "ne peut pas convertir infinity en smallint" -#~ msgid "could not create XPath object" -#~ msgstr "n'a pas pu créer l'objet XPath" +#~ msgid "cannot convert reltime \"invalid\" to interval" +#~ msgstr "ne peut pas convertir reltime « invalid » en interval" -#, fuzzy -#~ msgid "wrong number of array_subscripts" -#~ msgstr "mauvais nombre d'indices du tableau" +#~ msgid "cannot convert reserved abstime value to date" +#~ msgstr "ne peut pas convertir la valeur réservée abstime en date" -#~ msgid "fillfactor=%d is out of range (should be between %d and 100)" -#~ msgstr "le facteur de remplissage (%d) est en dehors des limites (il devrait être entre %d et 100)" +#~ msgid "cannot copy to foreign table \"%s\"" +#~ msgstr "ne peut pas copier vers la table distante « %s »" -#~ msgid "GIN index does not support search with void query" -#~ msgstr "les index GIN ne supportent pas la recherche avec des requêtes vides" +#~ msgid "cannot create bounding box for empty polygon" +#~ msgstr "ne peut pas créer une boîte entourée pour un polygône vide" -#~ msgid "invalid LC_CTYPE setting" -#~ msgstr "paramètre LC_CTYPE invalide" +#~ msgid "cannot create range partition with empty range" +#~ msgstr "ne peut pas créer une partition par intervalle avec un intervalle vide" -#~ msgid "The database cluster was initialized with LOCALE_NAME_BUFLEN %d, but the server was compiled with LOCALE_NAME_BUFLEN %d." -#~ msgstr "" -#~ "Le cluster de bases de données a été initialisé avec un LOCALE_NAME_BUFLEN\n" -#~ "à %d alors que le serveur a été compilé avec un LOCALE_NAME_BUFLEN à %d." +#~ msgid "cannot create restricted tokens on this platform" +#~ msgstr "ne peut pas créer les jetons restreints sur cette plateforme" -#~ msgid "It looks like you need to initdb or install locale support." -#~ msgstr "" -#~ "Il semble que vous avez besoin d'exécuter initdb ou d'installer le support\n" -#~ "des locales." +#~ msgid "cannot create table with OIDs as partition of table without OIDs" +#~ msgstr "ne peut pas créer une table avec OID comme partition d'une table sans OID" -#~ msgid "log_restartpoints = %s" -#~ msgstr "log_restartpoints = %s" +#~ msgid "cannot display a value of type anyelement" +#~ msgstr "ne peut pas afficher une valeur de type anyelement" -#~ msgid "syntax error: cannot back up" -#~ msgstr "erreur de syntaxe : n'a pas pu revenir" +#~ msgid "cannot display a value of type anynonarray" +#~ msgstr "ne peut pas afficher une valeur de type anynonarray" -#~ msgid "syntax error; also virtual memory exhausted" -#~ msgstr "erreur de syntaxe ; de plus, mémoire virtuelle saturée" +#~ msgid "cannot display a value of type event_trigger" +#~ msgstr "ne peut pas afficher une valeur de type event_trigger" -#~ msgid "parser stack overflow" -#~ msgstr "saturation de la pile de l'analyseur" +#~ msgid "cannot display a value of type fdw_handler" +#~ msgstr "ne peut pas afficher une valeur de type fdw_handler" -#~ msgid "failed to drop all objects depending on %s" -#~ msgstr "échec lors de la suppression de tous les objets dépendant de %s" +#~ msgid "cannot display a value of type index_am_handler" +#~ msgstr "ne peut pas afficher une valeur de type index_am_handler" -#~ msgid "there are objects dependent on %s" -#~ msgstr "des objets dépendent de %s" +#~ msgid "cannot display a value of type internal" +#~ msgstr "ne peut pas afficher une valeur de type internal" -#~ msgid "multiple constraints named \"%s\" were dropped" -#~ msgstr "les contraintes multiples nommées « %s » ont été supprimées" +#~ msgid "cannot display a value of type language_handler" +#~ msgstr "ne peut pas afficher une valeur de type language_handler" -#~ msgid "constraint definition for check constraint \"%s\" does not match" -#~ msgstr "" -#~ "la définition de la contrainte « %s » pour la contrainte de vérification ne\n" -#~ "correspond pas" +#~ msgid "cannot display a value of type opaque" +#~ msgstr "ne peut pas afficher une valeur de type opaque" -#~ msgid "relation \"%s.%s\" contains more than \"max_fsm_pages\" pages with useful free space" -#~ msgstr "" -#~ "la relation « %s.%s » contient plus de « max_fsm_pages » pages d'espace\n" -#~ "libre utile" +#~ msgid "cannot display a value of type trigger" +#~ msgstr "ne peut pas afficher une valeur de type trigger" -#~ msgid "Consider using VACUUM FULL on this relation or increasing the configuration parameter \"max_fsm_pages\"." +#~ msgid "cannot display a value of type tsm_handler" +#~ msgstr "ne peut pas afficher une valeur de type tsm_handler" + +#~ msgid "cannot drop \"%s\" because it is being used by active queries in this session" #~ msgstr "" -#~ "Pensez à compacter cette relation en utilisant VACUUM FULL ou à augmenter le\n" -#~ "paramètre de configuration « max_fsm_pages »." +#~ "ne peut pas supprimer « %s » car cet objet est en cours d'utilisation par\n" +#~ "des requêtes actives dans cette session" -#~ msgid "cannot change number of columns in view" -#~ msgstr "ne peut pas modifier le nombre de colonnes dans la vue" +#~ msgid "cannot drop column named in partition key" +#~ msgstr "ne peut pas supprimer une colonne nommée dans une clé de partitionnement" -#~ msgid "unexpected Kerberos user name received from client (received \"%s\", expected \"%s\")" -#~ msgstr "" -#~ "nom d'utilisateur Kerberos inattendu reçu à partir du client (reçu « %s »,\n" -#~ "attendu « %s »)" +#~ msgid "cannot extract array element from a non-array" +#~ msgstr "ne peut pas extraire un élément du tableau à partir d'un objet qui n'est pas un tableau" -#~ msgid "Kerberos 5 not implemented on this server" -#~ msgstr "Kerberos 5 non implémenté sur ce serveur" +#~ msgid "cannot extract field from a non-object" +#~ msgstr "ne peut pas extraire le chemin à partir d'un non-objet" -#~ msgid "GSSAPI not implemented on this server" -#~ msgstr "GSSAPI non implémenté sur ce serveur" +#~ msgid "cannot output a value of type %s" +#~ msgstr "ne peut pas afficher une valeur de type %s" -#~ msgid "could not get security token from context" -#~ msgstr "n'a pas pu récupérer le jeton de sécurité à partir du contexte" +#~ msgid "cannot override frame clause of window \"%s\"" +#~ msgstr "ne peut pas surcharger la frame clause du window « %s »" -#~ msgid "unsafe permissions on private key file \"%s\"" -#~ msgstr "droits non sûrs sur le fichier de la clé privée « %s »" +#~ msgid "cannot reference partitioned table \"%s\"" +#~ msgstr "ne peut pas référencer la table partitionnée « %s »" -#~ msgid "File must be owned by the database user and must have no permissions for \"group\" or \"other\"." +#~ msgid "cannot reference permanent table from temporary table constraint" #~ msgstr "" -#~ "Le fichier doit appartenir au propriétaire de la base de données et ne doit\n" -#~ "pas avoir de droits pour un groupe ou pour les autres." +#~ "ne peut pas référencer une table permanente à partir de la contrainte de\n" +#~ "table temporaire" -#~ msgid "cannot use authentication method \"crypt\" because password is MD5-encrypted" +#~ msgid "cannot reference temporary table from permanent table constraint" #~ msgstr "" -#~ "n'a pas pu utiliser la méthode d'authentification « crypt » car le mot de\n" -#~ "passe est chiffré avec MD5" +#~ "ne peut pas référencer une table temporaire à partir d'une contrainte de\n" +#~ "table permanente" -#~ msgid "invalid entry in file \"%s\" at line %d, token \"%s\"" -#~ msgstr "entrée invalide dans le fichier « %s » à la ligne %d, jeton « %s »" +#~ msgid "cannot reindex invalid index on TOAST table concurrently" +#~ msgstr "ne peut pas réindexer un index invalide sur une table TOAST de manière concurrente" -#~ msgid "missing field in file \"%s\" at end of line %d" -#~ msgstr "champ manquant dans le fichier « %s » à la fin de la ligne %d" +#~ msgid "cannot route inserted tuples to a foreign table" +#~ msgstr "ne peut pas envoyer les lignes insérées dans une table distante" + +#~ msgid "cannot set session authorization within security-definer function" +#~ msgstr "ne peut pas exécuter SESSION AUTHORIZATION sur la fonction SECURITY DEFINER" + +#~ msgid "cannot specify CSV in BINARY mode" +#~ msgstr "ne peut pas spécifier CSV en mode binaire (BINARY)" + +#~ msgid "cannot truncate system relation \"%s\"" +#~ msgstr "ne peut pas tronquer la relation système « %s »" #~ msgid "cannot use Ident authentication without usermap field" #~ msgstr "n'a pas pu utiliser l'authentication Ident sans le champ usermap" -#~ msgid "Ident protocol identifies remote user as \"%s\"" -#~ msgstr "le protocole Ident identifie l'utilisateur distant comme « %s »" +#~ msgid "cannot use advisory locks during a parallel operation" +#~ msgstr "ne peut pas utiliser les verrous informatifs lors d'une opération parallèle" -#~ msgid "SELECT FOR UPDATE/SHARE is not supported for inheritance queries" -#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas supporté pour les requêtes d'héritage" +#~ msgid "cannot use aggregate function in RETURNING" +#~ msgstr "ne peut pas utiliser une fonction d'agrégat dans RETURNING" -#~ msgid "missing FROM-clause entry in subquery for table \"%s\"" -#~ msgstr "entrée manquante de la clause FROM dans la sous-requête de la table « %s »" +#~ msgid "cannot use aggregate function in UPDATE" +#~ msgstr "ne peut pas utiliser une fonction d'agrégat dans un UPDATE" -#~ msgid "adding missing FROM-clause entry in subquery for table \"%s\"" -#~ msgstr "entrée manquante de la clause FROM dans la sous-requête pour la table « %s »" +#~ msgid "cannot use aggregate function in VALUES" +#~ msgstr "ne peut pas utiliser la fonction d'agrégat dans un VALUES" -#~ msgid "%s: the number of buffers (-B) must be at least twice the number of allowed connections (-N) and at least 16\n" +#~ msgid "cannot use aggregate function in parameter default value" #~ msgstr "" -#~ "%s : le nombre de tampons (-B) doit être au moins deux fois le nombre de\n" -#~ "connexions disponibles (-N) et au moins 16\n" +#~ "ne peut pas utiliser une fonction d'agrégat dans la valeur par défaut d'un\n" +#~ "paramètre" -#~ msgid "could not set statistics collector timer: %m" -#~ msgstr "n'a pas pu configurer le timer du récupérateur de statistiques : %m" +#~ msgid "cannot use aggregate function in rule WHERE condition" +#~ msgstr "ne peut pas utiliser la fonction d'agrégat dans la condition d'une règle WHERE" -#~ msgid "insufficient shared memory for free space map" -#~ msgstr "mémoire partagée insuffisante pour la structure FSM" +#~ msgid "cannot use aggregate in index predicate" +#~ msgstr "ne peut pas utiliser un agrégat dans un prédicat d'index" -#~ msgid "max_fsm_pages must exceed max_fsm_relations * %d" -#~ msgstr "max_fsm_pages doit excéder max_fsm_relations * %d" +#~ msgid "cannot use authentication method \"crypt\" because password is MD5-encrypted" +#~ msgstr "" +#~ "n'a pas pu utiliser la méthode d'authentification « crypt » car le mot de\n" +#~ "passe est chiffré avec MD5" -#~ msgid "free space map contains %d pages in %d relations" -#~ msgstr "la structure FSM contient %d pages dans %d relations" +#~ msgid "cannot use subquery in parameter default value" +#~ msgstr "ne peut pas utiliser une sous-requête dans une valeur par défaut d'un paramètre" -#~ msgid "" -#~ "A total of %.0f page slots are in use (including overhead).\n" -#~ "%.0f page slots are required to track all free space.\n" -#~ "Current limits are: %d page slots, %d relations, using %.0f kB." -#~ msgstr "" -#~ "Un total de %.0f emplacements de pages est utilisé (ceci incluant la\n" -#~ "surcharge).\n" -#~ "%.0f emplacements de pages sont requis pour tracer tout l'espace libre.\n" -#~ "Les limites actuelles sont : %d emplacements de pages, %d relations,\n" -#~ "utilisant %.0f Ko." +#~ msgid "cannot use window function in EXECUTE parameter" +#~ msgstr "ne peut pas utiliser une fonction window dans le paramètre EXECUTE" -#~ msgid "max_fsm_relations(%d) equals the number of relations checked" -#~ msgstr "max_fsm_relations(%d) équivaut au nombre de relations tracées" +#~ msgid "cannot use window function in RETURNING" +#~ msgstr "ne peut pas utiliser une fonction window dans RETURNING" -#~ msgid "You have at least %d relations. Consider increasing the configuration parameter \"max_fsm_relations\"." -#~ msgstr "" -#~ "Vous avez au moins %d relations.Considèrez l'augmentation du paramètre de\n" -#~ "configuration « max_fsm_relations »." +#~ msgid "cannot use window function in UPDATE" +#~ msgstr "ne peut pas utiliser une fonction window dans un UPDATE" -#~ msgid "number of page slots needed (%.0f) exceeds max_fsm_pages (%d)" -#~ msgstr "le nombre d'emplacements de pages nécessaires (%.0f) dépasse max_fsm_pages (%d)" +#~ msgid "cannot use window function in VALUES" +#~ msgstr "ne peut pas utiliser la fonction window dans un VALUES" -#~ msgid "Consider increasing the configuration parameter \"max_fsm_pages\" to a value over %.0f." -#~ msgstr "" -#~ "Considérez l'augmentation du paramètre de configuration « max_fsm_pages »\n" -#~ "à une valeur supérieure à %.0f." +#~ msgid "cannot use window function in check constraint" +#~ msgstr "ne peut pas utiliser une fonction window dans une contrainte de vérification" -#~ msgid "Prints the parse tree to the server log." -#~ msgstr "Affiche l'arbre d'analyse dans les journaux applicatifs du serveur." +#~ msgid "cannot use window function in default expression" +#~ msgstr "ne peut pas utiliser une fonction window dans une expression par défaut" -#~ msgid "Prints the parse tree after rewriting to server log." -#~ msgstr "Affiche l'arbre d'analyse après ré-écriture dans les journaux applicatifs du serveur." +#~ msgid "cannot use window function in function expression in FROM" +#~ msgstr "" +#~ "ne peut pas utiliser la fonction window dans l'expression de la fonction\n" +#~ "du FROM" -#~ msgid "Prints the execution plan to server log." -#~ msgstr "Affiche le plan d'exécution dans les journaux applicatifs du serveur." +#~ msgid "cannot use window function in parameter default value" +#~ msgstr "ne peut pas utiliser la fonction window dans la valeur par défaut d'un paramètre" -#~ msgid "Uses the indented output format for EXPLAIN VERBOSE." -#~ msgstr "Utilise le format de sortie indenté pour EXPLAIN VERBOSE." +#~ msgid "cannot use window function in rule WHERE condition" +#~ msgstr "ne peut pas utiliser la fonction window dans la condition d'une règle WHERE" -#~ msgid "Sets the maximum number of tables and indexes for which free space is tracked." -#~ msgstr "" -#~ "Initialise le nombre maximum de tables et index pour lesquels l'espace libre\n" -#~ "est tracé." +#~ msgid "cannot use window function in transform expression" +#~ msgstr "ne peut pas utiliser la fonction window dans l'expression de la transformation" -#~ msgid "Valid values are ON, OFF, and SAFE_ENCODING." -#~ msgstr "Les valeurs valides sont ON, OFF et SAFE_ENCODING." +#~ msgid "cannot use window function in trigger WHEN condition" +#~ msgstr "ne peut pas utiliser la fonction window dans la condition WHEN d'un trigger" -#~ msgid "Valid values are DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO, NOTICE, WARNING, ERROR, LOG, FATAL, and PANIC. Each level includes all the levels that follow it." -#~ msgstr "" -#~ "Les valeurs valides sont DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO,\n" -#~ "NOTICE, WARNING, ERROR, LOG, FATAL et PANIC. Chaque niveau incut tous les\n" -#~ "niveaux qui le suit." +#~ msgid "changing argument type of function %s from \"opaque\" to \"cstring\"" +#~ msgstr "changement du type d'argument de la fonction %s d'« opaque » à « cstring »" -#~ msgid "All SQL statements that cause an error of the specified level or a higher level are logged." -#~ msgstr "" -#~ "Toutes les instructions SQL causant une erreur du niveau spécifié ou d'un\n" -#~ "niveau supérieur sont tracées." +#~ msgid "changing argument type of function %s from \"opaque\" to %s" +#~ msgstr "changement du type d'argument de la fonction %s d'« opaque » à %s" -#~ msgid "Each SQL transaction has an isolation level, which can be either \"read uncommitted\", \"read committed\", \"repeatable read\", or \"serializable\"." +#~ msgid "changing return type of function %s from \"opaque\" to \"cstring\"" +#~ msgstr "changement du type de retour de la fonction %s d'« opaque » vers « cstring »" + +#~ msgid "changing return type of function %s from \"opaque\" to \"language_handler\"" #~ msgstr "" -#~ "Chaque transaction SQL a un niveau d'isolation qui peut être soit « read\n" -#~ "uncommitted », soit « read committed », soit « repeatable read », soit\n" -#~ "« serializable »." +#~ "changement du type du code retour de la fonction %s d'« opaque » à\n" +#~ "« language_handler »" -#~ msgid "Each session can be either \"origin\", \"replica\", or \"local\"." -#~ msgstr "Chaque session peut valoir soit « origin » soit « replica » soit « local »." +#~ msgid "changing return type of function %s from \"opaque\" to \"trigger\"" +#~ msgstr "changement du type de retour de la fonction %s de « opaque » vers « trigger »" -#~ msgid "Sets realm to match Kerberos and GSSAPI users against." -#~ msgstr "" -#~ "Indique le royaume pour l'authentification des utilisateurs via Kerberos et\n" -#~ "GSSAPI." +#~ msgid "changing return type of function %s from %s to %s" +#~ msgstr "changement du type de retour de la fonction %s de %s vers %s" -#~ msgid "Sets the hostname of the Kerberos server." -#~ msgstr "Initalise le nom d'hôte du serveur Kerberos." +#~ msgid "checkpoint record is at %X/%X" +#~ msgstr "l'enregistrement du point de vérification est à %X/%X" -#~ msgid "This can be set to advanced, extended, or basic." -#~ msgstr "" -#~ "Ceci peut être initialisé avec advanced (avancé), extended (étendu) ou\n" -#~ "basic (basique)." +#~ msgid "checkpoint skipped because system is idle" +#~ msgstr "checkpoint ignoré car le système est inactif" -#~ msgid "Valid values are LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7." -#~ msgstr "" -#~ "Les valeurs valides sont LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5,\n" -#~ "LOCAL6, LOCAL7." +#~ msgid "child process was terminated by signal %d" +#~ msgstr "le processus fils a été terminé par le signal %d" -#~ msgid "Valid values are DOCUMENT and CONTENT." -#~ msgstr "Les valeurs valides sont DOCUMENT et CONTENT." +#~ msgid "child process was terminated by signal %s" +#~ msgstr "le processus fils a été terminé par le signal %s" -#~ msgid "not unique \"S\"" -#~ msgstr "« S » non unique" +#~ msgid "child table \"%s\" has a conflicting \"%s\" column" +#~ msgstr "la table fille « %s » a une colonne conflictuelle, « %s »" -#~ msgid "\"TZ\"/\"tz\" not supported" -#~ msgstr "« TZ »/« tz » non supporté" +#~ msgid "client requires SCRAM channel binding, but it is not supported" +#~ msgstr "le client requiert le lien de canal SCRAM mais ceci n'est pas supporté" -#~ msgid "January" -#~ msgstr "Janvier" +#~ msgid "clustering \"%s.%s\"" +#~ msgstr "exécution de CLUSTER sur « %s.%s »" -#~ msgid "February" -#~ msgstr "Février" +#~ msgid "collation of partition bound value for column \"%s\" does not match partition key collation \"%s\"" +#~ msgstr "le collationnement de la valeur limite de partition de la colonne « %s » ne correspond pas à celui de la clé de partition « %s »" -#~ msgid "March" -#~ msgstr "Mars" +#~ msgid "column \"%s\" appears more than once in partition key" +#~ msgstr "la colonne « %s » apparaît plus d'une fois dans la clé de partitionnement" -#~ msgid "April" -#~ msgstr "Avril" +#~ msgid "column \"%s\" contains null values" +#~ msgstr "la colonne « %s » contient des valeurs NULL" -#~ msgid "May" -#~ msgstr "Mai" +#~ msgid "column \"%s\" has type \"unknown\"" +#~ msgstr "la colonne « %s » est de type « unknown »" -#~ msgid "June" -#~ msgstr "Juin" +#~ msgid "column \"%s\" referenced in statistics does not exist" +#~ msgstr "la colonne « %s » référencée dans les statistiques n'existe pas" -#~ msgid "July" -#~ msgstr "Juillet" +#~ msgid "column name list not allowed in CREATE TABLE / AS EXECUTE" +#~ msgstr "la liste de noms de colonnes n'est pas autorisée dans CREATE TABLE / AS EXECUTE" -#~ msgid "August" -#~ msgstr "Août" +#~ msgid "combine function for aggregate %u must be declared as STRICT" +#~ msgstr "la fonction d'unification pour l'aggrégat %u doit être déclarée comme STRICT" -#~ msgid "September" -#~ msgstr "Septembre" +#~ msgid "committed" +#~ msgstr "validé" -#~ msgid "October" -#~ msgstr "Octobre" +#~ msgid "compacted fsync request queue from %d entries to %d entries" +#~ msgstr "a compacté la queue de requêtes fsync de %d entrées à %d" -#~ msgid "November" -#~ msgstr "Novembre" +#~ msgid "composite type must have at least one attribute" +#~ msgstr "le type composite doit avoir au moins un attribut" -#~ msgid "December" -#~ msgstr "Décembre" +#~ msgid "connect = false and copy_data = true are mutually exclusive options" +#~ msgstr "connect = false et copy_data = true sont des options mutuellement exclusives" -#~ msgid "Jan" -#~ msgstr "Jan" +#~ msgid "connect = false and create_slot = true are mutually exclusive options" +#~ msgstr "connect = false et create_slot = true sont des options mutuellement exclusives" -#~ msgid "Feb" -#~ msgstr "Fév" +#~ msgid "connection authorized: user=%s database=%s" +#~ msgstr "connexion autorisée : utilisateur=%s, base de données=%s" -#~ msgid "Mar" -#~ msgstr "Mar" +#~ msgid "connection authorized: user=%s database=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" +#~ msgstr "connexion autorisée : utilisateur=%s, base de données=%s, SSL activé (protocole=%s, chiffrement=%s, bits=%d, compression=%s)" -#~ msgid "Apr" -#~ msgstr "Avr" +#~ msgid "connection authorized: user=%s database=%s application_name=%s" +#~ msgstr "connexion autorisée : utilisateur=%s base de données=%s nom d'application=%s" -#~ msgid "S:May" -#~ msgstr "S:Mai" +#~ msgid "connection authorized: user=%s database=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" +#~ msgstr "connexion autorisée : utilisateur=%s base de données=%s nom d'application=%s SSL activé (protocole=%s, chiffrement=%s, bits=%d, compression=%s)" -#~ msgid "Jun" -#~ msgstr "Juin" +#~ msgid "connection limit exceeded for non-superusers" +#~ msgstr "limite de connexions dépassée pour les utilisateurs standards" -#~ msgid "Jul" -#~ msgstr "Juil" +#~ msgid "connection lost during COPY to stdout" +#~ msgstr "connexion perdue lors de l'opération COPY vers stdout" -#~ msgid "Aug" -#~ msgstr "Aoû" +#~ msgid "connection was re-authenticated" +#~ msgstr "la connexion a été ré-authentifiée" -#~ msgid "Sep" -#~ msgstr "Sep" +#~ msgid "consistent state delayed because recovery snapshot incomplete" +#~ msgstr "état de cohérence pas encore atteint à cause d'un snapshot de restauration incomplet" -#~ msgid "Oct" -#~ msgstr "Oct" +#~ msgid "constraint definition for check constraint \"%s\" does not match" +#~ msgstr "" +#~ "la définition de la contrainte « %s » pour la contrainte de vérification ne\n" +#~ "correspond pas" -#~ msgid "Nov" -#~ msgstr "Nov" +#~ msgid "constraints on foreign tables are not supported" +#~ msgstr "les contraintes sur les tables distantes ne sont pas supportées" -#~ msgid "Dec" -#~ msgstr "Déc" +#~ msgid "converting trigger group into constraint \"%s\" %s" +#~ msgstr "conversion du groupe de trigger en une contrainte « %s » %s" -#~ msgid "Sunday" -#~ msgstr "Dimanche" +#~ msgid "corrupted item pointer: offset = %u, length = %u" +#~ msgstr "pointeur d'élément corrompu : décalage = %u, longueur = %u" -#~ msgid "Monday" -#~ msgstr "Lundi" +#~ msgid "could not access root certificate file \"%s\": %m" +#~ msgstr "n'a pas pu accéder au fichier du certificat racine « %s » : %m" -#~ msgid "Tuesday" -#~ msgstr "Mardi" +#~ msgid "could not change directory to \"%s\"" +#~ msgstr "n'a pas pu accéder au répertoire « %s »" -#~ msgid "Wednesday" -#~ msgstr "Mercredi" +#~ msgid "could not change directory to \"%s\": %s" +#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s" -#~ msgid "Thursday" -#~ msgstr "Jeudi" +#~ msgid "could not close control file: %m" +#~ msgstr "n'a pas pu fermer le fichier de contrôle : %m" -#~ msgid "Friday" -#~ msgstr "Vendredi" +#~ msgid "could not close directory \"%s\": %s\n" +#~ msgstr "n'a pas pu fermer le répertoire « %s » : %s\n" -#~ msgid "Saturday" -#~ msgstr "Samedi" +#~ msgid "could not close log file %s: %m" +#~ msgstr "n'a pas pu fermer le fichier de transactions « %s » : %m" -#~ msgid "Sun" -#~ msgstr "Dim" +#~ msgid "could not close relation mapping file \"%s\": %m" +#~ msgstr "n'a pas pu fermer le fichier de correspondance des relations « %s » : %m" -#~ msgid "Mon" -#~ msgstr "Lun" +#~ msgid "could not close two-phase state file \"%s\": %m" +#~ msgstr "" +#~ "n'a pas pu fermer le fichier d'état de la validation en deux phases nommé\n" +#~ "« %s » : %m" -#~ msgid "Tue" -#~ msgstr "Mar" +#~ msgid "could not close two-phase state file: %m" +#~ msgstr "n'a pas pu fermer le fichier d'état de la validation en deux phases : %m" -#~ msgid "Wed" -#~ msgstr "Mer" +#~ msgid "could not complete SSL handshake on renegotiation, too many failures" +#~ msgstr "n'a pas pu terminer la poignée de main de renégotiation, trop d'échecs" -#~ msgid "Thu" -#~ msgstr "Jeu" +#, c-format +#~ msgid "could not compute %s hash: %s" +#~ msgstr "n'a pas pu calculer le hachage %s : %s" -#~ msgid "Fri" -#~ msgstr "Ven" +#~ msgid "could not create %s socket: %m" +#~ msgstr "n'a pas pu créer le socket %s : %m" -#~ msgid "Sat" -#~ msgstr "Sam" +#~ msgid "could not create XPath object" +#~ msgstr "n'a pas pu créer l'objet XPath" -#~ msgid "AM/PM hour must be between 1 and 12" -#~ msgstr "l'heure AM/PM doit être compris entre 1 et 12" +#~ msgid "could not create control file \"%s\": %m" +#~ msgstr "n'a pas pu créer le fichier de contrôle « %s » : %m" -#~ msgid "UTF-16 to UTF-8 translation failed: %lu" -#~ msgstr "échec de la conversion d'UTF16 vers UTF8 : %lu" +#~ msgid "could not create log file \"%s\": %m" +#~ msgstr "n'a pas pu créer le journal applicatif « %s » : %m" -#~ msgid "cannot calculate week number without year information" -#~ msgstr "ne peut pas calculer le numéro de la semaine sans informations sur l'année" +#~ msgid "could not create signal dispatch thread: error code %lu\n" +#~ msgstr "n'a pas pu créer le thread de répartition des signaux : code d'erreur %lu\n" -#~ msgid "query requires full scan, which is not supported by GIN indexes" +#~ msgid "could not create two-phase state file \"%s\": %m" #~ msgstr "" -#~ "la requête nécessite un parcours complet, ce qui n'est pas supporté par les\n" -#~ "index GIN" +#~ "n'a pas pu créer le fichier de statut de la validation en deux phases nommé\n" +#~ "« %s » : %m" -#~ msgid "@@ operator does not support lexeme weight restrictions in GIN index searches" +#~ msgid "could not determine actual result type for function declared to return type %s" #~ msgstr "" -#~ "l'opérateur @@ ne supporte pas les restrictions de poids de lexeme dans les\n" -#~ "recherches par index GIN" +#~ "n'a pas pu déterminer le type du résultat actuel pour la fonction déclarant\n" +#~ "renvoyer le type %s" -#~ msgid "unexpected delimiter at line %d of thesaurus file \"%s\"" -#~ msgstr "délimiteur inattendu sur la ligne %d du thesaurus « %s »" +#~ msgid "could not determine data type for argument 1" +#~ msgstr "n'a pas pu déterminer le type de données pour l'argument 1" -#~ msgid "unexpected end of line or lexeme at line %d of thesaurus file \"%s\"" -#~ msgstr "fin de ligne ou de lexeme inattendu sur la ligne %d du thesaurus « %s »" +#~ msgid "could not determine data type for argument 2" +#~ msgstr "n'a pas pu déterminer le type de données pour l'argument 2" -#~ msgid "unexpected end of line at line %d of thesaurus file \"%s\"" -#~ msgstr "fin de ligne inattendue à la ligne %d du thésaurus « %s »" +#~ msgid "could not determine input data types" +#~ msgstr "n'a pas pu déterminer les types de données en entrée" -#~ msgid "could not remove database directory \"%s\"" -#~ msgstr "n'a pas pu supprimer le répertoire de bases de données « %s »" +#~ msgid "could not determine which collation to use for initcap() function" +#~ msgstr "n'a pas pu déterminer le collationnement à utiliser pour la fonction initcap()" -#~ msgid "index \"%s\" is not ready" -#~ msgstr "l'index « %s » n'est pas prêt" +#~ msgid "could not determine which collation to use for partition bound expression" +#~ msgstr "n'a pas pu déterminer le collationnement à utiliser pour l'expression de limites de partitionnement" -#~ msgid "argument number is out of range" -#~ msgstr "le nombre en argument est en dehors des limites" +#~ msgid "could not determine which collation to use for upper() function" +#~ msgstr "n'a pas pu déterminer le collationnement à utiliser pour la fonction upper()" -#~ msgid "No rows were found in \"%s\"." -#~ msgstr "Aucune ligne trouvée dans « %s »." +#~ msgid "could not enable Lock Pages in Memory user right" +#~ msgstr "n'a pas pu activer le Lock Pages in Memory user right" -#~ msgid "inconsistent use of year %04d and \"BC\"" -#~ msgstr "utilisation non cohérente de l'année %04d et de « BC »" +#~ msgid "could not enable Lock Pages in Memory user right: error code %lu" +#~ msgstr "n'a pas pu activer le Lock Pages in Memory user right : code d'erreur %lu" -#~ msgid "\"interval\" time zone \"%s\" not valid" -#~ msgstr "le fuseau horaire « %s » n'est pas valide pour le type « interval »" +#~ msgid "could not enable credential reception: %m" +#~ msgstr "n'a pas pu activer la réception de lettres de créance : %m" -#~ msgid "Not enough memory for reassigning the prepared transaction's locks." -#~ msgstr "Pas assez de mémoire pour réaffecter les verrous des transactions préparées." +#~ msgid "could not extend relation %s: %m" +#~ msgstr "n'a pas pu étendre la relation %s : %m" -#~ msgid "large object %u was already dropped" -#~ msgstr "le « Large Object » %u a déjà été supprimé" +#~ msgid "could not fdatasync log file %s: %m" +#~ msgstr "n'a pas pu synchroniser sur disque (fdatasync) le journal de transactions %s : %m" -#~ msgid "large object %u was not opened for writing" -#~ msgstr "le « Large Object » %u n'a pas été ouvert en écriture" +#~ msgid "could not fetch table info for table \"%s.%s\": %s" +#~ msgstr "n'a pas pu récupérer les informations sur la table « %s.%s » : %s" -#~ msgid "invalid standby query string: %s" -#~ msgstr "chaîne de requête invalide sur le serveur en attente : %s" +#~ msgid "could not fork archiver: %m" +#~ msgstr "n'a pas pu lancer le processus fils correspondant au processus d'archivage : %m" -#~ msgid "terminating walsender process to force cascaded standby to update timeline and reconnect" -#~ msgstr "" -#~ "arrêt du processus walreceiver pour forcer le serveur standby en cascade à\n" -#~ "mettre à jour la timeline et à se reconnecter" +#~ msgid "could not format \"circle\" value" +#~ msgstr "n'a pas pu formater la valeur « circle »" -#~ msgid "invalid standby handshake message type %d" -#~ msgstr "type %d du message de handshake du serveur en attente invalide" +#~ msgid "could not format \"path\" value" +#~ msgstr "n'a pas pu formater la valeur « path »" -#~ msgid "streaming replication successfully connected to primary" -#~ msgstr "réplication de flux connecté avec succès au serveur principal" +#~ msgid "could not forward fsync request because request queue is full" +#~ msgstr "n'a pas pu envoyer la requête fsync car la queue des requêtes est pleine" -#~ msgid "shutdown requested, aborting active base backup" -#~ msgstr "arrêt demandé, annulation de la sauvegarde active de base" +#~ msgid "could not fseek in file \"%s\": %m" +#~ msgstr "n'a pas pu effectuer de fseek dans le fichier « %s » : %m" -#~ msgid "terminating all walsender processes to force cascaded standby(s) to update timeline and reconnect" -#~ msgstr "" -#~ "arrêt de tous les processus walsender pour forcer les serveurs standby en\n" -#~ "cascade à mettre à jour la timeline et à se reconnecter" +#~ msgid "could not fsync control file: %m" +#~ msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier de contrôle : %m" -#~ msgid "" -#~ "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter. You can either reduce the request size or reconfigure the kernel with larger SHMMAX. To reduce the request size (currently %lu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.\n" -#~ "If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for.\n" -#~ "The PostgreSQL documentation contains more information about shared memory configuration." +#~ msgid "could not fsync file \"%s\" but retrying: %m" #~ msgstr "" -#~ "Cette erreur signifie habituellement que la demande de PostgreSQL pour un\n" -#~ "segment de mémoire partagée a dépassé le paramètre SHMMAX de votre noyau.\n" -#~ "Vous pouvez soit réduire la taille de la requête soit reconfigurer le noyau\n" -#~ "avec un SHMMAX plus important. Pour réduire la taille de la requête\n" -#~ "(actuellement %lu octets), réduisez l'utilisation de la mémoire partagée par PostgreSQL,par exemple en réduisant shared_buffers ou max_connections\n" -#~ "Si la taille de la requête est déjà petite, il est possible qu'elle soit\n" -#~ "moindre que le paramètre SHMMIN de votre noyau, auquel cas, augmentez la\n" -#~ "taille de la requête ou reconfigurez SHMMIN.\n" -#~ "La documentation de PostgreSQL contient plus d'informations sur la\n" -#~ "configuration de la mémoire partagée." - -#~ msgid "cannot use window function in rule WHERE condition" -#~ msgstr "ne peut pas utiliser la fonction window dans la condition d'une règle WHERE" - -#~ msgid "cannot use aggregate function in rule WHERE condition" -#~ msgstr "ne peut pas utiliser la fonction d'agrégat dans la condition d'une règle WHERE" +#~ "n'a pas pu synchroniser sur disque (fsync) le fichier « %s », nouvelle\n" +#~ "tentative : %m" -#~ msgid "arguments of row IN must all be row expressions" -#~ msgstr "les arguments de la ligne IN doivent tous être des expressions de ligne" +#~ msgid "could not fsync log file %s: %m" +#~ msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier de transactions « %s » : %m" -#~ msgid "argument of %s must not contain window functions" -#~ msgstr "l'argument de %s ne doit pas contenir des fonctions window" +#~ msgid "could not fsync log segment %s: %m" +#~ msgstr "n'a pas pu synchroniser sur disque (fsync) le segment du journal des transactions %s : %m" -#~ msgid "argument of %s must not contain aggregate functions" -#~ msgstr "l'argument de %s ne doit pas contenir de fonctions d'agrégats" +#~ msgid "could not fsync relation mapping file \"%s\": %m" +#~ msgstr "n'a pas pu synchroniser (fsync) le fichier de correspondance des relations « %s » : %m" -#~ msgid "cannot use window function in function expression in FROM" +#~ msgid "could not fsync segment %u of relation %s but retrying: %m" #~ msgstr "" -#~ "ne peut pas utiliser la fonction window dans l'expression de la fonction\n" -#~ "du FROM" +#~ "n'a pas pu synchroniser sur disque (fsync) le segment %u de la relation\n" +#~ "%s, nouvelle tentative : %m" -#~ msgid "function expression in FROM cannot refer to other relations of same query level" +#~ msgid "could not fsync segment %u of relation %s: %m" #~ msgstr "" -#~ "l'expression de la fonction du FROM ne peut pas faire référence à d'autres\n" -#~ "relations sur le même niveau de la requête" +#~ "n'a pas pu synchroniser sur disque (fsync) le segment %u de la relation\n" +#~ "%s : %m" -#~ msgid "subquery in FROM cannot refer to other relations of same query level" +#~ msgid "could not fsync two-phase state file \"%s\": %m" #~ msgstr "" -#~ "la sous-requête du FROM ne peut pas faire référence à d'autres relations\n" -#~ "dans le même niveau de la requête" - -#~ msgid "JOIN/ON clause refers to \"%s\", which is not part of JOIN" -#~ msgstr "la clause JOIN/ON se réfère à « %s », qui ne fait pas partie du JOIN" - -#~ msgid "window functions not allowed in GROUP BY clause" -#~ msgstr "fonctions window non autorisées dans une clause GROUP BY" - -#~ msgid "aggregates not allowed in WHERE clause" -#~ msgstr "agrégats non autorisés dans une clause WHERE" - -#~ msgid "SELECT FOR UPDATE/SHARE cannot be used with foreign table \"%s\"" -#~ msgstr "SELECT FOR UPDATE/SHARE ne peut pas être utilisé avec une table distante « %s »" - -#~ msgid "SELECT FOR UPDATE/SHARE is not allowed with window functions" -#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé avec les fonctions window" +#~ "n'a pas pu synchroniser sur disque (fsync) le fichier d'état de la\n" +#~ "validation en deux phases nommé « %s » : %m" -#~ msgid "SELECT FOR UPDATE/SHARE is not allowed with aggregate functions" -#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé avec les fonctions d'agrégats" +#~ msgid "could not fsync two-phase state file: %m" +#~ msgstr "" +#~ "n'a pas pu synchroniser sur disque (fsync) le fichier d'état de la\n" +#~ "validation en deux phases : %m" -#~ msgid "SELECT FOR UPDATE/SHARE is not allowed with HAVING clause" -#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé avec la clause HAVING" +#~ msgid "could not get effective UID from peer credentials: %m" +#~ msgstr "n'a pas pu obtenir l'UID réel à partir des pièces d'identité de l'autre : %m" -#~ msgid "SELECT FOR UPDATE/SHARE is not allowed with GROUP BY clause" -#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé avec la clause GROUP BY" +#~ msgid "could not get keyword values for locale \"%s\": %s" +#~ msgstr "n'a pas pu obtenir les valeurs des mots clés pour la locale « %s » : %s" -#~ msgid "RETURNING cannot contain references to other relations" -#~ msgstr "RETURNING ne doit pas contenir de références à d'autres relations" +#~ msgid "could not get security token from context" +#~ msgstr "n'a pas pu récupérer le jeton de sécurité à partir du contexte" -#~ msgid "cannot use window function in RETURNING" -#~ msgstr "ne peut pas utiliser une fonction window dans RETURNING" +#~ msgid "could not identify current directory: %s" +#~ msgstr "n'a pas pu identifier le répertoire courant : %s" -#~ msgid "cannot use aggregate function in RETURNING" -#~ msgstr "ne peut pas utiliser une fonction d'agrégat dans RETURNING" +#~ msgid "could not link file \"%s\" to \"%s\" (initialization of log file): %m" +#~ msgstr "n'a pas pu lier le fichier « %s » à « %s » (initialisation du journal de transactions) : %m" -#~ msgid "cannot use window function in UPDATE" -#~ msgstr "ne peut pas utiliser une fonction window dans un UPDATE" +#~ msgid "could not load wldap32.dll" +#~ msgstr "n'a pas pu charger wldap32.dll" -#~ msgid "cannot use aggregate function in UPDATE" -#~ msgstr "ne peut pas utiliser une fonction d'agrégat dans un UPDATE" +#~ msgid "could not open %s: %m" +#~ msgstr "n'a pas pu ouvrir %s : %m" -#~ msgid "cannot use window function in VALUES" -#~ msgstr "ne peut pas utiliser la fonction window dans un VALUES" +#~ msgid "could not open BufFile \"%s\"" +#~ msgstr "n'a pas pu ouvrir le BufFile « %s »" -#~ msgid "cannot use aggregate function in VALUES" -#~ msgstr "ne peut pas utiliser la fonction d'agrégat dans un VALUES" +#~ msgid "could not open archive status directory \"%s\": %m" +#~ msgstr "n'a pas pu accéder au répertoire du statut des archives « %s » : %m" -#~ msgid "Use SELECT ... UNION ALL ... instead." -#~ msgstr "Utilisez à la place SELECT ... UNION ALL ..." +#~ msgid "could not open control file \"%s\": %m" +#~ msgstr "n'a pas pu ouvrir le fichier de contrôle « %s » : %m" -#~ msgid "VALUES must not contain OLD or NEW references" -#~ msgstr "VALUES ne doit pas contenir des références à OLD et NEW" +#~ msgid "could not open directory \"%s\": %s\n" +#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s\n" -#~ msgid "VALUES must not contain table references" -#~ msgstr "VALUES ne doit pas contenir de références de table" +#~ msgid "could not open directory \"pg_tblspc\": %m" +#~ msgstr "n'a pas pu ouvrir le répertoire « pg_tblspc » : %m" -#~ msgid "LDAP search failed for filter \"%s\" on server \"%s\": user is not unique (%ld matches)" -#~ msgstr "" -#~ "échec de la recherche LDAP pour le filtre « %s » sur le serveur « %s » :\n" -#~ "utilisateur non unique (%ld correspondances)" +#~ msgid "could not open file \"%s\" (log file %u, segment %u): %m" +#~ msgstr "n'a pas pu ouvrir le fichier « %s » (journal de transactions %u, segment %u) : %m" -#~ msgid "You need an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger." -#~ msgstr "Vous avez besoin d'une règle inconditionnelle ON DELETE DO INSTEAD ou d'un trigger INSTEAD OF DELETE." +#~ msgid "could not open new log file \"%s\": %m" +#~ msgstr "n'a pas pu ouvrir le nouveau journal applicatif « %s » : %m" -#~ msgid "You need an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger." -#~ msgstr "Vous avez besoin d'une règle non conditionnelle ON UPDATE DO INSTEAD ou d'un trigger INSTEAD OF UPDATE." +#~ msgid "could not open recovery command file \"%s\": %m" +#~ msgstr "n'a pas pu ouvrir le fichier de restauration « %s » : %m" -#~ msgid "You need an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger." -#~ msgstr "Vous avez besoin d'une règle ON INSERT DO INSTEAD sans condition ou d'un trigger INSTEAD OF INSERT." +#~ msgid "could not open relation %s: %m" +#~ msgstr "n'a pas pu ouvrir la relation %s : %m" -#~ msgid "automatic vacuum of table \"%s.%s.%s\": cannot (re)acquire exclusive lock for truncate scan" -#~ msgstr "vacuum automatique de la table « %s.%s.%s » : ne peut pas acquérir le verrou exclusif pour la tronquer" +#~ msgid "could not open segment %u of relation %s: %m" +#~ msgstr "n'a pas pu ouvrir le segment %u de la relation %s : %m" -#~ msgid "must be superuser to rename text search templates" -#~ msgstr "doit être super-utilisateur pour renommer les modèles de recherche plein texte" +#~ msgid "could not open tablespace directory \"%s\": %m" +#~ msgstr "n'a pas pu ouvrir le répertoire du tablespace « %s » : %m" -#~ msgid "must be superuser to rename text search parsers" +#~ msgid "could not open two-phase state file \"%s\": %m" #~ msgstr "" -#~ "doit être super-utilisateur pour renommer les analyseurs de recherche plein\n" -#~ "texte" +#~ "n'a pas pu ouvrir le fichier d'état de la validation en deux phases nommé\n" +#~ "« %s » : %m" -#~ msgid "cannot use window function in trigger WHEN condition" -#~ msgstr "ne peut pas utiliser la fonction window dans la condition WHEN d'un trigger" +#~ msgid "could not open write-ahead log directory \"%s\": %m" +#~ msgstr "n'a pas pu ouvrir le répertoire des journaux de transactions « %s » : %m" -#~ msgid "Use ALTER FOREIGN TABLE instead." -#~ msgstr "Utilisez ALTER FOREIGN TABLE à la place." +#~ msgid "could not open write-ahead log file \"%s\": %m" +#~ msgstr "n'a pas pu écrire dans le journal de transactions « %s » : %m" -#~ msgid "cannot use window function in transform expression" -#~ msgstr "ne peut pas utiliser la fonction window dans l'expression de la transformation" +#~ msgid "could not parse transaction log location \"%s\"" +#~ msgstr "n'a pas pu analyser l'emplacement du journal des transactions « %s »" -#~ msgid "default values on foreign tables are not supported" -#~ msgstr "les valeurs par défaut ne sont pas supportées sur les tables distantes" +#~ msgid "could not read block %u of relation %s: %m" +#~ msgstr "n'a pas pu lire le bloc %u de la relation %s : %m" -#~ msgid "constraints on foreign tables are not supported" -#~ msgstr "les contraintes sur les tables distantes ne sont pas supportées" +#~ msgid "could not read directory \"%s\": %s\n" +#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n" -#~ msgid "cannot use window function in EXECUTE parameter" -#~ msgstr "ne peut pas utiliser une fonction window dans le paramètre EXECUTE" +#~ msgid "could not read file \"%s\", read %d of %d: %m" +#~ msgstr "n'a pas pu lire le fichier « %s », lu %d sur %d : %m" -#~ msgid "cannot use aggregate in index predicate" -#~ msgstr "ne peut pas utiliser un agrégat dans un prédicat d'index" +#~ msgid "could not read file \"%s\", read %d of %u: %m" +#~ msgstr "n'a pas pu lire le fichier « %s », a lu %d sur %u : %m" -#~ msgid "function \"%s\" already exists in schema \"%s\"" -#~ msgstr "la fonction « %s » existe déjà dans le schéma « %s »" +#~ msgid "could not read file \"%s\": read %d of %d" +#~ msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %d" -#~ msgid "Use ALTER AGGREGATE to change owner of aggregate functions." -#~ msgstr "Utiliser ALTER AGGREGATE pour changer le propriétaire des fonctions d'agrégat." +#~ msgid "could not read from control file: %m" +#~ msgstr "n'a pas pu lire le fichier de contrôle : %m" -#~ msgid "Use ALTER AGGREGATE to rename aggregate functions." -#~ msgstr "Utiliser ALTER AGGREGATE pour renommer les fonctions d'agrégat." +#~ msgid "could not read from control file: read %d bytes, expected %d" +#~ msgstr "n'a pas pu lire le fichier de contrôle : lu %d octets, %d attendus" -#~ msgid "cannot use window function in parameter default value" -#~ msgstr "ne peut pas utiliser la fonction window dans la valeur par défaut d'un paramètre" +#~ msgid "could not read from file \"%s\"" +#~ msgstr "n'a pas pu lire à partir du fichier « %s »" -#~ msgid "cannot use aggregate function in parameter default value" -#~ msgstr "" -#~ "ne peut pas utiliser une fonction d'agrégat dans la valeur par défaut d'un\n" -#~ "paramètre" +#~ msgid "could not read from log segment %s, offset %u, length %lu: %m" +#~ msgstr "n'a pas pu lire le journal de transactions %s, décalage %u, longueur %lu : %m" -#~ msgid "cannot use subquery in parameter default value" -#~ msgstr "ne peut pas utiliser une sous-requête dans une valeur par défaut d'un paramètre" +#~ msgid "could not read from log segment %s, offset %u, length %zu: %m" +#~ msgstr "n'a pas pu lire le segment %s du journal de transactions, décalage %u, longueur %zu : %m" -#~ msgid "CREATE TABLE AS specifies too many column names" -#~ msgstr "CREATE TABLE AS spécifie trop de noms de colonnes" +#~ msgid "could not read relation mapping file \"%s\": %m" +#~ msgstr "n'a pas pu lire le fichier de correspondance des relations « %s » : %m" -#~ msgid "%s already exists in schema \"%s\"" -#~ msgstr "%s existe déjà dans le schéma « %s »" +#~ msgid "could not read symbolic link \"%s\"" +#~ msgstr "n'a pas pu lire le lien symbolique « %s »" -#~ msgid "A function returning ANYRANGE must have at least one ANYRANGE argument." +#~ msgid "could not read two-phase state file \"%s\": %m" #~ msgstr "" -#~ "Une fonction renvoyant ANYRANGE doit avoir au moins un argument du type\n" -#~ "ANYRANGE." +#~ "n'a pas pu lire le fichier d'état de la validation en deux phases nommé\n" +#~ "« %s » : %m" -#~ msgid "cannot use window function in check constraint" -#~ msgstr "ne peut pas utiliser une fonction window dans une contrainte de vérification" +#~ msgid "could not recreate two-phase state file \"%s\": %m" +#~ msgstr "" +#~ "n'a pas pu re-créer le fichier d'état de la validation en deux phases nommé\n" +#~ "« %s » : %m" -#~ msgid "cannot use window function in default expression" -#~ msgstr "ne peut pas utiliser une fonction window dans une expression par défaut" +#~ msgid "could not remove database directory \"%s\"" +#~ msgstr "n'a pas pu supprimer le répertoire de bases de données « %s »" -#~ msgid "uncataloged table %s" -#~ msgstr "table %s sans catalogue" +#~ msgid "could not remove file or directory \"%s\": %s\n" +#~ msgstr "n'a pas pu supprimer le fichier ou répertoire « %s » : %s\n" -#~ msgid "xrecoff \"%X\" is out of valid range, 0..%X" -#~ msgstr "xrecoff « %X » en dehors des limites valides, 0..%X" +#~ msgid "could not remove old transaction log file \"%s\": %m" +#~ msgstr "n'a pas pu supprimer l'ancien journal de transaction « %s » : %m" -#~ msgid "Incorrect XLOG_BLCKSZ in page header." -#~ msgstr "XLOG_BLCKSZ incorrect dans l'en-tête de page." +#~ msgid "could not remove relation %s: %m" +#~ msgstr "n'a pas pu supprimer la relation %s : %m" -#~ msgid "Incorrect XLOG_SEG_SIZE in page header." -#~ msgstr "XLOG_SEG_SIZE incorrecte dans l'en-tête de page." +#~ msgid "could not remove segment %u of relation %s: %m" +#~ msgstr "n'a pas pu supprimer le segment %u de la relation %s : %m" -#~ msgid "invalid contrecord length %u in log file %u, segment %u, offset %u" +#~ msgid "could not remove two-phase state file \"%s\": %m" #~ msgstr "" -#~ "longueur invalide du « contrecord » %u dans le journal de tranasctions %u,\n" -#~ "segment %u, décalage %u" +#~ "n'a pas pu supprimer le fichier d'état de la validation en deux phases\n" +#~ "« %s » : %m" -#~ msgid "there is no contrecord flag in log file %u, segment %u, offset %u" -#~ msgstr "" -#~ "il n'y a pas de drapeaux « contrecord » dans le journal de transactions %u,\n" -#~ "segment %u, décalage %u" +#~ msgid "could not rename file \"%s\" to \"%s\" (initialization of log file): %m" +#~ msgstr "n'a pas pu renommer le fichier « %s » en « %s » (initialisation du journal de transactions) : %m" -#~ msgid "could not open file \"%s\" (log file %u, segment %u): %m" -#~ msgstr "n'a pas pu ouvrir le fichier « %s » (journal de transactions %u, segment %u) : %m" +#~ msgid "could not rename old write-ahead log file \"%s\": %m" +#~ msgstr "n'a pas pu renommer l'ancien journal de transactions « %s » : %m" -#~ msgid "unlogged GiST indexes are not supported" -#~ msgstr "les index GiST non tracés ne sont pas supportés" +#~ msgid "could not reposition held cursor" +#~ msgstr "n'a pas pu repositionner le curseur détenu" -#~ msgid "could not change directory to \"%s\"" -#~ msgstr "n'a pas pu accéder au répertoire « %s »" +#~ msgid "could not reread block %d of file \"%s\": %m" +#~ msgstr "n'a pas pu relire le bloc %d dans le fichier « %s » : %m" -#~ msgid "Perhaps out of disk space?" -#~ msgstr "Peut-être manquez-vous de place disque ?" +#~ msgid "could not rmdir directory \"%s\": %m" +#~ msgstr "n'a pas pu supprimer le répertoire « %s » : %m" -#~ msgid "time zone offset %d is not a multiple of 900 sec (15 min) in time zone file \"%s\", line %d" +#~ msgid "could not seek in log file %s to offset %u: %m" +#~ msgstr "n'a pas pu se déplacer dans le fichier de transactions « %s » au décalage %u : %m" + +#~ msgid "could not seek in log segment %s to offset %u: %m" +#~ msgstr "n'a pas pu se déplacer dans le journal de transactions %s au décalage %u : %m" + +#~ msgid "could not seek in two-phase state file: %m" #~ msgstr "" -#~ "le décalage %d du fuseau horaire n'est pas un multiples de 900 secondes\n" -#~ "(15 minutes) dans le fichier des fuseaux horaires « %s », ligne %d" +#~ "n'a pas pu se déplacer dans le fichier de statut de la validation en deux\n" +#~ "phases : %m" -#~ msgid "Sets the name of the Kerberos service." -#~ msgstr "Initialise le nom du service Kerberos." +#~ msgid "could not seek to block %u in file \"%s\": %m" +#~ msgstr "n'a pas pu trouver le bloc %u dans le fichier « %s » : %m" -#~ msgid "No description available." -#~ msgstr "Aucune description disponible." +#~ msgid "could not seek to block %u of relation %s: %m" +#~ msgstr "n'a pas pu se positionner sur le bloc %u de la relation %s : %m" -#~ msgid "cannot call json_populate_recordset on a nested object" -#~ msgstr "ne peut pas appeler json_populate_recordset sur un objet imbriqué" +#~ msgid "could not seek to end of segment %u of relation %s: %m" +#~ msgstr "n'a pas pu se déplacer à la fin du segment %u de la relation %s : %m" -#~ msgid "cannot call json_populate_recordset on a scalar" -#~ msgstr "ne peut pas appeler json_populate_recordset sur un scalaire" +#~ msgid "could not set socket to blocking mode: %m" +#~ msgstr "n'a pas pu activer le mode bloquant pour la socket : %m" -#~ msgid "cannot call json_populate_recordset with nested arrays" -#~ msgstr "ne peut pas appeler json_populate_recordset avec des tableaux imbriqués" +#~ msgid "could not set statistics collector timer: %m" +#~ msgstr "n'a pas pu configurer le timer du récupérateur de statistiques : %m" -#~ msgid "must call json_populate_recordset on an array of objects" -#~ msgstr "doit appeler json_populate_recordset sur un tableau d'objets" +#~ msgid "could not stat control file \"%s\": %m" +#~ msgstr "n'a pas pu récupérer des informations sur le fichier de contrôle « %s » : %m" -#~ msgid "cannot call json_populate_recordset with nested objects" -#~ msgstr "ne peut pas appeler json_populate_recordset sur des objets imbriqués" +#~ msgid "could not stat file or directory \"%s\": %s\n" +#~ msgstr "" +#~ "n'a pas pu récupérer les informations sur le fichier ou répertoire\n" +#~ "« %s » : %s\n" -#~ msgid "cannot call json_populate_recordset on an object" -#~ msgstr "ne peut pas appeler json_populate_recordset sur un objet" +#~ msgid "could not stat two-phase state file \"%s\": %m" +#~ msgstr "" +#~ "n'a pas pu récupérer des informations sur le fichier d'état de la validation\n" +#~ "en deux phases nommé « %s » : %m" -#~ msgid "first argument of json_populate_recordset must be a row type" -#~ msgstr "le premier argument de json_populate_recordset doit être un type ROW" +#~ msgid "could not write block %ld of temporary file: %m" +#~ msgstr "n'a pas pu écrire le bloc %ld du fichier temporaire : %m" -#~ msgid "first argument of json_populate_record must be a row type" -#~ msgstr "le premier argument de json_populate_record doit être un type ROW" +#~ msgid "could not write block %u of relation %s: %m" +#~ msgstr "n'a pas pu écrire le bloc %u de la relation %s : %m" -#~ msgid "cannot call json_array_elements on a scalar" -#~ msgstr "ne peut pas appeler json_array_elements sur un scalaire" +#~ msgid "could not write to control file: %m" +#~ msgstr "n'a pas pu écrire le fichier de contrôle : %m" -#~ msgid "cannot call json_array_elements on a non-array" -#~ msgstr "ne peut pas appeler json_array_elements sur un objet qui n'est pas un tableau" +#~ msgid "could not write to hash-join temporary file: %m" +#~ msgstr "n'a pas pu écrire le fichier temporaire de la jointure hâchée : %m" -#~ msgid "cannot extract field from a non-object" -#~ msgstr "ne peut pas extraire le chemin à partir d'un non-objet" +#~ msgid "could not write to relation mapping file \"%s\": %m" +#~ msgstr "n'a pas pu écrire le fichier de correspondance des relations « %s » : %m" -#~ msgid "cannot extract array element from a non-array" -#~ msgstr "ne peut pas extraire un élément du tableau à partir d'un objet qui n'est pas un tableau" +#~ msgid "could not write to temporary file: %m" +#~ msgstr "n'a pas pu écrire dans le fichier temporaire : %m" -#~ msgid "cannot call json_object_keys on an array" -#~ msgstr "ne peut pas appeler json_object_keys sur un tableau" +#~ msgid "could not write to tuplestore temporary file: %m" +#~ msgstr "n'a pas pu écrire le fichier temporaire tuplestore : %m" -#~ msgid "missing assignment operator" -#~ msgstr "opérateur d'affectation manquant" +#~ msgid "could not write two-phase state file: %m" +#~ msgstr "n'a pas pu écrire dans le fichier d'état de la validation en deux phases : %m" -#~ msgid "wrong affix file format for flag" -#~ msgstr "mauvais format de fichier affixe pour le drapeau" +#, fuzzy +#~ msgid "couldn't put socket to blocking mode: %m" +#~ msgstr "n'a pas pu activer le mode bloquant pour la socket : %s\n" + +#, fuzzy +#~ msgid "couldn't put socket to non-blocking mode: %m" +#~ msgstr "n'a pas pu activer le mode non-bloquant pour la socket : %s\n" + +#~ msgid "data directory \"%s\" has group or world access" +#~ msgstr "" +#~ "le répertoire des données « %s » est accessible par le groupe et/ou par les\n" +#~ "autres" -#~ msgid "Views that return the same column more than once are not automatically updatable." -#~ msgstr "Les vues qui renvoient la même colonne plus d'une fois ne sont pas automatiquement disponibles en écriture." +#~ msgid "data type \"%s.%s\" required for logical replication does not exist" +#~ msgstr "le type de données « %s/%s » requis par la réplication logique n'existe pas" -#~ msgid "Security-barrier views are not automatically updatable." -#~ msgstr "Les vues avec barrière de sécurité ne sont pas automatiquement disponibles en écriture." +#~ msgid "data type %s has no default btree operator class" +#~ msgstr "le type de données %s n'a pas de classe d'opérateurs btree par défaut" -#~ msgid "Expected 1 tuple with 3 fields, got %d tuples with %d fields." -#~ msgstr "Attendait 1 ligne avec 3 champs, a obtenu %d lignes avec %d champs." +#~ msgid "data type %s has no default hash operator class" +#~ msgstr "le type de données %s n'a pas de classe d'opérateurs hash par défaut" -#~ msgid "%s: could not determine user name (GetUserName failed)\n" -#~ msgstr "%s : n'a pas pu déterminer le nom de l'utilisateur (GetUserName a échoué)\n" +#~ msgid "database \"%s\" not found" +#~ msgstr "base de données « %s » non trouvée" -#~ msgid "%s: invalid effective UID: %d\n" -#~ msgstr "%s : UID effectif invalide : %d\n" +#~ msgid "database name cannot be qualified" +#~ msgstr "le nom de la base de donnée ne peut être qualifié" -#~ msgid "krb5 authentication is not supported on local sockets" -#~ msgstr "" -#~ "l'authentification krb5 n'est pas supportée sur les connexions locales par\n" -#~ "socket" +#~ msgid "database system is in consistent recovery mode" +#~ msgstr "le système de bases de données est dans un mode de restauration cohérent" -#~ msgid "SSL renegotiation failure" -#~ msgstr "échec lors de la re-négotiation SSL" +#~ msgid "date/time value \"%s\" is no longer supported" +#~ msgstr "la valeur date/time « %s » n'est plus supportée" -#~ msgid "local user with ID %d does not exist" -#~ msgstr "l'utilisateur local dont l'identifiant est %d n'existe pas" +#~ msgid "date/time value \"current\" is no longer supported" +#~ msgstr "la valeur « current » pour la date et heure n'est plus supportée" -#~ msgid "Kerberos unparse_name returned error %d" -#~ msgstr "unparse_name de Kerberos a renvoyé l'erreur %d" +#~ msgid "default expression must not return a set" +#~ msgstr "l'expression par défaut ne doit pas renvoyer un ensemble" -#~ msgid "Kerberos recvauth returned error %d" -#~ msgstr "recvauth de Kerberos a renvoyé l'erreur %d" +#~ msgid "default values on foreign tables are not supported" +#~ msgstr "les valeurs par défaut ne sont pas supportées sur les tables distantes" -#~ msgid "Kerberos sname_to_principal(\"%s\", \"%s\") returned error %d" -#~ msgstr "sname_to_principal(« %s », « %s ») de Kerberos a renvoyé l'erreur %d" +#~ msgid "deferrable snapshot was unsafe; trying a new one" +#~ msgstr "l'image déferrable est non sûre ; tentative avec une nouvelle image" -#~ msgid "Kerberos keytab resolving returned error %d" -#~ msgstr "la résolution keytab de Kerberos a renvoyé l'erreur %d" +#~ msgid "destination buffer too small" +#~ msgstr "tampon de destination trop petit" -#~ msgid "Kerberos initialization returned error %d" -#~ msgstr "l'initialisation de Kerberos a retourné l'erreur %d" +#~ msgid "directory \"%s\" is not empty" +#~ msgstr "le répertoire « %s » n'est pas vide" -#~ msgid "Kerberos 5 authentication failed for user \"%s\"" -#~ msgstr "authentification Kerberos 5 échouée pour l'utilisateur « %s »" +#~ msgid "disabling huge pages" +#~ msgstr "désactivation des Huge Pages" -#~ msgid "trigger \"%s\" for table \"%s\" does not exist, skipping" -#~ msgstr "le trigger « %s » pour la table « %s » n'existe pas, poursuite du traitement" +#~ msgid "distance in phrase operator should be non-negative and less than %d" +#~ msgstr "la distance dans l'opérateur de phrase devrait être non négative et inférieure à %d" -#~ msgid "invalid input syntax for transaction log location: \"%s\"" -#~ msgstr "syntaxe invalide en entrée pour l'emplacement du journal de transactions : « %s »" +#~ msgid "domain %s has multiple constraints named \"%s\"" +#~ msgstr "le domaine %s a plusieurs contraintes nommées « %s »" -#~ msgid "could not parse transaction log location \"%s\"" -#~ msgstr "n'a pas pu analyser l'emplacement du journal des transactions « %s »" +#~ msgid "drop auto-cascades to %s" +#~ msgstr "DROP cascade automatiquement sur %s" -#~ msgid "%s \"%s\": return code %d" -#~ msgstr "%s « %s » : code de retour %d" +#~ msgid "encoding name too long" +#~ msgstr "nom d'encodage trop long" -#~ msgid "assertion checking is not supported by this build" -#~ msgstr "la vérification de l'assertion n'a pas été intégrée lors de la compilation" +#~ msgid "epoll_ctl() failed: %m" +#~ msgstr "échec de epoll_ctl() : %m" -#~ msgid "Set the amount of traffic to send and receive before renegotiating the encryption keys." -#~ msgstr "" -#~ "Configure la quantité de trafic à envoyer et recevoir avant la renégotiation\n" -#~ "des clés d'enchiffrement." +#~ msgid "epoll_wait() failed: %m" +#~ msgstr "échec de epoll_wait() : %m" -#~ msgid "Sets the maximum distance in log segments between automatic WAL checkpoints." -#~ msgstr "" -#~ "Initialise la distance maximale dans les journaux de transaction entre chaque\n" -#~ "point de vérification (checkpoints) des journaux." +#~ msgid "event trigger name cannot be qualified" +#~ msgstr "le nom du trigger sur événement ne peut pas être qualifié" -#~ msgid "It's just here so that we won't choke on SET AUTOCOMMIT TO ON from 7.3-vintage clients." -#~ msgstr "" -#~ "C'est ici uniquement pour ne pas avoir de problèmes avec le SET AUTOCOMMIT\n" -#~ "TO ON des clients 7.3." +#~ msgid "existing constraints on column \"%s.%s\" are sufficient to prove that it does not contain nulls" +#~ msgstr "les contraintes existantes sur la colonne « %s.%s » sont suffisantes pour prouver qu'elle ne contient aucun NULL" -#~ msgid "This parameter doesn't do anything." -#~ msgstr "Ce paramètre ne fait rien." +#~ msgid "extension name cannot be qualified" +#~ msgstr "le nom de l'extension ne peut pas être qualifié" -#~ msgid "This is a debugging aid." -#~ msgstr "C'est une aide de débogage." +#~ msgid "failed to create BIO" +#~ msgstr "échec pour la création de BIO" -#~ msgid "Turns on various assertion checks." -#~ msgstr "Active les différentes vérifications des assertions." +#~ msgid "failed to drop all objects depending on %s" +#~ msgstr "échec lors de la suppression de tous les objets dépendant de %s" -#~ msgid "cannot accept a value of type pg_node_tree" -#~ msgstr "ne peut pas accepter une valeur de type pg_node_tree" +#~ msgid "fillfactor=%d is out of range (should be between %d and 100)" +#~ msgstr "le facteur de remplissage (%d) est en dehors des limites (il devrait être entre %d et 100)" -#~ msgid "must be superuser or have the same role to terminate other server processes" -#~ msgstr "" -#~ "doit être super-utilisateur ou avoir le même rôle pour fermer les connexions\n" -#~ "exécutées dans les autres processus serveur" +#~ msgid "first argument of json_populate_record must be a row type" +#~ msgstr "le premier argument de json_populate_record doit être un type ROW" -#~ msgid "must be superuser or have the same role to cancel queries running in other server processes" -#~ msgstr "" -#~ "doit être super-utilisateur ou avoir le même rôle pour annuler des requêtes\n" -#~ "exécutées dans les autres processus serveur" +#~ msgid "first argument of json_populate_recordset must be a row type" +#~ msgstr "le premier argument de json_populate_recordset doit être un type ROW" -#~ msgid "invalid symbol" -#~ msgstr "symbole invalide" +#~ msgid "foreign key constraint \"%s\" of relation \"%s\" does not exist" +#~ msgstr "la clé étrangère « %s » de la relation « %s » n'existe pas" -#~ msgid "unexpected \"=\"" -#~ msgstr "« = » inattendu" +#~ msgid "foreign key constraints are not supported on partitioned tables" +#~ msgstr "les clés étrangères ne sont pas supportées sur les tables partitionnées" -#~ msgid "neither input type is an array" -#~ msgstr "aucun type de données n'est un tableau" +#~ msgid "foreign key referencing partitioned table \"%s\" must not be ONLY" +#~ msgstr "la clé étrangère référençant la table partitionnée « %s » ne doit pas être ONLY" -#~ msgid "could not determine input data types" -#~ msgstr "n'a pas pu déterminer les types de données en entrée" +#~ msgid "foreign-data wrapper name cannot be qualified" +#~ msgstr "le nom du wrapper de données distantes ne peut pas être qualifié" -#~ msgid "archive member \"%s\" too large for tar format" -#~ msgstr "membre « %s » de l'archive trop volumineux pour le format tar" +#~ msgid "frame start at CURRENT ROW is not implemented" +#~ msgstr "début du frame à CURRENT ROW n'est pas implémenté" -#~ msgid "postmaster became multithreaded" -#~ msgstr "le postmaster est devenu multithreadé" +#~ msgid "free space map contains %d pages in %d relations" +#~ msgstr "la structure FSM contient %d pages dans %d relations" -#~ msgid "invalid value for parameter \"replication\"" -#~ msgstr "valeur invalide pour le paramètre « replication »" +#~ msgid "function \"%s\" already exists in schema \"%s\"" +#~ msgstr "la fonction « %s » existe déjà dans le schéma « %s »" -#~ msgid "WAL archival (archive_mode=on) requires wal_level \"archive\", \"hot_standby\", or \"logical\"" -#~ msgstr "" -#~ "l'archivage des journaux de transactions (archive_mode=on) nécessite que\n" -#~ "le paramètre wal_level soit initialisé avec « archive », « hot_standby » ou « logical »" +#~ msgid "function \"%s\" is an aggregate function" +#~ msgstr "la fonction « %s » est une fonction d'agrégat" -#~ msgid "Consider increasing the configuration parameter \"checkpoint_segments\"." -#~ msgstr "Considèrez l'augmentation du paramètre « checkpoint_segments »." +#~ msgid "function \"%s\" is not a window function" +#~ msgstr "la fonction « %s » n'est pas une fonction window" -#~ msgid "subquery must return a column" -#~ msgstr "la sous-requête doit renvoyer une colonne" +#~ msgid "function \"%s\" is not an aggregate function" +#~ msgstr "la fonction « %s » n'est pas une fonction d'agrégat" -#~ msgid " -A 1|0 enable/disable run-time assert checking\n" -#~ msgstr "" -#~ " -A 1|0 active/désactive la vérification des limites (assert) à\n" -#~ " l'exécution\n" +#~ msgid "function \"%s\" must return type \"event_trigger\"" +#~ msgstr "la fonction « %s » doit renvoyer le type « event_trigger »" -#~ msgid "%s: setsysinfo failed: %s\n" -#~ msgstr "%s : setsysinfo a échoué : %s\n" +#~ msgid "function %s must return type \"fdw_handler\"" +#~ msgstr "la fonction %s doit renvoyer le type « fdw_handler »" -#~ msgid "could not set socket to blocking mode: %m" -#~ msgstr "n'a pas pu activer le mode bloquant pour la socket : %m" +#~ msgid "function %s must return type \"language_handler\"" +#~ msgstr "la fonction %s doit renvoyer le type « language_handler »" -#~ msgid "SSL failed to renegotiate connection before limit expired" -#~ msgstr "SSL a échoué à renégotier la connexion avant l'expiration du délai" +#~ msgid "function %s must return type \"trigger\"" +#~ msgstr "la fonction %s doit renvoyer le type « trigger »" -#~ msgid "could not complete SSL handshake on renegotiation, too many failures" -#~ msgstr "n'a pas pu terminer la poignée de main de renégotiation, trop d'échecs" +#~ msgid "function %s must return type \"tsm_handler\"" +#~ msgstr "la fonction %s doit renvoyer le type « tsm_handler »" -#~ msgid "SSL handshake failure on renegotiation, retrying" -#~ msgstr "échec du handshake SSL lors de la renégotiation, nouvelle tentative" +#~ msgid "function %u has too many arguments (%d, maximum is %d)" +#~ msgstr "la fonction %u a trop d'arguments (%d, le maximum étant %d)" -#~ msgid "SSL failure during renegotiation start" -#~ msgstr "échec SSL au début de la re-négotiation" +#~ msgid "function expression in FROM cannot refer to other relations of same query level" +#~ msgstr "" +#~ "l'expression de la fonction du FROM ne peut pas faire référence à d'autres\n" +#~ "relations sur le même niveau de la requête" -#~ msgid "received password packet" -#~ msgstr "paquet du mot de passe reçu" +#~ msgid "function returning set of rows cannot return null value" +#~ msgstr "" +#~ "la fonction renvoyant un ensemble de lignes ne peut pas renvoyer une valeur\n" +#~ "NULL" -#~ msgid "interval precision specified twice" -#~ msgstr "précision d'intervalle spécifiée deux fois" +#~ msgid "functions and operators can take at most one set argument" +#~ msgstr "les fonctions et opérateurs peuvent prendre au plus un argument d'ensemble" -#~ msgid "" -#~ "%.0f dead row versions cannot be removed yet.\n" -#~ "There were %.0f unused item pointers.\n" -#~ "%u pages are entirely empty.\n" -#~ "%s." +#~ msgid "gist operator family \"%s\" contains function %s with invalid support number %d" #~ msgstr "" -#~ "%.0f versions de lignes mortes ne peuvent pas encore être supprimées.\n" -#~ "Il y avait %.0f pointeurs d'éléments inutilisés.\n" -#~ "%u pages sont entièrement vides.\n" -#~ "%s." +#~ "la famille d'opérateur gist « %s » contient la fonction %s avec\n" +#~ "le numéro de support invalide %d" -#~ msgid "" -#~ "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" -#~ "pages: %d removed, %d remain\n" -#~ "tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable\n" -#~ "buffer usage: %d hits, %d misses, %d dirtied\n" -#~ "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" -#~ "system usage: %s" +#~ msgid "gist operator family \"%s\" contains function %s with wrong signature for support number %d" #~ msgstr "" -#~ "VACUUM automatique de la table « %s.%s.%s » : parcours d'index : %d\n" -#~ "pages : %d supprimées, %d restantes\n" -#~ "lignes : %.0f supprimées, %.0f restantes, %.0f sont mortes mais non supprimables\n" -#~ "utilisation des tampons : %d lus dans le cache, %d lus hors du cache, %d modifiés\n" -#~ "taux moyen de lecture : %.3f Mo/s, taux moyen d'écriture : %.3f Mo/s\n" -#~ "utilisation système : %s" +#~ "la famille d'opérateur gist « %s » contient la fonction %s avec une mauvaise\n" +#~ "signature pour le numéro de support %d" -#~ msgid "Specify a USING expression to perform the conversion." -#~ msgstr "Donnez une expression USING pour réaliser la conversion." +#~ msgid "gist operator family \"%s\" contains operator %s with invalid strategy number %d" +#~ msgstr "" +#~ "la famille d'opérateur gist « %s » contient l'opérateur %s avec le numéro\n" +#~ "de stratégie invalide %d" -#~ msgid "\"%s\" is not a table, materialized view, composite type, or foreign table" -#~ msgstr "« %s » n'est ni une table, ni une vue matérialisée, ni un type composite, ni une table distante" +#~ msgid "gist operator family \"%s\" contains operator %s with wrong signature" +#~ msgstr "la famille d'opérateur gist « %s » contient l'opérateur %s avec une mauvaise signature" -#~ msgid "This name may be disallowed altogether in future versions of PostgreSQL." -#~ msgstr "Ce nom pourrait être interdit dans les prochaines versions de PostgreSQL." +#~ msgid "gist operator family \"%s\" contains support procedure %s with cross-type registration" +#~ msgstr "" +#~ "la famille d'opérateur gist « %s » contient la procédure de support\n" +#~ "%s avec un enregistrement inter-type" -#~ msgid "=> is deprecated as an operator name" -#~ msgstr "=> est un nom d'opérateur obsolète" +#~ msgid "hash indexes are not WAL-logged and their use is discouraged" +#~ msgstr "les index hash ne sont pas journalisés, leur utilisation est donc déconseillée" -#~ msgid "WAL file is from different database system: Incorrect XLOG_BLCKSZ in page header." -#~ msgstr "" -#~ "le journal de transactions provient d'un système de bases de données différent :\n" -#~ "XLOG_BLCKSZ incorrect dans l'en-tête de page." +#~ msgid "hash operator class \"%s\" is missing operator(s)" +#~ msgstr "il manque des opérateurs pour la classe d'opérateur hash « %s »" -#~ msgid "WAL file is from different database system: Incorrect XLOG_SEG_SIZE in page header." +#~ msgid "hash operator family \"%s\" contains function %s with invalid support number %d" #~ msgstr "" -#~ "le journal de transactions provient d'un système de bases de données différent :\n" -#~ "XLOG_SEG_SIZE incorrect dans l'en-tête de page." +#~ "la famille d'opérateur hash « %s » contient la fonction %s avec\n" +#~ "le numéro de support invalide %d" -#~ msgid "WAL file is from different database system: WAL file database system identifier is %s, pg_control database system identifier is %s." +#~ msgid "hash operator family \"%s\" contains function %s with wrong signature for support number %d" #~ msgstr "" -#~ "L'identifiant du journal de transactions du système de base de données est %s,\n" -#~ "l'identifiant pg_control du système de base de données dans pg_control est %s." - -#~ msgid "incorrect total length in record at %X/%X" -#~ msgstr "longueur totale incorrecte à l'enregistrement %X/%X" +#~ "la famille d'opérateur hash « %s » contient la fonction %s avec une mauvaise\n" +#~ "signature pour le numéro de support %d" -#~ msgid "incorrect hole size in record at %X/%X" -#~ msgstr "taille du trou incorrect à l'enregistrement %X/%X" +#~ msgid "hash operator family \"%s\" contains invalid ORDER BY specification for operator %s" +#~ msgstr "" +#~ "la famille d'opérateur hash « %s » contient la spécification ORDER BY\n" +#~ "non supportée pour l'opérateur %s" -#~ msgid "invalid backup block size in record at %X/%X" -#~ msgstr "taille du bloc de sauvegarde invalide dans l'enregistrement à %X/%X" +#~ msgid "hash operator family \"%s\" contains operator %s with invalid strategy number %d" +#~ msgstr "" +#~ "la famille d'opérateur hash « %s » contient l'opérateur %s avec le numéro\n" +#~ "de stratégie invalide %d" -#~ msgid "record with zero length at %X/%X" -#~ msgstr "enregistrement de longueur nulle à %X/%X" +#~ msgid "hash operator family \"%s\" contains operator %s with wrong signature" +#~ msgstr "la famille d'opérateur hash « %s » contient l'opérateur %s avec une mauvaise signature" -#~ msgid "invalid xlog switch record at %X/%X" -#~ msgstr "enregistrement de basculement du journal de transaction invalide à %X/%X" +#~ msgid "hash operator family \"%s\" contains support procedure %s with cross-type registration" +#~ msgstr "" +#~ "la famille d'opérateur hash « %s » contient la procédure de support\n" +#~ "%s avec un enregistrement inter-type" -#~ msgid "oldest unfrozen transaction ID: %u, in database %u" +#~ msgid "hash operator family \"%s\" is missing operator(s) for types %s and %s" #~ msgstr "" -#~ "identifiant de transaction non gelé le plus ancien : %u, dans la base de\n" -#~ "données %u" +#~ "la famille d'opérateur hash « %s » nécessite des opérateurs supplémentaires\n" +#~ "pour les types %s et %s" -#~ msgid "next MultiXactId: %u; next MultiXactOffset: %u" -#~ msgstr "prochain MultiXactId : %u ; prochain MultiXactOffset : %u" +#~ msgid "hostssl requires SSL to be turned on" +#~ msgstr "hostssl requiert que SSL soit activé" -#~ msgid "next transaction ID: %u/%u; next OID: %u" -#~ msgstr "prochain identifiant de transaction : %u/%u ; prochain OID : %u" +#~ msgid "huge TLB pages not supported on this platform" +#~ msgstr "Huge Pages TLB non supporté sur cette plateforme." -#~ msgid "redo record is at %X/%X; shutdown %s" -#~ msgstr "l'enregistrement à ré-exécuter se trouve à %X/%X ; arrêt %s" +#~ msgid "hurrying in-progress restartpoint" +#~ msgstr "accélération du restartpoint en cours" -#~ msgid "invalid value for recovery parameter \"recovery_target\"" -#~ msgstr "valeur invalide pour le paramètre de restauration « recovery_target »" +#~ msgid "ignoring \"%s\" file because no \"%s\" file exists" +#~ msgstr "ignore le fichier « %s » parce que le fichier « %s » n'existe pas" -#~ msgid "unrecognized win32 error code: %lu" -#~ msgstr "code d'erreur win32 non reconnu : %lu" +#~ msgid "ignoring incomplete trigger group for constraint \"%s\" %s" +#~ msgstr "ignore le groupe de trigger incomplet pour la contrainte « %s » %s" -#~ msgid "mapped win32 error code %lu to %d" -#~ msgstr "correspondance du code d'erreur win32 %lu en %d" +#~ msgid "in progress" +#~ msgstr "en cours" -#~ msgid "too few arguments for format" -#~ msgstr "trop peu d'arguments pour le format" +#~ msgid "inconsistent use of year %04d and \"BC\"" +#~ msgstr "utilisation non cohérente de l'année %04d et de « BC »" -#~ msgid "invalid length in external \"numeric\" value" -#~ msgstr "longueur invalide dans la valeur externe « numeric »" +#~ msgid "incorrect hole size in record at %X/%X" +#~ msgstr "taille du trou incorrect à l'enregistrement %X/%X" -#~ msgid "time zone abbreviation \"%s\" is not used in time zone \"%s\"" -#~ msgstr "l'abréviation « %s » du fuseau horaire n'est pas utilisée dans le fuseau horaire « %s »" +#~ msgid "incorrect total length in record at %X/%X" +#~ msgstr "longueur totale incorrecte à l'enregistrement %X/%X" -#~ msgid "role \"%s\" is reserved" -#~ msgstr "le rôle « %s » est réservé" +#~ msgid "index \"%s\" is not a b-tree" +#~ msgstr "l'index « %s » n'est pas un btree" -#~ msgid "system columns cannot be used in an ON CONFLICT clause" -#~ msgstr "les colonnes systèmes ne peuvent pas être utilisées dans une clause ON CONFLICT" +#~ msgid "index \"%s\" is not ready" +#~ msgstr "l'index « %s » n'est pas prêt" -#~ msgid "function returning set of rows cannot return null value" +#~ msgid "index \"%s\" needs VACUUM FULL or REINDEX to finish crash recovery" #~ msgstr "" -#~ "la fonction renvoyant un ensemble de lignes ne peut pas renvoyer une valeur\n" -#~ "NULL" +#~ "l'index « %s » a besoin d'un VACUUM FULL ou d'un REINDEX pour terminer la\n" +#~ "récupération suite à un arrêt brutal" -#~ msgid "Only superusers can use untrusted languages." +#~ msgid "index \"%s\" needs VACUUM or REINDEX to finish crash recovery" #~ msgstr "" -#~ "Seuls les super-utilisateurs peuvent utiliser des langages qui ne sont pas\n" -#~ "de confiance." +#~ "l'index « %s » a besoin d'un VACUUM ou d'un REINDEX pour terminer la\n" +#~ "récupération suite à un arrêt brutal" -#~ msgid "huge TLB pages not supported on this platform" -#~ msgstr "Huge Pages TLB non supporté sur cette plateforme." +#~ msgid "index \"%s\" now contains %.0f row versions in %u pages as reported by parallel vacuum worker" +#~ msgstr "l'index « %s » contient maintenant %.0f versions de lignes dans %u pages, comme indiqué par le worker parallélisé du VACUUM" -#~ msgid "Lower bound of dimension array must be one." -#~ msgstr "La limite inférieure du tableau doit valoir un." +#~ msgid "index %u/%u/%u needs VACUUM FULL or REINDEX to finish crash recovery" +#~ msgstr "" +#~ "l'index %u/%u/%u a besoin d'un VACUUM FULL ou d'un REINDEX pour terminer la\n" +#~ "récupération suite à un arrêt brutal" -#~ msgid "aborted" -#~ msgstr "annulé" +#~ msgid "index expression cannot return a set" +#~ msgstr "l'expression de l'index ne peut pas renvoyer un ensemble" -#~ msgid "committed" -#~ msgstr "validé" +#~ msgid "index row size %lu exceeds btree maximum, %lu" +#~ msgstr "la taille de la ligne index %lu dépasse le maximum de btree, %lu" -#~ msgid "in progress" -#~ msgstr "en cours" +#~ msgid "index row size %lu exceeds maximum %lu for index \"%s\"" +#~ msgstr "la taille de la ligne index, %lu, dépasse le maximum, %lu, pour l'index « %s »" -#~ msgid "transaction ID " -#~ msgstr "ID de transaction " +#~ msgid "initializing for hot standby" +#~ msgstr "initialisation pour « Hot Standby »" -#~ msgid "invalid input syntax for %s: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type %s : « %s »" +#~ msgid "insufficient columns in %s constraint definition" +#~ msgstr "colonnes infuffisantes dans la définition de contrainte de %s" -#~ msgid "User \"%s\" has an empty password." -#~ msgstr "L'utilisateur « %s » a un mot de passe vide." +#~ msgid "insufficient shared memory for free space map" +#~ msgstr "mémoire partagée insuffisante pour la structure FSM" -#~ msgid "removed subscription for table %s.%s" -#~ msgstr "a supprimé une souscription pour la table %s.%s" +#~ msgid "interval precision specified twice" +#~ msgstr "précision d'intervalle spécifiée deux fois" -#~ msgid "added subscription for table %s.%s" -#~ msgstr "souscription ajoutée pour la table %s.%s" +#~ msgid "invalid LC_CTYPE setting" +#~ msgstr "paramètre LC_CTYPE invalide" -#~ msgid "column \"%s\" referenced in statistics does not exist" -#~ msgstr "la colonne « %s » référencée dans les statistiques n'existe pas" +#~ msgid "invalid MVNDistinct size %zd (expected at least %zd)" +#~ msgstr "taille MVNDistinct %zd invalide (attendue au moins %zd)" -#~ msgid "invalid publish list" -#~ msgstr "liste de publication invalide" +#~ msgid "invalid OID in COPY data" +#~ msgstr "OID invalide dans les données du COPY" -#~ msgid "could not get keyword values for locale \"%s\": %s" -#~ msgstr "n'a pas pu obtenir les valeurs des mots clés pour la locale « %s » : %s" +#, fuzzy +#~ msgid "invalid WAL message received from primary" +#~ msgstr "format du message invalide" -#~ msgid "cannot create range partition with empty range" -#~ msgstr "ne peut pas créer une partition par intervalle avec un intervalle vide" +#~ msgid "invalid backup block size in record at %X/%X" +#~ msgstr "taille du bloc de sauvegarde invalide dans l'enregistrement à %X/%X" -#~ msgid "When more tuples than this are present, quicksort will be used." -#~ msgstr "Quand plus de lignes que ça sont présentes, quicksort sera utilisé." +#~ msgid "invalid concatenation of jsonb objects" +#~ msgstr "concaténation invalide d'objets jsonb" -#~ msgid "Sets the maximum number of tuples to be sorted using replacement selection." -#~ msgstr "Configure le nombre maximum de lignes à trier en utilisant la sélection de remplacement." +#~ msgid "invalid contrecord length %u at %X/%X reading %X/%X, expected %u" +#~ msgstr "longueur %u invalide du contrecord à %X/%X en lisant %X/%X, attendait %u" -#~ msgid "must be superuser to get directory listings" -#~ msgstr "doit être super-utilisateur pour obtenir le contenu du répertoire" +#~ msgid "invalid contrecord length %u in log file %u, segment %u, offset %u" +#~ msgstr "" +#~ "longueur invalide du « contrecord » %u dans le journal de tranasctions %u,\n" +#~ "segment %u, décalage %u" -#~ msgid "must be superuser to get file information" -#~ msgstr "doit être super-utilisateur pour obtenir des informations sur le fichier" +#~ msgid "invalid database name \"%s\"" +#~ msgstr "nom de base de données « %s » invalide" -#~ msgid "could not open tablespace directory \"%s\": %m" -#~ msgstr "n'a pas pu ouvrir le répertoire du tablespace « %s » : %m" +#~ msgid "invalid entry in file \"%s\" at line %d, token \"%s\"" +#~ msgstr "entrée invalide dans le fichier « %s » à la ligne %d, jeton « %s »" -#~ msgid "There might be an idle transaction or a forgotten prepared transaction causing this." -#~ msgstr "" -#~ "Il pourait y avoir une transaction en attente ou une transaction préparée\n" -#~ "oubliée causant cela." +#~ msgid "invalid hexadecimal digit" +#~ msgstr "chiffre hexadécimal invalide" -#~ msgid "memory for serializable conflict tracking is nearly exhausted" -#~ msgstr "la mémoire pour tracer les conflits sérialisables est pratiquement pleine" +#~ msgid "invalid input syntax for %s: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type %s : « %s »" -#~ msgid "logical replication could not find row for delete in replication target relation \"%s\"" -#~ msgstr "la réplication logique n'a pas pu trouver la ligne à supprimer dans la relation cible de réplication %s" +#~ msgid "invalid input syntax for integer: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour l'entier : « %s »" -#~ msgid "data type \"%s.%s\" required for logical replication does not exist" -#~ msgstr "le type de données « %s/%s » requis par la réplication logique n'existe pas" +#~ msgid "invalid input syntax for numeric time zone: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le fuseau horaire numérique : « %s »" -#~ msgid "This can be caused by having a publisher with a higher PostgreSQL major version than the subscriber." -#~ msgstr "Ceci peut avoir pour cause un publieur ayant une version majeure de PostgreSQL supérieure à l'abonné" +#~ msgid "invalid input syntax for transaction log location: \"%s\"" +#~ msgstr "syntaxe invalide en entrée pour l'emplacement du journal de transactions : « %s »" -#~ msgid "built-in type %u not found" -#~ msgstr "type interne %u non trouvé" +#~ msgid "invalid input syntax for type boolean: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type booléen : « %s »" -#~ msgid "worker process" -#~ msgstr "processus de travail" +#~ msgid "invalid input syntax for type box: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type box : « %s »" -#~ msgid "data directory \"%s\" has group or world access" -#~ msgstr "" -#~ "le répertoire des données « %s » est accessible par le groupe et/ou par les\n" -#~ "autres" +#~ msgid "invalid input syntax for type bytea" +#~ msgstr "syntaxe en entrée invalide pour le type bytea" -#~ msgid "%s: max_wal_senders must be less than max_connections\n" -#~ msgstr "%s : max_wal_senders doit être inférieur à max_connections\n" +#~ msgid "invalid input syntax for type circle: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type circle : « %s »" -#~ msgid "could not open archive status directory \"%s\": %m" -#~ msgstr "n'a pas pu accéder au répertoire du statut des archives « %s » : %m" +#~ msgid "invalid input syntax for type double precision: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type double precision : « %s »" -#~ msgid "foreign key constraints are not supported on partitioned tables" -#~ msgstr "les clés étrangères ne sont pas supportées sur les tables partitionnées" +#~ msgid "invalid input syntax for type line: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type line: « %s »" -#~ msgid "ON CONFLICT clause is not supported with partitioned tables" -#~ msgstr "la clause ON CONFLICT n'est pas supporté avec les tables partitionnées" +#~ msgid "invalid input syntax for type lseg: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type lseg : « %s »" -#~ msgid "Anyone can use the client-side lo_export() provided by libpq." -#~ msgstr "Tout le monde peut utiliser lo_export(), fournie par libpq, du côté client." +#~ msgid "invalid input syntax for type macaddr: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type macaddr : « %s »" -#~ msgid "must be superuser to use server-side lo_export()" -#~ msgstr "doit être super-utilisateur pour utiliser lo_export() du côté serveur" +#~ msgid "invalid input syntax for type money: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type money : « %s »" -#~ msgid "Anyone can use the client-side lo_import() provided by libpq." -#~ msgstr "Tout le monde peut utiliser lo_import(), fourni par libpq, du côté client." +#~ msgid "invalid input syntax for type numeric: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type numeric : « %s »" -#~ msgid "must be superuser to use server-side lo_import()" -#~ msgstr "doit être super-utilisateur pour utiliser lo_import() du côté serveur" +#~ msgid "invalid input syntax for type oid: \"%s\"" +#~ msgstr "syntaxe invalide en entrée pour le type oid : « %s »" -#~ msgid "client requires SCRAM channel binding, but it is not supported" -#~ msgstr "le client requiert le lien de canal SCRAM mais ceci n'est pas supporté" +#~ msgid "invalid input syntax for type path: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type path : « %s »" -#~ msgid "RANGE FOLLOWING is only supported with UNBOUNDED" -#~ msgstr "RANGE FOLLOWING est seulement supporté avec UNBOUNDED" +#~ msgid "invalid input syntax for type pg_lsn: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type pg_lsn : « %s »" -#~ msgid "RANGE PRECEDING is only supported with UNBOUNDED" -#~ msgstr "RANGE PRECEDING est seulement supporté avec UNBOUNDED" +#~ msgid "invalid input syntax for type point: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type point : « %s »" -#~ msgid "combine function for aggregate %u must be declared as STRICT" -#~ msgstr "la fonction d'unification pour l'aggrégat %u doit être déclarée comme STRICT" +#~ msgid "invalid input syntax for type polygon: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type polygon : « %s »" -#~ msgid "Close open transactions soon to avoid wraparound problems." -#~ msgstr "" -#~ "Fermez les transactions ouvertes rapidement pour éviter des problèmes de\n" -#~ "réinitialisation." +#~ msgid "invalid input syntax for type real: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type real : « %s »" -#~ msgid "column \"%s\" appears more than once in partition key" -#~ msgstr "la colonne « %s » apparaît plus d'une fois dans la clé de partitionnement" +#~ msgid "invalid input syntax for type tid: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type tid : « %s »" -#~ msgid "operator procedure must be specified" -#~ msgstr "la procédure de l'opérateur doit être spécifiée" +#~ msgid "invalid input syntax for type tinterval: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type tinterval : « %s »" -#~ msgid "procedure number %d for (%s,%s) appears more than once" -#~ msgstr "le numéro de procédure %d pour (%s, %s) apparaît plus d'une fois" +#~ msgid "invalid input syntax for type txid_snapshot: \"%s\"" +#~ msgstr "syntaxe en entrée invalide pour le type txid_snapshot : « %s »" -#~ msgid "invalid procedure number %d, must be between 1 and %d" -#~ msgstr "numéro de procédure %d invalide, doit être compris entre 1 et %d" +#~ msgid "invalid input syntax for uuid: \"%s\"" +#~ msgstr "syntaxe invalide en entrée pour l'uuid : « %s »" -#~ msgid "transform function must not be an aggregate function" -#~ msgstr "la fonction de transformation ne doit pas être une fonction d'agrégat" +#~ msgid "invalid interval value for time zone: day not allowed" +#~ msgstr "valeur d'intervalle invalide pour le fuseau horaire : jour non autorisé" -#~ msgid "unrecognized function attribute \"%s\" ignored" -#~ msgstr "l'attribut « %s » non reconnu de la fonction a été ignoré" +#~ msgid "invalid interval value for time zone: month not allowed" +#~ msgstr "valeur d'intervalle invalide pour le fuseau horaire : les mois ne sont pas autorisés" -#~ msgid "cannot route inserted tuples to a foreign table" -#~ msgstr "ne peut pas envoyer les lignes insérées dans une table distante" +#~ msgid "invalid length in external \"numeric\" value" +#~ msgstr "longueur invalide dans la valeur externe « numeric »" -#~ msgid "cannot copy to foreign table \"%s\"" -#~ msgstr "ne peut pas copier vers la table distante « %s »" +#~ msgid "invalid length of secondary checkpoint record" +#~ msgstr "longueur invalide de l'enregistrement secondaire du point de vérification" -#~ msgid "must be superuser to COPY to or from a file" -#~ msgstr "doit être super-utilisateur pour utiliser COPY à partir ou vers un fichier" +#~ msgid "invalid list syntax for \"unix_socket_directories\"" +#~ msgstr "syntaxe de liste invalide pour le paramètre « unix_socket_directories »" -#~ msgid "function \"%s\" is not a window function" -#~ msgstr "la fonction « %s » n'est pas une fonction window" +#~ msgid "invalid list syntax for parameter \"datestyle\"" +#~ msgstr "syntaxe de liste invalide pour le paramètre « datestyle »" -#~ msgid "function \"%s\" is not an aggregate function" -#~ msgstr "la fonction « %s » n'est pas une fonction d'agrégat" +#~ msgid "invalid list syntax for parameter \"log_destination\"" +#~ msgstr "syntaxe de liste invalide pour le paramètre « log_destination »" -#~ msgid "function \"%s\" is an aggregate function" -#~ msgstr "la fonction « %s » est une fonction d'agrégat" +#~ msgid "invalid logical replication message type \"%c\"" +#~ msgstr "type de message « %c » de la réplication logique invalide" -#~ msgid "\"%s\" is already an attribute of type %s" -#~ msgstr "« %s » est déjà un attribut du type %s" +#~ msgid "invalid ndistinct magic %08x (expected %08x)" +#~ msgstr "nombre magique ndistinct invalide %08x (attendu %08x)" -#~ msgid "domain %s has multiple constraints named \"%s\"" -#~ msgstr "le domaine %s a plusieurs contraintes nommées « %s »" +#~ msgid "invalid ndistinct type %d (expected %d)" +#~ msgstr "type ndistinct invalide %d (%d attendu)" -#~ msgid "table \"%s\" has multiple constraints named \"%s\"" -#~ msgstr "la table « %s » a de nombreuses contraintes nommées « %s »" +#~ msgid "invalid number of arguments: object must be matched key value pairs" +#~ msgstr "nombre d'arguments invalide : l'objet doit correspond aux paires clé/valeur" -#~ msgid "%s in publication %s" -#~ msgstr "%s dans la publication %s" +#~ msgid "invalid privilege type USAGE for table" +#~ msgstr "droit USAGE invalide pour la table" -#~ msgid " in schema %s" -#~ msgstr " dans le schéma %s" +#~ msgid "invalid procedure number %d, must be between 1 and %d" +#~ msgstr "numéro de procédure %d invalide, doit être compris entre 1 et %d" -#~ msgid "WAL file is from different database system: incorrect XLOG_SEG_SIZE in page header" -#~ msgstr "le fichier WAL provient d'un système différent : XLOG_SEG_SIZE invalide dans l'en-tête de page" +#~ msgid "invalid publish list" +#~ msgstr "liste de publication invalide" -#~ msgid "invalid length of secondary checkpoint record" -#~ msgstr "longueur invalide de l'enregistrement secondaire du point de vérification" +#~ msgid "invalid record length at %X/%X" +#~ msgstr "longueur invalide de l'enregistrement à %X/%X" -#~ msgid "invalid xl_info in secondary checkpoint record" -#~ msgstr "xl_info invalide dans l'enregistrement du point de vérification secondaire" +#~ msgid "invalid regexp option: \"%c\"" +#~ msgstr "option invalide de l'expression rationnelle : « %c »" #~ msgid "invalid resource manager ID in secondary checkpoint record" #~ msgstr "identifiant du gestionnaire de ressource invalide dans l'enregistrement secondaire du point de vérification" -#~ msgid "invalid secondary checkpoint record" -#~ msgstr "enregistrement du point de vérification secondaire invalide" +#~ msgid "invalid role name \"%s\"" +#~ msgstr "nom de rôle « %s » invalide" + +#~ msgid "invalid role password \"%s\"" +#~ msgstr "mot de passe « %s » de l'utilisateur invalide" #~ msgid "invalid secondary checkpoint link in control file" #~ msgstr "lien du point de vérification secondaire invalide dans le fichier de contrôle" -#~ msgid "using previous checkpoint record at %X/%X" -#~ msgstr "utilisation du précédent enregistrement d'un point de vérification à %X/%X" +#~ msgid "invalid secondary checkpoint record" +#~ msgstr "enregistrement du point de vérification secondaire invalide" -#~ msgid "The database cluster was initialized with XLOG_SEG_SIZE %d, but the server was compiled with XLOG_SEG_SIZE %d." -#~ msgstr "" -#~ "Le cluster de bases de données a été initialisé avec un XLOG_SEG_SIZE à %d\n" -#~ "alors que le serveur a été compilé avec un XLOG_SEG_SIZE à %d." +#~ msgid "invalid socket: %s" +#~ msgstr "socket invalide : %s" -#~ msgid "could not open write-ahead log directory \"%s\": %m" -#~ msgstr "n'a pas pu ouvrir le répertoire des journaux de transactions « %s » : %m" +#~ msgid "invalid standby handshake message type %d" +#~ msgstr "type %d du message de handshake du serveur en attente invalide" -#~ msgid "no such savepoint" -#~ msgstr "aucun point de sauvegarde" +#~ msgid "invalid standby query string: %s" +#~ msgstr "chaîne de requête invalide sur le serveur en attente : %s" -#~ msgid "%s cannot be executed from a function or multi-command string" -#~ msgstr "" -#~ "%s ne peut pas être exécuté à partir d'une fonction ou d'une chaîne\n" -#~ "contenant plusieurs commandes" +#~ msgid "invalid status in external \"tinterval\" value" +#~ msgstr "statut invalide dans la valeur externe « tinterval »" -#~ msgid "could not open BufFile \"%s\"" -#~ msgstr "n'a pas pu ouvrir le BufFile « %s »" +#~ msgid "invalid symbol" +#~ msgstr "symbole invalide" -#~ msgid "parameter \"%s\" requires a numeric value" -#~ msgstr "le paramètre « %s » requiert une valeur numérique" +#~ msgid "invalid time zone name: \"%s\"" +#~ msgstr "nom du fuseau horaire invalide : « %s »" -#~ msgid "Create new tables with OIDs by default." -#~ msgstr "Crée des nouvelles tables avec des OID par défaut." +#~ msgid "invalid value for \"buffering\" option" +#~ msgstr "valeur invalide pour l'option « buffering »" -#~ msgid "could not close relation mapping file \"%s\": %m" -#~ msgstr "n'a pas pu fermer le fichier de correspondance des relations « %s » : %m" +#~ msgid "invalid value for \"check_option\" option" +#~ msgstr "valeur invalide pour l'option « check_option »" -#~ msgid "could not fsync relation mapping file \"%s\": %m" -#~ msgstr "n'a pas pu synchroniser (fsync) le fichier de correspondance des relations « %s » : %m" +#~ msgid "invalid value for parameter \"replication\"" +#~ msgstr "valeur invalide pour le paramètre « replication »" -#~ msgid "could not write to relation mapping file \"%s\": %m" -#~ msgstr "n'a pas pu écrire le fichier de correspondance des relations « %s » : %m" +#~ msgid "invalid value for recovery parameter \"%s\": \"%s\"" +#~ msgstr "valeur invalide pour le paramètre de restauration « %s » : « %s »" -#~ msgid "could not read relation mapping file \"%s\": %m" -#~ msgstr "n'a pas pu lire le fichier de correspondance des relations « %s » : %m" +#~ msgid "invalid value for recovery parameter \"recovery_target\"" +#~ msgstr "valeur invalide pour le paramètre de restauration « recovery_target »" -#~ msgid "invalid input syntax for numeric time zone: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le fuseau horaire numérique : « %s »" +#~ msgid "invalid xl_info in secondary checkpoint record" +#~ msgstr "xl_info invalide dans l'enregistrement du point de vérification secondaire" -#~ msgid "date/time value \"%s\" is no longer supported" -#~ msgstr "la valeur date/time « %s » n'est plus supportée" +#~ msgid "invalid xlog switch record at %X/%X" +#~ msgstr "enregistrement de basculement du journal de transaction invalide à %X/%X" -#~ msgid "regexp_split_to_array does not support the global option" -#~ msgstr "regexp_split_to_array ne supporte pas l'option globale" +#~ msgid "invalid zero-length item array in MVDependencies" +#~ msgstr "tableau d'éléments de longueur zéro invalide dans MVDependencies" -#~ msgid "regexp_split_to_table does not support the global option" -#~ msgstr "regexp_split_to_table ne supporte pas l'option globale" +#~ msgid "invalid zero-length item array in MVNDistinct" +#~ msgstr "tableau d'élément de longueur zéro invalide dans MVNDistinct" -#~ msgid "invalid regexp option: \"%c\"" -#~ msgstr "option invalide de l'expression rationnelle : « %c »" +#~ msgid "krb5 authentication is not supported on local sockets" +#~ msgstr "" +#~ "l'authentification krb5 n'est pas supportée sur les connexions locales par\n" +#~ "socket" -#~ msgid "ucnv_fromUChars failed: %s" -#~ msgstr "échec de ucnv_fromUChars : %s" +#~ msgid "language name cannot be qualified" +#~ msgstr "le nom du langage ne peut pas être qualifié" -#~ msgid "ucnv_toUChars failed: %s" -#~ msgstr "échec de ucnv_toUChars : %s" +#~ msgid "large object %u was already dropped" +#~ msgstr "le « Large Object » %u a déjà été supprimé" -#~ msgid "cannot convert reltime \"invalid\" to interval" -#~ msgstr "ne peut pas convertir reltime « invalid » en interval" +#~ msgid "large object %u was not opened for writing" +#~ msgstr "le « Large Object » %u n'a pas été ouvert en écriture" -#~ msgid "invalid status in external \"tinterval\" value" -#~ msgstr "statut invalide dans la valeur externe « tinterval »" +#~ msgid "leftover placeholder tuple detected in BRIN index \"%s\", deleting" +#~ msgstr "reste d'espace de ligne réservé dans l'index BRIN « %s », suppression" -#~ msgid "cannot convert abstime \"invalid\" to timestamp" -#~ msgstr "ne peut pas convertir un abstime « invalid » en timestamp" +#~ msgid "loaded library \"%s\"" +#~ msgstr "bibliothèque « %s » chargée" -#~ msgid "invalid time zone name: \"%s\"" -#~ msgstr "nom du fuseau horaire invalide : « %s »" +#~ msgid "local user with ID %d does not exist" +#~ msgstr "l'utilisateur local dont l'identifiant est %d n'existe pas" -#~ msgid "Consider using pg_logfile_rotate(), which is part of core, instead." -#~ msgstr "Considérer l'utilisation de pg_logfile_rotate(), qui est présent par défaut, à la place." +#~ msgid "log_restartpoints = %s" +#~ msgstr "log_restartpoints = %s" -#~ msgid "The arguments of jsonb_build_object() must consist of alternating keys and values." -#~ msgstr "Les arguments de jsonb_build_object() doivent consister en des clés et valeurs alternées" +#~ msgid "logger shutting down" +#~ msgstr "arrêt en cours des journaux applicatifs" -#~ msgid "invalid input syntax for integer: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour l'entier : « %s »" +#~ msgid "logical replication apply worker for subscription \"%s\" will restart because subscription's publications were changed" +#~ msgstr "le processus apply de réplication logique pour la souscription « %s » redémarrera car les publications ont été modifiées" -#~ msgid "cannot convert empty polygon to circle" -#~ msgstr "ne peut pas convertir un polygône vide en cercle" +#~ msgid "logical replication apply worker for subscription \"%s\" will restart because the connection information was changed" +#~ msgstr "le processus apply de réplication logique pour la souscription « %s » redémarrera car la souscription a été modifiée" -#~ msgid "cannot create bounding box for empty polygon" -#~ msgstr "ne peut pas créer une boîte entourée pour un polygône vide" +#~ msgid "logical replication apply worker for subscription \"%s\" will restart because the replication slot name was changed" +#~ msgstr "le processus apply de réplication logique pour la souscription « %s » redémarrera car le nom du slot de réplication a été modifiée" -#~ msgid "could not determine which collation to use for initcap() function" -#~ msgstr "n'a pas pu déterminer le collationnement à utiliser pour la fonction initcap()" +#~ msgid "logical replication at prepare time requires begin_prepare_cb callback" +#~ msgstr "la réplication logique lors de la préparation requiert la fonction begin_prepare_cb" -#~ msgid "could not determine which collation to use for upper() function" -#~ msgstr "n'a pas pu déterminer le collationnement à utiliser pour la fonction upper()" +#~ msgid "logical replication at prepare time requires commit_prepared_cb callback" +#~ msgstr "la réplication logique lors de la préparation requiert la fonction commit_prepared_cb" -#~ msgid "abstime out of range for date" -#~ msgstr "abstime en dehors des limites pour une date" +#~ msgid "logical replication at prepare time requires rollback_prepared_cb callback" +#~ msgstr "la réplication logique lors de la préparation requiert la fonction rollback_prepared_cb" -#~ msgid "cannot convert reserved abstime value to date" -#~ msgstr "ne peut pas convertir la valeur réservée abstime en date" +#~ msgid "logical replication could not find row for delete in replication target relation \"%s\"" +#~ msgstr "la réplication logique n'a pas pu trouver la ligne à supprimer dans la relation cible de réplication %s" -#~ msgid "date/time value \"current\" is no longer supported" -#~ msgstr "la valeur « current » pour la date et heure n'est plus supportée" +#~ msgid "logical replication launcher shutting down" +#~ msgstr "arrêt du processus de lancement de la réplication logique" -#~ msgid "could not seek to block %u in file \"%s\": %m" -#~ msgstr "n'a pas pu trouver le bloc %u dans le fichier « %s » : %m" +#~ msgid "logical replication launcher started" +#~ msgstr "lancement du processus de lancement de la réplication logique" -#~ msgid "corrupted item pointer: offset = %u, length = %u" -#~ msgstr "pointeur d'élément corrompu : décalage = %u, longueur = %u" +#~ msgid "logical replication target relation \"%s.%s\" is not a table" +#~ msgstr "la relation cible de la réplication logique « %s.%s » n'est pas une table" -#~ msgid "poll() failed: %m" -#~ msgstr "échec de poll() : %m" +#~ msgid "logical streaming requires a stream_abort_cb callback" +#~ msgstr "le flux logique requiert une fonction stream_abort_cb" + +#~ msgid "logical streaming requires a stream_change_cb callback" +#~ msgstr "le flux logique requiert une fonction stream_change_cb" + +#~ msgid "logical streaming requires a stream_commit_cb callback" +#~ msgstr "la réplication logique requiert la fonction stream_commit_cb" + +#~ msgid "logical streaming requires a stream_start_cb callback" +#~ msgstr "le flux logique requiert une fonction stream_start_cb" + +#~ msgid "mapped win32 error code %lu to %d" +#~ msgstr "correspondance du code d'erreur win32 %lu en %d" + +#~ msgid "max_fsm_pages must exceed max_fsm_relations * %d" +#~ msgstr "max_fsm_pages doit excéder max_fsm_relations * %d" + +#~ msgid "max_fsm_relations(%d) equals the number of relations checked" +#~ msgstr "max_fsm_relations(%d) équivaut au nombre de relations tracées" + +#~ msgid "memory for serializable conflict tracking is nearly exhausted" +#~ msgstr "la mémoire pour tracer les conflits sérialisables est pratiquement pleine" -#~ msgid "epoll_wait() failed: %m" -#~ msgstr "échec de epoll_wait() : %m" +#~ msgid "missing FROM-clause entry in subquery for table \"%s\"" +#~ msgstr "entrée manquante de la clause FROM dans la sous-requête de la table « %s »" -#~ msgid "epoll_ctl() failed: %m" -#~ msgstr "échec de epoll_ctl() : %m" +#~ msgid "missing assignment operator" +#~ msgstr "opérateur d'affectation manquant" -#~ msgid "Set dynamic_shared_memory_type to a value other than \"none\"." -#~ msgstr "Configurez dynamic_shared_memory_type à une valeur autre que « none »." +#~ msgid "missing data for OID column" +#~ msgstr "données manquantes pour la colonne OID" -#~ msgid "could not rmdir directory \"%s\": %m" -#~ msgstr "n'a pas pu supprimer le répertoire « %s » : %m" +#~ msgid "missing field in file \"%s\" at end of line %d" +#~ msgstr "champ manquant dans le fichier « %s » à la fin de la ligne %d" -#~ msgid "invalid MVNDistinct size %zd (expected at least %zd)" -#~ msgstr "taille MVNDistinct %zd invalide (attendue au moins %zd)" +#~ msgid "missing or erroneous pg_hba.conf file" +#~ msgstr "fichier pg_hba.conf manquant ou erroné" -#~ msgid "invalid zero-length item array in MVNDistinct" -#~ msgstr "tableau d'élément de longueur zéro invalide dans MVNDistinct" +#~ msgid "moving row to another partition during a BEFORE trigger is not supported" +#~ msgstr "déplacer une ligne vers une autre partition lors de l'exécution d'un trigger BEFORE n'est pas supporté" -#~ msgid "invalid ndistinct type %d (expected %d)" -#~ msgstr "type ndistinct invalide %d (%d attendu)" +#~ msgid "multibyte flag character is not allowed" +#~ msgstr "un caractère drapeau multi-octet n'est pas autorisé" -#~ msgid "invalid ndistinct magic %08x (expected %08x)" -#~ msgstr "nombre magique ndistinct invalide %08x (attendu %08x)" +#~ msgid "multiple DELETE events specified" +#~ msgstr "multiples événements DELETE spécifiés" -#~ msgid "invalid zero-length item array in MVDependencies" -#~ msgstr "tableau d'éléments de longueur zéro invalide dans MVDependencies" +#~ msgid "multiple TRUNCATE events specified" +#~ msgstr "multiples événements TRUNCATE spécifiés" -#~ msgid "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT must not be called in a subtransaction" -#~ msgstr "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT ne doit pas être appelé dans une sous-transaction" +#~ msgid "multiple constraints named \"%s\" were dropped" +#~ msgstr "les contraintes multiples nommées « %s » ont été supprimées" -#~ msgid "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT must be called before any query" -#~ msgstr "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT doit être appelé avant toute requête" +#~ msgid "must be superuser or have the same role to cancel queries running in other server processes" +#~ msgstr "" +#~ "doit être super-utilisateur ou avoir le même rôle pour annuler des requêtes\n" +#~ "exécutées dans les autres processus serveur" -#~ msgid "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT must be called inside a transaction" -#~ msgstr "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT doit être appelé dans une transaction" +#~ msgid "must be superuser or have the same role to terminate other server processes" +#~ msgstr "" +#~ "doit être super-utilisateur ou avoir le même rôle pour fermer les connexions\n" +#~ "exécutées dans les autres processus serveur" -#~ msgid "CREATE_REPLICATION_SLOT ... EXPORT_SNAPSHOT must not be called inside a transaction" -#~ msgstr "CREATE_REPLICATION_SLOT ... EXPORT_SNAPSHOT ne doit pas être appelé dans une sous-transaction" +#~ msgid "must be superuser or replication role to run a backup" +#~ msgstr "doit être super-utilisateur ou avoir l'attribut de réplication pour exécuter une sauvegarde" -#~ msgid "could not read file \"%s\", read %d of %u: %m" -#~ msgstr "n'a pas pu lire le fichier « %s », a lu %d sur %u : %m" +#~ msgid "must be superuser to COPY to or from a file" +#~ msgstr "doit être super-utilisateur pour utiliser COPY à partir ou vers un fichier" -#~ msgid "could not read file \"%s\", read %d of %d: %m" -#~ msgstr "n'a pas pu lire le fichier « %s », lu %d sur %d : %m" +#~ msgid "must be superuser to alter replication users" +#~ msgstr "doit être super-utilisateur pour modifier des utilisateurs ayant l'attribut réplication" -#~ msgid "replication identifier %d is already active for PID %d" -#~ msgstr "l'identificateur de réplication %d est déjà actif pour le PID %d" +#~ msgid "must be superuser to comment on procedural language" +#~ msgstr "" +#~ "doit être super-utilisateur pour ajouter un commentaire sur un langage de\n" +#~ "procédures" -#~ msgid "could not stat control file \"%s\": %m" -#~ msgstr "n'a pas pu récupérer des informations sur le fichier de contrôle « %s » : %m" +#~ msgid "must be superuser to comment on text search parser" +#~ msgstr "" +#~ "doit être super-utilisateur pour ajouter un commentaire sur l'analyseur de\n" +#~ "recherche plein texte" -#~ msgid "%s (PID %d) was terminated by signal %d" -#~ msgstr "%s (PID %d) a été arrêté par le signal %d" +#~ msgid "must be superuser to comment on text search template" +#~ msgstr "" +#~ "doit être super-utilisateur pour ajouter un commentaire sur un modèle de\n" +#~ "recherche plein texte" -#~ msgid "pg_ident.conf was not reloaded" -#~ msgstr "pg_ident.conf n'a pas été rechargé" +#~ msgid "must be superuser to control recovery" +#~ msgstr "doit être super-utilisateur pour contrôler la restauration" -#~ msgid "archive command was terminated by signal %d" -#~ msgstr "la commande d'archivage a été terminée par le signal %d" +#~ msgid "must be superuser to create a restore point" +#~ msgstr "doit être super-utilisateur pour créer un point de restauration" -#~ msgid "Try putting the literal value in single quotes." -#~ msgstr "Placer la valeur littérale en guillemets simples." +#~ msgid "must be superuser to create procedural language \"%s\"" +#~ msgstr "doit être super-utilisateur pour créer le langage de procédures « %s »" -#~ msgid "The cast requires a non-immutable conversion." -#~ msgstr "Cette conversion requiert une conversion non immutable." +#~ msgid "must be superuser to drop access methods" +#~ msgstr "doit être super-utilisateur pour supprimer des méthodes d'accès" -#~ msgid "DROP ASSERTION is not yet implemented" -#~ msgstr "DROP ASSERTION n'est pas encore implémenté" +#~ msgid "must be superuser to drop text search parsers" +#~ msgstr "" +#~ "doit être super-utilisateur pour supprimer des analyseurs de recherche plein\n" +#~ "texte" -#~ msgid "tuple to be updated was already moved to another partition due to concurrent update" -#~ msgstr "la ligne à mettre à jour était déjà déplacée vers une autre partition du fait d'une mise à jour concurrente, nouvelle tentative" +#~ msgid "must be superuser to drop text search templates" +#~ msgstr "doit être super-utilisateur pour supprimer des modèles de recherche plein texte" -#~ msgid "tuple to be deleted was already moved to another partition due to concurrent update" -#~ msgstr "la ligne à supprimer était déjà déplacée vers une autre partition du fait d'une mise à jour concurrente" +#~ msgid "must be superuser to get directory listings" +#~ msgstr "doit être super-utilisateur pour obtenir le contenu du répertoire" -#~ msgid "logical replication target relation \"%s.%s\" is not a table" -#~ msgstr "la relation cible de la réplication logique « %s.%s » n'est pas une table" +#~ msgid "must be superuser to get file information" +#~ msgstr "doit être super-utilisateur pour obtenir des informations sur le fichier" -#~ msgid "relation \"%s\" page %u is uninitialized --- fixing" -#~ msgstr "relation « %s » : la page %u n'est pas initialisée --- correction en cours" +#~ msgid "must be superuser to rename text search parsers" +#~ msgstr "" +#~ "doit être super-utilisateur pour renommer les analyseurs de recherche plein\n" +#~ "texte" -#~ msgid "cannot attach table \"%s\" with OIDs as partition of table \"%s\" without OIDs" -#~ msgstr "ne peut pas attacher la table « %s » avec OID comme partition de la table « %s » sans OID" +#~ msgid "must be superuser to rename text search templates" +#~ msgstr "doit être super-utilisateur pour renommer les modèles de recherche plein texte" -#~ msgid "cannot attach table \"%s\" without OIDs as partition of table \"%s\" with OIDs" -#~ msgstr "ne peut pas attacher la table « %s » sans OID comme partition de la table « %s » avec OID" +#~ msgid "must be superuser to reset statistics counters" +#~ msgstr "doit être super-utilisateur pour réinitialiser les compteurs statistiques" -#~ msgid "data type %s has no default btree operator class" -#~ msgstr "le type de données %s n'a pas de classe d'opérateurs btree par défaut" +#~ msgid "must be superuser to signal the postmaster" +#~ msgstr "doit être super-utilisateur pour envoyer un signal au postmaster" -#~ msgid "data type %s has no default hash operator class" -#~ msgstr "le type de données %s n'a pas de classe d'opérateurs hash par défaut" +#~ msgid "must be superuser to switch transaction log files" +#~ msgstr "doit être super-utilisateur pour changer de journal de transactions" -#~ msgid "table \"%s\" without OIDs cannot inherit from table \"%s\" with OIDs" -#~ msgstr "la table « %s » qui n'a pas d'OID ne peut pas hériter de la table « %s » qui en a" +#~ msgid "must be superuser to use server-side lo_export()" +#~ msgstr "doit être super-utilisateur pour utiliser lo_export() du côté serveur" -#~ msgid "cannot alter type of column referenced in partition key expression" -#~ msgstr "ne peut pas utiliser le type d'une colonne référencée dans l'expression d'une clé de partitionnement" +#~ msgid "must be superuser to use server-side lo_import()" +#~ msgstr "doit être super-utilisateur pour utiliser lo_import() du côté serveur" -#~ msgid "cannot alter type of column named in partition key" -#~ msgstr "ne peut pas modifier le type d'une colonne nommée dans une clé de partitionnement" +#~ msgid "must call json_populate_recordset on an array of objects" +#~ msgstr "doit appeler json_populate_recordset sur un tableau d'objets" -#~ msgid "cannot reference partitioned table \"%s\"" -#~ msgstr "ne peut pas référencer la table partitionnée « %s »" +#~ msgid "neither input type is an array" +#~ msgstr "aucun type de données n'est un tableau" -#~ msgid "cannot drop column named in partition key" -#~ msgstr "ne peut pas supprimer une colonne nommée dans une clé de partitionnement" +#~ msgid "next MultiXactId: %u; next MultiXactOffset: %u" +#~ msgstr "prochain MultiXactId : %u ; prochain MultiXactOffset : %u" -#~ msgid "child table \"%s\" has a conflicting \"%s\" column" -#~ msgstr "la table fille « %s » a une colonne conflictuelle, « %s »" +#~ msgid "next transaction ID: %u/%u; next OID: %u" +#~ msgstr "prochain identifiant de transaction : %u/%u ; prochain OID : %u" -#~ msgid "cannot create table with OIDs as partition of table without OIDs" -#~ msgstr "ne peut pas créer une table avec OID comme partition d'une table sans OID" +#~ msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\"" +#~ msgstr "" +#~ "aucune entrée dans pg_hba.conf pour l'hôte « %s », utilisateur « %s »,\n" +#~ "base de données « %s »" -#~ msgid "subscription with slot_name = NONE must also set create_slot = false" -#~ msgstr "la souscription avec slot_name = NONE doit aussi être configurée avec create_slot = false" +#~ msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\"" +#~ msgstr "" +#~ "aucune entrée dans pg_hba.conf pour la connexion de la réplication à partir de\n" +#~ "l'hôte « %s », utilisateur « %s »" -#~ msgid "slot_name = NONE and create_slot = true are mutually exclusive options" -#~ msgstr "slot_name = NONE et create_slot = true sont des options mutuellement exclusives" +#~ msgid "no such savepoint" +#~ msgstr "aucun point de sauvegarde" -#~ msgid "slot_name = NONE and enabled = true are mutually exclusive options" -#~ msgstr "slot_name = NONE et enabled = true sont des options mutuellement exclusives" +#~ msgid "not enough data in file \"%s\"" +#~ msgstr "données insuffisantes dans le fichier « %s »" -#~ msgid "connect = false and copy_data = true are mutually exclusive options" -#~ msgstr "connect = false et copy_data = true sont des options mutuellement exclusives" +#~ msgid "not enough shared memory for background writer" +#~ msgstr "pas assez de mémoire partagée pour le processus d'écriture en tâche de fond" -#~ msgid "connect = false and create_slot = true are mutually exclusive options" -#~ msgstr "connect = false et create_slot = true sont des options mutuellement exclusives" +#~ msgid "not enough shared memory for elements of data structure \"%s\" (%zu bytes requested)" +#~ msgstr "" +#~ "pas assez de mémoire partagée pour les éléments de la structure de données\n" +#~ "« %s » (%zu octets demandés)" -#~ msgid "\"%s\" is not a table or a view" -#~ msgstr "« %s » n'est pas une table ou une vue" +#~ msgid "not enough shared memory for walreceiver" +#~ msgstr "" +#~ "pas assez de mémoire partagée pour le processus de réception des journaux de\n" +#~ "transactions" -#~ msgid "server does not exist, skipping" -#~ msgstr "le serveur n'existe pas, poursuite du traitement" +#~ msgid "not enough shared memory for walsender" +#~ msgstr "pas assez de mémoire partagée pour le processus d'envoi des journaux de transactions" -#~ msgid "invalid OID in COPY data" -#~ msgstr "OID invalide dans les données du COPY" +#~ msgid "not unique \"S\"" +#~ msgstr "« S » non unique" #~ msgid "null OID in COPY data" #~ msgstr "OID NULL dans les données du COPY" -#~ msgid "missing data for OID column" -#~ msgstr "données manquantes pour la colonne OID" +#~ msgid "number of distinct values %g is too low" +#~ msgstr "le nombre de valeurs distinctes %g est trop basse" -#~ msgid "table \"%s\" does not have OIDs" -#~ msgstr "la table « %s » n'a pas d'OID" +#~ msgid "number of page slots needed (%.0f) exceeds max_fsm_pages (%d)" +#~ msgstr "le nombre d'emplacements de pages nécessaires (%.0f) dépasse max_fsm_pages (%d)" -#~ msgid "shared tables cannot be toasted after initdb" -#~ msgstr "" -#~ "les tables partagées ne peuvent pas avoir une table TOAST après la commande\n" -#~ "initdb" +#~ msgid "off" +#~ msgstr "désactivé" -#~ msgid "pg_walfile_name() cannot be executed during recovery." -#~ msgstr "pg_walfile_name() ne peut pas être exécuté lors de la restauration." +#~ msgid "oldest MultiXactId member is at offset %u" +#~ msgstr "le membre le plus ancien du MultiXactId est au décalage %u" -#~ msgid "pg_walfile_name_offset() cannot be executed during recovery." -#~ msgstr "pg_walfile_name_offset() ne peut pas être exécuté lors de la restauration." +#~ msgid "oldest unfrozen transaction ID: %u, in database %u" +#~ msgstr "" +#~ "identifiant de transaction non gelé le plus ancien : %u, dans la base de\n" +#~ "données %u" -#~ msgid "could not fdatasync log file %s: %m" -#~ msgstr "n'a pas pu synchroniser sur disque (fdatasync) le journal de transactions %s : %m" +#~ msgid "on" +#~ msgstr "activé" -#~ msgid "could not fsync log file %s: %m" -#~ msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier de transactions « %s » : %m" +#~ msgid "only simple column references and expressions are allowed in CREATE STATISTICS" +#~ msgstr "seules des références et expressions à une seule colonne sont acceptées dans CREATE STATISTICS" -#~ msgid "could not fsync log segment %s: %m" -#~ msgstr "n'a pas pu synchroniser sur disque (fsync) le segment du journal des transactions %s : %m" +#~ msgid "only superusers can query or manipulate replication origins" +#~ msgstr "seuls les super-utilisateurs peuvent lire ou manipuler les origines de réplication" -#~ msgid "If you are not restoring from a backup, try removing the file \"%s/backup_label\"." +#~ msgid "op ANY/ALL (array) does not support set arguments" #~ msgstr "" -#~ "Si vous n'avez pas pu restaurer une sauvegarde, essayez de supprimer le\n" -#~ "fichier « %s/backup_label »." +#~ "l'opérateur ANY/ALL (pour les types array) ne supporte pas les arguments\n" +#~ "d'ensemble" + +#~ msgid "operator precedence change: %s is now lower precedence than %s" +#~ msgstr "la précédence d'opérateur change : %s a maintenant une précédence inférieure à %s" + +#~ msgid "operator procedure must be specified" +#~ msgstr "la procédure de l'opérateur doit être spécifiée" -#~ msgid "unrecognized recovery parameter \"%s\"" -#~ msgstr "paramètre de restauration « %s » non reconnu" +#~ msgid "overflow of destination buffer in hex encoding" +#~ msgstr "Calcule les identifiants de requête" + +#~ msgid "parameter \"%s\" requires a numeric value" +#~ msgstr "le paramètre « %s » requiert une valeur numérique" #~ msgid "parameter \"%s\" requires a temporal value" #~ msgstr "le paramètre « %s » requiert une valeur temporelle" -#~ msgid "recovery_target_time is not a valid timestamp: \"%s\"" -#~ msgstr "recovery_target_timeline n'est pas un horodatage valide : « %s »" +#~ msgid "parameter \"recovery_target_inclusive\" requires a Boolean value" +#~ msgstr "le paramètre « recovery_target_inclusive » requiert une valeur booléenne" -#~ msgid "recovery_target_xid is not a valid number: \"%s\"" -#~ msgstr "recovery_target_xid n'est pas un nombre valide : « %s »" +#~ msgid "parameter \"standby_mode\" requires a Boolean value" +#~ msgstr "le paramètre « standby_mode » requiert une valeur booléenne" -#~ msgid "Valid values are \"pause\", \"promote\", and \"shutdown\"." -#~ msgstr "Les valeurs valides sont « pause », « promote » et « shutdown »." +#~ msgid "parse %s: %s" +#~ msgstr "analyse %s : %s" -#~ msgid "invalid value for recovery parameter \"%s\": \"%s\"" -#~ msgstr "valeur invalide pour le paramètre de restauration « %s » : « %s »" +#~ msgid "parser stack overflow" +#~ msgstr "saturation de la pile de l'analyseur" -#~ msgid "could not open recovery command file \"%s\": %m" -#~ msgstr "n'a pas pu ouvrir le fichier de restauration « %s » : %m" +#~ msgid "partition constraint for table \"%s\" is implied by existing constraints" +#~ msgstr "la contrainte de partitionnement pour la table « %s » provient des contraintes existantes" -#~ msgid "could not read from control file: read %d bytes, expected %d" -#~ msgstr "n'a pas pu lire le fichier de contrôle : lu %d octets, %d attendus" +#~ msgid "partition key expressions cannot contain whole-row references" +#~ msgstr "les expressions de clé de partitionnement ne peuvent pas contenir des références à des lignes complètes" -#~ msgid "could not read from control file: %m" -#~ msgstr "n'a pas pu lire le fichier de contrôle : %m" +#~ msgid "password too long" +#~ msgstr "mot de passe trop long" -#~ msgid "could not open control file \"%s\": %m" -#~ msgstr "n'a pas pu ouvrir le fichier de contrôle « %s » : %m" +#~ msgid "pclose failed: %m" +#~ msgstr "échec de pclose : %m" -#~ msgid "could not close control file: %m" -#~ msgstr "n'a pas pu fermer le fichier de contrôle : %m" +#~ msgid "permission denied to drop foreign-data wrapper \"%s\"" +#~ msgstr "droit refusé pour supprimer le wrapper de données distantes « %s »" -#~ msgid "could not fsync control file: %m" -#~ msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier de contrôle : %m" +#~ msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\"" +#~ msgstr "" +#~ "pg_hba.conf rejette la connexion pour l'hôte « %s », utilisateur « %s », base\n" +#~ "de données « %s »" -#~ msgid "could not write to control file: %m" -#~ msgstr "n'a pas pu écrire le fichier de contrôle : %m" +#~ msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\"" +#~ msgstr "" +#~ "pg_hba.conf rejette la connexion de la réplication pour l'hôte « %s »,\n" +#~ "utilisateur « %s »" -#~ msgid "could not create control file \"%s\": %m" -#~ msgstr "n'a pas pu créer le fichier de contrôle « %s » : %m" +#~ msgid "pg_ident.conf was not reloaded" +#~ msgstr "pg_ident.conf n'a pas été rechargé" -#~ msgid "could not rename old write-ahead log file \"%s\": %m" -#~ msgstr "n'a pas pu renommer l'ancien journal de transactions « %s » : %m" +#~ msgid "pg_walfile_name() cannot be executed during recovery." +#~ msgstr "pg_walfile_name() ne peut pas être exécuté lors de la restauration." -#~ msgid "could not close log file %s: %m" -#~ msgstr "n'a pas pu fermer le fichier de transactions « %s » : %m" +#~ msgid "pg_walfile_name_offset() cannot be executed during recovery." +#~ msgstr "pg_walfile_name_offset() ne peut pas être exécuté lors de la restauration." -#~ msgid "could not open write-ahead log file \"%s\": %m" -#~ msgstr "n'a pas pu écrire dans le journal de transactions « %s » : %m" +#~ msgid "poll() failed in statistics collector: %m" +#~ msgstr "échec du poll() dans le récupérateur de statistiques : %m" -#~ msgid "not enough data in file \"%s\"" -#~ msgstr "données insuffisantes dans le fichier « %s »" +#~ msgid "poll() failed: %m" +#~ msgstr "échec de poll() : %m" -#~ msgid "could not seek in log file %s to offset %u: %m" -#~ msgstr "n'a pas pu se déplacer dans le fichier de transactions « %s » au décalage %u : %m" +#~ msgid "postmaster became multithreaded" +#~ msgstr "le postmaster est devenu multithreadé" -#~ msgid "cannot PREPARE a transaction that has operated on temporary tables" -#~ msgstr "" -#~ "ne peut pas préparer (PREPARE) une transaction qui a travaillé sur des\n" -#~ "tables temporaires" +#~ msgid "procedure number %d for (%s,%s) appears more than once" +#~ msgstr "le numéro de procédure %d pour (%s, %s) apparaît plus d'une fois" -#~ msgid "could not close two-phase state file: %m" -#~ msgstr "n'a pas pu fermer le fichier d'état de la validation en deux phases : %m" +#~ msgid "procedures cannot have OUT arguments" +#~ msgstr "les procédures ne peuvent pas avoir d'argument OUT" -#~ msgid "could not fsync two-phase state file: %m" +#~ msgid "query requires full scan, which is not supported by GIN indexes" #~ msgstr "" -#~ "n'a pas pu synchroniser sur disque (fsync) le fichier d'état de la\n" -#~ "validation en deux phases : %m" +#~ "la requête nécessite un parcours complet, ce qui n'est pas supporté par les\n" +#~ "index GIN" -#~ msgid "could not write two-phase state file: %m" -#~ msgstr "n'a pas pu écrire dans le fichier d'état de la validation en deux phases : %m" +#~ msgid "received password packet" +#~ msgstr "paquet du mot de passe reçu" -#~ msgid "could not recreate two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu re-créer le fichier d'état de la validation en deux phases nommé\n" -#~ "« %s » : %m" +#~ msgid "record with zero length at %X/%X" +#~ msgstr "enregistrement de longueur nulle à %X/%X" -#~ msgid "could not remove two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu supprimer le fichier d'état de la validation en deux phases\n" -#~ "« %s » : %m" +#~ msgid "recovery is still in progress, can't accept WAL streaming connections" +#~ msgstr "la restauration est en cours, ne peut pas accepter les connexions de flux WAL" -#~ msgid "could not read two-phase state file \"%s\": %m" +#~ msgid "recovery restart point at %X/%X with latest known log time %s" #~ msgstr "" -#~ "n'a pas pu lire le fichier d'état de la validation en deux phases nommé\n" -#~ "« %s » : %m" +#~ "point de relancement de la restauration sur %X/%X avec %s comme dernière\n" +#~ "date connue du journal" -#~ msgid "could not stat two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu récupérer des informations sur le fichier d'état de la validation\n" -#~ "en deux phases nommé « %s » : %m" +#~ msgid "recovery_target_time is not a valid timestamp: \"%s\"" +#~ msgstr "recovery_target_timeline n'est pas un horodatage valide : « %s »" -#~ msgid "could not open two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu ouvrir le fichier d'état de la validation en deux phases nommé\n" -#~ "« %s » : %m" +#~ msgid "recovery_target_xid is not a valid number: \"%s\"" +#~ msgstr "recovery_target_xid n'est pas un nombre valide : « %s »" -#~ msgid "unrecognized error %d" -#~ msgstr "erreur %d non reconnue" +#~ msgid "recycled write-ahead log file \"%s\"" +#~ msgstr "recyclage du journal de transactions « %s »" -#~ msgid "child process was terminated by signal %d" -#~ msgstr "le processus fils a été terminé par le signal %d" +#~ msgid "redo record is at %X/%X; shutdown %s" +#~ msgstr "l'enregistrement à ré-exécuter se trouve à %X/%X ; arrêt %s" -#~ msgid "child process was terminated by signal %s" -#~ msgstr "le processus fils a été terminé par le signal %s" +#~ msgid "redo starts at %X/%X, consistency will be reached at %X/%X" +#~ msgstr "la restauration comme à %X/%X, la cohérence sera atteinte à %X/%X" -#~ msgid "could not remove file or directory \"%s\": %s\n" -#~ msgstr "n'a pas pu supprimer le fichier ou répertoire « %s » : %s\n" +#~ msgid "regexp_split_to_array does not support the global option" +#~ msgstr "regexp_split_to_array ne supporte pas l'option globale" -#~ msgid "could not stat file or directory \"%s\": %s\n" +#~ msgid "regexp_split_to_table does not support the global option" +#~ msgstr "regexp_split_to_table ne supporte pas l'option globale" + +#~ msgid "registering background worker \"%s\"" +#~ msgstr "enregistrement du processus en tâche de fond « %s »" + +#~ msgid "relation \"%s\" TID %u/%u: DeleteTransactionInProgress %u --- cannot shrink relation" #~ msgstr "" -#~ "n'a pas pu récupérer les informations sur le fichier ou répertoire\n" -#~ "« %s » : %s\n" +#~ "relation « %s », TID %u/%u : DeleteTransactionInProgress %u --- n'a pas pu\n" +#~ "diminuer la taille de la relation" -#~ msgid "%s: could not get exit code from subprocess: error code %lu\n" -#~ msgstr "%s : n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu\n" +#~ msgid "relation \"%s\" TID %u/%u: InsertTransactionInProgress %u --- cannot shrink relation" +#~ msgstr "" +#~ "relation « %s », TID %u/%u : InsertTransactionInProgress %u --- n'a pas pu\n" +#~ "diminuer la taille de la relation" -#~ msgid "%s: could not re-execute with restricted token: error code %lu\n" -#~ msgstr "%s : n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu\n" +#~ msgid "relation \"%s\" TID %u/%u: XMIN_COMMITTED not set for transaction %u --- cannot shrink relation" +#~ msgstr "" +#~ "relation « %s », TID %u/%u : XMIN_COMMITTED non configuré pour la\n" +#~ "transaction %u --- n'a pas pu diminuer la taille de la relation" -#~ msgid "%s: could not start process for command \"%s\": error code %lu\n" -#~ msgstr "%s : n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu\n" +#~ msgid "relation \"%s\" TID %u/%u: dead HOT-updated tuple --- cannot shrink relation" +#~ msgstr "" +#~ "relation « %s », TID %u/%u : ligne morte mise à jour par HOT --- n'a pas pu\n" +#~ "diminuer la taille de la relation" -#~ msgid "%s: could not create restricted token: error code %lu\n" -#~ msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n" +#~ msgid "relation \"%s\" page %u is uninitialized --- fixing" +#~ msgstr "relation « %s » : la page %u n'est pas initialisée --- correction en cours" -#~ msgid "%s: could not allocate SIDs: error code %lu\n" -#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n" +#~ msgid "relation \"%s.%s\" contains more than \"max_fsm_pages\" pages with useful free space" +#~ msgstr "" +#~ "la relation « %s.%s » contient plus de « max_fsm_pages » pages d'espace\n" +#~ "libre utile" -#~ msgid "%s: could not open process token: error code %lu\n" -#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n" +#~ msgid "relation \"pg_statistic\" does not have a composite type" +#~ msgstr "la relation « pg_statistic » n'a pas un type composite" -#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n" -#~ msgstr "%s : ATTENTION : ne peut pas créer les jetons restreints sur cette plateforme\n" +#~ msgid "removed subscription for table %s.%s" +#~ msgstr "a supprimé une souscription pour la table %s.%s" -#~ msgid "could not close directory \"%s\": %s\n" -#~ msgstr "n'a pas pu fermer le répertoire « %s » : %s\n" +#~ msgid "removing built-in function \"%s\"" +#~ msgstr "suppression de la fonction interne « %s »" -#~ msgid "could not read directory \"%s\": %s\n" -#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n" +#~ msgid "removing file \"%s\"" +#~ msgstr "suppression du fichier « %s »" -#~ msgid "could not open directory \"%s\": %s\n" -#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s\n" +#~ msgid "removing transaction log backup history file \"%s\"" +#~ msgstr "suppression du fichier historique des journaux de transaction « %s »" -#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu renommer le fichier « %s » en « %s » : %s\n" +#~ msgid "removing write-ahead log file \"%s\"" +#~ msgstr "suppression du journal de transactions « %s »" -#~ msgid "%s: could not fsync file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n" +#~ msgid "replication connection authorized: user=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" +#~ msgstr "connexion autorisée : utilisateur=%s, SSL activé (protocole=%s, chiffrement=%s, bits=%d, compression=%s)" -#~ msgid "%s: could not open file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" +#~ msgid "replication connection authorized: user=%s application_name=%s" +#~ msgstr "connexion de réplication autorisée : utilisateur=%s nom d'application=%s" -#~ msgid "%s: could not read directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n" +#~ msgid "replication connection authorized: user=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" +#~ msgstr "connexion de réplication autorisée : utilisateur=%s, nom d'application=%s, SSL activé (protocole=%s, chiffrement=%s, bits=%d, compression=%s)" -#~ msgid "%s: could not open directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n" +#~ msgid "replication identifier %d is already active for PID %d" +#~ msgstr "l'identificateur de réplication %d est déjà actif pour le PID %d" -#~ msgid "%s: could not stat file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n" +#~ msgid "replication origin %d is already active for PID %d" +#~ msgstr "l'origine de réplication %d est déjà active pour le PID %d" -#~ msgid "could not read symbolic link \"%s\"" -#~ msgstr "n'a pas pu lire le lien symbolique « %s »" +#~ msgid "resetting unlogged relations: cleanup %d init %d" +#~ msgstr "réinitialisation des relations non tracées : nettoyage %d initialisation %d" -#~ msgid "could not change directory to \"%s\": %s" -#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s" +#~ msgid "restartpoint_command = '%s'" +#~ msgstr "restartpoint_command = '%s'" -#~ msgid "could not identify current directory: %s" -#~ msgstr "n'a pas pu identifier le répertoire courant : %s" +#~ msgid "rewriting table \"%s\"" +#~ msgstr "ré-écriture de la table « %s »" -#~ msgid "" -#~ "WARNING: possible byte ordering mismatch\n" -#~ "The byte ordering used to store the pg_control file might not match the one\n" -#~ "used by this program. In that case the results below would be incorrect, and\n" -#~ "the PostgreSQL installation would be incompatible with this data directory.\n" -#~ msgstr "" -#~ "ATTENTION : possible incohérence dans l'ordre des octets\n" -#~ "L'ordre des octets utilisé pour enregistrer le fichier pg_control peut ne\n" -#~ "pas correspondre à celui utilisé par ce programme. Dans ce cas, les\n" -#~ "résultats ci-dessous sont incorrects, et l'installation PostgreSQL\n" -#~ "incompatible avec ce répertoire des données.\n" +#~ msgid "role \"%s\" could not be removed from policy \"%s\" on \"%s\"" +#~ msgstr "le rôle « %s » n'a pas pu être supprimé de la politique « %s » sur « %s »" + +#~ msgid "role \"%s\" is reserved" +#~ msgstr "le rôle « %s » est réservé" + +#~ msgid "role name cannot be qualified" +#~ msgstr "le nom du rôle ne peut pas être qualifié" + +#~ msgid "rule \"%s\" does not exist" +#~ msgstr "la règle « %s » n'existe pas" -#~ msgid "%s: could not read file \"%s\": read %d of %d\n" -#~ msgstr "%s : n'a pas pu lire le fichier « %s » : a lu %d sur %d\n" +#~ msgid "scanned index \"%s\" to remove %d row versions by parallel vacuum worker" +#~ msgstr "a parcouru l'index « %s » pour supprimer %d versions de lignes par le worker parallélisé du VACUUM" -#~ msgid "could not read file \"%s\": read %d of %d" -#~ msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %d" +#~ msgid "schema name cannot be qualified" +#~ msgstr "le nom du schéma ne peut pas être qualifié" -#~ msgid "%s: could not read file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire le fichier « %s » : %s\n" +#~ msgid "select() failed in logger process: %m" +#~ msgstr "échec de select() dans le processus des journaux applicatifs : %m" -#~ msgid "%s: could not open file \"%s\" for reading: %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n" +#~ msgid "select() failed: %m" +#~ msgstr "échec de select() : %m" -#~ msgid "insufficient columns in %s constraint definition" -#~ msgstr "colonnes infuffisantes dans la définition de contrainte de %s" +#~ msgid "sending cancel to blocking autovacuum PID %d" +#~ msgstr "envoi de l'annulation pour bloquer le PID %d de l'autovacuum" -#~ msgid "cannot reindex invalid index on TOAST table concurrently" -#~ msgstr "ne peut pas réindexer un index invalide sur une table TOAST de manière concurrente" +#~ msgid "server does not exist, skipping" +#~ msgstr "le serveur n'existe pas, poursuite du traitement" -#~ msgid "index \"%s\" now contains %.0f row versions in %u pages as reported by parallel vacuum worker" -#~ msgstr "l'index « %s » contient maintenant %.0f versions de lignes dans %u pages, comme indiqué par le worker parallélisé du VACUUM" +#~ msgid "server name cannot be qualified" +#~ msgstr "le nom du serveur ne peut pas être qualifié" -#~ msgid "scanned index \"%s\" to remove %d row versions by parallel vacuum worker" -#~ msgstr "a parcouru l'index « %s » pour supprimer %d versions de lignes par le worker parallélisé du VACUUM" +#~ msgid "setsockopt(SO_REUSEADDR) failed for %s address \"%s\": %m" +#~ msgstr "setsockopt(SO_REUSEADDR) a échoué pour %s, adresse « %s » : %m" -#~ msgid "moving row to another partition during a BEFORE trigger is not supported" -#~ msgstr "déplacer une ligne vers une autre partition lors de l'exécution d'un trigger BEFORE n'est pas supporté" +#~ msgid "shared index \"%s\" can only be reindexed in stand-alone mode" +#~ msgstr "un index partagé « %s » peut seulement être réindexé en mode autonome" -#~ msgid "Number of tuple inserts prior to index cleanup as a fraction of reltuples." -#~ msgstr "" -#~ "Nombre de lignes insérées avant d'effectuer un nettoyage des index\n" -#~ "(fraction de reltuples)." +#~ msgid "shared table \"%s\" can only be reindexed in stand-alone mode" +#~ msgstr "la table partagée « %s » peut seulement être réindexé en mode autonome" -#~ msgid "Emit a warning for constructs that changed meaning since PostgreSQL 9.4." -#~ msgstr "Émet un avertissement pour les constructions dont la signification a changé depuis PostgreSQL 9.4." +#~ msgid "shared tables cannot be toasted after initdb" +#~ msgstr "" +#~ "les tables partagées ne peuvent pas avoir une table TOAST après la commande\n" +#~ "initdb" -#~ msgid "on" -#~ msgstr "activé" +#~ msgid "shutdown requested, aborting active base backup" +#~ msgstr "arrêt demandé, annulation de la sauvegarde active de base" -#~ msgid "off" -#~ msgstr "désactivé" +#~ msgid "skipping redundant vacuum to prevent wraparound of table \"%s.%s.%s\"" +#~ msgstr "ignore un VACUUM redondant pour éviter le rebouclage des identifiants dans la table \"%s.%s.%s\"" -#~ msgid "loaded library \"%s\"" -#~ msgstr "bibliothèque « %s » chargée" +#~ msgid "skipping restartpoint, already performed at %X/%X" +#~ msgstr "ignore le point de redémarrage, déjà réalisé à %X/%X" -#~ msgid "wrong data type: %u, expected %u" -#~ msgstr "mauvais type de données : %u, alors que %u attendu" +#~ msgid "skipping restartpoint, recovery has already ended" +#~ msgstr "restartpoint ignoré, la récupération est déjà terminée" -#~ msgid "wrong element type" -#~ msgstr "mauvais type d'élément" +#~ msgid "slot_name = NONE and create_slot = true are mutually exclusive options" +#~ msgstr "slot_name = NONE et create_slot = true sont des options mutuellement exclusives" -#~ msgid "logical replication launcher shutting down" -#~ msgstr "arrêt du processus de lancement de la réplication logique" +#~ msgid "slot_name = NONE and enabled = true are mutually exclusive options" +#~ msgstr "slot_name = NONE et enabled = true sont des options mutuellement exclusives" -#~ msgid "bind %s to %s" -#~ msgstr "lie %s à %s" +#~ msgid "socket not open" +#~ msgstr "socket non ouvert" -#~ msgid "parse %s: %s" -#~ msgstr "analyse %s : %s" +#, fuzzy +#~ msgid "sorry, too many standbys already" +#~ msgstr "désolé, trop de clients sont déjà connectés" -#~ msgid "unexpected EOF on client connection" -#~ msgstr "fin de fichier (EOF) inattendue de la connexion du client" +#~ msgid "spgist operator class \"%s\" is missing operator(s)" +#~ msgstr "il manque des opérateurs pour la classe d'opérateur spgist « %s »" -#~ msgid "could not fsync file \"%s\" but retrying: %m" +#~ msgid "spgist operator family \"%s\" contains function %s with invalid support number %d" #~ msgstr "" -#~ "n'a pas pu synchroniser sur disque (fsync) le fichier « %s », nouvelle\n" -#~ "tentative : %m" +#~ "la famille d'opérateur spgist « %s » contient la fonction %s\n" +#~ "avec le numéro de support %d invalide" -#~ msgid "could not forward fsync request because request queue is full" -#~ msgstr "n'a pas pu envoyer la requête fsync car la queue des requêtes est pleine" +#~ msgid "spgist operator family \"%s\" contains function %s with wrong signature for support number %d" +#~ msgstr "" +#~ "la famille d'opérateur spgist « %s » contient la fonction %s\n" +#~ "avec une mauvaise signature pour le numéro de support %d" -#~ msgid "sending cancel to blocking autovacuum PID %d" -#~ msgstr "envoi de l'annulation pour bloquer le PID %d de l'autovacuum" +#~ msgid "spgist operator family \"%s\" contains invalid ORDER BY specification for operator %s" +#~ msgstr "" +#~ "la famille d'opérateur spgist « %s » contient une spécification\n" +#~ "ORDER BY invalide pour l'opérateur %s" -#~ msgid "Process %d waits for %s on %s." -#~ msgstr "Le processus %d attend %s sur %s." +#~ msgid "spgist operator family \"%s\" contains operator %s with invalid strategy number %d" +#~ msgstr "" +#~ "la famille d'opérateur spgist « %s » contient l'opérateur %s\n" +#~ "avec le numéro de stratégie invalide %d" -#~ msgid "deferrable snapshot was unsafe; trying a new one" -#~ msgstr "l'image déferrable est non sûre ; tentative avec une nouvelle image" +#~ msgid "spgist operator family \"%s\" contains operator %s with wrong signature" +#~ msgstr "la famille d'opérateur spgist « %s » contient l'opérateur %s avec une mauvaise signature" -#~ msgid "%s failed: %m" -#~ msgstr "échec de %s : %m" +#~ msgid "spgist operator family \"%s\" contains support procedure %s with cross-type registration" +#~ msgstr "" +#~ "la famille d'opérateur spgist « %s » contient la procédure de support\n" +#~ "%s avec un enregistrement inter-type" -#~ msgid "\"%s\" has now caught up with upstream server" -#~ msgstr "« %s » a maintenant rattrapé le serveur en amont" +#~ msgid "spgist operator family \"%s\" is missing operator(s) for types %s and %s" +#~ msgstr "" +#~ "la famille d'opérateur spgist « %s » nécessite des opérateurs supplémentaires\n" +#~ "pour les types %s et %s" #~ msgid "standby \"%s\" now has synchronous standby priority %u" #~ msgstr "" #~ "le serveur « %s » en standby a maintenant une priorité %u en tant que standby\n" #~ "synchrone" -#~ msgid "logical replication apply worker for subscription \"%s\" will restart because subscription's publications were changed" -#~ msgstr "le processus apply de réplication logique pour la souscription « %s » redémarrera car les publications ont été modifiées" +#~ msgid "standby connections not allowed because wal_level=minimal" +#~ msgstr "connexions standby non autorisées car wal_level=minimal" -#~ msgid "logical replication apply worker for subscription \"%s\" will restart because the replication slot name was changed" -#~ msgstr "le processus apply de réplication logique pour la souscription « %s » redémarrera car le nom du slot de réplication a été modifiée" +#~ msgid "starting background worker process \"%s\"" +#~ msgstr "démarrage du processus d'écriture en tâche de fond « %s »" -#~ msgid "logical replication apply worker for subscription \"%s\" will restart because the connection information was changed" -#~ msgstr "le processus apply de réplication logique pour la souscription « %s » redémarrera car la souscription a été modifiée" +#~ msgid "starting logical replication worker for subscription \"%s\"" +#~ msgstr "lancement du processus worker de réplication logique pour la souscription « %s »" -#~ msgid "could not fetch table info for table \"%s.%s\": %s" -#~ msgstr "n'a pas pu récupérer les informations sur la table « %s.%s » : %s" +#~ msgid "streaming replication successfully connected to primary" +#~ msgstr "réplication de flux connecté avec succès au serveur principal" -#~ msgid "only superusers can query or manipulate replication origins" -#~ msgstr "seuls les super-utilisateurs peuvent lire ou manipuler les origines de réplication" +#~ msgid "subquery cannot have SELECT INTO" +#~ msgstr "la sous-requête ne peut pas avoir de SELECT INTO" -#~ msgid "logical replication launcher started" -#~ msgstr "lancement du processus de lancement de la réplication logique" +#~ msgid "subquery in FROM cannot have SELECT INTO" +#~ msgstr "la sous-requête du FROM ne peut pas avoir de SELECT INTO" -#~ msgid "starting logical replication worker for subscription \"%s\"" -#~ msgstr "lancement du processus worker de réplication logique pour la souscription « %s »" +#~ msgid "subquery in FROM cannot refer to other relations of same query level" +#~ msgstr "" +#~ "la sous-requête du FROM ne peut pas faire référence à d'autres relations\n" +#~ "dans le même niveau de la requête" -#~ msgid "could not reread block %d of file \"%s\": %m" -#~ msgstr "n'a pas pu relire le bloc %d dans le fichier « %s » : %m" +#~ msgid "subquery in WITH cannot have SELECT INTO" +#~ msgstr "la sous-requête du WITH ne peut pas avoir de SELECT INTO" -#~ msgid "could not fseek in file \"%s\": %m" -#~ msgstr "n'a pas pu effectuer de fseek dans le fichier « %s » : %m" +#~ msgid "subquery must return a column" +#~ msgstr "la sous-requête doit renvoyer une colonne" -#~ msgid "could not read from file \"%s\"" -#~ msgstr "n'a pas pu lire à partir du fichier « %s »" +#~ msgid "subscription must contain at least one publication" +#~ msgstr "la souscription doit contenir au moins une publication" -#~ msgid "logger shutting down" -#~ msgstr "arrêt en cours des journaux applicatifs" +#~ msgid "subscription with slot_name = NONE must also set create_slot = false" +#~ msgstr "la souscription avec slot_name = NONE doit aussi être configurée avec create_slot = false" -#~ msgid "starting background worker process \"%s\"" -#~ msgstr "démarrage du processus d'écriture en tâche de fond « %s »" +#~ msgid "success" +#~ msgstr "succès" -#~ msgid "could not fork archiver: %m" -#~ msgstr "n'a pas pu lancer le processus fils correspondant au processus d'archivage : %m" +#~ msgid "syntax error in recovery command file: %s" +#~ msgstr "erreur de syntaxe dans le fichier de restauration : %s" -#~ msgid "compacted fsync request queue from %d entries to %d entries" -#~ msgstr "a compacté la queue de requêtes fsync de %d entrées à %d" +#~ msgid "syntax error: cannot back up" +#~ msgstr "erreur de syntaxe : n'a pas pu revenir" -#~ msgid "unregistering background worker \"%s\"" -#~ msgstr "désenregistrement du processus en tâche de fond « %s »" +#~ msgid "syntax error: unexpected character \"%s\"" +#~ msgstr "erreur de syntaxe : caractère « %s » inattendu" -#~ msgid "registering background worker \"%s\"" -#~ msgstr "enregistrement du processus en tâche de fond « %s »" +#~ msgid "syntax error; also virtual memory exhausted" +#~ msgstr "erreur de syntaxe ; de plus, mémoire virtuelle saturée" -#~ msgid "autovacuum: processing database \"%s\"" -#~ msgstr "autovacuum : traitement de la base de données « %s »" +#~ msgid "system columns cannot be used in an ON CONFLICT clause" +#~ msgstr "les colonnes systèmes ne peuvent pas être utilisées dans une clause ON CONFLICT" -#~ msgid "autovacuum launcher shutting down" -#~ msgstr "arrêt du processus de lancement de l'autovacuum" +#~ msgid "system usage: %s\n" +#~ msgstr "utilisation du système : %s\n" -#~ msgid "autovacuum launcher started" -#~ msgstr "démarrage du processus de lancement de l'autovacuum" +#~ msgid "table \"%s\" does not have OIDs" +#~ msgstr "la table « %s » n'a pas d'OID" -#~ msgid "disabling huge pages" -#~ msgstr "désactivation des Huge Pages" +#~ msgid "table \"%s\" has multiple constraints named \"%s\"" +#~ msgstr "la table « %s » a de nombreuses contraintes nommées « %s »" -#~ msgid "could not enable Lock Pages in Memory user right" -#~ msgstr "n'a pas pu activer le Lock Pages in Memory user right" +#~ msgid "table \"%s\" without OIDs cannot inherit from table \"%s\" with OIDs" +#~ msgstr "la table « %s » qui n'a pas d'OID ne peut pas hériter de la table « %s » qui en a" -#~ msgid "could not enable Lock Pages in Memory user right: error code %lu" -#~ msgstr "n'a pas pu activer le Lock Pages in Memory user right : code d'erreur %lu" +#~ msgid "table \"%s.%s\" added to subscription \"%s\"" +#~ msgstr "table « %s.%s » ajoutée à la souscription « %s »" -#~ msgid "collation of partition bound value for column \"%s\" does not match partition key collation \"%s\"" -#~ msgstr "le collationnement de la valeur limite de partition de la colonne « %s » ne correspond pas à celui de la clé de partition « %s »" +#~ msgid "table \"%s.%s\" removed from subscription \"%s\"" +#~ msgstr "table « %s.%s » supprimée de la souscription « %s »" -#~ msgid "could not determine which collation to use for partition bound expression" -#~ msgstr "n'a pas pu déterminer le collationnement à utiliser pour l'expression de limites de partitionnement" +#~ msgid "tablespace %u is not empty" +#~ msgstr "le tablespace %u n'est pas vide" -#~ msgid "%s will create implicit sequence \"%s\" for serial column \"%s.%s\"" -#~ msgstr "%s créera des séquences implicites « %s » pour la colonne serial « %s.%s »" +#~ msgid "tablespace name cannot be qualified" +#~ msgstr "le nom du tablespace ne peut pas être qualifié" -#~ msgid "array assignment requires type %s but expression is of type %s" -#~ msgstr "l'affectation de tableaux requiert le type %s mais l'expression est de type %s" +#~ msgid "terminating all walsender processes to force cascaded standby(s) to update timeline and reconnect" +#~ msgstr "" +#~ "arrêt de tous les processus walsender pour forcer les serveurs standby en\n" +#~ "cascade à mettre à jour la timeline et à se reconnecter" -#~ msgid "operator precedence change: %s is now lower precedence than %s" -#~ msgstr "la précédence d'opérateur change : %s a maintenant une précédence inférieure à %s" +#~ msgid "terminating walsender process to force cascaded standby to update timeline and reconnect" +#~ msgstr "" +#~ "arrêt du processus walreceiver pour forcer le serveur standby en cascade à\n" +#~ "mettre à jour la timeline et à se reconnecter" -#~ msgid " -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n" -#~ msgstr " -o OPTIONS passe « OPTIONS » à chaque processus serveur (obsolète)\n" +#~ msgid "there are multiple rules named \"%s\"" +#~ msgstr "il existe de nombreuses règles nommées « %s »" -#~ msgid "Is another postmaster already running on port %d? If not, remove socket file \"%s\" and retry." -#~ msgstr "Un autre postmaster fonctionne-t'il déjà sur le port %d ?Sinon, supprimez le fichier socket « %s » et réessayez." +#~ msgid "there are objects dependent on %s" +#~ msgstr "des objets dépendent de %s" -#~ msgid "setsockopt(SO_REUSEADDR) failed for %s address \"%s\": %m" -#~ msgstr "setsockopt(SO_REUSEADDR) a échoué pour %s, adresse « %s » : %m" +#~ msgid "there is no contrecord flag at %X/%X reading %X/%X" +#~ msgstr "il n'existe pas de drapeau contrecord à %X/%X en lisant %X/%X" -#~ msgid "authentication file line too long" -#~ msgstr "ligne du fichier d'authentification trop longue" +#~ msgid "there is no contrecord flag in log file %u, segment %u, offset %u" +#~ msgstr "" +#~ "il n'y a pas de drapeaux « contrecord » dans le journal de transactions %u,\n" +#~ "segment %u, décalage %u" -#~ msgid "SSL connection from \"%s\"" -#~ msgstr "connexion SSL de « %s »" +#~ msgid "time to inline: %.3fs, opt: %.3fs, emit: %.3fs" +#~ msgstr "temps pour inliner: %.3fs, opt: %.3fs, emit: %.3fs" -#~ msgid "SSPI is not supported in protocol version 2" -#~ msgstr "SSPI n'est pas supporté dans le protocole de version 2" +#~ msgid "time zone abbreviation \"%s\" is not used in time zone \"%s\"" +#~ msgstr "l'abréviation « %s » du fuseau horaire n'est pas utilisée dans le fuseau horaire « %s »" -#~ msgid "GSSAPI is not supported in protocol version 2" -#~ msgstr "GSSAPI n'est pas supporté dans le protocole de version 2" +#~ msgid "time zone offset %d is not a multiple of 900 sec (15 min) in time zone file \"%s\", line %d" +#~ msgstr "" +#~ "le décalage %d du fuseau horaire n'est pas un multiples de 900 secondes\n" +#~ "(15 minutes) dans le fichier des fuseaux horaires « %s », ligne %d" -#~ msgid "SASL authentication is not supported in protocol version 2" -#~ msgstr "l'authentification SASL n'est pas supportée dans le protocole de version 2" +#~ msgid "too few arguments for format" +#~ msgstr "trop peu d'arguments pour le format" -#~ msgid "SSL off" -#~ msgstr "SSL inactif" +#~ msgid "transaction ID " +#~ msgstr "ID de transaction " -#~ msgid "SSL on" -#~ msgstr "SSL actif" +#~ msgid "transaction ID wrap limit is %u, limited by database with OID %u" +#~ msgstr "" +#~ "la limite de réinitialisation de l'identifiant de transaction est %u,\n" +#~ "limité par la base de données d'OID %u" -#~ msgid "time to inline: %.3fs, opt: %.3fs, emit: %.3fs" -#~ msgstr "temps pour inliner: %.3fs, opt: %.3fs, emit: %.3fs" +#~ msgid "transaction is read-only" +#~ msgstr "la transaction est en lecture seule" -#~ msgid "must be superuser to alter replication users" -#~ msgstr "doit être super-utilisateur pour modifier des utilisateurs ayant l'attribut réplication" +#~ msgid "transaction log switch forced (archive_timeout=%d)" +#~ msgstr "changement forcé du journal de transaction (archive_timeout=%d)" -#~ msgid "updated partition constraint for default partition \"%s\" is implied by existing constraints" -#~ msgstr "la contrainte de partitionnement pour la partition par défaut « %s » est implicite du fait de contraintes existantes" +#~ msgid "transform expression must not return a set" +#~ msgstr "l'expression de transformation ne doit pas renvoyer un ensemble" -#~ msgid "partition constraint for table \"%s\" is implied by existing constraints" -#~ msgstr "la contrainte de partitionnement pour la table « %s » provient des contraintes existantes" +#~ msgid "transform function must not be an aggregate function" +#~ msgstr "la fonction de transformation ne doit pas être une fonction d'agrégat" -#~ msgid "validating foreign key constraint \"%s\"" -#~ msgstr "validation de la contraintes de clé étrangère « %s »" +#~ msgid "trigger \"%s\" for table \"%s\" does not exist, skipping" +#~ msgstr "le trigger « %s » pour la table « %s » n'existe pas, poursuite du traitement" -#~ msgid "existing constraints on column \"%s.%s\" are sufficient to prove that it does not contain nulls" -#~ msgstr "les contraintes existantes sur la colonne « %s.%s » sont suffisantes pour prouver qu'elle ne contient aucun NULL" +#~ msgid "tuple to be deleted was already moved to another partition due to concurrent update" +#~ msgstr "la ligne à supprimer était déjà déplacée vers une autre partition du fait d'une mise à jour concurrente" -#~ msgid "verifying table \"%s\"" -#~ msgstr "vérification de la table « %s »" +#~ msgid "tuple to be updated was already moved to another partition due to concurrent update" +#~ msgstr "la ligne à mettre à jour était déjà déplacée vers une autre partition du fait d'une mise à jour concurrente, nouvelle tentative" -#~ msgid "rewriting table \"%s\"" -#~ msgstr "ré-écriture de la table « %s »" +#~ msgid "two-phase state file for transaction %u is corrupt" +#~ msgstr "" +#~ "le fichier d'état de la validation en deux phases est corrompu pour la\n" +#~ "transaction %u" -#~ msgid "The error was: %s" -#~ msgstr "L'erreur était : %s" +#~ msgid "type %u does not match constructor type" +#~ msgstr "le type %u ne correspond pas un type constructeur" -#~ msgid "table \"%s.%s\" removed from subscription \"%s\"" -#~ msgstr "table « %s.%s » supprimée de la souscription « %s »" +#~ msgid "type output function %s must return type \"cstring\"" +#~ msgstr "le type de sortie de la fonction %s doit être « cstring »" -#~ msgid "table \"%s.%s\" added to subscription \"%s\"" -#~ msgstr "table « %s.%s » ajoutée à la souscription « %s »" +#~ msgid "type send function %s must return type \"bytea\"" +#~ msgstr "la fonction send du type %s doit renvoyer le type « bytea »" -#~ msgid "at least one of leftarg or rightarg must be specified" -#~ msgstr "au moins un des arguments (le gauche ou le droit) doit être spécifié" +#~ msgid "typmod_in function %s must return type \"integer\"" +#~ msgstr "la fonction typmod_in %s doit renvoyer le type « entier »" -#~ msgid "REINDEX is not yet implemented for partitioned indexes" -#~ msgstr "REINDEX n'est pas implémenté pour des index partitionnés" +#~ msgid "ucnv_fromUChars failed: %s" +#~ msgstr "échec de ucnv_fromUChars : %s" -#~ msgid "%s %s will create implicit index \"%s\" for table \"%s\"" -#~ msgstr "%s %s créera un index implicite « %s » pour la table « %s »" +#~ msgid "ucnv_toUChars failed: %s" +#~ msgstr "échec de ucnv_toUChars : %s" -#~ msgid "INOUT arguments are permitted." -#~ msgstr "les arguments INOUT ne sont pas autorisés." +#~ msgid "unable to open directory pg_tblspc: %m" +#~ msgstr "impossible d'ouvrir le répertoire p_tblspc : %m" -#~ msgid "procedures cannot have OUT arguments" -#~ msgstr "les procédures ne peuvent pas avoir d'argument OUT" +#~ msgid "unable to read symbolic link %s: %m" +#~ msgstr "incapable de lire le lien symbolique %s : %m" -#~ msgid "connection lost during COPY to stdout" -#~ msgstr "connexion perdue lors de l'opération COPY vers stdout" +#~ msgid "uncataloged table %s" +#~ msgstr "table %s sans catalogue" -#~ msgid "COPY BINARY is not supported to stdout or from stdin" -#~ msgstr "COPY BINARY n'est pas supporté vers stdout ou à partir de stdin" +#~ msgid "unexpected \"=\"" +#~ msgstr "« = » inattendu" -#~ msgid "automatic analyze of table \"%s.%s.%s\" system usage: %s" -#~ msgstr "ANALYZE automatique de la table « %s.%s.%s » ; utilisation système : %s" +#~ msgid "unexpected EOF on client connection" +#~ msgstr "fin de fichier (EOF) inattendue de la connexion du client" -#~ msgid "must be superuser to drop access methods" -#~ msgstr "doit être super-utilisateur pour supprimer des méthodes d'accès" +#~ msgid "unexpected Kerberos user name received from client (received \"%s\", expected \"%s\")" +#~ msgstr "" +#~ "nom d'utilisateur Kerberos inattendu reçu à partir du client (reçu « %s »,\n" +#~ "attendu « %s »)" -#~ msgid "REINDEX of partitioned tables is not yet implemented, skipping \"%s\"" -#~ msgstr "REINDEX n'est pas encore implémenté pour les tables partitionnées, « %s » ignoré" +#~ msgid "unexpected delimiter at line %d of thesaurus file \"%s\"" +#~ msgstr "délimiteur inattendu sur la ligne %d du thesaurus « %s »" -#~ msgid "building index \"%s\" on table \"%s\" with request for %d parallel worker" -#~ msgid_plural "building index \"%s\" on table \"%s\" with request for %d parallel workers" -#~ msgstr[0] "construction de l'index « %s » sur la table « %s » avec une demande de %d processus parallèle" -#~ msgstr[1] "construction de l'index « %s » sur la table « %s » avec une demande de %d processus parallèles" +#~ msgid "unexpected end of line at line %d of thesaurus file \"%s\"" +#~ msgstr "fin de ligne inattendue à la ligne %d du thésaurus « %s »" -#~ msgid "building index \"%s\" on table \"%s\" serially" -#~ msgstr "construction de l'index « %s » sur la table « %s » séquentiellement" +#~ msgid "unexpected end of line or lexeme at line %d of thesaurus file \"%s\"" +#~ msgstr "fin de ligne ou de lexeme inattendu sur la ligne %d du thesaurus « %s »" -#~ msgid "drop auto-cascades to %s" -#~ msgstr "DROP cascade automatiquement sur %s" +#~ msgid "unexpected standby message type \"%c\", after receiving CopyDone" +#~ msgstr "type de message standby « %c » inattendu, après avoir reçu CopyDone" -#~ msgid "backup timeline %u in file \"%s\"" -#~ msgstr "timeline de sauvegarde %u dans le fichier « %s »" +#~ msgid "unlogged GiST indexes are not supported" +#~ msgstr "les index GiST non tracés ne sont pas supportés" -#~ msgid "backup label %s in file \"%s\"" -#~ msgstr "label de sauvegarde %s dans le fichier « %s »" +#~ msgid "unlogged operation performed, data may be missing" +#~ msgstr "opération réalisée non tracée, les données pourraient manquer" -#~ msgid "backup time %s in file \"%s\"" -#~ msgstr "heure de sauvegarde %s dans le fichier « %s »" +#~ msgid "unrecognized \"datestyle\" key word: \"%s\"" +#~ msgstr "mot clé « datestyle » non reconnu : « %s »" -#~ msgid "skipping restartpoint, already performed at %X/%X" -#~ msgstr "ignore le point de redémarrage, déjà réalisé à %X/%X" +#~ msgid "unrecognized \"log_destination\" key word: \"%s\"" +#~ msgstr "mot clé « log_destination » non reconnu : « %s »" -#~ msgid "skipping restartpoint, recovery has already ended" -#~ msgstr "restartpoint ignoré, la récupération est déjà terminée" +#~ msgid "unrecognized error %d" +#~ msgstr "erreur %d non reconnue" -#~ msgid "checkpoint skipped because system is idle" -#~ msgstr "checkpoint ignoré car le système est inactif" +#~ msgid "unrecognized function attribute \"%s\" ignored" +#~ msgstr "l'attribut « %s » non reconnu de la fonction a été ignoré" -#~ msgid "initializing for hot standby" -#~ msgstr "initialisation pour « Hot Standby »" +#~ msgid "unrecognized recovery parameter \"%s\"" +#~ msgstr "paramètre de restauration « %s » non reconnu" -#~ msgid "checkpoint record is at %X/%X" -#~ msgstr "l'enregistrement du point de vérification est à %X/%X" +#~ msgid "unrecognized win32 error code: %lu" +#~ msgstr "code d'erreur win32 non reconnu : %lu" -#~ msgid "Either set wal_level to \"replica\" on the master, or turn off hot_standby here." -#~ msgstr "" -#~ "Vous devez soit positionner le paramètre wal_level à « replica » sur le maître,\n" -#~ "soit désactiver le hot_standby ici." +#~ msgid "unregistering background worker \"%s\"" +#~ msgstr "désenregistrement du processus en tâche de fond « %s »" -#~ msgid "removing write-ahead log file \"%s\"" -#~ msgstr "suppression du journal de transactions « %s »" +#~ msgid "unsafe permissions on private key file \"%s\"" +#~ msgstr "droits non sûrs sur le fichier de la clé privée « %s »" -#~ msgid "recycled write-ahead log file \"%s\"" -#~ msgstr "recyclage du journal de transactions « %s »" +#~ msgid "unsupported LZ4 compression method" +#~ msgstr "méthode compression LZ4 non supportée" + +#~ msgid "unsupported language \"%s\"" +#~ msgstr "langage non supporté « %s »" #~ msgid "updated min recovery point to %X/%X on timeline %u" #~ msgstr "mise à jour du point minimum de restauration sur %X/%X pour la timeline %u" -#~ msgid "cannot PREPARE a transaction that has manipulated logical replication workers" -#~ msgstr "" -#~ "ne peut pas préparer (PREPARE) une transaction qui a travaillé sur des\n" -#~ "workers de réplication logique" +#~ msgid "updated partition constraint for default partition \"%s\" is implied by existing constraints" +#~ msgstr "la contrainte de partitionnement pour la partition par défaut « %s » est implicite du fait de contraintes existantes" -#~ msgid "transaction ID wrap limit is %u, limited by database with OID %u" -#~ msgstr "" -#~ "la limite de réinitialisation de l'identifiant de transaction est %u,\n" -#~ "limité par la base de données d'OID %u" +#~ msgid "updated partition constraint for default partition would be violated by some row" +#~ msgstr "la contrainte de partition mise à jour pour la partition par défaut serait transgressée par des lignes" -#~ msgid "removing file \"%s\"" -#~ msgstr "suppression du fichier « %s »" +#~ msgid "usermap \"%s\"" +#~ msgstr "correspondance utilisateur « %s »" -#~ msgid "MultiXact member stop limit is now %u based on MultiXact %u" -#~ msgstr "La limite d'arrêt d'un membre MultiXact est maintenant %u, basée sur le MultiXact %u" +#~ msgid "using pg_pltemplate information instead of CREATE LANGUAGE parameters" +#~ msgstr "" +#~ "utilisation des informations de pg_pltemplate au lieu des paramètres de\n" +#~ "CREATE LANGUAGE" -#~ msgid "oldest MultiXactId member is at offset %u" -#~ msgstr "le membre le plus ancien du MultiXactId est au décalage %u" +#~ msgid "using previous checkpoint record at %X/%X" +#~ msgstr "utilisation du précédent enregistrement d'un point de vérification à %X/%X" -#~ msgid "MultiXactId wrap limit is %u, limited by database with OID %u" -#~ msgstr "La limite de réinitialisation MultiXactId est %u, limité par la base de données d'OID %u" +#~ msgid "validating foreign key constraint \"%s\"" +#~ msgstr "validation de la contraintes de clé étrangère « %s »" -#~ msgid "%u page is entirely empty.\n" -#~ msgid_plural "%u pages are entirely empty.\n" -#~ msgstr[0] "%u page est entièrement vide.\n" -#~ msgstr[1] "%u pages sont entièrement vides.\n" +#~ msgid "value \"%s\" is out of range for type bigint" +#~ msgstr "la valeur « %s » est en dehors des limites du type bigint" -#~ msgid "There were %.0f unused item identifiers.\n" -#~ msgstr "Il y avait %.0f identifiants d'éléments inutilisés.\n" +#~ msgid "value \"%s\" is out of range for type integer" +#~ msgstr "la valeur « %s » est en dehors des limites du type integer" -#~ msgid "\"%s\": removed %.0f row versions in %u pages" -#~ msgstr "« %s » : %.0f versions de ligne supprimées dans %u pages" +#~ msgid "value \"%s\" is out of range for type smallint" +#~ msgstr "la valeur « %s » est en dehors des limites du type smallint" -#~ msgid "password too long" -#~ msgstr "mot de passe trop long" +#~ msgid "verifying table \"%s\"" +#~ msgstr "vérification de la table « %s »" -#~ msgid "pclose failed: %m" -#~ msgstr "échec de pclose : %m" +#~ msgid "view must have at least one column" +#~ msgstr "la vue doit avoir au moins une colonne" -#~ msgid "You need to rebuild PostgreSQL using --with-libxml." -#~ msgstr "Vous devez recompiler PostgreSQL en utilisant --with-libxml." +#~ msgid "window functions cannot use named arguments" +#~ msgstr "les fonctions window ne peuvent pas renvoyer des arguments nommés" -#~ msgid "You need to rebuild PostgreSQL using --with-icu." -#~ msgstr "Vous devez recompiler PostgreSQL en utilisant --with-icu." +#~ msgid "window functions not allowed in GROUP BY clause" +#~ msgstr "fonctions window non autorisées dans une clause GROUP BY" -#~ msgid "arguments declared \"anycompatiblemultirange\" are not all alike" -#~ msgstr "les arguments déclarés « anycompatiblemultirange » ne sont pas tous identiques" +#~ msgid "worker process" +#~ msgstr "processus de travail" -#~ msgid "arguments declared \"anycompatiblerange\" are not all alike" -#~ msgstr "les arguments déclarés « anycompatiblerange » ne sont pas tous identiques" +#~ msgid "wrong affix file format for flag" +#~ msgstr "mauvais format de fichier affixe pour le drapeau" -#~ msgid "arguments declared \"anymultirange\" are not all alike" -#~ msgstr "les arguments déclarés « anymultirange » ne sont pas tous identiques" +#~ msgid "wrong data type: %u, expected %u" +#~ msgstr "mauvais type de données : %u, alors que %u attendu" -#~ msgid "arguments declared \"anyrange\" are not all alike" -#~ msgstr "les arguments déclarés « anyrange » ne sont pas tous identiques" +#~ msgid "wrong element type" +#~ msgstr "mauvais type d'élément" -#~ msgid "arguments declared \"anyelement\" are not all alike" -#~ msgstr "les arguments déclarés « anyelement » ne sont pas tous identiques" +#, fuzzy +#~ msgid "wrong number of array_subscripts" +#~ msgstr "mauvais nombre d'indices du tableau" -#~ msgid "\"timeout\" must not be negative or zero" -#~ msgstr "« timeout » ne doit pas être négatif ou nul" +#~ msgid "xrecoff \"%X\" is out of valid range, 0..%X" +#~ msgstr "xrecoff « %X » en dehors des limites valides, 0..%X" diff --git a/src/backend/po/ja.po b/src/backend/po/ja.po index 6c025aa917..ffd23b3716 100644 --- a/src/backend/po/ja.po +++ b/src/backend/po/ja.po @@ -1,59 +1,95 @@ -# Japanese message translation file for postgres -# Copyright (C) 2019 PostgreSQL Global Development Group -# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. -# HOTTA Michihide , 2011 +# postgres.po +# Japanese message translation file for postgres +# +# Copyright (C) 2011-2022 PostgreSQL Global Development Group +# +# HOTTA Michihide , 2011. +# +# This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: postgres (PostgreSQL 13)\n" +"Project-Id-Version: postgres (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:51+0900\n" -"PO-Revision-Date: 2021-02-05 07:57+0100\n" +"POT-Creation-Date: 2022-05-11 14:16+0900\n" +"PO-Revision-Date: 2022-05-13 17:26+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" +"Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" "X-Poedit-Basepath: ..\n" "X-Poedit-SearchPath-0: .\n" +#: ../common/compression.c:157 +msgid "found empty string where a compression option was expected" +msgstr "圧縮オプションがあるはずの場所に空文字列が見つかりました" + +#: ../common/compression.c:187 +#, c-format +msgid "unknown compression option \"%s\"" +msgstr "未知の圧縮オプション \"%s\"" + +#: ../common/compression.c:226 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "圧縮オプション\"%s\"には値が必要です" + +#: ../common/compression.c:235 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "圧縮オプション\"%s\"の値は整数でなければなりません" + +#: ../common/compression.c:273 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "圧縮アルゴリズム\"%s\"は圧縮レベルを受け付けません" + +#: ../common/compression.c:277 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d" +msgstr "圧縮アルゴリズム\"%s\"では%dから%dまでの圧縮レベルが指定可能です" + +#: ../common/compression.c:289 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "圧縮アルゴリズム\"%s\"はワーカー数を受け付けません" + #: ../common/config_info.c:134 ../common/config_info.c:142 ../common/config_info.c:150 ../common/config_info.c:158 ../common/config_info.c:166 ../common/config_info.c:174 ../common/config_info.c:182 ../common/config_info.c:190 msgid "not recorded" msgstr "記録されていません" -#: ../common/controldata_utils.c:68 ../common/controldata_utils.c:73 commands/copy.c:3551 commands/extension.c:3455 utils/adt/genfile.c:125 +#: ../common/controldata_utils.c:69 ../common/controldata_utils.c:73 commands/copyfrom.c:1515 commands/extension.c:3379 utils/adt/genfile.c:123 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読み取り用にオープンできませんでした: %m" -#: ../common/controldata_utils.c:86 ../common/controldata_utils.c:89 access/transam/timeline.c:143 access/transam/timeline.c:362 access/transam/twophase.c:1270 access/transam/xlog.c:3501 access/transam/xlog.c:4726 access/transam/xlog.c:11110 access/transam/xlog.c:11123 access/transam/xlog.c:11576 access/transam/xlog.c:11656 access/transam/xlog.c:11695 access/transam/xlog.c:11738 access/transam/xlogfuncs.c:662 access/transam/xlogfuncs.c:681 -#: commands/extension.c:3465 libpq/hba.c:499 replication/basebackup.c:2001 replication/logical/origin.c:712 replication/logical/origin.c:748 replication/logical/reorderbuffer.c:4427 replication/logical/snapbuild.c:1742 replication/logical/snapbuild.c:1784 replication/logical/snapbuild.c:1812 replication/logical/snapbuild.c:1839 replication/slot.c:1623 replication/slot.c:1664 replication/walsender.c:543 storage/file/buffile.c:441 storage/file/copydir.c:195 -#: utils/adt/genfile.c:200 utils/adt/misc.c:763 utils/cache/relmapper.c:741 +#: ../common/controldata_utils.c:84 ../common/controldata_utils.c:86 access/transam/timeline.c:143 access/transam/timeline.c:362 access/transam/twophase.c:1348 access/transam/xlog.c:3207 access/transam/xlog.c:4022 access/transam/xlogrecovery.c:1177 access/transam/xlogrecovery.c:1269 access/transam/xlogrecovery.c:1306 access/transam/xlogrecovery.c:1366 commands/extension.c:3389 libpq/hba.c:505 replication/basebackup.c:1836 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4925 replication/logical/snapbuild.c:1756 replication/logical/snapbuild.c:1798 replication/logical/snapbuild.c:1825 replication/slot.c:1815 replication/slot.c:1856 replication/walsender.c:659 storage/file/buffile.c:463 storage/file/copydir.c:195 utils/adt/genfile.c:197 utils/adt/misc.c:863 utils/cache/relmapper.c:813 #, c-format msgid "could not read file \"%s\": %m" msgstr "ファイル\"%s\"の読み取りに失敗しました: %m" -#: ../common/controldata_utils.c:97 ../common/controldata_utils.c:101 access/transam/twophase.c:1273 access/transam/xlog.c:3506 access/transam/xlog.c:4731 replication/basebackup.c:2005 replication/logical/origin.c:717 replication/logical/origin.c:756 replication/logical/snapbuild.c:1747 replication/logical/snapbuild.c:1789 replication/logical/snapbuild.c:1817 replication/logical/snapbuild.c:1844 replication/slot.c:1627 replication/slot.c:1668 -#: replication/walsender.c:548 utils/cache/relmapper.c:745 +#: ../common/controldata_utils.c:92 ../common/controldata_utils.c:95 access/transam/xlog.c:3212 access/transam/xlog.c:4027 replication/basebackup.c:1840 replication/logical/origin.c:734 replication/logical/origin.c:773 replication/logical/snapbuild.c:1761 replication/logical/snapbuild.c:1803 replication/logical/snapbuild.c:1830 replication/slot.c:1819 replication/slot.c:1860 replication/walsender.c:664 utils/cache/relmapper.c:817 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました" -#: ../common/controldata_utils.c:112 ../common/controldata_utils.c:117 ../common/controldata_utils.c:256 ../common/controldata_utils.c:259 access/heap/rewriteheap.c:1181 access/heap/rewriteheap.c:1284 access/transam/timeline.c:392 access/transam/timeline.c:438 access/transam/timeline.c:516 access/transam/twophase.c:1282 access/transam/twophase.c:1668 access/transam/xlog.c:3373 access/transam/xlog.c:3541 access/transam/xlog.c:3546 access/transam/xlog.c:3874 -#: access/transam/xlog.c:4696 access/transam/xlog.c:5620 access/transam/xlogfuncs.c:687 commands/copy.c:1860 libpq/be-fsstubs.c:462 libpq/be-fsstubs.c:533 replication/logical/origin.c:650 replication/logical/origin.c:789 replication/logical/reorderbuffer.c:4485 replication/logical/snapbuild.c:1654 replication/logical/snapbuild.c:1852 replication/slot.c:1514 replication/slot.c:1675 replication/walsender.c:558 storage/file/copydir.c:218 storage/file/copydir.c:223 -#: storage/file/fd.c:704 storage/file/fd.c:3425 storage/file/fd.c:3528 utils/cache/relmapper.c:753 utils/cache/relmapper.c:892 +#: ../common/controldata_utils.c:104 ../common/controldata_utils.c:108 ../common/controldata_utils.c:241 ../common/controldata_utils.c:244 access/heap/rewriteheap.c:1178 access/heap/rewriteheap.c:1281 access/transam/timeline.c:392 access/transam/timeline.c:438 access/transam/timeline.c:516 access/transam/twophase.c:1360 access/transam/twophase.c:1772 access/transam/xlog.c:3054 access/transam/xlog.c:3247 access/transam/xlog.c:3252 access/transam/xlog.c:3390 +#: access/transam/xlog.c:3992 access/transam/xlog.c:4729 commands/copyfrom.c:1575 commands/copyto.c:327 libpq/be-fsstubs.c:455 libpq/be-fsstubs.c:525 replication/logical/origin.c:667 replication/logical/origin.c:806 replication/logical/reorderbuffer.c:4983 replication/logical/snapbuild.c:1665 replication/logical/snapbuild.c:1838 replication/slot.c:1706 replication/slot.c:1867 replication/walsender.c:674 storage/file/copydir.c:218 storage/file/copydir.c:223 +#: storage/file/fd.c:745 storage/file/fd.c:3643 storage/file/fd.c:3749 utils/cache/relmapper.c:828 utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" msgstr "ファイル\"%s\"をクローズできませんでした: %m" -#: ../common/controldata_utils.c:135 +#: ../common/controldata_utils.c:124 msgid "byte ordering mismatch" msgstr "バイトオーダが合っていません" -#: ../common/controldata_utils.c:137 +#: ../common/controldata_utils.c:126 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -66,69 +102,81 @@ msgstr "" "されるものと一致しないようです。この場合以下の結果は不正確になります。また、\n" "PostgreSQLインストレーションはこのデータディレクトリと互換性がなくなります。" -#: ../common/controldata_utils.c:197 ../common/controldata_utils.c:203 ../common/file_utils.c:229 ../common/file_utils.c:288 ../common/file_utils.c:362 access/heap/rewriteheap.c:1267 access/transam/timeline.c:111 access/transam/timeline.c:251 access/transam/timeline.c:348 access/transam/twophase.c:1226 access/transam/xlog.c:3275 access/transam/xlog.c:3415 access/transam/xlog.c:3456 access/transam/xlog.c:3654 access/transam/xlog.c:3739 access/transam/xlog.c:3842 -#: access/transam/xlog.c:4716 access/transam/xlogutils.c:806 postmaster/syslogger.c:1488 replication/basebackup.c:616 replication/basebackup.c:1593 replication/logical/origin.c:702 replication/logical/reorderbuffer.c:3163 replication/logical/reorderbuffer.c:3653 replication/logical/reorderbuffer.c:4407 replication/logical/snapbuild.c:1609 replication/logical/snapbuild.c:1713 replication/slot.c:1595 replication/walsender.c:516 replication/walsender.c:2509 -#: storage/file/copydir.c:161 storage/file/fd.c:679 storage/file/fd.c:3412 storage/file/fd.c:3499 storage/smgr/md.c:475 utils/cache/relmapper.c:724 utils/cache/relmapper.c:836 utils/error/elog.c:1858 utils/init/miscinit.c:1318 utils/init/miscinit.c:1452 utils/init/miscinit.c:1529 utils/misc/guc.c:8270 utils/misc/guc.c:8302 +#: ../common/controldata_utils.c:189 ../common/controldata_utils.c:194 ../common/file_utils.c:232 ../common/file_utils.c:291 ../common/file_utils.c:365 access/heap/rewriteheap.c:1264 access/transam/timeline.c:111 access/transam/timeline.c:251 access/transam/timeline.c:348 access/transam/twophase.c:1304 access/transam/xlog.c:2941 access/transam/xlog.c:3123 access/transam/xlog.c:3162 access/transam/xlog.c:3357 access/transam/xlog.c:4012 +#: access/transam/xlogrecovery.c:4115 access/transam/xlogrecovery.c:4218 access/transam/xlogutils.c:851 postmaster/syslogger.c:1560 replication/basebackup.c:522 replication/basebackup.c:1513 replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3580 replication/logical/reorderbuffer.c:4129 replication/logical/reorderbuffer.c:4905 replication/logical/snapbuild.c:1620 replication/logical/snapbuild.c:1727 replication/slot.c:1787 +#: replication/walsender.c:632 replication/walsender.c:2705 storage/file/copydir.c:161 storage/file/fd.c:720 storage/file/fd.c:3395 storage/file/fd.c:3630 storage/file/fd.c:3720 storage/smgr/md.c:507 utils/cache/relmapper.c:792 utils/cache/relmapper.c:900 utils/error/elog.c:1933 utils/init/miscinit.c:1366 utils/init/miscinit.c:1500 utils/init/miscinit.c:1577 utils/misc/guc.c:8923 utils/misc/guc.c:8972 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンできませんでした: %m" -#: ../common/controldata_utils.c:221 ../common/controldata_utils.c:224 access/transam/twophase.c:1641 access/transam/twophase.c:1650 access/transam/xlog.c:10867 access/transam/xlog.c:10905 access/transam/xlog.c:11318 access/transam/xlogfuncs.c:741 postmaster/syslogger.c:1499 postmaster/syslogger.c:1512 utils/cache/relmapper.c:870 +#: ../common/controldata_utils.c:210 ../common/controldata_utils.c:213 access/transam/twophase.c:1745 access/transam/twophase.c:1754 access/transam/xlog.c:8652 access/transam/xlogfuncs.c:600 postmaster/postmaster.c:5616 postmaster/syslogger.c:1571 postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 replication/basebackup_server.c:171 replication/basebackup_server.c:264 utils/cache/relmapper.c:934 #, c-format msgid "could not write file \"%s\": %m" msgstr "ファイル\"%s\"を書き出せませんでした: %m" -#: ../common/controldata_utils.c:239 ../common/controldata_utils.c:245 ../common/file_utils.c:300 ../common/file_utils.c:370 access/heap/rewriteheap.c:961 access/heap/rewriteheap.c:1175 access/heap/rewriteheap.c:1278 access/transam/timeline.c:432 access/transam/timeline.c:510 access/transam/twophase.c:1662 access/transam/xlog.c:3366 access/transam/xlog.c:3535 access/transam/xlog.c:4689 access/transam/xlog.c:10385 access/transam/xlog.c:10412 -#: replication/logical/snapbuild.c:1647 replication/slot.c:1500 replication/slot.c:1605 storage/file/fd.c:696 storage/file/fd.c:3520 storage/smgr/md.c:921 storage/smgr/md.c:962 storage/sync/sync.c:396 utils/cache/relmapper.c:885 utils/misc/guc.c:8053 +#: ../common/controldata_utils.c:227 ../common/controldata_utils.c:232 ../common/file_utils.c:303 ../common/file_utils.c:373 access/heap/rewriteheap.c:960 access/heap/rewriteheap.c:1172 access/heap/rewriteheap.c:1275 access/transam/timeline.c:432 access/transam/timeline.c:510 access/transam/twophase.c:1766 access/transam/xlog.c:3047 access/transam/xlog.c:3241 access/transam/xlog.c:3985 access/transam/xlog.c:7950 access/transam/xlog.c:7993 +#: replication/basebackup_server.c:205 replication/logical/snapbuild.c:1658 replication/slot.c:1692 replication/slot.c:1797 storage/file/fd.c:737 storage/file/fd.c:3741 storage/smgr/md.c:958 storage/smgr/md.c:999 storage/sync/sync.c:453 utils/cache/relmapper.c:949 utils/misc/guc.c:8692 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"をfsyncできませんでした: %m" -#: ../common/exec.c:137 ../common/exec.c:254 ../common/exec.c:300 +#: ../common/cryptohash.c:266 ../common/cryptohash_openssl.c:133 ../common/cryptohash_openssl.c:331 ../common/exec.c:560 ../common/exec.c:605 ../common/exec.c:697 ../common/hmac.c:309 ../common/hmac.c:325 ../common/hmac_openssl.c:132 ../common/hmac_openssl.c:327 ../common/md5_common.c:155 ../common/psprintf.c:143 ../common/scram-common.c:247 ../common/stringinfo.c:305 ../port/path.c:751 ../port/path.c:789 ../port/path.c:806 access/transam/twophase.c:1413 +#: access/transam/xlogrecovery.c:567 lib/dshash.c:254 libpq/auth.c:1338 libpq/auth.c:1406 libpq/auth.c:1964 libpq/be-secure-gssapi.c:520 postmaster/bgworker.c:349 postmaster/bgworker.c:931 postmaster/postmaster.c:2569 postmaster/postmaster.c:4155 postmaster/postmaster.c:4827 postmaster/postmaster.c:5541 postmaster/postmaster.c:5904 replication/libpqwalreceiver/libpqwalreceiver.c:296 replication/logical/logical.c:205 replication/walsender.c:702 +#: storage/buffer/localbuf.c:442 storage/file/fd.c:892 storage/file/fd.c:1434 storage/file/fd.c:1595 storage/file/fd.c:2409 storage/ipc/procarray.c:1432 storage/ipc/procarray.c:2264 storage/ipc/procarray.c:2271 storage/ipc/procarray.c:2777 storage/ipc/procarray.c:3408 utils/adt/formatting.c:1727 utils/adt/formatting.c:1849 utils/adt/formatting.c:1972 utils/adt/pg_locale.c:450 utils/adt/pg_locale.c:614 utils/adt/regexp.c:224 utils/fmgr/dfmgr.c:229 +#: utils/hash/dynahash.c:513 utils/hash/dynahash.c:613 utils/hash/dynahash.c:1116 utils/mb/mbutils.c:401 utils/mb/mbutils.c:429 utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5201 utils/misc/guc.c:5217 utils/misc/guc.c:5230 utils/misc/guc.c:8670 utils/misc/tzparser.c:467 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:701 utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:266 utils/mmgr/mcxt.c:888 utils/mmgr/mcxt.c:924 utils/mmgr/mcxt.c:962 +#: utils/mmgr/mcxt.c:1000 utils/mmgr/mcxt.c:1088 utils/mmgr/mcxt.c:1119 utils/mmgr/mcxt.c:1155 utils/mmgr/mcxt.c:1207 utils/mmgr/mcxt.c:1242 utils/mmgr/mcxt.c:1277 utils/mmgr/slab.c:236 +#, c-format +msgid "out of memory" +msgstr "メモリ不足です" + +#: ../common/cryptohash.c:271 ../common/cryptohash.c:277 ../common/cryptohash_openssl.c:343 ../common/cryptohash_openssl.c:351 ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:339 ../common/hmac_openssl.c:347 +msgid "success" +msgstr "成功" + +#: ../common/cryptohash.c:273 ../common/cryptohash_openssl.c:345 ../common/hmac_openssl.c:341 +msgid "destination buffer too small" +msgstr "出力先バッファが小さすぎます" + +#: ../common/cryptohash_openssl.c:347 ../common/hmac_openssl.c:343 +msgid "OpenSSL failure" +msgstr "OpenSSLのエラー" + +#: ../common/exec.c:149 ../common/exec.c:266 ../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "カレントディレクトリを識別できませんでした: %m" -#: ../common/exec.c:156 +#: ../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "バイナリ\"%s\"は不正です" -#: ../common/exec.c:206 +#: ../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "バイナリ\"%s\"を読み取れませんでした" -#: ../common/exec.c:214 +#: ../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "実行すべき\"%s\"がありませんでした" -#: ../common/exec.c:270 ../common/exec.c:309 utils/init/miscinit.c:397 +#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:439 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "ディレクトリ\"%s\"に移動できませんでした: %m" -#: ../common/exec.c:287 access/transam/xlog.c:10740 replication/basebackup.c:1413 utils/adt/misc.c:337 +#: ../common/exec.c:299 access/transam/xlog.c:8301 replication/basebackup.c:1333 utils/adt/misc.c:342 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を読めませんでした: %m" -#: ../common/exec.c:410 -#, c-format -msgid "pclose failed: %m" -msgstr "pcloseが失敗しました: %m" - -#: ../common/exec.c:539 ../common/exec.c:584 ../common/exec.c:676 ../common/psprintf.c:143 ../common/stringinfo.c:305 ../port/path.c:630 ../port/path.c:668 ../port/path.c:685 access/transam/twophase.c:1335 access/transam/xlog.c:6491 lib/dshash.c:246 libpq/auth.c:1090 libpq/auth.c:1491 libpq/auth.c:1559 libpq/auth.c:2089 libpq/be-secure-gssapi.c:484 postmaster/bgworker.c:336 postmaster/bgworker.c:886 postmaster/postmaster.c:2520 postmaster/postmaster.c:2542 -#: postmaster/postmaster.c:4168 postmaster/postmaster.c:4862 postmaster/postmaster.c:4941 postmaster/postmaster.c:5624 postmaster/postmaster.c:5984 replication/libpqwalreceiver/libpqwalreceiver.c:276 replication/logical/logical.c:195 replication/walsender.c:590 storage/buffer/localbuf.c:442 storage/file/fd.c:834 storage/file/fd.c:1304 storage/file/fd.c:1465 storage/file/fd.c:2270 storage/ipc/procarray.c:1368 storage/ipc/procarray.c:2106 -#: storage/ipc/procarray.c:2113 storage/ipc/procarray.c:2591 storage/ipc/procarray.c:3215 utils/adt/cryptohashes.c:45 utils/adt/cryptohashes.c:65 utils/adt/formatting.c:1698 utils/adt/formatting.c:1822 utils/adt/formatting.c:1947 utils/adt/pg_locale.c:475 utils/adt/pg_locale.c:639 utils/adt/regexp.c:223 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:469 utils/hash/dynahash.c:578 utils/hash/dynahash.c:1090 utils/mb/mbutils.c:401 utils/mb/mbutils.c:428 -#: utils/mb/mbutils.c:757 utils/mb/mbutils.c:783 utils/misc/guc.c:4864 utils/misc/guc.c:4880 utils/misc/guc.c:4893 utils/misc/guc.c:8031 utils/misc/tzparser.c:467 utils/mmgr/aset.c:475 utils/mmgr/dsa.c:701 utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:233 utils/mmgr/mcxt.c:829 utils/mmgr/mcxt.c:865 utils/mmgr/mcxt.c:903 utils/mmgr/mcxt.c:941 utils/mmgr/mcxt.c:977 utils/mmgr/mcxt.c:1008 utils/mmgr/mcxt.c:1044 utils/mmgr/mcxt.c:1096 -#: utils/mmgr/mcxt.c:1131 utils/mmgr/mcxt.c:1166 utils/mmgr/slab.c:235 +#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1067 storage/ipc/latch.c:1247 storage/ipc/latch.c:1476 storage/ipc/latch.c:1637 storage/ipc/latch.c:1763 #, c-format -msgid "out of memory" -msgstr "メモリ不足です" +msgid "%s() failed: %m" +msgstr "%s() が失敗しました: %m" -#: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 ../common/fe_memutils.c:98 ../common/fe_memutils.c:162 ../common/psprintf.c:145 ../port/path.c:632 ../port/path.c:670 ../port/path.c:687 utils/misc/ps_status.c:181 utils/misc/ps_status.c:189 utils/misc/ps_status.c:219 utils/misc/ps_status.c:227 +#: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 ../common/fe_memutils.c:98 ../common/fe_memutils.c:162 ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:791 ../port/path.c:808 utils/misc/ps_status.c:181 utils/misc/ps_status.c:189 utils/misc/ps_status.c:219 utils/misc/ps_status.c:227 #, c-format msgid "out of memory\n" msgstr "メモリ不足です\n" @@ -138,124 +186,133 @@ msgstr "メモリ不足です\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "nullポインタは複製できません(内部エラー)\n" -#: ../common/file_utils.c:84 ../common/file_utils.c:186 access/transam/twophase.c:1238 access/transam/xlog.c:10843 access/transam/xlog.c:10881 access/transam/xlog.c:11098 access/transam/xlogarchive.c:110 access/transam/xlogarchive.c:226 commands/copy.c:1988 commands/copy.c:3561 commands/extension.c:3444 commands/tablespace.c:795 commands/tablespace.c:886 guc-file.l:1062 replication/basebackup.c:439 replication/basebackup.c:622 replication/basebackup.c:698 -#: replication/logical/snapbuild.c:1523 storage/file/copydir.c:68 storage/file/copydir.c:107 storage/file/fd.c:1816 storage/file/fd.c:3096 storage/file/fd.c:3278 storage/file/fd.c:3364 utils/adt/dbsize.c:70 utils/adt/dbsize.c:222 utils/adt/dbsize.c:302 utils/adt/genfile.c:416 utils/adt/genfile.c:642 +#: ../common/file_utils.c:87 ../common/file_utils.c:451 ../common/file_utils.c:455 access/transam/twophase.c:1316 access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:230 commands/copyfrom.c:1525 commands/copyto.c:725 commands/extension.c:3368 commands/tablespace.c:847 commands/tablespace.c:938 guc-file.l:1063 postmaster/pgarch.c:604 replication/basebackup.c:338 replication/basebackup.c:528 replication/basebackup.c:599 +#: replication/logical/snapbuild.c:1537 storage/file/copydir.c:68 storage/file/copydir.c:107 storage/file/fd.c:1951 storage/file/fd.c:2037 storage/file/fd.c:3243 storage/file/fd.c:3450 utils/adt/dbsize.c:92 utils/adt/dbsize.c:244 utils/adt/dbsize.c:324 utils/adt/genfile.c:413 utils/adt/genfile.c:588 utils/adt/misc.c:327 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"のstatに失敗しました: %m" -#: ../common/file_utils.c:163 ../common/pgfnames.c:48 commands/tablespace.c:718 commands/tablespace.c:728 postmaster/postmaster.c:1511 storage/file/fd.c:2673 storage/file/reinit.c:122 utils/adt/misc.c:259 utils/misc/tzparser.c:338 +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:770 commands/tablespace.c:780 postmaster/postmaster.c:1561 storage/file/fd.c:2812 storage/file/reinit.c:126 utils/adt/misc.c:235 utils/misc/tzparser.c:338 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" -#: ../common/file_utils.c:197 ../common/pgfnames.c:69 storage/file/fd.c:2685 +#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2824 #, c-format msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m" -#: ../common/file_utils.c:380 access/transam/xlogarchive.c:411 postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1666 replication/slot.c:651 replication/slot.c:1386 replication/slot.c:1528 storage/file/fd.c:714 utils/time/snapmgr.c:1316 +#: ../common/file_utils.c:383 access/transam/xlogarchive.c:419 postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1677 replication/slot.c:709 replication/slot.c:1578 replication/slot.c:1720 storage/file/fd.c:755 storage/file/fd.c:853 utils/time/snapmgr.c:1282 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" -#: ../common/jsonapi.c:1064 +#: ../common/hmac.c:323 +msgid "internal error" +msgstr "内部エラー" + +#: ../common/jsonapi.c:1075 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "エスケープシーケンス\"\\%s\"は不正です。" -#: ../common/jsonapi.c:1067 +#: ../common/jsonapi.c:1078 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x値を持つ文字はエスケープしなければなりません" -#: ../common/jsonapi.c:1070 +#: ../common/jsonapi.c:1081 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "入力の終端を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1073 +#: ../common/jsonapi.c:1084 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "配列要素または\"]\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1076 +#: ../common/jsonapi.c:1087 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "\",\"または\"]\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1079 +#: ../common/jsonapi.c:1090 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "\":\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1082 +#: ../common/jsonapi.c:1093 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "JSON値を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1085 +#: ../common/jsonapi.c:1096 msgid "The input string ended unexpectedly." msgstr "入力文字列が予期せず終了しました。" -#: ../common/jsonapi.c:1087 +#: ../common/jsonapi.c:1098 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "文字列または\"}\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1090 +#: ../common/jsonapi.c:1101 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "\",\"または\"}\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1093 +#: ../common/jsonapi.c:1104 #, c-format msgid "Expected string, but found \"%s\"." msgstr "文字列を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1096 +#: ../common/jsonapi.c:1107 #, c-format msgid "Token \"%s\" is invalid." msgstr "トークン\"%s\"は不正です。" -#: ../common/jsonapi.c:1099 jsonpath_scan.l:500 +#: ../common/jsonapi.c:1110 jsonpath_scan.l:496 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 はテキストに変換できません。" -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:1112 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\"の後には16進数の4桁が続かなければなりません。" -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:1115 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "エンコーディングがUTF-8ではない場合、コードポイントの値が 007F 以上についてはUnicodeエスケープの値は使用できません。" -#: ../common/jsonapi.c:1106 jsonpath_scan.l:521 +#: ../common/jsonapi.c:1117 jsonpath_scan.l:517 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodeのハイサロゲートはハイサロゲートに続いてはいけません。" -#: ../common/jsonapi.c:1108 jsonpath_scan.l:532 jsonpath_scan.l:542 jsonpath_scan.l:584 +#: ../common/jsonapi.c:1119 jsonpath_scan.l:528 jsonpath_scan.l:538 jsonpath_scan.l:580 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicodeのローサロゲートはハイサロゲートに続かなければなりません。" -#: ../common/logging.c:241 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " - -#: ../common/logging.c:248 +#: ../common/logging.c:277 #, c-format msgid "error: " msgstr "エラー: " -#: ../common/logging.c:255 +#: ../common/logging.c:284 #, c-format msgid "warning: " msgstr "警告: " +#: ../common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "ヒント: " + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -271,7 +328,7 @@ msgstr "不正なフォーク名です" msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." msgstr "有効なフォーク名は\"main\"、\"fsm\"、\"vm\"および\"init\"です。" -#: ../common/restricted_token.c:64 libpq/auth.c:1521 libpq/auth.c:2520 +#: ../common/restricted_token.c:64 libpq/auth.c:1368 libpq/auth.c:2400 #, c-format msgid "could not load library \"%s\": error code %lu" msgstr "ライブラリ\"%s\"をロードできませんでした: エラーコード %lu" @@ -306,12 +363,12 @@ msgstr "コマンド\"%s\"のためのプロセスを起動できませんでし msgid "could not re-execute with restricted token: error code %lu" msgstr "制限付きトークンで再実行できませんでした: %lu" -#: ../common/restricted_token.c:194 +#: ../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "サブプロセスの終了コードを取得できませんでした: エラーコード %lu" -#: ../common/rmtree.c:79 replication/basebackup.c:1166 replication/basebackup.c:1342 +#: ../common/rmtree.c:79 replication/basebackup.c:1093 replication/basebackup.c:1269 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "\"%s\"というファイルまたはディレクトリの情報を取得できませんでした。: %m" @@ -321,10 +378,17 @@ msgstr "\"%s\"というファイルまたはディレクトリの情報を取得 msgid "could not remove file or directory \"%s\": %m" msgstr "\"%s\"というファイルまたはディレクトリを削除できませんでした: %m" -#: ../common/saslprep.c:1087 -#, c-format -msgid "password too long" -msgstr "パスワードが長すぎます" +#: ../common/scram-common.c:260 +msgid "could not encode salt" +msgstr "saltのエンコードに失敗しました" + +#: ../common/scram-common.c:276 +msgid "could not encode stored key" +msgstr "nonceのエンコードに失敗しました" + +#: ../common/scram-common.c:293 +msgid "could not encode server key" +msgstr "サーバーキーのエンコードに失敗しました" #: ../common/stringinfo.c:306 #, c-format @@ -347,7 +411,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "実効ユーザID %ld が見つかりませんでした: %s" -#: ../common/username.c:45 libpq/auth.c:2027 +#: ../common/username.c:45 libpq/auth.c:1900 msgid "user does not exist" msgstr "ユーザが存在しません" @@ -386,12 +450,12 @@ msgstr "子プロセスはシグナル%dにより終了しました: %s" msgid "child process exited with unrecognized status %d" msgstr "子プロセスは認識できないステータス%dで終了しました" -#: ../port/chklocale.c:307 +#: ../port/chklocale.c:306 #, c-format msgid "could not determine encoding for codeset \"%s\"" msgstr "コードセット\"%s\"用の符号化方式を特定できませんでした" -#: ../port/chklocale.c:428 ../port/chklocale.c:434 +#: ../port/chklocale.c:427 ../port/chklocale.c:433 #, c-format msgid "could not determine encoding for locale \"%s\": codeset is \"%s\"" msgstr "ロケール\"%s\"用の符号化方式を特定できませんでした: コードセットは\"%s\"です" @@ -416,30 +480,30 @@ msgstr "\"%s\"のジャンクションを取得できませんでした: %s" msgid "could not get junction for \"%s\": %s\n" msgstr "\"%s\"のジャンクションを取得できませんでした: %s\n" -#: ../port/open.c:126 +#: ../port/open.c:117 #, c-format msgid "could not open file \"%s\": %s" msgstr "ファイル\"%s\"をオープンできませんでした: %s" -#: ../port/open.c:127 +#: ../port/open.c:118 msgid "lock violation" msgstr "ロック違反" -#: ../port/open.c:127 +#: ../port/open.c:118 msgid "sharing violation" msgstr "共有違反" -#: ../port/open.c:128 +#: ../port/open.c:119 #, c-format msgid "Continuing to retry for 30 seconds." msgstr "再試行を30秒間続けます。" -#: ../port/open.c:129 +#: ../port/open.c:120 #, c-format msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "データベースシステムに干渉するアンチウィルス、バックアップといったソフトウェアが存在する可能性があります。" -#: ../port/path.c:654 +#: ../port/path.c:775 #, c-format msgid "could not get current working directory: %s\n" msgstr "現在の作業ディレクトリを取得できませんでした: %s\n" @@ -449,6 +513,16 @@ msgstr "現在の作業ディレクトリを取得できませんでした: %s\n msgid "operating system error %d" msgstr "オペレーティングシステムエラー %d" +#: ../port/thread.c:100 ../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "ローカルユーザID %dの参照に失敗しました: %s" + +#: ../port/thread.c:105 ../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "ID %d を持つローカルユーザは存在しません" + #: ../port/win32security.c:62 #, c-format msgid "could not get SID for Administrators group: error code %lu\n" @@ -464,77 +538,88 @@ msgstr "PowerUsersグループのSIDを取得できませんでした: エラー msgid "could not check access token membership: error code %lu\n" msgstr "アクセストークンのメンバーシップを確認できませんでした: エラーコード %lu\n" -#: access/brin/brin.c:211 +#: access/brin/brin.c:215 #, c-format msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "インデックス\"%s\" ページ%uのBRIN範囲要約のリクエストは登録されていません" -#: access/brin/brin.c:874 access/brin/brin.c:951 access/gin/ginfast.c:1035 access/transam/xlog.c:10520 access/transam/xlog.c:11049 access/transam/xlogfuncs.c:274 access/transam/xlogfuncs.c:301 access/transam/xlogfuncs.c:340 access/transam/xlogfuncs.c:361 access/transam/xlogfuncs.c:382 access/transam/xlogfuncs.c:452 access/transam/xlogfuncs.c:509 +#: access/brin/brin.c:1019 access/brin/brin.c:1114 access/gin/ginfast.c:1035 access/transam/xlogfuncs.c:165 access/transam/xlogfuncs.c:192 access/transam/xlogfuncs.c:231 access/transam/xlogfuncs.c:252 access/transam/xlogfuncs.c:273 access/transam/xlogfuncs.c:343 access/transam/xlogfuncs.c:401 #, c-format msgid "recovery is in progress" msgstr "リカバリは現在進行中です" -#: access/brin/brin.c:875 access/brin/brin.c:952 +#: access/brin/brin.c:1020 access/brin/brin.c:1115 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "BRIN制御関数はリカバリ中は実行できません。" -#: access/brin/brin.c:883 access/brin/brin.c:960 +#: access/brin/brin.c:1025 access/brin/brin.c:1120 #, c-format -msgid "block number out of range: %s" -msgstr "ブロック番号が範囲外です: %s" +msgid "block number out of range: %lld" +msgstr "ブロック番号が範囲外です: %lld" -#: access/brin/brin.c:906 access/brin/brin.c:983 +#: access/brin/brin.c:1063 access/brin/brin.c:1146 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\"はBRINインデックスではありません" -#: access/brin/brin.c:922 access/brin/brin.c:999 +#: access/brin/brin.c:1079 access/brin/brin.c:1162 +#, c-format +msgid "could not open parent table of index \"%s\"" +msgstr "インデックス\"%s\"の親テーブルをオープンできませんでした" + +#: access/brin/brin_bloom.c:750 access/brin/brin_bloom.c:792 access/brin/brin_minmax_multi.c:3004 access/brin/brin_minmax_multi.c:3147 statistics/dependencies.c:663 statistics/dependencies.c:716 statistics/mcv.c:1484 statistics/mcv.c:1515 statistics/mvdistinct.c:344 statistics/mvdistinct.c:397 utils/adt/pseudotypes.c:43 utils/adt/pseudotypes.c:77 utils/adt/pseudotypes.c:252 +#, c-format +msgid "cannot accept a value of type %s" +msgstr "%s型の値は受け付けられません" + +#: access/brin/brin_minmax_multi.c:2163 access/brin/brin_minmax_multi.c:2170 access/brin/brin_minmax_multi.c:2177 utils/adt/timestamp.c:938 utils/adt/timestamp.c:1509 utils/adt/timestamp.c:2760 utils/adt/timestamp.c:2777 utils/adt/timestamp.c:2830 utils/adt/timestamp.c:2869 utils/adt/timestamp.c:3114 utils/adt/timestamp.c:3119 utils/adt/timestamp.c:3124 utils/adt/timestamp.c:3174 utils/adt/timestamp.c:3181 utils/adt/timestamp.c:3188 utils/adt/timestamp.c:3208 +#: utils/adt/timestamp.c:3215 utils/adt/timestamp.c:3222 utils/adt/timestamp.c:3252 utils/adt/timestamp.c:3260 utils/adt/timestamp.c:3304 utils/adt/timestamp.c:3730 utils/adt/timestamp.c:3854 utils/adt/timestamp.c:4404 #, c-format -msgid "could not open parent table of index %s" -msgstr "インデックス%sの親テーブルをオープンできませんでした" +msgid "interval out of range" +msgstr "intervalが範囲外です" -#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 access/brin/brin_pageops.c:843 access/gin/ginentrypage.c:110 access/gist/gist.c:1436 access/spgist/spgdoinsert.c:1957 +#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 access/brin/brin_pageops.c:843 access/gin/ginentrypage.c:110 access/gist/gist.c:1443 access/spgist/spgdoinsert.c:2001 access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "インデックス行サイズ%1$zuはインデックス\"%3$s\"での最大値%2$zuを超えています" -#: access/brin/brin_revmap.c:392 access/brin/brin_revmap.c:398 +#: access/brin/brin_revmap.c:393 access/brin/brin_revmap.c:399 #, c-format msgid "corrupted BRIN index: inconsistent range map" msgstr "BRINインデックスが壊れています: 範囲マップの不整合" -#: access/brin/brin_revmap.c:601 +#: access/brin/brin_revmap.c:602 #, c-format msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" msgstr "BRINインデックス\"%2$s\"のブロック %3$u のページタイプが予期しない値 0x%1$04X です" -#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:151 access/gist/gistvalidate.c:149 access/hash/hashvalidate.c:139 access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:168 +#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:151 access/gist/gistvalidate.c:153 access/hash/hashvalidate.c:139 access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:189 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with invalid support number %d" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は不正なサポート番号%4$dを持つ関数%3$sを含んでいます" -#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:163 access/gist/gistvalidate.c:161 access/hash/hashvalidate.c:118 access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:180 +#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:163 access/gist/gistvalidate.c:165 access/hash/hashvalidate.c:118 access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:201 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with wrong signature for support number %d" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"はサポート番号%4$dに対して間違ったシグネチャを持つ関数%3$sを含んでいます" -#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:182 access/gist/gistvalidate.c:181 access/hash/hashvalidate.c:160 access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:200 +#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:182 access/gist/gistvalidate.c:185 access/hash/hashvalidate.c:160 access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:221 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with invalid strategy number %d" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は不正なストラテジ番号%4$dを持つ演算子\"%3$s\"を含んでいます" -#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:195 access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 access/spgist/spgvalidate.c:216 +#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:195 access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 access/spgist/spgvalidate.c:237 #, c-format msgid "operator family \"%s\" of access method %s contains invalid ORDER BY specification for operator %s" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は演算子%3$sに対する不正なORDER BY指定を含んでいます" -#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:208 access/gist/gistvalidate.c:229 access/hash/hashvalidate.c:186 access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:232 +#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:208 access/gist/gistvalidate.c:233 access/hash/hashvalidate.c:186 access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:253 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with wrong signature" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は間違ったシグネチャを持つ演算子%3$sを含んでいます" -#: access/brin/brin_validate.c:236 access/hash/hashvalidate.c:226 access/nbtree/nbtvalidate.c:236 access/spgist/spgvalidate.c:259 +#: access/brin/brin_validate.c:236 access/hash/hashvalidate.c:226 access/nbtree/nbtvalidate.c:236 access/spgist/spgvalidate.c:280 #, c-format msgid "operator family \"%s\" of access method %s is missing operator(s) for types %s and %s" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は%3$sと%4$sの型に対する演算子が含まれていません" @@ -544,12 +629,12 @@ msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は%3$sと%4$sの msgid "operator family \"%s\" of access method %s is missing support function(s) for types %s and %s" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は型%3$sと%4$sに対するサポート関数を含んでいません" -#: access/brin/brin_validate.c:259 access/hash/hashvalidate.c:240 access/nbtree/nbtvalidate.c:260 access/spgist/spgvalidate.c:294 +#: access/brin/brin_validate.c:259 access/hash/hashvalidate.c:240 access/nbtree/nbtvalidate.c:260 access/spgist/spgvalidate.c:315 #, c-format msgid "operator class \"%s\" of access method %s is missing operator(s)" msgstr "アクセスメソッド\"%2$s\"の演算子クラス\"%1$s\"は演算子を含んでいません" -#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:250 access/gist/gistvalidate.c:270 +#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:250 access/gist/gistvalidate.c:274 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d" msgstr "アクセスメソッド\"%2$s\"の演算子クラス\"%1$s\"はサポート関数%3$dを含んでいません" @@ -589,90 +674,100 @@ msgstr "列数(%d)が上限(%d)を超えています" msgid "number of index columns (%d) exceeds limit (%d)" msgstr "インデックス列数(%d)が上限(%d)を超えています" -#: access/common/indextuple.c:187 access/spgist/spgutils.c:704 +#: access/common/indextuple.c:190 access/spgist/spgutils.c:959 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "インデックス行が%zuバイトを必要としますが最大値は%zuです" -#: access/common/printtup.c:369 tcop/fastpath.c:180 tcop/fastpath.c:530 tcop/postgres.c:1904 +#: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 tcop/postgres.c:1914 #, c-format msgid "unsupported format code: %d" msgstr "非サポートの書式コード: %d" -#: access/common/reloptions.c:506 +#: access/common/reloptions.c:521 access/common/reloptions.c:532 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "有効な値の範囲は\"on\"、\"off\"、\"auto\"です。" -#: access/common/reloptions.c:517 +#: access/common/reloptions.c:543 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "有効な値は\"local\"と\"cascaded\"です。" -#: access/common/reloptions.c:665 +#: access/common/reloptions.c:691 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "ユーザ定義リレーションのパラメータ型の制限を超えました" -#: access/common/reloptions.c:1208 +#: access/common/reloptions.c:1234 #, c-format msgid "RESET must not include values for parameters" msgstr "RESETにはパラメータの値を含めてはいけません" -#: access/common/reloptions.c:1240 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "認識できないパラメータ namaspace \"%s\"" -#: access/common/reloptions.c:1277 utils/misc/guc.c:12036 +#: access/common/reloptions.c:1303 utils/misc/guc.c:12885 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "WITH OIDSと定義されたテーブルはサポートされません" -#: access/common/reloptions.c:1447 +#: access/common/reloptions.c:1473 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "認識できないラメータ \"%s\"" -#: access/common/reloptions.c:1559 +#: access/common/reloptions.c:1585 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "パラメータ\"%s\"が複数回指定されました" -#: access/common/reloptions.c:1575 +#: access/common/reloptions.c:1601 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "不正なブール型オプションの値 \"%s\": %s" -#: access/common/reloptions.c:1587 +#: access/common/reloptions.c:1613 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "不正な整数型オプションの値 \"%s\": %s" -#: access/common/reloptions.c:1593 access/common/reloptions.c:1613 +#: access/common/reloptions.c:1619 access/common/reloptions.c:1639 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "値%sはオプション\"%s\"の範囲外です" -#: access/common/reloptions.c:1595 +#: access/common/reloptions.c:1621 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "有効な値の範囲は\"%d\"~\"%d\"です。" -#: access/common/reloptions.c:1607 +#: access/common/reloptions.c:1633 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "不正な浮動小数点型オプションの値 \"%s\": %s" -#: access/common/reloptions.c:1615 +#: access/common/reloptions.c:1641 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "有効な値の範囲は\"%f\"~\"%f\"です。" -#: access/common/reloptions.c:1637 +#: access/common/reloptions.c:1663 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "不正な列挙型オプションの値 \"%s\": %s" -#: access/common/tupdesc.c:840 parser/parse_clause.c:772 parser/parse_relation.c:1803 +#: access/common/toast_compression.c:32 +#, c-format +msgid "compression method lz4 not supported" +msgstr "圧縮方式 lz4 はサポートされていません" + +#: access/common/toast_compression.c:33 +#, c-format +msgid "This functionality requires the server to be built with lz4 support." +msgstr "この機能はlz4lサポート付きでビルドしたサーバを必要とします。" + +#: access/common/tupdesc.c:825 parser/parse_clause.c:773 parser/parse_relation.c:1849 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "列\"%s\"はSETOFとして宣言できません" @@ -702,6 +797,11 @@ msgstr "\"%s\"はGINインデックスではありません" msgid "cannot access temporary indexes of other sessions" msgstr "他のセッションの一時インデックスにはアクセスできません" +#: access/gin/ginget.c:271 access/nbtree/nbtinsert.c:760 +#, c-format +msgid "failed to re-find tuple within index \"%s\"" +msgstr "インデックス\"%s\"内で行の再検索に失敗しました" + #: access/gin/ginscan.c:431 #, c-format msgid "old GIN indexes do not support whole-index scans nor searches for nulls" @@ -712,12 +812,12 @@ msgstr "古いGINインデックスはインデックス全体のスキャンや msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "これを修復するには REINDEX INDEX \"%s\" をおこなってください。" -#: access/gin/ginutil.c:145 executor/execExpr.c:1862 utils/adt/arrayfuncs.c:3811 utils/adt/arrayfuncs.c:6439 utils/adt/rowtypes.c:956 +#: access/gin/ginutil.c:146 executor/execExpr.c:2182 utils/adt/arrayfuncs.c:3819 utils/adt/arrayfuncs.c:6487 utils/adt/rowtypes.c:957 #, c-format msgid "could not identify a comparison function for type %s" msgstr "%s型の比較関数が見つかりません" -#: access/gin/ginvalidate.c:92 access/gist/gistvalidate.c:93 access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:99 +#: access/gin/ginvalidate.c:92 access/gist/gistvalidate.c:93 access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 #, c-format msgid "operator family \"%s\" of access method %s contains support function %s with different left and right input types" msgstr "アクセスメソッド %2$s の演算子族\"%1$s\"が左右辺の入力型が異なるサポート関数 %3$s を含んでいます" @@ -727,26 +827,31 @@ msgstr "アクセスメソッド %2$s の演算子族\"%1$s\"が左右辺の入 msgid "operator class \"%s\" of access method %s is missing support function %d or %d" msgstr "アクセスメソッド\"%2$s\"の演算子クラス\"%1$s\"はサポート関数%3$dまたは%4$dを含んでいません" -#: access/gin/ginvalidate.c:333 access/gist/gistvalidate.c:345 access/spgist/spgvalidate.c:366 +#: access/gin/ginvalidate.c:333 access/gist/gistvalidate.c:350 access/spgist/spgvalidate.c:387 #, c-format msgid "support function number %d is invalid for access method %s" msgstr "サポート関数番号%dはアクセスメソッド%sに対して不正です" -#: access/gist/gist.c:754 access/gist/gistvacuum.c:408 +#: access/gist/gist.c:760 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "インデックス\"%s\"内に無効と判断されている内部タプルがあります" -#: access/gist/gist.c:756 access/gist/gistvacuum.c:410 +#: access/gist/gist.c:762 access/gist/gistvacuum.c:428 #, c-format msgid "This is caused by an incomplete page split at crash recovery before upgrading to PostgreSQL 9.1." msgstr "これは、PostgreSQL 9.1へアップグレードする前のクラッシュリカバリにおける不完全なページ分割が原因で発生します。" -#: access/gist/gist.c:757 access/gist/gistutil.c:786 access/gist/gistutil.c:797 access/gist/gistvacuum.c:411 access/hash/hashutil.c:227 access/hash/hashutil.c:238 access/hash/hashutil.c:250 access/hash/hashutil.c:271 access/nbtree/nbtpage.c:742 access/nbtree/nbtpage.c:753 +#: access/gist/gist.c:763 access/gist/gistutil.c:801 access/gist/gistutil.c:812 access/gist/gistvacuum.c:429 access/hash/hashutil.c:227 access/hash/hashutil.c:238 access/hash/hashutil.c:250 access/hash/hashutil.c:271 access/nbtree/nbtpage.c:810 access/nbtree/nbtpage.c:821 #, c-format msgid "Please REINDEX it." msgstr "REINDEXを行ってください。" +#: access/gist/gist.c:1177 +#, c-format +msgid "fixing incomplete split in index \"%s\", block %u" +msgstr "インデックス\"%s\"内の不完全な分割を修正します、ブロック%u" + #: access/gist/gistsplit.c:446 #, c-format msgid "picksplit method for column %d of index \"%s\" failed" @@ -757,53 +862,53 @@ msgstr "インデックス\"%2$s\"の列%1$dに対するピックスプリット msgid "The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command." msgstr "インデックスは最適ではありません。最適化するためには開発者に連絡するか、この列をCREATE INDEXコマンドの2番目の列としてみてください。" -#: access/gist/gistutil.c:783 access/hash/hashutil.c:224 access/nbtree/nbtpage.c:739 +#: access/gist/gistutil.c:798 access/hash/hashutil.c:224 access/nbtree/nbtpage.c:807 #, c-format msgid "index \"%s\" contains unexpected zero page at block %u" msgstr "インデックス\"%s\"のブロック%uに予期していないゼロで埋められたページがあります" -#: access/gist/gistutil.c:794 access/hash/hashutil.c:235 access/hash/hashutil.c:247 access/nbtree/nbtpage.c:750 +#: access/gist/gistutil.c:809 access/hash/hashutil.c:235 access/hash/hashutil.c:247 access/nbtree/nbtpage.c:818 #, c-format msgid "index \"%s\" contains corrupted page at block %u" msgstr "インデックス\"%s\"のブロック%uに破損したページがあります" -#: access/gist/gistvalidate.c:199 +#: access/gist/gistvalidate.c:203 #, c-format msgid "operator family \"%s\" of access method %s contains unsupported ORDER BY specification for operator %s" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は演算子%3$sに対する非サポートのORDER BY指定を含んでいます" -#: access/gist/gistvalidate.c:210 +#: access/gist/gistvalidate.c:214 #, c-format msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY opfamily specification for operator %s" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は演算子%3$sに対する正しくないORDER BY演算子族を含んでいます" -#: access/hash/hashfunc.c:255 access/hash/hashfunc.c:311 utils/adt/varchar.c:993 utils/adt/varchar.c:1053 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:334 utils/adt/varchar.c:1003 utils/adt/varchar.c:1063 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "文字列のハッシュ値計算で使用する照合順序を特定できませんでした" -#: access/hash/hashfunc.c:256 access/hash/hashfunc.c:312 catalog/heap.c:702 catalog/heap.c:708 commands/createas.c:206 commands/createas.c:489 commands/indexcmds.c:1815 commands/tablecmds.c:15892 commands/view.c:86 parser/parse_utilcmd.c:4116 regex/regc_pg_locale.c:263 utils/adt/formatting.c:1665 utils/adt/formatting.c:1789 utils/adt/formatting.c:1914 utils/adt/like.c:194 utils/adt/like_support.c:1003 utils/adt/varchar.c:733 utils/adt/varchar.c:994 -#: utils/adt/varchar.c:1054 utils/adt/varlena.c:1476 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:335 catalog/heap.c:664 catalog/heap.c:670 commands/createas.c:206 commands/createas.c:503 commands/indexcmds.c:1912 commands/tablecmds.c:17411 commands/view.c:86 regex/regc_pg_locale.c:243 utils/adt/formatting.c:1685 utils/adt/formatting.c:1807 utils/adt/formatting.c:1930 utils/adt/like.c:190 utils/adt/like_support.c:1024 utils/adt/varchar.c:733 utils/adt/varchar.c:1004 utils/adt/varchar.c:1064 +#: utils/adt/varlena.c:1499 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "照合順序を明示するには COLLATE 句を使います。" -#: access/hash/hashinsert.c:82 +#: access/hash/hashinsert.c:83 #, c-format msgid "index row size %zu exceeds hash maximum %zu" msgstr "インデックス行のサイズ%zuがハッシュでの最大値%zuを超えています" -#: access/hash/hashinsert.c:84 access/spgist/spgdoinsert.c:1961 access/spgist/spgutils.c:765 +#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1020 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "バッファページよりも大きな値をインデックスすることはできません。" -#: access/hash/hashovfl.c:87 +#: access/hash/hashovfl.c:88 #, c-format msgid "invalid overflow block number %u" msgstr "不正なオーバーフローブロック番号%u" -#: access/hash/hashovfl.c:283 access/hash/hashpage.c:453 +#: access/hash/hashovfl.c:284 access/hash/hashpage.c:454 #, c-format msgid "out of overflow pages in hash index \"%s\"" msgstr "ハッシュインデックス\"%s\"の中のオーバーフローページが足りません" @@ -833,32 +938,32 @@ msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は演算子%3$s msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は異なる型間に対応する演算子を含んでいません" -#: access/heap/heapam.c:2057 +#: access/heap/heapam.c:2226 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "並列ワーカではタプルの挿入はできません" -#: access/heap/heapam.c:2475 +#: access/heap/heapam.c:2697 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "並列処理中はタプルの削除はできません" -#: access/heap/heapam.c:2521 +#: access/heap/heapam.c:2743 #, c-format msgid "attempted to delete invisible tuple" msgstr "不可視のタプルを削除しようとしました" -#: access/heap/heapam.c:2947 access/heap/heapam.c:5736 +#: access/heap/heapam.c:3175 access/heap/heapam.c:6017 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "並列処理中はタプルの更新はできません" -#: access/heap/heapam.c:3080 +#: access/heap/heapam.c:3299 #, c-format msgid "attempted to update invisible tuple" msgstr "不可視のタプルを更新しようとしました" -#: access/heap/heapam.c:4391 access/heap/heapam.c:4429 access/heap/heapam.c:4686 access/heap/heapam_handler.c:452 +#: access/heap/heapam.c:4661 access/heap/heapam.c:4699 access/heap/heapam.c:4964 access/heap/heapam_handler.c:456 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "リレーション\"%s\"の行ロックを取得できませんでした" @@ -868,241 +973,247 @@ msgstr "リレーション\"%s\"の行ロックを取得できませんでした msgid "tuple to be locked was already moved to another partition due to concurrent update" msgstr "ロック対象のタプルは同時に行われた更新によってすでに他の子テーブルに移動されています" -#: access/heap/hio.c:345 access/heap/rewriteheap.c:662 +#: access/heap/hio.c:360 access/heap/rewriteheap.c:660 #, c-format msgid "row is too big: size %zu, maximum size %zu" msgstr "行が大きすぎます: サイズは%zu、上限は%zu" -#: access/heap/rewriteheap.c:921 +#: access/heap/rewriteheap.c:920 #, c-format msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "ファイル\"%1$s\"に書き込めませんでした、%3$dバイト中%2$dバイト書き込みました: %m" -#: access/heap/rewriteheap.c:1015 access/heap/rewriteheap.c:1134 access/transam/timeline.c:329 access/transam/timeline.c:485 access/transam/xlog.c:3298 access/transam/xlog.c:3470 access/transam/xlog.c:4668 access/transam/xlog.c:10858 access/transam/xlog.c:10896 access/transam/xlog.c:11301 access/transam/xlogfuncs.c:735 postmaster/postmaster.c:4623 replication/logical/origin.c:570 replication/slot.c:1447 storage/file/copydir.c:167 storage/smgr/md.c:218 -#: utils/time/snapmgr.c:1295 +#: access/heap/rewriteheap.c:1013 access/heap/rewriteheap.c:1131 access/transam/timeline.c:329 access/transam/timeline.c:485 access/transam/xlog.c:2963 access/transam/xlog.c:3176 access/transam/xlog.c:3964 access/transam/xlog.c:8635 access/transam/xlogfuncs.c:594 commands/dbcommands.c:521 postmaster/postmaster.c:4582 postmaster/postmaster.c:5603 replication/basebackup_server.c:147 replication/basebackup_server.c:240 replication/logical/origin.c:587 +#: replication/slot.c:1639 storage/file/copydir.c:167 storage/smgr/md.c:222 utils/time/snapmgr.c:1261 #, c-format msgid "could not create file \"%s\": %m" msgstr "ファイル\"%s\"を作成できませんでした: %m" -#: access/heap/rewriteheap.c:1144 +#: access/heap/rewriteheap.c:1141 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "ファイル\"%s\"を%uバイトに切り詰められませんでした: %m" -#: access/heap/rewriteheap.c:1162 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:502 access/transam/xlog.c:3354 access/transam/xlog.c:3526 access/transam/xlog.c:4680 postmaster/postmaster.c:4633 postmaster/postmaster.c:4643 replication/logical/origin.c:582 replication/logical/origin.c:624 replication/logical/origin.c:643 replication/logical/snapbuild.c:1623 replication/slot.c:1482 storage/file/buffile.c:502 -#: storage/file/copydir.c:207 utils/init/miscinit.c:1393 utils/init/miscinit.c:1404 utils/init/miscinit.c:1412 utils/misc/guc.c:8014 utils/misc/guc.c:8045 utils/misc/guc.c:9965 utils/misc/guc.c:9979 utils/time/snapmgr.c:1300 utils/time/snapmgr.c:1307 +#: access/heap/rewriteheap.c:1159 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:502 access/transam/xlog.c:3035 access/transam/xlog.c:3232 access/transam/xlog.c:3976 commands/dbcommands.c:533 postmaster/postmaster.c:4592 postmaster/postmaster.c:4602 replication/logical/origin.c:599 replication/logical/origin.c:641 replication/logical/origin.c:660 replication/logical/snapbuild.c:1634 replication/slot.c:1674 +#: storage/file/buffile.c:537 storage/file/copydir.c:207 utils/init/miscinit.c:1441 utils/init/miscinit.c:1452 utils/init/miscinit.c:1460 utils/misc/guc.c:8653 utils/misc/guc.c:8684 utils/misc/guc.c:10655 utils/misc/guc.c:10669 utils/time/snapmgr.c:1266 utils/time/snapmgr.c:1273 #, c-format msgid "could not write to file \"%s\": %m" msgstr "ファイル\"%s\"を書き出せませんでした: %m" -#: access/heap/rewriteheap.c:1252 access/transam/twophase.c:1601 access/transam/xlogarchive.c:118 access/transam/xlogarchive.c:421 postmaster/postmaster.c:1094 postmaster/syslogger.c:1465 replication/logical/origin.c:558 replication/logical/reorderbuffer.c:3907 replication/logical/snapbuild.c:1565 replication/logical/snapbuild.c:2007 replication/slot.c:1579 storage/file/fd.c:754 storage/file/fd.c:3116 storage/file/fd.c:3178 storage/file/reinit.c:255 -#: storage/ipc/dsm.c:315 storage/smgr/md.c:311 storage/smgr/md.c:367 storage/sync/sync.c:210 utils/time/snapmgr.c:1640 +#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1705 access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:429 postmaster/postmaster.c:1142 postmaster/syslogger.c:1537 replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4398 replication/logical/snapbuild.c:1579 replication/logical/snapbuild.c:1995 replication/slot.c:1771 storage/file/fd.c:795 storage/file/fd.c:3263 storage/file/fd.c:3325 storage/file/reinit.c:262 +#: storage/ipc/dsm.c:317 storage/smgr/md.c:348 storage/smgr/md.c:398 storage/sync/sync.c:250 utils/time/snapmgr.c:1606 #, c-format msgid "could not remove file \"%s\": %m" msgstr "ファイル\"%s\"を削除できませんでした: %m" -#: access/heap/vacuumlazy.c:648 +#: access/heap/vacuumlazy.c:407 +#, c-format +msgid "aggressively vacuuming \"%s.%s.%s\"" +msgstr "\"%s.%s.%s\"に対して積極的VACUUMを実行しています" + +#: access/heap/vacuumlazy.c:412 +#, c-format +msgid "vacuuming \"%s.%s.%s\"" +msgstr "\"%s.%s.%s\"に対してVACUUMを実行しています" + +#: access/heap/vacuumlazy.c:663 +#, c-format +msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" +msgstr "テーブル\"%s.%s.%s\"のVACUUM完了: インデックススキャン: %d\n" + +#: access/heap/vacuumlazy.c:674 #, c-format msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "テーブル\"%s.%s.%s\"の周回防止のための積極的自動VACUUM: インデックススキャン: %d\n" -#: access/heap/vacuumlazy.c:650 +#: access/heap/vacuumlazy.c:676 #, c-format msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "テーブル\"%s.%s.%s\"の周回防止のための自動VACUUM: インデックススキャン: %d\n" -#: access/heap/vacuumlazy.c:655 +#: access/heap/vacuumlazy.c:681 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "テーブル\"%s.%s.%s\"の積極的自動VACUUM: インデックススキャン: %d\n" -#: access/heap/vacuumlazy.c:657 +#: access/heap/vacuumlazy.c:683 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "テーブル\"%s.%s.%s\"の自動VACUUM: インデックススキャン: %d\n" -#: access/heap/vacuumlazy.c:664 -#, c-format -msgid "pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n" -msgstr "ページ: %uを削除、%uが残存、%uがピンによってスキップ、%uが凍結によってスキップ\n" - -#: access/heap/vacuumlazy.c:670 +#: access/heap/vacuumlazy.c:690 #, c-format -msgid "tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable, oldest xmin: %u\n" -msgstr "タプル: %.0fを削除, %.0fが残存, %.0fが参照されていないがまだ削除できない, 最古のxmin: %u\n" +msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" +msgstr "ページ: %u削除、%u残存、%uスキャン (全体の%.2f%%)\n" -#: access/heap/vacuumlazy.c:676 -#, c-format -msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" -msgstr "バッファ使用: %lldヒット, %lld失敗, %lld ダーティ化\n" - -#: access/heap/vacuumlazy.c:680 -#, c-format -msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" -msgstr "平均読み取り速度: %.3f MB/s, 平均書き込み速度: %.3f MB/s\n" - -#: access/heap/vacuumlazy.c:682 +#: access/heap/vacuumlazy.c:697 #, c-format -msgid "system usage: %s\n" -msgstr "システム使用状況: %s\n" +msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" +msgstr "タプル: %lld削除、%lld残存、%lldが削除されているがまだ除去できない\n" -#: access/heap/vacuumlazy.c:684 +#: access/heap/vacuumlazy.c:703 #, c-format -msgid "WAL usage: %ld records, %ld full page images, " -msgstr "WAL出力: %ld レコード, %ld フルページイメージ" +msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" +msgstr "未処理のタプル: クリーンナップロックの競合により、%2$uページ中の%1$lld行の削除済みタプルは除去されません\n" -#: access/heap/vacuumlazy.c:797 +#: access/heap/vacuumlazy.c:708 #, c-format -msgid "aggressively vacuuming \"%s.%s\"" -msgstr "\"%s.%s\"に対して積極的VACUUMを実行しています" +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "削除可能限界: %u、これは処理完了時には%d XID分過去になります\n" -#: access/heap/vacuumlazy.c:802 commands/cluster.c:874 +#: access/heap/vacuumlazy.c:714 #, c-format -msgid "vacuuming \"%s.%s\"" -msgstr "\"%s.%s\"に対してVACUUMを実行しています" +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" +msgstr "新しいrelfrozenxid: %u、これは前回の値よりも%d XID分進んでいます\n" -#: access/heap/vacuumlazy.c:841 +#: access/heap/vacuumlazy.c:721 #, c-format -msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" -msgstr "\"%s\"のVACUUMに対するパラレルオプションを無効化します --- 一時テーブルは並列にVACUUMできません" +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" +msgstr "" +"新しいrelminmxid: %u、これは前回の値よりも%d MXID分進んでいます\n" +"\n" -#: access/heap/vacuumlazy.c:1736 -#, c-format -msgid "\"%s\": removed %.0f row versions in %u pages" -msgstr "\"%s\": %.0f行バージョンを%uページから削除しました" +#: access/heap/vacuumlazy.c:727 +msgid "index scan not needed: " +msgstr "インデックススキャンは不要です: " -#: access/heap/vacuumlazy.c:1746 -#, c-format -msgid "%.0f dead row versions cannot be removed yet, oldest xmin: %u\n" -msgstr "%.0f 個の不要な行バージョンがまだ削除できません、最古のxmin: %u\n" +#: access/heap/vacuumlazy.c:729 +msgid "index scan needed: " +msgstr "インデックススキャンが必要です: " -#: access/heap/vacuumlazy.c:1748 +#: access/heap/vacuumlazy.c:731 #, c-format -msgid "There were %.0f unused item identifiers.\n" -msgstr "%.0f個の使われていないアイテム識別子がありました。\n" +msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" +msgstr "テーブル内の%uページ(全体の%.2f%%)にあった%lld行の削除行識別子が削除されました\n" -#: access/heap/vacuumlazy.c:1750 -#, c-format -msgid "Skipped %u page due to buffer pins, " -msgid_plural "Skipped %u pages due to buffer pins, " -msgstr[0] "バッファピンのため%uページが、" -msgstr[1] "バッファピンのため%uページが、" +#: access/heap/vacuumlazy.c:736 +msgid "index scan bypassed: " +msgstr "インデックススキャンはスキップされました: " -#: access/heap/vacuumlazy.c:1754 -#, c-format -msgid "%u frozen page.\n" -msgid_plural "%u frozen pages.\n" -msgstr[0] "凍結のため%uページがスキップされました。\n" -msgstr[1] "凍結のため%uページがスキップされました。\n" +#: access/heap/vacuumlazy.c:738 +msgid "index scan bypassed by failsafe: " +msgstr "フェイルセーフによりインデックススキャンがスキップされました: " -#: access/heap/vacuumlazy.c:1758 +#: access/heap/vacuumlazy.c:740 #, c-format -msgid "%u page is entirely empty.\n" -msgid_plural "%u pages are entirely empty.\n" -msgstr[0] "%uページが完全に空です。\n" -msgstr[1] "%uページが完全に空です。\n" +msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" +msgstr "テーブル内の%uページ(全体の%.2f%%)には%lld行の削除行識別子があります\n" -#: access/heap/vacuumlazy.c:1762 commands/indexcmds.c:3450 commands/indexcmds.c:3468 +#: access/heap/vacuumlazy.c:755 #, c-format -msgid "%s." -msgstr "%s。" +msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" +msgstr "インデックス\"%s\": ページ数: 合計%u、新規削除%u、削除済%u、再利用可%u\n" -#: access/heap/vacuumlazy.c:1765 +#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 #, c-format -msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u out of %u pages" -msgstr "\"%1$s\": 全 %5$u ページ中の %4$u ページで見つかった行バージョン: 削除可能 %2$.0f 行、削除不可 %3$.0f 行" +msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" +msgstr "I/O時間: 読み込み: %.3fミリ秒, 書き込み: %.3fミリ秒\n" -#: access/heap/vacuumlazy.c:1896 +#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 #, c-format -msgid "\"%s\": removed %d row versions in %d pages" -msgstr "\"%s\": %d行バージョンを%dページから削除しました" +msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" +msgstr "平均読み取り速度: %.3f MB/s, 平均書き込み速度: %.3f MB/s\n" -#: access/heap/vacuumlazy.c:2151 +#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 #, c-format -msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" -msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" -msgstr[0] "インデックスのクリーンアップのために%d個の並列VACUUMワーカを起動しました (計画値: %d)" -msgstr[1] "インデックスのクリーンアップのために%d個の並列VACUUMワーカを起動しました (計画値: %d)" +msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" +msgstr "バッファ使用: %lldヒット, %lld失敗, %lld ダーティ化\n" -#: access/heap/vacuumlazy.c:2157 +#: access/heap/vacuumlazy.c:785 #, c-format -msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" -msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" -msgstr[0] "インデックスのVACUUMのために%d個の並列VACUUMワーカを起動しました (計画値: %d)" -msgstr[1] "インデックスのVACUUMのために%d個の並列VACUUMワーカを起動しました (計画値: %d)" +msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" +msgstr "WAL使用量: %lldのレコード, %lldの全ページイメージ, %lluバイト\n" -#: access/heap/vacuumlazy.c:2449 +#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 #, c-format -msgid "scanned index \"%s\" to remove %d row versions by parallel vacuum worker" -msgstr "%2$d行バージョンを削除するためインデックス\"%1$s\"を並列VACUUMワーカでスキャンしました" +msgid "system usage: %s" +msgstr "システム使用状況: %s" -#: access/heap/vacuumlazy.c:2451 +#: access/heap/vacuumlazy.c:2463 #, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "%2$d行バージョンを削除するためインデックス\"%1$s\"をスキャンしました" +msgid "table \"%s\": removed %lld dead item identifiers in %u pages" +msgstr "テーブル\"%1$s\": %3$uページ内の%2$lldの削除済み行識別子を除去" -#: access/heap/vacuumlazy.c:2515 +#: access/heap/vacuumlazy.c:2629 #, c-format -msgid "index \"%s\" now contains %.0f row versions in %u pages as reported by parallel vacuum worker" -msgstr "並列VACUUMワーカからの報告では、現在インデックス\"%s\"は%.0f行バージョンを%uページで含んでいます" +msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" +msgstr "%4$d回のインデックススキャンののち、フェイルセーフとしてテーブル\"%1$s.%2$s.%3$s\"の必須ではないメンテナンスをスキップします" -#: access/heap/vacuumlazy.c:2517 +#: access/heap/vacuumlazy.c:2634 #, c-format -msgid "index \"%s\" now contains %.0f row versions in %u pages" -msgstr "現在インデックス\"%s\"は%.0f行バージョンを%uページで含んでいます" +msgid "The table's relfrozenxid or relminmxid is too far in the past." +msgstr "このテーブルのrelfrozenxidまたはrelminmxidは古すぎます。" -#: access/heap/vacuumlazy.c:2524 +#: access/heap/vacuumlazy.c:2635 #, c-format msgid "" -"%.0f index row versions were removed.\n" -"%u index pages have been deleted, %u are currently reusable.\n" -"%s." +"Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" +"You might also need to consider other ways for VACUUM to keep up with the allocation of transaction IDs." msgstr "" -"%.0fインデックス行バージョンが削除されました。\n" -"%uインデックスページが削除され、%uページが現在再利用可能です。\n" -"%s。" +"設定パラメータ\"maintenance_work_mem\"または\"autovacuum_work_mem\"を増やすことを検討してください。\n" +"VACUUMがトランザクションIDの割り当てに追従できるようにする他の方法を検討する必要があるかもしれません。" -#: access/heap/vacuumlazy.c:2621 +#: access/heap/vacuumlazy.c:2878 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\":競合するロックが存在するため切り詰めを中断します" -#: access/heap/vacuumlazy.c:2687 +#: access/heap/vacuumlazy.c:2948 +#, c-format +msgid "table \"%s\": truncated %u to %u pages" +msgstr "テーブル\"%s\": %uページから%uページに切り詰め" + +#: access/heap/vacuumlazy.c:3010 #, c-format -msgid "\"%s\": truncated %u to %u pages" -msgstr "\"%s\": %uページから%uページに切り詰められました" +msgid "table \"%s\": suspending truncate due to conflicting lock request" +msgstr "テーブル\"%s\": 競合するロック要求が存在するため、切り詰めを保留します" -#: access/heap/vacuumlazy.c:2752 +#: access/heap/vacuumlazy.c:3170 #, c-format -msgid "\"%s\": suspending truncate due to conflicting lock request" -msgstr "\"%s\": 競合するロック要求が存在するため、切り詰めを保留します" +msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" +msgstr "\"%s\"のVACUUMに対するパラレルオプションを無効化します --- 一時テーブルは並列にVACUUMできません" -#: access/heap/vacuumlazy.c:3499 +#: access/heap/vacuumlazy.c:3383 #, c-format -msgid "starting parallel vacuum worker for %s" -msgstr "\"%s\"に対する並列VACUUMワーカを起動しています" +msgid "while scanning block %u offset %u of relation \"%s.%s\"" +msgstr "リレーション\"%3$s.%4$s\"のブロック%1$u、オフセット%2$uのスキャン中" -#: access/heap/vacuumlazy.c:3590 +#: access/heap/vacuumlazy.c:3386 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "リレーション\\\"%2$s.%3$s\\\"のブロック%1$uのスキャン中" -#: access/heap/vacuumlazy.c:3596 +#: access/heap/vacuumlazy.c:3390 +#, c-format +msgid "while scanning relation \"%s.%s\"" +msgstr "リレーション\"%s.%s\"のスキャン中" + +#: access/heap/vacuumlazy.c:3398 +#, c-format +msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" +msgstr "リレーション\"%3$s.%4$s\"のブロック%1$u、オフセット%2$uのVACUUM処理中" + +#: access/heap/vacuumlazy.c:3401 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "リレーション\\\"%2$s.%3$s\\\"のブロック%1$uのVACUUM処理中" -#: access/heap/vacuumlazy.c:3601 +#: access/heap/vacuumlazy.c:3405 +#, c-format +msgid "while vacuuming relation \"%s.%s\"" +msgstr "リレーション\"%s.%s\"のVACUUM処理中" + +#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1057 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "リレーション\\\"%2$s.%3$s\\\"のインデックス%1$sのVACUUM処理中" -#: access/heap/vacuumlazy.c:3606 +#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1063 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "リレーション\\\"%2$s.%3$s\\\"のインデックス%1$sのクリーンアップ処理中" -#: access/heap/vacuumlazy.c:3612 +#: access/heap/vacuumlazy.c:3421 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "リレーション \"%s.%s\"を%uブロックに切り詰め中" @@ -1117,72 +1228,67 @@ msgstr "アクセスメソッド\"%s\"のタイプが%sではありません" msgid "index access method \"%s\" does not have a handler" msgstr "インデックスアクセスメソッド\"%s\"はハンドラを持っていません" -#: access/index/genam.c:460 +#: access/index/genam.c:489 #, c-format msgid "transaction aborted during system catalog scan" msgstr "システムカタログのスキャン中にトランザクションがアボートしました" -#: access/index/indexam.c:142 catalog/objectaddress.c:1355 commands/indexcmds.c:2517 commands/tablecmds.c:254 commands/tablecmds.c:278 commands/tablecmds.c:15590 commands/tablecmds.c:17045 +#: access/index/indexam.c:142 catalog/objectaddress.c:1376 commands/indexcmds.c:2713 commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:17099 commands/tablecmds.c:18867 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\"はインデックスではありません" -#: access/index/indexam.c:971 +#: access/index/indexam.c:973 #, c-format msgid "operator class %s has no options" msgstr "演算子クラス%sにはオプションはありません" -#: access/nbtree/nbtinsert.c:651 +#: access/nbtree/nbtinsert.c:666 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "重複したキー値は一意性制約\"%s\"違反となります" -#: access/nbtree/nbtinsert.c:653 +#: access/nbtree/nbtinsert.c:668 #, c-format msgid "Key %s already exists." msgstr "キー %s はすでに存在します。" -#: access/nbtree/nbtinsert.c:745 -#, c-format -msgid "failed to re-find tuple within index \"%s\"" -msgstr "インデックス\"%s\"内で行の再検索に失敗しました" - -#: access/nbtree/nbtinsert.c:747 +#: access/nbtree/nbtinsert.c:762 #, c-format msgid "This may be because of a non-immutable index expression." msgstr "これは不変でないインデックス式が原因である可能性があります" -#: access/nbtree/nbtpage.c:151 access/nbtree/nbtpage.c:539 parser/parse_utilcmd.c:2156 +#: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 parser/parse_utilcmd.c:2322 #, c-format msgid "index \"%s\" is not a btree" msgstr "インデックス\"%s\"はbtreeではありません" -#: access/nbtree/nbtpage.c:158 access/nbtree/nbtpage.c:546 +#: access/nbtree/nbtpage.c:166 access/nbtree/nbtpage.c:615 #, c-format msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" msgstr "インデックス\"%s\"におけるバージョンの不整合: ファイルバージョン %d、現在のバージョン %d、サポートされる最小のバージョン %d" -#: access/nbtree/nbtpage.c:1608 +#: access/nbtree/nbtpage.c:1874 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "インデックス\"%s\"に削除処理中の内部ページがあります" -#: access/nbtree/nbtpage.c:1610 +#: access/nbtree/nbtpage.c:1876 #, c-format msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." msgstr "これは9.3かそれ以前のバージョンで、アップグレード前にVACUUMが中断された際に起きた可能性があります。REINDEXしてください。" -#: access/nbtree/nbtutils.c:2664 +#: access/nbtree/nbtutils.c:2669 #, c-format msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" msgstr "インデックス行サイズ%1$zuはインデックス\"%4$s\"でのbtreeバージョン %2$u の最大値%3$zuを超えています" -#: access/nbtree/nbtutils.c:2670 +#: access/nbtree/nbtutils.c:2675 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "インデックス行はリレーション\"%3$s\"のタプル(%1$u,%2$u)を参照しています。" -#: access/nbtree/nbtutils.c:2674 +#: access/nbtree/nbtutils.c:2679 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1196,27 +1302,32 @@ msgstr "" msgid "operator family \"%s\" of access method %s is missing support function for types %s and %s" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は型%3$sと%4$sに対応するサポート関数を含んでいません" -#: access/spgist/spgutils.c:148 +#: access/spgist/spgutils.c:245 #, c-format msgid "compress method must be defined when leaf type is different from input type" msgstr "リーフ型が入力型と異なる場合は圧縮メソッドの定義が必要です" -#: access/spgist/spgutils.c:762 +#: access/spgist/spgutils.c:1017 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "SP-GiST内部タプルのサイズ%zuが最大値%zuを超えています" -#: access/spgist/spgvalidate.c:281 +#: access/spgist/spgvalidate.c:136 +#, c-format +msgid "SP-GiST leaf data type %s does not match declared type %s" +msgstr "SP-GiSTのリーフデータ型%sは宣言された型%sと一致しません" + +#: access/spgist/spgvalidate.c:302 #, c-format msgid "operator family \"%s\" of access method %s is missing support function %d for type %s" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は%4$s型に対するサポート関数%3$dを含んでいません" -#: access/table/table.c:49 access/table/table.c:78 access/table/table.c:111 catalog/aclchk.c:1773 +#: access/table/table.c:49 access/table/table.c:83 access/table/table.c:112 access/table/table.c:145 catalog/aclchk.c:1835 #, c-format msgid "\"%s\" is an index" msgstr "\"%s\"はインデックスです" -#: access/table/table.c:54 access/table/table.c:83 access/table/table.c:116 catalog/aclchk.c:1780 commands/tablecmds.c:12411 commands/tablecmds.c:15599 +#: access/table/table.c:54 access/table/table.c:88 access/table/table.c:117 access/table/table.c:150 catalog/aclchk.c:1842 commands/tablecmds.c:13753 commands/tablecmds.c:17108 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\"は複合型です" @@ -1231,7 +1342,7 @@ msgstr "tid (%u, %u) はリレーション\"%s\"に対して妥当ではあり msgid "%s cannot be empty." msgstr "%sは空にはできません。" -#: access/table/tableamapi.c:122 utils/misc/guc.c:11960 +#: access/table/tableamapi.c:122 utils/misc/guc.c:12809 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s が長過ぎます(最大%d文字)。" @@ -1251,32 +1362,32 @@ msgstr "テーブルアクセスメソッド\"%s\"は存在しません。" msgid "sample percentage must be between 0 and 100" msgstr "サンプリングの割合は0と100の間です" -#: access/transam/commit_ts.c:295 +#: access/transam/commit_ts.c:282 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "トランザクション%uのコミットタイムスタンプは取得できません" -#: access/transam/commit_ts.c:393 +#: access/transam/commit_ts.c:380 #, c-format msgid "could not get commit timestamp data" msgstr "コミットタイムスタンプ情報を取得できません" -#: access/transam/commit_ts.c:395 +#: access/transam/commit_ts.c:382 #, c-format msgid "Make sure the configuration parameter \"%s\" is set on the primary server." msgstr "プライマリサーバで設定パラメータ\"%s\"がonに設定されていることを確認してください。" -#: access/transam/commit_ts.c:397 +#: access/transam/commit_ts.c:384 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "設定パラメータ\"%s\"が設定されていることを確認してください。" -#: access/transam/multixact.c:1002 +#: access/transam/multixact.c:1021 #, c-format msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"" msgstr "データベース\"%s\"におけるMultiXactIds周回によるデータ損失を防ぐために、データベースは新しくMultiXactIdsを生成するコマンドを受け付けません" -#: access/transam/multixact.c:1004 access/transam/multixact.c:1011 access/transam/multixact.c:1035 access/transam/multixact.c:1044 +#: access/transam/multixact.c:1023 access/transam/multixact.c:1030 access/transam/multixact.c:1054 access/transam/multixact.c:1063 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" @@ -1285,70 +1396,61 @@ msgstr "" "そのデータベース全体の VACUUM を実行してください。\n" "古い準備済みトランザクションのコミットまたはロールバック、もしくは古いレプリケーションスロットの削除も必要かもしれません。" -#: access/transam/multixact.c:1009 +#: access/transam/multixact.c:1028 #, c-format msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u" msgstr "OID %u を持つデータベースは周回によるデータ損失を防ぐために、新しいMultiXactIdsを生成するコマンドを受け付けない状態になっています" -#: access/transam/multixact.c:1030 access/transam/multixact.c:2316 +#: access/transam/multixact.c:1049 access/transam/multixact.c:2333 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" msgstr[0] "データベース\"%s\"はあと%u個のMultiXactIdが使われる前にVACUUMする必要があります" -msgstr[1] "データベース\"%s\"はあと%u個のMultiXactIdが使われる前にVACUUMする必要があります" -#: access/transam/multixact.c:1039 access/transam/multixact.c:2325 +#: access/transam/multixact.c:1058 access/transam/multixact.c:2342 #, c-format msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" msgstr[0] "OID %u のデータベースはあと%u個のMultiXactIdが使われる前にVACUUMする必要があります" -msgstr[1] "OID %u のデータベースはあと%u個のMultiXactIdが使われる前にVACUUMする必要があります" -#: access/transam/multixact.c:1100 +#: access/transam/multixact.c:1119 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "マルチトランザクションの\"メンバ\"が制限を超えました" -#: access/transam/multixact.c:1101 +#: access/transam/multixact.c:1120 #, c-format msgid "This command would create a multixact with %u members, but the remaining space is only enough for %u member." msgid_plural "This command would create a multixact with %u members, but the remaining space is only enough for %u members." msgstr[0] "このコマンドで%u個のメンバを持つマルチトランザクションが生成されますが、残りのスペースは %u 個のメンバ分しかありません。" -msgstr[1] "このコマンドで%u個のメンバを持つマルチトランザクションが生成されますが、残りのスペースは %u 個のメンバ分しかありません。" -#: access/transam/multixact.c:1106 +#: access/transam/multixact.c:1125 #, c-format msgid "Execute a database-wide VACUUM in database with OID %u with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." msgstr "vacuum_multixact_freeze_min_age と vacuum_multixact_freeze_table_age をより小さな値に設定してOID %u のデータベースでデータベース全体にVACUUMを実行してください。" -#: access/transam/multixact.c:1137 +#: access/transam/multixact.c:1156 #, c-format msgid "database with OID %u must be vacuumed before %d more multixact member is used" msgid_plural "database with OID %u must be vacuumed before %d more multixact members are used" msgstr[0] "OID %u のデータベースは更に%d個のマルチトランザクションメンバが使用される前にVACUUMを実行する必要があります" -msgstr[1] "OID %u のデータベースは更に%d個のマルチトランザクションメンバが使用される前にVACUUMを実行する必要があります" -#: access/transam/multixact.c:1142 +#: access/transam/multixact.c:1161 #, c-format msgid "Execute a database-wide VACUUM in that database with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." msgstr "vacuum_multixact_freeze_min_age と vacuum_multixact_freeze_table_age をより小さな値に設定した上で、そのデータベースでVACUUMを実行してください。" -#: access/transam/multixact.c:1279 +#: access/transam/multixact.c:1300 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "MultiXactId %uはもう存在しません: 周回しているようです" -#: access/transam/multixact.c:1287 +#: access/transam/multixact.c:1306 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "MultiXactId %uを作成できませんでした: 周回している様子" -#: access/transam/multixact.c:2266 -#, c-format -msgid "MultiXactId wrap limit is %u, limited by database with OID %u" -msgstr "MultiXactIdの周回制限は %u で、OID %u を持つデータベースにより制限されています" - -#: access/transam/multixact.c:2321 access/transam/multixact.c:2330 access/transam/varsup.c:151 access/transam/varsup.c:158 access/transam/varsup.c:466 access/transam/varsup.c:473 +#: access/transam/multixact.c:2338 access/transam/multixact.c:2347 access/transam/varsup.c:151 access/transam/varsup.c:158 access/transam/varsup.c:466 access/transam/varsup.c:473 #, c-format msgid "" "To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" @@ -1357,135 +1459,175 @@ msgstr "" "データベースの停止を防ぐために、データベース全体の VACUUM を実行してください。\n" "古い準備済みトランザクションのコミットまたはロールバック、もしくは古いレプリケーションスロットの削除も必要かもしれません。" -#: access/transam/multixact.c:2600 -#, c-format -msgid "oldest MultiXactId member is at offset %u" -msgstr "最古のMultiXactIdメンバはオフセット%uにあります" - -#: access/transam/multixact.c:2604 +#: access/transam/multixact.c:2621 #, c-format msgid "MultiXact member wraparound protections are disabled because oldest checkpointed MultiXact %u does not exist on disk" msgstr "最古のチェックポイント済みのマルチトランザクション%uがディスク上に存在しないため、マルチトランザクションメンバーの周回防止機能を無効にしました" -#: access/transam/multixact.c:2626 +#: access/transam/multixact.c:2643 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "マルチトランザクションメンバーの周回防止機能が有効になりました" -#: access/transam/multixact.c:2629 -#, c-format -msgid "MultiXact member stop limit is now %u based on MultiXact %u" -msgstr "マルチトランザクションの停止上限がマルチトランザクション%2$uを起点にして%1$uになりました" - -#: access/transam/multixact.c:3009 +#: access/transam/multixact.c:3030 #, c-format msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" msgstr "最古のマルチトランザクション%uが見つかりません、アクセス可能な最古のものは%u、切り詰めをスキップします" -#: access/transam/multixact.c:3027 +#: access/transam/multixact.c:3048 #, c-format msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" msgstr "マルチトランザクション%uがディスク上に存在しないため、そこまでの切り詰めができません、切り詰めをスキップします" -#: access/transam/multixact.c:3341 +#: access/transam/multixact.c:3362 #, c-format msgid "invalid MultiXactId: %u" msgstr "不正なMultiXactId: %u" -#: access/transam/parallel.c:706 access/transam/parallel.c:825 +#: access/transam/parallel.c:718 access/transam/parallel.c:837 #, c-format msgid "parallel worker failed to initialize" msgstr "パラレルワーカの初期化に失敗しました" -#: access/transam/parallel.c:707 access/transam/parallel.c:826 +#: access/transam/parallel.c:719 access/transam/parallel.c:838 #, c-format msgid "More details may be available in the server log." msgstr "詳細な情報がはサーバログにあるかもしれません。" -#: access/transam/parallel.c:887 +#: access/transam/parallel.c:899 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "並列処理中にpostmasterが終了しました" -#: access/transam/parallel.c:1074 +#: access/transam/parallel.c:1086 #, c-format msgid "lost connection to parallel worker" msgstr "パラレルワーカへの接続を失いました" -#: access/transam/parallel.c:1140 access/transam/parallel.c:1142 +#: access/transam/parallel.c:1152 access/transam/parallel.c:1154 msgid "parallel worker" msgstr "パラレルワーカ" -#: access/transam/parallel.c:1293 +#: access/transam/parallel.c:1307 #, c-format msgid "could not map dynamic shared memory segment" msgstr "動的共有メモリセグメントをマップできませんでした" -#: access/transam/parallel.c:1298 +#: access/transam/parallel.c:1312 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "動的共有メモリセグメントのマジックナンバーが不正です" -#: access/transam/slru.c:696 +#: access/transam/rmgr.c:84 +#, c-format +msgid "resource manager with ID %d not registered" +msgstr "ID %dのリソースマネージャーは登録されていません" + +#: access/transam/rmgr.c:85 +#, c-format +msgid "Include the extension module that implements this resource manager in shared_preload_libraries." +msgstr "このリソースマネージャを実装する拡張モジュールをshared_preload_librariesに加えてください。" + +#: access/transam/rmgr.c:101 +#, c-format +msgid "custom resource manager name is invalid" +msgstr "独自リソースマネージャの名前が不正です" + +#: access/transam/rmgr.c:102 +#, c-format +msgid "Provide a non-empty name for the custom resource manager." +msgstr "独自リソースマネージャ名には空ではない文字列を設定してください。" + +#: access/transam/rmgr.c:105 +#, c-format +msgid "custom resource manager ID %d is out of range" +msgstr "独自リソースマネージャのID %dは範囲外です" + +#: access/transam/rmgr.c:106 +#, c-format +msgid "Provide a custom resource manager ID between %d and %d." +msgstr "独自リソースマネージャIDは%dから%dの間の値で指定してください。" + +#: access/transam/rmgr.c:111 access/transam/rmgr.c:116 access/transam/rmgr.c:128 +#, c-format +msgid "failed to register custom resource manager \"%s\" with ID %d" +msgstr "独自リソースマネージャ\"%s\"のID %dでの登録に失敗しました" + +#: access/transam/rmgr.c:112 +#, c-format +msgid "Custom resource manager must be registered while initializing modules in shared_preload_libraries." +msgstr "独自リソースマネージャはshared_preload_librariesにあるモジュールの初期化中に登録する必要があります。" + +#: access/transam/rmgr.c:117 +#, c-format +msgid "Custom resource manager \"%s\" already registered with the same ID." +msgstr "独自リソースマネージャ\"%s\"はすでに同一のIDで登録されています。" + +#: access/transam/rmgr.c:129 +#, c-format +msgid "Existing resource manager with ID %d has the same name." +msgstr "ID %d の既存の独自リソースマネージャが同じ名前です。" + +#: access/transam/rmgr.c:135 +#, c-format +msgid "registered custom resource manager \"%s\" with ID %d" +msgstr "独自リソースマネージャ\"%s\"をID %dで登録しました" + +#: access/transam/slru.c:713 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "ファイル\"%s\"が存在しません。ゼロとして読み込みます" -#: access/transam/slru.c:920 access/transam/slru.c:926 access/transam/slru.c:934 access/transam/slru.c:939 access/transam/slru.c:946 access/transam/slru.c:951 access/transam/slru.c:958 access/transam/slru.c:965 +#: access/transam/slru.c:945 access/transam/slru.c:951 access/transam/slru.c:959 access/transam/slru.c:964 access/transam/slru.c:971 access/transam/slru.c:976 access/transam/slru.c:983 access/transam/slru.c:990 #, c-format msgid "could not access status of transaction %u" msgstr "トランザクション%uのステータスにアクセスできませんでした" -#: access/transam/slru.c:921 +#: access/transam/slru.c:946 #, c-format msgid "Could not open file \"%s\": %m." msgstr "ファイル\"%s\"をオープンできませんでした: %m。" -#: access/transam/slru.c:927 +#: access/transam/slru.c:952 #, c-format -msgid "Could not seek in file \"%s\" to offset %u: %m." -msgstr "ファイル\"%s\"のオフセット%uにシークできませんでした: %m。" +msgid "Could not seek in file \"%s\" to offset %d: %m." +msgstr "ファイル\"%s\"のオフセット%dにシークできませんでした: %m。" -#: access/transam/slru.c:935 +#: access/transam/slru.c:960 #, c-format -msgid "Could not read from file \"%s\" at offset %u: %m." -msgstr "ファイル\"%s\"のオフセット%uを読み取れませんでした: %m。" +msgid "Could not read from file \"%s\" at offset %d: %m." +msgstr "ファイル\"%s\"のオフセット%dを読み取れませんでした: %m。" -#: access/transam/slru.c:940 +#: access/transam/slru.c:965 #, c-format -msgid "Could not read from file \"%s\" at offset %u: read too few bytes." -msgstr "ファイル\"%s\"のオフセット%uを読み取れませんでした: 読み込んだバイト数が足りません。" +msgid "Could not read from file \"%s\" at offset %d: read too few bytes." +msgstr "ファイル\"%s\"のオフセット%dを読み取れませんでした: 読み込んだバイト数が足りません。" -#: access/transam/slru.c:947 +#: access/transam/slru.c:972 #, c-format -msgid "Could not write to file \"%s\" at offset %u: %m." -msgstr "ファイル\"%s\"のオフセット%uに書き出せませんでした: %m。" +msgid "Could not write to file \"%s\" at offset %d: %m." +msgstr "ファイル\"%s\"のオフセット%dに書き出せませんでした: %m。" -#: access/transam/slru.c:952 +#: access/transam/slru.c:977 #, c-format -msgid "Could not write to file \"%s\" at offset %u: wrote too few bytes." -msgstr "ファイル\"%s\"のオフセット%uに書き出せませんでした: 書き込んだバイト数が足りません。" +msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." +msgstr "ファイル\"%s\"のオフセット%dに書き出せませんでした: 書き込んだバイト数が足りません。" -#: access/transam/slru.c:959 +#: access/transam/slru.c:984 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "ファイル\"%s\"をfsyncできませんでした: %m。" -#: access/transam/slru.c:966 +#: access/transam/slru.c:991 #, c-format msgid "Could not close file \"%s\": %m." msgstr "ファイル\"%s\"をクローズできませんでした: %m。" -#: access/transam/slru.c:1237 +#: access/transam/slru.c:1252 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "ディレクトリ\"%s\"を切り詰めできませんでした: 明らかに周回しています" -#: access/transam/slru.c:1292 access/transam/slru.c:1348 -#, c-format -msgid "removing file \"%s\"" -msgstr "ファイル\"%s\"を削除しています" - #: access/transam/timeline.c:163 access/transam/timeline.c:168 #, c-format msgid "syntax error in history file: %s" @@ -1526,156 +1668,164 @@ msgstr "タイムラインIDは子のタイムラインIDより小さくなけ msgid "requested timeline %u is not in this server's history" msgstr "要求されたタイムライン%uがサーバの履歴上に存在しません" -#: access/transam/twophase.c:381 +#: access/transam/twophase.c:385 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "トランザクション識別子\"%s\"は長すぎます" -#: access/transam/twophase.c:388 +#: access/transam/twophase.c:392 #, c-format msgid "prepared transactions are disabled" msgstr "トランザクションの準備は無効にされているためできません。" -#: access/transam/twophase.c:389 +#: access/transam/twophase.c:393 #, c-format msgid "Set max_prepared_transactions to a nonzero value." msgstr "max_prepared_transactionsを非ゼロに設定してください。" -#: access/transam/twophase.c:408 +#: access/transam/twophase.c:412 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "トランザクション識別子\"%s\"はすでに存在します" -#: access/transam/twophase.c:417 access/transam/twophase.c:2360 +#: access/transam/twophase.c:421 access/transam/twophase.c:2486 #, c-format msgid "maximum number of prepared transactions reached" msgstr "準備済みのトランザクションの最大数に達しました" -#: access/transam/twophase.c:418 access/transam/twophase.c:2361 +#: access/transam/twophase.c:422 access/transam/twophase.c:2487 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "max_prepared_transactionsを増加してください(現状%d)。" -#: access/transam/twophase.c:583 +#: access/transam/twophase.c:598 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "識別子\"%s\"の準備されたトランザクションのロックが取得できません" -#: access/transam/twophase.c:589 +#: access/transam/twophase.c:604 #, c-format msgid "permission denied to finish prepared transaction" msgstr "準備されたトランザクションの終了が拒否されました" -#: access/transam/twophase.c:590 +#: access/transam/twophase.c:605 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "スーパユーザまたはこのトランザクションを準備したユーザである必要があります。" -#: access/transam/twophase.c:601 +#: access/transam/twophase.c:616 #, c-format msgid "prepared transaction belongs to another database" msgstr "準備されたトランザクションは別のデータベースに属しています" -#: access/transam/twophase.c:602 +#: access/transam/twophase.c:617 #, c-format msgid "Connect to the database where the transaction was prepared to finish it." msgstr "終了させるためにはこのトランザクションを準備したデータベースに接続してください。" -#: access/transam/twophase.c:617 +#: access/transam/twophase.c:632 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "識別子\"%s\"の準備されたトランザクションはありません" -#: access/transam/twophase.c:1092 +#: access/transam/twophase.c:1169 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "2相状態ファイルの最大長が制限を超えました" -#: access/transam/twophase.c:1246 +#: access/transam/twophase.c:1324 #, c-format -msgid "incorrect size of file \"%s\": %zu byte" -msgid_plural "incorrect size of file \"%s\": %zu bytes" -msgstr[0] "ファイル\"%s\"のサイズが不正: %zu バイト" -msgstr[1] "ファイル\"%s\"のサイズが不正: %zu バイト" +msgid "incorrect size of file \"%s\": %lld byte" +msgid_plural "incorrect size of file \"%s\": %lld bytes" +msgstr[0] "ファイル\"%s\"のサイズが不正: %lld バイト" -#: access/transam/twophase.c:1255 +#: access/transam/twophase.c:1333 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "ファイル\"%s\"のCRCオフセットのアライメントが不正です" -#: access/transam/twophase.c:1288 +#: access/transam/twophase.c:1351 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$lldバイトのうち%2$dバイトを読み込みました" + +#: access/transam/twophase.c:1366 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "ファイル\"%s\"に格納されているマジックナンバーが不正です" -#: access/transam/twophase.c:1294 +#: access/transam/twophase.c:1372 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "ファイル\"%s\"内に格納されているサイズが不正です" -#: access/transam/twophase.c:1306 +#: access/transam/twophase.c:1384 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "算出されたCRCチェックサムがファイル\"%s\"に格納されている値と一致しません" -#: access/transam/twophase.c:1336 access/transam/xlog.c:6492 +#: access/transam/twophase.c:1414 access/transam/xlogrecovery.c:568 replication/logical/logical.c:206 replication/walsender.c:703 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "WALリーダの割り当てに中に失敗しました。" -#: access/transam/twophase.c:1343 +#: access/transam/twophase.c:1424 +#, c-format +msgid "could not read two-phase state from WAL at %X/%X: %s" +msgstr "WALの%X/%Xから2相状態を読み取れませんでした: %s" + +#: access/transam/twophase.c:1429 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "WALの%X/%Xから2相状態を読み取れませんでした" -#: access/transam/twophase.c:1351 +#: access/transam/twophase.c:1437 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "WALの%X/%Xにあるはずの2相状態のデータがありません" -#: access/transam/twophase.c:1629 +#: access/transam/twophase.c:1733 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "ファイル\"%s\"を再作成できませんでした: %m" -#: access/transam/twophase.c:1756 +#: access/transam/twophase.c:1860 #, c-format msgid "%u two-phase state file was written for a long-running prepared transaction" msgid_plural "%u two-phase state files were written for long-running prepared transactions" msgstr[0] "長時間実行中の準備済みトランザクションのために%u個の2相状態ファイルが書き込まれました" -msgstr[1] "長時間実行中の準備済みトランザクションのために%u個の2相状態ファイルが書き込まれました" -#: access/transam/twophase.c:1990 +#: access/transam/twophase.c:2094 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "共有メモリから準備済みトランザクション%uを復元します" -#: access/transam/twophase.c:2081 +#: access/transam/twophase.c:2187 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "不要になったトランザクション%uの2相状態ファイルを削除します" -#: access/transam/twophase.c:2088 +#: access/transam/twophase.c:2194 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "不要になったトランザクション%uの2相状態をメモリから削除します" -#: access/transam/twophase.c:2101 +#: access/transam/twophase.c:2207 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "未来のトランザクション%uの2相状態ファイルを削除します" -#: access/transam/twophase.c:2108 +#: access/transam/twophase.c:2214 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "未来のトランザクション%uの2相状態をメモリから削除します" -#: access/transam/twophase.c:2133 +#: access/transam/twophase.c:2239 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "トランザクション%uの2相状態ファイルが破損しています" -#: access/transam/twophase.c:2138 +#: access/transam/twophase.c:2244 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "メモリ上にあるトランザクション%uの2相状態が破損しています" @@ -1709,1991 +1859,1989 @@ msgstr "データベース\"%s\"は%uトランザクション以内にVACUUMす msgid "database with OID %u must be vacuumed within %u transactions" msgstr "OID %uのデータベースは%uトランザクション以内にVACUUMを実行する必要があります" -#: access/transam/varsup.c:428 -#, c-format -msgid "transaction ID wrap limit is %u, limited by database with OID %u" -msgstr "トランザクションIDの周回制限値はOID %uのデータベースにより%uに制限されています" - -#: access/transam/xact.c:1045 +#: access/transam/xact.c:1098 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "1トランザクション内では 2^32-2 個より多くのコマンドを実行できません" -#: access/transam/xact.c:1582 +#: access/transam/xact.c:1644 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "コミットされたサブトランザクション数の最大値(%d)が制限を越えました" -#: access/transam/xact.c:2422 +#: access/transam/xact.c:2501 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "一時オブジェクトに対する操作を行ったトランザクションをPREPAREすることはできません" -#: access/transam/xact.c:2432 +#: access/transam/xact.c:2511 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "エクスポートされたスナップショットを持つトランザクションをPREPAREすることはできません" -#: access/transam/xact.c:2441 -#, c-format -msgid "cannot PREPARE a transaction that has manipulated logical replication workers" -msgstr "論理レプリケーションワーカから操作されたトランザクションをPREPAREすることはできません" - #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3389 +#: access/transam/xact.c:3471 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%sはトランザクションブロックの内側では実行できません" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3399 +#: access/transam/xact.c:3481 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%sはサブトランザクションブロックの内側では実行できません" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3409 +#: access/transam/xact.c:3491 #, c-format msgid "%s cannot be executed from a function" msgstr "%s は関数内での実行はできません" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3478 access/transam/xact.c:3784 access/transam/xact.c:3863 access/transam/xact.c:3986 access/transam/xact.c:4137 access/transam/xact.c:4206 access/transam/xact.c:4317 +#: access/transam/xact.c:3560 access/transam/xact.c:3866 access/transam/xact.c:3945 access/transam/xact.c:4068 access/transam/xact.c:4219 access/transam/xact.c:4288 access/transam/xact.c:4399 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%sはトランザクションブロック内でのみ使用できます" -#: access/transam/xact.c:3670 +#: access/transam/xact.c:3752 #, c-format msgid "there is already a transaction in progress" msgstr "すでにトランザクションが実行中です" -#: access/transam/xact.c:3789 access/transam/xact.c:3868 access/transam/xact.c:3991 +#: access/transam/xact.c:3871 access/transam/xact.c:3950 access/transam/xact.c:4073 #, c-format msgid "there is no transaction in progress" msgstr "実行中のトランザクションがありません" -#: access/transam/xact.c:3879 +#: access/transam/xact.c:3961 #, c-format msgid "cannot commit during a parallel operation" msgstr "並列処理中にはコミットはできません" -#: access/transam/xact.c:4002 +#: access/transam/xact.c:4084 #, c-format msgid "cannot abort during a parallel operation" msgstr "パラレル処理中にロールバックはできません" -#: access/transam/xact.c:4101 +#: access/transam/xact.c:4183 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "パラレル処理中にセーブポイントは定義できません" -#: access/transam/xact.c:4188 +#: access/transam/xact.c:4270 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "並列処理中はセーブポイントの解放はできません" -#: access/transam/xact.c:4198 access/transam/xact.c:4249 access/transam/xact.c:4309 access/transam/xact.c:4358 +#: access/transam/xact.c:4280 access/transam/xact.c:4331 access/transam/xact.c:4391 access/transam/xact.c:4440 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "セーブポイント\"%s\"は存在しません" -#: access/transam/xact.c:4255 access/transam/xact.c:4364 +#: access/transam/xact.c:4337 access/transam/xact.c:4446 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "セーブポイント\"%s\"は現在のセーブポイントレベルには存在しません" -#: access/transam/xact.c:4297 +#: access/transam/xact.c:4379 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "パラレル処理中にセーブポイントのロールバックはできません" -#: access/transam/xact.c:4425 +#: access/transam/xact.c:4507 #, c-format msgid "cannot start subtransactions during a parallel operation" msgstr "並列処理中はサブトランザクションを開始できません" -#: access/transam/xact.c:4493 +#: access/transam/xact.c:4575 #, c-format msgid "cannot commit subtransactions during a parallel operation" msgstr "並列処理中はサブトランザクションをコミットできません" -#: access/transam/xact.c:5136 +#: access/transam/xact.c:5222 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "1トランザクション内には 2^32-1 個より多くのサブトランザクションを作成できません" -#: access/transam/xlog.c:2552 +#: access/transam/xlog.c:1463 #, c-format -msgid "could not write to log file %s at offset %u, length %zu: %m" -msgstr "ログファイル%sのオフセット%uに長さ%zuの書き込みができませんでした: %m" +msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" +msgstr "生成されたWALより先の位置までのフラッシュ要求; 要求 %X/%X, 現在位置 %X/%X" -#: access/transam/xlog.c:2828 +#: access/transam/xlog.c:2224 #, c-format -msgid "updated min recovery point to %X/%X on timeline %u" -msgstr "最小リカバリポイントをタイムライン%3$uの%1$X/%2$Xに更新しました" +msgid "could not write to log file %s at offset %u, length %zu: %m" +msgstr "ログファイル%sのオフセット%uに長さ%zuの書き込みができませんでした: %m" -#: access/transam/xlog.c:3942 access/transam/xlogutils.c:801 replication/walsender.c:2503 +#: access/transam/xlog.c:3471 access/transam/xlogutils.c:846 replication/walsender.c:2699 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "要求された WAL セグメント %s はすでに削除されています" -#: access/transam/xlog.c:4185 -#, c-format -msgid "recycled write-ahead log file \"%s\"" -msgstr "先行書き込みログファイル\"%s\"を再利用しました" - -#: access/transam/xlog.c:4197 -#, c-format -msgid "removing write-ahead log file \"%s\"" -msgstr "先行書き込みログファイル\"%s\"を削除します" - -#: access/transam/xlog.c:4217 +#: access/transam/xlog.c:3756 #, c-format msgid "could not rename file \"%s\": %m" msgstr "ファイル\"%s\"の名前を変更できませんでした: %m" -#: access/transam/xlog.c:4259 access/transam/xlog.c:4269 +#: access/transam/xlog.c:3798 access/transam/xlog.c:3808 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "WALディレクトリ\"%s\"は存在しません" -#: access/transam/xlog.c:4275 +#: access/transam/xlog.c:3814 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "なかったWALディレクトリ\"%s\"を作成しています" -#: access/transam/xlog.c:4278 +#: access/transam/xlog.c:3817 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "なかったディレクトリ\"%s\"の作成に失敗しました: %m" -#: access/transam/xlog.c:4381 -#, c-format -msgid "unexpected timeline ID %u in log segment %s, offset %u" -msgstr "ログファイル%2$s、オフセット%3$uのタイムラインID%1$uは想定外です" - -#: access/transam/xlog.c:4519 -#, c-format -msgid "new timeline %u is not a child of database system timeline %u" -msgstr "新しいタイムライン%uはデータベースシステムのタイムライン%uの子ではありません" - -#: access/transam/xlog.c:4533 -#, c-format -msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" -msgstr "新しいタイムライン%uは現在のデータベースシステムのタイムライン%uから現在のリカバリポイント%X/%Xより前に分岐しています" - -#: access/transam/xlog.c:4552 -#, c-format -msgid "new target timeline is %u" -msgstr "新しい目標タイムラインは%uです" - -#: access/transam/xlog.c:4588 +#: access/transam/xlog.c:3884 #, c-format msgid "could not generate secret authorization token" msgstr "秘密の認証トークンを生成できませんでした" -#: access/transam/xlog.c:4747 access/transam/xlog.c:4756 access/transam/xlog.c:4780 access/transam/xlog.c:4787 access/transam/xlog.c:4794 access/transam/xlog.c:4799 access/transam/xlog.c:4806 access/transam/xlog.c:4813 access/transam/xlog.c:4820 access/transam/xlog.c:4827 access/transam/xlog.c:4834 access/transam/xlog.c:4841 access/transam/xlog.c:4850 access/transam/xlog.c:4857 utils/init/miscinit.c:1550 +#: access/transam/xlog.c:4043 access/transam/xlog.c:4052 access/transam/xlog.c:4076 access/transam/xlog.c:4083 access/transam/xlog.c:4090 access/transam/xlog.c:4095 access/transam/xlog.c:4102 access/transam/xlog.c:4109 access/transam/xlog.c:4116 access/transam/xlog.c:4123 access/transam/xlog.c:4130 access/transam/xlog.c:4137 access/transam/xlog.c:4146 access/transam/xlog.c:4153 utils/init/miscinit.c:1598 #, c-format msgid "database files are incompatible with server" msgstr "データベースファイルがサーバと互換性がありません" -#: access/transam/xlog.c:4748 +#: access/transam/xlog.c:4044 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." msgstr "データベースクラスタはPG_CONTROL_VERSION %d (0x%08x)で初期化されましたが、サーバはPG_CONTROL_VERSION %d (0x%08x)でコンパイルされています。" -#: access/transam/xlog.c:4752 +#: access/transam/xlog.c:4048 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." msgstr "これはバイトオーダの不整合の可能性があります。initdbを実行する必要がありそうです。" -#: access/transam/xlog.c:4757 +#: access/transam/xlog.c:4053 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." msgstr "データベースクラスタはPG_CONTROL_VERSION %d で初期化されましたが、サーバは PG_CONTROL_VERSION %d でコンパイルされています。" -#: access/transam/xlog.c:4760 access/transam/xlog.c:4784 access/transam/xlog.c:4791 access/transam/xlog.c:4796 +#: access/transam/xlog.c:4056 access/transam/xlog.c:4080 access/transam/xlog.c:4087 access/transam/xlog.c:4092 #, c-format msgid "It looks like you need to initdb." msgstr "initdbが必要のようです。" -#: access/transam/xlog.c:4771 +#: access/transam/xlog.c:4067 #, c-format msgid "incorrect checksum in control file" msgstr "制御ファイル内のチェックサムが不正です" -#: access/transam/xlog.c:4781 +#: access/transam/xlog.c:4077 #, c-format msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." msgstr "データベースクラスタは CATALOG_VERSION_NO %d で初期化されましたが、サーバは CATALOG_VERSION_NO %d でコンパイルされています。" -#: access/transam/xlog.c:4788 +#: access/transam/xlog.c:4084 #, c-format msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." msgstr "データベースクラスタは MAXALIGN %d で初期化されましたが、サーバは MAXALIGN %d でコンパイルされています。" -#: access/transam/xlog.c:4795 +#: access/transam/xlog.c:4091 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "データベースクラスタはサーバ実行ファイルと異なる浮動小数点書式を使用しているようです。" -#: access/transam/xlog.c:4800 +#: access/transam/xlog.c:4096 #, c-format msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." msgstr "データベースクラスタは BLCKSZ %d で初期化されましたが、サーバは BLCKSZ %d でコンパイルされています。" -#: access/transam/xlog.c:4803 access/transam/xlog.c:4810 access/transam/xlog.c:4817 access/transam/xlog.c:4824 access/transam/xlog.c:4831 access/transam/xlog.c:4838 access/transam/xlog.c:4845 access/transam/xlog.c:4853 access/transam/xlog.c:4860 +#: access/transam/xlog.c:4099 access/transam/xlog.c:4106 access/transam/xlog.c:4113 access/transam/xlog.c:4120 access/transam/xlog.c:4127 access/transam/xlog.c:4134 access/transam/xlog.c:4141 access/transam/xlog.c:4149 access/transam/xlog.c:4156 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "再コンパイルもしくは initdb が必要そうです。" -#: access/transam/xlog.c:4807 +#: access/transam/xlog.c:4103 #, c-format msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." msgstr "データベースクラスタは RELSEG_SIZE %d で初期化されましたが、サーバは RELSEG_SIZE %d でコンパイルされています。" -#: access/transam/xlog.c:4814 +#: access/transam/xlog.c:4110 #, c-format msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." msgstr "データベースクラスタは XLOG_BLCKSZ %d で初期化されましたが、サーバは XLOG_BLCKSZ %d でコンパイルされています。" -#: access/transam/xlog.c:4821 +#: access/transam/xlog.c:4117 #, c-format msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." msgstr "データベースクラスタは NAMEDATALEN %d で初期化されましたが、サーバは NAMEDATALEN %d でコンパイルされています。" -#: access/transam/xlog.c:4828 +#: access/transam/xlog.c:4124 #, c-format msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." msgstr "データベースクラスタは INDEX_MAX_KEYS %d で初期化されましたが、サーバは INDEX_MAX_KEYS %d でコンパイルされています。" -#: access/transam/xlog.c:4835 +#: access/transam/xlog.c:4131 #, c-format msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." msgstr "データベースクラスタは TOAST_MAX_CHUNK_SIZE %d で初期化されましたが、サーバは TOAST_MAX_CHUNK_SIZE %d でコンパイルされています。" -#: access/transam/xlog.c:4842 +#: access/transam/xlog.c:4138 #, c-format msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." msgstr "データベースクラスタは LOBLKSIZE %d で初期化されましたが、サーバは LOBLKSIZE %d でコンパイルされています。" -#: access/transam/xlog.c:4851 +#: access/transam/xlog.c:4147 #, c-format msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." msgstr "データベースクラスタは USE_FLOAT8_BYVAL なしで初期化されましたが、サーバ側は USE_FLOAT8_BYVAL 付きでコンパイルされています。" -#: access/transam/xlog.c:4858 +#: access/transam/xlog.c:4154 #, c-format msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." msgstr "データベースクラスタは USE_FLOAT8_BYVAL 付きで初期化されましたが、サーバ側は USE_FLOAT8_BYVAL なしでコンパイルされています。" -#: access/transam/xlog.c:4867 +#: access/transam/xlog.c:4163 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" msgstr[0] "WALセグメントのサイズ指定は1MBと1GBの間の2の累乗でなければなりません、しかしコントロールファイルでは%dバイトとなっています" -msgstr[1] "WALセグメントのサイズ指定は1MBと1GBの間の2の累乗でなければなりません、しかしコントロールファイルでは%dバイトとなっています" -#: access/transam/xlog.c:4879 +#: access/transam/xlog.c:4175 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"min_wal_size\"は最低でも\"wal_segment_size\"の2倍である必要があります。" -#: access/transam/xlog.c:4883 +#: access/transam/xlog.c:4179 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"max_wal_size\"は最低でも\"wal_segment_size\"の2倍である必要があります。" -#: access/transam/xlog.c:5316 +#: access/transam/xlog.c:4611 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "ブートストラップの先行書き込みログファイルに書き込めませんでした: %m" -#: access/transam/xlog.c:5324 +#: access/transam/xlog.c:4619 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "ブートストラップの先行書き込みログファイルをfsyncできませんでした: %m" -#: access/transam/xlog.c:5330 +#: access/transam/xlog.c:4625 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "ブートストラップの先行書き込みログファイルをクローズできませんでした: %m" -#: access/transam/xlog.c:5391 +#: access/transam/xlog.c:4843 #, c-format -msgid "using recovery command file \"%s\" is not supported" -msgstr "リカバリコマンドファイル \"%s\"の使用はサポートされません" +msgid "WAL was generated with wal_level=minimal, cannot continue recovering" +msgstr "wal_level=minimal でWALが生成されました、リカバリは続行不可です" -#: access/transam/xlog.c:5456 +#: access/transam/xlog.c:4844 #, c-format -msgid "standby mode is not supported by single-user servers" -msgstr "スタンバイモードはシングルユーザサーバではサポートされません" +msgid "This happens if you temporarily set wal_level=minimal on the server." +msgstr "これはこのサーバーで一時的にwal_level=minimalにした場合に起こります。" -#: access/transam/xlog.c:5473 +#: access/transam/xlog.c:4845 #, c-format -msgid "specified neither primary_conninfo nor restore_command" -msgstr "primary_conninfo と restore_command のどちらも指定されていません" +msgid "Use a backup taken after setting wal_level to higher than minimal." +msgstr "wal_levelをminimalより上位に設定したあとに取得したバックアップを使用してください。" -#: access/transam/xlog.c:5474 +#: access/transam/xlog.c:4909 #, c-format -msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." -msgstr "データベースサーバはpg_walサブディレクトリに置かれたファイルを定期的に確認します。" +msgid "control file contains invalid checkpoint location" +msgstr "制御ファイル内のチェックポイント位置が不正です" -#: access/transam/xlog.c:5482 +#: access/transam/xlog.c:4920 #, c-format -msgid "must specify restore_command when standby mode is not enabled" -msgstr "スタンバイモードを有効にしない場合は、restore_command の指定が必要です" +msgid "database system was shut down at %s" +msgstr "データベースシステムは %s にシャットダウンしました" -#: access/transam/xlog.c:5520 +#: access/transam/xlog.c:4926 #, c-format -msgid "recovery target timeline %u does not exist" -msgstr "リカバリ目標タイムライン%uが存在しません" +msgid "database system was shut down in recovery at %s" +msgstr "データベースシステムはリカバリ中 %s にシャットダウンしました" -#: access/transam/xlog.c:5642 +#: access/transam/xlog.c:4932 #, c-format -msgid "archive recovery complete" -msgstr "アーカイブリカバリが完了しました" +msgid "database system shutdown was interrupted; last known up at %s" +msgstr "データベースシステムはシャットダウン中に中断されました; %s まで動作していたことは確認できます" -#: access/transam/xlog.c:5708 access/transam/xlog.c:5981 +#: access/transam/xlog.c:4938 #, c-format -msgid "recovery stopping after reaching consistency" -msgstr "リカバリ処理は一貫性確保後に停止します" +msgid "database system was interrupted while in recovery at %s" +msgstr "データベースシステムはリカバリ中 %s に中断されました" -#: access/transam/xlog.c:5729 +#: access/transam/xlog.c:4940 #, c-format -msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" -msgstr "リカバリ処理はWAL位置(LSN)\"%X/%X\"の前で停止します" +msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." +msgstr "これはおそらくデータ破損があり、リカバリのために直前のバックアップを使用しなければならないことを意味します。" -#: access/transam/xlog.c:5815 +#: access/transam/xlog.c:4946 #, c-format -msgid "recovery stopping before commit of transaction %u, time %s" -msgstr "リカバリ処理はトランザクション%uのコミット、時刻%sの前に停止します" +msgid "database system was interrupted while in recovery at log time %s" +msgstr "データベースシステムはリカバリ中ログ時刻 %s に中断されました" -#: access/transam/xlog.c:5822 +#: access/transam/xlog.c:4948 #, c-format -msgid "recovery stopping before abort of transaction %u, time %s" -msgstr "リカバリ処理はトランザクション%uのアボート、時刻%sの前に停止します" +msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." +msgstr "これが1回以上起きた場合はデータが破損している可能性があるため、より以前のリカバリ目標を選ぶ必要があるかもしれません。" -#: access/transam/xlog.c:5875 +#: access/transam/xlog.c:4954 #, c-format -msgid "recovery stopping at restore point \"%s\", time %s" -msgstr "リカバリ処理は復元ポイント\"%s\"、時刻%s に停止します" +msgid "database system was interrupted; last known up at %s" +msgstr "データベースシステムは中断されました: %s まで動作していたことは確認できます" -#: access/transam/xlog.c:5893 +#: access/transam/xlog.c:4960 #, c-format -msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" -msgstr "リカバリ処理はWAL位置(LSN)\"%X/%X\"の後で停止します" +msgid "control file contains invalid database cluster state" +msgstr "制御ファイル内のデータベース・クラスタ状態が不正です" -#: access/transam/xlog.c:5961 +#: access/transam/xlog.c:5338 #, c-format -msgid "recovery stopping after commit of transaction %u, time %s" -msgstr "リカバリ処理はトランザクション%uのコミット、時刻%sの後に停止します" +msgid "WAL ends before end of online backup" +msgstr "オンラインバックアップの終了より前にWALが終了しました" -#: access/transam/xlog.c:5969 +#: access/transam/xlog.c:5339 #, c-format -msgid "recovery stopping after abort of transaction %u, time %s" -msgstr "リカバリ処理はトランザクション%uのアボート、時刻%sの後に停止します" +msgid "All WAL generated while online backup was taken must be available at recovery." +msgstr "オンラインバックアップ中に生成されたすべてのWALがリカバリで利用可能である必要があります。" -#: access/transam/xlog.c:6018 +#: access/transam/xlog.c:5342 #, c-format -msgid "pausing at the end of recovery" -msgstr "リカバリ完了位置で一時停止しています" +msgid "WAL ends before consistent recovery point" +msgstr "WALが一貫性があるリカバリポイントより前で終了しました" -#: access/transam/xlog.c:6019 +#: access/transam/xlog.c:5390 #, c-format -msgid "Execute pg_wal_replay_resume() to promote." -msgstr "再開するには pg_wal_replay_resume() を実行してください" +msgid "selected new timeline ID: %u" +msgstr "新しいタイムラインIDを選択: %u" -#: access/transam/xlog.c:6022 +#: access/transam/xlog.c:5423 #, c-format -msgid "recovery has paused" -msgstr "リカバリは一時停止中です" +msgid "archive recovery complete" +msgstr "アーカイブリカバリが完了しました" -#: access/transam/xlog.c:6023 +#: access/transam/xlog.c:6017 #, c-format -msgid "Execute pg_wal_replay_resume() to continue." -msgstr "再開するには pg_xlog_replay_resume() を実行してください" +msgid "shutting down" +msgstr "シャットダウンしています" -#: access/transam/xlog.c:6240 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6056 #, c-format -msgid "hot standby is not possible because %s = %d is a lower setting than on the primary server (its value was %d)" -msgstr "%s = %d はプライマリサーバの設定値より小さいため、ホットスタンバイは利用できません (もとの値は%d)" +msgid "restartpoint starting:%s%s%s%s%s%s%s%s" +msgstr "リスタートポイント開始:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6264 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6068 #, c-format -msgid "WAL was generated with wal_level=minimal, data may be missing" -msgstr "wal_level=minimal でWALが生成されました。データが失われる可能性があります" +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "チェックポイント開始:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6265 +#: access/transam/xlog.c:6128 #, c-format -msgid "This happens if you temporarily set wal_level=minimal without taking a new base backup." -msgstr "これは新しいベースバックアップを取らずに、一時的に wal_level=minimal にした場合に起こります。" +msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" +msgstr "リスタートポイント完了: %d個のバッファを出力 (%.1f%%); %d個のWALファイルを追加、%d個を削除、%d個を再利用; 書き出し=%ld.%03d秒, 同期=%ld.%03d秒, 全体=%ld.%03d秒; 同期したファイル=%d, 最長=%ld.%03d秒, 平均=%ld.%03d秒; 距離=%d kB, 予測=%d kB" -#: access/transam/xlog.c:6276 +#: access/transam/xlog.c:6148 #, c-format -msgid "hot standby is not possible because wal_level was not set to \"replica\" or higher on the primary server" -msgstr "プライマリサーバでwal_levelが\"replica\"またはそれ以上に設定されていないため、ホットスタンバイを使用できません" +msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" +msgstr "チェックポイント完了: %d個のバッファを出力 (%.1f%%); %d個のWALファイルを追加、%d個を削除、%d個を再利用; 書き出し=%ld.%03d秒, 同期=%ld.%03d秒, 全体=%ld.%03d秒; 同期したファイル=%d, 最長=%ld.%03d秒, 平均=%ld.%03d秒; 距離=%d kB, 予測=%d kB" -#: access/transam/xlog.c:6277 +#: access/transam/xlog.c:6583 #, c-format -msgid "Either set wal_level to \"replica\" on the primary, or turn off hot_standby here." -msgstr "プライマリでwal_levelを\"replica\"にするか、またはここでhot_standbyを無効にしてください。" +msgid "concurrent write-ahead log activity while database system is shutting down" +msgstr "データベースのシャットダウンに並行して、先行書き込みログが発生しました" -#: access/transam/xlog.c:6339 +#: access/transam/xlog.c:7140 #, c-format -msgid "control file contains invalid checkpoint location" -msgstr "制御ファイル内のチェックポイント位置が不正です" +msgid "recovery restart point at %X/%X" +msgstr "リカバリ再開ポイントは%X/%Xです" -#: access/transam/xlog.c:6350 +#: access/transam/xlog.c:7142 #, c-format -msgid "database system was shut down at %s" -msgstr "データベースシステムは %s にシャットダウンしました" +msgid "Last completed transaction was at log time %s." +msgstr "最後に完了したトランザクションはログ時刻 %s のものです" -#: access/transam/xlog.c:6356 +#: access/transam/xlog.c:7389 #, c-format -msgid "database system was shut down in recovery at %s" -msgstr "データベースシステムはリカバリ中 %s にシャットダウンしました" +msgid "restore point \"%s\" created at %X/%X" +msgstr "復帰ポイント\"%s\"が%X/%Xに作成されました" -#: access/transam/xlog.c:6362 +#: access/transam/xlog.c:7596 #, c-format -msgid "database system shutdown was interrupted; last known up at %s" -msgstr "データベースシステムはシャットダウン中に中断されました; %s まで動作していたことは確認できます" +msgid "online backup was canceled, recovery cannot continue" +msgstr "オンラインバックアップはキャンセルされ、リカバリを継続できません" -#: access/transam/xlog.c:6368 +#: access/transam/xlog.c:7653 #, c-format -msgid "database system was interrupted while in recovery at %s" -msgstr "データベースシステムはリカバリ中 %s に中断されました" +msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" +msgstr "シャットダウンチェックポイントレコードにおいて想定外のタイムラインID %u(%uのはず)がありました" -#: access/transam/xlog.c:6370 +#: access/transam/xlog.c:7711 #, c-format -msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." -msgstr "これはおそらくデータ破損があり、リカバリのために直前のバックアップを使用しなければならないことを意味します。" +msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" +msgstr "オンラインチェックポイントレコードにおいて想定外のタイムラインID %u(%uのはず)がありました" -#: access/transam/xlog.c:6376 +#: access/transam/xlog.c:7740 #, c-format -msgid "database system was interrupted while in recovery at log time %s" -msgstr "データベースシステムはリカバリ中ログ時刻 %s に中断されました" +msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" +msgstr "リカバリ終了チェックポイントレコードにおいて想定外のタイムラインID %u(%uのはず)がありました" -#: access/transam/xlog.c:6378 +#: access/transam/xlog.c:7998 #, c-format -msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." -msgstr "これが1回以上起きた場合はデータが破損している可能性があるため、より以前のリカバリ目標を選ぶ必要があるかもしれません。" +msgid "could not fsync write-through file \"%s\": %m" +msgstr "ライトスルーファイル\"%s\"をfsyncできませんでした: %m" -#: access/transam/xlog.c:6384 +#: access/transam/xlog.c:8004 #, c-format -msgid "database system was interrupted; last known up at %s" -msgstr "データベースシステムは中断されました: %s まで動作していたことは確認できます" +msgid "could not fdatasync file \"%s\": %m" +msgstr "ファイル\"%s\"をfdatasyncできませんでした: %m" -#: access/transam/xlog.c:6390 +#: access/transam/xlog.c:8099 access/transam/xlog.c:8471 #, c-format -msgid "control file contains invalid database cluster state" -msgstr "制御ファイル内のデータベース・クラスタ状態が不正です" +msgid "WAL level not sufficient for making an online backup" +msgstr "オンラインバックアップを行うにはWALレベルが不十分です" -#: access/transam/xlog.c:6447 +#: access/transam/xlog.c:8100 access/transam/xlog.c:8472 access/transam/xlogfuncs.c:199 #, c-format -msgid "entering standby mode" -msgstr "スタンバイモードに入ります" +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "サーバの開始時にwal_levelを\"replica\"または \"logical\"にセットする必要があります。" -#: access/transam/xlog.c:6450 +#: access/transam/xlog.c:8105 #, c-format -msgid "starting point-in-time recovery to XID %u" -msgstr "XID%uまでのポイントインタイムリカバリを開始します" +msgid "backup label too long (max %d bytes)" +msgstr "バックアップラベルが長すぎます (最大%dバイト)" -#: access/transam/xlog.c:6454 +#: access/transam/xlog.c:8221 #, c-format -msgid "starting point-in-time recovery to %s" -msgstr "%sまでのポイントインタイムリカバリを開始します" +msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" +msgstr "full_page_writes=off で生成されたWALは最終リスタートポイントから再生されます" -#: access/transam/xlog.c:6458 +#: access/transam/xlog.c:8223 access/transam/xlog.c:8584 #, c-format -msgid "starting point-in-time recovery to \"%s\"" -msgstr "\"%s\"までのポイントインタイムリカバリを開始します" +msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." +msgstr "つまりこのスタンバイで取得されたバックアップは破損しており、使用すべきではありません。プライマリでfull_page_writesを有効にしCHECKPOINTを実行したのち、再度オンラインバックアップを試行してください。" -#: access/transam/xlog.c:6462 +#: access/transam/xlog.c:8308 replication/basebackup.c:1338 utils/adt/misc.c:347 #, c-format -msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" -msgstr "WAL位置(LSN) \"%X/%X\"までのポイントインタイムリカバリを開始します" +msgid "symbolic link \"%s\" target is too long" +msgstr "シンボリックリンク\"%s\"の参照先が長すぎます" -#: access/transam/xlog.c:6467 +#: access/transam/xlog.c:8358 commands/tablespace.c:420 commands/tablespace.c:602 replication/basebackup.c:1353 utils/adt/misc.c:355 #, c-format -msgid "starting point-in-time recovery to earliest consistent point" -msgstr "最も古い一貫性確保点までのポイントインタイムリカバリを開始します" +msgid "tablespaces are not supported on this platform" +msgstr "このプラットフォームではテーブル空間はサポートしていません" -#: access/transam/xlog.c:6470 +#: access/transam/xlog.c:8517 access/transam/xlog.c:8530 access/transam/xlogrecovery.c:1191 access/transam/xlogrecovery.c:1198 access/transam/xlogrecovery.c:1257 access/transam/xlogrecovery.c:1337 access/transam/xlogrecovery.c:1361 #, c-format -msgid "starting archive recovery" -msgstr "アーカイブリカバリを開始しています" +msgid "invalid data in file \"%s\"" +msgstr "ファイル\"%s\"内の不正なデータ" -#: access/transam/xlog.c:6529 access/transam/xlog.c:6662 +#: access/transam/xlog.c:8534 replication/basebackup.c:1193 #, c-format -msgid "checkpoint record is at %X/%X" -msgstr "チェックポイントレコードは%X/%Xにあります" +msgid "the standby was promoted during online backup" +msgstr "オンラインバックアップ中にスタンバイが昇格しました" -#: access/transam/xlog.c:6544 +#: access/transam/xlog.c:8535 replication/basebackup.c:1194 #, c-format -msgid "could not find redo location referenced by checkpoint record" -msgstr "チェックポイントレコードが参照している redo 位置を見つけられませんでした" +msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." +msgstr "つまり取得中のバックアップは破損しているため使用してはいけません。再度オンラインバックアップを取得してください。" -#: access/transam/xlog.c:6545 access/transam/xlog.c:6555 +#: access/transam/xlog.c:8582 #, c-format -msgid "" -"If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" -"If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" -"Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup." -msgstr "" -"バックアップから復旧しているのであれば、touch \"%s/recovery.signal\" の実行および必要なオプションの追加を行ってください。\n" -"バックアップからの復旧でなければ、\"%s/backup_label\"の削除を試みてください。.\n" -"バックアップから復旧で\"%s/backup_label\"を削除すると、クラスタは壊れた状態で復旧されることに注意してください。" +msgid "WAL generated with full_page_writes=off was replayed during online backup" +msgstr "full_page_writes=offで生成されたWALはオンラインバックアップ中に再生されます" -#: access/transam/xlog.c:6554 +#: access/transam/xlog.c:8707 #, c-format -msgid "could not locate required checkpoint record" -msgstr "必要なチェックポイントが見つかりませんでした" +msgid "base backup done, waiting for required WAL segments to be archived" +msgstr "ベースバックアップ完了、必要な WAL セグメントがアーカイブされるのを待っています" -#: access/transam/xlog.c:6583 commands/tablespace.c:654 +#: access/transam/xlog.c:8721 #, c-format -msgid "could not create symbolic link \"%s\": %m" -msgstr "シンボリックリンク\"%s\"を作成できませんでした: %m" +msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" +msgstr "まだ必要なすべての WAL セグメントがアーカイブされるのを待っています(%d 秒経過)" -#: access/transam/xlog.c:6615 access/transam/xlog.c:6621 +#: access/transam/xlog.c:8723 #, c-format -msgid "ignoring file \"%s\" because no file \"%s\" exists" -msgstr "ファイル\"%2$s\"が存在しないためファイル\"%1$s\"を無視します" +msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." +msgstr "archive_commandが適切に実行されていることを確認してください。バックアップ処理は安全に取り消すことができますが、全てのWALセグメントがそろわなければこのバックアップは利用できません。" -#: access/transam/xlog.c:6617 access/transam/xlog.c:11817 +#: access/transam/xlog.c:8730 #, c-format -msgid "File \"%s\" was renamed to \"%s\"." -msgstr "ファイル\"%s\"は\"%s\"にリネームされました。" +msgid "all required WAL segments have been archived" +msgstr "必要なすべての WAL セグメントがアーカイブされました" -#: access/transam/xlog.c:6623 +#: access/transam/xlog.c:8734 #, c-format -msgid "Could not rename file \"%s\" to \"%s\": %m." -msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m。" +msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" +msgstr "WAL アーカイブが有効になっていません。バックアップを完了させるには、すべての必要なWALセグメントが他の方法でコピーされたことを確認してください。" -#: access/transam/xlog.c:6674 +#: access/transam/xlog.c:8781 #, c-format -msgid "could not locate a valid checkpoint record" -msgstr "有効なチェックポイントが見つかりませんでした" +msgid "aborting backup due to backend exiting before pg_backup_stop was called" +msgstr "バックエンドがpg_backup_stopの呼び出し前に終了したため、バックアップは異常終了しました" -#: access/transam/xlog.c:6712 +#: access/transam/xlogarchive.c:208 #, c-format -msgid "requested timeline %u is not a child of this server's history" -msgstr "要求されたタイムライン%uはこのサーバの履歴からの子孫ではありません" +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "アーカイブファイル\"%s\"のサイズが不正です: %lld、正しくは%lld" -#: access/transam/xlog.c:6714 +#: access/transam/xlogarchive.c:217 #, c-format -msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." -msgstr "タイムライン%3$uの最終チェックポイントは%1$X/%2$Xですが、要求されたタイムラインの履歴の中ではサーバはそのタイムラインから%4$X/%5$Xで分岐しています。" +msgid "restored log file \"%s\" from archive" +msgstr "ログファイル\"%s\"をアーカイブからリストアしました" -#: access/transam/xlog.c:6730 +#: access/transam/xlogarchive.c:231 #, c-format -msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" -msgstr "要求されたタイムライン%1$uはタイムライン%4$uの最小リカバリポイント%2$X/%3$Xを含みません" +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "restore_commandが終了ステータス0を返却しましたが、stat()が失敗しました。" -#: access/transam/xlog.c:6761 +#: access/transam/xlogarchive.c:263 #, c-format -msgid "invalid next transaction ID" -msgstr "次のトランザクションIDが不正です" +msgid "could not restore file \"%s\" from archive: %s" +msgstr "ファイル\"%s\"をアーカイブからリストアできませんでした: %s" -#: access/transam/xlog.c:6855 +#. translator: First %s represents a postgresql.conf parameter name like +#. "recovery_end_command", the 2nd is the value of that parameter, the +#. third an already translated error message. +#: access/transam/xlogarchive.c:376 #, c-format -msgid "invalid redo in checkpoint record" -msgstr "チェックポイントレコード内の不正なREDO" +msgid "%s \"%s\": %s" +msgstr "%s \"%s\": %s" -#: access/transam/xlog.c:6866 +#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:566 #, c-format -msgid "invalid redo record in shutdown checkpoint" -msgstr "シャットダウン・チェックポイントにおける不正なREDOレコード" +msgid "could not create archive status file \"%s\": %m" +msgstr "アーカイブステータスファイル\"%s\"を作成できませんでした: %m" -#: access/transam/xlog.c:6900 +#: access/transam/xlogarchive.c:494 access/transam/xlogarchive.c:574 #, c-format -msgid "database system was not properly shut down; automatic recovery in progress" -msgstr "データベースシステムは正しくシャットダウンされていません; 自動リカバリを実行中" +msgid "could not write archive status file \"%s\": %m" +msgstr "アーカイブステータスファイル\"%s\"に書き込めませんでした: %m" -#: access/transam/xlog.c:6904 +#: access/transam/xlogfuncs.c:74 #, c-format -msgid "crash recovery starts in timeline %u and has target timeline %u" -msgstr "タイムライン%uから、タイムライン%uを目標としてクラッシュリカバリを開始します" +msgid "a backup is already in progress in this session" +msgstr "このセッションではすでにバックアップが進行中です" -#: access/transam/xlog.c:6951 +#: access/transam/xlogfuncs.c:126 #, c-format -msgid "backup_label contains data inconsistent with control file" -msgstr "backup_labelに制御ファイルと整合しないデータが含まれます" +msgid "backup is not in progress" +msgstr "バックアップが進行中ではありません" -#: access/transam/xlog.c:6952 +#: access/transam/xlogfuncs.c:127 #, c-format -msgid "This means that the backup is corrupted and you will have to use another backup for recovery." -msgstr "これはバックアップが破損しており、リカバリには他のバックアップを使用しなければならないことを意味します。" +msgid "Did you call pg_backup_start()?" +msgstr "pg_backup_start()を呼び出しましたか?" -#: access/transam/xlog.c:7043 +#: access/transam/xlogfuncs.c:166 access/transam/xlogfuncs.c:193 access/transam/xlogfuncs.c:232 access/transam/xlogfuncs.c:253 access/transam/xlogfuncs.c:274 #, c-format -msgid "initializing for hot standby" -msgstr "ホットスタンバイのための初期化を行っています" +msgid "WAL control functions cannot be executed during recovery." +msgstr "リカバリ中はWAL制御関数は実行できません。" -#: access/transam/xlog.c:7176 +#: access/transam/xlogfuncs.c:198 #, c-format -msgid "redo starts at %X/%X" -msgstr "REDOを%X/%Xから開始します" +msgid "WAL level not sufficient for creating a restore point" +msgstr "リストアポイントを作るにはWALレベルが不足しています" -#: access/transam/xlog.c:7400 +#: access/transam/xlogfuncs.c:206 #, c-format -msgid "requested recovery stop point is before consistent recovery point" -msgstr "要求されたリカバリ停止ポイントは、一貫性があるリカバリポイントより前にあります" +msgid "value too long for restore point (maximum %d characters)" +msgstr "リストアポイントとしては値が長すぎます(最大%d文字)" -#: access/transam/xlog.c:7438 +#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 #, c-format -msgid "redo done at %X/%X" -msgstr "REDOが%X/%Xで終了しました" +msgid "%s cannot be executed during recovery." +msgstr "リカバリ中は %s を実行できません。" -#: access/transam/xlog.c:7443 +#: access/transam/xlogfuncs.c:424 access/transam/xlogfuncs.c:454 access/transam/xlogfuncs.c:478 access/transam/xlogfuncs.c:501 access/transam/xlogfuncs.c:581 #, c-format -msgid "last completed transaction was at log time %s" -msgstr "最後に完了したトランザクションのログ時刻は%sでした" +msgid "recovery is not in progress" +msgstr "リカバリが進行中ではありません" -#: access/transam/xlog.c:7452 +#: access/transam/xlogfuncs.c:425 access/transam/xlogfuncs.c:455 access/transam/xlogfuncs.c:479 access/transam/xlogfuncs.c:502 access/transam/xlogfuncs.c:582 #, c-format -msgid "redo is not required" -msgstr "REDOは必要ありません" +msgid "Recovery control functions can only be executed during recovery." +msgstr "リカバリ制御関数リカバリ中にのみを実行可能です。" -#: access/transam/xlog.c:7464 +#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 #, c-format -msgid "recovery ended before configured recovery target was reached" -msgstr "指定したリカバリターゲットに到達する前にリカバリが終了しました" +msgid "standby promotion is ongoing" +msgstr "スタンバイの昇格を実行中です" -#: access/transam/xlog.c:7543 access/transam/xlog.c:7547 +#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 #, c-format -msgid "WAL ends before end of online backup" -msgstr "オンラインバックアップの終了より前にWALが終了しました" +msgid "%s cannot be executed after promotion is triggered." +msgstr "%sは昇格を開始した後には実行できません。" -#: access/transam/xlog.c:7544 +#: access/transam/xlogfuncs.c:587 #, c-format -msgid "All WAL generated while online backup was taken must be available at recovery." -msgstr "オンラインバックアップ中に生成されたすべてのWALがリカバリで利用可能である必要があります。" +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "\"wait_seconds\"は負の値もしくはゼロにはできません" -#: access/transam/xlog.c:7548 +#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:252 #, c-format -msgid "Online backup started with pg_start_backup() must be ended with pg_stop_backup(), and all WAL up to that point must be available at recovery." -msgstr "pg_start_backup() を使ったオンラインバックアップは pg_stop_backup() で終了なければならず、かつその時点までのすべてのWALはリカバリで利用可能である必要があります" +msgid "failed to send signal to postmaster: %m" +msgstr "postmasterにシグナルを送信できませんでした: %m" -#: access/transam/xlog.c:7551 +#: access/transam/xlogfuncs.c:643 #, c-format -msgid "WAL ends before consistent recovery point" -msgstr "WALが一貫性があるリカバリポイントより前で終了しました" +msgid "server did not promote within %d second" +msgid_plural "server did not promote within %d seconds" +msgstr[0] "サーバは%d秒以内に昇格しませんでした" -#: access/transam/xlog.c:7586 +#: access/transam/xlogprefetcher.c:1072 #, c-format -msgid "selected new timeline ID: %u" -msgstr "新しいタイムラインIDを選択: %u" +msgid "recovery_prefetch not supported on platforms that lack posix_fadvise()." +msgstr "recovery_prefetchはposix_fadvise()を持たないプラットフォームではサポートされません。" -#: access/transam/xlog.c:8034 +#: access/transam/xlogreader.c:621 #, c-format -msgid "consistent recovery state reached at %X/%X" -msgstr "%X/%X でリカバリの一貫性が確保されました" +msgid "invalid record offset at %X/%X" +msgstr "%X/%Xのレコードオフセットが不正です" -#: access/transam/xlog.c:8244 +#: access/transam/xlogreader.c:629 #, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "制御ファイル内の最初のチェックポイントへのリンクが不正です" +msgid "contrecord is requested by %X/%X" +msgstr "%X/%Xでは継続レコードが必要です" -#: access/transam/xlog.c:8248 +#: access/transam/xlogreader.c:670 access/transam/xlogreader.c:1102 #, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "backup_labelファイル内のチェックポイントへのリンクが不正です" +msgid "invalid record length at %X/%X: wanted %u, got %u" +msgstr "%X/%Xのレコード長が不正です:長さは%uである必要がありますが、実際は%uでした" -#: access/transam/xlog.c:8266 +#: access/transam/xlogreader.c:699 #, c-format -msgid "invalid primary checkpoint record" -msgstr "最初のチェックポイントレコードが不正です" +msgid "out of memory while trying to decode a record of length %u" +msgstr "長さ%uのレコードのデコード中のメモリ不足" -#: access/transam/xlog.c:8270 +#: access/transam/xlogreader.c:721 #, c-format -msgid "invalid checkpoint record" -msgstr "チェックポイントレコードが不正です" +msgid "record length %u at %X/%X too long" +msgstr "%2$X/%3$Xのレコード長%1$uが大きすぎます" -#: access/transam/xlog.c:8281 +#: access/transam/xlogreader.c:770 #, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "プライマリチェックポイントレコード内のリソースマネージャIDが不正です" +msgid "there is no contrecord flag at %X/%X" +msgstr "%X/%Xでcontrecordフラグがありません" -#: access/transam/xlog.c:8285 +#: access/transam/xlogreader.c:783 #, c-format -msgid "invalid resource manager ID in checkpoint record" -msgstr "チェックポイントレコード内のリソースマネージャIDがで不正です" +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "%3$X/%4$Xの継続レコードの長さ%1$u(正しくは%2$lld)は不正です" -#: access/transam/xlog.c:8298 +#: access/transam/xlogreader.c:1110 #, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "最初のチェックポイントレコード内のxl_infoが不正です" +msgid "invalid resource manager ID %u at %X/%X" +msgstr "%2$X/%3$XのリソースマネージャID %1$uは不正です" -#: access/transam/xlog.c:8302 +#: access/transam/xlogreader.c:1123 access/transam/xlogreader.c:1139 #, c-format -msgid "invalid xl_info in checkpoint record" -msgstr "チェックポイントレコード内のxl_infoが不正です" +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "%3$X/%4$Xのレコードの後方リンク%1$X/%2$Xが不正です" -#: access/transam/xlog.c:8313 +#: access/transam/xlogreader.c:1175 #, c-format -msgid "invalid length of primary checkpoint record" -msgstr "最初のチェックポイントレコード長が不正です" +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "%X/%Xのレコード内のリソースマネージャデータのチェックサムが不正です" -#: access/transam/xlog.c:8317 +#: access/transam/xlogreader.c:1212 #, c-format -msgid "invalid length of checkpoint record" -msgstr "チェックポイントレコード長が不正です" +msgid "invalid magic number %04X in log segment %s, offset %u" +msgstr "ログセグメント%2$s、オフセット%3$uのマジックナンバー%1$04Xは不正です" -#: access/transam/xlog.c:8498 +#: access/transam/xlogreader.c:1226 access/transam/xlogreader.c:1267 #, c-format -msgid "shutting down" -msgstr "シャットダウンしています" +msgid "invalid info bits %04X in log segment %s, offset %u" +msgstr "ログセグメント %2$s、オフセット%3$uの情報ビット%1$04Xは不正です" -#: access/transam/xlog.c:8818 +#: access/transam/xlogreader.c:1241 #, c-format -msgid "checkpoint skipped because system is idle" -msgstr "システムがアイドル状態なためチェックポイントがスキップされました" +msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" +msgstr "WALファイルは異なるデータベースシステム由来のものです: WALファイルのデータベースシステム識別子は %lluで、pg_control におけるデータベースシステム識別子は %lluです" -#: access/transam/xlog.c:9018 +#: access/transam/xlogreader.c:1249 #, c-format -msgid "concurrent write-ahead log activity while database system is shutting down" -msgstr "データベースのシャットダウンに並行して、先行書き込みログが発生しました" +msgid "WAL file is from different database system: incorrect segment size in page header" +msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのセグメントサイズが正しくありません" -#: access/transam/xlog.c:9275 +#: access/transam/xlogreader.c:1255 #, c-format -msgid "skipping restartpoint, recovery has already ended" -msgstr "再開ポイントをスキップします、リカバリはすでに終わっています" +msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" +msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのXLOG_BLCKSZが正しくありません" -#: access/transam/xlog.c:9298 +#: access/transam/xlogreader.c:1286 #, c-format -msgid "skipping restartpoint, already performed at %X/%X" -msgstr "%X/%X ですでに実行済みの再開ポイントをスキップします" +msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" +msgstr "ログセグメント%3$s、オフセット%4$uに想定外のページアドレス%1$X/%2$X" -#: access/transam/xlog.c:9466 +#: access/transam/xlogreader.c:1311 #, c-format -msgid "recovery restart point at %X/%X" -msgstr "リカバリ再開ポイントは%X/%Xです" +msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" +msgstr "ログセグメント%3$s、オフセット%4$uのタイムラインID %1$u(%2$uの後)が順序通りではありません" -#: access/transam/xlog.c:9468 +#: access/transam/xlogreader.c:1706 #, c-format -msgid "Last completed transaction was at log time %s." -msgstr "最後に完了したトランザクションはログ時刻 %s のものです" +msgid "out-of-order block_id %u at %X/%X" +msgstr "block_id %uが%X/%Xで不正です" -#: access/transam/xlog.c:9710 +#: access/transam/xlogreader.c:1730 #, c-format -msgid "restore point \"%s\" created at %X/%X" -msgstr "復帰ポイント\"%s\"が%X/%Xに作成されました" +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATAが設定されていますが、%X/%Xにデータがありません" -#: access/transam/xlog.c:9855 +#: access/transam/xlogreader.c:1737 #, c-format -msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" -msgstr "チェックポイントレコードにおいて想定外の前回のタイムラインID %u(現在のタイムラインIDは%u)がありました" +msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" +msgstr "BKPBLOCK_HAS_DATAが設定されていませんが、%2$X/%3$Xのデータ長は%1$uです" -#: access/transam/xlog.c:9864 +#: access/transam/xlogreader.c:1773 #, c-format -msgid "unexpected timeline ID %u (after %u) in checkpoint record" -msgstr "チェックポイントレコードにおいて想定外のタイムラインID %u (%uの後)がありました" +msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLEが設定されていますが、%4$X/%5$Xでホールオフセット%1$u、長さ%2$u、ブロックイメージ長%3$uです" -#: access/transam/xlog.c:9880 +#: access/transam/xlogreader.c:1789 #, c-format -msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" -msgstr "タイムライン%4$uの最小リカバリポイント%2$X/%3$Xに達する前のチェックポイントレコード内の想定外のタイムラインID%1$u。" +msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLEが設定されていませんが、%3$X/%4$Xにおけるホールオフセット%1$uの長さが%2$uです" -#: access/transam/xlog.c:9956 +#: access/transam/xlogreader.c:1803 #, c-format -msgid "online backup was canceled, recovery cannot continue" -msgstr "オンラインバックアップはキャンセルされ、リカバリを継続できません" +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSEDが設定されていますが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです" -#: access/transam/xlog.c:10012 access/transam/xlog.c:10068 access/transam/xlog.c:10091 +#: access/transam/xlogreader.c:1818 #, c-format -msgid "unexpected timeline ID %u (should be %u) in checkpoint record" -msgstr "チェックポイントレコードにおいて想定外のタイムラインID %u(%uのはず)がありました" +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLEもBKPIMAGE_COMPRESSEDも設定されていませんが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです" -#: access/transam/xlog.c:10417 +#: access/transam/xlogreader.c:1834 #, c-format -msgid "could not fsync write-through file \"%s\": %m" -msgstr "ライトスルーファイル\"%s\"をfsyncできませんでした: %m" +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "BKPBLOCK_SAME_RELが設定されていますが、%X/%Xにおいて以前のリレーションがありません" -#: access/transam/xlog.c:10423 +#: access/transam/xlogreader.c:1846 #, c-format -msgid "could not fdatasync file \"%s\": %m" -msgstr "ファイル\"%s\"をfdatasyncできませんでした: %m" +msgid "invalid block_id %u at %X/%X" +msgstr "%2$X/%3$Xにおけるblock_id %1$uが不正です" -#: access/transam/xlog.c:10521 access/transam/xlog.c:11050 access/transam/xlogfuncs.c:275 access/transam/xlogfuncs.c:302 access/transam/xlogfuncs.c:341 access/transam/xlogfuncs.c:362 access/transam/xlogfuncs.c:383 +#: access/transam/xlogreader.c:1913 #, c-format -msgid "WAL control functions cannot be executed during recovery." -msgstr "リカバリ中はWAL制御関数は実行できません。" +msgid "record with invalid length at %X/%X" +msgstr "%X/%Xのレコードのサイズが不正です" -#: access/transam/xlog.c:10530 access/transam/xlog.c:11059 +#: access/transam/xlogreader.c:1938 #, c-format -msgid "WAL level not sufficient for making an online backup" -msgstr "オンラインバックアップを行うにはWALレベルが不十分です" +msgid "failed to locate backup block with ID %d in WAL record" +msgstr "WALレコード中ID %dのバックアップブロックを特定できません" -#: access/transam/xlog.c:10531 access/transam/xlog.c:11060 access/transam/xlogfuncs.c:308 +#: access/transam/xlogreader.c:2044 access/transam/xlogreader.c:2061 #, c-format -msgid "wal_level must be set to \"replica\" or \"logical\" at server start." -msgstr "サーバの開始時にwal_levelを\"replica\"または \"logical\"にセットする必要があります。" +msgid "image at %X/%X compressed with %s not supported by build, block %d" +msgstr "%X/%Xのイメージはこのビルドではサポートされていない%sで圧縮されています、ブロック%d" -#: access/transam/xlog.c:10536 +#: access/transam/xlogreader.c:2070 #, c-format -msgid "backup label too long (max %d bytes)" -msgstr "バックアップラベルが長すぎます (最大%dバイト)" +msgid "image at %X/%X compressed with unknown method, block %d" +msgstr "%X%Xのイメージは不明な方式で圧縮されています、ブロック%d" -#: access/transam/xlog.c:10573 access/transam/xlog.c:10849 access/transam/xlog.c:10887 +#: access/transam/xlogreader.c:2078 #, c-format -msgid "a backup is already in progress" -msgstr "すでにバックアップが進行中です" +msgid "invalid compressed image at %X/%X, block %d" +msgstr "%X/%X、ブロック %d での圧縮イメージが不正です" -#: access/transam/xlog.c:10574 +#: access/transam/xlogrecovery.c:525 #, c-format -msgid "Run pg_stop_backup() and try again." -msgstr "pg_stop_backup()を実行後に再試行してください" +msgid "entering standby mode" +msgstr "スタンバイモードに入ります" -#: access/transam/xlog.c:10670 +#: access/transam/xlogrecovery.c:528 #, c-format -msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" -msgstr "full_page_writes=off で生成されたWALは最終リスタートポイントから再生されます" +msgid "starting point-in-time recovery to XID %u" +msgstr "XID%uまでのポイントインタイムリカバリを開始します" -#: access/transam/xlog.c:10672 access/transam/xlog.c:11255 +#: access/transam/xlogrecovery.c:532 #, c-format -msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." -msgstr "つまりこのスタンバイで取得されたバックアップは破損しており、使用すべきではありません。プライマリでfull_page_writesを有効にしCHECKPOINTを実行したのち、再度オンラインバックアップを試行してください。" +msgid "starting point-in-time recovery to %s" +msgstr "%sまでのポイントインタイムリカバリを開始します" -#: access/transam/xlog.c:10747 replication/basebackup.c:1418 utils/adt/misc.c:342 +#: access/transam/xlogrecovery.c:536 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "シンボリックリンク\"%s\"の参照先が長すぎます" +msgid "starting point-in-time recovery to \"%s\"" +msgstr "\"%s\"までのポイントインタイムリカバリを開始します" -#: access/transam/xlog.c:10799 commands/tablespace.c:402 commands/tablespace.c:566 replication/basebackup.c:1433 utils/adt/misc.c:350 +#: access/transam/xlogrecovery.c:540 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "このプラットフォームではテーブル空間はサポートしていません" +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgstr "WAL位置(LSN) \"%X/%X\"までのポイントインタイムリカバリを開始します" -#: access/transam/xlog.c:10850 access/transam/xlog.c:10888 +#: access/transam/xlogrecovery.c:544 #, c-format -msgid "If you're sure there is no backup in progress, remove file \"%s\" and try again." -msgstr "バックアップが進行中でないことが確かであれば、ファイル\"%s\"を削除し再実行してください。" +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "最も古い一貫性確保点までのポイントインタイムリカバリを開始します" -#: access/transam/xlog.c:11075 +#: access/transam/xlogrecovery.c:547 #, c-format -msgid "exclusive backup not in progress" -msgstr "排他バックアップは進行中ではありません" +msgid "starting archive recovery" +msgstr "アーカイブリカバリを開始しています" -#: access/transam/xlog.c:11102 +#: access/transam/xlogrecovery.c:631 #, c-format -msgid "a backup is not in progress" -msgstr "バックアップが進行中ではありません" +msgid "could not find redo location referenced by checkpoint record" +msgstr "チェックポイントレコードが参照している redo 位置を見つけられませんでした" -#: access/transam/xlog.c:11188 access/transam/xlog.c:11201 access/transam/xlog.c:11590 access/transam/xlog.c:11596 access/transam/xlog.c:11644 access/transam/xlog.c:11717 access/transam/xlogfuncs.c:692 +#: access/transam/xlogrecovery.c:632 access/transam/xlogrecovery.c:642 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "ファイル\"%s\"内の不正なデータ" +msgid "" +"If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" +"If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" +"Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup." +msgstr "" +"バックアップから復旧しているのであれば、touch \"%s/recovery.signal\" の実行および必要なオプションの追加を行ってください。\n" +"バックアップからの復旧でなければ、\"%s/backup_label\"の削除を試みてください。.\n" +"バックアップから復旧で\"%s/backup_label\"を削除すると、クラスタは壊れた状態で復旧されることに注意してください。" -#: access/transam/xlog.c:11205 replication/basebackup.c:1266 +#: access/transam/xlogrecovery.c:641 #, c-format -msgid "the standby was promoted during online backup" -msgstr "オンラインバックアップ中にスタンバイが昇格しました" +msgid "could not locate required checkpoint record" +msgstr "必要なチェックポイントが見つかりませんでした" -#: access/transam/xlog.c:11206 replication/basebackup.c:1267 +#: access/transam/xlogrecovery.c:670 commands/tablespace.c:706 #, c-format -msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." -msgstr "つまり取得中のバックアップは破損しているため使用してはいけません。再度オンラインバックアップを取得してください。" +msgid "could not create symbolic link \"%s\": %m" +msgstr "シンボリックリンク\"%s\"を作成できませんでした: %m" -#: access/transam/xlog.c:11253 +#: access/transam/xlogrecovery.c:702 access/transam/xlogrecovery.c:708 #, c-format -msgid "WAL generated with full_page_writes=off was replayed during online backup" -msgstr "full_page_writes=offで生成されたWALはオンラインバックアップ中に再生されます" +msgid "ignoring file \"%s\" because no file \"%s\" exists" +msgstr "ファイル\"%2$s\"が存在しないためファイル\"%1$s\"を無視します" -#: access/transam/xlog.c:11373 +#: access/transam/xlogrecovery.c:704 #, c-format -msgid "base backup done, waiting for required WAL segments to be archived" -msgstr "ベースバックアップ完了、必要な WAL セグメントがアーカイブされるのを待っています" +msgid "File \"%s\" was renamed to \"%s\"." +msgstr "ファイル\"%s\"は\"%s\"にリネームされました。" -#: access/transam/xlog.c:11385 +#: access/transam/xlogrecovery.c:710 #, c-format -msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" -msgstr "まだ必要なすべての WAL セグメントがアーカイブされるのを待っています(%d 秒経過)" +msgid "Could not rename file \"%s\" to \"%s\": %m." +msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m。" -#: access/transam/xlog.c:11387 +#: access/transam/xlogrecovery.c:764 #, c-format -msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." -msgstr "archive_commandが適切に実行されていることを確認してください。バックアップ処理は安全に取り消すことができますが、全てのWALセグメントがそろわなければこのバックアップは利用できません。" +msgid "could not locate a valid checkpoint record" +msgstr "有効なチェックポイントが見つかりませんでした" -#: access/transam/xlog.c:11394 +#: access/transam/xlogrecovery.c:788 #, c-format -msgid "all required WAL segments have been archived" -msgstr "必要なすべての WAL セグメントがアーカイブされました" +msgid "requested timeline %u is not a child of this server's history" +msgstr "要求されたタイムライン%uはこのサーバの履歴からの子孫ではありません" -#: access/transam/xlog.c:11398 +#: access/transam/xlogrecovery.c:790 #, c-format -msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" -msgstr "WAL アーカイブが有効になっていません。バックアップを完了させるには、すべての必要なWALセグメントが他の方法でコピーされたことを確認してください。" +msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." +msgstr "タイムライン%3$uの最終チェックポイントは%1$X/%2$Xですが、要求されたタイムラインの履歴の中ではサーバはそのタイムラインから%4$X/%5$Xで分岐しています。" -#: access/transam/xlog.c:11451 +#: access/transam/xlogrecovery.c:804 #, c-format -msgid "aborting backup due to backend exiting before pg_stop_backup was called" -msgstr "バックエンドが pg_stop_backup の呼び出し前に終了したため、バックアップは異常終了しました" +msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" +msgstr "要求されたタイムライン%1$uはタイムライン%4$uの最小リカバリポイント%2$X/%3$Xを含みません" -#: access/transam/xlog.c:11627 +#: access/transam/xlogrecovery.c:832 #, c-format -msgid "backup time %s in file \"%s\"" -msgstr "ファイル\"%2$s\"内のバックアップ時刻は %1$s" +msgid "invalid next transaction ID" +msgstr "次のトランザクションIDが不正です" -#: access/transam/xlog.c:11632 +#: access/transam/xlogrecovery.c:837 #, c-format -msgid "backup label %s in file \"%s\"" -msgstr "ファイル\"%2$s\"内のバックアップラベルは %1$s" +msgid "invalid redo in checkpoint record" +msgstr "チェックポイントレコード内の不正なREDO" -#: access/transam/xlog.c:11645 +#: access/transam/xlogrecovery.c:848 #, c-format -msgid "Timeline ID parsed is %u, but expected %u." -msgstr "読み取られたタイムラインIDは%uでしたが、%uであるはずです。" +msgid "invalid redo record in shutdown checkpoint" +msgstr "シャットダウン・チェックポイントにおける不正なREDOレコード" -#: access/transam/xlog.c:11649 +#: access/transam/xlogrecovery.c:877 #, c-format -msgid "backup timeline %u in file \"%s\"" -msgstr "ファイル\"%2$s\"内のバックアップタイムラインは %1$u" +msgid "database system was not properly shut down; automatic recovery in progress" +msgstr "データベースシステムは正しくシャットダウンされていません; 自動リカバリを実行中" -#. translator: %s is a WAL record description -#: access/transam/xlog.c:11757 +#: access/transam/xlogrecovery.c:881 #, c-format -msgid "WAL redo at %X/%X for %s" -msgstr "%X/%Xにある%sのWAL再生" +msgid "crash recovery starts in timeline %u and has target timeline %u" +msgstr "タイムライン%uから、タイムライン%uを目標としてクラッシュリカバリを開始します" -#: access/transam/xlog.c:11806 +#: access/transam/xlogrecovery.c:924 #, c-format -msgid "online backup mode was not canceled" -msgstr "オンラインバックアップモードはキャンセルされていません" +msgid "backup_label contains data inconsistent with control file" +msgstr "backup_labelに制御ファイルと整合しないデータが含まれます" -#: access/transam/xlog.c:11807 +#: access/transam/xlogrecovery.c:925 #, c-format -msgid "File \"%s\" could not be renamed to \"%s\": %m." -msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m。" +msgid "This means that the backup is corrupted and you will have to use another backup for recovery." +msgstr "これはバックアップが破損しており、リカバリには他のバックアップを使用しなければならないことを意味します。" + +#: access/transam/xlogrecovery.c:979 +#, c-format +msgid "using recovery command file \"%s\" is not supported" +msgstr "リカバリコマンドファイル \"%s\"の使用はサポートされません" + +#: access/transam/xlogrecovery.c:1044 +#, c-format +msgid "standby mode is not supported by single-user servers" +msgstr "スタンバイモードはシングルユーザサーバではサポートされません" + +#: access/transam/xlogrecovery.c:1061 +#, c-format +msgid "specified neither primary_conninfo nor restore_command" +msgstr "primary_conninfo と restore_command のどちらも指定されていません" -#: access/transam/xlog.c:11816 access/transam/xlog.c:11828 access/transam/xlog.c:11838 +#: access/transam/xlogrecovery.c:1062 #, c-format -msgid "online backup mode canceled" -msgstr "オンラインバックアップモードがキャンセルされました" +msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." +msgstr "データベースサーバはpg_walサブディレクトリに置かれたファイルを定期的に確認します。" -#: access/transam/xlog.c:11829 +#: access/transam/xlogrecovery.c:1070 #, c-format -msgid "Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." -msgstr "ファイル\"%s\"、\"%s\"の名前はそれぞれ\"%s\"、\"%s\"へと変更されました。" +msgid "must specify restore_command when standby mode is not enabled" +msgstr "スタンバイモードを有効にしない場合は、restore_command の指定が必要です" -#: access/transam/xlog.c:11839 +#: access/transam/xlogrecovery.c:1108 #, c-format -msgid "File \"%s\" was renamed to \"%s\", but file \"%s\" could not be renamed to \"%s\": %m." -msgstr "ファイル\"%s\"の名前は\"%s\"に変更できましたが、\"%s\"の名前は\"%s\"に変更できませんでした: %m" +msgid "recovery target timeline %u does not exist" +msgstr "リカバリ目標タイムライン%uが存在しません" -#: access/transam/xlog.c:11972 access/transam/xlogutils.c:970 +#: access/transam/xlogrecovery.c:1258 #, c-format -msgid "could not read from log segment %s, offset %u: %m" -msgstr "ログセグメント%s、オフセット%uを読み取れませんでした: %m" +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "読み取られたタイムラインIDは%uでしたが、%uであるはずです。" -#: access/transam/xlog.c:11978 access/transam/xlogutils.c:977 +#: access/transam/xlogrecovery.c:1640 #, c-format -msgid "could not read from log segment %s, offset %u: read %d of %zu" -msgstr "ログセグメント%1$s、オフセット%2$uを読み取れませんでした: %4$zu 中 %3$d の読み取り" +msgid "redo starts at %X/%X" +msgstr "REDOを%X/%Xから開始します" -#: access/transam/xlog.c:12507 +#: access/transam/xlogrecovery.c:1653 #, c-format -msgid "wal receiver process shutdown requested" -msgstr "wal receiverプロセスのシャットダウンが要求されました" +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "REDO進行中、経過時間 %ld.%02d秒, 現在のLSN: %X/%X" -#: access/transam/xlog.c:12594 +#: access/transam/xlogrecovery.c:1745 #, c-format -msgid "received promote request" -msgstr "昇格要求を受信しました" +msgid "requested recovery stop point is before consistent recovery point" +msgstr "要求されたリカバリ停止ポイントは、一貫性があるリカバリポイントより前にあります" -#: access/transam/xlog.c:12607 +#: access/transam/xlogrecovery.c:1777 #, c-format -msgid "promote trigger file found: %s" -msgstr "昇格トリガファイルがあります: %s" +msgid "redo done at %X/%X system usage: %s" +msgstr "REDOが%X/%Xで終了しました、システム使用状況: %s" -#: access/transam/xlog.c:12615 +#: access/transam/xlogrecovery.c:1783 #, c-format -msgid "could not stat promote trigger file \"%s\": %m" -msgstr "昇格トリガファイル\"%s\"のstatに失敗しました: %m" +msgid "last completed transaction was at log time %s" +msgstr "最後に完了したトランザクションのログ時刻は%sでした" -#: access/transam/xlogarchive.c:205 +#: access/transam/xlogrecovery.c:1792 #, c-format -msgid "archive file \"%s\" has wrong size: %lu instead of %lu" -msgstr "アーカイブファイル\"%s\"のサイズが不正です: %lu、正しくは%lu" +msgid "redo is not required" +msgstr "REDOは必要ありません" -#: access/transam/xlogarchive.c:214 +#: access/transam/xlogrecovery.c:1803 #, c-format -msgid "restored log file \"%s\" from archive" -msgstr "ログファイル\"%s\"をアーカイブからリストアしました" +msgid "recovery ended before configured recovery target was reached" +msgstr "指定したリカバリターゲットに到達する前にリカバリが終了しました" -#: access/transam/xlogarchive.c:259 +#: access/transam/xlogrecovery.c:1978 #, c-format -msgid "could not restore file \"%s\" from archive: %s" -msgstr "ファイル\"%s\"をアーカイブからリストアできませんでした: %s" +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "%X/%Xで%sに上書きされて失われた継続行を正常にスキップしました" -#. translator: First %s represents a postgresql.conf parameter name like -#. "recovery_end_command", the 2nd is the value of that parameter, the -#. third an already translated error message. -#: access/transam/xlogarchive.c:368 +#: access/transam/xlogrecovery.c:2074 #, c-format -msgid "%s \"%s\": %s" -msgstr "%s \"%s\": %s" +msgid "consistent recovery state reached at %X/%X" +msgstr "%X/%X でリカバリの一貫性が確保されました" -#: access/transam/xlogarchive.c:478 access/transam/xlogarchive.c:542 +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2112 #, c-format -msgid "could not create archive status file \"%s\": %m" -msgstr "アーカイブステータスファイル\"%s\"を作成できませんでした: %m" +msgid "WAL redo at %X/%X for %s" +msgstr "%X/%Xにある%sのWAL再生" -#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:550 +#: access/transam/xlogrecovery.c:2208 #, c-format -msgid "could not write archive status file \"%s\": %m" -msgstr "アーカイブステータスファイル\"%s\"に書き込めませんでした: %m" +msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" +msgstr "チェックポイントレコードにおいて想定外の前回のタイムラインID %u(現在のタイムラインIDは%u)がありました" -#: access/transam/xlogfuncs.c:74 +#: access/transam/xlogrecovery.c:2217 #, c-format -msgid "a backup is already in progress in this session" -msgstr "このセッションではすでにバックアップが進行中です" +msgid "unexpected timeline ID %u (after %u) in checkpoint record" +msgstr "チェックポイントレコードにおいて想定外のタイムラインID %u (%uの後)がありました" -#: access/transam/xlogfuncs.c:132 access/transam/xlogfuncs.c:213 +#: access/transam/xlogrecovery.c:2233 #, c-format -msgid "non-exclusive backup in progress" -msgstr "非排他バックアップが進行中です" +msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" +msgstr "タイムライン%4$uの最小リカバリポイント%2$X/%3$Xに達する前のチェックポイントレコード内の想定外のタイムラインID%1$u。" -#: access/transam/xlogfuncs.c:133 access/transam/xlogfuncs.c:214 +#: access/transam/xlogrecovery.c:2415 access/transam/xlogrecovery.c:2686 #, c-format -msgid "Did you mean to use pg_stop_backup('f')?" -msgstr "pg_stop_backup('f') を実行しようとしていたのではないですか?" +msgid "recovery stopping after reaching consistency" +msgstr "リカバリ処理は一貫性確保後に停止します" -#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1311 commands/event_trigger.c:1863 commands/extension.c:1944 commands/extension.c:2052 commands/extension.c:2337 commands/prepare.c:713 executor/execExpr.c:2203 executor/execSRF.c:728 executor/functions.c:1046 foreign/foreign.c:520 libpq/hba.c:2668 replication/logical/launcher.c:1090 replication/logical/logicalfuncs.c:157 replication/logical/origin.c:1481 replication/slotfuncs.c:252 -#: replication/walsender.c:3258 storage/ipc/shmem.c:550 utils/adt/datetime.c:4766 utils/adt/genfile.c:505 utils/adt/genfile.c:588 utils/adt/jsonfuncs.c:1792 utils/adt/jsonfuncs.c:1904 utils/adt/jsonfuncs.c:2092 utils/adt/jsonfuncs.c:2201 utils/adt/jsonfuncs.c:3663 utils/adt/misc.c:215 utils/adt/pgstatfuncs.c:476 utils/adt/pgstatfuncs.c:584 utils/adt/pgstatfuncs.c:1719 utils/fmgr/funcapi.c:72 utils/misc/guc.c:9666 utils/mmgr/mcxt.c:1333 utils/mmgr/portalmem.c:1136 +#: access/transam/xlogrecovery.c:2436 #, c-format -msgid "set-valued function called in context that cannot accept a set" -msgstr "このコンテキストで集合値の関数は集合を受け付けられません" +msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "リカバリ処理はWAL位置(LSN)\"%X/%X\"の前で停止します" -#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1315 commands/event_trigger.c:1867 commands/extension.c:1948 commands/extension.c:2056 commands/extension.c:2341 commands/prepare.c:717 foreign/foreign.c:525 libpq/hba.c:2672 replication/logical/launcher.c:1094 replication/logical/logicalfuncs.c:161 replication/logical/origin.c:1485 replication/slotfuncs.c:256 replication/walsender.c:3262 storage/ipc/shmem.c:554 utils/adt/datetime.c:4770 -#: utils/adt/genfile.c:509 utils/adt/genfile.c:592 utils/adt/misc.c:219 utils/adt/pgstatfuncs.c:480 utils/adt/pgstatfuncs.c:588 utils/adt/pgstatfuncs.c:1723 utils/misc/guc.c:9670 utils/misc/pg_config.c:43 utils/mmgr/mcxt.c:1337 utils/mmgr/portalmem.c:1140 +#: access/transam/xlogrecovery.c:2521 #, c-format -msgid "materialize mode required, but it is not allowed in this context" -msgstr "マテリアライズモードが必要ですが、現在のコンテクストで禁止されています" +msgid "recovery stopping before commit of transaction %u, time %s" +msgstr "リカバリ処理はトランザクション%uのコミット、時刻%sの前に停止します" -#: access/transam/xlogfuncs.c:230 +#: access/transam/xlogrecovery.c:2528 #, c-format -msgid "non-exclusive backup is not in progress" -msgstr "非排他バックアップは進行中ではありません" +msgid "recovery stopping before abort of transaction %u, time %s" +msgstr "リカバリ処理はトランザクション%uのアボート、時刻%sの前に停止します" -#: access/transam/xlogfuncs.c:231 +#: access/transam/xlogrecovery.c:2581 #, c-format -msgid "Did you mean to use pg_stop_backup('t')?" -msgstr "pg_stop_backup('t') を実行しようとしていたのではないですか?" +msgid "recovery stopping at restore point \"%s\", time %s" +msgstr "リカバリ処理は復元ポイント\"%s\"、時刻%s に停止します" -#: access/transam/xlogfuncs.c:307 +#: access/transam/xlogrecovery.c:2599 #, c-format -msgid "WAL level not sufficient for creating a restore point" -msgstr "リストアポイントを作るにはWALレベルが不足しています" +msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" +msgstr "リカバリ処理はWAL位置(LSN)\"%X/%X\"の後で停止します" -#: access/transam/xlogfuncs.c:315 +#: access/transam/xlogrecovery.c:2666 #, c-format -msgid "value too long for restore point (maximum %d characters)" -msgstr "リストアポイントとしては値が長すぎます(最大%d文字)" +msgid "recovery stopping after commit of transaction %u, time %s" +msgstr "リカバリ処理はトランザクション%uのコミット、時刻%sの後に停止します" -#: access/transam/xlogfuncs.c:453 access/transam/xlogfuncs.c:510 +#: access/transam/xlogrecovery.c:2674 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "リカバリ中は %s を実行できません。" +msgid "recovery stopping after abort of transaction %u, time %s" +msgstr "リカバリ処理はトランザクション%uのアボート、時刻%sの後に停止します" -#: access/transam/xlogfuncs.c:531 access/transam/xlogfuncs.c:558 access/transam/xlogfuncs.c:582 access/transam/xlogfuncs.c:722 +#: access/transam/xlogrecovery.c:2755 #, c-format -msgid "recovery is not in progress" -msgstr "リカバリが進行中ではありません" +msgid "pausing at the end of recovery" +msgstr "リカバリ完了位置で一時停止しています" -#: access/transam/xlogfuncs.c:532 access/transam/xlogfuncs.c:559 access/transam/xlogfuncs.c:583 access/transam/xlogfuncs.c:723 +#: access/transam/xlogrecovery.c:2756 #, c-format -msgid "Recovery control functions can only be executed during recovery." -msgstr "リカバリ制御関数リカバリ中にのみを実行可能です。" +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "再開するには pg_wal_replay_resume() を実行してください" -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:564 +#: access/transam/xlogrecovery.c:2759 access/transam/xlogrecovery.c:4550 #, c-format -msgid "standby promotion is ongoing" -msgstr "スタンバイの昇格を実行中です" +msgid "recovery has paused" +msgstr "リカバリは一時停止中です" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:565 +#: access/transam/xlogrecovery.c:2760 #, c-format -msgid "%s cannot be executed after promotion is triggered." -msgstr "%sは昇格を開始した後には実行できません。" +msgid "Execute pg_wal_replay_resume() to continue." +msgstr "再開するには pg_xlog_replay_resume() を実行してください" -#: access/transam/xlogfuncs.c:728 +#: access/transam/xlogrecovery.c:3020 #, c-format -msgid "\"wait_seconds\" must not be negative or zero" -msgstr "\"wait_seconds\"は負の値もしくはゼロにはできません" +msgid "unexpected timeline ID %u in log segment %s, offset %u" +msgstr "ログファイル%2$s、オフセット%3$uのタイムラインID%1$uは想定外です" -#: access/transam/xlogfuncs.c:748 storage/ipc/signalfuncs.c:164 +#: access/transam/xlogrecovery.c:3225 #, c-format -msgid "failed to send signal to postmaster: %m" -msgstr "postmasterにシグナルを送信できませんでした: %m" +msgid "could not read from log segment %s, offset %u: %m" +msgstr "ログセグメント%s、オフセット%uを読み取れませんでした: %m" -#: access/transam/xlogfuncs.c:784 +#: access/transam/xlogrecovery.c:3231 #, c-format -msgid "server did not promote within %d seconds" -msgstr "サーバは%d 秒以内に昇格しませんでした" +msgid "could not read from log segment %s, offset %u: read %d of %zu" +msgstr "ログセグメント%1$s、オフセット%2$uを読み取れませんでした: %4$zu 中 %3$d の読み取り" -#: access/transam/xlogreader.c:349 +#: access/transam/xlogrecovery.c:3867 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "%X/%Xのレコードオフセットが不正です" +msgid "invalid primary checkpoint link in control file" +msgstr "制御ファイル内の最初のチェックポイントへのリンクが不正です" -#: access/transam/xlogreader.c:357 +#: access/transam/xlogrecovery.c:3871 #, c-format -msgid "contrecord is requested by %X/%X" -msgstr "%X/%Xでは継続レコードが必要です" +msgid "invalid checkpoint link in backup_label file" +msgstr "backup_labelファイル内のチェックポイントへのリンクが不正です" -#: access/transam/xlogreader.c:398 access/transam/xlogreader.c:695 +#: access/transam/xlogrecovery.c:3889 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "%X/%Xのレコード長が不正です:長さは%uである必要がありますが、実際は%uでした" +msgid "invalid primary checkpoint record" +msgstr "最初のチェックポイントレコードが不正です" -#: access/transam/xlogreader.c:422 +#: access/transam/xlogrecovery.c:3893 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "%2$X/%3$Xのレコード長%1$uが大きすぎます" +msgid "invalid checkpoint record" +msgstr "チェックポイントレコードが不正です" -#: access/transam/xlogreader.c:454 +#: access/transam/xlogrecovery.c:3904 #, c-format -msgid "there is no contrecord flag at %X/%X" -msgstr "%X/%Xでcontrecordフラグがありません" +msgid "invalid resource manager ID in primary checkpoint record" +msgstr "プライマリチェックポイントレコード内のリソースマネージャIDが不正です" -#: access/transam/xlogreader.c:467 +#: access/transam/xlogrecovery.c:3908 #, c-format -msgid "invalid contrecord length %u at %X/%X" -msgstr "%2$X/%3$Xのcontrecordの長さ %1$u は不正です" +msgid "invalid resource manager ID in checkpoint record" +msgstr "チェックポイントレコード内のリソースマネージャIDがで不正です" -#: access/transam/xlogreader.c:703 +#: access/transam/xlogrecovery.c:3921 #, c-format -msgid "invalid resource manager ID %u at %X/%X" -msgstr "%2$X/%3$XのリソースマネージャID %1$uは不正です" +msgid "invalid xl_info in primary checkpoint record" +msgstr "最初のチェックポイントレコード内のxl_infoが不正です" -#: access/transam/xlogreader.c:717 access/transam/xlogreader.c:734 +#: access/transam/xlogrecovery.c:3925 #, c-format -msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "%3$X/%4$Xのレコードの後方リンク%1$X/%2$Xが不正です" +msgid "invalid xl_info in checkpoint record" +msgstr "チェックポイントレコード内のxl_infoが不正です" -#: access/transam/xlogreader.c:771 +#: access/transam/xlogrecovery.c:3936 #, c-format -msgid "incorrect resource manager data checksum in record at %X/%X" -msgstr "%X/%Xのレコード内のリソースマネージャデータのチェックサムが不正です" +msgid "invalid length of primary checkpoint record" +msgstr "最初のチェックポイントレコード長が不正です" -#: access/transam/xlogreader.c:808 +#: access/transam/xlogrecovery.c:3940 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "ログセグメント%2$s、オフセット%3$uのマジックナンバー%1$04Xは不正です" +msgid "invalid length of checkpoint record" +msgstr "チェックポイントレコード長が不正です" -#: access/transam/xlogreader.c:822 access/transam/xlogreader.c:863 +#: access/transam/xlogrecovery.c:3996 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "ログセグメント %2$s、オフセット%3$uの情報ビット%1$04Xは不正です" +msgid "new timeline %u is not a child of database system timeline %u" +msgstr "新しいタイムライン%uはデータベースシステムのタイムライン%uの子ではありません" -#: access/transam/xlogreader.c:837 +#: access/transam/xlogrecovery.c:4010 #, c-format -msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" -msgstr "WALファイルは異なるデータベースシステム由来のものです: WALファイルのデータベースシステム識別子は %lluで、pg_control におけるデータベースシステム識別子は %lluです" +msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" +msgstr "新しいタイムライン%uは現在のデータベースシステムのタイムライン%uから現在のリカバリポイント%X/%Xより前に分岐しています" -#: access/transam/xlogreader.c:845 +#: access/transam/xlogrecovery.c:4029 #, c-format -msgid "WAL file is from different database system: incorrect segment size in page header" -msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのセグメントサイズが正しくありません" +msgid "new target timeline is %u" +msgstr "新しい目標タイムラインは%uです" -#: access/transam/xlogreader.c:851 +#: access/transam/xlogrecovery.c:4232 #, c-format -msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" -msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのXLOG_BLCKSZが正しくありません" +msgid "WAL receiver process shutdown requested" +msgstr "wal receiverプロセスのシャットダウンが要求されました" -#: access/transam/xlogreader.c:882 +#: access/transam/xlogrecovery.c:4295 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "ログセグメント%3$s、オフセット%4$uに想定外のページアドレス%1$X/%2$X" +msgid "received promote request" +msgstr "昇格要求を受信しました" -#: access/transam/xlogreader.c:907 +#: access/transam/xlogrecovery.c:4308 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "ログセグメント%3$s、オフセット%4$uのタイムラインID %1$u(%2$uの後)が順序通りではありません" +msgid "promote trigger file found: %s" +msgstr "昇格トリガファイルがあります: %s" -#: access/transam/xlogreader.c:1252 +#: access/transam/xlogrecovery.c:4316 #, c-format -msgid "out-of-order block_id %u at %X/%X" -msgstr "block_id %uが%X/%Xで不正です" +msgid "could not stat promote trigger file \"%s\": %m" +msgstr "昇格トリガファイル\"%s\"のstatに失敗しました: %m" -#: access/transam/xlogreader.c:1275 +#: access/transam/xlogrecovery.c:4541 #, c-format -msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" -msgstr "BKPBLOCK_HAS_DATAが設定されていますが、%X/%Xにデータがありません" +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "不十分なパラメータ設定のため、ホットスタンバイを使用できません" -#: access/transam/xlogreader.c:1282 +#: access/transam/xlogrecovery.c:4542 access/transam/xlogrecovery.c:4569 access/transam/xlogrecovery.c:4599 #, c-format -msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" -msgstr "BKPBLOCK_HAS_DATAが設定されていませんが、%2$X/%3$Xのデータ長は%1$uです" +msgid "%s = %d is a lower setting than on the primary server, where its value was %d." +msgstr "%s = %d はプライマリサーバの設定値より小さいです、プライマリサーバーではこの値は%dでした。" -#: access/transam/xlogreader.c:1318 +#: access/transam/xlogrecovery.c:4551 #, c-format -msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLEが設定されていますが、%4$X/%5$Xでホールオフセット%1$u、長さ%2$u、ブロックイメージ長%3$uです" +msgid "If recovery is unpaused, the server will shut down." +msgstr "リカバリの一時停止を解除すると、サーバーはシャットダウンします。" -#: access/transam/xlogreader.c:1334 +#: access/transam/xlogrecovery.c:4552 #, c-format -msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLEが設定されていませんが、%3$X/%4$Xにおけるホールオフセット%1$uの長さが%2$uです" +msgid "You can then restart the server after making the necessary configuration changes." +msgstr "その後、必要な設定変更を行った後にサーバーを再起動できます。" -#: access/transam/xlogreader.c:1349 +#: access/transam/xlogrecovery.c:4563 #, c-format -msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" -msgstr "BKPIMAGE_IS_COMPRESSEDが設定されていますが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです" +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "不十分なパラメータ設定のため、昇格できません" -#: access/transam/xlogreader.c:1364 +#: access/transam/xlogrecovery.c:4573 #, c-format -msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLEもBKPIMAGE_IS_COMPRESSEDも設定されていませんが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです" +msgid "Restart the server after making the necessary configuration changes." +msgstr "必要な設定変更を行ったのち、サーバーを再起動してください。" -#: access/transam/xlogreader.c:1380 +#: access/transam/xlogrecovery.c:4597 #, c-format -msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" -msgstr "BKPBLOCK_SAME_RELが設定されていますが、%X/%Xにおいて以前のリレーションがありません" +msgid "recovery aborted because of insufficient parameter settings" +msgstr "不十分なパラメータ設定値のためリカバリが停止しました" -#: access/transam/xlogreader.c:1392 +#: access/transam/xlogrecovery.c:4603 #, c-format -msgid "invalid block_id %u at %X/%X" -msgstr "%2$X/%3$Xにおけるblock_id %1$uが不正です" +msgid "You can restart the server after making the necessary configuration changes." +msgstr "必要な設定変更を行うことでサーバーを再起動できます。" -#: access/transam/xlogreader.c:1481 +#: access/transam/xlogutils.c:1052 #, c-format -msgid "record with invalid length at %X/%X" -msgstr "%X/%Xのレコードのサイズが不正です" +msgid "could not read from log segment %s, offset %d: %m" +msgstr "ログセグメント%s、オフセット%dを読み取れませんでした: %m" -#: access/transam/xlogreader.c:1570 +#: access/transam/xlogutils.c:1059 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "%X/%X、ブロック %d での圧縮イメージが不正です" +msgid "could not read from log segment %s, offset %d: read %d of %d" +msgstr "ログセグメント%1$s、オフセット%2$dを読み取れませんでした: %4$d 中 %3$d 読み取りました" -#: bootstrap/bootstrap.c:271 +#: bootstrap/bootstrap.c:263 #, c-format msgid "-X requires a power of two value between 1 MB and 1 GB" msgstr "-X オプションの値は1MBから1GBの間の2の累乗を指定します" -#: bootstrap/bootstrap.c:288 postmaster/postmaster.c:845 tcop/postgres.c:3705 +#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3889 #, c-format msgid "--%s requires a value" msgstr "--%sには値が必要です" -#: bootstrap/bootstrap.c:293 postmaster/postmaster.c:850 tcop/postgres.c:3710 +#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3894 #, c-format msgid "-c %s requires a value" msgstr "-c %sは値が必要です" -#: bootstrap/bootstrap.c:304 postmaster/postmaster.c:862 postmaster/postmaster.c:875 +#: bootstrap/bootstrap.c:296 postmaster/postmaster.c:863 postmaster/postmaster.c:876 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "詳細については\"%s --help\"を実行してください。\n" -#: bootstrap/bootstrap.c:313 +#: bootstrap/bootstrap.c:305 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s: コマンドライン引数が不正です\n" -#: catalog/aclchk.c:181 +#: catalog/aclchk.c:185 #, c-format msgid "grant options can only be granted to roles" msgstr "グラントオプションはロールにのみ付与できます" -#: catalog/aclchk.c:300 +#: catalog/aclchk.c:307 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の列\"%1$s\"に付与された権限はありません" -#: catalog/aclchk.c:305 +#: catalog/aclchk.c:312 #, c-format msgid "no privileges were granted for \"%s\"" msgstr "\"%s\"に付与された権限はありません" -#: catalog/aclchk.c:313 +#: catalog/aclchk.c:320 #, c-format msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の列\"%1$s\"に対して一部の権限が付与されませんでした" -#: catalog/aclchk.c:318 +#: catalog/aclchk.c:325 #, c-format msgid "not all privileges were granted for \"%s\"" msgstr "\"%s\"に対して一部の権限が付与されませんでした" -#: catalog/aclchk.c:329 +#: catalog/aclchk.c:336 #, c-format msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の列\"%1$s\"に対して取り消せた権限はありません" -#: catalog/aclchk.c:334 +#: catalog/aclchk.c:341 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "\"%s\"に対して取り消せた権限はありません" -#: catalog/aclchk.c:342 +#: catalog/aclchk.c:349 #, c-format msgid "not all privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の列\"%1$s\"に対して一部の権限が取り消せませんでした" -#: catalog/aclchk.c:347 +#: catalog/aclchk.c:354 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "\"%s\"に対して一部の権限が取り消せませんでした" -#: catalog/aclchk.c:430 catalog/aclchk.c:973 +#: catalog/aclchk.c:386 +#, c-format +msgid "grantor must be current user" +msgstr "権限付与者は現在のユーザーでなければなりません" + +#: catalog/aclchk.c:454 catalog/aclchk.c:1029 #, c-format msgid "invalid privilege type %s for relation" msgstr "リレーションに対する不正な権限のタイプ %s" -#: catalog/aclchk.c:434 catalog/aclchk.c:977 +#: catalog/aclchk.c:458 catalog/aclchk.c:1033 #, c-format msgid "invalid privilege type %s for sequence" msgstr "シーケンスに対する不正な権限のタイプ %s" -#: catalog/aclchk.c:438 +#: catalog/aclchk.c:462 #, c-format msgid "invalid privilege type %s for database" msgstr "データベースに対する不正な権限タイプ %s" -#: catalog/aclchk.c:442 +#: catalog/aclchk.c:466 #, c-format msgid "invalid privilege type %s for domain" msgstr "ドメインに対する不正な権限タイプ %s" -#: catalog/aclchk.c:446 catalog/aclchk.c:981 +#: catalog/aclchk.c:470 catalog/aclchk.c:1037 #, c-format msgid "invalid privilege type %s for function" msgstr "関数に対する不正な権限タイプ %s" -#: catalog/aclchk.c:450 +#: catalog/aclchk.c:474 #, c-format msgid "invalid privilege type %s for language" msgstr "言語に対する不正な権限タイプ %s" -#: catalog/aclchk.c:454 +#: catalog/aclchk.c:478 #, c-format msgid "invalid privilege type %s for large object" msgstr "ラージオブジェクトに対する不正な権限タイプ %s" -#: catalog/aclchk.c:458 catalog/aclchk.c:997 +#: catalog/aclchk.c:482 catalog/aclchk.c:1053 #, c-format msgid "invalid privilege type %s for schema" msgstr "スキーマに対する不正な権限タイプ %s" -#: catalog/aclchk.c:462 catalog/aclchk.c:985 +#: catalog/aclchk.c:486 catalog/aclchk.c:1041 #, c-format msgid "invalid privilege type %s for procedure" msgstr "プロシージャに対する不正な権限タイプ %s" -#: catalog/aclchk.c:466 catalog/aclchk.c:989 +#: catalog/aclchk.c:490 catalog/aclchk.c:1045 #, c-format msgid "invalid privilege type %s for routine" msgstr "ルーチンに対する不正な権限のタイプ %s" -#: catalog/aclchk.c:470 +#: catalog/aclchk.c:494 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "テーブル空間に対する不正な権限タイプ %s" -#: catalog/aclchk.c:474 catalog/aclchk.c:993 +#: catalog/aclchk.c:498 catalog/aclchk.c:1049 #, c-format msgid "invalid privilege type %s for type" msgstr "型に対する不正な権限タイプ %s" -#: catalog/aclchk.c:478 +#: catalog/aclchk.c:502 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "外部データラッパーに対する不正な権限タイプ %s" -#: catalog/aclchk.c:482 +#: catalog/aclchk.c:506 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "外部サーバに対する不正な権限タイプ %s" -#: catalog/aclchk.c:521 +#: catalog/aclchk.c:510 +#, c-format +msgid "invalid privilege type %s for parameter" +msgstr "パラメータに対する不正な権限タイプ %s" + +#: catalog/aclchk.c:549 #, c-format msgid "column privileges are only valid for relations" msgstr "列権限はリレーションに対してのみ有効です" -#: catalog/aclchk.c:681 catalog/aclchk.c:4067 catalog/aclchk.c:4849 catalog/objectaddress.c:1060 catalog/pg_largeobject.c:116 storage/large_object/inv_api.c:285 +#: catalog/aclchk.c:712 catalog/aclchk.c:4486 catalog/aclchk.c:5333 catalog/objectaddress.c:1072 catalog/pg_largeobject.c:116 storage/large_object/inv_api.c:287 #, c-format msgid "large object %u does not exist" msgstr "ラージオブジェクト%uは存在しません" -#: catalog/aclchk.c:910 catalog/aclchk.c:919 commands/collationcmds.c:118 commands/copy.c:1184 commands/copy.c:1204 commands/copy.c:1213 commands/copy.c:1222 commands/copy.c:1231 commands/copy.c:1240 commands/copy.c:1249 commands/copy.c:1258 commands/copy.c:1276 commands/copy.c:1292 commands/copy.c:1312 commands/copy.c:1329 commands/dbcommands.c:157 commands/dbcommands.c:166 commands/dbcommands.c:175 commands/dbcommands.c:184 commands/dbcommands.c:193 -#: commands/dbcommands.c:202 commands/dbcommands.c:211 commands/dbcommands.c:220 commands/dbcommands.c:229 commands/dbcommands.c:238 commands/dbcommands.c:260 commands/dbcommands.c:1502 commands/dbcommands.c:1511 commands/dbcommands.c:1520 commands/dbcommands.c:1529 commands/extension.c:1735 commands/extension.c:1745 commands/extension.c:1755 commands/extension.c:3055 commands/foreigncmds.c:539 commands/foreigncmds.c:548 commands/functioncmds.c:570 -#: commands/functioncmds.c:736 commands/functioncmds.c:745 commands/functioncmds.c:754 commands/functioncmds.c:763 commands/functioncmds.c:1961 commands/functioncmds.c:1969 commands/publicationcmds.c:90 commands/publicationcmds.c:133 commands/sequence.c:1267 commands/sequence.c:1277 commands/sequence.c:1287 commands/sequence.c:1297 commands/sequence.c:1307 commands/sequence.c:1317 commands/sequence.c:1327 commands/sequence.c:1337 commands/sequence.c:1347 -#: commands/subscriptioncmds.c:113 commands/subscriptioncmds.c:123 commands/subscriptioncmds.c:133 commands/subscriptioncmds.c:143 commands/subscriptioncmds.c:157 commands/subscriptioncmds.c:168 commands/subscriptioncmds.c:182 commands/subscriptioncmds.c:192 commands/tablecmds.c:6959 commands/typecmds.c:322 commands/typecmds.c:1355 commands/typecmds.c:1364 commands/typecmds.c:1372 commands/typecmds.c:1380 commands/typecmds.c:1388 commands/user.c:133 -#: commands/user.c:147 commands/user.c:156 commands/user.c:165 commands/user.c:174 commands/user.c:183 commands/user.c:192 commands/user.c:201 commands/user.c:210 commands/user.c:219 commands/user.c:228 commands/user.c:237 commands/user.c:246 commands/user.c:582 commands/user.c:590 commands/user.c:598 commands/user.c:606 commands/user.c:614 commands/user.c:622 commands/user.c:630 commands/user.c:638 commands/user.c:647 commands/user.c:655 commands/user.c:663 -#: parser/parse_utilcmd.c:386 replication/pgoutput/pgoutput.c:145 replication/pgoutput/pgoutput.c:166 replication/pgoutput/pgoutput.c:180 replication/walsender.c:886 replication/walsender.c:897 replication/walsender.c:907 -#, c-format -msgid "conflicting or redundant options" -msgstr "競合するオプション、あるいは余計なオプションがあります" - -#: catalog/aclchk.c:1030 +#: catalog/aclchk.c:1086 #, c-format msgid "default privileges cannot be set for columns" msgstr "デフォルト権限は列には設定できません" -#: catalog/aclchk.c:1190 +#: catalog/aclchk.c:1246 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "GRANT/REVOKE ON SCHEMAS を使っている時には IN SCHEMA 句は指定できません" -#: catalog/aclchk.c:1525 catalog/catalog.c:506 catalog/objectaddress.c:1522 commands/analyze.c:378 commands/copy.c:5132 commands/sequence.c:1702 commands/tablecmds.c:6499 commands/tablecmds.c:6657 commands/tablecmds.c:6731 commands/tablecmds.c:6801 commands/tablecmds.c:6884 commands/tablecmds.c:6978 commands/tablecmds.c:7037 commands/tablecmds.c:7110 commands/tablecmds.c:7139 commands/tablecmds.c:7294 commands/tablecmds.c:7376 commands/tablecmds.c:7469 -#: commands/tablecmds.c:7624 commands/tablecmds.c:10829 commands/tablecmds.c:11011 commands/tablecmds.c:11171 commands/tablecmds.c:12254 commands/trigger.c:876 parser/analyze.c:2339 parser/parse_relation.c:713 parser/parse_target.c:1036 parser/parse_type.c:144 parser/parse_utilcmd.c:3202 parser/parse_utilcmd.c:3237 parser/parse_utilcmd.c:3279 utils/adt/acl.c:2870 utils/adt/ruleutils.c:2535 +#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:763 commands/sequence.c:1655 commands/tablecmds.c:7200 commands/tablecmds.c:7356 commands/tablecmds.c:7406 commands/tablecmds.c:7480 commands/tablecmds.c:7550 commands/tablecmds.c:7662 commands/tablecmds.c:7756 commands/tablecmds.c:7815 commands/tablecmds.c:7904 commands/tablecmds.c:7934 commands/tablecmds.c:8062 +#: commands/tablecmds.c:8144 commands/tablecmds.c:8300 commands/tablecmds.c:8418 commands/tablecmds.c:12091 commands/tablecmds.c:12272 commands/tablecmds.c:12432 commands/tablecmds.c:13596 commands/tablecmds.c:16181 commands/trigger.c:958 parser/analyze.c:2465 parser/parse_relation.c:725 parser/parse_target.c:1063 parser/parse_type.c:144 parser/parse_utilcmd.c:3424 parser/parse_utilcmd.c:3460 parser/parse_utilcmd.c:3502 utils/adt/acl.c:2869 +#: utils/adt/ruleutils.c:2812 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"の列\"%1$s\"は存在しません" -#: catalog/aclchk.c:1788 catalog/objectaddress.c:1362 commands/sequence.c:1140 commands/tablecmds.c:236 commands/tablecmds.c:15563 utils/adt/acl.c:2060 utils/adt/acl.c:2090 utils/adt/acl.c:2122 utils/adt/acl.c:2154 utils/adt/acl.c:2182 utils/adt/acl.c:2212 +#: catalog/aclchk.c:1850 catalog/objectaddress.c:1383 commands/sequence.c:1164 commands/tablecmds.c:252 commands/tablecmds.c:17072 utils/adt/acl.c:2077 utils/adt/acl.c:2107 utils/adt/acl.c:2139 utils/adt/acl.c:2171 utils/adt/acl.c:2199 utils/adt/acl.c:2229 #, c-format msgid "\"%s\" is not a sequence" msgstr "\"%s\"はシーケンスではありません" -#: catalog/aclchk.c:1826 +#: catalog/aclchk.c:1888 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "シーケンス \"%s\"では USAGE, SELECT, UPDATE 権限のみをサポートします" -#: catalog/aclchk.c:1843 +#: catalog/aclchk.c:1905 #, c-format msgid "invalid privilege type %s for table" msgstr "テーブルに対する権限タイプ%sは不正です" -#: catalog/aclchk.c:2009 +#: catalog/aclchk.c:2071 #, c-format msgid "invalid privilege type %s for column" msgstr "列では権限タイプ %s は無効です" -#: catalog/aclchk.c:2022 +#: catalog/aclchk.c:2084 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "シーケンス \"%s\"では USAGE, SELECT, UPDATE のみをサポートします" -#: catalog/aclchk.c:2604 +#: catalog/aclchk.c:2666 #, c-format msgid "language \"%s\" is not trusted" msgstr "言語\"%s\"は信頼されていません" -#: catalog/aclchk.c:2606 +#: catalog/aclchk.c:2668 #, c-format msgid "GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages." msgstr "信頼されない言語はスーパユーザのみが使用可能なため、GRANTとREVOKEは信頼されない言語上では実行不可です。" -#: catalog/aclchk.c:3120 +#: catalog/aclchk.c:3182 #, c-format msgid "cannot set privileges of array types" msgstr "配列型の権限を設定できません" -#: catalog/aclchk.c:3121 +#: catalog/aclchk.c:3183 #, c-format msgid "Set the privileges of the element type instead." msgstr "代わりに要素型の権限を設定してください。" -#: catalog/aclchk.c:3128 catalog/objectaddress.c:1656 +#: catalog/aclchk.c:3190 catalog/objectaddress.c:1649 #, c-format msgid "\"%s\" is not a domain" msgstr "\"%s\"はドメインではありません" -#: catalog/aclchk.c:3248 +#: catalog/aclchk.c:3462 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "認識できない権限タイプ\"%s\"" -#: catalog/aclchk.c:3309 +#: catalog/aclchk.c:3527 #, c-format msgid "permission denied for aggregate %s" msgstr "集約 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3312 +#: catalog/aclchk.c:3530 #, c-format msgid "permission denied for collation %s" msgstr "照合順序 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3315 +#: catalog/aclchk.c:3533 #, c-format msgid "permission denied for column %s" msgstr "列 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3318 +#: catalog/aclchk.c:3536 #, c-format msgid "permission denied for conversion %s" msgstr "変換 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3321 +#: catalog/aclchk.c:3539 #, c-format msgid "permission denied for database %s" msgstr "データベース %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3324 +#: catalog/aclchk.c:3542 #, c-format msgid "permission denied for domain %s" msgstr "ドメイン %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3327 +#: catalog/aclchk.c:3545 #, c-format msgid "permission denied for event trigger %s" msgstr "イベントトリガ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3330 +#: catalog/aclchk.c:3548 #, c-format msgid "permission denied for extension %s" msgstr "機能拡張 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3333 +#: catalog/aclchk.c:3551 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "外部データラッパ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3336 +#: catalog/aclchk.c:3554 #, c-format msgid "permission denied for foreign server %s" msgstr "外部サーバ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3339 +#: catalog/aclchk.c:3557 #, c-format msgid "permission denied for foreign table %s" msgstr "外部テーブル %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3342 +#: catalog/aclchk.c:3560 #, c-format msgid "permission denied for function %s" msgstr "関数 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3345 +#: catalog/aclchk.c:3563 #, c-format msgid "permission denied for index %s" msgstr "インデックス %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3348 +#: catalog/aclchk.c:3566 #, c-format msgid "permission denied for language %s" msgstr "言語 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3351 +#: catalog/aclchk.c:3569 #, c-format msgid "permission denied for large object %s" msgstr "ラージオブジェクト %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3354 +#: catalog/aclchk.c:3572 #, c-format msgid "permission denied for materialized view %s" msgstr "実体化ビュー %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3357 +#: catalog/aclchk.c:3575 #, c-format msgid "permission denied for operator class %s" msgstr "演算子クラス %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3360 +#: catalog/aclchk.c:3578 #, c-format msgid "permission denied for operator %s" msgstr "演算子 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3363 +#: catalog/aclchk.c:3581 #, c-format msgid "permission denied for operator family %s" msgstr "演算子族 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3366 +#: catalog/aclchk.c:3584 +#, c-format +msgid "permission denied for parameter %s" +msgstr "パラメータ %s へのアクセスが拒否されました" + +#: catalog/aclchk.c:3587 #, c-format msgid "permission denied for policy %s" msgstr "ポリシ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3369 +#: catalog/aclchk.c:3590 #, c-format msgid "permission denied for procedure %s" msgstr "プロシージャ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3372 +#: catalog/aclchk.c:3593 #, c-format msgid "permission denied for publication %s" msgstr "パブリケーション%sへのアクセスが拒否されました" -#: catalog/aclchk.c:3375 +#: catalog/aclchk.c:3596 #, c-format msgid "permission denied for routine %s" msgstr "ルーチン %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3378 +#: catalog/aclchk.c:3599 #, c-format msgid "permission denied for schema %s" msgstr "スキーマ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3381 commands/sequence.c:610 commands/sequence.c:844 commands/sequence.c:886 commands/sequence.c:927 commands/sequence.c:1800 commands/sequence.c:1864 +#: catalog/aclchk.c:3602 commands/sequence.c:652 commands/sequence.c:878 commands/sequence.c:920 commands/sequence.c:961 commands/sequence.c:1753 commands/sequence.c:1817 #, c-format msgid "permission denied for sequence %s" msgstr "シーケンス %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3384 +#: catalog/aclchk.c:3605 #, c-format msgid "permission denied for statistics object %s" msgstr "統計情報オブジェクト %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3387 +#: catalog/aclchk.c:3608 #, c-format msgid "permission denied for subscription %s" msgstr "サブスクリプション %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3390 +#: catalog/aclchk.c:3611 #, c-format msgid "permission denied for table %s" msgstr "テーブル %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3393 +#: catalog/aclchk.c:3614 #, c-format msgid "permission denied for tablespace %s" msgstr "テーブル空間 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3396 +#: catalog/aclchk.c:3617 #, c-format msgid "permission denied for text search configuration %s" msgstr "テキスト検索設定 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3399 +#: catalog/aclchk.c:3620 #, c-format msgid "permission denied for text search dictionary %s" msgstr "テキスト検索辞書 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3402 +#: catalog/aclchk.c:3623 #, c-format msgid "permission denied for type %s" msgstr "型 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3405 +#: catalog/aclchk.c:3626 #, c-format msgid "permission denied for view %s" msgstr "ビュー %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3440 +#: catalog/aclchk.c:3662 #, c-format msgid "must be owner of aggregate %s" msgstr "集約 %s の所有者である必要があります" -#: catalog/aclchk.c:3443 +#: catalog/aclchk.c:3665 #, c-format msgid "must be owner of collation %s" msgstr "照合順序 %s の所有者である必要があります" -#: catalog/aclchk.c:3446 +#: catalog/aclchk.c:3668 #, c-format msgid "must be owner of conversion %s" msgstr "変換 %s の所有者である必要があります" -#: catalog/aclchk.c:3449 +#: catalog/aclchk.c:3671 #, c-format msgid "must be owner of database %s" msgstr "データベース %s の所有者である必要があります" -#: catalog/aclchk.c:3452 +#: catalog/aclchk.c:3674 #, c-format msgid "must be owner of domain %s" msgstr "ドメイン %s の所有者である必要があります" -#: catalog/aclchk.c:3455 +#: catalog/aclchk.c:3677 #, c-format msgid "must be owner of event trigger %s" msgstr "イベントトリガ %s の所有者である必要があります" -#: catalog/aclchk.c:3458 +#: catalog/aclchk.c:3680 #, c-format msgid "must be owner of extension %s" msgstr "機能拡張 %s の所有者である必要があります" -#: catalog/aclchk.c:3461 +#: catalog/aclchk.c:3683 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "外部データラッパー %s の所有者である必要があります" -#: catalog/aclchk.c:3464 +#: catalog/aclchk.c:3686 #, c-format msgid "must be owner of foreign server %s" msgstr "外部サーバ %s の所有者である必要があります" -#: catalog/aclchk.c:3467 +#: catalog/aclchk.c:3689 #, c-format msgid "must be owner of foreign table %s" msgstr "外部テーブル %s の所有者である必要があります" -#: catalog/aclchk.c:3470 +#: catalog/aclchk.c:3692 #, c-format msgid "must be owner of function %s" msgstr "関数 %s の所有者である必要があります" -#: catalog/aclchk.c:3473 +#: catalog/aclchk.c:3695 #, c-format msgid "must be owner of index %s" msgstr "インデックス %s の所有者である必要があります" -#: catalog/aclchk.c:3476 +#: catalog/aclchk.c:3698 #, c-format msgid "must be owner of language %s" msgstr "言語 %s の所有者である必要があります" -#: catalog/aclchk.c:3479 +#: catalog/aclchk.c:3701 #, c-format msgid "must be owner of large object %s" msgstr "ラージオブジェクト %s の所有者である必要があります" -#: catalog/aclchk.c:3482 +#: catalog/aclchk.c:3704 #, c-format msgid "must be owner of materialized view %s" msgstr "実体化ビュー %s の所有者である必要があります" -#: catalog/aclchk.c:3485 +#: catalog/aclchk.c:3707 #, c-format msgid "must be owner of operator class %s" msgstr "演算子クラス %s の所有者である必要があります" -#: catalog/aclchk.c:3488 +#: catalog/aclchk.c:3710 #, c-format msgid "must be owner of operator %s" msgstr "演算子 %s の所有者である必要があります" -#: catalog/aclchk.c:3491 +#: catalog/aclchk.c:3713 #, c-format msgid "must be owner of operator family %s" msgstr "演算子族 %s の所有者である必要があります" -#: catalog/aclchk.c:3494 +#: catalog/aclchk.c:3716 #, c-format msgid "must be owner of procedure %s" msgstr "プロシージャ %s の所有者である必要があります" -#: catalog/aclchk.c:3497 +#: catalog/aclchk.c:3719 #, c-format msgid "must be owner of publication %s" msgstr "パブリケーション %s の所有者である必要があります" -#: catalog/aclchk.c:3500 +#: catalog/aclchk.c:3722 #, c-format msgid "must be owner of routine %s" msgstr "ルーチン %s の所有者である必要があります" -#: catalog/aclchk.c:3503 +#: catalog/aclchk.c:3725 #, c-format msgid "must be owner of sequence %s" msgstr "シーケンス %s の所有者である必要があります" -#: catalog/aclchk.c:3506 +#: catalog/aclchk.c:3728 #, c-format msgid "must be owner of subscription %s" msgstr "サブスクリプション %s の所有者である必要があります" -#: catalog/aclchk.c:3509 +#: catalog/aclchk.c:3731 #, c-format msgid "must be owner of table %s" msgstr "テーブル %s の所有者である必要があります" -#: catalog/aclchk.c:3512 +#: catalog/aclchk.c:3734 #, c-format msgid "must be owner of type %s" msgstr "型 %s の所有者である必要があります" -#: catalog/aclchk.c:3515 +#: catalog/aclchk.c:3737 #, c-format msgid "must be owner of view %s" msgstr "ビュー %s の所有者である必要があります" -#: catalog/aclchk.c:3518 +#: catalog/aclchk.c:3740 #, c-format msgid "must be owner of schema %s" msgstr "スキーマ %s の所有者である必要があります" -#: catalog/aclchk.c:3521 +#: catalog/aclchk.c:3743 #, c-format msgid "must be owner of statistics object %s" msgstr "統計情報オブジェクト %s の所有者である必要があります" -#: catalog/aclchk.c:3524 +#: catalog/aclchk.c:3746 #, c-format msgid "must be owner of tablespace %s" msgstr "テーブル空間 %s の所有者である必要があります" -#: catalog/aclchk.c:3527 +#: catalog/aclchk.c:3749 #, c-format msgid "must be owner of text search configuration %s" msgstr "テキスト検索設定 %s の所有者である必要があります" -#: catalog/aclchk.c:3530 +#: catalog/aclchk.c:3752 #, c-format msgid "must be owner of text search dictionary %s" msgstr "テキスト検索辞書 %s の所有者である必要があります" -#: catalog/aclchk.c:3544 +#: catalog/aclchk.c:3766 #, c-format msgid "must be owner of relation %s" msgstr "リレーション %s の所有者である必要があります" -#: catalog/aclchk.c:3588 +#: catalog/aclchk.c:3812 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の列\"%1$s\"へのアクセスが拒否されました" -#: catalog/aclchk.c:3709 catalog/aclchk.c:3717 +#: catalog/aclchk.c:3957 catalog/aclchk.c:3976 #, c-format msgid "attribute %d of relation with OID %u does not exist" msgstr "OID %2$uのリレーションに属性%1$dは存在しません" -#: catalog/aclchk.c:3790 catalog/aclchk.c:4700 +#: catalog/aclchk.c:4071 catalog/aclchk.c:5184 #, c-format msgid "relation with OID %u does not exist" msgstr "OID %uのリレーションは存在しません" -#: catalog/aclchk.c:3880 catalog/aclchk.c:5118 +#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2582 #, c-format msgid "database with OID %u does not exist" msgstr "OID %uのデータベースは存在しません" -#: catalog/aclchk.c:3934 catalog/aclchk.c:4778 tcop/fastpath.c:221 utils/fmgr/fmgr.c:2055 +#: catalog/aclchk.c:4299 +#, c-format +msgid "parameter ACL with OID %u does not exist" +msgstr "OID %uのパラメータACLは存在しません" + +#: catalog/aclchk.c:4353 catalog/aclchk.c:5262 tcop/fastpath.c:141 utils/fmgr/fmgr.c:2051 #, c-format msgid "function with OID %u does not exist" msgstr "OID %uの関数は存在しません" -#: catalog/aclchk.c:3988 catalog/aclchk.c:4804 +#: catalog/aclchk.c:4407 catalog/aclchk.c:5288 #, c-format msgid "language with OID %u does not exist" msgstr "OID %uの言語は存在しません" -#: catalog/aclchk.c:4152 catalog/aclchk.c:4876 +#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:594 commands/publicationcmds.c:1793 #, c-format msgid "schema with OID %u does not exist" msgstr "OID %uのスキーマは存在しません" -#: catalog/aclchk.c:4206 catalog/aclchk.c:4903 utils/adt/genfile.c:686 +#: catalog/aclchk.c:4635 catalog/aclchk.c:5387 utils/adt/genfile.c:632 #, c-format msgid "tablespace with OID %u does not exist" msgstr "OID %uのテーブル空間は存在しません" -#: catalog/aclchk.c:4265 catalog/aclchk.c:5037 commands/foreigncmds.c:325 +#: catalog/aclchk.c:4694 catalog/aclchk.c:5521 commands/foreigncmds.c:325 #, c-format msgid "foreign-data wrapper with OID %u does not exist" msgstr "OID %uの外部データラッパーは存在しません" -#: catalog/aclchk.c:4327 catalog/aclchk.c:5064 commands/foreigncmds.c:462 +#: catalog/aclchk.c:4756 catalog/aclchk.c:5548 commands/foreigncmds.c:462 #, c-format msgid "foreign server with OID %u does not exist" msgstr "OID %uの外部サーバは存在しません" -#: catalog/aclchk.c:4387 catalog/aclchk.c:4726 utils/cache/typcache.c:378 utils/cache/typcache.c:432 +#: catalog/aclchk.c:4816 catalog/aclchk.c:5210 utils/cache/typcache.c:385 utils/cache/typcache.c:440 #, c-format msgid "type with OID %u does not exist" msgstr "OID %uの型は存在しません" -#: catalog/aclchk.c:4752 +#: catalog/aclchk.c:5236 #, c-format msgid "operator with OID %u does not exist" msgstr "OID %uの演算子は存在しません" -#: catalog/aclchk.c:4929 +#: catalog/aclchk.c:5413 #, c-format msgid "operator class with OID %u does not exist" msgstr "OID %uの演算子クラスは存在しません" -#: catalog/aclchk.c:4956 +#: catalog/aclchk.c:5440 #, c-format msgid "operator family with OID %u does not exist" msgstr "OID %uの演算子族は存在しません" -#: catalog/aclchk.c:4983 +#: catalog/aclchk.c:5467 #, c-format msgid "text search dictionary with OID %u does not exist" msgstr "OID %uのテキスト検索辞書は存在しません" -#: catalog/aclchk.c:5010 +#: catalog/aclchk.c:5494 #, c-format msgid "text search configuration with OID %u does not exist" msgstr "OID %uのテキスト検索設定は存在しません" -#: catalog/aclchk.c:5091 commands/event_trigger.c:453 +#: catalog/aclchk.c:5575 commands/event_trigger.c:453 #, c-format msgid "event trigger with OID %u does not exist" msgstr "OID %uのイベントトリガは存在しません" -#: catalog/aclchk.c:5144 commands/collationcmds.c:367 +#: catalog/aclchk.c:5628 commands/collationcmds.c:438 #, c-format msgid "collation with OID %u does not exist" msgstr "OID %uの照合順序は存在しません" -#: catalog/aclchk.c:5170 +#: catalog/aclchk.c:5654 #, c-format msgid "conversion with OID %u does not exist" msgstr "OID %uの変換は存在しません" -#: catalog/aclchk.c:5211 +#: catalog/aclchk.c:5695 #, c-format msgid "extension with OID %u does not exist" msgstr "OID %uの機能拡張は存在しません" -#: catalog/aclchk.c:5238 commands/publicationcmds.c:771 +#: catalog/aclchk.c:5722 commands/publicationcmds.c:2047 #, c-format msgid "publication with OID %u does not exist" msgstr "OID %uのパブリケーションは存在しません" -#: catalog/aclchk.c:5264 commands/subscriptioncmds.c:1172 +#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1745 #, c-format msgid "subscription with OID %u does not exist" msgstr "OID %uのサブスクリプションは存在しません" -#: catalog/aclchk.c:5290 +#: catalog/aclchk.c:5774 #, c-format msgid "statistics object with OID %u does not exist" msgstr "OID %uの統計情報オブジェクトは存在しません" -#: catalog/catalog.c:485 +#: catalog/catalog.c:447 +#, c-format +msgid "still searching for an unused OID in relation \"%s\"" +msgstr "リレーション\"%s\"での未使用のOIDを探索を継続中" + +#: catalog/catalog.c:449 #, c-format -msgid "must be superuser to call pg_nextoid()" -msgstr "pg_nextoid() を呼び出すにはスーパユーザである必要があります" +msgid "OID candidates have been checked %llu time, but no unused OID has been found yet." +msgid_plural "OID candidates have been checked %llu times, but no unused OID has been found yet." +msgstr[0] "OID候補のチェックを%llu回行いましたが、使用されていないOIDはまだ見つかっていません。" -#: catalog/catalog.c:493 +#: catalog/catalog.c:474 +#, c-format +msgid "new OID has been assigned in relation \"%s\" after %llu retry" +msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" +msgstr[0] "リレーション\\\"%s\\\"で%llu回の試行後に新しいOIDが割り当てられました" + +#: catalog/catalog.c:605 catalog/catalog.c:672 +#, c-format +msgid "must be superuser to call %s()" +msgstr "%s()を呼び出すにはスーパーユーザーである必要があります" + +#: catalog/catalog.c:614 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() はシステムカタログでのみ使用できます" -#: catalog/catalog.c:498 parser/parse_utilcmd.c:2103 +#: catalog/catalog.c:619 parser/parse_utilcmd.c:2269 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "インデックス\"%s\"はテーブル\"%s\"には属していません" -#: catalog/catalog.c:515 +#: catalog/catalog.c:636 #, c-format msgid "column \"%s\" is not of type oid" msgstr "列\"%s\"はoid型ではありません" -#: catalog/catalog.c:522 +#: catalog/catalog.c:643 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "インデックス\"%s\"は列\"%s\"に対するインデックスではありません" -#: catalog/dependency.c:821 catalog/dependency.c:1060 +#: catalog/dependency.c:535 catalog/pg_shdepend.c:657 +#, c-format +msgid "cannot drop %s because it is required by the database system" +msgstr "データベースシステムが必要としているため%sを削除できません" + +#: catalog/dependency.c:827 catalog/dependency.c:1054 #, c-format msgid "cannot drop %s because %s requires it" msgstr "%2$sが必要としているため%1$sを削除できません" -#: catalog/dependency.c:823 catalog/dependency.c:1062 +#: catalog/dependency.c:829 catalog/dependency.c:1056 #, c-format msgid "You can drop %s instead." msgstr "代わりに%sを削除できます" -#: catalog/dependency.c:931 catalog/pg_shdepend.c:640 -#, c-format -msgid "cannot drop %s because it is required by the database system" -msgstr "データベースシステムが必要としているため%sを削除できません" - -#: catalog/dependency.c:1128 -#, c-format -msgid "drop auto-cascades to %s" -msgstr "削除は自動で%sへ伝播します" - -#: catalog/dependency.c:1141 catalog/dependency.c:1150 +#: catalog/dependency.c:1135 catalog/dependency.c:1144 #, c-format msgid "%s depends on %s" msgstr "%sは%sに依存しています" -#: catalog/dependency.c:1162 catalog/dependency.c:1171 +#: catalog/dependency.c:1159 catalog/dependency.c:1168 #, c-format msgid "drop cascades to %s" msgstr "削除は%sへ伝播します" -#: catalog/dependency.c:1179 catalog/pg_shdepend.c:769 +#: catalog/dependency.c:1176 catalog/pg_shdepend.c:822 #, c-format msgid "" "\n" @@ -3704,642 +3852,655 @@ msgid_plural "" msgstr[0] "" "\n" "および%d個のその他のオブジェクト(一覧についてはサーバログを参照してください)" -msgstr[1] "" -"\n" -"および%d個のその他のオブジェクト(一覧についてはサーバログを参照してください)" -#: catalog/dependency.c:1191 +#: catalog/dependency.c:1188 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "他のオブジェクトが依存しているため%sを削除できません" -#: catalog/dependency.c:1193 catalog/dependency.c:1194 catalog/dependency.c:1200 catalog/dependency.c:1201 catalog/dependency.c:1212 catalog/dependency.c:1213 commands/tablecmds.c:1247 commands/tablecmds.c:12872 commands/user.c:1093 commands/view.c:495 libpq/auth.c:334 replication/syncrep.c:1032 storage/lmgr/deadlock.c:1152 storage/lmgr/proc.c:1346 utils/adt/acl.c:5329 utils/adt/jsonfuncs.c:614 utils/adt/jsonfuncs.c:620 utils/misc/guc.c:6789 utils/misc/guc.c:6825 -#: utils/misc/guc.c:6895 utils/misc/guc.c:10965 utils/misc/guc.c:10999 utils/misc/guc.c:11033 utils/misc/guc.c:11067 utils/misc/guc.c:11102 +#: catalog/dependency.c:1190 catalog/dependency.c:1191 catalog/dependency.c:1197 catalog/dependency.c:1198 catalog/dependency.c:1208 catalog/dependency.c:1209 commands/publicationcmds.c:631 commands/tablecmds.c:1326 commands/tablecmds.c:14238 commands/tablespace.c:497 commands/user.c:1008 commands/view.c:508 libpq/auth.c:329 replication/syncrep.c:1043 storage/lmgr/deadlock.c:1152 storage/lmgr/proc.c:1409 utils/adt/acl.c:5333 utils/adt/jsonfuncs.c:618 +#: utils/adt/jsonfuncs.c:624 utils/misc/guc.c:7394 utils/misc/guc.c:7430 utils/misc/guc.c:7500 utils/misc/guc.c:11763 utils/misc/guc.c:11797 utils/misc/guc.c:11831 utils/misc/guc.c:11874 utils/misc/guc.c:11916 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1195 catalog/dependency.c:1202 +#: catalog/dependency.c:1192 catalog/dependency.c:1199 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "依存しているオブジェクトも削除するにはDROP ... CASCADEを使用してください" -#: catalog/dependency.c:1199 +#: catalog/dependency.c:1196 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "他のオブジェクトが依存しているため指定したオブジェクトを削除できません" -#. translator: %d always has a value larger than 1 -#: catalog/dependency.c:1208 +#: catalog/dependency.c:1204 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" msgstr[0] "削除は他の%d個のオブジェクトに対しても行われます" -msgstr[1] "削除は他の%d個のオブジェクトに対しても行われます" -#: catalog/dependency.c:1869 +#: catalog/dependency.c:1873 #, c-format msgid "constant of the type %s cannot be used here" msgstr "%s型の定数をここで使用することはできません" -#: catalog/heap.c:330 +#: catalog/heap.c:323 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "\"%s.%s\"を作成する権限がありません" -#: catalog/heap.c:332 +#: catalog/heap.c:325 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "システムカタログの更新は現在禁止されています" -#: catalog/heap.c:500 commands/tablecmds.c:2132 commands/tablecmds.c:2690 commands/tablecmds.c:6094 +#: catalog/heap.c:462 commands/tablecmds.c:2338 commands/tablecmds.c:2975 commands/tablecmds.c:6790 #, c-format msgid "tables can have at most %d columns" msgstr "テーブルは最大で%d列までしか持てません" -#: catalog/heap.c:518 commands/tablecmds.c:6389 +#: catalog/heap.c:480 commands/tablecmds.c:7090 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "列名\"%s\"はシステム用の列名に使われています" -#: catalog/heap.c:534 +#: catalog/heap.c:496 #, c-format msgid "column name \"%s\" specified more than once" msgstr "列名\"%s\"が複数指定されました" #. translator: first %s is an integer not a name -#: catalog/heap.c:609 +#: catalog/heap.c:571 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "パーティションキー列%sは疑似型%sです" -#: catalog/heap.c:614 +#: catalog/heap.c:576 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "列\"%s\"は疑似型%sです" -#: catalog/heap.c:645 +#: catalog/heap.c:607 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "複合型 %s がそれ自身のメンバーになることはできません" #. translator: first %s is an integer not a name -#: catalog/heap.c:700 +#: catalog/heap.c:662 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "照合可能な型 %2$s のパーティションキー列%1$sのための照合順序を決定できませんでした" -#: catalog/heap.c:706 commands/createas.c:203 commands/createas.c:486 +#: catalog/heap.c:668 commands/createas.c:203 commands/createas.c:500 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "照合可能な型 %2$s を持つ列\"%1$s\"のための照合順序を決定できませんでした" -#: catalog/heap.c:1191 catalog/index.c:855 commands/tablecmds.c:3465 +#: catalog/heap.c:1144 catalog/index.c:874 commands/createas.c:405 commands/tablecmds.c:3880 #, c-format msgid "relation \"%s\" already exists" msgstr "リレーション\"%s\"はすでに存在します" -#: catalog/heap.c:1207 catalog/pg_type.c:428 catalog/pg_type.c:750 commands/typecmds.c:238 commands/typecmds.c:250 commands/typecmds.c:719 commands/typecmds.c:1125 commands/typecmds.c:1337 commands/typecmds.c:2124 +#: catalog/heap.c:1160 catalog/pg_type.c:436 catalog/pg_type.c:781 catalog/pg_type.c:928 commands/typecmds.c:249 commands/typecmds.c:261 commands/typecmds.c:754 commands/typecmds.c:1169 commands/typecmds.c:1395 commands/typecmds.c:1575 commands/typecmds.c:2547 #, c-format msgid "type \"%s\" already exists" msgstr "型\"%s\"はすでに存在します" -#: catalog/heap.c:1208 +#: catalog/heap.c:1161 #, c-format msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." msgstr "リレーションは同じ名前の関連する型を持ちます。このため既存の型と競合しない名前である必要があります。" -#: catalog/heap.c:1237 +#: catalog/heap.c:1201 +#, c-format +msgid "toast relfilenode value not set when in binary upgrade mode" +msgstr "バイナリアップグレードモード中にTOASTのrelfilenodeの値は設定されていません" + +#: catalog/heap.c:1212 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_classのヒープOIDが設定されていません" -#: catalog/heap.c:2438 +#: catalog/heap.c:1222 +#, c-format +msgid "relfilenode value not set when in binary upgrade mode" +msgstr "バイナリアップグレードモード中にrelfilenodeの値が設定されていません" + +#: catalog/heap.c:2126 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"に NO INHERIT 制約は追加できません" -#: catalog/heap.c:2708 +#: catalog/heap.c:2400 #, c-format msgid "check constraint \"%s\" already exists" msgstr "検査制約\"%s\"はすでに存在します" -#: catalog/heap.c:2878 catalog/index.c:869 catalog/pg_constraint.c:654 commands/tablecmds.c:7974 +#: catalog/heap.c:2570 catalog/index.c:888 catalog/pg_constraint.c:689 commands/tablecmds.c:8792 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "すでに制約\"%s\"はリレーション\"%s\"に存在します" -#: catalog/heap.c:2885 +#: catalog/heap.c:2577 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の継承されていない制約と競合します" -#: catalog/heap.c:2896 +#: catalog/heap.c:2588 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の継承された制約と競合します" -#: catalog/heap.c:2906 +#: catalog/heap.c:2598 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の NOT VALID 制約と競合します" -#: catalog/heap.c:2911 +#: catalog/heap.c:2603 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "継承された定義により制約\"%s\"をマージしています" -#: catalog/heap.c:3013 +#: catalog/heap.c:2708 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "生成カラム\"%s\"はカラム生成式中では使用できません" -#: catalog/heap.c:3015 +#: catalog/heap.c:2710 #, c-format msgid "A generated column cannot reference another generated column." msgstr "生成カラムは他の生成カラムを参照できません。" -#: catalog/heap.c:3067 +#: catalog/heap.c:2716 +#, c-format +msgid "cannot use whole-row variable in column generation expression" +msgstr "列生成式内では行全体参照は使用できません" + +#: catalog/heap.c:2717 +#, c-format +msgid "This would cause the generated column to depend on its own value." +msgstr "これは生成列を自身の値に依存させることにつながります。" + +#: catalog/heap.c:2770 #, c-format msgid "generation expression is not immutable" msgstr "生成式は不変ではありません" -#: catalog/heap.c:3095 rewrite/rewriteHandler.c:1192 +#: catalog/heap.c:2798 rewrite/rewriteHandler.c:1268 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "列\"%s\"の型は%sですが、デフォルト式の型は%sです" -#: catalog/heap.c:3100 commands/prepare.c:367 parser/parse_node.c:412 parser/parse_target.c:589 parser/parse_target.c:869 parser/parse_target.c:879 rewrite/rewriteHandler.c:1197 +#: catalog/heap.c:2803 commands/prepare.c:334 parser/analyze.c:2689 parser/parse_target.c:594 parser/parse_target.c:882 parser/parse_target.c:892 rewrite/rewriteHandler.c:1273 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "式を書き換えるかキャストする必要があります。" -#: catalog/heap.c:3147 +#: catalog/heap.c:2850 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "検査制約ではテーブル\"%s\"のみを参照することができます" -#: catalog/heap.c:3404 +#: catalog/heap.c:3148 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "ON COMMITと外部キーの組み合わせはサポートされていません" -#: catalog/heap.c:3405 +#: catalog/heap.c:3149 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "テーブル\"%s\"は\"%s\"を参照します。しかし、これらのON COMMIT設定は同一ではありません。" -#: catalog/heap.c:3410 +#: catalog/heap.c:3154 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "外部キー制約で参照されているテーブルを削除できません" -#: catalog/heap.c:3411 +#: catalog/heap.c:3155 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "テーブル\"%s\"は\"%s\"を参照します。" -#: catalog/heap.c:3413 +#: catalog/heap.c:3157 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "同時にテーブル\"%s\"がtruncateされました。TRUNCATE ... CASCADEを使用してください。" -#: catalog/index.c:218 parser/parse_utilcmd.c:1910 parser/parse_utilcmd.c:2009 +#: catalog/index.c:223 parser/parse_utilcmd.c:2174 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "テーブル\"%s\"に複数のプライマリキーを持たせることはできません" -#: catalog/index.c:236 +#: catalog/index.c:241 #, c-format msgid "primary keys cannot be expressions" msgstr "プライマリキーを式にすることはできません" -#: catalog/index.c:253 +#: catalog/index.c:258 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "主キー列\"%s\"がNOT NULL指定されていません" -#: catalog/index.c:754 catalog/index.c:1815 +#: catalog/index.c:773 catalog/index.c:1932 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "ユーザによるシステムカタログテーブルに対するインデックスの定義はサポートされていません" -#: catalog/index.c:794 +#: catalog/index.c:813 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "非決定的照合順序は演算子クラス \"%s\" ではサポートされません" -#: catalog/index.c:809 +#: catalog/index.c:828 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "システムカタログテーブルの並行的インデックス作成はサポートされていません" -#: catalog/index.c:818 catalog/index.c:1253 +#: catalog/index.c:837 catalog/index.c:1305 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "排他制約のためのインデックスの並列的作成はサポートされていません" -#: catalog/index.c:827 +#: catalog/index.c:846 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "initdbの後に共有インデックスを作成できません" -#: catalog/index.c:847 commands/createas.c:252 commands/sequence.c:154 parser/parse_utilcmd.c:208 +#: catalog/index.c:866 commands/createas.c:411 commands/sequence.c:150 parser/parse_utilcmd.c:201 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "リレーション\"%s\"はすでに存在します、スキップします" -#: catalog/index.c:897 +#: catalog/index.c:916 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_classのインデックスOIDが設定されていません" -#: catalog/index.c:2100 -#, c-format -msgid "DROP INDEX CONCURRENTLY must be first action in transaction" -msgstr "DROP INDEX CONCURRENTLYはトランザクション内で最初の操作でなければなりません" - -#: catalog/index.c:2831 +#: catalog/index.c:926 #, c-format -msgid "building index \"%s\" on table \"%s\" serially" -msgstr "テーブル\"%2$s\"のインデックス\"%1$s\"を非並列で構築しています" +msgid "index relfilenode value not set when in binary upgrade mode" +msgstr "バイナリアップグレードモード中にインデックスのrelfilenodeの値が設定されていません" -#: catalog/index.c:2836 +#: catalog/index.c:2231 #, c-format -msgid "building index \"%s\" on table \"%s\" with request for %d parallel worker" -msgid_plural "building index \"%s\" on table \"%s\" with request for %d parallel workers" -msgstr[0] "テーブル\"%2$s\"のインデックス\"%1$s\"を%3$d個のパラレルワーカを要求して構築しています" -msgstr[1] "テーブル\"%2$s\"のインデックス\"%1$s\"を%3$d個のパラレルワーカを要求して構築しています" +msgid "DROP INDEX CONCURRENTLY must be first action in transaction" +msgstr "DROP INDEX CONCURRENTLYはトランザクション内で最初の操作でなければなりません" -#: catalog/index.c:3464 +#: catalog/index.c:3633 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "他のセッションの一時テーブルはインデクス再構築できません" -#: catalog/index.c:3475 +#: catalog/index.c:3644 commands/indexcmds.c:3466 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "TOASTテーブルの無効なインデックスの再作成はできません" -#: catalog/index.c:3597 +#: catalog/index.c:3660 commands/indexcmds.c:3346 commands/indexcmds.c:3490 commands/tablecmds.c:3295 #, c-format -msgid "index \"%s\" was reindexed" -msgstr "インデックス\"%s\"のインデックス再構築が完了しました" +msgid "cannot move system relation \"%s\"" +msgstr "システムリレーション\"%s\"を移動できません" -#: catalog/index.c:3673 commands/indexcmds.c:3017 +#: catalog/index.c:3804 #, c-format -msgid "REINDEX of partitioned tables is not yet implemented, skipping \"%s\"" -msgstr "パーティションテーブルの REINDEX は実装されていません、\"%s\"はスキップします" +msgid "index \"%s\" was reindexed" +msgstr "インデックス\"%s\"のインデックス再構築が完了しました" -#: catalog/index.c:3728 +#: catalog/index.c:3941 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "TOASTテーブルの無効なインデックス \"%s.%s\"の再作成はできません、スキップします " -#: catalog/namespace.c:257 catalog/namespace.c:461 catalog/namespace.c:553 commands/trigger.c:5043 +#: catalog/namespace.c:259 catalog/namespace.c:463 catalog/namespace.c:555 commands/trigger.c:5668 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "データベース間の参照は実装されていません: \"%s.%s.%s\"" -#: catalog/namespace.c:314 +#: catalog/namespace.c:316 #, c-format msgid "temporary tables cannot specify a schema name" msgstr "一時テーブルにはスキーマ名を指定できません" -#: catalog/namespace.c:395 +#: catalog/namespace.c:397 #, c-format msgid "could not obtain lock on relation \"%s.%s\"" msgstr "リレーション\"%s.%s\"のロックを取得できませんでした" -#: catalog/namespace.c:400 commands/lockcmds.c:142 commands/lockcmds.c:227 +#: catalog/namespace.c:402 commands/lockcmds.c:144 commands/lockcmds.c:233 #, c-format msgid "could not obtain lock on relation \"%s\"" msgstr "リレーション\"%s\"のロックを取得できませんでした" -#: catalog/namespace.c:428 parser/parse_relation.c:1357 +#: catalog/namespace.c:430 parser/parse_relation.c:1373 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "リレーション\"%s.%s\"は存在しません" -#: catalog/namespace.c:433 parser/parse_relation.c:1370 parser/parse_relation.c:1378 +#: catalog/namespace.c:435 parser/parse_relation.c:1386 parser/parse_relation.c:1394 #, c-format msgid "relation \"%s\" does not exist" msgstr "リレーション\"%s\"は存在しません" -#: catalog/namespace.c:499 catalog/namespace.c:3030 commands/extension.c:1519 commands/extension.c:1525 +#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1531 commands/extension.c:1537 #, c-format msgid "no schema has been selected to create in" msgstr "作成先のスキーマが選択されていません" -#: catalog/namespace.c:651 catalog/namespace.c:664 +#: catalog/namespace.c:653 catalog/namespace.c:666 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "他のセッションの一時スキーマの中にリレーションを作成できません" -#: catalog/namespace.c:655 +#: catalog/namespace.c:657 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "非一時スキーマの中に一時リレーションを作成できません" -#: catalog/namespace.c:670 +#: catalog/namespace.c:672 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "一時スキーマの中には一時リレーションしか作成できません" -#: catalog/namespace.c:2222 +#: catalog/namespace.c:2268 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "統計情報オブジェクト\"%s\"は存在しません" -#: catalog/namespace.c:2345 +#: catalog/namespace.c:2391 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "テキスト検索パーサ\"%s\"は存在しません" -#: catalog/namespace.c:2471 +#: catalog/namespace.c:2517 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "テキスト検索辞書\"%s\"は存在しません" -#: catalog/namespace.c:2598 +#: catalog/namespace.c:2644 #, c-format msgid "text search template \"%s\" does not exist" msgstr "テキスト検索テンプレート\"%s\"は存在しません" -#: catalog/namespace.c:2724 commands/tsearchcmds.c:1123 utils/cache/ts_cache.c:617 +#: catalog/namespace.c:2770 commands/tsearchcmds.c:1121 utils/cache/ts_cache.c:613 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "テキスト検索設定\"%s\"は存在しません" -#: catalog/namespace.c:2837 parser/parse_expr.c:872 parser/parse_target.c:1228 +#: catalog/namespace.c:2883 parser/parse_expr.c:868 parser/parse_target.c:1255 #, c-format msgid "cross-database references are not implemented: %s" msgstr "データベース間の参照は実装されていません: %s" -#: catalog/namespace.c:2843 gram.y:14743 gram.y:16189 parser/parse_expr.c:879 parser/parse_target.c:1235 +#: catalog/namespace.c:2889 gram.y:18548 gram.y:18588 parser/parse_expr.c:875 parser/parse_target.c:1262 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "修飾名が不適切です(ドット区切りの名前が多すぎます): %s" -#: catalog/namespace.c:2973 +#: catalog/namespace.c:3019 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "一時スキーマへ、または一時スキーマからオブジェクトを移動できません" -#: catalog/namespace.c:2979 +#: catalog/namespace.c:3025 #, c-format msgid "cannot move objects into or out of TOAST schema" msgstr "TOASTスキーマへ、またはTOASTスキーマからオブジェクトを移動できません" -#: catalog/namespace.c:3052 commands/schemacmds.c:233 commands/schemacmds.c:313 commands/tablecmds.c:1192 +#: catalog/namespace.c:3098 commands/schemacmds.c:234 commands/schemacmds.c:314 commands/tablecmds.c:1271 #, c-format msgid "schema \"%s\" does not exist" msgstr "スキーマ\"%s\"は存在しません" -#: catalog/namespace.c:3083 +#: catalog/namespace.c:3129 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "リレーション名が不適切です(ドット区切りの名前が多すぎます): %s" -#: catalog/namespace.c:3646 +#: catalog/namespace.c:3692 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "エンコーディング\"%2$s\"の照合順序\"%1$s\"は存在しません" -#: catalog/namespace.c:3701 +#: catalog/namespace.c:3747 #, c-format msgid "conversion \"%s\" does not exist" msgstr "変換\"%sは存在しません" -#: catalog/namespace.c:3965 +#: catalog/namespace.c:4011 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "データベース\"%s\"に一時テーブルを作成する権限がありません" -#: catalog/namespace.c:3981 +#: catalog/namespace.c:4027 #, c-format msgid "cannot create temporary tables during recovery" msgstr "リカバリ中は一時テーブルを作成できません" -#: catalog/namespace.c:3987 +#: catalog/namespace.c:4033 #, c-format msgid "cannot create temporary tables during a parallel operation" msgstr "並行処理中は一時テーブルを作成できません" -#: catalog/namespace.c:4286 commands/tablespace.c:1205 commands/variable.c:64 utils/misc/guc.c:11134 utils/misc/guc.c:11212 +#: catalog/namespace.c:4334 commands/tablespace.c:1257 commands/variable.c:64 utils/misc/guc.c:11948 utils/misc/guc.c:12050 #, c-format msgid "List syntax is invalid." msgstr "リスト文法が無効です" -#: catalog/objectaddress.c:1370 catalog/pg_publication.c:57 commands/policy.c:95 commands/policy.c:395 commands/policy.c:485 commands/tablecmds.c:230 commands/tablecmds.c:272 commands/tablecmds.c:1976 commands/tablecmds.c:5539 commands/tablecmds.c:10946 +#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 commands/tablecmds.c:246 commands/tablecmds.c:288 commands/tablecmds.c:2182 commands/tablecmds.c:12208 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\"はテーブルではありません" -#: catalog/objectaddress.c:1377 commands/tablecmds.c:242 commands/tablecmds.c:5569 commands/tablecmds.c:15568 commands/view.c:119 +#: catalog/objectaddress.c:1398 commands/tablecmds.c:258 commands/tablecmds.c:17077 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\"はビューではありません" -#: catalog/objectaddress.c:1384 commands/matview.c:175 commands/tablecmds.c:248 commands/tablecmds.c:15573 +#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:264 commands/tablecmds.c:17082 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\"は実体化ビューではありません" -#: catalog/objectaddress.c:1391 commands/tablecmds.c:266 commands/tablecmds.c:5572 commands/tablecmds.c:15578 +#: catalog/objectaddress.c:1412 commands/tablecmds.c:282 commands/tablecmds.c:17087 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\"は外部テーブルではありません" -#: catalog/objectaddress.c:1432 +#: catalog/objectaddress.c:1453 #, c-format msgid "must specify relation and object name" msgstr "リレーションとオブジェクトの名前の指定が必要です" -#: catalog/objectaddress.c:1508 catalog/objectaddress.c:1561 +#: catalog/objectaddress.c:1529 catalog/objectaddress.c:1582 #, c-format msgid "column name must be qualified" msgstr "列名を修飾する必要があります" -#: catalog/objectaddress.c:1608 +#: catalog/objectaddress.c:1601 #, c-format msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"の列\"%1$s\"に対するデフォルト値が存在しません" -#: catalog/objectaddress.c:1645 commands/functioncmds.c:133 commands/tablecmds.c:258 commands/typecmds.c:263 commands/typecmds.c:3275 parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:845 utils/adt/acl.c:4436 +#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 commands/tablecmds.c:274 commands/typecmds.c:274 commands/typecmds.c:3700 parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:795 utils/adt/acl.c:4434 #, c-format msgid "type \"%s\" does not exist" msgstr "型\"%s\"は存在しません" -#: catalog/objectaddress.c:1764 +#: catalog/objectaddress.c:1757 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "%4$sの演算子 %1$d (%2$s, %3$s) がありません" -#: catalog/objectaddress.c:1795 +#: catalog/objectaddress.c:1788 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "%4$s の関数 %1$d (%2$s, %3$s) がありません" -#: catalog/objectaddress.c:1846 catalog/objectaddress.c:1872 +#: catalog/objectaddress.c:1839 catalog/objectaddress.c:1865 #, c-format msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "ユーザ\"%s\"に対するユーザマッピングがサーバ\"%s\"には存在しません" -#: catalog/objectaddress.c:1861 commands/foreigncmds.c:430 commands/foreigncmds.c:988 commands/foreigncmds.c:1347 foreign/foreign.c:723 +#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 commands/foreigncmds.c:984 commands/foreigncmds.c:1343 foreign/foreign.c:691 #, c-format msgid "server \"%s\" does not exist" msgstr "サーバ\"%s\"は存在しません" -#: catalog/objectaddress.c:1928 +#: catalog/objectaddress.c:1921 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "パブリケーション\"%2$s\"の発行リレーション\"%1$s\"は存在しません" -#: catalog/objectaddress.c:1990 +#: catalog/objectaddress.c:1968 +#, c-format +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "パブリケーション\"%2$s\"に発行リレーション\"%1$s\"は存在しません" + +#: catalog/objectaddress.c:2026 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "デフォルトのACLオブジェクトタイプ\"%c\"は認識できません" -#: catalog/objectaddress.c:1991 +#: catalog/objectaddress.c:2027 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "有効な値は \"%c\", \"%c\", \"%c\", \"%c\", \"%c\" です。" -#: catalog/objectaddress.c:2042 +#: catalog/objectaddress.c:2078 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "ユーザ\"%s\"に対する、名前空間\"%s\"の%sへのデフォルトのACLはありません" -#: catalog/objectaddress.c:2047 +#: catalog/objectaddress.c:2083 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "ユーザ\"%s\"に対する%sへのデフォルトACLは存在しません" -#: catalog/objectaddress.c:2074 catalog/objectaddress.c:2132 catalog/objectaddress.c:2189 +#: catalog/objectaddress.c:2110 catalog/objectaddress.c:2168 catalog/objectaddress.c:2225 #, c-format msgid "name or argument lists may not contain nulls" msgstr "名前または引数のリストはnullを含むことができません" -#: catalog/objectaddress.c:2108 +#: catalog/objectaddress.c:2144 #, c-format msgid "unsupported object type \"%s\"" msgstr "サポートされないオブジェクトタイプ\"%s\"" -#: catalog/objectaddress.c:2128 catalog/objectaddress.c:2146 catalog/objectaddress.c:2287 +#: catalog/objectaddress.c:2164 catalog/objectaddress.c:2182 catalog/objectaddress.c:2325 #, c-format msgid "name list length must be exactly %d" msgstr "名前リストの長さは正確に%dでなくてはなりません" -#: catalog/objectaddress.c:2150 +#: catalog/objectaddress.c:2186 #, c-format msgid "large object OID may not be null" msgstr "ラージオブジェクトのOIDはnullにはなり得ません" -#: catalog/objectaddress.c:2159 catalog/objectaddress.c:2222 catalog/objectaddress.c:2229 +#: catalog/objectaddress.c:2195 catalog/objectaddress.c:2259 catalog/objectaddress.c:2266 #, c-format msgid "name list length must be at least %d" msgstr "名前リストの長さは%d以上でなくてはなりません" -#: catalog/objectaddress.c:2215 catalog/objectaddress.c:2236 +#: catalog/objectaddress.c:2252 catalog/objectaddress.c:2273 #, c-format msgid "argument list length must be exactly %d" msgstr "引数リストの長さはちょうど%dである必要があります" -#: catalog/objectaddress.c:2488 libpq/be-fsstubs.c:321 +#: catalog/objectaddress.c:2527 libpq/be-fsstubs.c:318 #, c-format msgid "must be owner of large object %u" msgstr "ラージオブジェクト %u の所有者である必要があります" -#: catalog/objectaddress.c:2503 commands/functioncmds.c:1445 +#: catalog/objectaddress.c:2542 commands/functioncmds.c:1566 #, c-format msgid "must be owner of type %s or type %s" msgstr "型%sまたは型%sの所有者である必要があります" -#: catalog/objectaddress.c:2553 catalog/objectaddress.c:2570 +#: catalog/objectaddress.c:2592 catalog/objectaddress.c:2610 #, c-format msgid "must be superuser" msgstr "スーパユーザである必要があります" -#: catalog/objectaddress.c:2560 +#: catalog/objectaddress.c:2599 #, c-format msgid "must have CREATEROLE privilege" msgstr "CREATEROLE 権限が必要です" -#: catalog/objectaddress.c:2639 +#: catalog/objectaddress.c:2680 #, c-format msgid "unrecognized object type \"%s\"" msgstr "認識されないオブジェクトタイプ\"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2881 +#: catalog/objectaddress.c:2972 #, c-format msgid "column %s of %s" msgstr "%2$s の列 %1$s" -#: catalog/objectaddress.c:2895 +#: catalog/objectaddress.c:2987 #, c-format msgid "function %s" msgstr "関数%s" -#: catalog/objectaddress.c:2907 +#: catalog/objectaddress.c:3000 #, c-format msgid "type %s" msgstr "型%s" -#: catalog/objectaddress.c:2944 +#: catalog/objectaddress.c:3037 #, c-format msgid "cast from %s to %s" msgstr "%sから%sへの型変換" -#: catalog/objectaddress.c:2977 +#: catalog/objectaddress.c:3070 #, c-format msgid "collation %s" msgstr "照合順序%s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3008 +#: catalog/objectaddress.c:3101 #, c-format msgid "constraint %s on %s" msgstr "%2$sに対する制約%1$s" -#: catalog/objectaddress.c:3014 +#: catalog/objectaddress.c:3107 #, c-format msgid "constraint %s" msgstr "制約%s" -#: catalog/objectaddress.c:3046 +#: catalog/objectaddress.c:3139 #, c-format msgid "conversion %s" msgstr "変換%s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3092 +#: catalog/objectaddress.c:3161 #, c-format msgid "default value for %s" msgstr "%s のデフォルト値" -#: catalog/objectaddress.c:3106 +#: catalog/objectaddress.c:3172 #, c-format msgid "language %s" msgstr "言語%s" -#: catalog/objectaddress.c:3114 +#: catalog/objectaddress.c:3180 #, c-format msgid "large object %u" msgstr "ラージオブジェクト%u" -#: catalog/objectaddress.c:3127 +#: catalog/objectaddress.c:3193 #, c-format msgid "operator %s" msgstr "演算子%s" -#: catalog/objectaddress.c:3164 +#: catalog/objectaddress.c:3230 #, c-format msgid "operator class %s for access method %s" msgstr "アクセスメソッド%2$s用の演算子クラス%1$s" -#: catalog/objectaddress.c:3192 +#: catalog/objectaddress.c:3258 #, c-format msgid "access method %s" msgstr "アクセスメソッド%s" @@ -4348,7 +4509,7 @@ msgstr "アクセスメソッド%s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3241 +#: catalog/objectaddress.c:3307 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "%4$sの演算子%1$d (%2$s, %3$s): %5$s" @@ -4357,394 +4518,453 @@ msgstr "%4$sの演算子%1$d (%2$s, %3$s): %5$s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3298 +#: catalog/objectaddress.c:3364 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "%4$s の関数 %1$d (%2$s, %3$s): %5$s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3350 +#: catalog/objectaddress.c:3416 #, c-format msgid "rule %s on %s" msgstr "%2$s のルール %1$s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3396 +#: catalog/objectaddress.c:3462 #, c-format msgid "trigger %s on %s" msgstr "%2$s のトリガ %1$s" -#: catalog/objectaddress.c:3416 +#: catalog/objectaddress.c:3482 #, c-format msgid "schema %s" msgstr "スキーマ%s" -#: catalog/objectaddress.c:3444 +#: catalog/objectaddress.c:3510 #, c-format msgid "statistics object %s" msgstr "統計オブジェクト%s" -#: catalog/objectaddress.c:3475 +#: catalog/objectaddress.c:3541 #, c-format msgid "text search parser %s" msgstr "テキスト検索パーサ%s" -#: catalog/objectaddress.c:3506 +#: catalog/objectaddress.c:3572 #, c-format msgid "text search dictionary %s" msgstr "テキスト検索辞書%s" -#: catalog/objectaddress.c:3537 +#: catalog/objectaddress.c:3603 #, c-format msgid "text search template %s" msgstr "テキスト検索テンプレート%s" -#: catalog/objectaddress.c:3568 +#: catalog/objectaddress.c:3634 #, c-format msgid "text search configuration %s" msgstr "テキスト検索設定%s" -#: catalog/objectaddress.c:3581 +#: catalog/objectaddress.c:3647 #, c-format msgid "role %s" msgstr "ロール%s" -#: catalog/objectaddress.c:3597 +#: catalog/objectaddress.c:3663 #, c-format msgid "database %s" msgstr "データベース%s" -#: catalog/objectaddress.c:3613 +#: catalog/objectaddress.c:3679 #, c-format msgid "tablespace %s" msgstr "テーブル空間%s" -#: catalog/objectaddress.c:3624 +#: catalog/objectaddress.c:3690 #, c-format msgid "foreign-data wrapper %s" msgstr "外部データラッパー%s" -#: catalog/objectaddress.c:3634 +#: catalog/objectaddress.c:3700 #, c-format msgid "server %s" msgstr "サーバ%s" -#: catalog/objectaddress.c:3667 +#: catalog/objectaddress.c:3733 #, c-format msgid "user mapping for %s on server %s" msgstr "サーバ%2$s上のユーザマッピング%1$s" -#: catalog/objectaddress.c:3719 +#: catalog/objectaddress.c:3785 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s のものである新しいリレーションのデフォルト権限" -#: catalog/objectaddress.c:3723 +#: catalog/objectaddress.c:3789 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "新しいリレーションに関するデフォルトの権限は、ロール%sに属します。" -#: catalog/objectaddress.c:3729 +#: catalog/objectaddress.c:3795 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s のものである新しいシーケンスのデフォルト権限" -#: catalog/objectaddress.c:3733 +#: catalog/objectaddress.c:3799 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "新しいシーケンスに関するデフォルトの権限は、ロール%sに属します。" -#: catalog/objectaddress.c:3739 +#: catalog/objectaddress.c:3805 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s のものである新しい関数のデフォルト権限" -#: catalog/objectaddress.c:3743 +#: catalog/objectaddress.c:3809 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "新しい関数に関するデフォルトの権限は、ロール%sに属します。" -#: catalog/objectaddress.c:3749 +#: catalog/objectaddress.c:3815 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s のものである新しい型のデフォルト権限" -#: catalog/objectaddress.c:3753 +#: catalog/objectaddress.c:3819 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "新しい型に関するデフォルトの権限は、ロール%sに属します" -#: catalog/objectaddress.c:3759 +#: catalog/objectaddress.c:3825 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "ロール%sに属する新しいスキーマ上のデフォルト権限" -#: catalog/objectaddress.c:3766 +#: catalog/objectaddress.c:3832 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s に属するデフォルト権限" -#: catalog/objectaddress.c:3770 +#: catalog/objectaddress.c:3836 #, c-format msgid "default privileges belonging to role %s" msgstr "デフォルトの権限はロール%sに属します。" -#: catalog/objectaddress.c:3792 +#: catalog/objectaddress.c:3858 #, c-format msgid "extension %s" msgstr "機能拡張%s" -#: catalog/objectaddress.c:3809 +#: catalog/objectaddress.c:3875 #, c-format msgid "event trigger %s" msgstr "イベントトリガ%s" +#: catalog/objectaddress.c:3902 +#, c-format +msgid "parameter %s" +msgstr "パラメータ %s" + #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3853 +#: catalog/objectaddress.c:3945 #, c-format msgid "policy %s on %s" msgstr "%2$s のポリシ %1$s" -#: catalog/objectaddress.c:3866 +#: catalog/objectaddress.c:3959 #, c-format msgid "publication %s" msgstr "パブリケーション%s" +#: catalog/objectaddress.c:3972 +#, c-format +msgid "publication of schema %s in publication %s" +msgstr "パブリケーション%2$sでのスキーマ%1$sの発行" + #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:3894 +#: catalog/objectaddress.c:4003 #, c-format msgid "publication of %s in publication %s" msgstr "パブリケーション %2$s での %1$s の発行" -#: catalog/objectaddress.c:3906 +#: catalog/objectaddress.c:4016 #, c-format msgid "subscription %s" msgstr "サブスクリプション%s" -#: catalog/objectaddress.c:3927 +#: catalog/objectaddress.c:4037 #, c-format msgid "transform for %s language %s" msgstr "言語%2$sの%1$s型に対する変換" -#: catalog/objectaddress.c:3998 +#: catalog/objectaddress.c:4108 #, c-format msgid "table %s" msgstr "テーブル%s" -#: catalog/objectaddress.c:4003 +#: catalog/objectaddress.c:4113 #, c-format msgid "index %s" msgstr "インデックス%s" -#: catalog/objectaddress.c:4007 +#: catalog/objectaddress.c:4117 #, c-format msgid "sequence %s" msgstr "シーケンス%s" -#: catalog/objectaddress.c:4011 +#: catalog/objectaddress.c:4121 #, c-format msgid "toast table %s" msgstr "TOASTテーブル%s" -#: catalog/objectaddress.c:4015 +#: catalog/objectaddress.c:4125 #, c-format msgid "view %s" msgstr "ビュー%s" -#: catalog/objectaddress.c:4019 +#: catalog/objectaddress.c:4129 #, c-format msgid "materialized view %s" msgstr "実体化ビュー%s" -#: catalog/objectaddress.c:4023 +#: catalog/objectaddress.c:4133 #, c-format msgid "composite type %s" msgstr "複合型%s" -#: catalog/objectaddress.c:4027 +#: catalog/objectaddress.c:4137 #, c-format msgid "foreign table %s" msgstr "外部テーブル%s" -#: catalog/objectaddress.c:4032 +#: catalog/objectaddress.c:4142 #, c-format msgid "relation %s" msgstr "リレーション%s" -#: catalog/objectaddress.c:4073 +#: catalog/objectaddress.c:4183 #, c-format msgid "operator family %s for access method %s" msgstr "アクセスメソッド%2$sの演算子族%1$s" -#: catalog/pg_aggregate.c:128 +#: catalog/pg_aggregate.c:129 #, c-format msgid "aggregates cannot have more than %d argument" msgid_plural "aggregates cannot have more than %d arguments" msgstr[0] "集約は%d個以上の引数を取ることはできません" -msgstr[1] "集約は%d個以上の引数を取ることはできません" -#: catalog/pg_aggregate.c:143 catalog/pg_aggregate.c:157 +#: catalog/pg_aggregate.c:144 catalog/pg_aggregate.c:158 #, c-format msgid "cannot determine transition data type" msgstr "遷移データ型を決定できません" -#: catalog/pg_aggregate.c:172 +#: catalog/pg_aggregate.c:173 #, c-format msgid "a variadic ordered-set aggregate must use VARIADIC type ANY" msgstr "可変長引数の順序集合集約はVARIADIC型のANYを使う必要があります" -#: catalog/pg_aggregate.c:198 +#: catalog/pg_aggregate.c:199 #, c-format msgid "a hypothetical-set aggregate must have direct arguments matching its aggregated arguments" msgstr "仮説集合集約は集約された引数に適合する直接引数を持つ必要があります" -#: catalog/pg_aggregate.c:245 catalog/pg_aggregate.c:289 +#: catalog/pg_aggregate.c:246 catalog/pg_aggregate.c:290 #, c-format msgid "return type of transition function %s is not %s" msgstr "遷移関数の戻り値型%sは%sではありません" -#: catalog/pg_aggregate.c:265 catalog/pg_aggregate.c:308 +#: catalog/pg_aggregate.c:266 catalog/pg_aggregate.c:309 #, c-format msgid "must not omit initial value when transition function is strict and transition type is not compatible with input type" msgstr "遷移関数がSTRICTかつ遷移用の型が入力型とバイナリ互換がない場合初期値を省略してはなりません" -#: catalog/pg_aggregate.c:334 +#: catalog/pg_aggregate.c:335 #, c-format msgid "return type of inverse transition function %s is not %s" msgstr "逆遷移関数%sの戻り値の型が%sではありません" -#: catalog/pg_aggregate.c:351 executor/nodeWindowAgg.c:2852 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2978 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "集約の前進と反転の遷移関数のSTRICT属性は一致している必要があります" -#: catalog/pg_aggregate.c:395 catalog/pg_aggregate.c:553 +#: catalog/pg_aggregate.c:396 catalog/pg_aggregate.c:554 #, c-format msgid "final function with extra arguments must not be declared STRICT" msgstr "追加の引数を持つ最終関数はSTRICT宣言できません" -#: catalog/pg_aggregate.c:426 +#: catalog/pg_aggregate.c:427 #, c-format msgid "return type of combine function %s is not %s" msgstr "結合関数%sの戻り値の型が%sではありません" -#: catalog/pg_aggregate.c:438 executor/nodeAgg.c:4173 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3883 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "遷移タイプ%sの結合関数はSTRICT宣言できません" -#: catalog/pg_aggregate.c:457 +#: catalog/pg_aggregate.c:458 #, c-format msgid "return type of serialization function %s is not %s" msgstr "直列化関数%sの戻り値の型が%sではありません" -#: catalog/pg_aggregate.c:478 +#: catalog/pg_aggregate.c:479 #, c-format msgid "return type of deserialization function %s is not %s" msgstr "復元関数%sの戻り値の型が%sではありません" -#: catalog/pg_aggregate.c:497 catalog/pg_proc.c:186 catalog/pg_proc.c:220 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:191 catalog/pg_proc.c:225 #, c-format msgid "cannot determine result data type" msgstr "結果のデータ型を決定できません" -#: catalog/pg_aggregate.c:512 catalog/pg_proc.c:199 catalog/pg_proc.c:228 +#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:204 catalog/pg_proc.c:233 #, c-format msgid "unsafe use of pseudo-type \"internal\"" msgstr "\"internal\"疑似型の安全ではない使用" -#: catalog/pg_aggregate.c:566 +#: catalog/pg_aggregate.c:567 #, c-format msgid "moving-aggregate implementation returns type %s, but plain implementation returns type %s" msgstr "移動集約の実装が%s型を返却しました、しかし普通の実装の方は%s型を返却しています" -#: catalog/pg_aggregate.c:577 +#: catalog/pg_aggregate.c:578 #, c-format msgid "sort operator can only be specified for single-argument aggregates" msgstr "ソート演算子は単一引数の集約でのみ指定可能です" -#: catalog/pg_aggregate.c:704 catalog/pg_proc.c:374 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 #, c-format msgid "cannot change routine kind" msgstr "ルーチンの種別は変更できません" -#: catalog/pg_aggregate.c:706 +#: catalog/pg_aggregate.c:708 #, c-format msgid "\"%s\" is an ordinary aggregate function." msgstr "\"%s\"は通常の集約関数です。" -#: catalog/pg_aggregate.c:708 +#: catalog/pg_aggregate.c:710 #, c-format msgid "\"%s\" is an ordered-set aggregate." msgstr "\"%s\"は順序集合集約です。" -#: catalog/pg_aggregate.c:710 +#: catalog/pg_aggregate.c:712 #, c-format msgid "\"%s\" is a hypothetical-set aggregate." msgstr "\"%s\"は仮説集合集約です。" -#: catalog/pg_aggregate.c:715 +#: catalog/pg_aggregate.c:717 #, c-format msgid "cannot change number of direct arguments of an aggregate function" msgstr "集約関数の直接引数の数は変更できません" -#: catalog/pg_aggregate.c:852 commands/functioncmds.c:667 commands/typecmds.c:1658 commands/typecmds.c:1704 commands/typecmds.c:1756 commands/typecmds.c:1793 commands/typecmds.c:1827 commands/typecmds.c:1861 commands/typecmds.c:1895 commands/typecmds.c:1972 commands/typecmds.c:2014 parser/parse_func.c:414 parser/parse_func.c:443 parser/parse_func.c:468 parser/parse_func.c:482 parser/parse_func.c:602 parser/parse_func.c:622 parser/parse_func.c:2129 -#: parser/parse_func.c:2320 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:695 commands/typecmds.c:1976 commands/typecmds.c:2022 commands/typecmds.c:2074 commands/typecmds.c:2111 commands/typecmds.c:2145 commands/typecmds.c:2179 commands/typecmds.c:2213 commands/typecmds.c:2242 commands/typecmds.c:2329 commands/typecmds.c:2371 parser/parse_func.c:417 parser/parse_func.c:448 parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 parser/parse_func.c:631 +#: parser/parse_func.c:2173 parser/parse_func.c:2446 #, c-format msgid "function %s does not exist" msgstr "関数%sは存在しません" -#: catalog/pg_aggregate.c:858 +#: catalog/pg_aggregate.c:864 #, c-format msgid "function %s returns a set" msgstr "関数%sは集合を返します" -#: catalog/pg_aggregate.c:873 +#: catalog/pg_aggregate.c:879 #, c-format msgid "function %s must accept VARIADIC ANY to be used in this aggregate" msgstr "この集約で使うには関数%sは VARIADIC ANY を受け付ける必要があります" -#: catalog/pg_aggregate.c:897 +#: catalog/pg_aggregate.c:903 #, c-format msgid "function %s requires run-time type coercion" msgstr "関数%sは実行時の型強制が必要です" -#: catalog/pg_cast.c:67 +#: catalog/pg_cast.c:68 #, c-format msgid "cast from type %s to type %s already exists" msgstr "型%sから型%sへのキャストはすでに存在しています" -#: catalog/pg_collation.c:93 catalog/pg_collation.c:140 +#: catalog/pg_class.c:29 +#, c-format +msgid "This operation is not supported for tables." +msgstr "この操作はテーブルに対してはサポートされていません。" + +#: catalog/pg_class.c:31 +#, c-format +msgid "This operation is not supported for indexes." +msgstr "この操作はインデックスに対してはサポートされていません。" + +#: catalog/pg_class.c:33 +#, c-format +msgid "This operation is not supported for sequences." +msgstr "この操作はシーケンスに対してはサポートされていません。" + +#: catalog/pg_class.c:35 +#, c-format +msgid "This operation is not supported for TOAST tables." +msgstr "この操作はTOASTインデックスに対してはサポートされていません。" + +#: catalog/pg_class.c:37 +#, c-format +msgid "This operation is not supported for views." +msgstr "この操作はビューに対してはサポートされていません。" + +#: catalog/pg_class.c:39 +#, c-format +msgid "This operation is not supported for materialized views." +msgstr "この機能は実体化ビューに対してはサポートされていません。" + +#: catalog/pg_class.c:41 +#, c-format +msgid "This operation is not supported for composite types." +msgstr "この操作は複合型に対してはサポートされていません。" + +#: catalog/pg_class.c:43 +#, c-format +msgid "This operation is not supported for foreign tables." +msgstr "この操作は外部テーブルに対してはサポートされていません。" + +#: catalog/pg_class.c:45 +#, c-format +msgid "This operation is not supported for partitioned tables." +msgstr "この操作はパーティション親テーブルに対してはサポートされていません。" + +#: catalog/pg_class.c:47 +#, c-format +msgid "This operation is not supported for partitioned indexes." +msgstr "この操作はパーティションインデックスに対してはサポートされていません。" + +#: catalog/pg_collation.c:91 catalog/pg_collation.c:138 #, c-format msgid "collation \"%s\" already exists, skipping" msgstr "照合順序\"%s\"はすでに存在します、スキップします" -#: catalog/pg_collation.c:95 +#: catalog/pg_collation.c:93 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" msgstr "エンコーディング\"%2$s\"に対する照合順序\"%1$s\"はすでに存在します、スキップします" -#: catalog/pg_collation.c:103 catalog/pg_collation.c:147 +#: catalog/pg_collation.c:101 catalog/pg_collation.c:145 #, c-format msgid "collation \"%s\" already exists" msgstr "照合順序\"%s\"はすでに存在します" -#: catalog/pg_collation.c:105 +#: catalog/pg_collation.c:103 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "エンコーディング\"%2$s\"の照合順序\"%1$s\"はすでに存在します" -#: catalog/pg_constraint.c:662 +#: catalog/pg_constraint.c:697 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"はすでに存在します" -#: catalog/pg_constraint.c:858 catalog/pg_constraint.c:951 +#: catalog/pg_constraint.c:893 catalog/pg_constraint.c:986 #, c-format msgid "constraint \"%s\" for table \"%s\" does not exist" msgstr "テーブル\"%2$s\"の制約\"%1$s\"は存在しません" -#: catalog/pg_constraint.c:1040 +#: catalog/pg_constraint.c:1075 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "ドメイン\"%2$s\"に対する制約\"%1$s\"は存在しません" @@ -4759,25 +4979,25 @@ msgstr "変換\"%s\"はすでに存在します" msgid "default conversion for %s to %s already exists" msgstr "%sから%sへのデフォルトの変換はすでに存在します" -#: catalog/pg_depend.c:162 commands/extension.c:3343 +#: catalog/pg_depend.c:215 commands/extension.c:3267 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%sはすでに機能拡張\"%s\"のメンバです" -#: catalog/pg_depend.c:538 +#: catalog/pg_depend.c:589 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "システムオブジェクトであるため、%sの依存関係を削除できません。" -#: catalog/pg_enum.c:127 catalog/pg_enum.c:230 catalog/pg_enum.c:525 +#: catalog/pg_enum.c:128 catalog/pg_enum.c:230 catalog/pg_enum.c:525 #, c-format msgid "invalid enum label \"%s\"" msgstr "列挙ラベル\"%s\"は不正です" -#: catalog/pg_enum.c:128 catalog/pg_enum.c:231 catalog/pg_enum.c:526 +#: catalog/pg_enum.c:129 catalog/pg_enum.c:231 catalog/pg_enum.c:526 #, c-format -msgid "Labels must be %d characters or less." -msgstr "ラベルは%d文字数以内でなければなりません" +msgid "Labels must be %d bytes or less." +msgstr "ラベルは%d文字数以内でなければなりません。" #: catalog/pg_enum.c:259 #, c-format @@ -4804,7 +5024,32 @@ msgstr "バイナリアップグレードモード中に pg_enum のOIDが設定 msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" msgstr "ALTER TYPE ADD BEFORE/AFTER はバイナリアップグレードでは互換性がありません" -#: catalog/pg_namespace.c:64 commands/schemacmds.c:242 +#: catalog/pg_inherits.c:593 +#, c-format +msgid "cannot detach partition \"%s\"" +msgstr "パーティション\"%s\"を取り外せません" + +#: catalog/pg_inherits.c:595 +#, c-format +msgid "The partition is being detached concurrently or has an unfinished detach." +msgstr "このパーティションは今現在取り外し中であるか取り外し処理が未完了の状態です。" + +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4474 commands/tablecmds.c:15351 +#, c-format +msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." +msgstr "ALTER TABLE ... DETACH PARTITION ... FINALIZE を実行して保留中の取り外し処理を完了させてください。" + +#: catalog/pg_inherits.c:600 +#, c-format +msgid "cannot complete detaching partition \"%s\"" +msgstr "パーティション\"%s\"の取り外しを完了できません" + +#: catalog/pg_inherits.c:602 +#, c-format +msgid "There's no pending concurrent detach." +msgstr "保留中の並列的取り外しはありません。" + +#: catalog/pg_namespace.c:64 commands/schemacmds.c:243 #, c-format msgid "schema \"%s\" already exists" msgstr "スキーマ\"%s\"はすでに存在します" @@ -4819,7 +5064,7 @@ msgstr "\"%s\"は有効な演算子名ではありません" msgid "only binary operators can have commutators" msgstr "二項演算子のみが交換子を持つことができます" -#: catalog/pg_operator.c:374 commands/operatorcmds.c:495 +#: catalog/pg_operator.c:374 commands/operatorcmds.c:507 #, c-format msgid "only binary operators can have join selectivity" msgstr "二項演算子のみが結合選択性を持つことができます" @@ -4839,12 +5084,12 @@ msgstr "二項演算子のみがハッシュ可能です" msgid "only boolean operators can have negators" msgstr "ブール型演算子のみが否定演算子を持つことができます" -#: catalog/pg_operator.c:397 commands/operatorcmds.c:503 +#: catalog/pg_operator.c:397 commands/operatorcmds.c:515 #, c-format msgid "only boolean operators can have restriction selectivity" msgstr "ブール型演算子のみが制限選択率を持つことができます" -#: catalog/pg_operator.c:401 commands/operatorcmds.c:507 +#: catalog/pg_operator.c:401 commands/operatorcmds.c:519 #, c-format msgid "only boolean operators can have join selectivity" msgstr "ブール型演算子のみが結合選択率を持つことができます" @@ -4869,44 +5114,53 @@ msgstr "演算子%sはすでに存在します" msgid "operator cannot be its own negator or sort operator" msgstr "演算子は自身の否定子やソート演算子になることはできません" -#: catalog/pg_proc.c:127 parser/parse_func.c:2191 +#: catalog/pg_parameter_acl.c:52 +#, c-format +msgid "parameter ACL \"%s\" does not exist" +msgstr "パラメータACL \"%s\"は存在しません" + +#: catalog/pg_parameter_acl.c:87 +#, c-format +msgid "invalid parameter name \"%s\"" +msgstr "不正なパラメータ名\"%s\"" + +#: catalog/pg_proc.c:132 parser/parse_func.c:2235 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" msgstr[0] "関数は%dを超える引数を取ることができません" -msgstr[1] "関数は%d個を超える引数を取ることができません" -#: catalog/pg_proc.c:364 +#: catalog/pg_proc.c:376 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "同じ引数型を持つ関数\"%s\"はすでに存在します" -#: catalog/pg_proc.c:376 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is an aggregate function." msgstr "\"%s\"は集約関数です。" -#: catalog/pg_proc.c:378 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a function." msgstr "\"%s\"は関数です。" -#: catalog/pg_proc.c:380 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a procedure." msgstr "\"%s\"はプロシージャです。" -#: catalog/pg_proc.c:382 +#: catalog/pg_proc.c:394 #, c-format msgid "\"%s\" is a window function." msgstr "関数\"%s\"はウィンドウ関数です。" -#: catalog/pg_proc.c:402 +#: catalog/pg_proc.c:414 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "プロシージャの出力パラメータの有無は変更できません" -#: catalog/pg_proc.c:403 catalog/pg_proc.c:433 +#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 #, c-format msgid "cannot change return type of existing function" msgstr "既存の関数の戻り値型を変更できません" @@ -4915,87 +5169,117 @@ msgstr "既存の関数の戻り値型を変更できません" #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: catalog/pg_proc.c:409 catalog/pg_proc.c:436 catalog/pg_proc.c:481 catalog/pg_proc.c:507 catalog/pg_proc.c:533 +#: catalog/pg_proc.c:421 catalog/pg_proc.c:448 catalog/pg_proc.c:493 catalog/pg_proc.c:519 catalog/pg_proc.c:545 #, c-format msgid "Use %s %s first." msgstr "まず %s %s を使用してください。" -#: catalog/pg_proc.c:434 +#: catalog/pg_proc.c:446 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "OUTパラメータで定義された行型が異なります。" -#: catalog/pg_proc.c:478 +#: catalog/pg_proc.c:490 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "入力パラメーター\"%s\"の名称を変更できません" -#: catalog/pg_proc.c:505 +#: catalog/pg_proc.c:517 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "既存の関数からパラメータのデフォルト値を削除できません" -#: catalog/pg_proc.c:531 +#: catalog/pg_proc.c:543 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "既存のパラメータのデフォルト値のデータ型を変更できません" -#: catalog/pg_proc.c:732 +#: catalog/pg_proc.c:757 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "\"%s\"という名前の組み込み関数はありません" -#: catalog/pg_proc.c:830 +#: catalog/pg_proc.c:855 #, c-format msgid "SQL functions cannot return type %s" msgstr "SQL関数は型%sを返すことができません" -#: catalog/pg_proc.c:845 +#: catalog/pg_proc.c:870 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "SQL関数は型%sの引数と取ることができません" -#: catalog/pg_proc.c:938 executor/functions.c:1446 +#: catalog/pg_proc.c:1000 executor/functions.c:1458 #, c-format msgid "SQL function \"%s\"" msgstr "SQL関数\"%s\"" -#: catalog/pg_publication.c:59 +#: catalog/pg_publication.c:63 catalog/pg_publication.c:71 catalog/pg_publication.c:79 catalog/pg_publication.c:85 #, c-format -msgid "Only tables can be added to publications." -msgstr "パブリケーションにはテーブルのみが追加できます" +msgid "cannot add relation \"%s\" to publication" +msgstr "パブリケーションにリレーション\"%s\"を追加できません" -#: catalog/pg_publication.c:65 +#: catalog/pg_publication.c:73 #, c-format -msgid "\"%s\" is a system table" -msgstr "\"%s\"はシステムテーブルです" +msgid "This operation is not supported for system tables." +msgstr "この操作はシステムテーブルに対してはサポートされていません。" -#: catalog/pg_publication.c:67 +#: catalog/pg_publication.c:81 #, c-format -msgid "System tables cannot be added to publications." -msgstr "システムテーブルをパブリケーションに追加することはできません" +msgid "This operation is not supported for temporary tables." +msgstr "この操作は一時テーブルに対してはサポートされていません。" -#: catalog/pg_publication.c:73 +#: catalog/pg_publication.c:87 #, c-format -msgid "table \"%s\" cannot be replicated" -msgstr "テーブル\"%s\"はレプリケーションできません" +msgid "This operation is not supported for unlogged tables." +msgstr "この操作はUNLOGGEDテーブルに対してはサポートされていません。" -#: catalog/pg_publication.c:75 +#: catalog/pg_publication.c:101 catalog/pg_publication.c:109 commands/publicationcmds.c:238 #, c-format -msgid "Temporary and unlogged relations cannot be replicated." -msgstr "一時テーブルとUNLOGGEDテーブルはレプリケーションできません" +msgid "cannot add schema \"%s\" to publication" +msgstr "パブリケーションにスキーマ\"%s\"を追加できません" -#: catalog/pg_publication.c:174 +#: catalog/pg_publication.c:103 +#, c-format +msgid "This operation is not supported for system schemas." +msgstr "この操作はシステムスキーマに対してはサポートされていません。" + +#: catalog/pg_publication.c:111 +#, c-format +msgid "Temporary schemas cannot be replicated." +msgstr "一時スキーマは発行できません" + +#: catalog/pg_publication.c:374 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "リレーション\"%s\"はすでにパブリケーション\"%s\"のメンバです" -#: catalog/pg_publication.c:470 commands/publicationcmds.c:451 commands/publicationcmds.c:739 +#: catalog/pg_publication.c:516 +#, c-format +msgid "cannot reference system column \"%s\" in publication column list" +msgstr "発行列リスト内ではシステム列\"%s\"への参照はできません" + +#: catalog/pg_publication.c:522 +#, c-format +msgid "cannot reference generated column \"%s\" in publication column list" +msgstr "発行列リスト内では生成列\"%s\"への参照はできません" + +#: catalog/pg_publication.c:528 +#, c-format +msgid "duplicate column \"%s\" in publication column list" +msgstr "発行列リスト内に重複した列 \"%s\"" + +#: catalog/pg_publication.c:618 +#, c-format +msgid "schema \"%s\" is already member of publication \"%s\"" +msgstr "スキーマ\"%s\"はすでにパブリケーション\"%s\"のメンバです" + +#: catalog/pg_publication.c:1045 commands/publicationcmds.c:1406 commands/publicationcmds.c:1452 commands/publicationcmds.c:2015 #, c-format msgid "publication \"%s\" does not exist" msgstr "パブリケーション\"%s\"は存在しません" -#: catalog/pg_shdepend.c:776 +#: catalog/pg_shdepend.c:829 #, c-format msgid "" "\n" @@ -5006,194 +5290,218 @@ msgid_plural "" msgstr[0] "" "\n" "および、他の%dのデータベース内のオブジェクト(一覧についてはサーバログを参照してください)" -msgstr[1] "" -"\n" -"および、他の%dのデータベース内のオブジェクト(一覧についてはサーバログを参照してください)" -#: catalog/pg_shdepend.c:1122 +#: catalog/pg_shdepend.c:1176 #, c-format msgid "role %u was concurrently dropped" msgstr "ロール%uの削除が同時に行われました" -#: catalog/pg_shdepend.c:1141 +#: catalog/pg_shdepend.c:1188 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "テーブル空間%uの削除が同時に行われました" -#: catalog/pg_shdepend.c:1156 +#: catalog/pg_shdepend.c:1202 #, c-format msgid "database %u was concurrently dropped" msgstr "データベース%uの削除が同時に行われました" -#: catalog/pg_shdepend.c:1201 +#: catalog/pg_shdepend.c:1253 #, c-format msgid "owner of %s" msgstr "%sの所有者" -#: catalog/pg_shdepend.c:1203 +#: catalog/pg_shdepend.c:1255 #, c-format msgid "privileges for %s" msgstr "%sの権限" -#: catalog/pg_shdepend.c:1205 +#: catalog/pg_shdepend.c:1257 #, c-format msgid "target of %s" msgstr "%sの対象" +#: catalog/pg_shdepend.c:1259 +#, c-format +msgid "tablespace for %s" +msgstr "%sのテーブル空間" + #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1213 +#: catalog/pg_shdepend.c:1267 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" msgstr[0] "%2$s内の%1$d個のオブジェクト" -msgstr[1] "%2$s内の%1$d個のオブジェクト" -#: catalog/pg_shdepend.c:1324 +#: catalog/pg_shdepend.c:1331 #, c-format msgid "cannot drop objects owned by %s because they are required by the database system" msgstr "データベースシステムが必要としているため%sが所有するオブジェクトを削除できません" -#: catalog/pg_shdepend.c:1471 +#: catalog/pg_shdepend.c:1477 #, c-format msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" msgstr "データベースシステムが必要としているため%sが所有するオブジェクトの所有者を再割り当てできません" -#: catalog/pg_subscription.c:172 commands/subscriptioncmds.c:671 commands/subscriptioncmds.c:918 commands/subscriptioncmds.c:1140 +#: catalog/pg_subscription.c:216 commands/subscriptioncmds.c:991 commands/subscriptioncmds.c:1356 commands/subscriptioncmds.c:1713 #, c-format msgid "subscription \"%s\" does not exist" msgstr "サブスクリプション\"%s\"は存在しません" -#: catalog/pg_type.c:131 catalog/pg_type.c:468 +#: catalog/pg_subscription.c:474 +#, c-format +msgid "could not drop relation mapping for subscription \"%s\"" +msgstr "サブスクリプション\"%s\"に対するリレーションマッピングを削除できませんでした" + +#: catalog/pg_subscription.c:476 +#, c-format +msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." +msgstr "リレーション\\\"%s\\\"のテーブル同期が進行中で、状態は\\\"%c\\\"です。" + +#. translator: first %s is a SQL ALTER command and second %s is a +#. SQL DROP command +#. +#: catalog/pg_subscription.c:483 +#, c-format +msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." +msgstr "サブスクリプションが有効にされていない場合は%sを実行して有効化するか、%sを実行してこのサブスクリプションを削除してください。" + +#: catalog/pg_type.c:136 catalog/pg_type.c:476 #, c-format msgid "pg_type OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_typeのOIDが設定されていません" -#: catalog/pg_type.c:249 +#: catalog/pg_type.c:256 #, c-format msgid "invalid type internal size %d" msgstr "型の内部サイズ%dは不正です" -#: catalog/pg_type.c:265 catalog/pg_type.c:273 catalog/pg_type.c:281 catalog/pg_type.c:290 +#: catalog/pg_type.c:272 catalog/pg_type.c:280 catalog/pg_type.c:288 catalog/pg_type.c:297 #, c-format msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" msgstr "値渡し型でサイズが%2$dの場合、アラインメント\"%1$c\"は不正です" -#: catalog/pg_type.c:297 +#: catalog/pg_type.c:304 #, c-format msgid "internal size %d is invalid for passed-by-value type" msgstr "値渡し型の場合、内部サイズ%dは不正です" -#: catalog/pg_type.c:307 catalog/pg_type.c:313 +#: catalog/pg_type.c:314 catalog/pg_type.c:320 #, c-format msgid "alignment \"%c\" is invalid for variable-length type" msgstr "可変長型の場合、アラインメント\"%c\"は不正です" -#: catalog/pg_type.c:321 commands/typecmds.c:3727 +#: catalog/pg_type.c:328 commands/typecmds.c:4151 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "固定長型の場合はPLAIN格納方式でなければなりません" -#: catalog/pg_type.c:814 +#: catalog/pg_type.c:824 #, c-format msgid "could not form array type name for type \"%s\"" msgstr "\"%s\"型向けの配列型の名前を形成できませんでした" -#: catalog/storage.c:449 storage/buffer/bufmgr.c:934 +#: catalog/pg_type.c:929 #, c-format -msgid "invalid page in block %u of relation %s" -msgstr "リレーション%2$sのブロック%1$uに不正なページ" +msgid "Failed while creating a multirange type for type \"%s\"." +msgstr "\"%s\"の複範囲型の作成中に失敗しました。" -#: catalog/toasting.c:103 commands/indexcmds.c:639 commands/tablecmds.c:5551 commands/tablecmds.c:15433 +#: catalog/pg_type.c:930 #, c-format -msgid "\"%s\" is not a table or materialized view" -msgstr "\"%s\"はテーブルや実体化ビューではありません" +msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." +msgstr "\"multirange_type_name\"属性で複範囲型の型名を手動で指定することができます。" + +#: catalog/storage.c:505 storage/buffer/bufmgr.c:1038 +#, c-format +msgid "invalid page in block %u of relation %s" +msgstr "リレーション%2$sのブロック%1$uに不正なページ" -#: commands/aggregatecmds.c:171 +#: commands/aggregatecmds.c:170 #, c-format msgid "only ordered-set aggregates can be hypothetical" msgstr "順序集合集約のみが仮説的集約になり得ます" -#: commands/aggregatecmds.c:196 +#: commands/aggregatecmds.c:195 #, c-format msgid "aggregate attribute \"%s\" not recognized" msgstr "集約の属性\"%sは認識できません" -#: commands/aggregatecmds.c:206 +#: commands/aggregatecmds.c:205 #, c-format msgid "aggregate stype must be specified" msgstr "集約のstypeを指定する必要があります" -#: commands/aggregatecmds.c:210 +#: commands/aggregatecmds.c:209 #, c-format msgid "aggregate sfunc must be specified" msgstr "集約用の状態遷移関数を指定する必要があります" -#: commands/aggregatecmds.c:222 +#: commands/aggregatecmds.c:221 #, c-format msgid "aggregate msfunc must be specified when mstype is specified" msgstr "mstype を指定した場合は集約の msfunc も設定する必要があります" -#: commands/aggregatecmds.c:226 +#: commands/aggregatecmds.c:225 #, c-format msgid "aggregate minvfunc must be specified when mstype is specified" msgstr "mstype を指定した場合は集約の minvfunc も設定する必要があります" -#: commands/aggregatecmds.c:233 +#: commands/aggregatecmds.c:232 #, c-format msgid "aggregate msfunc must not be specified without mstype" msgstr "集約の msfunc は mstype を指定してない場合は指定できません" -#: commands/aggregatecmds.c:237 +#: commands/aggregatecmds.c:236 #, c-format msgid "aggregate minvfunc must not be specified without mstype" msgstr "集約の minvfunc は mstype を指定していない場合は指定できません" -#: commands/aggregatecmds.c:241 +#: commands/aggregatecmds.c:240 #, c-format msgid "aggregate mfinalfunc must not be specified without mstype" msgstr "集約の mfinalfunc は mstype を指定していない場合は指定できません" -#: commands/aggregatecmds.c:245 +#: commands/aggregatecmds.c:244 #, c-format msgid "aggregate msspace must not be specified without mstype" msgstr "集約の msspace は mstype を指定していない場合は指定できません" -#: commands/aggregatecmds.c:249 +#: commands/aggregatecmds.c:248 #, c-format msgid "aggregate minitcond must not be specified without mstype" msgstr "集約の minitcond は mstype を指定していない場合は指定できません" -#: commands/aggregatecmds.c:278 +#: commands/aggregatecmds.c:277 #, c-format msgid "aggregate input type must be specified" msgstr "集約の入力型を指定する必要があります" -#: commands/aggregatecmds.c:308 +#: commands/aggregatecmds.c:307 #, c-format msgid "basetype is redundant with aggregate input type specification" msgstr "集約の入力型指定で基本型が冗長です" -#: commands/aggregatecmds.c:349 commands/aggregatecmds.c:390 +#: commands/aggregatecmds.c:350 commands/aggregatecmds.c:391 #, c-format msgid "aggregate transition data type cannot be %s" msgstr "集約の遷移データの型を%sにできません" -#: commands/aggregatecmds.c:361 +#: commands/aggregatecmds.c:362 #, c-format msgid "serialization functions may be specified only when the aggregate transition data type is %s" msgstr "直列化関数は集約遷移データの型が%sの場合にだけ指定可能です" -#: commands/aggregatecmds.c:371 +#: commands/aggregatecmds.c:372 #, c-format msgid "must specify both or neither of serialization and deserialization functions" msgstr "直列化関数と復元関数は両方指定するか、両方指定しないかのどちらかである必要があります" -#: commands/aggregatecmds.c:436 commands/functioncmds.c:615 +#: commands/aggregatecmds.c:437 commands/functioncmds.c:643 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "パラメータ\"parallel\"はSAVE、RESTRICTEDまたはUNSAFEのいずれかでなければなりません" -#: commands/aggregatecmds.c:492 +#: commands/aggregatecmds.c:493 #, c-format msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" msgstr "パラメータ\"%s\"は READ_ONLY、SHAREABLE または READ_WRITE でなくてはなりません" @@ -5203,27 +5511,27 @@ msgstr "パラメータ\"%s\"は READ_ONLY、SHAREABLE または READ_WRITE で msgid "event trigger \"%s\" already exists" msgstr "イベントトリガ\"%s\"はすでに存在します" -#: commands/alter.c:87 commands/foreigncmds.c:597 +#: commands/alter.c:87 commands/foreigncmds.c:593 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "外部データラッパー\"%s\"はすでに存在します" -#: commands/alter.c:90 commands/foreigncmds.c:879 +#: commands/alter.c:90 commands/foreigncmds.c:875 #, c-format msgid "server \"%s\" already exists" msgstr "サーバ\"%s\"はすでに存在します" -#: commands/alter.c:93 commands/proclang.c:132 +#: commands/alter.c:93 commands/proclang.c:133 #, c-format msgid "language \"%s\" already exists" msgstr "言語\"%s\"はすでに存在します" -#: commands/alter.c:96 commands/publicationcmds.c:183 +#: commands/alter.c:96 commands/publicationcmds.c:791 #, c-format msgid "publication \"%s\" already exists" msgstr "パブリケーション\"%s\"はすでに存在します" -#: commands/alter.c:99 commands/subscriptioncmds.c:397 +#: commands/alter.c:99 commands/subscriptioncmds.c:569 #, c-format msgid "subscription \"%s\" already exists" msgstr "サブスクリプション\"%s\"はすでに存在します" @@ -5263,7 +5571,7 @@ msgstr "テキスト検索設定\"%s\"はすでにスキーマ\"%s\"存在しま msgid "must be superuser to rename %s" msgstr "%sの名前を変更するにはスーパユーザである必要があります" -#: commands/alter.c:744 +#: commands/alter.c:746 #, c-format msgid "must be superuser to set schema of %s" msgstr "%sのスキーマを設定するにはスーパユーザである必要があります" @@ -5283,7 +5591,7 @@ msgstr "アクセスメソッドを作成するにはスーパユーザである msgid "access method \"%s\" already exists" msgstr "アクセスメソッド\"%s\"は存在しません" -#: commands/amcmds.c:154 commands/indexcmds.c:188 commands/indexcmds.c:790 commands/opclasscmds.c:370 commands/opclasscmds.c:824 +#: commands/amcmds.c:154 commands/indexcmds.c:210 commands/indexcmds.c:818 commands/opclasscmds.c:370 commands/opclasscmds.c:824 #, c-format msgid "access method \"%s\" does not exist" msgstr "アクセスメソッド\"%s\"は存在しません" @@ -5293,167 +5601,172 @@ msgstr "アクセスメソッド\"%s\"は存在しません" msgid "handler function is not specified" msgstr "ハンドラ関数の指定がありません" -#: commands/amcmds.c:264 commands/event_trigger.c:183 commands/foreigncmds.c:489 commands/proclang.c:79 commands/trigger.c:687 parser/parse_clause.c:941 +#: commands/amcmds.c:264 commands/event_trigger.c:183 commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:713 parser/parse_clause.c:942 #, c-format msgid "function %s must return type %s" msgstr "関数%sは型%sを返さなければなりません" -#: commands/analyze.c:226 +#: commands/analyze.c:228 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "\"%s\"をスキップしています --- この外部テーブルに対してANALYZEを実行することはできません" -#: commands/analyze.c:243 +#: commands/analyze.c:245 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "\"%s\"をスキップしています --- テーブルでないものや特別なシステムテーブルに対してANALYZEを実行することはできません" -#: commands/analyze.c:318 +#: commands/analyze.c:325 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "\"%s.%s\"継承ツリーを解析しています" -#: commands/analyze.c:323 +#: commands/analyze.c:330 #, c-format msgid "analyzing \"%s.%s\"" msgstr "\"%s.%s\"を解析しています" -#: commands/analyze.c:383 +#: commands/analyze.c:396 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "リレーション\"%2$s\"の列\"%1$s\"が2回以上現れます" -#: commands/analyze.c:689 +#: commands/analyze.c:787 #, c-format -msgid "automatic analyze of table \"%s.%s.%s\" system usage: %s" -msgstr "テーブル\"%s.%s.%s\"の自動ANALYZE システム使用状況: %s\"" +msgid "automatic analyze of table \"%s.%s.%s\"\n" +msgstr "テーブル\"%s.%s.%s\"に対する自動ANALYZE\n" -#: commands/analyze.c:1158 +#: commands/analyze.c:1333 #, c-format msgid "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead rows; %d rows in sample, %.0f estimated total rows" msgstr "\"%1$s\": %3$uページの内%2$dをスキャン。%4$.0fの有効な行と%5$.0fの不要な行が存在。%6$d行をサンプリング。推定総行数は%7$.0f" -#: commands/analyze.c:1238 +#: commands/analyze.c:1413 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" msgstr "継承ツリー\"%s.%s\"のANALYZEをスキップします --- このツリーには子テーブルがありません" -#: commands/analyze.c:1336 +#: commands/analyze.c:1511 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no analyzable child tables" msgstr "継承ツリー\"%s.%s\"のANALYZEをスキップします --- このツリーにはアナライズ可能な子テーブルがありません" -#: commands/async.c:631 +#: commands/async.c:646 #, c-format msgid "channel name cannot be empty" msgstr "チャネル名が空であることはできません" -#: commands/async.c:637 +#: commands/async.c:652 #, c-format msgid "channel name too long" msgstr "チャネル名が長すぎます" -#: commands/async.c:642 +#: commands/async.c:657 #, c-format msgid "payload string too long" msgstr "ペイロード文字列が長すぎます" -#: commands/async.c:861 +#: commands/async.c:876 #, c-format msgid "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" msgstr "LISTEN / UNLISTEN / NOTIFY を実行しているトランザクションは PREPARE できません" -#: commands/async.c:967 +#: commands/async.c:980 #, c-format msgid "too many notifications in the NOTIFY queue" msgstr "NOTIFY キューで発生した通知イベントが多すぎます" -#: commands/async.c:1633 +#: commands/async.c:1602 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "NOTYFY キューが %.0f%% まで一杯になっています" -#: commands/async.c:1635 +#: commands/async.c:1604 #, c-format msgid "The server process with PID %d is among those with the oldest transactions." msgstr "PID %d のサーバプロセスは、この中で最も古いトランザクションを実行中です。" -#: commands/async.c:1638 +#: commands/async.c:1607 #, c-format msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." msgstr "このプロセスが現在のトランザクションを終了するまで NOTYFY キューを空にすることはできません" -#: commands/cluster.c:125 commands/cluster.c:362 +#: commands/cluster.c:128 #, c-format -msgid "cannot cluster temporary tables of other sessions" -msgstr "他のセッションの一時テーブルをクラスタ化できません" +msgid "unrecognized CLUSTER option \"%s\"" +msgstr "認識できないCLUSTERオプション \"%s\"" -#: commands/cluster.c:133 +#: commands/cluster.c:158 commands/cluster.c:431 #, c-format -msgid "cannot cluster a partitioned table" -msgstr "パーティションテーブルに対して CLUSTER は実行できません" +msgid "cannot cluster temporary tables of other sessions" +msgstr "他のセッションの一時テーブルをクラスタ化できません" -#: commands/cluster.c:151 +#: commands/cluster.c:176 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "テーブル\"%s\"には事前にクラスタ化されたインデックスはありません" -#: commands/cluster.c:165 commands/tablecmds.c:12709 commands/tablecmds.c:14515 +#: commands/cluster.c:190 commands/tablecmds.c:14052 commands/tablecmds.c:15943 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "テーブル\"%2$s\"にはインデックス\"%1$s\"は存在しません" -#: commands/cluster.c:351 +#: commands/cluster.c:420 #, c-format msgid "cannot cluster a shared catalog" msgstr "共有カタログをクラスタ化できません" -#: commands/cluster.c:366 +#: commands/cluster.c:435 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "他のセッションの一時テーブルに対してはVACUUMを実行できません" -#: commands/cluster.c:432 commands/tablecmds.c:14525 +#: commands/cluster.c:511 commands/tablecmds.c:15953 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\"はテーブル\"%s\"のインデックスではありません" -#: commands/cluster.c:440 +#: commands/cluster.c:519 #, c-format msgid "cannot cluster on index \"%s\" because access method does not support clustering" msgstr "インデックス\"%s\"でクラスタ化できません。アクセスメソッドがクラスタ化をサポートしないためです" -#: commands/cluster.c:452 +#: commands/cluster.c:531 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "部分インデックス\"%s\"をクラスタ化できません" -#: commands/cluster.c:466 +#: commands/cluster.c:545 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "無効なインデックス\"%s\"ではクラスタ化できません" -#: commands/cluster.c:490 +#: commands/cluster.c:569 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "パーティションテーブル内のインデックスは CLUSTER 済みとマークできません`" -#: commands/cluster.c:863 +#: commands/cluster.c:948 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "\"%3$s\"に対するインデックススキャンを使って\"%1$s.%2$s\"をクラスタ化しています" -#: commands/cluster.c:869 +#: commands/cluster.c:954 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "シーケンシャルスキャンとソートを使って\"%s.%s\"をクラスタ化しています" -#: commands/cluster.c:900 +#: commands/cluster.c:959 +#, c-format +msgid "vacuuming \"%s.%s\"" +msgstr "\"%s.%s\"に対してVACUUMを実行しています" + +#: commands/cluster.c:985 #, c-format -msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" -msgstr "\"%1$s\": 全 %4$u ページ中に見つかった行バージョン: 移動可能 %2$.0f 行、削除不可 %3$.0f 行" +msgid "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" +msgstr "\"%1$s.%2$s\": %5$u ページ中に見つかった行バージョン: 移動可能 %3$.0f 行、削除不可 %4$.0f 行" -#: commands/cluster.c:904 +#: commands/cluster.c:990 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -5462,92 +5775,119 @@ msgstr "" "%.0f 個の無効な行が今はまだ削除できません。\n" "%s." -#: commands/collationcmds.c:105 +#: commands/collationcmds.c:106 #, c-format msgid "collation attribute \"%s\" not recognized" msgstr "照合順序の属性\"%s\"が認識できません" -#: commands/collationcmds.c:148 +#: commands/collationcmds.c:119 commands/collationcmds.c:125 commands/define.c:356 commands/tablecmds.c:7737 replication/pgoutput/pgoutput.c:310 replication/pgoutput/pgoutput.c:333 replication/pgoutput/pgoutput.c:347 replication/pgoutput/pgoutput.c:357 replication/pgoutput/pgoutput.c:367 replication/pgoutput/pgoutput.c:377 replication/walsender.c:1002 replication/walsender.c:1024 replication/walsender.c:1034 +#, c-format +msgid "conflicting or redundant options" +msgstr "競合するオプション、あるいは余計なオプションがあります" + +#: commands/collationcmds.c:120 +#, c-format +msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." +msgstr "" +"LOCALE は LC_COLLATE または LC_CTYPE \n" +"と同時に指定することはできません" + +#: commands/collationcmds.c:126 +#, c-format +msgid "FROM cannot be specified together with any other options." +msgstr "FROMは他のすべてのオプションと同時に指定はできません。" + +#: commands/collationcmds.c:174 #, c-format msgid "collation \"default\" cannot be copied" msgstr "照合順序\"default\"は複製できません" -#: commands/collationcmds.c:181 +#: commands/collationcmds.c:204 #, c-format msgid "unrecognized collation provider: %s" msgstr "認識できないの照合順序プロバイダ: %s" -#: commands/collationcmds.c:190 +#: commands/collationcmds.c:232 #, c-format msgid "parameter \"lc_collate\" must be specified" msgstr "\"lc_collate\"パラメータの指定が必要です" -#: commands/collationcmds.c:195 +#: commands/collationcmds.c:237 #, c-format msgid "parameter \"lc_ctype\" must be specified" msgstr "\"lc_ctype\"パラメータの指定が必要です" -#: commands/collationcmds.c:205 +#: commands/collationcmds.c:244 +#, c-format +msgid "parameter \"locale\" must be specified" +msgstr "パラメータ\"locale\"の指定が必要です" + +#: commands/collationcmds.c:255 #, c-format msgid "nondeterministic collations not supported with this provider" msgstr "非決定的照合順序はこのプロバイダではサポートされません" -#: commands/collationcmds.c:265 +#: commands/collationcmds.c:274 +#, c-format +msgid "current database's encoding is not supported with this provider" +msgstr "現在のデータベースのエンコーディングはこのプロバイダではサポートされません" + +#: commands/collationcmds.c:333 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "エンコーディング\"%2$s\"のための照合順序\"%1$s\"はすでにスキーマ\"%3$s\"内に存在します" -#: commands/collationcmds.c:276 +#: commands/collationcmds.c:344 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "照合順序\"%s\"はすでにスキーマ\"%s\"内に存在します" -#: commands/collationcmds.c:324 +#: commands/collationcmds.c:394 commands/dbcommands.c:2399 #, c-format msgid "changing version from %s to %s" msgstr "バージョン%sから%sへの変更" -#: commands/collationcmds.c:339 +#: commands/collationcmds.c:409 commands/dbcommands.c:2412 #, c-format msgid "version has not changed" msgstr "バージョンが変わっていません" -#: commands/collationcmds.c:470 +#: commands/collationcmds.c:531 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "ロケール名\"%s\"を、言語タグに変換できませんでした: %s" -#: commands/collationcmds.c:531 +#: commands/collationcmds.c:589 #, c-format msgid "must be superuser to import system collations" msgstr "システム照合順序をインポートするにはスーパユーザである必要があります" -#: commands/collationcmds.c:554 commands/copy.c:1944 commands/copy.c:3536 libpq/be-secure-common.c:81 +#: commands/collationcmds.c:617 commands/copyfrom.c:1499 commands/copyto.c:679 libpq/be-secure-common.c:81 #, c-format msgid "could not execute command \"%s\": %m" msgstr "コマンド\"%s\"を実行できませんでした: %m" -#: commands/collationcmds.c:685 +#: commands/collationcmds.c:752 #, c-format msgid "no usable system locales were found" msgstr "使用できるシステムロケールが見つかりません" -#: commands/comment.c:61 commands/dbcommands.c:841 commands/dbcommands.c:1037 commands/dbcommands.c:1150 commands/dbcommands.c:1340 commands/dbcommands.c:1588 commands/dbcommands.c:1702 commands/dbcommands.c:2142 utils/init/postinit.c:892 utils/init/postinit.c:997 utils/init/postinit.c:1014 +#: commands/comment.c:61 commands/dbcommands.c:1539 commands/dbcommands.c:1736 commands/dbcommands.c:1849 commands/dbcommands.c:2043 commands/dbcommands.c:2285 commands/dbcommands.c:2372 commands/dbcommands.c:2482 commands/dbcommands.c:2981 utils/init/postinit.c:922 utils/init/postinit.c:1027 utils/init/postinit.c:1044 #, c-format msgid "database \"%s\" does not exist" msgstr "データベース\"%s\"は存在しません" -#: commands/comment.c:101 commands/seclabel.c:191 parser/parse_utilcmd.c:955 +#: commands/comment.c:101 #, c-format -msgid "\"%s\" is not a table, view, materialized view, composite type, or foreign table" -msgstr "\"%s\"はテーブル、ビュー、実体化ビュー、複合型、外部テーブルのいずれでもありません" +msgid "cannot set comment on relation \"%s\"" +msgstr "リレーション\"%s\"にはコメントを設定できません" -#: commands/constraint.c:63 utils/adt/ri_triggers.c:1923 +#: commands/constraint.c:63 utils/adt/ri_triggers.c:2007 #, c-format msgid "function \"%s\" was not called by trigger manager" msgstr "関数\"%s\"はトリガ関数として呼び出されていません" -#: commands/constraint.c:70 utils/adt/ri_triggers.c:1932 +#: commands/constraint.c:70 utils/adt/ri_triggers.c:2016 #, c-format msgid "function \"%s\" must be fired AFTER ROW" msgstr "関数\"%s\"はAFTER ROWトリガで実行してください" @@ -5557,827 +5897,916 @@ msgstr "関数\"%s\"はAFTER ROWトリガで実行してください" msgid "function \"%s\" must be fired for INSERT or UPDATE" msgstr "関数\"%s\"はINSERTまたはUPDATEトリガで実行してください" -#: commands/conversioncmds.c:66 +#: commands/conversioncmds.c:67 #, c-format msgid "source encoding \"%s\" does not exist" msgstr "変換元符号化方式\"%s\"は存在しません" -#: commands/conversioncmds.c:73 +#: commands/conversioncmds.c:74 #, c-format msgid "destination encoding \"%s\" does not exist" msgstr "変換先符号化方式\"%s\"は存在しません" -#: commands/conversioncmds.c:86 +#: commands/conversioncmds.c:87 #, c-format msgid "encoding conversion to or from \"SQL_ASCII\" is not supported" msgstr "SQL_ASCIIとの間のエンコーディング変換はサポートされていません" -#: commands/conversioncmds.c:99 +#: commands/conversioncmds.c:100 #, c-format msgid "encoding conversion function %s must return type %s" msgstr "エンコード変換関数%sは%s型を返す必要があります" -#: commands/copy.c:434 commands/copy.c:468 -#, c-format -msgid "COPY BINARY is not supported to stdout or from stdin" -msgstr "標準入出力を介したCOPY BINARYはサポートされていません" - -#: commands/copy.c:568 -#, c-format -msgid "could not write to COPY program: %m" -msgstr "COPYプログラムに書き出せませんでした: %m" - -#: commands/copy.c:573 -#, c-format -msgid "could not write to COPY file: %m" -msgstr "COPYファイルに書き出せませんでした: %m" - -#: commands/copy.c:586 -#, c-format -msgid "connection lost during COPY to stdout" -msgstr "標準出力へのCOPY中に接続が失われました" - -#: commands/copy.c:630 -#, c-format -msgid "could not read from COPY file: %m" -msgstr "COPYファイルから読み込めませんでした: %m" - -#: commands/copy.c:648 commands/copy.c:669 commands/copy.c:673 tcop/postgres.c:344 tcop/postgres.c:380 tcop/postgres.c:407 -#, c-format -msgid "unexpected EOF on client connection with an open transaction" -msgstr "トランザクションを実行中のクライアント接続で想定外のEOFがありました" - -#: commands/copy.c:686 -#, c-format -msgid "COPY from stdin failed: %s" -msgstr "標準入力からのCOPYが失敗しました: %s" - -#: commands/copy.c:702 +#: commands/conversioncmds.c:130 #, c-format -msgid "unexpected message type 0x%02X during COPY from stdin" -msgstr "標準入力からのCOPY中に想定外のメッセージタイプ0x%02Xがありました" +msgid "encoding conversion function %s returned incorrect result for empty input" +msgstr "エンコーディング変換関数%sは空の入力に対して間違った結果を返却しました" -#: commands/copy.c:911 +#: commands/copy.c:86 #, c-format -msgid "must be superuser or a member of the pg_execute_server_program role to COPY to or from an external program" -msgstr "外部プログラムを入出力対象としたCOPYを行うにはスーパユーザまたは pg_execute_server_program ロールのメンバである必要があります" +msgid "must be superuser or have privileges of the pg_execute_server_program role to COPY to or from an external program" +msgstr "外部プログラムを入出力対象としたCOPYを行うにはスーパーユーザーまたは pg_execute_server_programロールの権限を持つ必要があります" -#: commands/copy.c:912 commands/copy.c:921 commands/copy.c:928 +#: commands/copy.c:87 commands/copy.c:96 commands/copy.c:103 #, c-format msgid "Anyone can COPY to stdout or from stdin. psql's \\copy command also works for anyone." msgstr "標準入出力経由のCOPYは誰でも実行可能です。またpsqlの\\\\copyも誰でも実行できます" -#: commands/copy.c:920 +#: commands/copy.c:95 #, c-format -msgid "must be superuser or a member of the pg_read_server_files role to COPY from a file" -msgstr "ファイルからの COPY を行うにはスーパユーザまたは pg_read_server_files ロールのメンバである必要があります" +msgid "must be superuser or have privileges of the pg_read_server_files role to COPY from a file" +msgstr "ファイルからの COPY を行うにはスーパユーザまたはpg_read_server_filesロールの権限を持つ必要があります" -#: commands/copy.c:927 +#: commands/copy.c:102 #, c-format -msgid "must be superuser or a member of the pg_write_server_files role to COPY to a file" -msgstr "ファイルへの COPY を行うにはスーパユーザまたは pg_write_server_files ロールのメンバである必要があります" +msgid "must be superuser or have privileges of the pg_write_server_files role to COPY to a file" +msgstr "ファイルへの COPY を行うにはスーパユーザまたはpg_write_server_filesロールの権限を持つ必要があります" -#: commands/copy.c:1013 +#: commands/copy.c:188 #, c-format msgid "COPY FROM not supported with row-level security" msgstr "COPY FROM で行レベルセキュリティはサポートされていません" -#: commands/copy.c:1014 +#: commands/copy.c:189 #, c-format msgid "Use INSERT statements instead." msgstr "代わりにINSERTを文使用してください。" -#: commands/copy.c:1196 +#: commands/copy.c:369 +#, c-format +msgid "%s requires a Boolean value or \"match\"" +msgstr "パラメータ\"%s\"はBoolean値または\"match\"のみを取ります" + +#: commands/copy.c:428 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "COPY フォーマット\"%s\"を認識できません" -#: commands/copy.c:1267 commands/copy.c:1283 commands/copy.c:1298 commands/copy.c:1320 +#: commands/copy.c:480 commands/copy.c:493 commands/copy.c:506 commands/copy.c:525 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "オプション\"%s\"の引数は列名のリストでなければなりません" -#: commands/copy.c:1335 +#: commands/copy.c:537 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "オプション\"%s\"の引数は有効なエンコーディング名でなければなりません" -#: commands/copy.c:1342 commands/dbcommands.c:253 commands/dbcommands.c:1536 +#: commands/copy.c:544 commands/dbcommands.c:853 commands/dbcommands.c:2233 #, c-format msgid "option \"%s\" not recognized" msgstr "タイムゾーン\"%s\"を認識できません" -#: commands/copy.c:1354 +#: commands/copy.c:556 #, c-format msgid "cannot specify DELIMITER in BINARY mode" msgstr "BINARYモードではDELIMITERを指定できません" -#: commands/copy.c:1359 +#: commands/copy.c:561 #, c-format msgid "cannot specify NULL in BINARY mode" msgstr "BINARYモードではNULLを指定できません" -#: commands/copy.c:1381 +#: commands/copy.c:583 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "COPYの区切り文字は単一の1バイト文字でなければなりません" -#: commands/copy.c:1388 +#: commands/copy.c:590 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "COPYの区切り文字は改行や復帰記号とすることができません" -#: commands/copy.c:1394 +#: commands/copy.c:596 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "COPYのNULL表現には改行や復帰記号を使用することはできません" -#: commands/copy.c:1411 +#: commands/copy.c:613 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "COPYの区切り文字を\"%s\"とすることはできません" -#: commands/copy.c:1417 +#: commands/copy.c:619 #, c-format -msgid "COPY HEADER available only in CSV mode" -msgstr "COPY HEADERはCSVモードでのみ使用できます" +msgid "cannot specify HEADER in BINARY mode" +msgstr "BINARYモードではHEADERを指定できません" -#: commands/copy.c:1423 +#: commands/copy.c:625 #, c-format msgid "COPY quote available only in CSV mode" msgstr "COPYの引用符はCSVモードでのみ使用できます" -#: commands/copy.c:1428 +#: commands/copy.c:630 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "COPYの引用符は単一の1バイト文字でなければなりません" -#: commands/copy.c:1433 +#: commands/copy.c:635 #, c-format msgid "COPY delimiter and quote must be different" msgstr "COPYの区切り文字と引用符は異なる文字でなければなりません" -#: commands/copy.c:1439 +#: commands/copy.c:641 #, c-format msgid "COPY escape available only in CSV mode" msgstr "COPYのエスケープはCSVモードでのみ使用できます" -#: commands/copy.c:1444 +#: commands/copy.c:646 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "COPYのエスケープは単一の1バイト文字でなければなりません" -#: commands/copy.c:1450 +#: commands/copy.c:652 #, c-format msgid "COPY force quote available only in CSV mode" msgstr "COPYのFORCE_QUOTEオプションはCSVモードでのみ使用できます" -#: commands/copy.c:1454 +#: commands/copy.c:656 #, c-format msgid "COPY force quote only available using COPY TO" msgstr "COPYのFORCE_QUOTEオプションはCOPY TOでのみ使用できます" -#: commands/copy.c:1460 +#: commands/copy.c:662 #, c-format msgid "COPY force not null available only in CSV mode" msgstr "COPYのFORCE_NOT_NULLオプションはCSVモードでのみ使用できます" -#: commands/copy.c:1464 +#: commands/copy.c:666 #, c-format msgid "COPY force not null only available using COPY FROM" msgstr "COPYのFORCE_NOT_NULLオプションはCOPY FROMでのみ使用できます" -#: commands/copy.c:1470 +#: commands/copy.c:672 #, c-format msgid "COPY force null available only in CSV mode" msgstr "COPYのFORCE_NULLオプションはCSVモードでのみ使用できます" -#: commands/copy.c:1475 +#: commands/copy.c:677 #, c-format msgid "COPY force null only available using COPY FROM" msgstr "COPYのFORCE_NOT_NULLオプションはCOPY FROMでのみ使用できます" -#: commands/copy.c:1481 +#: commands/copy.c:683 #, c-format msgid "COPY delimiter must not appear in the NULL specification" msgstr "COPYの区切り文字をNULLオプションの値に使用できません" -#: commands/copy.c:1488 +#: commands/copy.c:690 #, c-format msgid "CSV quote character must not appear in the NULL specification" msgstr "COPYの引用符をNULLオプションの値に使用できません" -#: commands/copy.c:1574 -#, c-format -msgid "DO INSTEAD NOTHING rules are not supported for COPY" -msgstr "DO INSTEAD NOTHING ルールは COPY ではサポートされていません" - -#: commands/copy.c:1588 -#, c-format -msgid "conditional DO INSTEAD rules are not supported for COPY" -msgstr "条件付き DO INSTEAD ルールは COPY ではサポートされていません" - -#: commands/copy.c:1592 +#: commands/copy.c:751 #, c-format -msgid "DO ALSO rules are not supported for the COPY" -msgstr "DO ALSO ルールは COPY ではサポートされていません" +msgid "column \"%s\" is a generated column" +msgstr "列\"%s\"は生成カラムです" -#: commands/copy.c:1597 +#: commands/copy.c:753 #, c-format -msgid "multi-statement DO INSTEAD rules are not supported for COPY" -msgstr "マルチステートメントの DO INSTEAD ルールは COPY ではサポートされていません" +msgid "Generated columns cannot be used in COPY." +msgstr "生成カラムはCOPYでは使えません。" -#: commands/copy.c:1607 +#: commands/copy.c:768 commands/indexcmds.c:1797 commands/statscmds.c:239 commands/tablecmds.c:2369 commands/tablecmds.c:3025 commands/tablecmds.c:3519 parser/parse_relation.c:3609 parser/parse_relation.c:3629 utils/adt/tsvector_op.c:2685 #, c-format -msgid "COPY (SELECT INTO) is not supported" -msgstr "COPY (SELECT INTO)はサポートされていません" +msgid "column \"%s\" does not exist" +msgstr "列\"%s\"は存在しません" -#: commands/copy.c:1624 +#: commands/copy.c:775 commands/tablecmds.c:2395 commands/trigger.c:967 parser/parse_target.c:1079 parser/parse_target.c:1090 #, c-format -msgid "COPY query must have a RETURNING clause" -msgstr "COPY文中の問い合わせではRETURNING句が必須です" +msgid "column \"%s\" specified more than once" +msgstr "列\"%s\"が複数指定されました" -#: commands/copy.c:1653 +#: commands/copyfrom.c:123 #, c-format -msgid "relation referenced by COPY statement has changed" -msgstr "COPY文で参照されているリレーションが変更されました" +msgid "COPY %s, line %llu, column %s" +msgstr "%sのCOPY、行 %llu、列 %s" -#: commands/copy.c:1712 +#: commands/copyfrom.c:128 commands/copyfrom.c:174 #, c-format -msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" -msgstr "FORCE_QUOTE指定された列\"%s\"はCOPYで参照されません" +msgid "COPY %s, line %llu" +msgstr "%sのCOPY、行 %llu" -#: commands/copy.c:1735 +#: commands/copyfrom.c:140 #, c-format -msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" -msgstr "FORCE_NOT_NULL指定された列\"%s\"はCOPYで参照されません" +msgid "COPY %s, line %llu, column %s: \"%s\"" +msgstr "%sのCOPY、行 %llu、列 %s: \"%s\"" -#: commands/copy.c:1758 +#: commands/copyfrom.c:150 #, c-format -msgid "FORCE_NULL column \"%s\" not referenced by COPY" -msgstr "FORCE_NULL指定された列\"%s\"はCOPYで参照されません" +msgid "COPY %s, line %llu, column %s: null input" +msgstr "%sのCOPY、行 %llu、列 %s: null が入力されました" -#: commands/copy.c:1824 libpq/be-secure-common.c:105 +#: commands/copyfrom.c:167 #, c-format -msgid "could not close pipe to external command: %m" -msgstr "外部コマンドに対するパイプをクローズできませんでした: %m" +msgid "COPY %s, line %llu: \"%s\"" +msgstr "%sのCOPY、行 %llu: \"%s\"" -#: commands/copy.c:1839 +#: commands/copyfrom.c:569 #, c-format -msgid "program \"%s\" failed" -msgstr "プログラム\"%s\"の実行に失敗しました" +msgid "cannot copy to view \"%s\"" +msgstr "ビュー\"%s\"へのコピーはできません" -#: commands/copy.c:1890 +#: commands/copyfrom.c:571 #, c-format -msgid "cannot copy from view \"%s\"" -msgstr "ビュー\"%s\"からのコピーはできません" +msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." +msgstr "ビューへのコピーを可能にするためには、INSTEAD OF INSERTトリガを作成してください。" -#: commands/copy.c:1892 commands/copy.c:1898 commands/copy.c:1904 commands/copy.c:1915 +#: commands/copyfrom.c:575 #, c-format -msgid "Try the COPY (SELECT ...) TO variant." -msgstr "COPY (SELECT ...) TO構文を試してください" +msgid "cannot copy to materialized view \"%s\"" +msgstr "実体化ビュー\"%s\"へのコピーはできません" -#: commands/copy.c:1896 +#: commands/copyfrom.c:580 #, c-format -msgid "cannot copy from materialized view \"%s\"" -msgstr "実体化ビュー\"%s\"からのコピーはできません" +msgid "cannot copy to sequence \"%s\"" +msgstr "シーケンス\"%s\"へのコピーはできません" -#: commands/copy.c:1902 +#: commands/copyfrom.c:585 #, c-format -msgid "cannot copy from foreign table \"%s\"" -msgstr "外部テーブル \"%s\" からのコピーはできません" +msgid "cannot copy to non-table relation \"%s\"" +msgstr "テーブル以外のリレーション\"%s\"へのコピーはできません" -#: commands/copy.c:1908 +#: commands/copyfrom.c:625 #, c-format -msgid "cannot copy from sequence \"%s\"" -msgstr "シーケンス\"%s\"からのコピーはできません" +msgid "cannot perform COPY FREEZE on a partitioned table" +msgstr "パーティション親テーブルに対して COPY FREEZE は実行できません" -#: commands/copy.c:1913 +#: commands/copyfrom.c:640 #, c-format -msgid "cannot copy from partitioned table \"%s\"" -msgstr "パーティションテーブル\"%s\"からのコピーはできません" +msgid "cannot perform COPY FREEZE because of prior transaction activity" +msgstr "先行するトランザクション処理のためCOPY FREEZEを実行することができません" -#: commands/copy.c:1919 +#: commands/copyfrom.c:646 #, c-format -msgid "cannot copy from non-table relation \"%s\"" -msgstr "テーブル以外のリレーション\"%s\"からのコピーはできません" +msgid "cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction" +msgstr "このテーブルは現在のサブトランザクションにおいて作成または切り詰めされていないため、COPY FREEZEを実行することができません" -#: commands/copy.c:1959 +#: commands/copyfrom.c:1267 commands/copyto.c:611 #, c-format -msgid "relative path not allowed for COPY to file" -msgstr "ファイルへのCOPYでは相対パスは指定できません" +msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" +msgstr "FORCE_NOT_NULL指定された列\"%s\"はCOPYで参照されません" -#: commands/copy.c:1978 +#: commands/copyfrom.c:1290 commands/copyto.c:634 #, c-format -msgid "could not open file \"%s\" for writing: %m" -msgstr "ファイル\"%s\"を書き込み用にオープンできませんでした: %m" +msgid "FORCE_NULL column \"%s\" not referenced by COPY" +msgstr "FORCE_NULL指定された列\"%s\"はCOPYで参照されません" -#: commands/copy.c:1981 +#: commands/copyfrom.c:1518 #, c-format -msgid "COPY TO instructs the PostgreSQL server process to write a file. You may want a client-side facility such as psql's \\copy." -msgstr "COPY TOによってPostgreSQLサーバプロセスはファイルの書き込みを行います。psqlの \\copy のようなクライアント側の仕組みが必要かもしれません" +msgid "COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \\copy." +msgstr "COPY FROMによってPostgreSQLサーバプロセスはファイルを読み込みます。psqlの \\copy のようなクライアント側の仕組みが必要かもしれません" -#: commands/copy.c:1994 commands/copy.c:3567 +#: commands/copyfrom.c:1531 commands/copyto.c:731 #, c-format msgid "\"%s\" is a directory" msgstr "\"%s\"はディレクトリです" -#: commands/copy.c:2296 -#, c-format -msgid "COPY %s, line %s, column %s" -msgstr "%sのCOPY、行 %s、列 %s" - -#: commands/copy.c:2300 commands/copy.c:2347 -#, c-format -msgid "COPY %s, line %s" -msgstr "%sのCOPY、行 %s" - -#: commands/copy.c:2311 -#, c-format -msgid "COPY %s, line %s, column %s: \"%s\"" -msgstr "%sのCOPY、行 %s、列 %s: \"%s\"" - -#: commands/copy.c:2319 -#, c-format -msgid "COPY %s, line %s, column %s: null input" -msgstr "%sのCOPY、行 %s、列 %s: null が入力されました" - -#: commands/copy.c:2341 -#, c-format -msgid "COPY %s, line %s: \"%s\"" -msgstr "%sのCOPY、行 %s: \"%s\"" - -#: commands/copy.c:2741 +#: commands/copyfrom.c:1599 commands/copyto.c:301 libpq/be-secure-common.c:105 #, c-format -msgid "cannot copy to view \"%s\"" -msgstr "ビュー\"%s\"へのコピーはできません" +msgid "could not close pipe to external command: %m" +msgstr "外部コマンドに対するパイプをクローズできませんでした: %m" -#: commands/copy.c:2743 +#: commands/copyfrom.c:1614 commands/copyto.c:306 #, c-format -msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." -msgstr "ビューへのコピーを可能にするためには、INSTEAD OF INSERTトリガを作成してください。" +msgid "program \"%s\" failed" +msgstr "プログラム\"%s\"の実行に失敗しました" -#: commands/copy.c:2747 +#: commands/copyfromparse.c:200 #, c-format -msgid "cannot copy to materialized view \"%s\"" -msgstr "実体化ビュー\"%s\"へのコピーはできません" +msgid "COPY file signature not recognized" +msgstr "COPYファイルのシグネチャが不明です" -#: commands/copy.c:2752 +#: commands/copyfromparse.c:205 #, c-format -msgid "cannot copy to sequence \"%s\"" -msgstr "シーケンス\"%s\"へのコピーはできません" +msgid "invalid COPY file header (missing flags)" +msgstr "COPYファイルのヘッダが不正です(フラグがありません)" -#: commands/copy.c:2757 +#: commands/copyfromparse.c:209 #, c-format -msgid "cannot copy to non-table relation \"%s\"" -msgstr "テーブル以外のリレーション\"%s\"へのコピーはできません" +msgid "invalid COPY file header (WITH OIDS)" +msgstr "COPYファイルのヘッダが不正です(WITH OIDS)" -#: commands/copy.c:2797 +#: commands/copyfromparse.c:214 #, c-format -msgid "cannot perform COPY FREEZE on a partitioned table" -msgstr "パーティション親テーブルに対して CLUSTER は実行できません" +msgid "unrecognized critical flags in COPY file header" +msgstr "COPYファイルのヘッダ内の重要なフラグが不明です" -#: commands/copy.c:2812 +#: commands/copyfromparse.c:220 #, c-format -msgid "cannot perform COPY FREEZE because of prior transaction activity" -msgstr "先行するトランザクション処理のためCOPY FREEZEを実行することができません" +msgid "invalid COPY file header (missing length)" +msgstr "COPYファイルのヘッダが不正です(サイズがありません)" -#: commands/copy.c:2818 +#: commands/copyfromparse.c:227 #, c-format -msgid "cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction" -msgstr "このテーブルは現在のサブトランザクションにおいて作成または切り詰めされていないため、COPY FREEZEを実行することができません" +msgid "invalid COPY file header (wrong length)" +msgstr "COPYファイルのヘッダが不正です(サイズが不正です)" -#: commands/copy.c:3554 +#: commands/copyfromparse.c:256 #, c-format -msgid "COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \\copy." -msgstr "COPY FROMによってPostgreSQLサーバプロセスはファイルを読み込みます。psqlの \\copy のようなクライアント側の仕組みが必要かもしれません" +msgid "could not read from COPY file: %m" +msgstr "COPYファイルから読み込めませんでした: %m" -#: commands/copy.c:3582 +#: commands/copyfromparse.c:278 commands/copyfromparse.c:303 tcop/postgres.c:358 #, c-format -msgid "COPY file signature not recognized" -msgstr "COPYファイルのシグネチャが不明です" +msgid "unexpected EOF on client connection with an open transaction" +msgstr "トランザクションを実行中のクライアント接続で想定外のEOFがありました" -#: commands/copy.c:3587 +#: commands/copyfromparse.c:294 #, c-format -msgid "invalid COPY file header (missing flags)" -msgstr "COPYファイルのヘッダが不正です(フラグがありません)" +msgid "unexpected message type 0x%02X during COPY from stdin" +msgstr "標準入力からのCOPY中に想定外のメッセージタイプ0x%02Xがありました" -#: commands/copy.c:3591 +#: commands/copyfromparse.c:317 #, c-format -msgid "invalid COPY file header (WITH OIDS)" -msgstr "COPYファイルのヘッダが不正です(WITH OIDS)" +msgid "COPY from stdin failed: %s" +msgstr "標準入力からのCOPYが失敗しました: %s" -#: commands/copy.c:3596 +#: commands/copyfromparse.c:785 #, c-format -msgid "unrecognized critical flags in COPY file header" -msgstr "COPYファイルのヘッダ内の重要なフラグが不明です" +msgid "wrong number of fields in header line: field count is %d, expected %d" +msgstr "ヘッダ行の列数が間違っています: 列数は%d。%dを想定していました" -#: commands/copy.c:3602 +#: commands/copyfromparse.c:800 #, c-format -msgid "invalid COPY file header (missing length)" -msgstr "COPYファイルのヘッダが不正です(サイズがありません)" +msgid "column name mismatch in header line field %d: got null value (\"%s\"), expected \"%s\"" +msgstr "ヘッダ行フィールド%dでカラム名の不一致: NULL値(\"%s\")を検出, 予期していた値\"%s\"" -#: commands/copy.c:3609 +#: commands/copyfromparse.c:806 #, c-format -msgid "invalid COPY file header (wrong length)" -msgstr "COPYファイルのヘッダが不正です(サイズが不正です)" +msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" +msgstr "ヘッダ行フィールド%dでカラム名の不一致: \"%s\"を検出, 予期していた値\"%s\"" -#: commands/copy.c:3728 commands/copy.c:4390 commands/copy.c:4620 +#: commands/copyfromparse.c:888 commands/copyfromparse.c:1498 commands/copyfromparse.c:1728 #, c-format msgid "extra data after last expected column" msgstr "推定最終列の後に余計なデータがありました" -#: commands/copy.c:3742 +#: commands/copyfromparse.c:902 #, c-format msgid "missing data for column \"%s\"" msgstr "列\"%s\"のデータがありません" -#: commands/copy.c:3825 +#: commands/copyfromparse.c:980 #, c-format msgid "received copy data after EOF marker" msgstr "EOF マーカーの後ろでコピーデータを受信しました" -#: commands/copy.c:3832 +#: commands/copyfromparse.c:987 #, c-format msgid "row field count is %d, expected %d" msgstr "行のフィールド数は%d、その期待値は%dです" -#: commands/copy.c:4149 commands/copy.c:4166 +#: commands/copyfromparse.c:1280 commands/copyfromparse.c:1297 #, c-format msgid "literal carriage return found in data" msgstr "データの中に復帰記号そのものがありました" -#: commands/copy.c:4150 commands/copy.c:4167 +#: commands/copyfromparse.c:1281 commands/copyfromparse.c:1298 #, c-format msgid "unquoted carriage return found in data" msgstr "データの中に引用符のない復帰記号がありました" -#: commands/copy.c:4152 commands/copy.c:4169 +#: commands/copyfromparse.c:1283 commands/copyfromparse.c:1300 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "復帰記号は\"\\r\"と表現してください" -#: commands/copy.c:4153 commands/copy.c:4170 +#: commands/copyfromparse.c:1284 commands/copyfromparse.c:1301 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "復帰記号を表現するにはCSVフィールドを引用符で括ってください" -#: commands/copy.c:4182 +#: commands/copyfromparse.c:1313 #, c-format msgid "literal newline found in data" msgstr "データの中に改行記号そのものがありました" -#: commands/copy.c:4183 +#: commands/copyfromparse.c:1314 #, c-format msgid "unquoted newline found in data" msgstr "データの中に引用符のない改行記号がありました" -#: commands/copy.c:4185 +#: commands/copyfromparse.c:1316 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "改行記号は\"\\n\"と表現してください" -#: commands/copy.c:4186 +#: commands/copyfromparse.c:1317 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "改行記号を表現するにはCSVフィールドを引用符で括ってください" -#: commands/copy.c:4232 commands/copy.c:4268 +#: commands/copyfromparse.c:1363 commands/copyfromparse.c:1399 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "コピー終端記号がこれまでの改行方式と一致しません" -#: commands/copy.c:4241 commands/copy.c:4257 +#: commands/copyfromparse.c:1372 commands/copyfromparse.c:1388 #, c-format msgid "end-of-copy marker corrupt" msgstr "コピー終端記号が破損しています" -#: commands/copy.c:4704 +#: commands/copyfromparse.c:1812 #, c-format msgid "unterminated CSV quoted field" msgstr "CSV引用符が閉じていません" -#: commands/copy.c:4780 commands/copy.c:4799 +#: commands/copyfromparse.c:1888 commands/copyfromparse.c:1907 #, c-format msgid "unexpected EOF in COPY data" msgstr "COPYデータの中に想定外のEOFがあります" -#: commands/copy.c:4789 +#: commands/copyfromparse.c:1897 #, c-format msgid "invalid field size" msgstr "フィールドサイズが不正です" -#: commands/copy.c:4812 +#: commands/copyfromparse.c:1920 #, c-format msgid "incorrect binary data format" msgstr "バイナリデータ書式が不正です" -#: commands/copy.c:5120 +#: commands/copyto.c:234 #, c-format -msgid "column \"%s\" is a generated column" -msgstr "列\"%s\"は生成カラムです" +msgid "could not write to COPY program: %m" +msgstr "COPYプログラムに書き出せませんでした: %m" -#: commands/copy.c:5122 +#: commands/copyto.c:239 #, c-format -msgid "Generated columns cannot be used in COPY." -msgstr "生成カラムはCOPYでは使えません。" +msgid "could not write to COPY file: %m" +msgstr "COPYファイルに書き出せませんでした: %m" -#: commands/copy.c:5137 commands/indexcmds.c:1700 commands/statscmds.c:217 commands/tablecmds.c:2163 commands/tablecmds.c:2740 commands/tablecmds.c:3127 parser/parse_relation.c:3507 parser/parse_relation.c:3527 utils/adt/tsvector_op.c:2668 +#: commands/copyto.c:369 #, c-format -msgid "column \"%s\" does not exist" -msgstr "列\"%s\"は存在しません" +msgid "cannot copy from view \"%s\"" +msgstr "ビュー\"%s\"からのコピーはできません" -#: commands/copy.c:5144 commands/tablecmds.c:2189 commands/trigger.c:885 parser/parse_target.c:1052 parser/parse_target.c:1063 +#: commands/copyto.c:371 commands/copyto.c:377 commands/copyto.c:383 commands/copyto.c:394 #, c-format -msgid "column \"%s\" specified more than once" -msgstr "列\"%s\"が複数指定されました" +msgid "Try the COPY (SELECT ...) TO variant." +msgstr "COPY (SELECT ...) TO構文を試してください" + +#: commands/copyto.c:375 +#, c-format +msgid "cannot copy from materialized view \"%s\"" +msgstr "実体化ビュー\"%s\"からのコピーはできません" + +#: commands/copyto.c:381 +#, c-format +msgid "cannot copy from foreign table \"%s\"" +msgstr "外部テーブル \"%s\" からのコピーはできません" + +#: commands/copyto.c:387 +#, c-format +msgid "cannot copy from sequence \"%s\"" +msgstr "シーケンス\"%s\"からのコピーはできません" + +#: commands/copyto.c:392 +#, c-format +msgid "cannot copy from partitioned table \"%s\"" +msgstr "パーティション親テーブル\"%s\"からのコピーはできません" + +#: commands/copyto.c:398 +#, c-format +msgid "cannot copy from non-table relation \"%s\"" +msgstr "テーブル以外のリレーション\"%s\"からのコピーはできません" + +#: commands/copyto.c:450 +#, c-format +msgid "DO INSTEAD NOTHING rules are not supported for COPY" +msgstr "DO INSTEAD NOTHING ルールは COPY ではサポートされていません" + +#: commands/copyto.c:464 +#, c-format +msgid "conditional DO INSTEAD rules are not supported for COPY" +msgstr "条件付き DO INSTEAD ルールは COPY ではサポートされていません" + +#: commands/copyto.c:468 +#, c-format +msgid "DO ALSO rules are not supported for the COPY" +msgstr "DO ALSO ルールは COPY ではサポートされていません" + +#: commands/copyto.c:473 +#, c-format +msgid "multi-statement DO INSTEAD rules are not supported for COPY" +msgstr "マルチステートメントの DO INSTEAD ルールは COPY ではサポートされていません" + +#: commands/copyto.c:483 +#, c-format +msgid "COPY (SELECT INTO) is not supported" +msgstr "COPY (SELECT INTO)はサポートされていません" + +#: commands/copyto.c:500 +#, c-format +msgid "COPY query must have a RETURNING clause" +msgstr "COPY文中の問い合わせではRETURNING句が必須です" + +#: commands/copyto.c:529 +#, c-format +msgid "relation referenced by COPY statement has changed" +msgstr "COPY文で参照されているリレーションが変更されました" + +#: commands/copyto.c:588 +#, c-format +msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" +msgstr "FORCE_QUOTE指定された列\"%s\"はCOPYで参照されません" + +#: commands/copyto.c:696 +#, c-format +msgid "relative path not allowed for COPY to file" +msgstr "ファイルへのCOPYでは相対パスは指定できません" + +#: commands/copyto.c:715 +#, c-format +msgid "could not open file \"%s\" for writing: %m" +msgstr "ファイル\"%s\"を書き込み用にオープンできませんでした: %m" + +#: commands/copyto.c:718 +#, c-format +msgid "COPY TO instructs the PostgreSQL server process to write a file. You may want a client-side facility such as psql's \\copy." +msgstr "COPY TOによってPostgreSQLサーバプロセスはファイルの書き込みを行います。psqlの \\copy のようなクライアント側の仕組みが必要かもしれません" -#: commands/createas.c:215 commands/createas.c:497 +#: commands/createas.c:215 commands/createas.c:511 #, c-format msgid "too many column names were specified" msgstr "指定された列別名が多すぎます" -#: commands/createas.c:539 +#: commands/createas.c:534 #, c-format msgid "policies not yet implemented for this command" msgstr "このコマンドにはポリシは実装されていません" -#: commands/dbcommands.c:246 +#: commands/dbcommands.c:504 commands/tablespace.c:164 commands/tablespace.c:181 commands/tablespace.c:192 commands/tablespace.c:200 commands/tablespace.c:635 commands/tablespace.c:680 replication/basebackup_server.c:100 replication/slot.c:1566 storage/file/copydir.c:47 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" + +#: commands/dbcommands.c:816 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATIONはもはやサポートされません" -#: commands/dbcommands.c:247 +#: commands/dbcommands.c:817 #, c-format msgid "Consider using tablespaces instead." msgstr "代わりにテーブル空間の使用を検討してください" -#: commands/dbcommands.c:261 +#: commands/dbcommands.c:842 #, c-format -msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." -msgstr "" -"LOCALE は LC_COLLATE または LC_CTYPE \n" -"と同時に指定することはできません" +msgid "OIDs less than %u are reserved for system objects" +msgstr "%uより小さいOIDはシステムオブジェクトのために予約されています" -#: commands/dbcommands.c:279 utils/adt/ascii.c:145 +#: commands/dbcommands.c:873 utils/adt/ascii.c:145 #, c-format msgid "%d is not a valid encoding code" msgstr "%dは有効な符号化方式コードではありません" -#: commands/dbcommands.c:290 utils/adt/ascii.c:127 +#: commands/dbcommands.c:884 utils/adt/ascii.c:127 #, c-format msgid "%s is not a valid encoding name" msgstr "%sは有効な符号化方式名ではありません" -#: commands/dbcommands.c:314 commands/dbcommands.c:1569 commands/user.c:275 commands/user.c:691 +#: commands/dbcommands.c:911 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "認識できない照合順序プロバイダ: %s" + +#: commands/dbcommands.c:917 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "ICUロケールはロケールプロバイダがICUでなければ指定できません" + +#: commands/dbcommands.c:933 commands/dbcommands.c:2266 commands/user.c:237 commands/user.c:611 #, c-format msgid "invalid connection limit: %d" msgstr "不正な接続数制限: %d" -#: commands/dbcommands.c:333 +#: commands/dbcommands.c:954 #, c-format msgid "permission denied to create database" msgstr "データベースを作成する権限がありません" -#: commands/dbcommands.c:356 +#: commands/dbcommands.c:978 #, c-format msgid "template database \"%s\" does not exist" msgstr "テンプレートデータベース\"%s\"は存在しません" -#: commands/dbcommands.c:368 +#: commands/dbcommands.c:990 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "データベース\"%s\"をコピーする権限がありません" -#: commands/dbcommands.c:384 +#: commands/dbcommands.c:1007 +#, c-format +msgid "invalid create database strategy %s" +msgstr "データベース作成の方法%sは不正です" + +#: commands/dbcommands.c:1008 +#, c-format +msgid "Valid strategies are \"wal_log\", and \"file_copy\"." +msgstr "有効な方法はは\"wal_log\"と\"file_copy\"です。" + +#: commands/dbcommands.c:1027 #, c-format msgid "invalid server encoding %d" msgstr "サーバの符号化方式%dは不正です" -#: commands/dbcommands.c:390 commands/dbcommands.c:395 +#: commands/dbcommands.c:1033 commands/dbcommands.c:1038 #, c-format msgid "invalid locale name: \"%s\"" msgstr "ロケール名\"%s\"は不正です" -#: commands/dbcommands.c:415 +#: commands/dbcommands.c:1052 +#, c-format +msgid "ICU locale must be specified" +msgstr "ICUロケールを指定しなければなりません" + +#: commands/dbcommands.c:1073 #, c-format msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" msgstr "新しい符号化方式(%s)はテンプレートデータベースの符号化方式(%s)と互換性がありません" -#: commands/dbcommands.c:418 +#: commands/dbcommands.c:1076 #, c-format msgid "Use the same encoding as in the template database, or use template0 as template." msgstr "テンプレートデータベースの符号化方式と同じものを使うか、もしくは template0 をテンプレートとして使用してください" -#: commands/dbcommands.c:423 +#: commands/dbcommands.c:1081 #, c-format msgid "new collation (%s) is incompatible with the collation of the template database (%s)" msgstr "新しい照合順序(%s)はテンプレートデータベースの照合順序(%s)と互換性がありません" -#: commands/dbcommands.c:425 +#: commands/dbcommands.c:1083 #, c-format msgid "Use the same collation as in the template database, or use template0 as template." msgstr "テンプレートデータベースの照合順序と同じものを使うか、もしくは template0 をテンプレートとして使用してください" -#: commands/dbcommands.c:430 +#: commands/dbcommands.c:1088 #, c-format msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" msgstr "新しいLC_CTYPE(%s)はテンプレートデータベース(%s)のLC_CTYPEと互換性がありません" -#: commands/dbcommands.c:432 +#: commands/dbcommands.c:1090 #, c-format msgid "Use the same LC_CTYPE as in the template database, or use template0 as template." msgstr "テンプレートデータベースのLC_CTYPEと同じものを使うか、もしくはtemplate0をテンプレートとして使用してください" -#: commands/dbcommands.c:454 commands/dbcommands.c:1196 +#: commands/dbcommands.c:1095 +#, c-format +msgid "new locale provider (%s) does not match locale provider of the template database (%s)" +msgstr "新しいロケール・プロバイダ(%s)はテンプレートデータベースのロケール・プロバイダ(%s)と一致しません" + +#: commands/dbcommands.c:1097 +#, c-format +msgid "Use the same locale provider as in the template database, or use template0 as template." +msgstr "テンプレートデータベースと同じロケールプロバイダを使うか、もしくは template0 をテンプレートとして使用してください" + +#: commands/dbcommands.c:1106 +#, c-format +msgid "new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)" +msgstr "新しいICUロケール(%s)はテンプレートデータベースのICUロケール(%s)と互換性がありません" + +#: commands/dbcommands.c:1108 +#, c-format +msgid "Use the same ICU locale as in the template database, or use template0 as template." +msgstr "テンプレートデータベースと同じICUロケールを使うか、もしくは template0 をテンプレートとして使用してください。" + +#: commands/dbcommands.c:1131 +#, c-format +msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" +msgstr "テンプレートデータベース\"%s\"には照合順序のバージョンが設定されていますが、実際の照合順序バージョンが特定できません" + +#: commands/dbcommands.c:1136 +#, c-format +msgid "template database \"%s\" has a collation version mismatch" +msgstr "テンプレートデータベース\"%s\"では照合順序バージョンの不一致が起きています" + +#: commands/dbcommands.c:1138 +#, c-format +msgid "The template database was created using collation version %s, but the operating system provides version %s." +msgstr "データベース中の照合順序はバージョン%sで作成されていますが、オペレーティングシステムはバージョン%sを提供しています。" + +#: commands/dbcommands.c:1141 +#, c-format +msgid "Rebuild all objects in the template database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." +msgstr "デフォルトの照合順序を使用しているテンプレート・データベースの全てのオブジェクトを再構築して、ALTER DATABASE %s REFRESH COLLATION VERSIONを実行するか、正しいバージョンのライブラリを用いてPostgreSQLをビルドしてください。" + +#: commands/dbcommands.c:1177 commands/dbcommands.c:1895 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "デフォルトのテーブル空間としてpg_globalを使用できません" -#: commands/dbcommands.c:480 +#: commands/dbcommands.c:1203 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "新しいデフォルトのテーブル空間\"%s\"を割り当てられません" -#: commands/dbcommands.c:482 +#: commands/dbcommands.c:1205 #, c-format msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." msgstr "データベース\"%s\"のいくつかテーブルはすでにこのテーブル空間にあるため、競合しています。" -#: commands/dbcommands.c:512 commands/dbcommands.c:1066 +#: commands/dbcommands.c:1235 commands/dbcommands.c:1765 #, c-format msgid "database \"%s\" already exists" msgstr "データベース\"%s\"はすでに存在します" -#: commands/dbcommands.c:526 +#: commands/dbcommands.c:1249 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "元となるデータベース\"%s\"は他のユーザによってアクセスされています" -#: commands/dbcommands.c:769 commands/dbcommands.c:784 +#: commands/dbcommands.c:1271 +#, c-format +msgid "database OID %u is already in use by database \"%s\"" +msgstr "データベースOID %uはすでにデータベース\"%s\"で使用されています" + +#: commands/dbcommands.c:1277 +#, c-format +msgid "data directory with the specified OID %u already exists" +msgstr "指定されたOID %uのデータディレクトリはすでに存在します" + +#: commands/dbcommands.c:1448 commands/dbcommands.c:1463 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "符号化方式\"%s\"がロケール\"%s\"に合いません" -#: commands/dbcommands.c:772 +#: commands/dbcommands.c:1451 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "選択されたLC_CTYPEを設定するには、符号化方式\"%s\"である必要があります。" -#: commands/dbcommands.c:787 +#: commands/dbcommands.c:1466 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "選択されたLC_COLLATEを設定するには、符号化方式\"%s\"である必要があります。" -#: commands/dbcommands.c:848 +#: commands/dbcommands.c:1546 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "データベース\"%s\"は存在しません、スキップします" -#: commands/dbcommands.c:872 +#: commands/dbcommands.c:1570 #, c-format msgid "cannot drop a template database" msgstr "テンプレートデータベースを削除できません" -#: commands/dbcommands.c:878 +#: commands/dbcommands.c:1576 #, c-format msgid "cannot drop the currently open database" msgstr "現在オープンしているデータベースを削除できません" -#: commands/dbcommands.c:891 +#: commands/dbcommands.c:1589 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "データベース\"%s\"は有効な論理レプリケーションスロットで使用中です" -#: commands/dbcommands.c:893 +#: commands/dbcommands.c:1591 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." msgstr[0] "%d 個のアクティブなスロットがあります。" -msgstr[1] "%d 個のアクティブなスロットがあります。" -#: commands/dbcommands.c:907 +#: commands/dbcommands.c:1605 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "データベース\"%s\"は論理レプリケーションのサブスクリプションで使用中です" -#: commands/dbcommands.c:909 +#: commands/dbcommands.c:1607 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." msgstr[0] "%d個のサブスクリプションがあります" -msgstr[1] "%d個のサブスクリプションがあります" -#: commands/dbcommands.c:930 commands/dbcommands.c:1088 commands/dbcommands.c:1218 +#: commands/dbcommands.c:1628 commands/dbcommands.c:1787 commands/dbcommands.c:1917 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "データベース\"%s\"は他のユーザからアクセスされています" -#: commands/dbcommands.c:1048 +#: commands/dbcommands.c:1747 #, c-format msgid "permission denied to rename database" msgstr "データベースの名前を変更する権限がありません" -#: commands/dbcommands.c:1077 +#: commands/dbcommands.c:1776 #, c-format msgid "current database cannot be renamed" msgstr "現在のデータベースの名前を変更できません" -#: commands/dbcommands.c:1174 +#: commands/dbcommands.c:1873 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "現在オープン中のデータベースのテーブルスペースは変更できません" -#: commands/dbcommands.c:1277 +#: commands/dbcommands.c:1979 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "データベース\"%s\"のリレーションの中に、テーブルスペース\"%s\"にすでに存在するものがあります" -#: commands/dbcommands.c:1279 +#: commands/dbcommands.c:1981 #, c-format msgid "You must move them back to the database's default tablespace before using this command." msgstr "このコマンドを使う前に、データベースのデフォルトのテーブルスペースに戻す必要があります。" -#: commands/dbcommands.c:1404 commands/dbcommands.c:1980 commands/dbcommands.c:2203 commands/dbcommands.c:2261 commands/tablespace.c:619 +#: commands/dbcommands.c:2108 commands/dbcommands.c:2819 commands/dbcommands.c:3043 commands/dbcommands.c:3123 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "元のデータベースのディレクトリ\"%s\"に不要なファイルが残っているかもしれません" -#: commands/dbcommands.c:1460 +#: commands/dbcommands.c:2169 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "DROP DATABASEのオプション\"%s\"が認識できません" -#: commands/dbcommands.c:1550 +#: commands/dbcommands.c:2247 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "オプション\"%s\"は他のオプションと一緒に指定はできません" -#: commands/dbcommands.c:1606 +#: commands/dbcommands.c:2303 #, c-format msgid "cannot disallow connections for current database" msgstr "現在のデータベースへの接続は禁止できません" -#: commands/dbcommands.c:1742 +#: commands/dbcommands.c:2522 #, c-format msgid "permission denied to change owner of database" msgstr "データベースの所有者を変更する権限がありません" -#: commands/dbcommands.c:2086 +#: commands/dbcommands.c:2925 #, c-format msgid "There are %d other session(s) and %d prepared transaction(s) using the database." msgstr "他にこのデータベースを使っている %d 個のセッションと %d 個の準備済みトランザクションがあります。" -#: commands/dbcommands.c:2089 +#: commands/dbcommands.c:2928 #, c-format msgid "There is %d other session using the database." msgid_plural "There are %d other sessions using the database." msgstr[0] "他にこのデータベースを使っている %d 個のセッションがあります。" -msgstr[1] "他にこのデータベースを使っている %d 個のセッションがあります。" -#: commands/dbcommands.c:2094 storage/ipc/procarray.c:3632 +#: commands/dbcommands.c:2933 storage/ipc/procarray.c:3832 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." msgstr[0] "このデータベースを使用する準備されたトランザクションが%d存在します。" -msgstr[1] "このデータベースを使用する準備されたトランザクションが%d存在します。" -#: commands/define.c:54 commands/define.c:228 commands/define.c:260 commands/define.c:288 commands/define.c:334 +#: commands/define.c:54 commands/define.c:225 commands/define.c:257 commands/define.c:285 commands/define.c:331 #, c-format msgid "%s requires a parameter" msgstr "%sはパラメータが必要です" -#: commands/define.c:90 commands/define.c:101 commands/define.c:195 commands/define.c:213 +#: commands/define.c:87 commands/define.c:98 commands/define.c:192 commands/define.c:210 #, c-format msgid "%s requires a numeric value" msgstr "%sは数値が必要です" -#: commands/define.c:157 +#: commands/define.c:154 #, c-format msgid "%s requires a Boolean value" msgstr "パラメータ\"%s\"はboolean値が必要です" -#: commands/define.c:171 commands/define.c:180 commands/define.c:297 +#: commands/define.c:168 commands/define.c:177 commands/define.c:294 #, c-format msgid "%s requires an integer value" msgstr "%sは整数値が必要です" -#: commands/define.c:242 +#: commands/define.c:239 #, c-format msgid "argument of %s must be a name" msgstr "%sの引数は名前でなければなりません" -#: commands/define.c:272 +#: commands/define.c:269 #, c-format msgid "argument of %s must be a type name" msgstr "%sの引数は型名でなければなりません" -#: commands/define.c:318 +#: commands/define.c:315 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "%sの引数が不正です: \"%s\"" -#: commands/dropcmds.c:100 commands/functioncmds.c:1274 utils/adt/ruleutils.c:2633 +#: commands/dropcmds.c:100 commands/functioncmds.c:1394 utils/adt/ruleutils.c:2910 #, c-format msgid "\"%s\" is an aggregate function" msgstr "\"%s\"は集約関数です" @@ -6387,17 +6816,17 @@ msgstr "\"%s\"は集約関数です" msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "集約関数を削除するにはDROP AGGREGATEを使用してください" -#: commands/dropcmds.c:158 commands/sequence.c:447 commands/tablecmds.c:3211 commands/tablecmds.c:3369 commands/tablecmds.c:3414 commands/tablecmds.c:14894 tcop/utility.c:1276 +#: commands/dropcmds.c:158 commands/sequence.c:467 commands/tablecmds.c:3603 commands/tablecmds.c:3761 commands/tablecmds.c:3813 commands/tablecmds.c:16376 tcop/utility.c:1332 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "リレーション\"%s\"は存在しません、スキップします" -#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1197 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1276 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "スキーマ\"%s\"は存在しません、スキップします" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:259 +#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:275 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "型\"%s\"は存在しません、スキップします" @@ -6417,7 +6846,7 @@ msgstr "照合順序\"%s\"は存在しません、スキップします" msgid "conversion \"%s\" does not exist, skipping" msgstr "変換\"%sは存在しません、スキップします" -#: commands/dropcmds.c:293 commands/statscmds.c:479 +#: commands/dropcmds.c:293 commands/statscmds.c:650 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "統計情報オブジェクト\"%s\"は存在しません、スキップします" @@ -6512,7 +6941,7 @@ msgstr "リレーション\"%2$s\"のルール\"%1$s\"は存在しません、 msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "外部データラッパ\"%s\"は存在しません、スキップします" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1351 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1347 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "外部データラッパ\"%s\"は存在しません、スキップします" @@ -6588,42 +7017,37 @@ msgstr "イベントトリガの所有者はスーパユーザでなければな msgid "%s can only be called in a sql_drop event trigger function" msgstr "%sはsql_dropイベントトリガ関数内でのみ呼び出すことができます" -#: commands/event_trigger.c:1424 commands/event_trigger.c:1445 +#: commands/event_trigger.c:1400 commands/event_trigger.c:1421 #, c-format msgid "%s can only be called in a table_rewrite event trigger function" msgstr "%sはtable_rewriteイベントトリガ関数でのみ呼び出すことができます" -#: commands/event_trigger.c:1856 +#: commands/event_trigger.c:1834 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%sはイベントトリガ関数でのみ呼び出すことができます" -#: commands/explain.c:212 +#: commands/explain.c:218 #, c-format msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" msgstr "EXPLAIN オプション\"%s\"が認識できない値です: \"%s\"" -#: commands/explain.c:219 +#: commands/explain.c:225 #, c-format msgid "unrecognized EXPLAIN option \"%s\"" msgstr "EXPLAIN オプション\"%s\"が認識できません" -#: commands/explain.c:227 -#, c-format -msgid "EXPLAIN option BUFFERS requires ANALYZE" -msgstr "EXPLAIN オプションの BUFFERS には ANALYZE 指定が必要です" - -#: commands/explain.c:232 +#: commands/explain.c:233 #, c-format msgid "EXPLAIN option WAL requires ANALYZE" msgstr "EXPLAINのオプションWALにはANALYZE指定が必要です" -#: commands/explain.c:241 +#: commands/explain.c:242 #, c-format msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "EXPLAINオプションのTIMINGにはANALYZE指定が必要です" -#: commands/extension.c:173 commands/extension.c:3013 +#: commands/extension.c:173 commands/extension.c:2932 #, c-format msgid "extension \"%s\" does not exist" msgstr "機能拡張\"%s\"は存在しません" @@ -6678,192 +7102,207 @@ msgstr "バージョン名が\"-\"で始まったり終わったりしてはな msgid "Version names must not contain directory separator characters." msgstr "バージョン名にディレクトリの区切り文字が含まれていてはなりません" -#: commands/extension.c:498 +#: commands/extension.c:502 +#, c-format +msgid "extension \"%s\" is not available" +msgstr "機能拡張\"%s\" は利用できません" + +#: commands/extension.c:503 +#, c-format +msgid "Could not open extension control file \"%s\": %m." +msgstr "機能拡張の制御ファイル\"%s\"をオープンできませんでした: %m" + +#: commands/extension.c:505 +#, c-format +msgid "The extension must first be installed on the system where PostgreSQL is running." +msgstr "PostgreSQLが稼働しているシステムで、事前に機能拡張がインストールされている必要があります。" + +#: commands/extension.c:509 #, c-format msgid "could not open extension control file \"%s\": %m" msgstr "機能拡張の制御ファイル\"%s\"をオープンできませんでした: %m" -#: commands/extension.c:520 commands/extension.c:530 +#: commands/extension.c:531 commands/extension.c:541 #, c-format msgid "parameter \"%s\" cannot be set in a secondary extension control file" msgstr "セカンダリの機能拡張制御ファイルにパラメータ\"%s\"を設定できません" -#: commands/extension.c:552 commands/extension.c:560 commands/extension.c:568 utils/misc/guc.c:6767 +#: commands/extension.c:563 commands/extension.c:571 commands/extension.c:579 utils/misc/guc.c:7372 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "パラメータ\"%s\"にはbooleanを指定します" -#: commands/extension.c:577 +#: commands/extension.c:588 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\"は有効な符号化方式名ではありません" -#: commands/extension.c:591 +#: commands/extension.c:602 #, c-format msgid "parameter \"%s\" must be a list of extension names" msgstr "パラメータ\"%s\"は機能拡張名のリストでなければなりません" -#: commands/extension.c:598 +#: commands/extension.c:609 #, c-format msgid "unrecognized parameter \"%s\" in file \"%s\"" msgstr "ファイル\"%2$s\"中に認識できないパラメータ\"%1$s\"があります" -#: commands/extension.c:607 +#: commands/extension.c:618 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "\"relocatable\"が真の場合はパラメータ\"schema\"は指定できません" -#: commands/extension.c:785 +#: commands/extension.c:796 #, c-format msgid "transaction control statements are not allowed within an extension script" msgstr "トランザクション制御ステートメントを機能拡張スクリプトの中に書くことはできません" -#: commands/extension.c:861 +#: commands/extension.c:873 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "機能拡張\"%s\"を作成する権限がありません" -#: commands/extension.c:864 +#: commands/extension.c:876 #, c-format msgid "Must have CREATE privilege on current database to create this extension." msgstr "この機能拡張を生成するには現在のデータベースのCREATE権限が必要です。" -#: commands/extension.c:865 +#: commands/extension.c:877 #, c-format msgid "Must be superuser to create this extension." msgstr "この機能拡張を生成するにはスーパユーザである必要があります。" -#: commands/extension.c:869 +#: commands/extension.c:881 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "機能拡張\"%s\"を更新する権限がありません" -#: commands/extension.c:872 +#: commands/extension.c:884 #, c-format msgid "Must have CREATE privilege on current database to update this extension." msgstr "この機能拡張を更新するには現在のデータベースのCREATE権限が必要です。" -#: commands/extension.c:873 +#: commands/extension.c:885 #, c-format msgid "Must be superuser to update this extension." msgstr "この機能拡張を更新するにはスーパユーザである必要があります。" -#: commands/extension.c:1200 +#: commands/extension.c:1212 #, c-format msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" msgstr "機能拡張\"%s\"について、バージョン\"%s\"からバージョン\"%s\"へのアップデートパスがありません" -#: commands/extension.c:1408 commands/extension.c:3074 +#: commands/extension.c:1420 commands/extension.c:2990 #, c-format msgid "version to install must be specified" msgstr "インストールするバージョンを指定してください" -#: commands/extension.c:1445 +#: commands/extension.c:1457 #, c-format msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" msgstr "機能拡張\"%s\"にはバージョン\"%s\"のインストールスクリプトもアップデートパスもありません" -#: commands/extension.c:1479 +#: commands/extension.c:1491 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "機能拡張\"%s\"はスキーマ\"%s\"内にインストールされていなければなりません" -#: commands/extension.c:1639 +#: commands/extension.c:1651 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "機能拡張\"%s\"と\"%s\"の間に循環依存関係が検出されました" -#: commands/extension.c:1644 +#: commands/extension.c:1656 #, c-format msgid "installing required extension \"%s\"" msgstr "必要な機能拡張をインストールします:\"%s\"" -#: commands/extension.c:1667 +#: commands/extension.c:1679 #, c-format msgid "required extension \"%s\" is not installed" msgstr "要求された機能拡張\"%s\"はインストールされていません" -#: commands/extension.c:1670 +#: commands/extension.c:1682 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "必要な機能拡張を一緒にインストールするには CREATE EXTENSION ... CASCADE を使ってください。" -#: commands/extension.c:1705 +#: commands/extension.c:1717 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "機能拡張\"%s\"はすでに存在します、スキップします" -#: commands/extension.c:1712 +#: commands/extension.c:1724 #, c-format msgid "extension \"%s\" already exists" msgstr "機能拡張\"%s\"はすでに存在します" -#: commands/extension.c:1723 +#: commands/extension.c:1735 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "入れ子の CREATE EXTENSION はサポートされません" -#: commands/extension.c:1896 +#: commands/extension.c:1899 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "変更されているため拡張\"%s\"を削除できません" -#: commands/extension.c:2457 +#: commands/extension.c:2376 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "%s はCREATE EXTENSIONにより実行されるSQLスクリプトからのみ呼び出すことができます" -#: commands/extension.c:2469 +#: commands/extension.c:2388 #, c-format msgid "OID %u does not refer to a table" msgstr "OID %u がテーブルを参照していません" -#: commands/extension.c:2474 +#: commands/extension.c:2393 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "テーブル\"%s\"は生成されようとしている機能拡張のメンバではありません" -#: commands/extension.c:2828 +#: commands/extension.c:2747 #, c-format msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" msgstr "機能拡張がそのスキーマを含んでいるため、機能拡張\"%s\"をスキーマ\"%s\"に移動できません" -#: commands/extension.c:2869 commands/extension.c:2932 +#: commands/extension.c:2788 commands/extension.c:2851 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "機能拡張\"%s\"は SET SCHEMA をサポートしていません" -#: commands/extension.c:2934 +#: commands/extension.c:2853 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "機能拡張のスキーマ\"%2$s\"に%1$sが見つかりません" -#: commands/extension.c:2993 +#: commands/extension.c:2912 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "入れ子になった ALTER EXTENSION はサポートされていません" -#: commands/extension.c:3085 +#: commands/extension.c:3001 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "機能拡張 \"%2$s\"のバージョン\"%1$s\"はすでにインストールされています" -#: commands/extension.c:3297 +#: commands/extension.c:3213 #, c-format msgid "cannot add an object of this type to an extension" msgstr "この型のオブジェクトは機能拡張に追加できません" -#: commands/extension.c:3355 +#: commands/extension.c:3279 #, c-format msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "スキーマ\"%s\"を拡張\"%s\"に追加できません。そのスキーマにその拡張が含まれているためです" -#: commands/extension.c:3383 +#: commands/extension.c:3307 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s は機能拡張\"%s\"のメンバではありません" -#: commands/extension.c:3449 +#: commands/extension.c:3373 #, c-format msgid "file \"%s\" is too large" msgstr "ファイル\"%s\"は大きすぎます" @@ -6893,734 +7332,763 @@ msgstr "外部データラッパーの所有者を変更するにはスーパユ msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "外部データラッパーの所有者はスーパユーザでなければなりません" -#: commands/foreigncmds.c:291 commands/foreigncmds.c:711 foreign/foreign.c:701 +#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:669 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "外部データラッパー\"%s\"は存在しません" -#: commands/foreigncmds.c:584 +#: commands/foreigncmds.c:580 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" msgstr "外部データラッパー\"%s\"を作成する権限がありません" -#: commands/foreigncmds.c:586 +#: commands/foreigncmds.c:582 #, c-format msgid "Must be superuser to create a foreign-data wrapper." msgstr "外部データラッパを作成するにはスーパユーザである必要があります。" -#: commands/foreigncmds.c:701 +#: commands/foreigncmds.c:697 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" msgstr "外部データラッパー\"%s\"を変更する権限がありません" -#: commands/foreigncmds.c:703 +#: commands/foreigncmds.c:699 #, c-format msgid "Must be superuser to alter a foreign-data wrapper." msgstr "外部データラッパーを更新するにはスーパユーザである必要があります。" -#: commands/foreigncmds.c:734 +#: commands/foreigncmds.c:730 #, c-format msgid "changing the foreign-data wrapper handler can change behavior of existing foreign tables" msgstr "外部データラッパーのハンドラーを変更すると、既存の外部テーブルの振る舞いが変わることがあります" -#: commands/foreigncmds.c:749 +#: commands/foreigncmds.c:745 #, c-format msgid "changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid" msgstr "外部データラッパーのバリデータ(検証用関数)を変更すると、それに依存するオプションが不正になる場合があります" -#: commands/foreigncmds.c:871 +#: commands/foreigncmds.c:867 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "サーバ\"%s\"はすでに存在します、スキップします" -#: commands/foreigncmds.c:1135 +#: commands/foreigncmds.c:1131 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "\"%s\"のユーザマッピングはサーバ\"%s\"に対してすでに存在します、スキップします" -#: commands/foreigncmds.c:1145 +#: commands/foreigncmds.c:1141 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "\"%s\"のユーザマッピングはサーバ\"%s\"に対してすでに存在します" -#: commands/foreigncmds.c:1245 commands/foreigncmds.c:1365 +#: commands/foreigncmds.c:1241 commands/foreigncmds.c:1361 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "\"%s\"のユーザマッピングはサーバ\"%s\"に対しては存在しません" -#: commands/foreigncmds.c:1370 +#: commands/foreigncmds.c:1366 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "\"%s\"のユーザマッピングはサーバ\"%s\"に対しては存在しません、スキップします" -#: commands/foreigncmds.c:1498 foreign/foreign.c:389 +#: commands/foreigncmds.c:1494 foreign/foreign.c:390 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "外部データラッパー\"%s\"にはハンドラがありません" -#: commands/foreigncmds.c:1504 +#: commands/foreigncmds.c:1500 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "外部データラッパー\"%s\"は IMPORT FOREIGN SCHEMA をサポートしていません" -#: commands/foreigncmds.c:1607 +#: commands/foreigncmds.c:1602 #, c-format msgid "importing foreign table \"%s\"" msgstr "外部テーブル\"%s\"をインポートします" -#: commands/functioncmds.c:104 +#: commands/functioncmds.c:109 #, c-format msgid "SQL function cannot return shell type %s" msgstr "SQL関数はシェル型%sを返却することができません" -#: commands/functioncmds.c:109 +#: commands/functioncmds.c:114 #, c-format msgid "return type %s is only a shell" msgstr "戻り値型%sは単なるシェル型です" -#: commands/functioncmds.c:139 parser/parse_type.c:354 +#: commands/functioncmds.c:144 parser/parse_type.c:354 #, c-format msgid "type modifier cannot be specified for shell type \"%s\"" msgstr "シェル型\"%s\"に型修正子を指定できません" -#: commands/functioncmds.c:145 +#: commands/functioncmds.c:150 #, c-format msgid "type \"%s\" is not yet defined" msgstr "型\"%s\"は未定義です" -#: commands/functioncmds.c:146 +#: commands/functioncmds.c:151 #, c-format msgid "Creating a shell type definition." msgstr "シェル型の定義を作成します" -#: commands/functioncmds.c:238 +#: commands/functioncmds.c:250 #, c-format msgid "SQL function cannot accept shell type %s" msgstr "SQL関数はシェル型\"%s\"を受け付けられません" -#: commands/functioncmds.c:244 +#: commands/functioncmds.c:256 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "集約はシェル型\"%s\"を受け付けられません" -#: commands/functioncmds.c:249 +#: commands/functioncmds.c:261 #, c-format msgid "argument type %s is only a shell" msgstr "引数型%sは単なるシェルです" -#: commands/functioncmds.c:259 +#: commands/functioncmds.c:271 #, c-format msgid "type %s does not exist" msgstr "型%sは存在しません" -#: commands/functioncmds.c:273 +#: commands/functioncmds.c:285 #, c-format msgid "aggregates cannot accept set arguments" msgstr "集約は集合引数を受け付けられません" -#: commands/functioncmds.c:277 +#: commands/functioncmds.c:289 #, c-format msgid "procedures cannot accept set arguments" msgstr "プロシージャは集合引数を受け付けません" -#: commands/functioncmds.c:281 +#: commands/functioncmds.c:293 #, c-format msgid "functions cannot accept set arguments" msgstr "関数は集合を引数として受け付けられません" -#: commands/functioncmds.c:289 -#, c-format -msgid "procedures cannot have OUT arguments" -msgstr "プロシージャは出力引数を持てません" - -#: commands/functioncmds.c:290 -#, c-format -msgid "INOUT arguments are permitted." -msgstr "INOUT 引数は指定可能です" - -#: commands/functioncmds.c:300 +#: commands/functioncmds.c:303 #, c-format msgid "VARIADIC parameter must be the last input parameter" msgstr "VARIADIC パラメータは最後の入力パラメータでなければなりません" -#: commands/functioncmds.c:331 +#: commands/functioncmds.c:323 +#, c-format +msgid "VARIADIC parameter must be the last parameter" +msgstr "VARIADIC パラメータは最後のパラメータでなければなりません" + +#: commands/functioncmds.c:348 #, c-format msgid "VARIADIC parameter must be an array" msgstr "VARIADIC パラメータは配列でなければなりません" -#: commands/functioncmds.c:371 +#: commands/functioncmds.c:393 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "パラメータ\"%s\"が複数指定されました" -#: commands/functioncmds.c:386 +#: commands/functioncmds.c:411 #, c-format msgid "only input parameters can have default values" msgstr "入力パラメータのみがデフォルト値を持てます" -#: commands/functioncmds.c:401 +#: commands/functioncmds.c:426 #, c-format msgid "cannot use table references in parameter default value" msgstr "パラメータのデフォルト値としてテーブル参照を使用できません" -#: commands/functioncmds.c:425 +#: commands/functioncmds.c:450 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "デフォルト値を持つパラメータの後にある入力パラメータは、必ずデフォルト値を持たなければなりません" -#: commands/functioncmds.c:577 commands/functioncmds.c:768 +#: commands/functioncmds.c:460 +#, c-format +msgid "procedure OUT parameters cannot appear after one with a default value" +msgstr "プロシージャの出力パラメータはデフォルト値を持つパラメータの後には置けません" + +#: commands/functioncmds.c:605 commands/functioncmds.c:784 #, c-format msgid "invalid attribute in procedure definition" msgstr "プロシージャ定義内の不正な属性" -#: commands/functioncmds.c:673 +#: commands/functioncmds.c:701 #, c-format msgid "support function %s must return type %s" msgstr "サポート関数%sは%s型を返さなければなりません" -#: commands/functioncmds.c:684 +#: commands/functioncmds.c:712 #, c-format msgid "must be superuser to specify a support function" msgstr "サポート関数を指定するにはスーパユーザである必要があります" -#: commands/functioncmds.c:800 +#: commands/functioncmds.c:833 commands/functioncmds.c:1439 +#, c-format +msgid "COST must be positive" +msgstr "COSTは正数でなければなりません" + +#: commands/functioncmds.c:841 commands/functioncmds.c:1447 +#, c-format +msgid "ROWS must be positive" +msgstr "ROWSは正数でなければなりません" + +#: commands/functioncmds.c:870 #, c-format msgid "no function body specified" msgstr "関数本体の指定がありません" -#: commands/functioncmds.c:810 +#: commands/functioncmds.c:875 #, c-format -msgid "no language specified" -msgstr "言語が指定されていません" +msgid "duplicate function body specified" +msgstr "関数本体の指定が重複しています" -#: commands/functioncmds.c:835 commands/functioncmds.c:1319 +#: commands/functioncmds.c:880 #, c-format -msgid "COST must be positive" -msgstr "COSTは正数でなければなりません" +msgid "inline SQL function body only valid for language SQL" +msgstr "インラインのSQL関数本体は言語指定がSQLの場合にのみ有効です" -#: commands/functioncmds.c:843 commands/functioncmds.c:1327 +#: commands/functioncmds.c:922 #, c-format -msgid "ROWS must be positive" -msgstr "ROWSは正数でなければなりません" +msgid "SQL function with unquoted function body cannot have polymorphic arguments" +msgstr "本体をクォートせずに定義するSQL関数は多態引き数を取れません" + +#: commands/functioncmds.c:948 commands/functioncmds.c:967 +#, c-format +msgid "%s is not yet supported in unquoted SQL function body" +msgstr "%sはクォートしない関数本体ではサポートされません" -#: commands/functioncmds.c:897 +#: commands/functioncmds.c:995 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "言語\"%s\"ではAS項目は1つだけ必要です" -#: commands/functioncmds.c:995 commands/functioncmds.c:1995 commands/proclang.c:237 +#: commands/functioncmds.c:1100 +#, c-format +msgid "no language specified" +msgstr "言語が指定されていません" + +#: commands/functioncmds.c:1108 commands/functioncmds.c:2109 commands/proclang.c:237 #, c-format msgid "language \"%s\" does not exist" msgstr "言語\"%s\"は存在しません" -#: commands/functioncmds.c:997 commands/functioncmds.c:1997 +#: commands/functioncmds.c:1110 commands/functioncmds.c:2111 #, c-format msgid "Use CREATE EXTENSION to load the language into the database." msgstr "言語をデータベースに読み込むためには CREATE EXTENSION を使用してください" -#: commands/functioncmds.c:1032 commands/functioncmds.c:1311 +#: commands/functioncmds.c:1145 commands/functioncmds.c:1431 #, c-format msgid "only superuser can define a leakproof function" msgstr "スーパユーザのみがリークプルーフ関数を定義することができます" -#: commands/functioncmds.c:1081 +#: commands/functioncmds.c:1196 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "OUTパラメータで定義されているため、関数の戻り値型は%sでなければなりません" -#: commands/functioncmds.c:1094 +#: commands/functioncmds.c:1209 #, c-format msgid "function result type must be specified" msgstr "関数の結果型を指定しなければなりません" -#: commands/functioncmds.c:1146 commands/functioncmds.c:1331 +#: commands/functioncmds.c:1263 commands/functioncmds.c:1451 #, c-format msgid "ROWS is not applicable when function does not return a set" msgstr "関数が集合を返す場合にROWSは適していません" -#: commands/functioncmds.c:1431 +#: commands/functioncmds.c:1552 #, c-format msgid "source data type %s is a pseudo-type" msgstr "変換元データ型%sは疑似型です" -#: commands/functioncmds.c:1437 +#: commands/functioncmds.c:1558 #, c-format msgid "target data type %s is a pseudo-type" msgstr "変換先データ型%sは疑似型です" -#: commands/functioncmds.c:1461 +#: commands/functioncmds.c:1582 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "元のデータ型がドメインであるため、キャストは無視されます" -#: commands/functioncmds.c:1466 +#: commands/functioncmds.c:1587 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "対象のデータ型がドメインであるため、キャストは無視されます" -#: commands/functioncmds.c:1491 +#: commands/functioncmds.c:1612 #, c-format msgid "cast function must take one to three arguments" msgstr "キャスト関数の引数は1つから3つまでです" -#: commands/functioncmds.c:1495 +#: commands/functioncmds.c:1616 #, c-format msgid "argument of cast function must match or be binary-coercible from source data type" msgstr "キャスト関数の引数は変換元データ型と同一であるか、変換元データ型からバイナリ変換可能である必要があります" -#: commands/functioncmds.c:1499 +#: commands/functioncmds.c:1620 #, c-format msgid "second argument of cast function must be type %s" msgstr "キャスト関数の第2引数は%s型でなければなりません" -#: commands/functioncmds.c:1504 +#: commands/functioncmds.c:1625 #, c-format msgid "third argument of cast function must be type %s" msgstr "キャスト関数の第3引数は%s型でなければなりません" -#: commands/functioncmds.c:1509 +#: commands/functioncmds.c:1630 #, c-format msgid "return data type of cast function must match or be binary-coercible to target data type" msgstr "キャスト関数の戻り値データ型は変換先データ型と一致するか、変換先データ型へバイナリ変換可能である必要があります" -#: commands/functioncmds.c:1520 +#: commands/functioncmds.c:1641 #, c-format msgid "cast function must not be volatile" msgstr "キャスト関数はvolatileではいけません" -#: commands/functioncmds.c:1525 +#: commands/functioncmds.c:1646 #, c-format msgid "cast function must be a normal function" msgstr "キャスト関数は通常の関数でなければなりません" -#: commands/functioncmds.c:1529 +#: commands/functioncmds.c:1650 #, c-format msgid "cast function must not return a set" msgstr "キャスト関数は集合を返してはいけません" -#: commands/functioncmds.c:1555 +#: commands/functioncmds.c:1676 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "WITHOUT FUNCTION指定のキャストを作成するにはスーパユーザである必要があります" -#: commands/functioncmds.c:1570 +#: commands/functioncmds.c:1691 #, c-format msgid "source and target data types are not physically compatible" msgstr "変換元と変換先のデータ型の間には物理的な互換性がありません" -#: commands/functioncmds.c:1585 +#: commands/functioncmds.c:1706 #, c-format msgid "composite data types are not binary-compatible" msgstr "複合データ型はバイナリ互換ではありません" -#: commands/functioncmds.c:1591 +#: commands/functioncmds.c:1712 #, c-format msgid "enum data types are not binary-compatible" msgstr "列挙データ型はバイナリ互換ではありません" -#: commands/functioncmds.c:1597 +#: commands/functioncmds.c:1718 #, c-format msgid "array data types are not binary-compatible" msgstr "配列データ型はバイナリ互換ではありません" -#: commands/functioncmds.c:1614 +#: commands/functioncmds.c:1735 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "ドメインデータ型はバイナリ互換としてマークされていてはなりません" -#: commands/functioncmds.c:1624 +#: commands/functioncmds.c:1745 #, c-format msgid "source data type and target data type are the same" msgstr "変換元と変換先のデータ型が同一です" -#: commands/functioncmds.c:1656 +#: commands/functioncmds.c:1778 #, c-format msgid "transform function must not be volatile" msgstr "変換関数はvolatileではいけません" -#: commands/functioncmds.c:1660 +#: commands/functioncmds.c:1782 #, c-format msgid "transform function must be a normal function" msgstr "変換関数は通常の関数でなければなりません" -#: commands/functioncmds.c:1664 +#: commands/functioncmds.c:1786 #, c-format msgid "transform function must not return a set" msgstr "変換関数は集合を返してはいけません" -#: commands/functioncmds.c:1668 +#: commands/functioncmds.c:1790 #, c-format msgid "transform function must take one argument" msgstr "変換関数は引数を1つとらなければなりません" -#: commands/functioncmds.c:1672 +#: commands/functioncmds.c:1794 #, c-format msgid "first argument of transform function must be type %s" msgstr "変換関数の第1引数は%s型でなければなりません" -#: commands/functioncmds.c:1710 +#: commands/functioncmds.c:1833 #, c-format msgid "data type %s is a pseudo-type" msgstr "データ型%sは擬似型です" -#: commands/functioncmds.c:1716 +#: commands/functioncmds.c:1839 #, c-format msgid "data type %s is a domain" msgstr "データ型%sはドメインです" -#: commands/functioncmds.c:1756 +#: commands/functioncmds.c:1879 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "FROM SQL関数の戻り値のデータ型は%sでなければなりません" -#: commands/functioncmds.c:1782 +#: commands/functioncmds.c:1905 #, c-format msgid "return data type of TO SQL function must be the transform data type" msgstr "TO SQL関数の戻り値データ型はこの変換関数のデータ型でなければなりません" -#: commands/functioncmds.c:1811 +#: commands/functioncmds.c:1934 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "型%s、言語\"%s\"の変換はすでに存在します" -#: commands/functioncmds.c:1903 +#: commands/functioncmds.c:2021 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "型%s、言語\"%s\"の変換は存在しません" -#: commands/functioncmds.c:1927 +#: commands/functioncmds.c:2045 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "関数%sはすでにスキーマ\"%s\"内に存在します" -#: commands/functioncmds.c:1982 +#: commands/functioncmds.c:2096 #, c-format msgid "no inline code specified" msgstr "インラインコードの指定がありません" -#: commands/functioncmds.c:2028 +#: commands/functioncmds.c:2142 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "言語\"%s\"ではインラインコード実行をサポートしていません" -#: commands/functioncmds.c:2140 +#: commands/functioncmds.c:2237 #, c-format msgid "cannot pass more than %d argument to a procedure" msgid_plural "cannot pass more than %d arguments to a procedure" msgstr[0] "プロシージャには %d 個以上の引数を渡すことはできません" -msgstr[1] "プロシージャには %d 個以上の引数を渡すことはできません" -#: commands/indexcmds.c:590 +#: commands/indexcmds.c:619 #, c-format msgid "must specify at least one column" msgstr "少なくとも1つの列を指定しなければなりません" -#: commands/indexcmds.c:594 +#: commands/indexcmds.c:623 #, c-format msgid "cannot use more than %d columns in an index" msgstr "インデックスには%dを超える列を使用できません" -#: commands/indexcmds.c:633 +#: commands/indexcmds.c:666 #, c-format -msgid "cannot create index on foreign table \"%s\"" -msgstr "外部テーブル\"%s\"のインデックスを作成できません" +msgid "cannot create index on relation \"%s\"" +msgstr "リレーション\"%s\"のインデックスを作成できません" -#: commands/indexcmds.c:664 +#: commands/indexcmds.c:692 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" -msgstr "パーティションテーブル\"%s\"には CREATE INDEX CONCURRENTLY は実行できません" +msgstr "パーティション親テーブル\"%s\"には CREATE INDEX CONCURRENTLY は実行できません" -#: commands/indexcmds.c:669 +#: commands/indexcmds.c:697 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" -msgstr "パーティションテーブル\"%s\"には排他制約を作成できません" +msgstr "パーティション親テーブル\"%s\"には排他制約を作成できません" -#: commands/indexcmds.c:679 +#: commands/indexcmds.c:707 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "他のセッションの一時テーブルに対するインデックスを作成できません" -#: commands/indexcmds.c:717 commands/tablecmds.c:702 commands/tablespace.c:1173 +#: commands/indexcmds.c:745 commands/tablecmds.c:779 commands/tablespace.c:1225 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "パーティション親リレーションにはデフォルトテーブル空間は指定できません" -#: commands/indexcmds.c:749 commands/tablecmds.c:737 commands/tablecmds.c:13018 commands/tablecmds.c:13132 +#: commands/indexcmds.c:777 commands/tablecmds.c:814 commands/tablecmds.c:3302 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "共有リレーションのみをpg_globalテーブル空間に格納することができます" -#: commands/indexcmds.c:782 +#: commands/indexcmds.c:810 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "古いメソッド\"rtree\"をアクセスメソッド\"gist\"に置換しています" -#: commands/indexcmds.c:803 +#: commands/indexcmds.c:831 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "アクセスメソッド\"%s\"では一意性インデックスをサポートしていません" -#: commands/indexcmds.c:808 +#: commands/indexcmds.c:836 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "アクセスメソッド\"%s\"では包含列をサポートしていません" -#: commands/indexcmds.c:813 +#: commands/indexcmds.c:841 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "アクセスメソッド\"%s\"は複数列インデックスをサポートしません" -#: commands/indexcmds.c:818 +#: commands/indexcmds.c:846 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "アクセスメソッド\"%s\"は排除制約をサポートしていません" -#: commands/indexcmds.c:941 +#: commands/indexcmds.c:970 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "パーティションキーはアクセスメソッド\"%s\"を使っているインデックスには適合させられません" -#: commands/indexcmds.c:951 +#: commands/indexcmds.c:980 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "パーティションキー定義では %s 制約はサポートしていません" -#: commands/indexcmds.c:953 +#: commands/indexcmds.c:982 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "%s 制約はパーティションキーが式を含む場合は使用できません" -#: commands/indexcmds.c:992 +#: commands/indexcmds.c:1021 #, c-format -msgid "insufficient columns in %s constraint definition" -msgstr "%s 制約定義内の列が足りません" +msgid "unique constraint on partitioned table must include all partitioning columns" +msgstr "パーティション親テーブル上のユニーク制約はすべてのパーティショニング列を含まなければなりません" -#: commands/indexcmds.c:994 +#: commands/indexcmds.c:1022 #, c-format msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." msgstr "テーブル\"%2$s\"上の%1$s制約にパーティションキーの一部である列\"%3$s\"が含まれていません。" -#: commands/indexcmds.c:1013 commands/indexcmds.c:1032 +#: commands/indexcmds.c:1041 commands/indexcmds.c:1060 #, c-format msgid "index creation on system columns is not supported" msgstr "システム列へのインデックス作成はサポートされていません" -#: commands/indexcmds.c:1057 -#, c-format -msgid "%s %s will create implicit index \"%s\" for table \"%s\"" -msgstr "%1$s %2$sはテーブル\"%4$s\"に暗黙的なインデックス\"%3$s\"を作成します" - -#: commands/indexcmds.c:1198 tcop/utility.c:1461 +#: commands/indexcmds.c:1254 tcop/utility.c:1518 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" -msgstr "パーティションテーブル\"%s\"にはユニークインデックスを構築できません" +msgstr "パーティション親テーブル\"%s\"にはユニークインデックスを構築できません" -#: commands/indexcmds.c:1200 tcop/utility.c:1463 +#: commands/indexcmds.c:1256 tcop/utility.c:1520 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "テーブル\"%s\"は外部テーブルを子テーブルとして含んでいます" -#: commands/indexcmds.c:1629 +#: commands/indexcmds.c:1726 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "インデックスの述部の関数はIMMUTABLEマークが必要です" -#: commands/indexcmds.c:1695 parser/parse_utilcmd.c:2352 parser/parse_utilcmd.c:2487 +#: commands/indexcmds.c:1792 parser/parse_utilcmd.c:2518 parser/parse_utilcmd.c:2653 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "キーとして指名された列\"%s\"は存在しません" -#: commands/indexcmds.c:1719 parser/parse_utilcmd.c:1670 +#: commands/indexcmds.c:1816 parser/parse_utilcmd.c:1815 #, c-format msgid "expressions are not supported in included columns" msgstr "包含列では式はサポートされません" -#: commands/indexcmds.c:1760 +#: commands/indexcmds.c:1857 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "式インデックスの関数はIMMUTABLEマークが必要です" -#: commands/indexcmds.c:1775 +#: commands/indexcmds.c:1872 #, c-format msgid "including column does not support a collation" msgstr "包含列は照合順序をサポートしません" -#: commands/indexcmds.c:1779 +#: commands/indexcmds.c:1876 #, c-format msgid "including column does not support an operator class" msgstr "包含列は演算子クラスをサポートしません" -#: commands/indexcmds.c:1783 +#: commands/indexcmds.c:1880 #, c-format msgid "including column does not support ASC/DESC options" msgstr "包含列は ASC/DESC オプションをサポートしません" -#: commands/indexcmds.c:1787 +#: commands/indexcmds.c:1884 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "包含列は NULLS FIRST/LAST オプションをサポートしません" -#: commands/indexcmds.c:1814 +#: commands/indexcmds.c:1911 #, c-format msgid "could not determine which collation to use for index expression" msgstr "インデックス式で使用する照合順序を特定できませんでした" -#: commands/indexcmds.c:1822 commands/tablecmds.c:15899 commands/typecmds.c:771 parser/parse_expr.c:2850 parser/parse_type.c:566 parser/parse_utilcmd.c:3562 parser/parse_utilcmd.c:4123 utils/adt/misc.c:503 +#: commands/indexcmds.c:1919 commands/tablecmds.c:17418 commands/typecmds.c:807 parser/parse_expr.c:2744 parser/parse_type.c:570 parser/parse_utilcmd.c:3785 utils/adt/misc.c:601 #, c-format msgid "collations are not supported by type %s" msgstr "%s 型では照合順序はサポートされません" -#: commands/indexcmds.c:1860 +#: commands/indexcmds.c:1957 #, c-format msgid "operator %s is not commutative" msgstr "演算子 %s は可換ではありません" -#: commands/indexcmds.c:1862 +#: commands/indexcmds.c:1959 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "排除制約で使えるのは可換演算子だけです" -#: commands/indexcmds.c:1888 +#: commands/indexcmds.c:1985 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "演算子%sは演算子族\"%s\"のメンバーではありません" -#: commands/indexcmds.c:1891 +#: commands/indexcmds.c:1988 #, c-format msgid "The exclusion operator must be related to the index operator class for the constraint." msgstr "この排除に使用する演算子はこの制約に使用するインデックス演算子に関連付けられている必要があります。" -#: commands/indexcmds.c:1926 +#: commands/indexcmds.c:2023 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "アクセスメソッド\"%s\"はASC/DESCオプションをサポートしません" -#: commands/indexcmds.c:1931 +#: commands/indexcmds.c:2028 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "アクセスメソッド\"%s\"はNULLS FIRST/LASTオプションをサポートしません" -#: commands/indexcmds.c:1977 commands/tablecmds.c:15924 commands/tablecmds.c:15930 commands/typecmds.c:1945 +#: commands/indexcmds.c:2074 commands/tablecmds.c:17443 commands/tablecmds.c:17449 commands/typecmds.c:2302 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"にはデータ型%1$s用のデフォルトの演算子クラスがありません" -#: commands/indexcmds.c:1979 +#: commands/indexcmds.c:2076 #, c-format msgid "You must specify an operator class for the index or define a default operator class for the data type." msgstr "このインデックスの演算子クラスを指定するか、あるいはこのデータ型のデフォルト演算子クラスを定義しなければなりません。" -#: commands/indexcmds.c:2008 commands/indexcmds.c:2016 commands/opclasscmds.c:205 +#: commands/indexcmds.c:2105 commands/indexcmds.c:2113 commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"用の演算子クラス\"%1$s\"は存在しません" -#: commands/indexcmds.c:2030 commands/typecmds.c:1933 +#: commands/indexcmds.c:2127 commands/typecmds.c:2290 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "演算子クラス\"%s\"はデータ型%sを受け付けません" -#: commands/indexcmds.c:2120 +#: commands/indexcmds.c:2217 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "データ型%sには複数のデフォルトの演算子クラスがあります" -#: commands/indexcmds.c:2569 +#: commands/indexcmds.c:2545 +#, c-format +msgid "unrecognized REINDEX option \"%s\"" +msgstr "認識できないREINDEXのオプション \"%s\"" + +#: commands/indexcmds.c:2769 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "テーブル\"%s\"には並行インデックス再作成が可能なインデックスがありません" -#: commands/indexcmds.c:2580 +#: commands/indexcmds.c:2783 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "テーブル\"%s\"には再構築すべきインデックスはありません" -#: commands/indexcmds.c:2619 commands/indexcmds.c:2893 commands/indexcmds.c:2986 +#: commands/indexcmds.c:2823 commands/indexcmds.c:3327 commands/indexcmds.c:3455 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "システムカタログではインデックスの並行再構築はできません" -#: commands/indexcmds.c:2642 +#: commands/indexcmds.c:2846 #, c-format msgid "can only reindex the currently open database" msgstr "現在オープンしているデータベースのみをインデックス再構築することができます" -#: commands/indexcmds.c:2733 +#: commands/indexcmds.c:2934 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "システムカタログではインデックスの並行再構築はできません、全てスキップします" -#: commands/indexcmds.c:2785 commands/indexcmds.c:3466 +#: commands/indexcmds.c:2967 +#, c-format +msgid "cannot move system relations, skipping all" +msgstr "システムリレーションは移動できません、すべてスキップします" + +#: commands/indexcmds.c:3013 +#, c-format +msgid "while reindexing partitioned table \"%s.%s\"" +msgstr "パーティションテーブル\"%s.%s\"のインデックス再構築中" + +#: commands/indexcmds.c:3016 +#, c-format +msgid "while reindexing partitioned index \"%s.%s\"" +msgstr "パーティションインデックス\"%s.%s\"のインデックス再構築中" + +#: commands/indexcmds.c:3207 commands/indexcmds.c:4063 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "テーブル\"%s.%s\"のインデックス再構築が完了しました" -#: commands/indexcmds.c:2908 commands/indexcmds.c:2954 +#: commands/indexcmds.c:3359 commands/indexcmds.c:3411 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "無効なインデックス \"%s.%s\"の並行再構築はできません、スキップします " -#: commands/indexcmds.c:2914 +#: commands/indexcmds.c:3365 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "排他制約インデックス\"%s.%s\"を並行再構築することはできません、スキップします " -#: commands/indexcmds.c:2996 -#, c-format -msgid "cannot reindex invalid index on TOAST table concurrently" -msgstr "TOASTテーブルの無効なインデックスの並行再構築はできません" - -#: commands/indexcmds.c:3024 +#: commands/indexcmds.c:3520 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "このタイプのリレーションでインデックス並列再構築はできません" -#: commands/indexcmds.c:3448 commands/indexcmds.c:3459 +#: commands/indexcmds.c:3541 #, c-format -msgid "index \"%s.%s\" was reindexed" -msgstr " インデックス\"%s.%s\"の再構築が完了しました " +msgid "cannot move non-shared relation to tablespace \"%s\"" +msgstr "テーブルスペース\"%s\"への非共有リレーションの移動はできません" -#: commands/indexcmds.c:3491 +#: commands/indexcmds.c:4044 commands/indexcmds.c:4056 #, c-format -msgid "REINDEX is not yet implemented for partitioned indexes" -msgstr "パーティションインデックスに対する REINDEX は実装されていません" +msgid "index \"%s.%s\" was reindexed" +msgstr " インデックス\"%s.%s\"の再構築が完了しました " -#: commands/lockcmds.c:91 commands/tablecmds.c:5542 commands/trigger.c:295 rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:928 +#: commands/indexcmds.c:4046 commands/indexcmds.c:4065 #, c-format -msgid "\"%s\" is not a table or view" -msgstr "\"%s\"はテーブルやビューではありません" +msgid "%s." +msgstr "%s。" -#: commands/lockcmds.c:213 rewrite/rewriteHandler.c:1977 rewrite/rewriteHandler.c:3782 +#: commands/lockcmds.c:92 #, c-format -msgid "infinite recursion detected in rules for relation \"%s\"" -msgstr "リレーション\"%s\"のルールで無限再帰を検出しました" +msgid "cannot lock relation \"%s\"" +msgstr "リレーション\"%s\"はロックできません" -#: commands/matview.c:182 +#: commands/matview.c:193 #, c-format msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "実体化ビューにデータが投入されていない場合はCONCURRENTLYを使用することはできません" -#: commands/matview.c:188 +#: commands/matview.c:199 gram.y:18285 #, c-format -msgid "CONCURRENTLY and WITH NO DATA options cannot be used together" -msgstr "CONCURRENTLYとWITH NO DATAオプションを同時に使用することはできません" +msgid "%s and %s options cannot be used together" +msgstr "%sオプションと%sオプションとを同時に使用することはできません" -#: commands/matview.c:244 +#: commands/matview.c:256 #, c-format msgid "cannot refresh materialized view \"%s\" concurrently" msgstr "実体化ビュー\"%s\"を平行的に最新化することはできません" -#: commands/matview.c:247 +#: commands/matview.c:259 #, c-format msgid "Create a unique index with no WHERE clause on one or more columns of the materialized view." msgstr "実体化ビュー上の1つ以上の列に対してWHERE句を持たないUNIQUEインデックスを作成してください。" -#: commands/matview.c:641 +#: commands/matview.c:653 #, c-format msgid "new data for materialized view \"%s\" contains duplicate rows without any null columns" msgstr "実体化ビュー\"%s\"に対する新しいデータにはNULL列を持たない重複行があります" -#: commands/matview.c:643 +#: commands/matview.c:655 #, c-format msgid "Row: %s" msgstr "行: %s" @@ -7717,23 +8185,23 @@ msgstr "インデックス検索演算子はブール型を返す必要があり #: commands/opclasscmds.c:1215 #, c-format -msgid "associated data types for opclass options parsing functions must match opclass input type" -msgstr "演算子クラスオプションのパース関数の対応するデータ型は演算子クラスの入力型と一致している必要があります" +msgid "associated data types for operator class options parsing functions must match opclass input type" +msgstr "演算子クラスのパース関数に対応するデータ型は演算子クラスの入力型と一致している必要があります" #: commands/opclasscmds.c:1222 #, c-format -msgid "left and right associated data types for opclass options parsing functions must match" -msgstr "演算子クラスオプションのパース関数の左右の対応するデータ型一致している必要があります" +msgid "left and right associated data types for operator class options parsing functions must match" +msgstr "演算子クラスオプションのパース関数の左右辺の対応するデータ型は一致している必要があります" #: commands/opclasscmds.c:1230 #, c-format -msgid "invalid opclass options parsing function" +msgid "invalid operator class options parsing function" msgstr "不正な演算子クラスオプションのパース関数" #: commands/opclasscmds.c:1231 #, c-format -msgid "Valid signature of opclass options parsing function is '%s'." -msgstr "演算子クラスオプションのパース関数の正しいシグネチャは '%s' です。" +msgid "Valid signature of operator class options parsing function is %s." +msgstr "演算子クラスオプションのパース関数の正しいシグネチャは %s です。" #: commands/opclasscmds.c:1250 #, c-format @@ -7850,7 +8318,7 @@ msgstr "アクセスメソッド\"%2$s\"用の演算子族\"%1$s\"はスキー msgid "SETOF type not allowed for operator argument" msgstr "演算子の引数にはSETOF型を使用できません" -#: commands/operatorcmds.c:152 commands/operatorcmds.c:467 +#: commands/operatorcmds.c:152 commands/operatorcmds.c:479 #, c-format msgid "operator attribute \"%s\" not recognized" msgstr "演算子の属性\"%s\"は不明です" @@ -7860,197 +8328,326 @@ msgstr "演算子の属性\"%s\"は不明です" msgid "operator function must be specified" msgstr "演算子関数を指定する必要があります" -#: commands/operatorcmds.c:174 +#: commands/operatorcmds.c:181 +#, c-format +msgid "operator argument types must be specified" +msgstr "引数型を指定する必要があります" + +#: commands/operatorcmds.c:185 +#, c-format +msgid "operator right argument type must be specified" +msgstr "演算子の引数型を指定する必要があります" + +#: commands/operatorcmds.c:186 #, c-format -msgid "at least one of leftarg or rightarg must be specified" -msgstr "左右辺のうち少なくともどちらか一方を指定する必要があります" +msgid "Postfix operators are not supported." +msgstr "後置演算子はサポートされていません。" -#: commands/operatorcmds.c:278 +#: commands/operatorcmds.c:290 #, c-format msgid "restriction estimator function %s must return type %s" msgstr "制約推定関数 %s は %s型を返す必要があります" -#: commands/operatorcmds.c:321 +#: commands/operatorcmds.c:333 #, c-format msgid "join estimator function %s has multiple matches" msgstr "JOIN推定関数 %s が複数合致しました" -#: commands/operatorcmds.c:336 +#: commands/operatorcmds.c:348 #, c-format msgid "join estimator function %s must return type %s" msgstr "JOIN推定関数 %s は %s型を返す必要があります" -#: commands/operatorcmds.c:461 +#: commands/operatorcmds.c:473 #, c-format msgid "operator attribute \"%s\" cannot be changed" msgstr "演算子の属性\"%s\"は変更できません" -#: commands/policy.c:88 commands/policy.c:401 commands/policy.c:491 commands/tablecmds.c:1499 commands/tablecmds.c:1981 commands/tablecmds.c:3021 commands/tablecmds.c:5521 commands/tablecmds.c:8252 commands/tablecmds.c:15489 commands/tablecmds.c:15524 commands/trigger.c:301 commands/trigger.c:1206 commands/trigger.c:1315 rewrite/rewriteDefine.c:277 rewrite/rewriteDefine.c:933 rewrite/rewriteRemove.c:80 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 commands/tablecmds.c:1607 commands/tablecmds.c:2187 commands/tablecmds.c:3413 commands/tablecmds.c:6281 commands/tablecmds.c:9073 commands/tablecmds.c:16998 commands/tablecmds.c:17033 commands/trigger.c:327 commands/trigger.c:1382 commands/trigger.c:1492 rewrite/rewriteDefine.c:278 rewrite/rewriteDefine.c:945 rewrite/rewriteRemove.c:80 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "権限がありません: \"%s\"はシステムカタログです" -#: commands/policy.c:171 +#: commands/policy.c:172 #, c-format msgid "ignoring specified roles other than PUBLIC" msgstr "PUBLIC以外の指定されたロールを無視します" -#: commands/policy.c:172 +#: commands/policy.c:173 #, c-format msgid "All roles are members of the PUBLIC role." msgstr "全てのロールがPUBLICロールのメンバーです。" -#: commands/policy.c:515 -#, c-format -msgid "role \"%s\" could not be removed from policy \"%s\" on \"%s\"" -msgstr "ロール\"%s\"は\"%s\"に対するポリシ\"%s\"からは削除できませんでした" - -#: commands/policy.c:724 +#: commands/policy.c:607 #, c-format msgid "WITH CHECK cannot be applied to SELECT or DELETE" msgstr "SELECTまたはDELETEには WITH CHECK を適用できません" -#: commands/policy.c:733 commands/policy.c:1038 +#: commands/policy.c:616 commands/policy.c:921 #, c-format msgid "only WITH CHECK expression allowed for INSERT" msgstr "INSERTではWITH CHECK式のみが指定可能です" -#: commands/policy.c:808 commands/policy.c:1261 +#: commands/policy.c:691 commands/policy.c:1144 #, c-format msgid "policy \"%s\" for table \"%s\" already exists" msgstr "テーブル\"%2$s\"に対するポリシ\"%1$s\"はすでに存在します" -#: commands/policy.c:1010 commands/policy.c:1289 commands/policy.c:1360 +#: commands/policy.c:893 commands/policy.c:1172 commands/policy.c:1243 #, c-format msgid "policy \"%s\" for table \"%s\" does not exist" msgstr "テーブル\"%2$s\"に対するポリシ\"%1$s\"は存在しません" -#: commands/policy.c:1028 +#: commands/policy.c:911 #, c-format msgid "only USING expression allowed for SELECT, DELETE" msgstr "SELECT、DELETEにはUSING式のみが指定可能です" -#: commands/portalcmds.c:59 commands/portalcmds.c:182 commands/portalcmds.c:233 +#: commands/portalcmds.c:60 commands/portalcmds.c:181 commands/portalcmds.c:232 #, c-format msgid "invalid cursor name: must not be empty" msgstr "カーソル名が不正です: 空ではいけません" -#: commands/portalcmds.c:190 commands/portalcmds.c:243 executor/execCurrent.c:70 utils/adt/xml.c:2594 utils/adt/xml.c:2764 +#: commands/portalcmds.c:72 +#, c-format +msgid "cannot create a cursor WITH HOLD within security-restricted operation" +msgstr "セキュリティー制限操作中は、WITH HOLD指定のカーソルを作成できません" + +#: commands/portalcmds.c:189 commands/portalcmds.c:242 executor/execCurrent.c:70 utils/adt/xml.c:2593 utils/adt/xml.c:2763 #, c-format msgid "cursor \"%s\" does not exist" msgstr "カーソル\"%s\"は存在しません" -#: commands/prepare.c:76 +#: commands/prepare.c:75 #, c-format msgid "invalid statement name: must not be empty" msgstr "不正な文の名前: 空ではいけません" -#: commands/prepare.c:134 parser/parse_param.c:304 tcop/postgres.c:1498 -#, c-format -msgid "could not determine data type of parameter $%d" -msgstr "パラメータ$%dのデータ型が特定できませんでした" - -#: commands/prepare.c:152 -#, c-format -msgid "utility statements cannot be prepared" -msgstr "ユーティリティ文は準備できません" - -#: commands/prepare.c:256 commands/prepare.c:261 +#: commands/prepare.c:230 commands/prepare.c:235 #, c-format msgid "prepared statement is not a SELECT" msgstr "準備された文はSELECTではありません" -#: commands/prepare.c:328 +#: commands/prepare.c:295 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "準備された文\"%s\"のパラメータ数が間違っています" -#: commands/prepare.c:330 +#: commands/prepare.c:297 #, c-format msgid "Expected %d parameters but got %d." msgstr "%dパラメータを想定しましたが、%dパラメータでした" -#: commands/prepare.c:363 +#: commands/prepare.c:330 #, c-format msgid "parameter $%d of type %s cannot be coerced to the expected type %s" msgstr "パラメータ$%dの型%sを想定している型%sに強制することができません" -#: commands/prepare.c:449 +#: commands/prepare.c:414 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "準備された文\"%s\"はすでに存在します" -#: commands/prepare.c:488 +#: commands/prepare.c:453 +#, c-format +msgid "prepared statement \"%s\" does not exist" +msgstr "準備された文\"%s\"は存在しません" + +#: commands/proclang.c:68 +#, c-format +msgid "must be superuser to create custom procedural language" +msgstr "手続き言語を生成するためにはスーパユーザである必要があります" + +#: commands/publicationcmds.c:129 +#, c-format +msgid "invalid list syntax for \"publish\" option" +msgstr "\"publish\"オプションのリスト構文が不正です" + +#: commands/publicationcmds.c:147 +#, c-format +msgid "unrecognized \"publish\" value: \"%s\"" +msgstr "識別できない\"publish\"の値: \"%s\"" + +#: commands/publicationcmds.c:160 +#, c-format +msgid "unrecognized publication parameter: \"%s\"" +msgstr "識別できないパブリケーションのパラメータ: \"%s\"" + +#: commands/publicationcmds.c:201 +#, c-format +msgid "no schema has been selected for CURRENT_SCHEMA" +msgstr "SURRENT_SCHEMAでスキーマの選択ができませんでした" + +#: commands/publicationcmds.c:240 +#, c-format +msgid "Table \"%s\" in schema \"%s\" is already part of the publication, adding the same schema is not supported." +msgstr "スキーマ\"%2$s\"のテーブル\"%1$s\"がすでにパブリケーションに組み込まれています、同じスキーマの追加はサポートされていません。" + +#: commands/publicationcmds.c:246 +#, c-format +msgid "cannot add relation \"%s.%s\" to publication" +msgstr "リレーション\"%s.%s\"はパブリケーションに追加できません" + +#: commands/publicationcmds.c:249 +#, c-format +msgid "Table's schema \"%s\" is already part of the publication or part of the specified schema list." +msgstr "このテーブルのスキーマ\"%s\"はすでにこのパブリケーションに組み込まれているか、指定したスキーマのリストに含まれています。" + +#: commands/publicationcmds.c:503 +msgid "User-defined types are not allowed." +msgstr "ユーザー定義型は使用できません。" + +#: commands/publicationcmds.c:506 +msgid "User-defined or built-in mutable functions are not allowed." +msgstr "ユーザー定義または組み込みの不変関数は使用できません。" + +#: commands/publicationcmds.c:509 +msgid "User-defined collations are not allowed." +msgstr "ユーザー定義照合順序は使用できません。" + +#: commands/publicationcmds.c:563 +msgid "System columns are not allowed." +msgstr "システム列は使用できません。" + +#: commands/publicationcmds.c:570 commands/publicationcmds.c:575 commands/publicationcmds.c:592 +msgid "User-defined operators are not allowed." +msgstr "ユーザー定義演算子は使用できません。" + +#: commands/publicationcmds.c:616 +msgid "Expressions only allow columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions." +msgstr "式では列、定数、組み込み演算子、組み込みデータ型、組み込み照合順序、そして不変組み込み関数のみ使用可能です。" + +#: commands/publicationcmds.c:630 #, c-format -msgid "prepared statement \"%s\" does not exist" -msgstr "準備された文\"%s\"は存在しません" +msgid "invalid publication WHERE expression" +msgstr "パブリケーションのWHERE式が不正です" -#: commands/proclang.c:67 +#: commands/publicationcmds.c:683 #, c-format -msgid "must be superuser to create custom procedural language" -msgstr "手続き言語を生成するためにはスーパユーザである必要があります" +msgid "cannot use publication WHERE clause for relation \"%s\"" +msgstr "リレーション\"%s\"に対してはパブリケーションのWHERE句は使用できません" -#: commands/publicationcmds.c:107 +#: commands/publicationcmds.c:685 #, c-format -msgid "invalid list syntax for \"publish\" option" -msgstr "\"publish\"オプションのリスト構文が不正です" +msgid "WHERE clause cannot be used for a partitioned table when %s is false." +msgstr "%sが偽のときはWHERE句をパーティション親テーブルに対して使用することはできません。" -#: commands/publicationcmds.c:125 +#: commands/publicationcmds.c:743 #, c-format -msgid "unrecognized \"publish\" value: \"%s\"" -msgstr "識別できない\"publish\"の値: \"%s\"" +msgid "cannot use publication column list for relation \"%s\"" +msgstr "リレーション\"%s\"に対して発行列リストは使用できません" -#: commands/publicationcmds.c:140 +#: commands/publicationcmds.c:745 #, c-format -msgid "unrecognized publication parameter: \"%s\"" -msgstr "識別できないパブリケーションのパラメータ: \"%s\"" +msgid "column list cannot be used for a partitioned table when %s is false." +msgstr "%sが偽のときはパーティション親テーブルに対して列リストを使用できません。" -#: commands/publicationcmds.c:172 +#: commands/publicationcmds.c:780 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "FOR ALL TABLE 指定のパブリケーションを生成するためにはスーパユーザである必要があります" -#: commands/publicationcmds.c:248 +#: commands/publicationcmds.c:853 +#, c-format +msgid "must be superuser to create FOR ALL TABLES IN SCHEMA publication" +msgstr "FOR ALL TABLES IN SCHEMA設定のパブリケーションを作成するにはスーパーユーザーである必要があります" + +#: commands/publicationcmds.c:892 #, c-format msgid "wal_level is insufficient to publish logical changes" msgstr "wal_level が論理更新情報のパブリッシュには不十分です" -#: commands/publicationcmds.c:249 +#: commands/publicationcmds.c:893 #, c-format msgid "Set wal_level to logical before creating subscriptions." msgstr "wal_levelをlogicalに設定にしてからサブスクリプションを作成してください。" -#: commands/publicationcmds.c:369 +#: commands/publicationcmds.c:990 commands/publicationcmds.c:998 +#, c-format +msgid "cannot set parameter \"%s\" to false for publication \"%s\"" +msgstr "パブリケーション\"%2$s\"に対してパラメーター\"%1$s\"を偽に設定することはできません" + +#: commands/publicationcmds.c:993 +#, c-format +msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "このパブリケーションはパーティション親テーブル\"%s\"に対するWHERE句を含んでいますが、これは\"%s\" が偽の場合は許可されません。" + +#: commands/publicationcmds.c:1001 +#, c-format +msgid "The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "このパブリケーションはパーティション親テーブルに\"%s\"対する列リストを含んでいますが、これは\"%s\" が偽の場合は許可されません。" + +#: commands/publicationcmds.c:1363 +#, c-format +msgid "must be superuser to add or set schemas" +msgstr "スキーマを追加または設定するにはスーパユーザである必要があります" + +#: commands/publicationcmds.c:1372 commands/publicationcmds.c:1380 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "パブリケーション\"%s\"は FOR ALL TABLES と定義されています" -#: commands/publicationcmds.c:371 +#: commands/publicationcmds.c:1374 +#, c-format +msgid "Tables from schema cannot be added to, dropped from, or set on FOR ALL TABLES publications." +msgstr "FOR ALL TABLES指定のパブリケーションではスキーマのテーブルの追加や削除、設定はできません。" + +#: commands/publicationcmds.c:1382 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "FOR ALL TABLES指定のパブリケーションではテーブルの追加や削除はできません。" -#: commands/publicationcmds.c:660 +#: commands/publicationcmds.c:1641 commands/publicationcmds.c:1704 +#, c-format +msgid "conflicting or redundant WHERE clauses for table \"%s\"" +msgstr "テーブル\"%s\"でWHERE句が衝突しているか重複しています" + +#: commands/publicationcmds.c:1648 commands/publicationcmds.c:1716 +#, c-format +msgid "conflicting or redundant column lists for table \"%s\"" +msgstr "テーブル\"%s\"で列リストが衝突しているか重複しています" + +#: commands/publicationcmds.c:1850 +#, c-format +msgid "column list must not be specified in ALTER PUBLICATION ... DROP" +msgstr "ALTER PUBLICATION ... DROPでは、列リストは指定できません" + +#: commands/publicationcmds.c:1862 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "リレーション\"%s\"はパブリケーションの一部ではありません" -#: commands/publicationcmds.c:703 +#: commands/publicationcmds.c:1869 +#, c-format +msgid "cannot use a WHERE clause when removing a table from a publication" +msgstr "テーブルをパブリケーションから削除する際にはWHERE句を指定できません" + +#: commands/publicationcmds.c:1929 +#, c-format +msgid "tables from schema \"%s\" are not part of the publication" +msgstr "スキーマ\"%s\"のテーブルはこのパブリケーションに含まれてません" + +#: commands/publicationcmds.c:1972 commands/publicationcmds.c:1979 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "パブリケーション\"%s\"の所有者を変更する権限がありません" -#: commands/publicationcmds.c:705 +#: commands/publicationcmds.c:1974 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "FOR ALL TABLES設定のパブリケーションの所有者はスーパユーザである必要があります" -#: commands/schemacmds.c:105 commands/schemacmds.c:258 +#: commands/publicationcmds.c:1981 +#, c-format +msgid "The owner of a FOR ALL TABLES IN SCHEMA publication must be a superuser." +msgstr "FOR ALL TABLES IN SCHEMA設定のパブリケーションの所有者はスーパーユーザーでなければなりません。" + +#: commands/schemacmds.c:105 commands/schemacmds.c:259 #, c-format msgid "unacceptable schema name \"%s\"" msgstr "スキーマ名\"%s\"は受け付けられません" -#: commands/schemacmds.c:106 commands/schemacmds.c:259 +#: commands/schemacmds.c:106 commands/schemacmds.c:260 #, c-format msgid "The prefix \"pg_\" is reserved for system schemas." msgstr "接頭辞\"pg_\"はシステムスキーマ用に予約されています" @@ -8060,2758 +8657,2966 @@ msgstr "接頭辞\"pg_\"はシステムスキーマ用に予約されていま msgid "schema \"%s\" already exists, skipping" msgstr "スキーマ\"%s\"はすでに存在します、スキップします" -#: commands/seclabel.c:129 +#: commands/seclabel.c:131 #, c-format msgid "no security label providers have been loaded" msgstr "セキュリティラベルのプロバイダがロードされませんでした" -#: commands/seclabel.c:133 +#: commands/seclabel.c:135 #, c-format msgid "must specify provider when multiple security label providers have been loaded" msgstr "複数のセキュリティラベルプロバイダがロードされた時は、プロバイダを指定する必要があります" -#: commands/seclabel.c:151 +#: commands/seclabel.c:153 #, c-format msgid "security label provider \"%s\" is not loaded" msgstr "セキュリティラベルプロバイダ\"%s\"はロードされていません" -#: commands/seclabel.c:158 +#: commands/seclabel.c:160 #, c-format msgid "security labels are not supported for this type of object" msgstr "このプラットフォームではこの型のオブジェクトに対するセキュリティラベルはサポートしていません" -#: commands/sequence.c:140 +#: commands/seclabel.c:193 #, c-format -msgid "unlogged sequences are not supported" -msgstr "UNLOGGEDシーケンスはサポートされません" +msgid "cannot set security label on relation \"%s\"" +msgstr "リレーション\"%s\"のセキュリティラベルは設定できません" # (%s) -#: commands/sequence.c:709 +#: commands/sequence.c:747 #, c-format -msgid "nextval: reached maximum value of sequence \"%s\" (%s)" -msgstr "nextval: シーケンス\"%s\"の最大値(%s)に達しました" +msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" +msgstr "nextval: シーケンス\"%s\"の最大値(%lld)に達しました" -#: commands/sequence.c:732 +#: commands/sequence.c:766 #, c-format -msgid "nextval: reached minimum value of sequence \"%s\" (%s)" -msgstr "nextval: シーケンス\"%s\"の最小値(%s)に達しました" +msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" +msgstr "nextval: シーケンス\"%s\"の最小値(%lld)に達しました" -#: commands/sequence.c:850 +#: commands/sequence.c:884 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "本セッションでシーケンス\"%s\"のcurrvalはまだ定義されていません" -#: commands/sequence.c:869 commands/sequence.c:875 +#: commands/sequence.c:903 commands/sequence.c:909 #, c-format msgid "lastval is not yet defined in this session" msgstr "本セッションでlastvalはまだ定義されていません" -#: commands/sequence.c:963 +#: commands/sequence.c:989 #, c-format -msgid "setval: value %s is out of bounds for sequence \"%s\" (%s..%s)" -msgstr "setval: 値%sはシーケンス\"%s\"の範囲(%s..%s)外です\"" +msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" +msgstr "setval: 値%lldはシーケンス\"%s\"の範囲(%lld..%lld)外です\"" -#: commands/sequence.c:1360 +#: commands/sequence.c:1357 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "不正なオプション SEQUENCE NAME" -#: commands/sequence.c:1386 +#: commands/sequence.c:1383 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "識別列の型はsmallint、integerまたはbigintでなくてはなりません" -#: commands/sequence.c:1387 +#: commands/sequence.c:1384 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "シーケンスの型はsmallint、integerまたはbigintでなくてはなりません" -#: commands/sequence.c:1421 +#: commands/sequence.c:1418 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENTはゼロではいけません" -#: commands/sequence.c:1474 +#: commands/sequence.c:1466 #, c-format -msgid "MAXVALUE (%s) is out of range for sequence data type %s" -msgstr "MAXVALUE (%s) はシーケンスデータ型%sの範囲外です" +msgid "MAXVALUE (%lld) is out of range for sequence data type %s" +msgstr "MAXVALUE (%lld) はシーケンスデータ型%sの範囲外です" -#: commands/sequence.c:1511 +#: commands/sequence.c:1498 #, c-format -msgid "MINVALUE (%s) is out of range for sequence data type %s" -msgstr "MINVALUE (%s) はシーケンスデータ型%sの範囲外です" +msgid "MINVALUE (%lld) is out of range for sequence data type %s" +msgstr "MINVALUE (%lld) はシーケンスデータ型%sの範囲外です" -#: commands/sequence.c:1525 +#: commands/sequence.c:1506 #, c-format -msgid "MINVALUE (%s) must be less than MAXVALUE (%s)" -msgstr "MINVALUE (%s)はMAXVALUE (%s)より小さくなければなりません" +msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" +msgstr "MINVALUE (%lld)はMAXVALUE (%lld)より小さくなければなりません" -#: commands/sequence.c:1552 +#: commands/sequence.c:1527 #, c-format -msgid "START value (%s) cannot be less than MINVALUE (%s)" -msgstr "STARTの値(%s)はMINVALUE(%s)より小さくすることはできません" +msgid "START value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "STARTの値(%lld)はMINVALUE(%lld)より小さくすることはできません" -#: commands/sequence.c:1564 +#: commands/sequence.c:1533 #, c-format -msgid "START value (%s) cannot be greater than MAXVALUE (%s)" -msgstr "STARTの値(%s)はMAXVALUE(%s)より大きくすることはできません" +msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "STARTの値(%lld)はMAXVALUE(%lld)より大きくすることはできません" -#: commands/sequence.c:1594 +#: commands/sequence.c:1557 #, c-format -msgid "RESTART value (%s) cannot be less than MINVALUE (%s)" -msgstr "RESTART の値(%s)は MINVALUE(%s) より小さくすることはできません" +msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "RESTART の値(%lld)は MINVALUE(%lld) より小さくすることはできません" -#: commands/sequence.c:1606 +#: commands/sequence.c:1563 #, c-format -msgid "RESTART value (%s) cannot be greater than MAXVALUE (%s)" -msgstr "RESTART の値(%s)は MAXVALUE(%s) より大きくすることはできません" +msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "RESTART の値(%lld)は MAXVALUE(%lld) より大きくすることはできません" -#: commands/sequence.c:1621 +#: commands/sequence.c:1574 #, c-format -msgid "CACHE (%s) must be greater than zero" -msgstr "CACHE(%s)はゼロより大きくなければなりません" +msgid "CACHE (%lld) must be greater than zero" +msgstr "CACHE(%lld)はゼロより大きくなければなりません" -#: commands/sequence.c:1658 +#: commands/sequence.c:1610 #, c-format msgid "invalid OWNED BY option" msgstr "不正なOWNED BYオプションです" -#: commands/sequence.c:1659 +#: commands/sequence.c:1611 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "OWNED BY table.column または OWNED BY NONEを指定してください。" -#: commands/sequence.c:1684 +#: commands/sequence.c:1636 #, c-format -msgid "referenced relation \"%s\" is not a table or foreign table" -msgstr "参照先のリレーション\"%s\"はテーブルまたは外部テーブルではありません" +msgid "sequence cannot be owned by relation \"%s\"" +msgstr "シーケンスの所有者をリレーション\"%s\"にはできません" -#: commands/sequence.c:1691 +#: commands/sequence.c:1644 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "シーケンスは関連するテーブルと同じ所有者でなければなりません" -#: commands/sequence.c:1695 +#: commands/sequence.c:1648 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "シーケンスは関連するテーブルと同じスキーマでなければなりません" -#: commands/sequence.c:1717 +#: commands/sequence.c:1670 #, c-format msgid "cannot change ownership of identity sequence" msgstr "識別シーケンスの所有者は変更できません" -#: commands/sequence.c:1718 commands/tablecmds.c:12401 commands/tablecmds.c:14914 +#: commands/sequence.c:1671 commands/tablecmds.c:13743 commands/tablecmds.c:16396 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "シーケンス\"%s\"はテーブル\"%s\"にリンクされています" -#: commands/statscmds.c:104 commands/statscmds.c:113 +#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1870 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "CREATE STATISTICSで指定可能なリレーションは一つのみです" -#: commands/statscmds.c:131 +#: commands/statscmds.c:136 #, c-format -msgid "relation \"%s\" is not a table, foreign table, or materialized view" -msgstr "リレーション\"%s\"はテーブルや外部テーブル、または実体化ビューではありません" +msgid "cannot define statistics for relation \"%s\"" +msgstr "リレーション\"%s\"に対して統計情報を定義できません" -#: commands/statscmds.c:174 +#: commands/statscmds.c:187 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "統計情報オブジェクト\"%s\"はすでに存在します、スキップします" -#: commands/statscmds.c:182 +#: commands/statscmds.c:195 #, c-format msgid "statistics object \"%s\" already exists" msgstr "統計情報オブジェクト\"%s\"はすでに存在します" -#: commands/statscmds.c:204 commands/statscmds.c:210 +#: commands/statscmds.c:206 #, c-format -msgid "only simple column references are allowed in CREATE STATISTICS" -msgstr "CREATE STATISTICSでは単純な列参照のみが指定可能です" +msgid "cannot have more than %d columns in statistics" +msgstr "統計情報は%dを超える列を使用できません" -#: commands/statscmds.c:225 +#: commands/statscmds.c:247 commands/statscmds.c:270 commands/statscmds.c:303 #, c-format msgid "statistics creation on system columns is not supported" msgstr "システム列に対する統計情報の作成はサポートされていません" -#: commands/statscmds.c:232 +#: commands/statscmds.c:254 commands/statscmds.c:277 #, c-format msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" msgstr "列\"%s\"の型%sはデフォルトのbtreeオペレータクラスを持たないため統計情報では利用できません" -#: commands/statscmds.c:239 +#: commands/statscmds.c:320 #, c-format -msgid "cannot have more than %d columns in statistics" -msgstr "統計情報は%dを超える列を使用できません" +msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" +msgstr "式の型%sがデフォルトbtree演算子クラスを持たないためこの式は多値統計情報では使用できません" + +#: commands/statscmds.c:341 +#, c-format +msgid "when building statistics on a single expression, statistics kinds may not be specified" +msgstr "単一式上の統計情報の構築時には、統計種別は指定できません" + +#: commands/statscmds.c:370 +#, c-format +msgid "unrecognized statistics kind \"%s\"" +msgstr "認識できない統計情報種別\"%s\"" -#: commands/statscmds.c:254 +#: commands/statscmds.c:399 #, c-format msgid "extended statistics require at least 2 columns" msgstr "拡張統計情報には最低でも2つの列が必要です" -#: commands/statscmds.c:272 +#: commands/statscmds.c:417 #, c-format msgid "duplicate column name in statistics definition" msgstr "定形情報定義中の列名が重複しています" -#: commands/statscmds.c:306 +#: commands/statscmds.c:452 #, c-format -msgid "unrecognized statistics kind \"%s\"" -msgstr "認識できない統計情報種別\"%s\"" +msgid "duplicate expression in statistics definition" +msgstr "統計情報定義内に重複した式" -#: commands/statscmds.c:444 commands/tablecmds.c:7273 +#: commands/statscmds.c:615 commands/tablecmds.c:8041 #, c-format msgid "statistics target %d is too low" msgstr "統計情報目標%dは小さすぎます" -#: commands/statscmds.c:452 commands/tablecmds.c:7281 +#: commands/statscmds.c:623 commands/tablecmds.c:8049 #, c-format msgid "lowering statistics target to %d" msgstr "統計情報目標を%dに減らします" -#: commands/statscmds.c:475 +#: commands/statscmds.c:646 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "統計情報オブジェクト\"%s.%s\"は存在しません、スキップします" -#: commands/subscriptioncmds.c:200 +#: commands/subscriptioncmds.c:251 commands/subscriptioncmds.c:298 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "認識できないサブスクリプションパラメータ: \"%s\"" +#: commands/subscriptioncmds.c:289 +#, c-format +msgid "invalid WAL location (LSN): %s" +msgstr "不正なWAL位置(LSN): %s" + #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:214 commands/subscriptioncmds.c:220 commands/subscriptioncmds.c:226 commands/subscriptioncmds.c:245 commands/subscriptioncmds.c:251 +#: commands/subscriptioncmds.c:313 commands/subscriptioncmds.c:320 commands/subscriptioncmds.c:327 commands/subscriptioncmds.c:349 commands/subscriptioncmds.c:365 #, c-format msgid "%s and %s are mutually exclusive options" msgstr "%s と %s は排他なオプションです" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:258 commands/subscriptioncmds.c:264 +#: commands/subscriptioncmds.c:355 commands/subscriptioncmds.c:371 #, c-format msgid "subscription with %s must also set %s" msgstr "%s としたサブスクリプションでは %s を設定する必要があります" -#: commands/subscriptioncmds.c:306 +#: commands/subscriptioncmds.c:433 #, c-format -msgid "publication name \"%s\" used more than once" -msgstr "パブリケーション名\"%s\"が2回以上使われています" +msgid "could not receive publication from the publisher: %s" +msgid_plural "could not receive list of publications from the publisher: %s" +msgstr[0] "発行テーブルの一覧を発行サーバーから受け取れませんでした: %s" + +#: commands/subscriptioncmds.c:467 +#, c-format +msgid "publication %s does not exist in the publisher" +msgid_plural "publications %s do not exist in the publisher" +msgstr[0] "パブリケーション %s は発行サーバー存在しません" -#: commands/subscriptioncmds.c:377 +#: commands/subscriptioncmds.c:549 #, c-format msgid "must be superuser to create subscriptions" msgstr "サブスクリプションを生成するにはスーパユーザである必要があります" -#: commands/subscriptioncmds.c:469 commands/subscriptioncmds.c:557 replication/logical/tablesync.c:857 replication/logical/worker.c:2129 +#: commands/subscriptioncmds.c:650 commands/subscriptioncmds.c:778 replication/logical/tablesync.c:1238 replication/logical/worker.c:3699 #, c-format msgid "could not connect to the publisher: %s" msgstr "発行サーバへの接続ができませんでした: %s" -#: commands/subscriptioncmds.c:511 +#: commands/subscriptioncmds.c:719 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "発行サーバでレプリケーションスロット\"%s\"を作成しました" #. translator: %s is an SQL ALTER statement -#: commands/subscriptioncmds.c:524 +#: commands/subscriptioncmds.c:732 #, c-format msgid "tables were not subscribed, you will have to run %s to subscribe the tables" msgstr "テーブルは購読されていません、テーブルを購読するためには %s を実行する必要があります" -#: commands/subscriptioncmds.c:613 -#, c-format -msgid "table \"%s.%s\" added to subscription \"%s\"" -msgstr "テーブル\"%s.%s\"がサブスクリプション\"%s\"に追加されました" - -#: commands/subscriptioncmds.c:637 -#, c-format -msgid "table \"%s.%s\" removed from subscription \"%s\"" -msgstr "テーブル\"%s.%s\"がサブスクリプション\"%s\"から削除されました" - -#: commands/subscriptioncmds.c:717 +#: commands/subscriptioncmds.c:1035 #, c-format msgid "cannot set %s for enabled subscription" msgstr "有効にされているサブスクリプションには %s を指定できません" -#: commands/subscriptioncmds.c:765 +#: commands/subscriptioncmds.c:1088 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "スロット名を指定されていないサブスクリプションを有効にはできません" -#: commands/subscriptioncmds.c:817 +#: commands/subscriptioncmds.c:1131 commands/subscriptioncmds.c:1183 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "refresh指定された ALTER SUBSCRIPTION は無効化されているサブスクリプションには実行できません" -#: commands/subscriptioncmds.c:818 +#: commands/subscriptioncmds.c:1132 commands/subscriptioncmds.c:1184 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false) を使ってください。" -#: commands/subscriptioncmds.c:836 +#: commands/subscriptioncmds.c:1141 commands/subscriptioncmds.c:1193 +#, c-format +msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" +msgstr "two_phaseが有効である場合、refreshおよびcopy_data指定された ALTER SUBSCRIPTIONは実行できません" + +#: commands/subscriptioncmds.c:1142 commands/subscriptioncmds.c:1194 +#, c-format +msgid "Use ALTER SUBSCRIPTION ...SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "refresh = false または copy_data = false を指定してALTER SUBSCRIPTION ... SET PUBLICATIONを実行するか、DROP/CREATE SUBSCRIPTIONを実行してください。" + +#: commands/subscriptioncmds.c:1214 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESHは無効化されているサブスクリプションには実行できません" -#: commands/subscriptioncmds.c:922 +#: commands/subscriptioncmds.c:1239 #, c-format -msgid "subscription \"%s\" does not exist, skipping" -msgstr "サブスクリプション\"%s\"は存在しません、スキップします" +msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" +msgstr "two_phaseが有効である場合、copy_data指定のALTER SUBSCRIPTION ... REFRESHは実行できません" -#: commands/subscriptioncmds.c:1047 +#: commands/subscriptioncmds.c:1240 #, c-format -msgid "could not connect to publisher when attempting to drop the replication slot \"%s\"" -msgstr "レプリケーションスロット\"%s\"を削除するための発行者サーバへの接続に失敗しました" +msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "ALTER SUBSCRIPTION ... REFRESH を copy_data = false を指定して実行するか、DROP/CREATE SUBSCRIPTIONを実行してください。" -#: commands/subscriptioncmds.c:1049 commands/subscriptioncmds.c:1064 replication/logical/tablesync.c:906 replication/logical/tablesync.c:928 +#: commands/subscriptioncmds.c:1260 #, c-format -msgid "The error was: %s" -msgstr "発生したエラー: %s" +msgid "must be superuser to skip transaction" +msgstr "トランザクションをスキップするにはスーパーユーザーである必要があります" -#. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1051 +#: commands/subscriptioncmds.c:1280 #, c-format -msgid "Use %s to disassociate the subscription from the slot." -msgstr "サブスクリプションのスロットへの関連付けを解除するには %s を実行してください。" +msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" +msgstr "WAL読み飛ばし位置(LSN %X/%X)は起点LSN %X/%Xより大きくなければなりません" -#: commands/subscriptioncmds.c:1062 +#: commands/subscriptioncmds.c:1360 #, c-format -msgid "could not drop the replication slot \"%s\" on publisher" -msgstr "発行サーバ上のレプリケーションスロット\"%s\"の削除に失敗しました" +msgid "subscription \"%s\" does not exist, skipping" +msgstr "サブスクリプション\"%s\"は存在しません、スキップします" -#: commands/subscriptioncmds.c:1067 +#: commands/subscriptioncmds.c:1624 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "発行サーバ上のレプリケーションスロット\"%s\"を削除しました" -#: commands/subscriptioncmds.c:1104 +#: commands/subscriptioncmds.c:1633 commands/subscriptioncmds.c:1641 +#, c-format +msgid "could not drop replication slot \"%s\" on publisher: %s" +msgstr "発行サーバ上のレプリケーションスロット\"%s\"の削除に失敗しました: %s" + +#: commands/subscriptioncmds.c:1675 #, c-format msgid "permission denied to change owner of subscription \"%s\"" msgstr "サブスクリプション\"%s\"の所有者を変更する権限がありません" -#: commands/subscriptioncmds.c:1106 +#: commands/subscriptioncmds.c:1677 #, c-format msgid "The owner of a subscription must be a superuser." msgstr "サブスクリプションの所有者はスーパユーザでなければなりません。" -#: commands/subscriptioncmds.c:1221 +#: commands/subscriptioncmds.c:1780 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "発行テーブルの一覧を発行サーバから受け取れませんでした: %s" -#: commands/tablecmds.c:228 commands/tablecmds.c:270 +#: commands/subscriptioncmds.c:1845 +#, c-format +msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" +msgstr "レプリケーションスロット\"%s\"を削除する際に発行者サーバへの接続に失敗しました: %s" + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1848 +#, c-format +msgid "Use %s to disassociate the subscription from the slot." +msgstr "サブスクリプションのスロットへの関連付けを解除するには %s を実行してください。" + +#: commands/subscriptioncmds.c:1878 +#, c-format +msgid "publication name \"%s\" used more than once" +msgstr "パブリケーション名\"%s\"が2回以上使われています" + +#: commands/subscriptioncmds.c:1922 +#, c-format +msgid "publication \"%s\" is already in subscription \"%s\"" +msgstr "パブリケーション\"%s\"はサブスクリプション\"%s\"にすでに存在します" + +#: commands/subscriptioncmds.c:1936 +#, c-format +msgid "publication \"%s\" is not in subscription \"%s\"" +msgstr "パブリケーション\"%s\"はサブスクリプション\"%s\"にはありません" + +#: commands/subscriptioncmds.c:1947 +#, c-format +msgid "cannot drop all the publications from a subscription" +msgstr "サブスクリプションからすべてのパブリケーションを削除することはできません" + +#: commands/tablecmds.c:244 commands/tablecmds.c:286 #, c-format msgid "table \"%s\" does not exist" msgstr "テーブル\"%s\"は存在しません" -#: commands/tablecmds.c:229 commands/tablecmds.c:271 +#: commands/tablecmds.c:245 commands/tablecmds.c:287 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "テーブル\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:231 commands/tablecmds.c:273 +#: commands/tablecmds.c:247 commands/tablecmds.c:289 msgid "Use DROP TABLE to remove a table." msgstr "テーブルを削除するにはDROP TABLEを使用してください。" -#: commands/tablecmds.c:234 +#: commands/tablecmds.c:250 #, c-format msgid "sequence \"%s\" does not exist" msgstr "シーケンス\"%s\"は存在しません" -#: commands/tablecmds.c:235 +#: commands/tablecmds.c:251 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "シーケンス\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:237 +#: commands/tablecmds.c:253 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "シーケンスを削除するにはDROP SEQUENCEを使用してください。" -#: commands/tablecmds.c:240 +#: commands/tablecmds.c:256 #, c-format msgid "view \"%s\" does not exist" msgstr "ビュー\"%s\"は存在しません" -#: commands/tablecmds.c:241 +#: commands/tablecmds.c:257 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "ビュー\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:243 +#: commands/tablecmds.c:259 msgid "Use DROP VIEW to remove a view." msgstr "ビューを削除するにはDROP VIEWを使用してください。" -#: commands/tablecmds.c:246 +#: commands/tablecmds.c:262 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "実体化ビュー\"%s\"は存在しません" -#: commands/tablecmds.c:247 +#: commands/tablecmds.c:263 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "実体化ビュー\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:249 +#: commands/tablecmds.c:265 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "実体化ビューを削除するにはDROP MATERIALIZED VIEWを使用してください。" -#: commands/tablecmds.c:252 commands/tablecmds.c:276 commands/tablecmds.c:17088 parser/parse_utilcmd.c:2084 +#: commands/tablecmds.c:268 commands/tablecmds.c:292 commands/tablecmds.c:18910 parser/parse_utilcmd.c:2250 #, c-format msgid "index \"%s\" does not exist" msgstr "インデックス\"%s\"は存在しません" -#: commands/tablecmds.c:253 commands/tablecmds.c:277 +#: commands/tablecmds.c:269 commands/tablecmds.c:293 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "インデックス\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:255 commands/tablecmds.c:279 +#: commands/tablecmds.c:271 commands/tablecmds.c:295 msgid "Use DROP INDEX to remove an index." msgstr "インデックスを削除するにはDROP INDEXを使用してください" -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:276 #, c-format msgid "\"%s\" is not a type" msgstr "\"%s\"は型ではありません" -#: commands/tablecmds.c:261 +#: commands/tablecmds.c:277 msgid "Use DROP TYPE to remove a type." msgstr "型を削除するにはDROP TYPEを使用してください" -#: commands/tablecmds.c:264 commands/tablecmds.c:12240 commands/tablecmds.c:14694 +#: commands/tablecmds.c:280 commands/tablecmds.c:13582 commands/tablecmds.c:16099 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "外部テーブル\"%s\"は存在しません" -#: commands/tablecmds.c:265 +#: commands/tablecmds.c:281 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "外部テーブル\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:267 +#: commands/tablecmds.c:283 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "外部テーブルを削除するには DROP FOREIGN TABLE を使用してください。" -#: commands/tablecmds.c:618 +#: commands/tablecmds.c:695 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMITは一時テーブルでのみ使用できます" -#: commands/tablecmds.c:649 +#: commands/tablecmds.c:726 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "セキュリティー制限操作中は、一時テーブルを作成できません" -#: commands/tablecmds.c:685 commands/tablecmds.c:13598 +#: commands/tablecmds.c:762 commands/tablecmds.c:14887 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "リレーション\"%s\"が複数回継承されました" -#: commands/tablecmds.c:866 +#: commands/tablecmds.c:947 #, c-format msgid "specifying a table access method is not supported on a partitioned table" msgstr "パーティション親テーブルではテーブルアクセスメソッドの指定はサポートされていません" -#: commands/tablecmds.c:962 +#: commands/tablecmds.c:1040 #, c-format msgid "\"%s\" is not partitioned" msgstr "\"%s\"はパーティションされていません" -#: commands/tablecmds.c:1056 +#: commands/tablecmds.c:1135 #, c-format msgid "cannot partition using more than %d columns" msgstr "%d以上の列を使ったパーティションはできません" -#: commands/tablecmds.c:1112 +#: commands/tablecmds.c:1191 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "パーティションテーブル\"%s\"では外部子テーブルを作成できません" -#: commands/tablecmds.c:1114 +#: commands/tablecmds.c:1193 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "テーブル\"%s\"はユニークインデックスを持っています" -#: commands/tablecmds.c:1277 +#: commands/tablecmds.c:1356 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLYは複数オブジェクトの削除をサポートしていません" -#: commands/tablecmds.c:1281 +#: commands/tablecmds.c:1360 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLYはCASCADEをサポートしません" -#: commands/tablecmds.c:1641 +#: commands/tablecmds.c:1464 +#, c-format +msgid "cannot drop partitioned index \"%s\" concurrently" +msgstr "パーティション親インデックス\"%s\"は並行的に削除することはできません" + +#: commands/tablecmds.c:1752 #, c-format msgid "cannot truncate only a partitioned table" msgstr "パーティションの親テーブルのみの切り詰めはできません" -#: commands/tablecmds.c:1642 +#: commands/tablecmds.c:1753 #, c-format msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." msgstr "ONLY キーワードを指定しないでください、もしくは子テーブルに対して直接 TRUNCATE ONLY を実行してください。" -#: commands/tablecmds.c:1711 +#: commands/tablecmds.c:1825 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "テーブル\"%s\"へのカスケードを削除します" -#: commands/tablecmds.c:2018 +#: commands/tablecmds.c:2175 +#, c-format +msgid "cannot truncate foreign table \"%s\"" +msgstr "外部テーブル\"%s\"の切り詰めはできません" + +#: commands/tablecmds.c:2224 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "他のセッションの一時テーブルを削除できません" -#: commands/tablecmds.c:2242 commands/tablecmds.c:13495 +#: commands/tablecmds.c:2452 commands/tablecmds.c:14784 #, c-format msgid "cannot inherit from partitioned table \"%s\"" -msgstr "パーティションテーブル\"%s\"からの継承はできません" +msgstr "パーティション親テーブル\"%s\"からの継承はできません" -#: commands/tablecmds.c:2247 +#: commands/tablecmds.c:2457 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "パーティション子テーブル\"%s\"からの継承はできません" -#: commands/tablecmds.c:2255 parser/parse_utilcmd.c:2314 parser/parse_utilcmd.c:2456 +#: commands/tablecmds.c:2465 parser/parse_utilcmd.c:2480 parser/parse_utilcmd.c:2622 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "継承しようとしたリレーション\"%s\"はテーブルまたは外部テーブルではありません" -#: commands/tablecmds.c:2267 +#: commands/tablecmds.c:2477 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" -msgstr "一時リレーションを永続リレーション\"%s\"の子テーブルとして作ることはできません" +msgstr "一時リレーションを永続リレーション\"%s\"のパーティション子テーブルとして作ることはできません" -#: commands/tablecmds.c:2276 commands/tablecmds.c:13474 +#: commands/tablecmds.c:2486 commands/tablecmds.c:14763 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "一時リレーション\"%s\"から継承することはできません" -#: commands/tablecmds.c:2286 commands/tablecmds.c:13482 +#: commands/tablecmds.c:2496 commands/tablecmds.c:14771 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "他のセッションの一時リレーションから継承することはできません" -#: commands/tablecmds.c:2337 +#: commands/tablecmds.c:2550 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "複数の継承される列\"%s\"の定義をマージしています" -#: commands/tablecmds.c:2345 +#: commands/tablecmds.c:2558 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "継承される列\"%s\"の型が競合しています" -#: commands/tablecmds.c:2347 commands/tablecmds.c:2370 commands/tablecmds.c:2583 commands/tablecmds.c:2613 parser/parse_coerce.c:1935 parser/parse_coerce.c:1955 parser/parse_coerce.c:1975 parser/parse_coerce.c:2030 parser/parse_coerce.c:2107 parser/parse_coerce.c:2141 parser/parse_param.c:218 +#: commands/tablecmds.c:2560 commands/tablecmds.c:2583 commands/tablecmds.c:2600 commands/tablecmds.c:2856 commands/tablecmds.c:2886 commands/tablecmds.c:2900 parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 parser/parse_param.c:227 #, c-format msgid "%s versus %s" msgstr "%s対%s" -#: commands/tablecmds.c:2356 +#: commands/tablecmds.c:2569 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "継承される列 \"%s\"の照合順序が競合しています" -#: commands/tablecmds.c:2358 commands/tablecmds.c:2595 commands/tablecmds.c:6025 +#: commands/tablecmds.c:2571 commands/tablecmds.c:2868 commands/tablecmds.c:6721 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "\"%s\"対\"%s\"" -#: commands/tablecmds.c:2368 +#: commands/tablecmds.c:2581 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "継承される列 \"%s\"の格納パラメーターが競合しています" -#: commands/tablecmds.c:2384 +#: commands/tablecmds.c:2598 commands/tablecmds.c:2898 +#, c-format +msgid "column \"%s\" has a compression method conflict" +msgstr "列\"%s\"の圧縮方式が競合しています" + +#: commands/tablecmds.c:2613 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "継承された列 \"%s\"の生成が競合しています" -#: commands/tablecmds.c:2489 commands/tablecmds.c:11045 parser/parse_utilcmd.c:1094 parser/parse_utilcmd.c:1181 parser/parse_utilcmd.c:1597 parser/parse_utilcmd.c:1706 +#: commands/tablecmds.c:2707 commands/tablecmds.c:2762 commands/tablecmds.c:12306 parser/parse_utilcmd.c:1291 parser/parse_utilcmd.c:1334 parser/parse_utilcmd.c:1743 parser/parse_utilcmd.c:1851 #, c-format msgid "cannot convert whole-row table reference" msgstr "行全体テーブル参照を変換できません" -#: commands/tablecmds.c:2490 parser/parse_utilcmd.c:1182 +#: commands/tablecmds.c:2708 parser/parse_utilcmd.c:1292 +#, c-format +msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "制約\"%s\"はテーブル\"%s\"への行全体参照を含みます。" + +#: commands/tablecmds.c:2763 parser/parse_utilcmd.c:1335 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "制約\"%s\"はテーブル\"%s\"への行全体参照を含みます。" -#: commands/tablecmds.c:2569 +#: commands/tablecmds.c:2842 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "継承される定義で列\"%s\"をマージしています" -#: commands/tablecmds.c:2573 +#: commands/tablecmds.c:2846 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "継承される定義で列\"%s\"を移動してマージします" -#: commands/tablecmds.c:2574 +#: commands/tablecmds.c:2847 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "ユーザが指定した列が継承した列の位置に移動されました。" -#: commands/tablecmds.c:2581 +#: commands/tablecmds.c:2854 #, c-format msgid "column \"%s\" has a type conflict" msgstr "列\"%s\"の型が競合しています" -#: commands/tablecmds.c:2593 +#: commands/tablecmds.c:2866 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "列\"%s\"の照合順序が競合しています" -#: commands/tablecmds.c:2611 +#: commands/tablecmds.c:2884 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "列\"%s\"の格納パラメーターが競合しています" -#: commands/tablecmds.c:2639 +#: commands/tablecmds.c:2925 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "子テーブルの列\"%s\"は生成式を指定しています" -#: commands/tablecmds.c:2641 +#: commands/tablecmds.c:2927 #, c-format msgid "Omit the generation expression in the definition of the child table column to inherit the generation expression from the parent table." msgstr "親テーブルの生成式を継承するために、子テーブルのカラムの生成式定義を無視しました" -#: commands/tablecmds.c:2645 +#: commands/tablecmds.c:2931 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "列\"%s\"は生成列を継承しますが、default 指定がされています" -#: commands/tablecmds.c:2650 +#: commands/tablecmds.c:2936 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" msgstr "列\"%s\"は生成列を継承しますが、識別列と指定されています" -#: commands/tablecmds.c:2760 +#: commands/tablecmds.c:3045 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "列\"%s\"は競合する生成式を継承します" -#: commands/tablecmds.c:2765 +#: commands/tablecmds.c:3050 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "列\"%s\"は競合するデフォルト値を継承します" -#: commands/tablecmds.c:2767 +#: commands/tablecmds.c:3052 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "競合を解消するには明示的にデフォルトを指定してください" -#: commands/tablecmds.c:2813 +#: commands/tablecmds.c:3098 #, c-format msgid "check constraint name \"%s\" appears multiple times but with different expressions" msgstr "異なる式を持つ検査制約名\"%s\"が複数あります。" -#: commands/tablecmds.c:2990 +#: commands/tablecmds.c:3311 +#, c-format +msgid "cannot move temporary tables of other sessions" +msgstr "他のセッションの一時テーブルを移動できません" + +#: commands/tablecmds.c:3381 #, c-format msgid "cannot rename column of typed table" msgstr "型付けされたテーブルの列をリネームできません" -#: commands/tablecmds.c:3009 +#: commands/tablecmds.c:3400 #, c-format -msgid "\"%s\" is not a table, view, materialized view, composite type, index, or foreign table" -msgstr "\"%s\" はテーブル、ビュー、実体化ビュー、複合型、インデックス、外部テーブルのいずれでもありません" +msgid "cannot rename columns of relation \"%s\"" +msgstr "リレーション\"%s\"の列名は変更できません" -#: commands/tablecmds.c:3103 +#: commands/tablecmds.c:3495 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "継承される列\"%s\"の名前を子テーブルでも変更する必要があります" -#: commands/tablecmds.c:3135 +#: commands/tablecmds.c:3527 #, c-format msgid "cannot rename system column \"%s\"" msgstr "システム列%s\"の名前を変更できません" -#: commands/tablecmds.c:3150 +#: commands/tablecmds.c:3542 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "継承される列\"%s\"の名前を変更できません" -#: commands/tablecmds.c:3302 +#: commands/tablecmds.c:3694 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "継承される制約\"%s\"の名前を子テーブルでも変更する必要があります" -#: commands/tablecmds.c:3309 +#: commands/tablecmds.c:3701 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "継承される制約\"%s\"の名前を変更できません" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3542 +#: commands/tablecmds.c:3998 #, c-format msgid "cannot %s \"%s\" because it is being used by active queries in this session" msgstr "このセッションで実行中の問い合わせで使用されているため\"%2$s\"を%1$sできません" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3551 +#: commands/tablecmds.c:4007 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "保留中のトリガイベントがあるため\"%2$s\"を%1$sできません" -#: commands/tablecmds.c:4174 commands/tablecmds.c:4189 +#: commands/tablecmds.c:4472 +#, c-format +msgid "cannot alter partition \"%s\" with an incomplete detach" +msgstr "パーティション子テーブル\"%s\"は不完全な取り外し状態であるため変更できません" + +#: commands/tablecmds.c:4665 commands/tablecmds.c:4680 #, c-format msgid "cannot change persistence setting twice" msgstr "永続性設定の変更は2度はできません" -#: commands/tablecmds.c:4882 +#: commands/tablecmds.c:4701 +#, c-format +msgid "cannot change access method of a partitioned table" +msgstr "パーティション親テーブルのアクセスメソッドは変更できません" + +#: commands/tablecmds.c:4707 +#, c-format +msgid "cannot have multiple SET ACCESS METHOD subcommands" +msgstr "SET ACCESS METHODサブコマンドを複数指定できません" + +#: commands/tablecmds.c:5445 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "システムリレーション\"%sを書き換えられません" -#: commands/tablecmds.c:4888 +#: commands/tablecmds.c:5451 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "カタログテーブルとして使用されているテーブル\"%s\"は書き換えられません" -#: commands/tablecmds.c:4898 +#: commands/tablecmds.c:5461 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "他のセッションの一時テーブルを書き換えられません" -#: commands/tablecmds.c:5187 -#, c-format -msgid "rewriting table \"%s\"" -msgstr "テーブル\"%s\"に再書込しています" - -#: commands/tablecmds.c:5191 -#, c-format -msgid "verifying table \"%s\"" -msgstr "テーブル\"%s\"を検証しています" - -#: commands/tablecmds.c:5356 +#: commands/tablecmds.c:5955 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "リレーション\"%2$s\"の列\"%1$s\"にNULL値があります" -#: commands/tablecmds.c:5373 +#: commands/tablecmds.c:5972 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "一部の行がリレーション\"%2$s\"の検査制約\"%1$s\"に違反してます" -#: commands/tablecmds.c:5392 partitioning/partbounds.c:3237 +#: commands/tablecmds.c:5991 partitioning/partbounds.c:3403 #, c-format msgid "updated partition constraint for default partition \"%s\" would be violated by some row" msgstr "デフォルトパーティション\"%s\"の一部の行が更新後のパーティション制約に違反しています" -#: commands/tablecmds.c:5398 +#: commands/tablecmds.c:5997 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "一部の行がリレーション\"%s\"のパーティション制約に違反しています" -#: commands/tablecmds.c:5545 commands/trigger.c:1200 commands/trigger.c:1306 -#, c-format -msgid "\"%s\" is not a table, view, or foreign table" -msgstr "\"%s\"はテーブルやビュー、または外部テーブルではありません" - -#: commands/tablecmds.c:5548 -#, c-format -msgid "\"%s\" is not a table, view, materialized view, or index" -msgstr "\"%s\"はテーブル、ビュー、実体化ビュー、インデックスではありません" - -#: commands/tablecmds.c:5554 -#, c-format -msgid "\"%s\" is not a table, materialized view, or index" -msgstr "\"%s\"はテーブルや実体化ビュー、インデックスではありません" - -#: commands/tablecmds.c:5557 -#, c-format -msgid "\"%s\" is not a table, materialized view, or foreign table" -msgstr "\"%s\"はテーブルや実体化ビュー、または外部テーブルではありません" - -#: commands/tablecmds.c:5560 -#, c-format -msgid "\"%s\" is not a table or foreign table" -msgstr "\"%s\"はテーブルや外部テーブルではありません" - -#: commands/tablecmds.c:5563 -#, c-format -msgid "\"%s\" is not a table, composite type, or foreign table" -msgstr "\"%s\"はテーブル、複合型、外部テーブルのいずれでもありません" - -#: commands/tablecmds.c:5566 -#, c-format -msgid "\"%s\" is not a table, materialized view, index, or foreign table" -msgstr "\"%s\"はテーブルやインデックス、実体化ビュー、インデックス、外部テーブルではありません" - -#: commands/tablecmds.c:5576 +#. translator: %s is a group of some SQL keywords +#: commands/tablecmds.c:6264 #, c-format -msgid "\"%s\" is of the wrong type" -msgstr "\"%s\"は誤った型です" +msgid "ALTER action %s cannot be performed on relation \"%s\"" +msgstr "ALTERのアクション%sはリレーション\"%s\"では実行できません" -#: commands/tablecmds.c:5783 commands/tablecmds.c:5790 +#: commands/tablecmds.c:6479 commands/tablecmds.c:6486 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "型\"%s\"を変更できません。列\"%s\".\"%s\"でその型を使用しているためです" -#: commands/tablecmds.c:5797 +#: commands/tablecmds.c:6493 #, c-format msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" msgstr "列%2$s\".\"%3$s\"がその行型を使用しているため、外部テーブル\"%1$s\"を変更できません。" -#: commands/tablecmds.c:5804 +#: commands/tablecmds.c:6500 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "テーブル\"%s\"を変更できません。その行型を列\"%s\".\"%s\"で使用しているためです" -#: commands/tablecmds.c:5860 +#: commands/tablecmds.c:6556 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "型付けされたテーブルの型であるため、外部テーブル\"%s\"を変更できません。" -#: commands/tablecmds.c:5862 +#: commands/tablecmds.c:6558 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "型付けされたテーブルを変更する場合も ALTER .. CASCADE を使用してください" -#: commands/tablecmds.c:5908 +#: commands/tablecmds.c:6604 #, c-format msgid "type %s is not a composite type" msgstr "型 %s は複合型ではありません" -#: commands/tablecmds.c:5935 +#: commands/tablecmds.c:6631 #, c-format msgid "cannot add column to typed table" msgstr "型付けされたテーブルに列を追加できません" -#: commands/tablecmds.c:5988 +#: commands/tablecmds.c:6684 #, c-format msgid "cannot add column to a partition" msgstr "パーティションに列は追加できません" -#: commands/tablecmds.c:6017 commands/tablecmds.c:13725 +#: commands/tablecmds.c:6713 commands/tablecmds.c:15014 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "子テーブル\"%s\"に異なる型の列\"%s\"があります" -#: commands/tablecmds.c:6023 commands/tablecmds.c:13732 +#: commands/tablecmds.c:6719 commands/tablecmds.c:15021 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "子テーブル\"%s\"に異なる照合順序の列\"%s\"があります" -#: commands/tablecmds.c:6037 +#: commands/tablecmds.c:6733 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "子\"%2$s\"の列\"%1$s\"の定義をマージしています" -#: commands/tablecmds.c:6080 +#: commands/tablecmds.c:6776 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "子テーブルを持つテーブルに識別列を再帰的に追加することはできません" -#: commands/tablecmds.c:6319 +#: commands/tablecmds.c:7020 #, c-format msgid "column must be added to child tables too" msgstr "列は子テーブルでも追加する必要があります" -#: commands/tablecmds.c:6397 +#: commands/tablecmds.c:7098 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでに存在します、スキップします" -#: commands/tablecmds.c:6404 +#: commands/tablecmds.c:7105 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでに存在します" -#: commands/tablecmds.c:6470 commands/tablecmds.c:10683 +#: commands/tablecmds.c:7171 commands/tablecmds.c:11945 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" -msgstr "パーティションが存在する場合にはパーティションテーブルのみから制約を削除することはできません" +msgstr "パーティションが存在する場合にはパーティション親テーブルのみから制約を削除することはできません" -#: commands/tablecmds.c:6471 commands/tablecmds.c:6740 commands/tablecmds.c:7691 commands/tablecmds.c:10684 +#: commands/tablecmds.c:7172 commands/tablecmds.c:7489 commands/tablecmds.c:8486 commands/tablecmds.c:11946 #, c-format msgid "Do not specify the ONLY keyword." msgstr "ONLYキーワードを指定しないでください。" -#: commands/tablecmds.c:6508 commands/tablecmds.c:6666 commands/tablecmds.c:6808 commands/tablecmds.c:6893 commands/tablecmds.c:6987 commands/tablecmds.c:7046 commands/tablecmds.c:7148 commands/tablecmds.c:7314 commands/tablecmds.c:7384 commands/tablecmds.c:7477 commands/tablecmds.c:10838 commands/tablecmds.c:12263 +#: commands/tablecmds.c:7209 commands/tablecmds.c:7415 commands/tablecmds.c:7557 commands/tablecmds.c:7671 commands/tablecmds.c:7765 commands/tablecmds.c:7824 commands/tablecmds.c:7943 commands/tablecmds.c:8082 commands/tablecmds.c:8152 commands/tablecmds.c:8308 commands/tablecmds.c:12100 commands/tablecmds.c:13605 commands/tablecmds.c:16190 #, c-format msgid "cannot alter system column \"%s\"" msgstr "システム列\"%s\"を変更できません" -#: commands/tablecmds.c:6514 commands/tablecmds.c:6814 +#: commands/tablecmds.c:7215 commands/tablecmds.c:7563 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "リレーション\"%2$s\"の列\"%1$s\"は識別列です" -#: commands/tablecmds.c:6550 +#: commands/tablecmds.c:7258 #, c-format msgid "column \"%s\" is in a primary key" msgstr "列\"%s\"はプライマリキーで使用しています" -#: commands/tablecmds.c:6572 +#: commands/tablecmds.c:7263 +#, c-format +msgid "column \"%s\" is in index used as replica identity" +msgstr "列\"%s\"は複製識別として使用中のインデックスに含まれています" + +#: commands/tablecmds.c:7286 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "列\"%s\"は親テーブルでNOT NULL指定されています" -#: commands/tablecmds.c:6737 commands/tablecmds.c:8150 +#: commands/tablecmds.c:7486 commands/tablecmds.c:8969 #, c-format msgid "constraint must be added to child tables too" msgstr "制約は子テーブルにも追加する必要があります" -#: commands/tablecmds.c:6738 +#: commands/tablecmds.c:7487 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでにNOT NULLLではありません。" -#: commands/tablecmds.c:6773 -#, c-format -msgid "existing constraints on column \"%s\".\"%s\" are sufficient to prove that it does not contain nulls" -msgstr "カラム\"%s\".\"%s\"上の既存の制約はNULLを含まないことを照明するのに十分です" - -#: commands/tablecmds.c:6816 +#: commands/tablecmds.c:7565 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." msgstr "代わりに ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY を使ってください。" -#: commands/tablecmds.c:6821 +#: commands/tablecmds.c:7570 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "リレーション\"%2$s\"の列\"%1$s\"は生成カラムです" -#: commands/tablecmds.c:6824 +#: commands/tablecmds.c:7573 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." msgstr "代わりに ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION を使ってください。" -#: commands/tablecmds.c:6904 +#: commands/tablecmds.c:7682 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "識別列を追加するにはリレーション\"%s\"の列\"%s\"はNOT NULLと宣言されている必要があります" -#: commands/tablecmds.c:6910 +#: commands/tablecmds.c:7688 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでに識別列です" -#: commands/tablecmds.c:6916 +#: commands/tablecmds.c:7694 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでにデフォルト値が指定されています" -#: commands/tablecmds.c:6993 commands/tablecmds.c:7054 +#: commands/tablecmds.c:7771 commands/tablecmds.c:7832 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "リレーション\"%2$s\"の列\"%1$s\"は識別列ではありません" -#: commands/tablecmds.c:7059 +#: commands/tablecmds.c:7837 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "リレーション\"%2$s\"の列\"%1$s\"は識別列ではありません、スキップします" -#: commands/tablecmds.c:7118 +#: commands/tablecmds.c:7890 +#, c-format +msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" +msgstr "ALTER TABLE / DROP EXPRESSIONは子テーブルに対しても適用されなくてはなりません" + +#: commands/tablecmds.c:7912 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "継承列から生成式を削除することはできません" -#: commands/tablecmds.c:7156 +#: commands/tablecmds.c:7951 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "リレーション\"%2$s\"の列\"%1$s\"は格納生成列ではありません" -#: commands/tablecmds.c:7161 +#: commands/tablecmds.c:7956 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "リレーション\"%2$s\"の列\"%1$s\"は格納生成列ではありません、スキップします" -#: commands/tablecmds.c:7261 +#: commands/tablecmds.c:8029 #, c-format msgid "cannot refer to non-index column by number" msgstr "非インデックス列を番号で参照することはできません" -#: commands/tablecmds.c:7304 +#: commands/tablecmds.c:8072 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "リレーション \"%2$s\"の列 %1$d は存在しません" -#: commands/tablecmds.c:7323 +#: commands/tablecmds.c:8091 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "インデックス\"%2$s\"の包含列\"%1$s\"への統計情報の変更はできません" -#: commands/tablecmds.c:7328 +#: commands/tablecmds.c:8096 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "インデックス \"%2$s\"の非式列\"%1$s\"の統計情報の変更はできません" -#: commands/tablecmds.c:7330 +#: commands/tablecmds.c:8098 #, c-format msgid "Alter statistics on table column instead." msgstr "代わりにテーブルカラムの統計情報を変更してください。" -#: commands/tablecmds.c:7457 +#: commands/tablecmds.c:8288 #, c-format msgid "invalid storage type \"%s\"" msgstr "不正な格納タイプ\"%s\"" -#: commands/tablecmds.c:7489 +#: commands/tablecmds.c:8320 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "列のデータ型%sは格納タイプPLAINしか取ることができません" -#: commands/tablecmds.c:7571 +#: commands/tablecmds.c:8365 #, c-format msgid "cannot drop column from typed table" msgstr "型付けされたテーブルから列を削除できません" -#: commands/tablecmds.c:7630 +#: commands/tablecmds.c:8424 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "リレーション\"%2$s\"の列\"%1$s\"は存在しません、スキップします" -#: commands/tablecmds.c:7643 +#: commands/tablecmds.c:8437 #, c-format msgid "cannot drop system column \"%s\"" msgstr "システム列\"%s\"を削除できません" -#: commands/tablecmds.c:7653 +#: commands/tablecmds.c:8447 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "継承される列\"%s\"を削除できません" -#: commands/tablecmds.c:7666 +#: commands/tablecmds.c:8460 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "列\"%s\"はリレーション\"%s\"のパーティションキーの一部であるため、削除できません" -#: commands/tablecmds.c:7690 +#: commands/tablecmds.c:8485 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" -msgstr "子テーブルが存在する場合にはパーティションの親テーブルのみから列を削除することはできません" +msgstr "子テーブルが存在する場合にはパーティション親テーブルのみから列を削除することはできません" -#: commands/tablecmds.c:7871 +#: commands/tablecmds.c:8689 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX はパーティションテーブルではサポートされていません" -#: commands/tablecmds.c:7896 +#: commands/tablecmds.c:8714 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX はインデックス\"%s\"を\"%s\"にリネームします" -#: commands/tablecmds.c:8230 +#: commands/tablecmds.c:9051 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" -msgstr "パーティションテーブル\"%s\"で定義されているリレーション\"%s\"を参照する外部キーではONLY指定はできません" +msgstr "パーティションテーブル\"%s\"上のリレーション\"%s\"を参照する外部キー定義ではONLY指定はできません " -#: commands/tablecmds.c:8236 +#: commands/tablecmds.c:9057 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "パーティションテーブル\"%1$s\"にリレーション\"%2$s\"を参照する NOT VALID 指定の外部キーは追加できません " -#: commands/tablecmds.c:8239 +#: commands/tablecmds.c:9060 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "この機能はパーティションテーブルに対してはサポートされていません。" -#: commands/tablecmds.c:8246 commands/tablecmds.c:8651 +#: commands/tablecmds.c:9067 commands/tablecmds.c:9532 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "参照先のリレーション\"%s\"はテーブルではありません" -#: commands/tablecmds.c:8269 +#: commands/tablecmds.c:9090 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "永続テーブルの制約は永続テーブルだけを参照できます" -#: commands/tablecmds.c:8276 +#: commands/tablecmds.c:9097 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "UNLOGGEDテーブルに対する制約は、永続テーブルまたはUNLOGGEDテーブルだけを参照する場合があります" -#: commands/tablecmds.c:8282 +#: commands/tablecmds.c:9103 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "一時テーブルに対する制約は一時テーブルだけを参照する場合があります" -#: commands/tablecmds.c:8286 +#: commands/tablecmds.c:9107 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "一時テーブルに対する制約にはこのセッションの一時テーブルを加える必要があります" -#: commands/tablecmds.c:8352 commands/tablecmds.c:8358 +#: commands/tablecmds.c:9181 commands/tablecmds.c:9187 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "生成カラムを含む外部キー制約に対する不正な %s 処理" -#: commands/tablecmds.c:8374 +#: commands/tablecmds.c:9203 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "外部キーの参照列数と非参照列数が合いません" -#: commands/tablecmds.c:8481 +#: commands/tablecmds.c:9310 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "外部キー制約\"%sは実装されていません" -#: commands/tablecmds.c:8483 +#: commands/tablecmds.c:9312 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "キーとなる列\"%s\"と\"%s\"との間で型に互換性がありません:%sと%s" -#: commands/tablecmds.c:8846 commands/tablecmds.c:9239 parser/parse_utilcmd.c:763 parser/parse_utilcmd.c:892 +#: commands/tablecmds.c:9468 +#, c-format +msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" +msgstr "ON DELETE SETアクションで参照されている列\"%s\"は外部キーの一部である必要があります" + +#: commands/tablecmds.c:9741 commands/tablecmds.c:10188 parser/parse_utilcmd.c:785 parser/parse_utilcmd.c:914 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "外部テーブルでは外部キー制約はサポートされていません" -#: commands/tablecmds.c:9605 commands/tablecmds.c:9768 commands/tablecmds.c:10640 commands/tablecmds.c:10715 +#: commands/tablecmds.c:10717 commands/tablecmds.c:10995 commands/tablecmds.c:11902 commands/tablecmds.c:11977 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は存在しません" -#: commands/tablecmds.c:9612 +#: commands/tablecmds.c:10724 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は外部キー制約ではありません" -#: commands/tablecmds.c:9776 +#: commands/tablecmds.c:10762 +#, c-format +msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgstr "リレーション\"%2$s\"の制約\"%1$s\"を変更できません" + +#: commands/tablecmds.c:10765 +#, c-format +msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." +msgstr "制約\"%1$s\"は、リレーション\"%3$s\"上の制約\"%2$s\"から派生しています。" + +#: commands/tablecmds.c:10767 +#, c-format +msgid "You may alter the constraint it derives from, instead." +msgstr "この制約の代わりに派生元の制約を変更することは可能です。" + +#: commands/tablecmds.c:11003 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は外部キー制約でも検査制約でもありません" -#: commands/tablecmds.c:9854 +#: commands/tablecmds.c:11081 #, c-format msgid "constraint must be validated on child tables too" msgstr "制約は子テーブルでも検証される必要があります" -#: commands/tablecmds.c:9938 +#: commands/tablecmds.c:11165 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "外部キー制約で参照される列\"%s\"が存在しません" -#: commands/tablecmds.c:9943 +#: commands/tablecmds.c:11170 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "外部キーでは%dを超えるキーを持つことができません" -#: commands/tablecmds.c:10008 +#: commands/tablecmds.c:11236 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"には遅延可能プライマリキーは使用できません" -#: commands/tablecmds.c:10025 +#: commands/tablecmds.c:11253 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"にはプライマリキーがありません" -#: commands/tablecmds.c:10090 +#: commands/tablecmds.c:11318 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "外部キーの被参照列リストには重複があってはなりません" -#: commands/tablecmds.c:10184 +#: commands/tablecmds.c:11412 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"に対しては、遅延可能な一意性制約は使用できません" -#: commands/tablecmds.c:10189 +#: commands/tablecmds.c:11417 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"に、指定したキーに一致する一意性制約がありません" -#: commands/tablecmds.c:10277 -#, c-format -msgid "validating foreign key constraint \"%s\"" -msgstr "外部キー制約\"%s\"を検証しています" - -#: commands/tablecmds.c:10596 +#: commands/tablecmds.c:11858 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の継承された制約\"%1$s\"を削除できません" -#: commands/tablecmds.c:10646 +#: commands/tablecmds.c:11908 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は存在しません、スキップします" -#: commands/tablecmds.c:10822 +#: commands/tablecmds.c:12084 #, c-format msgid "cannot alter column type of typed table" msgstr "型付けされたテーブルの列の型を変更できません" -#: commands/tablecmds.c:10849 +#: commands/tablecmds.c:12111 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "継承される列\"%s\"を変更できません" -#: commands/tablecmds.c:10858 +#: commands/tablecmds.c:12120 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "列\"%s\"はリレーション\"%s\"のパーティションキーの一部であるため、変更できません" -#: commands/tablecmds.c:10908 +#: commands/tablecmds.c:12170 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"に対するUSING句の結果は自動的に%s型に型変換できません" -#: commands/tablecmds.c:10911 +#: commands/tablecmds.c:12173 #, c-format msgid "You might need to add an explicit cast." msgstr "必要に応じて明示的な型変換を追加してください。" -#: commands/tablecmds.c:10915 +#: commands/tablecmds.c:12177 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"は型%sには自動的に型変換できません" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:10918 +#: commands/tablecmds.c:12180 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "必要に応じて\"USING %s::%s\"を追加してください。" -#: commands/tablecmds.c:11018 +#: commands/tablecmds.c:12279 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の継承列\"%1$s\"は変更できません" -#: commands/tablecmds.c:11046 +#: commands/tablecmds.c:12307 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "USING式が行全体テーブル参照を含んでいます。" -#: commands/tablecmds.c:11057 +#: commands/tablecmds.c:12318 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "継承される列\"%s\"の型を子テーブルで変更しなければなりません" -#: commands/tablecmds.c:11182 +#: commands/tablecmds.c:12443 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "列\"%s\"の型を2回変更することはできません" -#: commands/tablecmds.c:11220 +#: commands/tablecmds.c:12481 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "カラム\"%s\"に対する生成式は自動的に%s型にキャストできません" -#: commands/tablecmds.c:11225 +#: commands/tablecmds.c:12486 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"のデフォルト値を自動的に%s型にキャストできません" -#: commands/tablecmds.c:11303 -#, c-format -msgid "cannot alter type of a column used by a generated column" -msgstr "生成カラムで使用される列の型は変更できません" - -#: commands/tablecmds.c:11304 -#, c-format -msgid "Column \"%s\" is used by generated column \"%s\"." -msgstr "カラム\"%s\"は生成カラム\"%s\"で使われています。" - -#: commands/tablecmds.c:11325 +#: commands/tablecmds.c:12567 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "ビューまたはルールで使用される列の型は変更できません" -#: commands/tablecmds.c:11326 commands/tablecmds.c:11345 commands/tablecmds.c:11363 +#: commands/tablecmds.c:12568 commands/tablecmds.c:12587 commands/tablecmds.c:12605 #, c-format msgid "%s depends on column \"%s\"" msgstr "%sは列\"%s\"に依存しています" -#: commands/tablecmds.c:11344 +#: commands/tablecmds.c:12586 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "トリガー定義で使用される列の型は変更できません" -#: commands/tablecmds.c:11362 +#: commands/tablecmds.c:12604 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "ポリシ定義で使用されている列の型は変更できません" -#: commands/tablecmds.c:12371 commands/tablecmds.c:12383 +#: commands/tablecmds.c:12635 +#, c-format +msgid "cannot alter type of a column used by a generated column" +msgstr "生成カラムで使用される列の型は変更できません" + +#: commands/tablecmds.c:12636 +#, c-format +msgid "Column \"%s\" is used by generated column \"%s\"." +msgstr "カラム\"%s\"は生成カラム\"%s\"で使われています。" + +#: commands/tablecmds.c:13713 commands/tablecmds.c:13725 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "インデックス\"%s\"の所有者を変更できません" -#: commands/tablecmds.c:12373 commands/tablecmds.c:12385 +#: commands/tablecmds.c:13715 commands/tablecmds.c:13727 #, c-format msgid "Change the ownership of the index's table, instead." msgstr "代わりにインデックスのテーブルの所有者を変更してください" -#: commands/tablecmds.c:12399 +#: commands/tablecmds.c:13741 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "シーケンス\"%s\"の所有者を変更できません" -#: commands/tablecmds.c:12413 commands/tablecmds.c:15600 +#: commands/tablecmds.c:13755 commands/tablecmds.c:17109 commands/tablecmds.c:17128 #, c-format msgid "Use ALTER TYPE instead." msgstr "代わりにALTER TYPEを使用してください。" -#: commands/tablecmds.c:12422 +#: commands/tablecmds.c:13764 #, c-format -msgid "\"%s\" is not a table, view, sequence, or foreign table" -msgstr "\"%s\"はテーブル、ビュー、シーケンス、外部テーブルではありません" +msgid "cannot change owner of relation \"%s\"" +msgstr "リレーション\"%s\"の所有者を変更できません" -#: commands/tablecmds.c:12761 +#: commands/tablecmds.c:14126 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "SET TABLESPACEサブコマンドを複数指定できません" -#: commands/tablecmds.c:12838 +#: commands/tablecmds.c:14203 #, c-format -msgid "\"%s\" is not a table, view, materialized view, index, or TOAST table" -msgstr "\"%s\"はテーブル、ビュー、実体化ビュー、インデックス、TOASTテーブルではありません" +msgid "cannot set options for relation \"%s\"" +msgstr "リレーション\"%s\"のオプションは設定できません" -#: commands/tablecmds.c:12871 commands/view.c:494 +#: commands/tablecmds.c:14237 commands/view.c:507 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTIONは自動更新可能ビューでのみサポートされます" -#: commands/tablecmds.c:13011 -#, c-format -msgid "cannot move system relation \"%s\"" -msgstr "システムリレーション\"%s\"を移動できません" - -#: commands/tablecmds.c:13027 -#, c-format -msgid "cannot move temporary tables of other sessions" -msgstr "他のセッションの一時テーブルを移動できません" - -#: commands/tablecmds.c:13197 +#: commands/tablecmds.c:14487 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "テーブルスペースにはテーブル、インデックスおよび実体化ビューしかありません" -#: commands/tablecmds.c:13209 +#: commands/tablecmds.c:14499 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "pg_globalテーブルスペースとの間のリレーションの移動はできません" -#: commands/tablecmds.c:13301 +#: commands/tablecmds.c:14591 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "リレーション\"%s.%s\"のロックが獲得できなかったため中断します" -#: commands/tablecmds.c:13317 +#: commands/tablecmds.c:14607 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "テーブルスペース\"%s\"には合致するリレーションはありませんでした" -#: commands/tablecmds.c:13433 +#: commands/tablecmds.c:14722 #, c-format msgid "cannot change inheritance of typed table" msgstr "型付けされたテーブルの継承を変更できません" -#: commands/tablecmds.c:13438 commands/tablecmds.c:13934 +#: commands/tablecmds.c:14727 commands/tablecmds.c:15283 #, c-format msgid "cannot change inheritance of a partition" msgstr "パーティションの継承は変更できません" -#: commands/tablecmds.c:13443 +#: commands/tablecmds.c:14732 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "パーティションテーブルの継承は変更できません" -#: commands/tablecmds.c:13489 +#: commands/tablecmds.c:14778 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "他のセッションの一時テーブルを継承できません" -#: commands/tablecmds.c:13502 +#: commands/tablecmds.c:14791 #, c-format msgid "cannot inherit from a partition" msgstr "パーティションからの継承はできません" -#: commands/tablecmds.c:13524 commands/tablecmds.c:16240 +#: commands/tablecmds.c:14813 commands/tablecmds.c:17762 #, c-format msgid "circular inheritance not allowed" msgstr "循環継承を行うことはできません" -#: commands/tablecmds.c:13525 commands/tablecmds.c:16241 +#: commands/tablecmds.c:14814 commands/tablecmds.c:17763 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\"はすでに\"%s\"の子です" -#: commands/tablecmds.c:13538 +#: commands/tablecmds.c:14827 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "トリガ\"%s\"によってテーブル\"%s\"が継承子テーブルになることができません" -#: commands/tablecmds.c:13540 +#: commands/tablecmds.c:14829 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "遷移テーブルを使用したROWトリガは継承関係ではサポートされていません。" -#: commands/tablecmds.c:13743 +#: commands/tablecmds.c:15032 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "子テーブルの列\"%s\"はNOT NULLである必要があります" -#: commands/tablecmds.c:13770 +#: commands/tablecmds.c:15041 +#, c-format +msgid "column \"%s\" in child table must be a generated column" +msgstr "子テーブルの列\"%s\"は生成列である必要があります" + +#: commands/tablecmds.c:15091 +#, c-format +msgid "column \"%s\" in child table has a conflicting generation expression" +msgstr "子テーブルの列\"%s\"には競合する生成式があります" + +#: commands/tablecmds.c:15119 #, c-format msgid "child table is missing column \"%s\"" msgstr "子テーブルには列\"%s\"がありません" -#: commands/tablecmds.c:13858 +#: commands/tablecmds.c:15207 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "子テーブル\"%s\"では検査制約\"%s\"に異なった定義がされています" -#: commands/tablecmds.c:13866 +#: commands/tablecmds.c:15215 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "制約\"%s\"は子テーブル\"%s\"上の継承されない制約と競合します" -#: commands/tablecmds.c:13877 +#: commands/tablecmds.c:15226 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "制約\"%s\"は子テーブル\"%s\"のNOT VALID制約と衝突しています" -#: commands/tablecmds.c:13912 +#: commands/tablecmds.c:15261 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "子テーブルには制約\"%s\"がありません" -#: commands/tablecmds.c:14001 +#: commands/tablecmds.c:15347 +#, c-format +msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" +msgstr "パーティション\"%s\"はすでにパーティションテーブル\"%s.%s\"からの取り外し保留中です" + +#: commands/tablecmds.c:15376 commands/tablecmds.c:15424 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "リレーション\"%s\"はリレーション\"%s\"のパーティション子テーブルではありません" -#: commands/tablecmds.c:14007 +#: commands/tablecmds.c:15430 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "リレーション\"%s\"はリレーション\"%s\"の親ではありません" -#: commands/tablecmds.c:14235 +#: commands/tablecmds.c:15658 #, c-format msgid "typed tables cannot inherit" msgstr "型付けされたテーブルは継承できません" -#: commands/tablecmds.c:14265 +#: commands/tablecmds.c:15688 #, c-format msgid "table is missing column \"%s\"" msgstr "テーブルには列\"%s\"がありません" -#: commands/tablecmds.c:14276 +#: commands/tablecmds.c:15699 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "テーブルには列\"%s\"がありますが型は\"%s\"を必要としています" -#: commands/tablecmds.c:14285 +#: commands/tablecmds.c:15708 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "テーブル\"%s\"では列\"%s\"の型が異なっています" -#: commands/tablecmds.c:14299 +#: commands/tablecmds.c:15722 #, c-format msgid "table has extra column \"%s\"" msgstr "テーブルに余分な列\"%s\"があります" -#: commands/tablecmds.c:14351 +#: commands/tablecmds.c:15774 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\"は型付けされたテーブルではありません" -#: commands/tablecmds.c:14533 +#: commands/tablecmds.c:15961 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "非ユニークインデックス\"%s\"は複製識別としては使用できません" -#: commands/tablecmds.c:14539 +#: commands/tablecmds.c:15967 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "一意性を即時検査しないインデックス\"%s\"は複製識別には使用できません" -#: commands/tablecmds.c:14545 +#: commands/tablecmds.c:15973 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "式インデックス\"%s\"は複製識別としては使用できません" -#: commands/tablecmds.c:14551 +#: commands/tablecmds.c:15979 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "部分インデックス\"%s\"を複製識別としては使用できません" -#: commands/tablecmds.c:14557 +#: commands/tablecmds.c:15985 #, c-format msgid "cannot use invalid index \"%s\" as replica identity" msgstr "無効なインデックス\"%s\"は複製識別としては使用できません" -#: commands/tablecmds.c:14574 +#: commands/tablecmds.c:16002 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "列%2$dはシステム列であるためインデックス\"%1$s\"は複製識別には使えません" -#: commands/tablecmds.c:14581 +#: commands/tablecmds.c:16009 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "列\"%2$s\"はnull可であるためインデックス\"%1$s\"は複製識別には使えません" -#: commands/tablecmds.c:14774 +#: commands/tablecmds.c:16256 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "テーブル\"%s\"は一時テーブルであるため、ログ出力設定を変更できません" -#: commands/tablecmds.c:14798 +#: commands/tablecmds.c:16280 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "テーブル\"%s\"はパブリケーションの一部であるため、UNLOGGEDに変更できません" -#: commands/tablecmds.c:14800 +#: commands/tablecmds.c:16282 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "UNLOGGEDリレーションはレプリケーションできません。" -#: commands/tablecmds.c:14845 +#: commands/tablecmds.c:16327 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "テーブル\"%s\"はUNLOGGEDテーブル\"%s\"を参照しているためLOGGEDには設定できません" -#: commands/tablecmds.c:14855 +#: commands/tablecmds.c:16337 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "テーブル\"%s\"はLOGGEDテーブル\"%s\"を参照しているためUNLOGGEDには設定できません" -#: commands/tablecmds.c:14913 +#: commands/tablecmds.c:16395 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "所有するシーケンスを他のスキーマに移動することができません" -#: commands/tablecmds.c:15020 +#: commands/tablecmds.c:16423 +#, c-format +msgid "cannot move table \"%s\" to schema \"%s\"" +msgstr "テーブル\"%s\"はスキーマ\"%s\"に移動できません" + +#: commands/tablecmds.c:16425 +#, c-format +msgid "The schema \"%s\" and same schema's table \"%s\" cannot be part of the same publication \"%s\"." +msgstr "スキーマ\"%s\"とこのスキーマのテーブル\"%s\"とを同一のパブリケーション\"%s\"に組み込むことはできません" + +#: commands/tablecmds.c:16529 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "リレーション\"%s\"はスキーマ\"%s\"内にすでに存在します" -#: commands/tablecmds.c:15583 +#: commands/tablecmds.c:16942 +#, c-format +msgid "\"%s\" is not a table or materialized view" +msgstr "\"%s\"はテーブルや実体化ビューではありません" + +#: commands/tablecmds.c:17092 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\"は複合型ではありません" -#: commands/tablecmds.c:15615 +#: commands/tablecmds.c:17120 +#, c-format +msgid "cannot change schema of index \"%s\"" +msgstr "インデックス\"%s\"のスキーマを変更できません" + +#: commands/tablecmds.c:17122 commands/tablecmds.c:17134 +#, c-format +msgid "Change the schema of the table instead." +msgstr "代わりにこのテーブルのスキーマを変更してください。" + +#: commands/tablecmds.c:17126 #, c-format -msgid "\"%s\" is not a table, view, materialized view, sequence, or foreign table" -msgstr "\"%s\"はテーブル、ビュー、実体化ビュー、シーケンス、外部テーブルではありません" +msgid "cannot change schema of composite type \"%s\"" +msgstr "複合型%sのスキーマは変更できません" -#: commands/tablecmds.c:15650 +#: commands/tablecmds.c:17132 +#, c-format +msgid "cannot change schema of TOAST table \"%s\"" +msgstr "TOASTテーブル\"%s\"のスキーマは変更できません" + +#: commands/tablecmds.c:17169 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "識別できないパーティションストラテジ \"%s\"" -#: commands/tablecmds.c:15658 +#: commands/tablecmds.c:17177 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "\"list\"パーティションストラテジは2つ以上の列に対しては使えません" -#: commands/tablecmds.c:15724 +#: commands/tablecmds.c:17243 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "パーティションキーに指定されている列\"%s\"は存在しません" -#: commands/tablecmds.c:15732 +#: commands/tablecmds.c:17251 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "パーティションキーでシステム列\"%s\"は使用できません" -#: commands/tablecmds.c:15743 commands/tablecmds.c:15857 +#: commands/tablecmds.c:17262 commands/tablecmds.c:17376 #, c-format msgid "cannot use generated column in partition key" msgstr "パーティションキーで生成カラムは使用できません" -#: commands/tablecmds.c:15744 commands/tablecmds.c:15858 commands/trigger.c:641 rewrite/rewriteHandler.c:829 rewrite/rewriteHandler.c:846 +#: commands/tablecmds.c:17263 commands/tablecmds.c:17377 commands/trigger.c:667 rewrite/rewriteHandler.c:907 rewrite/rewriteHandler.c:942 #, c-format msgid "Column \"%s\" is a generated column." msgstr "列\"%s\"は生成カラムです。" -#: commands/tablecmds.c:15820 +#: commands/tablecmds.c:17339 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "パーティションキー式で使われる関数はIMMUTABLE指定されている必要があります" -#: commands/tablecmds.c:15840 +#: commands/tablecmds.c:17359 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "パーティションキー式はシステム列への参照を含むことができません" -#: commands/tablecmds.c:15870 +#: commands/tablecmds.c:17389 #, c-format msgid "cannot use constant expression as partition key" msgstr "定数式をパーティションキーとして使うことはできません" -#: commands/tablecmds.c:15891 +#: commands/tablecmds.c:17410 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "パーティション式で使用する照合順序を特定できませんでした" -#: commands/tablecmds.c:15926 +#: commands/tablecmds.c:17445 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "ハッシュ演算子クラスを指定するか、もしくはこのデータ型にデフォルトのハッシュ演算子クラスを定義する必要があります。" -#: commands/tablecmds.c:15932 +#: commands/tablecmds.c:17451 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "btree演算子クラスを指定するか、もしくはこのデータ型にデフォルトのbtree演算子クラスを定義するかする必要があります。" -#: commands/tablecmds.c:16077 -#, c-format -msgid "partition constraint for table \"%s\" is implied by existing constraints" -msgstr "テーブル\"%s\"のパーティション制約は既存の制約によって暗黙的に満たされています" - -#: commands/tablecmds.c:16081 partitioning/partbounds.c:3131 partitioning/partbounds.c:3182 -#, c-format -msgid "updated partition constraint for default partition \"%s\" is implied by existing constraints" -msgstr "デフォルトパーティション \"%s\" に対する更新されたパーティション制約は既存の制約によって暗黙的に満たされています" - -#: commands/tablecmds.c:16180 +#: commands/tablecmds.c:17702 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\"はすでパーティションです" -#: commands/tablecmds.c:16186 +#: commands/tablecmds.c:17708 #, c-format msgid "cannot attach a typed table as partition" msgstr "型付けされたテーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:16202 +#: commands/tablecmds.c:17724 #, c-format msgid "cannot attach inheritance child as partition" msgstr "継承子テーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:16216 +#: commands/tablecmds.c:17738 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "継承親テーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:16250 +#: commands/tablecmds.c:17772 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" -msgstr "一時リレーションを永続リレーション \"%s\" の子テーブルとしてアタッチすることはできません" +msgstr "一時リレーションを永続リレーション \"%s\" のパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:16258 +#: commands/tablecmds.c:17780 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "永続リレーションを一時リレーション\"%s\"のパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:16266 +#: commands/tablecmds.c:17788 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "他セッションの一時リレーションのパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:16273 +#: commands/tablecmds.c:17795 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "他セッションの一時リレーションにパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:16293 +#: commands/tablecmds.c:17815 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "テーブル\"%1$s\"は親テーブル\"%3$s\"にない列\"%2$s\"を含んでいます" -#: commands/tablecmds.c:16296 +#: commands/tablecmds.c:17818 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "新しいパーティションは親に存在する列のみを含むことができます。" -#: commands/tablecmds.c:16308 +#: commands/tablecmds.c:17830 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "トリガ\"%s\"のため、テーブル\"%s\"はパーティション子テーブルにはなれません" -#: commands/tablecmds.c:16310 commands/trigger.c:447 +#: commands/tablecmds.c:17832 commands/trigger.c:473 #, c-format msgid "ROW triggers with transition tables are not supported on partitions" msgstr "遷移テーブルを使用するROWトリガはパーティションではサポートされません" -#: commands/tablecmds.c:16473 +#: commands/tablecmds.c:18011 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "外部テーブル\"%s\"はパーティションテーブル\"%s\"の子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:16476 +#: commands/tablecmds.c:18014 +#, c-format +msgid "Partitioned table \"%s\" contains unique indexes." +msgstr "パーティション親テーブル\"%s\"はユニークインデックスを持っています。" + +#: commands/tablecmds.c:18325 +#, c-format +msgid "cannot detach partitions concurrently when a default partition exists" +msgstr "デフォルトパーティションを持つパーティションは並列的に取り外しはできません" + +#: commands/tablecmds.c:18434 +#, c-format +msgid "partitioned table \"%s\" was removed concurrently" +msgstr "パーティション親テーブル\"%s\"には CREATE INDEX CONCURRENTLY は実行できません" + +#: commands/tablecmds.c:18440 #, c-format -msgid "Table \"%s\" contains unique indexes." -msgstr "テーブル\"%s\"はユニークインデックスを持っています。" +msgid "partition \"%s\" was removed concurrently" +msgstr "パーティション子テーブル\\\"%s\\\"は同時に削除されました" -#: commands/tablecmds.c:17122 commands/tablecmds.c:17142 commands/tablecmds.c:17162 commands/tablecmds.c:17181 commands/tablecmds.c:17223 +#: commands/tablecmds.c:18944 commands/tablecmds.c:18964 commands/tablecmds.c:18984 commands/tablecmds.c:19003 commands/tablecmds.c:19045 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "インデックス\"%s\"をインデックス\"%s\"の子インデックスとしてアタッチすることはできません" -#: commands/tablecmds.c:17125 +#: commands/tablecmds.c:18947 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "インデックス\"%s\"はすでに別のインデックスにアタッチされています。" -#: commands/tablecmds.c:17145 +#: commands/tablecmds.c:18967 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "インデックス\"%s\"はテーブル\"%s\"のどの子テーブルのインデックスでもありません。" -#: commands/tablecmds.c:17165 +#: commands/tablecmds.c:18987 #, c-format msgid "The index definitions do not match." msgstr "インデックス定義が合致しません。" -#: commands/tablecmds.c:17184 +#: commands/tablecmds.c:19006 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "インデックス\"%s\"はテーブル\"%s\"の制約に属していますが、インデックス\"%s\"には制約がありません。" -#: commands/tablecmds.c:17226 +#: commands/tablecmds.c:19048 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "子テーブル\"%s\"にはすでに他のインデックスがアタッチされています。" -#: commands/tablespace.c:162 commands/tablespace.c:179 commands/tablespace.c:190 commands/tablespace.c:198 commands/tablespace.c:638 replication/slot.c:1374 storage/file/copydir.c:47 +#: commands/tablecmds.c:19278 #, c-format -msgid "could not create directory \"%s\": %m" -msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" +msgid "column data type %s does not support compression" +msgstr "列データ型%sは圧縮をサポートしていません" + +#: commands/tablecmds.c:19285 +#, c-format +msgid "invalid compression method \"%s\"" +msgstr "無効な圧縮方式\"%s\"" -#: commands/tablespace.c:209 +#: commands/tablespace.c:211 commands/tablespace.c:675 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "ディレクトリ\"%s\"のstatができませんでした: %m" -#: commands/tablespace.c:218 +#: commands/tablespace.c:220 commands/tablespace.c:686 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "\"%s\"は存在しますが、ディレクトリではありません" -#: commands/tablespace.c:249 +#: commands/tablespace.c:252 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "テーブル空間\"%s\"を作成する権限がありません" -#: commands/tablespace.c:251 +#: commands/tablespace.c:254 #, c-format msgid "Must be superuser to create a tablespace." msgstr "テーブル空間を生成するにはスーパユーザである必要があります。" -#: commands/tablespace.c:267 +#: commands/tablespace.c:270 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "テーブル空間の場所には単一引用符を含めることができません" -#: commands/tablespace.c:277 +#: commands/tablespace.c:283 #, c-format msgid "tablespace location must be an absolute path" msgstr "テーブル空間の場所は絶対パスでなければなりません" -#: commands/tablespace.c:289 +#: commands/tablespace.c:295 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "テーブル空間の場所\"%s\"は長すぎます" -#: commands/tablespace.c:296 +#: commands/tablespace.c:302 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "テーブル空間の場所はデータディレクトリの中に指定すべきではありません" -#: commands/tablespace.c:305 commands/tablespace.c:965 +#: commands/tablespace.c:311 commands/tablespace.c:1017 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "テーブル空間名\"%s\"を受け付けられません" -#: commands/tablespace.c:307 commands/tablespace.c:966 +#: commands/tablespace.c:313 commands/tablespace.c:1018 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "接頭辞\"pg_\"はシステムテーブル空間用に予約されています" -#: commands/tablespace.c:326 commands/tablespace.c:987 +#: commands/tablespace.c:332 commands/tablespace.c:1039 #, c-format msgid "tablespace \"%s\" already exists" msgstr "テーブル空間\"%s\"はすでに存在します" -#: commands/tablespace.c:442 commands/tablespace.c:948 commands/tablespace.c:1037 commands/tablespace.c:1106 commands/tablespace.c:1252 commands/tablespace.c:1455 +#: commands/tablespace.c:350 +#, c-format +msgid "pg_tablespace OID value not set when in binary upgrade mode" +msgstr "バイナリアップグレードモード中にpg_tablespaceのOID値が設定されてません" + +#: commands/tablespace.c:462 commands/tablespace.c:1000 commands/tablespace.c:1089 commands/tablespace.c:1158 commands/tablespace.c:1304 commands/tablespace.c:1507 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "テーブル空間\"%s\"は存在しません" -#: commands/tablespace.c:448 +#: commands/tablespace.c:468 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "テーブル空間\"%s\"は存在しません、スキップします" -#: commands/tablespace.c:525 +#: commands/tablespace.c:494 +#, c-format +msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" +msgstr "一部のオブジェクトが依存しているためテーブルスペース\"%s\"は削除できません" + +#: commands/tablespace.c:561 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "テーブル空間\"%s\"は空ではありません" -#: commands/tablespace.c:597 +#: commands/tablespace.c:653 #, c-format msgid "directory \"%s\" does not exist" msgstr "ディレクトリ\"%s\"は存在しません" -#: commands/tablespace.c:598 +#: commands/tablespace.c:654 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "サーバを再起動する前にテーブルスペース用のディレクトリを作成してください" -#: commands/tablespace.c:603 +#: commands/tablespace.c:659 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "ディレクトリ\"%s\"に権限を設定できませんでした: %m" -#: commands/tablespace.c:633 +#: commands/tablespace.c:691 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "ディレクトリ\"%s\"はすでにテーブルスペースとして使われています" -#: commands/tablespace.c:757 commands/tablespace.c:770 commands/tablespace.c:806 commands/tablespace.c:898 storage/file/fd.c:3108 storage/file/fd.c:3448 +#: commands/tablespace.c:809 commands/tablespace.c:822 commands/tablespace.c:858 commands/tablespace.c:950 storage/file/fd.c:3255 storage/file/fd.c:3669 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を削除できませんでした: %m" -#: commands/tablespace.c:819 commands/tablespace.c:907 +#: commands/tablespace.c:871 commands/tablespace.c:959 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を削除できませんでした: %m" -#: commands/tablespace.c:829 commands/tablespace.c:916 +#: commands/tablespace.c:881 commands/tablespace.c:968 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "\"%s\"はディレクトリでもシンボリックリンクでもありません" -#: commands/tablespace.c:1111 +#: commands/tablespace.c:1163 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "テーブル空間\"%s\"は存在しません" -#: commands/tablespace.c:1554 +#: commands/tablespace.c:1609 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "テーブル空間%u用のディレクトリを削除することができませんでした" -#: commands/tablespace.c:1556 +#: commands/tablespace.c:1611 #, c-format msgid "You can remove the directories manually if necessary." msgstr "必要ならば手作業でこのディレクトリを削除することができます" -#: commands/trigger.c:204 commands/trigger.c:215 +#: commands/trigger.c:229 commands/trigger.c:240 #, c-format msgid "\"%s\" is a table" msgstr "\"%s\"はテーブルです" -#: commands/trigger.c:206 commands/trigger.c:217 +#: commands/trigger.c:231 commands/trigger.c:242 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "テーブルは INSTEAD OF トリガーを持つことができません" -#: commands/trigger.c:238 +#: commands/trigger.c:263 #, c-format msgid "\"%s\" is a partitioned table" -msgstr "\"%s\"はパーティションテーブルです" +msgstr "\"%s\"はパーティション親テーブルです" -#: commands/trigger.c:240 +#: commands/trigger.c:265 #, c-format msgid "Triggers on partitioned tables cannot have transition tables." msgstr "パーティションテーブルに対するトリガは遷移テーブルを持てません。" -#: commands/trigger.c:252 commands/trigger.c:259 commands/trigger.c:429 +#: commands/trigger.c:277 commands/trigger.c:284 commands/trigger.c:455 #, c-format msgid "\"%s\" is a view" msgstr "\"%s\"はビューです" -#: commands/trigger.c:254 +#: commands/trigger.c:279 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "ビューは行レベルの BEFORE / AFTER トリガーを持つことができません" -#: commands/trigger.c:261 +#: commands/trigger.c:286 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "ビューは TRUNCATE トリガーを持つことができません" -#: commands/trigger.c:269 commands/trigger.c:276 commands/trigger.c:288 commands/trigger.c:422 +#: commands/trigger.c:294 commands/trigger.c:301 commands/trigger.c:313 commands/trigger.c:448 #, c-format msgid "\"%s\" is a foreign table" msgstr "\"%s\"は外部テーブルです" -#: commands/trigger.c:271 +#: commands/trigger.c:296 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "外部テーブルは INSTEAD OF トリガを持つことができません。" -#: commands/trigger.c:278 +#: commands/trigger.c:303 #, c-format msgid "Foreign tables cannot have TRUNCATE triggers." msgstr "外部テーブルは TRUNCATE トリガを持つことができません。" -#: commands/trigger.c:290 +#: commands/trigger.c:315 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "外部テーブルは制約トリガを持つことができません。" -#: commands/trigger.c:365 +#: commands/trigger.c:320 commands/trigger.c:1375 commands/trigger.c:1482 +#, c-format +msgid "relation \"%s\" cannot have triggers" +msgstr "リレーション\"%s\"にはトリガーを設定できません" + +#: commands/trigger.c:391 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "TRUNCATE FOR EACH ROW トリガはサポートされていません" -#: commands/trigger.c:373 +#: commands/trigger.c:399 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "INSTEAD OF トリガーは FOR EACH ROW でなければなりません" -#: commands/trigger.c:377 +#: commands/trigger.c:403 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "INSTEAD OF トリガーは WHEN 条件を持つことができません" -#: commands/trigger.c:381 +#: commands/trigger.c:407 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "INSTEAD OF トリガーは列リストを持つことができません" -#: commands/trigger.c:410 +#: commands/trigger.c:436 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "REFERENCING句でのROW変数の命名はサポートされていません" -#: commands/trigger.c:411 +#: commands/trigger.c:437 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "遷移テーブルを指定するには OLD TABLE または NEW TABLE を使ってください" -#: commands/trigger.c:424 +#: commands/trigger.c:450 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "外部テーブルに対するトリガは遷移テーブルを持てません。" -#: commands/trigger.c:431 +#: commands/trigger.c:457 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "ビューに対するトリガは遷移テーブルを持てません。" -#: commands/trigger.c:451 +#: commands/trigger.c:477 #, c-format msgid "ROW triggers with transition tables are not supported on inheritance children" msgstr "遷移テーブルをもったROWトリガは継承子テーブルではサポートされません" -#: commands/trigger.c:457 +#: commands/trigger.c:483 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "遷移テーブル名はAFTERトリガでの指定可能です" -#: commands/trigger.c:462 +#: commands/trigger.c:488 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "遷移テーブルを使用するTRUNCATEトリガはサポートされていません" -#: commands/trigger.c:479 +#: commands/trigger.c:505 #, c-format msgid "transition tables cannot be specified for triggers with more than one event" msgstr "2つ以上のイベントに対するトリガには遷移テーブルは指定できません" -#: commands/trigger.c:490 +#: commands/trigger.c:516 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "列リストを指定したトリガに対しては遷移テーブルは指定できません" -#: commands/trigger.c:507 +#: commands/trigger.c:533 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "NEW TABLE はINSERTまたはUPDATEトリガに対してのみ指定可能です" -#: commands/trigger.c:512 +#: commands/trigger.c:538 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE は複数回指定できません" -#: commands/trigger.c:522 +#: commands/trigger.c:548 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE はDELETEまたはUPDATEトリガに対してのみ指定可能です" -#: commands/trigger.c:527 +#: commands/trigger.c:553 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE は複数回指定できません" -#: commands/trigger.c:537 +#: commands/trigger.c:563 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "OLD TABLE の名前と NEW TABLE の名前は同じにはできません" -#: commands/trigger.c:601 commands/trigger.c:614 +#: commands/trigger.c:627 commands/trigger.c:640 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "ステートメントトリガーの WHEN 条件では列の値を参照できません" -#: commands/trigger.c:606 +#: commands/trigger.c:632 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "INSERT トリガーの WHEN 条件では OLD 値を参照できません" -#: commands/trigger.c:619 +#: commands/trigger.c:645 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "DELETE トリガーの WHEN 条件では NEW 値を参照できません" -#: commands/trigger.c:624 +#: commands/trigger.c:650 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "BEFORE トリガーの WHEN 条件では NEW システム列を参照できません" -#: commands/trigger.c:632 commands/trigger.c:640 +#: commands/trigger.c:658 commands/trigger.c:666 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "BEFORE トリガーの WHEN 条件では NEW の生成列を参照できません" -#: commands/trigger.c:633 +#: commands/trigger.c:659 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "行全体参照が使われていてかつ、このテーブルは生成カラムを含んでいます。" -#: commands/trigger.c:780 commands/trigger.c:1385 +#: commands/trigger.c:774 commands/trigger.c:1657 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "リレーション\"%2$s\"用のトリガ\"%1$s\"はすでに存在します" -#: commands/trigger.c:1271 commands/trigger.c:1432 commands/trigger.c:1568 +#: commands/trigger.c:787 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" +msgstr "リレーション\"%2$s\"のトリガー\"%1$s\"は内部トリガーまたは子トリガーです" + +#: commands/trigger.c:806 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" +msgstr "リレーション\"%2$s\"のトリガー\"%1$s\"は制約トリガーです" + +#: commands/trigger.c:1447 commands/trigger.c:1600 commands/trigger.c:1846 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "テーブル\"%2$s\"のトリガ\"%1$s\"は存在しません" -#: commands/trigger.c:1515 +#: commands/trigger.c:1572 +#, c-format +msgid "cannot rename trigger \"%s\" on table \"%s\"" +msgstr "テーブル\"%2$s\"のトリガー\"%1$s\"の名前は変更できません" + +#: commands/trigger.c:1574 +#, c-format +msgid "Rename trigger on partitioned table \"%s\" instead." +msgstr "パーティション親テーブル\"%s\"からの継承はできません" + +#: commands/trigger.c:1674 +#, c-format +msgid "renamed trigger \"%s\" on relation \"%s\"" +msgstr "リレーション\"%2$s\"のトリガー\"%1$s\"の名前を変更しました" + +#: commands/trigger.c:1814 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "権限がありません: \"%s\"はシステムトリガです" -#: commands/trigger.c:2116 +#: commands/trigger.c:2394 #, c-format msgid "trigger function %u returned null value" msgstr "トリガ関数%uはNULL値を返しました" -#: commands/trigger.c:2176 commands/trigger.c:2390 commands/trigger.c:2625 commands/trigger.c:2933 +#: commands/trigger.c:2454 commands/trigger.c:2672 commands/trigger.c:2922 commands/trigger.c:3255 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "BEFORE STATEMENTトリガは値を返すことができません" -#: commands/trigger.c:2250 +#: commands/trigger.c:2530 #, c-format msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" msgstr "BEFORE FOR EACH ROWトリガの実行では、他のパーティションへの行の移動はサポートされていません" -#: commands/trigger.c:2251 commands/trigger.c:2755 +#: commands/trigger.c:2531 #, c-format msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "トリガ\"%s\"の実行前には、この行はパーティション\"%s.%s\"に置かれるはずでした。" -#: commands/trigger.c:2754 -#, c-format -msgid "moving row to another partition during a BEFORE trigger is not supported" -msgstr "BEFOREトリガの実行では、他のパーティションへの行の移動はサポートされません" - -#: commands/trigger.c:2996 executor/nodeModifyTable.c:1380 executor/nodeModifyTable.c:1449 +#: commands/trigger.c:3329 executor/nodeModifyTable.c:2224 executor/nodeModifyTable.c:2307 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "更新対象のタプルはすでに現在のコマンドによって発行された操作によって変更されています" -#: commands/trigger.c:2997 executor/nodeModifyTable.c:840 executor/nodeModifyTable.c:914 executor/nodeModifyTable.c:1381 executor/nodeModifyTable.c:1450 +#: commands/trigger.c:3330 executor/nodeModifyTable.c:1410 executor/nodeModifyTable.c:1484 executor/nodeModifyTable.c:2225 executor/nodeModifyTable.c:2308 executor/nodeModifyTable.c:2966 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "他の行への変更を伝搬させるためにBEFOREトリガではなくAFTERトリガの使用を検討してください" -#: commands/trigger.c:3026 executor/nodeLockRows.c:225 executor/nodeLockRows.c:234 executor/nodeModifyTable.c:220 executor/nodeModifyTable.c:856 executor/nodeModifyTable.c:1397 executor/nodeModifyTable.c:1613 +#: commands/trigger.c:3359 executor/nodeLockRows.c:229 executor/nodeLockRows.c:238 executor/nodeModifyTable.c:329 executor/nodeModifyTable.c:1426 executor/nodeModifyTable.c:2242 executor/nodeModifyTable.c:2452 #, c-format msgid "could not serialize access due to concurrent update" msgstr "更新が同時に行われたためアクセスの直列化ができませんでした" -#: commands/trigger.c:3034 executor/nodeModifyTable.c:946 executor/nodeModifyTable.c:1467 executor/nodeModifyTable.c:1637 +#: commands/trigger.c:3367 executor/nodeModifyTable.c:1516 executor/nodeModifyTable.c:2325 executor/nodeModifyTable.c:2476 executor/nodeModifyTable.c:2832 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "削除が同時に行われたためアクセスの直列化ができませんでした" -#: commands/trigger.c:5094 +#: commands/trigger.c:4543 +#, c-format +msgid "cannot fire deferred trigger within security-restricted operation" +msgstr "セキュリティー制限操作中は、遅延トリガーは発火させられません" + +#: commands/trigger.c:5719 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "制約\"%s\"は遅延可能ではありません" -#: commands/trigger.c:5117 +#: commands/trigger.c:5742 #, c-format msgid "constraint \"%s\" does not exist" msgstr "制約\"%s\"は存在しません" -#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:636 +#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:635 #, c-format msgid "function %s should return type %s" msgstr "関数%sは型%sを返すことができません" -#: commands/tsearchcmds.c:195 +#: commands/tsearchcmds.c:194 #, c-format msgid "must be superuser to create text search parsers" msgstr "テキスト検索パーサを生成するにはスーパユーザである必要があります" -#: commands/tsearchcmds.c:248 +#: commands/tsearchcmds.c:247 #, c-format msgid "text search parser parameter \"%s\" not recognized" msgstr "テキスト検索パーサ\"%s\"は不明です" -#: commands/tsearchcmds.c:258 +#: commands/tsearchcmds.c:257 #, c-format msgid "text search parser start method is required" msgstr "テキスト検索パーサの開始メソッドが必要です" -#: commands/tsearchcmds.c:263 +#: commands/tsearchcmds.c:262 #, c-format msgid "text search parser gettoken method is required" msgstr "テキスト検索パーサのgettokenメソッドが必要です" -#: commands/tsearchcmds.c:268 +#: commands/tsearchcmds.c:267 #, c-format msgid "text search parser end method is required" msgstr "テキスト検索パーサの終了メソッドが必要です" -#: commands/tsearchcmds.c:273 +#: commands/tsearchcmds.c:272 #, c-format msgid "text search parser lextypes method is required" msgstr "テキスト検索パーサのlextypesメソッドが必要です" -#: commands/tsearchcmds.c:367 +#: commands/tsearchcmds.c:366 #, c-format msgid "text search template \"%s\" does not accept options" msgstr "テキスト検索テンプレート\"%s\"はオプションを受け付けません" -#: commands/tsearchcmds.c:441 +#: commands/tsearchcmds.c:440 #, c-format msgid "text search template is required" msgstr "テキスト検索テンプレートが必要です" -#: commands/tsearchcmds.c:703 +#: commands/tsearchcmds.c:701 #, c-format msgid "must be superuser to create text search templates" msgstr "テキスト検索テンプレートを生成するにはスーパユーザである必要があります" -#: commands/tsearchcmds.c:745 +#: commands/tsearchcmds.c:743 #, c-format msgid "text search template parameter \"%s\" not recognized" msgstr "テキスト検索テンプレートのパラメータ\"%sは不明です。" -#: commands/tsearchcmds.c:755 +#: commands/tsearchcmds.c:753 #, c-format msgid "text search template lexize method is required" msgstr "テキスト検索テンプレートのlexizeメソッドが必要です" -#: commands/tsearchcmds.c:935 +#: commands/tsearchcmds.c:933 #, c-format msgid "text search configuration parameter \"%s\" not recognized" msgstr "テキスト検索設定のパラメータ\"%s\"は不明です" -#: commands/tsearchcmds.c:942 +#: commands/tsearchcmds.c:940 #, c-format msgid "cannot specify both PARSER and COPY options" msgstr "PARSERとCOPYオプションをまとめて指定できません" -#: commands/tsearchcmds.c:978 +#: commands/tsearchcmds.c:976 #, c-format msgid "text search parser is required" msgstr "テキスト検索パーサが必要です" -#: commands/tsearchcmds.c:1202 +#: commands/tsearchcmds.c:1200 #, c-format msgid "token type \"%s\" does not exist" msgstr "トークン型\"%s\"は存在しません" -#: commands/tsearchcmds.c:1429 +#: commands/tsearchcmds.c:1427 #, c-format msgid "mapping for token type \"%s\" does not exist" msgstr "トークン型\"%s\"に対するマップは存在しません" -#: commands/tsearchcmds.c:1435 +#: commands/tsearchcmds.c:1433 #, c-format msgid "mapping for token type \"%s\" does not exist, skipping" msgstr "トークン型\"%s\"に対するマップは存在しません、スキップします" -#: commands/tsearchcmds.c:1598 commands/tsearchcmds.c:1713 +#: commands/tsearchcmds.c:1596 commands/tsearchcmds.c:1711 #, c-format msgid "invalid parameter list format: \"%s\"" msgstr "不正パラメータリストの書式です: \"%s\"" -#: commands/typecmds.c:206 +#: commands/typecmds.c:217 #, c-format msgid "must be superuser to create a base type" msgstr "基本型を作成するにはスーパユーザである必要があります" -#: commands/typecmds.c:264 +#: commands/typecmds.c:275 #, c-format msgid "Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE." msgstr "最初に型をシェル型として生成して、続いてI/O関数を生成した後に完全な CREATE TYPE を実行してください。" -#: commands/typecmds.c:314 commands/typecmds.c:1394 commands/typecmds.c:3832 +#: commands/typecmds.c:327 commands/typecmds.c:1450 commands/typecmds.c:4268 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "型の属性\"%s\"は不明です" -#: commands/typecmds.c:370 +#: commands/typecmds.c:382 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "型カテゴリ\"%s\"が不正です。単純なASCIIでなければなりません" -#: commands/typecmds.c:389 +#: commands/typecmds.c:401 #, c-format msgid "array element type cannot be %s" msgstr "%sを配列要素の型にすることはできません" -#: commands/typecmds.c:421 +#: commands/typecmds.c:433 #, c-format msgid "alignment \"%s\" not recognized" msgstr "アライメント\"%s\"は不明です" -#: commands/typecmds.c:438 commands/typecmds.c:3718 +#: commands/typecmds.c:450 commands/typecmds.c:4142 #, c-format msgid "storage \"%s\" not recognized" msgstr "格納方式\"%s\"は不明です" -#: commands/typecmds.c:449 +#: commands/typecmds.c:461 #, c-format msgid "type input function must be specified" msgstr "型の入力関数の指定が必要です" -#: commands/typecmds.c:453 +#: commands/typecmds.c:465 #, c-format msgid "type output function must be specified" msgstr "型の出力関数の指定が必要です" -#: commands/typecmds.c:458 +#: commands/typecmds.c:470 #, c-format msgid "type modifier output function is useless without a type modifier input function" msgstr "型修正入力関数がない場合の型修正出力関数は意味がありません" -#: commands/typecmds.c:745 +#: commands/typecmds.c:512 +#, c-format +msgid "element type cannot be specified without a subscripting function" +msgstr "添字処理関数なしで要素型を指定することはできません" + +#: commands/typecmds.c:781 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "\"%s\"はドメインの基本型として無効です" -#: commands/typecmds.c:837 +#: commands/typecmds.c:879 #, c-format msgid "multiple default expressions" msgstr "デフォルト式が複数あります" -#: commands/typecmds.c:900 commands/typecmds.c:909 +#: commands/typecmds.c:942 commands/typecmds.c:951 #, c-format msgid "conflicting NULL/NOT NULL constraints" msgstr "NULL制約とNOT NULL制約が競合しています" -#: commands/typecmds.c:925 +#: commands/typecmds.c:967 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "ドメインに対する検査制約はNO INHERITとマークすることができません" -#: commands/typecmds.c:934 commands/typecmds.c:2536 +#: commands/typecmds.c:976 commands/typecmds.c:2960 #, c-format msgid "unique constraints not possible for domains" msgstr "ドメインでは一意性制約は使用できません" -#: commands/typecmds.c:940 commands/typecmds.c:2542 +#: commands/typecmds.c:982 commands/typecmds.c:2966 #, c-format msgid "primary key constraints not possible for domains" msgstr "ドメインではプライマリキー制約はできません" -#: commands/typecmds.c:946 commands/typecmds.c:2548 +#: commands/typecmds.c:988 commands/typecmds.c:2972 #, c-format msgid "exclusion constraints not possible for domains" msgstr "ドメインでは排除制約は使用できません" -#: commands/typecmds.c:952 commands/typecmds.c:2554 +#: commands/typecmds.c:994 commands/typecmds.c:2978 #, c-format msgid "foreign key constraints not possible for domains" msgstr "ドメイン用の外部キー制約はできません" -#: commands/typecmds.c:961 commands/typecmds.c:2563 +#: commands/typecmds.c:1003 commands/typecmds.c:2987 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "ドメインでは制約遅延の指定はサポートしていません" -#: commands/typecmds.c:1271 utils/cache/typcache.c:2430 +#: commands/typecmds.c:1317 utils/cache/typcache.c:2567 #, c-format msgid "%s is not an enum" msgstr "%s は数値ではありません" -#: commands/typecmds.c:1402 +#: commands/typecmds.c:1458 #, c-format msgid "type attribute \"subtype\" is required" msgstr "型の属性\"subtype\"が必要です" -#: commands/typecmds.c:1407 +#: commands/typecmds.c:1463 #, c-format msgid "range subtype cannot be %s" msgstr "範囲の派生元型を%sにすることはできません" -#: commands/typecmds.c:1426 +#: commands/typecmds.c:1482 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "範囲の照合順序が指定されましたが、派生もと型が照合順序をサポートしていません" -#: commands/typecmds.c:1436 +#: commands/typecmds.c:1492 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "事前にシェル型を生成せずに正規化関数を指定することはできません" -#: commands/typecmds.c:1437 +#: commands/typecmds.c:1493 #, c-format msgid "Create the type as a shell type, then create its canonicalization function, then do a full CREATE TYPE." msgstr "最初に型をシェル型として生成して、続いて正規化関数を生成した後に完全な CREATE TYPE を実行してください。" -#: commands/typecmds.c:1648 +#: commands/typecmds.c:1966 #, c-format msgid "type input function %s has multiple matches" msgstr "型の入力関数%sが複数合致します" -#: commands/typecmds.c:1666 +#: commands/typecmds.c:1984 #, c-format msgid "type input function %s must return type %s" msgstr "型の入力関数%sは型%sを返す必要があります" -#: commands/typecmds.c:1682 +#: commands/typecmds.c:2000 #, c-format msgid "type input function %s should not be volatile" msgstr "型の入力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:1710 +#: commands/typecmds.c:2028 #, c-format msgid "type output function %s must return type %s" msgstr "型の出力関数%sは型%sを返す必要があります" -#: commands/typecmds.c:1717 +#: commands/typecmds.c:2035 #, c-format msgid "type output function %s should not be volatile" msgstr "型の出力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:1746 +#: commands/typecmds.c:2064 #, c-format msgid "type receive function %s has multiple matches" msgstr "型の受信関数 %s が複数合致しました" -#: commands/typecmds.c:1764 +#: commands/typecmds.c:2082 #, c-format msgid "type receive function %s must return type %s" msgstr "型の受信関数%sは型%sを返す必要があります" -#: commands/typecmds.c:1771 +#: commands/typecmds.c:2089 #, c-format msgid "type receive function %s should not be volatile" msgstr "型の受信関数%sはvolatileであってはなりません" -#: commands/typecmds.c:1799 +#: commands/typecmds.c:2117 #, c-format msgid "type send function %s must return type %s" msgstr "型の送信関数%sは型%sを返す必要があります" -#: commands/typecmds.c:1806 +#: commands/typecmds.c:2124 #, c-format msgid "type send function %s should not be volatile" msgstr "型の送信関数%sはvolatileであってはなりません" -#: commands/typecmds.c:1833 +#: commands/typecmds.c:2151 #, c-format msgid "typmod_in function %s must return type %s" msgstr "typmod_in関数%sは型%sを返す必要があります" -#: commands/typecmds.c:1840 +#: commands/typecmds.c:2158 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "型修正子の入力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:1867 +#: commands/typecmds.c:2185 #, c-format msgid "typmod_out function %s must return type %s" msgstr "typmod_out関数%sは型%sを返す必要があります" -#: commands/typecmds.c:1874 +#: commands/typecmds.c:2192 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "型修正子の出力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:1901 +#: commands/typecmds.c:2219 #, c-format msgid "type analyze function %s must return type %s" msgstr "型のANALYZE関数%sは%s型を返す必要があります" -#: commands/typecmds.c:1947 +#: commands/typecmds.c:2248 +#, c-format +msgid "type subscripting function %s must return type %s" +msgstr "型の添字処理関数%sは型%sを返す必要があります" + +#: commands/typecmds.c:2258 +#, c-format +msgid "user-defined types cannot use subscripting function %s" +msgstr "ユーザー定義型は添字処理関数%sを使用できません" + +#: commands/typecmds.c:2304 #, c-format msgid "You must specify an operator class for the range type or define a default operator class for the subtype." msgstr "この範囲型に演算子クラスを指定するか、派生元の型でデフォルト演算子クラスを定義する必要があります。" -#: commands/typecmds.c:1978 +#: commands/typecmds.c:2335 #, c-format msgid "range canonical function %s must return range type" msgstr "範囲の正規化関数 %s は範囲型を返す必要があります" -#: commands/typecmds.c:1984 +#: commands/typecmds.c:2341 #, c-format msgid "range canonical function %s must be immutable" msgstr "範囲の正規化関数 %s は不変関数でなければなりません" -#: commands/typecmds.c:2020 +#: commands/typecmds.c:2377 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "範囲の派生元の型の差分関数 %s は %s型を返す必要があります" -#: commands/typecmds.c:2027 +#: commands/typecmds.c:2384 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "範囲の派生元の型の差分関数 %s は不変関数である必要があります" -#: commands/typecmds.c:2054 +#: commands/typecmds.c:2411 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_typeの配列型OIDが設定されていません" -#: commands/typecmds.c:2352 +#: commands/typecmds.c:2444 +#, c-format +msgid "pg_type multirange OID value not set when in binary upgrade mode" +msgstr "バイナリアップグレードモード中にpg_typeの複範囲型OIDの値が設定されていません" + +#: commands/typecmds.c:2477 +#, c-format +msgid "pg_type multirange array OID value not set when in binary upgrade mode" +msgstr "バイナリアップグレードモード中にpg_typeの複範囲配列型OIDの値が設定されていません" + +#: commands/typecmds.c:2776 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "テーブル\"%2$s\"の列\"%1$s\"にNULL値があります" -#: commands/typecmds.c:2465 commands/typecmds.c:2667 +#: commands/typecmds.c:2889 commands/typecmds.c:3091 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"は存在しません" -#: commands/typecmds.c:2469 +#: commands/typecmds.c:2893 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"は存在しません、スキップします" -#: commands/typecmds.c:2674 +#: commands/typecmds.c:3098 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"は検査制約ではありません" -#: commands/typecmds.c:2780 +#: commands/typecmds.c:3204 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "テーブル\"%2$s\"の列\"%1$s\"に新しい制約に違反する値があります" -#: commands/typecmds.c:3009 commands/typecmds.c:3207 commands/typecmds.c:3289 commands/typecmds.c:3476 +#: commands/typecmds.c:3433 commands/typecmds.c:3633 commands/typecmds.c:3714 commands/typecmds.c:3900 #, c-format msgid "%s is not a domain" msgstr "%s はドメインではありません" -#: commands/typecmds.c:3041 +#: commands/typecmds.c:3465 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"はすでに存在します" -#: commands/typecmds.c:3092 +#: commands/typecmds.c:3516 #, c-format msgid "cannot use table references in domain check constraint" msgstr "ドメインの検査制約ではテーブル参照を使用できません" -#: commands/typecmds.c:3219 commands/typecmds.c:3301 commands/typecmds.c:3593 +#: commands/typecmds.c:3645 commands/typecmds.c:3726 commands/typecmds.c:4017 #, c-format msgid "%s is a table's row type" msgstr "%sはテーブルの行型です" -#: commands/typecmds.c:3221 commands/typecmds.c:3303 commands/typecmds.c:3595 +#: commands/typecmds.c:3647 commands/typecmds.c:3728 commands/typecmds.c:4019 #, c-format msgid "Use ALTER TABLE instead." msgstr "代わりにALTER TABLEを使用してください" -#: commands/typecmds.c:3228 commands/typecmds.c:3310 commands/typecmds.c:3508 +#: commands/typecmds.c:3653 commands/typecmds.c:3734 commands/typecmds.c:3932 #, c-format msgid "cannot alter array type %s" msgstr "配列型%sを変更できません" -#: commands/typecmds.c:3230 commands/typecmds.c:3312 commands/typecmds.c:3510 +#: commands/typecmds.c:3655 commands/typecmds.c:3736 commands/typecmds.c:3934 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "型%sを変更することができます。これは同時にその配列型も変更します。" -#: commands/typecmds.c:3578 +#: commands/typecmds.c:4002 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "型\"%s\"はスキーマ\"%s\"内にすでに存在します" -#: commands/typecmds.c:3746 +#: commands/typecmds.c:4170 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "型の格納方式をPLAINには変更できません" -#: commands/typecmds.c:3827 +#: commands/typecmds.c:4263 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "型の属性\"%s\"は変更できません" -#: commands/typecmds.c:3845 +#: commands/typecmds.c:4281 #, c-format msgid "must be superuser to alter a type" msgstr "型の変更を行うにはスーパユーザである必要があります" -#: commands/typecmds.c:3866 commands/typecmds.c:3876 +#: commands/typecmds.c:4302 commands/typecmds.c:4311 #, c-format msgid "%s is not a base type" msgstr "\"%s\"は基本型ではありません" -#: commands/user.c:140 +#: commands/user.c:138 #, c-format msgid "SYSID can no longer be specified" msgstr "SYSIDはもう指定することができません" -#: commands/user.c:294 +#: commands/user.c:256 #, c-format msgid "must be superuser to create superusers" msgstr "スーパユーザを生成するにはスーパユーザである必要があります" -#: commands/user.c:301 +#: commands/user.c:263 #, c-format msgid "must be superuser to create replication users" msgstr "レプリケーションユーザを生成するにはスーパユーザである必要があります" -#: commands/user.c:308 commands/user.c:734 +#: commands/user.c:270 #, c-format -msgid "must be superuser to change bypassrls attribute" -msgstr "bypassrls属性を変更するにはスーパユーザである必要があります" +msgid "must be superuser to create bypassrls users" +msgstr "bypassrls 設定のユーザーを作成するにはスーパーユーザーである必要があります" -#: commands/user.c:315 +#: commands/user.c:277 #, c-format msgid "permission denied to create role" msgstr "ロールを作成する権限がありません" -#: commands/user.c:325 commands/user.c:1224 commands/user.c:1231 gram.y:14900 gram.y:14938 utils/adt/acl.c:5327 utils/adt/acl.c:5333 +#: commands/user.c:287 commands/user.c:1139 commands/user.c:1146 gram.y:16677 gram.y:16722 utils/adt/acl.c:5331 utils/adt/acl.c:5337 #, c-format msgid "role name \"%s\" is reserved" msgstr "ロール名\"%s\"は予約されています" -#: commands/user.c:327 commands/user.c:1226 commands/user.c:1233 +#: commands/user.c:289 commands/user.c:1141 commands/user.c:1148 #, c-format msgid "Role names starting with \"pg_\" are reserved." msgstr "\"pg_\"で始まるロール名は予約されています。" -#: commands/user.c:348 commands/user.c:1248 +#: commands/user.c:310 commands/user.c:1163 #, c-format msgid "role \"%s\" already exists" msgstr "ロール\"%s\"はすでに存在します" -#: commands/user.c:414 commands/user.c:843 +#: commands/user.c:376 commands/user.c:754 #, c-format msgid "empty string is not a valid password, clearing password" msgstr "空の文字列はパスワードとして使えません、パスワードを消去します" -#: commands/user.c:443 +#: commands/user.c:405 #, c-format msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_authidのOIDが設定されていません" -#: commands/user.c:720 commands/user.c:944 commands/user.c:1485 commands/user.c:1627 +#: commands/user.c:638 #, c-format -msgid "must be superuser to alter superusers" -msgstr "スーパユーザを更新するにはスーパユーザである必要があります" +msgid "must be superuser to alter superuser roles or change superuser attribute" +msgstr "スーパーユーザーの変更やsuperuser属性の変更のためにはスーパーユーザーである必要があります" + +#: commands/user.c:645 +#, c-format +msgid "must be superuser to alter replication roles or change replication attribute" +msgstr "レプリケーションユーザーの変更やreplication属性の変更のためにはスーパーユーザーである必要があります" -#: commands/user.c:727 +#: commands/user.c:652 #, c-format -msgid "must be superuser to alter replication users" -msgstr "レプリケーションユーザを更新するにはスーパユーザである必要があります" +msgid "must be superuser to change bypassrls attribute" +msgstr "bypassrls属性を変更するにはスーパユーザである必要があります" -#: commands/user.c:750 commands/user.c:951 +#: commands/user.c:661 commands/user.c:866 #, c-format msgid "permission denied" msgstr "権限がありません" -#: commands/user.c:981 +#: commands/user.c:859 commands/user.c:1400 commands/user.c:1573 +#, c-format +msgid "must be superuser to alter superusers" +msgstr "スーパユーザを更新するにはスーパユーザである必要があります" + +#: commands/user.c:896 #, c-format msgid "must be superuser to alter settings globally" msgstr "サーバ全体の設定を変更するにはスーパユーザである必要があります" -#: commands/user.c:1003 +#: commands/user.c:918 #, c-format msgid "permission denied to drop role" msgstr "ロールを削除する権限がありません" -#: commands/user.c:1028 +#: commands/user.c:943 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "DROP ROLE で特殊ロールの識別子は使えません" -#: commands/user.c:1038 commands/user.c:1195 commands/variable.c:770 commands/variable.c:844 utils/adt/acl.c:5184 utils/adt/acl.c:5231 utils/adt/acl.c:5259 utils/adt/acl.c:5277 utils/init/miscinit.c:677 +#: commands/user.c:953 commands/user.c:1110 commands/variable.c:778 commands/variable.c:781 commands/variable.c:865 commands/variable.c:868 utils/adt/acl.c:5186 utils/adt/acl.c:5234 utils/adt/acl.c:5262 utils/adt/acl.c:5281 utils/init/miscinit.c:725 #, c-format msgid "role \"%s\" does not exist" msgstr "ロール\"%s\"は存在しません" -#: commands/user.c:1043 +#: commands/user.c:958 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "ロール\"%s\"は存在しません、スキップします" -#: commands/user.c:1056 commands/user.c:1060 +#: commands/user.c:971 commands/user.c:975 #, c-format msgid "current user cannot be dropped" msgstr "現在のユーザを削除できません" -#: commands/user.c:1064 +#: commands/user.c:979 #, c-format msgid "session user cannot be dropped" msgstr "セッションのユーザを削除できません" -#: commands/user.c:1074 +#: commands/user.c:989 #, c-format msgid "must be superuser to drop superusers" msgstr "スーパユーザを削除するにはスーパユーザである必要があります" -#: commands/user.c:1090 +#: commands/user.c:1005 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "他のオブジェクトが依存していますのでロール\"%s\"を削除できません" -#: commands/user.c:1211 +#: commands/user.c:1126 #, c-format msgid "session user cannot be renamed" msgstr "セッションユーザの名前を変更できません" -#: commands/user.c:1215 +#: commands/user.c:1130 #, c-format msgid "current user cannot be renamed" msgstr "現在のユーザの名前を変更できません" -#: commands/user.c:1258 +#: commands/user.c:1173 #, c-format msgid "must be superuser to rename superusers" msgstr "スーパユーザの名前を変更するにはスーパユーザである必要があります" -#: commands/user.c:1265 +#: commands/user.c:1180 #, c-format msgid "permission denied to rename role" msgstr "ロールの名前を変更する権限がありません" -#: commands/user.c:1286 +#: commands/user.c:1201 #, c-format msgid "MD5 password cleared because of role rename" msgstr "ロール名が変更されたためMD5パスワードがクリアされました" -#: commands/user.c:1346 +#: commands/user.c:1261 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "列名が GRANT/REVOKE ROLE に含まれていてはなりません" -#: commands/user.c:1384 +#: commands/user.c:1299 #, c-format msgid "permission denied to drop objects" msgstr "オブジェクトを削除する権限がありません" -#: commands/user.c:1411 commands/user.c:1420 +#: commands/user.c:1326 commands/user.c:1335 #, c-format msgid "permission denied to reassign objects" msgstr "オブジェクトを再割当てする権限がありません" -#: commands/user.c:1493 commands/user.c:1635 +#: commands/user.c:1408 commands/user.c:1581 #, c-format msgid "must have admin option on role \"%s\"" msgstr "ロール\"%s\"には ADMIN OPTION が必要です" -#: commands/user.c:1510 +#: commands/user.c:1422 +#, c-format +msgid "role \"%s\" cannot have explicit members" +msgstr "ロール\"%s\"は明示的なメンバーを持てません" + +#: commands/user.c:1432 #, c-format msgid "must be superuser to set grantor" msgstr "権限付与者を指定するにはスーパユーザである必要があります" -#: commands/user.c:1535 +#: commands/user.c:1468 +#, c-format +msgid "role \"%s\" cannot be a member of any role" +msgstr "ロール\"%s\"はどのロールのメンバーにもなれません" + +#: commands/user.c:1481 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "ロール\"%s\"はロール\"%s\"のメンバです" -#: commands/user.c:1550 +#: commands/user.c:1496 #, c-format msgid "role \"%s\" is already a member of role \"%s\"" msgstr "ロール\"%s\"はすでにロール\"%s\"のメンバです" -#: commands/user.c:1657 +#: commands/user.c:1603 #, c-format msgid "role \"%s\" is not a member of role \"%s\"" msgstr "ロール\"%s\"はロール\"%s\"のメンバではありません" -#: commands/vacuum.c:129 +#: commands/vacuum.c:139 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "ANALYZEオプション\"%s\"が認識できません" -#: commands/vacuum.c:151 +#: commands/vacuum.c:177 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "パラレルオプションには0から%dまでの値である必要があります" -#: commands/vacuum.c:163 +#: commands/vacuum.c:189 #, c-format -msgid "parallel vacuum degree must be between 0 and %d" -msgstr "並列VACUUMの並列度は0から%dまでの値でなければなりません" +msgid "parallel workers for vacuum must be between 0 and %d" +msgstr "VACUUMの並列ワーカーの数はは0から%dまでの値でなければなりません" -#: commands/vacuum.c:180 +#: commands/vacuum.c:206 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "認識できないVACUUMオプション \"%s\"" -#: commands/vacuum.c:203 +#: commands/vacuum.c:229 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULLは並列実行できません" -#: commands/vacuum.c:219 +#: commands/vacuum.c:245 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "ANALYZE オプションは列リストが与えられているときのみ指定できます" -#: commands/vacuum.c:309 +#: commands/vacuum.c:335 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%sはVACUUMやANALYZEからは実行できません" -#: commands/vacuum.c:319 +#: commands/vacuum.c:345 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "VACUUM のオプションDISABLE_PAGE_SKIPPINGはFULLと同時には指定できません" -#: commands/vacuum.c:560 +#: commands/vacuum.c:352 +#, c-format +msgid "PROCESS_TOAST required with VACUUM FULL" +msgstr "VACUUM FULLではPROCESS_TOASTの指定が必須です" + +#: commands/vacuum.c:586 #, c-format msgid "skipping \"%s\" --- only superuser can vacuum it" msgstr "\"%s\"をスキップしています --- スーパユーザのみがVACUUMを実行できます" -#: commands/vacuum.c:564 +#: commands/vacuum.c:590 #, c-format msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" msgstr "\"%s\"をスキップしています --- スーパユーザもしくはデータベースの所有者のみがVACUUMを実行できます" -#: commands/vacuum.c:568 +#: commands/vacuum.c:594 #, c-format msgid "skipping \"%s\" --- only table or database owner can vacuum it" msgstr "\"%s\"を飛ばしています --- テーブルまたはデータベースの所有者のみがVACUUMを実行することができます" -#: commands/vacuum.c:583 +#: commands/vacuum.c:609 #, c-format msgid "skipping \"%s\" --- only superuser can analyze it" msgstr "\"%s\"をスキップしています --- スーパユーザのみがANALYZEを実行できます" -#: commands/vacuum.c:587 +#: commands/vacuum.c:613 #, c-format msgid "skipping \"%s\" --- only superuser or database owner can analyze it" msgstr "\"%s\"をスキップしています --- スーパユーザまたはデータベースの所有者のみがANALYZEを実行できます" -#: commands/vacuum.c:591 +#: commands/vacuum.c:617 #, c-format msgid "skipping \"%s\" --- only table or database owner can analyze it" msgstr "\"%s\"をスキップしています --- テーブルまたはデータベースの所有者のみがANALYZEを実行できます" -#: commands/vacuum.c:670 commands/vacuum.c:766 +#: commands/vacuum.c:696 commands/vacuum.c:792 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "\"%s\"のVACUUM処理をスキップしています -- ロックを獲得できませんでした" -#: commands/vacuum.c:675 +#: commands/vacuum.c:701 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "\"%s\"のVACUUM処理をスキップしています -- リレーションはすでに存在しません" -#: commands/vacuum.c:691 commands/vacuum.c:771 +#: commands/vacuum.c:717 commands/vacuum.c:797 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "\"%s\"のANALYZEをスキップしています --- ロック獲得できませんでした" -#: commands/vacuum.c:696 +#: commands/vacuum.c:722 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "\"%s\"のANALYZEをスキップします --- リレーションはすでに存在しません" -#: commands/vacuum.c:1011 +#: commands/vacuum.c:1041 #, c-format msgid "oldest xmin is far in the past" msgstr "最も古いxminが古すぎます" -#: commands/vacuum.c:1012 +#: commands/vacuum.c:1042 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -10820,32 +11625,65 @@ msgstr "" "周回問題を回避するためにすぐに実行中のトランザクションを終了してください。\n" "古い準備済みトランザクションのコミットまたはロールバック、もしくは古いレプリケーションスロットの削除が必要な場合もあります。" -#: commands/vacuum.c:1053 +#: commands/vacuum.c:1085 #, c-format msgid "oldest multixact is far in the past" msgstr "最古のマルチトランザクションが古すぎます" -#: commands/vacuum.c:1054 +#: commands/vacuum.c:1086 #, c-format msgid "Close open transactions with multixacts soon to avoid wraparound problems." msgstr "周回問題を回避するために、マルチトランザクションを使用している実行中のトランザクションをすぐにクローズしてください。" -#: commands/vacuum.c:1641 +#: commands/vacuum.c:1798 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "データベースの一部は20億トランザクション以上の間にVACUUMを実行されていませんでした" -#: commands/vacuum.c:1642 +#: commands/vacuum.c:1799 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "トランザクションの周回によるデータ損失が発生している可能性があります" -#: commands/vacuum.c:1804 +#: commands/vacuum.c:1963 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "\"%s\"をスキップしています --- テーブルではないものや、特別なシステムテーブルに対してはVACUUMを実行できません" -#: commands/variable.c:165 utils/misc/guc.c:11174 utils/misc/guc.c:11236 +#: commands/vacuum.c:2334 +#, c-format +msgid "scanned index \"%s\" to remove %d row versions" +msgstr "%2$d行バージョンを削除するためインデックス\"%1$s\"をスキャンしました" + +#: commands/vacuum.c:2353 +#, c-format +msgid "index \"%s\" now contains %.0f row versions in %u pages" +msgstr "現在インデックス\"%s\"は%.0f行バージョンを%uページで含んでいます" + +#: commands/vacuum.c:2357 +#, c-format +msgid "" +"%.0f index row versions were removed.\n" +"%u index pages were newly deleted.\n" +"%u index pages are currently deleted, of which %u are currently reusable." +msgstr "" +"%.0fインデックス行バージョンを削除\n" +"%uインデックスページを新たに削除\n" +"%uページが現在削除中、うち%uページが再利用可能。" + +#: commands/vacuumparallel.c:663 +#, c-format +msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" +msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" +msgstr[0] "インデックスのVACUUMのために%d個の並列VACUUMワーカを起動しました (計画値: %d)" + +#: commands/vacuumparallel.c:669 +#, c-format +msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" +msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" +msgstr[0] "インデックスのクリーンアップのために%d個の並列VACUUMワーカを起動しました (計画値: %d)" + +#: commands/variable.c:165 utils/misc/guc.c:11998 utils/misc/guc.c:12076 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "不明なキーワードです: \"%s\"" @@ -10905,7 +11743,7 @@ msgstr "SET TRANSACTION ISOLATION LEVEL は問い合わせより前に実行す msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" msgstr "SET TRANSACTION ISOLATION LEVELをサブトランザクションで呼び出してはなりません" -#: commands/variable.c:548 storage/lmgr/predicate.c:1623 +#: commands/variable.c:548 storage/lmgr/predicate.c:1694 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "ホットスタンバイ中はシリアライズモードを使用できません" @@ -10940,7 +11778,12 @@ msgstr "現在は\"client_encoding\"を変更できません。" msgid "cannot change client_encoding during a parallel operation" msgstr "並列処理中は\"client_encoding\"を変更できません" -#: commands/variable.c:863 +#: commands/variable.c:890 +#, c-format +msgid "permission will be denied to set role \"%s\"" +msgstr "ロール\"%s\"を設定する権限がありません" + +#: commands/variable.c:895 #, c-format msgid "permission denied to set role \"%s\"" msgstr "ロール\"%s\"を設定する権限がありません" @@ -10965,32 +11808,37 @@ msgstr "ビューの列名を\"%s\"から\"%s\"に変更できません" msgid "Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead." msgstr "代わりに ALTER VIEW ... RENAME COLUMN ... を使用してビューカラムの名前を変更してください。" -#: commands/view.c:290 +#: commands/view.c:295 #, c-format msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "ビューの列 \"%s\"のデータ型を %s から %s に変更できません" -#: commands/view.c:441 +#: commands/view.c:309 +#, c-format +msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" +msgstr "ビューの列\"%s\"の照合順序を\"%s\"から\"%s\"に変更できません" + +#: commands/view.c:454 #, c-format msgid "views must not contain SELECT INTO" msgstr "ビューでは SELECT INTO を使用できません" -#: commands/view.c:453 +#: commands/view.c:466 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "ビューでは WITH 句にデータを変更するステートメントを含むことはできません" -#: commands/view.c:523 +#: commands/view.c:536 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "CREATE VIEW で列よりも多くの列名が指定されています" -#: commands/view.c:531 +#: commands/view.c:544 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "ビューは自身の格納領域を持たないので、UNLOGGEDにはできません" -#: commands/view.c:545 +#: commands/view.c:558 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "ビュー\"%s\"は一時ビューとなります" @@ -11025,316 +11873,359 @@ msgstr "カーソル\"%s\"は行上に位置していません" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "カーソル\"%s\"はテーブル\"%s\"を単純な更新可能スキャンではありません" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2404 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2483 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "パラメータの型%d(%s)が実行計画(%s)を準備する時点と一致しません" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2416 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2495 #, c-format msgid "no value found for parameter %d" msgstr "パラメータ%dの値がありません" -#: executor/execExpr.c:859 parser/parse_agg.c:816 +#: executor/execExpr.c:632 executor/execExpr.c:639 executor/execExpr.c:645 executor/execExprInterp.c:4149 executor/execExprInterp.c:4166 executor/execExprInterp.c:4265 executor/nodeModifyTable.c:218 executor/nodeModifyTable.c:229 executor/nodeModifyTable.c:246 executor/nodeModifyTable.c:254 +#, c-format +msgid "table row type and query-specified row type do not match" +msgstr "テーブルの行型と問い合わせで指定した行型が一致しません" + +#: executor/execExpr.c:633 executor/nodeModifyTable.c:219 +#, c-format +msgid "Query has too many columns." +msgstr "問い合わせの列が多すぎます" + +#: executor/execExpr.c:640 executor/nodeModifyTable.c:247 +#, c-format +msgid "Query provides a value for a dropped column at ordinal position %d." +msgstr "問い合わせで %d 番目に削除される列の値を指定しています。" + +#: executor/execExpr.c:646 executor/execExprInterp.c:4167 executor/nodeModifyTable.c:230 +#, c-format +msgid "Table has type %s at ordinal position %d, but query expects %s." +msgstr "テーブルでは %2$d 番目の型は %1$s ですが、問い合わせでは %3$s を想定しています。" + +#: executor/execExpr.c:1110 parser/parse_agg.c:827 #, c-format msgid "window function calls cannot be nested" msgstr "ウィンドウ関数の呼び出しを入れ子にすることはできません" -#: executor/execExpr.c:1318 +#: executor/execExpr.c:1631 #, c-format msgid "target type is not an array" msgstr "対象型は配列ではありません" -#: executor/execExpr.c:1651 +#: executor/execExpr.c:1971 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "ROW()列の型が%2$sではなく%1$sです" -#: executor/execExpr.c:2176 executor/execSRF.c:708 parser/parse_func.c:135 parser/parse_func.c:646 parser/parse_func.c:1020 +#: executor/execExpr.c:2744 executor/execSRF.c:718 parser/parse_func.c:138 parser/parse_func.c:655 parser/parse_func.c:1031 #, c-format msgid "cannot pass more than %d argument to a function" msgid_plural "cannot pass more than %d arguments to a function" msgstr[0] "関数に%dを超える引数を渡せません" -msgstr[1] "関数に%dを超える引数を渡せません" -#: executor/execExpr.c:2587 executor/execExpr.c:2593 executor/execExprInterp.c:2730 utils/adt/arrayfuncs.c:262 utils/adt/arrayfuncs.c:560 utils/adt/arrayfuncs.c:1302 utils/adt/arrayfuncs.c:3369 utils/adt/arrayfuncs.c:5329 utils/adt/arrayfuncs.c:5842 +#: executor/execExpr.c:2771 executor/execSRF.c:738 executor/functions.c:1058 utils/adt/jsonfuncs.c:3735 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 #, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "配列の次数(%d)が上限(%d)を超えています" +msgid "set-valued function called in context that cannot accept a set" +msgstr "このコンテキストで集合値の関数は集合を受け付けられません" + +#: executor/execExpr.c:3130 parser/parse_node.c:276 parser/parse_node.c:326 +#, c-format +msgid "cannot subscript type %s because it does not support subscripting" +msgstr "添字をサポートしないため、型%sには添字をつけられません" + +#: executor/execExpr.c:3258 executor/execExpr.c:3280 +#, c-format +msgid "type %s does not support subscripted assignment" +msgstr "型%sは添字を使った代入をサポートしません" -#: executor/execExprInterp.c:1894 +#: executor/execExprInterp.c:1948 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "%2$s型の属性%1$dが削除されています" -#: executor/execExprInterp.c:1900 +#: executor/execExprInterp.c:1954 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "型%2$sの属性%1$dの型が間違っています" -#: executor/execExprInterp.c:1902 executor/execExprInterp.c:3002 executor/execExprInterp.c:3049 +#: executor/execExprInterp.c:1956 executor/execExprInterp.c:3084 executor/execExprInterp.c:3130 #, c-format msgid "Table has type %s, but query expects %s." msgstr "テーブルの型は%sですが、問い合わせでは%sを想定しています。" -#: executor/execExprInterp.c:2494 +#: executor/execExprInterp.c:2035 utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1749 utils/cache/typcache.c:1908 utils/cache/typcache.c:2055 utils/fmgr/funcapi.c:527 +#, c-format +msgid "type %s is not composite" +msgstr "型%sは複合型ではありません" + +#: executor/execExprInterp.c:2573 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "このタイプのテーブルではWHERE CURRENT OFをサポートしません" -#: executor/execExprInterp.c:2708 +#: executor/execExprInterp.c:2786 #, c-format msgid "cannot merge incompatible arrays" msgstr "互換性がない配列をマージできません" -#: executor/execExprInterp.c:2709 +#: executor/execExprInterp.c:2787 #, c-format msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." msgstr "要素型%sの配列を要素型%sのARRAY式に含められません" -#: executor/execExprInterp.c:2750 executor/execExprInterp.c:2780 +#: executor/execExprInterp.c:2808 utils/adt/arrayfuncs.c:263 utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 utils/adt/arrayfuncs.c:3375 utils/adt/arrayfuncs.c:5371 utils/adt/arrayfuncs.c:5888 utils/adt/arraysubs.c:150 utils/adt/arraysubs.c:488 +#, c-format +msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +msgstr "配列の次数(%d)が上限(%d)を超えています" + +#: executor/execExprInterp.c:2828 executor/execExprInterp.c:2858 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "多次元配列の配列式の次数があっていなければなりません" -#: executor/execExprInterp.c:3001 executor/execExprInterp.c:3048 +#: executor/execExprInterp.c:3083 executor/execExprInterp.c:3129 #, c-format msgid "attribute %d has wrong type" msgstr "属性%dの型が間違っています" -#: executor/execExprInterp.c:3158 -#, c-format -msgid "array subscript in assignment must not be null" -msgstr "代入における配列の添え字はnullにはできません" - -#: executor/execExprInterp.c:3588 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3697 utils/adt/domains.c:149 #, c-format msgid "domain %s does not allow null values" msgstr "ドメイン%sはnull値を許しません" -#: executor/execExprInterp.c:3603 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3712 utils/adt/domains.c:184 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "ドメイン%sの値が検査制約\"%s\"に違反しています" -#: executor/execExprInterp.c:3973 executor/execExprInterp.c:3990 executor/execExprInterp.c:4091 executor/nodeModifyTable.c:109 executor/nodeModifyTable.c:120 executor/nodeModifyTable.c:137 executor/nodeModifyTable.c:145 -#, c-format -msgid "table row type and query-specified row type do not match" -msgstr "テーブルの行型と問い合わせで指定した行型が一致しません" - -#: executor/execExprInterp.c:3974 +#: executor/execExprInterp.c:4150 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." msgstr[0] "テーブル行には%d属性ありますが、問い合わせでは%dを想定しています。" -msgstr[1] "テーブル行には%d属性ありますが、問い合わせでは%dを想定しています。" - -#: executor/execExprInterp.c:3991 executor/nodeModifyTable.c:121 -#, c-format -msgid "Table has type %s at ordinal position %d, but query expects %s." -msgstr "テーブルでは %2$d 番目の型は %1$s ですが、問い合わせでは %3$s を想定しています。" -#: executor/execExprInterp.c:4092 executor/execSRF.c:967 +#: executor/execExprInterp.c:4266 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "序数位置%dの削除された属性における物理格納形式が一致しません。" -#: executor/execIndexing.c:550 +#: executor/execExprInterp.c:4963 +#, c-format +msgid "SQL/JSON item cannot be cast to target type" +msgstr "SQL/JSONの項目はターゲット型へのキャストはできません" + +#: executor/execExprInterp.c:5017 +#, c-format +msgid "no SQL/JSON item" +msgstr "SQL/JSON項目がありません" + +#: executor/execIndexing.c:571 #, c-format msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" msgstr "ON CONFLICT は遅延可なユニーク制約/排除制約の調停主体としての指定をサポートしません" -#: executor/execIndexing.c:821 +#: executor/execIndexing.c:842 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "排除制約\"%s\"を作成できませんでした" -#: executor/execIndexing.c:824 +#: executor/execIndexing.c:845 #, c-format msgid "Key %s conflicts with key %s." msgstr "キー %s がキー %s と競合しています" -#: executor/execIndexing.c:826 +#: executor/execIndexing.c:847 #, c-format msgid "Key conflicts exist." msgstr "キーの競合が存在します" -#: executor/execIndexing.c:832 +#: executor/execIndexing.c:853 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "重複キーの値が排除制約\"%s\"に違反しています" -#: executor/execIndexing.c:835 +#: executor/execIndexing.c:856 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "キー %s が既存のキー %s と競合しています" -#: executor/execIndexing.c:837 +#: executor/execIndexing.c:858 #, c-format msgid "Key conflicts with existing key." msgstr "キーが既存のキーと衝突しています" -#: executor/execMain.c:1091 +#: executor/execMain.c:1009 #, c-format msgid "cannot change sequence \"%s\"" msgstr "シーケンス\"%s\"を変更できません" -#: executor/execMain.c:1097 +#: executor/execMain.c:1015 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "TOASTリレーション\"%s\"を変更できません" -#: executor/execMain.c:1115 rewrite/rewriteHandler.c:2934 rewrite/rewriteHandler.c:3708 +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3068 rewrite/rewriteHandler.c:3904 #, c-format msgid "cannot insert into view \"%s\"" msgstr "ビュー\"%s\"へは挿入(INSERT)できません" -#: executor/execMain.c:1117 rewrite/rewriteHandler.c:2937 rewrite/rewriteHandler.c:3711 +#: executor/execMain.c:1035 rewrite/rewriteHandler.c:3071 rewrite/rewriteHandler.c:3907 #, c-format msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." msgstr "ビューへの挿入を可能にするために、INSTEAD OF INSERTトリガまたは無条件のON INSERT DO INSTEADルールを作成してください。" -#: executor/execMain.c:1123 rewrite/rewriteHandler.c:2942 rewrite/rewriteHandler.c:3716 +#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3076 rewrite/rewriteHandler.c:3912 #, c-format msgid "cannot update view \"%s\"" msgstr "ビュー\"%s\"は更新できません" -#: executor/execMain.c:1125 rewrite/rewriteHandler.c:2945 rewrite/rewriteHandler.c:3719 +#: executor/execMain.c:1043 rewrite/rewriteHandler.c:3079 rewrite/rewriteHandler.c:3915 #, c-format msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." msgstr "ビューへの更新を可能にするために、INSTEAD OF UPDATEトリガまたは無条件のON UPDATE DO INSTEADルールを作成してください。" -#: executor/execMain.c:1131 rewrite/rewriteHandler.c:2950 rewrite/rewriteHandler.c:3724 +#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3084 rewrite/rewriteHandler.c:3920 #, c-format msgid "cannot delete from view \"%s\"" msgstr "ビュー\"%s\"からは削除できません" -#: executor/execMain.c:1133 rewrite/rewriteHandler.c:2953 rewrite/rewriteHandler.c:3727 +#: executor/execMain.c:1051 rewrite/rewriteHandler.c:3087 rewrite/rewriteHandler.c:3923 #, c-format msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." msgstr "ビューからの削除を可能にするために、INSTEAD OF DELETEトリガまたは無条件のON DELETE DO INSTEADルールを作成してください。" -#: executor/execMain.c:1144 +#: executor/execMain.c:1062 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "実体化ビュー\"%s\"を変更できません" -#: executor/execMain.c:1156 +#: executor/execMain.c:1074 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "外部テーブル\"%s\"への挿入ができません" -#: executor/execMain.c:1162 +#: executor/execMain.c:1080 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "外部テーブル\"%s\"は挿入を許しません" -#: executor/execMain.c:1169 +#: executor/execMain.c:1087 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "外部テーブル \"%s\"の更新ができません" -#: executor/execMain.c:1175 +#: executor/execMain.c:1093 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "外部テーブル\"%s\"は更新を許しません" -#: executor/execMain.c:1182 +#: executor/execMain.c:1100 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "外部テーブル\"%s\"からの削除ができません" -#: executor/execMain.c:1188 +#: executor/execMain.c:1106 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "外部テーブル\"%s\"は削除を許しません" -#: executor/execMain.c:1199 +#: executor/execMain.c:1117 #, c-format msgid "cannot change relation \"%s\"" msgstr "リレーション\"%s\"を変更できません" -#: executor/execMain.c:1226 +#: executor/execMain.c:1144 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "シーケンス\"%s\"では行のロックはできません" -#: executor/execMain.c:1233 +#: executor/execMain.c:1151 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "TOAST リレーション\"%s\"では行のロックはできません" -#: executor/execMain.c:1240 +#: executor/execMain.c:1158 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "ビュー\"%s\"では行のロックはできません" -#: executor/execMain.c:1248 +#: executor/execMain.c:1166 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "実体化ビュー\"%s\"では行のロックはできません" -#: executor/execMain.c:1257 executor/execMain.c:2627 executor/nodeLockRows.c:132 +#: executor/execMain.c:1175 executor/execMain.c:2653 executor/nodeLockRows.c:136 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "外部テーブル\"%s\"では行のロックはできません" -#: executor/execMain.c:1263 +#: executor/execMain.c:1181 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "リレーション\"%s\"では行のロックはできません" -#: executor/execMain.c:1879 +#: executor/execMain.c:1888 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "リレーション\"%s\"の新しい行はパーティション制約に違反しています" -#: executor/execMain.c:1881 executor/execMain.c:1964 executor/execMain.c:2012 executor/execMain.c:2120 +#: executor/execMain.c:1890 executor/execMain.c:1973 executor/execMain.c:2023 executor/execMain.c:2132 #, c-format msgid "Failing row contains %s." msgstr "失敗した行は%sを含みます" -#: executor/execMain.c:1961 +#: executor/execMain.c:1970 #, c-format msgid "null value in column \"%s\" of relation \"%s\" violates not-null constraint" msgstr "リレーション\"%2$s\"の列\"%1$s\"のNULL値がが非NULL制約に違反しています" -#: executor/execMain.c:2010 +#: executor/execMain.c:2021 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "リレーション\"%s\"の新しい行は検査制約\"%s\"に違反しています" -#: executor/execMain.c:2118 +#: executor/execMain.c:2130 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "新しい行はビュー\"%s\"のチェックオプションに違反しています" -#: executor/execMain.c:2128 +#: executor/execMain.c:2140 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "新しい行はテーブル\"%2$s\"行レベルセキュリティポリシ\"%1$s\"に違反しています" -#: executor/execMain.c:2133 +#: executor/execMain.c:2145 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "新しい行はテーブル\"%s\"の行レベルセキュリティポリシに違反しています" -#: executor/execMain.c:2140 +#: executor/execMain.c:2153 +#, c-format +msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" +msgstr "ターゲットの行はテーブル\"%s\"の行レベルセキュリティポリシ\"%s\"(USING式)に違反しています" + +#: executor/execMain.c:2158 +#, c-format +msgid "target row violates row-level security policy (USING expression) for table \"%s\"" +msgstr "ターゲットの行はテーブル\"%s\"の行レベルセキュリティポリシ(USING式)に違反しています" + +#: executor/execMain.c:2165 #, c-format msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "新しい行はテーブル\"%1$s\"の行レベルセキュリティポリシ\"%2$s\"(USING式)に違反しています" -#: executor/execMain.c:2145 +#: executor/execMain.c:2170 #, c-format msgid "new row violates row-level security policy (USING expression) for table \"%s\"" msgstr "新しい行はテーブル\"%s\"の行レベルセキュリティポリシ(USING式)に違反しています" -#: executor/execPartition.c:345 +#: executor/execPartition.c:330 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "行に対応するパーティションがリレーション\"%s\"に見つかりません" -#: executor/execPartition.c:348 +#: executor/execPartition.c:333 #, c-format msgid "Partition key of the failing row contains %s." msgstr "失敗した行のパーティションキーは%sを含みます。" @@ -11354,185 +12245,204 @@ msgstr "同時更新がありました、リトライします" msgid "concurrent delete, retrying" msgstr "並行する削除がありました、リトライします" -#: executor/execReplication.c:269 parser/parse_oper.c:228 utils/adt/array_userfuncs.c:719 utils/adt/array_userfuncs.c:858 utils/adt/arrayfuncs.c:3647 utils/adt/arrayfuncs.c:4167 utils/adt/arrayfuncs.c:6153 utils/adt/rowtypes.c:1202 +#: executor/execReplication.c:269 parser/parse_cte.c:502 parser/parse_oper.c:233 utils/adt/array_userfuncs.c:720 utils/adt/array_userfuncs.c:859 utils/adt/arrayfuncs.c:3655 utils/adt/arrayfuncs.c:4209 utils/adt/arrayfuncs.c:6201 utils/adt/rowtypes.c:1203 #, c-format msgid "could not identify an equality operator for type %s" -msgstr "型%sの等価性演算子を識別できませんでした" +msgstr "型%sの等価演算子を識別できませんでした" + +#: executor/execReplication.c:592 executor/execReplication.c:598 +#, c-format +msgid "cannot update table \"%s\"" +msgstr "テーブル\"%s\"の更新ができません" + +#: executor/execReplication.c:594 executor/execReplication.c:606 +#, c-format +msgid "Column used in the publication WHERE expression is not part of the replica identity." +msgstr "このパブリケーションのWHERE式で使用されている列は識別列の一部ではありません。" + +#: executor/execReplication.c:600 executor/execReplication.c:612 +#, c-format +msgid "Column list used by the publication does not cover the replica identity." +msgstr "このパブリケーションで使用されてる列リストは識別列を包含していません。" + +#: executor/execReplication.c:604 executor/execReplication.c:610 +#, c-format +msgid "cannot delete from table \"%s\"" +msgstr "テーブル\"%s\"からの削除ができません" -#: executor/execReplication.c:586 +#: executor/execReplication.c:630 #, c-format msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" msgstr "テーブル\"%s\"は複製識別を持たずかつ更新を発行しているため、更新できません" -#: executor/execReplication.c:588 +#: executor/execReplication.c:632 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "テーブルの更新を可能にするには ALTER TABLE で REPLICA IDENTITY を設定してください。" -#: executor/execReplication.c:592 +#: executor/execReplication.c:636 #, c-format msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" msgstr "テーブル\"%s\"は複製識別がなくかつ削除を発行しているため、このテーブルでは行の削除ができません" -#: executor/execReplication.c:594 +#: executor/execReplication.c:638 #, c-format msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "このテーブルでの行削除を可能にするには ALTER TABLE で REPLICA IDENTITY を設定してください。" -#: executor/execReplication.c:613 executor/execReplication.c:621 +#: executor/execReplication.c:654 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "リレーション\"%s.%s\"は論理レプリケーション先としては使用できません" -#: executor/execReplication.c:615 -#, c-format -msgid "\"%s.%s\" is a foreign table." -msgstr "\"%s.%s\"は外部テーブルです。" - -#: executor/execReplication.c:623 -#, c-format -msgid "\"%s.%s\" is not a table." -msgstr "\"%s.%s\"はテーブルではありません" - #: executor/execSRF.c:315 #, c-format msgid "rows returned by function are not all of the same row type" msgstr "関数から戻された行はすべてが同じ行型ではありません" -#: executor/execSRF.c:363 executor/execSRF.c:657 +#: executor/execSRF.c:365 +#, c-format +msgid "table-function protocol for value-per-call mode was not followed" +msgstr "逐次返却(value-per-call)モードのテーブル関数プロトコルに従っていません" + +#: executor/execSRF.c:373 executor/execSRF.c:667 #, c-format msgid "table-function protocol for materialize mode was not followed" msgstr "実体化モードのテーブル関数プロトコルに従っていません" -#: executor/execSRF.c:370 executor/execSRF.c:675 +#: executor/execSRF.c:380 executor/execSRF.c:685 #, c-format msgid "unrecognized table-function returnMode: %d" msgstr "識別できないテーブル関数のreturnMode: %d" -#: executor/execSRF.c:884 +#: executor/execSRF.c:894 #, c-format msgid "function returning setof record called in context that cannot accept type record" msgstr "レコード集合を返す関数が、レコード型が受け付けられない文脈で呼び出されました" -#: executor/execSRF.c:940 executor/execSRF.c:956 executor/execSRF.c:966 +#: executor/execSRF.c:950 executor/execSRF.c:966 executor/execSRF.c:976 #, c-format msgid "function return row and query-specified return row do not match" msgstr "問い合わせが指定した戻り値の行と実際の関数の戻り値の行が一致しません" -#: executor/execSRF.c:941 +#: executor/execSRF.c:951 #, c-format msgid "Returned row contains %d attribute, but query expects %d." msgid_plural "Returned row contains %d attributes, but query expects %d." msgstr[0] "%d属性を持つ行が返されました。問い合わせでは%d個を想定しています。" -msgstr[1] "%d属性を持つ行が返されました。問い合わせでは%d個を想定しています。" -#: executor/execSRF.c:957 +#: executor/execSRF.c:967 #, c-format msgid "Returned type %s at ordinal position %d, but query expects %s." msgstr "序数位置%2$dの型%1$sが返されました。問い合わせでは%3$sを想定しています。" -#: executor/execUtils.c:750 +#: executor/execTuples.c:146 executor/execTuples.c:353 executor/execTuples.c:521 executor/execTuples.c:712 +#, c-format +msgid "cannot retrieve a system column in this context" +msgstr "この文脈ではシステム列は取り出せません" + +#: executor/execUtils.c:736 #, c-format msgid "materialized view \"%s\" has not been populated" msgstr "実体化ビュー\"%s\"にはデータが格納されていません" -#: executor/execUtils.c:752 +#: executor/execUtils.c:738 #, c-format msgid "Use the REFRESH MATERIALIZED VIEW command." msgstr "REFRESH MATERIALIZED VIEWコマンドを使用してください。" -#: executor/functions.c:231 +#: executor/functions.c:217 #, c-format msgid "could not determine actual type of argument declared %s" msgstr "%sと宣言された引数の型を特定できませんでした" -#: executor/functions.c:528 +#: executor/functions.c:514 #, c-format -msgid "cannot COPY to/from client in a SQL function" -msgstr "SQL関数の中ではクライアントとの間のCOPYはできません" +msgid "cannot COPY to/from client in an SQL function" +msgstr "SQL関数の中ではCOPY文によるクライアントとの間の入出力はできません" #. translator: %s is a SQL statement name -#: executor/functions.c:534 +#: executor/functions.c:520 #, c-format -msgid "%s is not allowed in a SQL function" -msgstr "SQL関数では%sは許可されません" +msgid "%s is not allowed in an SQL function" +msgstr "SQL関数では%sは使用不可です" #. translator: %s is a SQL statement name -#: executor/functions.c:542 executor/spi.c:1587 executor/spi.c:2381 +#: executor/functions.c:528 executor/spi.c:1742 executor/spi.c:2631 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "volatile関数以外では%sは許可されません" -#: executor/functions.c:1430 +#: executor/functions.c:1442 #, c-format msgid "SQL function \"%s\" statement %d" msgstr "SQL関数\"%s\"の行番号 %d" -#: executor/functions.c:1456 +#: executor/functions.c:1468 #, c-format msgid "SQL function \"%s\" during startup" msgstr "SQL関数\"%s\"の起動中" -#: executor/functions.c:1549 +#: executor/functions.c:1553 #, c-format msgid "calling procedures with output arguments is not supported in SQL functions" msgstr "出力引数を持つプロシージャの呼び出しはSQL関数ではサポートされていません" -#: executor/functions.c:1671 executor/functions.c:1708 executor/functions.c:1722 executor/functions.c:1812 executor/functions.c:1845 executor/functions.c:1859 +#: executor/functions.c:1686 executor/functions.c:1724 executor/functions.c:1738 executor/functions.c:1828 executor/functions.c:1861 executor/functions.c:1875 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "%sを返すと宣言された関数において戻り値型が一致しません" -#: executor/functions.c:1673 +#: executor/functions.c:1688 #, c-format msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." msgstr "関数の最後のステートメントは SELECT もしくは INSERT/UPDATE/DELETE RETURNING のいずれかである必要があります" -#: executor/functions.c:1710 +#: executor/functions.c:1726 #, c-format msgid "Final statement must return exactly one column." msgstr "最後のステートメントはちょうど1列を返さなければなりません。" -#: executor/functions.c:1724 +#: executor/functions.c:1740 #, c-format msgid "Actual return type is %s." msgstr "実際の戻り値型は%sです。" -#: executor/functions.c:1814 +#: executor/functions.c:1830 #, c-format msgid "Final statement returns too many columns." msgstr "最後のステートメントが返す列が多すぎます。" -#: executor/functions.c:1847 +#: executor/functions.c:1863 #, c-format msgid "Final statement returns %s instead of %s at column %d." msgstr "最後のステートメントが列%3$dで%2$sではなく%1$sを返しました。" -#: executor/functions.c:1861 +#: executor/functions.c:1877 #, c-format msgid "Final statement returns too few columns." msgstr "最後のステートメントが返す列が少なすぎます。" -#: executor/functions.c:1889 +#: executor/functions.c:1905 #, c-format msgid "return type %s is not supported for SQL functions" msgstr "戻り値型%sはSQL関数でサポートされていません" -#: executor/nodeAgg.c:3076 executor/nodeAgg.c:3085 executor/nodeAgg.c:3097 -#, c-format -msgid "unexpected EOF for tape %d: requested %zu bytes, read %zu bytes" -msgstr "テープ%dに対する予期しないEOF: %zuバイト要求しましたが、%zuバイト読み込みました" - -#: executor/nodeAgg.c:4022 parser/parse_agg.c:655 parser/parse_agg.c:685 +#: executor/nodeAgg.c:3006 executor/nodeAgg.c:3015 executor/nodeAgg.c:3027 #, c-format -msgid "aggregate function calls cannot be nested" -msgstr "集約関数の呼び出しを入れ子にすることはできません" +msgid "unexpected EOF for tape %p: requested %zu bytes, read %zu bytes" +msgstr "テープ%pに対する予期しないEOF: %zuバイト要求しましたが、%zuバイト読み込みました" -#: executor/nodeAgg.c:4230 executor/nodeWindowAgg.c:2836 +#: executor/nodeAgg.c:3917 executor/nodeWindowAgg.c:2962 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "集約%uは入力データ型と遷移用の型間で互換性が必要です" +#: executor/nodeAgg.c:3947 parser/parse_agg.c:668 parser/parse_agg.c:696 +#, c-format +msgid "aggregate function calls cannot be nested" +msgstr "集約関数の呼び出しを入れ子にすることはできません" + #: executor/nodeCustom.c:145 executor/nodeCustom.c:156 #, c-format msgid "custom scan \"%s\" does not support MarkPos" @@ -11548,7 +12458,7 @@ msgstr "ハッシュ結合用一時ファイルを巻き戻せませんでした msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" msgstr "ハッシュ結合用一時ファイルから読み取れませんでした: %2$zuバイト中%1$zuバイトしか読み込んでいません" -#: executor/nodeIndexonlyscan.c:242 +#: executor/nodeIndexonlyscan.c:240 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "概算距離関数はインデックスオンリースキャンではサポートされていません" @@ -11573,82 +12483,103 @@ msgstr "RIGHT JOINはマージ結合可能な結合条件でのみサポート msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOINはマージ結合可能な結合条件でのみサポートされています" -#: executor/nodeModifyTable.c:110 -#, c-format -msgid "Query has too many columns." -msgstr "問い合わせの列が多すぎます" - -#: executor/nodeModifyTable.c:138 -#, c-format -msgid "Query provides a value for a dropped column at ordinal position %d." -msgstr "問い合わせで %d 番目に削除される列の値を指定しています。" - -#: executor/nodeModifyTable.c:146 +#: executor/nodeModifyTable.c:255 #, c-format msgid "Query has too few columns." msgstr "問い合わせの列が少なすぎます。" -#: executor/nodeModifyTable.c:839 executor/nodeModifyTable.c:913 +#: executor/nodeModifyTable.c:1409 executor/nodeModifyTable.c:1483 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "削除対象のタプルはすでに現在のコマンドによって引き起こされた操作によって変更されています" -#: executor/nodeModifyTable.c:1220 +#: executor/nodeModifyTable.c:1640 #, c-format msgid "invalid ON UPDATE specification" msgstr "不正な ON UPDATE 指定です" -#: executor/nodeModifyTable.c:1221 +#: executor/nodeModifyTable.c:1641 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "結果タプルをもとのパーティションではなく異なるパーティションに追加しようとしました。" -#: executor/nodeModifyTable.c:1592 +#: executor/nodeModifyTable.c:2082 +#, c-format +msgid "cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key" +msgstr "ソースパーティションのルート以外の上位パーティションが外部キーで直接参照されている場合はパーティション間でタプルを移動させることができません" + +#: executor/nodeModifyTable.c:2083 +#, c-format +msgid "A foreign key points to ancestor \"%s\", but not the root ancestor \"%s\"." +msgstr "外部キーの一つがルートパーティション\"%2$s\"ではなく、中間パーティション\"%1$s\"を指しています。/" + +#: executor/nodeModifyTable.c:2086 +#, c-format +msgid "Consider defining the foreign key on \"%s\"." +msgstr "\"%s\"上に外部キー制約を定義することを検討してください。" + +#. translator: %s is a SQL command name +#: executor/nodeModifyTable.c:2430 executor/nodeModifyTable.c:2821 #, c-format -msgid "ON CONFLICT DO UPDATE command cannot affect row a second time" -msgstr "ON CONFLICT DO UPDATE コマンドは行に再度影響を与えることはできません" +msgid "%s command cannot affect row a second time" +msgstr "%sコマンドは単一の行に2度は適用できません" -#: executor/nodeModifyTable.c:1593 +#: executor/nodeModifyTable.c:2432 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "同じコマンドでの挿入候補の行が同じ制約値を持つことがないようにしてください" -#: executor/nodeSamplescan.c:259 +#: executor/nodeModifyTable.c:2823 +#, c-format +msgid "Ensure that not more than one source row matches any one target row." +msgstr "ソース行が2行以上ターゲット行に合致しないようにしてください。" + +#: executor/nodeModifyTable.c:2926 +#, c-format +msgid "tuple to be deleted was already moved to another partition due to concurrent update" +msgstr "削除対象のタプルは同時に行われた更新によってすでに他の子テーブルに移動されています" + +#: executor/nodeModifyTable.c:2965 +#, c-format +msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" +msgstr "更新または削除対象のタプルは、現在のコマンドによって発火した操作トリガーによってすでに更新されています" + +#: executor/nodeSamplescan.c:260 #, c-format msgid "TABLESAMPLE parameter cannot be null" msgstr "TABLESAMPLEパラメータにnullは指定できません" -#: executor/nodeSamplescan.c:271 +#: executor/nodeSamplescan.c:272 #, c-format msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "TABLESAMPLE REPEATABLE パラメータにnullは指定できません" -#: executor/nodeSubplan.c:346 executor/nodeSubplan.c:385 executor/nodeSubplan.c:1151 +#: executor/nodeSubplan.c:346 executor/nodeSubplan.c:385 executor/nodeSubplan.c:1159 #, c-format msgid "more than one row returned by a subquery used as an expression" msgstr "式として使用された副問い合わせが2行以上の行を返しました" -#: executor/nodeTableFuncscan.c:375 +#: executor/nodeTableFuncscan.c:377 #, c-format msgid "namespace URI must not be null" msgstr "名前空間URIにnullは指定できません" -#: executor/nodeTableFuncscan.c:389 +#: executor/nodeTableFuncscan.c:393 #, c-format msgid "row filter expression must not be null" msgstr "行フィルタ式はnullになってはなりません" -#: executor/nodeTableFuncscan.c:415 +#: executor/nodeTableFuncscan.c:420 #, c-format msgid "column filter expression must not be null" msgstr "列フィルタ式はnullになってはなりません" -#: executor/nodeTableFuncscan.c:416 +#: executor/nodeTableFuncscan.c:421 #, c-format msgid "Filter for column \"%s\" is null." msgstr "列\"%s\"のフィルタがnullです。" -#: executor/nodeTableFuncscan.c:506 +#: executor/nodeTableFuncscan.c:511 #, c-format msgid "null is not allowed in column \"%s\"" msgstr "列\"%s\"でnullは許可されません" @@ -11658,83 +12589,104 @@ msgstr "列\"%s\"でnullは許可されません" msgid "moving-aggregate transition function must not return null" msgstr "移動集約の推移関数はnullを返却してはなりません" -#: executor/nodeWindowAgg.c:2058 +#: executor/nodeWindowAgg.c:2080 #, c-format msgid "frame starting offset must not be null" msgstr "フレームの開始オフセットは NULL であってはなりません" -#: executor/nodeWindowAgg.c:2071 +#: executor/nodeWindowAgg.c:2093 #, c-format msgid "frame starting offset must not be negative" msgstr "フレームの開始オフセットは負数であってはなりません" -#: executor/nodeWindowAgg.c:2083 +#: executor/nodeWindowAgg.c:2105 #, c-format msgid "frame ending offset must not be null" msgstr "フレームの終了オフセットは NULL であってはなりません" -#: executor/nodeWindowAgg.c:2096 +#: executor/nodeWindowAgg.c:2118 #, c-format msgid "frame ending offset must not be negative" msgstr "フレームの終了オフセットは負数であってはなりません" -#: executor/nodeWindowAgg.c:2752 +#: executor/nodeWindowAgg.c:2878 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "集約関数 %s はウィンドウ関数としての使用をサポートしていません" -#: executor/spi.c:229 executor/spi.c:298 +#: executor/spi.c:242 executor/spi.c:342 #, c-format msgid "invalid transaction termination" msgstr "不正なトランザクション終了" -#: executor/spi.c:243 +#: executor/spi.c:257 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "サブトランザクションの実行中はコミットできません" -#: executor/spi.c:304 +#: executor/spi.c:348 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "サブトランザクションの実行中はロールバックできません" -#: executor/spi.c:373 +#: executor/spi.c:472 #, c-format msgid "transaction left non-empty SPI stack" msgstr "トランザクションは空でないSPIスタックを残しました" -#: executor/spi.c:374 executor/spi.c:436 +#: executor/spi.c:473 executor/spi.c:533 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "\"SPI_finish\"呼出の抜けを確認ください" -#: executor/spi.c:435 +#: executor/spi.c:532 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "サブトランザクションが空でないSPIスタックを残しました" -#: executor/spi.c:1451 +#: executor/spi.c:1600 #, c-format msgid "cannot open multi-query plan as cursor" msgstr "カーソルにマルチクエリの実行計画を開くことができません" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:1456 +#: executor/spi.c:1610 #, c-format msgid "cannot open %s query as cursor" msgstr "カーソルで%s問い合わせを開くことができません" -#: executor/spi.c:1561 +#: executor/spi.c:1716 #, c-format msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHAREはサポートされていません" -#: executor/spi.c:1562 parser/analyze.c:2508 +#: executor/spi.c:1717 parser/analyze.c:2858 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "スクロール可能カーソルは読み取り専用である必要があります。" -#: executor/spi.c:2699 +#: executor/spi.c:2470 +#, c-format +msgid "empty query does not return tuples" +msgstr "空の問い合わせは結果を返却しません" + +#. translator: %s is name of a SQL command, eg INSERT +#: executor/spi.c:2544 +#, c-format +msgid "%s query does not return tuples" +msgstr "%s問い合わせがタプルを返しません" + +#: executor/spi.c:2959 +#, c-format +msgid "SQL expression \"%s\"" +msgstr "SQL関数\"%s\"" + +#: executor/spi.c:2964 +#, c-format +msgid "PL/pgSQL assignment \"%s\"" +msgstr "PL/pgSQL代入\"%s\"" + +#: executor/spi.c:2967 #, c-format msgid "SQL statement \"%s\"" msgstr "SQL文 \"%s\"" @@ -11744,473 +12696,518 @@ msgstr "SQL文 \"%s\"" msgid "could not send tuple to shared-memory queue" msgstr "共有メモリキューにタプルを送出できませんでした" -#: foreign/foreign.c:220 +#: foreign/foreign.c:221 #, c-format msgid "user mapping not found for \"%s\"" msgstr "\"%s\"に対するユーザマッピングが見つかりません" -#: foreign/foreign.c:672 +#: foreign/foreign.c:638 #, c-format msgid "invalid option \"%s\"" msgstr "不正なオプション\"%s\"" -#: foreign/foreign.c:673 +#: foreign/foreign.c:640 #, c-format msgid "Valid options in this context are: %s" msgstr "この文脈で有効なオプション: %s" -#: gram.y:1043 +#: foreign/foreign.c:642 +#, c-format +msgid "There are no valid options in this context." +msgstr "このコンテクストで有効なオプションはありません。" + +#: gram.y:1255 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD は今後サポートされません" -#: gram.y:1044 +#: gram.y:1256 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "UNENCRYPTED を削除してください。そうすれば替わりにパスワードを暗号化形式で格納します。" -#: gram.y:1106 +#: gram.y:1318 #, c-format msgid "unrecognized role option \"%s\"" msgstr "ロールオプション\"%s\"が認識できません" -#: gram.y:1353 gram.y:1368 +#: gram.y:1565 gram.y:1580 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTSんはスキーマ要素を含めることはできません" -#: gram.y:1514 +#: gram.y:1726 #, c-format msgid "current database cannot be changed" msgstr "現在のデータベースを変更できません" -#: gram.y:1638 +#: gram.y:1850 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "タイムゾーンの間隔はHOURまたはHOUR TO MINUTEでなければなりません" -#: gram.y:2191 +#: gram.y:2418 #, c-format msgid "column number must be in range from 1 to %d" msgstr "列番号は1から%dまでの範囲でなければなりません" -#: gram.y:2723 +#: gram.y:2967 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "シーケンスのオプション\"%s\"はここではサポートされていません" -#: gram.y:2752 +#: gram.y:2996 #, c-format msgid "modulus for hash partition provided more than once" msgstr "ハッシュパーティションで法(除数)が2回以上指定されています" -#: gram.y:2761 +#: gram.y:3005 #, c-format msgid "remainder for hash partition provided more than once" msgstr "ハッシュパーティションで剰余が2回以上指定されています" -#: gram.y:2768 +#: gram.y:3012 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "ハッシュパーティションの境界条件\"%s\"が認識できません" -#: gram.y:2776 +#: gram.y:3020 #, c-format msgid "modulus for hash partition must be specified" msgstr "ハッシュパーティションでは法(除数)の指定が必要です" -#: gram.y:2780 +#: gram.y:3024 #, c-format msgid "remainder for hash partition must be specified" msgstr "ハッシュパーティションでは剰余の指定が必要です" -#: gram.y:2981 gram.y:3014 +#: gram.y:3225 gram.y:3258 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "STDIN/STDOUTはPROGRAMと同時に使用できません" -#: gram.y:2987 +#: gram.y:3231 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "COPY TO で WHERE 句は使用できません" -#: gram.y:3319 gram.y:3326 gram.y:11411 gram.y:11419 +#: gram.y:3563 gram.y:3570 gram.y:12222 gram.y:12230 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "一時テーブル作成におけるGLOBALは廃止予定です" -#: gram.y:3566 +#: gram.y:3822 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "生成カラムに対しては GENERATED ALWAYS の指定が必須です" -#: gram.y:3832 utils/adt/ri_triggers.c:2007 +#: gram.y:4099 utils/adt/ri_triggers.c:2091 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "MMATCH PARTIAL はまだ実装されていません" -#: gram.y:4503 +#: gram.y:4186 +#, c-format +msgid "a column list with %s is only supported for ON DELETE actions" +msgstr "%sが指定された列リストはON DELETEのアクションに対してのみサポートされます" + +#: gram.y:4870 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM はすでにサポートされていません" -#: gram.y:5166 +#: gram.y:5533 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "認識できない行セキュリティオプション \"%s\"" -#: gram.y:5167 +#: gram.y:5534 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "現時点ではPERMISSIVEもしくはRESTRICTIVEポリシのみがサポートされています" -#: gram.y:5280 +#: gram.y:5616 +#, c-format +msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" +msgstr "CREATE OR REPLACE CONSTRAINT TRIGGERはサポートされません" + +#: gram.y:5653 msgid "duplicate trigger events specified" msgstr "重複したトリガーイベントが指定されました" -#: gram.y:5421 parser/parse_utilcmd.c:3483 parser/parse_utilcmd.c:3509 +#: gram.y:5794 parser/parse_utilcmd.c:3706 parser/parse_utilcmd.c:3732 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "INITIALLY DEFERREDと宣言された制約はDEFERRABLEでなければなりません" -#: gram.y:5428 +#: gram.y:5801 #, c-format msgid "conflicting constraint properties" msgstr "制約属性の競合" -#: gram.y:5524 +#: gram.y:5897 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTIONはまだ実装されていません" -#: gram.y:5907 +#: gram.y:6280 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK はもはや必要とされません" -#: gram.y:5908 +#: gram.y:6281 #, c-format msgid "Update your data type." msgstr "データ型を更新してください" -#: gram.y:7595 +#: gram.y:8016 #, c-format msgid "aggregates cannot have output arguments" msgstr "集約は出力の引数を持つことができません" -#: gram.y:7987 utils/adt/regproc.c:709 utils/adt/regproc.c:750 +#: gram.y:8463 utils/adt/regproc.c:710 utils/adt/regproc.c:751 #, c-format msgid "missing argument" msgstr "引数が足りません" -#: gram.y:7988 utils/adt/regproc.c:710 utils/adt/regproc.c:751 +#: gram.y:8464 utils/adt/regproc.c:711 utils/adt/regproc.c:752 #, c-format msgid "Use NONE to denote the missing argument of a unary operator." msgstr "単項演算子の存在しない引数を表すにはNONEを使用してください。" -#: gram.y:9917 gram.y:9935 +#: gram.y:10517 gram.y:10535 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTIONは再帰ビューではサポートされていません" -#: gram.y:11543 +#: gram.y:12359 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "LIMIT #,#構文は実装されていません" -#: gram.y:11544 +#: gram.y:12360 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "分割してLIMITとOFFSET句を使用してください" -#: gram.y:11870 gram.y:11895 +#: gram.y:12698 gram.y:12723 #, c-format msgid "VALUES in FROM must have an alias" msgstr "FROM句のVALUESには別名が必要です" -#: gram.y:11871 gram.y:11896 +#: gram.y:12699 gram.y:12724 #, c-format msgid "For example, FROM (VALUES ...) [AS] foo." msgstr "例えば、FROM (VALUES ...) [AS] foo。" -#: gram.y:11876 gram.y:11901 +#: gram.y:12704 gram.y:12729 #, c-format msgid "subquery in FROM must have an alias" msgstr "FROM句の副問い合わせには別名が必要です" -#: gram.y:11877 gram.y:11902 +#: gram.y:12705 gram.y:12730 #, c-format msgid "For example, FROM (SELECT ...) [AS] foo." msgstr "例えば、FROM (SELECT ...) [AS] foo。" -#: gram.y:12355 +#: gram.y:13245 #, c-format msgid "only one DEFAULT value is allowed" msgstr "DEFAULT値は一つだけ指定可能です" -#: gram.y:12364 +#: gram.y:13254 #, c-format msgid "only one PATH value per column is allowed" msgstr "列一つにつきPATH値は一つだけ指定可能です" -#: gram.y:12373 +#: gram.y:13263 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "列\"%s\"でNULL / NOT NULL宣言が衝突しているか重複しています" -#: gram.y:12382 +#: gram.y:13272 #, c-format msgid "unrecognized column option \"%s\"" msgstr "認識できない列オプション \"%s\"" -#: gram.y:12636 +#: gram.y:13530 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "浮動小数点数の型の精度は最低でも1ビット必要です" -#: gram.y:12645 +#: gram.y:13539 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "浮動小数点型の精度は54ビットより低くなければなりません" -#: gram.y:13136 +#: gram.y:14044 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "OVERLAPS式の左辺のパラメータ数が間違っています" -#: gram.y:13141 +#: gram.y:14049 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "OVERLAPS式の右辺のパラメータ数が間違っています" -#: gram.y:13316 +#: gram.y:14217 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "UNIQUE 述部はまだ実装されていません" -#: gram.y:13679 +#: gram.y:14635 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "複数のORDER BY句はWITHIN GROUPと一緒には使用できません" -#: gram.y:13684 +#: gram.y:14640 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT は WITHIN GROUP と同時には使えません" -#: gram.y:13689 +#: gram.y:14645 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC は WITHIN GROUP と同時には使えません" -#: gram.y:14150 gram.y:14173 +#: gram.y:15181 gram.y:15204 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "フレームの開始は UNBOUNDED FOLLOWING であってはなりません" -#: gram.y:14155 +#: gram.y:15186 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "次の行から始まるフレームは、現在行では終了できません" -#: gram.y:14178 +#: gram.y:15209 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "フレームの終了は UNBOUNDED PRECEDING であってはなりません" -#: gram.y:14184 +#: gram.y:15215 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "現在行から始まるフレームは、先行する行を含むことができません" -#: gram.y:14191 +#: gram.y:15222 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "次の行から始まるフレームは、先行する行を含むことができません" -#: gram.y:14836 +#: gram.y:15889 gram.y:16076 +#, c-format +msgid "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" +msgstr "SQL/JSONのQUOTES指定はWITH WRAPPERが指定されているときには指定できません" + +#: gram.y:16613 #, c-format msgid "type modifier cannot have parameter name" msgstr "型修正子はパラメータ名を持つことはできません" -#: gram.y:14842 +#: gram.y:16619 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "型修正子はORDER BYを持つことはできません" -#: gram.y:14907 gram.y:14914 +#: gram.y:16684 gram.y:16691 gram.y:16698 #, c-format msgid "%s cannot be used as a role name here" msgstr "%sはここではロール名として使用できません" -#: gram.y:15595 gram.y:15784 +#: gram.y:16787 gram.y:18273 +#, c-format +msgid "WITH TIES cannot be specified without ORDER BY clause" +msgstr "WITH TIESはORDER BY句なしでは指定できません" + +#: gram.y:17953 gram.y:18139 msgid "improper use of \"*\"" msgstr "\"*\"の使い方が不適切です" -#: gram.y:15747 gram.y:15764 tsearch/spell.c:956 tsearch/spell.c:973 tsearch/spell.c:990 tsearch/spell.c:1007 tsearch/spell.c:1072 +#: gram.y:18102 gram.y:18119 tsearch/spell.c:982 tsearch/spell.c:999 tsearch/spell.c:1016 tsearch/spell.c:1033 tsearch/spell.c:1098 #, c-format msgid "syntax error" msgstr "構文エラー" -#: gram.y:15848 +#: gram.y:18203 #, c-format msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" msgstr "VARIADIC直接引数を使った順序集合集約は同じデータタイプのVARIADIC集約引数を一つ持つ必要があります" -#: gram.y:15885 +#: gram.y:18240 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "複数のORDER BY句は使用できません" -#: gram.y:15896 +#: gram.y:18251 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "複数のOFFSET句は使用できません" -#: gram.y:15905 +#: gram.y:18260 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "複数のLIMIT句は使用できません" -#: gram.y:15914 +#: gram.y:18269 #, c-format msgid "multiple limit options not allowed" msgstr "複数のLIMITオプションは使用できません" -#: gram.y:15918 -#, c-format -msgid "WITH TIES options can not be specified without ORDER BY clause" -msgstr "WITH TIESオプションORDER BY句と一緒に指定はできません" - -#: gram.y:15926 +#: gram.y:18296 #, c-format msgid "multiple WITH clauses not allowed" msgstr "複数の WITH 句は使用できません" -#: gram.y:16130 +#: gram.y:18489 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "テーブル関数では OUT と INOUT 引数は使用できません" -#: gram.y:16226 +#: gram.y:18622 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "複数の COLLATE 句は使用できません" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16264 gram.y:16277 +#: gram.y:18660 gram.y:18673 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "%s制約は遅延可能にはできません" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16290 +#: gram.y:18686 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "%s制約をNOT VALIDとマークすることはできません" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16303 +#: gram.y:18699 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "%s制約をNO INHERITをマークすることはできません" -#: guc-file.l:316 +#: gram.y:18723 +#, c-format +msgid "invalid publication object list" +msgstr "不正なパブリケーションオブジェクトリスト" + +#: gram.y:18724 +#, c-format +msgid "One of TABLE or ALL TABLES IN SCHEMA must be specified before a standalone table or schema name." +msgstr "テーブル名やスキーマ名を単独で記述する前にTABLEまたはALL TABLES IN SCHEMAのいずれかを指定する必要があります。" + +#: gram.y:18740 +#, c-format +msgid "invalid table name at or near" +msgstr "ここまたは付近で不正なテーブル名" + +#: gram.y:18761 +#, c-format +msgid "WHERE clause not allowed for schema" +msgstr "WHERE句はスキーマに対しては使用できません" + +#: gram.y:18768 +#, c-format +msgid "column specification not allowed for schema" +msgstr "列指定はスキーマに対しては使用できません" + +#: gram.y:18782 +#, c-format +msgid "invalid schema name at or near" +msgstr "ここあるいは付近で不正なスキーマ" + +#: guc-file.l:315 #, c-format -msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %u" -msgstr "ファイル\"%2$s\"、%3$u行の設定パラメータ\"%1$s\"は不明です" +msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" +msgstr "ファイル\"%2$s\"行%3$dで認識できない設定パラメータ\"%1$s\"" -#: guc-file.l:353 utils/misc/guc.c:7036 utils/misc/guc.c:7230 utils/misc/guc.c:7320 utils/misc/guc.c:7410 utils/misc/guc.c:7518 utils/misc/guc.c:7613 +#: guc-file.l:354 utils/misc/guc.c:7640 utils/misc/guc.c:7859 utils/misc/guc.c:7953 utils/misc/guc.c:8047 utils/misc/guc.c:8167 utils/misc/guc.c:8266 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "パラメータ\"%s\"を変更するにはサーバの再起動が必要です" -#: guc-file.l:389 +#: guc-file.l:390 #, c-format msgid "parameter \"%s\" removed from configuration file, reset to default" msgstr "パラメーター\"%s\"が設定ファイルから削除されました。デフォルト値に戻ります。" -#: guc-file.l:455 +#: guc-file.l:456 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "パラメータ\"%s\"は\"%s\"に変更されました" -#: guc-file.l:497 +#: guc-file.l:498 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "設定ファイル\"%s\"にはエラーがあります" -#: guc-file.l:502 +#: guc-file.l:503 #, c-format msgid "configuration file \"%s\" contains errors; unaffected changes were applied" msgstr "設定ファイル\"%s\"にはエラーがあります。影響がない変更は適用されました" -#: guc-file.l:507 +#: guc-file.l:508 #, c-format msgid "configuration file \"%s\" contains errors; no changes were applied" msgstr "設定ファイル\"%s\"にはエラーがあります。変更は適用されませんでした" -#: guc-file.l:579 +#: guc-file.l:580 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "空の設定ファイル名: \"%s\"" -#: guc-file.l:596 +#: guc-file.l:597 #, c-format msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" msgstr "設定ファイル\"%s\"をオープンできませんでした: 入れ子長が上限を超えています" -#: guc-file.l:616 +#: guc-file.l:617 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "設定ファイル\"%s\"が再帰しています" -#: guc-file.l:632 libpq/hba.c:2201 libpq/hba.c:2615 +#: guc-file.l:633 libpq/hba.c:2223 utils/adt/hbafuncs.c:376 #, c-format msgid "could not open configuration file \"%s\": %m" msgstr "設定ファイル\"%s\"をオープンできませんでした: %m" -#: guc-file.l:643 +#: guc-file.l:644 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "存在しない設定ファイル\"%s\"をスキップします" -#: guc-file.l:897 +#: guc-file.l:898 #, c-format msgid "syntax error in file \"%s\" line %u, near end of line" msgstr "ファイル\"%s\"の行%uの行末近辺で構文エラーがありました" -#: guc-file.l:907 +#: guc-file.l:908 #, c-format msgid "syntax error in file \"%s\" line %u, near token \"%s\"" msgstr "ファイル\"%s\"の行%uのトークン\"%s\"近辺で構文エラーがありました" -#: guc-file.l:927 +#: guc-file.l:928 #, c-format msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "多くの構文エラーがありました。ファイル\"%s\"を断念します" -#: guc-file.l:982 +#: guc-file.l:983 #, c-format msgid "empty configuration directory name: \"%s\"" msgstr "空の設定ディレクトリ名: \"%s\"" -#: guc-file.l:1001 +#: guc-file.l:1002 #, c-format msgid "could not open configuration directory \"%s\": %m" msgstr "設定ディレクトリ\"%s\"をオープンできませんでした: %m" -#: jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:417 utils/fmgr/dfmgr.c:465 +#: jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:432 utils/fmgr/dfmgr.c:480 #, c-format msgid "could not access file \"%s\": %m" msgstr "ファイル\"%s\"にアクセスできませんでした: %m" -#: jit/llvm/llvmjit.c:595 -#, c-format -msgid "time to inline: %.3fs, opt: %.3fs, emit: %.3fs" -msgstr "所要時間: インライン化: %.3fs、最適化: %.3fs、出力: %.3fs" - -#: jsonpath_gram.y:528 jsonpath_scan.l:520 jsonpath_scan.l:531 jsonpath_scan.l:541 jsonpath_scan.l:583 utils/adt/encode.c:482 utils/adt/encode.c:547 utils/adt/jsonfuncs.c:619 utils/adt/varlena.c:319 utils/adt/varlena.c:360 +#: jsonpath_gram.y:528 jsonpath_scan.l:516 jsonpath_scan.l:527 jsonpath_scan.l:537 jsonpath_scan.l:579 utils/adt/encode.c:482 utils/adt/encode.c:547 utils/adt/jsonfuncs.c:623 utils/adt/varlena.c:335 utils/adt/varlena.c:376 #, c-format msgid "invalid input syntax for type %s" msgstr "%s型に対する不正な入力構文" @@ -12226,793 +13223,795 @@ msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" msgstr "XQueryの\"x\"フラグ(拡張正規表現)は実装されていません" #. translator: %s is typically "syntax error" -#: jsonpath_scan.l:287 +#: jsonpath_scan.l:283 #, c-format msgid "%s at end of jsonpath input" msgstr "jsonpath の最後に %s があります" #. translator: first %s is typically "syntax error" -#: jsonpath_scan.l:294 +#: jsonpath_scan.l:290 #, c-format msgid "%s at or near \"%s\" of jsonpath input" msgstr "jsonpath 入力の\"%2$s\"または近くに %1$s があります" -#: jsonpath_scan.l:499 utils/adt/jsonfuncs.c:613 +#: jsonpath_scan.l:495 utils/adt/jsonfuncs.c:617 #, c-format msgid "unsupported Unicode escape sequence" msgstr "サポートされないUnicodeエスケープシーケンス" -#: lib/dshash.c:247 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 +#: lib/dshash.c:255 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 #, c-format msgid "Failed on DSA request of size %zu." msgstr "サイズ%zuの動的共有エリアの要求に失敗しました。" -#: libpq/auth-scram.c:248 +#: libpq/auth-sasl.c:97 +#, c-format +msgid "expected SASL response, got message type %d" +msgstr "SASL応答を想定していましたが、メッセージタイプ%dを受け取りました" + +#: libpq/auth-scram.c:258 #, c-format msgid "client selected an invalid SASL authentication mechanism" msgstr "クライアントが無効なSASL認証機構を選択しました" -#: libpq/auth-scram.c:269 libpq/auth-scram.c:509 libpq/auth-scram.c:520 +#: libpq/auth-scram.c:279 libpq/auth-scram.c:523 libpq/auth-scram.c:534 #, c-format msgid "invalid SCRAM secret for user \"%s\"" msgstr "ユーザ\"%s\"に対する不正なSCRAMシークレット" -#: libpq/auth-scram.c:280 +#: libpq/auth-scram.c:290 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "ユーザ\"%s\"は有効なSCRAMシークレットを持ちません。" -#: libpq/auth-scram.c:358 libpq/auth-scram.c:363 libpq/auth-scram.c:693 libpq/auth-scram.c:701 libpq/auth-scram.c:806 libpq/auth-scram.c:819 libpq/auth-scram.c:829 libpq/auth-scram.c:937 libpq/auth-scram.c:944 libpq/auth-scram.c:959 libpq/auth-scram.c:974 libpq/auth-scram.c:988 libpq/auth-scram.c:1006 libpq/auth-scram.c:1021 libpq/auth-scram.c:1321 libpq/auth-scram.c:1329 +#: libpq/auth-scram.c:368 libpq/auth-scram.c:373 libpq/auth-scram.c:714 libpq/auth-scram.c:722 libpq/auth-scram.c:827 libpq/auth-scram.c:840 libpq/auth-scram.c:850 libpq/auth-scram.c:958 libpq/auth-scram.c:965 libpq/auth-scram.c:980 libpq/auth-scram.c:995 libpq/auth-scram.c:1009 libpq/auth-scram.c:1027 libpq/auth-scram.c:1042 libpq/auth-scram.c:1355 libpq/auth-scram.c:1363 #, c-format msgid "malformed SCRAM message" msgstr "不正なフォーマットのSCRAMメッセージです" -#: libpq/auth-scram.c:359 +#: libpq/auth-scram.c:369 #, c-format msgid "The message is empty." msgstr "メッセージが空です。" -#: libpq/auth-scram.c:364 +#: libpq/auth-scram.c:374 #, c-format msgid "Message length does not match input length." msgstr "メッセージの長さが入力の長さと一致しません" -#: libpq/auth-scram.c:396 +#: libpq/auth-scram.c:406 #, c-format msgid "invalid SCRAM response" msgstr "不正なSCRAM応答" -#: libpq/auth-scram.c:397 +#: libpq/auth-scram.c:407 #, c-format msgid "Nonce does not match." msgstr "Nonce が合致しません" -#: libpq/auth-scram.c:471 +#: libpq/auth-scram.c:483 #, c-format msgid "could not generate random salt" msgstr "乱数ソルトを生成できませんでした" -#: libpq/auth-scram.c:694 +#: libpq/auth-scram.c:715 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "属性\"%c\"を想定していましたが、\"%s\"でした。" -#: libpq/auth-scram.c:702 libpq/auth-scram.c:830 +#: libpq/auth-scram.c:723 libpq/auth-scram.c:851 #, c-format msgid "Expected character \"=\" for attribute \"%c\"." msgstr "属性\"%c\"としては文字\"=\"を想定していました。" -#: libpq/auth-scram.c:807 +#: libpq/auth-scram.c:828 #, c-format msgid "Attribute expected, but found end of string." msgstr "属性を想定しましたが、文字列が終了しました。" -#: libpq/auth-scram.c:820 +#: libpq/auth-scram.c:841 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "属性を想定しましたが、不正な文字\"%s\"でした。" -#: libpq/auth-scram.c:938 libpq/auth-scram.c:960 +#: libpq/auth-scram.c:959 libpq/auth-scram.c:981 #, c-format msgid "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not include channel binding data." msgstr "クライアントは SCRAM-SHA-256-PLUS を選択しましたが、SCRAM メッセージにはチャネルバインディング情報が含まれていません。" -#: libpq/auth-scram.c:945 libpq/auth-scram.c:975 +#: libpq/auth-scram.c:966 libpq/auth-scram.c:996 #, c-format msgid "Comma expected, but found character \"%s\"." msgstr "カンマを想定していましたが、文字\"%s\"が見つかりました" -#: libpq/auth-scram.c:966 +#: libpq/auth-scram.c:987 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "SCRAM チャネルバインディングのネゴシエーションエラー" -#: libpq/auth-scram.c:967 +#: libpq/auth-scram.c:988 #, c-format msgid "The client supports SCRAM channel binding but thinks the server does not. However, this server does support channel binding." msgstr "クライアントは SCRAM チャネルバインディングをサポートしていますが、サーバではサポートされていないと思っています。しかし実際にはサポートしています。" -#: libpq/auth-scram.c:989 +#: libpq/auth-scram.c:1010 #, c-format msgid "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM message includes channel binding data." msgstr "クライアントはチャネルバインディングなしの SCRAM-SHA-256 を選択しましたが、SCRAM メッセージにはチャネルバインディング情報が含まれています。" -#: libpq/auth-scram.c:1000 +#: libpq/auth-scram.c:1021 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "SCRAM チャネルバインディングタイプ \"%s\"はサポートされていません" -#: libpq/auth-scram.c:1007 +#: libpq/auth-scram.c:1028 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "予期しないチャネル割り当てフラグ \"%s\"" -#: libpq/auth-scram.c:1017 +#: libpq/auth-scram.c:1038 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "クライアントは認証識別子を使っていますがサポートされていません" -#: libpq/auth-scram.c:1022 +#: libpq/auth-scram.c:1043 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "client-fist-message での想定外の属性\"%s\"" -#: libpq/auth-scram.c:1038 +#: libpq/auth-scram.c:1059 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "クライアントはサポート外のSCRAM拡張を要求しています" -#: libpq/auth-scram.c:1052 +#: libpq/auth-scram.c:1073 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "SCRAM nonce の中に表示不能な文字があります" -#: libpq/auth-scram.c:1169 +#: libpq/auth-scram.c:1203 #, c-format msgid "could not generate random nonce" msgstr "乱数nonceを生成できませんでした" -#: libpq/auth-scram.c:1179 +#: libpq/auth-scram.c:1213 #, c-format msgid "could not encode random nonce" msgstr "乱数nonceをエンコードできませんでした" -#: libpq/auth-scram.c:1285 +#: libpq/auth-scram.c:1319 #, c-format msgid "SCRAM channel binding check failed" msgstr "SCRAM チャネルバインディングの確認で失敗しました" -#: libpq/auth-scram.c:1303 +#: libpq/auth-scram.c:1337 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" msgstr "client-final-message 中に想定外の SCRAM channel-binding 属性がありました" -#: libpq/auth-scram.c:1322 +#: libpq/auth-scram.c:1356 #, c-format msgid "Malformed proof in client-final-message." msgstr "client-final-message 中の proof の形式が不正です" -#: libpq/auth-scram.c:1330 +#: libpq/auth-scram.c:1364 #, c-format msgid "Garbage found at the end of client-final-message." msgstr "client-final-message の終端に不要なデータがあります。" -#: libpq/auth.c:280 +#: libpq/auth.c:275 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "ユーザ\"%s\"の認証に失敗しました: ホストを拒絶しました" -#: libpq/auth.c:283 +#: libpq/auth.c:278 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "ユーザ\"%s\"の\"trust\"認証に失敗しました" -#: libpq/auth.c:286 +#: libpq/auth.c:281 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "ユーザ\"%s\"のIdent認証に失敗しました" -#: libpq/auth.c:289 +#: libpq/auth.c:284 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "ユーザ\"%s\"で対向(peer)認証に失敗しました" -#: libpq/auth.c:294 +#: libpq/auth.c:289 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "ユーザ\"%s\"のパスワード認証に失敗しました" -#: libpq/auth.c:299 +#: libpq/auth.c:294 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "ユーザ\"%s\"のGSSAPI認証に失敗しました" -#: libpq/auth.c:302 +#: libpq/auth.c:297 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "ユーザ\"%s\"のSSPI認証に失敗しました" -#: libpq/auth.c:305 +#: libpq/auth.c:300 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "ユーザ\"%s\"のPAM認証に失敗しました" -#: libpq/auth.c:308 +#: libpq/auth.c:303 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "ユーザ\"%s\"のBSD認証に失敗しました" -#: libpq/auth.c:311 +#: libpq/auth.c:306 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "ユーザ\"%s\"のLDAP認証に失敗しました" -#: libpq/auth.c:314 +#: libpq/auth.c:309 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "ユーザ\"%s\"の証明書認証に失敗しました" -#: libpq/auth.c:317 +#: libpq/auth.c:312 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "ユーザ\"%s\"の RADIUS 認証に失敗しました" -#: libpq/auth.c:320 +#: libpq/auth.c:315 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "ユーザ\"%s\"の認証に失敗しました: 認証方式が不正です" -#: libpq/auth.c:324 +#: libpq/auth.c:319 #, c-format msgid "Connection matched pg_hba.conf line %d: \"%s\"" msgstr "接続はpg_hba.confの行%dに一致しました: \"%s\"" -#: libpq/auth.c:371 +#: libpq/auth.c:362 +#, c-format +msgid "authentication identifier set more than once" +msgstr "認証識別子が2度以上設定されました" + +#: libpq/auth.c:363 +#, c-format +msgid "previous identifier: \"%s\"; new identifier: \"%s\"" +msgstr "以前の識別子: \"%s\"; 新しい識別子: \"%s\"" + +#: libpq/auth.c:372 +#, c-format +msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" +msgstr "接続認証完了: 識別名=\"%s\" 方式=%s (%s:%d)" + +#: libpq/auth.c:411 #, c-format msgid "client certificates can only be checked if a root certificate store is available" msgstr "クライアント証明書はルート証明書ストアが利用できる場合にのみ検証されます" -#: libpq/auth.c:382 +#: libpq/auth.c:422 #, c-format msgid "connection requires a valid client certificate" msgstr "この接続には有効なクライアント証明が必要です" -#: libpq/auth.c:392 -#, c-format -msgid "GSSAPI encryption can only be used with gss, trust, or reject authentication methods" -msgstr "GSSAPI暗号化は gss、trust および reject 認証方式のみで使用できます" - -#: libpq/auth.c:426 -#, c-format -msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" -msgstr "pg_hba.conf の設定でホスト \"%s\"、ユーザ \"%s\", %s 用のレプリケーション接続を拒否しました" +#: libpq/auth.c:453 libpq/auth.c:499 +msgid "GSS encryption" +msgstr "GSS暗号化" -#: libpq/auth.c:428 libpq/auth.c:444 libpq/auth.c:502 libpq/auth.c:520 -msgid "SSL off" -msgstr "SSL無効" +#: libpq/auth.c:456 libpq/auth.c:502 +msgid "SSL encryption" +msgstr "SSL暗号化" -#: libpq/auth.c:428 libpq/auth.c:444 libpq/auth.c:502 libpq/auth.c:520 -msgid "SSL on" -msgstr "SSL有効" +#: libpq/auth.c:458 libpq/auth.c:504 +msgid "no encryption" +msgstr "暗号化なし" -#: libpq/auth.c:432 +#. translator: last %s describes encryption state +#: libpq/auth.c:464 #, c-format -msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\"" -msgstr "pg_hba.conf の設定でホスト \"%s\"、ユーザ \"%s\"用のレプリケーション接続を拒否しました" +msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" +msgstr "pg_hba.conf の設定でホスト \"%s\"、ユーザ \"%s\", %s 用のレプリケーション接続を拒否しました" -#: libpq/auth.c:441 +#. translator: last %s describes encryption state +#: libpq/auth.c:471 #, c-format msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "pg_hba.conf の設定でホスト \"%s\"、ユーザ \"%s\"、データベース \"%s\", %sの接続を拒否しました" -#: libpq/auth.c:448 -#, c-format -msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\"" -msgstr "pg_hba.conf の設定でホスト\"%s\"、ユーザ\"%s\"、データベース\"%s\"用のレプリケーション接続を拒否しました" - -#: libpq/auth.c:477 +#: libpq/auth.c:509 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "クライアントIPアドレスは\"%s\"に解決され、前方検索と一致しました。" -#: libpq/auth.c:480 +#: libpq/auth.c:512 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "クライアントIPアドレスは\"%s\"に解決されました。前方検索は検査されません。" -#: libpq/auth.c:483 +#: libpq/auth.c:515 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "クライアントIPアドレスは\"%s\"に解決され、前方検索と一致しませんでした。" -#: libpq/auth.c:486 +#: libpq/auth.c:518 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "クライアントのホスト名\"%s\"をIPアドレスに変換できませんでした: %s。" -#: libpq/auth.c:491 +#: libpq/auth.c:523 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "クライアントのIPアドレスをホスト名に解決できませんでした: %s。" -#: libpq/auth.c:500 +#. translator: last %s describes encryption state +#: libpq/auth.c:531 #, c-format msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" msgstr "pg_hba.conf にホスト\"%s\"、ユーザ\"%s\", %s用のエントリがありません" -#: libpq/auth.c:507 -#, c-format -msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\"" -msgstr "pg_hba.conf にホスト\"%s\"、ユーザ\"%s\"用のエントリがありません" - -#: libpq/auth.c:517 +#. translator: last %s describes encryption state +#: libpq/auth.c:539 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "pg_hba.conf にホスト\"%s\"、ユーザ\"%s\"、データベース\"%s, %s用のエントリがありません" -#: libpq/auth.c:525 -#, c-format -msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\"" -msgstr "pg_hba.conf にホスト\"%s\"、ユーザ\"%s\"、データベース\"%s用のエントリがありません" - -#: libpq/auth.c:688 +#: libpq/auth.c:712 #, c-format msgid "expected password response, got message type %d" msgstr "パスワード応答を想定しましたが、メッセージタイプ%dを受け取りました" -#: libpq/auth.c:716 +#: libpq/auth.c:733 #, c-format msgid "invalid password packet size" msgstr "パスワードパケットのサイズが不正です" -#: libpq/auth.c:734 +#: libpq/auth.c:751 #, c-format msgid "empty password returned by client" msgstr "クライアントから空のパスワードが返されました" -#: libpq/auth.c:854 libpq/hba.c:1340 +#: libpq/auth.c:880 libpq/hba.c:1335 #, c-format msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" msgstr "\"db_user_namespace\"が有効の場合、MD5 認証はサポートされません" -#: libpq/auth.c:860 +#: libpq/auth.c:886 #, c-format msgid "could not generate random MD5 salt" msgstr "ランダムなMD5ソルトの生成に失敗しました" -#: libpq/auth.c:906 +#: libpq/auth.c:935 libpq/be-secure-gssapi.c:535 #, c-format -msgid "SASL authentication is not supported in protocol version 2" -msgstr "プロトコルバージョン2ではSASL認証はサポートされていません" +msgid "could not set environment: %m" +msgstr "環境を設定できません: %m" -#: libpq/auth.c:939 -#, c-format -msgid "expected SASL response, got message type %d" -msgstr "SASL応答を想定していましたが、メッセージタイプ%dを受け取りました" - -#: libpq/auth.c:1068 -#, c-format -msgid "GSSAPI is not supported in protocol version 2" -msgstr "プロトコルバージョン 2 では GSSAPI はサポートされていません" - -#: libpq/auth.c:1128 +#: libpq/auth.c:971 #, c-format msgid "expected GSS response, got message type %d" msgstr "GSS応答を想定しましたが、メッセージタイプ %d を受け取りました" -#: libpq/auth.c:1189 +#: libpq/auth.c:1031 msgid "accepting GSS security context failed" msgstr "GSSセキュリティコンテキストの受け付けに失敗しました" -#: libpq/auth.c:1228 +#: libpq/auth.c:1072 msgid "retrieving GSS user name failed" msgstr "GSSユーザ名の受信に失敗しました" -#: libpq/auth.c:1359 -#, c-format -msgid "SSPI is not supported in protocol version 2" -msgstr "プロトコルバージョン 2 では SSPI はサポートされていません" - -#: libpq/auth.c:1374 +#: libpq/auth.c:1221 msgid "could not acquire SSPI credentials" msgstr "SSPIの資格ハンドルを入手できませんでした" -#: libpq/auth.c:1399 +#: libpq/auth.c:1246 #, c-format msgid "expected SSPI response, got message type %d" msgstr "SSPI応答を想定しましたが、メッセージタイプ%dを受け取りました" -#: libpq/auth.c:1477 +#: libpq/auth.c:1324 msgid "could not accept SSPI security context" msgstr "SSPIセキュリティコンテキストを受け付けられませんでした" -#: libpq/auth.c:1539 +#: libpq/auth.c:1386 msgid "could not get token from SSPI security context" msgstr "SSPIセキュリティコンテキストからトークンを入手できませんでした" -#: libpq/auth.c:1658 libpq/auth.c:1677 +#: libpq/auth.c:1525 libpq/auth.c:1544 #, c-format msgid "could not translate name" msgstr "名前の変換ができませんでした" -#: libpq/auth.c:1690 +#: libpq/auth.c:1557 #, c-format msgid "realm name too long" msgstr "realm名が長すぎます" -#: libpq/auth.c:1705 +#: libpq/auth.c:1572 #, c-format msgid "translated account name too long" msgstr "変換後のアカウント名が長すぎます" -#: libpq/auth.c:1886 +#: libpq/auth.c:1753 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "Ident接続用のソケットを作成できませんでした: %m" -#: libpq/auth.c:1901 +#: libpq/auth.c:1768 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "ローカルアドレス\"%s\"にバインドできませんでした: %m" -#: libpq/auth.c:1913 +#: libpq/auth.c:1780 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "アドレス\"%s\"、ポート%sのIdentサーバに接続できませんでした: %m" -#: libpq/auth.c:1935 +#: libpq/auth.c:1802 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "アドレス\"%s\"、ポート%sのIdentサーバに問い合わせを送信できませんでした: %m" -#: libpq/auth.c:1952 +#: libpq/auth.c:1819 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "アドレス\"%s\"、ポート%sのIdentサーバからの応答を受信できませんでした: %m" -#: libpq/auth.c:1962 +#: libpq/auth.c:1829 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "Identサーバからの応答の書式が不正です: \"%s\"" -#: libpq/auth.c:2009 +#: libpq/auth.c:1882 #, c-format msgid "peer authentication is not supported on this platform" msgstr "このプラットフォームでは対向(peer)認証はサポートされていません" -#: libpq/auth.c:2013 +#: libpq/auth.c:1886 #, c-format msgid "could not get peer credentials: %m" msgstr "ピアの資格証明を入手できませんでした: %m" -#: libpq/auth.c:2025 +#: libpq/auth.c:1898 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "ローカルユーザID %ldの参照に失敗しました: %s" -#: libpq/auth.c:2124 +#: libpq/auth.c:1999 #, c-format msgid "error from underlying PAM layer: %s" msgstr "背後のPAM層でエラーがありました: %s" -#: libpq/auth.c:2194 +#: libpq/auth.c:2010 +#, c-format +msgid "unsupported PAM conversation %d/\"%s\"" +msgstr "非サポートのPAM変換%d/\"%s\"" + +#: libpq/auth.c:2070 #, c-format msgid "could not create PAM authenticator: %s" msgstr "PAM authenticatorを作成できませんでした: %s" -#: libpq/auth.c:2205 +#: libpq/auth.c:2081 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER)が失敗しました: %s" -#: libpq/auth.c:2237 +#: libpq/auth.c:2113 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST)が失敗しました: %s" -#: libpq/auth.c:2249 +#: libpq/auth.c:2125 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "\"pam_set_item(PAM_CONV)が失敗しました: %s" -#: libpq/auth.c:2262 +#: libpq/auth.c:2138 #, c-format msgid "pam_authenticate failed: %s" msgstr "\"pam_authenticateが失敗しました: %s" -#: libpq/auth.c:2275 +#: libpq/auth.c:2151 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmtが失敗しました: %s" -#: libpq/auth.c:2286 +#: libpq/auth.c:2162 #, c-format msgid "could not release PAM authenticator: %s" msgstr "PAM authenticatorを解放できませんでした: %s" -#: libpq/auth.c:2362 +#: libpq/auth.c:2242 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "LDAPを初期化できませんでした: %d" -#: libpq/auth.c:2399 +#: libpq/auth.c:2279 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "ldapbasedn からドメイン名を抽出できませんでした" -#: libpq/auth.c:2407 +#: libpq/auth.c:2287 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "LDAP認証で\"%s\"に対する DNS SRV レコードが見つかりませんでした" -#: libpq/auth.c:2409 +#: libpq/auth.c:2289 #, c-format msgid "Set an LDAP server name explicitly." msgstr "LDAPサーバ名を明示的に指定してください。" -#: libpq/auth.c:2461 +#: libpq/auth.c:2341 #, c-format msgid "could not initialize LDAP: %s" msgstr "LDAPを初期化できませんでした: %s" -#: libpq/auth.c:2471 +#: libpq/auth.c:2351 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "この LDAP ライブラリでは ldaps はサポートされていません" -#: libpq/auth.c:2479 +#: libpq/auth.c:2359 #, c-format msgid "could not initialize LDAP: %m" msgstr "LDAPを初期化できませんでした: %m" -#: libpq/auth.c:2489 +#: libpq/auth.c:2369 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "LDAPプロトコルバージョンを設定できませんでした: %s" -#: libpq/auth.c:2529 +#: libpq/auth.c:2409 #, c-format msgid "could not load function _ldap_start_tls_sA in wldap32.dll" msgstr "wldap32.dllの_ldap_start_tls_sA関数を読み込みできませんでした" -#: libpq/auth.c:2530 +#: libpq/auth.c:2410 #, c-format msgid "LDAP over SSL is not supported on this platform." msgstr "このプラットフォームではLDAP over SSLをサポートしていません。" -#: libpq/auth.c:2546 +#: libpq/auth.c:2426 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "LDAP TLSセッションを開始できませんでした: %s" -#: libpq/auth.c:2617 +#: libpq/auth.c:2497 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP サーバも ldapbasedn も指定されていません" -#: libpq/auth.c:2624 +#: libpq/auth.c:2504 #, c-format msgid "LDAP server not specified" msgstr "LDAP サーバの指定がありません" -#: libpq/auth.c:2686 +#: libpq/auth.c:2566 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "LDAP 認証でユーザ名の中に不正な文字があります" -#: libpq/auth.c:2703 +#: libpq/auth.c:2583 #, c-format msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" msgstr "サーバ\"%2$s\"で、ldapbinddn \"%1$s\"によるLDAPバインドを実行できませんでした: %3$s" -#: libpq/auth.c:2732 +#: libpq/auth.c:2612 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "サーバ\"%2$s\"で、フィルタ\"%1$s\"によるLDAP検索ができませんでした: %3$s" -#: libpq/auth.c:2746 +#: libpq/auth.c:2626 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "LDAPサーバ\"%s\"は存在しません" -#: libpq/auth.c:2747 +#: libpq/auth.c:2627 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "サーバ\"%2$s\"で、フィルタ\"%1$s\"によるLDAP検索が何も返しませんでした。" -#: libpq/auth.c:2751 +#: libpq/auth.c:2631 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "LDAPユーザ\"%s\"は一意ではありません" -#: libpq/auth.c:2752 +#: libpq/auth.c:2632 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." msgstr[0] "サーバ\"%2$s\"で、フィルタ\"%1$s\"によるLDAP検索が%3$d項目返しました。" -msgstr[1] "サーバ\"%2$s\"で、フィルタ\"%1$s\"によるLDAP検索が%3$d項目返しました。" -#: libpq/auth.c:2772 +#: libpq/auth.c:2652 #, c-format msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" msgstr "サーバ\"%2$s\"で\"%1$s\"にマッチする最初のエントリの dn を取得できません: %3$s" -#: libpq/auth.c:2793 +#: libpq/auth.c:2673 #, c-format msgid "could not unbind after searching for user \"%s\" on server \"%s\"" msgstr "サーバ\"%2$s\"でユーザ\"%1$s\"の検索後、unbindできませんでした" -#: libpq/auth.c:2824 +#: libpq/auth.c:2704 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "サーバ\"%2$s\"でユーザ\"%1$s\"のLDAPログインが失敗しました: %3$s" -#: libpq/auth.c:2853 +#: libpq/auth.c:2736 #, c-format msgid "LDAP diagnostics: %s" msgstr "LDAP診断: %s" -#: libpq/auth.c:2880 +#: libpq/auth.c:2774 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "ユーザ \"%s\" の証明書認証に失敗しました: クライアント証明書にユーザ名が含まれていません" -#: libpq/auth.c:2897 +#: libpq/auth.c:2795 +#, c-format +msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" +msgstr "ユーザー\"%s\"の証明書認証に失敗しました: サブジェクト識別名(DN)が取得できません" + +#: libpq/auth.c:2818 +#, c-format +msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" +msgstr "ユーザー\"%s\"に対する証明書の検証(clientcert=verify-full) に失敗しました: DN 不一致" + +#: libpq/auth.c:2823 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "ユーザ\"%s\"に対する証明書の検証(clientcert=verify-full) に失敗しました: CN 不一致" -#: libpq/auth.c:2998 +#: libpq/auth.c:2925 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS サーバが指定されていません" -#: libpq/auth.c:3005 +#: libpq/auth.c:2932 #, c-format msgid "RADIUS secret not specified" msgstr "RADIUS secret が指定されていません" -#: libpq/auth.c:3019 +#: libpq/auth.c:2946 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "RADIUS認証では%d文字より長いパスワードはサポートしていません" -#: libpq/auth.c:3124 libpq/hba.c:1956 +#: libpq/auth.c:3053 libpq/hba.c:1976 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "RADIUS サーバ名\"%s\"をアドレスに変換できませんでした: %s" -#: libpq/auth.c:3138 +#: libpq/auth.c:3067 #, c-format msgid "could not generate random encryption vector" msgstr "ランダムな暗号化ベクトルを生成できませんでした" -#: libpq/auth.c:3172 +#: libpq/auth.c:3104 #, c-format -msgid "could not perform MD5 encryption of password" -msgstr "パスワードのMD5暗号化に失敗しました" +msgid "could not perform MD5 encryption of password: %s" +msgstr "パスワードのMD5暗号化に失敗しました: %s" -#: libpq/auth.c:3198 +#: libpq/auth.c:3131 #, c-format msgid "could not create RADIUS socket: %m" msgstr "RADIUSのソケットを作成できませんでした: %m" -#: libpq/auth.c:3220 +#: libpq/auth.c:3153 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "ローカルの RADIUS ソケットをバインドできませんでした: %m" -#: libpq/auth.c:3230 +#: libpq/auth.c:3163 #, c-format msgid "could not send RADIUS packet: %m" msgstr "RADIUS パケットを送信できませんでした: %m" -#: libpq/auth.c:3263 libpq/auth.c:3289 +#: libpq/auth.c:3197 libpq/auth.c:3223 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "%sからのRADIUSの応答待ちがタイムアウトしました" -#: libpq/auth.c:3282 +#: libpq/auth.c:3216 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "RADIUSソケットの状態をチェックできませんでした: %m" -#: libpq/auth.c:3312 +#: libpq/auth.c:3246 #, c-format msgid "could not read RADIUS response: %m" msgstr "RADIUS応答を読めませんでした: %m" -#: libpq/auth.c:3325 libpq/auth.c:3329 +#: libpq/auth.c:3259 libpq/auth.c:3263 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "%sからのRADIUS応答が誤ったポートから送られてきました: %d" -#: libpq/auth.c:3338 +#: libpq/auth.c:3272 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "%sからのRADIUS応答が短すぎます: %d" -#: libpq/auth.c:3345 +#: libpq/auth.c:3279 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "%sからのRADIUS応答が間違った長さを保持しています: %d(実際の長さは%d)" -#: libpq/auth.c:3353 +#: libpq/auth.c:3287 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "%sからのRADIUS応答は異なるリクエストに対するものです: %d (%d であるはず)" -#: libpq/auth.c:3378 +#: libpq/auth.c:3312 #, c-format -msgid "could not perform MD5 encryption of received packet" -msgstr "受信パケットのMD5暗号化に失敗しました" +msgid "could not perform MD5 encryption of received packet: %s" +msgstr "受信パケットのMD5暗号化に失敗しました: %s" -#: libpq/auth.c:3387 +#: libpq/auth.c:3322 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "%sからのRADIUS応答が間違ったMD5シグネチャを保持しています" -#: libpq/auth.c:3405 +#: libpq/auth.c:3340 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "%1$sからのRADIUS応答がユーザ\"%3$s\"にとって不正なコード(%2$d)を保持しています" -#: libpq/be-fsstubs.c:119 libpq/be-fsstubs.c:150 libpq/be-fsstubs.c:178 libpq/be-fsstubs.c:204 libpq/be-fsstubs.c:229 libpq/be-fsstubs.c:277 libpq/be-fsstubs.c:300 libpq/be-fsstubs.c:553 +#: libpq/be-fsstubs.c:128 libpq/be-fsstubs.c:157 libpq/be-fsstubs.c:185 libpq/be-fsstubs.c:211 libpq/be-fsstubs.c:236 libpq/be-fsstubs.c:274 libpq/be-fsstubs.c:297 libpq/be-fsstubs.c:545 #, c-format msgid "invalid large-object descriptor: %d" msgstr "ラージオブジェクト記述子が不正です: %d" -#: libpq/be-fsstubs.c:161 +#: libpq/be-fsstubs.c:168 #, c-format msgid "large object descriptor %d was not opened for reading" msgstr "ラージオブジェクト記述子 %d は読み込み用にオープンされていませんでした" -#: libpq/be-fsstubs.c:185 libpq/be-fsstubs.c:560 +#: libpq/be-fsstubs.c:192 libpq/be-fsstubs.c:552 #, c-format msgid "large object descriptor %d was not opened for writing" msgstr "ラージオブジェクト記述子%dは書き込み用に開かれていませんでした" -#: libpq/be-fsstubs.c:212 +#: libpq/be-fsstubs.c:219 #, c-format msgid "lo_lseek result out of range for large-object descriptor %d" msgstr "lo_lseekの結果がラージオブジェクト記述子の範囲%dを超えています" -#: libpq/be-fsstubs.c:285 +#: libpq/be-fsstubs.c:282 #, c-format msgid "lo_tell result out of range for large-object descriptor %d" msgstr "lo_tellの結果がラージオブジェクト記述子の範囲%dを超えています" -#: libpq/be-fsstubs.c:432 +#: libpq/be-fsstubs.c:424 #, c-format msgid "could not open server file \"%s\": %m" msgstr "サーバファイル\"%s\"をオープンできませんでした: %m" -#: libpq/be-fsstubs.c:454 +#: libpq/be-fsstubs.c:447 #, c-format msgid "could not read server file \"%s\": %m" msgstr "サーバファイル\"%s\"を読み取れませんでした: %m" -#: libpq/be-fsstubs.c:514 +#: libpq/be-fsstubs.c:506 #, c-format msgid "could not create server file \"%s\": %m" msgstr "サーバファイル\"%s\"を作成できませんでした: %m" -#: libpq/be-fsstubs.c:526 +#: libpq/be-fsstubs.c:518 #, c-format msgid "could not write server file \"%s\": %m" msgstr "サーバファイル\"%s\"を書き出せませんでした: %m" -#: libpq/be-fsstubs.c:760 +#: libpq/be-fsstubs.c:758 #, c-format msgid "large object read request is too large" msgstr "ラージオブジェクトの読み込み要求が大きすぎます" -#: libpq/be-fsstubs.c:802 utils/adt/genfile.c:265 utils/adt/genfile.c:304 utils/adt/genfile.c:340 +#: libpq/be-fsstubs.c:800 utils/adt/genfile.c:262 utils/adt/genfile.c:301 utils/adt/genfile.c:337 #, c-format msgid "requested length cannot be negative" msgstr "負の長さを指定することはできません" -#: libpq/be-fsstubs.c:855 storage/large_object/inv_api.c:297 storage/large_object/inv_api.c:309 storage/large_object/inv_api.c:513 storage/large_object/inv_api.c:624 storage/large_object/inv_api.c:814 +#: libpq/be-fsstubs.c:851 storage/large_object/inv_api.c:299 storage/large_object/inv_api.c:311 storage/large_object/inv_api.c:508 storage/large_object/inv_api.c:619 storage/large_object/inv_api.c:809 #, c-format msgid "permission denied for large object %u" msgstr "ラージオブジェクト %u に対する権限がありません" @@ -13030,244 +14029,270 @@ msgstr "コマンド\"%s\"の実行に失敗しました" #: libpq/be-secure-common.c:141 #, c-format msgid "could not access private key file \"%s\": %m" -msgstr "秘密キーファイル\"%s\"にアクセスできませんでした: %m" +msgstr "秘密鍵ファイル\"%s\"にアクセスできませんでした: %m" -#: libpq/be-secure-common.c:150 +#: libpq/be-secure-common.c:151 #, c-format msgid "private key file \"%s\" is not a regular file" -msgstr "秘密キーファイル\"%s\"は通常のファイルではありません" +msgstr "秘密鍵ファイル\"%s\"は通常のファイルではありません" -#: libpq/be-secure-common.c:165 +#: libpq/be-secure-common.c:176 #, c-format msgid "private key file \"%s\" must be owned by the database user or root" -msgstr "秘密キーファイル\"%s\"はデータベースユーザもしくはrootの所有である必要があります" +msgstr "秘密鍵ファイル\"%s\"はデータベースユーザもしくはrootの所有である必要があります" -#: libpq/be-secure-common.c:188 +#: libpq/be-secure-common.c:186 #, c-format msgid "private key file \"%s\" has group or world access" -msgstr "秘密キーファイル\"%s\"はグループまたは全員からアクセス可能です" +msgstr "秘密鍵ファイル\"%s\"はグループまたは全員からアクセス可能です" -#: libpq/be-secure-common.c:190 +#: libpq/be-secure-common.c:188 #, c-format msgid "File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root." msgstr "ファイルはデータベースユーザの所有の場合は u=rw (0600) かそれよりも低いパーミッション、root所有の場合は u=rw,g=r (0640) かそれよりも低いパーミッションである必要があります" -#: libpq/be-secure-gssapi.c:195 +#: libpq/be-secure-gssapi.c:204 msgid "GSSAPI wrap error" msgstr "GSSAPI名ラップエラー" -#: libpq/be-secure-gssapi.c:199 +#: libpq/be-secure-gssapi.c:211 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "送出されるGSSAPIメッセージに機密性が適用されません" -#: libpq/be-secure-gssapi.c:203 libpq/be-secure-gssapi.c:574 +#: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:622 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "サーバは過大なサイズのGSSAPIパケットを送信しようとしました: (%zu > %zu)" -#: libpq/be-secure-gssapi.c:330 +#: libpq/be-secure-gssapi.c:351 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" msgstr "過大なサイズのGSSAPIパケットがクライアントから送出されました: (%zu > %zu)" -#: libpq/be-secure-gssapi.c:364 +#: libpq/be-secure-gssapi.c:389 msgid "GSSAPI unwrap error" msgstr "GSSAPIアンラップエラー" -#: libpq/be-secure-gssapi.c:369 +#: libpq/be-secure-gssapi.c:396 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "到着したGSSAPIメッセージには機密性が適用されていません" -#: libpq/be-secure-gssapi.c:525 +#: libpq/be-secure-gssapi.c:570 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %d)" msgstr "過大なサイズのGSSAPIパケットがクライアントから送出されました: (%zu > %d)" -#: libpq/be-secure-gssapi.c:547 +#: libpq/be-secure-gssapi.c:594 msgid "could not accept GSSAPI security context" msgstr "GSSAPIセキュリティコンテキストを受け入れられませんでした" -#: libpq/be-secure-gssapi.c:637 +#: libpq/be-secure-gssapi.c:689 msgid "GSSAPI size check error" msgstr "GSSAPIサイズチェックエラー" -#: libpq/be-secure-openssl.c:112 +#: libpq/be-secure-openssl.c:122 #, c-format msgid "could not create SSL context: %s" msgstr "SSLコンテキストを作成できませんでした: %s" -#: libpq/be-secure-openssl.c:138 +#: libpq/be-secure-openssl.c:148 #, c-format msgid "could not load server certificate file \"%s\": %s" msgstr "サーバ証明書ファイル\"%s\"をロードできませんでした: %s" -#: libpq/be-secure-openssl.c:158 +#: libpq/be-secure-openssl.c:168 #, c-format msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" -msgstr "パスフレーズが要求されたため秘密キーファイル\"%s\"をリロードできませんでした" +msgstr "パスフレーズが要求されたため秘密鍵ファイル\"%s\"をリロードできませんでした" -#: libpq/be-secure-openssl.c:163 +#: libpq/be-secure-openssl.c:173 #, c-format msgid "could not load private key file \"%s\": %s" -msgstr "秘密キーファイル\"%s\"をロードできませんでした: %s" +msgstr "秘密鍵ファイル\"%s\"をロードできませんでした: %s" -#: libpq/be-secure-openssl.c:172 +#: libpq/be-secure-openssl.c:182 #, c-format msgid "check of private key failed: %s" -msgstr "秘密キーの検査に失敗しました: %s" +msgstr "秘密鍵の検査に失敗しました: %s" -#: libpq/be-secure-openssl.c:184 libpq/be-secure-openssl.c:206 +#. translator: first %s is a GUC option name, second %s is its value +#: libpq/be-secure-openssl.c:195 libpq/be-secure-openssl.c:218 #, c-format msgid "\"%s\" setting \"%s\" not supported by this build" msgstr "このビルドでは\"%s\"を\"%s\"に設定することはできません" -#: libpq/be-secure-openssl.c:194 +#: libpq/be-secure-openssl.c:205 #, c-format msgid "could not set minimum SSL protocol version" -msgstr "SSLプロトコルバージョンを設定できませんでした" +msgstr "最小SSLプロトコルバージョンを設定できませんでした" -#: libpq/be-secure-openssl.c:216 +#: libpq/be-secure-openssl.c:228 #, c-format msgid "could not set maximum SSL protocol version" msgstr "最大SSLプロトコルバージョンを設定できませんでした" -#: libpq/be-secure-openssl.c:232 +#: libpq/be-secure-openssl.c:244 #, c-format msgid "could not set SSL protocol version range" msgstr "SSLプロトコルバージョンの範囲を設定できませんでした" -#: libpq/be-secure-openssl.c:233 +#: libpq/be-secure-openssl.c:245 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "\"%s\"は\"%s\"より大きくできません" -#: libpq/be-secure-openssl.c:257 +#: libpq/be-secure-openssl.c:282 #, c-format msgid "could not set the cipher list (no valid ciphers available)" msgstr "暗号方式リストがセットできません (利用可能な暗号方式がありません)" -#: libpq/be-secure-openssl.c:275 +#: libpq/be-secure-openssl.c:302 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "ルート証明書ファイル\"%s\"をロードできませんでした: %s" -#: libpq/be-secure-openssl.c:302 +#: libpq/be-secure-openssl.c:351 #, c-format msgid "could not load SSL certificate revocation list file \"%s\": %s" msgstr "SSL証明失効リストファイル\"%s\"をロードできませんでした: %s" -#: libpq/be-secure-openssl.c:378 +#: libpq/be-secure-openssl.c:359 +#, c-format +msgid "could not load SSL certificate revocation list directory \"%s\": %s" +msgstr "SSL証明失効リストディレクトリ\"%s\"をロードできませんでした: %s" + +#: libpq/be-secure-openssl.c:367 +#, c-format +msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" +msgstr "SSL証明失効リストファイル\"%s\"またはディレクトリ\"%s\"をロードできませんでした: %s" + +#: libpq/be-secure-openssl.c:425 #, c-format msgid "could not initialize SSL connection: SSL context not set up" msgstr "SSL接続を初期化できませんでした: SSLコンテクストが準備できていません" -#: libpq/be-secure-openssl.c:386 +#: libpq/be-secure-openssl.c:436 #, c-format msgid "could not initialize SSL connection: %s" msgstr "SSL接続を初期化できませんでした: %s" -#: libpq/be-secure-openssl.c:394 +#: libpq/be-secure-openssl.c:444 #, c-format msgid "could not set SSL socket: %s" msgstr "SSLソケットを設定できませんでした: %s" -#: libpq/be-secure-openssl.c:449 +#: libpq/be-secure-openssl.c:499 #, c-format msgid "could not accept SSL connection: %m" msgstr "SSL接続を受け付けられませんでした: %m" -#: libpq/be-secure-openssl.c:453 libpq/be-secure-openssl.c:506 +#: libpq/be-secure-openssl.c:503 libpq/be-secure-openssl.c:556 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "SSL接続を受け付けられませんでした: EOFを検出しました" -#: libpq/be-secure-openssl.c:492 +#: libpq/be-secure-openssl.c:542 #, c-format msgid "could not accept SSL connection: %s" msgstr "SSL接続を受け付けられませんでした: %s" -#: libpq/be-secure-openssl.c:495 +#: libpq/be-secure-openssl.c:545 #, c-format msgid "This may indicate that the client does not support any SSL protocol version between %s and %s." msgstr "このことは、クライアントがSSLプロトコルのバージョン%sから%sのいずれもサポートしていないことを示唆しているかもしれません。" -#: libpq/be-secure-openssl.c:511 libpq/be-secure-openssl.c:642 libpq/be-secure-openssl.c:706 +#: libpq/be-secure-openssl.c:561 libpq/be-secure-openssl.c:741 libpq/be-secure-openssl.c:805 #, c-format msgid "unrecognized SSL error code: %d" msgstr "認識できないSSLエラーコード: %d" -#: libpq/be-secure-openssl.c:553 +#: libpq/be-secure-openssl.c:607 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "SSL 証明書のコモンネームに null が含まれています" -#: libpq/be-secure-openssl.c:631 libpq/be-secure-openssl.c:690 +#: libpq/be-secure-openssl.c:647 +#, c-format +msgid "SSL certificate's distinguished name contains embedded null" +msgstr "SSL証明書の識別名の途中にnullが含まれています" + +#: libpq/be-secure-openssl.c:730 libpq/be-secure-openssl.c:789 #, c-format msgid "SSL error: %s" msgstr "SSLエラー: %s" -#: libpq/be-secure-openssl.c:871 +#: libpq/be-secure-openssl.c:971 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "DHパラメータファイル\"%s\"をオープンできませんでした: %m" -#: libpq/be-secure-openssl.c:883 +#: libpq/be-secure-openssl.c:983 #, c-format msgid "could not load DH parameters file: %s" msgstr "DHパラメータをロードできませんでした: %s" -#: libpq/be-secure-openssl.c:893 +#: libpq/be-secure-openssl.c:993 #, c-format msgid "invalid DH parameters: %s" msgstr "不正なDHパラメータです: %s" -#: libpq/be-secure-openssl.c:901 +#: libpq/be-secure-openssl.c:1002 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "不正なDHパラメータ: pは素数ではありません" -#: libpq/be-secure-openssl.c:909 +#: libpq/be-secure-openssl.c:1011 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "不正なDHパラメータ: 適切な生成器も安全な素数もありません" -#: libpq/be-secure-openssl.c:1065 +#: libpq/be-secure-openssl.c:1172 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: DHパラメータをロードできませんでした" -#: libpq/be-secure-openssl.c:1073 +#: libpq/be-secure-openssl.c:1180 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: DHパラメータを設定できませんでした: %s" -#: libpq/be-secure-openssl.c:1100 +#: libpq/be-secure-openssl.c:1207 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: 認識できない曲線名: %s" -#: libpq/be-secure-openssl.c:1109 +#: libpq/be-secure-openssl.c:1216 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: キーを生成できませんでした" -#: libpq/be-secure-openssl.c:1137 +#: libpq/be-secure-openssl.c:1244 msgid "no SSL error reported" msgstr "SSLエラーはありませんでした" -#: libpq/be-secure-openssl.c:1141 +#: libpq/be-secure-openssl.c:1248 #, c-format msgid "SSL error code %lu" msgstr "SSLエラーコード: %lu" -#: libpq/be-secure.c:122 +#: libpq/be-secure-openssl.c:1402 +#, c-format +msgid "could not create BIO" +msgstr "BIOを作成できませんでした" + +#: libpq/be-secure-openssl.c:1412 #, c-format -msgid "SSL connection from \"%s\"" -msgstr "\"%s\"からのSSL接続" +msgid "could not get NID for ASN1_OBJECT object" +msgstr "ASN1_OBJECTオブジェクトのNIDを取得できませんでした" -#: libpq/be-secure.c:207 libpq/be-secure.c:303 +#: libpq/be-secure-openssl.c:1420 +#, c-format +msgid "could not convert NID %d to an ASN1_OBJECT structure" +msgstr "NID %dをASN1_OBJECT構造体へ変換できませんでした" + +#: libpq/be-secure.c:209 libpq/be-secure.c:305 #, c-format msgid "terminating connection due to unexpected postmaster exit" msgstr "予期しないpostmasterの終了のため、コネクションを終了します" @@ -13287,531 +14312,550 @@ msgstr "ユーザ\"%s\"はパスワードが設定されていません。" msgid "User \"%s\" has an expired password." msgstr "ユーザ\"%s\"のパスワードは期限切れです。" -#: libpq/crypt.c:179 +#: libpq/crypt.c:181 #, c-format msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "ユーザ\"%s\"のパスワードはMD5認証で使用不能です。" -#: libpq/crypt.c:203 libpq/crypt.c:244 libpq/crypt.c:268 +#: libpq/crypt.c:202 libpq/crypt.c:244 libpq/crypt.c:264 #, c-format msgid "Password does not match for user \"%s\"." msgstr "ユーザ\"%s\"のパスワードが合致しません。" -#: libpq/crypt.c:287 +#: libpq/crypt.c:283 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "ユーザ\"%s\"のパスワードは識別不能な形式です。" -#: libpq/hba.c:235 +#: libpq/hba.c:209 #, c-format msgid "authentication file token too long, skipping: \"%s\"" msgstr "認証ファイルのトークンが長すぎますので、飛ばします: \"%s\"" -#: libpq/hba.c:407 +#: libpq/hba.c:381 #, c-format msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" msgstr "セカンダリ認証ファイル\"@%s\"を\"%s\"としてオープンできませんでした: %m" -#: libpq/hba.c:509 -#, c-format -msgid "authentication file line too long" -msgstr "認証ファイルが長すぎます" - -#: libpq/hba.c:510 libpq/hba.c:867 libpq/hba.c:887 libpq/hba.c:925 libpq/hba.c:975 libpq/hba.c:989 libpq/hba.c:1013 libpq/hba.c:1022 libpq/hba.c:1035 libpq/hba.c:1056 libpq/hba.c:1069 libpq/hba.c:1089 libpq/hba.c:1111 libpq/hba.c:1123 libpq/hba.c:1179 libpq/hba.c:1199 libpq/hba.c:1213 libpq/hba.c:1232 libpq/hba.c:1243 libpq/hba.c:1258 libpq/hba.c:1276 libpq/hba.c:1292 libpq/hba.c:1304 libpq/hba.c:1341 libpq/hba.c:1382 libpq/hba.c:1395 libpq/hba.c:1417 -#: libpq/hba.c:1430 libpq/hba.c:1442 libpq/hba.c:1460 libpq/hba.c:1510 libpq/hba.c:1554 libpq/hba.c:1565 libpq/hba.c:1581 libpq/hba.c:1598 libpq/hba.c:1608 libpq/hba.c:1668 libpq/hba.c:1706 libpq/hba.c:1728 libpq/hba.c:1740 libpq/hba.c:1827 libpq/hba.c:1845 libpq/hba.c:1939 libpq/hba.c:1958 libpq/hba.c:1987 libpq/hba.c:2000 libpq/hba.c:2023 libpq/hba.c:2045 libpq/hba.c:2059 tsearch/ts_locale.c:190 +#: libpq/hba.c:832 #, c-format -msgid "line %d of configuration file \"%s\"" -msgstr "設定ファイル \"%2$s\" の %1$d 行目" +msgid "error enumerating network interfaces: %m" +msgstr "ネットワークインターフェース列挙中のエラー: %m" #. translator: the second %s is a list of auth methods -#: libpq/hba.c:865 +#: libpq/hba.c:859 #, c-format msgid "authentication option \"%s\" is only valid for authentication methods %s" msgstr "認証オプション\"%s\"は認証方式%sでのみ有効です" -#: libpq/hba.c:885 +#: libpq/hba.c:861 libpq/hba.c:881 libpq/hba.c:916 libpq/hba.c:967 libpq/hba.c:981 libpq/hba.c:1005 libpq/hba.c:1013 libpq/hba.c:1025 libpq/hba.c:1046 libpq/hba.c:1059 libpq/hba.c:1079 libpq/hba.c:1101 libpq/hba.c:1113 libpq/hba.c:1172 libpq/hba.c:1192 libpq/hba.c:1206 libpq/hba.c:1226 libpq/hba.c:1237 libpq/hba.c:1252 libpq/hba.c:1271 libpq/hba.c:1287 libpq/hba.c:1299 libpq/hba.c:1336 libpq/hba.c:1377 libpq/hba.c:1390 libpq/hba.c:1412 libpq/hba.c:1424 +#: libpq/hba.c:1442 libpq/hba.c:1492 libpq/hba.c:1536 libpq/hba.c:1547 libpq/hba.c:1563 libpq/hba.c:1580 libpq/hba.c:1591 libpq/hba.c:1610 libpq/hba.c:1626 libpq/hba.c:1642 libpq/hba.c:1700 libpq/hba.c:1717 libpq/hba.c:1730 libpq/hba.c:1742 libpq/hba.c:1761 libpq/hba.c:1847 libpq/hba.c:1865 libpq/hba.c:1959 libpq/hba.c:1978 libpq/hba.c:2007 libpq/hba.c:2020 libpq/hba.c:2043 libpq/hba.c:2065 libpq/hba.c:2079 tsearch/ts_locale.c:232 +#, c-format +msgid "line %d of configuration file \"%s\"" +msgstr "設定ファイル \"%2$s\" の %1$d 行目" + +#: libpq/hba.c:879 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "認証方式\"%s\"の場合は引数\"%s\"がセットされなければなりません" -#: libpq/hba.c:913 +#: libpq/hba.c:903 #, c-format msgid "missing entry in file \"%s\" at end of line %d" msgstr "ファイル\"%s\"の最終行%dでエントリが足りません" -#: libpq/hba.c:924 +#: libpq/hba.c:915 #, c-format msgid "multiple values in ident field" msgstr "identヂールド内の複数の値" -#: libpq/hba.c:973 +#: libpq/hba.c:965 #, c-format msgid "multiple values specified for connection type" msgstr "接続タイプで複数の値が指定されました" -#: libpq/hba.c:974 +#: libpq/hba.c:966 #, c-format msgid "Specify exactly one connection type per line." msgstr "1行に1つの接続タイプだけを指定してください" -#: libpq/hba.c:988 +#: libpq/hba.c:980 #, c-format msgid "local connections are not supported by this build" msgstr "このビルドではlocal接続はサポートされていません" -#: libpq/hba.c:1011 +#: libpq/hba.c:1003 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "SSLが無効なため、hostssl行は照合できません" -#: libpq/hba.c:1012 +#: libpq/hba.c:1004 #, c-format msgid "Set ssl = on in postgresql.conf." msgstr "postgresql.confで ssl = on に設定してください。" -#: libpq/hba.c:1020 +#: libpq/hba.c:1012 #, c-format msgid "hostssl record cannot match because SSL is not supported by this build" msgstr "このビルドではhostsslはサポートされていないため、hostssl行は照合できません" -#: libpq/hba.c:1021 -#, c-format -msgid "Compile with --with-openssl to use SSL connections." -msgstr "SSL 接続を有効にするには --with-openssl でコンパイルしてください。" - -#: libpq/hba.c:1033 +#: libpq/hba.c:1024 #, c-format msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" msgstr "このビルドでは GSSAPI をサポートしていないため hostgssenc レコードは照合できません" -#: libpq/hba.c:1034 -#, c-format -msgid "Compile with --with-gssapi to use GSSAPI connections." -msgstr "GSSAPI 接続を有効にするには --with-gssapi でコンパイルしてください。" - -#: libpq/hba.c:1054 +#: libpq/hba.c:1044 #, c-format msgid "invalid connection type \"%s\"" msgstr "接続オプションタイプ \"%s\" は不正です" -#: libpq/hba.c:1068 +#: libpq/hba.c:1058 #, c-format msgid "end-of-line before database specification" msgstr "データベース指定の前に行末を検出しました" -#: libpq/hba.c:1088 +#: libpq/hba.c:1078 #, c-format msgid "end-of-line before role specification" msgstr "ロール指定の前に行末を検出しました" -#: libpq/hba.c:1110 +#: libpq/hba.c:1100 #, c-format msgid "end-of-line before IP address specification" msgstr "IP アドレス指定の前に行末を検出しました" -#: libpq/hba.c:1121 +#: libpq/hba.c:1111 #, c-format msgid "multiple values specified for host address" msgstr "ホストアドレスで複数の値が指定されました" -#: libpq/hba.c:1122 +#: libpq/hba.c:1112 #, c-format msgid "Specify one address range per line." msgstr "1行に1つのアドレス範囲を指定してください" -#: libpq/hba.c:1177 +#: libpq/hba.c:1170 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "不正なIPアドレス\"%s\": %s" -#: libpq/hba.c:1197 +#: libpq/hba.c:1190 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "ホスト名とCIDRマスクを両方指定するのは不正です: \"%s\"" -#: libpq/hba.c:1211 +#: libpq/hba.c:1204 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "IPアドレス\"%s\"内の CIDR マスクが不正です" -#: libpq/hba.c:1230 +#: libpq/hba.c:1224 #, c-format msgid "end-of-line before netmask specification" msgstr "ネットマスク指定の前に行末を検出しました" -#: libpq/hba.c:1231 +#: libpq/hba.c:1225 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "CIDR記法でアドレス範囲を指定してするか、ネットマスクを分けて指定してください。" -#: libpq/hba.c:1242 +#: libpq/hba.c:1236 #, c-format msgid "multiple values specified for netmask" msgstr "ネットマスクで複数の値が指定されました" -#: libpq/hba.c:1256 +#: libpq/hba.c:1250 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "不正なIPマスク\"%s\": %s" -#: libpq/hba.c:1275 +#: libpq/hba.c:1270 #, c-format msgid "IP address and mask do not match" msgstr "IPアドレスとマスクが一致しません" -#: libpq/hba.c:1291 +#: libpq/hba.c:1286 #, c-format msgid "end-of-line before authentication method" msgstr "認証方式指定の前に行末を検出しました" -#: libpq/hba.c:1302 +#: libpq/hba.c:1297 #, c-format msgid "multiple values specified for authentication type" msgstr "認証タイプで複数の値が指定されました" -#: libpq/hba.c:1303 +#: libpq/hba.c:1298 #, c-format msgid "Specify exactly one authentication type per line." msgstr "認証タイプは1行に1つだけ指定してください。" -#: libpq/hba.c:1380 +#: libpq/hba.c:1375 #, c-format msgid "invalid authentication method \"%s\"" msgstr "不正な認証方式\"%s\"" -#: libpq/hba.c:1393 +#: libpq/hba.c:1388 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "不正な認証方式\"%s\": このビルドではサポートされていません" -#: libpq/hba.c:1416 +#: libpq/hba.c:1411 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "ローカルソケットではgssapi認証はサポートしていません" -#: libpq/hba.c:1429 -#, c-format -msgid "GSSAPI encryption only supports gss, trust, or reject authentication" -msgstr "GSSAPI暗号化は gss、trust または reject 認証のみをサポートします" - -#: libpq/hba.c:1441 +#: libpq/hba.c:1423 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "peer認証はローカルソケットでのみサポートしています" -#: libpq/hba.c:1459 +#: libpq/hba.c:1441 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "hostssl接続では証明書認証のみをサポートしています" -#: libpq/hba.c:1509 +#: libpq/hba.c:1491 #, c-format msgid "authentication option not in name=value format: %s" msgstr "認証オプションが 名前=値 形式になっていません: %s" -#: libpq/hba.c:1553 +#: libpq/hba.c:1535 #, c-format msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" msgstr "ldapbasedn、 ldapbinddn、ldapbindpasswd、ldapsearchattribute、, ldapsearchfilter またはldapurlは、ldapprefixと同時には指定できません" -#: libpq/hba.c:1564 +#: libpq/hba.c:1546 #, c-format msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" msgstr "\"ldap\"認証方式の場合は引数 \"ldapbasedn\"、\"ldapprefix\"、\"ldapsuffix\"のいずれかを指定してください" -#: libpq/hba.c:1580 +#: libpq/hba.c:1562 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "ldapsearchattribute、ldapsearchfilter と同時には指定できません" -#: libpq/hba.c:1597 +#: libpq/hba.c:1579 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "RADIUSサーバのリストは空にはできません" +#: libpq/hba.c:1590 +#, c-format +msgid "list of RADIUS secrets cannot be empty" +msgstr "RADIUSシークレットのリストは空にはできません" + #: libpq/hba.c:1607 #, c-format -msgid "list of RADIUS secrets cannot be empty" -msgstr "RADIUSシークレットのリストは空にはできません" +msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "RADIUSシークレットの数(%d)は1またはRADIUSサーバーの数(%d)と同じである必要があります" + +#: libpq/hba.c:1623 +#, c-format +msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "RADIUSポートの数(%d)は1またはRADIUSサーバーの数(%d)と同じである必要があります" -#: libpq/hba.c:1662 +#: libpq/hba.c:1639 #, c-format -msgid "the number of %s (%d) must be 1 or the same as the number of %s (%d)" -msgstr "%sの数(%d)は1または%sの数(%d)と同じである必要があります" +msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "RADIUS識別子の数(%d)は1またはRADIUSサーバーの数(%d)と同じである必要があります" # -#: libpq/hba.c:1696 +#: libpq/hba.c:1690 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident、peer、gssapi、sspiおよびcert" -#: libpq/hba.c:1705 +#: libpq/hba.c:1699 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "クライアント証明書は\"hostssl\"の行でのみ設定できます" -#: libpq/hba.c:1727 +#: libpq/hba.c:1716 #, c-format -msgid "clientcert can not be set to \"no-verify\" when using \"cert\" authentication" -msgstr "\"cert\"認証使用時はclientcertは\"no-verify\"には設定できません" +msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" +msgstr "\"cert\"認証使用時はclientcertは\"verify-full\"にしか設定できません" -#: libpq/hba.c:1739 +#: libpq/hba.c:1729 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "clientcertの値が不正です: \"%s\"" -#: libpq/hba.c:1773 +#: libpq/hba.c:1741 +#, c-format +msgid "clientname can only be configured for \"hostssl\" rows" +msgstr "クライアント名は\"hostssl\"の行でのみ設定できます" + +#: libpq/hba.c:1760 +#, c-format +msgid "invalid value for clientname: \"%s\"" +msgstr "clientnameの値が不正です: \"%s\"" + +#: libpq/hba.c:1793 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "LDAP URL\"%s\"をパースできませんでした: %s" -#: libpq/hba.c:1784 +#: libpq/hba.c:1804 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "非サポートのLDAP URLコード: %s" -#: libpq/hba.c:1808 +#: libpq/hba.c:1828 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "このプラットフォームではLDAP URLをサポートしていません。" -#: libpq/hba.c:1826 +#: libpq/hba.c:1846 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "不正な ldapscheme の値: \"%s\"" -#: libpq/hba.c:1844 +#: libpq/hba.c:1864 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "不正なLDAPポート番号です: \"%s\"" # -#: libpq/hba.c:1890 libpq/hba.c:1897 +#: libpq/hba.c:1910 libpq/hba.c:1917 msgid "gssapi and sspi" msgstr "gssapiおよびsspi" -#: libpq/hba.c:1906 libpq/hba.c:1915 +#: libpq/hba.c:1926 libpq/hba.c:1935 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1937 +#: libpq/hba.c:1957 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "RADIUSサーバのリスト\"%s\"のパースに失敗しました" -#: libpq/hba.c:1985 +#: libpq/hba.c:2005 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "RADIUSポートのリスト\"%s\"のパースに失敗しました" -#: libpq/hba.c:1999 +#: libpq/hba.c:2019 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "不正なRADIUSポート番号: \"%s\"" -#: libpq/hba.c:2021 +#: libpq/hba.c:2041 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "RADIUSシークレットのリスト\"%s\"のパースに失敗しました" -#: libpq/hba.c:2043 +#: libpq/hba.c:2063 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "RADIUS識別子のリスト\"%s\"のパースに失敗しました" -#: libpq/hba.c:2057 +#: libpq/hba.c:2077 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "認証オプション名を認識できません: \"%s\"" -#: libpq/hba.c:2252 +#: libpq/hba.c:2274 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "設定ファイル\"%s\"には何も含まれていません" -#: libpq/hba.c:2770 +#: libpq/hba.c:2374 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "不正な正規表現\"%s\": %s" -#: libpq/hba.c:2830 +#: libpq/hba.c:2437 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "正規表現\"%s\"で照合に失敗しました: %s" -#: libpq/hba.c:2849 +#: libpq/hba.c:2456 #, c-format msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" msgstr "正規表現\"%s\"には\"%s\"における後方参照が要求する副表現が含まれていません" -#: libpq/hba.c:2945 +#: libpq/hba.c:2552 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "与えられたユーザ名 (%s) と認証されたユーザ名 (%s) が一致しません" -#: libpq/hba.c:2965 +#: libpq/hba.c:2572 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "\"%3$s\"として認証されたユーザ\"%2$s\"はユーザマップ\"%1$s\"に一致しません" -#: libpq/hba.c:2998 +#: libpq/hba.c:2605 utils/adt/hbafuncs.c:512 #, c-format msgid "could not open usermap file \"%s\": %m" msgstr "ユーザマップファイル\"%s\"をオープンできませんでした: %m" -#: libpq/pqcomm.c:218 +#: libpq/pqcomm.c:204 #, c-format msgid "could not set socket to nonblocking mode: %m" msgstr "ソケットを非ブロッキングモードに設定できませんでした: %m" -#: libpq/pqcomm.c:372 +#: libpq/pqcomm.c:362 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "Unixドメインソケットのパス\"%s\"が長すぎます(最大 %d バイト)" -#: libpq/pqcomm.c:393 +#: libpq/pqcomm.c:383 #, c-format msgid "could not translate host name \"%s\", service \"%s\" to address: %s" msgstr "ホスト名\"%s\"、サービス\"%s\"をアドレスに変換できませんでした: %s" -#: libpq/pqcomm.c:397 +#: libpq/pqcomm.c:387 #, c-format msgid "could not translate service \"%s\" to address: %s" msgstr "サービス\"%s\"をアドレスに変換できませんでした: %s" -#: libpq/pqcomm.c:424 +#: libpq/pqcomm.c:414 #, c-format msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" msgstr "要求されたアドレスを全てバインドできませんでした: MAXLISTEN (%d)を超えています" -#: libpq/pqcomm.c:433 +#: libpq/pqcomm.c:423 msgid "IPv4" msgstr "IPv4" -#: libpq/pqcomm.c:437 +#: libpq/pqcomm.c:427 msgid "IPv6" msgstr "IPv6" -#: libpq/pqcomm.c:442 +#: libpq/pqcomm.c:432 msgid "Unix" msgstr "Unix" -#: libpq/pqcomm.c:447 +#: libpq/pqcomm.c:437 #, c-format msgid "unrecognized address family %d" msgstr "アドレスファミリ %d を認識できません" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:473 +#: libpq/pqcomm.c:463 #, c-format msgid "could not create %s socket for address \"%s\": %m" msgstr "アドレス\"%s\"に対する%sソケットの作成に失敗しました: %m" -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:499 -#, c-format -msgid "setsockopt(SO_REUSEADDR) failed for %s address \"%s\": %m" -msgstr "%sアドレス\"%s\"に対するsetsockopt(SO_REUSEADDR)が失敗しました: %m" - -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:516 +#. translator: third %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:489 libpq/pqcomm.c:507 #, c-format -msgid "setsockopt(IPV6_V6ONLY) failed for %s address \"%s\": %m" -msgstr "%sアドレス\"%s\"に対するsetsockopt(IPV6_V6ONLY)が失敗しました: %m" +msgid "%s(%s) failed for %s address \"%s\": %m" +msgstr "%3$sアドレス%4$sに対する%1$s(%2$s)が失敗しました: %5$m" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:536 +#: libpq/pqcomm.c:530 #, c-format msgid "could not bind %s address \"%s\": %m" msgstr "%sアドレス\"%s\"のbindに失敗しました: %m" -#: libpq/pqcomm.c:539 +#: libpq/pqcomm.c:534 #, c-format -msgid "Is another postmaster already running on port %d? If not, remove socket file \"%s\" and retry." -msgstr "すでに他にpostmasterがポート%dで稼動していませんか? 稼動していなければソケットファイル\"%s\"を削除して再試行してください。" +msgid "Is another postmaster already running on port %d?" +msgstr "すでに他のpostmasterがポート%dで稼動していませんか?" -#: libpq/pqcomm.c:542 +#: libpq/pqcomm.c:536 #, c-format msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." msgstr "すでに他にpostmasterがポート%dで稼動していませんか? 稼動していなければ数秒待ってから再試行してください。" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:575 +#: libpq/pqcomm.c:569 #, c-format msgid "could not listen on %s address \"%s\": %m" msgstr "%sアドレス\"%s\"のlistenに失敗しました: %m" -#: libpq/pqcomm.c:584 +#: libpq/pqcomm.c:578 #, c-format msgid "listening on Unix socket \"%s\"" msgstr "Unixソケット\"%s\"で待ち受けています" #. translator: first %s is IPv4 or IPv6 -#: libpq/pqcomm.c:590 +#: libpq/pqcomm.c:584 #, c-format msgid "listening on %s address \"%s\", port %d" msgstr "%sアドレス\"%s\"、ポート%dで待ち受けています" -#: libpq/pqcomm.c:673 +#: libpq/pqcomm.c:675 #, c-format msgid "group \"%s\" does not exist" msgstr "グループ\"%s\"は存在しません" -#: libpq/pqcomm.c:683 +#: libpq/pqcomm.c:685 #, c-format msgid "could not set group of file \"%s\": %m" msgstr "ファイル\"%s\"のグループを設定できませんでした: %m" -#: libpq/pqcomm.c:694 +#: libpq/pqcomm.c:696 #, c-format msgid "could not set permissions of file \"%s\": %m" msgstr "ファイル\"%s\"の権限を設定できませんでした: %m" -#: libpq/pqcomm.c:724 +#: libpq/pqcomm.c:726 #, c-format msgid "could not accept new connection: %m" msgstr "新しい接続を受け付けることができませんでした: %m" -#: libpq/pqcomm.c:914 +#: libpq/pqcomm.c:766 libpq/pqcomm.c:775 libpq/pqcomm.c:807 libpq/pqcomm.c:817 libpq/pqcomm.c:1642 libpq/pqcomm.c:1687 libpq/pqcomm.c:1727 libpq/pqcomm.c:1771 libpq/pqcomm.c:1810 libpq/pqcomm.c:1849 libpq/pqcomm.c:1885 libpq/pqcomm.c:1924 +#, c-format +msgid "%s(%s) failed: %m" +msgstr "%s(%s)が失敗しました: %m" + +#: libpq/pqcomm.c:921 #, c-format msgid "there is no client connection" msgstr "クライアント接続がありません" -#: libpq/pqcomm.c:965 libpq/pqcomm.c:1061 +#: libpq/pqcomm.c:972 libpq/pqcomm.c:1068 #, c-format msgid "could not receive data from client: %m" msgstr "クライアントからデータを受信できませんでした: %m" -#: libpq/pqcomm.c:1206 tcop/postgres.c:4142 +#: libpq/pqcomm.c:1173 tcop/postgres.c:4334 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "プロトコルの同期が失われたためコネクションを終了します" -#: libpq/pqcomm.c:1272 +#: libpq/pqcomm.c:1239 #, c-format msgid "unexpected EOF within message length word" msgstr "メッセージ長ワード内のEOFは想定外です" -#: libpq/pqcomm.c:1283 +#: libpq/pqcomm.c:1249 #, c-format msgid "invalid message length" msgstr "メッセージ長が不正です" -#: libpq/pqcomm.c:1305 libpq/pqcomm.c:1318 +#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 #, c-format msgid "incomplete message from client" msgstr "クライアントからのメッセージが不完全です" -#: libpq/pqcomm.c:1451 +#: libpq/pqcomm.c:1395 #, c-format msgid "could not send data to client: %m" msgstr "クライアントにデータを送信できませんでした: %m" +#: libpq/pqcomm.c:1610 +#, c-format +msgid "%s(%s) failed: error code %d" +msgstr "%s(%s)が失敗しました: エラーコード %d" + +#: libpq/pqcomm.c:1699 +#, c-format +msgid "setting the keepalive idle time is not supported" +msgstr "キープアライブのアイドル時間の設定はサポートされていません" + +#: libpq/pqcomm.c:1783 libpq/pqcomm.c:1858 libpq/pqcomm.c:1933 +#, c-format +msgid "%s(%s) not supported" +msgstr "%s(%s)はサポートされていません" + #: libpq/pqformat.c:406 #, c-format msgid "no data left in message" msgstr "メッセージ内にデータが残っていません" -#: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 utils/adt/arrayfuncs.c:1492 utils/adt/rowtypes.c:587 +#: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 utils/adt/arrayfuncs.c:1482 utils/adt/rowtypes.c:588 #, c-format msgid "insufficient data left in message" msgstr "メッセージ内に残るデータが不十分です" @@ -13826,12 +14870,12 @@ msgstr "メッセージ内の文字列が不正です" msgid "invalid message format" msgstr "メッセージの書式が不正です" -#: main/main.c:245 +#: main/main.c:239 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: WSAStartupが失敗しました: %d\n" -#: main/main.c:309 +#: main/main.c:350 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -13840,7 +14884,7 @@ msgstr "" "%sはPostgreSQLサーバです\n" "\n" -#: main/main.c:310 +#: main/main.c:351 #, c-format msgid "" "Usage:\n" @@ -13851,112 +14895,107 @@ msgstr "" " %s [オプション]...\n" "\n" -#: main/main.c:311 +#: main/main.c:352 #, c-format msgid "Options:\n" msgstr "オプション:\n" -#: main/main.c:312 +#: main/main.c:353 #, c-format msgid " -B NBUFFERS number of shared buffers\n" -msgstr " -B NBUFFERS 共有バッファの数\n" +msgstr " -B NBUFFERS 共有バッファの数\n" -#: main/main.c:313 +#: main/main.c:354 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" -msgstr " -c NAME=VALUE 実行時パラメータの設定\n" +msgstr " -c NAME=VALUE 実行時パラメータの設定\n" -#: main/main.c:314 +#: main/main.c:355 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" -msgstr " -C NAME 実行時パラメータの値を表示し、終了します\n" +msgstr " -C NAME 実行時パラメータの値を表示し、終了\n" -#: main/main.c:315 +#: main/main.c:356 #, c-format msgid " -d 1-5 debugging level\n" -msgstr " -d 1-5 デバッグレベル\n" +msgstr " -d 1-5 デバッグレベル\n" -#: main/main.c:316 +#: main/main.c:357 #, c-format msgid " -D DATADIR database directory\n" -msgstr " -D DATADIR データベースディレクトリ\n" +msgstr " -D DATADIR データベースディレクトリ\n" -#: main/main.c:317 +#: main/main.c:358 #, c-format msgid " -e use European date input format (DMY)\n" -msgstr " -e ヨーロッパ式の日付フォーマットでの入力(DMY)\n" +msgstr " -e ヨーロッパ式の日付フォーマットでの入力(DMY)\n" -#: main/main.c:318 +#: main/main.c:359 #, c-format msgid " -F turn fsync off\n" -msgstr " -F fsyncを無効にします\n" +msgstr " -F fsyncを無効にする\n" -#: main/main.c:319 +#: main/main.c:360 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" -msgstr " -h HOSTNAME 接続を待ち受けるホスト名またはIPアドレス\n" +msgstr " -h HOSTNAME 接続を待ち受けるホスト名またはIPアドレス\n" -#: main/main.c:320 +#: main/main.c:361 #, c-format msgid " -i enable TCP/IP connections\n" -msgstr " -i TCP/IP接続を有効にします\n" +msgstr " -i TCP/IP接続を有効にする\n" -#: main/main.c:321 +#: main/main.c:362 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" -msgstr " -k DIRECTORY Unixドメインソケットの場所\n" +msgstr " -k DIRECTORY Unixドメインソケットの場所\n" -#: main/main.c:323 +#: main/main.c:364 #, c-format msgid " -l enable SSL connections\n" -msgstr " -l SSL接続を有効にします\n" +msgstr " -l SSL接続を有効にする\n" -#: main/main.c:325 +#: main/main.c:366 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" -msgstr " -N MAX-CONNECT 許容する最大接続数\n" +msgstr " -N MAX-CONNECT 許容する最大接続数\n" -#: main/main.c:326 -#, c-format -msgid " -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n" -msgstr " -o OPTIONS 個々のサーバプロセスに\"OPTIONS\"を渡します(古い形式)\n" - -#: main/main.c:327 +#: main/main.c:367 #, c-format msgid " -p PORT port number to listen on\n" -msgstr " -p PORT 接続を待ち受けるポート番号\n" +msgstr " -p PORT 接続を待ち受けるポート番号\n" -#: main/main.c:328 +#: main/main.c:368 #, c-format msgid " -s show statistics after each query\n" -msgstr " -s 各問い合わせの後に統計情報を表示します\n" +msgstr " -s 各問い合わせの後に統計情報を表示\n" -#: main/main.c:329 +#: main/main.c:369 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" -msgstr " -S WORK-MEM ソート用のメモリ量 (KB単位)\n" +msgstr " -S WORK-MEM ソート用のメモリ量 (KB単位)\n" -#: main/main.c:330 +#: main/main.c:370 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version バージョン情報を表示し、終了します\n" +msgstr " -V, --version バージョン情報を表示し、終了\n" -#: main/main.c:331 +#: main/main.c:371 #, c-format msgid " --NAME=VALUE set run-time parameter\n" -msgstr " --NAME=VALUE 実行時パラメータを設定します\n" +msgstr " --NAME=VALUE 実行時パラメータを設定\n" -#: main/main.c:332 +#: main/main.c:372 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" -msgstr " --describe-config 設定パラメータの説明を出力し、終了します\n" +msgstr " --describe-config 設定パラメータの説明を出力し、終了\n" -#: main/main.c:333 +#: main/main.c:373 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help このヘルプを表示し、終了します\n" +msgstr " -?, --help このヘルプを表示し、終了\n" -#: main/main.c:335 +#: main/main.c:375 #, c-format msgid "" "\n" @@ -13965,42 +15004,44 @@ msgstr "" "\n" "開発者向けオプション:\n" -#: main/main.c:336 +#: main/main.c:376 #, c-format msgid " -f s|i|n|m|h forbid use of some plan types\n" -msgstr " -f s|i|n|m|h いくつかのプランタイプを禁止します\n" +msgstr " -f s|i|n|m|h いくつかのプランタイプを禁止\n" -#: main/main.c:337 +#: main/main.c:377 #, c-format msgid " -n do not reinitialize shared memory after abnormal exit\n" -msgstr " -n 異常終了後に共有メモリの再初期化を行いません\n" +msgstr " -n 異常終了後に共有メモリの再初期化を行わない\n" -#: main/main.c:338 +#: main/main.c:378 #, c-format msgid " -O allow system table structure changes\n" -msgstr " -O システムテーブル構造の変更を許可します\n" +msgstr " -O システムテーブル構造の変更を許可\n" -#: main/main.c:339 +#: main/main.c:379 #, c-format msgid " -P disable system indexes\n" -msgstr " -P システムインデックスを無効にします\n" +msgstr " -P システムインデックスを無効にする\n" -#: main/main.c:340 +#: main/main.c:380 #, c-format msgid " -t pa|pl|ex show timings after each query\n" -msgstr " -t pa|pl|ex 各問い合わせの後に時間情報を表示します\n" +msgstr " -t pa|pl|ex 各問い合わせの後に時間情報を表示\n" -#: main/main.c:341 +#: main/main.c:381 #, c-format msgid " -T send SIGSTOP to all backend processes if one dies\n" -msgstr " -T 1つのバックエンドプロセス異常停止した時に全てのバックエンドプロセスSIGSTOPを送信します\n" +msgstr "" +" -T 1つのバックエンドプロセス異常停止した時に全てのバックエンド\n" +" プロセスSIGSTOPを送信\n" -#: main/main.c:342 +#: main/main.c:382 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" -msgstr " -W NUM デバッガをアタッチできるようにNUM秒待機します\n" +msgstr " -W NUM デバッガをアタッチできるようにNUM秒待機\n" -#: main/main.c:344 +#: main/main.c:384 #, c-format msgid "" "\n" @@ -14009,37 +15050,37 @@ msgstr "" "\n" "シングルユーザモード用のオプション:\n" -#: main/main.c:345 +#: main/main.c:385 #, c-format msgid " --single selects single-user mode (must be first argument)\n" -msgstr " --single シングルユーザモードを選択します(最初の引数でなければなりません)\n" +msgstr " --single シングルユーザモードを選択 (最初の引数でなければなりません)\n" -#: main/main.c:346 +#: main/main.c:386 #, c-format msgid " DBNAME database name (defaults to user name)\n" -msgstr " DBNAME データベース名(デフォルトはユーザ名です)\n" +msgstr " DBNAME データベース名 (デフォルトはユーザ名)\n" -#: main/main.c:347 +#: main/main.c:387 #, c-format msgid " -d 0-5 override debugging level\n" -msgstr " -d 1-5 デバッグレベルを上書きします\n" +msgstr " -d 0-5 デバッグレベルを上書き\n" -#: main/main.c:348 +#: main/main.c:388 #, c-format msgid " -E echo statement before execution\n" -msgstr " -E 実行前に文を表示します\n" +msgstr " -E 実行前に文を表示\n" -#: main/main.c:349 +#: main/main.c:389 #, c-format msgid " -j do not use newline as interactive query delimiter\n" -msgstr " -j 対話式問い合わせの区切りとして改行を使用しません\n" +msgstr " -j 対話式問い合わせの区切りとして改行を使用しない\n" -#: main/main.c:350 main/main.c:355 +#: main/main.c:390 main/main.c:396 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" -msgstr " -r FILENAME 標準出力と標準エラー出力を指定したファイルに出力します\n" +msgstr " -r FILENAME 標準出力と標準エラー出力を指定したファイルに出力\n" -#: main/main.c:352 +#: main/main.c:392 #, c-format msgid "" "\n" @@ -14048,22 +15089,22 @@ msgstr "" "\n" "初期起動用のオプション:\n" -#: main/main.c:353 +#: main/main.c:393 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" -msgstr " --boot 初期起動モードを選択します(最初の引数でなければなりません)\n" +msgstr " --boot 初期起動モードを選択 (最初の引数でなければなりません)\n" -#: main/main.c:354 +#: main/main.c:394 #, c-format -msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" -msgstr " DBNAME データベース名(初期起動モードでは必須の引数)\n" +msgid " --check selects check mode (must be first argument)\n" +msgstr " --check チェックモードを選択 (最初の引数でなければなりません)\n" -#: main/main.c:356 +#: main/main.c:395 #, c-format -msgid " -x NUM internal use\n" -msgstr " -x NUM 内部使用\n" +msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" +msgstr " DBNAME データベース名 (初期起動モードでは必須の引数)\n" -#: main/main.c:358 +#: main/main.c:398 #, c-format msgid "" "\n" @@ -14079,12 +15120,12 @@ msgstr "" "\n" "不具合は<%s>まで報告してください。\n" -#: main/main.c:362 +#: main/main.c:402 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: main/main.c:373 +#: main/main.c:413 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -14097,12 +15138,12 @@ msgstr "" "する必要があります。適切なサーバの起動方法に関する詳細はドキュメントを\n" "参照してください\n" -#: main/main.c:390 +#: main/main.c:430 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: 実ユーザIDと実効ユーザIDは一致しなければなりません\n" -#: main/main.c:397 +#: main/main.c:437 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -14126,25 +15167,30 @@ msgstr "拡張可能ノードタイプ\"%s\"はすでに存在します" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods \"%s\"は登録されていません" -#: nodes/makefuncs.c:150 +#: nodes/makefuncs.c:151 statistics/extended_stats.c:2283 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "リレーション\"%s\"は複合型を持っていません" -#: nodes/nodeFuncs.c:122 nodes/nodeFuncs.c:153 parser/parse_coerce.c:2208 parser/parse_coerce.c:2317 parser/parse_coerce.c:2352 parser/parse_expr.c:2207 parser/parse_func.c:701 parser/parse_oper.c:967 utils/fmgr/funcapi.c:528 +#: nodes/makefuncs.c:905 +#, c-format +msgid "unrecognized JSON encoding: %s" +msgstr "認識できないJSON符号化方式: \"%s\"" + +#: nodes/nodeFuncs.c:114 nodes/nodeFuncs.c:145 parser/parse_coerce.c:2567 parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 parser/parse_expr.c:2085 parser/parse_func.c:710 parser/parse_oper.c:883 utils/fmgr/funcapi.c:627 #, c-format msgid "could not find array type for data type %s" msgstr "データ型%sの配列型がありませんでした" #: nodes/params.c:417 #, c-format -msgid "extended query \"%s\" with parameters: %s" -msgstr "パラメータを持つ拡張問い合わせ\"%s\": %s" +msgid "portal \"%s\" with parameters: %s" +msgstr "パラメータを持つポータル\"%s\": %s" #: nodes/params.c:420 #, c-format -msgid "extended query with parameters: %s" -msgstr "パラメータを持つ拡張問い合わせ: %s" +msgid "unnamed portal with parameters: %s" +msgstr "パラメータを持つ無名ポータル: %s" #: optimizer/path/joinrels.c:855 #, c-format @@ -14152,306 +15198,313 @@ msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join con msgstr "FULL JOIN はマージ結合可能もしくはハッシュ結合可能な場合のみサポートされています" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1193 +#: optimizer/plan/initsplan.c:1192 #, c-format msgid "%s cannot be applied to the nullable side of an outer join" msgstr "外部結合のNULL可な側では%sを適用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1922 parser/analyze.c:1639 parser/analyze.c:1855 parser/analyze.c:2715 +#: optimizer/plan/planner.c:1341 parser/analyze.c:1714 parser/analyze.c:1970 parser/analyze.c:3149 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "UNION/INTERSECT/EXCEPTでは%sを使用できません" -#: optimizer/plan/planner.c:2509 optimizer/plan/planner.c:4162 +#: optimizer/plan/planner.c:2048 optimizer/plan/planner.c:3704 #, c-format msgid "could not implement GROUP BY" msgstr "GROUP BY を実行できませんでした" -#: optimizer/plan/planner.c:2510 optimizer/plan/planner.c:4163 optimizer/plan/planner.c:4890 optimizer/prep/prepunion.c:1045 +#: optimizer/plan/planner.c:2049 optimizer/plan/planner.c:3705 optimizer/plan/planner.c:4348 optimizer/prep/prepunion.c:1046 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "一部のデータ型がハッシュのみをサポートする一方で、別の型はソートのみをサポートしています。" -#: optimizer/plan/planner.c:4889 +#: optimizer/plan/planner.c:4347 #, c-format msgid "could not implement DISTINCT" msgstr "DISTINCTを実行できませんでした" -#: optimizer/plan/planner.c:5737 +#: optimizer/plan/planner.c:5468 #, c-format msgid "could not implement window PARTITION BY" msgstr "ウィンドウの PARTITION BY を実行できませんでした" -#: optimizer/plan/planner.c:5738 +#: optimizer/plan/planner.c:5469 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "ウィンドウ分割に使用する列は、ソート可能なデータ型でなければなりません。" -#: optimizer/plan/planner.c:5742 +#: optimizer/plan/planner.c:5473 #, c-format msgid "could not implement window ORDER BY" msgstr "ウィンドウの ORDER BY を実行できませんでした" -#: optimizer/plan/planner.c:5743 +#: optimizer/plan/planner.c:5474 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "ウィンドウの順序付けをする列は、ソート可能なデータ型でなければなりません。" -#: optimizer/plan/setrefs.c:451 -#, c-format -msgid "too many range table entries" -msgstr "レンジテーブルの数が多すぎます" - -#: optimizer/prep/prepunion.c:508 +#: optimizer/prep/prepunion.c:509 #, c-format msgid "could not implement recursive UNION" msgstr "再帰UNIONを実行できませんでした" -#: optimizer/prep/prepunion.c:509 +#: optimizer/prep/prepunion.c:510 #, c-format msgid "All column datatypes must be hashable." msgstr "すべての列のデータ型はハッシュ可能でなければなりません。" #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1044 +#: optimizer/prep/prepunion.c:1045 #, c-format msgid "could not implement %s" msgstr "%sを実行できませんでした" -#: optimizer/util/clauses.c:4746 +#: optimizer/util/clauses.c:4854 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "SQL関数\"%s\"のインライン化処理中" -#: optimizer/util/plancat.c:132 +#: optimizer/util/plancat.c:133 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "リカバリ中は一時テーブルやUNLOGGEDテーブルにはアクセスできません" -#: optimizer/util/plancat.c:662 +#: optimizer/util/plancat.c:673 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "行全体に渡るユニークインデックスの推定指定はサポートされていません" -#: optimizer/util/plancat.c:679 +#: optimizer/util/plancat.c:690 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "ON CONFLICT句中の制約には関連付けられるインデックスがありません" -#: optimizer/util/plancat.c:729 +#: optimizer/util/plancat.c:740 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATEでの排除制約の使用はサポートされていません" -#: optimizer/util/plancat.c:834 +#: optimizer/util/plancat.c:845 #, c-format msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "ON CONFLICT 指定に合致するユニーク制約または排除制約がありません" -#: parser/analyze.c:705 parser/analyze.c:1401 +#: parser/analyze.c:780 parser/analyze.c:1494 #, c-format msgid "VALUES lists must all be the same length" msgstr "VALUESリストはすべて同じ長さでなければなりません" -#: parser/analyze.c:904 +#: parser/analyze.c:981 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERTに対象列よりも多くの式があります" -#: parser/analyze.c:922 +#: parser/analyze.c:999 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERTに式よりも多くの対象列があります" -#: parser/analyze.c:926 +#: parser/analyze.c:1003 #, c-format msgid "The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?" msgstr "挿入ソースがINSERTが期待するのと同じ列数を含む行表現になっています。うっかり余計なカッコをつけたりしませんでしたか?" -#: parser/analyze.c:1210 parser/analyze.c:1612 +#: parser/analyze.c:1302 parser/analyze.c:1687 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "ここではSELECT ... INTOは許可されません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1542 parser/analyze.c:2894 +#: parser/analyze.c:1617 parser/analyze.c:3343 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%sをVALUESに使用できません" -#: parser/analyze.c:1777 +#: parser/analyze.c:1853 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "不正なUNION/INTERSECT/EXCEPT ORDER BY句です" -#: parser/analyze.c:1778 +#: parser/analyze.c:1854 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "式や関数ではなく、結果列の名前のみが使用できます。" -#: parser/analyze.c:1779 +#: parser/analyze.c:1855 #, c-format msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." msgstr "式/関数をすべてのSELECTにつけてください。またはこのUNIONをFROM句に移動してください。" -#: parser/analyze.c:1845 +#: parser/analyze.c:1960 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTOはUNION/INTERSECT/EXCEPTの最初のSELECTでのみ使用できます" -#: parser/analyze.c:1917 +#: parser/analyze.c:2032 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "UNION/INTERSECT/EXCEPTの要素となる文では同一問い合わせレベルの他のリレーションを参照できません" -#: parser/analyze.c:2004 +#: parser/analyze.c:2119 #, c-format msgid "each %s query must have the same number of columns" msgstr "すべての%s問い合わせは同じ列数を返す必要があります" -#: parser/analyze.c:2426 +#: parser/analyze.c:2520 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNINGには少なくとも1つの列が必要です" -#: parser/analyze.c:2467 +#: parser/analyze.c:2623 +#, c-format +msgid "assignment source returned %d column" +msgid_plural "assignment source returned %d columns" +msgstr[0] "代入元が%d個の列を返しました" + +#: parser/analyze.c:2684 +#, c-format +msgid "variable \"%s\" is of type %s but expression is of type %s" +msgstr "変数\"%s\"は型%sですが、式は型%sでした" + +#. translator: %s is a SQL keyword +#: parser/analyze.c:2808 parser/analyze.c:2816 #, c-format -msgid "cannot specify both SCROLL and NO SCROLL" -msgstr "SCROLLとNO SCROLLの両方を同時には指定できません" +msgid "cannot specify both %s and %s" +msgstr "%sと%sの両方を同時には指定できません" -#: parser/analyze.c:2486 +#: parser/analyze.c:2836 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR では WITH にデータを変更する文を含んではなりません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2494 +#: parser/analyze.c:2844 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %sはサポートされていません" -#: parser/analyze.c:2497 +#: parser/analyze.c:2847 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "保持可能カーソルは読み取り専用である必要があります。" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2505 +#: parser/analyze.c:2855 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %sはサポートされていません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2516 +#: parser/analyze.c:2866 #, c-format -msgid "DECLARE INSENSITIVE CURSOR ... %s is not supported" -msgstr "DECLARE INSENSITIVE CURSOR ... %sはサポートされていません" +msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" +msgstr "DECLARE INSENSITIVE CURSOR ... %sはが不正です" -#: parser/analyze.c:2519 +#: parser/analyze.c:2869 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "INSENSITIVEカーソルは読み取り専用である必要があります。" -#: parser/analyze.c:2585 +#: parser/analyze.c:2935 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "実体化ビューではWITH句にデータを変更する文を含んではなりません" -#: parser/analyze.c:2595 +#: parser/analyze.c:2945 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "実体化ビューでは一時テーブルやビューを使用してはいけません" -#: parser/analyze.c:2605 +#: parser/analyze.c:2955 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "実体化ビューは境界パラメータを用いて定義してはなりません" -#: parser/analyze.c:2617 +#: parser/analyze.c:2967 #, c-format msgid "materialized views cannot be unlogged" msgstr "実体化ビューをログ非取得にはできません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2722 +#: parser/analyze.c:3156 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "DISTINCT句では%sを使用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2729 +#: parser/analyze.c:3163 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "GROUP BY句で%sを使用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2736 +#: parser/analyze.c:3170 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "HAVING 句では%sを使用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2743 +#: parser/analyze.c:3177 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "集約関数では%sは使用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2750 +#: parser/analyze.c:3184 #, c-format msgid "%s is not allowed with window functions" msgstr "ウィンドウ関数では%sは使用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2757 +#: parser/analyze.c:3191 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "ターゲットリストの中では%sを集合返却関数と一緒に使うことはできません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2836 +#: parser/analyze.c:3283 #, c-format msgid "%s must specify unqualified relation names" msgstr "%sでは非修飾のリレーション名を指定してください" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2867 +#: parser/analyze.c:3316 #, c-format msgid "%s cannot be applied to a join" msgstr "%sを結合に使用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2876 +#: parser/analyze.c:3325 #, c-format msgid "%s cannot be applied to a function" msgstr "%sを関数に使用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2885 +#: parser/analyze.c:3334 #, c-format msgid "%s cannot be applied to a table function" msgstr "%sはテーブル関数には適用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2903 +#: parser/analyze.c:3352 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%sはWITH問い合わせには適用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2912 +#: parser/analyze.c:3361 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%sは名前付きタプルストアには適用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2932 +#: parser/analyze.c:3381 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "%2$s句のリレーション\"%1$s\"はFROM句にありません" -#: parser/parse_agg.c:220 parser/parse_oper.c:222 +#: parser/parse_agg.c:220 parser/parse_oper.c:227 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "型%sの順序演算子を識別できませんでした" @@ -14522,1395 +15575,1686 @@ msgstr "ウィンドウ定義のGROUPS句では集約関数は使用できませ msgid "grouping operations are not allowed in window GROUPS" msgstr "ウィンドウ定義のGROUPS句ではグルーピング演算は使用できません" -#: parser/parse_agg.c:460 +#: parser/parse_agg.c:439 +msgid "aggregate functions are not allowed in MERGE WHEN conditions" +msgstr "MERGE WHEN条件では集約関数を使用できません" + +#: parser/parse_agg.c:441 +msgid "grouping operations are not allowed in MERGE WHEN conditions" +msgstr "MERGE WHEN条件ではグルーピング演算を使用できません" + +#: parser/parse_agg.c:467 msgid "aggregate functions are not allowed in check constraints" msgstr "検査制約では集約関数を使用できません" -#: parser/parse_agg.c:462 +#: parser/parse_agg.c:469 msgid "grouping operations are not allowed in check constraints" msgstr "検査制約ではグルーピング演算を使用できません" -#: parser/parse_agg.c:469 +#: parser/parse_agg.c:476 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "DEFAULT式では集約関数を使用できません" -#: parser/parse_agg.c:471 +#: parser/parse_agg.c:478 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "DEFAULT式ではグルーピング演算を使用できません" -#: parser/parse_agg.c:476 +#: parser/parse_agg.c:483 msgid "aggregate functions are not allowed in index expressions" msgstr "インデックス式では集約関数を使用できません" -#: parser/parse_agg.c:478 +#: parser/parse_agg.c:485 msgid "grouping operations are not allowed in index expressions" msgstr "インデックス式ではグルーピング演算を使用できません" -#: parser/parse_agg.c:483 +#: parser/parse_agg.c:490 msgid "aggregate functions are not allowed in index predicates" msgstr "インデックス述語では集約関数を使用できません" -#: parser/parse_agg.c:485 +#: parser/parse_agg.c:492 msgid "grouping operations are not allowed in index predicates" msgstr "インデックス述語ではグルーピング演算を使用できません" -#: parser/parse_agg.c:490 +#: parser/parse_agg.c:497 +msgid "aggregate functions are not allowed in statistics expressions" +msgstr "統計情報式では集約関数を使用できません" + +#: parser/parse_agg.c:499 +msgid "grouping operations are not allowed in statistics expressions" +msgstr "統計情報式ではグルーピング演算使用できません" + +#: parser/parse_agg.c:504 msgid "aggregate functions are not allowed in transform expressions" msgstr "変換式では集約関数を使用できません" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:506 msgid "grouping operations are not allowed in transform expressions" msgstr "変換式ではグルーピング演算を使用できません" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:511 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "EXECUTEのパラメータでは集約関数を使用できません" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:513 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "EXECUTEのパラメータではグルーピング演算を使用できません" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:518 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "トリガのWHEN条件では集約関数を使用できません" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:520 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "トリガのWHEN条件ではグルーピング演算を使用できません" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:525 msgid "aggregate functions are not allowed in partition bound" msgstr "集約関数はパーティション境界では使用できません" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:527 msgid "grouping operations are not allowed in partition bound" msgstr "グルーピング演算はパーティション境界では使用できません" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:532 msgid "aggregate functions are not allowed in partition key expressions" msgstr "パーティションキー式では集約関数は使用できません" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:534 msgid "grouping operations are not allowed in partition key expressions" msgstr "パーティションキー式ではグルーピング演算は使用できません" -#: parser/parse_agg.c:526 +#: parser/parse_agg.c:540 msgid "aggregate functions are not allowed in column generation expressions" msgstr "集約関数はカラム生成式では使用できません" -#: parser/parse_agg.c:528 +#: parser/parse_agg.c:542 msgid "grouping operations are not allowed in column generation expressions" msgstr "グルーピング演算はカラム生成式では使用できません" -#: parser/parse_agg.c:534 +#: parser/parse_agg.c:548 msgid "aggregate functions are not allowed in CALL arguments" msgstr "CALLの引数では集約関数を使用できません" -#: parser/parse_agg.c:536 +#: parser/parse_agg.c:550 msgid "grouping operations are not allowed in CALL arguments" msgstr "CALLの引数ではグルーピング演算を使用できません" -#: parser/parse_agg.c:542 +#: parser/parse_agg.c:556 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "集約関数は COPY FROM の WHERE 条件では使用できません" -#: parser/parse_agg.c:544 +#: parser/parse_agg.c:558 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "グルーピング演算は COPY FROM の WHERE 条件の中では使用できません" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:567 parser/parse_clause.c:1828 +#: parser/parse_agg.c:585 parser/parse_clause.c:1852 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "%sでは集約関数を使用できません" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:570 +#: parser/parse_agg.c:588 #, c-format msgid "grouping operations are not allowed in %s" msgstr "%sではグルーピング演算を使用できません" -#: parser/parse_agg.c:678 +#: parser/parse_agg.c:689 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" msgstr "アウタレベルの集約は直接引数に低位の変数を含むことができません" -#: parser/parse_agg.c:757 +#: parser/parse_agg.c:768 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "集合返却関数の呼び出しに集約関数の呼び出しを含むことはできません" -#: parser/parse_agg.c:758 parser/parse_expr.c:1845 parser/parse_expr.c:2332 parser/parse_func.c:872 +#: parser/parse_agg.c:769 parser/parse_expr.c:1736 parser/parse_expr.c:2210 parser/parse_func.c:883 #, c-format msgid "You might be able to move the set-returning function into a LATERAL FROM item." msgstr "この集合返却関数をLATERAL FROM項目に移動できるかもしれません。" -#: parser/parse_agg.c:763 +#: parser/parse_agg.c:774 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "集約関数の呼び出しにウィンドウ関数の呼び出しを含むことはできません" -#: parser/parse_agg.c:842 +#: parser/parse_agg.c:853 msgid "window functions are not allowed in JOIN conditions" msgstr "JOIN条件ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:849 +#: parser/parse_agg.c:860 msgid "window functions are not allowed in functions in FROM" msgstr "FROM句内の関数ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:855 +#: parser/parse_agg.c:866 msgid "window functions are not allowed in policy expressions" msgstr "ポリシ式ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:868 +#: parser/parse_agg.c:879 msgid "window functions are not allowed in window definitions" msgstr "ウィンドウ定義ではウィンドウ関数は使用できません" -#: parser/parse_agg.c:900 +#: parser/parse_agg.c:890 +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "MERGE WHEN条件ではウィンドウ関数を使用できません" + +#: parser/parse_agg.c:914 msgid "window functions are not allowed in check constraints" msgstr "検査制約の中ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:904 +#: parser/parse_agg.c:918 msgid "window functions are not allowed in DEFAULT expressions" msgstr "DEFAULT式の中ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:907 +#: parser/parse_agg.c:921 msgid "window functions are not allowed in index expressions" msgstr "インデックス式ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:910 +#: parser/parse_agg.c:924 +msgid "window functions are not allowed in statistics expressions" +msgstr "統計情報式ではウィンドウ関数を使用できません" + +#: parser/parse_agg.c:927 msgid "window functions are not allowed in index predicates" msgstr "インデックス述語ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:913 +#: parser/parse_agg.c:930 msgid "window functions are not allowed in transform expressions" msgstr "変換式ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:916 +#: parser/parse_agg.c:933 msgid "window functions are not allowed in EXECUTE parameters" msgstr "EXECUTEパラメータではウィンドウ関数を使用できません" -#: parser/parse_agg.c:919 +#: parser/parse_agg.c:936 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "トリガのWHEN条件ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:922 +#: parser/parse_agg.c:939 msgid "window functions are not allowed in partition bound" msgstr "ウィンドウ関数はパーティション境界では使用できません" -#: parser/parse_agg.c:925 +#: parser/parse_agg.c:942 msgid "window functions are not allowed in partition key expressions" msgstr "パーティションキー式ではウィンドウ関数は使用できません" -#: parser/parse_agg.c:928 +#: parser/parse_agg.c:945 msgid "window functions are not allowed in CALL arguments" msgstr "CALLの引数ではウィンドウ関数は使用できません" -#: parser/parse_agg.c:931 +#: parser/parse_agg.c:948 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "ウィンドウ関数は COPY FROM の WHERE 条件では使用できません" -#: parser/parse_agg.c:934 +#: parser/parse_agg.c:951 msgid "window functions are not allowed in column generation expressions" msgstr "ウィンドウ関数はカラム生成式では使用できません" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:954 parser/parse_clause.c:1837 +#: parser/parse_agg.c:974 parser/parse_clause.c:1861 #, c-format msgid "window functions are not allowed in %s" msgstr "%sの中ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:988 parser/parse_clause.c:2671 +#: parser/parse_agg.c:1008 parser/parse_clause.c:2694 #, c-format msgid "window \"%s\" does not exist" msgstr "ウィンドウ\"%s\"は存在しません" -#: parser/parse_agg.c:1072 +#: parser/parse_agg.c:1092 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "グルーピングセットの数が多すぎます (最大4096)" -#: parser/parse_agg.c:1212 +#: parser/parse_agg.c:1232 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "再帰問い合わせの再帰項では集約関数を使用できません" -#: parser/parse_agg.c:1405 +#: parser/parse_agg.c:1425 #, c-format msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" msgstr "列\"%s.%s\"はGROUP BY句で指定するか、集約関数内で使用しなければなりません" -#: parser/parse_agg.c:1408 +#: parser/parse_agg.c:1428 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "順序集合集約の直接引数はグルーピングされた列のみを使用しなければなりません。" -#: parser/parse_agg.c:1413 +#: parser/parse_agg.c:1433 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "外部問い合わせから副問い合わせがグループ化されていない列\"%s.%s\"を使用しています" -#: parser/parse_agg.c:1577 +#: parser/parse_agg.c:1597 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "GROUPINGの引数は関連するクエリレベルのグルーピング式でなければなりません" -#: parser/parse_clause.c:191 +#: parser/parse_clause.c:190 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "リレーション\"%s\"は更新文の対象にはなれません" -#: parser/parse_clause.c:571 parser/parse_clause.c:599 parser/parse_func.c:2424 +#: parser/parse_clause.c:570 parser/parse_clause.c:598 parser/parse_func.c:2554 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "集合返却関数はFROMの最上位レベルにある必要があります" -#: parser/parse_clause.c:611 +#: parser/parse_clause.c:610 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "同じ関数に対して複数の列定義リストを持つことができません" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:643 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "複数の関数を伴った ROWS FROM() は列定義リストを持つことができません" -#: parser/parse_clause.c:645 +#: parser/parse_clause.c:644 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "ROWS FROM() 内のそれぞれの関数ごとに個別の列定義リストを付けてください。" -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:650 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "複数の引数をもつUNNEST()は列定義リストを持つことができません" -#: parser/parse_clause.c:652 +#: parser/parse_clause.c:651 #, c-format msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." msgstr "ROWS FROM() の中で個別に UNNEST() をコールして、列定義リストをそれぞれに付加してください。" -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:658 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY は列定義リストがあるときは使えません" -#: parser/parse_clause.c:660 +#: parser/parse_clause.c:659 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "ROWS FROM() の中に列定義リストをおいてください。" -#: parser/parse_clause.c:760 +#: parser/parse_clause.c:761 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "FOR ORDINALITY 列は一つまでです" -#: parser/parse_clause.c:821 +#: parser/parse_clause.c:822 parser/parse_jsontable.c:445 #, c-format msgid "column name \"%s\" is not unique" msgstr "列名\"%s\"は一意ではありません" -#: parser/parse_clause.c:863 +#: parser/parse_clause.c:864 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "名前空間名\"%s\"は一意ではありません" -#: parser/parse_clause.c:873 +#: parser/parse_clause.c:874 #, c-format msgid "only one default namespace is allowed" msgstr "デフォルト名前空間は一つのみ指定可能です" -#: parser/parse_clause.c:933 +#: parser/parse_clause.c:934 #, c-format msgid "tablesample method %s does not exist" msgstr "テーブルサンプルメソッド%sは存在しません" -#: parser/parse_clause.c:955 +#: parser/parse_clause.c:956 #, c-format msgid "tablesample method %s requires %d argument, not %d" msgid_plural "tablesample method %s requires %d arguments, not %d" msgstr[0] "テーブルサンプルメソッド%sは%d個の引数を必要とします、%d個ではありません" -msgstr[1] "テーブルサンプルメソッド%sは%d個の引数を必要とします、%d個ではありません" -#: parser/parse_clause.c:989 +#: parser/parse_clause.c:990 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "テーブルサンプルメソッド%sはREPEATABLEをサポートしていません" -#: parser/parse_clause.c:1135 +#: parser/parse_clause.c:1140 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "TABLESAMPLE句はテーブルおよび実体化ビューのみに適用可能です" -#: parser/parse_clause.c:1318 +#: parser/parse_clause.c:1330 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "USING句に列名\"%s\"が複数あります" -#: parser/parse_clause.c:1333 +#: parser/parse_clause.c:1345 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "左テーブルに列名\"%s\"が複数あります" -#: parser/parse_clause.c:1342 +#: parser/parse_clause.c:1354 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "USING句で指定した列\"%sが左テーブルに存在しません" -#: parser/parse_clause.c:1357 +#: parser/parse_clause.c:1369 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "右テーブルに列名\"%s\"が複数あります" -#: parser/parse_clause.c:1366 +#: parser/parse_clause.c:1378 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "USING句で指定した列\"%sが右テーブルに存在しません" -#: parser/parse_clause.c:1447 +#: parser/parse_clause.c:1457 #, c-format msgid "column alias list for \"%s\" has too many entries" msgstr "列\"%s\"の別名リストのエントリが多すぎます" -#: parser/parse_clause.c:1773 +#: parser/parse_clause.c:1797 #, c-format -msgid "row count cannot be NULL in FETCH FIRST ... WITH TIES clause" -msgstr "FETCH FIRST ... WITH TIES 節で行数にNULLは指定できません" +msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" +msgstr "FETCH FIRST ... WITH TIES句で行数にNULLは指定できません" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1798 +#: parser/parse_clause.c:1822 #, c-format msgid "argument of %s must not contain variables" msgstr "%sの引数には変数を使用できません" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1963 +#: parser/parse_clause.c:1987 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "%s \"%s\"は曖昧です" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1992 +#: parser/parse_clause.c:2015 #, c-format msgid "non-integer constant in %s" msgstr "%sに整数以外の定数があります" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2014 +#: parser/parse_clause.c:2037 #, c-format msgid "%s position %d is not in select list" msgstr "%sの位置%dはSELECTリストにありません" -#: parser/parse_clause.c:2453 +#: parser/parse_clause.c:2476 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBEは12要素に制限されています" -#: parser/parse_clause.c:2659 +#: parser/parse_clause.c:2682 #, c-format msgid "window \"%s\" is already defined" msgstr "ウィンドウ\"%s\"はすでに定義済みです" -#: parser/parse_clause.c:2720 +#: parser/parse_clause.c:2743 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "ウィンドウ\"%s\"のPARTITION BY句をオーバーライドできません" -#: parser/parse_clause.c:2732 +#: parser/parse_clause.c:2755 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "ウィンドウ\"%s\"のORDER BY句をオーバーライドできません" -#: parser/parse_clause.c:2762 parser/parse_clause.c:2768 +#: parser/parse_clause.c:2785 parser/parse_clause.c:2791 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "フレーム句をもっているため、ウィンドウ\"%s\"はコピーできません" -#: parser/parse_clause.c:2770 +#: parser/parse_clause.c:2793 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "このOVER句中の括弧を無視しました" -#: parser/parse_clause.c:2790 +#: parser/parse_clause.c:2813 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "offset PRECEDING/FOLLOWING を伴った RANGE はただ一つの ORDER BY 列を必要とします" -#: parser/parse_clause.c:2813 +#: parser/parse_clause.c:2836 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "GROUPSフレーム指定はORDER BY句を必要とします" -#: parser/parse_clause.c:2883 +#: parser/parse_clause.c:2906 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "DISTINCT や ORDER BY 表現を伴なう集約は引数リストの中に現れなければなりません" -#: parser/parse_clause.c:2884 +#: parser/parse_clause.c:2907 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "SELECT DISTINCTではORDER BYの式はSELECTリスト内になければなりません" -#: parser/parse_clause.c:2916 +#: parser/parse_clause.c:2939 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "DISTINCTを伴った集約は、最低でも一つの引数を取る必要があります" -#: parser/parse_clause.c:2917 +#: parser/parse_clause.c:2940 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCTには少なくとも1つの列が必要です" -#: parser/parse_clause.c:2983 parser/parse_clause.c:3015 +#: parser/parse_clause.c:3006 parser/parse_clause.c:3038 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "SELECT DISTINCT ONの式はORDER BY式の先頭に一致しなければなりません" -#: parser/parse_clause.c:3093 +#: parser/parse_clause.c:3116 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESCはON CONFLICT句では指定できません" -#: parser/parse_clause.c:3099 +#: parser/parse_clause.c:3122 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LASTはON CONFLICT句では指定できません" -#: parser/parse_clause.c:3178 +#: parser/parse_clause.c:3201 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE は推定指定または制約名を必要とします" -#: parser/parse_clause.c:3179 +#: parser/parse_clause.c:3202 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "例えば、 ON CONFLICT (column_name)。" -#: parser/parse_clause.c:3190 +#: parser/parse_clause.c:3213 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "システムカタログテーブルではON CONFLICTはサポートしていません" -#: parser/parse_clause.c:3198 +#: parser/parse_clause.c:3221 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT はカタログテーブルとして使用中のテーブル\"%s\"ではサポートされません" -#: parser/parse_clause.c:3341 +#: parser/parse_clause.c:3351 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "演算子\"%s\"は有効な順序付け演算子名ではありません" -#: parser/parse_clause.c:3343 +#: parser/parse_clause.c:3353 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "順序付け演算子はB-Tree演算子族の\"<\"または\">\"要素でなければなりません。" -#: parser/parse_clause.c:3654 +#: parser/parse_clause.c:3664 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "offset PRECEDING/FOLLOWING を伴った RANGE は列型 %s に対してはサポートされません" -#: parser/parse_clause.c:3660 +#: parser/parse_clause.c:3670 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" msgstr "offset PRECEDING/FOLLOWING を伴った RANGE は列型 %s とオフセット型 %s に対してはサポートされません" -#: parser/parse_clause.c:3663 +#: parser/parse_clause.c:3673 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "オフセット値を適切な型にキャストしてください。" -#: parser/parse_clause.c:3668 +#: parser/parse_clause.c:3678 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" msgstr "offset PRECEDING/FOLLOWING を伴った RANGE は列型 %s とオフセット型 %s に対して複数の解釈が可能になっています" -#: parser/parse_clause.c:3671 +#: parser/parse_clause.c:3681 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "オフセット値を意図した型そのものにキャストしてください。" -#: parser/parse_coerce.c:1024 parser/parse_coerce.c:1062 parser/parse_coerce.c:1080 parser/parse_coerce.c:1095 parser/parse_expr.c:2241 parser/parse_expr.c:2819 parser/parse_target.c:967 +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 parser/parse_expr.c:2119 parser/parse_expr.c:2713 parser/parse_expr.c:3370 parser/parse_expr.c:3602 parser/parse_expr.c:4440 parser/parse_target.c:994 #, c-format msgid "cannot cast type %s to %s" msgstr "型%sから%sへの型変換ができません" -#: parser/parse_coerce.c:1065 +#: parser/parse_coerce.c:1091 #, c-format msgid "Input has too few columns." msgstr "入力列が少なすぎます。" -#: parser/parse_coerce.c:1083 +#: parser/parse_coerce.c:1109 #, c-format msgid "Cannot cast type %s to %s in column %d." msgstr "列%3$dで型%1$sから%2$sへの型変換ができません。" -#: parser/parse_coerce.c:1098 +#: parser/parse_coerce.c:1124 #, c-format msgid "Input has too many columns." msgstr "入力列が多すぎます。" #. translator: first %s is name of a SQL construct, eg WHERE #. translator: first %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1153 parser/parse_coerce.c:1201 +#: parser/parse_coerce.c:1179 parser/parse_coerce.c:1227 #, c-format msgid "argument of %s must be type %s, not type %s" msgstr "%1$sの引数は型%3$sではなく%2$s型でなければなりません" #. translator: %s is name of a SQL construct, eg WHERE #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1164 parser/parse_coerce.c:1213 +#: parser/parse_coerce.c:1190 parser/parse_coerce.c:1239 #, c-format msgid "argument of %s must not return a set" msgstr "%sの引数は集合を返してはなりません" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1353 +#: parser/parse_coerce.c:1383 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "%sの型%sと%sを一致させることができません" -#: parser/parse_coerce.c:1465 +#: parser/parse_coerce.c:1499 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "引数の型%sと%sは合致させられません" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1517 +#: parser/parse_coerce.c:1551 #, c-format msgid "%s could not convert type %s to %s" msgstr "%sで型%sから%sへ変換できませんでした" -#: parser/parse_coerce.c:1934 -#, c-format -msgid "arguments declared \"anyelement\" are not all alike" -msgstr "\"anyelement\"と宣言された引数が全て同じでありません" - -#: parser/parse_coerce.c:1954 -#, c-format -msgid "arguments declared \"anyarray\" are not all alike" -msgstr "\"anyarray\"と宣言された引数が全て同じでありません" - -#: parser/parse_coerce.c:1974 +#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 #, c-format -msgid "arguments declared \"anyrange\" are not all alike" -msgstr "\"anyrange\"と宣言された引数が全て同じでありません" +msgid "arguments declared \"%s\" are not all alike" +msgstr "\"%s\"と宣言された引数が全て同じでありません" -#: parser/parse_coerce.c:2008 parser/parse_coerce.c:2088 utils/fmgr/funcapi.c:487 +#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 utils/fmgr/funcapi.c:558 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "%sと宣言された引数が配列ではなく%s型です" -#: parser/parse_coerce.c:2029 -#, c-format -msgid "arguments declared \"anycompatiblerange\" are not all alike" -msgstr "\"anycompatiblerange\"と宣言された引数が全て同じでありません" - -#: parser/parse_coerce.c:2041 parser/parse_coerce.c:2122 utils/fmgr/funcapi.c:501 +#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 utils/fmgr/funcapi.c:572 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "%sと宣言された引数が範囲型ではなく型%sです" -#: parser/parse_coerce.c:2079 +#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:590 utils/fmgr/funcapi.c:655 +#, c-format +msgid "argument declared %s is not a multirange type but type %s" +msgstr "%sと宣言された引数が複範囲型ではなく型%sです" + +#: parser/parse_coerce.c:2353 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "\"anyarray\"型の引数の要素型を決定できません" -#: parser/parse_coerce.c:2105 parser/parse_coerce.c:2139 +#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "%sと宣言された引数と%sと宣言された引数とで整合性がありません" -#: parser/parse_coerce.c:2163 +#: parser/parse_coerce.c:2474 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "入力型が%sであったため多様型が特定できませんでした" -#: parser/parse_coerce.c:2177 +#: parser/parse_coerce.c:2488 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "anynonarrayと照合されたは配列型です: %s" -#: parser/parse_coerce.c:2187 +#: parser/parse_coerce.c:2498 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "anyenumと照合された型は列挙型ではありません: %s" -#: parser/parse_coerce.c:2218 parser/parse_coerce.c:2267 parser/parse_coerce.c:2329 parser/parse_coerce.c:2365 +#: parser/parse_coerce.c:2559 +#, c-format +msgid "arguments of anycompatible family cannot be cast to a common type" +msgstr "anycompatible系の引数を共通の型にキャストできません" + +#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "入力型が%2$sであるため多様型%1$sが特定できませんでした" -#: parser/parse_coerce.c:2228 +#: parser/parse_coerce.c:2587 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "anycompatiblerange型%sはanycompatiblerange型%sと合致しません" -#: parser/parse_coerce.c:2242 +#: parser/parse_coerce.c:2608 +#, c-format +msgid "anycompatiblemultirange type %s does not match anycompatible type %s" +msgstr "anycompatiblemultirange型%sはanycompatible型%sと合致しません" + +#: parser/parse_coerce.c:2622 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "anycompatiblenonarrayに対応する型が配列型です: %s" -#: parser/parse_coerce.c:2433 +#: parser/parse_coerce.c:2857 +#, c-format +msgid "A result of type %s requires at least one input of type anyrange or anymultirange." +msgstr "%s型の返却値にはanyrangeまたはanymultirange型の入力が最低でも一つ必要です。" + +#: parser/parse_coerce.c:2874 #, c-format -msgid "A result of type %s requires at least one input of type %s." -msgstr "%s型の結果には%s型の入力が最低でも一つ必要です。" +msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." +msgstr "%s型の返却値には少なくとも一つのanycompatiblerangeまたはanycompatiblemultirange型の入力が必要です。" -#: parser/parse_coerce.c:2445 +#: parser/parse_coerce.c:2886 #, c-format -msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, or anyrange." -msgstr "%s型の返却値には少なくとも一つの anyelement, anyarray, anynonarray, anyenum, または anyrange 型の入力が必要です。" +msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." +msgstr "%s型の返却値には少なくとも一つのanyelement、anyarray、anynonarray、anyenum、anyrange またはanymultirange型の入力が必要です。" -#: parser/parse_coerce.c:2457 +#: parser/parse_coerce.c:2898 #, c-format -msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, or anycompatiblerange." -msgstr "%s型の返却値には少なくとも一つの anycompatible, anycompatiblearray, anycompatiblenonarray, または anycompatiblerange型の入力が必要です。" +msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." +msgstr "%s型の返却値には少なくとも一つのanycompatible、anycompatiblearray、anycompatiblenonarray、anycompatiblerangeまたはanycompatiblemultirange型の入力が必要です。" -#: parser/parse_coerce.c:2487 +#: parser/parse_coerce.c:2928 msgid "A result of type internal requires at least one input of type internal." msgstr "internal型の返却値には少なくとも1つのinternal型の入力が必要です。" -#: parser/parse_collate.c:228 parser/parse_collate.c:475 parser/parse_collate.c:981 +#: parser/parse_collate.c:228 parser/parse_collate.c:475 parser/parse_collate.c:1009 #, c-format msgid "collation mismatch between implicit collations \"%s\" and \"%s\"" msgstr "暗黙の照合順序\"%s\"と\"%s\"の間に照合順序のミスマッチがあります" -#: parser/parse_collate.c:231 parser/parse_collate.c:478 parser/parse_collate.c:984 +#: parser/parse_collate.c:231 parser/parse_collate.c:478 parser/parse_collate.c:1012 #, c-format msgid "You can choose the collation by applying the COLLATE clause to one or both expressions." msgstr "片方もしくは両方の式に対して COLLATE 句を適用することで照合順序を選択できます" -#: parser/parse_collate.c:831 +#: parser/parse_collate.c:859 #, c-format msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" msgstr "明示的な照合順序\"%s\"と\"%s\"の間に照合順序のミスマッチがあります" -#: parser/parse_cte.c:42 +#: parser/parse_cte.c:46 #, c-format msgid "recursive reference to query \"%s\" must not appear within its non-recursive term" msgstr "問い合わせ\"%s\"への再帰的参照が、その非再帰項内に現れてはなりません" -#: parser/parse_cte.c:44 +#: parser/parse_cte.c:48 #, c-format msgid "recursive reference to query \"%s\" must not appear within a subquery" msgstr "問い合わせ\"%s\"への再帰的参照が、副問い合わせ内に現れてはなりません" -#: parser/parse_cte.c:46 +#: parser/parse_cte.c:50 #, c-format msgid "recursive reference to query \"%s\" must not appear within an outer join" msgstr "問い合わせ\"%s\"への再帰的参照が、外部結合内に現れてはなりません" -#: parser/parse_cte.c:48 +#: parser/parse_cte.c:52 #, c-format msgid "recursive reference to query \"%s\" must not appear within INTERSECT" msgstr "問い合わせ\"%s\"への再帰的参照が、INTERSECT内に現れてはなりません" -#: parser/parse_cte.c:50 +#: parser/parse_cte.c:54 #, c-format msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "問い合わせ\"%s\"への再帰的参照が、EXCEPT内で現れてはなりません" -#: parser/parse_cte.c:132 +#: parser/parse_cte.c:136 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "WITH 問い合わせ名\"%s\"が複数回指定されました" -#: parser/parse_cte.c:264 +#: parser/parse_cte.c:268 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "データを変更するようなステートメントを含む WITH 句はトップレベルでなければなりません" -#: parser/parse_cte.c:313 +#: parser/parse_cte.c:317 #, c-format msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" msgstr "再帰問い合わせ\"%s\"の列%dの型は、非再帰項の内では%sになっていますが全体としては%sです" -#: parser/parse_cte.c:319 +#: parser/parse_cte.c:323 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "非再帰項の出力を正しい型に変換してください。" -#: parser/parse_cte.c:324 +#: parser/parse_cte.c:328 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" msgstr "再帰問い合わせ\"%s\"の列%dの照合順序は、非再帰項では\"%s\"ですが全体としては\"%s\"です" -#: parser/parse_cte.c:328 +#: parser/parse_cte.c:332 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "COLLATE句を使って非再帰項の照合順序を設定してください。" -#: parser/parse_cte.c:418 +#: parser/parse_cte.c:350 +#, c-format +msgid "WITH query is not recursive" +msgstr "WITH問い合わせは再帰的ではありません" + +#: parser/parse_cte.c:381 +#, c-format +msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" +msgstr "SEARCHまたはCYCLE句を指定する場合、UNIONの左辺はSELECTでなければなりません" + +#: parser/parse_cte.c:386 +#, c-format +msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" +msgstr "SEARCHまたはCYCLE句を指定する場合、UNIONの右辺はSELECTでなければなりません" + +#: parser/parse_cte.c:401 +#, c-format +msgid "search column \"%s\" not in WITH query column list" +msgstr "検索カラム\\\"%s\\\"はWITH問い合わせの列リストの中にありません" + +#: parser/parse_cte.c:408 +#, c-format +msgid "search column \"%s\" specified more than once" +msgstr "検索列\"%s\"が複数回指定されています" + +#: parser/parse_cte.c:417 +#, c-format +msgid "search sequence column name \"%s\" already used in WITH query column list" +msgstr "検索順序列の名前\\\"%s\\\"はすでにWITH問い合わせの列リストで使われています" + +#: parser/parse_cte.c:436 +#, c-format +msgid "cycle column \"%s\" not in WITH query column list" +msgstr "循環列\"%s\"がWITH問い合わせの列リストに存在しません" + +#: parser/parse_cte.c:443 +#, c-format +msgid "cycle column \"%s\" specified more than once" +msgstr "循環列\"%s\"が複数回指定されています" + +#: parser/parse_cte.c:452 +#, c-format +msgid "cycle mark column name \"%s\" already used in WITH query column list" +msgstr "循環識別列の名前\\\"%s\\\"はすでにWITH問い合わせの列リストで使われています" + +#: parser/parse_cte.c:464 +#, c-format +msgid "cycle path column name \"%s\" already used in WITH query column list" +msgstr "循環経路列の名前\\\"%s\\\"はすでにWITH問い合わせの列リストで使われています" + +#: parser/parse_cte.c:472 +#, c-format +msgid "cycle mark column name and cycle path column name are the same" +msgstr "循環識別列と循環経路列の名前が同一です" + +#: parser/parse_cte.c:508 +#, c-format +msgid "could not identify an inequality operator for type %s" +msgstr "型%sの不等演算子を特定できませんでした" + +#: parser/parse_cte.c:520 +#, c-format +msgid "search sequence column name and cycle mark column name are the same" +msgstr "検索順序列と循環識別列の名前が同一です" + +#: parser/parse_cte.c:527 +#, c-format +msgid "search sequence column name and cycle path column name are the same" +msgstr "検索順序列と循環経路列の名前が同一です" + +#: parser/parse_cte.c:611 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "WITH問い合わせ\"%s\"には%d列しかありませんが、%d列指定されています" -#: parser/parse_cte.c:598 +#: parser/parse_cte.c:791 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "WITH項目間の再帰は実装されていません" -#: parser/parse_cte.c:650 +#: parser/parse_cte.c:843 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "再帰問い合わせ\"%s\"はデータを更新するス文を含んでいてはなりません" -#: parser/parse_cte.c:658 +#: parser/parse_cte.c:851 #, c-format msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" msgstr "再帰問い合わせ\"%s\"が、<非再帰項> UNION [ALL] <再帰項> の形式になっていません" -#: parser/parse_cte.c:702 +#: parser/parse_cte.c:895 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "再帰問い合わせ内の ORDER BY は実装されていません" -#: parser/parse_cte.c:708 +#: parser/parse_cte.c:901 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "再帰問い合わせ内の OFFSET は実装されていません" -#: parser/parse_cte.c:714 +#: parser/parse_cte.c:907 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "再帰問い合わせ内の LIMIT は実装されていません" -#: parser/parse_cte.c:720 +#: parser/parse_cte.c:913 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "再帰問い合わせ内の FOR UPDATE/SHARE は実装されていません" -#: parser/parse_cte.c:777 +#: parser/parse_cte.c:970 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "問い合わせ\"%s\"への再帰参照が2回以上現れてはなりません" -#: parser/parse_expr.c:349 +#: parser/parse_expr.c:300 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "この文脈ではDEFAULTは使えません" -#: parser/parse_expr.c:402 parser/parse_relation.c:3506 parser/parse_relation.c:3526 +#: parser/parse_expr.c:397 parser/parse_relation.c:3608 parser/parse_relation.c:3628 #, c-format msgid "column %s.%s does not exist" msgstr "列%s.%sは存在しません" -#: parser/parse_expr.c:414 +#: parser/parse_expr.c:409 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "データ型%2$sの列\"%1$s\"はありません" -#: parser/parse_expr.c:420 +#: parser/parse_expr.c:415 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "レコードデータ型の列\"%s\"を識別できませんでした" -#: parser/parse_expr.c:426 +#: parser/parse_expr.c:421 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "列記法 .%sが型%sに使用されましたが、この型は複合型ではありません" -#: parser/parse_expr.c:457 parser/parse_target.c:729 +#: parser/parse_expr.c:452 parser/parse_target.c:739 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "\"*\"を通した行展開は、ここではサポートされていません" -#: parser/parse_expr.c:578 +#: parser/parse_expr.c:574 msgid "cannot use column reference in DEFAULT expression" msgstr "列参照はDEFAULT式では使用できません" -#: parser/parse_expr.c:581 +#: parser/parse_expr.c:577 msgid "cannot use column reference in partition bound expression" msgstr "列参照はパーティション境界式では使用できません" -#: parser/parse_expr.c:850 parser/parse_relation.c:799 parser/parse_relation.c:881 parser/parse_target.c:1207 +#: parser/parse_expr.c:846 parser/parse_relation.c:818 parser/parse_relation.c:900 parser/parse_target.c:1234 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "列参照\"%s\"は曖昧です" -#: parser/parse_expr.c:906 parser/parse_param.c:110 parser/parse_param.c:142 parser/parse_param.c:199 parser/parse_param.c:298 +#: parser/parse_expr.c:902 parser/parse_param.c:110 parser/parse_param.c:142 parser/parse_param.c:208 parser/parse_param.c:307 #, c-format msgid "there is no parameter $%d" msgstr "パラメータ$%dがありません" -#: parser/parse_expr.c:1149 +#: parser/parse_expr.c:1102 #, c-format msgid "NULLIF requires = operator to yield boolean" msgstr "NULLIF では = 演算子が boolean を返す必要があります" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1155 parser/parse_expr.c:3135 +#: parser/parse_expr.c:1108 parser/parse_expr.c:3029 #, c-format msgid "%s must not return a set" msgstr "%sは集合を返してはなりません" -#: parser/parse_expr.c:1603 parser/parse_expr.c:1635 +#: parser/parse_expr.c:1493 parser/parse_expr.c:1525 #, c-format msgid "number of columns does not match number of values" msgstr "列の数がVALUESの数と一致しません" -#: parser/parse_expr.c:1649 +#: parser/parse_expr.c:1539 #, c-format msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" msgstr "複数列のUPDATE項目のソースは副問合せまたはROW()式でなければなりません" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1843 parser/parse_expr.c:2330 parser/parse_func.c:2540 +#: parser/parse_expr.c:1734 parser/parse_expr.c:2208 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "集合返却関数は%sでは使用できません" -#: parser/parse_expr.c:1904 +#: parser/parse_expr.c:1797 msgid "cannot use subquery in check constraint" msgstr "検査制約では副問い合わせを使用できません" -#: parser/parse_expr.c:1908 +#: parser/parse_expr.c:1801 msgid "cannot use subquery in DEFAULT expression" msgstr "DEFAULT式には副問い合わせを使用できません" -#: parser/parse_expr.c:1911 +#: parser/parse_expr.c:1804 msgid "cannot use subquery in index expression" msgstr "式インデックスには副問い合わせを使用できません" -#: parser/parse_expr.c:1914 +#: parser/parse_expr.c:1807 msgid "cannot use subquery in index predicate" msgstr "インデックスの述部に副問い合わせを使用できません" -#: parser/parse_expr.c:1917 +#: parser/parse_expr.c:1810 +msgid "cannot use subquery in statistics expression" +msgstr "時計情報式では副問い合わせを使用できません" + +#: parser/parse_expr.c:1813 msgid "cannot use subquery in transform expression" msgstr "変換式では副問い合わせを使用できません" -#: parser/parse_expr.c:1920 +#: parser/parse_expr.c:1816 msgid "cannot use subquery in EXECUTE parameter" msgstr "EXECUTEのパラメータに副問い合わせを使用できません" -#: parser/parse_expr.c:1923 +#: parser/parse_expr.c:1819 msgid "cannot use subquery in trigger WHEN condition" msgstr "トリガーの WHEN 条件では副問い合わせを使用できません" -#: parser/parse_expr.c:1926 +#: parser/parse_expr.c:1822 msgid "cannot use subquery in partition bound" msgstr "副問い合わせはパーティション境界では使用できません" -#: parser/parse_expr.c:1929 +#: parser/parse_expr.c:1825 msgid "cannot use subquery in partition key expression" msgstr "パーティションキー式では副問い合わせを使用できません" -#: parser/parse_expr.c:1932 +#: parser/parse_expr.c:1828 msgid "cannot use subquery in CALL argument" msgstr "CALLの引数で副問い合わせは使用できません" -#: parser/parse_expr.c:1935 +#: parser/parse_expr.c:1831 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "副問い合わせは COPY FROM の WHERE 条件では使用できません" -#: parser/parse_expr.c:1938 +#: parser/parse_expr.c:1834 msgid "cannot use subquery in column generation expression" msgstr "副問い合わせはカラム生成式では使用できません" -#: parser/parse_expr.c:1991 +#: parser/parse_expr.c:1887 parser/parse_expr.c:3715 #, c-format msgid "subquery must return only one column" msgstr "副問い合わせは1列のみを返さなければなりません" -#: parser/parse_expr.c:2075 +#: parser/parse_expr.c:1958 #, c-format msgid "subquery has too many columns" msgstr "副問い合わせの列が多すぎます" -#: parser/parse_expr.c:2080 +#: parser/parse_expr.c:1963 #, c-format msgid "subquery has too few columns" msgstr "副問い合わせの列が少なすぎます" -#: parser/parse_expr.c:2181 +#: parser/parse_expr.c:2059 #, c-format msgid "cannot determine type of empty array" msgstr "空の配列のデータ型を決定できません" -#: parser/parse_expr.c:2182 +#: parser/parse_expr.c:2060 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "必要な型に明示的にキャストしてください。例: ARRAY[]::integer[]" -#: parser/parse_expr.c:2196 +#: parser/parse_expr.c:2074 #, c-format msgid "could not find element type for data type %s" msgstr "データ型%sの要素を見つけられませんでした" -#: parser/parse_expr.c:2481 +#: parser/parse_expr.c:2354 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "無名のXML属性値は列参照でなければなりません" -#: parser/parse_expr.c:2482 +#: parser/parse_expr.c:2355 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "無名のXML要素値は列参照でなければなりません" -#: parser/parse_expr.c:2497 +#: parser/parse_expr.c:2370 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "XML属性名\"%s\"が複数あります" -#: parser/parse_expr.c:2604 +#: parser/parse_expr.c:2477 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "XMLSERIALIZE の結果を %s へキャストできません" -#: parser/parse_expr.c:2892 parser/parse_expr.c:3088 +#: parser/parse_expr.c:2786 parser/parse_expr.c:2982 #, c-format msgid "unequal number of entries in row expressions" msgstr "行式において項目数が一致しません" -#: parser/parse_expr.c:2902 +#: parser/parse_expr.c:2796 #, c-format msgid "cannot compare rows of zero length" msgstr "長さ0の行を比較できません" -#: parser/parse_expr.c:2927 +#: parser/parse_expr.c:2821 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "行比較演算子は型%sではなくbooleanを返さなければなりません" -#: parser/parse_expr.c:2934 +#: parser/parse_expr.c:2828 #, c-format msgid "row comparison operator must not return a set" msgstr "行比較演算子は集合を返してはいけません" -#: parser/parse_expr.c:2993 parser/parse_expr.c:3034 +#: parser/parse_expr.c:2887 parser/parse_expr.c:2928 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "行比較演算子%sの解釈を特定できませんでした" -#: parser/parse_expr.c:2995 +#: parser/parse_expr.c:2889 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "行比較演算子はbtree演算子族と関連付けされなければなりません。" -#: parser/parse_expr.c:3036 +#: parser/parse_expr.c:2930 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "同程度の適合度の候補が複数存在します。" -#: parser/parse_expr.c:3129 +#: parser/parse_expr.c:3023 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "IS DISTINCT FROMでは=演算子はbooleanを返さなければなりません" -#: parser/parse_expr.c:3448 parser/parse_expr.c:3466 +#: parser/parse_expr.c:3275 +#, c-format +msgid "JSON ENCODING clause is only allowed for bytea input type" +msgstr "JSON ENCODING句はbytea入力型に対してのみ使用可能です" + +#: parser/parse_expr.c:3282 +#, c-format +msgid "FORMAT JSON has no effect for json and jsonb types" +msgstr "FORMAT JSONはjsonおよびjsonb型に対しては効果がありません" + +#: parser/parse_expr.c:3337 +#, c-format +msgid "cannot use non-string types with implicit FORMAT JSON clause" +msgstr "非文字列型は暗黙のFORMAT JSON句では使用できません" + +#: parser/parse_expr.c:3441 +#, c-format +msgid "cannot use JSON format with non-string output types" +msgstr "非文字列出力にJSONフォーマットは使用できません" + +#: parser/parse_expr.c:3454 +#, c-format +msgid "cannot set JSON encoding for non-bytea output types" +msgstr "非bytea出力型に対してJSONエンコーディングは設定できません" + +#: parser/parse_expr.c:3459 +#, c-format +msgid "unsupported JSON encoding" +msgstr "非サポートのJSONエンコーディング" + +#: parser/parse_expr.c:3460 +#, c-format +msgid "only UTF8 JSON encoding is supported" +msgstr "UTF8 JSONエンコーディングのみをサポートしています" + +#: parser/parse_expr.c:3497 +#, c-format +msgid "returning SETOF types is not supported in SQL/JSON functions" +msgstr "SETOF型の返却はSQL/JSON関数ではサポートされません" + +#: parser/parse_expr.c:3796 parser/parse_func.c:864 +#, c-format +msgid "aggregate ORDER BY is not implemented for window functions" +msgstr "ウィンドウ関数に対する集約の ORDER BY は実装されていません" + +#: parser/parse_expr.c:4015 +#, c-format +msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" +msgstr "JSON FORMAT ENCODING句は非bytea入力型に対しては使用できません" + +#: parser/parse_expr.c:4036 +#, c-format +msgid "cannot use type %s in IS JSON predicate" +msgstr "IS JSON述語で型%sは使用できません" + +#: parser/parse_expr.c:4101 +#, c-format +msgid "JSON_TABLE path name is not allowed here" +msgstr "ここではJSON_TABLEパス名は許可されません" + +#: parser/parse_expr.c:4128 +#, c-format +msgid "JSON path expression must be type %s, not type %s" +msgstr "JSONパス式は型%2$sではなく%1$sでなくてはなりません" + +#: parser/parse_expr.c:4290 +#, c-format +msgid "cannot cast DEFAULT expression type %s to %s" +msgstr "DEFAULT式の型%sの%sへの型変換ができません" + +#: parser/parse_expr.c:4459 +#, c-format +msgid "JSON_TABLE() is not yet implemented for the json type" +msgstr "JSON_TABLE()はこのjson型に対してはまだ実装されていません" + +#: parser/parse_expr.c:4460 parser/parse_expr.c:4470 +#, c-format +msgid "Try casting the argument to jsonb" +msgstr "jsonb型へのキャストを試してください" + +#: parser/parse_expr.c:4469 +#, c-format +msgid "%s() is not yet implemented for the json type" +msgstr "%s()はこのjson型に対してはまだ実装されていません" + +#: parser/parse_expr.c:4490 #, c-format -msgid "operator precedence change: %s is now lower precedence than %s" -msgstr "演算子の優先順位の変更: %sは今では%sより低い優先順位です" +msgid "cannot use RETURNING type %s in %s" +msgstr "%sではRETURNINGに型%sは使用できません" -#: parser/parse_func.c:191 +#: parser/parse_expr.c:4533 +#, c-format +msgid "cannot use non-string types with WITH UNIQUE KEYS clause" +msgstr "非文字列型はWITH UNIQUE KEYS句では使用できません" + +#: parser/parse_func.c:194 #, c-format msgid "argument name \"%s\" used more than once" msgstr "引数名\"%s\"が複数回指定されました" -#: parser/parse_func.c:202 +#: parser/parse_func.c:205 #, c-format msgid "positional argument cannot follow named argument" msgstr "位置パラメーターの次には名前付きの引数を指定できません。" -#: parser/parse_func.c:284 parser/parse_func.c:2243 +#: parser/parse_func.c:287 parser/parse_func.c:2369 #, c-format msgid "%s is not a procedure" msgstr "%sはプロシージャではありません" -#: parser/parse_func.c:288 +#: parser/parse_func.c:291 #, c-format msgid "To call a function, use SELECT." msgstr "関数を呼び出すには SELECT を使用してください。" -#: parser/parse_func.c:294 +#: parser/parse_func.c:297 #, c-format msgid "%s is a procedure" msgstr "%sはプロシージャです" -#: parser/parse_func.c:298 +#: parser/parse_func.c:301 #, c-format msgid "To call a procedure, use CALL." msgstr "関数を呼び出すには CALL を使用してください。" -#: parser/parse_func.c:312 +#: parser/parse_func.c:315 #, c-format msgid "%s(*) specified, but %s is not an aggregate function" msgstr "%s(*)が指定されましたが%sは集約関数ではありません" -#: parser/parse_func.c:319 +#: parser/parse_func.c:322 #, c-format msgid "DISTINCT specified, but %s is not an aggregate function" msgstr "DISTINCTが指定されましたが%sは集約関数ではありません" -#: parser/parse_func.c:325 +#: parser/parse_func.c:328 #, c-format msgid "WITHIN GROUP specified, but %s is not an aggregate function" msgstr "WITHIN GROUPが指定されましたが%sは集約関数ではありません" -#: parser/parse_func.c:331 +#: parser/parse_func.c:334 #, c-format msgid "ORDER BY specified, but %s is not an aggregate function" msgstr "ORDER BY が指定されましたが、%sは集約関数ではありません" -#: parser/parse_func.c:337 +#: parser/parse_func.c:340 #, c-format msgid "FILTER specified, but %s is not an aggregate function" msgstr "FILTERが指定されましたが、%sは集約関数ではありません" -#: parser/parse_func.c:343 +#: parser/parse_func.c:346 #, c-format msgid "OVER specified, but %s is not a window function nor an aggregate function" msgstr "OVERが指定されましたが、%sはウィンドウ関数と集約関数のいずれでもありません" -#: parser/parse_func.c:381 +#: parser/parse_func.c:384 #, c-format msgid "WITHIN GROUP is required for ordered-set aggregate %s" msgstr "順序集合集約%sには WITHIN GROUP が必要です" -#: parser/parse_func.c:387 +#: parser/parse_func.c:390 #, c-format msgid "OVER is not supported for ordered-set aggregate %s" msgstr "OVERは順序集合集約%sではサポートされていません" -#: parser/parse_func.c:418 parser/parse_func.c:447 +#: parser/parse_func.c:421 parser/parse_func.c:452 #, c-format -msgid "There is an ordered-set aggregate %s, but it requires %d direct arguments, not %d." -msgstr "順序集合集約%1$sはありますが、それは%3$d個ではなく%2$d個の直接引数を必要とします。" +msgid "There is an ordered-set aggregate %s, but it requires %d direct argument, not %d." +msgid_plural "There is an ordered-set aggregate %s, but it requires %d direct arguments, not %d." +msgstr[0] "順序集合集約%1$sはありますが、それは%3$d個ではなく%2$d個の直接引数を必要とします。" -#: parser/parse_func.c:472 +#: parser/parse_func.c:479 #, c-format msgid "To use the hypothetical-set aggregate %s, the number of hypothetical direct arguments (here %d) must match the number of ordering columns (here %d)." msgstr "仮説集合集約%sを使うには、仮説直接引数(今は%d)がソート列の数(今は%d)と一致する必要があります" -#: parser/parse_func.c:486 +#: parser/parse_func.c:493 #, c-format -msgid "There is an ordered-set aggregate %s, but it requires at least %d direct arguments." -msgstr "順序集合集約%sはありますが、それは少なくとも%d個の直接引数を必要とします。" +msgid "There is an ordered-set aggregate %s, but it requires at least %d direct argument." +msgid_plural "There is an ordered-set aggregate %s, but it requires at least %d direct arguments." +msgstr[0] "順序集合集約%sはありますが、それは少なくとも%d個の直接引数を必要とします。" -#: parser/parse_func.c:505 +#: parser/parse_func.c:514 #, c-format msgid "%s is not an ordered-set aggregate, so it cannot have WITHIN GROUP" msgstr "%sは順序集合集約ではないため、WITHIN GROUP を持つことができません" -#: parser/parse_func.c:518 +#: parser/parse_func.c:527 #, c-format msgid "window function %s requires an OVER clause" msgstr "ウィンドウ関数%sにはOVER句が必要です" -#: parser/parse_func.c:525 +#: parser/parse_func.c:534 #, c-format msgid "window function %s cannot have WITHIN GROUP" msgstr "ウィンドウ関数%sはWITHIN GROUPを持つことができません" -#: parser/parse_func.c:554 +#: parser/parse_func.c:563 #, c-format msgid "procedure %s is not unique" msgstr "プロシージャ %s は一意ではありません" -#: parser/parse_func.c:557 +#: parser/parse_func.c:566 #, c-format msgid "Could not choose a best candidate procedure. You might need to add explicit type casts." msgstr "最善の候補プロシージャを選択できませんでした。明示的な型キャストが必要かもしれません。" -#: parser/parse_func.c:563 +#: parser/parse_func.c:572 #, c-format msgid "function %s is not unique" msgstr "関数 %s は一意ではありません" -#: parser/parse_func.c:566 +#: parser/parse_func.c:575 #, c-format msgid "Could not choose a best candidate function. You might need to add explicit type casts." msgstr "最善の候補関数を選択できませんでした。明示的な型キャストが必要かもしれません" -#: parser/parse_func.c:605 +#: parser/parse_func.c:614 #, c-format msgid "No aggregate function matches the given name and argument types. Perhaps you misplaced ORDER BY; ORDER BY must appear after all regular arguments of the aggregate." msgstr "指定した名前と引数型に合致する集約関数がありません。おそらく ORDER BY の位置に誤りがあります。ORDER BY は集約関数のすべての通常の引数の後になければなりません。" -#: parser/parse_func.c:613 parser/parse_func.c:2286 +#: parser/parse_func.c:622 parser/parse_func.c:2412 #, c-format msgid "procedure %s does not exist" msgstr "プロシージャ %s は存在しません" -#: parser/parse_func.c:616 +#: parser/parse_func.c:625 #, c-format msgid "No procedure matches the given name and argument types. You might need to add explicit type casts." msgstr "指定した名称と引数の型に合う演算子がありません。明示的な型キャストが必要かもしれません。" -#: parser/parse_func.c:625 +#: parser/parse_func.c:634 #, c-format msgid "No function matches the given name and argument types. You might need to add explicit type casts." msgstr "指定した名前と引数型に合致する関数がありません。明示的な型変換が必要かもしれません。" -#: parser/parse_func.c:727 +#: parser/parse_func.c:736 #, c-format msgid "VARIADIC argument must be an array" msgstr "VARIADIC引数は配列でなければなりません" -#: parser/parse_func.c:779 parser/parse_func.c:843 +#: parser/parse_func.c:790 parser/parse_func.c:854 #, c-format msgid "%s(*) must be used to call a parameterless aggregate function" msgstr "%s(*)はパラメータがない集約関数の呼び出しに使用しなければなりません" -#: parser/parse_func.c:786 +#: parser/parse_func.c:797 #, c-format msgid "aggregates cannot return sets" msgstr "集約は集合を返せません" -#: parser/parse_func.c:801 +#: parser/parse_func.c:812 #, c-format msgid "aggregates cannot use named arguments" msgstr "集約では名前付き引数は使えません" -#: parser/parse_func.c:833 +#: parser/parse_func.c:844 #, c-format msgid "DISTINCT is not implemented for window functions" msgstr "ウィンドウ関数に対するDISTINCTは実装されていません" -#: parser/parse_func.c:853 -#, c-format -msgid "aggregate ORDER BY is not implemented for window functions" -msgstr "ウィンドウ関数に対する集約の ORDER BY は実装されていません" - -#: parser/parse_func.c:862 +#: parser/parse_func.c:873 #, c-format msgid "FILTER is not implemented for non-aggregate window functions" msgstr "非集約のウィンドウ関数に対するFILTERは実装されていません" -#: parser/parse_func.c:871 +#: parser/parse_func.c:882 #, c-format msgid "window function calls cannot contain set-returning function calls" msgstr "集約関数の呼び出しに集合返却関数の呼び出しを含むことはできません" -#: parser/parse_func.c:879 +#: parser/parse_func.c:890 #, c-format msgid "window functions cannot return sets" msgstr "ウィンドウ関数は集合を返すことができません" -#: parser/parse_func.c:2124 parser/parse_func.c:2315 +#: parser/parse_func.c:2168 parser/parse_func.c:2441 #, c-format msgid "could not find a function named \"%s\"" msgstr "\"%s\"という名前の関数は見つかりませんでした" -#: parser/parse_func.c:2138 parser/parse_func.c:2333 +#: parser/parse_func.c:2182 parser/parse_func.c:2459 #, c-format msgid "function name \"%s\" is not unique" msgstr "関数名\"%s\"は一意ではありません" -#: parser/parse_func.c:2140 parser/parse_func.c:2335 +#: parser/parse_func.c:2184 parser/parse_func.c:2462 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "関数を曖昧さなく選択するには引数リストを指定してください。" -#: parser/parse_func.c:2184 +#: parser/parse_func.c:2228 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" msgstr[0] "プロシージャは%d個以上の引数を取ることはできません" -msgstr[1] "プロシージャは%d個以上の引数を取ることはできません" -#: parser/parse_func.c:2233 +#: parser/parse_func.c:2359 #, c-format msgid "%s is not a function" msgstr "%s は関数ではありません" -#: parser/parse_func.c:2253 +#: parser/parse_func.c:2379 #, c-format msgid "function %s is not an aggregate" msgstr "関数%sは集約ではありません" -#: parser/parse_func.c:2281 +#: parser/parse_func.c:2407 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "\"%s\"という名前のプロシージャは見つかりませんでした" -#: parser/parse_func.c:2295 +#: parser/parse_func.c:2421 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "\"%s\"という名前の集約は見つかりませんでした" -#: parser/parse_func.c:2300 +#: parser/parse_func.c:2426 #, c-format msgid "aggregate %s(*) does not exist" msgstr "集約%s(*)は存在しません" -#: parser/parse_func.c:2305 +#: parser/parse_func.c:2431 #, c-format msgid "aggregate %s does not exist" msgstr "集約%sは存在しません" -#: parser/parse_func.c:2340 +#: parser/parse_func.c:2467 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "プロシージャ名\"%s\"は一意ではありません" -#: parser/parse_func.c:2342 +#: parser/parse_func.c:2470 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "プロシージャを曖昧さなく選択するには引数リストを指定してください。" -#: parser/parse_func.c:2347 +#: parser/parse_func.c:2475 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "集約名\"%s\"は一意ではありません" -#: parser/parse_func.c:2349 +#: parser/parse_func.c:2478 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "集約を曖昧さなく選択するには引数リストを指定してください。" -#: parser/parse_func.c:2354 +#: parser/parse_func.c:2483 #, c-format msgid "routine name \"%s\" is not unique" msgstr "ルーチン名\"%s\"は一意ではありません" -#: parser/parse_func.c:2356 +#: parser/parse_func.c:2486 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "ルーチンを曖昧さなく選択するには引数リストを指定してください。" -#: parser/parse_func.c:2411 +#: parser/parse_func.c:2541 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "集合返却関数はJOIN条件では使用できません" -#: parser/parse_func.c:2432 +#: parser/parse_func.c:2562 msgid "set-returning functions are not allowed in policy expressions" msgstr "集合返却関数はポリシ式では使用できません" -#: parser/parse_func.c:2448 +#: parser/parse_func.c:2578 msgid "set-returning functions are not allowed in window definitions" msgstr "ウィンドウ定義では集合返却関数は使用できません" -#: parser/parse_func.c:2486 +#: parser/parse_func.c:2615 +msgid "set-returning functions are not allowed in MERGE WHEN conditions" +msgstr "集合返却関数はMERGE WHEN条件では使用できません" + +#: parser/parse_func.c:2619 msgid "set-returning functions are not allowed in check constraints" msgstr "集合返却関数は検査制約の中では使用できません" -#: parser/parse_func.c:2490 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "集合返却関数はDEFAULT式の中では使用できません" -#: parser/parse_func.c:2493 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index expressions" msgstr "集合返却関数はインデックス式では使用できません" -#: parser/parse_func.c:2496 +#: parser/parse_func.c:2629 msgid "set-returning functions are not allowed in index predicates" msgstr "集合返却関数はインデックス述語では使用できません" -#: parser/parse_func.c:2499 +#: parser/parse_func.c:2632 +msgid "set-returning functions are not allowed in statistics expressions" +msgstr "集合返却関数は統計情報式では使用できません" + +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in transform expressions" msgstr "集合返却関数は変換式では使用できません" -#: parser/parse_func.c:2502 +#: parser/parse_func.c:2638 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "集合返却関数はEXECUTEパラメータでは使用できません" -#: parser/parse_func.c:2505 +#: parser/parse_func.c:2641 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "集合返却関数はトリガのWHEN条件では使用できません" -#: parser/parse_func.c:2508 +#: parser/parse_func.c:2644 msgid "set-returning functions are not allowed in partition bound" msgstr "集合返却関数はパーティション境界では使用できません" -#: parser/parse_func.c:2511 +#: parser/parse_func.c:2647 msgid "set-returning functions are not allowed in partition key expressions" msgstr "集合返却関数はパーティションキー式では使用できません" -#: parser/parse_func.c:2514 +#: parser/parse_func.c:2650 msgid "set-returning functions are not allowed in CALL arguments" msgstr "CALLの引数に集合返却関数は使用できません" -#: parser/parse_func.c:2517 +#: parser/parse_func.c:2653 msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" msgstr "集合返却関数は COPY FROM の WHERE条件では使用できません" -#: parser/parse_func.c:2520 +#: parser/parse_func.c:2656 msgid "set-returning functions are not allowed in column generation expressions" msgstr "集合返却関数はカラム生成式では使用できません" -#: parser/parse_node.c:86 +#: parser/parse_jsontable.c:143 #, c-format -msgid "target lists can have at most %d entries" -msgstr "ターゲットリストは最大でも%dエントリまでしか持てません" +msgid "duplicate JSON_TABLE column name: %s" +msgstr "JSON_TABLEの列名の重複: %s" -#: parser/parse_node.c:235 +#: parser/parse_jsontable.c:144 #, c-format -msgid "cannot subscript type %s because it is not an array" -msgstr "配列ではないため、型%sには添え字をつけられません" +msgid "JSON_TABLE column names must be distinct from one another" +msgstr "JSON_TABLEの列名は互いに異なっていなければなりません。" -#: parser/parse_node.c:340 parser/parse_node.c:377 +#: parser/parse_jsontable.c:247 #, c-format -msgid "array subscript must have type integer" -msgstr "配列の添え字は整数型でなければなりません" +msgid "nested JSON_TABLE columns must contain an explicit AS pathname specification if an explicit PLAN clause is used" +msgstr "明示的なPLAN句が使われている場合は、ネストしたJSON_TABLE列は明示的な\"AS パス名\"の指定を含む必要があります" + +#: parser/parse_jsontable.c:260 parser/parse_jsontable.c:271 parser/parse_jsontable.c:387 parser/parse_jsontable.c:592 parser/parse_jsontable.c:611 +#, c-format +msgid "invalid JSON_TABLE plan" +msgstr "不正なJSON_TABLEプラン" + +#: parser/parse_jsontable.c:261 +#, c-format +msgid "plan node for nested path %s was not found in plan" +msgstr "ネストパス %s に対応するプランノードがプラン中にありません" + +#: parser/parse_jsontable.c:272 +#, c-format +msgid "plan node contains some extra or duplicate sibling nodes" +msgstr "プランノードが余分なまたは重複した兄弟ノードを含んでいます" + +#: parser/parse_jsontable.c:388 +#, c-format +msgid "path name was %s not found in nested columns list" +msgstr "パス名は入れ子列リストに存在しない%sでした" + +#: parser/parse_jsontable.c:478 +#, c-format +msgid "cannot use WITH WRAPPER clause with scalar columns" +msgstr "WITH RAPPER句をスカラー列で使用することはできません" + +#: parser/parse_jsontable.c:483 +#, c-format +msgid "cannot use OMIT QUOTES clause with scalar columns" +msgstr "OMIT QUOTES句をスカラー列で使用することはできません" + +#: parser/parse_jsontable.c:570 +#, c-format +msgid "invalid JSON_TABLE expression" +msgstr "不正なJSON_TABLE式" + +#: parser/parse_jsontable.c:571 +#, c-format +msgid "JSON_TABLE columns must contain explicit AS pathname specification if explicit PLAN clause is used" +msgstr "明示的なPLAN句が使われている場合は、JSON_TABLE列は明示的な\"AS パス名\"指定を含んでいる必要があります" + +#: parser/parse_jsontable.c:593 +#, c-format +msgid "expected INNER or OUTER JSON_TABLE plan node" +msgstr "明示的なINNERまたはOUTER JSON_TABLEプランノードが必要" + +#: parser/parse_jsontable.c:612 +#, c-format +msgid "path name mismatch: expected %s but %s is given" +msgstr "パス名の不一致: %s を期待してましたが %s が与えられました" + +#: parser/parse_jsontable.c:712 +#, c-format +msgid "only string constants supported in JSON_TABLE path specification" +msgstr "JSON_TABLEのパス指定では文字列定数のみサポートされています" + +#: parser/parse_merge.c:119 +#, c-format +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "MERGE文ではWITH RECURSIVEはサポートされません" + +#: parser/parse_merge.c:163 +#, c-format +msgid "unreachable WHEN clause specified after unconditional WHEN clause" +msgstr "無条件WHEN句の後に指定されて到達不能なWHEN句" + +#: parser/parse_merge.c:178 parser/parse_merge.c:184 +#, c-format +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "リレーション\"%s\"に対してMERGEは実行できません" + +#: parser/parse_merge.c:186 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "MERGEはルールを持つリレーションに対してはサポートされません。" + +#: parser/parse_merge.c:203 +#, c-format +msgid "name \"%s\" specified more than once" +msgstr "名前\"%s\"が複数回指定されています" + +#: parser/parse_merge.c:205 +#, c-format +msgid "The name is used both as MERGE target table and data source." +msgstr "この名前はMERGEのターゲットテーブルとデータソースの両方で使用されています" + +#: parser/parse_node.c:86 +#, c-format +msgid "target lists can have at most %d entries" +msgstr "ターゲットリストは最大でも%dエントリまでしか持てません" -#: parser/parse_node.c:408 +#: parser/parse_oper.c:123 parser/parse_oper.c:690 #, c-format -msgid "array assignment requires type %s but expression is of type %s" -msgstr "配列の代入では型%sが必要でしたが、式は型%sでした" +msgid "postfix operators are not supported" +msgstr "後置演算子はサポートされていません" -#: parser/parse_oper.c:125 parser/parse_oper.c:724 utils/adt/regproc.c:538 utils/adt/regproc.c:722 +#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:539 utils/adt/regproc.c:723 #, c-format msgid "operator does not exist: %s" msgstr "演算子が存在しません: %s" -#: parser/parse_oper.c:224 +#: parser/parse_oper.c:229 #, c-format msgid "Use an explicit ordering operator or modify the query." msgstr "明示的に順序演算子を使用するか問い合わせを変更してください。" -#: parser/parse_oper.c:480 +#: parser/parse_oper.c:485 #, c-format msgid "operator requires run-time type coercion: %s" msgstr "演算子に実行時の型強制が必要です: %s" -#: parser/parse_oper.c:716 +#: parser/parse_oper.c:641 #, c-format msgid "operator is not unique: %s" msgstr "演算子は一意ではありません: %s" -#: parser/parse_oper.c:718 +#: parser/parse_oper.c:643 #, c-format msgid "Could not choose a best candidate operator. You might need to add explicit type casts." msgstr "最善の候補演算子を選択できませんでした。明示的な型キャストが必要かもしれません" -#: parser/parse_oper.c:727 +#: parser/parse_oper.c:652 #, c-format msgid "No operator matches the given name and argument type. You might need to add an explicit type cast." msgstr "指定した名称と引数の型に合う演算子がありません。明示的な型キャストが必要かもしれません。" -#: parser/parse_oper.c:729 +#: parser/parse_oper.c:654 #, c-format msgid "No operator matches the given name and argument types. You might need to add explicit type casts." msgstr "指定した名称と引数の型に合う演算子がありません。明示的な型キャストが必要かもしれません。" -#: parser/parse_oper.c:790 parser/parse_oper.c:912 +#: parser/parse_oper.c:714 parser/parse_oper.c:828 #, c-format msgid "operator is only a shell: %s" msgstr "演算子は単なるシェルです: %s" -#: parser/parse_oper.c:900 +#: parser/parse_oper.c:816 #, c-format msgid "op ANY/ALL (array) requires array on right side" msgstr "演算子 ANY/ALL (配列) 右辺に配列が必要です" -#: parser/parse_oper.c:942 +#: parser/parse_oper.c:858 #, c-format msgid "op ANY/ALL (array) requires operator to yield boolean" msgstr "演算子 ANY/ALL (配列) はブール型を返さなければなりません" -#: parser/parse_oper.c:947 +#: parser/parse_oper.c:863 #, c-format msgid "op ANY/ALL (array) requires operator not to return a set" msgstr "演算子 ANY/ALL (配列) 集合を返してはなりません" -#: parser/parse_param.c:216 +#: parser/parse_param.c:225 #, c-format msgid "inconsistent types deduced for parameter $%d" msgstr "パラメータ$%dについて推定された型が不整合です" +#: parser/parse_param.c:313 tcop/postgres.c:709 +#, c-format +msgid "could not determine data type of parameter $%d" +msgstr "パラメータ$%dのデータ型が特定できませんでした" + #: parser/parse_relation.c:201 #, c-format msgid "table reference \"%s\" is ambiguous" @@ -15921,152 +17265,167 @@ msgstr "テーブル参照\"%s\"は曖昧です" msgid "table reference %u is ambiguous" msgstr "テーブル参照%uは曖昧です" -#: parser/parse_relation.c:444 +#: parser/parse_relation.c:445 #, c-format msgid "table name \"%s\" specified more than once" msgstr "テーブル名\"%s\"が複数指定されました" -#: parser/parse_relation.c:473 parser/parse_relation.c:3446 +#: parser/parse_relation.c:474 parser/parse_relation.c:3548 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "テーブル\"%s\"用のFROM句に対する不正な参照" -#: parser/parse_relation.c:477 parser/parse_relation.c:3451 +#: parser/parse_relation.c:478 parser/parse_relation.c:3553 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "テーブル\"%s\"の項目がありますが、問い合わせのこの部分からは参照できません。\"" -#: parser/parse_relation.c:479 +#: parser/parse_relation.c:480 #, c-format msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." msgstr "LATERAL参照では組み合わせる結合のタイプはINNERまたはLEFTでなければなりません" -#: parser/parse_relation.c:690 +#: parser/parse_relation.c:691 #, c-format msgid "system column \"%s\" reference in check constraint is invalid" msgstr "検査制約で参照されるシステム列\"%s\"は不正です" -#: parser/parse_relation.c:699 +#: parser/parse_relation.c:700 #, c-format msgid "cannot use system column \"%s\" in column generation expression" msgstr "カラム生成式ではシステム列\"%s\"は使用できません" -#: parser/parse_relation.c:1170 parser/parse_relation.c:1620 parser/parse_relation.c:2262 +#: parser/parse_relation.c:711 +#, c-format +msgid "cannot use system column \"%s\" in MERGE WHEN condition" +msgstr "MERGE WHEN条件ではシステム列\"%s\"は使用できません" + +#: parser/parse_relation.c:1184 parser/parse_relation.c:1636 parser/parse_relation.c:2314 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "テーブル\"%s\"では%d列使用できますが、%d列指定されました" -#: parser/parse_relation.c:1372 +#: parser/parse_relation.c:1388 #, c-format msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." msgstr "\"%s\"というWITH項目はありますが、これは問い合わせのこの部分からは参照できません。" -#: parser/parse_relation.c:1374 +#: parser/parse_relation.c:1390 #, c-format msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." msgstr "WITH RECURSIVE を使うか、もしくは WITH 項目の場所を変えて前方参照をなくしてください" -#: parser/parse_relation.c:1747 +#: parser/parse_relation.c:1778 +#, c-format +msgid "a column definition list is redundant for a function with OUT parameters" +msgstr "OUTパラメータを持つ関数に対しては列定義リストは不要です" + +#: parser/parse_relation.c:1784 +#, c-format +msgid "a column definition list is redundant for a function returning a named composite type" +msgstr "名前付き複合型w返す関数に対しては列定義リストは不要です" + +#: parser/parse_relation.c:1791 #, c-format msgid "a column definition list is only allowed for functions returning \"record\"" msgstr "列定義リストは\"record\"を返す関数でのみ使用できます" -#: parser/parse_relation.c:1756 +#: parser/parse_relation.c:1802 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "\"record\"を返す関数では列定義リストが必要です" -#: parser/parse_relation.c:1845 +#: parser/parse_relation.c:1891 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "FROM句の関数\"%s\"の戻り値型%sはサポートされていません" -#: parser/parse_relation.c:2054 +#: parser/parse_relation.c:2101 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "VALUESリスト\"%s\"は%d列使用可能ですが、%d列が指定されました" -#: parser/parse_relation.c:2125 +#: parser/parse_relation.c:2173 #, c-format msgid "joins can have at most %d columns" msgstr "JOIN で指定できるのは、最大 %d 列です" -#: parser/parse_relation.c:2235 +#: parser/parse_relation.c:2287 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "WITH 問い合わせ\"%s\"にRETURNING句がありません" -#: parser/parse_relation.c:3221 parser/parse_relation.c:3231 +#: parser/parse_relation.c:3323 parser/parse_relation.c:3333 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"の列\"%1$d\"は存在しません" -#: parser/parse_relation.c:3449 +#: parser/parse_relation.c:3551 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "テーブル別名\"%s\"を参照しようとしていたようです。" -#: parser/parse_relation.c:3457 +#: parser/parse_relation.c:3559 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "テーブル\"%s\"用のFROM句エントリがありません" -#: parser/parse_relation.c:3509 +#: parser/parse_relation.c:3611 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "列\"%s.%s\"を参照しようとしていたようです。" -#: parser/parse_relation.c:3511 +#: parser/parse_relation.c:3613 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "テーブル\"%2$s\"には\"%1$s\"という名前の列がありますが、問い合わせのこの部分からは参照できません。" -#: parser/parse_relation.c:3528 +#: parser/parse_relation.c:3630 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "列\"%s.%s\"または列\"%s.%s\"を参照しようとしていたようです。" -#: parser/parse_target.c:478 parser/parse_target.c:792 +#: parser/parse_target.c:482 parser/parse_target.c:803 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "システム列\"%s\"に代入できません" -#: parser/parse_target.c:506 +#: parser/parse_target.c:510 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "配列要素にDEFAULTを設定できません" -#: parser/parse_target.c:511 +#: parser/parse_target.c:515 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "サブフィールドにDEFAULTを設定できません" -#: parser/parse_target.c:584 +#: parser/parse_target.c:589 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "列\"%s\"は型%sですが、式は型%sでした" -#: parser/parse_target.c:776 +#: parser/parse_target.c:787 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" msgstr "型%3$sが複合型でありませんので、列\"%2$s\"のフィールド\"%1$s\"に代入できません。" -#: parser/parse_target.c:785 +#: parser/parse_target.c:796 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" msgstr "データ型%3$sの列がありませんので、列\"%2$s\"のフィールド\"%1$s\"に代入できません。" -#: parser/parse_target.c:864 +#: parser/parse_target.c:877 #, c-format -msgid "array assignment to \"%s\" requires type %s but expression is of type %s" -msgstr "\"%s\"への配列代入には型%sが必要ですが、式は型%sでした" +msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" +msgstr "\"%s\"への添字付き代入には型%sが必要ですが、式は型%sでした" -#: parser/parse_target.c:874 +#: parser/parse_target.c:887 #, c-format msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "サブフィールド\"%s\"は型%sですが、式は型%sでした" -#: parser/parse_target.c:1295 +#: parser/parse_target.c:1323 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "テーブル指定のないSELECT *は無効です" @@ -16086,7 +17445,7 @@ msgstr "%%TYPE参照が不適切です(ドット区切りの名前が多すぎ msgid "type reference %s converted to %s" msgstr "型参照%sは%sに変換されました" -#: parser/parse_type.c:278 parser/parse_type.c:857 utils/cache/typcache.c:383 utils/cache/typcache.c:437 +#: parser/parse_type.c:278 parser/parse_type.c:807 utils/cache/typcache.c:390 utils/cache/typcache.c:445 #, c-format msgid "type \"%s\" is only a shell" msgstr "型\"%s\"は単なるシェルです" @@ -16096,455 +17455,460 @@ msgstr "型\"%s\"は単なるシェルです" msgid "type modifier is not allowed for type \"%s\"" msgstr "型\"%s\"では型修正子は許可されません" -#: parser/parse_type.c:405 +#: parser/parse_type.c:409 #, c-format msgid "type modifiers must be simple constants or identifiers" msgstr "型修正子は単純な定数または識別子でなければなりません" -#: parser/parse_type.c:721 parser/parse_type.c:820 +#: parser/parse_type.c:725 parser/parse_type.c:770 #, c-format msgid "invalid type name \"%s\"" msgstr "不正な型名\"%s\"" -#: parser/parse_utilcmd.c:263 +#: parser/parse_utilcmd.c:256 #, c-format msgid "cannot create partitioned table as inheritance child" -msgstr "パーティションテーブルを継承の子テーブルとして作成はできません" - -#: parser/parse_utilcmd.c:427 -#, c-format -msgid "%s will create implicit sequence \"%s\" for serial column \"%s.%s\"" -msgstr "%1$sはシリアル列\"%3$s.%4$s\"用に暗黙的なシーケンス\"%2$s\"を作成します。" +msgstr "パーティション親テーブルを継承の子テーブルとして作成はできません" -#: parser/parse_utilcmd.c:558 +#: parser/parse_utilcmd.c:569 #, c-format msgid "array of serial is not implemented" msgstr "連番(SERIAL)の配列は実装されていません" -#: parser/parse_utilcmd.c:636 parser/parse_utilcmd.c:648 +#: parser/parse_utilcmd.c:648 parser/parse_utilcmd.c:660 parser/parse_utilcmd.c:719 #, c-format msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"の列\"%1$s\"でNULL宣言とNOT NULL宣言が競合しています" -#: parser/parse_utilcmd.c:660 +#: parser/parse_utilcmd.c:672 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"の列\"%1$s\"で複数のデフォルト値の指定があります" -#: parser/parse_utilcmd.c:677 +#: parser/parse_utilcmd.c:689 #, c-format msgid "identity columns are not supported on typed tables" msgstr "型付けされたテーブルでは識別列はサポートされていません" -#: parser/parse_utilcmd.c:681 +#: parser/parse_utilcmd.c:693 #, c-format msgid "identity columns are not supported on partitions" msgstr "パーティションでは識別列はサポートされていません" -#: parser/parse_utilcmd.c:690 +#: parser/parse_utilcmd.c:702 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"の列\"%1$s\"に複数の識別指定があります" -#: parser/parse_utilcmd.c:710 +#: parser/parse_utilcmd.c:732 #, c-format msgid "generated columns are not supported on typed tables" msgstr "型付けされたテーブルでは生成カラムはサポートされていません" -#: parser/parse_utilcmd.c:714 +#: parser/parse_utilcmd.c:736 #, c-format msgid "generated columns are not supported on partitions" msgstr "パーティションでは生成カラムはサポートされていません" -#: parser/parse_utilcmd.c:719 +#: parser/parse_utilcmd.c:741 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"の列\"%1$s\"に複数のGENERATED句の指定があります" -#: parser/parse_utilcmd.c:737 parser/parse_utilcmd.c:852 +#: parser/parse_utilcmd.c:759 parser/parse_utilcmd.c:874 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "外部テーブルでは主キー制約はサポートされていません" -#: parser/parse_utilcmd.c:746 parser/parse_utilcmd.c:862 +#: parser/parse_utilcmd.c:768 parser/parse_utilcmd.c:884 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "外部テーブルではユニーク制約はサポートされていません" -#: parser/parse_utilcmd.c:791 +#: parser/parse_utilcmd.c:813 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "デフォルト値と識別指定の両方がテーブル\"%2$s\"の列\"%1$s\"に指定されています" -#: parser/parse_utilcmd.c:799 +#: parser/parse_utilcmd.c:821 #, c-format msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"の列\"%1$s\"にデフォルト値と生成式の両方が指定されています" -#: parser/parse_utilcmd.c:807 +#: parser/parse_utilcmd.c:829 #, c-format msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"の列\"%1$s\"に識別指定と生成式の両方が指定されています" -#: parser/parse_utilcmd.c:872 +#: parser/parse_utilcmd.c:894 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "外部テーブルでは除外制約はサポートされていません" -#: parser/parse_utilcmd.c:878 +#: parser/parse_utilcmd.c:900 #, c-format msgid "exclusion constraints are not supported on partitioned tables" msgstr "パーティションテーブルでは除外制約はサポートされていません" -#: parser/parse_utilcmd.c:943 +#: parser/parse_utilcmd.c:965 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "外部テーブルの作成においてLIKEはサポートされていません" -#: parser/parse_utilcmd.c:1095 +#: parser/parse_utilcmd.c:978 #, c-format -msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." -msgstr "制約\"%s\"はテーブル\"%s\"への行全体参照を含みます。" +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "LIKE句ではリレーション\"%s\"は不正です" -#: parser/parse_utilcmd.c:1598 parser/parse_utilcmd.c:1707 +#: parser/parse_utilcmd.c:1744 parser/parse_utilcmd.c:1852 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "インデックス\"%s\"には行全体テーブル参照が含まれます" -#: parser/parse_utilcmd.c:2075 +#: parser/parse_utilcmd.c:2241 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "CREATE TABLE では既存のインデックスを使えません" -#: parser/parse_utilcmd.c:2095 +#: parser/parse_utilcmd.c:2261 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "インデックス\"%s\"はすでに1つの制約に割り当てられれいます" -#: parser/parse_utilcmd.c:2110 +#: parser/parse_utilcmd.c:2276 #, c-format msgid "index \"%s\" is not valid" msgstr "インデックス\"%s\"は有効ではありません" -#: parser/parse_utilcmd.c:2116 +#: parser/parse_utilcmd.c:2282 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\"はユニークインデックスではありません" -#: parser/parse_utilcmd.c:2117 parser/parse_utilcmd.c:2124 parser/parse_utilcmd.c:2131 parser/parse_utilcmd.c:2208 +#: parser/parse_utilcmd.c:2283 parser/parse_utilcmd.c:2290 parser/parse_utilcmd.c:2297 parser/parse_utilcmd.c:2374 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "このようなインデックスを使ってプライマリキーや一意性制約を作成することはできません" -#: parser/parse_utilcmd.c:2123 +#: parser/parse_utilcmd.c:2289 #, c-format msgid "index \"%s\" contains expressions" msgstr "インデックス\"%s\"は式を含んでいます" -#: parser/parse_utilcmd.c:2130 +#: parser/parse_utilcmd.c:2296 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\"は部分インデックスです" -#: parser/parse_utilcmd.c:2142 +#: parser/parse_utilcmd.c:2308 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\"は遅延可能インデックスです" -#: parser/parse_utilcmd.c:2143 +#: parser/parse_utilcmd.c:2309 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "遅延可能インデックスを使った遅延不可制約は作れません。" -#: parser/parse_utilcmd.c:2207 +#: parser/parse_utilcmd.c:2373 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "インデックス\"%s\"の列番号%dにはデフォルトのソート動作がありません" -#: parser/parse_utilcmd.c:2364 +#: parser/parse_utilcmd.c:2530 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "列\"%s\"がプライマリキー制約内に2回出現します" -#: parser/parse_utilcmd.c:2370 +#: parser/parse_utilcmd.c:2536 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "列\"%s\"が一意性制約内に2回出現します" -#: parser/parse_utilcmd.c:2723 +#: parser/parse_utilcmd.c:2883 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "インデックス式と述語はインデックス付けされるテーブルのみを参照できます" -#: parser/parse_utilcmd.c:2769 +#: parser/parse_utilcmd.c:2955 +#, c-format +msgid "statistics expressions can refer only to the table being referenced" +msgstr "統計情報式は参照されているテーブルのみを参照できます" + +#: parser/parse_utilcmd.c:2998 #, c-format msgid "rules on materialized views are not supported" msgstr "実体化ビューに対するルールはサポートされません" -#: parser/parse_utilcmd.c:2832 +#: parser/parse_utilcmd.c:3061 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "ルールのWHERE条件に他のリレーションへの参照を持たせられません" -#: parser/parse_utilcmd.c:2906 +#: parser/parse_utilcmd.c:3134 #, c-format msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "ルールのWHERE条件はSELECT、INSERT、UPDATE、DELETE動作のみを持つことができます" -#: parser/parse_utilcmd.c:2924 parser/parse_utilcmd.c:3025 rewrite/rewriteHandler.c:502 rewrite/rewriteManip.c:1018 +#: parser/parse_utilcmd.c:3152 parser/parse_utilcmd.c:3253 rewrite/rewriteHandler.c:508 rewrite/rewriteManip.c:1018 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "条件付きのUNION/INTERSECT/EXCEPT文は実装されていません" -#: parser/parse_utilcmd.c:2942 +#: parser/parse_utilcmd.c:3170 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "ON SELECTルールではOLDを使用できません" -#: parser/parse_utilcmd.c:2946 +#: parser/parse_utilcmd.c:3174 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "ON SELECTルールではNEWを使用できません" -#: parser/parse_utilcmd.c:2955 +#: parser/parse_utilcmd.c:3183 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "ON INSERTルールではOLDを使用できません" -#: parser/parse_utilcmd.c:2961 +#: parser/parse_utilcmd.c:3189 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "ON DELETEルールではNEWを使用できません" -#: parser/parse_utilcmd.c:2989 +#: parser/parse_utilcmd.c:3217 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "WITH 問い合わせ内では OLD は参照できません" -#: parser/parse_utilcmd.c:2996 +#: parser/parse_utilcmd.c:3224 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "WITH 問い合わせ内では NEW は参照できません" -#: parser/parse_utilcmd.c:3455 +#: parser/parse_utilcmd.c:3678 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "DEFERRABLE句の場所が間違っています" -#: parser/parse_utilcmd.c:3460 parser/parse_utilcmd.c:3475 +#: parser/parse_utilcmd.c:3683 parser/parse_utilcmd.c:3698 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "複数のDEFERRABLE/NOT DEFERRABLE句を使用できません" -#: parser/parse_utilcmd.c:3470 +#: parser/parse_utilcmd.c:3693 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "NOT DEFERRABLE句の場所が間違っています" -#: parser/parse_utilcmd.c:3491 +#: parser/parse_utilcmd.c:3714 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "INITIALLY DEFERRED句の場所が間違っています<" -#: parser/parse_utilcmd.c:3496 parser/parse_utilcmd.c:3522 +#: parser/parse_utilcmd.c:3719 parser/parse_utilcmd.c:3745 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "複数のINITIALLY IMMEDIATE/DEFERRED句を使用できません" -#: parser/parse_utilcmd.c:3517 +#: parser/parse_utilcmd.c:3740 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "INITIALLY IMMEDIATE句の場所が間違っています<" -#: parser/parse_utilcmd.c:3708 +#: parser/parse_utilcmd.c:3931 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATEで指定したスキーマ(%s)が作成先のスキーマ(%s)と異なります" -#: parser/parse_utilcmd.c:3743 +#: parser/parse_utilcmd.c:3966 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\"はパーティションテーブルではありません" -#: parser/parse_utilcmd.c:3750 +#: parser/parse_utilcmd.c:3973 #, c-format msgid "table \"%s\" is not partitioned" msgstr "テーブル\"%s\"はパーティションされていません" -#: parser/parse_utilcmd.c:3757 +#: parser/parse_utilcmd.c:3980 #, c-format msgid "index \"%s\" is not partitioned" msgstr "インデックス\"%s\"はパーティションされていません" -#: parser/parse_utilcmd.c:3797 +#: parser/parse_utilcmd.c:4020 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "ハッシュパーティションテーブルはデフォルトパーティションを持つことができません" -#: parser/parse_utilcmd.c:3814 +#: parser/parse_utilcmd.c:4037 #, c-format msgid "invalid bound specification for a hash partition" msgstr "ハッシュパーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:3820 partitioning/partbounds.c:4693 +#: parser/parse_utilcmd.c:4043 partitioning/partbounds.c:4823 #, c-format -msgid "modulus for hash partition must be a positive integer" -msgstr "ハッシュパーティションの法は正の整数にする必要があります" +msgid "modulus for hash partition must be an integer value greater than zero" +msgstr "ハッシュパーティションの法は0より大きい整数にする必要があります" -#: parser/parse_utilcmd.c:3827 partitioning/partbounds.c:4701 +#: parser/parse_utilcmd.c:4050 partitioning/partbounds.c:4831 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "ハッシュパーティションの剰余は法よりも小さくなければなりません" -#: parser/parse_utilcmd.c:3840 +#: parser/parse_utilcmd.c:4063 #, c-format msgid "invalid bound specification for a list partition" msgstr "リストパーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:3893 +#: parser/parse_utilcmd.c:4116 #, c-format msgid "invalid bound specification for a range partition" msgstr "範囲パーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:3899 +#: parser/parse_utilcmd.c:4122 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROMは全てのパーティション列ごとに一つの値を指定しなければなりません" -#: parser/parse_utilcmd.c:3903 +#: parser/parse_utilcmd.c:4126 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TOは全てのパーティション列ごとに一つの値を指定しなければなりません" -#: parser/parse_utilcmd.c:4017 +#: parser/parse_utilcmd.c:4240 #, c-format msgid "cannot specify NULL in range bound" msgstr "範囲境界でNULLは使用できません" -#: parser/parse_utilcmd.c:4066 +#: parser/parse_utilcmd.c:4289 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "MAXVALUEに続く境界値はMAXVALUEでなければなりません" -#: parser/parse_utilcmd.c:4073 +#: parser/parse_utilcmd.c:4296 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "MINVALUEに続く境界値はMINVALUEでなければなりません" -#: parser/parse_utilcmd.c:4115 -#, c-format -msgid "could not determine which collation to use for partition bound expression" -msgstr "パーティション境界式で使用する照合順序を特定できませんでした" - -#: parser/parse_utilcmd.c:4132 -#, c-format -msgid "collation of partition bound value for column \"%s\" does not match partition key collation \"%s\"" -msgstr "列\"%s\"に対するパーティション境界値の照合順序がパーティションキーの照合順序\"%s\"と合致しません" - -#: parser/parse_utilcmd.c:4149 +#: parser/parse_utilcmd.c:4339 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "指定した値は列\"%s\"の%s型に変換できません" -#: parser/parser.c:228 +#: parser/parser.c:263 msgid "UESCAPE must be followed by a simple string literal" msgstr "UESCAPE の後には単純な文字列リテラルが続かなければなりません" -#: parser/parser.c:233 +#: parser/parser.c:268 msgid "invalid Unicode escape character" msgstr "不正なUnicodeエスケープ文字" -#: parser/parser.c:302 scan.l:1330 +#: parser/parser.c:337 scan.l:1339 #, c-format msgid "invalid Unicode escape value" msgstr "不正なUnicodeエスケープシーケンスの値" -#: parser/parser.c:449 scan.l:677 +#: parser/parser.c:484 scan.l:684 utils/adt/varlena.c:6533 #, c-format msgid "invalid Unicode escape" msgstr "不正なUnicodeエスケープ" -#: parser/parser.c:450 +#: parser/parser.c:485 #, c-format msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Unicodeエスケープは\\XXXXまたは\\+XXXXXXでなければなりません。" -#: parser/parser.c:478 scan.l:638 scan.l:654 scan.l:670 +#: parser/parser.c:513 scan.l:645 scan.l:661 scan.l:677 utils/adt/varlena.c:6558 #, c-format msgid "invalid Unicode surrogate pair" msgstr "不正なUnicodeサロゲートペア" -#: parser/scansup.c:194 +#: parser/scansup.c:101 #, c-format msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "識別子\"%s\"は\"%.*s\"に切り詰められます" -#: partitioning/partbounds.c:2833 +#: partitioning/partbounds.c:2932 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "パーティション\"%s\"は既存のデフォルトパーティション\"%s\"と重複しています" -#: partitioning/partbounds.c:2892 +#: partitioning/partbounds.c:2984 partitioning/partbounds.c:3003 partitioning/partbounds.c:3025 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "ハッシュパーティションの法(除数)は次に大きな法の因数でなければなりません" -#: partitioning/partbounds.c:2988 +#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3026 +#, c-format +msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." +msgstr "新しい法(除数)%1$dは既存のパーティション\"%3$s\"の法である%2$dの因数ではありません。" + +#: partitioning/partbounds.c:3004 +#, c-format +msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." +msgstr "新しい法(除数)%1$dは既存のパーティション\"%3$s\"の法である%2$dで割り切れません。" + +#: partitioning/partbounds.c:3139 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "リレーション\"%s\"に対して空の範囲境界が指定されました" -#: partitioning/partbounds.c:2990 +#: partitioning/partbounds.c:3141 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "指定された下限%sは上限%sより大きいか同じです。" -#: partitioning/partbounds.c:3087 +#: partitioning/partbounds.c:3253 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "パーティション\"%s\"はパーティション\"%s\"と重複があります" -#: partitioning/partbounds.c:3204 +#: partitioning/partbounds.c:3370 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "デフォルトパーティション\"%2$s\"の子テーブルであるためテーブル\"%1$s\"のスキャンをスキップします" -#: partitioning/partbounds.c:4697 +#: partitioning/partbounds.c:4827 #, c-format -msgid "remainder for hash partition must be a non-negative integer" -msgstr "ハッシュパーティションの剰余は非負の整数でなければなりません" +msgid "remainder for hash partition must be an integer value greater than or equal to zero" +msgstr "ハッシュパーティションの剰余は0または0より大きい整数でなければなりません" -#: partitioning/partbounds.c:4724 +#: partitioning/partbounds.c:4851 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\"はハッシュパーティションテーブルではありません" -#: partitioning/partbounds.c:4735 partitioning/partbounds.c:4852 +#: partitioning/partbounds.c:4862 partitioning/partbounds.c:4979 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "パーティション列の数(%d)と与えられたキー値の数(%d)が一致していません" -#: partitioning/partbounds.c:4757 partitioning/partbounds.c:4789 +#: partitioning/partbounds.c:4884 +#, c-format +msgid "column %d of the partition key has type %s, but supplied value is of type %s" +msgstr "パーティションキーの列%dは%s型です、しかし与えられた値は%s型です" + +#: partitioning/partbounds.c:4916 #, c-format msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" msgstr "パーティションキーの列 %d は \"%s\"型です、しかし与えられた値は \"%s\"型です" -#: port/pg_sema.c:209 port/pg_shmem.c:668 port/posix_sema.c:209 port/sysv_sema.c:327 port/sysv_shmem.c:668 +#: port/pg_sema.c:209 port/pg_shmem.c:695 port/posix_sema.c:209 port/sysv_sema.c:327 port/sysv_shmem.c:695 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "データディレクトリ\"%s\"のstatに失敗しました: %m" -#: port/pg_shmem.c:217 port/sysv_shmem.c:217 +#: port/pg_shmem.c:227 port/sysv_shmem.c:227 #, c-format msgid "could not create shared memory segment: %m" msgstr "共有メモリセグメントを作成できませんでした: %m" -#: port/pg_shmem.c:218 port/sysv_shmem.c:218 +#: port/pg_shmem.c:228 port/sysv_shmem.c:228 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "失敗したシステムコールはshmget(key=%lu, size=%zu, 0%o)です。" -#: port/pg_shmem.c:222 port/sysv_shmem.c:222 +#: port/pg_shmem.c:232 port/sysv_shmem.c:232 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" @@ -16553,7 +17917,7 @@ msgstr "" "通常このエラーは、PostgreSQLが要求する共有メモリセグメントがカーネルのSHMMAXパラメータを超えた場合、または可能性としてはカーネルのSHMMINパラメータより小さい場合に発生します。\n" "共有メモリの設定に関する詳細情報は、PostgreSQL のドキュメントに記載されています。" -#: port/pg_shmem.c:229 port/sysv_shmem.c:229 +#: port/pg_shmem.c:239 port/sysv_shmem.c:239 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" @@ -16562,7 +17926,7 @@ msgstr "" "通常このエラーは、PostgreSQLが要求する共有メモリセグメントがカーネルのSHMALLパラメータを超えた場合に発生します。より大きなSHMALLでカーネルを再設定する必要があるかもしれません。\n" "これ以上の共有メモリの設定に関する情報は、PostgreSQL のドキュメントに記載されています。" -#: port/pg_shmem.c:235 port/sysv_shmem.c:235 +#: port/pg_shmem.c:245 port/sysv_shmem.c:245 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" @@ -16571,27 +17935,32 @@ msgstr "" "このエラーはディスクの容量不足を意味していません。このエラーの要因の一つは共有メモリの識別子の枯渇です。この場合はカーネルのSHMMNIパラメータを増やす必要がありますが、そうでなければ要因はシステム全体の共有メモリの制限へ到達となります。\n" "これ以上の共有メモリの設定に関する情報は、PostgreSQLのドキュメントに記載されています。" -#: port/pg_shmem.c:606 port/sysv_shmem.c:606 +#: port/pg_shmem.c:633 port/sysv_shmem.c:633 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "匿名共有メモリをマップできませんでした: %m" -#: port/pg_shmem.c:608 port/sysv_shmem.c:608 +#: port/pg_shmem.c:635 port/sysv_shmem.c:635 #, c-format msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections." msgstr "通常このエラーは、PostgreSQL が要求する共有メモリのサイズが利用可能なメモリやスワップ容量、ないしはヒュージページを超えた場合に発生します。要求サイズ(現在 %zu バイト)を減らすために、shared_buffers または max_connections を減らすことでPostgreSQLの共有メモリの使用量を減らしてください。" -#: port/pg_shmem.c:676 port/sysv_shmem.c:676 +#: port/pg_shmem.c:703 port/sysv_shmem.c:703 #, c-format msgid "huge pages not supported on this platform" msgstr "このプラットフォームではヒュージページをサポートしていません" -#: port/pg_shmem.c:737 port/sysv_shmem.c:737 utils/init/miscinit.c:1139 +#: port/pg_shmem.c:710 port/sysv_shmem.c:710 +#, c-format +msgid "huge pages not supported with the current shared_memory_type setting" +msgstr "ヒュージページは現在のshared_memory_typeの設定ではサポートされません" + +#: port/pg_shmem.c:770 port/sysv_shmem.c:770 utils/init/miscinit.c:1187 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "既存の共有メモリブロック(キー%lu、ID %lu)がまだ使用中です" -#: port/pg_shmem.c:740 port/sysv_shmem.c:740 utils/init/miscinit.c:1141 +#: port/pg_shmem.c:773 port/sysv_shmem.c:773 utils/init/miscinit.c:1189 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "データディレクトリ \"%s\". に対応する古いサーバプロセスを終了させてください。" @@ -16622,37 +17991,37 @@ msgstr "" "おそらくカーネルのSEMVMX値を最低でも%dまで増やす必要があります。\n" "詳細はPostgreSQLのドキュメントを調べてください。" -#: port/win32/crashdump.c:121 +#: port/win32/crashdump.c:119 #, c-format msgid "could not load dbghelp.dll, cannot write crash dump\n" msgstr "dbghelp.dll をロードできず、クラッシュダンプも書き込めません\n" -#: port/win32/crashdump.c:129 +#: port/win32/crashdump.c:127 #, c-format msgid "could not load required functions in dbghelp.dll, cannot write crash dump\n" msgstr "dbghelp.dll で必要とする関数をロードできませんでした。クラッシュダンプを書き込めません\n" -#: port/win32/crashdump.c:160 +#: port/win32/crashdump.c:158 #, c-format msgid "could not open crash dump file \"%s\" for writing: error code %lu\n" msgstr "クラッシュダンプファイル\"%s\"を書き込み用にオープンできませんでした: エラーコード %lu\n" -#: port/win32/crashdump.c:167 +#: port/win32/crashdump.c:165 #, c-format msgid "wrote crash dump to file \"%s\"\n" msgstr "クラッシュダンプを\"%s\"に書き込みました\n" -#: port/win32/crashdump.c:169 +#: port/win32/crashdump.c:167 #, c-format msgid "could not write crash dump to file \"%s\": error code %lu\n" msgstr "クラッシュダンプの\"%s\"への書き込みに失敗しました: エラーコード %lu\n" -#: port/win32/signal.c:196 +#: port/win32/signal.c:206 #, c-format msgid "could not create signal listener pipe for PID %d: error code %lu" msgstr "pid %dに対するシグナル監視パイプを作成できませんでした: エラーコード %lu" -#: port/win32/signal.c:251 +#: port/win32/signal.c:261 #, c-format msgid "could not create signal listener pipe: error code %lu; retrying\n" msgstr "シグナル監視パイプを作成できませんでした: エラーコード %lu: 再実行します\n" @@ -16677,512 +18046,356 @@ msgstr "セマフォのロックを解除できませんでした: エラーコ msgid "could not try-lock semaphore: error code %lu" msgstr "セマフォのロック試行に失敗しました: エラーコード %lu" -#: port/win32_shmem.c:144 port/win32_shmem.c:152 port/win32_shmem.c:164 port/win32_shmem.c:179 +#: port/win32_shmem.c:144 port/win32_shmem.c:159 port/win32_shmem.c:171 port/win32_shmem.c:187 #, c-format -msgid "could not enable Lock Pages in Memory user right: error code %lu" -msgstr "Lock Pages in Memoryユーザ権限を有効にできませんでした: エラーコード %lu" +msgid "could not enable user right \"%s\": error code %lu" +msgstr "ユーザー権限\"%s\"を有効化できませんでした: エラーコード %lu" -#: port/win32_shmem.c:145 port/win32_shmem.c:153 port/win32_shmem.c:165 port/win32_shmem.c:180 +#. translator: This is a term from Windows and should be translated to +#. match the Windows localization. +#. +#: port/win32_shmem.c:150 port/win32_shmem.c:159 port/win32_shmem.c:171 port/win32_shmem.c:182 port/win32_shmem.c:184 port/win32_shmem.c:187 +msgid "Lock pages in memory" +msgstr "Lock pages in memory" + +#: port/win32_shmem.c:152 port/win32_shmem.c:160 port/win32_shmem.c:172 port/win32_shmem.c:188 #, c-format msgid "Failed system call was %s." msgstr "失敗したシステムコールは %s です。" -#: port/win32_shmem.c:175 +#: port/win32_shmem.c:182 #, c-format -msgid "could not enable Lock Pages in Memory user right" -msgstr "Lock Pages in Memoryユーザ権限を有効にできませんでした" +msgid "could not enable user right \"%s\"" +msgstr "ユーザー権限\"%s\"を有効化できませんでした" -#: port/win32_shmem.c:176 +#: port/win32_shmem.c:183 #, c-format -msgid "Assign Lock Pages in Memory user right to the Windows user account which runs PostgreSQL." -msgstr "PostgreSQL を実行するWindowsユーザアカウントに Lock Pages in Memory 権限を付与してください。" +msgid "Assign user right \"%s\" to the Windows user account which runs PostgreSQL." +msgstr "PostgreSQL を実行するWindowsユーザーアカウントに\"%s\"権限を付与してください。" -#: port/win32_shmem.c:233 +#: port/win32_shmem.c:241 #, c-format msgid "the processor does not support large pages" msgstr "このプロセッサはラージページをサポートしていません" -#: port/win32_shmem.c:235 port/win32_shmem.c:240 -#, c-format -msgid "disabling huge pages" -msgstr "ヒュージページを無効にします" - -#: port/win32_shmem.c:302 port/win32_shmem.c:338 port/win32_shmem.c:356 +#: port/win32_shmem.c:310 port/win32_shmem.c:346 port/win32_shmem.c:364 #, c-format msgid "could not create shared memory segment: error code %lu" msgstr "共有メモリセグメントを作成できませんでした: エラーコード %lu" -#: port/win32_shmem.c:303 +#: port/win32_shmem.c:311 #, c-format msgid "Failed system call was CreateFileMapping(size=%zu, name=%s)." msgstr "失敗したシステムコールはCreateFileMapping(size=%zu, name=%s)です。" -#: port/win32_shmem.c:328 +#: port/win32_shmem.c:336 #, c-format msgid "pre-existing shared memory block is still in use" msgstr "既存の共有メモリブロックはまだ使用中です" -#: port/win32_shmem.c:329 +#: port/win32_shmem.c:337 #, c-format msgid "Check if there are any old server processes still running, and terminate them." msgstr "古いサーバプロセスを確認し、実行中であれば終了させてください。" -#: port/win32_shmem.c:339 +#: port/win32_shmem.c:347 #, c-format msgid "Failed system call was DuplicateHandle." msgstr "失敗したシステムコールはMapViewOfFileExです。" -#: port/win32_shmem.c:357 +#: port/win32_shmem.c:365 #, c-format msgid "Failed system call was MapViewOfFileEx." msgstr "失敗したシステムコールはMapViewOfFileExです。" -#: postmaster/autovacuum.c:406 +#: postmaster/autovacuum.c:404 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "自動VACUUM起動プロセスを fork できませんでした: %m" -#: postmaster/autovacuum.c:442 +#: postmaster/autovacuum.c:752 #, c-format -msgid "autovacuum launcher started" -msgstr "自動VACUUM起動プロセス" - -#: postmaster/autovacuum.c:839 -#, c-format -msgid "autovacuum launcher shutting down" -msgstr "自動VACUUM起動プロセスを停止しています" +msgid "autovacuum worker took too long to start; canceled" +msgstr "自動VACUUMワーカーの起動に時間がかかりすぎています; キャンセルしました" -#: postmaster/autovacuum.c:1477 +#: postmaster/autovacuum.c:1481 #, c-format msgid "could not fork autovacuum worker process: %m" msgstr "自動VACUUMワーカープロセスをforkできませんでした: %m" -#: postmaster/autovacuum.c:1686 -#, c-format -msgid "autovacuum: processing database \"%s\"" -msgstr "自動VACUUM: データベース\"%s\"の処理中です" - #: postmaster/autovacuum.c:2260 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "自動VACUUM: 孤立した一時テーブル\"%s.%s.%s\"を削除します" -#: postmaster/autovacuum.c:2489 +#: postmaster/autovacuum.c:2485 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "テーブル\"%s.%s.%s\"に対する自動VACUUM" -#: postmaster/autovacuum.c:2492 +#: postmaster/autovacuum.c:2488 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "テーブル\"%s.%s.%s\"に対する自動ANALYZE" -#: postmaster/autovacuum.c:2685 +#: postmaster/autovacuum.c:2681 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "リレーション\"%s.%s.%s\"の作業エントリを処理しています" -#: postmaster/autovacuum.c:3289 +#: postmaster/autovacuum.c:3292 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "誤設定のため自動VACUUMが起動できません" -#: postmaster/autovacuum.c:3290 +#: postmaster/autovacuum.c:3293 #, c-format msgid "Enable the \"track_counts\" option." msgstr "\"track_counts\"オプションを有効にしてください。" -#: postmaster/bgworker.c:394 postmaster/bgworker.c:834 -#, c-format -msgid "registering background worker \"%s\"" -msgstr "バックグラウンドワーカ\"%s\"を登録しています" - -#: postmaster/bgworker.c:426 +#: postmaster/bgworker.c:256 #, c-format -msgid "unregistering background worker \"%s\"" -msgstr "バックグラウンドワーカ\"%s\"の登録を解除しています" +msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" +msgstr "バックグラウンドワーカー状態の矛盾 (max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:591 +#: postmaster/bgworker.c:666 #, c-format -msgid "background worker \"%s\": must attach to shared memory in order to request a database connection" -msgstr "バックグラウンドワーカ\"\"%s: データベース接続を要求するためには共有メモリにアタッチしなければなりません" +msgid "background worker \"%s\": background worker without shared memory access are not supported" +msgstr "バックグラウンドワーカー\"%s\": 共有メモリアクセスを伴わないバックグラウンドワーカーはサポートされません" -#: postmaster/bgworker.c:600 +#: postmaster/bgworker.c:677 #, c-format msgid "background worker \"%s\": cannot request database access if starting at postmaster start" msgstr "バックグラウンドワーカ\"%s\": postmaster起動中に起動している場合にはデータベースアクセスを要求することはできません" -#: postmaster/bgworker.c:614 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "バックグラウンドワーカ\"%s\": 不正な再起動間隔" -#: postmaster/bgworker.c:629 +#: postmaster/bgworker.c:706 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "バックグラウンドワーカ\"%s\": パラレルワーカは再起動するように設定してはいけません" -#: postmaster/bgworker.c:653 +#: postmaster/bgworker.c:730 tcop/postgres.c:3201 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "管理者コマンドによりバックグラウンドワーカ\"%s\"を終了しています" -#: postmaster/bgworker.c:842 +#: postmaster/bgworker.c:887 #, c-format msgid "background worker \"%s\": must be registered in shared_preload_libraries" msgstr "バックグラウンドワーカ\"%s\": shared_preload_librariesに登録しなければなりません" -#: postmaster/bgworker.c:854 +#: postmaster/bgworker.c:899 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "バックグラウンドワーカ\"%s\": 動的バックグラウンドワーカのみが通知を要求できます" -#: postmaster/bgworker.c:869 +#: postmaster/bgworker.c:914 #, c-format msgid "too many background workers" msgstr "バックグラウンドワーカが多すぎます" -#: postmaster/bgworker.c:870 +#: postmaster/bgworker.c:915 #, c-format msgid "Up to %d background worker can be registered with the current settings." msgid_plural "Up to %d background workers can be registered with the current settings." msgstr[0] "現在の設定では最大%dのバックグラウンドワーカを登録することができます。" -msgstr[1] "現在の設定では最大%dのバックグラウンドワーカを登録することができます。" -#: postmaster/bgworker.c:874 +#: postmaster/bgworker.c:919 #, c-format msgid "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "設定パラメータ\"max_worker_processes\"を増やすことを検討してください" -#: postmaster/checkpointer.c:418 +#: postmaster/checkpointer.c:432 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" msgstr[0] "チェックポイントの発生周期が短すぎます(%d秒間隔)" -msgstr[1] "チェックポイントの発生周期が短すぎます(%d秒間隔)" -#: postmaster/checkpointer.c:422 +#: postmaster/checkpointer.c:436 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "設定パラメータ\"max_wal_size\"を増やすことを検討してください" -#: postmaster/checkpointer.c:1032 +#: postmaster/checkpointer.c:1060 #, c-format msgid "checkpoint request failed" msgstr "チェックポイント要求が失敗しました" -#: postmaster/checkpointer.c:1033 +#: postmaster/checkpointer.c:1061 #, c-format msgid "Consult recent messages in the server log for details." msgstr "詳細はサーバログの最近のメッセージを調査してください" -#: postmaster/checkpointer.c:1217 -#, c-format -msgid "compacted fsync request queue from %d entries to %d entries" -msgstr "ぎっしり詰まった fsync リクエストのキューのうち %d から %d までのエントリ" - -#: postmaster/pgarch.c:156 -#, c-format -msgid "could not fork archiver: %m" -msgstr "アーカイバのforkに失敗しました: %m" - -#: postmaster/pgarch.c:434 +#: postmaster/pgarch.c:430 #, c-format -msgid "archive_mode enabled, yet archive_command is not set" -msgstr "archive_modeは有効ですが、archive_commandが設定されていません" +msgid "archive_mode enabled, yet archiving is not configured" +msgstr "archive_modeは有効ですが、archive_commandがまだ設定されていません" -#: postmaster/pgarch.c:456 +#: postmaster/pgarch.c:452 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "孤立したアーカイブステータスファイル\"%s\"を削除しました" -#: postmaster/pgarch.c:466 +#: postmaster/pgarch.c:462 #, c-format msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" msgstr "孤立したアーカイブステータスファイル\"%s\"の削除の失敗回数が上限を超えました、あとでリトライします" -#: postmaster/pgarch.c:502 +#: postmaster/pgarch.c:498 #, c-format msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" msgstr "先行書き込みログファイル\"%s\"のアーカイブ処理の失敗回数が超過しました、後で再度試します" -#: postmaster/pgarch.c:603 -#, c-format -msgid "archive command failed with exit code %d" -msgstr "アーカイブコマンドがリターンコード %dで失敗しました" - -#: postmaster/pgarch.c:605 postmaster/pgarch.c:615 postmaster/pgarch.c:621 postmaster/pgarch.c:630 -#, c-format -msgid "The failed archive command was: %s" -msgstr "失敗したアーカイブコマンドは次のとおりです: %s" - -#: postmaster/pgarch.c:612 -#, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "アーカイブコマンドが例外0x%Xで終了しました" - -#: postmaster/pgarch.c:614 postmaster/postmaster.c:3744 -#, c-format -msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." -msgstr "16進値の説明についてはC インクルードファイル\"ntstatus.h\"を参照してください。" - -#: postmaster/pgarch.c:619 -#, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "アーカイブコマンドはシグナル%dにより終了しました: %s" - -#: postmaster/pgarch.c:628 -#, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "アーカイブコマンドは不明のステータス%dで終了しました" - -#: postmaster/pgstat.c:419 -#, c-format -msgid "could not resolve \"localhost\": %s" -msgstr "\"localhost\"を解決できませんでした: %s" - -#: postmaster/pgstat.c:442 -#, c-format -msgid "trying another address for the statistics collector" -msgstr "統計情報コレクタ用の別のアドレスを試みています" - -#: postmaster/pgstat.c:451 -#, c-format -msgid "could not create socket for statistics collector: %m" -msgstr "統計情報コレクタ用のソケットを作成できませんでした: %m" - -#: postmaster/pgstat.c:463 -#, c-format -msgid "could not bind socket for statistics collector: %m" -msgstr "統計情報コレクタのソケットをバインドできませんでした: %m" - -#: postmaster/pgstat.c:474 -#, c-format -msgid "could not get address of socket for statistics collector: %m" -msgstr "統計情報コレクタのソケットからアドレスを入手できませんでした: %m" - -#: postmaster/pgstat.c:490 -#, c-format -msgid "could not connect socket for statistics collector: %m" -msgstr "統計情報コレクタのソケットに接続できませんでした: %m" - -#: postmaster/pgstat.c:511 -#, c-format -msgid "could not send test message on socket for statistics collector: %m" -msgstr "統計情報コレクタのソケットに試験メッセージを送信できませんでした: %m" - -#: postmaster/pgstat.c:537 -#, c-format -msgid "select() failed in statistics collector: %m" -msgstr "統計情報コレクタでselect()が失敗しました: %m" - -#: postmaster/pgstat.c:552 -#, c-format -msgid "test message did not get through on socket for statistics collector" -msgstr "統計情報コレクタのソケットから試験メッセージを入手できませんでした" - -#: postmaster/pgstat.c:567 -#, c-format -msgid "could not receive test message on socket for statistics collector: %m" -msgstr "統計情報コレクタのソケットから試験メッセージを受信できませんでした: %m" - -#: postmaster/pgstat.c:577 -#, c-format -msgid "incorrect test message transmission on socket for statistics collector" -msgstr "統計情報コレクタのソケットでの試験メッセージの送信が不正です" - -#: postmaster/pgstat.c:600 -#, c-format -msgid "could not set statistics collector socket to nonblocking mode: %m" -msgstr "統計情報コレクタのソケットを非ブロッキングモードに設定できませんでした: %m" - -#: postmaster/pgstat.c:642 -#, c-format -msgid "disabling statistics collector for lack of working socket" -msgstr "作業用ソケットの欠落のため統計情報コレクタを無効にしています" - -#: postmaster/pgstat.c:789 -#, c-format -msgid "could not fork statistics collector: %m" -msgstr "統計情報コレクタをforkできませんでした: %m" - -#: postmaster/pgstat.c:1376 -#, c-format -msgid "unrecognized reset target: \"%s\"" -msgstr "認識できないリセットターゲット: \"%s\"" - -#: postmaster/pgstat.c:1377 -#, c-format -msgid "Target must be \"archiver\" or \"bgwriter\"." -msgstr "対象は\"archiver\"または\"bgwriter\"でなければなりません" - -#: postmaster/pgstat.c:4568 -#, c-format -msgid "could not read statistics message: %m" -msgstr "統計情報メッセージを読み取れませんでした: %m" - -#: postmaster/pgstat.c:4886 postmaster/pgstat.c:5049 -#, c-format -msgid "could not open temporary statistics file \"%s\": %m" -msgstr "一時統計情報ファイル\"%s\"をオープンできませんでした: %m" - -#: postmaster/pgstat.c:4959 postmaster/pgstat.c:5094 -#, c-format -msgid "could not write temporary statistics file \"%s\": %m" -msgstr "一時統計情報ファイル\"%s\"に書き込みできませんでした: %m" - -#: postmaster/pgstat.c:4968 postmaster/pgstat.c:5103 -#, c-format -msgid "could not close temporary statistics file \"%s\": %m" -msgstr "一時統計情報ファイル\"%s\"をクローズできませんでした: %m" - -#: postmaster/pgstat.c:4976 postmaster/pgstat.c:5111 -#, c-format -msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" -msgstr "一時統計情報ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" - -#: postmaster/pgstat.c:5208 postmaster/pgstat.c:5425 postmaster/pgstat.c:5579 -#, c-format -msgid "could not open statistics file \"%s\": %m" -msgstr "統計情報ファイル\"%s\"をオープンできませんでした: %m" - -#: postmaster/pgstat.c:5220 postmaster/pgstat.c:5230 postmaster/pgstat.c:5251 postmaster/pgstat.c:5262 postmaster/pgstat.c:5284 postmaster/pgstat.c:5299 postmaster/pgstat.c:5362 postmaster/pgstat.c:5437 postmaster/pgstat.c:5457 postmaster/pgstat.c:5475 postmaster/pgstat.c:5491 postmaster/pgstat.c:5509 postmaster/pgstat.c:5525 postmaster/pgstat.c:5591 postmaster/pgstat.c:5603 postmaster/pgstat.c:5615 postmaster/pgstat.c:5626 postmaster/pgstat.c:5651 -#: postmaster/pgstat.c:5673 +#: postmaster/pgarch.c:810 #, c-format -msgid "corrupted statistics file \"%s\"" -msgstr "統計情報ファイル\"%s\"が破損しています" +msgid "restarting archiver process because value of \"archive_library\" was changed" +msgstr "\"archive_library\"の値が変更されたためアーカイバプロセスを再起動します" -#: postmaster/pgstat.c:5802 +#: postmaster/pgarch.c:844 #, c-format -msgid "using stale statistics instead of current ones because stats collector is not responding" -msgstr "統計情報コレクタが応答しないため、最新の統計値の替わりに古い値を使用します" +msgid "archive modules have to declare the _PG_archive_module_init symbol" +msgstr "アーカイブモジュールはシンボル_PG_archive_module_initを定義しなくてはなりません" -#: postmaster/pgstat.c:6132 +#: postmaster/pgarch.c:850 #, c-format -msgid "database hash table corrupted during cleanup --- abort" -msgstr "整理処理においてデータベースハッシュテーブルが破損しました --- 中断します" +msgid "archive modules must register an archive callback" +msgstr "アーカイブモジュールはアーカイブコールバックを登録しなくてはなりません" -#: postmaster/postmaster.c:736 +#: postmaster/postmaster.c:744 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: -fオプションに対する不正な引数: \"%s\"\n" -#: postmaster/postmaster.c:822 +#: postmaster/postmaster.c:823 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: -tオプションに対する不正な引数: \"%s\"\n" -#: postmaster/postmaster.c:873 +#: postmaster/postmaster.c:874 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: 不正な引数: \"%s\"\n" -#: postmaster/postmaster.c:915 +#: postmaster/postmaster.c:932 #, c-format msgid "%s: superuser_reserved_connections (%d) must be less than max_connections (%d)\n" msgstr "%s: superuser_reserved_connections (%d) は max_connections (%d) より小さくなければなりません\n" -#: postmaster/postmaster.c:922 +#: postmaster/postmaster.c:939 #, c-format msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" msgstr "wal_levelが\"minimal\"の時はWALアーカイブは有効にできません" -#: postmaster/postmaster.c:925 +#: postmaster/postmaster.c:942 #, c-format msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" msgstr "WALストリーミング(max_wal_senders > 0)を行うには wal_levelを\"replica\"または\"logical\"にする必要があります" -#: postmaster/postmaster.c:933 +#: postmaster/postmaster.c:950 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: データトークンテーブルが不正です、修復してください\n" -#: postmaster/postmaster.c:1050 +#: postmaster/postmaster.c:1098 #, c-format msgid "could not create I/O completion port for child queue" msgstr "子キュー向けのI/O終了ポートを作成できませんでした" -#: postmaster/postmaster.c:1115 +#: postmaster/postmaster.c:1163 #, c-format msgid "ending log output to stderr" msgstr "標準エラー出力へのログ出力を終了しています" -#: postmaster/postmaster.c:1116 +#: postmaster/postmaster.c:1164 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "この後のログ出力はログ配送先\"%s\"に出力されます。" -#: postmaster/postmaster.c:1127 +#: postmaster/postmaster.c:1175 #, c-format msgid "starting %s" msgstr "%s を起動しています" -#: postmaster/postmaster.c:1156 postmaster/postmaster.c:1254 utils/init/miscinit.c:1599 +#: postmaster/postmaster.c:1204 postmaster/postmaster.c:1303 utils/init/miscinit.c:1648 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "パラメータ\"%s\"のリスト構文が不正です" -#: postmaster/postmaster.c:1187 +#: postmaster/postmaster.c:1235 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "\"%s\"に関する監視用ソケットを作成できませんでした" -#: postmaster/postmaster.c:1193 +#: postmaster/postmaster.c:1241 #, c-format msgid "could not create any TCP/IP sockets" msgstr "TCP/IPソケットを作成できませんでした" -#: postmaster/postmaster.c:1276 +#: postmaster/postmaster.c:1273 +#, c-format +msgid "DNSServiceRegister() failed: error code %ld" +msgstr "DNSServiceRegister()が失敗しました: エラーコード %ld" + +#: postmaster/postmaster.c:1325 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "ディレクトリ\"%s\"においてUnixドメインソケットを作成できませんでした" -#: postmaster/postmaster.c:1282 +#: postmaster/postmaster.c:1331 #, c-format msgid "could not create any Unix-domain sockets" msgstr "Unixドメインソケットを作成できませんでした" -#: postmaster/postmaster.c:1294 +#: postmaster/postmaster.c:1343 #, c-format msgid "no socket created for listening" msgstr "監視用に作成するソケットはありません" -#: postmaster/postmaster.c:1325 +#: postmaster/postmaster.c:1374 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %s\n" msgstr "%s: 外部PIDファイル\"%s\"の権限を変更できませんでした: %s\n" -#: postmaster/postmaster.c:1329 +#: postmaster/postmaster.c:1378 #, c-format msgid "%s: could not write external PID file \"%s\": %s\n" msgstr "%s: 外部PIDファイル\"%s\"に書き出せませんでした: %s\n" -#: postmaster/postmaster.c:1362 utils/init/postinit.c:215 +#: postmaster/postmaster.c:1405 utils/init/postinit.c:220 #, c-format msgid "could not load pg_hba.conf" msgstr "pg_hba.conf の読み込みができませんでした" -#: postmaster/postmaster.c:1388 +#: postmaster/postmaster.c:1431 #, c-format msgid "postmaster became multithreaded during startup" msgstr "postmasterは起動値処理中はマルチスレッドで動作します" -#: postmaster/postmaster.c:1389 +#: postmaster/postmaster.c:1432 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "LC_ALL環境変数を使用可能なロケールに設定してください。" -#: postmaster/postmaster.c:1490 +#: postmaster/postmaster.c:1533 +#, c-format +msgid "%s: could not locate my own executable path" +msgstr "%s: 自身の実行ファイルのパスが特定できません" + +#: postmaster/postmaster.c:1540 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: 一致するpostgres実行ファイルがありませんでした" -#: postmaster/postmaster.c:1513 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1563 utils/misc/tzparser.c:340 #, c-format msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." msgstr "これは、PostgreSQLのインストールが不完全であるかまたは、ファイル\"%s\"が本来の場所からなくなってしまったことを示しています。" -#: postmaster/postmaster.c:1540 +#: postmaster/postmaster.c:1590 #, c-format msgid "" "%s: could not find the database system\n" @@ -17193,869 +18406,1044 @@ msgstr "" "ディレクトリ\"%s\"にあるものと想定していましたが、\n" "ファイル\"%s\"をオープンできませんでした: %s\n" -#: postmaster/postmaster.c:1717 +#: postmaster/postmaster.c:1767 #, c-format msgid "select() failed in postmaster: %m" msgstr "postmasterでselect()が失敗しました: %m" -#: postmaster/postmaster.c:1872 +#: postmaster/postmaster.c:1898 +#, c-format +msgid "issuing SIGKILL to recalcitrant children" +msgstr "手に負えない子プロセスにSIGKILLを送出します" + +#: postmaster/postmaster.c:1919 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "データディレクトリのロックファイルが不正なため、即時シャットダウンを実行中です" -#: postmaster/postmaster.c:1975 postmaster/postmaster.c:2006 +#: postmaster/postmaster.c:2022 postmaster/postmaster.c:2050 #, c-format msgid "incomplete startup packet" msgstr "開始パケットが不完全です" -#: postmaster/postmaster.c:1987 +#: postmaster/postmaster.c:2034 #, c-format msgid "invalid length of startup packet" msgstr "不正な開始パケット長" -#: postmaster/postmaster.c:2045 +#: postmaster/postmaster.c:2089 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "SSLネゴシエーション応答の送信に失敗しました: %m" -#: postmaster/postmaster.c:2076 +#: postmaster/postmaster.c:2107 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "SSL要求の後に非暗号化データを受信しました" + +#: postmaster/postmaster.c:2108 postmaster/postmaster.c:2152 +#, c-format +msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." +msgstr "これはクライアントソフトウェアのバグであるか、man-in-the-middle攻撃の証左である可能性があります。" + +#: postmaster/postmaster.c:2133 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "GSSAPIネゴシエーション応答の送信に失敗しました: %m" -#: postmaster/postmaster.c:2106 +#: postmaster/postmaster.c:2151 +#, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "GSSAPI暗号化リクエストの後に非暗号化データを受信" + +#: postmaster/postmaster.c:2175 #, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "フロントエンドプロトコル%u.%uをサポートしていません: サーバは%u.0から %u.%uまでをサポートします" -#: postmaster/postmaster.c:2170 utils/misc/guc.c:6787 utils/misc/guc.c:6823 utils/misc/guc.c:6893 utils/misc/guc.c:8216 utils/misc/guc.c:11062 utils/misc/guc.c:11096 +#: postmaster/postmaster.c:2239 utils/misc/guc.c:7392 utils/misc/guc.c:7428 utils/misc/guc.c:7498 utils/misc/guc.c:8869 utils/misc/guc.c:11869 utils/misc/guc.c:11910 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "パラメータ\"%s\"の値が不正です: \"%s\"" -#: postmaster/postmaster.c:2173 +#: postmaster/postmaster.c:2242 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "有効な値: \"false\", 0, \"true\", 1, \"database\"。" -#: postmaster/postmaster.c:2218 +#: postmaster/postmaster.c:2287 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "開始パケットの配置が不正です: 最終バイトはターミネータであるはずです" -#: postmaster/postmaster.c:2256 +#: postmaster/postmaster.c:2304 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "開始パケットで指定されたPostgreSQLユーザ名は存在しません" -#: postmaster/postmaster.c:2320 +#: postmaster/postmaster.c:2368 #, c-format msgid "the database system is starting up" msgstr "データベースシステムは起動処理中です" -#: postmaster/postmaster.c:2325 +#: postmaster/postmaster.c:2374 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "データベースシステムはまだ接続を受け付けていません" + +#: postmaster/postmaster.c:2375 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "リカバリの一貫性はまだ確保されていません。" + +#: postmaster/postmaster.c:2379 +#, c-format +msgid "the database system is not accepting connections" +msgstr "データベースシステムは接続を受け付けていません" + +#: postmaster/postmaster.c:2380 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "ホットスタンバイモードは無効です。" + +#: postmaster/postmaster.c:2385 #, c-format msgid "the database system is shutting down" msgstr "データベースシステムはシャットダウンしています" -#: postmaster/postmaster.c:2330 +#: postmaster/postmaster.c:2390 #, c-format msgid "the database system is in recovery mode" msgstr "データベースシステムはリカバリモードです" -#: postmaster/postmaster.c:2335 storage/ipc/procarray.c:452 storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:359 +#: postmaster/postmaster.c:2395 storage/ipc/procarray.c:474 storage/ipc/sinvaladt.c:305 storage/lmgr/proc.c:359 #, c-format msgid "sorry, too many clients already" msgstr "現在クライアント数が多すぎます" -#: postmaster/postmaster.c:2425 +#: postmaster/postmaster.c:2482 #, c-format msgid "wrong key in cancel request for process %d" msgstr "プロセス%dに対するキャンセル要求においてキーが間違っています" -#: postmaster/postmaster.c:2437 +#: postmaster/postmaster.c:2494 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "キャンセル要求内のPID %dがどのプロセスにも一致しません" -#: postmaster/postmaster.c:2708 +#: postmaster/postmaster.c:2748 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "SIGHUPを受け取りました。設定ファイルをリロードしています" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2734 postmaster/postmaster.c:2738 +#: postmaster/postmaster.c:2772 postmaster/postmaster.c:2776 #, c-format msgid "%s was not reloaded" msgstr "%s は再読み込みされていません" -#: postmaster/postmaster.c:2748 +#: postmaster/postmaster.c:2786 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL設定は再読み込みされていません" -#: postmaster/postmaster.c:2804 +#: postmaster/postmaster.c:2842 #, c-format msgid "received smart shutdown request" msgstr "スマートシャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2850 +#: postmaster/postmaster.c:2883 #, c-format msgid "received fast shutdown request" msgstr "高速シャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2868 +#: postmaster/postmaster.c:2901 #, c-format msgid "aborting any active transactions" msgstr "活動中の全トランザクションをアボートしています" -#: postmaster/postmaster.c:2892 +#: postmaster/postmaster.c:2925 #, c-format msgid "received immediate shutdown request" msgstr "即時シャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2967 +#: postmaster/postmaster.c:3002 #, c-format msgid "shutdown at recovery target" msgstr "リカバリ目標でシャットダウンします" -#: postmaster/postmaster.c:2985 postmaster/postmaster.c:3021 +#: postmaster/postmaster.c:3020 postmaster/postmaster.c:3056 msgid "startup process" msgstr "起動プロセス" -#: postmaster/postmaster.c:2988 +#: postmaster/postmaster.c:3023 #, c-format msgid "aborting startup due to startup process failure" msgstr "起動プロセスの失敗のため起動を中断しています" -#: postmaster/postmaster.c:3063 +#: postmaster/postmaster.c:3096 #, c-format msgid "database system is ready to accept connections" msgstr "データベースシステムの接続受け付け準備が整いました" -#: postmaster/postmaster.c:3084 +#: postmaster/postmaster.c:3117 msgid "background writer process" msgstr "バックグランドライタプロセス" -#: postmaster/postmaster.c:3138 +#: postmaster/postmaster.c:3164 msgid "checkpointer process" msgstr "チェックポイント処理プロセス" -#: postmaster/postmaster.c:3154 +#: postmaster/postmaster.c:3180 msgid "WAL writer process" msgstr "WALライタプロセス" -#: postmaster/postmaster.c:3169 +#: postmaster/postmaster.c:3195 msgid "WAL receiver process" msgstr "WAL 受信プロセス" -#: postmaster/postmaster.c:3184 +#: postmaster/postmaster.c:3210 msgid "autovacuum launcher process" msgstr "自動VACUUM起動プロセス" -#: postmaster/postmaster.c:3199 +#: postmaster/postmaster.c:3228 msgid "archiver process" msgstr "アーカイバプロセス" -#: postmaster/postmaster.c:3215 -msgid "statistics collector process" -msgstr "統計情報収集プロセス" - -#: postmaster/postmaster.c:3229 +#: postmaster/postmaster.c:3241 msgid "system logger process" msgstr "システムログ取得プロセス" -#: postmaster/postmaster.c:3293 +#: postmaster/postmaster.c:3305 #, c-format msgid "background worker \"%s\"" msgstr "バックグラウンドワーカ\"%s\"" -#: postmaster/postmaster.c:3377 postmaster/postmaster.c:3397 postmaster/postmaster.c:3404 postmaster/postmaster.c:3422 +#: postmaster/postmaster.c:3384 postmaster/postmaster.c:3404 postmaster/postmaster.c:3411 postmaster/postmaster.c:3429 msgid "server process" msgstr "サーバプロセス" -#: postmaster/postmaster.c:3476 +#: postmaster/postmaster.c:3483 #, c-format msgid "terminating any other active server processes" msgstr "他の活動中のサーバプロセスを終了しています" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3731 +#: postmaster/postmaster.c:3720 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d)は終了コード%dで終了しました" -#: postmaster/postmaster.c:3733 postmaster/postmaster.c:3745 postmaster/postmaster.c:3755 postmaster/postmaster.c:3766 +#: postmaster/postmaster.c:3722 postmaster/postmaster.c:3734 postmaster/postmaster.c:3744 postmaster/postmaster.c:3755 #, c-format msgid "Failed process was running: %s" msgstr "失敗したプロセスが実行していました: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3742 +#: postmaster/postmaster.c:3731 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d)は例外%Xで終了しました" +#: postmaster/postmaster.c:3733 postmaster/shell_archive.c:132 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "16進値の説明についてはC インクルードファイル\"ntstatus.h\"を参照してください。" + #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3752 +#: postmaster/postmaster.c:3741 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d)はシグナル%dで終了しました: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3764 +#: postmaster/postmaster.c:3753 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d)は認識できないステータス%dで終了しました" -#: postmaster/postmaster.c:3972 +#: postmaster/postmaster.c:3953 #, c-format msgid "abnormal database system shutdown" msgstr "データベースシステムは異常にシャットダウンしました" -#: postmaster/postmaster.c:4012 +#: postmaster/postmaster.c:3979 +#, c-format +msgid "shutting down due to startup process failure" +msgstr "起動プロセスの失敗のためシャットダウンしています" + +#: postmaster/postmaster.c:3985 +#, c-format +msgid "shutting down because restart_after_crash is off" +msgstr "restart_after_crashがoffであるためシャットダウンします" + +#: postmaster/postmaster.c:3997 #, c-format msgid "all server processes terminated; reinitializing" msgstr "全てのサーバプロセスが終了しました: 再初期化しています" -#: postmaster/postmaster.c:4182 postmaster/postmaster.c:5588 postmaster/postmaster.c:5975 +#: postmaster/postmaster.c:4169 postmaster/postmaster.c:5505 postmaster/postmaster.c:5895 #, c-format msgid "could not generate random cancel key" msgstr "ランダムなキャンセルキーを生成できませんでした" -#: postmaster/postmaster.c:4236 +#: postmaster/postmaster.c:4231 #, c-format msgid "could not fork new process for connection: %m" msgstr "接続用の新しいプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:4278 +#: postmaster/postmaster.c:4273 msgid "could not fork new process for connection: " msgstr "接続用の新しいプロセスをforkできませんでした" -#: postmaster/postmaster.c:4387 +#: postmaster/postmaster.c:4379 #, c-format msgid "connection received: host=%s port=%s" msgstr "接続を受け付けました: ホスト=%s ポート番号=%s" -#: postmaster/postmaster.c:4392 +#: postmaster/postmaster.c:4384 #, c-format msgid "connection received: host=%s" msgstr "接続を受け付けました: ホスト=%s" -#: postmaster/postmaster.c:4662 +#: postmaster/postmaster.c:4621 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "サーバプロセス\"%s\"を実行できませんでした: %m" -#: postmaster/postmaster.c:4821 +#: postmaster/postmaster.c:4679 +#, c-format +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "バックエンドパラメータファイルのファイルマッピングを作成できませんでした: エラーコード%lu" + +#: postmaster/postmaster.c:4688 +#, c-format +msgid "could not map backend parameter memory: error code %lu" +msgstr "バックエンドパラメータのメモリをマップできませんでした: エラーコード %lu" + +#: postmaster/postmaster.c:4715 +#, c-format +msgid "subprocess command line too long" +msgstr "サブプロセスのコマンドラインが長すぎます" + +#: postmaster/postmaster.c:4733 +#, c-format +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "CreateProcess() の呼び出しが失敗しました: %m (エラーコード %lu)" + +#: postmaster/postmaster.c:4760 +#, c-format +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "バックエンドパラメータファイルのビューをアンマップできませんでした: エラーコード %lu" + +#: postmaster/postmaster.c:4764 +#, c-format +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "バックエンドパラメータファイルのハンドルをクローズできませんでした: エラーコード%lu" + +#: postmaster/postmaster.c:4786 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "共有メモリの確保のリトライ回数が多すぎるため中断します" -#: postmaster/postmaster.c:4822 +#: postmaster/postmaster.c:4787 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "これはASLRまたはアンチウイルスソフトウェアが原因である可能性があります。" -#: postmaster/postmaster.c:5028 +#: postmaster/postmaster.c:4968 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "SSL構成は子プロセスでは読み込めません" -#: postmaster/postmaster.c:5160 +#: postmaster/postmaster.c:5093 #, c-format msgid "Please report this to <%s>." msgstr "これを<%s>まで報告してください。" -#: postmaster/postmaster.c:5253 +#: postmaster/postmaster.c:5165 #, c-format -msgid "database system is ready to accept read only connections" +msgid "database system is ready to accept read-only connections" msgstr "データベースシステムはリードオンリー接続の受け付け準備ができました" -#: postmaster/postmaster.c:5516 +#: postmaster/postmaster.c:5429 #, c-format msgid "could not fork startup process: %m" msgstr "起動プロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5520 +#: postmaster/postmaster.c:5433 +#, c-format +msgid "could not fork archiver process: %m" +msgstr "アーカイバプロセスをforkできませんでした: %m" + +#: postmaster/postmaster.c:5437 #, c-format msgid "could not fork background writer process: %m" msgstr "バックグランドライタプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5524 +#: postmaster/postmaster.c:5441 #, c-format msgid "could not fork checkpointer process: %m" msgstr "チェックポイント処理プロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5528 +#: postmaster/postmaster.c:5445 #, c-format msgid "could not fork WAL writer process: %m" msgstr "WALライタプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5532 +#: postmaster/postmaster.c:5449 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "WAL 受信プロセスを fork できませんでした: %m" -#: postmaster/postmaster.c:5536 +#: postmaster/postmaster.c:5453 #, c-format msgid "could not fork process: %m" msgstr "プロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5733 postmaster/postmaster.c:5756 +#: postmaster/postmaster.c:5654 postmaster/postmaster.c:5677 #, c-format msgid "database connection requirement not indicated during registration" msgstr "登録時にデータベース接続の必要性が示されていません" -#: postmaster/postmaster.c:5740 postmaster/postmaster.c:5763 +#: postmaster/postmaster.c:5661 postmaster/postmaster.c:5684 #, c-format msgid "invalid processing mode in background worker" msgstr "バックグラウンドワーカ内の不正な処理モード" -#: postmaster/postmaster.c:5836 -#, c-format -msgid "starting background worker process \"%s\"" -msgstr "バックグラウンドワーカプロセス\"%s\"を起動しています" - -#: postmaster/postmaster.c:5848 +#: postmaster/postmaster.c:5769 #, c-format msgid "could not fork worker process: %m" msgstr "ワーカプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5961 +#: postmaster/postmaster.c:5881 #, c-format msgid "no slot available for new worker process" msgstr "新しいワーカプロセスに割り当てられるスロットがありません" -#: postmaster/postmaster.c:6296 +#: postmaster/postmaster.c:6212 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "バックエンドで使用するためにソケット%dを複製できませんでした: エラーコード %d" -#: postmaster/postmaster.c:6328 +#: postmaster/postmaster.c:6244 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "継承したソケットを作成できませんでした: エラーコード %d\n" -#: postmaster/postmaster.c:6357 +#: postmaster/postmaster.c:6273 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "バックエンド変数ファイル\"%s\"をオープンできませんでした: %s\n" -#: postmaster/postmaster.c:6364 +#: postmaster/postmaster.c:6280 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "バックエンド変数ファイル\"%s\"から読み取れませんでした: %s\n" -#: postmaster/postmaster.c:6373 +#: postmaster/postmaster.c:6289 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "ファイル\"%s\"を削除できませんでした: %s\n" -#: postmaster/postmaster.c:6390 +#: postmaster/postmaster.c:6306 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "バックエンド変数のビューをマップできませんでした: エラーコード %lu\n" -#: postmaster/postmaster.c:6399 +#: postmaster/postmaster.c:6315 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "バックエンド変数のビューをアンマップできませんでした: エラーコード %lu\n" -#: postmaster/postmaster.c:6406 +#: postmaster/postmaster.c:6322 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "バックエンドパラメータ変数のハンドルをクローズできませんでした: エラーコード%lu\n" -#: postmaster/postmaster.c:6584 +#: postmaster/postmaster.c:6496 #, c-format msgid "could not read exit code for process\n" msgstr "子プロセスの終了コードの読み込みができませんでした\n" -#: postmaster/postmaster.c:6589 +#: postmaster/postmaster.c:6501 #, c-format msgid "could not post child completion status\n" msgstr "個プロセスの終了コードを投稿できませんでした\n" -#: postmaster/syslogger.c:474 postmaster/syslogger.c:1153 +#: postmaster/shell_archive.c:121 #, c-format -msgid "could not read from logger pipe: %m" -msgstr "ロガーパイプから読み取れませんでした: %m" +msgid "archive command failed with exit code %d" +msgstr "アーカイブコマンドがリターンコード %dで失敗しました" + +#: postmaster/shell_archive.c:123 postmaster/shell_archive.c:133 postmaster/shell_archive.c:139 postmaster/shell_archive.c:148 +#, c-format +msgid "The failed archive command was: %s" +msgstr "失敗したアーカイブコマンドは次のとおりです: %s" + +#: postmaster/shell_archive.c:130 +#, c-format +msgid "archive command was terminated by exception 0x%X" +msgstr "アーカイブコマンドが例外0x%Xで終了しました" + +#: postmaster/shell_archive.c:137 +#, c-format +msgid "archive command was terminated by signal %d: %s" +msgstr "アーカイブコマンドはシグナル%dにより終了しました: %s" + +#: postmaster/shell_archive.c:146 +#, c-format +msgid "archive command exited with unrecognized status %d" +msgstr "アーカイブコマンドは不明のステータス%dで終了しました" -#: postmaster/syslogger.c:522 +#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 #, c-format -msgid "logger shutting down" -msgstr "ロガーを停止しています" +msgid "could not read from logger pipe: %m" +msgstr "ロガーパイプから読み取れませんでした: %m" -#: postmaster/syslogger.c:571 postmaster/syslogger.c:585 +#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 #, c-format msgid "could not create pipe for syslog: %m" msgstr "syslog用のパイプを作成できませんでした: %m" -#: postmaster/syslogger.c:636 +#: postmaster/syslogger.c:677 #, c-format msgid "could not fork system logger: %m" msgstr "システムロガーをforkできませんでした: %m" -#: postmaster/syslogger.c:672 +#: postmaster/syslogger.c:713 #, c-format msgid "redirecting log output to logging collector process" msgstr "ログ出力をログ収集プロセスにリダイレクトしています" -#: postmaster/syslogger.c:673 +#: postmaster/syslogger.c:714 #, c-format msgid "Future log output will appear in directory \"%s\"." msgstr "ここからのログ出力はディレクトリ\"%s\"に現れます。" -#: postmaster/syslogger.c:681 +#: postmaster/syslogger.c:722 #, c-format msgid "could not redirect stdout: %m" msgstr "標準出力にリダイレクトできませんでした: %m" -#: postmaster/syslogger.c:686 postmaster/syslogger.c:703 +#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 #, c-format msgid "could not redirect stderr: %m" msgstr "標準エラー出力にリダイレクトできませんでした: %m" -#: postmaster/syslogger.c:1108 +#: postmaster/syslogger.c:1177 #, c-format msgid "could not write to log file: %s\n" msgstr "ログファイルに書き出せませんでした: %s\n" -#: postmaster/syslogger.c:1225 +#: postmaster/syslogger.c:1295 #, c-format msgid "could not open log file \"%s\": %m" msgstr "ロックファイル\"%s\"をオープンできませんでした: %m" -#: postmaster/syslogger.c:1287 postmaster/syslogger.c:1337 +#: postmaster/syslogger.c:1385 #, c-format msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "自動ローテーションを無効にしています(再度有効にするにはSIGHUPを使用してください)" -#: regex/regc_pg_locale.c:262 +#: regex/regc_pg_locale.c:242 #, c-format msgid "could not determine which collation to use for regular expression" msgstr "正規表現で使用する照合規則を特定できませんでした" -#: regex/regc_pg_locale.c:269 +#: regex/regc_pg_locale.c:265 #, c-format msgid "nondeterministic collations are not supported for regular expressions" msgstr "非決定的照合順序は正規表現ではサポートされていません" -#: repl_gram.y:349 repl_gram.y:381 +#: repl_gram.y:303 repl_gram.y:335 #, c-format msgid "invalid timeline %u" msgstr "タイムライン%uは不正です" -#: repl_scanner.l:131 +#: repl_scanner.l:141 msgid "invalid streaming start location" msgstr "ストリーミングの開始位置が不正です" -#: repl_scanner.l:182 scan.l:717 +#: repl_scanner.l:197 scan.l:724 msgid "unterminated quoted string" msgstr "文字列の引用符が閉じていません" -#: replication/backup_manifest.c:231 +#: replication/backup_manifest.c:253 #, c-format msgid "expected end timeline %u but found timeline %u" msgstr "最終タイムライン%uを期待していましたがタイムライン%uが見つかりました" -#: replication/backup_manifest.c:248 +#: replication/backup_manifest.c:277 #, c-format msgid "expected start timeline %u but found timeline %u" msgstr "開始タイムライン%uを期待していましたがタイムライン%uが見つかりました" -#: replication/backup_manifest.c:275 +#: replication/backup_manifest.c:304 #, c-format -msgid "start timeline %u not found history of timeline %u" -msgstr "開始タイムライン%uからはタイムライン%uの履歴中にありません" +msgid "start timeline %u not found in history of timeline %u" +msgstr "開始タイムライン%uはタイムライン%uの履歴中にありません" -#: replication/backup_manifest.c:322 +#: replication/backup_manifest.c:355 #, c-format msgid "could not rewind temporary file" msgstr "一時ファイルを巻き戻しに失敗しました" -#: replication/backup_manifest.c:349 +#: replication/backup_manifest.c:374 #, c-format msgid "could not read from temporary file: %m" msgstr "一時ファイルから読み取りに失敗しました: %m" -#: replication/basebackup.c:546 +#: replication/basebackup.c:454 #, c-format msgid "could not find any WAL files" msgstr "WALファイルが全くありません" -#: replication/basebackup.c:561 replication/basebackup.c:577 replication/basebackup.c:586 +#: replication/basebackup.c:469 replication/basebackup.c:484 replication/basebackup.c:493 #, c-format msgid "could not find WAL file \"%s\"" msgstr "WALファイル\"%s\"がありませんでした" -#: replication/basebackup.c:629 replication/basebackup.c:659 +#: replication/basebackup.c:535 replication/basebackup.c:560 #, c-format msgid "unexpected WAL file size \"%s\"" msgstr "想定しないWALファイルのサイズ\"%s\"" -#: replication/basebackup.c:644 replication/basebackup.c:1754 +#: replication/basebackup.c:630 #, c-format -msgid "base backup could not send data, aborting backup" -msgstr "ベースバックアップがデータを送信できませんでした。バックアップを中止しています" +msgid "%lld total checksum verification failure" +msgid_plural "%lld total checksum verification failures" +msgstr[0] " 合計%lld個のデータチェックサム検証エラー" -#: replication/basebackup.c:722 -#, c-format -msgid "%lld total checksum verification failures" -msgstr " 合計で %lld 個のデータチェックサムエラー" - -#: replication/basebackup.c:726 +#: replication/basebackup.c:637 #, c-format msgid "checksum verification failure during base backup" msgstr "ベースバックアップ中にチェックサム確認が失敗しました" -#: replication/basebackup.c:779 replication/basebackup.c:788 replication/basebackup.c:797 replication/basebackup.c:806 replication/basebackup.c:815 replication/basebackup.c:826 replication/basebackup.c:843 replication/basebackup.c:852 replication/basebackup.c:864 replication/basebackup.c:888 +#: replication/basebackup.c:706 replication/basebackup.c:715 replication/basebackup.c:726 replication/basebackup.c:743 replication/basebackup.c:752 replication/basebackup.c:763 replication/basebackup.c:780 replication/basebackup.c:789 replication/basebackup.c:801 replication/basebackup.c:825 replication/basebackup.c:839 replication/basebackup.c:850 replication/basebackup.c:861 replication/basebackup.c:874 #, c-format msgid "duplicate option \"%s\"" msgstr "\"%s\"オプションは重複しています" -#: replication/basebackup.c:832 +#: replication/basebackup.c:734 +#, c-format +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "認識されないチェックポイントタイプ: \"%s\"" + +#: replication/basebackup.c:769 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%dはパラメータ\"%s\"の有効範囲を超えています(%d .. %d)" -#: replication/basebackup.c:877 +#: replication/basebackup.c:814 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "認識できない目録オプション: \"%s\"" -#: replication/basebackup.c:893 +#: replication/basebackup.c:830 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "認識できないチェックサムアルゴリズム: \"%s\"" -#: replication/basebackup.c:908 +#: replication/basebackup.c:865 +#, c-format +msgid "unrecognized compression algorithm \"%s\"" +msgstr "認識できない圧縮アルゴリズム: \"%s\"" + +#: replication/basebackup.c:881 +#, c-format +msgid "unrecognized base backup option: \"%s\"" +msgstr "認識できないベースバックアップオプション: \"%s\"" + +#: replication/basebackup.c:892 #, c-format msgid "manifest checksums require a backup manifest" msgstr "目録のチェックサムにはバックアップ目録が必要です" -#: replication/basebackup.c:1504 +#: replication/basebackup.c:901 +#, c-format +msgid "target detail cannot be used without target" +msgstr "ターゲット詳細はターゲットの指定なしでは指定できません" + +#: replication/basebackup.c:910 replication/basebackup_target.c:218 +#, c-format +msgid "target '%s' does not accept a target detail" +msgstr "ターゲット'%s'はターゲット詳細を受け付けません" + +#: replication/basebackup.c:921 +#, c-format +msgid "compression detail requires compression" +msgstr "圧縮詳細は圧縮指定を必要とします" + +#: replication/basebackup.c:934 +#, c-format +msgid "invalid compression specification: %s" +msgstr "不正な圧縮指定: %s" + +#: replication/basebackup.c:1424 #, c-format msgid "skipping special file \"%s\"" msgstr "スペシャルファイル\"%s\"をスキップしています" -#: replication/basebackup.c:1623 +#: replication/basebackup.c:1543 #, c-format msgid "invalid segment number %d in file \"%s\"" msgstr "ファイル\"%2$s\"セグメント番号%1$dは不正です" -#: replication/basebackup.c:1661 +#: replication/basebackup.c:1583 #, c-format -msgid "could not verify checksum in file \"%s\", block %d: read buffer size %d and page size %d differ" -msgstr "ファイル\"%s\"、ブロック%d でチェックサム検証に失敗しました: 読み込みバッファサイズ%dとページサイズ%dが異なっています" +msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" +msgstr "ファイル\"%s\"、ブロック%uでチェックサム検証に失敗しました: 読み込みバッファサイズ%dとページサイズ%dが異なっています" -#: replication/basebackup.c:1734 +#: replication/basebackup.c:1657 #, c-format -msgid "checksum verification failed in file \"%s\", block %d: calculated %X but expected %X" -msgstr "ファイル\"%s\"のブロック%dでチェックサム検証が失敗しました: 計算されたチェックサムは%Xですが想定は%Xです" +msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" +msgstr "ファイル\"%s\"のブロック%uでチェックサム検証が失敗しました: 計算されたチェックサムは%Xですが想定は%Xです" -#: replication/basebackup.c:1741 +#: replication/basebackup.c:1664 #, c-format msgid "further checksum verification failures in file \"%s\" will not be reported" msgstr "ファイル\"%s\"における以降のチェックサムエラーは報告されません" -#: replication/basebackup.c:1797 +#: replication/basebackup.c:1711 #, c-format msgid "file \"%s\" has a total of %d checksum verification failure" msgid_plural "file \"%s\" has a total of %d checksum verification failures" msgstr[0] "ファイル\"%s\"では合計%d個のチェックサムエラーが発生しました" -msgstr[1] "ファイル\"%s\"では合計%d個のチェックサムエラーが発生しました" -#: replication/basebackup.c:1833 +#: replication/basebackup.c:1757 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "ファイル名がtarフォーマットに対して長すぎます: \"%s\"" -#: replication/basebackup.c:1838 +#: replication/basebackup.c:1762 #, c-format msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" msgstr "シンボリックリンクのリンク先tarのフォーマットにとって長すぎます: ファイル名 \"%s\", リンク先 \"%s\"" -#: replication/libpqwalreceiver/libpqwalreceiver.c:227 +#: replication/basebackup_gzip.c:67 +#, c-format +msgid "gzip compression is not supported by this build" +msgstr "このビルドではgzip圧縮はサポートされていません" + +#: replication/basebackup_gzip.c:147 +#, c-format +msgid "could not initialize compression library" +msgstr "圧縮ライブラリを初期化できませんでした" + +#: replication/basebackup_lz4.c:67 +#, c-format +msgid "lz4 compression is not supported by this build" +msgstr "このビルドではlz4圧縮はサポートされていません" + +#: replication/basebackup_server.c:75 +#, c-format +msgid "must be superuser or a role with privileges of the pg_write_server_files role to create server backup" +msgstr "サーバーバックアップを作成するにはスーパーユーザーであるか、または pg_write_server_filesロールの権限を持つロールである必要があります" + +#: replication/basebackup_server.c:88 +#, c-format +msgid "relative path not allowed for server backup" +msgstr "サーバーバックアップでは相対パスは指定できません" + +#: replication/basebackup_server.c:113 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "ディレクトリ\"%s\"は存在しますが、空ではありません" + +#: replication/basebackup_server.c:121 utils/init/postinit.c:1051 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"にアクセスできませんでした: %m" + +#: replication/basebackup_server.c:173 replication/basebackup_server.c:180 replication/basebackup_server.c:266 replication/basebackup_server.c:273 storage/smgr/md.c:456 storage/smgr/md.c:463 storage/smgr/md.c:754 +#, c-format +msgid "Check free disk space." +msgstr "ディスクの空き容量をチェックしてください。" + +#: replication/basebackup_server.c:177 replication/basebackup_server.c:270 +#, c-format +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "ファイル\"%1$s\"に書き込みできませんでした: オフセット%4$uで%3$dバイト中%2$dバイト分のみを書き出しました" + +#: replication/basebackup_target.c:146 +#, c-format +msgid "unrecognized target: \"%s\"" +msgstr "認識できないターゲット: \"%s\"" + +#: replication/basebackup_target.c:237 +#, c-format +msgid "target '%s' requires a target detail" +msgstr "ターゲット'%s'にはターゲット詳細が必要です" + +#: replication/basebackup_zstd.c:66 +#, c-format +msgid "zstd compression is not supported by this build" +msgstr "このビルドではzstd圧縮はサポートされていません" + +#: replication/basebackup_zstd.c:120 +#, c-format +msgid "could not set compression worker count to %d: %s" +msgstr "圧縮ワーカー数を%dに設定できませんでした: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:240 #, c-format msgid "could not clear search path: %s" msgstr "search_pathを消去できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:251 +#: replication/libpqwalreceiver/libpqwalreceiver.c:269 #, c-format msgid "invalid connection string syntax: %s" msgstr "不正な接続文字列の構文: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:275 +#: replication/libpqwalreceiver/libpqwalreceiver.c:295 #, c-format msgid "could not parse connection string: %s" msgstr "接続文字列をパースできませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:347 +#: replication/libpqwalreceiver/libpqwalreceiver.c:368 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "プライマリサーバからデータベースシステムの識別子とタイムライン ID を受信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:358 replication/libpqwalreceiver/libpqwalreceiver.c:580 +#: replication/libpqwalreceiver/libpqwalreceiver.c:380 replication/libpqwalreceiver/libpqwalreceiver.c:618 #, c-format msgid "invalid response from primary server" msgstr "プライマリサーバからの応答が不正です" -#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#: replication/libpqwalreceiver/libpqwalreceiver.c:381 #, c-format msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." msgstr "システムを識別できませんでした: 受信したのは%d行で%d列、期待していたのは%d行で%d以上の列でした。" -#: replication/libpqwalreceiver/libpqwalreceiver.c:432 replication/libpqwalreceiver/libpqwalreceiver.c:438 replication/libpqwalreceiver/libpqwalreceiver.c:467 +#: replication/libpqwalreceiver/libpqwalreceiver.c:461 replication/libpqwalreceiver/libpqwalreceiver.c:468 replication/libpqwalreceiver/libpqwalreceiver.c:498 #, c-format msgid "could not start WAL streaming: %s" msgstr "WAL ストリーミングを開始できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:490 +#: replication/libpqwalreceiver/libpqwalreceiver.c:522 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "プライマリにストリーミングの終了メッセージを送信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:512 +#: replication/libpqwalreceiver/libpqwalreceiver.c:545 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "ストリーミングの終了後の想定外の結果セット" -#: replication/libpqwalreceiver/libpqwalreceiver.c:526 +#: replication/libpqwalreceiver/libpqwalreceiver.c:560 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "ストリーミングCOPY終了中のエラー: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:535 +#: replication/libpqwalreceiver/libpqwalreceiver.c:570 #, c-format msgid "error reading result of streaming command: %s" msgstr "ストリーミングコマンドの結果読み取り中のエラー: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:543 replication/libpqwalreceiver/libpqwalreceiver.c:777 +#: replication/libpqwalreceiver/libpqwalreceiver.c:579 replication/libpqwalreceiver/libpqwalreceiver.c:817 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "CommandComplete後の想定外の結果: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:569 +#: replication/libpqwalreceiver/libpqwalreceiver.c:606 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "プライマリサーバからタイムライン履歴ファイルを受信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:581 +#: replication/libpqwalreceiver/libpqwalreceiver.c:619 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "2個のフィールドを持つ1個のタプルを期待していましたが、%2$d 個のフィールドを持つ %1$d 個のタプルを受信しました。" -#: replication/libpqwalreceiver/libpqwalreceiver.c:741 replication/libpqwalreceiver/libpqwalreceiver.c:792 replication/libpqwalreceiver/libpqwalreceiver.c:798 +#: replication/libpqwalreceiver/libpqwalreceiver.c:780 replication/libpqwalreceiver/libpqwalreceiver.c:833 replication/libpqwalreceiver/libpqwalreceiver.c:840 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "WAL ストリームからデータを受信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:817 +#: replication/libpqwalreceiver/libpqwalreceiver.c:860 #, c-format msgid "could not send data to WAL stream: %s" msgstr "WAL ストリームにデータを送信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:870 +#: replication/libpqwalreceiver/libpqwalreceiver.c:952 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "レプリケーションスロット\"%s\"を作成できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:915 +#: replication/libpqwalreceiver/libpqwalreceiver.c:998 #, c-format msgid "invalid query response" msgstr "不正な問い合わせ応答" -#: replication/libpqwalreceiver/libpqwalreceiver.c:916 +#: replication/libpqwalreceiver/libpqwalreceiver.c:999 #, c-format msgid "Expected %d fields, got %d fields." msgstr "%d個の列を期待していましたが、%d列を受信しました。" -#: replication/libpqwalreceiver/libpqwalreceiver.c:985 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1069 #, c-format msgid "the query interface requires a database connection" msgstr "クエリインタフェースの動作にはデータベースコネクションが必要です" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1016 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1100 msgid "empty query" msgstr "空の問い合わせ" -#: replication/logical/launcher.c:299 -#, c-format -msgid "starting logical replication worker for subscription \"%s\"" -msgstr "サブスクリプション\"%s\"に対応する論理レプリケーションワーカを起動します" +#: replication/libpqwalreceiver/libpqwalreceiver.c:1106 +msgid "unexpected pipeline mode" +msgstr "想定されていないパイプラインモード" -#: replication/logical/launcher.c:306 +#: replication/logical/launcher.c:286 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "max_replication_slots = 0 の時は論理レプリケーションワーカは起動できません" -#: replication/logical/launcher.c:386 +#: replication/logical/launcher.c:366 #, c-format msgid "out of logical replication worker slots" msgstr "論理レプリケーションワーカスロットは全て使用中です" -#: replication/logical/launcher.c:387 +#: replication/logical/launcher.c:367 #, c-format msgid "You might need to increase max_logical_replication_workers." msgstr "max_logical_replication_workersを増やす必要があるかもしれません。" -#: replication/logical/launcher.c:442 +#: replication/logical/launcher.c:423 #, c-format msgid "out of background worker slots" msgstr "バックグラウンドワーカスロットが足りません" -#: replication/logical/launcher.c:443 +#: replication/logical/launcher.c:424 #, c-format msgid "You might need to increase max_worker_processes." msgstr "max_worker_processesを増やす必要があるかもしれません" -#: replication/logical/launcher.c:642 +#: replication/logical/launcher.c:578 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "論理レプリケーションワーカスロット%dが空いていないため接続できません" -#: replication/logical/launcher.c:651 +#: replication/logical/launcher.c:587 #, c-format msgid "logical replication worker slot %d is already used by another worker, cannot attach" msgstr "論理レプリケーションワーカスロット%dが既に他のワーカに使用されているため接続できません" -#: replication/logical/launcher.c:955 -#, c-format -msgid "logical replication launcher started" -msgstr "論理レプリケーションランチャが起動しました" - -#: replication/logical/logical.c:105 +#: replication/logical/logical.c:115 #, c-format msgid "logical decoding requires wal_level >= logical" msgstr "論理デコードを行うためには wal_level >= logical である必要があります" -#: replication/logical/logical.c:110 +#: replication/logical/logical.c:120 #, c-format msgid "logical decoding requires a database connection" msgstr "論理デコードを行うにはデータベース接続が必要です" -#: replication/logical/logical.c:128 +#: replication/logical/logical.c:138 #, c-format msgid "logical decoding cannot be used while in recovery" msgstr "リカバリ中は論理デコードは使用できません" -#: replication/logical/logical.c:311 replication/logical/logical.c:457 +#: replication/logical/logical.c:348 replication/logical/logical.c:502 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "物理レプリケーションスロットを論理デコードに使用するとはできません" -#: replication/logical/logical.c:316 replication/logical/logical.c:462 +#: replication/logical/logical.c:353 replication/logical/logical.c:507 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "レプリケーションスロット\"%s\"はこのデータベースでは作成されていません" -#: replication/logical/logical.c:323 +#: replication/logical/logical.c:360 #, c-format msgid "cannot create logical replication slot in transaction that has performed writes" msgstr "論理レプリケーションスロットは書き込みを行ったトランザクションの中で生成することはできません" -#: replication/logical/logical.c:502 +#: replication/logical/logical.c:568 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "スロット\"%s\"の論理デコードを開始します" -#: replication/logical/logical.c:504 +#: replication/logical/logical.c:570 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "%3$X/%4$XからWALを読み取って、%1$X/%2$X以降にコミットされるトランザクションをストリーミングします。" -#: replication/logical/logical.c:651 +#: replication/logical/logical.c:718 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "スロット\"%s\", 出力プラグイン\"%s\", %sコールバックの処理中, 関連LSN %X/%X" -#: replication/logical/logical.c:658 +#: replication/logical/logical.c:724 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" -msgstr "スロット\"%s\", 出力プラグイン\"%s\", %sコールバックの処理中" - -#: replication/logical/logical.c:965 -#, c-format -msgid "logical streaming requires a stream_start_cb callback" -msgstr "論理ストリーミングを行うにはstream_start_cbコールバックが必要です" - -#: replication/logical/logical.c:1011 -#, c-format -msgid "logical streaming requires a stream_stop_cb callback" -msgstr "論理ストリーミングを行うにはstream_stop_cbコールバックが必要です" - -#: replication/logical/logical.c:1050 -#, c-format -msgid "logical streaming requires a stream_abort_cb callback" -msgstr "論理ストリーミングを行うにはstream_abort_cbコールバックが必要です" +msgstr "スロット\"%s\", 出力プラグイン\"%s\", %sコールバックの処理中" -#: replication/logical/logical.c:1089 +#: replication/logical/logical.c:890 replication/logical/logical.c:934 replication/logical/logical.c:978 replication/logical/logical.c:1023 #, c-format -msgid "logical streaming requires a stream_commit_cb callback" -msgstr "論理ストリーミングにはstream_commit_cbコールバックが必要です" +msgid "logical replication at prepare time requires a %s callback" +msgstr "プリペア時の論理レプリケーションを行うには%sコールバックが必要です" -#: replication/logical/logical.c:1135 +#: replication/logical/logical.c:1246 replication/logical/logical.c:1293 replication/logical/logical.c:1333 replication/logical/logical.c:1417 replication/logical/logical.c:1464 #, c-format -msgid "logical streaming requires a stream_change_cb callback" -msgstr "論理ストリーミングを行うにはstream_change_cbコールバックが必要です" +msgid "logical streaming requires a %s callback" +msgstr "論理ストリーミングを行うには%sコールバックが必要です" -#: replication/logical/logicalfuncs.c:104 replication/slotfuncs.c:34 +#: replication/logical/logical.c:1377 #, c-format -msgid "must be superuser or replication role to use replication slots" -msgstr "レプリケーションスロットを使用するためにはスーパユーザまたはreplicationロールである必要があります" +msgid "logical streaming at prepare time requires a %s callback" +msgstr "プリペア時の論理ストリーミングを行うには%sコールバックが必要です" -#: replication/logical/logicalfuncs.c:134 +#: replication/logical/logicalfuncs.c:126 #, c-format msgid "slot name must not be null" msgstr "スロット名はnullではあってはなりません" -#: replication/logical/logicalfuncs.c:150 +#: replication/logical/logicalfuncs.c:142 #, c-format msgid "options array must not be null" msgstr "オプション配列はnullであってはなりません" -#: replication/logical/logicalfuncs.c:181 +#: replication/logical/logicalfuncs.c:159 #, c-format msgid "array must be one-dimensional" msgstr "配列は1次元でなければなりません" -#: replication/logical/logicalfuncs.c:187 +#: replication/logical/logicalfuncs.c:165 #, c-format msgid "array must not contain nulls" msgstr "配列にはNULL値を含めてはいけません" -#: replication/logical/logicalfuncs.c:203 utils/adt/json.c:1128 utils/adt/jsonb.c:1303 +#: replication/logical/logicalfuncs.c:181 utils/adt/json.c:1434 utils/adt/jsonb.c:1363 #, c-format msgid "array must have even number of elements" msgstr "配列の要素数は偶数でなければなりません" -#: replication/logical/logicalfuncs.c:251 +#: replication/logical/logicalfuncs.c:227 #, c-format msgid "can no longer get changes from replication slot \"%s\"" msgstr "すでにレプリケーションスロット\"%s\"から変更を取り出すことはできません" -#: replication/logical/logicalfuncs.c:253 replication/slotfuncs.c:648 +#: replication/logical/logicalfuncs.c:229 replication/slotfuncs.c:616 #, c-format -msgid "This slot has never previously reserved WAL, or has been invalidated." +msgid "This slot has never previously reserved WAL, or it has been invalidated." msgstr "このスロットはWALを留保したことがないか、無効化さています。" -#: replication/logical/logicalfuncs.c:265 +#: replication/logical/logicalfuncs.c:241 #, c-format msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" msgstr "論理デコード出力プラグイン\"%s\"はバイナリ出力を生成します, しかし関数\"%s\"はテキストデータを期待しています" -#: replication/logical/origin.c:188 +#: replication/logical/origin.c:189 #, c-format msgid "cannot query or manipulate replication origin when max_replication_slots = 0" msgstr "max_replication_slots = 0 の時はレプリケーション起点の問い合わせは操作はできません" -#: replication/logical/origin.c:193 +#: replication/logical/origin.c:194 #, c-format msgid "cannot manipulate replication origins during recovery" msgstr "リカバリ中はレプリケーション基点を操作できません" @@ -18070,1109 +19458,1239 @@ msgstr "レプリケーション基点\"%s\"は存在しません" msgid "could not find free replication origin OID" msgstr "複製基点OIDの空きがありません" -#: replication/logical/origin.c:367 +#: replication/logical/origin.c:355 #, c-format msgid "could not drop replication origin with OID %d, in use by PID %d" msgstr "OID%dのレプリケーション起点を削除できません, PID%dで使用中です" -#: replication/logical/origin.c:459 +#: replication/logical/origin.c:476 #, c-format msgid "replication origin with OID %u does not exist" msgstr "OIDが%uのレプリケーション基点がありません" -#: replication/logical/origin.c:724 +#: replication/logical/origin.c:741 #, c-format msgid "replication checkpoint has wrong magic %u instead of %u" msgstr "レプリケーションチェックポイントのマジックナンバー%uは不正です、正しい値は%u" -#: replication/logical/origin.c:765 +#: replication/logical/origin.c:782 #, c-format msgid "could not find free replication state, increase max_replication_slots" msgstr "使用可能なレプリケーションステートが見つかりません、max_replication_slotsを増やしてください" -#: replication/logical/origin.c:783 +#: replication/logical/origin.c:790 +#, c-format +msgid "recovered replication state of node %u to %X/%X" +msgstr "ノード%uのレプリケーション状態を%X/%Xに復元します" + +#: replication/logical/origin.c:800 #, c-format msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "レプリケーションスロットチェックポイントのチェックサム%uは間違っています、正しくは%uです" -#: replication/logical/origin.c:911 replication/logical/origin.c:1097 +#: replication/logical/origin.c:928 replication/logical/origin.c:1117 #, c-format msgid "replication origin with OID %d is already active for PID %d" msgstr "OID%dのレプリケーション起点は既にPID%dで使用中です" -#: replication/logical/origin.c:922 replication/logical/origin.c:1109 +#: replication/logical/origin.c:939 replication/logical/origin.c:1129 #, c-format msgid "could not find free replication state slot for replication origin with OID %u" msgstr "OID%uのレプリケーション基点に対するレプリケーション状態スロットの空きがありません" -#: replication/logical/origin.c:924 replication/logical/origin.c:1111 replication/slot.c:1763 +#: replication/logical/origin.c:941 replication/logical/origin.c:1131 replication/slot.c:1955 #, c-format msgid "Increase max_replication_slots and try again." msgstr "max_replication_slotsを増やして再度試してください" -#: replication/logical/origin.c:1068 +#: replication/logical/origin.c:1088 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "既に初期化されている場合はレプリケーション起点の初期化はできません" -#: replication/logical/origin.c:1148 replication/logical/origin.c:1364 replication/logical/origin.c:1384 +#: replication/logical/origin.c:1168 replication/logical/origin.c:1380 replication/logical/origin.c:1400 #, c-format msgid "no replication origin is configured" msgstr "レプリケーション起点が構成されていません" -#: replication/logical/origin.c:1231 +#: replication/logical/origin.c:1251 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "レプリケーション起点名\"%s\"は予約されています" -#: replication/logical/origin.c:1233 +#: replication/logical/origin.c:1253 #, c-format msgid "Origin names starting with \"pg_\" are reserved." msgstr "\"pg_\"で始まる起点名は予約されています。" -#: replication/logical/relation.c:272 +#: replication/logical/relation.c:234 #, c-format -msgid "logical replication target relation \"%s.%s\" does not exist" -msgstr "論理レプリケーション対象のリレーション\"%s.%s\"は存在しません" +msgid "\"%s\"" +msgstr "\"%s\"" + +#: replication/logical/relation.c:237 +#, c-format +msgid ", \"%s\"" +msgstr ", \"%s\"" -#: replication/logical/relation.c:329 +#: replication/logical/relation.c:243 #, c-format -msgid "logical replication target relation \"%s.%s\" is missing some replicated columns" -msgstr "論理レプリケーションの対象リレーション\"%s.%s\"はレプリケートされた列の一部を失っています" +msgid "logical replication target relation \"%s.%s\" is missing replicated column: %s" +msgid_plural "logical replication target relation \"%s.%s\" is missing replicated columns: %s" +msgstr[0] "論理レプリケーション先のリレーション\"%s.%s\"は複製された列を失っています: %s" -#: replication/logical/relation.c:369 +#: replication/logical/relation.c:323 +#, c-format +msgid "logical replication target relation \"%s.%s\" does not exist" +msgstr "論理レプリケーション先のリレーション\"%s.%s\"は存在しません" + +#: replication/logical/relation.c:404 #, c-format msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" msgstr "論理レプリケーションのターゲットリレーション\"%s.%s\"がREPLICA IDENTITYインデックスでシステム列を使用しています" -#: replication/logical/reorderbuffer.c:3361 +#: replication/logical/reorderbuffer.c:3810 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "XID%uのためのデータファイルの書き出しに失敗しました: %m" -#: replication/logical/reorderbuffer.c:3678 replication/logical/reorderbuffer.c:3703 +#: replication/logical/reorderbuffer.c:4154 replication/logical/reorderbuffer.c:4179 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "並べ替えバッファのあふれファイルの読み込みに失敗しました: %m" -#: replication/logical/reorderbuffer.c:3682 replication/logical/reorderbuffer.c:3707 +#: replication/logical/reorderbuffer.c:4158 replication/logical/reorderbuffer.c:4183 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "並べ替えバッファのあふれファイルの読み込みに失敗しました: %2$uバイトのはずが%1$dバイトでした" -#: replication/logical/reorderbuffer.c:3942 +#: replication/logical/reorderbuffer.c:4433 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "pg_replslot/%2$s/xid* の削除中にファイル\"%1$s\"が削除できませんでした: %3$m" -#: replication/logical/reorderbuffer.c:4434 +#: replication/logical/reorderbuffer.c:4932 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "ファイル\"%1$s\"の読み込みに失敗しました: %3$dバイトのはずが%2$dバイトでした" -#: replication/logical/snapbuild.c:607 +#: replication/logical/snapbuild.c:597 #, c-format msgid "initial slot snapshot too large" msgstr "初期スロットスナップショットが大きすぎます" -#: replication/logical/snapbuild.c:661 +#: replication/logical/snapbuild.c:651 #, c-format msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" msgstr[0] "エクスポートされた論理デコードスナップショット: \"%s\" (%u個のトランザクションID を含む)" -msgstr[1] "エクスポートされた論理デコードスナップショット: \"%s\" (%u個のトランザクションID を含む)" -#: replication/logical/snapbuild.c:1266 replication/logical/snapbuild.c:1359 replication/logical/snapbuild.c:1913 +#: replication/logical/snapbuild.c:1279 replication/logical/snapbuild.c:1372 replication/logical/snapbuild.c:1901 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "論理デコードは一貫性ポイントを%X/%Xで発見しました" -#: replication/logical/snapbuild.c:1268 +#: replication/logical/snapbuild.c:1281 #, c-format msgid "There are no running transactions." msgstr "実行中のトランザクションはありません。" -#: replication/logical/snapbuild.c:1310 +#: replication/logical/snapbuild.c:1323 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "論理デコードは初期開始点を%X/%Xで発見しました" -#: replication/logical/snapbuild.c:1312 replication/logical/snapbuild.c:1336 +#: replication/logical/snapbuild.c:1325 replication/logical/snapbuild.c:1349 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "%2$uより古いトランザクション(おおよそ%1$d個)の完了を待っています" -#: replication/logical/snapbuild.c:1334 +#: replication/logical/snapbuild.c:1347 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "論理デコードは初期の一貫性ポイントを%X/%Xで発見しました" -#: replication/logical/snapbuild.c:1361 +#: replication/logical/snapbuild.c:1374 #, c-format msgid "There are no old transactions anymore." msgstr "古いトランザクションはこれ以上はありません" -#: replication/logical/snapbuild.c:1755 +#: replication/logical/snapbuild.c:1769 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "スナップショット構築状態ファイル\"%1$s\"のマジックナンバーが不正です: %3$uのはずが%2$uでした" -#: replication/logical/snapbuild.c:1761 +#: replication/logical/snapbuild.c:1775 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "スナップショット状態ファイル\"%1$s\"のバージョン%2$uはサポート外です: %3$uのはずが%2$uでした" -#: replication/logical/snapbuild.c:1860 +#: replication/logical/snapbuild.c:1846 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "スナップショット生成状態ファイル\"%s\"のチェックサムが一致しません: %uですが、%uであるべきです" -#: replication/logical/snapbuild.c:1915 +#: replication/logical/snapbuild.c:1903 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "論理デコードは保存されたスナップショットを使って開始します。" -#: replication/logical/snapbuild.c:1987 +#: replication/logical/snapbuild.c:1975 #, c-format msgid "could not parse file name \"%s\"" msgstr "ファイル名\"%s\"をパースできませんでした" -#: replication/logical/tablesync.c:132 +#: replication/logical/tablesync.c:151 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" msgstr "サブスクリプション\"%s\"、テーブル\"%s\"に対する論理レプリケーションテーブル同期ワーカが終了しました" -#: replication/logical/tablesync.c:664 +#: replication/logical/tablesync.c:422 +#, c-format +msgid "logical replication apply worker for subscription \"%s\" will restart so that two_phase can be enabled" +msgstr "two_phaseを有効化可能にするため、サブスクリプション\"%s\"に対応する論理レプリケーション適用ワーカを再起動します" + +#: replication/logical/tablesync.c:732 replication/logical/tablesync.c:875 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "テーブル\"%s.%s\"のテーブル情報を発行サーバから取得できませんでした: %s" -#: replication/logical/tablesync.c:670 +#: replication/logical/tablesync.c:739 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "テーブル\"%s.%s\"が発行サーバ上で見つかりませんでした" -#: replication/logical/tablesync.c:704 +#: replication/logical/tablesync.c:815 +#, c-format +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "テーブル\"%s.%s\"の列リスト情報を発行サーバから取得できませんでした: %s" + +#: replication/logical/tablesync.c:983 #, c-format -msgid "could not fetch table info for table \"%s.%s\": %s" -msgstr "テーブル\"%s.%s\"のテーブル情報の取得に失敗しました: %s" +msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" +msgstr "テーブル\"%s.%s\"のテーブルのテーブルWHERE句を発行サーバから取得できませんでした: %s" -#: replication/logical/tablesync.c:791 +#: replication/logical/tablesync.c:1120 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "テーブル\"%s.%s\"の初期内容のコピーを開始できませんでした: %s" -#: replication/logical/tablesync.c:905 +#: replication/logical/tablesync.c:1332 replication/logical/worker.c:1631 +#, c-format +msgid "\"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "\"%s\"は行レベルセキュリティが有効なリレーションへの複製はできません: \"%s\"" + +#: replication/logical/tablesync.c:1347 #, c-format -msgid "table copy could not start transaction on publisher" -msgstr "テーブルコピー中に発行サーバ上でのトランザクション開始に失敗しました" +msgid "table copy could not start transaction on publisher: %s" +msgstr "テーブルコピー中に発行サーバ上でのトランザクション開始に失敗しました: %s" -#: replication/logical/tablesync.c:927 +#: replication/logical/tablesync.c:1396 #, c-format -msgid "table copy could not finish transaction on publisher" -msgstr "テーブルコピー中に発行サーバ上でのトランザクション終了に失敗しました" +msgid "replication origin \"%s\" already exists" +msgstr "レプリケーション起点\"%s\"はすでに存在します" -#: replication/logical/worker.c:313 +#: replication/logical/tablesync.c:1409 #, c-format -msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\", remote type %s, local type %s" -msgstr "レプリケーション対象リレーション\"%s.%s\" 列\"%s\"のリモートからのデータを処理中、リモートでの型 %s、ローカルでの型 %s" +msgid "table copy could not finish transaction on publisher: %s" +msgstr "テーブルコピー中に発行サーバ上でのトランザクション終了に失敗しました: %s" -#: replication/logical/worker.c:393 replication/logical/worker.c:522 +#: replication/logical/worker.c:671 replication/logical/worker.c:786 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "論理レプリケーション列%dのバイナリデータ書式が不正です" -#: replication/logical/worker.c:622 +#: replication/logical/worker.c:1417 replication/logical/worker.c:1431 #, c-format -msgid "ORIGIN message sent out of order" -msgstr "ORIGINメッセージが間違った順序で送出されています" +msgid "could not read from streaming transaction's changes file \"%s\": %m" +msgstr "ストリーミングトランザクションの変更情報ファイル\"%s\"から読み取れませんでした: %m" -#: replication/logical/worker.c:772 +#: replication/logical/worker.c:1750 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" -msgstr "論理レプリケーションの対象リレーション\"%s.%s\"は複製の識別列を期待していましたが、発行サーバは送信しませんでした" +msgstr "論理レプリケーション先のリレーション\"%s.%s\"は複製の識別列を期待していましたが、発行サーバは送信しませんでした" -#: replication/logical/worker.c:779 +#: replication/logical/worker.c:1757 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" -msgstr "論理レプリケーションの対象リレーション\"%s.%s\"が識別列インデックスも主キーをもっておらず、かつ発行されたリレーションがREPLICA IDENTITY FULLとなっていません" +msgstr "論理レプリケーション先のリレーション\"%s.%s\"が識別列インデックスも主キーをもっておらず、かつ発行されたリレーションがREPLICA IDENTITY FULLとなっていません" -#: replication/logical/worker.c:1464 +#: replication/logical/worker.c:2552 #, c-format msgid "invalid logical replication message type \"%c\"" msgstr "不正な論理レプリケーションのメッセージタイプ\"%c\"" -#: replication/logical/worker.c:1606 +#: replication/logical/worker.c:2716 #, c-format msgid "data stream from publisher has ended" msgstr "発行サーバからのデータストリームが終了しました" -#: replication/logical/worker.c:1761 +#: replication/logical/worker.c:2867 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "タイムアウトにより論理レプリケーションワーカを終了しています" -#: replication/logical/worker.c:1909 +#: replication/logical/worker.c:3024 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" msgstr "サブスクリプション\"%s\"が削除されたため、対応する論理レプリケーション適用ワーカが停止します" -#: replication/logical/worker.c:1923 +#: replication/logical/worker.c:3035 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "サブスクリプション\"%s\"が無効化されたため、対応する論理レプリケーション適用ワーカが停止します" -#: replication/logical/worker.c:1944 +#: replication/logical/worker.c:3061 #, c-format msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" msgstr "パラメータの変更があったため、サブスクリプション\"%s\"に対応する論理レプリケーション適用ワーカが再起動します" -#: replication/logical/worker.c:2039 +#: replication/logical/worker.c:3185 replication/logical/worker.c:3207 +#, c-format +msgid "could not read from streaming transaction's subxact file \"%s\": %m" +msgstr "ストリーミングトランザクションのサブトランザクションファイル\"%s\"から読み取れませんでした: %m" + +#: replication/logical/worker.c:3606 #, c-format msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" msgstr "サブスクリプション%uが削除されたため、対応する論理レプリケーション適用ワーカの起動を中断します" -#: replication/logical/worker.c:2051 +#: replication/logical/worker.c:3618 #, c-format msgid "logical replication apply worker for subscription \"%s\" will not start because the subscription was disabled during startup" msgstr "サブスクリプション\"%s\"が起動中に無効化されたため、対応する論理レプリケーション適用ワーカは起動しません" -#: replication/logical/worker.c:2069 +#: replication/logical/worker.c:3636 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "サブスクリプション\"%s\"、テーブル\"%s\"に対応する論理レプリケーションテーブル同期ワーカが起動しました" -#: replication/logical/worker.c:2073 +#: replication/logical/worker.c:3640 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "サブスクリプション\"%s\"に対応する論理レプリケーション適用ワーカが起動しました" -#: replication/logical/worker.c:2112 +#: replication/logical/worker.c:3681 #, c-format msgid "subscription has no replication slot set" msgstr "サブスクリプションにレプリケーションスロットが設定されていません" -#: replication/pgoutput/pgoutput.c:151 +#: replication/logical/worker.c:3768 +#, c-format +msgid "logical replication apply worker for subscription \"%s\" two_phase is %s" +msgstr "サブスクリプション\"%s\"に対応する論理レプリケーション適用ワーカ two_phaseは%s" + +#: replication/logical/worker.c:3817 +#, c-format +msgid "logical replication subscription \"%s\" has been disabled due to an error" +msgstr "論理レプリケーション・サブスクリプション\"%s\"はエラーのため無効化されました" + +#: replication/logical/worker.c:3856 +#, c-format +msgid "start skipping logical replication transaction finished at %X/%X" +msgstr "%X/%Xで完了する論理レプリケーショントランザクションのスキップを開始" + +#: replication/logical/worker.c:3870 +#, c-format +msgid "done skipping logical replication transaction finished at %X/%X" +msgstr "%X/%Xで完了したトランザクションのスキップを行いました" + +#: replication/logical/worker.c:3952 +#, c-format +msgid "skip-LSN of logical replication subscription \"%s\" cleared" +msgstr "サブスクリプション\"%s\"に対応する論理レプリケーション・サブスクリプションのスキップLSNをクリアしました" + +#: replication/logical/worker.c:3953 +#, c-format +msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X" +msgstr "リモートトランザクションの完了WAL位置(LSN) %X/%XがスキップLSN %X/%X と一致しません" + +#: replication/logical/worker.c:3979 +#, c-format +msgid "processing remote data for replication origin \"%s\" during \"%s\"" +msgstr "レプリケーション起点\"%s\" \"%s\"のリモートからのデータを処理中" + +#: replication/logical/worker.c:3983 +#, c-format +msgid "processing remote data for replication origin \"%s\" during \"%s\" in transaction %u" +msgstr "レプリケーション起点\"%1$s\" トランザクション%3$uの\"%2$s\"のリモートからのデータを処理中" + +#: replication/logical/worker.c:3988 +#, c-format +msgid "processing remote data for replication origin \"%s\" during \"%s\" in transaction %u finished at %X/%X" +msgstr "レプリケーション起点\"%1$s\"、%4$X/%5$Xで終了するトランザクション%3$uの\"%2$s\"のリモートからのデータを処理中" + +#: replication/logical/worker.c:3995 +#, c-format +msgid "processing remote data for replication origin \"%s\" during \"%s\" for replication target relation \"%s.%s\" in transaction %u finished at %X/%X" +msgstr "レプリケーション起点\"%1$s\"、%6$X/%7$Xで終了するトランザクション%5$uのレプリケーションターゲットリレーション\"%3$s.%4$s\"に対する\"%2$s\"のリモートからのデータを処理中" + +#: replication/logical/worker.c:4003 +#, c-format +msgid "processing remote data for replication origin \"%s\" during \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u finished at %X/%X" +msgstr "レプリケーション起点\"%1$s\"、%7$X/%8$Xで終了するトランザクション%6$uのレプリケーションターゲットリレーション\"%3$s.%4$s\"、列\"%5$s\"に対する\"%2$s\"のリモートからのデータを処理中" + +#: replication/pgoutput/pgoutput.c:318 #, c-format msgid "invalid proto_version" msgstr "不正なproto_version" -#: replication/pgoutput/pgoutput.c:156 +#: replication/pgoutput/pgoutput.c:323 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version \"%s\"は範囲外です" -#: replication/pgoutput/pgoutput.c:173 +#: replication/pgoutput/pgoutput.c:340 #, c-format msgid "invalid publication_names syntax" msgstr "publication_namesの構文が不正です" -#: replication/pgoutput/pgoutput.c:226 +#: replication/pgoutput/pgoutput.c:424 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or lower" msgstr "クライアントが proto_version=%d を送信してきましたが、バージョン%d以下のプロトコルのみしかサポートしていません" -#: replication/pgoutput/pgoutput.c:232 +#: replication/pgoutput/pgoutput.c:430 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or higher" msgstr "クライアントが proto_version=%d を送信してきましたが、バージョン%d以上のプロトコルのみしかサポートしていません" -#: replication/pgoutput/pgoutput.c:238 +#: replication/pgoutput/pgoutput.c:436 #, c-format msgid "publication_names parameter missing" msgstr "publication_namesパラメータが指定されていません" -#: replication/slot.c:183 +#: replication/pgoutput/pgoutput.c:449 +#, c-format +msgid "requested proto_version=%d does not support streaming, need %d or higher" +msgstr "要求されたproto_version=%dではストリーミングをサポートしていません、%d以上が必要です" + +#: replication/pgoutput/pgoutput.c:454 +#, c-format +msgid "streaming requested, but not supported by output plugin" +msgstr "ストリーミングが要求されましたが、出力プラグインでサポートされていません" + +#: replication/pgoutput/pgoutput.c:471 +#, c-format +msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" +msgstr "要求されたproto_version=%dは2相コミットをサポートしていません、%d以上が必要です" + +#: replication/pgoutput/pgoutput.c:476 +#, c-format +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "2相コミットが要求されました、しかし出力プラグインではサポートされていません" + +#: replication/slot.c:209 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "レプリケーションスロット名\"%s\"は短すぎます" -#: replication/slot.c:192 +#: replication/slot.c:218 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "レプリケーションスロット名\"%s\"は長すぎます" -#: replication/slot.c:205 +#: replication/slot.c:231 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "レプリケーションスロット名\"%s\"は不正な文字を含んでいます" -#: replication/slot.c:207 +#: replication/slot.c:233 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "レプリケーションスロット名は小文字、数字とアンダースコアのみを含むことができます。" -#: replication/slot.c:254 +#: replication/slot.c:287 #, c-format msgid "replication slot \"%s\" already exists" msgstr "レプリケーションスロット\"%s\"はすでに存在します" -#: replication/slot.c:264 +#: replication/slot.c:297 #, c-format msgid "all replication slots are in use" msgstr "レプリケーションスロットは全て使用中です" -#: replication/slot.c:265 +#: replication/slot.c:298 #, c-format msgid "Free one or increase max_replication_slots." msgstr "どれか一つを解放するか、max_replication_slots を大きくしてください。" -#: replication/slot.c:407 replication/slotfuncs.c:760 +#: replication/slot.c:448 replication/slotfuncs.c:727 utils/activity/pgstat_replslot.c:55 utils/adt/genfile.c:704 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "レプリケーションスロット\"%s\"は存在しません" -#: replication/slot.c:445 replication/slot.c:1007 +#: replication/slot.c:494 replication/slot.c:1089 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "レプリケーションスロット\"%s\"はPID%dで使用中です" -#: replication/slot.c:684 replication/slot.c:1315 replication/slot.c:1698 +#: replication/slot.c:752 replication/slot.c:1507 replication/slot.c:1890 #, c-format msgid "could not remove directory \"%s\"" msgstr "ディレクトリ\"%s\"を削除できませんでした" -#: replication/slot.c:1042 +#: replication/slot.c:1124 #, c-format msgid "replication slots can only be used if max_replication_slots > 0" msgstr "レプリケーションスロットは max_replication_slots > 0 のときだけ使用できます" -#: replication/slot.c:1047 +#: replication/slot.c:1129 #, c-format msgid "replication slots can only be used if wal_level >= replica" msgstr "レプリケーションスロットは wal_level >= replica のときだけ使用できます" -#: replication/slot.c:1203 +#: replication/slot.c:1141 +#, c-format +msgid "must be superuser or replication role to use replication slots" +msgstr "レプリケーションスロットを使用するためにはスーパユーザまたはreplicationロールである必要があります" + +#: replication/slot.c:1326 #, c-format -msgid "terminating process %d because replication slot \"%s\" is too far behind" -msgstr "レプリケーションスロット\"%2$s\"の遅れが大きすぎるため、プロセス%1$dを終了しています" +msgid "terminating process %d to release replication slot \"%s\"" +msgstr "レプリケーションスロット\"%2$s\"を解放するためプロセス%1$dを終了します" -#: replication/slot.c:1222 +#: replication/slot.c:1370 #, c-format msgid "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds max_slot_wal_keep_size" msgstr "restart_lsnの値 %2$X/%3$X が max_slot_wal_keep_size の範囲を超えたため、スロット\"%1$s\"を無効化します" -#: replication/slot.c:1636 +#: replication/slot.c:1828 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "レプリケーションスロットファイル\"%1$s\"のマジックナンバーが不正です: %3$uのはずが%2$uでした" -#: replication/slot.c:1643 +#: replication/slot.c:1835 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "レプリケーションスロットファイル\"%s\"はサポート外のバージョン%uです" -#: replication/slot.c:1650 +#: replication/slot.c:1842 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "レプリケーションスロットファイル\"%s\"のサイズ%uは異常です" -#: replication/slot.c:1686 +#: replication/slot.c:1878 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "レプリケーションスロットファイル\"%s\"のチェックサムが一致しません: %uですが、%uであるべきです" -#: replication/slot.c:1720 +#: replication/slot.c:1912 #, c-format msgid "logical replication slot \"%s\" exists, but wal_level < logical" msgstr "論理レプリケーションスロット\"%s\"がありますが、wal_level < logical です" -#: replication/slot.c:1722 +#: replication/slot.c:1914 #, c-format msgid "Change wal_level to be logical or higher." msgstr "wal_level を logical もしくはそれより上位の設定にしてください。" -#: replication/slot.c:1726 +#: replication/slot.c:1918 #, c-format msgid "physical replication slot \"%s\" exists, but wal_level < replica" msgstr "物理レプリケーションスロット\"%s\"がありますが、wal_level < replica です" -#: replication/slot.c:1728 +#: replication/slot.c:1920 #, c-format msgid "Change wal_level to be replica or higher." msgstr "wal_level を replica もしくはそれより上位の設定にしてください。" -#: replication/slot.c:1762 +#: replication/slot.c:1954 #, c-format msgid "too many replication slots active before shutdown" msgstr "シャットダウン前のアクティブなレプリケーションスロットの数が多すぎます" -#: replication/slotfuncs.c:624 +#: replication/slotfuncs.c:592 #, c-format msgid "invalid target WAL LSN" msgstr "不正な目標WAL LSN" -#: replication/slotfuncs.c:646 +#: replication/slotfuncs.c:614 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "レプリケーションスロット\"%s\"は進められません" -#: replication/slotfuncs.c:664 +#: replication/slotfuncs.c:632 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" msgstr "レプリケーションスロットを %X/%X に進めることはできません、最小値は %X/%X" -#: replication/slotfuncs.c:772 +#: replication/slotfuncs.c:739 #, c-format msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" msgstr "物理レプリケーションスロット\"%s\"を論理レプリケーションスロットとしてコピーすることはできません" -#: replication/slotfuncs.c:774 +#: replication/slotfuncs.c:741 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "論理レプリケーションスロット\"%s\"を物理レプリケーションスロットとしてコピーすることはできません" -#: replication/slotfuncs.c:781 +#: replication/slotfuncs.c:748 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "WAL の留保をしていないレプリケーションスロットはコピーできません" -#: replication/slotfuncs.c:857 +#: replication/slotfuncs.c:825 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"をコピーできませんでした" -#: replication/slotfuncs.c:859 +#: replication/slotfuncs.c:827 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "コピー処理中にコピー元のレプリケーションスロットが非互換的に変更されました。" -#: replication/slotfuncs.c:865 +#: replication/slotfuncs.c:833 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "未完成の論理レプリケーションスロット\"%s\"はコピーできません" -#: replication/slotfuncs.c:867 +#: replication/slotfuncs.c:835 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "このソースレプリケーションスロットの confirmed_flush_lsn が有効値になってから再度実行してください。" -#: replication/syncrep.c:257 +#: replication/syncrep.c:268 #, c-format msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" msgstr "管理者コマンドにより同期レプリケーションの待ち状態をキャンセルし、接続を終了しています" -#: replication/syncrep.c:258 replication/syncrep.c:275 +#: replication/syncrep.c:269 replication/syncrep.c:286 #, c-format msgid "The transaction has already committed locally, but might not have been replicated to the standby." msgstr "トランザクションはローカルではすでにコミット済みですが、スタンバイ側にはレプリケーションされていない可能性があります。" -#: replication/syncrep.c:274 +#: replication/syncrep.c:285 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "ユーザからの要求により同期レプリケーションの待ち状態をキャンセルしています" -#: replication/syncrep.c:416 -#, c-format -msgid "standby \"%s\" now has synchronous standby priority %u" -msgstr "スタンバイの\"%s\"には優先度%uで同期スタンバイが設定されています" - # y, c-format -#: replication/syncrep.c:483 +#: replication/syncrep.c:494 #, c-format msgid "standby \"%s\" is now a synchronous standby with priority %u" msgstr "スタンバイ\"%s\"は優先度%uの同期スタンバイになりました" -#: replication/syncrep.c:487 +#: replication/syncrep.c:498 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "スタンバイ\"%s\"は定足数同期スタンバイの候補になりました" -#: replication/syncrep.c:1034 +#: replication/syncrep.c:1045 #, c-format msgid "synchronous_standby_names parser failed" msgstr "synchronous_standby_names の読み取りに失敗しました" -#: replication/syncrep.c:1040 +#: replication/syncrep.c:1051 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "同期スタンバイの数(%d)は1以上である必要があります" -#: replication/walreceiver.c:171 +#: replication/walreceiver.c:164 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "管理者コマンドにより WAL 受信プロセスを終了しています" -#: replication/walreceiver.c:297 +#: replication/walreceiver.c:292 #, c-format msgid "could not connect to the primary server: %s" msgstr "プライマリサーバへの接続ができませんでした: %s" -#: replication/walreceiver.c:343 +#: replication/walreceiver.c:339 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "データベースシステムの識別子がプライマリサーバとスタンバイサーバ間で異なります" -#: replication/walreceiver.c:344 +#: replication/walreceiver.c:340 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "プライマリ側の識別子は %s ですが、スタンバイ側の識別子は %s です。" -#: replication/walreceiver.c:354 +#: replication/walreceiver.c:351 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "プライマリの最大のタイムライン%uが、リカバリのタイムライン %uより遅れています" -#: replication/walreceiver.c:408 +#: replication/walreceiver.c:404 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "プライマリのタイムライン%3$uの %1$X/%2$XからでWALストリーミングを始めます" -#: replication/walreceiver.c:413 +#: replication/walreceiver.c:408 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "タイムライン%3$uの %1$X/%2$XからでWALストリーミングを再開します" -#: replication/walreceiver.c:442 +#: replication/walreceiver.c:437 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "WAL ストリーミングを継続できません。リカバリはすでに終わっています。" -#: replication/walreceiver.c:479 +#: replication/walreceiver.c:475 #, c-format msgid "replication terminated by primary server" msgstr "プライマリサーバによりレプリケーションが打ち切られました" -#: replication/walreceiver.c:480 +#: replication/walreceiver.c:476 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "タイムライン%uの%X/%XでWALの最後に達しました" -#: replication/walreceiver.c:568 +#: replication/walreceiver.c:565 #, c-format msgid "terminating walreceiver due to timeout" msgstr "レプリケーションタイムアウトによりwalreceiverを終了しています" -#: replication/walreceiver.c:606 +#: replication/walreceiver.c:603 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "プライマリサーバには要求されたタイムライン%u上にこれ以上WALがありません" -#: replication/walreceiver.c:622 replication/walreceiver.c:929 +#: replication/walreceiver.c:619 replication/walreceiver.c:1045 #, c-format msgid "could not close log segment %s: %m" msgstr "ログセグメント%sをクローズできませんでした: %m" -#: replication/walreceiver.c:742 +#: replication/walreceiver.c:738 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "プライマリサーバからライムライン%u用のタイムライン履歴ファイルを取り込みしています" -#: replication/walreceiver.c:976 +#: replication/walreceiver.c:933 #, c-format msgid "could not write to log segment %s at offset %u, length %lu: %m" msgstr "ログファイルセグメント%sのオフセット%uに長さ%luで書き出せませんでした: %m" -#: replication/walsender.c:523 storage/smgr/md.c:1291 +#: replication/walsender.c:521 +#, c-format +msgid "cannot use \"%s\" with logical replication slot \"%s\"" +msgstr "\"%s\"は論理レプリケーションスロット\"%s\"で使用できません" + +#: replication/walsender.c:639 storage/smgr/md.c:1333 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "ファイル\"%s\"の終端へシークできませんでした: %m" -#: replication/walsender.c:527 +#: replication/walsender.c:643 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "ファイル\"%s\"の先頭にシークできませんでした: %m" -#: replication/walsender.c:578 -#, c-format -msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" -msgstr "IDENTIFY_SYSTEM が START_REPLICATION の前に実行されていません" - -#: replication/walsender.c:607 +#: replication/walsender.c:720 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "論理レプリケーションスロットは物理レプリケーションには使用できません" -#: replication/walsender.c:676 +#: replication/walsender.c:786 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "タイムライン%3$u上の要求された開始ポイント%1$X/%2$Xはサーバの履歴にありません" -#: replication/walsender.c:680 +#: replication/walsender.c:789 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "サーバの履歴はタイムライン%uの%X/%Xからフォークしました。" -#: replication/walsender.c:725 +#: replication/walsender.c:833 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "要求された開始ポイント%X/%XはサーバのWALフラッシュ位置%X/%Xより進んでいます" +#: replication/walsender.c:1016 +#, c-format +msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" +msgstr "CREATE_REPLICATION_SLOTのオプション\"%s\"に対する認識できない値: \"%s\"" + #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:976 +#: replication/walsender.c:1101 #, c-format msgid "%s must not be called inside a transaction" msgstr "%sはトランザクション内では呼び出せません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:986 +#: replication/walsender.c:1111 #, c-format msgid "%s must be called inside a transaction" msgstr "%sはトランザクション内で呼び出さなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:992 +#: replication/walsender.c:1117 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s は REPEATABLE READ 分離レベルのトランザクションで呼び出されなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:998 +#: replication/walsender.c:1123 #, c-format msgid "%s must be called before any query" msgstr "%s は問い合わせの実行前に呼び出されなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1004 +#: replication/walsender.c:1129 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s はサブトランザクション内では呼び出せません" -#: replication/walsender.c:1152 +#: replication/walsender.c:1272 #, c-format msgid "cannot read from logical replication slot \"%s\"" msgstr "論理レプリケーションスロット\"%s\"は読み込めません" -#: replication/walsender.c:1154 +#: replication/walsender.c:1274 #, c-format msgid "This slot has been invalidated because it exceeded the maximum reserved size." msgstr "最大留保量を超えたため、このスロットは無効化されています。" -#: replication/walsender.c:1164 +#: replication/walsender.c:1284 #, c-format msgid "terminating walsender process after promotion" msgstr "昇格後にWAL送信プロセスを終了します" -#: replication/walsender.c:1538 +#: replication/walsender.c:1687 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "WAL送信プロセスが停止モードの間は新しいコマンドを実行できません" -#: replication/walsender.c:1571 +#: replication/walsender.c:1722 +#, c-format +msgid "cannot execute SQL commands in WAL sender for physical replication" +msgstr "物理レプリケーション用のWAL送信プロセスでSQLコマンドは実行できません" + +#: replication/walsender.c:1755 #, c-format msgid "received replication command: %s" msgstr "レプリケーションコマンドを受信しました: %s" -#: replication/walsender.c:1587 tcop/fastpath.c:279 tcop/postgres.c:1103 tcop/postgres.c:1455 tcop/postgres.c:1716 tcop/postgres.c:2174 tcop/postgres.c:2535 tcop/postgres.c:2614 +#: replication/walsender.c:1763 tcop/fastpath.c:208 tcop/postgres.c:1114 tcop/postgres.c:1465 tcop/postgres.c:1705 tcop/postgres.c:2190 tcop/postgres.c:2600 tcop/postgres.c:2678 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "現在のトランザクションがアボートしました。トランザクションブロックが終わるまでコマンドは無視されます" -#: replication/walsender.c:1657 -#, c-format -msgid "cannot execute SQL commands in WAL sender for physical replication" -msgstr "物理レプリケーション用のWAL送信プロセスでSQLコマンドは実行できません" - -#: replication/walsender.c:1706 replication/walsender.c:1722 +#: replication/walsender.c:1905 replication/walsender.c:1940 #, c-format msgid "unexpected EOF on standby connection" msgstr "スタンバイ接続で想定外のEOFがありました" -#: replication/walsender.c:1736 -#, c-format -msgid "unexpected standby message type \"%c\", after receiving CopyDone" -msgstr "CopyDoneを受信した後の想定しないスタンバイメッセージタイプ\"%c\"" - -#: replication/walsender.c:1774 +#: replication/walsender.c:1928 #, c-format msgid "invalid standby message type \"%c\"" msgstr "スタンバイのメッセージタイプ\"%c\"は不正です" -#: replication/walsender.c:1815 +#: replication/walsender.c:2017 #, c-format msgid "unexpected message type \"%c\"" msgstr "想定しないメッセージタイプ\"%c\"" -#: replication/walsender.c:2234 +#: replication/walsender.c:2430 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "レプリケーションタイムアウトにより WAL 送信プロセスを終了しています" -#: replication/walsender.c:2311 -#, c-format -msgid "\"%s\" has now caught up with upstream server" -msgstr "\"%s\"は上流サーバに追いつきました" - -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:989 +#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1001 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "リレーション\"%2$s\"のルール\"%1$s\"はすでに存在します" -#: rewrite/rewriteDefine.c:301 +#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:939 +#, c-format +msgid "relation \"%s\" cannot have rules" +msgstr "リレーション \"%s\"にはルールを定義できません" + +#: rewrite/rewriteDefine.c:302 #, c-format msgid "rule actions on OLD are not implemented" msgstr "OLDに対するルールアクションは実装されていません" -#: rewrite/rewriteDefine.c:302 +#: rewrite/rewriteDefine.c:303 #, c-format msgid "Use views or triggers instead." msgstr "代わりにビューかトリガを使用してください。" -#: rewrite/rewriteDefine.c:306 +#: rewrite/rewriteDefine.c:307 #, c-format msgid "rule actions on NEW are not implemented" msgstr "NEWに対するルールアクションは実装されていません" -#: rewrite/rewriteDefine.c:307 +#: rewrite/rewriteDefine.c:308 #, c-format msgid "Use triggers instead." msgstr "代わりにトリガを使用してください。" -#: rewrite/rewriteDefine.c:320 +#: rewrite/rewriteDefine.c:321 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "SELECTに対するINSTEAD NOTHINGルールは実装されていません" -#: rewrite/rewriteDefine.c:321 +#: rewrite/rewriteDefine.c:322 #, c-format msgid "Use views instead." msgstr "代わりにビューを使用してください" -#: rewrite/rewriteDefine.c:329 +#: rewrite/rewriteDefine.c:330 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "SELECTに対するルールにおける複数のアクションは実装されていません" -#: rewrite/rewriteDefine.c:339 +#: rewrite/rewriteDefine.c:340 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "SELECTに対するルールはINSTEAD SELECTアクションを持たなければなりません" -#: rewrite/rewriteDefine.c:347 +#: rewrite/rewriteDefine.c:348 #, c-format msgid "rules on SELECT must not contain data-modifying statements in WITH" msgstr "SELECT のルールでは WITH にデータを変更するステートメントを含むことはできません" -#: rewrite/rewriteDefine.c:355 +#: rewrite/rewriteDefine.c:356 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "SELECTに対するルールではイベント条件は実装されていません" -#: rewrite/rewriteDefine.c:382 +#: rewrite/rewriteDefine.c:383 #, c-format msgid "\"%s\" is already a view" msgstr "\"%s\"はすでにビューです" -#: rewrite/rewriteDefine.c:406 +#: rewrite/rewriteDefine.c:407 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "\"%s\"用のビューのルールの名前は\"%s\"でなければなりません" -#: rewrite/rewriteDefine.c:434 +#: rewrite/rewriteDefine.c:436 #, c-format msgid "cannot convert partitioned table \"%s\" to a view" -msgstr "パーティションテーブル\"%s\"はビューに変換できませんでした" +msgstr "パーティション親テーブル\"%s\"はビューに変換できませんでした" -#: rewrite/rewriteDefine.c:440 +#: rewrite/rewriteDefine.c:445 #, c-format msgid "cannot convert partition \"%s\" to a view" msgstr "パーティション子テーブル\"%s\"はビューに変換できませんでした" -#: rewrite/rewriteDefine.c:449 +#: rewrite/rewriteDefine.c:454 #, c-format msgid "could not convert table \"%s\" to a view because it is not empty" msgstr "空ではないため、テーブル\"%s\"をビューに変換できませんでした" -#: rewrite/rewriteDefine.c:458 +#: rewrite/rewriteDefine.c:463 #, c-format msgid "could not convert table \"%s\" to a view because it has triggers" msgstr "トリガを持っているため、テーブル\"%s\"をビューに変換できませんでした" -#: rewrite/rewriteDefine.c:460 +#: rewrite/rewriteDefine.c:465 #, c-format msgid "In particular, the table cannot be involved in any foreign key relationships." msgstr "特に、このテーブルは一切の外部キー関係に組み込むことはできません。" -#: rewrite/rewriteDefine.c:465 +#: rewrite/rewriteDefine.c:470 #, c-format msgid "could not convert table \"%s\" to a view because it has indexes" msgstr "インデックスを持っているためテーブル\"%s\"をビューに変換できませんでした" -#: rewrite/rewriteDefine.c:471 +#: rewrite/rewriteDefine.c:476 #, c-format msgid "could not convert table \"%s\" to a view because it has child tables" msgstr "子テーブルを持っているためテーブル\"%s\"をビューに変換できませんでした" -#: rewrite/rewriteDefine.c:477 +#: rewrite/rewriteDefine.c:482 +#, c-format +msgid "could not convert table \"%s\" to a view because it has parent tables" +msgstr "親テーブルが存在するためテーブル\"%s\"をビューに変換できませんでした" + +#: rewrite/rewriteDefine.c:488 #, c-format msgid "could not convert table \"%s\" to a view because it has row security enabled" msgstr "行レベルセキュリティが有効になっているため、テーブル\"%s\"をビューに変換できませんでした" -#: rewrite/rewriteDefine.c:483 +#: rewrite/rewriteDefine.c:494 #, c-format msgid "could not convert table \"%s\" to a view because it has row security policies" msgstr "行レベルセキュリティポリシがあるため、テーブル\"%s\"をビューに変換できませんでした" -#: rewrite/rewriteDefine.c:510 +#: rewrite/rewriteDefine.c:521 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "ルールは複数のRETURNINGリストを持つことができません" -#: rewrite/rewriteDefine.c:515 +#: rewrite/rewriteDefine.c:526 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "条件付のルールではRETURNINGリストはサポートされません" -#: rewrite/rewriteDefine.c:519 +#: rewrite/rewriteDefine.c:530 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "INSTEAD以外のルールではRETURNINGリストはサポートされません" -#: rewrite/rewriteDefine.c:683 +#: rewrite/rewriteDefine.c:694 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "SELECTルールのターゲットリストの要素が多すぎます" -#: rewrite/rewriteDefine.c:684 +#: rewrite/rewriteDefine.c:695 #, c-format msgid "RETURNING list has too many entries" msgstr "RETURNINGリストの要素が多すぎます" -#: rewrite/rewriteDefine.c:711 +#: rewrite/rewriteDefine.c:722 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "削除された列を持つリレーションをビューに変換できませんでした" -#: rewrite/rewriteDefine.c:712 +#: rewrite/rewriteDefine.c:723 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "削除された列を持つリレーションにRETURNINGリストを生成することはできませんでした" -#: rewrite/rewriteDefine.c:718 +#: rewrite/rewriteDefine.c:729 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "SELECTルールのターゲットエントリ%dは列\"%s\"とは異なる列名を持っています" -#: rewrite/rewriteDefine.c:720 +#: rewrite/rewriteDefine.c:731 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "SELECTのターゲットエントリは\"%s\"と名付けられています。" -#: rewrite/rewriteDefine.c:729 +#: rewrite/rewriteDefine.c:740 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "SELECTルールの対象項目%dは\"%s\"と異なる列型を持っています" -#: rewrite/rewriteDefine.c:731 +#: rewrite/rewriteDefine.c:742 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "RETURNINGリスト項目%dは\"%s\"と異なる列型を持っています" -#: rewrite/rewriteDefine.c:734 rewrite/rewriteDefine.c:758 +#: rewrite/rewriteDefine.c:745 rewrite/rewriteDefine.c:769 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "SELECTのターゲットエントリの型は%sですが、列の型は%sです。" -#: rewrite/rewriteDefine.c:737 rewrite/rewriteDefine.c:762 +#: rewrite/rewriteDefine.c:748 rewrite/rewriteDefine.c:773 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "RETURNINGリストの要素の型は%sですが、列の型は%sです。" -#: rewrite/rewriteDefine.c:753 +#: rewrite/rewriteDefine.c:764 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "SELECTルールの対象項目%dは\"%s\"と異なる列のサイズを持っています" -#: rewrite/rewriteDefine.c:755 +#: rewrite/rewriteDefine.c:766 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "RETURNINGリスト項目%dは\"%s\"と異なる列のサイズを持っています" -#: rewrite/rewriteDefine.c:772 +#: rewrite/rewriteDefine.c:783 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "SELECTルールのターゲットリストの項目が少なすぎます" -#: rewrite/rewriteDefine.c:773 +#: rewrite/rewriteDefine.c:784 #, c-format msgid "RETURNING list has too few entries" msgstr "RETURNINGリストの項目が少なすぎます" -#: rewrite/rewriteDefine.c:866 rewrite/rewriteDefine.c:980 rewrite/rewriteSupport.c:109 +#: rewrite/rewriteDefine.c:877 rewrite/rewriteDefine.c:992 rewrite/rewriteSupport.c:109 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"のルール\"%1$s\"は存在しません" -#: rewrite/rewriteDefine.c:999 +#: rewrite/rewriteDefine.c:1011 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "ON SELECTルールの名前を変更することはできません" -#: rewrite/rewriteHandler.c:545 +#: rewrite/rewriteHandler.c:554 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "WITH の問い合わせ名\"%s\"が、ルールのアクションと書き換えられようとしている問い合わせの両方に現れています" -#: rewrite/rewriteHandler.c:605 +#: rewrite/rewriteHandler.c:581 +#, c-format +msgid "INSERT...SELECT rule actions are not supported for queries having data-modifying statements in WITH" +msgstr "INSERT...SELECTルールのアクションはWITHにデータ更新文を持つ問い合わせに対してはサポートされません" + +#: rewrite/rewriteHandler.c:634 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "複数ルールではRETURNINGリストを持つことはできません" -#: rewrite/rewriteHandler.c:816 rewrite/rewriteHandler.c:828 +#: rewrite/rewriteHandler.c:866 rewrite/rewriteHandler.c:905 #, c-format -msgid "cannot insert into column \"%s\"" -msgstr "列\"%s\"への挿入はできません" +msgid "cannot insert a non-DEFAULT value into column \"%s\"" +msgstr "列\"%s\"への非デフォルト値の挿入はできません" -#: rewrite/rewriteHandler.c:817 rewrite/rewriteHandler.c:839 +#: rewrite/rewriteHandler.c:868 rewrite/rewriteHandler.c:934 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "列\"%s\"は GENERATED ALWAYS として定義されています。" -#: rewrite/rewriteHandler.c:819 +#: rewrite/rewriteHandler.c:870 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "OVERRIDING SYSTEM VALUE を指定することで挿入を強制できます。" -#: rewrite/rewriteHandler.c:838 rewrite/rewriteHandler.c:845 +#: rewrite/rewriteHandler.c:932 rewrite/rewriteHandler.c:940 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "列\"%s\"はDEFAULTにのみ更新可能です" -#: rewrite/rewriteHandler.c:1014 rewrite/rewriteHandler.c:1032 +#: rewrite/rewriteHandler.c:1087 rewrite/rewriteHandler.c:1105 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "同じ列\"%s\"に複数の代入があります" -#: rewrite/rewriteHandler.c:2062 +#: rewrite/rewriteHandler.c:2111 rewrite/rewriteHandler.c:3978 +#, c-format +msgid "infinite recursion detected in rules for relation \"%s\"" +msgstr "リレーション\"%s\"のルールで無限再帰を検出しました" + +#: rewrite/rewriteHandler.c:2196 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "リレーション\"%s\"のポリシで無限再帰を検出しました" -#: rewrite/rewriteHandler.c:2382 +#: rewrite/rewriteHandler.c:2516 msgid "Junk view columns are not updatable." msgstr "ジャンクビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2387 +#: rewrite/rewriteHandler.c:2521 msgid "View columns that are not columns of their base relation are not updatable." msgstr "基底リレーションの列ではないビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2390 +#: rewrite/rewriteHandler.c:2524 msgid "View columns that refer to system columns are not updatable." msgstr "システム列を参照するビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2393 +#: rewrite/rewriteHandler.c:2527 msgid "View columns that return whole-row references are not updatable." msgstr "行全体参照を返すビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2454 +#: rewrite/rewriteHandler.c:2588 msgid "Views containing DISTINCT are not automatically updatable." msgstr "DISTINCTを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2457 +#: rewrite/rewriteHandler.c:2591 msgid "Views containing GROUP BY are not automatically updatable." msgstr "GROUP BYを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2460 +#: rewrite/rewriteHandler.c:2594 msgid "Views containing HAVING are not automatically updatable." msgstr "HAVINGを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2463 +#: rewrite/rewriteHandler.c:2597 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "UNION、INTERSECT、EXCEPTを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2466 +#: rewrite/rewriteHandler.c:2600 msgid "Views containing WITH are not automatically updatable." msgstr "WITHを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2469 +#: rewrite/rewriteHandler.c:2603 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "LIMIT、OFFSETを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2481 +#: rewrite/rewriteHandler.c:2615 msgid "Views that return aggregate functions are not automatically updatable." msgstr "集約関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2484 +#: rewrite/rewriteHandler.c:2618 msgid "Views that return window functions are not automatically updatable." msgstr "ウィンドウ関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2487 +#: rewrite/rewriteHandler.c:2621 msgid "Views that return set-returning functions are not automatically updatable." msgstr "集合返却関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2494 rewrite/rewriteHandler.c:2498 rewrite/rewriteHandler.c:2506 +#: rewrite/rewriteHandler.c:2628 rewrite/rewriteHandler.c:2632 rewrite/rewriteHandler.c:2640 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "単一のテーブルまたはビューからselectしていないビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2509 +#: rewrite/rewriteHandler.c:2643 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "TABLESAMPLEを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2533 +#: rewrite/rewriteHandler.c:2667 msgid "Views that have no updatable columns are not automatically updatable." msgstr "更新可能な列を持たないビューは自動更新できません。" -#: rewrite/rewriteHandler.c:3010 +#: rewrite/rewriteHandler.c:3144 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"への挿入はできません" -#: rewrite/rewriteHandler.c:3018 +#: rewrite/rewriteHandler.c:3152 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"は更新できません" -#: rewrite/rewriteHandler.c:3496 +#: rewrite/rewriteHandler.c:3639 +#, c-format +msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" +msgstr "DO INSTEAD NOTIFYルールはWITH内のデータ更新文に対してはサポートされません" + +#: rewrite/rewriteHandler.c:3650 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合は DO INSTEAD NOTHING ルールはサポートされません" -#: rewrite/rewriteHandler.c:3510 +#: rewrite/rewriteHandler.c:3664 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合は、条件付き DO INSTEAD ルールはサポートされません" -#: rewrite/rewriteHandler.c:3514 +#: rewrite/rewriteHandler.c:3668 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合は DO ALSO ルールはサポートされません" -#: rewrite/rewriteHandler.c:3519 +#: rewrite/rewriteHandler.c:3673 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合はマルチステートメントの DO INSTEAD ルールはサポートされません" -#: rewrite/rewriteHandler.c:3710 rewrite/rewriteHandler.c:3718 rewrite/rewriteHandler.c:3726 +#: rewrite/rewriteHandler.c:3906 rewrite/rewriteHandler.c:3914 rewrite/rewriteHandler.c:3922 #, c-format msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "条件付きDO INSTEADルールを持つビューは自動更新できません。" -#: rewrite/rewriteHandler.c:3819 +#: rewrite/rewriteHandler.c:4015 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのINSERT RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:3821 +#: rewrite/rewriteHandler.c:4017 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "RETURNING句を持つ無条件のON INSERT DO INSTEADルールが必要です。" -#: rewrite/rewriteHandler.c:3826 +#: rewrite/rewriteHandler.c:4022 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのUPDATE RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:3828 +#: rewrite/rewriteHandler.c:4024 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "RETURNING句を持つ無条件のON UPDATE DO INSTEADルールが必要です。" -#: rewrite/rewriteHandler.c:3833 +#: rewrite/rewriteHandler.c:4029 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのDELETE RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:3835 +#: rewrite/rewriteHandler.c:4031 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "RETURNING句を持つ無条件のON DELETE DO INSTEADルールが必要です。" -#: rewrite/rewriteHandler.c:3853 +#: rewrite/rewriteHandler.c:4049 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "ON CONFLICT句を伴うINSERTは、INSERTまたはUPDATEルールを持つテーブルでは使えません" -#: rewrite/rewriteHandler.c:3910 +#: rewrite/rewriteHandler.c:4106 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "複数問い合わせに対するルールにより書き換えられた問い合わせでは WITH を使用できません" @@ -19192,181 +20710,194 @@ msgstr "ビューに対するWHERE CURRENT OFは実装されていません" msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" msgstr "ON UPDATE ルールのNEW変数は、対象のUPDATEコマンドでの複数列代入の一部となる列を参照することはできません" -#: scan.l:458 +#: rewrite/rewriteSearchCycle.c:410 +#, c-format +msgid "with a SEARCH or CYCLE clause, the recursive reference to WITH query \"%s\" must be at the top level of its right-hand SELECT" +msgstr "SEARCHまたはCYCLE句を指定する場合、WITH問い合わせ\"%s\"への再帰参照は右辺のSELECTの最上位で行う必要があります" + +#: scan.l:465 msgid "unterminated /* comment" msgstr "/*コメントが閉じていません" -#: scan.l:478 +#: scan.l:485 msgid "unterminated bit string literal" msgstr "ビット列リテラルの終端がありません" -#: scan.l:492 +#: scan.l:499 msgid "unterminated hexadecimal string literal" msgstr "16進数文字列リテラルの終端がありません" -#: scan.l:542 +#: scan.l:549 #, c-format msgid "unsafe use of string constant with Unicode escapes" msgstr "Unicodeエスケープを使った文字列定数の危険な使用" -#: scan.l:543 +#: scan.l:550 #, c-format msgid "String constants with Unicode escapes cannot be used when standard_conforming_strings is off." msgstr "Unicodeエスケープはstandard_conforming_stringsが無効な時に使用することはできません。" -#: scan.l:604 +#: scan.l:611 msgid "unhandled previous state in xqs" msgstr "xqsの中で処理されない前ステート" -#: scan.l:678 +#: scan.l:685 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "Unicodeエスケープは\\uXXXXまたは\\UXXXXXXXXでなければなりません。" -#: scan.l:689 +#: scan.l:696 #, c-format msgid "unsafe use of \\' in a string literal" msgstr "文字列リテラルで安全ではない\\'が使用されました。" -#: scan.l:690 +#: scan.l:697 #, c-format msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." msgstr "文字列内で引用符を記述するには''を使用してください。\\'はクライアントのみで有効な符号化形式では安全ではありません。" -#: scan.l:762 +#: scan.l:769 msgid "unterminated dollar-quoted string" msgstr "文字列のドル引用符が閉じていません" -#: scan.l:779 scan.l:789 +#: scan.l:786 scan.l:796 msgid "zero-length delimited identifier" msgstr "二重引用符で囲まれた識別子の長さがゼロです" -#: scan.l:800 syncrep_scanner.l:91 +#: scan.l:807 syncrep_scanner.l:91 msgid "unterminated quoted identifier" msgstr "識別子の引用符が閉じていません" -#: scan.l:963 +#: scan.l:970 msgid "operator too long" msgstr "演算子が長すぎます" +#: scan.l:983 +msgid "trailing junk after parameter" +msgstr "パラメータの後に余分な文字" + +#: scan.l:1008 scan.l:1012 scan.l:1016 scan.l:1020 +msgid "trailing junk after numeric literal" +msgstr "数値リテラルの後ろにゴミがあります" + #. translator: %s is typically the translation of "syntax error" -#: scan.l:1172 +#: scan.l:1184 #, c-format msgid "%s at end of input" msgstr "入力の最後で %s" #. translator: first %s is typically the translation of "syntax error" -#: scan.l:1180 +#: scan.l:1192 #, c-format msgid "%s at or near \"%s\"" msgstr "\"%2$s\"またはその近辺で%1$s" -#: scan.l:1374 +#: scan.l:1383 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "文字列リテラルないでの\\'の非標準的な使用" -#: scan.l:1375 +#: scan.l:1384 #, c-format msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "文字列内で単一引用符を記述するには''、またはエスケープ文字列構文(E'...')を使用してください。" -#: scan.l:1384 +#: scan.l:1393 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "文字列リテラル内での\\\\の非標準的な使用" -#: scan.l:1385 +#: scan.l:1394 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "バックスラッシュのエスケープ文字列構文、例えばE'\\\\'を使用してください。" -#: scan.l:1399 +#: scan.l:1408 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "文字列リテラル内でのエスケープの非標準的な使用" -#: scan.l:1400 +#: scan.l:1409 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "エスケープのエスケープ文字列構文、例えばE'\\r\\n'を使用してください。" -#: snowball/dict_snowball.c:209 +#: snowball/dict_snowball.c:215 #, c-format msgid "no Snowball stemmer available for language \"%s\" and encoding \"%s\"" msgstr "言語\"%s\"および符号化方式\"%s\"用に使用可能なSnowballステマがありません" -#: snowball/dict_snowball.c:232 tsearch/dict_ispell.c:74 tsearch/dict_simple.c:49 +#: snowball/dict_snowball.c:238 tsearch/dict_ispell.c:74 tsearch/dict_simple.c:49 #, c-format msgid "multiple StopWords parameters" msgstr "重複したStopWordsパラメータ" -#: snowball/dict_snowball.c:241 +#: snowball/dict_snowball.c:247 #, c-format msgid "multiple Language parameters" msgstr "重複したLanguageパラメータ" -#: snowball/dict_snowball.c:248 +#: snowball/dict_snowball.c:254 #, c-format msgid "unrecognized Snowball parameter: \"%s\"" msgstr "認識できないSnowballパラメータ: \"%s\"" -#: snowball/dict_snowball.c:256 +#: snowball/dict_snowball.c:262 #, c-format msgid "missing Language parameter" msgstr "Languageパラメータがありません" -#: statistics/dependencies.c:667 statistics/dependencies.c:720 statistics/mcv.c:1477 statistics/mcv.c:1508 statistics/mvdistinct.c:348 statistics/mvdistinct.c:401 utils/adt/pseudotypes.c:42 utils/adt/pseudotypes.c:76 -#, c-format -msgid "cannot accept a value of type %s" -msgstr "%s型の値は受け付けられません" - -#: statistics/extended_stats.c:145 +#: statistics/extended_stats.c:179 #, c-format msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "統計オブジェクト\"%s.%s\"がリレーション\"%s.%s\"に対して計算できませんでした" -#: statistics/mcv.c:1365 utils/adt/jsonfuncs.c:1800 +#: statistics/mcv.c:1372 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "レコード型を受け付けられないコンテキストでレコードを返す関数が呼び出されました" -#: storage/buffer/bufmgr.c:589 storage/buffer/bufmgr.c:670 +#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:764 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "他のセッションの一時テーブルにはアクセスできません" -#: storage/buffer/bufmgr.c:826 +#: storage/buffer/bufmgr.c:842 +#, c-format +msgid "cannot extend relation %s beyond %u blocks" +msgstr "リレーション\"%s\"を%uブロックを超えて拡張できません" + +#: storage/buffer/bufmgr.c:929 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "リレーション %2$s の %1$u ブロック目で、EOF の先に想定外のデータを検出しました" -#: storage/buffer/bufmgr.c:828 +#: storage/buffer/bufmgr.c:931 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "これはカーネルの不具合で発生した模様です。システムの更新を検討してください。" -#: storage/buffer/bufmgr.c:926 +#: storage/buffer/bufmgr.c:1030 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "リレーション %2$s の %1$u ブロック目のページが不正です: ページをゼロで埋めました" -#: storage/buffer/bufmgr.c:4246 +#: storage/buffer/bufmgr.c:4658 #, c-format msgid "could not write block %u of %s" msgstr "%u ブロックを %s に書き出せませんでした" -#: storage/buffer/bufmgr.c:4248 +#: storage/buffer/bufmgr.c:4660 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "複数回失敗しました ---ずっと書き込みエラーが続くかもしれません。" -#: storage/buffer/bufmgr.c:4269 storage/buffer/bufmgr.c:4288 +#: storage/buffer/bufmgr.c:4681 storage/buffer/bufmgr.c:4700 #, c-format msgid "writing block %u of relation %s" msgstr "ブロック %u を リレーション %s に書き込んでいます" -#: storage/buffer/bufmgr.c:4591 +#: storage/buffer/bufmgr.c:5004 #, c-format msgid "snapshot too old" msgstr "スナップショットが古すぎます" @@ -19381,127 +20912,172 @@ msgstr "利用できる、空のローカルバッファがありません" msgid "cannot access temporary tables during a parallel operation" msgstr "並列処理中は一時テーブルにはアクセスできません" -#: storage/file/buffile.c:319 +#: storage/file/buffile.c:333 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "BufFile \"%2$s\"の一時ファイル\"%1$s\"をオープンできませんでした: %m" -#: storage/file/buffile.c:791 +#: storage/file/buffile.c:723 storage/file/buffile.c:844 #, c-format msgid "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" msgstr "BufFile \"%s\"の一時ファイル\"%s\"のサイズの確認に失敗しました: %m" -#: storage/file/fd.c:508 storage/file/fd.c:580 storage/file/fd.c:616 +#: storage/file/buffile.c:923 +#, c-format +msgid "could not delete fileset \"%s\": %m" +msgstr "ファイルセット\"%s\"を削除できませんでした: %m" + +#: storage/file/buffile.c:941 storage/smgr/md.c:310 storage/smgr/md.c:873 +#, c-format +msgid "could not truncate file \"%s\": %m" +msgstr "ファイル\"%s\"の切り詰め処理ができませんでした: %m" + +#: storage/file/fd.c:522 storage/file/fd.c:594 storage/file/fd.c:630 #, c-format msgid "could not flush dirty data: %m" msgstr "ダーティーデータを書き出しできませんでした: %m" -#: storage/file/fd.c:538 +#: storage/file/fd.c:552 #, c-format msgid "could not determine dirty data size: %m" msgstr "ダーティーデータのサイズを特定できませんでした: %m" -#: storage/file/fd.c:590 +#: storage/file/fd.c:604 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "データの書き出し中にmunmap()に失敗しました: %m" -#: storage/file/fd.c:798 +#: storage/file/fd.c:843 #, c-format msgid "could not link file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"から\"%s\"へのリンクができませんでした: %m" -#: storage/file/fd.c:881 +#: storage/file/fd.c:967 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimitが失敗しました: %m" -#: storage/file/fd.c:971 +#: storage/file/fd.c:1057 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "サーバプロセスを起動させるために利用できるファイル記述子が不足しています" -#: storage/file/fd.c:972 +#: storage/file/fd.c:1058 #, c-format msgid "System allows %d, we need at least %d." msgstr "システムでは%d使用できますが、少なくとも%d必要です" -#: storage/file/fd.c:1023 storage/file/fd.c:2357 storage/file/fd.c:2467 storage/file/fd.c:2618 +#: storage/file/fd.c:1153 storage/file/fd.c:2496 storage/file/fd.c:2606 storage/file/fd.c:2757 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "ファイル記述子が不足しています: %m: 解放後再実行してください" -#: storage/file/fd.c:1397 +#: storage/file/fd.c:1527 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "一時ファイル: パス \"%s\"、サイズ %lu" -#: storage/file/fd.c:1528 +#: storage/file/fd.c:1658 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "一時ディレクトリ\"%s\"を作成できませんでした: %m" -#: storage/file/fd.c:1535 +#: storage/file/fd.c:1665 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "一時サブディレクトリ\"%s\"を作成できませんでした: %m" -#: storage/file/fd.c:1728 +#: storage/file/fd.c:1862 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"を作成できませんでした: %m" -#: storage/file/fd.c:1763 +#: storage/file/fd.c:1898 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"をオープンできませんでした: %m" -#: storage/file/fd.c:1804 +#: storage/file/fd.c:1939 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"を unlink できませんでした: %m" -#: storage/file/fd.c:2068 +#: storage/file/fd.c:2027 +#, c-format +msgid "could not delete file \"%s\": %m" +msgstr "ファイル\"%s\"を削除できませんでした: %m" + +#: storage/file/fd.c:2207 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "一時ファイルのサイズがtemp_file_limit(%d KB)を超えています" -#: storage/file/fd.c:2333 storage/file/fd.c:2392 +#: storage/file/fd.c:2472 storage/file/fd.c:2531 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "ファイル\"%2$s\"をオープンしようとした時にmaxAllocatedDescs(%1$d)を超えました" -#: storage/file/fd.c:2437 +#: storage/file/fd.c:2576 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "コマンド\"%2$s\"を実行しようとした時にmaxAllocatedDescs(%1$d)を超えました" -#: storage/file/fd.c:2594 +#: storage/file/fd.c:2733 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "ディレクトリ\"%2$s\"をオープンしようとした時にmaxAllocatedDescs(%1$d)を超えました" -#: storage/file/fd.c:3122 +#: storage/file/fd.c:3269 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "一時ファイル用ディレクトリに想定外のファイルがありました: \"%s\"" -#: storage/file/sharedfileset.c:111 +#: storage/file/fd.c:3387 +#, c-format +msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" +msgstr "データディレクトリを同期しています(syncfs)、経過時間: %ld.%02d秒, 現在のパス: %s" + +#: storage/file/fd.c:3401 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "ファイル\"%s\"に対してファイルシステムを同期できませんでした: %m" + +#: storage/file/fd.c:3619 +#, c-format +msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "データディレクトリを同期しています(pre-syncfs)、経過時間: %ld.%02d秒, 現在のパス: %s" + +#: storage/file/fd.c:3651 +#, c-format +msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "データディレクトリを同期しています(fsync)、経過時間: %ld.%02d秒, 現在のパス: %s" + +#: storage/file/reinit.c:145 +#, c-format +msgid "resetting unlogged relations (init), elapsed time: %ld.%02d s, current path: %s" +msgstr "非ログリレーションをリセットしています(init)、経過時間: %ld.%02d秒, 現在のパス: %s" + +#: storage/file/reinit.c:148 +#, c-format +msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" +msgstr "非ログリレーションをリセットしています(cleanup)、経過時間: %ld.%02d秒, 現在のパス: %s" + +#: storage/file/sharedfileset.c:79 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "すでに破棄されているため SharedFileSet にアタッチできません" -#: storage/ipc/dsm.c:351 +#: storage/ipc/dsm.c:353 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "動的共有メモリの制御セグメントが壊れています" -#: storage/ipc/dsm.c:415 +#: storage/ipc/dsm.c:418 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "動的共有メモリの制御セグメントの内容が不正です" -#: storage/ipc/dsm.c:592 +#: storage/ipc/dsm.c:600 #, c-format msgid "too many dynamic shared memory segments" msgstr "動的共有メモリセグメントが多すぎます" @@ -19551,33 +21127,37 @@ msgstr "共有メモリセグメント\"%s\"を作成できませんでした: % msgid "could not close shared memory segment \"%s\": %m" msgstr "共有メモリセグメント\"%s\"をクローズできませんでした: %m" -#: storage/ipc/dsm_impl.c:975 storage/ipc/dsm_impl.c:1023 +#: storage/ipc/dsm_impl.c:976 storage/ipc/dsm_impl.c:1025 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "\"%s\"のハンドルの複製ができませんでした: %m" -#. translator: %s is a syscall name, such as "poll()" -#: storage/ipc/latch.c:988 storage/ipc/latch.c:1142 storage/ipc/latch.c:1355 storage/ipc/latch.c:1505 storage/ipc/latch.c:1618 +#: storage/ipc/procarray.c:3830 #, c-format -msgid "%s failed: %m" -msgstr "%s が失敗しました: %m" - -#: storage/ipc/procarray.c:3630 -#, c-format -msgid "database \"%s\" is being used by prepared transaction" +msgid "database \"%s\" is being used by prepared transactions" msgstr "データベース\"%s\"は準備済みトランザクションで使用中です" -#: storage/ipc/procarray.c:3662 storage/ipc/signalfuncs.c:142 +#: storage/ipc/procarray.c:3862 storage/ipc/signalfuncs.c:226 #, c-format msgid "must be a superuser to terminate superuser process" msgstr "スーパユーザのプロセスを終了させるにはスーパユーザである必要があります" -#: storage/ipc/procarray.c:3669 storage/ipc/signalfuncs.c:147 +#: storage/ipc/procarray.c:3869 storage/ipc/signalfuncs.c:231 #, c-format msgid "must be a member of the role whose process is being terminated or member of pg_signal_backend" msgstr "終了しようとしているプロセスのロールまたはpg_signal_backendのメンバである必要があります。" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:982 storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 storage/lmgr/lock.c:4174 storage/lmgr/lock.c:4239 storage/lmgr/lock.c:4531 storage/lmgr/predicate.c:2401 storage/lmgr/predicate.c:2416 storage/lmgr/predicate.c:3898 storage/lmgr/predicate.c:5009 utils/hash/dynahash.c:1086 +#: storage/ipc/shm_mq.c:384 +#, c-format +msgid "cannot send a message of size %zu via shared memory queue" +msgstr "共有メモリキュー経由で大きさ%zuのメッセージは送信できません" + +#: storage/ipc/shm_mq.c:720 +#, c-format +msgid "invalid message size %zu in shared memory queue" +msgstr "共有メモリキュー内の不正なメッセージ長%zu" + +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:982 storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 storage/lmgr/lock.c:4259 storage/lmgr/lock.c:4324 storage/lmgr/lock.c:4674 storage/lmgr/predicate.c:2472 storage/lmgr/predicate.c:2487 storage/lmgr/predicate.c:3969 storage/lmgr/predicate.c:5081 utils/hash/dynahash.c:1112 #, c-format msgid "out of shared memory" msgstr "共有メモリが足りません" @@ -19587,88 +21167,142 @@ msgstr "共有メモリが足りません" msgid "out of shared memory (%zu bytes requested)" msgstr "共有メモリが足りません (%zu バイト要求しました)" -#: storage/ipc/shmem.c:441 +#: storage/ipc/shmem.c:445 #, c-format msgid "could not create ShmemIndex entry for data structure \"%s\"" msgstr "データ構造体\"%s\"のためのShmemIndexエントリを作成できませんでした" -#: storage/ipc/shmem.c:456 +#: storage/ipc/shmem.c:460 #, c-format msgid "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, actual %zu" msgstr "データ構造体\"%s\"のためのShmemIndexエントリのサイズが誤っています: %zuバイトを期待しましたが、実際は%zuバイトでした" -#: storage/ipc/shmem.c:475 +#: storage/ipc/shmem.c:479 #, c-format msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" msgstr "データ構造体\"%s\"のための共有メモリが不足しています ( %zu バイトが必要)" -#: storage/ipc/shmem.c:507 storage/ipc/shmem.c:526 +#: storage/ipc/shmem.c:511 storage/ipc/shmem.c:530 #, c-format msgid "requested shared memory size overflows size_t" msgstr "要求された共有メモリのサイズはsize_tを超えています" -#: storage/ipc/signalfuncs.c:67 +#: storage/ipc/signalfuncs.c:72 #, c-format -msgid "PID %d is not a PostgreSQL server process" -msgstr "PID %dはPostgreSQLサーバプロセスではありません" +msgid "PID %d is not a PostgreSQL backend process" +msgstr "PID %dはPostgreSQLバックエンドプロセスではありません" -#: storage/ipc/signalfuncs.c:98 storage/lmgr/proc.c:1362 +#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1430 utils/adt/mcxtfuncs.c:190 #, c-format msgid "could not send signal to process %d: %m" msgstr "プロセス%dにシグナルを送信できませんでした: %m" -#: storage/ipc/signalfuncs.c:118 +#: storage/ipc/signalfuncs.c:124 #, c-format msgid "must be a superuser to cancel superuser query" msgstr "スーパユーザの問い合わせをキャンセルするにはスーパユーザである必要があります" -#: storage/ipc/signalfuncs.c:123 +#: storage/ipc/signalfuncs.c:129 #, c-format msgid "must be a member of the role whose query is being canceled or member of pg_signal_backend" msgstr "キャンセルしようとしている問い合わせのロールまたはpg_signal_backendのメンバである必要があります" -#: storage/ipc/signalfuncs.c:183 +#: storage/ipc/signalfuncs.c:170 +#, c-format +msgid "could not check the existence of the backend with PID %d: %m" +msgstr "PID %dのバックエンドの存在の確認に失敗しました: %m" + +#: storage/ipc/signalfuncs.c:188 +#, c-format +msgid "backend with PID %d did not terminate within %lld millisecond" +msgid_plural "backend with PID %d did not terminate within %lld milliseconds" +msgstr[0] "PID %dのバックエンドが%lldミリ秒で終了しませんでした" + +#: storage/ipc/signalfuncs.c:219 +#, c-format +msgid "\"timeout\" must not be negative" +msgstr "\"timeout\"は負数であってはなりません" + +#: storage/ipc/signalfuncs.c:271 #, c-format msgid "must be superuser to rotate log files with adminpack 1.0" msgstr "adminpack 1.0 でログファイルをローテートするにはスーパユーザである必要があります" #. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:185 utils/adt/genfile.c:253 +#: storage/ipc/signalfuncs.c:273 utils/adt/genfile.c:250 #, c-format msgid "Consider using %s, which is part of core, instead." msgstr "代わりにコアの一部である %s の使用を検討してください。" -#: storage/ipc/signalfuncs.c:191 storage/ipc/signalfuncs.c:211 +#: storage/ipc/signalfuncs.c:279 storage/ipc/signalfuncs.c:299 #, c-format msgid "rotation not possible because log collection not active" msgstr "ログ収集が活動していませんのでローテーションを行うことができません" -#: storage/ipc/standby.c:580 tcop/postgres.c:3177 +#: storage/ipc/standby.c:307 +#, c-format +msgid "recovery still waiting after %ld.%03d ms: %s" +msgstr "リカバリは%ld.%03dミリ秒経過後待機継続中: %s" + +#: storage/ipc/standby.c:316 +#, c-format +msgid "recovery finished waiting after %ld.%03d ms: %s" +msgstr "リカバリは%ld.%03dミリ秒で待機終了: %s" + +#: storage/ipc/standby.c:884 tcop/postgres.c:3330 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "リカバリで競合が発生したためステートメントをキャンセルしています" -#: storage/ipc/standby.c:581 tcop/postgres.c:2469 +#: storage/ipc/standby.c:885 tcop/postgres.c:2485 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "リカバリ時にユーザのトランザクションがバッファのデッドロックを引き起こしました。" +#: storage/ipc/standby.c:1424 +msgid "unknown reason" +msgstr "不明な理由" + +#: storage/ipc/standby.c:1429 +msgid "recovery conflict on buffer pin" +msgstr "バッファピンによるリカバリ競合" + +#: storage/ipc/standby.c:1432 +msgid "recovery conflict on lock" +msgstr "ロック上のリカバリ衝突" + +#: storage/ipc/standby.c:1435 +msgid "recovery conflict on tablespace" +msgstr "テーブル空間上のリカバリ衝突" + +#: storage/ipc/standby.c:1438 +msgid "recovery conflict on snapshot" +msgstr "スナップショットによるリカバリ競合" + +#: storage/ipc/standby.c:1441 +msgid "recovery conflict on buffer deadlock" +msgstr "バッファのデッドロックによるリカバリ競合" + +#: storage/ipc/standby.c:1444 +msgid "recovery conflict on database" +msgstr "データベース上のリカバリ衝突" + #: storage/large_object/inv_api.c:191 #, c-format msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" msgstr "OID%u、ページ%dに対応するpg_largeobjectのエントリのデータフィールドの大きさ%dは不正です" -#: storage/large_object/inv_api.c:272 +#: storage/large_object/inv_api.c:274 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "ラージオブジェクトを開くためのフラグが不正です: %d" -#: storage/large_object/inv_api.c:462 +#: storage/large_object/inv_api.c:457 #, c-format msgid "invalid whence setting: %d" msgstr "不正なwhence設定: %d" -#: storage/large_object/inv_api.c:634 +#: storage/large_object/inv_api.c:629 #, c-format msgid "invalid large object write request size: %d" msgstr "ラージオブジェクトの書き出し要求サイズが不正です: %d" @@ -19693,102 +21327,102 @@ msgstr "デッドロックを検出しました" msgid "See server log for query details." msgstr "問い合わせの詳細はサーバログを参照してください" -#: storage/lmgr/lmgr.c:830 +#: storage/lmgr/lmgr.c:859 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプル(%1$u,%2$u)の更新中" -#: storage/lmgr/lmgr.c:833 +#: storage/lmgr/lmgr.c:862 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプル(%1$u,%2$u)の削除中" -#: storage/lmgr/lmgr.c:836 +#: storage/lmgr/lmgr.c:865 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプル(%1$u,%2$u)のロック中" -#: storage/lmgr/lmgr.c:839 +#: storage/lmgr/lmgr.c:868 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプルの更新後バージョン(%1$u,%2$u)のロック中" -#: storage/lmgr/lmgr.c:842 +#: storage/lmgr/lmgr.c:871 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のインデックスタプル(%1$u,%2$u)の挿入中" -#: storage/lmgr/lmgr.c:845 +#: storage/lmgr/lmgr.c:874 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプル(%1$u,%2$u)の一意性の確認中" -#: storage/lmgr/lmgr.c:848 +#: storage/lmgr/lmgr.c:877 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"の更新されたタプル(%1$u,%2$u)の再チェック中" -#: storage/lmgr/lmgr.c:851 +#: storage/lmgr/lmgr.c:880 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプル(%1$u,%2$u)に対する排除制約のチェック中" -#: storage/lmgr/lmgr.c:1106 +#: storage/lmgr/lmgr.c:1135 #, c-format msgid "relation %u of database %u" msgstr "データベース%2$uのリレーション%1$u" -#: storage/lmgr/lmgr.c:1112 +#: storage/lmgr/lmgr.c:1141 #, c-format msgid "extension of relation %u of database %u" msgstr "データベース%2$uのリレーション%1$uの拡張" -#: storage/lmgr/lmgr.c:1118 +#: storage/lmgr/lmgr.c:1147 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "データベース%uのpg_database.datfrozenxid" -#: storage/lmgr/lmgr.c:1123 +#: storage/lmgr/lmgr.c:1152 #, c-format msgid "page %u of relation %u of database %u" msgstr "データベース%3$uのリレーション%2$uのページ%1$u" -#: storage/lmgr/lmgr.c:1130 +#: storage/lmgr/lmgr.c:1159 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "データベース%4$uのリレーション%3$uのタプル(%2$u,%1$u)" -#: storage/lmgr/lmgr.c:1138 +#: storage/lmgr/lmgr.c:1167 #, c-format msgid "transaction %u" msgstr "トランザクション %u" -#: storage/lmgr/lmgr.c:1143 +#: storage/lmgr/lmgr.c:1172 #, c-format msgid "virtual transaction %d/%u" msgstr "仮想トランザクション %d/%u" -#: storage/lmgr/lmgr.c:1149 +#: storage/lmgr/lmgr.c:1178 #, c-format msgid "speculative token %u of transaction %u" msgstr "トランザクション%2$uの投機的書き込みトークン%1$u" -#: storage/lmgr/lmgr.c:1155 +#: storage/lmgr/lmgr.c:1184 #, c-format msgid "object %u of class %u of database %u" msgstr "データベース%3$uのリレーション%2$uのオブジェクト%1$u" -#: storage/lmgr/lmgr.c:1163 +#: storage/lmgr/lmgr.c:1192 #, c-format msgid "user lock [%u,%u,%u]" msgstr "ユーザロック[%u,%u,%u]" -#: storage/lmgr/lmgr.c:1170 +#: storage/lmgr/lmgr.c:1199 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "アドバイザリ・ロック[%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1178 +#: storage/lmgr/lmgr.c:1207 #, c-format msgid "unrecognized locktag type %d" msgstr "ロックタグタイプ%dは不明です" @@ -19803,12 +21437,12 @@ msgstr "リカバリの実行中はデータベースオブジェクトでロッ msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." msgstr "リカバリの実行中は、データベースオブジェクトで RowExclusiveLock もしくはそれ以下だけが獲得できます" -#: storage/lmgr/lock.c:983 storage/lmgr/lock.c:1021 storage/lmgr/lock.c:2846 storage/lmgr/lock.c:4175 storage/lmgr/lock.c:4240 storage/lmgr/lock.c:4532 +#: storage/lmgr/lock.c:983 storage/lmgr/lock.c:1021 storage/lmgr/lock.c:2846 storage/lmgr/lock.c:4260 storage/lmgr/lock.c:4325 storage/lmgr/lock.c:4675 #, c-format msgid "You might need to increase max_locks_per_transaction." msgstr "max_locks_per_transactionを増やす必要があるかもしれません" -#: storage/lmgr/lock.c:3292 storage/lmgr/lock.c:3408 +#: storage/lmgr/lock.c:3301 storage/lmgr/lock.c:3369 storage/lmgr/lock.c:3485 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" msgstr "同一オブジェクト上にセッションレベルとトランザクションレベルのロックの両方を保持している時にPREPAREすることはできません" @@ -19828,47 +21462,42 @@ msgstr "トランザクションの同時実行数を減らすか max_connection msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "RWConflictPoolに読み書き競合の可能性を記録するための要素が不足しています" -#: storage/lmgr/predicate.c:1535 -#, c-format -msgid "deferrable snapshot was unsafe; trying a new one" -msgstr "遅延可能スナップショットは安全ではありません。新しいスナップショットを取得しようとしています。" - -#: storage/lmgr/predicate.c:1624 +#: storage/lmgr/predicate.c:1695 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "\"default_transaction_isolation\"が\"serializable\"に設定されました。" -#: storage/lmgr/predicate.c:1625 +#: storage/lmgr/predicate.c:1696 #, c-format msgid "You can use \"SET default_transaction_isolation = 'repeatable read'\" to change the default." msgstr "このデフォルトを変更するためには\"SET default_transaction_isolation = 'repeatable read'\"を使用することができます。" -#: storage/lmgr/predicate.c:1676 +#: storage/lmgr/predicate.c:1747 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "スナップショットをインポートするトランザクションはREAD ONLY DEFERRABLEではいけません" -#: storage/lmgr/predicate.c:1755 utils/time/snapmgr.c:618 utils/time/snapmgr.c:624 +#: storage/lmgr/predicate.c:1826 utils/time/snapmgr.c:569 utils/time/snapmgr.c:575 #, c-format msgid "could not import the requested snapshot" msgstr "要求したスナップショットをインポートできませんでした" -#: storage/lmgr/predicate.c:1756 utils/time/snapmgr.c:625 +#: storage/lmgr/predicate.c:1827 utils/time/snapmgr.c:576 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "PID%dであるソースプロセスは既に実行中ではありません。" -#: storage/lmgr/predicate.c:2402 storage/lmgr/predicate.c:2417 storage/lmgr/predicate.c:3899 +#: storage/lmgr/predicate.c:2473 storage/lmgr/predicate.c:2488 storage/lmgr/predicate.c:3970 #, c-format msgid "You might need to increase max_pred_locks_per_transaction." msgstr "max_pred_locks_per_transaction を増やす必要があるかもしれません" -#: storage/lmgr/predicate.c:4030 storage/lmgr/predicate.c:4066 storage/lmgr/predicate.c:4099 storage/lmgr/predicate.c:4107 storage/lmgr/predicate.c:4146 storage/lmgr/predicate.c:4388 storage/lmgr/predicate.c:4725 storage/lmgr/predicate.c:4737 storage/lmgr/predicate.c:4780 storage/lmgr/predicate.c:4818 +#: storage/lmgr/predicate.c:4101 storage/lmgr/predicate.c:4137 storage/lmgr/predicate.c:4170 storage/lmgr/predicate.c:4178 storage/lmgr/predicate.c:4217 storage/lmgr/predicate.c:4459 storage/lmgr/predicate.c:4796 storage/lmgr/predicate.c:4808 storage/lmgr/predicate.c:4851 storage/lmgr/predicate.c:4889 #, c-format msgid "could not serialize access due to read/write dependencies among transactions" msgstr "トランザクション間で read/write の依存性があったため、アクセスの直列化ができませんでした" -#: storage/lmgr/predicate.c:4032 storage/lmgr/predicate.c:4068 storage/lmgr/predicate.c:4101 storage/lmgr/predicate.c:4109 storage/lmgr/predicate.c:4148 storage/lmgr/predicate.c:4390 storage/lmgr/predicate.c:4727 storage/lmgr/predicate.c:4739 storage/lmgr/predicate.c:4782 storage/lmgr/predicate.c:4820 +#: storage/lmgr/predicate.c:4103 storage/lmgr/predicate.c:4139 storage/lmgr/predicate.c:4172 storage/lmgr/predicate.c:4180 storage/lmgr/predicate.c:4219 storage/lmgr/predicate.c:4461 storage/lmgr/predicate.c:4798 storage/lmgr/predicate.c:4810 storage/lmgr/predicate.c:4853 storage/lmgr/predicate.c:4891 #, c-format msgid "The transaction might succeed if retried." msgstr "リトライが行われた場合、このトランザクションは成功するかもしれません" @@ -19878,310 +21507,295 @@ msgstr "リトライが行われた場合、このトランザクションは成 msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" msgstr "要求されたスタンバイ接続が max_wal_senders を超えています(現在は %d)" -#: storage/lmgr/proc.c:1333 -#, c-format -msgid "Process %d waits for %s on %s." -msgstr "プロセス%dは%sを%sで待機しています。" - -#: storage/lmgr/proc.c:1344 -#, c-format -msgid "sending cancel to blocking autovacuum PID %d" -msgstr "ブロックしている自動VACUUMプロセスのPID %dへキャンセルを送付しています" - -#: storage/lmgr/proc.c:1464 +#: storage/lmgr/proc.c:1527 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "プロセス%1$dは、%4$ld.%5$03d ms後にキューの順番を再調整することで、%3$s上の%2$sに対するデッドロックを防ぎました。" -#: storage/lmgr/proc.c:1479 +#: storage/lmgr/proc.c:1542 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "プロセス%1$dは、%3$s上の%2$sに対し%4$ld.%5$03d ms待機するデッドロックを検知しました" -#: storage/lmgr/proc.c:1488 +#: storage/lmgr/proc.c:1551 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "プロセス%dは%sを%sで待機しています。%ld.%03dミリ秒後" -#: storage/lmgr/proc.c:1495 +#: storage/lmgr/proc.c:1558 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "プロセス%1$dは%4$ld.%5$03d ms後に%3$s上の%2$sを獲得しました" -#: storage/lmgr/proc.c:1511 +#: storage/lmgr/proc.c:1575 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "プロセス%1$dは%4$ld.%5$03d ms後に%3$s上で%2$sを獲得することに失敗しました" -#: storage/page/bufpage.c:145 +#: storage/page/bufpage.c:152 #, c-format msgid "page verification failed, calculated checksum %u but expected %u" msgstr "ページ検証が失敗しました。計算されたチェックサムは%uですが想定は%uです" -#: storage/page/bufpage.c:209 storage/page/bufpage.c:503 storage/page/bufpage.c:740 storage/page/bufpage.c:873 storage/page/bufpage.c:969 storage/page/bufpage.c:1081 +#: storage/page/bufpage.c:217 storage/page/bufpage.c:730 storage/page/bufpage.c:1073 storage/page/bufpage.c:1208 storage/page/bufpage.c:1314 storage/page/bufpage.c:1426 #, c-format msgid "corrupted page pointers: lower = %u, upper = %u, special = %u" msgstr "ページポインタが破損しています: lower = %u, upper = %u, special = %u\"" -#: storage/page/bufpage.c:525 +#: storage/page/bufpage.c:759 #, c-format msgid "corrupted line pointer: %u" msgstr "ラインポインタが破損しています: %u" -#: storage/page/bufpage.c:552 storage/page/bufpage.c:924 +#: storage/page/bufpage.c:789 storage/page/bufpage.c:1266 #, c-format msgid "corrupted item lengths: total %u, available space %u" msgstr "アイテム長が破損しています: 合計 %u 利用可能空間 %u" -#: storage/page/bufpage.c:759 storage/page/bufpage.c:897 storage/page/bufpage.c:985 storage/page/bufpage.c:1097 +#: storage/page/bufpage.c:1092 storage/page/bufpage.c:1233 storage/page/bufpage.c:1330 storage/page/bufpage.c:1442 #, c-format msgid "corrupted line pointer: offset = %u, size = %u" msgstr "ラインポインタが破損しています: オフセット = %u サイズ = %u" -#: storage/smgr/md.c:333 storage/smgr/md.c:836 -#, c-format -msgid "could not truncate file \"%s\": %m" -msgstr "ファイル\"%s\"の切り詰め処理ができませんでした: %m" - -#: storage/smgr/md.c:407 +#: storage/smgr/md.c:439 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "ファイル\"%s\"を%uブロック以上に拡張できません" -#: storage/smgr/md.c:422 +#: storage/smgr/md.c:454 #, c-format msgid "could not extend file \"%s\": %m" msgstr "ファイル\"%s\"を拡張できませんでした: %m" -#: storage/smgr/md.c:424 storage/smgr/md.c:431 storage/smgr/md.c:719 -#, c-format -msgid "Check free disk space." -msgstr "ディスクの空き容量をチェックしてください。" - -#: storage/smgr/md.c:428 +#: storage/smgr/md.c:460 #, c-format msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgstr "ファイル\"%1$s\"を拡張できませんでした: %4$uブロックで%3$dバイト中%2$dバイト分のみを書き出しました。" -#: storage/smgr/md.c:640 +#: storage/smgr/md.c:675 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "ファイル\"%2$s\"で%1$uブロックを読み取れませんでした: %3$m" -#: storage/smgr/md.c:656 +#: storage/smgr/md.c:691 #, c-format msgid "could not read block %u in file \"%s\": read only %d of %d bytes" msgstr "ファイル\"%2$s\"のブロック%1$uを読み取れませんでした: %4$dバイト中%3$dバイト分のみ読み取りました" -#: storage/smgr/md.c:710 +#: storage/smgr/md.c:745 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "ファイル\"%2$s\"で%1$uブロックが書き出せませんでした: %3$m" -#: storage/smgr/md.c:715 +#: storage/smgr/md.c:750 #, c-format msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" msgstr "ファイル\"%2$s\"のブロック%1$uを書き込めませんでした: %4$dバイト中%3$dバイト分のみ書き込みました" -#: storage/smgr/md.c:807 +#: storage/smgr/md.c:844 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "ファイル\"%s\"を%uブロックに切り詰められませんでした: 現在は%uブロックのみとなりました" -#: storage/smgr/md.c:862 +#: storage/smgr/md.c:899 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "ファイル\"%s\"を%uブロックに切り詰められませんでした: %m" -#: storage/smgr/md.c:957 -#, c-format -msgid "could not forward fsync request because request queue is full" -msgstr "リクエストキューが満杯につき fsync リクエストのフォワードができませんでした" - -#: storage/smgr/md.c:1256 +#: storage/smgr/md.c:1298 #, c-format msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" msgstr "ファイル\"%s\"(対象ブロック%u)をオープンできませんでした: 直前のセグメントは%uブロックだけでした" -#: storage/smgr/md.c:1270 +#: storage/smgr/md.c:1312 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "ファイル \"%s\"(対象ブロック %u)をオープンできませんでした: %m" -#: storage/sync/sync.c:401 -#, c-format -msgid "could not fsync file \"%s\" but retrying: %m" -msgstr "ファイル\"%s\"をfsyncできませんでした: %m" - -#: tcop/fastpath.c:109 tcop/fastpath.c:461 tcop/fastpath.c:591 +#: tcop/fastpath.c:148 #, c-format -msgid "invalid argument size %d in function call message" -msgstr "関数呼び出しメッセージ内の引数サイズ%dが不正です" +msgid "cannot call function \"%s\" via fastpath interface" +msgstr "関数\"%s\"は高速呼び出しインタフェースでの呼び出しはできません" -#: tcop/fastpath.c:307 +#: tcop/fastpath.c:233 #, c-format msgid "fastpath function call: \"%s\" (OID %u)" msgstr "近道関数呼び出し: \"%s\"(OID %u))" -#: tcop/fastpath.c:389 tcop/postgres.c:1323 tcop/postgres.c:1581 tcop/postgres.c:2013 tcop/postgres.c:2250 +#: tcop/fastpath.c:312 tcop/postgres.c:1334 tcop/postgres.c:1570 tcop/postgres.c:2029 tcop/postgres.c:2266 #, c-format msgid "duration: %s ms" msgstr "期間: %s ミリ秒" -#: tcop/fastpath.c:393 +#: tcop/fastpath.c:316 #, c-format msgid "duration: %s ms fastpath function call: \"%s\" (OID %u)" msgstr "期間: %sミリ秒 ファストパス関数呼び出し: \"%s\" (OID %u)" -#: tcop/fastpath.c:429 tcop/fastpath.c:556 +#: tcop/fastpath.c:352 #, c-format msgid "function call message contains %d arguments but function requires %d" msgstr "関数呼び出しメッセージには%d引数ありましたが、関数には%d必要です" -#: tcop/fastpath.c:437 +#: tcop/fastpath.c:360 #, c-format msgid "function call message contains %d argument formats but %d arguments" msgstr "関数呼び出しメッセージには%dの引数書式がありましたが、引数は%dでした" -#: tcop/fastpath.c:524 tcop/fastpath.c:607 +#: tcop/fastpath.c:384 #, c-format -msgid "incorrect binary data format in function argument %d" -msgstr "関数引数%dのバイナリデータ書式が不正です" +msgid "invalid argument size %d in function call message" +msgstr "関数呼び出しメッセージ内の引数サイズ%dが不正です" -#: tcop/postgres.c:355 tcop/postgres.c:391 tcop/postgres.c:418 +#: tcop/fastpath.c:447 #, c-format -msgid "unexpected EOF on client connection" -msgstr "クライアント接続に想定外のEOFがありました" +msgid "incorrect binary data format in function argument %d" +msgstr "関数引数%dのバイナリデータ書式が不正です" -#: tcop/postgres.c:441 tcop/postgres.c:453 tcop/postgres.c:464 tcop/postgres.c:476 tcop/postgres.c:4539 +#: tcop/postgres.c:444 tcop/postgres.c:4772 #, c-format msgid "invalid frontend message type %d" msgstr "フロントエンドメッセージタイプ%dが不正です" -#: tcop/postgres.c:1042 +#: tcop/postgres.c:1051 #, c-format msgid "statement: %s" msgstr "文: %s" -#: tcop/postgres.c:1328 +#: tcop/postgres.c:1339 #, c-format msgid "duration: %s ms statement: %s" msgstr "期間: %s ミリ秒 文: %s" -#: tcop/postgres.c:1377 -#, c-format -msgid "parse %s: %s" -msgstr "パース %s: %s" - -#: tcop/postgres.c:1434 +#: tcop/postgres.c:1445 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "準備された文に複数のコマンドを挿入できません" -#: tcop/postgres.c:1586 +#: tcop/postgres.c:1575 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "期間: %s ミリ秒 パース%s : %s" -#: tcop/postgres.c:1633 -#, c-format -msgid "bind %s to %s" -msgstr "バインド%s: %s" - -#: tcop/postgres.c:1652 tcop/postgres.c:2516 +#: tcop/postgres.c:1641 tcop/postgres.c:2581 #, c-format msgid "unnamed prepared statement does not exist" msgstr "無名の準備された文が存在しません" -#: tcop/postgres.c:1693 +#: tcop/postgres.c:1682 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "バインドメッセージは%dパラメータ書式ありましたがパラメータは%dでした" -#: tcop/postgres.c:1699 +#: tcop/postgres.c:1688 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "バインドメッセージは%dパラメータを提供しましたが、準備された文\"%s\"では%d必要でした" -#: tcop/postgres.c:1897 +#: tcop/postgres.c:1907 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "バインドパラメータ%dにおいてバイナリデータ書式が不正です" -#: tcop/postgres.c:2018 +#: tcop/postgres.c:2034 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "期間: %s ミリ秒 バインド %s%s%s: %s" -#: tcop/postgres.c:2068 tcop/postgres.c:2600 +#: tcop/postgres.c:2084 tcop/postgres.c:2664 #, c-format msgid "portal \"%s\" does not exist" msgstr "ポータル\"%s\"は存在しません" -#: tcop/postgres.c:2153 +#: tcop/postgres.c:2169 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2155 tcop/postgres.c:2258 +#: tcop/postgres.c:2171 tcop/postgres.c:2274 msgid "execute fetch from" msgstr "取り出し実行" -#: tcop/postgres.c:2156 tcop/postgres.c:2259 +#: tcop/postgres.c:2172 tcop/postgres.c:2275 msgid "execute" msgstr "実行" -#: tcop/postgres.c:2255 +#: tcop/postgres.c:2271 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "期間: %s ミリ秒 %s %s%s%s: %s" -#: tcop/postgres.c:2401 +#: tcop/postgres.c:2417 #, c-format msgid "prepare: %s" msgstr "準備: %s" -#: tcop/postgres.c:2426 +#: tcop/postgres.c:2442 #, c-format msgid "parameters: %s" msgstr "パラメータ: %s" -#: tcop/postgres.c:2441 +#: tcop/postgres.c:2457 #, c-format msgid "abort reason: recovery conflict" msgstr "異常終了の理由: リカバリが衝突したため" -#: tcop/postgres.c:2457 +#: tcop/postgres.c:2473 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "ユーザが共有バッファ・ピンを長く保持し過ぎていました" -#: tcop/postgres.c:2460 +#: tcop/postgres.c:2476 #, c-format msgid "User was holding a relation lock for too long." msgstr "ユーザリレーションのロックを長く保持し過ぎていました" -#: tcop/postgres.c:2463 +#: tcop/postgres.c:2479 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "削除されるべきテーブルスペースをユーザが使っていました(もしくはその可能性がありました)。" -#: tcop/postgres.c:2466 +#: tcop/postgres.c:2482 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "削除されるべきバージョンの行をユーザ問い合わせが参照しなければならなかった可能性がありました。" -#: tcop/postgres.c:2472 +#: tcop/postgres.c:2488 #, c-format msgid "User was connected to a database that must be dropped." msgstr "削除されるべきデータベースにユーザが接続していました。" -#: tcop/postgres.c:2796 +#: tcop/postgres.c:2527 +#, c-format +msgid "portal \"%s\" parameter $%d = %s" +msgstr "ポータル\"%s\" パラメータ$%d = %s" + +#: tcop/postgres.c:2530 +#, c-format +msgid "portal \"%s\" parameter $%d" +msgstr "ポータル\"%s\" パラメータ $%d" + +#: tcop/postgres.c:2536 +#, c-format +msgid "unnamed portal parameter $%d = %s" +msgstr "無名ポータルパラメータ $%d = %s" + +#: tcop/postgres.c:2539 +#, c-format +msgid "unnamed portal parameter $%d" +msgstr "無名ポータルパラメータ $%d" + +#: tcop/postgres.c:2884 +#, c-format +msgid "terminating connection because of unexpected SIGQUIT signal" +msgstr "予期しないSIGQUITシグナルによりコネクションを終了します" + +#: tcop/postgres.c:2890 #, c-format msgid "terminating connection because of crash of another server process" msgstr "他のサーバプロセスがクラッシュしたため接続を終了します" -#: tcop/postgres.c:2797 +#: tcop/postgres.c:2891 #, c-format msgid "The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory." msgstr "" @@ -20189,191 +21803,202 @@ msgstr "" "postmasterはこのサーバプロセスに対し、現在のトランザクションをロールバック\n" "し終了するよう指示しました。" -#: tcop/postgres.c:2801 tcop/postgres.c:3107 +#: tcop/postgres.c:2895 tcop/postgres.c:3256 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "この後、データベースに再接続し、コマンドを繰り返さなければなりません。" -#: tcop/postgres.c:2883 +#: tcop/postgres.c:2902 +#, c-format +msgid "terminating connection due to immediate shutdown command" +msgstr "即時シャットダウンコマンドによりコネクションを終了します" + +#: tcop/postgres.c:2988 #, c-format msgid "floating-point exception" msgstr "浮動小数点例外" -#: tcop/postgres.c:2884 +#: tcop/postgres.c:2989 #, c-format msgid "An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, such as division by zero." msgstr "不正な浮動小数点演算がシグナルされました。おそらくこれは、範囲外の結果もしくは0除算のような不正な演算によるものです。" -#: tcop/postgres.c:3037 +#: tcop/postgres.c:3160 #, c-format msgid "canceling authentication due to timeout" msgstr "タイムアウトにより認証処理をキャンセルしています" -#: tcop/postgres.c:3041 +#: tcop/postgres.c:3164 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "管理者コマンドにより自動VACUUM処理を終了しています" -#: tcop/postgres.c:3045 +#: tcop/postgres.c:3168 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "管理者コマンドにより、論理レプリケーションワーカを終了します" -#: tcop/postgres.c:3049 -#, c-format -msgid "logical replication launcher shutting down" -msgstr "論理レプリケーションランチャを停止します" - -#: tcop/postgres.c:3062 tcop/postgres.c:3072 tcop/postgres.c:3105 +#: tcop/postgres.c:3185 tcop/postgres.c:3195 tcop/postgres.c:3254 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "リカバリで競合が発生したため、接続を終了しています" -#: tcop/postgres.c:3078 +#: tcop/postgres.c:3206 #, c-format msgid "terminating connection due to administrator command" msgstr "管理者コマンドにより接続を終了しています" -#: tcop/postgres.c:3088 +#: tcop/postgres.c:3237 #, c-format msgid "connection to client lost" msgstr "クライアントへの接続が切れました。" -#: tcop/postgres.c:3154 +#: tcop/postgres.c:3307 #, c-format msgid "canceling statement due to lock timeout" msgstr "ロックのタイムアウトのためステートメントをキャンセルしています" -#: tcop/postgres.c:3161 +#: tcop/postgres.c:3314 #, c-format msgid "canceling statement due to statement timeout" msgstr "ステートメントのタイムアウトのためステートメントをキャンセルしています" -#: tcop/postgres.c:3168 +#: tcop/postgres.c:3321 #, c-format msgid "canceling autovacuum task" msgstr "自動VACUUM処理をキャンセルしています" -#: tcop/postgres.c:3191 +#: tcop/postgres.c:3344 #, c-format msgid "canceling statement due to user request" msgstr "ユーザからの要求により文をキャンセルしています" -#: tcop/postgres.c:3201 +#: tcop/postgres.c:3358 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "トランザクション中アイドルタイムアウトのため接続を終了します" -#: tcop/postgres.c:3318 +#: tcop/postgres.c:3369 +#, c-format +msgid "terminating connection due to idle-session timeout" +msgstr "アイドルセッションタイムアウトにより接続を終了します" + +#: tcop/postgres.c:3506 #, c-format msgid "stack depth limit exceeded" msgstr "スタック長制限を越えました" -#: tcop/postgres.c:3319 +#: tcop/postgres.c:3507 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "お使いのプラットフォームにおけるスタック長の制限に適合することを確認後、設定パラメータ \"max_stack_depth\"(現在 %dkB)を増やしてください。" -#: tcop/postgres.c:3382 +#: tcop/postgres.c:3570 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "\"max_stack_depth\"は%ldkBを越えてはなりません。" -#: tcop/postgres.c:3384 +#: tcop/postgres.c:3572 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "プラットフォームのスタック長制限を\"ulimit -s\"または同等の機能を使用して増加してください" -#: tcop/postgres.c:3744 +#: tcop/postgres.c:3928 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "サーバプロセスに対する不正なコマンドライン引数: %s" -#: tcop/postgres.c:3745 tcop/postgres.c:3751 +#: tcop/postgres.c:3929 tcop/postgres.c:3935 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細は\"%s --help\"を実行してください。" -#: tcop/postgres.c:3749 +#: tcop/postgres.c:3933 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: 不正なコマンドライン引数: %s" -#: tcop/postgres.c:3811 +#: tcop/postgres.c:3986 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: データベース名もユーザ名も指定されていません" -#: tcop/postgres.c:4447 +#: tcop/postgres.c:4674 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "不正なCLOSEメッセージのサブタイプ%d" -#: tcop/postgres.c:4482 +#: tcop/postgres.c:4709 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "不正なDESCRIBEメッセージのサブタイプ%d" -#: tcop/postgres.c:4560 +#: tcop/postgres.c:4793 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "レプリケーション接続では高速関数呼び出しはサポートされていません" -#: tcop/postgres.c:4564 +#: tcop/postgres.c:4797 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "レプリケーション接続では拡張問い合わせプロトコルはサポートされていません" -#: tcop/postgres.c:4741 +#: tcop/postgres.c:4974 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" msgstr "接続を切断: セッション時間: %d:%02d:%02d.%03d ユーザ=%s データベース=%s ホスト=%s%s%s" -#: tcop/pquery.c:629 +#: tcop/pquery.c:641 #, c-format msgid "bind message has %d result formats but query has %d columns" msgstr "バインドメッセージは%dの結果書式がありましたが、問い合わせは%d列でした" -#: tcop/pquery.c:932 +#: tcop/pquery.c:944 tcop/pquery.c:1701 #, c-format msgid "cursor can only scan forward" msgstr "カーゾルは前方へのスキャンしかできません" -#: tcop/pquery.c:933 +#: tcop/pquery.c:945 tcop/pquery.c:1702 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "後方スキャンを有効にするためにはSCROLLオプションを付けて宣言してください。" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:413 +#: tcop/utility.c:417 #, c-format msgid "cannot execute %s in a read-only transaction" msgstr "リードオンリーのトランザクションでは %s を実行できません" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:431 +#: tcop/utility.c:435 #, c-format msgid "cannot execute %s during a parallel operation" msgstr "並列処理中は%sを実行できません" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:450 +#: tcop/utility.c:454 #, c-format msgid "cannot execute %s during recovery" msgstr "リカバリ中は %s を実行できません" #. translator: %s is name of a SQL command, eg PREPARE -#: tcop/utility.c:468 +#: tcop/utility.c:472 #, c-format msgid "cannot execute %s within security-restricted operation" msgstr "セキュリティー制限操作の中では %s を実行できません" -#: tcop/utility.c:912 +#. translator: %s is name of a SQL command, eg LISTEN +#: tcop/utility.c:828 #, c-format -msgid "must be superuser to do CHECKPOINT" -msgstr "CHECKPOINTを実行するにはスーパユーザである必要があります" +msgid "cannot execute %s within a background process" +msgstr "バックグラウンドプロセス内で%sを実行することはできません" -#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:620 +#: tcop/utility.c:953 +#, c-format +msgid "must be superuser or have privileges of pg_checkpointer to do CHECKPOINT" +msgstr "CHECKPOINTを実行するにはスーパーユーザーであるか、またはpg_checkpointerの権限を持つ必要があります" + +#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 #, c-format msgid "multiple DictFile parameters" msgstr "重複するDictFileパラメータ" @@ -20393,7 +22018,7 @@ msgstr "認識不可のIspellパラメータ: \"%s\"" msgid "missing AffFile parameter" msgstr "AffFileパラメータがありません" -#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:644 +#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:639 #, c-format msgid "missing DictFile parameter" msgstr "DictFileパラメータがありません" @@ -20443,62 +22068,62 @@ msgstr "想定外の行末もしくは単語の終端です" msgid "unexpected end of line" msgstr "想定外の行末です" -#: tsearch/dict_thesaurus.c:297 +#: tsearch/dict_thesaurus.c:292 #, c-format msgid "too many lexemes in thesaurus entry" msgstr "シソーラス要素中の語彙素が多すぎます" -#: tsearch/dict_thesaurus.c:421 +#: tsearch/dict_thesaurus.c:416 #, c-format msgid "thesaurus sample word \"%s\" isn't recognized by subdictionary (rule %d)" msgstr "シソーラスサンプル単語\"%s\"は副辞書で認識されません(規則%d)" -#: tsearch/dict_thesaurus.c:427 +#: tsearch/dict_thesaurus.c:422 #, c-format msgid "thesaurus sample word \"%s\" is a stop word (rule %d)" msgstr "シソーラスサンプル単語\"%s\"はストップワードです(規則%d)" -#: tsearch/dict_thesaurus.c:430 +#: tsearch/dict_thesaurus.c:425 #, c-format msgid "Use \"?\" to represent a stop word within a sample phrase." msgstr "サンプルフレーズ内のストップワードを表すには\"?\"を使用してください" -#: tsearch/dict_thesaurus.c:572 +#: tsearch/dict_thesaurus.c:567 #, c-format msgid "thesaurus substitute word \"%s\" is a stop word (rule %d)" msgstr "シソーラス置換単語\"%s\"はストップワードです(規則%d)" -#: tsearch/dict_thesaurus.c:579 +#: tsearch/dict_thesaurus.c:574 #, c-format msgid "thesaurus substitute word \"%s\" isn't recognized by subdictionary (rule %d)" msgstr "シソーラス置換単語\"%s\"は副辞書で認識されません(規則%d)" -#: tsearch/dict_thesaurus.c:591 +#: tsearch/dict_thesaurus.c:586 #, c-format msgid "thesaurus substitute phrase is empty (rule %d)" msgstr "シソーラス置換フレーズは空です(規則%d)" -#: tsearch/dict_thesaurus.c:629 +#: tsearch/dict_thesaurus.c:624 #, c-format msgid "multiple Dictionary parameters" msgstr "重複する辞書パラメータ" -#: tsearch/dict_thesaurus.c:636 +#: tsearch/dict_thesaurus.c:631 #, c-format msgid "unrecognized Thesaurus parameter: \"%s\"" msgstr "認識できないシソーラスパラメータ \"%s\"" -#: tsearch/dict_thesaurus.c:648 +#: tsearch/dict_thesaurus.c:643 #, c-format msgid "missing Dictionary parameter" msgstr "Dictionaryパラメータがありません" -#: tsearch/spell.c:380 tsearch/spell.c:397 tsearch/spell.c:406 tsearch/spell.c:1036 +#: tsearch/spell.c:380 tsearch/spell.c:397 tsearch/spell.c:406 tsearch/spell.c:1062 #, c-format msgid "invalid affix flag \"%s\"" msgstr "不正な接辞フラグ\"%s\"" -#: tsearch/spell.c:384 tsearch/spell.c:1040 +#: tsearch/spell.c:384 tsearch/spell.c:1066 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "接辞フラグ\"%s\"は範囲外です" @@ -20518,52 +22143,52 @@ msgstr "\"long\"フラグ値を伴った不正な接辞フラグ\"%s\"" msgid "could not open dictionary file \"%s\": %m" msgstr "辞書ファイル\"%s\"をオープンできませんでした: %m" -#: tsearch/spell.c:742 utils/adt/regexp.c:208 +#: tsearch/spell.c:763 utils/adt/regexp.c:209 #, c-format msgid "invalid regular expression: %s" msgstr "正規表現が不正です: %s" -#: tsearch/spell.c:1163 tsearch/spell.c:1175 tsearch/spell.c:1734 tsearch/spell.c:1739 tsearch/spell.c:1744 +#: tsearch/spell.c:1189 tsearch/spell.c:1201 tsearch/spell.c:1761 tsearch/spell.c:1766 tsearch/spell.c:1771 #, c-format msgid "invalid affix alias \"%s\"" msgstr "不正な接辞の別名 \"%s\"" -#: tsearch/spell.c:1216 tsearch/spell.c:1287 tsearch/spell.c:1436 +#: tsearch/spell.c:1242 tsearch/spell.c:1313 tsearch/spell.c:1462 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "affixファイル\"%s\"をオープンできませんでした: %m" -#: tsearch/spell.c:1270 +#: tsearch/spell.c:1296 #, c-format msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" msgstr "Ispell辞書はフラグ値\"default\"、\"long\"および\"num\"のみをサポートします" -#: tsearch/spell.c:1314 +#: tsearch/spell.c:1340 #, c-format msgid "invalid number of flag vector aliases" msgstr "不正な数のフラグベクタの別名" -#: tsearch/spell.c:1337 +#: tsearch/spell.c:1363 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "別名の数が指定された数 %d を超えています" -#: tsearch/spell.c:1552 +#: tsearch/spell.c:1578 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "接辞ファイルが新旧両方の形式のコマンドを含んでいます" -#: tsearch/to_tsany.c:185 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1121 +#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1127 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "TSベクターのための文字列が長すぎます(%dバイト、最大は%dバイト)" -#: tsearch/ts_locale.c:185 +#: tsearch/ts_locale.c:227 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "設定ファイル\"%2$s\"の%1$d行目: \"%3$s\"" -#: tsearch/ts_locale.c:302 +#: tsearch/ts_locale.c:307 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "wchar_tからサーバ符号化方式への変換が失敗しました: %m" @@ -20595,145 +22220,200 @@ msgstr "テキスト検索パーサは見出し作成をサポートしません #: tsearch/wparser_def.c:2578 #, c-format -msgid "unrecognized headline parameter: \"%s\"" -msgstr "認識できない見出しパラメータ: \"%s\"" +msgid "unrecognized headline parameter: \"%s\"" +msgstr "認識できない見出しパラメータ: \"%s\"" + +#: tsearch/wparser_def.c:2597 +#, c-format +msgid "MinWords should be less than MaxWords" +msgstr "MinWordsはMaxWordsより小さくなければなりません" + +#: tsearch/wparser_def.c:2601 +#, c-format +msgid "MinWords should be positive" +msgstr "MinWordsは正でなければなりません" + +#: tsearch/wparser_def.c:2605 +#, c-format +msgid "ShortWord should be >= 0" +msgstr "ShortWordは>= 0でなければなりません" + +#: tsearch/wparser_def.c:2609 +#, c-format +msgid "MaxFragments should be >= 0" +msgstr "MaxFragments は 0 以上でなければなりません" + +#: utils/activity/pgstat.c:420 +#, c-format +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "永続統計情報ファイル\"%s\"をunlinkできませんでした: %m" + +#: utils/activity/pgstat.c:427 +#, c-format +msgid "unlinked permanent statistics file \"%s\"" +msgstr "unlinkされた統計情報ファイル \"%s\"" + +#: utils/activity/pgstat.c:1199 +#, c-format +msgid "invalid statistics kind: \"%s\"" +msgstr "不正な統計情報種別: \"%s\"" + +#: utils/activity/pgstat.c:1279 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "一時統計情報ファイル\"%s\"をオープンできませんでした: %m" + +#: utils/activity/pgstat.c:1385 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "一時統計情報ファイル\"%s\"に書き込みできませんでした: %m" + +#: utils/activity/pgstat.c:1394 +#, c-format +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "一時統計情報ファイル\"%s\"をクローズできませんでした: %m" + +#: utils/activity/pgstat.c:1402 +#, c-format +msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" +msgstr "一時統計情報ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" -#: tsearch/wparser_def.c:2597 +#: utils/activity/pgstat.c:1451 #, c-format -msgid "MinWords should be less than MaxWords" -msgstr "MinWordsはMaxWordsより小さくなければなりません" +msgid "could not open statistics file \"%s\": %m" +msgstr "統計情報ファイル\"%s\"をオープンできませんでした: %m" -#: tsearch/wparser_def.c:2601 +#: utils/activity/pgstat.c:1607 #, c-format -msgid "MinWords should be positive" -msgstr "MinWordsは正でなければなりません" +msgid "corrupted statistics file \"%s\"" +msgstr "統計情報ファイル\"%s\"が破損しています" -#: tsearch/wparser_def.c:2605 +#: utils/activity/pgstat_function.c:118 #, c-format -msgid "ShortWord should be >= 0" -msgstr "ShortWordは>= 0でなければなりません" +msgid "function call to dropped function" +msgstr "削除された関数の呼び出し" -#: tsearch/wparser_def.c:2609 +#: utils/activity/pgstat_xact.c:371 #, c-format -msgid "MaxFragments should be >= 0" -msgstr "MaxFragments は 0 以上でなければなりません" +msgid "resetting existing stats for type %s, db=%u, oid=%u" +msgstr "タイプ%s、db=%u、oid=%uの既存統計情報をリセットします" -#: utils/adt/acl.c:172 utils/adt/name.c:93 +#: utils/adt/acl.c:168 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "識別子が長すぎます" -#: utils/adt/acl.c:173 utils/adt/name.c:94 +#: utils/adt/acl.c:169 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "識別子は%d文字より短くなければなりません。" -#: utils/adt/acl.c:256 +#: utils/adt/acl.c:252 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "キーワードが不明です: \"%s\"" -#: utils/adt/acl.c:257 +#: utils/adt/acl.c:253 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "ACLキーワードは\"group\"または\"user\"でなければなりません。" -#: utils/adt/acl.c:262 +#: utils/adt/acl.c:258 #, c-format msgid "missing name" msgstr "名前がありません" -#: utils/adt/acl.c:263 +#: utils/adt/acl.c:259 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "\"group\"または\"user\"キーワードの後には名前が必要です。" -#: utils/adt/acl.c:269 +#: utils/adt/acl.c:265 #, c-format msgid "missing \"=\" sign" msgstr "\"=\"記号がありません" -#: utils/adt/acl.c:322 +#: utils/adt/acl.c:324 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "不正なモード文字: \"%s\"の一つでなければなりません" -#: utils/adt/acl.c:344 +#: utils/adt/acl.c:346 #, c-format msgid "a name must follow the \"/\" sign" msgstr "\"/\"記号の後には名前が必要です" -#: utils/adt/acl.c:352 +#: utils/adt/acl.c:354 #, c-format msgid "defaulting grantor to user ID %u" msgstr "権限付与者をデフォルトのユーザID %uにしています" -#: utils/adt/acl.c:538 +#: utils/adt/acl.c:540 #, c-format msgid "ACL array contains wrong data type" msgstr "ACL配列に不正なデータ型があります。" -#: utils/adt/acl.c:542 +#: utils/adt/acl.c:544 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "ACL配列は1次元の配列でなければなりません" -#: utils/adt/acl.c:546 +#: utils/adt/acl.c:548 #, c-format msgid "ACL arrays must not contain null values" msgstr "ACL配列にはNULL値を含めてはいけません" -#: utils/adt/acl.c:570 +#: utils/adt/acl.c:572 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "ACL指定の後に余計なごみがあります" -#: utils/adt/acl.c:1205 +#: utils/adt/acl.c:1214 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "グラントオプションでその権限付与者に権限を戻すことはできません" -#: utils/adt/acl.c:1266 +#: utils/adt/acl.c:1275 #, c-format msgid "dependent privileges exist" msgstr "依存する権限が存在します" -#: utils/adt/acl.c:1267 +#: utils/adt/acl.c:1276 #, c-format msgid "Use CASCADE to revoke them too." msgstr "これらも取り上げるにはCASCADEを使用してください" -#: utils/adt/acl.c:1521 +#: utils/adt/acl.c:1530 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsertはもうサポートされていません" -#: utils/adt/acl.c:1531 +#: utils/adt/acl.c:1540 #, c-format msgid "aclremove is no longer supported" msgstr "aclremoveはもうサポートされていません" -#: utils/adt/acl.c:1617 utils/adt/acl.c:1671 +#: utils/adt/acl.c:1630 utils/adt/acl.c:1684 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "権限タイプが不明です: \"%s\"" -#: utils/adt/acl.c:3471 utils/adt/regproc.c:101 utils/adt/regproc.c:276 +#: utils/adt/acl.c:3469 utils/adt/regproc.c:101 utils/adt/regproc.c:277 #, c-format msgid "function \"%s\" does not exist" msgstr "関数\"%s\"は存在しません" -#: utils/adt/acl.c:4943 +#: utils/adt/acl.c:5008 #, c-format msgid "must be member of role \"%s\"" msgstr "ロール\"%s\"のメンバでなければなりません" -#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:933 utils/adt/arrayfuncs.c:1554 utils/adt/arrayfuncs.c:3257 utils/adt/arrayfuncs.c:3397 utils/adt/arrayfuncs.c:5932 utils/adt/arrayfuncs.c:6273 utils/adt/arrayutils.c:93 utils/adt/arrayutils.c:102 utils/adt/arrayutils.c:109 +#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:936 utils/adt/arrayfuncs.c:1544 utils/adt/arrayfuncs.c:3263 utils/adt/arrayfuncs.c:3405 utils/adt/arrayfuncs.c:5980 utils/adt/arrayfuncs.c:6321 utils/adt/arrayutils.c:94 utils/adt/arrayutils.c:103 utils/adt/arrayutils.c:110 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "配列の次数が上限(%d)を超えています" -#: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:466 utils/adt/array_userfuncs.c:546 utils/adt/json.c:645 utils/adt/json.c:740 utils/adt/json.c:778 utils/adt/jsonb.c:1115 utils/adt/jsonb.c:1144 utils/adt/jsonb.c:1538 utils/adt/jsonb.c:1702 utils/adt/jsonb.c:1712 +#: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:467 utils/adt/array_userfuncs.c:547 utils/adt/json.c:667 utils/adt/json.c:803 utils/adt/json.c:837 utils/adt/jsonb.c:1104 utils/adt/jsonb.c:1177 utils/adt/jsonb.c:1596 utils/adt/jsonb.c:1783 utils/adt/jsonb.c:1793 #, c-format msgid "could not determine input data type" msgstr "入力データ型を特定できませんでした" @@ -20743,8 +22423,8 @@ msgstr "入力データ型を特定できませんでした" msgid "input data type is not an array" msgstr "入力データ型は配列ではありません" -#: utils/adt/array_userfuncs.c:129 utils/adt/array_userfuncs.c:181 utils/adt/arrayfuncs.c:1357 utils/adt/float.c:1233 utils/adt/float.c:1307 utils/adt/float.c:4052 utils/adt/float.c:4066 utils/adt/int.c:757 utils/adt/int.c:779 utils/adt/int.c:793 utils/adt/int.c:807 utils/adt/int.c:838 utils/adt/int.c:859 utils/adt/int.c:976 utils/adt/int.c:990 utils/adt/int.c:1004 utils/adt/int.c:1037 utils/adt/int.c:1051 utils/adt/int.c:1065 utils/adt/int.c:1096 -#: utils/adt/int.c:1178 utils/adt/int.c:1242 utils/adt/int.c:1310 utils/adt/int.c:1316 utils/adt/int8.c:1299 utils/adt/numeric.c:1774 utils/adt/numeric.c:4138 utils/adt/varbit.c:1188 utils/adt/varbit.c:1576 utils/adt/varlena.c:1087 utils/adt/varlena.c:3377 +#: utils/adt/array_userfuncs.c:129 utils/adt/array_userfuncs.c:181 utils/adt/float.c:1234 utils/adt/float.c:1308 utils/adt/float.c:4046 utils/adt/float.c:4060 utils/adt/int.c:781 utils/adt/int.c:803 utils/adt/int.c:817 utils/adt/int.c:831 utils/adt/int.c:862 utils/adt/int.c:883 utils/adt/int.c:1000 utils/adt/int.c:1014 utils/adt/int.c:1028 utils/adt/int.c:1061 utils/adt/int.c:1075 utils/adt/int.c:1089 utils/adt/int.c:1120 utils/adt/int.c:1202 utils/adt/int.c:1266 +#: utils/adt/int.c:1334 utils/adt/int.c:1340 utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4265 utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 utils/adt/varlena.c:3395 #, c-format msgid "integer out of range" msgstr "integerの範囲外です" @@ -20779,243 +22459,263 @@ msgstr "異なる要素次数の配列の連結には互換性がありません msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "異なる次数の配列の連結には互換性がありません。" -#: utils/adt/array_userfuncs.c:662 utils/adt/array_userfuncs.c:814 +#: utils/adt/array_userfuncs.c:663 utils/adt/array_userfuncs.c:815 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "多次元配列内の要素の検索はサポートされません" -#: utils/adt/array_userfuncs.c:686 +#: utils/adt/array_userfuncs.c:687 #, c-format msgid "initial position must not be null" msgstr "初期位置nullであってはなりません" -#: utils/adt/arrayfuncs.c:270 utils/adt/arrayfuncs.c:284 utils/adt/arrayfuncs.c:295 utils/adt/arrayfuncs.c:317 utils/adt/arrayfuncs.c:332 utils/adt/arrayfuncs.c:346 utils/adt/arrayfuncs.c:352 utils/adt/arrayfuncs.c:359 utils/adt/arrayfuncs.c:490 utils/adt/arrayfuncs.c:506 utils/adt/arrayfuncs.c:517 utils/adt/arrayfuncs.c:532 utils/adt/arrayfuncs.c:553 utils/adt/arrayfuncs.c:583 utils/adt/arrayfuncs.c:590 utils/adt/arrayfuncs.c:598 utils/adt/arrayfuncs.c:632 -#: utils/adt/arrayfuncs.c:655 utils/adt/arrayfuncs.c:675 utils/adt/arrayfuncs.c:787 utils/adt/arrayfuncs.c:796 utils/adt/arrayfuncs.c:826 utils/adt/arrayfuncs.c:841 utils/adt/arrayfuncs.c:894 +#: utils/adt/arrayfuncs.c:271 utils/adt/arrayfuncs.c:285 utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:318 utils/adt/arrayfuncs.c:333 utils/adt/arrayfuncs.c:347 utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 utils/adt/arrayfuncs.c:493 utils/adt/arrayfuncs.c:509 utils/adt/arrayfuncs.c:520 utils/adt/arrayfuncs.c:535 utils/adt/arrayfuncs.c:556 utils/adt/arrayfuncs.c:586 utils/adt/arrayfuncs.c:593 utils/adt/arrayfuncs.c:601 utils/adt/arrayfuncs.c:635 +#: utils/adt/arrayfuncs.c:658 utils/adt/arrayfuncs.c:678 utils/adt/arrayfuncs.c:790 utils/adt/arrayfuncs.c:799 utils/adt/arrayfuncs.c:829 utils/adt/arrayfuncs.c:844 utils/adt/arrayfuncs.c:897 #, c-format msgid "malformed array literal: \"%s\"" msgstr "配列リテラルの書式が誤っています: \"%s\"" -#: utils/adt/arrayfuncs.c:271 +#: utils/adt/arrayfuncs.c:272 #, c-format msgid "\"[\" must introduce explicitly-specified array dimensions." msgstr "\"[\"は配列次元の明示的な指定の先頭である必要があります。" -#: utils/adt/arrayfuncs.c:285 +#: utils/adt/arrayfuncs.c:286 #, c-format msgid "Missing array dimension value." msgstr "配列の次元数の値がありません。" -#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:333 +#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "配列の次元の後に\"%s\"がありません。" -#: utils/adt/arrayfuncs.c:305 utils/adt/arrayfuncs.c:2905 utils/adt/arrayfuncs.c:2937 utils/adt/arrayfuncs.c:2952 +#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2910 utils/adt/arrayfuncs.c:2942 utils/adt/arrayfuncs.c:2957 #, c-format msgid "upper bound cannot be less than lower bound" msgstr "上限を下限より小さくすることはできません" -#: utils/adt/arrayfuncs.c:318 +#: utils/adt/arrayfuncs.c:319 #, c-format msgid "Array value must start with \"{\" or dimension information." msgstr "配列値は\"{\"または次元情報から始まる必要があります。" -#: utils/adt/arrayfuncs.c:347 +#: utils/adt/arrayfuncs.c:348 #, c-format msgid "Array contents must start with \"{\"." msgstr "配列の内容は\"{\"で始まる必要があります。" -#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 +#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 #, c-format msgid "Specified array dimensions do not match array contents." msgstr "指定された配列の次元数が配列の内容と合致していません。" -#: utils/adt/arrayfuncs.c:491 utils/adt/arrayfuncs.c:518 utils/adt/rangetypes.c:2181 utils/adt/rangetypes.c:2189 utils/adt/rowtypes.c:210 utils/adt/rowtypes.c:218 +#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:521 utils/adt/multirangetypes.c:164 utils/adt/rangetypes.c:2310 utils/adt/rangetypes.c:2318 utils/adt/rowtypes.c:211 utils/adt/rowtypes.c:219 #, c-format msgid "Unexpected end of input." msgstr "想定外の入力の終端。" -#: utils/adt/arrayfuncs.c:507 utils/adt/arrayfuncs.c:554 utils/adt/arrayfuncs.c:584 utils/adt/arrayfuncs.c:633 +#: utils/adt/arrayfuncs.c:510 utils/adt/arrayfuncs.c:557 utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 #, c-format msgid "Unexpected \"%c\" character." msgstr "想定外の文字\"%c\"。" -#: utils/adt/arrayfuncs.c:533 utils/adt/arrayfuncs.c:656 +#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 #, c-format msgid "Unexpected array element." msgstr "想定外の配列要素。" -#: utils/adt/arrayfuncs.c:591 +#: utils/adt/arrayfuncs.c:594 #, c-format msgid "Unmatched \"%c\" character." msgstr "対応しない\"%c\"文字。" -#: utils/adt/arrayfuncs.c:599 utils/adt/jsonfuncs.c:2452 +#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2482 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "多次元配列は合致する次元の副配列を持たなければなりません。" -#: utils/adt/arrayfuncs.c:676 +#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:287 #, c-format msgid "Junk after closing right brace." -msgstr "右括弧の後にごみがあります。" +msgstr "右大括弧の後にごみがあります。" -#: utils/adt/arrayfuncs.c:1298 utils/adt/arrayfuncs.c:3365 utils/adt/arrayfuncs.c:5838 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3371 utils/adt/arrayfuncs.c:5884 #, c-format msgid "invalid number of dimensions: %d" msgstr "不正な次元数: %d" -#: utils/adt/arrayfuncs.c:1309 +#: utils/adt/arrayfuncs.c:1312 #, c-format msgid "invalid array flags" msgstr "不正な配列フラグ" -#: utils/adt/arrayfuncs.c:1331 +#: utils/adt/arrayfuncs.c:1334 #, c-format msgid "binary data has array element type %u (%s) instead of expected %u (%s)" msgstr "バイナリデータ中に期待される型%3$u(%4$s)の代わりに%1$u(%2$s)がありました" -#: utils/adt/arrayfuncs.c:1388 utils/adt/rangetypes.c:335 utils/cache/lsyscache.c:2835 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:445 utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2915 #, c-format msgid "no binary input function available for type %s" msgstr "型%sにはバイナリ入力関数がありません" -#: utils/adt/arrayfuncs.c:1528 +#: utils/adt/arrayfuncs.c:1518 #, c-format msgid "improper binary format in array element %d" msgstr "配列要素%dのバイナリ書式が不適切です" -#: utils/adt/arrayfuncs.c:1609 utils/adt/rangetypes.c:340 utils/cache/lsyscache.c:2868 +#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:450 utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2948 #, c-format msgid "no binary output function available for type %s" msgstr "型%sにはバイナリ出力関数がありません" -#: utils/adt/arrayfuncs.c:2087 +#: utils/adt/arrayfuncs.c:2078 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "固定長配列の部分配列は実装されていません" -#: utils/adt/arrayfuncs.c:2265 utils/adt/arrayfuncs.c:2287 utils/adt/arrayfuncs.c:2336 utils/adt/arrayfuncs.c:2572 utils/adt/arrayfuncs.c:2883 utils/adt/arrayfuncs.c:5824 utils/adt/arrayfuncs.c:5850 utils/adt/arrayfuncs.c:5861 utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4340 utils/adt/jsonfuncs.c:4490 utils/adt/jsonfuncs.c:4602 utils/adt/jsonfuncs.c:4648 +#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2566 utils/adt/arrayfuncs.c:2888 utils/adt/arrayfuncs.c:5870 utils/adt/arrayfuncs.c:5896 utils/adt/arrayfuncs.c:5907 utils/adt/json.c:1447 utils/adt/json.c:1521 utils/adt/jsonb.c:1376 utils/adt/jsonb.c:1462 utils/adt/jsonfuncs.c:4362 utils/adt/jsonfuncs.c:4515 utils/adt/jsonfuncs.c:4627 utils/adt/jsonfuncs.c:4676 #, c-format msgid "wrong number of array subscripts" msgstr "配列の添え字が不正な数値です" -#: utils/adt/arrayfuncs.c:2270 utils/adt/arrayfuncs.c:2378 utils/adt/arrayfuncs.c:2636 utils/adt/arrayfuncs.c:2942 +#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 utils/adt/arrayfuncs.c:2633 utils/adt/arrayfuncs.c:2947 #, c-format msgid "array subscript out of range" msgstr "配列の添え字が範囲外です" -#: utils/adt/arrayfuncs.c:2275 +#: utils/adt/arrayfuncs.c:2266 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "固定長配列の要素にNULL値を代入できません" -#: utils/adt/arrayfuncs.c:2830 +#: utils/adt/arrayfuncs.c:2835 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "固定長配列の部分配列の更新は実装されていません" -#: utils/adt/arrayfuncs.c:2861 +#: utils/adt/arrayfuncs.c:2866 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "配列のスライスの添え字は両方の境界を示す必要があります" -#: utils/adt/arrayfuncs.c:2862 +#: utils/adt/arrayfuncs.c:2867 #, c-format msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." msgstr "空の配列値のスライスに代入するには、スライスの範囲は完全に指定する必要があります。" -#: utils/adt/arrayfuncs.c:2873 utils/adt/arrayfuncs.c:2968 +#: utils/adt/arrayfuncs.c:2878 utils/adt/arrayfuncs.c:2974 #, c-format msgid "source array too small" msgstr "元の配列が小さすぎます" -#: utils/adt/arrayfuncs.c:3521 +#: utils/adt/arrayfuncs.c:3529 #, c-format msgid "null array element not allowed in this context" msgstr "この文脈ではNULLの配列要素は許可されません" -#: utils/adt/arrayfuncs.c:3623 utils/adt/arrayfuncs.c:3794 utils/adt/arrayfuncs.c:4150 +#: utils/adt/arrayfuncs.c:3631 utils/adt/arrayfuncs.c:3802 utils/adt/arrayfuncs.c:4192 #, c-format msgid "cannot compare arrays of different element types" msgstr "要素型の異なる配列を比較できません" -#: utils/adt/arrayfuncs.c:3972 utils/adt/rangetypes.c:1254 utils/adt/rangetypes.c:1318 +#: utils/adt/arrayfuncs.c:3980 utils/adt/multirangetypes.c:2798 utils/adt/multirangetypes.c:2870 utils/adt/rangetypes.c:1343 utils/adt/rangetypes.c:1407 utils/adt/rowtypes.c:1858 #, c-format msgid "could not identify a hash function for type %s" msgstr "型 %s のハッシュ関数を識別できません" -#: utils/adt/arrayfuncs.c:4065 +#: utils/adt/arrayfuncs.c:4107 utils/adt/rowtypes.c:1979 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "型 %s の拡張ハッシュ関数を特定できませんでした" -#: utils/adt/arrayfuncs.c:5242 +#: utils/adt/arrayfuncs.c:5284 #, c-format msgid "data type %s is not an array type" msgstr "データ型%sは配列型ではありません" -#: utils/adt/arrayfuncs.c:5297 +#: utils/adt/arrayfuncs.c:5339 #, c-format msgid "cannot accumulate null arrays" msgstr "null配列は連結できません" -#: utils/adt/arrayfuncs.c:5325 +#: utils/adt/arrayfuncs.c:5367 #, c-format msgid "cannot accumulate empty arrays" msgstr "空の配列は連結できません" -#: utils/adt/arrayfuncs.c:5352 utils/adt/arrayfuncs.c:5358 +#: utils/adt/arrayfuncs.c:5394 utils/adt/arrayfuncs.c:5400 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "次元の異なる配列は結合できません" -#: utils/adt/arrayfuncs.c:5722 utils/adt/arrayfuncs.c:5762 +#: utils/adt/arrayfuncs.c:5768 utils/adt/arrayfuncs.c:5808 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "次元配列もしくは下限値配列が NULL であってはなりません" -#: utils/adt/arrayfuncs.c:5825 utils/adt/arrayfuncs.c:5851 +#: utils/adt/arrayfuncs.c:5871 utils/adt/arrayfuncs.c:5897 #, c-format msgid "Dimension array must be one dimensional." msgstr "次元配列は1次元でなければなりません" -#: utils/adt/arrayfuncs.c:5830 utils/adt/arrayfuncs.c:5856 +#: utils/adt/arrayfuncs.c:5876 utils/adt/arrayfuncs.c:5902 #, c-format msgid "dimension values cannot be null" msgstr "次元値にnullにはできません" -#: utils/adt/arrayfuncs.c:5862 +#: utils/adt/arrayfuncs.c:5908 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "下限配列が次元配列のサイズと異なっています" -#: utils/adt/arrayfuncs.c:6138 +#: utils/adt/arrayfuncs.c:6186 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "多次元配列からの要素削除はサポートされません" -#: utils/adt/arrayfuncs.c:6415 +#: utils/adt/arrayfuncs.c:6463 #, c-format msgid "thresholds must be one-dimensional array" msgstr "閾値は1次元の配列でなければなりません" -#: utils/adt/arrayfuncs.c:6420 +#: utils/adt/arrayfuncs.c:6468 #, c-format msgid "thresholds array must not contain NULLs" msgstr "閾値配列にはNULL値を含めてはいけません" -#: utils/adt/arrayutils.c:209 +#: utils/adt/arrayfuncs.c:6701 +#, c-format +msgid "number of elements to trim must be between 0 and %d" +msgstr "削除する要素の数は0と%dとの間でなければなりません" + +#: utils/adt/arraysubs.c:93 utils/adt/arraysubs.c:130 +#, c-format +msgid "array subscript must have type integer" +msgstr "配列の添え字は整数型でなければなりません" + +#: utils/adt/arraysubs.c:198 utils/adt/arraysubs.c:217 +#, c-format +msgid "array subscript in assignment must not be null" +msgstr "代入における配列の添え字はnullにはできません" + +#: utils/adt/arrayutils.c:140 +#, c-format +msgid "array lower bound is too large: %d" +msgstr "配列の下界が大きすぎます: %d" + +#: utils/adt/arrayutils.c:240 #, c-format msgid "typmod array must be type cstring[]" msgstr "typmod配列はcstring[]型でなければなりません" -#: utils/adt/arrayutils.c:214 +#: utils/adt/arrayutils.c:245 #, c-format msgid "typmod array must be one-dimensional" msgstr "typmod配列は1次元の配列でなければなりません" -#: utils/adt/arrayutils.c:219 +#: utils/adt/arrayutils.c:250 #, c-format msgid "typmod array must not contain nulls" msgstr "typmod配列にはNULL値を含めてはいけません" @@ -21026,20 +22726,20 @@ msgid "encoding conversion from %s to ASCII not supported" msgstr "%s符号化方式からASCIIへの変換はサポートされていません" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:3757 utils/adt/float.c:187 utils/adt/float.c:271 utils/adt/float.c:283 utils/adt/float.c:400 utils/adt/float.c:485 utils/adt/float.c:501 utils/adt/geo_ops.c:220 utils/adt/geo_ops.c:230 utils/adt/geo_ops.c:242 utils/adt/geo_ops.c:274 utils/adt/geo_ops.c:316 utils/adt/geo_ops.c:326 utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1378 utils/adt/geo_ops.c:1413 utils/adt/geo_ops.c:1421 -#: utils/adt/geo_ops.c:3476 utils/adt/geo_ops.c:4645 utils/adt/geo_ops.c:4660 utils/adt/geo_ops.c:4667 utils/adt/int8.c:126 utils/adt/jsonpath.c:182 utils/adt/mac.c:94 utils/adt/mac8.c:93 utils/adt/mac8.c:166 utils/adt/mac8.c:184 utils/adt/mac8.c:202 utils/adt/mac8.c:221 utils/adt/network.c:100 utils/adt/numeric.c:701 utils/adt/numeric.c:720 utils/adt/numeric.c:6856 utils/adt/numeric.c:6880 utils/adt/numeric.c:6904 utils/adt/numeric.c:7873 -#: utils/adt/numutils.c:116 utils/adt/numutils.c:126 utils/adt/numutils.c:170 utils/adt/numutils.c:246 utils/adt/numutils.c:322 utils/adt/oid.c:44 utils/adt/oid.c:58 utils/adt/oid.c:64 utils/adt/oid.c:86 utils/adt/pg_lsn.c:74 utils/adt/tid.c:74 utils/adt/tid.c:82 utils/adt/tid.c:90 utils/adt/timestamp.c:494 utils/adt/uuid.c:136 utils/adt/xid8funcs.c:346 +#: utils/adt/bool.c:153 utils/adt/cash.c:276 utils/adt/datetime.c:4058 utils/adt/float.c:188 utils/adt/float.c:272 utils/adt/float.c:284 utils/adt/float.c:401 utils/adt/float.c:486 utils/adt/float.c:502 utils/adt/geo_ops.c:220 utils/adt/geo_ops.c:230 utils/adt/geo_ops.c:242 utils/adt/geo_ops.c:274 utils/adt/geo_ops.c:316 utils/adt/geo_ops.c:326 utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1389 utils/adt/geo_ops.c:1424 utils/adt/geo_ops.c:1432 +#: utils/adt/geo_ops.c:3392 utils/adt/geo_ops.c:4604 utils/adt/geo_ops.c:4619 utils/adt/geo_ops.c:4626 utils/adt/int.c:165 utils/adt/int.c:177 utils/adt/jsonpath.c:184 utils/adt/mac.c:93 utils/adt/mac8.c:93 utils/adt/mac8.c:166 utils/adt/mac8.c:184 utils/adt/mac8.c:202 utils/adt/mac8.c:221 utils/adt/network.c:99 utils/adt/numeric.c:698 utils/adt/numeric.c:717 utils/adt/numeric.c:6854 utils/adt/numeric.c:6878 utils/adt/numeric.c:6902 utils/adt/numeric.c:7904 +#: utils/adt/numutils.c:158 utils/adt/numutils.c:234 utils/adt/numutils.c:318 utils/adt/oid.c:44 utils/adt/oid.c:58 utils/adt/oid.c:64 utils/adt/oid.c:86 utils/adt/pg_lsn.c:74 utils/adt/tid.c:76 utils/adt/tid.c:84 utils/adt/tid.c:98 utils/adt/tid.c:107 utils/adt/timestamp.c:497 utils/adt/uuid.c:135 utils/adt/xid8funcs.c:345 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "\"%s\"型の入力構文が不正です: \"%s\"" -#: utils/adt/cash.c:215 utils/adt/cash.c:240 utils/adt/cash.c:250 utils/adt/cash.c:290 utils/adt/int8.c:118 utils/adt/numutils.c:140 utils/adt/numutils.c:147 utils/adt/numutils.c:240 utils/adt/numutils.c:316 utils/adt/oid.c:70 utils/adt/oid.c:109 +#: utils/adt/cash.c:214 utils/adt/cash.c:239 utils/adt/cash.c:249 utils/adt/cash.c:289 utils/adt/int.c:171 utils/adt/numutils.c:152 utils/adt/numutils.c:228 utils/adt/numutils.c:312 utils/adt/oid.c:70 utils/adt/oid.c:109 #, c-format msgid "value \"%s\" is out of range for type %s" msgstr "値\"%s\"は型%sの範囲外です" -#: utils/adt/cash.c:652 utils/adt/cash.c:702 utils/adt/cash.c:753 utils/adt/cash.c:802 utils/adt/cash.c:854 utils/adt/cash.c:904 utils/adt/float.c:104 utils/adt/int.c:822 utils/adt/int.c:938 utils/adt/int.c:1018 utils/adt/int.c:1080 utils/adt/int.c:1118 utils/adt/int.c:1146 utils/adt/int8.c:600 utils/adt/int8.c:658 utils/adt/int8.c:985 utils/adt/int8.c:1065 utils/adt/int8.c:1127 utils/adt/int8.c:1207 utils/adt/numeric.c:3030 utils/adt/numeric.c:3053 -#: utils/adt/numeric.c:3138 utils/adt/numeric.c:3156 utils/adt/numeric.c:3252 utils/adt/numeric.c:8411 utils/adt/numeric.c:8701 utils/adt/numeric.c:10283 utils/adt/timestamp.c:3264 +#: utils/adt/cash.c:651 utils/adt/cash.c:701 utils/adt/cash.c:752 utils/adt/cash.c:801 utils/adt/cash.c:853 utils/adt/cash.c:903 utils/adt/float.c:105 utils/adt/int.c:846 utils/adt/int.c:962 utils/adt/int.c:1042 utils/adt/int.c:1104 utils/adt/int.c:1142 utils/adt/int.c:1170 utils/adt/int8.c:515 utils/adt/int8.c:573 utils/adt/int8.c:943 utils/adt/int8.c:1023 utils/adt/int8.c:1085 utils/adt/int8.c:1165 utils/adt/numeric.c:3093 utils/adt/numeric.c:3116 +#: utils/adt/numeric.c:3201 utils/adt/numeric.c:3219 utils/adt/numeric.c:3315 utils/adt/numeric.c:8453 utils/adt/numeric.c:8744 utils/adt/numeric.c:9069 utils/adt/numeric.c:10526 utils/adt/timestamp.c:3336 #, c-format msgid "division by zero" msgstr "0 による除算が行われました" @@ -21049,143 +22749,148 @@ msgstr "0 による除算が行われました" msgid "\"char\" out of range" msgstr "\"char\"の範囲外です" -#: utils/adt/date.c:61 utils/adt/timestamp.c:95 utils/adt/varbit.c:104 utils/adt/varchar.c:48 +#: utils/adt/cryptohashfuncs.c:47 utils/adt/cryptohashfuncs.c:69 +#, c-format +msgid "could not compute %s hash: %s" +msgstr "%sハッシュを計算できませんでした: %s" + +#: utils/adt/date.c:63 utils/adt/timestamp.c:98 utils/adt/varbit.c:105 utils/adt/varchar.c:48 #, c-format msgid "invalid type modifier" msgstr "不正な型修飾子です。" -#: utils/adt/date.c:73 +#: utils/adt/date.c:75 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "(%d)%sの精度は負ではいけません" -#: utils/adt/date.c:79 +#: utils/adt/date.c:81 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "TIME(%d)%sの位取りを許容最大値%dまで減らしました" -#: utils/adt/date.c:158 utils/adt/date.c:166 utils/adt/formatting.c:4196 utils/adt/formatting.c:4205 utils/adt/formatting.c:4311 utils/adt/formatting.c:4321 +#: utils/adt/date.c:160 utils/adt/date.c:168 utils/adt/formatting.c:4294 utils/adt/formatting.c:4303 utils/adt/formatting.c:4409 utils/adt/formatting.c:4419 #, c-format msgid "date out of range: \"%s\"" msgstr "日付が範囲外です: \"%s\"" -#: utils/adt/date.c:213 utils/adt/date.c:525 utils/adt/date.c:549 utils/adt/xml.c:2210 +#: utils/adt/date.c:215 utils/adt/date.c:513 utils/adt/date.c:537 utils/adt/xml.c:2209 #, c-format msgid "date out of range" msgstr "日付が範囲外です" -#: utils/adt/date.c:259 utils/adt/timestamp.c:574 +#: utils/adt/date.c:261 utils/adt/timestamp.c:581 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "日付フィールドの値が範囲外です: %d-%02d-%02d" -#: utils/adt/date.c:266 utils/adt/date.c:275 utils/adt/timestamp.c:580 +#: utils/adt/date.c:268 utils/adt/date.c:277 utils/adt/timestamp.c:587 #, c-format msgid "date out of range: %d-%02d-%02d" msgstr "日付が範囲外です: %d-%02d-%02d" -#: utils/adt/date.c:313 utils/adt/date.c:336 utils/adt/date.c:362 utils/adt/date.c:1170 utils/adt/date.c:1216 utils/adt/date.c:1772 utils/adt/date.c:1803 utils/adt/date.c:1832 utils/adt/date.c:2664 utils/adt/datetime.c:1655 utils/adt/formatting.c:4053 utils/adt/formatting.c:4085 utils/adt/formatting.c:4165 utils/adt/formatting.c:4287 utils/adt/json.c:418 utils/adt/json.c:457 utils/adt/timestamp.c:222 utils/adt/timestamp.c:254 utils/adt/timestamp.c:692 -#: utils/adt/timestamp.c:701 utils/adt/timestamp.c:779 utils/adt/timestamp.c:812 utils/adt/timestamp.c:2843 utils/adt/timestamp.c:2864 utils/adt/timestamp.c:2877 utils/adt/timestamp.c:2886 utils/adt/timestamp.c:2894 utils/adt/timestamp.c:2949 utils/adt/timestamp.c:2972 utils/adt/timestamp.c:2985 utils/adt/timestamp.c:2996 utils/adt/timestamp.c:3004 utils/adt/timestamp.c:3664 utils/adt/timestamp.c:3789 utils/adt/timestamp.c:3830 utils/adt/timestamp.c:3920 -#: utils/adt/timestamp.c:3964 utils/adt/timestamp.c:4067 utils/adt/timestamp.c:4552 utils/adt/timestamp.c:4748 utils/adt/timestamp.c:5075 utils/adt/timestamp.c:5089 utils/adt/timestamp.c:5094 utils/adt/timestamp.c:5108 utils/adt/timestamp.c:5141 utils/adt/timestamp.c:5218 utils/adt/timestamp.c:5259 utils/adt/timestamp.c:5263 utils/adt/timestamp.c:5332 utils/adt/timestamp.c:5336 utils/adt/timestamp.c:5350 utils/adt/timestamp.c:5384 utils/adt/xml.c:2232 -#: utils/adt/xml.c:2239 utils/adt/xml.c:2259 utils/adt/xml.c:2266 -#, c-format -msgid "timestamp out of range" -msgstr "timestampの範囲外です" - -#: utils/adt/date.c:500 +#: utils/adt/date.c:488 #, c-format msgid "cannot subtract infinite dates" msgstr "無限大の日付は減算できません" -#: utils/adt/date.c:589 utils/adt/date.c:646 utils/adt/date.c:680 utils/adt/date.c:2701 utils/adt/date.c:2711 +#: utils/adt/date.c:586 utils/adt/date.c:649 utils/adt/date.c:685 utils/adt/date.c:2868 utils/adt/date.c:2878 #, c-format msgid "date out of range for timestamp" msgstr "タイムスタンプで日付が範囲外です" -#: utils/adt/date.c:1389 utils/adt/date.c:2159 utils/adt/formatting.c:4373 +#: utils/adt/date.c:1115 utils/adt/date.c:1198 utils/adt/date.c:1214 utils/adt/date.c:2195 utils/adt/date.c:2973 utils/adt/timestamp.c:4031 utils/adt/timestamp.c:4224 utils/adt/timestamp.c:4396 utils/adt/timestamp.c:4649 utils/adt/timestamp.c:4850 utils/adt/timestamp.c:4897 utils/adt/timestamp.c:5121 utils/adt/timestamp.c:5168 utils/adt/timestamp.c:5298 +#, c-format +msgid "unit \"%s\" not supported for type %s" +msgstr "単位\"%s\"は型%sに対してはサポートされていません" + +#: utils/adt/date.c:1223 utils/adt/date.c:2211 utils/adt/date.c:2993 utils/adt/timestamp.c:4045 utils/adt/timestamp.c:4241 utils/adt/timestamp.c:4410 utils/adt/timestamp.c:4609 utils/adt/timestamp.c:4906 utils/adt/timestamp.c:5177 utils/adt/timestamp.c:5359 +#, c-format +msgid "unit \"%s\" not recognized for type %s" +msgstr "単位\"%s\"は型%sに対しては認識できません" + +#: utils/adt/date.c:1307 utils/adt/date.c:1353 utils/adt/date.c:1907 utils/adt/date.c:1938 utils/adt/date.c:1967 utils/adt/date.c:2831 utils/adt/date.c:3078 utils/adt/datetime.c:420 utils/adt/datetime.c:1869 utils/adt/formatting.c:4136 utils/adt/formatting.c:4172 utils/adt/formatting.c:4263 utils/adt/formatting.c:4385 utils/adt/json.c:440 utils/adt/json.c:479 utils/adt/timestamp.c:225 utils/adt/timestamp.c:257 utils/adt/timestamp.c:699 utils/adt/timestamp.c:708 +#: utils/adt/timestamp.c:786 utils/adt/timestamp.c:819 utils/adt/timestamp.c:2915 utils/adt/timestamp.c:2936 utils/adt/timestamp.c:2949 utils/adt/timestamp.c:2958 utils/adt/timestamp.c:2966 utils/adt/timestamp.c:3021 utils/adt/timestamp.c:3044 utils/adt/timestamp.c:3057 utils/adt/timestamp.c:3068 utils/adt/timestamp.c:3076 utils/adt/timestamp.c:3735 utils/adt/timestamp.c:3859 utils/adt/timestamp.c:3949 utils/adt/timestamp.c:4039 utils/adt/timestamp.c:4132 +#: utils/adt/timestamp.c:4235 utils/adt/timestamp.c:4714 utils/adt/timestamp.c:4988 utils/adt/timestamp.c:5438 utils/adt/timestamp.c:5452 utils/adt/timestamp.c:5457 utils/adt/timestamp.c:5471 utils/adt/timestamp.c:5504 utils/adt/timestamp.c:5591 utils/adt/timestamp.c:5632 utils/adt/timestamp.c:5636 utils/adt/timestamp.c:5705 utils/adt/timestamp.c:5709 utils/adt/timestamp.c:5723 utils/adt/timestamp.c:5757 utils/adt/xml.c:2231 utils/adt/xml.c:2238 +#: utils/adt/xml.c:2258 utils/adt/xml.c:2265 +#, c-format +msgid "timestamp out of range" +msgstr "timestampの範囲外です" + +#: utils/adt/date.c:1524 utils/adt/date.c:2326 utils/adt/formatting.c:4471 #, c-format msgid "time out of range" msgstr "時刻が範囲外です" -#: utils/adt/date.c:1441 utils/adt/timestamp.c:589 +#: utils/adt/date.c:1576 utils/adt/timestamp.c:596 #, c-format msgid "time field value out of range: %d:%02d:%02g" msgstr "時刻フィールドの値が範囲外です: %d:%02d:%02g" -#: utils/adt/date.c:1961 utils/adt/date.c:2463 utils/adt/float.c:1047 utils/adt/float.c:1123 utils/adt/int.c:614 utils/adt/int.c:661 utils/adt/int.c:696 utils/adt/int8.c:499 utils/adt/numeric.c:2441 utils/adt/timestamp.c:3313 utils/adt/timestamp.c:3344 utils/adt/timestamp.c:3375 +#: utils/adt/date.c:2096 utils/adt/date.c:2630 utils/adt/float.c:1048 utils/adt/float.c:1124 utils/adt/int.c:638 utils/adt/int.c:685 utils/adt/int.c:720 utils/adt/int8.c:414 utils/adt/numeric.c:2497 utils/adt/timestamp.c:3385 utils/adt/timestamp.c:3416 utils/adt/timestamp.c:3447 #, c-format msgid "invalid preceding or following size in window function" msgstr "ウィンドウ関数での不正なサイズの PRECEDING または FOLLOWING 指定" -#: utils/adt/date.c:2046 utils/adt/date.c:2059 -#, c-format -msgid "\"time\" units \"%s\" not recognized" -msgstr "\"time\"の単位\"%s\"が不明です" - -#: utils/adt/date.c:2167 +#: utils/adt/date.c:2334 #, c-format msgid "time zone displacement out of range" msgstr "タイムゾーンの置換が範囲外です" -#: utils/adt/date.c:2796 utils/adt/date.c:2809 -#, c-format -msgid "\"time with time zone\" units \"%s\" not recognized" -msgstr "\"time with time zone\"の単位\"%s\"が不明です" - -#: utils/adt/date.c:2882 utils/adt/datetime.c:906 utils/adt/datetime.c:1813 utils/adt/datetime.c:4602 utils/adt/timestamp.c:513 utils/adt/timestamp.c:540 utils/adt/timestamp.c:4150 utils/adt/timestamp.c:5100 utils/adt/timestamp.c:5342 +#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 utils/adt/datetime.c:4906 utils/adt/timestamp.c:516 utils/adt/timestamp.c:543 utils/adt/timestamp.c:4318 utils/adt/timestamp.c:5463 utils/adt/timestamp.c:5715 #, c-format msgid "time zone \"%s\" not recognized" msgstr "タイムゾーン\"%s\"は不明です" -#: utils/adt/date.c:2914 utils/adt/timestamp.c:5130 utils/adt/timestamp.c:5373 +#: utils/adt/date.c:3116 utils/adt/timestamp.c:5493 utils/adt/timestamp.c:5746 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "intervalによるタイムゾーン\"%s\"には月または日を含めてはいけません" -#: utils/adt/datetime.c:3730 utils/adt/datetime.c:3737 +#: utils/adt/datetime.c:4031 utils/adt/datetime.c:4038 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "日付時刻のフィールドが範囲外です: \"%s\"" -#: utils/adt/datetime.c:3739 +#: utils/adt/datetime.c:4040 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "他の\"datestyle\"設定が必要かもしれません。" -#: utils/adt/datetime.c:3744 +#: utils/adt/datetime.c:4045 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "intervalフィールドの値が範囲外です: \"%s\"" -#: utils/adt/datetime.c:3750 +#: utils/adt/datetime.c:4051 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "タイムゾーンの置換が範囲外です: \"%s\"" -#: utils/adt/datetime.c:4604 +#: utils/adt/datetime.c:4908 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "このタイムゾーンはタイムゾーン省略名\"%s\"の構成ファイルにあるようです。" -#: utils/adt/datum.c:89 utils/adt/datum.c:101 +#: utils/adt/datum.c:90 utils/adt/datum.c:102 #, c-format msgid "invalid Datum pointer" msgstr "不正なDatumポインタ" -#: utils/adt/dbsize.c:759 utils/adt/dbsize.c:827 +#: utils/adt/dbsize.c:747 utils/adt/dbsize.c:813 #, c-format msgid "invalid size: \"%s\"" msgstr "不正なサイズ: \"%s\"" -#: utils/adt/dbsize.c:828 +#: utils/adt/dbsize.c:814 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "不正なサイズの単位: \"%s\"" -#: utils/adt/dbsize.c:829 +#: utils/adt/dbsize.c:815 #, c-format -msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." -msgstr "有効な単位は \"bytes\"、\"kB\"、\"MB\"、\"GB\"そして\"TB\"。" +msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." +msgstr "有効な単位は \"bytes\"、\"kB\"、\"MB\"、\"GB\"、\"TB\"そして\"PB\"です。" #: utils/adt/domains.c:92 #, c-format @@ -21237,402 +22942,397 @@ msgstr "不正なbase64終了シーケンス" msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "入力データにパディングがありません、切り詰められたかさもなければ壊れています。" -#: utils/adt/enum.c:100 +#: utils/adt/enum.c:99 #, c-format msgid "unsafe use of new value \"%s\" of enum type %s" msgstr "列挙型%2$sの新しい値\"%1$s\"の安全ではない使用" -#: utils/adt/enum.c:103 +#: utils/adt/enum.c:102 #, c-format msgid "New enum values must be committed before they can be used." msgstr "新しい列挙値はコミットするまで使用できません。" -#: utils/adt/enum.c:121 utils/adt/enum.c:131 utils/adt/enum.c:189 utils/adt/enum.c:199 +#: utils/adt/enum.c:120 utils/adt/enum.c:130 utils/adt/enum.c:188 utils/adt/enum.c:198 #, c-format msgid "invalid input value for enum %s: \"%s\"" msgstr "列挙型%sの不正な入力構文: \"%s\"" -#: utils/adt/enum.c:161 utils/adt/enum.c:227 utils/adt/enum.c:286 +#: utils/adt/enum.c:160 utils/adt/enum.c:226 utils/adt/enum.c:285 #, c-format msgid "invalid internal value for enum: %u" msgstr "列挙型用の不正な内部値: %u" -#: utils/adt/enum.c:446 utils/adt/enum.c:475 utils/adt/enum.c:515 utils/adt/enum.c:535 +#: utils/adt/enum.c:445 utils/adt/enum.c:474 utils/adt/enum.c:514 utils/adt/enum.c:534 #, c-format msgid "could not determine actual enum type" msgstr "実際の列挙型を特定できませんでした" -#: utils/adt/enum.c:454 utils/adt/enum.c:483 +#: utils/adt/enum.c:453 utils/adt/enum.c:482 #, c-format msgid "enum %s contains no values" msgstr "列挙型 %s に値がありません" -#: utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1632 utils/cache/typcache.c:1788 utils/cache/typcache.c:1918 utils/fmgr/funcapi.c:456 -#, c-format -msgid "type %s is not composite" -msgstr "型%sは複合型ではありません" - -#: utils/adt/float.c:88 +#: utils/adt/float.c:89 #, c-format msgid "value out of range: overflow" msgstr "範囲外の値です: オーバーフロー" -#: utils/adt/float.c:96 +#: utils/adt/float.c:97 #, c-format msgid "value out of range: underflow" msgstr "範囲外の値です: アンダーフロー" -#: utils/adt/float.c:265 +#: utils/adt/float.c:266 #, c-format msgid "\"%s\" is out of range for type real" msgstr "型realでは\"%s\"は範囲外です" -#: utils/adt/float.c:477 +#: utils/adt/float.c:478 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "型double precisionでは\"%s\"は範囲外です" -#: utils/adt/float.c:1258 utils/adt/float.c:1332 utils/adt/int.c:334 utils/adt/int.c:872 utils/adt/int.c:894 utils/adt/int.c:908 utils/adt/int.c:922 utils/adt/int.c:954 utils/adt/int.c:1192 utils/adt/int8.c:1320 utils/adt/numeric.c:4268 utils/adt/numeric.c:4277 +#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:358 utils/adt/int.c:896 utils/adt/int.c:918 utils/adt/int.c:932 utils/adt/int.c:946 utils/adt/int.c:978 utils/adt/int.c:1216 utils/adt/int8.c:1278 utils/adt/numeric.c:4377 utils/adt/numeric.c:4382 #, c-format msgid "smallint out of range" msgstr "smallintの範囲外です" -#: utils/adt/float.c:1458 utils/adt/numeric.c:3548 utils/adt/numeric.c:9294 +#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9483 #, c-format msgid "cannot take square root of a negative number" msgstr "負の値の平方根を取ることができません" -#: utils/adt/float.c:1526 utils/adt/numeric.c:3823 utils/adt/numeric.c:3933 +#: utils/adt/float.c:1527 utils/adt/numeric.c:3886 utils/adt/numeric.c:3998 #, c-format msgid "zero raised to a negative power is undefined" msgstr "0 の負数乗は定義されていません" -#: utils/adt/float.c:1530 utils/adt/numeric.c:3827 utils/adt/numeric.c:3938 +#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10379 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "負数を整数でない数でべき乗すると、結果が複雑になります" -#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3735 utils/adt/numeric.c:9958 +#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 utils/adt/numeric.c:10154 #, c-format msgid "cannot take logarithm of zero" msgstr "ゼロの対数を取ることができません" -#: utils/adt/float.c:1710 utils/adt/float.c:1743 utils/adt/numeric.c:3673 utils/adt/numeric.c:3730 utils/adt/numeric.c:9962 +#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 utils/adt/numeric.c:3793 utils/adt/numeric.c:10158 #, c-format msgid "cannot take logarithm of a negative number" msgstr "負の値の対数を取ることができません" -#: utils/adt/float.c:1776 utils/adt/float.c:1807 utils/adt/float.c:1902 utils/adt/float.c:1929 utils/adt/float.c:1957 utils/adt/float.c:1984 utils/adt/float.c:2131 utils/adt/float.c:2168 utils/adt/float.c:2338 utils/adt/float.c:2394 utils/adt/float.c:2459 utils/adt/float.c:2516 utils/adt/float.c:2707 utils/adt/float.c:2731 +#: utils/adt/float.c:1777 utils/adt/float.c:1808 utils/adt/float.c:1903 utils/adt/float.c:1930 utils/adt/float.c:1958 utils/adt/float.c:1985 utils/adt/float.c:2132 utils/adt/float.c:2169 utils/adt/float.c:2339 utils/adt/float.c:2395 utils/adt/float.c:2460 utils/adt/float.c:2517 utils/adt/float.c:2708 utils/adt/float.c:2732 #, c-format msgid "input is out of range" msgstr "入力が範囲外です" -#: utils/adt/float.c:2798 +#: utils/adt/float.c:2796 #, c-format msgid "setseed parameter %g is out of allowed range [-1,1]" msgstr "setseed のパラメータ %g は設定可能な範囲 [-1, 1] にありません" -#: utils/adt/float.c:4030 utils/adt/numeric.c:1715 +#: utils/adt/float.c:4024 utils/adt/numeric.c:1770 #, c-format msgid "count must be greater than zero" msgstr "カウントは0より大きくなければなりません" -#: utils/adt/float.c:4035 utils/adt/numeric.c:1726 +#: utils/adt/float.c:4029 utils/adt/numeric.c:1781 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "オペランド、下限、上限をNaNにすることはできません" -#: utils/adt/float.c:4041 +#: utils/adt/float.c:4035 utils/adt/numeric.c:1786 #, c-format msgid "lower and upper bounds must be finite" msgstr "下限および上限は有限でなければなりません" -#: utils/adt/float.c:4075 utils/adt/numeric.c:1744 +#: utils/adt/float.c:4069 utils/adt/numeric.c:1800 #, c-format msgid "lower bound cannot equal upper bound" msgstr "下限を上限と同じにできません" -#: utils/adt/formatting.c:532 +#: utils/adt/formatting.c:561 #, c-format msgid "invalid format specification for an interval value" msgstr "\"tinterval\"値に対する不正な書式指定" -#: utils/adt/formatting.c:533 +#: utils/adt/formatting.c:562 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "時間間隔が特定の暦日付に結びついていません" -#: utils/adt/formatting.c:1157 +#: utils/adt/formatting.c:1187 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\"は最終パターンでなければなりません。" -#: utils/adt/formatting.c:1165 +#: utils/adt/formatting.c:1195 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\"は\"PR\"の前になければなりません" -#: utils/adt/formatting.c:1181 +#: utils/adt/formatting.c:1211 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\"は\"PR\"の前になければなりません" -#: utils/adt/formatting.c:1208 +#: utils/adt/formatting.c:1238 #, c-format msgid "multiple decimal points" msgstr "複数の小数点があります" -#: utils/adt/formatting.c:1212 utils/adt/formatting.c:1295 +#: utils/adt/formatting.c:1242 utils/adt/formatting.c:1325 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "\"V\"と小数点を混在できません" -#: utils/adt/formatting.c:1224 +#: utils/adt/formatting.c:1254 #, c-format msgid "cannot use \"S\" twice" msgstr "\"S\"は1回しか使用できません" -#: utils/adt/formatting.c:1228 +#: utils/adt/formatting.c:1258 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "\"S\"と\"PL\"/\"MI\"/\"SG\"/\"PR\"を混在できません" -#: utils/adt/formatting.c:1248 +#: utils/adt/formatting.c:1278 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "\"S\"と\"MI\"を混在できません" -#: utils/adt/formatting.c:1258 +#: utils/adt/formatting.c:1288 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "\"S\"と\"PL\"を混在できません" -#: utils/adt/formatting.c:1268 +#: utils/adt/formatting.c:1298 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "\"S\"と\"SG\"を混在できません" -#: utils/adt/formatting.c:1277 +#: utils/adt/formatting.c:1307 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "\"PR\"と\"S\"/\"PL\"/\"MI\"/\"SG\"を混在できません" -#: utils/adt/formatting.c:1303 +#: utils/adt/formatting.c:1333 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "\"EEEE\"は1回しか使用できません" -#: utils/adt/formatting.c:1309 +#: utils/adt/formatting.c:1339 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\"が他のフォーマットと互換性がありません。" -#: utils/adt/formatting.c:1310 +#: utils/adt/formatting.c:1340 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "\"EEEE\"は数値または小数点パターンと共に指定してください。" -#: utils/adt/formatting.c:1392 +#: utils/adt/formatting.c:1424 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "不正なdatetime書式のセパレータ: \"%s\"" -#: utils/adt/formatting.c:1520 +#: utils/adt/formatting.c:1551 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\"は数値ではありません" -#: utils/adt/formatting.c:1598 +#: utils/adt/formatting.c:1629 #, c-format msgid "case conversion failed: %s" msgstr "文字ケースの変換に失敗しました: %s" -#: utils/adt/formatting.c:1663 utils/adt/formatting.c:1787 utils/adt/formatting.c:1912 +#: utils/adt/formatting.c:1683 utils/adt/formatting.c:1805 utils/adt/formatting.c:1928 #, c-format msgid "could not determine which collation to use for %s function" msgstr "%s 関数に対して使用する照合順序を特定できませんでした" -#: utils/adt/formatting.c:2284 +#: utils/adt/formatting.c:2309 #, c-format msgid "invalid combination of date conventions" msgstr "不正な暦法の組み合わせ" -#: utils/adt/formatting.c:2285 +#: utils/adt/formatting.c:2310 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "単一の書式テンプレートの中では、グレゴリオ暦とISO歴週日付を混在させないでください。" -#: utils/adt/formatting.c:2308 +#: utils/adt/formatting.c:2333 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "書式文字列中で\"%s\"フィールドの値が衝突しています" -#: utils/adt/formatting.c:2311 +#: utils/adt/formatting.c:2336 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "この値は同じフィールド型に対する以前の設定と矛盾しています" -#: utils/adt/formatting.c:2382 +#: utils/adt/formatting.c:2407 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "書式フィールド\"%s\"に対して元の文字列が短すぎます" -#: utils/adt/formatting.c:2385 +#: utils/adt/formatting.c:2410 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "フィールドには%d文字必要ですが、%d文字しか残っていません。" -#: utils/adt/formatting.c:2388 utils/adt/formatting.c:2403 +#: utils/adt/formatting.c:2413 utils/adt/formatting.c:2428 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "元の文字列が固定長でない場合は、修飾子\"FM\"を試してみてください。" -#: utils/adt/formatting.c:2398 utils/adt/formatting.c:2412 utils/adt/formatting.c:2635 +#: utils/adt/formatting.c:2423 utils/adt/formatting.c:2437 utils/adt/formatting.c:2660 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "\"%2$s\"に対する不正な値\"%1$s\"" -#: utils/adt/formatting.c:2400 +#: utils/adt/formatting.c:2425 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "このフィールドには%d文字必要ですが、%d文字しかパースされませんでした。" -#: utils/adt/formatting.c:2414 +#: utils/adt/formatting.c:2439 #, c-format msgid "Value must be an integer." msgstr "値は整数でなければなりません。" -#: utils/adt/formatting.c:2419 +#: utils/adt/formatting.c:2444 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "もとの文字列において\"%s\"に対応する値が範囲外です" -#: utils/adt/formatting.c:2421 +#: utils/adt/formatting.c:2446 #, c-format msgid "Value must be in the range %d to %d." msgstr "値は%dから%dまでの範囲でなければなりません。" -#: utils/adt/formatting.c:2637 +#: utils/adt/formatting.c:2662 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "与えられた値がこの項目に対して許されるいずれの値ともマッチしません。" -#: utils/adt/formatting.c:2854 utils/adt/formatting.c:2874 utils/adt/formatting.c:2894 utils/adt/formatting.c:2914 utils/adt/formatting.c:2933 utils/adt/formatting.c:2952 utils/adt/formatting.c:2976 utils/adt/formatting.c:2994 utils/adt/formatting.c:3012 utils/adt/formatting.c:3030 utils/adt/formatting.c:3047 utils/adt/formatting.c:3064 +#: utils/adt/formatting.c:2881 utils/adt/formatting.c:2901 utils/adt/formatting.c:2921 utils/adt/formatting.c:2941 utils/adt/formatting.c:2960 utils/adt/formatting.c:2979 utils/adt/formatting.c:3003 utils/adt/formatting.c:3021 utils/adt/formatting.c:3039 utils/adt/formatting.c:3057 utils/adt/formatting.c:3074 utils/adt/formatting.c:3091 #, c-format msgid "localized string format value too long" msgstr "地域化した文字列のフォーマットが長すぎます" -#: utils/adt/formatting.c:3298 +#: utils/adt/formatting.c:3368 #, c-format msgid "unmatched format separator \"%c\"" msgstr "合致しないフォーマットセパレータ \"%c\"" -#: utils/adt/formatting.c:3453 utils/adt/formatting.c:3797 +#: utils/adt/formatting.c:3429 +#, c-format +msgid "unmatched format character \"%s\"" +msgstr "合致しないフォーマット文字\"%s\"" + +#: utils/adt/formatting.c:3535 utils/adt/formatting.c:3879 #, c-format msgid "formatting field \"%s\" is only supported in to_char" msgstr "形式指定フィールド\"%s\"はto_charの中でのみサポートされています" -#: utils/adt/formatting.c:3628 +#: utils/adt/formatting.c:3710 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr " \"Y,YYY\"に対応する入力文字列が不正です" -#: utils/adt/formatting.c:3714 +#: utils/adt/formatting.c:3796 #, c-format msgid "input string is too short for datetime format" msgstr "datetime書式に対して入力文字列が短すぎます" -#: utils/adt/formatting.c:3722 +#: utils/adt/formatting.c:3804 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "datetimeフォーマット後に文字が入力文字列中に残っています" -#: utils/adt/formatting.c:4267 +#: utils/adt/formatting.c:4365 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "timestamptz型に対応する入力に時間帯がありません" -#: utils/adt/formatting.c:4273 +#: utils/adt/formatting.c:4371 #, c-format msgid "timestamptz out of range" msgstr "timestamptzの範囲外です" -#: utils/adt/formatting.c:4301 +#: utils/adt/formatting.c:4399 #, c-format msgid "datetime format is zoned but not timed" msgstr "datetimeフォーマットで時間帯は指定されていますが、時刻が指定されていません" -#: utils/adt/formatting.c:4353 +#: utils/adt/formatting.c:4451 #, c-format msgid "missing time zone in input string for type timetz" msgstr "timetz型に対する入力文字列中に時間帯がありません" -#: utils/adt/formatting.c:4359 +#: utils/adt/formatting.c:4457 #, c-format msgid "timetz out of range" msgstr "timetzの範囲外です" -#: utils/adt/formatting.c:4385 +#: utils/adt/formatting.c:4483 #, c-format msgid "datetime format is not dated and not timed" msgstr "datetimeフォーマットで日付は指定されていますが、時間が指定されていません" -#: utils/adt/formatting.c:4518 +#: utils/adt/formatting.c:4616 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "12時間形式では\"%d\"時は不正です" -#: utils/adt/formatting.c:4520 +#: utils/adt/formatting.c:4618 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "24時間形式を使うか、もしくは 1 から 12 の間で指定してください。" -#: utils/adt/formatting.c:4628 +#: utils/adt/formatting.c:4729 #, c-format msgid "cannot calculate day of year without year information" msgstr "年の情報なしでは年内の日数は計算できません" -#: utils/adt/formatting.c:5547 +#: utils/adt/formatting.c:5648 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\"は入力としてサポートしていません" -#: utils/adt/formatting.c:5559 +#: utils/adt/formatting.c:5660 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\"は入力としてサポートしていません" -#: utils/adt/genfile.c:75 -#, c-format -msgid "reference to parent directory (\"..\") not allowed" -msgstr "親ディレクトリへの参照(\"..\")は許可されていません" - -#: utils/adt/genfile.c:86 +#: utils/adt/genfile.c:84 #, c-format msgid "absolute path not allowed" msgstr "絶対パスは許可されていません" -#: utils/adt/genfile.c:91 +#: utils/adt/genfile.c:89 #, c-format msgid "path must be in or below the current directory" msgstr "パスはカレントディレクトリもしくはその下でなければなりません" -#: utils/adt/genfile.c:116 utils/adt/oracle_compat.c:185 utils/adt/oracle_compat.c:283 utils/adt/oracle_compat.c:759 utils/adt/oracle_compat.c:1054 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:187 utils/adt/oracle_compat.c:285 utils/adt/oracle_compat.c:833 utils/adt/oracle_compat.c:1134 #, c-format msgid "requested length too large" msgstr "要求した長さが長すぎます" -#: utils/adt/genfile.c:133 +#: utils/adt/genfile.c:131 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "ファイル\"%s\"をシークできませんでした: %m" -#: utils/adt/genfile.c:174 +#: utils/adt/genfile.c:171 #, c-format msgid "file length too large" msgstr "ファイルが大きすぎます" -#: utils/adt/genfile.c:251 +#: utils/adt/genfile.c:248 #, c-format msgid "must be superuser to read files with adminpack 1.0" msgstr "adminpack 1.0 でファイルを読み込むにはスーパユーザである必要があります" @@ -21642,564 +23342,604 @@ msgstr "adminpack 1.0 でファイルを読み込むにはスーパユーザで msgid "invalid line specification: A and B cannot both be zero" msgstr "不正な直線の指定: AとBは同時に0にはできません" -#: utils/adt/geo_ops.c:987 utils/adt/geo_ops.c:1090 +#: utils/adt/geo_ops.c:987 utils/adt/geo_ops.c:1097 #, c-format msgid "invalid line specification: must be two distinct points" msgstr "不正な直線の指定: 2つの点は異なっている必要があります" -#: utils/adt/geo_ops.c:1399 utils/adt/geo_ops.c:3486 utils/adt/geo_ops.c:4354 utils/adt/geo_ops.c:5248 +#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4327 utils/adt/geo_ops.c:5207 #, c-format msgid "too many points requested" msgstr "要求された点が多すぎます" -#: utils/adt/geo_ops.c:1461 +#: utils/adt/geo_ops.c:1472 #, c-format msgid "invalid number of points in external \"path\" value" msgstr "\"path\"の外部値における点の数が不正です" -#: utils/adt/geo_ops.c:2537 -#, c-format -msgid "function \"dist_lb\" not implemented" -msgstr "関数\"dist_lb\"は実装されていません" - -#: utils/adt/geo_ops.c:2556 -#, c-format -msgid "function \"dist_bl\" not implemented" -msgstr "関数\"dist_bl\"\"は実装されていません" - -#: utils/adt/geo_ops.c:2975 -#, c-format -msgid "function \"close_sl\" not implemented" -msgstr "関数\"close_sl\"は実装されていません" - -#: utils/adt/geo_ops.c:3122 -#, c-format -msgid "function \"close_lb\" not implemented" -msgstr "関数\"close_lb\"は実装されていません" - -#: utils/adt/geo_ops.c:3533 +#: utils/adt/geo_ops.c:3449 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "\"polygon\"の外部値の点の数が不正です" -#: utils/adt/geo_ops.c:4069 -#, c-format -msgid "function \"poly_distance\" not implemented" -msgstr "関数\"poly_distance\"は実装されていません" - -#: utils/adt/geo_ops.c:4446 -#, c-format -msgid "function \"path_center\" not implemented" -msgstr "関数\"path_center\"は実装されていません" - -#: utils/adt/geo_ops.c:4463 +#: utils/adt/geo_ops.c:4422 #, c-format msgid "open path cannot be converted to polygon" msgstr "開経路を多角形に変換できません" -#: utils/adt/geo_ops.c:4713 +#: utils/adt/geo_ops.c:4672 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "\"circle\"の外部値の半径が不正です" -#: utils/adt/geo_ops.c:5234 +#: utils/adt/geo_ops.c:5193 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "半径0の円を多角形に返還できません" -#: utils/adt/geo_ops.c:5239 +#: utils/adt/geo_ops.c:5198 #, c-format msgid "must request at least 2 points" msgstr "少なくとも2ポイントを要求しなければなりません" -#: utils/adt/int.c:164 +#: utils/adt/int.c:188 #, c-format msgid "int2vector has too many elements" msgstr "int2vectorの要素数が多すぎます" -#: utils/adt/int.c:237 +#: utils/adt/int.c:261 #, c-format msgid "invalid int2vector data" msgstr "不正なint2vectorデータ" -#: utils/adt/int.c:243 utils/adt/oid.c:215 utils/adt/oid.c:296 +#: utils/adt/int.c:267 utils/adt/oid.c:215 utils/adt/oid.c:296 #, c-format msgid "oidvector has too many elements" msgstr "oidvectorの要素が多すぎます" -#: utils/adt/int.c:1508 utils/adt/int8.c:1446 utils/adt/numeric.c:1623 utils/adt/timestamp.c:5435 utils/adt/timestamp.c:5515 +#: utils/adt/int.c:1532 utils/adt/int8.c:1404 utils/adt/numeric.c:1678 utils/adt/timestamp.c:5808 utils/adt/timestamp.c:5888 #, c-format msgid "step size cannot equal zero" msgstr "ステップ数をゼロにすることはできません" -#: utils/adt/int8.c:534 utils/adt/int8.c:557 utils/adt/int8.c:571 utils/adt/int8.c:585 utils/adt/int8.c:616 utils/adt/int8.c:640 utils/adt/int8.c:722 utils/adt/int8.c:790 utils/adt/int8.c:796 utils/adt/int8.c:822 utils/adt/int8.c:836 utils/adt/int8.c:860 utils/adt/int8.c:873 utils/adt/int8.c:942 utils/adt/int8.c:956 utils/adt/int8.c:970 utils/adt/int8.c:1001 utils/adt/int8.c:1023 utils/adt/int8.c:1037 utils/adt/int8.c:1051 utils/adt/int8.c:1084 -#: utils/adt/int8.c:1098 utils/adt/int8.c:1112 utils/adt/int8.c:1143 utils/adt/int8.c:1165 utils/adt/int8.c:1179 utils/adt/int8.c:1193 utils/adt/int8.c:1355 utils/adt/int8.c:1390 utils/adt/numeric.c:4217 utils/adt/varbit.c:1656 +#: utils/adt/int8.c:449 utils/adt/int8.c:472 utils/adt/int8.c:486 utils/adt/int8.c:500 utils/adt/int8.c:531 utils/adt/int8.c:555 utils/adt/int8.c:637 utils/adt/int8.c:705 utils/adt/int8.c:711 utils/adt/int8.c:737 utils/adt/int8.c:751 utils/adt/int8.c:775 utils/adt/int8.c:788 utils/adt/int8.c:900 utils/adt/int8.c:914 utils/adt/int8.c:928 utils/adt/int8.c:959 utils/adt/int8.c:981 utils/adt/int8.c:995 utils/adt/int8.c:1009 utils/adt/int8.c:1042 utils/adt/int8.c:1056 +#: utils/adt/int8.c:1070 utils/adt/int8.c:1101 utils/adt/int8.c:1123 utils/adt/int8.c:1137 utils/adt/int8.c:1151 utils/adt/int8.c:1313 utils/adt/int8.c:1348 utils/adt/numeric.c:4336 utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigintの範囲外です" -#: utils/adt/int8.c:1403 +#: utils/adt/int8.c:1361 #, c-format msgid "OID out of range" msgstr "OIDの範囲外です" -#: utils/adt/json.c:271 utils/adt/jsonb.c:757 +#: utils/adt/json.c:293 utils/adt/jsonb.c:747 #, c-format msgid "key value must be scalar, not array, composite, or json" msgstr "キー値は配列でも複合型でもJSONでもなく、スカラでなくてはなりません" -#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:1812 +#: utils/adt/json.c:1068 utils/adt/json.c:1078 utils/fmgr/funcapi.c:2061 #, c-format msgid "could not determine data type for argument %d" msgstr "引数%dのデータ型が特定できませんでした" -#: utils/adt/json.c:926 utils/adt/jsonb.c:1728 +#: utils/adt/json.c:1101 utils/adt/jsonb.c:1809 #, c-format msgid "field name must not be null" msgstr "フィールド名はnullであってはなりません" -#: utils/adt/json.c:1010 utils/adt/jsonb.c:1178 +#: utils/adt/json.c:1140 utils/adt/json.c:1304 +#, c-format +msgid "duplicate JSON key %s" +msgstr "重複したJSONキー %s" + +#: utils/adt/json.c:1248 utils/adt/jsonb.c:1195 #, c-format msgid "argument list must have even number of elements" msgstr "引数リストの要素数は偶数でなければなりません" #. translator: %s is a SQL function name -#: utils/adt/json.c:1012 utils/adt/jsonb.c:1180 +#: utils/adt/json.c:1250 utils/adt/jsonb.c:1197 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "%s の引数ではキーと値が交互になっている必要があります。" -#: utils/adt/json.c:1028 +#: utils/adt/json.c:1288 #, c-format msgid "argument %d cannot be null" msgstr "引数%dはnullであってはなりません" -#: utils/adt/json.c:1029 +#: utils/adt/json.c:1289 #, c-format msgid "Object keys should be text." msgstr "オブジェクトキーはテキストでなければなりません。" -#: utils/adt/json.c:1135 utils/adt/jsonb.c:1310 +#: utils/adt/json.c:1441 utils/adt/jsonb.c:1370 #, c-format msgid "array must have two columns" msgstr "配列は最低でも2つの列が必要です" -#: utils/adt/json.c:1159 utils/adt/json.c:1243 utils/adt/jsonb.c:1334 utils/adt/jsonb.c:1429 +#: utils/adt/json.c:1465 utils/adt/json.c:1548 utils/adt/jsonb.c:1394 utils/adt/jsonb.c:1489 #, c-format msgid "null value not allowed for object key" msgstr "オブジェクトキーにnullは使えません" -#: utils/adt/json.c:1232 utils/adt/jsonb.c:1418 +#: utils/adt/json.c:1537 utils/adt/jsonb.c:1478 #, c-format msgid "mismatched array dimensions" msgstr "配列の次元が合っていません" -#: utils/adt/jsonb.c:287 +#: utils/adt/json.c:1717 utils/adt/jsonb_util.c:1958 +#, c-format +msgid "duplicate JSON object key value" +msgstr "JSONオブジェクトのキー値の重複" + +#: utils/adt/jsonb.c:276 #, c-format msgid "string too long to represent as jsonb string" msgstr "文字列はjsonb文字列として表現するには長すぎます" -#: utils/adt/jsonb.c:288 +#: utils/adt/jsonb.c:277 #, c-format msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "実装上の制約のため、jsonb文字列は%dバイトまでである必要があります。" -#: utils/adt/jsonb.c:1193 +#: utils/adt/jsonb.c:1214 #, c-format msgid "argument %d: key must not be null" msgstr "引数%d: キーはnullであってはなりません" -#: utils/adt/jsonb.c:1781 +#: utils/adt/jsonb.c:1871 #, c-format msgid "object keys must be strings" msgstr "オブエクとキーは文字列である必要があります" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:2081 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "jsonb null は%s型にはキャストできません" -#: utils/adt/jsonb.c:1945 +#: utils/adt/jsonb.c:2082 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "jsonb文字列は%s型へはキャストできません" -#: utils/adt/jsonb.c:1946 +#: utils/adt/jsonb.c:2083 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "jsonb numericは%s型へはキャストできません" -#: utils/adt/jsonb.c:1947 +#: utils/adt/jsonb.c:2084 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "jsonbブール型は%s型へはキャストできません" -#: utils/adt/jsonb.c:1948 +#: utils/adt/jsonb.c:2085 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "jsonb配列は%s型へはキャストできません" -#: utils/adt/jsonb.c:1949 +#: utils/adt/jsonb.c:2086 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "jsonbオブジェクトは%s型へはキャストできません" -#: utils/adt/jsonb.c:1950 +#: utils/adt/jsonb.c:2087 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "jsonbの配列またはオブジェクトは%s型へはキャストできません" -#: utils/adt/jsonb_util.c:699 +#: utils/adt/jsonb_util.c:758 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "jsonbオブジェクトペア数が許された最大の値(%zu)を上回っています" -#: utils/adt/jsonb_util.c:740 +#: utils/adt/jsonb_util.c:799 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "jsonbの配列要素の数が許された最大の値(%zu)を上回っています" -#: utils/adt/jsonb_util.c:1614 utils/adt/jsonb_util.c:1634 +#: utils/adt/jsonb_util.c:1673 utils/adt/jsonb_util.c:1693 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %u bytes" msgstr "jsonbの配列要素の全体の大きさが許された最大値%uバイトを上回っています" -#: utils/adt/jsonb_util.c:1695 utils/adt/jsonb_util.c:1730 utils/adt/jsonb_util.c:1750 +#: utils/adt/jsonb_util.c:1754 utils/adt/jsonb_util.c:1789 utils/adt/jsonb_util.c:1809 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %u bytes" msgstr "jsonbのオブジェクト要素全体のサイズが最大値である%uを超えています" -#: utils/adt/jsonfuncs.c:551 utils/adt/jsonfuncs.c:796 utils/adt/jsonfuncs.c:2330 utils/adt/jsonfuncs.c:2770 utils/adt/jsonfuncs.c:3560 utils/adt/jsonfuncs.c:3891 +#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 +#, c-format +msgid "jsonb subscript does not support slices" +msgstr "jsonb添字はスライスをサポートしません" + +#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 +#, c-format +msgid "subscript type %s is not supported" +msgstr "添字型%sはサポートされていません" + +#: utils/adt/jsonbsubs.c:104 +#, c-format +msgid "jsonb subscript must be coercible to only one type, integer or text." +msgstr "jsonbの添字は単一の型(integerまたはtext)に変換可能でなければなりません。" + +#: utils/adt/jsonbsubs.c:118 +#, c-format +msgid "jsonb subscript must be coercible to either integer or text." +msgstr "jsonbの添字はintegerまたはtextのいずれかに変換可能でなければなりません。" + +#: utils/adt/jsonbsubs.c:139 +#, c-format +msgid "jsonb subscript must have text type" +msgstr "jsonb添字はテキスト型でなければなりません" + +#: utils/adt/jsonbsubs.c:207 +#, c-format +msgid "jsonb subscript in assignment must not be null" +msgstr "代入におけるjsonb添え字はnullにはできません" + +#: utils/adt/jsonfuncs.c:555 utils/adt/jsonfuncs.c:791 utils/adt/jsonfuncs.c:2360 utils/adt/jsonfuncs.c:2800 utils/adt/jsonfuncs.c:3633 utils/adt/jsonfuncs.c:3966 #, c-format msgid "cannot call %s on a scalar" msgstr "スカラに対して%sを呼び出すことはできません" -#: utils/adt/jsonfuncs.c:556 utils/adt/jsonfuncs.c:783 utils/adt/jsonfuncs.c:2772 utils/adt/jsonfuncs.c:3549 +#: utils/adt/jsonfuncs.c:560 utils/adt/jsonfuncs.c:778 utils/adt/jsonfuncs.c:2802 utils/adt/jsonfuncs.c:3622 #, c-format msgid "cannot call %s on an array" msgstr "配列に対して%sを呼び出すことはできません" -#: utils/adt/jsonfuncs.c:692 +#: utils/adt/jsonfuncs.c:687 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "JSONデータ、%d行目: %s%s%s" -#: utils/adt/jsonfuncs.c:1682 utils/adt/jsonfuncs.c:1717 +#: utils/adt/jsonfuncs.c:1825 utils/adt/jsonfuncs.c:1860 #, c-format msgid "cannot get array length of a scalar" msgstr "スカラから配列長を得ることはできません" -#: utils/adt/jsonfuncs.c:1686 utils/adt/jsonfuncs.c:1705 +#: utils/adt/jsonfuncs.c:1829 utils/adt/jsonfuncs.c:1848 #, c-format msgid "cannot get array length of a non-array" msgstr "配列では無いものから配列長を得ることはできません" -#: utils/adt/jsonfuncs.c:1782 +#: utils/adt/jsonfuncs.c:1922 #, c-format msgid "cannot call %s on a non-object" msgstr "非オブジェクトに対して%sは呼び出せません" -#: utils/adt/jsonfuncs.c:2021 +#: utils/adt/jsonfuncs.c:2106 #, c-format msgid "cannot deconstruct an array as an object" msgstr "配列をオブジェクトとして再構築することはできません" -#: utils/adt/jsonfuncs.c:2033 +#: utils/adt/jsonfuncs.c:2118 #, c-format msgid "cannot deconstruct a scalar" msgstr "スカラを再構築することはできません" -#: utils/adt/jsonfuncs.c:2079 +#: utils/adt/jsonfuncs.c:2161 #, c-format msgid "cannot extract elements from a scalar" msgstr "スカラから要素を取り出すことはできません" -#: utils/adt/jsonfuncs.c:2083 +#: utils/adt/jsonfuncs.c:2165 #, c-format msgid "cannot extract elements from an object" msgstr "オブジェクトから要素を取り出すことはできません" -#: utils/adt/jsonfuncs.c:2317 utils/adt/jsonfuncs.c:3775 +#: utils/adt/jsonfuncs.c:2347 utils/adt/jsonfuncs.c:3851 #, c-format msgid "cannot call %s on a non-array" msgstr "非配列に対して%sを呼び出すことはできません" -#: utils/adt/jsonfuncs.c:2387 utils/adt/jsonfuncs.c:2392 utils/adt/jsonfuncs.c:2409 utils/adt/jsonfuncs.c:2415 +#: utils/adt/jsonfuncs.c:2417 utils/adt/jsonfuncs.c:2422 utils/adt/jsonfuncs.c:2439 utils/adt/jsonfuncs.c:2445 #, c-format msgid "expected JSON array" msgstr "JSON配列を期待していました" -#: utils/adt/jsonfuncs.c:2388 +#: utils/adt/jsonfuncs.c:2418 #, c-format msgid "See the value of key \"%s\"." msgstr "キー\"%s\"の値を見てください。" -#: utils/adt/jsonfuncs.c:2410 +#: utils/adt/jsonfuncs.c:2440 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "キー\"%s\"の配列要素%sを見てください。" -#: utils/adt/jsonfuncs.c:2416 +#: utils/adt/jsonfuncs.c:2446 #, c-format msgid "See the array element %s." msgstr "配列要素%sを見てください。" -#: utils/adt/jsonfuncs.c:2451 +#: utils/adt/jsonfuncs.c:2481 #, c-format msgid "malformed JSON array" msgstr "不正な形式のJSON配列" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3278 +#: utils/adt/jsonfuncs.c:3352 #, c-format msgid "first argument of %s must be a row type" msgstr "%sの最初の引数は行型でなければなりません" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3302 +#: utils/adt/jsonfuncs.c:3376 #, c-format msgid "could not determine row type for result of %s" msgstr "%sの結果に対応する行の型を決定できませんでした" -#: utils/adt/jsonfuncs.c:3304 +#: utils/adt/jsonfuncs.c:3378 #, c-format msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." msgstr "非NULLのレコード引数を与えるか、列定義リストを用いてこの関数をFROM句中で呼び出してください。" -#: utils/adt/jsonfuncs.c:3792 utils/adt/jsonfuncs.c:3873 +#: utils/adt/jsonfuncs.c:3740 utils/fmgr/funcapi.c:94 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "マテリアライズモードが必要ですが、現在のコンテクストで禁止されています" + +#: utils/adt/jsonfuncs.c:3868 utils/adt/jsonfuncs.c:3948 #, c-format msgid "argument of %s must be an array of objects" msgstr "%sの引数はオブジェクト配列でなければなりません" -#: utils/adt/jsonfuncs.c:3825 +#: utils/adt/jsonfuncs.c:3901 #, c-format msgid "cannot call %s on an object" msgstr "オブジェクトに対して%sを呼び出すことはできません" -#: utils/adt/jsonfuncs.c:4286 utils/adt/jsonfuncs.c:4345 utils/adt/jsonfuncs.c:4425 +#: utils/adt/jsonfuncs.c:4308 utils/adt/jsonfuncs.c:4367 utils/adt/jsonfuncs.c:4447 #, c-format msgid "cannot delete from scalar" msgstr "スカラから削除することはできません" -#: utils/adt/jsonfuncs.c:4430 +#: utils/adt/jsonfuncs.c:4452 #, c-format msgid "cannot delete from object using integer index" msgstr "オブジェクトから整数添字を使って削除することはできません" -#: utils/adt/jsonfuncs.c:4495 utils/adt/jsonfuncs.c:4653 +#: utils/adt/jsonfuncs.c:4520 utils/adt/jsonfuncs.c:4681 #, c-format msgid "cannot set path in scalar" msgstr "スカラにパスを設定することはできません" -#: utils/adt/jsonfuncs.c:4537 utils/adt/jsonfuncs.c:4579 +#: utils/adt/jsonfuncs.c:4562 utils/adt/jsonfuncs.c:4604 #, c-format msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" msgstr "null_value_treatment は \"delete_key\", \"return_target\", \"use_json_null\" または \"raise_exception\"である必要があります" -#: utils/adt/jsonfuncs.c:4550 +#: utils/adt/jsonfuncs.c:4575 #, c-format msgid "JSON value must not be null" msgstr "JSON値はnullではあってはなりません" -#: utils/adt/jsonfuncs.c:4551 +#: utils/adt/jsonfuncs.c:4576 #, c-format msgid "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "null_value_treatmentが\"raise_exception\"であるため、例外が出力されました" -#: utils/adt/jsonfuncs.c:4552 +#: utils/adt/jsonfuncs.c:4577 #, c-format msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." msgstr "これを避けるには、 null_value_treatment引数を変更するか、SQLのNULLを渡さないようにしてください。" -#: utils/adt/jsonfuncs.c:4607 +#: utils/adt/jsonfuncs.c:4632 #, c-format msgid "cannot delete path in scalar" msgstr "スカラでパスを削除することはできません" -#: utils/adt/jsonfuncs.c:4776 -#, c-format -msgid "invalid concatenation of jsonb objects" -msgstr "jsonbオブジェクト間の不正な結合" - -#: utils/adt/jsonfuncs.c:4810 +#: utils/adt/jsonfuncs.c:4848 #, c-format msgid "path element at position %d is null" msgstr "位置%dのパス要素がnullです" -#: utils/adt/jsonfuncs.c:4896 +#: utils/adt/jsonfuncs.c:4867 utils/adt/jsonfuncs.c:4898 utils/adt/jsonfuncs.c:4965 #, c-format msgid "cannot replace existing key" msgstr "既存のキーを置き換えることはできません" -#: utils/adt/jsonfuncs.c:4897 +#: utils/adt/jsonfuncs.c:4868 utils/adt/jsonfuncs.c:4899 +#, c-format +msgid "The path assumes key is a composite object, but it is a scalar value." +msgstr "このパスではキー値は複合オブジェクトであると想定していますが、スカラー値でした" + +#: utils/adt/jsonfuncs.c:4966 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "jsonb_set関数を使ってキー値を置き換えることを試してください。" -#: utils/adt/jsonfuncs.c:4979 +#: utils/adt/jsonfuncs.c:5070 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "位置%dのパス要素が整数ではありません: \"%s\"" -#: utils/adt/jsonfuncs.c:5098 +#: utils/adt/jsonfuncs.c:5087 +#, c-format +msgid "path element at position %d is out of range: %d" +msgstr "位置%dのパス要素は範囲外です: %d" + +#: utils/adt/jsonfuncs.c:5239 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "間違ったフラグのタイプ; 配列およびスカラのみ使用可能です" -#: utils/adt/jsonfuncs.c:5105 +#: utils/adt/jsonfuncs.c:5246 #, c-format msgid "flag array element is not a string" msgstr "フラグ配列の要素が文字列ではありません" -#: utils/adt/jsonfuncs.c:5106 utils/adt/jsonfuncs.c:5128 +#: utils/adt/jsonfuncs.c:5247 utils/adt/jsonfuncs.c:5269 #, c-format msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." msgstr "使用可能な値は: \"string\", \"numeric\", \"boolean\", \"key\"、および \"all\"。" -#: utils/adt/jsonfuncs.c:5126 +#: utils/adt/jsonfuncs.c:5267 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "フラグ配列内の間違ったフラグ値: \"%s\"" -#: utils/adt/jsonpath.c:362 +#: utils/adt/jsonpath.c:364 #, c-format msgid "@ is not allowed in root expressions" msgstr "ルート式では@を使用できません" -#: utils/adt/jsonpath.c:368 +#: utils/adt/jsonpath.c:370 #, c-format msgid "LAST is allowed only in array subscripts" msgstr "LAST は配列の添え字でのみ使用可能です" -#: utils/adt/jsonpath_exec.c:360 +#: utils/adt/jsonpath_exec.c:434 #, c-format msgid "single boolean result is expected" msgstr "単一のブール値の結果が必要です" -#: utils/adt/jsonpath_exec.c:556 -#, c-format -msgid "\"vars\" argument is not an object" -msgstr "引数\"vars\"がオブジェクトではありません" - -#: utils/adt/jsonpath_exec.c:557 -#, c-format -msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." -msgstr "Jsonpath パラメータは \"vars\"オブジェクトの key-value ペアの形にエンコードされていなければなりません。" - -#: utils/adt/jsonpath_exec.c:674 +#: utils/adt/jsonpath_exec.c:746 #, c-format msgid "JSON object does not contain key \"%s\"" msgstr "JSONオブジェクトはキー\"%s\"を含んでいません" -#: utils/adt/jsonpath_exec.c:686 +#: utils/adt/jsonpath_exec.c:758 #, c-format msgid "jsonpath member accessor can only be applied to an object" msgstr "jsonpathメンバアクセサはオブジェクトに対してのみ適用可能です" -#: utils/adt/jsonpath_exec.c:715 +#: utils/adt/jsonpath_exec.c:787 #, c-format msgid "jsonpath wildcard array accessor can only be applied to an array" msgstr "jsonpath ワイルドカード配列アクセサは配列にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:763 +#: utils/adt/jsonpath_exec.c:835 #, c-format msgid "jsonpath array subscript is out of bounds" msgstr "jsonpath配列の添え字が範囲外です" -#: utils/adt/jsonpath_exec.c:820 +#: utils/adt/jsonpath_exec.c:892 #, c-format msgid "jsonpath array accessor can only be applied to an array" msgstr "jsonpath 配列アクセサは配列にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:874 +#: utils/adt/jsonpath_exec.c:944 #, c-format msgid "jsonpath wildcard member accessor can only be applied to an object" msgstr "jsonpathワイルドカードメンバアクセサはオブジェクトに対してのみ適用可能です" -#: utils/adt/jsonpath_exec.c:1004 +#: utils/adt/jsonpath_exec.c:1074 #, c-format msgid "jsonpath item method .%s() can only be applied to an array" msgstr "jsonpath 項目メソッド .%s() は配列にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:1059 +#: utils/adt/jsonpath_exec.c:1127 #, c-format msgid "numeric argument of jsonpath item method .%s() is out of range for type double precision" msgstr "JSONパス項目メソッド .%s() のnumeric型の引数がdouble precisionの範囲外です" -#: utils/adt/jsonpath_exec.c:1080 +#: utils/adt/jsonpath_exec.c:1148 #, c-format msgid "string argument of jsonpath item method .%s() is not a valid representation of a double precision number" msgstr "jsonpath項目メソッド .%s() の文字列引数はの有効な倍精度数表現ではありません" -#: utils/adt/jsonpath_exec.c:1093 +#: utils/adt/jsonpath_exec.c:1161 #, c-format msgid "jsonpath item method .%s() can only be applied to a string or numeric value" msgstr "jsonpath 項目メソッド .%s() は文字列または数値にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:1583 +#: utils/adt/jsonpath_exec.c:1651 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "jsonpath演算子 %s の左辺値が単一の数値ではありません" -#: utils/adt/jsonpath_exec.c:1590 +#: utils/adt/jsonpath_exec.c:1658 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "jsonpath演算子 %s の右辺値が単一の数値ではありません" -#: utils/adt/jsonpath_exec.c:1658 +#: utils/adt/jsonpath_exec.c:1726 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "単項jsonpath演算子 %s のオペランドが数値ではありません" -#: utils/adt/jsonpath_exec.c:1756 +#: utils/adt/jsonpath_exec.c:1824 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "jsonpath 項目メソッド .%s() は数値にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:1796 +#: utils/adt/jsonpath_exec.c:1864 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "jsonpath 項目メソッド .%s() は文字列にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:1884 +#: utils/adt/jsonpath_exec.c:1958 #, c-format msgid "datetime format is not recognized: \"%s\"" msgstr "datetime書式を認識できません: \"%s\"" -#: utils/adt/jsonpath_exec.c:1886 +#: utils/adt/jsonpath_exec.c:1960 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "datetimeテンプレート引数を使って入力データフォーマットを指定してください。" -#: utils/adt/jsonpath_exec.c:1954 +#: utils/adt/jsonpath_exec.c:2028 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "jsonpath項目メソッド .%s() はオブジェクトに対してのみ適用可能です" -#: utils/adt/jsonpath_exec.c:2137 +#: utils/adt/jsonpath_exec.c:2195 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "jsonpath変数\"%s\"が見つかりませんでした" -#: utils/adt/jsonpath_exec.c:2401 +#: utils/adt/jsonpath_exec.c:2216 +#, c-format +msgid "\"vars\" argument is not an object" +msgstr "引数\"vars\"がオブジェクトではありません" + +#: utils/adt/jsonpath_exec.c:2217 +#, c-format +msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." +msgstr "Jsonpath パラメータは \"vars\"オブジェクトの key-value ペアの形にエンコードされていなければなりません。" + +#: utils/adt/jsonpath_exec.c:2495 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "jsonpath配列添え字が単一の数値ではありません" -#: utils/adt/jsonpath_exec.c:2413 +#: utils/adt/jsonpath_exec.c:2507 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "jsonpath配列の添え字が整数の範囲外です" -#: utils/adt/jsonpath_exec.c:2590 +#: utils/adt/jsonpath_exec.c:2691 +#, c-format +msgid "cannot convert value from %s to %s without time zone usage" +msgstr "時間帯を使用せずに%sから%sへの値の変換はできません" + +#: utils/adt/jsonpath_exec.c:2693 +#, c-format +msgid "Use *_tz() function for time zone support." +msgstr "*_tz() 関数を使用することで時間帯がサポートされます。" + +#: utils/adt/jsonpath_exec.c:2974 #, c-format -msgid "cannot convert value from %s to %s without timezone usage" -msgstr "時間帯を使用せずに %s から %s への値の変換はできません" +msgid "JSON path expression in JSON_QUERY should return singleton item without wrapper" +msgstr "JSON_QUERY内のJSONパス式はラッパーを使わない場合は単一項目を返却するべきです" -#: utils/adt/jsonpath_exec.c:2592 +#: utils/adt/jsonpath_exec.c:2976 #, c-format -msgid "Use *_tz() function for timezone support." -msgstr "*_tz() 関数を使用することで時間帯がサポートされます" +msgid "use WITH WRAPPER clause to wrap SQL/JSON item sequence into array" +msgstr "WITH WRAPPERを使用してSQL/JSON項目列を配列に格納するようにしてください" + +#: utils/adt/jsonpath_exec.c:3024 utils/adt/jsonpath_exec.c:3044 +#, c-format +msgid "JSON path expression in JSON_VALUE should return singleton scalar item" +msgstr "JSON_VALUE内のJSONパス式は単一のスカラー項目を返却するべきです" + +#: utils/adt/jsonpath_exec.c:3137 +#, c-format +msgid "only bool, numeric, and text types could be casted to supported jsonpath types." +msgstr "bool、numeric、そしてtext型のみがサポートされるjsonpath型に変換可能です。" #: utils/adt/levenshtein.c:133 #, c-format @@ -22211,7 +23951,7 @@ msgstr "レーベンシュタイン距離関数の引数の長さが上限の%d msgid "nondeterministic collations are not supported for LIKE" msgstr "非決定的照合順序はLIKEではサポートされません" -#: utils/adt/like.c:193 utils/adt/like_support.c:1002 +#: utils/adt/like.c:189 utils/adt/like_support.c:1023 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "ILIKE で使用する照合順序を特定できませんでした" @@ -22226,27 +23966,27 @@ msgstr "非決定的照合順序はILIKEではサポートされません" msgid "LIKE pattern must not end with escape character" msgstr "LIKE パターンはエスケープ文字で終わってはなりません" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:700 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:786 #, c-format msgid "invalid escape string" msgstr "不正なエスケープ文字列" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:701 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:787 #, c-format msgid "Escape string must be empty or one character." msgstr "エスケープ文字は空か1文字でなければなりません。" -#: utils/adt/like_support.c:987 +#: utils/adt/like_support.c:1013 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "型byteaでは大文字小文字の区別をしないマッチをサポートしません" -#: utils/adt/like_support.c:1089 +#: utils/adt/like_support.c:1114 #, c-format msgid "regular-expression matching not supported on type bytea" msgstr "型byteaでは正規表現のマッチをサポートしません" -#: utils/adt/mac.c:102 +#: utils/adt/mac.c:101 #, c-format msgid "invalid octet value in \"macaddr\" value: \"%s\"" msgstr "\"macaddr\"の値での不正なオクテット値: \"%s\"" @@ -22261,411 +24001,414 @@ msgstr "macaddr8データがmacaddr型に変換するには範囲外です" msgid "Only addresses that have FF and FE as values in the 4th and 5th bytes from the left, for example xx:xx:xx:ff:fe:xx:xx:xx, are eligible to be converted from macaddr8 to macaddr." msgstr "左から4、5バイト目にFFとFEがあるアドレス、具体的には xx:xx:xx:ff:fe:xx:xx:xx のみがmacaddr8からmacaddrに変換できます。" -#: utils/adt/misc.c:240 +#: utils/adt/mcxtfuncs.c:182 +#, c-format +msgid "PID %d is not a PostgreSQL server process" +msgstr "PID %dはPostgreSQLサーバプロセスではありません" + +#: utils/adt/misc.c:216 #, c-format msgid "global tablespace never has databases" msgstr "グローバルテーブル空間にデータベースがありません" -#: utils/adt/misc.c:262 +#: utils/adt/misc.c:238 #, c-format msgid "%u is not a tablespace OID" msgstr "%uはテーブル空間のOIDではありません" -#: utils/adt/misc.c:448 +#: utils/adt/misc.c:457 msgid "unreserved" msgstr "予約されていません" -#: utils/adt/misc.c:452 +#: utils/adt/misc.c:461 msgid "unreserved (cannot be function or type name)" msgstr "予約されていません(関数または型名にはできません)" -#: utils/adt/misc.c:456 +#: utils/adt/misc.c:465 msgid "reserved (can be function or type name)" msgstr "予約されています(関数または型名にできます)" -#: utils/adt/misc.c:460 +#: utils/adt/misc.c:469 msgid "reserved" msgstr "予約されています" -#: utils/adt/misc.c:634 utils/adt/misc.c:648 utils/adt/misc.c:687 utils/adt/misc.c:693 utils/adt/misc.c:699 utils/adt/misc.c:722 +#: utils/adt/misc.c:480 +msgid "can be bare label" +msgstr "ASは省略可" + +#: utils/adt/misc.c:485 +msgid "requires AS" +msgstr "ASが必要" + +#: utils/adt/misc.c:732 utils/adt/misc.c:746 utils/adt/misc.c:785 utils/adt/misc.c:791 utils/adt/misc.c:797 utils/adt/misc.c:820 #, c-format msgid "string is not a valid identifier: \"%s\"" msgstr "文字列は有効な識別子ではありません: \"%s\"" -#: utils/adt/misc.c:636 +#: utils/adt/misc.c:734 #, c-format msgid "String has unclosed double quotes." msgstr "文字列中に閉じられていない二重引用符があります。" -#: utils/adt/misc.c:650 +#: utils/adt/misc.c:748 #, c-format msgid "Quoted identifier must not be empty." msgstr "引用符で囲まれた識別子は空であってはなりません。" -#: utils/adt/misc.c:689 +#: utils/adt/misc.c:787 #, c-format msgid "No valid identifier before \".\"." msgstr "\".\"の前に有効な識別子がありません。" -#: utils/adt/misc.c:695 +#: utils/adt/misc.c:793 #, c-format msgid "No valid identifier after \".\"." msgstr "\".\"の後に有効な識別子がありません。" -#: utils/adt/misc.c:753 +#: utils/adt/misc.c:853 #, c-format msgid "log format \"%s\" is not supported" msgstr "ログ形式\"%s\"はサポートされていません" -#: utils/adt/misc.c:754 +#: utils/adt/misc.c:854 +#, c-format +msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." +msgstr "サポートされているログ形式は\"stderr\"、\"csvlog\"、そして\"jsonlog\"です。" + +#: utils/adt/multirangetypes.c:149 utils/adt/multirangetypes.c:162 utils/adt/multirangetypes.c:191 utils/adt/multirangetypes.c:261 utils/adt/multirangetypes.c:285 +#, c-format +msgid "malformed multirange literal: \"%s\"" +msgstr "不正な複範囲リテラル: \"%s\"" + +#: utils/adt/multirangetypes.c:151 +#, c-format +msgid "Missing left brace." +msgstr "左大括弧がありません" + +#: utils/adt/multirangetypes.c:193 #, c-format -msgid "The supported log formats are \"stderr\" and \"csvlog\"." -msgstr "サポートされているログ形式は\"stderr\"と\"csvlog\"です。" +msgid "Expected range start." +msgstr "範囲の開始を予期していました。" -#: utils/adt/network.c:111 +#: utils/adt/multirangetypes.c:263 +#, c-format +msgid "Expected comma or end of multirange." +msgstr "カンマまたは複範囲の終了を予期していました。" + +#: utils/adt/multirangetypes.c:976 +#, c-format +msgid "multiranges cannot be constructed from multidimensional arrays" +msgstr "複範囲型は多次元配列からは生成できません" + +#: utils/adt/multirangetypes.c:1002 +#, c-format +msgid "multirange values cannot contain null members" +msgstr "複範囲値はnullの要素を持てません" + +#: utils/adt/network.c:110 #, c-format msgid "invalid cidr value: \"%s\"" msgstr "不正なCIDR値: \"%s\"" -#: utils/adt/network.c:112 utils/adt/network.c:242 +#: utils/adt/network.c:111 utils/adt/network.c:241 #, c-format msgid "Value has bits set to right of mask." msgstr "値ではマスクの右側のビットがセットされています。" -#: utils/adt/network.c:153 utils/adt/network.c:1199 utils/adt/network.c:1224 utils/adt/network.c:1249 +#: utils/adt/network.c:152 utils/adt/network.c:1184 utils/adt/network.c:1209 utils/adt/network.c:1234 #, c-format msgid "could not format inet value: %m" msgstr "inet値を整形できませんでした: %m" #. translator: %s is inet or cidr -#: utils/adt/network.c:210 +#: utils/adt/network.c:209 #, c-format msgid "invalid address family in external \"%s\" value" msgstr "外部の\"%s\"値内の不正なアドレスファミリ" #. translator: %s is inet or cidr -#: utils/adt/network.c:217 +#: utils/adt/network.c:216 #, c-format msgid "invalid bits in external \"%s\" value" msgstr "外部の\"%s\"値内の不正なビット列" #. translator: %s is inet or cidr -#: utils/adt/network.c:226 +#: utils/adt/network.c:225 #, c-format msgid "invalid length in external \"%s\" value" msgstr "外部の\"%s\"値内の不正な長さ" -#: utils/adt/network.c:241 +#: utils/adt/network.c:240 #, c-format msgid "invalid external \"cidr\" value" msgstr "\"cidr\"の外部値が不正です" -#: utils/adt/network.c:337 utils/adt/network.c:360 +#: utils/adt/network.c:336 utils/adt/network.c:359 #, c-format msgid "invalid mask length: %d" msgstr "不正なマスク長: %d" -#: utils/adt/network.c:1267 +#: utils/adt/network.c:1252 #, c-format msgid "could not format cidr value: %m" msgstr "cidr値を整形できませんでした: %m" -#: utils/adt/network.c:1500 +#: utils/adt/network.c:1485 #, c-format msgid "cannot merge addresses from different families" msgstr "異なるファミリのアドレスは結合できません" -#: utils/adt/network.c:1916 +#: utils/adt/network.c:1901 #, c-format msgid "cannot AND inet values of different sizes" msgstr "サイズが異なるinet値のANDはできません" -#: utils/adt/network.c:1948 +#: utils/adt/network.c:1933 #, c-format msgid "cannot OR inet values of different sizes" msgstr "サイズが異なるinet値のORはできません" -#: utils/adt/network.c:2009 utils/adt/network.c:2085 +#: utils/adt/network.c:1994 utils/adt/network.c:2070 #, c-format msgid "result is out of range" msgstr "結果が範囲外です" -#: utils/adt/network.c:2050 +#: utils/adt/network.c:2035 #, c-format msgid "cannot subtract inet values of different sizes" msgstr "サイズが異なるinet値の引き算はできません" -#: utils/adt/numeric.c:974 +#: utils/adt/numeric.c:1027 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "外部\"numeric\"の値の符号が不正です" -#: utils/adt/numeric.c:980 +#: utils/adt/numeric.c:1033 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "外部\"numeric\"の値の位取りが不正です" -#: utils/adt/numeric.c:989 +#: utils/adt/numeric.c:1042 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "外部\"numeric\"の値の桁が不正です" -#: utils/adt/numeric.c:1202 utils/adt/numeric.c:1216 +#: utils/adt/numeric.c:1257 utils/adt/numeric.c:1271 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "NUMERICの精度%dは1から%dまででなければなりません" -#: utils/adt/numeric.c:1207 +#: utils/adt/numeric.c:1262 #, c-format -msgid "NUMERIC scale %d must be between 0 and precision %d" -msgstr "NUMERICの位取り%dは0から精度%dまででなければなりません" +msgid "NUMERIC scale %d must be between %d and %d" +msgstr "NUMERICの位取り%dは%dから%dまでの間でなければなりません" -#: utils/adt/numeric.c:1225 +#: utils/adt/numeric.c:1280 #, c-format msgid "invalid NUMERIC type modifier" msgstr "不正なNUMERIC型の修正子" -#: utils/adt/numeric.c:1583 +#: utils/adt/numeric.c:1638 #, c-format msgid "start value cannot be NaN" msgstr "開始値はNaNにはできません" -#: utils/adt/numeric.c:1587 +#: utils/adt/numeric.c:1642 #, c-format msgid "start value cannot be infinity" msgstr "開始値は無限大にはできません" -#: utils/adt/numeric.c:1594 +#: utils/adt/numeric.c:1649 #, c-format msgid "stop value cannot be NaN" msgstr "終了値はNaNにはできません" -#: utils/adt/numeric.c:1598 +#: utils/adt/numeric.c:1653 #, c-format msgid "stop value cannot be infinity" msgstr "終了値は無限大にはできません" -#: utils/adt/numeric.c:1611 +#: utils/adt/numeric.c:1666 #, c-format msgid "step size cannot be NaN" msgstr "加算量はNaNにはできません" -#: utils/adt/numeric.c:1615 +#: utils/adt/numeric.c:1670 #, c-format msgid "step size cannot be infinity" msgstr "加算量は無限大にはできません" -#: utils/adt/numeric.c:1730 -#, c-format -msgid "operand, lower bound, and upper bound cannot be infinity" -msgstr "オペランド、下限、上限を無限大にすることはできません" - -#: utils/adt/numeric.c:3488 +#: utils/adt/numeric.c:3551 #, c-format msgid "factorial of a negative number is undefined" msgstr "負数の階乗は定義されていません" -#: utils/adt/numeric.c:3498 utils/adt/numeric.c:6919 utils/adt/numeric.c:7403 utils/adt/numeric.c:9767 utils/adt/numeric.c:10205 utils/adt/numeric.c:10319 utils/adt/numeric.c:10392 +#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6917 utils/adt/numeric.c:7432 utils/adt/numeric.c:9957 utils/adt/numeric.c:10436 utils/adt/numeric.c:10562 utils/adt/numeric.c:10635 #, c-format msgid "value overflows numeric format" msgstr "値がnumericの形式でオーバフローします" -#: utils/adt/numeric.c:4116 +#: utils/adt/numeric.c:4243 utils/adt/numeric.c:4323 utils/adt/numeric.c:4364 utils/adt/numeric.c:4558 #, c-format -msgid "cannot convert NaN to integer" -msgstr "NaNをintegerに変換できません" +msgid "cannot convert NaN to %s" +msgstr "NaNを%sには変換できません" -#: utils/adt/numeric.c:4120 +#: utils/adt/numeric.c:4247 utils/adt/numeric.c:4327 utils/adt/numeric.c:4368 utils/adt/numeric.c:4562 #, c-format -msgid "cannot convert infinity to integer" -msgstr "無限大をintegerには変換できません" +msgid "cannot convert infinity to %s" +msgstr "無限大を%sに変換できません" -#: utils/adt/numeric.c:4204 -#, c-format -msgid "cannot convert NaN to bigint" -msgstr "NaNをbigintに変換できません" - -#: utils/adt/numeric.c:4208 -#, c-format -msgid "cannot convert infinity to bigint" -msgstr "無限大をbigintには変換できません" - -#: utils/adt/numeric.c:4255 -#, c-format -msgid "cannot convert NaN to smallint" -msgstr "NaNをsmallintに変換できません" - -#: utils/adt/numeric.c:4259 -#, c-format -msgid "cannot convert infinity to smallint" -msgstr "無限大をsmallintに変換できません" - -#: utils/adt/numeric.c:4450 -#, c-format -msgid "cannot convert NaN to pg_lsn" -msgstr "NaNをpg_lsnには変換できません" - -#: utils/adt/numeric.c:4454 -#, c-format -msgid "cannot convert infinity to pg_lsn" -msgstr "無限大をpg_lsnに変換できません" - -#: utils/adt/numeric.c:4463 +#: utils/adt/numeric.c:4571 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsnの範囲外です" -#: utils/adt/numeric.c:7487 utils/adt/numeric.c:7534 +#: utils/adt/numeric.c:7519 utils/adt/numeric.c:7565 #, c-format msgid "numeric field overflow" msgstr "numericフィールドのオーバーフロー" -#: utils/adt/numeric.c:7488 +#: utils/adt/numeric.c:7520 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "精度%d、位取り%dを持つフィールドは、%s%dより小さな絶対値に丸められます。" -#: utils/adt/numeric.c:7535 +#: utils/adt/numeric.c:7566 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "精度%d、位取り%dを持つフィールドは、無限大値を格納できません。" -#: utils/adt/numutils.c:154 -#, c-format -msgid "value \"%s\" is out of range for 8-bit integer" -msgstr "値\"%s\"は8ビット整数の範囲外です" - #: utils/adt/oid.c:290 #, c-format msgid "invalid oidvector data" msgstr "不正なoidvectorデータ" -#: utils/adt/oracle_compat.c:896 +#: utils/adt/oracle_compat.c:969 #, c-format msgid "requested character too large" msgstr "要求された文字が大きすぎます" -#: utils/adt/oracle_compat.c:946 utils/adt/oracle_compat.c:1008 -#, c-format -msgid "requested character too large for encoding: %d" -msgstr "要求された文字は符号化するには大きすぎます: %d" - -#: utils/adt/oracle_compat.c:987 +#: utils/adt/oracle_compat.c:1013 #, c-format -msgid "requested character not valid for encoding: %d" -msgstr "要求された文字は不正なため符号化することができません: %d" +msgid "character number must be positive" +msgstr "文字番号は正数でなければなりません" -#: utils/adt/oracle_compat.c:1001 +#: utils/adt/oracle_compat.c:1017 #, c-format msgid "null character not permitted" msgstr "NULL文字は許可されません" -#: utils/adt/orderedsetaggs.c:442 utils/adt/orderedsetaggs.c:546 utils/adt/orderedsetaggs.c:684 +#: utils/adt/oracle_compat.c:1035 utils/adt/oracle_compat.c:1088 +#, c-format +msgid "requested character too large for encoding: %u" +msgstr "要求された文字は符号化するには大きすぎます: %u" + +#: utils/adt/oracle_compat.c:1076 +#, c-format +msgid "requested character not valid for encoding: %u" +msgstr "要求された文字は符号化方式に対して不正です: %u" + +#: utils/adt/orderedsetaggs.c:448 utils/adt/orderedsetaggs.c:552 utils/adt/orderedsetaggs.c:690 #, c-format msgid "percentile value %g is not between 0 and 1" msgstr "百分位数の値%gが0と1の間ではありません" -#: utils/adt/pg_locale.c:1253 +#: utils/adt/pg_locale.c:1228 #, c-format msgid "Apply system library package updates." msgstr "システムライブラリの更新を適用してください。" -#: utils/adt/pg_locale.c:1468 +#: utils/adt/pg_locale.c:1452 utils/adt/pg_locale.c:1700 utils/adt/pg_locale.c:1979 utils/adt/pg_locale.c:2001 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "ロケール\"%s\"の照合器をオープンできませんでした: %s" + +#: utils/adt/pg_locale.c:1465 utils/adt/pg_locale.c:2010 +#, c-format +msgid "ICU is not supported in this build" +msgstr "このビルドではICUはサポートされていません" + +#: utils/adt/pg_locale.c:1494 #, c-format msgid "could not create locale \"%s\": %m" msgstr "ロケール\"%s\"を作成できませんでした: %m" -#: utils/adt/pg_locale.c:1471 +#: utils/adt/pg_locale.c:1497 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "オペレーティングシステムはロケール名\"%s\"のロケールデータを見つけられませんでした。" -#: utils/adt/pg_locale.c:1573 +#: utils/adt/pg_locale.c:1605 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "このプラットフォームでは値が異なるcollateとctypeによる照合順序をサポートしていません" -#: utils/adt/pg_locale.c:1582 +#: utils/adt/pg_locale.c:1614 #, c-format msgid "collation provider LIBC is not supported on this platform" msgstr "照合順序プロバイダLIBCはこのプラットフォームではサポートされていません" -#: utils/adt/pg_locale.c:1594 -#, c-format -msgid "collations with different collate and ctype values are not supported by ICU" -msgstr "ICUは値が異なるcollateとctypeによる照合順序をサポートしていません" - -#: utils/adt/pg_locale.c:1600 utils/adt/pg_locale.c:1687 utils/adt/pg_locale.c:1960 -#, c-format -msgid "could not open collator for locale \"%s\": %s" -msgstr "ロケール\"%s\"の照合器をオープンできませんでした: %s" - -#: utils/adt/pg_locale.c:1614 -#, c-format -msgid "ICU is not supported in this build" -msgstr "このビルドではICUはサポートされていません" - -#: utils/adt/pg_locale.c:1615 +#: utils/adt/pg_locale.c:1649 #, c-format -msgid "You need to rebuild PostgreSQL using --with-icu." -msgstr "--with-icuを使用してPostgreSQLを再構築する必要があります。" +msgid "collation \"%s\" has no actual version, but a version was recorded" +msgstr "照合順序\"%s\"には実際のバージョンがありませんが、バージョンが記録されています" -#: utils/adt/pg_locale.c:1635 -#, c-format -msgid "collation \"%s\" has no actual version, but a version was specified" -msgstr "照合順序\"%s\"には実際のバージョンがありませんが、バージョンが指定されています" - -#: utils/adt/pg_locale.c:1642 +#: utils/adt/pg_locale.c:1655 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "照合順序\"%s\"でバージョンの不一致が起きています" -#: utils/adt/pg_locale.c:1644 +#: utils/adt/pg_locale.c:1657 #, c-format msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgstr "データベース中の照合順序はバージョン%sで作成されていますが、オペレーティングシステムはバージョン%sを提供しています。" -#: utils/adt/pg_locale.c:1647 +#: utils/adt/pg_locale.c:1660 #, c-format msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." msgstr "この照合順序の影響を受ける全てのオブジェクトを再構築して、ALTER COLLATION %s REFRESH VERSIONを実行するか、正しいバージョンのライブラリを用いてPostgreSQLをビルドしてください。" -#: utils/adt/pg_locale.c:1738 +#: utils/adt/pg_locale.c:1731 +#, c-format +msgid "could not load locale \"%s\"" +msgstr "ロケール\"%s\"をロードできませんでした" + +#: utils/adt/pg_locale.c:1756 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "ロケール\"%s\"に対応する照合順序バージョンを取得できませんでした: エラーコード %lu" -#: utils/adt/pg_locale.c:1775 +#: utils/adt/pg_locale.c:1794 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "エンコーディング\"%s\"はICUではサポートされていません" -#: utils/adt/pg_locale.c:1782 +#: utils/adt/pg_locale.c:1801 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "エンコーディング\"%s\"のICU変換器をオープンできませんでした: %s" -#: utils/adt/pg_locale.c:1813 utils/adt/pg_locale.c:1822 utils/adt/pg_locale.c:1851 utils/adt/pg_locale.c:1861 +#: utils/adt/pg_locale.c:1832 utils/adt/pg_locale.c:1841 utils/adt/pg_locale.c:1870 utils/adt/pg_locale.c:1880 #, c-format msgid "%s failed: %s" msgstr "%s が失敗しました: %s" -#: utils/adt/pg_locale.c:2133 +#: utils/adt/pg_locale.c:2179 #, c-format msgid "invalid multibyte character for locale" msgstr "ロケールに対する不正なマルチバイト文字" -#: utils/adt/pg_locale.c:2134 +#: utils/adt/pg_locale.c:2180 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "おそらくサーバのLC_CTYPEロケールはデータベースの符号化方式と互換性がありません" -#: utils/adt/pg_lsn.c:269 +#: utils/adt/pg_lsn.c:263 #, c-format msgid "cannot add NaN to pg_lsn" msgstr "pg_lsnにNaNは加算できません" -#: utils/adt/pg_lsn.c:303 +#: utils/adt/pg_lsn.c:297 #, c-format msgid "cannot subtract NaN from pg_lsn" msgstr "pg_lsnからNaNは減算できません" @@ -22675,113 +24418,138 @@ msgstr "pg_lsnからNaNは減算できません" msgid "function can only be called when server is in binary upgrade mode" msgstr "関数はサーバがバイナリアップグレードモードであるときのみ呼び出せます" -#: utils/adt/pgstatfuncs.c:500 +#: utils/adt/pgstatfuncs.c:482 #, c-format msgid "invalid command name: \"%s\"" msgstr "不正なコマンド名: \"%s\"" -#: utils/adt/pseudotypes.c:57 utils/adt/pseudotypes.c:91 +#: utils/adt/pgstatfuncs.c:2114 +#, c-format +msgid "unrecognized reset target: \"%s\"" +msgstr "認識できないリセットターゲット: \"%s\"" + +#: utils/adt/pgstatfuncs.c:2115 +#, c-format +msgid "Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." +msgstr "対象は\"archiver\"、\"bgwriter\"、\"recovery_prefetch\"または\"wal\"でなければなりません。" + +#: utils/adt/pgstatfuncs.c:2193 +#, c-format +msgid "invalid subscription OID %u" +msgstr "不正なサブスクリプションOID %u" + +#: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 #, c-format msgid "cannot display a value of type %s" msgstr "%s型の値は表示できません" -#: utils/adt/pseudotypes.c:283 +#: utils/adt/pseudotypes.c:321 #, c-format msgid "cannot accept a value of a shell type" msgstr "シェル型の値は受け付けられません" -#: utils/adt/pseudotypes.c:293 +#: utils/adt/pseudotypes.c:331 #, c-format msgid "cannot display a value of a shell type" msgstr "シェル型の値は表示できません" -#: utils/adt/rangetypes.c:406 +#: utils/adt/rangetypes.c:404 #, c-format msgid "range constructor flags argument must not be null" msgstr "範囲コンストラクタフラグ引数はNULLではいけません" -#: utils/adt/rangetypes.c:993 +#: utils/adt/rangetypes.c:1003 #, c-format msgid "result of range difference would not be contiguous" msgstr "範囲の差分が連続ではありません" -#: utils/adt/rangetypes.c:1054 +#: utils/adt/rangetypes.c:1064 #, c-format msgid "result of range union would not be contiguous" msgstr "範囲の和が連続ではありません" -#: utils/adt/rangetypes.c:1600 +#: utils/adt/rangetypes.c:1689 #, c-format msgid "range lower bound must be less than or equal to range upper bound" msgstr "範囲の下限は範囲の上限以下でなければなりません" -#: utils/adt/rangetypes.c:1983 utils/adt/rangetypes.c:1996 utils/adt/rangetypes.c:2010 +#: utils/adt/rangetypes.c:2112 utils/adt/rangetypes.c:2125 utils/adt/rangetypes.c:2139 #, c-format msgid "invalid range bound flags" msgstr "不正な範囲境界フラグ" -#: utils/adt/rangetypes.c:1984 utils/adt/rangetypes.c:1997 utils/adt/rangetypes.c:2011 +#: utils/adt/rangetypes.c:2113 utils/adt/rangetypes.c:2126 utils/adt/rangetypes.c:2140 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "有効な値は\"[]\"、\"[)\"、\"(]\"、\"()\"です" -#: utils/adt/rangetypes.c:2076 utils/adt/rangetypes.c:2093 utils/adt/rangetypes.c:2106 utils/adt/rangetypes.c:2124 utils/adt/rangetypes.c:2135 utils/adt/rangetypes.c:2179 utils/adt/rangetypes.c:2187 +#: utils/adt/rangetypes.c:2205 utils/adt/rangetypes.c:2222 utils/adt/rangetypes.c:2235 utils/adt/rangetypes.c:2253 utils/adt/rangetypes.c:2264 utils/adt/rangetypes.c:2308 utils/adt/rangetypes.c:2316 #, c-format msgid "malformed range literal: \"%s\"" msgstr "不正な範囲リテラル: \"%s\"" -#: utils/adt/rangetypes.c:2078 +#: utils/adt/rangetypes.c:2207 #, c-format msgid "Junk after \"empty\" key word." msgstr "\"empty\"キーワードの後にゴミがあります。" -#: utils/adt/rangetypes.c:2095 +#: utils/adt/rangetypes.c:2224 #, c-format msgid "Missing left parenthesis or bracket." msgstr "左括弧または左角括弧がありません" -#: utils/adt/rangetypes.c:2108 +#: utils/adt/rangetypes.c:2237 #, c-format msgid "Missing comma after lower bound." msgstr "下限値の後にカンマがありません" -#: utils/adt/rangetypes.c:2126 +#: utils/adt/rangetypes.c:2255 #, c-format msgid "Too many commas." msgstr "カンマが多すぎます" -#: utils/adt/rangetypes.c:2137 +#: utils/adt/rangetypes.c:2266 #, c-format msgid "Junk after right parenthesis or bracket." msgstr "右括弧または右角括弧の後にごみがあります" -#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4493 +#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4532 #, c-format msgid "regular expression failed: %s" msgstr "正規表現が失敗しました: %s" -#: utils/adt/regexp.c:426 +#: utils/adt/regexp.c:431 utils/adt/regexp.c:666 #, c-format msgid "invalid regular expression option: \"%.*s\"" msgstr "不正な正規表現オプション: \"%.*s\"" -#: utils/adt/regexp.c:836 +#: utils/adt/regexp.c:668 +#, c-format +msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." +msgstr "regexp_replace()でパラメータstartを指定したいのであれば、4番目のパラメータを明示的に整数にキャストしてください。" + +#: utils/adt/regexp.c:702 utils/adt/regexp.c:711 utils/adt/regexp.c:1068 utils/adt/regexp.c:1132 utils/adt/regexp.c:1141 utils/adt/regexp.c:1150 utils/adt/regexp.c:1159 utils/adt/regexp.c:1839 utils/adt/regexp.c:1848 utils/adt/regexp.c:1857 utils/misc/guc.c:11758 utils/misc/guc.c:11792 +#, c-format +msgid "invalid value for parameter \"%s\": %d" +msgstr "パラメータ\"%s\"の値が無効です: %d" + +#: utils/adt/regexp.c:922 #, c-format msgid "SQL regular expression may not contain more than two escape-double-quote separators" msgstr "SQL正規表現はエスケープされたダブルクオートを2つより多く含むことはできません" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:981 utils/adt/regexp.c:1363 utils/adt/regexp.c:1418 +#: utils/adt/regexp.c:1079 utils/adt/regexp.c:1170 utils/adt/regexp.c:1257 utils/adt/regexp.c:1296 utils/adt/regexp.c:1684 utils/adt/regexp.c:1739 utils/adt/regexp.c:1868 #, c-format msgid "%s does not support the \"global\" option" msgstr "%sは\"global\"オプションをサポートしません" -#: utils/adt/regexp.c:983 +#: utils/adt/regexp.c:1298 #, c-format msgid "Use the regexp_matches function instead." msgstr "代わりにregexp_matchesを使ってください。" -#: utils/adt/regexp.c:1165 +#: utils/adt/regexp.c:1486 #, c-format msgid "too many regular expression matches" msgstr "正規表現のマッチが多過ぎます" @@ -22791,232 +24559,241 @@ msgstr "正規表現のマッチが多過ぎます" msgid "more than one function named \"%s\"" msgstr "\"%s\"という名前の関数が複数あります" -#: utils/adt/regproc.c:542 +#: utils/adt/regproc.c:543 #, c-format msgid "more than one operator named %s" msgstr "%sという名前の演算子が複数あります" -#: utils/adt/regproc.c:714 utils/adt/regproc.c:755 utils/adt/regproc.c:2054 utils/adt/ruleutils.c:9289 utils/adt/ruleutils.c:9458 +#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 utils/adt/ruleutils.c:10050 utils/adt/ruleutils.c:10331 #, c-format msgid "too many arguments" msgstr "引数が多すぎます" -#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 +#: utils/adt/regproc.c:716 utils/adt/regproc.c:757 #, c-format msgid "Provide two argument types for operator." msgstr "演算子では2つの引数型を指定してください" -#: utils/adt/regproc.c:1638 utils/adt/regproc.c:1662 utils/adt/regproc.c:1763 utils/adt/regproc.c:1787 utils/adt/regproc.c:1889 utils/adt/regproc.c:1894 utils/adt/varlena.c:3642 utils/adt/varlena.c:3647 +#: utils/adt/regproc.c:1639 utils/adt/regproc.c:1663 utils/adt/regproc.c:1764 utils/adt/regproc.c:1788 utils/adt/regproc.c:1890 utils/adt/regproc.c:1895 utils/adt/varlena.c:3671 utils/adt/varlena.c:3676 #, c-format msgid "invalid name syntax" msgstr "不正な名前の構文" -#: utils/adt/regproc.c:1952 +#: utils/adt/regproc.c:1953 #, c-format msgid "expected a left parenthesis" msgstr "左括弧を想定していました" -#: utils/adt/regproc.c:1968 +#: utils/adt/regproc.c:1969 #, c-format msgid "expected a right parenthesis" msgstr "右括弧を想定していました" -#: utils/adt/regproc.c:1987 +#: utils/adt/regproc.c:1988 #, c-format msgid "expected a type name" msgstr "型の名前を想定していました" -#: utils/adt/regproc.c:2019 +#: utils/adt/regproc.c:2020 #, c-format msgid "improper type name" msgstr "型の名前が不適切です" -#: utils/adt/ri_triggers.c:296 utils/adt/ri_triggers.c:1537 utils/adt/ri_triggers.c:2470 +#: utils/adt/ri_triggers.c:305 utils/adt/ri_triggers.c:1604 utils/adt/ri_triggers.c:2591 #, c-format msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" msgstr "テーブル\"%s\"への挿入、更新は外部キー制約\"%s\"に違反しています" -#: utils/adt/ri_triggers.c:299 utils/adt/ri_triggers.c:1540 +#: utils/adt/ri_triggers.c:308 utils/adt/ri_triggers.c:1607 #, c-format msgid "MATCH FULL does not allow mixing of null and nonnull key values." msgstr "MACTH FULLではNULLキー値と非NULLキー値を混在できません" -#: utils/adt/ri_triggers.c:1940 +#: utils/adt/ri_triggers.c:2024 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "関数\"%s\"をINSERTで発行しなければなりません" -#: utils/adt/ri_triggers.c:1946 +#: utils/adt/ri_triggers.c:2030 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "関数\"%s\"をUPDATEで発行しなければなりません" -#: utils/adt/ri_triggers.c:1952 +#: utils/adt/ri_triggers.c:2036 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "関数\"%s\"をDELETEで発行しなければなりません" -#: utils/adt/ri_triggers.c:1975 +#: utils/adt/ri_triggers.c:2059 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "テーブル\"%2$s\"のトリガ\"%1$s\"用のpg_constraint項目がありません" -#: utils/adt/ri_triggers.c:1977 +#: utils/adt/ri_triggers.c:2061 #, c-format msgid "Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT." msgstr "この参照整合性トリガとその対象を削除し、ALTER TABLE ADD CONSTRAINTを実行してください" -#: utils/adt/ri_triggers.c:2295 +#: utils/adt/ri_triggers.c:2416 #, c-format msgid "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result" msgstr "\"%3$s\"の制約\"%2$s\"から\"%1$s\"に行われた参照整合性問い合わせが想定外の結果になりました" -#: utils/adt/ri_triggers.c:2299 +#: utils/adt/ri_triggers.c:2420 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "これは概ねこの問い合わせを書き換えるルールが原因です" -#: utils/adt/ri_triggers.c:2460 +#: utils/adt/ri_triggers.c:2581 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "子テーブル \"%s\"の削除は外部キー制約\"%s\"違反となります" -#: utils/adt/ri_triggers.c:2463 utils/adt/ri_triggers.c:2488 +#: utils/adt/ri_triggers.c:2584 utils/adt/ri_triggers.c:2609 #, c-format msgid "Key (%s)=(%s) is still referenced from table \"%s\"." msgstr "キー(%s)=(%s)はまだテーブル\"%s\"から参照されています" -#: utils/adt/ri_triggers.c:2474 +#: utils/adt/ri_triggers.c:2595 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "テーブル\"%3$s\"にキー(%1$s)=(%2$s)がありません" -#: utils/adt/ri_triggers.c:2477 +#: utils/adt/ri_triggers.c:2598 #, c-format msgid "Key is not present in table \"%s\"." msgstr "テーブル\"%s\"にキーがありません。" -#: utils/adt/ri_triggers.c:2483 +#: utils/adt/ri_triggers.c:2604 #, c-format msgid "update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"" msgstr "テーブル\"%1$s\"の更新または削除は、テーブル\"%3$s\"の外部キー制約\"%2$s\"に違反します" -#: utils/adt/ri_triggers.c:2491 +#: utils/adt/ri_triggers.c:2612 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "テーブル\"%s\"からキーがまだ参照されています。" -#: utils/adt/rowtypes.c:104 utils/adt/rowtypes.c:482 +#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:483 #, c-format msgid "input of anonymous composite types is not implemented" msgstr "匿名複合型の入力は実装されていません" -#: utils/adt/rowtypes.c:156 utils/adt/rowtypes.c:185 utils/adt/rowtypes.c:208 utils/adt/rowtypes.c:216 utils/adt/rowtypes.c:268 utils/adt/rowtypes.c:276 +#: utils/adt/rowtypes.c:157 utils/adt/rowtypes.c:186 utils/adt/rowtypes.c:209 utils/adt/rowtypes.c:217 utils/adt/rowtypes.c:269 utils/adt/rowtypes.c:277 #, c-format msgid "malformed record literal: \"%s\"" msgstr "おかしなレコードリテラルです: \"%s\"" -#: utils/adt/rowtypes.c:157 +#: utils/adt/rowtypes.c:158 #, c-format msgid "Missing left parenthesis." msgstr "左括弧がありません" -#: utils/adt/rowtypes.c:186 +#: utils/adt/rowtypes.c:187 #, c-format msgid "Too few columns." msgstr "列が少なすぎます" -#: utils/adt/rowtypes.c:269 +#: utils/adt/rowtypes.c:270 #, c-format msgid "Too many columns." msgstr "列が多すぎます" -#: utils/adt/rowtypes.c:277 +#: utils/adt/rowtypes.c:278 #, c-format msgid "Junk after right parenthesis." msgstr "右括弧の後にごみがあります" -#: utils/adt/rowtypes.c:531 +#: utils/adt/rowtypes.c:532 #, c-format msgid "wrong number of columns: %d, expected %d" msgstr "列数が間違っています: %d。%dを想定していました" -#: utils/adt/rowtypes.c:573 +#: utils/adt/rowtypes.c:574 #, c-format msgid "binary data has type %u (%s) instead of expected %u (%s) in record column %d" msgstr "バイナリデータのレコードカラム%5$dで予期していた%3$u(%4$s)の代わりに%1$u(%2$s)がありました" -#: utils/adt/rowtypes.c:640 +#: utils/adt/rowtypes.c:641 #, c-format msgid "improper binary format in record column %d" msgstr "レコード列%dのバイナリ書式が不適切です" -#: utils/adt/rowtypes.c:931 utils/adt/rowtypes.c:1177 utils/adt/rowtypes.c:1435 utils/adt/rowtypes.c:1681 +#: utils/adt/rowtypes.c:932 utils/adt/rowtypes.c:1178 utils/adt/rowtypes.c:1436 utils/adt/rowtypes.c:1682 #, c-format msgid "cannot compare dissimilar column types %s and %s at record column %d" msgstr "レコードの列 %3$d において、全く異なる型 %1$s と %2$s では比較ができません" -#: utils/adt/rowtypes.c:1022 utils/adt/rowtypes.c:1247 utils/adt/rowtypes.c:1532 utils/adt/rowtypes.c:1717 +#: utils/adt/rowtypes.c:1023 utils/adt/rowtypes.c:1248 utils/adt/rowtypes.c:1533 utils/adt/rowtypes.c:1718 #, c-format msgid "cannot compare record types with different numbers of columns" msgstr "個数が異なる列同士ではレコード型の比較ができません" -#: utils/adt/ruleutils.c:4811 +#: utils/adt/ruleutils.c:2707 +#, c-format +msgid "input is a query, not an expression" +msgstr "入力が式ではなく文です" + +#: utils/adt/ruleutils.c:2719 +#, c-format +msgid "expression contains variables of more than one relation" +msgstr "式が2つ以上のリレーションの変数を含んでいます" + +#: utils/adt/ruleutils.c:2726 +#, c-format +msgid "expression contains variables" +msgstr "式が変数を含んでいます" + +#: utils/adt/ruleutils.c:5225 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "ルール\"%s\"はサポートしていないイベントタイプ%dを持ちます" -#: utils/adt/timestamp.c:107 +#: utils/adt/timestamp.c:110 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "TIMESTAMP(%d)%s の精度は負であってはなりません" -#: utils/adt/timestamp.c:113 +#: utils/adt/timestamp.c:116 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "TIMESTAMP(%d)%sの位取りを許容最大値%dまで減らしました" -#: utils/adt/timestamp.c:176 utils/adt/timestamp.c:434 utils/misc/guc.c:11933 +#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12782 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestampが範囲外です: \"%s\"" -#: utils/adt/timestamp.c:372 +#: utils/adt/timestamp.c:375 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "timestamp(%d)の精度は%dから%dまででなければなりません" -#: utils/adt/timestamp.c:496 +#: utils/adt/timestamp.c:499 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "数字タイムゾーンは先頭の文字が\"-\"または\"+\"でなければなりません。" -#: utils/adt/timestamp.c:509 +#: utils/adt/timestamp.c:512 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "数値タイムゾーン\"%s\"が範囲外です" -#: utils/adt/timestamp.c:601 utils/adt/timestamp.c:611 utils/adt/timestamp.c:619 +#: utils/adt/timestamp.c:608 utils/adt/timestamp.c:618 utils/adt/timestamp.c:626 #, c-format msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" msgstr "timestampが範囲外です: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:720 +#: utils/adt/timestamp.c:727 #, c-format msgid "timestamp cannot be NaN" msgstr "タイムスタンプは NaN にはできません" -#: utils/adt/timestamp.c:738 utils/adt/timestamp.c:750 +#: utils/adt/timestamp.c:745 utils/adt/timestamp.c:757 #, c-format msgid "timestamp out of range: \"%g\"" msgstr "timestampが範囲外です: \"%g\"" -#: utils/adt/timestamp.c:935 utils/adt/timestamp.c:1509 utils/adt/timestamp.c:1944 utils/adt/timestamp.c:3042 utils/adt/timestamp.c:3047 utils/adt/timestamp.c:3052 utils/adt/timestamp.c:3102 utils/adt/timestamp.c:3109 utils/adt/timestamp.c:3116 utils/adt/timestamp.c:3136 utils/adt/timestamp.c:3143 utils/adt/timestamp.c:3150 utils/adt/timestamp.c:3180 utils/adt/timestamp.c:3188 utils/adt/timestamp.c:3232 utils/adt/timestamp.c:3659 utils/adt/timestamp.c:3784 -#: utils/adt/timestamp.c:4244 -#, c-format -msgid "interval out of range" -msgstr "intervalが範囲外です" - #: utils/adt/timestamp.c:1062 utils/adt/timestamp.c:1095 #, c-format msgid "invalid INTERVAL type modifier" @@ -23037,45 +24814,30 @@ msgstr "INTERVAL(%d)の精度を許容最大値%dまで減らしました" msgid "interval(%d) precision must be between %d and %d" msgstr "interval(%d)の精度は%dから%dまででなければなりません" -#: utils/adt/timestamp.c:2643 +#: utils/adt/timestamp.c:2688 #, c-format msgid "cannot subtract infinite timestamps" msgstr "無限大のtimestampを減算できません" -#: utils/adt/timestamp.c:3912 utils/adt/timestamp.c:4505 utils/adt/timestamp.c:4667 utils/adt/timestamp.c:4688 -#, c-format -msgid "timestamp units \"%s\" not supported" -msgstr "timestampの単位\"%s\"はサポートされていません" - -#: utils/adt/timestamp.c:3926 utils/adt/timestamp.c:4459 utils/adt/timestamp.c:4698 -#, c-format -msgid "timestamp units \"%s\" not recognized" -msgstr "timestampの単位\"%s\"は不明です" - -#: utils/adt/timestamp.c:4056 utils/adt/timestamp.c:4500 utils/adt/timestamp.c:4863 utils/adt/timestamp.c:4885 +#: utils/adt/timestamp.c:3890 utils/adt/timestamp.c:4073 #, c-format -msgid "timestamp with time zone units \"%s\" not supported" -msgstr "timestamp with time zoneの単位\"%s\"はサポートされていません" +msgid "origin out of range" +msgstr "起点が範囲外です" -#: utils/adt/timestamp.c:4073 utils/adt/timestamp.c:4454 utils/adt/timestamp.c:4894 +#: utils/adt/timestamp.c:3895 utils/adt/timestamp.c:4078 #, c-format -msgid "timestamp with time zone units \"%s\" not recognized" -msgstr "timestamp with time zoneの単位\"%s\"は不明です" +msgid "timestamps cannot be binned into intervals containing months or years" +msgstr "タイムスタンプ型は月や年を含む間隔にビニングすることはできません" -#: utils/adt/timestamp.c:4231 +#: utils/adt/timestamp.c:3902 utils/adt/timestamp.c:4085 #, c-format -msgid "interval units \"%s\" not supported because months usually have fractional weeks" -msgstr "月は通常週を含んでいますので、intervalの単位\"%s\"はサポートされていません" +msgid "stride must be greater than zero" +msgstr "増分は0より大きくなければなりません" -#: utils/adt/timestamp.c:4237 utils/adt/timestamp.c:4988 +#: utils/adt/timestamp.c:4398 #, c-format -msgid "interval units \"%s\" not supported" -msgstr "intervalの単位\"%s\"はサポートされていません" - -#: utils/adt/timestamp.c:4253 utils/adt/timestamp.c:5011 -#, c-format -msgid "interval units \"%s\" not recognized" -msgstr "intervalの単位\"%s\"は不明です" +msgid "Months usually have fractional weeks." +msgstr "月は通常週の端数を含んでいます。" #: utils/adt/trigfuncs.c:42 #, c-format @@ -23102,42 +24864,42 @@ msgstr "suppress_redundant_updates_trigger: 各行ごとに呼ばれなければ msgid "gtsvector_in not implemented" msgstr "gtsvector_inは実装されていません" -#: utils/adt/tsquery.c:200 +#: utils/adt/tsquery.c:199 utils/adt/tsquery_op.c:124 #, c-format -msgid "distance in phrase operator should not be greater than %d" -msgstr "フレーズ演算子で指定する距離は%d以下でなくてはなりません" +msgid "distance in phrase operator must be an integer value between zero and %d inclusive" +msgstr "フレーズ演算子での距離は0以上%d以下の整数でなくてはなりません" -#: utils/adt/tsquery.c:310 utils/adt/tsquery.c:725 utils/adt/tsvector_parser.c:133 +#: utils/adt/tsquery.c:306 utils/adt/tsquery.c:691 utils/adt/tsvector_parser.c:133 #, c-format msgid "syntax error in tsquery: \"%s\"" msgstr "tsquery内の構文エラー: \"%s\"" -#: utils/adt/tsquery.c:334 +#: utils/adt/tsquery.c:330 #, c-format msgid "no operand in tsquery: \"%s\"" msgstr "tsquery内にオペランドがありません\"%s\"" -#: utils/adt/tsquery.c:568 +#: utils/adt/tsquery.c:534 #, c-format msgid "value is too big in tsquery: \"%s\"" msgstr "tsquery内の値が大きすぎます: \"%s\"" -#: utils/adt/tsquery.c:573 +#: utils/adt/tsquery.c:539 #, c-format msgid "operand is too long in tsquery: \"%s\"" msgstr "tsqueryのオペランドが長過ぎます: \"%s\"" -#: utils/adt/tsquery.c:601 +#: utils/adt/tsquery.c:567 #, c-format msgid "word is too long in tsquery: \"%s\"" msgstr "tsquery内の単語が長すぎます: \"%s\"" -#: utils/adt/tsquery.c:870 +#: utils/adt/tsquery.c:835 #, c-format msgid "text-search query doesn't contain lexemes: \"%s\"" msgstr "テキスト検索問い合わせが字句要素を含みません: \"%s\"" -#: utils/adt/tsquery.c:881 utils/adt/tsquery_util.c:375 +#: utils/adt/tsquery.c:846 utils/adt/tsquery_util.c:375 #, c-format msgid "tsquery is too large" msgstr "tsqueryが大きすぎます" @@ -23147,11 +24909,6 @@ msgstr "tsqueryが大きすぎます" msgid "text-search query contains only stop words or doesn't contain lexemes, ignored" msgstr "テキスト検索問い合わせはストップワードのみを含む、あるいは、字句要素を含みません。無視されます" -#: utils/adt/tsquery_op.c:124 -#, c-format -msgid "distance in phrase operator should be non-negative and less than %d" -msgstr "フレーズ演算子で指定する距離は%dより小さい正の数でなければなりません" - #: utils/adt/tsquery_rewrite.c:321 #, c-format msgid "ts_rewrite query must return two tsquery columns" @@ -23172,7 +24929,7 @@ msgstr "重み配列が短すぎます" msgid "array of weight must not contain nulls" msgstr "重み配列にはNULL値を含めてはいけません" -#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:872 +#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:871 #, c-format msgid "weight out of range" msgstr "重みが範囲外です" @@ -23187,57 +24944,62 @@ msgstr "単語が長すぎます(%ldバイト、最大は%ldバイト)" msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "tsベクターのための文字列が長すぎます(%ldバイト、最大は%ldバイト)" -#: utils/adt/tsvector_op.c:328 utils/adt/tsvector_op.c:608 utils/adt/tsvector_op.c:770 +#: utils/adt/tsvector_op.c:771 #, c-format msgid "lexeme array may not contain nulls" msgstr "語彙素配列にはnullを含めてはいけません" -#: utils/adt/tsvector_op.c:840 +#: utils/adt/tsvector_op.c:776 +#, c-format +msgid "lexeme array may not contain empty strings" +msgstr "語彙素配列には空文字列を含めてはいけません" + +#: utils/adt/tsvector_op.c:846 #, c-format msgid "weight array may not contain nulls" msgstr "重み付け配列にはnullを含めてはいけません" -#: utils/adt/tsvector_op.c:864 +#: utils/adt/tsvector_op.c:870 #, c-format msgid "unrecognized weight: \"%c\"" msgstr "識別不能な重み付け: \"%c\"" -#: utils/adt/tsvector_op.c:2414 +#: utils/adt/tsvector_op.c:2431 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "ts_statは1つのtsvector列のみを返さなければなりません" -#: utils/adt/tsvector_op.c:2603 +#: utils/adt/tsvector_op.c:2620 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "tsvector列\"%s\"は存在しません" -#: utils/adt/tsvector_op.c:2610 +#: utils/adt/tsvector_op.c:2627 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "値\"%s\"は型tsvectorではありません" -#: utils/adt/tsvector_op.c:2622 +#: utils/adt/tsvector_op.c:2639 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "設定列\"%s\"は存在しません" -#: utils/adt/tsvector_op.c:2628 +#: utils/adt/tsvector_op.c:2645 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "%s列はregconfig型ではありません" -#: utils/adt/tsvector_op.c:2635 +#: utils/adt/tsvector_op.c:2652 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "設定列\"%s\"をNULLにすることはできません" -#: utils/adt/tsvector_op.c:2648 +#: utils/adt/tsvector_op.c:2665 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "テキスト検索設定名称\"%s\"はスキーマ修飾しなけれナバりません" -#: utils/adt/tsvector_op.c:2673 +#: utils/adt/tsvector_op.c:2690 #, c-format msgid "column \"%s\" is not of a character type" msgstr "列\"%s\"は文字型ではありません" @@ -23257,77 +25019,77 @@ msgstr "エスケープ文字がありません: \"%s\"" msgid "wrong position info in tsvector: \"%s\"" msgstr "tsvector内の位置情報が間違っています: \"%s\"" -#: utils/adt/uuid.c:428 +#: utils/adt/uuid.c:413 #, c-format msgid "could not generate random values" msgstr "乱数値を生成できませんでした" -#: utils/adt/varbit.c:109 utils/adt/varchar.c:53 +#: utils/adt/varbit.c:110 utils/adt/varchar.c:53 #, c-format msgid "length for type %s must be at least 1" msgstr "型%sの長さは最低でも1です" -#: utils/adt/varbit.c:114 utils/adt/varchar.c:57 +#: utils/adt/varbit.c:115 utils/adt/varchar.c:57 #, c-format msgid "length for type %s cannot exceed %d" msgstr "型%sの長さは%dを超えられません" -#: utils/adt/varbit.c:197 utils/adt/varbit.c:498 utils/adt/varbit.c:993 +#: utils/adt/varbit.c:198 utils/adt/varbit.c:499 utils/adt/varbit.c:994 #, c-format msgid "bit string length exceeds the maximum allowed (%d)" msgstr "ビット列の長さが上限値を超えています(%d)" -#: utils/adt/varbit.c:211 utils/adt/varbit.c:355 utils/adt/varbit.c:405 +#: utils/adt/varbit.c:212 utils/adt/varbit.c:356 utils/adt/varbit.c:406 #, c-format msgid "bit string length %d does not match type bit(%d)" msgstr "ビット列長%dが型bit(%d)に一致しません" -#: utils/adt/varbit.c:233 utils/adt/varbit.c:534 +#: utils/adt/varbit.c:234 utils/adt/varbit.c:535 #, c-format msgid "\"%.*s\" is not a valid binary digit" msgstr "\"%.*s\"は有効な2進数の数字ではありません" -#: utils/adt/varbit.c:258 utils/adt/varbit.c:559 +#: utils/adt/varbit.c:259 utils/adt/varbit.c:560 #, c-format msgid "\"%.*s\" is not a valid hexadecimal digit" msgstr "\"%.*s\"は有効な16進数の数字ではありません" -#: utils/adt/varbit.c:346 utils/adt/varbit.c:651 +#: utils/adt/varbit.c:347 utils/adt/varbit.c:652 #, c-format msgid "invalid length in external bit string" msgstr "ビット列の外部値の不正な長さ" -#: utils/adt/varbit.c:512 utils/adt/varbit.c:660 utils/adt/varbit.c:756 +#: utils/adt/varbit.c:513 utils/adt/varbit.c:661 utils/adt/varbit.c:757 #, c-format msgid "bit string too long for type bit varying(%d)" msgstr "ビット列は型bit varying(%d)には長すぎます" -#: utils/adt/varbit.c:1086 utils/adt/varbit.c:1184 utils/adt/varlena.c:875 utils/adt/varlena.c:939 utils/adt/varlena.c:1083 utils/adt/varlena.c:3306 utils/adt/varlena.c:3373 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:889 utils/adt/varlena.c:952 utils/adt/varlena.c:1109 utils/adt/varlena.c:3313 utils/adt/varlena.c:3391 #, c-format msgid "negative substring length not allowed" msgstr "負の長さのsubstringは許可されません" -#: utils/adt/varbit.c:1241 +#: utils/adt/varbit.c:1261 #, c-format msgid "cannot AND bit strings of different sizes" msgstr "サイズが異なるビット列のANDはできません" -#: utils/adt/varbit.c:1282 +#: utils/adt/varbit.c:1302 #, c-format msgid "cannot OR bit strings of different sizes" msgstr "サイズが異なるビット列のORはできません" -#: utils/adt/varbit.c:1322 +#: utils/adt/varbit.c:1342 #, c-format msgid "cannot XOR bit strings of different sizes" msgstr "サイズが異なるビット列のXORはできません" -#: utils/adt/varbit.c:1804 utils/adt/varbit.c:1862 +#: utils/adt/varbit.c:1824 utils/adt/varbit.c:1882 #, c-format msgid "bit index %d out of valid range (0..%d)" msgstr "ビットのインデックス%dが有効範囲0..%dの間にありません" -#: utils/adt/varbit.c:1813 utils/adt/varlena.c:3566 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3595 #, c-format msgid "new bit must be 0 or 1" msgstr "新しいビットは0か1でなければなりません" @@ -23342,117 +25104,127 @@ msgstr "値は型character(%d)としては長すぎます" msgid "value too long for type character varying(%d)" msgstr "値は型character varying(%d)としては長すぎます" -#: utils/adt/varchar.c:732 utils/adt/varlena.c:1475 +#: utils/adt/varchar.c:732 utils/adt/varlena.c:1498 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "文字列比較で使用する照合順序を特定できませんでした" -#: utils/adt/varlena.c:1182 utils/adt/varlena.c:1915 +#: utils/adt/varlena.c:1208 utils/adt/varlena.c:1947 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "非決定的照合順序は部分文字列探索ではサポートされません" -#: utils/adt/varlena.c:1574 utils/adt/varlena.c:1587 +#: utils/adt/varlena.c:1596 utils/adt/varlena.c:1609 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "文字列をUTF-16に変換できませんでした: エラーコード %lu" -#: utils/adt/varlena.c:1602 +#: utils/adt/varlena.c:1624 #, c-format msgid "could not compare Unicode strings: %m" msgstr "Unicode文字列を比較できませんでした: %m" -#: utils/adt/varlena.c:1653 utils/adt/varlena.c:2367 +#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2398 #, c-format msgid "collation failed: %s" msgstr "照合順序による比較に失敗しました: %s" -#: utils/adt/varlena.c:2575 +#: utils/adt/varlena.c:2585 #, c-format msgid "sort key generation failed: %s" msgstr "ソートキーの生成に失敗しました: %s" -#: utils/adt/varlena.c:3450 utils/adt/varlena.c:3517 +#: utils/adt/varlena.c:3479 utils/adt/varlena.c:3546 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "インデックス%dは有効範囲0..%dの間にありません" -#: utils/adt/varlena.c:3481 utils/adt/varlena.c:3553 +#: utils/adt/varlena.c:3510 utils/adt/varlena.c:3582 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "インデックス%lldは有効範囲0..%lldの間にありません" -#: utils/adt/varlena.c:4590 +#: utils/adt/varlena.c:4644 #, c-format -msgid "field position must be greater than zero" -msgstr "フィールド位置は0より大きくなければなりません" +msgid "field position must not be zero" +msgstr "フィールド位置には0は指定できません" -#: utils/adt/varlena.c:5456 +#: utils/adt/varlena.c:5664 #, c-format msgid "unterminated format() type specifier" msgstr "終端されていないformat()型指定子" -#: utils/adt/varlena.c:5457 utils/adt/varlena.c:5591 utils/adt/varlena.c:5712 +#: utils/adt/varlena.c:5665 utils/adt/varlena.c:5799 utils/adt/varlena.c:5920 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "一つの\"%%\"には\"%%%%\"を使ってください。" -#: utils/adt/varlena.c:5589 utils/adt/varlena.c:5710 +#: utils/adt/varlena.c:5797 utils/adt/varlena.c:5918 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "認識できない format() の型指定子\"%.*s\"" -#: utils/adt/varlena.c:5602 utils/adt/varlena.c:5659 +#: utils/adt/varlena.c:5810 utils/adt/varlena.c:5867 #, c-format msgid "too few arguments for format()" msgstr "format()の引数が少なすぎます" -#: utils/adt/varlena.c:5755 utils/adt/varlena.c:5937 +#: utils/adt/varlena.c:5963 utils/adt/varlena.c:6145 #, c-format msgid "number is out of range" msgstr "数値が範囲外です" -#: utils/adt/varlena.c:5818 utils/adt/varlena.c:5846 +#: utils/adt/varlena.c:6026 utils/adt/varlena.c:6054 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "書式は引数0を指定していますが、引数が1から始まっています" -#: utils/adt/varlena.c:5839 +#: utils/adt/varlena.c:6047 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "width引数の位置は\"$\"で終わらなければなりません" -#: utils/adt/varlena.c:5884 +#: utils/adt/varlena.c:6092 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "NULLはSQL識別子として書式付けできません" -#: utils/adt/varlena.c:6010 +#: utils/adt/varlena.c:6218 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "Unicode正規化はサーバエンコーディングがUTF-8の場合にのみ実行されます" -#: utils/adt/varlena.c:6023 +#: utils/adt/varlena.c:6231 #, c-format msgid "invalid normalization form: %s" msgstr "不正な正規化形式: %s" -#: utils/adt/windowfuncs.c:243 +#: utils/adt/varlena.c:6434 utils/adt/varlena.c:6469 utils/adt/varlena.c:6504 +#, c-format +msgid "invalid Unicode code point: %04X" +msgstr "不正なUnicodeコードポイント: %04X" + +#: utils/adt/varlena.c:6534 +#, c-format +msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." +msgstr "Unicodeエスケープは \\XXXX、\\+XXXXXX、\\uXXXX または \\UXXXXXXXX でなければなりません。" + +#: utils/adt/windowfuncs.c:306 #, c-format msgid "argument of ntile must be greater than zero" msgstr "ntileの値は0より大きくなければなりません" -#: utils/adt/windowfuncs.c:465 +#: utils/adt/windowfuncs.c:528 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "nth_valueの値0より大きくなければなりません" #: utils/adt/xid8funcs.c:116 #, c-format -msgid "transaction ID %s is in the future" -msgstr "トランザクションID%sは未来の値です" +msgid "transaction ID %llu is in the future" +msgstr "トランザクションID %lluは未来の値です" -#: utils/adt/xid8funcs.c:547 +#: utils/adt/xid8funcs.c:546 #, c-format msgid "invalid external pg_snapshot data" msgstr "不正な外部pg_snapshotデータ" @@ -23465,173 +25237,168 @@ msgstr "非サポートのXML機能です。" #: utils/adt/xml.c:223 #, c-format msgid "This functionality requires the server to be built with libxml support." -msgstr "この機能はlibxmlサポートを付けたサーバが必要です。" - -#: utils/adt/xml.c:224 -#, c-format -msgid "You need to rebuild PostgreSQL using --with-libxml." -msgstr "--with-libxmlを使用してPostgreSQLを再構築する必要があります。" +msgstr "この機能はlibxmlサポート付きでビルドされたサーバを必要とします。" -#: utils/adt/xml.c:243 utils/mb/mbutils.c:570 +#: utils/adt/xml.c:242 utils/mb/mbutils.c:627 #, c-format msgid "invalid encoding name \"%s\"" msgstr "不正な符号化方式名\"%s\"" -#: utils/adt/xml.c:486 utils/adt/xml.c:491 +#: utils/adt/xml.c:485 utils/adt/xml.c:490 #, c-format msgid "invalid XML comment" msgstr "無効なXMLコメント" -#: utils/adt/xml.c:620 +#: utils/adt/xml.c:619 #, c-format msgid "not an XML document" msgstr "XML文書ではありません" -#: utils/adt/xml.c:779 utils/adt/xml.c:802 +#: utils/adt/xml.c:778 utils/adt/xml.c:801 #, c-format msgid "invalid XML processing instruction" msgstr "無効なXML処理命令です" -#: utils/adt/xml.c:780 +#: utils/adt/xml.c:779 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "XML処理命令の対象名を\"%s\"とすることができませんでした。" -#: utils/adt/xml.c:803 +#: utils/adt/xml.c:802 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML処理命令には\"?>\"を含めることはできません。" -#: utils/adt/xml.c:882 +#: utils/adt/xml.c:881 #, c-format msgid "xmlvalidate is not implemented" msgstr "XML の妥当性検査は実装されていません" -#: utils/adt/xml.c:961 +#: utils/adt/xml.c:960 #, c-format msgid "could not initialize XML library" msgstr "XMLライブラリを初期化できませんでした" -#: utils/adt/xml.c:962 +#: utils/adt/xml.c:961 #, c-format -msgid "libxml2 has incompatible char type: sizeof(char)=%u, sizeof(xmlChar)=%u." -msgstr "libxml2が互換性がない文字型を持ちます: sizeof(char)=%u、sizeof(xmlChar)=%u" +msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." +msgstr "libxml2が互換性がない文字型を持ちます: sizeof(char)=%zu、sizeof(xmlChar)=%zu" -#: utils/adt/xml.c:1048 +#: utils/adt/xml.c:1047 #, c-format msgid "could not set up XML error handler" msgstr "XMLエラーハンドラを設定できませんでした" -#: utils/adt/xml.c:1049 +#: utils/adt/xml.c:1048 #, c-format msgid "This probably indicates that the version of libxml2 being used is not compatible with the libxml2 header files that PostgreSQL was built with." msgstr "これはおそらく使用するlibxml2のバージョンがPostgreSQLを構築する時に使用したlibxml2ヘッダと互換性がないことを示します。" -#: utils/adt/xml.c:1936 +#: utils/adt/xml.c:1935 msgid "Invalid character value." msgstr "文字の値が有効ではありません" -#: utils/adt/xml.c:1939 +#: utils/adt/xml.c:1938 msgid "Space required." msgstr "スペースをあけてください。" -#: utils/adt/xml.c:1942 +#: utils/adt/xml.c:1941 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone には 'yes' か 'no' だけが有効です。" -#: utils/adt/xml.c:1945 +#: utils/adt/xml.c:1944 msgid "Malformed declaration: missing version." msgstr "不正な形式の宣言: バージョンがありません。" -#: utils/adt/xml.c:1948 +#: utils/adt/xml.c:1947 msgid "Missing encoding in text declaration." msgstr "テキスト宣言にエンコーディングの指定がありません。" -#: utils/adt/xml.c:1951 +#: utils/adt/xml.c:1950 msgid "Parsing XML declaration: '?>' expected." msgstr "XML 宣言のパース中: '>?' が必要です。" -#: utils/adt/xml.c:1954 +#: utils/adt/xml.c:1953 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "認識できないlibxml のエラーコード: %d" -#: utils/adt/xml.c:2211 +#: utils/adt/xml.c:2210 #, c-format msgid "XML does not support infinite date values." msgstr "XMLはデータ値として無限をサポートしません。" -#: utils/adt/xml.c:2233 utils/adt/xml.c:2260 +#: utils/adt/xml.c:2232 utils/adt/xml.c:2259 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XMLタイムスタンプ値としては無限をサポートしません。" -#: utils/adt/xml.c:2676 +#: utils/adt/xml.c:2675 #, c-format msgid "invalid query" msgstr "不正な無効な問い合わせ" -#: utils/adt/xml.c:4016 +#: utils/adt/xml.c:4015 #, c-format msgid "invalid array for XML namespace mapping" msgstr "XML名前空間マッピングに対する不正な配列" -#: utils/adt/xml.c:4017 +#: utils/adt/xml.c:4016 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "この配列は第2軸の長さが2である2次元配列でなければなりません。" -#: utils/adt/xml.c:4041 +#: utils/adt/xml.c:4040 #, c-format msgid "empty XPath expression" msgstr "空のXPath式" -#: utils/adt/xml.c:4093 +#: utils/adt/xml.c:4092 #, c-format msgid "neither namespace name nor URI may be null" msgstr "名前空間名もURIもnullにはできません" -#: utils/adt/xml.c:4100 +#: utils/adt/xml.c:4099 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "\"%s\"という名前のXML名前空間およびURI\"%s\"を登録できませんでした" -#: utils/adt/xml.c:4451 +#: utils/adt/xml.c:4450 #, c-format msgid "DEFAULT namespace is not supported" msgstr "デフォルト名前空間は実装されていません" -#: utils/adt/xml.c:4480 +#: utils/adt/xml.c:4479 #, c-format msgid "row path filter must not be empty string" msgstr "行パスフィルタは空文字列であってはなりません" -#: utils/adt/xml.c:4511 +#: utils/adt/xml.c:4510 #, c-format msgid "column path filter must not be empty string" msgstr "列パスフィルタ空文字列であってはなりません" -#: utils/adt/xml.c:4661 +#: utils/adt/xml.c:4654 #, c-format msgid "more than one value returned by column XPath expression" msgstr "列XPath式が2つ以上の値を返却しました" -#: utils/cache/lsyscache.c:1015 +#: utils/cache/lsyscache.c:1042 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "型%sから型%sへのキャストは存在しません" -#: utils/cache/lsyscache.c:2764 utils/cache/lsyscache.c:2797 utils/cache/lsyscache.c:2830 utils/cache/lsyscache.c:2863 +#: utils/cache/lsyscache.c:2844 utils/cache/lsyscache.c:2877 utils/cache/lsyscache.c:2910 utils/cache/lsyscache.c:2943 #, c-format msgid "type %s is only a shell" msgstr "型%sは単なるシェルです" -#: utils/cache/lsyscache.c:2769 +#: utils/cache/lsyscache.c:2849 #, c-format msgid "no input function available for type %s" msgstr "型%sの利用可能な入力関数がありません" -#: utils/cache/lsyscache.c:2802 +#: utils/cache/lsyscache.c:2882 #, c-format msgid "no output function available for type %s" msgstr "型%sの利用可能な出力関数がありません" @@ -23646,142 +25413,142 @@ msgstr "アクセスメソッド %2$s の演算子クラス\"%1$s\"は%4$s型に msgid "cached plan must not change result type" msgstr "キャッシュした実行計画は結果型を変更してはなりません" -#: utils/cache/relcache.c:6072 +#: utils/cache/relcache.c:6403 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "リレーションキャッシュ初期化ファイル\"%sを作成できません: %m" -#: utils/cache/relcache.c:6074 +#: utils/cache/relcache.c:6405 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "とりあえず続行しますが、何かがおかしいです。" -#: utils/cache/relcache.c:6396 +#: utils/cache/relcache.c:6727 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "キャッシュファイル\"%s\"を削除できませんでした: %m" -#: utils/cache/relmapper.c:531 +#: utils/cache/relmapper.c:590 #, c-format msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "リレーションのマッピングを変更したトランザクションはPREPAREできません" -#: utils/cache/relmapper.c:761 +#: utils/cache/relmapper.c:836 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "リレーションマッピングファイル\"%s\"に不正なデータがあります" -#: utils/cache/relmapper.c:771 +#: utils/cache/relmapper.c:846 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "リレーションマッピングファイル\"%s\"の中に不正なチェックサムがあります" -#: utils/cache/typcache.c:1692 utils/fmgr/funcapi.c:461 +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:532 #, c-format msgid "record type has not been registered" msgstr "レコード型は登録されていません" -#: utils/error/assert.c:37 +#: utils/error/assert.c:39 #, c-format -msgid "TRAP: ExceptionalCondition: bad arguments\n" -msgstr "TRAP: ExceptionalCondition: 不正な引数\n" +msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" +msgstr "TRAP: 例外条件: PID %dで不正な引数\n" -#: utils/error/assert.c:40 +#: utils/error/assert.c:42 #, c-format -msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d)\n" -msgstr "TRAP: %s(\"%s\", ファイル: \"%s\", 行: %d)\n" +msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" +msgstr "TRAP: %s(\"%s\"、ファイル: \"%s\"、行: %d、PID: %d)\n" -#: utils/error/elog.c:322 +#: utils/error/elog.c:404 #, c-format msgid "error occurred before error message processing is available\n" msgstr "エラーメッセージの処理が可能になる前にエラーが発生しました\n" -#: utils/error/elog.c:1868 +#: utils/error/elog.c:1943 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "ファイル\"%s\"の標準エラー出力としての再オープンに失敗しました: %m" -#: utils/error/elog.c:1881 +#: utils/error/elog.c:1956 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "ファイル\"%s\"の標準出力としての再オープンに失敗しました: %m" -#: utils/error/elog.c:2373 utils/error/elog.c:2407 utils/error/elog.c:2423 +#: utils/error/elog.c:2521 utils/error/elog.c:2548 utils/error/elog.c:2564 msgid "[unknown]" msgstr "[不明]" -#: utils/error/elog.c:2931 utils/error/elog.c:3241 utils/error/elog.c:3349 +#: utils/error/elog.c:2837 utils/error/elog.c:3158 utils/error/elog.c:3265 msgid "missing error text" msgstr "エラーテキストがありません" -#: utils/error/elog.c:2934 utils/error/elog.c:2937 utils/error/elog.c:3352 utils/error/elog.c:3355 +#: utils/error/elog.c:2840 utils/error/elog.c:2843 #, c-format msgid " at character %d" msgstr "(%d文字目)" -#: utils/error/elog.c:2947 utils/error/elog.c:2954 +#: utils/error/elog.c:2853 utils/error/elog.c:2860 msgid "DETAIL: " msgstr "詳細: " -#: utils/error/elog.c:2961 +#: utils/error/elog.c:2867 msgid "HINT: " msgstr "ヒント: " -#: utils/error/elog.c:2968 +#: utils/error/elog.c:2874 msgid "QUERY: " msgstr "問い合わせ: " -#: utils/error/elog.c:2975 +#: utils/error/elog.c:2881 msgid "CONTEXT: " msgstr "文脈: " -#: utils/error/elog.c:2985 +#: utils/error/elog.c:2891 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "場所: %s, %s:%d\n" -#: utils/error/elog.c:2992 +#: utils/error/elog.c:2898 #, c-format msgid "LOCATION: %s:%d\n" msgstr "場所: %s:%d\n" -#: utils/error/elog.c:2999 +#: utils/error/elog.c:2905 msgid "BACKTRACE: " msgstr "バックトレース: " -#: utils/error/elog.c:3013 +#: utils/error/elog.c:2917 msgid "STATEMENT: " msgstr "文: " -#: utils/error/elog.c:3402 +#: utils/error/elog.c:3310 msgid "DEBUG" msgstr "DEBUG" -#: utils/error/elog.c:3406 +#: utils/error/elog.c:3314 msgid "LOG" msgstr "LOG" -#: utils/error/elog.c:3409 +#: utils/error/elog.c:3317 msgid "INFO" msgstr "INFO" -#: utils/error/elog.c:3412 +#: utils/error/elog.c:3320 msgid "NOTICE" msgstr "NOTICE" -#: utils/error/elog.c:3415 +#: utils/error/elog.c:3324 msgid "WARNING" msgstr "WARNING" -#: utils/error/elog.c:3418 +#: utils/error/elog.c:3327 msgid "ERROR" msgstr "ERROR" -#: utils/error/elog.c:3421 +#: utils/error/elog.c:3330 msgid "FATAL" msgstr "FATAL" -#: utils/error/elog.c:3424 +#: utils/error/elog.c:3333 msgid "PANIC" msgstr "PANIC" @@ -23815,51 +25582,61 @@ msgstr "\"%s\"は互換性がないライブラリです: バージョンの不 msgid "Server is version %d, library is version %s." msgstr "サーバはバージョン%d、ライブラリはバージョン%sです。" -#: utils/fmgr/dfmgr.c:346 +#: utils/fmgr/dfmgr.c:341 +#, c-format +msgid "incompatible library \"%s\": ABI mismatch" +msgstr "非互換のライブラリ\"%s\": ABIの不一致" + +#: utils/fmgr/dfmgr.c:343 +#, c-format +msgid "Server has ABI \"%s\", library has \"%s\"." +msgstr "サーバ側ABIは\"%s\"、ライブラリ側は\"%s\"です。" + +#: utils/fmgr/dfmgr.c:361 #, c-format msgid "Server has FUNC_MAX_ARGS = %d, library has %d." msgstr "サーバ側は FUNC_MAX_ARGS = %d ですが、ライブラリ側は %d です" -#: utils/fmgr/dfmgr.c:355 +#: utils/fmgr/dfmgr.c:370 #, c-format msgid "Server has INDEX_MAX_KEYS = %d, library has %d." msgstr "サーバ側は INDEX_MAX_KEYS = %d ですが、ライブラリ側は %d です" -#: utils/fmgr/dfmgr.c:364 +#: utils/fmgr/dfmgr.c:379 #, c-format msgid "Server has NAMEDATALEN = %d, library has %d." msgstr "サーバ側は NAMEDATALEN = %d ですが、ライブラリ側は %d です" -#: utils/fmgr/dfmgr.c:373 +#: utils/fmgr/dfmgr.c:388 #, c-format msgid "Server has FLOAT8PASSBYVAL = %s, library has %s." msgstr "サーバ側はFLOAT8PASSBYVAL = %sですが、ライブラリ側は%sです。" -#: utils/fmgr/dfmgr.c:380 +#: utils/fmgr/dfmgr.c:395 msgid "Magic block has unexpected length or padding difference." msgstr "マジックブロックが意図しない長さであるか、またはパディングが異なります。" -#: utils/fmgr/dfmgr.c:383 +#: utils/fmgr/dfmgr.c:398 #, c-format msgid "incompatible library \"%s\": magic block mismatch" msgstr "\"%s\"は互換性がないライブラリです: マジックブロックの不一致" -#: utils/fmgr/dfmgr.c:547 +#: utils/fmgr/dfmgr.c:557 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "ライブラリ\"%s\"へのアクセスは許可されません" -#: utils/fmgr/dfmgr.c:573 +#: utils/fmgr/dfmgr.c:583 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "ダイナミックライブラリパス内のマクロが不正です: %s" -#: utils/fmgr/dfmgr.c:613 +#: utils/fmgr/dfmgr.c:623 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "パラメータ\"dynamic_library_path\"内に長さが0の要素があります" -#: utils/fmgr/dfmgr.c:632 +#: utils/fmgr/dfmgr.c:642 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "パラメータ\"dynamic_library_path\"内の要素が絶対パスでありません" @@ -23869,305 +25646,305 @@ msgstr "パラメータ\"dynamic_library_path\"内の要素が絶対パスであ msgid "internal function \"%s\" is not in internal lookup table" msgstr "内部関数\"%s\"は内部用検索テーブルにありません" -#: utils/fmgr/fmgr.c:487 +#: utils/fmgr/fmgr.c:484 #, c-format msgid "could not find function information for function \"%s\"" msgstr "関数\"%s\"の関数情報が見つかりませんでした" -#: utils/fmgr/fmgr.c:489 +#: utils/fmgr/fmgr.c:486 #, c-format msgid "SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname)." msgstr "SQL呼び出し可能な関数にはPG_FUNCTION_INFO_V1(funcname)宣言が必要です" -#: utils/fmgr/fmgr.c:507 +#: utils/fmgr/fmgr.c:504 #, c-format msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "info関数\"%2$s\"で報告されたAPIバージョン%1$dが不明です" -#: utils/fmgr/fmgr.c:2003 +#: utils/fmgr/fmgr.c:1999 #, c-format -msgid "opclass options info is absent in function call context" -msgstr "関数呼び出しコンテクストに演算子オプション情報がありません" +msgid "operator class options info is absent in function call context" +msgstr "関数呼び出しコンテクストに演算子クラスオプション情報がありません" -#: utils/fmgr/fmgr.c:2070 +#: utils/fmgr/fmgr.c:2066 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "言語有効性検査関数%1$uが言語%3$uではなく%2$uに対して呼び出されました" -#: utils/fmgr/funcapi.c:384 +#: utils/fmgr/funcapi.c:455 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" msgstr "戻り値型%2$sとして宣言された関数\"%1$s\"の実際の結果型を特定できませんでした" -#: utils/fmgr/funcapi.c:1651 utils/fmgr/funcapi.c:1683 +#: utils/fmgr/funcapi.c:600 +#, c-format +msgid "argument declared %s does not contain a range type but type %s" +msgstr "%sと宣言された引数が範囲型ではなく型%sを含んでいます" + +#: utils/fmgr/funcapi.c:683 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "データ型%sの複範囲型がありませんでした" + +#: utils/fmgr/funcapi.c:1900 utils/fmgr/funcapi.c:1932 #, c-format msgid "number of aliases does not match number of columns" msgstr "別名の数が列の数と一致しません" -#: utils/fmgr/funcapi.c:1677 +#: utils/fmgr/funcapi.c:1926 #, c-format msgid "no column alias was provided" msgstr "列の別名が提供されていませんでした" -#: utils/fmgr/funcapi.c:1701 +#: utils/fmgr/funcapi.c:1950 #, c-format msgid "could not determine row description for function returning record" msgstr "レコードを返す関数についての行定義を特定できませんでした" -#: utils/init/miscinit.c:287 +#: utils/init/miscinit.c:329 #, c-format msgid "data directory \"%s\" does not exist" msgstr "データディレクトリ\"%s\"は存在しません" -#: utils/init/miscinit.c:292 +#: utils/init/miscinit.c:334 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "ディレクトリ\"%s\"の権限を読み取れませんでした: %m" -#: utils/init/miscinit.c:300 +#: utils/init/miscinit.c:342 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "指定されたデータディレクトリ\"%s\"はディレクトリではありません" -#: utils/init/miscinit.c:316 +#: utils/init/miscinit.c:358 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "データディレクトリ\"%s\"の所有者情報が間違っています" -#: utils/init/miscinit.c:318 +#: utils/init/miscinit.c:360 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "データディレクトリを所有するユーザがサーバを起動しなければなりません。" -#: utils/init/miscinit.c:336 +#: utils/init/miscinit.c:378 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "データディレクトリ\"%s\"の権限設定が不正です" -#: utils/init/miscinit.c:338 +#: utils/init/miscinit.c:380 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "権限は u=rwx(0700) または u=rwx,g=rx (0750) でなければなりません。" -#: utils/init/miscinit.c:617 utils/misc/guc.c:7157 +#: utils/init/miscinit.c:665 utils/misc/guc.c:7782 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "セキュリティー制限操作内でパラメーター\"%s\"を設定できません" -#: utils/init/miscinit.c:685 +#: utils/init/miscinit.c:733 #, c-format msgid "role with OID %u does not exist" msgstr "OID が %u であるロールは存在しません" -#: utils/init/miscinit.c:715 +#: utils/init/miscinit.c:763 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "ロール\"%s\"はログインが許可されません" -#: utils/init/miscinit.c:733 +#: utils/init/miscinit.c:781 #, c-format msgid "too many connections for role \"%s\"" msgstr "ロール\"%s\"からの接続が多すぎます" -#: utils/init/miscinit.c:793 +#: utils/init/miscinit.c:841 #, c-format msgid "permission denied to set session authorization" msgstr "set session authorization用の権限がありません" -#: utils/init/miscinit.c:876 +#: utils/init/miscinit.c:924 #, c-format msgid "invalid role OID: %u" msgstr "不正なロールID: %u" -#: utils/init/miscinit.c:930 +#: utils/init/miscinit.c:978 #, c-format msgid "database system is shut down" msgstr "データベースシステムはシャットダウンしました" -#: utils/init/miscinit.c:1017 +#: utils/init/miscinit.c:1065 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "ロックファイル\"%s\"を作成できませんでした: %m" -#: utils/init/miscinit.c:1031 +#: utils/init/miscinit.c:1079 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "ロックファイル\"%s\"をオープンできませんでした: %m" -#: utils/init/miscinit.c:1038 +#: utils/init/miscinit.c:1086 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "ロックファイル\"%s\"を読み取れませんでした: %m" -#: utils/init/miscinit.c:1047 +#: utils/init/miscinit.c:1095 #, c-format msgid "lock file \"%s\" is empty" msgstr "ロックファイル\"%s\"が空です" -#: utils/init/miscinit.c:1048 +#: utils/init/miscinit.c:1096 #, c-format msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." msgstr "他のサーバが稼働しているか、前回のサーバ起動失敗のためロックファイルが残っているかのいずれかです" -#: utils/init/miscinit.c:1092 +#: utils/init/miscinit.c:1140 #, c-format msgid "lock file \"%s\" already exists" msgstr "ロックファイル\"%s\"はすでに存在します" -#: utils/init/miscinit.c:1096 +#: utils/init/miscinit.c:1144 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "他のpostgres(PID %d)がデータディレクトリ\"%s\"で稼動していませんか?" -#: utils/init/miscinit.c:1098 +#: utils/init/miscinit.c:1146 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "他のpostmaster(PID %d)がデータディレクトリ\"%s\"で稼動していませんか?" -#: utils/init/miscinit.c:1101 +#: utils/init/miscinit.c:1149 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "他のpostgres(PID %d)がソケットファイル\"%s\"を使用していませんか?" -#: utils/init/miscinit.c:1103 +#: utils/init/miscinit.c:1151 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "他のpostmaster(PID %d)がソケットファイル\"%s\"を使用していませんか?" -#: utils/init/miscinit.c:1154 +#: utils/init/miscinit.c:1202 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "古いロックファイル\"%s\"を削除できませんでした: %m" -#: utils/init/miscinit.c:1156 +#: utils/init/miscinit.c:1204 #, c-format msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." msgstr "このファイルは偶然残ってしまったようですが、削除できませんでした。手作業でこれを削除し再実行してください。" -#: utils/init/miscinit.c:1193 utils/init/miscinit.c:1207 utils/init/miscinit.c:1218 +#: utils/init/miscinit.c:1241 utils/init/miscinit.c:1255 utils/init/miscinit.c:1266 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "ロックファイル\"%s\"に書き出せませんでした: %m" -#: utils/init/miscinit.c:1329 utils/init/miscinit.c:1471 utils/misc/guc.c:10056 +#: utils/init/miscinit.c:1377 utils/init/miscinit.c:1519 utils/misc/guc.c:10740 #, c-format msgid "could not read from file \"%s\": %m" msgstr "ファイル\"%s\"から読み取れませんでした: %m" -#: utils/init/miscinit.c:1459 +#: utils/init/miscinit.c:1507 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "ファイル\"%s\"をオープンできませんでした: %m; とりあえず続けます" -#: utils/init/miscinit.c:1484 +#: utils/init/miscinit.c:1532 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "ロックファイル\"%s\"が誤ったPIDをもっています: %ld、正しくは%ld" -#: utils/init/miscinit.c:1523 utils/init/miscinit.c:1539 +#: utils/init/miscinit.c:1571 utils/init/miscinit.c:1587 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\"は有効なデータディレクトリではありません" -#: utils/init/miscinit.c:1525 +#: utils/init/miscinit.c:1573 #, c-format msgid "File \"%s\" is missing." msgstr "ファイル\"%s\"が存在しません" -#: utils/init/miscinit.c:1541 +#: utils/init/miscinit.c:1589 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "ファイル\"%s\"に有効なデータがありません。" -#: utils/init/miscinit.c:1543 +#: utils/init/miscinit.c:1591 #, c-format msgid "You might need to initdb." msgstr "initdbする必要があるかもしれません" -#: utils/init/miscinit.c:1551 +#: utils/init/miscinit.c:1599 #, c-format msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." msgstr "データディレクトリはPostgreSQLバージョン%sで初期化されましたが、これはバージョン%sとは互換性がありません" -#: utils/init/miscinit.c:1618 +#: utils/init/postinit.c:258 #, c-format -msgid "loaded library \"%s\"" -msgstr "ライブラリ\"%s\"をロードしました" +msgid "replication connection authorized: user=%s" +msgstr "レプリケーション接続の認証完了: ユーザ=%s" -#: utils/init/postinit.c:255 +#: utils/init/postinit.c:261 #, c-format -msgid "replication connection authorized: user=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr "レプリケーション接続の認証完了: ユーザ=%s application_name=%s SSL有効 (プロトコル=%s、暗号方式=%s、ビット長=%d、圧縮=%s)" +msgid "connection authorized: user=%s" +msgstr "接続が認証されました: ユーザ=%s" -#: utils/init/postinit.c:261 utils/init/postinit.c:267 utils/init/postinit.c:289 utils/init/postinit.c:295 -msgid "off" -msgstr "無効" - -#: utils/init/postinit.c:261 utils/init/postinit.c:267 utils/init/postinit.c:289 utils/init/postinit.c:295 -msgid "on" -msgstr "有効" - -#: utils/init/postinit.c:262 +#: utils/init/postinit.c:264 #, c-format -msgid "replication connection authorized: user=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr "レプリケーション接続の認証完了: ユーザ=%s SSL有効 (プロトコル=%s、暗号方式=%s、ビット長=%d、圧縮=%s)" +msgid " database=%s" +msgstr " データベース=%s" -#: utils/init/postinit.c:272 +#: utils/init/postinit.c:267 #, c-format -msgid "replication connection authorized: user=%s application_name=%s" -msgstr "レプリケーション接続の認証完了: ユーザ=%s application_name=%s" +msgid " application_name=%s" +msgstr " application_name=%s" -#: utils/init/postinit.c:275 +#: utils/init/postinit.c:272 #, c-format -msgid "replication connection authorized: user=%s" -msgstr "レプリケーション接続の認証完了: ユーザ=%s" +msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" +msgstr "SSL有効(プロトコル=%s、暗号化方式=%s、ビット長=%d)" #: utils/init/postinit.c:284 #, c-format -msgid "connection authorized: user=%s database=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr "接続の認証完了: ユーザ=%s データベース=%s application_name=%s SSL有効 (プロトコル=%s、暗号方式=%s、ビット長=%d、圧縮=%s)" +msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" +msgstr " GSS (認証=%s, 暗号化=%s, プリンシパル=%s)" -#: utils/init/postinit.c:290 -#, c-format -msgid "connection authorized: user=%s database=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr "接続の認証完了: ユーザ=%s データベース=%s SSL有効 (プロトコル=%s、暗号方式=%s、ビット長=%d、圧縮=%s)" +#: utils/init/postinit.c:285 utils/init/postinit.c:286 utils/init/postinit.c:291 utils/init/postinit.c:292 +msgid "no" +msgstr "いいえ" -#: utils/init/postinit.c:300 -#, c-format -msgid "connection authorized: user=%s database=%s application_name=%s" -msgstr "接続の認証完了 ユーザ=%s データベース=%s application_name=%s" +#: utils/init/postinit.c:285 utils/init/postinit.c:286 utils/init/postinit.c:291 utils/init/postinit.c:292 +msgid "yes" +msgstr "はい" -#: utils/init/postinit.c:302 +#: utils/init/postinit.c:290 #, c-format -msgid "connection authorized: user=%s database=%s" -msgstr "接続の認証完了: ユーザ=%s データベース=%s" +msgid " GSS (authenticated=%s, encrypted=%s)" +msgstr " GSS (認証=%s, 暗号化=%s)" -#: utils/init/postinit.c:334 +#: utils/init/postinit.c:330 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "データベース\"%s\"はpg_databaseから消失しました" -#: utils/init/postinit.c:336 +#: utils/init/postinit.c:332 #, c-format msgid "Database OID %u now seems to belong to \"%s\"." msgstr "OID%uのデータベースは\"%s\"に属するようです。" -#: utils/init/postinit.c:356 +#: utils/init/postinit.c:352 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "現在データベース\"%s\"は接続を受け付けません" -#: utils/init/postinit.c:369 +#: utils/init/postinit.c:365 #, c-format msgid "permission denied for database \"%s\"" msgstr "データベース\"%s\"へのアクセスが拒否されました" -#: utils/init/postinit.c:370 +#: utils/init/postinit.c:366 #, c-format msgid "User does not have CONNECT privilege." msgstr "ユーザはCONNECT権限を持ちません。" -#: utils/init/postinit.c:387 +#: utils/init/postinit.c:383 #, c-format msgid "too many connections for database \"%s\"" msgstr "データベース\"%s\"への接続が多すぎます" @@ -24192,77 +25969,82 @@ msgstr "データベースを別のロケールで再生成するか、または msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." msgstr "データベースは LC_CTYPE \"%s\"で初期化されていますが、setlocale()でこれを認識されません" -#: utils/init/postinit.c:766 +#: utils/init/postinit.c:456 #, c-format -msgid "no roles are defined in this database system" -msgstr "データベースシステム内でロールが定義されていません" +msgid "database \"%s\" has no actual collation version, but a version was recorded" +msgstr "データベース\"%s\"には実際の照合順序バージョンがありませんが、バージョンが記録されています" -#: utils/init/postinit.c:767 +#: utils/init/postinit.c:460 #, c-format -msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." -msgstr "すぐに CREATE USER \"%s\" SUPERUSER; を実行してください。" +msgid "database \"%s\" has a collation version mismatch" +msgstr "データベース\"%s\"で照合順序バージョンの不一致が起きています" + +#: utils/init/postinit.c:462 +#, c-format +msgid "The database was created using collation version %s, but the operating system provides version %s." +msgstr "データベースは照合順序バージョン%sで作成されていますが、オペレーティングシステムはバージョン%sを提供しています。" -#: utils/init/postinit.c:803 +#: utils/init/postinit.c:465 #, c-format -msgid "new replication connections are not allowed during database shutdown" -msgstr "データベースのシャットダウン中は、新しいレプリケーション接続は許可されません" +msgid "Rebuild all objects in this database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." +msgstr "このデータベース内でデフォルトの照合順序を使用している全てのオブジェクトを再構築して、ALTER DATABASE %s REFRESH COLLATION VERSIONを実行するか、正しいバージョンのライブラリを用いてPostgreSQLをビルドしてください。" -#: utils/init/postinit.c:807 +#: utils/init/postinit.c:814 #, c-format -msgid "must be superuser to connect during database shutdown" -msgstr "データベースのシャットダウン中に接続するにはスーパユーザである必要があります" +msgid "no roles are defined in this database system" +msgstr "データベースシステム内でロールが定義されていません" + +#: utils/init/postinit.c:815 +#, c-format +msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." +msgstr "すぐに CREATE USER \"%s\" SUPERUSER; を実行してください。" -#: utils/init/postinit.c:817 +#: utils/init/postinit.c:847 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "バイナリアップグレードモード中に接続するにはスーパユーザである必要があります" -#: utils/init/postinit.c:830 +#: utils/init/postinit.c:860 #, c-format msgid "remaining connection slots are reserved for non-replication superuser connections" msgstr "残りの接続スロットはレプリケーションユーザではないスーパユーザ用に予約されています" -#: utils/init/postinit.c:840 +#: utils/init/postinit.c:870 #, c-format msgid "must be superuser or replication role to start walsender" msgstr "walsenderを起動するにはスーパユーザまたはreplicationロールである必要があります" -#: utils/init/postinit.c:909 +#: utils/init/postinit.c:939 #, c-format msgid "database %u does not exist" msgstr "データベース %u は存在しません" -#: utils/init/postinit.c:998 +#: utils/init/postinit.c:1028 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "削除またはリネームされたばかりのようです。" -#: utils/init/postinit.c:1016 +#: utils/init/postinit.c:1046 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "データベースのサブディレクトリ\"%s\"がありません。" -#: utils/init/postinit.c:1021 -#, c-format -msgid "could not access directory \"%s\": %m" -msgstr "ディレクトリ\"%s\"にアクセスできませんでした: %m" - -#: utils/mb/conv.c:443 utils/mb/conv.c:635 +#: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" msgstr "不正な符号化方式番号: %d" -#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:122 utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:154 +#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:129 utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:165 #, c-format msgid "unexpected encoding ID %d for ISO 8859 character sets" msgstr "ISO8859文字セットに対する符号化方式ID %dは想定外です" -#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:103 utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:135 +#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:110 utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:146 #, c-format msgid "unexpected encoding ID %d for WIN character sets" msgstr "WIN文字セットに対する符号化方式ID %dは想定外です<" -#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:842 +#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:900 #, c-format msgid "conversion between %s and %s is not supported" msgstr "%sと%s間の変換はサポートされていません" @@ -24272,1917 +26054,2014 @@ msgstr "%sと%s間の変換はサポートされていません" msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" msgstr "符号化方式\"%s\"から\"%s\"用のデフォルト変換関数は存在しません" -#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:429 utils/mb/mbutils.c:758 utils/mb/mbutils.c:784 +#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 utils/mb/mbutils.c:842 #, c-format msgid "String of %d bytes is too long for encoding conversion." msgstr "%dバイトの文字列は符号化変換では長すぎます。" -#: utils/mb/mbutils.c:511 +#: utils/mb/mbutils.c:568 #, c-format msgid "invalid source encoding name \"%s\"" msgstr "不正な変換元符号化方式名: \"%s\"" -#: utils/mb/mbutils.c:516 +#: utils/mb/mbutils.c:573 #, c-format msgid "invalid destination encoding name \"%s\"" msgstr "不正な変換先符号化方式名: \"%s\"" -#: utils/mb/mbutils.c:656 +#: utils/mb/mbutils.c:713 #, c-format msgid "invalid byte value for encoding \"%s\": 0x%02x" msgstr "符号化方式\"%s\"に対する不正なバイト値: 0x%02x" -#: utils/mb/mbutils.c:819 +#: utils/mb/mbutils.c:877 #, c-format msgid "invalid Unicode code point" msgstr "不正なUnicodeコードポイント" -#: utils/mb/mbutils.c:1087 +#: utils/mb/mbutils.c:1146 #, c-format msgid "bind_textdomain_codeset failed" msgstr "bind_textdomain_codesetが失敗しました" -#: utils/mb/mbutils.c:1595 +#: utils/mb/mbutils.c:1667 #, c-format msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "符号化方式\"%s\"に対する不正なバイト列です: %s" -#: utils/mb/mbutils.c:1628 +#: utils/mb/mbutils.c:1700 #, c-format msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "符号化方式\"%2$s\"においてバイト列%1$sである文字は符号化方式\"%3$s\"で等価な文字を持ちません" -#: utils/misc/guc.c:675 +#: utils/misc/guc.c:776 msgid "Ungrouped" msgstr "その他" -#: utils/misc/guc.c:677 +#: utils/misc/guc.c:778 msgid "File Locations" msgstr "ファイルの位置" -#: utils/misc/guc.c:679 -msgid "Connections and Authentication" -msgstr "接続と認証" - -#: utils/misc/guc.c:681 +#: utils/misc/guc.c:780 msgid "Connections and Authentication / Connection Settings" msgstr "接続と認証/接続設定" -#: utils/misc/guc.c:683 +#: utils/misc/guc.c:782 msgid "Connections and Authentication / Authentication" msgstr "接続と認証/認証" -#: utils/misc/guc.c:685 +#: utils/misc/guc.c:784 msgid "Connections and Authentication / SSL" msgstr "接続と認証/SSL" -#: utils/misc/guc.c:687 -msgid "Resource Usage" -msgstr "使用リソース" - -#: utils/misc/guc.c:689 +#: utils/misc/guc.c:786 msgid "Resource Usage / Memory" msgstr "使用リソース/メモリ" -#: utils/misc/guc.c:691 +#: utils/misc/guc.c:788 msgid "Resource Usage / Disk" msgstr "使用リソース/ディスク" -#: utils/misc/guc.c:693 +#: utils/misc/guc.c:790 msgid "Resource Usage / Kernel Resources" msgstr "使用リソース/カーネルリソース" -#: utils/misc/guc.c:695 +#: utils/misc/guc.c:792 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "使用リソース / コストベースvacuum遅延" -#: utils/misc/guc.c:697 +#: utils/misc/guc.c:794 msgid "Resource Usage / Background Writer" msgstr "使用リソース / バックグラウンド・ライタ" -#: utils/misc/guc.c:699 +#: utils/misc/guc.c:796 msgid "Resource Usage / Asynchronous Behavior" msgstr "使用リソース / 非同期動作" -#: utils/misc/guc.c:701 -msgid "Write-Ahead Log" -msgstr "先行書き込みログ" - -#: utils/misc/guc.c:703 +#: utils/misc/guc.c:798 msgid "Write-Ahead Log / Settings" msgstr "先行書き込みログ / 設定" -#: utils/misc/guc.c:705 +#: utils/misc/guc.c:800 msgid "Write-Ahead Log / Checkpoints" msgstr "先行書き込みログ / チェックポイント" -#: utils/misc/guc.c:707 +#: utils/misc/guc.c:802 msgid "Write-Ahead Log / Archiving" msgstr "先行書き込みログ / アーカイビング" -#: utils/misc/guc.c:709 +#: utils/misc/guc.c:804 +msgid "Write-Ahead Log / Recovery" +msgstr "先行書き込みログ / リカバリ" + +#: utils/misc/guc.c:806 msgid "Write-Ahead Log / Archive Recovery" msgstr "先行書き込みログ / アーカイブリカバリ" -#: utils/misc/guc.c:711 +#: utils/misc/guc.c:808 msgid "Write-Ahead Log / Recovery Target" msgstr "先行書き込みログ / チェックポイント" -#: utils/misc/guc.c:713 -msgid "Replication" -msgstr "レプリケーション" - -#: utils/misc/guc.c:715 +#: utils/misc/guc.c:810 msgid "Replication / Sending Servers" msgstr "レプリケーション / 送信サーバ" -#: utils/misc/guc.c:717 +#: utils/misc/guc.c:812 msgid "Replication / Primary Server" msgstr "レプリケーション / プライマリサーバ" -#: utils/misc/guc.c:719 +#: utils/misc/guc.c:814 msgid "Replication / Standby Servers" msgstr "レプリケーション / スタンバイサーバ" -#: utils/misc/guc.c:721 +#: utils/misc/guc.c:816 msgid "Replication / Subscribers" msgstr "レプリケーション / 購読サーバ" -#: utils/misc/guc.c:723 -msgid "Query Tuning" -msgstr "問い合わせのチューニング" - -#: utils/misc/guc.c:725 +#: utils/misc/guc.c:818 msgid "Query Tuning / Planner Method Configuration" msgstr "問い合わせのチューニング / プランナ手法設定" -#: utils/misc/guc.c:727 +#: utils/misc/guc.c:820 msgid "Query Tuning / Planner Cost Constants" msgstr "問い合わせのチューニング / プランナコスト定数" -#: utils/misc/guc.c:729 +#: utils/misc/guc.c:822 msgid "Query Tuning / Genetic Query Optimizer" msgstr "問い合わせのチューニング / 遺伝的問い合わせオプティマイザ" -#: utils/misc/guc.c:731 +#: utils/misc/guc.c:824 msgid "Query Tuning / Other Planner Options" msgstr "問い合わせのチューニング / その他のプランオプション" -#: utils/misc/guc.c:733 -msgid "Reporting and Logging" -msgstr "レポートとログ出力" - -#: utils/misc/guc.c:735 +#: utils/misc/guc.c:826 msgid "Reporting and Logging / Where to Log" msgstr "レポートとログ出力 / ログの出力先" -#: utils/misc/guc.c:737 +#: utils/misc/guc.c:828 msgid "Reporting and Logging / When to Log" msgstr "レポートとログ出力 / ログのタイミング" -#: utils/misc/guc.c:739 +#: utils/misc/guc.c:830 msgid "Reporting and Logging / What to Log" msgstr "レポートとログ出力 / ログの内容" -#: utils/misc/guc.c:741 -msgid "Process Title" -msgstr "プロセスタイトル" - -#: utils/misc/guc.c:743 -msgid "Statistics" -msgstr "統計情報" +#: utils/misc/guc.c:832 +msgid "Reporting and Logging / Process Title" +msgstr "レポートとログ出力 / プロセス表記" -#: utils/misc/guc.c:745 +#: utils/misc/guc.c:834 msgid "Statistics / Monitoring" msgstr "統計情報 / 監視" -#: utils/misc/guc.c:747 -msgid "Statistics / Query and Index Statistics Collector" -msgstr "統計情報 / 問い合わせとインデックスの統計情報収集器" +#: utils/misc/guc.c:836 +msgid "Statistics / Cumulative Query and Index Statistics" +msgstr "統計情報 / 問い合わせとインデックスの累積統計情報" -#: utils/misc/guc.c:749 +#: utils/misc/guc.c:838 msgid "Autovacuum" msgstr "自動VACUUM" -#: utils/misc/guc.c:751 -msgid "Client Connection Defaults" -msgstr "クライアント接続のデフォルト設定" - -#: utils/misc/guc.c:753 +#: utils/misc/guc.c:840 msgid "Client Connection Defaults / Statement Behavior" msgstr "クライアント接続のデフォルト設定 / 文の振舞い" -#: utils/misc/guc.c:755 +#: utils/misc/guc.c:842 msgid "Client Connection Defaults / Locale and Formatting" msgstr "クライアント接続のデフォルト設定 / ロケールと整形" -#: utils/misc/guc.c:757 +#: utils/misc/guc.c:844 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "クライアント接続のデフォルト設定 / ライブラリの事前読み込み" -#: utils/misc/guc.c:759 +#: utils/misc/guc.c:846 msgid "Client Connection Defaults / Other Defaults" msgstr "クライアント接続のデフォルト設定 / その他のデフォルト設定" -#: utils/misc/guc.c:761 +#: utils/misc/guc.c:848 msgid "Lock Management" msgstr "ロック管理" -#: utils/misc/guc.c:763 -msgid "Version and Platform Compatibility" -msgstr "バージョンおよびプラットフォーム間の互換性" - -#: utils/misc/guc.c:765 +#: utils/misc/guc.c:850 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "バージョンおよびプラットフォーム間の互換性 / PostgreSQLの以前のバージョン" -#: utils/misc/guc.c:767 +#: utils/misc/guc.c:852 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "バージョンおよびプラットフォーム間の互換性 / 他のプラットフォームおよびクライアント" -#: utils/misc/guc.c:769 +#: utils/misc/guc.c:854 msgid "Error Handling" msgstr "エラーハンドリング" -#: utils/misc/guc.c:771 +#: utils/misc/guc.c:856 msgid "Preset Options" msgstr "事前設定オプション" -#: utils/misc/guc.c:773 +#: utils/misc/guc.c:858 msgid "Customized Options" msgstr "独自オプション" -#: utils/misc/guc.c:775 +#: utils/misc/guc.c:860 msgid "Developer Options" msgstr "開発者向けオプション" -#: utils/misc/guc.c:833 +#: utils/misc/guc.c:918 msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." msgstr "このパラメータで使用可能な単位は\"B\"、\"kB\"、\"MB\"、\"GB\"および\"TB\"です。" -#: utils/misc/guc.c:870 +#: utils/misc/guc.c:955 msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." msgstr "このパラメータの有効単位は \"us\"、\"ms\"、\"s\"、\"min\"、\"h\"そして\"d\"です。" -#: utils/misc/guc.c:932 +#: utils/misc/guc.c:1017 msgid "Enables the planner's use of sequential-scan plans." msgstr "プランナでのシーケンシャルスキャンプランの使用を有効にします。" -#: utils/misc/guc.c:942 +#: utils/misc/guc.c:1027 msgid "Enables the planner's use of index-scan plans." msgstr "プランナでのインデックススキャンプランの使用を有効にします。" -#: utils/misc/guc.c:952 +#: utils/misc/guc.c:1037 msgid "Enables the planner's use of index-only-scan plans." msgstr "プランナでのインデックスオンリースキャンプランの使用を有効にします。" -#: utils/misc/guc.c:962 +#: utils/misc/guc.c:1047 msgid "Enables the planner's use of bitmap-scan plans." msgstr "プランナでのビットマップスキャンプランの使用を有効にします。" -#: utils/misc/guc.c:972 +#: utils/misc/guc.c:1057 msgid "Enables the planner's use of TID scan plans." msgstr "プランナでのTIDスキャンプランの使用を有効にします。" -#: utils/misc/guc.c:982 +#: utils/misc/guc.c:1067 msgid "Enables the planner's use of explicit sort steps." msgstr "プランナでの明示的ソートの使用を有効にします。" -#: utils/misc/guc.c:992 +#: utils/misc/guc.c:1077 msgid "Enables the planner's use of incremental sort steps." msgstr "プランナでの差分ソート処理の使用を有効にします。" -#: utils/misc/guc.c:1001 +#: utils/misc/guc.c:1087 msgid "Enables the planner's use of hashed aggregation plans." msgstr "プランナでのハッシュ集約プランの使用を有効にします。" -#: utils/misc/guc.c:1011 +#: utils/misc/guc.c:1097 msgid "Enables the planner's use of materialization." msgstr "プランナでの実体化の使用を有効にします。" -#: utils/misc/guc.c:1021 +#: utils/misc/guc.c:1107 +msgid "Enables the planner's use of memoization." +msgstr "プランナでのメモ化の使用を有効にします。" + +#: utils/misc/guc.c:1117 msgid "Enables the planner's use of nested-loop join plans." msgstr "プランナでのネストループジョインプランの使用を有効にします。" -#: utils/misc/guc.c:1031 +#: utils/misc/guc.c:1127 msgid "Enables the planner's use of merge join plans." msgstr "プランナでのマージジョインプランの使用を有効にします。" -#: utils/misc/guc.c:1041 +#: utils/misc/guc.c:1137 msgid "Enables the planner's use of hash join plans." msgstr "プランナでのハッシュジョインプランの使用を有効にします。" -#: utils/misc/guc.c:1051 +#: utils/misc/guc.c:1147 msgid "Enables the planner's use of gather merge plans." msgstr "プランナでのギャザーマージプランの使用を有効にします。" -#: utils/misc/guc.c:1061 +#: utils/misc/guc.c:1157 msgid "Enables partitionwise join." msgstr "パーティション単位ジョインを有効にします。" -#: utils/misc/guc.c:1071 +#: utils/misc/guc.c:1167 msgid "Enables partitionwise aggregation and grouping." msgstr "パーティション単位の集約およびグルーピングを有効にします。" -#: utils/misc/guc.c:1081 +#: utils/misc/guc.c:1177 msgid "Enables the planner's use of parallel append plans." msgstr "プランナでの並列アペンドプランの使用を有効にします。" -#: utils/misc/guc.c:1091 +#: utils/misc/guc.c:1187 msgid "Enables the planner's use of parallel hash plans." msgstr "プランナでの並列ハッシュプランの使用を有効にします。" -#: utils/misc/guc.c:1101 -msgid "Enables plan-time and run-time partition pruning." +#: utils/misc/guc.c:1197 +msgid "Enables plan-time and execution-time partition pruning." msgstr "実行計画作成時および実行時のパーティション除外処理を有効にします。" -#: utils/misc/guc.c:1102 +#: utils/misc/guc.c:1198 msgid "Allows the query planner and executor to compare partition bounds to conditions in the query to determine which partitions must be scanned." msgstr "実行計画時と実行時の、クエリ中の条件とパーティション境界の比較に基づいたパーティション単位のスキャン除外処理を許可します。" -#: utils/misc/guc.c:1113 +#: utils/misc/guc.c:1209 +msgid "Enables the planner's use of async append plans." +msgstr "プランナでの非同期アペンドプランの使用を有効にします。" + +#: utils/misc/guc.c:1219 +msgid "enable reordering of GROUP BY key" +msgstr "GROUP BYのキーの順序替えを許可する" + +#: utils/misc/guc.c:1229 msgid "Enables genetic query optimization." msgstr "遺伝的問い合わせ最適化を有効にします。" -#: utils/misc/guc.c:1114 +#: utils/misc/guc.c:1230 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "このアルゴリズムでは、全数探索を伴わずに行う実行計画の作成を試みます。" -#: utils/misc/guc.c:1125 +#: utils/misc/guc.c:1241 msgid "Shows whether the current user is a superuser." msgstr "現在のユーザがスーパユーザかどうかを表示します。" -#: utils/misc/guc.c:1135 +#: utils/misc/guc.c:1251 msgid "Enables advertising the server via Bonjour." msgstr "Bonjour を経由したサーバのアドバタイズを有効にします。" -#: utils/misc/guc.c:1144 +#: utils/misc/guc.c:1260 msgid "Collects transaction commit time." msgstr "トランザクションのコミット時刻を収集します。" -#: utils/misc/guc.c:1153 +#: utils/misc/guc.c:1269 msgid "Enables SSL connections." msgstr "SSL接続を有効にします。" -#: utils/misc/guc.c:1162 -msgid "Also use ssl_passphrase_command during server reload." -msgstr "サーバリロード時にも ssl_passphrase_command を使用します。" +#: utils/misc/guc.c:1278 +msgid "Controls whether ssl_passphrase_command is called during server reload." +msgstr "サーバリロード時にも ssl_passphrase_command を呼び出すかどうかを指定します。" -#: utils/misc/guc.c:1171 +#: utils/misc/guc.c:1287 msgid "Give priority to server ciphersuite order." msgstr "サーバ側の暗号スイート順序を優先します。" -#: utils/misc/guc.c:1180 +#: utils/misc/guc.c:1296 msgid "Forces synchronization of updates to disk." msgstr "強制的に更新をディスクに同期します。" -#: utils/misc/guc.c:1181 +#: utils/misc/guc.c:1297 msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This insures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "サーバは、確実に更新が物理的にディスクに書き込まれるように複数の場所でfsync()システムコールを使用します。これにより、オペレーティングシステムやハードウェアがクラッシュした後でもデータベースクラスタは一貫した状態に復旧することができます。" -#: utils/misc/guc.c:1192 +#: utils/misc/guc.c:1308 msgid "Continues processing after a checksum failure." msgstr "チェックサムエラーの発生時に処理を継続します。" -#: utils/misc/guc.c:1193 +#: utils/misc/guc.c:1309 msgid "Detection of a checksum failure normally causes PostgreSQL to report an error, aborting the current transaction. Setting ignore_checksum_failure to true causes the system to ignore the failure (but still report a warning), and continue processing. This behavior could cause crashes or other serious problems. Only has an effect if checksums are enabled." msgstr "チェックサムエラーを検知すると、通常PostgreSQLはエラーの報告を行ない、現在のトランザクションを中断させます。ignore_checksum_failureを真に設定することによりエラーを無視します(代わりに警告を報告します)この動作はクラッシュや他の深刻な問題を引き起こすかもしれません。チェックサムが有効な場合にのみ効果があります。" -#: utils/misc/guc.c:1207 +#: utils/misc/guc.c:1323 msgid "Continues processing past damaged page headers." msgstr "破損したページヘッダがあっても処理を継続します。" -#: utils/misc/guc.c:1208 +#: utils/misc/guc.c:1324 msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting zero_damaged_pages to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." msgstr "ページヘッダの障害が分かると、通常PostgreSQLはエラーの報告を行ない、現在のトランザクションを中断させます。zero_damaged_pagesを真に設定することにより、システムは代わりに警告を報告し、障害のあるページをゼロで埋め、処理を継続します。 この動作により、障害のあったページ上にある全ての行のデータを破壊されます。" -#: utils/misc/guc.c:1221 +#: utils/misc/guc.c:1337 msgid "Continues recovery after an invalid pages failure." msgstr "不正ページエラーの発生時に処理を継続します。" -#: utils/misc/guc.c:1222 +#: utils/misc/guc.c:1338 msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting ignore_invalid_pages to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." msgstr "リカバリ中に不正なページへの参照を行うWALレコードを検出した場合、PostgreSQLはPANICレベルのエラーを出力してリカバリを中断します。ignore_invalid_pagesをtrueに設定するとシステムはWALレコード中の不正なページへの参照を無視してリカバリを継続します(ただし、引き続き警告は出力します)。この挙動はクラッシュ、データ損失、破壊の伝播ないしは隠蔽または他の深刻な問題を引き起こします。リカバリモードもしくはスタンバイモードでのみ有効となります。" -#: utils/misc/guc.c:1240 +#: utils/misc/guc.c:1356 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "チェックポイントの後最初に変更された際にページ全体をWALに出力します。" -#: utils/misc/guc.c:1241 +#: utils/misc/guc.c:1357 msgid "A page write in process during an operating system crash might be only partially written to disk. During recovery, the row changes stored in WAL are not enough to recover. This option writes pages when first modified after a checkpoint to WAL so full recovery is possible." msgstr "ページ書き込み処理中にオペレーティングシステムがクラッシュすると、ディスクへの書き込みが一部分のみ行われる可能性があります。リカバリでは、WALに保存された行の変更だけでは完全に復旧させることができません。このオプションにより、チェックポイントの後の最初の更新時にWALにページを出力するため、完全な復旧が可能になります。" -#: utils/misc/guc.c:1254 -msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modifications." +#: utils/misc/guc.c:1370 +msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." msgstr "チェックポイントの後最初に更新された時に、重要な更新ではなくてもページ全体をWALに書き出します。" -#: utils/misc/guc.c:1264 -msgid "Compresses full-page writes written in WAL file." -msgstr "WALファイルに出力される全ページ出力を圧縮します。" - -#: utils/misc/guc.c:1274 +#: utils/misc/guc.c:1380 msgid "Writes zeroes to new WAL files before first use." msgstr "新しいWALファイルの使用前にゼロを書き込みます。" -#: utils/misc/guc.c:1284 +#: utils/misc/guc.c:1390 msgid "Recycles WAL files by renaming them." msgstr "WALファイルを名前を変更して再利用します。" -#: utils/misc/guc.c:1294 +#: utils/misc/guc.c:1400 msgid "Logs each checkpoint." msgstr "チェックポイントをログに記録します。" -#: utils/misc/guc.c:1303 +#: utils/misc/guc.c:1409 msgid "Logs each successful connection." msgstr "成功した接続を全てログに記録します。" -#: utils/misc/guc.c:1312 +#: utils/misc/guc.c:1418 msgid "Logs end of a session, including duration." msgstr "セッションの終了時刻とその期間をログに記録します。" -#: utils/misc/guc.c:1321 +#: utils/misc/guc.c:1427 msgid "Logs each replication command." msgstr "各レプリケーションコマンドをログに記録します。" -#: utils/misc/guc.c:1330 +#: utils/misc/guc.c:1436 msgid "Shows whether the running server has assertion checks enabled." msgstr "起動中のサーバがアサーションチェックを有効にしているかどうかを表示します。" -#: utils/misc/guc.c:1345 +#: utils/misc/guc.c:1451 msgid "Terminate session on any error." msgstr "何からのエラーがあればセッションを終了します" -#: utils/misc/guc.c:1354 +#: utils/misc/guc.c:1460 msgid "Reinitialize server after backend crash." msgstr "バックエンドがクラッシュした後サーバを再初期化します" -#: utils/misc/guc.c:1364 +#: utils/misc/guc.c:1469 +msgid "Remove temporary files after backend crash." +msgstr "バックエンドのクラッシュ後に一時ファイルを削除します。" + +#: utils/misc/guc.c:1480 msgid "Logs the duration of each completed SQL statement." msgstr "完了したSQL全ての実行時間をログに記録します。" -#: utils/misc/guc.c:1373 +#: utils/misc/guc.c:1489 msgid "Logs each query's parse tree." msgstr "問い合わせのパースツリーをログに記録します。" -#: utils/misc/guc.c:1382 +#: utils/misc/guc.c:1498 msgid "Logs each query's rewritten parse tree." msgstr "リライト後の問い合わせのパースツリーをログを記録します。" -#: utils/misc/guc.c:1391 +#: utils/misc/guc.c:1507 msgid "Logs each query's execution plan." msgstr "問い合わせの実行計画をログに記録します。" -#: utils/misc/guc.c:1400 +#: utils/misc/guc.c:1516 msgid "Indents parse and plan tree displays." msgstr "パースツリーと実行計画ツリーの表示をインデントします。" -#: utils/misc/guc.c:1409 +#: utils/misc/guc.c:1525 msgid "Writes parser performance statistics to the server log." msgstr "パーサの性能統計情報をサーバログに出力します。" -#: utils/misc/guc.c:1418 +#: utils/misc/guc.c:1534 msgid "Writes planner performance statistics to the server log." msgstr "プランナの性能統計情報をサーバログに出力します。" -#: utils/misc/guc.c:1427 +#: utils/misc/guc.c:1543 msgid "Writes executor performance statistics to the server log." msgstr "エグゼキュータの性能統計情報をサーバログに出力します。" -#: utils/misc/guc.c:1436 +#: utils/misc/guc.c:1552 msgid "Writes cumulative performance statistics to the server log." msgstr "累積の性能統計情報をサーバログに出力します。" -#: utils/misc/guc.c:1446 +#: utils/misc/guc.c:1562 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "B-treeの各種操作に関するシステムリソース(メモリとCPU)の使用統計をログに記録します。" -#: utils/misc/guc.c:1458 +#: utils/misc/guc.c:1574 msgid "Collects information about executing commands." msgstr "実行中のコマンドに関する情報を収集します。" -#: utils/misc/guc.c:1459 +#: utils/misc/guc.c:1575 msgid "Enables the collection of information on the currently executing command of each session, along with the time at which that command began execution." msgstr "そのコマンドが実行を開始した時刻を伴った、各セッションでの現時点で実行中のコマンドに関する情報の収集を有効にします。" -#: utils/misc/guc.c:1469 +#: utils/misc/guc.c:1585 msgid "Collects statistics on database activity." msgstr "データベースの活動について統計情報を収集します。" -#: utils/misc/guc.c:1478 +#: utils/misc/guc.c:1594 msgid "Collects timing statistics for database I/O activity." -msgstr "データベースのI/O動作に関する時間測定統計情報を収集します。" +msgstr "データベースのI/O処理時間に関する統計情報を収集します。" + +#: utils/misc/guc.c:1603 +msgid "Collects timing statistics for WAL I/O activity." +msgstr "WALのI/O処理時間に関する統計情報を収集します。" -#: utils/misc/guc.c:1488 +#: utils/misc/guc.c:1613 msgid "Updates the process title to show the active SQL command." msgstr "活動中のSQLコマンドを表示するようプロセスタイトルを更新します。" -#: utils/misc/guc.c:1489 +#: utils/misc/guc.c:1614 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "新しいSQLコマンドをサーバが受信する度に行うプロセスタイトルの更新を有効にします。" -#: utils/misc/guc.c:1502 +#: utils/misc/guc.c:1627 msgid "Starts the autovacuum subprocess." msgstr "autovacuumサブプロセスを起動します。" -#: utils/misc/guc.c:1512 +#: utils/misc/guc.c:1637 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "LISTENとNOTIFYコマンドのためのデバッグ出力を生成します。" -#: utils/misc/guc.c:1524 +#: utils/misc/guc.c:1649 msgid "Emits information about lock usage." msgstr "ロック使用状況に関する情報を出力します。" -#: utils/misc/guc.c:1534 +#: utils/misc/guc.c:1659 msgid "Emits information about user lock usage." msgstr "ユーザロックの使用状況に関する情報を出力します。" -#: utils/misc/guc.c:1544 +#: utils/misc/guc.c:1669 msgid "Emits information about lightweight lock usage." msgstr "軽量ロックの使用状況に関する情報を出力します。" -#: utils/misc/guc.c:1554 +#: utils/misc/guc.c:1679 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "デッドロックの発生時点の全てのロックについての情報をダンプします。" -#: utils/misc/guc.c:1566 +#: utils/misc/guc.c:1691 msgid "Logs long lock waits." msgstr "長時間のロック待機をログに記録します。" -#: utils/misc/guc.c:1576 +#: utils/misc/guc.c:1700 +msgid "Logs standby recovery conflict waits." +msgstr "スタンバイのリカバリ衝突による待機をログ出力します。" + +#: utils/misc/guc.c:1709 msgid "Logs the host name in the connection logs." msgstr "接続ログ内でホスト名を出力します。" -#: utils/misc/guc.c:1577 +#: utils/misc/guc.c:1710 msgid "By default, connection logs only show the IP address of the connecting host. If you want them to show the host name you can turn this on, but depending on your host name resolution setup it might impose a non-negligible performance penalty." msgstr "デフォルトでは、接続ログメッセージには接続ホストのIPアドレスのみが表示されます。 このオプションを有効にすることで、ホスト名もログに表示されるようになります。 ホスト名解決の設定によってはで、無視できないほどの性能の悪化が起きうることに注意してください。" -#: utils/misc/guc.c:1588 +#: utils/misc/guc.c:1721 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "\"expr=NULL\"という形の式は\"expr IS NULL\"として扱います。" -#: utils/misc/guc.c:1589 +#: utils/misc/guc.c:1722 msgid "When turned on, expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL, that is, they return true if expr evaluates to the null value, and false otherwise. The correct behavior of expr = NULL is to always return null (unknown)." msgstr "有効にした場合、expr = NULL(またはNULL = expr)という形の式はexpr IS NULLとして扱われます。つまり、exprの評価がNULL値の場合に真を、さもなくば偽を返します。expr = NULLのSQL仕様に基づいた正しい動作は常にNULL(未知)を返すことです。" -#: utils/misc/guc.c:1601 +#: utils/misc/guc.c:1734 msgid "Enables per-database user names." msgstr "データベース毎のユーザ名を許可します。" -#: utils/misc/guc.c:1610 +#: utils/misc/guc.c:1743 msgid "Sets the default read-only status of new transactions." msgstr "新しいトランザクションのリードオンリー設定のデフォルト値を設定。" -#: utils/misc/guc.c:1619 +#: utils/misc/guc.c:1753 msgid "Sets the current transaction's read-only status." msgstr "現在のトランザクションのリードオンリー設定を設定。" -#: utils/misc/guc.c:1629 +#: utils/misc/guc.c:1763 msgid "Sets the default deferrable status of new transactions." msgstr "新しいトランザクションの遅延可否設定のデフォルト値を設定。" -#: utils/misc/guc.c:1638 +#: utils/misc/guc.c:1772 msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." msgstr "リードオンリーのシリアライズ可能なトランザクションを、シリアライズに失敗することなく実行できるまで遅延させるかどうか" -#: utils/misc/guc.c:1648 +#: utils/misc/guc.c:1782 msgid "Enable row security." msgstr "行セキュリティを有効にします。" -#: utils/misc/guc.c:1649 +#: utils/misc/guc.c:1783 msgid "When enabled, row security will be applied to all users." msgstr "有効にすると、行セキュリティが全てのユーザに適用されます。" -#: utils/misc/guc.c:1657 -msgid "Check function bodies during CREATE FUNCTION." -msgstr "CREATE FUNCTION中に関数本体を検査します。" +#: utils/misc/guc.c:1791 +msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." +msgstr "CREATE FUNCTIONおよびCREATE PROCEDUREにおいて関数本体を検査します。" -#: utils/misc/guc.c:1666 +#: utils/misc/guc.c:1800 msgid "Enable input of NULL elements in arrays." msgstr "配列内のNULL要素入力を有効化。" -#: utils/misc/guc.c:1667 +#: utils/misc/guc.c:1801 msgid "When turned on, unquoted NULL in an array input value means a null value; otherwise it is taken literally." msgstr "有効にすると、配列入力値における引用符のないNULLはNULL値を意味するようになります。さもなくば文字通りに解釈されます。" -#: utils/misc/guc.c:1683 +#: utils/misc/guc.c:1817 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS は今後サポートされません; false のみに設定可能です。" -#: utils/misc/guc.c:1693 +#: utils/misc/guc.c:1827 msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "標準エラー出力、CSVログ、またはその両方をログファイルに捕捉するための子プロセスを開始します。" -#: utils/misc/guc.c:1702 +#: utils/misc/guc.c:1836 msgid "Truncate existing log files of same name during log rotation." msgstr "ログローテーション時に既存の同一名称のログファイルを切り詰めます。" -#: utils/misc/guc.c:1713 +#: utils/misc/guc.c:1847 msgid "Emit information about resource usage in sorting." msgstr "ソート中にリソース使用状況に関する情報を発行します。" -#: utils/misc/guc.c:1727 +#: utils/misc/guc.c:1861 msgid "Generate debugging output for synchronized scanning." msgstr "同期スキャン処理のデバッグ出力を生成します。" -#: utils/misc/guc.c:1742 +#: utils/misc/guc.c:1876 msgid "Enable bounded sorting using heap sort." msgstr "ヒープソートを使用した境界のソート処理を有効にします" -#: utils/misc/guc.c:1755 +#: utils/misc/guc.c:1889 msgid "Emit WAL-related debugging output." msgstr "WAL関連のデバッグ出力を出力します。" -#: utils/misc/guc.c:1767 -msgid "Datetimes are integer based." -msgstr "日付時刻は整数ベースです。" +#: utils/misc/guc.c:1901 +msgid "Shows whether datetimes are integer based." +msgstr "日付時刻が整数ベースかどうかを表示します。" -#: utils/misc/guc.c:1778 +#: utils/misc/guc.c:1912 msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgstr "KerberosおよびGSSAPIユーザ名を大文字小文字を区別して扱うかどうかを設定します。" -#: utils/misc/guc.c:1788 +#: utils/misc/guc.c:1922 msgid "Warn about backslash escapes in ordinary string literals." msgstr "普通の文字列リテラル内のバックスラッシュエスケープを警告します。" -#: utils/misc/guc.c:1798 +#: utils/misc/guc.c:1932 msgid "Causes '...' strings to treat backslashes literally." msgstr "'...' 文字列はバックスラッシュをそのまま扱います。" -#: utils/misc/guc.c:1809 +#: utils/misc/guc.c:1943 msgid "Enable synchronized sequential scans." msgstr "同期シーケンシャルスキャンを有効にします。" -#: utils/misc/guc.c:1819 +#: utils/misc/guc.c:1953 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "リカバリ目標のトランザクションを含めるか除外するかを設定。" -#: utils/misc/guc.c:1829 +#: utils/misc/guc.c:1963 msgid "Allows connections and queries during recovery." msgstr "リカバリ中でも接続と問い合わせを受け付けます" -#: utils/misc/guc.c:1839 +#: utils/misc/guc.c:1973 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "問い合わせの衝突を避けるためのホットスタンバイからプライマリへのフィードバックを受け付けます" -#: utils/misc/guc.c:1849 +#: utils/misc/guc.c:1983 +msgid "Shows whether hot standby is currently active." +msgstr "現在ホットスタンバイが有効であるかどうかを示します。" + +#: utils/misc/guc.c:1994 msgid "Allows modifications of the structure of system tables." msgstr "システムテーブル構造の変更を許可。" -#: utils/misc/guc.c:1860 +#: utils/misc/guc.c:2005 msgid "Disables reading from system indexes." msgstr "システムインデックスの読み取りを無効にします。" -#: utils/misc/guc.c:1861 +#: utils/misc/guc.c:2006 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "これはインデックスの更新は妨げないため使用しても安全です。最も大きな悪影響は低速化です。" -#: utils/misc/guc.c:1872 +#: utils/misc/guc.c:2017 +msgid "Allows tablespaces directly inside pg_tblspc, for testing." +msgstr "テーブルスペースのディレクトリをpg_tblspcの中に作ることを許可します、テスト用。" + +#: utils/misc/guc.c:2028 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "ラージオブジェクトで権限チェックを行う際、後方互換性モードを有効にします。" -#: utils/misc/guc.c:1873 +#: utils/misc/guc.c:2029 msgid "Skips privilege checks when reading or modifying large objects, for compatibility with PostgreSQL releases prior to 9.0." msgstr "9.0 より前のPostgreSQLとの互換のため、ラージオブジェクトを読んだり変更したりする際に権限チェックをスキップする。" -#: utils/misc/guc.c:1883 -msgid "Emit a warning for constructs that changed meaning since PostgreSQL 9.4." -msgstr "PostgreSQL 9.4以降意味が変わっている構文に対して警告を出します。" - -#: utils/misc/guc.c:1893 +#: utils/misc/guc.c:2039 msgid "When generating SQL fragments, quote all identifiers." msgstr "SQL文を生成する時に、すべての識別子を引用符で囲みます。" -#: utils/misc/guc.c:1903 +#: utils/misc/guc.c:2049 msgid "Shows whether data checksums are turned on for this cluster." msgstr "データチェックサムがこのクラスタで有効になっているかどうかを表示します。" -#: utils/misc/guc.c:1914 +#: utils/misc/guc.c:2060 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "シーケンス番号を付加することでsyslogメッセージの重複を防ぎます。" -#: utils/misc/guc.c:1924 +#: utils/misc/guc.c:2070 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "syslogに送出するメッセージを行単位で分割して、1024バイトに収まるようにします。" -#: utils/misc/guc.c:1934 +#: utils/misc/guc.c:2080 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "Gather および Gather Merge でも下位プランを実行するかどうかを制御します。" -#: utils/misc/guc.c:1935 -msgid "Should gather nodes also run subplans, or just gather tuples?" -msgstr "Gather ノードでも下位プランを実行しますか、もしくはただタプルの収集のみを行いますか?" +#: utils/misc/guc.c:2081 +msgid "Should gather nodes also run subplans or just gather tuples?" +msgstr "Gather ノードでも下位プランを実行するのか、もしくはただタプルの収集のみを行うのか?" -#: utils/misc/guc.c:1945 +#: utils/misc/guc.c:2091 msgid "Allow JIT compilation." msgstr "JITコンパイルを許可します。" -#: utils/misc/guc.c:1956 -msgid "Register JIT compiled function with debugger." +#: utils/misc/guc.c:2102 +msgid "Register JIT-compiled functions with debugger." msgstr "JITコンパイルされた関数をデバッガに登録します。" -#: utils/misc/guc.c:1973 +#: utils/misc/guc.c:2119 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "LLVMビットコードを出力して、JITデバッグを容易にします。" -#: utils/misc/guc.c:1984 +#: utils/misc/guc.c:2130 msgid "Allow JIT compilation of expressions." msgstr "式のJITコンパイルを許可します。" -#: utils/misc/guc.c:1995 -msgid "Register JIT compiled function with perf profiler." +#: utils/misc/guc.c:2141 +msgid "Register JIT-compiled functions with perf profiler." msgstr "perfプロファイラにJITコンパイルされた関数を登録します。" -#: utils/misc/guc.c:2012 +#: utils/misc/guc.c:2158 msgid "Allow JIT compilation of tuple deforming." msgstr "タプル分解処理のJITコンパイルを許可します。" -#: utils/misc/guc.c:2023 +#: utils/misc/guc.c:2169 msgid "Whether to continue running after a failure to sync data files." msgstr "データファイルの同期失敗の後に処理を継続するかどうか。" -#: utils/misc/guc.c:2032 +#: utils/misc/guc.c:2178 msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." msgstr "永続レプリケーションスロットがない場合にWALレシーバが一時スロットを作成するかどうかを設定します。" -#: utils/misc/guc.c:2050 -msgid "Forces a switch to the next WAL file if a new file has not been started within N seconds." -msgstr "N秒以内に新しいファイルが始まらない場合には、次のWALファイルへの切り替えを強制します。" +#: utils/misc/guc.c:2196 +msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." +msgstr "次のWALへの強制切り替え時間を設定します。" -#: utils/misc/guc.c:2061 -msgid "Waits N seconds on connection startup after authentication." -msgstr "認証後、接続開始までN秒待機します。" +#: utils/misc/guc.c:2207 +msgid "Sets the amount of time to wait after authentication on connection startup." +msgstr "接続開始時の認証後の待ち時間を設定します。" -#: utils/misc/guc.c:2062 utils/misc/guc.c:2631 +#: utils/misc/guc.c:2209 utils/misc/guc.c:2830 msgid "This allows attaching a debugger to the process." msgstr "これによりデバッガがプロセスに接続できます。" -#: utils/misc/guc.c:2071 +#: utils/misc/guc.c:2218 msgid "Sets the default statistics target." msgstr "デフォルトの統計情報収集目標を設定。" -#: utils/misc/guc.c:2072 +#: utils/misc/guc.c:2219 msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." msgstr "ALTER TABLE SET STATISTICS経由で列固有の目標値を持たないテーブル列についての統計情報収集目標を設定します。" -#: utils/misc/guc.c:2081 +#: utils/misc/guc.c:2228 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "副問い合わせを展開する上限のFROMリストのサイズを設定。" -#: utils/misc/guc.c:2083 +#: utils/misc/guc.c:2230 msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." msgstr "最終的なFROMリストがこの値より多くの要素を持たない時に、プランナは副問い合わせを上位問い合わせにマージします。" -#: utils/misc/guc.c:2094 +#: utils/misc/guc.c:2241 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "JOIN式を平坦化する上限のFROMリストのサイズを設定。" -#: utils/misc/guc.c:2096 +#: utils/misc/guc.c:2243 msgid "The planner will flatten explicit JOIN constructs into lists of FROM items whenever a list of no more than this many items would result." msgstr "最終的にFROMリストの項目数がこの値を超えない時には常に、プランナは明示的なJOIN構文をFROM項目のリストに組み込みます。" -#: utils/misc/guc.c:2107 +#: utils/misc/guc.c:2254 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "この数を超えるとGEQOを使用するFROM項目数の閾値を設定。" -#: utils/misc/guc.c:2117 +#: utils/misc/guc.c:2264 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: effortは他のGEQOパラメータのデフォルトを設定するために使用されます。" -#: utils/misc/guc.c:2127 +#: utils/misc/guc.c:2274 msgid "GEQO: number of individuals in the population." msgstr "GEQO: 集団内の個体数。" -#: utils/misc/guc.c:2128 utils/misc/guc.c:2138 +#: utils/misc/guc.c:2275 utils/misc/guc.c:2285 msgid "Zero selects a suitable default value." msgstr "0は適切なデフォルト値を選択します。" -#: utils/misc/guc.c:2137 +#: utils/misc/guc.c:2284 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: アルゴリズムの反復回数です。" -#: utils/misc/guc.c:2149 +#: utils/misc/guc.c:2296 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "デッドロック状態があるかどうかを調べる前にロックを待つ時間を設定。" -#: utils/misc/guc.c:2160 +#: utils/misc/guc.c:2307 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "ホットスタンバイサーバがアーカイブされた WAL データを処理している場合は、問い合わせをキャンセルする前に遅延秒数の最大値を設定。" -#: utils/misc/guc.c:2171 +#: utils/misc/guc.c:2318 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "ホットスタンバイサーバがストリームの WAL データを処理している場合は、問い合わせをキャンセルする前に遅延秒数の最大値を設定。" -#: utils/misc/guc.c:2182 +#: utils/misc/guc.c:2329 msgid "Sets the minimum delay for applying changes during recovery." msgstr "リカバリ中の変更の適用の最小遅延時間を設定します。" -#: utils/misc/guc.c:2193 +#: utils/misc/guc.c:2340 msgid "Sets the maximum interval between WAL receiver status reports to the sending server." msgstr "WAL受信プロセスが送出側サーバへ行う状況報告の最大間隔を設定。" -#: utils/misc/guc.c:2204 +#: utils/misc/guc.c:2351 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "送出側サーバからのデータ受信を待機する最長時間を設定。" -#: utils/misc/guc.c:2215 +#: utils/misc/guc.c:2362 msgid "Sets the maximum number of concurrent connections." msgstr "同時接続数の最大値を設定。" -#: utils/misc/guc.c:2226 +#: utils/misc/guc.c:2373 msgid "Sets the number of connection slots reserved for superusers." msgstr "スーパユーザによる接続用に予約される接続スロットの数を設定。" -#: utils/misc/guc.c:2236 +#: utils/misc/guc.c:2383 msgid "Amount of dynamic shared memory reserved at startup." msgstr "起動時に予約される動的共有メモリの量。" -#: utils/misc/guc.c:2251 +#: utils/misc/guc.c:2398 msgid "Sets the number of shared memory buffers used by the server." msgstr "サーバで使用される共有メモリのバッファ数を設定。" -#: utils/misc/guc.c:2262 +#: utils/misc/guc.c:2409 +msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." +msgstr "サーバーの主共有メモリ領域のサイズを表示します(MB単位に切り上げられます)" + +#: utils/misc/guc.c:2420 +msgid "Shows the number of huge pages needed for the main shared memory area." +msgstr "主共有メモリ領域に必要となるヒュージページの数を表示します。" + +#: utils/misc/guc.c:2421 +msgid "-1 indicates that the value could not be determined." +msgstr "-1はこの値が確定できなかったことを示します。" + +#: utils/misc/guc.c:2431 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "各セッションで使用される一時バッファの最大数を設定。" -#: utils/misc/guc.c:2273 +#: utils/misc/guc.c:2442 msgid "Sets the TCP port the server listens on." msgstr "サーバが接続を監視するTCPポートを設定。" -#: utils/misc/guc.c:2283 +#: utils/misc/guc.c:2452 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Unixドメインソケットのアクセス権限を設定。" -#: utils/misc/guc.c:2284 +#: utils/misc/guc.c:2453 msgid "Unix-domain sockets use the usual Unix file system permission set. The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Unixドメインソケットは、通常のUnixファイルシステム権限の設定を使います。 このパラメータ値は chmod と umask システムコールが受け付ける数値のモード指定を想定しています(慣習的な8進数書式を使うためには、0(ゼロ)で始めなくてはなりません)。 " -#: utils/misc/guc.c:2298 +#: utils/misc/guc.c:2467 msgid "Sets the file permissions for log files." msgstr "ログファイルのパーミッションを設定。" -#: utils/misc/guc.c:2299 +#: utils/misc/guc.c:2468 msgid "The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "このパタメータ値は chmod や umask システムコールで使えるような数値モード指定であることが想定されます(慣習的な記法である8進数書式を使う場合は先頭に0(ゼロ) をつけてください)。 " -#: utils/misc/guc.c:2313 -msgid "Mode of the data directory." -msgstr "データディレクトリのパーミッション値。" +#: utils/misc/guc.c:2482 +msgid "Shows the mode of the data directory." +msgstr "データディレクトリのモードを表示します。" -#: utils/misc/guc.c:2314 +#: utils/misc/guc.c:2483 msgid "The parameter value is a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "このパタメータ値は chmod や umask システムコールが受け付ける数値形式のモード指定です(慣習的な8進形式を使う場合は先頭に0(ゼロ) をつけてください)。 " -#: utils/misc/guc.c:2327 +#: utils/misc/guc.c:2496 msgid "Sets the maximum memory to be used for query workspaces." msgstr "問い合わせの作業用空間として使用されるメモリの最大値を設定。" -#: utils/misc/guc.c:2328 +#: utils/misc/guc.c:2497 msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." msgstr "内部ソート操作とハッシュテーブルで使われるメモリの量がこの量に達した時に一時ディスクファイルへの切替えを行います。" -#: utils/misc/guc.c:2340 +#: utils/misc/guc.c:2509 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "保守作業で使用される最大メモリ量を設定。" -#: utils/misc/guc.c:2341 +#: utils/misc/guc.c:2510 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "VACUUMやCREATE INDEXなどの作業が含まれます。" -#: utils/misc/guc.c:2351 +#: utils/misc/guc.c:2520 msgid "Sets the maximum memory to be used for logical decoding." msgstr "論理デコーディングで使用するメモリ量の上限を設定します。" -#: utils/misc/guc.c:2352 +#: utils/misc/guc.c:2521 msgid "This much memory can be used by each internal reorder buffer before spilling to disk." msgstr "個々の内部リオーダバッファはディスクに書き出す前にこれだけの量のメモリを使用することができます。" -#: utils/misc/guc.c:2368 +#: utils/misc/guc.c:2537 msgid "Sets the maximum stack depth, in kilobytes." msgstr "スタック長の最大値をキロバイト単位で設定。" -#: utils/misc/guc.c:2379 +#: utils/misc/guc.c:2548 msgid "Limits the total size of all temporary files used by each process." msgstr "各プロセスで使用される全ての一時ファイルの合計サイズを制限します。" -#: utils/misc/guc.c:2380 +#: utils/misc/guc.c:2549 msgid "-1 means no limit." msgstr "-1は無制限を意味します。" -#: utils/misc/guc.c:2390 +#: utils/misc/guc.c:2559 msgid "Vacuum cost for a page found in the buffer cache." msgstr "バッファキャッシュにある1つのページをVACUUM処理する際のコスト。" -#: utils/misc/guc.c:2400 +#: utils/misc/guc.c:2569 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "バッファキャッシュにない1つのページをVACUUM処理する際のコスト。" -#: utils/misc/guc.c:2410 +#: utils/misc/guc.c:2579 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "VACUUM処理が1つのページをダーティにした際に課すコスト。" -#: utils/misc/guc.c:2420 +#: utils/misc/guc.c:2589 msgid "Vacuum cost amount available before napping." msgstr "VACUUM処理を一時休止させるまでに使用できるコスト。" -#: utils/misc/guc.c:2430 +#: utils/misc/guc.c:2599 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "自動VACUUM用のVACUUM処理を一時休止させるまでに使用できるコスト。" -#: utils/misc/guc.c:2440 +#: utils/misc/guc.c:2609 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "各サーバプロセスで同時にオープンできるファイルの最大数を設定。" -#: utils/misc/guc.c:2453 +#: utils/misc/guc.c:2622 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "同時に準備状態にできるトランザクションの最大数を設定。" -#: utils/misc/guc.c:2464 +#: utils/misc/guc.c:2633 msgid "Sets the minimum OID of tables for tracking locks." msgstr "ロックの追跡を行うテーブルの最小のOIDを設定。" -#: utils/misc/guc.c:2465 +#: utils/misc/guc.c:2634 msgid "Is used to avoid output on system tables." msgstr "システムテーブルに関するの出力を避けるために使います。" -#: utils/misc/guc.c:2474 +#: utils/misc/guc.c:2643 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "無条件でロックの追跡を行うテーブルのOIDを設定。" -#: utils/misc/guc.c:2486 +#: utils/misc/guc.c:2655 msgid "Sets the maximum allowed duration of any statement." msgstr "あらゆる文に対して実行時間として許容する上限値を設定。" -#: utils/misc/guc.c:2487 utils/misc/guc.c:2498 utils/misc/guc.c:2509 +#: utils/misc/guc.c:2656 utils/misc/guc.c:2667 utils/misc/guc.c:2678 utils/misc/guc.c:2689 msgid "A value of 0 turns off the timeout." msgstr "0でこのタイムアウトは無効になります。 " -#: utils/misc/guc.c:2497 +#: utils/misc/guc.c:2666 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "ロックの待機の最大許容時間を設定。" -#: utils/misc/guc.c:2508 -msgid "Sets the maximum allowed duration of any idling transaction." -msgstr "あらゆるアイドル状態のトランザクションの持続時間として許容する上限値を設定。" +#: utils/misc/guc.c:2677 +msgid "Sets the maximum allowed idle time between queries, when in a transaction." +msgstr "問い合わせ間のアイドル時間のトランザクション内における最大許容値を設定。" + +#: utils/misc/guc.c:2688 +msgid "Sets the maximum allowed idle time between queries, when not in a transaction." +msgstr "問い合わせ間のアイドル時間のトランザクション外における最大許容値を設定。" -#: utils/misc/guc.c:2519 +#: utils/misc/guc.c:2699 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "VACUUM にテーブル行の凍結をさせる最小のトランザクションID差分。" -#: utils/misc/guc.c:2529 +#: utils/misc/guc.c:2709 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "行の凍結のためのテーブル全体スキャンを強制させる時のトランザクションID差分。" -#: utils/misc/guc.c:2539 +#: utils/misc/guc.c:2719 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "テーブル行でのマルチトランザクションIDの凍結を強制する最小のマルチトランザクション差分。" -#: utils/misc/guc.c:2549 +#: utils/misc/guc.c:2729 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "行の凍結のためにテーブル全体スキャンを強制する時点のマルチトランザクション差分。" -#: utils/misc/guc.c:2559 +#: utils/misc/guc.c:2739 msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." msgstr "設定していれば、VACUUMやHOTのクリーンアップを遅延させるトランザクション数。" -#: utils/misc/guc.c:2572 +#: utils/misc/guc.c:2748 +msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "VACUUMにおいて周回による停止を回避するためのフェイルセーフを実行されるまでの経過トランザクション数。" + +#: utils/misc/guc.c:2757 +msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "VACUUMにおいて周回による停止を回避するためのフェイルセーフが実行されるまでの経過マルチトランザクション数。" + +#: utils/misc/guc.c:2770 msgid "Sets the maximum number of locks per transaction." msgstr "1トランザクション当たりのロック数の上限を設定。" -#: utils/misc/guc.c:2573 +#: utils/misc/guc.c:2771 msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." msgstr "共有ロックテーブルの大きさは、最大max_locks_per_transaction * max_connections個の個別のオブジェクトがいかなる時点でもロックされる必要があるという仮定の下に決定されます。" -#: utils/misc/guc.c:2584 +#: utils/misc/guc.c:2782 msgid "Sets the maximum number of predicate locks per transaction." msgstr "1トランザクション当たりの述語ロック数の上限を設定。" -#: utils/misc/guc.c:2585 +#: utils/misc/guc.c:2783 msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." msgstr "共有ロックテーブルの大きさは、最大 max_pred_locks_per_transaction * max_connections 個の個別のオブジェクトがいかなる時点でもロックされる必要があるという仮定の下に決められます。" -#: utils/misc/guc.c:2596 +#: utils/misc/guc.c:2794 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "1リレーション当たりで述語ロックされるページとタプルの数の上限値を設定。" -#: utils/misc/guc.c:2597 +#: utils/misc/guc.c:2795 msgid "If more than this total of pages and tuples in the same relation are locked by a connection, those locks are replaced by a relation-level lock." msgstr "あるコネクションで、同じリレーション内でロックされるページ数とタプル数の合計がこの値を超えたときには、これらのロックはリレーションレベルのロックに置き換えられます。" -#: utils/misc/guc.c:2607 +#: utils/misc/guc.c:2805 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "1ページあたりで述語ロックされるタプル数の上限値を設定。" -#: utils/misc/guc.c:2608 +#: utils/misc/guc.c:2806 msgid "If more than this number of tuples on the same page are locked by a connection, those locks are replaced by a page-level lock." msgstr "あるコネクションで 、同じページ上でロックされるタプルの数がこの値を超えたときには、これらのロックはページレベルのロックに置き換えられます。" -#: utils/misc/guc.c:2618 +#: utils/misc/guc.c:2816 msgid "Sets the maximum allowed time to complete client authentication." msgstr "クライアント認証の完了までの最大許容時間を設定。" -#: utils/misc/guc.c:2630 -msgid "Waits N seconds on connection startup before authentication." -msgstr "接続開始の際、認証前にN秒待機します。" +#: utils/misc/guc.c:2828 +msgid "Sets the amount of time to wait before authentication on connection startup." +msgstr "接続開始時の認証前の待ち時間を設定します。" + +#: utils/misc/guc.c:2840 +msgid "Maximum buffer size for reading ahead in the WAL during recovery." +msgstr "リカバリ中のWAL先読みバッファの最大サイズ。" + +#: utils/misc/guc.c:2841 +msgid "This controls the maximum distance we can read ahead in the WAL to prefetch referenced blocks." +msgstr "参照ブロックを先行読み込みするためにWALをどれだけ先まで先読みするかを制御します。" -#: utils/misc/guc.c:2641 +#: utils/misc/guc.c:2851 msgid "Sets the size of WAL files held for standby servers." msgstr "スタンバイサーバのために確保するWALの量を設定します。" -#: utils/misc/guc.c:2652 +#: utils/misc/guc.c:2862 msgid "Sets the minimum size to shrink the WAL to." msgstr "WALを縮小させる際の最小のサイズを設定。" -#: utils/misc/guc.c:2664 +#: utils/misc/guc.c:2874 msgid "Sets the WAL size that triggers a checkpoint." msgstr "チェックポイントの契機となるWALのサイズを指定。" -#: utils/misc/guc.c:2676 +#: utils/misc/guc.c:2886 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "自動WALチェックポイントの最大間隔を設定。" -#: utils/misc/guc.c:2687 -msgid "Enables warnings if checkpoint segments are filled more frequently than this." -msgstr "チェックポイントセグメントがこの値よりも短い時間で使い切られた時に警告します。" +#: utils/misc/guc.c:2897 +msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." +msgstr "WALの量契機のチェックポイントが高頻度で起きる場合に、警告を発するまでの回数を設定。" -#: utils/misc/guc.c:2689 -msgid "Write a message to the server log if checkpoints caused by the filling of checkpoint segment files happens more frequently than this number of seconds. Zero turns off the warning." -msgstr "チェックポイントセグメントファイルを使い切ることが原因で起きるチェックポイントが、ここで指定した秒数よりも頻繁に発生する場合、サーバログにメッセージを書き出します。 デフォルトは30秒です。 ゼロはこの警告を無効にします。 " +#: utils/misc/guc.c:2899 +msgid "Write a message to the server log if checkpoints caused by the filling of WAL segment files happen more frequently than this amount of time. Zero turns off the warning." +msgstr "チェックポイントセグメントファイルを使い切ることが原因で起きるチェックポイントがこの時間間隔よりも頻繁に発生する場合、サーバログにメッセージを書き出します。ゼロはこの警告を無効にします。 " -#: utils/misc/guc.c:2701 utils/misc/guc.c:2917 utils/misc/guc.c:2964 +#: utils/misc/guc.c:2912 utils/misc/guc.c:3130 utils/misc/guc.c:3178 msgid "Number of pages after which previously performed writes are flushed to disk." msgstr "すでに実行された書き込みがディスクに書き出されるまでのページ数。" -#: utils/misc/guc.c:2712 +#: utils/misc/guc.c:2923 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "共有メモリ内に割り当てられた、WALデータ用のディスクページバッファ数を設定。" -#: utils/misc/guc.c:2723 +#: utils/misc/guc.c:2934 msgid "Time between WAL flushes performed in the WAL writer." msgstr "WALライタで実行する書き出しの時間間隔。" -#: utils/misc/guc.c:2734 +#: utils/misc/guc.c:2945 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "書き出しが実行されるまでにWALライタで出力するWALの量。" -#: utils/misc/guc.c:2745 -msgid "Size of new file to fsync instead of writing WAL." -msgstr "新しいファイルでWALを出力する代わりにfsyncするサイズ。" +#: utils/misc/guc.c:2956 +msgid "Minimum size of new file to fsync instead of writing WAL." +msgstr "WALを出力する代わりにfsyncを使用する新規ファイルの最小サイズ。" -#: utils/misc/guc.c:2756 +#: utils/misc/guc.c:2967 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "WAL送信プロセスの最大同時実行数を設定。" -#: utils/misc/guc.c:2767 +#: utils/misc/guc.c:2978 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "同時に定義できるレプリケーションスロットの数の最大値を設定。" -#: utils/misc/guc.c:2777 +#: utils/misc/guc.c:2988 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "レプリケーションスロットで確保できるWALの量の最大値を設定します。" -#: utils/misc/guc.c:2778 +#: utils/misc/guc.c:2989 msgid "Replication slots will be marked as failed, and segments released for deletion or recycling, if this much space is occupied by WAL on disk." msgstr "ディスク内のWALがこの量に達すると、レプリケーションスロットは停止とマークされ、セグメントは削除あるいは再利用のために解放されます。" -#: utils/misc/guc.c:2790 +#: utils/misc/guc.c:3001 msgid "Sets the maximum time to wait for WAL replication." msgstr "WALレプリケーションを待つ時間の最大値を設定。" -#: utils/misc/guc.c:2801 +#: utils/misc/guc.c:3012 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "トランザクションのコミットからWALのディスク書き出しまでの遅延時間をマイクロ秒単位で設定。" -#: utils/misc/guc.c:2813 -msgid "Sets the minimum concurrent open transactions before performing commit_delay." -msgstr "commit_delay の実行の契機となる、同時に開いているトランザクション数の最小値を設定。" +#: utils/misc/guc.c:3024 +msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." +msgstr "commit_delay の実行に必要となる、同時に開いているトランザクション数の最小値を設定。" -#: utils/misc/guc.c:2824 +#: utils/misc/guc.c:3035 msgid "Sets the number of digits displayed for floating-point values." msgstr "浮動小数点値の表示桁数を設定。" -#: utils/misc/guc.c:2825 +#: utils/misc/guc.c:3036 msgid "This affects real, double precision, and geometric data types. A zero or negative parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate). Any value greater than zero selects precise output mode." msgstr "このパラメータは、real、double precision、幾何データ型に影響します。ゼロまたは負のパラメータ値は標準的な桁数(FLT_DIG もしくは DBL_DIGどちらか適切な方)に追加されます。正の値は直接出力形式を指定します。" -#: utils/misc/guc.c:2837 +#: utils/misc/guc.c:3048 msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." msgstr "文がログに出力される最小の実行時間を設定します。サンプリングについてはlog_statement_sample_rateで決定されます。" -#: utils/misc/guc.c:2840 -msgid "Zero log a sample of all queries. -1 turns this feature off." -msgstr "ゼロにすると全ての問い合わせからサンプリングして記録します。-1はこの機能を無効にします。" +#: utils/misc/guc.c:3051 +msgid "Zero logs a sample of all queries. -1 turns this feature off." +msgstr "ゼロにすると全ての問い合わせを記録します。-1はこの機能を無効にします。" -#: utils/misc/guc.c:2850 +#: utils/misc/guc.c:3061 msgid "Sets the minimum execution time above which all statements will be logged." msgstr "全ての文のログを記録する最小の実行時間を設定。" -#: utils/misc/guc.c:2852 +#: utils/misc/guc.c:3063 msgid "Zero prints all queries. -1 turns this feature off." msgstr "ゼロにすると全ての問い合わせを出力します。-1はこの機能を無効にします。" -#: utils/misc/guc.c:2862 +#: utils/misc/guc.c:3073 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "自動VACUUMの活動のログを記録する最小の実行時間を設定。" -#: utils/misc/guc.c:2864 +#: utils/misc/guc.c:3075 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "ゼロはすべての活動を出力します。-1は自動VACUUMのログ記録を無効にします。" -#: utils/misc/guc.c:2874 -msgid "When logging statements, limit logged parameter values to first N bytes." -msgstr "ステートメントをログに出力する際に、記録するパラメータの値を最初のNバイトに制限します。" +#: utils/misc/guc.c:3085 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." +msgstr "問い合わせ文をログ出力する際に、出力するbindパラメータ値データの最大バイト数を設定。" -#: utils/misc/guc.c:2875 utils/misc/guc.c:2886 +#: utils/misc/guc.c:3087 utils/misc/guc.c:3099 msgid "-1 to print values in full." msgstr "-1 で値を全て出力します。" -#: utils/misc/guc.c:2885 -msgid "When reporting an error, limit logged parameter values to first N bytes." -msgstr "エラー報告の際に、記録するパラメータの値を最初のNバイトに制限します。" +#: utils/misc/guc.c:3097 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." +msgstr "エラー時の問い合わせ文をログ出力する際に、出力するbindパラメータ値データの最大バイト数を設定。" -#: utils/misc/guc.c:2896 +#: utils/misc/guc.c:3109 msgid "Background writer sleep time between rounds." msgstr "バックグランドライタの周期毎の待機時間" -#: utils/misc/guc.c:2907 +#: utils/misc/guc.c:3120 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "バックグランドライタが1周期で書き出すLRUページ数の最大値。" -#: utils/misc/guc.c:2930 +#: utils/misc/guc.c:3143 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "ディスクサブシステムが効率的に処理可能な同時並行リクエスト数" -#: utils/misc/guc.c:2931 -msgid "For RAID arrays, this should be approximately the number of drive spindles in the array." -msgstr "RAIDアレイでは、これはおおむねアレイ中のドライブのスピンドル数になります。" - -#: utils/misc/guc.c:2948 +#: utils/misc/guc.c:3161 msgid "A variant of effective_io_concurrency that is used for maintenance work." msgstr " effective_io_concurrency の保守作業に使用される変種。" -#: utils/misc/guc.c:2977 +#: utils/misc/guc.c:3191 msgid "Maximum number of concurrent worker processes." msgstr "同時に実行されるワーカプロセス数の最大値です。" -#: utils/misc/guc.c:2989 +#: utils/misc/guc.c:3203 msgid "Maximum number of logical replication worker processes." msgstr "レプリケーションワーカプロセス数の最大値です。" -#: utils/misc/guc.c:3001 +#: utils/misc/guc.c:3215 msgid "Maximum number of table synchronization workers per subscription." msgstr "サブスクリプション毎のテーブル同期ワーカ数の最大値です。" -#: utils/misc/guc.c:3011 -msgid "Automatic log file rotation will occur after N minutes." -msgstr "ログファイルの自動ローテーションはN秒経過の際に行われます。" +#: utils/misc/guc.c:3225 +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "ログファイルのローテーションを行う時間間隔を設定します。" -#: utils/misc/guc.c:3022 -msgid "Automatic log file rotation will occur after N kilobytes." -msgstr "ログファイルの自動ローテーションはNキロバイト書き込んだ際に行われます。" +#: utils/misc/guc.c:3237 +msgid "Sets the maximum size a log file can reach before being rotated." +msgstr "ローテートされるまでに許容するログファイルの最大サイズを設定します。" -#: utils/misc/guc.c:3033 +#: utils/misc/guc.c:3249 msgid "Shows the maximum number of function arguments." msgstr "関数の引数の最大数を示します。" -#: utils/misc/guc.c:3044 +#: utils/misc/guc.c:3260 msgid "Shows the maximum number of index keys." msgstr "インデックスキーの最大数を示します。" -#: utils/misc/guc.c:3055 +#: utils/misc/guc.c:3271 msgid "Shows the maximum identifier length." msgstr "識別子の最大長を示します。" -#: utils/misc/guc.c:3066 +#: utils/misc/guc.c:3282 msgid "Shows the size of a disk block." msgstr "ディスクブロックサイズを示します。" -#: utils/misc/guc.c:3077 +#: utils/misc/guc.c:3293 msgid "Shows the number of pages per disk file." msgstr "ディスクファイルごとのページ数を表示します。" -#: utils/misc/guc.c:3088 +#: utils/misc/guc.c:3304 msgid "Shows the block size in the write ahead log." msgstr "先行書き込みログ(WAL)におけるブロックサイズを表示します" -#: utils/misc/guc.c:3099 +#: utils/misc/guc.c:3315 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "WALの取り出しの失敗後に再試行する回数を設定。" -#: utils/misc/guc.c:3111 +#: utils/misc/guc.c:3327 msgid "Shows the size of write ahead log segments." msgstr "先行書き込みログ(WAL)セグメントのサイズを表示します" -#: utils/misc/guc.c:3124 +#: utils/misc/guc.c:3340 msgid "Time to sleep between autovacuum runs." msgstr "自動VACUUMの実行開始間隔。" -#: utils/misc/guc.c:3134 +#: utils/misc/guc.c:3350 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "VACUUMを行うまでの、タプルを更新または削除した回数の最小値。" -#: utils/misc/guc.c:3143 -msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums" -msgstr "VACUUMが実行されるまでの、タプル挿入回数の最小値、または-1で挿入VACUUMを無効化します" +#: utils/misc/guc.c:3359 +msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." +msgstr "VACUUMが行われるまでの行挿入の回数の最小値、-1で挿入契機のVACUUMを無効化します。" -#: utils/misc/guc.c:3152 +#: utils/misc/guc.c:3368 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "ANALYZEが実行されるまでの、タプルを挿入、更新、削除した回数の最小値。" -#: utils/misc/guc.c:3162 +#: utils/misc/guc.c:3378 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "トランザクションID周回を防ぐためにテーブルを自動VACUUMする時点のトランザクションID差分。" -#: utils/misc/guc.c:3173 +#: utils/misc/guc.c:3390 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "マルチトランザクション周回を防止するためにテーブルを自動VACUUMする、マルチトランザクション差分。" -#: utils/misc/guc.c:3183 +#: utils/misc/guc.c:3400 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "自動VACUUMのワーカプロセスの最大同時実行数を設定。" -#: utils/misc/guc.c:3193 +#: utils/misc/guc.c:3410 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "ひとつの保守作業に割り当てる並列処理プロセスの数の最大値を設定。" -#: utils/misc/guc.c:3203 +#: utils/misc/guc.c:3420 msgid "Sets the maximum number of parallel processes per executor node." msgstr "エグゼキュータノードあたりの並列処理プロセスの数の最大値を設定。" -#: utils/misc/guc.c:3214 +#: utils/misc/guc.c:3431 msgid "Sets the maximum number of parallel workers that can be active at one time." msgstr "同時に活動可能な並列処理ワーカの数の最大値を設定。" -#: utils/misc/guc.c:3225 +#: utils/misc/guc.c:3442 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "自動VACUUMプロセスで使用するメモリ量の最大値を設定。" -#: utils/misc/guc.c:3236 +#: utils/misc/guc.c:3453 msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." msgstr "スナップショット取得後、更新されたページが読み取れなくなるまでの時間。" -#: utils/misc/guc.c:3237 +#: utils/misc/guc.c:3454 msgid "A value of -1 disables this feature." msgstr "-1でこの機能を無効にします。" -#: utils/misc/guc.c:3247 +#: utils/misc/guc.c:3464 msgid "Time between issuing TCP keepalives." msgstr "TCPキープアライブを発行する時間間隔。" -#: utils/misc/guc.c:3248 utils/misc/guc.c:3259 utils/misc/guc.c:3383 +#: utils/misc/guc.c:3465 utils/misc/guc.c:3476 utils/misc/guc.c:3600 msgid "A value of 0 uses the system default." msgstr "0でシステムのデフォルトを使用します。" -#: utils/misc/guc.c:3258 +#: utils/misc/guc.c:3475 msgid "Time between TCP keepalive retransmits." msgstr "TCPキープアライブの再送信の時間間隔。" -#: utils/misc/guc.c:3269 +#: utils/misc/guc.c:3486 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "SSLの再ネゴシエーションは今後サポートされません; 0のみに設定可能です。" -#: utils/misc/guc.c:3280 +#: utils/misc/guc.c:3497 msgid "Maximum number of TCP keepalive retransmits." msgstr "TCPキープアライブの再送信回数の最大値です。" -#: utils/misc/guc.c:3281 +#: utils/misc/guc.c:3498 msgid "This controls the number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." msgstr "これは、接続が失われると判断するまでに再送信される、ひとつづきのキープアライブの数を制御します。0の時はでシステムのデフォルトを使用します。" -#: utils/misc/guc.c:3292 +#: utils/misc/guc.c:3509 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "GINによる正確な検索に対して許容する結果数の最大値を設定。" -#: utils/misc/guc.c:3303 +#: utils/misc/guc.c:3520 msgid "Sets the planner's assumption about the total size of the data caches." -msgstr "プランナが想定するデータキャッシュサイズを設定。" +msgstr "プランナが想定するデータキャッシュ全体のサイズを設定。" -#: utils/misc/guc.c:3304 +#: utils/misc/guc.c:3521 msgid "That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." -msgstr "つまり、PostgreSQLのデータファイルで使用されるキャッシュ(カーネルおよび共有バッファ)の量です。これは通常8KBのディスクページを単位とします。" +msgstr "つまり、PostgreSQLのデータファイルに対して使用されるキャッシュ(カーネルキャッシュおよび共有バッファ)全体の量です。これは通常8KBのディスクページを単位とします。" -#: utils/misc/guc.c:3315 +#: utils/misc/guc.c:3532 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "並列スキャンを検討するテーブルデータの量の最小値を設定。" -#: utils/misc/guc.c:3316 +#: utils/misc/guc.c:3533 msgid "If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered." msgstr "この限度に到達できないような少ないテーブルページ数しか読み取らないとプランナが見積もった場合、並列スキャンは検討されません。" -#: utils/misc/guc.c:3326 +#: utils/misc/guc.c:3543 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "並列スキャンを検討するインデックスデータの量の最小値を設定。" -#: utils/misc/guc.c:3327 +#: utils/misc/guc.c:3544 msgid "If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered." msgstr "この限度に到達できないような少ないページ数しか読み取らないとプランナが見積もった場合、並列スキャンは検討されません。" -#: utils/misc/guc.c:3338 +#: utils/misc/guc.c:3555 msgid "Shows the server version as an integer." msgstr "サーバのバージョンを整数値で表示します。" -#: utils/misc/guc.c:3349 +#: utils/misc/guc.c:3566 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "このキロバイト数よりも大きな一時ファイルの使用をログに記録します。" -#: utils/misc/guc.c:3350 +#: utils/misc/guc.c:3567 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "ゼロにすると、全てのファイルを記録します。デフォルトは-1です(この機能を無効にします)。" -#: utils/misc/guc.c:3360 +#: utils/misc/guc.c:3577 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "pg_stat_activity.queryのために予約するサイズをバイト単位で設定。" -#: utils/misc/guc.c:3371 +#: utils/misc/guc.c:3588 msgid "Sets the maximum size of the pending list for GIN index." msgstr "GINインデックスの保留リストの最大サイズを設定。" -#: utils/misc/guc.c:3382 +#: utils/misc/guc.c:3599 msgid "TCP user timeout." msgstr "TCPユーザタイムアウト。" -#: utils/misc/guc.c:3393 +#: utils/misc/guc.c:3610 msgid "The size of huge page that should be requested." msgstr "要求が見込まれるヒュージページのサイズ。" -#: utils/misc/guc.c:3413 +#: utils/misc/guc.c:3621 +msgid "Aggressively flush system caches for debugging purposes." +msgstr "デバッグ目的のために積極的にシステムキャッシュを消去する。" + +#: utils/misc/guc.c:3644 +msgid "Sets the time interval between checks for disconnection while running queries." +msgstr "問い合わせ実行中に接続確認を行う時間間隔を設定します。" + +#: utils/misc/guc.c:3655 +msgid "Time between progress updates for long-running startup operations." +msgstr "起動処理が長引いた際のステータス更新の時間間隔。" + +#: utils/misc/guc.c:3657 +msgid "0 turns this feature off." +msgstr "ゼロにするとこの機能を無効にします。" + +#: utils/misc/guc.c:3676 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "ひと続きに読み込むディスクページについてプランナで使用する見積もりコストを設定。" -#: utils/misc/guc.c:3424 +#: utils/misc/guc.c:3687 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "ひと続きでは読み込めないディスクページについてプランナで使用する見積もりコストを設定。" -#: utils/misc/guc.c:3435 +#: utils/misc/guc.c:3698 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "一つのタプル(行)の処理についてプランナで使用する見積もりコストを設定。" -#: utils/misc/guc.c:3446 +#: utils/misc/guc.c:3709 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." msgstr "インデックススキャンにおける一つのインデックスエントリの処理についてプランナで使用する見積もりコストを設定。 " -#: utils/misc/guc.c:3457 +#: utils/misc/guc.c:3720 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "一つの演算子または関数の処理についてプランナで使用する見積もりコストを設定。" -#: utils/misc/guc.c:3468 +#: utils/misc/guc.c:3731 msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." msgstr "並列処理ワーカからリーダーバックエンドへの一つのタプル(行)の受け渡しについてプランナが使用する見積もりコストを設定。" -#: utils/misc/guc.c:3479 +#: utils/misc/guc.c:3742 msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." msgstr "並列問い合わせ実行のためのワーカプロセスの起動についてプランナで使用する見積もりコストを設定。" -#: utils/misc/guc.c:3491 +#: utils/misc/guc.c:3754 msgid "Perform JIT compilation if query is more expensive." msgstr "問い合わせがこの値より高コストであればJITコンパイルを実行します。" -#: utils/misc/guc.c:3492 +#: utils/misc/guc.c:3755 msgid "-1 disables JIT compilation." msgstr "-1 でJITコンパイルを禁止します。" -#: utils/misc/guc.c:3502 -msgid "Optimize JITed functions if query is more expensive." +#: utils/misc/guc.c:3765 +msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "問い合わせがこの値より高コストであればJITコンパイルされた関数を最適化します。" -#: utils/misc/guc.c:3503 +#: utils/misc/guc.c:3766 msgid "-1 disables optimization." msgstr "-1で最適化を行わなくなります。" -#: utils/misc/guc.c:3513 +#: utils/misc/guc.c:3776 msgid "Perform JIT inlining if query is more expensive." msgstr "問い合わせがこの値より高コストであればJITコンパイルされた関数をインライン化します。" -#: utils/misc/guc.c:3514 +#: utils/misc/guc.c:3777 msgid "-1 disables inlining." msgstr "-1 でインライン化を禁止します。" -#: utils/misc/guc.c:3524 +#: utils/misc/guc.c:3787 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgstr "カーソルから取り出される行数の全行に対する割合についてプランナで使用する値を設定。" -#: utils/misc/guc.c:3536 +#: utils/misc/guc.c:3799 +msgid "Sets the planner's estimate of the average size of a recursive query's working table." +msgstr "再帰問い合わせでプランナが使用する中間テーブルの平均見積もりサイズを設定します。" + +#: utils/misc/guc.c:3811 msgid "GEQO: selective pressure within the population." msgstr "GEQO: 集合内の選択圧力。" -#: utils/misc/guc.c:3547 +#: utils/misc/guc.c:3822 msgid "GEQO: seed for random path selection." msgstr "GEQO: ランダムパス選択用のシード" -#: utils/misc/guc.c:3558 +#: utils/misc/guc.c:3833 msgid "Multiple of work_mem to use for hash tables." msgstr "ハッシュテーブルで使用するwork_memの倍率。" -#: utils/misc/guc.c:3569 +#: utils/misc/guc.c:3844 msgid "Multiple of the average buffer usage to free per round." msgstr "周期ごとに解放するバッファ数の平均バッファ使用量に対する倍数" -#: utils/misc/guc.c:3579 +#: utils/misc/guc.c:3854 msgid "Sets the seed for random-number generation." msgstr "乱数生成用のシードを設定。" -#: utils/misc/guc.c:3590 +#: utils/misc/guc.c:3865 msgid "Vacuum cost delay in milliseconds." msgstr "ミリ秒単位のコストベースのVACUUM処理の遅延時間です。" -#: utils/misc/guc.c:3601 +#: utils/misc/guc.c:3876 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "自動VACUUM用のミリ秒単位のコストベースのVACUUM処理の遅延時間です。" -#: utils/misc/guc.c:3612 +#: utils/misc/guc.c:3887 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "VACUUMが実行されるまでのタプルの更新または削除回数のreltuplesに対する割合。" -#: utils/misc/guc.c:3622 +#: utils/misc/guc.c:3897 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "VACUUMが実行されるまでのタプルの挿入行数のreltuplesに対する割合。" -#: utils/misc/guc.c:3632 +#: utils/misc/guc.c:3907 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "ANALYZEが実行されるまでのタプルの更新または削除回数のreltuplesに対する割合。" -#: utils/misc/guc.c:3642 +#: utils/misc/guc.c:3917 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." msgstr "チェックポイント中にダーティバッファの書き出しに使う時間のチェックポイント間隔に対する割合。" -#: utils/misc/guc.c:3652 -msgid "Number of tuple inserts prior to index cleanup as a fraction of reltuples." -msgstr "インデックスクリーンアップが実行されるまでのインデックスタプルの挿入行数のreltuplesに対する割合。" - -#: utils/misc/guc.c:3662 +#: utils/misc/guc.c:3927 msgid "Fraction of statements exceeding log_min_duration_sample to be logged." msgstr "log_min_duration_sampleを超過した文のうちログ出力を行う割合。" -#: utils/misc/guc.c:3663 +#: utils/misc/guc.c:3928 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "0.0(ログ出力しない)から1.0(すべてログ出力する)の間の値を指定してください。" -#: utils/misc/guc.c:3672 -msgid "Set the fraction of transactions to log for new transactions." -msgstr "新規トランザクションのログを取得するトランザクションの割合を設定。" +#: utils/misc/guc.c:3937 +msgid "Sets the fraction of transactions from which to log all statements." +msgstr "すべての文をログ出力するトランザクションの割合を設定します。" -#: utils/misc/guc.c:3673 -msgid "Logs all statements from a fraction of transactions. Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." -msgstr "一部のトランザクションの全ての文をログ出力します。0.0 (ログ出力しない)から 1.0 (全てのトランザクションの全ての文をログ出力する)の間の値を指定してください。" +#: utils/misc/guc.c:3938 +msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." +msgstr "0.0 (ログ出力しない)から 1.0 (全てのトランザクションの全ての文をログ出力する)の間の値を指定してください。" # hoge -#: utils/misc/guc.c:3693 +#: utils/misc/guc.c:3957 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "WALファイルの保管のために呼び出されるシェルスクリプトを設定。" +#: utils/misc/guc.c:3958 +msgid "This is used only if \"archive_library\" is not set." +msgstr "これは\"archive_library\"が設定されていない場合にのみ使用されます。" + # hoge -#: utils/misc/guc.c:3703 -msgid "Sets the shell command that will retrieve an archived WAL file." -msgstr "アーカイブされたWALファイルを取り出すシェルコマンドを設定。" +#: utils/misc/guc.c:3967 +msgid "Sets the library that will be called to archive a WAL file." +msgstr "WALファイルのアーカイブのために呼び出すライブラリを設定します。" + +#: utils/misc/guc.c:3968 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "空文字列で\"archive_command\"を使用することを示します。" + +# hoge +#: utils/misc/guc.c:3977 +msgid "Sets the shell command that will be called to retrieve an archived WAL file." +msgstr "アーカイブされたWALファイルを取り出すために呼び出すシェルコマンドを設定します。" # hoge -#: utils/misc/guc.c:3713 +#: utils/misc/guc.c:3987 msgid "Sets the shell command that will be executed at every restart point." msgstr "リスタートポイントの時に実行するシェルコマンドを設定。" # hoge -#: utils/misc/guc.c:3723 +#: utils/misc/guc.c:3997 msgid "Sets the shell command that will be executed once at the end of recovery." msgstr "リカバリ終了時に1度だけ実行されるシェルコマンドを設定。" -#: utils/misc/guc.c:3733 +#: utils/misc/guc.c:4007 msgid "Specifies the timeline to recover into." msgstr "リカバリの目標タイムラインを指定します。" -#: utils/misc/guc.c:3743 +#: utils/misc/guc.c:4017 msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." msgstr "\"immediate\"を指定すると一貫性が確保できた時点でリカバリを終了します。" -#: utils/misc/guc.c:3752 +#: utils/misc/guc.c:4026 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "リカバリを指定したトランザクションIDまで進めます。" -#: utils/misc/guc.c:3761 +#: utils/misc/guc.c:4035 msgid "Sets the time stamp up to which recovery will proceed." msgstr "リカバリを指定したタイムスタンプの時刻まで進めます。" -#: utils/misc/guc.c:3770 +#: utils/misc/guc.c:4044 msgid "Sets the named restore point up to which recovery will proceed." msgstr "リカバリを指定した名前のリストアポイントまで進めます。" -#: utils/misc/guc.c:3779 +#: utils/misc/guc.c:4053 msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." msgstr "リカバリを先行書き込みログの指定したLSNまで進めます。" -#: utils/misc/guc.c:3789 +#: utils/misc/guc.c:4063 msgid "Specifies a file name whose presence ends recovery in the standby." msgstr "作成することでスタンバイでのリカバリを終了させるファイルの名前を指定します。" -#: utils/misc/guc.c:3799 +#: utils/misc/guc.c:4073 msgid "Sets the connection string to be used to connect to the sending server." msgstr "送出側サーバへの接続に使用する接続文字列をしています。" -#: utils/misc/guc.c:3810 +#: utils/misc/guc.c:4084 msgid "Sets the name of the replication slot to use on the sending server." msgstr "送出サーバで使用するレプリケーションスロットの名前を設定。" -#: utils/misc/guc.c:3820 +#: utils/misc/guc.c:4094 msgid "Sets the client's character set encoding." msgstr "クライアントの文字集合の符号化方式を設定。" -#: utils/misc/guc.c:3831 +#: utils/misc/guc.c:4105 msgid "Controls information prefixed to each log line." msgstr "各ログ行の前に付ける情報を制御します。" -#: utils/misc/guc.c:3832 +#: utils/misc/guc.c:4106 msgid "If blank, no prefix is used." msgstr "もし空であればなにも付加しません。" -#: utils/misc/guc.c:3841 +#: utils/misc/guc.c:4115 msgid "Sets the time zone to use in log messages." msgstr "ログメッセージ使用するタイムゾーンを設定。" -#: utils/misc/guc.c:3851 +#: utils/misc/guc.c:4125 msgid "Sets the display format for date and time values." msgstr "日付時刻値の表示用書式を設定。" -#: utils/misc/guc.c:3852 +#: utils/misc/guc.c:4126 msgid "Also controls interpretation of ambiguous date inputs." msgstr "曖昧な日付の入力の解釈も制御します。" -#: utils/misc/guc.c:3863 +#: utils/misc/guc.c:4137 msgid "Sets the default table access method for new tables." msgstr "新規テーブルで使用されるデフォルトテーブルアクセスメソッドを設定。" -#: utils/misc/guc.c:3874 +#: utils/misc/guc.c:4148 msgid "Sets the default tablespace to create tables and indexes in." msgstr "テーブルとインデックスの作成先となるデフォルトのテーブル空間を設定。" -#: utils/misc/guc.c:3875 +#: utils/misc/guc.c:4149 msgid "An empty string selects the database's default tablespace." msgstr "空文字列はデータベースのデフォルトのテーブル空間を選択します。" -#: utils/misc/guc.c:3885 +#: utils/misc/guc.c:4159 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "一時テーブルとファイルのソートで使用されるテーブル空間を設定。" -#: utils/misc/guc.c:3896 +#: utils/misc/guc.c:4170 msgid "Sets the path for dynamically loadable modules." msgstr "動的ロード可能モジュールのパスを設定。" -#: utils/misc/guc.c:3897 +#: utils/misc/guc.c:4171 msgid "If a dynamically loadable module needs to be opened and the specified name does not have a directory component (i.e., the name does not contain a slash), the system will search this path for the specified file." msgstr "オープンする必要がある動的ロード可能なモジュールについて、指定されたファイル名にディレクトリ要素がない(つまり、名前にスラッシュが含まれない)場合、システムは指定されたファイルをこのパスから検索します。 " -#: utils/misc/guc.c:3910 +#: utils/misc/guc.c:4184 msgid "Sets the location of the Kerberos server key file." msgstr "Kerberosサーバキーファイルの場所を設定。" -#: utils/misc/guc.c:3921 +#: utils/misc/guc.c:4195 msgid "Sets the Bonjour service name." msgstr "Bonjour サービス名を設定。" -#: utils/misc/guc.c:3933 +#: utils/misc/guc.c:4207 msgid "Shows the collation order locale." msgstr "テキストデータのソート時に使用されるロケールを表示します。" -#: utils/misc/guc.c:3944 +#: utils/misc/guc.c:4218 msgid "Shows the character classification and case conversion locale." msgstr "文字クラス分類、大文字小文字変換を決定するロケールを表示します。" -#: utils/misc/guc.c:3955 +#: utils/misc/guc.c:4229 msgid "Sets the language in which messages are displayed." msgstr "表示用メッセージの言語を設定。" -#: utils/misc/guc.c:3965 +#: utils/misc/guc.c:4239 msgid "Sets the locale for formatting monetary amounts." msgstr "通貨書式で使用するロケールを設定。 " -#: utils/misc/guc.c:3975 +#: utils/misc/guc.c:4249 msgid "Sets the locale for formatting numbers." msgstr "数字の書式で使用するロケールを設定。" -#: utils/misc/guc.c:3985 +#: utils/misc/guc.c:4259 msgid "Sets the locale for formatting date and time values." msgstr "日付と時間の書式で使用するロケールを設定。" -#: utils/misc/guc.c:3995 +#: utils/misc/guc.c:4269 msgid "Lists shared libraries to preload into each backend." msgstr "各バックエンドに事前ロードする共有ライブラリを列挙します。" -#: utils/misc/guc.c:4006 +#: utils/misc/guc.c:4280 msgid "Lists shared libraries to preload into server." msgstr "サーバに事前ロードする共有ライブラリを列挙します。" -#: utils/misc/guc.c:4017 +#: utils/misc/guc.c:4291 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "各バックエンドに事前読み込みする非特権共有ライブラリを列挙します。" -#: utils/misc/guc.c:4028 +#: utils/misc/guc.c:4302 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "スキーマ部を含まない名前に対するスキーマの検索順を設定。" -#: utils/misc/guc.c:4040 -msgid "Sets the server (database) character set encoding." -msgstr "サーバ(データベース)文字セット符号化方式を設定。" +#: utils/misc/guc.c:4314 +msgid "Shows the server (database) character set encoding." +msgstr "サーバ(データベース)文字セット符号化方式を表示します。" -#: utils/misc/guc.c:4052 +#: utils/misc/guc.c:4326 msgid "Shows the server version." msgstr "サーバのバージョンを表示します。" -#: utils/misc/guc.c:4064 +#: utils/misc/guc.c:4338 msgid "Sets the current role." msgstr "現在のロールを設定。" -#: utils/misc/guc.c:4076 +#: utils/misc/guc.c:4350 msgid "Sets the session user name." msgstr "セッションユーザ名を設定。" -#: utils/misc/guc.c:4087 +#: utils/misc/guc.c:4361 msgid "Sets the destination for server log output." msgstr "サーバログの出力先を設定。" -#: utils/misc/guc.c:4088 -msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and \"eventlog\", depending on the platform." -msgstr "有効な値は、プラットフォームに依存しますが、\"stderr\"、\"syslog\"、\"csvlog\"、\"eventlog\"の組み合わせです。" +#: utils/misc/guc.c:4362 +msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", depending on the platform." +msgstr "有効な値は、プラットフォームに依存しますが\"stderr\"、\"syslog\"、\"csvlog\"、\"jsonlog\"そして\"eventlog\"の組み合わせです。" -#: utils/misc/guc.c:4099 +#: utils/misc/guc.c:4373 msgid "Sets the destination directory for log files." msgstr "ログファイルの格納ディレクトリを設定。" -#: utils/misc/guc.c:4100 +#: utils/misc/guc.c:4374 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "データディレクトリからの相対パスでも絶対パスでも指定できます" -#: utils/misc/guc.c:4110 +#: utils/misc/guc.c:4384 msgid "Sets the file name pattern for log files." msgstr "ログファイルのファイル名パターンを設定。" -#: utils/misc/guc.c:4121 +#: utils/misc/guc.c:4395 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "syslog内でPostgreSQLのメッセージを識別するために使用されるプログラム名を設定。" -#: utils/misc/guc.c:4132 +#: utils/misc/guc.c:4406 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "イベントログ内でPostgreSQLのメッセージを識別するために使用されるアプリケーション名を設定。" -#: utils/misc/guc.c:4143 +#: utils/misc/guc.c:4417 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "タイムスタンプの表示と解釈に使用するタイムゾーンを設定。" -#: utils/misc/guc.c:4153 +#: utils/misc/guc.c:4427 msgid "Selects a file of time zone abbreviations." msgstr "タイムゾーン省略形用のファイルを選択します。" -#: utils/misc/guc.c:4163 +#: utils/misc/guc.c:4437 msgid "Sets the owning group of the Unix-domain socket." msgstr "Unixドメインソケットを所有するグループを設定。" -#: utils/misc/guc.c:4164 +#: utils/misc/guc.c:4438 msgid "The owning user of the socket is always the user that starts the server." msgstr "ソケットを所有するユーザは常にサーバを開始したユーザです。" -#: utils/misc/guc.c:4174 +#: utils/misc/guc.c:4448 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Unixドメインソケットの作成先ディレクトリを設定。" -#: utils/misc/guc.c:4189 +#: utils/misc/guc.c:4463 msgid "Sets the host name or IP address(es) to listen to." msgstr "接続を監視するホスト名またはIPアドレスを設定。" -#: utils/misc/guc.c:4204 +#: utils/misc/guc.c:4478 msgid "Sets the server's data directory." msgstr "サーバのデータディレクトリを設定。" -#: utils/misc/guc.c:4215 +#: utils/misc/guc.c:4489 msgid "Sets the server's main configuration file." msgstr "サーバのメイン設定ファイルを設定。" -#: utils/misc/guc.c:4226 +#: utils/misc/guc.c:4500 msgid "Sets the server's \"hba\" configuration file." msgstr "サーバの\"hba\"設定ファイルを設定。" -#: utils/misc/guc.c:4237 +#: utils/misc/guc.c:4511 msgid "Sets the server's \"ident\" configuration file." msgstr "サーバの\"ident\"設定ファイルを設定。" -#: utils/misc/guc.c:4248 +#: utils/misc/guc.c:4522 msgid "Writes the postmaster PID to the specified file." msgstr "postmasterのPIDを指定したファイルに書き込みます。" -#: utils/misc/guc.c:4259 -msgid "Name of the SSL library." -msgstr "SSLライブラリの名前。" +#: utils/misc/guc.c:4533 +msgid "Shows the name of the SSL library." +msgstr "SSLライブラリの名前を表示します。" -#: utils/misc/guc.c:4274 +#: utils/misc/guc.c:4548 msgid "Location of the SSL server certificate file." msgstr "SSLサーバ証明書ファイルの場所です" -#: utils/misc/guc.c:4284 +#: utils/misc/guc.c:4558 msgid "Location of the SSL server private key file." -msgstr "SSLサーバ秘密キーファイルの場所です。" +msgstr "SSLサーバ秘密鍵ファイルの場所です。" -#: utils/misc/guc.c:4294 +#: utils/misc/guc.c:4568 msgid "Location of the SSL certificate authority file." msgstr "SSL認証局ファイルの場所です" -#: utils/misc/guc.c:4304 +#: utils/misc/guc.c:4578 msgid "Location of the SSL certificate revocation list file." msgstr "SSL証明書失効リストファイルの場所です。" -#: utils/misc/guc.c:4314 -msgid "Writes temporary statistics files to the specified directory." -msgstr "一時的な統計情報ファイルを指定したディレクトリに書き込みます。" +#: utils/misc/guc.c:4588 +msgid "Location of the SSL certificate revocation list directory." +msgstr "SSL証明書失効リストディレクトリの場所です。" -#: utils/misc/guc.c:4325 +#: utils/misc/guc.c:4598 msgid "Number of synchronous standbys and list of names of potential synchronous ones." msgstr "同期スタンバイの数と同期スタンバイ候補の名前の一覧。" -#: utils/misc/guc.c:4336 +#: utils/misc/guc.c:4609 msgid "Sets default text search configuration." msgstr "デフォルトのテキスト検索設定を設定します。" -#: utils/misc/guc.c:4346 +#: utils/misc/guc.c:4619 msgid "Sets the list of allowed SSL ciphers." msgstr "SSL暗号として許されるリストを設定。" -#: utils/misc/guc.c:4361 +#: utils/misc/guc.c:4634 msgid "Sets the curve to use for ECDH." msgstr "ECDHで使用する曲線を設定。" -#: utils/misc/guc.c:4376 +#: utils/misc/guc.c:4649 msgid "Location of the SSL DH parameters file." msgstr "SSLのDHパラメータファイルの場所です。" -#: utils/misc/guc.c:4387 +#: utils/misc/guc.c:4660 msgid "Command to obtain passphrases for SSL." msgstr "SSLのパスフレーズを取得するコマンド。" -#: utils/misc/guc.c:4398 +#: utils/misc/guc.c:4671 msgid "Sets the application name to be reported in statistics and logs." msgstr "統計やログで報告されるアプリケーション名を設定。" -#: utils/misc/guc.c:4409 +#: utils/misc/guc.c:4682 msgid "Sets the name of the cluster, which is included in the process title." msgstr "プロセスのタイトルに含まれるクラスタ名を指定。" -#: utils/misc/guc.c:4420 +#: utils/misc/guc.c:4693 msgid "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "WALの整合性チェックを行う対象とするリソースマネージャを設定。" -#: utils/misc/guc.c:4421 +#: utils/misc/guc.c:4694 msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." msgstr "全ページイメージが全てのデータブロックに対して記録され、WAL再生の結果とクロスチェックされます。" -#: utils/misc/guc.c:4431 +#: utils/misc/guc.c:4704 msgid "JIT provider to use." msgstr "使用するJITプロバイダ。" -#: utils/misc/guc.c:4442 +#: utils/misc/guc.c:4715 msgid "Log backtrace for errors in these functions." msgstr "これらの関数でエラーが起きた場合にはバックトレースをログに出力します。" -#: utils/misc/guc.c:4462 +#: utils/misc/guc.c:4735 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "文字列リテラルで\"\\'\"が許可されるかどうかを設定。" -#: utils/misc/guc.c:4472 +#: utils/misc/guc.c:4745 msgid "Sets the output format for bytea." msgstr "bytea の出力フォーマットを設定。" -#: utils/misc/guc.c:4482 +#: utils/misc/guc.c:4755 msgid "Sets the message levels that are sent to the client." msgstr "クライアントに送信される最小のメッセージレベルを設定。" -#: utils/misc/guc.c:4483 utils/misc/guc.c:4548 utils/misc/guc.c:4559 utils/misc/guc.c:4635 +#: utils/misc/guc.c:4756 utils/misc/guc.c:4842 utils/misc/guc.c:4853 utils/misc/guc.c:4929 msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." msgstr " 各レベルにはそのレベル以下の全てが含まれます。レベルを低くするほど、送信されるメッセージはより少なくなります。 " -#: utils/misc/guc.c:4493 +#: utils/misc/guc.c:4766 +msgid "Enables in-core computation of query identifiers." +msgstr "問い合わせ識別子の内部生成を有効にする。" + +#: utils/misc/guc.c:4776 msgid "Enables the planner to use constraints to optimize queries." msgstr "問い合わせの最適化の際にプランナに制約を利用させる。" -#: utils/misc/guc.c:4494 +#: utils/misc/guc.c:4777 msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." msgstr "制約により、問い合わせに一致する行がないことが保証されているテーブルをスキップします。" -#: utils/misc/guc.c:4505 +#: utils/misc/guc.c:4788 +msgid "Sets the default compression method for compressible values." +msgstr "圧縮可能な値に対して使用されるデフォルト圧縮方式を設定。" + +#: utils/misc/guc.c:4799 msgid "Sets the transaction isolation level of each new transaction." msgstr "新規トランザクションのトランザクション分離レベルを設定。" -#: utils/misc/guc.c:4515 +#: utils/misc/guc.c:4809 msgid "Sets the current transaction's isolation level." msgstr "現在のトランザクションの分離レベルを設定。" -#: utils/misc/guc.c:4526 +#: utils/misc/guc.c:4820 msgid "Sets the display format for interval values." msgstr "インターバル値の表示フォーマットを設定。" -#: utils/misc/guc.c:4537 +#: utils/misc/guc.c:4831 msgid "Sets the verbosity of logged messages." msgstr "ログ出力メッセージの詳細度を設定。" -#: utils/misc/guc.c:4547 +#: utils/misc/guc.c:4841 msgid "Sets the message levels that are logged." msgstr "ログに出力するメッセージレベルを設定。" -#: utils/misc/guc.c:4558 +#: utils/misc/guc.c:4852 msgid "Causes all statements generating error at or above this level to be logged." msgstr "このレベル以上のエラーを発生させた全てのSQL文をログに記録します。" -#: utils/misc/guc.c:4569 +#: utils/misc/guc.c:4863 msgid "Sets the type of statements logged." msgstr "ログ出力する文の種類を設定。" -#: utils/misc/guc.c:4579 +#: utils/misc/guc.c:4873 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "syslogを有効にした場合に使用するsyslog \"facility\"を設定。" -#: utils/misc/guc.c:4594 +#: utils/misc/guc.c:4888 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "トリガと書き換えルールに関するセッションの動作を設定。" -#: utils/misc/guc.c:4604 +#: utils/misc/guc.c:4898 msgid "Sets the current transaction's synchronization level." msgstr "現在のトランザクションの同期レベルを設定。" -#: utils/misc/guc.c:4614 +#: utils/misc/guc.c:4908 msgid "Allows archiving of WAL files using archive_command." msgstr "archive_command を使用したWALファイルのアーカイブ処理を許可。" -#: utils/misc/guc.c:4624 +#: utils/misc/guc.c:4918 msgid "Sets the action to perform upon reaching the recovery target." msgstr "リカバリ目標に到達した際の動作を設定。" -#: utils/misc/guc.c:4634 +#: utils/misc/guc.c:4928 msgid "Enables logging of recovery-related debugging information." msgstr "リカバリ関連のデバッグ情報の記録を行う" -#: utils/misc/guc.c:4650 +#: utils/misc/guc.c:4945 msgid "Collects function-level statistics on database activity." msgstr "データベースの動作に関して、関数レベルの統計情報を収集します。" -#: utils/misc/guc.c:4660 -msgid "Set the level of information written to the WAL." +#: utils/misc/guc.c:4956 +msgid "Sets the consistency of accesses to statistics data" +msgstr "統計情報読み出し時の一貫性レベルを設定します。" + +#: utils/misc/guc.c:4966 +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "WALファイルに出力される全ページ出力を指定した方式で圧縮します。" + +#: utils/misc/guc.c:4976 +msgid "Sets the level of information written to the WAL." msgstr "WALに書き出される情報のレベルを設定します。" -#: utils/misc/guc.c:4670 +#: utils/misc/guc.c:4986 msgid "Selects the dynamic shared memory implementation used." msgstr "動的共有メモリで使用する実装を選択します。" -#: utils/misc/guc.c:4680 +#: utils/misc/guc.c:4996 msgid "Selects the shared memory implementation used for the main shared memory region." msgstr "主共有メモリ領域に使用する共有メモリ実装を選択します。" -#: utils/misc/guc.c:4690 +#: utils/misc/guc.c:5006 msgid "Selects the method used for forcing WAL updates to disk." msgstr "WAL更新のディスクへの書き出しを強制するめの方法を選択します。" -#: utils/misc/guc.c:4700 +#: utils/misc/guc.c:5016 msgid "Sets how binary values are to be encoded in XML." msgstr "XMLでどのようにバイナリ値を符号化するかを設定します。" -#: utils/misc/guc.c:4710 +#: utils/misc/guc.c:5026 msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." msgstr "暗黙的なパースおよび直列化操作においてXMLデータを文書とみなすか断片とみなすかを設定します。" -#: utils/misc/guc.c:4721 +#: utils/misc/guc.c:5037 msgid "Use of huge pages on Linux or Windows." msgstr "LinuxおよびWindowsでヒュージページを使用。" -#: utils/misc/guc.c:4731 +#: utils/misc/guc.c:5047 +msgid "Prefetch referenced blocks during recovery" +msgstr "リカバリ中に非参照ブロックの事前読み込みを行う" + +#: utils/misc/guc.c:5048 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "キャッシュされていないデータへの参照の検出のためにWALの先読みを行う。" + +#: utils/misc/guc.c:5057 msgid "Forces use of parallel query facilities." msgstr "並列問い合わせ機構を強制的に使用します。" -#: utils/misc/guc.c:4732 +#: utils/misc/guc.c:5058 msgid "If possible, run query using a parallel worker and with parallel restrictions." msgstr "可能であれば並列処理ワーカを使用し、問い合わせを並列処理による制限の下で実行します。" -#: utils/misc/guc.c:4742 +#: utils/misc/guc.c:5068 msgid "Chooses the algorithm for encrypting passwords." msgstr "パスワードの暗号化に使用するアルゴリズムを選択する。" -#: utils/misc/guc.c:4752 +#: utils/misc/guc.c:5078 msgid "Controls the planner's selection of custom or generic plan." msgstr "プランナでのカスタムプランと汎用プランの選択を制御。" -#: utils/misc/guc.c:4753 +#: utils/misc/guc.c:5079 msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." msgstr "プリペアド文は個別プランと一般プランを持ち、プランナはよりよいプランの選択を試みます。これを設定することでそのデフォルト動作を変更できます。" -#: utils/misc/guc.c:4765 +#: utils/misc/guc.c:5091 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "使用する SSL/TLSプロトコルの最小バージョンを設定。" -#: utils/misc/guc.c:4777 +#: utils/misc/guc.c:5103 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "使用可能な最大の SSL/TLS プロトコルバージョンを指定します。" -#: utils/misc/guc.c:5580 +#: utils/misc/guc.c:5115 +msgid "Sets the method for synchronizing the data directory before crash recovery." +msgstr "クラシュリカバリ前に行うデータディレクトリの同期の方法を設定する。" + +#: utils/misc/guc.c:5689 utils/misc/guc.c:5705 +#, c-format +msgid "invalid configuration parameter name \"%s\"" +msgstr "設定パラメータ名\"%s\"は不正です" + +#: utils/misc/guc.c:5691 +#, c-format +msgid "Custom parameter names must be two or more simple identifiers separated by dots." +msgstr "独自パラメータの名前は2つ以上の単純識別子をピリオドでつないだ形式でなければなりません。" + +#: utils/misc/guc.c:5707 +#, c-format +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\"は予約されている接頭辞です。" + +#: utils/misc/guc.c:5721 +#, c-format +msgid "unrecognized configuration parameter \"%s\"" +msgstr "設定パラメータ\"%s\"は不明です" + +#: utils/misc/guc.c:6102 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s: ディレクトリ\"%s\"にアクセスできませんでした: %s\n" -#: utils/misc/guc.c:5585 +#: utils/misc/guc.c:6107 #, c-format msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" msgstr "initdbまたはpg_basebackupを実行して、PostgreSQLデータディレクトリを初期化してください。\n" -#: utils/misc/guc.c:5605 +#: utils/misc/guc.c:6127 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -26192,12 +28071,12 @@ msgstr "" "--config-fileまたは-Dオプションを指定する、あるいはPGDATA環境変数を設\n" "定する必要があります。\n" -#: utils/misc/guc.c:5624 +#: utils/misc/guc.c:6146 #, c-format msgid "%s: could not access the server configuration file \"%s\": %s\n" msgstr "%s: サーバ設定ファイル\"%s\"にアクセスできません: %s\n" -#: utils/misc/guc.c:5650 +#: utils/misc/guc.c:6172 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -26207,7 +28086,7 @@ msgstr "" "\"%s\"内で\"data_directory\"を指定する、-Dオプションを指定する、PGDATA環\n" "境変数で設定することができます。\n" -#: utils/misc/guc.c:5698 +#: utils/misc/guc.c:6220 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -26217,7 +28096,7 @@ msgstr "" "\"%s\"内で\"hba_directory\"を指定する、-Dオプションを指定する、PGDATA環\n" "境変数で設定することができます。\n" -#: utils/misc/guc.c:5721 +#: utils/misc/guc.c:6243 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -26227,181 +28106,186 @@ msgstr "" "\"%s\"内で\"ident_directory\"を指定する、-Dオプションを指定する、PGDATA環\n" "境変数で設定することができます。\n" -#: utils/misc/guc.c:6563 +#: utils/misc/guc.c:7168 msgid "Value exceeds integer range." msgstr "値が整数範囲を超えています。" -#: utils/misc/guc.c:6799 +#: utils/misc/guc.c:7404 #, c-format msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d%s%s はパラメータ\"%s\"の有効範囲 (%d .. %d) を超えています" -#: utils/misc/guc.c:6835 +#: utils/misc/guc.c:7440 #, c-format msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" msgstr "%g%s%s はパラメータ\"%s\"の有効範囲 (%g .. %g) を超えています" -#: utils/misc/guc.c:6991 utils/misc/guc.c:8358 +#: utils/misc/guc.c:7600 utils/misc/guc.c:9028 #, c-format msgid "cannot set parameters during a parallel operation" msgstr "並列処理中はパラメータの設定はできません" -#: utils/misc/guc.c:6998 utils/misc/guc.c:7750 utils/misc/guc.c:7803 utils/misc/guc.c:7854 utils/misc/guc.c:8187 utils/misc/guc.c:8954 utils/misc/guc.c:9216 utils/misc/guc.c:10882 -#, c-format -msgid "unrecognized configuration parameter \"%s\"" -msgstr "設定パラメータ\"%s\"は不明です" - -#: utils/misc/guc.c:7013 utils/misc/guc.c:8199 +#: utils/misc/guc.c:7617 utils/misc/guc.c:8852 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "パラメータ\"%s\"を変更できません" -#: utils/misc/guc.c:7046 +#: utils/misc/guc.c:7650 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "現在パラメータ\"%s\"を変更できません" -#: utils/misc/guc.c:7064 utils/misc/guc.c:7111 utils/misc/guc.c:10898 +#: utils/misc/guc.c:7677 utils/misc/guc.c:7735 utils/misc/guc.c:8828 utils/misc/guc.c:11696 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "パラメータ\"%s\"を設定する権限がありません" -#: utils/misc/guc.c:7101 +#: utils/misc/guc.c:7715 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "接続開始後にパラメータ\"%s\"を変更できません" -#: utils/misc/guc.c:7149 +#: utils/misc/guc.c:7774 #, c-format msgid "cannot set parameter \"%s\" within security-definer function" msgstr "セキュリティー定義用関数内でパラメーター\"%s\"を設定できません" -#: utils/misc/guc.c:7758 utils/misc/guc.c:7808 utils/misc/guc.c:9223 +#: utils/misc/guc.c:8407 utils/misc/guc.c:8454 utils/misc/guc.c:9917 #, c-format -msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" -msgstr "\"%s\"の内容を見るにはスーパユーザまたはpg_read_all_settingsロールである必要があります" +msgid "must be superuser or have privileges of pg_read_all_settings to examine \"%s\"" +msgstr "\"%s\"を確認するにはスーパーユーザーであるか、またはpg_read_all_settingsの権限を持つ必要があります" -#: utils/misc/guc.c:7899 +#: utils/misc/guc.c:8538 #, c-format msgid "SET %s takes only one argument" msgstr "SET %sは1つの引数のみを取ります" -#: utils/misc/guc.c:8147 +#: utils/misc/guc.c:8818 #, c-format -msgid "must be superuser to execute ALTER SYSTEM command" -msgstr "ALTER SYSTEM コマンドを実行するにはスーパユーザである必要があります" +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "ALTER SYSTEM RESET ALLを行う権限がありません" -#: utils/misc/guc.c:8232 +#: utils/misc/guc.c:8885 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "ALTER SYSTEMでのパラメータ値は改行を含んではいけません" -#: utils/misc/guc.c:8277 +#: utils/misc/guc.c:8930 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "ファイル\"%s\"の内容をパースできませんでした" -#: utils/misc/guc.c:8434 +#: utils/misc/guc.c:9104 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOTはまだ実装されていません" -#: utils/misc/guc.c:8518 +#: utils/misc/guc.c:9191 #, c-format msgid "SET requires parameter name" msgstr "SETにはパラメータ名が必要です" -#: utils/misc/guc.c:8651 +#: utils/misc/guc.c:9324 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "パラメータ\"%s\"を再定義しようとしています" -#: utils/misc/guc.c:10444 +#: utils/misc/guc.c:9645 +#, c-format +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "設定パラメータ名\"%s\"は不正です、削除します" + +#: utils/misc/guc.c:9647 +#, c-format +msgid "\"%s\" is now a reserved prefix." +msgstr "\"%s\" は予約された接頭辞になりました。" + +#: utils/misc/guc.c:11143 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "パラメータ\"%s\"の\"%s\"への変更中" -#: utils/misc/guc.c:10512 +#: utils/misc/guc.c:11308 #, c-format msgid "parameter \"%s\" could not be set" msgstr "パラメータ\"%s\"を設定できません" -#: utils/misc/guc.c:10602 +#: utils/misc/guc.c:11400 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "パラメータ\"%s\"の設定をパースできません" -#: utils/misc/guc.c:10960 utils/misc/guc.c:10994 -#, c-format -msgid "invalid value for parameter \"%s\": %d" -msgstr "パラメータ\"%s\"の値が無効です: %d" - -#: utils/misc/guc.c:11028 +#: utils/misc/guc.c:11826 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "パラメータ\"%s\"の値が無効です: %g" -#: utils/misc/guc.c:11298 +#: utils/misc/guc.c:12139 #, c-format msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." msgstr "当該セッションで何らかの一時テーブルがアクセスされた後は \"temp_buffers\"を変更できません" -#: utils/misc/guc.c:11310 +#: utils/misc/guc.c:12151 #, c-format msgid "Bonjour is not supported by this build" msgstr "このビルドでは bonjour はサポートされていません" -#: utils/misc/guc.c:11323 +#: utils/misc/guc.c:12164 #, c-format msgid "SSL is not supported by this build" msgstr "このインストレーションではSSLはサポートされていません" -#: utils/misc/guc.c:11335 +#: utils/misc/guc.c:12176 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "\"log_statement_stats\"が真の場合、パラメータを有効にできません" -#: utils/misc/guc.c:11347 +#: utils/misc/guc.c:12188 #, c-format msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." msgstr "\"log_parser_stats\"、\"log_planner_stats\"、\"log_executor_stats\"のいずれかが真の場合は\"log_statement_stats\"を有効にできません" -#: utils/misc/guc.c:11577 +#: utils/misc/guc.c:12418 #, c-format msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "posix_fadvise() をもたないプラットフォームではeffective_io_concurrencyは0に設定する必要があります。" -#: utils/misc/guc.c:11590 +#: utils/misc/guc.c:12431 #, c-format msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "posix_fadvise() をもたないプラットフォームではmaintenance_io_concurrencyは0に設定する必要があります。" -#: utils/misc/guc.c:11604 +#: utils/misc/guc.c:12445 #, c-format msgid "huge_page_size must be 0 on this platform." msgstr "このプラットフォームではhuge_page_sizeを0に設定する必要があります。" -#: utils/misc/guc.c:11720 +#: utils/misc/guc.c:12457 +#, c-format +msgid "client_connection_check_interval must be set to 0 on this platform" +msgstr "このプラットフォームではhuge_page_sizeを0に設定する必要があります" + +#: utils/misc/guc.c:12569 #, c-format msgid "invalid character" msgstr "不正な文字" -#: utils/misc/guc.c:11780 +#: utils/misc/guc.c:12629 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timelineが妥当な数値ではありません。" -#: utils/misc/guc.c:11820 +#: utils/misc/guc.c:12669 #, c-format msgid "multiple recovery targets specified" msgstr "複数のリカバリ目標が指定されています" -#: utils/misc/guc.c:11821 +#: utils/misc/guc.c:12670 #, c-format msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." msgstr " recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid はこの中の1つまで設定可能です。" -#: utils/misc/guc.c:11829 +#: utils/misc/guc.c:12678 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "\"immediate\"のみが指定可能です。" @@ -26411,11 +28295,6 @@ msgstr "\"immediate\"のみが指定可能です。" msgid "internal error: unrecognized run-time parameter type\n" msgstr "内部エラー: 実行時のパラメータ型が認識できません\n" -#: utils/misc/pg_config.c:60 -#, c-format -msgid "query-specified return tuple and function return type are not compatible" -msgstr "問い合わせで指定された返却タプルと関数の返り値の型が互換ではありません" - #: utils/misc/pg_controldata.c:60 utils/misc/pg_controldata.c:138 utils/misc/pg_controldata.c:241 utils/misc/pg_controldata.c:306 #, c-format msgid "calculated CRC checksum does not match value stored in file" @@ -26436,7 +28315,7 @@ msgstr "問い合わせはテーブル\"%s\"に対する行レベルセキュリ msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." msgstr "テーブルの所有者に対するポリシを無効にするには、ALTER TABLE NO FORCE ROW LEVEL SECURITY を使ってください。" -#: utils/misc/timeout.c:395 +#: utils/misc/timeout.c:524 #, c-format msgid "cannot add more timeout reasons" msgstr "これ以上のタイムアウト要因を追加できません" @@ -26506,7 +28385,7 @@ msgstr "タイムゾーンファイル\"%s\"の行%dが長すぎます。" msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "タイムゾーンファイル\"%s\"の行%dにファイル名がない@INCLUDEがあります" -#: utils/mmgr/aset.c:476 utils/mmgr/generation.c:234 utils/mmgr/slab.c:236 +#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:237 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "メモリコンテキスト\"%s\"の作成時に失敗しました" @@ -26516,92 +28395,97 @@ msgstr "メモリコンテキスト\"%s\"の作成時に失敗しました" msgid "could not attach to dynamic shared area" msgstr "動的共有エリアをアタッチできませんでした" -#: utils/mmgr/mcxt.c:830 utils/mmgr/mcxt.c:866 utils/mmgr/mcxt.c:904 utils/mmgr/mcxt.c:942 utils/mmgr/mcxt.c:978 utils/mmgr/mcxt.c:1009 utils/mmgr/mcxt.c:1045 utils/mmgr/mcxt.c:1097 utils/mmgr/mcxt.c:1132 utils/mmgr/mcxt.c:1167 +#: utils/mmgr/mcxt.c:889 utils/mmgr/mcxt.c:925 utils/mmgr/mcxt.c:963 utils/mmgr/mcxt.c:1001 utils/mmgr/mcxt.c:1089 utils/mmgr/mcxt.c:1120 utils/mmgr/mcxt.c:1156 utils/mmgr/mcxt.c:1208 utils/mmgr/mcxt.c:1243 utils/mmgr/mcxt.c:1278 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "メモリコンテクスト\"%2$s\"でサイズ%1$zuの要求が失敗しました。" -#: utils/mmgr/portalmem.c:187 +#: utils/mmgr/mcxt.c:1052 +#, c-format +msgid "logging memory contexts of PID %d" +msgstr "PID %dのメモリコンテクストを記録します" + +#: utils/mmgr/portalmem.c:188 #, c-format msgid "cursor \"%s\" already exists" msgstr "カーソル\"%s\"はすでに存在します" -#: utils/mmgr/portalmem.c:191 +#: utils/mmgr/portalmem.c:192 #, c-format msgid "closing existing cursor \"%s\"" msgstr "既存のカーソル\"%s\"をクローズしています" -#: utils/mmgr/portalmem.c:400 +#: utils/mmgr/portalmem.c:402 #, c-format msgid "portal \"%s\" cannot be run" msgstr "ポータル\"%s\"を実行できません" -#: utils/mmgr/portalmem.c:478 +#: utils/mmgr/portalmem.c:480 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "固定されたポータル\"%s\"は削除できません" -#: utils/mmgr/portalmem.c:486 +#: utils/mmgr/portalmem.c:488 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "アクテイブなポータル\"%s\"を削除できません" -#: utils/mmgr/portalmem.c:731 +#: utils/mmgr/portalmem.c:739 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "WITH HOLD 付きのカーソルを作成したトランザクションは PREPARE できません" -#: utils/mmgr/portalmem.c:1270 +#: utils/mmgr/portalmem.c:1232 #, c-format msgid "cannot perform transaction commands inside a cursor loop that is not read-only" msgstr "読み込み専用ではないカーソルのループ内ではトランザクション命令は実行できません" -#: utils/sort/logtape.c:268 utils/sort/logtape.c:291 +#: utils/sort/logtape.c:266 utils/sort/logtape.c:289 #, c-format msgid "could not seek to block %ld of temporary file" msgstr "一時ファイルのブロック%ldへのシークに失敗しました" -#: utils/sort/logtape.c:297 +#: utils/sort/logtape.c:295 #, c-format msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" msgstr "一時ファイルのブロック%1$ldの読み取りに失敗しました: %3$zuバイト中%2$zuバイトのみ読み取りました" -#: utils/sort/sharedtuplestore.c:430 utils/sort/sharedtuplestore.c:439 utils/sort/sharedtuplestore.c:462 utils/sort/sharedtuplestore.c:479 utils/sort/sharedtuplestore.c:496 +#: utils/sort/sharedtuplestore.c:431 utils/sort/sharedtuplestore.c:440 utils/sort/sharedtuplestore.c:463 utils/sort/sharedtuplestore.c:480 utils/sort/sharedtuplestore.c:497 #, c-format msgid "could not read from shared tuplestore temporary file" msgstr "タプルストア共有一時ファイルからの読み込みに失敗しました" -#: utils/sort/sharedtuplestore.c:485 +#: utils/sort/sharedtuplestore.c:486 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "タプルストア共有一時ファイル内に予期しないチャンクがありました" -#: utils/sort/sharedtuplestore.c:569 +#: utils/sort/sharedtuplestore.c:571 #, c-format -msgid "could not seek block %u in shared tuplestore temporary file" +msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "共有タプルストア一時ファイルのブロック%uへのシークに失敗しました" -#: utils/sort/sharedtuplestore.c:576 +#: utils/sort/sharedtuplestore.c:578 #, c-format msgid "could not read from shared tuplestore temporary file: read only %zu of %zu bytes" msgstr "共有タプルストア一時ファイルからの読み込みに失敗しました: %2$zuバイト中%1$zuバイトのみ読み取りました" -#: utils/sort/tuplesort.c:3140 +#: utils/sort/tuplesort.c:3321 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "外部ソートでは%d以上のラン数は扱えません" -#: utils/sort/tuplesort.c:4221 +#: utils/sort/tuplesort.c:4429 #, c-format msgid "could not create unique index \"%s\"" msgstr "一意インデックス\"%s\"を作成できませんでした" -#: utils/sort/tuplesort.c:4223 +#: utils/sort/tuplesort.c:4431 #, c-format msgid "Key %s is duplicated." msgstr "キー%sは重複しています。" -#: utils/sort/tuplesort.c:4224 +#: utils/sort/tuplesort.c:4432 #, c-format msgid "Duplicate keys exist." msgstr "重複したキーが存在します。" @@ -26616,269 +28500,47 @@ msgstr "タプルストア一時ファイルのシークに失敗しました" msgid "could not read from tuplestore temporary file: read only %zu of %zu bytes" msgstr "タプルストア一時ファイルからの読み込みに失敗しました: %2$zuバイト中%1$zuバイトのみ読み取りました" -#: utils/time/snapmgr.c:619 +#: utils/time/snapmgr.c:570 #, c-format msgid "The source transaction is not running anymore." msgstr "元となるトランザクションはすでに実行中ではありません。" -#: utils/time/snapmgr.c:1198 +#: utils/time/snapmgr.c:1164 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "サブトランザクションからスナップショットをエクスポートすることはできません" -#: utils/time/snapmgr.c:1357 utils/time/snapmgr.c:1362 utils/time/snapmgr.c:1367 utils/time/snapmgr.c:1382 utils/time/snapmgr.c:1387 utils/time/snapmgr.c:1392 utils/time/snapmgr.c:1407 utils/time/snapmgr.c:1412 utils/time/snapmgr.c:1417 utils/time/snapmgr.c:1519 utils/time/snapmgr.c:1535 utils/time/snapmgr.c:1560 +#: utils/time/snapmgr.c:1323 utils/time/snapmgr.c:1328 utils/time/snapmgr.c:1333 utils/time/snapmgr.c:1348 utils/time/snapmgr.c:1353 utils/time/snapmgr.c:1358 utils/time/snapmgr.c:1373 utils/time/snapmgr.c:1378 utils/time/snapmgr.c:1383 utils/time/snapmgr.c:1485 utils/time/snapmgr.c:1501 utils/time/snapmgr.c:1526 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "ファイル\"%s\"内のスナップショットデータが不正です" -#: utils/time/snapmgr.c:1454 +#: utils/time/snapmgr.c:1420 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "SET TRANSACTION SNAPSHOTを全ての問い合わせの前に呼び出さなければなりません" -#: utils/time/snapmgr.c:1463 +#: utils/time/snapmgr.c:1429 #, c-format msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" msgstr "スナップショットをインポートするトランザクションはSERIALIZABLEまたはREPEATABLE READ分離レベルでなければなりません" -#: utils/time/snapmgr.c:1472 utils/time/snapmgr.c:1481 +#: utils/time/snapmgr.c:1438 utils/time/snapmgr.c:1447 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "無効なスナップショット識別子: \"%s\"" -#: utils/time/snapmgr.c:1573 +#: utils/time/snapmgr.c:1539 #, c-format msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" msgstr "シリアライザブルトランザクションはシリアライザブルではないトランザクションからのスナップショットをインポートできません" -#: utils/time/snapmgr.c:1577 +#: utils/time/snapmgr.c:1543 #, c-format msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" msgstr "読み取りのみのシリアライザブルトランザクションでは、読み取り専用トランザクションからスナップショットを読み込むことができません" -#: utils/time/snapmgr.c:1592 +#: utils/time/snapmgr.c:1558 #, c-format msgid "cannot import a snapshot from a different database" msgstr "異なるデータベースからのスナップショットを読み込むことはできません" - -#~ msgid "leftover placeholder tuple detected in BRIN index \"%s\", deleting" -#~ msgstr "消されずに残ったプレースホルダータプルがBRINインデックス\"%s\"で見つかりました、削除します" - -#~ msgid "invalid value for \"buffering\" option" -#~ msgstr "不正な\"buffering\"オプションの値" - -#~ msgid "could not write block %ld of temporary file: %m" -#~ msgstr "一時ファイルのブロック%ldを書き込めませんでした: %m" - -#~ msgid "skipping redundant vacuum to prevent wraparound of table \"%s.%s.%s\"" -#~ msgstr "テーブル\"%s.%s.%s\"の周回防止vacuumは重複のためスキップします" - -#~ msgid "The database cluster was initialized without USE_FLOAT4_BYVAL but the server was compiled with USE_FLOAT4_BYVAL." -#~ msgstr "データベースクラスタは USE_FLOAT4_BYVAL なしで初期化されましたが、サーバ側は USE_FLOAT4_BYVAL 付きでコンパイルされています。" - -#~ msgid "The database cluster was initialized with USE_FLOAT4_BYVAL but the server was compiled without USE_FLOAT4_BYVAL." -#~ msgstr "データベースクラスタは USE_FLOAT4_BYVAL 付きで初期化されましたが、サーバ側は USE_FLOAT4_BYVAL なしでコンパイルされています。" - -#~ msgid "could not seek in log segment %s to offset %u: %m" -#~ msgstr "ログセグメント%sをオフセット%uまでシークできませんでした: %m" - -#~ msgid "could not read from log segment %s, offset %u, length %lu: %m" -#~ msgstr "ログセグメント %sのオフセット %uから長さ %lu で読み込めませんでした: %m" - -#~ msgid "An aggregate using a polymorphic transition type must have at least one polymorphic argument." -#~ msgstr "遷移多様型を用いる集約は多様型の引数を少なくとも1つ取る必要があります。" - -#~ msgid "An aggregate returning a polymorphic type must have at least one polymorphic argument." -#~ msgstr "多様型を返す集約は少なくとも1つの多様型の引数を取る必要があります。" - -#~ msgid "A function returning \"internal\" must have at least one \"internal\" argument." -#~ msgstr "\"internal\"\"を返す関数は少なくとも1つの\"internal\"型の引数を取る必要があります。" - -#~ msgid "A function returning a polymorphic type must have at least one polymorphic argument." -#~ msgstr "多様型を返す関数は少なくとも1つの多様型の引数を取る必要があります。" - -#~ msgid "A function returning \"anyrange\" must have at least one \"anyrange\" argument." -#~ msgstr "\"anyrange\"を返す関数は少なくとも1つの\"anyrange\"型の引数を取る必要があります。" - -#~ msgid "Adding partitioned tables to publications is not supported." -#~ msgstr "パブリケーションへのパーティションテーブルの追加はサポートされていません。" - -#~ msgid "You can add the table partitions individually." -#~ msgstr "各パーティション個別になら追加は可能です。" - -#~ msgid "must be superuser to drop access methods" -#~ msgstr "アクセスメソッドを削除するにはスーパユーザである必要があります" - -#~ msgid "FROM version must be different from installation target version \"%s\"" -#~ msgstr "FROM のバージョンはターゲットのバージョン\"%s\"と異なっていなければなりません" - -#~ msgid "using pg_pltemplate information instead of CREATE LANGUAGE parameters" -#~ msgstr "CREATE LANGUAGEパラメータの代わりにpg_pltemplateの情報を使用しています" - -#~ msgid "must be superuser to create procedural language \"%s\"" -#~ msgstr "手続き言語\"%s\"を生成するにはスーパユーザである必要があります" - -#~ msgid "unsupported language \"%s\"" -#~ msgstr "言語\"%s\"はサポートされていません" - -#~ msgid "The supported languages are listed in the pg_pltemplate system catalog." -#~ msgstr "サポートされている言語はpg_pltemplateシステムカタログ内に列挙されています" - -#~ msgid "changing return type of function %s from %s to %s" -#~ msgstr "関数%sの戻り値型を%sから%sに変更します" - -#~ msgid "column \"%s\" contains null values" -#~ msgstr "列\"%s\"にはNULL値があります" - -#~ msgid "updated partition constraint for default partition would be violated by some row" -#~ msgstr "デフォルトパーティションの一部の行が更新後のパーティション制約に違反しています" - -#~ msgid "partition key expressions cannot contain whole-row references" -#~ msgstr "パーティションキー式は行全体参照を含むことはできません" - -#~ msgid "Found referenced table's UPDATE trigger." -#~ msgstr "被参照テーブルのUPDATEトリガが見つかりました。" - -#~ msgid "Found referenced table's DELETE trigger." -#~ msgstr "被参照テーブルのDELETEトリガが見つかりました。" - -#~ msgid "Found referencing table's trigger." -#~ msgstr "参照テーブルのトリガが見つかりました。" - -#~ msgid "ignoring incomplete trigger group for constraint \"%s\" %s" -#~ msgstr "制約\"%s\"%sに対する不完全なトリガグループを無視します。" - -#~ msgid "converting trigger group into constraint \"%s\" %s" -#~ msgstr "トリガグループを制約\"%s\"%sに変換しています" - -#~ msgid "changing argument type of function %s from \"opaque\" to \"cstring\"" -#~ msgstr "関数%sの引数型を\"opaque\"から\"cstring\"に変更しています" - -#~ msgid "changing argument type of function %s from \"opaque\" to %s" -#~ msgstr "関数%sの引数型を\"opaque\"から%sに変更しています" - -#~ msgid "invalid value for \"check_option\" option" -#~ msgstr "\"check_option\"オプションの値が不正です" - -#~ msgid "\"%s.%s\" is a partitioned table." -#~ msgstr "\"%s.%s\"はパーティションテーブルです" - -#~ msgid "could not determine actual result type for function declared to return type %s" -#~ msgstr "戻り値型%sとして宣言された関数の実際の結果型を特定できませんでした" - -#~ msgid "could not write to hash-join temporary file: %m" -#~ msgstr "ハッシュ結合用一時ファイルを書き出せません: %m" - -#~ msgid "could not load wldap32.dll" -#~ msgstr "wldap32.dllが読み込めません" - -#~ msgid "SSL certificate revocation list file \"%s\" ignored" -#~ msgstr "SSL証明書失効リストファイル\"%s\"は無視されました" - -#~ msgid "SSL library does not support certificate revocation lists." -#~ msgstr "SSLライブラリが証明書失効リストをサポートしていません。" - -#~ msgid "could not find range type for data type %s" -#~ msgstr "データ型%sの範囲型がありませんでした" - -#~ msgid "could not create signal dispatch thread: error code %lu\n" -#~ msgstr "シグナルディスパッチ用スレッドを作成できませんでした: エラーコード %lu\n" - -#~ msgid "could not fseek in file \"%s\": %m" -#~ msgstr "ファイル\"%s\"をfseekできませんでした: %m" - -#~ msgid "could not reread block %d of file \"%s\": %m" -#~ msgstr "ファイル\"%2$s\"でブロック%1$dの再読み込みに失敗しました: %3$m" - -#~ msgid "only superusers can query or manipulate replication origins" -#~ msgstr "スーパユーザのみがレプリケーション基点の問い合わせや操作ができます" - -#~ msgid "logical replication apply worker for subscription \"%s\" will restart because the connection information was changed" -#~ msgstr "接続情報が変更されたため、サブスクリプション\"%s\"に対応する論理レプリケーション適用ワーカが再起動します" - -#~ msgid "logical replication apply worker for subscription \"%s\" will restart because the replication slot name was changed" -#~ msgstr "レプリケーションスロットの名前が変更されたため、サブスクリプション\"%s\"に対応する論理レプリケーション適用ワーカが再起動します" - -#~ msgid "logical replication apply worker for subscription \"%s\" will restart because subscription's publications were changed" -#~ msgstr "サブスクリプションが購読するパブリケーションが変更されたため、サブスクリプション\"%s\"に対応する論理レプリケーション適用ワーカが再起動します" - -#~ msgid "cannot advance replication slot that has not previously reserved WAL" -#~ msgstr "事前に WAL の留保をしていないレプリケーションスロットを進めることはできません" - -#~ msgid "could not read from log segment %s, offset %u, length %zu: %m" -#~ msgstr "ログセグメント %s、オフセット %uから長さ %zu が読み込めませんでした: %m" - -#~ msgid "Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8" -#~ msgstr "サーバのエンコーディングが UTF-8 ではない場合、コードポイントの値が 007F 以上については Unicode のエスケープ値は使用できません" - -#~ msgid "wrong element type" -#~ msgstr "間違った要素型" - -#~ msgid "cannot use advisory locks during a parallel operation" -#~ msgstr "並列処理中は勧告的ロックは使用できません" - -#~ msgid "cannot output a value of type %s" -#~ msgstr "%s型の値は出力できません" - -#~ msgid "wrong data type: %u, expected %u" -#~ msgstr "データ型が間違っています: %u。%uを想定していました" - -#~ msgid "Server has FLOAT4PASSBYVAL = %s, library has %s." -#~ msgstr "サーバ側はFLOAT4PASSBYVAL = %sですが、ライブラリ側は%sです。" - -#~ msgid "encoding name too long" -#~ msgstr "符号化方式名称が長すぎます" - -#~ msgid "Encrypt passwords." -#~ msgstr "パスワードを暗号化します。" - -#~ msgid "When a password is specified in CREATE USER or ALTER USER without writing either ENCRYPTED or UNENCRYPTED, this parameter determines whether the password is to be encrypted." -#~ msgstr "ENCRYPTEDもしくはUNENCRYPTEDの指定無しにCREATE USERもしくはALTER USERでパスワードが指定された場合、このオプションがパスワードの暗号化を行なうかどうかを決定します。" - -#~ msgid "could not write to temporary file: %m" -#~ msgstr "一時ファイルへの書き出しに失敗しました: %m" - -#~ msgid "could not write to tuplestore temporary file: %m" -#~ msgstr "タプルストア一時ファイルへの書き込みに失敗しました: %m" - -#~ msgid "date/time value \"%s\" is no longer supported" -#~ msgstr "日付時刻の値\"%s\"はもうサポートされていません" - -#~ msgid "Key (%s)=(%s) still referenced from table \"%s\"." -#~ msgstr "キー(%s)=(%s)はまだテーブル\"%s\"から参照されています。" - -#~ msgid "date/time value \"current\" is no longer supported" -#~ msgstr "日付時刻の値\"current\"はもうサポートされていません" - -#~ msgid "could not rmdir directory \"%s\": %m" -#~ msgstr "ディレクトリ\"%s\"を rmdir できませんでした: %m" - -#~ msgid "replication identifier %d is already active for PID %d" -#~ msgstr "レプリケーション識別子%dはすでにPID%dで活動中です" - -#~ msgid "GSSAPI context error" -#~ msgstr "GSSAPIコンテクストエラー" - -#~ msgid "cannot alter type of column referenced in partition key expression" -#~ msgstr "パーティションキー式で参照されている列の型は変更できません" - -#~ msgid "cannot alter type of column named in partition key" -#~ msgstr "パーティションキーに指定されている列の型は変更できません" - -#~ msgid "cannot drop column referenced in partition key expression" -#~ msgstr "パーティションキー式で参照されている列は削除できません" - -#~ msgid "cannot drop column named in partition key" -#~ msgstr "パーティションキーに指定されている列は削除できません" - -#~ msgid "concurrent reindex is not supported for catalog relations, skipping all" -#~ msgstr "インデックス並行再構築はカタログリレーションではサポートされません、すべてスキップします" - -#~ msgid "concurrent reindex of system catalogs is not supported" -#~ msgstr "システムカタログのインデックス並行再構築はサポートされていません" - -#~ msgid "default_table_access_method may not be empty." -#~ msgstr "default_table_access_method は空文字列に設定できません。" - -#~ msgid "only heap AM is supported" -#~ msgstr "ヒープアクセスメソッドのみをサポートしています" diff --git a/src/backend/po/ru.po b/src/backend/po/ru.po index 700e66ba57..7c29d007f5 100644 --- a/src/backend/po/ru.po +++ b/src/backend/po/ru.po @@ -4,13 +4,14 @@ # Serguei A. Mokhov , 2001-2005. # Oleg Bartunov , 2004-2005. # Dmitriy Olshevskiy , 2014. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022. +# Maxim Yablokov , 2021. msgid "" msgstr "" "Project-Id-Version: postgres (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-02-08 07:28+0300\n" -"PO-Revision-Date: 2021-02-08 08:35+0300\n" +"POT-Creation-Date: 2022-02-07 11:21+0300\n" +"PO-Revision-Date: 2022-02-07 11:38+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -28,59 +29,58 @@ msgid "not recorded" msgstr "не записано" #: ../common/controldata_utils.c:68 ../common/controldata_utils.c:73 -#: commands/copy.c:3495 commands/extension.c:3436 utils/adt/genfile.c:125 +#: commands/copyfrom.c:1516 commands/extension.c:3464 utils/adt/genfile.c:128 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не удалось открыть файл \"%s\" для чтения: %m" #: ../common/controldata_utils.c:86 ../common/controldata_utils.c:89 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1276 access/transam/xlog.c:3503 -#: access/transam/xlog.c:4728 access/transam/xlog.c:11101 -#: access/transam/xlog.c:11114 access/transam/xlog.c:11567 -#: access/transam/xlog.c:11647 access/transam/xlog.c:11686 -#: access/transam/xlog.c:11729 access/transam/xlogfuncs.c:662 -#: access/transam/xlogfuncs.c:681 commands/extension.c:3446 libpq/hba.c:499 -#: replication/logical/origin.c:717 replication/logical/origin.c:753 -#: replication/logical/reorderbuffer.c:3599 -#: replication/logical/snapbuild.c:1744 replication/logical/snapbuild.c:1786 -#: replication/logical/snapbuild.c:1814 replication/logical/snapbuild.c:1841 -#: replication/slot.c:1622 replication/slot.c:1663 replication/walsender.c:547 -#: storage/file/buffile.c:441 storage/file/copydir.c:195 -#: utils/adt/genfile.c:200 utils/adt/misc.c:763 utils/cache/relmapper.c:741 +#: access/transam/twophase.c:1327 access/transam/xlog.c:3569 +#: access/transam/xlog.c:4807 access/transam/xlog.c:11516 +#: access/transam/xlog.c:11529 access/transam/xlog.c:11982 +#: access/transam/xlog.c:12062 access/transam/xlog.c:12099 +#: access/transam/xlog.c:12159 access/transam/xlogfuncs.c:703 +#: access/transam/xlogfuncs.c:722 commands/extension.c:3474 libpq/hba.c:534 +#: replication/basebackup.c:2020 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4917 +#: replication/logical/snapbuild.c:1749 replication/logical/snapbuild.c:1791 +#: replication/logical/snapbuild.c:1818 replication/slot.c:1720 +#: replication/slot.c:1761 replication/walsender.c:544 +#: storage/file/buffile.c:445 storage/file/copydir.c:195 +#: utils/adt/genfile.c:202 utils/adt/misc.c:859 utils/cache/relmapper.c:744 #, c-format msgid "could not read file \"%s\": %m" msgstr "не удалось прочитать файл \"%s\": %m" #: ../common/controldata_utils.c:97 ../common/controldata_utils.c:101 -#: access/transam/twophase.c:1279 access/transam/xlog.c:3508 -#: access/transam/xlog.c:4733 replication/logical/origin.c:722 -#: replication/logical/origin.c:761 replication/logical/snapbuild.c:1749 -#: replication/logical/snapbuild.c:1791 replication/logical/snapbuild.c:1819 -#: replication/logical/snapbuild.c:1846 replication/slot.c:1626 -#: replication/slot.c:1667 replication/walsender.c:552 -#: utils/cache/relmapper.c:745 +#: access/transam/xlog.c:3574 access/transam/xlog.c:4812 +#: replication/basebackup.c:2024 replication/logical/origin.c:734 +#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1754 +#: replication/logical/snapbuild.c:1796 replication/logical/snapbuild.c:1823 +#: replication/slot.c:1724 replication/slot.c:1765 replication/walsender.c:549 +#: utils/cache/relmapper.c:748 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %zu)" #: ../common/controldata_utils.c:112 ../common/controldata_utils.c:117 #: ../common/controldata_utils.c:256 ../common/controldata_utils.c:259 -#: access/heap/rewriteheap.c:1181 access/heap/rewriteheap.c:1284 +#: access/heap/rewriteheap.c:1185 access/heap/rewriteheap.c:1288 #: access/transam/timeline.c:392 access/transam/timeline.c:438 -#: access/transam/timeline.c:516 access/transam/twophase.c:1288 -#: access/transam/twophase.c:1676 access/transam/xlog.c:3375 -#: access/transam/xlog.c:3543 access/transam/xlog.c:3548 -#: access/transam/xlog.c:3876 access/transam/xlog.c:4698 -#: access/transam/xlog.c:5622 access/transam/xlogfuncs.c:687 -#: commands/copy.c:1810 libpq/be-fsstubs.c:462 libpq/be-fsstubs.c:533 -#: replication/logical/origin.c:655 replication/logical/origin.c:794 -#: replication/logical/reorderbuffer.c:3657 -#: replication/logical/snapbuild.c:1653 replication/logical/snapbuild.c:1854 -#: replication/slot.c:1513 replication/slot.c:1674 replication/walsender.c:562 -#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:704 -#: storage/file/fd.c:3425 storage/file/fd.c:3528 utils/cache/relmapper.c:753 -#: utils/cache/relmapper.c:892 +#: access/transam/timeline.c:516 access/transam/twophase.c:1339 +#: access/transam/twophase.c:1744 access/transam/xlog.c:3441 +#: access/transam/xlog.c:3609 access/transam/xlog.c:3614 +#: access/transam/xlog.c:3942 access/transam/xlog.c:4777 +#: access/transam/xlog.c:5702 access/transam/xlogfuncs.c:728 +#: commands/copyfrom.c:1576 commands/copyto.c:328 libpq/be-fsstubs.c:455 +#: libpq/be-fsstubs.c:525 replication/logical/origin.c:667 +#: replication/logical/origin.c:806 replication/logical/reorderbuffer.c:4975 +#: replication/logical/snapbuild.c:1658 replication/logical/snapbuild.c:1831 +#: replication/slot.c:1611 replication/slot.c:1772 replication/walsender.c:559 +#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:738 +#: storage/file/fd.c:3536 storage/file/fd.c:3639 utils/cache/relmapper.c:759 +#: utils/cache/relmapper.c:898 #, c-format msgid "could not close file \"%s\": %m" msgstr "не удалось закрыть файл \"%s\": %m" @@ -104,124 +104,126 @@ msgstr "" "установленный PostgreSQL будет несовместим с этим каталогом данных." #: ../common/controldata_utils.c:197 ../common/controldata_utils.c:203 -#: ../common/file_utils.c:224 ../common/file_utils.c:283 -#: ../common/file_utils.c:357 access/heap/rewriteheap.c:1267 +#: ../common/file_utils.c:232 ../common/file_utils.c:291 +#: ../common/file_utils.c:365 access/heap/rewriteheap.c:1271 #: access/transam/timeline.c:111 access/transam/timeline.c:251 -#: access/transam/timeline.c:348 access/transam/twophase.c:1232 -#: access/transam/xlog.c:3277 access/transam/xlog.c:3417 -#: access/transam/xlog.c:3458 access/transam/xlog.c:3656 -#: access/transam/xlog.c:3741 access/transam/xlog.c:3844 -#: access/transam/xlog.c:4718 access/transam/xlogutils.c:807 -#: postmaster/syslogger.c:1488 replication/basebackup.c:621 -#: replication/basebackup.c:1593 replication/logical/origin.c:707 -#: replication/logical/reorderbuffer.c:2465 -#: replication/logical/reorderbuffer.c:2825 -#: replication/logical/reorderbuffer.c:3579 -#: replication/logical/snapbuild.c:1608 replication/logical/snapbuild.c:1715 -#: replication/slot.c:1594 replication/walsender.c:520 -#: replication/walsender.c:2509 storage/file/copydir.c:161 -#: storage/file/fd.c:679 storage/file/fd.c:3412 storage/file/fd.c:3499 -#: storage/smgr/md.c:513 utils/cache/relmapper.c:724 -#: utils/cache/relmapper.c:836 utils/error/elog.c:1858 -#: utils/init/miscinit.c:1316 utils/init/miscinit.c:1450 -#: utils/init/miscinit.c:1527 utils/misc/guc.c:8280 utils/misc/guc.c:8312 +#: access/transam/timeline.c:348 access/transam/twophase.c:1283 +#: access/transam/xlog.c:3327 access/transam/xlog.c:3483 +#: access/transam/xlog.c:3524 access/transam/xlog.c:3722 +#: access/transam/xlog.c:3807 access/transam/xlog.c:3910 +#: access/transam/xlog.c:4797 access/transam/xlogutils.c:803 +#: postmaster/syslogger.c:1488 replication/basebackup.c:616 +#: replication/basebackup.c:1610 replication/logical/origin.c:719 +#: replication/logical/reorderbuffer.c:3572 +#: replication/logical/reorderbuffer.c:4121 +#: replication/logical/reorderbuffer.c:4897 +#: replication/logical/snapbuild.c:1613 replication/logical/snapbuild.c:1720 +#: replication/slot.c:1692 replication/walsender.c:517 +#: replication/walsender.c:2535 storage/file/copydir.c:161 +#: storage/file/fd.c:713 storage/file/fd.c:3300 storage/file/fd.c:3523 +#: storage/file/fd.c:3610 storage/smgr/md.c:503 utils/cache/relmapper.c:724 +#: utils/cache/relmapper.c:842 utils/error/elog.c:1938 +#: utils/init/miscinit.c:1346 utils/init/miscinit.c:1480 +#: utils/init/miscinit.c:1557 utils/misc/guc.c:8605 utils/misc/guc.c:8637 #, c-format msgid "could not open file \"%s\": %m" msgstr "не удалось открыть файл \"%s\": %m" #: ../common/controldata_utils.c:221 ../common/controldata_utils.c:224 -#: access/transam/twophase.c:1649 access/transam/twophase.c:1658 -#: access/transam/xlog.c:10858 access/transam/xlog.c:10896 -#: access/transam/xlog.c:11309 access/transam/xlogfuncs.c:741 -#: postmaster/syslogger.c:1499 postmaster/syslogger.c:1512 -#: utils/cache/relmapper.c:870 +#: access/transam/twophase.c:1717 access/transam/twophase.c:1726 +#: access/transam/xlog.c:11273 access/transam/xlog.c:11311 +#: access/transam/xlog.c:11724 access/transam/xlogfuncs.c:782 +#: postmaster/postmaster.c:5682 postmaster/syslogger.c:1499 +#: postmaster/syslogger.c:1512 utils/cache/relmapper.c:876 #, c-format msgid "could not write file \"%s\": %m" msgstr "не удалось записать файл \"%s\": %m" #: ../common/controldata_utils.c:239 ../common/controldata_utils.c:245 -#: ../common/file_utils.c:295 ../common/file_utils.c:365 -#: access/heap/rewriteheap.c:961 access/heap/rewriteheap.c:1175 -#: access/heap/rewriteheap.c:1278 access/transam/timeline.c:432 -#: access/transam/timeline.c:510 access/transam/twophase.c:1670 -#: access/transam/xlog.c:3368 access/transam/xlog.c:3537 -#: access/transam/xlog.c:4691 access/transam/xlog.c:10366 -#: access/transam/xlog.c:10393 replication/logical/snapbuild.c:1646 -#: replication/slot.c:1499 replication/slot.c:1604 storage/file/fd.c:696 -#: storage/file/fd.c:3520 storage/smgr/md.c:959 storage/smgr/md.c:1000 -#: storage/sync/sync.c:396 utils/cache/relmapper.c:885 utils/misc/guc.c:8063 +#: ../common/file_utils.c:303 ../common/file_utils.c:373 +#: access/heap/rewriteheap.c:967 access/heap/rewriteheap.c:1179 +#: access/heap/rewriteheap.c:1282 access/transam/timeline.c:432 +#: access/transam/timeline.c:510 access/transam/twophase.c:1738 +#: access/transam/xlog.c:3434 access/transam/xlog.c:3603 +#: access/transam/xlog.c:4770 access/transam/xlog.c:10764 +#: access/transam/xlog.c:10805 replication/logical/snapbuild.c:1651 +#: replication/slot.c:1597 replication/slot.c:1702 storage/file/fd.c:730 +#: storage/file/fd.c:3631 storage/smgr/md.c:951 storage/smgr/md.c:992 +#: storage/sync/sync.c:441 utils/cache/relmapper.c:891 utils/misc/guc.c:8392 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл \"%s\": %m" -#: ../common/exec.c:137 ../common/exec.c:254 ../common/exec.c:300 +#: ../common/cryptohash_openssl.c:104 ../common/exec.c:522 ../common/exec.c:567 +#: ../common/exec.c:659 ../common/hmac_openssl.c:101 ../common/psprintf.c:143 +#: ../common/stringinfo.c:305 ../port/path.c:630 ../port/path.c:668 +#: ../port/path.c:685 access/transam/twophase.c:1397 access/transam/xlog.c:6677 +#: lib/dshash.c:246 libpq/auth.c:1491 libpq/auth.c:1559 libpq/auth.c:2117 +#: libpq/be-secure-gssapi.c:520 postmaster/bgworker.c:349 +#: postmaster/bgworker.c:948 postmaster/postmaster.c:2540 +#: postmaster/postmaster.c:4198 postmaster/postmaster.c:4868 +#: postmaster/postmaster.c:5607 postmaster/postmaster.c:5971 +#: replication/libpqwalreceiver/libpqwalreceiver.c:283 +#: replication/logical/logical.c:205 replication/walsender.c:591 +#: storage/buffer/localbuf.c:442 storage/file/fd.c:882 storage/file/fd.c:1354 +#: storage/file/fd.c:1515 storage/file/fd.c:2323 storage/ipc/procarray.c:1427 +#: storage/ipc/procarray.c:2252 storage/ipc/procarray.c:2259 +#: storage/ipc/procarray.c:2761 storage/ipc/procarray.c:3385 +#: utils/adt/cryptohashfuncs.c:46 utils/adt/cryptohashfuncs.c:66 +#: utils/adt/formatting.c:1699 utils/adt/formatting.c:1823 +#: utils/adt/formatting.c:1948 utils/adt/pg_locale.c:450 +#: utils/adt/pg_locale.c:614 utils/adt/regexp.c:223 utils/fmgr/dfmgr.c:229 +#: utils/hash/dynahash.c:513 utils/hash/dynahash.c:613 +#: utils/hash/dynahash.c:1116 utils/mb/mbutils.c:401 utils/mb/mbutils.c:429 +#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5036 +#: utils/misc/guc.c:5052 utils/misc/guc.c:5065 utils/misc/guc.c:8370 +#: utils/misc/tzparser.c:467 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:701 +#: utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:234 +#: utils/mmgr/mcxt.c:888 utils/mmgr/mcxt.c:924 utils/mmgr/mcxt.c:962 +#: utils/mmgr/mcxt.c:1000 utils/mmgr/mcxt.c:1088 utils/mmgr/mcxt.c:1119 +#: utils/mmgr/mcxt.c:1155 utils/mmgr/mcxt.c:1207 utils/mmgr/mcxt.c:1242 +#: utils/mmgr/mcxt.c:1277 utils/mmgr/slab.c:236 +#, c-format +msgid "out of memory" +msgstr "нехватка памяти" + +#: ../common/exec.c:136 ../common/exec.c:253 ../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "не удалось определить текущий каталог: %m" -#: ../common/exec.c:156 +#: ../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "неверный исполняемый файл \"%s\"" -#: ../common/exec.c:206 +#: ../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "не удалось прочитать исполняемый файл \"%s\"" -#: ../common/exec.c:214 +#: ../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "не удалось найти запускаемый файл \"%s\"" -#: ../common/exec.c:270 ../common/exec.c:309 utils/init/miscinit.c:395 +#: ../common/exec.c:269 ../common/exec.c:308 utils/init/miscinit.c:425 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не удалось перейти в каталог \"%s\": %m" -#: ../common/exec.c:287 access/transam/xlog.c:10730 -#: replication/basebackup.c:1418 utils/adt/misc.c:337 +#: ../common/exec.c:286 access/transam/xlog.c:11147 +#: replication/basebackup.c:1428 utils/adt/misc.c:340 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не удалось прочитать символическую ссылку \"%s\": %m" -#: ../common/exec.c:410 -#, c-format -msgid "pclose failed: %m" -msgstr "ошибка pclose: %m" - -#: ../common/exec.c:539 ../common/exec.c:584 ../common/exec.c:676 -#: ../common/psprintf.c:143 ../common/stringinfo.c:305 ../port/path.c:630 -#: ../port/path.c:668 ../port/path.c:685 access/transam/twophase.c:1341 -#: access/transam/xlog.c:6487 lib/dshash.c:246 libpq/auth.c:1469 -#: libpq/auth.c:1537 libpq/auth.c:2067 libpq/be-secure-gssapi.c:520 -#: postmaster/bgworker.c:347 postmaster/bgworker.c:952 -#: postmaster/postmaster.c:2519 postmaster/postmaster.c:4156 -#: postmaster/postmaster.c:4858 postmaster/postmaster.c:5615 -#: postmaster/postmaster.c:5975 -#: replication/libpqwalreceiver/libpqwalreceiver.c:276 -#: replication/logical/logical.c:176 replication/walsender.c:594 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:834 storage/file/fd.c:1304 -#: storage/file/fd.c:1465 storage/file/fd.c:2270 storage/ipc/procarray.c:1045 -#: storage/ipc/procarray.c:1541 storage/ipc/procarray.c:1548 -#: storage/ipc/procarray.c:1972 storage/ipc/procarray.c:2597 -#: utils/adt/cryptohashes.c:45 utils/adt/cryptohashes.c:65 -#: utils/adt/formatting.c:1700 utils/adt/formatting.c:1824 -#: utils/adt/formatting.c:1949 utils/adt/pg_locale.c:484 -#: utils/adt/pg_locale.c:648 utils/adt/regexp.c:223 utils/fmgr/dfmgr.c:229 -#: utils/hash/dynahash.c:450 utils/hash/dynahash.c:559 -#: utils/hash/dynahash.c:1071 utils/mb/mbutils.c:401 utils/mb/mbutils.c:428 -#: utils/mb/mbutils.c:757 utils/mb/mbutils.c:783 utils/misc/guc.c:4846 -#: utils/misc/guc.c:4862 utils/misc/guc.c:4875 utils/misc/guc.c:8041 -#: utils/misc/tzparser.c:467 utils/mmgr/aset.c:475 utils/mmgr/dsa.c:701 -#: utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:233 -#: utils/mmgr/mcxt.c:821 utils/mmgr/mcxt.c:857 utils/mmgr/mcxt.c:895 -#: utils/mmgr/mcxt.c:933 utils/mmgr/mcxt.c:969 utils/mmgr/mcxt.c:1000 -#: utils/mmgr/mcxt.c:1036 utils/mmgr/mcxt.c:1088 utils/mmgr/mcxt.c:1123 -#: utils/mmgr/mcxt.c:1158 utils/mmgr/slab.c:235 +#: ../common/exec.c:409 libpq/pqcomm.c:746 storage/ipc/latch.c:1064 +#: storage/ipc/latch.c:1233 storage/ipc/latch.c:1462 storage/ipc/latch.c:1614 +#: storage/ipc/latch.c:1730 #, c-format -msgid "out of memory" -msgstr "нехватка памяти" +msgid "%s() failed: %m" +msgstr "ошибка в %s(): %m" #: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 #: ../common/fe_memutils.c:98 ../common/fe_memutils.c:162 @@ -237,112 +239,113 @@ msgstr "нехватка памяти\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" -#: ../common/file_utils.c:79 ../common/file_utils.c:181 -#: access/transam/twophase.c:1244 access/transam/xlog.c:10834 -#: access/transam/xlog.c:10872 access/transam/xlog.c:11089 -#: access/transam/xlogarchive.c:110 access/transam/xlogarchive.c:226 -#: commands/copy.c:1938 commands/copy.c:3505 commands/extension.c:3425 -#: commands/tablespace.c:807 commands/tablespace.c:898 -#: replication/basebackup.c:444 replication/basebackup.c:627 -#: replication/basebackup.c:700 replication/logical/snapbuild.c:1522 -#: storage/file/copydir.c:68 storage/file/copydir.c:107 storage/file/fd.c:1816 -#: storage/file/fd.c:3096 storage/file/fd.c:3278 storage/file/fd.c:3364 -#: utils/adt/dbsize.c:70 utils/adt/dbsize.c:222 utils/adt/dbsize.c:302 -#: utils/adt/genfile.c:416 utils/adt/genfile.c:642 guc-file.l:1061 +#: ../common/file_utils.c:87 ../common/file_utils.c:451 +#: ../common/file_utils.c:455 access/transam/twophase.c:1295 +#: access/transam/xlog.c:11249 access/transam/xlog.c:11287 +#: access/transam/xlog.c:11504 access/transam/xlogarchive.c:110 +#: access/transam/xlogarchive.c:227 commands/copyfrom.c:1526 +#: commands/copyto.c:726 commands/extension.c:3453 commands/tablespace.c:803 +#: commands/tablespace.c:894 replication/basebackup.c:439 +#: replication/basebackup.c:622 replication/basebackup.c:698 +#: replication/logical/snapbuild.c:1530 storage/file/copydir.c:68 +#: storage/file/copydir.c:107 storage/file/fd.c:1865 storage/file/fd.c:1951 +#: storage/file/fd.c:3151 storage/file/fd.c:3355 utils/adt/dbsize.c:70 +#: utils/adt/dbsize.c:222 utils/adt/dbsize.c:302 utils/adt/genfile.c:418 +#: utils/adt/genfile.c:644 guc-file.l:1062 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не удалось получить информацию о файле \"%s\": %m" -#: ../common/file_utils.c:158 ../common/pgfnames.c:48 commands/tablespace.c:730 -#: commands/tablespace.c:740 postmaster/postmaster.c:1509 -#: storage/file/fd.c:2673 storage/file/reinit.c:122 utils/adt/misc.c:259 +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:726 +#: commands/tablespace.c:736 postmaster/postmaster.c:1515 +#: storage/file/fd.c:2726 storage/file/reinit.c:122 utils/adt/misc.c:262 #: utils/misc/tzparser.c:338 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не удалось открыть каталог \"%s\": %m" -#: ../common/file_utils.c:192 ../common/pgfnames.c:69 storage/file/fd.c:2685 +#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2738 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не удалось прочитать каталог \"%s\": %m" -#: ../common/file_utils.c:375 access/transam/xlogarchive.c:411 -#: postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1665 -#: replication/slot.c:650 replication/slot.c:1385 replication/slot.c:1527 -#: storage/file/fd.c:714 utils/time/snapmgr.c:1350 +#: ../common/file_utils.c:383 access/transam/xlogarchive.c:412 +#: postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1670 +#: replication/slot.c:643 replication/slot.c:1483 replication/slot.c:1625 +#: storage/file/fd.c:748 storage/file/fd.c:846 utils/time/snapmgr.c:1280 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "не удалось переименовать файл \"%s\" в \"%s\": %m" -#: ../common/jsonapi.c:1064 +#: ../common/jsonapi.c:1066 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Неверная спецпоследовательность: \"\\%s\"." -#: ../common/jsonapi.c:1067 +#: ../common/jsonapi.c:1069 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ с кодом 0x%02x необходимо экранировать." -#: ../common/jsonapi.c:1070 +#: ../common/jsonapi.c:1072 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Ожидался конец текста, но обнаружено продолжение \"%s\"." -#: ../common/jsonapi.c:1073 +#: ../common/jsonapi.c:1075 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Ожидался элемент массива или \"]\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1076 +#: ../common/jsonapi.c:1078 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "Ожидалась \",\" или \"]\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1079 +#: ../common/jsonapi.c:1081 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "Ожидалось \":\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1082 +#: ../common/jsonapi.c:1084 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Ожидалось значение JSON, но обнаружено \"%s\"." -#: ../common/jsonapi.c:1085 +#: ../common/jsonapi.c:1087 msgid "The input string ended unexpectedly." msgstr "Неожиданный конец входной строки." -#: ../common/jsonapi.c:1087 +#: ../common/jsonapi.c:1089 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Ожидалась строка или \"}\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1090 +#: ../common/jsonapi.c:1092 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "Ожидалась \",\" или \"}\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1093 +#: ../common/jsonapi.c:1095 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Ожидалась строка, но обнаружено \"%s\"." -#: ../common/jsonapi.c:1096 +#: ../common/jsonapi.c:1098 #, c-format msgid "Token \"%s\" is invalid." msgstr "Ошибочный элемент текста \"%s\"." -#: ../common/jsonapi.c:1099 jsonpath_scan.l:499 +#: ../common/jsonapi.c:1101 jsonpath_scan.l:499 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 нельзя преобразовать в текст." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:1103 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" должны следовать четыре шестнадцатеричные цифры." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:1106 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -350,29 +353,29 @@ msgstr "" "Спецкоды Unicode для значений выше 007F можно использовать только с " "кодировкой UTF8." -#: ../common/jsonapi.c:1106 jsonpath_scan.l:520 +#: ../common/jsonapi.c:1108 jsonpath_scan.l:520 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "" "Старшее слово суррогата Unicode не может следовать за другим старшим словом." -#: ../common/jsonapi.c:1108 jsonpath_scan.l:531 jsonpath_scan.l:541 +#: ../common/jsonapi.c:1110 jsonpath_scan.l:531 jsonpath_scan.l:541 #: jsonpath_scan.l:583 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Младшее слово суррогата Unicode должно следовать за старшим словом." -#: ../common/logging.c:236 +#: ../common/logging.c:259 #, c-format msgid "fatal: " msgstr "важно: " -#: ../common/logging.c:243 +#: ../common/logging.c:266 #, c-format msgid "error: " msgstr "ошибка: " -#: ../common/logging.c:250 +#: ../common/logging.c:273 #, c-format msgid "warning: " msgstr "предупреждение: " @@ -392,7 +395,7 @@ msgstr "неверное имя слоя" msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." msgstr "Допустимые имена слоёв: \"main\", \"fsm\", \"vm\" и \"init\"." -#: ../common/restricted_token.c:64 libpq/auth.c:1499 libpq/auth.c:2498 +#: ../common/restricted_token.c:64 libpq/auth.c:1521 libpq/auth.c:2553 #, c-format msgid "could not load library \"%s\": error code %lu" msgstr "не удалось загрузить библиотеку \"%s\" (код ошибки: %lu)" @@ -432,8 +435,8 @@ msgstr "не удалось перезапуститься с ограничен msgid "could not get exit code from subprocess: error code %lu" msgstr "не удалось получить код выхода от подпроцесса (код ошибки: %lu)" -#: ../common/rmtree.c:79 replication/basebackup.c:1171 -#: replication/basebackup.c:1347 +#: ../common/rmtree.c:79 replication/basebackup.c:1181 +#: replication/basebackup.c:1357 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "не удалось получить информацию о файле или каталоге \"%s\": %m" @@ -443,11 +446,6 @@ msgstr "не удалось получить информацию о файле msgid "could not remove file or directory \"%s\": %m" msgstr "ошибка при удалении файла или каталога \"%s\": %m" -#: ../common/saslprep.c:1087 -#, c-format -msgid "password too long" -msgstr "слишком длинный пароль" - #: ../common/stringinfo.c:306 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." @@ -471,7 +469,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "выяснить эффективный идентификатор пользователя (%ld) не удалось: %s" -#: ../common/username.c:45 libpq/auth.c:2005 +#: ../common/username.c:45 libpq/auth.c:2053 msgid "user does not exist" msgstr "пользователь не существует" @@ -595,7 +593,7 @@ msgid "could not check access token membership: error code %lu\n" msgstr "" "не удалось проверить вхождение в маркере безопасности (код ошибки: %lu)\n" -#: access/brin/brin.c:210 +#: access/brin/brin.c:214 #, c-format msgid "" "request for BRIN range summarization for index \"%s\" page %u was not " @@ -604,8 +602,8 @@ msgstr "" "запрос на расчёт сводки диапазона BRIN для индекса \"%s\" страницы %u не был " "записан" -#: access/brin/brin.c:873 access/brin/brin.c:950 access/gin/ginfast.c:1035 -#: access/transam/xlog.c:10502 access/transam/xlog.c:11040 +#: access/brin/brin.c:1015 access/brin/brin.c:1092 access/gin/ginfast.c:1035 +#: access/transam/xlog.c:10926 access/transam/xlog.c:11455 #: access/transam/xlogfuncs.c:274 access/transam/xlogfuncs.c:301 #: access/transam/xlogfuncs.c:340 access/transam/xlogfuncs.c:361 #: access/transam/xlogfuncs.c:382 access/transam/xlogfuncs.c:452 @@ -614,47 +612,73 @@ msgstr "" msgid "recovery is in progress" msgstr "идёт процесс восстановления" -#: access/brin/brin.c:874 access/brin/brin.c:951 +#: access/brin/brin.c:1016 access/brin/brin.c:1093 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "Функции управления BRIN нельзя использовать в процессе восстановления." -#: access/brin/brin.c:882 access/brin/brin.c:959 +#: access/brin/brin.c:1024 access/brin/brin.c:1101 #, c-format msgid "block number out of range: %s" msgstr "номер блока вне диапазона: %s" -#: access/brin/brin.c:905 access/brin/brin.c:982 +#: access/brin/brin.c:1047 access/brin/brin.c:1124 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\" - это не индекс BRIN" -#: access/brin/brin.c:921 access/brin/brin.c:998 +#: access/brin/brin.c:1063 access/brin/brin.c:1140 +#, c-format +msgid "could not open parent table of index \"%s\"" +msgstr "не удалось открыть родительскую таблицу индекса \"%s\"" + +#: access/brin/brin_bloom.c:751 access/brin/brin_bloom.c:793 +#: access/brin/brin_minmax_multi.c:3004 access/brin/brin_minmax_multi.c:3147 +#: statistics/dependencies.c:662 statistics/dependencies.c:715 +#: statistics/mcv.c:1483 statistics/mcv.c:1514 statistics/mvdistinct.c:343 +#: statistics/mvdistinct.c:396 utils/adt/pseudotypes.c:43 +#: utils/adt/pseudotypes.c:77 utils/adt/pseudotypes.c:252 +#, c-format +msgid "cannot accept a value of type %s" +msgstr "значение типа %s нельзя ввести" + +#: access/brin/brin_minmax_multi.c:2163 access/brin/brin_minmax_multi.c:2170 +#: access/brin/brin_minmax_multi.c:2177 utils/adt/timestamp.c:941 +#: utils/adt/timestamp.c:1515 utils/adt/timestamp.c:1982 +#: utils/adt/timestamp.c:3059 utils/adt/timestamp.c:3064 +#: utils/adt/timestamp.c:3069 utils/adt/timestamp.c:3119 +#: utils/adt/timestamp.c:3126 utils/adt/timestamp.c:3133 +#: utils/adt/timestamp.c:3153 utils/adt/timestamp.c:3160 +#: utils/adt/timestamp.c:3167 utils/adt/timestamp.c:3197 +#: utils/adt/timestamp.c:3205 utils/adt/timestamp.c:3249 +#: utils/adt/timestamp.c:3676 utils/adt/timestamp.c:3801 +#: utils/adt/timestamp.c:4359 #, c-format -msgid "could not open parent table of index %s" -msgstr "не удалось родительскую таблицу индекса %s" +msgid "interval out of range" +msgstr "interval вне диапазона" #: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 #: access/brin/brin_pageops.c:843 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1438 access/spgist/spgdoinsert.c:1957 +#: access/gist/gist.c:1441 access/spgist/spgdoinsert.c:2000 +#: access/spgist/spgdoinsert.c:2275 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "" "размер строки индекса (%zu) больше предельного размера (%zu) (индекс \"%s\")" -#: access/brin/brin_revmap.c:392 access/brin/brin_revmap.c:398 +#: access/brin/brin_revmap.c:393 access/brin/brin_revmap.c:399 #, c-format msgid "corrupted BRIN index: inconsistent range map" msgstr "испорченный индекс BRIN: несогласованность в карте диапазонов" -#: access/brin/brin_revmap.c:601 +#: access/brin/brin_revmap.c:602 #, c-format msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" msgstr "неожиданный тип страницы 0x%04X в BRIN-индексе \"%s\" (блок: %u)" #: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:151 -#: access/gist/gistvalidate.c:149 access/hash/hashvalidate.c:136 -#: access/nbtree/nbtvalidate.c:117 access/spgist/spgvalidate.c:168 +#: access/gist/gistvalidate.c:153 access/hash/hashvalidate.c:139 +#: access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:189 #, c-format msgid "" "operator family \"%s\" of access method %s contains function %s with invalid " @@ -664,8 +688,8 @@ msgstr "" "неправильным опорным номером %d" #: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:163 -#: access/gist/gistvalidate.c:161 access/hash/hashvalidate.c:115 -#: access/nbtree/nbtvalidate.c:129 access/spgist/spgvalidate.c:180 +#: access/gist/gistvalidate.c:165 access/hash/hashvalidate.c:118 +#: access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:201 #, c-format msgid "" "operator family \"%s\" of access method %s contains function %s with wrong " @@ -675,8 +699,8 @@ msgstr "" "неподходящим объявлением для опорного номера %d" #: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:182 -#: access/gist/gistvalidate.c:181 access/hash/hashvalidate.c:157 -#: access/nbtree/nbtvalidate.c:149 access/spgist/spgvalidate.c:200 +#: access/gist/gistvalidate.c:185 access/hash/hashvalidate.c:160 +#: access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:221 #, c-format msgid "" "operator family \"%s\" of access method %s contains operator %s with invalid " @@ -686,8 +710,8 @@ msgstr "" "неправильным номером стратегии %d" #: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:195 -#: access/hash/hashvalidate.c:170 access/nbtree/nbtvalidate.c:162 -#: access/spgist/spgvalidate.c:216 +#: access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 +#: access/spgist/spgvalidate.c:237 #, c-format msgid "" "operator family \"%s\" of access method %s contains invalid ORDER BY " @@ -697,8 +721,8 @@ msgstr "" "определение ORDER BY для оператора %s" #: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:208 -#: access/gist/gistvalidate.c:229 access/hash/hashvalidate.c:183 -#: access/nbtree/nbtvalidate.c:175 access/spgist/spgvalidate.c:232 +#: access/gist/gistvalidate.c:233 access/hash/hashvalidate.c:186 +#: access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:253 #, c-format msgid "" "operator family \"%s\" of access method %s contains operator %s with wrong " @@ -707,8 +731,8 @@ msgstr "" "семейство операторов \"%s\" метода доступа %s содержит оператор %s с " "неподходящим объявлением" -#: access/brin/brin_validate.c:236 access/hash/hashvalidate.c:223 -#: access/nbtree/nbtvalidate.c:233 access/spgist/spgvalidate.c:259 +#: access/brin/brin_validate.c:236 access/hash/hashvalidate.c:226 +#: access/nbtree/nbtvalidate.c:236 access/spgist/spgvalidate.c:280 #, c-format msgid "" "operator family \"%s\" of access method %s is missing operator(s) for types " @@ -726,14 +750,14 @@ msgstr "" "в семействе операторов \"%s\" метода доступа %s нет опорных функций для " "типов %s и %s" -#: access/brin/brin_validate.c:259 access/hash/hashvalidate.c:237 -#: access/nbtree/nbtvalidate.c:257 access/spgist/spgvalidate.c:294 +#: access/brin/brin_validate.c:259 access/hash/hashvalidate.c:240 +#: access/nbtree/nbtvalidate.c:260 access/spgist/spgvalidate.c:315 #, c-format msgid "operator class \"%s\" of access method %s is missing operator(s)" msgstr "в классе операторов \"%s\" метода доступа %s нет оператора(ов)" #: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:250 -#: access/gist/gistvalidate.c:270 +#: access/gist/gistvalidate.c:274 #, c-format msgid "" "operator class \"%s\" of access method %s is missing support function %d" @@ -779,92 +803,108 @@ msgstr "число столбцов (%d) превышает предел (%d)" msgid "number of index columns (%d) exceeds limit (%d)" msgstr "число столбцов индекса (%d) превышает предел (%d)" -#: access/common/indextuple.c:187 access/spgist/spgutils.c:703 +#: access/common/indextuple.c:190 access/spgist/spgutils.c:959 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "строка индекса требует байт: %zu, при максимуме: %zu" -#: access/common/printtup.c:369 tcop/fastpath.c:180 tcop/fastpath.c:530 -#: tcop/postgres.c:1904 +#: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 +#: tcop/postgres.c:1900 #, c-format msgid "unsupported format code: %d" msgstr "неподдерживаемый код формата: %d" -#: access/common/reloptions.c:506 +#: access/common/reloptions.c:512 access/common/reloptions.c:523 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "Допускаются только значения \"on\", \"off\" и \"auto\"." -#: access/common/reloptions.c:517 +#: access/common/reloptions.c:534 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "Допускаются только значения \"local\" и \"cascaded\"." -#: access/common/reloptions.c:665 +#: access/common/reloptions.c:682 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "превышен предел пользовательских типов реляционных параметров" -#: access/common/reloptions.c:1208 +#: access/common/reloptions.c:1225 #, c-format msgid "RESET must not include values for parameters" msgstr "В RESET не должно передаваться значение параметров" -#: access/common/reloptions.c:1240 +#: access/common/reloptions.c:1257 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "нераспознанное пространство имён параметров \"%s\"" -#: access/common/reloptions.c:1277 utils/misc/guc.c:12032 +#: access/common/reloptions.c:1294 utils/misc/guc.c:12515 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "таблицы со свойством WITH OIDS не поддерживаются" -#: access/common/reloptions.c:1447 +#: access/common/reloptions.c:1464 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "нераспознанный параметр \"%s\"" -#: access/common/reloptions.c:1559 +#: access/common/reloptions.c:1576 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "параметр \"%s\" указан неоднократно" -#: access/common/reloptions.c:1575 +#: access/common/reloptions.c:1592 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "неверное значение для логического параметра \"%s\": %s" -#: access/common/reloptions.c:1587 +#: access/common/reloptions.c:1604 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "неверное значение для целочисленного параметра \"%s\": %s" -#: access/common/reloptions.c:1593 access/common/reloptions.c:1613 +#: access/common/reloptions.c:1610 access/common/reloptions.c:1630 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "значение %s вне допустимых пределов параметра \"%s\"" -#: access/common/reloptions.c:1595 +#: access/common/reloptions.c:1612 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Допускаются значения только от \"%d\" до \"%d\"." -#: access/common/reloptions.c:1607 +#: access/common/reloptions.c:1624 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "неверное значение для численного параметра \"%s\": %s" -#: access/common/reloptions.c:1615 +#: access/common/reloptions.c:1632 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Допускаются значения только от \"%f\" до \"%f\"." -#: access/common/reloptions.c:1637 +#: access/common/reloptions.c:1654 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "неверное значение для параметра-перечисления \"%s\": %s" -#: access/common/tupdesc.c:842 parser/parse_clause.c:772 -#: parser/parse_relation.c:1803 +#: access/common/toast_compression.c:32 +#, c-format +msgid "compression method lz4 not supported" +msgstr "метод сжатия lz4 не поддерживается" + +#: access/common/toast_compression.c:33 +#, c-format +msgid "This functionality requires the server to be built with lz4 support." +msgstr "Для этой функциональности в сервере не хватает поддержки lz4." + +#: access/common/toast_compression.c:34 utils/adt/pg_locale.c:1589 +#: utils/adt/xml.c:224 +#, c-format +msgid "You need to rebuild PostgreSQL using %s." +msgstr "Необходимо перекомпилировать PostgreSQL с ключом %s." + +#: access/common/tupdesc.c:825 parser/parse_clause.c:771 +#: parser/parse_relation.c:1838 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "столбец \"%s\" не может быть объявлен как SETOF" @@ -894,7 +934,7 @@ msgstr "\"%s\" - это не индекс GIN" msgid "cannot access temporary indexes of other sessions" msgstr "обращаться к временным индексам других сеансов нельзя" -#: access/gin/ginget.c:270 access/nbtree/nbtinsert.c:745 +#: access/gin/ginget.c:270 access/nbtree/nbtinsert.c:759 #, c-format msgid "failed to re-find tuple within index \"%s\"" msgstr "не удалось повторно найти кортеж в индексе \"%s\"" @@ -910,15 +950,15 @@ msgstr "" msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Для исправления выполните REINDEX INDEX \"%s\"." -#: access/gin/ginutil.c:144 executor/execExpr.c:1862 -#: utils/adt/arrayfuncs.c:3790 utils/adt/arrayfuncs.c:6418 -#: utils/adt/rowtypes.c:936 +#: access/gin/ginutil.c:145 executor/execExpr.c:2166 +#: utils/adt/arrayfuncs.c:3819 utils/adt/arrayfuncs.c:6487 +#: utils/adt/rowtypes.c:957 #, c-format msgid "could not identify a comparison function for type %s" msgstr "не удалось найти функцию сравнения для типа %s" #: access/gin/ginvalidate.c:92 access/gist/gistvalidate.c:93 -#: access/hash/hashvalidate.c:99 access/spgist/spgvalidate.c:99 +#: access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 #, c-format msgid "" "operator family \"%s\" of access method %s contains support function %s with " @@ -935,12 +975,18 @@ msgid "" msgstr "" "в классе операторов \"%s\" метода доступа %s нет опорной функции %d или %d" -#: access/gist/gist.c:756 access/gist/gistvacuum.c:408 +#: access/gin/ginvalidate.c:333 access/gist/gistvalidate.c:350 +#: access/spgist/spgvalidate.c:387 +#, c-format +msgid "support function number %d is invalid for access method %s" +msgstr "номер опорной функции %d не подходит для метода доступа %s" + +#: access/gist/gist.c:758 access/gist/gistvacuum.c:420 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "индекс \"%s\" содержит внутренний кортеж, отмеченный как ошибочный" -#: access/gist/gist.c:758 access/gist/gistvacuum.c:410 +#: access/gist/gist.c:760 access/gist/gistvacuum.c:422 #, c-format msgid "" "This is caused by an incomplete page split at crash recovery before " @@ -949,15 +995,20 @@ msgstr "" "Это вызвано неполным разделением страницы при восстановлении после сбоя в " "PostgreSQL до версии 9.1." -#: access/gist/gist.c:759 access/gist/gistutil.c:786 access/gist/gistutil.c:797 -#: access/gist/gistvacuum.c:411 access/hash/hashutil.c:227 +#: access/gist/gist.c:761 access/gist/gistutil.c:800 access/gist/gistutil.c:811 +#: access/gist/gistvacuum.c:423 access/hash/hashutil.c:227 #: access/hash/hashutil.c:238 access/hash/hashutil.c:250 -#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:741 -#: access/nbtree/nbtpage.c:752 +#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:810 +#: access/nbtree/nbtpage.c:821 #, c-format msgid "Please REINDEX it." msgstr "Пожалуйста, выполните REINDEX для него." +#: access/gist/gist.c:1175 +#, c-format +msgid "fixing incomplete split in index \"%s\", block %u" +msgstr "исправление неполного разделения в индексе \"%s\" (блок: %u)" + #: access/gist/gistsplit.c:446 #, c-format msgid "picksplit method for column %d of index \"%s\" failed" @@ -973,19 +1024,19 @@ msgstr "" "разработчиками или попробуйте указать этот столбец в команде CREATE INDEX " "вторым." -#: access/gist/gistutil.c:783 access/hash/hashutil.c:224 -#: access/nbtree/nbtpage.c:738 +#: access/gist/gistutil.c:797 access/hash/hashutil.c:224 +#: access/nbtree/nbtpage.c:807 #, c-format msgid "index \"%s\" contains unexpected zero page at block %u" msgstr "в индексе \"%s\" неожиданно оказалась нулевая страница в блоке %u" -#: access/gist/gistutil.c:794 access/hash/hashutil.c:235 -#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:749 +#: access/gist/gistutil.c:808 access/hash/hashutil.c:235 +#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:818 #, c-format msgid "index \"%s\" contains corrupted page at block %u" msgstr "индекс \"%s\" содержит испорченную страницу в блоке %u" -#: access/gist/gistvalidate.c:199 +#: access/gist/gistvalidate.c:203 #, c-format msgid "" "operator family \"%s\" of access method %s contains unsupported ORDER BY " @@ -994,7 +1045,7 @@ msgstr "" "семейство операторов \"%s\" метода доступа %s содержит неподдерживаемое " "определение ORDER BY для оператора %s" -#: access/gist/gistvalidate.c:210 +#: access/gist/gistvalidate.c:214 #, c-format msgid "" "operator family \"%s\" of access method %s contains incorrect ORDER BY " @@ -1003,7 +1054,7 @@ msgstr "" "семейство операторов \"%s\" метода доступа %s содержит некорректное " "определение ORDER BY для оператора %s" -#: access/hash/hashfunc.c:255 access/hash/hashfunc.c:311 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:334 #: utils/adt/varchar.c:993 utils/adt/varchar.c:1053 #, c-format msgid "could not determine which collation to use for string hashing" @@ -1011,14 +1062,13 @@ msgstr "" "не удалось определить, какое правило сортировки использовать для хеширования " "строк" -#: access/hash/hashfunc.c:256 access/hash/hashfunc.c:312 catalog/heap.c:711 -#: catalog/heap.c:717 commands/createas.c:206 commands/createas.c:489 -#: commands/indexcmds.c:1816 commands/tablecmds.c:16057 commands/view.c:86 -#: parser/parse_utilcmd.c:4228 regex/regc_pg_locale.c:263 -#: utils/adt/formatting.c:1667 utils/adt/formatting.c:1791 -#: utils/adt/formatting.c:1916 utils/adt/like.c:194 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:335 catalog/heap.c:713 +#: catalog/heap.c:719 commands/createas.c:206 commands/createas.c:503 +#: commands/indexcmds.c:1869 commands/tablecmds.c:16839 commands/view.c:86 +#: regex/regc_pg_locale.c:263 utils/adt/formatting.c:1666 +#: utils/adt/formatting.c:1790 utils/adt/formatting.c:1915 utils/adt/like.c:194 #: utils/adt/like_support.c:1003 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:994 utils/adt/varchar.c:1054 utils/adt/varlena.c:1486 +#: utils/adt/varchar.c:994 utils/adt/varchar.c:1054 utils/adt/varlena.c:1517 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "Задайте правило сортировки явно в предложении COLLATE." @@ -1028,8 +1078,8 @@ msgstr "Задайте правило сортировки явно в пред msgid "index row size %zu exceeds hash maximum %zu" msgstr "размер строки индекса (%zu) больше предельного размера хеша (%zu)" -#: access/hash/hashinsert.c:84 access/spgist/spgdoinsert.c:1961 -#: access/spgist/spgutils.c:764 +#: access/hash/hashinsert.c:84 access/spgist/spgdoinsert.c:2004 +#: access/spgist/spgdoinsert.c:2279 access/spgist/spgutils.c:1020 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "Значения, не умещающиеся в страницу буфера, нельзя проиндексировать." @@ -1059,7 +1109,7 @@ msgstr "индекс \"%s\" не является хеш-индексом" msgid "index \"%s\" has wrong hash version" msgstr "индекс \"%s\" имеет неправильную версию хеша" -#: access/hash/hashvalidate.c:195 +#: access/hash/hashvalidate.c:198 #, c-format msgid "" "operator family \"%s\" of access method %s lacks support function for " @@ -1068,45 +1118,45 @@ msgstr "" "в семействе операторов \"%s\" метода доступа %s не хватает опорной функции " "для оператора %s" -#: access/hash/hashvalidate.c:253 access/nbtree/nbtvalidate.c:273 +#: access/hash/hashvalidate.c:256 access/nbtree/nbtvalidate.c:276 #, c-format msgid "" "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "" "в семействе операторов \"%s\" метода доступа %s нет межтипового оператора(ов)" -#: access/heap/heapam.c:2036 +#: access/heap/heapam.c:2260 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "вставлять кортежи в параллельном исполнителе нельзя" -#: access/heap/heapam.c:2454 +#: access/heap/heapam.c:2731 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "удалять кортежи во время параллельных операций нельзя" -#: access/heap/heapam.c:2500 +#: access/heap/heapam.c:2777 #, c-format msgid "attempted to delete invisible tuple" msgstr "попытка удаления невидимого кортежа" -#: access/heap/heapam.c:2926 access/heap/heapam.c:5715 +#: access/heap/heapam.c:3209 access/heap/heapam.c:6019 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "изменять кортежи во время параллельных операций нельзя" -#: access/heap/heapam.c:3059 +#: access/heap/heapam.c:3342 #, c-format msgid "attempted to update invisible tuple" msgstr "попытка изменения невидимого кортежа" -#: access/heap/heapam.c:4370 access/heap/heapam.c:4408 -#: access/heap/heapam.c:4665 access/heap/heapam_handler.c:450 +#: access/heap/heapam.c:4663 access/heap/heapam.c:4701 +#: access/heap/heapam.c:4966 access/heap/heapam_handler.c:456 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "не удалось получить блокировку строки в таблице \"%s\"" -#: access/heap/heapam_handler.c:399 +#: access/heap/heapam_handler.c:401 #, c-format msgid "" "tuple to be locked was already moved to another partition due to concurrent " @@ -1115,63 +1165,64 @@ msgstr "" "кортеж, подлежащий блокировке, был перемещён в другую секцию в результате " "параллельного изменения" -#: access/heap/hio.c:345 access/heap/rewriteheap.c:662 +#: access/heap/hio.c:360 access/heap/rewriteheap.c:665 #, c-format msgid "row is too big: size %zu, maximum size %zu" msgstr "размер строки (%zu) превышает предел (%zu)" -#: access/heap/rewriteheap.c:921 +#: access/heap/rewriteheap.c:927 #, c-format msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "не удалось записать в файл \"%s\" (записано байт: %d из %d): %m" -#: access/heap/rewriteheap.c:1015 access/heap/rewriteheap.c:1134 +#: access/heap/rewriteheap.c:1020 access/heap/rewriteheap.c:1138 #: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:3300 access/transam/xlog.c:3472 -#: access/transam/xlog.c:4670 access/transam/xlog.c:10849 -#: access/transam/xlog.c:10887 access/transam/xlog.c:11292 -#: access/transam/xlogfuncs.c:735 postmaster/postmaster.c:4619 -#: replication/logical/origin.c:575 replication/slot.c:1446 -#: storage/file/copydir.c:167 storage/smgr/md.c:218 utils/time/snapmgr.c:1329 +#: access/transam/xlog.c:3350 access/transam/xlog.c:3538 +#: access/transam/xlog.c:4749 access/transam/xlog.c:11264 +#: access/transam/xlog.c:11302 access/transam/xlog.c:11707 +#: access/transam/xlogfuncs.c:776 postmaster/postmaster.c:4623 +#: postmaster/postmaster.c:5669 replication/logical/origin.c:587 +#: replication/slot.c:1544 storage/file/copydir.c:167 storage/smgr/md.c:218 +#: utils/time/snapmgr.c:1259 #, c-format msgid "could not create file \"%s\": %m" -msgstr "создать файл \"%s\" не удалось: %m" +msgstr "не удалось создать файл \"%s\": %m" -#: access/heap/rewriteheap.c:1144 +#: access/heap/rewriteheap.c:1148 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "не удалось обрезать файл \"%s\" до нужного размера (%u): %m" -#: access/heap/rewriteheap.c:1162 access/transam/timeline.c:384 +#: access/heap/rewriteheap.c:1166 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3356 access/transam/xlog.c:3528 -#: access/transam/xlog.c:4682 postmaster/postmaster.c:4629 -#: postmaster/postmaster.c:4639 replication/logical/origin.c:587 -#: replication/logical/origin.c:629 replication/logical/origin.c:648 -#: replication/logical/snapbuild.c:1622 replication/slot.c:1481 -#: storage/file/buffile.c:502 storage/file/copydir.c:207 -#: utils/init/miscinit.c:1391 utils/init/miscinit.c:1402 -#: utils/init/miscinit.c:1410 utils/misc/guc.c:8024 utils/misc/guc.c:8055 -#: utils/misc/guc.c:9975 utils/misc/guc.c:9989 utils/time/snapmgr.c:1334 -#: utils/time/snapmgr.c:1341 +#: access/transam/xlog.c:3422 access/transam/xlog.c:3594 +#: access/transam/xlog.c:4761 postmaster/postmaster.c:4633 +#: postmaster/postmaster.c:4643 replication/logical/origin.c:599 +#: replication/logical/origin.c:641 replication/logical/origin.c:660 +#: replication/logical/snapbuild.c:1627 replication/slot.c:1579 +#: storage/file/buffile.c:506 storage/file/copydir.c:207 +#: utils/init/miscinit.c:1421 utils/init/miscinit.c:1432 +#: utils/init/miscinit.c:1440 utils/misc/guc.c:8353 utils/misc/guc.c:8384 +#: utils/misc/guc.c:10293 utils/misc/guc.c:10307 utils/time/snapmgr.c:1264 +#: utils/time/snapmgr.c:1271 #, c-format msgid "could not write to file \"%s\": %m" -msgstr "записать в файл \"%s\" не удалось: %m" - -#: access/heap/rewriteheap.c:1252 access/transam/twophase.c:1609 -#: access/transam/xlogarchive.c:118 access/transam/xlogarchive.c:421 -#: postmaster/postmaster.c:1092 postmaster/syslogger.c:1465 -#: replication/logical/origin.c:563 replication/logical/reorderbuffer.c:3079 -#: replication/logical/snapbuild.c:1564 replication/logical/snapbuild.c:2009 -#: replication/slot.c:1578 storage/file/fd.c:754 storage/file/fd.c:3116 -#: storage/file/fd.c:3178 storage/file/reinit.c:255 storage/ipc/dsm.c:302 -#: storage/smgr/md.c:355 storage/smgr/md.c:405 storage/sync/sync.c:210 -#: utils/time/snapmgr.c:1674 +msgstr "не удалось записать в файл \"%s\": %m" + +#: access/heap/rewriteheap.c:1256 access/transam/twophase.c:1677 +#: access/transam/xlogarchive.c:118 access/transam/xlogarchive.c:422 +#: postmaster/postmaster.c:1096 postmaster/syslogger.c:1465 +#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4390 +#: replication/logical/snapbuild.c:1572 replication/logical/snapbuild.c:1988 +#: replication/slot.c:1676 storage/file/fd.c:788 storage/file/fd.c:3171 +#: storage/file/fd.c:3233 storage/file/reinit.c:250 storage/ipc/dsm.c:315 +#: storage/smgr/md.c:344 storage/smgr/md.c:394 storage/sync/sync.c:237 +#: utils/time/snapmgr.c:1604 #, c-format msgid "could not remove file \"%s\": %m" msgstr "не удалось стереть файл \"%s\": %m" -#: access/heap/vacuumlazy.c:648 +#: access/heap/vacuumlazy.c:773 #, c-format msgid "" "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": " @@ -1180,7 +1231,7 @@ msgstr "" "автоматическая агрессивная очистка, предотвращающая зацикливание, таблицы " "\"%s.%s.%s\": сканирований индекса: %d\n" -#: access/heap/vacuumlazy.c:650 +#: access/heap/vacuumlazy.c:775 #, c-format msgid "" "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: " @@ -1189,20 +1240,20 @@ msgstr "" "автоматическая очистка, предотвращающая зацикливание, таблицы \"%s.%s.%s\": " "сканирований индекса: %d\n" -#: access/heap/vacuumlazy.c:655 +#: access/heap/vacuumlazy.c:780 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "" "автоматическая агрессивная очистка таблицы \"%s.%s.%s\": сканирований " "индекса: %d\n" -#: access/heap/vacuumlazy.c:657 +#: access/heap/vacuumlazy.c:782 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "" "автоматическая очистка таблицы \"%s.%s.%s\": сканирований индекса: %d\n" -#: access/heap/vacuumlazy.c:664 +#: access/heap/vacuumlazy.c:789 #, c-format msgid "" "pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n" @@ -1210,75 +1261,109 @@ msgstr "" "страниц удалено: %u, осталось: %u, пропущено закреплённых: %u, пропущено " "замороженных: %u\n" -#: access/heap/vacuumlazy.c:670 +#: access/heap/vacuumlazy.c:795 #, c-format msgid "" -"tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable, " +"tuples: %lld removed, %lld remain, %lld are dead but not yet removable, " "oldest xmin: %u\n" msgstr "" -"версий строк: удалено: %.0f, осталось: %.0f, «мёртвых», но ещё не подлежащих " -"удалению: %.0f, старейший xmin: %u\n" +"версий строк: удалено: %lld, осталось: %lld, «мёртвых», но ещё не подлежащих " +"удалению: %lld, старейший xmin: %u\n" + +#: access/heap/vacuumlazy.c:806 +msgid "index scan not needed: " +msgstr "сканирование индекса не требуется: " + +#: access/heap/vacuumlazy.c:808 +msgid "index scan needed: " +msgstr "сканирование индекса требуется: " + +#: access/heap/vacuumlazy.c:810 +#, c-format +msgid "" +"%u pages from table (%.2f%% of total) had %lld dead item identifiers " +"removed\n" +msgstr "" +"на страницах таблицы (%u, %.2f%% от общего числа) удалено мёртвых " +"идентификаторов элементов: %lld\n" -#: access/heap/vacuumlazy.c:676 +#: access/heap/vacuumlazy.c:815 +msgid "index scan bypassed: " +msgstr "сканирование индекса пропущено: " + +#: access/heap/vacuumlazy.c:817 +msgid "index scan bypassed by failsafe: " +msgstr "сканирование индекса пропущено из-за защиты: " + +#: access/heap/vacuumlazy.c:819 #, c-format -msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" +msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" msgstr "" -"использование буфера: попаданий: %lld, промахов: %lld, «грязных» записей: " -"%lld\n" +"на страницах таблицы (%u, %.2f%% от общего числа) находится мёртвых " +"идентификаторов элементов: %lld\n" + +#: access/heap/vacuumlazy.c:834 +#, c-format +msgid "" +"index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u " +"reusable\n" +msgstr "" +"индекс \"%s\": всего страниц: %u, сейчас удалено: %u, удалено на данный " +"момент: %u, свободно: %u\n" + +#: access/heap/vacuumlazy.c:846 commands/analyze.c:814 +#, c-format +msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" +msgstr "время ввода/вывода: чтение: %.3f мс, запись: %.3f мс\n" -#: access/heap/vacuumlazy.c:680 +#: access/heap/vacuumlazy.c:849 commands/analyze.c:817 #, c-format msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" msgstr "" "средняя скорость чтения: %.3f МБ/с, средняя скорость записи: %.3f МБ/с\n" -#: access/heap/vacuumlazy.c:682 +#: access/heap/vacuumlazy.c:852 commands/analyze.c:819 #, c-format -msgid "system usage: %s\n" -msgstr "нагрузка системы: %s\n" +msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" +msgstr "" +"использование буфера: попаданий: %lld, промахов: %lld, «грязных» записей: " +"%lld\n" -#: access/heap/vacuumlazy.c:684 +#: access/heap/vacuumlazy.c:857 #, c-format -msgid "WAL usage: %ld records, %ld full page images, %llu bytes" +msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" msgstr "" -"использование WAL: записей: %ld, полных образов страниц: %ld, байт: %llu" +"использование WAL: записей: %lld, полных образов страниц: %lld, байт: %llu\n" -#: access/heap/vacuumlazy.c:795 +#: access/heap/vacuumlazy.c:861 commands/analyze.c:823 +#, c-format +msgid "system usage: %s" +msgstr "нагрузка системы: %s" + +#: access/heap/vacuumlazy.c:933 #, c-format msgid "aggressively vacuuming \"%s.%s\"" msgstr "агрессивная очистка \"%s.%s\"" -#: access/heap/vacuumlazy.c:800 commands/cluster.c:874 +#: access/heap/vacuumlazy.c:938 commands/cluster.c:898 #, c-format msgid "vacuuming \"%s.%s\"" msgstr "очистка \"%s.%s\"" -#: access/heap/vacuumlazy.c:837 +#: access/heap/vacuumlazy.c:1640 access/heap/vacuumlazy.c:2385 #, c-format -msgid "" -"disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary " -"tables in parallel" +msgid "table \"%s\": removed %lld dead item identifiers in %u pages" msgstr "" -"отключение параллельного режима очистки \"%s\" --- создавать временные " -"таблицы в параллельном режиме нельзя" - -#: access/heap/vacuumlazy.c:1725 -#, c-format -msgid "\"%s\": removed %.0f row versions in %u pages" -msgstr "\"%s\": удалено версий строк: %.0f, обработано страниц: %u" +"таблица \"%s\": удалено мёртвых идентификаторов элементов: %lld, на " +"страницах: %u" -#: access/heap/vacuumlazy.c:1735 +#: access/heap/vacuumlazy.c:1656 #, c-format -msgid "%.0f dead row versions cannot be removed yet, oldest xmin: %u\n" +msgid "%lld dead row versions cannot be removed yet, oldest xmin: %u\n" msgstr "" -"В данный момент нельзя удалить \"мёртвых\" строк: %.0f, старейший xmin: %u\n" - -#: access/heap/vacuumlazy.c:1737 -#, c-format -msgid "There were %.0f unused item identifiers.\n" -msgstr "Найдено неиспользованных идентификаторов элементов: %.0f.\n" +"в данный момент нельзя удалить \"мёртвых\" строк: %lld, старейший xmin: %u\n" -#: access/heap/vacuumlazy.c:1739 +#: access/heap/vacuumlazy.c:1658 #, c-format msgid "Skipped %u page due to buffer pins, " msgid_plural "Skipped %u pages due to buffer pins, " @@ -1286,7 +1371,7 @@ msgstr[0] "Пропущено страниц, закреплённых в буф msgstr[1] "Пропущено страниц, закреплённых в буфере: %u," msgstr[2] "Пропущено страниц, закреплённых в буфере: %u," -#: access/heap/vacuumlazy.c:1743 +#: access/heap/vacuumlazy.c:1662 #, c-format msgid "%u frozen page.\n" msgid_plural "%u frozen pages.\n" @@ -1294,35 +1379,58 @@ msgstr[0] "замороженных страниц: %u.\n" msgstr[1] "замороженных страниц: %u.\n" msgstr[2] "замороженных страниц: %u.\n" -#: access/heap/vacuumlazy.c:1747 -#, c-format -msgid "%u page is entirely empty.\n" -msgid_plural "%u pages are entirely empty.\n" -msgstr[0] "Полностью пустых страниц: %u.\n" -msgstr[1] "Полностью пустых страниц: %u.\n" -msgstr[2] "Полностью пустых страниц: %u.\n" - -#: access/heap/vacuumlazy.c:1751 commands/indexcmds.c:3490 -#: commands/indexcmds.c:3508 +#: access/heap/vacuumlazy.c:1666 commands/indexcmds.c:3986 +#: commands/indexcmds.c:4005 #, c-format msgid "%s." msgstr "%s." -#: access/heap/vacuumlazy.c:1754 +#: access/heap/vacuumlazy.c:1669 +#, c-format +msgid "" +"table \"%s\": found %lld removable, %lld nonremovable row versions in %u out " +"of %u pages" +msgstr "" +"таблица \"%s\": найдено удаляемых версий строк: %lld, неудаляемых: %lld, " +"обработано страниц: %u, всего страниц: %u" + +#: access/heap/vacuumlazy.c:2173 +#, c-format +msgid "" +"table \"%s\": index scan bypassed: %u pages from table (%.2f%% of total) " +"have %lld dead item identifiers" +msgstr "" +"таблица \"%s\": сканирование индекса пропущено: на страницах таблицы (%u, " +"%.2f%% от общего числа) находится мёртвых идентификаторов элементов: %lld" + +#: access/heap/vacuumlazy.c:2617 #, c-format msgid "" -"\"%s\": found %.0f removable, %.0f nonremovable row versions in %u out of %u " -"pages" +"bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after " +"%d index scans" msgstr "" -"\"%s\": найдено удаляемых версий строк: %.0f, неудаляемых - %.0f, обработано " -"страниц: %u, всего страниц: %u" +"несущественная операция обслуживания таблицы \"%s.%s.%s\" пропускается в " +"качестве меры защиты после %d сканирований индекса" + +#: access/heap/vacuumlazy.c:2622 +#, c-format +msgid "The table's relfrozenxid or relminmxid is too far in the past." +msgstr "Значение relfrozenxid или relminmxid таблицы слишком далеко в прошлом." -#: access/heap/vacuumlazy.c:1888 +#: access/heap/vacuumlazy.c:2623 #, c-format -msgid "\"%s\": removed %d row versions in %d pages" -msgstr "\"%s\": удалено версий строк: %d, обработано страниц: %d" +msgid "" +"Consider increasing configuration parameter \"maintenance_work_mem\" or " +"\"autovacuum_work_mem\".\n" +"You might also need to consider other ways for VACUUM to keep up with the " +"allocation of transaction IDs." +msgstr "" +"Вероятно, стоит увеличить параметр конфигурации \"maintenance_work_mem\" или " +"\"autovacuum_work_mem\".\n" +"Также можно рассмотреть другие способы обеспечения производительности " +"VACUUM, соответствующей скорости выделения идентификаторов транзакций." -#: access/heap/vacuumlazy.c:2143 +#: access/heap/vacuumlazy.c:2763 #, c-format msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" msgid_plural "" @@ -1337,7 +1445,7 @@ msgstr[2] "" "запущено %d параллельных процессов очистки для уборки индекса " "(планировалось: %d)" -#: access/heap/vacuumlazy.c:2149 +#: access/heap/vacuumlazy.c:2769 #, c-format msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" msgid_plural "" @@ -1352,78 +1460,101 @@ msgstr[2] "" "запущено %d параллельных процессов очистки для очистки индекса " "(планировалось: %d)" -#: access/heap/vacuumlazy.c:2440 +#: access/heap/vacuumlazy.c:3063 #, c-format msgid "scanned index \"%s\" to remove %d row versions" msgstr "просканирован индекс \"%s\", удалено версий строк: %d" -#: access/heap/vacuumlazy.c:2494 +#: access/heap/vacuumlazy.c:3120 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "индекс \"%s\" теперь содержит версий строк: %.0f, в страницах: %u" -#: access/heap/vacuumlazy.c:2498 +#: access/heap/vacuumlazy.c:3124 #, c-format msgid "" "%.0f index row versions were removed.\n" -"%u index pages have been deleted, %u are currently reusable.\n" +"%u index pages were newly deleted.\n" +"%u index pages are currently deleted, of which %u are currently reusable.\n" "%s." msgstr "" "Удалено версий строк индекса: %.0f.\n" -"Удалено индексных страниц: %u, пригодно для повторного использования: %u.\n" +"Сейчас удалено страниц индекса: %u.\n" +"На данный момент удалено страниц индекса: %u, из них свободны для " +"использования: %u.\n" "%s." -#: access/heap/vacuumlazy.c:2601 +#: access/heap/vacuumlazy.c:3233 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\": остановка усечения из-за конфликтующего запроса блокировки" -#: access/heap/vacuumlazy.c:2667 +#: access/heap/vacuumlazy.c:3299 +#, c-format +msgid "table \"%s\": truncated %u to %u pages" +msgstr "таблица \"%s\": усечение (было страниц: %u, стало: %u)" + +#: access/heap/vacuumlazy.c:3363 +#, c-format +msgid "table \"%s\": suspending truncate due to conflicting lock request" +msgstr "" +"таблица \"%s\": приостановка усечения из-за конфликтующего запроса блокировки" + +#: access/heap/vacuumlazy.c:3508 #, c-format -msgid "\"%s\": truncated %u to %u pages" -msgstr "\"%s\": усечение (было страниц: %u, стало: %u)" +msgid "" +"disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary " +"tables in parallel" +msgstr "" +"отключение параллельного режима очистки \"%s\" --- создавать временные " +"таблицы в параллельном режиме нельзя" -#: access/heap/vacuumlazy.c:2732 +#: access/heap/vacuumlazy.c:4274 #, c-format -msgid "\"%s\": suspending truncate due to conflicting lock request" -msgstr "\"%s\": приостановка усечения из-за конфликтующего запроса блокировки" +msgid "while scanning block %u offset %u of relation \"%s.%s\"" +msgstr "при сканировании блока %u (смещение %u) отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3581 +#: access/heap/vacuumlazy.c:4277 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "при сканировании блока %u отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3584 +#: access/heap/vacuumlazy.c:4281 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "при сканировании отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3590 +#: access/heap/vacuumlazy.c:4289 +#, c-format +msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" +msgstr "при очистке блока %u (смещение %u) отношения \"%s.%s\"" + +#: access/heap/vacuumlazy.c:4292 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "при очистке блока %u отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3593 +#: access/heap/vacuumlazy.c:4296 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "при очистке отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3598 +#: access/heap/vacuumlazy.c:4301 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "при очистке индекса \"%s\" отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3603 +#: access/heap/vacuumlazy.c:4306 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "при уборке индекса \"%s\" отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3609 +#: access/heap/vacuumlazy.c:4312 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "при усечении отношения \"%s.%s\" до %u блок." -#: access/index/amapi.c:83 commands/amcmds.c:170 +#: access/index/amapi.c:83 commands/amcmds.c:143 #, c-format msgid "access method \"%s\" is not of type %s" msgstr "метод доступа \"%s\" имеет не тип %s" @@ -1433,40 +1564,45 @@ msgstr "метод доступа \"%s\" имеет не тип %s" msgid "index access method \"%s\" does not have a handler" msgstr "для метода доступа индекса \"%s\" не задан обработчик" -#: access/index/indexam.c:142 catalog/objectaddress.c:1260 -#: commands/indexcmds.c:2518 commands/tablecmds.c:254 commands/tablecmds.c:278 -#: commands/tablecmds.c:15755 commands/tablecmds.c:17210 +#: access/index/genam.c:486 +#, c-format +msgid "transaction aborted during system catalog scan" +msgstr "транзакция прервана во время сканирования системного каталога" + +#: access/index/indexam.c:142 catalog/objectaddress.c:1355 +#: commands/indexcmds.c:2670 commands/tablecmds.c:267 commands/tablecmds.c:291 +#: commands/tablecmds.c:16537 commands/tablecmds.c:18274 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" - это не индекс" -#: access/index/indexam.c:970 +#: access/index/indexam.c:973 #, c-format msgid "operator class %s has no options" msgstr "у класса операторов %s нет параметров" -#: access/nbtree/nbtinsert.c:651 +#: access/nbtree/nbtinsert.c:665 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "повторяющееся значение ключа нарушает ограничение уникальности \"%s\"" -#: access/nbtree/nbtinsert.c:653 +#: access/nbtree/nbtinsert.c:667 #, c-format msgid "Key %s already exists." msgstr "Ключ \"%s\" уже существует." -#: access/nbtree/nbtinsert.c:747 +#: access/nbtree/nbtinsert.c:761 #, c-format msgid "This may be because of a non-immutable index expression." msgstr "Возможно, это вызвано переменной природой индексного выражения." -#: access/nbtree/nbtpage.c:150 access/nbtree/nbtpage.c:538 -#: parser/parse_utilcmd.c:2268 +#: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 +#: parser/parse_utilcmd.c:2319 #, c-format msgid "index \"%s\" is not a btree" msgstr "индекс \"%s\" не является b-деревом" -#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:545 +#: access/nbtree/nbtpage.c:166 access/nbtree/nbtpage.c:615 #, c-format msgid "" "version mismatch in index \"%s\": file version %d, current version %d, " @@ -1475,12 +1611,12 @@ msgstr "" "несовпадение версии в индексе \"%s\": версия файла: %d, версия кода: %d, " "минимальная поддерживаемая версия: %d" -#: access/nbtree/nbtpage.c:1501 +#: access/nbtree/nbtpage.c:1875 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "индекс \"%s\" содержит полумёртвую внутреннюю страницу" -#: access/nbtree/nbtpage.c:1503 +#: access/nbtree/nbtpage.c:1877 #, c-format msgid "" "This can be caused by an interrupted VACUUM in version 9.3 or older, before " @@ -1489,7 +1625,7 @@ msgstr "" "Причиной тому могло быть прерывание операции VACUUM в версии 9.3 или старее, " "до обновления. Этот индекс нужно перестроить (REINDEX)." -#: access/nbtree/nbtutils.c:2664 +#: access/nbtree/nbtutils.c:2665 #, c-format msgid "" "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" @@ -1497,12 +1633,12 @@ msgstr "" "размер строки индекса (%zu) больше предельного для btree версии %u размера " "(%zu) (индекс \"%s\")" -#: access/nbtree/nbtutils.c:2670 +#: access/nbtree/nbtutils.c:2671 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "Строка индекса ссылается на кортеж (%u,%u) в отношении \"%s\"." -#: access/nbtree/nbtutils.c:2674 +#: access/nbtree/nbtutils.c:2675 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1514,7 +1650,7 @@ msgstr "" "Возможно, вам стоит применить индекс функции с MD5-хешем значения или " "полнотекстовую индексацию." -#: access/nbtree/nbtvalidate.c:243 +#: access/nbtree/nbtvalidate.c:246 #, c-format msgid "" "operator family \"%s\" of access method %s is missing support function for " @@ -1523,7 +1659,7 @@ msgstr "" "в семействе операторов \"%s\" метода доступа %s нет опорной функции для " "типов %s и %s" -#: access/spgist/spgutils.c:147 +#: access/spgist/spgutils.c:244 #, c-format msgid "" "compress method must be defined when leaf type is different from input type" @@ -1531,12 +1667,19 @@ msgstr "" "метод сжатия должен быть определён, когда тип листьев отличается от входного " "типа" -#: access/spgist/spgutils.c:761 +#: access/spgist/spgutils.c:1017 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "внутренний размер кортежа SP-GiST (%zu) превышает максимум (%zu)" -#: access/spgist/spgvalidate.c:281 +#: access/spgist/spgvalidate.c:136 +#, c-format +msgid "SP-GiST leaf data type %s does not match declared type %s" +msgstr "" +"в листовом кортеже SP-GiST тип данных %s не соответствует объявленному типу " +"%s" + +#: access/spgist/spgvalidate.c:302 #, c-format msgid "" "operator family \"%s\" of access method %s is missing support function %d " @@ -1545,19 +1688,20 @@ msgstr "" "в семействе операторов \"%s\" метода доступа %s нет опорной функции %d для " "типа %s" -#: access/table/table.c:49 access/table/table.c:78 access/table/table.c:111 -#: catalog/aclchk.c:1809 +#: access/table/table.c:49 access/table/table.c:83 access/table/table.c:112 +#: access/table/table.c:145 catalog/aclchk.c:1792 #, c-format msgid "\"%s\" is an index" msgstr "\"%s\" - это индекс" -#: access/table/table.c:54 access/table/table.c:83 access/table/table.c:116 -#: catalog/aclchk.c:1816 commands/tablecmds.c:12572 commands/tablecmds.c:15764 +#: access/table/table.c:54 access/table/table.c:88 access/table/table.c:117 +#: access/table/table.c:150 catalog/aclchk.c:1799 commands/tablecmds.c:13238 +#: commands/tablecmds.c:16546 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\" - это составной тип" -#: access/table/tableam.c:244 +#: access/table/tableam.c:266 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "идентификатор кортежа (%u, %u) недопустим для отношения \"%s\"" @@ -1568,7 +1712,7 @@ msgid "%s cannot be empty." msgstr "Значение %s не может быть пустым." # well-spelled: симв -#: access/table/tableamapi.c:122 utils/misc/guc.c:11956 +#: access/table/tableamapi.c:122 utils/misc/guc.c:12439 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "Длина %s превышает предел (%d симв.)." @@ -1588,29 +1732,29 @@ msgstr "Табличный метод доступа \"%s\" не существ msgid "sample percentage must be between 0 and 100" msgstr "процент выборки должен задаваться числом от 0 до 100" -#: access/transam/commit_ts.c:295 +#: access/transam/commit_ts.c:280 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "не удалось получить метку времени фиксации транзакции %u" -#: access/transam/commit_ts.c:393 +#: access/transam/commit_ts.c:378 #, c-format msgid "could not get commit timestamp data" msgstr "не удалось получить отметку времени фиксации" -#: access/transam/commit_ts.c:395 +#: access/transam/commit_ts.c:380 #, c-format msgid "" -"Make sure the configuration parameter \"%s\" is set on the master server." +"Make sure the configuration parameter \"%s\" is set on the primary server." msgstr "" -"Убедитесь, что в конфигурации главного сервера установлен параметр \"%s\"." +"Убедитесь, что в конфигурации ведущего сервера установлен параметр \"%s\"." -#: access/transam/commit_ts.c:397 +#: access/transam/commit_ts.c:382 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Убедитесь, что в конфигурации установлен параметр \"%s\"." -#: access/transam/multixact.c:1002 +#: access/transam/multixact.c:1021 #, c-format msgid "" "database is not accepting commands that generate new MultiXactIds to avoid " @@ -1619,8 +1763,8 @@ msgstr "" "база данных не принимает команды, создающие новые MultiXactId, во избежание " "потери данных из-за зацикливания в базе данных \"%s\"" -#: access/transam/multixact.c:1004 access/transam/multixact.c:1011 -#: access/transam/multixact.c:1035 access/transam/multixact.c:1044 +#: access/transam/multixact.c:1023 access/transam/multixact.c:1030 +#: access/transam/multixact.c:1054 access/transam/multixact.c:1063 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" @@ -1631,7 +1775,7 @@ msgstr "" "Возможно, вам также придётся зафиксировать или откатить старые " "подготовленные транзакции и удалить неиспользуемые слоты репликации." -#: access/transam/multixact.c:1009 +#: access/transam/multixact.c:1028 #, c-format msgid "" "database is not accepting commands that generate new MultiXactIds to avoid " @@ -1640,7 +1784,7 @@ msgstr "" "база данных не принимает команды, создающие новые MultiXactId, во избежание " "потери данных из-за зацикливания в базе данных с OID %u" -#: access/transam/multixact.c:1030 access/transam/multixact.c:2322 +#: access/transam/multixact.c:1049 access/transam/multixact.c:2333 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "" @@ -1655,7 +1799,7 @@ msgstr[2] "" "база данных \"%s\" должна быть очищена, прежде чем будут использованы " "оставшиеся MultiXactId (%u)" -#: access/transam/multixact.c:1039 access/transam/multixact.c:2331 +#: access/transam/multixact.c:1058 access/transam/multixact.c:2342 #, c-format msgid "" "database with OID %u must be vacuumed before %u more MultiXactId is used" @@ -1671,12 +1815,12 @@ msgstr[2] "" "база данных с OID %u должна быть очищена, прежде чем будут использованы " "оставшиеся MultiXactId (%u)" -#: access/transam/multixact.c:1100 +#: access/transam/multixact.c:1119 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "слишком много членов мультитранзакции" -#: access/transam/multixact.c:1101 +#: access/transam/multixact.c:1120 #, c-format msgid "" "This command would create a multixact with %u members, but the remaining " @@ -1694,7 +1838,7 @@ msgstr[2] "" "Мультитранзакция, создаваемая этой командой, должна включать членов: %u, но " "оставшегося места хватает только для %u." -#: access/transam/multixact.c:1106 +#: access/transam/multixact.c:1125 #, c-format msgid "" "Execute a database-wide VACUUM in database with OID %u with reduced " @@ -1704,7 +1848,7 @@ msgstr "" "Выполните очистку (VACUUM) всей базы данных с OID %u, уменьшив значения " "vacuum_multixact_freeze_min_age и vacuum_multixact_freeze_table_age." -#: access/transam/multixact.c:1137 +#: access/transam/multixact.c:1156 #, c-format msgid "" "database with OID %u must be vacuumed before %d more multixact member is used" @@ -1721,7 +1865,7 @@ msgstr[2] "" "база данных с OID %u должна быть очищена, пока не использованы оставшиеся " "члены мультитранзакций (%d)" -#: access/transam/multixact.c:1142 +#: access/transam/multixact.c:1161 #, c-format msgid "" "Execute a database-wide VACUUM in that database with reduced " @@ -1731,26 +1875,19 @@ msgstr "" "Выполните очистку (VACUUM) всей этой базы данных, уменьшив значения " "vacuum_multixact_freeze_min_age и vacuum_multixact_freeze_table_age." -#: access/transam/multixact.c:1279 +#: access/transam/multixact.c:1300 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "MultiXactId %u прекратил существование: видимо, произошло зацикливание" -#: access/transam/multixact.c:1287 +#: access/transam/multixact.c:1306 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "MultiXactId %u ещё не был создан: видимо, произошло зацикливание" -#: access/transam/multixact.c:2272 -#, c-format -msgid "MultiXactId wrap limit is %u, limited by database with OID %u" -msgstr "" -"предел зацикливания MultiXactId равен %u, источник ограничения - база данных " -"с OID %u" - -#: access/transam/multixact.c:2327 access/transam/multixact.c:2336 -#: access/transam/varsup.c:149 access/transam/varsup.c:156 -#: access/transam/varsup.c:447 access/transam/varsup.c:454 +#: access/transam/multixact.c:2338 access/transam/multixact.c:2347 +#: access/transam/varsup.c:151 access/transam/varsup.c:158 +#: access/transam/varsup.c:466 access/transam/varsup.c:473 #, c-format msgid "" "To avoid a database shutdown, execute a database-wide VACUUM in that " @@ -1762,12 +1899,7 @@ msgstr "" "Возможно, вам также придётся зафиксировать или откатить старые " "подготовленные транзакции и удалить неиспользуемые слоты репликации." -#: access/transam/multixact.c:2606 -#, c-format -msgid "oldest MultiXactId member is at offset %u" -msgstr "смещение членов старейшей мультитранзакции: %u" - -#: access/transam/multixact.c:2610 +#: access/transam/multixact.c:2621 #, c-format msgid "" "MultiXact member wraparound protections are disabled because oldest " @@ -1776,19 +1908,12 @@ msgstr "" "Защита от зацикливания членов мультитранзакций отключена, так как старейшая " "отмеченная мультитранзакция %u не найдена на диске" -#: access/transam/multixact.c:2632 +#: access/transam/multixact.c:2643 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "Защита от зацикливания мультитранзакций сейчас включена" -#: access/transam/multixact.c:2635 -#, c-format -msgid "MultiXact member stop limit is now %u based on MultiXact %u" -msgstr "" -"Граница членов мультитранзакции сейчас: %u (при старейшей мультитранзакции " -"%u)" - -#: access/transam/multixact.c:3023 +#: access/transam/multixact.c:3030 #, c-format msgid "" "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" @@ -1796,7 +1921,7 @@ msgstr "" "старейшая мультитранзакция %u не найдена, новейшая мультитранзакция: %u, " "усечение пропускается" -#: access/transam/multixact.c:3041 +#: access/transam/multixact.c:3048 #, c-format msgid "" "cannot truncate up to MultiXact %u because it does not exist on disk, " @@ -1805,96 +1930,96 @@ msgstr "" "выполнить усечение до мультитранзакции %u нельзя ввиду её отсутствия на " "диске, усечение пропускается" -#: access/transam/multixact.c:3355 +#: access/transam/multixact.c:3362 #, c-format msgid "invalid MultiXactId: %u" msgstr "неверный MultiXactId: %u" -#: access/transam/parallel.c:706 access/transam/parallel.c:825 +#: access/transam/parallel.c:718 access/transam/parallel.c:837 #, c-format msgid "parallel worker failed to initialize" msgstr "не удалось инициализировать параллельный исполнитель" -#: access/transam/parallel.c:707 access/transam/parallel.c:826 +#: access/transam/parallel.c:719 access/transam/parallel.c:838 #, c-format msgid "More details may be available in the server log." msgstr "Дополнительная информация может быть в журнале сервера." -#: access/transam/parallel.c:887 +#: access/transam/parallel.c:899 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "postmaster завершился в процессе параллельной транзакции" -#: access/transam/parallel.c:1074 +#: access/transam/parallel.c:1086 #, c-format msgid "lost connection to parallel worker" msgstr "потеряно подключение к параллельному исполнителю" -#: access/transam/parallel.c:1140 access/transam/parallel.c:1142 +#: access/transam/parallel.c:1152 access/transam/parallel.c:1154 msgid "parallel worker" msgstr "параллельный исполнитель" -#: access/transam/parallel.c:1293 +#: access/transam/parallel.c:1307 #, c-format msgid "could not map dynamic shared memory segment" msgstr "не удалось отобразить динамический сегмент разделяемой памяти" -#: access/transam/parallel.c:1298 +#: access/transam/parallel.c:1312 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "неверное магическое число в динамическом сегменте разделяемой памяти" -#: access/transam/slru.c:696 +#: access/transam/slru.c:712 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "файл \"%s\" не существует, считается нулевым" -#: access/transam/slru.c:937 access/transam/slru.c:943 -#: access/transam/slru.c:951 access/transam/slru.c:956 -#: access/transam/slru.c:963 access/transam/slru.c:968 -#: access/transam/slru.c:975 access/transam/slru.c:982 +#: access/transam/slru.c:944 access/transam/slru.c:950 +#: access/transam/slru.c:958 access/transam/slru.c:963 +#: access/transam/slru.c:970 access/transam/slru.c:975 +#: access/transam/slru.c:982 access/transam/slru.c:989 #, c-format msgid "could not access status of transaction %u" msgstr "не удалось получить состояние транзакции %u" -#: access/transam/slru.c:938 +#: access/transam/slru.c:945 #, c-format msgid "Could not open file \"%s\": %m." msgstr "Не удалось открыть файл \"%s\": %m." -#: access/transam/slru.c:944 +#: access/transam/slru.c:951 #, c-format msgid "Could not seek in file \"%s\" to offset %u: %m." msgstr "Не удалось переместиться в файле \"%s\" к смещению %u: %m." -#: access/transam/slru.c:952 +#: access/transam/slru.c:959 #, c-format msgid "Could not read from file \"%s\" at offset %u: %m." msgstr "Не удалось прочитать файл \"%s\" (по смещению %u): %m." -#: access/transam/slru.c:957 +#: access/transam/slru.c:964 #, c-format msgid "Could not read from file \"%s\" at offset %u: read too few bytes." msgstr "" "Не удалось прочитать файл \"%s\" (по смещению %u): прочитаны не все байты." -#: access/transam/slru.c:964 +#: access/transam/slru.c:971 #, c-format msgid "Could not write to file \"%s\" at offset %u: %m." msgstr "Не удалось записать в файл \"%s\" (по смещению %u): %m." -#: access/transam/slru.c:969 +#: access/transam/slru.c:976 #, c-format msgid "Could not write to file \"%s\" at offset %u: wrote too few bytes." msgstr "" "Не удалось записать в файл \"%s\" (по смещению %u): записаны не все байты." -#: access/transam/slru.c:976 +#: access/transam/slru.c:983 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "Не удалось синхронизировать с ФС файл \"%s\": %m." -#: access/transam/slru.c:983 +#: access/transam/slru.c:990 #, c-format msgid "Could not close file \"%s\": %m." msgstr "Не удалось закрыть файл \"%s\": %m." @@ -1904,11 +2029,6 @@ msgstr "Не удалось закрыть файл \"%s\": %m." msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "не удалось очистить каталог \"%s\": видимо, произошло зацикливание" -#: access/transam/slru.c:1309 access/transam/slru.c:1365 -#, c-format -msgid "removing file \"%s\"" -msgstr "удаляется файл \"%s\"" - #: access/transam/timeline.c:163 access/transam/timeline.c:168 #, c-format msgid "syntax error in history file: %s" @@ -1970,39 +2090,39 @@ msgstr "Установите ненулевое значение парамет msgid "transaction identifier \"%s\" is already in use" msgstr "идентификатор транзакции \"%s\" уже используется" -#: access/transam/twophase.c:417 access/transam/twophase.c:2368 +#: access/transam/twophase.c:417 access/transam/twophase.c:2449 #, c-format msgid "maximum number of prepared transactions reached" msgstr "достигнут предел числа подготовленных транзакций" -#: access/transam/twophase.c:418 access/transam/twophase.c:2369 +#: access/transam/twophase.c:418 access/transam/twophase.c:2450 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "Увеличьте параметр max_prepared_transactions (текущее значение %d)." -#: access/transam/twophase.c:586 +#: access/transam/twophase.c:594 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "подготовленная транзакция с идентификатором \"%s\" занята" -#: access/transam/twophase.c:592 +#: access/transam/twophase.c:600 #, c-format msgid "permission denied to finish prepared transaction" msgstr "нет доступа для завершения подготовленной транзакции" -#: access/transam/twophase.c:593 +#: access/transam/twophase.c:601 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "" "Это разрешено только суперпользователю и пользователю, подготовившему " "транзакцию." -#: access/transam/twophase.c:604 +#: access/transam/twophase.c:612 #, c-format msgid "prepared transaction belongs to another database" msgstr "подготовленная транзакция относится к другой базе данных" -#: access/transam/twophase.c:605 +#: access/transam/twophase.c:613 #, c-format msgid "" "Connect to the database where the transaction was prepared to finish it." @@ -2011,69 +2131,79 @@ msgstr "" "подготовлена." # [SM]: TO REVIEW -#: access/transam/twophase.c:620 +#: access/transam/twophase.c:628 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "подготовленной транзакции с идентификатором \"%s\" нет" -#: access/transam/twophase.c:1098 +#: access/transam/twophase.c:1149 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "превышен предельный размер файла состояния 2PC" -#: access/transam/twophase.c:1252 +#: access/transam/twophase.c:1303 #, c-format -msgid "incorrect size of file \"%s\": %zu byte" -msgid_plural "incorrect size of file \"%s\": %zu bytes" -msgstr[0] "некорректный размер файла \"%s\": %zu Б" -msgstr[1] "некорректный размер файла \"%s\": %zu Б" -msgstr[2] "некорректный размер файла \"%s\": %zu Б" +msgid "incorrect size of file \"%s\": %lld byte" +msgid_plural "incorrect size of file \"%s\": %lld bytes" +msgstr[0] "некорректный размер файла \"%s\": %lld Б" +msgstr[1] "некорректный размер файла \"%s\": %lld Б" +msgstr[2] "некорректный размер файла \"%s\": %lld Б" -#: access/transam/twophase.c:1261 +#: access/transam/twophase.c:1312 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "некорректное выравнивание смещения CRC для файла \"%s\"" -#: access/transam/twophase.c:1294 +#: access/transam/twophase.c:1330 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %lld)" + +#: access/transam/twophase.c:1345 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "в файле \"%s\" содержится неверная сигнатура" -#: access/transam/twophase.c:1300 +#: access/transam/twophase.c:1351 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "в файле \"%s\" содержится неверный размер" -#: access/transam/twophase.c:1312 +#: access/transam/twophase.c:1363 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "" "вычисленная контрольная сумма (CRC) не соответствует значению, сохранённому " "в файле \"%s\"" -#: access/transam/twophase.c:1342 access/transam/xlog.c:6488 +#: access/transam/twophase.c:1398 access/transam/xlog.c:6678 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Не удалось разместить обработчик журнала транзакций." -#: access/transam/twophase.c:1349 +#: access/transam/twophase.c:1415 +#, c-format +msgid "could not read two-phase state from WAL at %X/%X: %s" +msgstr "не удалось прочитать состояние 2PC из WAL в позиции %X/%X: %s" + +#: access/transam/twophase.c:1420 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "не удалось прочитать состояние 2PC из WAL в позиции %X/%X" -#: access/transam/twophase.c:1357 +#: access/transam/twophase.c:1428 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "" "ожидаемые данные состояния двухфазной фиксации отсутствуют в WAL в позиции " "%X/%X" -#: access/transam/twophase.c:1637 +#: access/transam/twophase.c:1705 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "пересоздать файл \"%s\" не удалось: %m" -#: access/transam/twophase.c:1764 +#: access/transam/twophase.c:1832 #, c-format msgid "" "%u two-phase state file was written for a long-running prepared transaction" @@ -2086,42 +2216,42 @@ msgstr[1] "" msgstr[2] "" "для длительных подготовленных транзакций записано файлов состояния 2PC: %u" -#: access/transam/twophase.c:1998 +#: access/transam/twophase.c:2066 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "восстановление подготовленной транзакции %u из разделяемой памяти" -#: access/transam/twophase.c:2089 +#: access/transam/twophase.c:2157 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "удаление устаревшего файла состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2096 +#: access/transam/twophase.c:2164 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "удаление из памяти устаревшего состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2109 +#: access/transam/twophase.c:2177 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "удаление файла будущего состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2116 +#: access/transam/twophase.c:2184 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "удаление из памяти будущего состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2141 +#: access/transam/twophase.c:2209 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "испорчен файл состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2146 +#: access/transam/twophase.c:2214 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "испорчено состояние 2PC в памяти для транзакции %u" -#: access/transam/varsup.c:127 +#: access/transam/varsup.c:129 #, c-format msgid "" "database is not accepting commands to avoid wraparound data loss in database " @@ -2130,7 +2260,7 @@ msgstr "" "база данных не принимает команды во избежание потери данных из-за " "зацикливания транзакций в базе данных \"%s\"" -#: access/transam/varsup.c:129 access/transam/varsup.c:136 +#: access/transam/varsup.c:131 access/transam/varsup.c:138 #, c-format msgid "" "Stop the postmaster and vacuum that database in single-user mode.\n" @@ -2142,7 +2272,7 @@ msgstr "" "Возможно, вам также придётся зафиксировать или откатить старые " "подготовленные транзакции и удалить неиспользуемые слоты репликации." -#: access/transam/varsup.c:134 +#: access/transam/varsup.c:136 #, c-format msgid "" "database is not accepting commands to avoid wraparound data loss in database " @@ -2151,202 +2281,181 @@ msgstr "" "база данных не принимает команды во избежание потери данных из-за " "зацикливания транзакций в базе данных с OID %u" -#: access/transam/varsup.c:146 access/transam/varsup.c:444 +#: access/transam/varsup.c:148 access/transam/varsup.c:463 #, c-format msgid "database \"%s\" must be vacuumed within %u transactions" msgstr "" "база данных \"%s\" должна быть очищена (предельное число транзакций: %u)" -#: access/transam/varsup.c:153 access/transam/varsup.c:451 +#: access/transam/varsup.c:155 access/transam/varsup.c:470 #, c-format msgid "database with OID %u must be vacuumed within %u transactions" msgstr "" "база данных с OID %u должна быть очищена (предельное число транзакций: %u)" -#: access/transam/varsup.c:409 -#, c-format -msgid "transaction ID wrap limit is %u, limited by database with OID %u" -msgstr "" -"предел зацикливания ID транзакций равен %u, источник ограничения - база " -"данных с OID %u" - -#: access/transam/xact.c:1030 +#: access/transam/xact.c:1046 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "в одной транзакции не может быть больше 2^32-2 команд" -#: access/transam/xact.c:1555 +#: access/transam/xact.c:1583 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "превышен предел числа зафиксированных подтранзакций (%d)" -#: access/transam/xact.c:2396 +#: access/transam/xact.c:2434 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "" "нельзя выполнить PREPARE для транзакции, оперирующей с временными объектами" -#: access/transam/xact.c:2406 +#: access/transam/xact.c:2444 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "нельзя выполнить PREPARE для транзакции, снимки которой экспортированы" -#: access/transam/xact.c:2415 -#, c-format -msgid "" -"cannot PREPARE a transaction that has manipulated logical replication workers" -msgstr "" -"нельзя выполнить PREPARE для транзакции, задействующей процессы логической " -"репликации" - #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3360 +#: access/transam/xact.c:3408 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s не может выполняться внутри блока транзакции" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3370 +#: access/transam/xact.c:3418 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%s не может выполняться внутри подтранзакции" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3380 +#: access/transam/xact.c:3428 #, c-format msgid "%s cannot be executed from a function" msgstr "%s нельзя выполнять внутри функции" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3449 access/transam/xact.c:3755 -#: access/transam/xact.c:3834 access/transam/xact.c:3957 -#: access/transam/xact.c:4108 access/transam/xact.c:4177 -#: access/transam/xact.c:4288 +#: access/transam/xact.c:3497 access/transam/xact.c:3803 +#: access/transam/xact.c:3882 access/transam/xact.c:4005 +#: access/transam/xact.c:4156 access/transam/xact.c:4225 +#: access/transam/xact.c:4336 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s может выполняться только внутри блоков транзакций" -#: access/transam/xact.c:3641 +#: access/transam/xact.c:3689 #, c-format msgid "there is already a transaction in progress" msgstr "транзакция уже выполняется" -#: access/transam/xact.c:3760 access/transam/xact.c:3839 -#: access/transam/xact.c:3962 +#: access/transam/xact.c:3808 access/transam/xact.c:3887 +#: access/transam/xact.c:4010 #, c-format msgid "there is no transaction in progress" msgstr "нет незавершённой транзакции" -#: access/transam/xact.c:3850 +#: access/transam/xact.c:3898 #, c-format msgid "cannot commit during a parallel operation" msgstr "фиксировать транзакции во время параллельных операций нельзя" -#: access/transam/xact.c:3973 +#: access/transam/xact.c:4021 #, c-format msgid "cannot abort during a parallel operation" msgstr "прерывание во время параллельных операций невозможно" -#: access/transam/xact.c:4072 +#: access/transam/xact.c:4120 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "определять точки сохранения во время параллельных операций нельзя" -#: access/transam/xact.c:4159 +#: access/transam/xact.c:4207 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "высвобождать точки сохранения во время параллельных операций нельзя" -#: access/transam/xact.c:4169 access/transam/xact.c:4220 -#: access/transam/xact.c:4280 access/transam/xact.c:4329 +#: access/transam/xact.c:4217 access/transam/xact.c:4268 +#: access/transam/xact.c:4328 access/transam/xact.c:4377 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "точка сохранения \"%s\" не существует" -#: access/transam/xact.c:4226 access/transam/xact.c:4335 +#: access/transam/xact.c:4274 access/transam/xact.c:4383 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "" "точка сохранения \"%s\" на текущем уровне точек сохранения не существует" -#: access/transam/xact.c:4268 +#: access/transam/xact.c:4316 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "откатиться к точке сохранения во время параллельных операций нельзя" -#: access/transam/xact.c:4396 +#: access/transam/xact.c:4444 #, c-format msgid "cannot start subtransactions during a parallel operation" msgstr "запускать подтранзакции во время параллельных операций нельзя" -#: access/transam/xact.c:4464 +#: access/transam/xact.c:4512 #, c-format msgid "cannot commit subtransactions during a parallel operation" msgstr "фиксировать подтранзакции во время параллельных операций нельзя" -#: access/transam/xact.c:5104 +#: access/transam/xact.c:5159 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "в одной транзакции не может быть больше 2^32-1 подтранзакций" -#: access/transam/xlog.c:2554 +#: access/transam/xlog.c:1835 #, c-format -msgid "could not write to log file %s at offset %u, length %zu: %m" -msgstr "не удалось записать в файл журнала %s (смещение: %u, длина: %zu): %m" +msgid "" +"request to flush past end of generated WAL; request %X/%X, current position " +"%X/%X" +msgstr "" +"запрос на сброс данных за концом сгенерированного WAL; запрошена позиция %X/" +"%X, текущая позиция %X/%X" -#: access/transam/xlog.c:2830 +#: access/transam/xlog.c:2608 #, c-format -msgid "updated min recovery point to %X/%X on timeline %u" -msgstr "минимальная точка восстановления изменена на %X/%X на линии времени %u" +msgid "could not write to log file %s at offset %u, length %zu: %m" +msgstr "не удалось записать в файл журнала %s (смещение: %u, длина: %zu): %m" -#: access/transam/xlog.c:3944 access/transam/xlogutils.c:802 -#: replication/walsender.c:2503 +#: access/transam/xlog.c:4010 access/transam/xlogutils.c:798 +#: replication/walsender.c:2529 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "запрошенный сегмент WAL %s уже удалён" -#: access/transam/xlog.c:4187 -#, c-format -msgid "recycled write-ahead log file \"%s\"" -msgstr "файл журнала предзаписи \"%s\" используется повторно" - -#: access/transam/xlog.c:4199 -#, c-format -msgid "removing write-ahead log file \"%s\"" -msgstr "файл журнала предзаписи \"%s\" удаляется" - -#: access/transam/xlog.c:4219 +#: access/transam/xlog.c:4285 #, c-format msgid "could not rename file \"%s\": %m" msgstr "не удалось переименовать файл \"%s\": %m" -#: access/transam/xlog.c:4261 access/transam/xlog.c:4271 +#: access/transam/xlog.c:4327 access/transam/xlog.c:4337 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "требуемый каталог WAL \"%s\" не существует" -#: access/transam/xlog.c:4277 +#: access/transam/xlog.c:4343 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "создаётся отсутствующий каталог WAL \"%s\"" -#: access/transam/xlog.c:4280 +#: access/transam/xlog.c:4346 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "не удалось создать отсутствующий каталог \"%s\": %m" -#: access/transam/xlog.c:4383 +#: access/transam/xlog.c:4462 #, c-format msgid "unexpected timeline ID %u in log segment %s, offset %u" msgstr "неожиданный ID линии времени %u в сегменте журнала %s, смещение %u" -#: access/transam/xlog.c:4521 +#: access/transam/xlog.c:4600 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "" "новая линия времени %u не является ответвлением линии времени системы БД %u" -#: access/transam/xlog.c:4535 +#: access/transam/xlog.c:4614 #, c-format msgid "" "new timeline %u forked off current database system timeline %u before " @@ -2355,29 +2464,29 @@ msgstr "" "новая линия времени %u ответвилась от текущей линии времени базы данных %u " "до текущей точки восстановления %X/%X" -#: access/transam/xlog.c:4554 +#: access/transam/xlog.c:4633 #, c-format msgid "new target timeline is %u" msgstr "новая целевая линия времени %u" -#: access/transam/xlog.c:4590 +#: access/transam/xlog.c:4669 #, c-format msgid "could not generate secret authorization token" msgstr "не удалось сгенерировать случайное число для аутентификации" -#: access/transam/xlog.c:4749 access/transam/xlog.c:4758 -#: access/transam/xlog.c:4782 access/transam/xlog.c:4789 -#: access/transam/xlog.c:4796 access/transam/xlog.c:4801 -#: access/transam/xlog.c:4808 access/transam/xlog.c:4815 -#: access/transam/xlog.c:4822 access/transam/xlog.c:4829 -#: access/transam/xlog.c:4836 access/transam/xlog.c:4843 -#: access/transam/xlog.c:4852 access/transam/xlog.c:4859 -#: utils/init/miscinit.c:1548 +#: access/transam/xlog.c:4828 access/transam/xlog.c:4837 +#: access/transam/xlog.c:4861 access/transam/xlog.c:4868 +#: access/transam/xlog.c:4875 access/transam/xlog.c:4880 +#: access/transam/xlog.c:4887 access/transam/xlog.c:4894 +#: access/transam/xlog.c:4901 access/transam/xlog.c:4908 +#: access/transam/xlog.c:4915 access/transam/xlog.c:4922 +#: access/transam/xlog.c:4931 access/transam/xlog.c:4938 +#: utils/init/miscinit.c:1578 #, c-format msgid "database files are incompatible with server" -msgstr "файлы базы данных не совместимы с сервером" +msgstr "файлы базы данных несовместимы с сервером" -#: access/transam/xlog.c:4750 +#: access/transam/xlog.c:4829 #, c-format msgid "" "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), " @@ -2386,7 +2495,7 @@ msgstr "" "Кластер баз данных был инициализирован с PG_CONTROL_VERSION %d (0x%08x), но " "сервер скомпилирован с PG_CONTROL_VERSION %d (0x%08x)." -#: access/transam/xlog.c:4754 +#: access/transam/xlog.c:4833 #, c-format msgid "" "This could be a problem of mismatched byte ordering. It looks like you need " @@ -2395,7 +2504,7 @@ msgstr "" "Возможно, проблема вызвана разным порядком байт. Кажется, вам надо выполнить " "initdb." -#: access/transam/xlog.c:4759 +#: access/transam/xlog.c:4838 #, c-format msgid "" "The database cluster was initialized with PG_CONTROL_VERSION %d, but the " @@ -2404,18 +2513,18 @@ msgstr "" "Кластер баз данных был инициализирован с PG_CONTROL_VERSION %d, но сервер " "скомпилирован с PG_CONTROL_VERSION %d." -#: access/transam/xlog.c:4762 access/transam/xlog.c:4786 -#: access/transam/xlog.c:4793 access/transam/xlog.c:4798 +#: access/transam/xlog.c:4841 access/transam/xlog.c:4865 +#: access/transam/xlog.c:4872 access/transam/xlog.c:4877 #, c-format msgid "It looks like you need to initdb." msgstr "Кажется, вам надо выполнить initdb." -#: access/transam/xlog.c:4773 +#: access/transam/xlog.c:4852 #, c-format msgid "incorrect checksum in control file" msgstr "ошибка контрольной суммы в файле pg_control" -#: access/transam/xlog.c:4783 +#: access/transam/xlog.c:4862 #, c-format msgid "" "The database cluster was initialized with CATALOG_VERSION_NO %d, but the " @@ -2424,7 +2533,7 @@ msgstr "" "Кластер баз данных был инициализирован с CATALOG_VERSION_NO %d, но сервер " "скомпилирован с CATALOG_VERSION_NO %d." -#: access/transam/xlog.c:4790 +#: access/transam/xlog.c:4869 #, c-format msgid "" "The database cluster was initialized with MAXALIGN %d, but the server was " @@ -2433,7 +2542,7 @@ msgstr "" "Кластер баз данных был инициализирован с MAXALIGN %d, но сервер " "скомпилирован с MAXALIGN %d." -#: access/transam/xlog.c:4797 +#: access/transam/xlog.c:4876 #, c-format msgid "" "The database cluster appears to use a different floating-point number format " @@ -2442,7 +2551,7 @@ msgstr "" "Кажется, в кластере баз данных и в программе сервера используются разные " "форматы чисел с плавающей точкой." -#: access/transam/xlog.c:4802 +#: access/transam/xlog.c:4881 #, c-format msgid "" "The database cluster was initialized with BLCKSZ %d, but the server was " @@ -2451,16 +2560,16 @@ msgstr "" "Кластер баз данных был инициализирован с BLCKSZ %d, но сервер скомпилирован " "с BLCKSZ %d." -#: access/transam/xlog.c:4805 access/transam/xlog.c:4812 -#: access/transam/xlog.c:4819 access/transam/xlog.c:4826 -#: access/transam/xlog.c:4833 access/transam/xlog.c:4840 -#: access/transam/xlog.c:4847 access/transam/xlog.c:4855 -#: access/transam/xlog.c:4862 +#: access/transam/xlog.c:4884 access/transam/xlog.c:4891 +#: access/transam/xlog.c:4898 access/transam/xlog.c:4905 +#: access/transam/xlog.c:4912 access/transam/xlog.c:4919 +#: access/transam/xlog.c:4926 access/transam/xlog.c:4934 +#: access/transam/xlog.c:4941 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Кажется, вам надо перекомпилировать сервер или выполнить initdb." -#: access/transam/xlog.c:4809 +#: access/transam/xlog.c:4888 #, c-format msgid "" "The database cluster was initialized with RELSEG_SIZE %d, but the server was " @@ -2469,7 +2578,7 @@ msgstr "" "Кластер баз данных был инициализирован с RELSEG_SIZE %d, но сервер " "скомпилирован с RELSEG_SIZE %d." -#: access/transam/xlog.c:4816 +#: access/transam/xlog.c:4895 #, c-format msgid "" "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was " @@ -2478,7 +2587,7 @@ msgstr "" "Кластер баз данных был инициализирован с XLOG_BLCKSZ %d, но сервер " "скомпилирован с XLOG_BLCKSZ %d." -#: access/transam/xlog.c:4823 +#: access/transam/xlog.c:4902 #, c-format msgid "" "The database cluster was initialized with NAMEDATALEN %d, but the server was " @@ -2487,7 +2596,7 @@ msgstr "" "Кластер баз данных был инициализирован с NAMEDATALEN %d, но сервер " "скомпилирован с NAMEDATALEN %d." -#: access/transam/xlog.c:4830 +#: access/transam/xlog.c:4909 #, c-format msgid "" "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server " @@ -2496,7 +2605,7 @@ msgstr "" "Кластер баз данных был инициализирован с INDEX_MAX_KEYS %d, но сервер " "скомпилирован с INDEX_MAX_KEYS %d." -#: access/transam/xlog.c:4837 +#: access/transam/xlog.c:4916 #, c-format msgid "" "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the " @@ -2505,7 +2614,7 @@ msgstr "" "Кластер баз данных был инициализирован с TOAST_MAX_CHUNK_SIZE %d, но сервер " "скомпилирован с TOAST_MAX_CHUNK_SIZE %d." -#: access/transam/xlog.c:4844 +#: access/transam/xlog.c:4923 #, c-format msgid "" "The database cluster was initialized with LOBLKSIZE %d, but the server was " @@ -2514,7 +2623,7 @@ msgstr "" "Кластер баз данных был инициализирован с LOBLKSIZE %d, но сервер " "скомпилирован с LOBLKSIZE %d." -#: access/transam/xlog.c:4853 +#: access/transam/xlog.c:4932 #, c-format msgid "" "The database cluster was initialized without USE_FLOAT8_BYVAL but the server " @@ -2523,7 +2632,7 @@ msgstr "" "Кластер баз данных был инициализирован без USE_FLOAT8_BYVAL, но сервер " "скомпилирован с USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4860 +#: access/transam/xlog.c:4939 #, c-format msgid "" "The database cluster was initialized with USE_FLOAT8_BYVAL but the server " @@ -2532,7 +2641,7 @@ msgstr "" "Кластер баз данных был инициализирован с USE_FLOAT8_BYVAL, но сервер был " "скомпилирован без USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4869 +#: access/transam/xlog.c:4948 #, c-format msgid "" "WAL segment size must be a power of two between 1 MB and 1 GB, but the " @@ -2550,49 +2659,49 @@ msgstr[2] "" "размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 " "ГБ, но в управляющем файле указано значение: %d" -#: access/transam/xlog.c:4881 +#: access/transam/xlog.c:4960 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"min_wal_size\" должен быть минимум вдвое больше \"wal_segment_size\"" -#: access/transam/xlog.c:4885 +#: access/transam/xlog.c:4964 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"max_wal_size\" должен быть минимум вдвое больше \"wal_segment_size\"" -#: access/transam/xlog.c:5318 +#: access/transam/xlog.c:5398 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "не удалось записать начальный файл журнала предзаписи: %m" -#: access/transam/xlog.c:5326 +#: access/transam/xlog.c:5406 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "не удалось сбросить на диск начальный файл журнала предзаписи: %m" -#: access/transam/xlog.c:5332 +#: access/transam/xlog.c:5412 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "не удалось закрыть начальный файл журнала предзаписи: %m" -#: access/transam/xlog.c:5393 +#: access/transam/xlog.c:5473 #, c-format msgid "using recovery command file \"%s\" is not supported" msgstr "" "использование файла с конфигурацией восстановления \"%s\" не поддерживается" -#: access/transam/xlog.c:5458 +#: access/transam/xlog.c:5538 #, c-format msgid "standby mode is not supported by single-user servers" msgstr "" "режим резервного сервера не поддерживается однопользовательским сервером" -#: access/transam/xlog.c:5475 +#: access/transam/xlog.c:5555 #, c-format msgid "specified neither primary_conninfo nor restore_command" msgstr "не указано ни primary_conninfo, ни restore_command" -#: access/transam/xlog.c:5476 +#: access/transam/xlog.c:5556 #, c-format msgid "" "The database server will regularly poll the pg_wal subdirectory to check for " @@ -2601,154 +2710,187 @@ msgstr "" "Сервер БД будет регулярно опрашивать подкаталог pg_wal и проверять " "содержащиеся в нём файлы." -#: access/transam/xlog.c:5484 +#: access/transam/xlog.c:5564 #, c-format msgid "must specify restore_command when standby mode is not enabled" msgstr "" "необходимо задать restore_command, если не выбран режим резервного сервера" -#: access/transam/xlog.c:5522 +#: access/transam/xlog.c:5602 #, c-format msgid "recovery target timeline %u does not exist" msgstr "целевая линия времени для восстановления %u не существует" -#: access/transam/xlog.c:5644 +#: access/transam/xlog.c:5724 #, c-format msgid "archive recovery complete" msgstr "восстановление архива завершено" -#: access/transam/xlog.c:5710 access/transam/xlog.c:5983 +#: access/transam/xlog.c:5790 access/transam/xlog.c:6061 #, c-format msgid "recovery stopping after reaching consistency" msgstr "" "восстановление останавливается после достижения согласованного состояния" -#: access/transam/xlog.c:5731 +#: access/transam/xlog.c:5811 #, c-format msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" msgstr "восстановление останавливается перед позицией в WAL (LSN) \"%X/%X\"" -#: access/transam/xlog.c:5817 +#: access/transam/xlog.c:5896 #, c-format msgid "recovery stopping before commit of transaction %u, time %s" msgstr "" "восстановление останавливается перед фиксированием транзакции %u, время %s" -#: access/transam/xlog.c:5824 +#: access/transam/xlog.c:5903 #, c-format msgid "recovery stopping before abort of transaction %u, time %s" msgstr "" "восстановление останавливается перед прерыванием транзакции %u, время %s" -#: access/transam/xlog.c:5877 +#: access/transam/xlog.c:5956 #, c-format msgid "recovery stopping at restore point \"%s\", time %s" msgstr "восстановление останавливается в точке восстановления \"%s\", время %s" -#: access/transam/xlog.c:5895 +#: access/transam/xlog.c:5974 #, c-format msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" msgstr "восстановление останавливается после позиции в WAL (LSN) \"%X/%X\"" -#: access/transam/xlog.c:5963 +#: access/transam/xlog.c:6041 #, c-format msgid "recovery stopping after commit of transaction %u, time %s" msgstr "" "восстановление останавливается после фиксирования транзакции %u, время %s" -#: access/transam/xlog.c:5971 +#: access/transam/xlog.c:6049 #, c-format msgid "recovery stopping after abort of transaction %u, time %s" msgstr "" "восстановление останавливается после прерывания транзакции %u, время %s" -#: access/transam/xlog.c:6020 +#: access/transam/xlog.c:6094 #, c-format msgid "pausing at the end of recovery" msgstr "остановка в конце восстановления" -#: access/transam/xlog.c:6021 +#: access/transam/xlog.c:6095 #, c-format msgid "Execute pg_wal_replay_resume() to promote." msgstr "Выполните pg_wal_replay_resume() для повышения." -#: access/transam/xlog.c:6024 +#: access/transam/xlog.c:6098 access/transam/xlog.c:6380 #, c-format msgid "recovery has paused" msgstr "восстановление приостановлено" -#: access/transam/xlog.c:6025 +#: access/transam/xlog.c:6099 #, c-format msgid "Execute pg_wal_replay_resume() to continue." msgstr "Выполните pg_wal_replay_resume() для продолжения." -#: access/transam/xlog.c:6236 +#: access/transam/xlog.c:6371 +#, c-format +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "" +"режим горячего резерва невозможен из-за отсутствия достаточных значений " +"параметров" + +#: access/transam/xlog.c:6372 access/transam/xlog.c:6399 +#: access/transam/xlog.c:6429 #, c-format msgid "" -"hot standby is not possible because %s = %d is a lower setting than on the " -"master server (its value was %d)" +"%s = %d is a lower setting than on the primary server, where its value was " +"%d." msgstr "" -"режим горячего резерва невозможен, так как параметр %s = %d, меньше чем на " -"главном сервере (на нём было значение %d)" +"Параметр %s = %d меньше, чем на ведущем сервере, где его значение было %d." -#: access/transam/xlog.c:6260 +#: access/transam/xlog.c:6381 #, c-format -msgid "WAL was generated with wal_level=minimal, data may be missing" -msgstr "WAL был создан с параметром wal_level=minimal, возможна потеря данных" +msgid "If recovery is unpaused, the server will shut down." +msgstr "В случае возобновления восстановления сервер отключится." -#: access/transam/xlog.c:6261 +#: access/transam/xlog.c:6382 #, c-format msgid "" -"This happens if you temporarily set wal_level=minimal without taking a new " -"base backup." +"You can then restart the server after making the necessary configuration " +"changes." msgstr "" -"Это происходит, если вы на время установили wal_level=minimal и не сделали " -"резервную копию базу данных." +"Затем вы можете перезапустить сервер после внесения необходимых изменений " +"конфигурации." -#: access/transam/xlog.c:6272 +#: access/transam/xlog.c:6393 #, c-format -msgid "" -"hot standby is not possible because wal_level was not set to \"replica\" or " -"higher on the master server" +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "повышение невозможно из-за отсутствия достаточных значений параметров" + +#: access/transam/xlog.c:6403 +#, c-format +msgid "Restart the server after making the necessary configuration changes." +msgstr "" +"Перезапустите сервер после внесения необходимых изменений конфигурации." + +#: access/transam/xlog.c:6427 +#, c-format +msgid "recovery aborted because of insufficient parameter settings" msgstr "" -"режим горячего резерва невозможен, так как на главном сервере установлен " -"неподходящий wal_level (должен быть \"replica\" или выше)" +"восстановление прервано из-за отсутствия достаточных значений параметров" -#: access/transam/xlog.c:6273 +#: access/transam/xlog.c:6433 #, c-format msgid "" -"Either set wal_level to \"replica\" on the master, or turn off hot_standby " -"here." +"You can restart the server after making the necessary configuration changes." +msgstr "" +"Вы можете перезапустить сервер после внесения необходимых изменений " +"конфигурации." + +#: access/transam/xlog.c:6455 +#, c-format +msgid "WAL was generated with wal_level=minimal, cannot continue recovering" +msgstr "" +"WAL был создан с параметром wal_level=minimal, продолжение восстановления " +"невозможно" + +#: access/transam/xlog.c:6456 +#, c-format +msgid "This happens if you temporarily set wal_level=minimal on the server." +msgstr "Это происходит, если вы на время устанавливали wal_level=minimal." + +#: access/transam/xlog.c:6457 +#, c-format +msgid "Use a backup taken after setting wal_level to higher than minimal." msgstr "" -"Либо установите для wal_level значение \"replica\" на главном сервере, либо " -"выключите hot_standby здесь." +"Используйте резервную копию, сделанную после переключения wal_level на любой " +"уровень выше minimal." -#: access/transam/xlog.c:6335 +#: access/transam/xlog.c:6526 #, c-format msgid "control file contains invalid checkpoint location" msgstr "файл pg_control содержит неправильную позицию контрольной точки" -#: access/transam/xlog.c:6346 +#: access/transam/xlog.c:6537 #, c-format msgid "database system was shut down at %s" msgstr "система БД была выключена: %s" -#: access/transam/xlog.c:6352 +#: access/transam/xlog.c:6543 #, c-format msgid "database system was shut down in recovery at %s" msgstr "система БД была выключена в процессе восстановления: %s" -#: access/transam/xlog.c:6358 +#: access/transam/xlog.c:6549 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "выключение системы БД было прервано; последний момент работы: %s" -#: access/transam/xlog.c:6364 +#: access/transam/xlog.c:6555 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "работа системы БД была прервана во время восстановления: %s" -#: access/transam/xlog.c:6366 +#: access/transam/xlog.c:6557 #, c-format msgid "" "This probably means that some data is corrupted and you will have to use the " @@ -2757,14 +2899,14 @@ msgstr "" "Это скорее всего означает, что некоторые данные повреждены и вам придётся " "восстановить БД из последней резервной копии." -#: access/transam/xlog.c:6372 +#: access/transam/xlog.c:6563 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "" "работа системы БД была прервана в процессе восстановления, время в журнале: " "%s" -#: access/transam/xlog.c:6374 +#: access/transam/xlog.c:6565 #, c-format msgid "" "If this has occurred more than once some data might be corrupted and you " @@ -2773,64 +2915,59 @@ msgstr "" "Если это происходит постоянно, возможно, какие-то данные были испорчены и " "для восстановления стоит выбрать более раннюю точку." -#: access/transam/xlog.c:6380 +#: access/transam/xlog.c:6571 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "работа системы БД была прервана; последний момент работы: %s" -#: access/transam/xlog.c:6386 +#: access/transam/xlog.c:6577 #, c-format msgid "control file contains invalid database cluster state" msgstr "файл pg_control содержит неверный код состояния кластера" -#: access/transam/xlog.c:6443 +#: access/transam/xlog.c:6634 #, c-format msgid "entering standby mode" msgstr "переход в режим резервного сервера" -#: access/transam/xlog.c:6446 +#: access/transam/xlog.c:6637 #, c-format msgid "starting point-in-time recovery to XID %u" msgstr "начинается восстановление точки во времени до XID %u" -#: access/transam/xlog.c:6450 +#: access/transam/xlog.c:6641 #, c-format msgid "starting point-in-time recovery to %s" msgstr "начинается восстановление точки во времени до %s" -#: access/transam/xlog.c:6454 +#: access/transam/xlog.c:6645 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "начинается восстановление точки во времени до \"%s\"" -#: access/transam/xlog.c:6458 +#: access/transam/xlog.c:6649 #, c-format msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" msgstr "" "начинается восстановление точки во времени до позиции в WAL (LSN) \"%X/%X\"" -#: access/transam/xlog.c:6463 +#: access/transam/xlog.c:6653 #, c-format msgid "starting point-in-time recovery to earliest consistent point" msgstr "" "начинается восстановление точки во времени до первой точки согласованности" -#: access/transam/xlog.c:6466 +#: access/transam/xlog.c:6656 #, c-format msgid "starting archive recovery" msgstr "начинается восстановление архива" -#: access/transam/xlog.c:6525 access/transam/xlog.c:6658 -#, c-format -msgid "checkpoint record is at %X/%X" -msgstr "запись о контрольной точке по смещению %X/%X" - -#: access/transam/xlog.c:6540 +#: access/transam/xlog.c:6730 #, c-format msgid "could not find redo location referenced by checkpoint record" msgstr "не удалось найти положение REDO, указанное записью контрольной точки" -#: access/transam/xlog.c:6541 access/transam/xlog.c:6551 +#: access/transam/xlog.c:6731 access/transam/xlog.c:6741 #, c-format msgid "" "If you are restoring from a backup, touch \"%s/recovery.signal\" and add " @@ -2846,42 +2983,42 @@ msgstr "" "Будьте осторожны: при восстановлении резервной копии удаление \"%s/" "backup_label\" приведёт к повреждению кластера." -#: access/transam/xlog.c:6550 +#: access/transam/xlog.c:6740 #, c-format msgid "could not locate required checkpoint record" msgstr "не удалось считать нужную запись контрольной точки" -#: access/transam/xlog.c:6579 commands/tablespace.c:666 +#: access/transam/xlog.c:6769 commands/tablespace.c:662 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "не удалось создать символическую ссылку \"%s\": %m" -#: access/transam/xlog.c:6611 access/transam/xlog.c:6617 +#: access/transam/xlog.c:6801 access/transam/xlog.c:6807 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "файл \"%s\" игнорируется ввиду отсутствия файла \"%s\"" -#: access/transam/xlog.c:6613 access/transam/xlog.c:11808 +#: access/transam/xlog.c:6803 access/transam/xlog.c:12238 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "Файл \"%s\" был переименован в \"%s\"." -#: access/transam/xlog.c:6619 +#: access/transam/xlog.c:6809 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "Не удалось переименовать файл \"%s\" в \"%s\" (%m)." -#: access/transam/xlog.c:6670 +#: access/transam/xlog.c:6860 #, c-format msgid "could not locate a valid checkpoint record" msgstr "не удалось считать правильную запись контрольной точки" -#: access/transam/xlog.c:6708 +#: access/transam/xlog.c:6898 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "в истории сервера нет ответвления запрошенной линии времени %u" -#: access/transam/xlog.c:6710 +#: access/transam/xlog.c:6900 #, c-format msgid "" "Latest checkpoint is at %X/%X on timeline %u, but in the history of the " @@ -2890,7 +3027,7 @@ msgstr "" "Последняя контрольная точка: %X/%X на линии времени %u, но в истории " "запрошенной линии времени сервер ответвился с этой линии в %X/%X." -#: access/transam/xlog.c:6726 +#: access/transam/xlog.c:6914 #, c-format msgid "" "requested timeline %u does not contain minimum recovery point %X/%X on " @@ -2899,22 +3036,22 @@ msgstr "" "запрошенная линия времени %u не содержит минимальную точку восстановления %X/" "%X на линии времени %u" -#: access/transam/xlog.c:6757 +#: access/transam/xlog.c:6944 #, c-format msgid "invalid next transaction ID" msgstr "неверный ID следующей транзакции" -#: access/transam/xlog.c:6851 +#: access/transam/xlog.c:7044 #, c-format msgid "invalid redo in checkpoint record" msgstr "неверная запись REDO в контрольной точке" -#: access/transam/xlog.c:6862 +#: access/transam/xlog.c:7055 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "неверная запись REDO в контрольной точке выключения" -#: access/transam/xlog.c:6896 +#: access/transam/xlog.c:7095 #, c-format msgid "" "database system was not properly shut down; automatic recovery in progress" @@ -2922,19 +3059,19 @@ msgstr "" "система БД была остановлена нештатно; производится автоматическое " "восстановление" -#: access/transam/xlog.c:6900 +#: access/transam/xlog.c:7099 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "" "восстановление после сбоя начинается на линии времени %u, целевая линия " "времени: %u" -#: access/transam/xlog.c:6947 +#: access/transam/xlog.c:7146 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_label содержит данные, не согласованные с файлом pg_control" -#: access/transam/xlog.c:6948 +#: access/transam/xlog.c:7147 #, c-format msgid "" "This means that the backup is corrupted and you will have to use another " @@ -2943,49 +3080,44 @@ msgstr "" "Это означает, что резервная копия повреждена и для восстановления БД " "придётся использовать другую копию." -#: access/transam/xlog.c:7039 -#, c-format -msgid "initializing for hot standby" -msgstr "инициализация для горячего резерва" - -#: access/transam/xlog.c:7172 +#: access/transam/xlog.c:7373 #, c-format msgid "redo starts at %X/%X" msgstr "запись REDO начинается со смещения %X/%X" -#: access/transam/xlog.c:7396 +#: access/transam/xlog.c:7598 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "" "запрошенная точка остановки восстановления предшествует согласованной точке " "восстановления" -#: access/transam/xlog.c:7434 +#: access/transam/xlog.c:7636 #, c-format -msgid "redo done at %X/%X" -msgstr "записи REDO обработаны до смещения %X/%X" +msgid "redo done at %X/%X system usage: %s" +msgstr "записи REDO обработаны до смещения %X/%X, нагрузка системы: %s" -#: access/transam/xlog.c:7439 +#: access/transam/xlog.c:7642 #, c-format msgid "last completed transaction was at log time %s" msgstr "последняя завершённая транзакция была выполнена в %s" -#: access/transam/xlog.c:7448 +#: access/transam/xlog.c:7651 #, c-format msgid "redo is not required" msgstr "данные REDO не требуются" -#: access/transam/xlog.c:7460 +#: access/transam/xlog.c:7663 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "восстановление окончилось до достижения заданной цели восстановления" -#: access/transam/xlog.c:7539 access/transam/xlog.c:7543 +#: access/transam/xlog.c:7747 access/transam/xlog.c:7751 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL закончился без признака окончания копирования" -#: access/transam/xlog.c:7540 +#: access/transam/xlog.c:7748 #, c-format msgid "" "All WAL generated while online backup was taken must be available at " @@ -2994,7 +3126,7 @@ msgstr "" "Все журналы WAL, созданные во время резервного копирования \"на ходу\", " "должны быть в наличии для восстановления." -#: access/transam/xlog.c:7544 +#: access/transam/xlog.c:7752 #, c-format msgid "" "Online backup started with pg_start_backup() must be ended with " @@ -3004,117 +3136,140 @@ msgstr "" "должно закончиться pg_stop_backup(), и для восстановления должны быть " "доступны все журналы WAL." -#: access/transam/xlog.c:7547 +#: access/transam/xlog.c:7755 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL закончился до согласованной точки восстановления" -#: access/transam/xlog.c:7582 +#: access/transam/xlog.c:7790 #, c-format msgid "selected new timeline ID: %u" msgstr "выбранный ID новой линии времени: %u" -#: access/transam/xlog.c:8030 +#: access/transam/xlog.c:8260 #, c-format msgid "consistent recovery state reached at %X/%X" msgstr "согласованное состояние восстановления достигнуто по смещению %X/%X" -#: access/transam/xlog.c:8240 +#: access/transam/xlog.c:8469 #, c-format msgid "invalid primary checkpoint link in control file" msgstr "неверная ссылка на первичную контрольную точку в файле pg_control" -#: access/transam/xlog.c:8244 +#: access/transam/xlog.c:8473 #, c-format msgid "invalid checkpoint link in backup_label file" msgstr "неверная ссылка на контрольную точку в файле backup_label" -#: access/transam/xlog.c:8262 +#: access/transam/xlog.c:8491 #, c-format msgid "invalid primary checkpoint record" msgstr "неверная запись первичной контрольной точки" -#: access/transam/xlog.c:8266 +#: access/transam/xlog.c:8495 #, c-format msgid "invalid checkpoint record" msgstr "неверная запись контрольной точки" -#: access/transam/xlog.c:8277 +#: access/transam/xlog.c:8506 #, c-format msgid "invalid resource manager ID in primary checkpoint record" msgstr "неверный ID менеджера ресурсов в записи первичной контрольной точки" -#: access/transam/xlog.c:8281 +#: access/transam/xlog.c:8510 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "неверный ID менеджера ресурсов в записи контрольной точки" -#: access/transam/xlog.c:8294 +#: access/transam/xlog.c:8523 #, c-format msgid "invalid xl_info in primary checkpoint record" msgstr "неверные флаги xl_info в записи первичной контрольной точки" -#: access/transam/xlog.c:8298 +#: access/transam/xlog.c:8527 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "неверные флаги xl_info в записи контрольной точки" -#: access/transam/xlog.c:8309 +#: access/transam/xlog.c:8538 #, c-format msgid "invalid length of primary checkpoint record" msgstr "неверная длина записи первичной контрольной точки" -#: access/transam/xlog.c:8313 +#: access/transam/xlog.c:8542 #, c-format msgid "invalid length of checkpoint record" msgstr "неверная длина записи контрольной точки" -#: access/transam/xlog.c:8493 +#: access/transam/xlog.c:8723 #, c-format msgid "shutting down" msgstr "выключение" -#: access/transam/xlog.c:8799 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:8762 +#, c-format +msgid "restartpoint starting:%s%s%s%s%s%s%s%s" +msgstr "начата точка перезапуска:%s%s%s%s%s%s%s%s" + +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:8774 #, c-format -msgid "checkpoint skipped because system is idle" -msgstr "контрольная точка пропущена ввиду простоя системы" +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "начата контрольная точка:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:8999 +# well-spelled: синхр +#: access/transam/xlog.c:8834 #, c-format msgid "" -"concurrent write-ahead log activity while database system is shutting down" +"restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d " +"removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; " +"sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, " +"estimate=%d kB" msgstr "" -"во время выключения системы баз данных отмечена активность в журнале " -"предзаписи" +"точка перезапуска завершена: записано буферов: %d (%.1f%%); добавлено файлов " +"WAL %d, удалено: %d, переработано: %d; запись=%ld.%03d сек., синхр.=%ld.%03d " +"сек., всего=%ld.%03d сек.; синхронизировано_файлов=%d, самая_долгая_синхр.=" +"%ld.%03d сек., средняя=%ld.%03d сек.; расстояние=%d kB, ожидалось=%d kB" -#: access/transam/xlog.c:9256 +# well-spelled: синхр +#: access/transam/xlog.c:8854 #, c-format -msgid "skipping restartpoint, recovery has already ended" +msgid "" +"checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d " +"removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; " +"sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, " +"estimate=%d kB" msgstr "" -"создание точки перезапуска пропускается, восстановление уже закончилось" +"контрольная точка завершена: записано буферов: %d (%.1f%%); добавлено файлов " +"WAL %d, удалено: %d, переработано: %d; запись=%ld.%03d сек., синхр.=%ld.%03d " +"сек., всего=%ld.%03d сек.; синхронизировано_файлов=%d, самая_долгая_синхр.=" +"%ld.%03d сек., средняя=%ld.%03d сек.; расстояние=%d kB, ожидалось=%d kB" -#: access/transam/xlog.c:9279 +#: access/transam/xlog.c:9287 #, c-format -msgid "skipping restartpoint, already performed at %X/%X" +msgid "" +"concurrent write-ahead log activity while database system is shutting down" msgstr "" -"создание точки перезапуска пропускается, она уже создана по смещению %X/%X" +"во время выключения системы баз данных отмечена активность в журнале " +"предзаписи" -#: access/transam/xlog.c:9447 +#: access/transam/xlog.c:9806 #, c-format msgid "recovery restart point at %X/%X" msgstr "точка перезапуска восстановления по смещению %X/%X" -#: access/transam/xlog.c:9449 +#: access/transam/xlog.c:9808 #, c-format msgid "Last completed transaction was at log time %s." msgstr "Последняя завершённая транзакция была выполнена в %s." -#: access/transam/xlog.c:9691 +#: access/transam/xlog.c:10054 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "точка восстановления \"%s\" создана по смещению %X/%X" -#: access/transam/xlog.c:9836 +#: access/transam/xlog.c:10199 #, c-format msgid "" "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint " @@ -3123,13 +3278,13 @@ msgstr "" "неожиданный ID предыдущей линии времени %u (ID текущей линии времени %u) в " "записи контрольной точки" -#: access/transam/xlog.c:9845 +#: access/transam/xlog.c:10208 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "неожиданный ID линии времени %u (после %u) в записи контрольной точки" # skip-rule: capital-letter-first -#: access/transam/xlog.c:9861 +#: access/transam/xlog.c:10224 #, c-format msgid "" "unexpected timeline ID %u in checkpoint record, before reaching minimum " @@ -3138,32 +3293,39 @@ msgstr "" "неожиданный ID линии времени %u в записи контрольной точки, до достижения " "минимальной к. т. %X/%X на линии времени %u" -#: access/transam/xlog.c:9937 +#: access/transam/xlog.c:10299 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "" "резервное копирование \"на ходу\" было отменено, продолжить восстановление " "нельзя" -#: access/transam/xlog.c:9993 access/transam/xlog.c:10049 -#: access/transam/xlog.c:10072 +#: access/transam/xlog.c:10355 access/transam/xlog.c:10411 +#: access/transam/xlog.c:10441 #, c-format msgid "unexpected timeline ID %u (should be %u) in checkpoint record" msgstr "" "неожиданный ID линии времени %u (должен быть %u) в записи точки " "восстановления" -#: access/transam/xlog.c:10398 +#: access/transam/xlog.c:10595 +#, c-format +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "" +"успешно пропущена отсутствующая запись contrecord в %X/%X, перезаписанная в " +"%s" + +#: access/transam/xlog.c:10810 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл сквозной записи %s: %m" -#: access/transam/xlog.c:10404 +#: access/transam/xlog.c:10816 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "не удалось синхронизировать с ФС данные (fdatasync) файла \"%s\": %m" -#: access/transam/xlog.c:10503 access/transam/xlog.c:11041 +#: access/transam/xlog.c:10927 access/transam/xlog.c:11456 #: access/transam/xlogfuncs.c:275 access/transam/xlogfuncs.c:302 #: access/transam/xlogfuncs.c:341 access/transam/xlogfuncs.c:362 #: access/transam/xlogfuncs.c:383 @@ -3171,35 +3333,35 @@ msgstr "не удалось синхронизировать с ФС данны msgid "WAL control functions cannot be executed during recovery." msgstr "Функции управления WAL нельзя использовать в процессе восстановления." -#: access/transam/xlog.c:10512 access/transam/xlog.c:11050 +#: access/transam/xlog.c:10936 access/transam/xlog.c:11465 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "" "Выбранный уровень WAL недостаточен для резервного копирования \"на ходу\"" -#: access/transam/xlog.c:10513 access/transam/xlog.c:11051 +#: access/transam/xlog.c:10937 access/transam/xlog.c:11466 #: access/transam/xlogfuncs.c:308 #, c-format msgid "wal_level must be set to \"replica\" or \"logical\" at server start." msgstr "Установите wal_level \"replica\" или \"logical\" при запуске сервера." -#: access/transam/xlog.c:10518 +#: access/transam/xlog.c:10942 #, c-format msgid "backup label too long (max %d bytes)" msgstr "длина метки резервной копии превышает предел (%d байт)" -#: access/transam/xlog.c:10555 access/transam/xlog.c:10840 -#: access/transam/xlog.c:10878 +#: access/transam/xlog.c:10979 access/transam/xlog.c:11255 +#: access/transam/xlog.c:11293 #, c-format msgid "a backup is already in progress" msgstr "резервное копирование уже выполняется" -#: access/transam/xlog.c:10556 +#: access/transam/xlog.c:10980 #, c-format msgid "Run pg_stop_backup() and try again." msgstr "Выполните pg_stop_backup() и повторите операцию." -#: access/transam/xlog.c:10652 +#: access/transam/xlog.c:11076 #, c-format msgid "" "WAL generated with full_page_writes=off was replayed since last restartpoint" @@ -3207,31 +3369,31 @@ msgstr "" "После последней точки перезапуска был воспроизведён WAL, созданный в режиме " "full_page_writes=off." -#: access/transam/xlog.c:10654 access/transam/xlog.c:11246 +#: access/transam/xlog.c:11078 access/transam/xlog.c:11661 #, c-format msgid "" "This means that the backup being taken on the standby is corrupt and should " -"not be used. Enable full_page_writes and run CHECKPOINT on the master, and " +"not be used. Enable full_page_writes and run CHECKPOINT on the primary, and " "then try an online backup again." msgstr "" "Это означает, что резервная копия, сделанная на дежурном сервере, испорчена " "и использовать её не следует. Включите режим full_page_writes и выполните " -"CHECKPOINT на главном сервере, а затем попробуйте резервное копирование \"на " +"CHECKPOINT на ведущем сервере, а затем попробуйте резервное копирование \"на " "ходу\" ещё раз." -#: access/transam/xlog.c:10737 replication/basebackup.c:1423 -#: utils/adt/misc.c:342 +#: access/transam/xlog.c:11154 replication/basebackup.c:1433 +#: utils/adt/misc.c:345 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "целевой путь символической ссылки \"%s\" слишком длинный" -#: access/transam/xlog.c:10790 commands/tablespace.c:402 -#: commands/tablespace.c:578 replication/basebackup.c:1438 utils/adt/misc.c:350 +#: access/transam/xlog.c:11204 commands/tablespace.c:402 +#: commands/tablespace.c:578 replication/basebackup.c:1448 utils/adt/misc.c:353 #, c-format msgid "tablespaces are not supported on this platform" msgstr "табличные пространства не поддерживаются на этой платформе" -#: access/transam/xlog.c:10841 access/transam/xlog.c:10879 +#: access/transam/xlog.c:11256 access/transam/xlog.c:11294 #, c-format msgid "" "If you're sure there is no backup in progress, remove file \"%s\" and try " @@ -3240,31 +3402,31 @@ msgstr "" "Если вы считаете, что информация о резервном копировании неверна, удалите " "файл \"%s\" и попробуйте снова." -#: access/transam/xlog.c:11066 +#: access/transam/xlog.c:11481 #, c-format msgid "exclusive backup not in progress" msgstr "монопольное резервное копирование не выполняется" -#: access/transam/xlog.c:11093 +#: access/transam/xlog.c:11508 #, c-format msgid "a backup is not in progress" msgstr "резервное копирование не выполняется" -#: access/transam/xlog.c:11179 access/transam/xlog.c:11192 -#: access/transam/xlog.c:11581 access/transam/xlog.c:11587 -#: access/transam/xlog.c:11635 access/transam/xlog.c:11708 -#: access/transam/xlogfuncs.c:692 +#: access/transam/xlog.c:11594 access/transam/xlog.c:11607 +#: access/transam/xlog.c:11996 access/transam/xlog.c:12002 +#: access/transam/xlog.c:12050 access/transam/xlog.c:12130 +#: access/transam/xlog.c:12154 access/transam/xlogfuncs.c:733 #, c-format msgid "invalid data in file \"%s\"" msgstr "неверные данные в файле \"%s\"" -#: access/transam/xlog.c:11196 replication/basebackup.c:1271 +#: access/transam/xlog.c:11611 replication/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "" "дежурный сервер был повышен в процессе резервного копирования \"на ходу\"" -#: access/transam/xlog.c:11197 replication/basebackup.c:1272 +#: access/transam/xlog.c:11612 replication/basebackup.c:1282 #, c-format msgid "" "This means that the backup being taken is corrupt and should not be used. " @@ -3273,7 +3435,7 @@ msgstr "" "Это означает, что создаваемая резервная копия испорчена и использовать её не " "следует. Попробуйте резервное копирование \"на ходу\" ещё раз." -#: access/transam/xlog.c:11244 +#: access/transam/xlog.c:11659 #, c-format msgid "" "WAL generated with full_page_writes=off was replayed during online backup" @@ -3281,13 +3443,13 @@ msgstr "" "В процессе резервного копирования \"на ходу\" был воспроизведён WAL, " "созданный в режиме full_page_writes=off" -#: access/transam/xlog.c:11364 +#: access/transam/xlog.c:11779 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "" "базовое копирование выполнено, ожидается архивация нужных сегментов WAL" -#: access/transam/xlog.c:11376 +#: access/transam/xlog.c:11791 #, c-format msgid "" "still waiting for all required WAL segments to be archived (%d seconds " @@ -3295,7 +3457,7 @@ msgid "" msgstr "" "продолжается ожидание архивации всех нужных сегментов WAL (прошло %d сек.)" -#: access/transam/xlog.c:11378 +#: access/transam/xlog.c:11793 #, c-format msgid "" "Check that your archive_command is executing properly. You can safely " @@ -3306,12 +3468,12 @@ msgstr "" "копирования можно отменить безопасно, но резервная копия базы будет " "непригодна без всех сегментов WAL." -#: access/transam/xlog.c:11385 +#: access/transam/xlog.c:11800 #, c-format msgid "all required WAL segments have been archived" msgstr "все нужные сегменты WAL заархивированы" -#: access/transam/xlog.c:11389 +#: access/transam/xlog.c:11804 #, c-format msgid "" "WAL archiving is not enabled; you must ensure that all required WAL segments " @@ -3320,63 +3482,48 @@ msgstr "" "архивация WAL не настроена; вы должны обеспечить копирование всех требуемых " "сегментов WAL другими средствами для получения резервной копии" -#: access/transam/xlog.c:11442 +#: access/transam/xlog.c:11857 #, c-format msgid "aborting backup due to backend exiting before pg_stop_backup was called" msgstr "" "прерывание резервного копирования из-за завершения обслуживающего процесса " "до вызова pg_stop_backup" -#: access/transam/xlog.c:11618 -#, c-format -msgid "backup time %s in file \"%s\"" -msgstr "время резервного копирования %s в файле \"%s\"" - -#: access/transam/xlog.c:11623 -#, c-format -msgid "backup label %s in file \"%s\"" -msgstr "метка резервного копирования %s в файле \"%s\"" - -#: access/transam/xlog.c:11636 +#: access/transam/xlog.c:12051 #, c-format msgid "Timeline ID parsed is %u, but expected %u." msgstr "Получен идентификатор линии времени %u, но ожидался %u." -#: access/transam/xlog.c:11640 -#, c-format -msgid "backup timeline %u in file \"%s\"" -msgstr "линия времени резервной копии %u в файле \"%s\"" - #. translator: %s is a WAL record description -#: access/transam/xlog.c:11748 +#: access/transam/xlog.c:12179 #, c-format msgid "WAL redo at %X/%X for %s" msgstr "запись REDO в WAL в позиции %X/%X для %s" -#: access/transam/xlog.c:11797 +#: access/transam/xlog.c:12227 #, c-format msgid "online backup mode was not canceled" msgstr "режим копирования \"на ходу\" не был отменён" -#: access/transam/xlog.c:11798 +#: access/transam/xlog.c:12228 #, c-format msgid "File \"%s\" could not be renamed to \"%s\": %m." msgstr "Не удалось переименовать файл \"%s\" в \"%s\": %m." -#: access/transam/xlog.c:11807 access/transam/xlog.c:11819 -#: access/transam/xlog.c:11829 +#: access/transam/xlog.c:12237 access/transam/xlog.c:12249 +#: access/transam/xlog.c:12259 #, c-format msgid "online backup mode canceled" msgstr "режим копирования \"на ходу\" отменён" -#: access/transam/xlog.c:11820 +#: access/transam/xlog.c:12250 #, c-format msgid "" "Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." msgstr "" "Файлы \"%s\" и \"%s\" были переименованы в \"%s\" и \"%s\", соответственно." -#: access/transam/xlog.c:11830 +#: access/transam/xlog.c:12260 #, c-format msgid "" "File \"%s\" was renamed to \"%s\", but file \"%s\" could not be renamed to " @@ -3385,49 +3532,56 @@ msgstr "" "Файл \"%s\" был переименован в \"%s\", но переименовать \"%s\" в \"%s\" не " "удалось: %m." -#: access/transam/xlog.c:11963 access/transam/xlogutils.c:971 +#: access/transam/xlog.c:12393 access/transam/xlogutils.c:967 #, c-format msgid "could not read from log segment %s, offset %u: %m" msgstr "не удалось прочитать сегмент журнала %s, смещение %u: %m" -#: access/transam/xlog.c:11969 access/transam/xlogutils.c:978 +#: access/transam/xlog.c:12399 access/transam/xlogutils.c:974 #, c-format msgid "could not read from log segment %s, offset %u: read %d of %zu" msgstr "" "не удалось прочитать из сегмента журнала %s по смещению %u (прочитано байт: " "%d из %zu)" -#: access/transam/xlog.c:12495 +#: access/transam/xlog.c:12944 #, c-format msgid "WAL receiver process shutdown requested" msgstr "получен запрос на выключение процесса приёмника WAL" -#: access/transam/xlog.c:12601 +#: access/transam/xlog.c:13039 #, c-format msgid "received promote request" msgstr "получен запрос повышения статуса" -#: access/transam/xlog.c:12614 +#: access/transam/xlog.c:13052 #, c-format msgid "promote trigger file found: %s" msgstr "найден файл триггера повышения: %s" -#: access/transam/xlog.c:12623 +#: access/transam/xlog.c:13060 #, c-format msgid "could not stat promote trigger file \"%s\": %m" msgstr "не удалось получить информацию о файле триггера повышения \"%s\": %m" #: access/transam/xlogarchive.c:205 #, c-format -msgid "archive file \"%s\" has wrong size: %lu instead of %lu" -msgstr "файл архива \"%s\" имеет неправильный размер: %lu вместо %lu" +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "файл архива \"%s\" имеет неправильный размер: %lld вместо %lld" #: access/transam/xlogarchive.c:214 #, c-format msgid "restored log file \"%s\" from archive" msgstr "файл журнала \"%s\" восстановлен из архива" -#: access/transam/xlogarchive.c:259 +#: access/transam/xlogarchive.c:228 +#, c-format +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "" +"Команда restore_command возвратила нулевой код состояния, но stat() выдала " +"ошибку." + +#: access/transam/xlogarchive.c:260 #, c-format msgid "could not restore file \"%s\" from archive: %s" msgstr "восстановить файл \"%s\" из архива не удалось: %s" @@ -3435,17 +3589,17 @@ msgstr "восстановить файл \"%s\" из архива не удал #. translator: First %s represents a postgresql.conf parameter name like #. "recovery_end_command", the 2nd is the value of that parameter, the #. third an already translated error message. -#: access/transam/xlogarchive.c:368 +#: access/transam/xlogarchive.c:369 #, c-format msgid "%s \"%s\": %s" msgstr "%s \"%s\": %s" -#: access/transam/xlogarchive.c:478 access/transam/xlogarchive.c:542 +#: access/transam/xlogarchive.c:479 access/transam/xlogarchive.c:543 #, c-format msgid "could not create archive status file \"%s\": %m" msgstr "не удалось создать файл состояния архива \"%s\": %m" -#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:550 +#: access/transam/xlogarchive.c:487 access/transam/xlogarchive.c:551 #, c-format msgid "could not write archive status file \"%s\": %m" msgstr "не удалось записать файл состояния архива \"%s\": %m" @@ -3465,35 +3619,37 @@ msgstr "выполняется не монопольное резервное к msgid "Did you mean to use pg_stop_backup('f')?" msgstr "Вероятно, подразумевалось pg_stop_backup('f')?" -#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1332 -#: commands/event_trigger.c:1890 commands/extension.c:1944 -#: commands/extension.c:2052 commands/extension.c:2337 commands/prepare.c:712 -#: executor/execExpr.c:2203 executor/execSRF.c:728 executor/functions.c:1040 -#: foreign/foreign.c:520 libpq/hba.c:2666 replication/logical/launcher.c:1086 -#: replication/logical/logicalfuncs.c:157 replication/logical/origin.c:1486 -#: replication/slotfuncs.c:252 replication/walsender.c:3258 -#: storage/ipc/shmem.c:550 utils/adt/datetime.c:4765 utils/adt/genfile.c:505 -#: utils/adt/genfile.c:588 utils/adt/jsonfuncs.c:1792 -#: utils/adt/jsonfuncs.c:1904 utils/adt/jsonfuncs.c:2092 -#: utils/adt/jsonfuncs.c:2201 utils/adt/jsonfuncs.c:3663 utils/adt/misc.c:215 -#: utils/adt/pgstatfuncs.c:476 utils/adt/pgstatfuncs.c:584 -#: utils/adt/pgstatfuncs.c:1719 utils/fmgr/funcapi.c:72 utils/misc/guc.c:9676 -#: utils/mmgr/portalmem.c:1136 +#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1311 +#: commands/event_trigger.c:1869 commands/extension.c:1945 +#: commands/extension.c:2053 commands/extension.c:2338 commands/prepare.c:713 +#: executor/execExpr.c:2507 executor/execSRF.c:738 executor/functions.c:1058 +#: foreign/foreign.c:520 libpq/hba.c:2722 replication/logical/launcher.c:937 +#: replication/logical/logicalfuncs.c:157 replication/logical/origin.c:1494 +#: replication/slotfuncs.c:255 replication/walsender.c:3300 +#: storage/ipc/shmem.c:554 utils/adt/datetime.c:4812 utils/adt/genfile.c:507 +#: utils/adt/genfile.c:590 utils/adt/jsonfuncs.c:1935 +#: utils/adt/jsonfuncs.c:2047 utils/adt/jsonfuncs.c:2235 +#: utils/adt/jsonfuncs.c:2344 utils/adt/jsonfuncs.c:3805 +#: utils/adt/mcxtfuncs.c:132 utils/adt/misc.c:218 utils/adt/pgstatfuncs.c:477 +#: utils/adt/pgstatfuncs.c:587 utils/adt/pgstatfuncs.c:1887 +#: utils/adt/varlena.c:4825 utils/fmgr/funcapi.c:74 utils/misc/guc.c:9994 +#: utils/mmgr/portalmem.c:1145 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "функция, возвращающая множество, вызвана в контексте, где ему нет места" -#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1336 -#: commands/event_trigger.c:1894 commands/extension.c:1948 -#: commands/extension.c:2056 commands/extension.c:2341 commands/prepare.c:716 -#: foreign/foreign.c:525 libpq/hba.c:2670 replication/logical/launcher.c:1090 -#: replication/logical/logicalfuncs.c:161 replication/logical/origin.c:1490 -#: replication/slotfuncs.c:256 replication/walsender.c:3262 -#: storage/ipc/shmem.c:554 utils/adt/datetime.c:4769 utils/adt/genfile.c:509 -#: utils/adt/genfile.c:592 utils/adt/misc.c:219 utils/adt/pgstatfuncs.c:480 -#: utils/adt/pgstatfuncs.c:588 utils/adt/pgstatfuncs.c:1723 -#: utils/misc/guc.c:9680 utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1140 +#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1315 +#: commands/event_trigger.c:1873 commands/extension.c:1949 +#: commands/extension.c:2057 commands/extension.c:2342 commands/prepare.c:717 +#: foreign/foreign.c:525 libpq/hba.c:2726 replication/logical/launcher.c:941 +#: replication/logical/logicalfuncs.c:161 replication/logical/origin.c:1498 +#: replication/slotfuncs.c:259 replication/walsender.c:3304 +#: storage/ipc/shmem.c:558 utils/adt/datetime.c:4816 utils/adt/genfile.c:511 +#: utils/adt/genfile.c:594 utils/adt/mcxtfuncs.c:136 utils/adt/misc.c:222 +#: utils/adt/pgstatfuncs.c:481 utils/adt/pgstatfuncs.c:591 +#: utils/adt/pgstatfuncs.c:1891 utils/adt/varlena.c:4829 utils/misc/guc.c:9998 +#: utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1149 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "требуется режим материализации, но он недопустим в этом контексте" @@ -3524,103 +3680,108 @@ msgstr "значение для точки восстановления прев msgid "%s cannot be executed during recovery." msgstr "выполнить %s во время восстановления нельзя." -#: access/transam/xlogfuncs.c:531 access/transam/xlogfuncs.c:558 -#: access/transam/xlogfuncs.c:582 access/transam/xlogfuncs.c:722 +#: access/transam/xlogfuncs.c:531 access/transam/xlogfuncs.c:561 +#: access/transam/xlogfuncs.c:585 access/transam/xlogfuncs.c:608 +#: access/transam/xlogfuncs.c:763 #, c-format msgid "recovery is not in progress" msgstr "восстановление не выполняется" -#: access/transam/xlogfuncs.c:532 access/transam/xlogfuncs.c:559 -#: access/transam/xlogfuncs.c:583 access/transam/xlogfuncs.c:723 +#: access/transam/xlogfuncs.c:532 access/transam/xlogfuncs.c:562 +#: access/transam/xlogfuncs.c:586 access/transam/xlogfuncs.c:609 +#: access/transam/xlogfuncs.c:764 #, c-format msgid "Recovery control functions can only be executed during recovery." msgstr "" "Функции управления восстановлением можно использовать только в процессе " "восстановления." -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:564 +#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:567 #, c-format msgid "standby promotion is ongoing" msgstr "производится повышение ведомого" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:565 +#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 #, c-format msgid "%s cannot be executed after promotion is triggered." msgstr "%s нельзя выполнять, когда производится повышение." -#: access/transam/xlogfuncs.c:728 +#: access/transam/xlogfuncs.c:769 #, c-format msgid "\"wait_seconds\" must not be negative or zero" msgstr "значение \"wait_seconds\" не должно быть отрицательным или нулевым" -#: access/transam/xlogfuncs.c:748 storage/ipc/signalfuncs.c:164 +#: access/transam/xlogfuncs.c:789 storage/ipc/signalfuncs.c:247 #, c-format msgid "failed to send signal to postmaster: %m" msgstr "отправить сигнал процессу postmaster не удалось: %m" -#: access/transam/xlogfuncs.c:784 +#: access/transam/xlogfuncs.c:825 #, c-format -msgid "server did not promote within %d seconds" -msgstr "повышение сервера не завершилось за %d сек." +msgid "server did not promote within %d second" +msgid_plural "server did not promote within %d seconds" +msgstr[0] "повышение сервера не завершилось за %d секунду" +msgstr[1] "повышение сервера не завершилось за %d секунды" +msgstr[2] "повышение сервера не завершилось за %d секунд" -#: access/transam/xlogreader.c:349 +#: access/transam/xlogreader.c:354 #, c-format msgid "invalid record offset at %X/%X" msgstr "неверное смещение записи: %X/%X" -#: access/transam/xlogreader.c:357 +#: access/transam/xlogreader.c:362 #, c-format msgid "contrecord is requested by %X/%X" msgstr "по смещению %X/%X запрошено продолжение записи" -#: access/transam/xlogreader.c:398 access/transam/xlogreader.c:695 +#: access/transam/xlogreader.c:403 access/transam/xlogreader.c:733 #, c-format msgid "invalid record length at %X/%X: wanted %u, got %u" msgstr "неверная длина записи по смещению %X/%X: ожидалось %u, получено %u" -#: access/transam/xlogreader.c:422 +#: access/transam/xlogreader.c:429 #, c-format msgid "record length %u at %X/%X too long" msgstr "длина записи %u по смещению %X/%X слишком велика" -#: access/transam/xlogreader.c:454 +#: access/transam/xlogreader.c:477 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "нет флага contrecord в позиции %X/%X" -#: access/transam/xlogreader.c:467 +#: access/transam/xlogreader.c:490 #, c-format -msgid "invalid contrecord length %u at %X/%X" -msgstr "неверная длина contrecord (%u) в позиции %X/%X" +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "неверная длина contrecord: %u (ожидалось %lld) в позиции %X/%X" -#: access/transam/xlogreader.c:703 +#: access/transam/xlogreader.c:741 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "неверный ID менеджера ресурсов %u по смещению %X/%X" -#: access/transam/xlogreader.c:717 access/transam/xlogreader.c:734 +#: access/transam/xlogreader.c:754 access/transam/xlogreader.c:770 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "запись с неверной ссылкой назад %X/%X по смещению %X/%X" -#: access/transam/xlogreader.c:771 +#: access/transam/xlogreader.c:806 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" "некорректная контрольная сумма данных менеджера ресурсов в записи по " "смещению %X/%X" -#: access/transam/xlogreader.c:808 +#: access/transam/xlogreader.c:843 #, c-format msgid "invalid magic number %04X in log segment %s, offset %u" msgstr "неверное магическое число %04X в сегменте журнала %s, смещение %u" -#: access/transam/xlogreader.c:822 access/transam/xlogreader.c:863 +#: access/transam/xlogreader.c:857 access/transam/xlogreader.c:898 #, c-format msgid "invalid info bits %04X in log segment %s, offset %u" msgstr "неверные информационные биты %04X в сегменте журнала %s, смещение %u" -#: access/transam/xlogreader.c:837 +#: access/transam/xlogreader.c:872 #, c-format msgid "" "WAL file is from different database system: WAL file database system " @@ -3629,7 +3790,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: в нём указан идентификатор системы БД " "%llu, а идентификатор системы pg_control: %llu" -#: access/transam/xlogreader.c:845 +#: access/transam/xlogreader.c:880 #, c-format msgid "" "WAL file is from different database system: incorrect segment size in page " @@ -3638,7 +3799,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный размер сегмента в заголовке " "страницы" -#: access/transam/xlogreader.c:851 +#: access/transam/xlogreader.c:886 #, c-format msgid "" "WAL file is from different database system: incorrect XLOG_BLCKSZ in page " @@ -3647,35 +3808,35 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке " "страницы" -#: access/transam/xlogreader.c:882 +#: access/transam/xlogreader.c:917 #, c-format msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" msgstr "неожиданный pageaddr %X/%X в сегменте журнала %s, смещение %u" -#: access/transam/xlogreader.c:907 +#: access/transam/xlogreader.c:942 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" msgstr "" "нарушение последовательности ID линии времени %u (после %u) в сегменте " "журнала %s, смещение %u" -#: access/transam/xlogreader.c:1247 +#: access/transam/xlogreader.c:1287 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X" -#: access/transam/xlogreader.c:1270 +#: access/transam/xlogreader.c:1309 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA установлен, но данных в позиции %X/%X нет" -#: access/transam/xlogreader.c:1277 +#: access/transam/xlogreader.c:1316 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "" "BKPBLOCK_HAS_DATA не установлен, но длина данных равна %u в позиции %X/%X" -#: access/transam/xlogreader.c:1313 +#: access/transam/xlogreader.c:1352 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -3684,21 +3845,21 @@ msgstr "" "BKPIMAGE_HAS_HOLE установлен, но для пропуска заданы смещение %u и длина %u " "при длине образа блока %u в позиции %X/%X" -#: access/transam/xlogreader.c:1329 +#: access/transam/xlogreader.c:1368 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "" "BKPIMAGE_HAS_HOLE не установлен, но для пропуска заданы смещение %u и длина " "%u в позиции %X/%X" -#: access/transam/xlogreader.c:1344 +#: access/transam/xlogreader.c:1383 #, c-format msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" msgstr "" "BKPIMAGE_IS_COMPRESSED установлен, но длина образа блока равна %u в позиции " "%X/%X" -#: access/transam/xlogreader.c:1359 +#: access/transam/xlogreader.c:1398 #, c-format msgid "" "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image " @@ -3707,51 +3868,51 @@ msgstr "" "ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_IS_COMPRESSED не установлены, но длина " "образа блока равна %u в позиции %X/%X" -#: access/transam/xlogreader.c:1375 +#: access/transam/xlogreader.c:1414 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "" "BKPBLOCK_SAME_REL установлен, но предыдущее значение не задано в позиции %X/" "%X" -#: access/transam/xlogreader.c:1387 +#: access/transam/xlogreader.c:1426 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: access/transam/xlogreader.c:1476 +#: access/transam/xlogreader.c:1513 #, c-format msgid "record with invalid length at %X/%X" msgstr "запись с неверной длиной в позиции %X/%X" -#: access/transam/xlogreader.c:1565 +#: access/transam/xlogreader.c:1602 #, c-format msgid "invalid compressed image at %X/%X, block %d" msgstr "неверный сжатый образ в позиции %X/%X, блок %d" -#: bootstrap/bootstrap.c:271 +#: bootstrap/bootstrap.c:270 #, c-format msgid "-X requires a power of two value between 1 MB and 1 GB" msgstr "" "для -X требуется число, равное степени двух, в интервале от 1 МБ до 1 ГБ" -#: bootstrap/bootstrap.c:288 postmaster/postmaster.c:842 tcop/postgres.c:3717 +#: bootstrap/bootstrap.c:287 postmaster/postmaster.c:847 tcop/postgres.c:3858 #, c-format msgid "--%s requires a value" msgstr "для --%s требуется значение" -#: bootstrap/bootstrap.c:293 postmaster/postmaster.c:847 tcop/postgres.c:3722 +#: bootstrap/bootstrap.c:292 postmaster/postmaster.c:852 tcop/postgres.c:3863 #, c-format msgid "-c %s requires a value" msgstr "для -c %s требуется значение" -#: bootstrap/bootstrap.c:304 postmaster/postmaster.c:859 -#: postmaster/postmaster.c:872 +#: bootstrap/bootstrap.c:303 postmaster/postmaster.c:864 +#: postmaster/postmaster.c:877 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Для дополнительной информации попробуйте \"%s --help\".\n" -#: bootstrap/bootstrap.c:313 +#: bootstrap/bootstrap.c:312 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s: неверные аргументы командной строки\n" @@ -3803,93 +3964,98 @@ msgstr "для столбца \"%s\" отношения \"%s\" были отоз msgid "not all privileges could be revoked for \"%s\"" msgstr "для объекта \"%s\" были отозваны не все права" -#: catalog/aclchk.c:430 catalog/aclchk.c:973 +#: catalog/aclchk.c:379 +#, c-format +msgid "grantor must be current user" +msgstr "праводателем должен быть текущий пользователь" + +#: catalog/aclchk.c:446 catalog/aclchk.c:989 #, c-format msgid "invalid privilege type %s for relation" msgstr "право %s неприменимо для отношений" -#: catalog/aclchk.c:434 catalog/aclchk.c:977 +#: catalog/aclchk.c:450 catalog/aclchk.c:993 #, c-format msgid "invalid privilege type %s for sequence" msgstr "право %s неприменимо для последовательностей" -#: catalog/aclchk.c:438 +#: catalog/aclchk.c:454 #, c-format msgid "invalid privilege type %s for database" msgstr "право %s неприменимо для баз данных" -#: catalog/aclchk.c:442 +#: catalog/aclchk.c:458 #, c-format msgid "invalid privilege type %s for domain" msgstr "право %s неприменимо для домена" -#: catalog/aclchk.c:446 catalog/aclchk.c:981 +#: catalog/aclchk.c:462 catalog/aclchk.c:997 #, c-format msgid "invalid privilege type %s for function" msgstr "право %s неприменимо для функций" -#: catalog/aclchk.c:450 +#: catalog/aclchk.c:466 #, c-format msgid "invalid privilege type %s for language" msgstr "право %s неприменимо для языков" -#: catalog/aclchk.c:454 +#: catalog/aclchk.c:470 #, c-format msgid "invalid privilege type %s for large object" msgstr "право %s неприменимо для больших объектов" -#: catalog/aclchk.c:458 catalog/aclchk.c:997 +#: catalog/aclchk.c:474 catalog/aclchk.c:1013 #, c-format msgid "invalid privilege type %s for schema" msgstr "право %s неприменимо для схем" -#: catalog/aclchk.c:462 catalog/aclchk.c:985 +#: catalog/aclchk.c:478 catalog/aclchk.c:1001 #, c-format msgid "invalid privilege type %s for procedure" msgstr "право %s неприменимо для процедур" -#: catalog/aclchk.c:466 catalog/aclchk.c:989 +#: catalog/aclchk.c:482 catalog/aclchk.c:1005 #, c-format msgid "invalid privilege type %s for routine" msgstr "право %s неприменимо для подпрограмм" -#: catalog/aclchk.c:470 +#: catalog/aclchk.c:486 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "право %s неприменимо для табличных пространств" -#: catalog/aclchk.c:474 catalog/aclchk.c:993 +#: catalog/aclchk.c:490 catalog/aclchk.c:1009 #, c-format msgid "invalid privilege type %s for type" msgstr "право %s неприменимо для типа" -#: catalog/aclchk.c:478 +#: catalog/aclchk.c:494 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "право %s неприменимо для обёрток сторонних данных" -#: catalog/aclchk.c:482 +#: catalog/aclchk.c:498 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "право %s неприменимо для сторонних серверов" -#: catalog/aclchk.c:521 +#: catalog/aclchk.c:537 #, c-format msgid "column privileges are only valid for relations" msgstr "права для столбцов применимы только к отношениям" -#: catalog/aclchk.c:681 catalog/aclchk.c:4103 catalog/aclchk.c:4885 -#: catalog/objectaddress.c:965 catalog/pg_largeobject.c:116 -#: storage/large_object/inv_api.c:285 +#: catalog/aclchk.c:697 catalog/aclchk.c:4164 catalog/aclchk.c:4985 +#: catalog/objectaddress.c:1060 catalog/pg_largeobject.c:116 +#: storage/large_object/inv_api.c:287 #, c-format msgid "large object %u does not exist" msgstr "большой объект %u не существует" -#: catalog/aclchk.c:910 catalog/aclchk.c:919 commands/collationcmds.c:118 -#: commands/copy.c:1134 commands/copy.c:1154 commands/copy.c:1163 -#: commands/copy.c:1172 commands/copy.c:1181 commands/copy.c:1190 -#: commands/copy.c:1199 commands/copy.c:1208 commands/copy.c:1226 -#: commands/copy.c:1242 commands/copy.c:1262 commands/copy.c:1279 +#: catalog/aclchk.c:926 catalog/aclchk.c:935 commands/collationcmds.c:119 +#: commands/copy.c:362 commands/copy.c:382 commands/copy.c:392 +#: commands/copy.c:401 commands/copy.c:410 commands/copy.c:420 +#: commands/copy.c:429 commands/copy.c:438 commands/copy.c:456 +#: commands/copy.c:472 commands/copy.c:492 commands/copy.c:509 #: commands/dbcommands.c:157 commands/dbcommands.c:166 #: commands/dbcommands.c:175 commands/dbcommands.c:184 #: commands/dbcommands.c:193 commands/dbcommands.c:202 @@ -3897,103 +4063,107 @@ msgstr "большой объект %u не существует" #: commands/dbcommands.c:229 commands/dbcommands.c:238 #: commands/dbcommands.c:260 commands/dbcommands.c:1502 #: commands/dbcommands.c:1511 commands/dbcommands.c:1520 -#: commands/dbcommands.c:1529 commands/extension.c:1735 -#: commands/extension.c:1745 commands/extension.c:1755 -#: commands/extension.c:3055 commands/foreigncmds.c:539 -#: commands/foreigncmds.c:548 commands/functioncmds.c:570 -#: commands/functioncmds.c:736 commands/functioncmds.c:745 -#: commands/functioncmds.c:754 commands/functioncmds.c:763 -#: commands/functioncmds.c:2014 commands/functioncmds.c:2022 -#: commands/publicationcmds.c:90 commands/publicationcmds.c:133 -#: commands/sequence.c:1267 commands/sequence.c:1277 commands/sequence.c:1287 -#: commands/sequence.c:1297 commands/sequence.c:1307 commands/sequence.c:1317 -#: commands/sequence.c:1327 commands/sequence.c:1337 commands/sequence.c:1347 -#: commands/subscriptioncmds.c:104 commands/subscriptioncmds.c:114 +#: commands/dbcommands.c:1529 commands/extension.c:1736 +#: commands/extension.c:1746 commands/extension.c:1756 +#: commands/extension.c:3056 commands/foreigncmds.c:539 +#: commands/foreigncmds.c:548 commands/functioncmds.c:605 +#: commands/functioncmds.c:771 commands/functioncmds.c:780 +#: commands/functioncmds.c:789 commands/functioncmds.c:798 +#: commands/functioncmds.c:2095 commands/functioncmds.c:2103 +#: commands/publicationcmds.c:87 commands/publicationcmds.c:130 +#: commands/sequence.c:1266 commands/sequence.c:1276 commands/sequence.c:1286 +#: commands/sequence.c:1296 commands/sequence.c:1306 commands/sequence.c:1316 +#: commands/sequence.c:1326 commands/sequence.c:1336 commands/sequence.c:1346 #: commands/subscriptioncmds.c:124 commands/subscriptioncmds.c:134 -#: commands/subscriptioncmds.c:148 commands/subscriptioncmds.c:159 -#: commands/subscriptioncmds.c:173 commands/tablecmds.c:7104 -#: commands/typecmds.c:322 commands/typecmds.c:1355 commands/typecmds.c:1364 -#: commands/typecmds.c:1372 commands/typecmds.c:1380 commands/typecmds.c:1388 -#: commands/user.c:133 commands/user.c:147 commands/user.c:156 -#: commands/user.c:165 commands/user.c:174 commands/user.c:183 -#: commands/user.c:192 commands/user.c:201 commands/user.c:210 -#: commands/user.c:219 commands/user.c:228 commands/user.c:237 -#: commands/user.c:246 commands/user.c:582 commands/user.c:590 -#: commands/user.c:598 commands/user.c:606 commands/user.c:614 -#: commands/user.c:622 commands/user.c:630 commands/user.c:638 -#: commands/user.c:647 commands/user.c:655 commands/user.c:663 -#: parser/parse_utilcmd.c:403 replication/pgoutput/pgoutput.c:141 -#: replication/pgoutput/pgoutput.c:162 replication/walsender.c:890 -#: replication/walsender.c:901 replication/walsender.c:911 +#: commands/subscriptioncmds.c:144 commands/subscriptioncmds.c:154 +#: commands/subscriptioncmds.c:170 commands/subscriptioncmds.c:181 +#: commands/subscriptioncmds.c:195 commands/subscriptioncmds.c:205 +#: commands/subscriptioncmds.c:215 commands/tablecmds.c:7541 +#: commands/typecmds.c:335 commands/typecmds.c:1416 commands/typecmds.c:1425 +#: commands/typecmds.c:1433 commands/typecmds.c:1441 commands/typecmds.c:1449 +#: commands/typecmds.c:1457 commands/user.c:133 commands/user.c:147 +#: commands/user.c:156 commands/user.c:165 commands/user.c:174 +#: commands/user.c:183 commands/user.c:192 commands/user.c:201 +#: commands/user.c:210 commands/user.c:219 commands/user.c:228 +#: commands/user.c:237 commands/user.c:246 commands/user.c:582 +#: commands/user.c:590 commands/user.c:598 commands/user.c:606 +#: commands/user.c:614 commands/user.c:622 commands/user.c:630 +#: commands/user.c:638 commands/user.c:647 commands/user.c:655 +#: commands/user.c:663 parser/parse_utilcmd.c:397 +#: replication/pgoutput/pgoutput.c:189 replication/pgoutput/pgoutput.c:210 +#: replication/pgoutput/pgoutput.c:224 replication/pgoutput/pgoutput.c:234 +#: replication/pgoutput/pgoutput.c:244 replication/walsender.c:882 +#: replication/walsender.c:893 replication/walsender.c:903 #, c-format msgid "conflicting or redundant options" msgstr "конфликтующие или избыточные параметры" -#: catalog/aclchk.c:1030 +#: catalog/aclchk.c:1046 #, c-format msgid "default privileges cannot be set for columns" msgstr "права по умолчанию нельзя определить для столбцов" -#: catalog/aclchk.c:1190 +#: catalog/aclchk.c:1206 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "предложение IN SCHEMA нельзя использовать в GRANT/REVOKE ON SCHEMAS" -#: catalog/aclchk.c:1561 catalog/catalog.c:506 catalog/objectaddress.c:1427 -#: commands/analyze.c:389 commands/copy.c:5087 commands/sequence.c:1702 -#: commands/tablecmds.c:6580 commands/tablecmds.c:6723 -#: commands/tablecmds.c:6773 commands/tablecmds.c:6847 -#: commands/tablecmds.c:6917 commands/tablecmds.c:7029 -#: commands/tablecmds.c:7123 commands/tablecmds.c:7182 -#: commands/tablecmds.c:7271 commands/tablecmds.c:7300 -#: commands/tablecmds.c:7455 commands/tablecmds.c:7537 -#: commands/tablecmds.c:7630 commands/tablecmds.c:7785 -#: commands/tablecmds.c:10990 commands/tablecmds.c:11172 -#: commands/tablecmds.c:11332 commands/tablecmds.c:12415 commands/trigger.c:876 -#: parser/analyze.c:2338 parser/parse_relation.c:713 parser/parse_target.c:1036 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3314 -#: parser/parse_utilcmd.c:3349 parser/parse_utilcmd.c:3391 utils/adt/acl.c:2869 -#: utils/adt/ruleutils.c:2535 +#: catalog/aclchk.c:1544 catalog/catalog.c:557 catalog/objectaddress.c:1522 +#: commands/analyze.c:390 commands/copy.c:741 commands/sequence.c:1701 +#: commands/tablecmds.c:7004 commands/tablecmds.c:7160 +#: commands/tablecmds.c:7210 commands/tablecmds.c:7284 +#: commands/tablecmds.c:7354 commands/tablecmds.c:7466 +#: commands/tablecmds.c:7560 commands/tablecmds.c:7619 +#: commands/tablecmds.c:7708 commands/tablecmds.c:7737 +#: commands/tablecmds.c:7892 commands/tablecmds.c:7974 +#: commands/tablecmds.c:8130 commands/tablecmds.c:8248 +#: commands/tablecmds.c:11597 commands/tablecmds.c:11778 +#: commands/tablecmds.c:11938 commands/tablecmds.c:13081 +#: commands/tablecmds.c:15646 commands/trigger.c:942 parser/analyze.c:2428 +#: parser/parse_relation.c:714 parser/parse_target.c:1063 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3421 +#: parser/parse_utilcmd.c:3456 parser/parse_utilcmd.c:3498 utils/adt/acl.c:2845 +#: utils/adt/ruleutils.c:2712 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "столбец \"%s\" в таблице \"%s\" не существует" -#: catalog/aclchk.c:1824 catalog/objectaddress.c:1267 commands/sequence.c:1140 -#: commands/tablecmds.c:236 commands/tablecmds.c:15728 utils/adt/acl.c:2059 -#: utils/adt/acl.c:2089 utils/adt/acl.c:2121 utils/adt/acl.c:2153 -#: utils/adt/acl.c:2181 utils/adt/acl.c:2211 +#: catalog/aclchk.c:1807 catalog/objectaddress.c:1362 commands/sequence.c:1139 +#: commands/tablecmds.c:249 commands/tablecmds.c:16510 utils/adt/acl.c:2053 +#: utils/adt/acl.c:2083 utils/adt/acl.c:2115 utils/adt/acl.c:2147 +#: utils/adt/acl.c:2175 utils/adt/acl.c:2205 #, c-format msgid "\"%s\" is not a sequence" msgstr "\"%s\" - это не последовательность" -#: catalog/aclchk.c:1862 +#: catalog/aclchk.c:1845 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "" "для последовательности \"%s\" применимы только права USAGE, SELECT и UPDATE" -#: catalog/aclchk.c:1879 +#: catalog/aclchk.c:1862 #, c-format msgid "invalid privilege type %s for table" msgstr "право %s неприменимо для таблиц" -#: catalog/aclchk.c:2045 +#: catalog/aclchk.c:2028 #, c-format msgid "invalid privilege type %s for column" msgstr "право %s неприменимо для столбцов" -#: catalog/aclchk.c:2058 +#: catalog/aclchk.c:2041 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "для последовательности \"%s\" применимо только право SELECT" # TO REVIEW -#: catalog/aclchk.c:2640 +#: catalog/aclchk.c:2623 #, c-format msgid "language \"%s\" is not trusted" msgstr "язык \"%s\" не является доверенным" -#: catalog/aclchk.c:2642 +#: catalog/aclchk.c:2625 #, c-format msgid "" "GRANT and REVOKE are not allowed on untrusted languages, because only " @@ -4002,526 +4172,552 @@ msgstr "" "GRANT и REVOKE не допускаются для недоверенных языков, так как использовать " "такие языки могут только суперпользователи." -#: catalog/aclchk.c:3156 +#: catalog/aclchk.c:3139 #, c-format msgid "cannot set privileges of array types" msgstr "для типов массивов нельзя определить права" -#: catalog/aclchk.c:3157 +#: catalog/aclchk.c:3140 #, c-format msgid "Set the privileges of the element type instead." msgstr "Вместо этого установите права для типа элемента." -#: catalog/aclchk.c:3164 catalog/objectaddress.c:1561 +#: catalog/aclchk.c:3147 catalog/objectaddress.c:1656 #, c-format msgid "\"%s\" is not a domain" msgstr "\"%s\" - это не домен" -#: catalog/aclchk.c:3284 +#: catalog/aclchk.c:3267 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "нераспознанное право: \"%s\"" -#: catalog/aclchk.c:3345 +#: catalog/aclchk.c:3328 #, c-format msgid "permission denied for aggregate %s" msgstr "нет доступа к агрегату %s" -#: catalog/aclchk.c:3348 +#: catalog/aclchk.c:3331 #, c-format msgid "permission denied for collation %s" msgstr "нет доступа к правилу сортировки %s" -#: catalog/aclchk.c:3351 +#: catalog/aclchk.c:3334 #, c-format msgid "permission denied for column %s" msgstr "нет доступа к столбцу %s" -#: catalog/aclchk.c:3354 +#: catalog/aclchk.c:3337 #, c-format msgid "permission denied for conversion %s" msgstr "нет доступа к преобразованию %s" -#: catalog/aclchk.c:3357 +#: catalog/aclchk.c:3340 #, c-format msgid "permission denied for database %s" msgstr "нет доступа к базе данных %s" -#: catalog/aclchk.c:3360 +#: catalog/aclchk.c:3343 #, c-format msgid "permission denied for domain %s" msgstr "нет доступа к домену %s" -#: catalog/aclchk.c:3363 +#: catalog/aclchk.c:3346 #, c-format msgid "permission denied for event trigger %s" msgstr "нет доступа к событийному триггеру %s" -#: catalog/aclchk.c:3366 +#: catalog/aclchk.c:3349 #, c-format msgid "permission denied for extension %s" msgstr "нет доступа к расширению %s" -#: catalog/aclchk.c:3369 +#: catalog/aclchk.c:3352 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "нет доступа к обёртке сторонних данных %s" -#: catalog/aclchk.c:3372 +#: catalog/aclchk.c:3355 #, c-format msgid "permission denied for foreign server %s" msgstr "нет доступа к стороннему серверу %s" -#: catalog/aclchk.c:3375 +#: catalog/aclchk.c:3358 #, c-format msgid "permission denied for foreign table %s" msgstr "нет доступа к сторонней таблице %s" -#: catalog/aclchk.c:3378 +#: catalog/aclchk.c:3361 #, c-format msgid "permission denied for function %s" msgstr "нет доступа к функции %s" -#: catalog/aclchk.c:3381 +#: catalog/aclchk.c:3364 #, c-format msgid "permission denied for index %s" msgstr "нет доступа к индексу %s" -#: catalog/aclchk.c:3384 +#: catalog/aclchk.c:3367 #, c-format msgid "permission denied for language %s" msgstr "нет доступа к языку %s" -#: catalog/aclchk.c:3387 +#: catalog/aclchk.c:3370 #, c-format msgid "permission denied for large object %s" msgstr "нет доступа к большому объекту %s" -#: catalog/aclchk.c:3390 +#: catalog/aclchk.c:3373 #, c-format msgid "permission denied for materialized view %s" msgstr "нет доступа к материализованному представлению %s" -#: catalog/aclchk.c:3393 +#: catalog/aclchk.c:3376 #, c-format msgid "permission denied for operator class %s" msgstr "нет доступа к классу операторов %s" -#: catalog/aclchk.c:3396 +#: catalog/aclchk.c:3379 #, c-format msgid "permission denied for operator %s" msgstr "нет доступа к оператору %s" -#: catalog/aclchk.c:3399 +#: catalog/aclchk.c:3382 #, c-format msgid "permission denied for operator family %s" msgstr "нет доступа к семейству операторов %s" -#: catalog/aclchk.c:3402 +#: catalog/aclchk.c:3385 #, c-format msgid "permission denied for policy %s" msgstr "нет доступа к политике %s" -#: catalog/aclchk.c:3405 +#: catalog/aclchk.c:3388 #, c-format msgid "permission denied for procedure %s" msgstr "нет доступа к процедуре %s" -#: catalog/aclchk.c:3408 +#: catalog/aclchk.c:3391 #, c-format msgid "permission denied for publication %s" msgstr "нет доступа к публикации %s" -#: catalog/aclchk.c:3411 +#: catalog/aclchk.c:3394 #, c-format msgid "permission denied for routine %s" msgstr "нет доступа к подпрограмме %s" -#: catalog/aclchk.c:3414 +#: catalog/aclchk.c:3397 #, c-format msgid "permission denied for schema %s" msgstr "нет доступа к схеме %s" -#: catalog/aclchk.c:3417 commands/sequence.c:610 commands/sequence.c:844 -#: commands/sequence.c:886 commands/sequence.c:927 commands/sequence.c:1800 -#: commands/sequence.c:1864 +#: catalog/aclchk.c:3400 commands/sequence.c:610 commands/sequence.c:844 +#: commands/sequence.c:886 commands/sequence.c:927 commands/sequence.c:1799 +#: commands/sequence.c:1863 #, c-format msgid "permission denied for sequence %s" msgstr "нет доступа к последовательности %s" -#: catalog/aclchk.c:3420 +#: catalog/aclchk.c:3403 #, c-format msgid "permission denied for statistics object %s" msgstr "нет доступа к объекту статистики %s" -#: catalog/aclchk.c:3423 +#: catalog/aclchk.c:3406 #, c-format msgid "permission denied for subscription %s" msgstr "нет доступа к подписке %s" -#: catalog/aclchk.c:3426 +#: catalog/aclchk.c:3409 #, c-format msgid "permission denied for table %s" msgstr "нет доступа к таблице %s" -#: catalog/aclchk.c:3429 +#: catalog/aclchk.c:3412 #, c-format msgid "permission denied for tablespace %s" msgstr "нет доступа к табличному пространству %s" -#: catalog/aclchk.c:3432 +#: catalog/aclchk.c:3415 #, c-format msgid "permission denied for text search configuration %s" msgstr "нет доступа к конфигурации текстового поиска %s" -#: catalog/aclchk.c:3435 +#: catalog/aclchk.c:3418 #, c-format msgid "permission denied for text search dictionary %s" msgstr "нет доступа к словарю текстового поиска %s" -#: catalog/aclchk.c:3438 +#: catalog/aclchk.c:3421 #, c-format msgid "permission denied for type %s" msgstr "нет доступа к типу %s" -#: catalog/aclchk.c:3441 +#: catalog/aclchk.c:3424 #, c-format msgid "permission denied for view %s" msgstr "нет доступа к представлению %s" -#: catalog/aclchk.c:3476 +#: catalog/aclchk.c:3459 #, c-format msgid "must be owner of aggregate %s" msgstr "нужно быть владельцем агрегата %s" -#: catalog/aclchk.c:3479 +#: catalog/aclchk.c:3462 #, c-format msgid "must be owner of collation %s" msgstr "нужно быть владельцем правила сортировки %s" -#: catalog/aclchk.c:3482 +#: catalog/aclchk.c:3465 #, c-format msgid "must be owner of conversion %s" msgstr "нужно быть владельцем преобразования %s" -#: catalog/aclchk.c:3485 +#: catalog/aclchk.c:3468 #, c-format msgid "must be owner of database %s" msgstr "нужно быть владельцем базы %s" -#: catalog/aclchk.c:3488 +#: catalog/aclchk.c:3471 #, c-format msgid "must be owner of domain %s" msgstr "нужно быть владельцем домена %s" -#: catalog/aclchk.c:3491 +#: catalog/aclchk.c:3474 #, c-format msgid "must be owner of event trigger %s" msgstr "нужно быть владельцем событийного триггера %s" -#: catalog/aclchk.c:3494 +#: catalog/aclchk.c:3477 #, c-format msgid "must be owner of extension %s" msgstr "нужно быть владельцем расширения %s" -#: catalog/aclchk.c:3497 +#: catalog/aclchk.c:3480 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "нужно быть владельцем обёртки сторонних данных %s" -#: catalog/aclchk.c:3500 +#: catalog/aclchk.c:3483 #, c-format msgid "must be owner of foreign server %s" msgstr "нужно быть \"владельцем\" стороннего сервера %s" -#: catalog/aclchk.c:3503 +#: catalog/aclchk.c:3486 #, c-format msgid "must be owner of foreign table %s" msgstr "нужно быть владельцем сторонней таблицы %s" -#: catalog/aclchk.c:3506 +#: catalog/aclchk.c:3489 #, c-format msgid "must be owner of function %s" msgstr "нужно быть владельцем функции %s" -#: catalog/aclchk.c:3509 +#: catalog/aclchk.c:3492 #, c-format msgid "must be owner of index %s" msgstr "нужно быть владельцем индекса %s" -#: catalog/aclchk.c:3512 +#: catalog/aclchk.c:3495 #, c-format msgid "must be owner of language %s" msgstr "нужно быть владельцем языка %s" -#: catalog/aclchk.c:3515 +#: catalog/aclchk.c:3498 #, c-format msgid "must be owner of large object %s" msgstr "нужно быть владельцем большого объекта %s" -#: catalog/aclchk.c:3518 +#: catalog/aclchk.c:3501 #, c-format msgid "must be owner of materialized view %s" msgstr "нужно быть владельцем материализованного представления %s" -#: catalog/aclchk.c:3521 +#: catalog/aclchk.c:3504 #, c-format msgid "must be owner of operator class %s" msgstr "нужно быть владельцем класса операторов %s" -#: catalog/aclchk.c:3524 +#: catalog/aclchk.c:3507 #, c-format msgid "must be owner of operator %s" msgstr "нужно быть владельцем оператора %s" -#: catalog/aclchk.c:3527 +#: catalog/aclchk.c:3510 #, c-format msgid "must be owner of operator family %s" msgstr "нужно быть владельцем семейства операторов %s" -#: catalog/aclchk.c:3530 +#: catalog/aclchk.c:3513 #, c-format msgid "must be owner of procedure %s" msgstr "нужно быть владельцем процедуры %s" -#: catalog/aclchk.c:3533 +#: catalog/aclchk.c:3516 #, c-format msgid "must be owner of publication %s" msgstr "нужно быть владельцем публикации %s" -#: catalog/aclchk.c:3536 +#: catalog/aclchk.c:3519 #, c-format msgid "must be owner of routine %s" msgstr "нужно быть владельцем подпрограммы %s" -#: catalog/aclchk.c:3539 +#: catalog/aclchk.c:3522 #, c-format msgid "must be owner of sequence %s" msgstr "нужно быть владельцем последовательности %s" -#: catalog/aclchk.c:3542 +#: catalog/aclchk.c:3525 #, c-format msgid "must be owner of subscription %s" msgstr "нужно быть владельцем подписки %s" -#: catalog/aclchk.c:3545 +#: catalog/aclchk.c:3528 #, c-format msgid "must be owner of table %s" msgstr "нужно быть владельцем таблицы %s" -#: catalog/aclchk.c:3548 +#: catalog/aclchk.c:3531 #, c-format msgid "must be owner of type %s" msgstr "нужно быть владельцем типа %s" -#: catalog/aclchk.c:3551 +#: catalog/aclchk.c:3534 #, c-format msgid "must be owner of view %s" msgstr "нужно быть владельцем представления %s" -#: catalog/aclchk.c:3554 +#: catalog/aclchk.c:3537 #, c-format msgid "must be owner of schema %s" msgstr "нужно быть владельцем схемы %s" -#: catalog/aclchk.c:3557 +#: catalog/aclchk.c:3540 #, c-format msgid "must be owner of statistics object %s" msgstr "нужно быть владельцем объекта статистики %s" -#: catalog/aclchk.c:3560 +#: catalog/aclchk.c:3543 #, c-format msgid "must be owner of tablespace %s" msgstr "нужно быть владельцем табличного пространства %s" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:3546 #, c-format msgid "must be owner of text search configuration %s" msgstr "нужно быть владельцем конфигурации текстового поиска %s" -#: catalog/aclchk.c:3566 +#: catalog/aclchk.c:3549 #, c-format msgid "must be owner of text search dictionary %s" msgstr "нужно быть владельцем словаря текстового поиска %s" -#: catalog/aclchk.c:3580 +#: catalog/aclchk.c:3563 #, c-format msgid "must be owner of relation %s" msgstr "нужно быть владельцем отношения %s" -#: catalog/aclchk.c:3624 +#: catalog/aclchk.c:3607 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "нет доступа к столбцу \"%s\" отношения \"%s\"" -#: catalog/aclchk.c:3745 catalog/aclchk.c:3753 +#: catalog/aclchk.c:3750 catalog/aclchk.c:3769 #, c-format msgid "attribute %d of relation with OID %u does not exist" msgstr "атрибут %d отношения с OID %u не существует" -#: catalog/aclchk.c:3826 catalog/aclchk.c:4736 +#: catalog/aclchk.c:3864 catalog/aclchk.c:4836 #, c-format msgid "relation with OID %u does not exist" msgstr "отношение с OID %u не существует" -#: catalog/aclchk.c:3916 catalog/aclchk.c:5154 +#: catalog/aclchk.c:3977 catalog/aclchk.c:5254 #, c-format msgid "database with OID %u does not exist" msgstr "база данных с OID %u не существует" -#: catalog/aclchk.c:3970 catalog/aclchk.c:4814 tcop/fastpath.c:221 -#: utils/fmgr/fmgr.c:2055 +#: catalog/aclchk.c:4031 catalog/aclchk.c:4914 tcop/fastpath.c:141 +#: utils/fmgr/fmgr.c:2051 #, c-format msgid "function with OID %u does not exist" msgstr "функция с OID %u не существует" -#: catalog/aclchk.c:4024 catalog/aclchk.c:4840 +#: catalog/aclchk.c:4085 catalog/aclchk.c:4940 #, c-format msgid "language with OID %u does not exist" msgstr "язык с OID %u не существует" -#: catalog/aclchk.c:4188 catalog/aclchk.c:4912 +#: catalog/aclchk.c:4249 catalog/aclchk.c:5012 commands/collationcmds.c:536 #, c-format msgid "schema with OID %u does not exist" msgstr "схема с OID %u не существует" -#: catalog/aclchk.c:4242 catalog/aclchk.c:4939 utils/adt/genfile.c:686 +#: catalog/aclchk.c:4313 catalog/aclchk.c:5039 utils/adt/genfile.c:688 #, c-format msgid "tablespace with OID %u does not exist" msgstr "табличное пространство с OID %u не существует" -#: catalog/aclchk.c:4301 catalog/aclchk.c:5073 commands/foreigncmds.c:325 +#: catalog/aclchk.c:4372 catalog/aclchk.c:5173 commands/foreigncmds.c:325 #, c-format msgid "foreign-data wrapper with OID %u does not exist" msgstr "обёртка сторонних данных с OID %u не существует" -#: catalog/aclchk.c:4363 catalog/aclchk.c:5100 commands/foreigncmds.c:462 +#: catalog/aclchk.c:4434 catalog/aclchk.c:5200 commands/foreigncmds.c:462 #, c-format msgid "foreign server with OID %u does not exist" msgstr "сторонний сервер с OID %u не существует" -#: catalog/aclchk.c:4423 catalog/aclchk.c:4762 utils/cache/typcache.c:378 -#: utils/cache/typcache.c:432 +#: catalog/aclchk.c:4494 catalog/aclchk.c:4862 utils/cache/typcache.c:384 +#: utils/cache/typcache.c:439 #, c-format msgid "type with OID %u does not exist" msgstr "тип с OID %u не существует" -#: catalog/aclchk.c:4788 +#: catalog/aclchk.c:4888 #, c-format msgid "operator with OID %u does not exist" msgstr "оператор с OID %u не существует" -#: catalog/aclchk.c:4965 +#: catalog/aclchk.c:5065 #, c-format msgid "operator class with OID %u does not exist" msgstr "класс операторов с OID %u не существует" -#: catalog/aclchk.c:4992 +#: catalog/aclchk.c:5092 #, c-format msgid "operator family with OID %u does not exist" msgstr "семейство операторов с OID %u не существует" -#: catalog/aclchk.c:5019 +#: catalog/aclchk.c:5119 #, c-format msgid "text search dictionary with OID %u does not exist" msgstr "словарь текстового поиска с OID %u не существует" -#: catalog/aclchk.c:5046 +#: catalog/aclchk.c:5146 #, c-format msgid "text search configuration with OID %u does not exist" msgstr "конфигурация текстового поиска с OID %u не существует" -#: catalog/aclchk.c:5127 commands/event_trigger.c:475 +#: catalog/aclchk.c:5227 commands/event_trigger.c:453 #, c-format msgid "event trigger with OID %u does not exist" msgstr "событийный триггер с OID %u не существует" -#: catalog/aclchk.c:5180 commands/collationcmds.c:367 +#: catalog/aclchk.c:5280 commands/collationcmds.c:387 #, c-format msgid "collation with OID %u does not exist" msgstr "правило сортировки с OID %u не существует" -#: catalog/aclchk.c:5206 +#: catalog/aclchk.c:5306 #, c-format msgid "conversion with OID %u does not exist" msgstr "преобразование с OID %u не существует" -#: catalog/aclchk.c:5247 +#: catalog/aclchk.c:5347 #, c-format msgid "extension with OID %u does not exist" msgstr "расширение с OID %u не существует" -#: catalog/aclchk.c:5274 commands/publicationcmds.c:794 +#: catalog/aclchk.c:5374 commands/publicationcmds.c:818 #, c-format msgid "publication with OID %u does not exist" msgstr "публикация с OID %u не существует" -#: catalog/aclchk.c:5300 commands/subscriptioncmds.c:1112 +#: catalog/aclchk.c:5400 commands/subscriptioncmds.c:1463 #, c-format msgid "subscription with OID %u does not exist" msgstr "подписка с OID %u не существует" -#: catalog/aclchk.c:5326 +#: catalog/aclchk.c:5426 #, c-format msgid "statistics object with OID %u does not exist" msgstr "объект статистики с OID %u не существует" -#: catalog/catalog.c:485 +#: catalog/catalog.c:378 +#, c-format +msgid "still searching for an unused OID in relation \"%s\"" +msgstr "продолжается поиск неиспользованного OID в отношении \"%s\"" + +#: catalog/catalog.c:380 +#, c-format +msgid "" +"OID candidates have been checked %llu time, but no unused OID has been found " +"yet." +msgid_plural "" +"OID candidates have been checked %llu times, but no unused OID has been " +"found yet." +msgstr[0] "" +"Потенциальные OID были проверены %llu раз, но неиспользуемые OID ещё не были " +"найдены." +msgstr[1] "" +"Потенциальные OID были проверены %llu раза, но неиспользуемые OID ещё не " +"были найдены." +msgstr[2] "" +"Потенциальные OID были проверены %llu раз, но неиспользуемые OID ещё не были " +"найдены." + +#: catalog/catalog.c:405 +#, c-format +msgid "new OID has been assigned in relation \"%s\" after %llu retry" +msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" +msgstr[0] "новый OID был назначен в отношении \"%s\" после %llu попытки" +msgstr[1] "новый OID был назначен в отношении \"%s\" после %llu попыток" +msgstr[2] "новый OID был назначен в отношении \"%s\" после %llu попыток" + +#: catalog/catalog.c:536 #, c-format msgid "must be superuser to call pg_nextoid()" msgstr "выполнять pg_nextoid() может только суперпользователь" -#: catalog/catalog.c:493 +#: catalog/catalog.c:544 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() можно использовать только для системных каталогов" -#: catalog/catalog.c:498 parser/parse_utilcmd.c:2215 +#: catalog/catalog.c:549 parser/parse_utilcmd.c:2266 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "индекс \"%s\" не принадлежит таблице \"%s\"" -#: catalog/catalog.c:515 +#: catalog/catalog.c:566 #, c-format msgid "column \"%s\" is not of type oid" msgstr "столбец \"%s\" имеет тип не oid" -#: catalog/catalog.c:522 +#: catalog/catalog.c:573 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "индекс \"%s\" не является индексом столбца \"%s\"" -#: catalog/dependency.c:823 catalog/dependency.c:1061 +#: catalog/dependency.c:821 catalog/dependency.c:1060 #, c-format msgid "cannot drop %s because %s requires it" msgstr "удалить объект %s нельзя, так как он нужен объекту %s" -#: catalog/dependency.c:825 catalog/dependency.c:1063 +#: catalog/dependency.c:823 catalog/dependency.c:1062 #, c-format msgid "You can drop %s instead." msgstr "Однако можно удалить %s." -#: catalog/dependency.c:933 catalog/pg_shdepend.c:696 +#: catalog/dependency.c:931 catalog/pg_shdepend.c:697 #, c-format msgid "cannot drop %s because it is required by the database system" msgstr "удалить объект %s нельзя, так как он нужен системе баз данных" -#: catalog/dependency.c:1129 -#, c-format -msgid "drop auto-cascades to %s" -msgstr "удаление автоматически распространяется на объект %s" - #: catalog/dependency.c:1141 catalog/dependency.c:1150 #, c-format msgid "%s depends on %s" msgstr "%s зависит от объекта %s" -#: catalog/dependency.c:1162 catalog/dependency.c:1171 +#: catalog/dependency.c:1165 catalog/dependency.c:1174 #, c-format msgid "drop cascades to %s" msgstr "удаление распространяется на объект %s" -#: catalog/dependency.c:1179 catalog/pg_shdepend.c:825 +#: catalog/dependency.c:1182 catalog/pg_shdepend.c:826 #, c-format msgid "" "\n" @@ -4539,38 +4735,38 @@ msgstr[2] "" "\n" "и ещё %d объектов (см. список в протоколе сервера)" -#: catalog/dependency.c:1191 +#: catalog/dependency.c:1194 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "удалить объект %s нельзя, так как от него зависят другие объекты" -#: catalog/dependency.c:1193 catalog/dependency.c:1194 -#: catalog/dependency.c:1200 catalog/dependency.c:1201 -#: catalog/dependency.c:1212 catalog/dependency.c:1213 -#: commands/tablecmds.c:1249 commands/tablecmds.c:13034 -#: commands/tablespace.c:481 commands/user.c:1095 commands/view.c:495 -#: libpq/auth.c:334 replication/syncrep.c:1032 storage/lmgr/deadlock.c:1154 -#: storage/lmgr/proc.c:1350 utils/adt/acl.c:5332 utils/adt/jsonfuncs.c:614 -#: utils/adt/jsonfuncs.c:620 utils/misc/guc.c:6771 utils/misc/guc.c:6807 -#: utils/misc/guc.c:6877 utils/misc/guc.c:10975 utils/misc/guc.c:11009 -#: utils/misc/guc.c:11043 utils/misc/guc.c:11077 utils/misc/guc.c:11112 +#: catalog/dependency.c:1196 catalog/dependency.c:1197 +#: catalog/dependency.c:1203 catalog/dependency.c:1204 +#: catalog/dependency.c:1215 catalog/dependency.c:1216 +#: commands/tablecmds.c:1297 commands/tablecmds.c:13699 +#: commands/tablespace.c:481 commands/user.c:1095 commands/view.c:492 +#: libpq/auth.c:338 replication/syncrep.c:1043 storage/lmgr/deadlock.c:1152 +#: storage/lmgr/proc.c:1433 utils/adt/acl.c:5250 utils/adt/jsonfuncs.c:618 +#: utils/adt/jsonfuncs.c:624 utils/misc/guc.c:7115 utils/misc/guc.c:7151 +#: utils/misc/guc.c:7221 utils/misc/guc.c:11401 utils/misc/guc.c:11435 +#: utils/misc/guc.c:11469 utils/misc/guc.c:11512 utils/misc/guc.c:11554 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1195 catalog/dependency.c:1202 +#: catalog/dependency.c:1198 catalog/dependency.c:1205 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "Для удаления зависимых объектов используйте DROP ... CASCADE." -#: catalog/dependency.c:1199 +#: catalog/dependency.c:1202 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "" "удалить запрошенные объекты нельзя, так как от них зависят другие объекты" #. translator: %d always has a value larger than 1 -#: catalog/dependency.c:1208 +#: catalog/dependency.c:1211 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" @@ -4583,50 +4779,50 @@ msgstr[2] "удаление распространяется на ещё %d об msgid "constant of the type %s cannot be used here" msgstr "константу типа %s здесь использовать нельзя" -#: catalog/heap.c:330 +#: catalog/heap.c:332 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "нет прав для создания отношения \"%s.%s\"" -#: catalog/heap.c:332 +#: catalog/heap.c:334 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Изменение системного каталога в текущем состоянии запрещено." -#: catalog/heap.c:509 commands/tablecmds.c:2145 commands/tablecmds.c:2745 -#: commands/tablecmds.c:6177 +#: catalog/heap.c:511 commands/tablecmds.c:2290 commands/tablecmds.c:2927 +#: commands/tablecmds.c:6595 #, c-format msgid "tables can have at most %d columns" msgstr "максимальное число столбцов в таблице: %d" -#: catalog/heap.c:527 commands/tablecmds.c:6470 +#: catalog/heap.c:529 commands/tablecmds.c:6894 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "имя столбца \"%s\" конфликтует с системным столбцом" -#: catalog/heap.c:543 +#: catalog/heap.c:545 #, c-format msgid "column name \"%s\" specified more than once" msgstr "имя столбца \"%s\" указано неоднократно" #. translator: first %s is an integer not a name -#: catalog/heap.c:618 +#: catalog/heap.c:620 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "столбец \"%s\" ключа разбиения имеет псевдотип %s" -#: catalog/heap.c:623 +#: catalog/heap.c:625 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "столбец \"%s\" имеет псевдотип %s" -#: catalog/heap.c:654 +#: catalog/heap.c:656 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "составной тип %s не может содержать себя же" #. translator: first %s is an integer not a name -#: catalog/heap.c:709 +#: catalog/heap.c:711 #, c-format msgid "" "no collation was derived for partition key column %s with collatable type %s" @@ -4634,26 +4830,28 @@ msgstr "" "для входящего в ключ разбиения столбца \"%s\" с сортируемым типом %s не " "удалось получить правило сортировки" -#: catalog/heap.c:715 commands/createas.c:203 commands/createas.c:486 +#: catalog/heap.c:717 commands/createas.c:203 commands/createas.c:500 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "" "для столбца \"%s\" с сортируемым типом %s не удалось получить правило " "сортировки" -#: catalog/heap.c:1164 catalog/index.c:865 commands/tablecmds.c:3520 +#: catalog/heap.c:1202 catalog/index.c:871 commands/createas.c:405 +#: commands/tablecmds.c:3832 #, c-format msgid "relation \"%s\" already exists" msgstr "отношение \"%s\" уже существует" -#: catalog/heap.c:1180 catalog/pg_type.c:428 catalog/pg_type.c:775 -#: commands/typecmds.c:238 commands/typecmds.c:250 commands/typecmds.c:719 -#: commands/typecmds.c:1125 commands/typecmds.c:1337 commands/typecmds.c:2124 +#: catalog/heap.c:1218 catalog/pg_type.c:436 catalog/pg_type.c:781 +#: catalog/pg_type.c:928 commands/typecmds.c:249 commands/typecmds.c:261 +#: commands/typecmds.c:757 commands/typecmds.c:1172 commands/typecmds.c:1398 +#: commands/typecmds.c:1590 commands/typecmds.c:2562 #, c-format msgid "type \"%s\" already exists" msgstr "тип \"%s\" уже существует" -#: catalog/heap.c:1181 +#: catalog/heap.c:1219 #, c-format msgid "" "A relation has an associated type of the same name, so you must use a name " @@ -4662,43 +4860,43 @@ msgstr "" "С отношением уже связан тип с таким же именем; выберите имя, не " "конфликтующее с существующими типами." -#: catalog/heap.c:1210 +#: catalog/heap.c:1248 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "значение OID кучи в pg_class не задано в режиме двоичного обновления" -#: catalog/heap.c:2409 +#: catalog/heap.c:2461 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "" "добавить ограничение NO INHERIT к секционированной таблице \"%s\" нельзя" -#: catalog/heap.c:2679 +#: catalog/heap.c:2733 #, c-format msgid "check constraint \"%s\" already exists" msgstr "ограничение-проверка \"%s\" уже существует" -#: catalog/heap.c:2849 catalog/index.c:879 catalog/pg_constraint.c:668 -#: commands/tablecmds.c:8135 +#: catalog/heap.c:2903 catalog/index.c:885 catalog/pg_constraint.c:670 +#: commands/tablecmds.c:8622 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "ограничение \"%s\" для отношения \"%s\" уже существует" -#: catalog/heap.c:2856 +#: catalog/heap.c:2910 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "" "ограничение \"%s\" конфликтует с ненаследуемым ограничением таблицы \"%s\"" -#: catalog/heap.c:2867 +#: catalog/heap.c:2921 #, c-format msgid "" "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "" "ограничение \"%s\" конфликтует с наследуемым ограничением таблицы \"%s\"" -#: catalog/heap.c:2877 +#: catalog/heap.c:2931 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" @@ -4706,52 +4904,64 @@ msgstr "" "ограничение \"%s\" конфликтует с непроверенным (NOT VALID) ограничением " "таблицы \"%s\"" -#: catalog/heap.c:2882 +#: catalog/heap.c:2936 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "слияние ограничения \"%s\" с унаследованным определением" -#: catalog/heap.c:2984 +#: catalog/heap.c:3041 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "" "использовать генерируемый столбец \"%s\" в выражении генерируемого столбца " "нельзя" -#: catalog/heap.c:2986 +#: catalog/heap.c:3043 #, c-format msgid "A generated column cannot reference another generated column." msgstr "" "Генерируемый столбец не может ссылаться на другой генерируемый столбец." -#: catalog/heap.c:3038 +#: catalog/heap.c:3049 +#, c-format +msgid "cannot use whole-row variable in column generation expression" +msgstr "" +"в выражении генерируемого столбца нельзя использовать переменные «вся строка»" + +#: catalog/heap.c:3050 +#, c-format +msgid "This would cause the generated column to depend on its own value." +msgstr "" +"Это сделало бы генерируемый столбец зависимым от собственного значения." + +#: catalog/heap.c:3103 #, c-format msgid "generation expression is not immutable" msgstr "генерирующее выражение не является постоянным" -#: catalog/heap.c:3066 rewrite/rewriteHandler.c:1193 +#: catalog/heap.c:3131 rewrite/rewriteHandler.c:1268 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "столбец \"%s\" имеет тип %s, но тип выражения по умолчанию %s" -#: catalog/heap.c:3071 commands/prepare.c:367 parser/parse_node.c:412 -#: parser/parse_target.c:589 parser/parse_target.c:869 -#: parser/parse_target.c:879 rewrite/rewriteHandler.c:1198 +#: catalog/heap.c:3136 commands/prepare.c:368 parser/analyze.c:2652 +#: parser/parse_target.c:594 parser/parse_target.c:882 +#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1273 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Перепишите выражение или преобразуйте его тип." -#: catalog/heap.c:3118 +#: catalog/heap.c:3183 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "в ограничении-проверке можно ссылаться только на таблицу \"%s\"" -#: catalog/heap.c:3416 +#: catalog/heap.c:3481 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "неподдерживаемое сочетание внешнего ключа с ON COMMIT" -#: catalog/heap.c:3417 +#: catalog/heap.c:3482 #, c-format msgid "" "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT " @@ -4759,503 +4969,481 @@ msgid "" msgstr "" "Таблица \"%s\" ссылается на \"%s\", и для них задан разный режим ON COMMIT." -#: catalog/heap.c:3422 +#: catalog/heap.c:3487 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "опустошить таблицу, на которую ссылается внешний ключ, нельзя" -#: catalog/heap.c:3423 +#: catalog/heap.c:3488 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Таблица \"%s\" ссылается на \"%s\"." -#: catalog/heap.c:3425 +#: catalog/heap.c:3490 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "" "Опустошите таблицу \"%s\" параллельно или используйте TRUNCATE ... CASCADE." -#: catalog/index.c:219 parser/parse_utilcmd.c:2121 +#: catalog/index.c:222 parser/parse_utilcmd.c:2172 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "таблица \"%s\" не может иметь несколько первичных ключей" -#: catalog/index.c:237 +#: catalog/index.c:240 #, c-format msgid "primary keys cannot be expressions" msgstr "первичные ключи не могут быть выражениями" -#: catalog/index.c:254 +#: catalog/index.c:257 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "столбец первичного ключа \"%s\" не помечен как NOT NULL" -#: catalog/index.c:764 catalog/index.c:1846 +#: catalog/index.c:770 catalog/index.c:1915 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "" "пользовательские индексы в таблицах системного каталога не поддерживаются" -#: catalog/index.c:804 +#: catalog/index.c:810 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "" "недетерминированные правила сортировки не поддерживаются для класса " "операторов \"%s\"" -#: catalog/index.c:819 +#: catalog/index.c:825 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "" "параллельное создание индекса в таблицах системного каталога не " "поддерживается" -#: catalog/index.c:828 catalog/index.c:1281 +#: catalog/index.c:834 catalog/index.c:1285 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "" "параллельное создание индекса для ограничений-исключений не поддерживается" -#: catalog/index.c:837 +#: catalog/index.c:843 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "нельзя создать разделяемые индексы после initdb" -#: catalog/index.c:857 commands/createas.c:252 commands/sequence.c:154 -#: parser/parse_utilcmd.c:211 +#: catalog/index.c:863 commands/createas.c:411 commands/sequence.c:154 +#: parser/parse_utilcmd.c:201 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "отношение \"%s\" уже существует, пропускается" -#: catalog/index.c:907 +#: catalog/index.c:913 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "" "значение OID индекса в pg_class не задано в режиме двоичного обновления" -#: catalog/index.c:2131 +#: catalog/index.c:2212 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY должен быть первым действием в транзакции" -#: catalog/index.c:2862 -#, c-format -msgid "building index \"%s\" on table \"%s\" serially" -msgstr "создание индекса \"%s\" для таблицы \"%s\" в непараллельном режиме" - -#: catalog/index.c:2867 -#, c-format -msgid "" -"building index \"%s\" on table \"%s\" with request for %d parallel worker" -msgid_plural "" -"building index \"%s\" on table \"%s\" with request for %d parallel workers" -msgstr[0] "" -"создание индекса \"%s\" для таблицы \"%s\" с расчётом на %d параллельного " -"исполнителя" -msgstr[1] "" -"создание индекса \"%s\" для таблицы \"%s\" с расчётом на %d параллельных " -"исполнителей" -msgstr[2] "" -"создание индекса \"%s\" для таблицы \"%s\" с расчётом на %d параллельных " -"исполнителей" - -#: catalog/index.c:3495 +#: catalog/index.c:3597 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "переиндексировать временные таблицы других сеансов нельзя" -#: catalog/index.c:3506 commands/indexcmds.c:3005 +#: catalog/index.c:3608 commands/indexcmds.c:3426 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "перестроить нерабочий индекс в таблице TOAST нельзя" -#: catalog/index.c:3628 +#: catalog/index.c:3624 commands/indexcmds.c:3306 commands/indexcmds.c:3450 +#: commands/tablecmds.c:3247 #, c-format -msgid "index \"%s\" was reindexed" -msgstr "индекс \"%s\" был перестроен" +msgid "cannot move system relation \"%s\"" +msgstr "переместить системную таблицу \"%s\" нельзя" -#: catalog/index.c:3704 commands/indexcmds.c:3026 +#: catalog/index.c:3768 #, c-format -msgid "REINDEX of partitioned tables is not yet implemented, skipping \"%s\"" -msgstr "" -"REINDEX для секционированных таблицы ещё не реализован, \"%s\" пропускается" +msgid "index \"%s\" was reindexed" +msgstr "индекс \"%s\" был перестроен" -#: catalog/index.c:3759 +#: catalog/index.c:3899 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "" "перестроить нерабочий индекс \"%s.%s\" в таблице TOAST нельзя, он " "пропускается" -#: catalog/namespace.c:257 catalog/namespace.c:461 catalog/namespace.c:553 -#: commands/trigger.c:5027 +#: catalog/namespace.c:258 catalog/namespace.c:462 catalog/namespace.c:554 +#: commands/trigger.c:5152 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "ссылки между базами не реализованы: \"%s.%s.%s\"" -#: catalog/namespace.c:314 +#: catalog/namespace.c:315 #, c-format msgid "temporary tables cannot specify a schema name" msgstr "для временных таблиц имя схемы не указывается" -#: catalog/namespace.c:395 +#: catalog/namespace.c:396 #, c-format msgid "could not obtain lock on relation \"%s.%s\"" msgstr "не удалось получить блокировку таблицы \"%s.%s\"" -#: catalog/namespace.c:400 commands/lockcmds.c:143 commands/lockcmds.c:228 +#: catalog/namespace.c:401 commands/lockcmds.c:143 commands/lockcmds.c:228 #, c-format msgid "could not obtain lock on relation \"%s\"" msgstr "не удалось получить блокировку таблицы \"%s\"" -#: catalog/namespace.c:428 parser/parse_relation.c:1357 +#: catalog/namespace.c:429 parser/parse_relation.c:1362 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "отношение \"%s.%s\" не существует" -#: catalog/namespace.c:433 parser/parse_relation.c:1370 -#: parser/parse_relation.c:1378 +#: catalog/namespace.c:434 parser/parse_relation.c:1375 +#: parser/parse_relation.c:1383 #, c-format msgid "relation \"%s\" does not exist" msgstr "отношение \"%s\" не существует" -#: catalog/namespace.c:499 catalog/namespace.c:3030 commands/extension.c:1519 -#: commands/extension.c:1525 +#: catalog/namespace.c:500 catalog/namespace.c:3075 commands/extension.c:1520 +#: commands/extension.c:1526 #, c-format msgid "no schema has been selected to create in" msgstr "схема для создания объектов не выбрана" -#: catalog/namespace.c:651 catalog/namespace.c:664 +#: catalog/namespace.c:652 catalog/namespace.c:665 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "во временных схемах других сеансов нельзя создавать отношения" -#: catalog/namespace.c:655 +#: catalog/namespace.c:656 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "создавать временные отношения можно только во временных схемах" -#: catalog/namespace.c:670 +#: catalog/namespace.c:671 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "во временных схемах можно создавать только временные отношения" -#: catalog/namespace.c:2222 +#: catalog/namespace.c:2267 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "объект статистики \"%s\" не существует" -#: catalog/namespace.c:2345 +#: catalog/namespace.c:2390 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "анализатор текстового поиска \"%s\" не существует" -#: catalog/namespace.c:2471 +#: catalog/namespace.c:2516 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "словарь текстового поиска \"%s\" не существует" -#: catalog/namespace.c:2598 +#: catalog/namespace.c:2643 #, c-format msgid "text search template \"%s\" does not exist" msgstr "шаблон текстового поиска \"%s\" не существует" -#: catalog/namespace.c:2724 commands/tsearchcmds.c:1194 -#: utils/cache/ts_cache.c:617 +#: catalog/namespace.c:2769 commands/tsearchcmds.c:1121 +#: utils/cache/ts_cache.c:613 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "конфигурация текстового поиска \"%s\" не существует" -#: catalog/namespace.c:2837 parser/parse_expr.c:872 parser/parse_target.c:1228 +#: catalog/namespace.c:2882 parser/parse_expr.c:810 parser/parse_target.c:1255 #, c-format msgid "cross-database references are not implemented: %s" msgstr "ссылки между базами не реализованы: %s" -#: catalog/namespace.c:2843 parser/parse_expr.c:879 parser/parse_target.c:1235 -#: gram.y:14982 gram.y:16436 +#: catalog/namespace.c:2888 parser/parse_expr.c:817 parser/parse_target.c:1262 +#: gram.y:15102 gram.y:17076 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неверное полное имя (слишком много компонентов): %s" -#: catalog/namespace.c:2973 +#: catalog/namespace.c:3018 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "перемещать объекты в/из внутренних схем нельзя" -#: catalog/namespace.c:2979 +#: catalog/namespace.c:3024 #, c-format msgid "cannot move objects into or out of TOAST schema" msgstr "перемещать объекты в/из схем TOAST нельзя" -#: catalog/namespace.c:3052 commands/schemacmds.c:256 commands/schemacmds.c:336 -#: commands/tablecmds.c:1194 +#: catalog/namespace.c:3097 commands/schemacmds.c:234 commands/schemacmds.c:314 +#: commands/tablecmds.c:1242 #, c-format msgid "schema \"%s\" does not exist" msgstr "схема \"%s\" не существует" -#: catalog/namespace.c:3083 +#: catalog/namespace.c:3128 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "неверное имя отношения (слишком много компонентов): %s" -#: catalog/namespace.c:3646 +#: catalog/namespace.c:3691 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "правило сортировки \"%s\" для кодировки \"%s\" не существует" -#: catalog/namespace.c:3701 +#: catalog/namespace.c:3746 #, c-format msgid "conversion \"%s\" does not exist" msgstr "преобразование \"%s\" не существует" -#: catalog/namespace.c:3965 +#: catalog/namespace.c:4010 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "нет прав для создания временных таблиц в базе \"%s\"" -#: catalog/namespace.c:3981 +#: catalog/namespace.c:4026 #, c-format msgid "cannot create temporary tables during recovery" msgstr "создавать временные таблицы в процессе восстановления нельзя" -#: catalog/namespace.c:3987 +#: catalog/namespace.c:4032 #, c-format msgid "cannot create temporary tables during a parallel operation" msgstr "создавать временные таблицы во время параллельных операций нельзя" -#: catalog/namespace.c:4286 commands/tablespace.c:1217 commands/variable.c:64 -#: utils/misc/guc.c:11144 utils/misc/guc.c:11222 +#: catalog/namespace.c:4331 commands/tablespace.c:1213 commands/variable.c:64 +#: utils/misc/guc.c:11586 utils/misc/guc.c:11664 #, c-format msgid "List syntax is invalid." msgstr "Ошибка синтаксиса в списке." -#: catalog/objectaddress.c:1275 catalog/pg_publication.c:57 -#: commands/policy.c:95 commands/policy.c:375 commands/policy.c:465 -#: commands/tablecmds.c:230 commands/tablecmds.c:272 commands/tablecmds.c:1989 -#: commands/tablecmds.c:5628 commands/tablecmds.c:11107 +#: catalog/objectaddress.c:1370 catalog/pg_publication.c:58 +#: commands/policy.c:96 commands/policy.c:376 commands/tablecmds.c:243 +#: commands/tablecmds.c:285 commands/tablecmds.c:2134 commands/tablecmds.c:6035 +#: commands/tablecmds.c:11714 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" - это не таблица" -#: catalog/objectaddress.c:1282 commands/tablecmds.c:242 -#: commands/tablecmds.c:5658 commands/tablecmds.c:15733 commands/view.c:119 +#: catalog/objectaddress.c:1377 commands/tablecmds.c:255 +#: commands/tablecmds.c:6074 commands/tablecmds.c:16515 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" - это не представление" -#: catalog/objectaddress.c:1289 commands/matview.c:175 commands/tablecmds.c:248 -#: commands/tablecmds.c:15738 +#: catalog/objectaddress.c:1384 commands/matview.c:175 commands/tablecmds.c:261 +#: commands/tablecmds.c:16520 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" - это не материализованное представление" -#: catalog/objectaddress.c:1296 commands/tablecmds.c:266 -#: commands/tablecmds.c:5661 commands/tablecmds.c:15743 +#: catalog/objectaddress.c:1391 commands/tablecmds.c:279 +#: commands/tablecmds.c:6077 commands/tablecmds.c:16525 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" - это не сторонняя таблица" -#: catalog/objectaddress.c:1337 +#: catalog/objectaddress.c:1432 #, c-format msgid "must specify relation and object name" msgstr "необходимо указать имя отношения и объекта" -#: catalog/objectaddress.c:1413 catalog/objectaddress.c:1466 +#: catalog/objectaddress.c:1508 catalog/objectaddress.c:1561 #, c-format msgid "column name must be qualified" msgstr "имя столбца нужно указать в полной форме" -#: catalog/objectaddress.c:1513 +#: catalog/objectaddress.c:1608 #, c-format msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "" "значение по умолчанию для столбца \"%s\" отношения \"%s\" не существует" -#: catalog/objectaddress.c:1550 commands/functioncmds.c:133 -#: commands/tablecmds.c:258 commands/typecmds.c:263 commands/typecmds.c:3275 -#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:845 -#: utils/adt/acl.c:4435 +#: catalog/objectaddress.c:1645 commands/functioncmds.c:138 +#: commands/tablecmds.c:271 commands/typecmds.c:274 commands/typecmds.c:3713 +#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:791 +#: utils/adt/acl.c:4411 #, c-format msgid "type \"%s\" does not exist" msgstr "тип \"%s\" не существует" -#: catalog/objectaddress.c:1669 +#: catalog/objectaddress.c:1764 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "оператор %d (%s, %s) из семейства %s не существует" -#: catalog/objectaddress.c:1700 +#: catalog/objectaddress.c:1795 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "функция %d (%s, %s) из семейства %s не существует" -#: catalog/objectaddress.c:1751 catalog/objectaddress.c:1777 +#: catalog/objectaddress.c:1846 catalog/objectaddress.c:1872 #, c-format msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "сопоставление для пользователя \"%s\" на сервере \"%s\" не существует" -#: catalog/objectaddress.c:1766 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:1012 commands/foreigncmds.c:1395 -#: foreign/foreign.c:723 +#: catalog/objectaddress.c:1861 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:988 commands/foreigncmds.c:1347 foreign/foreign.c:723 #, c-format msgid "server \"%s\" does not exist" msgstr "сервер \"%s\" не существует" -#: catalog/objectaddress.c:1833 +#: catalog/objectaddress.c:1928 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "публикуемое отношение \"%s\" в публикации \"%s\" не существует" -#: catalog/objectaddress.c:1895 +#: catalog/objectaddress.c:1990 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "нераспознанный тип объекта ACL по умолчанию: \"%c\"" -#: catalog/objectaddress.c:1896 +#: catalog/objectaddress.c:1991 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "Допустимые типы объектов: \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." -#: catalog/objectaddress.c:1947 +#: catalog/objectaddress.c:2042 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "" "ACL по умолчанию для пользователя \"%s\" в схеме \"%s\" для объекта %s не " "существует" -#: catalog/objectaddress.c:1952 +#: catalog/objectaddress.c:2047 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "" "ACL по умолчанию для пользователя \"%s\" и для объекта %s не существует" -#: catalog/objectaddress.c:1979 catalog/objectaddress.c:2037 -#: catalog/objectaddress.c:2094 +#: catalog/objectaddress.c:2074 catalog/objectaddress.c:2132 +#: catalog/objectaddress.c:2189 #, c-format msgid "name or argument lists may not contain nulls" msgstr "списки имён и аргументов не должны содержать NULL" -#: catalog/objectaddress.c:2013 +#: catalog/objectaddress.c:2108 #, c-format msgid "unsupported object type \"%s\"" msgstr "неподдерживаемый тип объекта: \"%s\"" -#: catalog/objectaddress.c:2033 catalog/objectaddress.c:2051 -#: catalog/objectaddress.c:2192 +#: catalog/objectaddress.c:2128 catalog/objectaddress.c:2146 +#: catalog/objectaddress.c:2287 #, c-format msgid "name list length must be exactly %d" msgstr "длина списка имён должна быть равна %d" -#: catalog/objectaddress.c:2055 +#: catalog/objectaddress.c:2150 #, c-format msgid "large object OID may not be null" msgstr "OID большого объекта не может быть NULL" -#: catalog/objectaddress.c:2064 catalog/objectaddress.c:2127 -#: catalog/objectaddress.c:2134 +#: catalog/objectaddress.c:2159 catalog/objectaddress.c:2222 +#: catalog/objectaddress.c:2229 #, c-format msgid "name list length must be at least %d" msgstr "длина списка аргументов должна быть не меньше %d" -#: catalog/objectaddress.c:2120 catalog/objectaddress.c:2141 +#: catalog/objectaddress.c:2215 catalog/objectaddress.c:2236 #, c-format msgid "argument list length must be exactly %d" msgstr "длина списка аргументов должна быть равна %d" -#: catalog/objectaddress.c:2393 libpq/be-fsstubs.c:321 +#: catalog/objectaddress.c:2488 libpq/be-fsstubs.c:318 #, c-format msgid "must be owner of large object %u" msgstr "нужно быть владельцем большого объекта %u" -#: catalog/objectaddress.c:2408 commands/functioncmds.c:1445 +#: catalog/objectaddress.c:2503 commands/functioncmds.c:1582 #, c-format msgid "must be owner of type %s or type %s" msgstr "это разрешено только владельцу типа %s или %s" -#: catalog/objectaddress.c:2458 catalog/objectaddress.c:2475 +#: catalog/objectaddress.c:2553 catalog/objectaddress.c:2570 #, c-format msgid "must be superuser" msgstr "требуются права суперпользователя" -#: catalog/objectaddress.c:2465 +#: catalog/objectaddress.c:2560 #, c-format msgid "must have CREATEROLE privilege" msgstr "требуется право CREATEROLE" -#: catalog/objectaddress.c:2544 +#: catalog/objectaddress.c:2640 #, c-format msgid "unrecognized object type \"%s\"" msgstr "нераспознанный тип объекта \"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2772 +#: catalog/objectaddress.c:2883 #, c-format msgid "column %s of %s" msgstr "столбец %s отношения %s" -#: catalog/objectaddress.c:2782 +#: catalog/objectaddress.c:2898 #, c-format msgid "function %s" msgstr "функция %s" -#: catalog/objectaddress.c:2787 +#: catalog/objectaddress.c:2911 #, c-format msgid "type %s" msgstr "тип %s" -#: catalog/objectaddress.c:2817 +#: catalog/objectaddress.c:2948 #, c-format msgid "cast from %s to %s" msgstr "приведение %s к %s" -#: catalog/objectaddress.c:2845 +#: catalog/objectaddress.c:2981 #, c-format msgid "collation %s" msgstr "правило сортировки %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2871 +#: catalog/objectaddress.c:3012 #, c-format msgid "constraint %s on %s" msgstr "ограничение %s в отношении %s" -#: catalog/objectaddress.c:2877 +#: catalog/objectaddress.c:3018 #, c-format msgid "constraint %s" msgstr "ограничение %s" -#: catalog/objectaddress.c:2904 +#: catalog/objectaddress.c:3050 #, c-format msgid "conversion %s" msgstr "преобразование %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:2943 +#: catalog/objectaddress.c:3096 #, c-format msgid "default value for %s" msgstr "значение по умолчанию для %s" -#: catalog/objectaddress.c:2952 +#: catalog/objectaddress.c:3110 #, c-format msgid "language %s" msgstr "язык %s" -#: catalog/objectaddress.c:2957 +#: catalog/objectaddress.c:3118 #, c-format msgid "large object %u" msgstr "большой объект %u" -#: catalog/objectaddress.c:2962 +#: catalog/objectaddress.c:3131 #, c-format msgid "operator %s" msgstr "оператор %s" -#: catalog/objectaddress.c:2994 +#: catalog/objectaddress.c:3168 #, c-format msgid "operator class %s for access method %s" msgstr "класс операторов %s для метода доступа %s" -#: catalog/objectaddress.c:3017 +#: catalog/objectaddress.c:3196 #, c-format msgid "access method %s" msgstr "метод доступа %s" @@ -5264,7 +5452,7 @@ msgstr "метод доступа %s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3059 +#: catalog/objectaddress.c:3245 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "оператор %d (%s, %s) из семейства \"%s\": %s" @@ -5273,231 +5461,231 @@ msgstr "оператор %d (%s, %s) из семейства \"%s\": %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3109 +#: catalog/objectaddress.c:3302 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "функция %d (%s, %s) из семейства \"%s\": %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3153 +#: catalog/objectaddress.c:3354 #, c-format msgid "rule %s on %s" msgstr "правило %s для отношения %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3191 +#: catalog/objectaddress.c:3400 #, c-format msgid "trigger %s on %s" msgstr "триггер %s в отношении %s" -#: catalog/objectaddress.c:3207 +#: catalog/objectaddress.c:3420 #, c-format msgid "schema %s" msgstr "схема %s" -#: catalog/objectaddress.c:3230 +#: catalog/objectaddress.c:3448 #, c-format msgid "statistics object %s" msgstr "объект статистики %s" -#: catalog/objectaddress.c:3257 +#: catalog/objectaddress.c:3479 #, c-format msgid "text search parser %s" msgstr "анализатор текстового поиска %s" -#: catalog/objectaddress.c:3283 +#: catalog/objectaddress.c:3510 #, c-format msgid "text search dictionary %s" msgstr "словарь текстового поиска %s" -#: catalog/objectaddress.c:3309 +#: catalog/objectaddress.c:3541 #, c-format msgid "text search template %s" msgstr "шаблон текстового поиска %s" -#: catalog/objectaddress.c:3335 +#: catalog/objectaddress.c:3572 #, c-format msgid "text search configuration %s" msgstr "конфигурация текстового поиска %s" -#: catalog/objectaddress.c:3344 +#: catalog/objectaddress.c:3585 #, c-format msgid "role %s" msgstr "роль %s" -#: catalog/objectaddress.c:3357 +#: catalog/objectaddress.c:3601 #, c-format msgid "database %s" msgstr "база данных %s" -#: catalog/objectaddress.c:3369 +#: catalog/objectaddress.c:3617 #, c-format msgid "tablespace %s" msgstr "табличное пространство %s" -#: catalog/objectaddress.c:3378 +#: catalog/objectaddress.c:3628 #, c-format msgid "foreign-data wrapper %s" msgstr "обёртка сторонних данных %s" -#: catalog/objectaddress.c:3387 +#: catalog/objectaddress.c:3638 #, c-format msgid "server %s" msgstr "сервер %s" -#: catalog/objectaddress.c:3415 +#: catalog/objectaddress.c:3671 #, c-format msgid "user mapping for %s on server %s" msgstr "сопоставление для пользователя %s на сервере %s" -#: catalog/objectaddress.c:3460 +#: catalog/objectaddress.c:3723 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "" "права по умолчанию для новых отношений, принадлежащих роли %s в схеме %s" -#: catalog/objectaddress.c:3464 +#: catalog/objectaddress.c:3727 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "права по умолчанию для новых отношений, принадлежащих роли %s" -#: catalog/objectaddress.c:3470 +#: catalog/objectaddress.c:3733 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "" "права по умолчанию для новых последовательностей, принадлежащих роли %s в " "схеме %s" -#: catalog/objectaddress.c:3474 +#: catalog/objectaddress.c:3737 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "" "права по умолчанию для новых последовательностей, принадлежащих роли %s" -#: catalog/objectaddress.c:3480 +#: catalog/objectaddress.c:3743 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "права по умолчанию для новых функций, принадлежащих роли %s в схеме %s" -#: catalog/objectaddress.c:3484 +#: catalog/objectaddress.c:3747 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "права по умолчанию для новых функций, принадлежащих роли %s" -#: catalog/objectaddress.c:3490 +#: catalog/objectaddress.c:3753 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "права по умолчанию для новых типов, принадлежащих роли %s в схеме %s" -#: catalog/objectaddress.c:3494 +#: catalog/objectaddress.c:3757 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "права по умолчанию для новых типов, принадлежащих роли %s" -#: catalog/objectaddress.c:3500 +#: catalog/objectaddress.c:3763 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "права по умолчанию для новых схем, принадлежащих роли %s" -#: catalog/objectaddress.c:3507 +#: catalog/objectaddress.c:3770 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "" "права по умолчанию для новых объектов, принадлежащих роли %s в схеме %s" -#: catalog/objectaddress.c:3511 +#: catalog/objectaddress.c:3774 #, c-format msgid "default privileges belonging to role %s" msgstr "права по умолчанию для новых объектов, принадлежащих роли %s" -#: catalog/objectaddress.c:3529 +#: catalog/objectaddress.c:3796 #, c-format msgid "extension %s" msgstr "расширение %s" -#: catalog/objectaddress.c:3542 +#: catalog/objectaddress.c:3813 #, c-format msgid "event trigger %s" msgstr "событийный триггер %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3578 +#: catalog/objectaddress.c:3857 #, c-format msgid "policy %s on %s" msgstr "политика %s отношения %s" -#: catalog/objectaddress.c:3588 +#: catalog/objectaddress.c:3871 #, c-format msgid "publication %s" msgstr "публикация %s" #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:3614 +#: catalog/objectaddress.c:3899 #, c-format msgid "publication of %s in publication %s" msgstr "публикуемое отношение %s в публикации %s" -#: catalog/objectaddress.c:3623 +#: catalog/objectaddress.c:3912 #, c-format msgid "subscription %s" msgstr "подписка %s" -#: catalog/objectaddress.c:3642 +#: catalog/objectaddress.c:3933 #, c-format msgid "transform for %s language %s" msgstr "преобразование для %s, языка %s" -#: catalog/objectaddress.c:3705 +#: catalog/objectaddress.c:4004 #, c-format msgid "table %s" msgstr "таблица %s" -#: catalog/objectaddress.c:3710 +#: catalog/objectaddress.c:4009 #, c-format msgid "index %s" msgstr "индекс %s" -#: catalog/objectaddress.c:3714 +#: catalog/objectaddress.c:4013 #, c-format msgid "sequence %s" msgstr "последовательность %s" -#: catalog/objectaddress.c:3718 +#: catalog/objectaddress.c:4017 #, c-format msgid "toast table %s" msgstr "TOAST-таблица %s" -#: catalog/objectaddress.c:3722 +#: catalog/objectaddress.c:4021 #, c-format msgid "view %s" msgstr "представление %s" -#: catalog/objectaddress.c:3726 +#: catalog/objectaddress.c:4025 #, c-format msgid "materialized view %s" msgstr "материализованное представление %s" -#: catalog/objectaddress.c:3730 +#: catalog/objectaddress.c:4029 #, c-format msgid "composite type %s" msgstr "составной тип %s" -#: catalog/objectaddress.c:3734 +#: catalog/objectaddress.c:4033 #, c-format msgid "foreign table %s" msgstr "сторонняя таблица %s" -#: catalog/objectaddress.c:3739 +#: catalog/objectaddress.c:4038 #, c-format msgid "relation %s" msgstr "отношение %s" -#: catalog/objectaddress.c:3776 +#: catalog/objectaddress.c:4079 #, c-format msgid "operator family %s for access method %s" msgstr "семейство операторов %s для метода доступа %s" -#: catalog/pg_aggregate.c:128 +#: catalog/pg_aggregate.c:129 #, c-format msgid "aggregates cannot have more than %d argument" msgid_plural "aggregates cannot have more than %d arguments" @@ -5505,19 +5693,19 @@ msgstr[0] "агрегатные функции допускают не боль msgstr[1] "агрегатные функции допускают не больше %d аргументов" msgstr[2] "агрегатные функции допускают не больше %d аргументов" -#: catalog/pg_aggregate.c:143 catalog/pg_aggregate.c:157 +#: catalog/pg_aggregate.c:144 catalog/pg_aggregate.c:158 #, c-format msgid "cannot determine transition data type" msgstr "не удалось определить переходный тип данных" -#: catalog/pg_aggregate.c:172 +#: catalog/pg_aggregate.c:173 #, c-format msgid "a variadic ordered-set aggregate must use VARIADIC type ANY" msgstr "" "сортирующая агрегатная функция с непостоянными аргументами должна " "использовать тип VARIADIC ANY" -#: catalog/pg_aggregate.c:198 +#: catalog/pg_aggregate.c:199 #, c-format msgid "" "a hypothetical-set aggregate must have direct arguments matching its " @@ -5526,12 +5714,12 @@ msgstr "" "гипотезирующая агрегатная функция должна иметь непосредственные аргументы, " "соответствующие агрегатным" -#: catalog/pg_aggregate.c:245 catalog/pg_aggregate.c:289 +#: catalog/pg_aggregate.c:246 catalog/pg_aggregate.c:290 #, c-format msgid "return type of transition function %s is not %s" msgstr "функция перехода %s должна возвращать тип %s" -#: catalog/pg_aggregate.c:265 catalog/pg_aggregate.c:308 +#: catalog/pg_aggregate.c:266 catalog/pg_aggregate.c:309 #, c-format msgid "" "must not omit initial value when transition function is strict and " @@ -5540,58 +5728,58 @@ msgstr "" "нельзя опускать начальное значение, когда функция перехода объявлена как " "STRICT и переходный тип несовместим с входным типом" -#: catalog/pg_aggregate.c:334 +#: catalog/pg_aggregate.c:335 #, c-format msgid "return type of inverse transition function %s is not %s" msgstr "обратная функция перехода %s должна возвращать тип %s" -#: catalog/pg_aggregate.c:351 executor/nodeWindowAgg.c:2852 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2852 #, c-format msgid "" "strictness of aggregate's forward and inverse transition functions must match" msgstr "" "прямая и обратная функции перехода агрегата должны иметь одинаковую строгость" -#: catalog/pg_aggregate.c:395 catalog/pg_aggregate.c:553 +#: catalog/pg_aggregate.c:396 catalog/pg_aggregate.c:554 #, c-format msgid "final function with extra arguments must not be declared STRICT" msgstr "" "финальная функция с дополнительными аргументами не должна объявляться как " "строгая (STRICT)" -#: catalog/pg_aggregate.c:426 +#: catalog/pg_aggregate.c:427 #, c-format msgid "return type of combine function %s is not %s" msgstr "комбинирующая функция %s должна возвращать тип %s" -#: catalog/pg_aggregate.c:438 executor/nodeAgg.c:4197 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:4125 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "" "комбинирующая функция с переходным типом %s не должна объявляться как " "строгая (STRICT)" -#: catalog/pg_aggregate.c:457 +#: catalog/pg_aggregate.c:458 #, c-format msgid "return type of serialization function %s is not %s" msgstr "функция сериализации %s должна возвращать тип %s" -#: catalog/pg_aggregate.c:478 +#: catalog/pg_aggregate.c:479 #, c-format msgid "return type of deserialization function %s is not %s" msgstr "функция десериализации %s должна возвращать тип %s" -#: catalog/pg_aggregate.c:497 catalog/pg_proc.c:186 catalog/pg_proc.c:220 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:190 catalog/pg_proc.c:224 #, c-format msgid "cannot determine result data type" msgstr "не удалось определить тип результата" -#: catalog/pg_aggregate.c:512 catalog/pg_proc.c:199 catalog/pg_proc.c:228 +#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:203 catalog/pg_proc.c:232 #, c-format msgid "unsafe use of pseudo-type \"internal\"" msgstr "небезопасное использование псевдотипа \"internal\"" -#: catalog/pg_aggregate.c:566 +#: catalog/pg_aggregate.c:567 #, c-format msgid "" "moving-aggregate implementation returns type %s, but plain implementation " @@ -5600,67 +5788,67 @@ msgstr "" "реализация движимого агрегата возвращает тип %s, но простая реализация " "возвращает %s" -#: catalog/pg_aggregate.c:577 +#: catalog/pg_aggregate.c:578 #, c-format msgid "sort operator can only be specified for single-argument aggregates" msgstr "" "оператор сортировки можно указать только для агрегатных функций с одним " "аргументом" -#: catalog/pg_aggregate.c:704 catalog/pg_proc.c:374 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:385 #, c-format msgid "cannot change routine kind" msgstr "тип подпрограммы изменить нельзя" -#: catalog/pg_aggregate.c:706 +#: catalog/pg_aggregate.c:708 #, c-format msgid "\"%s\" is an ordinary aggregate function." msgstr "\"%s\" — обычная агрегатная функция." -#: catalog/pg_aggregate.c:708 +#: catalog/pg_aggregate.c:710 #, c-format msgid "\"%s\" is an ordered-set aggregate." msgstr "\"%s\" — сортирующая агрегатная функция." -#: catalog/pg_aggregate.c:710 +#: catalog/pg_aggregate.c:712 #, c-format msgid "\"%s\" is a hypothetical-set aggregate." msgstr "\"%s\" — гипотезирующая агрегатная функция." -#: catalog/pg_aggregate.c:715 +#: catalog/pg_aggregate.c:717 #, c-format msgid "cannot change number of direct arguments of an aggregate function" msgstr "изменить число непосредственных аргументов агрегатной функции нельзя" -#: catalog/pg_aggregate.c:870 commands/functioncmds.c:667 -#: commands/typecmds.c:1658 commands/typecmds.c:1704 commands/typecmds.c:1756 -#: commands/typecmds.c:1793 commands/typecmds.c:1827 commands/typecmds.c:1861 -#: commands/typecmds.c:1895 commands/typecmds.c:1972 commands/typecmds.c:2014 -#: parser/parse_func.c:414 parser/parse_func.c:443 parser/parse_func.c:468 -#: parser/parse_func.c:482 parser/parse_func.c:602 parser/parse_func.c:622 -#: parser/parse_func.c:2129 parser/parse_func.c:2320 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:702 +#: commands/typecmds.c:1991 commands/typecmds.c:2037 commands/typecmds.c:2089 +#: commands/typecmds.c:2126 commands/typecmds.c:2160 commands/typecmds.c:2194 +#: commands/typecmds.c:2228 commands/typecmds.c:2257 commands/typecmds.c:2344 +#: commands/typecmds.c:2386 parser/parse_func.c:417 parser/parse_func.c:448 +#: parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 +#: parser/parse_func.c:631 parser/parse_func.c:2173 parser/parse_func.c:2446 #, c-format msgid "function %s does not exist" msgstr "функция %s не существует" -#: catalog/pg_aggregate.c:876 +#: catalog/pg_aggregate.c:864 #, c-format msgid "function %s returns a set" msgstr "функция %s возвращает множество" -#: catalog/pg_aggregate.c:891 +#: catalog/pg_aggregate.c:879 #, c-format msgid "function %s must accept VARIADIC ANY to be used in this aggregate" msgstr "" "для использования в этой агрегатной функции функция %s должна принимать " "VARIADIC ANY" -#: catalog/pg_aggregate.c:915 +#: catalog/pg_aggregate.c:903 #, c-format msgid "function %s requires run-time type coercion" msgstr "функции %s требуется приведение типов во время выполнения" -#: catalog/pg_cast.c:67 +#: catalog/pg_cast.c:68 #, c-format msgid "cast from type %s to type %s already exists" msgstr "приведение типа %s к типу %s уже существует" @@ -5686,7 +5874,7 @@ msgstr "правило сортировки \"%s\" уже существует" msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "правило сортировки \"%s\" для кодировки \"%s\" уже существует" -#: catalog/pg_constraint.c:676 +#: catalog/pg_constraint.c:678 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "ограничение \"%s\" для домена %s уже существует" @@ -5711,25 +5899,25 @@ msgstr "преобразование \"%s\" уже существует" msgid "default conversion for %s to %s already exists" msgstr "преобразование по умолчанию из %s в %s уже существует" -#: catalog/pg_depend.c:162 commands/extension.c:3324 +#: catalog/pg_depend.c:211 commands/extension.c:3352 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s уже относится к расширению \"%s\"" -#: catalog/pg_depend.c:538 +#: catalog/pg_depend.c:587 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "" "ликвидировать зависимость от объекта %s нельзя, так как это системный объект" -#: catalog/pg_enum.c:127 catalog/pg_enum.c:230 catalog/pg_enum.c:525 +#: catalog/pg_enum.c:128 catalog/pg_enum.c:230 catalog/pg_enum.c:525 #, c-format msgid "invalid enum label \"%s\"" msgstr "неверная метка в перечислении \"%s\"" -#: catalog/pg_enum.c:128 catalog/pg_enum.c:231 catalog/pg_enum.c:526 +#: catalog/pg_enum.c:129 catalog/pg_enum.c:231 catalog/pg_enum.c:526 #, c-format -msgid "Labels must be %d characters or less." +msgid "Labels must be %d bytes or less." msgstr "Длина метки не должна превышать %d байт." #: catalog/pg_enum.c:259 @@ -5759,7 +5947,40 @@ msgstr "" "конструкция ALTER TYPE ADD BEFORE/AFTER несовместима с двоичным обновлением " "данных" -#: catalog/pg_namespace.c:64 commands/schemacmds.c:265 +#: catalog/pg_inherits.c:593 +#, c-format +msgid "cannot detach partition \"%s\"" +msgstr "отсоединить секцию \"%s\" нельзя" + +#: catalog/pg_inherits.c:595 +#, c-format +msgid "" +"The partition is being detached concurrently or has an unfinished detach." +msgstr "" +"Эта секция отсоединяется параллельно или для неё не была завершена операция " +"отсоединения." + +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4425 +#: commands/tablecmds.c:14815 +#, c-format +msgid "" +"Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending " +"detach operation." +msgstr "" +"Чтобы завершить неоконченную операцию отсоединения, выполните команду ALTER " +"TABLE ... DETACH PARTITION ... FINALIZE." + +#: catalog/pg_inherits.c:600 +#, c-format +msgid "cannot complete detaching partition \"%s\"" +msgstr "завершить отсоединение секции \"%s\" нельзя" + +#: catalog/pg_inherits.c:602 +#, c-format +msgid "There's no pending concurrent detach." +msgstr "На данный момент все операции отсоединения завершены." + +#: catalog/pg_namespace.c:64 commands/schemacmds.c:243 #, c-format msgid "schema \"%s\" already exists" msgstr "схема \"%s\" уже существует" @@ -5774,7 +5995,7 @@ msgstr "имя \"%s\" недопустимо для оператора" msgid "only binary operators can have commutators" msgstr "коммутативную операцию можно определить только для бинарных операторов" -#: catalog/pg_operator.c:374 commands/operatorcmds.c:495 +#: catalog/pg_operator.c:374 commands/operatorcmds.c:507 #, c-format msgid "only binary operators can have join selectivity" msgstr "" @@ -5796,13 +6017,13 @@ msgstr "поддержку хеша можно обозначить только msgid "only boolean operators can have negators" msgstr "обратную операцию можно определить только для логических операторов" -#: catalog/pg_operator.c:397 commands/operatorcmds.c:503 +#: catalog/pg_operator.c:397 commands/operatorcmds.c:515 #, c-format msgid "only boolean operators can have restriction selectivity" msgstr "" "функцию оценки ограничения можно определить только для логических операторов" -#: catalog/pg_operator.c:401 commands/operatorcmds.c:507 +#: catalog/pg_operator.c:401 commands/operatorcmds.c:519 #, c-format msgid "only boolean operators can have join selectivity" msgstr "" @@ -5831,7 +6052,7 @@ msgid "operator cannot be its own negator or sort operator" msgstr "" "оператор не может быть обратным к себе или собственным оператором сортировки" -#: catalog/pg_proc.c:127 parser/parse_func.c:2191 +#: catalog/pg_proc.c:131 parser/parse_func.c:2235 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" @@ -5839,37 +6060,37 @@ msgstr[0] "функции не могут иметь больше %d аргум msgstr[1] "функции не могут иметь больше %d аргументов" msgstr[2] "функции не могут иметь больше %d аргументов" -#: catalog/pg_proc.c:364 +#: catalog/pg_proc.c:375 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "функция \"%s\" с аргументами таких типов уже существует" -#: catalog/pg_proc.c:376 +#: catalog/pg_proc.c:387 #, c-format msgid "\"%s\" is an aggregate function." msgstr "\"%s\" — агрегатная функция." -#: catalog/pg_proc.c:378 +#: catalog/pg_proc.c:389 #, c-format msgid "\"%s\" is a function." msgstr "\"%s\" — функция." -#: catalog/pg_proc.c:380 +#: catalog/pg_proc.c:391 #, c-format msgid "\"%s\" is a procedure." msgstr "\"%s\" — процедура." -#: catalog/pg_proc.c:382 +#: catalog/pg_proc.c:393 #, c-format msgid "\"%s\" is a window function." msgstr "\"%s\" — оконная функция." -#: catalog/pg_proc.c:402 +#: catalog/pg_proc.c:413 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "определить выходные параметры для процедуры нельзя" -#: catalog/pg_proc.c:403 catalog/pg_proc.c:433 +#: catalog/pg_proc.c:414 catalog/pg_proc.c:444 #, c-format msgid "cannot change return type of existing function" msgstr "изменить тип возврата существующей функции нельзя" @@ -5878,91 +6099,91 @@ msgstr "изменить тип возврата существующей фун #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: catalog/pg_proc.c:409 catalog/pg_proc.c:436 catalog/pg_proc.c:481 -#: catalog/pg_proc.c:507 catalog/pg_proc.c:533 +#: catalog/pg_proc.c:420 catalog/pg_proc.c:447 catalog/pg_proc.c:492 +#: catalog/pg_proc.c:518 catalog/pg_proc.c:544 #, c-format msgid "Use %s %s first." msgstr "Сначала выполните %s %s." -#: catalog/pg_proc.c:434 +#: catalog/pg_proc.c:445 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "Параметры OUT определяют другой тип строки." -#: catalog/pg_proc.c:478 +#: catalog/pg_proc.c:489 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "изменить имя входного параметра \"%s\" нельзя" -#: catalog/pg_proc.c:505 +#: catalog/pg_proc.c:516 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "" "для существующей функции нельзя убрать значения параметров по умолчанию" -#: catalog/pg_proc.c:531 +#: catalog/pg_proc.c:542 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "" "для существующего значения параметра по умолчанию нельзя изменить тип данных" -#: catalog/pg_proc.c:748 +#: catalog/pg_proc.c:752 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "встроенной функции \"%s\" нет" -#: catalog/pg_proc.c:846 +#: catalog/pg_proc.c:850 #, c-format msgid "SQL functions cannot return type %s" msgstr "SQL-функции не могут возвращать тип %s" -#: catalog/pg_proc.c:861 +#: catalog/pg_proc.c:865 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "SQL-функции не могут иметь аргументы типа %s" -#: catalog/pg_proc.c:954 executor/functions.c:1440 +#: catalog/pg_proc.c:995 executor/functions.c:1458 #, c-format msgid "SQL function \"%s\"" msgstr "SQL-функция \"%s\"" -#: catalog/pg_publication.c:59 +#: catalog/pg_publication.c:60 #, c-format msgid "Only tables can be added to publications." msgstr "В публикации можно добавлять только таблицы." -#: catalog/pg_publication.c:65 +#: catalog/pg_publication.c:66 #, c-format msgid "\"%s\" is a system table" msgstr "\"%s\" - это системная таблица" -#: catalog/pg_publication.c:67 +#: catalog/pg_publication.c:68 #, c-format msgid "System tables cannot be added to publications." msgstr "Системные таблицы нельзя добавлять в публикации." -#: catalog/pg_publication.c:73 +#: catalog/pg_publication.c:74 #, c-format msgid "table \"%s\" cannot be replicated" msgstr "реплицировать таблицу \"%s\" нельзя" -#: catalog/pg_publication.c:75 +#: catalog/pg_publication.c:76 #, c-format msgid "Temporary and unlogged relations cannot be replicated." msgstr "Временные и нежурналируемые отношения не поддерживают репликацию." -#: catalog/pg_publication.c:174 +#: catalog/pg_publication.c:251 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "отношение \"%s\" уже включено в публикацию \"%s\"" -#: catalog/pg_publication.c:470 commands/publicationcmds.c:451 -#: commands/publicationcmds.c:762 +#: catalog/pg_publication.c:533 commands/publicationcmds.c:458 +#: commands/publicationcmds.c:786 #, c-format msgid "publication \"%s\" does not exist" msgstr "публикация \"%s\" не существует" -#: catalog/pg_shdepend.c:832 +#: catalog/pg_shdepend.c:833 #, c-format msgid "" "\n" @@ -5980,43 +6201,43 @@ msgstr[2] "" "\n" "и объекты в %d других базах данных (см. список в протоколе сервера)" -#: catalog/pg_shdepend.c:1138 +#: catalog/pg_shdepend.c:1180 #, c-format msgid "role %u was concurrently dropped" msgstr "роль %u удалена другим процессом" -#: catalog/pg_shdepend.c:1150 +#: catalog/pg_shdepend.c:1192 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "табличное пространство %u удалено другим процессом" -#: catalog/pg_shdepend.c:1164 +#: catalog/pg_shdepend.c:1206 #, c-format msgid "database %u was concurrently dropped" msgstr "база данных %u удалена другим процессом" -#: catalog/pg_shdepend.c:1209 +#: catalog/pg_shdepend.c:1257 #, c-format msgid "owner of %s" msgstr "владелец объекта %s" -#: catalog/pg_shdepend.c:1211 +#: catalog/pg_shdepend.c:1259 #, c-format msgid "privileges for %s" msgstr "права доступа к объекту %s" -#: catalog/pg_shdepend.c:1213 +#: catalog/pg_shdepend.c:1261 #, c-format msgid "target of %s" msgstr "субъект политики %s" -#: catalog/pg_shdepend.c:1215 +#: catalog/pg_shdepend.c:1263 #, c-format msgid "tablespace for %s" msgstr "табличное пространство для %s" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1223 +#: catalog/pg_shdepend.c:1271 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" @@ -6024,7 +6245,7 @@ msgstr[0] "%d объект (%s)" msgstr[1] "%d объекта (%s)" msgstr[2] "%d объектов (%s)" -#: catalog/pg_shdepend.c:1334 +#: catalog/pg_shdepend.c:1382 #, c-format msgid "" "cannot drop objects owned by %s because they are required by the database " @@ -6033,7 +6254,7 @@ msgstr "" "удалить объекты, принадлежащие роли %s, нельзя, так как они нужны системе " "баз данных" -#: catalog/pg_shdepend.c:1481 +#: catalog/pg_shdepend.c:1529 #, c-format msgid "" "cannot reassign ownership of objects owned by %s because they are required " @@ -6042,132 +6263,170 @@ msgstr "" "изменить владельца объектов, принадлежащих роли %s, нельзя, так как они " "нужны системе баз данных" -#: catalog/pg_subscription.c:171 commands/subscriptioncmds.c:644 -#: commands/subscriptioncmds.c:858 commands/subscriptioncmds.c:1080 +#: catalog/pg_subscription.c:174 commands/subscriptioncmds.c:779 +#: commands/subscriptioncmds.c:1088 commands/subscriptioncmds.c:1431 #, c-format msgid "subscription \"%s\" does not exist" msgstr "подписка \"%s\" не существует" -#: catalog/pg_type.c:131 catalog/pg_type.c:468 +#: catalog/pg_subscription.c:432 #, c-format -msgid "pg_type OID value not set when in binary upgrade mode" +msgid "could not drop relation mapping for subscription \"%s\"" +msgstr "удалить сопоставление отношений для подписки \"%s\" не получилось" + +#: catalog/pg_subscription.c:434 +#, c-format +msgid "" +"Table synchronization for relation \"%s\" is in progress and is in state \"%c" +"\"." +msgstr "Выполняется синхронизация отношения \"%s\", текущее состояние: \"%c\"." + +#. translator: first %s is a SQL ALTER command and second %s is a +#. SQL DROP command +#. +#: catalog/pg_subscription.c:441 +#, c-format +msgid "" +"Use %s to enable subscription if not already enabled or use %s to drop the " +"subscription." +msgstr "" +"Выполните %s, чтобы включить подписку, если она ещё не включена, либо %s, " +"чтобы удалить её." + +#: catalog/pg_type.c:136 catalog/pg_type.c:476 +#, c-format +msgid "pg_type OID value not set when in binary upgrade mode" msgstr "значение OID в pg_type не задано в режиме двоичного обновления" -#: catalog/pg_type.c:249 +#: catalog/pg_type.c:256 #, c-format msgid "invalid type internal size %d" msgstr "неверный внутренний размер типа: %d" -#: catalog/pg_type.c:265 catalog/pg_type.c:273 catalog/pg_type.c:281 -#: catalog/pg_type.c:290 +#: catalog/pg_type.c:272 catalog/pg_type.c:280 catalog/pg_type.c:288 +#: catalog/pg_type.c:297 #, c-format msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" msgstr "" "выравнивание \"%c\" не подходит для типа, передаваемого по значению (с " "размером: %d)" -#: catalog/pg_type.c:297 +#: catalog/pg_type.c:304 #, c-format msgid "internal size %d is invalid for passed-by-value type" msgstr "внутренний размер %d не подходит для типа, передаваемого по значению" -#: catalog/pg_type.c:307 catalog/pg_type.c:313 +#: catalog/pg_type.c:314 catalog/pg_type.c:320 #, c-format msgid "alignment \"%c\" is invalid for variable-length type" msgstr "выравнивание \"%c\" не подходит для типа переменной длины" -#: catalog/pg_type.c:321 commands/typecmds.c:3727 +#: catalog/pg_type.c:328 commands/typecmds.c:4164 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "для типов постоянного размера применим только режим хранения PLAIN" -#: catalog/pg_type.c:839 +#: catalog/pg_type.c:824 #, c-format msgid "could not form array type name for type \"%s\"" msgstr "не удалось сформировать имя типа массива для типа \"%s\"" -#: catalog/storage.c:450 storage/buffer/bufmgr.c:935 +#: catalog/pg_type.c:929 +#, c-format +msgid "Failed while creating a multirange type for type \"%s\"." +msgstr "Ошибка при создании мультидиапазонного типа для типа \"%s\"." + +#: catalog/pg_type.c:930 +#, c-format +msgid "" +"You can manually specify a multirange type name using the " +"\"multirange_type_name\" attribute." +msgstr "" +"Имя мультидиапазонного типа можно указать вручную, воспользовавшись " +"атрибутом \"multirange_type_name\"." + +#: catalog/storage.c:450 storage/buffer/bufmgr.c:1035 #, c-format msgid "invalid page in block %u of relation %s" msgstr "неверная страница в блоке %u отношения %s" -#: catalog/toasting.c:106 commands/indexcmds.c:639 commands/tablecmds.c:5640 -#: commands/tablecmds.c:15598 +#: catalog/toasting.c:110 commands/indexcmds.c:667 commands/tablecmds.c:6047 +#: commands/tablecmds.c:16380 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\" - это не таблица и не материализованное представление" -#: commands/aggregatecmds.c:171 +#: commands/aggregatecmds.c:170 #, c-format msgid "only ordered-set aggregates can be hypothetical" msgstr "гипотезирующими могут быть только сортирующие агрегатные функции" -#: commands/aggregatecmds.c:196 +#: commands/aggregatecmds.c:195 #, c-format msgid "aggregate attribute \"%s\" not recognized" msgstr "нераспознанный атрибут \"%s\" в определении агрегатной функции" -#: commands/aggregatecmds.c:206 +#: commands/aggregatecmds.c:205 #, c-format msgid "aggregate stype must be specified" msgstr "в определении агрегата требуется stype" -#: commands/aggregatecmds.c:210 +#: commands/aggregatecmds.c:209 #, c-format msgid "aggregate sfunc must be specified" msgstr "в определении агрегата требуется sfunc" -#: commands/aggregatecmds.c:222 +#: commands/aggregatecmds.c:221 #, c-format msgid "aggregate msfunc must be specified when mstype is specified" msgstr "в определении агрегата требуется msfunc, если указан mstype" -#: commands/aggregatecmds.c:226 +#: commands/aggregatecmds.c:225 #, c-format msgid "aggregate minvfunc must be specified when mstype is specified" msgstr "в определении агрегата требуется minvfunc, если указан mstype" -#: commands/aggregatecmds.c:233 +#: commands/aggregatecmds.c:232 #, c-format msgid "aggregate msfunc must not be specified without mstype" msgstr "msfunc для агрегата не должна указываться без mstype" -#: commands/aggregatecmds.c:237 +#: commands/aggregatecmds.c:236 #, c-format msgid "aggregate minvfunc must not be specified without mstype" msgstr "minvfunc для агрегата не должна указываться без mstype" -#: commands/aggregatecmds.c:241 +#: commands/aggregatecmds.c:240 #, c-format msgid "aggregate mfinalfunc must not be specified without mstype" msgstr "mfinalfunc для агрегата не должна указываться без mstype" -#: commands/aggregatecmds.c:245 +#: commands/aggregatecmds.c:244 #, c-format msgid "aggregate msspace must not be specified without mstype" msgstr "msspace для агрегата не должна указываться без mstype" -#: commands/aggregatecmds.c:249 +#: commands/aggregatecmds.c:248 #, c-format msgid "aggregate minitcond must not be specified without mstype" msgstr "minitcond для агрегата не должна указываться без mstype" -#: commands/aggregatecmds.c:278 +#: commands/aggregatecmds.c:277 #, c-format msgid "aggregate input type must be specified" msgstr "в определении агрегата требуется входной тип" -#: commands/aggregatecmds.c:308 +#: commands/aggregatecmds.c:307 #, c-format msgid "basetype is redundant with aggregate input type specification" msgstr "в определении агрегата с указанием входного типа не нужен базовый тип" -#: commands/aggregatecmds.c:349 commands/aggregatecmds.c:390 +#: commands/aggregatecmds.c:350 commands/aggregatecmds.c:391 #, c-format msgid "aggregate transition data type cannot be %s" msgstr "переходным типом агрегата не может быть %s" -#: commands/aggregatecmds.c:361 +#: commands/aggregatecmds.c:362 #, c-format msgid "" "serialization functions may be specified only when the aggregate transition " @@ -6176,19 +6435,19 @@ msgstr "" "функции сериализации могут задаваться, только когда переходный тип данных " "агрегата - %s" -#: commands/aggregatecmds.c:371 +#: commands/aggregatecmds.c:372 #, c-format msgid "" "must specify both or neither of serialization and deserialization functions" msgstr "функции сериализации и десериализации должны задаваться совместно" -#: commands/aggregatecmds.c:436 commands/functioncmds.c:615 +#: commands/aggregatecmds.c:437 commands/functioncmds.c:650 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "" "параметр \"parallel\" должен иметь значение SAFE, RESTRICTED или UNSAFE" -#: commands/aggregatecmds.c:492 +#: commands/aggregatecmds.c:493 #, c-format msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" msgstr "" @@ -6205,22 +6464,22 @@ msgstr "событийный триггер \"%s\" уже существует" msgid "foreign-data wrapper \"%s\" already exists" msgstr "обёртка сторонних данных \"%s\" уже существует" -#: commands/alter.c:90 commands/foreigncmds.c:903 +#: commands/alter.c:90 commands/foreigncmds.c:879 #, c-format msgid "server \"%s\" already exists" msgstr "сервер \"%s\" уже существует" -#: commands/alter.c:93 commands/proclang.c:132 +#: commands/alter.c:93 commands/proclang.c:133 #, c-format msgid "language \"%s\" already exists" msgstr "язык \"%s\" уже существует" -#: commands/alter.c:96 commands/publicationcmds.c:183 +#: commands/alter.c:96 commands/publicationcmds.c:180 #, c-format msgid "publication \"%s\" already exists" msgstr "публикация \"%s\" уже существует" -#: commands/alter.c:99 commands/subscriptioncmds.c:371 +#: commands/alter.c:99 commands/subscriptioncmds.c:400 #, c-format msgid "subscription \"%s\" already exists" msgstr "подписка \"%s\" уже существует" @@ -6280,62 +6539,57 @@ msgstr "Для создания метода доступа нужно быть msgid "access method \"%s\" already exists" msgstr "метод доступа \"%s\" уже существует" -#: commands/amcmds.c:130 -#, c-format -msgid "must be superuser to drop access methods" -msgstr "для удаления методов доступа нужно быть суперпользователем" - -#: commands/amcmds.c:181 commands/indexcmds.c:188 commands/indexcmds.c:790 -#: commands/opclasscmds.c:373 commands/opclasscmds.c:793 +#: commands/amcmds.c:154 commands/indexcmds.c:210 commands/indexcmds.c:818 +#: commands/opclasscmds.c:370 commands/opclasscmds.c:824 #, c-format msgid "access method \"%s\" does not exist" msgstr "метод доступа \"%s\" не существует" -#: commands/amcmds.c:270 +#: commands/amcmds.c:243 #, c-format msgid "handler function is not specified" msgstr "не указана функция-обработчик" -#: commands/amcmds.c:291 commands/event_trigger.c:183 -#: commands/foreigncmds.c:489 commands/proclang.c:79 commands/trigger.c:687 -#: parser/parse_clause.c:941 +#: commands/amcmds.c:264 commands/event_trigger.c:183 +#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:699 +#: parser/parse_clause.c:940 #, c-format msgid "function %s must return type %s" msgstr "функция %s должна возвращать тип %s" -#: commands/analyze.c:226 +#: commands/analyze.c:227 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "\"%s\" пропускается --- анализировать эту стороннюю таблицу нельзя" -#: commands/analyze.c:243 +#: commands/analyze.c:244 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "" "\"%s\" пропускается --- анализировать не таблицы или специальные системные " "таблицы нельзя" -#: commands/analyze.c:329 +#: commands/analyze.c:324 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "анализируется дерево наследования \"%s.%s\"" -#: commands/analyze.c:334 +#: commands/analyze.c:329 #, c-format msgid "analyzing \"%s.%s\"" msgstr "анализируется \"%s.%s\"" -#: commands/analyze.c:394 +#: commands/analyze.c:395 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "столбец \"%s\" отношения \"%s\" указан неоднократно" -#: commands/analyze.c:700 +#: commands/analyze.c:805 #, c-format -msgid "automatic analyze of table \"%s.%s.%s\" system usage: %s" -msgstr "автоматический анализ таблицы \"%s.%s.%s\"; нагрузка системы: %s" +msgid "automatic analyze of table \"%s.%s.%s\"\n" +msgstr "автоматический анализ таблицы \"%s.%s.%s\"\n" -#: commands/analyze.c:1169 +#: commands/analyze.c:1351 #, c-format msgid "" "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead " @@ -6345,7 +6599,7 @@ msgstr "" "%.0f, \"мёртвых\" строк: %.0f; строк в выборке: %d, примерное общее число " "строк: %.0f" -#: commands/analyze.c:1249 +#: commands/analyze.c:1431 #, c-format msgid "" "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree " @@ -6354,7 +6608,7 @@ msgstr "" "пропускается анализ дерева наследования \"%s.%s\" --- это дерево " "наследования не содержит дочерних таблиц" -#: commands/analyze.c:1347 +#: commands/analyze.c:1529 #, c-format msgid "" "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree " @@ -6363,22 +6617,22 @@ msgstr "" "пропускается анализ дерева наследования \"%s.%s\" --- это дерево " "наследования не содержит анализируемых дочерних таблиц" -#: commands/async.c:643 +#: commands/async.c:646 #, c-format msgid "channel name cannot be empty" msgstr "имя канала не может быть пустым" -#: commands/async.c:649 +#: commands/async.c:652 #, c-format msgid "channel name too long" msgstr "слишком длинное имя канала" -#: commands/async.c:654 +#: commands/async.c:657 #, c-format msgid "payload string too long" msgstr "слишком длинная строка сообщения-нагрузки" -#: commands/async.c:873 +#: commands/async.c:876 #, c-format msgid "" "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" @@ -6386,17 +6640,17 @@ msgstr "" "выполнить PREPARE для транзакции с командами LISTEN, UNLISTEN или NOTIFY " "нельзя" -#: commands/async.c:979 +#: commands/async.c:980 #, c-format msgid "too many notifications in the NOTIFY queue" msgstr "слишком много уведомлений в очереди NOTIFY" -#: commands/async.c:1650 +#: commands/async.c:1616 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "очередь NOTIFY заполнена на %.0f%%" -#: commands/async.c:1652 +#: commands/async.c:1618 #, c-format msgid "" "The server process with PID %d is among those with the oldest transactions." @@ -6404,7 +6658,7 @@ msgstr "" "В число серверных процессов с самыми старыми транзакциями входит процесс с " "PID %d." -#: commands/async.c:1655 +#: commands/async.c:1621 #, c-format msgid "" "The NOTIFY queue cannot be emptied until that process ends its current " @@ -6413,42 +6667,47 @@ msgstr "" "Очередь NOTIFY можно будет освободить, только когда этот процесс завершит " "текущую транзакцию." -#: commands/cluster.c:125 commands/cluster.c:362 +#: commands/cluster.c:119 +#, c-format +msgid "unrecognized CLUSTER option \"%s\"" +msgstr "нераспознанный параметр CLUSTER: \"%s\"" + +#: commands/cluster.c:147 commands/cluster.c:386 #, c-format msgid "cannot cluster temporary tables of other sessions" msgstr "кластеризовать временные таблицы других сеансов нельзя" -#: commands/cluster.c:133 +#: commands/cluster.c:155 #, c-format msgid "cannot cluster a partitioned table" msgstr "кластеризовать секционированную таблицу нельзя" -#: commands/cluster.c:151 +#: commands/cluster.c:173 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "таблица \"%s\" ранее не кластеризовалась по какому-либо индексу" -#: commands/cluster.c:165 commands/tablecmds.c:12871 commands/tablecmds.c:14681 +#: commands/cluster.c:187 commands/tablecmds.c:13536 commands/tablecmds.c:15408 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "индекс \"%s\" для таблицы \"%s\" не существует" -#: commands/cluster.c:351 +#: commands/cluster.c:375 #, c-format msgid "cannot cluster a shared catalog" msgstr "кластеризовать разделяемый каталог нельзя" -#: commands/cluster.c:366 +#: commands/cluster.c:390 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "очищать временные таблицы других сеансов нельзя" -#: commands/cluster.c:432 commands/tablecmds.c:14691 +#: commands/cluster.c:456 commands/tablecmds.c:15418 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" не является индексом таблицы \"%s\"" -#: commands/cluster.c:440 +#: commands/cluster.c:464 #, c-format msgid "" "cannot cluster on index \"%s\" because access method does not support " @@ -6456,33 +6715,33 @@ msgid "" msgstr "" "кластеризация по индексу \"%s\" невозможна, её не поддерживает метод доступа" -#: commands/cluster.c:452 +#: commands/cluster.c:476 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "кластеризовать по частичному индексу \"%s\" нельзя" -#: commands/cluster.c:466 +#: commands/cluster.c:490 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "нельзя кластеризовать таблицу по неверному индексу \"%s\"" -#: commands/cluster.c:490 +#: commands/cluster.c:514 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "пометить индекс как кластеризованный в секционированной таблице нельзя" -#: commands/cluster.c:863 +#: commands/cluster.c:887 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "кластеризация \"%s.%s\" путём сканирования индекса \"%s\"" -#: commands/cluster.c:869 +#: commands/cluster.c:893 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "" "кластеризация \"%s.%s\" путём последовательного сканирования и сортировки" -#: commands/cluster.c:900 +#: commands/cluster.c:924 #, c-format msgid "" "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" @@ -6490,7 +6749,7 @@ msgstr "" "\"%s\": найдено удаляемых версий строк: %.0f, неудаляемых - %.0f, " "просмотрено страниц: %u" -#: commands/cluster.c:904 +#: commands/cluster.c:928 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -6499,59 +6758,64 @@ msgstr "" "В данный момент нельзя удалить \"мёртвых\" строк %.0f.\n" "%s." -#: commands/collationcmds.c:105 +#: commands/collationcmds.c:106 #, c-format msgid "collation attribute \"%s\" not recognized" msgstr "атрибут COLLATION \"%s\" не распознан" -#: commands/collationcmds.c:148 +#: commands/collationcmds.c:149 #, c-format msgid "collation \"default\" cannot be copied" msgstr "правило сортировки \"default\" нельзя скопировать" -#: commands/collationcmds.c:181 +#: commands/collationcmds.c:182 #, c-format msgid "unrecognized collation provider: %s" -msgstr "нераспознанный поставщик правил сортировки: %s" +msgstr "нераспознанный провайдер правил сортировки: %s" -#: commands/collationcmds.c:190 +#: commands/collationcmds.c:191 #, c-format msgid "parameter \"lc_collate\" must be specified" msgstr "необходимо указать параметр \"lc_collate\"" -#: commands/collationcmds.c:195 +#: commands/collationcmds.c:196 #, c-format msgid "parameter \"lc_ctype\" must be specified" msgstr "необходимо указать параметр \"lc_ctype\"" -#: commands/collationcmds.c:205 +#: commands/collationcmds.c:206 #, c-format msgid "nondeterministic collations not supported with this provider" msgstr "" -"недетерминированные правила сортировки с этим провайдером не поддерживаются" +"недетерминированные правила сортировки не поддерживаются данным провайдером" + +#: commands/collationcmds.c:227 +#, c-format +msgid "current database's encoding is not supported with this provider" +msgstr "кодировка текущей БД не поддерживается данным провайдером" -#: commands/collationcmds.c:265 +#: commands/collationcmds.c:285 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "" "правило сортировки \"%s\" для кодировки \"%s\" уже существует в схеме \"%s\"" -#: commands/collationcmds.c:276 +#: commands/collationcmds.c:296 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "правило сортировки \"%s\" уже существует в схеме \"%s\"" -#: commands/collationcmds.c:324 +#: commands/collationcmds.c:344 #, c-format msgid "changing version from %s to %s" msgstr "изменение версии с %s на %s" -#: commands/collationcmds.c:339 +#: commands/collationcmds.c:359 #, c-format msgid "version has not changed" msgstr "версия не была изменена" -#: commands/collationcmds.c:470 +#: commands/collationcmds.c:473 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "не удалось получить из названия локали \"%s\" метку языка: %s" @@ -6562,13 +6826,13 @@ msgid "must be superuser to import system collations" msgstr "" "импортировать системные правила сортировки может только суперпользователь" -#: commands/collationcmds.c:554 commands/copy.c:1894 commands/copy.c:3480 +#: commands/collationcmds.c:559 commands/copyfrom.c:1500 commands/copyto.c:680 #: libpq/be-secure-common.c:81 #, c-format msgid "could not execute command \"%s\": %m" msgstr "не удалось выполнить команду \"%s\": %m" -#: commands/collationcmds.c:685 +#: commands/collationcmds.c:690 #, c-format msgid "no usable system locales were found" msgstr "пригодные системные локали не найдены" @@ -6576,13 +6840,13 @@ msgstr "пригодные системные локали не найдены" #: commands/comment.c:61 commands/dbcommands.c:841 commands/dbcommands.c:1037 #: commands/dbcommands.c:1150 commands/dbcommands.c:1340 #: commands/dbcommands.c:1588 commands/dbcommands.c:1702 -#: commands/dbcommands.c:2142 utils/init/postinit.c:877 -#: utils/init/postinit.c:982 utils/init/postinit.c:999 +#: commands/dbcommands.c:2142 utils/init/postinit.c:887 +#: utils/init/postinit.c:992 utils/init/postinit.c:1009 #, c-format msgid "database \"%s\" does not exist" msgstr "база данных \"%s\" не существует" -#: commands/comment.c:101 commands/seclabel.c:117 parser/parse_utilcmd.c:973 +#: commands/comment.c:101 commands/seclabel.c:191 parser/parse_utilcmd.c:979 #, c-format msgid "" "\"%s\" is not a table, view, materialized view, composite type, or foreign " @@ -6591,12 +6855,12 @@ msgstr "" "\"%s\" - это не таблица, представление, мат. представление, составной тип " "или сторонняя таблица" -#: commands/constraint.c:63 utils/adt/ri_triggers.c:1923 +#: commands/constraint.c:63 utils/adt/ri_triggers.c:1948 #, c-format msgid "function \"%s\" was not called by trigger manager" msgstr "функция \"%s\" была вызвана не менеджером триггеров" -#: commands/constraint.c:70 utils/adt/ri_triggers.c:1932 +#: commands/constraint.c:70 utils/adt/ri_triggers.c:1957 #, c-format msgid "function \"%s\" must be fired AFTER ROW" msgstr "функция \"%s\" должна запускаться в триггере AFTER для строк" @@ -6606,68 +6870,35 @@ msgstr "функция \"%s\" должна запускаться в тригг msgid "function \"%s\" must be fired for INSERT or UPDATE" msgstr "функция \"%s\" должна запускаться для INSERT или UPDATE" -#: commands/conversioncmds.c:66 +#: commands/conversioncmds.c:67 #, c-format msgid "source encoding \"%s\" does not exist" msgstr "исходная кодировка \"%s\" не существует" -#: commands/conversioncmds.c:73 +#: commands/conversioncmds.c:74 #, c-format msgid "destination encoding \"%s\" does not exist" msgstr "целевая кодировка \"%s\" не существует" -#: commands/conversioncmds.c:86 +#: commands/conversioncmds.c:87 #, c-format msgid "encoding conversion to or from \"SQL_ASCII\" is not supported" msgstr "преобразование кодировки из/в \"SQL_ASCII\" не поддерживается" -#: commands/conversioncmds.c:99 +#: commands/conversioncmds.c:100 #, c-format msgid "encoding conversion function %s must return type %s" msgstr "функция преобразования кодировки %s должна возвращать тип %s" -#: commands/copy.c:426 commands/copy.c:460 -#, c-format -msgid "COPY BINARY is not supported to stdout or from stdin" -msgstr "COPY BINARY не поддерживает стандартный вывод (stdout) и ввод (stdin)" - -#: commands/copy.c:560 +#: commands/conversioncmds.c:130 #, c-format -msgid "could not write to COPY program: %m" -msgstr "не удалось записать в канал программы COPY: %m" - -#: commands/copy.c:565 -#, c-format -msgid "could not write to COPY file: %m" -msgstr "не удалось записать в файл COPY: %m" - -#: commands/copy.c:578 -#, c-format -msgid "connection lost during COPY to stdout" -msgstr "в процессе вывода данных COPY в stdout потеряно соединение" - -#: commands/copy.c:622 -#, c-format -msgid "could not read from COPY file: %m" -msgstr "не удалось прочитать файл COPY: %m" - -#: commands/copy.c:640 commands/copy.c:661 commands/copy.c:665 -#: tcop/postgres.c:344 tcop/postgres.c:380 tcop/postgres.c:407 -#, c-format -msgid "unexpected EOF on client connection with an open transaction" -msgstr "неожиданный обрыв соединения с клиентом при открытой транзакции" - -#: commands/copy.c:678 -#, c-format -msgid "COPY from stdin failed: %s" -msgstr "ошибка при вводе данных COPY из stdin: %s" - -#: commands/copy.c:694 -#, c-format -msgid "unexpected message type 0x%02X during COPY from stdin" -msgstr "неожиданный тип сообщения 0x%02X при вводе данных COPY из stdin" +msgid "" +"encoding conversion function %s returned incorrect result for empty input" +msgstr "" +"функция преобразования кодировки %s возвратила некорректный результат для " +"пустой строки" -#: commands/copy.c:861 +#: commands/copy.c:86 #, c-format msgid "" "must be superuser or a member of the pg_execute_server_program role to COPY " @@ -6676,7 +6907,7 @@ msgstr "" "для использования COPY с внешними программами нужно быть суперпользователем " "или членом роли pg_execute_server_program" -#: commands/copy.c:862 commands/copy.c:871 commands/copy.c:878 +#: commands/copy.c:87 commands/copy.c:96 commands/copy.c:103 #, c-format msgid "" "Anyone can COPY to stdout or from stdin. psql's \\copy command also works " @@ -6685,7 +6916,7 @@ msgstr "" "Не имея административных прав, можно использовать COPY с stdout и stdin (а " "также команду psql \\copy)." -#: commands/copy.c:870 +#: commands/copy.c:95 #, c-format msgid "" "must be superuser or a member of the pg_read_server_files role to COPY from " @@ -6694,7 +6925,7 @@ msgstr "" "для выполнения COPY с чтением файла нужно быть суперпользователем или членом " "роли pg_read_server_files" -#: commands/copy.c:877 +#: commands/copy.c:102 #, c-format msgid "" "must be superuser or a member of the pg_write_server_files role to COPY to a " @@ -6703,325 +6934,228 @@ msgstr "" "для выполнения COPY с записью в файл нужно быть суперпользователем или " "членом роли pg_write_server_files" -#: commands/copy.c:963 +#: commands/copy.c:188 #, c-format msgid "COPY FROM not supported with row-level security" msgstr "COPY FROM не поддерживается с защитой на уровне строк." -#: commands/copy.c:964 +#: commands/copy.c:189 #, c-format msgid "Use INSERT statements instead." msgstr "Используйте операторы INSERT." -#: commands/copy.c:1146 +#: commands/copy.c:374 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "формат \"%s\" для COPY не распознан" -#: commands/copy.c:1217 commands/copy.c:1233 commands/copy.c:1248 -#: commands/copy.c:1270 +#: commands/copy.c:447 commands/copy.c:463 commands/copy.c:478 +#: commands/copy.c:500 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "аргументом параметра \"%s\" должен быть список имён столбцов" -#: commands/copy.c:1285 +#: commands/copy.c:515 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "аргументом параметра \"%s\" должно быть название допустимой кодировки" -#: commands/copy.c:1292 commands/dbcommands.c:253 commands/dbcommands.c:1536 +#: commands/copy.c:522 commands/dbcommands.c:253 commands/dbcommands.c:1536 #, c-format msgid "option \"%s\" not recognized" msgstr "параметр \"%s\" не распознан" -#: commands/copy.c:1304 +#: commands/copy.c:534 #, c-format msgid "cannot specify DELIMITER in BINARY mode" msgstr "в режиме BINARY нельзя указывать DELIMITER" -#: commands/copy.c:1309 +#: commands/copy.c:539 #, c-format msgid "cannot specify NULL in BINARY mode" msgstr "в режиме BINARY нельзя указывать NULL" -#: commands/copy.c:1331 +#: commands/copy.c:561 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "разделитель для COPY должен быть однобайтным символом" -#: commands/copy.c:1338 +#: commands/copy.c:568 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "" "разделителем для COPY не может быть символ новой строки или возврата каретки" -#: commands/copy.c:1344 +#: commands/copy.c:574 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "" "представление NULL для COPY не может включать символ новой строки или " "возврата каретки" -#: commands/copy.c:1361 +#: commands/copy.c:591 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "\"%s\" не может быть разделителем для COPY" -#: commands/copy.c:1367 +#: commands/copy.c:597 #, c-format msgid "COPY HEADER available only in CSV mode" msgstr "COPY HEADER можно использовать только в режиме CSV" -#: commands/copy.c:1373 +#: commands/copy.c:603 #, c-format msgid "COPY quote available only in CSV mode" msgstr "определить кавычки для COPY можно только в режиме CSV" -#: commands/copy.c:1378 +#: commands/copy.c:608 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "символ кавычек для COPY должен быть однобайтным" -#: commands/copy.c:1383 +#: commands/copy.c:613 #, c-format msgid "COPY delimiter and quote must be different" msgstr "символ кавычек для COPY должен отличаться от разделителя" -#: commands/copy.c:1389 +#: commands/copy.c:619 #, c-format msgid "COPY escape available only in CSV mode" msgstr "определить спецсимвол для COPY можно только в режиме CSV" -#: commands/copy.c:1394 +#: commands/copy.c:624 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "спецсимвол для COPY должен быть однобайтным" -#: commands/copy.c:1400 +#: commands/copy.c:630 #, c-format msgid "COPY force quote available only in CSV mode" msgstr "параметр force quote для COPY можно использовать только в режиме CSV" -#: commands/copy.c:1404 +#: commands/copy.c:634 #, c-format msgid "COPY force quote only available using COPY TO" msgstr "параметр force quote для COPY можно использовать только с COPY TO" -#: commands/copy.c:1410 +#: commands/copy.c:640 #, c-format msgid "COPY force not null available only in CSV mode" msgstr "" "параметр force not null для COPY можно использовать только в режиме CSV" -#: commands/copy.c:1414 +#: commands/copy.c:644 #, c-format msgid "COPY force not null only available using COPY FROM" msgstr "параметр force not null для COPY можно использовать только с COPY FROM" -#: commands/copy.c:1420 +#: commands/copy.c:650 #, c-format msgid "COPY force null available only in CSV mode" msgstr "параметр force null для COPY можно использовать только в режиме CSV" -#: commands/copy.c:1425 +#: commands/copy.c:655 #, c-format msgid "COPY force null only available using COPY FROM" msgstr "параметр force null для COPY можно использовать только с COPY FROM" -#: commands/copy.c:1431 +#: commands/copy.c:661 #, c-format msgid "COPY delimiter must not appear in the NULL specification" msgstr "разделитель для COPY не должен присутствовать в представлении NULL" -#: commands/copy.c:1438 +#: commands/copy.c:668 #, c-format msgid "CSV quote character must not appear in the NULL specification" msgstr "символ кавычек в CSV не должен присутствовать в представлении NULL" -#: commands/copy.c:1524 -#, c-format -msgid "DO INSTEAD NOTHING rules are not supported for COPY" -msgstr "правила DO INSTEAD NOTHING не поддерживаются с COPY" - -#: commands/copy.c:1538 -#, c-format -msgid "conditional DO INSTEAD rules are not supported for COPY" -msgstr "условные правила DO INSTEAD не поддерживаются с COPY" - -#: commands/copy.c:1542 -#, c-format -msgid "DO ALSO rules are not supported for the COPY" -msgstr "правила DO ALSO не поддерживаются с COPY" - -#: commands/copy.c:1547 -#, c-format -msgid "multi-statement DO INSTEAD rules are not supported for COPY" -msgstr "составные правила DO INSTEAD не поддерживаются с COPY" - -#: commands/copy.c:1557 -#, c-format -msgid "COPY (SELECT INTO) is not supported" -msgstr "COPY (SELECT INTO) не поддерживается" - -#: commands/copy.c:1574 +#: commands/copy.c:729 #, c-format -msgid "COPY query must have a RETURNING clause" -msgstr "в запросе COPY должно быть предложение RETURNING" - -#: commands/copy.c:1603 -#, c-format -msgid "relation referenced by COPY statement has changed" -msgstr "отношение, задействованное в операторе COPY, изменилось" - -#: commands/copy.c:1662 -#, c-format -msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" -msgstr "столбец FORCE_QUOTE \"%s\" не фигурирует в COPY" - -#: commands/copy.c:1685 -#, c-format -msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" -msgstr "столбец FORCE_NOT_NULL \"%s\" не фигурирует в COPY" - -#: commands/copy.c:1708 -#, c-format -msgid "FORCE_NULL column \"%s\" not referenced by COPY" -msgstr "столбец FORCE_NULL \"%s\" не фигурирует в COPY" - -#: commands/copy.c:1774 libpq/be-secure-common.c:105 -#, c-format -msgid "could not close pipe to external command: %m" -msgstr "не удалось закрыть канал сообщений с внешней командой: %m" - -#: commands/copy.c:1789 -#, c-format -msgid "program \"%s\" failed" -msgstr "сбой программы \"%s\"" - -#: commands/copy.c:1840 -#, c-format -msgid "cannot copy from view \"%s\"" -msgstr "копировать из представления \"%s\" нельзя" - -#: commands/copy.c:1842 commands/copy.c:1848 commands/copy.c:1854 -#: commands/copy.c:1865 -#, c-format -msgid "Try the COPY (SELECT ...) TO variant." -msgstr "Попробуйте вариацию COPY (SELECT ...) TO." - -#: commands/copy.c:1846 -#, c-format -msgid "cannot copy from materialized view \"%s\"" -msgstr "копировать из материализованного представления \"%s\" нельзя" - -#: commands/copy.c:1852 -#, c-format -msgid "cannot copy from foreign table \"%s\"" -msgstr "копировать из сторонней таблицы \"%s\" нельзя" - -#: commands/copy.c:1858 -#, c-format -msgid "cannot copy from sequence \"%s\"" -msgstr "копировать из последовательности \"%s\" нельзя" - -#: commands/copy.c:1863 -#, c-format -msgid "cannot copy from partitioned table \"%s\"" -msgstr "копировать из секционированной таблицы \"%s\" нельзя" - -#: commands/copy.c:1869 -#, c-format -msgid "cannot copy from non-table relation \"%s\"" -msgstr "копировать из отношения \"%s\", не являющегося таблицей, нельзя" - -#: commands/copy.c:1909 -#, c-format -msgid "relative path not allowed for COPY to file" -msgstr "при выполнении COPY в файл нельзя указывать относительный путь" +msgid "column \"%s\" is a generated column" +msgstr "столбец \"%s\" — генерируемый" -#: commands/copy.c:1928 +#: commands/copy.c:731 #, c-format -msgid "could not open file \"%s\" for writing: %m" -msgstr "не удалось открыть файл \"%s\" для записи: %m" +msgid "Generated columns cannot be used in COPY." +msgstr "Генерируемые столбцы нельзя использовать в COPY." -#: commands/copy.c:1931 +#: commands/copy.c:746 commands/indexcmds.c:1754 commands/statscmds.c:241 +#: commands/tablecmds.c:2321 commands/tablecmds.c:2977 +#: commands/tablecmds.c:3470 parser/parse_relation.c:3593 +#: parser/parse_relation.c:3613 utils/adt/tsvector_op.c:2680 #, c-format -msgid "" -"COPY TO instructs the PostgreSQL server process to write a file. You may " -"want a client-side facility such as psql's \\copy." -msgstr "" -"COPY TO указывает серверному процессу PostgreSQL записать данные в файл. " -"Возможно, на самом деле вам нужно клиентское средство, например, \\copy в " -"psql." +msgid "column \"%s\" does not exist" +msgstr "столбец \"%s\" не существует" -#: commands/copy.c:1944 commands/copy.c:3511 +#: commands/copy.c:753 commands/tablecmds.c:2347 commands/trigger.c:951 +#: parser/parse_target.c:1079 parser/parse_target.c:1090 #, c-format -msgid "\"%s\" is a directory" -msgstr "\"%s\" - это каталог" +msgid "column \"%s\" specified more than once" +msgstr "столбец \"%s\" указан неоднократно" -#: commands/copy.c:2246 +#: commands/copyfrom.c:127 #, c-format msgid "COPY %s, line %s, column %s" msgstr "COPY %s, строка %s, столбец %s" -#: commands/copy.c:2250 commands/copy.c:2297 +#: commands/copyfrom.c:131 commands/copyfrom.c:172 #, c-format msgid "COPY %s, line %s" msgstr "COPY %s, строка %s" -#: commands/copy.c:2261 +#: commands/copyfrom.c:142 #, c-format msgid "COPY %s, line %s, column %s: \"%s\"" msgstr "COPY %s, строка %s, столбец %s: \"%s\"" -#: commands/copy.c:2269 +#: commands/copyfrom.c:150 #, c-format msgid "COPY %s, line %s, column %s: null input" msgstr "COPY %s, строка %s, столбец %s: значение NULL" -#: commands/copy.c:2291 +#: commands/copyfrom.c:166 #, c-format msgid "COPY %s, line %s: \"%s\"" msgstr "COPY %s, строка %s: \"%s\"" -#: commands/copy.c:2692 +#: commands/copyfrom.c:566 #, c-format msgid "cannot copy to view \"%s\"" msgstr "копировать в представление \"%s\" нельзя" -#: commands/copy.c:2694 +#: commands/copyfrom.c:568 #, c-format msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." msgstr "" "Чтобы представление допускало копирование данных в него, установите триггер " "INSTEAD OF INSERT." -#: commands/copy.c:2698 +#: commands/copyfrom.c:572 #, c-format msgid "cannot copy to materialized view \"%s\"" msgstr "копировать в материализованное представление \"%s\" нельзя" -#: commands/copy.c:2703 +#: commands/copyfrom.c:577 #, c-format msgid "cannot copy to sequence \"%s\"" msgstr "копировать в последовательность \"%s\" нельзя" -#: commands/copy.c:2708 +#: commands/copyfrom.c:582 #, c-format msgid "cannot copy to non-table relation \"%s\"" msgstr "копировать в отношение \"%s\", не являющееся таблицей, нельзя" -#: commands/copy.c:2748 +#: commands/copyfrom.c:622 #, c-format msgid "cannot perform COPY FREEZE on a partitioned table" msgstr "выполнить COPY FREEZE в секционированной таблице нельзя" -#: commands/copy.c:2763 +#: commands/copyfrom.c:637 #, c-format msgid "cannot perform COPY FREEZE because of prior transaction activity" msgstr "выполнить COPY FREEZE нельзя из-за предыдущей активности в транзакции" -#: commands/copy.c:2769 +#: commands/copyfrom.c:643 #, c-format msgid "" "cannot perform COPY FREEZE because the table was not created or truncated in " @@ -7030,7 +7164,17 @@ msgstr "" "выполнить COPY FREEZE нельзя, так как таблица не была создана или усечена в " "текущей подтранзакции" -#: commands/copy.c:3498 +#: commands/copyfrom.c:1264 commands/copyto.c:612 +#, c-format +msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" +msgstr "столбец FORCE_NOT_NULL \"%s\" не фигурирует в COPY" + +#: commands/copyfrom.c:1287 commands/copyto.c:635 +#, c-format +msgid "FORCE_NULL column \"%s\" not referenced by COPY" +msgstr "столбец FORCE_NULL \"%s\" не фигурирует в COPY" + +#: commands/copyfrom.c:1519 #, c-format msgid "" "COPY FROM instructs the PostgreSQL server process to read a file. You may " @@ -7040,156 +7184,275 @@ msgstr "" "файла. Возможно, на самом деле вам нужно клиентское средство, например, " "\\copy в psql." -#: commands/copy.c:3526 +#: commands/copyfrom.c:1532 commands/copyto.c:732 +#, c-format +msgid "\"%s\" is a directory" +msgstr "\"%s\" - это каталог" + +#: commands/copyfrom.c:1600 commands/copyto.c:302 libpq/be-secure-common.c:105 +#, c-format +msgid "could not close pipe to external command: %m" +msgstr "не удалось закрыть канал сообщений с внешней командой: %m" + +#: commands/copyfrom.c:1615 commands/copyto.c:307 +#, c-format +msgid "program \"%s\" failed" +msgstr "сбой программы \"%s\"" + +#: commands/copyfromparse.c:199 #, c-format msgid "COPY file signature not recognized" msgstr "подпись COPY-файла не распознана" -#: commands/copy.c:3531 +#: commands/copyfromparse.c:204 #, c-format msgid "invalid COPY file header (missing flags)" msgstr "неверный заголовок файла COPY (отсутствуют флаги)" -#: commands/copy.c:3535 +#: commands/copyfromparse.c:208 #, c-format msgid "invalid COPY file header (WITH OIDS)" msgstr "неверный заголовок файла COPY (WITH OIDS)" -#: commands/copy.c:3540 +#: commands/copyfromparse.c:213 #, c-format msgid "unrecognized critical flags in COPY file header" msgstr "не распознаны важные флаги в заголовке файла COPY" -#: commands/copy.c:3546 +#: commands/copyfromparse.c:219 #, c-format msgid "invalid COPY file header (missing length)" msgstr "неверный заголовок файла COPY (отсутствует длина)" -#: commands/copy.c:3553 +#: commands/copyfromparse.c:226 #, c-format msgid "invalid COPY file header (wrong length)" msgstr "неверный заголовок файла COPY (неправильная длина)" -#: commands/copy.c:3671 commands/copy.c:4344 commands/copy.c:4574 +#: commands/copyfromparse.c:255 +#, c-format +msgid "could not read from COPY file: %m" +msgstr "не удалось прочитать файл COPY: %m" + +#: commands/copyfromparse.c:277 commands/copyfromparse.c:302 +#: tcop/postgres.c:360 +#, c-format +msgid "unexpected EOF on client connection with an open transaction" +msgstr "неожиданный обрыв соединения с клиентом при открытой транзакции" + +#: commands/copyfromparse.c:293 +#, c-format +msgid "unexpected message type 0x%02X during COPY from stdin" +msgstr "неожиданный тип сообщения 0x%02X при вводе данных COPY из stdin" + +#: commands/copyfromparse.c:316 +#, c-format +msgid "COPY from stdin failed: %s" +msgstr "ошибка при вводе данных COPY из stdin: %s" + +#: commands/copyfromparse.c:841 commands/copyfromparse.c:1451 +#: commands/copyfromparse.c:1681 #, c-format msgid "extra data after last expected column" msgstr "лишние данные после содержимого последнего столбца" -#: commands/copy.c:3685 +#: commands/copyfromparse.c:855 #, c-format msgid "missing data for column \"%s\"" msgstr "нет данных для столбца \"%s\"" -#: commands/copy.c:3768 +#: commands/copyfromparse.c:933 #, c-format msgid "received copy data after EOF marker" msgstr "после маркера конца файла продолжаются данные COPY" -#: commands/copy.c:3775 +#: commands/copyfromparse.c:940 #, c-format msgid "row field count is %d, expected %d" msgstr "количество полей в строке: %d, ожидалось: %d" -#: commands/copy.c:4095 commands/copy.c:4112 +#: commands/copyfromparse.c:1233 commands/copyfromparse.c:1250 #, c-format msgid "literal carriage return found in data" msgstr "в данных обнаружен явный возврат каретки" -#: commands/copy.c:4096 commands/copy.c:4113 +#: commands/copyfromparse.c:1234 commands/copyfromparse.c:1251 #, c-format msgid "unquoted carriage return found in data" msgstr "в данных обнаружен возврат каретки не в кавычках" -#: commands/copy.c:4098 commands/copy.c:4115 +#: commands/copyfromparse.c:1236 commands/copyfromparse.c:1253 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "Представьте возврат каретки как \"\\r\"." -#: commands/copy.c:4099 commands/copy.c:4116 +#: commands/copyfromparse.c:1237 commands/copyfromparse.c:1254 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "Заключите возврат каретки в кавычки CSV." -#: commands/copy.c:4128 +#: commands/copyfromparse.c:1266 #, c-format msgid "literal newline found in data" msgstr "в данных обнаружен явный символ новой строки" -#: commands/copy.c:4129 +#: commands/copyfromparse.c:1267 #, c-format msgid "unquoted newline found in data" msgstr "в данных обнаружен явный символ новой строки не в кавычках" -#: commands/copy.c:4131 +#: commands/copyfromparse.c:1269 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "Представьте символ новой строки как \"\\n\"." -#: commands/copy.c:4132 +#: commands/copyfromparse.c:1270 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "Заключите символ новой строки в кавычки CSV." -#: commands/copy.c:4178 commands/copy.c:4214 +#: commands/copyfromparse.c:1316 commands/copyfromparse.c:1352 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "маркер \"конец копии\" не соответствует предыдущему стилю новой строки" -#: commands/copy.c:4187 commands/copy.c:4203 +#: commands/copyfromparse.c:1325 commands/copyfromparse.c:1341 #, c-format msgid "end-of-copy marker corrupt" msgstr "маркер \"конец копии\" испорчен" -#: commands/copy.c:4658 +#: commands/copyfromparse.c:1765 #, c-format msgid "unterminated CSV quoted field" msgstr "незавершённое поле в кавычках CSV" -#: commands/copy.c:4735 commands/copy.c:4754 +#: commands/copyfromparse.c:1841 commands/copyfromparse.c:1860 #, c-format msgid "unexpected EOF in COPY data" msgstr "неожиданный конец данных COPY" -#: commands/copy.c:4744 +#: commands/copyfromparse.c:1850 #, c-format msgid "invalid field size" msgstr "неверный размер поля" -#: commands/copy.c:4767 +#: commands/copyfromparse.c:1873 #, c-format msgid "incorrect binary data format" msgstr "неверный двоичный формат данных" -#: commands/copy.c:5075 +#: commands/copyto.c:235 #, c-format -msgid "column \"%s\" is a generated column" -msgstr "столбец \"%s\" — генерируемый" +msgid "could not write to COPY program: %m" +msgstr "не удалось записать в канал программы COPY: %m" -#: commands/copy.c:5077 +#: commands/copyto.c:240 #, c-format -msgid "Generated columns cannot be used in COPY." -msgstr "Генерируемые столбцы нельзя использовать в COPY." +msgid "could not write to COPY file: %m" +msgstr "не удалось записать в файл COPY: %m" -#: commands/copy.c:5092 commands/indexcmds.c:1701 commands/statscmds.c:224 -#: commands/tablecmds.c:2176 commands/tablecmds.c:2795 -#: commands/tablecmds.c:3182 parser/parse_relation.c:3507 -#: parser/parse_relation.c:3527 utils/adt/tsvector_op.c:2668 +#: commands/copyto.c:370 #, c-format -msgid "column \"%s\" does not exist" -msgstr "столбец \"%s\" не существует" +msgid "cannot copy from view \"%s\"" +msgstr "копировать из представления \"%s\" нельзя" -#: commands/copy.c:5099 commands/tablecmds.c:2202 commands/trigger.c:885 -#: parser/parse_target.c:1052 parser/parse_target.c:1063 +#: commands/copyto.c:372 commands/copyto.c:378 commands/copyto.c:384 +#: commands/copyto.c:395 #, c-format -msgid "column \"%s\" specified more than once" -msgstr "столбец \"%s\" указан неоднократно" +msgid "Try the COPY (SELECT ...) TO variant." +msgstr "Попробуйте вариацию COPY (SELECT ...) TO." + +#: commands/copyto.c:376 +#, c-format +msgid "cannot copy from materialized view \"%s\"" +msgstr "копировать из материализованного представления \"%s\" нельзя" + +#: commands/copyto.c:382 +#, c-format +msgid "cannot copy from foreign table \"%s\"" +msgstr "копировать из сторонней таблицы \"%s\" нельзя" + +#: commands/copyto.c:388 +#, c-format +msgid "cannot copy from sequence \"%s\"" +msgstr "копировать из последовательности \"%s\" нельзя" + +#: commands/copyto.c:393 +#, c-format +msgid "cannot copy from partitioned table \"%s\"" +msgstr "копировать из секционированной таблицы \"%s\" нельзя" + +#: commands/copyto.c:399 +#, c-format +msgid "cannot copy from non-table relation \"%s\"" +msgstr "копировать из отношения \"%s\", не являющегося таблицей, нельзя" + +#: commands/copyto.c:451 +#, c-format +msgid "DO INSTEAD NOTHING rules are not supported for COPY" +msgstr "правила DO INSTEAD NOTHING не поддерживаются с COPY" + +#: commands/copyto.c:465 +#, c-format +msgid "conditional DO INSTEAD rules are not supported for COPY" +msgstr "условные правила DO INSTEAD не поддерживаются с COPY" + +#: commands/copyto.c:469 +#, c-format +msgid "DO ALSO rules are not supported for the COPY" +msgstr "правила DO ALSO не поддерживаются с COPY" + +#: commands/copyto.c:474 +#, c-format +msgid "multi-statement DO INSTEAD rules are not supported for COPY" +msgstr "составные правила DO INSTEAD не поддерживаются с COPY" + +#: commands/copyto.c:484 +#, c-format +msgid "COPY (SELECT INTO) is not supported" +msgstr "COPY (SELECT INTO) не поддерживается" + +#: commands/copyto.c:501 +#, c-format +msgid "COPY query must have a RETURNING clause" +msgstr "в запросе COPY должно быть предложение RETURNING" + +#: commands/copyto.c:530 +#, c-format +msgid "relation referenced by COPY statement has changed" +msgstr "отношение, задействованное в операторе COPY, изменилось" + +#: commands/copyto.c:589 +#, c-format +msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" +msgstr "столбец FORCE_QUOTE \"%s\" не фигурирует в COPY" + +#: commands/copyto.c:697 +#, c-format +msgid "relative path not allowed for COPY to file" +msgstr "при выполнении COPY в файл нельзя указывать относительный путь" + +#: commands/copyto.c:716 +#, c-format +msgid "could not open file \"%s\" for writing: %m" +msgstr "не удалось открыть файл \"%s\" для записи: %m" + +#: commands/copyto.c:719 +#, c-format +msgid "" +"COPY TO instructs the PostgreSQL server process to write a file. You may " +"want a client-side facility such as psql's \\copy." +msgstr "" +"COPY TO указывает серверному процессу PostgreSQL записать данные в файл. " +"Возможно, на самом деле вам нужно клиентское средство, например, \\copy в " +"psql." -#: commands/createas.c:215 commands/createas.c:497 +#: commands/createas.c:215 commands/createas.c:511 #, c-format msgid "too many column names were specified" msgstr "указано слишком много имён столбцов" -#: commands/createas.c:539 +#: commands/createas.c:534 #, c-format msgid "policies not yet implemented for this command" msgstr "политики для этой команды ещё не реализованы" @@ -7429,7 +7692,6 @@ msgstr "" #: commands/dbcommands.c:1404 commands/dbcommands.c:1980 #: commands/dbcommands.c:2203 commands/dbcommands.c:2261 -#: commands/tablespace.c:631 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "в старом каталоге базы данных \"%s\" могли остаться ненужные файлы" @@ -7471,7 +7733,7 @@ msgstr[0] "Эта база данных используется ещё в %d с msgstr[1] "Эта база данных используется ещё в %d сеансах." msgstr[2] "Эта база данных используется ещё в %d сеансах." -#: commands/dbcommands.c:2094 storage/ipc/procarray.c:3023 +#: commands/dbcommands.c:2094 storage/ipc/procarray.c:3809 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." @@ -7516,8 +7778,8 @@ msgstr "аргументом %s должно быть имя типа" msgid "invalid argument for %s: \"%s\"" msgstr "неверный аргумент для %s: \"%s\"" -#: commands/dropcmds.c:100 commands/functioncmds.c:1274 -#: utils/adt/ruleutils.c:2633 +#: commands/dropcmds.c:100 commands/functioncmds.c:1411 +#: utils/adt/ruleutils.c:2810 #, c-format msgid "\"%s\" is an aggregate function" msgstr "функция \"%s\" является агрегатной" @@ -7527,19 +7789,19 @@ msgstr "функция \"%s\" является агрегатной" msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "Используйте DROP AGGREGATE для удаления агрегатных функций." -#: commands/dropcmds.c:158 commands/sequence.c:447 commands/tablecmds.c:3266 -#: commands/tablecmds.c:3424 commands/tablecmds.c:3469 -#: commands/tablecmds.c:15060 tcop/utility.c:1307 +#: commands/dropcmds.c:158 commands/sequence.c:447 commands/tablecmds.c:3554 +#: commands/tablecmds.c:3712 commands/tablecmds.c:3765 +#: commands/tablecmds.c:15841 tcop/utility.c:1324 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "отношение \"%s\" не существует, пропускается" -#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1199 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1247 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "схема \"%s\" не существует, пропускается" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:259 +#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:272 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "тип \"%s\" не существует, пропускается" @@ -7559,7 +7821,7 @@ msgstr "правило сортировки \"%s\" не существует, п msgid "conversion \"%s\" does not exist, skipping" msgstr "преобразование \"%s\" не существует, пропускается" -#: commands/dropcmds.c:293 commands/statscmds.c:486 +#: commands/dropcmds.c:293 commands/statscmds.c:670 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "объект статистики \"%s\" не существует, пропускается" @@ -7654,7 +7916,7 @@ msgstr "правило \"%s\" для отношения \"%s\" не сущест msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "обёртка сторонних данных \"%s\" не существует, пропускается" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1399 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1351 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "сервер \"%s\" не существует, пропускается" @@ -7714,58 +7976,58 @@ msgstr "для %s событийные триггеры не поддержив msgid "filter variable \"%s\" specified more than once" msgstr "переменная фильтра \"%s\" указана больше одного раза" -#: commands/event_trigger.c:399 commands/event_trigger.c:443 -#: commands/event_trigger.c:537 +#: commands/event_trigger.c:377 commands/event_trigger.c:421 +#: commands/event_trigger.c:515 #, c-format msgid "event trigger \"%s\" does not exist" msgstr "событийный триггер \"%s\" не существует" -#: commands/event_trigger.c:505 +#: commands/event_trigger.c:483 #, c-format msgid "permission denied to change owner of event trigger \"%s\"" msgstr "нет прав на изменение владельца событийного триггера \"%s\"" -#: commands/event_trigger.c:507 +#: commands/event_trigger.c:485 #, c-format msgid "The owner of an event trigger must be a superuser." msgstr "Владельцем событийного триггера должен быть суперпользователь." -#: commands/event_trigger.c:1325 +#: commands/event_trigger.c:1304 #, c-format msgid "%s can only be called in a sql_drop event trigger function" msgstr "%s можно вызывать только в событийной триггерной функции sql_drop" -#: commands/event_trigger.c:1445 commands/event_trigger.c:1466 +#: commands/event_trigger.c:1424 commands/event_trigger.c:1445 #, c-format msgid "%s can only be called in a table_rewrite event trigger function" msgstr "%s можно вызывать только в событийной триггерной функции table_rewrite" -#: commands/event_trigger.c:1883 +#: commands/event_trigger.c:1862 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s можно вызывать только в событийной триггерной функции" -#: commands/explain.c:213 +#: commands/explain.c:218 #, c-format msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" msgstr "нераспознанное значение параметра EXPLAIN \"%s\": \"%s\"" -#: commands/explain.c:220 +#: commands/explain.c:225 #, c-format msgid "unrecognized EXPLAIN option \"%s\"" msgstr "нераспознанный параметр EXPLAIN: \"%s\"" -#: commands/explain.c:228 +#: commands/explain.c:233 #, c-format msgid "EXPLAIN option WAL requires ANALYZE" msgstr "параметр WAL оператора EXPLAIN требует указания ANALYZE" -#: commands/explain.c:237 +#: commands/explain.c:242 #, c-format msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "параметр TIMING оператора EXPLAIN требует указания ANALYZE" -#: commands/extension.c:173 commands/extension.c:3013 +#: commands/extension.c:173 commands/extension.c:3014 #, c-format msgid "extension \"%s\" does not exist" msgstr "расширение \"%s\" не существует" @@ -7835,7 +8097,7 @@ msgstr "" "параметр \"%s\" нельзя задавать в дополнительном управляющем файле расширения" #: commands/extension.c:552 commands/extension.c:560 commands/extension.c:568 -#: utils/misc/guc.c:6749 +#: utils/misc/guc.c:7093 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "параметр \"%s\" требует логическое значение" @@ -7843,7 +8105,7 @@ msgstr "параметр \"%s\" требует логическое значен #: commands/extension.c:577 #, c-format msgid "\"%s\" is not a valid encoding name" -msgstr "неверное имя кодировки %s" +msgstr "\"%s\" не является верным названием кодировки" #: commands/extension.c:591 #, c-format @@ -7867,40 +8129,40 @@ msgid "" "transaction control statements are not allowed within an extension script" msgstr "в скрипте расширения не должно быть операторов управления транзакциями" -#: commands/extension.c:861 +#: commands/extension.c:862 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "нет прав на создание расширения \"%s\"" -#: commands/extension.c:864 +#: commands/extension.c:865 #, c-format msgid "" "Must have CREATE privilege on current database to create this extension." msgstr "Для создания этого расширения нужно иметь право CREATE в текущей базе." -#: commands/extension.c:865 +#: commands/extension.c:866 #, c-format msgid "Must be superuser to create this extension." msgstr "Для создания этого расширения нужно быть суперпользователем." -#: commands/extension.c:869 +#: commands/extension.c:870 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "нет прав на изменение расширения \"%s\"" -#: commands/extension.c:872 +#: commands/extension.c:873 #, c-format msgid "" "Must have CREATE privilege on current database to update this extension." msgstr "" "Для обновления этого расширения нужно иметь право CREATE в текущей базе." -#: commands/extension.c:873 +#: commands/extension.c:874 #, c-format msgid "Must be superuser to update this extension." msgstr "Для изменения этого расширения нужно быть суперпользователем." -#: commands/extension.c:1200 +#: commands/extension.c:1201 #, c-format msgid "" "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" @@ -7908,12 +8170,12 @@ msgstr "" "для расширения \"%s\" не определён путь обновления с версии \"%s\" до версии " "\"%s\"" -#: commands/extension.c:1408 commands/extension.c:3074 +#: commands/extension.c:1409 commands/extension.c:3075 #, c-format msgid "version to install must be specified" msgstr "нужно указать версию для установки" -#: commands/extension.c:1445 +#: commands/extension.c:1446 #, c-format msgid "" "extension \"%s\" has no installation script nor update path for version \"%s" @@ -7922,71 +8184,71 @@ msgstr "" "для расширения \"%s\" не определён путь установки или обновления для версии " "\"%s\"" -#: commands/extension.c:1479 +#: commands/extension.c:1480 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "расширение \"%s\" должно устанавливаться в схему \"%s\"" -#: commands/extension.c:1639 +#: commands/extension.c:1640 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "выявлена циклическая зависимость между расширениями \"%s\" и \"%s\"" -#: commands/extension.c:1644 +#: commands/extension.c:1645 #, c-format msgid "installing required extension \"%s\"" msgstr "установка требуемого расширения \"%s\"" -#: commands/extension.c:1667 +#: commands/extension.c:1668 #, c-format msgid "required extension \"%s\" is not installed" msgstr "требуемое расширение \"%s\" не установлено" -#: commands/extension.c:1670 +#: commands/extension.c:1671 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "" "Выполните CREATE EXTENSION ... CASCADE, чтобы установить также требуемые " "расширения." -#: commands/extension.c:1705 +#: commands/extension.c:1706 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "расширение \"%s\" уже существует, пропускается" -#: commands/extension.c:1712 +#: commands/extension.c:1713 #, c-format msgid "extension \"%s\" already exists" msgstr "расширение \"%s\" уже существует" -#: commands/extension.c:1723 +#: commands/extension.c:1724 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "вложенные операторы CREATE EXTENSION не поддерживаются" -#: commands/extension.c:1896 +#: commands/extension.c:1897 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "удалить расширение \"%s\" нельзя, так как это модифицируемый объект" -#: commands/extension.c:2457 +#: commands/extension.c:2458 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "" "%s можно вызывать только из SQL-скрипта, запускаемого командой CREATE " "EXTENSION" -#: commands/extension.c:2469 +#: commands/extension.c:2470 #, c-format msgid "OID %u does not refer to a table" msgstr "OID %u не относится к таблице" -#: commands/extension.c:2474 +#: commands/extension.c:2475 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "таблица \"%s\" не относится к созданному расширению" -#: commands/extension.c:2828 +#: commands/extension.c:2829 #, c-format msgid "" "cannot move extension \"%s\" into schema \"%s\" because the extension " @@ -7995,27 +8257,32 @@ msgstr "" "переместить расширение \"%s\" в схему \"%s\" нельзя, так как оно содержит " "схему" -#: commands/extension.c:2869 commands/extension.c:2932 +#: commands/extension.c:2870 commands/extension.c:2933 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "расширение \"%s\" не поддерживает SET SCHEMA" -#: commands/extension.c:2934 +#: commands/extension.c:2935 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "объект %s не принадлежит схеме расширения \"%s\"" -#: commands/extension.c:2993 +#: commands/extension.c:2994 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "вложенные операторы ALTER EXTENSION не поддерживаются" -#: commands/extension.c:3085 +#: commands/extension.c:3086 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "версия \"%s\" расширения \"%s\" уже установлена" -#: commands/extension.c:3336 +#: commands/extension.c:3298 +#, c-format +msgid "cannot add an object of this type to an extension" +msgstr "добавить объект этого типа к расширению нельзя" + +#: commands/extension.c:3364 #, c-format msgid "" "cannot add schema \"%s\" to extension \"%s\" because the schema contains the " @@ -8024,12 +8291,12 @@ msgstr "" "добавить схему \"%s\" к расширению \"%s\" нельзя, так как схема содержит " "расширение" -#: commands/extension.c:3364 +#: commands/extension.c:3392 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s не относится к расширению \"%s\"" -#: commands/extension.c:3430 +#: commands/extension.c:3458 #, c-format msgid "file \"%s\" is too large" msgstr "файл \"%s\" слишком большой" @@ -8103,253 +8370,280 @@ msgstr "" "при изменении функции проверки в обёртке сторонних данных параметры " "зависимых объектов могут стать неверными" -#: commands/foreigncmds.c:895 +#: commands/foreigncmds.c:871 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "сервер \"%s\" уже существует, пропускается" -#: commands/foreigncmds.c:1183 +#: commands/foreigncmds.c:1135 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "" "сопоставление пользователя \"%s\" для сервера \"%s\" уже существует, " "пропускается" -#: commands/foreigncmds.c:1193 +#: commands/foreigncmds.c:1145 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "сопоставление пользователя \"%s\" для сервера \"%s\" уже существует" -#: commands/foreigncmds.c:1293 commands/foreigncmds.c:1413 +#: commands/foreigncmds.c:1245 commands/foreigncmds.c:1365 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "сопоставление пользователя \"%s\" для сервера \"%s\" не существует" -#: commands/foreigncmds.c:1418 +#: commands/foreigncmds.c:1370 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "" "сопоставление пользователя \"%s\" для сервера \"%s\" не существует, " "пропускается" -#: commands/foreigncmds.c:1569 foreign/foreign.c:389 +#: commands/foreigncmds.c:1498 foreign/foreign.c:389 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "обёртка сторонних данных \"%s\" не имеет обработчика" -#: commands/foreigncmds.c:1575 +#: commands/foreigncmds.c:1504 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "обёртка сторонних данных \"%s\" не поддерживает IMPORT FOREIGN SCHEMA" -#: commands/foreigncmds.c:1678 +#: commands/foreigncmds.c:1606 #, c-format msgid "importing foreign table \"%s\"" msgstr "импорт сторонней таблицы \"%s\"" -#: commands/functioncmds.c:104 +#: commands/functioncmds.c:109 #, c-format msgid "SQL function cannot return shell type %s" msgstr "SQL-функция не может возвращать тип-пустышку %s" -#: commands/functioncmds.c:109 +#: commands/functioncmds.c:114 #, c-format msgid "return type %s is only a shell" msgstr "возвращаемый тип %s - лишь пустышка" -#: commands/functioncmds.c:139 parser/parse_type.c:354 +#: commands/functioncmds.c:144 parser/parse_type.c:354 #, c-format msgid "type modifier cannot be specified for shell type \"%s\"" msgstr "для типа-пустышки \"%s\" нельзя указать модификатор типа" -#: commands/functioncmds.c:145 +#: commands/functioncmds.c:150 #, c-format msgid "type \"%s\" is not yet defined" msgstr "тип \"%s\" ещё не определён" -#: commands/functioncmds.c:146 +#: commands/functioncmds.c:151 #, c-format msgid "Creating a shell type definition." msgstr "Создание определения типа-пустышки." -#: commands/functioncmds.c:238 +#: commands/functioncmds.c:250 #, c-format msgid "SQL function cannot accept shell type %s" msgstr "SQL-функция не может принимать значение типа-пустышки %s" -#: commands/functioncmds.c:244 +#: commands/functioncmds.c:256 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "агрегатная функция не может принимать значение типа-пустышки %s" -#: commands/functioncmds.c:249 +#: commands/functioncmds.c:261 #, c-format msgid "argument type %s is only a shell" msgstr "тип аргумента %s - лишь пустышка" -#: commands/functioncmds.c:259 +#: commands/functioncmds.c:271 #, c-format msgid "type %s does not exist" msgstr "тип %s не существует" -#: commands/functioncmds.c:273 +#: commands/functioncmds.c:285 #, c-format msgid "aggregates cannot accept set arguments" msgstr "агрегатные функции не принимают в аргументах множества" -#: commands/functioncmds.c:277 +#: commands/functioncmds.c:289 #, c-format msgid "procedures cannot accept set arguments" msgstr "процедуры не принимают в аргументах множества" -#: commands/functioncmds.c:281 +#: commands/functioncmds.c:293 #, c-format msgid "functions cannot accept set arguments" msgstr "функции не принимают аргументы-множества" -#: commands/functioncmds.c:289 -#, c-format -msgid "procedures cannot have OUT arguments" -msgstr "у процедур не может быть аргументов OUT" - -#: commands/functioncmds.c:290 -#, c-format -msgid "INOUT arguments are permitted." -msgstr "Аргументы INOUT допускаются." - -#: commands/functioncmds.c:300 +#: commands/functioncmds.c:303 #, c-format msgid "VARIADIC parameter must be the last input parameter" msgstr "параметр VARIADIC должен быть последним в списке входных параметров" -#: commands/functioncmds.c:331 +#: commands/functioncmds.c:323 +#, c-format +msgid "VARIADIC parameter must be the last parameter" +msgstr "параметр VARIADIC должен быть последним в списке параметров" + +#: commands/functioncmds.c:348 #, c-format msgid "VARIADIC parameter must be an array" msgstr "параметр VARIADIC должен быть массивом" -#: commands/functioncmds.c:371 +#: commands/functioncmds.c:393 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "имя параметра \"%s\" указано неоднократно" -#: commands/functioncmds.c:386 +#: commands/functioncmds.c:411 #, c-format msgid "only input parameters can have default values" msgstr "значения по умолчанию могут быть только у входных параметров" -#: commands/functioncmds.c:401 +#: commands/functioncmds.c:426 #, c-format msgid "cannot use table references in parameter default value" msgstr "в значениях параметров по умолчанию нельзя ссылаться на таблицы" -#: commands/functioncmds.c:425 +#: commands/functioncmds.c:450 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "" "входные параметры, следующие за параметром со значением по умолчанию, также " "должны иметь значения по умолчанию" -#: commands/functioncmds.c:577 commands/functioncmds.c:768 +#: commands/functioncmds.c:460 +#, c-format +msgid "procedure OUT parameters cannot appear after one with a default value" +msgstr "" +"в объявлении процедуры параметры OUT не могут находиться после параметра со " +"значением по умолчанию" + +#: commands/functioncmds.c:612 commands/functioncmds.c:803 #, c-format msgid "invalid attribute in procedure definition" msgstr "некорректный атрибут в определении процедуры" -#: commands/functioncmds.c:673 +#: commands/functioncmds.c:708 #, c-format msgid "support function %s must return type %s" msgstr "вспомогательная функция %s должна возвращать тип %s" -#: commands/functioncmds.c:684 +#: commands/functioncmds.c:719 #, c-format msgid "must be superuser to specify a support function" msgstr "для указания вспомогательной функции нужно быть суперпользователем" -#: commands/functioncmds.c:800 +#: commands/functioncmds.c:852 commands/functioncmds.c:1456 +#, c-format +msgid "COST must be positive" +msgstr "значение COST должно быть положительным" + +#: commands/functioncmds.c:860 commands/functioncmds.c:1464 +#, c-format +msgid "ROWS must be positive" +msgstr "значение ROWS должно быть положительным" + +#: commands/functioncmds.c:889 #, c-format msgid "no function body specified" msgstr "не указано тело функции" -#: commands/functioncmds.c:810 +#: commands/functioncmds.c:894 #, c-format -msgid "no language specified" -msgstr "язык не указан" +msgid "duplicate function body specified" +msgstr "тело функции задано неоднократно" -#: commands/functioncmds.c:835 commands/functioncmds.c:1319 +#: commands/functioncmds.c:899 #, c-format -msgid "COST must be positive" -msgstr "значение COST должно быть положительным" +msgid "inline SQL function body only valid for language SQL" +msgstr "встроенное тело функции SQL допускается только для языка SQL" -#: commands/functioncmds.c:843 commands/functioncmds.c:1327 +#: commands/functioncmds.c:941 #, c-format -msgid "ROWS must be positive" -msgstr "значение ROWS должно быть положительным" +msgid "" +"SQL function with unquoted function body cannot have polymorphic arguments" +msgstr "" +"у SQL-функции с телом, задаваемым не в кавычках, не может быть полиморфных " +"аргументов" + +#: commands/functioncmds.c:967 commands/functioncmds.c:986 +#, c-format +msgid "%s is not yet supported in unquoted SQL function body" +msgstr "" +"%s на данный момент не поддерживается в теле SQL-функции, задаваемом не в " +"кавычках" -#: commands/functioncmds.c:897 +#: commands/functioncmds.c:1014 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "для языка \"%s\" нужно только одно выражение AS" -#: commands/functioncmds.c:995 commands/functioncmds.c:2048 -#: commands/proclang.c:259 +#: commands/functioncmds.c:1119 +#, c-format +msgid "no language specified" +msgstr "язык не указан" + +#: commands/functioncmds.c:1127 commands/functioncmds.c:2129 +#: commands/proclang.c:237 #, c-format msgid "language \"%s\" does not exist" msgstr "язык \"%s\" не существует" -#: commands/functioncmds.c:997 commands/functioncmds.c:2050 +#: commands/functioncmds.c:1129 commands/functioncmds.c:2131 #, c-format msgid "Use CREATE EXTENSION to load the language into the database." msgstr "Выполните CREATE EXTENSION, чтобы загрузить язык в базу данных." -#: commands/functioncmds.c:1032 commands/functioncmds.c:1311 +#: commands/functioncmds.c:1164 commands/functioncmds.c:1448 #, c-format msgid "only superuser can define a leakproof function" msgstr "" "только суперпользователь может определить функцию с атрибутом LEAKPROOF" -#: commands/functioncmds.c:1081 +#: commands/functioncmds.c:1215 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "" "результат функции должен иметь тип %s (в соответствии с параметрами OUT)" -#: commands/functioncmds.c:1094 +#: commands/functioncmds.c:1228 #, c-format msgid "function result type must be specified" msgstr "необходимо указать тип результата функции" -#: commands/functioncmds.c:1146 commands/functioncmds.c:1331 +#: commands/functioncmds.c:1282 commands/functioncmds.c:1468 #, c-format msgid "ROWS is not applicable when function does not return a set" msgstr "указание ROWS неприменимо, когда функция возвращает не множество" -#: commands/functioncmds.c:1431 +#: commands/functioncmds.c:1568 #, c-format msgid "source data type %s is a pseudo-type" msgstr "исходный тип данных %s является псевдотипом" -#: commands/functioncmds.c:1437 +#: commands/functioncmds.c:1574 #, c-format msgid "target data type %s is a pseudo-type" msgstr "целевой тип данных %s является псевдотипом" -#: commands/functioncmds.c:1461 +#: commands/functioncmds.c:1598 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "" "приведение будет проигнорировано, так как исходные данные имеют тип домен" -#: commands/functioncmds.c:1466 +#: commands/functioncmds.c:1603 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "" "приведение будет проигнорировано, так как целевые данные имеют тип домен" -#: commands/functioncmds.c:1491 +#: commands/functioncmds.c:1628 #, c-format msgid "cast function must take one to three arguments" msgstr "функция приведения должна принимать от одного до трёх аргументов" -#: commands/functioncmds.c:1495 +#: commands/functioncmds.c:1632 #, c-format msgid "" "argument of cast function must match or be binary-coercible from source data " @@ -8358,17 +8652,17 @@ msgstr "" "аргумент функции приведения должен совпадать или быть двоично-совместимым с " "исходным типом данных" -#: commands/functioncmds.c:1499 +#: commands/functioncmds.c:1636 #, c-format msgid "second argument of cast function must be type %s" msgstr "второй аргумент функции приведения должен иметь тип %s" -#: commands/functioncmds.c:1504 +#: commands/functioncmds.c:1641 #, c-format msgid "third argument of cast function must be type %s" msgstr "третий аргумент функции приведения должен иметь тип %s" -#: commands/functioncmds.c:1509 +#: commands/functioncmds.c:1646 #, c-format msgid "" "return data type of cast function must match or be binary-coercible to " @@ -8377,127 +8671,127 @@ msgstr "" "тип возвращаемых данных функции приведения должен совпадать или быть двоично-" "совместимым с целевым типом данных" -#: commands/functioncmds.c:1520 +#: commands/functioncmds.c:1657 #, c-format msgid "cast function must not be volatile" msgstr "функция приведения не может быть изменчивой (volatile)" -#: commands/functioncmds.c:1525 +#: commands/functioncmds.c:1662 #, c-format msgid "cast function must be a normal function" msgstr "функция приведения должна быть обычной функцией" -#: commands/functioncmds.c:1529 +#: commands/functioncmds.c:1666 #, c-format msgid "cast function must not return a set" msgstr "функция приведения не может возвращать множество" -#: commands/functioncmds.c:1555 +#: commands/functioncmds.c:1692 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "для создания приведения WITHOUT FUNCTION нужно быть суперпользователем" -#: commands/functioncmds.c:1570 +#: commands/functioncmds.c:1707 #, c-format msgid "source and target data types are not physically compatible" -msgstr "исходный и целевой типы данных не совместимы физически" +msgstr "исходный и целевой типы данных несовместимы физически" -#: commands/functioncmds.c:1585 +#: commands/functioncmds.c:1722 #, c-format msgid "composite data types are not binary-compatible" -msgstr "составные типы данных не совместимы на двоичном уровне" +msgstr "составные типы данных несовместимы на двоичном уровне" -#: commands/functioncmds.c:1591 +#: commands/functioncmds.c:1728 #, c-format msgid "enum data types are not binary-compatible" -msgstr "типы-перечисления не совместимы на двоичном уровне" +msgstr "типы-перечисления несовместимы на двоичном уровне" -#: commands/functioncmds.c:1597 +#: commands/functioncmds.c:1734 #, c-format msgid "array data types are not binary-compatible" -msgstr "типы-массивы не совместимы на двоичном уровне" +msgstr "типы-массивы несовместимы на двоичном уровне" -#: commands/functioncmds.c:1614 +#: commands/functioncmds.c:1751 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "типы-домены не могут считаться двоично-совместимыми" -#: commands/functioncmds.c:1624 +#: commands/functioncmds.c:1761 #, c-format msgid "source data type and target data type are the same" msgstr "исходный тип данных совпадает с целевым" -#: commands/functioncmds.c:1682 +#: commands/functioncmds.c:1794 #, c-format msgid "transform function must not be volatile" msgstr "функция преобразования не может быть изменчивой" -#: commands/functioncmds.c:1686 +#: commands/functioncmds.c:1798 #, c-format msgid "transform function must be a normal function" msgstr "функция преобразования должна быть обычной функцией" -#: commands/functioncmds.c:1690 +#: commands/functioncmds.c:1802 #, c-format msgid "transform function must not return a set" msgstr "функция преобразования не может возвращать множество" -#: commands/functioncmds.c:1694 +#: commands/functioncmds.c:1806 #, c-format msgid "transform function must take one argument" msgstr "функция преобразования должна принимать один аргумент" -#: commands/functioncmds.c:1698 +#: commands/functioncmds.c:1810 #, c-format msgid "first argument of transform function must be type %s" msgstr "первый аргумент функции преобразования должен иметь тип %s" -#: commands/functioncmds.c:1736 +#: commands/functioncmds.c:1849 #, c-format msgid "data type %s is a pseudo-type" msgstr "тип данных %s является псевдотипом" -#: commands/functioncmds.c:1742 +#: commands/functioncmds.c:1855 #, c-format msgid "data type %s is a domain" msgstr "тип данных \"%s\" является доменом" -#: commands/functioncmds.c:1782 +#: commands/functioncmds.c:1895 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "результат функции FROM SQL должен иметь тип %s" -#: commands/functioncmds.c:1808 +#: commands/functioncmds.c:1921 #, c-format msgid "return data type of TO SQL function must be the transform data type" msgstr "результат функции TO SQL должен иметь тип данных преобразования" -#: commands/functioncmds.c:1837 +#: commands/functioncmds.c:1950 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "преобразование для типа %s, языка \"%s\" уже существует" -#: commands/functioncmds.c:1929 +#: commands/functioncmds.c:2037 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "преобразование для типа %s, языка \"%s\" не существует" -#: commands/functioncmds.c:1980 +#: commands/functioncmds.c:2061 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "функция %s уже существует в схеме \"%s\"" -#: commands/functioncmds.c:2035 +#: commands/functioncmds.c:2116 #, c-format msgid "no inline code specified" msgstr "нет внедрённого кода" -#: commands/functioncmds.c:2081 +#: commands/functioncmds.c:2162 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "язык \"%s\" не поддерживает выполнение внедрённого кода" -#: commands/functioncmds.c:2193 +#: commands/functioncmds.c:2257 #, c-format msgid "cannot pass more than %d argument to a procedure" msgid_plural "cannot pass more than %d arguments to a procedure" @@ -8505,98 +8799,97 @@ msgstr[0] "процедуре нельзя передать больше %d ар msgstr[1] "процедуре нельзя передать больше %d аргументов" msgstr[2] "процедуре нельзя передать больше %d аргументов" -#: commands/indexcmds.c:590 +#: commands/indexcmds.c:618 #, c-format msgid "must specify at least one column" msgstr "нужно указать минимум один столбец" -#: commands/indexcmds.c:594 +#: commands/indexcmds.c:622 #, c-format msgid "cannot use more than %d columns in an index" msgstr "число столбцов в индексе не может превышать %d" -#: commands/indexcmds.c:633 +#: commands/indexcmds.c:661 #, c-format msgid "cannot create index on foreign table \"%s\"" msgstr "создать индекс в сторонней таблице \"%s\" нельзя" -#: commands/indexcmds.c:664 +#: commands/indexcmds.c:692 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "" "создать индекс в секционированной таблице \"%s\" параллельным способом нельзя" -#: commands/indexcmds.c:669 +#: commands/indexcmds.c:697 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "" "создать ограничение-исключение в секционированной таблице \"%s\" нельзя" -#: commands/indexcmds.c:679 +#: commands/indexcmds.c:707 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "создавать индексы во временных таблицах других сеансов нельзя" -#: commands/indexcmds.c:717 commands/tablecmds.c:704 commands/tablespace.c:1185 +#: commands/indexcmds.c:745 commands/tablecmds.c:747 commands/tablespace.c:1181 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "" "для секционированных отношений нельзя назначить табличное пространство по " "умолчанию" -#: commands/indexcmds.c:749 commands/tablecmds.c:739 commands/tablecmds.c:13180 -#: commands/tablecmds.c:13294 +#: commands/indexcmds.c:777 commands/tablecmds.c:782 commands/tablecmds.c:3254 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "" "в табличное пространство pg_global можно поместить только разделяемые таблицы" -#: commands/indexcmds.c:782 +#: commands/indexcmds.c:810 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "устаревший метод доступа \"rtree\" подменяется методом \"gist\"" -#: commands/indexcmds.c:803 +#: commands/indexcmds.c:831 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "метод доступа \"%s\" не поддерживает уникальные индексы" -#: commands/indexcmds.c:808 +#: commands/indexcmds.c:836 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "метод доступа \"%s\" не поддерживает включаемые столбцы" -#: commands/indexcmds.c:813 +#: commands/indexcmds.c:841 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "метод доступа \"%s\" не поддерживает индексы по многим столбцам" -#: commands/indexcmds.c:818 +#: commands/indexcmds.c:846 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "метод доступа \"%s\" не поддерживает ограничения-исключения" -#: commands/indexcmds.c:941 +#: commands/indexcmds.c:969 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "" "сопоставить ключ секционирования с индексом, использующим метод доступа \"%s" "\", нельзя" -#: commands/indexcmds.c:951 +#: commands/indexcmds.c:979 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "" "неподдерживаемое ограничение \"%s\" с определением ключа секционирования" -#: commands/indexcmds.c:953 +#: commands/indexcmds.c:981 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "" "Ограничения %s не могут использоваться, когда ключи секционирования включают " "выражения." -#: commands/indexcmds.c:992 +#: commands/indexcmds.c:1020 #, c-format msgid "" "unique constraint on partitioned table must include all partitioning columns" @@ -8604,7 +8897,7 @@ msgstr "" "ограничение уникальности в секционированной таблице должно включать все " "секционирующие столбцы" -#: commands/indexcmds.c:993 +#: commands/indexcmds.c:1021 #, c-format msgid "" "%s constraint on table \"%s\" lacks column \"%s\" which is part of the " @@ -8613,97 +8906,92 @@ msgstr "" "В ограничении %s таблицы \"%s\" не хватает столбца \"%s\", входящего в ключ " "секционирования." -#: commands/indexcmds.c:1012 commands/indexcmds.c:1031 +#: commands/indexcmds.c:1040 commands/indexcmds.c:1059 #, c-format msgid "index creation on system columns is not supported" msgstr "создание индекса для системных столбцов не поддерживается" -#: commands/indexcmds.c:1056 -#, c-format -msgid "%s %s will create implicit index \"%s\" for table \"%s\"" -msgstr "%s %s создаст неявный индекс \"%s\" для таблицы \"%s\"" - -#: commands/indexcmds.c:1199 tcop/utility.c:1493 +#: commands/indexcmds.c:1231 tcop/utility.c:1510 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "создать уникальный индекс в секционированной таблице \"%s\" нельзя" -#: commands/indexcmds.c:1201 tcop/utility.c:1495 +#: commands/indexcmds.c:1233 tcop/utility.c:1512 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "Таблица \"%s\" содержит секции, являющиеся сторонними таблицами." -#: commands/indexcmds.c:1630 +#: commands/indexcmds.c:1683 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "функции в предикате индекса должны быть помечены как IMMUTABLE" -#: commands/indexcmds.c:1696 parser/parse_utilcmd.c:2464 -#: parser/parse_utilcmd.c:2599 +#: commands/indexcmds.c:1749 parser/parse_utilcmd.c:2515 +#: parser/parse_utilcmd.c:2650 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "указанный в ключе столбец \"%s\" не существует" -#: commands/indexcmds.c:1720 parser/parse_utilcmd.c:1800 +#: commands/indexcmds.c:1773 parser/parse_utilcmd.c:1814 #, c-format msgid "expressions are not supported in included columns" msgstr "выражения во включаемых столбцах не поддерживаются" -#: commands/indexcmds.c:1761 +#: commands/indexcmds.c:1814 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "функции в индексном выражении должны быть помечены как IMMUTABLE" -#: commands/indexcmds.c:1776 +#: commands/indexcmds.c:1829 #, c-format msgid "including column does not support a collation" msgstr "включаемые столбцы не поддерживают правила сортировки" -#: commands/indexcmds.c:1780 +#: commands/indexcmds.c:1833 #, c-format msgid "including column does not support an operator class" msgstr "включаемые столбцы не поддерживают классы операторов" -#: commands/indexcmds.c:1784 +#: commands/indexcmds.c:1837 #, c-format msgid "including column does not support ASC/DESC options" msgstr "включаемые столбцы не поддерживают сортировку ASC/DESC" -#: commands/indexcmds.c:1788 +#: commands/indexcmds.c:1841 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "включаемые столбцы не поддерживают указания NULLS FIRST/LAST" -#: commands/indexcmds.c:1815 +#: commands/indexcmds.c:1868 #, c-format msgid "could not determine which collation to use for index expression" msgstr "не удалось определить правило сортировки для индексного выражения" -#: commands/indexcmds.c:1823 commands/tablecmds.c:16064 commands/typecmds.c:771 -#: parser/parse_expr.c:2850 parser/parse_type.c:566 parser/parse_utilcmd.c:3674 -#: parser/parse_utilcmd.c:4235 utils/adt/misc.c:503 +#: commands/indexcmds.c:1876 commands/tablecmds.c:16846 commands/typecmds.c:810 +#: parser/parse_expr.c:2685 parser/parse_type.c:566 parser/parse_utilcmd.c:3781 +#: utils/adt/misc.c:599 #, c-format msgid "collations are not supported by type %s" msgstr "тип %s не поддерживает сортировку (COLLATION)" -#: commands/indexcmds.c:1861 +#: commands/indexcmds.c:1914 #, c-format msgid "operator %s is not commutative" msgstr "оператор %s не коммутативен" -#: commands/indexcmds.c:1863 +#: commands/indexcmds.c:1916 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "" "В ограничениях-исключениях могут использоваться только коммутативные " "операторы." -#: commands/indexcmds.c:1889 +#: commands/indexcmds.c:1942 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "оператор \"%s\" не входит в семейство операторов \"%s\"" -#: commands/indexcmds.c:1892 +#: commands/indexcmds.c:1945 #, c-format msgid "" "The exclusion operator must be related to the index operator class for the " @@ -8712,25 +9000,25 @@ msgstr "" "Оператор исключения для ограничения должен относиться к классу операторов " "индекса." -#: commands/indexcmds.c:1927 +#: commands/indexcmds.c:1980 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "метод доступа \"%s\" не поддерживает сортировку ASC/DESC" -#: commands/indexcmds.c:1932 +#: commands/indexcmds.c:1985 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "метод доступа \"%s\" не поддерживает параметр NULLS FIRST/LAST" -#: commands/indexcmds.c:1978 commands/tablecmds.c:16089 -#: commands/tablecmds.c:16095 commands/typecmds.c:1945 +#: commands/indexcmds.c:2031 commands/tablecmds.c:16871 +#: commands/tablecmds.c:16877 commands/typecmds.c:2317 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "" "для типа данных %s не определён класс операторов по умолчанию для метода " "доступа \"%s\"" -#: commands/indexcmds.c:1980 +#: commands/indexcmds.c:2033 #, c-format msgid "" "You must specify an operator class for the index or define a default " @@ -8739,66 +9027,86 @@ msgstr "" "Вы должны указать класс операторов для индекса или определить класс " "операторов по умолчанию для этого типа данных." -#: commands/indexcmds.c:2009 commands/indexcmds.c:2017 -#: commands/opclasscmds.c:208 +#: commands/indexcmds.c:2062 commands/indexcmds.c:2070 +#: commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "класс операторов \"%s\" для метода доступа \"%s\" не существует" -#: commands/indexcmds.c:2031 commands/typecmds.c:1933 +#: commands/indexcmds.c:2084 commands/typecmds.c:2305 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "класс операторов \"%s\" не принимает тип данных %s" -#: commands/indexcmds.c:2121 +#: commands/indexcmds.c:2174 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "" "для типа данных %s определено несколько классов операторов по умолчанию" -#: commands/indexcmds.c:2570 +#: commands/indexcmds.c:2502 +#, c-format +msgid "unrecognized REINDEX option \"%s\"" +msgstr "нераспознанный параметр REINDEX: \"%s\"" + +#: commands/indexcmds.c:2726 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "" "в таблице \"%s\" нет индексов, которые можно переиндексировать неблокирующим " "способом" -#: commands/indexcmds.c:2581 +#: commands/indexcmds.c:2740 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "в таблице \"%s\" нет индексов для переиндексации" -#: commands/indexcmds.c:2620 commands/indexcmds.c:2901 -#: commands/indexcmds.c:2994 +#: commands/indexcmds.c:2780 commands/indexcmds.c:3287 +#: commands/indexcmds.c:3415 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "Переиндексировать системные каталоги неблокирующим способом нельзя" -#: commands/indexcmds.c:2643 +#: commands/indexcmds.c:2803 #, c-format msgid "can only reindex the currently open database" msgstr "переиндексировать можно только текущую базу данных" -#: commands/indexcmds.c:2734 +#: commands/indexcmds.c:2891 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "" "все системные каталоги пропускаются, так как их нельзя переиндексировать " "неблокирующим способом" -#: commands/indexcmds.c:2786 commands/indexcmds.c:3506 +#: commands/indexcmds.c:2924 +#, c-format +msgid "cannot move system relations, skipping all" +msgstr "переместить системные отношения нельзя, все они пропускаются" + +#: commands/indexcmds.c:2971 +#, c-format +msgid "while reindexing partitioned table \"%s.%s\"" +msgstr "при переиндексировании секционированной таблицы \"%s.%s\"" + +#: commands/indexcmds.c:2974 +#, c-format +msgid "while reindexing partitioned index \"%s.%s\"" +msgstr "при перестроении секционированного индекса \"%s.%s\"" + +#: commands/indexcmds.c:3167 commands/indexcmds.c:4003 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "таблица \"%s.%s\" переиндексирована" -#: commands/indexcmds.c:2916 commands/indexcmds.c:2962 +#: commands/indexcmds.c:3319 commands/indexcmds.c:3371 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "" "перестроить нерабочий индекс \"%s.%s\" неблокирующим способом нельзя, он " "пропускается" -#: commands/indexcmds.c:2922 +#: commands/indexcmds.c:3325 #, c-format msgid "" "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" @@ -8806,23 +9114,25 @@ msgstr "" "перестроить индекс ограничения-исключения \"%s.%s\" неблокирующим способом " "нельзя, он пропускается" -#: commands/indexcmds.c:3033 +#: commands/indexcmds.c:3480 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "переиндексировать отношение такого типа неблокирующим способом нельзя" -#: commands/indexcmds.c:3488 commands/indexcmds.c:3499 +#: commands/indexcmds.c:3501 #, c-format -msgid "index \"%s.%s\" was reindexed" -msgstr "индекс \"%s.%s\" был перестроен" +msgid "cannot move non-shared relation to tablespace \"%s\"" +msgstr "" +"переместить отношение, не являющееся разделяемым, в табличное пространство " +"\"%s\" нельзя" -#: commands/indexcmds.c:3531 +#: commands/indexcmds.c:3984 commands/indexcmds.c:3996 #, c-format -msgid "REINDEX is not yet implemented for partitioned indexes" -msgstr "REINDEX для секционированных индексов ещё не реализован" +msgid "index \"%s.%s\" was reindexed" +msgstr "индекс \"%s.%s\" был перестроен" -#: commands/lockcmds.c:92 commands/tablecmds.c:5631 commands/trigger.c:295 -#: rewrite/rewriteDefine.c:272 rewrite/rewriteDefine.c:939 +#: commands/lockcmds.c:92 commands/tablecmds.c:6038 commands/trigger.c:307 +#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:938 #, c-format msgid "\"%s\" is not a table or view" msgstr "\"%s\" - это не таблица и не представление" @@ -8834,17 +9144,17 @@ msgstr "" "CONCURRENTLY нельзя использовать, когда материализованное представление не " "наполнено" -#: commands/matview.c:188 +#: commands/matview.c:188 gram.y:16812 #, c-format -msgid "CONCURRENTLY and WITH NO DATA options cannot be used together" -msgstr "параметры CONCURRENTLY и WITH NO DATA исключают друг друга" +msgid "%s and %s options cannot be used together" +msgstr "параметры %s и %s исключают друг друга" -#: commands/matview.c:244 +#: commands/matview.c:245 #, c-format msgid "cannot refresh materialized view \"%s\" concurrently" msgstr "обновить материализованное представление \"%s\" параллельно нельзя" -#: commands/matview.c:247 +#: commands/matview.c:248 #, c-format msgid "" "Create a unique index with no WHERE clause on one or more columns of the " @@ -8853,7 +9163,7 @@ msgstr "" "Создайте уникальный индекс без предложения WHERE для одного или нескольких " "столбцов материализованного представления." -#: commands/matview.c:641 +#: commands/matview.c:660 #, c-format msgid "" "new data for materialized view \"%s\" contains duplicate rows without any " @@ -8862,107 +9172,107 @@ msgstr "" "новые данные для материализованного представления \"%s\" содержат " "дублирующиеся строки (без учёта столбцов с NULL)" -#: commands/matview.c:643 +#: commands/matview.c:662 #, c-format msgid "Row: %s" msgstr "Строка: %s" -#: commands/opclasscmds.c:127 +#: commands/opclasscmds.c:124 #, c-format msgid "operator family \"%s\" does not exist for access method \"%s\"" msgstr "семейство операторов \"%s\" для метода доступа \"%s\" не существует" -#: commands/opclasscmds.c:269 +#: commands/opclasscmds.c:266 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists" msgstr "семейство операторов \"%s\" для метода доступа \"%s\" уже существует" -#: commands/opclasscmds.c:414 +#: commands/opclasscmds.c:411 #, c-format msgid "must be superuser to create an operator class" msgstr "для создания класса операторов нужно быть суперпользователем" -#: commands/opclasscmds.c:487 commands/opclasscmds.c:869 -#: commands/opclasscmds.c:993 +#: commands/opclasscmds.c:484 commands/opclasscmds.c:901 +#: commands/opclasscmds.c:1047 #, c-format msgid "invalid operator number %d, must be between 1 and %d" msgstr "неверный номер оператора (%d), требуется число от 1 до %d" -#: commands/opclasscmds.c:531 commands/opclasscmds.c:913 -#: commands/opclasscmds.c:1008 +#: commands/opclasscmds.c:529 commands/opclasscmds.c:951 +#: commands/opclasscmds.c:1063 #, c-format msgid "invalid function number %d, must be between 1 and %d" msgstr "неверный номер функции (%d), требуется число от 1 до %d" -#: commands/opclasscmds.c:559 +#: commands/opclasscmds.c:558 #, c-format msgid "storage type specified more than once" msgstr "тип хранения указан неоднократно" -#: commands/opclasscmds.c:586 +#: commands/opclasscmds.c:585 #, c-format msgid "" "storage type cannot be different from data type for access method \"%s\"" msgstr "" "тип хранения не может отличаться от типа данных для метода доступа \"%s\"" -#: commands/opclasscmds.c:602 +#: commands/opclasscmds.c:601 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists" msgstr "класс операторов \"%s\" для метода доступа \"%s\" уже существует" -#: commands/opclasscmds.c:630 +#: commands/opclasscmds.c:629 #, c-format msgid "could not make operator class \"%s\" be default for type %s" msgstr "" "класс операторов \"%s\" не удалось сделать классом по умолчанию для типа %s" -#: commands/opclasscmds.c:633 +#: commands/opclasscmds.c:632 #, c-format msgid "Operator class \"%s\" already is the default." msgstr "Класс операторов \"%s\" уже является классом по умолчанию." -#: commands/opclasscmds.c:761 +#: commands/opclasscmds.c:792 #, c-format msgid "must be superuser to create an operator family" msgstr "для создания семейства операторов нужно быть суперпользователем" -#: commands/opclasscmds.c:821 +#: commands/opclasscmds.c:852 #, c-format msgid "must be superuser to alter an operator family" msgstr "для изменения семейства операторов нужно быть суперпользователем" -#: commands/opclasscmds.c:878 +#: commands/opclasscmds.c:910 #, c-format msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" msgstr "в ALTER OPERATOR FAMILY должны быть указаны типы аргументов оператора" -#: commands/opclasscmds.c:941 +#: commands/opclasscmds.c:985 #, c-format msgid "STORAGE cannot be specified in ALTER OPERATOR FAMILY" msgstr "в ALTER OPERATOR FAMILY нельзя указать STORAGE" -#: commands/opclasscmds.c:1063 +#: commands/opclasscmds.c:1119 #, c-format msgid "one or two argument types must be specified" msgstr "нужно указать один или два типа аргументов" -#: commands/opclasscmds.c:1089 +#: commands/opclasscmds.c:1145 #, c-format msgid "index operators must be binary" msgstr "индексные операторы должны быть бинарными" -#: commands/opclasscmds.c:1108 +#: commands/opclasscmds.c:1164 #, c-format msgid "access method \"%s\" does not support ordering operators" msgstr "метод доступа \"%s\" не поддерживает сортирующие операторы" -#: commands/opclasscmds.c:1119 +#: commands/opclasscmds.c:1175 #, c-format msgid "index search operators must return boolean" msgstr "операторы поиска по индексу должны возвращать логическое значение" -#: commands/opclasscmds.c:1159 +#: commands/opclasscmds.c:1215 #, c-format msgid "" "associated data types for operator class options parsing functions must " @@ -8971,7 +9281,7 @@ msgstr "" "связанные типы данных для функций, разбирающих параметры класса операторов, " "должны совпадать с входным типом класса" -#: commands/opclasscmds.c:1166 +#: commands/opclasscmds.c:1222 #, c-format msgid "" "left and right associated data types for operator class options parsing " @@ -8980,119 +9290,119 @@ msgstr "" "левый и правый типы данных для функций, разбирающих параметры класса " "операторов, должны совпадать" -#: commands/opclasscmds.c:1174 +#: commands/opclasscmds.c:1230 #, c-format msgid "invalid operator class options parsing function" msgstr "неправильная функция разбора параметров класса операторов" -#: commands/opclasscmds.c:1175 +#: commands/opclasscmds.c:1231 #, c-format msgid "Valid signature of operator class options parsing function is %s." msgstr "" "Правильная сигнатура функции, осуществляющей разбор параметров класса " "операторов: '%s'." -#: commands/opclasscmds.c:1194 +#: commands/opclasscmds.c:1250 #, c-format msgid "btree comparison functions must have two arguments" msgstr "функции сравнения btree должны иметь два аргумента" -#: commands/opclasscmds.c:1198 +#: commands/opclasscmds.c:1254 #, c-format msgid "btree comparison functions must return integer" msgstr "функции сравнения btree должны возвращать целое число" -#: commands/opclasscmds.c:1215 +#: commands/opclasscmds.c:1271 #, c-format msgid "btree sort support functions must accept type \"internal\"" msgstr "опорные функции сортировки btree должны принимать тип \"internal\"" -#: commands/opclasscmds.c:1219 +#: commands/opclasscmds.c:1275 #, c-format msgid "btree sort support functions must return void" msgstr "опорные функции сортировки btree должны возвращать пустое (void)" -#: commands/opclasscmds.c:1230 +#: commands/opclasscmds.c:1286 #, c-format msgid "btree in_range functions must have five arguments" msgstr "функции in_range для btree должны принимать пять аргументов" -#: commands/opclasscmds.c:1234 +#: commands/opclasscmds.c:1290 #, c-format msgid "btree in_range functions must return boolean" msgstr "функции in_range для btree должны возвращать логическое значение" -#: commands/opclasscmds.c:1250 +#: commands/opclasscmds.c:1306 #, c-format msgid "btree equal image functions must have one argument" msgstr "функции равенства образов btree должны иметь один аргумент" -#: commands/opclasscmds.c:1254 +#: commands/opclasscmds.c:1310 #, c-format msgid "btree equal image functions must return boolean" msgstr "функции равенства образов должны возвращать логическое значение" -#: commands/opclasscmds.c:1267 +#: commands/opclasscmds.c:1323 #, c-format msgid "btree equal image functions must not be cross-type" msgstr "функции равенства образов не должны быть межтиповыми" -#: commands/opclasscmds.c:1277 +#: commands/opclasscmds.c:1333 #, c-format msgid "hash function 1 must have one argument" msgstr "функция хеширования 1 должна принимать один аргумент" -#: commands/opclasscmds.c:1281 +#: commands/opclasscmds.c:1337 #, c-format msgid "hash function 1 must return integer" msgstr "функция хеширования 1 должна возвращать целое число" -#: commands/opclasscmds.c:1288 +#: commands/opclasscmds.c:1344 #, c-format msgid "hash function 2 must have two arguments" msgstr "функция хеширования 2 должна принимать два аргумента" -#: commands/opclasscmds.c:1292 +#: commands/opclasscmds.c:1348 #, c-format msgid "hash function 2 must return bigint" msgstr "функция хеширования 2 должна возвращать значение bigint" -#: commands/opclasscmds.c:1317 +#: commands/opclasscmds.c:1373 #, c-format msgid "associated data types must be specified for index support function" msgstr "для опорной функции индексов должны быть указаны связанные типы данных" -#: commands/opclasscmds.c:1342 +#: commands/opclasscmds.c:1398 #, c-format msgid "function number %d for (%s,%s) appears more than once" msgstr "номер функции %d для (%s,%s) дублируется" -#: commands/opclasscmds.c:1349 +#: commands/opclasscmds.c:1405 #, c-format msgid "operator number %d for (%s,%s) appears more than once" msgstr "номер оператора %d для (%s,%s) дублируется" -#: commands/opclasscmds.c:1398 +#: commands/opclasscmds.c:1451 #, c-format msgid "operator %d(%s,%s) already exists in operator family \"%s\"" msgstr "оператор %d(%s,%s) уже существует в семействе \"%s\"" -#: commands/opclasscmds.c:1515 +#: commands/opclasscmds.c:1557 #, c-format msgid "function %d(%s,%s) already exists in operator family \"%s\"" msgstr "функция %d(%s,%s) уже существует в семействе операторов \"%s\"" -#: commands/opclasscmds.c:1606 +#: commands/opclasscmds.c:1638 #, c-format msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" msgstr "оператор %d(%s,%s) не существует в семействе операторов \"%s\"" -#: commands/opclasscmds.c:1646 +#: commands/opclasscmds.c:1678 #, c-format msgid "function %d(%s,%s) does not exist in operator family \"%s\"" msgstr "функция %d(%s,%s) не существует в семействе операторов \"%s\"" -#: commands/opclasscmds.c:1776 +#: commands/opclasscmds.c:1709 #, c-format msgid "" "operator class \"%s\" for access method \"%s\" already exists in schema \"%s" @@ -9101,7 +9411,7 @@ msgstr "" "класс операторов \"%s\" для метода доступа \"%s\" уже существует в схеме \"%s" "\"" -#: commands/opclasscmds.c:1799 +#: commands/opclasscmds.c:1732 #, c-format msgid "" "operator family \"%s\" for access method \"%s\" already exists in schema \"%s" @@ -9115,7 +9425,7 @@ msgstr "" msgid "SETOF type not allowed for operator argument" msgstr "аргументом оператора не может быть тип SETOF" -#: commands/operatorcmds.c:152 commands/operatorcmds.c:467 +#: commands/operatorcmds.c:152 commands/operatorcmds.c:479 #, c-format msgid "operator attribute \"%s\" not recognized" msgstr "атрибут оператора \"%s\" не распознан" @@ -9125,83 +9435,88 @@ msgstr "атрибут оператора \"%s\" не распознан" msgid "operator function must be specified" msgstr "необходимо указать функцию оператора" -#: commands/operatorcmds.c:174 +#: commands/operatorcmds.c:181 +#, c-format +msgid "operator argument types must be specified" +msgstr "нужно указать типы аргументов оператора" + +#: commands/operatorcmds.c:185 #, c-format -msgid "at least one of leftarg or rightarg must be specified" -msgstr "необходимо указать левый и/или правый аргумент" +msgid "operator right argument type must be specified" +msgstr "нужно указать тип правого аргумента оператора" -#: commands/operatorcmds.c:278 +#: commands/operatorcmds.c:186 +#, c-format +msgid "Postfix operators are not supported." +msgstr "Постфиксные операторы не поддерживаются." + +#: commands/operatorcmds.c:290 #, c-format msgid "restriction estimator function %s must return type %s" msgstr "функция оценки ограничения %s должна возвращать тип %s" -#: commands/operatorcmds.c:321 +#: commands/operatorcmds.c:333 #, c-format msgid "join estimator function %s has multiple matches" msgstr "функция оценки соединения %s присутствует в нескольких экземплярах" -#: commands/operatorcmds.c:336 +#: commands/operatorcmds.c:348 #, c-format msgid "join estimator function %s must return type %s" msgstr "функция оценки соединения %s должна возвращать тип %s" -#: commands/operatorcmds.c:461 +#: commands/operatorcmds.c:473 #, c-format msgid "operator attribute \"%s\" cannot be changed" msgstr "атрибут оператора \"%s\" нельзя изменить" -#: commands/policy.c:88 commands/policy.c:381 commands/policy.c:471 -#: commands/statscmds.c:143 commands/tablecmds.c:1512 commands/tablecmds.c:1994 -#: commands/tablecmds.c:3076 commands/tablecmds.c:5610 -#: commands/tablecmds.c:8413 commands/tablecmds.c:15654 -#: commands/tablecmds.c:15689 commands/trigger.c:301 commands/trigger.c:1206 -#: commands/trigger.c:1315 rewrite/rewriteDefine.c:278 -#: rewrite/rewriteDefine.c:944 rewrite/rewriteRemove.c:80 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:151 +#: commands/tablecmds.c:1560 commands/tablecmds.c:2139 +#: commands/tablecmds.c:3364 commands/tablecmds.c:6017 +#: commands/tablecmds.c:8901 commands/tablecmds.c:16436 +#: commands/tablecmds.c:16471 commands/trigger.c:313 commands/trigger.c:1289 +#: commands/trigger.c:1398 rewrite/rewriteDefine.c:277 +#: rewrite/rewriteDefine.c:943 rewrite/rewriteRemove.c:80 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "доступ запрещён: \"%s\" - это системный каталог" -#: commands/policy.c:171 +#: commands/policy.c:172 #, c-format msgid "ignoring specified roles other than PUBLIC" msgstr "все указанные роли, кроме PUBLIC, игнорируются" -#: commands/policy.c:172 +#: commands/policy.c:173 #, c-format msgid "All roles are members of the PUBLIC role." msgstr "Роль PUBLIC включает в себя все остальные роли." -#: commands/policy.c:495 -#, c-format -msgid "role \"%s\" could not be removed from policy \"%s\" on \"%s\"" -msgstr "роль \"%s\" нельзя удалить из политики \"%s\" отношения \"%s\"" - -#: commands/policy.c:704 +#: commands/policy.c:607 #, c-format msgid "WITH CHECK cannot be applied to SELECT or DELETE" msgstr "WITH CHECK нельзя применить к SELECT или DELETE" -#: commands/policy.c:713 commands/policy.c:1018 +#: commands/policy.c:616 commands/policy.c:921 #, c-format msgid "only WITH CHECK expression allowed for INSERT" msgstr "для INSERT допускается только выражение WITH CHECK" -#: commands/policy.c:788 commands/policy.c:1241 +#: commands/policy.c:691 commands/policy.c:1144 #, c-format msgid "policy \"%s\" for table \"%s\" already exists" msgstr "политика \"%s\" для таблицы \"%s\" уже существует" -#: commands/policy.c:990 commands/policy.c:1269 commands/policy.c:1340 +#: commands/policy.c:893 commands/policy.c:1172 commands/policy.c:1243 #, c-format msgid "policy \"%s\" for table \"%s\" does not exist" msgstr "политика \"%s\" для таблицы \"%s\" не существует" -#: commands/policy.c:1008 +#: commands/policy.c:911 #, c-format msgid "only USING expression allowed for SELECT, DELETE" msgstr "для SELECT, DELETE допускается только выражение USING" -#: commands/portalcmds.c:60 commands/portalcmds.c:187 commands/portalcmds.c:238 +#: commands/portalcmds.c:60 commands/portalcmds.c:181 commands/portalcmds.c:232 #, c-format msgid "invalid cursor name: must not be empty" msgstr "имя курсора не может быть пустым" @@ -9213,7 +9528,7 @@ msgstr "" "в рамках операции с ограничениями по безопасности нельзя создать курсор WITH " "HOLD" -#: commands/portalcmds.c:195 commands/portalcmds.c:248 +#: commands/portalcmds.c:189 commands/portalcmds.c:242 #: executor/execCurrent.c:70 utils/adt/xml.c:2594 utils/adt/xml.c:2764 #, c-format msgid "cursor \"%s\" does not exist" @@ -9224,118 +9539,118 @@ msgstr "курсор \"%s\" не существует" msgid "invalid statement name: must not be empty" msgstr "неверный оператор: имя не должно быть пустым" -#: commands/prepare.c:134 parser/parse_param.c:304 tcop/postgres.c:1498 +#: commands/prepare.c:131 parser/parse_param.c:313 tcop/postgres.c:1473 #, c-format msgid "could not determine data type of parameter $%d" msgstr "не удалось определить тип данных параметра $%d" -#: commands/prepare.c:152 +#: commands/prepare.c:149 #, c-format msgid "utility statements cannot be prepared" msgstr "служебные SQL-операторы нельзя подготовить" # [SM]: TO REVIEW -#: commands/prepare.c:256 commands/prepare.c:261 +#: commands/prepare.c:264 commands/prepare.c:269 #, c-format msgid "prepared statement is not a SELECT" msgstr "подготовленный оператор - не SELECT" -#: commands/prepare.c:328 +#: commands/prepare.c:329 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "неверное число параметров для подготовленного оператора \"%s\"" -#: commands/prepare.c:330 +#: commands/prepare.c:331 #, c-format msgid "Expected %d parameters but got %d." msgstr "Ожидалось параметров: %d, получено: %d." -#: commands/prepare.c:363 +#: commands/prepare.c:364 #, c-format msgid "parameter $%d of type %s cannot be coerced to the expected type %s" msgstr "параметр $%d типа %s нельзя привести к ожидаемому типу %s" # [SM]: TO REVIEW -#: commands/prepare.c:449 +#: commands/prepare.c:448 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "подготовленный оператор \"%s\" уже существует" # [SM]: TO REVIEW -#: commands/prepare.c:488 +#: commands/prepare.c:487 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "подготовленный оператор \"%s\" не существует" -#: commands/proclang.c:67 +#: commands/proclang.c:68 #, c-format msgid "must be superuser to create custom procedural language" msgstr "" "для создания дополнительного процедурного языка нужно быть суперпользователем" -#: commands/publicationcmds.c:107 +#: commands/publicationcmds.c:104 #, c-format msgid "invalid list syntax for \"publish\" option" msgstr "неверный синтаксис параметра \"publish\"" -#: commands/publicationcmds.c:125 +#: commands/publicationcmds.c:122 #, c-format msgid "unrecognized \"publish\" value: \"%s\"" msgstr "нераспознанное значение \"publish\": \"%s\"" -#: commands/publicationcmds.c:140 +#: commands/publicationcmds.c:137 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "нераспознанный параметр репликации: \"%s\"" -#: commands/publicationcmds.c:172 +#: commands/publicationcmds.c:169 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "для создания публикации всех таблиц нужно быть суперпользователем" -#: commands/publicationcmds.c:248 +#: commands/publicationcmds.c:250 #, c-format msgid "wal_level is insufficient to publish logical changes" msgstr "уровень wal_level недостаточен для публикации логических изменений" -#: commands/publicationcmds.c:249 +#: commands/publicationcmds.c:251 #, c-format msgid "Set wal_level to logical before creating subscriptions." msgstr "Задайте для wal_level значение logical до создания подписок." -#: commands/publicationcmds.c:369 +#: commands/publicationcmds.c:376 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "публикация \"%s\" определена для всех таблиц (FOR ALL TABLES)" -#: commands/publicationcmds.c:371 +#: commands/publicationcmds.c:378 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "В публикации всех таблиц нельзя добавлять или удалять таблицы." -#: commands/publicationcmds.c:683 +#: commands/publicationcmds.c:707 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "отношение \"%s\" не включено в публикацию" -#: commands/publicationcmds.c:726 +#: commands/publicationcmds.c:750 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "нет прав на изменение владельца публикации \"%s\"" -#: commands/publicationcmds.c:728 +#: commands/publicationcmds.c:752 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "" "Владельцем публикации всех таблиц (FOR ALL TABLES) должен быть " "суперпользователь." -#: commands/schemacmds.c:105 commands/schemacmds.c:281 +#: commands/schemacmds.c:105 commands/schemacmds.c:259 #, c-format msgid "unacceptable schema name \"%s\"" msgstr "неприемлемое имя схемы: \"%s\"" -#: commands/schemacmds.c:106 commands/schemacmds.c:282 +#: commands/schemacmds.c:106 commands/schemacmds.c:260 #, c-format msgid "The prefix \"pg_\" is reserved for system schemas." msgstr "Префикс \"pg_\" зарезервирован для системных схем." @@ -9345,12 +9660,12 @@ msgstr "Префикс \"pg_\" зарезервирован для систем msgid "schema \"%s\" already exists, skipping" msgstr "схема \"%s\" уже существует, пропускается" -#: commands/seclabel.c:60 +#: commands/seclabel.c:129 #, c-format msgid "no security label providers have been loaded" msgstr "поставщики меток безопасности не загружены" -#: commands/seclabel.c:64 +#: commands/seclabel.c:133 #, c-format msgid "" "must specify provider when multiple security label providers have been loaded" @@ -9358,11 +9673,16 @@ msgstr "" "когда загружено несколько поставщиков меток безопасности, нужный следует " "указывать явно" -#: commands/seclabel.c:82 +#: commands/seclabel.c:151 #, c-format msgid "security label provider \"%s\" is not loaded" msgstr "поставщик меток безопасности \"%s\" не загружен" +#: commands/seclabel.c:158 +#, c-format +msgid "security labels are not supported for this type of object" +msgstr "метки безопасности не поддерживаются для объектов этого типа" + #: commands/sequence.c:140 #, c-format msgid "unlogged sequences are not supported" @@ -9396,142 +9716,142 @@ msgid "setval: value %s is out of bounds for sequence \"%s\" (%s..%s)" msgstr "" "setval передано значение %s вне пределов последовательности \"%s\" (%s..%s)" -#: commands/sequence.c:1360 +#: commands/sequence.c:1359 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "неверное свойство последовательности SEQUENCE NAME" -#: commands/sequence.c:1386 +#: commands/sequence.c:1385 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "" "типом столбца идентификации может быть только smallint, integer или bigint" -#: commands/sequence.c:1387 +#: commands/sequence.c:1386 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "" "типом последовательности может быть только smallint, integer или bigint" -#: commands/sequence.c:1421 +#: commands/sequence.c:1420 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENT не может быть нулевым" -#: commands/sequence.c:1474 +#: commands/sequence.c:1473 #, c-format msgid "MAXVALUE (%s) is out of range for sequence data type %s" msgstr "MAXVALUE (%s) выходит за пределы типа данных последовательности (%s)" -#: commands/sequence.c:1511 +#: commands/sequence.c:1510 #, c-format msgid "MINVALUE (%s) is out of range for sequence data type %s" msgstr "MINVALUE (%s) выходит за пределы типа данных последовательности (%s)" -#: commands/sequence.c:1525 +#: commands/sequence.c:1524 #, c-format msgid "MINVALUE (%s) must be less than MAXVALUE (%s)" msgstr "MINVALUE (%s) должно быть меньше MAXVALUE (%s)" -#: commands/sequence.c:1552 +#: commands/sequence.c:1551 #, c-format msgid "START value (%s) cannot be less than MINVALUE (%s)" msgstr "значение START (%s) не может быть меньше MINVALUE (%s)" -#: commands/sequence.c:1564 +#: commands/sequence.c:1563 #, c-format msgid "START value (%s) cannot be greater than MAXVALUE (%s)" msgstr "значение START (%s) не может быть больше MAXVALUE (%s)" -#: commands/sequence.c:1594 +#: commands/sequence.c:1593 #, c-format msgid "RESTART value (%s) cannot be less than MINVALUE (%s)" msgstr "значение RESTART (%s) не может быть меньше MINVALUE (%s)" -#: commands/sequence.c:1606 +#: commands/sequence.c:1605 #, c-format msgid "RESTART value (%s) cannot be greater than MAXVALUE (%s)" msgstr "значение RESTART (%s) не может быть больше MAXVALUE (%s)" -#: commands/sequence.c:1621 +#: commands/sequence.c:1620 #, c-format msgid "CACHE (%s) must be greater than zero" msgstr "значение CACHE (%s) должно быть больше нуля" -#: commands/sequence.c:1658 +#: commands/sequence.c:1657 #, c-format msgid "invalid OWNED BY option" msgstr "неверное указание OWNED BY" # skip-rule: no-space-after-period -#: commands/sequence.c:1659 +#: commands/sequence.c:1658 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "Укажите OWNED BY таблица.столбец или OWNED BY NONE." -#: commands/sequence.c:1684 +#: commands/sequence.c:1683 #, c-format msgid "referenced relation \"%s\" is not a table or foreign table" msgstr "указанный объект \"%s\" не является таблицей или сторонней таблицей" -#: commands/sequence.c:1691 +#: commands/sequence.c:1690 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "" "последовательность должна иметь того же владельца, что и таблица, с которой " "она связана" -#: commands/sequence.c:1695 +#: commands/sequence.c:1694 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "" "последовательность должна быть в той же схеме, что и таблица, с которой она " "связана" -#: commands/sequence.c:1717 +#: commands/sequence.c:1716 #, c-format msgid "cannot change ownership of identity sequence" msgstr "сменить владельца последовательности идентификации нельзя" -#: commands/sequence.c:1718 commands/tablecmds.c:12562 -#: commands/tablecmds.c:15080 +#: commands/sequence.c:1717 commands/tablecmds.c:13228 +#: commands/tablecmds.c:15861 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Последовательность \"%s\" связана с таблицей \"%s\"." -#: commands/statscmds.c:104 commands/statscmds.c:113 +#: commands/statscmds.c:112 commands/statscmds.c:121 tcop/utility.c:1860 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "в CREATE STATISTICS можно указать только одно отношение" -#: commands/statscmds.c:131 +#: commands/statscmds.c:139 #, c-format msgid "relation \"%s\" is not a table, foreign table, or materialized view" msgstr "" "отношение \"%s\" - это не таблица, не сторонняя таблица и не " "материализованное представление" -#: commands/statscmds.c:181 +#: commands/statscmds.c:189 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "объект статистики \"%s\" уже существует, пропускается" -#: commands/statscmds.c:189 +#: commands/statscmds.c:197 #, c-format msgid "statistics object \"%s\" already exists" msgstr "объект статистики \"%s\" уже существует" -#: commands/statscmds.c:211 commands/statscmds.c:217 +#: commands/statscmds.c:208 #, c-format -msgid "only simple column references are allowed in CREATE STATISTICS" -msgstr "в CREATE STATISTICS допускаются только простые ссылки на столбцы" +msgid "cannot have more than %d columns in statistics" +msgstr "в статистике не может быть больше %d столбцов" -#: commands/statscmds.c:232 +#: commands/statscmds.c:249 commands/statscmds.c:272 commands/statscmds.c:305 #, c-format msgid "statistics creation on system columns is not supported" msgstr "создание статистики для системных столбцов не поддерживается" -#: commands/statscmds.c:239 +#: commands/statscmds.c:256 commands/statscmds.c:279 #, c-format msgid "" "column \"%s\" cannot be used in statistics because its type %s has no " @@ -9540,83 +9860,96 @@ msgstr "" "столбец \"%s\" нельзя использовать в статистике, так как для его типа %s не " "определён класс операторов B-дерева по умолчанию" -#: commands/statscmds.c:246 +#: commands/statscmds.c:322 #, c-format -msgid "cannot have more than %d columns in statistics" -msgstr "в статистике не может быть больше %d столбцов" +msgid "" +"expression cannot be used in multivariate statistics because its type %s has " +"no default btree operator class" +msgstr "" +"выражение нельзя использовать в многовариантной статистике, так как для его " +"типа %s не определён класс операторов btree по умолчанию" + +#: commands/statscmds.c:343 +#, c-format +msgid "" +"when building statistics on a single expression, statistics kinds may not be " +"specified" +msgstr "" +"при построении статистики по единственному выражению указывать виды " +"статистики нельзя" -#: commands/statscmds.c:261 +#: commands/statscmds.c:372 +#, c-format +msgid "unrecognized statistics kind \"%s\"" +msgstr "нераспознанный вид статистики \"%s\"" + +#: commands/statscmds.c:401 #, c-format msgid "extended statistics require at least 2 columns" msgstr "для расширенной статистики требуются минимум 2 столбца" -#: commands/statscmds.c:279 +#: commands/statscmds.c:419 #, c-format msgid "duplicate column name in statistics definition" msgstr "повторяющееся имя столбца в определении статистики" -#: commands/statscmds.c:313 +#: commands/statscmds.c:454 #, c-format -msgid "unrecognized statistics kind \"%s\"" -msgstr "нераспознанный вид статистики \"%s\"" +msgid "duplicate expression in statistics definition" +msgstr "повторяющееся выражение в определении статистики" -#: commands/statscmds.c:451 commands/tablecmds.c:7434 +#: commands/statscmds.c:635 commands/tablecmds.c:7871 #, c-format msgid "statistics target %d is too low" msgstr "ориентир статистики слишком мал (%d)" -#: commands/statscmds.c:459 commands/tablecmds.c:7442 +#: commands/statscmds.c:643 commands/tablecmds.c:7879 #, c-format msgid "lowering statistics target to %d" msgstr "ориентир статистики снижается до %d" -#: commands/statscmds.c:482 +#: commands/statscmds.c:666 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "объект статистики \"%s.%s\" не существует, пропускается" -#: commands/subscriptioncmds.c:181 +#: commands/subscriptioncmds.c:223 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "нераспознанный параметр подписки: \"%s\"" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:195 commands/subscriptioncmds.c:201 -#: commands/subscriptioncmds.c:207 commands/subscriptioncmds.c:226 -#: commands/subscriptioncmds.c:232 +#: commands/subscriptioncmds.c:237 commands/subscriptioncmds.c:243 +#: commands/subscriptioncmds.c:249 commands/subscriptioncmds.c:268 +#: commands/subscriptioncmds.c:274 #, c-format msgid "%s and %s are mutually exclusive options" msgstr "указания %s и %s являются взаимоисключающими" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:239 commands/subscriptioncmds.c:245 +#: commands/subscriptioncmds.c:281 commands/subscriptioncmds.c:287 #, c-format msgid "subscription with %s must also set %s" msgstr "для подписки с параметром %s необходимо также задать %s" -#: commands/subscriptioncmds.c:287 -#, c-format -msgid "publication name \"%s\" used more than once" -msgstr "имя публикации \"%s\" используется неоднократно" - -#: commands/subscriptioncmds.c:351 +#: commands/subscriptioncmds.c:380 #, c-format msgid "must be superuser to create subscriptions" msgstr "для создания подписок нужно быть суперпользователем" -#: commands/subscriptioncmds.c:442 commands/subscriptioncmds.c:530 -#: replication/logical/tablesync.c:857 replication/logical/worker.c:2095 +#: commands/subscriptioncmds.c:474 commands/subscriptioncmds.c:572 +#: replication/logical/tablesync.c:975 replication/logical/worker.c:3192 #, c-format msgid "could not connect to the publisher: %s" msgstr "не удалось подключиться к серверу публикации: %s" -#: commands/subscriptioncmds.c:484 +#: commands/subscriptioncmds.c:516 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "на сервере публикации создан слот репликации \"%s\"" #. translator: %s is an SQL ALTER statement -#: commands/subscriptioncmds.c:497 +#: commands/subscriptioncmds.c:529 #, c-format msgid "" "tables were not subscribed, you will have to run %s to subscribe the tables" @@ -9624,212 +9957,216 @@ msgstr "" "в подписке отсутствуют таблицы; потребуется выполнить %s, чтобы подписаться " "на таблицы" -#: commands/subscriptioncmds.c:586 -#, c-format -msgid "table \"%s.%s\" added to subscription \"%s\"" -msgstr "таблица \"%s.%s\" добавлена в подписку \"%s\"" - -#: commands/subscriptioncmds.c:610 -#, c-format -msgid "table \"%s.%s\" removed from subscription \"%s\"" -msgstr "таблица \"%s.%s\" удалена из подписки \"%s\"" - -#: commands/subscriptioncmds.c:682 +#: commands/subscriptioncmds.c:828 #, c-format msgid "cannot set %s for enabled subscription" msgstr "для включённой подписки нельзя задать %s" -#: commands/subscriptioncmds.c:717 +#: commands/subscriptioncmds.c:884 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "включить подписку, для которой не задано имя слота, нельзя" -#: commands/subscriptioncmds.c:763 +#: commands/subscriptioncmds.c:936 commands/subscriptioncmds.c:983 #, c-format msgid "" "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "" "ALTER SUBSCRIPTION с обновлением для отключённых подписок не допускается" -#: commands/subscriptioncmds.c:764 +#: commands/subscriptioncmds.c:937 commands/subscriptioncmds.c:984 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "" "Выполните ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:782 +#: commands/subscriptioncmds.c:1004 #, c-format msgid "" "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH для отключённых подписок не допускается" -#: commands/subscriptioncmds.c:862 +#: commands/subscriptioncmds.c:1092 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "подписка \"%s\" не существует, пропускается" -#: commands/subscriptioncmds.c:987 +#: commands/subscriptioncmds.c:1344 #, c-format -msgid "" -"could not connect to publisher when attempting to drop the replication slot " -"\"%s\"" +msgid "dropped replication slot \"%s\" on publisher" +msgstr "слот репликации \"%s\" удалён на сервере репликации" + +#: commands/subscriptioncmds.c:1353 commands/subscriptioncmds.c:1361 +#, c-format +msgid "could not drop replication slot \"%s\" on publisher: %s" +msgstr "слот репликации \"%s\" на сервере публикации не был удалён: %s" + +#: commands/subscriptioncmds.c:1395 +#, c-format +msgid "permission denied to change owner of subscription \"%s\"" +msgstr "нет прав на изменение владельца подписки \"%s\"" + +#: commands/subscriptioncmds.c:1397 +#, c-format +msgid "The owner of a subscription must be a superuser." +msgstr "Владельцем подписки должен быть суперпользователь." + +#: commands/subscriptioncmds.c:1513 +#, c-format +msgid "could not receive list of replicated tables from the publisher: %s" msgstr "" -"не удалось подключиться к серверу публикации для удаления слота репликации " -"\"%s\"" +"не удалось получить список реплицируемых таблиц с сервера репликации: %s" -#: commands/subscriptioncmds.c:989 commands/subscriptioncmds.c:1004 -#: replication/logical/tablesync.c:906 replication/logical/tablesync.c:928 +#: commands/subscriptioncmds.c:1578 #, c-format -msgid "The error was: %s" -msgstr "Произошла ошибка: %s" +msgid "" +"could not connect to publisher when attempting to drop replication slot \"%s" +"\": %s" +msgstr "" +"не удалось подключиться к серверу публикации для удаления слота репликации " +"\"%s\": %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:991 +#: commands/subscriptioncmds.c:1581 #, c-format msgid "Use %s to disassociate the subscription from the slot." msgstr "Выполните %s, чтобы отвязать подписку от слота." -#: commands/subscriptioncmds.c:1002 -#, c-format -msgid "could not drop the replication slot \"%s\" on publisher" -msgstr "слот репликации \"%s\" на сервере публикации не был удалён" - -#: commands/subscriptioncmds.c:1007 +#: commands/subscriptioncmds.c:1611 #, c-format -msgid "dropped replication slot \"%s\" on publisher" -msgstr "слот репликации \"%s\" удалён на сервере репликации" +msgid "publication name \"%s\" used more than once" +msgstr "имя публикации \"%s\" используется неоднократно" -#: commands/subscriptioncmds.c:1044 +#: commands/subscriptioncmds.c:1655 #, c-format -msgid "permission denied to change owner of subscription \"%s\"" -msgstr "нет прав на изменение владельца подписки \"%s\"" +msgid "publication \"%s\" is already in subscription \"%s\"" +msgstr "публикация \"%s\" уже имеется в подписке \"%s\"" -#: commands/subscriptioncmds.c:1046 +#: commands/subscriptioncmds.c:1669 #, c-format -msgid "The owner of a subscription must be a superuser." -msgstr "Владельцем подписки должен быть суперпользователь." +msgid "publication \"%s\" is not in subscription \"%s\"" +msgstr "публикация \"%s\" отсутствует в подписке \"%s\"" -#: commands/subscriptioncmds.c:1161 +#: commands/subscriptioncmds.c:1680 #, c-format -msgid "could not receive list of replicated tables from the publisher: %s" -msgstr "" -"не удалось получить список реплицируемых таблиц с сервера репликации: %s" +msgid "cannot drop all the publications from a subscription" +msgstr "удалить все публикации из подписки нельзя" -#: commands/tablecmds.c:228 commands/tablecmds.c:270 +#: commands/tablecmds.c:241 commands/tablecmds.c:283 #, c-format msgid "table \"%s\" does not exist" msgstr "таблица \"%s\" не существует" -#: commands/tablecmds.c:229 commands/tablecmds.c:271 +#: commands/tablecmds.c:242 commands/tablecmds.c:284 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "таблица \"%s\" не существует, пропускается" -#: commands/tablecmds.c:231 commands/tablecmds.c:273 +#: commands/tablecmds.c:244 commands/tablecmds.c:286 msgid "Use DROP TABLE to remove a table." msgstr "Выполните DROP TABLE для удаления таблицы." -#: commands/tablecmds.c:234 +#: commands/tablecmds.c:247 #, c-format msgid "sequence \"%s\" does not exist" msgstr "последовательность \"%s\" не существует" -#: commands/tablecmds.c:235 +#: commands/tablecmds.c:248 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "последовательность \"%s\" не существует, пропускается" -#: commands/tablecmds.c:237 +#: commands/tablecmds.c:250 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "Выполните DROP SEQUENCE для удаления последовательности." -#: commands/tablecmds.c:240 +#: commands/tablecmds.c:253 #, c-format msgid "view \"%s\" does not exist" msgstr "представление \"%s\" не существует" -#: commands/tablecmds.c:241 +#: commands/tablecmds.c:254 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "представление \"%s\" не существует, пропускается" -#: commands/tablecmds.c:243 +#: commands/tablecmds.c:256 msgid "Use DROP VIEW to remove a view." msgstr "Выполните DROP VIEW для удаления представления." -#: commands/tablecmds.c:246 +#: commands/tablecmds.c:259 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "материализованное представление \"%s\" не существует" -#: commands/tablecmds.c:247 +#: commands/tablecmds.c:260 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "материализованное представление \"%s\" не существует, пропускается" -#: commands/tablecmds.c:249 +#: commands/tablecmds.c:262 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "" "Выполните DROP MATERIALIZED VIEW для удаления материализованного " "представления." -#: commands/tablecmds.c:252 commands/tablecmds.c:276 commands/tablecmds.c:17253 -#: parser/parse_utilcmd.c:2196 +#: commands/tablecmds.c:265 commands/tablecmds.c:289 commands/tablecmds.c:18317 +#: parser/parse_utilcmd.c:2247 #, c-format msgid "index \"%s\" does not exist" msgstr "индекс \"%s\" не существует" -#: commands/tablecmds.c:253 commands/tablecmds.c:277 +#: commands/tablecmds.c:266 commands/tablecmds.c:290 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "индекс \"%s\" не существует, пропускается" -#: commands/tablecmds.c:255 commands/tablecmds.c:279 +#: commands/tablecmds.c:268 commands/tablecmds.c:292 msgid "Use DROP INDEX to remove an index." msgstr "Выполните DROP INDEX для удаления индекса." -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:273 #, c-format msgid "\"%s\" is not a type" msgstr "\"%s\" - это не тип" -#: commands/tablecmds.c:261 +#: commands/tablecmds.c:274 msgid "Use DROP TYPE to remove a type." msgstr "Выполните DROP TYPE для удаления типа." -#: commands/tablecmds.c:264 commands/tablecmds.c:12401 -#: commands/tablecmds.c:14860 +#: commands/tablecmds.c:277 commands/tablecmds.c:13067 +#: commands/tablecmds.c:15564 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "сторонняя таблица \"%s\" не существует" -#: commands/tablecmds.c:265 +#: commands/tablecmds.c:278 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "сторонняя таблица \"%s\" не существует, пропускается" -#: commands/tablecmds.c:267 +#: commands/tablecmds.c:280 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Выполните DROP FOREIGN TABLE для удаления сторонней таблицы." -#: commands/tablecmds.c:620 +#: commands/tablecmds.c:663 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT можно использовать только для временных таблиц" -#: commands/tablecmds.c:651 +#: commands/tablecmds.c:694 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "" "в рамках операции с ограничениями по безопасности нельзя создать временную " "таблицу" -#: commands/tablecmds.c:687 commands/tablecmds.c:13764 +#: commands/tablecmds.c:730 commands/tablecmds.c:14351 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "отношение \"%s\" наследуется неоднократно" -#: commands/tablecmds.c:868 +#: commands/tablecmds.c:915 #, c-format msgid "" "specifying a table access method is not supported on a partitioned table" @@ -9837,47 +10174,47 @@ msgstr "" "указание табличного метода доступа для секционированных таблиц не " "поддерживаются" -#: commands/tablecmds.c:964 +#: commands/tablecmds.c:1011 #, c-format msgid "\"%s\" is not partitioned" msgstr "отношение \"%s\" не является секционированным" -#: commands/tablecmds.c:1058 +#: commands/tablecmds.c:1106 #, c-format msgid "cannot partition using more than %d columns" msgstr "число столбцов в ключе секционирования не может превышать %d" -#: commands/tablecmds.c:1114 +#: commands/tablecmds.c:1162 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "создать стороннюю секцию для секционированной таблицы \"%s\" нельзя" -#: commands/tablecmds.c:1116 +#: commands/tablecmds.c:1164 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "Таблица \"%s\" содержит индексы, являющиеся уникальными." -#: commands/tablecmds.c:1279 +#: commands/tablecmds.c:1327 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY не поддерживает удаление нескольких объектов" -#: commands/tablecmds.c:1283 +#: commands/tablecmds.c:1331 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY не поддерживает режим CASCADE" -#: commands/tablecmds.c:1384 +#: commands/tablecmds.c:1432 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "удалить секционированный индекс \"%s\" параллельным способом нельзя" -#: commands/tablecmds.c:1654 +#: commands/tablecmds.c:1704 #, c-format msgid "cannot truncate only a partitioned table" msgstr "опустошить собственно секционированную таблицу нельзя" -#: commands/tablecmds.c:1655 +#: commands/tablecmds.c:1705 #, c-format msgid "" "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions " @@ -9886,34 +10223,39 @@ msgstr "" "Не указывайте ключевое слово ONLY или выполните TRUNCATE ONLY " "непосредственно для секций." -#: commands/tablecmds.c:1724 +#: commands/tablecmds.c:1777 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "опустошение распространяется на таблицу %s" -#: commands/tablecmds.c:2031 +#: commands/tablecmds.c:2127 +#, c-format +msgid "cannot truncate foreign table \"%s\"" +msgstr "опустошить стороннюю таблицу \"%s\" нельзя" + +#: commands/tablecmds.c:2176 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "временные таблицы других сеансов нельзя опустошить" -#: commands/tablecmds.c:2259 commands/tablecmds.c:13661 +#: commands/tablecmds.c:2404 commands/tablecmds.c:14248 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "наследование от секционированной таблицы \"%s\" не допускается" -#: commands/tablecmds.c:2264 +#: commands/tablecmds.c:2409 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "наследование от секции \"%s\" не допускается" -#: commands/tablecmds.c:2272 parser/parse_utilcmd.c:2426 -#: parser/parse_utilcmd.c:2568 +#: commands/tablecmds.c:2417 parser/parse_utilcmd.c:2477 +#: parser/parse_utilcmd.c:2619 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "" "наследуемое отношение \"%s\" не является таблицей или сторонней таблицей" -#: commands/tablecmds.c:2284 +#: commands/tablecmds.c:2429 #, c-format msgid "" "cannot create a temporary relation as partition of permanent relation \"%s\"" @@ -9921,66 +10263,74 @@ msgstr "" "создать временное отношение в качестве секции постоянного отношения \"%s\" " "нельзя" -#: commands/tablecmds.c:2293 commands/tablecmds.c:13640 +#: commands/tablecmds.c:2438 commands/tablecmds.c:14227 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "временное отношение \"%s\" не может наследоваться" -#: commands/tablecmds.c:2303 commands/tablecmds.c:13648 +#: commands/tablecmds.c:2448 commands/tablecmds.c:14235 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "наследование от временного отношения другого сеанса невозможно" -#: commands/tablecmds.c:2357 +#: commands/tablecmds.c:2502 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "слияние нескольких наследованных определений столбца \"%s\"" -#: commands/tablecmds.c:2365 +#: commands/tablecmds.c:2510 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "конфликт типов в наследованном столбце \"%s\"" -#: commands/tablecmds.c:2367 commands/tablecmds.c:2390 -#: commands/tablecmds.c:2639 commands/tablecmds.c:2669 -#: parser/parse_coerce.c:1935 parser/parse_coerce.c:1955 -#: parser/parse_coerce.c:1975 parser/parse_coerce.c:2030 -#: parser/parse_coerce.c:2107 parser/parse_coerce.c:2141 -#: parser/parse_param.c:218 +#: commands/tablecmds.c:2512 commands/tablecmds.c:2535 +#: commands/tablecmds.c:2552 commands/tablecmds.c:2808 +#: commands/tablecmds.c:2838 commands/tablecmds.c:2852 +#: parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 +#: parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 +#: parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 +#: parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 +#: parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 +#: parser/parse_param.c:227 #, c-format msgid "%s versus %s" msgstr "%s и %s" -#: commands/tablecmds.c:2376 +#: commands/tablecmds.c:2521 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "конфликт правил сортировки в наследованном столбце \"%s\"" -#: commands/tablecmds.c:2378 commands/tablecmds.c:2651 -#: commands/tablecmds.c:6108 +#: commands/tablecmds.c:2523 commands/tablecmds.c:2820 +#: commands/tablecmds.c:6526 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "\"%s\" и \"%s\"" -#: commands/tablecmds.c:2388 +#: commands/tablecmds.c:2533 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "конфликт параметров хранения в наследованном столбце \"%s\"" -#: commands/tablecmds.c:2404 +#: commands/tablecmds.c:2550 commands/tablecmds.c:2850 +#, c-format +msgid "column \"%s\" has a compression method conflict" +msgstr "в столбце \"%s\" возник конфликт методов сжатия" + +#: commands/tablecmds.c:2565 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "конфликт свойства генерирования в наследованном столбце \"%s\"" -#: commands/tablecmds.c:2490 commands/tablecmds.c:2545 -#: commands/tablecmds.c:11206 parser/parse_utilcmd.c:1276 -#: parser/parse_utilcmd.c:1319 parser/parse_utilcmd.c:1727 -#: parser/parse_utilcmd.c:1836 +#: commands/tablecmds.c:2659 commands/tablecmds.c:2714 +#: commands/tablecmds.c:11812 parser/parse_utilcmd.c:1291 +#: parser/parse_utilcmd.c:1334 parser/parse_utilcmd.c:1742 +#: parser/parse_utilcmd.c:1850 #, c-format msgid "cannot convert whole-row table reference" msgstr "преобразовать ссылку на тип всей строки таблицы нельзя" -#: commands/tablecmds.c:2491 parser/parse_utilcmd.c:1277 +#: commands/tablecmds.c:2660 parser/parse_utilcmd.c:1292 #, c-format msgid "" "Generation expression for column \"%s\" contains a whole-row reference to " @@ -9989,48 +10339,48 @@ msgstr "" "Генерирующее выражение столбца \"%s\" ссылается на тип всей строки в таблице " "\"%s\"." -#: commands/tablecmds.c:2546 parser/parse_utilcmd.c:1320 +#: commands/tablecmds.c:2715 parser/parse_utilcmd.c:1335 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "Ограничение \"%s\" ссылается на тип всей строки в таблице \"%s\"." -#: commands/tablecmds.c:2625 +#: commands/tablecmds.c:2794 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "слияние столбца \"%s\" с наследованным определением" -#: commands/tablecmds.c:2629 +#: commands/tablecmds.c:2798 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "перемещение и слияние столбца \"%s\" с наследуемым определением" -#: commands/tablecmds.c:2630 +#: commands/tablecmds.c:2799 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "" "Определённый пользователем столбец перемещён в позицию наследуемого столбца." -#: commands/tablecmds.c:2637 +#: commands/tablecmds.c:2806 #, c-format msgid "column \"%s\" has a type conflict" msgstr "конфликт типов в столбце \"%s\"" -#: commands/tablecmds.c:2649 +#: commands/tablecmds.c:2818 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "конфликт правил сортировки в столбце \"%s\"" -#: commands/tablecmds.c:2667 +#: commands/tablecmds.c:2836 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "конфликт параметров хранения в столбце \"%s\"" -#: commands/tablecmds.c:2695 +#: commands/tablecmds.c:2877 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "для дочернего столбца \"%s\" указано генерирующее выражение" -#: commands/tablecmds.c:2697 +#: commands/tablecmds.c:2879 #, c-format msgid "" "Omit the generation expression in the definition of the child table column " @@ -10039,36 +10389,36 @@ msgstr "" "Уберите генерирующее выражение из определения столбца в дочерней таблице, " "чтобы это выражение наследовалось из родительской." -#: commands/tablecmds.c:2701 +#: commands/tablecmds.c:2883 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "" "столбец \"%s\" наследуется от генерируемого столбца, но для него задано " "значение по умолчанию" -#: commands/tablecmds.c:2706 +#: commands/tablecmds.c:2888 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" msgstr "" "столбец \"%s\" наследуется от генерируемого столбца, но для него задано " "свойство идентификации" -#: commands/tablecmds.c:2815 +#: commands/tablecmds.c:2997 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "столбец \"%s\" наследует конфликтующие генерирующие выражения" -#: commands/tablecmds.c:2820 +#: commands/tablecmds.c:3002 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "столбец \"%s\" наследует конфликтующие значения по умолчанию" -#: commands/tablecmds.c:2822 +#: commands/tablecmds.c:3004 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "Для решения конфликта укажите желаемое значение по умолчанию." -#: commands/tablecmds.c:2868 +#: commands/tablecmds.c:3050 #, c-format msgid "" "check constraint name \"%s\" appears multiple times but with different " @@ -10077,12 +10427,17 @@ msgstr "" "имя ограничения-проверки \"%s\" фигурирует несколько раз, но с разными " "выражениями" -#: commands/tablecmds.c:3045 +#: commands/tablecmds.c:3263 +#, c-format +msgid "cannot move temporary tables of other sessions" +msgstr "перемещать временные таблицы других сеансов нельзя" + +#: commands/tablecmds.c:3333 #, c-format msgid "cannot rename column of typed table" msgstr "переименовать столбец типизированной таблицы нельзя" -#: commands/tablecmds.c:3064 +#: commands/tablecmds.c:3352 #, c-format msgid "" "\"%s\" is not a table, view, materialized view, composite type, index, or " @@ -10091,37 +10446,37 @@ msgstr "" "\"%s\" - это не таблица, представление, материализованное представление, " "составной тип, индекс или сторонняя таблица" -#: commands/tablecmds.c:3158 +#: commands/tablecmds.c:3446 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "" "наследованный столбец \"%s\" должен быть также переименован в дочерних " "таблицах" -#: commands/tablecmds.c:3190 +#: commands/tablecmds.c:3478 #, c-format msgid "cannot rename system column \"%s\"" msgstr "нельзя переименовать системный столбец \"%s\"" -#: commands/tablecmds.c:3205 +#: commands/tablecmds.c:3493 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "нельзя переименовать наследованный столбец \"%s\"" -#: commands/tablecmds.c:3357 +#: commands/tablecmds.c:3645 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "" "наследуемое ограничение \"%s\" должно быть также переименовано в дочерних " "таблицах" -#: commands/tablecmds.c:3364 +#: commands/tablecmds.c:3652 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "нельзя переименовать наследованное ограничение \"%s\"" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3597 +#: commands/tablecmds.c:3950 #, c-format msgid "" "cannot %s \"%s\" because it is being used by active queries in this session" @@ -10130,54 +10485,49 @@ msgstr "" "запросами в данном сеансе" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3606 +#: commands/tablecmds.c:3959 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "" "нельзя выполнить %s \"%s\", так как с этим объектом связаны отложенные " "события триггеров" -#: commands/tablecmds.c:4237 commands/tablecmds.c:4252 +#: commands/tablecmds.c:4423 +#, c-format +msgid "cannot alter partition \"%s\" with an incomplete detach" +msgstr "нельзя изменить секцию \"%s\", которая не полностью отсоединена" + +#: commands/tablecmds.c:4616 commands/tablecmds.c:4631 #, c-format msgid "cannot change persistence setting twice" msgstr "изменить характеристику хранения дважды нельзя" -#: commands/tablecmds.c:4971 +#: commands/tablecmds.c:5374 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "перезаписать системное отношение \"%s\" нельзя" -#: commands/tablecmds.c:4977 +#: commands/tablecmds.c:5380 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "перезаписать таблицу \"%s\", используемую как таблицу каталога, нельзя" -#: commands/tablecmds.c:4987 +#: commands/tablecmds.c:5390 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "перезаписывать временные таблицы других сеансов нельзя" -#: commands/tablecmds.c:5276 -#, c-format -msgid "rewriting table \"%s\"" -msgstr "перезапись таблицы \"%s\"" - -#: commands/tablecmds.c:5280 -#, c-format -msgid "verifying table \"%s\"" -msgstr "проверка таблицы \"%s\"" - -#: commands/tablecmds.c:5445 +#: commands/tablecmds.c:5851 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "столбец \"%s\" отношения \"%s\" содержит значения NULL" -#: commands/tablecmds.c:5462 +#: commands/tablecmds.c:5868 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "ограничение-проверку \"%s\" отношения \"%s\" нарушает некоторая строка" -#: commands/tablecmds.c:5481 partitioning/partbounds.c:3225 +#: commands/tablecmds.c:5887 partitioning/partbounds.c:3292 #, c-format msgid "" "updated partition constraint for default partition \"%s\" would be violated " @@ -10186,64 +10536,85 @@ msgstr "" "изменённое ограничение секции для секции по умолчанию \"%s\" будет нарушено " "некоторыми строками" -#: commands/tablecmds.c:5487 +#: commands/tablecmds.c:5893 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "ограничение секции отношения \"%s\" нарушает некоторая строка" -#: commands/tablecmds.c:5634 commands/trigger.c:1200 commands/trigger.c:1306 +#: commands/tablecmds.c:6041 commands/trigger.c:1283 commands/trigger.c:1389 #, c-format msgid "\"%s\" is not a table, view, or foreign table" msgstr "\"%s\" - это не таблица, представление и не сторонняя таблица" -#: commands/tablecmds.c:5637 +#: commands/tablecmds.c:6044 #, c-format msgid "\"%s\" is not a table, view, materialized view, or index" msgstr "" "\"%s\" - это не таблица, представление, материализованное представление или " "индекс" -#: commands/tablecmds.c:5643 +#: commands/tablecmds.c:6050 #, c-format msgid "\"%s\" is not a table, materialized view, or index" msgstr "\"%s\" - это не таблица, материализованное представление или индекс" -#: commands/tablecmds.c:5646 +#: commands/tablecmds.c:6053 +#, c-format +msgid "\"%s\" is not a table, materialized view, index, or partitioned index" +msgstr "" +"\"%s\" - это не таблица, материализованное представление, индекс или " +"секционированный индекс" + +#: commands/tablecmds.c:6056 +#, c-format +msgid "" +"\"%s\" is not a table, materialized view, index, partitioned index, or " +"foreign table" +msgstr "" +"\"%s\" - это не таблица, материализованное представление, индекс, " +"секционированный индекс или сторонняя таблица" + +#: commands/tablecmds.c:6059 #, c-format msgid "\"%s\" is not a table, materialized view, or foreign table" msgstr "" "\"%s\" - это не таблица, материализованное представление или сторонняя " "таблица" -#: commands/tablecmds.c:5649 +#: commands/tablecmds.c:6062 #, c-format msgid "\"%s\" is not a table or foreign table" msgstr "\"%s\" - это не таблица и не сторонняя таблица" -#: commands/tablecmds.c:5652 +#: commands/tablecmds.c:6065 #, c-format msgid "\"%s\" is not a table, composite type, or foreign table" msgstr "\"%s\" - это не таблица, составной тип или сторонняя таблица" -#: commands/tablecmds.c:5655 +#: commands/tablecmds.c:6068 #, c-format msgid "\"%s\" is not a table, materialized view, index, or foreign table" msgstr "" "\"%s\" - это не таблица, материализованное представление, индекс или " "сторонняя таблица" -#: commands/tablecmds.c:5665 +#: commands/tablecmds.c:6071 +#, c-format +msgid "\"%s\" is not a table or partitioned index" +msgstr "\"%s\" - это не таблица и не секционированный индекс" + +#: commands/tablecmds.c:6081 #, c-format msgid "\"%s\" is of the wrong type" msgstr "неправильный тип \"%s\"" -#: commands/tablecmds.c:5868 commands/tablecmds.c:5875 +#: commands/tablecmds.c:6284 commands/tablecmds.c:6291 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "" "изменить тип \"%s\" нельзя, так как он задействован в столбце \"%s.%s\"" -#: commands/tablecmds.c:5882 +#: commands/tablecmds.c:6298 #, c-format msgid "" "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" @@ -10251,77 +10622,77 @@ msgstr "" "изменить стороннюю таблицу \"%s\" нельзя, так как столбец \"%s.%s\" " "задействует тип её строки" -#: commands/tablecmds.c:5889 +#: commands/tablecmds.c:6305 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "" "изменить таблицу \"%s\" нельзя, так как столбец \"%s.%s\" задействует тип её " "строки" -#: commands/tablecmds.c:5945 +#: commands/tablecmds.c:6361 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "изменить тип \"%s\", так как это тип типизированной таблицы" -#: commands/tablecmds.c:5947 +#: commands/tablecmds.c:6363 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "" "Чтобы изменить также типизированные таблицы, выполните ALTER ... CASCADE." -#: commands/tablecmds.c:5993 +#: commands/tablecmds.c:6409 #, c-format msgid "type %s is not a composite type" msgstr "тип %s не является составным" -#: commands/tablecmds.c:6020 +#: commands/tablecmds.c:6436 #, c-format msgid "cannot add column to typed table" msgstr "добавить столбец в типизированную таблицу нельзя" -#: commands/tablecmds.c:6071 +#: commands/tablecmds.c:6489 #, c-format msgid "cannot add column to a partition" msgstr "добавить столбец в секцию нельзя" -#: commands/tablecmds.c:6100 commands/tablecmds.c:13891 +#: commands/tablecmds.c:6518 commands/tablecmds.c:14478 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "дочерняя таблица \"%s\" имеет другой тип для столбца \"%s\"" -#: commands/tablecmds.c:6106 commands/tablecmds.c:13898 +#: commands/tablecmds.c:6524 commands/tablecmds.c:14485 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "" "дочерняя таблица \"%s\" имеет другое правило сортировки для столбца \"%s\"" -#: commands/tablecmds.c:6120 +#: commands/tablecmds.c:6538 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "объединение определений столбца \"%s\" для потомка \"%s\"" -#: commands/tablecmds.c:6163 +#: commands/tablecmds.c:6581 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "" "добавить столбец идентификации в таблицу, у которой есть дочерние, нельзя" -#: commands/tablecmds.c:6400 +#: commands/tablecmds.c:6824 #, c-format msgid "column must be added to child tables too" msgstr "столбец также должен быть добавлен к дочерним таблицам" -#: commands/tablecmds.c:6478 +#: commands/tablecmds.c:6902 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "столбец \"%s\" отношения \"%s\" уже существует, пропускается" -#: commands/tablecmds.c:6485 +#: commands/tablecmds.c:6909 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "столбец \"%s\" отношения \"%s\" уже существует" -#: commands/tablecmds.c:6551 commands/tablecmds.c:10844 +#: commands/tablecmds.c:6975 commands/tablecmds.c:11451 #, c-format msgid "" "cannot remove constraint from only the partitioned table when partitions " @@ -10330,73 +10701,70 @@ msgstr "" "удалить ограничение только из секционированной таблицы, когда существуют " "секции, нельзя" -#: commands/tablecmds.c:6552 commands/tablecmds.c:6856 -#: commands/tablecmds.c:7852 commands/tablecmds.c:10845 +#: commands/tablecmds.c:6976 commands/tablecmds.c:7293 +#: commands/tablecmds.c:8316 commands/tablecmds.c:11452 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Не указывайте ключевое слово ONLY." -#: commands/tablecmds.c:6589 commands/tablecmds.c:6782 -#: commands/tablecmds.c:6924 commands/tablecmds.c:7038 -#: commands/tablecmds.c:7132 commands/tablecmds.c:7191 -#: commands/tablecmds.c:7309 commands/tablecmds.c:7475 -#: commands/tablecmds.c:7545 commands/tablecmds.c:7638 -#: commands/tablecmds.c:10999 commands/tablecmds.c:12424 +#: commands/tablecmds.c:7013 commands/tablecmds.c:7219 +#: commands/tablecmds.c:7361 commands/tablecmds.c:7475 +#: commands/tablecmds.c:7569 commands/tablecmds.c:7628 +#: commands/tablecmds.c:7746 commands/tablecmds.c:7912 +#: commands/tablecmds.c:7982 commands/tablecmds.c:8138 +#: commands/tablecmds.c:11606 commands/tablecmds.c:13090 +#: commands/tablecmds.c:15655 #, c-format msgid "cannot alter system column \"%s\"" msgstr "системный столбец \"%s\" нельзя изменить" -#: commands/tablecmds.c:6595 commands/tablecmds.c:6930 +#: commands/tablecmds.c:7019 commands/tablecmds.c:7367 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "столбец \"%s\" отношения \"%s\" является столбцом идентификации" -#: commands/tablecmds.c:6631 +#: commands/tablecmds.c:7062 #, c-format msgid "column \"%s\" is in a primary key" msgstr "столбец \"%s\" входит в первичный ключ" -#: commands/tablecmds.c:6653 +#: commands/tablecmds.c:7067 +#, c-format +msgid "column \"%s\" is in index used as replica identity" +msgstr "столбец \"%s\" входит в индекс, используемый для идентификации реплики" + +#: commands/tablecmds.c:7090 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "столбец \"%s\" в родительской таблице помечен как NOT NULL" -#: commands/tablecmds.c:6853 commands/tablecmds.c:8311 +#: commands/tablecmds.c:7290 commands/tablecmds.c:8799 #, c-format msgid "constraint must be added to child tables too" msgstr "ограничение также должно быть добавлено к дочерним таблицам" -#: commands/tablecmds.c:6854 +#: commands/tablecmds.c:7291 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "Столбец \"%s\" отношения \"%s\" уже имеет свойство NOT NULL." -#: commands/tablecmds.c:6889 -#, c-format -msgid "" -"existing constraints on column \"%s.%s\" are sufficient to prove that it " -"does not contain nulls" -msgstr "" -"существующие ограничения для столбца \"%s.%s\" гарантируют, что он не " -"содержит NULL" - -#: commands/tablecmds.c:6932 +#: commands/tablecmds.c:7369 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." msgstr "Вместо этого выполните ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." -#: commands/tablecmds.c:6937 +#: commands/tablecmds.c:7374 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "столбец \"%s\" отношения \"%s\" является генерируемым" -#: commands/tablecmds.c:6940 +#: commands/tablecmds.c:7377 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." msgstr "" "Вместо этого выполните ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION." -#: commands/tablecmds.c:7049 +#: commands/tablecmds.c:7486 #, c-format msgid "" "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity " @@ -10405,46 +10773,46 @@ msgstr "" "столбец \"%s\" отношения \"%s\" должен быть объявлен как NOT NULL, чтобы его " "можно было сделать столбцом идентификации" -#: commands/tablecmds.c:7055 +#: commands/tablecmds.c:7492 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "столбец \"%s\" отношения \"%s\" уже является столбцом идентификации" -#: commands/tablecmds.c:7061 +#: commands/tablecmds.c:7498 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "столбец \"%s\" отношения \"%s\" уже имеет значение по умолчанию" -#: commands/tablecmds.c:7138 commands/tablecmds.c:7199 +#: commands/tablecmds.c:7575 commands/tablecmds.c:7636 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "столбец \"%s\" отношения \"%s\" не является столбцом идентификации" -#: commands/tablecmds.c:7204 +#: commands/tablecmds.c:7641 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "" "столбец \"%s\" отношения \"%s\" не является столбцом идентификации, " "пропускается" -#: commands/tablecmds.c:7257 +#: commands/tablecmds.c:7694 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "" "ALTER TABLE / DROP EXPRESSION нужно применять также к дочерним таблицам" -#: commands/tablecmds.c:7279 +#: commands/tablecmds.c:7716 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "нельзя удалить генерирующее выражение из наследуемого столбца" -#: commands/tablecmds.c:7317 +#: commands/tablecmds.c:7754 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "" "столбец \"%s\" отношения \"%s\" не является сохранённым генерируемым столбцом" -#: commands/tablecmds.c:7322 +#: commands/tablecmds.c:7759 #, c-format msgid "" "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" @@ -10452,63 +10820,63 @@ msgstr "" "столбец \"%s\" отношения \"%s\" пропускается, так как не является " "сохранённым генерируемым столбцом" -#: commands/tablecmds.c:7422 +#: commands/tablecmds.c:7859 #, c-format msgid "cannot refer to non-index column by number" msgstr "по номеру можно ссылаться только на столбец в индексе" -#: commands/tablecmds.c:7465 +#: commands/tablecmds.c:7902 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "столбец с номером %d отношения \"%s\" не существует" -#: commands/tablecmds.c:7484 +#: commands/tablecmds.c:7921 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "изменить статистику включённого столбца \"%s\" индекса \"%s\" нельзя" -#: commands/tablecmds.c:7489 +#: commands/tablecmds.c:7926 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "" "изменить статистику столбца \"%s\" (не выражения) индекса \"%s\" нельзя" -#: commands/tablecmds.c:7491 +#: commands/tablecmds.c:7928 #, c-format msgid "Alter statistics on table column instead." msgstr "Вместо этого измените статистику для столбца в таблице." -#: commands/tablecmds.c:7618 +#: commands/tablecmds.c:8118 #, c-format msgid "invalid storage type \"%s\"" msgstr "неверный тип хранилища \"%s\"" -#: commands/tablecmds.c:7650 +#: commands/tablecmds.c:8150 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "тип данных столбца %s совместим только с хранилищем PLAIN" -#: commands/tablecmds.c:7732 +#: commands/tablecmds.c:8195 #, c-format msgid "cannot drop column from typed table" msgstr "нельзя удалить столбец в типизированной таблице" -#: commands/tablecmds.c:7791 +#: commands/tablecmds.c:8254 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "столбец \"%s\" в таблице\"%s\" не существует, пропускается" -#: commands/tablecmds.c:7804 +#: commands/tablecmds.c:8267 #, c-format msgid "cannot drop system column \"%s\"" msgstr "нельзя удалить системный столбец \"%s\"" -#: commands/tablecmds.c:7814 +#: commands/tablecmds.c:8277 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "нельзя удалить наследованный столбец \"%s\"" -#: commands/tablecmds.c:7827 +#: commands/tablecmds.c:8290 #, c-format msgid "" "cannot drop column \"%s\" because it is part of the partition key of " @@ -10517,7 +10885,7 @@ msgstr "" "удалить столбец \"%s\" нельзя, так как он входит в ключ разбиения отношения " "\"%s\"" -#: commands/tablecmds.c:7851 +#: commands/tablecmds.c:8315 #, c-format msgid "" "cannot drop column from only the partitioned table when partitions exist" @@ -10525,7 +10893,7 @@ msgstr "" "удалить столбец только из секционированной таблицы, когда существуют секции, " "нельзя" -#: commands/tablecmds.c:8032 +#: commands/tablecmds.c:8519 #, c-format msgid "" "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned " @@ -10534,14 +10902,14 @@ msgstr "" "ALTER TABLE / ADD CONSTRAINT USING INDEX не поддерживается с " "секционированными таблицами" -#: commands/tablecmds.c:8057 +#: commands/tablecmds.c:8544 #, c-format msgid "" "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "" "ALTER TABLE / ADD CONSTRAINT USING INDEX переименует индекс \"%s\" в \"%s\"" -#: commands/tablecmds.c:8391 +#: commands/tablecmds.c:8879 #, c-format msgid "" "cannot use ONLY for foreign key on partitioned table \"%s\" referencing " @@ -10550,7 +10918,7 @@ msgstr "" "нельзя использовать ONLY для стороннего ключа в секционированной таблице \"%s" "\", ссылающегося на отношение \"%s\"" -#: commands/tablecmds.c:8397 +#: commands/tablecmds.c:8885 #, c-format msgid "" "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing " @@ -10559,25 +10927,25 @@ msgstr "" "нельзя добавить с характеристикой NOT VALID сторонний ключ в " "секционированной таблице \"%s\", ссылающийся на отношение \"%s\"" -#: commands/tablecmds.c:8400 +#: commands/tablecmds.c:8888 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "" "Эта функциональность с секционированными таблицами пока не поддерживается." -#: commands/tablecmds.c:8407 commands/tablecmds.c:8812 +#: commands/tablecmds.c:8895 commands/tablecmds.c:9300 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "указанный объект \"%s\" не является таблицей" -#: commands/tablecmds.c:8430 +#: commands/tablecmds.c:8918 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "" "ограничения в постоянных таблицах могут ссылаться только на постоянные " "таблицы" -#: commands/tablecmds.c:8437 +#: commands/tablecmds.c:8925 #, c-format msgid "" "constraints on unlogged tables may reference only permanent or unlogged " @@ -10586,13 +10954,13 @@ msgstr "" "ограничения в нежурналируемых таблицах могут ссылаться только на постоянные " "или нежурналируемые таблицы" -#: commands/tablecmds.c:8443 +#: commands/tablecmds.c:8931 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "" "ограничения во временных таблицах могут ссылаться только на временные таблицы" -#: commands/tablecmds.c:8447 +#: commands/tablecmds.c:8935 #, c-format msgid "" "constraints on temporary tables must involve temporary tables of this session" @@ -10600,7 +10968,7 @@ msgstr "" "ограничения во временных таблицах должны ссылаться только на временные " "таблицы текущего сеанса" -#: commands/tablecmds.c:8513 commands/tablecmds.c:8519 +#: commands/tablecmds.c:9001 commands/tablecmds.c:9007 #, c-format msgid "" "invalid %s action for foreign key constraint containing generated column" @@ -10608,39 +10976,55 @@ msgstr "" "некорректное действие %s для ограничения внешнего ключа, содержащего " "генерируемый столбец" -#: commands/tablecmds.c:8535 +#: commands/tablecmds.c:9023 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "число столбцов в источнике и назначении внешнего ключа не совпадает" -#: commands/tablecmds.c:8642 +#: commands/tablecmds.c:9130 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "ограничение внешнего ключа \"%s\" нельзя реализовать" -#: commands/tablecmds.c:8644 +#: commands/tablecmds.c:9132 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Столбцы ключа \"%s\" и \"%s\" имеют несовместимые типы: %s и %s." -#: commands/tablecmds.c:9007 commands/tablecmds.c:9400 -#: parser/parse_utilcmd.c:780 parser/parse_utilcmd.c:909 +#: commands/tablecmds.c:9495 commands/tablecmds.c:9888 +#: parser/parse_utilcmd.c:786 parser/parse_utilcmd.c:915 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "ограничения внешнего ключа для сторонних таблиц не поддерживаются" -#: commands/tablecmds.c:9766 commands/tablecmds.c:9929 -#: commands/tablecmds.c:10801 commands/tablecmds.c:10876 +#: commands/tablecmds.c:10255 commands/tablecmds.c:10533 +#: commands/tablecmds.c:11408 commands/tablecmds.c:11483 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "ограничение \"%s\" в таблице \"%s\" не существует" -#: commands/tablecmds.c:9773 +#: commands/tablecmds.c:10262 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "ограничение \"%s\" в таблице \"%s\" не является внешним ключом" -#: commands/tablecmds.c:9937 +#: commands/tablecmds.c:10300 +#, c-format +msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgstr "изменить ограничение \"%s\" таблицы \"%s\" нельзя" + +#: commands/tablecmds.c:10303 +#, c-format +msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." +msgstr "" +"Ограничение \"%s\" является производным от ограничения \"%s\" таблицы \"%s\"." + +#: commands/tablecmds.c:10305 +#, c-format +msgid "You may alter the constraint it derives from, instead." +msgstr "Вместо этого вы можете изменить родительское ограничение." + +#: commands/tablecmds.c:10541 #, c-format msgid "" "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" @@ -10648,46 +11032,46 @@ msgstr "" "ограничение \"%s\" в таблице \"%s\" не является внешним ключом или " "ограничением-проверкой" -#: commands/tablecmds.c:10015 +#: commands/tablecmds.c:10619 #, c-format msgid "constraint must be validated on child tables too" msgstr "ограничение также должно соблюдаться в дочерних таблицах" -#: commands/tablecmds.c:10099 +#: commands/tablecmds.c:10703 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "столбец \"%s\", указанный в ограничении внешнего ключа, не существует" -#: commands/tablecmds.c:10104 +#: commands/tablecmds.c:10708 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "во внешнем ключе не может быть больше %d столбцов" -#: commands/tablecmds.c:10169 +#: commands/tablecmds.c:10773 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "" "использовать откладываемый первичный ключ в целевой внешней таблице \"%s\" " "нельзя" -#: commands/tablecmds.c:10186 +#: commands/tablecmds.c:10790 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "в целевой внешней таблице \"%s\" нет первичного ключа" -#: commands/tablecmds.c:10251 +#: commands/tablecmds.c:10855 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "в списке столбцов внешнего ключа не должно быть повторений" -#: commands/tablecmds.c:10345 +#: commands/tablecmds.c:10949 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "" "использовать откладываемое ограничение уникальности в целевой внешней " "таблице \"%s\" нельзя" -#: commands/tablecmds.c:10350 +#: commands/tablecmds.c:10954 #, c-format msgid "" "there is no unique constraint matching given keys for referenced table \"%s\"" @@ -10695,32 +11079,27 @@ msgstr "" "в целевой внешней таблице \"%s\" нет ограничения уникальности, " "соответствующего данным ключам" -#: commands/tablecmds.c:10438 -#, c-format -msgid "validating foreign key constraint \"%s\"" -msgstr "проверка ограничения внешнего ключа \"%s\"" - -#: commands/tablecmds.c:10757 +#: commands/tablecmds.c:11364 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "удалить наследованное ограничение \"%s\" таблицы \"%s\" нельзя" -#: commands/tablecmds.c:10807 +#: commands/tablecmds.c:11414 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "ограничение \"%s\" в таблице \"%s\" не существует, пропускается" -#: commands/tablecmds.c:10983 +#: commands/tablecmds.c:11590 #, c-format msgid "cannot alter column type of typed table" msgstr "изменить тип столбца в типизированной таблице нельзя" -#: commands/tablecmds.c:11010 +#: commands/tablecmds.c:11617 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "изменить наследованный столбец \"%s\" нельзя" -#: commands/tablecmds.c:11019 +#: commands/tablecmds.c:11626 #, c-format msgid "" "cannot alter column \"%s\" because it is part of the partition key of " @@ -10729,7 +11108,7 @@ msgstr "" "изменить столбец \"%s\" нельзя, так как он входит в ключ разбиения отношения " "\"%s\"" -#: commands/tablecmds.c:11069 +#: commands/tablecmds.c:11676 #, c-format msgid "" "result of USING clause for column \"%s\" cannot be cast automatically to " @@ -10737,45 +11116,45 @@ msgid "" msgstr "" "результат USING для столбца \"%s\" нельзя автоматически привести к типу %s" -#: commands/tablecmds.c:11072 +#: commands/tablecmds.c:11679 #, c-format msgid "You might need to add an explicit cast." msgstr "Возможно, необходимо добавить явное приведение." -#: commands/tablecmds.c:11076 +#: commands/tablecmds.c:11683 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "столбец \"%s\" нельзя автоматически привести к типу %s" # skip-rule: double-colons #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:11079 +#: commands/tablecmds.c:11686 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Возможно, необходимо указать \"USING %s::%s\"." -#: commands/tablecmds.c:11179 +#: commands/tablecmds.c:11785 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "изменить наследованный столбец \"%s\" отношения \"%s\" нельзя" -#: commands/tablecmds.c:11207 +#: commands/tablecmds.c:11813 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "Выражение USING ссылается на тип всей строки таблицы." -#: commands/tablecmds.c:11218 +#: commands/tablecmds.c:11824 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "" "тип наследованного столбца \"%s\" должен быть изменён и в дочерних таблицах" -#: commands/tablecmds.c:11343 +#: commands/tablecmds.c:11949 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "нельзя изменить тип столбца \"%s\" дважды" -#: commands/tablecmds.c:11381 +#: commands/tablecmds.c:11987 #, c-format msgid "" "generation expression for column \"%s\" cannot be cast automatically to type " @@ -10784,166 +11163,156 @@ msgstr "" "генерирующее выражение для столбца \"%s\" нельзя автоматически привести к " "типу %s" -#: commands/tablecmds.c:11386 +#: commands/tablecmds.c:11992 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "" "значение по умолчанию для столбца \"%s\" нельзя автоматически привести к " "типу %s" -#: commands/tablecmds.c:11464 +#: commands/tablecmds.c:12070 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "изменить тип столбца, задействованного в генерируемом столбце, нельзя" -#: commands/tablecmds.c:11465 +#: commands/tablecmds.c:12071 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Столбец \"%s\" используется генерируемым столбцом \"%s\"." -#: commands/tablecmds.c:11486 +#: commands/tablecmds.c:12092 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "" "изменить тип столбца, задействованного в представлении или правиле, нельзя" -#: commands/tablecmds.c:11487 commands/tablecmds.c:11506 -#: commands/tablecmds.c:11524 +#: commands/tablecmds.c:12093 commands/tablecmds.c:12112 +#: commands/tablecmds.c:12130 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s зависит от столбца \"%s\"" -#: commands/tablecmds.c:11505 +#: commands/tablecmds.c:12111 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "изменить тип столбца, задействованного в определении триггера, нельзя" -#: commands/tablecmds.c:11523 +#: commands/tablecmds.c:12129 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "изменить тип столбца, задействованного в определении политики, нельзя" -#: commands/tablecmds.c:12532 commands/tablecmds.c:12544 +#: commands/tablecmds.c:13198 commands/tablecmds.c:13210 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "сменить владельца индекса \"%s\" нельзя" -#: commands/tablecmds.c:12534 commands/tablecmds.c:12546 +#: commands/tablecmds.c:13200 commands/tablecmds.c:13212 #, c-format msgid "Change the ownership of the index's table, instead." msgstr "Однако возможно сменить владельца таблицы, содержащей этот индекс." -#: commands/tablecmds.c:12560 +#: commands/tablecmds.c:13226 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "сменить владельца последовательности \"%s\" нельзя" -#: commands/tablecmds.c:12574 commands/tablecmds.c:15765 +#: commands/tablecmds.c:13240 commands/tablecmds.c:16547 #, c-format msgid "Use ALTER TYPE instead." msgstr "Используйте ALTER TYPE." -#: commands/tablecmds.c:12583 +#: commands/tablecmds.c:13249 #, c-format msgid "\"%s\" is not a table, view, sequence, or foreign table" msgstr "" "\"%s\" - это не таблица, TOAST-таблица, индекс, представление или " "последовательность" -#: commands/tablecmds.c:12923 +#: commands/tablecmds.c:13588 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "в одной инструкции не может быть несколько подкоманд SET TABLESPACE" -#: commands/tablecmds.c:13000 +#: commands/tablecmds.c:13665 #, c-format msgid "\"%s\" is not a table, view, materialized view, index, or TOAST table" msgstr "" "\"%s\" - это не таблица, представление, материализованное представление, " "индекс или TOAST-таблица" -#: commands/tablecmds.c:13033 commands/view.c:494 +#: commands/tablecmds.c:13698 commands/view.c:491 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "" "WITH CHECK OPTION поддерживается только с автообновляемыми представлениями" -#: commands/tablecmds.c:13173 -#, c-format -msgid "cannot move system relation \"%s\"" -msgstr "переместить системную таблицу \"%s\" нельзя" - -#: commands/tablecmds.c:13189 -#, c-format -msgid "cannot move temporary tables of other sessions" -msgstr "перемещать временные таблицы других сеансов нельзя" - -#: commands/tablecmds.c:13363 +#: commands/tablecmds.c:13950 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "" "в табличных пространствах есть только таблицы, индексы и материализованные " "представления" -#: commands/tablecmds.c:13375 +#: commands/tablecmds.c:13962 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "перемещать объекты в/из табличного пространства pg_global нельзя" -#: commands/tablecmds.c:13467 +#: commands/tablecmds.c:14054 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "" "обработка прерывается из-за невозможности заблокировать отношение \"%s.%s\"" -#: commands/tablecmds.c:13483 +#: commands/tablecmds.c:14070 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "в табличном пространстве \"%s\" не найдены подходящие отношения" -#: commands/tablecmds.c:13599 +#: commands/tablecmds.c:14186 #, c-format msgid "cannot change inheritance of typed table" msgstr "изменить наследование типизированной таблицы нельзя" -#: commands/tablecmds.c:13604 commands/tablecmds.c:14100 +#: commands/tablecmds.c:14191 commands/tablecmds.c:14747 #, c-format msgid "cannot change inheritance of a partition" msgstr "изменить наследование секции нельзя" -#: commands/tablecmds.c:13609 +#: commands/tablecmds.c:14196 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "изменить наследование секционированной таблицы нельзя" -#: commands/tablecmds.c:13655 +#: commands/tablecmds.c:14242 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "наследование для временного отношения другого сеанса невозможно" -#: commands/tablecmds.c:13668 +#: commands/tablecmds.c:14255 #, c-format msgid "cannot inherit from a partition" msgstr "наследование от секции невозможно" -#: commands/tablecmds.c:13690 commands/tablecmds.c:16405 +#: commands/tablecmds.c:14277 commands/tablecmds.c:17191 #, c-format msgid "circular inheritance not allowed" msgstr "циклическое наследование недопустимо" -#: commands/tablecmds.c:13691 commands/tablecmds.c:16406 +#: commands/tablecmds.c:14278 commands/tablecmds.c:17192 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" уже является потомком \"%s\"." -#: commands/tablecmds.c:13704 +#: commands/tablecmds.c:14291 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "" "триггер \"%s\" не позволяет таблице \"%s\" стать потомком в иерархии " "наследования" -#: commands/tablecmds.c:13706 +#: commands/tablecmds.c:14293 #, c-format msgid "" "ROW triggers with transition tables are not supported in inheritance " @@ -10952,24 +11321,36 @@ msgstr "" "Триггеры ROW с переходными таблицами не поддерживаются в иерархиях " "наследования." -#: commands/tablecmds.c:13909 +#: commands/tablecmds.c:14496 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "столбец \"%s\" в дочерней таблице должен быть помечен как NOT NULL" -#: commands/tablecmds.c:13936 +#: commands/tablecmds.c:14505 +#, c-format +msgid "column \"%s\" in child table must be a generated column" +msgstr "столбец \"%s\" в дочерней таблице должен быть генерируемым" + +#: commands/tablecmds.c:14555 +#, c-format +msgid "column \"%s\" in child table has a conflicting generation expression" +msgstr "" +"столбец \"%s\" в дочерней таблице содержит конфликтующее генерирующее " +"выражение" + +#: commands/tablecmds.c:14583 #, c-format msgid "child table is missing column \"%s\"" msgstr "в дочерней таблице не хватает столбца \"%s\"" -#: commands/tablecmds.c:14024 +#: commands/tablecmds.c:14671 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "" "дочерняя таблица \"%s\" содержит другое определение ограничения-проверки \"%s" "\"" -#: commands/tablecmds.c:14032 +#: commands/tablecmds.c:14679 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s" @@ -10978,7 +11359,7 @@ msgstr "" "ограничение \"%s\" конфликтует с ненаследуемым ограничением дочерней таблицы " "\"%s\"" -#: commands/tablecmds.c:14043 +#: commands/tablecmds.c:14690 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" @@ -10986,81 +11367,87 @@ msgstr "" "ограничение \"%s\" конфликтует с непроверенным (NOT VALID) ограничением " "дочерней таблицы \"%s\"" -#: commands/tablecmds.c:14078 +#: commands/tablecmds.c:14725 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "в дочерней таблице не хватает ограничения \"%s\"" -#: commands/tablecmds.c:14167 +#: commands/tablecmds.c:14811 +#, c-format +msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" +msgstr "" +"секция \"%s\" уже ожидает отсоединения от секционированной таблицы \"%s.%s\"" + +#: commands/tablecmds.c:14840 commands/tablecmds.c:14888 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "отношение \"%s\" не является секцией отношения \"%s\"" -#: commands/tablecmds.c:14173 +#: commands/tablecmds.c:14894 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "отношение \"%s\" не является предком отношения \"%s\"" -#: commands/tablecmds.c:14401 +#: commands/tablecmds.c:15122 #, c-format msgid "typed tables cannot inherit" msgstr "типизированные таблицы не могут наследоваться" -#: commands/tablecmds.c:14431 +#: commands/tablecmds.c:15152 #, c-format msgid "table is missing column \"%s\"" msgstr "в таблице не хватает столбца \"%s\"" -#: commands/tablecmds.c:14442 +#: commands/tablecmds.c:15163 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "таблица содержит столбец \"%s\", тогда как тип требует \"%s\"" -#: commands/tablecmds.c:14451 +#: commands/tablecmds.c:15172 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "таблица \"%s\" содержит столбец \"%s\" другого типа" -#: commands/tablecmds.c:14465 +#: commands/tablecmds.c:15186 #, c-format msgid "table has extra column \"%s\"" msgstr "таблица содержит лишний столбец \"%s\"" -#: commands/tablecmds.c:14517 +#: commands/tablecmds.c:15238 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" - это не типизированная таблица" -#: commands/tablecmds.c:14699 +#: commands/tablecmds.c:15426 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать неуникальный индекс \"%s\"" -#: commands/tablecmds.c:14705 +#: commands/tablecmds.c:15432 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать не непосредственный индекс \"%s" "\"" -#: commands/tablecmds.c:14711 +#: commands/tablecmds.c:15438 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать индекс с выражением \"%s\"" -#: commands/tablecmds.c:14717 +#: commands/tablecmds.c:15444 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "для идентификации реплики нельзя использовать частичный индекс \"%s\"" -#: commands/tablecmds.c:14723 +#: commands/tablecmds.c:15450 #, c-format msgid "cannot use invalid index \"%s\" as replica identity" msgstr "для идентификации реплики нельзя использовать нерабочий индекс \"%s\"" -#: commands/tablecmds.c:14740 +#: commands/tablecmds.c:15467 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column %d is a " @@ -11069,7 +11456,7 @@ msgstr "" "индекс \"%s\" нельзя использовать для идентификации реплики, так как столбец " "%d - системный" -#: commands/tablecmds.c:14747 +#: commands/tablecmds.c:15474 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column \"%s\" is " @@ -11078,13 +11465,13 @@ msgstr "" "индекс \"%s\" нельзя использовать для идентификации реплики, так как столбец " "\"%s\" допускает NULL" -#: commands/tablecmds.c:14940 +#: commands/tablecmds.c:15721 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "" "изменить состояние журналирования таблицы %s нельзя, так как она временная" -#: commands/tablecmds.c:14964 +#: commands/tablecmds.c:15745 #, c-format msgid "" "cannot change table \"%s\" to unlogged because it is part of a publication" @@ -11092,12 +11479,12 @@ msgstr "" "таблицу \"%s\" нельзя сделать нежурналируемой, так как она включена в " "публикацию" -#: commands/tablecmds.c:14966 +#: commands/tablecmds.c:15747 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Нежурналируемые отношения не поддерживают репликацию." -#: commands/tablecmds.c:15011 +#: commands/tablecmds.c:15792 #, c-format msgid "" "could not change table \"%s\" to logged because it references unlogged table " @@ -11106,7 +11493,7 @@ msgstr "" "не удалось сделать таблицу \"%s\" журналируемой, так как она ссылается на " "нежурналируемую таблицу \"%s\"" -#: commands/tablecmds.c:15021 +#: commands/tablecmds.c:15802 #, c-format msgid "" "could not change table \"%s\" to unlogged because it references logged table " @@ -11115,22 +11502,22 @@ msgstr "" "не удалось сделать таблицу \"%s\" нежурналируемой, так как она ссылается на " "журналируемую таблицу \"%s\"" -#: commands/tablecmds.c:15079 +#: commands/tablecmds.c:15860 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "переместить последовательность с владельцем в другую схему нельзя" -#: commands/tablecmds.c:15185 +#: commands/tablecmds.c:15967 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "отношение \"%s\" уже существует в схеме \"%s\"" -#: commands/tablecmds.c:15748 +#: commands/tablecmds.c:16530 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" - это не составной тип" -#: commands/tablecmds.c:15780 +#: commands/tablecmds.c:16562 #, c-format msgid "" "\"%s\" is not a table, view, materialized view, sequence, or foreign table" @@ -11138,62 +11525,62 @@ msgstr "" "\"%s\" - это не таблица, представление, мат. представление, " "последовательность или сторонняя таблица" -#: commands/tablecmds.c:15815 +#: commands/tablecmds.c:16597 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "нераспознанная стратегия секционирования \"%s\"" -#: commands/tablecmds.c:15823 +#: commands/tablecmds.c:16605 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "стратегия секционирования по списку не поддерживает несколько столбцов" -#: commands/tablecmds.c:15889 +#: commands/tablecmds.c:16671 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "столбец \"%s\", упомянутый в ключе секционирования, не существует" -#: commands/tablecmds.c:15897 +#: commands/tablecmds.c:16679 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "системный столбец \"%s\" нельзя использовать в ключе секционирования" -#: commands/tablecmds.c:15908 commands/tablecmds.c:16022 +#: commands/tablecmds.c:16690 commands/tablecmds.c:16804 #, c-format msgid "cannot use generated column in partition key" msgstr "генерируемый столбец нельзя использовать в ключе секционирования" -#: commands/tablecmds.c:15909 commands/tablecmds.c:16023 commands/trigger.c:641 -#: rewrite/rewriteHandler.c:830 rewrite/rewriteHandler.c:847 +#: commands/tablecmds.c:16691 commands/tablecmds.c:16805 commands/trigger.c:653 +#: rewrite/rewriteHandler.c:907 rewrite/rewriteHandler.c:942 #, c-format msgid "Column \"%s\" is a generated column." msgstr "Столбец \"%s\" является генерируемым." -#: commands/tablecmds.c:15985 +#: commands/tablecmds.c:16767 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "" "функции в выражении ключа секционирования должны быть помечены как IMMUTABLE" -#: commands/tablecmds.c:16005 +#: commands/tablecmds.c:16787 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "" "выражения ключей секционирования не могут содержать ссылки на системный " "столбец" -#: commands/tablecmds.c:16035 +#: commands/tablecmds.c:16817 #, c-format msgid "cannot use constant expression as partition key" msgstr "" "в качестве ключа секционирования нельзя использовать константное выражение" -#: commands/tablecmds.c:16056 +#: commands/tablecmds.c:16838 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "не удалось определить правило сортировки для выражения секционирования" -#: commands/tablecmds.c:16091 +#: commands/tablecmds.c:16873 #, c-format msgid "" "You must specify a hash operator class or define a default hash operator " @@ -11202,7 +11589,7 @@ msgstr "" "Вы должны указать класс операторов хеширования или определить класс " "операторов хеширования по умолчанию для этого типа данных." -#: commands/tablecmds.c:16097 +#: commands/tablecmds.c:16879 #, c-format msgid "" "You must specify a btree operator class or define a default btree operator " @@ -11211,45 +11598,27 @@ msgstr "" "Вы должны указать класс операторов B-дерева или определить класс операторов " "B-дерева по умолчанию для этого типа данных." -#: commands/tablecmds.c:16242 -#, c-format -msgid "" -"partition constraint for table \"%s\" is implied by existing constraints" -msgstr "" -"ограничение секции для таблицы \"%s\" подразумевается существующими " -"ограничениями" - -#: commands/tablecmds.c:16246 partitioning/partbounds.c:3119 -#: partitioning/partbounds.c:3170 -#, c-format -msgid "" -"updated partition constraint for default partition \"%s\" is implied by " -"existing constraints" -msgstr "" -"изменённое ограничение секции для секции по умолчанию \"%s\" подразумевается " -"существующими ограничениями" - -#: commands/tablecmds.c:16345 +#: commands/tablecmds.c:17131 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" уже является секцией" -#: commands/tablecmds.c:16351 +#: commands/tablecmds.c:17137 #, c-format msgid "cannot attach a typed table as partition" msgstr "подключить типизированную таблицу в качестве секции нельзя" -#: commands/tablecmds.c:16367 +#: commands/tablecmds.c:17153 #, c-format msgid "cannot attach inheritance child as partition" msgstr "подключить потомок в иерархии наследования в качестве секции нельзя" -#: commands/tablecmds.c:16381 +#: commands/tablecmds.c:17167 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "подключить родитель в иерархии наследования в качестве секции нельзя" -#: commands/tablecmds.c:16415 +#: commands/tablecmds.c:17201 #, c-format msgid "" "cannot attach a temporary relation as partition of permanent relation \"%s\"" @@ -11257,7 +11626,7 @@ msgstr "" "подключить временное отношение в качестве секции постоянного отношения \"%s" "\" нельзя" -#: commands/tablecmds.c:16423 +#: commands/tablecmds.c:17209 #, c-format msgid "" "cannot attach a permanent relation as partition of temporary relation \"%s\"" @@ -11265,75 +11634,92 @@ msgstr "" "подключить постоянное отношение в качестве секции временного отношения \"%s" "\" нельзя" -#: commands/tablecmds.c:16431 +#: commands/tablecmds.c:17217 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "подключить секцию к временному отношению в другом сеансе нельзя" -#: commands/tablecmds.c:16438 +#: commands/tablecmds.c:17224 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "" "подключить временное отношение из другого сеанса в качестве секции нельзя" -#: commands/tablecmds.c:16458 +#: commands/tablecmds.c:17244 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "" "таблица \"%s\" содержит столбец \"%s\", отсутствующий в родителе \"%s\"" -#: commands/tablecmds.c:16461 +#: commands/tablecmds.c:17247 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "" "Новая секция может содержать только столбцы, имеющиеся в родительской " "таблице." -#: commands/tablecmds.c:16473 +#: commands/tablecmds.c:17259 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "триггер \"%s\" не позволяет сделать таблицу \"%s\" секцией" -#: commands/tablecmds.c:16475 commands/trigger.c:447 +#: commands/tablecmds.c:17261 commands/trigger.c:459 #, c-format msgid "ROW triggers with transition tables are not supported on partitions" msgstr "триггеры ROW с переходными таблицами для секций не поддерживаются" -#: commands/tablecmds.c:16638 +#: commands/tablecmds.c:17440 #, c-format msgid "" "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "" "нельзя присоединить стороннюю таблицу \"%s\" в качестве секции таблицы \"%s\"" -#: commands/tablecmds.c:16641 +#: commands/tablecmds.c:17443 #, c-format -msgid "Table \"%s\" contains unique indexes." -msgstr "Таблица \"%s\" содержит уникальные индексы." +msgid "Partitioned table \"%s\" contains unique indexes." +msgstr "Секционированная таблица \"%s\" содержит уникальные индексы." -#: commands/tablecmds.c:17287 commands/tablecmds.c:17307 -#: commands/tablecmds.c:17327 commands/tablecmds.c:17346 -#: commands/tablecmds.c:17388 +#: commands/tablecmds.c:17763 +#, c-format +msgid "cannot detach partitions concurrently when a default partition exists" +msgstr "" +"секции нельзя отсоединять в режиме CONCURRENTLY, когда существует секция по " +"умолчанию" + +#: commands/tablecmds.c:17872 +#, c-format +msgid "partitioned table \"%s\" was removed concurrently" +msgstr "секционированная таблица \"%s\" была параллельно удалена" + +#: commands/tablecmds.c:17878 +#, c-format +msgid "partition \"%s\" was removed concurrently" +msgstr "секция \"%s\" была параллельно удалена" + +#: commands/tablecmds.c:18351 commands/tablecmds.c:18371 +#: commands/tablecmds.c:18391 commands/tablecmds.c:18410 +#: commands/tablecmds.c:18452 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "нельзя присоединить индекс \"%s\" в качестве секции индекса \"%s\"" -#: commands/tablecmds.c:17290 +#: commands/tablecmds.c:18354 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Индекс \"%s\" уже присоединён к другому индексу." -#: commands/tablecmds.c:17310 +#: commands/tablecmds.c:18374 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Индекс \"%s\" не является индексом какой-либо секции таблицы \"%s\"." -#: commands/tablecmds.c:17330 +#: commands/tablecmds.c:18394 #, c-format msgid "The index definitions do not match." msgstr "Определения индексов не совпадают." -#: commands/tablecmds.c:17349 +#: commands/tablecmds.c:18413 #, c-format msgid "" "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint " @@ -11342,24 +11728,34 @@ msgstr "" "Индекс \"%s\" принадлежит ограничению в таблице \"%s\", но для индекса \"%s" "\" ограничения нет." -#: commands/tablecmds.c:17391 +#: commands/tablecmds.c:18455 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "К секции \"%s\" уже присоединён другой индекс." +#: commands/tablecmds.c:18685 +#, c-format +msgid "column data type %s does not support compression" +msgstr "тим данных столбца %s не поддерживает сжатие" + +#: commands/tablecmds.c:18692 +#, c-format +msgid "invalid compression method \"%s\"" +msgstr "неверный метод сжатия \"%s\"" + #: commands/tablespace.c:162 commands/tablespace.c:179 #: commands/tablespace.c:190 commands/tablespace.c:198 -#: commands/tablespace.c:650 replication/slot.c:1373 storage/file/copydir.c:47 +#: commands/tablespace.c:636 replication/slot.c:1471 storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не удалось создать каталог \"%s\": %m" -#: commands/tablespace.c:209 +#: commands/tablespace.c:209 commands/tablespace.c:631 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "не удалось получить информацию о каталоге \"%s\": %m" -#: commands/tablespace.c:218 +#: commands/tablespace.c:218 commands/tablespace.c:642 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "\"%s\" существует, но это не каталог" @@ -11394,24 +11790,24 @@ msgstr "путь к табличному пространству \"%s\" сли msgid "tablespace location should not be inside the data directory" msgstr "табличное пространство не должно располагаться внутри каталога данных" -#: commands/tablespace.c:305 commands/tablespace.c:977 +#: commands/tablespace.c:305 commands/tablespace.c:973 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "неприемлемое имя табличного пространства: \"%s\"" -#: commands/tablespace.c:307 commands/tablespace.c:978 +#: commands/tablespace.c:307 commands/tablespace.c:974 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "Префикс \"pg_\" зарезервирован для системных табличных пространств." -#: commands/tablespace.c:326 commands/tablespace.c:999 +#: commands/tablespace.c:326 commands/tablespace.c:995 #, c-format msgid "tablespace \"%s\" already exists" msgstr "табличное пространство \"%s\" уже существует" -#: commands/tablespace.c:444 commands/tablespace.c:960 -#: commands/tablespace.c:1049 commands/tablespace.c:1118 -#: commands/tablespace.c:1264 commands/tablespace.c:1467 +#: commands/tablespace.c:444 commands/tablespace.c:956 +#: commands/tablespace.c:1045 commands/tablespace.c:1114 +#: commands/tablespace.c:1260 commands/tablespace.c:1463 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "табличное пространство \"%s\" не существует" @@ -11449,142 +11845,142 @@ msgstr "" msgid "could not set permissions on directory \"%s\": %m" msgstr "не удалось установить права для каталога \"%s\": %m" -#: commands/tablespace.c:645 +#: commands/tablespace.c:647 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "каталог \"%s\" уже используется как табличное пространство" -#: commands/tablespace.c:769 commands/tablespace.c:782 -#: commands/tablespace.c:818 commands/tablespace.c:910 storage/file/fd.c:3108 -#: storage/file/fd.c:3448 +#: commands/tablespace.c:765 commands/tablespace.c:778 +#: commands/tablespace.c:814 commands/tablespace.c:906 storage/file/fd.c:3163 +#: storage/file/fd.c:3559 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "ошибка при удалении каталога \"%s\": %m" -#: commands/tablespace.c:831 commands/tablespace.c:919 +#: commands/tablespace.c:827 commands/tablespace.c:915 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "ошибка при удалении символической ссылки \"%s\": %m" -#: commands/tablespace.c:841 commands/tablespace.c:928 +#: commands/tablespace.c:837 commands/tablespace.c:924 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "\"%s\" - это не каталог или символическая ссылка" -#: commands/tablespace.c:1123 +#: commands/tablespace.c:1119 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "Табличное пространство \"%s\" не существует." -#: commands/tablespace.c:1566 +#: commands/tablespace.c:1562 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "удалить каталоги табличного пространства %u не удалось" -#: commands/tablespace.c:1568 +#: commands/tablespace.c:1564 #, c-format msgid "You can remove the directories manually if necessary." msgstr "При необходимости вы можете удалить их вручную." -#: commands/trigger.c:204 commands/trigger.c:215 +#: commands/trigger.c:216 commands/trigger.c:227 #, c-format msgid "\"%s\" is a table" msgstr "\"%s\" - это таблица" -#: commands/trigger.c:206 commands/trigger.c:217 +#: commands/trigger.c:218 commands/trigger.c:229 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "У таблиц не может быть триггеров INSTEAD OF." -#: commands/trigger.c:238 +#: commands/trigger.c:250 #, c-format msgid "\"%s\" is a partitioned table" msgstr "\"%s\" - секционированная таблица" -#: commands/trigger.c:240 +#: commands/trigger.c:252 #, c-format msgid "Triggers on partitioned tables cannot have transition tables." msgstr "" "Триггеры секционированных таблиц не могут использовать переходные таблицы." -#: commands/trigger.c:252 commands/trigger.c:259 commands/trigger.c:429 +#: commands/trigger.c:264 commands/trigger.c:271 commands/trigger.c:441 #, c-format msgid "\"%s\" is a view" msgstr "\"%s\" - это представление" -#: commands/trigger.c:254 +#: commands/trigger.c:266 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "У представлений не может быть строковых триггеров BEFORE/AFTER." -#: commands/trigger.c:261 +#: commands/trigger.c:273 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "У представлений не может быть триггеров TRUNCATE." -#: commands/trigger.c:269 commands/trigger.c:276 commands/trigger.c:288 -#: commands/trigger.c:422 +#: commands/trigger.c:281 commands/trigger.c:288 commands/trigger.c:300 +#: commands/trigger.c:434 #, c-format msgid "\"%s\" is a foreign table" msgstr "\"%s\" - сторонняя таблица" -#: commands/trigger.c:271 +#: commands/trigger.c:283 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "У сторонних таблиц не может быть триггеров INSTEAD OF." -#: commands/trigger.c:278 +#: commands/trigger.c:290 #, c-format msgid "Foreign tables cannot have TRUNCATE triggers." msgstr "У сторонних таблиц не может быть триггеров TRUNCATE." -#: commands/trigger.c:290 +#: commands/trigger.c:302 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "У сторонних таблиц не может быть ограничивающих триггеров." -#: commands/trigger.c:365 +#: commands/trigger.c:377 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "триггеры TRUNCATE FOR EACH ROW не поддерживаются" -#: commands/trigger.c:373 +#: commands/trigger.c:385 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "триггеры INSTEAD OF должны иметь тип FOR EACH ROW" -#: commands/trigger.c:377 +#: commands/trigger.c:389 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "триггеры INSTEAD OF несовместимы с условиями WHEN" -#: commands/trigger.c:381 +#: commands/trigger.c:393 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "для триггеров INSTEAD OF нельзя задать список столбцов" -#: commands/trigger.c:410 +#: commands/trigger.c:422 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "" "указание переменной типа кортеж в предложении REFERENCING не поддерживается" -#: commands/trigger.c:411 +#: commands/trigger.c:423 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "Используйте OLD TABLE или NEW TABLE для именования переходных таблиц." -#: commands/trigger.c:424 +#: commands/trigger.c:436 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Триггеры сторонних таблиц не могут использовать переходные таблицы." -#: commands/trigger.c:431 +#: commands/trigger.c:443 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Триггеры представлений не могут использовать переходные таблицы." -#: commands/trigger.c:451 +#: commands/trigger.c:463 #, c-format msgid "" "ROW triggers with transition tables are not supported on inheritance children" @@ -11592,17 +11988,17 @@ msgstr "" "триггеры ROW с переходными таблицами для потомков в иерархии наследования не " "поддерживаются" -#: commands/trigger.c:457 +#: commands/trigger.c:469 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "имя переходной таблицы можно задать только для триггера AFTER" -#: commands/trigger.c:462 +#: commands/trigger.c:474 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "триггеры TRUNCATE с переходными таблицами не поддерживаются" -#: commands/trigger.c:479 +#: commands/trigger.c:491 #, c-format msgid "" "transition tables cannot be specified for triggers with more than one event" @@ -11610,100 +12006,112 @@ msgstr "" "переходные таблицы нельзя задать для триггеров, назначаемых для нескольких " "событий" -#: commands/trigger.c:490 +#: commands/trigger.c:502 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "переходные таблицы нельзя задать для триггеров со списками столбцов" -#: commands/trigger.c:507 +#: commands/trigger.c:519 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "NEW TABLE можно задать только для триггеров INSERT или UPDATE" -#: commands/trigger.c:512 +#: commands/trigger.c:524 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE нельзя задать несколько раз" -#: commands/trigger.c:522 +#: commands/trigger.c:534 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE можно задать только для триггеров DELETE или UPDATE" -#: commands/trigger.c:527 +#: commands/trigger.c:539 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE нельзя задать несколько раз" -#: commands/trigger.c:537 +#: commands/trigger.c:549 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "имя OLD TABLE не должно совпадать с именем NEW TABLE" -#: commands/trigger.c:601 commands/trigger.c:614 +#: commands/trigger.c:613 commands/trigger.c:626 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "" "в условии WHEN для операторного триггера нельзя ссылаться на значения " "столбцов" -#: commands/trigger.c:606 +#: commands/trigger.c:618 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "в условии WHEN для триггера INSERT нельзя ссылаться на значения OLD" -#: commands/trigger.c:619 +#: commands/trigger.c:631 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "в условии WHEN для триггера DELETE нельзя ссылаться на значения NEW" -#: commands/trigger.c:624 +#: commands/trigger.c:636 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "" "в условии WHEN для триггера BEFORE нельзя ссылаться на системные столбцы NEW" -#: commands/trigger.c:632 commands/trigger.c:640 +#: commands/trigger.c:644 commands/trigger.c:652 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "" "в условии WHEN для триггера BEFORE нельзя ссылаться на генерируемые столбцы " "NEW" -#: commands/trigger.c:633 +#: commands/trigger.c:645 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "" "Используется ссылка на всю строку таблицы, а таблица содержит генерируемые " "столбцы." -#: commands/trigger.c:780 commands/trigger.c:1385 +#: commands/trigger.c:759 commands/trigger.c:1468 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "триггер \"%s\" для отношения \"%s\" уже существует" -#: commands/trigger.c:1271 commands/trigger.c:1432 commands/trigger.c:1547 +#: commands/trigger.c:773 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is an internal trigger" +msgstr "триггер \"%s\" для отношения \"%s\" не является внутренним" + +#: commands/trigger.c:792 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" +msgstr "" +"триггер \"%s\" для отношения \"%s\" является триггером, реализующим " +"ограничение" + +#: commands/trigger.c:1354 commands/trigger.c:1515 commands/trigger.c:1630 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "триггер \"%s\" для таблицы \"%s\" не существует" -#: commands/trigger.c:1515 +#: commands/trigger.c:1598 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "нет доступа: \"%s\" - это системный триггер" -#: commands/trigger.c:2095 +#: commands/trigger.c:2178 #, c-format msgid "trigger function %u returned null value" msgstr "триггерная функция %u вернула значение NULL" -#: commands/trigger.c:2155 commands/trigger.c:2369 commands/trigger.c:2604 -#: commands/trigger.c:2902 +#: commands/trigger.c:2238 commands/trigger.c:2452 commands/trigger.c:2691 +#: commands/trigger.c:2995 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "триггер BEFORE STATEMENT не может возвращать значение" -#: commands/trigger.c:2229 +#: commands/trigger.c:2312 #, c-format msgid "" "moving row to another partition during a BEFORE FOR EACH ROW trigger is not " @@ -11711,7 +12119,7 @@ msgid "" msgstr "" "в триггере BEFORE FOR EACH ROW нельзя перемещать строку в другую секцию" -#: commands/trigger.c:2230 +#: commands/trigger.c:2313 #, c-format msgid "" "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." @@ -11719,8 +12127,8 @@ msgstr "" "До выполнения триггера \"%s\" строка должна была находиться в секции \"%s.%s" "\"." -#: commands/trigger.c:2968 executor/nodeModifyTable.c:1380 -#: executor/nodeModifyTable.c:1449 +#: commands/trigger.c:3061 executor/nodeModifyTable.c:1824 +#: executor/nodeModifyTable.c:1906 #, c-format msgid "" "tuple to be updated was already modified by an operation triggered by the " @@ -11729,9 +12137,9 @@ msgstr "" "кортеж, который должен быть изменён, уже модифицирован в операции, вызванной " "текущей командой" -#: commands/trigger.c:2969 executor/nodeModifyTable.c:840 -#: executor/nodeModifyTable.c:914 executor/nodeModifyTable.c:1381 -#: executor/nodeModifyTable.c:1450 +#: commands/trigger.c:3062 executor/nodeModifyTable.c:1206 +#: executor/nodeModifyTable.c:1280 executor/nodeModifyTable.c:1825 +#: executor/nodeModifyTable.c:1907 #, c-format msgid "" "Consider using an AFTER trigger instead of a BEFORE trigger to propagate " @@ -11740,139 +12148,139 @@ msgstr "" "Возможно, для распространения изменений в другие строки следует использовать " "триггер AFTER вместо BEFORE." -#: commands/trigger.c:2998 executor/nodeLockRows.c:225 -#: executor/nodeLockRows.c:234 executor/nodeModifyTable.c:220 -#: executor/nodeModifyTable.c:856 executor/nodeModifyTable.c:1397 -#: executor/nodeModifyTable.c:1613 +#: commands/trigger.c:3091 executor/nodeLockRows.c:229 +#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:228 +#: executor/nodeModifyTable.c:1222 executor/nodeModifyTable.c:1842 +#: executor/nodeModifyTable.c:2072 #, c-format msgid "could not serialize access due to concurrent update" msgstr "не удалось сериализовать доступ из-за параллельного изменения" -#: commands/trigger.c:3006 executor/nodeModifyTable.c:946 -#: executor/nodeModifyTable.c:1467 executor/nodeModifyTable.c:1637 +#: commands/trigger.c:3099 executor/nodeModifyTable.c:1312 +#: executor/nodeModifyTable.c:1924 executor/nodeModifyTable.c:2096 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "не удалось сериализовать доступ из-за параллельного удаления" -#: commands/trigger.c:4065 +#: commands/trigger.c:4160 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "" "в рамках операции с ограничениями по безопасности нельзя вызвать отложенный " "триггер" -#: commands/trigger.c:5078 +#: commands/trigger.c:5203 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "ограничение \"%s\" не является откладываемым" -#: commands/trigger.c:5101 +#: commands/trigger.c:5226 #, c-format msgid "constraint \"%s\" does not exist" msgstr "ограничение \"%s\" не существует" -#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:683 +#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:635 #, c-format msgid "function %s should return type %s" msgstr "функция %s должна возвращать тип %s" -#: commands/tsearchcmds.c:195 +#: commands/tsearchcmds.c:194 #, c-format msgid "must be superuser to create text search parsers" msgstr "" "для создания анализаторов текстового поиска нужно быть суперпользователем" -#: commands/tsearchcmds.c:248 +#: commands/tsearchcmds.c:247 #, c-format msgid "text search parser parameter \"%s\" not recognized" msgstr "параметр анализатора текстового поиска \"%s\" не распознан" -#: commands/tsearchcmds.c:258 +#: commands/tsearchcmds.c:257 #, c-format msgid "text search parser start method is required" msgstr "для анализатора текстового поиска требуется метод start" -#: commands/tsearchcmds.c:263 +#: commands/tsearchcmds.c:262 #, c-format msgid "text search parser gettoken method is required" msgstr "для анализатора текстового поиска требуется метод gettoken" -#: commands/tsearchcmds.c:268 +#: commands/tsearchcmds.c:267 #, c-format msgid "text search parser end method is required" msgstr "для анализатора текстового поиска требуется метод end" -#: commands/tsearchcmds.c:273 +#: commands/tsearchcmds.c:272 #, c-format msgid "text search parser lextypes method is required" msgstr "для анализатора текстового поиска требуется метод lextypes" -#: commands/tsearchcmds.c:390 +#: commands/tsearchcmds.c:366 #, c-format msgid "text search template \"%s\" does not accept options" msgstr "шаблон текстового поиска \"%s\" не принимает параметры" -#: commands/tsearchcmds.c:464 +#: commands/tsearchcmds.c:440 #, c-format msgid "text search template is required" msgstr "требуется шаблон текстового поиска" -#: commands/tsearchcmds.c:750 +#: commands/tsearchcmds.c:701 #, c-format msgid "must be superuser to create text search templates" msgstr "для создания шаблонов текстового поиска нужно быть суперпользователем" -#: commands/tsearchcmds.c:792 +#: commands/tsearchcmds.c:743 #, c-format msgid "text search template parameter \"%s\" not recognized" msgstr "параметр шаблона текстового поиска \"%s\" не распознан" -#: commands/tsearchcmds.c:802 +#: commands/tsearchcmds.c:753 #, c-format msgid "text search template lexize method is required" msgstr "для шаблона текстового поиска требуется метод lexize" -#: commands/tsearchcmds.c:1006 +#: commands/tsearchcmds.c:933 #, c-format msgid "text search configuration parameter \"%s\" not recognized" msgstr "параметр конфигурации текстового поиска \"%s\" не распознан" -#: commands/tsearchcmds.c:1013 +#: commands/tsearchcmds.c:940 #, c-format msgid "cannot specify both PARSER and COPY options" msgstr "указать и PARSER, и COPY одновременно нельзя" -#: commands/tsearchcmds.c:1049 +#: commands/tsearchcmds.c:976 #, c-format msgid "text search parser is required" msgstr "требуется анализатор текстового поиска" -#: commands/tsearchcmds.c:1273 +#: commands/tsearchcmds.c:1200 #, c-format msgid "token type \"%s\" does not exist" msgstr "тип фрагмента \"%s\" не существует" -#: commands/tsearchcmds.c:1500 +#: commands/tsearchcmds.c:1427 #, c-format msgid "mapping for token type \"%s\" does not exist" msgstr "сопоставление для типа фрагмента \"%s\" не существует" -#: commands/tsearchcmds.c:1506 +#: commands/tsearchcmds.c:1433 #, c-format msgid "mapping for token type \"%s\" does not exist, skipping" msgstr "сопоставление для типа фрагмента \"%s\" не существует, пропускается" -#: commands/tsearchcmds.c:1669 commands/tsearchcmds.c:1784 +#: commands/tsearchcmds.c:1596 commands/tsearchcmds.c:1711 #, c-format msgid "invalid parameter list format: \"%s\"" msgstr "неверный формат списка параметров: \"%s\"" -#: commands/typecmds.c:206 +#: commands/typecmds.c:217 #, c-format msgid "must be superuser to create a base type" msgstr "для создания базового типа нужно быть суперпользователем" -#: commands/typecmds.c:264 +#: commands/typecmds.c:275 #, c-format msgid "" "Create the type as a shell type, then create its I/O functions, then do a " @@ -11881,42 +12289,42 @@ msgstr "" "Создайте тип в виде оболочки, затем определите для него функции ввода-вывода " "и в завершение выполните полноценную команду CREATE TYPE." -#: commands/typecmds.c:314 commands/typecmds.c:1394 commands/typecmds.c:3832 +#: commands/typecmds.c:327 commands/typecmds.c:1465 commands/typecmds.c:4281 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "атрибут типа \"%s\" не распознан" -#: commands/typecmds.c:370 +#: commands/typecmds.c:385 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "неверная категория типа \"%s\": допустим только ASCII-символ" -#: commands/typecmds.c:389 +#: commands/typecmds.c:404 #, c-format msgid "array element type cannot be %s" msgstr "типом элемента массива не может быть %s" -#: commands/typecmds.c:421 +#: commands/typecmds.c:436 #, c-format msgid "alignment \"%s\" not recognized" msgstr "тип выравнивания \"%s\" не распознан" -#: commands/typecmds.c:438 commands/typecmds.c:3718 +#: commands/typecmds.c:453 commands/typecmds.c:4155 #, c-format msgid "storage \"%s\" not recognized" msgstr "неизвестная стратегия хранения \"%s\"" -#: commands/typecmds.c:449 +#: commands/typecmds.c:464 #, c-format msgid "type input function must be specified" msgstr "необходимо указать функцию ввода типа" -#: commands/typecmds.c:453 +#: commands/typecmds.c:468 #, c-format msgid "type output function must be specified" msgstr "необходимо указать функцию вывода типа" -#: commands/typecmds.c:458 +#: commands/typecmds.c:473 #, c-format msgid "" "type modifier output function is useless without a type modifier input " @@ -11925,83 +12333,89 @@ msgstr "" "функция вывода модификатора типа бесполезна без функции ввода модификатора " "типа" -#: commands/typecmds.c:745 +#: commands/typecmds.c:515 +#, c-format +msgid "element type cannot be specified without a subscripting function" +msgstr "" +"тип элемента нельзя задать без указания обработчика обращения по индексу" + +#: commands/typecmds.c:784 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "\"%s\" - неподходящий базовый тип для домена" -#: commands/typecmds.c:837 +#: commands/typecmds.c:882 #, c-format msgid "multiple default expressions" msgstr "неоднократное определение значения типа по умолчанию" -#: commands/typecmds.c:900 commands/typecmds.c:909 +#: commands/typecmds.c:945 commands/typecmds.c:954 #, c-format msgid "conflicting NULL/NOT NULL constraints" msgstr "конфликтующие ограничения NULL/NOT NULL" -#: commands/typecmds.c:925 +#: commands/typecmds.c:970 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "" "ограничения-проверки для доменов не могут иметь характеристики NO INHERIT" -#: commands/typecmds.c:934 commands/typecmds.c:2536 +#: commands/typecmds.c:979 commands/typecmds.c:2975 #, c-format msgid "unique constraints not possible for domains" msgstr "ограничения уникальности невозможны для доменов" -#: commands/typecmds.c:940 commands/typecmds.c:2542 +#: commands/typecmds.c:985 commands/typecmds.c:2981 #, c-format msgid "primary key constraints not possible for domains" msgstr "ограничения первичного ключа невозможны для доменов" -#: commands/typecmds.c:946 commands/typecmds.c:2548 +#: commands/typecmds.c:991 commands/typecmds.c:2987 #, c-format msgid "exclusion constraints not possible for domains" msgstr "ограничения-исключения невозможны для доменов" -#: commands/typecmds.c:952 commands/typecmds.c:2554 +#: commands/typecmds.c:997 commands/typecmds.c:2993 #, c-format msgid "foreign key constraints not possible for domains" msgstr "ограничения внешних ключей невозможны для доменов" -#: commands/typecmds.c:961 commands/typecmds.c:2563 +#: commands/typecmds.c:1006 commands/typecmds.c:3002 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "" "возможность определения отложенных ограничений для доменов не поддерживается" -#: commands/typecmds.c:1271 utils/cache/typcache.c:2430 +#: commands/typecmds.c:1320 utils/cache/typcache.c:2566 #, c-format msgid "%s is not an enum" msgstr "\"%s\" не является перечислением" -#: commands/typecmds.c:1402 +#: commands/typecmds.c:1473 #, c-format msgid "type attribute \"subtype\" is required" msgstr "требуется атрибут типа \"subtype\"" -#: commands/typecmds.c:1407 +#: commands/typecmds.c:1478 #, c-format msgid "range subtype cannot be %s" msgstr "%s не может быть подтипом диапазона" -#: commands/typecmds.c:1426 +#: commands/typecmds.c:1497 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "" "указано правило сортировки для диапазона, но подтип не поддерживает " "сортировку" -#: commands/typecmds.c:1436 +#: commands/typecmds.c:1507 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "" "функцию получения канонического диапазона нельзя задать без предварительно " "созданного типа-пустышки" -#: commands/typecmds.c:1437 +#: commands/typecmds.c:1508 #, c-format msgid "" "Create the type as a shell type, then create its canonicalization function, " @@ -12010,82 +12424,96 @@ msgstr "" "Создайте тип в виде оболочки, затем определите для него функции приведения к " "каноническому виду и в завершение выполните полноценную команду CREATE TYPE." -#: commands/typecmds.c:1648 +#: commands/typecmds.c:1981 #, c-format msgid "type input function %s has multiple matches" msgstr "функция ввода типа %s присутствует в нескольких экземплярах" -#: commands/typecmds.c:1666 +#: commands/typecmds.c:1999 #, c-format msgid "type input function %s must return type %s" msgstr "функция ввода типа %s должна возвращать тип %s" -#: commands/typecmds.c:1682 +#: commands/typecmds.c:2015 #, c-format msgid "type input function %s should not be volatile" msgstr "функция ввода типа %s не должна быть изменчивой" -#: commands/typecmds.c:1710 +#: commands/typecmds.c:2043 #, c-format msgid "type output function %s must return type %s" msgstr "функция вывода типа %s должна возвращать тип %s" -#: commands/typecmds.c:1717 +#: commands/typecmds.c:2050 #, c-format msgid "type output function %s should not be volatile" msgstr "функция вывода типа %s не должна быть изменчивой" -#: commands/typecmds.c:1746 +#: commands/typecmds.c:2079 #, c-format msgid "type receive function %s has multiple matches" msgstr "функция получения типа %s присутствует в нескольких экземплярах" -#: commands/typecmds.c:1764 +#: commands/typecmds.c:2097 #, c-format msgid "type receive function %s must return type %s" msgstr "функция получения типа %s должна возвращать тип %s" -#: commands/typecmds.c:1771 +#: commands/typecmds.c:2104 #, c-format msgid "type receive function %s should not be volatile" msgstr "функция получения типа %s не должна быть изменчивой" -#: commands/typecmds.c:1799 +#: commands/typecmds.c:2132 #, c-format msgid "type send function %s must return type %s" msgstr "функция отправки типа %s должна возвращать тип %s" -#: commands/typecmds.c:1806 +#: commands/typecmds.c:2139 #, c-format msgid "type send function %s should not be volatile" msgstr "функция отправки типа %s не должна быть изменчивой" -#: commands/typecmds.c:1833 +#: commands/typecmds.c:2166 #, c-format msgid "typmod_in function %s must return type %s" msgstr "функция TYPMOD_IN %s должна возвращать тип %s" -#: commands/typecmds.c:1840 +#: commands/typecmds.c:2173 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "функция ввода модификатора типа %s не должна быть изменчивой" -#: commands/typecmds.c:1867 +#: commands/typecmds.c:2200 #, c-format msgid "typmod_out function %s must return type %s" msgstr "функция TYPMOD_OUT %s должна возвращать тип %s" -#: commands/typecmds.c:1874 +#: commands/typecmds.c:2207 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "функция вывода модификатора типа %s не должна быть изменчивой" -#: commands/typecmds.c:1901 +#: commands/typecmds.c:2234 +#, c-format +msgid "type analyze function %s must return type %s" +msgstr "функция анализа типа %s должна возвращать тип %s" + +#: commands/typecmds.c:2263 +#, c-format +msgid "type subscripting function %s must return type %s" +msgstr "" +"функция %s, реализующая для типа обращение по индексу, должна возвращать тип " +"%s" + +#: commands/typecmds.c:2273 #, c-format -msgid "type analyze function %s must return type %s" -msgstr "функция анализа типа %s должна возвращать тип %s" +msgid "user-defined types cannot use subscripting function %s" +msgstr "" +"для пользовательских типов нельзя использовать функцию-обработчик обращения " +"по индексу %s" -#: commands/typecmds.c:1947 +#: commands/typecmds.c:2319 #, c-format msgid "" "You must specify an operator class for the range type or define a default " @@ -12094,121 +12522,135 @@ msgstr "" "Вы должны указать класс операторов для типа диапазона или определить класс " "операторов по умолчанию для этого подтипа." -#: commands/typecmds.c:1978 +#: commands/typecmds.c:2350 #, c-format msgid "range canonical function %s must return range type" msgstr "" "функция получения канонического диапазона %s должна возвращать диапазон" -#: commands/typecmds.c:1984 +#: commands/typecmds.c:2356 #, c-format msgid "range canonical function %s must be immutable" msgstr "" "функция получения канонического диапазона %s должна быть постоянной " "(IMMUTABLE)" -#: commands/typecmds.c:2020 +#: commands/typecmds.c:2392 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "функция различий для подтипа диапазона (%s) должна возвращать тип %s" -#: commands/typecmds.c:2027 +#: commands/typecmds.c:2399 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "" "функция различий для подтипа диапазона (%s) должна быть постоянной " "(IMMUTABLE)" -#: commands/typecmds.c:2054 +#: commands/typecmds.c:2426 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "значение OID массива в pg_type не задано в режиме двоичного обновления" -#: commands/typecmds.c:2352 +#: commands/typecmds.c:2459 +#, c-format +msgid "pg_type multirange OID value not set when in binary upgrade mode" +msgstr "" +"значение OID мультидиапазона в pg_type не задано в режиме двоичного " +"обновления" + +#: commands/typecmds.c:2492 +#, c-format +msgid "pg_type multirange array OID value not set when in binary upgrade mode" +msgstr "" +"значение OID массива мультидиапазонов в pg_type не задано в режиме двоичного " +"обновления" + +#: commands/typecmds.c:2791 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "столбец \"%s\" таблицы \"%s\" содержит значения NULL" -#: commands/typecmds.c:2465 commands/typecmds.c:2667 +#: commands/typecmds.c:2904 commands/typecmds.c:3106 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "ограничение \"%s\" для домена \"%s\" не существует" -#: commands/typecmds.c:2469 +#: commands/typecmds.c:2908 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "ограничение \"%s\" для домена \"%s\" не существует, пропускается" -#: commands/typecmds.c:2674 +#: commands/typecmds.c:3113 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "" "ограничение \"%s\" для домена \"%s\" не является ограничением-проверкой" -#: commands/typecmds.c:2780 +#: commands/typecmds.c:3219 #, c-format msgid "" "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "" "столбец \"%s\" таблицы \"%s\" содержит значения, нарушающие новое ограничение" -#: commands/typecmds.c:3009 commands/typecmds.c:3207 commands/typecmds.c:3289 -#: commands/typecmds.c:3476 +#: commands/typecmds.c:3448 commands/typecmds.c:3646 commands/typecmds.c:3727 +#: commands/typecmds.c:3913 #, c-format msgid "%s is not a domain" msgstr "\"%s\" - это не домен" -#: commands/typecmds.c:3041 +#: commands/typecmds.c:3480 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "ограничение \"%s\" для домена \"%s\" уже существует" -#: commands/typecmds.c:3092 +#: commands/typecmds.c:3531 #, c-format msgid "cannot use table references in domain check constraint" msgstr "в ограничении-проверке для домена нельзя ссылаться на таблицы" -#: commands/typecmds.c:3219 commands/typecmds.c:3301 commands/typecmds.c:3593 +#: commands/typecmds.c:3658 commands/typecmds.c:3739 commands/typecmds.c:4030 #, c-format msgid "%s is a table's row type" msgstr "%s - это тип строк таблицы" -#: commands/typecmds.c:3221 commands/typecmds.c:3303 commands/typecmds.c:3595 +#: commands/typecmds.c:3660 commands/typecmds.c:3741 commands/typecmds.c:4032 #, c-format msgid "Use ALTER TABLE instead." msgstr "Изменить его можно с помощью ALTER TABLE." -#: commands/typecmds.c:3228 commands/typecmds.c:3310 commands/typecmds.c:3508 +#: commands/typecmds.c:3666 commands/typecmds.c:3747 commands/typecmds.c:3945 #, c-format msgid "cannot alter array type %s" msgstr "изменить тип массива \"%s\" нельзя" -#: commands/typecmds.c:3230 commands/typecmds.c:3312 commands/typecmds.c:3510 +#: commands/typecmds.c:3668 commands/typecmds.c:3749 commands/typecmds.c:3947 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "Однако можно изменить тип %s, что повлечёт изменение типа массива." -#: commands/typecmds.c:3578 +#: commands/typecmds.c:4015 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "тип \"%s\" уже существует в схеме \"%s\"" -#: commands/typecmds.c:3746 +#: commands/typecmds.c:4183 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "сменить вариант хранения типа на PLAIN нельзя" -#: commands/typecmds.c:3827 +#: commands/typecmds.c:4276 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "у типа нельзя изменить атрибут \"%s\"" -#: commands/typecmds.c:3845 +#: commands/typecmds.c:4294 #, c-format msgid "must be superuser to alter a type" msgstr "для модификации типа нужно быть суперпользователем" -#: commands/typecmds.c:3866 commands/typecmds.c:3876 +#: commands/typecmds.c:4315 commands/typecmds.c:4324 #, c-format msgid "%s is not a base type" msgstr "%s — не базовый тип" @@ -12228,10 +12670,12 @@ msgstr "для создания суперпользователей нужно msgid "must be superuser to create replication users" msgstr "для создания пользователей-репликаторов нужно быть суперпользователем" -#: commands/user.c:308 commands/user.c:736 +#: commands/user.c:308 #, c-format -msgid "must be superuser to change bypassrls attribute" -msgstr "для изменения атрибута bypassrls нужно быть суперпользователем" +msgid "must be superuser to create bypassrls users" +msgstr "" +"для создания пользователей c атрибутом bypassrls нужно быть " +"суперпользователем" #: commands/user.c:315 #, c-format @@ -12239,7 +12683,7 @@ msgid "permission denied to create role" msgstr "нет прав для создания роли" #: commands/user.c:325 commands/user.c:1226 commands/user.c:1233 -#: utils/adt/acl.c:5330 utils/adt/acl.c:5336 gram.y:15147 gram.y:15185 +#: utils/adt/acl.c:5248 utils/adt/acl.c:5254 gram.y:15259 gram.y:15304 #, c-format msgid "role name \"%s\" is reserved" msgstr "имя роли \"%s\" зарезервировано" @@ -12264,23 +12708,38 @@ msgstr "пустая строка не является допустимым п msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "значение OID в pg_authid не задано в режиме двоичного обновления" -#: commands/user.c:722 commands/user.c:946 commands/user.c:1487 -#: commands/user.c:1629 +# skip-rule: translate-superuser +#: commands/user.c:722 #, c-format -msgid "must be superuser to alter superusers" -msgstr "для модификации суперпользователей нужно быть суперпользователем" +msgid "" +"must be superuser to alter superuser roles or change superuser attribute" +msgstr "" +"для модификации ролей суперпользователей или изменения атрибута superuser " +"нужно быть суперпользователем" #: commands/user.c:729 #, c-format -msgid "must be superuser to alter replication users" +msgid "" +"must be superuser to alter replication roles or change replication attribute" msgstr "" -"для модификации пользователей-репликаторов нужно быть суперпользователем" +"для модификации ролей репликации или изменения атрибута replication нужно " +"быть суперпользователем" + +#: commands/user.c:736 +#, c-format +msgid "must be superuser to change bypassrls attribute" +msgstr "для изменения атрибута bypassrls нужно быть суперпользователем" #: commands/user.c:752 commands/user.c:953 #, c-format msgid "permission denied" msgstr "нет доступа" +#: commands/user.c:946 commands/user.c:1487 commands/user.c:1665 +#, c-format +msgid "must be superuser to alter superusers" +msgstr "для модификации суперпользователей нужно быть суперпользователем" + #: commands/user.c:983 #, c-format msgid "must be superuser to alter settings globally" @@ -12296,9 +12755,10 @@ msgstr "нет прав для удаления роли" msgid "cannot use special role specifier in DROP ROLE" msgstr "использовать специальную роль в DROP ROLE нельзя" -#: commands/user.c:1040 commands/user.c:1197 commands/variable.c:770 -#: commands/variable.c:844 utils/adt/acl.c:5187 utils/adt/acl.c:5234 -#: utils/adt/acl.c:5262 utils/adt/acl.c:5280 utils/init/miscinit.c:675 +#: commands/user.c:1040 commands/user.c:1197 commands/variable.c:778 +#: commands/variable.c:781 commands/variable.c:865 commands/variable.c:868 +#: utils/adt/acl.c:5103 utils/adt/acl.c:5151 utils/adt/acl.c:5179 +#: utils/adt/acl.c:5198 utils/init/miscinit.c:705 #, c-format msgid "role \"%s\" does not exist" msgstr "роль \"%s\" не существует" @@ -12368,138 +12828,154 @@ msgstr "нет прав на удаление объектов" msgid "permission denied to reassign objects" msgstr "нет прав для переназначения объектов" -#: commands/user.c:1495 commands/user.c:1637 +#: commands/user.c:1495 commands/user.c:1673 #, c-format msgid "must have admin option on role \"%s\"" msgstr "требуется право admin для роли \"%s\"" -#: commands/user.c:1512 +#: commands/user.c:1509 +#, c-format +msgid "role \"%s\" cannot have explicit members" +msgstr "роль \"%s\" не может содержать явных членов" + +#: commands/user.c:1524 #, c-format msgid "must be superuser to set grantor" msgstr "для назначения права управления правами нужно быть суперпользователем" -#: commands/user.c:1537 +#: commands/user.c:1560 +#, c-format +msgid "role \"%s\" cannot be a member of any role" +msgstr "роль \"%s\" не может быть членом другой роли" + +#: commands/user.c:1573 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "роль \"%s\" включена в роль \"%s\"" -#: commands/user.c:1552 +#: commands/user.c:1588 #, c-format msgid "role \"%s\" is already a member of role \"%s\"" msgstr "роль \"%s\" уже включена в роль \"%s\"" -#: commands/user.c:1659 +#: commands/user.c:1695 #, c-format msgid "role \"%s\" is not a member of role \"%s\"" msgstr "роль \"%s\" не включена в роль \"%s\"" -#: commands/vacuum.c:129 +#: commands/vacuum.c:132 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "нераспознанный параметр ANALYZE: \"%s\"" -#: commands/vacuum.c:151 +#: commands/vacuum.c:170 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "для параметра parallel требуется значение от 0 до %d" -#: commands/vacuum.c:163 +#: commands/vacuum.c:182 #, c-format -msgid "parallel vacuum degree must be between 0 and %d" -msgstr "степень параллельности для очистки должна задаваться числом от 0 до %d" +msgid "parallel workers for vacuum must be between 0 and %d" +msgstr "" +"число параллельных исполнителей для выполнения очистки должно быть от 0 до %d" -#: commands/vacuum.c:180 +#: commands/vacuum.c:199 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "нераспознанный параметр VACUUM: \"%s\"" -#: commands/vacuum.c:203 +#: commands/vacuum.c:222 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULL нельзя выполнять в параллельном режиме" -#: commands/vacuum.c:219 +#: commands/vacuum.c:238 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "если задаётся список столбцов, необходимо указать ANALYZE" -#: commands/vacuum.c:309 +#: commands/vacuum.c:328 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s нельзя выполнить в ходе VACUUM или ANALYZE" -#: commands/vacuum.c:319 +#: commands/vacuum.c:338 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "Параметр VACUUM DISABLE_PAGE_SKIPPING нельзя использовать с FULL" -#: commands/vacuum.c:560 +#: commands/vacuum.c:345 +#, c-format +msgid "PROCESS_TOAST required with VACUUM FULL" +msgstr "VACUUM FULL работает только с PROCESS_TOAST" + +#: commands/vacuum.c:586 #, c-format msgid "skipping \"%s\" --- only superuser can vacuum it" msgstr "" "\"%s\" пропускается --- только суперпользователь может очистить эту таблицу" -#: commands/vacuum.c:564 +#: commands/vacuum.c:590 #, c-format msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" msgstr "" "пропускается \"%s\" --- только суперпользователь или владелец БД может " "очистить эту таблицу" -#: commands/vacuum.c:568 +#: commands/vacuum.c:594 #, c-format msgid "skipping \"%s\" --- only table or database owner can vacuum it" msgstr "" "\"%s\" пропускается --- только владелец базы данных или этой таблицы может " "очистить её" -#: commands/vacuum.c:583 +#: commands/vacuum.c:609 #, c-format msgid "skipping \"%s\" --- only superuser can analyze it" msgstr "" "\"%s\" пропускается --- только суперпользователь может анализировать этот " "объект" -#: commands/vacuum.c:587 +#: commands/vacuum.c:613 #, c-format msgid "skipping \"%s\" --- only superuser or database owner can analyze it" msgstr "" "\"%s\" пропускается --- только суперпользователь или владелец БД может " "анализировать этот объект" -#: commands/vacuum.c:591 +#: commands/vacuum.c:617 #, c-format msgid "skipping \"%s\" --- only table or database owner can analyze it" msgstr "" "\"%s\" пропускается --- только владелец таблицы или БД может анализировать " "этот объект" -#: commands/vacuum.c:670 commands/vacuum.c:766 +#: commands/vacuum.c:696 commands/vacuum.c:792 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "очистка \"%s\" пропускается --- блокировка недоступна" -#: commands/vacuum.c:675 +#: commands/vacuum.c:701 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "очистка \"%s\" пропускается --- это отношение более не существует" -#: commands/vacuum.c:691 commands/vacuum.c:771 +#: commands/vacuum.c:717 commands/vacuum.c:797 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "анализ \"%s\" пропускается --- блокировка недоступна" -#: commands/vacuum.c:696 +#: commands/vacuum.c:722 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "анализ \"%s\" пропускается --- это отношение более не существует" -#: commands/vacuum.c:994 +#: commands/vacuum.c:1040 #, c-format msgid "oldest xmin is far in the past" msgstr "самый старый xmin далеко в прошлом" -#: commands/vacuum.c:995 +#: commands/vacuum.c:1041 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -12511,12 +12987,12 @@ msgstr "" "Возможно, вам также придётся зафиксировать или откатить старые " "подготовленные транзакции и удалить неиспользуемые слоты репликации." -#: commands/vacuum.c:1036 +#: commands/vacuum.c:1082 #, c-format msgid "oldest multixact is far in the past" msgstr "самый старый multixact далеко в прошлом" -#: commands/vacuum.c:1037 +#: commands/vacuum.c:1083 #, c-format msgid "" "Close open transactions with multixacts soon to avoid wraparound problems." @@ -12524,27 +13000,27 @@ msgstr "" "Скорее закройте открытые транзакции в мультитранзакциях, чтобы избежать " "проблемы зацикливания." -#: commands/vacuum.c:1623 +#: commands/vacuum.c:1740 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "" "есть базы данных, которые не очищались на протяжении более чем 2 миллиардов " "транзакций" -#: commands/vacuum.c:1624 +#: commands/vacuum.c:1741 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "" "Возможно, вы уже потеряли данные в результате зацикливания ID транзакций." -#: commands/vacuum.c:1784 +#: commands/vacuum.c:1905 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "" "\"%s\" пропускается --- очищать не таблицы или специальные системные таблицы " "нельзя" -#: commands/variable.c:165 utils/misc/guc.c:11184 utils/misc/guc.c:11246 +#: commands/variable.c:165 utils/misc/guc.c:11626 utils/misc/guc.c:11688 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "нераспознанное ключевое слово: \"%s\"." @@ -12611,7 +13087,7 @@ msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" msgstr "" "команда SET TRANSACTION ISOLATION LEVEL не должна вызываться в подтранзакции" -#: commands/variable.c:548 storage/lmgr/predicate.c:1698 +#: commands/variable.c:548 storage/lmgr/predicate.c:1693 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "использовать сериализуемый режим в горячем резерве нельзя" @@ -12649,7 +13125,12 @@ msgstr "Изменить клиентскую кодировку сейчас н msgid "cannot change client_encoding during a parallel operation" msgstr "изменить клиентскую кодировку во время параллельной операции нельзя" -#: commands/variable.c:863 +#: commands/variable.c:890 +#, c-format +msgid "permission will be denied to set role \"%s\"" +msgstr "нет прав установить роль \"%s\"" + +#: commands/variable.c:895 #, c-format msgid "permission denied to set role \"%s\"" msgstr "нет прав установить роль \"%s\"" @@ -12684,28 +13165,28 @@ msgstr "" msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "изменить тип столбца представления \"%s\" с %s на %s нельзя" -#: commands/view.c:441 +#: commands/view.c:438 #, c-format msgid "views must not contain SELECT INTO" msgstr "представления не должны содержать SELECT INTO" -#: commands/view.c:453 +#: commands/view.c:450 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "представления не должны содержать операторы, изменяющие данные в WITH" -#: commands/view.c:523 +#: commands/view.c:520 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "в CREATE VIEW указано больше имён столбцов, чем самих столбцов" -#: commands/view.c:531 +#: commands/view.c:528 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "" "представления не могут быть нежурналируемыми, так как они нигде не хранятся" -#: commands/view.c:545 +#: commands/view.c:542 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "представление \"%s\" будет создано как временное" @@ -12743,7 +13224,7 @@ msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "" "для курсора \"%s\" не выполняется обновляемое сканирование таблицы \"%s\"" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2404 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2451 #, c-format msgid "" "type of parameter %d (%s) does not match that when preparing the plan (%s)" @@ -12751,28 +13232,56 @@ msgstr "" "тип параметра %d (%s) не соответствует тому, с которым подготавливался план " "(%s)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2416 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2463 #, c-format msgid "no value found for parameter %d" msgstr "не найдено значение параметра %d" -#: executor/execExpr.c:859 parser/parse_agg.c:816 +#: executor/execExpr.c:632 executor/execExpr.c:639 executor/execExpr.c:645 +#: executor/execExprInterp.c:4023 executor/execExprInterp.c:4040 +#: executor/execExprInterp.c:4141 executor/nodeModifyTable.c:117 +#: executor/nodeModifyTable.c:128 executor/nodeModifyTable.c:145 +#: executor/nodeModifyTable.c:153 +#, c-format +msgid "table row type and query-specified row type do not match" +msgstr "тип строки таблицы отличается от типа строки-результата запроса" + +#: executor/execExpr.c:633 executor/nodeModifyTable.c:118 +#, c-format +msgid "Query has too many columns." +msgstr "Запрос возвращает больше столбцов." + +#: executor/execExpr.c:640 executor/nodeModifyTable.c:146 +#, c-format +msgid "Query provides a value for a dropped column at ordinal position %d." +msgstr "" +"Запрос выдаёт значение для удалённого столбца (с порядковым номером %d)." + +#: executor/execExpr.c:646 executor/execExprInterp.c:4041 +#: executor/nodeModifyTable.c:129 +#, c-format +msgid "Table has type %s at ordinal position %d, but query expects %s." +msgstr "" +"В таблице определён тип %s (номер столбца: %d), а в запросе предполагается " +"%s." + +#: executor/execExpr.c:1110 parser/parse_agg.c:820 #, c-format msgid "window function calls cannot be nested" msgstr "вложенные вызовы оконных функций недопустимы" -#: executor/execExpr.c:1318 +#: executor/execExpr.c:1615 #, c-format msgid "target type is not an array" msgstr "целевой тип не является массивом" -#: executor/execExpr.c:1651 +#: executor/execExpr.c:1955 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "столбец ROW() имеет тип %s, а должен - %s" -#: executor/execExpr.c:2176 executor/execSRF.c:708 parser/parse_func.c:135 -#: parser/parse_func.c:646 parser/parse_func.c:1020 +#: executor/execExpr.c:2480 executor/execSRF.c:718 parser/parse_func.c:138 +#: parser/parse_func.c:655 parser/parse_func.c:1031 #, c-format msgid "cannot pass more than %d argument to a function" msgid_plural "cannot pass more than %d arguments to a function" @@ -12780,42 +13289,53 @@ msgstr[0] "функции нельзя передать больше %d аргу msgstr[1] "функции нельзя передать больше %d аргументов" msgstr[2] "функции нельзя передать больше %d аргументов" -#: executor/execExpr.c:2587 executor/execExpr.c:2593 -#: executor/execExprInterp.c:2730 utils/adt/arrayfuncs.c:262 -#: utils/adt/arrayfuncs.c:560 utils/adt/arrayfuncs.c:1302 -#: utils/adt/arrayfuncs.c:3348 utils/adt/arrayfuncs.c:5308 -#: utils/adt/arrayfuncs.c:5821 +#: executor/execExpr.c:2866 parser/parse_node.c:277 parser/parse_node.c:327 #, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "число размерностей массива (%d) превышает предел (%d)" +msgid "cannot subscript type %s because it does not support subscripting" +msgstr "" +"к элементам типа %s нельзя обращаться по индексам, так как он это не " +"поддерживает" + +#: executor/execExpr.c:2994 executor/execExpr.c:3016 +#, c-format +msgid "type %s does not support subscripted assignment" +msgstr "тип %s не поддерживает изменение элемента по индексу" -#: executor/execExprInterp.c:1894 +#: executor/execExprInterp.c:1916 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "атрибут %d типа %s был удалён" -#: executor/execExprInterp.c:1900 +#: executor/execExprInterp.c:1922 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "атрибут %d типа %s имеет неправильный тип" -#: executor/execExprInterp.c:1902 executor/execExprInterp.c:3002 -#: executor/execExprInterp.c:3049 +#: executor/execExprInterp.c:1924 executor/execExprInterp.c:3052 +#: executor/execExprInterp.c:3098 #, c-format msgid "Table has type %s, but query expects %s." msgstr "В таблице задан тип %s, а в запросе ожидается %s." -#: executor/execExprInterp.c:2494 +#: executor/execExprInterp.c:2003 utils/adt/expandedrecord.c:99 +#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1751 +#: utils/cache/typcache.c:1907 utils/cache/typcache.c:2054 +#: utils/fmgr/funcapi.c:458 +#, c-format +msgid "type %s is not composite" +msgstr "тип %s не является составным" + +#: executor/execExprInterp.c:2541 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF для таблиц такого типа не поддерживается" -#: executor/execExprInterp.c:2708 +#: executor/execExprInterp.c:2754 #, c-format msgid "cannot merge incompatible arrays" msgstr "не удалось объединить несовместимые массивы" -#: executor/execExprInterp.c:2709 +#: executor/execExprInterp.c:2755 #, c-format msgid "" "Array with element type %s cannot be included in ARRAY construct with " @@ -12824,7 +13344,16 @@ msgstr "" "Массив с типом элементов %s нельзя включить в конструкцию ARRAY с типом " "элементов %s." -#: executor/execExprInterp.c:2750 executor/execExprInterp.c:2780 +#: executor/execExprInterp.c:2776 utils/adt/arrayfuncs.c:263 +#: utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 +#: utils/adt/arrayfuncs.c:3375 utils/adt/arrayfuncs.c:5371 +#: utils/adt/arrayfuncs.c:5888 utils/adt/arraysubs.c:150 +#: utils/adt/arraysubs.c:488 +#, c-format +msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +msgstr "число размерностей массива (%d) превышает предел (%d)" + +#: executor/execExprInterp.c:2796 executor/execExprInterp.c:2826 #, c-format msgid "" "multidimensional arrays must have array expressions with matching dimensions" @@ -12832,35 +13361,22 @@ msgstr "" "для многомерных массивов должны задаваться выражения с соответствующими " "размерностями" -#: executor/execExprInterp.c:3001 executor/execExprInterp.c:3048 +#: executor/execExprInterp.c:3051 executor/execExprInterp.c:3097 #, c-format msgid "attribute %d has wrong type" msgstr "атрибут %d имеет неверный тип" -#: executor/execExprInterp.c:3158 -#, c-format -msgid "array subscript in assignment must not be null" -msgstr "индекс элемента массива в присваивании не может быть NULL" - -#: executor/execExprInterp.c:3588 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3652 utils/adt/domains.c:149 #, c-format msgid "domain %s does not allow null values" msgstr "домен %s не допускает значения null" -#: executor/execExprInterp.c:3603 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3667 utils/adt/domains.c:184 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "значение домена %s нарушает ограничение-проверку \"%s\"" -#: executor/execExprInterp.c:3973 executor/execExprInterp.c:3990 -#: executor/execExprInterp.c:4091 executor/nodeModifyTable.c:109 -#: executor/nodeModifyTable.c:120 executor/nodeModifyTable.c:137 -#: executor/nodeModifyTable.c:145 -#, c-format -msgid "table row type and query-specified row type do not match" -msgstr "тип строки таблицы отличается от типа строки-результата запроса" - -#: executor/execExprInterp.c:3974 +#: executor/execExprInterp.c:4024 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." @@ -12868,21 +13384,14 @@ msgstr[0] "Строка таблицы содержит %d атрибут, а в msgstr[1] "Строка таблицы содержит %d атрибута, а в запросе ожидается %d." msgstr[2] "Строка таблицы содержит %d атрибутов, а в запросе ожидается %d." -#: executor/execExprInterp.c:3991 executor/nodeModifyTable.c:121 -#, c-format -msgid "Table has type %s at ordinal position %d, but query expects %s." -msgstr "" -"В таблице определён тип %s (номер столбца: %d), а в запросе предполагается " -"%s." - -#: executor/execExprInterp.c:4092 executor/execSRF.c:967 +#: executor/execExprInterp.c:4142 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "" "Несоответствие параметров физического хранения удалённого атрибута (под " "номером %d)." -#: executor/execIndexing.c:550 +#: executor/execIndexing.c:567 #, c-format msgid "" "ON CONFLICT does not support deferrable unique constraints/exclusion " @@ -12891,54 +13400,54 @@ msgstr "" "ON CONFLICT не поддерживает откладываемые ограничения уникальности/" "ограничения-исключения в качестве определяющего индекса" -#: executor/execIndexing.c:821 +#: executor/execIndexing.c:838 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "не удалось создать ограничение-исключение \"%s\"" -#: executor/execIndexing.c:824 +#: executor/execIndexing.c:841 #, c-format msgid "Key %s conflicts with key %s." msgstr "Ключ %s конфликтует с ключом %s." -#: executor/execIndexing.c:826 +#: executor/execIndexing.c:843 #, c-format msgid "Key conflicts exist." msgstr "Обнаружен конфликт ключей." -#: executor/execIndexing.c:832 +#: executor/execIndexing.c:849 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "конфликтующее значение ключа нарушает ограничение-исключение \"%s\"" -#: executor/execIndexing.c:835 +#: executor/execIndexing.c:852 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "Ключ %s конфликтует с существующим ключом %s." -#: executor/execIndexing.c:837 +#: executor/execIndexing.c:854 #, c-format msgid "Key conflicts with existing key." msgstr "Ключ конфликтует с уже существующим." -#: executor/execMain.c:1091 +#: executor/execMain.c:1007 #, c-format msgid "cannot change sequence \"%s\"" msgstr "последовательность \"%s\" изменить нельзя" -#: executor/execMain.c:1097 +#: executor/execMain.c:1013 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "TOAST-отношение \"%s\" изменить нельзя" -#: executor/execMain.c:1115 rewrite/rewriteHandler.c:2972 -#: rewrite/rewriteHandler.c:3749 +#: executor/execMain.c:1031 rewrite/rewriteHandler.c:3064 +#: rewrite/rewriteHandler.c:3861 #, c-format msgid "cannot insert into view \"%s\"" msgstr "вставить данные в представление \"%s\" нельзя" -#: executor/execMain.c:1117 rewrite/rewriteHandler.c:2975 -#: rewrite/rewriteHandler.c:3752 +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3067 +#: rewrite/rewriteHandler.c:3864 #, c-format msgid "" "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or " @@ -12947,14 +13456,14 @@ msgstr "" "Чтобы представление допускало добавление данных, установите триггер INSTEAD " "OF INSERT или безусловное правило ON INSERT DO INSTEAD." -#: executor/execMain.c:1123 rewrite/rewriteHandler.c:2980 -#: rewrite/rewriteHandler.c:3757 +#: executor/execMain.c:1039 rewrite/rewriteHandler.c:3072 +#: rewrite/rewriteHandler.c:3869 #, c-format msgid "cannot update view \"%s\"" msgstr "изменить данные в представлении \"%s\" нельзя" -#: executor/execMain.c:1125 rewrite/rewriteHandler.c:2983 -#: rewrite/rewriteHandler.c:3760 +#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3075 +#: rewrite/rewriteHandler.c:3872 #, c-format msgid "" "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an " @@ -12963,14 +13472,14 @@ msgstr "" "Чтобы представление допускало изменение данных, установите триггер INSTEAD " "OF UPDATE или безусловное правило ON UPDATE DO INSTEAD." -#: executor/execMain.c:1131 rewrite/rewriteHandler.c:2988 -#: rewrite/rewriteHandler.c:3765 +#: executor/execMain.c:1047 rewrite/rewriteHandler.c:3080 +#: rewrite/rewriteHandler.c:3877 #, c-format msgid "cannot delete from view \"%s\"" msgstr "удалить данные из представления \"%s\" нельзя" -#: executor/execMain.c:1133 rewrite/rewriteHandler.c:2991 -#: rewrite/rewriteHandler.c:3768 +#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3083 +#: rewrite/rewriteHandler.c:3880 #, c-format msgid "" "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an " @@ -12979,119 +13488,119 @@ msgstr "" "Чтобы представление допускало удаление данных, установите триггер INSTEAD OF " "DELETE или безусловное правило ON DELETE DO INSTEAD." -#: executor/execMain.c:1144 +#: executor/execMain.c:1060 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "изменить материализованное представление \"%s\" нельзя" -#: executor/execMain.c:1156 +#: executor/execMain.c:1072 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "вставлять данные в стороннюю таблицу \"%s\" нельзя" -#: executor/execMain.c:1162 +#: executor/execMain.c:1078 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "сторонняя таблица \"%s\" не допускает добавления" -#: executor/execMain.c:1169 +#: executor/execMain.c:1085 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "изменять данные в сторонней таблице \"%s\"" -#: executor/execMain.c:1175 +#: executor/execMain.c:1091 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "сторонняя таблица \"%s\" не допускает изменения" -#: executor/execMain.c:1182 +#: executor/execMain.c:1098 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "удалять данные из сторонней таблицы \"%s\" нельзя" -#: executor/execMain.c:1188 +#: executor/execMain.c:1104 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "сторонняя таблица \"%s\" не допускает удаления" -#: executor/execMain.c:1199 +#: executor/execMain.c:1115 #, c-format msgid "cannot change relation \"%s\"" msgstr "отношение \"%s\" изменить нельзя" -#: executor/execMain.c:1226 +#: executor/execMain.c:1142 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "блокировать строки в последовательности \"%s\" нельзя" -#: executor/execMain.c:1233 +#: executor/execMain.c:1149 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "блокировать строки в TOAST-отношении \"%s\" нельзя" -#: executor/execMain.c:1240 +#: executor/execMain.c:1156 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "блокировать строки в представлении \"%s\" нельзя" -#: executor/execMain.c:1248 +#: executor/execMain.c:1164 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "блокировать строки в материализованном представлении \"%s\" нельзя" -#: executor/execMain.c:1257 executor/execMain.c:2627 -#: executor/nodeLockRows.c:132 +#: executor/execMain.c:1173 executor/execMain.c:2555 +#: executor/nodeLockRows.c:136 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "блокировать строки в сторонней таблице \"%s\" нельзя" -#: executor/execMain.c:1263 +#: executor/execMain.c:1179 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "блокировать строки в отношении \"%s\" нельзя" -#: executor/execMain.c:1879 +#: executor/execMain.c:1803 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "новая строка в отношении \"%s\" нарушает ограничение секции" -#: executor/execMain.c:1881 executor/execMain.c:1964 executor/execMain.c:2012 -#: executor/execMain.c:2120 +#: executor/execMain.c:1805 executor/execMain.c:1888 executor/execMain.c:1938 +#: executor/execMain.c:2047 #, c-format msgid "Failing row contains %s." msgstr "Ошибочная строка содержит %s." -#: executor/execMain.c:1961 +#: executor/execMain.c:1885 #, c-format msgid "" "null value in column \"%s\" of relation \"%s\" violates not-null constraint" msgstr "" "значение NULL в столбце \"%s\" отношения \"%s\" нарушает ограничение NOT NULL" -#: executor/execMain.c:2010 +#: executor/execMain.c:1936 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "новая строка в отношении \"%s\" нарушает ограничение-проверку \"%s\"" -#: executor/execMain.c:2118 +#: executor/execMain.c:2045 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "новая строка нарушает ограничение-проверку для представления \"%s\"" -#: executor/execMain.c:2128 +#: executor/execMain.c:2055 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "" "новая строка нарушает политику защиты на уровне строк \"%s\" для таблицы \"%s" "\"" -#: executor/execMain.c:2133 +#: executor/execMain.c:2060 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "" "новая строка нарушает политику защиты на уровне строк для таблицы \"%s\"" -#: executor/execMain.c:2140 +#: executor/execMain.c:2067 #, c-format msgid "" "new row violates row-level security policy \"%s\" (USING expression) for " @@ -13100,7 +13609,7 @@ msgstr "" "новая строка нарушает политику защиты на уровне строк \"%s\" (выражение " "USING) для таблицы \"%s\"" -#: executor/execMain.c:2145 +#: executor/execMain.c:2072 #, c-format msgid "" "new row violates row-level security policy (USING expression) for table \"%s" @@ -13109,12 +13618,12 @@ msgstr "" "новая строка нарушает политику защиты на уровне строк (выражение USING) для " "таблицы \"%s\"" -#: executor/execPartition.c:341 +#: executor/execPartition.c:322 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "для строки не найдена секция в отношении \"%s\"" -#: executor/execPartition.c:344 +#: executor/execPartition.c:325 #, c-format msgid "Partition key of the failing row contains %s." msgstr "Ключ секционирования для неподходящей строки содержит %s." @@ -13138,15 +13647,16 @@ msgstr "параллельное изменение; следует повтор msgid "concurrent delete, retrying" msgstr "параллельное удаление; следует повторная попытка" -#: executor/execReplication.c:269 parser/parse_oper.c:228 -#: utils/adt/array_userfuncs.c:719 utils/adt/array_userfuncs.c:858 -#: utils/adt/arrayfuncs.c:3626 utils/adt/arrayfuncs.c:4146 -#: utils/adt/arrayfuncs.c:6132 utils/adt/rowtypes.c:1182 +#: executor/execReplication.c:269 parser/parse_cte.c:502 +#: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:720 +#: utils/adt/array_userfuncs.c:859 utils/adt/arrayfuncs.c:3655 +#: utils/adt/arrayfuncs.c:4209 utils/adt/arrayfuncs.c:6201 +#: utils/adt/rowtypes.c:1203 #, c-format msgid "could not identify an equality operator for type %s" msgstr "не удалось найти оператор равенства для типа %s" -#: executor/execReplication.c:586 +#: executor/execReplication.c:590 #, c-format msgid "" "cannot update table \"%s\" because it does not have a replica identity and " @@ -13155,14 +13665,14 @@ msgstr "" "изменение в таблице \"%s\" невозможно, так как в ней отсутствует " "идентификатор реплики, но она публикует изменения" -#: executor/execReplication.c:588 +#: executor/execReplication.c:592 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "" "Чтобы эта таблица поддерживала изменение, установите REPLICA IDENTITY, " "выполнив ALTER TABLE." -#: executor/execReplication.c:592 +#: executor/execReplication.c:596 #, c-format msgid "" "cannot delete from table \"%s\" because it does not have a replica identity " @@ -13171,7 +13681,7 @@ msgstr "" "удаление из таблицы \"%s\" невозможно, так как в ней отсутствует " "идентификатор реплики, но она публикует удаления" -#: executor/execReplication.c:594 +#: executor/execReplication.c:598 #, c-format msgid "" "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." @@ -13179,19 +13689,19 @@ msgstr "" "Чтобы эта таблица поддерживала удаление, установите REPLICA IDENTITY, " "выполнив ALTER TABLE." -#: executor/execReplication.c:613 executor/execReplication.c:621 +#: executor/execReplication.c:617 executor/execReplication.c:625 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "" "в качестве целевого отношения для логической репликации нельзя использовать " "\"%s.%s\"" -#: executor/execReplication.c:615 +#: executor/execReplication.c:619 #, c-format msgid "\"%s.%s\" is a foreign table." msgstr "\"%s.%s\" — сторонняя таблица." -#: executor/execReplication.c:623 +#: executor/execReplication.c:627 #, c-format msgid "\"%s.%s\" is not a table." msgstr "\"%s.%s\" — не таблица." @@ -13201,17 +13711,22 @@ msgstr "\"%s.%s\" — не таблица." msgid "rows returned by function are not all of the same row type" msgstr "строки, возвращённые функцией, имеют разные типы" -#: executor/execSRF.c:363 executor/execSRF.c:657 +#: executor/execSRF.c:365 +#, c-format +msgid "table-function protocol for value-per-call mode was not followed" +msgstr "нарушение протокола табличной функции в режиме вызов-значение" + +#: executor/execSRF.c:373 executor/execSRF.c:667 #, c-format msgid "table-function protocol for materialize mode was not followed" msgstr "нарушение протокола табличной функции в режиме материализации" -#: executor/execSRF.c:370 executor/execSRF.c:675 +#: executor/execSRF.c:380 executor/execSRF.c:685 #, c-format msgid "unrecognized table-function returnMode: %d" msgstr "нераспознанный режим возврата табличной функции: %d" -#: executor/execSRF.c:884 +#: executor/execSRF.c:894 #, c-format msgid "" "function returning setof record called in context that cannot accept type " @@ -13220,12 +13735,12 @@ msgstr "" "функция, возвращающая запись SET OF, вызвана в контексте, не допускающем " "этот тип" -#: executor/execSRF.c:940 executor/execSRF.c:956 executor/execSRF.c:966 +#: executor/execSRF.c:950 executor/execSRF.c:966 executor/execSRF.c:976 #, c-format msgid "function return row and query-specified return row do not match" msgstr "тип результат функции отличается от типа строки-результата запроса" -#: executor/execSRF.c:941 +#: executor/execSRF.c:951 #, c-format msgid "Returned row contains %d attribute, but query expects %d." msgid_plural "Returned row contains %d attributes, but query expects %d." @@ -13235,49 +13750,55 @@ msgstr[1] "" msgstr[2] "" "Возвращённая строка содержит %d атрибутов, но запрос предполагает %d." -#: executor/execSRF.c:957 +#: executor/execSRF.c:967 #, c-format msgid "Returned type %s at ordinal position %d, but query expects %s." msgstr "Возвращён тип %s (номер столбца: %d), а в запросе предполагается %s." -#: executor/execUtils.c:750 +#: executor/execTuples.c:146 executor/execTuples.c:353 +#: executor/execTuples.c:521 executor/execTuples.c:712 +#, c-format +msgid "cannot retrieve a system column in this context" +msgstr "системный столбец нельзя получить в данном контексте" + +#: executor/execUtils.c:736 #, c-format msgid "materialized view \"%s\" has not been populated" msgstr "материализованное представление \"%s\" не было наполнено" -#: executor/execUtils.c:752 +#: executor/execUtils.c:738 #, c-format msgid "Use the REFRESH MATERIALIZED VIEW command." msgstr "Примените команду REFRESH MATERIALIZED VIEW." -#: executor/functions.c:231 +#: executor/functions.c:217 #, c-format msgid "could not determine actual type of argument declared %s" msgstr "не удалось определить фактический тип аргумента, объявленного как %s" -#: executor/functions.c:528 +#: executor/functions.c:514 #, c-format -msgid "cannot COPY to/from client in a SQL function" +msgid "cannot COPY to/from client in an SQL function" msgstr "в функции SQL нельзя выполнить COPY с участием клиента" #. translator: %s is a SQL statement name -#: executor/functions.c:534 +#: executor/functions.c:520 #, c-format -msgid "%s is not allowed in a SQL function" +msgid "%s is not allowed in an SQL function" msgstr "%s нельзя использовать в SQL-функции" #. translator: %s is a SQL statement name -#: executor/functions.c:542 executor/spi.c:1471 executor/spi.c:2257 +#: executor/functions.c:528 executor/spi.c:1649 executor/spi.c:2538 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "%s нельзя использовать в не изменчивой (volatile) функции" -#: executor/functions.c:1424 +#: executor/functions.c:1442 #, c-format msgid "SQL function \"%s\" statement %d" msgstr "SQL-функция \"%s\", оператор %d" -#: executor/functions.c:1450 +#: executor/functions.c:1468 #, c-format msgid "SQL function \"%s\" during startup" msgstr "SQL-функция \"%s\" (при старте)" @@ -13289,14 +13810,14 @@ msgid "" msgstr "" "вызов процедур с выходными аргументами в функциях SQL не поддерживается" -#: executor/functions.c:1687 executor/functions.c:1724 +#: executor/functions.c:1686 executor/functions.c:1724 #: executor/functions.c:1738 executor/functions.c:1828 #: executor/functions.c:1861 executor/functions.c:1875 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "несовпадение типа возврата в функции (в объявлении указан тип %s)" -#: executor/functions.c:1689 +#: executor/functions.c:1688 #, c-format msgid "" "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." @@ -13334,18 +13855,18 @@ msgstr "Последний оператор возвращает слишком msgid "return type %s is not supported for SQL functions" msgstr "для SQL-функций тип возврата %s не поддерживается" -#: executor/nodeAgg.c:3091 executor/nodeAgg.c:3100 executor/nodeAgg.c:3112 +#: executor/nodeAgg.c:3088 executor/nodeAgg.c:3097 executor/nodeAgg.c:3109 #, c-format msgid "unexpected EOF for tape %d: requested %zu bytes, read %zu bytes" msgstr "" "неожиданный конец файла для ленты %d: запрашивалось байт: %zu, прочитано: %zu" -#: executor/nodeAgg.c:4046 parser/parse_agg.c:655 parser/parse_agg.c:685 +#: executor/nodeAgg.c:3974 parser/parse_agg.c:661 parser/parse_agg.c:689 #, c-format msgid "aggregate function calls cannot be nested" msgstr "вложенные вызовы агрегатных функций недопустимы" -#: executor/nodeAgg.c:4254 executor/nodeWindowAgg.c:2836 +#: executor/nodeAgg.c:4182 executor/nodeWindowAgg.c:2836 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "" @@ -13369,11 +13890,12 @@ msgstr "" "не удалось прочитать временный файл хеш-соединения (прочитано байт: %zu из " "%zu)" -#: executor/nodeIndexonlyscan.c:242 +#: executor/nodeIndexonlyscan.c:240 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "" -"функции неточной дистанции не поддерживаются в сканировании только по индексу" +"функции неточного расстояния не поддерживаются в сканировании только по " +"индексу" #: executor/nodeLimit.c:374 #, c-format @@ -13398,23 +13920,12 @@ msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "" "FULL JOIN поддерживается только с условиями, допускающими соединение слиянием" -#: executor/nodeModifyTable.c:110 -#, c-format -msgid "Query has too many columns." -msgstr "Запрос возвращает больше столбцов." - -#: executor/nodeModifyTable.c:138 -#, c-format -msgid "Query provides a value for a dropped column at ordinal position %d." -msgstr "" -"Запрос выдаёт значение для удалённого столбца (с порядковым номером %d)." - -#: executor/nodeModifyTable.c:146 +#: executor/nodeModifyTable.c:154 #, c-format msgid "Query has too few columns." msgstr "Запрос возвращает меньше столбцов." -#: executor/nodeModifyTable.c:839 executor/nodeModifyTable.c:913 +#: executor/nodeModifyTable.c:1205 executor/nodeModifyTable.c:1279 #, c-format msgid "" "tuple to be deleted was already modified by an operation triggered by the " @@ -13423,12 +13934,12 @@ msgstr "" "кортеж, который должен быть удалён, уже модифицирован в операции, вызванной " "текущей командой" -#: executor/nodeModifyTable.c:1220 +#: executor/nodeModifyTable.c:1454 #, c-format msgid "invalid ON UPDATE specification" msgstr "неверное указание ON UPDATE" -#: executor/nodeModifyTable.c:1221 +#: executor/nodeModifyTable.c:1455 #, c-format msgid "" "The result tuple would appear in a different partition than the original " @@ -13437,12 +13948,12 @@ msgstr "" "Результирующий кортеж окажется перемещённым из секции исходного кортежа в " "другую." -#: executor/nodeModifyTable.c:1592 +#: executor/nodeModifyTable.c:2051 #, c-format msgid "ON CONFLICT DO UPDATE command cannot affect row a second time" msgstr "команда ON CONFLICT DO UPDATE не может менять строку повторно" -#: executor/nodeModifyTable.c:1593 +#: executor/nodeModifyTable.c:2052 #, c-format msgid "" "Ensure that no rows proposed for insertion within the same command have " @@ -13524,58 +14035,79 @@ msgstr "" "агрегатная функция %s не поддерживает использование в качестве оконной " "функции" -#: executor/spi.c:228 executor/spi.c:297 +#: executor/spi.c:234 executor/spi.c:299 #, c-format msgid "invalid transaction termination" msgstr "неверное завершение транзакции" -#: executor/spi.c:242 +#: executor/spi.c:248 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "фиксировать транзакцию при наличии активных подтранзакций нельзя" -#: executor/spi.c:303 +#: executor/spi.c:305 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "откатить транзакцию при наличии активных подтранзакций нельзя" -#: executor/spi.c:372 +#: executor/spi.c:377 #, c-format msgid "transaction left non-empty SPI stack" msgstr "после транзакции остался непустой стек SPI" -#: executor/spi.c:373 executor/spi.c:435 +#: executor/spi.c:378 executor/spi.c:440 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "Проверьте наличие вызова \"SPI_finish\"." -#: executor/spi.c:434 +#: executor/spi.c:439 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "после подтранзакции остался непустой стек SPI" -#: executor/spi.c:1335 +#: executor/spi.c:1507 #, c-format msgid "cannot open multi-query plan as cursor" msgstr "не удалось открыть план нескольких запросов как курсор" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:1340 +#: executor/spi.c:1517 #, c-format msgid "cannot open %s query as cursor" msgstr "не удалось открыть запрос %s как курсор" -#: executor/spi.c:1445 +#: executor/spi.c:1623 #, c-format msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE не поддерживается" -#: executor/spi.c:1446 parser/analyze.c:2475 +#: executor/spi.c:1624 parser/analyze.c:2821 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Прокручиваемые курсоры должны быть READ ONLY." -#: executor/spi.c:2560 +#: executor/spi.c:2377 +#, c-format +msgid "empty query does not return tuples" +msgstr "пустой запрос не возвращает кортежи" + +#. translator: %s is name of a SQL command, eg INSERT +#: executor/spi.c:2451 +#, c-format +msgid "%s query does not return tuples" +msgstr "запрос %s не возвращает кортежи" + +#: executor/spi.c:2863 +#, c-format +msgid "SQL expression \"%s\"" +msgstr "SQL-выражение \"%s\"" + +#: executor/spi.c:2868 +#, c-format +msgid "PL/pgSQL assignment \"%s\"" +msgstr "присваивание PL/pgSQL \"%s\"" + +#: executor/spi.c:2871 #, c-format msgid "SQL statement \"%s\"" msgstr "SQL-оператор: \"%s\"" @@ -13606,88 +14138,83 @@ msgstr "В данном контексте допустимы параметры msgid "could not access file \"%s\": %m" msgstr "нет доступа к файлу \"%s\": %m" -#: jit/llvm/llvmjit.c:730 -#, c-format -msgid "time to inline: %.3fs, opt: %.3fs, emit: %.3fs" -msgstr "время внедрения: %.3fs, оптимизации: %.3fs, выдачи: %.3fs" - #: lib/dshash.c:247 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 #: utils/mmgr/dsa.c:805 #, c-format msgid "Failed on DSA request of size %zu." msgstr "Ошибка при запросе памяти DSA (%zu Б)." -#: libpq/auth-scram.c:248 +#: libpq/auth-scram.c:249 #, c-format msgid "client selected an invalid SASL authentication mechanism" msgstr "клиент выбрал неверный механизм аутентификации SASL" -#: libpq/auth-scram.c:269 libpq/auth-scram.c:509 libpq/auth-scram.c:520 +#: libpq/auth-scram.c:270 libpq/auth-scram.c:510 libpq/auth-scram.c:521 #, c-format msgid "invalid SCRAM secret for user \"%s\"" msgstr "неверная запись секрета SCRAM для пользователя \"%s\"" -#: libpq/auth-scram.c:280 +#: libpq/auth-scram.c:281 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "Для пользователя \"%s\" нет подходящей записи секрета SCRAM." -#: libpq/auth-scram.c:358 libpq/auth-scram.c:363 libpq/auth-scram.c:693 -#: libpq/auth-scram.c:701 libpq/auth-scram.c:806 libpq/auth-scram.c:819 -#: libpq/auth-scram.c:829 libpq/auth-scram.c:937 libpq/auth-scram.c:944 -#: libpq/auth-scram.c:959 libpq/auth-scram.c:974 libpq/auth-scram.c:988 -#: libpq/auth-scram.c:1006 libpq/auth-scram.c:1021 libpq/auth-scram.c:1321 -#: libpq/auth-scram.c:1329 +#: libpq/auth-scram.c:359 libpq/auth-scram.c:364 libpq/auth-scram.c:701 +#: libpq/auth-scram.c:709 libpq/auth-scram.c:814 libpq/auth-scram.c:827 +#: libpq/auth-scram.c:837 libpq/auth-scram.c:945 libpq/auth-scram.c:952 +#: libpq/auth-scram.c:967 libpq/auth-scram.c:982 libpq/auth-scram.c:996 +#: libpq/auth-scram.c:1014 libpq/auth-scram.c:1029 libpq/auth-scram.c:1340 +#: libpq/auth-scram.c:1348 #, c-format msgid "malformed SCRAM message" msgstr "неправильное сообщение SCRAM" -#: libpq/auth-scram.c:359 +#: libpq/auth-scram.c:360 #, c-format msgid "The message is empty." msgstr "Сообщение пустое." -#: libpq/auth-scram.c:364 +#: libpq/auth-scram.c:365 #, c-format msgid "Message length does not match input length." msgstr "Длина сообщения не соответствует входной длине." -#: libpq/auth-scram.c:396 +#: libpq/auth-scram.c:397 #, c-format msgid "invalid SCRAM response" msgstr "неверный ответ SCRAM" -#: libpq/auth-scram.c:397 +#: libpq/auth-scram.c:398 #, c-format msgid "Nonce does not match." msgstr "Разовый код не совпадает." -#: libpq/auth-scram.c:471 +#: libpq/auth-scram.c:472 #, c-format msgid "could not generate random salt" msgstr "не удалось сгенерировать случайную соль" -#: libpq/auth-scram.c:694 +#: libpq/auth-scram.c:702 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "Ожидался атрибут \"%c\", но обнаружено \"%s\"." -#: libpq/auth-scram.c:702 libpq/auth-scram.c:830 +#: libpq/auth-scram.c:710 libpq/auth-scram.c:838 #, c-format msgid "Expected character \"=\" for attribute \"%c\"." msgstr "Ожидался символ \"=\" для атрибута \"%c\"." -#: libpq/auth-scram.c:807 +#: libpq/auth-scram.c:815 #, c-format msgid "Attribute expected, but found end of string." msgstr "Ожидался атрибут, но обнаружен конец строки." -#: libpq/auth-scram.c:820 +#: libpq/auth-scram.c:828 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "Ожидался атрибут, но обнаружен неправильный символ \"%s\"." -#: libpq/auth-scram.c:938 libpq/auth-scram.c:960 +#: libpq/auth-scram.c:946 libpq/auth-scram.c:968 #, c-format msgid "" "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not " @@ -13696,17 +14223,17 @@ msgstr "" "Клиент выбрал алгоритм SCRAM-SHA-256-PLUS, но в сообщении SCRAM отсутствуют " "данные связывания каналов." -#: libpq/auth-scram.c:945 libpq/auth-scram.c:975 +#: libpq/auth-scram.c:953 libpq/auth-scram.c:983 #, c-format msgid "Comma expected, but found character \"%s\"." msgstr "Ожидалась запятая, но обнаружен символ \"%s\"." -#: libpq/auth-scram.c:966 +#: libpq/auth-scram.c:974 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "Ошибка согласования связывания каналов SCRAM" -#: libpq/auth-scram.c:967 +#: libpq/auth-scram.c:975 #, c-format msgid "" "The client supports SCRAM channel binding but thinks the server does not. " @@ -13715,7 +14242,7 @@ msgstr "" "Клиент поддерживает связывание каналов SCRAM, но полагает, что оно не " "поддерживается сервером. Однако сервер тоже поддерживает связывание каналов." -#: libpq/auth-scram.c:989 +#: libpq/auth-scram.c:997 #, c-format msgid "" "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM " @@ -13724,141 +14251,156 @@ msgstr "" "Клиент выбрал алгоритм SCRAM-SHA-256 без связывания каналов, но сообщение " "SCRAM содержит данные связывания каналов." -#: libpq/auth-scram.c:1000 +#: libpq/auth-scram.c:1008 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "неподдерживаемый тип связывания каналов SCRAM \"%s\"" -#: libpq/auth-scram.c:1007 +#: libpq/auth-scram.c:1015 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "Неожиданный флаг связывания каналов \"%s\"." -#: libpq/auth-scram.c:1017 +#: libpq/auth-scram.c:1025 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "клиент передал идентификатор для авторизации, но это не поддерживается" -#: libpq/auth-scram.c:1022 +#: libpq/auth-scram.c:1030 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "Неожиданный атрибут \"%s\" в первом сообщении клиента." -#: libpq/auth-scram.c:1038 +#: libpq/auth-scram.c:1046 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "клиенту требуется неподдерживаемое расширение SCRAM" -#: libpq/auth-scram.c:1052 +#: libpq/auth-scram.c:1060 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "непечатаемые символы в разовом коде SCRAM" -#: libpq/auth-scram.c:1169 +#: libpq/auth-scram.c:1188 #, c-format msgid "could not generate random nonce" msgstr "не удалось сгенерировать разовый код" -#: libpq/auth-scram.c:1179 +#: libpq/auth-scram.c:1198 #, c-format msgid "could not encode random nonce" msgstr "не удалось оформить разовый код" -#: libpq/auth-scram.c:1285 +#: libpq/auth-scram.c:1304 #, c-format msgid "SCRAM channel binding check failed" msgstr "ошибка проверки связывания каналов SCRAM" -#: libpq/auth-scram.c:1303 +#: libpq/auth-scram.c:1322 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" msgstr "" "неожиданный атрибут связывания каналов в последнем сообщении клиента SCRAM" -#: libpq/auth-scram.c:1322 +#: libpq/auth-scram.c:1341 #, c-format msgid "Malformed proof in client-final-message." msgstr "Некорректное подтверждение в последнем сообщении клиента." -#: libpq/auth-scram.c:1330 +#: libpq/auth-scram.c:1349 #, c-format msgid "Garbage found at the end of client-final-message." msgstr "Мусор в конце последнего сообщения клиента." -#: libpq/auth.c:280 +#: libpq/auth.c:284 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "" "пользователь \"%s\" не прошёл проверку подлинности: не разрешённый компьютер" -#: libpq/auth.c:283 +#: libpq/auth.c:287 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (\"trust\")" -#: libpq/auth.c:286 +#: libpq/auth.c:290 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (Ident)" -#: libpq/auth.c:289 +#: libpq/auth.c:293 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (Peer)" -#: libpq/auth.c:294 +#: libpq/auth.c:298 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (по паролю)" -#: libpq/auth.c:299 +#: libpq/auth.c:303 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (GSSAPI)" -#: libpq/auth.c:302 +#: libpq/auth.c:306 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (SSPI)" -#: libpq/auth.c:305 +#: libpq/auth.c:309 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (PAM)" -#: libpq/auth.c:308 +#: libpq/auth.c:312 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (BSD)" -#: libpq/auth.c:311 +#: libpq/auth.c:315 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (LDAP)" -#: libpq/auth.c:314 +#: libpq/auth.c:318 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (по сертификату)" -#: libpq/auth.c:317 +#: libpq/auth.c:321 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (RADIUS)" -#: libpq/auth.c:320 +#: libpq/auth.c:324 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "" "пользователь \"%s\" не прошёл проверку подлинности: неверный метод проверки" -#: libpq/auth.c:324 +#: libpq/auth.c:328 #, c-format msgid "Connection matched pg_hba.conf line %d: \"%s\"" msgstr "Подключение соответствует строке %d в pg_hba.conf: \"%s\"" #: libpq/auth.c:371 #, c-format +msgid "authentication identifier set more than once" +msgstr "аутентификационный идентификатор указан повторно" + +#: libpq/auth.c:372 +#, c-format +msgid "previous identifier: \"%s\"; new identifier: \"%s\"" +msgstr "предыдущий идентификатор: \"%s\"; новый: \"%s\"" + +#: libpq/auth.c:381 +#, c-format +msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" +msgstr "соединение аутентифицировано: идентификатор=\"%s\" метод=%s (%s:%d)" + +#: libpq/auth.c:420 +#, c-format msgid "" "client certificates can only be checked if a root certificate store is " "available" @@ -13866,25 +14408,25 @@ msgstr "" "сертификаты клиентов могут проверяться, только если доступно хранилище " "корневых сертификатов" -#: libpq/auth.c:382 +#: libpq/auth.c:431 #, c-format msgid "connection requires a valid client certificate" msgstr "для подключения требуется годный сертификат клиента" -#: libpq/auth.c:413 libpq/auth.c:459 +#: libpq/auth.c:462 libpq/auth.c:508 msgid "GSS encryption" msgstr "Шифрование GSS" -#: libpq/auth.c:416 libpq/auth.c:462 -msgid "SSL on" -msgstr "SSL вкл." +#: libpq/auth.c:465 libpq/auth.c:511 +msgid "SSL encryption" +msgstr "Шифрование SSL" -#: libpq/auth.c:418 libpq/auth.c:464 -msgid "SSL off" -msgstr "SSL выкл." +#: libpq/auth.c:467 libpq/auth.c:513 +msgid "no encryption" +msgstr "без шифрования" #. translator: last %s describes encryption state -#: libpq/auth.c:424 +#: libpq/auth.c:473 #, c-format msgid "" "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" @@ -13893,7 +14435,7 @@ msgstr "" "пользователь \"%s\", \"%s\"" #. translator: last %s describes encryption state -#: libpq/auth.c:431 +#: libpq/auth.c:480 #, c-format msgid "" "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s" @@ -13902,38 +14444,38 @@ msgstr "" "pg_hba.conf отвергает подключение: компьютер \"%s\", пользователь \"%s\", " "база данных \"%s\", %s" -#: libpq/auth.c:469 +#: libpq/auth.c:518 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "" "IP-адрес клиента разрешается в \"%s\", соответствует прямому преобразованию." -#: libpq/auth.c:472 +#: libpq/auth.c:521 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "" "IP-адрес клиента разрешается в \"%s\", прямое преобразование не проверялось." -#: libpq/auth.c:475 +#: libpq/auth.c:524 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "" "IP-адрес клиента разрешается в \"%s\", это не соответствует прямому " "преобразованию." -#: libpq/auth.c:478 +#: libpq/auth.c:527 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "" "Преобразовать имя клиентского компьютера \"%s\" в IP-адрес не удалось: %s." -#: libpq/auth.c:483 +#: libpq/auth.c:532 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "Получить имя компьютера из IP-адреса клиента не удалось: %s." #. translator: last %s describes encryption state -#: libpq/auth.c:491 +#: libpq/auth.c:540 #, c-format msgid "" "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s" @@ -13943,29 +14485,29 @@ msgstr "" "компьютера \"%s\" для пользователя \"%s\", %s" #. translator: last %s describes encryption state -#: libpq/auth.c:499 +#: libpq/auth.c:548 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "" "в pg_hba.conf нет записи для компьютера \"%s\", пользователя \"%s\", базы " "\"%s\", %s" -#: libpq/auth.c:675 +#: libpq/auth.c:721 #, c-format msgid "expected password response, got message type %d" msgstr "ожидался ответ с паролем, но получено сообщение %d" -#: libpq/auth.c:703 +#: libpq/auth.c:742 #, c-format msgid "invalid password packet size" msgstr "неверный размер пакета с паролем" -#: libpq/auth.c:721 +#: libpq/auth.c:760 #, c-format msgid "empty password returned by client" msgstr "клиент возвратил пустой пароль" -#: libpq/auth.c:841 libpq/hba.c:1345 +#: libpq/auth.c:887 libpq/hba.c:1366 #, c-format msgid "" "MD5 authentication is not supported when \"db_user_namespace\" is enabled" @@ -13973,240 +14515,230 @@ msgstr "" "проверка подлинности MD5 не поддерживается, когда включён режим " "\"db_user_namespace\"" -#: libpq/auth.c:847 +#: libpq/auth.c:893 #, c-format msgid "could not generate random MD5 salt" msgstr "не удалось сгенерировать случайную соль для MD5" -#: libpq/auth.c:893 -#, c-format -msgid "SASL authentication is not supported in protocol version 2" -msgstr "аутентификация SASL не поддерживается в протоколе версии 2" - -#: libpq/auth.c:926 +#: libpq/auth.c:959 #, c-format msgid "expected SASL response, got message type %d" msgstr "ожидался ответ SASL, но получено сообщение %d" -#: libpq/auth.c:1055 -#, c-format -msgid "GSSAPI is not supported in protocol version 2" -msgstr "GSSAPI не поддерживается в протоколе версии 2" - -#: libpq/auth.c:1068 libpq/be-secure-gssapi.c:535 +#: libpq/auth.c:1088 libpq/be-secure-gssapi.c:535 #, c-format msgid "could not set environment: %m" msgstr "не удалось задать переменную окружения: %m" -#: libpq/auth.c:1104 +#: libpq/auth.c:1124 #, c-format msgid "expected GSS response, got message type %d" msgstr "ожидался ответ GSS, но получено сообщение %d" -#: libpq/auth.c:1164 +#: libpq/auth.c:1184 msgid "accepting GSS security context failed" msgstr "принять контекст безопасности GSS не удалось" -#: libpq/auth.c:1204 +#: libpq/auth.c:1225 msgid "retrieving GSS user name failed" msgstr "получить имя пользователя GSS не удалось" -#: libpq/auth.c:1337 -#, c-format -msgid "SSPI is not supported in protocol version 2" -msgstr "SSPI не поддерживается в протоколе версии 2" - -#: libpq/auth.c:1352 +#: libpq/auth.c:1374 msgid "could not acquire SSPI credentials" msgstr "не удалось получить удостоверение SSPI" -#: libpq/auth.c:1377 +#: libpq/auth.c:1399 #, c-format msgid "expected SSPI response, got message type %d" msgstr "ожидался ответ SSPI, но получено сообщение %d" -#: libpq/auth.c:1455 +#: libpq/auth.c:1477 msgid "could not accept SSPI security context" msgstr "принять контекст безопасности SSPI не удалось" -#: libpq/auth.c:1517 +#: libpq/auth.c:1539 msgid "could not get token from SSPI security context" msgstr "не удалось получить маркер из контекста безопасности SSPI" -#: libpq/auth.c:1636 libpq/auth.c:1655 +#: libpq/auth.c:1678 libpq/auth.c:1697 #, c-format msgid "could not translate name" msgstr "не удалось преобразовать имя" -#: libpq/auth.c:1668 +#: libpq/auth.c:1710 #, c-format msgid "realm name too long" msgstr "имя области слишком длинное" -#: libpq/auth.c:1683 +#: libpq/auth.c:1725 #, c-format msgid "translated account name too long" msgstr "преобразованное имя учётной записи слишком длинное" -#: libpq/auth.c:1864 +#: libpq/auth.c:1906 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "не удалось создать сокет для подключения к серверу Ident: %m" -#: libpq/auth.c:1879 +#: libpq/auth.c:1921 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "не удалось привязаться к локальному адресу \"%s\": %m" -#: libpq/auth.c:1891 +#: libpq/auth.c:1933 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "не удалось подключиться к серверу Ident по адресу \"%s\", порт %s: %m" -#: libpq/auth.c:1913 +#: libpq/auth.c:1955 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "" "не удалось отправить запрос серверу Ident по адресу \"%s\", порт %s: %m" -#: libpq/auth.c:1930 +#: libpq/auth.c:1972 #, c-format msgid "" "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "" "не удалось получить ответ от сервера Ident по адресу \"%s\", порт %s: %m" -#: libpq/auth.c:1940 +#: libpq/auth.c:1982 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "неверно форматированный ответ от сервера Ident: \"%s\"" -#: libpq/auth.c:1987 +#: libpq/auth.c:2035 #, c-format msgid "peer authentication is not supported on this platform" msgstr "проверка подлинности peer в этой ОС не поддерживается" -#: libpq/auth.c:1991 +#: libpq/auth.c:2039 #, c-format msgid "could not get peer credentials: %m" msgstr "не удалось получить данные пользователя через механизм peer: %m" -#: libpq/auth.c:2003 +#: libpq/auth.c:2051 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "найти локального пользователя по идентификатору (%ld) не удалось: %s" -#: libpq/auth.c:2102 +#: libpq/auth.c:2152 #, c-format msgid "error from underlying PAM layer: %s" msgstr "ошибка в нижележащем слое PAM: %s" -#: libpq/auth.c:2172 +#: libpq/auth.c:2163 +#, c-format +msgid "unsupported PAM conversation %d/\"%s\"" +msgstr "неподдерживаемое сообщение ответа PAM %d/\"%s\"" + +#: libpq/auth.c:2223 #, c-format msgid "could not create PAM authenticator: %s" msgstr "не удалось создать аутентификатор PAM: %s" -#: libpq/auth.c:2183 +#: libpq/auth.c:2234 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "ошибка в pam_set_item(PAM_USER): %s" -#: libpq/auth.c:2215 +#: libpq/auth.c:2266 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "ошибка в pam_set_item(PAM_RHOST): %s" -#: libpq/auth.c:2227 +#: libpq/auth.c:2278 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "ошибка в pam_set_item(PAM_CONV): %s" -#: libpq/auth.c:2240 +#: libpq/auth.c:2291 #, c-format msgid "pam_authenticate failed: %s" msgstr "ошибка в pam_authenticate: %s" -#: libpq/auth.c:2253 +#: libpq/auth.c:2304 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "ошибка в pam_acct_mgmt: %s" -#: libpq/auth.c:2264 +#: libpq/auth.c:2315 #, c-format msgid "could not release PAM authenticator: %s" msgstr "не удалось освободить аутентификатор PAM: %s" -#: libpq/auth.c:2340 +#: libpq/auth.c:2395 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "не удалось инициализировать LDAP (код ошибки: %d)" -#: libpq/auth.c:2377 +#: libpq/auth.c:2432 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "не удалось извлечь имя домена из ldapbasedn" -#: libpq/auth.c:2385 +#: libpq/auth.c:2440 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "для аутентификации LDAP не удалось найти записи DNS SRV для \"%s\"" -#: libpq/auth.c:2387 +#: libpq/auth.c:2442 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Задайте имя сервера LDAP явным образом." -#: libpq/auth.c:2439 +#: libpq/auth.c:2494 #, c-format msgid "could not initialize LDAP: %s" msgstr "не удалось инициализировать LDAP: %s" -#: libpq/auth.c:2449 +#: libpq/auth.c:2504 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "протокол ldaps с текущей библиотекой LDAP не поддерживается" -#: libpq/auth.c:2457 +#: libpq/auth.c:2512 #, c-format msgid "could not initialize LDAP: %m" msgstr "не удалось инициализировать LDAP: %m" -#: libpq/auth.c:2467 +#: libpq/auth.c:2522 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "не удалось задать версию протокола LDAP: %s" -#: libpq/auth.c:2507 +#: libpq/auth.c:2562 #, c-format msgid "could not load function _ldap_start_tls_sA in wldap32.dll" msgstr "не удалось найти функцию _ldap_start_tls_sA в wldap32.dll" -#: libpq/auth.c:2508 +#: libpq/auth.c:2563 #, c-format msgid "LDAP over SSL is not supported on this platform." msgstr "LDAP через SSL не поддерживается в этой ОС." -#: libpq/auth.c:2524 +#: libpq/auth.c:2579 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "не удалось начать сеанс LDAP TLS: %s" -#: libpq/auth.c:2595 +#: libpq/auth.c:2650 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP-сервер не задан и значение ldapbasedn не определено" -#: libpq/auth.c:2602 +#: libpq/auth.c:2657 #, c-format msgid "LDAP server not specified" msgstr "LDAP-сервер не определён" -#: libpq/auth.c:2664 +#: libpq/auth.c:2719 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "недопустимый символ в имени пользователя для проверки подлинности LDAP" -#: libpq/auth.c:2681 +#: libpq/auth.c:2736 #, c-format msgid "" "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": " @@ -14215,28 +14747,28 @@ msgstr "" "не удалось выполнить начальную привязку LDAP для ldapbinddn \"%s\" на " "сервере \"%s\": %s" -#: libpq/auth.c:2710 +#: libpq/auth.c:2765 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "" "не удалось выполнить LDAP-поиск по фильтру \"%s\" на сервере \"%s\": %s" -#: libpq/auth.c:2724 +#: libpq/auth.c:2779 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "в LDAP нет пользователя \"%s\"" -#: libpq/auth.c:2725 +#: libpq/auth.c:2780 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" не вернул результатов" -#: libpq/auth.c:2729 +#: libpq/auth.c:2784 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "пользователь LDAP \"%s\" не уникален" -#: libpq/auth.c:2730 +#: libpq/auth.c:2785 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "" @@ -14245,7 +14777,7 @@ msgstr[0] "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" msgstr[1] "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" вернул %d записи." msgstr[2] "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" вернул %d записей." -#: libpq/auth.c:2750 +#: libpq/auth.c:2805 #, c-format msgid "" "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" @@ -14253,24 +14785,24 @@ msgstr "" "не удалось получить dn для первого результата, соответствующего \"%s\" на " "сервере \"%s\": %s" -#: libpq/auth.c:2771 +#: libpq/auth.c:2826 #, c-format msgid "could not unbind after searching for user \"%s\" on server \"%s\"" msgstr "" "не удалось отвязаться после поиска пользователя \"%s\" на сервере \"%s\"" -#: libpq/auth.c:2802 +#: libpq/auth.c:2857 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "" "ошибка при регистрации в LDAP пользователя \"%s\" на сервере \"%s\": %s" -#: libpq/auth.c:2831 +#: libpq/auth.c:2889 #, c-format msgid "LDAP diagnostics: %s" msgstr "Диагностика LDAP: %s" -#: libpq/auth.c:2858 +#: libpq/auth.c:2927 #, c-format msgid "" "certificate authentication failed for user \"%s\": client certificate " @@ -14279,7 +14811,25 @@ msgstr "" "ошибка проверки подлинности пользователя \"%s\" по сертификату: сертификат " "клиента не содержит имя пользователя" -#: libpq/auth.c:2875 +#: libpq/auth.c:2948 +#, c-format +msgid "" +"certificate authentication failed for user \"%s\": unable to retrieve " +"subject DN" +msgstr "" +"пользователь \"%s\" не прошёл проверку подлинности по сертификату: не " +"удалось получить DN субъекта" + +#: libpq/auth.c:2971 +#, c-format +msgid "" +"certificate validation (clientcert=verify-full) failed for user \"%s\": DN " +"mismatch" +msgstr "" +"проверка сертификата (clientcert=verify-full) для пользователя \"%s\" не " +"прошла: отличается DN" + +#: libpq/auth.c:2976 #, c-format msgid "" "certificate validation (clientcert=verify-full) failed for user \"%s\": CN " @@ -14288,168 +14838,168 @@ msgstr "" "проверка сертификата (clientcert=verify-full) для пользователя \"%s\" не " "прошла: отличается CN" -#: libpq/auth.c:2976 +#: libpq/auth.c:3078 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-сервер не определён" -#: libpq/auth.c:2983 +#: libpq/auth.c:3085 #, c-format msgid "RADIUS secret not specified" msgstr "секрет RADIUS не определён" # well-spelled: симв -#: libpq/auth.c:2997 +#: libpq/auth.c:3099 #, c-format msgid "" "RADIUS authentication does not support passwords longer than %d characters" msgstr "проверка подлинности RADIUS не поддерживает пароли длиннее %d симв." -#: libpq/auth.c:3102 libpq/hba.c:1946 +#: libpq/auth.c:3206 libpq/hba.c:2008 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "не удалось преобразовать имя сервера RADIUS \"%s\" в адрес: %s" -#: libpq/auth.c:3116 +#: libpq/auth.c:3220 #, c-format msgid "could not generate random encryption vector" msgstr "не удалось сгенерировать случайный вектор шифрования" -#: libpq/auth.c:3150 +#: libpq/auth.c:3254 #, c-format msgid "could not perform MD5 encryption of password" msgstr "не удалось вычислить MD5-хеш пароля" -#: libpq/auth.c:3176 +#: libpq/auth.c:3280 #, c-format msgid "could not create RADIUS socket: %m" msgstr "не удалось создать сокет RADIUS: %m" -#: libpq/auth.c:3198 +#: libpq/auth.c:3302 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "не удалось привязаться к локальному сокету RADIUS: %m" -#: libpq/auth.c:3208 +#: libpq/auth.c:3312 #, c-format msgid "could not send RADIUS packet: %m" msgstr "не удалось отправить пакет RADIUS: %m" -#: libpq/auth.c:3241 libpq/auth.c:3267 +#: libpq/auth.c:3345 libpq/auth.c:3371 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "превышено время ожидания ответа RADIUS от %s" -#: libpq/auth.c:3260 +#: libpq/auth.c:3364 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "не удалось проверить состояние сокета RADIUS: %m" -#: libpq/auth.c:3290 +#: libpq/auth.c:3394 #, c-format msgid "could not read RADIUS response: %m" msgstr "не удалось прочитать ответ RADIUS: %m" -#: libpq/auth.c:3303 libpq/auth.c:3307 +#: libpq/auth.c:3407 libpq/auth.c:3411 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "ответ RADIUS от %s был отправлен с неверного порта: %d" -#: libpq/auth.c:3316 +#: libpq/auth.c:3420 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "слишком короткий ответ RADIUS от %s: %d" -#: libpq/auth.c:3323 +#: libpq/auth.c:3427 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "в ответе RADIUS от %s испорчена длина: %d (фактическая длина %d)" -#: libpq/auth.c:3331 +#: libpq/auth.c:3435 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "пришёл ответ RADIUS от %s на другой запрос: %d (ожидался %d)" -#: libpq/auth.c:3356 +#: libpq/auth.c:3460 #, c-format msgid "could not perform MD5 encryption of received packet" msgstr "не удалось вычислить MD5 для принятого пакета" -#: libpq/auth.c:3365 +#: libpq/auth.c:3469 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "ответ RADIUS от %s содержит неверную подпись MD5" -#: libpq/auth.c:3383 +#: libpq/auth.c:3487 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "ответ RADIUS от %s содержит неверный код (%d) для пользователя \"%s\"" -#: libpq/be-fsstubs.c:119 libpq/be-fsstubs.c:150 libpq/be-fsstubs.c:178 -#: libpq/be-fsstubs.c:204 libpq/be-fsstubs.c:229 libpq/be-fsstubs.c:277 -#: libpq/be-fsstubs.c:300 libpq/be-fsstubs.c:553 +#: libpq/be-fsstubs.c:128 libpq/be-fsstubs.c:157 libpq/be-fsstubs.c:185 +#: libpq/be-fsstubs.c:211 libpq/be-fsstubs.c:236 libpq/be-fsstubs.c:274 +#: libpq/be-fsstubs.c:297 libpq/be-fsstubs.c:545 #, c-format msgid "invalid large-object descriptor: %d" msgstr "неверный дескриптор большого объекта: %d" -#: libpq/be-fsstubs.c:161 +#: libpq/be-fsstubs.c:168 #, c-format msgid "large object descriptor %d was not opened for reading" msgstr "дескриптор большого объекта %d не был открыт для чтения" -#: libpq/be-fsstubs.c:185 libpq/be-fsstubs.c:560 +#: libpq/be-fsstubs.c:192 libpq/be-fsstubs.c:552 #, c-format msgid "large object descriptor %d was not opened for writing" msgstr "дескриптор большого объекта %d не был открыт для записи" -#: libpq/be-fsstubs.c:212 +#: libpq/be-fsstubs.c:219 #, c-format msgid "lo_lseek result out of range for large-object descriptor %d" msgstr "" "результат lo_lseek для дескриптора большого объекта %d вне допустимого " "диапазона" -#: libpq/be-fsstubs.c:285 +#: libpq/be-fsstubs.c:282 #, c-format msgid "lo_tell result out of range for large-object descriptor %d" msgstr "" "результат lo_tell для дескриптора большого объекта %d вне допустимого " "диапазона" -#: libpq/be-fsstubs.c:432 +#: libpq/be-fsstubs.c:424 #, c-format msgid "could not open server file \"%s\": %m" msgstr "не удалось открыть файл сервера \"%s\": %m" -#: libpq/be-fsstubs.c:454 +#: libpq/be-fsstubs.c:447 #, c-format msgid "could not read server file \"%s\": %m" msgstr "не удалось прочитать файл сервера \"%s\": %m" -#: libpq/be-fsstubs.c:514 +#: libpq/be-fsstubs.c:506 #, c-format msgid "could not create server file \"%s\": %m" msgstr "не удалось создать файл сервера \"%s\": %m" -#: libpq/be-fsstubs.c:526 +#: libpq/be-fsstubs.c:518 #, c-format msgid "could not write server file \"%s\": %m" msgstr "не удалось записать файл сервера \"%s\": %m" -#: libpq/be-fsstubs.c:760 +#: libpq/be-fsstubs.c:758 #, c-format msgid "large object read request is too large" msgstr "при чтении большого объекта запрошен чрезмерный размер" -#: libpq/be-fsstubs.c:802 utils/adt/genfile.c:265 utils/adt/genfile.c:304 -#: utils/adt/genfile.c:340 +#: libpq/be-fsstubs.c:800 utils/adt/genfile.c:267 utils/adt/genfile.c:306 +#: utils/adt/genfile.c:342 #, c-format msgid "requested length cannot be negative" msgstr "запрошенная длина не может быть отрицательной" -#: libpq/be-fsstubs.c:855 storage/large_object/inv_api.c:297 -#: storage/large_object/inv_api.c:309 storage/large_object/inv_api.c:513 -#: storage/large_object/inv_api.c:624 storage/large_object/inv_api.c:814 +#: libpq/be-fsstubs.c:851 storage/large_object/inv_api.c:299 +#: storage/large_object/inv_api.c:311 storage/large_object/inv_api.c:508 +#: storage/large_object/inv_api.c:619 storage/large_object/inv_api.c:809 #, c-format msgid "permission denied for large object %u" msgstr "нет доступа к большому объекту %u" @@ -14537,107 +15087,122 @@ msgstr "принять контекст безопасности GSSAPI не у msgid "GSSAPI size check error" msgstr "ошибка проверки размера в GSSAPI" -#: libpq/be-secure-openssl.c:112 +#: libpq/be-secure-openssl.c:115 #, c-format msgid "could not create SSL context: %s" msgstr "не удалось создать контекст SSL: %s" -#: libpq/be-secure-openssl.c:138 +#: libpq/be-secure-openssl.c:141 #, c-format msgid "could not load server certificate file \"%s\": %s" msgstr "не удалось загрузить сертификат сервера \"%s\": %s" -#: libpq/be-secure-openssl.c:158 +#: libpq/be-secure-openssl.c:161 #, c-format msgid "" "private key file \"%s\" cannot be reloaded because it requires a passphrase" msgstr "" "файл закрытого ключа \"%s\" нельзя перезагрузить, так как он защищён паролем" -#: libpq/be-secure-openssl.c:163 +#: libpq/be-secure-openssl.c:166 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "не удалось загрузить файл закрытого ключа \"%s\": %s" -#: libpq/be-secure-openssl.c:172 +#: libpq/be-secure-openssl.c:175 #, c-format msgid "check of private key failed: %s" msgstr "ошибка при проверке закрытого ключа: %s" #. translator: first %s is a GUC option name, second %s is its value -#: libpq/be-secure-openssl.c:185 libpq/be-secure-openssl.c:208 +#: libpq/be-secure-openssl.c:188 libpq/be-secure-openssl.c:211 #, c-format msgid "\"%s\" setting \"%s\" not supported by this build" msgstr "для параметра \"%s\" значение \"%s\" не поддерживается в данной сборке" -#: libpq/be-secure-openssl.c:195 +#: libpq/be-secure-openssl.c:198 #, c-format msgid "could not set minimum SSL protocol version" msgstr "не удалось задать минимальную версию протокола SSL" -#: libpq/be-secure-openssl.c:218 +#: libpq/be-secure-openssl.c:221 #, c-format msgid "could not set maximum SSL protocol version" msgstr "не удалось задать максимальную версию протокола SSL" -#: libpq/be-secure-openssl.c:234 +#: libpq/be-secure-openssl.c:237 #, c-format msgid "could not set SSL protocol version range" msgstr "не удалось задать диапазон версий протокола SSL" -#: libpq/be-secure-openssl.c:235 +#: libpq/be-secure-openssl.c:238 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "Версия \"%s\" не может быть выше \"%s\"" -#: libpq/be-secure-openssl.c:259 +#: libpq/be-secure-openssl.c:275 #, c-format msgid "could not set the cipher list (no valid ciphers available)" msgstr "не удалось установить список шифров (подходящие шифры отсутствуют)" -#: libpq/be-secure-openssl.c:277 +#: libpq/be-secure-openssl.c:295 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "не удалось загрузить файл корневых сертификатов \"%s\": %s" -#: libpq/be-secure-openssl.c:304 +#: libpq/be-secure-openssl.c:344 #, c-format msgid "could not load SSL certificate revocation list file \"%s\": %s" msgstr "" -"не удалось загрузить файл со списком отзыва сертификатов SSL \"%s\": %s" +"не удалось загрузить список отзыва сертификатов SSL из файла \"%s\": %s" + +#: libpq/be-secure-openssl.c:352 +#, c-format +msgid "could not load SSL certificate revocation list directory \"%s\": %s" +msgstr "" +"не удалось загрузить списки отзыва сертификатов SSL из каталога \"%s\": %s" + +#: libpq/be-secure-openssl.c:360 +#, c-format +msgid "" +"could not load SSL certificate revocation list file \"%s\" or directory \"%s" +"\": %s" +msgstr "" +"не удалось загрузить списки отзыва сертификатов SSL из файла \"%s\" или " +"каталога \"%s\": %s" -#: libpq/be-secure-openssl.c:380 +#: libpq/be-secure-openssl.c:418 #, c-format msgid "could not initialize SSL connection: SSL context not set up" msgstr "" "инициализировать SSL-подключение не удалось: контекст SSL не установлен" -#: libpq/be-secure-openssl.c:388 +#: libpq/be-secure-openssl.c:429 #, c-format msgid "could not initialize SSL connection: %s" msgstr "инициализировать SSL-подключение не удалось: %s" -#: libpq/be-secure-openssl.c:396 +#: libpq/be-secure-openssl.c:437 #, c-format msgid "could not set SSL socket: %s" msgstr "не удалось создать SSL-сокет: %s" -#: libpq/be-secure-openssl.c:451 +#: libpq/be-secure-openssl.c:492 #, c-format msgid "could not accept SSL connection: %m" msgstr "не удалось принять SSL-подключение: %m" -#: libpq/be-secure-openssl.c:455 libpq/be-secure-openssl.c:508 +#: libpq/be-secure-openssl.c:496 libpq/be-secure-openssl.c:549 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "не удалось принять SSL-подключение: обрыв данных" -#: libpq/be-secure-openssl.c:494 +#: libpq/be-secure-openssl.c:535 #, c-format msgid "could not accept SSL connection: %s" msgstr "не удалось принять SSL-подключение: %s" -#: libpq/be-secure-openssl.c:497 +#: libpq/be-secure-openssl.c:538 #, c-format msgid "" "This may indicate that the client does not support any SSL protocol version " @@ -14646,84 +15211,99 @@ msgstr "" "Это может указывать на то, что клиент не поддерживает ни одну версию " "протокола SSL между %s и %s." -#: libpq/be-secure-openssl.c:513 libpq/be-secure-openssl.c:644 -#: libpq/be-secure-openssl.c:708 +#: libpq/be-secure-openssl.c:554 libpq/be-secure-openssl.c:734 +#: libpq/be-secure-openssl.c:798 #, c-format msgid "unrecognized SSL error code: %d" msgstr "нераспознанный код ошибки SSL: %d" -#: libpq/be-secure-openssl.c:555 +#: libpq/be-secure-openssl.c:600 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "Имя SSL-сертификата включает нулевой байт" -#: libpq/be-secure-openssl.c:633 libpq/be-secure-openssl.c:692 +#: libpq/be-secure-openssl.c:640 +#, c-format +msgid "SSL certificate's distinguished name contains embedded null" +msgstr "уникальное имя (DN) в SSL-сертификате содержит нулевой байт" + +#: libpq/be-secure-openssl.c:723 libpq/be-secure-openssl.c:782 #, c-format msgid "SSL error: %s" msgstr "ошибка SSL: %s" -#: libpq/be-secure-openssl.c:873 +#: libpq/be-secure-openssl.c:964 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "не удалось открыть файл параметров DH \"%s\": %m" -#: libpq/be-secure-openssl.c:885 +#: libpq/be-secure-openssl.c:976 #, c-format msgid "could not load DH parameters file: %s" msgstr "не удалось загрузить файл параметров DH: %s" -#: libpq/be-secure-openssl.c:895 +#: libpq/be-secure-openssl.c:986 #, c-format msgid "invalid DH parameters: %s" msgstr "неверные параметры DH: %s" -#: libpq/be-secure-openssl.c:903 +#: libpq/be-secure-openssl.c:995 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "неверные параметры DH: p - не простое число" -#: libpq/be-secure-openssl.c:911 +#: libpq/be-secure-openssl.c:1004 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "" "неверные параметры DH: нет подходящего генератора или небезопасное простое " "число" -#: libpq/be-secure-openssl.c:1067 +#: libpq/be-secure-openssl.c:1165 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: не удалось загрузить параметры DH" -#: libpq/be-secure-openssl.c:1075 +#: libpq/be-secure-openssl.c:1173 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: не удалось задать параметры DH: %s" -#: libpq/be-secure-openssl.c:1102 +#: libpq/be-secure-openssl.c:1200 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: нераспознанное имя кривой: %s" -#: libpq/be-secure-openssl.c:1111 +#: libpq/be-secure-openssl.c:1209 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: не удалось создать ключ" -#: libpq/be-secure-openssl.c:1139 +#: libpq/be-secure-openssl.c:1237 msgid "no SSL error reported" msgstr "нет сообщения об ошибке SSL" -#: libpq/be-secure-openssl.c:1143 +#: libpq/be-secure-openssl.c:1241 #, c-format msgid "SSL error code %lu" msgstr "код ошибки SSL: %lu" -#: libpq/be-secure.c:122 +#: libpq/be-secure-openssl.c:1395 +#, c-format +msgid "could not create BIO" +msgstr "не удалось создать BIO" + +#: libpq/be-secure-openssl.c:1405 +#, c-format +msgid "could not get NID for ASN1_OBJECT object" +msgstr "не удалось получить NID для объекта ASN1_OBJECT" + +#: libpq/be-secure-openssl.c:1413 #, c-format -msgid "SSL connection from \"%s\"" -msgstr "SSL-подключение от \"%s\"" +msgid "could not convert NID %d to an ASN1_OBJECT structure" +msgstr "не удалось преобразовать NID %d в структуру ASN1_OBJECT" -#: libpq/be-secure.c:207 libpq/be-secure.c:303 +#: libpq/be-secure.c:209 libpq/be-secure.c:305 #, c-format msgid "terminating connection due to unexpected postmaster exit" msgstr "закрытие подключения из-за неожиданного завершения главного процесса" @@ -14741,7 +15321,7 @@ msgstr "Пользователь \"%s\" не имеет пароля." #: libpq/crypt.c:77 #, c-format msgid "User \"%s\" has an expired password." -msgstr "Срок пароля пользователя \"%s\" истёк." +msgstr "Срок действия пароля пользователя \"%s\" истёк." #: libpq/crypt.c:179 #, c-format @@ -14759,102 +15339,102 @@ msgstr "Пароль не подходит для пользователя \"%s\ msgid "Password of user \"%s\" is in unrecognized format." msgstr "Пароль пользователя \"%s\" представлен в неизвестном формате." -#: libpq/hba.c:235 +#: libpq/hba.c:241 #, c-format msgid "authentication file token too long, skipping: \"%s\"" msgstr "" "слишком длинный элемент в файле конфигурации безопасности пропускается: \"%s" "\"" -#: libpq/hba.c:407 +#: libpq/hba.c:413 #, c-format msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" msgstr "" "не удалось открыть дополнительный файл конфигурации безопасности \"@%s\" как " "\"%s\": %m" -#: libpq/hba.c:509 -#, c-format -msgid "authentication file line too long" -msgstr "слишком длинная строка в файле конфигурации безопасности" - -#: libpq/hba.c:510 libpq/hba.c:867 libpq/hba.c:887 libpq/hba.c:925 -#: libpq/hba.c:975 libpq/hba.c:989 libpq/hba.c:1013 libpq/hba.c:1022 -#: libpq/hba.c:1035 libpq/hba.c:1056 libpq/hba.c:1069 libpq/hba.c:1089 -#: libpq/hba.c:1111 libpq/hba.c:1123 libpq/hba.c:1182 libpq/hba.c:1202 -#: libpq/hba.c:1216 libpq/hba.c:1236 libpq/hba.c:1247 libpq/hba.c:1262 -#: libpq/hba.c:1281 libpq/hba.c:1297 libpq/hba.c:1309 libpq/hba.c:1346 -#: libpq/hba.c:1387 libpq/hba.c:1400 libpq/hba.c:1422 libpq/hba.c:1434 -#: libpq/hba.c:1452 libpq/hba.c:1502 libpq/hba.c:1546 libpq/hba.c:1557 -#: libpq/hba.c:1573 libpq/hba.c:1590 libpq/hba.c:1600 libpq/hba.c:1658 -#: libpq/hba.c:1696 libpq/hba.c:1718 libpq/hba.c:1730 libpq/hba.c:1817 -#: libpq/hba.c:1835 libpq/hba.c:1929 libpq/hba.c:1948 libpq/hba.c:1977 -#: libpq/hba.c:1990 libpq/hba.c:2013 libpq/hba.c:2035 libpq/hba.c:2049 -#: tsearch/ts_locale.c:217 +#: libpq/hba.c:859 #, c-format -msgid "line %d of configuration file \"%s\"" -msgstr "строка %d файла конфигурации \"%s\"" +msgid "error enumerating network interfaces: %m" +msgstr "ошибка при перечислении сетевых интерфейсов: %m" #. translator: the second %s is a list of auth methods -#: libpq/hba.c:865 +#: libpq/hba.c:886 #, c-format msgid "" "authentication option \"%s\" is only valid for authentication methods %s" msgstr "параметр проверки подлинности \"%s\" допускается только для методов %s" -#: libpq/hba.c:885 +#: libpq/hba.c:888 libpq/hba.c:908 libpq/hba.c:946 libpq/hba.c:996 +#: libpq/hba.c:1010 libpq/hba.c:1034 libpq/hba.c:1043 libpq/hba.c:1056 +#: libpq/hba.c:1077 libpq/hba.c:1090 libpq/hba.c:1110 libpq/hba.c:1132 +#: libpq/hba.c:1144 libpq/hba.c:1203 libpq/hba.c:1223 libpq/hba.c:1237 +#: libpq/hba.c:1257 libpq/hba.c:1268 libpq/hba.c:1283 libpq/hba.c:1302 +#: libpq/hba.c:1318 libpq/hba.c:1330 libpq/hba.c:1367 libpq/hba.c:1408 +#: libpq/hba.c:1421 libpq/hba.c:1443 libpq/hba.c:1455 libpq/hba.c:1473 +#: libpq/hba.c:1523 libpq/hba.c:1567 libpq/hba.c:1578 libpq/hba.c:1594 +#: libpq/hba.c:1611 libpq/hba.c:1622 libpq/hba.c:1641 libpq/hba.c:1657 +#: libpq/hba.c:1673 libpq/hba.c:1731 libpq/hba.c:1748 libpq/hba.c:1761 +#: libpq/hba.c:1773 libpq/hba.c:1792 libpq/hba.c:1879 libpq/hba.c:1897 +#: libpq/hba.c:1991 libpq/hba.c:2010 libpq/hba.c:2039 libpq/hba.c:2052 +#: libpq/hba.c:2075 libpq/hba.c:2097 libpq/hba.c:2111 tsearch/ts_locale.c:232 +#, c-format +msgid "line %d of configuration file \"%s\"" +msgstr "строка %d файла конфигурации \"%s\"" + +#: libpq/hba.c:906 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "" "для метода проверки подлинности \"%s\" требуется определить аргумент \"%s\"" -#: libpq/hba.c:913 +#: libpq/hba.c:934 #, c-format msgid "missing entry in file \"%s\" at end of line %d" msgstr "отсутствует запись в файле \"%s\" в конце строки %d" -#: libpq/hba.c:924 +#: libpq/hba.c:945 #, c-format msgid "multiple values in ident field" msgstr "множественные значения в поле ident" -#: libpq/hba.c:973 +#: libpq/hba.c:994 #, c-format msgid "multiple values specified for connection type" msgstr "для типа подключения указано несколько значений" -#: libpq/hba.c:974 +#: libpq/hba.c:995 #, c-format msgid "Specify exactly one connection type per line." msgstr "Определите в строке единственный тип подключения." -#: libpq/hba.c:988 +#: libpq/hba.c:1009 #, c-format msgid "local connections are not supported by this build" msgstr "локальные подключения не поддерживаются в этой сборке" -#: libpq/hba.c:1011 +#: libpq/hba.c:1032 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "запись с hostssl недействительна, так как поддержка SSL отключена" -#: libpq/hba.c:1012 +#: libpq/hba.c:1033 #, c-format msgid "Set ssl = on in postgresql.conf." msgstr "Установите ssl = on в postgresql.conf." -#: libpq/hba.c:1020 +#: libpq/hba.c:1041 #, c-format msgid "hostssl record cannot match because SSL is not supported by this build" msgstr "" "запись с hostssl недействительна, так как SSL не поддерживается в этой сборке" -#: libpq/hba.c:1021 +#: libpq/hba.c:1042 #, c-format -msgid "Compile with --with-openssl to use SSL connections." -msgstr "Для работы с SSL скомпилируйте postgresql с ключом --with-openssl." +msgid "Compile with --with-ssl to use SSL connections." +msgstr "Для работы с SSL скомпилируйте postgresql с ключом --with-ssl." -#: libpq/hba.c:1033 +#: libpq/hba.c:1054 #, c-format msgid "" "hostgssenc record cannot match because GSSAPI is not supported by this build" @@ -14862,131 +15442,131 @@ msgstr "" "запись с hostgssenc недействительна, так как GSSAPI не поддерживается в этой " "сборке" -#: libpq/hba.c:1034 +#: libpq/hba.c:1055 #, c-format msgid "Compile with --with-gssapi to use GSSAPI connections." msgstr "Для работы с GSSAPI скомпилируйте postgresql с ключом --with-gssapi." -#: libpq/hba.c:1054 +#: libpq/hba.c:1075 #, c-format msgid "invalid connection type \"%s\"" msgstr "неверный тип подключения \"%s\"" -#: libpq/hba.c:1068 +#: libpq/hba.c:1089 #, c-format msgid "end-of-line before database specification" msgstr "конец строки перед определением базы данных" -#: libpq/hba.c:1088 +#: libpq/hba.c:1109 #, c-format msgid "end-of-line before role specification" msgstr "конец строки перед определением роли" -#: libpq/hba.c:1110 +#: libpq/hba.c:1131 #, c-format msgid "end-of-line before IP address specification" msgstr "конец строки перед определением IP-адресов" -#: libpq/hba.c:1121 +#: libpq/hba.c:1142 #, c-format msgid "multiple values specified for host address" msgstr "для адреса узла указано несколько значений" -#: libpq/hba.c:1122 +#: libpq/hba.c:1143 #, c-format msgid "Specify one address range per line." msgstr "Определите в строке один диапазон адресов." -#: libpq/hba.c:1180 +#: libpq/hba.c:1201 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "неверный IP-адрес \"%s\": %s" -#: libpq/hba.c:1200 +#: libpq/hba.c:1221 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "указать одновременно и имя узла, и маску CIDR нельзя: \"%s\"" -#: libpq/hba.c:1214 +#: libpq/hba.c:1235 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "неверная маска CIDR в адресе \"%s\"" -#: libpq/hba.c:1234 +#: libpq/hba.c:1255 #, c-format msgid "end-of-line before netmask specification" msgstr "конец строки перед определением маски сети" -#: libpq/hba.c:1235 +#: libpq/hba.c:1256 #, c-format msgid "" "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "" "Укажите диапазон адресов в формате CIDR или задайте отдельную маску сети." -#: libpq/hba.c:1246 +#: libpq/hba.c:1267 #, c-format msgid "multiple values specified for netmask" msgstr "для сетевой маски указано несколько значений" -#: libpq/hba.c:1260 +#: libpq/hba.c:1281 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "неверная маска IP \"%s\": %s" -#: libpq/hba.c:1280 +#: libpq/hba.c:1301 #, c-format msgid "IP address and mask do not match" msgstr "IP-адрес не соответствует маске" -#: libpq/hba.c:1296 +#: libpq/hba.c:1317 #, c-format msgid "end-of-line before authentication method" msgstr "конец строки перед методом проверки подлинности" -#: libpq/hba.c:1307 +#: libpq/hba.c:1328 #, c-format msgid "multiple values specified for authentication type" msgstr "для типа проверки подлинности указано несколько значений" -#: libpq/hba.c:1308 +#: libpq/hba.c:1329 #, c-format msgid "Specify exactly one authentication type per line." msgstr "Определите в строке единственный тип проверки подлинности." -#: libpq/hba.c:1385 +#: libpq/hba.c:1406 #, c-format msgid "invalid authentication method \"%s\"" msgstr "неверный метод проверки подлинности \"%s\"" -#: libpq/hba.c:1398 +#: libpq/hba.c:1419 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "" "неверный метод проверки подлинности \"%s\": не поддерживается в этой сборке" -#: libpq/hba.c:1421 +#: libpq/hba.c:1442 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "проверка подлинности gssapi для локальных сокетов не поддерживается" -#: libpq/hba.c:1433 +#: libpq/hba.c:1454 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "проверка подлинности peer поддерживается только для локальных сокетов" -#: libpq/hba.c:1451 +#: libpq/hba.c:1472 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "" "проверка подлинности cert поддерживается только для подключений hostssl" -#: libpq/hba.c:1501 +#: libpq/hba.c:1522 #, c-format msgid "authentication option not in name=value format: %s" msgstr "параметр проверки подлинности указан не в формате имя=значение: %s" -#: libpq/hba.c:1545 +#: libpq/hba.c:1566 #, c-format msgid "" "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, " @@ -14995,7 +15575,7 @@ msgstr "" "нельзя использовать ldapbasedn, ldapbinddn, ldapbindpasswd, " "ldapsearchattribute, ldapsearchfilter или ldapurl вместе с ldapprefix" -#: libpq/hba.c:1556 +#: libpq/hba.c:1577 #, c-format msgid "" "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix" @@ -15004,134 +15584,164 @@ msgstr "" "для метода проверки подлинности \"ldap\" требуется установить аргументы " "\"ldapbasedn\" и \"ldapprefix\" или \"ldapsuffix\"" -#: libpq/hba.c:1572 +#: libpq/hba.c:1593 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "нельзя использовать ldapsearchattribute вместе с ldapsearchfilter" -#: libpq/hba.c:1589 +#: libpq/hba.c:1610 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "список серверов RADIUS не может быть пустым" -#: libpq/hba.c:1599 +#: libpq/hba.c:1621 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "список секретов RADIUS не может быть пустым" -#: libpq/hba.c:1652 +#: libpq/hba.c:1638 +#, c-format +msgid "" +"the number of RADIUS secrets (%d) must be 1 or the same as the number of " +"RADIUS servers (%d)" +msgstr "" +"количество секретов RADIUS (%d) должно равняться 1 или количеству серверов " +"RADIUS (%d)" + +#: libpq/hba.c:1654 +#, c-format +msgid "" +"the number of RADIUS ports (%d) must be 1 or the same as the number of " +"RADIUS servers (%d)" +msgstr "" +"количество портов RADIUS (%d) должно равняться 1 или количеству серверов " +"RADIUS (%d)" + +#: libpq/hba.c:1670 #, c-format -msgid "the number of %s (%d) must be 1 or the same as the number of %s (%d)" +msgid "" +"the number of RADIUS identifiers (%d) must be 1 or the same as the number of " +"RADIUS servers (%d)" msgstr "" -"количество элементов %s (%d) должно равняться 1 или количеству элементов %s " -"(%d)" +"количество идентификаторов RADIUS (%d) должно равняться 1 или количеству " +"серверов RADIUS (%d)" -#: libpq/hba.c:1686 +#: libpq/hba.c:1721 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi и cert" -#: libpq/hba.c:1695 +#: libpq/hba.c:1730 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert можно определить только в строках \"hostssl\"" -#: libpq/hba.c:1717 +#: libpq/hba.c:1747 #, c-format msgid "" -"clientcert cannot be set to \"no-verify\" when using \"cert\" authentication" +"clientcert only accepts \"verify-full\" when using \"cert\" authentication" msgstr "" -"clientcert не может иметь значение \"no-verify\" при использовании проверки " -"подлинности \"cert\"" +"с проверкой подлинности \"cert\" для clientcert допускается только значение " +"\"verify-full\"" -#: libpq/hba.c:1729 +#: libpq/hba.c:1760 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "неверное значение для clientcert: \"%s\"" -#: libpq/hba.c:1763 +#: libpq/hba.c:1772 +#, c-format +msgid "clientname can only be configured for \"hostssl\" rows" +msgstr "clientname можно определить только в строках \"hostssl\"" + +#: libpq/hba.c:1791 +#, c-format +msgid "invalid value for clientname: \"%s\"" +msgstr "неверное значение для clientname: \"%s\"" + +#: libpq/hba.c:1825 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "не удалось разобрать URL-адрес LDAP \"%s\": %s" -#: libpq/hba.c:1774 +#: libpq/hba.c:1836 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "неподдерживаемая схема в URL-адресе LDAP: %s" -#: libpq/hba.c:1798 +#: libpq/hba.c:1860 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "URL-адреса LDAP не поддерживаются в этой ОС" -#: libpq/hba.c:1816 +#: libpq/hba.c:1878 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "неверное значение ldapscheme: \"%s\"" -#: libpq/hba.c:1834 +#: libpq/hba.c:1896 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "неверный номер порта LDAP: \"%s\"" -#: libpq/hba.c:1880 libpq/hba.c:1887 +#: libpq/hba.c:1942 libpq/hba.c:1949 msgid "gssapi and sspi" msgstr "gssapi и sspi" -#: libpq/hba.c:1896 libpq/hba.c:1905 +#: libpq/hba.c:1958 libpq/hba.c:1967 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1927 +#: libpq/hba.c:1989 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "не удалось разобрать список серверов RADIUS \"%s\"" -#: libpq/hba.c:1975 +#: libpq/hba.c:2037 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "не удалось разобрать список портов RADIUS \"%s\"" -#: libpq/hba.c:1989 +#: libpq/hba.c:2051 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "неверный номер порта RADIUS: \"%s\"" -#: libpq/hba.c:2011 +#: libpq/hba.c:2073 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "не удалось разобрать список секретов RADIUS \"%s\"" -#: libpq/hba.c:2033 +#: libpq/hba.c:2095 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "не удалось разобрать список идентификаторов RADIUS \"%s\"" -#: libpq/hba.c:2047 +#: libpq/hba.c:2109 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "нераспознанное имя атрибута проверки подлинности: \"%s\"" -#: libpq/hba.c:2193 libpq/hba.c:2613 guc-file.l:631 +#: libpq/hba.c:2255 libpq/hba.c:2669 guc-file.l:632 #, c-format msgid "could not open configuration file \"%s\": %m" msgstr "открыть файл конфигурации \"%s\" не удалось: %m" -#: libpq/hba.c:2244 +#: libpq/hba.c:2306 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "файл конфигурации \"%s\" не содержит записей" -#: libpq/hba.c:2768 +#: libpq/hba.c:2824 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "неверное регулярное выражение \"%s\": %s" -#: libpq/hba.c:2828 +#: libpq/hba.c:2884 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "ошибка при поиске по регулярному выражению для \"%s\": %s" -#: libpq/hba.c:2847 +#: libpq/hba.c:2903 #, c-format msgid "" "regular expression \"%s\" has no subexpressions as requested by " @@ -15140,190 +15750,209 @@ msgstr "" "в регулярном выражении \"%s\" нет подвыражений, требуемых для обратной " "ссылки в \"%s\"" -#: libpq/hba.c:2943 +#: libpq/hba.c:2999 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "" "указанное имя пользователя (%s) не совпадает с именем прошедшего проверку " "(%s)" -#: libpq/hba.c:2963 +#: libpq/hba.c:3019 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "" "нет соответствия в файле сопоставлений \"%s\" для пользователя \"%s\", " "прошедшего проверку как \"%s\"" -#: libpq/hba.c:2996 +#: libpq/hba.c:3052 #, c-format msgid "could not open usermap file \"%s\": %m" msgstr "не удалось открыть файл сопоставлений пользователей \"%s\": %m" -#: libpq/pqcomm.c:218 +#: libpq/pqcomm.c:204 #, c-format msgid "could not set socket to nonblocking mode: %m" msgstr "не удалось перевести сокет в неблокирующий режим: %m" -#: libpq/pqcomm.c:369 +#: libpq/pqcomm.c:362 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "длина пути Unix-сокета \"%s\" превышает предел (%d байт)" -#: libpq/pqcomm.c:390 +#: libpq/pqcomm.c:383 #, c-format msgid "could not translate host name \"%s\", service \"%s\" to address: %s" msgstr "перевести имя узла \"%s\", службы \"%s\" в адрес не удалось: %s" -#: libpq/pqcomm.c:394 +#: libpq/pqcomm.c:387 #, c-format msgid "could not translate service \"%s\" to address: %s" msgstr "не удалось перевести имя службы \"%s\" в адрес: %s" -#: libpq/pqcomm.c:421 +#: libpq/pqcomm.c:414 #, c-format msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" msgstr "" "не удалось привязаться ко всем запрошенным адресам: превышен предел " "MAXLISTEN (%d)" -#: libpq/pqcomm.c:430 +#: libpq/pqcomm.c:423 msgid "IPv4" msgstr "IPv4" -#: libpq/pqcomm.c:434 +#: libpq/pqcomm.c:427 msgid "IPv6" msgstr "IPv6" -#: libpq/pqcomm.c:439 +#: libpq/pqcomm.c:432 msgid "Unix" msgstr "Unix" -#: libpq/pqcomm.c:444 +#: libpq/pqcomm.c:437 #, c-format msgid "unrecognized address family %d" msgstr "нераспознанное семейство адресов: %d" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:470 +#: libpq/pqcomm.c:463 #, c-format msgid "could not create %s socket for address \"%s\": %m" msgstr "не удалось создать сокет %s для адреса \"%s\": %m" -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:496 -#, c-format -msgid "setsockopt(SO_REUSEADDR) failed for %s address \"%s\": %m" -msgstr "ошибка в setsockopt(SO_REUSEADDR) для адреса %s \"%s\": %m" - -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:513 +#. translator: third %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:489 libpq/pqcomm.c:507 #, c-format -msgid "setsockopt(IPV6_V6ONLY) failed for %s address \"%s\": %m" -msgstr "ошибка в setsockopt(IPV6_V6ONLY) для адреса %s \"%s\": %m" +msgid "%s(%s) failed for %s address \"%s\": %m" +msgstr "ошибка в %s(%s) для адреса %s \"%s\": %m" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:533 +#: libpq/pqcomm.c:530 #, c-format msgid "could not bind %s address \"%s\": %m" msgstr "не удалось привязаться к адресу %s \"%s\": %m" -#: libpq/pqcomm.c:536 +#: libpq/pqcomm.c:534 #, c-format -msgid "" -"Is another postmaster already running on port %d? If not, remove socket file " -"\"%s\" and retry." -msgstr "" -"Возможно порт %d занят другим процессом postmaster? Если нет, удалите файл " -"\"%s\" и повторите попытку." +msgid "Is another postmaster already running on port %d?" +msgstr "Возможно, порт %d занят другим процессом postmaster?" -#: libpq/pqcomm.c:539 +#: libpq/pqcomm.c:536 #, c-format msgid "" "Is another postmaster already running on port %d? If not, wait a few seconds " "and retry." msgstr "" -"Возможно порт %d занят другим процессом postmaster? Если нет, повторите " +"Возможно, порт %d занят другим процессом postmaster? Если нет, повторите " "попытку через несколько секунд." #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:572 +#: libpq/pqcomm.c:569 #, c-format msgid "could not listen on %s address \"%s\": %m" msgstr "не удалось привязаться к адресу %s \"%s\": %m" -#: libpq/pqcomm.c:581 +#: libpq/pqcomm.c:578 #, c-format msgid "listening on Unix socket \"%s\"" msgstr "для приёма подключений открыт Unix-сокет \"%s\"" #. translator: first %s is IPv4 or IPv6 -#: libpq/pqcomm.c:587 +#: libpq/pqcomm.c:584 #, c-format msgid "listening on %s address \"%s\", port %d" msgstr "для приёма подключений по адресу %s \"%s\" открыт порт %d" -#: libpq/pqcomm.c:670 +#: libpq/pqcomm.c:675 #, c-format msgid "group \"%s\" does not exist" msgstr "группа \"%s\" не существует" -#: libpq/pqcomm.c:680 +#: libpq/pqcomm.c:685 #, c-format msgid "could not set group of file \"%s\": %m" msgstr "не удалось установить группу для файла \"%s\": %m" -#: libpq/pqcomm.c:691 +#: libpq/pqcomm.c:696 #, c-format msgid "could not set permissions of file \"%s\": %m" msgstr "не удалось установить права доступа для файла \"%s\": %m" -#: libpq/pqcomm.c:721 +#: libpq/pqcomm.c:726 #, c-format msgid "could not accept new connection: %m" msgstr "не удалось принять новое подключение: %m" -#: libpq/pqcomm.c:911 +#: libpq/pqcomm.c:766 libpq/pqcomm.c:775 libpq/pqcomm.c:807 libpq/pqcomm.c:817 +#: libpq/pqcomm.c:1642 libpq/pqcomm.c:1687 libpq/pqcomm.c:1727 +#: libpq/pqcomm.c:1771 libpq/pqcomm.c:1810 libpq/pqcomm.c:1849 +#: libpq/pqcomm.c:1885 libpq/pqcomm.c:1924 postmaster/pgstat.c:619 +#: postmaster/pgstat.c:630 +#, c-format +msgid "%s(%s) failed: %m" +msgstr "ошибка в %s(%s): %m" + +#: libpq/pqcomm.c:921 #, c-format msgid "there is no client connection" msgstr "нет клиентского подключения" -#: libpq/pqcomm.c:962 libpq/pqcomm.c:1058 +#: libpq/pqcomm.c:972 libpq/pqcomm.c:1068 #, c-format msgid "could not receive data from client: %m" msgstr "не удалось получить данные от клиента: %m" -#: libpq/pqcomm.c:1203 tcop/postgres.c:4154 +#: libpq/pqcomm.c:1173 tcop/postgres.c:4292 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "закрытие подключения из-за потери синхронизации протокола" -#: libpq/pqcomm.c:1269 +#: libpq/pqcomm.c:1239 #, c-format msgid "unexpected EOF within message length word" msgstr "неожиданный обрыв данных в слове длины сообщения" -#: libpq/pqcomm.c:1280 +#: libpq/pqcomm.c:1249 #, c-format msgid "invalid message length" msgstr "неверная длина сообщения" -#: libpq/pqcomm.c:1302 libpq/pqcomm.c:1315 +#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 #, c-format msgid "incomplete message from client" msgstr "неполное сообщение от клиента" -#: libpq/pqcomm.c:1448 +#: libpq/pqcomm.c:1395 #, c-format msgid "could not send data to client: %m" msgstr "не удалось послать данные клиенту: %m" +#: libpq/pqcomm.c:1610 +#, c-format +msgid "%s(%s) failed: error code %d" +msgstr "ошибка в %s(%s): код ошибки %d" + +#: libpq/pqcomm.c:1699 +#, c-format +msgid "setting the keepalive idle time is not supported" +msgstr "изменение значения keepalives_idle не поддерживается" + +#: libpq/pqcomm.c:1783 libpq/pqcomm.c:1858 libpq/pqcomm.c:1933 +#, c-format +msgid "%s(%s) not supported" +msgstr "%s(%s) не поддерживается" + +#: libpq/pqcomm.c:1968 +#, c-format +msgid "could not poll socket: %m" +msgstr "не удалось опросить сокет: %m" + #: libpq/pqformat.c:406 #, c-format msgid "no data left in message" msgstr "в сообщении не осталось данных" #: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 -#: utils/adt/arrayfuncs.c:1471 utils/adt/rowtypes.c:567 +#: utils/adt/arrayfuncs.c:1482 utils/adt/rowtypes.c:588 #, c-format msgid "insufficient data left in message" msgstr "недостаточно данных осталось в сообщении" @@ -15338,12 +15967,12 @@ msgstr "неверная строка в сообщении" msgid "invalid message format" msgstr "неверный формат сообщения" -#: main/main.c:246 +#: main/main.c:245 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: ошибка WSAStartup: %d\n" -#: main/main.c:310 +#: main/main.c:309 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -15352,7 +15981,7 @@ msgstr "" "%s - сервер PostgreSQL.\n" "\n" -#: main/main.c:311 +#: main/main.c:310 #, c-format msgid "" "Usage:\n" @@ -15363,116 +15992,109 @@ msgstr "" " %s [ПАРАМЕТР]...\n" "\n" -#: main/main.c:312 +#: main/main.c:311 #, c-format msgid "Options:\n" msgstr "Параметры:\n" -#: main/main.c:313 +#: main/main.c:312 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B ЧИСЛО_БУФ число разделяемых буферов\n" -#: main/main.c:314 +#: main/main.c:313 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c ИМЯ=ЗНАЧЕНИЕ установить параметр выполнения\n" -#: main/main.c:315 +#: main/main.c:314 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C ИМЯ вывести значение параметра выполнения и выйти\n" -#: main/main.c:316 +#: main/main.c:315 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 уровень отладочных сообщений\n" -#: main/main.c:317 +#: main/main.c:316 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D КАТАЛОГ каталог с данными\n" # well-spelled: ДМГ -#: main/main.c:318 +#: main/main.c:317 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e использовать европейский формат дат (ДМГ)\n" -#: main/main.c:319 +#: main/main.c:318 #, c-format msgid " -F turn fsync off\n" msgstr " -F выключить синхронизацию с ФС\n" -#: main/main.c:320 +#: main/main.c:319 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h ИМЯ имя или IP-адрес для приёма сетевых соединений\n" -#: main/main.c:321 +#: main/main.c:320 #, c-format msgid " -i enable TCP/IP connections\n" msgstr " -i включить соединения TCP/IP\n" -#: main/main.c:322 +#: main/main.c:321 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k КАТАЛОГ расположение Unix-сокетов\n" -#: main/main.c:324 +#: main/main.c:323 #, c-format msgid " -l enable SSL connections\n" msgstr " -l разрешить SSL-подключения\n" # well-spelled: ПОДКЛ -#: main/main.c:326 +#: main/main.c:325 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N МАКС_ПОДКЛ предельное число подключений\n" -#: main/main.c:327 -#, c-format -msgid "" -" -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n" -msgstr "" -" -o ПАРАМЕТРЫ параметры для серверных процессов (уже неактуально)\n" - -#: main/main.c:328 +#: main/main.c:326 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p ПОРТ номер порта для приёма подключений\n" -#: main/main.c:329 +#: main/main.c:327 #, c-format msgid " -s show statistics after each query\n" msgstr " -s показывать статистику после каждого запроса\n" -#: main/main.c:330 +#: main/main.c:328 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S РАБ_ПАМЯТЬ задать объём памяти для сортировки (в КБ)\n" -#: main/main.c:331 +#: main/main.c:329 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: main/main.c:332 +#: main/main.c:330 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --ИМЯ=ЗНАЧЕНИЕ установить параметр выполнения\n" -#: main/main.c:333 +#: main/main.c:331 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config вывести параметры конфигурации и выйти\n" -#: main/main.c:334 +#: main/main.c:332 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: main/main.c:336 +#: main/main.c:334 #, c-format msgid "" "\n" @@ -15481,12 +16103,12 @@ msgstr "" "\n" "Параметры для разработчиков:\n" -#: main/main.c:337 +#: main/main.c:335 #, c-format msgid " -f s|i|n|m|h forbid use of some plan types\n" msgstr " -f s|i|n|m|h запретить некоторые типы планов\n" -#: main/main.c:338 +#: main/main.c:336 #, c-format msgid "" " -n do not reinitialize shared memory after abnormal exit\n" @@ -15494,22 +16116,22 @@ msgstr "" " -n не переинициализировать разделяемую память после\n" " аварийного выхода\n" -#: main/main.c:339 +#: main/main.c:337 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O разрешить изменять структуру системных таблиц\n" -#: main/main.c:340 +#: main/main.c:338 #, c-format msgid " -P disable system indexes\n" msgstr " -P отключить системные индексы\n" -#: main/main.c:341 +#: main/main.c:339 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex показать время каждого запроса\n" -#: main/main.c:342 +#: main/main.c:340 #, c-format msgid "" " -T send SIGSTOP to all backend processes if one dies\n" @@ -15517,13 +16139,13 @@ msgstr "" " -T посылать сигнал SIGSTOP всем серверным процессам\n" " при отключении одного\n" -#: main/main.c:343 +#: main/main.c:341 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr "" " -W СЕК ждать заданное число секунд для подключения отладчика\n" -#: main/main.c:345 +#: main/main.c:343 #, c-format msgid "" "\n" @@ -15532,7 +16154,7 @@ msgstr "" "\n" "Параметры для монопольного режима:\n" -#: main/main.c:346 +#: main/main.c:344 #, c-format msgid "" " --single selects single-user mode (must be first argument)\n" @@ -15540,22 +16162,22 @@ msgstr "" " --single включить монопольный режим\n" " (этот аргумент должен быть первым)\n" -#: main/main.c:347 +#: main/main.c:345 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " ИМЯ_БД база данных (по умолчанию - имя пользователя)\n" -#: main/main.c:348 +#: main/main.c:346 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 переопределить уровень отладочных сообщений\n" -#: main/main.c:349 +#: main/main.c:347 #, c-format msgid " -E echo statement before execution\n" msgstr " -E выводить SQL-операторы перед выполнением\n" -#: main/main.c:350 +#: main/main.c:348 #, c-format msgid "" " -j do not use newline as interactive query delimiter\n" @@ -15563,12 +16185,12 @@ msgstr "" " -j не считать конец строки разделителем интерактивных " "запросов\n" -#: main/main.c:351 main/main.c:356 +#: main/main.c:349 main/main.c:354 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr " -r ИМЯ_ФАЙЛА перенаправить STDOUT и STDERR в указанный файл\n" -#: main/main.c:353 +#: main/main.c:351 #, c-format msgid "" "\n" @@ -15577,7 +16199,7 @@ msgstr "" "\n" "Параметры для режима инициализации:\n" -#: main/main.c:354 +#: main/main.c:352 #, c-format msgid "" " --boot selects bootstrapping mode (must be first argument)\n" @@ -15585,7 +16207,7 @@ msgstr "" " --boot включить режим инициализации\n" " (этот аргумент должен быть первым)\n" -#: main/main.c:355 +#: main/main.c:353 #, c-format msgid "" " DBNAME database name (mandatory argument in bootstrapping " @@ -15593,12 +16215,12 @@ msgid "" msgstr "" " ИМЯ_БД имя базы данных (необходимо в режиме инициализации)\n" -#: main/main.c:357 +#: main/main.c:355 #, c-format msgid " -x NUM internal use\n" msgstr " -x ЧИСЛО параметр для внутреннего использования\n" -#: main/main.c:359 +#: main/main.c:357 #, c-format msgid "" "\n" @@ -15615,12 +16237,12 @@ msgstr "" "\n" "Об ошибках сообщайте по адресу <%s>.\n" -#: main/main.c:363 +#: main/main.c:361 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" -#: main/main.c:374 +#: main/main.c:372 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -15633,12 +16255,12 @@ msgstr "" "должен запускать обычный пользователь. Подробнее о том, как\n" "правильно запускать сервер, вы можете узнать в документации.\n" -#: main/main.c:391 +#: main/main.c:389 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: фактический и эффективный ID пользователя должны совпадать\n" -#: main/main.c:398 +#: main/main.c:396 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -15663,20 +16285,25 @@ msgstr "расширенный тип узла \"%s\" уже существуе msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "методы расширенного узла \"%s\" не зарегистрированы" -#: nodes/nodeFuncs.c:122 nodes/nodeFuncs.c:153 parser/parse_coerce.c:2208 -#: parser/parse_coerce.c:2317 parser/parse_coerce.c:2352 -#: parser/parse_expr.c:2207 parser/parse_func.c:701 parser/parse_oper.c:967 -#: utils/fmgr/funcapi.c:528 +#: nodes/makefuncs.c:150 statistics/extended_stats.c:2293 +#, c-format +msgid "relation \"%s\" does not have a composite type" +msgstr "отношение \"%s\" не имеет составного типа" + +#: nodes/nodeFuncs.c:114 nodes/nodeFuncs.c:145 parser/parse_coerce.c:2567 +#: parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 +#: parser/parse_expr.c:2026 parser/parse_func.c:710 parser/parse_oper.c:883 +#: utils/fmgr/funcapi.c:558 #, c-format msgid "could not find array type for data type %s" msgstr "тип массива для типа данных %s не найден" -#: nodes/params.c:359 +#: nodes/params.c:417 #, c-format msgid "portal \"%s\" with parameters: %s" msgstr "портал \"%s\" с параметрами: %s" -#: nodes/params.c:362 +#: nodes/params.c:420 #, c-format msgid "unnamed portal with parameters: %s" msgstr "неименованный портал с параметрами: %s" @@ -15691,25 +16318,25 @@ msgstr "" "слиянием или хеш-соединение" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1198 +#: optimizer/plan/initsplan.c:1192 #, c-format msgid "%s cannot be applied to the nullable side of an outer join" msgstr "%s не может применяться к NULL-содержащей стороне внешнего соединения" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1922 parser/analyze.c:1639 parser/analyze.c:1855 -#: parser/analyze.c:2682 +#: optimizer/plan/planner.c:1316 parser/analyze.c:1677 parser/analyze.c:1933 +#: parser/analyze.c:3112 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s несовместимо с UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:2509 optimizer/plan/planner.c:4162 +#: optimizer/plan/planner.c:1979 optimizer/plan/planner.c:3635 #, c-format msgid "could not implement GROUP BY" msgstr "не удалось реализовать GROUP BY" -#: optimizer/plan/planner.c:2510 optimizer/plan/planner.c:4163 -#: optimizer/plan/planner.c:4890 optimizer/prep/prepunion.c:1045 +#: optimizer/plan/planner.c:1980 optimizer/plan/planner.c:3636 +#: optimizer/plan/planner.c:4393 optimizer/prep/prepunion.c:1046 #, c-format msgid "" "Some of the datatypes only support hashing, while others only support " @@ -15718,82 +16345,82 @@ msgstr "" "Одни типы данных поддерживают только хеширование, а другие - только " "сортировку." -#: optimizer/plan/planner.c:4889 +#: optimizer/plan/planner.c:4392 #, c-format msgid "could not implement DISTINCT" msgstr "не удалось реализовать DISTINCT" -#: optimizer/plan/planner.c:5737 +#: optimizer/plan/planner.c:5240 #, c-format msgid "could not implement window PARTITION BY" msgstr "не удалось реализовать PARTITION BY для окна" -#: optimizer/plan/planner.c:5738 +#: optimizer/plan/planner.c:5241 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Столбцы, разбивающие окна, должны иметь сортируемые типы данных." -#: optimizer/plan/planner.c:5742 +#: optimizer/plan/planner.c:5245 #, c-format msgid "could not implement window ORDER BY" msgstr "не удалось реализовать ORDER BY для окна" -#: optimizer/plan/planner.c:5743 +#: optimizer/plan/planner.c:5246 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Столбцы, сортирующие окна, должны иметь сортируемые типы данных." -#: optimizer/plan/setrefs.c:451 +#: optimizer/plan/setrefs.c:516 #, c-format msgid "too many range table entries" msgstr "слишком много элементов RTE" -#: optimizer/prep/prepunion.c:508 +#: optimizer/prep/prepunion.c:509 #, c-format msgid "could not implement recursive UNION" msgstr "не удалось реализовать рекурсивный UNION" -#: optimizer/prep/prepunion.c:509 +#: optimizer/prep/prepunion.c:510 #, c-format msgid "All column datatypes must be hashable." msgstr "Все столбцы должны иметь хешируемые типы данных." #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1044 +#: optimizer/prep/prepunion.c:1045 #, c-format msgid "could not implement %s" msgstr "не удалось реализовать %s" -#: optimizer/util/clauses.c:4772 +#: optimizer/util/clauses.c:4729 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "внедрённая в код SQL-функция \"%s\"" -#: optimizer/util/plancat.c:133 +#: optimizer/util/plancat.c:132 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "" "обращаться к временным или нежурналируемым отношениям в процессе " "восстановления нельзя" -#: optimizer/util/plancat.c:665 +#: optimizer/util/plancat.c:672 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "" "указания со ссылкой на всю строку для выбора уникального индекса не " "поддерживаются" -#: optimizer/util/plancat.c:682 +#: optimizer/util/plancat.c:689 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "ограничению в ON CONFLICT не соответствует индекс" -#: optimizer/util/plancat.c:732 +#: optimizer/util/plancat.c:739 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATE не поддерживается с ограничениями-исключениями" -#: optimizer/util/plancat.c:837 +#: optimizer/util/plancat.c:844 #, c-format msgid "" "there is no unique or exclusion constraint matching the ON CONFLICT " @@ -15802,22 +16429,22 @@ msgstr "" "нет уникального ограничения или ограничения-исключения, соответствующего " "указанию ON CONFLICT" -#: parser/analyze.c:705 parser/analyze.c:1401 +#: parser/analyze.c:737 parser/analyze.c:1451 #, c-format msgid "VALUES lists must all be the same length" msgstr "списки VALUES должны иметь одинаковую длину" -#: parser/analyze.c:904 +#: parser/analyze.c:938 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT содержит больше выражений, чем целевых столбцов" -#: parser/analyze.c:922 +#: parser/analyze.c:956 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT содержит больше целевых столбцов, чем выражений" -#: parser/analyze.c:926 +#: parser/analyze.c:960 #, c-format msgid "" "The insertion source is a row expression containing the same number of " @@ -15826,29 +16453,29 @@ msgstr "" "Источником данных является строка, включающая столько же столбцов, сколько " "требуется для INSERT. Вы намеренно использовали скобки?" -#: parser/analyze.c:1210 parser/analyze.c:1612 +#: parser/analyze.c:1259 parser/analyze.c:1650 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "SELECT ... INTO здесь не допускается" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1542 parser/analyze.c:2861 +#: parser/analyze.c:1580 parser/analyze.c:3306 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s нельзя применять к VALUES" -#: parser/analyze.c:1777 +#: parser/analyze.c:1816 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "неверное предложение UNION/INTERSECT/EXCEPT ORDER BY" -#: parser/analyze.c:1778 +#: parser/analyze.c:1817 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "" "Допустимо использование только имён столбцов, но не выражений или функций." -#: parser/analyze.c:1779 +#: parser/analyze.c:1818 #, c-format msgid "" "Add the expression/function to every SELECT, or move the UNION into a FROM " @@ -15857,12 +16484,12 @@ msgstr "" "Добавьте выражение/функцию в каждый SELECT или перенесите UNION в " "предложение FROM." -#: parser/analyze.c:1845 +#: parser/analyze.c:1923 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTO можно добавить только в первый SELECT в UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:1917 +#: parser/analyze.c:1995 #, c-format msgid "" "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of " @@ -15871,159 +16498,173 @@ msgstr "" "оператор, составляющий UNION/INTERSECT/EXCEPT, не может ссылаться на другие " "отношения на том же уровне запроса" -#: parser/analyze.c:2004 +#: parser/analyze.c:2082 #, c-format msgid "each %s query must have the same number of columns" msgstr "все запросы в %s должны возвращать одинаковое число столбцов" -#: parser/analyze.c:2393 +#: parser/analyze.c:2483 #, c-format msgid "RETURNING must have at least one column" msgstr "в RETURNING должен быть минимум один столбец" -#: parser/analyze.c:2434 +#: parser/analyze.c:2586 +#, c-format +msgid "assignment source returned %d column" +msgid_plural "assignment source returned %d columns" +msgstr[0] "источник присваиваемого значения выдал %d столбец" +msgstr[1] "источник присваиваемого значения выдал %d столбца" +msgstr[2] "источник присваиваемого значения выдал %d столбцов" + +#: parser/analyze.c:2647 +#, c-format +msgid "variable \"%s\" is of type %s but expression is of type %s" +msgstr "переменная \"%s\" имеет тип %s, а выражение - тип %s" + +#. translator: %s is a SQL keyword +#: parser/analyze.c:2771 parser/analyze.c:2779 #, c-format -msgid "cannot specify both SCROLL and NO SCROLL" -msgstr "противоречивые указания SCROLL и NO SCROLL" +msgid "cannot specify both %s and %s" +msgstr "указать %s и %s одновременно нельзя" -#: parser/analyze.c:2453 +#: parser/analyze.c:2799 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR не может содержать операторы, изменяющие данные, в WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2461 +#: parser/analyze.c:2807 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s не поддерживается" -#: parser/analyze.c:2464 +#: parser/analyze.c:2810 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "Сохраняемые курсоры должны быть READ ONLY." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2472 +#: parser/analyze.c:2818 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %s не поддерживается" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2483 +#: parser/analyze.c:2829 #, c-format -msgid "DECLARE INSENSITIVE CURSOR ... %s is not supported" -msgstr "DECLARE INSENSITIVE CURSOR ... %s не поддерживается" +msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" +msgstr "DECLARE INSENSITIVE CURSOR ... %s не допускается" -#: parser/analyze.c:2486 +#: parser/analyze.c:2832 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Независимые курсоры должны быть READ ONLY." -#: parser/analyze.c:2552 +#: parser/analyze.c:2898 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "" "в материализованных представлениях не должны использоваться операторы, " "изменяющие данные в WITH" -#: parser/analyze.c:2562 +#: parser/analyze.c:2908 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "" "в материализованных представлениях не должны использоваться временные " "таблицы и представления" -#: parser/analyze.c:2572 +#: parser/analyze.c:2918 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "" "определять материализованные представления со связанными параметрами нельзя" -#: parser/analyze.c:2584 +#: parser/analyze.c:2930 #, c-format msgid "materialized views cannot be unlogged" msgstr "материализованные представления не могут быть нежурналируемыми" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2689 +#: parser/analyze.c:3119 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "%s несовместимо с предложением DISTINCT" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2696 +#: parser/analyze.c:3126 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "%s несовместимо с предложением GROUP BY" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2703 +#: parser/analyze.c:3133 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "%s несовместимо с предложением HAVING" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2710 +#: parser/analyze.c:3140 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "%s несовместимо с агрегатными функциями" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2717 +#: parser/analyze.c:3147 #, c-format msgid "%s is not allowed with window functions" msgstr "%s несовместимо с оконными функциями" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2724 +#: parser/analyze.c:3154 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "" "%s не допускается с функциями, возвращающие множества, в списке результатов" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2803 +#: parser/analyze.c:3246 #, c-format msgid "%s must specify unqualified relation names" msgstr "для %s нужно указывать неполные имена отношений" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2834 +#: parser/analyze.c:3279 #, c-format msgid "%s cannot be applied to a join" msgstr "%s нельзя применить к соединению" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2843 +#: parser/analyze.c:3288 #, c-format msgid "%s cannot be applied to a function" msgstr "%s нельзя применить к функции" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2852 +#: parser/analyze.c:3297 #, c-format msgid "%s cannot be applied to a table function" msgstr "%s нельзя применить к табличной функции" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2870 +#: parser/analyze.c:3315 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%s нельзя применить к запросу WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2879 +#: parser/analyze.c:3324 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s нельзя применить к именованному хранилищу кортежей" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2899 +#: parser/analyze.c:3344 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "отношение \"%s\" в определении %s отсутствует в предложении FROM" -#: parser/parse_agg.c:220 parser/parse_oper.c:222 +#: parser/parse_agg.c:220 parser/parse_oper.c:227 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "для типа %s не удалось найти оператор сортировки" @@ -16131,84 +16772,92 @@ msgid "grouping operations are not allowed in index predicates" msgstr "операции группировки нельзя применять в предикатах индексов" #: parser/parse_agg.c:490 +msgid "aggregate functions are not allowed in statistics expressions" +msgstr "агрегатные функции нельзя применять в выражениях статистики" + +#: parser/parse_agg.c:492 +msgid "grouping operations are not allowed in statistics expressions" +msgstr "операции группировки нельзя применять в выражениях статистики" + +#: parser/parse_agg.c:497 msgid "aggregate functions are not allowed in transform expressions" msgstr "агрегатные функции нельзя применять в выражениях преобразований" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:499 msgid "grouping operations are not allowed in transform expressions" msgstr "операции группировки нельзя применять в выражениях преобразований" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:504 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "агрегатные функции нельзя применять в параметрах EXECUTE" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:506 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "операции группировки нельзя применять в параметрах EXECUTE" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:511 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "агрегатные функции нельзя применять в условиях WHEN для триггеров" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:513 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "операции группировки нельзя применять в условиях WHEN для триггеров" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:518 msgid "aggregate functions are not allowed in partition bound" msgstr "агрегатные функции нельзя применять в выражении границы секции" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:520 msgid "grouping operations are not allowed in partition bound" msgstr "операции группировки нельзя применять в выражении границы секции" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:525 msgid "aggregate functions are not allowed in partition key expressions" msgstr "агрегатные функции нельзя применять в выражениях ключа секционирования" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:527 msgid "grouping operations are not allowed in partition key expressions" msgstr "" "операции группировки нельзя применять в выражениях ключа секционирования" -#: parser/parse_agg.c:526 +#: parser/parse_agg.c:533 msgid "aggregate functions are not allowed in column generation expressions" msgstr "агрегатные функции нельзя применять в выражениях генерируемых столбцов" -#: parser/parse_agg.c:528 +#: parser/parse_agg.c:535 msgid "grouping operations are not allowed in column generation expressions" msgstr "" "операции группировки нельзя применять в выражениях генерируемых столбцов" -#: parser/parse_agg.c:534 +#: parser/parse_agg.c:541 msgid "aggregate functions are not allowed in CALL arguments" msgstr "агрегатные функции нельзя применять в аргументах CALL" -#: parser/parse_agg.c:536 +#: parser/parse_agg.c:543 msgid "grouping operations are not allowed in CALL arguments" msgstr "операции группировки нельзя применять в аргументах CALL" -#: parser/parse_agg.c:542 +#: parser/parse_agg.c:549 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "агрегатные функции нельзя применять в условиях COPY FROM WHERE" -#: parser/parse_agg.c:544 +#: parser/parse_agg.c:551 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "операции группировки нельзя применять в условиях COPY FROM WHERE" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:567 parser/parse_clause.c:1828 +#: parser/parse_agg.c:578 parser/parse_clause.c:1846 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "агрегатные функции нельзя применять в конструкции %s" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:570 +#: parser/parse_agg.c:581 #, c-format msgid "grouping operations are not allowed in %s" msgstr "операции группировки нельзя применять в конструкции %s" -#: parser/parse_agg.c:678 +#: parser/parse_agg.c:682 #, c-format msgid "" "outer-level aggregate cannot contain a lower-level variable in its direct " @@ -16217,15 +16866,15 @@ msgstr "" "агрегатная функция внешнего уровня не может содержать в своих аргументах " "переменные нижнего уровня" -#: parser/parse_agg.c:757 +#: parser/parse_agg.c:761 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "" "вызовы агрегатных функций не могут включать вызовы функций, возвращающих " "множества" -#: parser/parse_agg.c:758 parser/parse_expr.c:1845 parser/parse_expr.c:2332 -#: parser/parse_func.c:872 +#: parser/parse_agg.c:762 parser/parse_expr.c:1678 parser/parse_expr.c:2151 +#: parser/parse_func.c:883 #, c-format msgid "" "You might be able to move the set-returning function into a LATERAL FROM " @@ -16234,99 +16883,103 @@ msgstr "" "Исправить ситуацию можно, переместив функцию, возвращающую множество, в " "элемент LATERAL FROM." -#: parser/parse_agg.c:763 +#: parser/parse_agg.c:767 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "вызовы агрегатных функций не могут включать вызовы оконных функции" -#: parser/parse_agg.c:842 +#: parser/parse_agg.c:846 msgid "window functions are not allowed in JOIN conditions" msgstr "оконные функции нельзя применять в условиях JOIN" -#: parser/parse_agg.c:849 +#: parser/parse_agg.c:853 msgid "window functions are not allowed in functions in FROM" msgstr "оконные функции нельзя применять в функциях во FROM" -#: parser/parse_agg.c:855 +#: parser/parse_agg.c:859 msgid "window functions are not allowed in policy expressions" msgstr "оконные функции нельзя применять в выражениях политик" -#: parser/parse_agg.c:868 +#: parser/parse_agg.c:872 msgid "window functions are not allowed in window definitions" msgstr "оконные функции нельзя применять в определении окна" -#: parser/parse_agg.c:900 +#: parser/parse_agg.c:904 msgid "window functions are not allowed in check constraints" msgstr "оконные функции нельзя применять в ограничениях-проверках" -#: parser/parse_agg.c:904 +#: parser/parse_agg.c:908 msgid "window functions are not allowed in DEFAULT expressions" msgstr "оконные функции нельзя применять в выражениях DEFAULT" -#: parser/parse_agg.c:907 +#: parser/parse_agg.c:911 msgid "window functions are not allowed in index expressions" msgstr "оконные функции нельзя применять в выражениях индексов" -#: parser/parse_agg.c:910 +#: parser/parse_agg.c:914 +msgid "window functions are not allowed in statistics expressions" +msgstr "оконные функции нельзя применять в выражениях статистики" + +#: parser/parse_agg.c:917 msgid "window functions are not allowed in index predicates" msgstr "оконные функции нельзя применять в предикатах индексов" -#: parser/parse_agg.c:913 +#: parser/parse_agg.c:920 msgid "window functions are not allowed in transform expressions" msgstr "оконные функции нельзя применять в выражениях преобразований" -#: parser/parse_agg.c:916 +#: parser/parse_agg.c:923 msgid "window functions are not allowed in EXECUTE parameters" msgstr "оконные функции нельзя применять в параметрах EXECUTE" -#: parser/parse_agg.c:919 +#: parser/parse_agg.c:926 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "оконные функции нельзя применять в условиях WHEN для триггеров" -#: parser/parse_agg.c:922 +#: parser/parse_agg.c:929 msgid "window functions are not allowed in partition bound" msgstr "оконные функции нельзя применять в выражении границы секции" -#: parser/parse_agg.c:925 +#: parser/parse_agg.c:932 msgid "window functions are not allowed in partition key expressions" msgstr "оконные функции нельзя применять в выражениях ключа секционирования" -#: parser/parse_agg.c:928 +#: parser/parse_agg.c:935 msgid "window functions are not allowed in CALL arguments" msgstr "оконные функции нельзя применять в аргументах CALL" -#: parser/parse_agg.c:931 +#: parser/parse_agg.c:938 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "оконные функции нельзя применять в условиях COPY FROM WHERE" -#: parser/parse_agg.c:934 +#: parser/parse_agg.c:941 msgid "window functions are not allowed in column generation expressions" msgstr "оконные функции нельзя применять в выражениях генерируемых столбцов" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:954 parser/parse_clause.c:1837 +#: parser/parse_agg.c:964 parser/parse_clause.c:1855 #, c-format msgid "window functions are not allowed in %s" msgstr "оконные функции нельзя применять в конструкции %s" -#: parser/parse_agg.c:988 parser/parse_clause.c:2671 +#: parser/parse_agg.c:998 parser/parse_clause.c:2689 #, c-format msgid "window \"%s\" does not exist" msgstr "окно \"%s\" не существует" -#: parser/parse_agg.c:1072 +#: parser/parse_agg.c:1082 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "слишком много наборов группирования (при максимуме 4096)" -#: parser/parse_agg.c:1212 +#: parser/parse_agg.c:1222 #, c-format msgid "" "aggregate functions are not allowed in a recursive query's recursive term" msgstr "" "в рекурсивной части рекурсивного запроса агрегатные функции недопустимы" -#: parser/parse_agg.c:1405 +#: parser/parse_agg.c:1415 #, c-format msgid "" "column \"%s.%s\" must appear in the GROUP BY clause or be used in an " @@ -16335,7 +16988,7 @@ msgstr "" "столбец \"%s.%s\" должен фигурировать в предложении GROUP BY или " "использоваться в агрегатной функции" -#: parser/parse_agg.c:1408 +#: parser/parse_agg.c:1418 #, c-format msgid "" "Direct arguments of an ordered-set aggregate must use only grouped columns." @@ -16343,13 +16996,13 @@ msgstr "" "Прямые аргументы сортирующей агрегатной функции могут включать только " "группируемые столбцы." -#: parser/parse_agg.c:1413 +#: parser/parse_agg.c:1423 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "" "подзапрос использует негруппированный столбец \"%s.%s\" из внешнего запроса" -#: parser/parse_agg.c:1577 +#: parser/parse_agg.c:1587 #, c-format msgid "" "arguments to GROUPING must be grouping expressions of the associated query " @@ -16358,25 +17011,25 @@ msgstr "" "аргументами GROUPING должны быть выражения группирования для " "соответствующего уровня запроса" -#: parser/parse_clause.c:191 +#: parser/parse_clause.c:190 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "отношение \"%s\" не может быть целевым в операторе, изменяющем данные" -#: parser/parse_clause.c:571 parser/parse_clause.c:599 parser/parse_func.c:2424 +#: parser/parse_clause.c:570 parser/parse_clause.c:598 parser/parse_func.c:2554 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "" "функции, возвращающие множества, должны находиться на верхнем уровне FROM" -#: parser/parse_clause.c:611 +#: parser/parse_clause.c:610 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "" "для одной и той же функции нельзя задать разные списки с определениями " "столбцов" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:643 #, c-format msgid "" "ROWS FROM() with multiple functions cannot have a column definition list" @@ -16384,7 +17037,7 @@ msgstr "" "у ROWS FROM() с несколькими функциями не может быть списка с определениями " "столбцов" -#: parser/parse_clause.c:645 +#: parser/parse_clause.c:644 #, c-format msgid "" "Put a separate column definition list for each function inside ROWS FROM()." @@ -16392,59 +17045,59 @@ msgstr "" "Добавьте отдельные списки с определениями столбцов для каждой функции в ROWS " "FROM()." -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:650 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "" "у UNNEST() с несколькими аргументами не может быть списка с определениями " "столбцов" -#: parser/parse_clause.c:652 +#: parser/parse_clause.c:651 #, c-format msgid "" "Use separate UNNEST() calls inside ROWS FROM(), and attach a column " "definition list to each one." msgstr "" -"Напишите отдельные вызовы UNNEST() внутри ROWS FROM() и добавьте список с " -"определениями столбцов к каждому." +"Напишите отдельные вызовы UNNEST() внутри ROWS FROM() и добавьте список " +"определений столбцов к каждому." -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:658 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "" "WITH ORDINALITY нельзя использовать со списком с определениями столбцов" -#: parser/parse_clause.c:660 +#: parser/parse_clause.c:659 #, c-format msgid "Put the column definition list inside ROWS FROM()." -msgstr "Поместите список с определениями столбцов внутрь ROWS FROM()." +msgstr "Поместите список определений столбцов внутрь ROWS FROM()." -#: parser/parse_clause.c:760 +#: parser/parse_clause.c:759 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "FOR ORDINALITY допускается только для одного столбца" -#: parser/parse_clause.c:821 +#: parser/parse_clause.c:820 #, c-format msgid "column name \"%s\" is not unique" msgstr "имя столбца \"%s\" не уникально" -#: parser/parse_clause.c:863 +#: parser/parse_clause.c:862 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "имя пространства имён \"%s\" не уникально" -#: parser/parse_clause.c:873 +#: parser/parse_clause.c:872 #, c-format msgid "only one default namespace is allowed" msgstr "допускается только одно пространство имён по умолчанию" -#: parser/parse_clause.c:933 +#: parser/parse_clause.c:932 #, c-format msgid "tablesample method %s does not exist" msgstr "метод %s для получения выборки не существует" -#: parser/parse_clause.c:955 +#: parser/parse_clause.c:954 #, c-format msgid "tablesample method %s requires %d argument, not %d" msgid_plural "tablesample method %s requires %d arguments, not %d" @@ -16452,109 +17105,109 @@ msgstr[0] "метод %s для получения выборки требует msgstr[1] "метод %s для получения выборки требует аргументов: %d, получено: %d" msgstr[2] "метод %s для получения выборки требует аргументов: %d, получено: %d" -#: parser/parse_clause.c:989 +#: parser/parse_clause.c:988 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "метод %s для получения выборки не поддерживает REPEATABLE" -#: parser/parse_clause.c:1135 +#: parser/parse_clause.c:1134 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "" "предложение TABLESAMPLE можно применять только к таблицам и " "материализованным представлениям" -#: parser/parse_clause.c:1318 +#: parser/parse_clause.c:1324 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "имя столбца \"%s\" фигурирует в предложении USING неоднократно" -#: parser/parse_clause.c:1333 +#: parser/parse_clause.c:1339 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "имя общего столбца \"%s\" фигурирует в таблице слева неоднократно" -#: parser/parse_clause.c:1342 +#: parser/parse_clause.c:1348 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "в таблице слева нет столбца \"%s\", указанного в предложении USING" -#: parser/parse_clause.c:1357 +#: parser/parse_clause.c:1363 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "имя общего столбца \"%s\" фигурирует в таблице справа неоднократно" -#: parser/parse_clause.c:1366 +#: parser/parse_clause.c:1372 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "в таблице справа нет столбца \"%s\", указанного в предложении USING" -#: parser/parse_clause.c:1447 +#: parser/parse_clause.c:1451 #, c-format msgid "column alias list for \"%s\" has too many entries" msgstr "слишком много записей в списке псевдонимов столбца \"%s\"" -#: parser/parse_clause.c:1773 +#: parser/parse_clause.c:1791 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" msgstr "" "количество строк в FETCH FIRST ... WITH TIES должно быть отличным от NULL" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1798 +#: parser/parse_clause.c:1816 #, c-format msgid "argument of %s must not contain variables" msgstr "аргумент %s не может содержать переменные" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1963 +#: parser/parse_clause.c:1981 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "выражение %s \"%s\" неоднозначно" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1992 +#: parser/parse_clause.c:2010 #, c-format msgid "non-integer constant in %s" msgstr "не целочисленная константа в %s" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2014 +#: parser/parse_clause.c:2032 #, c-format msgid "%s position %d is not in select list" msgstr "в списке выборки %s нет элемента %d" -#: parser/parse_clause.c:2453 +#: parser/parse_clause.c:2471 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE имеет ограничение в 12 элементов" -#: parser/parse_clause.c:2659 +#: parser/parse_clause.c:2677 #, c-format msgid "window \"%s\" is already defined" msgstr "окно \"%s\" уже определено" -#: parser/parse_clause.c:2720 +#: parser/parse_clause.c:2738 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "переопределить предложение PARTITION BY для окна \"%s\" нельзя" -#: parser/parse_clause.c:2732 +#: parser/parse_clause.c:2750 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "переопределить предложение ORDER BY для окна \"%s\" нельзя" -#: parser/parse_clause.c:2762 parser/parse_clause.c:2768 +#: parser/parse_clause.c:2780 parser/parse_clause.c:2786 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "скопировать окно \"%s\", имеющее предложение рамки, нельзя" -#: parser/parse_clause.c:2770 +#: parser/parse_clause.c:2788 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Уберите скобки в предложении OVER." -#: parser/parse_clause.c:2790 +#: parser/parse_clause.c:2808 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" @@ -16562,12 +17215,12 @@ msgstr "" "для RANGE со смещением PRECEDING/FOLLOWING требуется ровно один столбец в " "ORDER BY" -#: parser/parse_clause.c:2813 +#: parser/parse_clause.c:2831 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "для режима GROUPS требуется предложение ORDER BY" -#: parser/parse_clause.c:2883 +#: parser/parse_clause.c:2901 #, c-format msgid "" "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument " @@ -16576,68 +17229,68 @@ msgstr "" "для агрегатной функции с DISTINCT, выражения ORDER BY должны быть в списке " "аргументов" -#: parser/parse_clause.c:2884 +#: parser/parse_clause.c:2902 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "" "в конструкции SELECT DISTINCT выражения ORDER BY должны быть в списке выборки" -#: parser/parse_clause.c:2916 +#: parser/parse_clause.c:2934 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "агрегатной функции с DISTINCT нужен минимум один аргумент" -#: parser/parse_clause.c:2917 +#: parser/parse_clause.c:2935 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "в SELECT DISTINCT нужен минимум один столбец" -#: parser/parse_clause.c:2983 parser/parse_clause.c:3015 +#: parser/parse_clause.c:3001 parser/parse_clause.c:3033 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "" "выражения SELECT DISTINCT ON должны соответствовать начальным выражениям " "ORDER BY" -#: parser/parse_clause.c:3093 +#: parser/parse_clause.c:3111 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC нельзя использовать в ON CONFLICT" -#: parser/parse_clause.c:3099 +#: parser/parse_clause.c:3117 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST нельзя использовать в ON CONFLICT" -#: parser/parse_clause.c:3178 +#: parser/parse_clause.c:3196 #, c-format msgid "" "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "" "в ON CONFLICT DO UPDATE требуется наводящее указание или имя ограничения" -#: parser/parse_clause.c:3179 +#: parser/parse_clause.c:3197 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Например: ON CONFLICT (имя_столбца)." -#: parser/parse_clause.c:3190 +#: parser/parse_clause.c:3208 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT с таблицами системного каталога не поддерживается" -#: parser/parse_clause.c:3198 +#: parser/parse_clause.c:3216 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "" "ON CONFLICT не поддерживается для таблицы \"%s\", служащей таблицей каталога" -#: parser/parse_clause.c:3341 +#: parser/parse_clause.c:3346 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "оператор %s не годится для сортировки" -#: parser/parse_clause.c:3343 +#: parser/parse_clause.c:3348 #, c-format msgid "" "Ordering operators must be \"<\" or \">\" members of btree operator families." @@ -16645,14 +17298,14 @@ msgstr "" "Операторы сортировки должны быть членами \"<\" или \">\" семейств операторов " "btree." -#: parser/parse_clause.c:3654 +#: parser/parse_clause.c:3659 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "" "RANGE со смещением PRECEDING/FOLLOWING не поддерживается для типа столбца %s" -#: parser/parse_clause.c:3660 +#: parser/parse_clause.c:3665 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s " @@ -16661,12 +17314,12 @@ msgstr "" "RANGE со смещением PRECEDING/FOLLOWING не поддерживается для типа столбца %s " "и типа смещения %s" -#: parser/parse_clause.c:3663 +#: parser/parse_clause.c:3668 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Приведите значение смещения к подходящему типу." -#: parser/parse_clause.c:3668 +#: parser/parse_clause.c:3673 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for " @@ -16675,183 +17328,204 @@ msgstr "" "RANGE со смещением PRECEDING/FOLLOWING допускает несколько интерпретаций для " "типа столбца %s и типа смещения %s" -#: parser/parse_clause.c:3671 +#: parser/parse_clause.c:3676 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "Приведите значение смещения в точности к желаемому типу." -#: parser/parse_coerce.c:1024 parser/parse_coerce.c:1062 -#: parser/parse_coerce.c:1080 parser/parse_coerce.c:1095 -#: parser/parse_expr.c:2241 parser/parse_expr.c:2819 parser/parse_target.c:967 +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 +#: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 +#: parser/parse_expr.c:2060 parser/parse_expr.c:2654 parser/parse_target.c:994 #, c-format msgid "cannot cast type %s to %s" msgstr "привести тип %s к %s нельзя" -#: parser/parse_coerce.c:1065 +#: parser/parse_coerce.c:1091 #, c-format msgid "Input has too few columns." msgstr "Во входных данных недостаточно столбцов." -#: parser/parse_coerce.c:1083 +#: parser/parse_coerce.c:1109 #, c-format msgid "Cannot cast type %s to %s in column %d." msgstr "Не удалось привести тип %s к %s в столбце %d." -#: parser/parse_coerce.c:1098 +#: parser/parse_coerce.c:1124 #, c-format msgid "Input has too many columns." msgstr "Во входных данных больше столбцов." #. translator: first %s is name of a SQL construct, eg WHERE #. translator: first %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1153 parser/parse_coerce.c:1201 +#: parser/parse_coerce.c:1179 parser/parse_coerce.c:1227 #, c-format msgid "argument of %s must be type %s, not type %s" msgstr "аргумент конструкции %s должен иметь тип %s, а не %s" #. translator: %s is name of a SQL construct, eg WHERE #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1164 parser/parse_coerce.c:1213 +#: parser/parse_coerce.c:1190 parser/parse_coerce.c:1239 #, c-format msgid "argument of %s must not return a set" msgstr "аргумент конструкции %s не должен возвращать множество" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1353 +#: parser/parse_coerce.c:1383 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "в конструкции %s типы %s и %s не имеют общего" -#: parser/parse_coerce.c:1465 +#: parser/parse_coerce.c:1499 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "типы аргументов %s и %s не имеют общего" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1517 +#: parser/parse_coerce.c:1551 #, c-format msgid "%s could not convert type %s to %s" msgstr "в конструкции %s нельзя преобразовать тип %s в %s" -#: parser/parse_coerce.c:1934 -#, c-format -msgid "arguments declared \"anyelement\" are not all alike" -msgstr "аргументы, объявленные как \"anyelement\", должны быть однотипными" - -#: parser/parse_coerce.c:1954 -#, c-format -msgid "arguments declared \"anyarray\" are not all alike" -msgstr "аргументы, объявленные как \"anyarray\", должны быть однотипными" - -#: parser/parse_coerce.c:1974 +#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 +#: parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 +#: parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 #, c-format -msgid "arguments declared \"anyrange\" are not all alike" -msgstr "аргументы, объявленные как \"anyrange\", должны быть однотипными" +msgid "arguments declared \"%s\" are not all alike" +msgstr "аргументы, объявленные как \"%s\", должны быть однотипными" -#: parser/parse_coerce.c:2008 parser/parse_coerce.c:2088 -#: utils/fmgr/funcapi.c:487 +#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 +#: utils/fmgr/funcapi.c:489 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "аргумент, объявленный как \"%s\", оказался не массивом, а типом %s" -#: parser/parse_coerce.c:2029 -#, c-format -msgid "arguments declared \"anycompatiblerange\" are not all alike" -msgstr "" -"аргументы, объявленные как \"anycompatiblerange\", должны быть однотипными" - -#: parser/parse_coerce.c:2041 parser/parse_coerce.c:2122 -#: utils/fmgr/funcapi.c:501 +#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 +#: utils/fmgr/funcapi.c:503 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "аргумент, объявленный как \"%s\", имеет не диапазонный тип, а %s" -#: parser/parse_coerce.c:2079 +#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 +#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:521 utils/fmgr/funcapi.c:586 +#, c-format +msgid "argument declared %s is not a multirange type but type %s" +msgstr "аргумент, объявленный как \"%s\", имеет не мультидиапазонный тип, а %s" + +#: parser/parse_coerce.c:2353 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "тип элемента аргумента \"anyarray\" определить нельзя" -#: parser/parse_coerce.c:2105 parser/parse_coerce.c:2139 +#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 +#: parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "аргумент, объявленный как \"%s\", не согласуется с аргументом %s" -#: parser/parse_coerce.c:2163 +#: parser/parse_coerce.c:2474 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "" "не удалось определить полиморфный тип, так как входные аргументы имеют тип %s" -#: parser/parse_coerce.c:2177 +#: parser/parse_coerce.c:2488 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "" "в нарушение объявления \"anynonarray\" соответствующий аргумент оказался " "массивом: %s" -#: parser/parse_coerce.c:2187 +#: parser/parse_coerce.c:2498 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "" "в нарушение объявления \"anyenum\" соответствующий аргумент оказался не " "перечислением: %s" -#: parser/parse_coerce.c:2218 parser/parse_coerce.c:2267 -#: parser/parse_coerce.c:2329 parser/parse_coerce.c:2365 +#: parser/parse_coerce.c:2559 +#, c-format +msgid "arguments of anycompatible family cannot be cast to a common type" +msgstr "" +"аргументы семейства anycompatible не могут быть приведены к общему типу" + +#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 +#: parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 +#: parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "" "не удалось определить полиморфный тип %s, так как входные аргументы имеют " "тип %s" -#: parser/parse_coerce.c:2228 +#: parser/parse_coerce.c:2587 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "тип %s (anycompatiblerange) не соответствует типу %s (anycompatible)" -#: parser/parse_coerce.c:2242 +#: parser/parse_coerce.c:2608 +#, c-format +msgid "anycompatiblemultirange type %s does not match anycompatible type %s" +msgstr "" +"тип %s (anycompatiblemultirange) не соответствует типу %s (anycompatible)" + +#: parser/parse_coerce.c:2622 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "" "в нарушение объявления \"anycompatiblenonarray\" соответствующий аргумент " "оказался массивом: %s" -#: parser/parse_coerce.c:2433 +#: parser/parse_coerce.c:2857 +#, c-format +msgid "" +"A result of type %s requires at least one input of type anyrange or " +"anymultirange." +msgstr "" +"Для результата типа %s требуется минимум один аргумент типа anyrange или " +"anymultirange." + +#: parser/parse_coerce.c:2874 #, c-format -msgid "A result of type %s requires at least one input of type %s." -msgstr "Для результата типа %s требуется минимум один аргумент типа %s." +msgid "" +"A result of type %s requires at least one input of type anycompatiblerange " +"or anycompatiblemultirange." +msgstr "" +"Для результата типа %s требуется минимум один аргумент типа " +"anycompatiblerange или anycompatiblemultirange." -#: parser/parse_coerce.c:2445 +#: parser/parse_coerce.c:2886 #, c-format msgid "" "A result of type %s requires at least one input of type anyelement, " -"anyarray, anynonarray, anyenum, or anyrange." +"anyarray, anynonarray, anyenum, anyrange, or anymultirange." msgstr "" "Для результата типа %s требуется минимум один аргумент типа anyelement, " -"anyarray, anynonarray, anyenum или anyrange." +"anyarray, anynonarray, anyenum, anyrange или anymultirange." -#: parser/parse_coerce.c:2457 +#: parser/parse_coerce.c:2898 #, c-format msgid "" "A result of type %s requires at least one input of type anycompatible, " -"anycompatiblearray, anycompatiblenonarray, or anycompatiblerange." +"anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or " +"anycompatiblemultirange." msgstr "" "Для результата типа %s требуется минимум один аргумент типа anycompatible, " -"anycompatiblearray, anycompatiblenonarray или anycompatiblerange." +"anycompatiblearray, anycompatiblenonarray, anycompatiblerange или " +"anycompatiblemultirange." -#: parser/parse_coerce.c:2487 +#: parser/parse_coerce.c:2928 msgid "A result of type internal requires at least one input of type internal." msgstr "" "Для результата типа internal требуется минимум один аргумент типа internal." #: parser/parse_collate.c:228 parser/parse_collate.c:475 -#: parser/parse_collate.c:981 +#: parser/parse_collate.c:1004 #, c-format msgid "collation mismatch between implicit collations \"%s\" and \"%s\"" msgstr "несовпадение правил сортировки для неявных правил \"%s\" и \"%s\"" #: parser/parse_collate.c:231 parser/parse_collate.c:478 -#: parser/parse_collate.c:984 +#: parser/parse_collate.c:1007 #, c-format msgid "" "You can choose the collation by applying the COLLATE clause to one or both " @@ -16860,12 +17534,12 @@ msgstr "" "Правило сортировки можно выбрать явно, применив предложение COLLATE к одному " "или обоим выражениям." -#: parser/parse_collate.c:831 +#: parser/parse_collate.c:854 #, c-format msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" msgstr "явно указанные правила сортировки \"%s\" и \"%s\" несовместимы" -#: parser/parse_cte.c:42 +#: parser/parse_cte.c:46 #, c-format msgid "" "recursive reference to query \"%s\" must not appear within its non-recursive " @@ -16874,13 +17548,13 @@ msgstr "" "рекурсивная ссылка на запрос \"%s\" не должна фигурировать в его не " "рекурсивной части" -#: parser/parse_cte.c:44 +#: parser/parse_cte.c:48 #, c-format msgid "recursive reference to query \"%s\" must not appear within a subquery" msgstr "" "рекурсивная ссылка на запрос \"%s\" не должна фигурировать в подзапросе" -#: parser/parse_cte.c:46 +#: parser/parse_cte.c:50 #, c-format msgid "" "recursive reference to query \"%s\" must not appear within an outer join" @@ -16888,22 +17562,22 @@ msgstr "" "рекурсивная ссылка на запрос \"%s\" не должна фигурировать во внешнем " "соединении" -#: parser/parse_cte.c:48 +#: parser/parse_cte.c:52 #, c-format msgid "recursive reference to query \"%s\" must not appear within INTERSECT" msgstr "рекурсивная ссылка на запрос \"%s\" не должна фигурировать в INTERSECT" -#: parser/parse_cte.c:50 +#: parser/parse_cte.c:54 #, c-format msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "рекурсивная ссылка на запрос \"%s\" не должна фигурировать в EXCEPT" -#: parser/parse_cte.c:132 +#: parser/parse_cte.c:136 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "имя запроса WITH \"%s\" указано неоднократно" -#: parser/parse_cte.c:264 +#: parser/parse_cte.c:268 #, c-format msgid "" "WITH clause containing a data-modifying statement must be at the top level" @@ -16911,7 +17585,7 @@ msgstr "" "предложение WITH, содержащее оператор, изменяющий данные, должно быть на " "верхнем уровне" -#: parser/parse_cte.c:313 +#: parser/parse_cte.c:317 #, c-format msgid "" "recursive query \"%s\" column %d has type %s in non-recursive term but type " @@ -16920,12 +17594,12 @@ msgstr "" "в рекурсивном запросе \"%s\" столбец %d имеет тип %s в нерекурсивной части, " "но в результате тип %s" -#: parser/parse_cte.c:319 +#: parser/parse_cte.c:323 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Приведите результат нерекурсивной части к правильному типу." -#: parser/parse_cte.c:324 +#: parser/parse_cte.c:328 #, c-format msgid "" "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term " @@ -16934,30 +17608,113 @@ msgstr "" "в рекурсивном запросе \"%s\" у столбца %d правило сортировки \"%s\" в не " "рекурсивной части, но в результате правило \"%s\"" -#: parser/parse_cte.c:328 +#: parser/parse_cte.c:332 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "" "Измените правило сортировки в нерекурсивной части, добавив предложение " "COLLATE." -#: parser/parse_cte.c:418 +#: parser/parse_cte.c:350 +#, c-format +msgid "WITH query is not recursive" +msgstr "запрос WITH не рекурсивный" + +#: parser/parse_cte.c:381 +#, c-format +msgid "" +"with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" +msgstr "" +"с предложением SEARCH или CYCLE в левой стороне UNION должен быть SELECT" + +#: parser/parse_cte.c:386 +#, c-format +msgid "" +"with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" +msgstr "" +"с предложением SEARCH или CYCLE в правой стороне UNION должен быть SELECT" + +#: parser/parse_cte.c:401 +#, c-format +msgid "search column \"%s\" not in WITH query column list" +msgstr "столбец поиска \"%s\" отсутствует в списке столбцов запроса WITH" + +#: parser/parse_cte.c:408 +#, c-format +msgid "search column \"%s\" specified more than once" +msgstr "столбец поиска \"%s\" указан неоднократно" + +#: parser/parse_cte.c:417 +#, c-format +msgid "" +"search sequence column name \"%s\" already used in WITH query column list" +msgstr "" +"имя столбца последовательности поиска \"%s\" уже используется в списке " +"столбцов запроса WITH" + +#: parser/parse_cte.c:436 +#, c-format +msgid "cycle column \"%s\" not in WITH query column list" +msgstr "столбец цикла \"%s\" отсутствует в списке столбцов запроса WITH" + +#: parser/parse_cte.c:443 +#, c-format +msgid "cycle column \"%s\" specified more than once" +msgstr "столбец цикла \"%s\" указан неоднократно" + +#: parser/parse_cte.c:452 +#, c-format +msgid "cycle mark column name \"%s\" already used in WITH query column list" +msgstr "" +"имя столбца пометки цикла \"%s\" уже используется в списке столбцов запроса " +"WITH" + +#: parser/parse_cte.c:464 +#, c-format +msgid "cycle path column name \"%s\" already used in WITH query column list" +msgstr "" +"имя столбца пути цикла \"%s\" уже используется в списке столбцов запроса WITH" + +#: parser/parse_cte.c:472 +#, c-format +msgid "cycle mark column name and cycle path column name are the same" +msgstr "имя столбца пометки цикла совпадает с именем столбца пути цикла" + +#: parser/parse_cte.c:508 +#, c-format +msgid "could not identify an inequality operator for type %s" +msgstr "не удалось найти оператор неравенства для типа %s" + +#: parser/parse_cte.c:520 +#, c-format +msgid "search sequence column name and cycle mark column name are the same" +msgstr "" +"имя столбца последовательности поиска совпадает с именем столбца пометки " +"цикла" + +#: parser/parse_cte.c:527 +#, c-format +msgid "search sequence column name and cycle path column name are the same" +msgstr "" +"имя столбца последовательности поиска совпадает с именем столбца пути цикла" + +#: parser/parse_cte.c:611 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "запрос WITH \"%s\" содержит столбцов: %d, но указано: %d" -#: parser/parse_cte.c:598 +#: parser/parse_cte.c:791 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "взаимная рекурсия между элементами WITH не реализована" -#: parser/parse_cte.c:650 +#: parser/parse_cte.c:843 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "" "рекурсивный запрос \"%s\" не должен содержать операторов, изменяющих данные" -#: parser/parse_cte.c:658 +#: parser/parse_cte.c:851 #, c-format msgid "" "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] " @@ -16966,101 +17723,101 @@ msgstr "" "рекурсивный запрос \"%s\" должен иметь форму {нерекурсивная часть} UNION " "[ALL] {рекурсивная часть}" -#: parser/parse_cte.c:702 +#: parser/parse_cte.c:895 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY в рекурсивном запросе не поддерживается" -#: parser/parse_cte.c:708 +#: parser/parse_cte.c:901 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET в рекурсивном запросе не поддерживается" -#: parser/parse_cte.c:714 +#: parser/parse_cte.c:907 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT в рекурсивном запросе не поддерживается" -#: parser/parse_cte.c:720 +#: parser/parse_cte.c:913 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE в рекурсивном запросе не поддерживается" -#: parser/parse_cte.c:777 +#: parser/parse_cte.c:970 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "рекурсивная ссылка на запрос \"%s\" указана неоднократно" -#: parser/parse_expr.c:349 +#: parser/parse_expr.c:287 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT не допускается в данном контексте" -#: parser/parse_expr.c:402 parser/parse_relation.c:3506 -#: parser/parse_relation.c:3526 +#: parser/parse_expr.c:340 parser/parse_relation.c:3592 +#: parser/parse_relation.c:3612 #, c-format msgid "column %s.%s does not exist" msgstr "столбец %s.%s не существует" -#: parser/parse_expr.c:414 +#: parser/parse_expr.c:352 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "столбец \"%s\" не найден в типе данных %s" -#: parser/parse_expr.c:420 +#: parser/parse_expr.c:358 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "не удалось идентифицировать столбец \"%s\" в типе записи" # skip-rule: space-before-period -#: parser/parse_expr.c:426 +#: parser/parse_expr.c:364 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "" "запись имени столбца .%s применена к типу %s, который не является составным" -#: parser/parse_expr.c:457 parser/parse_target.c:729 +#: parser/parse_expr.c:395 parser/parse_target.c:739 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "расширение строки через \"*\" здесь не поддерживается" -#: parser/parse_expr.c:578 +#: parser/parse_expr.c:516 msgid "cannot use column reference in DEFAULT expression" msgstr "в выражении DEFAULT (по умолчанию) нельзя ссылаться на столбцы" -#: parser/parse_expr.c:581 +#: parser/parse_expr.c:519 msgid "cannot use column reference in partition bound expression" msgstr "в выражении границы секции нельзя ссылаться на столбцы" -#: parser/parse_expr.c:850 parser/parse_relation.c:799 -#: parser/parse_relation.c:881 parser/parse_target.c:1207 +#: parser/parse_expr.c:788 parser/parse_relation.c:807 +#: parser/parse_relation.c:889 parser/parse_target.c:1234 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "неоднозначная ссылка на столбец \"%s\"" -#: parser/parse_expr.c:906 parser/parse_param.c:110 parser/parse_param.c:142 -#: parser/parse_param.c:199 parser/parse_param.c:298 +#: parser/parse_expr.c:844 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_param.c:208 parser/parse_param.c:307 #, c-format msgid "there is no parameter $%d" msgstr "параметр $%d не существует" -#: parser/parse_expr.c:1149 +#: parser/parse_expr.c:1044 #, c-format msgid "NULLIF requires = operator to yield boolean" msgstr "для NULLIF требуется, чтобы оператор = возвращал логическое значение" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1155 parser/parse_expr.c:3135 +#: parser/parse_expr.c:1050 parser/parse_expr.c:2970 #, c-format msgid "%s must not return a set" msgstr "%s не должна возвращать множество" -#: parser/parse_expr.c:1603 parser/parse_expr.c:1635 +#: parser/parse_expr.c:1435 parser/parse_expr.c:1467 #, c-format msgid "number of columns does not match number of values" msgstr "число столбцов не равно числу значений" -#: parser/parse_expr.c:1649 +#: parser/parse_expr.c:1481 #, c-format msgid "" "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() " @@ -17070,243 +17827,250 @@ msgstr "" "SELECT или выражение ROW()" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1843 parser/parse_expr.c:2330 parser/parse_func.c:2540 +#: parser/parse_expr.c:1676 parser/parse_expr.c:2149 parser/parse_func.c:2676 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "функции, возвращающие множества, нельзя применять в конструкции %s" -#: parser/parse_expr.c:1904 +#: parser/parse_expr.c:1738 msgid "cannot use subquery in check constraint" msgstr "в ограничении-проверке нельзя использовать подзапросы" -#: parser/parse_expr.c:1908 +#: parser/parse_expr.c:1742 msgid "cannot use subquery in DEFAULT expression" msgstr "в выражении DEFAULT нельзя использовать подзапросы" -#: parser/parse_expr.c:1911 +#: parser/parse_expr.c:1745 msgid "cannot use subquery in index expression" msgstr "в индексном выражении нельзя использовать подзапросы" -#: parser/parse_expr.c:1914 +#: parser/parse_expr.c:1748 msgid "cannot use subquery in index predicate" msgstr "в предикате индекса нельзя использовать подзапросы" -#: parser/parse_expr.c:1917 +#: parser/parse_expr.c:1751 +msgid "cannot use subquery in statistics expression" +msgstr "в выражении статистики нельзя использовать подзапросы" + +#: parser/parse_expr.c:1754 msgid "cannot use subquery in transform expression" msgstr "нельзя использовать подзапрос в выражении преобразования" -#: parser/parse_expr.c:1920 +#: parser/parse_expr.c:1757 msgid "cannot use subquery in EXECUTE parameter" msgstr "в качестве параметра EXECUTE нельзя использовать подзапрос" -#: parser/parse_expr.c:1923 +#: parser/parse_expr.c:1760 msgid "cannot use subquery in trigger WHEN condition" msgstr "в условии WHEN для триггера нельзя использовать подзапросы" -#: parser/parse_expr.c:1926 +#: parser/parse_expr.c:1763 msgid "cannot use subquery in partition bound" msgstr "в выражении границы секции нельзя использовать подзапросы" -#: parser/parse_expr.c:1929 +#: parser/parse_expr.c:1766 msgid "cannot use subquery in partition key expression" msgstr "в выражении ключа секционирования нельзя использовать подзапросы" -#: parser/parse_expr.c:1932 +#: parser/parse_expr.c:1769 msgid "cannot use subquery in CALL argument" msgstr "в качестве аргумента CALL нельзя использовать подзапрос" -#: parser/parse_expr.c:1935 +#: parser/parse_expr.c:1772 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "в условии COPY FROM WHERE нельзя использовать подзапросы" -#: parser/parse_expr.c:1938 +#: parser/parse_expr.c:1775 msgid "cannot use subquery in column generation expression" msgstr "в выражении генерируемого столбца нельзя использовать подзапросы" -#: parser/parse_expr.c:1991 +#: parser/parse_expr.c:1828 #, c-format msgid "subquery must return only one column" msgstr "подзапрос должен вернуть только один столбец" -#: parser/parse_expr.c:2075 +#: parser/parse_expr.c:1899 #, c-format msgid "subquery has too many columns" msgstr "в подзапросе слишком много столбцов" -#: parser/parse_expr.c:2080 +#: parser/parse_expr.c:1904 #, c-format msgid "subquery has too few columns" msgstr "в подзапросе недостаточно столбцов" -#: parser/parse_expr.c:2181 +#: parser/parse_expr.c:2000 #, c-format msgid "cannot determine type of empty array" msgstr "тип пустого массива определить нельзя" -#: parser/parse_expr.c:2182 +#: parser/parse_expr.c:2001 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "" "Приведите его к желаемому типу явным образом, например ARRAY[]::integer[]." -#: parser/parse_expr.c:2196 +#: parser/parse_expr.c:2015 #, c-format msgid "could not find element type for data type %s" msgstr "не удалось определить тип элемента для типа данных %s" -#: parser/parse_expr.c:2481 +#: parser/parse_expr.c:2295 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "вместо значения XML-атрибута без имени должен указываться столбец" -#: parser/parse_expr.c:2482 +#: parser/parse_expr.c:2296 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "вместо значения XML-элемента без имени должен указываться столбец" -#: parser/parse_expr.c:2497 +#: parser/parse_expr.c:2311 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "имя XML-атрибута \"%s\" указано неоднократно" -#: parser/parse_expr.c:2604 +#: parser/parse_expr.c:2418 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "привести результат XMLSERIALIZE к типу %s нельзя" -#: parser/parse_expr.c:2892 parser/parse_expr.c:3088 +#: parser/parse_expr.c:2727 parser/parse_expr.c:2923 #, c-format msgid "unequal number of entries in row expressions" msgstr "разное число элементов в строках" -#: parser/parse_expr.c:2902 +#: parser/parse_expr.c:2737 #, c-format msgid "cannot compare rows of zero length" msgstr "строки нулевой длины сравнивать нельзя" -#: parser/parse_expr.c:2927 +#: parser/parse_expr.c:2762 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "" "оператор сравнения строк должен выдавать результат логического типа, а не %s" -#: parser/parse_expr.c:2934 +#: parser/parse_expr.c:2769 #, c-format msgid "row comparison operator must not return a set" msgstr "оператор сравнения строк не должен возвращать множество" -#: parser/parse_expr.c:2993 parser/parse_expr.c:3034 +#: parser/parse_expr.c:2828 parser/parse_expr.c:2869 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "не удалось выбрать интерпретацию оператора сравнения строк %s" -#: parser/parse_expr.c:2995 +#: parser/parse_expr.c:2830 #, c-format msgid "" "Row comparison operators must be associated with btree operator families." msgstr "" "Операторы сравнения строк должны быть связаны с семейством операторов btree." -#: parser/parse_expr.c:3036 +#: parser/parse_expr.c:2871 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Оказалось несколько равноценных кандидатур." -#: parser/parse_expr.c:3129 +#: parser/parse_expr.c:2964 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "" "для IS DISTINCT FROM требуется, чтобы оператор = возвращал логическое " "значение" -#: parser/parse_expr.c:3448 parser/parse_expr.c:3466 -#, c-format -msgid "operator precedence change: %s is now lower precedence than %s" -msgstr "" -"приоритет операторов изменён: %s теперь имеет меньший приоритет, чем %s" - -#: parser/parse_func.c:191 +#: parser/parse_func.c:194 #, c-format msgid "argument name \"%s\" used more than once" msgstr "имя аргумента \"%s\" используется неоднократно" -#: parser/parse_func.c:202 +#: parser/parse_func.c:205 #, c-format msgid "positional argument cannot follow named argument" msgstr "нумерованный аргумент не может следовать за именованным аргументом" -#: parser/parse_func.c:284 parser/parse_func.c:2243 +#: parser/parse_func.c:287 parser/parse_func.c:2369 #, c-format msgid "%s is not a procedure" msgstr "\"%s\" — не процедура" -#: parser/parse_func.c:288 +#: parser/parse_func.c:291 #, c-format msgid "To call a function, use SELECT." msgstr "Для вызова функции используйте SELECT." -#: parser/parse_func.c:294 +#: parser/parse_func.c:297 #, c-format msgid "%s is a procedure" msgstr "%s — процедура" -#: parser/parse_func.c:298 +#: parser/parse_func.c:301 #, c-format msgid "To call a procedure, use CALL." msgstr "Для вызова процедуры используйте CALL." -#: parser/parse_func.c:312 +#: parser/parse_func.c:315 #, c-format msgid "%s(*) specified, but %s is not an aggregate function" msgstr "выражение %s(*) недопустимо, так как %s - не агрегатная функция" -#: parser/parse_func.c:319 +#: parser/parse_func.c:322 #, c-format msgid "DISTINCT specified, but %s is not an aggregate function" msgstr "в аргументах %s указан DISTINCT, но это не агрегатная функция" -#: parser/parse_func.c:325 +#: parser/parse_func.c:328 #, c-format msgid "WITHIN GROUP specified, but %s is not an aggregate function" msgstr "в аргументах %s указано WITHIN GROUP, но это не агрегатная функция" -#: parser/parse_func.c:331 +#: parser/parse_func.c:334 #, c-format msgid "ORDER BY specified, but %s is not an aggregate function" msgstr "в аргументах %s указан ORDER BY, но это не агрегатная функция" -#: parser/parse_func.c:337 +#: parser/parse_func.c:340 #, c-format msgid "FILTER specified, but %s is not an aggregate function" msgstr "в аргументах %s указан FILTER, но это не агрегатная функция" -#: parser/parse_func.c:343 +#: parser/parse_func.c:346 #, c-format msgid "" "OVER specified, but %s is not a window function nor an aggregate function" msgstr "" "вызов %s включает предложение OVER, но это не оконная и не агрегатная функция" -#: parser/parse_func.c:381 +#: parser/parse_func.c:384 #, c-format msgid "WITHIN GROUP is required for ordered-set aggregate %s" msgstr "для сортирующего агрегата %s требуется WITHIN GROUP" -#: parser/parse_func.c:387 +#: parser/parse_func.c:390 #, c-format msgid "OVER is not supported for ordered-set aggregate %s" msgstr "сортирующий агрегат %s не поддерживает OVER" -#: parser/parse_func.c:418 parser/parse_func.c:447 +#: parser/parse_func.c:421 parser/parse_func.c:452 #, c-format msgid "" +"There is an ordered-set aggregate %s, but it requires %d direct argument, " +"not %d." +msgid_plural "" "There is an ordered-set aggregate %s, but it requires %d direct arguments, " "not %d." -msgstr "" +msgstr[0] "" +"Есть сортирующий агрегат %s, но прямых аргументов у него должно быть %d, а " +"не %d." +msgstr[1] "" +"Есть сортирующий агрегат %s, но прямых аргументов у него должно быть %d, а " +"не %d." +msgstr[2] "" "Есть сортирующий агрегат %s, но прямых аргументов у него должно быть %d, а " "не %d." -#: parser/parse_func.c:472 +#: parser/parse_func.c:479 #, c-format msgid "" "To use the hypothetical-set aggregate %s, the number of hypothetical direct " @@ -17316,36 +18080,45 @@ msgstr "" "гипотетических аргументов (%d) должно равняться числу сортируемых столбцов " "(здесь: %d)." -#: parser/parse_func.c:486 +#: parser/parse_func.c:493 #, c-format msgid "" "There is an ordered-set aggregate %s, but it requires at least %d direct " +"argument." +msgid_plural "" +"There is an ordered-set aggregate %s, but it requires at least %d direct " "arguments." -msgstr "" +msgstr[0] "" +"Есть сортирующий агрегат %s, но он требует минимум %d непосредственных " +"аргументов." +msgstr[1] "" +"Есть сортирующий агрегат %s, но он требует минимум %d непосредственных " +"аргументов." +msgstr[2] "" "Есть сортирующий агрегат %s, но он требует минимум %d непосредственных " "аргументов." -#: parser/parse_func.c:505 +#: parser/parse_func.c:514 #, c-format msgid "%s is not an ordered-set aggregate, so it cannot have WITHIN GROUP" msgstr "%s - не сортирующая агрегатная функция, WITHIN GROUP к ней неприменимо" -#: parser/parse_func.c:518 +#: parser/parse_func.c:527 #, c-format msgid "window function %s requires an OVER clause" msgstr "для оконной функции %s требуется предложение OVER" -#: parser/parse_func.c:525 +#: parser/parse_func.c:534 #, c-format msgid "window function %s cannot have WITHIN GROUP" msgstr "для оконной функции %s неприменимо WITHIN GROUP" -#: parser/parse_func.c:554 +#: parser/parse_func.c:563 #, c-format msgid "procedure %s is not unique" msgstr "процедура %s не уникальна" -#: parser/parse_func.c:557 +#: parser/parse_func.c:566 #, c-format msgid "" "Could not choose a best candidate procedure. You might need to add explicit " @@ -17354,12 +18127,12 @@ msgstr "" "Не удалось выбрать лучшую кандидатуру процедуры. Возможно, вам следует " "добавить явные приведения типов." -#: parser/parse_func.c:563 +#: parser/parse_func.c:572 #, c-format msgid "function %s is not unique" msgstr "функция %s не уникальна" -#: parser/parse_func.c:566 +#: parser/parse_func.c:575 #, c-format msgid "" "Could not choose a best candidate function. You might need to add explicit " @@ -17368,7 +18141,7 @@ msgstr "" "Не удалось выбрать лучшую кандидатуру функции. Возможно, вам следует " "добавить явные приведения типов." -#: parser/parse_func.c:605 +#: parser/parse_func.c:614 #, c-format msgid "" "No aggregate function matches the given name and argument types. Perhaps you " @@ -17379,12 +18152,12 @@ msgstr "" "Возможно, неверно расположено предложение ORDER BY - оно должно следовать за " "всеми обычными аргументами функции." -#: parser/parse_func.c:613 parser/parse_func.c:2286 +#: parser/parse_func.c:622 parser/parse_func.c:2412 #, c-format msgid "procedure %s does not exist" msgstr "процедура %s не существует" -#: parser/parse_func.c:616 +#: parser/parse_func.c:625 #, c-format msgid "" "No procedure matches the given name and argument types. You might need to " @@ -17393,7 +18166,7 @@ msgstr "" "Процедура с данными именем и типами аргументов не найдена. Возможно, вам " "следует добавить явные приведения типов." -#: parser/parse_func.c:625 +#: parser/parse_func.c:634 #, c-format msgid "" "No function matches the given name and argument types. You might need to add " @@ -17402,69 +18175,69 @@ msgstr "" "Функция с данными именем и типами аргументов не найдена. Возможно, вам " "следует добавить явные приведения типов." -#: parser/parse_func.c:727 +#: parser/parse_func.c:736 #, c-format msgid "VARIADIC argument must be an array" msgstr "параметр VARIADIC должен быть массивом" -#: parser/parse_func.c:779 parser/parse_func.c:843 +#: parser/parse_func.c:790 parser/parse_func.c:854 #, c-format msgid "%s(*) must be used to call a parameterless aggregate function" msgstr "агрегатная функция без параметров должна вызываться так: %s(*)" -#: parser/parse_func.c:786 +#: parser/parse_func.c:797 #, c-format msgid "aggregates cannot return sets" msgstr "агрегатные функции не могут возвращать множества" -#: parser/parse_func.c:801 +#: parser/parse_func.c:812 #, c-format msgid "aggregates cannot use named arguments" msgstr "у агрегатных функций не может быть именованных аргументов" -#: parser/parse_func.c:833 +#: parser/parse_func.c:844 #, c-format msgid "DISTINCT is not implemented for window functions" msgstr "предложение DISTINCT для оконных функций не реализовано" -#: parser/parse_func.c:853 +#: parser/parse_func.c:864 #, c-format msgid "aggregate ORDER BY is not implemented for window functions" msgstr "агрегатное предложение ORDER BY для оконных функций не реализовано" -#: parser/parse_func.c:862 +#: parser/parse_func.c:873 #, c-format msgid "FILTER is not implemented for non-aggregate window functions" msgstr "предложение FILTER для не агрегатных оконных функций не реализовано" -#: parser/parse_func.c:871 +#: parser/parse_func.c:882 #, c-format msgid "window function calls cannot contain set-returning function calls" msgstr "" "вызовы оконных функций не могут включать вызовы функций, возвращающих " "множества" -#: parser/parse_func.c:879 +#: parser/parse_func.c:890 #, c-format msgid "window functions cannot return sets" msgstr "оконные функции не могут возвращать множества" -#: parser/parse_func.c:2124 parser/parse_func.c:2315 +#: parser/parse_func.c:2168 parser/parse_func.c:2441 #, c-format msgid "could not find a function named \"%s\"" msgstr "не удалось найти функцию с именем \"%s\"" -#: parser/parse_func.c:2138 parser/parse_func.c:2333 +#: parser/parse_func.c:2182 parser/parse_func.c:2459 #, c-format msgid "function name \"%s\" is not unique" msgstr "имя функции \"%s\" не уникально" -#: parser/parse_func.c:2140 parser/parse_func.c:2335 +#: parser/parse_func.c:2184 parser/parse_func.c:2462 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "Задайте список аргументов для однозначного выбора функции." -#: parser/parse_func.c:2184 +#: parser/parse_func.c:2228 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" @@ -17472,182 +18245,176 @@ msgstr[0] "процедуры допускают не более %d аргуме msgstr[1] "процедуры допускают не более %d аргументов" msgstr[2] "процедуры допускают не более %d аргументов" -#: parser/parse_func.c:2233 +#: parser/parse_func.c:2359 #, c-format msgid "%s is not a function" msgstr "%s — не функция" -#: parser/parse_func.c:2253 +#: parser/parse_func.c:2379 #, c-format msgid "function %s is not an aggregate" msgstr "функция \"%s\" не является агрегатной" -#: parser/parse_func.c:2281 +#: parser/parse_func.c:2407 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "не удалось найти процедуру с именем \"%s\"" -#: parser/parse_func.c:2295 +#: parser/parse_func.c:2421 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "не удалось найти агрегат с именем \"%s\"" -#: parser/parse_func.c:2300 +#: parser/parse_func.c:2426 #, c-format msgid "aggregate %s(*) does not exist" msgstr "агрегатная функция %s(*) не существует" -#: parser/parse_func.c:2305 +#: parser/parse_func.c:2431 #, c-format msgid "aggregate %s does not exist" msgstr "агрегатная функция %s не существует" -#: parser/parse_func.c:2340 +#: parser/parse_func.c:2467 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "имя процедуры \"%s\" не уникально" -#: parser/parse_func.c:2342 +#: parser/parse_func.c:2470 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "Задайте список аргументов для однозначного выбора процедуры." -#: parser/parse_func.c:2347 +#: parser/parse_func.c:2475 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "имя агрегатной функции \"%s\" не уникально" -#: parser/parse_func.c:2349 +#: parser/parse_func.c:2478 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "Задайте список аргументов для однозначного выбора агрегатной функции." -#: parser/parse_func.c:2354 +#: parser/parse_func.c:2483 #, c-format msgid "routine name \"%s\" is not unique" msgstr "имя подпрограммы \"%s\" не уникально" -#: parser/parse_func.c:2356 +#: parser/parse_func.c:2486 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "Задайте список аргументов для однозначного выбора подпрограммы." -#: parser/parse_func.c:2411 +#: parser/parse_func.c:2541 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "функции, возвращающие множества, нельзя применять в условиях JOIN" -#: parser/parse_func.c:2432 +#: parser/parse_func.c:2562 msgid "set-returning functions are not allowed in policy expressions" msgstr "функции, возвращающие множества, нельзя применять в выражениях политик" -#: parser/parse_func.c:2448 +#: parser/parse_func.c:2578 msgid "set-returning functions are not allowed in window definitions" msgstr "функции, возвращающие множества, нельзя применять в определении окна" -#: parser/parse_func.c:2486 +#: parser/parse_func.c:2616 msgid "set-returning functions are not allowed in check constraints" msgstr "" "функции, возвращающие множества, нельзя применять в ограничениях-проверках" -#: parser/parse_func.c:2490 +#: parser/parse_func.c:2620 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "функции, возвращающие множества, нельзя применять в выражениях DEFAULT" -#: parser/parse_func.c:2493 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in index expressions" msgstr "" "функции, возвращающие множества, нельзя применять в выражениях индексов" -#: parser/parse_func.c:2496 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index predicates" msgstr "" "функции, возвращающие множества, нельзя применять в предикатах индексов" -#: parser/parse_func.c:2499 +#: parser/parse_func.c:2629 +msgid "set-returning functions are not allowed in statistics expressions" +msgstr "" +"функции, возвращающие множества, нельзя применять в выражениях статистики" + +#: parser/parse_func.c:2632 msgid "set-returning functions are not allowed in transform expressions" msgstr "" "функции, возвращающие множества, нельзя применять в выражениях преобразований" -#: parser/parse_func.c:2502 +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "функции, возвращающие множества, нельзя применять в параметрах EXECUTE" -#: parser/parse_func.c:2505 +#: parser/parse_func.c:2638 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "" "функции, возвращающие множества, нельзя применять в условиях WHEN для " "триггеров" -#: parser/parse_func.c:2508 +#: parser/parse_func.c:2641 msgid "set-returning functions are not allowed in partition bound" msgstr "" "функции, возвращающие множества, нельзя применять в выражении границы секции" -#: parser/parse_func.c:2511 +#: parser/parse_func.c:2644 msgid "set-returning functions are not allowed in partition key expressions" msgstr "" "функции, возвращающие множества, нельзя применять в выражениях ключа " "секционирования" -#: parser/parse_func.c:2514 +#: parser/parse_func.c:2647 msgid "set-returning functions are not allowed in CALL arguments" msgstr "функции, возвращающие множества, нельзя применять в аргументах CALL" -#: parser/parse_func.c:2517 +#: parser/parse_func.c:2650 msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" msgstr "" "функции, возвращающие множества, нельзя применять в условиях COPY FROM WHERE" -#: parser/parse_func.c:2520 +#: parser/parse_func.c:2653 msgid "" "set-returning functions are not allowed in column generation expressions" msgstr "" "функции, возвращающие множества, нельзя применять в выражениях генерируемых " "столбцов" -#: parser/parse_node.c:86 +#: parser/parse_node.c:87 #, c-format msgid "target lists can have at most %d entries" msgstr "допустимое число элементов в целевом списке ограничено %d" -#: parser/parse_node.c:235 -#, c-format -msgid "cannot subscript type %s because it is not an array" -msgstr "тип %s - не массив и для него нельзя указать индекс элемента" - -#: parser/parse_node.c:340 parser/parse_node.c:377 -#, c-format -msgid "array subscript must have type integer" -msgstr "индекс элемента массива должен быть целочисленным" - -#: parser/parse_node.c:408 +#: parser/parse_oper.c:123 parser/parse_oper.c:690 #, c-format -msgid "array assignment requires type %s but expression is of type %s" -msgstr "" -"для присваивания массива требуется тип %s, однако выражение имеет тип %s" +msgid "postfix operators are not supported" +msgstr "постфиксные операторы не поддерживаются" -#: parser/parse_oper.c:125 parser/parse_oper.c:724 utils/adt/regproc.c:521 -#: utils/adt/regproc.c:705 +#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:539 +#: utils/adt/regproc.c:723 #, c-format msgid "operator does not exist: %s" msgstr "оператор не существует: %s" -#: parser/parse_oper.c:224 +#: parser/parse_oper.c:229 #, c-format msgid "Use an explicit ordering operator or modify the query." msgstr "Используйте явный оператор сортировки или измените запрос." -#: parser/parse_oper.c:480 +#: parser/parse_oper.c:485 #, c-format msgid "operator requires run-time type coercion: %s" msgstr "оператору требуется приведение типов во время выполнения: %s" -#: parser/parse_oper.c:716 +#: parser/parse_oper.c:641 #, c-format msgid "operator is not unique: %s" msgstr "оператор не уникален: %s" -#: parser/parse_oper.c:718 +#: parser/parse_oper.c:643 #, c-format msgid "" "Could not choose a best candidate operator. You might need to add explicit " @@ -17656,7 +18423,7 @@ msgstr "" "Не удалось выбрать лучшую кандидатуру оператора. Возможно, вам следует " "добавить явные приведения типов." -#: parser/parse_oper.c:727 +#: parser/parse_oper.c:652 #, c-format msgid "" "No operator matches the given name and argument type. You might need to add " @@ -17665,7 +18432,7 @@ msgstr "" "Оператор с данным именем и типом аргумента не найден. Возможно, вам следует " "добавить явное приведение типа." -#: parser/parse_oper.c:729 +#: parser/parse_oper.c:654 #, c-format msgid "" "No operator matches the given name and argument types. You might need to add " @@ -17674,31 +18441,31 @@ msgstr "" "Оператор с данными именем и типами аргументов не найден. Возможно, вам " "следует добавить явные приведения типов." -#: parser/parse_oper.c:790 parser/parse_oper.c:912 +#: parser/parse_oper.c:714 parser/parse_oper.c:828 #, c-format msgid "operator is only a shell: %s" msgstr "оператор \"%s\" - лишь оболочка" -#: parser/parse_oper.c:900 +#: parser/parse_oper.c:816 #, c-format msgid "op ANY/ALL (array) requires array on right side" msgstr "для операторов ANY/ALL (с массивом) требуется массив справа" -#: parser/parse_oper.c:942 +#: parser/parse_oper.c:858 #, c-format msgid "op ANY/ALL (array) requires operator to yield boolean" msgstr "" "для операторов ANY/ALL (с массивом) требуется, чтобы оператор = возвращал " "логическое значение" -#: parser/parse_oper.c:947 +#: parser/parse_oper.c:863 #, c-format msgid "op ANY/ALL (array) requires operator not to return a set" msgstr "" "для операторов ANY/ALL (с массивом) требуется, чтобы оператор возвращал не " "множество" -#: parser/parse_param.c:216 +#: parser/parse_param.c:225 #, c-format msgid "inconsistent types deduced for parameter $%d" msgstr "для параметра $%d выведены несогласованные типы" @@ -17713,17 +18480,17 @@ msgstr "ссылка на таблицу \"%s\" неоднозначна" msgid "table reference %u is ambiguous" msgstr "ссылка на таблицу %u неоднозначна" -#: parser/parse_relation.c:444 +#: parser/parse_relation.c:445 #, c-format msgid "table name \"%s\" specified more than once" msgstr "имя таблицы \"%s\" указано больше одного раза" -#: parser/parse_relation.c:473 parser/parse_relation.c:3446 +#: parser/parse_relation.c:474 parser/parse_relation.c:3532 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "в элементе предложения FROM неверная ссылка на таблицу \"%s\"" -#: parser/parse_relation.c:477 parser/parse_relation.c:3451 +#: parser/parse_relation.c:478 parser/parse_relation.c:3537 #, c-format msgid "" "There is an entry for table \"%s\", but it cannot be referenced from this " @@ -17732,30 +18499,30 @@ msgstr "" "Таблица \"%s\" присутствует в запросе, но сослаться на неё из этой части " "запроса нельзя." -#: parser/parse_relation.c:479 +#: parser/parse_relation.c:480 #, c-format msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." msgstr "Для ссылки LATERAL тип JOIN должен быть INNER или LEFT." -#: parser/parse_relation.c:690 +#: parser/parse_relation.c:691 #, c-format msgid "system column \"%s\" reference in check constraint is invalid" msgstr "в ограничении-проверке указан недопустимый системный столбец \"%s\"" -#: parser/parse_relation.c:699 +#: parser/parse_relation.c:700 #, c-format msgid "cannot use system column \"%s\" in column generation expression" msgstr "" "системный столбец \"%s\" нельзя использовать в выражении генерируемого " "столбца" -#: parser/parse_relation.c:1170 parser/parse_relation.c:1620 -#: parser/parse_relation.c:2262 +#: parser/parse_relation.c:1173 parser/parse_relation.c:1625 +#: parser/parse_relation.c:2302 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "в таблице \"%s\" содержится столбцов: %d, но указано: %d" -#: parser/parse_relation.c:1372 +#: parser/parse_relation.c:1377 #, c-format msgid "" "There is a WITH item named \"%s\", but it cannot be referenced from this " @@ -17764,7 +18531,7 @@ msgstr "" "В WITH есть элемент \"%s\", но на него нельзя ссылаться из этой части " "запроса." -#: parser/parse_relation.c:1374 +#: parser/parse_relation.c:1379 #, c-format msgid "" "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." @@ -17772,62 +18539,76 @@ msgstr "" "Используйте WITH RECURSIVE или исключите ссылки вперёд, переупорядочив " "элементы WITH." -#: parser/parse_relation.c:1747 +#: parser/parse_relation.c:1767 +#, c-format +msgid "" +"a column definition list is redundant for a function with OUT parameters" +msgstr "список определений столбцов не нужен для функции с параметрами OUT" + +#: parser/parse_relation.c:1773 +#, c-format +msgid "" +"a column definition list is redundant for a function returning a named " +"composite type" +msgstr "" +"список определений столбцов не нужен для функции, возвращающий именованный " +"составной тип" + +#: parser/parse_relation.c:1780 #, c-format msgid "" "a column definition list is only allowed for functions returning \"record\"" msgstr "" -"список с определением столбцов может быть только у функций, возвращающих " -"запись" +"список определений столбцов может быть только у функций, возвращающих запись" -#: parser/parse_relation.c:1756 +#: parser/parse_relation.c:1791 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "" -"у функций, возвращающих запись, должен быть список с определением столбцов" +"у функций, возвращающих запись, должен быть список определений столбцов" -#: parser/parse_relation.c:1845 +#: parser/parse_relation.c:1880 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "" "функция \"%s\", используемая во FROM, возвращает неподдерживаемый тип %s" -#: parser/parse_relation.c:2054 +#: parser/parse_relation.c:2089 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "в списках VALUES \"%s\" содержится столбцов: %d, но указано: %d" -#: parser/parse_relation.c:2125 +#: parser/parse_relation.c:2161 #, c-format msgid "joins can have at most %d columns" msgstr "число столбцов в соединениях ограничено %d" -#: parser/parse_relation.c:2235 +#: parser/parse_relation.c:2275 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "в запросе \"%s\" в WITH нет предложения RETURNING" -#: parser/parse_relation.c:3221 parser/parse_relation.c:3231 +#: parser/parse_relation.c:3307 parser/parse_relation.c:3317 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "столбец %d отношения \"%s\" не существует" -#: parser/parse_relation.c:3449 +#: parser/parse_relation.c:3535 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Возможно, предполагалась ссылка на псевдоним таблицы \"%s\"." -#: parser/parse_relation.c:3457 +#: parser/parse_relation.c:3543 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "таблица \"%s\" отсутствует в предложении FROM" -#: parser/parse_relation.c:3509 +#: parser/parse_relation.c:3595 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "Возможно, предполагалась ссылка на столбец \"%s.%s\"." -#: parser/parse_relation.c:3511 +#: parser/parse_relation.c:3597 #, c-format msgid "" "There is a column named \"%s\" in table \"%s\", but it cannot be referenced " @@ -17836,34 +18617,34 @@ msgstr "" "Столбец \"%s\" есть в таблице \"%s\", но на него нельзя ссылаться из этой " "части запроса." -#: parser/parse_relation.c:3528 +#: parser/parse_relation.c:3614 #, c-format msgid "" "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "" "Возможно, предполагалась ссылка на столбец \"%s.%s\" или столбец \"%s.%s\"." -#: parser/parse_target.c:478 parser/parse_target.c:792 +#: parser/parse_target.c:482 parser/parse_target.c:803 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "присвоить значение системному столбцу \"%s\" нельзя" -#: parser/parse_target.c:506 +#: parser/parse_target.c:510 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "элементу массива нельзя присвоить значение по умолчанию" -#: parser/parse_target.c:511 +#: parser/parse_target.c:515 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "вложенному полю нельзя присвоить значение по умолчанию" -#: parser/parse_target.c:584 +#: parser/parse_target.c:589 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "столбец \"%s\" имеет тип %s, а выражение - %s" -#: parser/parse_target.c:776 +#: parser/parse_target.c:787 #, c-format msgid "" "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a " @@ -17872,7 +18653,7 @@ msgstr "" "присвоить значение полю \"%s\" столбца \"%s\" нельзя, так как тип %s не " "является составным" -#: parser/parse_target.c:785 +#: parser/parse_target.c:796 #, c-format msgid "" "cannot assign to field \"%s\" of column \"%s\" because there is no such " @@ -17881,20 +18662,21 @@ msgstr "" "присвоить значение полю \"%s\" столбца \"%s\" нельзя, так как в типе данных " "%s нет такого столбца" -#: parser/parse_target.c:864 +#: parser/parse_target.c:877 #, c-format msgid "" -"array assignment to \"%s\" requires type %s but expression is of type %s" +"subscripted assignment to \"%s\" requires type %s but expression is of type " +"%s" msgstr "" -"для присваивания массива полю \"%s\" требуется тип %s, однако выражение " -"имеет тип %s" +"для присваивания \"%s\" значения по индексу требуется тип %s, однако " +"выражение имеет тип %s" -#: parser/parse_target.c:874 +#: parser/parse_target.c:887 #, c-format msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "вложенное поле \"%s\" имеет тип %s, а выражение - %s" -#: parser/parse_target.c:1295 +#: parser/parse_target.c:1322 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * должен ссылаться на таблицы" @@ -17914,11 +18696,11 @@ msgstr "неправильное указание %%TYPE (слишком мно msgid "type reference %s converted to %s" msgstr "ссылка на тип %s преобразована в тип %s" -#: parser/parse_type.c:278 parser/parse_type.c:857 utils/cache/typcache.c:383 -#: utils/cache/typcache.c:437 +#: parser/parse_type.c:278 parser/parse_type.c:803 utils/cache/typcache.c:389 +#: utils/cache/typcache.c:444 #, c-format msgid "type \"%s\" is only a shell" -msgstr "тип \"%s\" - лишь пустышка" +msgstr "тип \"%s\" является пустышкой" #: parser/parse_type.c:363 #, c-format @@ -17930,88 +18712,84 @@ msgstr "у типа \"%s\" не может быть модификаторов" msgid "type modifiers must be simple constants or identifiers" msgstr "модификатором типа должна быть простая константа или идентификатор" -#: parser/parse_type.c:721 parser/parse_type.c:820 +#: parser/parse_type.c:721 parser/parse_type.c:766 #, c-format msgid "invalid type name \"%s\"" msgstr "неверное имя типа \"%s\"" -#: parser/parse_utilcmd.c:266 +#: parser/parse_utilcmd.c:256 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "создать секционированную таблицу в виде потомка нельзя" -#: parser/parse_utilcmd.c:444 -#, c-format -msgid "%s will create implicit sequence \"%s\" for serial column \"%s.%s\"" -msgstr "%s создаст последовательность \"%s\" для столбца serial \"%s.%s\"" - -#: parser/parse_utilcmd.c:575 +#: parser/parse_utilcmd.c:570 #, c-format msgid "array of serial is not implemented" msgstr "массивы с типом serial не реализованы" -#: parser/parse_utilcmd.c:653 parser/parse_utilcmd.c:665 +#: parser/parse_utilcmd.c:649 parser/parse_utilcmd.c:661 +#: parser/parse_utilcmd.c:720 #, c-format msgid "" "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "конфликт NULL/NOT NULL в объявлении столбца \"%s\" таблицы \"%s\"" -#: parser/parse_utilcmd.c:677 +#: parser/parse_utilcmd.c:673 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "" "для столбца \"%s\" таблицы \"%s\" указано несколько значений по умолчанию" -#: parser/parse_utilcmd.c:694 +#: parser/parse_utilcmd.c:690 #, c-format msgid "identity columns are not supported on typed tables" msgstr "столбцы идентификации не поддерживаются с типизированными таблицами" -#: parser/parse_utilcmd.c:698 +#: parser/parse_utilcmd.c:694 #, c-format msgid "identity columns are not supported on partitions" msgstr "столбцы идентификации не поддерживаются с секциями" -#: parser/parse_utilcmd.c:707 +#: parser/parse_utilcmd.c:703 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "" "для столбца \"%s\" таблицы \"%s\" свойство identity задано неоднократно" -#: parser/parse_utilcmd.c:727 +#: parser/parse_utilcmd.c:733 #, c-format msgid "generated columns are not supported on typed tables" msgstr "генерируемые столбцы не поддерживаются с типизированными таблицами" -#: parser/parse_utilcmd.c:731 +#: parser/parse_utilcmd.c:737 #, c-format msgid "generated columns are not supported on partitions" msgstr "генерируемые столбцы не поддерживаются с секциями" -#: parser/parse_utilcmd.c:736 +#: parser/parse_utilcmd.c:742 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "" "для столбца \"%s\" таблицы \"%s\" указано несколько генерирующих выражений" -#: parser/parse_utilcmd.c:754 parser/parse_utilcmd.c:869 +#: parser/parse_utilcmd.c:760 parser/parse_utilcmd.c:875 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "ограничения первичного ключа для сторонних таблиц не поддерживаются" -#: parser/parse_utilcmd.c:763 parser/parse_utilcmd.c:879 +#: parser/parse_utilcmd.c:769 parser/parse_utilcmd.c:885 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "ограничения уникальности для сторонних таблиц не поддерживаются" -#: parser/parse_utilcmd.c:808 +#: parser/parse_utilcmd.c:814 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "" "для столбца \"%s\" таблицы \"%s\" задано и значение по умолчанию, и свойство " "identity" -#: parser/parse_utilcmd.c:816 +#: parser/parse_utilcmd.c:822 #, c-format msgid "" "both default and generation expression specified for column \"%s\" of table " @@ -18020,7 +18798,7 @@ msgstr "" "для столбца \"%s\" таблицы \"%s\" задано и значение по умолчанию, и " "генерирующее выражение" -#: parser/parse_utilcmd.c:824 +#: parser/parse_utilcmd.c:830 #, c-format msgid "" "both identity and generation expression specified for column \"%s\" of table " @@ -18029,93 +18807,93 @@ msgstr "" "для столбца \"%s\" таблицы \"%s\" задано и генерирующее выражение, и " "свойство identity" -#: parser/parse_utilcmd.c:889 +#: parser/parse_utilcmd.c:895 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "ограничения-исключения для сторонних таблиц не поддерживаются" -#: parser/parse_utilcmd.c:895 +#: parser/parse_utilcmd.c:901 #, c-format msgid "exclusion constraints are not supported on partitioned tables" msgstr "ограничения-исключения для секционированных таблиц не поддерживаются" -#: parser/parse_utilcmd.c:960 +#: parser/parse_utilcmd.c:966 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE при создании сторонних таблиц не поддерживается" -#: parser/parse_utilcmd.c:1728 parser/parse_utilcmd.c:1837 +#: parser/parse_utilcmd.c:1743 parser/parse_utilcmd.c:1851 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "Индекс \"%s\" ссылается на тип всей строки таблицы." -#: parser/parse_utilcmd.c:2187 +#: parser/parse_utilcmd.c:2238 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "в CREATE TABLE нельзя использовать существующий индекс" -#: parser/parse_utilcmd.c:2207 +#: parser/parse_utilcmd.c:2258 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "индекс \"%s\" уже связан с ограничением" -#: parser/parse_utilcmd.c:2222 +#: parser/parse_utilcmd.c:2273 #, c-format msgid "index \"%s\" is not valid" msgstr "индекс \"%s\" - нерабочий" -#: parser/parse_utilcmd.c:2228 +#: parser/parse_utilcmd.c:2279 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\" не является уникальным индексом" -#: parser/parse_utilcmd.c:2229 parser/parse_utilcmd.c:2236 -#: parser/parse_utilcmd.c:2243 parser/parse_utilcmd.c:2320 +#: parser/parse_utilcmd.c:2280 parser/parse_utilcmd.c:2287 +#: parser/parse_utilcmd.c:2294 parser/parse_utilcmd.c:2371 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "" "Создать первичный ключ или ограничение уникальности для такого индекса " "нельзя." -#: parser/parse_utilcmd.c:2235 +#: parser/parse_utilcmd.c:2286 #, c-format msgid "index \"%s\" contains expressions" msgstr "индекс \"%s\" содержит выражения" -#: parser/parse_utilcmd.c:2242 +#: parser/parse_utilcmd.c:2293 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\" - частичный индекс" -#: parser/parse_utilcmd.c:2254 +#: parser/parse_utilcmd.c:2305 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\" - откладываемый индекс" -#: parser/parse_utilcmd.c:2255 +#: parser/parse_utilcmd.c:2306 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "" "Создать не откладываемое ограничение на базе откладываемого индекса нельзя." -#: parser/parse_utilcmd.c:2319 +#: parser/parse_utilcmd.c:2370 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "" "в индексе \"%s\" для столбца номер %d не определено поведение сортировки по " "умолчанию" -#: parser/parse_utilcmd.c:2476 +#: parser/parse_utilcmd.c:2527 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "столбец \"%s\" фигурирует в первичном ключе дважды" -#: parser/parse_utilcmd.c:2482 +#: parser/parse_utilcmd.c:2533 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "столбец \"%s\" фигурирует в ограничении уникальности дважды" -#: parser/parse_utilcmd.c:2835 +#: parser/parse_utilcmd.c:2880 #, c-format msgid "" "index expressions and predicates can refer only to the table being indexed" @@ -18123,17 +18901,22 @@ msgstr "" "индексные выражения и предикаты могут ссылаться только на индексируемую " "таблицу" -#: parser/parse_utilcmd.c:2881 +#: parser/parse_utilcmd.c:2952 +#, c-format +msgid "statistics expressions can refer only to the table being referenced" +msgstr "выражения статистики могут ссылаться только на целевую таблицу" + +#: parser/parse_utilcmd.c:2995 #, c-format msgid "rules on materialized views are not supported" msgstr "правила для материализованных представлений не поддерживаются" -#: parser/parse_utilcmd.c:2944 +#: parser/parse_utilcmd.c:3058 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "в условиях WHERE для правил нельзя ссылаться на другие отношения" -#: parser/parse_utilcmd.c:3018 +#: parser/parse_utilcmd.c:3131 #, c-format msgid "" "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE " @@ -18142,238 +18925,240 @@ msgstr "" "правила с условиями WHERE могут содержать только действия SELECT, INSERT, " "UPDATE или DELETE" -#: parser/parse_utilcmd.c:3036 parser/parse_utilcmd.c:3137 -#: rewrite/rewriteHandler.c:503 rewrite/rewriteManip.c:1018 +#: parser/parse_utilcmd.c:3149 parser/parse_utilcmd.c:3250 +#: rewrite/rewriteHandler.c:508 rewrite/rewriteManip.c:1018 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "условные операторы UNION/INTERSECT/EXCEPT не реализованы" -#: parser/parse_utilcmd.c:3054 +#: parser/parse_utilcmd.c:3167 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "в правиле ON SELECT нельзя использовать OLD" -#: parser/parse_utilcmd.c:3058 +#: parser/parse_utilcmd.c:3171 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "в правиле ON SELECT нельзя использовать NEW" -#: parser/parse_utilcmd.c:3067 +#: parser/parse_utilcmd.c:3180 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "в правиле ON INSERT нельзя использовать OLD" -#: parser/parse_utilcmd.c:3073 +#: parser/parse_utilcmd.c:3186 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "в правиле ON DELETE нельзя использовать NEW" -#: parser/parse_utilcmd.c:3101 +#: parser/parse_utilcmd.c:3214 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "в запросе WITH нельзя ссылаться на OLD" -#: parser/parse_utilcmd.c:3108 +#: parser/parse_utilcmd.c:3221 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "в запросе WITH нельзя ссылаться на NEW" -#: parser/parse_utilcmd.c:3567 +#: parser/parse_utilcmd.c:3674 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "предложение DEFERRABLE расположено неправильно" -#: parser/parse_utilcmd.c:3572 parser/parse_utilcmd.c:3587 +#: parser/parse_utilcmd.c:3679 parser/parse_utilcmd.c:3694 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "DEFERRABLE/NOT DEFERRABLE можно указать только один раз" -#: parser/parse_utilcmd.c:3582 +#: parser/parse_utilcmd.c:3689 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "предложение NOT DEFERRABLE расположено неправильно" -#: parser/parse_utilcmd.c:3595 parser/parse_utilcmd.c:3621 gram.y:5594 +#: parser/parse_utilcmd.c:3702 parser/parse_utilcmd.c:3728 gram.y:5558 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "" "ограничение с характеристикой INITIALLY DEFERRED должно быть объявлено как " "DEFERRABLE" -#: parser/parse_utilcmd.c:3603 +#: parser/parse_utilcmd.c:3710 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "предложение INITIALLY DEFERRED расположено неправильно" -#: parser/parse_utilcmd.c:3608 parser/parse_utilcmd.c:3634 +#: parser/parse_utilcmd.c:3715 parser/parse_utilcmd.c:3741 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "INITIALLY IMMEDIATE/DEFERRED можно указать только один раз" -#: parser/parse_utilcmd.c:3629 +#: parser/parse_utilcmd.c:3736 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "предложение INITIALLY IMMEDIATE расположено неправильно" -#: parser/parse_utilcmd.c:3820 +#: parser/parse_utilcmd.c:3927 #, c-format msgid "" "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "в CREATE указана схема (%s), отличная от создаваемой (%s)" -#: parser/parse_utilcmd.c:3855 +#: parser/parse_utilcmd.c:3962 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\" — не секционированная таблица" -#: parser/parse_utilcmd.c:3862 +#: parser/parse_utilcmd.c:3969 #, c-format msgid "table \"%s\" is not partitioned" msgstr "таблица \"%s\" не является секционированной" -#: parser/parse_utilcmd.c:3869 +#: parser/parse_utilcmd.c:3976 #, c-format msgid "index \"%s\" is not partitioned" msgstr "индекс \"%s\" не секционирован" -#: parser/parse_utilcmd.c:3909 +#: parser/parse_utilcmd.c:4016 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "у секционированной по хешу таблицы не может быть секции по умолчанию" -#: parser/parse_utilcmd.c:3926 +#: parser/parse_utilcmd.c:4033 #, c-format msgid "invalid bound specification for a hash partition" msgstr "неправильное указание ограничения для хеш-секции" -#: parser/parse_utilcmd.c:3932 partitioning/partbounds.c:4640 +#: parser/parse_utilcmd.c:4039 partitioning/partbounds.c:4711 #, c-format -msgid "modulus for hash partition must be a positive integer" +msgid "modulus for hash partition must be an integer value greater than zero" msgstr "модуль для хеш-секции должен быть положительным целым" -#: parser/parse_utilcmd.c:3939 partitioning/partbounds.c:4648 +#: parser/parse_utilcmd.c:4046 partitioning/partbounds.c:4719 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "остаток для хеш-секции должен быть меньше модуля" -#: parser/parse_utilcmd.c:3952 +#: parser/parse_utilcmd.c:4059 #, c-format msgid "invalid bound specification for a list partition" msgstr "неправильное указание ограничения для секции по списку" -#: parser/parse_utilcmd.c:4005 +#: parser/parse_utilcmd.c:4112 #, c-format msgid "invalid bound specification for a range partition" msgstr "неправильное указание ограничения для секции по диапазону" -#: parser/parse_utilcmd.c:4011 +#: parser/parse_utilcmd.c:4118 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "" "во FROM должно указываться ровно одно значение для секционирующего столбца" -#: parser/parse_utilcmd.c:4015 +#: parser/parse_utilcmd.c:4122 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "" "в TO должно указываться ровно одно значение для секционирующего столбца" -#: parser/parse_utilcmd.c:4129 +#: parser/parse_utilcmd.c:4236 #, c-format msgid "cannot specify NULL in range bound" msgstr "указать NULL в диапазонном ограничении нельзя" -#: parser/parse_utilcmd.c:4178 +#: parser/parse_utilcmd.c:4285 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "за границей MAXVALUE могут следовать только границы MAXVALUE" -#: parser/parse_utilcmd.c:4185 +#: parser/parse_utilcmd.c:4292 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "за границей MINVALUE могут следовать только границы MINVALUE" -#: parser/parse_utilcmd.c:4227 -#, c-format -msgid "" -"could not determine which collation to use for partition bound expression" -msgstr "не удалось определить правило сортировки для выражения границы секции" - -#: parser/parse_utilcmd.c:4244 -#, c-format -msgid "" -"collation of partition bound value for column \"%s\" does not match " -"partition key collation \"%s\"" -msgstr "" -"правило сортировки для выражения границы секции в столбце \"%s\" не " -"соответствует правилу сортировки для ключа секционирования \"%s\"" - -#: parser/parse_utilcmd.c:4261 +#: parser/parse_utilcmd.c:4335 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "указанное значение нельзя привести к типу %s столбца \"%s\"" -#: parser/parser.c:228 +#: parser/parser.c:247 msgid "UESCAPE must be followed by a simple string literal" msgstr "За UESCAPE должна следовать простая строковая константа" -#: parser/parser.c:233 +#: parser/parser.c:252 msgid "invalid Unicode escape character" msgstr "неверный символ спецкода Unicode" -#: parser/parser.c:302 scan.l:1329 +#: parser/parser.c:321 scan.l:1329 #, c-format msgid "invalid Unicode escape value" msgstr "неверное значение спецкода Unicode" -#: parser/parser.c:449 scan.l:677 +#: parser/parser.c:468 utils/adt/varlena.c:6559 scan.l:677 #, c-format msgid "invalid Unicode escape" msgstr "неверный спецкод Unicode" -#: parser/parser.c:450 +#: parser/parser.c:469 #, c-format msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Спецкоды Unicode должны иметь вид \\XXXX или \\+XXXXXX." -#: parser/parser.c:478 scan.l:638 scan.l:654 scan.l:670 +#: parser/parser.c:497 utils/adt/varlena.c:6584 scan.l:638 scan.l:654 +#: scan.l:670 #, c-format msgid "invalid Unicode surrogate pair" msgstr "неверная суррогатная пара Unicode" -#: parser/scansup.c:203 +#: parser/scansup.c:101 #, c-format -msgid "identifier \"%s\" will be truncated to \"%s\"" -msgstr "идентификатор \"%s\" будет усечён до \"%s\"" +msgid "identifier \"%s\" will be truncated to \"%.*s\"" +msgstr "идентификатор \"%s\" будет усечён до \"%.*s\"" #: partitioning/partbounds.c:2821 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "секция \"%s\" конфликтует с существующей секцией по умолчанию \"%s\"" -#: partitioning/partbounds.c:2880 +#: partitioning/partbounds.c:2873 partitioning/partbounds.c:2892 +#: partitioning/partbounds.c:2914 #, c-format msgid "" "every hash partition modulus must be a factor of the next larger modulus" msgstr "" "модуль каждой хеш-секции должен быть делителем модулей, превышающих его" -#: partitioning/partbounds.c:2976 +#: partitioning/partbounds.c:2874 partitioning/partbounds.c:2915 +#, c-format +msgid "" +"The new modulus %d is not a factor of %d, the modulus of existing partition " +"\"%s\"." +msgstr "" +"Новый модуль %d не является делителем %d, модуля существующей секции \"%s\"." + +#: partitioning/partbounds.c:2893 +#, c-format +msgid "" +"The new modulus %d is not divisible by %d, the modulus of existing partition " +"\"%s\"." +msgstr "Новый модуль %d не делится на %d, модуль существующей секции \"%s\"." + +#: partitioning/partbounds.c:3028 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "для секции \"%s\" заданы границы, образующие пустой диапазон" -#: partitioning/partbounds.c:2978 +#: partitioning/partbounds.c:3030 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "Указанная нижняя граница %s больше или равна верхней границе %s." -#: partitioning/partbounds.c:3075 +#: partitioning/partbounds.c:3142 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "секция \"%s\" пересекается с секцией \"%s\"" -#: partitioning/partbounds.c:3192 +#: partitioning/partbounds.c:3259 #, c-format msgid "" "skipped scanning foreign table \"%s\" which is a partition of default " @@ -18382,17 +19167,19 @@ msgstr "" "пропущено сканирование сторонней таблицы \"%s\", являющейся секцией секции " "по умолчанию \"%s\"" -#: partitioning/partbounds.c:4644 +#: partitioning/partbounds.c:4715 #, c-format -msgid "remainder for hash partition must be a non-negative integer" -msgstr "остаток для хеш-секции должен быть неотрицательным целым" +msgid "" +"remainder for hash partition must be an integer value greater than or equal " +"to zero" +msgstr "значение остатка для хеш-секции должно быть неотрицательным целым" -#: partitioning/partbounds.c:4668 +#: partitioning/partbounds.c:4739 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\" не является таблицей, секционированной по хешу" -#: partitioning/partbounds.c:4679 partitioning/partbounds.c:4796 +#: partitioning/partbounds.c:4750 partitioning/partbounds.c:4867 #, c-format msgid "" "number of partitioning columns (%d) does not match number of partition keys " @@ -18401,7 +19188,15 @@ msgstr "" "число секционирующих столбцов (%d) не равно числу представленных ключей " "секционирования (%d)" -#: partitioning/partbounds.c:4701 partitioning/partbounds.c:4733 +#: partitioning/partbounds.c:4772 +#, c-format +msgid "" +"column %d of the partition key has type %s, but supplied value is of type %s" +msgstr "" +"столбец %d ключа секционирования имеет тип %s, но для него передано значение " +"типа %s" + +#: partitioning/partbounds.c:4804 #, c-format msgid "" "column %d of the partition key has type \"%s\", but supplied value is of " @@ -18410,23 +19205,23 @@ msgstr "" "столбец %d ключа секционирования имеет тип \"%s\", но для него передано " "значение типа \"%s\"" -#: port/pg_sema.c:209 port/pg_shmem.c:640 port/posix_sema.c:209 -#: port/sysv_sema.c:327 port/sysv_shmem.c:640 +#: port/pg_sema.c:209 port/pg_shmem.c:678 port/posix_sema.c:209 +#: port/sysv_sema.c:327 port/sysv_shmem.c:678 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "не удалось получить информацию о каталоге данных \"%s\": %m" -#: port/pg_shmem.c:216 port/sysv_shmem.c:216 +#: port/pg_shmem.c:227 port/sysv_shmem.c:227 #, c-format msgid "could not create shared memory segment: %m" msgstr "не удалось создать сегмент разделяемой памяти: %m" -#: port/pg_shmem.c:217 port/sysv_shmem.c:217 +#: port/pg_shmem.c:228 port/sysv_shmem.c:228 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "Ошибка в системном вызове shmget(ключ=%lu, размер=%zu, 0%o)." -#: port/pg_shmem.c:221 port/sysv_shmem.c:221 +#: port/pg_shmem.c:232 port/sysv_shmem.c:232 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory " @@ -18440,7 +19235,7 @@ msgstr "" "Подробная информация о настройке разделяемой памяти содержится в " "документации PostgreSQL." -#: port/pg_shmem.c:228 port/sysv_shmem.c:228 +#: port/pg_shmem.c:239 port/sysv_shmem.c:239 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory " @@ -18455,7 +19250,7 @@ msgstr "" "Подробная информация о настройке разделяемой памяти содержится в " "документации PostgreSQL." -#: port/pg_shmem.c:234 port/sysv_shmem.c:234 +#: port/pg_shmem.c:245 port/sysv_shmem.c:245 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs " @@ -18472,12 +19267,12 @@ msgstr "" "Подробная информация о настройке разделяемой памяти содержится в " "документации PostgreSQL." -#: port/pg_shmem.c:578 port/sysv_shmem.c:578 +#: port/pg_shmem.c:616 port/sysv_shmem.c:616 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "не удалось получить анонимную разделяемую память: %m" -#: port/pg_shmem.c:580 port/sysv_shmem.c:580 +#: port/pg_shmem.c:618 port/sysv_shmem.c:618 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory " @@ -18487,23 +19282,29 @@ msgid "" msgstr "" "Эта ошибка обычно возникает, когда PostgreSQL запрашивает сегмент " "разделяемой памяти, превышая объём доступной физической либо виртуальной " -"памяти или гигантских страниц. Для уменьшения запроса (текущий размер: %zu " -"Б) можно снизить использование разделяемой памяти, возможно, уменьшив " +"памяти или огромных страниц. Для уменьшения запроса (текущий размер: %zu Б) " +"можно снизить использование разделяемой памяти, возможно, уменьшив " "shared_buffers или max_connections." -#: port/pg_shmem.c:648 port/sysv_shmem.c:648 +#: port/pg_shmem.c:686 port/sysv_shmem.c:686 #, c-format msgid "huge pages not supported on this platform" -msgstr "гигантские страницы на этой платформе не поддерживаются" +msgstr "огромные страницы на этой платформе не поддерживаются" -#: port/pg_shmem.c:709 port/sysv_shmem.c:709 utils/init/miscinit.c:1137 +#: port/pg_shmem.c:693 port/sysv_shmem.c:693 +#, c-format +msgid "huge pages not supported with the current shared_memory_type setting" +msgstr "" +"огромные страницы не поддерживаются с текущим значением shared_memory_type" + +#: port/pg_shmem.c:753 port/sysv_shmem.c:753 utils/init/miscinit.c:1167 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "" "ранее выделенный блок разделяемой памяти (ключ %lu, ID %lu) по-прежнему " "используется" -#: port/pg_shmem.c:712 port/sysv_shmem.c:712 utils/init/miscinit.c:1139 +#: port/pg_shmem.c:756 port/sysv_shmem.c:756 utils/init/miscinit.c:1169 #, c-format msgid "" "Terminate any old server processes associated with data directory \"%s\"." @@ -18611,61 +19412,60 @@ msgstr "не удалось разблокировать семафор (код msgid "could not try-lock semaphore: error code %lu" msgstr "не удалось попытаться заблокировать семафор (код ошибки: %lu)" -#: port/win32_shmem.c:144 port/win32_shmem.c:152 port/win32_shmem.c:164 -#: port/win32_shmem.c:179 +#: port/win32_shmem.c:144 port/win32_shmem.c:159 port/win32_shmem.c:171 +#: port/win32_shmem.c:187 #, c-format -msgid "could not enable Lock Pages in Memory user right: error code %lu" -msgstr "" -"не удалось активировать право пользователя на блокировку страниц в памяти: " -"код ошибки %lu" +msgid "could not enable user right \"%s\": error code %lu" +msgstr "не удалось активировать право пользователя \"%s\": код ошибки %lu" -#: port/win32_shmem.c:145 port/win32_shmem.c:153 port/win32_shmem.c:165 -#: port/win32_shmem.c:180 +#. translator: This is a term from Windows and should be translated to +#. match the Windows localization. +#. +#: port/win32_shmem.c:150 port/win32_shmem.c:159 port/win32_shmem.c:171 +#: port/win32_shmem.c:182 port/win32_shmem.c:184 port/win32_shmem.c:187 +msgid "Lock pages in memory" +msgstr "Блокировка страниц в памяти" + +#: port/win32_shmem.c:152 port/win32_shmem.c:160 port/win32_shmem.c:172 +#: port/win32_shmem.c:188 #, c-format msgid "Failed system call was %s." msgstr "Ошибка в системном вызове %s." -#: port/win32_shmem.c:175 +#: port/win32_shmem.c:182 #, c-format -msgid "could not enable Lock Pages in Memory user right" -msgstr "" -"не удалось активировать право пользователя на блокировку страниц в памяти" +msgid "could not enable user right \"%s\"" +msgstr "не удалось активировать право пользователя \"%s\"" -#: port/win32_shmem.c:176 +#: port/win32_shmem.c:183 #, c-format msgid "" -"Assign Lock Pages in Memory user right to the Windows user account which " -"runs PostgreSQL." +"Assign user right \"%s\" to the Windows user account which runs PostgreSQL." msgstr "" -"Назначьте право \"Блокировка страниц в памяти\" учётной записи пользователя, " -"используемой для запуска PostgreSQL." +"Назначьте право \"%s\" учётной записи пользователя, используемой для запуска " +"PostgreSQL." -#: port/win32_shmem.c:233 +#: port/win32_shmem.c:241 #, c-format msgid "the processor does not support large pages" msgstr "процессор не поддерживает большие страницы" -#: port/win32_shmem.c:235 port/win32_shmem.c:240 -#, c-format -msgid "disabling huge pages" -msgstr "отключение огромных страниц" - -#: port/win32_shmem.c:302 port/win32_shmem.c:338 port/win32_shmem.c:356 +#: port/win32_shmem.c:310 port/win32_shmem.c:346 port/win32_shmem.c:364 #, c-format msgid "could not create shared memory segment: error code %lu" msgstr "не удалось создать сегмент разделяемой памяти (код ошибки: %lu)" -#: port/win32_shmem.c:303 +#: port/win32_shmem.c:311 #, c-format msgid "Failed system call was CreateFileMapping(size=%zu, name=%s)." msgstr "Ошибка в системном вызове CreateFileMapping (размер=%zu, имя=%s)." -#: port/win32_shmem.c:328 +#: port/win32_shmem.c:336 #, c-format msgid "pre-existing shared memory block is still in use" msgstr "ранее созданный блок разделяемой памяти всё ещё используется" -#: port/win32_shmem.c:329 +#: port/win32_shmem.c:337 #, c-format msgid "" "Check if there are any old server processes still running, and terminate " @@ -18673,83 +19473,67 @@ msgid "" msgstr "" "Если по-прежнему работают какие-то старые серверные процессы, снимите их." -#: port/win32_shmem.c:339 +#: port/win32_shmem.c:347 #, c-format msgid "Failed system call was DuplicateHandle." msgstr "Ошибка в системном вызове DuplicateHandle." -#: port/win32_shmem.c:357 +#: port/win32_shmem.c:365 #, c-format msgid "Failed system call was MapViewOfFileEx." msgstr "Ошибка в системном вызове MapViewOfFileEx." -#: postmaster/autovacuum.c:406 +#: postmaster/autovacuum.c:410 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "породить процесс запуска автоочистки не удалось: %m" -#: postmaster/autovacuum.c:442 -#, c-format -msgid "autovacuum launcher started" -msgstr "процесс запуска автоочистки создан" - -#: postmaster/autovacuum.c:839 -#, c-format -msgid "autovacuum launcher shutting down" -msgstr "процесс запуска автоочистки завершается" - -#: postmaster/autovacuum.c:1477 +#: postmaster/autovacuum.c:1492 #, c-format msgid "could not fork autovacuum worker process: %m" msgstr "не удалось породить рабочий процесс автоочистки: %m" -#: postmaster/autovacuum.c:1686 -#, c-format -msgid "autovacuum: processing database \"%s\"" -msgstr "автоочистка: обработка базы данных \"%s\"" - # skip-rule: capital-letter-first -#: postmaster/autovacuum.c:2256 +#: postmaster/autovacuum.c:2283 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "автоочистка: удаление устаревшей врем. таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2485 +#: postmaster/autovacuum.c:2512 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "автоматическая очистка таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2488 +#: postmaster/autovacuum.c:2515 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "автоматический анализ таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2681 +#: postmaster/autovacuum.c:2708 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "обработка рабочей записи для отношения \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3285 +#: postmaster/autovacuum.c:3394 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "автоочистка не запущена из-за неправильной конфигурации" -#: postmaster/autovacuum.c:3286 +#: postmaster/autovacuum.c:3395 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Включите параметр \"track_counts\"." -#: postmaster/bgworker.c:405 postmaster/bgworker.c:900 -#, c-format -msgid "registering background worker \"%s\"" -msgstr "регистрация фонового процесса \"%s\"" - -#: postmaster/bgworker.c:437 +#: postmaster/bgworker.c:256 #, c-format -msgid "unregistering background worker \"%s\"" -msgstr "разрегистрация фонового процесса \"%s\"" +msgid "" +"inconsistent background worker state (max_worker_processes=%d, total_slots=" +"%d)" +msgstr "" +"несогласованное состояние фонового рабочего процесса (max_worker_processes=" +"%d, total_slots=%d)" -#: postmaster/bgworker.c:650 +#: postmaster/bgworker.c:661 #, c-format msgid "" "background worker \"%s\": must attach to shared memory in order to request a " @@ -18758,7 +19542,7 @@ msgstr "" "фоновый процесс \"%s\" должен иметь доступ к общей памяти, чтобы запросить " "подключение к БД" -#: postmaster/bgworker.c:659 +#: postmaster/bgworker.c:670 #, c-format msgid "" "background worker \"%s\": cannot request database access if starting at " @@ -18767,12 +19551,12 @@ msgstr "" "фоновый процесс \"%s\" не может получить доступ к БД, если он запущен при " "старте главного процесса" -#: postmaster/bgworker.c:673 +#: postmaster/bgworker.c:684 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "фоновый процесс \"%s\": неправильный интервал перезапуска" -#: postmaster/bgworker.c:688 +#: postmaster/bgworker.c:699 #, c-format msgid "" "background worker \"%s\": parallel workers may not be configured for restart" @@ -18780,19 +19564,19 @@ msgstr "" "фоновый процесс \"%s\": параллельные исполнители не могут быть настроены для " "перезапуска" -#: postmaster/bgworker.c:712 +#: postmaster/bgworker.c:723 tcop/postgres.c:3188 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "завершение фонового процесса \"%s\" по команде администратора" -#: postmaster/bgworker.c:908 +#: postmaster/bgworker.c:904 #, c-format msgid "" "background worker \"%s\": must be registered in shared_preload_libraries" msgstr "" "фоновой процесс \"%s\" должен быть зарегистрирован в shared_preload_libraries" -#: postmaster/bgworker.c:920 +#: postmaster/bgworker.c:916 #, c-format msgid "" "background worker \"%s\": only dynamic background workers can request " @@ -18801,12 +19585,12 @@ msgstr "" "фоновый процесс \"%s\": только динамические фоновые процессы могут " "запрашивать уведомление" -#: postmaster/bgworker.c:935 +#: postmaster/bgworker.c:931 #, c-format msgid "too many background workers" msgstr "слишком много фоновых процессов" -#: postmaster/bgworker.c:936 +#: postmaster/bgworker.c:932 #, c-format msgid "Up to %d background worker can be registered with the current settings." msgid_plural "" @@ -18818,13 +19602,13 @@ msgstr[1] "" msgstr[2] "" "Максимально возможное число фоновых процессов при текущих параметрах: %d." -#: postmaster/bgworker.c:940 +#: postmaster/bgworker.c:936 #, c-format msgid "" "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "Возможно, стоит увеличить параметр \"max_worker_processes\"." -#: postmaster/checkpointer.c:418 +#: postmaster/checkpointer.c:428 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" @@ -18832,42 +19616,32 @@ msgstr[0] "контрольные точки происходят слишком msgstr[1] "контрольные точки происходят слишком часто (через %d сек.)" msgstr[2] "контрольные точки происходят слишком часто (через %d сек.)" -#: postmaster/checkpointer.c:422 +#: postmaster/checkpointer.c:432 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "Возможно, стоит увеличить параметр \"max_wal_size\"." -#: postmaster/checkpointer.c:1032 +#: postmaster/checkpointer.c:1056 #, c-format msgid "checkpoint request failed" msgstr "сбой при запросе контрольной точки" -#: postmaster/checkpointer.c:1033 +#: postmaster/checkpointer.c:1057 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Смотрите подробности в протоколе сервера." -#: postmaster/checkpointer.c:1217 -#, c-format -msgid "compacted fsync request queue from %d entries to %d entries" -msgstr "очередь запросов fsync сжата (было записей: %d, стало: %d)" - -#: postmaster/pgarch.c:155 -#, c-format -msgid "could not fork archiver: %m" -msgstr "не удалось породить процесс архивации: %m" - -#: postmaster/pgarch.c:425 +#: postmaster/pgarch.c:365 #, c-format msgid "archive_mode enabled, yet archive_command is not set" msgstr "режим архивации включён, но команда архивации не задана" -#: postmaster/pgarch.c:447 +#: postmaster/pgarch.c:387 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "удалён ненужный файл состояния архива \"%s\"" -#: postmaster/pgarch.c:457 +#: postmaster/pgarch.c:397 #, c-format msgid "" "removal of orphan archive status file \"%s\" failed too many times, will try " @@ -18876,7 +19650,7 @@ msgstr "" "удалить ненужный файл состояния архива \"%s\" не получилось много раз " "подряд; следующая попытка будет сделана позже" -#: postmaster/pgarch.c:493 +#: postmaster/pgarch.c:433 #, c-format msgid "" "archiving write-ahead log file \"%s\" failed too many times, will try again " @@ -18885,23 +19659,23 @@ msgstr "" "заархивировать файл журнала предзаписи \"%s\" не удалось много раз подряд; " "следующая попытка будет сделана позже" -#: postmaster/pgarch.c:594 +#: postmaster/pgarch.c:534 #, c-format msgid "archive command failed with exit code %d" msgstr "команда архивации завершилась ошибкой с кодом %d" -#: postmaster/pgarch.c:596 postmaster/pgarch.c:606 postmaster/pgarch.c:612 -#: postmaster/pgarch.c:621 +#: postmaster/pgarch.c:536 postmaster/pgarch.c:546 postmaster/pgarch.c:552 +#: postmaster/pgarch.c:561 #, c-format msgid "The failed archive command was: %s" msgstr "Команда архивации с ошибкой: %s" -#: postmaster/pgarch.c:603 +#: postmaster/pgarch.c:543 #, c-format msgid "archive command was terminated by exception 0x%X" msgstr "команда архивации была прервана исключением 0x%X" -#: postmaster/pgarch.c:605 postmaster/postmaster.c:3725 +#: postmaster/pgarch.c:545 postmaster/postmaster.c:3748 #, c-format msgid "" "See C include file \"ntstatus.h\" for a description of the hexadecimal value." @@ -18909,143 +19683,151 @@ msgstr "" "Описание этого шестнадцатеричного значения ищите во включаемом C-файле " "\"ntstatus.h\"" -#: postmaster/pgarch.c:610 +#: postmaster/pgarch.c:550 #, c-format msgid "archive command was terminated by signal %d: %s" msgstr "команда архивации завершена по сигналу %d: %s" -#: postmaster/pgarch.c:619 +#: postmaster/pgarch.c:559 #, c-format msgid "archive command exited with unrecognized status %d" msgstr "команда архивации завершилась с неизвестным кодом состояния %d" -#: postmaster/pgstat.c:419 +#: postmaster/pgstat.c:418 #, c-format msgid "could not resolve \"localhost\": %s" msgstr "не удалось разрешить \"localhost\": %s" -#: postmaster/pgstat.c:442 +#: postmaster/pgstat.c:441 #, c-format msgid "trying another address for the statistics collector" msgstr "проба другого адреса для сборщика статистики" -#: postmaster/pgstat.c:451 +#: postmaster/pgstat.c:450 #, c-format msgid "could not create socket for statistics collector: %m" msgstr "не удалось создать сокет для сборщика статистики: %m" -#: postmaster/pgstat.c:463 +#: postmaster/pgstat.c:462 #, c-format msgid "could not bind socket for statistics collector: %m" msgstr "не удалось привязаться к сокету для сборщика статистики: %m" -#: postmaster/pgstat.c:474 +#: postmaster/pgstat.c:473 #, c-format msgid "could not get address of socket for statistics collector: %m" msgstr "не удалось получить адрес сокета для сборщика статистики: %m" -#: postmaster/pgstat.c:490 +#: postmaster/pgstat.c:489 #, c-format msgid "could not connect socket for statistics collector: %m" msgstr "не удалось подключить сокет для сборщика статистики: %m" -#: postmaster/pgstat.c:511 +#: postmaster/pgstat.c:510 #, c-format msgid "could not send test message on socket for statistics collector: %m" msgstr "" "не удалось послать тестовое сообщение в сокет для сборщика статистики: %m" -#: postmaster/pgstat.c:537 +#: postmaster/pgstat.c:536 #, c-format msgid "select() failed in statistics collector: %m" msgstr "сбой select() в сборщике статистики: %m" -#: postmaster/pgstat.c:552 +#: postmaster/pgstat.c:551 #, c-format msgid "test message did not get through on socket for statistics collector" msgstr "тестовое сообщение не прошло через сокет для сборщика статистики" -#: postmaster/pgstat.c:567 +#: postmaster/pgstat.c:566 #, c-format msgid "could not receive test message on socket for statistics collector: %m" msgstr "" "тестовое сообщение через сокет для сборщика статистики получить не удалось: " "%m" -#: postmaster/pgstat.c:577 +#: postmaster/pgstat.c:576 #, c-format msgid "incorrect test message transmission on socket for statistics collector" msgstr "тестовое сообщение через сокет для сборщика статистики прошло неверно" -#: postmaster/pgstat.c:600 +#: postmaster/pgstat.c:599 #, c-format msgid "could not set statistics collector socket to nonblocking mode: %m" msgstr "" "не удалось переключить сокет сборщика статистики в неблокирующий режим: %m" -#: postmaster/pgstat.c:642 +#: postmaster/pgstat.c:643 #, c-format msgid "disabling statistics collector for lack of working socket" msgstr "сборщик статистики отключается из-за нехватки рабочего сокета" -#: postmaster/pgstat.c:789 +#: postmaster/pgstat.c:790 #, c-format msgid "could not fork statistics collector: %m" msgstr "не удалось породить процесс сборщика статистики: %m" -#: postmaster/pgstat.c:1376 +#: postmaster/pgstat.c:1444 #, c-format msgid "unrecognized reset target: \"%s\"" msgstr "запрошен сброс неизвестного счётчика: \"%s\"" -#: postmaster/pgstat.c:1377 +#: postmaster/pgstat.c:1445 #, c-format -msgid "Target must be \"archiver\" or \"bgwriter\"." -msgstr "Допустимый счётчик: \"archiver\" или \"bgwriter\"." +msgid "Target must be \"archiver\", \"bgwriter\", or \"wal\"." +msgstr "Допустимый счётчик: \"archiver\", \"bgwriter\" или \"wal\"." -#: postmaster/pgstat.c:4567 +#: postmaster/pgstat.c:3289 #, c-format msgid "could not read statistics message: %m" msgstr "не удалось прочитать сообщение статистики: %m" -#: postmaster/pgstat.c:4889 postmaster/pgstat.c:5052 +#: postmaster/pgstat.c:3634 postmaster/pgstat.c:3819 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "не удалось открыть временный файл статистики \"%s\": %m" -#: postmaster/pgstat.c:4962 postmaster/pgstat.c:5097 +#: postmaster/pgstat.c:3729 postmaster/pgstat.c:3864 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "не удалось записать во временный файл статистики \"%s\": %m" -#: postmaster/pgstat.c:4971 postmaster/pgstat.c:5106 +#: postmaster/pgstat.c:3738 postmaster/pgstat.c:3873 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "не удалось закрыть временный файл статистики \"%s\": %m" -#: postmaster/pgstat.c:4979 postmaster/pgstat.c:5114 +#: postmaster/pgstat.c:3746 postmaster/pgstat.c:3881 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "" "не удалось переименовать временный файл статистики из \"%s\" в \"%s\": %m" -#: postmaster/pgstat.c:5211 postmaster/pgstat.c:5428 postmaster/pgstat.c:5582 +#: postmaster/pgstat.c:3979 postmaster/pgstat.c:4245 postmaster/pgstat.c:4402 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "не удалось открыть файл статистики \"%s\": %m" -#: postmaster/pgstat.c:5223 postmaster/pgstat.c:5233 postmaster/pgstat.c:5254 -#: postmaster/pgstat.c:5265 postmaster/pgstat.c:5287 postmaster/pgstat.c:5302 -#: postmaster/pgstat.c:5365 postmaster/pgstat.c:5440 postmaster/pgstat.c:5460 -#: postmaster/pgstat.c:5478 postmaster/pgstat.c:5494 postmaster/pgstat.c:5512 -#: postmaster/pgstat.c:5528 postmaster/pgstat.c:5594 postmaster/pgstat.c:5606 -#: postmaster/pgstat.c:5618 postmaster/pgstat.c:5629 postmaster/pgstat.c:5654 -#: postmaster/pgstat.c:5676 +#: postmaster/pgstat.c:3991 postmaster/pgstat.c:4001 postmaster/pgstat.c:4022 +#: postmaster/pgstat.c:4033 postmaster/pgstat.c:4044 postmaster/pgstat.c:4066 +#: postmaster/pgstat.c:4081 postmaster/pgstat.c:4151 postmaster/pgstat.c:4182 +#: postmaster/pgstat.c:4257 postmaster/pgstat.c:4277 postmaster/pgstat.c:4295 +#: postmaster/pgstat.c:4311 postmaster/pgstat.c:4329 postmaster/pgstat.c:4345 +#: postmaster/pgstat.c:4414 postmaster/pgstat.c:4426 postmaster/pgstat.c:4438 +#: postmaster/pgstat.c:4449 postmaster/pgstat.c:4460 postmaster/pgstat.c:4485 +#: postmaster/pgstat.c:4512 postmaster/pgstat.c:4525 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "файл статистики \"%s\" испорчен" -#: postmaster/pgstat.c:5805 +#: postmaster/pgstat.c:4634 +#, c-format +msgid "statistics collector's time %s is later than backend local time %s" +msgstr "" +"время сборщика статистики %s опережает локальное время обслуживающего " +"процесса %s" + +#: postmaster/pgstat.c:4657 #, c-format msgid "" "using stale statistics instead of current ones because stats collector is " @@ -19054,27 +19836,33 @@ msgstr "" "используется просроченная статистика вместо текущей, так как сборщик " "статистики не отвечает" -#: postmaster/pgstat.c:6135 +#: postmaster/pgstat.c:4784 +#, c-format +msgid "stats_timestamp %s is later than collector's time %s for database %u" +msgstr "" +"stats_timestamp %s опережает время сборщика статистики %s для базы данных %u" + +#: postmaster/pgstat.c:4997 #, c-format msgid "database hash table corrupted during cleanup --- abort" msgstr "таблица хеша базы данных испорчена при очистке --- прерывание" -#: postmaster/postmaster.c:733 +#: postmaster/postmaster.c:745 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: неверный аргумент для параметра -f: \"%s\"\n" -#: postmaster/postmaster.c:819 +#: postmaster/postmaster.c:824 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: неверный аргумент для параметра -t: \"%s\"\n" -#: postmaster/postmaster.c:870 +#: postmaster/postmaster.c:875 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: неверный аргумент: \"%s\"\n" -#: postmaster/postmaster.c:912 +#: postmaster/postmaster.c:917 #, c-format msgid "" "%s: superuser_reserved_connections (%d) must be less than max_connections " @@ -19083,12 +19871,12 @@ msgstr "" "%s: значение superuser_reserved_connections (%d) должно быть меньше " "max_connections (%d)\n" -#: postmaster/postmaster.c:919 +#: postmaster/postmaster.c:924 #, c-format msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" msgstr "Архивацию WAL нельзя включить, если установлен wal_level \"minimal\"" -#: postmaster/postmaster.c:922 +#: postmaster/postmaster.c:927 #, c-format msgid "" "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or " @@ -19097,93 +19885,103 @@ msgstr "" "Для потоковой трансляции WAL (max_wal_senders > 0) wal_level должен быть " "\"replica\" или \"logical\"" -#: postmaster/postmaster.c:930 +#: postmaster/postmaster.c:935 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: ошибка в таблицах маркеров времени, требуется исправление\n" -#: postmaster/postmaster.c:1047 +#: postmaster/postmaster.c:1052 #, c-format msgid "could not create I/O completion port for child queue" msgstr "не удалось создать порт завершения ввода/вывода для очереди потомков" -#: postmaster/postmaster.c:1113 +#: postmaster/postmaster.c:1117 #, c-format msgid "ending log output to stderr" msgstr "завершение вывода в stderr" -#: postmaster/postmaster.c:1114 +#: postmaster/postmaster.c:1118 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "В дальнейшем протокол будет выводиться в \"%s\"." -#: postmaster/postmaster.c:1125 +#: postmaster/postmaster.c:1129 #, c-format msgid "starting %s" msgstr "запускается %s" -#: postmaster/postmaster.c:1154 postmaster/postmaster.c:1252 -#: utils/init/miscinit.c:1597 +#: postmaster/postmaster.c:1158 postmaster/postmaster.c:1257 +#: utils/init/miscinit.c:1627 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "неверный формат списка в параметре \"%s\"" -#: postmaster/postmaster.c:1185 +#: postmaster/postmaster.c:1189 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "не удалось создать принимающий сокет для \"%s\"" -#: postmaster/postmaster.c:1191 +#: postmaster/postmaster.c:1195 #, c-format msgid "could not create any TCP/IP sockets" msgstr "не удалось создать сокеты TCP/IP" -#: postmaster/postmaster.c:1274 +#: postmaster/postmaster.c:1227 +#, c-format +msgid "DNSServiceRegister() failed: error code %ld" +msgstr "функция DNSServiceRegister() выдала ошибку с кодом %ld" + +#: postmaster/postmaster.c:1279 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "не удалось создать Unix-сокет в каталоге \"%s\"" -#: postmaster/postmaster.c:1280 +#: postmaster/postmaster.c:1285 #, c-format msgid "could not create any Unix-domain sockets" msgstr "ни один Unix-сокет создать не удалось" -#: postmaster/postmaster.c:1292 +#: postmaster/postmaster.c:1297 #, c-format msgid "no socket created for listening" msgstr "отсутствуют принимающие сокеты" -#: postmaster/postmaster.c:1323 +#: postmaster/postmaster.c:1328 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %s\n" msgstr "%s: не удалось поменять права для внешнего файла PID \"%s\": %s\n" -#: postmaster/postmaster.c:1327 +#: postmaster/postmaster.c:1332 #, c-format msgid "%s: could not write external PID file \"%s\": %s\n" msgstr "%s: не удалось записать внешний файл PID \"%s\": %s\n" -#: postmaster/postmaster.c:1360 utils/init/postinit.c:215 +#: postmaster/postmaster.c:1365 utils/init/postinit.c:216 #, c-format msgid "could not load pg_hba.conf" msgstr "не удалось загрузить pg_hba.conf" -#: postmaster/postmaster.c:1386 +#: postmaster/postmaster.c:1391 #, c-format msgid "postmaster became multithreaded during startup" msgstr "процесс postmaster стал многопоточным при запуске" -#: postmaster/postmaster.c:1387 +#: postmaster/postmaster.c:1392 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Установите в переменной окружения LC_ALL правильную локаль." -#: postmaster/postmaster.c:1488 +#: postmaster/postmaster.c:1487 +#, c-format +msgid "%s: could not locate my own executable path" +msgstr "%s: не удалось найти путь к собственному исполняемому файлу" + +#: postmaster/postmaster.c:1494 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: подходящий исполняемый файл postgres не найден" -#: postmaster/postmaster.c:1511 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1517 utils/misc/tzparser.c:340 #, c-format msgid "" "This may indicate an incomplete PostgreSQL installation, or that the file " @@ -19192,7 +19990,7 @@ msgstr "" "Возможно, PostgreSQL установлен не полностью или файла \"%s\" нет в " "положенном месте." -#: postmaster/postmaster.c:1538 +#: postmaster/postmaster.c:1544 #, c-format msgid "" "%s: could not find the database system\n" @@ -19203,287 +20001,376 @@ msgstr "" "Ожидалось найти её в каталоге \"%s\",\n" "но открыть файл \"%s\" не удалось: %s\n" -#: postmaster/postmaster.c:1715 +#: postmaster/postmaster.c:1721 #, c-format msgid "select() failed in postmaster: %m" msgstr "сбой select() в postmaster'е: %m" -#: postmaster/postmaster.c:1870 +# well-spelled: неподчиняющимся +#: postmaster/postmaster.c:1857 +#, c-format +msgid "issuing SIGKILL to recalcitrant children" +msgstr "неподчиняющимся потомкам посылается SIGKILL" + +#: postmaster/postmaster.c:1878 #, c-format msgid "" "performing immediate shutdown because data directory lock file is invalid" msgstr "" "немедленное отключение из-за ошибочного файла блокировки каталога данных" -#: postmaster/postmaster.c:1973 postmaster/postmaster.c:2004 +#: postmaster/postmaster.c:1981 postmaster/postmaster.c:2009 #, c-format msgid "incomplete startup packet" msgstr "неполный стартовый пакет" -#: postmaster/postmaster.c:1985 +#: postmaster/postmaster.c:1993 #, c-format msgid "invalid length of startup packet" msgstr "неверная длина стартового пакета" -#: postmaster/postmaster.c:2043 +#: postmaster/postmaster.c:2048 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "не удалось отправить ответ в процессе SSL-согласования: %m" -#: postmaster/postmaster.c:2075 +#: postmaster/postmaster.c:2066 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "после запроса SSL получены незашифрованные данные" + +#: postmaster/postmaster.c:2067 postmaster/postmaster.c:2111 +#, c-format +msgid "" +"This could be either a client-software bug or evidence of an attempted man-" +"in-the-middle attack." +msgstr "" +"Это может свидетельствовать об ошибке в клиентском ПО или о попытке атаки " +"MITM." + +#: postmaster/postmaster.c:2092 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "не удалось отправить ответ в процессе согласования GSSAPI: %m" -#: postmaster/postmaster.c:2105 +#: postmaster/postmaster.c:2110 +#, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "после запроса шифрования GSSAPI получены незашифрованные данные" + +#: postmaster/postmaster.c:2134 #, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "" "неподдерживаемый протокол клиентского приложения %u.%u; сервер поддерживает " "%u.0 - %u.%u" -#: postmaster/postmaster.c:2169 utils/misc/guc.c:6769 utils/misc/guc.c:6805 -#: utils/misc/guc.c:6875 utils/misc/guc.c:8226 utils/misc/guc.c:11072 -#: utils/misc/guc.c:11106 +#: postmaster/postmaster.c:2198 utils/misc/guc.c:7113 utils/misc/guc.c:7149 +#: utils/misc/guc.c:7219 utils/misc/guc.c:8551 utils/misc/guc.c:11507 +#: utils/misc/guc.c:11548 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "неверное значение для параметра \"%s\": \"%s\"" -#: postmaster/postmaster.c:2172 +#: postmaster/postmaster.c:2201 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Допустимые значения: \"false\", 0, \"true\", 1, \"database\"." -#: postmaster/postmaster.c:2217 +#: postmaster/postmaster.c:2246 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "" "неверная структура стартового пакета: последним байтом должен быть терминатор" -#: postmaster/postmaster.c:2255 +#: postmaster/postmaster.c:2263 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "в стартовом пакете не указано имя пользователя PostgreSQL" -#: postmaster/postmaster.c:2319 +#: postmaster/postmaster.c:2327 #, c-format msgid "the database system is starting up" msgstr "система баз данных запускается" -#: postmaster/postmaster.c:2324 +#: postmaster/postmaster.c:2333 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "система БД ещё не принимает подключения" + +#: postmaster/postmaster.c:2334 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "Согласованное состояние восстановления ещё не достигнуто." + +#: postmaster/postmaster.c:2338 +#, c-format +msgid "the database system is not accepting connections" +msgstr "система БД не принимает подключения" + +#: postmaster/postmaster.c:2339 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "Режим горячего резерва отключён." + +#: postmaster/postmaster.c:2344 #, c-format msgid "the database system is shutting down" msgstr "система баз данных останавливается" -#: postmaster/postmaster.c:2329 +#: postmaster/postmaster.c:2349 #, c-format msgid "the database system is in recovery mode" msgstr "система баз данных в режиме восстановления" -#: postmaster/postmaster.c:2334 storage/ipc/procarray.c:293 -#: storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:362 +#: postmaster/postmaster.c:2354 storage/ipc/procarray.c:475 +#: storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:361 #, c-format msgid "sorry, too many clients already" msgstr "извините, уже слишком много клиентов" -#: postmaster/postmaster.c:2424 +#: postmaster/postmaster.c:2444 #, c-format msgid "wrong key in cancel request for process %d" msgstr "неправильный ключ в запросе на отмену процесса %d" -#: postmaster/postmaster.c:2436 +#: postmaster/postmaster.c:2456 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "процесс с кодом %d, полученным в запросе на отмену, не найден" -#: postmaster/postmaster.c:2689 +#: postmaster/postmaster.c:2710 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "получен SIGHUP, файлы конфигурации перезагружаются" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2715 postmaster/postmaster.c:2719 +#: postmaster/postmaster.c:2736 postmaster/postmaster.c:2740 #, c-format msgid "%s was not reloaded" msgstr "%s не был перезагружен" -#: postmaster/postmaster.c:2729 +#: postmaster/postmaster.c:2750 #, c-format msgid "SSL configuration was not reloaded" msgstr "конфигурация SSL не была перезагружена" -#: postmaster/postmaster.c:2785 +#: postmaster/postmaster.c:2806 #, c-format msgid "received smart shutdown request" msgstr "получен запрос на \"вежливое\" выключение" -#: postmaster/postmaster.c:2831 +#: postmaster/postmaster.c:2852 #, c-format msgid "received fast shutdown request" msgstr "получен запрос на быстрое выключение" -#: postmaster/postmaster.c:2849 +#: postmaster/postmaster.c:2870 #, c-format msgid "aborting any active transactions" msgstr "прерывание всех активных транзакций" -#: postmaster/postmaster.c:2873 +#: postmaster/postmaster.c:2894 #, c-format msgid "received immediate shutdown request" msgstr "получен запрос на немедленное выключение" -#: postmaster/postmaster.c:2948 +#: postmaster/postmaster.c:2971 #, c-format msgid "shutdown at recovery target" msgstr "выключение при достижении цели восстановления" -#: postmaster/postmaster.c:2966 postmaster/postmaster.c:3002 +#: postmaster/postmaster.c:2989 postmaster/postmaster.c:3025 msgid "startup process" msgstr "стартовый процесс" -#: postmaster/postmaster.c:2969 +#: postmaster/postmaster.c:2992 #, c-format msgid "aborting startup due to startup process failure" msgstr "прерывание запуска из-за ошибки в стартовом процессе" -#: postmaster/postmaster.c:3044 +#: postmaster/postmaster.c:3067 #, c-format msgid "database system is ready to accept connections" msgstr "система БД готова принимать подключения" -#: postmaster/postmaster.c:3065 +#: postmaster/postmaster.c:3088 msgid "background writer process" msgstr "процесс фоновой записи" -#: postmaster/postmaster.c:3119 +#: postmaster/postmaster.c:3142 msgid "checkpointer process" msgstr "процесс контрольных точек" -#: postmaster/postmaster.c:3135 +#: postmaster/postmaster.c:3158 msgid "WAL writer process" msgstr "процесс записи WAL" -#: postmaster/postmaster.c:3150 +#: postmaster/postmaster.c:3173 msgid "WAL receiver process" msgstr "процесс считывания WAL" -#: postmaster/postmaster.c:3165 +#: postmaster/postmaster.c:3188 msgid "autovacuum launcher process" msgstr "процесс запуска автоочистки" -#: postmaster/postmaster.c:3180 +#: postmaster/postmaster.c:3206 msgid "archiver process" msgstr "процесс архивации" -#: postmaster/postmaster.c:3196 +#: postmaster/postmaster.c:3221 msgid "statistics collector process" msgstr "процесс сбора статистики" -#: postmaster/postmaster.c:3210 +#: postmaster/postmaster.c:3235 msgid "system logger process" msgstr "процесс системного протоколирования" -#: postmaster/postmaster.c:3274 +#: postmaster/postmaster.c:3299 #, c-format msgid "background worker \"%s\"" msgstr "фоновый процесс \"%s\"" -#: postmaster/postmaster.c:3358 postmaster/postmaster.c:3378 -#: postmaster/postmaster.c:3385 postmaster/postmaster.c:3403 +#: postmaster/postmaster.c:3383 postmaster/postmaster.c:3403 +#: postmaster/postmaster.c:3410 postmaster/postmaster.c:3428 msgid "server process" msgstr "процесс сервера" -#: postmaster/postmaster.c:3457 +#: postmaster/postmaster.c:3482 #, c-format msgid "terminating any other active server processes" msgstr "завершение всех остальных активных серверных процессов" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3712 +#: postmaster/postmaster.c:3735 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) завершился с кодом выхода %d" -#: postmaster/postmaster.c:3714 postmaster/postmaster.c:3726 -#: postmaster/postmaster.c:3736 postmaster/postmaster.c:3747 +#: postmaster/postmaster.c:3737 postmaster/postmaster.c:3749 +#: postmaster/postmaster.c:3759 postmaster/postmaster.c:3770 #, c-format msgid "Failed process was running: %s" msgstr "Завершившийся процесс выполнял действие: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3723 +#: postmaster/postmaster.c:3746 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) был прерван исключением 0x%X" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3733 +#: postmaster/postmaster.c:3756 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) был завершён по сигналу %d: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3745 +#: postmaster/postmaster.c:3768 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) завершился с неизвестным кодом состояния %d" -#: postmaster/postmaster.c:3960 +#: postmaster/postmaster.c:3982 #, c-format msgid "abnormal database system shutdown" msgstr "аварийное выключение системы БД" -#: postmaster/postmaster.c:4000 +#: postmaster/postmaster.c:4020 +#, c-format +msgid "shutting down due to startup process failure" +msgstr "сервер останавливается из-за ошибки в стартовом процессе" + +#: postmaster/postmaster.c:4026 +#, c-format +msgid "shutting down because restart_after_crash is off" +msgstr "сервер останавливается, так как параметр restart_after_crash равен off" + +#: postmaster/postmaster.c:4038 #, c-format msgid "all server processes terminated; reinitializing" msgstr "все серверные процессы завершены... переинициализация" -#: postmaster/postmaster.c:4170 postmaster/postmaster.c:5579 -#: postmaster/postmaster.c:5966 +#: postmaster/postmaster.c:4212 postmaster/postmaster.c:5571 +#: postmaster/postmaster.c:5962 #, c-format msgid "could not generate random cancel key" msgstr "не удалось сгенерировать случайный ключ отмены" -#: postmaster/postmaster.c:4224 +#: postmaster/postmaster.c:4266 #, c-format msgid "could not fork new process for connection: %m" msgstr "породить новый процесс для соединения не удалось: %m" -#: postmaster/postmaster.c:4266 +#: postmaster/postmaster.c:4308 msgid "could not fork new process for connection: " msgstr "породить новый процесс для соединения не удалось: " -#: postmaster/postmaster.c:4383 +#: postmaster/postmaster.c:4414 #, c-format msgid "connection received: host=%s port=%s" msgstr "принято подключение: узел=%s порт=%s" -#: postmaster/postmaster.c:4388 +#: postmaster/postmaster.c:4419 #, c-format msgid "connection received: host=%s" msgstr "принято подключение: узел=%s" -#: postmaster/postmaster.c:4658 +#: postmaster/postmaster.c:4662 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "запустить серверный процесс \"%s\" не удалось: %m" -#: postmaster/postmaster.c:4817 +#: postmaster/postmaster.c:4720 +#, c-format +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "" +"создать отображение файла серверных параметров не удалось (код ошибки: %lu)" + +#: postmaster/postmaster.c:4729 +#, c-format +msgid "could not map backend parameter memory: error code %lu" +msgstr "" +"отобразить файл серверных параметров в память не удалось (код ошибки: %lu)" + +#: postmaster/postmaster.c:4756 +#, c-format +msgid "subprocess command line too long" +msgstr "слишком длинная командная строка подпроцесса" + +#: postmaster/postmaster.c:4774 +#, c-format +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "ошибка в CreateProcess(): %m (код ошибки: %lu)" + +#: postmaster/postmaster.c:4801 +#, c-format +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "" +"отключить отображение файла серверных параметров не удалось (код ошибки: %lu)" + +#: postmaster/postmaster.c:4805 +#, c-format +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "" +"закрыть указатель файла серверных параметров не удалось (код ошибки: %lu)" + +#: postmaster/postmaster.c:4827 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "" "число повторных попыток резервирования разделяемой памяти достигло предела" -#: postmaster/postmaster.c:4818 +#: postmaster/postmaster.c:4828 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "Это может быть вызвано антивирусным ПО или механизмом ASLR." -#: postmaster/postmaster.c:5012 +#: postmaster/postmaster.c:5018 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "не удалось загрузить конфигурацию SSL в дочерний процесс" @@ -19495,116 +20382,116 @@ msgstr "Пожалуйста, напишите об этой ошибке по #: postmaster/postmaster.c:5231 #, c-format -msgid "database system is ready to accept read only connections" -msgstr "система БД готова к подключениям в режиме \"только чтение\"" +msgid "database system is ready to accept read-only connections" +msgstr "система БД готова принимать подключения в режиме \"только чтение\"" -#: postmaster/postmaster.c:5507 +#: postmaster/postmaster.c:5495 #, c-format msgid "could not fork startup process: %m" msgstr "породить стартовый процесс не удалось: %m" -#: postmaster/postmaster.c:5511 +#: postmaster/postmaster.c:5499 +#, c-format +msgid "could not fork archiver process: %m" +msgstr "породить процесс архиватора не удалось: %m" + +#: postmaster/postmaster.c:5503 #, c-format msgid "could not fork background writer process: %m" msgstr "породить процесс фоновой записи не удалось: %m" -#: postmaster/postmaster.c:5515 +#: postmaster/postmaster.c:5507 #, c-format msgid "could not fork checkpointer process: %m" msgstr "породить процесс контрольных точек не удалось: %m" -#: postmaster/postmaster.c:5519 +#: postmaster/postmaster.c:5511 #, c-format msgid "could not fork WAL writer process: %m" msgstr "породить процесс записи WAL не удалось: %m" -#: postmaster/postmaster.c:5523 +#: postmaster/postmaster.c:5515 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "породить процесс считывания WAL не удалось: %m" -#: postmaster/postmaster.c:5527 +#: postmaster/postmaster.c:5519 #, c-format msgid "could not fork process: %m" msgstr "породить процесс не удалось: %m" -#: postmaster/postmaster.c:5724 postmaster/postmaster.c:5747 +#: postmaster/postmaster.c:5720 postmaster/postmaster.c:5743 #, c-format msgid "database connection requirement not indicated during registration" msgstr "" "при регистрации фонового процесса не указывалось, что ему требуется " "подключение к БД" -#: postmaster/postmaster.c:5731 postmaster/postmaster.c:5754 +#: postmaster/postmaster.c:5727 postmaster/postmaster.c:5750 #, c-format msgid "invalid processing mode in background worker" msgstr "неправильный режим обработки в фоновом процессе" -#: postmaster/postmaster.c:5827 -#, c-format -msgid "starting background worker process \"%s\"" -msgstr "запуск фонового рабочего процесса \"%s\"" - -#: postmaster/postmaster.c:5839 +#: postmaster/postmaster.c:5835 #, c-format msgid "could not fork worker process: %m" msgstr "породить рабочий процесс не удалось: %m" -#: postmaster/postmaster.c:5952 +#: postmaster/postmaster.c:5948 #, c-format msgid "no slot available for new worker process" msgstr "для нового рабочего процесса не нашлось свободного слота" -#: postmaster/postmaster.c:6287 +#: postmaster/postmaster.c:6282 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "" "продублировать сокет %d для серверного процесса не удалось (код ошибки: %d)" -#: postmaster/postmaster.c:6319 +#: postmaster/postmaster.c:6314 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "создать наследуемый сокет не удалось (код ошибки: %d)\n" -#: postmaster/postmaster.c:6348 +#: postmaster/postmaster.c:6343 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "открыть файл серверных переменных \"%s\" не удалось: %s\n" -#: postmaster/postmaster.c:6355 +#: postmaster/postmaster.c:6350 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "прочитать файл серверных переменных \"%s\" не удалось: %s\n" -#: postmaster/postmaster.c:6364 +#: postmaster/postmaster.c:6359 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "не удалось стереть файл \"%s\": %s\n" -#: postmaster/postmaster.c:6381 +#: postmaster/postmaster.c:6376 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "отобразить файл серверных переменных не удалось (код ошибки: %lu)\n" -#: postmaster/postmaster.c:6390 +#: postmaster/postmaster.c:6385 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "" "отключить отображение файла серверных переменных не удалось (код ошибки: " "%lu)\n" -#: postmaster/postmaster.c:6397 +#: postmaster/postmaster.c:6392 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "" "закрыть указатель файла серверных переменных не удалось (код ошибки: %lu)\n" -#: postmaster/postmaster.c:6575 +#: postmaster/postmaster.c:6569 #, c-format msgid "could not read exit code for process\n" msgstr "прочитать код завершения процесса не удалось\n" -#: postmaster/postmaster.c:6580 +#: postmaster/postmaster.c:6574 #, c-format msgid "could not post child completion status\n" msgstr "отправить состояние завершения потомка не удалось\n" @@ -19614,11 +20501,6 @@ msgstr "отправить состояние завершения потомк msgid "could not read from logger pipe: %m" msgstr "не удалось прочитать из канала протоколирования: %m" -#: postmaster/syslogger.c:522 -#, c-format -msgid "logger shutting down" -msgstr "остановка протоколирования" - #: postmaster/syslogger.c:571 postmaster/syslogger.c:585 #, c-format msgid "could not create pipe for syslog: %m" @@ -19678,60 +20560,55 @@ msgstr "" "недетерминированные правила сортировки не поддерживаются для регулярных " "выражений" -#: replication/backup_manifest.c:236 +#: replication/backup_manifest.c:251 #, c-format msgid "expected end timeline %u but found timeline %u" msgstr "ожидался конец линии времени %u, но обнаружена линия времени %u" -#: replication/backup_manifest.c:253 +#: replication/backup_manifest.c:275 #, c-format msgid "expected start timeline %u but found timeline %u" msgstr "ожидалось начало линии времени %u, но обнаружена линия времени %u" -#: replication/backup_manifest.c:280 +#: replication/backup_manifest.c:302 #, c-format msgid "start timeline %u not found in history of timeline %u" msgstr "начальная линия времени %u не найдена в истории линии времени %u" -#: replication/backup_manifest.c:327 +#: replication/backup_manifest.c:353 #, c-format msgid "could not rewind temporary file" msgstr "не удалось переместиться во временном файле" -#: replication/backup_manifest.c:354 +#: replication/backup_manifest.c:380 #, c-format msgid "could not read from temporary file: %m" msgstr "не удалось прочитать из временного файла: %m" -#: replication/basebackup.c:108 -#, c-format -msgid "could not read from file \"%s\"" -msgstr "не удалось прочитать файл \"%s\"" - -#: replication/basebackup.c:551 +#: replication/basebackup.c:546 #, c-format msgid "could not find any WAL files" msgstr "не удалось найти ни одного файла WAL" -#: replication/basebackup.c:566 replication/basebackup.c:582 -#: replication/basebackup.c:591 +#: replication/basebackup.c:561 replication/basebackup.c:577 +#: replication/basebackup.c:586 #, c-format msgid "could not find WAL file \"%s\"" msgstr "не удалось найти файл WAL \"%s\"" -#: replication/basebackup.c:634 replication/basebackup.c:665 +#: replication/basebackup.c:629 replication/basebackup.c:659 #, c-format msgid "unexpected WAL file size \"%s\"" msgstr "неприемлемый размер файла WAL \"%s\"" -#: replication/basebackup.c:648 replication/basebackup.c:1752 +#: replication/basebackup.c:644 replication/basebackup.c:1771 #, c-format msgid "base backup could not send data, aborting backup" msgstr "" "в процессе базового резервного копирования не удалось передать данные, " "копирование прерывается" -#: replication/basebackup.c:724 +#: replication/basebackup.c:722 #, c-format msgid "%lld total checksum verification failure" msgid_plural "%lld total checksum verification failures" @@ -19739,86 +20616,76 @@ msgstr[0] "всего ошибок контрольных сумм: %lld" msgstr[1] "всего ошибок контрольных сумм: %lld" msgstr[2] "всего ошибок контрольных сумм: %lld" -#: replication/basebackup.c:731 +#: replication/basebackup.c:729 #, c-format msgid "checksum verification failure during base backup" msgstr "при базовом резервном копировании выявлены ошибки контрольных сумм" -#: replication/basebackup.c:784 replication/basebackup.c:793 -#: replication/basebackup.c:802 replication/basebackup.c:811 -#: replication/basebackup.c:820 replication/basebackup.c:831 -#: replication/basebackup.c:848 replication/basebackup.c:857 -#: replication/basebackup.c:869 replication/basebackup.c:893 +#: replication/basebackup.c:789 replication/basebackup.c:798 +#: replication/basebackup.c:807 replication/basebackup.c:816 +#: replication/basebackup.c:825 replication/basebackup.c:836 +#: replication/basebackup.c:853 replication/basebackup.c:862 +#: replication/basebackup.c:874 replication/basebackup.c:898 #, c-format msgid "duplicate option \"%s\"" msgstr "повторяющийся параметр \"%s\"" -#: replication/basebackup.c:837 +#: replication/basebackup.c:842 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d вне диапазона, допустимого для параметра \"%s\" (%d .. %d)" -#: replication/basebackup.c:882 +#: replication/basebackup.c:887 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "нераспознанный параметр в манифесте: \"%s\"" -#: replication/basebackup.c:898 +#: replication/basebackup.c:903 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "нераспознанный алгоритм расчёта контрольных сумм: \"%s\"" -#: replication/basebackup.c:913 +#: replication/basebackup.c:918 #, c-format msgid "manifest checksums require a backup manifest" msgstr "контрольные суммы не могут рассчитываться без манифеста копии" -#: replication/basebackup.c:1504 +#: replication/basebackup.c:1519 #, c-format msgid "skipping special file \"%s\"" msgstr "специальный файл \"%s\" пропускается" -#: replication/basebackup.c:1623 +#: replication/basebackup.c:1640 #, c-format msgid "invalid segment number %d in file \"%s\"" msgstr "неверный номер сегмента %d в файле \"%s\"" -#: replication/basebackup.c:1642 +#: replication/basebackup.c:1678 #, c-format msgid "" -"could not verify checksum in file \"%s\", block %d: read buffer size %d and " +"could not verify checksum in file \"%s\", block %u: read buffer size %d and " "page size %d differ" msgstr "" -"не удалось проверить контрольную сумму в файле \"%s\", блоке %d: размер " +"не удалось проверить контрольную сумму в файле \"%s\", блоке %u: размер " "прочитанного буфера (%d) отличается от размера страницы (%d)" -#: replication/basebackup.c:1686 replication/basebackup.c:1716 -#, c-format -msgid "could not fseek in file \"%s\": %m" -msgstr "не удалось переместиться в файле \"%s\": %m" - -#: replication/basebackup.c:1708 -#, c-format -msgid "could not reread block %d of file \"%s\": %m" -msgstr "не удалось заново прочитать блок %d файла \"%s\": %m" - -#: replication/basebackup.c:1732 +#: replication/basebackup.c:1751 #, c-format msgid "" -"checksum verification failed in file \"%s\", block %d: calculated %X but " +"checksum verification failed in file \"%s\", block %u: calculated %X but " "expected %X" msgstr "" -"ошибка контрольной суммы в файле \"%s\", блоке %d: вычислено значение %X, но " +"ошибка контрольной суммы в файле \"%s\", блоке %u: вычислено значение %X, но " "ожидалось %X" -#: replication/basebackup.c:1739 +#: replication/basebackup.c:1758 #, c-format msgid "" "further checksum verification failures in file \"%s\" will not be reported" msgstr "" "о дальнейших ошибках контрольных сумм в файле \"%s\" сообщаться не будет" -#: replication/basebackup.c:1807 +#: replication/basebackup.c:1816 #, c-format msgid "file \"%s\" has a total of %d checksum verification failure" msgid_plural "file \"%s\" has a total of %d checksum verification failures" @@ -19826,12 +20693,12 @@ msgstr[0] "всего в файле \"%s\" обнаружено ошибок к msgstr[1] "всего в файле \"%s\" обнаружено ошибок контрольных сумм: %d" msgstr[2] "всего в файле \"%s\" обнаружено ошибок контрольных сумм: %d" -#: replication/basebackup.c:1843 +#: replication/basebackup.c:1852 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "слишком длинное имя файла для формата tar: \"%s\"" -#: replication/basebackup.c:1848 +#: replication/basebackup.c:1857 #, c-format msgid "" "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" @@ -19844,17 +20711,17 @@ msgstr "" msgid "could not clear search path: %s" msgstr "не удалось очистить путь поиска: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:251 +#: replication/libpqwalreceiver/libpqwalreceiver.c:256 #, c-format msgid "invalid connection string syntax: %s" msgstr "ошибочный синтаксис строки подключения: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:275 +#: replication/libpqwalreceiver/libpqwalreceiver.c:282 #, c-format msgid "could not parse connection string: %s" msgstr "не удалось разобрать строку подключения: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:347 +#: replication/libpqwalreceiver/libpqwalreceiver.c:355 #, c-format msgid "" "could not receive database system identifier and timeline ID from the " @@ -19863,13 +20730,13 @@ msgstr "" "не удалось получить идентификатор СУБД и код линии времени с главного " "сервера: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:358 -#: replication/libpqwalreceiver/libpqwalreceiver.c:576 +#: replication/libpqwalreceiver/libpqwalreceiver.c:367 +#: replication/libpqwalreceiver/libpqwalreceiver.c:601 #, c-format msgid "invalid response from primary server" msgstr "неверный ответ главного сервера" -#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#: replication/libpqwalreceiver/libpqwalreceiver.c:368 #, c-format msgid "" "Could not identify system: got %d rows and %d fields, expected %d rows and " @@ -19878,125 +20745,123 @@ msgstr "" "Не удалось идентифицировать систему, получено строк: %d, полей: %d " "(ожидалось: %d и %d (или более))." -#: replication/libpqwalreceiver/libpqwalreceiver.c:432 -#: replication/libpqwalreceiver/libpqwalreceiver.c:438 -#: replication/libpqwalreceiver/libpqwalreceiver.c:463 +#: replication/libpqwalreceiver/libpqwalreceiver.c:444 +#: replication/libpqwalreceiver/libpqwalreceiver.c:451 +#: replication/libpqwalreceiver/libpqwalreceiver.c:481 #, c-format msgid "could not start WAL streaming: %s" msgstr "не удалось начать трансляцию WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:486 +#: replication/libpqwalreceiver/libpqwalreceiver.c:505 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "не удалось отправить главному серверу сообщение о конце передачи: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:508 +#: replication/libpqwalreceiver/libpqwalreceiver.c:528 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "неожиданный набор данных после конца передачи" -#: replication/libpqwalreceiver/libpqwalreceiver.c:522 +#: replication/libpqwalreceiver/libpqwalreceiver.c:543 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "ошибка при остановке потоковой операции COPY: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:531 +#: replication/libpqwalreceiver/libpqwalreceiver.c:553 #, c-format msgid "error reading result of streaming command: %s" msgstr "ошибка при чтении результата команды передачи: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:539 -#: replication/libpqwalreceiver/libpqwalreceiver.c:773 +#: replication/libpqwalreceiver/libpqwalreceiver.c:562 +#: replication/libpqwalreceiver/libpqwalreceiver.c:800 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "неожиданный результат после CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:565 +#: replication/libpqwalreceiver/libpqwalreceiver.c:589 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "не удалось получить файл истории линии времени с главного сервера: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:577 +#: replication/libpqwalreceiver/libpqwalreceiver.c:602 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "Ожидался 1 кортеж с 2 полями, однако получено кортежей: %d, полей: %d." -#: replication/libpqwalreceiver/libpqwalreceiver.c:737 -#: replication/libpqwalreceiver/libpqwalreceiver.c:788 -#: replication/libpqwalreceiver/libpqwalreceiver.c:794 +#: replication/libpqwalreceiver/libpqwalreceiver.c:763 +#: replication/libpqwalreceiver/libpqwalreceiver.c:816 +#: replication/libpqwalreceiver/libpqwalreceiver.c:823 #, c-format msgid "could not receive data from WAL stream: %s" -msgstr "не удалось извлечь данные из потока WAL: %s" +msgstr "не удалось получить данные из потока WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:813 +#: replication/libpqwalreceiver/libpqwalreceiver.c:843 #, c-format msgid "could not send data to WAL stream: %s" msgstr "не удалось отправить данные в поток WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:866 +#: replication/libpqwalreceiver/libpqwalreceiver.c:897 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "не удалось создать слот репликации \"%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:911 +#: replication/libpqwalreceiver/libpqwalreceiver.c:943 #, c-format msgid "invalid query response" msgstr "неверный ответ на запрос" -#: replication/libpqwalreceiver/libpqwalreceiver.c:912 +#: replication/libpqwalreceiver/libpqwalreceiver.c:944 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Ожидалось полей: %d, получено: %d." -#: replication/libpqwalreceiver/libpqwalreceiver.c:981 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1014 #, c-format msgid "the query interface requires a database connection" msgstr "для интерфейса запросов требуется подключение к БД" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1012 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1045 msgid "empty query" msgstr "пустой запрос" -#: replication/logical/launcher.c:295 -#, c-format -msgid "starting logical replication worker for subscription \"%s\"" -msgstr "" -"запускается процесс-обработчик логической репликации для подписки \"%s\"" +#: replication/libpqwalreceiver/libpqwalreceiver.c:1051 +msgid "unexpected pipeline mode" +msgstr "неожиданный режим канала" -#: replication/logical/launcher.c:302 +#: replication/logical/launcher.c:286 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "" "нельзя запустить процессы-обработчики логической репликации при " "max_replication_slots = 0" -#: replication/logical/launcher.c:382 +#: replication/logical/launcher.c:366 #, c-format msgid "out of logical replication worker slots" msgstr "недостаточно слотов для процессов логической репликации" -#: replication/logical/launcher.c:383 +#: replication/logical/launcher.c:367 #, c-format msgid "You might need to increase max_logical_replication_workers." msgstr "Возможно, следует увеличить параметр max_logical_replication_workers." -#: replication/logical/launcher.c:438 +#: replication/logical/launcher.c:422 #, c-format msgid "out of background worker slots" msgstr "недостаточно слотов для фоновых рабочих процессов" -#: replication/logical/launcher.c:439 +#: replication/logical/launcher.c:423 #, c-format msgid "You might need to increase max_worker_processes." msgstr "Возможно, следует увеличить параметр max_worker_processes." -#: replication/logical/launcher.c:638 +#: replication/logical/launcher.c:577 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "" "слот обработчика логической репликации %d пуст, подключиться к нему нельзя" -#: replication/logical/launcher.c:647 +#: replication/logical/launcher.c:586 #, c-format msgid "" "logical replication worker slot %d is already used by another worker, cannot " @@ -20005,38 +20870,33 @@ msgstr "" "слот обработчика логической репликации %d уже занят другим процессом, " "подключиться к нему нельзя" -#: replication/logical/launcher.c:951 -#, c-format -msgid "logical replication launcher started" -msgstr "процесс запуска логической репликации запущен" - -#: replication/logical/logical.c:87 +#: replication/logical/logical.c:115 #, c-format msgid "logical decoding requires wal_level >= logical" msgstr "для логического декодирования требуется wal_level >= logical" -#: replication/logical/logical.c:92 +#: replication/logical/logical.c:120 #, c-format msgid "logical decoding requires a database connection" msgstr "для логического декодирования требуется подключение к БД" -#: replication/logical/logical.c:110 +#: replication/logical/logical.c:138 #, c-format msgid "logical decoding cannot be used while in recovery" msgstr "логическое декодирование нельзя использовать в процессе восстановления" -#: replication/logical/logical.c:258 replication/logical/logical.c:399 +#: replication/logical/logical.c:347 replication/logical/logical.c:499 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "" "физический слот репликации нельзя использовать для логического декодирования" -#: replication/logical/logical.c:263 replication/logical/logical.c:404 +#: replication/logical/logical.c:352 replication/logical/logical.c:504 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "слот репликации \"%s\" создан не в этой базе данных" -#: replication/logical/logical.c:270 +#: replication/logical/logical.c:359 #, c-format msgid "" "cannot create logical replication slot in transaction that has performed " @@ -20044,28 +20904,48 @@ msgid "" msgstr "" "нельзя создать слот логической репликации в транзакции, осуществляющей запись" -#: replication/logical/logical.c:444 +#: replication/logical/logical.c:549 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "начинается логическое декодирование для слота \"%s\"" -#: replication/logical/logical.c:446 +#: replication/logical/logical.c:551 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Передача транзакций, фиксируемых после %X/%X, чтение WAL с %X/%X." -#: replication/logical/logical.c:593 +#: replication/logical/logical.c:696 #, c-format msgid "" "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "" "слот \"%s\", модуль вывода \"%s\", в обработчике %s, связанный LSN: %X/%X" -#: replication/logical/logical.c:600 +#: replication/logical/logical.c:702 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "слот \"%s\", модуль вывода \"%s\", в обработчике %s" +#: replication/logical/logical.c:868 replication/logical/logical.c:912 +#: replication/logical/logical.c:956 replication/logical/logical.c:1001 +#, c-format +msgid "logical replication at prepare time requires a %s callback" +msgstr "для логической репликации во время подготовки требуется обработчик %s" + +#: replication/logical/logical.c:1224 replication/logical/logical.c:1271 +#: replication/logical/logical.c:1311 replication/logical/logical.c:1395 +#: replication/logical/logical.c:1442 +#, c-format +msgid "logical streaming requires a %s callback" +msgstr "для логической потоковой репликации требуется обработчик %s" + +#: replication/logical/logical.c:1355 +#, c-format +msgid "logical streaming at prepare time requires a %s callback" +msgstr "" +"для логической потоковой репликации во время подготовки требуется обработчик " +"%s" + #: replication/logical/logicalfuncs.c:104 replication/slotfuncs.c:34 #, c-format msgid "must be superuser or replication role to use replication slots" @@ -20104,9 +20984,10 @@ msgstr "в массиве должно быть чётное число элем msgid "can no longer get changes from replication slot \"%s\"" msgstr "из слота репликации \"%s\" больше нельзя получать изменения" -#: replication/logical/logicalfuncs.c:253 replication/slotfuncs.c:648 +#: replication/logical/logicalfuncs.c:253 replication/slotfuncs.c:650 #, c-format -msgid "This slot has never previously reserved WAL, or has been invalidated." +msgid "" +"This slot has never previously reserved WAL, or it has been invalidated." msgstr "Для этого слота ранее не резервировался WAL либо слот был аннулирован." #: replication/logical/logicalfuncs.c:265 @@ -20120,72 +21001,70 @@ msgstr "" #: replication/logical/origin.c:188 #, c-format -msgid "only superusers can query or manipulate replication origins" -msgstr "" -"запрашивать или модифицировать источники репликации могут только " -"суперпользователи" - -#: replication/logical/origin.c:193 -#, c-format msgid "" "cannot query or manipulate replication origin when max_replication_slots = 0" msgstr "" "запрашивать или модифицировать источники репликации при " "max_replication_slots = 0 нельзя" -#: replication/logical/origin.c:198 +#: replication/logical/origin.c:193 #, c-format msgid "cannot manipulate replication origins during recovery" msgstr "модифицировать источники репликации во время восстановления нельзя" -#: replication/logical/origin.c:233 +#: replication/logical/origin.c:228 #, c-format msgid "replication origin \"%s\" does not exist" msgstr "источник репликации \"%s\" не существует" -#: replication/logical/origin.c:324 +#: replication/logical/origin.c:319 #, c-format msgid "could not find free replication origin OID" msgstr "найти свободный OID для источника репликации не удалось" -#: replication/logical/origin.c:372 +#: replication/logical/origin.c:355 #, c-format msgid "could not drop replication origin with OID %d, in use by PID %d" msgstr "" "удалить источник репликации с OID %d нельзя, он используется процессом с PID " "%d" -#: replication/logical/origin.c:464 +#: replication/logical/origin.c:476 #, c-format msgid "replication origin with OID %u does not exist" msgstr "источник репликации с OID %u не существует" -#: replication/logical/origin.c:729 +#: replication/logical/origin.c:741 #, c-format msgid "replication checkpoint has wrong magic %u instead of %u" msgstr "" "контрольная точка репликации имеет неправильную сигнатуру (%u вместо %u)" -#: replication/logical/origin.c:770 +#: replication/logical/origin.c:782 #, c-format msgid "could not find free replication state, increase max_replication_slots" msgstr "" "не удалось найти свободную ячейку для состояния репликации, увеличьте " "max_replication_slots" -#: replication/logical/origin.c:788 +#: replication/logical/origin.c:790 +#, c-format +msgid "recovered replication state of node %u to %X/%X" +msgstr "состояние репликации узла %u восстановлено до %X/%X" + +#: replication/logical/origin.c:800 #, c-format msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "" "неверная контрольная сумма файла контрольной точки для слота репликации (%u " "вместо %u)" -#: replication/logical/origin.c:916 replication/logical/origin.c:1102 +#: replication/logical/origin.c:928 replication/logical/origin.c:1114 #, c-format msgid "replication origin with OID %d is already active for PID %d" msgstr "источник репликации с OID %d уже занят процессом с PID %d" -#: replication/logical/origin.c:927 replication/logical/origin.c:1114 +#: replication/logical/origin.c:939 replication/logical/origin.c:1126 #, c-format msgid "" "could not find free replication state slot for replication origin with OID %u" @@ -20193,48 +21072,67 @@ msgstr "" "не удалось найти свободный слот состояния репликации для источника " "репликации с OID %u" -#: replication/logical/origin.c:929 replication/logical/origin.c:1116 -#: replication/slot.c:1762 +#: replication/logical/origin.c:941 replication/logical/origin.c:1128 +#: replication/slot.c:1860 #, c-format msgid "Increase max_replication_slots and try again." msgstr "Увеличьте параметр max_replication_slots и повторите попытку." -#: replication/logical/origin.c:1073 +#: replication/logical/origin.c:1085 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "нельзя настроить источник репликации, когда он уже настроен" -#: replication/logical/origin.c:1153 replication/logical/origin.c:1369 -#: replication/logical/origin.c:1389 +#: replication/logical/origin.c:1165 replication/logical/origin.c:1377 +#: replication/logical/origin.c:1397 #, c-format msgid "no replication origin is configured" msgstr "ни один источник репликации не настроен" -#: replication/logical/origin.c:1236 +#: replication/logical/origin.c:1248 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "имя источника репликации \"%s\" зарезервировано" -#: replication/logical/origin.c:1238 +#: replication/logical/origin.c:1250 #, c-format msgid "Origin names starting with \"pg_\" are reserved." msgstr "Имена источников, начинающиеся с \"pg_\", зарезервированы." -#: replication/logical/relation.c:302 +#: replication/logical/relation.c:234 #, c-format -msgid "logical replication target relation \"%s.%s\" does not exist" -msgstr "целевое отношение логической репликации \"%s.%s\" не существует" +msgid "\"%s\"" +msgstr "\"%s\"" + +#: replication/logical/relation.c:237 +#, c-format +msgid ", \"%s\"" +msgstr ", \"%s\"" -#: replication/logical/relation.c:345 +#: replication/logical/relation.c:243 #, c-format msgid "" -"logical replication target relation \"%s.%s\" is missing some replicated " -"columns" -msgstr "" -"в целевом отношении логической репликации (\"%s.%s\") отсутствуют некоторые " -"реплицируемые столбцы" +"logical replication target relation \"%s.%s\" is missing replicated column: " +"%s" +msgid_plural "" +"logical replication target relation \"%s.%s\" is missing replicated columns: " +"%s" +msgstr[0] "" +"в целевом отношении логической репликации (\"%s.%s\") отсутствуют " +"реплицируемые столбцы: %s" +msgstr[1] "" +"в целевом отношении логической репликации (\"%s.%s\") отсутствуют " +"реплицируемые столбцы: %s" +msgstr[2] "" +"в целевом отношении логической репликации (\"%s.%s\") отсутствуют " +"реплицируемые столбцы: %s" -#: replication/logical/relation.c:385 +#: replication/logical/relation.c:323 +#, c-format +msgid "logical replication target relation \"%s.%s\" does not exist" +msgstr "целевое отношение логической репликации \"%s.%s\" не существует" + +#: replication/logical/relation.c:404 #, c-format msgid "" "logical replication target relation \"%s.%s\" uses system columns in REPLICA " @@ -20243,19 +21141,19 @@ msgstr "" "в целевом отношении логической репликации (\"%s.%s\") в индексе REPLICA " "IDENTITY используются системные столбцы" -#: replication/logical/reorderbuffer.c:2663 +#: replication/logical/reorderbuffer.c:3802 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "не удалось записать в файл данных для XID %u: %m" -#: replication/logical/reorderbuffer.c:2850 -#: replication/logical/reorderbuffer.c:2875 +#: replication/logical/reorderbuffer.c:4146 +#: replication/logical/reorderbuffer.c:4171 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "не удалось прочитать из файла подкачки буфера пересортировки: %m" -#: replication/logical/reorderbuffer.c:2854 -#: replication/logical/reorderbuffer.c:2879 +#: replication/logical/reorderbuffer.c:4150 +#: replication/logical/reorderbuffer.c:4175 #, c-format msgid "" "could not read from reorderbuffer spill file: read %d instead of %u bytes" @@ -20263,25 +21161,25 @@ msgstr "" "не удалось прочитать из файла подкачки буфера пересортировки (прочитано " "байт: %d, требовалось: %u)" -#: replication/logical/reorderbuffer.c:3114 +#: replication/logical/reorderbuffer.c:4425 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "" "ошибка при удалении файла \"%s\" в процессе удаления pg_replslot/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:3606 +#: replication/logical/reorderbuffer.c:4924 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "" "не удалось прочитать из файла \"%s\" (прочитано байт: %d, требовалось: %d)" -#: replication/logical/snapbuild.c:606 +#: replication/logical/snapbuild.c:588 #, c-format msgid "initial slot snapshot too large" msgstr "изначальный снимок слота слишком большой" # skip-rule: capital-letter-first -#: replication/logical/snapbuild.c:660 +#: replication/logical/snapbuild.c:642 #, c-format msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "" @@ -20293,68 +21191,68 @@ msgstr[1] "" msgstr[2] "" "экспортирован снимок логического декодирования: \"%s\" (ид. транзакций: %u)" -#: replication/logical/snapbuild.c:1265 replication/logical/snapbuild.c:1358 -#: replication/logical/snapbuild.c:1915 +#: replication/logical/snapbuild.c:1270 replication/logical/snapbuild.c:1363 +#: replication/logical/snapbuild.c:1894 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "процесс логического декодирования достиг точки согласованности в %X/%X" -#: replication/logical/snapbuild.c:1267 +#: replication/logical/snapbuild.c:1272 #, c-format msgid "There are no running transactions." msgstr "Больше активных транзакций нет." -#: replication/logical/snapbuild.c:1309 +#: replication/logical/snapbuild.c:1314 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "" "процесс логического декодирования нашёл начальную стартовую точку в %X/%X" -#: replication/logical/snapbuild.c:1311 replication/logical/snapbuild.c:1335 +#: replication/logical/snapbuild.c:1316 replication/logical/snapbuild.c:1340 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "Ожидание транзакций (примерно %d), старее %u до конца." -#: replication/logical/snapbuild.c:1333 +#: replication/logical/snapbuild.c:1338 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "" "при логическом декодировании найдена начальная точка согласованности в %X/%X" -#: replication/logical/snapbuild.c:1360 +#: replication/logical/snapbuild.c:1365 #, c-format msgid "There are no old transactions anymore." msgstr "Больше старых транзакций нет." -#: replication/logical/snapbuild.c:1757 +#: replication/logical/snapbuild.c:1762 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "" "файл состояния snapbuild \"%s\" имеет неправильную сигнатуру (%u вместо %u)" -#: replication/logical/snapbuild.c:1763 +#: replication/logical/snapbuild.c:1768 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "" "файл состояния snapbuild \"%s\" имеет неправильную версию (%u вместо %u)" -#: replication/logical/snapbuild.c:1862 +#: replication/logical/snapbuild.c:1839 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "" "в файле состояния snapbuild \"%s\" неверная контрольная сумма (%u вместо %u)" -#: replication/logical/snapbuild.c:1917 +#: replication/logical/snapbuild.c:1896 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Логическое декодирование начнётся с сохранённого снимка." -#: replication/logical/snapbuild.c:1989 +#: replication/logical/snapbuild.c:1968 #, c-format msgid "could not parse file name \"%s\"" msgstr "не удалось разобрать имя файла \"%s\"" -#: replication/logical/tablesync.c:132 +#: replication/logical/tablesync.c:144 #, c-format msgid "" "logical replication table synchronization worker for subscription \"%s\", " @@ -20363,55 +21261,63 @@ msgstr "" "процесс синхронизации таблицы при логической репликации для подписки \"%s\", " "таблицы \"%s\" закончил обработку" -#: replication/logical/tablesync.c:664 +#: replication/logical/tablesync.c:727 replication/logical/tablesync.c:770 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "" "не удалось получить информацию о таблице \"%s.%s\" с сервера публикации: %s" -#: replication/logical/tablesync.c:670 +#: replication/logical/tablesync.c:734 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "таблица \"%s.%s\" не найдена на сервере публикации" -#: replication/logical/tablesync.c:704 -#, c-format -msgid "could not fetch table info for table \"%s.%s\": %s" -msgstr "не удалось получить информацию о таблице \"%s.%s\": %s" - -#: replication/logical/tablesync.c:791 +#: replication/logical/tablesync.c:858 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "" "не удалось начать копирование начального содержимого таблицы \"%s.%s\": %s" -#: replication/logical/tablesync.c:905 +#: replication/logical/tablesync.c:1059 #, c-format -msgid "table copy could not start transaction on publisher" +msgid "table copy could not start transaction on publisher: %s" msgstr "" -"при копировании таблицы не удалось начать транзакцию на сервере публикации" +"при копировании таблицы не удалось начать транзакцию на сервере публикации: " +"%s" + +#: replication/logical/tablesync.c:1107 +#, c-format +msgid "replication origin \"%s\" already exists" +msgstr "источник репликации \"%s\" уже существует" -#: replication/logical/tablesync.c:927 +#: replication/logical/tablesync.c:1120 #, c-format -msgid "table copy could not finish transaction on publisher" +msgid "table copy could not finish transaction on publisher: %s" msgstr "" -"при копировании таблицы не удалось завершить транзакцию на сервере публикации" +"при копировании таблицы не удалось завершить транзакцию на сервере " +"публикации: %s" -#: replication/logical/worker.c:311 +#: replication/logical/worker.c:518 #, c-format msgid "" "processing remote data for replication target relation \"%s.%s\" column \"%s" -"\", remote type %s, local type %s" +"\"" msgstr "" "обработка внешних данных для целевого отношения репликации \"%s.%s\" столбца " -"\"%s\", удалённый тип %s, локальный тип %s" +"\"%s\"" + +#: replication/logical/worker.c:593 replication/logical/worker.c:719 +#, c-format +msgid "incorrect binary data format in logical replication column %d" +msgstr "" +"неправильный формат двоичных данных для столбца логической репликации %d" -#: replication/logical/worker.c:550 +#: replication/logical/worker.c:1090 replication/logical/worker.c:1104 #, c-format -msgid "ORIGIN message sent out of order" -msgstr "сообщение ORIGIN отправлено неуместно" +msgid "could not read from streaming transaction's changes file \"%s\": %m" +msgstr "не удалось прочитать файл изменений потоковых транзакций \"%s\": %m" -#: replication/logical/worker.c:700 +#: replication/logical/worker.c:1335 #, c-format msgid "" "publisher did not send replica identity column expected by the logical " @@ -20420,7 +21326,7 @@ msgstr "" "сервер публикации не передал столбец идентификации реплики, ожидаемый для " "целевого отношения логической репликации \"%s.%s\"" -#: replication/logical/worker.c:707 +#: replication/logical/worker.c:1342 #, c-format msgid "" "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY " @@ -20431,22 +21337,17 @@ msgstr "" "IDENTITY, ни ключа PRIMARY KEY, и публикуемое отношение не имеет " "характеристики REPLICA IDENTITY FULL" -#: replication/logical/worker.c:1393 -#, c-format -msgid "invalid logical replication message type \"%c\"" -msgstr "неверный тип сообщения логической репликации \"%c\"" - -#: replication/logical/worker.c:1536 +#: replication/logical/worker.c:2221 #, c-format msgid "data stream from publisher has ended" msgstr "поток данных с сервера публикации закончился" -#: replication/logical/worker.c:1691 +#: replication/logical/worker.c:2372 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "завершение обработчика логической репликации из-за тайм-аута" -#: replication/logical/worker.c:1836 +#: replication/logical/worker.c:2520 #, c-format msgid "" "logical replication apply worker for subscription \"%s\" will stop because " @@ -20455,7 +21356,7 @@ msgstr "" "применяющий процесс логической репликации для подписки \"%s\" будет " "остановлен, так как подписка была удалена" -#: replication/logical/worker.c:1850 +#: replication/logical/worker.c:2534 #, c-format msgid "" "logical replication apply worker for subscription \"%s\" will stop because " @@ -20464,43 +21365,22 @@ msgstr "" "применяющий процесс логической репликации для подписки \"%s\" будет " "остановлен, так как подписка была отключена" -#: replication/logical/worker.c:1864 +#: replication/logical/worker.c:2556 #, c-format msgid "" "logical replication apply worker for subscription \"%s\" will restart " -"because the connection information was changed" +"because of a parameter change" msgstr "" "применяющий процесс логической репликации для подписки \"%s\" будет " -"перезапущен из-за изменения информации о подключении" +"перезапущен вследствие изменения параметров" -#: replication/logical/worker.c:1878 +#: replication/logical/worker.c:2721 replication/logical/worker.c:2743 #, c-format -msgid "" -"logical replication apply worker for subscription \"%s\" will restart " -"because subscription was renamed" -msgstr "" -"применяющий процесс логической репликации для подписки \"%s\" будет " -"перезапущен, так как подписка была переименована" - -#: replication/logical/worker.c:1895 -#, c-format -msgid "" -"logical replication apply worker for subscription \"%s\" will restart " -"because the replication slot name was changed" +msgid "could not read from streaming transaction's subxact file \"%s\": %m" msgstr "" -"применяющий процесс логической репликации для подписки \"%s\" будет " -"перезапущен, так как было изменено имя слота репликации" - -#: replication/logical/worker.c:1909 -#, c-format -msgid "" -"logical replication apply worker for subscription \"%s\" will restart " -"because subscription's publications were changed" -msgstr "" -"применяющий процесс логической репликации для подписки \"%s\" будет " -"перезапущен из-за изменения публикаций подписки" +"не удалось прочитать файл данных subxact потоковых транзакций \"%s\": %m" -#: replication/logical/worker.c:2005 +#: replication/logical/worker.c:3102 #, c-format msgid "" "logical replication apply worker for subscription %u will not start because " @@ -20509,7 +21389,7 @@ msgstr "" "применяющий процесс логической репликации для подписки %u не будет запущен, " "так как подписка была удалена при старте" -#: replication/logical/worker.c:2017 +#: replication/logical/worker.c:3114 #, c-format msgid "" "logical replication apply worker for subscription \"%s\" will not start " @@ -20518,7 +21398,7 @@ msgstr "" "применяющий процесс логической репликации для подписки \"%s\" не будет " "запущен, так как подписка была отключена при старте" -#: replication/logical/worker.c:2035 +#: replication/logical/worker.c:3132 #, c-format msgid "" "logical replication table synchronization worker for subscription \"%s\", " @@ -20527,65 +21407,78 @@ msgstr "" "процесс синхронизации таблицы при логической репликации для подписки \"%s\", " "таблицы \"%s\" запущен" -#: replication/logical/worker.c:2039 +#: replication/logical/worker.c:3136 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "" "запускается применяющий процесс логической репликации для подписки \"%s\"" -#: replication/logical/worker.c:2078 +#: replication/logical/worker.c:3174 #, c-format msgid "subscription has no replication slot set" msgstr "для подписки не задан слот репликации" -#: replication/pgoutput/pgoutput.c:147 +#: replication/pgoutput/pgoutput.c:195 #, c-format msgid "invalid proto_version" msgstr "неверное значение proto_version" -#: replication/pgoutput/pgoutput.c:152 +#: replication/pgoutput/pgoutput.c:200 #, c-format msgid "proto_version \"%s\" out of range" msgstr "значение proto_verson \"%s\" вне диапазона" -#: replication/pgoutput/pgoutput.c:169 +#: replication/pgoutput/pgoutput.c:217 #, c-format msgid "invalid publication_names syntax" msgstr "неверный синтаксис publication_names" -#: replication/pgoutput/pgoutput.c:211 +#: replication/pgoutput/pgoutput.c:287 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or lower" msgstr "" "клиент передал proto_version=%d, но мы поддерживаем только протокол %d и ниже" -#: replication/pgoutput/pgoutput.c:217 +#: replication/pgoutput/pgoutput.c:293 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or higher" msgstr "" "клиент передал proto_version=%d, но мы поддерживает только протокол %d и выше" -#: replication/pgoutput/pgoutput.c:223 +#: replication/pgoutput/pgoutput.c:299 #, c-format msgid "publication_names parameter missing" msgstr "отсутствует параметр publication_names" -#: replication/slot.c:183 +#: replication/pgoutput/pgoutput.c:312 +#, c-format +msgid "" +"requested proto_version=%d does not support streaming, need %d or higher" +msgstr "" +"запрошенная версия proto_version=%d не поддерживает потоковую передачу, " +"требуется версия %d или выше" + +#: replication/pgoutput/pgoutput.c:317 +#, c-format +msgid "streaming requested, but not supported by output plugin" +msgstr "запрошена потоковая передача, но она не поддерживается модулем вывода" + +#: replication/slot.c:180 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "имя слота репликации \"%s\" слишком короткое" -#: replication/slot.c:192 +#: replication/slot.c:189 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "имя слота репликации \"%s\" слишком длинное" -#: replication/slot.c:205 +#: replication/slot.c:202 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "имя слота репликации \"%s\" содержит недопустимый символ" -#: replication/slot.c:207 +#: replication/slot.c:204 #, c-format msgid "" "Replication slot names may only contain lower case letters, numbers, and the " @@ -20594,56 +21487,54 @@ msgstr "" "Имя слота репликации может содержать только буквы в нижнем регистре, цифры и " "знак подчёркивания." -#: replication/slot.c:254 +#: replication/slot.c:258 #, c-format msgid "replication slot \"%s\" already exists" msgstr "слот репликации \"%s\" уже существует" -#: replication/slot.c:264 +#: replication/slot.c:268 #, c-format msgid "all replication slots are in use" msgstr "используются все слоты репликации" -#: replication/slot.c:265 +#: replication/slot.c:269 #, c-format msgid "Free one or increase max_replication_slots." msgstr "Освободите ненужные или увеличьте параметр max_replication_slots." -#: replication/slot.c:407 replication/slotfuncs.c:760 +#: replication/slot.c:402 replication/slotfuncs.c:761 +#: utils/adt/pgstatfuncs.c:2228 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "слот репликации \"%s\" не существует" -#: replication/slot.c:445 replication/slot.c:1006 +#: replication/slot.c:448 replication/slot.c:1018 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "слот репликации \"%s\" занят процессом с PID %d" -#: replication/slot.c:683 replication/slot.c:1314 replication/slot.c:1697 +#: replication/slot.c:676 replication/slot.c:1412 replication/slot.c:1795 #, c-format msgid "could not remove directory \"%s\"" msgstr "ошибка при удалении каталога \"%s\"" -#: replication/slot.c:1041 +#: replication/slot.c:1053 #, c-format msgid "replication slots can only be used if max_replication_slots > 0" msgstr "" "слоты репликации можно использовать, только если max_replication_slots > 0" -#: replication/slot.c:1046 +#: replication/slot.c:1058 #, c-format msgid "replication slots can only be used if wal_level >= replica" msgstr "слоты репликации можно использовать, только если wal_level >= replica" -#: replication/slot.c:1202 +#: replication/slot.c:1243 #, c-format -msgid "" -"terminating process %d because replication slot \"%s\" is too far behind" -msgstr "" -"завершение процесса %d из-за слишком большого отставания слота репликации " -"\"%s\"" +msgid "terminating process %d to release replication slot \"%s\"" +msgstr "завершение процесса %d для освобождения слота репликации \"%s\"" -#: replication/slot.c:1221 +#: replication/slot.c:1281 #, c-format msgid "" "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds " @@ -20652,70 +21543,70 @@ msgstr "" "слот \"%s\" аннулируется, так как его позиция restart_lsn %X/%X превышает " "max_slot_wal_keep_size" -#: replication/slot.c:1635 +#: replication/slot.c:1733 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "" "файл слота репликации \"%s\" имеет неправильную сигнатуру (%u вместо %u)" -#: replication/slot.c:1642 +#: replication/slot.c:1740 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "файл состояния snapbuild \"%s\" имеет неподдерживаемую версию %u" -#: replication/slot.c:1649 +#: replication/slot.c:1747 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "у файла слота репликации \"%s\" неверная длина: %u" -#: replication/slot.c:1685 +#: replication/slot.c:1783 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "" "в файле слота репликации \"%s\" неверная контрольная сумма (%u вместо %u)" -#: replication/slot.c:1719 +#: replication/slot.c:1817 #, c-format msgid "logical replication slot \"%s\" exists, but wal_level < logical" msgstr "существует слот логической репликации \"%s\", но wal_level < logical" -#: replication/slot.c:1721 +#: replication/slot.c:1819 #, c-format msgid "Change wal_level to be logical or higher." msgstr "Смените wal_level на logical или более высокий уровень." -#: replication/slot.c:1725 +#: replication/slot.c:1823 #, c-format msgid "physical replication slot \"%s\" exists, but wal_level < replica" msgstr "существует слот физической репликации \"%s\", но wal_level < replica" -#: replication/slot.c:1727 +#: replication/slot.c:1825 #, c-format msgid "Change wal_level to be replica or higher." msgstr "Смените wal_level на replica или более высокий уровень." -#: replication/slot.c:1761 +#: replication/slot.c:1859 #, c-format msgid "too many replication slots active before shutdown" msgstr "перед завершением активно слишком много слотов репликации" -#: replication/slotfuncs.c:624 +#: replication/slotfuncs.c:626 #, c-format msgid "invalid target WAL LSN" msgstr "неверный целевой LSN" -#: replication/slotfuncs.c:646 +#: replication/slotfuncs.c:648 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "слот репликации \"%s\" нельзя продвинуть вперёд" -#: replication/slotfuncs.c:664 +#: replication/slotfuncs.c:666 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" msgstr "" "продвинуть слот репликации к позиции %X/%X нельзя, минимальная позиция: %X/%X" -#: replication/slotfuncs.c:772 +#: replication/slotfuncs.c:773 #, c-format msgid "" "cannot copy physical replication slot \"%s\" as a logical replication slot" @@ -20723,7 +21614,7 @@ msgstr "" "слот физической репликации \"%s\" нельзя скопировать как слот логической " "репликации" -#: replication/slotfuncs.c:774 +#: replication/slotfuncs.c:775 #, c-format msgid "" "cannot copy logical replication slot \"%s\" as a physical replication slot" @@ -20731,17 +21622,17 @@ msgstr "" "слот логической репликации \"%s\" нельзя скопировать как слот физической " "репликации" -#: replication/slotfuncs.c:781 +#: replication/slotfuncs.c:782 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "скопировать слот репликации, для которого не резервируется WAL, нельзя" -#: replication/slotfuncs.c:857 +#: replication/slotfuncs.c:859 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "не удалось скопировать слот репликации \"%s\"" -#: replication/slotfuncs.c:859 +#: replication/slotfuncs.c:861 #, c-format msgid "" "The source replication slot was modified incompatibly during the copy " @@ -20750,21 +21641,21 @@ msgstr "" "Исходный слот репликации был модифицирован несовместимым образом во время " "копирования." -#: replication/slotfuncs.c:865 +#: replication/slotfuncs.c:867 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "" "скопировать слот логической репликации \"%s\" в незавершённом состоянии " "нельзя" -#: replication/slotfuncs.c:867 +#: replication/slotfuncs.c:869 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "" "Повторите попытку, когда для исходного слота репликации будет определена " "позиция confirmed_flush_lsn." -#: replication/syncrep.c:257 +#: replication/syncrep.c:268 #, c-format msgid "" "canceling the wait for synchronous replication and terminating connection " @@ -20773,162 +21664,156 @@ msgstr "" "отмена ожидания синхронной репликации и закрытие соединения по команде " "администратора" -#: replication/syncrep.c:258 replication/syncrep.c:275 +#: replication/syncrep.c:269 replication/syncrep.c:286 #, c-format msgid "" "The transaction has already committed locally, but might not have been " "replicated to the standby." msgstr "" -"Транзакция уже была зафиксирована локально, но возможно не была " +"Транзакция уже была зафиксирована локально, но, возможно, не была " "реплицирована на резервный сервер." -#: replication/syncrep.c:274 +#: replication/syncrep.c:285 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "отмена ожидания синхронной репликации по запросу пользователя" -#: replication/syncrep.c:416 -#, c-format -msgid "standby \"%s\" now has synchronous standby priority %u" -msgstr "" -"резервный сервер \"%s\" теперь имеет приоритет синхронной репликации %u" - -#: replication/syncrep.c:483 +#: replication/syncrep.c:494 #, c-format msgid "standby \"%s\" is now a synchronous standby with priority %u" msgstr "резервный сервер \"%s\" стал синхронным с приоритетом %u" -#: replication/syncrep.c:487 +#: replication/syncrep.c:498 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "" "резервный сервер \"%s\" стал кандидатом для включения в кворум синхронных " "резервных" -#: replication/syncrep.c:1034 +#: replication/syncrep.c:1045 #, c-format msgid "synchronous_standby_names parser failed" msgstr "ошибка при разборе synchronous_standby_names" -#: replication/syncrep.c:1040 +#: replication/syncrep.c:1051 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "число синхронных резервных серверов (%d) должно быть больше нуля" -#: replication/walreceiver.c:171 +#: replication/walreceiver.c:161 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "завершение процесса считывания журнала по команде администратора" -#: replication/walreceiver.c:297 +#: replication/walreceiver.c:289 #, c-format msgid "could not connect to the primary server: %s" msgstr "не удалось подключиться к главному серверу: %s" -#: replication/walreceiver.c:343 +#: replication/walreceiver.c:336 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "идентификаторы СУБД на главном и резервном серверах различаются" -#: replication/walreceiver.c:344 +#: replication/walreceiver.c:337 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "Идентификатор на главном сервере: %s, на резервном: %s." -#: replication/walreceiver.c:354 +#: replication/walreceiver.c:348 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "" "последняя линия времени %u на главном сервере отстаёт от восстанавливаемой " "линии времени %u" -#: replication/walreceiver.c:408 +#: replication/walreceiver.c:402 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "" "начало передачи журнала с главного сервера, с позиции %X/%X на линии времени " "%u" -#: replication/walreceiver.c:413 +#: replication/walreceiver.c:406 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "перезапуск передачи журнала с позиции %X/%X на линии времени %u" -#: replication/walreceiver.c:442 +#: replication/walreceiver.c:435 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "продолжить передачу WAL нельзя, восстановление уже окончено" -#: replication/walreceiver.c:479 +#: replication/walreceiver.c:472 #, c-format msgid "replication terminated by primary server" msgstr "репликация прекращена главным сервером" -#: replication/walreceiver.c:480 +#: replication/walreceiver.c:473 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "На линии времени %u в %X/%X достигнут конец журнала." -#: replication/walreceiver.c:568 +#: replication/walreceiver.c:562 #, c-format msgid "terminating walreceiver due to timeout" msgstr "завершение приёма журнала из-за тайм-аута" -#: replication/walreceiver.c:606 +#: replication/walreceiver.c:600 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "" "на главном сервере больше нет журналов для запрошенной линии времени %u" -#: replication/walreceiver.c:622 replication/walreceiver.c:938 +#: replication/walreceiver.c:616 replication/walreceiver.c:1036 #, c-format msgid "could not close log segment %s: %m" msgstr "не удалось закрыть сегмент журнала %s: %m" -#: replication/walreceiver.c:742 +#: replication/walreceiver.c:735 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "загрузка файла истории для линии времени %u с главного сервера" -#: replication/walreceiver.c:985 +#: replication/walreceiver.c:927 #, c-format msgid "could not write to log segment %s at offset %u, length %lu: %m" msgstr "не удалось записать в сегмент журнала %s (смещение %u, длина %lu): %m" -#: replication/walsender.c:527 storage/smgr/md.c:1329 +#: replication/walsender.c:524 storage/smgr/md.c:1321 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "не удалось перейти к концу файла \"%s\": %m" -#: replication/walsender.c:531 +#: replication/walsender.c:528 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "не удалось перейти к началу файла \"%s\": %m" -#: replication/walsender.c:582 +#: replication/walsender.c:579 #, c-format msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" msgstr "Команда IDENTIFY_SYSTEM не выполнялась до START_REPLICATION" -#: replication/walsender.c:611 +#: replication/walsender.c:608 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "" "слот логической репликации нельзя использовать для физической репликации" -#: replication/walsender.c:680 +#: replication/walsender.c:677 #, c-format msgid "" "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "" "в истории сервера нет запрошенной начальной точки %X/%X на линии времени %u" -#: replication/walsender.c:684 +#: replication/walsender.c:680 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "История этого сервера ответвилась от линии времени %u в %X/%X." -#: replication/walsender.c:729 +#: replication/walsender.c:724 #, c-format msgid "" "requested starting point %X/%X is ahead of the WAL flush position of this " @@ -20938,41 +21823,41 @@ msgstr "" "на этом сервере (%X/%X)" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:980 +#: replication/walsender.c:974 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s требуется выполнять не в транзакции" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:990 +#: replication/walsender.c:984 #, c-format msgid "%s must be called inside a transaction" msgstr "%s требуется выполнять внутри транзакции" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:996 +#: replication/walsender.c:990 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s требуется выполнять в транзакции уровня изоляции REPEATABLE READ" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1002 +#: replication/walsender.c:996 #, c-format msgid "%s must be called before any query" msgstr "%s требуется выполнять до каких-либо запросов" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1008 +#: replication/walsender.c:1002 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s требуется вызывать не в подтранзакции" -#: replication/walsender.c:1152 +#: replication/walsender.c:1145 #, c-format msgid "cannot read from logical replication slot \"%s\"" msgstr "прочитать из слота логической репликации \"%s\" нельзя" -#: replication/walsender.c:1154 +#: replication/walsender.c:1147 #, c-format msgid "" "This slot has been invalidated because it exceeded the maximum reserved size." @@ -20980,26 +21865,33 @@ msgstr "" "Этот слот был аннулирован из-за превышения максимального зарезервированного " "размера." -#: replication/walsender.c:1164 +#: replication/walsender.c:1157 #, c-format msgid "terminating walsender process after promotion" msgstr "завершение процесса передачи журнала после повышения" -#: replication/walsender.c:1538 +#: replication/walsender.c:1524 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "" "нельзя выполнять новые команды, пока процесс передачи WAL находится в режиме " "остановки" -#: replication/walsender.c:1571 +#: replication/walsender.c:1559 +#, c-format +msgid "cannot execute SQL commands in WAL sender for physical replication" +msgstr "" +"нельзя выполнять команды SQL в процессе, передающем WAL для физической " +"репликации" + +#: replication/walsender.c:1592 #, c-format msgid "received replication command: %s" msgstr "получена команда репликации: %s" -#: replication/walsender.c:1587 tcop/fastpath.c:279 tcop/postgres.c:1103 -#: tcop/postgres.c:1455 tcop/postgres.c:1716 tcop/postgres.c:2174 -#: tcop/postgres.c:2535 tcop/postgres.c:2614 +#: replication/walsender.c:1600 tcop/fastpath.c:208 tcop/postgres.c:1078 +#: tcop/postgres.c:1430 tcop/postgres.c:1691 tcop/postgres.c:2176 +#: tcop/postgres.c:2586 tcop/postgres.c:2665 #, c-format msgid "" "current transaction is aborted, commands ignored until end of transaction " @@ -21007,157 +21899,145 @@ msgid "" msgstr "" "текущая транзакция прервана, команды до конца блока транзакции игнорируются" -#: replication/walsender.c:1674 -#, c-format -msgid "cannot execute SQL commands in WAL sender for physical replication" -msgstr "" -"нельзя выполнять команды SQL в процессе, передающем WAL для физической " -"репликации" - -#: replication/walsender.c:1724 replication/walsender.c:1740 +#: replication/walsender.c:1735 replication/walsender.c:1770 #, c-format msgid "unexpected EOF on standby connection" msgstr "неожиданный обрыв соединения с резервным сервером" -#: replication/walsender.c:1779 +#: replication/walsender.c:1758 #, c-format msgid "invalid standby message type \"%c\"" msgstr "неверный тип сообщения резервного сервера: \"%c\"" -#: replication/walsender.c:1820 +#: replication/walsender.c:1847 #, c-format msgid "unexpected message type \"%c\"" msgstr "неожиданный тип сообщения \"%c\"" -#: replication/walsender.c:2232 +#: replication/walsender.c:2260 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "завершение процесса передачи журнала из-за тайм-аута репликации" -#: replication/walsender.c:2309 -#, c-format -msgid "\"%s\" has now caught up with upstream server" -msgstr "ведомый сервер \"%s\" нагнал ведущий" - -#: rewrite/rewriteDefine.c:113 rewrite/rewriteDefine.c:1000 +#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:999 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "правило \"%s\" для отношения \"%s\" уже существует" -#: rewrite/rewriteDefine.c:302 +#: rewrite/rewriteDefine.c:301 #, c-format msgid "rule actions on OLD are not implemented" msgstr "действия правил для OLD не реализованы" -#: rewrite/rewriteDefine.c:303 +#: rewrite/rewriteDefine.c:302 #, c-format msgid "Use views or triggers instead." msgstr "Воспользуйтесь представлениями или триггерами." -#: rewrite/rewriteDefine.c:307 +#: rewrite/rewriteDefine.c:306 #, c-format msgid "rule actions on NEW are not implemented" msgstr "действия правил для NEW не реализованы" -#: rewrite/rewriteDefine.c:308 +#: rewrite/rewriteDefine.c:307 #, c-format msgid "Use triggers instead." msgstr "Воспользуйтесь триггерами." -#: rewrite/rewriteDefine.c:321 +#: rewrite/rewriteDefine.c:320 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "правила INSTEAD NOTHING для SELECT не реализованы" -#: rewrite/rewriteDefine.c:322 +#: rewrite/rewriteDefine.c:321 #, c-format msgid "Use views instead." msgstr "Воспользуйтесь представлениями." -#: rewrite/rewriteDefine.c:330 +#: rewrite/rewriteDefine.c:329 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "множественные действия в правилах для SELECT не поддерживаются" -#: rewrite/rewriteDefine.c:340 +#: rewrite/rewriteDefine.c:339 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "в правилах для SELECT должно быть действие INSTEAD SELECT" -#: rewrite/rewriteDefine.c:348 +#: rewrite/rewriteDefine.c:347 #, c-format msgid "rules on SELECT must not contain data-modifying statements in WITH" msgstr "" "правила для SELECT не должны содержать операторы, изменяющие данные, в WITH" -#: rewrite/rewriteDefine.c:356 +#: rewrite/rewriteDefine.c:355 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "в правилах для SELECT не может быть условий" -#: rewrite/rewriteDefine.c:383 +#: rewrite/rewriteDefine.c:382 #, c-format msgid "\"%s\" is already a view" msgstr "\"%s\" уже является представлением" -#: rewrite/rewriteDefine.c:407 +#: rewrite/rewriteDefine.c:406 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "правило представления для \"%s\" должно называться \"%s\"" -#: rewrite/rewriteDefine.c:436 +#: rewrite/rewriteDefine.c:435 #, c-format msgid "cannot convert partitioned table \"%s\" to a view" msgstr "преобразовать секционированную таблицу \"%s\" в представление нельзя" -#: rewrite/rewriteDefine.c:445 +#: rewrite/rewriteDefine.c:444 #, c-format msgid "cannot convert partition \"%s\" to a view" msgstr "преобразовать секцию \"%s\" в представление нельзя" -#: rewrite/rewriteDefine.c:454 +#: rewrite/rewriteDefine.c:453 #, c-format msgid "could not convert table \"%s\" to a view because it is not empty" msgstr "" "не удалось преобразовать таблицу \"%s\" в представление, так как она не " "пуста1" -#: rewrite/rewriteDefine.c:463 +#: rewrite/rewriteDefine.c:462 #, c-format msgid "could not convert table \"%s\" to a view because it has triggers" msgstr "" "не удалось преобразовать таблицу \"%s\" в представление, так как она " "содержит триггеры" -#: rewrite/rewriteDefine.c:465 +#: rewrite/rewriteDefine.c:464 #, c-format msgid "" "In particular, the table cannot be involved in any foreign key relationships." msgstr "" "Кроме того, таблица не может быть задействована в ссылках по внешнему ключу." -#: rewrite/rewriteDefine.c:470 +#: rewrite/rewriteDefine.c:469 #, c-format msgid "could not convert table \"%s\" to a view because it has indexes" msgstr "" "не удалось преобразовать таблицу \"%s\" в представление, так как она имеет " "индексы" -#: rewrite/rewriteDefine.c:476 +#: rewrite/rewriteDefine.c:475 #, c-format msgid "could not convert table \"%s\" to a view because it has child tables" msgstr "" "не удалось преобразовать таблицу \"%s\" в представление, так как она имеет " "подчинённые таблицы" -#: rewrite/rewriteDefine.c:482 +#: rewrite/rewriteDefine.c:481 #, c-format msgid "could not convert table \"%s\" to a view because it has parent tables" msgstr "" "не удалось преобразовать таблицу \"%s\" в представление, так как она имеет " "родительские таблицы" -#: rewrite/rewriteDefine.c:488 +#: rewrite/rewriteDefine.c:487 #, c-format msgid "" "could not convert table \"%s\" to a view because it has row security enabled" @@ -21165,7 +22045,7 @@ msgstr "" "не удалось преобразовать таблицу \"%s\" в представление, так как для неё " "включена защита на уровне строк" -#: rewrite/rewriteDefine.c:494 +#: rewrite/rewriteDefine.c:493 #, c-format msgid "" "could not convert table \"%s\" to a view because it has row security policies" @@ -21173,45 +22053,45 @@ msgstr "" "не удалось преобразовать таблицу \"%s\" в представление, так как к ней " "применены политики защиты строк" -#: rewrite/rewriteDefine.c:521 +#: rewrite/rewriteDefine.c:520 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "в правиле нельзя указать несколько списков RETURNING" -#: rewrite/rewriteDefine.c:526 +#: rewrite/rewriteDefine.c:525 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "списки RETURNING в условных правилах не поддерживаются" -#: rewrite/rewriteDefine.c:530 +#: rewrite/rewriteDefine.c:529 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "списки RETURNING поддерживаются только в правилах INSTEAD" -#: rewrite/rewriteDefine.c:694 +#: rewrite/rewriteDefine.c:693 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "список результата правила для SELECT содержит слишком много столбцов" -#: rewrite/rewriteDefine.c:695 +#: rewrite/rewriteDefine.c:694 #, c-format msgid "RETURNING list has too many entries" msgstr "список RETURNING содержит слишком много столбцов" -#: rewrite/rewriteDefine.c:722 +#: rewrite/rewriteDefine.c:721 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "" "преобразовать отношение, содержащее удалённые столбцы, в представление нельзя" -#: rewrite/rewriteDefine.c:723 +#: rewrite/rewriteDefine.c:722 #, c-format msgid "" "cannot create a RETURNING list for a relation containing dropped columns" msgstr "" "создать список RETURNING для отношения, содержащего удалённые столбцы, нельзя" -#: rewrite/rewriteDefine.c:729 +#: rewrite/rewriteDefine.c:728 #, c-format msgid "" "SELECT rule's target entry %d has different column name from column \"%s\"" @@ -21219,67 +22099,67 @@ msgstr "" "элементу %d результата правила для SELECT присвоено имя, отличное от имени " "столбца \"%s\"" -#: rewrite/rewriteDefine.c:731 +#: rewrite/rewriteDefine.c:730 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "Имя элемента результата SELECT: \"%s\"." -#: rewrite/rewriteDefine.c:740 +#: rewrite/rewriteDefine.c:739 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "" "элемент %d результата правила для SELECT имеет тип, отличный от типа столбца " "\"%s\"" -#: rewrite/rewriteDefine.c:742 +#: rewrite/rewriteDefine.c:741 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "элемент %d списка RETURNING имеет тип, отличный от типа столбца \"%s\"" -#: rewrite/rewriteDefine.c:745 rewrite/rewriteDefine.c:769 +#: rewrite/rewriteDefine.c:744 rewrite/rewriteDefine.c:768 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "Элемент результата SELECT имеет тип %s, тогда как тип столбца - %s." -#: rewrite/rewriteDefine.c:748 rewrite/rewriteDefine.c:773 +#: rewrite/rewriteDefine.c:747 rewrite/rewriteDefine.c:772 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "Элемент списка RETURNING имеет тип %s, тогда как тип столбца - %s." -#: rewrite/rewriteDefine.c:764 +#: rewrite/rewriteDefine.c:763 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "" "элемент %d результата правила для SELECT имеет размер, отличный от столбца " "\"%s\"" -#: rewrite/rewriteDefine.c:766 +#: rewrite/rewriteDefine.c:765 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "элемент %d списка RETURNING имеет размер, отличный от столбца \"%s\"" -#: rewrite/rewriteDefine.c:783 +#: rewrite/rewriteDefine.c:782 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "список результата правила для SELECT содержит недостаточно элементов" -#: rewrite/rewriteDefine.c:784 +#: rewrite/rewriteDefine.c:783 #, c-format msgid "RETURNING list has too few entries" msgstr "список RETURNING содержит недостаточно элементов" -#: rewrite/rewriteDefine.c:877 rewrite/rewriteDefine.c:991 +#: rewrite/rewriteDefine.c:876 rewrite/rewriteDefine.c:990 #: rewrite/rewriteSupport.c:109 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "правило \"%s\" для отношения\"%s\" не существует" -#: rewrite/rewriteDefine.c:1010 +#: rewrite/rewriteDefine.c:1009 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "переименовывать правило ON SELECT нельзя" -#: rewrite/rewriteHandler.c:546 +#: rewrite/rewriteHandler.c:554 #, c-format msgid "" "WITH query name \"%s\" appears in both a rule action and the query being " @@ -21288,113 +22168,122 @@ msgstr "" "имя запроса WITH \"%s\" оказалось и в действии правила, и в переписываемом " "запросе" -#: rewrite/rewriteHandler.c:606 +#: rewrite/rewriteHandler.c:581 +#, c-format +msgid "" +"INSERT...SELECT rule actions are not supported for queries having data-" +"modifying statements in WITH" +msgstr "" +"правила INSERT...SELECT не поддерживаются для запросов с операторами, " +"изменяющими данные, в WITH" + +#: rewrite/rewriteHandler.c:634 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "RETURNING можно определить только для одного правила" -#: rewrite/rewriteHandler.c:817 rewrite/rewriteHandler.c:829 +#: rewrite/rewriteHandler.c:866 rewrite/rewriteHandler.c:905 #, c-format -msgid "cannot insert into column \"%s\"" -msgstr "вставить данные в столбец \"%s\" нельзя" +msgid "cannot insert a non-DEFAULT value into column \"%s\"" +msgstr "в столбец \"%s\" можно вставить только значение по умолчанию" -#: rewrite/rewriteHandler.c:818 rewrite/rewriteHandler.c:840 +#: rewrite/rewriteHandler.c:868 rewrite/rewriteHandler.c:934 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "" "Столбец \"%s\" является столбцом идентификации со свойством GENERATED ALWAYS." -#: rewrite/rewriteHandler.c:820 +#: rewrite/rewriteHandler.c:870 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Для переопределения укажите OVERRIDING SYSTEM VALUE." -#: rewrite/rewriteHandler.c:839 rewrite/rewriteHandler.c:846 +#: rewrite/rewriteHandler.c:932 rewrite/rewriteHandler.c:940 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "столбцу \"%s\" можно присвоить только значение DEFAULT" -#: rewrite/rewriteHandler.c:1015 rewrite/rewriteHandler.c:1033 +#: rewrite/rewriteHandler.c:1087 rewrite/rewriteHandler.c:1105 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "многочисленные присвоения одному столбцу \"%s\"" -#: rewrite/rewriteHandler.c:2015 rewrite/rewriteHandler.c:3823 +#: rewrite/rewriteHandler.c:2107 rewrite/rewriteHandler.c:3935 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "обнаружена бесконечная рекурсия в правилах для отношения \"%s\"" -#: rewrite/rewriteHandler.c:2100 +#: rewrite/rewriteHandler.c:2192 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "обнаружена бесконечная рекурсия в политике для отношения \"%s\"" -#: rewrite/rewriteHandler.c:2420 +#: rewrite/rewriteHandler.c:2512 msgid "Junk view columns are not updatable." msgstr "Утилизируемые столбцы представлений не обновляются." -#: rewrite/rewriteHandler.c:2425 +#: rewrite/rewriteHandler.c:2517 msgid "" "View columns that are not columns of their base relation are not updatable." msgstr "" "Столбцы представлений, не являющиеся столбцами базовых отношений, не " "обновляются." -#: rewrite/rewriteHandler.c:2428 +#: rewrite/rewriteHandler.c:2520 msgid "View columns that refer to system columns are not updatable." msgstr "" "Столбцы представлений, ссылающиеся на системные столбцы, не обновляются." -#: rewrite/rewriteHandler.c:2431 +#: rewrite/rewriteHandler.c:2523 msgid "View columns that return whole-row references are not updatable." msgstr "" "Столбцы представлений, возвращающие ссылки на всю строку, не обновляются." -#: rewrite/rewriteHandler.c:2492 +#: rewrite/rewriteHandler.c:2584 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Представления с DISTINCT не обновляются автоматически." -#: rewrite/rewriteHandler.c:2495 +#: rewrite/rewriteHandler.c:2587 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Представления с GROUP BY не обновляются автоматически." -#: rewrite/rewriteHandler.c:2498 +#: rewrite/rewriteHandler.c:2590 msgid "Views containing HAVING are not automatically updatable." msgstr "Представления с HAVING не обновляются автоматически." -#: rewrite/rewriteHandler.c:2501 +#: rewrite/rewriteHandler.c:2593 msgid "" "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "" "Представления с UNION, INTERSECT или EXCEPT не обновляются автоматически." -#: rewrite/rewriteHandler.c:2504 +#: rewrite/rewriteHandler.c:2596 msgid "Views containing WITH are not automatically updatable." msgstr "Представления с WITH не обновляются автоматически." -#: rewrite/rewriteHandler.c:2507 +#: rewrite/rewriteHandler.c:2599 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Представления с LIMIT или OFFSET не обновляются автоматически." -#: rewrite/rewriteHandler.c:2519 +#: rewrite/rewriteHandler.c:2611 msgid "Views that return aggregate functions are not automatically updatable." msgstr "" "Представления, возвращающие агрегатные функции, не обновляются автоматически." -#: rewrite/rewriteHandler.c:2522 +#: rewrite/rewriteHandler.c:2614 msgid "Views that return window functions are not automatically updatable." msgstr "" "Представления, возвращающие оконные функции, не обновляются автоматически." -#: rewrite/rewriteHandler.c:2525 +#: rewrite/rewriteHandler.c:2617 msgid "" "Views that return set-returning functions are not automatically updatable." msgstr "" "Представления, возвращающие функции с результатом-множеством, не обновляются " "автоматически." -#: rewrite/rewriteHandler.c:2532 rewrite/rewriteHandler.c:2536 -#: rewrite/rewriteHandler.c:2544 +#: rewrite/rewriteHandler.c:2624 rewrite/rewriteHandler.c:2628 +#: rewrite/rewriteHandler.c:2636 msgid "" "Views that do not select from a single table or view are not automatically " "updatable." @@ -21402,27 +22291,36 @@ msgstr "" "Представления, выбирающие данные не из одной таблицы или представления, не " "обновляются автоматически." -#: rewrite/rewriteHandler.c:2547 +#: rewrite/rewriteHandler.c:2639 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Представления, содержащие TABLESAMPLE, не обновляются автоматически." -#: rewrite/rewriteHandler.c:2571 +#: rewrite/rewriteHandler.c:2663 msgid "Views that have no updatable columns are not automatically updatable." msgstr "" "Представления, не содержащие обновляемых столбцов, не обновляются " "автоматически." -#: rewrite/rewriteHandler.c:3048 +#: rewrite/rewriteHandler.c:3140 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "вставить данные в столбец \"%s\" представления \"%s\" нельзя" -#: rewrite/rewriteHandler.c:3056 +#: rewrite/rewriteHandler.c:3148 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "изменить данные в столбце \"%s\" представления \"%s\" нельзя" -#: rewrite/rewriteHandler.c:3534 +#: rewrite/rewriteHandler.c:3629 +#, c-format +msgid "" +"DO INSTEAD NOTIFY rules are not supported for data-modifying statements in " +"WITH" +msgstr "" +"правила DO INSTEAD NOTIFY не поддерживаются в операторах, изменяющих данные, " +"в WITH" + +#: rewrite/rewriteHandler.c:3640 #, c-format msgid "" "DO INSTEAD NOTHING rules are not supported for data-modifying statements in " @@ -21431,7 +22329,7 @@ msgstr "" "правила DO INSTEAD NOTHING не поддерживаются в операторах, изменяющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:3548 +#: rewrite/rewriteHandler.c:3654 #, c-format msgid "" "conditional DO INSTEAD rules are not supported for data-modifying statements " @@ -21440,13 +22338,13 @@ msgstr "" "условные правила DO INSTEAD не поддерживаются для операторов, изменяющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:3552 +#: rewrite/rewriteHandler.c:3658 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "" "правила DO ALSO не поддерживаются для операторов, изменяющих данные, в WITH" -#: rewrite/rewriteHandler.c:3557 +#: rewrite/rewriteHandler.c:3663 #, c-format msgid "" "multi-statement DO INSTEAD rules are not supported for data-modifying " @@ -21455,8 +22353,8 @@ msgstr "" "составные правила DO INSTEAD не поддерживаются для операторов, изменяющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:3751 rewrite/rewriteHandler.c:3759 -#: rewrite/rewriteHandler.c:3767 +#: rewrite/rewriteHandler.c:3863 rewrite/rewriteHandler.c:3871 +#: rewrite/rewriteHandler.c:3879 #, c-format msgid "" "Views with conditional DO INSTEAD rules are not automatically updatable." @@ -21464,43 +22362,43 @@ msgstr "" "Представления в сочетании с правилами DO INSTEAD с условиями не обновляются " "автоматически." -#: rewrite/rewriteHandler.c:3860 +#: rewrite/rewriteHandler.c:3972 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "выполнить INSERT RETURNING для отношения \"%s\" нельзя" -#: rewrite/rewriteHandler.c:3862 +#: rewrite/rewriteHandler.c:3974 #, c-format msgid "" "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "" "Необходимо безусловное правило ON INSERT DO INSTEAD с предложением RETURNING." -#: rewrite/rewriteHandler.c:3867 +#: rewrite/rewriteHandler.c:3979 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "выполнить UPDATE RETURNING для отношения \"%s\" нельзя" -#: rewrite/rewriteHandler.c:3869 +#: rewrite/rewriteHandler.c:3981 #, c-format msgid "" "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "" "Необходимо безусловное правило ON UPDATE DO INSTEAD с предложением RETURNING." -#: rewrite/rewriteHandler.c:3874 +#: rewrite/rewriteHandler.c:3986 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "выполнить DELETE RETURNING для отношения \"%s\" нельзя" -#: rewrite/rewriteHandler.c:3876 +#: rewrite/rewriteHandler.c:3988 #, c-format msgid "" "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "" "Необходимо безусловное правило ON DELETE DO INSTEAD с предложением RETURNING." -#: rewrite/rewriteHandler.c:3894 +#: rewrite/rewriteHandler.c:4006 #, c-format msgid "" "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or " @@ -21509,7 +22407,7 @@ msgstr "" "INSERT c предложением ON CONFLICT нельзя использовать с таблицей, для " "которой заданы правила INSERT или UPDATE" -#: rewrite/rewriteHandler.c:3951 +#: rewrite/rewriteHandler.c:4063 #, c-format msgid "" "WITH cannot be used in a query that is rewritten by rules into multiple " @@ -21537,65 +22435,62 @@ msgstr "" "переменные NEW в правилах ON UPDATE не могут ссылаться на столбцы, " "фигурирующие во множественном присваивании в исходной команде UPDATE" -#: snowball/dict_snowball.c:199 +#: snowball/dict_snowball.c:215 #, c-format msgid "no Snowball stemmer available for language \"%s\" and encoding \"%s\"" msgstr "стеммер Snowball для языка \"%s\" и кодировки \"%s\" не найден" -#: snowball/dict_snowball.c:222 tsearch/dict_ispell.c:74 +#: snowball/dict_snowball.c:238 tsearch/dict_ispell.c:74 #: tsearch/dict_simple.c:49 #, c-format msgid "multiple StopWords parameters" msgstr "повторяющийся параметр StopWords" -#: snowball/dict_snowball.c:231 +#: snowball/dict_snowball.c:247 #, c-format msgid "multiple Language parameters" msgstr "повторяющийся параметр Language" -#: snowball/dict_snowball.c:238 +#: snowball/dict_snowball.c:254 #, c-format msgid "unrecognized Snowball parameter: \"%s\"" msgstr "нераспознанный параметр Snowball: \"%s\"" -#: snowball/dict_snowball.c:246 +#: snowball/dict_snowball.c:262 #, c-format msgid "missing Language parameter" msgstr "отсутствует параметр Language" -#: statistics/dependencies.c:667 statistics/dependencies.c:720 -#: statistics/mcv.c:1477 statistics/mcv.c:1508 statistics/mvdistinct.c:348 -#: statistics/mvdistinct.c:401 utils/adt/pseudotypes.c:42 -#: utils/adt/pseudotypes.c:76 -#, c-format -msgid "cannot accept a value of type %s" -msgstr "значение типа %s нельзя ввести" - -#: statistics/extended_stats.c:145 +#: statistics/extended_stats.c:178 #, c-format msgid "" "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "" "объект статистики \"%s.%s\" не может быть вычислен для отношения \"%s.%s\"" -#: statistics/mcv.c:1365 utils/adt/jsonfuncs.c:1800 +#: statistics/mcv.c:1371 utils/adt/jsonfuncs.c:1943 #, c-format msgid "" "function returning record called in context that cannot accept type record" msgstr "" "функция, возвращающая запись, вызвана в контексте, не допускающем этот тип" -#: storage/buffer/bufmgr.c:588 storage/buffer/bufmgr.c:670 +#: storage/buffer/bufmgr.c:601 storage/buffer/bufmgr.c:761 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "обращаться к временным таблицам других сеансов нельзя" -#: storage/buffer/bufmgr.c:826 +#: storage/buffer/bufmgr.c:839 +#, c-format +msgid "cannot extend relation %s beyond %u blocks" +msgstr "не удалось увеличить отношение \"%s\" до блока %u" + +#: storage/buffer/bufmgr.c:926 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "неожиданные данные после EOF в блоке %u отношения %s" -#: storage/buffer/bufmgr.c:828 +#: storage/buffer/bufmgr.c:928 #, c-format msgid "" "This has been seen to occur with buggy kernels; consider updating your " @@ -21604,27 +22499,27 @@ msgstr "" "Эта ситуация может возникать из-за ошибок в ядре; возможно, вам следует " "обновить ОС." -#: storage/buffer/bufmgr.c:927 +#: storage/buffer/bufmgr.c:1027 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "неверная страница в блоке %u отношения %s; страница обнуляется" -#: storage/buffer/bufmgr.c:4213 +#: storage/buffer/bufmgr.c:4533 #, c-format msgid "could not write block %u of %s" msgstr "не удалось запись блок %u файла %s" -#: storage/buffer/bufmgr.c:4215 +#: storage/buffer/bufmgr.c:4535 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Множественные сбои - возможно, постоянная ошибка записи." -#: storage/buffer/bufmgr.c:4236 storage/buffer/bufmgr.c:4255 +#: storage/buffer/bufmgr.c:4556 storage/buffer/bufmgr.c:4575 #, c-format msgid "writing block %u of relation %s" msgstr "запись блока %u отношения %s" -#: storage/buffer/bufmgr.c:4558 +#: storage/buffer/bufmgr.c:4879 #, c-format msgid "snapshot too old" msgstr "снимок слишком стар" @@ -21639,13 +22534,13 @@ msgstr "нет пустого локального буфера" msgid "cannot access temporary tables during a parallel operation" msgstr "обращаться к временным таблицам во время параллельных операций нельзя" -#: storage/file/buffile.c:319 +#: storage/file/buffile.c:323 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "" "не удалось открыть временный файл \"%s\", входящий в BufFile \"%s\": %m" -#: storage/file/buffile.c:795 +#: storage/file/buffile.c:684 storage/file/buffile.c:805 #, c-format msgid "" "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" @@ -21653,198 +22548,211 @@ msgstr "" "не удалось определить размер временного файла \"%s\", входящего в BufFile " "\"%s\": %m" -#: storage/file/fd.c:508 storage/file/fd.c:580 storage/file/fd.c:616 +#: storage/file/buffile.c:884 +#, c-format +msgid "could not delete shared fileset \"%s\": %m" +msgstr "ошибка удаления разделяемого набора файлов \"%s\": %m" + +#: storage/file/buffile.c:902 storage/smgr/md.c:306 storage/smgr/md.c:866 +#, c-format +msgid "could not truncate file \"%s\": %m" +msgstr "не удалось обрезать файл \"%s\": %m" + +#: storage/file/fd.c:515 storage/file/fd.c:587 storage/file/fd.c:623 #, c-format msgid "could not flush dirty data: %m" msgstr "не удалось сбросить грязные данные: %m" -#: storage/file/fd.c:538 +#: storage/file/fd.c:545 #, c-format msgid "could not determine dirty data size: %m" msgstr "не удалось определить размер грязных данных: %m" -#: storage/file/fd.c:590 +#: storage/file/fd.c:597 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "ошибка в munmap() при сбросе данных на диск: %m" -#: storage/file/fd.c:798 +#: storage/file/fd.c:836 #, c-format msgid "could not link file \"%s\" to \"%s\": %m" msgstr "для файла \"%s\" не удалось создать ссылку \"%s\": %m" -#: storage/file/fd.c:881 +#: storage/file/fd.c:931 #, c-format msgid "getrlimit failed: %m" msgstr "ошибка в getrlimit(): %m" -#: storage/file/fd.c:971 +#: storage/file/fd.c:1021 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "недостаточно дескрипторов файлов для запуска серверного процесса" -#: storage/file/fd.c:972 +#: storage/file/fd.c:1022 #, c-format msgid "System allows %d, we need at least %d." msgstr "Система выделяет: %d, а требуется минимум: %d." -#: storage/file/fd.c:1023 storage/file/fd.c:2357 storage/file/fd.c:2467 -#: storage/file/fd.c:2618 +#: storage/file/fd.c:1073 storage/file/fd.c:2410 storage/file/fd.c:2520 +#: storage/file/fd.c:2671 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "нехватка дескрипторов файлов: %m; освободите их и повторите попытку" -#: storage/file/fd.c:1397 +#: storage/file/fd.c:1447 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "временный файл: путь \"%s\", размер %lu" -#: storage/file/fd.c:1528 +#: storage/file/fd.c:1578 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "не удалось создать временный каталог \"%s\": %m" -#: storage/file/fd.c:1535 +#: storage/file/fd.c:1585 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "не удалось создать временный подкаталог \"%s\": %m" -#: storage/file/fd.c:1728 +#: storage/file/fd.c:1778 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "не удалось создать временный файл \"%s\": %m" -#: storage/file/fd.c:1763 +#: storage/file/fd.c:1812 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "не удалось открыть временный файл \"%s\": %m" -#: storage/file/fd.c:1804 +#: storage/file/fd.c:1853 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "ошибка удаления временного файла \"%s\": %m" -#: storage/file/fd.c:2068 +#: storage/file/fd.c:1941 +#, c-format +msgid "could not delete file \"%s\": %m" +msgstr "ошибка удаления файла \"%s\": %m" + +#: storage/file/fd.c:2121 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "размер временного файла превышает предел temp_file_limit (%d КБ)" -#: storage/file/fd.c:2333 storage/file/fd.c:2392 +#: storage/file/fd.c:2386 storage/file/fd.c:2445 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "превышен предел maxAllocatedDescs (%d) при попытке открыть файл \"%s\"" -#: storage/file/fd.c:2437 +#: storage/file/fd.c:2490 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "" "превышен предел maxAllocatedDescs (%d) при попытке выполнить команду \"%s\"" -#: storage/file/fd.c:2594 +#: storage/file/fd.c:2647 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "" "превышен предел maxAllocatedDescs (%d) при попытке открыть каталог \"%s\"" -#: storage/file/fd.c:3122 +#: storage/file/fd.c:3177 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "в каталоге временных файлов обнаружен неуместный файл: \"%s\"" -#: storage/file/sharedfileset.c:111 +#: storage/file/fd.c:3306 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не удалось синхронизировать с ФС файл \"%s\": %m" + +#: storage/file/sharedfileset.c:144 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "не удалось подключиться к уже уничтоженному набору SharedFileSet" -#: storage/ipc/dsm.c:338 +#: storage/ipc/dsm.c:351 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "сегмент управления динамической разделяемой памятью испорчен" -#: storage/ipc/dsm.c:399 +#: storage/ipc/dsm.c:415 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "сегмент управления динамической разделяемой памятью не в порядке" -#: storage/ipc/dsm.c:494 +#: storage/ipc/dsm.c:592 #, c-format msgid "too many dynamic shared memory segments" msgstr "слишком много сегментов динамической разделяемой памяти" -#: storage/ipc/dsm_impl.c:230 storage/ipc/dsm_impl.c:526 -#: storage/ipc/dsm_impl.c:630 storage/ipc/dsm_impl.c:801 +#: storage/ipc/dsm_impl.c:233 storage/ipc/dsm_impl.c:529 +#: storage/ipc/dsm_impl.c:633 storage/ipc/dsm_impl.c:804 #, c-format msgid "could not unmap shared memory segment \"%s\": %m" msgstr "не удалось освободить сегмент разделяемой памяти %s: %m" -#: storage/ipc/dsm_impl.c:240 storage/ipc/dsm_impl.c:536 -#: storage/ipc/dsm_impl.c:640 storage/ipc/dsm_impl.c:811 +#: storage/ipc/dsm_impl.c:243 storage/ipc/dsm_impl.c:539 +#: storage/ipc/dsm_impl.c:643 storage/ipc/dsm_impl.c:814 #, c-format msgid "could not remove shared memory segment \"%s\": %m" msgstr "ошибка при удалении сегмента разделяемой памяти \"%s\": %m" -#: storage/ipc/dsm_impl.c:264 storage/ipc/dsm_impl.c:711 -#: storage/ipc/dsm_impl.c:825 +#: storage/ipc/dsm_impl.c:267 storage/ipc/dsm_impl.c:714 +#: storage/ipc/dsm_impl.c:828 #, c-format msgid "could not open shared memory segment \"%s\": %m" msgstr "не удалось открыть сегмент разделяемой памяти \"%s\": %m" -#: storage/ipc/dsm_impl.c:289 storage/ipc/dsm_impl.c:552 -#: storage/ipc/dsm_impl.c:756 storage/ipc/dsm_impl.c:849 +#: storage/ipc/dsm_impl.c:292 storage/ipc/dsm_impl.c:555 +#: storage/ipc/dsm_impl.c:759 storage/ipc/dsm_impl.c:852 #, c-format msgid "could not stat shared memory segment \"%s\": %m" msgstr "не удалось обратиться к сегменту разделяемой памяти \"%s\": %m" -#: storage/ipc/dsm_impl.c:316 storage/ipc/dsm_impl.c:900 +#: storage/ipc/dsm_impl.c:319 storage/ipc/dsm_impl.c:903 #, c-format msgid "could not resize shared memory segment \"%s\" to %zu bytes: %m" msgstr "" "не удалось изменить размер сегмента разделяемой памяти \"%s\" до %zu байт: %m" -#: storage/ipc/dsm_impl.c:338 storage/ipc/dsm_impl.c:573 -#: storage/ipc/dsm_impl.c:732 storage/ipc/dsm_impl.c:922 +#: storage/ipc/dsm_impl.c:341 storage/ipc/dsm_impl.c:576 +#: storage/ipc/dsm_impl.c:735 storage/ipc/dsm_impl.c:925 #, c-format msgid "could not map shared memory segment \"%s\": %m" msgstr "не удалось отобразить сегмент разделяемой памяти \"%s\": %m" -#: storage/ipc/dsm_impl.c:508 +#: storage/ipc/dsm_impl.c:511 #, c-format msgid "could not get shared memory segment: %m" msgstr "не удалось получить сегмент разделяемой памяти: %m" -#: storage/ipc/dsm_impl.c:696 +#: storage/ipc/dsm_impl.c:699 #, c-format msgid "could not create shared memory segment \"%s\": %m" msgstr "не удалось создать сегмент разделяемой памяти \"%s\": %m" -#: storage/ipc/dsm_impl.c:933 +#: storage/ipc/dsm_impl.c:936 #, c-format msgid "could not close shared memory segment \"%s\": %m" msgstr "не удалось закрыть сегмент разделяемой памяти \"%s\": %m" -#: storage/ipc/dsm_impl.c:972 storage/ipc/dsm_impl.c:1020 +#: storage/ipc/dsm_impl.c:975 storage/ipc/dsm_impl.c:1023 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "не удалось продублировать указатель для \"%s\": %m" -#. translator: %s is a syscall name, such as "poll()" -#: storage/ipc/latch.c:940 storage/ipc/latch.c:1095 storage/ipc/latch.c:1308 -#: storage/ipc/latch.c:1461 storage/ipc/latch.c:1581 -#, c-format -msgid "%s failed: %m" -msgstr "ошибка в %s: %m" - -#: storage/ipc/procarray.c:3021 +#: storage/ipc/procarray.c:3807 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "база \"%s\" используется подготовленными транзакциями" -#: storage/ipc/procarray.c:3053 storage/ipc/signalfuncs.c:142 +#: storage/ipc/procarray.c:3839 storage/ipc/signalfuncs.c:221 #, c-format msgid "must be a superuser to terminate superuser process" msgstr "прерывать процесс суперпользователя может только суперпользователь" -#: storage/ipc/procarray.c:3060 storage/ipc/signalfuncs.c:147 +#: storage/ipc/procarray.c:3846 storage/ipc/signalfuncs.c:226 #, c-format msgid "" "must be a member of the role whose process is being terminated or member of " @@ -21864,12 +22772,12 @@ msgstr "" msgid "invalid message size %zu in shared memory queue" msgstr "неверный размер сообщения %zu в очереди в разделяемой памяти" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:982 -#: storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 storage/lmgr/lock.c:4167 -#: storage/lmgr/lock.c:4232 storage/lmgr/lock.c:4539 -#: storage/lmgr/predicate.c:2476 storage/lmgr/predicate.c:2491 -#: storage/lmgr/predicate.c:3973 storage/lmgr/predicate.c:5084 -#: utils/hash/dynahash.c:1067 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:981 +#: storage/lmgr/lock.c:1019 storage/lmgr/lock.c:2844 storage/lmgr/lock.c:4258 +#: storage/lmgr/lock.c:4323 storage/lmgr/lock.c:4673 +#: storage/lmgr/predicate.c:2470 storage/lmgr/predicate.c:2485 +#: storage/lmgr/predicate.c:3967 storage/lmgr/predicate.c:5078 +#: utils/hash/dynahash.c:1112 #, c-format msgid "out of shared memory" msgstr "нехватка разделяемой памяти" @@ -21879,12 +22787,12 @@ msgstr "нехватка разделяемой памяти" msgid "out of shared memory (%zu bytes requested)" msgstr "нехватка разделяемой памяти (требовалось байт: %zu)" -#: storage/ipc/shmem.c:441 +#: storage/ipc/shmem.c:445 #, c-format msgid "could not create ShmemIndex entry for data structure \"%s\"" msgstr "не удалось создать запись ShmemIndex для структуры данных \"%s\"" -#: storage/ipc/shmem.c:456 +#: storage/ipc/shmem.c:460 #, c-format msgid "" "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, " @@ -21893,7 +22801,7 @@ msgstr "" "размер записи ShmemIndex не соответствует структуре данных \"%s" "\" (ожидалось: %zu, фактически: %zu)" -#: storage/ipc/shmem.c:475 +#: storage/ipc/shmem.c:479 #, c-format msgid "" "not enough shared memory for data structure \"%s\" (%zu bytes requested)" @@ -21901,27 +22809,28 @@ msgstr "" "недостаточно разделяемой памяти для структуры данных \"%s\" (требовалось " "байт: %zu)" -#: storage/ipc/shmem.c:507 storage/ipc/shmem.c:526 +#: storage/ipc/shmem.c:511 storage/ipc/shmem.c:530 #, c-format msgid "requested shared memory size overflows size_t" msgstr "запрошенный размер разделяемой памяти не умещается в size_t" -#: storage/ipc/signalfuncs.c:67 +#: storage/ipc/signalfuncs.c:68 utils/adt/mcxtfuncs.c:204 #, c-format msgid "PID %d is not a PostgreSQL server process" msgstr "PID %d не относится к серверному процессу PostgreSQL" -#: storage/ipc/signalfuncs.c:98 storage/lmgr/proc.c:1366 +#: storage/ipc/signalfuncs.c:99 storage/lmgr/proc.c:1454 +#: utils/adt/mcxtfuncs.c:212 #, c-format msgid "could not send signal to process %d: %m" msgstr "отправить сигнал процессу %d не удалось: %m" -#: storage/ipc/signalfuncs.c:118 +#: storage/ipc/signalfuncs.c:119 #, c-format msgid "must be a superuser to cancel superuser query" msgstr "для отмены запроса суперпользователя нужно быть суперпользователем" -#: storage/ipc/signalfuncs.c:123 +#: storage/ipc/signalfuncs.c:124 #, c-format msgid "" "must be a member of the role whose query is being canceled or member of " @@ -21930,181 +22839,238 @@ msgstr "" "необходимо быть членом роли, запрос которой отменяется, или роли " "pg_signal_backend" +#: storage/ipc/signalfuncs.c:165 +#, c-format +msgid "could not check the existence of the backend with PID %d: %m" +msgstr "" +"не удалось проверить существование обслуживающего процесса с PID %d: %m" + #: storage/ipc/signalfuncs.c:183 #, c-format +msgid "backend with PID %d did not terminate within %lld millisecond" +msgid_plural "backend with PID %d did not terminate within %lld milliseconds" +msgstr[0] "обслуживающий процесс с PID %d не завершился за %lld мс" +msgstr[1] "обслуживающий процесс с PID %d не завершился за %lld мс" +msgstr[2] "обслуживающий процесс с PID %d не завершился за %lld мс" + +#: storage/ipc/signalfuncs.c:214 +#, c-format +msgid "\"timeout\" must not be negative" +msgstr "\"timeout\" не может быть отрицательным" + +#: storage/ipc/signalfuncs.c:266 +#, c-format msgid "must be superuser to rotate log files with adminpack 1.0" msgstr "" "прокручивать файлы протоколов, используя adminpack 1.0, может только " "суперпользователь" #. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:185 utils/adt/genfile.c:253 +#: storage/ipc/signalfuncs.c:268 utils/adt/genfile.c:255 #, c-format msgid "Consider using %s, which is part of core, instead." msgstr "Рассмотрите возможность использования функции %s, включённой в ядро." -#: storage/ipc/signalfuncs.c:191 storage/ipc/signalfuncs.c:211 +#: storage/ipc/signalfuncs.c:274 storage/ipc/signalfuncs.c:294 #, c-format msgid "rotation not possible because log collection not active" msgstr "прокрутка невозможна, так как протоколирование отключено" -#: storage/ipc/standby.c:668 tcop/postgres.c:3189 +#: storage/ipc/standby.c:305 +#, c-format +msgid "recovery still waiting after %ld.%03d ms: %s" +msgstr "процесс восстановления продолжает ожидание после %ld.%03d мс: %s" + +#: storage/ipc/standby.c:314 +#, c-format +msgid "recovery finished waiting after %ld.%03d ms: %s" +msgstr "процесс восстановления завершил ожидание после %ld.%03d мс: %s" + +#: storage/ipc/standby.c:878 tcop/postgres.c:3317 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "" "выполнение оператора отменено из-за конфликта с процессом восстановления" -#: storage/ipc/standby.c:669 tcop/postgres.c:2469 +#: storage/ipc/standby.c:879 tcop/postgres.c:2471 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "" "Транзакция пользователя привела к взаимоблокировке с процессом " "восстановления." +#: storage/ipc/standby.c:1423 +msgid "unknown reason" +msgstr "причина неизвестна" + +#: storage/ipc/standby.c:1428 +msgid "recovery conflict on buffer pin" +msgstr "конфликт восстановления при закреплении буфера" + +#: storage/ipc/standby.c:1431 +msgid "recovery conflict on lock" +msgstr "конфликт восстановления при получении блокировки" + +#: storage/ipc/standby.c:1434 +msgid "recovery conflict on tablespace" +msgstr "конфликт восстановления при обращении к табличному пространству" + +#: storage/ipc/standby.c:1437 +msgid "recovery conflict on snapshot" +msgstr "конфликт восстановления при получении снимка" + +#: storage/ipc/standby.c:1440 +msgid "recovery conflict on buffer deadlock" +msgstr "конфликт восстановления из-за взаимной блокировки буфера" + +#: storage/ipc/standby.c:1443 +msgid "recovery conflict on database" +msgstr "конфликт восстановления при обращении к базе данных" + #: storage/large_object/inv_api.c:191 #, c-format msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" msgstr "" "в записи pg_largeobject для OID %u, стр. %d неверный размер поля данных (%d)" -#: storage/large_object/inv_api.c:272 +#: storage/large_object/inv_api.c:274 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "неверные флаги для открытия большого объекта: %d" -#: storage/large_object/inv_api.c:462 +#: storage/large_object/inv_api.c:457 #, c-format msgid "invalid whence setting: %d" msgstr "неверное значение ориентира: %d" -#: storage/large_object/inv_api.c:634 +#: storage/large_object/inv_api.c:629 #, c-format msgid "invalid large object write request size: %d" msgstr "неверный размер записи большого объекта: %d" -#: storage/lmgr/deadlock.c:1124 +#: storage/lmgr/deadlock.c:1122 #, c-format msgid "Process %d waits for %s on %s; blocked by process %d." msgstr "" "Процесс %d ожидает в режиме %s блокировку \"%s\"; заблокирован процессом %d." -#: storage/lmgr/deadlock.c:1143 +#: storage/lmgr/deadlock.c:1141 #, c-format msgid "Process %d: %s" msgstr "Процесс %d: %s" -#: storage/lmgr/deadlock.c:1152 +#: storage/lmgr/deadlock.c:1150 #, c-format msgid "deadlock detected" msgstr "обнаружена взаимоблокировка" -#: storage/lmgr/deadlock.c:1155 +#: storage/lmgr/deadlock.c:1153 #, c-format msgid "See server log for query details." msgstr "Подробности запроса смотрите в протоколе сервера." -#: storage/lmgr/lmgr.c:830 +#: storage/lmgr/lmgr.c:831 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "при изменении кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:833 +#: storage/lmgr/lmgr.c:834 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "при удалении кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:836 +#: storage/lmgr/lmgr.c:837 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "при блокировке кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:839 +#: storage/lmgr/lmgr.c:840 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "при блокировке изменённой версии (%u,%u) кортежа в отношении \"%s\"" -#: storage/lmgr/lmgr.c:842 +#: storage/lmgr/lmgr.c:843 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "при добавлении кортежа индекса (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:845 +#: storage/lmgr/lmgr.c:846 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "при проверке уникальности кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:848 +#: storage/lmgr/lmgr.c:849 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "при перепроверке изменённого кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:851 +#: storage/lmgr/lmgr.c:852 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "" "при проверке ограничения-исключения для кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:1105 +#: storage/lmgr/lmgr.c:1107 #, c-format msgid "relation %u of database %u" msgstr "отношение %u базы данных %u" -#: storage/lmgr/lmgr.c:1111 +#: storage/lmgr/lmgr.c:1113 #, c-format msgid "extension of relation %u of database %u" msgstr "расширение отношения %u базы данных %u" -#: storage/lmgr/lmgr.c:1117 +#: storage/lmgr/lmgr.c:1119 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid базы %u" -#: storage/lmgr/lmgr.c:1122 +#: storage/lmgr/lmgr.c:1124 #, c-format msgid "page %u of relation %u of database %u" msgstr "страница %u отношения %u базы данных %u" -#: storage/lmgr/lmgr.c:1129 +#: storage/lmgr/lmgr.c:1131 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "кортеж (%u,%u) отношения %u базы данных %u" -#: storage/lmgr/lmgr.c:1137 +#: storage/lmgr/lmgr.c:1139 #, c-format msgid "transaction %u" msgstr "транзакция %u" -#: storage/lmgr/lmgr.c:1142 +#: storage/lmgr/lmgr.c:1144 #, c-format msgid "virtual transaction %d/%u" msgstr "виртуальная транзакция %d/%u" -#: storage/lmgr/lmgr.c:1148 +#: storage/lmgr/lmgr.c:1150 #, c-format msgid "speculative token %u of transaction %u" msgstr "спекулятивный маркер %u транзакции %u" -#: storage/lmgr/lmgr.c:1154 +#: storage/lmgr/lmgr.c:1156 #, c-format msgid "object %u of class %u of database %u" msgstr "объект %u класса %u базы данных %u" -#: storage/lmgr/lmgr.c:1162 +#: storage/lmgr/lmgr.c:1164 #, c-format msgid "user lock [%u,%u,%u]" msgstr "пользовательская блокировка [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1169 +#: storage/lmgr/lmgr.c:1171 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "рекомендательная блокировка [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1177 +#: storage/lmgr/lmgr.c:1179 #, c-format msgid "unrecognized locktag type %d" msgstr "нераспознанный тип блокировки %d" -#: storage/lmgr/lock.c:803 +#: storage/lmgr/lock.c:802 #, c-format msgid "" "cannot acquire lock mode %s on database objects while recovery is in progress" @@ -22112,7 +23078,7 @@ msgstr "" "пока выполняется восстановление, нельзя получить блокировку объектов базы " "данных в режиме %s" -#: storage/lmgr/lock.c:805 +#: storage/lmgr/lock.c:804 #, c-format msgid "" "Only RowExclusiveLock or less can be acquired on database objects during " @@ -22121,13 +23087,13 @@ msgstr "" "В процессе восстановления для объектов базы данных может быть получена " "только блокировка RowExclusiveLock или менее сильная." -#: storage/lmgr/lock.c:983 storage/lmgr/lock.c:1021 storage/lmgr/lock.c:2846 -#: storage/lmgr/lock.c:4168 storage/lmgr/lock.c:4233 storage/lmgr/lock.c:4540 +#: storage/lmgr/lock.c:982 storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 +#: storage/lmgr/lock.c:4259 storage/lmgr/lock.c:4324 storage/lmgr/lock.c:4674 #, c-format msgid "You might need to increase max_locks_per_transaction." msgstr "Возможно, следует увеличить параметр max_locks_per_transaction." -#: storage/lmgr/lock.c:3284 storage/lmgr/lock.c:3400 +#: storage/lmgr/lock.c:3300 storage/lmgr/lock.c:3368 storage/lmgr/lock.c:3484 #, c-format msgid "" "cannot PREPARE while holding both session-level and transaction-level locks " @@ -22159,18 +23125,13 @@ msgstr "" "в пуле недостаточно элементов для записи о потенциальном конфликте чтения/" "записи" -#: storage/lmgr/predicate.c:1610 -#, c-format -msgid "deferrable snapshot was unsafe; trying a new one" -msgstr "откладываемый снимок был небезопасен; пробуем более новый" - -#: storage/lmgr/predicate.c:1699 +#: storage/lmgr/predicate.c:1694 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "" "Параметр \"default_transaction_isolation\" имеет значение \"serializable\"." -#: storage/lmgr/predicate.c:1700 +#: storage/lmgr/predicate.c:1695 #, c-format msgid "" "You can use \"SET default_transaction_isolation = 'repeatable read'\" to " @@ -22179,34 +23140,34 @@ msgstr "" "Чтобы изменить режим по умолчанию, выполните \"SET " "default_transaction_isolation = 'repeatable read'\"." -#: storage/lmgr/predicate.c:1751 +#: storage/lmgr/predicate.c:1746 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "транзакция, импортирующая снимок, не должна быть READ ONLY DEFERRABLE" -#: storage/lmgr/predicate.c:1830 utils/time/snapmgr.c:623 -#: utils/time/snapmgr.c:629 +#: storage/lmgr/predicate.c:1825 utils/time/snapmgr.c:567 +#: utils/time/snapmgr.c:573 #, c-format msgid "could not import the requested snapshot" msgstr "не удалось импортировать запрошенный снимок" -#: storage/lmgr/predicate.c:1831 utils/time/snapmgr.c:630 +#: storage/lmgr/predicate.c:1826 utils/time/snapmgr.c:574 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "Исходный процесс с PID %d уже не работает." -#: storage/lmgr/predicate.c:2477 storage/lmgr/predicate.c:2492 -#: storage/lmgr/predicate.c:3974 +#: storage/lmgr/predicate.c:2471 storage/lmgr/predicate.c:2486 +#: storage/lmgr/predicate.c:3968 #, c-format msgid "You might need to increase max_pred_locks_per_transaction." msgstr "" "Возможно, следует увеличить значение параметра max_locks_per_transaction." -#: storage/lmgr/predicate.c:4105 storage/lmgr/predicate.c:4141 -#: storage/lmgr/predicate.c:4174 storage/lmgr/predicate.c:4182 -#: storage/lmgr/predicate.c:4221 storage/lmgr/predicate.c:4463 -#: storage/lmgr/predicate.c:4800 storage/lmgr/predicate.c:4812 -#: storage/lmgr/predicate.c:4855 storage/lmgr/predicate.c:4893 +#: storage/lmgr/predicate.c:4099 storage/lmgr/predicate.c:4135 +#: storage/lmgr/predicate.c:4168 storage/lmgr/predicate.c:4176 +#: storage/lmgr/predicate.c:4215 storage/lmgr/predicate.c:4457 +#: storage/lmgr/predicate.c:4794 storage/lmgr/predicate.c:4806 +#: storage/lmgr/predicate.c:4849 storage/lmgr/predicate.c:4887 #, c-format msgid "" "could not serialize access due to read/write dependencies among transactions" @@ -22214,16 +23175,16 @@ msgstr "" "не удалось сериализовать доступ из-за зависимостей чтения/записи между " "транзакциями" -#: storage/lmgr/predicate.c:4107 storage/lmgr/predicate.c:4143 -#: storage/lmgr/predicate.c:4176 storage/lmgr/predicate.c:4184 -#: storage/lmgr/predicate.c:4223 storage/lmgr/predicate.c:4465 -#: storage/lmgr/predicate.c:4802 storage/lmgr/predicate.c:4814 -#: storage/lmgr/predicate.c:4857 storage/lmgr/predicate.c:4895 +#: storage/lmgr/predicate.c:4101 storage/lmgr/predicate.c:4137 +#: storage/lmgr/predicate.c:4170 storage/lmgr/predicate.c:4178 +#: storage/lmgr/predicate.c:4217 storage/lmgr/predicate.c:4459 +#: storage/lmgr/predicate.c:4796 storage/lmgr/predicate.c:4808 +#: storage/lmgr/predicate.c:4851 storage/lmgr/predicate.c:4889 #, c-format msgid "The transaction might succeed if retried." msgstr "Транзакция может завершиться успешно при следующей попытке." -#: storage/lmgr/proc.c:358 +#: storage/lmgr/proc.c:357 #, c-format msgid "" "number of requested standby connections exceeds max_wal_senders (currently " @@ -22232,17 +23193,7 @@ msgstr "" "число запрошенных подключений резервных серверов превосходит max_wal_senders " "(сейчас: %d)" -#: storage/lmgr/proc.c:1337 -#, c-format -msgid "Process %d waits for %s on %s." -msgstr "Процесс %d ожидает в режиме %s блокировку %s." - -#: storage/lmgr/proc.c:1348 -#, c-format -msgid "sending cancel to blocking autovacuum PID %d" -msgstr "снятие блокирующего процесса автоочистки (PID %d)" - -#: storage/lmgr/proc.c:1468 +#: storage/lmgr/proc.c:1551 #, c-format msgid "" "process %d avoided deadlock for %s on %s by rearranging queue order after " @@ -22251,7 +23202,7 @@ msgstr "" "процесс %d избежал взаимоблокировки, ожидая в режиме %s блокировку \"%s\", " "изменив порядок очереди через %ld.%03d мс" -#: storage/lmgr/proc.c:1483 +#: storage/lmgr/proc.c:1566 #, c-format msgid "" "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" @@ -22259,118 +23210,107 @@ msgstr "" "процесс %d обнаружил взаимоблокировку, ожидая в режиме %s блокировку \"%s\" " "в течение %ld.%03d мс" -#: storage/lmgr/proc.c:1492 +#: storage/lmgr/proc.c:1575 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "" "процесс %d продолжает ожидать в режиме %s блокировку \"%s\" в течение %ld." "%03d мс" -#: storage/lmgr/proc.c:1499 +#: storage/lmgr/proc.c:1582 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "процесс %d получил в режиме %s блокировку \"%s\" через %ld.%03d мс" -#: storage/lmgr/proc.c:1515 +#: storage/lmgr/proc.c:1599 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "" "процесс %d не смог получить в режиме %s блокировку \"%s\" за %ld.%03d мс" -#: storage/page/bufpage.c:164 +#: storage/page/bufpage.c:152 #, c-format msgid "page verification failed, calculated checksum %u but expected %u" msgstr "" "ошибка проверки страницы: получена контрольная сумма %u, а ожидалась - %u" -#: storage/page/bufpage.c:229 storage/page/bufpage.c:523 -#: storage/page/bufpage.c:760 storage/page/bufpage.c:893 -#: storage/page/bufpage.c:989 storage/page/bufpage.c:1101 +#: storage/page/bufpage.c:217 storage/page/bufpage.c:739 +#: storage/page/bufpage.c:1066 storage/page/bufpage.c:1201 +#: storage/page/bufpage.c:1307 storage/page/bufpage.c:1419 #, c-format msgid "corrupted page pointers: lower = %u, upper = %u, special = %u" msgstr "" "испорченные указатели страницы: нижний = %u, верхний = %u, спецобласть = %u" -#: storage/page/bufpage.c:545 +#: storage/page/bufpage.c:768 #, c-format msgid "corrupted line pointer: %u" msgstr "испорченный линейный указатель: %u" -#: storage/page/bufpage.c:572 storage/page/bufpage.c:944 +#: storage/page/bufpage.c:795 storage/page/bufpage.c:1259 #, c-format msgid "corrupted item lengths: total %u, available space %u" msgstr "испорченный размер элемента (общий размер: %u, доступно: %u)" -#: storage/page/bufpage.c:779 storage/page/bufpage.c:917 -#: storage/page/bufpage.c:1005 storage/page/bufpage.c:1117 +#: storage/page/bufpage.c:1085 storage/page/bufpage.c:1226 +#: storage/page/bufpage.c:1323 storage/page/bufpage.c:1435 #, c-format msgid "corrupted line pointer: offset = %u, size = %u" msgstr "испорченный линейный указатель: смещение = %u, размер = %u" -#: storage/smgr/md.c:317 storage/smgr/md.c:874 -#, c-format -msgid "could not truncate file \"%s\": %m" -msgstr "не удалось обрезать файл \"%s\": %m" - -#: storage/smgr/md.c:445 +#: storage/smgr/md.c:435 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "не удалось увеличить файл \"%s\" до блока %u" -#: storage/smgr/md.c:460 +#: storage/smgr/md.c:450 #, c-format msgid "could not extend file \"%s\": %m" msgstr "не удалось увеличить файл \"%s\": %m" -#: storage/smgr/md.c:462 storage/smgr/md.c:469 storage/smgr/md.c:757 +#: storage/smgr/md.c:452 storage/smgr/md.c:459 storage/smgr/md.c:747 #, c-format msgid "Check free disk space." msgstr "Проверьте, есть ли место на диске." -#: storage/smgr/md.c:466 +#: storage/smgr/md.c:456 #, c-format msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgstr "не удалось увеличить файл \"%s\" (записано байт: %d из %d) в блоке %u" -#: storage/smgr/md.c:678 +#: storage/smgr/md.c:668 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "не удалось прочитать блок %u в файле \"%s\": %m" -#: storage/smgr/md.c:694 +#: storage/smgr/md.c:684 #, c-format msgid "could not read block %u in file \"%s\": read only %d of %d bytes" msgstr "не удалось прочитать блок %u в файле \"%s\" (прочитано байт: %d из %d)" -#: storage/smgr/md.c:748 +#: storage/smgr/md.c:738 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "не удалось записать блок %u в файл \"%s\": %m" -#: storage/smgr/md.c:753 +#: storage/smgr/md.c:743 #, c-format msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" msgstr "не удалось записать блок %u в файл \"%s\" (записано байт: %d из %d)" -#: storage/smgr/md.c:845 +#: storage/smgr/md.c:837 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "" "не удалось обрезать файл \"%s\" (требуемая длина в блоках: %u, но сейчас он " "содержит %u)" -#: storage/smgr/md.c:900 +#: storage/smgr/md.c:892 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "не удалось обрезать файл \"%s\" до нужного числа блоков (%u): %m" -#: storage/smgr/md.c:995 -#, c-format -msgid "could not forward fsync request because request queue is full" -msgstr "" -"не удалось отправить запрос синхронизации с ФС (очередь запросов переполнена)" - -#: storage/smgr/md.c:1294 +#: storage/smgr/md.c:1286 #, c-format msgid "" "could not open file \"%s\" (target block %u): previous segment is only %u " @@ -22379,111 +23319,95 @@ msgstr "" "не удалось открыть файл file \"%s\" (целевой блок %u): недостаточно блоков в " "предыдущем сегменте (всего %u)" -#: storage/smgr/md.c:1308 +#: storage/smgr/md.c:1300 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "не удалось открыть файл file \"%s\" (целевой блок %u): %m" -#: storage/sync/sync.c:401 -#, c-format -msgid "could not fsync file \"%s\" but retrying: %m" -msgstr "" -"не удалось синхронизировать с ФС файл \"%s\", последует повторная попытка: %m" - -#: tcop/fastpath.c:109 tcop/fastpath.c:461 tcop/fastpath.c:591 +#: tcop/fastpath.c:148 #, c-format -msgid "invalid argument size %d in function call message" -msgstr "неверный размер аргумента (%d) в сообщении вызова функции" +msgid "cannot call function \"%s\" via fastpath interface" +msgstr "вызвать функцию \"%s\" через интерфейс fastpath нельзя" -#: tcop/fastpath.c:307 +#: tcop/fastpath.c:233 #, c-format msgid "fastpath function call: \"%s\" (OID %u)" -msgstr "вызов функции fastpath: \"%s\" (OID %u)" +msgstr "вызов функции (через fastpath): \"%s\" (OID %u)" -#: tcop/fastpath.c:389 tcop/postgres.c:1323 tcop/postgres.c:1581 -#: tcop/postgres.c:2013 tcop/postgres.c:2250 +#: tcop/fastpath.c:312 tcop/postgres.c:1298 tcop/postgres.c:1556 +#: tcop/postgres.c:2015 tcop/postgres.c:2252 #, c-format msgid "duration: %s ms" msgstr "продолжительность: %s мс" -#: tcop/fastpath.c:393 +#: tcop/fastpath.c:316 #, c-format msgid "duration: %s ms fastpath function call: \"%s\" (OID %u)" -msgstr "продолжительность %s мс, вызов функции fastpath: \"%s\" (OID %u)" +msgstr "" +"продолжительность %s мс, вызов функции (через fastpath): \"%s\" (OID %u)" -#: tcop/fastpath.c:429 tcop/fastpath.c:556 +#: tcop/fastpath.c:352 #, c-format msgid "function call message contains %d arguments but function requires %d" msgstr "" "сообщение вызова функции содержит неверное число аргументов (%d, а требуется " "%d)" -#: tcop/fastpath.c:437 +#: tcop/fastpath.c:360 #, c-format msgid "function call message contains %d argument formats but %d arguments" msgstr "" "сообщение вызова функции содержит неверное число форматов (%d, а аргументов " "%d)" -#: tcop/fastpath.c:524 tcop/fastpath.c:607 +#: tcop/fastpath.c:384 #, c-format -msgid "incorrect binary data format in function argument %d" -msgstr "неправильный формат двоичных данных в аргументе функции %d" +msgid "invalid argument size %d in function call message" +msgstr "неверный размер аргумента (%d) в сообщении вызова функции" -#: tcop/postgres.c:355 tcop/postgres.c:391 tcop/postgres.c:418 +#: tcop/fastpath.c:447 #, c-format -msgid "unexpected EOF on client connection" -msgstr "неожиданный обрыв соединения с клиентом" +msgid "incorrect binary data format in function argument %d" +msgstr "неправильный формат двоичных данных в аргументе функции %d" -#: tcop/postgres.c:441 tcop/postgres.c:453 tcop/postgres.c:464 -#: tcop/postgres.c:476 tcop/postgres.c:4553 +#: tcop/postgres.c:446 tcop/postgres.c:4716 #, c-format msgid "invalid frontend message type %d" msgstr "неправильный тип клиентского сообщения %d" -#: tcop/postgres.c:1042 +#: tcop/postgres.c:1015 #, c-format msgid "statement: %s" msgstr "оператор: %s" -#: tcop/postgres.c:1328 +#: tcop/postgres.c:1303 #, c-format msgid "duration: %s ms statement: %s" msgstr "продолжительность: %s мс, оператор: %s" -#: tcop/postgres.c:1377 -#, c-format -msgid "parse %s: %s" -msgstr "разбор %s: %s" - -#: tcop/postgres.c:1434 +#: tcop/postgres.c:1409 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "в подготовленный оператор нельзя вставить несколько команд" -#: tcop/postgres.c:1586 +#: tcop/postgres.c:1561 #, c-format msgid "duration: %s ms parse %s: %s" -msgstr "продолжительность: %s мс, разбор %s: %s" - -#: tcop/postgres.c:1633 -#, c-format -msgid "bind %s to %s" -msgstr "привязка %s к %s" +msgstr "продолжительность: %s мс, разбор %s: %s" # [SM]: TO REVIEW -#: tcop/postgres.c:1652 tcop/postgres.c:2516 +#: tcop/postgres.c:1627 tcop/postgres.c:2567 #, c-format msgid "unnamed prepared statement does not exist" msgstr "безымянный подготовленный оператор не существует" -#: tcop/postgres.c:1693 +#: tcop/postgres.c:1668 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "" "неверное число форматов параметров в сообщении Bind (%d, а параметров %d)" -#: tcop/postgres.c:1699 +#: tcop/postgres.c:1674 #, c-format msgid "" "bind message supplies %d parameters, but prepared statement \"%s\" requires " @@ -22492,88 +23416,113 @@ msgstr "" "в сообщении Bind передано неверное число параметров (%d, а подготовленный " "оператор \"%s\" требует %d)" -#: tcop/postgres.c:1897 +#: tcop/postgres.c:1893 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "неверный формат двоичных данных в параметре Bind %d" -#: tcop/postgres.c:2018 +#: tcop/postgres.c:2020 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "продолжительность: %s мс, сообщение Bind %s%s%s: %s" -#: tcop/postgres.c:2068 tcop/postgres.c:2600 +#: tcop/postgres.c:2070 tcop/postgres.c:2651 #, c-format msgid "portal \"%s\" does not exist" msgstr "портал \"%s\" не существует" -#: tcop/postgres.c:2153 +#: tcop/postgres.c:2155 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2155 tcop/postgres.c:2258 +#: tcop/postgres.c:2157 tcop/postgres.c:2260 msgid "execute fetch from" msgstr "выборка из" -#: tcop/postgres.c:2156 tcop/postgres.c:2259 +#: tcop/postgres.c:2158 tcop/postgres.c:2261 msgid "execute" msgstr "выполнение" -#: tcop/postgres.c:2255 +#: tcop/postgres.c:2257 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "продолжительность: %s мс %s %s%s%s: %s" -#: tcop/postgres.c:2401 +#: tcop/postgres.c:2403 #, c-format msgid "prepare: %s" msgstr "подготовка: %s" -#: tcop/postgres.c:2426 +#: tcop/postgres.c:2428 #, c-format msgid "parameters: %s" msgstr "параметры: %s" -#: tcop/postgres.c:2441 +#: tcop/postgres.c:2443 #, c-format msgid "abort reason: recovery conflict" msgstr "причина прерывания: конфликт при восстановлении" -#: tcop/postgres.c:2457 +#: tcop/postgres.c:2459 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "Пользователь удерживал фиксатор разделяемого буфера слишком долго." -#: tcop/postgres.c:2460 +#: tcop/postgres.c:2462 #, c-format msgid "User was holding a relation lock for too long." msgstr "Пользователь удерживал блокировку таблицы слишком долго." -#: tcop/postgres.c:2463 +#: tcop/postgres.c:2465 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "" "Пользователь использовал табличное пространство, которое должно быть удалено." -#: tcop/postgres.c:2466 +#: tcop/postgres.c:2468 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "" "Запросу пользователя нужно было видеть версии строк, которые должны быть " "удалены." -#: tcop/postgres.c:2472 +#: tcop/postgres.c:2474 #, c-format msgid "User was connected to a database that must be dropped." msgstr "Пользователь был подключён к базе данных, которая должна быть удалена." -#: tcop/postgres.c:2796 +#: tcop/postgres.c:2513 +#, c-format +msgid "portal \"%s\" parameter $%d = %s" +msgstr "портал \"%s\", параметр $%d = %s" + +#: tcop/postgres.c:2516 +#, c-format +msgid "portal \"%s\" parameter $%d" +msgstr "портал \"%s\", параметр $%d" + +#: tcop/postgres.c:2522 +#, c-format +msgid "unnamed portal parameter $%d = %s" +msgstr "неименованный портал, параметр $%d = %s" + +#: tcop/postgres.c:2525 +#, c-format +msgid "unnamed portal parameter $%d" +msgstr "неименованный портал, параметр $%d" + +#: tcop/postgres.c:2871 +#, c-format +msgid "terminating connection because of unexpected SIGQUIT signal" +msgstr "закрытие подключения из-за неожиданного сигнала SIGQUIT" + +#: tcop/postgres.c:2877 #, c-format msgid "terminating connection because of crash of another server process" msgstr "закрытие подключения из-за краха другого серверного процесса" -#: tcop/postgres.c:2797 +#: tcop/postgres.c:2878 #, c-format msgid "" "The postmaster has commanded this server process to roll back the current " @@ -22582,9 +23531,9 @@ msgid "" msgstr "" "Управляющий процесс отдал команду этому серверному процессу откатить текущую " "транзакцию и завершиться, так как другой серверный процесс завершился " -"аварийно и возможно разрушил разделяемую память." +"аварийно и, возможно, разрушил разделяемую память." -#: tcop/postgres.c:2801 tcop/postgres.c:3119 +#: tcop/postgres.c:2882 tcop/postgres.c:3243 #, c-format msgid "" "In a moment you should be able to reconnect to the database and repeat your " @@ -22593,12 +23542,18 @@ msgstr "" "Вы сможете переподключиться к базе данных и повторить вашу команду сию " "минуту." -#: tcop/postgres.c:2883 +#: tcop/postgres.c:2889 +#, c-format +msgid "terminating connection due to immediate shutdown command" +msgstr "" +"закрытие подключения вследствие получения команды для немедленного отключения" + +#: tcop/postgres.c:2975 #, c-format msgid "floating-point exception" msgstr "исключение в операции с плавающей точкой" -#: tcop/postgres.c:2884 +#: tcop/postgres.c:2976 #, c-format msgid "" "An invalid floating-point operation was signaled. This probably means an out-" @@ -22608,72 +23563,72 @@ msgstr "" "оказался вне допустимых рамок или произошла ошибка вычисления, например, " "деление на ноль." -#: tcop/postgres.c:3049 +#: tcop/postgres.c:3147 #, c-format msgid "canceling authentication due to timeout" msgstr "отмена проверки подлинности из-за тайм-аута" -#: tcop/postgres.c:3053 +#: tcop/postgres.c:3151 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "прекращение процесса автоочистки по команде администратора" -#: tcop/postgres.c:3057 +#: tcop/postgres.c:3155 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "завершение обработчика логической репликации по команде администратора" -#: tcop/postgres.c:3061 -#, c-format -msgid "logical replication launcher shutting down" -msgstr "процесс запуска логической репликации остановлен" - -#: tcop/postgres.c:3074 tcop/postgres.c:3084 tcop/postgres.c:3117 +#: tcop/postgres.c:3172 tcop/postgres.c:3182 tcop/postgres.c:3241 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "закрытие подключения из-за конфликта с процессом восстановления" -#: tcop/postgres.c:3090 +#: tcop/postgres.c:3193 #, c-format msgid "terminating connection due to administrator command" msgstr "закрытие подключения по команде администратора" -#: tcop/postgres.c:3100 +#: tcop/postgres.c:3224 #, c-format msgid "connection to client lost" msgstr "подключение к клиенту потеряно" -#: tcop/postgres.c:3166 +#: tcop/postgres.c:3294 #, c-format msgid "canceling statement due to lock timeout" msgstr "выполнение оператора отменено из-за тайм-аута блокировки" -#: tcop/postgres.c:3173 +#: tcop/postgres.c:3301 #, c-format msgid "canceling statement due to statement timeout" msgstr "выполнение оператора отменено из-за тайм-аута" -#: tcop/postgres.c:3180 +#: tcop/postgres.c:3308 #, c-format msgid "canceling autovacuum task" msgstr "отмена задачи автоочистки" -#: tcop/postgres.c:3203 +#: tcop/postgres.c:3331 #, c-format msgid "canceling statement due to user request" msgstr "выполнение оператора отменено по запросу пользователя" -#: tcop/postgres.c:3213 +#: tcop/postgres.c:3345 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "закрытие подключения из-за тайм-аута простоя в транзакции" -#: tcop/postgres.c:3330 +#: tcop/postgres.c:3356 +#, c-format +msgid "terminating connection due to idle-session timeout" +msgstr "закрытие подключения из-за тайм-аута простоя сеанса" + +#: tcop/postgres.c:3475 #, c-format msgid "stack depth limit exceeded" msgstr "превышен предел глубины стека" -#: tcop/postgres.c:3331 +#: tcop/postgres.c:3476 #, c-format msgid "" "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), " @@ -22683,12 +23638,12 @@ msgstr "" "КБ), предварительно убедившись, что ОС предоставляет достаточный размер " "стека." -#: tcop/postgres.c:3394 +#: tcop/postgres.c:3539 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "Значение \"max_stack_depth\" не должно превышать %ld КБ." -#: tcop/postgres.c:3396 +#: tcop/postgres.c:3541 #, c-format msgid "" "Increase the platform's stack depth limit via \"ulimit -s\" or local " @@ -22697,48 +23652,49 @@ msgstr "" "Увеличьте предел глубины стека в системе с помощью команды \"ulimit -s\" или " "эквивалента в вашей ОС." -#: tcop/postgres.c:3756 +#: tcop/postgres.c:3897 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "неверный аргумент командной строки для серверного процесса: %s" -#: tcop/postgres.c:3757 tcop/postgres.c:3763 +#: tcop/postgres.c:3898 tcop/postgres.c:3904 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Для дополнительной информации попробуйте \"%s --help\"." -#: tcop/postgres.c:3761 +#: tcop/postgres.c:3902 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: неверный аргумент командной строки: %s" -#: tcop/postgres.c:3823 +#: tcop/postgres.c:3965 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: не указаны ни база данных, ни пользователь" -#: tcop/postgres.c:4461 +#: tcop/postgres.c:4618 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "неверный подтип сообщения CLOSE: %d" -#: tcop/postgres.c:4496 +#: tcop/postgres.c:4653 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "неверный подтип сообщения DESCRIBE: %d" -#: tcop/postgres.c:4574 +#: tcop/postgres.c:4737 #, c-format msgid "fastpath function calls not supported in a replication connection" -msgstr "вызовы функции fastpath не поддерживаются для реплицирующих соединений" +msgstr "" +"вызовы функций через fastpath не поддерживаются для реплицирующих соединений" -#: tcop/postgres.c:4578 +#: tcop/postgres.c:4741 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "" "протокол расширенных запросов не поддерживается для реплицирующих соединений" -#: tcop/postgres.c:4755 +#: tcop/postgres.c:4918 #, c-format msgid "" "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s" @@ -22747,53 +23703,59 @@ msgstr "" "отключение: время сеанса: %d:%02d:%02d.%03d пользователь=%s база данных=%s " "компьютер=%s%s%s" -#: tcop/pquery.c:629 +#: tcop/pquery.c:638 #, c-format msgid "bind message has %d result formats but query has %d columns" msgstr "" "число форматов результатов в сообщении Bind (%d) не равно числу столбцов в " "запросе (%d)" -#: tcop/pquery.c:932 +#: tcop/pquery.c:941 tcop/pquery.c:1703 #, c-format msgid "cursor can only scan forward" msgstr "курсор может сканировать только вперёд" -#: tcop/pquery.c:933 +#: tcop/pquery.c:942 tcop/pquery.c:1704 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Добавьте в его объявление SCROLL, чтобы он мог перемещаться назад." #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:413 +#: tcop/utility.c:414 #, c-format msgid "cannot execute %s in a read-only transaction" msgstr "в транзакции в режиме \"только чтение\" нельзя выполнить %s" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:431 +#: tcop/utility.c:432 #, c-format msgid "cannot execute %s during a parallel operation" msgstr "выполнить %s во время параллельных операций нельзя" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:450 +#: tcop/utility.c:451 #, c-format msgid "cannot execute %s during recovery" msgstr "выполнить %s во время восстановления нельзя" #. translator: %s is name of a SQL command, eg PREPARE -#: tcop/utility.c:468 +#: tcop/utility.c:469 #, c-format msgid "cannot execute %s within security-restricted operation" msgstr "в рамках операции с ограничениями по безопасности нельзя выполнить %s" -#: tcop/utility.c:912 +#. translator: %s is name of a SQL command, eg LISTEN +#: tcop/utility.c:820 +#, c-format +msgid "cannot execute %s within a background process" +msgstr "выполнять %s в фоновом процессе нельзя" + +#: tcop/utility.c:945 #, c-format msgid "must be superuser to do CHECKPOINT" msgstr "для выполнения CHECKPOINT нужно быть суперпользователем" -#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:620 +#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 #, c-format msgid "multiple DictFile parameters" msgstr "повторяющийся параметр DictFile" @@ -22813,7 +23775,7 @@ msgstr "нераспознанный параметр ispell: \"%s\"" msgid "missing AffFile parameter" msgstr "отсутствует параметр AffFile" -#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:644 +#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:639 #, c-format msgid "missing DictFile parameter" msgstr "отсутствует параметр DictFile" @@ -22863,67 +23825,67 @@ msgstr "неожиданный конец строки или лексемы" msgid "unexpected end of line" msgstr "неожиданный конец строки" -#: tsearch/dict_thesaurus.c:297 +#: tsearch/dict_thesaurus.c:292 #, c-format msgid "too many lexemes in thesaurus entry" msgstr "слишком много лексем в элементе тезауруса" -#: tsearch/dict_thesaurus.c:421 +#: tsearch/dict_thesaurus.c:416 #, c-format msgid "" "thesaurus sample word \"%s\" isn't recognized by subdictionary (rule %d)" msgstr "" "Слова-образца в тезаурусе \"%s\" нет во внутреннем словаре (правило %d)" -#: tsearch/dict_thesaurus.c:427 +#: tsearch/dict_thesaurus.c:422 #, c-format msgid "thesaurus sample word \"%s\" is a stop word (rule %d)" msgstr "Образец в тезаурусе содержит стоп-слово \"%s\" (правило %d)" -#: tsearch/dict_thesaurus.c:430 +#: tsearch/dict_thesaurus.c:425 #, c-format msgid "Use \"?\" to represent a stop word within a sample phrase." msgstr "Для представления стоп-слова внутри образца используйте \"?\"." -#: tsearch/dict_thesaurus.c:572 +#: tsearch/dict_thesaurus.c:567 #, c-format msgid "thesaurus substitute word \"%s\" is a stop word (rule %d)" msgstr "Подстановка в тезаурусе содержит стоп-слово \"%s\" (правило %d)" -#: tsearch/dict_thesaurus.c:579 +#: tsearch/dict_thesaurus.c:574 #, c-format msgid "" "thesaurus substitute word \"%s\" isn't recognized by subdictionary (rule %d)" msgstr "" "Слова-подстановки в тезаурусе \"%s\" нет во внутреннем словаре (правило %d)" -#: tsearch/dict_thesaurus.c:591 +#: tsearch/dict_thesaurus.c:586 #, c-format msgid "thesaurus substitute phrase is empty (rule %d)" msgstr "Фраза подстановки в тезаурусе не определена (правило %d)" -#: tsearch/dict_thesaurus.c:629 +#: tsearch/dict_thesaurus.c:624 #, c-format msgid "multiple Dictionary parameters" msgstr "повторяющийся параметр Dictionary" -#: tsearch/dict_thesaurus.c:636 +#: tsearch/dict_thesaurus.c:631 #, c-format msgid "unrecognized Thesaurus parameter: \"%s\"" msgstr "нераспознанный параметр тезауруса: \"%s\"" -#: tsearch/dict_thesaurus.c:648 +#: tsearch/dict_thesaurus.c:643 #, c-format msgid "missing Dictionary parameter" msgstr "отсутствует параметр Dictionary" #: tsearch/spell.c:380 tsearch/spell.c:397 tsearch/spell.c:406 -#: tsearch/spell.c:1036 +#: tsearch/spell.c:1062 #, c-format msgid "invalid affix flag \"%s\"" msgstr "неверный флаг аффиксов \"%s\"" -#: tsearch/spell.c:384 tsearch/spell.c:1040 +#: tsearch/spell.c:384 tsearch/spell.c:1066 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "флаг аффикса \"%s\" вне диапазона" @@ -22943,29 +23905,29 @@ msgstr "неверный флаг аффиксов \"%s\" со значение msgid "could not open dictionary file \"%s\": %m" msgstr "не удалось открыть файл словаря \"%s\": %m" -#: tsearch/spell.c:742 utils/adt/regexp.c:208 +#: tsearch/spell.c:763 utils/adt/regexp.c:208 #, c-format msgid "invalid regular expression: %s" msgstr "неверное регулярное выражение: %s" -#: tsearch/spell.c:956 tsearch/spell.c:973 tsearch/spell.c:990 -#: tsearch/spell.c:1007 tsearch/spell.c:1072 gram.y:15994 gram.y:16011 +#: tsearch/spell.c:982 tsearch/spell.c:999 tsearch/spell.c:1016 +#: tsearch/spell.c:1033 tsearch/spell.c:1098 gram.y:16629 gram.y:16646 #, c-format msgid "syntax error" msgstr "ошибка синтаксиса" -#: tsearch/spell.c:1163 tsearch/spell.c:1175 tsearch/spell.c:1734 -#: tsearch/spell.c:1739 tsearch/spell.c:1744 +#: tsearch/spell.c:1189 tsearch/spell.c:1201 tsearch/spell.c:1760 +#: tsearch/spell.c:1765 tsearch/spell.c:1770 #, c-format msgid "invalid affix alias \"%s\"" msgstr "неверное указание аффикса \"%s\"" -#: tsearch/spell.c:1216 tsearch/spell.c:1287 tsearch/spell.c:1436 +#: tsearch/spell.c:1242 tsearch/spell.c:1313 tsearch/spell.c:1462 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "не удалось открыть файл аффиксов \"%s\": %m" -#: tsearch/spell.c:1270 +#: tsearch/spell.c:1296 #, c-format msgid "" "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag " @@ -22974,32 +23936,32 @@ msgstr "" "словарь Ispell поддерживает для флага только значения \"default\", \"long\" " "и \"num\"" -#: tsearch/spell.c:1314 +#: tsearch/spell.c:1340 #, c-format msgid "invalid number of flag vector aliases" msgstr "неверное количество векторов флагов" -#: tsearch/spell.c:1337 +#: tsearch/spell.c:1363 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "количество псевдонимов превышает заданное число %d" -#: tsearch/spell.c:1552 +#: tsearch/spell.c:1578 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "файл аффиксов содержит команды и в старом, и в новом стиле" -#: tsearch/to_tsany.c:185 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1121 +#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1121 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "строка слишком длинна для tsvector (%d Б, при максимуме %d)" -#: tsearch/ts_locale.c:212 +#: tsearch/ts_locale.c:227 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "строка %d файла конфигурации \"%s\": \"%s\"" -#: tsearch/ts_locale.c:329 +#: tsearch/ts_locale.c:307 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "преобразовать wchar_t в кодировку сервера не удалось: %m" @@ -23031,152 +23993,152 @@ msgstr "не удалось открыть файл стоп-слов \"%s\": %m msgid "text search parser does not support headline creation" msgstr "анализатор текстового поиска не поддерживает создание выдержек" -#: tsearch/wparser_def.c:2585 +#: tsearch/wparser_def.c:2578 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "нераспознанный параметр функции выдержки: \"%s\"" -#: tsearch/wparser_def.c:2604 +#: tsearch/wparser_def.c:2597 #, c-format msgid "MinWords should be less than MaxWords" msgstr "Значение MinWords должно быть меньше MaxWords" -#: tsearch/wparser_def.c:2608 +#: tsearch/wparser_def.c:2601 #, c-format msgid "MinWords should be positive" msgstr "Значение MinWords должно быть положительным" -#: tsearch/wparser_def.c:2612 +#: tsearch/wparser_def.c:2605 #, c-format msgid "ShortWord should be >= 0" msgstr "Значение ShortWord должно быть >= 0" -#: tsearch/wparser_def.c:2616 +#: tsearch/wparser_def.c:2609 #, c-format msgid "MaxFragments should be >= 0" msgstr "Значение MaxFragments должно быть >= 0" -#: utils/adt/acl.c:171 utils/adt/name.c:93 +#: utils/adt/acl.c:165 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "слишком длинный идентификатор" -#: utils/adt/acl.c:172 utils/adt/name.c:94 +#: utils/adt/acl.c:166 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "Идентификатор должен быть короче %d байт." -#: utils/adt/acl.c:255 +#: utils/adt/acl.c:249 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "нераспознанное ключевое слово: \"%s\"" -#: utils/adt/acl.c:256 +#: utils/adt/acl.c:250 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "Ключевым словом ACL должно быть \"group\" или \"user\"." -#: utils/adt/acl.c:261 +#: utils/adt/acl.c:255 #, c-format msgid "missing name" msgstr "отсутствует имя" -#: utils/adt/acl.c:262 +#: utils/adt/acl.c:256 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "За ключевыми словами \"group\" или \"user\" должно следовать имя." -#: utils/adt/acl.c:268 +#: utils/adt/acl.c:262 #, c-format msgid "missing \"=\" sign" msgstr "отсутствует знак \"=\"" -#: utils/adt/acl.c:321 +#: utils/adt/acl.c:315 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "неверный символ режима: должен быть один из \"%s\"" -#: utils/adt/acl.c:343 +#: utils/adt/acl.c:337 #, c-format msgid "a name must follow the \"/\" sign" msgstr "за знаком \"/\" должно следовать имя" -#: utils/adt/acl.c:351 +#: utils/adt/acl.c:345 #, c-format msgid "defaulting grantor to user ID %u" msgstr "назначившим права считается пользователь с ID %u" -#: utils/adt/acl.c:537 +#: utils/adt/acl.c:531 #, c-format msgid "ACL array contains wrong data type" msgstr "Массив ACL содержит неверный тип данных" -#: utils/adt/acl.c:541 +#: utils/adt/acl.c:535 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "Массивы ACL должны быть одномерными" -#: utils/adt/acl.c:545 +#: utils/adt/acl.c:539 #, c-format msgid "ACL arrays must not contain null values" msgstr "Массивы ACL не должны содержать значения null" -#: utils/adt/acl.c:569 +#: utils/adt/acl.c:563 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "лишний мусор в конце спецификации ACL" -#: utils/adt/acl.c:1204 +#: utils/adt/acl.c:1198 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "привилегию назначения прав нельзя вернуть тому, кто назначил её вам" -#: utils/adt/acl.c:1265 +#: utils/adt/acl.c:1259 #, c-format msgid "dependent privileges exist" msgstr "существуют зависимые права" -#: utils/adt/acl.c:1266 +#: utils/adt/acl.c:1260 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Используйте CASCADE, чтобы отозвать и их." -#: utils/adt/acl.c:1520 +#: utils/adt/acl.c:1514 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert больше не поддерживается" -#: utils/adt/acl.c:1530 +#: utils/adt/acl.c:1524 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove больше не поддерживается" -#: utils/adt/acl.c:1616 utils/adt/acl.c:1670 +#: utils/adt/acl.c:1610 utils/adt/acl.c:1664 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "нераспознанный тип прав: \"%s\"" -#: utils/adt/acl.c:3470 utils/adt/regproc.c:103 utils/adt/regproc.c:278 +#: utils/adt/acl.c:3446 utils/adt/regproc.c:101 utils/adt/regproc.c:277 #, c-format msgid "function \"%s\" does not exist" msgstr "функция \"%s\" не существует" -#: utils/adt/acl.c:4946 +#: utils/adt/acl.c:4898 #, c-format msgid "must be member of role \"%s\"" msgstr "нужно быть членом роли \"%s\"" -#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:933 -#: utils/adt/arrayfuncs.c:1533 utils/adt/arrayfuncs.c:3236 -#: utils/adt/arrayfuncs.c:3376 utils/adt/arrayfuncs.c:5911 -#: utils/adt/arrayfuncs.c:6252 utils/adt/arrayutils.c:93 -#: utils/adt/arrayutils.c:102 utils/adt/arrayutils.c:109 +#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:936 +#: utils/adt/arrayfuncs.c:1544 utils/adt/arrayfuncs.c:3263 +#: utils/adt/arrayfuncs.c:3405 utils/adt/arrayfuncs.c:5980 +#: utils/adt/arrayfuncs.c:6321 utils/adt/arrayutils.c:94 +#: utils/adt/arrayutils.c:103 utils/adt/arrayutils.c:110 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "размер массива превышает предел (%d)" -#: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:466 -#: utils/adt/array_userfuncs.c:546 utils/adt/json.c:645 utils/adt/json.c:740 +#: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:467 +#: utils/adt/array_userfuncs.c:547 utils/adt/json.c:645 utils/adt/json.c:740 #: utils/adt/json.c:778 utils/adt/jsonb.c:1115 utils/adt/jsonb.c:1144 #: utils/adt/jsonb.c:1538 utils/adt/jsonb.c:1702 utils/adt/jsonb.c:1712 #, c-format @@ -23189,16 +24151,16 @@ msgid "input data type is not an array" msgstr "тип входных данных не является массивом" #: utils/adt/array_userfuncs.c:129 utils/adt/array_userfuncs.c:181 -#: utils/adt/arrayfuncs.c:1336 utils/adt/float.c:1243 utils/adt/float.c:1317 -#: utils/adt/float.c:3960 utils/adt/float.c:3974 utils/adt/int.c:759 -#: utils/adt/int.c:781 utils/adt/int.c:795 utils/adt/int.c:809 -#: utils/adt/int.c:840 utils/adt/int.c:861 utils/adt/int.c:978 -#: utils/adt/int.c:992 utils/adt/int.c:1006 utils/adt/int.c:1039 -#: utils/adt/int.c:1053 utils/adt/int.c:1067 utils/adt/int.c:1098 -#: utils/adt/int.c:1180 utils/adt/int.c:1244 utils/adt/int.c:1312 -#: utils/adt/int.c:1318 utils/adt/int8.c:1292 utils/adt/numeric.c:1559 -#: utils/adt/numeric.c:3435 utils/adt/varbit.c:1194 utils/adt/varbit.c:1582 -#: utils/adt/varlena.c:1097 utils/adt/varlena.c:3395 +#: utils/adt/float.c:1233 utils/adt/float.c:1307 utils/adt/float.c:4052 +#: utils/adt/float.c:4066 utils/adt/int.c:757 utils/adt/int.c:779 +#: utils/adt/int.c:793 utils/adt/int.c:807 utils/adt/int.c:838 +#: utils/adt/int.c:859 utils/adt/int.c:976 utils/adt/int.c:990 +#: utils/adt/int.c:1004 utils/adt/int.c:1037 utils/adt/int.c:1051 +#: utils/adt/int.c:1065 utils/adt/int.c:1096 utils/adt/int.c:1178 +#: utils/adt/int.c:1242 utils/adt/int.c:1310 utils/adt/int.c:1316 +#: utils/adt/int8.c:1299 utils/adt/numeric.c:1768 utils/adt/numeric.c:4203 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1114 +#: utils/adt/varlena.c:3426 #, c-format msgid "integer out of range" msgstr "целое вне диапазона" @@ -23238,174 +24200,177 @@ msgstr "Массивы с разными размерностями элемен msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "Массивы с разными размерностями несовместимы для соединения." -#: utils/adt/array_userfuncs.c:662 utils/adt/array_userfuncs.c:814 +#: utils/adt/array_userfuncs.c:663 utils/adt/array_userfuncs.c:815 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "поиск элементов в многомерных массивах не поддерживается" -#: utils/adt/array_userfuncs.c:686 +#: utils/adt/array_userfuncs.c:687 #, c-format msgid "initial position must not be null" msgstr "начальная позиция не может быть NULL" -#: utils/adt/arrayfuncs.c:270 utils/adt/arrayfuncs.c:284 -#: utils/adt/arrayfuncs.c:295 utils/adt/arrayfuncs.c:317 -#: utils/adt/arrayfuncs.c:332 utils/adt/arrayfuncs.c:346 -#: utils/adt/arrayfuncs.c:352 utils/adt/arrayfuncs.c:359 -#: utils/adt/arrayfuncs.c:490 utils/adt/arrayfuncs.c:506 -#: utils/adt/arrayfuncs.c:517 utils/adt/arrayfuncs.c:532 -#: utils/adt/arrayfuncs.c:553 utils/adt/arrayfuncs.c:583 -#: utils/adt/arrayfuncs.c:590 utils/adt/arrayfuncs.c:598 -#: utils/adt/arrayfuncs.c:632 utils/adt/arrayfuncs.c:655 -#: utils/adt/arrayfuncs.c:675 utils/adt/arrayfuncs.c:787 -#: utils/adt/arrayfuncs.c:796 utils/adt/arrayfuncs.c:826 -#: utils/adt/arrayfuncs.c:841 utils/adt/arrayfuncs.c:894 +#: utils/adt/arrayfuncs.c:271 utils/adt/arrayfuncs.c:285 +#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:318 +#: utils/adt/arrayfuncs.c:333 utils/adt/arrayfuncs.c:347 +#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 +#: utils/adt/arrayfuncs.c:493 utils/adt/arrayfuncs.c:509 +#: utils/adt/arrayfuncs.c:520 utils/adt/arrayfuncs.c:535 +#: utils/adt/arrayfuncs.c:556 utils/adt/arrayfuncs.c:586 +#: utils/adt/arrayfuncs.c:593 utils/adt/arrayfuncs.c:601 +#: utils/adt/arrayfuncs.c:635 utils/adt/arrayfuncs.c:658 +#: utils/adt/arrayfuncs.c:678 utils/adt/arrayfuncs.c:790 +#: utils/adt/arrayfuncs.c:799 utils/adt/arrayfuncs.c:829 +#: utils/adt/arrayfuncs.c:844 utils/adt/arrayfuncs.c:897 #, c-format msgid "malformed array literal: \"%s\"" msgstr "ошибочный литерал массива: \"%s\"" -#: utils/adt/arrayfuncs.c:271 +#: utils/adt/arrayfuncs.c:272 #, c-format msgid "\"[\" must introduce explicitly-specified array dimensions." msgstr "За \"[\" должны следовать явно задаваемые размерности массива." -#: utils/adt/arrayfuncs.c:285 +#: utils/adt/arrayfuncs.c:286 #, c-format msgid "Missing array dimension value." msgstr "Отсутствует значение размерности массива." -#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:333 +#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "После размерностей массива отсутствует \"%s\"." -#: utils/adt/arrayfuncs.c:305 utils/adt/arrayfuncs.c:2884 -#: utils/adt/arrayfuncs.c:2916 utils/adt/arrayfuncs.c:2931 +#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2910 +#: utils/adt/arrayfuncs.c:2942 utils/adt/arrayfuncs.c:2957 #, c-format msgid "upper bound cannot be less than lower bound" msgstr "верхняя граница не может быть меньше нижней" -#: utils/adt/arrayfuncs.c:318 +#: utils/adt/arrayfuncs.c:319 #, c-format msgid "Array value must start with \"{\" or dimension information." msgstr "Значение массива должно начинаться с \"{\" или указания размерности." -#: utils/adt/arrayfuncs.c:347 +#: utils/adt/arrayfuncs.c:348 #, c-format msgid "Array contents must start with \"{\"." msgstr "Содержимое массива должно начинаться с \"{\"." -#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 +#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 #, c-format msgid "Specified array dimensions do not match array contents." msgstr "Указанные размерности массива не соответствуют его содержимому." -#: utils/adt/arrayfuncs.c:491 utils/adt/arrayfuncs.c:518 -#: utils/adt/rangetypes.c:2181 utils/adt/rangetypes.c:2189 -#: utils/adt/rowtypes.c:210 utils/adt/rowtypes.c:218 +#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:521 +#: utils/adt/multirangetypes.c:163 utils/adt/rangetypes.c:2310 +#: utils/adt/rangetypes.c:2318 utils/adt/rowtypes.c:211 +#: utils/adt/rowtypes.c:219 #, c-format msgid "Unexpected end of input." msgstr "Неожиданный конец ввода." -#: utils/adt/arrayfuncs.c:507 utils/adt/arrayfuncs.c:554 -#: utils/adt/arrayfuncs.c:584 utils/adt/arrayfuncs.c:633 +#: utils/adt/arrayfuncs.c:510 utils/adt/arrayfuncs.c:557 +#: utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 #, c-format msgid "Unexpected \"%c\" character." msgstr "Неожиданный знак \"%c\"." -#: utils/adt/arrayfuncs.c:533 utils/adt/arrayfuncs.c:656 +#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 #, c-format msgid "Unexpected array element." msgstr "Неожиданный элемент массива." -#: utils/adt/arrayfuncs.c:591 +#: utils/adt/arrayfuncs.c:594 #, c-format msgid "Unmatched \"%c\" character." msgstr "Непарный знак \"%c\"." -#: utils/adt/arrayfuncs.c:599 utils/adt/jsonfuncs.c:2452 +#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2595 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "" "Для многомерных массивов должны задаваться вложенные массивы с " "соответствующими размерностями." -#: utils/adt/arrayfuncs.c:676 +#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:286 #, c-format msgid "Junk after closing right brace." msgstr "Мусор после закрывающей фигурной скобки." -#: utils/adt/arrayfuncs.c:1298 utils/adt/arrayfuncs.c:3344 -#: utils/adt/arrayfuncs.c:5817 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3371 +#: utils/adt/arrayfuncs.c:5884 #, c-format msgid "invalid number of dimensions: %d" msgstr "неверное число размерностей: %d" -#: utils/adt/arrayfuncs.c:1309 +#: utils/adt/arrayfuncs.c:1312 #, c-format msgid "invalid array flags" msgstr "неверные флаги массива" -#: utils/adt/arrayfuncs.c:1317 +#: utils/adt/arrayfuncs.c:1334 #, c-format -msgid "wrong element type" -msgstr "неверный тип элемента" +msgid "binary data has array element type %u (%s) instead of expected %u (%s)" +msgstr "" +"с бинарными данными связан тип элемента массива %u (%s) вместо ожидаемого %u " +"(%s)" -#: utils/adt/arrayfuncs.c:1367 utils/adt/rangetypes.c:335 -#: utils/cache/lsyscache.c:2835 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:444 +#: utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2905 #, c-format msgid "no binary input function available for type %s" msgstr "для типа %s нет функции ввода двоичных данных" -#: utils/adt/arrayfuncs.c:1507 +#: utils/adt/arrayfuncs.c:1518 #, c-format msgid "improper binary format in array element %d" msgstr "неподходящий двоичный формат в элементе массива %d" -#: utils/adt/arrayfuncs.c:1588 utils/adt/rangetypes.c:340 -#: utils/cache/lsyscache.c:2868 +#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:449 +#: utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2938 #, c-format msgid "no binary output function available for type %s" msgstr "для типа %s нет функции вывода двоичных данных" -#: utils/adt/arrayfuncs.c:2066 +#: utils/adt/arrayfuncs.c:2078 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "разрезание массивов постоянной длины не поддерживается" -#: utils/adt/arrayfuncs.c:2244 utils/adt/arrayfuncs.c:2266 -#: utils/adt/arrayfuncs.c:2315 utils/adt/arrayfuncs.c:2551 -#: utils/adt/arrayfuncs.c:2862 utils/adt/arrayfuncs.c:5803 -#: utils/adt/arrayfuncs.c:5829 utils/adt/arrayfuncs.c:5840 +#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 +#: utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2566 +#: utils/adt/arrayfuncs.c:2888 utils/adt/arrayfuncs.c:5870 +#: utils/adt/arrayfuncs.c:5896 utils/adt/arrayfuncs.c:5907 #: utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 -#: utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4340 utils/adt/jsonfuncs.c:4490 -#: utils/adt/jsonfuncs.c:4602 utils/adt/jsonfuncs.c:4648 +#: utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4429 utils/adt/jsonfuncs.c:4582 +#: utils/adt/jsonfuncs.c:4694 utils/adt/jsonfuncs.c:4743 #, c-format msgid "wrong number of array subscripts" msgstr "неверное число индексов массива" -#: utils/adt/arrayfuncs.c:2249 utils/adt/arrayfuncs.c:2357 -#: utils/adt/arrayfuncs.c:2615 utils/adt/arrayfuncs.c:2921 +#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 +#: utils/adt/arrayfuncs.c:2633 utils/adt/arrayfuncs.c:2947 #, c-format msgid "array subscript out of range" msgstr "индекс массива вне диапазона" -#: utils/adt/arrayfuncs.c:2254 +#: utils/adt/arrayfuncs.c:2266 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "нельзя присвоить значение null элементу массива фиксированной длины" -#: utils/adt/arrayfuncs.c:2809 +#: utils/adt/arrayfuncs.c:2835 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "изменения в срезах массивов фиксированной длины не поддерживаются" -#: utils/adt/arrayfuncs.c:2840 +#: utils/adt/arrayfuncs.c:2866 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "в указании среза массива должны быть заданы обе границы" -#: utils/adt/arrayfuncs.c:2841 +#: utils/adt/arrayfuncs.c:2867 #, c-format msgid "" "When assigning to a slice of an empty array value, slice boundaries must be " @@ -23414,99 +24379,120 @@ msgstr "" "При присвоении значений срезу в пустом массиве, должны полностью задаваться " "обе границы." -#: utils/adt/arrayfuncs.c:2852 utils/adt/arrayfuncs.c:2947 +#: utils/adt/arrayfuncs.c:2878 utils/adt/arrayfuncs.c:2974 #, c-format msgid "source array too small" msgstr "исходный массив слишком мал" -#: utils/adt/arrayfuncs.c:3500 +#: utils/adt/arrayfuncs.c:3529 #, c-format msgid "null array element not allowed in this context" msgstr "элемент массива null недопустим в данном контексте" -#: utils/adt/arrayfuncs.c:3602 utils/adt/arrayfuncs.c:3773 -#: utils/adt/arrayfuncs.c:4129 +#: utils/adt/arrayfuncs.c:3631 utils/adt/arrayfuncs.c:3802 +#: utils/adt/arrayfuncs.c:4192 #, c-format msgid "cannot compare arrays of different element types" msgstr "нельзя сравнивать массивы с элементами разных типов" -#: utils/adt/arrayfuncs.c:3951 utils/adt/rangetypes.c:1254 -#: utils/adt/rangetypes.c:1318 +#: utils/adt/arrayfuncs.c:3980 utils/adt/multirangetypes.c:2742 +#: utils/adt/multirangetypes.c:2814 utils/adt/rangetypes.c:1343 +#: utils/adt/rangetypes.c:1407 utils/adt/rowtypes.c:1858 #, c-format msgid "could not identify a hash function for type %s" msgstr "не удалось найти функцию хеширования для типа %s" -#: utils/adt/arrayfuncs.c:4044 +#: utils/adt/arrayfuncs.c:4107 utils/adt/rowtypes.c:1979 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "не удалось найти функцию расширенного хеширования для типа %s" -#: utils/adt/arrayfuncs.c:5221 +#: utils/adt/arrayfuncs.c:5284 #, c-format msgid "data type %s is not an array type" msgstr "тип данных %s не является типом массива" -#: utils/adt/arrayfuncs.c:5276 +#: utils/adt/arrayfuncs.c:5339 #, c-format msgid "cannot accumulate null arrays" msgstr "аккумулировать NULL-массивы нельзя" -#: utils/adt/arrayfuncs.c:5304 +#: utils/adt/arrayfuncs.c:5367 #, c-format msgid "cannot accumulate empty arrays" msgstr "аккумулировать пустые массивы нельзя" -#: utils/adt/arrayfuncs.c:5331 utils/adt/arrayfuncs.c:5337 +#: utils/adt/arrayfuncs.c:5394 utils/adt/arrayfuncs.c:5400 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "аккумулировать массивы различной размерности нельзя" -#: utils/adt/arrayfuncs.c:5701 utils/adt/arrayfuncs.c:5741 +#: utils/adt/arrayfuncs.c:5768 utils/adt/arrayfuncs.c:5808 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "массив размерностей или массив нижних границ не может быть null" -#: utils/adt/arrayfuncs.c:5804 utils/adt/arrayfuncs.c:5830 +#: utils/adt/arrayfuncs.c:5871 utils/adt/arrayfuncs.c:5897 #, c-format msgid "Dimension array must be one dimensional." msgstr "Массив размерностей должен быть одномерным." -#: utils/adt/arrayfuncs.c:5809 utils/adt/arrayfuncs.c:5835 +#: utils/adt/arrayfuncs.c:5876 utils/adt/arrayfuncs.c:5902 #, c-format msgid "dimension values cannot be null" msgstr "значения размерностей не могут быть null" -#: utils/adt/arrayfuncs.c:5841 +#: utils/adt/arrayfuncs.c:5908 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Массив нижних границ и массив размерностей имеют разные размеры." -#: utils/adt/arrayfuncs.c:6117 +#: utils/adt/arrayfuncs.c:6186 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "удаление элементов из многомерных массивов не поддерживается" -#: utils/adt/arrayfuncs.c:6394 +#: utils/adt/arrayfuncs.c:6463 #, c-format msgid "thresholds must be one-dimensional array" msgstr "границы должны задаваться одномерным массивом" -#: utils/adt/arrayfuncs.c:6399 +#: utils/adt/arrayfuncs.c:6468 #, c-format msgid "thresholds array must not contain NULLs" msgstr "массив границ не должен содержать NULL" -#: utils/adt/arrayutils.c:209 +#: utils/adt/arrayfuncs.c:6701 +#, c-format +msgid "number of elements to trim must be between 0 and %d" +msgstr "число удаляемых элементов должно быть от 0 до %d" + +#: utils/adt/arraysubs.c:93 utils/adt/arraysubs.c:130 +#, c-format +msgid "array subscript must have type integer" +msgstr "индекс элемента массива должен быть целочисленным" + +#: utils/adt/arraysubs.c:198 utils/adt/arraysubs.c:217 +#, c-format +msgid "array subscript in assignment must not be null" +msgstr "индекс элемента массива в присваивании не может быть NULL" + +#: utils/adt/arrayutils.c:140 +#, c-format +msgid "array lower bound is too large: %d" +msgstr "нижняя граница массива слишком велика: %d" + +#: utils/adt/arrayutils.c:240 #, c-format msgid "typmod array must be type cstring[]" msgstr "массив typmod должен иметь тип cstring[]" -#: utils/adt/arrayutils.c:214 +#: utils/adt/arrayutils.c:245 #, c-format msgid "typmod array must be one-dimensional" msgstr "массив typmod должен быть одномерным" -#: utils/adt/arrayutils.c:219 +#: utils/adt/arrayutils.c:250 #, c-format msgid "typmod array must not contain nulls" msgstr "массив typmod не должен содержать элементы null" @@ -23517,25 +24503,24 @@ msgid "encoding conversion from %s to ASCII not supported" msgstr "преобразование кодировки из %s в ASCII не поддерживается" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:3757 -#: utils/adt/float.c:187 utils/adt/float.c:271 utils/adt/float.c:295 -#: utils/adt/float.c:412 utils/adt/float.c:497 utils/adt/float.c:525 +#: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:3802 +#: utils/adt/float.c:187 utils/adt/float.c:271 utils/adt/float.c:283 +#: utils/adt/float.c:400 utils/adt/float.c:485 utils/adt/float.c:501 #: utils/adt/geo_ops.c:220 utils/adt/geo_ops.c:230 utils/adt/geo_ops.c:242 #: utils/adt/geo_ops.c:274 utils/adt/geo_ops.c:316 utils/adt/geo_ops.c:326 -#: utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1378 utils/adt/geo_ops.c:1413 -#: utils/adt/geo_ops.c:1421 utils/adt/geo_ops.c:3476 utils/adt/geo_ops.c:4645 -#: utils/adt/geo_ops.c:4660 utils/adt/geo_ops.c:4667 utils/adt/int8.c:126 +#: utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1389 utils/adt/geo_ops.c:1424 +#: utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3488 utils/adt/geo_ops.c:4657 +#: utils/adt/geo_ops.c:4672 utils/adt/geo_ops.c:4679 utils/adt/int8.c:126 #: utils/adt/jsonpath.c:182 utils/adt/mac.c:94 utils/adt/mac8.c:93 #: utils/adt/mac8.c:166 utils/adt/mac8.c:184 utils/adt/mac8.c:202 -#: utils/adt/mac8.c:221 utils/adt/network.c:100 utils/adt/numeric.c:601 -#: utils/adt/numeric.c:628 utils/adt/numeric.c:6001 utils/adt/numeric.c:6025 -#: utils/adt/numeric.c:6049 utils/adt/numeric.c:6882 utils/adt/numeric.c:6908 -#: utils/adt/numutils.c:116 utils/adt/numutils.c:126 utils/adt/numutils.c:170 -#: utils/adt/numutils.c:246 utils/adt/numutils.c:322 utils/adt/oid.c:44 -#: utils/adt/oid.c:58 utils/adt/oid.c:64 utils/adt/oid.c:86 -#: utils/adt/pg_lsn.c:73 utils/adt/tid.c:74 utils/adt/tid.c:82 -#: utils/adt/tid.c:90 utils/adt/timestamp.c:494 utils/adt/uuid.c:136 -#: utils/adt/xid8funcs.c:346 +#: utils/adt/mac8.c:221 utils/adt/network.c:100 utils/adt/numeric.c:694 +#: utils/adt/numeric.c:713 utils/adt/numeric.c:6858 utils/adt/numeric.c:6882 +#: utils/adt/numeric.c:6906 utils/adt/numeric.c:7864 utils/adt/numutils.c:116 +#: utils/adt/numutils.c:126 utils/adt/numutils.c:170 utils/adt/numutils.c:246 +#: utils/adt/numutils.c:322 utils/adt/oid.c:44 utils/adt/oid.c:58 +#: utils/adt/oid.c:64 utils/adt/oid.c:86 utils/adt/pg_lsn.c:74 +#: utils/adt/tid.c:76 utils/adt/tid.c:84 utils/adt/tid.c:92 +#: utils/adt/timestamp.c:496 utils/adt/uuid.c:136 utils/adt/xid8funcs.c:346 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "неверный синтаксис для типа %s: \"%s\"" @@ -23550,12 +24535,14 @@ msgstr "значение \"%s\" вне диапазона для типа %s" #: utils/adt/cash.c:652 utils/adt/cash.c:702 utils/adt/cash.c:753 #: utils/adt/cash.c:802 utils/adt/cash.c:854 utils/adt/cash.c:904 -#: utils/adt/float.c:104 utils/adt/int.c:824 utils/adt/int.c:940 -#: utils/adt/int.c:1020 utils/adt/int.c:1082 utils/adt/int.c:1120 -#: utils/adt/int.c:1148 utils/adt/int8.c:593 utils/adt/int8.c:651 -#: utils/adt/int8.c:978 utils/adt/int8.c:1058 utils/adt/int8.c:1120 -#: utils/adt/int8.c:1200 utils/adt/numeric.c:7446 utils/adt/numeric.c:7736 -#: utils/adt/numeric.c:9318 utils/adt/timestamp.c:3275 +#: utils/adt/float.c:104 utils/adt/int.c:822 utils/adt/int.c:938 +#: utils/adt/int.c:1018 utils/adt/int.c:1080 utils/adt/int.c:1118 +#: utils/adt/int.c:1146 utils/adt/int8.c:600 utils/adt/int8.c:658 +#: utils/adt/int8.c:985 utils/adt/int8.c:1065 utils/adt/int8.c:1127 +#: utils/adt/int8.c:1207 utils/adt/numeric.c:3031 utils/adt/numeric.c:3054 +#: utils/adt/numeric.c:3139 utils/adt/numeric.c:3157 utils/adt/numeric.c:3253 +#: utils/adt/numeric.c:8413 utils/adt/numeric.c:8703 utils/adt/numeric.c:10340 +#: utils/adt/timestamp.c:3281 #, c-format msgid "division by zero" msgstr "деление на ноль" @@ -23565,154 +24552,163 @@ msgstr "деление на ноль" msgid "\"char\" out of range" msgstr "значение \"char\" вне диапазона" -#: utils/adt/date.c:61 utils/adt/timestamp.c:95 utils/adt/varbit.c:104 +#: utils/adt/date.c:62 utils/adt/timestamp.c:97 utils/adt/varbit.c:105 #: utils/adt/varchar.c:48 #, c-format msgid "invalid type modifier" msgstr "неверный модификатор типа" -#: utils/adt/date.c:73 +#: utils/adt/date.c:74 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "TIME(%d)%s: точность должна быть неотрицательной" -#: utils/adt/date.c:79 +#: utils/adt/date.c:80 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "TIME(%d)%s: точность уменьшена до дозволенного максимума: %d" -#: utils/adt/date.c:158 utils/adt/date.c:166 utils/adt/formatting.c:4210 -#: utils/adt/formatting.c:4219 utils/adt/formatting.c:4325 -#: utils/adt/formatting.c:4335 +#: utils/adt/date.c:159 utils/adt/date.c:167 utils/adt/formatting.c:4252 +#: utils/adt/formatting.c:4261 utils/adt/formatting.c:4367 +#: utils/adt/formatting.c:4377 #, c-format msgid "date out of range: \"%s\"" msgstr "дата вне диапазона: \"%s\"" -#: utils/adt/date.c:213 utils/adt/date.c:525 utils/adt/date.c:549 +#: utils/adt/date.c:214 utils/adt/date.c:525 utils/adt/date.c:549 #: utils/adt/xml.c:2210 #, c-format msgid "date out of range" msgstr "дата вне диапазона" -#: utils/adt/date.c:259 utils/adt/timestamp.c:574 +#: utils/adt/date.c:260 utils/adt/timestamp.c:580 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "значение поля типа date вне диапазона: %d-%02d-%02d" -#: utils/adt/date.c:266 utils/adt/date.c:275 utils/adt/timestamp.c:580 +#: utils/adt/date.c:267 utils/adt/date.c:276 utils/adt/timestamp.c:586 #, c-format msgid "date out of range: %d-%02d-%02d" msgstr "дата вне диапазона: %d-%02d-%02d" -#: utils/adt/date.c:313 utils/adt/date.c:336 utils/adt/date.c:362 -#: utils/adt/date.c:1142 utils/adt/date.c:1188 utils/adt/date.c:1744 -#: utils/adt/date.c:1775 utils/adt/date.c:1804 utils/adt/date.c:2636 -#: utils/adt/datetime.c:1655 utils/adt/formatting.c:4067 -#: utils/adt/formatting.c:4099 utils/adt/formatting.c:4179 -#: utils/adt/formatting.c:4301 utils/adt/json.c:418 utils/adt/json.c:457 -#: utils/adt/timestamp.c:222 utils/adt/timestamp.c:254 -#: utils/adt/timestamp.c:692 utils/adt/timestamp.c:701 -#: utils/adt/timestamp.c:779 utils/adt/timestamp.c:812 -#: utils/adt/timestamp.c:2854 utils/adt/timestamp.c:2875 -#: utils/adt/timestamp.c:2888 utils/adt/timestamp.c:2897 -#: utils/adt/timestamp.c:2905 utils/adt/timestamp.c:2960 -#: utils/adt/timestamp.c:2983 utils/adt/timestamp.c:2996 -#: utils/adt/timestamp.c:3007 utils/adt/timestamp.c:3015 -#: utils/adt/timestamp.c:3675 utils/adt/timestamp.c:3800 -#: utils/adt/timestamp.c:3841 utils/adt/timestamp.c:3931 -#: utils/adt/timestamp.c:3975 utils/adt/timestamp.c:4078 -#: utils/adt/timestamp.c:4563 utils/adt/timestamp.c:4759 -#: utils/adt/timestamp.c:5086 utils/adt/timestamp.c:5100 -#: utils/adt/timestamp.c:5105 utils/adt/timestamp.c:5119 -#: utils/adt/timestamp.c:5152 utils/adt/timestamp.c:5239 -#: utils/adt/timestamp.c:5280 utils/adt/timestamp.c:5284 -#: utils/adt/timestamp.c:5353 utils/adt/timestamp.c:5357 -#: utils/adt/timestamp.c:5371 utils/adt/timestamp.c:5405 utils/adt/xml.c:2232 -#: utils/adt/xml.c:2239 utils/adt/xml.c:2259 utils/adt/xml.c:2266 -#, c-format -msgid "timestamp out of range" -msgstr "timestamp вне диапазона" - #: utils/adt/date.c:500 #, c-format msgid "cannot subtract infinite dates" msgstr "вычитать бесконечные даты нельзя" #: utils/adt/date.c:598 utils/adt/date.c:661 utils/adt/date.c:697 -#: utils/adt/date.c:2673 utils/adt/date.c:2683 +#: utils/adt/date.c:2881 utils/adt/date.c:2891 #, c-format msgid "date out of range for timestamp" msgstr "дата вне диапазона для типа timestamp" -#: utils/adt/date.c:1361 utils/adt/date.c:2131 utils/adt/formatting.c:4387 +#: utils/adt/date.c:1127 utils/adt/date.c:1210 utils/adt/date.c:1226 +#, c-format +msgid "date units \"%s\" not supported" +msgstr "единицы даты \"%s\" не поддерживаются" + +#: utils/adt/date.c:1235 +#, c-format +msgid "date units \"%s\" not recognized" +msgstr "дата содержит нераспознанные единицы \"%s\"" + +#: utils/adt/date.c:1318 utils/adt/date.c:1364 utils/adt/date.c:1920 +#: utils/adt/date.c:1951 utils/adt/date.c:1980 utils/adt/date.c:2844 +#: utils/adt/datetime.c:405 utils/adt/datetime.c:1700 +#: utils/adt/formatting.c:4109 utils/adt/formatting.c:4141 +#: utils/adt/formatting.c:4221 utils/adt/formatting.c:4343 utils/adt/json.c:418 +#: utils/adt/json.c:457 utils/adt/timestamp.c:224 utils/adt/timestamp.c:256 +#: utils/adt/timestamp.c:698 utils/adt/timestamp.c:707 +#: utils/adt/timestamp.c:785 utils/adt/timestamp.c:818 +#: utils/adt/timestamp.c:2860 utils/adt/timestamp.c:2881 +#: utils/adt/timestamp.c:2894 utils/adt/timestamp.c:2903 +#: utils/adt/timestamp.c:2911 utils/adt/timestamp.c:2966 +#: utils/adt/timestamp.c:2989 utils/adt/timestamp.c:3002 +#: utils/adt/timestamp.c:3013 utils/adt/timestamp.c:3021 +#: utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3806 +#: utils/adt/timestamp.c:3896 utils/adt/timestamp.c:3986 +#: utils/adt/timestamp.c:4079 utils/adt/timestamp.c:4182 +#: utils/adt/timestamp.c:4684 utils/adt/timestamp.c:4958 +#: utils/adt/timestamp.c:5411 utils/adt/timestamp.c:5425 +#: utils/adt/timestamp.c:5430 utils/adt/timestamp.c:5444 +#: utils/adt/timestamp.c:5477 utils/adt/timestamp.c:5564 +#: utils/adt/timestamp.c:5605 utils/adt/timestamp.c:5609 +#: utils/adt/timestamp.c:5678 utils/adt/timestamp.c:5682 +#: utils/adt/timestamp.c:5696 utils/adt/timestamp.c:5730 utils/adt/xml.c:2232 +#: utils/adt/xml.c:2239 utils/adt/xml.c:2259 utils/adt/xml.c:2266 +#, c-format +msgid "timestamp out of range" +msgstr "timestamp вне диапазона" + +#: utils/adt/date.c:1537 utils/adt/date.c:2339 utils/adt/formatting.c:4429 #, c-format msgid "time out of range" msgstr "время вне диапазона" -#: utils/adt/date.c:1413 utils/adt/timestamp.c:589 +#: utils/adt/date.c:1589 utils/adt/timestamp.c:595 #, c-format msgid "time field value out of range: %d:%02d:%02g" msgstr "значение поля типа time вне диапазона: %d:%02d:%02g" -#: utils/adt/date.c:1933 utils/adt/date.c:2435 utils/adt/float.c:1071 -#: utils/adt/float.c:1140 utils/adt/int.c:616 utils/adt/int.c:663 -#: utils/adt/int.c:698 utils/adt/int8.c:492 utils/adt/numeric.c:2197 -#: utils/adt/timestamp.c:3324 utils/adt/timestamp.c:3355 -#: utils/adt/timestamp.c:3386 +#: utils/adt/date.c:2109 utils/adt/date.c:2643 utils/adt/float.c:1047 +#: utils/adt/float.c:1123 utils/adt/int.c:614 utils/adt/int.c:661 +#: utils/adt/int.c:696 utils/adt/int8.c:499 utils/adt/numeric.c:2435 +#: utils/adt/timestamp.c:3330 utils/adt/timestamp.c:3361 +#: utils/adt/timestamp.c:3392 #, c-format msgid "invalid preceding or following size in window function" msgstr "неверное смещение PRECEDING или FOLLOWING в оконной функции" -#: utils/adt/date.c:2018 utils/adt/date.c:2031 +#: utils/adt/date.c:2208 utils/adt/date.c:2224 #, c-format msgid "\"time\" units \"%s\" not recognized" msgstr "\"время\" содержит нераспознанные единицы \"%s\"" -#: utils/adt/date.c:2139 +#: utils/adt/date.c:2347 #, c-format msgid "time zone displacement out of range" msgstr "смещение часового пояса вне диапазона" -#: utils/adt/date.c:2768 utils/adt/date.c:2781 +#: utils/adt/date.c:2986 utils/adt/date.c:3006 #, c-format msgid "\"time with time zone\" units \"%s\" not recognized" msgstr "\"время с часовым поясом\" содержит нераспознанные единицы \"%s\"" -#: utils/adt/date.c:2854 utils/adt/datetime.c:906 utils/adt/datetime.c:1813 -#: utils/adt/datetime.c:4601 utils/adt/timestamp.c:513 -#: utils/adt/timestamp.c:540 utils/adt/timestamp.c:4161 -#: utils/adt/timestamp.c:5111 utils/adt/timestamp.c:5363 +#: utils/adt/date.c:3097 utils/adt/datetime.c:951 utils/adt/datetime.c:1858 +#: utils/adt/datetime.c:4648 utils/adt/timestamp.c:515 +#: utils/adt/timestamp.c:542 utils/adt/timestamp.c:4265 +#: utils/adt/timestamp.c:5436 utils/adt/timestamp.c:5688 #, c-format msgid "time zone \"%s\" not recognized" msgstr "часовой пояс \"%s\" не распознан" -#: utils/adt/date.c:2886 utils/adt/timestamp.c:5141 utils/adt/timestamp.c:5394 +#: utils/adt/date.c:3129 utils/adt/timestamp.c:5466 utils/adt/timestamp.c:5719 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "" "интервал \"%s\", задающий часовой пояс, не должен содержать дней или месяцев" -#: utils/adt/datetime.c:3730 utils/adt/datetime.c:3737 +#: utils/adt/datetime.c:3775 utils/adt/datetime.c:3782 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "значение поля типа date/time вне диапазона: \"%s\"" -#: utils/adt/datetime.c:3739 +#: utils/adt/datetime.c:3784 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Возможно, вам нужно изменить настройку \"datestyle\"." -#: utils/adt/datetime.c:3744 +#: utils/adt/datetime.c:3789 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "значение поля interval вне диапазона: \"%s\"" -#: utils/adt/datetime.c:3750 +#: utils/adt/datetime.c:3795 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "смещение часового пояса вне диапазона: \"%s\"" -#: utils/adt/datetime.c:4603 +#: utils/adt/datetime.c:4650 #, c-format msgid "" "This time zone name appears in the configuration file for time zone " @@ -23721,22 +24717,22 @@ msgstr "" "Это имя часового пояса фигурирует в файле конфигурации часового пояса с " "кодом \"%s\"." -#: utils/adt/datum.c:89 utils/adt/datum.c:101 +#: utils/adt/datum.c:90 utils/adt/datum.c:102 #, c-format msgid "invalid Datum pointer" msgstr "неверный указатель Datum" -#: utils/adt/dbsize.c:759 utils/adt/dbsize.c:827 +#: utils/adt/dbsize.c:754 utils/adt/dbsize.c:822 #, c-format msgid "invalid size: \"%s\"" msgstr "некорректная величина: \"%s\"" -#: utils/adt/dbsize.c:828 +#: utils/adt/dbsize.c:823 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Неверная единица измерения величины: \"%s\"." -#: utils/adt/dbsize.c:829 +#: utils/adt/dbsize.c:824 #, c-format msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." msgstr "" @@ -23747,100 +24743,93 @@ msgstr "" msgid "type %s is not a domain" msgstr "тип \"%s\" не является доменом" -#: utils/adt/encode.c:64 utils/adt/encode.c:112 +#: utils/adt/encode.c:65 utils/adt/encode.c:113 #, c-format msgid "unrecognized encoding: \"%s\"" msgstr "нераспознанная кодировка: \"%s\"" -#: utils/adt/encode.c:78 +#: utils/adt/encode.c:79 #, c-format msgid "result of encoding conversion is too large" msgstr "результат кодирования слишком объёмный" -#: utils/adt/encode.c:126 +#: utils/adt/encode.c:127 #, c-format msgid "result of decoding conversion is too large" msgstr "результат декодирования слишком объёмный" -#: utils/adt/encode.c:184 +#: utils/adt/encode.c:186 #, c-format -msgid "invalid hexadecimal digit: \"%c\"" -msgstr "неверная шестнадцатеричная цифра: \"%c\"" +msgid "invalid hexadecimal digit: \"%.*s\"" +msgstr "неверная шестнадцатеричная цифра: \"%.*s\"" -#: utils/adt/encode.c:212 +#: utils/adt/encode.c:216 #, c-format msgid "invalid hexadecimal data: odd number of digits" msgstr "неверные шестнадцатеричные данные: нечётное число цифр" -#: utils/adt/encode.c:329 +#: utils/adt/encode.c:334 #, c-format msgid "unexpected \"=\" while decoding base64 sequence" msgstr "неожиданный знак \"=\" при декодировании base64" -#: utils/adt/encode.c:341 +#: utils/adt/encode.c:346 #, c-format -msgid "invalid symbol \"%c\" while decoding base64 sequence" -msgstr "неверный символ \"%c\" при декодировании base64" +msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" +msgstr "при декодировании base64 обнаружен неверный символ \"%.*s\"" -#: utils/adt/encode.c:361 +#: utils/adt/encode.c:367 #, c-format msgid "invalid base64 end sequence" msgstr "неверная конечная последовательность base64" -#: utils/adt/encode.c:362 +#: utils/adt/encode.c:368 #, c-format msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "" "Входные данные лишены выравнивания, обрезаны или повреждены иным образом." -#: utils/adt/encode.c:476 utils/adt/encode.c:541 utils/adt/jsonfuncs.c:619 -#: utils/adt/varlena.c:319 utils/adt/varlena.c:360 jsonpath_gram.y:528 +#: utils/adt/encode.c:482 utils/adt/encode.c:547 utils/adt/jsonfuncs.c:623 +#: utils/adt/varlena.c:336 utils/adt/varlena.c:377 jsonpath_gram.y:528 #: jsonpath_scan.l:519 jsonpath_scan.l:530 jsonpath_scan.l:540 #: jsonpath_scan.l:582 #, c-format msgid "invalid input syntax for type %s" msgstr "неверный синтаксис для типа %s" -#: utils/adt/enum.c:100 +#: utils/adt/enum.c:99 #, c-format msgid "unsafe use of new value \"%s\" of enum type %s" msgstr "небезопасное использование нового значения \"%s\" типа-перечисления %s" -#: utils/adt/enum.c:103 +#: utils/adt/enum.c:102 #, c-format msgid "New enum values must be committed before they can be used." msgstr "" "Новые значения перечисления должны быть зафиксированы перед использованием." -#: utils/adt/enum.c:121 utils/adt/enum.c:131 utils/adt/enum.c:189 -#: utils/adt/enum.c:199 +#: utils/adt/enum.c:120 utils/adt/enum.c:130 utils/adt/enum.c:188 +#: utils/adt/enum.c:198 #, c-format msgid "invalid input value for enum %s: \"%s\"" msgstr "неверное значение для перечисления %s: \"%s\"" -#: utils/adt/enum.c:161 utils/adt/enum.c:227 utils/adt/enum.c:286 +#: utils/adt/enum.c:160 utils/adt/enum.c:226 utils/adt/enum.c:285 #, c-format msgid "invalid internal value for enum: %u" msgstr "неверное внутреннее значение для перечисления: %u" -#: utils/adt/enum.c:446 utils/adt/enum.c:475 utils/adt/enum.c:515 -#: utils/adt/enum.c:535 +#: utils/adt/enum.c:445 utils/adt/enum.c:474 utils/adt/enum.c:514 +#: utils/adt/enum.c:534 #, c-format msgid "could not determine actual enum type" msgstr "не удалось определить фактический тип перечисления" -#: utils/adt/enum.c:454 utils/adt/enum.c:483 +#: utils/adt/enum.c:453 utils/adt/enum.c:482 #, c-format msgid "enum %s contains no values" msgstr "перечисление %s не содержит значений" -#: utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 -#: utils/cache/typcache.c:1632 utils/cache/typcache.c:1788 -#: utils/cache/typcache.c:1918 utils/fmgr/funcapi.c:456 -#, c-format -msgid "type %s is not composite" -msgstr "тип %s не является составным" - #: utils/adt/float.c:88 #, c-format msgid "value out of range: overflow" @@ -23856,74 +24845,76 @@ msgstr "значение вне диапазона: антипереполнен msgid "\"%s\" is out of range for type real" msgstr "\"%s\" вне диапазона для типа real" -#: utils/adt/float.c:489 +#: utils/adt/float.c:477 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "\"%s\" вне диапазона для типа double precision" -#: utils/adt/float.c:1268 utils/adt/float.c:1342 utils/adt/int.c:336 -#: utils/adt/int.c:874 utils/adt/int.c:896 utils/adt/int.c:910 -#: utils/adt/int.c:924 utils/adt/int.c:956 utils/adt/int.c:1194 -#: utils/adt/int8.c:1313 utils/adt/numeric.c:3553 utils/adt/numeric.c:3562 +#: utils/adt/float.c:1258 utils/adt/float.c:1332 utils/adt/int.c:334 +#: utils/adt/int.c:872 utils/adt/int.c:894 utils/adt/int.c:908 +#: utils/adt/int.c:922 utils/adt/int.c:954 utils/adt/int.c:1192 +#: utils/adt/int8.c:1320 utils/adt/numeric.c:4315 utils/adt/numeric.c:4320 #, c-format msgid "smallint out of range" msgstr "smallint вне диапазона" -#: utils/adt/float.c:1468 utils/adt/numeric.c:8329 +#: utils/adt/float.c:1458 utils/adt/numeric.c:3549 utils/adt/numeric.c:9296 #, c-format msgid "cannot take square root of a negative number" msgstr "извлечь квадратный корень отрицательного числа нельзя" -#: utils/adt/float.c:1536 utils/adt/numeric.c:3239 +#: utils/adt/float.c:1526 utils/adt/numeric.c:3824 utils/adt/numeric.c:3936 #, c-format msgid "zero raised to a negative power is undefined" msgstr "ноль в отрицательной степени даёт неопределённость" -#: utils/adt/float.c:1540 utils/adt/numeric.c:3245 +#: utils/adt/float.c:1530 utils/adt/numeric.c:3828 utils/adt/numeric.c:10193 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "отрицательное число в дробной степени даёт комплексный результат" -#: utils/adt/float.c:1614 utils/adt/float.c:1647 utils/adt/numeric.c:8993 +#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3736 +#: utils/adt/numeric.c:9966 #, c-format msgid "cannot take logarithm of zero" msgstr "вычислить логарифм нуля нельзя" -#: utils/adt/float.c:1618 utils/adt/float.c:1651 utils/adt/numeric.c:8997 +#: utils/adt/float.c:1710 utils/adt/float.c:1743 utils/adt/numeric.c:3674 +#: utils/adt/numeric.c:3731 utils/adt/numeric.c:9970 #, c-format msgid "cannot take logarithm of a negative number" msgstr "вычислить логарифм отрицательного числа нельзя" -#: utils/adt/float.c:1684 utils/adt/float.c:1715 utils/adt/float.c:1810 -#: utils/adt/float.c:1837 utils/adt/float.c:1865 utils/adt/float.c:1892 -#: utils/adt/float.c:2039 utils/adt/float.c:2076 utils/adt/float.c:2246 -#: utils/adt/float.c:2302 utils/adt/float.c:2367 utils/adt/float.c:2424 -#: utils/adt/float.c:2615 utils/adt/float.c:2639 +#: utils/adt/float.c:1776 utils/adt/float.c:1807 utils/adt/float.c:1902 +#: utils/adt/float.c:1929 utils/adt/float.c:1957 utils/adt/float.c:1984 +#: utils/adt/float.c:2131 utils/adt/float.c:2168 utils/adt/float.c:2338 +#: utils/adt/float.c:2394 utils/adt/float.c:2459 utils/adt/float.c:2516 +#: utils/adt/float.c:2707 utils/adt/float.c:2731 #, c-format msgid "input is out of range" msgstr "введённое значение вне диапазона" -#: utils/adt/float.c:2706 +#: utils/adt/float.c:2798 #, c-format msgid "setseed parameter %g is out of allowed range [-1,1]" msgstr "параметр setseed %g вне допустимого диапазона [-1,1]" -#: utils/adt/float.c:3938 utils/adt/numeric.c:1509 +#: utils/adt/float.c:4030 utils/adt/numeric.c:1708 #, c-format msgid "count must be greater than zero" msgstr "счётчик должен быть больше нуля" -#: utils/adt/float.c:3943 utils/adt/numeric.c:1516 +#: utils/adt/float.c:4035 utils/adt/numeric.c:1719 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "операнд, нижняя и верхняя границы не могут быть NaN" -#: utils/adt/float.c:3949 +#: utils/adt/float.c:4041 utils/adt/numeric.c:1724 #, c-format msgid "lower and upper bounds must be finite" msgstr "нижняя и верхняя границы должны быть конечными" -#: utils/adt/float.c:3983 utils/adt/numeric.c:1529 +#: utils/adt/float.c:4075 utils/adt/numeric.c:1738 #, c-format msgid "lower bound cannot equal upper bound" msgstr "нижняя граница не может равняться верхней" @@ -24015,29 +25006,29 @@ msgstr "" msgid "invalid datetime format separator: \"%s\"" msgstr "неверный разделитель в формате datetime: \"%s\"" -#: utils/adt/formatting.c:1522 +#: utils/adt/formatting.c:1521 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\" не является числом" -#: utils/adt/formatting.c:1600 +#: utils/adt/formatting.c:1599 #, c-format msgid "case conversion failed: %s" msgstr "преобразовать регистр не удалось: %s" -#: utils/adt/formatting.c:1665 utils/adt/formatting.c:1789 -#: utils/adt/formatting.c:1914 +#: utils/adt/formatting.c:1664 utils/adt/formatting.c:1788 +#: utils/adt/formatting.c:1913 #, c-format msgid "could not determine which collation to use for %s function" msgstr "" "не удалось определить, какое правило сортировки использовать для функции %s" -#: utils/adt/formatting.c:2286 +#: utils/adt/formatting.c:2285 #, c-format msgid "invalid combination of date conventions" msgstr "неверное сочетание стилей дат" -#: utils/adt/formatting.c:2287 +#: utils/adt/formatting.c:2286 #, c-format msgid "" "Do not mix Gregorian and ISO week date conventions in a formatting template." @@ -24045,27 +25036,27 @@ msgstr "" "Не смешивайте Григорианский стиль дат (недель) с ISO в одном шаблоне " "форматирования." -#: utils/adt/formatting.c:2310 +#: utils/adt/formatting.c:2309 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "конфликтующие значения поля \"%s\" в строке форматирования" -#: utils/adt/formatting.c:2313 +#: utils/adt/formatting.c:2312 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Это значение противоречит предыдущему значению поля того же типа." -#: utils/adt/formatting.c:2384 +#: utils/adt/formatting.c:2383 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "входная строка короче, чем требует поле форматирования \"%s\"" -#: utils/adt/formatting.c:2387 +#: utils/adt/formatting.c:2386 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Требуется символов: %d, а осталось только %d." -#: utils/adt/formatting.c:2390 utils/adt/formatting.c:2405 +#: utils/adt/formatting.c:2389 utils/adt/formatting.c:2404 #, c-format msgid "" "If your source string is not fixed-width, try using the \"FM\" modifier." @@ -24073,169 +25064,169 @@ msgstr "" "Если входная строка имеет переменную длину, попробуйте использовать " "модификатор \"FM\"." -#: utils/adt/formatting.c:2400 utils/adt/formatting.c:2414 -#: utils/adt/formatting.c:2637 +#: utils/adt/formatting.c:2399 utils/adt/formatting.c:2413 +#: utils/adt/formatting.c:2636 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "неверное значение \"%s\" для \"%s\"" -#: utils/adt/formatting.c:2402 +#: utils/adt/formatting.c:2401 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Поле должно поглотить символов: %d, но удалось разобрать только %d." -#: utils/adt/formatting.c:2416 +#: utils/adt/formatting.c:2415 #, c-format msgid "Value must be an integer." msgstr "Значение должно быть целым числом." -#: utils/adt/formatting.c:2421 +#: utils/adt/formatting.c:2420 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "значение \"%s\" во входной строке вне диапазона" -#: utils/adt/formatting.c:2423 +#: utils/adt/formatting.c:2422 #, c-format msgid "Value must be in the range %d to %d." msgstr "Значение должно быть в интервале %d..%d." -#: utils/adt/formatting.c:2639 +#: utils/adt/formatting.c:2638 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "" "Данное значение не соответствует ни одному из допустимых значений для этого " "поля." -#: utils/adt/formatting.c:2856 utils/adt/formatting.c:2876 -#: utils/adt/formatting.c:2896 utils/adt/formatting.c:2916 -#: utils/adt/formatting.c:2935 utils/adt/formatting.c:2954 -#: utils/adt/formatting.c:2978 utils/adt/formatting.c:2996 -#: utils/adt/formatting.c:3014 utils/adt/formatting.c:3032 -#: utils/adt/formatting.c:3049 utils/adt/formatting.c:3066 +#: utils/adt/formatting.c:2855 utils/adt/formatting.c:2875 +#: utils/adt/formatting.c:2895 utils/adt/formatting.c:2915 +#: utils/adt/formatting.c:2934 utils/adt/formatting.c:2953 +#: utils/adt/formatting.c:2977 utils/adt/formatting.c:2995 +#: utils/adt/formatting.c:3013 utils/adt/formatting.c:3031 +#: utils/adt/formatting.c:3048 utils/adt/formatting.c:3065 #, c-format msgid "localized string format value too long" msgstr "слишком длинное значение формата локализованной строки" -#: utils/adt/formatting.c:3300 +#: utils/adt/formatting.c:3342 #, c-format msgid "unmatched format separator \"%c\"" msgstr "нет соответствия для заданного в формате разделителя \"%c\"" -#: utils/adt/formatting.c:3361 +#: utils/adt/formatting.c:3403 #, c-format msgid "unmatched format character \"%s\"" msgstr "нет соответствия для заданного в формате символа \"%s\"" -#: utils/adt/formatting.c:3467 utils/adt/formatting.c:3811 +#: utils/adt/formatting.c:3509 utils/adt/formatting.c:3853 #, c-format msgid "formatting field \"%s\" is only supported in to_char" msgstr "поле форматирования \"%s\" поддерживается только в функции to_char" -#: utils/adt/formatting.c:3642 +#: utils/adt/formatting.c:3684 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "ошибка синтаксиса в значении для шаблона \"Y,YYY\"" -#: utils/adt/formatting.c:3728 +#: utils/adt/formatting.c:3770 #, c-format msgid "input string is too short for datetime format" msgstr "входная строка короче, чем требует формат datetime" -#: utils/adt/formatting.c:3736 +#: utils/adt/formatting.c:3778 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "" "после разбора формата datetime во входной строке остались дополнительные " "символы" -#: utils/adt/formatting.c:4281 +#: utils/adt/formatting.c:4323 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "во входной строке для типа timestamptz нет указания часового пояса" -#: utils/adt/formatting.c:4287 +#: utils/adt/formatting.c:4329 #, c-format msgid "timestamptz out of range" msgstr "значение timestamptz вне диапазона" -#: utils/adt/formatting.c:4315 +#: utils/adt/formatting.c:4357 #, c-format msgid "datetime format is zoned but not timed" msgstr "в формате datetime указан часовой пояс, но отсутствует время" -#: utils/adt/formatting.c:4367 +#: utils/adt/formatting.c:4409 #, c-format msgid "missing time zone in input string for type timetz" msgstr "во входной строке для типа timetz нет указания часового пояса" -#: utils/adt/formatting.c:4373 +#: utils/adt/formatting.c:4415 #, c-format msgid "timetz out of range" msgstr "значение timetz вне диапазона" -#: utils/adt/formatting.c:4399 +#: utils/adt/formatting.c:4441 #, c-format msgid "datetime format is not dated and not timed" msgstr "в формате datetime нет ни даты, ни времени" -#: utils/adt/formatting.c:4532 +#: utils/adt/formatting.c:4574 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "час \"%d\" не соответствует 12-часовому формату времени" -#: utils/adt/formatting.c:4534 +#: utils/adt/formatting.c:4576 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Используйте 24-часовой формат или передавайте часы от 1 до 12." -#: utils/adt/formatting.c:4645 +#: utils/adt/formatting.c:4687 #, c-format msgid "cannot calculate day of year without year information" msgstr "нельзя рассчитать день года без информации о годе" -#: utils/adt/formatting.c:5564 +#: utils/adt/formatting.c:5606 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\" не поддерживается при вводе" -#: utils/adt/formatting.c:5576 +#: utils/adt/formatting.c:5618 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\" не поддерживается при вводе" -#: utils/adt/genfile.c:75 +#: utils/adt/genfile.c:78 #, c-format msgid "reference to parent directory (\"..\") not allowed" msgstr "ссылка на родительский каталог (\"..\") недопустима" -#: utils/adt/genfile.c:86 +#: utils/adt/genfile.c:89 #, c-format msgid "absolute path not allowed" msgstr "абсолютный путь недопустим" -#: utils/adt/genfile.c:91 +#: utils/adt/genfile.c:94 #, c-format msgid "path must be in or below the current directory" msgstr "путь должен указывать в текущий или вложенный каталог" -#: utils/adt/genfile.c:116 utils/adt/oracle_compat.c:185 -#: utils/adt/oracle_compat.c:283 utils/adt/oracle_compat.c:759 -#: utils/adt/oracle_compat.c:1054 +#: utils/adt/genfile.c:119 utils/adt/oracle_compat.c:187 +#: utils/adt/oracle_compat.c:285 utils/adt/oracle_compat.c:833 +#: utils/adt/oracle_compat.c:1128 #, c-format msgid "requested length too large" msgstr "запрошенная длина слишком велика" -#: utils/adt/genfile.c:133 +#: utils/adt/genfile.c:136 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "не удалось переместиться в файле \"%s\": %m" -#: utils/adt/genfile.c:174 +#: utils/adt/genfile.c:176 #, c-format msgid "file length too large" msgstr "длина файла слишком велика" -#: utils/adt/genfile.c:251 +#: utils/adt/genfile.c:253 #, c-format msgid "must be superuser to read files with adminpack 1.0" msgstr "читать файлы, используя adminpack 1.0, может только суперпользователь" @@ -24245,73 +25236,73 @@ msgstr "читать файлы, используя adminpack 1.0, может т msgid "invalid line specification: A and B cannot both be zero" msgstr "неверное определение линии: A и B вдвоём не могут быть нулевыми" -#: utils/adt/geo_ops.c:987 utils/adt/geo_ops.c:1090 +#: utils/adt/geo_ops.c:987 utils/adt/geo_ops.c:1097 #, c-format msgid "invalid line specification: must be two distinct points" msgstr "неверное определение линии: требуются две различных точки" -#: utils/adt/geo_ops.c:1399 utils/adt/geo_ops.c:3486 utils/adt/geo_ops.c:4354 -#: utils/adt/geo_ops.c:5248 +#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3498 utils/adt/geo_ops.c:4366 +#: utils/adt/geo_ops.c:5260 #, c-format msgid "too many points requested" msgstr "запрошено слишком много точек" -#: utils/adt/geo_ops.c:1461 +#: utils/adt/geo_ops.c:1472 #, c-format msgid "invalid number of points in external \"path\" value" msgstr "недопустимое число точек во внешнем представлении типа \"path\"" -#: utils/adt/geo_ops.c:2537 +#: utils/adt/geo_ops.c:2549 #, c-format msgid "function \"dist_lb\" not implemented" msgstr "функция \"dist_lb\" не реализована" -#: utils/adt/geo_ops.c:2556 +#: utils/adt/geo_ops.c:2568 #, c-format msgid "function \"dist_bl\" not implemented" msgstr "функция \"dist_bl\" не реализована" -#: utils/adt/geo_ops.c:2975 +#: utils/adt/geo_ops.c:2987 #, c-format msgid "function \"close_sl\" not implemented" msgstr "функция \"close_sl\" не реализована" -#: utils/adt/geo_ops.c:3122 +#: utils/adt/geo_ops.c:3134 #, c-format msgid "function \"close_lb\" not implemented" msgstr "функция \"close_lb\" не реализована" -#: utils/adt/geo_ops.c:3533 +#: utils/adt/geo_ops.c:3545 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "недопустимое число точек во внешнем представлении типа \"polygon\"" -#: utils/adt/geo_ops.c:4069 +#: utils/adt/geo_ops.c:4081 #, c-format msgid "function \"poly_distance\" not implemented" msgstr "функция \"poly_distance\" не реализована" -#: utils/adt/geo_ops.c:4446 +#: utils/adt/geo_ops.c:4458 #, c-format msgid "function \"path_center\" not implemented" msgstr "функция \"path_center\" не реализована" -#: utils/adt/geo_ops.c:4463 +#: utils/adt/geo_ops.c:4475 #, c-format msgid "open path cannot be converted to polygon" msgstr "открытый путь нельзя преобразовать во многоугольник" -#: utils/adt/geo_ops.c:4713 +#: utils/adt/geo_ops.c:4725 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "недопустимый радиус во внешнем представлении типа \"circle\"" -#: utils/adt/geo_ops.c:5234 +#: utils/adt/geo_ops.c:5246 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "круг с нулевым радиусом нельзя преобразовать в многоугольник" -#: utils/adt/geo_ops.c:5239 +#: utils/adt/geo_ops.c:5251 #, c-format msgid "must request at least 2 points" msgstr "точек должно быть минимум 2" @@ -24321,38 +25312,38 @@ msgstr "точек должно быть минимум 2" msgid "int2vector has too many elements" msgstr "int2vector содержит слишком много элементов" -#: utils/adt/int.c:239 +#: utils/adt/int.c:237 #, c-format msgid "invalid int2vector data" msgstr "неверные данные int2vector" -#: utils/adt/int.c:245 utils/adt/oid.c:215 utils/adt/oid.c:296 +#: utils/adt/int.c:243 utils/adt/oid.c:215 utils/adt/oid.c:296 #, c-format msgid "oidvector has too many elements" msgstr "oidvector содержит слишком много элементов" -#: utils/adt/int.c:1510 utils/adt/int8.c:1439 utils/adt/numeric.c:1417 -#: utils/adt/timestamp.c:5456 utils/adt/timestamp.c:5536 +#: utils/adt/int.c:1508 utils/adt/int8.c:1446 utils/adt/numeric.c:1616 +#: utils/adt/timestamp.c:5781 utils/adt/timestamp.c:5861 #, c-format msgid "step size cannot equal zero" msgstr "размер шага не может быть нулевым" -#: utils/adt/int8.c:527 utils/adt/int8.c:550 utils/adt/int8.c:564 -#: utils/adt/int8.c:578 utils/adt/int8.c:609 utils/adt/int8.c:633 -#: utils/adt/int8.c:715 utils/adt/int8.c:783 utils/adt/int8.c:789 -#: utils/adt/int8.c:815 utils/adt/int8.c:829 utils/adt/int8.c:853 -#: utils/adt/int8.c:866 utils/adt/int8.c:935 utils/adt/int8.c:949 -#: utils/adt/int8.c:963 utils/adt/int8.c:994 utils/adt/int8.c:1016 -#: utils/adt/int8.c:1030 utils/adt/int8.c:1044 utils/adt/int8.c:1077 -#: utils/adt/int8.c:1091 utils/adt/int8.c:1105 utils/adt/int8.c:1136 -#: utils/adt/int8.c:1158 utils/adt/int8.c:1172 utils/adt/int8.c:1186 -#: utils/adt/int8.c:1348 utils/adt/int8.c:1383 utils/adt/numeric.c:3508 -#: utils/adt/varbit.c:1662 +#: utils/adt/int8.c:534 utils/adt/int8.c:557 utils/adt/int8.c:571 +#: utils/adt/int8.c:585 utils/adt/int8.c:616 utils/adt/int8.c:640 +#: utils/adt/int8.c:722 utils/adt/int8.c:790 utils/adt/int8.c:796 +#: utils/adt/int8.c:822 utils/adt/int8.c:836 utils/adt/int8.c:860 +#: utils/adt/int8.c:873 utils/adt/int8.c:942 utils/adt/int8.c:956 +#: utils/adt/int8.c:970 utils/adt/int8.c:1001 utils/adt/int8.c:1023 +#: utils/adt/int8.c:1037 utils/adt/int8.c:1051 utils/adt/int8.c:1084 +#: utils/adt/int8.c:1098 utils/adt/int8.c:1112 utils/adt/int8.c:1143 +#: utils/adt/int8.c:1165 utils/adt/int8.c:1179 utils/adt/int8.c:1193 +#: utils/adt/int8.c:1355 utils/adt/int8.c:1390 utils/adt/numeric.c:4274 +#: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigint вне диапазона" -#: utils/adt/int8.c:1396 +#: utils/adt/int8.c:1403 #, c-format msgid "OID out of range" msgstr "OID вне диапазона" @@ -24363,7 +25354,7 @@ msgid "key value must be scalar, not array, composite, or json" msgstr "" "значением ключа должен быть скаляр (не массив, композитный тип или json)" -#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:1813 +#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:1992 #, c-format msgid "could not determine data type for argument %d" msgstr "не удалось определить тип данных аргумента %d" @@ -24467,164 +25458,196 @@ msgstr "привести объект jsonb к типу %s нельзя" msgid "cannot cast jsonb array or object to type %s" msgstr "привести массив или объект jsonb к типу %s нельзя" -#: utils/adt/jsonb_util.c:699 +#: utils/adt/jsonb_util.c:751 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "число пар объекта jsonb превышает предел (%zu)" -#: utils/adt/jsonb_util.c:740 +#: utils/adt/jsonb_util.c:792 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "число элементов массива jsonb превышает предел (%zu)" -#: utils/adt/jsonb_util.c:1614 utils/adt/jsonb_util.c:1634 +#: utils/adt/jsonb_util.c:1666 utils/adt/jsonb_util.c:1686 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %u bytes" msgstr "общий размер элементов массива jsonb превышает предел (%u байт)" -#: utils/adt/jsonb_util.c:1695 utils/adt/jsonb_util.c:1730 -#: utils/adt/jsonb_util.c:1750 +#: utils/adt/jsonb_util.c:1747 utils/adt/jsonb_util.c:1782 +#: utils/adt/jsonb_util.c:1802 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %u bytes" msgstr "общий размер элементов объекта jsonb превышает предел (%u байт)" -#: utils/adt/jsonfuncs.c:551 utils/adt/jsonfuncs.c:796 -#: utils/adt/jsonfuncs.c:2330 utils/adt/jsonfuncs.c:2770 -#: utils/adt/jsonfuncs.c:3560 utils/adt/jsonfuncs.c:3891 +#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 +#, c-format +msgid "jsonb subscript does not support slices" +msgstr "jsonb не поддерживает обращение по индексу к срезам" + +#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 +#, c-format +msgid "subscript type %s is not supported" +msgstr "индекс элемента имеет неподдерживаемый тип %s" + +#: utils/adt/jsonbsubs.c:104 +#, c-format +msgid "jsonb subscript must be coercible to only one type, integer or text." +msgstr "" +"Индекс элемента в jsonb должен приводиться только к одному типу, integer или " +"text." + +#: utils/adt/jsonbsubs.c:118 +#, c-format +msgid "jsonb subscript must be coercible to either integer or text." +msgstr "Индекс элемента в jsonb должен приводиться к типу integer или text." + +#: utils/adt/jsonbsubs.c:139 +#, c-format +msgid "jsonb subscript must have text type" +msgstr "индекс элемента jsonb должен иметь текстовый тип" + +#: utils/adt/jsonbsubs.c:207 +#, c-format +msgid "jsonb subscript in assignment must not be null" +msgstr "индекс элемента jsonb в присваивании не может быть NULL" + +#: utils/adt/jsonfuncs.c:555 utils/adt/jsonfuncs.c:791 +#: utils/adt/jsonfuncs.c:2473 utils/adt/jsonfuncs.c:2913 +#: utils/adt/jsonfuncs.c:3702 utils/adt/jsonfuncs.c:4032 #, c-format msgid "cannot call %s on a scalar" msgstr "вызывать %s со скаляром нельзя" -#: utils/adt/jsonfuncs.c:556 utils/adt/jsonfuncs.c:783 -#: utils/adt/jsonfuncs.c:2772 utils/adt/jsonfuncs.c:3549 +#: utils/adt/jsonfuncs.c:560 utils/adt/jsonfuncs.c:778 +#: utils/adt/jsonfuncs.c:2915 utils/adt/jsonfuncs.c:3691 #, c-format msgid "cannot call %s on an array" msgstr "вызывать %s с массивом нельзя" -#: utils/adt/jsonfuncs.c:613 jsonpath_scan.l:498 +#: utils/adt/jsonfuncs.c:617 jsonpath_scan.l:498 #, c-format msgid "unsupported Unicode escape sequence" msgstr "неподдерживаемая спецпоследовательность Unicode" -#: utils/adt/jsonfuncs.c:692 +#: utils/adt/jsonfuncs.c:687 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "данные JSON, строка %d: %s%s%s" -#: utils/adt/jsonfuncs.c:1682 utils/adt/jsonfuncs.c:1717 +#: utils/adt/jsonfuncs.c:1825 utils/adt/jsonfuncs.c:1860 #, c-format msgid "cannot get array length of a scalar" msgstr "получить длину скаляра нельзя" -#: utils/adt/jsonfuncs.c:1686 utils/adt/jsonfuncs.c:1705 +#: utils/adt/jsonfuncs.c:1829 utils/adt/jsonfuncs.c:1848 #, c-format msgid "cannot get array length of a non-array" msgstr "получить длину массива для не массива нельзя" -#: utils/adt/jsonfuncs.c:1782 +#: utils/adt/jsonfuncs.c:1925 #, c-format msgid "cannot call %s on a non-object" msgstr "вызывать %s с не объектом нельзя" -#: utils/adt/jsonfuncs.c:2021 +#: utils/adt/jsonfuncs.c:2164 #, c-format msgid "cannot deconstruct an array as an object" msgstr "извлечь массив в виде объекта нельзя" -#: utils/adt/jsonfuncs.c:2033 +#: utils/adt/jsonfuncs.c:2176 #, c-format msgid "cannot deconstruct a scalar" msgstr "извлечь скаляр нельзя" -#: utils/adt/jsonfuncs.c:2079 +#: utils/adt/jsonfuncs.c:2222 #, c-format msgid "cannot extract elements from a scalar" msgstr "извлечь элементы из скаляра нельзя" -#: utils/adt/jsonfuncs.c:2083 +#: utils/adt/jsonfuncs.c:2226 #, c-format msgid "cannot extract elements from an object" msgstr "извлечь элементы из объекта нельзя" -#: utils/adt/jsonfuncs.c:2317 utils/adt/jsonfuncs.c:3775 +#: utils/adt/jsonfuncs.c:2460 utils/adt/jsonfuncs.c:3917 #, c-format msgid "cannot call %s on a non-array" msgstr "вызывать %s с не массивом нельзя" -#: utils/adt/jsonfuncs.c:2387 utils/adt/jsonfuncs.c:2392 -#: utils/adt/jsonfuncs.c:2409 utils/adt/jsonfuncs.c:2415 +#: utils/adt/jsonfuncs.c:2530 utils/adt/jsonfuncs.c:2535 +#: utils/adt/jsonfuncs.c:2552 utils/adt/jsonfuncs.c:2558 #, c-format msgid "expected JSON array" msgstr "ожидался массив JSON" -#: utils/adt/jsonfuncs.c:2388 +#: utils/adt/jsonfuncs.c:2531 #, c-format msgid "See the value of key \"%s\"." msgstr "Проверьте значение ключа \"%s\"." -#: utils/adt/jsonfuncs.c:2410 +#: utils/adt/jsonfuncs.c:2553 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Проверьте элемент массива %s ключа \"%s\"." -#: utils/adt/jsonfuncs.c:2416 +#: utils/adt/jsonfuncs.c:2559 #, c-format msgid "See the array element %s." msgstr "Проверьте элемент массива %s." -#: utils/adt/jsonfuncs.c:2451 +#: utils/adt/jsonfuncs.c:2594 #, c-format msgid "malformed JSON array" msgstr "неправильный массив JSON" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3278 +#: utils/adt/jsonfuncs.c:3421 #, c-format msgid "first argument of %s must be a row type" msgstr "первым аргументом %s должен быть кортеж" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3302 +#: utils/adt/jsonfuncs.c:3445 #, c-format msgid "could not determine row type for result of %s" msgstr "не удалось определить тип строки для результата %s" -#: utils/adt/jsonfuncs.c:3304 +#: utils/adt/jsonfuncs.c:3447 #, c-format msgid "" "Provide a non-null record argument, or call the function in the FROM clause " "using a column definition list." msgstr "" "Передайте отличный от NULL аргумент-запись или вызовите эту функцию в " -"предложении FROM, используя список с определениями столбцов." +"предложении FROM, используя список определений столбцов." -#: utils/adt/jsonfuncs.c:3792 utils/adt/jsonfuncs.c:3873 +#: utils/adt/jsonfuncs.c:3934 utils/adt/jsonfuncs.c:4014 #, c-format msgid "argument of %s must be an array of objects" msgstr "аргументом %s должен быть массив объектов" -#: utils/adt/jsonfuncs.c:3825 +#: utils/adt/jsonfuncs.c:3967 #, c-format msgid "cannot call %s on an object" msgstr "вызывать %s с объектом нельзя" -#: utils/adt/jsonfuncs.c:4286 utils/adt/jsonfuncs.c:4345 -#: utils/adt/jsonfuncs.c:4425 +#: utils/adt/jsonfuncs.c:4375 utils/adt/jsonfuncs.c:4434 +#: utils/adt/jsonfuncs.c:4514 #, c-format msgid "cannot delete from scalar" msgstr "удаление из скаляра невозможно" -#: utils/adt/jsonfuncs.c:4430 +#: utils/adt/jsonfuncs.c:4519 #, c-format msgid "cannot delete from object using integer index" msgstr "удаление из объекта по числовому индексу невозможно" -#: utils/adt/jsonfuncs.c:4495 utils/adt/jsonfuncs.c:4653 +#: utils/adt/jsonfuncs.c:4587 utils/adt/jsonfuncs.c:4748 #, c-format msgid "cannot set path in scalar" msgstr "задать путь в скаляре нельзя" -#: utils/adt/jsonfuncs.c:4537 utils/adt/jsonfuncs.c:4579 +#: utils/adt/jsonfuncs.c:4629 utils/adt/jsonfuncs.c:4671 #, c-format msgid "" "null_value_treatment must be \"delete_key\", \"return_target\", " @@ -24633,12 +25656,12 @@ msgstr "" "значением null_value_treatment должно быть \"delete_key\", \"return_target" "\", \"use_json_null\" или \"raise_exception\"" -#: utils/adt/jsonfuncs.c:4550 +#: utils/adt/jsonfuncs.c:4642 #, c-format msgid "JSON value must not be null" msgstr "значение JSON не может быть NULL" -#: utils/adt/jsonfuncs.c:4551 +#: utils/adt/jsonfuncs.c:4643 #, c-format msgid "" "Exception was raised because null_value_treatment is \"raise_exception\"." @@ -24646,7 +25669,7 @@ msgstr "" "Выдано исключение, так как значением null_value_treatment является " "\"raise_exception\"." -#: utils/adt/jsonfuncs.c:4552 +#: utils/adt/jsonfuncs.c:4644 #, c-format msgid "" "To avoid, either change the null_value_treatment argument or ensure that an " @@ -24655,42 +25678,55 @@ msgstr "" "Чтобы исключения не было, либо измените аргумент null_value_treatment, либо " "не допускайте передачи SQL NULL." -#: utils/adt/jsonfuncs.c:4607 +#: utils/adt/jsonfuncs.c:4699 #, c-format msgid "cannot delete path in scalar" msgstr "удалить путь в скаляре нельзя" -#: utils/adt/jsonfuncs.c:4805 +#: utils/adt/jsonfuncs.c:4915 #, c-format msgid "path element at position %d is null" msgstr "элемент пути в позиции %d равен NULL" -#: utils/adt/jsonfuncs.c:4891 +#: utils/adt/jsonfuncs.c:4934 utils/adt/jsonfuncs.c:4965 +#: utils/adt/jsonfuncs.c:5032 #, c-format msgid "cannot replace existing key" msgstr "заменить существующий ключ нельзя" -#: utils/adt/jsonfuncs.c:4892 +#: utils/adt/jsonfuncs.c:4935 utils/adt/jsonfuncs.c:4966 +#, c-format +msgid "The path assumes key is a composite object, but it is a scalar value." +msgstr "" +"Для заданного пути значение ключа должно быть составным объектом, но оно " +"оказалось скаляром." + +#: utils/adt/jsonfuncs.c:5033 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Попробуйте применить функцию jsonb_set для замены значения ключа." -#: utils/adt/jsonfuncs.c:4974 +#: utils/adt/jsonfuncs.c:5137 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "элемент пути в позиции %d - не целочисленный: \"%s\"" -#: utils/adt/jsonfuncs.c:5093 +#: utils/adt/jsonfuncs.c:5154 +#, c-format +msgid "path element at position %d is out of range: %d" +msgstr "элемент пути в позиции %d вне диапазона: %d" + +#: utils/adt/jsonfuncs.c:5306 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "неверный тип флага, допускаются только массивы и скаляры" -#: utils/adt/jsonfuncs.c:5100 +#: utils/adt/jsonfuncs.c:5313 #, c-format msgid "flag array element is not a string" msgstr "элемент массива флагов не является строкой" -#: utils/adt/jsonfuncs.c:5101 utils/adt/jsonfuncs.c:5123 +#: utils/adt/jsonfuncs.c:5314 utils/adt/jsonfuncs.c:5336 #, c-format msgid "" "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all" @@ -24698,7 +25734,7 @@ msgid "" msgstr "" "Допустимые значения: \"string\", \"numeric\", \"boolean\", \"key\" и \"all\"." -#: utils/adt/jsonfuncs.c:5121 +#: utils/adt/jsonfuncs.c:5334 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "неверный флаг в массиве флагов: \"%s\"" @@ -24760,7 +25796,7 @@ msgid "jsonpath array accessor can only be applied to an array" msgstr "" "выражение обращения к массиву в jsonpath может применяться только к массиву" -#: utils/adt/jsonpath_exec.c:874 +#: utils/adt/jsonpath_exec.c:872 #, c-format msgid "jsonpath wildcard member accessor can only be applied to an object" msgstr "" @@ -24768,12 +25804,12 @@ msgstr "" "объекту" # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:1004 +#: utils/adt/jsonpath_exec.c:1002 #, c-format msgid "jsonpath item method .%s() can only be applied to an array" msgstr "метод .%s() в jsonpath может применяться только к массиву" -#: utils/adt/jsonpath_exec.c:1059 +#: utils/adt/jsonpath_exec.c:1055 #, c-format msgid "" "numeric argument of jsonpath item method .%s() is out of range for type " @@ -24782,7 +25818,7 @@ msgstr "" "числовой аргумент метода элемента jsonpath .%s() вне диапазона для типа " "double precision" -#: utils/adt/jsonpath_exec.c:1080 +#: utils/adt/jsonpath_exec.c:1076 #, c-format msgid "" "string argument of jsonpath item method .%s() is not a valid representation " @@ -24792,7 +25828,7 @@ msgstr "" "значения double precision" # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:1093 +#: utils/adt/jsonpath_exec.c:1089 #, c-format msgid "" "jsonpath item method .%s() can only be applied to a string or numeric value" @@ -24800,74 +25836,74 @@ msgstr "" "метод .%s() в jsonpath может применяться только к строковому или числовому " "значению" -#: utils/adt/jsonpath_exec.c:1583 +#: utils/adt/jsonpath_exec.c:1579 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "" "левый операнд оператора %s в jsonpath не является одним числовым значением" -#: utils/adt/jsonpath_exec.c:1590 +#: utils/adt/jsonpath_exec.c:1586 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "" "правый операнд оператора %s в jsonpath не является одним числовым значением" -#: utils/adt/jsonpath_exec.c:1658 +#: utils/adt/jsonpath_exec.c:1654 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "" "операнд унарного оператора %s в jsonpath не является числовым значением" # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:1756 +#: utils/adt/jsonpath_exec.c:1752 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "метод .%s() в jsonpath может применяться только к числовому значению" # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:1796 +#: utils/adt/jsonpath_exec.c:1792 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "метод .%s() в jsonpath может применяться только к строке" -#: utils/adt/jsonpath_exec.c:1890 +#: utils/adt/jsonpath_exec.c:1886 #, c-format msgid "datetime format is not recognized: \"%s\"" msgstr "формат datetime не распознан: \"%s\"" -#: utils/adt/jsonpath_exec.c:1892 +#: utils/adt/jsonpath_exec.c:1888 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "" "Воспользуйтесь аргументом datetime для указания формата входных данных." # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:1960 +#: utils/adt/jsonpath_exec.c:1956 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "метод .%s() в jsonpath может применяться только к объекту" -#: utils/adt/jsonpath_exec.c:2143 +#: utils/adt/jsonpath_exec.c:2138 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "не удалось найти в jsonpath переменную \"%s\"" -#: utils/adt/jsonpath_exec.c:2407 +#: utils/adt/jsonpath_exec.c:2402 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "индекс элемента в jsonpath не является одним числовым значением" -#: utils/adt/jsonpath_exec.c:2419 +#: utils/adt/jsonpath_exec.c:2414 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "индекс массива в jsonpath вне целочисленного диапазона" -#: utils/adt/jsonpath_exec.c:2596 +#: utils/adt/jsonpath_exec.c:2591 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "значение %s нельзя преобразовать в %s без сведений о часовом поясе" -#: utils/adt/jsonpath_exec.c:2598 +#: utils/adt/jsonpath_exec.c:2593 #, c-format msgid "Use *_tz() function for time zone support." msgstr "Для передачи часового пояса используйте функцию *_tz()." @@ -24938,68 +25974,123 @@ msgstr "" "Преобразование из macaddr8 в macaddr возможно только для адресов, содержащих " "FF и FE в 4-ом и 5-ом байтах слева, например xx:xx:xx:ff:fe:xx:xx:xx." -#: utils/adt/misc.c:240 +#: utils/adt/mcxtfuncs.c:184 +#, c-format +msgid "must be a superuser to log memory contexts" +msgstr "получать информацию о содержимом памяти может только суперпользователь" + +#: utils/adt/misc.c:243 #, c-format msgid "global tablespace never has databases" msgstr "в табличном пространстве global никогда не было баз данных" -#: utils/adt/misc.c:262 +#: utils/adt/misc.c:265 #, c-format msgid "%u is not a tablespace OID" msgstr "%u - это не OID табличного пространства" -#: utils/adt/misc.c:448 +#: utils/adt/misc.c:455 msgid "unreserved" msgstr "не зарезервировано" -#: utils/adt/misc.c:452 +#: utils/adt/misc.c:459 msgid "unreserved (cannot be function or type name)" msgstr "не зарезервировано (но не может быть именем типа или функции)" -#: utils/adt/misc.c:456 +#: utils/adt/misc.c:463 msgid "reserved (can be function or type name)" msgstr "зарезервировано (но может быть именем типа или функции)" -#: utils/adt/misc.c:460 +#: utils/adt/misc.c:467 msgid "reserved" msgstr "зарезервировано" -#: utils/adt/misc.c:634 utils/adt/misc.c:648 utils/adt/misc.c:687 -#: utils/adt/misc.c:693 utils/adt/misc.c:699 utils/adt/misc.c:722 +#: utils/adt/misc.c:478 +msgid "can be bare label" +msgstr "может быть открытой меткой" + +#: utils/adt/misc.c:483 +msgid "requires AS" +msgstr "требует AS" + +#: utils/adt/misc.c:730 utils/adt/misc.c:744 utils/adt/misc.c:783 +#: utils/adt/misc.c:789 utils/adt/misc.c:795 utils/adt/misc.c:818 #, c-format msgid "string is not a valid identifier: \"%s\"" msgstr "строка не является допустимым идентификатором: \"%s\"" -#: utils/adt/misc.c:636 +#: utils/adt/misc.c:732 #, c-format msgid "String has unclosed double quotes." msgstr "В строке не закрыты кавычки." -#: utils/adt/misc.c:650 +#: utils/adt/misc.c:746 #, c-format msgid "Quoted identifier must not be empty." msgstr "Идентификатор в кавычках не может быть пустым." -#: utils/adt/misc.c:689 +#: utils/adt/misc.c:785 #, c-format msgid "No valid identifier before \".\"." msgstr "Перед \".\" нет допустимого идентификатора." -#: utils/adt/misc.c:695 +#: utils/adt/misc.c:791 #, c-format msgid "No valid identifier after \".\"." msgstr "После \".\" нет допустимого идентификатора." -#: utils/adt/misc.c:753 +#: utils/adt/misc.c:849 #, c-format msgid "log format \"%s\" is not supported" msgstr "формат журнала \"%s\" не поддерживается" -#: utils/adt/misc.c:754 +#: utils/adt/misc.c:850 #, c-format msgid "The supported log formats are \"stderr\" and \"csvlog\"." msgstr "Поддерживаются форматы журналов \"stderr\" и \"csvlog\"." +#: utils/adt/multirangetypes.c:148 utils/adt/multirangetypes.c:161 +#: utils/adt/multirangetypes.c:190 utils/adt/multirangetypes.c:260 +#: utils/adt/multirangetypes.c:284 +#, c-format +msgid "malformed multirange literal: \"%s\"" +msgstr "ошибочный литерал мультидиапазона: \"%s\"" + +#: utils/adt/multirangetypes.c:150 +#, c-format +msgid "Missing left brace." +msgstr "Отсутствует левая фигурная скобка." + +#: utils/adt/multirangetypes.c:192 +#, c-format +msgid "Expected range start." +msgstr "Ожидалось начало диапазона." + +#: utils/adt/multirangetypes.c:262 +#, c-format +msgid "Expected comma or end of multirange." +msgstr "Ожидалась запятая или конец мультидиапазона." + +#: utils/adt/multirangetypes.c:975 +#, c-format +msgid "multiranges cannot be constructed from multidimensional arrays" +msgstr "мультидиапазоны нельзя получить из массивов мультидиапазонов" + +#: utils/adt/multirangetypes.c:1001 +#, c-format +msgid "multirange values cannot contain null members" +msgstr "мультидиапазоны не могут содержать элементы NULL" + +#: utils/adt/multirangetypes.c:1349 +#, c-format +msgid "range_agg must be called with a range" +msgstr "функция range_agg должна вызываться с диапазоном" + +#: utils/adt/multirangetypes.c:1420 +#, c-format +msgid "range_intersect_agg must be called with a multirange" +msgstr "функция range_intersect_agg должна вызываться с мультидиапазоном" + #: utils/adt/network.c:111 #, c-format msgid "invalid cidr value: \"%s\"" @@ -25074,84 +26165,101 @@ msgstr "результат вне диапазона" msgid "cannot subtract inet values of different sizes" msgstr "нельзя вычитать значения inet разного размера" -#: utils/adt/numeric.c:827 +#: utils/adt/numeric.c:967 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "неверный знак во внешнем значении \"numeric\"" -#: utils/adt/numeric.c:833 +#: utils/adt/numeric.c:973 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "неверный порядок числа во внешнем значении \"numeric\"" -#: utils/adt/numeric.c:842 +#: utils/adt/numeric.c:982 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "неверная цифра во внешнем значении \"numeric\"" -#: utils/adt/numeric.c:1040 utils/adt/numeric.c:1054 +#: utils/adt/numeric.c:1195 utils/adt/numeric.c:1209 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "точность NUMERIC %d должна быть между 1 и %d" -#: utils/adt/numeric.c:1045 +#: utils/adt/numeric.c:1200 #, c-format msgid "NUMERIC scale %d must be between 0 and precision %d" msgstr "порядок NUMERIC %d должен быть между 0 и точностью (%d)" -#: utils/adt/numeric.c:1063 +#: utils/adt/numeric.c:1218 #, c-format msgid "invalid NUMERIC type modifier" msgstr "неверный модификатор типа NUMERIC" -#: utils/adt/numeric.c:1395 +#: utils/adt/numeric.c:1576 #, c-format msgid "start value cannot be NaN" msgstr "начальное значение не может быть NaN" -#: utils/adt/numeric.c:1400 +#: utils/adt/numeric.c:1580 +#, c-format +msgid "start value cannot be infinity" +msgstr "начальное значение не может быть бесконечностью" + +#: utils/adt/numeric.c:1587 #, c-format msgid "stop value cannot be NaN" msgstr "конечное значение не может быть NaN" -#: utils/adt/numeric.c:1410 +#: utils/adt/numeric.c:1591 +#, c-format +msgid "stop value cannot be infinity" +msgstr "конечное значение не может быть бесконечностью" + +#: utils/adt/numeric.c:1604 #, c-format msgid "step size cannot be NaN" msgstr "размер шага не может быть NaN" -#: utils/adt/numeric.c:2958 utils/adt/numeric.c:6064 utils/adt/numeric.c:6522 -#: utils/adt/numeric.c:8802 utils/adt/numeric.c:9240 utils/adt/numeric.c:9354 -#: utils/adt/numeric.c:9427 +#: utils/adt/numeric.c:1608 #, c-format -msgid "value overflows numeric format" -msgstr "значение переполняет формат numeric" +msgid "step size cannot be infinity" +msgstr "размер шага не может быть бесконечностью" + +#: utils/adt/numeric.c:3489 +#, c-format +msgid "factorial of a negative number is undefined" +msgstr "факториал отрицательного числа даёт неопределённость" -#: utils/adt/numeric.c:3417 +#: utils/adt/numeric.c:3499 utils/adt/numeric.c:6921 utils/adt/numeric.c:7394 +#: utils/adt/numeric.c:9771 utils/adt/numeric.c:10250 utils/adt/numeric.c:10376 +#: utils/adt/numeric.c:10449 #, c-format -msgid "cannot convert NaN to integer" -msgstr "нельзя преобразовать NaN в integer" +msgid "value overflows numeric format" +msgstr "значение переполняет формат numeric" -#: utils/adt/numeric.c:3500 +#: utils/adt/numeric.c:4181 utils/adt/numeric.c:4261 utils/adt/numeric.c:4302 +#: utils/adt/numeric.c:4496 #, c-format -msgid "cannot convert NaN to bigint" -msgstr "нельзя преобразовать NaN в bigint" +msgid "cannot convert NaN to %s" +msgstr "нельзя преобразовать NaN в %s" -#: utils/adt/numeric.c:3545 +#: utils/adt/numeric.c:4185 utils/adt/numeric.c:4265 utils/adt/numeric.c:4306 +#: utils/adt/numeric.c:4500 #, c-format -msgid "cannot convert NaN to smallint" -msgstr "нельзя преобразовать NaN в smallint" +msgid "cannot convert infinity to %s" +msgstr "нельзя представить бесконечность в %s" -#: utils/adt/numeric.c:3582 utils/adt/numeric.c:3653 +#: utils/adt/numeric.c:4509 #, c-format -msgid "cannot convert infinity to numeric" -msgstr "нельзя представить бесконечность в numeric" +msgid "pg_lsn out of range" +msgstr "pg_lsn вне диапазона" -#: utils/adt/numeric.c:6606 +#: utils/adt/numeric.c:7478 utils/adt/numeric.c:7525 #, c-format msgid "numeric field overflow" msgstr "переполнение поля numeric" -#: utils/adt/numeric.c:6607 +#: utils/adt/numeric.c:7479 #, c-format msgid "" "A field with precision %d, scale %d must round to an absolute value less " @@ -25160,6 +26268,12 @@ msgstr "" "Поле с точностью %d, порядком %d должно округляться до абсолютного значения " "меньше чем %s%d." +#: utils/adt/numeric.c:7526 +#, c-format +msgid "A field with precision %d, scale %d cannot hold an infinite value." +msgstr "" +"Поле с точностью %d, порядком %d не может содержать значение бесконечности." + #: utils/adt/numutils.c:154 #, c-format msgid "value \"%s\" is out of range for 8-bit integer" @@ -25170,22 +26284,22 @@ msgstr "значение \"%s\" вне диапазона для 8-битово msgid "invalid oidvector data" msgstr "неверные данные oidvector" -#: utils/adt/oracle_compat.c:896 +#: utils/adt/oracle_compat.c:970 #, c-format msgid "requested character too large" msgstr "запрошенный символ больше допустимого" -#: utils/adt/oracle_compat.c:946 utils/adt/oracle_compat.c:1008 +#: utils/adt/oracle_compat.c:1020 utils/adt/oracle_compat.c:1082 #, c-format msgid "requested character too large for encoding: %d" msgstr "код запрошенного символа слишком велик для кодировки: %d" -#: utils/adt/oracle_compat.c:987 +#: utils/adt/oracle_compat.c:1061 #, c-format msgid "requested character not valid for encoding: %d" msgstr "запрошенный символ не подходит для кодировки: %d" -#: utils/adt/oracle_compat.c:1001 +#: utils/adt/oracle_compat.c:1075 #, c-format msgid "null character not permitted" msgstr "символ не может быть null" @@ -25196,24 +26310,24 @@ msgstr "символ не может быть null" msgid "percentile value %g is not between 0 and 1" msgstr "значение перцентиля %g лежит не в диапазоне 0..1" -#: utils/adt/pg_locale.c:1262 +#: utils/adt/pg_locale.c:1228 #, c-format msgid "Apply system library package updates." msgstr "Обновите пакет с системной библиотекой." -#: utils/adt/pg_locale.c:1477 +#: utils/adt/pg_locale.c:1442 #, c-format msgid "could not create locale \"%s\": %m" msgstr "не удалось создать локаль \"%s\": %m" -#: utils/adt/pg_locale.c:1480 +#: utils/adt/pg_locale.c:1445 #, c-format msgid "" "The operating system could not find any locale data for the locale name \"%s" "\"." msgstr "Операционная система не может найти данные локали с именем \"%s\"." -#: utils/adt/pg_locale.c:1582 +#: utils/adt/pg_locale.c:1547 #, c-format msgid "" "collations with different collate and ctype values are not supported on this " @@ -25222,54 +26336,49 @@ msgstr "" "правила сортировки с разными значениями collate и ctype не поддерживаются на " "этой платформе" -#: utils/adt/pg_locale.c:1591 +#: utils/adt/pg_locale.c:1556 #, c-format msgid "collation provider LIBC is not supported on this platform" -msgstr "поставщик правил сортировки LIBC не поддерживается на этой платформе" +msgstr "провайдер правил сортировки LIBC не поддерживается на этой платформе" -#: utils/adt/pg_locale.c:1603 +#: utils/adt/pg_locale.c:1568 #, c-format msgid "" "collations with different collate and ctype values are not supported by ICU" msgstr "" "ICU не поддерживает правила сортировки с разными значениями collate и ctype" -#: utils/adt/pg_locale.c:1609 utils/adt/pg_locale.c:1696 -#: utils/adt/pg_locale.c:1969 +#: utils/adt/pg_locale.c:1574 utils/adt/pg_locale.c:1661 +#: utils/adt/pg_locale.c:1940 #, c-format msgid "could not open collator for locale \"%s\": %s" msgstr "не удалось открыть сортировщик для локали \"%s\": %s" -#: utils/adt/pg_locale.c:1623 +#: utils/adt/pg_locale.c:1588 #, c-format msgid "ICU is not supported in this build" msgstr "ICU не поддерживается в данной сборке" -#: utils/adt/pg_locale.c:1624 -#, c-format -msgid "You need to rebuild PostgreSQL using --with-icu." -msgstr "Необходимо перекомпилировать PostgreSQL с ключом --with-icu." - -#: utils/adt/pg_locale.c:1644 +#: utils/adt/pg_locale.c:1609 #, c-format msgid "collation \"%s\" has no actual version, but a version was specified" msgstr "для правила сортировки \"%s\", лишённого версии, была задана версия" -#: utils/adt/pg_locale.c:1651 +#: utils/adt/pg_locale.c:1616 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "несовпадение версии для правила сортировки \"%s\"" -#: utils/adt/pg_locale.c:1653 +#: utils/adt/pg_locale.c:1618 #, c-format msgid "" "The collation in the database was created using version %s, but the " "operating system provides version %s." msgstr "" "Правило сортировки в базе данных было создано с версией %s, но операционная " -"версия предоставляет версию %s." +"система предоставляет версию %s." -#: utils/adt/pg_locale.c:1656 +#: utils/adt/pg_locale.c:1621 #, c-format msgid "" "Rebuild all objects affected by this collation and run ALTER COLLATION %s " @@ -25279,35 +26388,40 @@ msgstr "" "ALTER COLLATION %s REFRESH VERSION либо соберите PostgreSQL с правильной " "версией библиотеки." -#: utils/adt/pg_locale.c:1747 +#: utils/adt/pg_locale.c:1692 +#, c-format +msgid "could not load locale \"%s\"" +msgstr "не удалось загрузить локаль \"%s\"" + +#: utils/adt/pg_locale.c:1717 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "" "не удалось получить версию правила сортировки для локали \"%s\" (код ошибки: " "%lu)" -#: utils/adt/pg_locale.c:1784 +#: utils/adt/pg_locale.c:1755 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "ICU не поддерживает кодировку \"%s\"" -#: utils/adt/pg_locale.c:1791 +#: utils/adt/pg_locale.c:1762 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "не удалось открыть преобразователь ICU для кодировки \"%s\": %s" -#: utils/adt/pg_locale.c:1822 utils/adt/pg_locale.c:1831 -#: utils/adt/pg_locale.c:1860 utils/adt/pg_locale.c:1870 +#: utils/adt/pg_locale.c:1793 utils/adt/pg_locale.c:1802 +#: utils/adt/pg_locale.c:1831 utils/adt/pg_locale.c:1841 #, c-format msgid "%s failed: %s" msgstr "ошибка %s: %s" -#: utils/adt/pg_locale.c:2142 +#: utils/adt/pg_locale.c:2113 #, c-format msgid "invalid multibyte character for locale" msgstr "неверный многобайтный символ для локали" -#: utils/adt/pg_locale.c:2143 +#: utils/adt/pg_locale.c:2114 #, c-format msgid "" "The server's LC_CTYPE locale is probably incompatible with the database " @@ -25315,106 +26429,121 @@ msgid "" msgstr "" "Параметр локали сервера LC_CTYPE, возможно, несовместим с кодировкой БД." +#: utils/adt/pg_lsn.c:263 +#, c-format +msgid "cannot add NaN to pg_lsn" +msgstr "нельзя добавить NaN к pg_lsn" + +#: utils/adt/pg_lsn.c:297 +#, c-format +msgid "cannot subtract NaN from pg_lsn" +msgstr "нельзя вычесть NaN из pg_lsn" + #: utils/adt/pg_upgrade_support.c:29 #, c-format msgid "function can only be called when server is in binary upgrade mode" msgstr "" "функцию можно вызывать только когда сервер в режиме двоичного обновления" -#: utils/adt/pgstatfuncs.c:500 +#: utils/adt/pgstatfuncs.c:503 #, c-format msgid "invalid command name: \"%s\"" msgstr "неверное имя команды: \"%s\"" -#: utils/adt/pseudotypes.c:57 utils/adt/pseudotypes.c:91 +#: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 #, c-format msgid "cannot display a value of type %s" msgstr "значение типа %s нельзя вывести" -#: utils/adt/pseudotypes.c:283 +#: utils/adt/pseudotypes.c:321 #, c-format msgid "cannot accept a value of a shell type" msgstr "значение типа shell нельзя ввести" -#: utils/adt/pseudotypes.c:293 +#: utils/adt/pseudotypes.c:331 #, c-format msgid "cannot display a value of a shell type" msgstr "значение типа shell нельзя вывести" -#: utils/adt/rangetypes.c:406 +#: utils/adt/rangetypes.c:404 #, c-format msgid "range constructor flags argument must not be null" msgstr "аргумент flags конструктора диапазона не может быть NULL" -#: utils/adt/rangetypes.c:993 +#: utils/adt/rangetypes.c:1003 #, c-format msgid "result of range difference would not be contiguous" msgstr "результат вычитания диапазонов будет не непрерывным" -#: utils/adt/rangetypes.c:1054 +#: utils/adt/rangetypes.c:1064 #, c-format msgid "result of range union would not be contiguous" msgstr "результат объединения диапазонов будет не непрерывным" -#: utils/adt/rangetypes.c:1600 +#: utils/adt/rangetypes.c:1214 +#, c-format +msgid "range_intersect_agg must be called with a range" +msgstr "функция range_intersect_agg должна вызываться с диапазоном" + +#: utils/adt/rangetypes.c:1689 #, c-format msgid "range lower bound must be less than or equal to range upper bound" msgstr "нижняя граница диапазона должна быть меньше или равна верхней" -#: utils/adt/rangetypes.c:1983 utils/adt/rangetypes.c:1996 -#: utils/adt/rangetypes.c:2010 +#: utils/adt/rangetypes.c:2112 utils/adt/rangetypes.c:2125 +#: utils/adt/rangetypes.c:2139 #, c-format msgid "invalid range bound flags" msgstr "неверные флаги границ диапазона" -#: utils/adt/rangetypes.c:1984 utils/adt/rangetypes.c:1997 -#: utils/adt/rangetypes.c:2011 +#: utils/adt/rangetypes.c:2113 utils/adt/rangetypes.c:2126 +#: utils/adt/rangetypes.c:2140 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "Допустимые значения: \"[]\", \"[)\", \"(]\" и \"()\"." -#: utils/adt/rangetypes.c:2076 utils/adt/rangetypes.c:2093 -#: utils/adt/rangetypes.c:2106 utils/adt/rangetypes.c:2124 -#: utils/adt/rangetypes.c:2135 utils/adt/rangetypes.c:2179 -#: utils/adt/rangetypes.c:2187 +#: utils/adt/rangetypes.c:2205 utils/adt/rangetypes.c:2222 +#: utils/adt/rangetypes.c:2235 utils/adt/rangetypes.c:2253 +#: utils/adt/rangetypes.c:2264 utils/adt/rangetypes.c:2308 +#: utils/adt/rangetypes.c:2316 #, c-format msgid "malformed range literal: \"%s\"" msgstr "ошибочный литерал диапазона: \"%s\"" -#: utils/adt/rangetypes.c:2078 +#: utils/adt/rangetypes.c:2207 #, c-format msgid "Junk after \"empty\" key word." msgstr "Мусор после ключевого слова \"empty\"." -#: utils/adt/rangetypes.c:2095 +#: utils/adt/rangetypes.c:2224 #, c-format msgid "Missing left parenthesis or bracket." msgstr "Отсутствует левая скобка (круглая или квадратная)." -#: utils/adt/rangetypes.c:2108 +#: utils/adt/rangetypes.c:2237 #, c-format msgid "Missing comma after lower bound." msgstr "Отсутствует запятая после нижней границы." -#: utils/adt/rangetypes.c:2126 +#: utils/adt/rangetypes.c:2255 #, c-format msgid "Too many commas." msgstr "Слишком много запятых." -#: utils/adt/rangetypes.c:2137 +#: utils/adt/rangetypes.c:2266 #, c-format msgid "Junk after right parenthesis or bracket." msgstr "Мусор после правой скобки." -#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4511 +#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4553 #, c-format msgid "regular expression failed: %s" msgstr "ошибка в регулярном выражении: %s" #: utils/adt/regexp.c:426 #, c-format -msgid "invalid regular expression option: \"%c\"" -msgstr "неверный параметр регулярного выражения: \"%c\"" +msgid "invalid regular expression option: \"%.*s\"" +msgstr "неверный параметр регулярного выражения: \"%.*s\"" #: utils/adt/regexp.c:836 #, c-format @@ -25441,98 +26570,98 @@ msgstr "Вместо неё используйте функцию regexp_matches msgid "too many regular expression matches" msgstr "слишком много совпадений для регулярного выражения" -#: utils/adt/regproc.c:107 +#: utils/adt/regproc.c:105 #, c-format msgid "more than one function named \"%s\"" msgstr "имя \"%s\" имеют несколько функций" -#: utils/adt/regproc.c:525 +#: utils/adt/regproc.c:543 #, c-format msgid "more than one operator named %s" msgstr "имя %s имеют несколько операторов" -#: utils/adt/regproc.c:692 utils/adt/regproc.c:733 gram.y:8224 +#: utils/adt/regproc.c:710 utils/adt/regproc.c:751 gram.y:8188 #, c-format msgid "missing argument" msgstr "отсутствует аргумент" -#: utils/adt/regproc.c:693 utils/adt/regproc.c:734 gram.y:8225 +#: utils/adt/regproc.c:711 utils/adt/regproc.c:752 gram.y:8189 #, c-format msgid "Use NONE to denote the missing argument of a unary operator." msgstr "" "Чтобы обозначить отсутствующий аргумент унарного оператора, укажите NONE." -#: utils/adt/regproc.c:697 utils/adt/regproc.c:738 utils/adt/regproc.c:2018 -#: utils/adt/ruleutils.c:9298 utils/adt/ruleutils.c:9467 +#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 +#: utils/adt/ruleutils.c:9706 utils/adt/ruleutils.c:9875 #, c-format msgid "too many arguments" msgstr "слишком много аргументов" -#: utils/adt/regproc.c:698 utils/adt/regproc.c:739 +#: utils/adt/regproc.c:716 utils/adt/regproc.c:757 #, c-format msgid "Provide two argument types for operator." msgstr "Предоставьте для оператора два типа аргументов." -#: utils/adt/regproc.c:1602 utils/adt/regproc.c:1626 utils/adt/regproc.c:1727 -#: utils/adt/regproc.c:1751 utils/adt/regproc.c:1853 utils/adt/regproc.c:1858 -#: utils/adt/varlena.c:3660 utils/adt/varlena.c:3665 +#: utils/adt/regproc.c:1639 utils/adt/regproc.c:1663 utils/adt/regproc.c:1764 +#: utils/adt/regproc.c:1788 utils/adt/regproc.c:1890 utils/adt/regproc.c:1895 +#: utils/adt/varlena.c:3702 utils/adt/varlena.c:3707 #, c-format msgid "invalid name syntax" msgstr "ошибка синтаксиса в имени" -#: utils/adt/regproc.c:1916 +#: utils/adt/regproc.c:1953 #, c-format msgid "expected a left parenthesis" msgstr "ожидалась левая скобка" -#: utils/adt/regproc.c:1932 +#: utils/adt/regproc.c:1969 #, c-format msgid "expected a right parenthesis" msgstr "ожидалась правая скобка" -#: utils/adt/regproc.c:1951 +#: utils/adt/regproc.c:1988 #, c-format msgid "expected a type name" msgstr "ожидалось имя типа" -#: utils/adt/regproc.c:1983 +#: utils/adt/regproc.c:2020 #, c-format msgid "improper type name" msgstr "ошибочное имя типа" -#: utils/adt/ri_triggers.c:296 utils/adt/ri_triggers.c:1537 -#: utils/adt/ri_triggers.c:2467 +#: utils/adt/ri_triggers.c:300 utils/adt/ri_triggers.c:1545 +#: utils/adt/ri_triggers.c:2530 #, c-format msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" msgstr "" "INSERT или UPDATE в таблице \"%s\" нарушает ограничение внешнего ключа \"%s\"" -#: utils/adt/ri_triggers.c:299 utils/adt/ri_triggers.c:1540 +#: utils/adt/ri_triggers.c:303 utils/adt/ri_triggers.c:1548 #, c-format msgid "MATCH FULL does not allow mixing of null and nonnull key values." msgstr "MATCH FULL не позволяет смешивать в значении ключа null и не null." -#: utils/adt/ri_triggers.c:1940 +#: utils/adt/ri_triggers.c:1965 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "функция \"%s\" должна запускаться для INSERT" -#: utils/adt/ri_triggers.c:1946 +#: utils/adt/ri_triggers.c:1971 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "функция \"%s\" должна запускаться для UPDATE" -#: utils/adt/ri_triggers.c:1952 +#: utils/adt/ri_triggers.c:1977 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "функция \"%s\" должна запускаться для DELETE" -#: utils/adt/ri_triggers.c:1975 +#: utils/adt/ri_triggers.c:2000 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "для триггера \"%s\" таблицы \"%s\" нет записи pg_constraint" -#: utils/adt/ri_triggers.c:1977 +#: utils/adt/ri_triggers.c:2002 #, c-format msgid "" "Remove this referential integrity trigger and its mates, then do ALTER TABLE " @@ -25541,12 +26670,12 @@ msgstr "" "Удалите этот триггер ссылочной целостности и связанные объекты, а затем " "выполните ALTER TABLE ADD CONSTRAINT." -#: utils/adt/ri_triggers.c:2007 gram.y:3819 +#: utils/adt/ri_triggers.c:2032 gram.y:3933 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "выражение MATCH PARTIAL ещё не реализовано" -#: utils/adt/ri_triggers.c:2292 +#: utils/adt/ri_triggers.c:2355 #, c-format msgid "" "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave " @@ -25555,33 +26684,33 @@ msgstr "" "неожиданный результат запроса ссылочной целостности к \"%s\" из ограничения " "\"%s\" таблицы \"%s\"" -#: utils/adt/ri_triggers.c:2296 +#: utils/adt/ri_triggers.c:2359 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "Скорее всего это вызвано правилом, переписавшим запрос." -#: utils/adt/ri_triggers.c:2457 +#: utils/adt/ri_triggers.c:2520 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "" "при удалении секции \"%s\" нарушается ограничение внешнего ключа \"%s\"" -#: utils/adt/ri_triggers.c:2460 utils/adt/ri_triggers.c:2485 +#: utils/adt/ri_triggers.c:2523 utils/adt/ri_triggers.c:2548 #, c-format msgid "Key (%s)=(%s) is still referenced from table \"%s\"." msgstr "На ключ (%s)=(%s) всё ещё есть ссылки в таблице \"%s\"." -#: utils/adt/ri_triggers.c:2471 +#: utils/adt/ri_triggers.c:2534 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "Ключ (%s)=(%s) отсутствует в таблице \"%s\"." -#: utils/adt/ri_triggers.c:2474 +#: utils/adt/ri_triggers.c:2537 #, c-format msgid "Key is not present in table \"%s\"." msgstr "Ключ отсутствует в таблице \"%s\"." -#: utils/adt/ri_triggers.c:2480 +#: utils/adt/ri_triggers.c:2543 #, c-format msgid "" "update or delete on table \"%s\" violates foreign key constraint \"%s\" on " @@ -25590,184 +26719,190 @@ msgstr "" "UPDATE или DELETE в таблице \"%s\" нарушает ограничение внешнего ключа \"%s" "\" таблицы \"%s\"" -#: utils/adt/ri_triggers.c:2488 +#: utils/adt/ri_triggers.c:2551 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "На ключ всё ещё есть ссылки в таблице \"%s\"." -#: utils/adt/rowtypes.c:104 utils/adt/rowtypes.c:482 +#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:483 #, c-format msgid "input of anonymous composite types is not implemented" msgstr "ввод анонимных составных типов не реализован" -#: utils/adt/rowtypes.c:156 utils/adt/rowtypes.c:185 utils/adt/rowtypes.c:208 -#: utils/adt/rowtypes.c:216 utils/adt/rowtypes.c:268 utils/adt/rowtypes.c:276 +#: utils/adt/rowtypes.c:157 utils/adt/rowtypes.c:186 utils/adt/rowtypes.c:209 +#: utils/adt/rowtypes.c:217 utils/adt/rowtypes.c:269 utils/adt/rowtypes.c:277 #, c-format msgid "malformed record literal: \"%s\"" msgstr "ошибка в литерале записи: \"%s\"" -#: utils/adt/rowtypes.c:157 +#: utils/adt/rowtypes.c:158 #, c-format msgid "Missing left parenthesis." msgstr "Отсутствует левая скобка." -#: utils/adt/rowtypes.c:186 +#: utils/adt/rowtypes.c:187 #, c-format msgid "Too few columns." msgstr "Слишком мало столбцов." -#: utils/adt/rowtypes.c:269 +#: utils/adt/rowtypes.c:270 #, c-format msgid "Too many columns." msgstr "Слишком много столбцов." -#: utils/adt/rowtypes.c:277 +#: utils/adt/rowtypes.c:278 #, c-format msgid "Junk after right parenthesis." msgstr "Мусор после правой скобки." -#: utils/adt/rowtypes.c:531 +#: utils/adt/rowtypes.c:532 #, c-format msgid "wrong number of columns: %d, expected %d" msgstr "неверное число столбцов: %d, ожидалось: %d" -#: utils/adt/rowtypes.c:559 +#: utils/adt/rowtypes.c:574 #, c-format -msgid "wrong data type: %u, expected %u" -msgstr "неверный тип данных: %u, ожидался %u" +msgid "" +"binary data has type %u (%s) instead of expected %u (%s) in record column %d" +msgstr "" +"с бинарными данными связан тип %u (%s) вместо ожидаемого %u (%s) в столбце " +"записи %d" -#: utils/adt/rowtypes.c:620 +#: utils/adt/rowtypes.c:641 #, c-format msgid "improper binary format in record column %d" msgstr "неподходящий двоичный формат в столбце записи %d" -#: utils/adt/rowtypes.c:911 utils/adt/rowtypes.c:1157 utils/adt/rowtypes.c:1415 -#: utils/adt/rowtypes.c:1661 +#: utils/adt/rowtypes.c:932 utils/adt/rowtypes.c:1178 utils/adt/rowtypes.c:1436 +#: utils/adt/rowtypes.c:1682 #, c-format msgid "cannot compare dissimilar column types %s and %s at record column %d" msgstr "не удалось сравнить различные типы столбцов %s и %s, столбец записи %d" -#: utils/adt/rowtypes.c:1002 utils/adt/rowtypes.c:1227 -#: utils/adt/rowtypes.c:1512 utils/adt/rowtypes.c:1697 +#: utils/adt/rowtypes.c:1023 utils/adt/rowtypes.c:1248 +#: utils/adt/rowtypes.c:1533 utils/adt/rowtypes.c:1718 #, c-format msgid "cannot compare record types with different numbers of columns" msgstr "сравнивать типы записей с разным числом столбцов нельзя" -#: utils/adt/ruleutils.c:4822 +#: utils/adt/ruleutils.c:5118 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "правило \"%s\" имеет неподдерживаемый тип событий %d" -#: utils/adt/timestamp.c:107 +#: utils/adt/timestamp.c:109 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "TIMESTAMP(%d)%s: точность должна быть неотрицательна" -#: utils/adt/timestamp.c:113 +#: utils/adt/timestamp.c:115 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "TIMESTAMP(%d)%s: точность уменьшена до дозволенного максимума: %d" -#: utils/adt/timestamp.c:176 utils/adt/timestamp.c:434 utils/misc/guc.c:11929 +#: utils/adt/timestamp.c:178 utils/adt/timestamp.c:436 utils/misc/guc.c:12412 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestamp вне диапазона: \"%s\"" -#: utils/adt/timestamp.c:372 +#: utils/adt/timestamp.c:374 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "точность timestamp(%d) должна быть между %d и %d" -#: utils/adt/timestamp.c:496 +#: utils/adt/timestamp.c:498 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "" "Запись числового часового пояса должна начинаться с символа \"-\" или \"+\"." -#: utils/adt/timestamp.c:509 +#: utils/adt/timestamp.c:511 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "числовой часовой пояс \"%s\" вне диапазона" -#: utils/adt/timestamp.c:601 utils/adt/timestamp.c:611 -#: utils/adt/timestamp.c:619 +#: utils/adt/timestamp.c:607 utils/adt/timestamp.c:617 +#: utils/adt/timestamp.c:625 #, c-format msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" msgstr "timestamp вне диапазона: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:720 +#: utils/adt/timestamp.c:726 #, c-format msgid "timestamp cannot be NaN" msgstr "timestamp не может быть NaN" -#: utils/adt/timestamp.c:738 utils/adt/timestamp.c:750 +#: utils/adt/timestamp.c:744 utils/adt/timestamp.c:756 #, c-format msgid "timestamp out of range: \"%g\"" msgstr "timestamp вне диапазона: \"%g\"" -#: utils/adt/timestamp.c:935 utils/adt/timestamp.c:1509 -#: utils/adt/timestamp.c:1976 utils/adt/timestamp.c:3053 -#: utils/adt/timestamp.c:3058 utils/adt/timestamp.c:3063 -#: utils/adt/timestamp.c:3113 utils/adt/timestamp.c:3120 -#: utils/adt/timestamp.c:3127 utils/adt/timestamp.c:3147 -#: utils/adt/timestamp.c:3154 utils/adt/timestamp.c:3161 -#: utils/adt/timestamp.c:3191 utils/adt/timestamp.c:3199 -#: utils/adt/timestamp.c:3243 utils/adt/timestamp.c:3670 -#: utils/adt/timestamp.c:3795 utils/adt/timestamp.c:4255 -#, c-format -msgid "interval out of range" -msgstr "interval вне диапазона" - -#: utils/adt/timestamp.c:1062 utils/adt/timestamp.c:1095 +#: utils/adt/timestamp.c:1068 utils/adt/timestamp.c:1101 #, c-format msgid "invalid INTERVAL type modifier" msgstr "неверный модификатор типа INTERVAL" -#: utils/adt/timestamp.c:1078 +#: utils/adt/timestamp.c:1084 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "INTERVAL(%d): точность должна быть неотрицательна" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1090 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "INTERVAL(%d): точность уменьшена до максимально возможной: %d" -#: utils/adt/timestamp.c:1466 +#: utils/adt/timestamp.c:1472 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "точность interval(%d) должна быть между %d и %d" -#: utils/adt/timestamp.c:2654 +#: utils/adt/timestamp.c:2660 #, c-format msgid "cannot subtract infinite timestamps" msgstr "вычитать бесконечные значения timestamp нельзя" -#: utils/adt/timestamp.c:3923 utils/adt/timestamp.c:4516 -#: utils/adt/timestamp.c:4678 utils/adt/timestamp.c:4699 +#: utils/adt/timestamp.c:3837 utils/adt/timestamp.c:4020 +#, c-format +msgid "origin out of range" +msgstr "начало вне диапазона" + +#: utils/adt/timestamp.c:3842 utils/adt/timestamp.c:4025 +#, c-format +msgid "timestamps cannot be binned into intervals containing months or years" +msgstr "" +"значения timestamp нельзя подогнать под интервалы, содержащие месяцы или годы" + +#: utils/adt/timestamp.c:3849 utils/adt/timestamp.c:4032 +#, c-format +msgid "stride must be greater than zero" +msgstr "шаг должен быть больше нуля" + +#: utils/adt/timestamp.c:3978 utils/adt/timestamp.c:4620 +#: utils/adt/timestamp.c:4820 utils/adt/timestamp.c:4867 #, c-format msgid "timestamp units \"%s\" not supported" msgstr "единицы timestamp \"%s\" не поддерживаются" -#: utils/adt/timestamp.c:3937 utils/adt/timestamp.c:4470 -#: utils/adt/timestamp.c:4709 +#: utils/adt/timestamp.c:3992 utils/adt/timestamp.c:4574 +#: utils/adt/timestamp.c:4877 #, c-format msgid "timestamp units \"%s\" not recognized" msgstr "единицы timestamp \"%s\" не распознаны" -#: utils/adt/timestamp.c:4067 utils/adt/timestamp.c:4511 -#: utils/adt/timestamp.c:4874 utils/adt/timestamp.c:4896 +#: utils/adt/timestamp.c:4171 utils/adt/timestamp.c:4615 +#: utils/adt/timestamp.c:5091 utils/adt/timestamp.c:5139 #, c-format msgid "timestamp with time zone units \"%s\" not supported" msgstr "единицы timestamp с часовым поясом \"%s\" не поддерживаются" -#: utils/adt/timestamp.c:4084 utils/adt/timestamp.c:4465 -#: utils/adt/timestamp.c:4905 +#: utils/adt/timestamp.c:4188 utils/adt/timestamp.c:4569 +#: utils/adt/timestamp.c:5148 #, c-format msgid "timestamp with time zone units \"%s\" not recognized" msgstr "единицы timestamp с часовым поясом \"%s\" не распознаны" -#: utils/adt/timestamp.c:4242 +#: utils/adt/timestamp.c:4346 #, c-format msgid "" "interval units \"%s\" not supported because months usually have fractional " @@ -25776,12 +26911,12 @@ msgstr "" "единицы интервала \"%s\" не поддерживаются, так как в месяцах дробное число " "недель" -#: utils/adt/timestamp.c:4248 utils/adt/timestamp.c:4999 +#: utils/adt/timestamp.c:4352 utils/adt/timestamp.c:5271 #, c-format msgid "interval units \"%s\" not supported" msgstr "единицы interval \"%s\" не поддерживаются" -#: utils/adt/timestamp.c:4264 utils/adt/timestamp.c:5022 +#: utils/adt/timestamp.c:4368 utils/adt/timestamp.c:5332 #, c-format msgid "interval units \"%s\" not recognized" msgstr "единицы interval \"%s\" не распознаны" @@ -25817,43 +26952,47 @@ msgstr "" msgid "gtsvector_in not implemented" msgstr "функция gtsvector_in не реализована" -#: utils/adt/tsquery.c:200 +#: utils/adt/tsquery.c:199 utils/adt/tsquery_op.c:124 #, c-format -msgid "distance in phrase operator should not be greater than %d" -msgstr "дистанция во фразовом операторе должна быть не больше %d" +msgid "" +"distance in phrase operator must be an integer value between zero and %d " +"inclusive" +msgstr "" +"расстояние во фразовом операторе должно быть целым числом от 0 до %d " +"включительно" -#: utils/adt/tsquery.c:310 utils/adt/tsquery.c:725 +#: utils/adt/tsquery.c:306 utils/adt/tsquery.c:691 #: utils/adt/tsvector_parser.c:133 #, c-format msgid "syntax error in tsquery: \"%s\"" msgstr "ошибка синтаксиса в tsquery: \"%s\"" -#: utils/adt/tsquery.c:334 +#: utils/adt/tsquery.c:330 #, c-format msgid "no operand in tsquery: \"%s\"" msgstr "нет оператора в tsquery: \"%s\"" -#: utils/adt/tsquery.c:568 +#: utils/adt/tsquery.c:534 #, c-format msgid "value is too big in tsquery: \"%s\"" msgstr "слишком большое значение в tsquery: \"%s\"" -#: utils/adt/tsquery.c:573 +#: utils/adt/tsquery.c:539 #, c-format msgid "operand is too long in tsquery: \"%s\"" msgstr "слишком длинный операнд в tsquery: \"%s\"" -#: utils/adt/tsquery.c:601 +#: utils/adt/tsquery.c:567 #, c-format msgid "word is too long in tsquery: \"%s\"" msgstr "слишком длинное слово в tsquery: \"%s\"" -#: utils/adt/tsquery.c:870 +#: utils/adt/tsquery.c:835 #, c-format msgid "text-search query doesn't contain lexemes: \"%s\"" msgstr "запрос поиска текста не содержит лексемы: \"%s\"" -#: utils/adt/tsquery.c:881 utils/adt/tsquery_util.c:375 +#: utils/adt/tsquery.c:846 utils/adt/tsquery_util.c:375 #, c-format msgid "tsquery is too large" msgstr "tsquery слишком большой" @@ -25867,12 +27006,6 @@ msgstr "" "запрос поиска текста игнорируется, так как содержит только стоп-слова или не " "содержит лексем" -#: utils/adt/tsquery_op.c:124 -#, c-format -msgid "distance in phrase operator should be non-negative and less than %d" -msgstr "" -"дистанция во фразовом операторе должна быть неотрицательной и меньше %d" - #: utils/adt/tsquery_rewrite.c:321 #, c-format msgid "ts_rewrite query must return two tsquery columns" @@ -25893,7 +27026,7 @@ msgstr "массив весов слишком мал" msgid "array of weight must not contain nulls" msgstr "массив весов не может содержать null" -#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:872 +#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:871 #, c-format msgid "weight out of range" msgstr "вес вне диапазона" @@ -25924,42 +27057,42 @@ msgstr "массив весов не может содержать элемен msgid "unrecognized weight: \"%c\"" msgstr "нераспознанный вес: \"%c\"" -#: utils/adt/tsvector_op.c:2414 +#: utils/adt/tsvector_op.c:2426 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "запрос ts_stat должен вернуть один столбец tsvector" -#: utils/adt/tsvector_op.c:2603 +#: utils/adt/tsvector_op.c:2615 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "столбец \"%s\" типа tsvector не существует" -#: utils/adt/tsvector_op.c:2610 +#: utils/adt/tsvector_op.c:2622 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "столбец \"%s\" должен иметь тип tsvector" -#: utils/adt/tsvector_op.c:2622 +#: utils/adt/tsvector_op.c:2634 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "столбец конфигурации \"%s\" не существует" -#: utils/adt/tsvector_op.c:2628 +#: utils/adt/tsvector_op.c:2640 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "столбец \"%s\" должен иметь тип regconfig" -#: utils/adt/tsvector_op.c:2635 +#: utils/adt/tsvector_op.c:2647 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "значение столбца конфигурации \"%s\" не должно быть null" -#: utils/adt/tsvector_op.c:2648 +#: utils/adt/tsvector_op.c:2660 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "имя конфигурации текстового поиска \"%s\" должно указываться со схемой" -#: utils/adt/tsvector_op.c:2673 +#: utils/adt/tsvector_op.c:2685 #, c-format msgid "column \"%s\" is not of a character type" msgstr "столбец \"%s\" имеет не символьный тип" @@ -25985,75 +27118,75 @@ msgstr "неверная информация о позиции в tsvector: \"% msgid "could not generate random values" msgstr "не удалось сгенерировать случайные значения" -#: utils/adt/varbit.c:109 utils/adt/varchar.c:53 +#: utils/adt/varbit.c:110 utils/adt/varchar.c:53 #, c-format msgid "length for type %s must be at least 1" msgstr "длина значения типа %s должна быть как минимум 1" -#: utils/adt/varbit.c:114 utils/adt/varchar.c:57 +#: utils/adt/varbit.c:115 utils/adt/varchar.c:57 #, c-format msgid "length for type %s cannot exceed %d" msgstr "длина значения типа %s не может превышать %d" -#: utils/adt/varbit.c:197 utils/adt/varbit.c:498 utils/adt/varbit.c:993 +#: utils/adt/varbit.c:198 utils/adt/varbit.c:499 utils/adt/varbit.c:994 #, c-format msgid "bit string length exceeds the maximum allowed (%d)" msgstr "длина битовой строки превышает предел (%d)" -#: utils/adt/varbit.c:211 utils/adt/varbit.c:355 utils/adt/varbit.c:405 +#: utils/adt/varbit.c:212 utils/adt/varbit.c:356 utils/adt/varbit.c:406 #, c-format msgid "bit string length %d does not match type bit(%d)" msgstr "длина битовой строки (%d) не соответствует типу bit(%d)" -#: utils/adt/varbit.c:233 utils/adt/varbit.c:534 +#: utils/adt/varbit.c:234 utils/adt/varbit.c:535 #, c-format -msgid "\"%c\" is not a valid binary digit" -msgstr "\"%c\" - не двоичная цифра" +msgid "\"%.*s\" is not a valid binary digit" +msgstr "\"%.*s\" - не двоичная цифра" -#: utils/adt/varbit.c:258 utils/adt/varbit.c:559 +#: utils/adt/varbit.c:259 utils/adt/varbit.c:560 #, c-format -msgid "\"%c\" is not a valid hexadecimal digit" -msgstr "\"%c\" - не шестнадцатеричная цифра" +msgid "\"%.*s\" is not a valid hexadecimal digit" +msgstr "\"%.*s\" - не шестнадцатеричная цифра" -#: utils/adt/varbit.c:346 utils/adt/varbit.c:651 +#: utils/adt/varbit.c:347 utils/adt/varbit.c:652 #, c-format msgid "invalid length in external bit string" msgstr "неверная длина во внешней строке битов" -#: utils/adt/varbit.c:512 utils/adt/varbit.c:660 utils/adt/varbit.c:756 +#: utils/adt/varbit.c:513 utils/adt/varbit.c:661 utils/adt/varbit.c:757 #, c-format msgid "bit string too long for type bit varying(%d)" msgstr "строка битов не умещается в тип bit varying(%d)" -#: utils/adt/varbit.c:1080 utils/adt/varbit.c:1190 utils/adt/varlena.c:873 -#: utils/adt/varlena.c:936 utils/adt/varlena.c:1093 utils/adt/varlena.c:3313 -#: utils/adt/varlena.c:3391 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:890 +#: utils/adt/varlena.c:953 utils/adt/varlena.c:1110 utils/adt/varlena.c:3344 +#: utils/adt/varlena.c:3422 #, c-format msgid "negative substring length not allowed" msgstr "подстрока должна иметь неотрицательную длину" -#: utils/adt/varbit.c:1247 +#: utils/adt/varbit.c:1261 #, c-format msgid "cannot AND bit strings of different sizes" msgstr "нельзя использовать \"И\" (AND) для битовых строк разной длины" -#: utils/adt/varbit.c:1288 +#: utils/adt/varbit.c:1302 #, c-format msgid "cannot OR bit strings of different sizes" msgstr "нельзя использовать \"ИЛИ\" (OR) для битовых строк разной длины" -#: utils/adt/varbit.c:1328 +#: utils/adt/varbit.c:1342 #, c-format msgid "cannot XOR bit strings of different sizes" msgstr "" "нельзя использовать \"ИСКЛЮЧАЮЩЕЕ ИЛИ\" (XOR) для битовых строк разной длины" -#: utils/adt/varbit.c:1810 utils/adt/varbit.c:1868 +#: utils/adt/varbit.c:1824 utils/adt/varbit.c:1882 #, c-format msgid "bit index %d out of valid range (0..%d)" msgstr "индекс бита %d вне диапазона 0..%d" -#: utils/adt/varbit.c:1819 utils/adt/varlena.c:3584 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3626 #, c-format msgid "new bit must be 0 or 1" msgstr "значением бита должен быть 0 или 1" @@ -26068,105 +27201,116 @@ msgstr "значение не умещается в тип character(%d)" msgid "value too long for type character varying(%d)" msgstr "значение не умещается в тип character varying(%d)" -#: utils/adt/varchar.c:732 utils/adt/varlena.c:1485 +#: utils/adt/varchar.c:732 utils/adt/varlena.c:1516 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "" "не удалось определить, какое правило сортировки использовать для сравнения " "строк" -#: utils/adt/varlena.c:1192 utils/adt/varlena.c:1925 +#: utils/adt/varlena.c:1209 utils/adt/varlena.c:1956 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "" "недетерминированные правила сортировки не поддерживаются для поиска подстрок" -#: utils/adt/varlena.c:1584 utils/adt/varlena.c:1597 +#: utils/adt/varlena.c:1615 utils/adt/varlena.c:1628 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "не удалось преобразовать строку в UTF-16 (код ошибки: %lu)" -#: utils/adt/varlena.c:1612 +#: utils/adt/varlena.c:1643 #, c-format msgid "could not compare Unicode strings: %m" msgstr "не удалось сравнить строки в Unicode: %m" -#: utils/adt/varlena.c:1663 utils/adt/varlena.c:2377 +#: utils/adt/varlena.c:1694 utils/adt/varlena.c:2408 #, c-format msgid "collation failed: %s" msgstr "ошибка в библиотеке сортировки: %s" -#: utils/adt/varlena.c:2585 +#: utils/adt/varlena.c:2616 #, c-format msgid "sort key generation failed: %s" msgstr "не удалось сгенерировать ключ сортировки: %s" -#: utils/adt/varlena.c:3468 utils/adt/varlena.c:3535 +#: utils/adt/varlena.c:3510 utils/adt/varlena.c:3577 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "индекс %d вне диапазона 0..%d" -#: utils/adt/varlena.c:3499 utils/adt/varlena.c:3571 +#: utils/adt/varlena.c:3541 utils/adt/varlena.c:3613 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "индекс %lld вне диапазона 0..%lld" -#: utils/adt/varlena.c:4608 +#: utils/adt/varlena.c:4649 #, c-format -msgid "field position must be greater than zero" -msgstr "позиция поля должна быть больше нуля" +msgid "field position must not be zero" +msgstr "позиция поля должна быть отлична от 0" -#: utils/adt/varlena.c:5474 +#: utils/adt/varlena.c:5690 #, c-format msgid "unterminated format() type specifier" msgstr "незавершённый спецификатор типа format()" -#: utils/adt/varlena.c:5475 utils/adt/varlena.c:5609 utils/adt/varlena.c:5730 +#: utils/adt/varlena.c:5691 utils/adt/varlena.c:5825 utils/adt/varlena.c:5946 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Для представления одного знака \"%%\" запишите \"%%%%\"." -#: utils/adt/varlena.c:5607 utils/adt/varlena.c:5728 +#: utils/adt/varlena.c:5823 utils/adt/varlena.c:5944 #, c-format -msgid "unrecognized format() type specifier \"%c\"" -msgstr "нераспознанный спецификатор типа format(): \"%c\"" +msgid "unrecognized format() type specifier \"%.*s\"" +msgstr "нераспознанный спецификатор типа format(): \"%.*s\"" -#: utils/adt/varlena.c:5620 utils/adt/varlena.c:5677 +#: utils/adt/varlena.c:5836 utils/adt/varlena.c:5893 #, c-format msgid "too few arguments for format()" msgstr "мало аргументов для format()" -#: utils/adt/varlena.c:5773 utils/adt/varlena.c:5955 +#: utils/adt/varlena.c:5989 utils/adt/varlena.c:6171 #, c-format msgid "number is out of range" msgstr "число вне диапазона" -#: utils/adt/varlena.c:5836 utils/adt/varlena.c:5864 +#: utils/adt/varlena.c:6052 utils/adt/varlena.c:6080 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "формат ссылается на аргумент 0, но аргументы нумеруются с 1" -#: utils/adt/varlena.c:5857 +#: utils/adt/varlena.c:6073 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "указание аргумента ширины должно оканчиваться \"$\"" -#: utils/adt/varlena.c:5902 +#: utils/adt/varlena.c:6118 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "значения null нельзя представить в виде SQL-идентификатора" -#: utils/adt/varlena.c:6028 +#: utils/adt/varlena.c:6244 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "" "нормализацию Unicode можно выполнять, только если кодировка сервера — UTF8" -#: utils/adt/varlena.c:6041 +#: utils/adt/varlena.c:6257 #, c-format msgid "invalid normalization form: %s" msgstr "неверная форма нормализации: %s" +#: utils/adt/varlena.c:6460 utils/adt/varlena.c:6495 utils/adt/varlena.c:6530 +#, c-format +msgid "invalid Unicode code point: %04X" +msgstr "неверный код символа Unicode: %04X" + +#: utils/adt/varlena.c:6560 +#, c-format +msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." +msgstr "" +"Спецкоды Unicode должны иметь вид \\XXXX, \\+XXXXXX, \\uXXXX или \\UXXXXXXXX." + #: utils/adt/windowfuncs.c:243 #, c-format msgid "argument of ntile must be greater than zero" @@ -26197,12 +27341,7 @@ msgstr "XML-функции не поддерживаются" msgid "This functionality requires the server to be built with libxml support." msgstr "Для этой функциональности в сервере не хватает поддержки libxml." -#: utils/adt/xml.c:224 -#, c-format -msgid "You need to rebuild PostgreSQL using --with-libxml." -msgstr "Необходимо перекомпилировать PostgreSQL с ключом --with-libxml." - -#: utils/adt/xml.c:243 utils/mb/mbutils.c:570 +#: utils/adt/xml.c:243 utils/mb/mbutils.c:627 #, c-format msgid "invalid encoding name \"%s\"" msgstr "неверное имя кодировки: \"%s\"" @@ -26259,7 +27398,7 @@ msgid "" "This probably indicates that the version of libxml2 being used is not " "compatible with the libxml2 header files that PostgreSQL was built with." msgstr "" -"Возможно это означает, что используемая версия libxml2 не совместима с " +"Возможно, это означает, что используемая версия libxml2 несовместима с " "заголовочными файлами libxml2, с которыми был собран PostgreSQL." #: utils/adt/xml.c:1936 @@ -26349,28 +27488,28 @@ msgstr "путь отбираемых строк не должен быть пу msgid "column path filter must not be empty string" msgstr "путь отбираемого столбца не должен быть пустым" -#: utils/adt/xml.c:4661 +#: utils/adt/xml.c:4655 #, c-format msgid "more than one value returned by column XPath expression" msgstr "выражение XPath, отбирающее столбец, возвратило более одного значения" -#: utils/cache/lsyscache.c:1015 +#: utils/cache/lsyscache.c:1042 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "приведение типа %s к типу %s не существует" -#: utils/cache/lsyscache.c:2764 utils/cache/lsyscache.c:2797 -#: utils/cache/lsyscache.c:2830 utils/cache/lsyscache.c:2863 +#: utils/cache/lsyscache.c:2834 utils/cache/lsyscache.c:2867 +#: utils/cache/lsyscache.c:2900 utils/cache/lsyscache.c:2933 #, c-format msgid "type %s is only a shell" -msgstr "тип %s - лишь оболочка" +msgstr "тип %s является пустышкой" -#: utils/cache/lsyscache.c:2769 +#: utils/cache/lsyscache.c:2839 #, c-format msgid "no input function available for type %s" msgstr "для типа %s нет функции ввода" -#: utils/cache/lsyscache.c:2802 +#: utils/cache/lsyscache.c:2872 #, c-format msgid "no output function available for type %s" msgstr "для типа %s нет функции вывода" @@ -26384,22 +27523,22 @@ msgstr "" "в классе операторов \"%s\" метода доступа %s нет опорной функции %d для типа " "%s" -#: utils/cache/plancache.c:718 +#: utils/cache/plancache.c:720 #, c-format msgid "cached plan must not change result type" msgstr "в кешированном плане не должен изменяться тип результата" -#: utils/cache/relcache.c:6078 +#: utils/cache/relcache.c:6324 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "создать файл инициализации для кеша отношений \"%s\" не удалось: %m" -#: utils/cache/relcache.c:6080 +#: utils/cache/relcache.c:6326 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Продолжаем всё равно, хотя что-то не так." -#: utils/cache/relcache.c:6402 +#: utils/cache/relcache.c:6648 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "не удалось стереть файл кеша \"%s\": %m" @@ -26410,123 +27549,122 @@ msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "" "выполнить PREPARE для транзакции, изменившей сопоставление отношений, нельзя" -#: utils/cache/relmapper.c:761 +#: utils/cache/relmapper.c:767 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "файл сопоставления отношений \"%s\" содержит неверные данные" -#: utils/cache/relmapper.c:771 +#: utils/cache/relmapper.c:777 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "ошибка контрольной суммы в файле сопоставления отношений \"%s\"" -#: utils/cache/typcache.c:1692 utils/fmgr/funcapi.c:461 +#: utils/cache/typcache.c:1811 utils/fmgr/funcapi.c:463 #, c-format msgid "record type has not been registered" msgstr "тип записи не зарегистрирован" -#: utils/error/assert.c:37 +#: utils/error/assert.c:39 #, c-format -msgid "TRAP: ExceptionalCondition: bad arguments\n" -msgstr "ЛОВУШКА: Исключительное условие: неверные аргументы\n" +msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" +msgstr "ЛОВУШКА: Исключительное условие: неверные аргументы в PID %d\n" -#: utils/error/assert.c:40 +#: utils/error/assert.c:42 #, c-format -msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d)\n" -msgstr "ЛОВУШКА: %s(\"%s\", файл: \"%s\", строка: %d)\n" +msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" +msgstr "ЛОВУШКА: %s(\"%s\", файл: \"%s\", строка: %d, PID: %d)\n" -#: utils/error/elog.c:322 +#: utils/error/elog.c:409 #, c-format msgid "error occurred before error message processing is available\n" msgstr "произошла ошибка до готовности подсистемы обработки сообщений\n" -#: utils/error/elog.c:1868 +#: utils/error/elog.c:1948 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "открыть файл \"%s\" как stderr не удалось: %m" -#: utils/error/elog.c:1881 +#: utils/error/elog.c:1961 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "открыть файл \"%s\" как stdout не удалось: %m" -#: utils/error/elog.c:2373 utils/error/elog.c:2407 utils/error/elog.c:2423 +#: utils/error/elog.c:2456 utils/error/elog.c:2490 utils/error/elog.c:2506 msgid "[unknown]" msgstr "[н/д]" -#: utils/error/elog.c:2893 utils/error/elog.c:3203 utils/error/elog.c:3311 +#: utils/error/elog.c:3026 utils/error/elog.c:3344 utils/error/elog.c:3451 msgid "missing error text" msgstr "отсутствует текст ошибки" -#: utils/error/elog.c:2896 utils/error/elog.c:2899 utils/error/elog.c:3314 -#: utils/error/elog.c:3317 +#: utils/error/elog.c:3029 utils/error/elog.c:3032 #, c-format msgid " at character %d" msgstr " (символ %d)" -#: utils/error/elog.c:2909 utils/error/elog.c:2916 +#: utils/error/elog.c:3042 utils/error/elog.c:3049 msgid "DETAIL: " msgstr "ПОДРОБНОСТИ: " -#: utils/error/elog.c:2923 +#: utils/error/elog.c:3056 msgid "HINT: " msgstr "ПОДСКАЗКА: " -#: utils/error/elog.c:2930 +#: utils/error/elog.c:3063 msgid "QUERY: " msgstr "ЗАПРОС: " -#: utils/error/elog.c:2937 +#: utils/error/elog.c:3070 msgid "CONTEXT: " msgstr "КОНТЕКСТ: " -#: utils/error/elog.c:2947 +#: utils/error/elog.c:3080 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "ПОЛОЖЕНИЕ: %s, %s:%d\n" -#: utils/error/elog.c:2954 +#: utils/error/elog.c:3087 #, c-format msgid "LOCATION: %s:%d\n" msgstr "ПОЛОЖЕНИЕ: %s:%d\n" -#: utils/error/elog.c:2961 +#: utils/error/elog.c:3094 msgid "BACKTRACE: " msgstr "СТЕК: " -#: utils/error/elog.c:2975 +#: utils/error/elog.c:3108 msgid "STATEMENT: " msgstr "ОПЕРАТОР: " -#: utils/error/elog.c:3364 +#: utils/error/elog.c:3496 msgid "DEBUG" msgstr "ОТЛАДКА" -#: utils/error/elog.c:3368 +#: utils/error/elog.c:3500 msgid "LOG" msgstr "СООБЩЕНИЕ" -#: utils/error/elog.c:3371 +#: utils/error/elog.c:3503 msgid "INFO" msgstr "ИНФОРМАЦИЯ" -#: utils/error/elog.c:3374 +#: utils/error/elog.c:3506 msgid "NOTICE" msgstr "ЗАМЕЧАНИЕ" -#: utils/error/elog.c:3377 +#: utils/error/elog.c:3510 msgid "WARNING" msgstr "ПРЕДУПРЕЖДЕНИЕ" -#: utils/error/elog.c:3380 +#: utils/error/elog.c:3513 msgid "ERROR" msgstr "ОШИБКА" -#: utils/error/elog.c:3383 +#: utils/error/elog.c:3516 msgid "FATAL" msgstr "ВАЖНО" -#: utils/error/elog.c:3386 +#: utils/error/elog.c:3519 msgid "PANIC" msgstr "ПАНИКА" @@ -26616,12 +27754,12 @@ msgstr "" msgid "internal function \"%s\" is not in internal lookup table" msgstr "внутренней функции \"%s\" нет во внутренней поисковой таблице" -#: utils/fmgr/fmgr.c:487 +#: utils/fmgr/fmgr.c:484 #, c-format msgid "could not find function information for function \"%s\"" msgstr "не удалось найти информацию о функции \"%s\"" -#: utils/fmgr/fmgr.c:489 +#: utils/fmgr/fmgr.c:486 #, c-format msgid "" "SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname)." @@ -26629,25 +27767,25 @@ msgstr "" "Функциям, вызываемым из SQL, требуется дополнительное объявление " "PG_FUNCTION_INFO_V1(имя_функции)." -#: utils/fmgr/fmgr.c:507 +#: utils/fmgr/fmgr.c:504 #, c-format msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "" "версия API (%d), выданная информационной функцией \"%s\", не поддерживается" -#: utils/fmgr/fmgr.c:2003 +#: utils/fmgr/fmgr.c:1999 #, c-format msgid "operator class options info is absent in function call context" msgstr "" "информация о параметрах класса операторов отсутствует в контексте вызова " "функции" -#: utils/fmgr/fmgr.c:2070 +#: utils/fmgr/fmgr.c:2066 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "функция языковой проверки %u вызвана для языка %u (а не %u)" -#: utils/fmgr/funcapi.c:384 +#: utils/fmgr/funcapi.c:386 #, c-format msgid "" "could not determine actual result type for function \"%s\" declared to " @@ -26656,115 +27794,126 @@ msgstr "" "не удалось определить действительный тип результата для функции \"%s\", " "объявленной как возвращающая тип %s" -#: utils/fmgr/funcapi.c:1652 utils/fmgr/funcapi.c:1684 +#: utils/fmgr/funcapi.c:531 +#, c-format +msgid "argument declared %s does not contain a range type but type %s" +msgstr "" +"аргумент, объявленный как \"%s\", содержит не диапазонный тип, а тип %s" + +#: utils/fmgr/funcapi.c:614 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "тип мультидиапазона для типа данных %s не найден" + +#: utils/fmgr/funcapi.c:1831 utils/fmgr/funcapi.c:1863 #, c-format msgid "number of aliases does not match number of columns" msgstr "число псевдонимов не совпадает с числом столбцов" -#: utils/fmgr/funcapi.c:1678 +#: utils/fmgr/funcapi.c:1857 #, c-format msgid "no column alias was provided" msgstr "псевдоним столбца не указан" -#: utils/fmgr/funcapi.c:1702 +#: utils/fmgr/funcapi.c:1881 #, c-format msgid "could not determine row description for function returning record" msgstr "не удалось определить описание строки для функции, возвращающей запись" -#: utils/init/miscinit.c:285 +#: utils/init/miscinit.c:315 #, c-format msgid "data directory \"%s\" does not exist" msgstr "каталог данных \"%s\" не существует" -#: utils/init/miscinit.c:290 +#: utils/init/miscinit.c:320 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "не удалось считать права на каталог \"%s\": %m" -#: utils/init/miscinit.c:298 +#: utils/init/miscinit.c:328 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "указанный каталог данных \"%s\" не существует" -#: utils/init/miscinit.c:314 +#: utils/init/miscinit.c:344 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "владелец каталога данных \"%s\" определён неверно" -#: utils/init/miscinit.c:316 +#: utils/init/miscinit.c:346 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "" "Сервер должен запускать пользователь, являющийся владельцем каталога данных." -#: utils/init/miscinit.c:334 +#: utils/init/miscinit.c:364 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "для каталога данных \"%s\" установлены неправильные права доступа" -#: utils/init/miscinit.c:336 +#: utils/init/miscinit.c:366 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "Маска прав должна быть u=rwx (0700) или u=rwx,g=rx (0750)." -#: utils/init/miscinit.c:615 utils/misc/guc.c:7139 +#: utils/init/miscinit.c:645 utils/misc/guc.c:7482 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "" "параметр \"%s\" нельзя задать в рамках операции с ограничениями по " "безопасности" -#: utils/init/miscinit.c:683 +#: utils/init/miscinit.c:713 #, c-format msgid "role with OID %u does not exist" msgstr "роль с OID %u не существует" -#: utils/init/miscinit.c:713 +#: utils/init/miscinit.c:743 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "для роли \"%s\" вход запрещён" -#: utils/init/miscinit.c:731 +#: utils/init/miscinit.c:761 #, c-format msgid "too many connections for role \"%s\"" msgstr "слишком много подключений для роли \"%s\"" -#: utils/init/miscinit.c:791 +#: utils/init/miscinit.c:821 #, c-format msgid "permission denied to set session authorization" msgstr "нет прав для смены объекта авторизации в сеансе" -#: utils/init/miscinit.c:874 +#: utils/init/miscinit.c:904 #, c-format msgid "invalid role OID: %u" msgstr "неверный OID роли: %u" -#: utils/init/miscinit.c:928 +#: utils/init/miscinit.c:958 #, c-format msgid "database system is shut down" msgstr "система БД выключена" -#: utils/init/miscinit.c:1015 +#: utils/init/miscinit.c:1045 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "не удалось создать файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1029 +#: utils/init/miscinit.c:1059 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "не удалось открыть файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1036 +#: utils/init/miscinit.c:1066 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "не удалось прочитать файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1045 +#: utils/init/miscinit.c:1075 #, c-format msgid "lock file \"%s\" is empty" msgstr "файл блокировки \"%s\" пуст" -#: utils/init/miscinit.c:1046 +#: utils/init/miscinit.c:1076 #, c-format msgid "" "Either another server is starting, or the lock file is the remnant of a " @@ -26773,38 +27922,38 @@ msgstr "" "Либо сейчас запускается другой сервер, либо этот файл остался в результате " "сбоя при предыдущем запуске." -#: utils/init/miscinit.c:1090 +#: utils/init/miscinit.c:1120 #, c-format msgid "lock file \"%s\" already exists" msgstr "файл блокировки \"%s\" уже существует" -#: utils/init/miscinit.c:1094 +#: utils/init/miscinit.c:1124 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "Другой экземпляр postgres (PID %d) работает с каталогом данных \"%s\"?" -#: utils/init/miscinit.c:1096 +#: utils/init/miscinit.c:1126 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "" "Другой экземпляр postmaster (PID %d) работает с каталогом данных \"%s\"?" -#: utils/init/miscinit.c:1099 +#: utils/init/miscinit.c:1129 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "Другой экземпляр postgres (PID %d) использует файл сокета \"%s\"?" -#: utils/init/miscinit.c:1101 +#: utils/init/miscinit.c:1131 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "Другой экземпляр postmaster (PID %d) использует файл сокета \"%s\"?" -#: utils/init/miscinit.c:1152 +#: utils/init/miscinit.c:1182 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "не удалось стереть старый файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1154 +#: utils/init/miscinit.c:1184 #, c-format msgid "" "The file seems accidentally left over, but it could not be removed. Please " @@ -26813,93 +27962,80 @@ msgstr "" "Кажется, файл сохранился по ошибке, но удалить его не получилось. " "Пожалуйста, удалите файл вручную и повторите попытку." -#: utils/init/miscinit.c:1191 utils/init/miscinit.c:1205 -#: utils/init/miscinit.c:1216 +#: utils/init/miscinit.c:1221 utils/init/miscinit.c:1235 +#: utils/init/miscinit.c:1246 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "не удалось записать файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1327 utils/init/miscinit.c:1469 utils/misc/guc.c:10066 +#: utils/init/miscinit.c:1357 utils/init/miscinit.c:1499 utils/misc/guc.c:10378 #, c-format msgid "could not read from file \"%s\": %m" msgstr "не удалось прочитать файл \"%s\": %m" -#: utils/init/miscinit.c:1457 +#: utils/init/miscinit.c:1487 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "не удалось открыть файл \"%s\": %m; ошибка игнорируется" -#: utils/init/miscinit.c:1482 +#: utils/init/miscinit.c:1512 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "файл блокировки \"%s\" содержит неверный PID: %ld вместо %ld" -#: utils/init/miscinit.c:1521 utils/init/miscinit.c:1537 +#: utils/init/miscinit.c:1551 utils/init/miscinit.c:1567 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\" не является каталогом данных" -#: utils/init/miscinit.c:1523 +#: utils/init/miscinit.c:1553 #, c-format msgid "File \"%s\" is missing." msgstr "Файл \"%s\" отсутствует." -#: utils/init/miscinit.c:1539 +#: utils/init/miscinit.c:1569 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Файл \"%s\" содержит неприемлемые данные." -#: utils/init/miscinit.c:1541 +#: utils/init/miscinit.c:1571 #, c-format msgid "You might need to initdb." msgstr "Возможно, вам нужно выполнить initdb." -#: utils/init/miscinit.c:1549 +#: utils/init/miscinit.c:1579 #, c-format msgid "" "The data directory was initialized by PostgreSQL version %s, which is not " "compatible with this version %s." msgstr "" -"Каталог данных инициализирован сервером PostgreSQL версии %s, не совместимой " +"Каталог данных инициализирован сервером PostgreSQL версии %s, несовместимой " "с данной версией (%s)." -#: utils/init/miscinit.c:1616 -#, c-format -msgid "loaded library \"%s\"" -msgstr "загружена библиотека \"%s\"" - -#: utils/init/postinit.c:253 +#: utils/init/postinit.c:254 #, c-format msgid "replication connection authorized: user=%s" msgstr "подключение для репликации авторизовано: пользователь=%s" -#: utils/init/postinit.c:256 +#: utils/init/postinit.c:257 #, c-format msgid "connection authorized: user=%s" msgstr "подключение авторизовано: пользователь=%s" -#: utils/init/postinit.c:259 +#: utils/init/postinit.c:260 #, c-format msgid " database=%s" msgstr " база=%s" -#: utils/init/postinit.c:262 +#: utils/init/postinit.c:263 #, c-format msgid " application_name=%s" msgstr " приложение=%s" -#: utils/init/postinit.c:267 +#: utils/init/postinit.c:268 #, c-format -msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr " SSL включён (протокол=%s, шифр=%s, битов=%d, сжатие=%s)" - -#: utils/init/postinit.c:271 -msgid "off" -msgstr "выкл." - -#: utils/init/postinit.c:271 -msgid "on" -msgstr "вкл." +msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" +msgstr " SSL включён (протокол=%s, шифр=%s, битов=%d)" #: utils/init/postinit.c:280 #, c-format @@ -26982,36 +28118,36 @@ msgstr "" "База данных была инициализирована с параметром LC_CTYPE \"%s\", но сейчас " "setlocale() не воспринимает его." -#: utils/init/postinit.c:751 +#: utils/init/postinit.c:761 #, c-format msgid "no roles are defined in this database system" msgstr "в этой системе баз данных не создано ни одной роли" -#: utils/init/postinit.c:752 +#: utils/init/postinit.c:762 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "Вы должны немедленно выполнить CREATE USER \"%s\" CREATEUSER;." -#: utils/init/postinit.c:788 +#: utils/init/postinit.c:798 #, c-format msgid "new replication connections are not allowed during database shutdown" msgstr "" "новые подключения для репликации не допускаются в процессе остановки БД" -#: utils/init/postinit.c:792 +#: utils/init/postinit.c:802 #, c-format msgid "must be superuser to connect during database shutdown" msgstr "" "нужно быть суперпользователем, чтобы подключиться в процессе остановки БД" -#: utils/init/postinit.c:802 +#: utils/init/postinit.c:812 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "" "нужно быть суперпользователем, чтобы подключиться в режиме двоичного " "обновления" -#: utils/init/postinit.c:815 +#: utils/init/postinit.c:825 #, c-format msgid "" "remaining connection slots are reserved for non-replication superuser " @@ -27020,51 +28156,51 @@ msgstr "" "оставшиеся слоты подключений зарезервированы для подключений " "суперпользователя (не для репликации)" -#: utils/init/postinit.c:825 +#: utils/init/postinit.c:835 #, c-format msgid "must be superuser or replication role to start walsender" msgstr "" "для запуска процесса walsender требуется роль репликации или права " "суперпользователя" -#: utils/init/postinit.c:894 +#: utils/init/postinit.c:904 #, c-format msgid "database %u does not exist" msgstr "база данных %u не существует" -#: utils/init/postinit.c:983 +#: utils/init/postinit.c:993 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Похоже, она только что была удалена или переименована." -#: utils/init/postinit.c:1001 +#: utils/init/postinit.c:1011 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Подкаталог базы данных \"%s\" отсутствует." -#: utils/init/postinit.c:1006 +#: utils/init/postinit.c:1016 #, c-format msgid "could not access directory \"%s\": %m" msgstr "ошибка доступа к каталогу \"%s\": %m" -#: utils/mb/conv.c:443 utils/mb/conv.c:635 +#: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" msgstr "неверный номер кодировки: %d" -#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:122 -#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:154 +#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:129 +#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:165 #, c-format msgid "unexpected encoding ID %d for ISO 8859 character sets" msgstr "неожиданный ID кодировки %d для наборов символов ISO 8859" -#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:103 -#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:135 +#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:110 +#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:146 #, c-format msgid "unexpected encoding ID %d for WIN character sets" msgstr "неожиданный ID кодировки %d для наборов символов WIN" -#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:842 +#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:900 #, c-format msgid "conversion between %s and %s is not supported" msgstr "преобразование %s <-> %s не поддерживается" @@ -27076,43 +28212,43 @@ msgid "" msgstr "" "стандартной функции преобразования из кодировки \"%s\" в \"%s\" не существует" -#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:429 utils/mb/mbutils.c:758 -#: utils/mb/mbutils.c:784 +#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 +#: utils/mb/mbutils.c:842 #, c-format msgid "String of %d bytes is too long for encoding conversion." msgstr "Строка из %d байт слишком длинна для преобразования кодировки." -#: utils/mb/mbutils.c:511 +#: utils/mb/mbutils.c:568 #, c-format msgid "invalid source encoding name \"%s\"" msgstr "неверное имя исходной кодировки: \"%s\"" -#: utils/mb/mbutils.c:516 +#: utils/mb/mbutils.c:573 #, c-format msgid "invalid destination encoding name \"%s\"" msgstr "неверное имя кодировки результата: \"%s\"" -#: utils/mb/mbutils.c:656 +#: utils/mb/mbutils.c:713 #, c-format msgid "invalid byte value for encoding \"%s\": 0x%02x" msgstr "недопустимое байтовое значение для кодировки \"%s\": 0x%02x" -#: utils/mb/mbutils.c:819 +#: utils/mb/mbutils.c:877 #, c-format msgid "invalid Unicode code point" msgstr "неверный код Unicode" -#: utils/mb/mbutils.c:1087 +#: utils/mb/mbutils.c:1146 #, c-format msgid "bind_textdomain_codeset failed" msgstr "ошибка в bind_textdomain_codeset" -#: utils/mb/mbutils.c:1595 +#: utils/mb/mbutils.c:1667 #, c-format msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "неверная последовательность байт для кодировки \"%s\": %s" -#: utils/mb/mbutils.c:1628 +#: utils/mb/mbutils.c:1700 #, c-format msgid "" "character with byte sequence %s in encoding \"%s\" has no equivalent in " @@ -27121,221 +28257,185 @@ msgstr "" "для символа с последовательностью байт %s из кодировки \"%s\" нет " "эквивалента в \"%s\"" -#: utils/misc/guc.c:679 +#: utils/misc/guc.c:718 msgid "Ungrouped" msgstr "Разное" -#: utils/misc/guc.c:681 +#: utils/misc/guc.c:720 msgid "File Locations" msgstr "Расположения файлов" -#: utils/misc/guc.c:683 -msgid "Connections and Authentication" -msgstr "Подключения и аутентификация" - -#: utils/misc/guc.c:685 +#: utils/misc/guc.c:722 msgid "Connections and Authentication / Connection Settings" msgstr "Подключения и аутентификация / Параметры подключений" -#: utils/misc/guc.c:687 +#: utils/misc/guc.c:724 msgid "Connections and Authentication / Authentication" msgstr "Подключения и аутентификация / Аутентификация" -#: utils/misc/guc.c:689 +#: utils/misc/guc.c:726 msgid "Connections and Authentication / SSL" msgstr "Подключения и аутентификация / SSL" -#: utils/misc/guc.c:691 -msgid "Resource Usage" -msgstr "Использование ресурсов" - -#: utils/misc/guc.c:693 +#: utils/misc/guc.c:728 msgid "Resource Usage / Memory" msgstr "Использование ресурсов / Память" -#: utils/misc/guc.c:695 +#: utils/misc/guc.c:730 msgid "Resource Usage / Disk" msgstr "Использование ресурсов / Диск" -#: utils/misc/guc.c:697 +#: utils/misc/guc.c:732 msgid "Resource Usage / Kernel Resources" msgstr "Использование ресурсов / Ресурсы ядра" -#: utils/misc/guc.c:699 +#: utils/misc/guc.c:734 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Использование ресурсов / Задержка очистки по стоимости" -#: utils/misc/guc.c:701 +#: utils/misc/guc.c:736 msgid "Resource Usage / Background Writer" msgstr "Использование ресурсов / Фоновая запись" -#: utils/misc/guc.c:703 +#: utils/misc/guc.c:738 msgid "Resource Usage / Asynchronous Behavior" msgstr "Использование ресурсов / Асинхронное поведение" -#: utils/misc/guc.c:705 -msgid "Write-Ahead Log" -msgstr "Журнал WAL" - -#: utils/misc/guc.c:707 +#: utils/misc/guc.c:740 msgid "Write-Ahead Log / Settings" msgstr "Журнал WAL / Параметры" -#: utils/misc/guc.c:709 +#: utils/misc/guc.c:742 msgid "Write-Ahead Log / Checkpoints" msgstr "Журнал WAL / Контрольные точки" -#: utils/misc/guc.c:711 +#: utils/misc/guc.c:744 msgid "Write-Ahead Log / Archiving" msgstr "Журнал WAL / Архивация" -#: utils/misc/guc.c:713 +#: utils/misc/guc.c:746 msgid "Write-Ahead Log / Archive Recovery" msgstr "Журнал WAL / Восстановление из архива" -#: utils/misc/guc.c:715 +#: utils/misc/guc.c:748 msgid "Write-Ahead Log / Recovery Target" msgstr "Журнал WAL / Цель восстановления" -#: utils/misc/guc.c:717 -msgid "Replication" -msgstr "Репликация" - -#: utils/misc/guc.c:719 +#: utils/misc/guc.c:750 msgid "Replication / Sending Servers" msgstr "Репликация / Передающие серверы" -#: utils/misc/guc.c:721 -msgid "Replication / Master Server" -msgstr "Репликация / Главный сервер" +#: utils/misc/guc.c:752 +msgid "Replication / Primary Server" +msgstr "Репликация / Ведущий сервер" -#: utils/misc/guc.c:723 +#: utils/misc/guc.c:754 msgid "Replication / Standby Servers" msgstr "Репликация / Резервные серверы" -#: utils/misc/guc.c:725 +#: utils/misc/guc.c:756 msgid "Replication / Subscribers" msgstr "Репликация / Подписчики" -#: utils/misc/guc.c:727 -msgid "Query Tuning" -msgstr "Настройка запросов" - -#: utils/misc/guc.c:729 +#: utils/misc/guc.c:758 msgid "Query Tuning / Planner Method Configuration" msgstr "Настройка запросов / Конфигурация методов планировщика" -#: utils/misc/guc.c:731 +#: utils/misc/guc.c:760 msgid "Query Tuning / Planner Cost Constants" msgstr "Настройка запросов / Константы стоимости для планировщика" -#: utils/misc/guc.c:733 +#: utils/misc/guc.c:762 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Настройка запросов / Генетический оптимизатор запросов" -#: utils/misc/guc.c:735 +#: utils/misc/guc.c:764 msgid "Query Tuning / Other Planner Options" msgstr "Настройка запросов / Другие параметры планировщика" -#: utils/misc/guc.c:737 -msgid "Reporting and Logging" -msgstr "Отчёты и протоколы" - -#: utils/misc/guc.c:739 +#: utils/misc/guc.c:766 msgid "Reporting and Logging / Where to Log" msgstr "Отчёты и протоколы / Куда записывать" -#: utils/misc/guc.c:741 +#: utils/misc/guc.c:768 msgid "Reporting and Logging / When to Log" msgstr "Отчёты и протоколы / Когда записывать" -#: utils/misc/guc.c:743 +#: utils/misc/guc.c:770 msgid "Reporting and Logging / What to Log" msgstr "Отчёты и протоколы / Что записывать" -#: utils/misc/guc.c:745 -msgid "Process Title" -msgstr "Заголовок процесса" - -#: utils/misc/guc.c:747 -msgid "Statistics" -msgstr "Статистика" +#: utils/misc/guc.c:772 +msgid "Reporting and Logging / Process Title" +msgstr "Отчёты и протоколы / Заголовок процесса" -#: utils/misc/guc.c:749 +#: utils/misc/guc.c:774 msgid "Statistics / Monitoring" msgstr "Статистика / Мониторинг" -#: utils/misc/guc.c:751 +#: utils/misc/guc.c:776 msgid "Statistics / Query and Index Statistics Collector" msgstr "Статистика / Сбор статистики по запросам и индексам" -#: utils/misc/guc.c:753 +#: utils/misc/guc.c:778 msgid "Autovacuum" msgstr "Автоочистка" -#: utils/misc/guc.c:755 -msgid "Client Connection Defaults" -msgstr "Параметры клиентских сеансов по умолчанию" - -#: utils/misc/guc.c:757 +#: utils/misc/guc.c:780 msgid "Client Connection Defaults / Statement Behavior" msgstr "Параметры клиентских подключений по умолчанию / Поведение команд" -#: utils/misc/guc.c:759 +#: utils/misc/guc.c:782 msgid "Client Connection Defaults / Locale and Formatting" msgstr "" "Параметры клиентских подключений по умолчанию / Языковая среда и форматы" -#: utils/misc/guc.c:761 +#: utils/misc/guc.c:784 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "" "Параметры клиентских подключений по умолчанию / Предзагрузка разделяемых " "библиотек" -#: utils/misc/guc.c:763 +#: utils/misc/guc.c:786 msgid "Client Connection Defaults / Other Defaults" msgstr "Параметры клиентских подключений по умолчанию / Другие параметры" -#: utils/misc/guc.c:765 +#: utils/misc/guc.c:788 msgid "Lock Management" msgstr "Управление блокировками" -#: utils/misc/guc.c:767 -msgid "Version and Platform Compatibility" -msgstr "Совместимость с разными версиями и платформами" - -#: utils/misc/guc.c:769 +#: utils/misc/guc.c:790 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Версия и совместимость платформ / Предыдущие версии PostgreSQL" -#: utils/misc/guc.c:771 +#: utils/misc/guc.c:792 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "Версия и совместимость платформ / Другие платформы и клиенты" -#: utils/misc/guc.c:773 +#: utils/misc/guc.c:794 msgid "Error Handling" msgstr "Обработка ошибок" -#: utils/misc/guc.c:775 +#: utils/misc/guc.c:796 msgid "Preset Options" msgstr "Предопределённые параметры" -#: utils/misc/guc.c:777 +#: utils/misc/guc.c:798 msgid "Customized Options" msgstr "Внесистемные параметры" -#: utils/misc/guc.c:779 +#: utils/misc/guc.c:800 msgid "Developer Options" msgstr "Параметры для разработчиков" -#: utils/misc/guc.c:837 +#: utils/misc/guc.c:858 msgid "" "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." msgstr "" "Допустимые единицы измерения для этого параметра: \"B\", \"kB\", \"MB\", \"GB" "\" и \"TB\"." -#: utils/misc/guc.c:874 +#: utils/misc/guc.c:895 msgid "" "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", " "and \"d\"." @@ -27343,85 +28443,91 @@ msgstr "" "Допустимые единицы измерения для этого параметра: \"us\", \"ms\", \"s\", " "\"min\", \"h\" и \"d\"." -#: utils/misc/guc.c:936 +#: utils/misc/guc.c:957 msgid "Enables the planner's use of sequential-scan plans." msgstr "" "Разрешает планировщику использовать планы последовательного сканирования." -#: utils/misc/guc.c:946 +#: utils/misc/guc.c:967 msgid "Enables the planner's use of index-scan plans." msgstr "Разрешает планировщику использовать планы сканирования по индексу." -#: utils/misc/guc.c:956 +#: utils/misc/guc.c:977 msgid "Enables the planner's use of index-only-scan plans." msgstr "Разрешает планировщику использовать планы сканирования только индекса." -#: utils/misc/guc.c:966 +#: utils/misc/guc.c:987 msgid "Enables the planner's use of bitmap-scan plans." msgstr "" "Разрешает планировщику использовать планы сканирования по битовой карте." -#: utils/misc/guc.c:976 +#: utils/misc/guc.c:997 msgid "Enables the planner's use of TID scan plans." msgstr "Разрешает планировщику использовать планы сканирования TID." -#: utils/misc/guc.c:986 +#: utils/misc/guc.c:1007 msgid "Enables the planner's use of explicit sort steps." msgstr "Разрешает планировщику использовать шаги с явной сортировкой." -#: utils/misc/guc.c:996 +#: utils/misc/guc.c:1017 msgid "Enables the planner's use of incremental sort steps." msgstr "" "Разрешает планировщику использовать шаги с инкрементальной сортировкой." -#: utils/misc/guc.c:1005 +#: utils/misc/guc.c:1026 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Разрешает планировщику использовать планы агрегирования по хешу." -#: utils/misc/guc.c:1015 +#: utils/misc/guc.c:1036 msgid "Enables the planner's use of materialization." msgstr "Разрешает планировщику использовать материализацию." -#: utils/misc/guc.c:1025 +# well-spelled: мемоизацию +#: utils/misc/guc.c:1046 +msgid "Enables the planner's use of memoization." +msgstr "Разрешает планировщику использовать мемоизацию." + +#: utils/misc/guc.c:1056 msgid "Enables the planner's use of nested-loop join plans." msgstr "" "Разрешает планировщику использовать планы соединения с вложенными циклами." -#: utils/misc/guc.c:1035 +#: utils/misc/guc.c:1066 msgid "Enables the planner's use of merge join plans." msgstr "Разрешает планировщику использовать планы соединения слиянием." -#: utils/misc/guc.c:1045 +#: utils/misc/guc.c:1076 msgid "Enables the planner's use of hash join plans." msgstr "Разрешает планировщику использовать планы соединения по хешу." -#: utils/misc/guc.c:1055 +#: utils/misc/guc.c:1086 msgid "Enables the planner's use of gather merge plans." msgstr "Разрешает планировщику использовать планы сбора слиянием." -#: utils/misc/guc.c:1065 +#: utils/misc/guc.c:1096 msgid "Enables partitionwise join." msgstr "Включает соединения с учётом секционирования." -#: utils/misc/guc.c:1075 +#: utils/misc/guc.c:1106 msgid "Enables partitionwise aggregation and grouping." msgstr "Включает агрегирование и группировку с учётом секционирования." -#: utils/misc/guc.c:1085 +#: utils/misc/guc.c:1116 msgid "Enables the planner's use of parallel append plans." msgstr "Разрешает планировщику использовать планы параллельного добавления." -#: utils/misc/guc.c:1095 +#: utils/misc/guc.c:1126 msgid "Enables the planner's use of parallel hash plans." msgstr "" "Разрешает планировщику использовать планы параллельного соединения по хешу." -#: utils/misc/guc.c:1105 -msgid "Enables plan-time and run-time partition pruning." +#: utils/misc/guc.c:1136 +msgid "Enables plan-time and execution-time partition pruning." msgstr "" -"Включает устранение секций во время планирования и выполнения запросов." +"Включает устранение секций во время планирования и во время выполнения " +"запросов." -#: utils/misc/guc.c:1106 +#: utils/misc/guc.c:1137 msgid "" "Allows the query planner and executor to compare partition bounds to " "conditions in the query to determine which partitions must be scanned." @@ -27429,43 +28535,47 @@ msgstr "" "Разрешает планировщику и исполнителю запросов сопоставлять границы секций с " "условиями в запросе и выделять отдельные секции для сканирования." -#: utils/misc/guc.c:1117 +#: utils/misc/guc.c:1148 +msgid "Enables the planner's use of async append plans." +msgstr "Разрешает планировщику использовать планы асинхронного добавления." + +#: utils/misc/guc.c:1158 msgid "Enables genetic query optimization." msgstr "Включает генетическую оптимизацию запросов." -#: utils/misc/guc.c:1118 +#: utils/misc/guc.c:1159 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Этот алгоритм пытается построить план без полного перебора." -#: utils/misc/guc.c:1129 +#: utils/misc/guc.c:1170 msgid "Shows whether the current user is a superuser." msgstr "Показывает, является ли текущий пользователь суперпользователем." -#: utils/misc/guc.c:1139 +#: utils/misc/guc.c:1180 msgid "Enables advertising the server via Bonjour." msgstr "Включает объявление сервера посредством Bonjour." -#: utils/misc/guc.c:1148 +#: utils/misc/guc.c:1189 msgid "Collects transaction commit time." msgstr "Записывает время фиксации транзакций." -#: utils/misc/guc.c:1157 +#: utils/misc/guc.c:1198 msgid "Enables SSL connections." msgstr "Разрешает SSL-подключения." -#: utils/misc/guc.c:1166 +#: utils/misc/guc.c:1207 msgid "Also use ssl_passphrase_command during server reload." msgstr "Также использовать ssl_passphrase_command при перезагрузке сервера." -#: utils/misc/guc.c:1175 +#: utils/misc/guc.c:1216 msgid "Give priority to server ciphersuite order." msgstr "Назначает более приоритетным набор шифров сервера." -#: utils/misc/guc.c:1184 +#: utils/misc/guc.c:1225 msgid "Forces synchronization of updates to disk." msgstr "Принудительная запись изменений на диск." -#: utils/misc/guc.c:1185 +#: utils/misc/guc.c:1226 msgid "" "The server will use the fsync() system call in several places to make sure " "that updates are physically written to disk. This insures that a database " @@ -27476,11 +28586,11 @@ msgstr "" "физической записи данных на диск. Это позволит привести кластер БД в " "целостное состояние после отказа ОС или оборудования." -#: utils/misc/guc.c:1196 +#: utils/misc/guc.c:1237 msgid "Continues processing after a checksum failure." msgstr "Продолжает обработку при ошибке контрольной суммы." -#: utils/misc/guc.c:1197 +#: utils/misc/guc.c:1238 msgid "" "Detection of a checksum failure normally causes PostgreSQL to report an " "error, aborting the current transaction. Setting ignore_checksum_failure to " @@ -27494,11 +28604,11 @@ msgstr "" "что может привести к сбоям или другим серьёзным проблемам. Это имеет место, " "только если включён контроль целостности страниц." -#: utils/misc/guc.c:1211 +#: utils/misc/guc.c:1252 msgid "Continues processing past damaged page headers." msgstr "Продолжает обработку при повреждении заголовков страниц." -#: utils/misc/guc.c:1212 +#: utils/misc/guc.c:1253 msgid "" "Detection of a damaged page header normally causes PostgreSQL to report an " "error, aborting the current transaction. Setting zero_damaged_pages to true " @@ -27512,12 +28622,12 @@ msgstr "" "продолжит работу. Это приведёт к потере данных, а именно строк в " "повреждённой странице." -#: utils/misc/guc.c:1225 +#: utils/misc/guc.c:1266 msgid "Continues recovery after an invalid pages failure." msgstr "" "Продолжает восстановление после ошибок, связанных с неправильными страницами." -#: utils/misc/guc.c:1226 +#: utils/misc/guc.c:1267 msgid "" "Detection of WAL records having references to invalid pages during recovery " "causes PostgreSQL to raise a PANIC-level error, aborting the recovery. " @@ -27536,12 +28646,12 @@ msgstr "" "проблемам. Данный параметр действует только при восстановлении или в режиме " "резервного сервера." -#: utils/misc/guc.c:1244 +#: utils/misc/guc.c:1285 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "" "Запись полных страниц в WAL при первом изменении после контрольной точки." -#: utils/misc/guc.c:1245 +#: utils/misc/guc.c:1286 msgid "" "A page write in process during an operating system crash might be only " "partially written to disk. During recovery, the row changes stored in WAL " @@ -27554,91 +28664,95 @@ msgstr "" "при первом изменении после контрольной точки, что позволяет полностью " "восстановить данные." -#: utils/misc/guc.c:1258 +#: utils/misc/guc.c:1299 msgid "" "Writes full pages to WAL when first modified after a checkpoint, even for a " -"non-critical modifications." +"non-critical modification." msgstr "" "Запись полных страниц в WAL при первом изменении после контрольной точки, " -"даже при некритических изменениях." +"даже при некритическом изменении." -#: utils/misc/guc.c:1268 +#: utils/misc/guc.c:1309 msgid "Compresses full-page writes written in WAL file." msgstr "Сжимать данные при записи полных страниц в журнал." -#: utils/misc/guc.c:1278 +#: utils/misc/guc.c:1319 msgid "Writes zeroes to new WAL files before first use." msgstr "Записывать нули в новые файлы WAL перед первым использованием." -#: utils/misc/guc.c:1288 +#: utils/misc/guc.c:1329 msgid "Recycles WAL files by renaming them." msgstr "Перерабатывать файлы WAL, производя переименование." -#: utils/misc/guc.c:1298 +#: utils/misc/guc.c:1339 msgid "Logs each checkpoint." msgstr "Протоколировать каждую контрольную точку." -#: utils/misc/guc.c:1307 +#: utils/misc/guc.c:1348 msgid "Logs each successful connection." msgstr "Протоколировать устанавливаемые соединения." -#: utils/misc/guc.c:1316 +#: utils/misc/guc.c:1357 msgid "Logs end of a session, including duration." msgstr "Протоколировать конец сеанса, отмечая длительность." -#: utils/misc/guc.c:1325 +#: utils/misc/guc.c:1366 msgid "Logs each replication command." msgstr "Протоколировать каждую команду репликации." -#: utils/misc/guc.c:1334 +#: utils/misc/guc.c:1375 msgid "Shows whether the running server has assertion checks enabled." msgstr "Показывает, включены ли проверки истинности на работающем сервере." -#: utils/misc/guc.c:1349 +#: utils/misc/guc.c:1390 msgid "Terminate session on any error." msgstr "Завершать сеансы при любой ошибке." -#: utils/misc/guc.c:1358 +#: utils/misc/guc.c:1399 msgid "Reinitialize server after backend crash." msgstr "Перезапускать систему БД при аварии серверного процесса." -#: utils/misc/guc.c:1368 +#: utils/misc/guc.c:1408 +msgid "Remove temporary files after backend crash." +msgstr "Удалять временные файлы после аварии обслуживающего процесса." + +#: utils/misc/guc.c:1419 msgid "Logs the duration of each completed SQL statement." msgstr "Протоколировать длительность каждого выполненного SQL-оператора." -#: utils/misc/guc.c:1377 +#: utils/misc/guc.c:1428 msgid "Logs each query's parse tree." msgstr "Протоколировать дерево разбора для каждого запроса." -#: utils/misc/guc.c:1386 +#: utils/misc/guc.c:1437 msgid "Logs each query's rewritten parse tree." msgstr "Протоколировать перезаписанное дерево разбора для каждого запроса." -#: utils/misc/guc.c:1395 +#: utils/misc/guc.c:1446 msgid "Logs each query's execution plan." msgstr "Протоколировать план выполнения каждого запроса." -#: utils/misc/guc.c:1404 +#: utils/misc/guc.c:1455 msgid "Indents parse and plan tree displays." msgstr "Отступы при отображении деревьев разбора и плана запросов." -#: utils/misc/guc.c:1413 +#: utils/misc/guc.c:1464 msgid "Writes parser performance statistics to the server log." msgstr "Запись статистики разбора запросов в протокол сервера." -#: utils/misc/guc.c:1422 +#: utils/misc/guc.c:1473 msgid "Writes planner performance statistics to the server log." msgstr "Запись статистики планирования в протокол сервера." -#: utils/misc/guc.c:1431 +#: utils/misc/guc.c:1482 msgid "Writes executor performance statistics to the server log." msgstr "Запись статистики выполнения запросов в протокол сервера." -#: utils/misc/guc.c:1440 +#: utils/misc/guc.c:1491 msgid "Writes cumulative performance statistics to the server log." msgstr "Запись общей статистики производительности в протокол сервера." -#: utils/misc/guc.c:1450 +#: utils/misc/guc.c:1501 msgid "" "Logs system resource usage statistics (memory and CPU) on various B-tree " "operations." @@ -27646,11 +28760,11 @@ msgstr "" "Фиксировать статистику использования системных ресурсов (памяти и " "процессора) при различных операциях с b-деревом." -#: utils/misc/guc.c:1462 +#: utils/misc/guc.c:1513 msgid "Collects information about executing commands." msgstr "Собирает информацию о выполняющихся командах." -#: utils/misc/guc.c:1463 +#: utils/misc/guc.c:1514 msgid "" "Enables the collection of information on the currently executing command of " "each session, along with the time at which that command began execution." @@ -27658,60 +28772,70 @@ msgstr "" "Включает сбор информации о командах, выполняющихся во всех сеансах, а также " "время запуска команды." -#: utils/misc/guc.c:1473 +#: utils/misc/guc.c:1524 msgid "Collects statistics on database activity." msgstr "Собирает статистику активности в БД." -#: utils/misc/guc.c:1482 +#: utils/misc/guc.c:1533 msgid "Collects timing statistics for database I/O activity." msgstr "Собирает статистику по времени активности ввода/вывода." -#: utils/misc/guc.c:1492 +#: utils/misc/guc.c:1542 +msgid "Collects timing statistics for WAL I/O activity." +msgstr "Собирает статистику по времени активности ввода/вывода WAL." + +#: utils/misc/guc.c:1552 msgid "Updates the process title to show the active SQL command." msgstr "Выводит в заголовок процесса активную SQL-команду." -#: utils/misc/guc.c:1493 +#: utils/misc/guc.c:1553 msgid "" "Enables updating of the process title every time a new SQL command is " "received by the server." msgstr "Отражает в заголовке процесса каждую SQL-команду, поступающую серверу." -#: utils/misc/guc.c:1506 +#: utils/misc/guc.c:1566 msgid "Starts the autovacuum subprocess." msgstr "Запускает подпроцесс автоочистки." -#: utils/misc/guc.c:1516 +#: utils/misc/guc.c:1576 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Генерирует отладочные сообщения для LISTEN и NOTIFY." -#: utils/misc/guc.c:1528 +#: utils/misc/guc.c:1588 msgid "Emits information about lock usage." msgstr "Выдавать информацию о применяемых блокировках." -#: utils/misc/guc.c:1538 +#: utils/misc/guc.c:1598 msgid "Emits information about user lock usage." msgstr "Выдавать информацию о применяемых пользовательских блокировках." -#: utils/misc/guc.c:1548 +#: utils/misc/guc.c:1608 msgid "Emits information about lightweight lock usage." msgstr "Выдавать информацию о применяемых лёгких блокировках." -#: utils/misc/guc.c:1558 +#: utils/misc/guc.c:1618 msgid "" "Dumps information about all current locks when a deadlock timeout occurs." msgstr "" "Выводить информацию обо всех текущих блокировках в случае тайм-аута при " "взаимоблокировке." -#: utils/misc/guc.c:1570 +#: utils/misc/guc.c:1630 msgid "Logs long lock waits." msgstr "Протоколировать длительные ожидания в блокировках." -#: utils/misc/guc.c:1580 +#: utils/misc/guc.c:1639 +msgid "Logs standby recovery conflict waits." +msgstr "" +"Протоколировать события ожидания разрешения конфликтов при восстановлении на " +"ведомом." + +#: utils/misc/guc.c:1648 msgid "Logs the host name in the connection logs." msgstr "Записывать имя узла в протоколы подключений." -#: utils/misc/guc.c:1581 +#: utils/misc/guc.c:1649 msgid "" "By default, connection logs only show the IP address of the connecting host. " "If you want them to show the host name you can turn this on, but depending " @@ -27723,11 +28847,11 @@ msgstr "" "параметр, но учтите, что это может значительно повлиять на " "производительность." -#: utils/misc/guc.c:1592 +#: utils/misc/guc.c:1660 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Обрабатывать \"expr=NULL\" как \"expr IS NULL\"." -#: utils/misc/guc.c:1593 +#: utils/misc/guc.c:1661 msgid "" "When turned on, expressions of the form expr = NULL (or NULL = expr) are " "treated as expr IS NULL, that is, they return true if expr evaluates to the " @@ -27739,25 +28863,25 @@ msgstr "" "совпадает с NULL, и false в противном случае. По правилам expr = NULL всегда " "должно возвращать null (неопределённость)." -#: utils/misc/guc.c:1605 +#: utils/misc/guc.c:1673 msgid "Enables per-database user names." msgstr "Включает связывание имён пользователей с базами данных." -#: utils/misc/guc.c:1614 +#: utils/misc/guc.c:1682 msgid "Sets the default read-only status of new transactions." msgstr "" "Устанавливает режим \"только чтение\" по умолчанию для новых транзакций." -#: utils/misc/guc.c:1623 +#: utils/misc/guc.c:1692 msgid "Sets the current transaction's read-only status." msgstr "Устанавливает режим \"только чтение\" для текущей транзакции." -#: utils/misc/guc.c:1633 +#: utils/misc/guc.c:1702 msgid "Sets the default deferrable status of new transactions." msgstr "" "Устанавливает режим отложенного выполнения по умолчанию для новых транзакций." -#: utils/misc/guc.c:1642 +#: utils/misc/guc.c:1711 msgid "" "Whether to defer a read-only serializable transaction until it can be " "executed with no possible serialization failures." @@ -27765,25 +28889,26 @@ msgstr "" "Определяет, откладывать ли сериализуемую транзакцию \"только чтение\" до " "момента, когда сбой сериализации будет исключён." -#: utils/misc/guc.c:1652 +#: utils/misc/guc.c:1721 msgid "Enable row security." msgstr "Включает защиту на уровне строк." -#: utils/misc/guc.c:1653 +#: utils/misc/guc.c:1722 msgid "When enabled, row security will be applied to all users." msgstr "" "Когда включена, защита на уровне строк распространяется на всех " "пользователей." -#: utils/misc/guc.c:1661 -msgid "Check function bodies during CREATE FUNCTION." -msgstr "Проверять тело функций в момент CREATE FUNCTION." +#: utils/misc/guc.c:1730 +msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." +msgstr "" +"Проверять тело подпрограмм в момент CREATE FUNCTION и CREATE PROCEDURE." -#: utils/misc/guc.c:1670 +#: utils/misc/guc.c:1739 msgid "Enable input of NULL elements in arrays." msgstr "Разрешать ввод элементов NULL в массивах." -#: utils/misc/guc.c:1671 +#: utils/misc/guc.c:1740 msgid "" "When turned on, unquoted NULL in an array input value means a null value; " "otherwise it is taken literally." @@ -27791,73 +28916,73 @@ msgstr "" "Когда этот параметр включён, NULL без кавычек при вводе в массив " "воспринимается как значение NULL, иначе — как строка." -#: utils/misc/guc.c:1687 +#: utils/misc/guc.c:1756 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "" "WITH OIDS более не поддерживается; единственное допустимое значение — false." -#: utils/misc/guc.c:1697 +#: utils/misc/guc.c:1766 msgid "" "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "" "Запускает подпроцесс для чтения stderr и/или csv-файлов и записи в файлы " "протоколов." -#: utils/misc/guc.c:1706 +#: utils/misc/guc.c:1775 msgid "Truncate existing log files of same name during log rotation." msgstr "" "Очищать уже существующий файл с тем же именем при прокручивании протокола." -#: utils/misc/guc.c:1717 +#: utils/misc/guc.c:1786 msgid "Emit information about resource usage in sorting." msgstr "Выдавать сведения об использовании ресурсов при сортировке." -#: utils/misc/guc.c:1731 +#: utils/misc/guc.c:1800 msgid "Generate debugging output for synchronized scanning." msgstr "Выдавать отладочные сообщения для синхронного сканирования." -#: utils/misc/guc.c:1746 +#: utils/misc/guc.c:1815 msgid "Enable bounded sorting using heap sort." msgstr "" "Разрешить ограниченную сортировку с применением пирамидальной сортировки." -#: utils/misc/guc.c:1759 +#: utils/misc/guc.c:1828 msgid "Emit WAL-related debugging output." msgstr "Выдавать отладочные сообщения, связанные с WAL." -#: utils/misc/guc.c:1771 -msgid "Datetimes are integer based." -msgstr "Целочисленная реализация даты/времени." +#: utils/misc/guc.c:1840 +msgid "Shows whether datetimes are integer based." +msgstr "Показывает, является ли реализация даты/времени целочисленной." -#: utils/misc/guc.c:1782 +#: utils/misc/guc.c:1851 msgid "" "Sets whether Kerberos and GSSAPI user names should be treated as case-" "insensitive." msgstr "" "Включает регистронезависимую обработку имён пользователей Kerberos и GSSAPI." -#: utils/misc/guc.c:1792 +#: utils/misc/guc.c:1861 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Предупреждения о спецсимволах '\\' в обычных строках." -#: utils/misc/guc.c:1802 +#: utils/misc/guc.c:1871 msgid "Causes '...' strings to treat backslashes literally." msgstr "Включает буквальную обработку символов '\\' в строках '...'." -#: utils/misc/guc.c:1813 +#: utils/misc/guc.c:1882 msgid "Enable synchronized sequential scans." msgstr "Включить синхронизацию последовательного сканирования." -#: utils/misc/guc.c:1823 +#: utils/misc/guc.c:1892 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "Определяет, включать ли транзакцию в целевую точку восстановления." -#: utils/misc/guc.c:1833 +#: utils/misc/guc.c:1902 msgid "Allows connections and queries during recovery." msgstr "" "Разрешает принимать новые подключения и запросы в процессе восстановления." -#: utils/misc/guc.c:1843 +#: utils/misc/guc.c:1912 msgid "" "Allows feedback from a hot standby to the primary that will avoid query " "conflicts." @@ -27865,15 +28990,19 @@ msgstr "" "Разрешает обратную связь сервера горячего резерва с основным для " "предотвращения конфликтов при длительных запросах." -#: utils/misc/guc.c:1853 +#: utils/misc/guc.c:1922 +msgid "Shows whether hot standby is currently active." +msgstr "Показывает, активен ли в настоящий момент режим горячего резерва." + +#: utils/misc/guc.c:1933 msgid "Allows modifications of the structure of system tables." msgstr "Разрешает модифицировать структуру системных таблиц." -#: utils/misc/guc.c:1864 +#: utils/misc/guc.c:1944 msgid "Disables reading from system indexes." msgstr "Запрещает использование системных индексов." -#: utils/misc/guc.c:1865 +#: utils/misc/guc.c:1945 msgid "" "It does not prevent updating the indexes, so it is safe to use. The worst " "consequence is slowness." @@ -27881,14 +29010,14 @@ msgstr "" "При этом индексы продолжают обновляться, так что данное поведение безопасно. " "Худшее следствие - замедление." -#: utils/misc/guc.c:1876 +#: utils/misc/guc.c:1956 msgid "" "Enables backward compatibility mode for privilege checks on large objects." msgstr "" "Включает режим обратной совместимости при проверке привилегий для больших " "объектов." -#: utils/misc/guc.c:1877 +#: utils/misc/guc.c:1957 msgid "" "Skips privilege checks when reading or modifying large objects, for " "compatibility with PostgreSQL releases prior to 9.0." @@ -27896,73 +29025,66 @@ msgstr "" "Пропускает проверки привилегий при чтении или изменении больших объектов " "(для совместимости с версиями PostgreSQL до 9.0)." -#: utils/misc/guc.c:1887 -msgid "" -"Emit a warning for constructs that changed meaning since PostgreSQL 9.4." -msgstr "" -"Выдаёт предупреждение о конструкциях, поведение которых изменилось после " -"PostgreSQL 9.4." - -#: utils/misc/guc.c:1897 +#: utils/misc/guc.c:1967 msgid "When generating SQL fragments, quote all identifiers." msgstr "" "Генерируя SQL-фрагменты, заключать все идентификаторы в двойные кавычки." -#: utils/misc/guc.c:1907 +#: utils/misc/guc.c:1977 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Показывает, включён ли в этом кластере контроль целостности данных." -#: utils/misc/guc.c:1918 +#: utils/misc/guc.c:1988 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "" "Добавлять последовательный номер в сообщения syslog во избежание подавления " "повторов." -#: utils/misc/guc.c:1928 +#: utils/misc/guc.c:1998 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "" "Разбивать сообщения, передаваемые в syslog, по строкам размером не больше " "1024 байт." -#: utils/misc/guc.c:1938 +#: utils/misc/guc.c:2008 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "" "Определяет, будут ли узлы сбора и сбора слиянием также выполнять подпланы." -#: utils/misc/guc.c:1939 -msgid "Should gather nodes also run subplans, or just gather tuples?" +#: utils/misc/guc.c:2009 +msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "" "Должны ли узлы сбора также выполнять подпланы или только собирать кортежи?" -#: utils/misc/guc.c:1949 +#: utils/misc/guc.c:2019 msgid "Allow JIT compilation." msgstr "Включить JIT-компиляцию." -#: utils/misc/guc.c:1960 -msgid "Register JIT compiled function with debugger." +#: utils/misc/guc.c:2030 +msgid "Register JIT-compiled functions with debugger." msgstr "Регистрировать JIT-скомпилированные функции в отладчике." -#: utils/misc/guc.c:1977 +#: utils/misc/guc.c:2047 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "Выводить битовый код LLVM для облегчения отладки JIT." -#: utils/misc/guc.c:1988 +#: utils/misc/guc.c:2058 msgid "Allow JIT compilation of expressions." msgstr "Включить JIT-компиляцию выражений." -#: utils/misc/guc.c:1999 -msgid "Register JIT compiled function with perf profiler." +#: utils/misc/guc.c:2069 +msgid "Register JIT-compiled functions with perf profiler." msgstr "Регистрировать JIT-компилируемые функции в профилировщике perf." -#: utils/misc/guc.c:2016 +#: utils/misc/guc.c:2086 msgid "Allow JIT compilation of tuple deforming." msgstr "Разрешить JIT-компиляцию кода преобразования кортежей." -#: utils/misc/guc.c:2027 +#: utils/misc/guc.c:2097 msgid "Whether to continue running after a failure to sync data files." msgstr "Продолжать работу после ошибки при сохранении файлов данных на диске." -#: utils/misc/guc.c:2036 +#: utils/misc/guc.c:2106 msgid "" "Sets whether a WAL receiver should create a temporary replication slot if no " "permanent slot is configured." @@ -27970,7 +29092,7 @@ msgstr "" "Определяет, должен ли приёмник WAL создавать временный слот репликации, если " "не настроен постоянный слот." -#: utils/misc/guc.c:2054 +#: utils/misc/guc.c:2124 msgid "" "Forces a switch to the next WAL file if a new file has not been started " "within N seconds." @@ -27978,19 +29100,19 @@ msgstr "" "Принудительно переключаться на следующий файл WAL, если начать новый файл за " "N секунд не удалось." -#: utils/misc/guc.c:2065 +#: utils/misc/guc.c:2135 msgid "Waits N seconds on connection startup after authentication." msgstr "Ждать N секунд при подключении после проверки подлинности." -#: utils/misc/guc.c:2066 utils/misc/guc.c:2624 +#: utils/misc/guc.c:2136 utils/misc/guc.c:2734 msgid "This allows attaching a debugger to the process." msgstr "Это позволяет подключить к процессу отладчик." -#: utils/misc/guc.c:2075 +#: utils/misc/guc.c:2145 msgid "Sets the default statistics target." msgstr "Устанавливает ориентир статистики по умолчанию." -#: utils/misc/guc.c:2076 +#: utils/misc/guc.c:2146 msgid "" "This applies to table columns that have not had a column-specific target set " "via ALTER TABLE SET STATISTICS." @@ -27998,13 +29120,13 @@ msgstr "" "Это значение распространяется на столбцы таблицы, для которых ориентир " "статистики не задан явно через ALTER TABLE SET STATISTICS." -#: utils/misc/guc.c:2085 +#: utils/misc/guc.c:2155 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "" "Задаёт предел для списка FROM, при превышении которого подзапросы не " "сворачиваются." -#: utils/misc/guc.c:2087 +#: utils/misc/guc.c:2157 msgid "" "The planner will merge subqueries into upper queries if the resulting FROM " "list would have no more than this many items." @@ -28012,13 +29134,13 @@ msgstr "" "Планировщик объединит вложенные запросы с внешними, если в полученном списке " "FROM будет не больше заданного числа элементов." -#: utils/misc/guc.c:2098 +#: utils/misc/guc.c:2168 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "" "Задаёт предел для списка FROM, при превышении которого конструкции JOIN " "сохраняются." -#: utils/misc/guc.c:2100 +#: utils/misc/guc.c:2170 msgid "" "The planner will flatten explicit JOIN constructs into lists of FROM items " "whenever a list of no more than this many items would result." @@ -28026,34 +29148,34 @@ msgstr "" "Планировщик будет сносить явные конструкции JOIN в списки FROM, пока в " "результирующем списке не больше заданного числа элементов." -#: utils/misc/guc.c:2111 +#: utils/misc/guc.c:2181 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "" "Задаёт предел для списка FROM, при превышении которого применяется GEQO." -#: utils/misc/guc.c:2121 +#: utils/misc/guc.c:2191 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "" "GEQO: оценка усилий для планирования, задающая значения по умолчанию для " "других параметров GEQO." -#: utils/misc/guc.c:2131 +#: utils/misc/guc.c:2201 msgid "GEQO: number of individuals in the population." msgstr "GEQO: число особей в популяции." -#: utils/misc/guc.c:2132 utils/misc/guc.c:2142 +#: utils/misc/guc.c:2202 utils/misc/guc.c:2212 msgid "Zero selects a suitable default value." msgstr "При нуле выбирается подходящее значение по умолчанию." -#: utils/misc/guc.c:2141 +#: utils/misc/guc.c:2211 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: число итераций алгоритма." -#: utils/misc/guc.c:2153 +#: utils/misc/guc.c:2223 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Задаёт интервал ожидания в блокировке до проверки на взаимоблокировку." -#: utils/misc/guc.c:2164 +#: utils/misc/guc.c:2234 msgid "" "Sets the maximum delay before canceling queries when a hot standby server is " "processing archived WAL data." @@ -28061,7 +29183,7 @@ msgstr "" "Задаёт максимальную задержку до отмены запроса, когда сервер горячего " "резерва обрабатывает данные WAL из архива." -#: utils/misc/guc.c:2175 +#: utils/misc/guc.c:2245 msgid "" "Sets the maximum delay before canceling queries when a hot standby server is " "processing streamed WAL data." @@ -28069,13 +29191,13 @@ msgstr "" "Задаёт максимальную задержку до отмены запроса, когда сервер горячего " "резерва обрабатывает данные WAL из потока." -#: utils/misc/guc.c:2186 +#: utils/misc/guc.c:2256 msgid "Sets the minimum delay for applying changes during recovery." msgstr "" "Задаёт минимальную задержку для применения изменений в процессе " "восстановления." -#: utils/misc/guc.c:2197 +#: utils/misc/guc.c:2267 msgid "" "Sets the maximum interval between WAL receiver status reports to the sending " "server." @@ -28083,37 +29205,41 @@ msgstr "" "Задаёт максимальный интервал между отчётами о состоянии приёмника WAL, " "отправляемыми передающему серверу." -#: utils/misc/guc.c:2208 +#: utils/misc/guc.c:2278 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "" "Задаёт предельное время ожидания для получения данных от передающего сервера." -#: utils/misc/guc.c:2219 +#: utils/misc/guc.c:2289 msgid "Sets the maximum number of concurrent connections." msgstr "Задаёт максимально возможное число подключений." -#: utils/misc/guc.c:2230 +#: utils/misc/guc.c:2300 msgid "Sets the number of connection slots reserved for superusers." msgstr "" "Определяет, сколько слотов подключений забронировано для суперпользователей." -#: utils/misc/guc.c:2244 +#: utils/misc/guc.c:2310 +msgid "Amount of dynamic shared memory reserved at startup." +msgstr "Объём динамической разделяемой памяти, резервируемый при запуске." + +#: utils/misc/guc.c:2325 msgid "Sets the number of shared memory buffers used by the server." msgstr "Задаёт количество буферов в разделяемой памяти, используемых сервером." -#: utils/misc/guc.c:2255 +#: utils/misc/guc.c:2336 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Задаёт предельное число временных буферов на один сеанс." -#: utils/misc/guc.c:2266 +#: utils/misc/guc.c:2347 msgid "Sets the TCP port the server listens on." msgstr "Задаёт TCP-порт для работы сервера." -#: utils/misc/guc.c:2276 +#: utils/misc/guc.c:2357 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Задаёт права доступа для Unix-сокета." -#: utils/misc/guc.c:2277 +#: utils/misc/guc.c:2358 msgid "" "Unix-domain sockets use the usual Unix file system permission set. The " "parameter value is expected to be a numeric mode specification in the form " @@ -28125,11 +29251,11 @@ msgstr "" "воспринимаемом системными функциями chmod и umask. (Чтобы использовать " "привычный восьмеричный формат, добавьте в начало ноль (0).)" -#: utils/misc/guc.c:2291 +#: utils/misc/guc.c:2372 msgid "Sets the file permissions for log files." msgstr "Задаёт права доступа к файлам протоколов." -#: utils/misc/guc.c:2292 +#: utils/misc/guc.c:2373 msgid "" "The parameter value is expected to be a numeric mode specification in the " "form accepted by the chmod and umask system calls. (To use the customary " @@ -28139,11 +29265,11 @@ msgstr "" "функциями chmod и umask. (Чтобы использовать привычный восьмеричный формат, " "добавьте в начало ноль (0).)" -#: utils/misc/guc.c:2306 -msgid "Mode of the data directory." -msgstr "Режим каталога данных." +#: utils/misc/guc.c:2387 +msgid "Shows the mode of the data directory." +msgstr "Показывает режим каталога данных." -#: utils/misc/guc.c:2307 +#: utils/misc/guc.c:2388 msgid "" "The parameter value is a numeric mode specification in the form accepted by " "the chmod and umask system calls. (To use the customary octal format the " @@ -28153,11 +29279,11 @@ msgstr "" "функциями chmod и umask. (Чтобы использовать привычный восьмеричный формат, " "добавьте в начало ноль (0).)" -#: utils/misc/guc.c:2320 +#: utils/misc/guc.c:2401 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Задаёт предельный объём памяти для рабочих пространств запросов." -#: utils/misc/guc.c:2321 +#: utils/misc/guc.c:2402 msgid "" "This much memory can be used by each internal sort operation and hash table " "before switching to temporary disk files." @@ -28165,19 +29291,19 @@ msgstr "" "Такой объём памяти может использоваться каждой внутренней операцией " "сортировки и таблицей хешей до переключения на временные файлы на диске." -#: utils/misc/guc.c:2333 +#: utils/misc/guc.c:2414 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Задаёт предельный объём памяти для операций по обслуживанию." -#: utils/misc/guc.c:2334 +#: utils/misc/guc.c:2415 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Подразумеваются в частности операции VACUUM и CREATE INDEX." -#: utils/misc/guc.c:2344 +#: utils/misc/guc.c:2425 msgid "Sets the maximum memory to be used for logical decoding." msgstr "Задаёт предельный объём памяти для логического декодирования." -#: utils/misc/guc.c:2345 +#: utils/misc/guc.c:2426 msgid "" "This much memory can be used by each internal reorder buffer before spilling " "to disk." @@ -28185,104 +29311,116 @@ msgstr "" "Такой объём памяти может использоваться каждым внутренним буфером " "пересортировки до вымещения данных на диск." -#: utils/misc/guc.c:2361 +#: utils/misc/guc.c:2442 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Задаёт максимальную глубину стека (в КБ)." -#: utils/misc/guc.c:2372 +#: utils/misc/guc.c:2453 msgid "Limits the total size of all temporary files used by each process." msgstr "" "Ограничивает общий размер всех временных файлов, доступный для каждого " "процесса." -#: utils/misc/guc.c:2373 +#: utils/misc/guc.c:2454 msgid "-1 means no limit." msgstr "-1 отключает ограничение." -#: utils/misc/guc.c:2383 +#: utils/misc/guc.c:2464 msgid "Vacuum cost for a page found in the buffer cache." msgstr "Стоимость очистки для страницы, найденной в кеше." -#: utils/misc/guc.c:2393 +#: utils/misc/guc.c:2474 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "Стоимость очистки для страницы, не найденной в кеше." -#: utils/misc/guc.c:2403 +#: utils/misc/guc.c:2484 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Стоимость очистки для страницы, которая не была \"грязной\"." -#: utils/misc/guc.c:2413 +#: utils/misc/guc.c:2494 msgid "Vacuum cost amount available before napping." msgstr "Суммарная стоимость очистки, при которой нужна передышка." -#: utils/misc/guc.c:2423 +#: utils/misc/guc.c:2504 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "" "Суммарная стоимость очистки, при которой нужна передышка, для автоочистки." -#: utils/misc/guc.c:2433 +#: utils/misc/guc.c:2514 msgid "" "Sets the maximum number of simultaneously open files for each server process." msgstr "" "Задаёт предельное число одновременно открытых файлов для каждого серверного " "процесса." -#: utils/misc/guc.c:2446 +#: utils/misc/guc.c:2527 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Задаёт предельное число одновременно подготовленных транзакций." -#: utils/misc/guc.c:2457 +#: utils/misc/guc.c:2538 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Задаёт минимальный OID таблиц, для которых отслеживаются блокировки." -#: utils/misc/guc.c:2458 +#: utils/misc/guc.c:2539 msgid "Is used to avoid output on system tables." msgstr "Применяется для игнорирования системных таблиц." -#: utils/misc/guc.c:2467 +#: utils/misc/guc.c:2548 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Задаёт OID таблицы для безусловного отслеживания блокировок." -#: utils/misc/guc.c:2479 +#: utils/misc/guc.c:2560 msgid "Sets the maximum allowed duration of any statement." msgstr "Задаёт предельную длительность для любого оператора." -#: utils/misc/guc.c:2480 utils/misc/guc.c:2491 utils/misc/guc.c:2502 +#: utils/misc/guc.c:2561 utils/misc/guc.c:2572 utils/misc/guc.c:2583 +#: utils/misc/guc.c:2594 msgid "A value of 0 turns off the timeout." msgstr "Нулевое значение отключает тайм-аут." -#: utils/misc/guc.c:2490 +#: utils/misc/guc.c:2571 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Задаёт максимальную продолжительность ожидания блокировок." -#: utils/misc/guc.c:2501 -msgid "Sets the maximum allowed duration of any idling transaction." -msgstr "Задаёт предельно допустимую длительность для простаивающих транзакций." +#: utils/misc/guc.c:2582 +msgid "" +"Sets the maximum allowed idle time between queries, when in a transaction." +msgstr "" +"Задаёт предельно допустимую длительность простоя между запросами в " +"транзакции." + +#: utils/misc/guc.c:2593 +msgid "" +"Sets the maximum allowed idle time between queries, when not in a " +"transaction." +msgstr "" +"Задаёт предельно допустимую длительность простоя между запросами вне " +"транзакций." -#: utils/misc/guc.c:2512 +#: utils/misc/guc.c:2604 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "" "Минимальный возраст строк таблицы, при котором VACUUM может их заморозить." -#: utils/misc/guc.c:2522 +#: utils/misc/guc.c:2614 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "" "Возраст, при котором VACUUM должен сканировать всю таблицу с целью " "заморозить кортежи." -#: utils/misc/guc.c:2532 +#: utils/misc/guc.c:2624 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "" "Минимальный возраст, при котором VACUUM будет замораживать MultiXactId в " "строке таблицы." -#: utils/misc/guc.c:2542 +#: utils/misc/guc.c:2634 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "" "Возраст multixact, при котором VACUUM должен сканировать всю таблицу с целью " "заморозить кортежи." -#: utils/misc/guc.c:2552 +#: utils/misc/guc.c:2644 msgid "" "Number of transactions by which VACUUM and HOT cleanup should be deferred, " "if any." @@ -28290,11 +29428,26 @@ msgstr "" "Определяет, на сколько транзакций следует задержать старые строки, выполняя " "VACUUM или \"горячее\" обновление." -#: utils/misc/guc.c:2565 +#: utils/misc/guc.c:2653 +msgid "" +"Age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "" +"Возраст, при котором VACUUM должен включить защиту от зацикливания во " +"избежание отказа." + +#: utils/misc/guc.c:2662 +msgid "" +"Multixact age at which VACUUM should trigger failsafe to avoid a wraparound " +"outage." +msgstr "" +"Возраст мультитранзакций, при котором VACUUM должен включить защиту от " +"зацикливания во избежание отказа." + +#: utils/misc/guc.c:2675 msgid "Sets the maximum number of locks per transaction." msgstr "Задаёт предельное число блокировок на транзакцию." -#: utils/misc/guc.c:2566 +#: utils/misc/guc.c:2676 msgid "" "The shared lock table is sized on the assumption that at most " "max_locks_per_transaction * max_connections distinct objects will need to be " @@ -28304,11 +29457,11 @@ msgstr "" "один момент времени потребуется заблокировать не больше чем " "max_locks_per_transaction * max_connections различных объектов." -#: utils/misc/guc.c:2577 +#: utils/misc/guc.c:2687 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Задаёт предельное число предикатных блокировок на транзакцию." -#: utils/misc/guc.c:2578 +#: utils/misc/guc.c:2688 msgid "" "The shared predicate lock table is sized on the assumption that at most " "max_pred_locks_per_transaction * max_connections distinct objects will need " @@ -28318,14 +29471,14 @@ msgstr "" "предположения, что в один момент времени потребуется заблокировать не больше " "чем max_pred_locks_per_transaction * max_connections различных объектов." -#: utils/misc/guc.c:2589 +#: utils/misc/guc.c:2699 msgid "" "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "" "Задаёт максимальное число страниц и кортежей, блокируемых предикатными " "блокировками в одном отношении." -#: utils/misc/guc.c:2590 +#: utils/misc/guc.c:2700 msgid "" "If more than this total of pages and tuples in the same relation are locked " "by a connection, those locks are replaced by a relation-level lock." @@ -28333,13 +29486,13 @@ msgstr "" "Если одним соединением блокируется больше этого общего числа страниц и " "кортежей, эти блокировки заменяются блокировкой на уровне отношения." -#: utils/misc/guc.c:2600 +#: utils/misc/guc.c:2710 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "" "Задаёт максимальное число кортежей, блокируемых предикатными блокировками в " "одной странице." -#: utils/misc/guc.c:2601 +#: utils/misc/guc.c:2711 msgid "" "If more than this number of tuples on the same page are locked by a " "connection, those locks are replaced by a page-level lock." @@ -28347,40 +29500,40 @@ msgstr "" "Если одним соединением блокируется больше этого числа кортежей на одной " "странице, эти блокировки заменяются блокировкой на уровне страницы." -#: utils/misc/guc.c:2611 +#: utils/misc/guc.c:2721 msgid "Sets the maximum allowed time to complete client authentication." msgstr "Ограничивает время, за которое клиент должен пройти аутентификацию." -#: utils/misc/guc.c:2623 +#: utils/misc/guc.c:2733 msgid "Waits N seconds on connection startup before authentication." msgstr "Ждать N секунд при подключении до проверки подлинности." -#: utils/misc/guc.c:2634 +#: utils/misc/guc.c:2744 msgid "Sets the size of WAL files held for standby servers." msgstr "" "Определяет предельный объём файлов WAL, сохраняемых для резервных серверов." -#: utils/misc/guc.c:2645 +#: utils/misc/guc.c:2755 msgid "Sets the minimum size to shrink the WAL to." msgstr "Задаёт минимальный размер WAL при сжатии." -#: utils/misc/guc.c:2657 +#: utils/misc/guc.c:2767 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Задаёт размер WAL, при котором инициируется контрольная точка." -#: utils/misc/guc.c:2669 +#: utils/misc/guc.c:2779 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "" "Задаёт максимальное время между автоматическими контрольными точками WAL." -#: utils/misc/guc.c:2680 +#: utils/misc/guc.c:2790 msgid "" "Enables warnings if checkpoint segments are filled more frequently than this." msgstr "" "Выдаёт предупреждения, когда сегменты контрольных точек заполняются за это " "время." -#: utils/misc/guc.c:2682 +#: utils/misc/guc.c:2792 msgid "" "Write a message to the server log if checkpoints caused by the filling of " "checkpoint segment files happens more frequently than this number of " @@ -28390,48 +29543,48 @@ msgstr "" "переполнением файлов сегментов, происходят за столько секунд. Нулевое " "значение отключает эти предупреждения." -#: utils/misc/guc.c:2694 utils/misc/guc.c:2910 utils/misc/guc.c:2957 +#: utils/misc/guc.c:2804 utils/misc/guc.c:3020 utils/misc/guc.c:3067 msgid "" "Number of pages after which previously performed writes are flushed to disk." msgstr "" "Число страниц, по достижении которого ранее выполненные операции записи " "сбрасываются на диск." -#: utils/misc/guc.c:2705 +#: utils/misc/guc.c:2815 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "Задаёт число буферов дисковых страниц в разделяемой памяти для WAL." -#: utils/misc/guc.c:2716 +#: utils/misc/guc.c:2826 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Задержка между сбросом WAL в процессе, записывающем WAL." -#: utils/misc/guc.c:2727 +#: utils/misc/guc.c:2837 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "" "Объём WAL, обработанный пишущим WAL процессом, при котором инициируется " "сброс журнала на диск." -#: utils/misc/guc.c:2738 -msgid "Size of new file to fsync instead of writing WAL." +#: utils/misc/guc.c:2848 +msgid "Minimum size of new file to fsync instead of writing WAL." msgstr "" -"Объём нового файла, при достижении которого файл не пишется в WAL, а " +"Размер нового файла, при достижении которого файл не пишется в WAL, а " "сбрасывается на диск." -#: utils/misc/guc.c:2749 +#: utils/misc/guc.c:2859 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "" "Задаёт предельное число одновременно работающих процессов передачи WAL." -#: utils/misc/guc.c:2760 +#: utils/misc/guc.c:2870 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Задаёт предельное число одновременно существующих слотов репликации." -#: utils/misc/guc.c:2770 +#: utils/misc/guc.c:2880 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "" "Задаёт максимальный размер WAL, который могут резервировать слоты репликации." -#: utils/misc/guc.c:2771 +#: utils/misc/guc.c:2881 msgid "" "Replication slots will be marked as failed, and segments released for " "deletion or recycling, if this much space is occupied by WAL on disk." @@ -28440,11 +29593,11 @@ msgstr "" "помечены как нерабочие, а сегменты будут освобождены для удаления или " "переработки." -#: utils/misc/guc.c:2783 +#: utils/misc/guc.c:2893 msgid "Sets the maximum time to wait for WAL replication." msgstr "Задаёт предельное время ожидания репликации WAL." -#: utils/misc/guc.c:2794 +#: utils/misc/guc.c:2904 msgid "" "Sets the delay in microseconds between transaction commit and flushing WAL " "to disk." @@ -28452,18 +29605,18 @@ msgstr "" "Задаёт задержку в микросекундах между фиксированием транзакций и сбросом WAL " "на диск." -#: utils/misc/guc.c:2806 +#: utils/misc/guc.c:2916 msgid "" "Sets the minimum concurrent open transactions before performing commit_delay." msgstr "" "Задаёт минимальное число одновременно открытых транзакций для применения " "commit_delay." -#: utils/misc/guc.c:2817 +#: utils/misc/guc.c:2927 msgid "Sets the number of digits displayed for floating-point values." msgstr "Задаёт число выводимых цифр для чисел с плавающей точкой." -#: utils/misc/guc.c:2818 +#: utils/misc/guc.c:2928 msgid "" "This affects real, double precision, and geometric data types. A zero or " "negative parameter value is added to the standard number of digits (FLT_DIG " @@ -28475,7 +29628,7 @@ msgstr "" "(FLT_DIG или DBL_DIG соответственно). Положительное значение включает режим " "точного вывода." -#: utils/misc/guc.c:2830 +#: utils/misc/guc.c:2940 msgid "" "Sets the minimum execution time above which a sample of statements will be " "logged. Sampling is determined by log_statement_sample_rate." @@ -28484,22 +29637,22 @@ msgstr "" "которого он выводится в журнал. Выборка определяется параметром " "log_statement_sample_rate." -#: utils/misc/guc.c:2833 +#: utils/misc/guc.c:2943 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "При 0 выводятся все запросы в выборке; -1 отключает эти сообщения." -#: utils/misc/guc.c:2843 +#: utils/misc/guc.c:2953 msgid "" "Sets the minimum execution time above which all statements will be logged." msgstr "" "Задаёт предельное время выполнения любого оператора, при превышении которого " "он выводится в журнал." -#: utils/misc/guc.c:2845 +#: utils/misc/guc.c:2955 msgid "Zero prints all queries. -1 turns this feature off." msgstr "При 0 выводятся все запросы; -1 отключает эти сообщения." -#: utils/misc/guc.c:2855 +#: utils/misc/guc.c:2965 msgid "" "Sets the minimum execution time above which autovacuum actions will be " "logged." @@ -28507,40 +29660,40 @@ msgstr "" "Задаёт предельное время выполнения автоочистки, при превышении которого эта " "операция протоколируется в журнале." -#: utils/misc/guc.c:2857 +#: utils/misc/guc.c:2967 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "" "При 0 протоколируются все операции автоочистки; -1 отключает эти сообщения." -#: utils/misc/guc.c:2867 +#: utils/misc/guc.c:2977 msgid "" "When logging statements, limit logged parameter values to first N bytes." msgstr "" "Обрезать длинные значения параметров выводимых в журнал операторов до первых " "N байт." -#: utils/misc/guc.c:2868 utils/misc/guc.c:2879 +#: utils/misc/guc.c:2978 utils/misc/guc.c:2989 msgid "-1 to print values in full." msgstr "При -1 значения выводятся полностью." -#: utils/misc/guc.c:2878 +#: utils/misc/guc.c:2988 msgid "" "When reporting an error, limit logged parameter values to first N bytes." msgstr "" "Обрезать значения параметров, выводимые в сообщениях об ошибках, до первых N " "байт." -#: utils/misc/guc.c:2889 +#: utils/misc/guc.c:2999 msgid "Background writer sleep time between rounds." msgstr "Время простоя в процессе фоновой записи между подходами." -#: utils/misc/guc.c:2900 +#: utils/misc/guc.c:3010 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "" "Максимальное число LRU-страниц, сбрасываемых за один подход, в процессе " "фоновой записи." -#: utils/misc/guc.c:2923 +#: utils/misc/guc.c:3033 msgid "" "Number of simultaneous requests that can be handled efficiently by the disk " "subsystem." @@ -28548,87 +29701,80 @@ msgstr "" "Число одновременных запросов, которые могут быть эффективно обработаны " "дисковой подсистемой." -#: utils/misc/guc.c:2924 -msgid "" -"For RAID arrays, this should be approximately the number of drive spindles " -"in the array." -msgstr "" -"Для RAID-массивов это примерно равно числу физических дисков в массиве." - -#: utils/misc/guc.c:2941 +#: utils/misc/guc.c:3051 msgid "" "A variant of effective_io_concurrency that is used for maintenance work." msgstr "" "Вариация параметра effective_io_concurrency, предназначенная для операций " "обслуживания БД." -#: utils/misc/guc.c:2970 +#: utils/misc/guc.c:3080 msgid "Maximum number of concurrent worker processes." msgstr "Задаёт максимально возможное число рабочих процессов." -#: utils/misc/guc.c:2982 +#: utils/misc/guc.c:3092 msgid "Maximum number of logical replication worker processes." msgstr "" "Задаёт максимально возможное число рабочих процессов логической репликации." -#: utils/misc/guc.c:2994 +#: utils/misc/guc.c:3104 msgid "Maximum number of table synchronization workers per subscription." msgstr "" "Задаёт максимально возможное число процессов синхронизации таблиц для одной " "подписки." -#: utils/misc/guc.c:3004 +#: utils/misc/guc.c:3114 msgid "Automatic log file rotation will occur after N minutes." msgstr "Автоматическая прокрутка файла протокола через каждые N минут." -#: utils/misc/guc.c:3015 +#: utils/misc/guc.c:3125 msgid "Automatic log file rotation will occur after N kilobytes." msgstr "" "Автоматическая прокрутка файла протокола при выходе за предел N килобайт." -#: utils/misc/guc.c:3026 +#: utils/misc/guc.c:3136 msgid "Shows the maximum number of function arguments." msgstr "Показывает максимально возможное число аргументов функций." -#: utils/misc/guc.c:3037 +#: utils/misc/guc.c:3147 msgid "Shows the maximum number of index keys." msgstr "Показывает максимально возможное число ключей в индексе." -#: utils/misc/guc.c:3048 +#: utils/misc/guc.c:3158 msgid "Shows the maximum identifier length." msgstr "Показывает максимально возможную длину идентификатора." -#: utils/misc/guc.c:3059 +#: utils/misc/guc.c:3169 msgid "Shows the size of a disk block." msgstr "Показывает размер дискового блока." -#: utils/misc/guc.c:3070 +#: utils/misc/guc.c:3180 msgid "Shows the number of pages per disk file." msgstr "Показывает число страниц в одном файле." -#: utils/misc/guc.c:3081 +#: utils/misc/guc.c:3191 msgid "Shows the block size in the write ahead log." msgstr "Показывает размер блока в журнале WAL." -#: utils/misc/guc.c:3092 +#: utils/misc/guc.c:3202 msgid "" "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "" "Задаёт время задержки перед повторной попыткой обращения к WAL после неудачи." -#: utils/misc/guc.c:3104 +#: utils/misc/guc.c:3214 msgid "Shows the size of write ahead log segments." msgstr "Показывает размер сегментов журнала предзаписи." -#: utils/misc/guc.c:3117 +#: utils/misc/guc.c:3227 msgid "Time to sleep between autovacuum runs." msgstr "Время простоя между запусками автоочистки." -#: utils/misc/guc.c:3127 +#: utils/misc/guc.c:3237 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Минимальное число изменений или удалений кортежей, вызывающее очистку." -#: utils/misc/guc.c:3136 +#: utils/misc/guc.c:3246 msgid "" "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert " "vacuums." @@ -28636,27 +29782,27 @@ msgstr "" "Минимальное число добавлений кортежей, вызывающее очистку; при -1 такая " "очистка отключается." -#: utils/misc/guc.c:3145 +#: utils/misc/guc.c:3255 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "" "Минимальное число добавлений, изменений или удалений кортежей, вызывающее " "анализ." -#: utils/misc/guc.c:3155 +#: utils/misc/guc.c:3265 msgid "" "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "" "Возраст, при котором необходима автоочистка таблицы для предотвращения " "зацикливания ID транзакций." -#: utils/misc/guc.c:3166 +#: utils/misc/guc.c:3280 msgid "" "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "" "Возраст multixact, при котором необходима автоочистка таблицы для " "предотвращения зацикливания multixact." -#: utils/misc/guc.c:3176 +#: utils/misc/guc.c:3290 msgid "" "Sets the maximum number of simultaneously running autovacuum worker " "processes." @@ -28664,30 +29810,30 @@ msgstr "" "Задаёт предельное число одновременно выполняющихся рабочих процессов " "автоочистки." -#: utils/misc/guc.c:3186 +#: utils/misc/guc.c:3300 msgid "" "Sets the maximum number of parallel processes per maintenance operation." msgstr "" "Задаёт максимальное число параллельных процессов на одну операцию " "обслуживания." -#: utils/misc/guc.c:3196 +#: utils/misc/guc.c:3310 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Задаёт максимальное число параллельных процессов на узел исполнителя." -#: utils/misc/guc.c:3207 +#: utils/misc/guc.c:3321 msgid "" "Sets the maximum number of parallel workers that can be active at one time." msgstr "" "Задаёт максимальное число параллельных процессов, которые могут быть активны " "одновременно." -#: utils/misc/guc.c:3218 +#: utils/misc/guc.c:3332 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "" "Задаёт предельный объём памяти для каждого рабочего процесса автоочистки." -#: utils/misc/guc.c:3229 +#: utils/misc/guc.c:3343 msgid "" "Time before a snapshot is too old to read pages changed after the snapshot " "was taken." @@ -28695,33 +29841,33 @@ msgstr "" "Срок, по истечении которого снимок считается слишком старым для получения " "страниц, изменённых после создания снимка." -#: utils/misc/guc.c:3230 +#: utils/misc/guc.c:3344 msgid "A value of -1 disables this feature." msgstr "Значение -1 отключает это поведение." -#: utils/misc/guc.c:3240 +#: utils/misc/guc.c:3354 msgid "Time between issuing TCP keepalives." msgstr "Интервал между TCP-пакетами пульса (keep-alive)." -#: utils/misc/guc.c:3241 utils/misc/guc.c:3252 utils/misc/guc.c:3376 +#: utils/misc/guc.c:3355 utils/misc/guc.c:3366 utils/misc/guc.c:3490 msgid "A value of 0 uses the system default." msgstr "При нулевом значении действует системный параметр." -#: utils/misc/guc.c:3251 +#: utils/misc/guc.c:3365 msgid "Time between TCP keepalive retransmits." msgstr "Интервал между повторениями TCP-пакетов пульса (keep-alive)." -#: utils/misc/guc.c:3262 +#: utils/misc/guc.c:3376 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "" "Повторное согласование SSL более не поддерживается; единственное допустимое " "значение - 0." -#: utils/misc/guc.c:3273 +#: utils/misc/guc.c:3387 msgid "Maximum number of TCP keepalive retransmits." msgstr "Максимальное число повторений TCP-пакетов пульса (keep-alive)." -#: utils/misc/guc.c:3274 +#: utils/misc/guc.c:3388 msgid "" "This controls the number of consecutive keepalive retransmits that can be " "lost before a connection is considered dead. A value of 0 uses the system " @@ -28731,15 +29877,15 @@ msgstr "" "прежде чем соединение будет считаться пропавшим. При нулевом значении " "действует системный параметр." -#: utils/misc/guc.c:3285 +#: utils/misc/guc.c:3399 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "Ограничивает результат точного поиска с использованием GIN." -#: utils/misc/guc.c:3296 +#: utils/misc/guc.c:3410 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "Подсказывает планировщику примерный общий размер кешей данных." -#: utils/misc/guc.c:3297 +#: utils/misc/guc.c:3411 msgid "" "That is, the total size of the caches (kernel cache and shared buffers) used " "for PostgreSQL data files. This is measured in disk pages, which are " @@ -28749,12 +29895,12 @@ msgstr "" "попадают файлы данных PostgreSQL. Размер задаётся в дисковых страницах " "(обычно это 8 КБ)." -#: utils/misc/guc.c:3308 +#: utils/misc/guc.c:3422 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "" "Задаёт минимальный объём данных в таблице для параллельного сканирования." -#: utils/misc/guc.c:3309 +#: utils/misc/guc.c:3423 msgid "" "If the planner estimates that it will read a number of table pages too small " "to reach this limit, a parallel scan will not be considered." @@ -28763,12 +29909,12 @@ msgstr "" "задано этим ограничением, он исключает параллельное сканирование из " "рассмотрения." -#: utils/misc/guc.c:3319 +#: utils/misc/guc.c:3433 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "" "Задаёт минимальный объём данных в индексе для параллельного сканирования." -#: utils/misc/guc.c:3320 +#: utils/misc/guc.c:3434 msgid "" "If the planner estimates that it will read a number of index pages too small " "to reach this limit, a parallel scan will not be considered." @@ -28777,39 +29923,54 @@ msgstr "" "задано этим ограничением, он исключает параллельное сканирование из " "рассмотрения." -#: utils/misc/guc.c:3331 +#: utils/misc/guc.c:3445 msgid "Shows the server version as an integer." msgstr "Показывает версию сервера в виде целого числа." -#: utils/misc/guc.c:3342 +#: utils/misc/guc.c:3456 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "" "Фиксирует в протоколе превышение временными файлами заданного размера (в КБ)." -#: utils/misc/guc.c:3343 +#: utils/misc/guc.c:3457 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "" "При 0 отмечаются все файлы; при -1 эти сообщения отключаются (по умолчанию)." -#: utils/misc/guc.c:3353 +#: utils/misc/guc.c:3467 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Задаёт размер, резервируемый для pg_stat_activity.query (в байтах)." -#: utils/misc/guc.c:3364 +#: utils/misc/guc.c:3478 msgid "Sets the maximum size of the pending list for GIN index." msgstr "Задаёт максимальный размер списка-очереди для GIN-индекса." -#: utils/misc/guc.c:3375 +#: utils/misc/guc.c:3489 msgid "TCP user timeout." msgstr "Пользовательский таймаут TCP." -#: utils/misc/guc.c:3395 +#: utils/misc/guc.c:3500 +msgid "The size of huge page that should be requested." +msgstr "Запрашиваемый размер огромных страниц." + +#: utils/misc/guc.c:3511 +msgid "Aggressively flush system caches for debugging purposes." +msgstr "Включает агрессивный сброс системных кешей для целей отладки." + +#: utils/misc/guc.c:3534 +msgid "" +"Sets the time interval between checks for disconnection while running " +"queries." +msgstr "" +"Задаёт интервал между проверками подключения во время выполнения запросов." + +#: utils/misc/guc.c:3554 msgid "" "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "" "Задаёт для планировщика ориентир стоимости последовательного чтения страницы." -#: utils/misc/guc.c:3406 +#: utils/misc/guc.c:3565 msgid "" "Sets the planner's estimate of the cost of a nonsequentially fetched disk " "page." @@ -28817,13 +29978,13 @@ msgstr "" "Задаёт для планировщика ориентир стоимости непоследовательного чтения " "страницы." -#: utils/misc/guc.c:3417 +#: utils/misc/guc.c:3576 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "" "Задаёт для планировщика ориентир стоимости обработки каждого кортежа " "(строки)." -#: utils/misc/guc.c:3428 +#: utils/misc/guc.c:3587 msgid "" "Sets the planner's estimate of the cost of processing each index entry " "during an index scan." @@ -28831,7 +29992,7 @@ msgstr "" "Задаёт для планировщика ориентир стоимости обработки каждого элемента " "индекса в процессе сканирования индекса." -#: utils/misc/guc.c:3439 +#: utils/misc/guc.c:3598 msgid "" "Sets the planner's estimate of the cost of processing each operator or " "function call." @@ -28839,15 +30000,15 @@ msgstr "" "Задаёт для планировщика ориентир стоимости обработки каждого оператора или " "вызова функции." -#: utils/misc/guc.c:3450 +#: utils/misc/guc.c:3609 msgid "" "Sets the planner's estimate of the cost of passing each tuple (row) from " -"worker to master backend." +"worker to leader backend." msgstr "" "Задаёт для планировщика ориентир стоимости передачи каждого кортежа (строки) " -"от рабочего процесса обслуживающему." +"ведущему процессу от рабочего." -#: utils/misc/guc.c:3461 +#: utils/misc/guc.c:3620 msgid "" "Sets the planner's estimate of the cost of starting up worker processes for " "parallel query." @@ -28855,70 +30016,70 @@ msgstr "" "Задаёт для планировщика ориентир стоимости запуска рабочих процессов для " "параллельного выполнения запроса." -#: utils/misc/guc.c:3473 +#: utils/misc/guc.c:3632 msgid "Perform JIT compilation if query is more expensive." msgstr "Стоимость запроса, при превышении которой производится JIT-компиляция." -#: utils/misc/guc.c:3474 +#: utils/misc/guc.c:3633 msgid "-1 disables JIT compilation." msgstr "-1 отключает JIT-компиляцию." -#: utils/misc/guc.c:3484 -msgid "Optimize JITed functions if query is more expensive." +#: utils/misc/guc.c:3643 +msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "" "Стоимость запроса, при превышении которой оптимизируются JIT-" "скомпилированные функции." -#: utils/misc/guc.c:3485 +#: utils/misc/guc.c:3644 msgid "-1 disables optimization." msgstr "-1 отключает оптимизацию." -#: utils/misc/guc.c:3495 +#: utils/misc/guc.c:3654 msgid "Perform JIT inlining if query is more expensive." msgstr "Стоимость запроса, при которой выполняется встраивание JIT." -#: utils/misc/guc.c:3496 +#: utils/misc/guc.c:3655 msgid "-1 disables inlining." msgstr "-1 отключает встраивание кода." -#: utils/misc/guc.c:3506 +#: utils/misc/guc.c:3665 msgid "" "Sets the planner's estimate of the fraction of a cursor's rows that will be " "retrieved." msgstr "" "Задаёт для планировщика ориентир доли требуемых строк курсора в общем числе." -#: utils/misc/guc.c:3518 +#: utils/misc/guc.c:3677 msgid "GEQO: selective pressure within the population." msgstr "GEQO: селективное давление в популяции." -#: utils/misc/guc.c:3529 +#: utils/misc/guc.c:3688 msgid "GEQO: seed for random path selection." msgstr "GEQO: отправное значение для случайного выбора пути." -#: utils/misc/guc.c:3540 +#: utils/misc/guc.c:3699 msgid "Multiple of work_mem to use for hash tables." msgstr "Множитель work_mem, определяющий объём памяти для хеш-таблиц." -#: utils/misc/guc.c:3551 +#: utils/misc/guc.c:3710 msgid "Multiple of the average buffer usage to free per round." msgstr "" "Множитель для среднего числа использованных буферов, определяющий число " "буферов, освобождаемых за один подход." -#: utils/misc/guc.c:3561 +#: utils/misc/guc.c:3720 msgid "Sets the seed for random-number generation." msgstr "Задаёт отправное значение для генератора случайных чисел." -#: utils/misc/guc.c:3572 +#: utils/misc/guc.c:3731 msgid "Vacuum cost delay in milliseconds." msgstr "Задержка очистки (в миллисекундах)." -#: utils/misc/guc.c:3583 +#: utils/misc/guc.c:3742 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Задержка очистки для автоочистки (в миллисекундах)." -#: utils/misc/guc.c:3594 +#: utils/misc/guc.c:3753 msgid "" "Number of tuple updates or deletes prior to vacuum as a fraction of " "reltuples." @@ -28926,13 +30087,13 @@ msgstr "" "Отношение числа обновлений или удалений кортежей к reltuples, определяющее " "потребность в очистке." -#: utils/misc/guc.c:3604 +#: utils/misc/guc.c:3763 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "" "Отношение числа добавлений кортежей к reltuples, определяющее потребность в " "очистке." -#: utils/misc/guc.c:3614 +#: utils/misc/guc.c:3773 msgid "" "Number of tuple inserts, updates, or deletes prior to analyze as a fraction " "of reltuples." @@ -28940,7 +30101,7 @@ msgstr "" "Отношение числа добавлений, обновлений или удалений кортежей к reltuples, " "определяющее потребность в анализе." -#: utils/misc/guc.c:3624 +#: utils/misc/guc.c:3783 msgid "" "Time spent flushing dirty buffers during checkpoint, as fraction of " "checkpoint interval." @@ -28948,66 +30109,60 @@ msgstr "" "Отношение продолжительности сброса \"грязных\" буферов во время контрольной " "точки к интервалу контрольных точек." -#: utils/misc/guc.c:3634 -msgid "" -"Number of tuple inserts prior to index cleanup as a fraction of reltuples." -msgstr "" -"Отношение числа добавлений кортежей к reltuples, определяющее потребность в " -"уборке индекса." - -#: utils/misc/guc.c:3644 +#: utils/misc/guc.c:3793 msgid "Fraction of statements exceeding log_min_duration_sample to be logged." msgstr "" "Доля записываемых в журнал операторов с длительностью, превышающей " "log_min_duration_sample." -#: utils/misc/guc.c:3645 +#: utils/misc/guc.c:3794 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "" "Может задаваться значением от 0.0 (не записывать никакие операторы) и 1.0 " "(записывать все)." -#: utils/misc/guc.c:3654 -msgid "Set the fraction of transactions to log for new transactions." -msgstr "Задаёт долю транзакций, которая будет записываться в журнал сервера." +#: utils/misc/guc.c:3803 +msgid "Sets the fraction of transactions from which to log all statements." +msgstr "" +"Задаёт долю транзакций, все операторы которых будут записываться в журнал " +"сервера." -#: utils/misc/guc.c:3655 +#: utils/misc/guc.c:3804 msgid "" -"Logs all statements from a fraction of transactions. Use a value between 0.0 " -"(never log) and 1.0 (log all statements for all transactions)." +"Use a value between 0.0 (never log) and 1.0 (log all statements for all " +"transactions)." msgstr "" -"Записываться будут все операторы заданной доли транзакций. Значение 0.0 " -"означает — не записывать никакие транзакции, а значение 1.0 — записывать все " -"операторы всех транзакций." +"Значение 0.0 означает — не записывать никакие транзакции, а значение 1.0 — " +"записывать все операторы всех транзакций." -#: utils/misc/guc.c:3675 +#: utils/misc/guc.c:3823 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "Задаёт команду оболочки, вызываемую для архивации файла WAL." -#: utils/misc/guc.c:3685 +#: utils/misc/guc.c:3833 msgid "" "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "" "Задаёт команду оболочки, которая будет вызываться для извлечения из архива " "файла WAL." -#: utils/misc/guc.c:3695 +#: utils/misc/guc.c:3843 msgid "Sets the shell command that will be executed at every restart point." msgstr "" "Задаёт команду оболочки, которая будет выполняться при каждой точке " "перезапуска." -#: utils/misc/guc.c:3705 +#: utils/misc/guc.c:3853 msgid "" "Sets the shell command that will be executed once at the end of recovery." msgstr "" "Задаёт команду оболочки, которая будет выполняться в конце восстановления." -#: utils/misc/guc.c:3715 +#: utils/misc/guc.c:3863 msgid "Specifies the timeline to recover into." msgstr "Указывает линию времени для выполнения восстановления." -#: utils/misc/guc.c:3725 +#: utils/misc/guc.c:3873 msgid "" "Set to \"immediate\" to end recovery as soon as a consistent state is " "reached." @@ -29015,24 +30170,24 @@ msgstr "" "Задайте значение \"immediate\", чтобы восстановление остановилось сразу " "после достижения согласованного состояния." -#: utils/misc/guc.c:3734 +#: utils/misc/guc.c:3882 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "" "Задаёт идентификатор транзакции, вплоть до которой будет производиться " "восстановление." -#: utils/misc/guc.c:3743 +#: utils/misc/guc.c:3891 msgid "Sets the time stamp up to which recovery will proceed." msgstr "" "Задаёт момент времени, вплоть до которого будет производиться восстановление." -#: utils/misc/guc.c:3752 +#: utils/misc/guc.c:3900 msgid "Sets the named restore point up to which recovery will proceed." msgstr "" "Задаёт именованную точку восстановления, до которой будет производиться " "восстановление." -#: utils/misc/guc.c:3761 +#: utils/misc/guc.c:3909 msgid "" "Sets the LSN of the write-ahead log location up to which recovery will " "proceed." @@ -29040,71 +30195,71 @@ msgstr "" "Задаёт в виде LSN позицию в журнале предзаписи, до которой будет " "производиться восстановление." -#: utils/misc/guc.c:3771 +#: utils/misc/guc.c:3919 msgid "Specifies a file name whose presence ends recovery in the standby." msgstr "" "Задаёт имя файла, присутствие которого выводит ведомый из режима " "восстановления." -#: utils/misc/guc.c:3781 +#: utils/misc/guc.c:3929 msgid "Sets the connection string to be used to connect to the sending server." msgstr "" "Задаёт строку соединения, которая будет использоваться для подключения к " "передающему серверу." -#: utils/misc/guc.c:3792 +#: utils/misc/guc.c:3940 msgid "Sets the name of the replication slot to use on the sending server." msgstr "" "Задаёт имя слота репликации, который будет использоваться на передающем " "сервере." -#: utils/misc/guc.c:3802 +#: utils/misc/guc.c:3950 msgid "Sets the client's character set encoding." msgstr "Задаёт кодировку символов, используемую клиентом." -#: utils/misc/guc.c:3813 +#: utils/misc/guc.c:3961 msgid "Controls information prefixed to each log line." msgstr "Определяет содержимое префикса каждой строки протокола." -#: utils/misc/guc.c:3814 +#: utils/misc/guc.c:3962 msgid "If blank, no prefix is used." msgstr "При пустом значении префикс также отсутствует." -#: utils/misc/guc.c:3823 +#: utils/misc/guc.c:3971 msgid "Sets the time zone to use in log messages." msgstr "Задаёт часовой пояс для вывода времени в сообщениях протокола." -#: utils/misc/guc.c:3833 +#: utils/misc/guc.c:3981 msgid "Sets the display format for date and time values." msgstr "Устанавливает формат вывода дат и времени." -#: utils/misc/guc.c:3834 +#: utils/misc/guc.c:3982 msgid "Also controls interpretation of ambiguous date inputs." msgstr "Также помогает разбирать неоднозначно заданные вводимые даты." -#: utils/misc/guc.c:3845 +#: utils/misc/guc.c:3993 msgid "Sets the default table access method for new tables." msgstr "Задаёт табличный метод доступа по умолчанию для новых таблиц." -#: utils/misc/guc.c:3856 +#: utils/misc/guc.c:4004 msgid "Sets the default tablespace to create tables and indexes in." msgstr "" "Задаёт табличное пространство по умолчанию для новых таблиц и индексов." -#: utils/misc/guc.c:3857 +#: utils/misc/guc.c:4005 msgid "An empty string selects the database's default tablespace." msgstr "При пустом значении используется табличное пространство базы данных." -#: utils/misc/guc.c:3867 +#: utils/misc/guc.c:4015 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "" "Задаёт табличное пространство(а) для временных таблиц и файлов сортировки." -#: utils/misc/guc.c:3878 +#: utils/misc/guc.c:4026 msgid "Sets the path for dynamically loadable modules." msgstr "Задаёт путь для динамически загружаемых модулей." -#: utils/misc/guc.c:3879 +#: utils/misc/guc.c:4027 msgid "" "If a dynamically loadable module needs to be opened and the specified name " "does not have a directory component (i.e., the name does not contain a " @@ -29114,79 +30269,79 @@ msgstr "" "указан путь (нет символа '/'), система будет искать этот файл в заданном " "пути." -#: utils/misc/guc.c:3892 +#: utils/misc/guc.c:4040 msgid "Sets the location of the Kerberos server key file." msgstr "Задаёт размещение файла с ключом Kerberos для данного сервера." -#: utils/misc/guc.c:3903 +#: utils/misc/guc.c:4051 msgid "Sets the Bonjour service name." msgstr "Задаёт название службы Bonjour." -#: utils/misc/guc.c:3915 +#: utils/misc/guc.c:4063 msgid "Shows the collation order locale." msgstr "Показывает правило сортировки." -#: utils/misc/guc.c:3926 +#: utils/misc/guc.c:4074 msgid "Shows the character classification and case conversion locale." msgstr "Показывает правило классификации символов и преобразования регистра." -#: utils/misc/guc.c:3937 +#: utils/misc/guc.c:4085 msgid "Sets the language in which messages are displayed." msgstr "Задаёт язык выводимых сообщений." -#: utils/misc/guc.c:3947 +#: utils/misc/guc.c:4095 msgid "Sets the locale for formatting monetary amounts." msgstr "Задаёт локаль для форматирования денежных сумм." -#: utils/misc/guc.c:3957 +#: utils/misc/guc.c:4105 msgid "Sets the locale for formatting numbers." msgstr "Задаёт локаль для форматирования чисел." -#: utils/misc/guc.c:3967 +#: utils/misc/guc.c:4115 msgid "Sets the locale for formatting date and time values." msgstr "Задаёт локаль для форматирования дат и времени." -#: utils/misc/guc.c:3977 +#: utils/misc/guc.c:4125 msgid "Lists shared libraries to preload into each backend." msgstr "" "Список разделяемых библиотек, заранее загружаемых в каждый обслуживающий " "процесс." -#: utils/misc/guc.c:3988 +#: utils/misc/guc.c:4136 msgid "Lists shared libraries to preload into server." msgstr "Список разделяемых библиотек, заранее загружаемых в память сервера." -#: utils/misc/guc.c:3999 +#: utils/misc/guc.c:4147 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "" "Список непривилегированных разделяемых библиотек, заранее загружаемых в " "каждый обслуживающий процесс." -#: utils/misc/guc.c:4010 +#: utils/misc/guc.c:4158 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "Задаёт порядок просмотра схемы при поиске неполных имён." -#: utils/misc/guc.c:4022 -msgid "Sets the server (database) character set encoding." -msgstr "Задаёт кодировку символов сервера (баз данных)." +#: utils/misc/guc.c:4170 +msgid "Shows the server (database) character set encoding." +msgstr "Показывает кодировку символов сервера (базы данных)." -#: utils/misc/guc.c:4034 +#: utils/misc/guc.c:4182 msgid "Shows the server version." msgstr "Показывает версию сервера." -#: utils/misc/guc.c:4046 +#: utils/misc/guc.c:4194 msgid "Sets the current role." msgstr "Задаёт текущую роль." -#: utils/misc/guc.c:4058 +#: utils/misc/guc.c:4206 msgid "Sets the session user name." msgstr "Задаёт имя пользователя в сеансе." -#: utils/misc/guc.c:4069 +#: utils/misc/guc.c:4217 msgid "Sets the destination for server log output." msgstr "Определяет, куда будет выводиться протокол сервера." -#: utils/misc/guc.c:4070 +#: utils/misc/guc.c:4218 msgid "" "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and " "\"eventlog\", depending on the platform." @@ -29194,24 +30349,24 @@ msgstr "" "Значение может включать сочетание слов \"stderr\", \"syslog\", \"csvlog\" и " "\"eventlog\", в зависимости от платформы." -#: utils/misc/guc.c:4081 +#: utils/misc/guc.c:4229 msgid "Sets the destination directory for log files." msgstr "Задаёт целевой каталог для файлов протоколов." -#: utils/misc/guc.c:4082 +#: utils/misc/guc.c:4230 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "" "Путь может быть абсолютным или указываться относительно каталога данных." -#: utils/misc/guc.c:4092 +#: utils/misc/guc.c:4240 msgid "Sets the file name pattern for log files." msgstr "Задаёт шаблон имени для файлов протоколов." -#: utils/misc/guc.c:4103 +#: utils/misc/guc.c:4251 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "Задаёт имя программы для идентификации сообщений PostgreSQL в syslog." -#: utils/misc/guc.c:4114 +#: utils/misc/guc.c:4262 msgid "" "Sets the application name used to identify PostgreSQL messages in the event " "log." @@ -29219,121 +30374,125 @@ msgstr "" "Задаёт имя приложения для идентификации сообщений PostgreSQL в журнале " "событий." -#: utils/misc/guc.c:4125 +#: utils/misc/guc.c:4273 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "" "Задаёт часовой пояс для вывода и разбора строкового представления времени." -#: utils/misc/guc.c:4135 +#: utils/misc/guc.c:4283 msgid "Selects a file of time zone abbreviations." msgstr "Выбирает файл с сокращёнными названиями часовых поясов." -#: utils/misc/guc.c:4145 +#: utils/misc/guc.c:4293 msgid "Sets the owning group of the Unix-domain socket." msgstr "Задаёт группу-владельца Unix-сокета." -#: utils/misc/guc.c:4146 +#: utils/misc/guc.c:4294 msgid "" "The owning user of the socket is always the user that starts the server." msgstr "" "Собственно владельцем сокета всегда будет пользователь, запускающий сервер." -#: utils/misc/guc.c:4156 +#: utils/misc/guc.c:4304 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Задаёт каталоги, где будут создаваться Unix-сокеты." -#: utils/misc/guc.c:4171 +#: utils/misc/guc.c:4319 msgid "Sets the host name or IP address(es) to listen to." msgstr "Задаёт имя узла или IP-адрес(а) для привязки." -#: utils/misc/guc.c:4186 +#: utils/misc/guc.c:4334 msgid "Sets the server's data directory." msgstr "Определяет каталог данных сервера." -#: utils/misc/guc.c:4197 +#: utils/misc/guc.c:4345 msgid "Sets the server's main configuration file." msgstr "Определяет основной файл конфигурации сервера." -#: utils/misc/guc.c:4208 +#: utils/misc/guc.c:4356 msgid "Sets the server's \"hba\" configuration file." msgstr "Задаёт путь к файлу конфигурации \"hba\"." -#: utils/misc/guc.c:4219 +#: utils/misc/guc.c:4367 msgid "Sets the server's \"ident\" configuration file." msgstr "Задаёт путь к файлу конфигурации \"ident\"." -#: utils/misc/guc.c:4230 +#: utils/misc/guc.c:4378 msgid "Writes the postmaster PID to the specified file." msgstr "Файл, в который будет записан код процесса postmaster." -#: utils/misc/guc.c:4241 -msgid "Name of the SSL library." -msgstr "Имя библиотеки SSL." +#: utils/misc/guc.c:4389 +msgid "Shows the name of the SSL library." +msgstr "Показывает имя библиотеки SSL." -#: utils/misc/guc.c:4256 +#: utils/misc/guc.c:4404 msgid "Location of the SSL server certificate file." msgstr "Размещение файла сертификата сервера для SSL." -#: utils/misc/guc.c:4266 +#: utils/misc/guc.c:4414 msgid "Location of the SSL server private key file." msgstr "Размещение файла с закрытым ключом сервера для SSL." -#: utils/misc/guc.c:4276 +#: utils/misc/guc.c:4424 msgid "Location of the SSL certificate authority file." msgstr "Размещение файла центра сертификации для SSL." -#: utils/misc/guc.c:4286 +#: utils/misc/guc.c:4434 msgid "Location of the SSL certificate revocation list file." msgstr "Размещение файла со списком отзыва сертификатов для SSL." -#: utils/misc/guc.c:4296 +#: utils/misc/guc.c:4444 +msgid "Location of the SSL certificate revocation list directory." +msgstr "Размещение каталога со списками отзыва сертификатов для SSL." + +#: utils/misc/guc.c:4454 msgid "Writes temporary statistics files to the specified directory." msgstr "Каталог, в который будут записываться временные файлы статистики." -#: utils/misc/guc.c:4307 +#: utils/misc/guc.c:4465 msgid "" "Number of synchronous standbys and list of names of potential synchronous " "ones." msgstr "" "Количество потенциально синхронных резервных серверов и список их имён." -#: utils/misc/guc.c:4318 +#: utils/misc/guc.c:4476 msgid "Sets default text search configuration." msgstr "Задаёт конфигурацию текстового поиска по умолчанию." -#: utils/misc/guc.c:4328 +#: utils/misc/guc.c:4486 msgid "Sets the list of allowed SSL ciphers." msgstr "Задаёт список допустимых алгоритмов шифрования для SSL." -#: utils/misc/guc.c:4343 +#: utils/misc/guc.c:4501 msgid "Sets the curve to use for ECDH." msgstr "Задаёт кривую для ECDH." -#: utils/misc/guc.c:4358 +#: utils/misc/guc.c:4516 msgid "Location of the SSL DH parameters file." msgstr "Размещение файла с параметрами SSL DH." -#: utils/misc/guc.c:4369 +#: utils/misc/guc.c:4527 msgid "Command to obtain passphrases for SSL." msgstr "Команда, позволяющая получить пароль для SSL." -#: utils/misc/guc.c:4380 +#: utils/misc/guc.c:4538 msgid "Sets the application name to be reported in statistics and logs." msgstr "" "Задаёт имя приложения, которое будет выводиться в статистике и протоколах." -#: utils/misc/guc.c:4391 +#: utils/misc/guc.c:4549 msgid "Sets the name of the cluster, which is included in the process title." msgstr "Задаёт имя кластера, которое будет добавляться в название процесса." -#: utils/misc/guc.c:4402 +#: utils/misc/guc.c:4560 msgid "" "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "" "Задаёт перечень менеджеров ресурсов WAL, для которых выполняются проверки " "целостности WAL." -#: utils/misc/guc.c:4403 +#: utils/misc/guc.c:4561 msgid "" "Full-page images will be logged for all data blocks and cross-checked " "against the results of WAL replay." @@ -29341,28 +30500,28 @@ msgstr "" "При этом в журнал будут записываться образы полных страниц для всех блоков " "данных для сверки с результатами воспроизведения WAL." -#: utils/misc/guc.c:4413 +#: utils/misc/guc.c:4571 msgid "JIT provider to use." msgstr "Используемый провайдер JIT." -#: utils/misc/guc.c:4424 +#: utils/misc/guc.c:4582 msgid "Log backtrace for errors in these functions." msgstr "Записывать в журнал стек в случае ошибок в перечисленных функциях." -#: utils/misc/guc.c:4444 +#: utils/misc/guc.c:4602 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Определяет, можно ли использовать \"\\'\" в текстовых строках." -#: utils/misc/guc.c:4454 +#: utils/misc/guc.c:4612 msgid "Sets the output format for bytea." msgstr "Задаёт формат вывода данных типа bytea." -#: utils/misc/guc.c:4464 +#: utils/misc/guc.c:4622 msgid "Sets the message levels that are sent to the client." msgstr "Ограничивает уровень сообщений, передаваемых клиенту." -#: utils/misc/guc.c:4465 utils/misc/guc.c:4530 utils/misc/guc.c:4541 -#: utils/misc/guc.c:4617 +#: utils/misc/guc.c:4623 utils/misc/guc.c:4709 utils/misc/guc.c:4720 +#: utils/misc/guc.c:4796 msgid "" "Each level includes all the levels that follow it. The later the level, the " "fewer messages are sent." @@ -29370,12 +30529,16 @@ msgstr "" "Каждый уровень включает все последующие. Чем выше уровень, тем меньше " "сообщений." -#: utils/misc/guc.c:4475 +#: utils/misc/guc.c:4633 +msgid "Compute query identifiers." +msgstr "Вычислять идентификаторы запросов." + +#: utils/misc/guc.c:4643 msgid "Enables the planner to use constraints to optimize queries." msgstr "" "Разрешает планировщику оптимизировать запросы, полагаясь на ограничения." -#: utils/misc/guc.c:4476 +#: utils/misc/guc.c:4644 msgid "" "Table scans will be skipped if their constraints guarantee that no rows " "match the query." @@ -29383,77 +30546,81 @@ msgstr "" "Сканирование таблицы не будет выполняться, если её ограничения гарантируют, " "что запросу не удовлетворяют никакие строки." -#: utils/misc/guc.c:4487 +#: utils/misc/guc.c:4655 +msgid "Sets the default compression method for compressible values." +msgstr "Задаёт выбираемый по умолчанию метод сжатия для сжимаемых значений." + +#: utils/misc/guc.c:4666 msgid "Sets the transaction isolation level of each new transaction." msgstr "Задаёт уровень изоляции транзакций для новых транзакций." -#: utils/misc/guc.c:4497 +#: utils/misc/guc.c:4676 msgid "Sets the current transaction's isolation level." msgstr "Задаёт текущий уровень изоляции транзакций." -#: utils/misc/guc.c:4508 +#: utils/misc/guc.c:4687 msgid "Sets the display format for interval values." msgstr "Задаёт формат отображения для внутренних значений." -#: utils/misc/guc.c:4519 +#: utils/misc/guc.c:4698 msgid "Sets the verbosity of logged messages." msgstr "Задаёт детализацию протоколируемых сообщений." -#: utils/misc/guc.c:4529 +#: utils/misc/guc.c:4708 msgid "Sets the message levels that are logged." msgstr "Ограничивает уровни протоколируемых сообщений." -#: utils/misc/guc.c:4540 +#: utils/misc/guc.c:4719 msgid "" "Causes all statements generating error at or above this level to be logged." msgstr "" "Включает протоколирование для SQL-операторов, выполненных с ошибкой этого " "или большего уровня." -#: utils/misc/guc.c:4551 +#: utils/misc/guc.c:4730 msgid "Sets the type of statements logged." msgstr "Задаёт тип протоколируемых операторов." -#: utils/misc/guc.c:4561 +#: utils/misc/guc.c:4740 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "Задаёт получателя сообщений, отправляемых в syslog." -#: utils/misc/guc.c:4576 +#: utils/misc/guc.c:4755 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "" "Задаёт режим срабатывания триггеров и правил перезаписи для текущего сеанса." -#: utils/misc/guc.c:4586 +#: utils/misc/guc.c:4765 msgid "Sets the current transaction's synchronization level." msgstr "Задаёт уровень синхронизации текущей транзакции." -#: utils/misc/guc.c:4596 +#: utils/misc/guc.c:4775 msgid "Allows archiving of WAL files using archive_command." msgstr "Разрешает архивацию файлов WAL командой archive_command." -#: utils/misc/guc.c:4606 +#: utils/misc/guc.c:4785 msgid "Sets the action to perform upon reaching the recovery target." msgstr "" "Задаёт действие, которое будет выполняться по достижении цели восстановления." -#: utils/misc/guc.c:4616 +#: utils/misc/guc.c:4795 msgid "Enables logging of recovery-related debugging information." msgstr "" "Включает протоколирование отладочной информации, связанной с репликацией." -#: utils/misc/guc.c:4632 +#: utils/misc/guc.c:4811 msgid "Collects function-level statistics on database activity." msgstr "Включает сбор статистики активности в БД на уровне функций." -#: utils/misc/guc.c:4642 -msgid "Set the level of information written to the WAL." +#: utils/misc/guc.c:4821 +msgid "Sets the level of information written to the WAL." msgstr "Задаёт уровень информации, записываемой в WAL." -#: utils/misc/guc.c:4652 +#: utils/misc/guc.c:4831 msgid "Selects the dynamic shared memory implementation used." msgstr "Выбирает используемую реализацию динамической разделяемой памяти." -#: utils/misc/guc.c:4662 +#: utils/misc/guc.c:4841 msgid "" "Selects the shared memory implementation used for the main shared memory " "region." @@ -29461,15 +30628,15 @@ msgstr "" "Выбирает реализацию разделяемой памяти для управления основным блоком " "разделяемой памяти." -#: utils/misc/guc.c:4672 +#: utils/misc/guc.c:4851 msgid "Selects the method used for forcing WAL updates to disk." msgstr "Выбирает метод принудительной записи изменений в WAL на диск." -#: utils/misc/guc.c:4682 +#: utils/misc/guc.c:4861 msgid "Sets how binary values are to be encoded in XML." msgstr "Определяет, как должны кодироваться двоичные значения в XML." -#: utils/misc/guc.c:4692 +#: utils/misc/guc.c:4871 msgid "" "Sets whether XML data in implicit parsing and serialization operations is to " "be considered as documents or content fragments." @@ -29477,15 +30644,15 @@ msgstr "" "Определяет, следует ли рассматривать XML-данные в неявных операциях разбора " "и сериализации как документы или как фрагменты содержания." -#: utils/misc/guc.c:4703 +#: utils/misc/guc.c:4882 msgid "Use of huge pages on Linux or Windows." -msgstr "Включает использование гигантских страниц в Linux и в Windows." +msgstr "Включает использование огромных страниц в Linux и в Windows." -#: utils/misc/guc.c:4713 +#: utils/misc/guc.c:4892 msgid "Forces use of parallel query facilities." msgstr "Принудительно включает режим параллельного выполнения запросов." -#: utils/misc/guc.c:4714 +#: utils/misc/guc.c:4893 msgid "" "If possible, run query using a parallel worker and with parallel " "restrictions." @@ -29493,15 +30660,15 @@ msgstr "" "Если возможно, запрос выполняется параллельными исполнителями и с " "ограничениями параллельности." -#: utils/misc/guc.c:4724 +#: utils/misc/guc.c:4903 msgid "Chooses the algorithm for encrypting passwords." msgstr "Выбирает алгоритм шифрования паролей." -#: utils/misc/guc.c:4734 +#: utils/misc/guc.c:4913 msgid "Controls the planner's selection of custom or generic plan." msgstr "Управляет выбором специализированных или общих планов планировщиком." -#: utils/misc/guc.c:4735 +#: utils/misc/guc.c:4914 msgid "" "Prepared statements can have custom and generic plans, and the planner will " "attempt to choose which is better. This can be set to override the default " @@ -29511,22 +30678,47 @@ msgstr "" "планы, и планировщик пытается выбрать лучший вариант. Этот параметр " "позволяет переопределить поведение по умолчанию." -#: utils/misc/guc.c:4747 +#: utils/misc/guc.c:4926 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "" "Задаёт минимальную версию протокола SSL/TLS, которая может использоваться." -#: utils/misc/guc.c:4759 +#: utils/misc/guc.c:4938 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "" "Задаёт максимальную версию протокола SSL/TLS, которая может использоваться." -#: utils/misc/guc.c:5562 +#: utils/misc/guc.c:4950 +msgid "" +"Sets the method for synchronizing the data directory before crash recovery." +msgstr "" +"Задаёт метод синхронизации каталога данных перед восстановления после сбоя." + +#: utils/misc/guc.c:5519 +#, c-format +msgid "invalid configuration parameter name \"%s\"" +msgstr "неверное имя параметра конфигурации: \"%s\"" + +#: utils/misc/guc.c:5521 +#, c-format +msgid "" +"Custom parameter names must be two or more simple identifiers separated by " +"dots." +msgstr "" +"Имена нестандартных параметров должны состоять из двух или более простых " +"идентификаторов, разделённых точками." + +#: utils/misc/guc.c:5530 utils/misc/guc.c:9289 +#, c-format +msgid "unrecognized configuration parameter \"%s\"" +msgstr "нераспознанный параметр конфигурации: \"%s\"" + +#: utils/misc/guc.c:5823 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s: ошибка доступа к каталогу \"%s\": %s\n" -#: utils/misc/guc.c:5567 +#: utils/misc/guc.c:5828 #, c-format msgid "" "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" @@ -29534,7 +30726,7 @@ msgstr "" "Запустите initdb или pg_basebackup для инициализации каталога данных " "PostgreSQL.\n" -#: utils/misc/guc.c:5587 +#: utils/misc/guc.c:5848 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -29545,12 +30737,12 @@ msgstr "" "Вы должны указать его расположение в параметре --config-file или -D, либо " "установить переменную окружения PGDATA.\n" -#: utils/misc/guc.c:5606 +#: utils/misc/guc.c:5867 #, c-format msgid "%s: could not access the server configuration file \"%s\": %s\n" msgstr "%s не может открыть файл конфигурации сервера \"%s\": %s\n" -#: utils/misc/guc.c:5632 +#: utils/misc/guc.c:5893 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -29561,7 +30753,7 @@ msgstr "" "Их расположение можно задать как значение \"data_directory\" в файле \"%s\", " "либо передать в параметре -D, либо установить переменную окружения PGDATA.\n" -#: utils/misc/guc.c:5680 +#: utils/misc/guc.c:5941 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -29572,7 +30764,7 @@ msgstr "" "Его расположение можно задать как значение \"hba_file\" в файле \"%s\", либо " "передать в параметре -D, либо установить переменную окружения PGDATA.\n" -#: utils/misc/guc.c:5703 +#: utils/misc/guc.c:5964 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -29583,134 +30775,127 @@ msgstr "" "Его расположение можно задать как значение \"ident_file\" в файле \"%s\", " "либо передать в параметре -D, либо установить переменную окружения PGDATA.\n" -#: utils/misc/guc.c:6545 +#: utils/misc/guc.c:6889 msgid "Value exceeds integer range." msgstr "Значение выходит за рамки целых чисел." -#: utils/misc/guc.c:6781 +#: utils/misc/guc.c:7125 #, c-format msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d%s%s вне диапазона, допустимого для параметра \"%s\" (%d .. %d)" -#: utils/misc/guc.c:6817 +#: utils/misc/guc.c:7161 #, c-format msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" msgstr "%g%s%s вне диапазона, допустимого для параметра \"%s\" (%g .. %g)" -#: utils/misc/guc.c:6973 utils/misc/guc.c:8368 +#: utils/misc/guc.c:7321 utils/misc/guc.c:8693 #, c-format msgid "cannot set parameters during a parallel operation" msgstr "устанавливать параметры во время параллельных операций нельзя" -#: utils/misc/guc.c:6980 utils/misc/guc.c:7760 utils/misc/guc.c:7813 -#: utils/misc/guc.c:7864 utils/misc/guc.c:8197 utils/misc/guc.c:8964 -#: utils/misc/guc.c:9226 utils/misc/guc.c:10892 -#, c-format -msgid "unrecognized configuration parameter \"%s\"" -msgstr "нераспознанный параметр конфигурации: \"%s\"" - -#: utils/misc/guc.c:6995 utils/misc/guc.c:8209 +#: utils/misc/guc.c:7338 utils/misc/guc.c:8534 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "параметр \"%s\" нельзя изменить" -#: utils/misc/guc.c:7018 utils/misc/guc.c:7216 utils/misc/guc.c:7310 -#: utils/misc/guc.c:7404 utils/misc/guc.c:7524 utils/misc/guc.c:7623 -#: guc-file.l:352 +#: utils/misc/guc.c:7361 utils/misc/guc.c:7559 utils/misc/guc.c:7653 +#: utils/misc/guc.c:7747 utils/misc/guc.c:7867 utils/misc/guc.c:7966 +#: guc-file.l:353 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "параметр \"%s\" изменяется только при перезапуске сервера" -#: utils/misc/guc.c:7028 +#: utils/misc/guc.c:7371 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "параметр \"%s\" нельзя изменить сейчас" -#: utils/misc/guc.c:7046 utils/misc/guc.c:7093 utils/misc/guc.c:10908 +#: utils/misc/guc.c:7389 utils/misc/guc.c:7436 utils/misc/guc.c:11334 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "нет прав для изменения параметра \"%s\"" -#: utils/misc/guc.c:7083 +#: utils/misc/guc.c:7426 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "параметр \"%s\" нельзя задать после установления соединения" -#: utils/misc/guc.c:7131 +#: utils/misc/guc.c:7474 #, c-format msgid "cannot set parameter \"%s\" within security-definer function" msgstr "" "параметр \"%s\" нельзя задать в функции с контекстом безопасности " "определившего" -#: utils/misc/guc.c:7768 utils/misc/guc.c:7818 utils/misc/guc.c:9233 +#: utils/misc/guc.c:8107 utils/misc/guc.c:8154 utils/misc/guc.c:9551 #, c-format msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" msgstr "" "прочитать \"%s\" может только суперпользователь или член роли " "pg_read_all_settings" -#: utils/misc/guc.c:7909 +#: utils/misc/guc.c:8238 #, c-format msgid "SET %s takes only one argument" msgstr "SET %s принимает только один аргумент" -#: utils/misc/guc.c:8157 +#: utils/misc/guc.c:8486 #, c-format msgid "must be superuser to execute ALTER SYSTEM command" msgstr "выполнить команду ALTER SYSTEM может только суперпользователь" -#: utils/misc/guc.c:8242 +#: utils/misc/guc.c:8567 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "значение параметра для ALTER SYSTEM не должно быть многострочным" -#: utils/misc/guc.c:8287 +#: utils/misc/guc.c:8612 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "не удалось разобрать содержимое файла \"%s\"" -#: utils/misc/guc.c:8444 +#: utils/misc/guc.c:8769 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOT не реализовано" -#: utils/misc/guc.c:8528 +#: utils/misc/guc.c:8853 #, c-format msgid "SET requires parameter name" msgstr "SET требует имя параметра" -#: utils/misc/guc.c:8661 +#: utils/misc/guc.c:8986 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "попытка переопределить параметр \"%s\"" -#: utils/misc/guc.c:10454 +#: utils/misc/guc.c:10781 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "при назначении параметру \"%s\" значения \"%s\"" -#: utils/misc/guc.c:10522 +#: utils/misc/guc.c:10946 #, c-format msgid "parameter \"%s\" could not be set" msgstr "параметр \"%s\" нельзя установить" -#: utils/misc/guc.c:10612 +#: utils/misc/guc.c:11038 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "не удалось разобрать значение параметра \"%s\"" -#: utils/misc/guc.c:10970 utils/misc/guc.c:11004 +#: utils/misc/guc.c:11396 utils/misc/guc.c:11430 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "неверное значение параметра \"%s\": %d" -#: utils/misc/guc.c:11038 +#: utils/misc/guc.c:11464 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "неверное значение параметра \"%s\": %g" -#: utils/misc/guc.c:11308 +#: utils/misc/guc.c:11751 #, c-format msgid "" "\"temp_buffers\" cannot be changed after any temporary tables have been " @@ -29719,23 +30904,23 @@ msgstr "" "параметр \"temp_buffers\" нельзя изменить после обращения к временным " "таблицам в текущем сеансе." -#: utils/misc/guc.c:11320 +#: utils/misc/guc.c:11763 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour не поддерживается в данной сборке" -#: utils/misc/guc.c:11333 +#: utils/misc/guc.c:11776 #, c-format msgid "SSL is not supported by this build" msgstr "SSL не поддерживается в данной сборке" -#: utils/misc/guc.c:11345 +#: utils/misc/guc.c:11788 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "" "Этот параметр нельзя включить, когда \"log_statement_stats\" равен true." -#: utils/misc/guc.c:11357 +#: utils/misc/guc.c:11800 #, c-format msgid "" "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", " @@ -29744,7 +30929,7 @@ msgstr "" "Параметр \"log_statement_stats\" нельзя включить, когда \"log_parser_stats" "\", \"log_planner_stats\" или \"log_executor_stats\" равны true." -#: utils/misc/guc.c:11587 +#: utils/misc/guc.c:12030 #, c-format msgid "" "effective_io_concurrency must be set to 0 on platforms that lack " @@ -29753,7 +30938,7 @@ msgstr "" "Значение effective_io_concurrency должно равняться 0 на платформах, где " "отсутствует lack posix_fadvise()." -#: utils/misc/guc.c:11600 +#: utils/misc/guc.c:12043 #, c-format msgid "" "maintenance_io_concurrency must be set to 0 on platforms that lack " @@ -29762,22 +30947,36 @@ msgstr "" "Значение maintenance_io_concurrency должно равняться 0 на платформах, где " "отсутствует lack posix_fadvise()." -#: utils/misc/guc.c:11716 +#: utils/misc/guc.c:12057 +#, c-format +msgid "huge_page_size must be 0 on this platform." +msgstr "Значение huge_page_size должно равняться 0 на этой платформе." + +#: utils/misc/guc.c:12071 +#, c-format +msgid "" +"client_connection_check_interval must be set to 0 on platforms that lack " +"POLLRDHUP." +msgstr "" +"Значение client_connection_check_interval должно равняться 0 на платформах, " +"где отсутствует POLLRDHUP." + +#: utils/misc/guc.c:12199 #, c-format msgid "invalid character" msgstr "неверный символ" -#: utils/misc/guc.c:11776 +#: utils/misc/guc.c:12259 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timeline не является допустимым числом." -#: utils/misc/guc.c:11816 +#: utils/misc/guc.c:12299 #, c-format msgid "multiple recovery targets specified" msgstr "указано несколько целей восстановления" -#: utils/misc/guc.c:11817 +#: utils/misc/guc.c:12300 #, c-format msgid "" "At most one of recovery_target, recovery_target_lsn, recovery_target_name, " @@ -29787,7 +30986,7 @@ msgstr "" "recovery_target_lsn, recovery_target_name, recovery_target_time, " "recovery_target_xid." -#: utils/misc/guc.c:11825 +#: utils/misc/guc.c:12308 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "Единственное допустимое значение: \"immediate\"." @@ -29834,7 +31033,7 @@ msgstr "" "Чтобы отключить политику для владельца таблицы, воспользуйтесь командой " "ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/timeout.c:395 +#: utils/misc/timeout.c:484 #, c-format msgid "cannot add more timeout reasons" msgstr "добавить другие причины тайм-аута нельзя" @@ -29920,24 +31119,29 @@ msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "" "в @INCLUDE не указано имя файла (файл часовых поясов \"%s\", строка %d)" -#: utils/mmgr/aset.c:476 utils/mmgr/generation.c:234 utils/mmgr/slab.c:236 +#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:235 utils/mmgr/slab.c:237 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Ошибка при создании контекста памяти \"%s\"." -#: utils/mmgr/dsa.c:519 utils/mmgr/dsa.c:1332 +#: utils/mmgr/dsa.c:519 utils/mmgr/dsa.c:1329 #, c-format msgid "could not attach to dynamic shared area" msgstr "не удалось подключиться к динамической разделяемой области" -#: utils/mmgr/mcxt.c:822 utils/mmgr/mcxt.c:858 utils/mmgr/mcxt.c:896 -#: utils/mmgr/mcxt.c:934 utils/mmgr/mcxt.c:970 utils/mmgr/mcxt.c:1001 -#: utils/mmgr/mcxt.c:1037 utils/mmgr/mcxt.c:1089 utils/mmgr/mcxt.c:1124 -#: utils/mmgr/mcxt.c:1159 +#: utils/mmgr/mcxt.c:889 utils/mmgr/mcxt.c:925 utils/mmgr/mcxt.c:963 +#: utils/mmgr/mcxt.c:1001 utils/mmgr/mcxt.c:1089 utils/mmgr/mcxt.c:1120 +#: utils/mmgr/mcxt.c:1156 utils/mmgr/mcxt.c:1208 utils/mmgr/mcxt.c:1243 +#: utils/mmgr/mcxt.c:1278 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "Ошибка при запросе блока размером %zu в контексте памяти \"%s\"." +#: utils/mmgr/mcxt.c:1052 +#, c-format +msgid "logging memory contexts of PID %d" +msgstr "вывод информации о памяти процесса с PID %d" + #: utils/mmgr/portalmem.c:187 #, c-format msgid "cursor \"%s\" already exists" @@ -29948,27 +31152,27 @@ msgstr "курсор \"%s\" уже существует" msgid "closing existing cursor \"%s\"" msgstr "существующий курсор (\"%s\") закрывается" -#: utils/mmgr/portalmem.c:400 +#: utils/mmgr/portalmem.c:401 #, c-format msgid "portal \"%s\" cannot be run" msgstr "портал \"%s\" не может быть запущен" -#: utils/mmgr/portalmem.c:478 +#: utils/mmgr/portalmem.c:479 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "удалить закреплённый портал \"%s\" нельзя" -#: utils/mmgr/portalmem.c:486 +#: utils/mmgr/portalmem.c:487 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "удалить активный портал \"%s\" нельзя" -#: utils/mmgr/portalmem.c:731 +#: utils/mmgr/portalmem.c:738 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "нельзя выполнить PREPARE для транзакции, создавшей курсор WITH HOLD" -#: utils/mmgr/portalmem.c:1270 +#: utils/mmgr/portalmem.c:1279 #, c-format msgid "" "cannot perform transaction commands inside a cursor loop that is not read-" @@ -29977,12 +31181,12 @@ msgstr "" "транзакционные команды нельзя выполнять внутри цикла с курсором, " "производящим изменения" -#: utils/sort/logtape.c:266 utils/sort/logtape.c:289 +#: utils/sort/logtape.c:268 utils/sort/logtape.c:291 #, c-format msgid "could not seek to block %ld of temporary file" msgstr "не удалось переместиться к блоку %ld временного файла" -#: utils/sort/logtape.c:295 +#: utils/sort/logtape.c:297 #, c-format msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" msgstr "" @@ -30016,22 +31220,22 @@ msgstr "" "не удалось прочитать файл общего временного хранилища кортежей (прочитано " "байт: %zu из %zu)" -#: utils/sort/tuplesort.c:3140 +#: utils/sort/tuplesort.c:3216 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "число потоков данных для внешней сортировки не может превышать %d" -#: utils/sort/tuplesort.c:4221 +#: utils/sort/tuplesort.c:4297 #, c-format msgid "could not create unique index \"%s\"" msgstr "создать уникальный индекс \"%s\" не удалось" -#: utils/sort/tuplesort.c:4223 +#: utils/sort/tuplesort.c:4299 #, c-format msgid "Key %s is duplicated." msgstr "Ключ %s дублируется." -#: utils/sort/tuplesort.c:4224 +#: utils/sort/tuplesort.c:4300 #, c-format msgid "Duplicate keys exist." msgstr "Данные содержат дублирующиеся ключи." @@ -30054,32 +31258,32 @@ msgstr "" "не удалось прочитать временный файл хранилища кортежей (прочитано байт: %zu " "из %zu)" -#: utils/time/snapmgr.c:624 +#: utils/time/snapmgr.c:568 #, c-format msgid "The source transaction is not running anymore." msgstr "Исходная транзакция уже не выполняется." -#: utils/time/snapmgr.c:1232 +#: utils/time/snapmgr.c:1162 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "экспортировать снимок из вложенной транзакции нельзя" -#: utils/time/snapmgr.c:1391 utils/time/snapmgr.c:1396 -#: utils/time/snapmgr.c:1401 utils/time/snapmgr.c:1416 -#: utils/time/snapmgr.c:1421 utils/time/snapmgr.c:1426 -#: utils/time/snapmgr.c:1441 utils/time/snapmgr.c:1446 -#: utils/time/snapmgr.c:1451 utils/time/snapmgr.c:1553 -#: utils/time/snapmgr.c:1569 utils/time/snapmgr.c:1594 +#: utils/time/snapmgr.c:1321 utils/time/snapmgr.c:1326 +#: utils/time/snapmgr.c:1331 utils/time/snapmgr.c:1346 +#: utils/time/snapmgr.c:1351 utils/time/snapmgr.c:1356 +#: utils/time/snapmgr.c:1371 utils/time/snapmgr.c:1376 +#: utils/time/snapmgr.c:1381 utils/time/snapmgr.c:1483 +#: utils/time/snapmgr.c:1499 utils/time/snapmgr.c:1524 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "неверные данные снимка в файле \"%s\"" -#: utils/time/snapmgr.c:1488 +#: utils/time/snapmgr.c:1418 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "команда SET TRANSACTION SNAPSHOT должна выполняться до запросов" -#: utils/time/snapmgr.c:1497 +#: utils/time/snapmgr.c:1427 #, c-format msgid "" "a snapshot-importing transaction must have isolation level SERIALIZABLE or " @@ -30088,12 +31292,12 @@ msgstr "" "транзакция, импортирующая снимок, должна иметь уровень изоляции SERIALIZABLE " "или REPEATABLE READ" -#: utils/time/snapmgr.c:1506 utils/time/snapmgr.c:1515 +#: utils/time/snapmgr.c:1436 utils/time/snapmgr.c:1445 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "неверный идентификатор снимка: \"%s\"" -#: utils/time/snapmgr.c:1607 +#: utils/time/snapmgr.c:1537 #, c-format msgid "" "a serializable transaction cannot import a snapshot from a non-serializable " @@ -30101,7 +31305,7 @@ msgid "" msgstr "" "сериализуемая транзакция не может импортировать снимок из не сериализуемой" -#: utils/time/snapmgr.c:1611 +#: utils/time/snapmgr.c:1541 #, c-format msgid "" "a non-read-only serializable transaction cannot import a snapshot from a " @@ -30110,289 +31314,299 @@ msgstr "" "сериализуемая транзакция в режиме \"чтение-запись\" не может импортировать " "снимок из транзакции в режиме \"только чтение\"" -#: utils/time/snapmgr.c:1626 +#: utils/time/snapmgr.c:1556 #, c-format msgid "cannot import a snapshot from a different database" msgstr "нельзя импортировать снимок из другой базы данных" -#: gram.y:1047 +#: gram.y:1107 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "вариант UNENCRYPTED PASSWORD более не поддерживается" -#: gram.y:1048 +#: gram.y:1108 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "" "Удалите слово UNENCRYPTED, чтобы сохранить пароль в зашифрованном виде." -#: gram.y:1110 +#: gram.y:1170 #, c-format msgid "unrecognized role option \"%s\"" msgstr "нераспознанный параметр роли \"%s\"" -#: gram.y:1357 gram.y:1372 +#: gram.y:1417 gram.y:1432 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTS не может включать элементы схемы" -#: gram.y:1518 +#: gram.y:1578 #, c-format msgid "current database cannot be changed" msgstr "сменить текущую базу данных нельзя" -#: gram.y:1642 +#: gram.y:1702 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "" "интервал, задающий часовой пояс, должен иметь точность HOUR или HOUR TO " "MINUTE" -#: gram.y:2177 +#: gram.y:2270 #, c-format msgid "column number must be in range from 1 to %d" msgstr "номер столбца должен быть в диапазоне от 1 до %d" -#: gram.y:2709 +#: gram.y:2811 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "параметр последовательности \"%s\" здесь не поддерживается" -#: gram.y:2738 +#: gram.y:2840 #, c-format msgid "modulus for hash partition provided more than once" msgstr "модуль для хеш-секции указан неоднократно" -#: gram.y:2747 +#: gram.y:2849 #, c-format msgid "remainder for hash partition provided more than once" msgstr "остаток для хеш-секции указан неоднократно" -#: gram.y:2754 +#: gram.y:2856 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "нераспознанное указание ограничения хеш-секции \"%s\"" -#: gram.y:2762 +#: gram.y:2864 #, c-format msgid "modulus for hash partition must be specified" msgstr "необходимо указать модуль для хеш-секции" -#: gram.y:2766 +#: gram.y:2868 #, c-format msgid "remainder for hash partition must be specified" msgstr "необходимо указать остаток для хеш-секции" -#: gram.y:2967 gram.y:3000 +#: gram.y:3069 gram.y:3102 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "указания STDIN/STDOUT несовместимы с PROGRAM" -#: gram.y:2973 +#: gram.y:3075 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "предложение WHERE не допускается с COPY TO" -#: gram.y:3305 gram.y:3312 gram.y:11648 gram.y:11656 +#: gram.y:3407 gram.y:3414 gram.y:11665 gram.y:11673 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "указание GLOBAL при создании временных таблиц устарело" -#: gram.y:3552 +#: gram.y:3665 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "для генерируемого столбца должно указываться GENERATED ALWAYS" -#: gram.y:4513 +#: gram.y:4634 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM более не поддерживается" -#: gram.y:5339 +#: gram.y:5297 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "нераспознанный вариант политики безопасности строк \"%s\"" -#: gram.y:5340 +#: gram.y:5298 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "" "В настоящее время поддерживаются только политики PERMISSIVE и RESTRICTIVE." -#: gram.y:5453 +#: gram.y:5380 +#, c-format +msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" +msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER не поддерживается" + +#: gram.y:5417 msgid "duplicate trigger events specified" msgstr "события триггера повторяются" -#: gram.y:5601 +#: gram.y:5565 #, c-format msgid "conflicting constraint properties" msgstr "противоречащие характеристики ограничения" -#: gram.y:5697 +#: gram.y:5661 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "оператор CREATE ASSERTION ещё не реализован" -#: gram.y:6080 +#: gram.y:6044 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK более не требуется" -#: gram.y:6081 +#: gram.y:6045 #, c-format msgid "Update your data type." msgstr "Обновите тип данных." -#: gram.y:7832 +#: gram.y:7741 #, c-format msgid "aggregates cannot have output arguments" msgstr "у агрегатных функций не может быть выходных аргументов" -#: gram.y:10154 gram.y:10172 +#: gram.y:10128 gram.y:10146 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "" "предложение WITH CHECK OPTION не поддерживается для рекурсивных представлений" -#: gram.y:11780 +#: gram.y:11802 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "синтаксис LIMIT #,# не поддерживается" -#: gram.y:11781 +#: gram.y:11803 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "Используйте отдельные предложения LIMIT и OFFSET." -#: gram.y:12107 gram.y:12132 +#: gram.y:12141 gram.y:12166 #, c-format msgid "VALUES in FROM must have an alias" msgstr "список VALUES во FROM должен иметь псевдоним" -#: gram.y:12108 gram.y:12133 +#: gram.y:12142 gram.y:12167 #, c-format msgid "For example, FROM (VALUES ...) [AS] foo." msgstr "Например, FROM (VALUES ...) [AS] foo." -#: gram.y:12113 gram.y:12138 +#: gram.y:12147 gram.y:12172 #, c-format msgid "subquery in FROM must have an alias" msgstr "подзапрос во FROM должен иметь псевдоним" -#: gram.y:12114 gram.y:12139 +#: gram.y:12148 gram.y:12173 #, c-format msgid "For example, FROM (SELECT ...) [AS] foo." msgstr "Например, FROM (SELECT ...) [AS] foo." -#: gram.y:12592 +#: gram.y:12668 #, c-format msgid "only one DEFAULT value is allowed" msgstr "допускается только одно значение DEFAULT" -#: gram.y:12601 +#: gram.y:12677 #, c-format msgid "only one PATH value per column is allowed" msgstr "для столбца допускается только одно значение PATH" -#: gram.y:12610 +#: gram.y:12686 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "" "конфликтующие или избыточные объявления NULL/NOT NULL для столбца \"%s\"" -#: gram.y:12619 +#: gram.y:12695 #, c-format msgid "unrecognized column option \"%s\"" msgstr "нераспознанный параметр столбца \"%s\"" -#: gram.y:12873 +#: gram.y:12949 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "тип float должен иметь точность минимум 1 бит" -#: gram.y:12882 +#: gram.y:12958 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "тип float должен иметь точность меньше 54 бит" -#: gram.y:13373 +#: gram.y:13456 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "неверное число параметров в левой части выражения OVERLAPS" -#: gram.y:13378 +#: gram.y:13461 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "неверное число параметров в правой части выражения OVERLAPS" -#: gram.y:13553 +#: gram.y:13629 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "предикат UNIQUE ещё не реализован" -#: gram.y:13916 +#: gram.y:13988 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "ORDER BY с WITHIN GROUP можно указать только один раз" -#: gram.y:13921 +#: gram.y:13993 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT нельзя использовать с WITHIN GROUP" -#: gram.y:13926 +#: gram.y:13998 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC нельзя использовать с WITHIN GROUP" -#: gram.y:14392 gram.y:14415 +#: gram.y:14522 gram.y:14545 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "началом рамки не может быть UNBOUNDED FOLLOWING" -#: gram.y:14397 +#: gram.y:14527 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "" "рамка, начинающаяся со следующей строки, не может заканчиваться текущей" -#: gram.y:14420 +#: gram.y:14550 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "концом рамки не может быть UNBOUNDED PRECEDING" -#: gram.y:14426 +#: gram.y:14556 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "" "рамка, начинающаяся с текущей строки, не может иметь предшествующих строк" -#: gram.y:14433 +#: gram.y:14563 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "" "рамка, начинающаяся со следующей строки, не может иметь предшествующих строк" -#: gram.y:15083 +#: gram.y:15195 #, c-format msgid "type modifier cannot have parameter name" msgstr "параметр функции-модификатора типа должен быть безымянным" -#: gram.y:15089 +#: gram.y:15201 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "модификатор типа не может включать ORDER BY" -#: gram.y:15154 gram.y:15161 +#: gram.y:15266 gram.y:15273 gram.y:15280 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s нельзя использовать здесь как имя роли" -#: gram.y:15842 gram.y:16031 +#: gram.y:15369 gram.y:16800 +#, c-format +msgid "WITH TIES cannot be specified without ORDER BY clause" +msgstr "WITH TIES нельзя задать без предложения ORDER BY" + +#: gram.y:16477 gram.y:16666 msgid "improper use of \"*\"" msgstr "недопустимое использование \"*\"" -#: gram.y:16095 +#: gram.y:16730 #, c-format msgid "" "an ordered-set aggregate with a VARIADIC direct argument must have one " @@ -30401,87 +31615,82 @@ msgstr "" "сортирующая агрегатная функция с непосредственным аргументом VARIADIC должна " "иметь один агрегатный аргумент VARIADIC того же типа данных" -#: gram.y:16132 +#: gram.y:16767 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "ORDER BY можно указать только один раз" -#: gram.y:16143 +#: gram.y:16778 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "OFFSET можно указать только один раз" -#: gram.y:16152 +#: gram.y:16787 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "LIMIT можно указать только один раз" -#: gram.y:16161 +#: gram.y:16796 #, c-format msgid "multiple limit options not allowed" msgstr "параметры LIMIT можно указать только один раз" -#: gram.y:16165 -#, c-format -msgid "WITH TIES cannot be specified without ORDER BY clause" -msgstr "WITH TIES нельзя задать без предложения ORDER BY" - -#: gram.y:16173 +#: gram.y:16823 #, c-format msgid "multiple WITH clauses not allowed" msgstr "WITH можно указать только один раз" -#: gram.y:16377 +#: gram.y:17017 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "в табличных функциях не может быть аргументов OUT и INOUT" -#: gram.y:16473 +#: gram.y:17113 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "COLLATE можно указать только один раз" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16511 gram.y:16524 +#: gram.y:17151 gram.y:17164 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "ограничения %s не могут иметь характеристики DEFERRABLE" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16537 +#: gram.y:17177 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "ограничения %s не могут иметь характеристики NOT VALID" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16550 +#: gram.y:17190 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "ограничения %s не могут иметь характеристики NO INHERIT" -#: guc-file.l:315 +#: guc-file.l:314 #, c-format -msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %u" -msgstr "нераспознанный параметр конфигурации \"%s\" в файле \"%s\", строке %u" +msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" +msgstr "нераспознанный параметр конфигурации \"%s\" в файле \"%s\", строке %d" -#: guc-file.l:388 +#: guc-file.l:389 #, c-format msgid "parameter \"%s\" removed from configuration file, reset to default" msgstr "" "параметр \"%s\" удалён из файла конфигурации, он принимает значение по " "умолчанию" -#: guc-file.l:454 +#: guc-file.l:455 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "параметр \"%s\" принял значение \"%s\"" -#: guc-file.l:496 +#: guc-file.l:497 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "файл конфигурации \"%s\" содержит ошибки" -#: guc-file.l:501 +#: guc-file.l:502 #, c-format msgid "" "configuration file \"%s\" contains errors; unaffected changes were applied" @@ -30489,64 +31698,64 @@ msgstr "" "файл конфигурации \"%s\" содержит ошибки; были применены не зависимые " "изменения" -#: guc-file.l:506 +#: guc-file.l:507 #, c-format msgid "configuration file \"%s\" contains errors; no changes were applied" msgstr "файл конфигурации \"%s\" содержит ошибки; изменения не были применены" -#: guc-file.l:578 +#: guc-file.l:579 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "пустое имя файла конфигурации: \"%s\"" -#: guc-file.l:595 +#: guc-file.l:596 #, c-format msgid "" "could not open configuration file \"%s\": maximum nesting depth exceeded" msgstr "" "открыть файл конфигурации \"%s\" не удалось: превышен предел вложенности" -#: guc-file.l:615 +#: guc-file.l:616 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "рекурсивная вложенность файла конфигурации в \"%s\"" -#: guc-file.l:642 +#: guc-file.l:643 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "отсутствующий файл конфигурации \"%s\" пропускается" -#: guc-file.l:896 +#: guc-file.l:897 #, c-format msgid "syntax error in file \"%s\" line %u, near end of line" msgstr "ошибка синтаксиса в файле \"%s\", в конце строки %u" -#: guc-file.l:906 +#: guc-file.l:907 #, c-format msgid "syntax error in file \"%s\" line %u, near token \"%s\"" msgstr "ошибка синтаксиса в файле \"%s\", в строке %u, рядом с \"%s\"" -#: guc-file.l:926 +#: guc-file.l:927 #, c-format msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "" "обнаружено слишком много синтаксических ошибок, обработка файла \"%s\" " "прекращается" -#: guc-file.l:981 +#: guc-file.l:982 #, c-format msgid "empty configuration directory name: \"%s\"" msgstr "пустое имя каталога конфигурации: \"%s\"" -#: guc-file.l:1000 +#: guc-file.l:1001 #, c-format msgid "could not open configuration directory \"%s\": %m" msgstr "открыть каталог конфигурации \"%s\" не удалось: %m" #: jsonpath_gram.y:529 #, c-format -msgid "unrecognized flag character \"%c\" in LIKE_REGEX predicate" -msgstr "нераспознанный символ флага \"%c\" в предикате LIKE_REGEX" +msgid "unrecognized flag character \"%.*s\" in LIKE_REGEX predicate" +msgstr "нераспознанный символ флага \"%.*s\" в предикате LIKE_REGEX" #: jsonpath_gram.y:583 #, c-format @@ -30566,16 +31775,16 @@ msgstr "%s в конце аргумента jsonpath" msgid "%s at or near \"%s\" of jsonpath input" msgstr "%s в строке jsonpath (примерное положение: \"%s\")" -#: repl_gram.y:349 repl_gram.y:381 +#: repl_gram.y:345 repl_gram.y:377 #, c-format msgid "invalid timeline %u" msgstr "неверная линия времени %u" -#: repl_scanner.l:131 +#: repl_scanner.l:150 msgid "invalid streaming start location" msgstr "неверная позиция начала потока" -#: repl_scanner.l:182 scan.l:717 +#: repl_scanner.l:206 scan.l:717 msgid "unterminated quoted string" msgstr "незавершённая строка в кавычках" @@ -30630,7 +31839,7 @@ msgstr "" #: scan.l:762 msgid "unterminated dollar-quoted string" -msgstr "незавершённая спецстрока с $" +msgstr "незавершённая строка с $" #: scan.l:779 scan.l:789 msgid "zero-length delimited identifier" @@ -30690,6 +31899,486 @@ msgstr "нестандартное использование спецсимво msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "Используйте для записи спецсимволов синтаксис спецстрок E'\\r\\n'." +#~ msgid "connection was re-authenticated" +#~ msgstr "аутентификация соединения была изменена" + +#~ msgid "type %u does not match constructor type" +#~ msgstr "тип %u не соответствует типу конструктора" + +#~ msgid "system usage: %s\n" +#~ msgstr "нагрузка системы: %s\n" + +#~ msgid "modulus for hash partition must be a positive integer" +#~ msgstr "модуль для хеш-секции должен быть положительным целым" + +#~ msgid "distance in phrase operator should not be greater than %d" +#~ msgstr "дистанция во фразовом операторе должна быть не больше %d" + +#, fuzzy +#~ msgid "invalid hexadecimal digit" +#~ msgstr "неверная шестнадцатеричная цифра: \"%c\"" + +#~ msgid "pclose failed: %m" +#~ msgstr "ошибка pclose: %m" + +#~ msgid "password too long" +#~ msgstr "слишком длинный пароль" + +#~ msgid "\"%s\": removed %.0f row versions in %u pages" +#~ msgstr "\"%s\": удалено версий строк: %.0f, обработано страниц: %u" + +#~ msgid "There were %.0f unused item identifiers.\n" +#~ msgstr "Найдено неиспользованных идентификаторов элементов: %.0f.\n" + +#~ msgid "%u page is entirely empty.\n" +#~ msgid_plural "%u pages are entirely empty.\n" +#~ msgstr[0] "Полностью пустых страниц: %u.\n" +#~ msgstr[1] "Полностью пустых страниц: %u.\n" +#~ msgstr[2] "Полностью пустых страниц: %u.\n" + +#~ msgid "MultiXactId wrap limit is %u, limited by database with OID %u" +#~ msgstr "" +#~ "предел зацикливания MultiXactId равен %u, источник ограничения - база " +#~ "данных с OID %u" + +#~ msgid "oldest MultiXactId member is at offset %u" +#~ msgstr "смещение членов старейшей мультитранзакции: %u" + +#~ msgid "MultiXact member stop limit is now %u based on MultiXact %u" +#~ msgstr "" +#~ "Граница членов мультитранзакции сейчас: %u (при старейшей " +#~ "мультитранзакции %u)" + +#~ msgid "removing file \"%s\"" +#~ msgstr "удаляется файл \"%s\"" + +#~ msgid "transaction ID wrap limit is %u, limited by database with OID %u" +#~ msgstr "" +#~ "предел зацикливания ID транзакций равен %u, источник ограничения - база " +#~ "данных с OID %u" + +#~ msgid "" +#~ "cannot PREPARE a transaction that has manipulated logical replication " +#~ "workers" +#~ msgstr "" +#~ "нельзя выполнить PREPARE для транзакции, задействующей процессы " +#~ "логической репликации" + +#~ msgid "updated min recovery point to %X/%X on timeline %u" +#~ msgstr "" +#~ "минимальная точка восстановления изменена на %X/%X на линии времени %u" + +#~ msgid "recycled write-ahead log file \"%s\"" +#~ msgstr "файл журнала предзаписи \"%s\" используется повторно" + +#~ msgid "removing write-ahead log file \"%s\"" +#~ msgstr "файл журнала предзаписи \"%s\" удаляется" + +#~ msgid "" +#~ "Either set wal_level to \"replica\" on the master, or turn off " +#~ "hot_standby here." +#~ msgstr "" +#~ "Либо установите для wal_level значение \"replica\" на главном сервере, " +#~ "либо выключите hot_standby здесь." + +#~ msgid "checkpoint record is at %X/%X" +#~ msgstr "запись о контрольной точке по смещению %X/%X" + +#~ msgid "initializing for hot standby" +#~ msgstr "инициализация для горячего резерва" + +#~ msgid "checkpoint skipped because system is idle" +#~ msgstr "контрольная точка пропущена ввиду простоя системы" + +#~ msgid "skipping restartpoint, recovery has already ended" +#~ msgstr "" +#~ "создание точки перезапуска пропускается, восстановление уже закончилось" + +#~ msgid "skipping restartpoint, already performed at %X/%X" +#~ msgstr "" +#~ "создание точки перезапуска пропускается, она уже создана по смещению %X/%X" + +#~ msgid "backup time %s in file \"%s\"" +#~ msgstr "время резервного копирования %s в файле \"%s\"" + +#~ msgid "backup label %s in file \"%s\"" +#~ msgstr "метка резервного копирования %s в файле \"%s\"" + +#~ msgid "backup timeline %u in file \"%s\"" +#~ msgstr "линия времени резервной копии %u в файле \"%s\"" + +#~ msgid "drop auto-cascades to %s" +#~ msgstr "удаление автоматически распространяется на объект %s" + +#~ msgid "building index \"%s\" on table \"%s\" serially" +#~ msgstr "создание индекса \"%s\" для таблицы \"%s\" в непараллельном режиме" + +#~ msgid "" +#~ "building index \"%s\" on table \"%s\" with request for %d parallel worker" +#~ msgid_plural "" +#~ "building index \"%s\" on table \"%s\" with request for %d parallel workers" +#~ msgstr[0] "" +#~ "создание индекса \"%s\" для таблицы \"%s\" с расчётом на %d параллельного " +#~ "исполнителя" +#~ msgstr[1] "" +#~ "создание индекса \"%s\" для таблицы \"%s\" с расчётом на %d параллельных " +#~ "исполнителей" +#~ msgstr[2] "" +#~ "создание индекса \"%s\" для таблицы \"%s\" с расчётом на %d параллельных " +#~ "исполнителей" + +#~ msgid "" +#~ "REINDEX of partitioned tables is not yet implemented, skipping \"%s\"" +#~ msgstr "" +#~ "REINDEX для секционированных таблицы ещё не реализован, \"%s\" " +#~ "пропускается" + +#~ msgid "must be superuser to drop access methods" +#~ msgstr "для удаления методов доступа нужно быть суперпользователем" + +#~ msgid "automatic analyze of table \"%s.%s.%s\" system usage: %s" +#~ msgstr "автоматический анализ таблицы \"%s.%s.%s\"; нагрузка системы: %s" + +#~ msgid "COPY BINARY is not supported to stdout or from stdin" +#~ msgstr "" +#~ "COPY BINARY не поддерживает стандартный вывод (stdout) и ввод (stdin)" + +#~ msgid "connection lost during COPY to stdout" +#~ msgstr "в процессе вывода данных COPY в stdout потеряно соединение" + +#~ msgid "procedures cannot have OUT arguments" +#~ msgstr "у процедур не может быть аргументов OUT" + +#~ msgid "INOUT arguments are permitted." +#~ msgstr "Аргументы INOUT допускаются." + +#~ msgid "%s %s will create implicit index \"%s\" for table \"%s\"" +#~ msgstr "%s %s создаст неявный индекс \"%s\" для таблицы \"%s\"" + +#~ msgid "REINDEX is not yet implemented for partitioned indexes" +#~ msgstr "REINDEX для секционированных индексов ещё не реализован" + +#~ msgid "at least one of leftarg or rightarg must be specified" +#~ msgstr "необходимо указать левый и/или правый аргумент" + +#~ msgid "only simple column references are allowed in CREATE STATISTICS" +#~ msgstr "в CREATE STATISTICS допускаются только простые ссылки на столбцы" + +#~ msgid "table \"%s.%s\" added to subscription \"%s\"" +#~ msgstr "таблица \"%s.%s\" добавлена в подписку \"%s\"" + +#~ msgid "table \"%s.%s\" removed from subscription \"%s\"" +#~ msgstr "таблица \"%s.%s\" удалена из подписки \"%s\"" + +#~ msgid "The error was: %s" +#~ msgstr "Произошла ошибка: %s" + +#~ msgid "rewriting table \"%s\"" +#~ msgstr "перезапись таблицы \"%s\"" + +#~ msgid "verifying table \"%s\"" +#~ msgstr "проверка таблицы \"%s\"" + +#~ msgid "" +#~ "existing constraints on column \"%s.%s\" are sufficient to prove that it " +#~ "does not contain nulls" +#~ msgstr "" +#~ "существующие ограничения для столбца \"%s.%s\" гарантируют, что он не " +#~ "содержит NULL" + +#~ msgid "validating foreign key constraint \"%s\"" +#~ msgstr "проверка ограничения внешнего ключа \"%s\"" + +#~ msgid "" +#~ "partition constraint for table \"%s\" is implied by existing constraints" +#~ msgstr "" +#~ "ограничение секции для таблицы \"%s\" подразумевается существующими " +#~ "ограничениями" + +#~ msgid "" +#~ "updated partition constraint for default partition \"%s\" is implied by " +#~ "existing constraints" +#~ msgstr "" +#~ "изменённое ограничение секции для секции по умолчанию \"%s\" " +#~ "подразумевается существующими ограничениями" + +#~ msgid "must be superuser to alter replication users" +#~ msgstr "" +#~ "для модификации пользователей-репликаторов нужно быть суперпользователем" + +#~ msgid "time to inline: %.3fs, opt: %.3fs, emit: %.3fs" +#~ msgstr "время внедрения: %.3fs, оптимизации: %.3fs, выдачи: %.3fs" + +#~ msgid "SSL on" +#~ msgstr "SSL вкл." + +#~ msgid "SSL off" +#~ msgstr "SSL выкл." + +#~ msgid "SASL authentication is not supported in protocol version 2" +#~ msgstr "аутентификация SASL не поддерживается в протоколе версии 2" + +#~ msgid "GSSAPI is not supported in protocol version 2" +#~ msgstr "GSSAPI не поддерживается в протоколе версии 2" + +#~ msgid "SSPI is not supported in protocol version 2" +#~ msgstr "SSPI не поддерживается в протоколе версии 2" + +#~ msgid "SSL connection from \"%s\"" +#~ msgstr "SSL-подключение от \"%s\"" + +#~ msgid "authentication file line too long" +#~ msgstr "слишком длинная строка в файле конфигурации безопасности" + +#~ msgid "setsockopt(SO_REUSEADDR) failed for %s address \"%s\": %m" +#~ msgstr "ошибка в setsockopt(SO_REUSEADDR) для адреса %s \"%s\": %m" + +#~ msgid "" +#~ "Is another postmaster already running on port %d? If not, remove socket " +#~ "file \"%s\" and retry." +#~ msgstr "" +#~ "Возможно порт %d занят другим процессом postmaster? Если нет, удалите " +#~ "файл \"%s\" и повторите попытку." + +#~ msgid "" +#~ " -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n" +#~ msgstr "" +#~ " -o ПАРАМЕТРЫ параметры для серверных процессов (уже неактуально)\n" + +#~ msgid "arguments declared \"anyelement\" are not all alike" +#~ msgstr "аргументы, объявленные как \"anyelement\", должны быть однотипными" + +#~ msgid "arguments declared \"anyrange\" are not all alike" +#~ msgstr "аргументы, объявленные как \"anyrange\", должны быть однотипными" + +#~ msgid "arguments declared \"anycompatiblerange\" are not all alike" +#~ msgstr "" +#~ "аргументы, объявленные как \"anycompatiblerange\", должны быть однотипными" + +#~ msgid "operator precedence change: %s is now lower precedence than %s" +#~ msgstr "" +#~ "приоритет операторов изменён: %s теперь имеет меньший приоритет, чем %s" + +#~ msgid "array assignment requires type %s but expression is of type %s" +#~ msgstr "" +#~ "для присваивания массива требуется тип %s, однако выражение имеет тип %s" + +#~ msgid "%s will create implicit sequence \"%s\" for serial column \"%s.%s\"" +#~ msgstr "%s создаст последовательность \"%s\" для столбца serial \"%s.%s\"" + +#~ msgid "" +#~ "could not determine which collation to use for partition bound expression" +#~ msgstr "" +#~ "не удалось определить правило сортировки для выражения границы секции" + +#~ msgid "" +#~ "collation of partition bound value for column \"%s\" does not match " +#~ "partition key collation \"%s\"" +#~ msgstr "" +#~ "правило сортировки для выражения границы секции в столбце \"%s\" не " +#~ "соответствует правилу сортировки для ключа секционирования \"%s\"" + +#~ msgid "could not enable Lock Pages in Memory user right: error code %lu" +#~ msgstr "" +#~ "не удалось активировать право пользователя на блокировку страниц в " +#~ "памяти: код ошибки %lu" + +#~ msgid "could not enable Lock Pages in Memory user right" +#~ msgstr "" +#~ "не удалось активировать право пользователя на блокировку страниц в памяти" + +#~ msgid "disabling huge pages" +#~ msgstr "отключение огромных страниц" + +#~ msgid "autovacuum launcher started" +#~ msgstr "процесс запуска автоочистки создан" + +#~ msgid "autovacuum launcher shutting down" +#~ msgstr "процесс запуска автоочистки завершается" + +#~ msgid "autovacuum: processing database \"%s\"" +#~ msgstr "автоочистка: обработка базы данных \"%s\"" + +#~ msgid "registering background worker \"%s\"" +#~ msgstr "регистрация фонового процесса \"%s\"" + +#~ msgid "unregistering background worker \"%s\"" +#~ msgstr "разрегистрация фонового процесса \"%s\"" + +#~ msgid "compacted fsync request queue from %d entries to %d entries" +#~ msgstr "очередь запросов fsync сжата (было записей: %d, стало: %d)" + +#~ msgid "could not fork archiver: %m" +#~ msgstr "не удалось породить процесс архивации: %m" + +#~ msgid "starting background worker process \"%s\"" +#~ msgstr "запуск фонового рабочего процесса \"%s\"" + +#~ msgid "logger shutting down" +#~ msgstr "остановка протоколирования" + +#~ msgid "could not read from file \"%s\"" +#~ msgstr "не удалось прочитать файл \"%s\"" + +#~ msgid "could not fseek in file \"%s\": %m" +#~ msgstr "не удалось переместиться в файле \"%s\": %m" + +#~ msgid "could not reread block %d of file \"%s\": %m" +#~ msgstr "не удалось заново прочитать блок %d файла \"%s\": %m" + +#~ msgid "starting logical replication worker for subscription \"%s\"" +#~ msgstr "" +#~ "запускается процесс-обработчик логической репликации для подписки \"%s\"" + +#~ msgid "logical replication launcher started" +#~ msgstr "процесс запуска логической репликации запущен" + +#~ msgid "only superusers can query or manipulate replication origins" +#~ msgstr "" +#~ "запрашивать или модифицировать источники репликации могут только " +#~ "суперпользователи" + +#~ msgid "could not fetch table info for table \"%s.%s\": %s" +#~ msgstr "не удалось получить информацию о таблице \"%s.%s\": %s" + +#~ msgid "ORIGIN message sent out of order" +#~ msgstr "сообщение ORIGIN отправлено неуместно" + +#~ msgid "invalid logical replication message type \"%c\"" +#~ msgstr "неверный тип сообщения логической репликации \"%c\"" + +#~ msgid "" +#~ "logical replication apply worker for subscription \"%s\" will restart " +#~ "because the connection information was changed" +#~ msgstr "" +#~ "применяющий процесс логической репликации для подписки \"%s\" будет " +#~ "перезапущен из-за изменения информации о подключении" + +#~ msgid "" +#~ "logical replication apply worker for subscription \"%s\" will restart " +#~ "because the replication slot name was changed" +#~ msgstr "" +#~ "применяющий процесс логической репликации для подписки \"%s\" будет " +#~ "перезапущен, так как было изменено имя слота репликации" + +#~ msgid "" +#~ "logical replication apply worker for subscription \"%s\" will restart " +#~ "because subscription's publications were changed" +#~ msgstr "" +#~ "применяющий процесс логической репликации для подписки \"%s\" будет " +#~ "перезапущен из-за изменения публикаций подписки" + +#~ msgid "standby \"%s\" now has synchronous standby priority %u" +#~ msgstr "" +#~ "резервный сервер \"%s\" теперь имеет приоритет синхронной репликации %u" + +#~ msgid "\"%s\" has now caught up with upstream server" +#~ msgstr "ведомый сервер \"%s\" нагнал ведущий" + +#~ msgid "deferrable snapshot was unsafe; trying a new one" +#~ msgstr "откладываемый снимок был небезопасен; пробуем более новый" + +#~ msgid "Process %d waits for %s on %s." +#~ msgstr "Процесс %d ожидает в режиме %s блокировку %s." + +#~ msgid "sending cancel to blocking autovacuum PID %d" +#~ msgstr "снятие блокирующего процесса автоочистки (PID %d)" + +#~ msgid "could not forward fsync request because request queue is full" +#~ msgstr "" +#~ "не удалось отправить запрос синхронизации с ФС (очередь запросов " +#~ "переполнена)" + +#~ msgid "could not fsync file \"%s\" but retrying: %m" +#~ msgstr "" +#~ "не удалось синхронизировать с ФС файл \"%s\", последует повторная " +#~ "попытка: %m" + +#~ msgid "unexpected EOF on client connection" +#~ msgstr "неожиданный обрыв соединения с клиентом" + +#~ msgid "parse %s: %s" +#~ msgstr "разбор %s: %s" + +#~ msgid "bind %s to %s" +#~ msgstr "привязка %s к %s" + +#~ msgid "logical replication launcher shutting down" +#~ msgstr "процесс запуска логической репликации остановлен" + +#~ msgid "wrong element type" +#~ msgstr "неверный тип элемента" + +#~ msgid "cannot convert NaN to integer" +#~ msgstr "нельзя преобразовать NaN в integer" + +#~ msgid "wrong data type: %u, expected %u" +#~ msgstr "неверный тип данных: %u, ожидался %u" + +#~ msgid "You need to rebuild PostgreSQL using --with-libxml." +#~ msgstr "Необходимо перекомпилировать PostgreSQL с ключом --with-libxml." + +#~ msgid "loaded library \"%s\"" +#~ msgstr "загружена библиотека \"%s\"" + +#~ msgid "off" +#~ msgstr "выкл." + +#~ msgid "on" +#~ msgstr "вкл." + +#~ msgid "Resource Usage" +#~ msgstr "Использование ресурсов" + +#~ msgid "Write-Ahead Log" +#~ msgstr "Журнал WAL" + +#~ msgid "Replication" +#~ msgstr "Репликация" + +#~ msgid "Query Tuning" +#~ msgstr "Настройка запросов" + +#~ msgid "Reporting and Logging" +#~ msgstr "Отчёты и протоколы" + +#~ msgid "Process Title" +#~ msgstr "Заголовок процесса" + +#~ msgid "Statistics" +#~ msgstr "Статистика" + +#~ msgid "Client Connection Defaults" +#~ msgstr "Параметры клиентских сеансов по умолчанию" + +#~ msgid "Version and Platform Compatibility" +#~ msgstr "Совместимость с разными версиями и платформами" + +#~ msgid "" +#~ "Emit a warning for constructs that changed meaning since PostgreSQL 9.4." +#~ msgstr "" +#~ "Выдаёт предупреждение о конструкциях, поведение которых изменилось после " +#~ "PostgreSQL 9.4." + +#~ msgid "" +#~ "Number of tuple inserts prior to index cleanup as a fraction of reltuples." +#~ msgstr "" +#~ "Отношение числа добавлений кортежей к reltuples, определяющее потребность " +#~ "в уборке индекса." + +#~ msgid "role \"%s\" could not be removed from policy \"%s\" on \"%s\"" +#~ msgstr "роль \"%s\" нельзя удалить из политики \"%s\" отношения \"%s\"" + +#~ msgid "distance in phrase operator should be non-negative and less than %d" +#~ msgstr "" +#~ "дистанция во фразовом операторе должна быть неотрицательной и меньше %d" + +#~ msgid "" +#~ "For RAID arrays, this should be approximately the number of drive " +#~ "spindles in the array." +#~ msgstr "" +#~ "Для RAID-массивов это примерно равно числу физических дисков в массиве." + #~ msgid "" #~ "moving row to another partition during a BEFORE trigger is not supported" #~ msgstr "в триггере BEFORE нельзя перемещать строку в другую секцию" @@ -30967,9 +32656,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "SSL library does not support certificate revocation lists." #~ msgstr "Библиотека SSL не поддерживает списки отзыва сертификатов." -#~ msgid "could not find range type for data type %s" -#~ msgstr "тип диапазона для типа данных %s не найден" - #~ msgid "could not create signal dispatch thread: error code %lu\n" #~ msgstr "не удалось создать поток распределения сигналов (код ошибки: %lu)\n" @@ -31041,9 +32727,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "%s: could not read file \"%s\": %s\n" #~ msgstr "%s: не удалось прочитать файл \"%s\": %s\n" -#~ msgid "could not read file \"%s\": read %d of %d" -#~ msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %d)" - #~ msgid "%s: could not read file \"%s\": read %d of %d\n" #~ msgstr "%s: не удалось прочитать файл \"%s\" (прочитано байт: %d из %d)\n" @@ -31253,9 +32936,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "cannot drop column named in partition key" #~ msgstr "нельзя удалить столбец, входящий в ключ секционирования" -#~ msgid "cannot reference partitioned table \"%s\"" -#~ msgstr "ссылаться на секционированную таблицу \"%s\" нельзя" - #, fuzzy #~ msgid "cannot alter type of column named in partition key" #~ msgstr "нельзя изменить тип столбца, составляющего ключ секционирования" @@ -31297,10 +32977,6 @@ msgstr "Используйте для записи спецсимволов си #~ "в отношении \"%s\" не инициализирована страница %u --- ситуация " #~ "исправляется" -#~ msgid "logical replication target relation \"%s.%s\" is not a table" -#~ msgstr "" -#~ "целевое отношение логической репликации \"%s.%s\" не является таблицей" - #~ msgid "" #~ "tuple to be deleted was already moved to another partition due to " #~ "concurrent update" @@ -31390,9 +33066,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "invalid MVNDistinct size %zd (expected at least %zd)" #~ msgstr "неправильный размер MVNDistinct: %zd (ожидался не меньше %zd)" -#~ msgid "dynamic shared memory is disabled" -#~ msgstr "динамическая разделяемая память отключена" - #~ msgid "Set dynamic_shared_memory_type to a value other than \"none\"." #~ msgstr "" #~ "Установите для dynamic_shared_memory_type значение, отличное от \"none\"." @@ -31488,9 +33161,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "invalid input syntax for numeric time zone: \"%s\"" #~ msgstr "неверный синтаксис для числового часового пояса: \"%s\"" -#~ msgid "could not open relation mapping file \"%s\": %m" -#~ msgstr "открыть файл сопоставления отношений \"%s\" не удалось: %m" - #~ msgid "could not read relation mapping file \"%s\": %m" #~ msgstr "прочитать файл сопоставления отношений \"%s\" не удалось: %m" @@ -31747,9 +33417,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "column \"%s\" referenced in statistics does not exist" #~ msgstr "столбец \"%s\", указанный в статистике, не существует" -#~ msgid "not connected to database" -#~ msgstr "нет подключения к базе данных" - #~ msgid "invalid input syntax for %s: \"%s\"" #~ msgstr "неверный синтаксис для %s: \"%s\"" @@ -32043,9 +33710,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "argument %d: could not determine data type" #~ msgstr "аргумент %d: не удалось определить тип данных" -#~ msgid "could not open transaction log file \"%s\": %m" -#~ msgstr "не удалось открыть файл журнала транзакций \"%s\": %m" - #~ msgid "removing transaction log backup history file \"%s\"" #~ msgstr "удаляется файл истории копирования журнала: \"%s\"" @@ -32191,18 +33855,12 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "op ANY/ALL (array) does not support set arguments" #~ msgstr "операторы ANY/ALL (с массивом) не поддерживают аргументы-множества" -#~ msgid "NULLIF does not support set arguments" -#~ msgstr "NULLIF не поддерживает аргументы-множества" - #~ msgid "hostssl requires SSL to be turned on" #~ msgstr "для использования hostssl необходимо включить SSL" #~ msgid "could not create %s socket: %m" #~ msgstr "не удалось создать сокет %s: %m" -#~ msgid "could not bind %s socket: %m" -#~ msgstr "не удалось привязаться к сокету %s: %m" - #~ msgid "" #~ "WHERE CURRENT OF is not supported on a view with no underlying relation" #~ msgstr "" @@ -32724,9 +34382,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "wrong parameter %d for tablesample method \"%s\"" #~ msgstr "неверный параметр %d для метода получения выборки \"%s\"" -#~ msgid "Expected type %s got %s." -#~ msgstr "Ожидался тип: %s, получено: %s." - #~ msgid "cache lookup failed for tablesample method %u" #~ msgstr "ошибка поиска в кеше для метода получения выборки %u" @@ -32956,9 +34611,6 @@ msgstr "Используйте для записи спецсимволов си #~ "смещение часового пояса %d не кратно 15 мин. (900 сек.) (файл часовых " #~ "поясов \"%s\", строка %d)" -#~ msgid "could not seek to the end of file \"%s\": %m" -#~ msgstr "не удалось перейти к концу файла \"%s\": %m" - #~ msgid "cannot call %s with null path elements" #~ msgstr "вызывать %s с элементами пути, равными NULL, нельзя" @@ -32977,9 +34629,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "could not rename file \"%s\" to \"%s\" : %m" #~ msgstr "не удалось переименовать файл \"%s\" в \"%s\": %m" -#~ msgid "%s \"%s\": return code %d" -#~ msgstr "%s \"%s\": код возврата %d" - #~ msgid "invalid input syntax for transaction log location: \"%s\"" #~ msgstr "" #~ "неверный синтаксис строки, задающей положение в журнале транзакций: \"%s\"" @@ -33226,9 +34875,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "cannot use window function in EXECUTE parameter" #~ msgstr "в качестве параметра EXECUTE нельзя использовать оконную функцию" -#~ msgid "constraints on foreign tables are not supported" -#~ msgstr "ограничения для внешних таблиц не поддерживаются" - #~ msgid "cannot use window function in transform expression" #~ msgstr "нельзя использовать оконную функцию в выражении преобразования" @@ -33403,9 +35049,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "No rows were found in \"%s\"." #~ msgstr "Таблица \"%s\" не содержит строк." -#~ msgid "index \"%s\" is not ready" -#~ msgstr "индекс \"%s\" не готов" - #~ msgid "You can cancel your own processes with pg_cancel_backend()." #~ msgstr "Свои процессы можно отменить с помощью pg_cancel_backend()." diff --git a/src/backend/po/sv.po b/src/backend/po/sv.po index 2191b63a4c..9c6d956f76 100644 --- a/src/backend/po/sv.po +++ b/src/backend/po/sv.po @@ -1,28 +1,30 @@ # Swedish message translation file for postgresql -# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020. +# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. # -# Många av termerna är tekniska termer som refererar till begrepp i SQL-satser och liknande. Om man -# översätter vissa av dessa så kommer det bli väldigt svårt för användaren att förstå vad vi menar. -# För många av dessa har jag valt att behålla det engelska ordet som ett begrepp. Det är en svår +# Många av termerna är tekniska termer som refererar till begrepp i SQL-satser +# och liknande. Om man översätter vissa av dessa så kommer det bli väldigt +# svårt för användaren att förstå vad vi menar. För många av dessa har jag +# valt att behålla det engelska ordet som ett begrepp. Det är en svår # balansgång. # -# T.ex. ett integritetsvillkor som deklarerats med flaggan DEFERRABLE har jag i text som -# tar upp det lämnat kvar begreppet deferrable. T.ex: +# T.ex. ett integritetsvillkor som deklarerats med flaggan DEFERRABLE har jag +# i text som tar upp det lämnat kvar begreppet deferrable. T.ex: # # att ange deferrable för integritetsvillkor stöds inte för domäner # -# På många ställen är det svårt att avgöra. Ta t.ex. integer som ibland refererar till typen integer och -# ibland refererar mer allmänt till heltal. +# På många ställen är det svårt att avgöra. Ta t.ex. integer som ibland +# refererar till typen integer och ibland refererar mer allmänt till heltal. # -# Andra exempel är att i engelskan används cleanup och vacuum på olika ställen nedan. Jag har valt att -# behålla vacuum på svenska för att göra tydligt att det är kommandon VACUUM och den processen det +# Andra exempel är att i engelskan används cleanup och vacuum på olika +# ställen nedan. Jag har valt att i vissa fall behålla vacuum på svenska +# för att göra tydligt att det är kommandon VACUUM och den processen det # hänvisas till och inte någon annan städning. msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-20 16:43+0000\n" -"PO-Revision-Date: 2020-10-20 19:40+0200\n" +"POT-Creation-Date: 2022-05-12 20:15+0000\n" +"PO-Revision-Date: 2022-05-12 23:06+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -31,6 +33,41 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ../common/compression.c:157 +msgid "found empty string where a compression option was expected" +msgstr "hittade en tom sträng där en komprimeringsinställning förväntades" + +#: ../common/compression.c:187 +#, c-format +msgid "unknown compression option \"%s\"" +msgstr "okänd komprimeringsmetod \"%s\"" + +#: ../common/compression.c:226 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "komprimeringsmetoden \"%s\" kräver ett värde" + +#: ../common/compression.c:235 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "värdet på komprimeringsflaggan \"%s\" måste vara ett heltal" + +#: ../common/compression.c:273 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "komprimeringsalgoritmen \"%s\" har ingen komprimeringsnivå som kan sättas" + +#: ../common/compression.c:277 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d" +msgstr "komprimeringsalgoritmen \"%s\" förväntar sig en komprimeringsnivå mellan %d och %d" + +#: ../common/compression.c:289 +#, fuzzy, c-format +#| msgid "operator class \"%s\" does not accept data type %s" +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "operatorklass \"%s\" accepterar inte datatypen %s" + #: ../common/config_info.c:134 ../common/config_info.c:142 #: ../common/config_info.c:150 ../common/config_info.c:158 #: ../common/config_info.c:166 ../common/config_info.c:174 @@ -38,69 +75,66 @@ msgstr "" msgid "not recorded" msgstr "ej sparad" -#: ../common/controldata_utils.c:68 ../common/controldata_utils.c:73 -#: commands/copy.c:3495 commands/extension.c:3436 utils/adt/genfile.c:125 +#: ../common/controldata_utils.c:69 ../common/controldata_utils.c:73 +#: commands/copyfrom.c:1515 commands/extension.c:3379 utils/adt/genfile.c:123 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "kunde inte öppna filen \"%s\" för läsning: %m" -#: ../common/controldata_utils.c:86 ../common/controldata_utils.c:89 +#: ../common/controldata_utils.c:84 ../common/controldata_utils.c:86 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1276 access/transam/xlog.c:3503 -#: access/transam/xlog.c:4728 access/transam/xlog.c:11121 -#: access/transam/xlog.c:11134 access/transam/xlog.c:11587 -#: access/transam/xlog.c:11667 access/transam/xlog.c:11706 -#: access/transam/xlog.c:11749 access/transam/xlogfuncs.c:662 -#: access/transam/xlogfuncs.c:681 commands/extension.c:3446 libpq/hba.c:499 -#: replication/logical/origin.c:717 replication/logical/origin.c:753 -#: replication/logical/reorderbuffer.c:3599 -#: replication/logical/snapbuild.c:1741 replication/logical/snapbuild.c:1783 -#: replication/logical/snapbuild.c:1811 replication/logical/snapbuild.c:1838 -#: replication/slot.c:1622 replication/slot.c:1663 replication/walsender.c:543 -#: storage/file/buffile.c:441 storage/file/copydir.c:195 -#: utils/adt/genfile.c:200 utils/adt/misc.c:763 utils/cache/relmapper.c:741 +#: access/transam/twophase.c:1348 access/transam/xlog.c:3207 +#: access/transam/xlog.c:4022 access/transam/xlogrecovery.c:1177 +#: access/transam/xlogrecovery.c:1269 access/transam/xlogrecovery.c:1306 +#: access/transam/xlogrecovery.c:1366 commands/extension.c:3389 libpq/hba.c:505 +#: replication/basebackup.c:1836 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4925 +#: replication/logical/snapbuild.c:1756 replication/logical/snapbuild.c:1798 +#: replication/logical/snapbuild.c:1825 replication/slot.c:1815 +#: replication/slot.c:1856 replication/walsender.c:659 +#: storage/file/buffile.c:463 storage/file/copydir.c:195 +#: utils/adt/genfile.c:197 utils/adt/misc.c:863 utils/cache/relmapper.c:813 #, c-format msgid "could not read file \"%s\": %m" msgstr "kunde inte läsa fil \"%s\": %m" -#: ../common/controldata_utils.c:97 ../common/controldata_utils.c:101 -#: access/transam/twophase.c:1279 access/transam/xlog.c:3508 -#: access/transam/xlog.c:4733 replication/logical/origin.c:722 -#: replication/logical/origin.c:761 replication/logical/snapbuild.c:1746 -#: replication/logical/snapbuild.c:1788 replication/logical/snapbuild.c:1816 -#: replication/logical/snapbuild.c:1843 replication/slot.c:1626 -#: replication/slot.c:1667 replication/walsender.c:548 -#: utils/cache/relmapper.c:745 +#: ../common/controldata_utils.c:92 ../common/controldata_utils.c:95 +#: access/transam/xlog.c:3212 access/transam/xlog.c:4027 +#: replication/basebackup.c:1840 replication/logical/origin.c:734 +#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1761 +#: replication/logical/snapbuild.c:1803 replication/logical/snapbuild.c:1830 +#: replication/slot.c:1819 replication/slot.c:1860 replication/walsender.c:664 +#: utils/cache/relmapper.c:817 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" -#: ../common/controldata_utils.c:112 ../common/controldata_utils.c:117 -#: ../common/controldata_utils.c:256 ../common/controldata_utils.c:259 -#: access/heap/rewriteheap.c:1181 access/heap/rewriteheap.c:1284 +#: ../common/controldata_utils.c:104 ../common/controldata_utils.c:108 +#: ../common/controldata_utils.c:241 ../common/controldata_utils.c:244 +#: access/heap/rewriteheap.c:1178 access/heap/rewriteheap.c:1281 #: access/transam/timeline.c:392 access/transam/timeline.c:438 -#: access/transam/timeline.c:516 access/transam/twophase.c:1288 -#: access/transam/twophase.c:1676 access/transam/xlog.c:3375 -#: access/transam/xlog.c:3543 access/transam/xlog.c:3548 -#: access/transam/xlog.c:3876 access/transam/xlog.c:4698 -#: access/transam/xlog.c:5622 access/transam/xlogfuncs.c:687 -#: commands/copy.c:1810 libpq/be-fsstubs.c:462 libpq/be-fsstubs.c:533 -#: replication/logical/origin.c:655 replication/logical/origin.c:794 -#: replication/logical/reorderbuffer.c:3657 -#: replication/logical/snapbuild.c:1653 replication/logical/snapbuild.c:1851 -#: replication/slot.c:1513 replication/slot.c:1674 replication/walsender.c:558 -#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:704 -#: storage/file/fd.c:3425 storage/file/fd.c:3528 utils/cache/relmapper.c:753 -#: utils/cache/relmapper.c:892 +#: access/transam/timeline.c:516 access/transam/twophase.c:1360 +#: access/transam/twophase.c:1772 access/transam/xlog.c:3054 +#: access/transam/xlog.c:3247 access/transam/xlog.c:3252 +#: access/transam/xlog.c:3390 access/transam/xlog.c:3992 +#: access/transam/xlog.c:4729 commands/copyfrom.c:1575 commands/copyto.c:327 +#: libpq/be-fsstubs.c:455 libpq/be-fsstubs.c:525 +#: replication/logical/origin.c:667 replication/logical/origin.c:806 +#: replication/logical/reorderbuffer.c:4983 +#: replication/logical/snapbuild.c:1665 replication/logical/snapbuild.c:1838 +#: replication/slot.c:1706 replication/slot.c:1867 replication/walsender.c:674 +#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:745 +#: storage/file/fd.c:3643 storage/file/fd.c:3749 utils/cache/relmapper.c:828 +#: utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" msgstr "kunde inte stänga fil \"%s\": %m" -#: ../common/controldata_utils.c:135 +#: ../common/controldata_utils.c:124 msgid "byte ordering mismatch" msgstr "byte-ordning stämmer inte" -#: ../common/controldata_utils.c:137 +#: ../common/controldata_utils.c:126 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -113,131 +147,153 @@ msgstr "" "inte detta program. I så fall kan nedanstående resultat vara felaktiga\n" "och PostgreSQL-installationen vara inkompatibel med databaskatalogen." -#: ../common/controldata_utils.c:197 ../common/controldata_utils.c:203 -#: ../common/file_utils.c:224 ../common/file_utils.c:283 -#: ../common/file_utils.c:357 access/heap/rewriteheap.c:1267 +#: ../common/controldata_utils.c:189 ../common/controldata_utils.c:194 +#: ../common/file_utils.c:232 ../common/file_utils.c:291 +#: ../common/file_utils.c:365 access/heap/rewriteheap.c:1264 #: access/transam/timeline.c:111 access/transam/timeline.c:251 -#: access/transam/timeline.c:348 access/transam/twophase.c:1232 -#: access/transam/xlog.c:3277 access/transam/xlog.c:3417 -#: access/transam/xlog.c:3458 access/transam/xlog.c:3656 -#: access/transam/xlog.c:3741 access/transam/xlog.c:3844 -#: access/transam/xlog.c:4718 access/transam/xlogutils.c:807 -#: postmaster/syslogger.c:1488 replication/basebackup.c:621 -#: replication/basebackup.c:1593 replication/logical/origin.c:707 -#: replication/logical/reorderbuffer.c:2465 -#: replication/logical/reorderbuffer.c:2825 -#: replication/logical/reorderbuffer.c:3579 -#: replication/logical/snapbuild.c:1608 replication/logical/snapbuild.c:1712 -#: replication/slot.c:1594 replication/walsender.c:516 -#: replication/walsender.c:2517 storage/file/copydir.c:161 -#: storage/file/fd.c:679 storage/file/fd.c:3412 storage/file/fd.c:3499 -#: storage/smgr/md.c:475 utils/cache/relmapper.c:724 -#: utils/cache/relmapper.c:836 utils/error/elog.c:1858 -#: utils/init/miscinit.c:1316 utils/init/miscinit.c:1450 -#: utils/init/miscinit.c:1527 utils/misc/guc.c:8280 utils/misc/guc.c:8312 +#: access/transam/timeline.c:348 access/transam/twophase.c:1304 +#: access/transam/xlog.c:2941 access/transam/xlog.c:3123 +#: access/transam/xlog.c:3162 access/transam/xlog.c:3357 +#: access/transam/xlog.c:4012 access/transam/xlogrecovery.c:4114 +#: access/transam/xlogrecovery.c:4217 access/transam/xlogutils.c:850 +#: postmaster/syslogger.c:1560 replication/basebackup.c:522 +#: replication/basebackup.c:1513 replication/logical/origin.c:719 +#: replication/logical/reorderbuffer.c:3580 +#: replication/logical/reorderbuffer.c:4129 +#: replication/logical/reorderbuffer.c:4905 +#: replication/logical/snapbuild.c:1620 replication/logical/snapbuild.c:1727 +#: replication/slot.c:1787 replication/walsender.c:632 +#: replication/walsender.c:2723 storage/file/copydir.c:161 +#: storage/file/fd.c:720 storage/file/fd.c:3395 storage/file/fd.c:3630 +#: storage/file/fd.c:3720 storage/smgr/md.c:507 utils/cache/relmapper.c:792 +#: utils/cache/relmapper.c:900 utils/error/elog.c:1933 +#: utils/init/miscinit.c:1366 utils/init/miscinit.c:1500 +#: utils/init/miscinit.c:1577 utils/misc/guc.c:8923 utils/misc/guc.c:8972 #, c-format msgid "could not open file \"%s\": %m" msgstr "kunde inte öppna fil \"%s\": %m" -#: ../common/controldata_utils.c:221 ../common/controldata_utils.c:224 -#: access/transam/twophase.c:1649 access/transam/twophase.c:1658 -#: access/transam/xlog.c:10878 access/transam/xlog.c:10916 -#: access/transam/xlog.c:11329 access/transam/xlogfuncs.c:741 -#: postmaster/syslogger.c:1499 postmaster/syslogger.c:1512 -#: utils/cache/relmapper.c:870 +#: ../common/controldata_utils.c:210 ../common/controldata_utils.c:213 +#: access/transam/twophase.c:1745 access/transam/twophase.c:1754 +#: access/transam/xlog.c:8652 access/transam/xlogfuncs.c:600 +#: postmaster/postmaster.c:5626 postmaster/syslogger.c:1571 +#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 +#: replication/basebackup_server.c:173 replication/basebackup_server.c:266 +#: utils/cache/relmapper.c:934 #, c-format msgid "could not write file \"%s\": %m" msgstr "kunde inte skriva fil \"%s\": %m" -#: ../common/controldata_utils.c:239 ../common/controldata_utils.c:245 -#: ../common/file_utils.c:295 ../common/file_utils.c:365 -#: access/heap/rewriteheap.c:961 access/heap/rewriteheap.c:1175 -#: access/heap/rewriteheap.c:1278 access/transam/timeline.c:432 -#: access/transam/timeline.c:510 access/transam/twophase.c:1670 -#: access/transam/xlog.c:3368 access/transam/xlog.c:3537 -#: access/transam/xlog.c:4691 access/transam/xlog.c:10386 -#: access/transam/xlog.c:10413 replication/logical/snapbuild.c:1646 -#: replication/slot.c:1499 replication/slot.c:1604 storage/file/fd.c:696 -#: storage/file/fd.c:3520 storage/smgr/md.c:921 storage/smgr/md.c:962 -#: storage/sync/sync.c:396 utils/cache/relmapper.c:885 utils/misc/guc.c:8063 +#: ../common/controldata_utils.c:227 ../common/controldata_utils.c:232 +#: ../common/file_utils.c:303 ../common/file_utils.c:373 +#: access/heap/rewriteheap.c:960 access/heap/rewriteheap.c:1172 +#: access/heap/rewriteheap.c:1275 access/transam/timeline.c:432 +#: access/transam/timeline.c:510 access/transam/twophase.c:1766 +#: access/transam/xlog.c:3047 access/transam/xlog.c:3241 +#: access/transam/xlog.c:3985 access/transam/xlog.c:7950 +#: access/transam/xlog.c:7993 replication/basebackup_server.c:207 +#: replication/logical/snapbuild.c:1658 replication/slot.c:1692 +#: replication/slot.c:1797 storage/file/fd.c:737 storage/file/fd.c:3741 +#: storage/smgr/md.c:958 storage/smgr/md.c:999 storage/sync/sync.c:453 +#: utils/cache/relmapper.c:949 utils/misc/guc.c:8692 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "kunde inte fsync:a fil \"%s\": %m" -#: ../common/exec.c:137 ../common/exec.c:254 ../common/exec.c:300 +#: ../common/cryptohash.c:266 ../common/cryptohash_openssl.c:133 +#: ../common/cryptohash_openssl.c:332 ../common/exec.c:560 ../common/exec.c:605 +#: ../common/exec.c:697 ../common/hmac.c:309 ../common/hmac.c:325 +#: ../common/hmac_openssl.c:132 ../common/hmac_openssl.c:327 +#: ../common/md5_common.c:155 ../common/psprintf.c:143 +#: ../common/scram-common.c:247 ../common/stringinfo.c:305 ../port/path.c:751 +#: ../port/path.c:789 ../port/path.c:806 access/transam/twophase.c:1413 +#: access/transam/xlogrecovery.c:567 lib/dshash.c:254 libpq/auth.c:1338 +#: libpq/auth.c:1406 libpq/auth.c:1964 libpq/be-secure-gssapi.c:520 +#: postmaster/bgworker.c:349 postmaster/bgworker.c:931 +#: postmaster/postmaster.c:2579 postmaster/postmaster.c:4165 +#: postmaster/postmaster.c:4837 postmaster/postmaster.c:5551 +#: postmaster/postmaster.c:5914 +#: replication/libpqwalreceiver/libpqwalreceiver.c:296 +#: replication/logical/logical.c:205 replication/walsender.c:702 +#: storage/buffer/localbuf.c:442 storage/file/fd.c:892 storage/file/fd.c:1434 +#: storage/file/fd.c:1595 storage/file/fd.c:2409 storage/ipc/procarray.c:1432 +#: storage/ipc/procarray.c:2264 storage/ipc/procarray.c:2271 +#: storage/ipc/procarray.c:2777 storage/ipc/procarray.c:3408 +#: utils/adt/formatting.c:1727 utils/adt/formatting.c:1849 +#: utils/adt/formatting.c:1972 utils/adt/pg_locale.c:450 +#: utils/adt/pg_locale.c:614 utils/adt/regexp.c:224 utils/fmgr/dfmgr.c:229 +#: utils/hash/dynahash.c:513 utils/hash/dynahash.c:613 +#: utils/hash/dynahash.c:1116 utils/mb/mbutils.c:401 utils/mb/mbutils.c:429 +#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5201 +#: utils/misc/guc.c:5217 utils/misc/guc.c:5230 utils/misc/guc.c:8670 +#: utils/misc/tzparser.c:467 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:701 +#: utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:266 +#: utils/mmgr/mcxt.c:888 utils/mmgr/mcxt.c:924 utils/mmgr/mcxt.c:962 +#: utils/mmgr/mcxt.c:1000 utils/mmgr/mcxt.c:1088 utils/mmgr/mcxt.c:1119 +#: utils/mmgr/mcxt.c:1155 utils/mmgr/mcxt.c:1207 utils/mmgr/mcxt.c:1242 +#: utils/mmgr/mcxt.c:1277 utils/mmgr/slab.c:236 +#, c-format +msgid "out of memory" +msgstr "slut på minne" + +#: ../common/cryptohash.c:271 ../common/cryptohash.c:277 +#: ../common/cryptohash_openssl.c:344 ../common/cryptohash_openssl.c:352 +#: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:339 +#: ../common/hmac_openssl.c:347 +msgid "success" +msgstr "lyckades" + +#: ../common/cryptohash.c:273 ../common/cryptohash_openssl.c:346 +#: ../common/hmac_openssl.c:341 +msgid "destination buffer too small" +msgstr "destinationsbuffer för liten" + +#: ../common/cryptohash_openssl.c:348 ../common/hmac_openssl.c:343 +msgid "OpenSSL failure" +msgstr "OpenSSL-fel" + +#: ../common/exec.c:149 ../common/exec.c:266 ../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "kunde inte identifiera aktuell katalog: %m" -#: ../common/exec.c:156 +#: ../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "ogiltig binär \"%s\"" -#: ../common/exec.c:206 +#: ../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "kunde inte läsa binär \"%s\"" -#: ../common/exec.c:214 +#: ../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "kunde inte hitta en \"%s\" att köra" -#: ../common/exec.c:270 ../common/exec.c:309 utils/init/miscinit.c:395 +#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:439 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "kunde inte byta katalog till \"%s\": %m" -#: ../common/exec.c:287 access/transam/xlog.c:10750 -#: replication/basebackup.c:1418 utils/adt/misc.c:337 +#: ../common/exec.c:299 access/transam/xlog.c:8301 +#: replication/basebackup.c:1333 utils/adt/misc.c:342 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "kan inte läsa symbolisk länk \"%s\": %m" -#: ../common/exec.c:410 -#, c-format -msgid "pclose failed: %m" -msgstr "pclose misslyckades: %m" - -#: ../common/exec.c:539 ../common/exec.c:584 ../common/exec.c:676 -#: ../common/psprintf.c:143 ../common/stringinfo.c:305 ../port/path.c:630 -#: ../port/path.c:668 ../port/path.c:685 access/transam/twophase.c:1341 -#: access/transam/xlog.c:6493 lib/dshash.c:246 libpq/auth.c:1090 -#: libpq/auth.c:1491 libpq/auth.c:1559 libpq/auth.c:2089 -#: libpq/be-secure-gssapi.c:484 postmaster/bgworker.c:336 -#: postmaster/bgworker.c:893 postmaster/postmaster.c:2518 -#: postmaster/postmaster.c:2540 postmaster/postmaster.c:4166 -#: postmaster/postmaster.c:4868 postmaster/postmaster.c:4938 -#: postmaster/postmaster.c:5635 postmaster/postmaster.c:5995 -#: replication/libpqwalreceiver/libpqwalreceiver.c:276 -#: replication/logical/logical.c:176 replication/walsender.c:590 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:834 storage/file/fd.c:1304 -#: storage/file/fd.c:1465 storage/file/fd.c:2270 storage/ipc/procarray.c:1045 -#: storage/ipc/procarray.c:1541 storage/ipc/procarray.c:1548 -#: storage/ipc/procarray.c:1972 storage/ipc/procarray.c:2597 -#: utils/adt/cryptohashes.c:45 utils/adt/cryptohashes.c:65 -#: utils/adt/formatting.c:1700 utils/adt/formatting.c:1824 -#: utils/adt/formatting.c:1949 utils/adt/pg_locale.c:484 -#: utils/adt/pg_locale.c:648 utils/adt/regexp.c:223 utils/fmgr/dfmgr.c:229 -#: utils/hash/dynahash.c:450 utils/hash/dynahash.c:559 -#: utils/hash/dynahash.c:1071 utils/mb/mbutils.c:401 utils/mb/mbutils.c:428 -#: utils/mb/mbutils.c:757 utils/mb/mbutils.c:783 utils/misc/guc.c:4846 -#: utils/misc/guc.c:4862 utils/misc/guc.c:4875 utils/misc/guc.c:8041 -#: utils/misc/tzparser.c:467 utils/mmgr/aset.c:475 utils/mmgr/dsa.c:701 -#: utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:233 -#: utils/mmgr/mcxt.c:821 utils/mmgr/mcxt.c:857 utils/mmgr/mcxt.c:895 -#: utils/mmgr/mcxt.c:933 utils/mmgr/mcxt.c:969 utils/mmgr/mcxt.c:1000 -#: utils/mmgr/mcxt.c:1036 utils/mmgr/mcxt.c:1088 utils/mmgr/mcxt.c:1123 -#: utils/mmgr/mcxt.c:1158 utils/mmgr/slab.c:235 +#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1067 +#: storage/ipc/latch.c:1247 storage/ipc/latch.c:1476 storage/ipc/latch.c:1637 +#: storage/ipc/latch.c:1763 #, c-format -msgid "out of memory" -msgstr "slut på minne" +msgid "%s() failed: %m" +msgstr "%s() misslyckades: %m" #: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 #: ../common/fe_memutils.c:98 ../common/fe_memutils.c:162 -#: ../common/psprintf.c:145 ../port/path.c:632 ../port/path.c:670 -#: ../port/path.c:687 utils/misc/ps_status.c:181 utils/misc/ps_status.c:189 +#: ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:791 +#: ../port/path.c:808 utils/misc/ps_status.c:181 utils/misc/ps_status.c:189 #: utils/misc/ps_status.c:219 utils/misc/ps_status.c:227 #, c-format msgid "out of memory\n" @@ -248,141 +304,150 @@ msgstr "slut på minne\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" -#: ../common/file_utils.c:79 ../common/file_utils.c:181 -#: access/transam/twophase.c:1244 access/transam/xlog.c:10854 -#: access/transam/xlog.c:10892 access/transam/xlog.c:11109 -#: access/transam/xlogarchive.c:110 access/transam/xlogarchive.c:226 -#: commands/copy.c:1938 commands/copy.c:3505 commands/extension.c:3425 -#: commands/tablespace.c:795 commands/tablespace.c:886 guc-file.l:1061 -#: replication/basebackup.c:444 replication/basebackup.c:627 -#: replication/basebackup.c:700 replication/logical/snapbuild.c:1522 -#: storage/file/copydir.c:68 storage/file/copydir.c:107 storage/file/fd.c:1816 -#: storage/file/fd.c:3096 storage/file/fd.c:3278 storage/file/fd.c:3364 -#: utils/adt/dbsize.c:70 utils/adt/dbsize.c:222 utils/adt/dbsize.c:302 -#: utils/adt/genfile.c:416 utils/adt/genfile.c:642 +#: ../common/file_utils.c:87 ../common/file_utils.c:451 +#: ../common/file_utils.c:455 access/transam/twophase.c:1316 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:230 +#: commands/copyfrom.c:1525 commands/copyto.c:725 commands/extension.c:3368 +#: commands/tablespace.c:848 commands/tablespace.c:939 guc-file.l:1062 +#: postmaster/pgarch.c:603 replication/basebackup.c:338 +#: replication/basebackup.c:528 replication/basebackup.c:599 +#: replication/logical/snapbuild.c:1537 storage/file/copydir.c:68 +#: storage/file/copydir.c:107 storage/file/fd.c:1951 storage/file/fd.c:2037 +#: storage/file/fd.c:3243 storage/file/fd.c:3450 utils/adt/dbsize.c:92 +#: utils/adt/dbsize.c:244 utils/adt/dbsize.c:324 utils/adt/genfile.c:413 +#: utils/adt/genfile.c:588 utils/adt/misc.c:327 #, c-format msgid "could not stat file \"%s\": %m" msgstr "kunde inte göra stat() på fil \"%s\": %m" -#: ../common/file_utils.c:158 ../common/pgfnames.c:48 commands/tablespace.c:718 -#: commands/tablespace.c:728 postmaster/postmaster.c:1509 -#: storage/file/fd.c:2673 storage/file/reinit.c:122 utils/adt/misc.c:259 +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:771 +#: commands/tablespace.c:781 postmaster/postmaster.c:1571 +#: storage/file/fd.c:2812 storage/file/reinit.c:126 utils/adt/misc.c:235 #: utils/misc/tzparser.c:338 #, c-format msgid "could not open directory \"%s\": %m" msgstr "kunde inte öppna katalog \"%s\": %m" -#: ../common/file_utils.c:192 ../common/pgfnames.c:69 storage/file/fd.c:2685 +#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2824 #, c-format msgid "could not read directory \"%s\": %m" msgstr "kunde inte läsa katalog \"%s\": %m" -#: ../common/file_utils.c:375 access/transam/xlogarchive.c:411 -#: postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1665 -#: replication/slot.c:650 replication/slot.c:1385 replication/slot.c:1527 -#: storage/file/fd.c:714 utils/time/snapmgr.c:1350 +#: ../common/file_utils.c:383 access/transam/xlogarchive.c:419 +#: postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1677 +#: replication/slot.c:709 replication/slot.c:1578 replication/slot.c:1720 +#: storage/file/fd.c:755 storage/file/fd.c:853 utils/time/snapmgr.c:1282 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" -#: ../common/jsonapi.c:1064 +#: ../common/hmac.c:323 +msgid "internal error" +msgstr "internt fel" + +#: ../common/jsonapi.c:1075 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Escape-sekvens \"\\%s\" är ogiltig." -#: ../common/jsonapi.c:1067 +#: ../common/jsonapi.c:1078 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Tecken med värde 0x%02x måste escape:as." -#: ../common/jsonapi.c:1070 +#: ../common/jsonapi.c:1081 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Förväntade slut på indata, men hittade \"%s\"." -#: ../common/jsonapi.c:1073 +#: ../common/jsonapi.c:1084 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Färväntade array-element eller \"]\", men hittade \"%s\"." -#: ../common/jsonapi.c:1076 +#: ../common/jsonapi.c:1087 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "Förväntade \",\" eller \"]\", men hittade \"%s\"." -#: ../common/jsonapi.c:1079 +#: ../common/jsonapi.c:1090 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "Förväntade sig \":\" men hittade \"%s\"." -#: ../common/jsonapi.c:1082 +#: ../common/jsonapi.c:1093 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Förväntade JSON-värde, men hittade \"%s\"." -#: ../common/jsonapi.c:1085 +#: ../common/jsonapi.c:1096 msgid "The input string ended unexpectedly." msgstr "Indatasträngen avslutades oväntat." -#: ../common/jsonapi.c:1087 +#: ../common/jsonapi.c:1098 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Färväntade sträng eller \"}\", men hittade \"%s\"." -#: ../common/jsonapi.c:1090 +#: ../common/jsonapi.c:1101 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "Förväntade sig \",\" eller \"}\" men hittade \"%s\"." -#: ../common/jsonapi.c:1093 +#: ../common/jsonapi.c:1104 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Förväntade sträng, men hittade \"%s\"." -#: ../common/jsonapi.c:1096 +#: ../common/jsonapi.c:1107 #, c-format msgid "Token \"%s\" is invalid." msgstr "Token \"%s\" är ogiltig." -#: ../common/jsonapi.c:1099 jsonpath_scan.l:499 +#: ../common/jsonapi.c:1110 jsonpath_scan.l:495 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kan inte konverteras till text." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:1112 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\" måste följas av fyra hexdecimala siffror." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:1115 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Escape-värden för unicode kan inte användas för kodpunkter med värde över 007F när kodningen inte är UTF8." -#: ../common/jsonapi.c:1106 jsonpath_scan.l:520 +#: ../common/jsonapi.c:1117 jsonpath_scan.l:516 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodes övre surrogathalva får inte komma efter en övre surrogathalva." -#: ../common/jsonapi.c:1108 jsonpath_scan.l:531 jsonpath_scan.l:541 -#: jsonpath_scan.l:583 +#: ../common/jsonapi.c:1119 jsonpath_scan.l:527 jsonpath_scan.l:537 +#: jsonpath_scan.l:579 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicodes lägre surrogathalva måste följa en övre surrogathalva." -#: ../common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatalt: " - -#: ../common/logging.c:243 +#: ../common/logging.c:277 #, c-format msgid "error: " msgstr "fel: " -#: ../common/logging.c:250 +#: ../common/logging.c:284 #, c-format msgid "warning: " msgstr "varning: " +#: ../common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "tips: " + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -398,7 +463,7 @@ msgstr "ogiltigt fork-namn" msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." msgstr "Giltiga fork-värden är \"main\", \"fsm\", \"vm\" och \"init\"." -#: ../common/restricted_token.c:64 libpq/auth.c:1521 libpq/auth.c:2520 +#: ../common/restricted_token.c:64 libpq/auth.c:1368 libpq/auth.c:2400 #, c-format msgid "could not load library \"%s\": error code %lu" msgstr "kunde inte ladda länkbibliotek \"%s\": felkod %lu" @@ -433,13 +498,13 @@ msgstr "kunde inte starta process för kommando \"%s\": felkod %lu" msgid "could not re-execute with restricted token: error code %lu" msgstr "kunde inte köra igen med token för begränsad åtkomst: felkod %lu" -#: ../common/restricted_token.c:194 +#: ../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "kunde inte hämta statuskod för underprocess: felkod %lu" -#: ../common/rmtree.c:79 replication/basebackup.c:1171 -#: replication/basebackup.c:1347 +#: ../common/rmtree.c:79 replication/basebackup.c:1093 +#: replication/basebackup.c:1269 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "kunde inte ta status på fil eller katalog \"%s\": %m" @@ -449,10 +514,17 @@ msgstr "kunde inte ta status på fil eller katalog \"%s\": %m" msgid "could not remove file or directory \"%s\": %m" msgstr "kunde inte ta bort fil eller katalog \"%s\": %m" -#: ../common/saslprep.c:1087 -#, c-format -msgid "password too long" -msgstr "lösenorder är för långt" +#: ../common/scram-common.c:260 +msgid "could not encode salt" +msgstr "kunde inte koda saltet" + +#: ../common/scram-common.c:276 +msgid "could not encode stored key" +msgstr "kunde inte koda den lagrade nyckeln" + +#: ../common/scram-common.c:293 +msgid "could not encode server key" +msgstr "kunde inte koda servernyckeln" #: ../common/stringinfo.c:306 #, c-format @@ -475,7 +547,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "kunde inte slå upp effektivt användar-id %ld: %s" -#: ../common/username.c:45 libpq/auth.c:2027 +#: ../common/username.c:45 libpq/auth.c:1900 msgid "user does not exist" msgstr "användaren finns inte" @@ -514,12 +586,12 @@ msgstr "barnprocess terminerades av signal %d: %s" msgid "child process exited with unrecognized status %d" msgstr "barnprocess avslutade med okänd statuskod %d" -#: ../port/chklocale.c:307 +#: ../port/chklocale.c:306 #, c-format msgid "could not determine encoding for codeset \"%s\"" msgstr "kunde inte bestämma kodning för teckentabell \"%s\"" -#: ../port/chklocale.c:428 ../port/chklocale.c:434 +#: ../port/chklocale.c:427 ../port/chklocale.c:433 #, c-format msgid "could not determine encoding for locale \"%s\": codeset is \"%s\"" msgstr "kunde inte bestämma kodning för lokal \"%s\": teckentabellen är \"%s\"" @@ -544,30 +616,30 @@ msgstr "kunde inte hämta knutpunkt (junction) för \"%s\": %s" msgid "could not get junction for \"%s\": %s\n" msgstr "kunde inte hämta knutpunkt (junction) för \"%s\": %s\n" -#: ../port/open.c:126 +#: ../port/open.c:117 #, c-format msgid "could not open file \"%s\": %s" msgstr "kunde inte öppna fil \"%s\": %s" -#: ../port/open.c:127 +#: ../port/open.c:118 msgid "lock violation" msgstr "lås-överträdelse" -#: ../port/open.c:127 +#: ../port/open.c:118 msgid "sharing violation" msgstr "sharing-överträdelse" -#: ../port/open.c:128 +#: ../port/open.c:119 #, c-format msgid "Continuing to retry for 30 seconds." msgstr "Fortsätter att försöka i 30 sekunder." -#: ../port/open.c:129 +#: ../port/open.c:120 #, c-format msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "Du kan ha antivirus, backup eller liknande mjukvara som stör databassystemet" -#: ../port/path.c:654 +#: ../port/path.c:775 #, c-format msgid "could not get current working directory: %s\n" msgstr "kunde inte fastställa nuvarande arbetskatalog: %s\n" @@ -577,6 +649,16 @@ msgstr "kunde inte fastställa nuvarande arbetskatalog: %s\n" msgid "operating system error %d" msgstr "operativsystemfel %d" +#: ../port/thread.c:100 ../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "kunde inte slå upp lokalt användar-id %d: %s" + +#: ../port/thread.c:105 ../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "lokal användare med ID %d existerar inte" + #: ../port/win32security.c:62 #, c-format msgid "could not get SID for Administrators group: error code %lu\n" @@ -592,95 +674,121 @@ msgstr "kunde inte hämta SID för PowerUser-grupp: felkod %lu\n" msgid "could not check access token membership: error code %lu\n" msgstr "kunde inte kontrollera access-token-medlemskap: felkod %lu\n" -#: access/brin/brin.c:210 +#: access/brin/brin.c:215 #, c-format msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "förfrågan efter BRIN-intervallsummering för index \"%s\" sida %u har inte spelats in" -#: access/brin/brin.c:873 access/brin/brin.c:950 access/gin/ginfast.c:1035 -#: access/transam/xlog.c:10522 access/transam/xlog.c:11060 -#: access/transam/xlogfuncs.c:274 access/transam/xlogfuncs.c:301 -#: access/transam/xlogfuncs.c:340 access/transam/xlogfuncs.c:361 -#: access/transam/xlogfuncs.c:382 access/transam/xlogfuncs.c:452 -#: access/transam/xlogfuncs.c:509 +#: access/brin/brin.c:1019 access/brin/brin.c:1114 access/gin/ginfast.c:1035 +#: access/transam/xlogfuncs.c:165 access/transam/xlogfuncs.c:192 +#: access/transam/xlogfuncs.c:231 access/transam/xlogfuncs.c:252 +#: access/transam/xlogfuncs.c:273 access/transam/xlogfuncs.c:343 +#: access/transam/xlogfuncs.c:401 #, c-format msgid "recovery is in progress" msgstr "återställning pågår" -#: access/brin/brin.c:874 access/brin/brin.c:951 +#: access/brin/brin.c:1020 access/brin/brin.c:1115 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "BRIN-kontrollfunktioner kan inte köras under återställning." -#: access/brin/brin.c:882 access/brin/brin.c:959 +#: access/brin/brin.c:1025 access/brin/brin.c:1120 #, c-format -msgid "block number out of range: %s" -msgstr "blocknummer är utanför giltigt intervall: %s" +msgid "block number out of range: %lld" +msgstr "blocknummer är utanför giltigt intervall: %lld" -#: access/brin/brin.c:905 access/brin/brin.c:982 +#: access/brin/brin.c:1063 access/brin/brin.c:1146 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\" är inte ett BRIN-index" -#: access/brin/brin.c:921 access/brin/brin.c:998 +#: access/brin/brin.c:1079 access/brin/brin.c:1162 #, c-format -msgid "could not open parent table of index %s" -msgstr "kunde inte öppna föräldratabell för index %s" +msgid "could not open parent table of index \"%s\"" +msgstr "kunde inte öppna föräldratabell för index \"%s\"" + +#: access/brin/brin_bloom.c:750 access/brin/brin_bloom.c:792 +#: access/brin/brin_minmax_multi.c:3004 access/brin/brin_minmax_multi.c:3147 +#: statistics/dependencies.c:663 statistics/dependencies.c:716 +#: statistics/mcv.c:1484 statistics/mcv.c:1515 statistics/mvdistinct.c:344 +#: statistics/mvdistinct.c:397 utils/adt/pseudotypes.c:43 +#: utils/adt/pseudotypes.c:77 utils/adt/pseudotypes.c:252 +#, c-format +msgid "cannot accept a value of type %s" +msgstr "kan inte acceptera ett värde av type %s" + +#: access/brin/brin_minmax_multi.c:2163 access/brin/brin_minmax_multi.c:2170 +#: access/brin/brin_minmax_multi.c:2177 utils/adt/timestamp.c:938 +#: utils/adt/timestamp.c:1509 utils/adt/timestamp.c:2761 +#: utils/adt/timestamp.c:2778 utils/adt/timestamp.c:2831 +#: utils/adt/timestamp.c:2870 utils/adt/timestamp.c:3115 +#: utils/adt/timestamp.c:3120 utils/adt/timestamp.c:3125 +#: utils/adt/timestamp.c:3175 utils/adt/timestamp.c:3182 +#: utils/adt/timestamp.c:3189 utils/adt/timestamp.c:3209 +#: utils/adt/timestamp.c:3216 utils/adt/timestamp.c:3223 +#: utils/adt/timestamp.c:3253 utils/adt/timestamp.c:3261 +#: utils/adt/timestamp.c:3305 utils/adt/timestamp.c:3731 +#: utils/adt/timestamp.c:3855 utils/adt/timestamp.c:4405 +#, c-format +msgid "interval out of range" +msgstr "interval utanför giltigt intervall" #: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 #: access/brin/brin_pageops.c:843 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1435 access/spgist/spgdoinsert.c:1957 +#: access/gist/gist.c:1443 access/spgist/spgdoinsert.c:2001 +#: access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "indexradstorlek %zu överstiger maximum %zu för index \"%s\"" -#: access/brin/brin_revmap.c:392 access/brin/brin_revmap.c:398 +#: access/brin/brin_revmap.c:393 access/brin/brin_revmap.c:399 #, c-format msgid "corrupted BRIN index: inconsistent range map" msgstr "trasigt BRIN-index: inkonsistent intervall-map" -#: access/brin/brin_revmap.c:601 +#: access/brin/brin_revmap.c:602 #, c-format msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" msgstr "oväntad sidtyp 0x%04X i BRIN-index \"%s\" block %u" #: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:151 -#: access/gist/gistvalidate.c:149 access/hash/hashvalidate.c:136 -#: access/nbtree/nbtvalidate.c:117 access/spgist/spgvalidate.c:168 +#: access/gist/gistvalidate.c:153 access/hash/hashvalidate.c:139 +#: access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:189 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with invalid support number %d" msgstr "operatorfamilj \"%s\" för accessmetod %s innehåller funktion %s med ogiltigt supportnummer %d" #: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:163 -#: access/gist/gistvalidate.c:161 access/hash/hashvalidate.c:115 -#: access/nbtree/nbtvalidate.c:129 access/spgist/spgvalidate.c:180 +#: access/gist/gistvalidate.c:165 access/hash/hashvalidate.c:118 +#: access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:201 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with wrong signature for support number %d" msgstr "operatorfamilj \"%s\" för accessmetod %s innehåller funktion %s med felaktig signatur för supportnummer %d" #: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:182 -#: access/gist/gistvalidate.c:181 access/hash/hashvalidate.c:157 -#: access/nbtree/nbtvalidate.c:149 access/spgist/spgvalidate.c:200 +#: access/gist/gistvalidate.c:185 access/hash/hashvalidate.c:160 +#: access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:221 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with invalid strategy number %d" msgstr "operatorfamilj \"%s\" för accessmetod %s innehåller operator %s med ogiltigt strateginummer %d" #: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:195 -#: access/hash/hashvalidate.c:170 access/nbtree/nbtvalidate.c:162 -#: access/spgist/spgvalidate.c:216 +#: access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 +#: access/spgist/spgvalidate.c:237 #, c-format msgid "operator family \"%s\" of access method %s contains invalid ORDER BY specification for operator %s" msgstr "operatorfamilj \"%s\" för accessmetod %s innehåller ogiltig ORDER BY-specifikatioon för operator %s" #: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:208 -#: access/gist/gistvalidate.c:229 access/hash/hashvalidate.c:183 -#: access/nbtree/nbtvalidate.c:175 access/spgist/spgvalidate.c:232 +#: access/gist/gistvalidate.c:233 access/hash/hashvalidate.c:186 +#: access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:253 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with wrong signature" msgstr "operatorfamilj \"%s\" för accessmetod %s innehåller operator %s med felaktig signatur" -#: access/brin/brin_validate.c:236 access/hash/hashvalidate.c:223 -#: access/nbtree/nbtvalidate.c:233 access/spgist/spgvalidate.c:259 +#: access/brin/brin_validate.c:236 access/hash/hashvalidate.c:226 +#: access/nbtree/nbtvalidate.c:236 access/spgist/spgvalidate.c:280 #, c-format msgid "operator family \"%s\" of access method %s is missing operator(s) for types %s and %s" msgstr "operatorfamilj \"%s\" för accessmetod %s saknar operator(er) för typerna %s och %s" @@ -690,14 +798,14 @@ msgstr "operatorfamilj \"%s\" för accessmetod %s saknar operator(er) för typer msgid "operator family \"%s\" of access method %s is missing support function(s) for types %s and %s" msgstr "operatorfamilj \"%s\" för accessmetod %s saknas supportfunktion(er) för typerna %s och %s" -#: access/brin/brin_validate.c:259 access/hash/hashvalidate.c:237 -#: access/nbtree/nbtvalidate.c:257 access/spgist/spgvalidate.c:294 +#: access/brin/brin_validate.c:259 access/hash/hashvalidate.c:240 +#: access/nbtree/nbtvalidate.c:260 access/spgist/spgvalidate.c:315 #, c-format msgid "operator class \"%s\" of access method %s is missing operator(s)" msgstr "operatorklass \"%s\" för accessmetoden %s saknar operator(er)" #: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:250 -#: access/gist/gistvalidate.c:270 +#: access/gist/gistvalidate.c:274 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d" msgstr "operatorklass \"%s\" för accessmetod %s saknar supportfunktion %d" @@ -737,92 +845,102 @@ msgstr "antalet kolumner (%d) överskrider gränsen (%d)" msgid "number of index columns (%d) exceeds limit (%d)" msgstr "antalet indexerade kolumner (%d) överskrider gränsen (%d)" -#: access/common/indextuple.c:187 access/spgist/spgutils.c:703 +#: access/common/indextuple.c:190 access/spgist/spgutils.c:959 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "indexrad kräver %zu byte, maximal storlek är %zu" -#: access/common/printtup.c:369 tcop/fastpath.c:180 tcop/fastpath.c:530 -#: tcop/postgres.c:1904 +#: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 +#: tcop/postgres.c:1914 #, c-format msgid "unsupported format code: %d" msgstr "ej stödd formatkod: %d" -#: access/common/reloptions.c:506 +#: access/common/reloptions.c:521 access/common/reloptions.c:532 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "Giltiga värden är \"on\", \"off\" och \"auto\"." -#: access/common/reloptions.c:517 +#: access/common/reloptions.c:543 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "Giltiga värden är \"local\" och \"cascaded\"." -#: access/common/reloptions.c:665 +#: access/common/reloptions.c:691 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "överskriden gräns för användardefinierade relationsparametertyper" -#: access/common/reloptions.c:1208 +#: access/common/reloptions.c:1234 #, c-format msgid "RESET must not include values for parameters" msgstr "RESET får inte ha med värden på parametrar" -#: access/common/reloptions.c:1240 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "okänd parameternamnrymd \"%s\"" -#: access/common/reloptions.c:1277 utils/misc/guc.c:12032 +#: access/common/reloptions.c:1303 utils/misc/guc.c:12885 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "tabeller deklarerade med WITH OIDS stöds inte" -#: access/common/reloptions.c:1447 +#: access/common/reloptions.c:1473 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "okänd parameter \"%s\"" -#: access/common/reloptions.c:1559 +#: access/common/reloptions.c:1585 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "parameter \"%s\" angiven mer än en gång" -#: access/common/reloptions.c:1575 +#: access/common/reloptions.c:1601 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "ogiltigt värde för booleansk flagga \"%s\": \"%s\"" -#: access/common/reloptions.c:1587 +#: access/common/reloptions.c:1613 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "ogiltigt värde för heltalsflagga \"%s\": \"%s\"" -#: access/common/reloptions.c:1593 access/common/reloptions.c:1613 +#: access/common/reloptions.c:1619 access/common/reloptions.c:1639 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "värdet %s är utanför sitt intervall för flaggan \"%s\"" -#: access/common/reloptions.c:1595 +#: access/common/reloptions.c:1621 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Giltiga värden är mellan \"%d\" och \"%d\"." -#: access/common/reloptions.c:1607 +#: access/common/reloptions.c:1633 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "ogiltigt värde för flyttalsflagga \"%s\": %s" -#: access/common/reloptions.c:1615 +#: access/common/reloptions.c:1641 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Giltiga värden är mellan \"%f\" och \"%f\"." -#: access/common/reloptions.c:1637 +#: access/common/reloptions.c:1663 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "ogiltigt värde för enum-flagga \"%s\": %s" -#: access/common/tupdesc.c:842 parser/parse_clause.c:772 -#: parser/parse_relation.c:1803 +#: access/common/toast_compression.c:32 +#, c-format +msgid "compression method lz4 not supported" +msgstr "komprimeringsmetod lz4 stöds ej" + +#: access/common/toast_compression.c:33 +#, c-format +msgid "This functionality requires the server to be built with lz4 support." +msgstr "Denna funktionalitet kräver att servern byggts med lz4-stöd." + +#: access/common/tupdesc.c:825 parser/parse_clause.c:773 +#: parser/parse_relation.c:1849 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "kolumn \"%s\" kan inte deklareras som SETOF" @@ -852,7 +970,7 @@ msgstr "\"%s\" är inte ett GIN-index" msgid "cannot access temporary indexes of other sessions" msgstr "kan inte flytta temporära index tillhörande andra sessioner" -#: access/gin/ginget.c:270 access/nbtree/nbtinsert.c:745 +#: access/gin/ginget.c:271 access/nbtree/nbtinsert.c:760 #, c-format msgid "failed to re-find tuple within index \"%s\"" msgstr "misslyckades att återfinna tuple i index \"%s\"" @@ -867,15 +985,15 @@ msgstr "gamla GIN-index stöder inte hela-index-scan eller sökningar efter null msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "För att fixa detta, kör REINDEX INDEX \"%s\"." -#: access/gin/ginutil.c:144 executor/execExpr.c:1862 -#: utils/adt/arrayfuncs.c:3790 utils/adt/arrayfuncs.c:6418 -#: utils/adt/rowtypes.c:936 +#: access/gin/ginutil.c:146 executor/execExpr.c:2182 +#: utils/adt/arrayfuncs.c:3819 utils/adt/arrayfuncs.c:6488 +#: utils/adt/rowtypes.c:957 #, c-format msgid "could not identify a comparison function for type %s" msgstr "kunde inte hitta någon jämförelsefunktion för typen %s" #: access/gin/ginvalidate.c:92 access/gist/gistvalidate.c:93 -#: access/hash/hashvalidate.c:99 access/spgist/spgvalidate.c:99 +#: access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 #, c-format msgid "operator family \"%s\" of access method %s contains support function %s with different left and right input types" msgstr "operatorfamilj \"%s\" för accessmetod %s innehåller supportfunktion %s med olika vänster- och höger-inputtyper" @@ -885,25 +1003,36 @@ msgstr "operatorfamilj \"%s\" för accessmetod %s innehåller supportfunktion %s msgid "operator class \"%s\" of access method %s is missing support function %d or %d" msgstr "operatorklass \"%s\" för accessmetod \"%s\" saknar supportfunktion %d eller %d" -#: access/gist/gist.c:753 access/gist/gistvacuum.c:408 +#: access/gin/ginvalidate.c:333 access/gist/gistvalidate.c:350 +#: access/spgist/spgvalidate.c:387 +#, c-format +msgid "support function number %d is invalid for access method %s" +msgstr "supportfunktionsnummer %d är ogiltig för accessmetod %s" + +#: access/gist/gist.c:760 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "index \"%s\" innehåller en inre tupel som är markerad ogiltig" -#: access/gist/gist.c:755 access/gist/gistvacuum.c:410 +#: access/gist/gist.c:762 access/gist/gistvacuum.c:428 #, c-format msgid "This is caused by an incomplete page split at crash recovery before upgrading to PostgreSQL 9.1." msgstr "Detta orsakas av en inkomplett siduppdelning under krashåterställning körd innan uppdatering till PostgreSQL 9.1." -#: access/gist/gist.c:756 access/gist/gistutil.c:786 access/gist/gistutil.c:797 -#: access/gist/gistvacuum.c:411 access/hash/hashutil.c:227 +#: access/gist/gist.c:763 access/gist/gistutil.c:801 access/gist/gistutil.c:812 +#: access/gist/gistvacuum.c:429 access/hash/hashutil.c:227 #: access/hash/hashutil.c:238 access/hash/hashutil.c:250 -#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:741 -#: access/nbtree/nbtpage.c:752 +#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:810 +#: access/nbtree/nbtpage.c:821 #, c-format msgid "Please REINDEX it." msgstr "Var vänlig och kör REINDEX på det." +#: access/gist/gist.c:1177 +#, c-format +msgid "fixing incomplete split in index \"%s\", block %u" +msgstr "lagar ofärdig split i index \"%s\", block %u" + #: access/gist/gistsplit.c:446 #, c-format msgid "picksplit method for column %d of index \"%s\" failed" @@ -914,63 +1043,62 @@ msgstr "picksplit-metod för kolumn %d i index \"%s\" misslyckades" msgid "The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command." msgstr "Indexet är inte optimalt. För att optimera det, kontakta en utvecklare eller försök använda kolumnen som det andra värdet i CREATE INDEX-kommandot." -#: access/gist/gistutil.c:783 access/hash/hashutil.c:224 -#: access/nbtree/nbtpage.c:738 +#: access/gist/gistutil.c:798 access/hash/hashutil.c:224 +#: access/nbtree/nbtpage.c:807 #, c-format msgid "index \"%s\" contains unexpected zero page at block %u" msgstr "index \"%s\" innehåller en oväntad nollställd sida vid block %u" -#: access/gist/gistutil.c:794 access/hash/hashutil.c:235 -#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:749 +#: access/gist/gistutil.c:809 access/hash/hashutil.c:235 +#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:818 #, c-format msgid "index \"%s\" contains corrupted page at block %u" msgstr "index \"%s\" har en trasig sida vid block %u" -#: access/gist/gistvalidate.c:199 +#: access/gist/gistvalidate.c:203 #, c-format msgid "operator family \"%s\" of access method %s contains unsupported ORDER BY specification for operator %s" msgstr "operatorfamiljen \"%s\" för accessmetod %s innehåller en ORDER BY som inte stöds för operator %s" -#: access/gist/gistvalidate.c:210 +#: access/gist/gistvalidate.c:214 #, c-format msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY opfamily specification for operator %s" msgstr "operatorfamiljen \"%s\" för accessmetod %s innehåller en inkorrekt ORDER BY \"opfamiily\"-specifikation för operator %s" -#: access/hash/hashfunc.c:255 access/hash/hashfunc.c:311 -#: utils/adt/varchar.c:993 utils/adt/varchar.c:1053 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:334 +#: utils/adt/varchar.c:1003 utils/adt/varchar.c:1063 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "kunde inte bestämma vilken jämförelse (collation) som skall användas för sträng-hashning" -#: access/hash/hashfunc.c:256 access/hash/hashfunc.c:312 catalog/heap.c:702 -#: catalog/heap.c:708 commands/createas.c:206 commands/createas.c:489 -#: commands/indexcmds.c:1814 commands/tablecmds.c:16035 commands/view.c:86 -#: parser/parse_utilcmd.c:4203 regex/regc_pg_locale.c:263 -#: utils/adt/formatting.c:1667 utils/adt/formatting.c:1791 -#: utils/adt/formatting.c:1916 utils/adt/like.c:194 -#: utils/adt/like_support.c:1003 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:994 utils/adt/varchar.c:1054 utils/adt/varlena.c:1476 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:335 catalog/heap.c:665 +#: catalog/heap.c:671 commands/createas.c:206 commands/createas.c:503 +#: commands/indexcmds.c:1912 commands/tablecmds.c:17413 commands/view.c:86 +#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1685 +#: utils/adt/formatting.c:1807 utils/adt/formatting.c:1930 utils/adt/like.c:190 +#: utils/adt/like_support.c:1024 utils/adt/varchar.c:733 +#: utils/adt/varchar.c:1004 utils/adt/varchar.c:1064 utils/adt/varlena.c:1499 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "Använd en COLLATE-klausul för att sätta jämförelsen explicit." -#: access/hash/hashinsert.c:82 +#: access/hash/hashinsert.c:83 #, c-format msgid "index row size %zu exceeds hash maximum %zu" msgstr "indexradstorlek %zu överstiger hash-maximum %zu" -#: access/hash/hashinsert.c:84 access/spgist/spgdoinsert.c:1961 -#: access/spgist/spgutils.c:764 +#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1020 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "Värden större än en buffert-sida kan inte indexeras." -#: access/hash/hashovfl.c:87 +#: access/hash/hashovfl.c:88 #, c-format msgid "invalid overflow block number %u" msgstr "ogiltigt overflow-blocknummer %u" -#: access/hash/hashovfl.c:283 access/hash/hashpage.c:453 +#: access/hash/hashovfl.c:284 access/hash/hashpage.c:454 #, c-format msgid "out of overflow pages in hash index \"%s\"" msgstr "slut på överspillsidor i hash-index \"%s\"" @@ -990,321 +1118,323 @@ msgstr "index \"%s\" är inte ett hashträd" msgid "index \"%s\" has wrong hash version" msgstr "index \"%s\" har fel hash-version" -#: access/hash/hashvalidate.c:195 +#: access/hash/hashvalidate.c:198 #, c-format msgid "operator family \"%s\" of access method %s lacks support function for operator %s" msgstr "operatorfamilj \"%s\" för accessmetod %s saknar supportfunktion för operator %s" -#: access/hash/hashvalidate.c:253 access/nbtree/nbtvalidate.c:273 +#: access/hash/hashvalidate.c:256 access/nbtree/nbtvalidate.c:276 #, c-format msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "operatorfamilj \"%s\" för accessmetod %s saknar mellan-typ-operator(er)" -#: access/heap/heapam.c:2024 +#: access/heap/heapam.c:2226 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "kan inte lägga till tupler i en parellell arbetare" -#: access/heap/heapam.c:2442 +#: access/heap/heapam.c:2697 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "kan inte radera tupler under en parallell operation" -#: access/heap/heapam.c:2488 +#: access/heap/heapam.c:2743 #, c-format msgid "attempted to delete invisible tuple" msgstr "försökte ta bort en osynlig tuple" -#: access/heap/heapam.c:2914 access/heap/heapam.c:5703 +#: access/heap/heapam.c:3175 access/heap/heapam.c:6017 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "kan inte uppdatera tupler under en parallell operation" -#: access/heap/heapam.c:3047 +#: access/heap/heapam.c:3299 #, c-format msgid "attempted to update invisible tuple" msgstr "försökte uppdatera en osynlig tuple" -#: access/heap/heapam.c:4358 access/heap/heapam.c:4396 -#: access/heap/heapam.c:4653 access/heap/heapam_handler.c:450 +#: access/heap/heapam.c:4661 access/heap/heapam.c:4699 +#: access/heap/heapam.c:4964 access/heap/heapam_handler.c:456 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "kunde inte låsa rad i relationen \"%s\"" -#: access/heap/heapam_handler.c:399 +#: access/heap/heapam_handler.c:401 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update" msgstr "tupel som skall låsas har redan flyttats till en annan partition av en samtida uppdatering" -#: access/heap/hio.c:345 access/heap/rewriteheap.c:662 +#: access/heap/hio.c:360 access/heap/rewriteheap.c:660 #, c-format msgid "row is too big: size %zu, maximum size %zu" msgstr "raden är för stor: storlek %zu, maximal storlek %zu" -#: access/heap/rewriteheap.c:921 +#: access/heap/rewriteheap.c:920 #, c-format msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "kunde inte skriva till fil \"%s\", skrev %d av %d: %m." -#: access/heap/rewriteheap.c:1015 access/heap/rewriteheap.c:1134 +#: access/heap/rewriteheap.c:1013 access/heap/rewriteheap.c:1131 #: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:3300 access/transam/xlog.c:3472 -#: access/transam/xlog.c:4670 access/transam/xlog.c:10869 -#: access/transam/xlog.c:10907 access/transam/xlog.c:11312 -#: access/transam/xlogfuncs.c:735 postmaster/postmaster.c:4629 -#: replication/logical/origin.c:575 replication/slot.c:1446 -#: storage/file/copydir.c:167 storage/smgr/md.c:218 utils/time/snapmgr.c:1329 +#: access/transam/xlog.c:2963 access/transam/xlog.c:3176 +#: access/transam/xlog.c:3964 access/transam/xlog.c:8635 +#: access/transam/xlogfuncs.c:594 commands/dbcommands.c:521 +#: postmaster/postmaster.c:4592 postmaster/postmaster.c:5613 +#: replication/basebackup_server.c:149 replication/basebackup_server.c:242 +#: replication/logical/origin.c:587 replication/slot.c:1639 +#: storage/file/copydir.c:167 storage/smgr/md.c:222 utils/time/snapmgr.c:1261 #, c-format msgid "could not create file \"%s\": %m" msgstr "kan inte skapa fil \"%s\": %m" -#: access/heap/rewriteheap.c:1144 +#: access/heap/rewriteheap.c:1141 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "kunde inte trunkera fil \"%s\" till %u: %m" -#: access/heap/rewriteheap.c:1162 access/transam/timeline.c:384 +#: access/heap/rewriteheap.c:1159 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3356 access/transam/xlog.c:3528 -#: access/transam/xlog.c:4682 postmaster/postmaster.c:4639 -#: postmaster/postmaster.c:4649 replication/logical/origin.c:587 -#: replication/logical/origin.c:629 replication/logical/origin.c:648 -#: replication/logical/snapbuild.c:1622 replication/slot.c:1481 -#: storage/file/buffile.c:502 storage/file/copydir.c:207 -#: utils/init/miscinit.c:1391 utils/init/miscinit.c:1402 -#: utils/init/miscinit.c:1410 utils/misc/guc.c:8024 utils/misc/guc.c:8055 -#: utils/misc/guc.c:9975 utils/misc/guc.c:9989 utils/time/snapmgr.c:1334 -#: utils/time/snapmgr.c:1341 +#: access/transam/xlog.c:3035 access/transam/xlog.c:3232 +#: access/transam/xlog.c:3976 commands/dbcommands.c:533 +#: postmaster/postmaster.c:4602 postmaster/postmaster.c:4612 +#: replication/logical/origin.c:599 replication/logical/origin.c:641 +#: replication/logical/origin.c:660 replication/logical/snapbuild.c:1634 +#: replication/slot.c:1674 storage/file/buffile.c:537 +#: storage/file/copydir.c:207 utils/init/miscinit.c:1441 +#: utils/init/miscinit.c:1452 utils/init/miscinit.c:1460 utils/misc/guc.c:8653 +#: utils/misc/guc.c:8684 utils/misc/guc.c:10655 utils/misc/guc.c:10669 +#: utils/time/snapmgr.c:1266 utils/time/snapmgr.c:1273 #, c-format msgid "could not write to file \"%s\": %m" msgstr "kunde inte skriva till fil \"%s\": %m" -#: access/heap/rewriteheap.c:1252 access/transam/twophase.c:1609 -#: access/transam/xlogarchive.c:118 access/transam/xlogarchive.c:421 -#: postmaster/postmaster.c:1092 postmaster/syslogger.c:1465 -#: replication/logical/origin.c:563 replication/logical/reorderbuffer.c:3079 -#: replication/logical/snapbuild.c:1564 replication/logical/snapbuild.c:2006 -#: replication/slot.c:1578 storage/file/fd.c:754 storage/file/fd.c:3116 -#: storage/file/fd.c:3178 storage/file/reinit.c:255 storage/ipc/dsm.c:302 -#: storage/smgr/md.c:311 storage/smgr/md.c:367 storage/sync/sync.c:210 -#: utils/time/snapmgr.c:1674 +#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1705 +#: access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:429 +#: postmaster/postmaster.c:1152 postmaster/syslogger.c:1537 +#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4398 +#: replication/logical/snapbuild.c:1579 replication/logical/snapbuild.c:1995 +#: replication/slot.c:1771 storage/file/fd.c:795 storage/file/fd.c:3263 +#: storage/file/fd.c:3325 storage/file/reinit.c:262 storage/ipc/dsm.c:317 +#: storage/smgr/md.c:348 storage/smgr/md.c:398 storage/sync/sync.c:250 +#: utils/time/snapmgr.c:1606 #, c-format msgid "could not remove file \"%s\": %m" msgstr "kunde inte ta bort fil \"%s\": %m" -#: access/heap/vacuumlazy.c:648 +#: access/heap/vacuumlazy.c:407 +#, c-format +msgid "aggressively vacuuming \"%s.%s.%s\"" +msgstr "aggressiv vaccum av \"%s.%s.%s\"" + +#: access/heap/vacuumlazy.c:412 +#, c-format +msgid "vacuuming \"%s.%s.%s\"" +msgstr "kör vaccum på \"%s.%s.%s\"" + +#: access/heap/vacuumlazy.c:663 +#, c-format +msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" +msgstr "avslutade vacuum av \"%s.%s.%s\": indexskanningar: %d\n" + +#: access/heap/vacuumlazy.c:674 #, c-format msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisk aggressiv vacuum för att förhindra \"wraparound\" av tabell \"%s.%s.%s\": indexskanningar: %d\n" -#: access/heap/vacuumlazy.c:650 +#: access/heap/vacuumlazy.c:676 #, c-format msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisk vacuum för att förhindra \"wraparound\" av tabell \"%s.%s.%s\": indexskanningar: %d\n" -#: access/heap/vacuumlazy.c:655 +#: access/heap/vacuumlazy.c:681 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisk vacuum av tabell \"%s.%s.%s\": indexskanningar: %d\n" -#: access/heap/vacuumlazy.c:657 +#: access/heap/vacuumlazy.c:683 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisk vacuum av tabell \"%s.%s.%s\": indexskanningar: %d\n" -#: access/heap/vacuumlazy.c:664 -#, c-format -msgid "pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n" -msgstr "sidor: %u borttagna, %u kvar, %u överhoppade pga pins, %u överhoppade frysta\n" - -#: access/heap/vacuumlazy.c:670 -#, c-format -msgid "tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable, oldest xmin: %u\n" -msgstr "tupler: %.0f borttagna, %.0f kvar, %.0f är döda men ännu inte möjliga att ta bort, äldsta xmin: %u\n" - -#: access/heap/vacuumlazy.c:676 -#, c-format -msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" -msgstr "bufferanvändning: %lld träffar, %lld missar, %lld nersmutsade\n" - -#: access/heap/vacuumlazy.c:680 +#: access/heap/vacuumlazy.c:690 #, c-format -msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" -msgstr "snitt läshastighet: %.3f MB/s, snitt skrivhastighet: %.3f MB/s\n" +msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" +msgstr "sidor: %u borttagna, %u kvar, %u skannade (%-2f%% av totala antalet)\n" -#: access/heap/vacuumlazy.c:682 +#: access/heap/vacuumlazy.c:697 #, c-format -msgid "system usage: %s\n" -msgstr "systemanvändning: %s\n" +msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" +msgstr "tupler: %lld borttagna, %lld kvar, %lld är döda men ännu inte möjliga att ta bort\n" -#: access/heap/vacuumlazy.c:684 +#: access/heap/vacuumlazy.c:703 #, c-format -msgid "WAL usage: %ld records, %ld full page images, %llu bytes" -msgstr "WAL-användning: %ld poster, %ld hela sidor, %llu bytes" +msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" +msgstr "tupler missade: %lld döda från %u sidor som inte tagits bort på grund av låstvister vid städning\n" -#: access/heap/vacuumlazy.c:795 -#, c-format -msgid "aggressively vacuuming \"%s.%s\"" -msgstr "aggressiv vaccum av \"%s.%s\"" +#: access/heap/vacuumlazy.c:708 +#, fuzzy, c-format +#| msgid "removable cutoff: %u, older by %d xids when operation ended\n" +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "gräns för borttagning: %u, åldrades med %d xid:er när operationen avslutades\n" -#: access/heap/vacuumlazy.c:800 commands/cluster.c:874 -#, c-format -msgid "vacuuming \"%s.%s\"" -msgstr "kör vaccum på \"%s.%s\"" +#: access/heap/vacuumlazy.c:714 +#, fuzzy, c-format +#| msgid "new relfrozenxid: %u, which is %d xids ahead of previous value\n" +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" +msgstr "ny relfrozenxid: %u, som är %d xid:er före tidigare värde\n" -#: access/heap/vacuumlazy.c:837 -#, c-format -msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" -msgstr "stänger av parallell-flaggan för vacuumn på \"%s\" --- kan inte köra vacuum på temporära tabeller parallellt" +#: access/heap/vacuumlazy.c:721 +#, fuzzy, c-format +#| msgid "new relminmxid: %u, which is %d mxids ahead of previous value\n" +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" +msgstr "ny relminmxid: %u, som är %d mxid:er för tidigare värde\n" -#: access/heap/vacuumlazy.c:1725 -#, c-format -msgid "\"%s\": removed %.0f row versions in %u pages" -msgstr "\"%s\": tog bort %.0f radversioner i %u sidor" +#: access/heap/vacuumlazy.c:727 +msgid "index scan not needed: " +msgstr "index-scan behövdes inte: " -#: access/heap/vacuumlazy.c:1735 -#, c-format -msgid "%.0f dead row versions cannot be removed yet, oldest xmin: %u\n" -msgstr "%.0f döda radversioner kan inte tas bort än, äldsta xmin: %u\n" +#: access/heap/vacuumlazy.c:729 +msgid "index scan needed: " +msgstr "index-scan behövdes: " -#: access/heap/vacuumlazy.c:1737 +#: access/heap/vacuumlazy.c:731 #, c-format -msgid "There were %.0f unused item identifiers.\n" -msgstr "Det fanns %.0f oanvända post-identifierare.\n" +msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" +msgstr "%u sidor i tabell (%.2f%% av totalt) hade %lld döda postidentifierare borttagna\n" -#: access/heap/vacuumlazy.c:1739 -#, c-format -msgid "Skipped %u page due to buffer pins, " -msgid_plural "Skipped %u pages due to buffer pins, " -msgstr[0] "Hoppade över %u sida på grund av fastnålade buffrar, " -msgstr[1] "Hoppade över %u sidor på grund av fastnålade buffrar, " +#: access/heap/vacuumlazy.c:736 +msgid "index scan bypassed: " +msgstr "index-scan överhoppad: " -#: access/heap/vacuumlazy.c:1743 -#, c-format -msgid "%u frozen page.\n" -msgid_plural "%u frozen pages.\n" -msgstr[0] "%u fryst sida.\n" -msgstr[1] "%u frysta sidor.\n" +#: access/heap/vacuumlazy.c:738 +msgid "index scan bypassed by failsafe: " +msgstr "index-scan överhoppad av felsäkerhetsfunktion: " -#: access/heap/vacuumlazy.c:1747 +#: access/heap/vacuumlazy.c:740 #, c-format -msgid "%u page is entirely empty.\n" -msgid_plural "%u pages are entirely empty.\n" -msgstr[0] "%u sida är helt tom.\n" -msgstr[1] "%u sidor är helt tomma.\n" +msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" +msgstr "%u sidor från tabell (%.2f%% totalt) har %lld döda postidentifierare\n" -#: access/heap/vacuumlazy.c:1751 commands/indexcmds.c:3487 -#: commands/indexcmds.c:3505 +#: access/heap/vacuumlazy.c:755 #, c-format -msgid "%s." -msgstr "%s." +msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" +msgstr "index \"%s\": sidor: %u totalt, %u tidigare borttagna, %u nuvarande borttagna, %u återanvändbara\n" -#: access/heap/vacuumlazy.c:1754 +#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 #, c-format -msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u out of %u pages" -msgstr "\"%s\": hittade %.0f borttagbara, %.0f ej borttagbara radversioner i %u av %u sidor" +msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" +msgstr "I/O-timing: läs: %.3f ms, skriv: %.3f ms\n" -#: access/heap/vacuumlazy.c:1888 +#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 #, c-format -msgid "\"%s\": removed %d row versions in %d pages" -msgstr "\"%s\": tog bort %d radversioner i %d sidor" +msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" +msgstr "snitt läshastighet: %.3f MB/s, snitt skrivhastighet: %.3f MB/s\n" -#: access/heap/vacuumlazy.c:2143 +#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 #, c-format -msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" -msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" -msgstr[0] "startade %d parallell städarbetare för indexupprensning (planerat: %d)" -msgstr[1] "startade %d parallella städarbetare för indexupprensning (planerat: %d)" +msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" +msgstr "bufferanvändning: %lld träffar, %lld missar, %lld nersmutsade\n" -#: access/heap/vacuumlazy.c:2149 +#: access/heap/vacuumlazy.c:785 #, c-format -msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" -msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" -msgstr[0] "startade %d parallell städarbetare för index-vacuum (planerat: %d)" -msgstr[1] "startade %d parallella städarbetare för index-vacuum (planerat: %d)" +msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" +msgstr "WAL-användning: %lld poster, %lld hela sidor, %llu bytes\n" -#: access/heap/vacuumlazy.c:2441 +#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 #, c-format -msgid "scanned index \"%s\" to remove %d row versions by parallel vacuum worker" -msgstr "genomsökte index \"%s\" och tog bort %d radversioner med parallell vacuum-arbetsprocess" +msgid "system usage: %s" +msgstr "systemanvändning: %s" -#: access/heap/vacuumlazy.c:2443 +#: access/heap/vacuumlazy.c:2463 #, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "genomsökte index \"%s\" och tog bort %d radversioner" +msgid "table \"%s\": removed %lld dead item identifiers in %u pages" +msgstr "tabell \"%s\": tog bort %lld döda postidentifierare i %u sidor" -#: access/heap/vacuumlazy.c:2501 +#: access/heap/vacuumlazy.c:2629 #, c-format -msgid "index \"%s\" now contains %.0f row versions in %u pages as reported by parallel vacuum worker" -msgstr "index \"%s\" innehåller nu %.0f radversioner i %u sidor enligt raoport från parallell vacuum-arbetsprocess" +msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" +msgstr "hoppar över ej nödvändigt underhåll av tabell \"%s.%s.%s\" som skyddsåtgärd efter %d index-scan" -#: access/heap/vacuumlazy.c:2503 +#: access/heap/vacuumlazy.c:2634 #, c-format -msgid "index \"%s\" now contains %.0f row versions in %u pages" -msgstr "index \"%s\" innehåller nu %.0f radversioner i %u sidor" +msgid "The table's relfrozenxid or relminmxid is too far in the past." +msgstr "Tabellens relfrozenxid eller relminmxid är för långt bak i tiden." -#: access/heap/vacuumlazy.c:2510 +#: access/heap/vacuumlazy.c:2635 #, c-format msgid "" -"%.0f index row versions were removed.\n" -"%u index pages have been deleted, %u are currently reusable.\n" -"%s." +"Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" +"You might also need to consider other ways for VACUUM to keep up with the allocation of transaction IDs." msgstr "" -"%.0f indexradversioner togs bort.\n" -"%u indexsidor har raderats, %u är nu återanvändningsbara.\n" -"%s." +"Överväg att öka konfigurationsparametern \"maintenance_work_mem\" eller \"autovacuum_work_mem\".\n" +"Du kan också överväga andra metoder för att VACUUM skall hinna med allokeringen av transactions-ID." -#: access/heap/vacuumlazy.c:2613 +#: access/heap/vacuumlazy.c:2878 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\": stoppar trunkering pga konfliktande låskrav" -#: access/heap/vacuumlazy.c:2679 +#: access/heap/vacuumlazy.c:2948 +#, c-format +msgid "table \"%s\": truncated %u to %u pages" +msgstr "tabell \"%s\": trunkerade %u till %u sidor" + +#: access/heap/vacuumlazy.c:3010 +#, c-format +msgid "table \"%s\": suspending truncate due to conflicting lock request" +msgstr "tabell \"%s\": pausar trunkering pga konfliktande låskrav" + +#: access/heap/vacuumlazy.c:3170 #, c-format -msgid "\"%s\": truncated %u to %u pages" -msgstr "\"%s\": trunkerade %u till %u sidor" +msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" +msgstr "stänger av parallell-flaggan för vacuumn på \"%s\" --- kan inte köra vacuum på temporära tabeller parallellt" -#: access/heap/vacuumlazy.c:2744 +#: access/heap/vacuumlazy.c:3383 #, c-format -msgid "\"%s\": suspending truncate due to conflicting lock request" -msgstr "\"%s\": pausar trunkering pga konfliktande låskrav" +msgid "while scanning block %u offset %u of relation \"%s.%s\"" +msgstr "vid skanning av block %u offset %u i relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3583 +#: access/heap/vacuumlazy.c:3386 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "vid skanning av block %u i relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3586 +#: access/heap/vacuumlazy.c:3390 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "vid skanning av relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3592 +#: access/heap/vacuumlazy.c:3398 +#, c-format +msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" +msgstr "vid vacuum av block %u offset %u i relation \"%s.%s\"" + +#: access/heap/vacuumlazy.c:3401 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "vid vacuum av block %u i relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3595 +#: access/heap/vacuumlazy.c:3405 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "vid vacuum av relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3600 +#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1057 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "vid vaccum av index \"%s\" i relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3605 +#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1063 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "vid uppstädning av index \"%s\" i relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3611 +#: access/heap/vacuumlazy.c:3421 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "vid trunkering av relation \"%s.%s\" till %u block" -#: access/index/amapi.c:83 commands/amcmds.c:170 +#: access/index/amapi.c:83 commands/amcmds.c:143 #, c-format msgid "access method \"%s\" is not of type %s" msgstr "accessmetod \"%s\" har inte typ %s" @@ -1314,65 +1444,70 @@ msgstr "accessmetod \"%s\" har inte typ %s" msgid "index access method \"%s\" does not have a handler" msgstr "indexaccessmetod \"%s\" har ingen hanterare" -#: access/index/indexam.c:142 catalog/objectaddress.c:1260 -#: commands/indexcmds.c:2516 commands/tablecmds.c:254 commands/tablecmds.c:278 -#: commands/tablecmds.c:15733 commands/tablecmds.c:17188 +#: access/index/genam.c:489 +#, c-format +msgid "transaction aborted during system catalog scan" +msgstr "transaktionen avbruten under scan av systemkatalog" + +#: access/index/indexam.c:142 catalog/objectaddress.c:1376 +#: commands/indexcmds.c:2713 commands/tablecmds.c:270 commands/tablecmds.c:294 +#: commands/tablecmds.c:17101 commands/tablecmds.c:18869 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" är inte ett index" -#: access/index/indexam.c:970 +#: access/index/indexam.c:973 #, c-format msgid "operator class %s has no options" msgstr "operatorklass %s har inga flaggor" -#: access/nbtree/nbtinsert.c:651 +#: access/nbtree/nbtinsert.c:666 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "duplicerat nyckelvärde bryter mot unik-villkor \"%s\"" -#: access/nbtree/nbtinsert.c:653 +#: access/nbtree/nbtinsert.c:668 #, c-format msgid "Key %s already exists." msgstr "Nyckeln %s existerar redan." -#: access/nbtree/nbtinsert.c:747 +#: access/nbtree/nbtinsert.c:762 #, c-format msgid "This may be because of a non-immutable index expression." msgstr "Det kan bero på ett icke-immutable indexuttryck." -#: access/nbtree/nbtpage.c:150 access/nbtree/nbtpage.c:538 -#: parser/parse_utilcmd.c:2244 +#: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 +#: parser/parse_utilcmd.c:2322 #, c-format msgid "index \"%s\" is not a btree" msgstr "index \"%s\" är inte ett btree" -#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:545 +#: access/nbtree/nbtpage.c:166 access/nbtree/nbtpage.c:615 #, c-format msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" msgstr "versionsfel i index \"%s\": filversion %d, aktuell version %d, minsta supportade version %d" -#: access/nbtree/nbtpage.c:1501 +#: access/nbtree/nbtpage.c:1874 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "index \"%s\" innehåller en halvdöd intern sida" -#: access/nbtree/nbtpage.c:1503 +#: access/nbtree/nbtpage.c:1876 #, c-format msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." msgstr "Detta kan ha orsakats av en avbruten VACUUM i version 9.3 eller äldre, innan uppdatering. Vänligen REINDEX:era det." -#: access/nbtree/nbtutils.c:2664 +#: access/nbtree/nbtutils.c:2669 #, c-format msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" msgstr "indexradstorlek %zu överstiger btree version %u maximum %zu för index \"%s\"" -#: access/nbtree/nbtutils.c:2670 +#: access/nbtree/nbtutils.c:2675 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "Indexrad refererar tupel (%u,%u) i relation \"%s\"." -#: access/nbtree/nbtutils.c:2674 +#: access/nbtree/nbtutils.c:2679 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1382,39 +1517,45 @@ msgstr "" "Kanske kan du använda ett funktionsindex av ett MD5-hashvärde istället\n" "eller möjligen full-text-indexering." -#: access/nbtree/nbtvalidate.c:243 +#: access/nbtree/nbtvalidate.c:246 #, c-format msgid "operator family \"%s\" of access method %s is missing support function for types %s and %s" msgstr "operatorfamilj \"%s\" för accessmetod %s saknar supportfunktioner för typerna %s och %s" -#: access/spgist/spgutils.c:147 +#: access/spgist/spgutils.c:245 #, c-format msgid "compress method must be defined when leaf type is different from input type" msgstr "komprimeringsmetod måste definieras när lövtypen skiljer sig från indatatypen" -#: access/spgist/spgutils.c:761 +#: access/spgist/spgutils.c:1017 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "SP-GiST inre tuplestorlek %zu överstiger maximala %zu" -#: access/spgist/spgvalidate.c:281 +#: access/spgist/spgvalidate.c:136 +#, c-format +msgid "SP-GiST leaf data type %s does not match declared type %s" +msgstr "SP-GiST lövdatatyp %s matchar deklarerad typ %s" + +#: access/spgist/spgvalidate.c:302 #, c-format msgid "operator family \"%s\" of access method %s is missing support function %d for type %s" msgstr "operatorfamilj \"%s\" för accessmetod %s saknar supportfunktion %d för typ %s" -#: access/table/table.c:49 access/table/table.c:78 access/table/table.c:111 -#: catalog/aclchk.c:1806 +#: access/table/table.c:49 access/table/table.c:83 access/table/table.c:112 +#: access/table/table.c:145 catalog/aclchk.c:1835 #, c-format msgid "\"%s\" is an index" msgstr "\"%s\" är ett index" -#: access/table/table.c:54 access/table/table.c:83 access/table/table.c:116 -#: catalog/aclchk.c:1813 commands/tablecmds.c:12554 commands/tablecmds.c:15742 +#: access/table/table.c:54 access/table/table.c:88 access/table/table.c:117 +#: access/table/table.c:150 catalog/aclchk.c:1842 commands/tablecmds.c:13754 +#: commands/tablecmds.c:17110 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\" är en composite-typ" -#: access/table/tableam.c:244 +#: access/table/tableam.c:266 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "tid (%u, %u) är inte giltigt för relation \"%s\"" @@ -1424,7 +1565,7 @@ msgstr "tid (%u, %u) är inte giltigt för relation \"%s\"" msgid "%s cannot be empty." msgstr "%s får inte vara tom." -#: access/table/tableamapi.c:122 utils/misc/guc.c:11956 +#: access/table/tableamapi.c:122 utils/misc/guc.c:12809 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s är för lång (maximalt %d tecken)." @@ -1444,33 +1585,33 @@ msgstr "Tabellaccessmetod \"%s\" existerar inte." msgid "sample percentage must be between 0 and 100" msgstr "urvalsprocent måste vara mellan 0 och 100" -#: access/transam/commit_ts.c:295 +#: access/transam/commit_ts.c:282 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "kan inte hämta commit-tidsstämpel för transaktion %u" -#: access/transam/commit_ts.c:393 +#: access/transam/commit_ts.c:380 #, c-format msgid "could not get commit timestamp data" msgstr "kunde inte hämta commit-tidsstämpeldata" -#: access/transam/commit_ts.c:395 +#: access/transam/commit_ts.c:382 #, c-format -msgid "Make sure the configuration parameter \"%s\" is set on the master server." -msgstr "Se till att konfigurationsparametern \"%s\" är satt på master-servern." +msgid "Make sure the configuration parameter \"%s\" is set on the primary server." +msgstr "Se till att konfigurationsparametern \"%s\" är satt på primär-servern." -#: access/transam/commit_ts.c:397 +#: access/transam/commit_ts.c:384 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Se till att konfigurationsparametern \"%s\" är satt." -#: access/transam/multixact.c:1002 +#: access/transam/multixact.c:1021 #, c-format msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"" msgstr "databasen tar inte emot kommandon som genererar nya MultiXactId:er för att förhinda dataförlust vid \"wraparound\" i databasen \"%s\"" -#: access/transam/multixact.c:1004 access/transam/multixact.c:1011 -#: access/transam/multixact.c:1035 access/transam/multixact.c:1044 +#: access/transam/multixact.c:1023 access/transam/multixact.c:1030 +#: access/transam/multixact.c:1054 access/transam/multixact.c:1063 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" @@ -1479,72 +1620,67 @@ msgstr "" "Utför en hela databasen-VACUUM i den databasen.\n" "Du kan också behöva commit:a eller rulla tillbaka gamla förberedda transaktioner eller slänga gamla replikeringsslottar." -#: access/transam/multixact.c:1009 +#: access/transam/multixact.c:1028 #, c-format msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u" msgstr "databasen tar inte emot kommandon som genererar nya MultiXactId:er för att förhinda dataförlust vid \"wraparound\" i databasen med OID %u" -#: access/transam/multixact.c:1030 access/transam/multixact.c:2320 +#: access/transam/multixact.c:1049 access/transam/multixact.c:2333 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" msgstr[0] "databasen \"%s\" måste städas innan ytterligare %u MultiXactId används" msgstr[1] "databasen \"%s\" måste städas innan ytterligare %u MultiXactId:er används" -#: access/transam/multixact.c:1039 access/transam/multixact.c:2329 +#: access/transam/multixact.c:1058 access/transam/multixact.c:2342 #, c-format msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" msgstr[0] "databas med OID %u måste städas (vacuum) innan %u till MultiXactId används" msgstr[1] "databas med OID %u måste städas (vacuum) innan %u till MultiXactId:er används" -#: access/transam/multixact.c:1100 +#: access/transam/multixact.c:1119 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "multixact \"members\"-gräns överskriden" -#: access/transam/multixact.c:1101 +#: access/transam/multixact.c:1120 #, c-format msgid "This command would create a multixact with %u members, but the remaining space is only enough for %u member." msgid_plural "This command would create a multixact with %u members, but the remaining space is only enough for %u members." msgstr[0] "Detta kommando skapar en multixact med %u medlemmar, men återstående utrymmer räcker bara till %u medlem." msgstr[1] "Detta kommando skapar en multixact med %u medlemmar, men återstående utrymmer räcker bara till %u medlemmar." -#: access/transam/multixact.c:1106 +#: access/transam/multixact.c:1125 #, c-format msgid "Execute a database-wide VACUUM in database with OID %u with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." msgstr "Kör en hela-databas-VACUUM i databas med OID %u med reducerade iställningar vacuum_multixact_freeze_min_age och vacuum_multixact_freeze_table_age." -#: access/transam/multixact.c:1137 +#: access/transam/multixact.c:1156 #, c-format msgid "database with OID %u must be vacuumed before %d more multixact member is used" msgid_plural "database with OID %u must be vacuumed before %d more multixact members are used" msgstr[0] "databas med OID %u måste städas innan %d mer multixact-medlem används" msgstr[1] "databas med OID %u måste städas innan %d fler multixact-medlemmar används" -#: access/transam/multixact.c:1142 +#: access/transam/multixact.c:1161 #, c-format msgid "Execute a database-wide VACUUM in that database with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." msgstr "Kör en hela-databas-VACUUM i den databasen med reducerade inställningar för vacuum_multixact_freeze_min_age och vacuum_multixact_freeze_table_age." -#: access/transam/multixact.c:1279 +#: access/transam/multixact.c:1300 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "MultiXactId %u finns inte längre -- troligen en wraparound" -#: access/transam/multixact.c:1287 +#: access/transam/multixact.c:1306 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "MultiXactId %u har inte skapats än -- troligen en wraparound" -#: access/transam/multixact.c:2270 -#, c-format -msgid "MultiXactId wrap limit is %u, limited by database with OID %u" -msgstr "MultiXactId wrap-gräns är %u, begränsad av databasen med OID %u" - -#: access/transam/multixact.c:2325 access/transam/multixact.c:2334 -#: access/transam/varsup.c:149 access/transam/varsup.c:156 -#: access/transam/varsup.c:447 access/transam/varsup.c:454 +#: access/transam/multixact.c:2338 access/transam/multixact.c:2347 +#: access/transam/varsup.c:151 access/transam/varsup.c:158 +#: access/transam/varsup.c:466 access/transam/varsup.c:473 #, c-format msgid "" "To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" @@ -1553,138 +1689,179 @@ msgstr "" "För att undvika att databasen stängs ner, utför en hela databas-VACCUM i den databasen.\n" "Du kan också behöva commit:a eller rulla tillbaka gamla förberedda transaktioner eller slänga gamla replikeringsslottar." -#: access/transam/multixact.c:2604 -#, c-format -msgid "oldest MultiXactId member is at offset %u" -msgstr "äldsta MultiXactId-medlemmen är vid offset %u" - -#: access/transam/multixact.c:2608 +#: access/transam/multixact.c:2621 #, c-format msgid "MultiXact member wraparound protections are disabled because oldest checkpointed MultiXact %u does not exist on disk" msgstr "MultiXact-medlems wraparound-skydd är avslagen eftersom äldsta checkpoint:ade MultiXact %u inte finns på disk" -#: access/transam/multixact.c:2630 +#: access/transam/multixact.c:2643 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "MultiXact-medlems wraparound-skydd är nu påslagen" -#: access/transam/multixact.c:2633 -#, c-format -msgid "MultiXact member stop limit is now %u based on MultiXact %u" -msgstr "MultiXact-medlems stoppgräns är nu %u baserad på MultiXact %u" - -#: access/transam/multixact.c:3013 +#: access/transam/multixact.c:3030 #, c-format msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" msgstr "äldsta MultiXact %u hittas inte, tidigast MultiXact %u, skippar trunkering" -#: access/transam/multixact.c:3031 +#: access/transam/multixact.c:3048 #, c-format msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" msgstr "kan inte trunkera upp till %u eftersom den inte finns på disk, skippar trunkering" -#: access/transam/multixact.c:3345 +#: access/transam/multixact.c:3362 #, c-format msgid "invalid MultiXactId: %u" msgstr "ogiltig MultiXactId: %u" -#: access/transam/parallel.c:706 access/transam/parallel.c:825 +#: access/transam/parallel.c:718 access/transam/parallel.c:837 #, c-format msgid "parallel worker failed to initialize" msgstr "parallell arbetare misslyckades med initiering" -#: access/transam/parallel.c:707 access/transam/parallel.c:826 +#: access/transam/parallel.c:719 access/transam/parallel.c:838 #, c-format msgid "More details may be available in the server log." msgstr "Fler detaljer kan finnas i serverloggen." -#: access/transam/parallel.c:887 +#: access/transam/parallel.c:899 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "postmaster avslutade under en parallell transaktion" -#: access/transam/parallel.c:1074 +#: access/transam/parallel.c:1086 #, c-format msgid "lost connection to parallel worker" msgstr "tappad kopplingen till parallell arbetare" -#: access/transam/parallel.c:1140 access/transam/parallel.c:1142 +#: access/transam/parallel.c:1152 access/transam/parallel.c:1154 msgid "parallel worker" msgstr "parallell arbetare" -#: access/transam/parallel.c:1293 +#: access/transam/parallel.c:1307 #, c-format msgid "could not map dynamic shared memory segment" msgstr "kunde inte skapa dynamiskt delat minnessegment: %m" -#: access/transam/parallel.c:1298 +#: access/transam/parallel.c:1312 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "ogiltigt magiskt nummer i dynamiskt delat minnessegment" -#: access/transam/slru.c:696 +#: access/transam/rmgr.c:84 +#, c-format +msgid "resource manager with ID %d not registered" +msgstr "resurshanterare med ID %d är inte registrerad" + +#: access/transam/rmgr.c:85 +#, c-format +msgid "Include the extension module that implements this resource manager in shared_preload_libraries." +msgstr "Inkludera utökningsmodulen som implementerar denna resurshanterar i shared_preload_libraries." + +#: access/transam/rmgr.c:101 +#, c-format +msgid "custom resource manager name is invalid" +msgstr "namn på egendefinierad resurshanterare är ogiltigt" + +#: access/transam/rmgr.c:102 +#, c-format +msgid "Provide a non-empty name for the custom resource manager." +msgstr "Ange ett icke-tomt namn för den egendefinierade resurshanteraren." + +#: access/transam/rmgr.c:105 +#, c-format +msgid "custom resource manager ID %d is out of range" +msgstr "egendefinierat resurshanterar-ID %d är utanför giltigt intervall" + +#: access/transam/rmgr.c:106 +#, fuzzy, c-format +msgid "Provide a custom resource manager ID between %d and %d." +msgstr "Ange ett egendefinierat resurshanterar-ID mellan %d och %d." + +#: access/transam/rmgr.c:111 access/transam/rmgr.c:116 +#: access/transam/rmgr.c:128 +#, c-format +msgid "failed to register custom resource manager \"%s\" with ID %d" +msgstr "misslyckades med att registera en egendefinierad resurshanterare \"%s\" med ID %d" + +#: access/transam/rmgr.c:112 +#, fuzzy, c-format +msgid "Custom resource manager must be registered while initializing modules in shared_preload_libraries." +msgstr "Egendefinierad resurshanterare måste vara registerad när man initierar moduler i shared_preload_libraries." + +#: access/transam/rmgr.c:117 +#, c-format +msgid "Custom resource manager \"%s\" already registered with the same ID." +msgstr "Egendefinierad resurshanterare \"%s\" är redan registrerade med samma ID." + +#: access/transam/rmgr.c:129 +#, c-format +msgid "Existing resource manager with ID %d has the same name." +msgstr "Det finns redan en resurshanterare med ID %d som har samma namn." + +#: access/transam/rmgr.c:135 +#, c-format +msgid "registered custom resource manager \"%s\" with ID %d" +msgstr "registrerade egendefinerad resurshanterare \"%s\" med ID %d" + +#: access/transam/slru.c:713 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "filen \"%s\" existerar inte, läses som nollor" -#: access/transam/slru.c:937 access/transam/slru.c:943 -#: access/transam/slru.c:951 access/transam/slru.c:956 -#: access/transam/slru.c:963 access/transam/slru.c:968 -#: access/transam/slru.c:975 access/transam/slru.c:982 +#: access/transam/slru.c:945 access/transam/slru.c:951 +#: access/transam/slru.c:959 access/transam/slru.c:964 +#: access/transam/slru.c:971 access/transam/slru.c:976 +#: access/transam/slru.c:983 access/transam/slru.c:990 #, c-format msgid "could not access status of transaction %u" msgstr "kunde inte läsa status på transaktion %u" -#: access/transam/slru.c:938 +#: access/transam/slru.c:946 #, c-format msgid "Could not open file \"%s\": %m." msgstr "Kunde inte öppna fil \"%s\": %m." -#: access/transam/slru.c:944 +#: access/transam/slru.c:952 #, c-format -msgid "Could not seek in file \"%s\" to offset %u: %m." -msgstr "Kunde inte söka i fil \"%s\" till offset %u: %m." +msgid "Could not seek in file \"%s\" to offset %d: %m." +msgstr "Kunde inte söka i fil \"%s\" till offset %d: %m." -#: access/transam/slru.c:952 +#: access/transam/slru.c:960 #, c-format -msgid "Could not read from file \"%s\" at offset %u: %m." -msgstr "Kunde inte läsa från fil \"%s\" på offset %u: %m." +msgid "Could not read from file \"%s\" at offset %d: %m." +msgstr "Kunde inte läsa från fil \"%s\" på offset %d: %m." -#: access/transam/slru.c:957 +#: access/transam/slru.c:965 #, c-format -msgid "Could not read from file \"%s\" at offset %u: read too few bytes." -msgstr "Kunde inte läsa från fil \"%s\" på offset %u: läste för få bytes." +msgid "Could not read from file \"%s\" at offset %d: read too few bytes." +msgstr "Kunde inte läsa från fil \"%s\" på offset %d: läste för få bytes." -#: access/transam/slru.c:964 +#: access/transam/slru.c:972 #, c-format -msgid "Could not write to file \"%s\" at offset %u: %m." -msgstr "Kunde inte skriva till fil \"%s\" på offset %u: %m." +msgid "Could not write to file \"%s\" at offset %d: %m." +msgstr "Kunde inte skriva till fil \"%s\" på offset %d: %m." -#: access/transam/slru.c:969 +#: access/transam/slru.c:977 #, c-format -msgid "Could not write to file \"%s\" at offset %u: wrote too few bytes." -msgstr "Kunde inte skriva till fil \"%s\" på offset %u: skrev för få bytes." +msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." +msgstr "Kunde inte skriva till fil \"%s\" på offset %d: skrev för få bytes." -#: access/transam/slru.c:976 +#: access/transam/slru.c:984 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "Kunde inte fsync:a fil \"%s\": %m." -#: access/transam/slru.c:983 +#: access/transam/slru.c:991 #, c-format msgid "Could not close file \"%s\": %m." msgstr "Kunde inte stänga fil \"%s\": %m." -#: access/transam/slru.c:1258 +#: access/transam/slru.c:1252 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "Kunde inte trunkera katalog \"%s\": trolig wraparound" -#: access/transam/slru.c:1313 access/transam/slru.c:1369 -#, c-format -msgid "removing file \"%s\"" -msgstr "tar bort fil \"%s\"" - #: access/transam/timeline.c:163 access/transam/timeline.c:168 #, c-format msgid "syntax error in history file: %s" @@ -1725,166 +1902,177 @@ msgstr "Tidslinje-ID:er måste vara mindre än barnens tidslinje-ID:er." msgid "requested timeline %u is not in this server's history" msgstr "efterfrågad tidslinje %u finns inte i denna servers historik" -#: access/transam/twophase.c:381 +#: access/transam/twophase.c:385 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "transaktionsidentifierare \"%s\" är för lång" -#: access/transam/twophase.c:388 +#: access/transam/twophase.c:392 #, c-format msgid "prepared transactions are disabled" msgstr "förberedda transaktioner är avslagna" -#: access/transam/twophase.c:389 +#: access/transam/twophase.c:393 #, c-format msgid "Set max_prepared_transactions to a nonzero value." msgstr "Sätt max_prepared_transactions till ett ickenollvärde." -#: access/transam/twophase.c:408 +#: access/transam/twophase.c:412 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "transaktionsidentifierare \"%s\" används redan" -#: access/transam/twophase.c:417 access/transam/twophase.c:2368 +#: access/transam/twophase.c:421 access/transam/twophase.c:2486 #, c-format msgid "maximum number of prepared transactions reached" msgstr "maximalt antal förberedda transaktioner har uppnåtts" -#: access/transam/twophase.c:418 access/transam/twophase.c:2369 +#: access/transam/twophase.c:422 access/transam/twophase.c:2487 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "Öka max_prepared_transactions (nu %d)." -#: access/transam/twophase.c:586 +#: access/transam/twophase.c:598 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "förberedd transaktion med identifierare \"%s\" är upptagen" -#: access/transam/twophase.c:592 +#: access/transam/twophase.c:604 #, c-format msgid "permission denied to finish prepared transaction" msgstr "rättighet saknas för att slutföra förberedd transaktion" -#: access/transam/twophase.c:593 +#: access/transam/twophase.c:605 #, c-format msgid "Must be superuser or the user that prepared the transaction." -msgstr "Måste vara superanvändare eller den användare som förberedde transaktionen" +msgstr "Måste vara superuser eller den användare som förberedde transaktionen" -#: access/transam/twophase.c:604 +#: access/transam/twophase.c:616 #, c-format msgid "prepared transaction belongs to another database" msgstr "förberedda transaktionen tillhör en annan databas" -#: access/transam/twophase.c:605 +#: access/transam/twophase.c:617 #, c-format msgid "Connect to the database where the transaction was prepared to finish it." msgstr "Anslut till databasen där transaktionen var förberedd för att slutföra den." -#: access/transam/twophase.c:620 +#: access/transam/twophase.c:632 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "förberedd transaktion med identifierare \"%s\" finns inte" -#: access/transam/twophase.c:1098 +#: access/transam/twophase.c:1169 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "tvåfas-statusfilens maximala längd överskriden" -#: access/transam/twophase.c:1252 +#: access/transam/twophase.c:1324 #, c-format -msgid "incorrect size of file \"%s\": %zu byte" -msgid_plural "incorrect size of file \"%s\": %zu bytes" -msgstr[0] "felaktig storlek på fil \"%s\": %zu byte" -msgstr[1] "felaktig storlek på fil \"%s\": %zu byte" +msgid "incorrect size of file \"%s\": %lld byte" +msgid_plural "incorrect size of file \"%s\": %lld bytes" +msgstr[0] "felaktig storlek på fil \"%s\": %lld byte" +msgstr[1] "felaktig storlek på fil \"%s\": %lld bytes" -#: access/transam/twophase.c:1261 +#: access/transam/twophase.c:1333 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "inkorrekt justering (alignment) av CRC-offset för fil \"%s\"" -#: access/transam/twophase.c:1294 +#: access/transam/twophase.c:1351 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "kunde inte läsa fil \"%s\": läste %d av %lld" + +#: access/transam/twophase.c:1366 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "felaktigt magiskt nummer lagrat i fil \"%s\"" -#: access/transam/twophase.c:1300 +#: access/transam/twophase.c:1372 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "felaktig storlek lagrad i fil \"%s\"" -#: access/transam/twophase.c:1312 +#: access/transam/twophase.c:1384 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "beräknad CRC-checksumma matchar inte värdet som är lagrat i filen \"%s\"" -#: access/transam/twophase.c:1342 access/transam/xlog.c:6494 +#: access/transam/twophase.c:1414 access/transam/xlogrecovery.c:568 +#: replication/logical/logical.c:206 replication/walsender.c:703 #, c-format msgid "Failed while allocating a WAL reading processor." -msgstr "Millslyckades vid allokering av en WAL-läs-processor." +msgstr "Misslyckades vid allokering av en WAL-läs-processor." + +#: access/transam/twophase.c:1424 +#, c-format +msgid "could not read two-phase state from WAL at %X/%X: %s" +msgstr "kunde inte läsa tvåfas-status från WAL vid %X/%X: %s" -#: access/transam/twophase.c:1349 +#: access/transam/twophase.c:1429 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "kunde inte läsa tvåfas-status från WAL vid %X/%X" -#: access/transam/twophase.c:1357 +#: access/transam/twophase.c:1437 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "förväntad tvåfas-statusdata finns inte i WAL vid %X/%X" -#: access/transam/twophase.c:1637 +#: access/transam/twophase.c:1733 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "kan inte återskapa fil \"%s\": %m" -#: access/transam/twophase.c:1764 +#: access/transam/twophase.c:1860 #, c-format msgid "%u two-phase state file was written for a long-running prepared transaction" msgid_plural "%u two-phase state files were written for long-running prepared transactions" msgstr[0] "%u tvåfas-statusfil skrevs för långkörande förberedd transkation" msgstr[1] "%u tvåfas-statusfiler skrevs för långkörande förberedda transaktioner" -#: access/transam/twophase.c:1998 +#: access/transam/twophase.c:2094 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "återskapar förberedd transaktion %u från delat minne" -#: access/transam/twophase.c:2089 +#: access/transam/twophase.c:2187 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "tar bort död tvåfas-statusfil för transaktioon %u" -#: access/transam/twophase.c:2096 +#: access/transam/twophase.c:2194 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "tar bort död tvåfas-statusfil från minne för transaktion %u" -#: access/transam/twophase.c:2109 +#: access/transam/twophase.c:2207 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "tar bort framtida tvåfas-statusfil för transaktion %u" -#: access/transam/twophase.c:2116 +#: access/transam/twophase.c:2214 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "tar bort framtida tvåfas-statusfil från minne för transaktion %u" -#: access/transam/twophase.c:2141 +#: access/transam/twophase.c:2239 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "korrupt tvåfas-statusfil för transaktion %u" -#: access/transam/twophase.c:2146 +#: access/transam/twophase.c:2244 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "korrupt tvåfas-status i minnet för transaktion %u" -#: access/transam/varsup.c:127 +#: access/transam/varsup.c:129 #, c-format msgid "database is not accepting commands to avoid wraparound data loss in database \"%s\"" msgstr "databasen tar inte emot kommandon för att förhinda dataförlust vid \"wraparound\" i databasen \"%s\"" -#: access/transam/varsup.c:129 access/transam/varsup.c:136 +#: access/transam/varsup.c:131 access/transam/varsup.c:138 #, c-format msgid "" "Stop the postmaster and vacuum that database in single-user mode.\n" @@ -1893,2117 +2081,2070 @@ msgstr "" "Stoppa postmaster och städa (vacuum) den databasen i enanvändarläge.\n" "Du kan också behöva commit:a eller rulla tillbaka förberedda transaktioner eller slänga gamla replikeringsslottar." -#: access/transam/varsup.c:134 +#: access/transam/varsup.c:136 #, c-format msgid "database is not accepting commands to avoid wraparound data loss in database with OID %u" msgstr "databasen tar inte emot kommandon för att förhinda dataförlust vid wraparound i databas med OID %u" -#: access/transam/varsup.c:146 access/transam/varsup.c:444 +#: access/transam/varsup.c:148 access/transam/varsup.c:463 #, c-format msgid "database \"%s\" must be vacuumed within %u transactions" msgstr "databas \"%s\" måste städas (vacuum) inom %u transaktioner" -#: access/transam/varsup.c:153 access/transam/varsup.c:451 +#: access/transam/varsup.c:155 access/transam/varsup.c:470 #, c-format msgid "database with OID %u must be vacuumed within %u transactions" msgstr "databas med OID %u måste städas (vacuum) inom %u transaktioner" -#: access/transam/varsup.c:409 -#, c-format -msgid "transaction ID wrap limit is %u, limited by database with OID %u" -msgstr "transaktions-ID wrap-gräns är %u, begränsad av databas med OID %u" - -#: access/transam/xact.c:1030 +#: access/transam/xact.c:1098 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "kan inte ha mer än 2^32-2 kommandon i en transaktion" -#: access/transam/xact.c:1555 +#: access/transam/xact.c:1644 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "maximalt antal commit:ade undertransaktioner (%d) överskridet" -#: access/transam/xact.c:2395 +#: access/transam/xact.c:2501 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "kan inte göra PREPARE på en transaktion som har arbetat med temporära objekt" -#: access/transam/xact.c:2405 +#: access/transam/xact.c:2511 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "kan inte göra PREPARE på en transaktion som har exporterade snapshots" -#: access/transam/xact.c:2414 -#, c-format -msgid "cannot PREPARE a transaction that has manipulated logical replication workers" -msgstr "kan inte göra PREPARE på en transaktion som har förändrat logiska replikeringsarbetare" - #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3359 +#: access/transam/xact.c:3471 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s kan inte köras i ett transaktionsblock" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3369 +#: access/transam/xact.c:3481 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%s kan inte köras i ett undertransaktionsblock" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3379 +#: access/transam/xact.c:3491 #, c-format msgid "%s cannot be executed from a function" msgstr "%s kan inte köras från en funktion" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3448 access/transam/xact.c:3754 -#: access/transam/xact.c:3833 access/transam/xact.c:3956 -#: access/transam/xact.c:4107 access/transam/xact.c:4176 -#: access/transam/xact.c:4287 +#: access/transam/xact.c:3560 access/transam/xact.c:3866 +#: access/transam/xact.c:3945 access/transam/xact.c:4068 +#: access/transam/xact.c:4219 access/transam/xact.c:4288 +#: access/transam/xact.c:4399 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s kan bara användas i transaktionsblock" -#: access/transam/xact.c:3640 +#: access/transam/xact.c:3752 #, c-format msgid "there is already a transaction in progress" msgstr "det är redan en transaktion igång" -#: access/transam/xact.c:3759 access/transam/xact.c:3838 -#: access/transam/xact.c:3961 +#: access/transam/xact.c:3871 access/transam/xact.c:3950 +#: access/transam/xact.c:4073 #, c-format msgid "there is no transaction in progress" msgstr "ingen transaktion pågår" -#: access/transam/xact.c:3849 +#: access/transam/xact.c:3961 #, c-format msgid "cannot commit during a parallel operation" msgstr "kan inte commit:a under en parallell operation" -#: access/transam/xact.c:3972 +#: access/transam/xact.c:4084 #, c-format msgid "cannot abort during a parallel operation" msgstr "can inte avbryta under en parallell operation" -#: access/transam/xact.c:4071 +#: access/transam/xact.c:4183 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "kan inte definiera sparpunkter under en parallell operation" -#: access/transam/xact.c:4158 +#: access/transam/xact.c:4270 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "kan inte frigöra en sparpunkt under en parallell operation" -#: access/transam/xact.c:4168 access/transam/xact.c:4219 -#: access/transam/xact.c:4279 access/transam/xact.c:4328 +#: access/transam/xact.c:4280 access/transam/xact.c:4331 +#: access/transam/xact.c:4391 access/transam/xact.c:4440 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "sparpunkt \"%s\" existerar inte" -#: access/transam/xact.c:4225 access/transam/xact.c:4334 +#: access/transam/xact.c:4337 access/transam/xact.c:4446 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "sparpunkt \"%s\" finns inte inom aktuell sparpunktsnivå" -#: access/transam/xact.c:4267 +#: access/transam/xact.c:4379 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "kan inte rulla tillbaka till sparpunkt under en parallell operation" -#: access/transam/xact.c:4395 +#: access/transam/xact.c:4507 #, c-format msgid "cannot start subtransactions during a parallel operation" msgstr "kan inte starta subtransaktioner under en parallell operation" -#: access/transam/xact.c:4463 +#: access/transam/xact.c:4575 #, c-format msgid "cannot commit subtransactions during a parallel operation" msgstr "kan inte commit:a subtransaktioner undert en parallell operation" -#: access/transam/xact.c:5103 +#: access/transam/xact.c:5222 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "kan inte ha mer än 2^32-1 subtransaktioner i en transaktion" -#: access/transam/xlog.c:2554 +#: access/transam/xlog.c:1463 #, c-format -msgid "could not write to log file %s at offset %u, length %zu: %m" -msgstr "kunde inte skriva till loggfil %s vid offset %u, längd %zu: %m" +msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" +msgstr "förfrågan att flush:a efter slutet av genererad WAL; efterfrågad %X/%X, aktuell position %X/%X" -#: access/transam/xlog.c:2830 +#: access/transam/xlog.c:2224 #, c-format -msgid "updated min recovery point to %X/%X on timeline %u" -msgstr "updaterade minsta återställningspunkt till %X/%X på tidslinje %u" +msgid "could not write to log file %s at offset %u, length %zu: %m" +msgstr "kunde inte skriva till loggfil %s vid offset %u, längd %zu: %m" -#: access/transam/xlog.c:3944 access/transam/xlogutils.c:802 -#: replication/walsender.c:2511 +#: access/transam/xlog.c:3471 access/transam/xlogutils.c:845 +#: replication/walsender.c:2717 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "efterfrågat WAL-segment %s har redan tagits bort" -#: access/transam/xlog.c:4187 -#, c-format -msgid "recycled write-ahead log file \"%s\"" -msgstr "återanvände write-ahead-loggfil \"%s\"" - -#: access/transam/xlog.c:4199 -#, c-format -msgid "removing write-ahead log file \"%s\"" -msgstr "tar bort write-ahead-loggfil \"%s\"" - -#: access/transam/xlog.c:4219 +#: access/transam/xlog.c:3756 #, c-format msgid "could not rename file \"%s\": %m" msgstr "kunde inte byta namn på fil \"%s\": %m" -#: access/transam/xlog.c:4261 access/transam/xlog.c:4271 +#: access/transam/xlog.c:3798 access/transam/xlog.c:3808 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "krävd WAL-katalog \"%s\" finns inte" -#: access/transam/xlog.c:4277 +#: access/transam/xlog.c:3814 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "skapar saknad WAL-katalog \"%s\"" -#: access/transam/xlog.c:4280 +#: access/transam/xlog.c:3817 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "kunde inte skapa saknad katalog \"%s\": %m" -#: access/transam/xlog.c:4383 -#, c-format -msgid "unexpected timeline ID %u in log segment %s, offset %u" -msgstr "oväntad tidslinje-ID %u i loggsegment %s, offset %u" - -#: access/transam/xlog.c:4521 -#, c-format -msgid "new timeline %u is not a child of database system timeline %u" -msgstr "ny tidslinje %u är inte ett barn till databasens systemtidslinje %u" - -#: access/transam/xlog.c:4535 -#, c-format -msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" -msgstr "ny tidslinje %u skapad från aktuella databasens systemtidslinje %u innan nuvarande återställningspunkt %X/%X" - -#: access/transam/xlog.c:4554 -#, c-format -msgid "new target timeline is %u" -msgstr "ny måltidslinje är %u" - -#: access/transam/xlog.c:4590 +#: access/transam/xlog.c:3884 #, c-format msgid "could not generate secret authorization token" msgstr "kunde inte generera hemligt auktorisationstoken" -#: access/transam/xlog.c:4749 access/transam/xlog.c:4758 -#: access/transam/xlog.c:4782 access/transam/xlog.c:4789 -#: access/transam/xlog.c:4796 access/transam/xlog.c:4801 -#: access/transam/xlog.c:4808 access/transam/xlog.c:4815 -#: access/transam/xlog.c:4822 access/transam/xlog.c:4829 -#: access/transam/xlog.c:4836 access/transam/xlog.c:4843 -#: access/transam/xlog.c:4852 access/transam/xlog.c:4859 -#: utils/init/miscinit.c:1548 +#: access/transam/xlog.c:4043 access/transam/xlog.c:4052 +#: access/transam/xlog.c:4076 access/transam/xlog.c:4083 +#: access/transam/xlog.c:4090 access/transam/xlog.c:4095 +#: access/transam/xlog.c:4102 access/transam/xlog.c:4109 +#: access/transam/xlog.c:4116 access/transam/xlog.c:4123 +#: access/transam/xlog.c:4130 access/transam/xlog.c:4137 +#: access/transam/xlog.c:4146 access/transam/xlog.c:4153 +#: utils/init/miscinit.c:1598 #, c-format msgid "database files are incompatible with server" msgstr "databasfilerna är inkompatibla med servern" -#: access/transam/xlog.c:4750 +#: access/transam/xlog.c:4044 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." msgstr "Databasklustret initierades med PG_CONTROL_VERSION %d (0x%08x), men servern kompilerades med PG_CONTROL_VERSION %d (0x%08x)." -#: access/transam/xlog.c:4754 +#: access/transam/xlog.c:4048 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." msgstr "Detta kan orsakas av en felaktig byte-ordning. Du behöver troligen köra initdb." -#: access/transam/xlog.c:4759 +#: access/transam/xlog.c:4053 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." msgstr "Databasklustret initierades med PG_CONTROL_VERSION %d, men servern kompilerades med PG_CONTROL_VERSION %d." -#: access/transam/xlog.c:4762 access/transam/xlog.c:4786 -#: access/transam/xlog.c:4793 access/transam/xlog.c:4798 +#: access/transam/xlog.c:4056 access/transam/xlog.c:4080 +#: access/transam/xlog.c:4087 access/transam/xlog.c:4092 #, c-format msgid "It looks like you need to initdb." msgstr "Du behöver troligen köra initdb." -#: access/transam/xlog.c:4773 +#: access/transam/xlog.c:4067 #, c-format msgid "incorrect checksum in control file" msgstr "ogiltig kontrollsumma kontrollfil" -#: access/transam/xlog.c:4783 +#: access/transam/xlog.c:4077 #, c-format msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." msgstr "Databasklustret initierades med CATALOG_VERSION_NO %d, men servern kompilerades med CATALOG_VERSION_NO %d." -#: access/transam/xlog.c:4790 +#: access/transam/xlog.c:4084 #, c-format msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." msgstr "Databasklustret initierades med MAXALIGN %d, men servern kompilerades med MAXALIGN %d." -#: access/transam/xlog.c:4797 +#: access/transam/xlog.c:4091 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "Databasklustret verkar använda en annan flyttalsrepresentation än vad serverprogrammet gör." -#: access/transam/xlog.c:4802 +#: access/transam/xlog.c:4096 #, c-format msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." msgstr "Databasklustret initierades med BLCKSZ %d, men servern kompilerades med BLCKSZ %d." -#: access/transam/xlog.c:4805 access/transam/xlog.c:4812 -#: access/transam/xlog.c:4819 access/transam/xlog.c:4826 -#: access/transam/xlog.c:4833 access/transam/xlog.c:4840 -#: access/transam/xlog.c:4847 access/transam/xlog.c:4855 -#: access/transam/xlog.c:4862 +#: access/transam/xlog.c:4099 access/transam/xlog.c:4106 +#: access/transam/xlog.c:4113 access/transam/xlog.c:4120 +#: access/transam/xlog.c:4127 access/transam/xlog.c:4134 +#: access/transam/xlog.c:4141 access/transam/xlog.c:4149 +#: access/transam/xlog.c:4156 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Det verkar som om du måste kompilera om eller köra initdb." -#: access/transam/xlog.c:4809 +#: access/transam/xlog.c:4103 #, c-format msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." msgstr "Databasklustret initierades med RELSEG_SIZE %d, men servern kompilerades med RELSEG_SIZE %d." -#: access/transam/xlog.c:4816 +#: access/transam/xlog.c:4110 #, c-format msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." msgstr "Databasklustret initierades med XLOG_BLCKSZ %d, men servern kompilerades med XLOG_BLCKSZ %d." -#: access/transam/xlog.c:4823 +#: access/transam/xlog.c:4117 #, c-format msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." msgstr "Databasklustret initierades med NAMEDATALEN %d, men servern kompilerades med NAMEDATALEN %d." -#: access/transam/xlog.c:4830 +#: access/transam/xlog.c:4124 #, c-format msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." msgstr "Databasklustret initierades med INDEX_MAX_KEYS %d, men servern kompilerades med INDEX_MAX_KEYS %d." -#: access/transam/xlog.c:4837 +#: access/transam/xlog.c:4131 #, c-format msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." msgstr "Databasklustret initierades med TOAST_MAX_CHUNK_SIZE %d, men servern kompilerades med TOAST_MAX_CHUNK_SIZE %d." -#: access/transam/xlog.c:4844 +#: access/transam/xlog.c:4138 #, c-format msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." msgstr "Databasklustret initierades med LOBLKSIZE %d, men servern kompilerades med LOBLKSIZE %d." -#: access/transam/xlog.c:4853 +#: access/transam/xlog.c:4147 #, c-format msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." msgstr "Databasklustret initierades utan USE_FLOAT8_BYVAL, men servern kompilerades med USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4860 +#: access/transam/xlog.c:4154 #, c-format msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." msgstr "Databasklustret initierades med USE_FLOAT8_BYVAL, men servern kompilerades utan USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4869 +#: access/transam/xlog.c:4163 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" msgstr[0] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men kontrollfilen anger %d byte" msgstr[1] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men kontrollfilen anger %d byte" -#: access/transam/xlog.c:4881 +#: access/transam/xlog.c:4175 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"min_wal_size\" måste vara minst dubbla \"wal_segment_size\"" -#: access/transam/xlog.c:4885 +#: access/transam/xlog.c:4179 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"max_wal_size\" måste vara minst dubbla \"wal_segment_size\"" -#: access/transam/xlog.c:5318 +#: access/transam/xlog.c:4611 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "kunde inte skriva bootstrap-write-ahead-loggfil: %m" -#: access/transam/xlog.c:5326 +#: access/transam/xlog.c:4619 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "kunde inte fsync:a bootstrap-write-ahead-loggfil: %m" -#: access/transam/xlog.c:5332 +#: access/transam/xlog.c:4625 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "kunde inte stänga bootstrap-write-ahead-loggfil: %m" -#: access/transam/xlog.c:5393 +#: access/transam/xlog.c:4843 #, c-format -msgid "using recovery command file \"%s\" is not supported" -msgstr "använda återställningskommandofil \"%s\" stöds inte" +msgid "WAL was generated with wal_level=minimal, cannot continue recovering" +msgstr "WAL genererades med wal_level=minimal, kan inte fortsätta återställande" -#: access/transam/xlog.c:5458 +#: access/transam/xlog.c:4844 #, c-format -msgid "standby mode is not supported by single-user servers" -msgstr "standby-läge stöd inte av enanvändarservrar" +msgid "This happens if you temporarily set wal_level=minimal on the server." +msgstr "Detta händer om du temporärt sätter wal_level=minimal på servern." -#: access/transam/xlog.c:5475 +#: access/transam/xlog.c:4845 #, c-format -msgid "specified neither primary_conninfo nor restore_command" -msgstr "angav varken primary_conninfo eller restore_command" +msgid "Use a backup taken after setting wal_level to higher than minimal." +msgstr "Använd en backup som är tagen efter att inställningen wal_level satts till ett högre värde än minimal." -#: access/transam/xlog.c:5476 +#: access/transam/xlog.c:4909 #, c-format -msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." -msgstr "Databasservern kommer med jämna mellanrum att poll:a pg_wal-underkatalogen för att se om filer placerats där." +msgid "control file contains invalid checkpoint location" +msgstr "kontrollfil innehåller ogiltig checkpoint-position" -#: access/transam/xlog.c:5484 +#: access/transam/xlog.c:4920 #, c-format -msgid "must specify restore_command when standby mode is not enabled" -msgstr "måste ange restore_command när standby-läge inte är påslaget" +msgid "database system was shut down at %s" +msgstr "databassystemet stängdes ner vid %s" -#: access/transam/xlog.c:5522 +#: access/transam/xlog.c:4926 #, c-format -msgid "recovery target timeline %u does not exist" -msgstr "återställningsmåltidslinje %u finns inte" +msgid "database system was shut down in recovery at %s" +msgstr "databassystemet stängdes ner under återställning vid %s" -#: access/transam/xlog.c:5644 +#: access/transam/xlog.c:4932 #, c-format -msgid "archive recovery complete" -msgstr "arkivåterställning klar" +msgid "database system shutdown was interrupted; last known up at %s" +msgstr "nedstängning av databasen avbröts; senast kända upptidpunkt vid %s" -#: access/transam/xlog.c:5710 access/transam/xlog.c:5983 +#: access/transam/xlog.c:4938 #, c-format -msgid "recovery stopping after reaching consistency" -msgstr "återställning stoppad efter att ha uppnått konsistens" +msgid "database system was interrupted while in recovery at %s" +msgstr "databassystemet avbröts under återställning vid %s" -#: access/transam/xlog.c:5731 +#: access/transam/xlog.c:4940 #, c-format -msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" -msgstr "återställning stoppad före WAL-position (LSN) \"%X/%X\"" +msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." +msgstr "Det betyder troligen att en del data är förstörd och du behöver återställa databasen från den senaste backup:en." -#: access/transam/xlog.c:5817 +#: access/transam/xlog.c:4946 #, c-format -msgid "recovery stopping before commit of transaction %u, time %s" -msgstr "återställning stoppad före commit av transaktion %u, tid %s" +msgid "database system was interrupted while in recovery at log time %s" +msgstr "databassystemet avbröts under återställning vid loggtid %s" -#: access/transam/xlog.c:5824 +#: access/transam/xlog.c:4948 #, c-format -msgid "recovery stopping before abort of transaction %u, time %s" -msgstr "återställning stoppad före abort av transaktion %u, tid %s" +msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." +msgstr "Om detta har hänt mer än en gång så kan data vara korrupt och du kanske måste återställa till ett tidigare återställningsmål." -#: access/transam/xlog.c:5877 +#: access/transam/xlog.c:4954 #, c-format -msgid "recovery stopping at restore point \"%s\", time %s" -msgstr "återställning stoppad vid återställningspunkt \"%s\", tid %s" +msgid "database system was interrupted; last known up at %s" +msgstr "databassystemet avbröts; senast kända upptidpunkt vid %s" -#: access/transam/xlog.c:5895 +#: access/transam/xlog.c:4960 #, c-format -msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" -msgstr "återställning stoppad efter WAL-position (LSN) \"%X/%X\"" +msgid "control file contains invalid database cluster state" +msgstr "kontrollfil innehåller ogiltigt databasklustertillstånd" -#: access/transam/xlog.c:5963 +#: access/transam/xlog.c:5338 #, c-format -msgid "recovery stopping after commit of transaction %u, time %s" -msgstr "återställning stoppad efter commit av transaktion %u, tid %s" +msgid "WAL ends before end of online backup" +msgstr "WAL slutar före sluttiden av online-backup:en" -#: access/transam/xlog.c:5971 +#: access/transam/xlog.c:5339 #, c-format -msgid "recovery stopping after abort of transaction %u, time %s" -msgstr "återställning stoppad efter abort av transaktion %u, tid %s" +msgid "All WAL generated while online backup was taken must be available at recovery." +msgstr "Alla genererade WAL under tiden online-backup:en togs måste vara tillgängliga vid återställning." -#: access/transam/xlog.c:6020 +#: access/transam/xlog.c:5342 #, c-format -msgid "pausing at the end of recovery" -msgstr "pausar vid slutet av återställning" +msgid "WAL ends before consistent recovery point" +msgstr "WAL avslutas innan konstistent återställningspunkt" -#: access/transam/xlog.c:6021 +#: access/transam/xlog.c:5390 #, c-format -msgid "Execute pg_wal_replay_resume() to promote." -msgstr "Kör pg_wal_replay_resume() för att befordra." +msgid "selected new timeline ID: %u" +msgstr "valt nytt tidslinje-ID: %u" -#: access/transam/xlog.c:6024 +#: access/transam/xlog.c:5423 #, c-format -msgid "recovery has paused" -msgstr "återställning har pausats" +msgid "archive recovery complete" +msgstr "arkivåterställning klar" -#: access/transam/xlog.c:6025 +#: access/transam/xlog.c:6017 #, c-format -msgid "Execute pg_wal_replay_resume() to continue." -msgstr "Kör pg_wal_replay_resume() för att fortsätta." +msgid "shutting down" +msgstr "stänger ner" -#: access/transam/xlog.c:6242 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6056 #, c-format -msgid "hot standby is not possible because %s = %d is a lower setting than on the master server (its value was %d)" -msgstr "hot standby är inte möjligt då %s = %d har ett lägre värde än på masterservern (dess värde var %d)" +msgid "restartpoint starting:%s%s%s%s%s%s%s%s" +msgstr "restartpoint startar:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6266 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6068 #, c-format -msgid "WAL was generated with wal_level=minimal, data may be missing" -msgstr "WAL genererades med wal_level=minimal, data kan saknas" +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "checkpoint startar:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6267 +#: access/transam/xlog.c:6128 #, c-format -msgid "This happens if you temporarily set wal_level=minimal without taking a new base backup." -msgstr "Detta händer om du temporärt sätter wal_level=minimal utan att ta en ny basbackup." +msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" +msgstr "restartpoint klar: skrev %d buffers (%.1f%%); %d WAL-fil(er) tillagda, %d borttagna, %d recyclade; skriv=%ld.%03d s, synk=%ld.%03d s, totalt=%ld.%03d s; synk-filer=%d, längsta=%ld.%03d s, genomsnitt=%ld.%03d s; distans=%d kB, estimat=%d kB" -#: access/transam/xlog.c:6278 +#: access/transam/xlog.c:6148 #, c-format -msgid "hot standby is not possible because wal_level was not set to \"replica\" or higher on the master server" -msgstr "hot standby är inte möjligt då wal_level inte satts till \"replica\" eller högre på masterservern" +msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" +msgstr "checkpoint klar: skrev %d buffers (%.1f%%); %d WAL-fil(er) tillagda, %d borttagna, %d recyclade; skriv=%ld.%03d s, synk=%ld.%03d s, totalt=%ld.%03d s; synk-filer=%d, längsta=%ld.%03d s, genomsnitt=%ld.%03d s; distans=%d kB, estimat=%d kB" -#: access/transam/xlog.c:6279 +#: access/transam/xlog.c:6583 #, c-format -msgid "Either set wal_level to \"replica\" on the master, or turn off hot_standby here." -msgstr "Antingen sätt wal_level till \"replica\" på mastern eller stäng av hot_standby här." +msgid "concurrent write-ahead log activity while database system is shutting down" +msgstr "samtidig write-ahead-logg-aktivitet när databassystemet stängs ner" -#: access/transam/xlog.c:6341 +#: access/transam/xlog.c:7140 #, c-format -msgid "control file contains invalid checkpoint location" -msgstr "kontrollfil innehåller ogiltig checkpoint-position" +msgid "recovery restart point at %X/%X" +msgstr "återställningens omstartspunkt vid %X/%X" -#: access/transam/xlog.c:6352 +#: access/transam/xlog.c:7142 #, c-format -msgid "database system was shut down at %s" -msgstr "databassystemet stängdes ner vid %s" +msgid "Last completed transaction was at log time %s." +msgstr "Senaste kompletta transaktionen var vid loggtid %s" -#: access/transam/xlog.c:6358 +#: access/transam/xlog.c:7389 #, c-format -msgid "database system was shut down in recovery at %s" -msgstr "databassystemet stängdes ner under återställning vid %s" +msgid "restore point \"%s\" created at %X/%X" +msgstr "återställningspunkt \"%s\" skapad vid %X/%X" -#: access/transam/xlog.c:6364 +#: access/transam/xlog.c:7596 #, c-format -msgid "database system shutdown was interrupted; last known up at %s" -msgstr "nedstängning av databasen avbröts; senast kända upptidpunkt vid %s" +msgid "online backup was canceled, recovery cannot continue" +msgstr "online-backup avbröts, återställning kan inte fortsätta" -#: access/transam/xlog.c:6370 +#: access/transam/xlog.c:7653 #, c-format -msgid "database system was interrupted while in recovery at %s" -msgstr "databassystemet avbröts under återställning vid %s" +msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" +msgstr "oväntad tidslinje-ID %u (skall vara %u) i checkpoint-post för nedstängning" -#: access/transam/xlog.c:6372 +#: access/transam/xlog.c:7711 #, c-format -msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." -msgstr "Det betyder troligen att en del data är förstörd och du behöver återställa databasen från den senaste backup:en." +msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" +msgstr "oväntad tidslinje-ID %u (skall vara %u) i checkpoint-post för online" -#: access/transam/xlog.c:6378 +#: access/transam/xlog.c:7740 #, c-format -msgid "database system was interrupted while in recovery at log time %s" -msgstr "databassystemet avbröts under återställning vid loggtid %s" +msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" +msgstr "oväntad tidslinje-ID %u (skall vara %u) i post för slutet av återställning" -#: access/transam/xlog.c:6380 +#: access/transam/xlog.c:7998 #, c-format -msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." -msgstr "Om detta har hänt mer än en gång så kan data vara korrupt och du kanske måste återställa till ett tidigare återställningsmål." +msgid "could not fsync write-through file \"%s\": %m" +msgstr "kunde inte fsync:a skriv-igenom-loggfil \"%s\": %m" -#: access/transam/xlog.c:6386 +#: access/transam/xlog.c:8004 #, c-format -msgid "database system was interrupted; last known up at %s" -msgstr "databassystemet avbröts; senast kända upptidpunkt vid %s" +msgid "could not fdatasync file \"%s\": %m" +msgstr "kunde inte fdatasync:a fil \"%s\": %m" -#: access/transam/xlog.c:6392 +#: access/transam/xlog.c:8099 access/transam/xlog.c:8471 #, c-format -msgid "control file contains invalid database cluster state" -msgstr "kontrollfil innehåller ogiltigt databasklustertillstånd" +msgid "WAL level not sufficient for making an online backup" +msgstr "WAL-nivå inte tillräcklig för att kunna skapa en online-backup" -#: access/transam/xlog.c:6449 +#: access/transam/xlog.c:8100 access/transam/xlog.c:8472 +#: access/transam/xlogfuncs.c:199 #, c-format -msgid "entering standby mode" -msgstr "går in i standby-läge" +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "wal_level måste vara satt till \"replica\" eller \"logical\" vid serverstart." -#: access/transam/xlog.c:6452 +#: access/transam/xlog.c:8105 #, c-format -msgid "starting point-in-time recovery to XID %u" -msgstr "startar point-in-time-återställning till XID %u" +msgid "backup label too long (max %d bytes)" +msgstr "backup-etikett för lång (max %d byte)" -#: access/transam/xlog.c:6456 +#: access/transam/xlog.c:8221 #, c-format -msgid "starting point-in-time recovery to %s" -msgstr "startar point-in-time-återställning till %s" +msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" +msgstr "WAL skapad med full_page_writes=off har återspelats sedab senaste omstartpunkten" -#: access/transam/xlog.c:6460 +#: access/transam/xlog.c:8223 access/transam/xlog.c:8584 #, c-format -msgid "starting point-in-time recovery to \"%s\"" -msgstr "startar point-in-time-återställning till \"%s\"" +msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." +msgstr "Det betyder att backup:en som tas på standby:en är trasig och inte skall användas. Slå på full_page_writes och kör CHECKPOINT på primären och försök sedan ta en ny online-backup igen." -#: access/transam/xlog.c:6464 +#: access/transam/xlog.c:8308 replication/basebackup.c:1338 +#: utils/adt/misc.c:347 #, c-format -msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" -msgstr "startar point-in-time-återställning till WAL-position (LSN) \"%X/%X\"" +msgid "symbolic link \"%s\" target is too long" +msgstr "mål för symbolisk länk \"%s\" är för lång" -#: access/transam/xlog.c:6469 +#: access/transam/xlog.c:8358 commands/tablespace.c:421 +#: commands/tablespace.c:603 replication/basebackup.c:1353 utils/adt/misc.c:355 #, c-format -msgid "starting point-in-time recovery to earliest consistent point" -msgstr "startar point-in-time-återställning till tidigast konsistenta punkt" +msgid "tablespaces are not supported on this platform" +msgstr "tabellutrymmen stöds inte på denna plattform" -#: access/transam/xlog.c:6472 +#: access/transam/xlog.c:8517 access/transam/xlog.c:8530 +#: access/transam/xlogrecovery.c:1191 access/transam/xlogrecovery.c:1198 +#: access/transam/xlogrecovery.c:1257 access/transam/xlogrecovery.c:1337 +#: access/transam/xlogrecovery.c:1361 #, c-format -msgid "starting archive recovery" -msgstr "Startar arkivåterställning" +msgid "invalid data in file \"%s\"" +msgstr "felaktig data i fil \"%s\"" -#: access/transam/xlog.c:6531 access/transam/xlog.c:6664 +#: access/transam/xlog.c:8534 replication/basebackup.c:1193 #, c-format -msgid "checkpoint record is at %X/%X" -msgstr "checkpoint-posten är vid %X/%X" +msgid "the standby was promoted during online backup" +msgstr "standby:en befordrades under online-backup" -#: access/transam/xlog.c:6546 +#: access/transam/xlog.c:8535 replication/basebackup.c:1194 #, c-format -msgid "could not find redo location referenced by checkpoint record" -msgstr "kunde inte hitta redo-position refererad av checkpoint-post" +msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." +msgstr "Det betyder att backupen som tas är trasig och inte skall användas. Försök ta en ny online-backup." -#: access/transam/xlog.c:6547 access/transam/xlog.c:6557 +#: access/transam/xlog.c:8582 #, c-format -msgid "" -"If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" -"If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" -"Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup." -msgstr "" -"Om du återställer från en backup, gör touch på \"%s/recovery.signal\" och lägg till\n" -"önskade återställningsalternativ. Om du inte återställer från en backup, försök ta\n" -"bort filen \"%s/backup_label\". Var försiktig: borttagning av \"%s/backup_label\"\n" -"kommer resultera i ett trasigt kluster om du återställer från en backup." +msgid "WAL generated with full_page_writes=off was replayed during online backup" +msgstr "WAL skapad med full_page_writes=off återspelades under online-backup" -#: access/transam/xlog.c:6556 +#: access/transam/xlog.c:8707 #, c-format -msgid "could not locate required checkpoint record" -msgstr "kunde inte hitta den checkpoint-post som krävs" +msgid "base backup done, waiting for required WAL segments to be archived" +msgstr "base_backup klar, väntar på att de WAL-segment som krävs blir arkiverade" -#: access/transam/xlog.c:6585 commands/tablespace.c:654 +#: access/transam/xlog.c:8721 #, c-format -msgid "could not create symbolic link \"%s\": %m" -msgstr "kan inte skapa symbolisk länk \"%s\": %m" +msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" +msgstr "väntar fortfarande på att alla krävda WAL-segments skall bli arkiverade (%d sekunder har gått)" -#: access/transam/xlog.c:6617 access/transam/xlog.c:6623 +#: access/transam/xlog.c:8723 #, c-format -msgid "ignoring file \"%s\" because no file \"%s\" exists" -msgstr "hoppar över fil \"%s\" då ingen fil \"%s\" finns" +msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." +msgstr "Kontrollera att ditt archive_command kör som det skall. Du kan avbryta denna backup på ett säkert sätt men databasbackup:en kommer inte vara användbart utan att alla WAL-segment finns." -#: access/transam/xlog.c:6619 access/transam/xlog.c:11828 +#: access/transam/xlog.c:8730 #, c-format -msgid "File \"%s\" was renamed to \"%s\"." -msgstr "Filen \"%s\" döptes om till \"%s\"." +msgid "all required WAL segments have been archived" +msgstr "alla krävda WAL-segments har arkiverats" -#: access/transam/xlog.c:6625 +#: access/transam/xlog.c:8734 #, c-format -msgid "Could not rename file \"%s\" to \"%s\": %m." -msgstr "Kunde inte döpa om fil \"%s\" till \"%s\": %m" +msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" +msgstr "WAL-arkivering är inte påslagen; du måste se till att alla krävda WAL-segment har kopierats på annat sätt för att backup:en skall vara komplett" -#: access/transam/xlog.c:6676 +#: access/transam/xlog.c:8781 #, c-format -msgid "could not locate a valid checkpoint record" -msgstr "kunde inte hitta en giltig checkpoint-post" +msgid "aborting backup due to backend exiting before pg_backup_stop was called" +msgstr "avbryter backup på grund av att backend:en stoppades innan pg_backup_stop anropades" -#: access/transam/xlog.c:6714 +#: access/transam/xlogarchive.c:208 #, c-format -msgid "requested timeline %u is not a child of this server's history" -msgstr "efterfrågad tidslinje %u är inte ett barn till denna servers historik" +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "arkivfil \"%s\" har fel storlek: %lld istället för %lld" -#: access/transam/xlog.c:6716 +#: access/transam/xlogarchive.c:217 #, c-format -msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." -msgstr "Senaste checkpoint är vid %X/%X på tidslinje %u, men i historiken för efterfrågad tidslinje så avvek servern från den tidslinjen vid %X/%X." +msgid "restored log file \"%s\" from archive" +msgstr "återställd logfil \"%s\" från arkiv" -#: access/transam/xlog.c:6732 +#: access/transam/xlogarchive.c:231 #, c-format -msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" -msgstr "efterfågan tidslinje %u innehåller inte minimal återställningspunkt %X/%X på tidslinje %u" +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "restore_command returnerade exit-kod noll men stat() misslyckades." -#: access/transam/xlog.c:6763 +#: access/transam/xlogarchive.c:263 #, c-format -msgid "invalid next transaction ID" -msgstr "nästa transaktions-ID ogiltig" +msgid "could not restore file \"%s\" from archive: %s" +msgstr "kunde inte återställa fil \"%s\" från arkiv: %s" -#: access/transam/xlog.c:6857 +#. translator: First %s represents a postgresql.conf parameter name like +#. "recovery_end_command", the 2nd is the value of that parameter, the +#. third an already translated error message. +#: access/transam/xlogarchive.c:376 #, c-format -msgid "invalid redo in checkpoint record" -msgstr "ogiltig redo i checkpoint-post" +msgid "%s \"%s\": %s" +msgstr "%s \"%s\": %s" -#: access/transam/xlog.c:6868 +#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:566 #, c-format -msgid "invalid redo record in shutdown checkpoint" -msgstr "ogiltig redo-post i nedstängnings-checkpoint" +msgid "could not create archive status file \"%s\": %m" +msgstr "kunde inte skapa arkiveringsstatusfil \"%s\": %m" -#: access/transam/xlog.c:6902 +#: access/transam/xlogarchive.c:494 access/transam/xlogarchive.c:574 #, c-format -msgid "database system was not properly shut down; automatic recovery in progress" -msgstr "databassystemet stängdes inte ned korrekt; automatisk återställning pågår" +msgid "could not write archive status file \"%s\": %m" +msgstr "kunde inte skriva arkiveringsstatusfil \"%s\": %m" -#: access/transam/xlog.c:6906 +#: access/transam/xlogfuncs.c:74 #, c-format -msgid "crash recovery starts in timeline %u and has target timeline %u" -msgstr "krashåterställning startar i tidslinje %u och har måltidslinje %u" +msgid "a backup is already in progress in this session" +msgstr "en backup är redan på gång i denna session" -#: access/transam/xlog.c:6953 +#: access/transam/xlogfuncs.c:126 #, c-format -msgid "backup_label contains data inconsistent with control file" -msgstr "backup_label innehåller data som inte stämmer med kontrollfil" +msgid "backup is not in progress" +msgstr "ingen backup är på gång" -#: access/transam/xlog.c:6954 +#: access/transam/xlogfuncs.c:127 #, c-format -msgid "This means that the backup is corrupted and you will have to use another backup for recovery." -msgstr "Det betyder att backup:en är trasig och du behöver använda en annan backup för att återställa." +msgid "Did you call pg_backup_start()?" +msgstr "Anropade du pg_backup_start()?" -#: access/transam/xlog.c:7045 +#: access/transam/xlogfuncs.c:166 access/transam/xlogfuncs.c:193 +#: access/transam/xlogfuncs.c:232 access/transam/xlogfuncs.c:253 +#: access/transam/xlogfuncs.c:274 #, c-format -msgid "initializing for hot standby" -msgstr "initierar för hot standby" +msgid "WAL control functions cannot be executed during recovery." +msgstr "WAL-kontrollfunktioner kan inte köras under återställning." -#: access/transam/xlog.c:7178 +#: access/transam/xlogfuncs.c:198 #, c-format -msgid "redo starts at %X/%X" -msgstr "redo startar vid %X/%X" +msgid "WAL level not sufficient for creating a restore point" +msgstr "WAL-nivån är inte tillräcklig för att skapa en återställningspunkt" -#: access/transam/xlog.c:7402 +#: access/transam/xlogfuncs.c:206 #, c-format -msgid "requested recovery stop point is before consistent recovery point" -msgstr "efterfrågad återställningsstoppunkt är före en konsistent återställningspunkt" +msgid "value too long for restore point (maximum %d characters)" +msgstr "värdet för långt för en återställningspunkt (maximalt %d tecken)" -#: access/transam/xlog.c:7440 +#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 #, c-format -msgid "redo done at %X/%X" -msgstr "redo gjord vid %X/%X" +msgid "%s cannot be executed during recovery." +msgstr "%s kan inte köras under återställning" -#: access/transam/xlog.c:7445 +#: access/transam/xlogfuncs.c:424 access/transam/xlogfuncs.c:454 +#: access/transam/xlogfuncs.c:478 access/transam/xlogfuncs.c:501 +#: access/transam/xlogfuncs.c:581 #, c-format -msgid "last completed transaction was at log time %s" -msgstr "senaste kompletta transaktionen var vid loggtid %s" +msgid "recovery is not in progress" +msgstr "återställning är inte i gång" -#: access/transam/xlog.c:7454 +#: access/transam/xlogfuncs.c:425 access/transam/xlogfuncs.c:455 +#: access/transam/xlogfuncs.c:479 access/transam/xlogfuncs.c:502 +#: access/transam/xlogfuncs.c:582 #, c-format -msgid "redo is not required" -msgstr "redo behövs inte" +msgid "Recovery control functions can only be executed during recovery." +msgstr "Återställningskontrollfunktioner kan bara köras under återställning." -#: access/transam/xlog.c:7466 +#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 #, c-format -msgid "recovery ended before configured recovery target was reached" -msgstr "återställning avslutades innan det konfigurerade återställningsmålet nåddes" +msgid "standby promotion is ongoing" +msgstr "standby-befordring pågår" -#: access/transam/xlog.c:7545 access/transam/xlog.c:7549 +#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 #, c-format -msgid "WAL ends before end of online backup" -msgstr "WAL slutar före sluttiden av online-backup:en" +msgid "%s cannot be executed after promotion is triggered." +msgstr "%s kan inte köras efter att befordran startats." -#: access/transam/xlog.c:7546 +#: access/transam/xlogfuncs.c:587 #, c-format -msgid "All WAL generated while online backup was taken must be available at recovery." -msgstr "Alla genererade WAL under tiden online-backup:en togs måste vara tillgängliga vid återställning." +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "\"wait_seconds\" får inte vara negativ eller noll" -#: access/transam/xlog.c:7550 +#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:252 #, c-format -msgid "Online backup started with pg_start_backup() must be ended with pg_stop_backup(), and all WAL up to that point must be available at recovery." -msgstr "Online-backup startad med pg_start_backup() måste avslutas med pg_stop_backup() och alla WAL fram till den punkten måste vara tillgängliga vid återställning." +msgid "failed to send signal to postmaster: %m" +msgstr "misslyckades med att sända en signal till postmaster: %m" -#: access/transam/xlog.c:7553 +#: access/transam/xlogfuncs.c:643 #, c-format -msgid "WAL ends before consistent recovery point" -msgstr "WAL avslutas innan konstistent återställningspunkt" +msgid "server did not promote within %d second" +msgid_plural "server did not promote within %d seconds" +msgstr[0] "servern befordrades inte inom %d sekund" +msgstr[1] "servern befordrades inte inom %d sekunder" + +#: access/transam/xlogprefetcher.c:1072 +#, fuzzy, c-format +#| msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." +msgid "recovery_prefetch not supported on platforms that lack posix_fadvise()." +msgstr "effective_io_concurrency måste sättas till 0 på plattformar som saknar posix_fadvise()." -#: access/transam/xlog.c:7588 +#: access/transam/xlogreader.c:621 #, c-format -msgid "selected new timeline ID: %u" -msgstr "valt nytt tidslinje-ID: %u" +msgid "invalid record offset at %X/%X" +msgstr "ogiltig postoffset vid %X/%X" -#: access/transam/xlog.c:8036 +#: access/transam/xlogreader.c:629 #, c-format -msgid "consistent recovery state reached at %X/%X" -msgstr "konsistent återställningstillstånd uppnått vid %X/%X" +msgid "contrecord is requested by %X/%X" +msgstr "contrecord är begärd vid %X/%X" -#: access/transam/xlog.c:8246 +#: access/transam/xlogreader.c:670 access/transam/xlogreader.c:1102 #, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "ogiltig primär checkpoint-länk i kontrollfil" +msgid "invalid record length at %X/%X: wanted %u, got %u" +msgstr "ogiltig postlängd vid %X/%X: förväntade %u, fick %u" -#: access/transam/xlog.c:8250 +#: access/transam/xlogreader.c:699 #, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "ogiltig checkpoint-länk i \"backup_label\"-fil" +msgid "out of memory while trying to decode a record of length %u" +msgstr "slut på minne vid avkodning av post med längden %u" -#: access/transam/xlog.c:8268 +#: access/transam/xlogreader.c:721 #, c-format -msgid "invalid primary checkpoint record" -msgstr "ogiltig primär checkpoint-post" +msgid "record length %u at %X/%X too long" +msgstr "postlängd %u vid %X/%X är för lång" -#: access/transam/xlog.c:8272 +#: access/transam/xlogreader.c:770 #, c-format -msgid "invalid checkpoint record" -msgstr "ogiltig checkpoint-post" +msgid "there is no contrecord flag at %X/%X" +msgstr "det finns ingen contrecord-flagga vid %X/%X" -#: access/transam/xlog.c:8283 +#: access/transam/xlogreader.c:783 #, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "ogiltig resurshanterar-ID i primär checkpoint-post" +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "ogiltig contrecord-längd %u (förväntade %lld) vid %X/%X" -#: access/transam/xlog.c:8287 +#: access/transam/xlogreader.c:1110 #, c-format -msgid "invalid resource manager ID in checkpoint record" -msgstr "ogiltig resurshanterar-ID i checkpoint-post" +msgid "invalid resource manager ID %u at %X/%X" +msgstr "ogiltigt resurshanterar-ID %u vid %X/%X" -#: access/transam/xlog.c:8300 +#: access/transam/xlogreader.c:1123 access/transam/xlogreader.c:1139 #, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "ogiltig xl_info i primär checkpoint-post" +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "post med inkorrekt prev-link %X/%X vid %X/%X" -#: access/transam/xlog.c:8304 +#: access/transam/xlogreader.c:1175 #, c-format -msgid "invalid xl_info in checkpoint record" -msgstr "ogiltig xl_info i checkpoint-post" +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "felaktig resurshanterardatakontrollsumma i post vid %X/%X" -#: access/transam/xlog.c:8315 +#: access/transam/xlogreader.c:1212 #, c-format -msgid "invalid length of primary checkpoint record" -msgstr "ogiltig längd i primär checkpoint-post" +msgid "invalid magic number %04X in log segment %s, offset %u" +msgstr "felaktigt magiskt nummer %04X i loggsegment %s, offset %u" -#: access/transam/xlog.c:8319 +#: access/transam/xlogreader.c:1226 access/transam/xlogreader.c:1267 #, c-format -msgid "invalid length of checkpoint record" -msgstr "ogiltig längd på checkpoint-post" +msgid "invalid info bits %04X in log segment %s, offset %u" +msgstr "ogiltiga infobitar %04X i loggsegment %s, offset %u" -#: access/transam/xlog.c:8499 +#: access/transam/xlogreader.c:1241 #, c-format -msgid "shutting down" -msgstr "stänger ner" +msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" +msgstr "WAL-fil är från ett annat databassystem: WAL-filens databassystemidentifierare är %llu, pg_control databassystemidentifierare är %llu" -#: access/transam/xlog.c:8819 +#: access/transam/xlogreader.c:1249 #, c-format -msgid "checkpoint skipped because system is idle" -msgstr "checkpoint överhoppad på grund av att systemet är olastat" +msgid "WAL file is from different database system: incorrect segment size in page header" +msgstr "WAL-fil är från ett annat databassystem: inkorrekt segmentstorlek i sidhuvuid" -#: access/transam/xlog.c:9019 +#: access/transam/xlogreader.c:1255 #, c-format -msgid "concurrent write-ahead log activity while database system is shutting down" -msgstr "samtidig write-ahead-logg-aktivitet när databassystemet stängs ner" +msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" +msgstr "WAL-fil är från ett annat databassystem: inkorrekt XLOG_BLCKSZ i sidhuvuid" -#: access/transam/xlog.c:9276 +#: access/transam/xlogreader.c:1286 #, c-format -msgid "skipping restartpoint, recovery has already ended" -msgstr "hoppar över omstartpunkt, återställning har redan avslutats" +msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" +msgstr "oväntad sidadress %X/%X i loggsegment %s, offset %u" -#: access/transam/xlog.c:9299 +# FIXME +#: access/transam/xlogreader.c:1311 #, c-format -msgid "skipping restartpoint, already performed at %X/%X" -msgstr "hoppar över omstartpunkt, redan gjorde vid %X/%X" +msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" +msgstr "\"ej i sekvens\"-fel på tidslinje-ID %u (efter %u) i loggsegment %s, offset %u" -#: access/transam/xlog.c:9467 +#: access/transam/xlogreader.c:1706 #, c-format -msgid "recovery restart point at %X/%X" -msgstr "återställningens omstartspunkt vid %X/%X" +msgid "out-of-order block_id %u at %X/%X" +msgstr "\"ej i sekvens\"-block_id %u vid %X/%X" -#: access/transam/xlog.c:9469 +#: access/transam/xlogreader.c:1730 #, c-format -msgid "Last completed transaction was at log time %s." -msgstr "Senaste kompletta transaktionen var vid loggtid %s" +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATA är satt men ingen data inkluderad vid %X/%X" -#: access/transam/xlog.c:9711 +#: access/transam/xlogreader.c:1737 #, c-format -msgid "restore point \"%s\" created at %X/%X" -msgstr "återställningspunkt \"%s\" skapad vid %X/%X" +msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" +msgstr "BKPBLOCK_HAS_DATA är ej satt men datalängden är %u vid %X/%X" -#: access/transam/xlog.c:9856 +#: access/transam/xlogreader.c:1773 #, c-format -msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" -msgstr "oväntad föregående tidslinje-ID %u (nuvarande tidslinje-ID %u) i checkpoint-post" +msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLE är satt men håloffset %u längd %u block-image-längd %u vid %X/%X" -#: access/transam/xlog.c:9865 +#: access/transam/xlogreader.c:1789 #, c-format -msgid "unexpected timeline ID %u (after %u) in checkpoint record" -msgstr "oväntad tidslinje-ID %u (efter %u) i checkpoint-post" +msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLE är inte satt men håloffset %u längd %u vid %X/%X" -#: access/transam/xlog.c:9881 +#: access/transam/xlogreader.c:1803 #, c-format -msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" -msgstr "oväntad tidslinje-ID %u i checkpoint-post, innan vi nått minimal återställningspunkt %X/%X på tidslinje %u" +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSED är satt men block-image-längd %u vid %X/%X" -#: access/transam/xlog.c:9957 +#: access/transam/xlogreader.c:1818 #, c-format -msgid "online backup was canceled, recovery cannot continue" -msgstr "online-backup avbröts, återställning kan inte fortsätta" +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_COMPRESSED är satt men block-image-längd är %u vid %X/%X" -#: access/transam/xlog.c:10013 access/transam/xlog.c:10069 -#: access/transam/xlog.c:10092 +#: access/transam/xlogreader.c:1834 #, c-format -msgid "unexpected timeline ID %u (should be %u) in checkpoint record" -msgstr "oväntad tidslinje-ID %u (skall vara %u) i checkpoint-post" +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "BKPBLOCK_SAME_REL är satt men ingen tidigare rel vid %X/%X" -#: access/transam/xlog.c:10418 +#: access/transam/xlogreader.c:1846 #, c-format -msgid "could not fsync write-through file \"%s\": %m" -msgstr "kunde inte fsync:a skriv-igenom-loggfil \"%s\": %m" +msgid "invalid block_id %u at %X/%X" +msgstr "ogiltig block_id %u vid %X/%X" -#: access/transam/xlog.c:10424 +#: access/transam/xlogreader.c:1913 #, c-format -msgid "could not fdatasync file \"%s\": %m" -msgstr "kunde inte fdatasync:a fil \"%s\": %m" +msgid "record with invalid length at %X/%X" +msgstr "post med ogiltig längd vid %X/%X" -#: access/transam/xlog.c:10523 access/transam/xlog.c:11061 -#: access/transam/xlogfuncs.c:275 access/transam/xlogfuncs.c:302 -#: access/transam/xlogfuncs.c:341 access/transam/xlogfuncs.c:362 -#: access/transam/xlogfuncs.c:383 +#: access/transam/xlogreader.c:1938 #, c-format -msgid "WAL control functions cannot be executed during recovery." -msgstr "WAL-kontrollfunktioner kan inte köras under återställning." +msgid "failed to locate backup block with ID %d in WAL record" +msgstr "misslyckades med att hitta backupblock med ID %d i WAL-post" -#: access/transam/xlog.c:10532 access/transam/xlog.c:11070 +#: access/transam/xlogreader.c:2044 access/transam/xlogreader.c:2061 #, c-format -msgid "WAL level not sufficient for making an online backup" -msgstr "WAL-nivå inte tillräcklig för att kunna skapa en online-backup" +msgid "image at %X/%X compressed with %s not supported by build, block %d" +msgstr "avbild vid %X/%X komprimerade med %s stöds inte av bygget, block %d" -#: access/transam/xlog.c:10533 access/transam/xlog.c:11071 -#: access/transam/xlogfuncs.c:308 +#: access/transam/xlogreader.c:2070 #, c-format -msgid "wal_level must be set to \"replica\" or \"logical\" at server start." -msgstr "wal_level måste vara satt till \"replica\" eller \"logical\" vid serverstart." +msgid "image at %X/%X compressed with unknown method, block %d" +msgstr "avbild vid %X/%X komprimerad med okänd metod, block %d" -#: access/transam/xlog.c:10538 +#: access/transam/xlogreader.c:2078 #, c-format -msgid "backup label too long (max %d bytes)" -msgstr "backup-etikett för lång (max %d byte)" +msgid "invalid compressed image at %X/%X, block %d" +msgstr "ogiltig komprimerad image vid %X/%X, block %d" -#: access/transam/xlog.c:10575 access/transam/xlog.c:10860 -#: access/transam/xlog.c:10898 +#: access/transam/xlogrecovery.c:525 #, c-format -msgid "a backup is already in progress" -msgstr "en backup är redan på gång" +msgid "entering standby mode" +msgstr "går in i standby-läge" -#: access/transam/xlog.c:10576 +#: access/transam/xlogrecovery.c:528 #, c-format -msgid "Run pg_stop_backup() and try again." -msgstr "Kör pg_stop_backup() och försök igen." +msgid "starting point-in-time recovery to XID %u" +msgstr "startar point-in-time-återställning till XID %u" -#: access/transam/xlog.c:10672 +#: access/transam/xlogrecovery.c:532 #, c-format -msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" -msgstr "WAL skapad med full_page_writes=off har återspelats sedab senaste omstartpunkten" +msgid "starting point-in-time recovery to %s" +msgstr "startar point-in-time-återställning till %s" -#: access/transam/xlog.c:10674 access/transam/xlog.c:11266 +#: access/transam/xlogrecovery.c:536 #, c-format -msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the master, and then try an online backup again." -msgstr "Det betyder att backup:en som tas på standby:en är trasig och inte skall användas. Slå på full_page_writes och kör CHECKPOINT på master och försök sedan ta en ny online-backup igen." +msgid "starting point-in-time recovery to \"%s\"" +msgstr "startar point-in-time-återställning till \"%s\"" -#: access/transam/xlog.c:10757 replication/basebackup.c:1423 -#: utils/adt/misc.c:342 +#: access/transam/xlogrecovery.c:540 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "mål för symbolisk länk \"%s\" är för lång" +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgstr "startar point-in-time-återställning till WAL-position (LSN) \"%X/%X\"" -#: access/transam/xlog.c:10810 commands/tablespace.c:402 -#: commands/tablespace.c:566 replication/basebackup.c:1438 utils/adt/misc.c:350 +#: access/transam/xlogrecovery.c:544 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "tabellutrymmen stöds inte på denna plattform" +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "startar point-in-time-återställning till tidigast konsistenta punkt" -#: access/transam/xlog.c:10861 access/transam/xlog.c:10899 +#: access/transam/xlogrecovery.c:547 #, c-format -msgid "If you're sure there is no backup in progress, remove file \"%s\" and try again." -msgstr "Om du är säker på att det inte pågår någon backup så ta bort filen \"%s\" och försök igen." +msgid "starting archive recovery" +msgstr "Startar arkivåterställning" -#: access/transam/xlog.c:11086 +#: access/transam/xlogrecovery.c:631 #, c-format -msgid "exclusive backup not in progress" -msgstr "exklusiv backup är inte på gång" +msgid "could not find redo location referenced by checkpoint record" +msgstr "kunde inte hitta redo-position refererad av checkpoint-post" -#: access/transam/xlog.c:11113 +#: access/transam/xlogrecovery.c:632 access/transam/xlogrecovery.c:642 #, c-format -msgid "a backup is not in progress" -msgstr "ingen backup är på gång" +msgid "" +"If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" +"If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" +"Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup." +msgstr "" +"Om du återställer från en backup, gör touch på \"%s/recovery.signal\" och lägg till\n" +"önskade återställningsalternativ. Om du inte återställer från en backup, försök ta\n" +"bort filen \"%s/backup_label\". Var försiktig: borttagning av \"%s/backup_label\"\n" +"kommer resultera i ett trasigt kluster om du återställer från en backup." -#: access/transam/xlog.c:11199 access/transam/xlog.c:11212 -#: access/transam/xlog.c:11601 access/transam/xlog.c:11607 -#: access/transam/xlog.c:11655 access/transam/xlog.c:11728 -#: access/transam/xlogfuncs.c:692 +#: access/transam/xlogrecovery.c:641 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "felaktig data i fil \"%s\"" +msgid "could not locate required checkpoint record" +msgstr "kunde inte hitta den checkpoint-post som krävs" -#: access/transam/xlog.c:11216 replication/basebackup.c:1271 +#: access/transam/xlogrecovery.c:670 commands/tablespace.c:707 #, c-format -msgid "the standby was promoted during online backup" -msgstr "standby:en befordrades under online-backup" +msgid "could not create symbolic link \"%s\": %m" +msgstr "kan inte skapa symbolisk länk \"%s\": %m" -#: access/transam/xlog.c:11217 replication/basebackup.c:1272 +#: access/transam/xlogrecovery.c:702 access/transam/xlogrecovery.c:708 #, c-format -msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." -msgstr "Det betyder att backupen som tas är trasig och inte skall användas. Försök ta en ny online-backup." +msgid "ignoring file \"%s\" because no file \"%s\" exists" +msgstr "hoppar över fil \"%s\" då ingen fil \"%s\" finns" -#: access/transam/xlog.c:11264 +#: access/transam/xlogrecovery.c:704 #, c-format -msgid "WAL generated with full_page_writes=off was replayed during online backup" -msgstr "WAL skapad med full_page_writes=off återspelades under online-backup" +msgid "File \"%s\" was renamed to \"%s\"." +msgstr "Filen \"%s\" döptes om till \"%s\"." -#: access/transam/xlog.c:11384 +#: access/transam/xlogrecovery.c:710 #, c-format -msgid "base backup done, waiting for required WAL segments to be archived" -msgstr "base_backup klar, väntar på att de WAL-segment som krävs blir arkiverade" +msgid "Could not rename file \"%s\" to \"%s\": %m." +msgstr "Kunde inte döpa om fil \"%s\" till \"%s\": %m" -#: access/transam/xlog.c:11396 +#: access/transam/xlogrecovery.c:764 #, c-format -msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" -msgstr "väntar fortfarande på att alla krävda WAL-segments skall bli arkiverade (%d sekunder har gått)" +msgid "could not locate a valid checkpoint record" +msgstr "kunde inte hitta en giltig checkpoint-post" -#: access/transam/xlog.c:11398 +#: access/transam/xlogrecovery.c:788 #, c-format -msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." -msgstr "Kontrollera att ditt archive_command kör som det skall. Du kan avbryta denna backup på ett säkert sätt men databasbackup:en kommer inte vara användbart utan att alla WAL-segment finns." +msgid "requested timeline %u is not a child of this server's history" +msgstr "efterfrågad tidslinje %u är inte ett barn till denna servers historik" -#: access/transam/xlog.c:11405 +#: access/transam/xlogrecovery.c:790 #, c-format -msgid "all required WAL segments have been archived" -msgstr "alla krävda WAL-segments har arkiverats" +msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." +msgstr "Senaste checkpoint är vid %X/%X på tidslinje %u, men i historiken för efterfrågad tidslinje så avvek servern från den tidslinjen vid %X/%X." -#: access/transam/xlog.c:11409 +#: access/transam/xlogrecovery.c:804 #, c-format -msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" -msgstr "WAL-arkivering är inte påslagen; du måste se till att alla krävda WAL-segment har kopierats på annat sätt för att backup:en skall vara komplett" +msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" +msgstr "efterfågan tidslinje %u innehåller inte minimal återställningspunkt %X/%X på tidslinje %u" -#: access/transam/xlog.c:11462 +#: access/transam/xlogrecovery.c:832 #, c-format -msgid "aborting backup due to backend exiting before pg_stop_backup was called" -msgstr "avbryter backup på grund av att backend:en stoppades innan pg_stop_backup anropades" +msgid "invalid next transaction ID" +msgstr "nästa transaktions-ID ogiltig" -#: access/transam/xlog.c:11638 +#: access/transam/xlogrecovery.c:837 #, c-format -msgid "backup time %s in file \"%s\"" -msgstr "backuptid %s i fil \"%s\"" +msgid "invalid redo in checkpoint record" +msgstr "ogiltig redo i checkpoint-post" -#: access/transam/xlog.c:11643 +#: access/transam/xlogrecovery.c:848 #, c-format -msgid "backup label %s in file \"%s\"" -msgstr "backup-etikett %s i fil \"%s\"" +msgid "invalid redo record in shutdown checkpoint" +msgstr "ogiltig redo-post i nedstängnings-checkpoint" -#: access/transam/xlog.c:11656 +#: access/transam/xlogrecovery.c:877 #, c-format -msgid "Timeline ID parsed is %u, but expected %u." -msgstr "Parsad tidslinje-ID är %u men förväntade sig %u." +msgid "database system was not properly shut down; automatic recovery in progress" +msgstr "databassystemet stängdes inte ned korrekt; automatisk återställning pågår" -#: access/transam/xlog.c:11660 +#: access/transam/xlogrecovery.c:881 #, c-format -msgid "backup timeline %u in file \"%s\"" -msgstr "backuptidslinje %u i fil \"%s\"" +msgid "crash recovery starts in timeline %u and has target timeline %u" +msgstr "krashåterställning startar i tidslinje %u och har måltidslinje %u" -#. translator: %s is a WAL record description -#: access/transam/xlog.c:11768 +#: access/transam/xlogrecovery.c:924 #, c-format -msgid "WAL redo at %X/%X for %s" -msgstr "WAL-redo vid %X/%X för %s" +msgid "backup_label contains data inconsistent with control file" +msgstr "backup_label innehåller data som inte stämmer med kontrollfil" -#: access/transam/xlog.c:11817 +#: access/transam/xlogrecovery.c:925 #, c-format -msgid "online backup mode was not canceled" -msgstr "online backupläge har ej avbrutits" +msgid "This means that the backup is corrupted and you will have to use another backup for recovery." +msgstr "Det betyder att backup:en är trasig och du behöver använda en annan backup för att återställa." -#: access/transam/xlog.c:11818 +#: access/transam/xlogrecovery.c:979 #, c-format -msgid "File \"%s\" could not be renamed to \"%s\": %m." -msgstr "Filen \"%s\" kunde inte döpas om till \"%s\": %m." +msgid "using recovery command file \"%s\" is not supported" +msgstr "använda återställningskommandofil \"%s\" stöds inte" -#: access/transam/xlog.c:11827 access/transam/xlog.c:11839 -#: access/transam/xlog.c:11849 +#: access/transam/xlogrecovery.c:1044 #, c-format -msgid "online backup mode canceled" -msgstr "online backupläge avbrutet" +msgid "standby mode is not supported by single-user servers" +msgstr "standby-läge stöd inte av enanvändarservrar" -#: access/transam/xlog.c:11840 +#: access/transam/xlogrecovery.c:1061 #, c-format -msgid "Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." -msgstr "Filer \"%s\" och \"%s\" döptes om till \"%s\" och \"%s\", var för sig." +msgid "specified neither primary_conninfo nor restore_command" +msgstr "angav varken primary_conninfo eller restore_command" -#: access/transam/xlog.c:11850 +#: access/transam/xlogrecovery.c:1062 #, c-format -msgid "File \"%s\" was renamed to \"%s\", but file \"%s\" could not be renamed to \"%s\": %m." -msgstr "Filen \"%s\" dötes om till \"%s\", men filen \"%s\" kunde inte döpas om till \"%s\": %m." +msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." +msgstr "Databasservern kommer med jämna mellanrum att poll:a pg_wal-underkatalogen för att se om filer placerats där." -#: access/transam/xlog.c:11983 access/transam/xlogutils.c:971 +#: access/transam/xlogrecovery.c:1070 #, c-format -msgid "could not read from log segment %s, offset %u: %m" -msgstr "kunde inte läsa från loggsegment %s, offset %u: %m" +msgid "must specify restore_command when standby mode is not enabled" +msgstr "måste ange restore_command när standby-läge inte är påslaget" -#: access/transam/xlog.c:11989 access/transam/xlogutils.c:978 +#: access/transam/xlogrecovery.c:1108 #, c-format -msgid "could not read from log segment %s, offset %u: read %d of %zu" -msgstr "kunde inte läsa från loggsegment %s, offset %u, läste %d av %zu" +msgid "recovery target timeline %u does not exist" +msgstr "återställningsmåltidslinje %u finns inte" -#: access/transam/xlog.c:12518 +#: access/transam/xlogrecovery.c:1258 #, c-format -msgid "WAL receiver process shutdown requested" -msgstr "nedstängning av WAL-mottagarprocess efterfrågad" +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "Parsad tidslinje-ID är %u men förväntade sig %u." -#: access/transam/xlog.c:12624 +#: access/transam/xlogrecovery.c:1640 #, c-format -msgid "received promote request" -msgstr "tog emot förfrågan om befordring" +msgid "redo starts at %X/%X" +msgstr "redo startar vid %X/%X" -#: access/transam/xlog.c:12637 +#: access/transam/xlogrecovery.c:1653 #, c-format -msgid "promote trigger file found: %s" -msgstr "utlösarfil för befordring hittad: %s" +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "redo pågår, förfluten tid: %ld.%02d s, nuvarande LSN: %X/%X" -#: access/transam/xlog.c:12646 +#: access/transam/xlogrecovery.c:1745 #, c-format -msgid "could not stat promote trigger file \"%s\": %m" -msgstr "kunde inte göra stat() på utlösarfil för befordring \"%s\": %m" +msgid "requested recovery stop point is before consistent recovery point" +msgstr "efterfrågad återställningsstoppunkt är före en konsistent återställningspunkt" -#: access/transam/xlogarchive.c:205 +#: access/transam/xlogrecovery.c:1777 #, c-format -msgid "archive file \"%s\" has wrong size: %lu instead of %lu" -msgstr "arkivfil \"%s\" har fel storlek: %lu istället för %lu" +msgid "redo done at %X/%X system usage: %s" +msgstr "redo gjord vid %X/%X systemanvändning: %s" -#: access/transam/xlogarchive.c:214 +#: access/transam/xlogrecovery.c:1783 #, c-format -msgid "restored log file \"%s\" from archive" -msgstr "återställd logfil \"%s\" från arkiv" +msgid "last completed transaction was at log time %s" +msgstr "senaste kompletta transaktionen var vid loggtid %s" -#: access/transam/xlogarchive.c:259 +#: access/transam/xlogrecovery.c:1792 #, c-format -msgid "could not restore file \"%s\" from archive: %s" -msgstr "kunde inte återställa fil \"%s\" från arkiv: %s" +msgid "redo is not required" +msgstr "redo behövs inte" -#. translator: First %s represents a postgresql.conf parameter name like -#. "recovery_end_command", the 2nd is the value of that parameter, the -#. third an already translated error message. -#: access/transam/xlogarchive.c:368 +#: access/transam/xlogrecovery.c:1803 #, c-format -msgid "%s \"%s\": %s" -msgstr "%s \"%s\": %s" +msgid "recovery ended before configured recovery target was reached" +msgstr "återställning avslutades innan det konfigurerade återställningsmålet nåddes" -#: access/transam/xlogarchive.c:478 access/transam/xlogarchive.c:542 +#: access/transam/xlogrecovery.c:1978 #, c-format -msgid "could not create archive status file \"%s\": %m" -msgstr "kunde inte skapa arkiveringsstatusfil \"%s\": %m" +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "lyckades hoppa över saknad contrecord vid %X/%X, överskriven vid %s" -#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:550 +#: access/transam/xlogrecovery.c:2073 #, c-format -msgid "could not write archive status file \"%s\": %m" -msgstr "kunde inte skriva arkiveringsstatusfil \"%s\": %m" +msgid "consistent recovery state reached at %X/%X" +msgstr "konsistent återställningstillstånd uppnått vid %X/%X" -#: access/transam/xlogfuncs.c:74 +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2111 #, c-format -msgid "a backup is already in progress in this session" -msgstr "en backup är redan på gång i denna session" +msgid "WAL redo at %X/%X for %s" +msgstr "WAL-redo vid %X/%X för %s" -#: access/transam/xlogfuncs.c:132 access/transam/xlogfuncs.c:213 +#: access/transam/xlogrecovery.c:2207 #, c-format -msgid "non-exclusive backup in progress" -msgstr "icke-exklusiv backup är på gång" +msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" +msgstr "oväntad föregående tidslinje-ID %u (nuvarande tidslinje-ID %u) i checkpoint-post" -#: access/transam/xlogfuncs.c:133 access/transam/xlogfuncs.c:214 +#: access/transam/xlogrecovery.c:2216 #, c-format -msgid "Did you mean to use pg_stop_backup('f')?" -msgstr "Menade du att använda pg_stop_backup('f')?" +msgid "unexpected timeline ID %u (after %u) in checkpoint record" +msgstr "oväntad tidslinje-ID %u (efter %u) i checkpoint-post" -#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1332 -#: commands/event_trigger.c:1890 commands/extension.c:1944 -#: commands/extension.c:2052 commands/extension.c:2337 commands/prepare.c:712 -#: executor/execExpr.c:2203 executor/execSRF.c:728 executor/functions.c:1040 -#: foreign/foreign.c:520 libpq/hba.c:2666 replication/logical/launcher.c:1086 -#: replication/logical/logicalfuncs.c:157 replication/logical/origin.c:1486 -#: replication/slotfuncs.c:252 replication/walsender.c:3266 -#: storage/ipc/shmem.c:550 utils/adt/datetime.c:4765 utils/adt/genfile.c:505 -#: utils/adt/genfile.c:588 utils/adt/jsonfuncs.c:1792 -#: utils/adt/jsonfuncs.c:1904 utils/adt/jsonfuncs.c:2092 -#: utils/adt/jsonfuncs.c:2201 utils/adt/jsonfuncs.c:3663 utils/adt/misc.c:215 -#: utils/adt/pgstatfuncs.c:476 utils/adt/pgstatfuncs.c:584 -#: utils/adt/pgstatfuncs.c:1719 utils/fmgr/funcapi.c:72 utils/misc/guc.c:9676 -#: utils/mmgr/portalmem.c:1136 +#: access/transam/xlogrecovery.c:2232 #, c-format -msgid "set-valued function called in context that cannot accept a set" -msgstr "en funktion som returnerar en mängd anropades i kontext som inte godtar en mängd" +msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" +msgstr "oväntad tidslinje-ID %u i checkpoint-post, innan vi nått minimal återställningspunkt %X/%X på tidslinje %u" -#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1336 -#: commands/event_trigger.c:1894 commands/extension.c:1948 -#: commands/extension.c:2056 commands/extension.c:2341 commands/prepare.c:716 -#: foreign/foreign.c:525 libpq/hba.c:2670 replication/logical/launcher.c:1090 -#: replication/logical/logicalfuncs.c:161 replication/logical/origin.c:1490 -#: replication/slotfuncs.c:256 replication/walsender.c:3270 -#: storage/ipc/shmem.c:554 utils/adt/datetime.c:4769 utils/adt/genfile.c:509 -#: utils/adt/genfile.c:592 utils/adt/misc.c:219 utils/adt/pgstatfuncs.c:480 -#: utils/adt/pgstatfuncs.c:588 utils/adt/pgstatfuncs.c:1723 -#: utils/misc/guc.c:9680 utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1140 +#: access/transam/xlogrecovery.c:2414 access/transam/xlogrecovery.c:2685 #, c-format -msgid "materialize mode required, but it is not allowed in this context" -msgstr "materialiserat läge krävs, men stöds inte i detta kontext" +msgid "recovery stopping after reaching consistency" +msgstr "återställning stoppad efter att ha uppnått konsistens" -#: access/transam/xlogfuncs.c:230 +#: access/transam/xlogrecovery.c:2435 #, c-format -msgid "non-exclusive backup is not in progress" -msgstr "icke-exklusiv backup är inte på gång" +msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "återställning stoppad före WAL-position (LSN) \"%X/%X\"" -#: access/transam/xlogfuncs.c:231 +#: access/transam/xlogrecovery.c:2520 #, c-format -msgid "Did you mean to use pg_stop_backup('t')?" -msgstr "Menade du att använda pg_stop_backup('t')?" +msgid "recovery stopping before commit of transaction %u, time %s" +msgstr "återställning stoppad före commit av transaktion %u, tid %s" -#: access/transam/xlogfuncs.c:307 +#: access/transam/xlogrecovery.c:2527 #, c-format -msgid "WAL level not sufficient for creating a restore point" -msgstr "WAL-nivån är inte tillräcklig för att skapa en återställningspunkt" +msgid "recovery stopping before abort of transaction %u, time %s" +msgstr "återställning stoppad före abort av transaktion %u, tid %s" -#: access/transam/xlogfuncs.c:315 +#: access/transam/xlogrecovery.c:2580 #, c-format -msgid "value too long for restore point (maximum %d characters)" -msgstr "värdet för långt för en återställningspunkt (maximalt %d tecken)" +msgid "recovery stopping at restore point \"%s\", time %s" +msgstr "återställning stoppad vid återställningspunkt \"%s\", tid %s" -#: access/transam/xlogfuncs.c:453 access/transam/xlogfuncs.c:510 +#: access/transam/xlogrecovery.c:2598 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "%s kan inte köras under återställning" +msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" +msgstr "återställning stoppad efter WAL-position (LSN) \"%X/%X\"" -#: access/transam/xlogfuncs.c:531 access/transam/xlogfuncs.c:558 -#: access/transam/xlogfuncs.c:582 access/transam/xlogfuncs.c:722 +#: access/transam/xlogrecovery.c:2665 #, c-format -msgid "recovery is not in progress" -msgstr "återställning är inte i gång" +msgid "recovery stopping after commit of transaction %u, time %s" +msgstr "återställning stoppad efter commit av transaktion %u, tid %s" -#: access/transam/xlogfuncs.c:532 access/transam/xlogfuncs.c:559 -#: access/transam/xlogfuncs.c:583 access/transam/xlogfuncs.c:723 +#: access/transam/xlogrecovery.c:2673 #, c-format -msgid "Recovery control functions can only be executed during recovery." -msgstr "Återställningskontrollfunktioner kan bara köras under återställning." +msgid "recovery stopping after abort of transaction %u, time %s" +msgstr "återställning stoppad efter abort av transaktion %u, tid %s" -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:564 +#: access/transam/xlogrecovery.c:2754 #, c-format -msgid "standby promotion is ongoing" -msgstr "standby-befordring pågår" +msgid "pausing at the end of recovery" +msgstr "pausar vid slutet av återställning" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:565 +#: access/transam/xlogrecovery.c:2755 #, c-format -msgid "%s cannot be executed after promotion is triggered." -msgstr "%s kan inte köras efter att befordran startats." +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "Kör pg_wal_replay_resume() för att befordra." + +#: access/transam/xlogrecovery.c:2758 access/transam/xlogrecovery.c:4549 +#, c-format +msgid "recovery has paused" +msgstr "återställning har pausats" + +#: access/transam/xlogrecovery.c:2759 +#, c-format +msgid "Execute pg_wal_replay_resume() to continue." +msgstr "Kör pg_wal_replay_resume() för att fortsätta." -#: access/transam/xlogfuncs.c:728 +#: access/transam/xlogrecovery.c:3019 #, c-format -msgid "\"wait_seconds\" must not be negative or zero" -msgstr "\"wait_seconds\" får inte vara negativ eller noll" +msgid "unexpected timeline ID %u in log segment %s, offset %u" +msgstr "oväntad tidslinje-ID %u i loggsegment %s, offset %u" -#: access/transam/xlogfuncs.c:748 storage/ipc/signalfuncs.c:164 +#: access/transam/xlogrecovery.c:3224 #, c-format -msgid "failed to send signal to postmaster: %m" -msgstr "misslyckades med att sända en signal till postmaster: %m" +msgid "could not read from log segment %s, offset %u: %m" +msgstr "kunde inte läsa från loggsegment %s, offset %u: %m" -#: access/transam/xlogfuncs.c:784 +#: access/transam/xlogrecovery.c:3230 #, c-format -msgid "server did not promote within %d seconds" -msgstr "servern befordrades inte inom %d sekunder" +msgid "could not read from log segment %s, offset %u: read %d of %zu" +msgstr "kunde inte läsa från loggsegment %s, offset %u, läste %d av %zu" -#: access/transam/xlogreader.c:349 +#: access/transam/xlogrecovery.c:3866 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "ogiltig postoffset vid %X/%X" +msgid "invalid primary checkpoint link in control file" +msgstr "ogiltig primär checkpoint-länk i kontrollfil" -#: access/transam/xlogreader.c:357 +#: access/transam/xlogrecovery.c:3870 #, c-format -msgid "contrecord is requested by %X/%X" -msgstr "contrecord är begärd vid %X/%X" +msgid "invalid checkpoint link in backup_label file" +msgstr "ogiltig checkpoint-länk i \"backup_label\"-fil" -#: access/transam/xlogreader.c:398 access/transam/xlogreader.c:695 +#: access/transam/xlogrecovery.c:3888 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "ogiltig postlängd vid %X/%X: förväntade %u, fick %u" +msgid "invalid primary checkpoint record" +msgstr "ogiltig primär checkpoint-post" -#: access/transam/xlogreader.c:422 +#: access/transam/xlogrecovery.c:3892 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "postlängd %u vid %X/%X är för lång" +msgid "invalid checkpoint record" +msgstr "ogiltig checkpoint-post" -#: access/transam/xlogreader.c:454 +#: access/transam/xlogrecovery.c:3903 #, c-format -msgid "there is no contrecord flag at %X/%X" -msgstr "det finns ingen contrecord-flagga vid %X/%X" +msgid "invalid resource manager ID in primary checkpoint record" +msgstr "ogiltig resurshanterar-ID i primär checkpoint-post" -#: access/transam/xlogreader.c:467 +#: access/transam/xlogrecovery.c:3907 #, c-format -msgid "invalid contrecord length %u at %X/%X" -msgstr "ogiltig contrecord-längd %u vid %X/%X" +msgid "invalid resource manager ID in checkpoint record" +msgstr "ogiltig resurshanterar-ID i checkpoint-post" -#: access/transam/xlogreader.c:703 +#: access/transam/xlogrecovery.c:3920 #, c-format -msgid "invalid resource manager ID %u at %X/%X" -msgstr "ogiltigt resurshanterar-ID %u vid %X/%X" +msgid "invalid xl_info in primary checkpoint record" +msgstr "ogiltig xl_info i primär checkpoint-post" -#: access/transam/xlogreader.c:717 access/transam/xlogreader.c:734 +#: access/transam/xlogrecovery.c:3924 #, c-format -msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "post med inkorrekt prev-link %X/%X vid %X/%X" +msgid "invalid xl_info in checkpoint record" +msgstr "ogiltig xl_info i checkpoint-post" -#: access/transam/xlogreader.c:771 +#: access/transam/xlogrecovery.c:3935 #, c-format -msgid "incorrect resource manager data checksum in record at %X/%X" -msgstr "felaktig resurshanterardatakontrollsumma i post vid %X/%X" +msgid "invalid length of primary checkpoint record" +msgstr "ogiltig längd i primär checkpoint-post" -#: access/transam/xlogreader.c:808 +#: access/transam/xlogrecovery.c:3939 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "felaktigt magiskt nummer %04X i loggsegment %s, offset %u" +msgid "invalid length of checkpoint record" +msgstr "ogiltig längd på checkpoint-post" -#: access/transam/xlogreader.c:822 access/transam/xlogreader.c:863 +#: access/transam/xlogrecovery.c:3995 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "ogiltiga infobitar %04X i loggsegment %s, offset %u" +msgid "new timeline %u is not a child of database system timeline %u" +msgstr "ny tidslinje %u är inte ett barn till databasens systemtidslinje %u" -#: access/transam/xlogreader.c:837 +#: access/transam/xlogrecovery.c:4009 #, c-format -msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" -msgstr "WAL-fil är från ett annat databassystem: WAL-filens databassystemidentifierare är %llu, pg_control databassystemidentifierare är %llu" +msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" +msgstr "ny tidslinje %u skapad från aktuella databasens systemtidslinje %u innan nuvarande återställningspunkt %X/%X" -#: access/transam/xlogreader.c:845 +#: access/transam/xlogrecovery.c:4028 #, c-format -msgid "WAL file is from different database system: incorrect segment size in page header" -msgstr "WAL-fil är från ett annat databassystem: inkorrekt segmentstorlek i sidhuvuid" +msgid "new target timeline is %u" +msgstr "ny måltidslinje är %u" -#: access/transam/xlogreader.c:851 +#: access/transam/xlogrecovery.c:4231 #, c-format -msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" -msgstr "WAL-fil är från ett annat databassystem: inkorrekt XLOG_BLCKSZ i sidhuvuid" +msgid "WAL receiver process shutdown requested" +msgstr "nedstängning av WAL-mottagarprocess efterfrågad" -#: access/transam/xlogreader.c:882 +#: access/transam/xlogrecovery.c:4294 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "oväntad sidadress %X/%X i loggsegment %s, offset %u" +msgid "received promote request" +msgstr "tog emot förfrågan om befordring" -# FIXME -#: access/transam/xlogreader.c:907 +#: access/transam/xlogrecovery.c:4307 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "\"ej i sekvens\"-fel på tidslinje-ID %u (efter %u) i loggsegment %s, offset %u" +msgid "promote trigger file found: %s" +msgstr "utlösarfil för befordring hittad: %s" -#: access/transam/xlogreader.c:1247 +#: access/transam/xlogrecovery.c:4315 #, c-format -msgid "out-of-order block_id %u at %X/%X" -msgstr "\"ej i sekvens\"-block_id %u vid %X/%X" +msgid "could not stat promote trigger file \"%s\": %m" +msgstr "kunde inte göra stat() på utlösarfil för befordring \"%s\": %m" -#: access/transam/xlogreader.c:1270 +#: access/transam/xlogrecovery.c:4540 #, c-format -msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" -msgstr "BKPBLOCK_HAS_DATA satt, men ingen data inkluderad vid %X/%X" +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "hot standby är inte möjligt på grund av otillräckliga parameterinställningar" -#: access/transam/xlogreader.c:1277 +#: access/transam/xlogrecovery.c:4541 access/transam/xlogrecovery.c:4568 +#: access/transam/xlogrecovery.c:4598 #, c-format -msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" -msgstr "BKPBLOCK_HAS_DATA ej satt, men datalängd är %u vid %X/%X" +msgid "%s = %d is a lower setting than on the primary server, where its value was %d." +msgstr "%s = %d har ett lägre värde än på primärservern där värdet var %d." -#: access/transam/xlogreader.c:1313 +#: access/transam/xlogrecovery.c:4550 #, c-format -msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLE satt, men håloffset %u längd %u block-image-längd %u vid %X/%X" +msgid "If recovery is unpaused, the server will shut down." +msgstr "Om återställning avpausas så kommer servern stänga ner." -#: access/transam/xlogreader.c:1329 +#: access/transam/xlogrecovery.c:4551 #, c-format -msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLE ej satt, men håloffset %u längd %u vid %X/%X" +msgid "You can then restart the server after making the necessary configuration changes." +msgstr "Du kan då återstarta servern efter att ha gjort de nödvändiga konfigurationsändringarna." -#: access/transam/xlogreader.c:1344 +#: access/transam/xlogrecovery.c:4562 #, c-format -msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" -msgstr "BKPIMAGE_IS_COMPRESSED satt, men block-image-längd %u vid %X/%X" +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "befordran är inte möjligt på grund av otillräckliga parameterinställningar" -#: access/transam/xlogreader.c:1359 +#: access/transam/xlogrecovery.c:4572 #, c-format -msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" -msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_IS_COMPRESSED satt, men block-image-längd är %u vid %X/%X" +msgid "Restart the server after making the necessary configuration changes." +msgstr "Starta om servern efter att ha gjort de nödvändiga konfigurationsändringarna." -#: access/transam/xlogreader.c:1375 +#: access/transam/xlogrecovery.c:4596 #, c-format -msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" -msgstr "BKPBLOCK_SAME_REL satt men ingen tidigare rel vid %X/%X" +msgid "recovery aborted because of insufficient parameter settings" +msgstr "återställning avbruten på grund av otillräckliga parametervärden" -#: access/transam/xlogreader.c:1387 +#: access/transam/xlogrecovery.c:4602 #, c-format -msgid "invalid block_id %u at %X/%X" -msgstr "ogiltig block_id %u vid %X/%X" +msgid "You can restart the server after making the necessary configuration changes." +msgstr "Du kan starta om servern efter att du gjort de nödvändiga konfigurationsändringarna." -#: access/transam/xlogreader.c:1476 +#: access/transam/xlogutils.c:1051 #, c-format -msgid "record with invalid length at %X/%X" -msgstr "post med ogiltig längd vid %X/%X" +msgid "could not read from log segment %s, offset %d: %m" +msgstr "kunde inte läsa från loggsegment %s, offset %d: %m" -#: access/transam/xlogreader.c:1565 +#: access/transam/xlogutils.c:1058 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "ogiltig komprimerad image vid %X/%X, block %d" +msgid "could not read from log segment %s, offset %d: read %d of %d" +msgstr "kunde inte läsa från loggsegment %s, offset %d, läste %d av %d" -#: bootstrap/bootstrap.c:271 +#: bootstrap/bootstrap.c:263 #, c-format msgid "-X requires a power of two value between 1 MB and 1 GB" msgstr "-X kräver ett tvåpotensvärde mellan 1 MB och 1 GB" -#: bootstrap/bootstrap.c:288 postmaster/postmaster.c:842 tcop/postgres.c:3705 +#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3889 #, c-format msgid "--%s requires a value" msgstr "--%s kräver ett värde" -#: bootstrap/bootstrap.c:293 postmaster/postmaster.c:847 tcop/postgres.c:3710 +#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3894 #, c-format msgid "-c %s requires a value" msgstr "-c %s kräver ett värde" -#: bootstrap/bootstrap.c:304 postmaster/postmaster.c:859 -#: postmaster/postmaster.c:872 +#: bootstrap/bootstrap.c:296 postmaster/postmaster.c:863 +#: postmaster/postmaster.c:876 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Försök med \"%s --help\" för mer information.\n" -#: bootstrap/bootstrap.c:313 +#: bootstrap/bootstrap.c:305 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s: ogiltigt kommandoradsargument\n" -#: catalog/aclchk.c:181 +#: catalog/aclchk.c:185 #, c-format msgid "grant options can only be granted to roles" msgstr "\"grant option\" kan bara ges till roller" -#: catalog/aclchk.c:300 +#: catalog/aclchk.c:307 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "inga rättigheter givna för kolumn \"%s\" i relation \"%s\"" -#: catalog/aclchk.c:305 +#: catalog/aclchk.c:312 #, c-format msgid "no privileges were granted for \"%s\"" msgstr "inga rättigheter gavs till \"%s\"" -#: catalog/aclchk.c:313 +#: catalog/aclchk.c:320 #, c-format msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" msgstr "inte alla rättigheter givna för kolumn \"%s\" i relation \"%s\"" -#: catalog/aclchk.c:318 +#: catalog/aclchk.c:325 #, c-format msgid "not all privileges were granted for \"%s\"" msgstr "inte alla rättigheter givna för \"%s\"" -#: catalog/aclchk.c:329 +#: catalog/aclchk.c:336 #, c-format msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "inga rättigheter kunde tas tillbaka från kolumn \"%s\" i relation \"%s\"" -#: catalog/aclchk.c:334 +#: catalog/aclchk.c:341 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "inga rättigheter kunde tas tillbaka från \"%s\"" -#: catalog/aclchk.c:342 +#: catalog/aclchk.c:349 #, c-format msgid "not all privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "inte alla rättigheter kunde tas tillbaka från kolumn \"%s\" i relation \"%s\"" -#: catalog/aclchk.c:347 +#: catalog/aclchk.c:354 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "inte alla rättigheter kunde tas tillbaka från \"%s\"" -#: catalog/aclchk.c:430 catalog/aclchk.c:973 +#: catalog/aclchk.c:386 +#, c-format +msgid "grantor must be current user" +msgstr "utfärdare måste vara den aktiva användaren" + +#: catalog/aclchk.c:454 catalog/aclchk.c:1029 #, c-format msgid "invalid privilege type %s for relation" msgstr "ogiltig privilegietyp %s för relation" -#: catalog/aclchk.c:434 catalog/aclchk.c:977 +#: catalog/aclchk.c:458 catalog/aclchk.c:1033 #, c-format msgid "invalid privilege type %s for sequence" msgstr "ogiltig privilegietyp %s för sekvens" -#: catalog/aclchk.c:438 +#: catalog/aclchk.c:462 #, c-format msgid "invalid privilege type %s for database" msgstr "ogiltig privilegietyp %s för databas" -#: catalog/aclchk.c:442 +#: catalog/aclchk.c:466 #, c-format msgid "invalid privilege type %s for domain" msgstr "ogiltig privilegietyp %s för domän" -#: catalog/aclchk.c:446 catalog/aclchk.c:981 +#: catalog/aclchk.c:470 catalog/aclchk.c:1037 #, c-format msgid "invalid privilege type %s for function" msgstr "ogiltig privilegietyp %s för funktion" -#: catalog/aclchk.c:450 +#: catalog/aclchk.c:474 #, c-format msgid "invalid privilege type %s for language" msgstr "ogiltig privilegietyp %s för språk" -#: catalog/aclchk.c:454 +#: catalog/aclchk.c:478 #, c-format msgid "invalid privilege type %s for large object" msgstr "ogiltig privilegietyp %s för stort objekt" -#: catalog/aclchk.c:458 catalog/aclchk.c:997 +#: catalog/aclchk.c:482 catalog/aclchk.c:1053 #, c-format msgid "invalid privilege type %s for schema" msgstr "ogiltig privilegietyp %s för schema" -#: catalog/aclchk.c:462 catalog/aclchk.c:985 +#: catalog/aclchk.c:486 catalog/aclchk.c:1041 #, c-format msgid "invalid privilege type %s for procedure" msgstr "ogiltig rättighetstyp %s för procedur" -#: catalog/aclchk.c:466 catalog/aclchk.c:989 +#: catalog/aclchk.c:490 catalog/aclchk.c:1045 #, c-format msgid "invalid privilege type %s for routine" msgstr "ogiltig rättighetstyp %s för rutin" -#: catalog/aclchk.c:470 +#: catalog/aclchk.c:494 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "ogiltig privilegietyp %s för tabellutrymme" -#: catalog/aclchk.c:474 catalog/aclchk.c:993 +#: catalog/aclchk.c:498 catalog/aclchk.c:1049 #, c-format msgid "invalid privilege type %s for type" msgstr "ogiltig privilegietyp %s för typ" -#: catalog/aclchk.c:478 +#: catalog/aclchk.c:502 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "ogiltig privilegietyp %s för främmande data-omvandlare" -#: catalog/aclchk.c:482 +#: catalog/aclchk.c:506 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "ogiltig privilegietyp %s för främmande server" -#: catalog/aclchk.c:521 +#: catalog/aclchk.c:510 +#, fuzzy, c-format +#| msgid "invalid privilege type %s for type" +msgid "invalid privilege type %s for parameter" +msgstr "ogiltig privilegietyp %s för typ" + +#: catalog/aclchk.c:549 #, c-format msgid "column privileges are only valid for relations" msgstr "kolumnprivilegier är bara giltiga för relationer" -#: catalog/aclchk.c:681 catalog/aclchk.c:4100 catalog/aclchk.c:4882 -#: catalog/objectaddress.c:965 catalog/pg_largeobject.c:116 -#: storage/large_object/inv_api.c:285 +#: catalog/aclchk.c:712 catalog/aclchk.c:4486 catalog/aclchk.c:5333 +#: catalog/objectaddress.c:1072 catalog/pg_largeobject.c:116 +#: storage/large_object/inv_api.c:287 #, c-format msgid "large object %u does not exist" msgstr "stort objekt %u existerar inte" -#: catalog/aclchk.c:910 catalog/aclchk.c:919 commands/collationcmds.c:118 -#: commands/copy.c:1134 commands/copy.c:1154 commands/copy.c:1163 -#: commands/copy.c:1172 commands/copy.c:1181 commands/copy.c:1190 -#: commands/copy.c:1199 commands/copy.c:1208 commands/copy.c:1226 -#: commands/copy.c:1242 commands/copy.c:1262 commands/copy.c:1279 -#: commands/dbcommands.c:157 commands/dbcommands.c:166 -#: commands/dbcommands.c:175 commands/dbcommands.c:184 -#: commands/dbcommands.c:193 commands/dbcommands.c:202 -#: commands/dbcommands.c:211 commands/dbcommands.c:220 -#: commands/dbcommands.c:229 commands/dbcommands.c:238 -#: commands/dbcommands.c:260 commands/dbcommands.c:1502 -#: commands/dbcommands.c:1511 commands/dbcommands.c:1520 -#: commands/dbcommands.c:1529 commands/extension.c:1735 -#: commands/extension.c:1745 commands/extension.c:1755 -#: commands/extension.c:3055 commands/foreigncmds.c:539 -#: commands/foreigncmds.c:548 commands/functioncmds.c:570 -#: commands/functioncmds.c:736 commands/functioncmds.c:745 -#: commands/functioncmds.c:754 commands/functioncmds.c:763 -#: commands/functioncmds.c:2014 commands/functioncmds.c:2022 -#: commands/publicationcmds.c:90 commands/publicationcmds.c:133 -#: commands/sequence.c:1267 commands/sequence.c:1277 commands/sequence.c:1287 -#: commands/sequence.c:1297 commands/sequence.c:1307 commands/sequence.c:1317 -#: commands/sequence.c:1327 commands/sequence.c:1337 commands/sequence.c:1347 -#: commands/subscriptioncmds.c:104 commands/subscriptioncmds.c:114 -#: commands/subscriptioncmds.c:124 commands/subscriptioncmds.c:134 -#: commands/subscriptioncmds.c:148 commands/subscriptioncmds.c:159 -#: commands/subscriptioncmds.c:173 commands/tablecmds.c:7102 -#: commands/typecmds.c:322 commands/typecmds.c:1355 commands/typecmds.c:1364 -#: commands/typecmds.c:1372 commands/typecmds.c:1380 commands/typecmds.c:1388 -#: commands/user.c:133 commands/user.c:147 commands/user.c:156 -#: commands/user.c:165 commands/user.c:174 commands/user.c:183 -#: commands/user.c:192 commands/user.c:201 commands/user.c:210 -#: commands/user.c:219 commands/user.c:228 commands/user.c:237 -#: commands/user.c:246 commands/user.c:582 commands/user.c:590 -#: commands/user.c:598 commands/user.c:606 commands/user.c:614 -#: commands/user.c:622 commands/user.c:630 commands/user.c:638 -#: commands/user.c:647 commands/user.c:655 commands/user.c:663 -#: parser/parse_utilcmd.c:387 replication/pgoutput/pgoutput.c:141 -#: replication/pgoutput/pgoutput.c:162 replication/walsender.c:886 -#: replication/walsender.c:897 replication/walsender.c:907 -#, c-format -msgid "conflicting or redundant options" -msgstr "motstridiga eller redundanta inställningar" - -#: catalog/aclchk.c:1030 +#: catalog/aclchk.c:1086 #, c-format msgid "default privileges cannot be set for columns" msgstr "standardrättigheter kan inte sättas för kolumner" -#: catalog/aclchk.c:1190 +#: catalog/aclchk.c:1246 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "kan inte använda IN SCHEMA-klausul samtidigt som GRANT/REVOKE ON SCHEMAS" -#: catalog/aclchk.c:1558 catalog/catalog.c:506 catalog/objectaddress.c:1427 -#: commands/analyze.c:389 commands/copy.c:5080 commands/sequence.c:1702 -#: commands/tablecmds.c:6578 commands/tablecmds.c:6721 -#: commands/tablecmds.c:6771 commands/tablecmds.c:6845 -#: commands/tablecmds.c:6915 commands/tablecmds.c:7027 -#: commands/tablecmds.c:7121 commands/tablecmds.c:7180 -#: commands/tablecmds.c:7253 commands/tablecmds.c:7282 -#: commands/tablecmds.c:7437 commands/tablecmds.c:7519 -#: commands/tablecmds.c:7612 commands/tablecmds.c:7767 -#: commands/tablecmds.c:10972 commands/tablecmds.c:11154 -#: commands/tablecmds.c:11314 commands/tablecmds.c:12397 commands/trigger.c:876 -#: parser/analyze.c:2339 parser/parse_relation.c:713 parser/parse_target.c:1036 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3289 -#: parser/parse_utilcmd.c:3324 parser/parse_utilcmd.c:3366 utils/adt/acl.c:2870 -#: utils/adt/ruleutils.c:2535 +#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 +#: catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:763 +#: commands/sequence.c:1655 commands/tablecmds.c:7200 commands/tablecmds.c:7356 +#: commands/tablecmds.c:7406 commands/tablecmds.c:7480 +#: commands/tablecmds.c:7550 commands/tablecmds.c:7662 +#: commands/tablecmds.c:7756 commands/tablecmds.c:7815 +#: commands/tablecmds.c:7904 commands/tablecmds.c:7934 +#: commands/tablecmds.c:8062 commands/tablecmds.c:8144 +#: commands/tablecmds.c:8300 commands/tablecmds.c:8418 +#: commands/tablecmds.c:12092 commands/tablecmds.c:12273 +#: commands/tablecmds.c:12433 commands/tablecmds.c:13597 +#: commands/tablecmds.c:16183 commands/trigger.c:958 parser/analyze.c:2468 +#: parser/parse_relation.c:725 parser/parse_target.c:1063 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3424 +#: parser/parse_utilcmd.c:3460 parser/parse_utilcmd.c:3502 utils/adt/acl.c:2869 +#: utils/adt/ruleutils.c:2815 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "kolumn \"%s\" i relation \"%s\" existerar inte" -#: catalog/aclchk.c:1821 catalog/objectaddress.c:1267 commands/sequence.c:1140 -#: commands/tablecmds.c:236 commands/tablecmds.c:15706 utils/adt/acl.c:2060 -#: utils/adt/acl.c:2090 utils/adt/acl.c:2122 utils/adt/acl.c:2154 -#: utils/adt/acl.c:2182 utils/adt/acl.c:2212 +#: catalog/aclchk.c:1850 catalog/objectaddress.c:1383 commands/sequence.c:1164 +#: commands/tablecmds.c:252 commands/tablecmds.c:17074 utils/adt/acl.c:2077 +#: utils/adt/acl.c:2107 utils/adt/acl.c:2139 utils/adt/acl.c:2171 +#: utils/adt/acl.c:2199 utils/adt/acl.c:2229 #, c-format msgid "\"%s\" is not a sequence" msgstr "\"%s\" är inte en sekvens" -#: catalog/aclchk.c:1859 +#: catalog/aclchk.c:1888 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "sekvensen \"%s\" stöder bara USAGE-, SELECT- och UPDATE-rättigheter" -#: catalog/aclchk.c:1876 +#: catalog/aclchk.c:1905 #, c-format msgid "invalid privilege type %s for table" msgstr "ogiltig rättighetstyp %s för tabell" -#: catalog/aclchk.c:2042 +#: catalog/aclchk.c:2071 #, c-format msgid "invalid privilege type %s for column" msgstr "ogitligt rättighetstyp %s för kolumn" -#: catalog/aclchk.c:2055 +#: catalog/aclchk.c:2084 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "sekvensen \"%s\" stöder bara kolumnrättigheten SELECT" -#: catalog/aclchk.c:2637 +#: catalog/aclchk.c:2666 #, c-format msgid "language \"%s\" is not trusted" msgstr "språket \"%s\" är inte betrott" -#: catalog/aclchk.c:2639 +#: catalog/aclchk.c:2668 #, c-format msgid "GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages." -msgstr "GRANT och REVOKE är inte tillåtna på icke betrodda språk då bara superanvändare kan använda icke betrodda språk." +msgstr "GRANT och REVOKE är inte tillåtna på icke betrodda språk då bara en superuser kan använda icke betrodda språk." -#: catalog/aclchk.c:3153 +#: catalog/aclchk.c:3182 #, c-format msgid "cannot set privileges of array types" msgstr "kan inte sätta privilegier för array-typer" -#: catalog/aclchk.c:3154 +#: catalog/aclchk.c:3183 #, c-format msgid "Set the privileges of the element type instead." msgstr "Sätt rättigheter för elementtypen istället." -#: catalog/aclchk.c:3161 catalog/objectaddress.c:1561 +#: catalog/aclchk.c:3190 catalog/objectaddress.c:1649 #, c-format msgid "\"%s\" is not a domain" msgstr "\"%s\" är inte en domän" -#: catalog/aclchk.c:3281 +#: catalog/aclchk.c:3462 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "okänd privilegietyp \"%s\"" -#: catalog/aclchk.c:3342 +#: catalog/aclchk.c:3527 #, c-format msgid "permission denied for aggregate %s" msgstr "rättighet saknas för aggregat %s" -#: catalog/aclchk.c:3345 +#: catalog/aclchk.c:3530 #, c-format msgid "permission denied for collation %s" msgstr "rättighet saknas för jämförelse %s" -#: catalog/aclchk.c:3348 +#: catalog/aclchk.c:3533 #, c-format msgid "permission denied for column %s" msgstr "rättighet saknas för kolumn %s" -#: catalog/aclchk.c:3351 +#: catalog/aclchk.c:3536 #, c-format msgid "permission denied for conversion %s" msgstr "rättighet saknas för konvertering %s" -#: catalog/aclchk.c:3354 +#: catalog/aclchk.c:3539 #, c-format msgid "permission denied for database %s" msgstr "rättighet saknas för databas %s" -#: catalog/aclchk.c:3357 +#: catalog/aclchk.c:3542 #, c-format msgid "permission denied for domain %s" msgstr "rättighet saknas för domän %s" -#: catalog/aclchk.c:3360 +#: catalog/aclchk.c:3545 #, c-format msgid "permission denied for event trigger %s" msgstr "rättighet saknas för händelseutlösare %s" -#: catalog/aclchk.c:3363 +#: catalog/aclchk.c:3548 #, c-format msgid "permission denied for extension %s" msgstr "rättighet saknas för utökning %s" -#: catalog/aclchk.c:3366 +#: catalog/aclchk.c:3551 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "rättighet saknas för främmande data-omvandlare %s" -#: catalog/aclchk.c:3369 +#: catalog/aclchk.c:3554 #, c-format msgid "permission denied for foreign server %s" msgstr "rättighet saknas för främmande server %s" -#: catalog/aclchk.c:3372 +#: catalog/aclchk.c:3557 #, c-format msgid "permission denied for foreign table %s" msgstr "rättighet saknas för främmande tabell %s" -#: catalog/aclchk.c:3375 +#: catalog/aclchk.c:3560 #, c-format msgid "permission denied for function %s" msgstr "rättighet saknas för funktion %s" -#: catalog/aclchk.c:3378 +#: catalog/aclchk.c:3563 #, c-format msgid "permission denied for index %s" msgstr "rättighet saknas för index %s" -#: catalog/aclchk.c:3381 +#: catalog/aclchk.c:3566 #, c-format msgid "permission denied for language %s" msgstr "rättighet saknas för språk %s" -#: catalog/aclchk.c:3384 +#: catalog/aclchk.c:3569 #, c-format msgid "permission denied for large object %s" msgstr "rättighet saknas för stort objekt %s" -#: catalog/aclchk.c:3387 +#: catalog/aclchk.c:3572 #, c-format msgid "permission denied for materialized view %s" msgstr "rättighet saknas för materialiserad vy %s" -#: catalog/aclchk.c:3390 +#: catalog/aclchk.c:3575 #, c-format msgid "permission denied for operator class %s" msgstr "rättighet saknas för operatorklasss %s" -#: catalog/aclchk.c:3393 +#: catalog/aclchk.c:3578 #, c-format msgid "permission denied for operator %s" msgstr "rättighet saknas för operator %s" -#: catalog/aclchk.c:3396 +#: catalog/aclchk.c:3581 #, c-format msgid "permission denied for operator family %s" msgstr "rättighet saknas för operatorfamilj %s" -#: catalog/aclchk.c:3399 +#: catalog/aclchk.c:3584 +#, fuzzy, c-format +#| msgid "permission denied for operator %s" +msgid "permission denied for parameter %s" +msgstr "rättighet saknas för operator %s" + +#: catalog/aclchk.c:3587 #, c-format msgid "permission denied for policy %s" msgstr "rättighet saknas för policy %s" -#: catalog/aclchk.c:3402 +#: catalog/aclchk.c:3590 #, c-format msgid "permission denied for procedure %s" msgstr "rättighet saknas för procedur %s" -#: catalog/aclchk.c:3405 +#: catalog/aclchk.c:3593 #, c-format msgid "permission denied for publication %s" msgstr "rättighet saknas för publicering %s" -#: catalog/aclchk.c:3408 +#: catalog/aclchk.c:3596 #, c-format msgid "permission denied for routine %s" msgstr "rättighet saknas för rutin %s" -#: catalog/aclchk.c:3411 +#: catalog/aclchk.c:3599 #, c-format msgid "permission denied for schema %s" msgstr "rättighet saknas för schema %s" -#: catalog/aclchk.c:3414 commands/sequence.c:610 commands/sequence.c:844 -#: commands/sequence.c:886 commands/sequence.c:927 commands/sequence.c:1800 -#: commands/sequence.c:1864 +#: catalog/aclchk.c:3602 commands/sequence.c:652 commands/sequence.c:878 +#: commands/sequence.c:920 commands/sequence.c:961 commands/sequence.c:1753 +#: commands/sequence.c:1817 #, c-format msgid "permission denied for sequence %s" msgstr "rättighet saknas för sekvens %s" -#: catalog/aclchk.c:3417 +#: catalog/aclchk.c:3605 #, c-format msgid "permission denied for statistics object %s" msgstr "rättighet saknas för statistikobjekt %s" -#: catalog/aclchk.c:3420 +#: catalog/aclchk.c:3608 #, c-format msgid "permission denied for subscription %s" msgstr "rättighet saknas för prenumeration %s" -#: catalog/aclchk.c:3423 +#: catalog/aclchk.c:3611 #, c-format msgid "permission denied for table %s" msgstr "rättighet saknas för tabell %s" -#: catalog/aclchk.c:3426 +#: catalog/aclchk.c:3614 #, c-format msgid "permission denied for tablespace %s" msgstr "rättighet saknas för tabellutrymme %s" -#: catalog/aclchk.c:3429 +#: catalog/aclchk.c:3617 #, c-format msgid "permission denied for text search configuration %s" msgstr "rättighet saknas för textsökkonfigurering %s" -#: catalog/aclchk.c:3432 +#: catalog/aclchk.c:3620 #, c-format msgid "permission denied for text search dictionary %s" msgstr "rättighet saknas för textsökordlista %s" -#: catalog/aclchk.c:3435 +#: catalog/aclchk.c:3623 #, c-format msgid "permission denied for type %s" msgstr "rättighet saknas för typ %s" -#: catalog/aclchk.c:3438 +#: catalog/aclchk.c:3626 #, c-format msgid "permission denied for view %s" msgstr "rättighet saknas för vy %s" -#: catalog/aclchk.c:3473 +#: catalog/aclchk.c:3662 #, c-format msgid "must be owner of aggregate %s" msgstr "måste vara ägaren till aggregatet %s" -#: catalog/aclchk.c:3476 +#: catalog/aclchk.c:3665 #, c-format msgid "must be owner of collation %s" msgstr "måste vara ägaren till jämförelsen %s" -#: catalog/aclchk.c:3479 +#: catalog/aclchk.c:3668 #, c-format msgid "must be owner of conversion %s" msgstr "måste vara ägaren till konverteringen %s" -#: catalog/aclchk.c:3482 +#: catalog/aclchk.c:3671 #, c-format msgid "must be owner of database %s" msgstr "måste vara ägaren till databasen %s" -#: catalog/aclchk.c:3485 +#: catalog/aclchk.c:3674 #, c-format msgid "must be owner of domain %s" msgstr "måste vara ägaren av domänen %s" -#: catalog/aclchk.c:3488 +#: catalog/aclchk.c:3677 #, c-format msgid "must be owner of event trigger %s" msgstr "måste vara ägaren till händelseutlösaren %s" -#: catalog/aclchk.c:3491 +#: catalog/aclchk.c:3680 #, c-format msgid "must be owner of extension %s" msgstr "måste vara ägaren till utökningen %s" -#: catalog/aclchk.c:3494 +#: catalog/aclchk.c:3683 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "måste vara ägaren till främmande data-omvandlaren %s" -#: catalog/aclchk.c:3497 +#: catalog/aclchk.c:3686 #, c-format msgid "must be owner of foreign server %s" msgstr "måste vara ägaren till främmande servern %s" -#: catalog/aclchk.c:3500 +#: catalog/aclchk.c:3689 #, c-format msgid "must be owner of foreign table %s" msgstr "måste vara ägaren till främmande tabellen %s" -#: catalog/aclchk.c:3503 +#: catalog/aclchk.c:3692 #, c-format msgid "must be owner of function %s" msgstr "måste vara ägaren till funktionen %s" -#: catalog/aclchk.c:3506 +#: catalog/aclchk.c:3695 #, c-format msgid "must be owner of index %s" msgstr "måste vara ägaren till indexet %s" -#: catalog/aclchk.c:3509 +#: catalog/aclchk.c:3698 #, c-format msgid "must be owner of language %s" msgstr "måste vara ägaren till språket %s" -#: catalog/aclchk.c:3512 +#: catalog/aclchk.c:3701 #, c-format msgid "must be owner of large object %s" msgstr "måste vara ägaren till stora objektet %s" -#: catalog/aclchk.c:3515 +#: catalog/aclchk.c:3704 #, c-format msgid "must be owner of materialized view %s" msgstr "måste vara ägaren till den materialiserade vyn %s" -#: catalog/aclchk.c:3518 +#: catalog/aclchk.c:3707 #, c-format msgid "must be owner of operator class %s" msgstr "måste vara ägaren till operatorklassen %s" -#: catalog/aclchk.c:3521 +#: catalog/aclchk.c:3710 #, c-format msgid "must be owner of operator %s" msgstr "måste vara ägaren till operatorn %s" -#: catalog/aclchk.c:3524 +#: catalog/aclchk.c:3713 #, c-format msgid "must be owner of operator family %s" msgstr "måste vara ägaren till operatorfamiljen %s" -#: catalog/aclchk.c:3527 +#: catalog/aclchk.c:3716 #, c-format msgid "must be owner of procedure %s" msgstr "måste vara ägaren till proceduren %s" -#: catalog/aclchk.c:3530 +#: catalog/aclchk.c:3719 #, c-format msgid "must be owner of publication %s" msgstr "måste vara ägaren till publiceringen %s" -#: catalog/aclchk.c:3533 +#: catalog/aclchk.c:3722 #, c-format msgid "must be owner of routine %s" msgstr "måste vara ägaren till rutinen %s" -#: catalog/aclchk.c:3536 +#: catalog/aclchk.c:3725 #, c-format msgid "must be owner of sequence %s" msgstr "måste vara ägaren till sekvensen %s" -#: catalog/aclchk.c:3539 +#: catalog/aclchk.c:3728 #, c-format msgid "must be owner of subscription %s" msgstr "måste vara ägaren till prenumerationen %s" -#: catalog/aclchk.c:3542 +#: catalog/aclchk.c:3731 #, c-format msgid "must be owner of table %s" msgstr "måste vara ägaren till tabellen %s" -#: catalog/aclchk.c:3545 +#: catalog/aclchk.c:3734 #, c-format msgid "must be owner of type %s" msgstr "måste vara ägaren till typen %s" -#: catalog/aclchk.c:3548 +#: catalog/aclchk.c:3737 #, c-format msgid "must be owner of view %s" msgstr "måste vara ägaren till vyn %s" -#: catalog/aclchk.c:3551 +#: catalog/aclchk.c:3740 #, c-format msgid "must be owner of schema %s" msgstr "måste vara ägaren till schemat %s" -#: catalog/aclchk.c:3554 +#: catalog/aclchk.c:3743 #, c-format msgid "must be owner of statistics object %s" msgstr "måste vara ägaren till statistikobjektet %s" -#: catalog/aclchk.c:3557 +#: catalog/aclchk.c:3746 #, c-format msgid "must be owner of tablespace %s" msgstr "måste vara ägaren till tabellutrymmet %s" -#: catalog/aclchk.c:3560 +#: catalog/aclchk.c:3749 #, c-format msgid "must be owner of text search configuration %s" msgstr "måste vara ägaren till textsökkonfigurationen %s" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:3752 #, c-format msgid "must be owner of text search dictionary %s" msgstr "måste vara ägaren till textsökordlistan %s" -#: catalog/aclchk.c:3577 +#: catalog/aclchk.c:3766 #, c-format msgid "must be owner of relation %s" msgstr "måste vara ägaren till relationen %s" -#: catalog/aclchk.c:3621 +#: catalog/aclchk.c:3812 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "rättighet saknas för kolumn \"%s\" i relation \"%s\"" -#: catalog/aclchk.c:3742 catalog/aclchk.c:3750 +#: catalog/aclchk.c:3957 catalog/aclchk.c:3976 #, c-format msgid "attribute %d of relation with OID %u does not exist" msgstr "attribut %d i relation med OID %u existerar inte" -#: catalog/aclchk.c:3823 catalog/aclchk.c:4733 +#: catalog/aclchk.c:4071 catalog/aclchk.c:5184 #, c-format msgid "relation with OID %u does not exist" msgstr "relation med OID %u existerar inte" -#: catalog/aclchk.c:3913 catalog/aclchk.c:5151 +#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2582 #, c-format msgid "database with OID %u does not exist" msgstr "databas med OID %u finns inte" -#: catalog/aclchk.c:3967 catalog/aclchk.c:4811 tcop/fastpath.c:221 -#: utils/fmgr/fmgr.c:2055 +#: catalog/aclchk.c:4299 +#, fuzzy, c-format +#| msgid "operator with OID %u does not exist" +msgid "parameter ACL with OID %u does not exist" +msgstr "operator med OID %u existerar inte" + +#: catalog/aclchk.c:4353 catalog/aclchk.c:5262 tcop/fastpath.c:141 +#: utils/fmgr/fmgr.c:2037 #, c-format msgid "function with OID %u does not exist" msgstr "funktionen med OID %u existerar inte" -#: catalog/aclchk.c:4021 catalog/aclchk.c:4837 +#: catalog/aclchk.c:4407 catalog/aclchk.c:5288 #, c-format msgid "language with OID %u does not exist" msgstr "språk med OID %u existerar inte" -#: catalog/aclchk.c:4185 catalog/aclchk.c:4909 +#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 +#: commands/publicationcmds.c:1794 #, c-format msgid "schema with OID %u does not exist" msgstr "schema med OID %u existerar inte" -#: catalog/aclchk.c:4239 catalog/aclchk.c:4936 utils/adt/genfile.c:686 +#: catalog/aclchk.c:4635 catalog/aclchk.c:5387 utils/adt/genfile.c:632 #, c-format msgid "tablespace with OID %u does not exist" msgstr "tabellutrymme med OID %u finns inte" -#: catalog/aclchk.c:4298 catalog/aclchk.c:5070 commands/foreigncmds.c:325 +#: catalog/aclchk.c:4694 catalog/aclchk.c:5521 commands/foreigncmds.c:325 #, c-format msgid "foreign-data wrapper with OID %u does not exist" msgstr "främmande data-omvandlare med OID %u finns inte" -#: catalog/aclchk.c:4360 catalog/aclchk.c:5097 commands/foreigncmds.c:462 +#: catalog/aclchk.c:4756 catalog/aclchk.c:5548 commands/foreigncmds.c:462 #, c-format msgid "foreign server with OID %u does not exist" msgstr "främmande server med OID %u finns inte" -#: catalog/aclchk.c:4420 catalog/aclchk.c:4759 utils/cache/typcache.c:378 -#: utils/cache/typcache.c:432 +#: catalog/aclchk.c:4816 catalog/aclchk.c:5210 utils/cache/typcache.c:385 +#: utils/cache/typcache.c:440 #, c-format msgid "type with OID %u does not exist" msgstr "typ med OID %u existerar inte" -#: catalog/aclchk.c:4785 +#: catalog/aclchk.c:5236 #, c-format msgid "operator with OID %u does not exist" msgstr "operator med OID %u existerar inte" -#: catalog/aclchk.c:4962 +#: catalog/aclchk.c:5413 #, c-format msgid "operator class with OID %u does not exist" msgstr "operatorklass med OID %u existerar inte" -#: catalog/aclchk.c:4989 +#: catalog/aclchk.c:5440 #, c-format msgid "operator family with OID %u does not exist" msgstr "operatorfamilj med OID %u existerar inte" -#: catalog/aclchk.c:5016 +#: catalog/aclchk.c:5467 #, c-format msgid "text search dictionary with OID %u does not exist" msgstr "textsökordlista med OID %u existerar inte" -#: catalog/aclchk.c:5043 +#: catalog/aclchk.c:5494 #, c-format msgid "text search configuration with OID %u does not exist" msgstr "textsökkonfiguration med OID %u existerar inte" -#: catalog/aclchk.c:5124 commands/event_trigger.c:475 +#: catalog/aclchk.c:5575 commands/event_trigger.c:453 #, c-format msgid "event trigger with OID %u does not exist" msgstr "händelseutlösare med OID %u existerar inte" -#: catalog/aclchk.c:5177 commands/collationcmds.c:367 +#: catalog/aclchk.c:5628 commands/collationcmds.c:439 #, c-format msgid "collation with OID %u does not exist" msgstr "jämförelse med OID %u existerar inte" -#: catalog/aclchk.c:5203 +#: catalog/aclchk.c:5654 #, c-format msgid "conversion with OID %u does not exist" msgstr "konvertering med OID %u existerar inte" -#: catalog/aclchk.c:5244 +#: catalog/aclchk.c:5695 #, c-format msgid "extension with OID %u does not exist" msgstr "utökning med OID %u existerar inte" -#: catalog/aclchk.c:5271 commands/publicationcmds.c:794 +#: catalog/aclchk.c:5722 commands/publicationcmds.c:2048 #, c-format msgid "publication with OID %u does not exist" msgstr "publicering med OID %u existerar inte" -#: catalog/aclchk.c:5297 commands/subscriptioncmds.c:1112 +#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1745 #, c-format msgid "subscription with OID %u does not exist" msgstr "prenumeration med OID %u existerar inte" -#: catalog/aclchk.c:5323 +#: catalog/aclchk.c:5774 #, c-format msgid "statistics object with OID %u does not exist" msgstr "statistikobjekt med OID %u finns inte" -#: catalog/catalog.c:485 +#: catalog/catalog.c:447 +#, c-format +msgid "still searching for an unused OID in relation \"%s\"" +msgstr "letar fortfarande efter en oanvänd OID i relationen \"%s\"" + +#: catalog/catalog.c:449 +#, c-format +msgid "OID candidates have been checked %llu time, but no unused OID has been found yet." +msgid_plural "OID candidates have been checked %llu times, but no unused OID has been found yet." +msgstr[0] "OID-kandidater har kontrollerats %llu gång men inga oanvända OID:er har hittats än." +msgstr[1] "OID-kandidater har kontrollerats %llu gånger men inga oanvända OID:er har hittats än." + +#: catalog/catalog.c:474 #, c-format -msgid "must be superuser to call pg_nextoid()" -msgstr "måste vara superanvändare för att anropa pg_nextoid()" +msgid "new OID has been assigned in relation \"%s\" after %llu retry" +msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" +msgstr[0] "ny OID har tilldelats i relation \"%s\" after %llu försök" +msgstr[1] "ny OID har tilldelats i relation \"%s\" after %llu försök" + +#: catalog/catalog.c:605 catalog/catalog.c:672 +#, fuzzy, c-format +#| msgid "must be superuser to rename %s" +msgid "must be superuser to call %s()" +msgstr "måste vara en superuser för att döpa om %s" -#: catalog/catalog.c:493 +#: catalog/catalog.c:614 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() kan bara användas på systemkataloger" -#: catalog/catalog.c:498 parser/parse_utilcmd.c:2191 +#: catalog/catalog.c:619 parser/parse_utilcmd.c:2269 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "index \"%s\" tillhör inte tabell \"%s\"" -#: catalog/catalog.c:515 +#: catalog/catalog.c:636 #, c-format msgid "column \"%s\" is not of type oid" msgstr "kolumnen \"%s\" är inte av typen oid" -#: catalog/catalog.c:522 +#: catalog/catalog.c:643 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "index \"%s\" är inte indexet för kolumnen \"%s\"" -#: catalog/dependency.c:823 catalog/dependency.c:1061 +#: catalog/dependency.c:535 catalog/pg_shdepend.c:657 +#, c-format +msgid "cannot drop %s because it is required by the database system" +msgstr "kan inte ta bort %s eftersom den krävs av databassystemet" + +#: catalog/dependency.c:827 catalog/dependency.c:1054 #, c-format msgid "cannot drop %s because %s requires it" msgstr "kan inte ta bort %s eftersom %s behöver den" -#: catalog/dependency.c:825 catalog/dependency.c:1063 +#: catalog/dependency.c:829 catalog/dependency.c:1056 #, c-format msgid "You can drop %s instead." msgstr "Du kan ta bort %s i stället." -#: catalog/dependency.c:933 catalog/pg_shdepend.c:640 -#, c-format -msgid "cannot drop %s because it is required by the database system" -msgstr "kan inte ta bort %s eftersom den krävs av databassystemet" - -#: catalog/dependency.c:1129 -#, c-format -msgid "drop auto-cascades to %s" -msgstr "drop svämmar automatiskt över (cascades) till %s" - -#: catalog/dependency.c:1141 catalog/dependency.c:1150 +#: catalog/dependency.c:1135 catalog/dependency.c:1144 #, c-format msgid "%s depends on %s" msgstr "%s beror på %s" -#: catalog/dependency.c:1162 catalog/dependency.c:1171 +#: catalog/dependency.c:1159 catalog/dependency.c:1168 #, c-format msgid "drop cascades to %s" msgstr "drop svämmar över (cascades) till %s" -#: catalog/dependency.c:1179 catalog/pg_shdepend.c:769 +#: catalog/dependency.c:1176 catalog/pg_shdepend.c:822 #, c-format msgid "" "\n" @@ -4018,674 +4159,697 @@ msgstr[1] "" "\n" "och %d andra objekt (se serverloggen för en lista)" -#: catalog/dependency.c:1191 +#: catalog/dependency.c:1188 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "kan inte ta bort %s eftersom andra objekt beror på den" -#: catalog/dependency.c:1193 catalog/dependency.c:1194 -#: catalog/dependency.c:1200 catalog/dependency.c:1201 -#: catalog/dependency.c:1212 catalog/dependency.c:1213 -#: commands/tablecmds.c:1249 commands/tablecmds.c:13016 commands/user.c:1093 -#: commands/view.c:495 libpq/auth.c:334 replication/syncrep.c:1032 -#: storage/lmgr/deadlock.c:1154 storage/lmgr/proc.c:1350 utils/adt/acl.c:5329 -#: utils/adt/jsonfuncs.c:614 utils/adt/jsonfuncs.c:620 utils/misc/guc.c:6771 -#: utils/misc/guc.c:6807 utils/misc/guc.c:6877 utils/misc/guc.c:10975 -#: utils/misc/guc.c:11009 utils/misc/guc.c:11043 utils/misc/guc.c:11077 -#: utils/misc/guc.c:11112 +#: catalog/dependency.c:1190 catalog/dependency.c:1191 +#: catalog/dependency.c:1197 catalog/dependency.c:1198 +#: catalog/dependency.c:1208 catalog/dependency.c:1209 +#: commands/publicationcmds.c:632 commands/tablecmds.c:1326 +#: commands/tablecmds.c:14239 commands/tablespace.c:498 commands/user.c:1008 +#: commands/view.c:508 libpq/auth.c:329 replication/syncrep.c:1043 +#: storage/lmgr/deadlock.c:1152 storage/lmgr/proc.c:1409 utils/adt/acl.c:5333 +#: utils/adt/jsonfuncs.c:618 utils/adt/jsonfuncs.c:624 utils/misc/guc.c:7394 +#: utils/misc/guc.c:7430 utils/misc/guc.c:7500 utils/misc/guc.c:11763 +#: utils/misc/guc.c:11797 utils/misc/guc.c:11831 utils/misc/guc.c:11874 +#: utils/misc/guc.c:11916 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1195 catalog/dependency.c:1202 +#: catalog/dependency.c:1192 catalog/dependency.c:1199 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "Använd DROP ... CASCADE för att ta bort de beroende objekten också." -#: catalog/dependency.c:1199 +#: catalog/dependency.c:1196 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "kan inte ta bort önskade objekt eftersom andra objekt beror på dem" -#. translator: %d always has a value larger than 1 -#: catalog/dependency.c:1208 +#: catalog/dependency.c:1204 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" msgstr[0] "drop svämmar över (cascades) till %d andra objekt" msgstr[1] "drop svämmar över (cascades) till %d andra objekt" -#: catalog/dependency.c:1875 +#: catalog/dependency.c:1873 #, c-format msgid "constant of the type %s cannot be used here" msgstr "konstant av typen %s kan inte användas här" -#: catalog/heap.c:330 +#: catalog/heap.c:324 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "rättighet saknas för att skapa \"%s.%s\"" -#: catalog/heap.c:332 +#: catalog/heap.c:326 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Systemkatalogändringar är för tillfället inte tillåtna." -#: catalog/heap.c:500 commands/tablecmds.c:2145 commands/tablecmds.c:2745 -#: commands/tablecmds.c:6175 +#: catalog/heap.c:463 commands/tablecmds.c:2338 commands/tablecmds.c:2975 +#: commands/tablecmds.c:6790 #, c-format msgid "tables can have at most %d columns" msgstr "tabeller kan ha som mest %d kolumner" -#: catalog/heap.c:518 commands/tablecmds.c:6468 +#: catalog/heap.c:481 commands/tablecmds.c:7090 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "kolumnnamn \"%s\" står i konflikt med ett systemkolumnnamn" -#: catalog/heap.c:534 +#: catalog/heap.c:497 #, c-format msgid "column name \"%s\" specified more than once" msgstr "kolumnnamn \"%s\" angiven mer än en gång" #. translator: first %s is an integer not a name -#: catalog/heap.c:609 +#: catalog/heap.c:572 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "partitionsnyckelkolumn \"%s\" har pseudo-typ %s" -#: catalog/heap.c:614 +#: catalog/heap.c:577 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "kolumn \"%s\" har pseudo-typ %s" -#: catalog/heap.c:645 +#: catalog/heap.c:608 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "composite-typ %s kan inte vara en del av sig själv" #. translator: first %s is an integer not a name -#: catalog/heap.c:700 +#: catalog/heap.c:663 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "ingen jämförelse kunde härledas för partitionsnyckelkolumn %s med jämförelsetyp %s" -#: catalog/heap.c:706 commands/createas.c:203 commands/createas.c:486 +#: catalog/heap.c:669 commands/createas.c:203 commands/createas.c:500 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "ingen jämförelse kunde härledas för kolumn \"%s\" med jämförelsetyp %s" -#: catalog/heap.c:1155 catalog/index.c:865 commands/tablecmds.c:3520 +#: catalog/heap.c:1145 catalog/index.c:874 commands/createas.c:405 +#: commands/tablecmds.c:3880 #, c-format msgid "relation \"%s\" already exists" msgstr "relationen \"%s\" finns redan" -#: catalog/heap.c:1171 catalog/pg_type.c:428 catalog/pg_type.c:775 -#: commands/typecmds.c:238 commands/typecmds.c:250 commands/typecmds.c:719 -#: commands/typecmds.c:1125 commands/typecmds.c:1337 commands/typecmds.c:2124 +#: catalog/heap.c:1161 catalog/pg_type.c:436 catalog/pg_type.c:781 +#: catalog/pg_type.c:928 commands/typecmds.c:249 commands/typecmds.c:261 +#: commands/typecmds.c:754 commands/typecmds.c:1169 commands/typecmds.c:1395 +#: commands/typecmds.c:1575 commands/typecmds.c:2547 #, c-format msgid "type \"%s\" already exists" msgstr "typen \"%s\" existerar redan" -#: catalog/heap.c:1172 +#: catalog/heap.c:1162 #, c-format msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." msgstr "En relation har en associerad typ med samma namn så du måste använda ett namn som inte krockar med någon existerande typ." -#: catalog/heap.c:1201 +#: catalog/heap.c:1202 +#, fuzzy, c-format +#| msgid "pg_class index OID value not set when in binary upgrade mode" +msgid "toast relfilenode value not set when in binary upgrade mode" +msgstr "pg_class index OID-värde är inte satt i binärt uppgraderingsläge" + +#: catalog/heap.c:1213 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "pg_class heap OID-värde är inte satt i binärt uppgraderingsläge" -#: catalog/heap.c:2400 +#: catalog/heap.c:1223 +#, fuzzy, c-format +#| msgid "pg_class index OID value not set when in binary upgrade mode" +msgid "relfilenode value not set when in binary upgrade mode" +msgstr "pg_class index OID-värde är inte satt i binärt uppgraderingsläge" + +#: catalog/heap.c:2127 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "kan inte lägga till NO INHERIT-villkor till partitionerad tabell \"%s\"" -#: catalog/heap.c:2670 +#: catalog/heap.c:2401 #, c-format msgid "check constraint \"%s\" already exists" msgstr "check-villkor \"%s\" finns redan" -#: catalog/heap.c:2840 catalog/index.c:879 catalog/pg_constraint.c:668 -#: commands/tablecmds.c:8117 +#: catalog/heap.c:2571 catalog/index.c:888 catalog/pg_constraint.c:689 +#: commands/tablecmds.c:8792 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "integritetsvillkor \"%s\" för relation \"%s\" finns redan" -#: catalog/heap.c:2847 +#: catalog/heap.c:2578 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "villkor \"%s\" står i konflikt med icke-ärvt villkor på relation \"%s\"" -#: catalog/heap.c:2858 +#: catalog/heap.c:2589 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "villkor \"%s\" står i konflikt med ärvt villkor på relation \"%s\"" -#: catalog/heap.c:2868 +#: catalog/heap.c:2599 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "villkor \"%s\" står i konflikt med NOT VALID-villkor på relation \"%s\"" -#: catalog/heap.c:2873 +#: catalog/heap.c:2604 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "slår samman villkor \"%s\" med ärvd definition" -#: catalog/heap.c:2975 +#: catalog/heap.c:2709 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "kan inte använda genererad kolumn \"%s\" i kolumngenereringsuttryck" -#: catalog/heap.c:2977 +#: catalog/heap.c:2711 #, c-format msgid "A generated column cannot reference another generated column." msgstr "En genererad kolumn kan inte referera till en annan genererad kolumn." -#: catalog/heap.c:3029 +#: catalog/heap.c:2717 +#, c-format +msgid "cannot use whole-row variable in column generation expression" +msgstr "kan inte använda hela-raden-variabel i kolumngenereringsuttryck" + +#: catalog/heap.c:2718 +#, c-format +msgid "This would cause the generated column to depend on its own value." +msgstr "Detta skulle leda till att den genererade kolumnen beror på sitt eget värde." + +#: catalog/heap.c:2771 #, c-format msgid "generation expression is not immutable" msgstr "genereringsuttryck är inte immutable" -#: catalog/heap.c:3057 rewrite/rewriteHandler.c:1192 +#: catalog/heap.c:2799 rewrite/rewriteHandler.c:1268 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "kolumn \"%s\" har typ %s men default-uttryck har typen %s" -#: catalog/heap.c:3062 commands/prepare.c:367 parser/parse_node.c:412 -#: parser/parse_target.c:589 parser/parse_target.c:869 -#: parser/parse_target.c:879 rewrite/rewriteHandler.c:1197 +#: catalog/heap.c:2804 commands/prepare.c:334 parser/analyze.c:2692 +#: parser/parse_target.c:594 parser/parse_target.c:882 +#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1273 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Du måste skriva om eller typomvandla uttrycket." -#: catalog/heap.c:3109 +#: catalog/heap.c:2851 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "bara tabell \"%s\" kan refereras i check-villkoret" -#: catalog/heap.c:3366 +#: catalog/heap.c:3149 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "inget stöd för kombinationen ON COMMIT och främmande nyckel" -#: catalog/heap.c:3367 +#: catalog/heap.c:3150 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "Tabell \"%s\" refererar till \"%s\", men de har inte samma ON COMMIT-inställning." -#: catalog/heap.c:3372 +#: catalog/heap.c:3155 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "kan inte trunkera en tabell som refererars till i ett främmande nyckelvillkor" -#: catalog/heap.c:3373 +#: catalog/heap.c:3156 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Tabell \"%s\" refererar till \"%s\"." -#: catalog/heap.c:3375 +#: catalog/heap.c:3158 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Trunkera tabellen \"%s\" samtidigt, eller använd TRUNCATE ... CASCADE." -#: catalog/index.c:219 parser/parse_utilcmd.c:2097 +#: catalog/index.c:223 parser/parse_utilcmd.c:2174 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "multipla primärnycklar för tabell \"%s\" tillåts inte" -#: catalog/index.c:237 +#: catalog/index.c:241 #, c-format msgid "primary keys cannot be expressions" msgstr "primärnycklar kan inte vara uttryck" -#: catalog/index.c:254 +#: catalog/index.c:258 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "primärnyckelkolumn \"%s\" är inte markerad NOT NULL" -#: catalog/index.c:764 catalog/index.c:1843 +#: catalog/index.c:773 catalog/index.c:1932 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "användardefinierade index på systemkatalogen är inte möjligt" -#: catalog/index.c:804 +#: catalog/index.c:813 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "ickedeterministiska jämförelser (collation) stöds inte för operatorklass \"%s\"" -#: catalog/index.c:819 +#: catalog/index.c:828 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "samtida indexskapande på systemkatalogtabeller stöds inte" -#: catalog/index.c:828 catalog/index.c:1281 +#: catalog/index.c:837 catalog/index.c:1305 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "samtida indexskapande för uteslutningsvillkor stöds inte" -#: catalog/index.c:837 +#: catalog/index.c:846 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "delade index kan inte skapas efter initdb" -#: catalog/index.c:857 commands/createas.c:252 commands/sequence.c:154 -#: parser/parse_utilcmd.c:210 +#: catalog/index.c:866 commands/createas.c:411 commands/sequence.c:150 +#: parser/parse_utilcmd.c:201 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "relationen \"%s\" finns redan, hoppar över" -#: catalog/index.c:907 +#: catalog/index.c:916 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "pg_class index OID-värde är inte satt i binärt uppgraderingsläge" -#: catalog/index.c:2128 +#: catalog/index.c:926 +#, fuzzy, c-format +#| msgid "pg_class index OID value not set when in binary upgrade mode" +msgid "index relfilenode value not set when in binary upgrade mode" +msgstr "pg_class index OID-värde är inte satt i binärt uppgraderingsläge" + +#: catalog/index.c:2231 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY måste vara första operationen i transaktion" -#: catalog/index.c:2859 -#, c-format -msgid "building index \"%s\" on table \"%s\" serially" -msgstr "bygger index \"%s\" på tabell \"%s\" seriellt" - -#: catalog/index.c:2864 -#, c-format -msgid "building index \"%s\" on table \"%s\" with request for %d parallel worker" -msgid_plural "building index \"%s\" on table \"%s\" with request for %d parallel workers" -msgstr[0] "bygger index \"%s\" på tabell \"%s\" och efterfrågar %d parallell arbetare" -msgstr[1] "bygger index \"%s\" på tabell \"%s\" och efterfrågar %d parallella arbetare" - -#: catalog/index.c:3492 +#: catalog/index.c:3633 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "kan inte omindexera temporära tabeller som tillhör andra sessioner" -#: catalog/index.c:3503 +#: catalog/index.c:3644 commands/indexcmds.c:3466 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "kan inte omindexera angivet index i TOAST-tabell" -#: catalog/index.c:3625 +#: catalog/index.c:3660 commands/indexcmds.c:3346 commands/indexcmds.c:3490 +#: commands/tablecmds.c:3295 #, c-format -msgid "index \"%s\" was reindexed" -msgstr "index \"%s\" omindexerades" +msgid "cannot move system relation \"%s\"" +msgstr "kan inte flytta systemrelation \"%s\"" -#: catalog/index.c:3701 commands/indexcmds.c:3023 +#: catalog/index.c:3804 #, c-format -msgid "REINDEX of partitioned tables is not yet implemented, skipping \"%s\"" -msgstr "REINDEX på partitionerade tabeller är inte implementerat ännu, hoppar över \"%s\"" +msgid "index \"%s\" was reindexed" +msgstr "index \"%s\" omindexerades" -#: catalog/index.c:3756 +#: catalog/index.c:3941 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "kan inte omindexera ogiltigt index \"%s.%s\" på TOAST-tabell, hoppar över" -#: catalog/namespace.c:257 catalog/namespace.c:461 catalog/namespace.c:553 -#: commands/trigger.c:5043 +#: catalog/namespace.c:259 catalog/namespace.c:463 catalog/namespace.c:555 +#: commands/trigger.c:5668 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "referenser till andra databaser är inte implementerat: \"%s.%s.%s\"" -#: catalog/namespace.c:314 +#: catalog/namespace.c:316 #, c-format msgid "temporary tables cannot specify a schema name" msgstr "temporära tabeller kan inte anges med ett schemanamn" -#: catalog/namespace.c:395 +#: catalog/namespace.c:397 #, c-format msgid "could not obtain lock on relation \"%s.%s\"" msgstr "kunde inte ta lås på relationen \"%s.%s\"" -#: catalog/namespace.c:400 commands/lockcmds.c:142 commands/lockcmds.c:227 +#: catalog/namespace.c:402 commands/lockcmds.c:144 commands/lockcmds.c:233 #, c-format msgid "could not obtain lock on relation \"%s\"" msgstr "kunde inte ta lås på relationen \"%s\"" -#: catalog/namespace.c:428 parser/parse_relation.c:1357 +#: catalog/namespace.c:430 parser/parse_relation.c:1373 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "relationen \"%s.%s\" existerar inte" -#: catalog/namespace.c:433 parser/parse_relation.c:1370 -#: parser/parse_relation.c:1378 +#: catalog/namespace.c:435 parser/parse_relation.c:1386 +#: parser/parse_relation.c:1394 #, c-format msgid "relation \"%s\" does not exist" msgstr "relationen \"%s\" existerar inte" -#: catalog/namespace.c:499 catalog/namespace.c:3030 commands/extension.c:1519 -#: commands/extension.c:1525 +#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1531 +#: commands/extension.c:1537 #, c-format msgid "no schema has been selected to create in" msgstr "inget schema har valts för att skapa i" -#: catalog/namespace.c:651 catalog/namespace.c:664 +#: catalog/namespace.c:653 catalog/namespace.c:666 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "kan inte skapa relationer i temporära scheman som tillhör andra sessioner" -#: catalog/namespace.c:655 +#: catalog/namespace.c:657 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "kan inte skapa temporär relation i icke-temporärt schema" -#: catalog/namespace.c:670 +#: catalog/namespace.c:672 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "bara temporära relationer får skapas i temporära scheman" -#: catalog/namespace.c:2222 +#: catalog/namespace.c:2268 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "statistikobjektet \"%s\" existerar inte" -#: catalog/namespace.c:2345 +#: catalog/namespace.c:2391 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "textsökparser \"%s\" finns inte" -#: catalog/namespace.c:2471 +#: catalog/namespace.c:2517 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "textsökkatalog \"%s\" finns inte" -#: catalog/namespace.c:2598 +#: catalog/namespace.c:2644 #, c-format msgid "text search template \"%s\" does not exist" msgstr "textsökmall \"%s\" finns inte" -#: catalog/namespace.c:2724 commands/tsearchcmds.c:1194 -#: utils/cache/ts_cache.c:617 +#: catalog/namespace.c:2770 commands/tsearchcmds.c:1121 +#: utils/cache/ts_cache.c:613 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "textsökkonfiguration \"%s\" finns inte" -#: catalog/namespace.c:2837 parser/parse_expr.c:872 parser/parse_target.c:1228 +#: catalog/namespace.c:2883 parser/parse_expr.c:868 parser/parse_target.c:1255 #, c-format msgid "cross-database references are not implemented: %s" msgstr "referenser till andra databaser är inte implementerat: %s" -#: catalog/namespace.c:2843 gram.y:14981 gram.y:16435 parser/parse_expr.c:879 -#: parser/parse_target.c:1235 +#: catalog/namespace.c:2889 gram.y:18548 gram.y:18588 parser/parse_expr.c:875 +#: parser/parse_target.c:1262 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "ej korrekt kvalificerat namn (för många namn med punkt): %s" -#: catalog/namespace.c:2973 +#: catalog/namespace.c:3019 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "kan inte flytta objekt in eller ut från temporära scheman" -#: catalog/namespace.c:2979 +#: catalog/namespace.c:3025 #, c-format msgid "cannot move objects into or out of TOAST schema" msgstr "kan inte flytta objekt in eller ut från TOAST-schema" -#: catalog/namespace.c:3052 commands/schemacmds.c:256 commands/schemacmds.c:336 -#: commands/tablecmds.c:1194 +#: catalog/namespace.c:3098 commands/schemacmds.c:234 commands/schemacmds.c:314 +#: commands/tablecmds.c:1271 #, c-format msgid "schema \"%s\" does not exist" msgstr "schema \"%s\" existerar inte" -#: catalog/namespace.c:3083 +#: catalog/namespace.c:3129 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "ej korrekt relationsnamn (för många namn med punkt): %s" -#: catalog/namespace.c:3646 +#: catalog/namespace.c:3692 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "jämförelse \"%s\" för kodning \"%s\" finns inte" -#: catalog/namespace.c:3701 +#: catalog/namespace.c:3747 #, c-format msgid "conversion \"%s\" does not exist" msgstr "konvertering \"%s\" finns inte" -#: catalog/namespace.c:3965 +#: catalog/namespace.c:4011 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "rättighet saknas för att skapa temporära tabeller i databasen \"%s\"" -#: catalog/namespace.c:3981 +#: catalog/namespace.c:4027 #, c-format msgid "cannot create temporary tables during recovery" msgstr "kan inte skapa temptabeller under återställning" -#: catalog/namespace.c:3987 +#: catalog/namespace.c:4033 #, c-format msgid "cannot create temporary tables during a parallel operation" msgstr "kan inte skapa temporära tabeller under en parallell operation" -#: catalog/namespace.c:4286 commands/tablespace.c:1205 commands/variable.c:64 -#: utils/misc/guc.c:11144 utils/misc/guc.c:11222 +#: catalog/namespace.c:4334 commands/tablespace.c:1258 commands/variable.c:64 +#: utils/misc/guc.c:11948 utils/misc/guc.c:12050 #, c-format msgid "List syntax is invalid." msgstr "List-syntaxen är ogiltig." -#: catalog/objectaddress.c:1275 catalog/pg_publication.c:57 -#: commands/policy.c:95 commands/policy.c:375 commands/policy.c:465 -#: commands/tablecmds.c:230 commands/tablecmds.c:272 commands/tablecmds.c:1989 -#: commands/tablecmds.c:5626 commands/tablecmds.c:11089 +#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 +#: commands/tablecmds.c:246 commands/tablecmds.c:288 commands/tablecmds.c:2182 +#: commands/tablecmds.c:12209 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" är inte en tabell" -#: catalog/objectaddress.c:1282 commands/tablecmds.c:242 -#: commands/tablecmds.c:5656 commands/tablecmds.c:15711 commands/view.c:119 +#: catalog/objectaddress.c:1398 commands/tablecmds.c:258 +#: commands/tablecmds.c:17079 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" är inte en vy" -#: catalog/objectaddress.c:1289 commands/matview.c:175 commands/tablecmds.c:248 -#: commands/tablecmds.c:15716 +#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:264 +#: commands/tablecmds.c:17084 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" är inte en materialiserad vy" -#: catalog/objectaddress.c:1296 commands/tablecmds.c:266 -#: commands/tablecmds.c:5659 commands/tablecmds.c:15721 +#: catalog/objectaddress.c:1412 commands/tablecmds.c:282 +#: commands/tablecmds.c:17089 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" är inte en främmande tabell" -#: catalog/objectaddress.c:1337 +#: catalog/objectaddress.c:1453 #, c-format msgid "must specify relation and object name" msgstr "måste ange relation och objektnamn" -#: catalog/objectaddress.c:1413 catalog/objectaddress.c:1466 +#: catalog/objectaddress.c:1529 catalog/objectaddress.c:1582 #, c-format msgid "column name must be qualified" msgstr "kolumnnamn måste vara kvalificerat" -#: catalog/objectaddress.c:1513 +#: catalog/objectaddress.c:1601 #, c-format msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "standardvärde för kolumn \"%s\" i relation \"%s\" existerar inte" -#: catalog/objectaddress.c:1550 commands/functioncmds.c:133 -#: commands/tablecmds.c:258 commands/typecmds.c:263 commands/typecmds.c:3275 -#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:845 -#: utils/adt/acl.c:4436 +#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 +#: commands/tablecmds.c:274 commands/typecmds.c:274 commands/typecmds.c:3700 +#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:795 +#: utils/adt/acl.c:4434 #, c-format msgid "type \"%s\" does not exist" msgstr "typen \"%s\" existerar inte" -#: catalog/objectaddress.c:1669 +#: catalog/objectaddress.c:1757 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "operator %d (%s, %s) för %s finns inte" -#: catalog/objectaddress.c:1700 +#: catalog/objectaddress.c:1788 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "funktion %d (%s, %s) för %s finns inte" -#: catalog/objectaddress.c:1751 catalog/objectaddress.c:1777 +#: catalog/objectaddress.c:1839 catalog/objectaddress.c:1865 #, c-format msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "användarmappning för användare \"%s\" på server \"%s\" finns inte" -#: catalog/objectaddress.c:1766 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:1012 commands/foreigncmds.c:1395 -#: foreign/foreign.c:723 +#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:984 commands/foreigncmds.c:1343 foreign/foreign.c:691 #, c-format msgid "server \"%s\" does not exist" msgstr "server \"%s\" finns inte" -#: catalog/objectaddress.c:1833 +#: catalog/objectaddress.c:1921 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "publiceringsrelation \"%s\" i publicering \"%s\" finns inte" -#: catalog/objectaddress.c:1895 +#: catalog/objectaddress.c:1968 +#, fuzzy, c-format +#| msgid "publication relation \"%s\" in publication \"%s\" does not exist" +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "publiceringsrelation \"%s\" i publicering \"%s\" finns inte" + +#: catalog/objectaddress.c:2026 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "okänd standard-ACL-objekttyp \"%c\"" -#: catalog/objectaddress.c:1896 +#: catalog/objectaddress.c:2027 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "Giltiga objekttyper är \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." -#: catalog/objectaddress.c:1947 +#: catalog/objectaddress.c:2078 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "standard ACL för användare \"%s\" i schema \"%s\" på %s finns inte" -#: catalog/objectaddress.c:1952 +#: catalog/objectaddress.c:2083 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "standard ACL för användare \"%s\" på %s finns inte" -#: catalog/objectaddress.c:1979 catalog/objectaddress.c:2037 -#: catalog/objectaddress.c:2094 +#: catalog/objectaddress.c:2110 catalog/objectaddress.c:2168 +#: catalog/objectaddress.c:2225 #, c-format msgid "name or argument lists may not contain nulls" msgstr "namn eller argumentlistor får inte innehålla null" -#: catalog/objectaddress.c:2013 +#: catalog/objectaddress.c:2144 #, c-format msgid "unsupported object type \"%s\"" msgstr "ej stöd för objekttyp \"%s\"" -#: catalog/objectaddress.c:2033 catalog/objectaddress.c:2051 -#: catalog/objectaddress.c:2192 +#: catalog/objectaddress.c:2164 catalog/objectaddress.c:2182 +#: catalog/objectaddress.c:2325 #, c-format msgid "name list length must be exactly %d" msgstr "namnlistlängen måste vara exakt %d" -#: catalog/objectaddress.c:2055 +#: catalog/objectaddress.c:2186 #, c-format msgid "large object OID may not be null" msgstr "stort objekt-OID får inte vara null" -#: catalog/objectaddress.c:2064 catalog/objectaddress.c:2127 -#: catalog/objectaddress.c:2134 +#: catalog/objectaddress.c:2195 catalog/objectaddress.c:2259 +#: catalog/objectaddress.c:2266 #, c-format msgid "name list length must be at least %d" msgstr "namnlistlängden måste vara minst %d" -#: catalog/objectaddress.c:2120 catalog/objectaddress.c:2141 +#: catalog/objectaddress.c:2252 catalog/objectaddress.c:2273 #, c-format msgid "argument list length must be exactly %d" msgstr "argumentlistans längd måste vara exakt %d" -#: catalog/objectaddress.c:2393 libpq/be-fsstubs.c:321 +#: catalog/objectaddress.c:2527 libpq/be-fsstubs.c:318 #, c-format msgid "must be owner of large object %u" msgstr "måste vara ägaren till stort objekt %u" -#: catalog/objectaddress.c:2408 commands/functioncmds.c:1445 +#: catalog/objectaddress.c:2542 commands/functioncmds.c:1566 #, c-format msgid "must be owner of type %s or type %s" msgstr "måste vara ägaren till typ %s eller typ %s" -#: catalog/objectaddress.c:2458 catalog/objectaddress.c:2475 +#: catalog/objectaddress.c:2592 catalog/objectaddress.c:2610 #, c-format msgid "must be superuser" -msgstr "måste vara superanvändare" +msgstr "måste vara en superuser" -#: catalog/objectaddress.c:2465 +#: catalog/objectaddress.c:2599 #, c-format msgid "must have CREATEROLE privilege" msgstr "måste ha rättigheten CREATEROLE" -#: catalog/objectaddress.c:2544 +#: catalog/objectaddress.c:2680 #, c-format msgid "unrecognized object type \"%s\"" msgstr "okänd objekttyp \"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2772 +#: catalog/objectaddress.c:2972 #, c-format msgid "column %s of %s" msgstr "kolumn %s av %s" -#: catalog/objectaddress.c:2782 +#: catalog/objectaddress.c:2987 #, c-format msgid "function %s" msgstr "funktion %s" -#: catalog/objectaddress.c:2787 +#: catalog/objectaddress.c:3000 #, c-format msgid "type %s" msgstr "typ %s" -#: catalog/objectaddress.c:2817 +#: catalog/objectaddress.c:3037 #, c-format msgid "cast from %s to %s" msgstr "typomvandling från %s till %s" -#: catalog/objectaddress.c:2845 +#: catalog/objectaddress.c:3070 #, c-format msgid "collation %s" msgstr "jämförelse %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2871 +#: catalog/objectaddress.c:3101 #, c-format msgid "constraint %s on %s" msgstr "villkor %s på %s" -#: catalog/objectaddress.c:2877 +#: catalog/objectaddress.c:3107 #, c-format msgid "constraint %s" msgstr "villkor %s" -#: catalog/objectaddress.c:2904 +#: catalog/objectaddress.c:3139 #, c-format msgid "conversion %s" msgstr "konvertering %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:2943 +#: catalog/objectaddress.c:3161 #, c-format msgid "default value for %s" msgstr "default-värde för %s" -#: catalog/objectaddress.c:2952 +#: catalog/objectaddress.c:3172 #, c-format msgid "language %s" msgstr "språk %s" -#: catalog/objectaddress.c:2957 +#: catalog/objectaddress.c:3180 #, c-format msgid "large object %u" msgstr "stort objekt %u" -#: catalog/objectaddress.c:2962 +#: catalog/objectaddress.c:3193 #, c-format msgid "operator %s" msgstr "operator %s" -#: catalog/objectaddress.c:2994 +#: catalog/objectaddress.c:3230 #, c-format msgid "operator class %s for access method %s" msgstr "operatorklass %s för accessmetod %s" -#: catalog/objectaddress.c:3017 +#: catalog/objectaddress.c:3258 #, c-format msgid "access method %s" msgstr "accessmetod %s" @@ -4694,7 +4858,7 @@ msgstr "accessmetod %s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3059 +#: catalog/objectaddress.c:3307 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "operator %d (%s, %s) för %s: %s" @@ -4703,399 +4867,471 @@ msgstr "operator %d (%s, %s) för %s: %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3109 +#: catalog/objectaddress.c:3364 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "funktion %d (%s, %s) för %s: %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3153 +#: catalog/objectaddress.c:3416 #, c-format msgid "rule %s on %s" msgstr "regel %s på %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3191 +#: catalog/objectaddress.c:3462 #, c-format msgid "trigger %s on %s" msgstr "utlösare %s på %s" -#: catalog/objectaddress.c:3207 +#: catalog/objectaddress.c:3482 #, c-format msgid "schema %s" msgstr "schema %s" -#: catalog/objectaddress.c:3230 +#: catalog/objectaddress.c:3510 #, c-format msgid "statistics object %s" msgstr "statistikobjekt %s" -#: catalog/objectaddress.c:3257 +#: catalog/objectaddress.c:3541 #, c-format msgid "text search parser %s" msgstr "textsökparser %s" -#: catalog/objectaddress.c:3283 +#: catalog/objectaddress.c:3572 #, c-format msgid "text search dictionary %s" msgstr "textsökordlista %s" -#: catalog/objectaddress.c:3309 +#: catalog/objectaddress.c:3603 #, c-format msgid "text search template %s" msgstr "textsökmall %s" -#: catalog/objectaddress.c:3335 +#: catalog/objectaddress.c:3634 #, c-format msgid "text search configuration %s" msgstr "textsökkonfiguration %s" -#: catalog/objectaddress.c:3344 +#: catalog/objectaddress.c:3647 #, c-format msgid "role %s" msgstr "roll %s" -#: catalog/objectaddress.c:3357 +#: catalog/objectaddress.c:3663 #, c-format msgid "database %s" msgstr "databas %s" -#: catalog/objectaddress.c:3369 +#: catalog/objectaddress.c:3679 #, c-format msgid "tablespace %s" msgstr "tabellutrymme %s" -#: catalog/objectaddress.c:3378 +#: catalog/objectaddress.c:3690 #, c-format msgid "foreign-data wrapper %s" msgstr "främmande data-omvandlare %s" -#: catalog/objectaddress.c:3387 +#: catalog/objectaddress.c:3700 #, c-format msgid "server %s" msgstr "server %s" -#: catalog/objectaddress.c:3415 +#: catalog/objectaddress.c:3733 #, c-format msgid "user mapping for %s on server %s" msgstr "användarmappning för %s på server %s" -#: catalog/objectaddress.c:3460 +#: catalog/objectaddress.c:3785 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "standardrättigheter för nya relationer som tillhör rollen %s i schema %s" -#: catalog/objectaddress.c:3464 +#: catalog/objectaddress.c:3789 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "standardrättigheter för nya relationer som tillhör rollen %s" -#: catalog/objectaddress.c:3470 +#: catalog/objectaddress.c:3795 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "standardrättigheter för nya sekvenser som tillhör rollen %s i schema %s" -#: catalog/objectaddress.c:3474 +#: catalog/objectaddress.c:3799 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "standardrättigheter för nya sekvenser som tillhör rollen %s" -#: catalog/objectaddress.c:3480 +#: catalog/objectaddress.c:3805 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "standardrättigheter för nya funktioner som tillhör rollen %s i schema %s" -#: catalog/objectaddress.c:3484 +#: catalog/objectaddress.c:3809 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "standardrättigheter för nya funktioner som tillhör rollen %s" -#: catalog/objectaddress.c:3490 +#: catalog/objectaddress.c:3815 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "standardrättigheter för nya typer som tillhör rollen %s i schema %s" -#: catalog/objectaddress.c:3494 +#: catalog/objectaddress.c:3819 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "standardrättigheter för nya typer som tillhör rollen %s" -#: catalog/objectaddress.c:3500 +#: catalog/objectaddress.c:3825 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr " %zu)" msgstr "servern försöke skicka för stort GSSAPI-paket (%zu > %zu)" -#: libpq/be-secure-gssapi.c:330 +#: libpq/be-secure-gssapi.c:351 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" msgstr "för stort GSSAPI-paket skickat av klienten (%zu > %zu)" -#: libpq/be-secure-gssapi.c:364 +#: libpq/be-secure-gssapi.c:389 msgid "GSSAPI unwrap error" msgstr "GSSAPI-fel vid uppackning" -#: libpq/be-secure-gssapi.c:369 +#: libpq/be-secure-gssapi.c:396 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "inkommande GSSAPI-meddelande använde inte sekretess" -#: libpq/be-secure-gssapi.c:525 +#: libpq/be-secure-gssapi.c:570 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %d)" msgstr "för stort GSSAPI-paket skickat av klienten (%zu > %d)" -#: libpq/be-secure-gssapi.c:547 +#: libpq/be-secure-gssapi.c:594 msgid "could not accept GSSAPI security context" msgstr "kunde inte acceptera GSSSPI-säkerhetskontext" -#: libpq/be-secure-gssapi.c:637 +#: libpq/be-secure-gssapi.c:689 msgid "GSSAPI size check error" msgstr "GSSAPI-fel vid kontroll av storlek" -#: libpq/be-secure-openssl.c:112 +#: libpq/be-secure-openssl.c:122 #, c-format msgid "could not create SSL context: %s" msgstr "kunde inte skapa SSL-kontext: %s" -#: libpq/be-secure-openssl.c:138 +#: libpq/be-secure-openssl.c:148 #, c-format msgid "could not load server certificate file \"%s\": %s" msgstr "kunde inte ladda serverns certifikatfil \"%s\": %s" -#: libpq/be-secure-openssl.c:158 +#: libpq/be-secure-openssl.c:168 #, c-format msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" msgstr "privat nyckelfil \"%s\" kan inte laddas om eftersom den kräver en lösenordsfras" -#: libpq/be-secure-openssl.c:163 +#: libpq/be-secure-openssl.c:173 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "kunde inte läsa in privata nyckelfilen \"%s\": %s" -#: libpq/be-secure-openssl.c:172 +#: libpq/be-secure-openssl.c:182 #, c-format msgid "check of private key failed: %s" msgstr "kontroll av privat nyckel misslyckades: %s" -#: libpq/be-secure-openssl.c:184 libpq/be-secure-openssl.c:206 +#. translator: first %s is a GUC option name, second %s is its value +#: libpq/be-secure-openssl.c:195 libpq/be-secure-openssl.c:218 #, c-format msgid "\"%s\" setting \"%s\" not supported by this build" msgstr "\"%s\"-inställning \"%s\" stöds inte av detta bygge" -#: libpq/be-secure-openssl.c:194 +#: libpq/be-secure-openssl.c:205 #, c-format msgid "could not set minimum SSL protocol version" msgstr "kunde inte sätta minimal SSL-protokollversion" -#: libpq/be-secure-openssl.c:216 +#: libpq/be-secure-openssl.c:228 #, c-format msgid "could not set maximum SSL protocol version" msgstr "kunde inte sätta maximal SSL-protokollversion" -#: libpq/be-secure-openssl.c:232 +#: libpq/be-secure-openssl.c:244 #, c-format msgid "could not set SSL protocol version range" msgstr "kunde inte sätta SSL-protokollversionsintervall" -#: libpq/be-secure-openssl.c:233 +#: libpq/be-secure-openssl.c:245 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "\"%s\" får inte vara högre än \"%s\"" -#: libpq/be-secure-openssl.c:257 +#: libpq/be-secure-openssl.c:282 #, c-format msgid "could not set the cipher list (no valid ciphers available)" msgstr "kunde inte sätta kryptolistan (inga giltiga krypton är tillgängliga)" -#: libpq/be-secure-openssl.c:275 +#: libpq/be-secure-openssl.c:302 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "kunde inte ladda root-certifikatfilen \"%s\": %s" -#: libpq/be-secure-openssl.c:302 +#: libpq/be-secure-openssl.c:351 #, c-format msgid "could not load SSL certificate revocation list file \"%s\": %s" -msgstr "kunde inte ladda certifikatåterkallningslistfil \"%s\" för SSL-certifikat: %s" +msgstr "kunde inte ladda fil \"%s\" med certifikatåterkallningslista för SSL: %s" + +#: libpq/be-secure-openssl.c:359 +#, c-format +msgid "could not load SSL certificate revocation list directory \"%s\": %s" +msgstr "kunde inte ladda katalog \"%s\" för certifikatåterkallning: %s" -#: libpq/be-secure-openssl.c:378 +#: libpq/be-secure-openssl.c:367 +#, c-format +msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" +msgstr "kunde inte ladda fil \"%s\" eller katalog \"%s\" med certifikatåterkallning för SSL: %s" + +#: libpq/be-secure-openssl.c:425 #, c-format msgid "could not initialize SSL connection: SSL context not set up" msgstr "kunde inte initiera SSL-uppkoppling: SSL-kontex ej uppsatt" -#: libpq/be-secure-openssl.c:386 +#: libpq/be-secure-openssl.c:436 #, c-format msgid "could not initialize SSL connection: %s" msgstr "kunde inte initiera SSL-uppkoppling: %s" -#: libpq/be-secure-openssl.c:394 +#: libpq/be-secure-openssl.c:444 #, c-format msgid "could not set SSL socket: %s" msgstr "kunde inte sätta SSL-uttag (socket): %s" -#: libpq/be-secure-openssl.c:449 +#: libpq/be-secure-openssl.c:499 #, c-format msgid "could not accept SSL connection: %m" msgstr "kunde inte acceptera SSL-uppkoppling: %m" -#: libpq/be-secure-openssl.c:453 libpq/be-secure-openssl.c:506 +#: libpq/be-secure-openssl.c:503 libpq/be-secure-openssl.c:556 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "kunde inte starta SSL-anslutning: hittade EOF" -#: libpq/be-secure-openssl.c:492 +#: libpq/be-secure-openssl.c:542 #, c-format msgid "could not accept SSL connection: %s" msgstr "kunde inte acceptera SSL-uppkoppling: %s" -#: libpq/be-secure-openssl.c:495 +#: libpq/be-secure-openssl.c:545 #, c-format msgid "This may indicate that the client does not support any SSL protocol version between %s and %s." msgstr "Detta kan tyda på att servern inte stöder någon SSL-protokolversion mellan %s och %s." -#: libpq/be-secure-openssl.c:511 libpq/be-secure-openssl.c:642 -#: libpq/be-secure-openssl.c:706 +#: libpq/be-secure-openssl.c:561 libpq/be-secure-openssl.c:741 +#: libpq/be-secure-openssl.c:805 #, c-format msgid "unrecognized SSL error code: %d" msgstr "okänd SSL-felkod: %d" -#: libpq/be-secure-openssl.c:553 +#: libpq/be-secure-openssl.c:607 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "SSL-certifikatets \"comman name\" innehåller null-värden" -#: libpq/be-secure-openssl.c:631 libpq/be-secure-openssl.c:690 +#: libpq/be-secure-openssl.c:647 +#, c-format +msgid "SSL certificate's distinguished name contains embedded null" +msgstr "SSL-certifikatets utskiljande namn innehåller null-värden" + +#: libpq/be-secure-openssl.c:730 libpq/be-secure-openssl.c:789 #, c-format msgid "SSL error: %s" msgstr "SSL-fel: %s" -#: libpq/be-secure-openssl.c:871 +#: libpq/be-secure-openssl.c:971 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "kunde inte öppna DH-parameterfil \"%s\": %m" -#: libpq/be-secure-openssl.c:883 +#: libpq/be-secure-openssl.c:983 #, c-format msgid "could not load DH parameters file: %s" msgstr "kunde inte ladda DH-parameterfil: %s" -#: libpq/be-secure-openssl.c:893 +#: libpq/be-secure-openssl.c:993 #, c-format msgid "invalid DH parameters: %s" msgstr "ogiltiga DH-parametrar: %s" -#: libpq/be-secure-openssl.c:901 +#: libpq/be-secure-openssl.c:1002 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "ogiltiga DH-parametrar: p är inte ett primtal" -#: libpq/be-secure-openssl.c:909 +#: libpq/be-secure-openssl.c:1011 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "ogiltiga DH-parametrar: varken lämplig generator eller säkert primtal" -#: libpq/be-secure-openssl.c:1065 +#: libpq/be-secure-openssl.c:1172 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: kunde inte ladda DH-parametrar" -#: libpq/be-secure-openssl.c:1073 +#: libpq/be-secure-openssl.c:1180 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: kunde inte sätta DH-parametrar: %s" -#: libpq/be-secure-openssl.c:1100 +#: libpq/be-secure-openssl.c:1207 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: okänt kurvnamn: %s" -#: libpq/be-secure-openssl.c:1109 +#: libpq/be-secure-openssl.c:1216 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: kunde inte skapa nyckel" -#: libpq/be-secure-openssl.c:1137 +#: libpq/be-secure-openssl.c:1244 msgid "no SSL error reported" msgstr "inget SSL-fel rapporterat" -#: libpq/be-secure-openssl.c:1141 +#: libpq/be-secure-openssl.c:1248 #, c-format msgid "SSL error code %lu" msgstr "SSL-felkod %lu" -#: libpq/be-secure.c:122 +#: libpq/be-secure-openssl.c:1402 +#, c-format +msgid "could not create BIO" +msgstr "kunde inte skapa BIO" + +#: libpq/be-secure-openssl.c:1412 +#, c-format +msgid "could not get NID for ASN1_OBJECT object" +msgstr "kunde inte hämta NID för ASN1_OBJECT-objekt" + +#: libpq/be-secure-openssl.c:1420 #, c-format -msgid "SSL connection from \"%s\"" -msgstr "SSL-uppkoppling från \"%s\"" +msgid "could not convert NID %d to an ASN1_OBJECT structure" +msgstr "kunde inte konvertera NID %d till en ASN1_OBJECT-struktur" -#: libpq/be-secure.c:207 libpq/be-secure.c:303 +#: libpq/be-secure.c:209 libpq/be-secure.c:305 #, c-format msgid "terminating connection due to unexpected postmaster exit" msgstr "avslutar anslutning på grund av att postmaster stängde oväntat ner" @@ -13780,541 +14950,563 @@ msgstr "Användaren \"%s\" har inget lösenord satt." msgid "User \"%s\" has an expired password." msgstr "Användaren \"%s\" har ett utgånget lösenord." -#: libpq/crypt.c:179 +#: libpq/crypt.c:181 #, c-format msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "Användaren \"%s\" har ett lösenord som inte kan användas med MD5-autentisering." -#: libpq/crypt.c:203 libpq/crypt.c:244 libpq/crypt.c:268 +#: libpq/crypt.c:202 libpq/crypt.c:244 libpq/crypt.c:264 #, c-format msgid "Password does not match for user \"%s\"." msgstr "Lösenordet matchar inte för användare \"%s\"." -#: libpq/crypt.c:287 +#: libpq/crypt.c:283 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "Lösenordet för användare \"%s\" är på ett okänt format." -#: libpq/hba.c:235 +#: libpq/hba.c:209 #, c-format msgid "authentication file token too long, skipping: \"%s\"" msgstr "autentiseringsfil-token för lång, hoppar över: \"%s\"" -#: libpq/hba.c:407 +#: libpq/hba.c:381 #, c-format msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" msgstr "kunde inte öppna sekundär autentiseringsfil \"@%s\" som \"%s\": %m" -#: libpq/hba.c:509 -#, c-format -msgid "authentication file line too long" -msgstr "autentiseringsfilrad är för lång" - -#: libpq/hba.c:510 libpq/hba.c:867 libpq/hba.c:887 libpq/hba.c:925 -#: libpq/hba.c:975 libpq/hba.c:989 libpq/hba.c:1013 libpq/hba.c:1022 -#: libpq/hba.c:1035 libpq/hba.c:1056 libpq/hba.c:1069 libpq/hba.c:1089 -#: libpq/hba.c:1111 libpq/hba.c:1123 libpq/hba.c:1179 libpq/hba.c:1199 -#: libpq/hba.c:1213 libpq/hba.c:1232 libpq/hba.c:1243 libpq/hba.c:1258 -#: libpq/hba.c:1276 libpq/hba.c:1292 libpq/hba.c:1304 libpq/hba.c:1341 -#: libpq/hba.c:1382 libpq/hba.c:1395 libpq/hba.c:1417 libpq/hba.c:1430 -#: libpq/hba.c:1442 libpq/hba.c:1460 libpq/hba.c:1510 libpq/hba.c:1554 -#: libpq/hba.c:1565 libpq/hba.c:1581 libpq/hba.c:1598 libpq/hba.c:1608 -#: libpq/hba.c:1666 libpq/hba.c:1704 libpq/hba.c:1726 libpq/hba.c:1738 -#: libpq/hba.c:1825 libpq/hba.c:1843 libpq/hba.c:1937 libpq/hba.c:1956 -#: libpq/hba.c:1985 libpq/hba.c:1998 libpq/hba.c:2021 libpq/hba.c:2043 -#: libpq/hba.c:2057 tsearch/ts_locale.c:217 +#: libpq/hba.c:832 #, c-format -msgid "line %d of configuration file \"%s\"" -msgstr "rad %d i konfigurationsfil \"%s\"" +msgid "error enumerating network interfaces: %m" +msgstr "fel vid uppräkning av nätverksinterface: %m" #. translator: the second %s is a list of auth methods -#: libpq/hba.c:865 +#: libpq/hba.c:859 #, c-format msgid "authentication option \"%s\" is only valid for authentication methods %s" msgstr "autentiseringsflagga \"%s\" är bara giltig för autentiseringsmetoder %s" -#: libpq/hba.c:885 +#: libpq/hba.c:861 libpq/hba.c:881 libpq/hba.c:916 libpq/hba.c:967 +#: libpq/hba.c:981 libpq/hba.c:1005 libpq/hba.c:1013 libpq/hba.c:1025 +#: libpq/hba.c:1046 libpq/hba.c:1059 libpq/hba.c:1079 libpq/hba.c:1101 +#: libpq/hba.c:1113 libpq/hba.c:1172 libpq/hba.c:1192 libpq/hba.c:1206 +#: libpq/hba.c:1226 libpq/hba.c:1237 libpq/hba.c:1252 libpq/hba.c:1271 +#: libpq/hba.c:1287 libpq/hba.c:1299 libpq/hba.c:1336 libpq/hba.c:1377 +#: libpq/hba.c:1390 libpq/hba.c:1412 libpq/hba.c:1424 libpq/hba.c:1442 +#: libpq/hba.c:1492 libpq/hba.c:1536 libpq/hba.c:1547 libpq/hba.c:1563 +#: libpq/hba.c:1580 libpq/hba.c:1591 libpq/hba.c:1610 libpq/hba.c:1626 +#: libpq/hba.c:1642 libpq/hba.c:1700 libpq/hba.c:1717 libpq/hba.c:1730 +#: libpq/hba.c:1742 libpq/hba.c:1761 libpq/hba.c:1847 libpq/hba.c:1865 +#: libpq/hba.c:1959 libpq/hba.c:1978 libpq/hba.c:2007 libpq/hba.c:2020 +#: libpq/hba.c:2043 libpq/hba.c:2065 libpq/hba.c:2079 tsearch/ts_locale.c:232 +#, c-format +msgid "line %d of configuration file \"%s\"" +msgstr "rad %d i konfigurationsfil \"%s\"" + +#: libpq/hba.c:879 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "autentiseringsmetod \"%s\" kräver att argumentet \"%s\" är satt" -#: libpq/hba.c:913 +#: libpq/hba.c:903 #, c-format msgid "missing entry in file \"%s\" at end of line %d" msgstr "saknar post i fil \"%s\" vid slutet av rad %d" -#: libpq/hba.c:924 +#: libpq/hba.c:915 #, c-format msgid "multiple values in ident field" msgstr "multipla värden i ident-fält" -#: libpq/hba.c:973 +#: libpq/hba.c:965 #, c-format msgid "multiple values specified for connection type" msgstr "multipla värden angivna för anslutningstyp" -#: libpq/hba.c:974 +#: libpq/hba.c:966 #, c-format msgid "Specify exactly one connection type per line." msgstr "Ange exakt en anslutningstyp per rad." -#: libpq/hba.c:988 +#: libpq/hba.c:980 #, c-format msgid "local connections are not supported by this build" msgstr "lokala anslutningar stöds inte av detta bygge" -#: libpq/hba.c:1011 +#: libpq/hba.c:1003 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "hostssl-post kan inte matcha då SSL är avslaget" -#: libpq/hba.c:1012 +#: libpq/hba.c:1004 #, c-format msgid "Set ssl = on in postgresql.conf." msgstr "Sätt ssl = on i postgresql.conf." -#: libpq/hba.c:1020 +#: libpq/hba.c:1012 #, c-format msgid "hostssl record cannot match because SSL is not supported by this build" msgstr "hostssl-post kan inte matcha då SSL inte stöds i detta bygge" -#: libpq/hba.c:1021 -#, c-format -msgid "Compile with --with-openssl to use SSL connections." -msgstr "Kompilera med --with-openssl för att använda SSL-anslutningar." - -#: libpq/hba.c:1033 +#: libpq/hba.c:1024 #, c-format msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" msgstr "hostgssenc-post kan inte matcha då GSSAPI inte stöds i detta bygge" -#: libpq/hba.c:1034 -#, c-format -msgid "Compile with --with-gssapi to use GSSAPI connections." -msgstr "Kompilera med --with-gssapi för att använda GSSAPI-anslutningar." - -#: libpq/hba.c:1054 +#: libpq/hba.c:1044 #, c-format msgid "invalid connection type \"%s\"" msgstr "ogiltig anslutningstyp \"%s\"" -#: libpq/hba.c:1068 +#: libpq/hba.c:1058 #, c-format msgid "end-of-line before database specification" msgstr "slut-på-rad innan databasspecifikation" -#: libpq/hba.c:1088 +#: libpq/hba.c:1078 #, c-format msgid "end-of-line before role specification" msgstr "slut-på-rad innan rollspecifikation" -#: libpq/hba.c:1110 +#: libpq/hba.c:1100 #, c-format msgid "end-of-line before IP address specification" msgstr "slut-på-rad före IP-adressangivelse" -#: libpq/hba.c:1121 +#: libpq/hba.c:1111 #, c-format msgid "multiple values specified for host address" msgstr "multipla värden angivna för värdnamn" -#: libpq/hba.c:1122 +#: libpq/hba.c:1112 #, c-format msgid "Specify one address range per line." msgstr "Ange ett adressintervall per rad." -#: libpq/hba.c:1177 +#: libpq/hba.c:1170 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "ogiltig IP-adress \"%s\": %s" -#: libpq/hba.c:1197 +#: libpq/hba.c:1190 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "får inte ange både värdnamn och CIDR-mask: \"%s\"" -#: libpq/hba.c:1211 +#: libpq/hba.c:1204 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "ogiltig CIDR-mask i adress \"%s\"" -#: libpq/hba.c:1230 +#: libpq/hba.c:1224 #, c-format msgid "end-of-line before netmask specification" msgstr "slut-på-fil innan nätmask-angivelse" -#: libpq/hba.c:1231 +#: libpq/hba.c:1225 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "Ange adressintervall på CIDR-format eller ange en separat nätmask." -#: libpq/hba.c:1242 +#: libpq/hba.c:1236 #, c-format msgid "multiple values specified for netmask" msgstr "multipla värden angivna för nätmask" -#: libpq/hba.c:1256 +#: libpq/hba.c:1250 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "ogiltig IP-mask \"%s\": %s" -#: libpq/hba.c:1275 +#: libpq/hba.c:1270 #, c-format msgid "IP address and mask do not match" msgstr "IP-adress och mask matchar inte varandra" -#: libpq/hba.c:1291 +#: libpq/hba.c:1286 #, c-format msgid "end-of-line before authentication method" msgstr "slut-på-rad innan autentiseringsmetod" -#: libpq/hba.c:1302 +#: libpq/hba.c:1297 #, c-format msgid "multiple values specified for authentication type" msgstr "multipla värden angivna för autentiseringstyp" -#: libpq/hba.c:1303 +#: libpq/hba.c:1298 #, c-format msgid "Specify exactly one authentication type per line." msgstr "Ange exakt en autentiseringstyp per rad." -#: libpq/hba.c:1380 +#: libpq/hba.c:1375 #, c-format msgid "invalid authentication method \"%s\"" msgstr "ogiltig autentiseringsmetod \"%s\"" -#: libpq/hba.c:1393 +#: libpq/hba.c:1388 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "ogiltig autentiseringsmetod \"%s\": stöds inte av detta bygge" -#: libpq/hba.c:1416 +#: libpq/hba.c:1411 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "gssapi-autentisering stöds ej på lokala uttag (socket)" -#: libpq/hba.c:1429 -#, c-format -msgid "GSSAPI encryption only supports gss, trust, or reject authentication" -msgstr "GSSAPI-kryptering stöder bara gss-, trust- eller reject-autentisering" - -#: libpq/hba.c:1441 +#: libpq/hba.c:1423 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "peer-autentisering stöds bara på logala uttag (socket)" -#: libpq/hba.c:1459 +#: libpq/hba.c:1441 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "cert-autentisering stöds bara för hostssl-anslutningar" -#: libpq/hba.c:1509 +#: libpq/hba.c:1491 #, c-format msgid "authentication option not in name=value format: %s" msgstr "autentiseringsflagga et på formatet namn=värde: %s" -#: libpq/hba.c:1553 +#: libpq/hba.c:1535 #, c-format msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" msgstr "kan inte använda ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter eller ldapurl tillsammans med ldapprefix" -#: libpq/hba.c:1564 +#: libpq/hba.c:1546 #, c-format msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" msgstr "autentiseringsmetoden \"ldap\" kräver att argumenten \"ldapbasedn\", \"ldapprefix\" eller \"ldapsuffix\" är satta" -#: libpq/hba.c:1580 +#: libpq/hba.c:1562 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "kan inte använda ldapsearchattribute tillsammans med ldapsearchfilter" -#: libpq/hba.c:1597 +#: libpq/hba.c:1579 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "listan med RADIUS-servrar kan inte vara tom" -#: libpq/hba.c:1607 +#: libpq/hba.c:1590 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "listan med RADIUS-hemligheter kan inte vara tom" -#: libpq/hba.c:1660 +#: libpq/hba.c:1607 +#, c-format +msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "antalet RADIUS-hemligheter (%d) måste vara 1 eller samma som antalet RADIUS-servrar (%d)" + +#: libpq/hba.c:1623 #, c-format -msgid "the number of %s (%d) must be 1 or the same as the number of %s (%d)" -msgstr "antalet %s (%d) måste vara 1 eller samma som antalet %s (%d)" +msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "antalet RADIUS-portar (%d) måste vara 1 eller samma som antalet RADIUS-servrar (%d)" -#: libpq/hba.c:1694 +#: libpq/hba.c:1639 +#, c-format +msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "antalet RADIUS-identifierare (%d) måste vara 1 eller samma som antalet RADIUS-servrar (%d)" + +#: libpq/hba.c:1690 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi och cert" -#: libpq/hba.c:1703 +#: libpq/hba.c:1699 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert kan bara konfigureras för \"hostssl\"-rader" -#: libpq/hba.c:1725 +#: libpq/hba.c:1716 #, c-format -msgid "clientcert cannot be set to \"no-verify\" when using \"cert\" authentication" -msgstr "clientcert kan inte vara satt till \"no-verify\" när man använder \"cert\"-autentisering" +msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" +msgstr "clientcert tillåter bara \"verify-full\" när man använder \"cert\"-autentisering" -#: libpq/hba.c:1737 +#: libpq/hba.c:1729 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "ogiltigt värde för clientcert: \"%s\"" -#: libpq/hba.c:1771 +#: libpq/hba.c:1741 +#, c-format +msgid "clientname can only be configured for \"hostssl\" rows" +msgstr "clientname kan bara konfigureras för \"hostssl\"-rader" + +#: libpq/hba.c:1760 +#, c-format +msgid "invalid value for clientname: \"%s\"" +msgstr "ogiltigt värde för clientname: \"%s\"" + +#: libpq/hba.c:1793 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "kunde inte parsa LDAP-URL \"%s\": %s" -#: libpq/hba.c:1782 +#: libpq/hba.c:1804 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "ej stöd för LDAP-URL-schema: %s" -#: libpq/hba.c:1806 +#: libpq/hba.c:1828 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "LDAP-URL:er stöds inte på denna platform" -#: libpq/hba.c:1824 +#: libpq/hba.c:1846 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "ogiltigt ldap-schema-värde: \"%s\"" -#: libpq/hba.c:1842 +#: libpq/hba.c:1864 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "ogiltigt LDAP-portnummer \"%s\"" -#: libpq/hba.c:1888 libpq/hba.c:1895 +#: libpq/hba.c:1910 libpq/hba.c:1917 msgid "gssapi and sspi" msgstr "gssapi och sspi" -#: libpq/hba.c:1904 libpq/hba.c:1913 +#: libpq/hba.c:1926 libpq/hba.c:1935 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1935 +#: libpq/hba.c:1957 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "kunde inte parsa RADIUS-serverlista \"%s\"" -#: libpq/hba.c:1983 +#: libpq/hba.c:2005 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "kunde inte parsa RADIUS-portlista \"%s\"" -#: libpq/hba.c:1997 +#: libpq/hba.c:2019 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "ogiltigt RADIUS-portnummer: \"%s\"" -#: libpq/hba.c:2019 +#: libpq/hba.c:2041 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "kunde inte parsa RADIUS-hemlighetlista: \"%s\"" -#: libpq/hba.c:2041 +#: libpq/hba.c:2063 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "kunde inte parsa RADIUS-identifierarlista: \"%s\"" -#: libpq/hba.c:2055 +#: libpq/hba.c:2077 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "okänd autentiseringsflaggnamn: \"%s\"" -#: libpq/hba.c:2250 +#: libpq/hba.c:2274 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "konfigurationsfil \"%s\" innehåller inga poster" -#: libpq/hba.c:2768 +#: libpq/hba.c:2374 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "ogiltigt reguljärt uttryck \"%s\": %s" -#: libpq/hba.c:2828 +#: libpq/hba.c:2437 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "matchning av reguljärt uttryck för \"%s\" misslyckades: %s" -#: libpq/hba.c:2847 +#: libpq/hba.c:2456 #, c-format msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" msgstr "reguljärt uttryck \"%s\" har inga deluttryck som krävs för bakåtreferens i \"%s\"" -#: libpq/hba.c:2943 +#: libpq/hba.c:2552 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "givet användarnamn (%s) och autentiserat användarnamn (%s) matchar inte" -#: libpq/hba.c:2963 +#: libpq/hba.c:2572 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "ingen träff i användarmappning \"%s\" för användare \"%s\" autentiserad som \"%s\"" -#: libpq/hba.c:2996 +#: libpq/hba.c:2605 utils/adt/hbafuncs.c:512 #, c-format msgid "could not open usermap file \"%s\": %m" msgstr "kunde inte öppna användarmappningsfil \"%s\": %m" -#: libpq/pqcomm.c:218 +#: libpq/pqcomm.c:204 #, c-format msgid "could not set socket to nonblocking mode: %m" msgstr "kunde inte sätta uttag (socket) till ickeblockerande läge: %m" -#: libpq/pqcomm.c:372 +#: libpq/pqcomm.c:362 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "Sökväg till unixdomänuttag \"%s\" är för lång (maximalt %d byte)" -#: libpq/pqcomm.c:393 +#: libpq/pqcomm.c:383 #, c-format msgid "could not translate host name \"%s\", service \"%s\" to address: %s" msgstr "kunde inte översätta värdnamn \"%s\", service \"%s\" till adress: %s" -#: libpq/pqcomm.c:397 +#: libpq/pqcomm.c:387 #, c-format msgid "could not translate service \"%s\" to address: %s" msgstr "kunde inte översätta service \"%s\" till adress: %s" -#: libpq/pqcomm.c:424 +#: libpq/pqcomm.c:414 #, c-format msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" msgstr "kunde inte binda till alla efterfrågade adresser: MAXLISTEN (%d) överskriden" -#: libpq/pqcomm.c:433 +#: libpq/pqcomm.c:423 msgid "IPv4" msgstr "IPv4" -#: libpq/pqcomm.c:437 +#: libpq/pqcomm.c:427 msgid "IPv6" msgstr "IPv6" -#: libpq/pqcomm.c:442 +#: libpq/pqcomm.c:432 msgid "Unix" msgstr "Unix" -#: libpq/pqcomm.c:447 +#: libpq/pqcomm.c:437 #, c-format msgid "unrecognized address family %d" msgstr "ej igenkänd adressfamilj %d" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:473 +#: libpq/pqcomm.c:463 #, c-format msgid "could not create %s socket for address \"%s\": %m" msgstr "kunde inte skapa %s-uttag för adress \"%s\": %m" -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:499 -#, c-format -msgid "setsockopt(SO_REUSEADDR) failed for %s address \"%s\": %m" -msgstr "setsockopt(SO_REUSEADDR) misslyckades för %s-adress \"%s\": %m" - -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:516 +#. translator: third %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:489 libpq/pqcomm.c:507 #, c-format -msgid "setsockopt(IPV6_V6ONLY) failed for %s address \"%s\": %m" -msgstr "setsockopt(IPV6_V6ONLY) misslyckades för %s-adress \"%s\": %m" +msgid "%s(%s) failed for %s address \"%s\": %m" +msgstr "%s(%s) misslyckades för %s-adress \"%s\": %m" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:536 +#: libpq/pqcomm.c:530 #, c-format msgid "could not bind %s address \"%s\": %m" msgstr "kunde inte binda %s-adress \"%s\": %m" -#: libpq/pqcomm.c:539 +#: libpq/pqcomm.c:534 #, c-format -msgid "Is another postmaster already running on port %d? If not, remove socket file \"%s\" and retry." -msgstr "Kör en annan postmaster redan på port %d? Om inte, ta bort uttagsfil \"%s\" och försök igen." +msgid "Is another postmaster already running on port %d?" +msgstr "Kör en annan postmaster redan på port %d?" -#: libpq/pqcomm.c:542 +#: libpq/pqcomm.c:536 #, c-format msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." msgstr "Kör en annan postmaster redan på port %d? Om inte, vänta några sekunder och försök igen." #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:575 +#: libpq/pqcomm.c:569 #, c-format msgid "could not listen on %s address \"%s\": %m" msgstr "kunde inte lyssna på %s-adress \"%s\": %m" -#: libpq/pqcomm.c:584 +#: libpq/pqcomm.c:578 #, c-format msgid "listening on Unix socket \"%s\"" msgstr "lyssnar på Unix-uttag (socket) \"%s\"" #. translator: first %s is IPv4 or IPv6 -#: libpq/pqcomm.c:590 +#: libpq/pqcomm.c:584 #, c-format msgid "listening on %s address \"%s\", port %d" msgstr "lyssnar på %s-adress \"%s\", port %d" -#: libpq/pqcomm.c:673 +#: libpq/pqcomm.c:675 #, c-format msgid "group \"%s\" does not exist" msgstr "gruppen \"%s\" existerar inte" -#: libpq/pqcomm.c:683 +#: libpq/pqcomm.c:685 #, c-format msgid "could not set group of file \"%s\": %m" msgstr "kunde inte sätta gruppen på filen \"%s\": %m" -#: libpq/pqcomm.c:694 +#: libpq/pqcomm.c:696 #, c-format msgid "could not set permissions of file \"%s\": %m" msgstr "kunde inte sätta rättigheter på filen \"%s\": %m" -#: libpq/pqcomm.c:724 +#: libpq/pqcomm.c:726 #, c-format msgid "could not accept new connection: %m" msgstr "kunde inte acceptera ny uppkoppling: %m" -#: libpq/pqcomm.c:914 +#: libpq/pqcomm.c:766 libpq/pqcomm.c:775 libpq/pqcomm.c:807 libpq/pqcomm.c:817 +#: libpq/pqcomm.c:1642 libpq/pqcomm.c:1687 libpq/pqcomm.c:1727 +#: libpq/pqcomm.c:1771 libpq/pqcomm.c:1810 libpq/pqcomm.c:1849 +#: libpq/pqcomm.c:1885 libpq/pqcomm.c:1924 +#, c-format +msgid "%s(%s) failed: %m" +msgstr "%s(%s) misslyckades: %m" + +#: libpq/pqcomm.c:921 #, c-format msgid "there is no client connection" msgstr "det finns ingen klientanslutning" -#: libpq/pqcomm.c:965 libpq/pqcomm.c:1061 +#: libpq/pqcomm.c:972 libpq/pqcomm.c:1068 #, c-format msgid "could not receive data from client: %m" msgstr "kunde inte ta emot data från klient: %m" -#: libpq/pqcomm.c:1206 tcop/postgres.c:4142 +#: libpq/pqcomm.c:1173 tcop/postgres.c:4334 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "stänger anslutning då protokollsynkroniseringen tappades" -#: libpq/pqcomm.c:1272 +#: libpq/pqcomm.c:1239 #, c-format msgid "unexpected EOF within message length word" msgstr "oväntat EOF inom meddelandelängdord" -#: libpq/pqcomm.c:1283 +#: libpq/pqcomm.c:1249 #, c-format msgid "invalid message length" msgstr "ogiltig meddelandelängd" -#: libpq/pqcomm.c:1305 libpq/pqcomm.c:1318 +#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 #, c-format msgid "incomplete message from client" msgstr "inkomplett meddelande från klient" -#: libpq/pqcomm.c:1451 +#: libpq/pqcomm.c:1395 #, c-format msgid "could not send data to client: %m" msgstr "kunde inte skicka data till klient: %m" +#: libpq/pqcomm.c:1610 +#, c-format +msgid "%s(%s) failed: error code %d" +msgstr "%s(%s) misslyckades: felkod %d" + +#: libpq/pqcomm.c:1699 +#, c-format +msgid "setting the keepalive idle time is not supported" +msgstr "sätta idle-tid på keepalive stöds inte" + +#: libpq/pqcomm.c:1783 libpq/pqcomm.c:1858 libpq/pqcomm.c:1933 +#, c-format +msgid "%s(%s) not supported" +msgstr "%s(%s) stöds inte" + #: libpq/pqformat.c:406 #, c-format msgid "no data left in message" msgstr "ingen data kvar i meddelandet" #: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 -#: utils/adt/arrayfuncs.c:1471 utils/adt/rowtypes.c:567 +#: utils/adt/arrayfuncs.c:1482 utils/adt/rowtypes.c:588 #, c-format msgid "insufficient data left in message" msgstr "otillräckligt med data kvar i meddelande" @@ -14329,12 +15521,12 @@ msgstr "ogiltig sträng i meddelande" msgid "invalid message format" msgstr "ogiltigt meddelandeformat" -#: main/main.c:246 +#: main/main.c:239 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: WSAStartup misslyckades: %d\n" -#: main/main.c:310 +#: main/main.c:350 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -14343,7 +15535,7 @@ msgstr "" "%s är PostgreSQL-servern.\n" "\n" -#: main/main.c:311 +#: main/main.c:351 #, c-format msgid "" "Usage:\n" @@ -14354,112 +15546,107 @@ msgstr "" " %s [FLAGGA]...\n" "\n" -#: main/main.c:312 +#: main/main.c:352 #, c-format msgid "Options:\n" msgstr "Flaggor:\n" -#: main/main.c:313 +#: main/main.c:353 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B NBUFFERS antalet delade buffertar\n" -#: main/main.c:314 +#: main/main.c:354 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NAMN=VÄRDE sätt körparameter\n" -#: main/main.c:315 +#: main/main.c:355 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C NAMN skriv ut värde av runtime-parameter, avsluta sen\n" -#: main/main.c:316 +#: main/main.c:356 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 debug-nivå\n" -#: main/main.c:317 +#: main/main.c:357 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D DATADIR databaskatalog\n" -#: main/main.c:318 +#: main/main.c:358 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e använd europeiskt datumformat för indata (DMY)\n" -#: main/main.c:319 +#: main/main.c:359 #, c-format msgid " -F turn fsync off\n" msgstr " -F slå av fsync\n" -#: main/main.c:320 +#: main/main.c:360 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h VÄRDNAMN värdnamn eller IP-adress att lyssna på\n" -#: main/main.c:321 +#: main/main.c:361 #, c-format msgid " -i enable TCP/IP connections\n" msgstr " -i tillåt TCP/IP-uppkopplingar\n" -#: main/main.c:322 +#: main/main.c:362 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k KATALOG plats för unix-domän-uttag (socket)\n" -#: main/main.c:324 +#: main/main.c:364 #, c-format msgid " -l enable SSL connections\n" msgstr " -l tillåt SSL-anslutningar\n" -#: main/main.c:326 +#: main/main.c:366 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N MAX-ANSLUT maximalt antal tillåtna anslutningar\n" -#: main/main.c:327 -#, c-format -msgid " -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n" -msgstr " -o FLAGGOR skicka \"FLAGGOR\" till varje serverprocess (obsolet)\n" - -#: main/main.c:328 +#: main/main.c:367 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT portnummer att lyssna på\n" -#: main/main.c:329 +#: main/main.c:368 #, c-format msgid " -s show statistics after each query\n" msgstr " -s visa statistik efter varje fråga\n" -#: main/main.c:330 +#: main/main.c:369 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S WORK-MEM ställ in mängden minne för sorteringar (i kB)\n" -#: main/main.c:331 +#: main/main.c:370 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: main/main.c:332 +#: main/main.c:371 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NAMN=VÄRDE sätt parameter (som används under körning)\n" -#: main/main.c:333 +#: main/main.c:372 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config beskriv konfigurationsparametrar, avsluta sedan\n" -#: main/main.c:334 +#: main/main.c:373 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: main/main.c:336 +#: main/main.c:375 #, c-format msgid "" "\n" @@ -14468,42 +15655,42 @@ msgstr "" "\n" "Utvecklarflaggor:\n" -#: main/main.c:337 +#: main/main.c:376 #, c-format msgid " -f s|i|n|m|h forbid use of some plan types\n" msgstr " -f s|i|n|m|h förbjud användning av vissa plan-typer\n" -#: main/main.c:338 +#: main/main.c:377 #, c-format msgid " -n do not reinitialize shared memory after abnormal exit\n" msgstr " -n initiera inte delat minne på nytt efter onormal avstängning\n" -#: main/main.c:339 +#: main/main.c:378 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O tillåt strukturändring av systemtabeller\n" -#: main/main.c:340 +#: main/main.c:379 #, c-format msgid " -P disable system indexes\n" msgstr " -P stäng av systemindex\n" -#: main/main.c:341 +#: main/main.c:380 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex visa tidtagning efter varje fråga\n" -#: main/main.c:342 +#: main/main.c:381 #, c-format msgid " -T send SIGSTOP to all backend processes if one dies\n" msgstr " -T skicka SIGSTOP till alla serverprocesser om en dör\n" -#: main/main.c:343 +#: main/main.c:382 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr " -W NUM vänta NUM sekunder för att tillåta att en debugger kopplas in\n" -#: main/main.c:345 +#: main/main.c:384 #, c-format msgid "" "\n" @@ -14512,37 +15699,37 @@ msgstr "" "\n" "Flaggor för enanvändarläge:\n" -#: main/main.c:346 +#: main/main.c:385 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr " --single väljer enanvändarläge (måste vara första argumentet)\n" -#: main/main.c:347 +#: main/main.c:386 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAMN databasnamn (standard är användarnamnet)\n" -#: main/main.c:348 +#: main/main.c:387 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 överskugga debug-nivå\n" -#: main/main.c:349 +#: main/main.c:388 #, c-format msgid " -E echo statement before execution\n" msgstr " -E skriv ut sats före körning\n" -#: main/main.c:350 +#: main/main.c:389 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr " -j använd inte nyrad som en interaktiv frågeavskiljare\n" -#: main/main.c:351 main/main.c:356 +#: main/main.c:390 main/main.c:396 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr " -r FILNAMN skicka stdout och stderr till angiven fil\n" -#: main/main.c:353 +#: main/main.c:392 #, c-format msgid "" "\n" @@ -14551,22 +15738,23 @@ msgstr "" "\n" "Flaggor för bootstrap-läge:\n" -#: main/main.c:354 +#: main/main.c:393 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot väljer bootstrap-läge (måste vara första argumentet)\n" -#: main/main.c:355 +#: main/main.c:394 +#, fuzzy, c-format +#| msgid " --single selects single-user mode (must be first argument)\n" +msgid " --check selects check mode (must be first argument)\n" +msgstr " --single väljer enanvändarläge (måste vara första argumentet)\n" + +#: main/main.c:395 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr " DBNAMN databasnamn (krävs i bootstrap-läge)\n" -#: main/main.c:357 -#, c-format -msgid " -x NUM internal use\n" -msgstr " -x NUM intern användning\n" - -#: main/main.c:359 +#: main/main.c:398 #, c-format msgid "" "\n" @@ -14582,12 +15770,12 @@ msgstr "" "\n" "Rapportera buggar till <%s>.\n" -#: main/main.c:363 +#: main/main.c:402 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: main/main.c:374 +#: main/main.c:413 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -14600,12 +15788,12 @@ msgstr "" "ev. säkehetsproblem. Se dokumentationen för mer information om hur man\n" "startar servern på rätt sätt.\n" -#: main/main.c:391 +#: main/main.c:430 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: riktig och effektiv användar-ID måste matcha varandra\n" -#: main/main.c:398 +#: main/main.c:437 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -14630,20 +15818,31 @@ msgstr "utökningsbar nodtyp \"%s\" finns redan" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods \"%s\" har inte registerats" -#: nodes/nodeFuncs.c:122 nodes/nodeFuncs.c:153 parser/parse_coerce.c:2208 -#: parser/parse_coerce.c:2317 parser/parse_coerce.c:2352 -#: parser/parse_expr.c:2207 parser/parse_func.c:701 parser/parse_oper.c:967 -#: utils/fmgr/funcapi.c:528 +#: nodes/makefuncs.c:151 statistics/extended_stats.c:2283 +#, c-format +msgid "relation \"%s\" does not have a composite type" +msgstr "relationen \"%s\" har ingen composite-typ" + +#: nodes/makefuncs.c:905 +#, fuzzy, c-format +#| msgid "unrecognized encoding: \"%s\"" +msgid "unrecognized JSON encoding: %s" +msgstr "okänd kodning: \"%s\"" + +#: nodes/nodeFuncs.c:114 nodes/nodeFuncs.c:145 parser/parse_coerce.c:2567 +#: parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 +#: parser/parse_expr.c:2085 parser/parse_func.c:710 parser/parse_oper.c:883 +#: utils/fmgr/funcapi.c:627 #, c-format msgid "could not find array type for data type %s" msgstr "kunde inte hitta array-typ för datatyp %s" -#: nodes/params.c:359 +#: nodes/params.c:417 #, c-format msgid "portal \"%s\" with parameters: %s" msgstr "portal \"%s\" med parametrar: %s" -#: nodes/params.c:362 +#: nodes/params.c:420 #, c-format msgid "unnamed portal with parameters: %s" msgstr "ej namngiven portal med parametrar: %s" @@ -14654,308 +15853,316 @@ msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join con msgstr "FULL JOIN stöds bara med villkor som är merge-joinbara eller hash-joinbara" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1193 +#: optimizer/plan/initsplan.c:1192 #, c-format msgid "%s cannot be applied to the nullable side of an outer join" msgstr "%s kan inte appliceras på den nullbara sidan av en outer join" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1922 parser/analyze.c:1639 parser/analyze.c:1855 -#: parser/analyze.c:2715 +#: optimizer/plan/planner.c:1341 parser/analyze.c:1714 parser/analyze.c:1970 +#: parser/analyze.c:3152 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s tillåẗs inte med UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:2509 optimizer/plan/planner.c:4162 +#: optimizer/plan/planner.c:2048 optimizer/plan/planner.c:3704 #, c-format msgid "could not implement GROUP BY" msgstr "kunde inte implementera GROUP BY" -#: optimizer/plan/planner.c:2510 optimizer/plan/planner.c:4163 -#: optimizer/plan/planner.c:4890 optimizer/prep/prepunion.c:1045 +#: optimizer/plan/planner.c:2049 optimizer/plan/planner.c:3705 +#: optimizer/plan/planner.c:4348 optimizer/prep/prepunion.c:1046 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "Några av datatyperna stöder bara hash:ning medan andra bara stöder sortering." -#: optimizer/plan/planner.c:4889 +#: optimizer/plan/planner.c:4347 #, c-format msgid "could not implement DISTINCT" msgstr "kunde inte implementera DISTINCT" -#: optimizer/plan/planner.c:5737 +#: optimizer/plan/planner.c:5468 #, c-format msgid "could not implement window PARTITION BY" msgstr "kunde inte implementera fönster-PARTITION BY" -#: optimizer/plan/planner.c:5738 +#: optimizer/plan/planner.c:5469 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Fönsterpartitioneringskolumner måsta ha en sorterbar datatyp." -#: optimizer/plan/planner.c:5742 +#: optimizer/plan/planner.c:5473 #, c-format msgid "could not implement window ORDER BY" msgstr "kunde inte implementera fönster-ORDER BY" -#: optimizer/plan/planner.c:5743 +#: optimizer/plan/planner.c:5474 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Fönsterordningskolumner måste ha en sorterbar datatyp." -#: optimizer/plan/setrefs.c:451 -#, c-format -msgid "too many range table entries" -msgstr "för många element i \"range table\"" - -#: optimizer/prep/prepunion.c:508 +#: optimizer/prep/prepunion.c:509 #, c-format msgid "could not implement recursive UNION" msgstr "kunde inte implementera rekursiv UNION" -#: optimizer/prep/prepunion.c:509 +#: optimizer/prep/prepunion.c:510 #, c-format msgid "All column datatypes must be hashable." msgstr "Alla kolumndatatyper måsta vara hash-bara." #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1044 +#: optimizer/prep/prepunion.c:1045 #, c-format msgid "could not implement %s" msgstr "kunde inte implementera %s" -#: optimizer/util/clauses.c:4747 +#: optimizer/util/clauses.c:4854 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "SQL-funktion \"%s\" vid inline:ing" -#: optimizer/util/plancat.c:132 +#: optimizer/util/plancat.c:133 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "kan inte accessa temporära eller ologgade relationer under återställning" -#: optimizer/util/plancat.c:662 +#: optimizer/util/plancat.c:673 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "inferens av unikt index för hel rad stöds inte" -#: optimizer/util/plancat.c:679 +#: optimizer/util/plancat.c:690 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "villkor för ON CONFLICT-klausul har inget associerat index" -#: optimizer/util/plancat.c:729 +#: optimizer/util/plancat.c:740 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATE stöds inte med uteslutningsvillkor" -#: optimizer/util/plancat.c:834 +#: optimizer/util/plancat.c:845 #, c-format msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "finns inget unik eller uteslutningsvillkor som matchar ON CONFLICT-specifikationen" -#: parser/analyze.c:705 parser/analyze.c:1401 +#: parser/analyze.c:780 parser/analyze.c:1494 #, c-format msgid "VALUES lists must all be the same length" msgstr "VÄRDE-listor måste alla ha samma längd" -#: parser/analyze.c:904 +#: parser/analyze.c:981 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT har fler uttryck än målkolumner" -#: parser/analyze.c:922 +#: parser/analyze.c:999 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT har fler målkolumner än uttryck" -#: parser/analyze.c:926 +#: parser/analyze.c:1003 #, c-format msgid "The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?" msgstr "Imatningskällan är ett raduttryck som innehåller samma antal kolumner som INSERT:en förväntade sig. Glömde du använda extra parenteser?" -#: parser/analyze.c:1210 parser/analyze.c:1612 +#: parser/analyze.c:1302 parser/analyze.c:1687 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "SELECT ... INTO tillåts inte här" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1542 parser/analyze.c:2894 +#: parser/analyze.c:1617 parser/analyze.c:3346 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s kan inte appliceras på VÄRDEN" -#: parser/analyze.c:1777 +#: parser/analyze.c:1853 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "ogiltig UNION/INTERSECT/EXCEPT ORDER BY-klausul" -#: parser/analyze.c:1778 +#: parser/analyze.c:1854 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "Bara kolumnnamn i resultatet kan användas, inte uttryck eller funktioner." -#: parser/analyze.c:1779 +#: parser/analyze.c:1855 #, c-format msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." msgstr "Lägg till uttrycket/funktionen till varje SELECT eller flytta UNION:en in i en FROM-klausul." -#: parser/analyze.c:1845 +#: parser/analyze.c:1960 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTO tillåts bara i den första SELECT i UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:1917 +#: parser/analyze.c:2032 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "UNION/INTERSECT/EXCEPT-medlemssats kan inte referera till andra relationer på samma frågenivå" -#: parser/analyze.c:2004 +#: parser/analyze.c:2119 #, c-format msgid "each %s query must have the same number of columns" msgstr "varje %s-fråga måste ha samma antal kolumner" -#: parser/analyze.c:2426 +#: parser/analyze.c:2523 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNING måste ha minst en kolumn" -#: parser/analyze.c:2467 +#: parser/analyze.c:2626 +#, c-format +msgid "assignment source returned %d column" +msgid_plural "assignment source returned %d columns" +msgstr[0] "tilldelningskälla returnerade %d kolumn" +msgstr[1] "tilldelningskälla returnerade %d kolumner" + +#: parser/analyze.c:2687 +#, c-format +msgid "variable \"%s\" is of type %s but expression is of type %s" +msgstr "variabeln \"%s\" har typ %s men uttrycket har typ %s" + +#. translator: %s is a SQL keyword +#: parser/analyze.c:2811 parser/analyze.c:2819 #, c-format -msgid "cannot specify both SCROLL and NO SCROLL" -msgstr "kan inte ange både SCROLL och NO SCROLL" +msgid "cannot specify both %s and %s" +msgstr "kan inte ange både %s och %s" -#: parser/analyze.c:2486 +#: parser/analyze.c:2839 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR får inte innehålla datamodifierande satser i WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2494 +#: parser/analyze.c:2847 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s stöds inte" -#: parser/analyze.c:2497 +#: parser/analyze.c:2850 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "Hållbara markörer måste vara READ ONLY." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2505 +#: parser/analyze.c:2858 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %s stöds inte" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2516 +#: parser/analyze.c:2869 #, c-format -msgid "DECLARE INSENSITIVE CURSOR ... %s is not supported" -msgstr "DECLARE INSENSITIVE CURSOR ... %s stöds inte" +msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" +msgstr "DECLARE INSENSITIVE CURSOR ... %s är inte giltig" -#: parser/analyze.c:2519 +#: parser/analyze.c:2872 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Okänsliga markörer måste vara READ ONLY." -#: parser/analyze.c:2585 +#: parser/analyze.c:2938 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "materialiserade vyer får inte innehålla datamodifierande satser i WITH" -#: parser/analyze.c:2595 +#: parser/analyze.c:2948 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "materialiserade vyer får inte använda temporära tabeller eller vyer" -#: parser/analyze.c:2605 +#: parser/analyze.c:2958 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "materialiserade vyer kan inte defineras med bundna parametrar" -#: parser/analyze.c:2617 +#: parser/analyze.c:2970 #, c-format msgid "materialized views cannot be unlogged" msgstr "materialiserad vyer kan inte vara ologgade" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2722 +#: parser/analyze.c:3159 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "%s tillåts inte med DISTINCT-klausul" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2729 +#: parser/analyze.c:3166 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "%s tillåts inte med GROUP BY-klausul" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2736 +#: parser/analyze.c:3173 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "%s tillåts inte med HAVING-klausul" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2743 +#: parser/analyze.c:3180 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "%s tillåts inte med aggregatfunktioner" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2750 +#: parser/analyze.c:3187 #, c-format msgid "%s is not allowed with window functions" msgstr "%s tillåts inte med fönsterfunktioner" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2757 +#: parser/analyze.c:3194 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "%s tillåts inte med mängdreturnerande funktioner i mållistan" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2836 +#: parser/analyze.c:3286 #, c-format msgid "%s must specify unqualified relation names" msgstr "%s: måste ange okvalificerade relationsnamn" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2867 +#: parser/analyze.c:3319 #, c-format msgid "%s cannot be applied to a join" msgstr "%s kan inte appliceras på en join" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2876 +#: parser/analyze.c:3328 #, c-format msgid "%s cannot be applied to a function" msgstr "%s kan inte appliceras på en funktion" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2885 +#: parser/analyze.c:3337 #, c-format msgid "%s cannot be applied to a table function" msgstr "%s kan inte appliceras på tabellfunktion" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2903 +#: parser/analyze.c:3355 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%s kan inte appliceras på en WITH-fråga" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2912 +#: parser/analyze.c:3364 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s kan inte appliceras på en namngiven tupellagring" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2932 +#: parser/analyze.c:3384 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "relationen \"%s\" i %s-klausul hittades inte i FROM-klausul" -#: parser/parse_agg.c:220 parser/parse_oper.c:222 +#: parser/parse_agg.c:220 parser/parse_oper.c:227 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "kunde inte identifiera en jämförelseoperator för typ %s" @@ -15026,1407 +16233,1733 @@ msgstr "aggregatfunktioner tillåts inte i fönster-GROUPS" msgid "grouping operations are not allowed in window GROUPS" msgstr "grupperingsfunktioner tillåts inte i fönster-GROUPS" -#: parser/parse_agg.c:460 +#: parser/parse_agg.c:439 +#, fuzzy +#| msgid "aggregate functions are not allowed in trigger WHEN conditions" +msgid "aggregate functions are not allowed in MERGE WHEN conditions" +msgstr "aggregatfunktioner tillåts inte i WHEN-utlösarvillkor" + +#: parser/parse_agg.c:441 +#, fuzzy +#| msgid "grouping operations are not allowed in trigger WHEN conditions" +msgid "grouping operations are not allowed in MERGE WHEN conditions" +msgstr "gruppoperationer tillåts inte i WHEN-utlösarvillkor" + +#: parser/parse_agg.c:467 msgid "aggregate functions are not allowed in check constraints" msgstr "aggregatfunktioner tillåts inte i check-villkor" -#: parser/parse_agg.c:462 +#: parser/parse_agg.c:469 msgid "grouping operations are not allowed in check constraints" msgstr "gruppoperationer tillåts inte i check-villkor" -#: parser/parse_agg.c:469 +#: parser/parse_agg.c:476 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "aggregatfunktioner tillåts inte i DEFAULT-uttryck" -#: parser/parse_agg.c:471 +#: parser/parse_agg.c:478 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "grupperingsoperationer tillåts inte i DEFAULT-uttryck" -#: parser/parse_agg.c:476 +#: parser/parse_agg.c:483 msgid "aggregate functions are not allowed in index expressions" msgstr "aggregatfunktioner tillåts inte i indexuttryck" -#: parser/parse_agg.c:478 +#: parser/parse_agg.c:485 msgid "grouping operations are not allowed in index expressions" msgstr "gruppoperationer tillåts inte i indexuttryck" -#: parser/parse_agg.c:483 +#: parser/parse_agg.c:490 msgid "aggregate functions are not allowed in index predicates" msgstr "aggregatfunktionsanrop tillåts inte i indexpredikat" -#: parser/parse_agg.c:485 +#: parser/parse_agg.c:492 msgid "grouping operations are not allowed in index predicates" msgstr "gruppoperationer tillåts inte i indexpredikat" -#: parser/parse_agg.c:490 +#: parser/parse_agg.c:497 +msgid "aggregate functions are not allowed in statistics expressions" +msgstr "aggregatfunktioner tillåts inte i statistikuttryck" + +#: parser/parse_agg.c:499 +msgid "grouping operations are not allowed in statistics expressions" +msgstr "gruppoperationer tillåts inte i statistikuttryck" + +#: parser/parse_agg.c:504 msgid "aggregate functions are not allowed in transform expressions" msgstr "aggregatfunktioner tillåts inte i transform-uttryck" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:506 msgid "grouping operations are not allowed in transform expressions" msgstr "gruppoperationer tillåts inte i transforme-uttryck" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:511 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "aggregatfunktioner tillåts inte i EXECUTE-parametrar" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:513 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "gruppoperationer tillåts inte i EXECUTE-parametrar" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:518 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "aggregatfunktioner tillåts inte i WHEN-utlösarvillkor" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:520 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "gruppoperationer tillåts inte i WHEN-utlösarvillkor" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:525 msgid "aggregate functions are not allowed in partition bound" msgstr "aggregatfunktioner tillåts inte i partitionsgräns" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:527 msgid "grouping operations are not allowed in partition bound" msgstr "gruppoperationer tillåts inte i partitionsgräns" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:532 msgid "aggregate functions are not allowed in partition key expressions" msgstr "aggregatfunktioner tillåts inte i partitionsnyckeluttryck" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:534 msgid "grouping operations are not allowed in partition key expressions" msgstr "gruppoperationer tillåts inte i partitionsnyckeluttryck" -#: parser/parse_agg.c:526 +#: parser/parse_agg.c:540 msgid "aggregate functions are not allowed in column generation expressions" msgstr "aggregatfunktioner tillåts inte i kolumngenereringsuttryck" -#: parser/parse_agg.c:528 +#: parser/parse_agg.c:542 msgid "grouping operations are not allowed in column generation expressions" msgstr "gruppoperationer tillåts inte i kolumngenereringsuttryck" -#: parser/parse_agg.c:534 +#: parser/parse_agg.c:548 msgid "aggregate functions are not allowed in CALL arguments" msgstr "aggregatfunktioner tillåts inte i CALL-argument" -#: parser/parse_agg.c:536 +#: parser/parse_agg.c:550 msgid "grouping operations are not allowed in CALL arguments" msgstr "gruppoperationer tillåts inte i CALL-argument" -#: parser/parse_agg.c:542 +#: parser/parse_agg.c:556 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "aggregatfunktioner tillåts inte i COPY FROM WHERE-villkor" -#: parser/parse_agg.c:544 +#: parser/parse_agg.c:558 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "gruppoperationer tillåts inte i COPY FROM WHERE-villkor" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:567 parser/parse_clause.c:1828 +#: parser/parse_agg.c:585 parser/parse_clause.c:1852 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "aggregatfunktioner tillåts inte i %s" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:570 +#: parser/parse_agg.c:588 #, c-format msgid "grouping operations are not allowed in %s" msgstr "gruppoperationer tillåts inte i %s" -#: parser/parse_agg.c:678 +#: parser/parse_agg.c:689 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" msgstr "yttre aggregat kan inte innehålla inre variabel i sitt direkta argument" -#: parser/parse_agg.c:757 +#: parser/parse_agg.c:768 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "aggregatfunktionsanrop kan inte innehålla mängdreturnerande funktionsanrop" -#: parser/parse_agg.c:758 parser/parse_expr.c:1845 parser/parse_expr.c:2332 -#: parser/parse_func.c:872 +#: parser/parse_agg.c:769 parser/parse_expr.c:1736 parser/parse_expr.c:2210 +#: parser/parse_func.c:883 #, c-format msgid "You might be able to move the set-returning function into a LATERAL FROM item." msgstr "Du kanske kan flytta den mängdreturnerande funktionen in i en LATERAL FROM-konstruktion." -#: parser/parse_agg.c:763 +#: parser/parse_agg.c:774 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "aggregatfunktionsanrop kan inte innehålla fönsterfunktionanrop" -#: parser/parse_agg.c:842 +#: parser/parse_agg.c:853 msgid "window functions are not allowed in JOIN conditions" msgstr "fönsterfunktioner tillåts inte i JOIN-villkor" -#: parser/parse_agg.c:849 +#: parser/parse_agg.c:860 msgid "window functions are not allowed in functions in FROM" msgstr "fönsterfunktioner tillåts inte i funktioner i FROM" -#: parser/parse_agg.c:855 +#: parser/parse_agg.c:866 msgid "window functions are not allowed in policy expressions" msgstr "fönsterfunktioner tillåts inte i policy-uttryck" -#: parser/parse_agg.c:868 +#: parser/parse_agg.c:879 msgid "window functions are not allowed in window definitions" msgstr "fönsterfunktioner tillåts inte i fönsterdefinitioner" -#: parser/parse_agg.c:900 +#: parser/parse_agg.c:890 +#, fuzzy +#| msgid "window functions are not allowed in trigger WHEN conditions" +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "fönsterfunktioner tillåts inte i WHEN-utlösarvillkor" + +#: parser/parse_agg.c:914 msgid "window functions are not allowed in check constraints" msgstr "fönsterfunktioner tillåts inte i check-villkor" -#: parser/parse_agg.c:904 +#: parser/parse_agg.c:918 msgid "window functions are not allowed in DEFAULT expressions" msgstr "fönsterfunktioner tillåts inte i DEFAULT-uttryck" -#: parser/parse_agg.c:907 +#: parser/parse_agg.c:921 msgid "window functions are not allowed in index expressions" msgstr "fönsterfunktioner tillåts inte i indexuttryck" -#: parser/parse_agg.c:910 +#: parser/parse_agg.c:924 +msgid "window functions are not allowed in statistics expressions" +msgstr "fönsterfunktioner tillåts inte i statistikuttryck" + +#: parser/parse_agg.c:927 msgid "window functions are not allowed in index predicates" msgstr "fönsterfunktioner tillåts inte i indexpredikat" -#: parser/parse_agg.c:913 +#: parser/parse_agg.c:930 msgid "window functions are not allowed in transform expressions" msgstr "fönsterfunktioner tillåts inte i transform-uttrycket" -#: parser/parse_agg.c:916 +#: parser/parse_agg.c:933 msgid "window functions are not allowed in EXECUTE parameters" msgstr "fönsterfunktioner tillåts inte i EXECUTE-parametrar" -#: parser/parse_agg.c:919 +#: parser/parse_agg.c:936 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "fönsterfunktioner tillåts inte i WHEN-utlösarvillkor" -#: parser/parse_agg.c:922 +#: parser/parse_agg.c:939 msgid "window functions are not allowed in partition bound" msgstr "fönsterfunktioner tillåts inte i partitiongräns" -#: parser/parse_agg.c:925 +#: parser/parse_agg.c:942 msgid "window functions are not allowed in partition key expressions" msgstr "fönsterfunktioner tillåts inte i partitionsnyckeluttryck" -#: parser/parse_agg.c:928 +#: parser/parse_agg.c:945 msgid "window functions are not allowed in CALL arguments" msgstr "fönsterfunktioner tillåts inte i CALL-argument" -#: parser/parse_agg.c:931 +#: parser/parse_agg.c:948 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "fönsterfunktioner tillåts inte i COPY FROM WHERE-villkor" -#: parser/parse_agg.c:934 +#: parser/parse_agg.c:951 msgid "window functions are not allowed in column generation expressions" msgstr "fönsterfunktioner tillåts inte i kolumngenereringsuttryck" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:954 parser/parse_clause.c:1837 +#: parser/parse_agg.c:974 parser/parse_clause.c:1861 #, c-format msgid "window functions are not allowed in %s" msgstr "fönsterfunktioner tillåts inte i %s" -#: parser/parse_agg.c:988 parser/parse_clause.c:2671 +#: parser/parse_agg.c:1008 parser/parse_clause.c:2694 #, c-format msgid "window \"%s\" does not exist" msgstr "fönster \"%s\" finns inte" -#: parser/parse_agg.c:1072 +#: parser/parse_agg.c:1092 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "för många grupperingsmängder (maximalt 4096)" -#: parser/parse_agg.c:1212 +#: parser/parse_agg.c:1232 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "aggregatfunktioner tillåts inte i en rekursiv frågas rekursiva term" -#: parser/parse_agg.c:1405 +#: parser/parse_agg.c:1425 #, c-format msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" msgstr "kolumn \"%s.%s\" måste stå med i GROUP BY-klausulen eller användas i en aggregatfunktion" -#: parser/parse_agg.c:1408 +#: parser/parse_agg.c:1428 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "Direkta argument till en sorterad-mängd-aggregat får bara använda grupperade kolumner." -#: parser/parse_agg.c:1413 +#: parser/parse_agg.c:1433 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "underfråga använder ogrupperad kolumn \"%s.%s\" från yttre fråga" -#: parser/parse_agg.c:1577 +#: parser/parse_agg.c:1597 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "argument till GROUPING måste vare grupputtryck på den tillhörande frågenivån" -#: parser/parse_clause.c:191 +#: parser/parse_clause.c:190 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "relationen \"%s\" kan inte vara målet för en modifierande sats" -#: parser/parse_clause.c:571 parser/parse_clause.c:599 parser/parse_func.c:2424 +#: parser/parse_clause.c:570 parser/parse_clause.c:598 parser/parse_func.c:2554 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "mängdreturnerande funktioner måste vara på toppnivå i FROM" -#: parser/parse_clause.c:611 +#: parser/parse_clause.c:610 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "multipla kolumndefinitionslistor tillåts inte i samma funktion" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:643 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "ROWS FROM() med multipla funktioner kan inte ha en kolumndefinitionslista" -#: parser/parse_clause.c:645 +#: parser/parse_clause.c:644 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "Lägg till en separat kolumndefinitionslista för varje funktion inne i ROWS FROM()." -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:650 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "UNNEST() med multipla argument kan inte ha en kolumndefinitionslista" -#: parser/parse_clause.c:652 +#: parser/parse_clause.c:651 #, c-format msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." msgstr "Använd separata UNNEST()-anrop inne i ROWS FROM() och koppla en kolumndefinitionslista till varje." -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:658 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY kan inte användas tillsammans med en kolumndefinitionslista" -#: parser/parse_clause.c:660 +#: parser/parse_clause.c:659 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "Placera kolumndefinitionslistan inne i ROWS FROM()." -#: parser/parse_clause.c:760 +#: parser/parse_clause.c:761 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "bara en FOR ORDINALITY-kolumn tillåts" -#: parser/parse_clause.c:821 +#: parser/parse_clause.c:822 parser/parse_jsontable.c:445 #, c-format msgid "column name \"%s\" is not unique" msgstr "kolumnnamn \"%s\" är inte unikt" -#: parser/parse_clause.c:863 +#: parser/parse_clause.c:864 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "namespace-namn \"%s\" är inte unikt" -#: parser/parse_clause.c:873 +#: parser/parse_clause.c:874 #, c-format msgid "only one default namespace is allowed" msgstr "bara ett standard-namespace tillåts" -#: parser/parse_clause.c:933 +#: parser/parse_clause.c:934 #, c-format msgid "tablesample method %s does not exist" msgstr "tabellsamplingsmetod \"%s\" existerar inte" -#: parser/parse_clause.c:955 +#: parser/parse_clause.c:956 #, c-format msgid "tablesample method %s requires %d argument, not %d" msgid_plural "tablesample method %s requires %d arguments, not %d" msgstr[0] "tabellsamplingsmetod %s kräver %d argument, inte %d" msgstr[1] "tabellsamplingsmetod %s kräver %d argument, inte %d" -#: parser/parse_clause.c:989 +#: parser/parse_clause.c:990 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "tabellsamplingsmetod %s stöder inte REPEATABLE" -#: parser/parse_clause.c:1135 +#: parser/parse_clause.c:1140 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "TABLESAMPLE-klausul kan bara appliceras på tabeller och materialiserade vyer" -#: parser/parse_clause.c:1318 +#: parser/parse_clause.c:1330 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "kolumnnamn \"%s\" angivet mer än en gång i USING-klausul" -#: parser/parse_clause.c:1333 +#: parser/parse_clause.c:1345 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "gemensamt kolumnnamn \"%s\" finns mer än en gång i vänstra tabellen" -#: parser/parse_clause.c:1342 +#: parser/parse_clause.c:1354 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "kolumn \"%s\" angiven i USING-klausul finns inte i den vänstra tabellen" -#: parser/parse_clause.c:1357 +#: parser/parse_clause.c:1369 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "gemensamt kolumnnamn \"%s\" finns mer än en gång i högra tabellen" -#: parser/parse_clause.c:1366 +#: parser/parse_clause.c:1378 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "kolumn \"%s\" angiven i USING-klausul finns inte i den högra tabellen" -#: parser/parse_clause.c:1447 +#: parser/parse_clause.c:1457 #, c-format msgid "column alias list for \"%s\" has too many entries" msgstr "kolumnaliaslista för \"%s\" har för många element" -#: parser/parse_clause.c:1773 +#: parser/parse_clause.c:1797 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" msgstr "radantal kan inte vara null i FETCH FIRST ... WITH TIES-klausul" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1798 +#: parser/parse_clause.c:1822 #, c-format msgid "argument of %s must not contain variables" msgstr "argumentet till %s får inte innehålla variabler" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1963 +#: parser/parse_clause.c:1987 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "%s \"%s\" är tvetydig" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1992 +#: parser/parse_clause.c:2015 #, c-format msgid "non-integer constant in %s" msgstr "ej heltalskonstant i %s" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2014 +#: parser/parse_clause.c:2037 #, c-format msgid "%s position %d is not in select list" msgstr "%s-position %d finns inte i select-listan" -#: parser/parse_clause.c:2453 +#: parser/parse_clause.c:2476 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE är begränsad till 12 element" -#: parser/parse_clause.c:2659 +#: parser/parse_clause.c:2682 #, c-format msgid "window \"%s\" is already defined" msgstr "fönster \"%s\" är redan definierad" -#: parser/parse_clause.c:2720 +#: parser/parse_clause.c:2743 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "kan inte övertrumfa PARTITION BY-klausul för fönster \"%s\"" -#: parser/parse_clause.c:2732 +#: parser/parse_clause.c:2755 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "kan inte övertrumfa ORDER BY-klausul för fönster \"%s\"" -#: parser/parse_clause.c:2762 parser/parse_clause.c:2768 +#: parser/parse_clause.c:2785 parser/parse_clause.c:2791 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "kan inte kopiera fönster \"%s\" då det har en fönsterramklausul" -#: parser/parse_clause.c:2770 +#: parser/parse_clause.c:2793 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Ta bort parenteserna i denna OVER-klausul." -#: parser/parse_clause.c:2790 +#: parser/parse_clause.c:2813 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "RANGE med offset PRECEDING/FOLLOWING kräver exakt en ORDER BY-kolumn" -#: parser/parse_clause.c:2813 +#: parser/parse_clause.c:2836 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "GROUPS-läge kräver en ORDER BY-klausul" -#: parser/parse_clause.c:2883 +#: parser/parse_clause.c:2906 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "i ett aggregat med DISTINCT så måste ORDER BY-uttryck finnas i argumentlistan" -#: parser/parse_clause.c:2884 +#: parser/parse_clause.c:2907 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "i SELECT DISTINCT så måste ORDER BY-uttryck finnas i select-listan" -#: parser/parse_clause.c:2916 +#: parser/parse_clause.c:2939 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "ett aggregat med DISTINCT måste ha minst ett argument" -#: parser/parse_clause.c:2917 +#: parser/parse_clause.c:2940 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT måste ha minst en kolumn" -#: parser/parse_clause.c:2983 parser/parse_clause.c:3015 +#: parser/parse_clause.c:3006 parser/parse_clause.c:3038 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "SELECT DISTINCT ON-uttrycken måste matcha de initiala ORDER BY-uttrycken" -#: parser/parse_clause.c:3093 +#: parser/parse_clause.c:3116 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC tillåts inte i ON CONFLICT-klausul" -#: parser/parse_clause.c:3099 +#: parser/parse_clause.c:3122 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST tillåts inte i ON CONFLICT-klausul" -#: parser/parse_clause.c:3178 +#: parser/parse_clause.c:3201 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE kräver inferensangivelse eller villkorsnamn" -#: parser/parse_clause.c:3179 +#: parser/parse_clause.c:3202 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Till exempel, ON CONFLICT (kolumnnamn)." -#: parser/parse_clause.c:3190 +#: parser/parse_clause.c:3213 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT stöds inte för systemkatalogtabeller" -#: parser/parse_clause.c:3198 +#: parser/parse_clause.c:3221 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT stöds inte på tabell \"%s\" som används som katalogtabell" -#: parser/parse_clause.c:3341 +#: parser/parse_clause.c:3351 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "operator %s är inte en giltig sorteringsoperator" -#: parser/parse_clause.c:3343 +#: parser/parse_clause.c:3353 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "Sorteringsoperationer måste vara \"<\"- eller \">\"-medlemmar i btree-operatorfamiljer." -#: parser/parse_clause.c:3654 +#: parser/parse_clause.c:3664 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "RANGE med offset PRECEDING/FOLLOWING stöds inte för kolumntyp %s" -#: parser/parse_clause.c:3660 +#: parser/parse_clause.c:3670 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" msgstr "RANGE med offset PRECEDING/FOLLOWING stöd inte av kolumntyp %s och offset-typ %s" -#: parser/parse_clause.c:3663 +#: parser/parse_clause.c:3673 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Typomvandla offset-värdet till lämplig typ." -#: parser/parse_clause.c:3668 +#: parser/parse_clause.c:3678 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" msgstr "RANGE med offset PRECEDING/FOLLOWING har multipla tolkingar för kolumntyp %s och offset-typ %s" -#: parser/parse_clause.c:3671 +#: parser/parse_clause.c:3681 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "Typomvandla offset-värdet till exakt den önskade typen." -#: parser/parse_coerce.c:1024 parser/parse_coerce.c:1062 -#: parser/parse_coerce.c:1080 parser/parse_coerce.c:1095 -#: parser/parse_expr.c:2241 parser/parse_expr.c:2819 parser/parse_target.c:967 +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 +#: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 +#: parser/parse_expr.c:2119 parser/parse_expr.c:2713 parser/parse_expr.c:3370 +#: parser/parse_expr.c:3603 parser/parse_expr.c:4439 parser/parse_target.c:994 #, c-format msgid "cannot cast type %s to %s" msgstr "kan inte omvandla typ %s till %s" -#: parser/parse_coerce.c:1065 +#: parser/parse_coerce.c:1091 #, c-format msgid "Input has too few columns." msgstr "Indata har för få kolumner" -#: parser/parse_coerce.c:1083 +#: parser/parse_coerce.c:1109 #, c-format msgid "Cannot cast type %s to %s in column %d." msgstr "Kan inte typomvandla typ %s till %s i kolumn %d." -#: parser/parse_coerce.c:1098 +#: parser/parse_coerce.c:1124 #, c-format msgid "Input has too many columns." msgstr "Indata har för många kolumner" #. translator: first %s is name of a SQL construct, eg WHERE #. translator: first %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1153 parser/parse_coerce.c:1201 +#: parser/parse_coerce.c:1179 parser/parse_coerce.c:1227 #, c-format msgid "argument of %s must be type %s, not type %s" msgstr "argumentet till %s måste vara av typ %s, inte av typ %s" #. translator: %s is name of a SQL construct, eg WHERE #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1164 parser/parse_coerce.c:1213 +#: parser/parse_coerce.c:1190 parser/parse_coerce.c:1239 #, c-format msgid "argument of %s must not return a set" msgstr "argumentet till %s får inte returnera en mängd" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1353 +#: parser/parse_coerce.c:1383 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "%s typer %s och %s matchar inte" -#: parser/parse_coerce.c:1465 +#: parser/parse_coerce.c:1499 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "argumenttyperna %s och %s matchar inte" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1517 +#: parser/parse_coerce.c:1551 #, c-format msgid "%s could not convert type %s to %s" msgstr "%s kan inte konvertera typ %s till %s" -#: parser/parse_coerce.c:1934 -#, c-format -msgid "arguments declared \"anyelement\" are not all alike" -msgstr "argument deklarerade som \"anyelement\" är inte alla likadana" - -#: parser/parse_coerce.c:1954 -#, c-format -msgid "arguments declared \"anyarray\" are not all alike" -msgstr "argument deklarerade \"anyarray\" är inte alla likadana" - -#: parser/parse_coerce.c:1974 +#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 +#: parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 +#: parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 #, c-format -msgid "arguments declared \"anyrange\" are not all alike" -msgstr "argument deklarerade \"anyrange\" är inte alla likadana" +msgid "arguments declared \"%s\" are not all alike" +msgstr "argument deklarerade \"%s\" är inte alla likadana" -#: parser/parse_coerce.c:2008 parser/parse_coerce.c:2088 -#: utils/fmgr/funcapi.c:487 +#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 +#: utils/fmgr/funcapi.c:558 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "argumentet deklarerad %s är inte en array utan typ %s" -#: parser/parse_coerce.c:2029 -#, c-format -msgid "arguments declared \"anycompatiblerange\" are not all alike" -msgstr "argument deklarerade \"anycompatiblerange\" är inte alla likadana" - -#: parser/parse_coerce.c:2041 parser/parse_coerce.c:2122 -#: utils/fmgr/funcapi.c:501 +#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 +#: utils/fmgr/funcapi.c:572 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "argumentet deklarerad %s är inte en intervalltyp utan typ %s" -#: parser/parse_coerce.c:2079 +#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 +#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:590 utils/fmgr/funcapi.c:655 +#, c-format +msgid "argument declared %s is not a multirange type but type %s" +msgstr "argumentet deklarerad %s är inte en multirange-typ utan typ %s" + +#: parser/parse_coerce.c:2353 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "kan inte bestämma elementtypen av \"anyarray\"-argument" -#: parser/parse_coerce.c:2105 parser/parse_coerce.c:2139 +#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 +#: parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "argument deklarerad %s är inte konsistent med argument deklarerad %s" -#: parser/parse_coerce.c:2163 +#: parser/parse_coerce.c:2474 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "kunde inte bestämma en polymorf typ då indata har typ %s" -#: parser/parse_coerce.c:2177 +#: parser/parse_coerce.c:2488 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "typen som matchar anynonarray är en array-typ: %s" -#: parser/parse_coerce.c:2187 +#: parser/parse_coerce.c:2498 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "typen som matchar anyenum är inte en enum-typ: %s" -#: parser/parse_coerce.c:2218 parser/parse_coerce.c:2267 -#: parser/parse_coerce.c:2329 parser/parse_coerce.c:2365 +#: parser/parse_coerce.c:2559 +#, c-format +msgid "arguments of anycompatible family cannot be cast to a common type" +msgstr "argument till en anycompatible-familj kan inte typomvandlas till en vanlig typ" + +#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 +#: parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 +#: parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "kunde inte bestämma en polymorf typ %s då indata har typ %s" -#: parser/parse_coerce.c:2228 +#: parser/parse_coerce.c:2587 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "anycompatiblerange-typ %s matchar inte anycompatiblerange-typ %s" -#: parser/parse_coerce.c:2242 +#: parser/parse_coerce.c:2608 +#, c-format +msgid "anycompatiblemultirange type %s does not match anycompatible type %s" +msgstr "anycompatiblemultirange-typ %s matchar inte anycompatible-typ %s" + +#: parser/parse_coerce.c:2622 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "typen som matchar anycompatiblenonarray är en array-typ: %s" -#: parser/parse_coerce.c:2433 +#: parser/parse_coerce.c:2857 +#, c-format +msgid "A result of type %s requires at least one input of type anyrange or anymultirange." +msgstr "Ett resultat av typen %s kräver minst en indata med typen anyrange eller anymultirange." + +#: parser/parse_coerce.c:2874 #, c-format -msgid "A result of type %s requires at least one input of type %s." -msgstr "Ett resultat av typen %s kräver minst en indata med typ %s." +msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." +msgstr "Ett resultat av typ %s kräver minst en indata av typen anycompatiblerange eller anycompatiblemultirange." -#: parser/parse_coerce.c:2445 +#: parser/parse_coerce.c:2886 #, c-format -msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, or anyrange." -msgstr "Ett resultat av typ %s kräver minst en indata av typen anyelement, anyarray, anynonarray, anyenum eller anyrange." +msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." +msgstr "Ett resultat av typ %s kräver minst en indata av typen anyelement, anyarray, anynonarray, anyenum, anyrange eller anymultirange." -#: parser/parse_coerce.c:2457 +#: parser/parse_coerce.c:2898 #, c-format -msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, or anycompatiblerange." -msgstr "Ett resultat av typ %s kräver minst en indata av typ anycompatible, anycompatiblearray, anycompatiblenonarray eller anycompatiblerange." +msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." +msgstr "Ett resultat av typ %s kräver minst en indata av typ anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange eller anycompatiblemultirange." -#: parser/parse_coerce.c:2487 +#: parser/parse_coerce.c:2928 msgid "A result of type internal requires at least one input of type internal." msgstr "Ett resultat av typ internal kräver minst en indata av typ internal." #: parser/parse_collate.c:228 parser/parse_collate.c:475 -#: parser/parse_collate.c:981 +#: parser/parse_collate.c:1012 #, c-format msgid "collation mismatch between implicit collations \"%s\" and \"%s\"" msgstr "jämförelser (collation) matchar inte mellan implicita jämförelser \"%s\" och \"%s\"" #: parser/parse_collate.c:231 parser/parse_collate.c:478 -#: parser/parse_collate.c:984 +#: parser/parse_collate.c:1015 #, c-format msgid "You can choose the collation by applying the COLLATE clause to one or both expressions." msgstr "Du kan välja jämförelse genom att applicera en COLLATE-klausul till ett eller båda uttrycken." -#: parser/parse_collate.c:831 +#: parser/parse_collate.c:862 #, c-format msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" msgstr "jämförelser (collation) matchar inte mellan explicita jämförelser \"%s\" och \"%s\"" -#: parser/parse_cte.c:42 +#: parser/parse_cte.c:46 #, c-format msgid "recursive reference to query \"%s\" must not appear within its non-recursive term" msgstr "rekursiv referens till fråga \"%s\" får inte finnas inom dess ickerekursiva term" -#: parser/parse_cte.c:44 +#: parser/parse_cte.c:48 #, c-format msgid "recursive reference to query \"%s\" must not appear within a subquery" msgstr "rekursiv referens till fråga \"%s\" får inte finnas i en subfråga" -#: parser/parse_cte.c:46 +#: parser/parse_cte.c:50 #, c-format msgid "recursive reference to query \"%s\" must not appear within an outer join" msgstr "rekursiv referens till fråga \"%s\" får inte finnas i en outer join" -#: parser/parse_cte.c:48 +#: parser/parse_cte.c:52 #, c-format msgid "recursive reference to query \"%s\" must not appear within INTERSECT" msgstr "rekursiv referens till fråga \"%s\" får inte finnas i en INTERSECT" -#: parser/parse_cte.c:50 +#: parser/parse_cte.c:54 #, c-format msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "rekursiv referens till fråga \"%s\" får inte finnas i en EXCEPT" -#: parser/parse_cte.c:132 +#: parser/parse_cte.c:136 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "WITH-frågenamn \"%s\" angivet mer än en gång" -#: parser/parse_cte.c:264 +#: parser/parse_cte.c:268 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "WITH-klausul som innehåller en datamodifierande sats måste vara på toppnivå" -#: parser/parse_cte.c:313 +#: parser/parse_cte.c:317 #, c-format msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" msgstr "rekursiv fråga \"%s\" kolumn %d har typ %s i den ickerekursiva termen med typ %s totalt sett" -#: parser/parse_cte.c:319 +#: parser/parse_cte.c:323 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Typomvandla utdatan för den ickerekursiva termen till korrekt typ." -#: parser/parse_cte.c:324 +#: parser/parse_cte.c:328 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" msgstr "rekursiv fråga \"%s\" kolumn %d har jämförelse (collation) \"%s\" i en icke-rekursiv term men jämförelse \"%s\" totalt sett" -#: parser/parse_cte.c:328 +#: parser/parse_cte.c:332 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "Använd en COLLATE-klausul för att sätta jämförelse för den icke-rekursiva termen." -#: parser/parse_cte.c:418 +#: parser/parse_cte.c:350 +#, c-format +msgid "WITH query is not recursive" +msgstr "WITH-fråga är inte rekursiv" + +#: parser/parse_cte.c:381 +#, c-format +msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" +msgstr "med en SEARCH- eller CYCLE-klausul så måste vänstersidan av en UNION vara en SELECT" + +#: parser/parse_cte.c:386 +#, c-format +msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" +msgstr "med en SEARCH- eller CYCLE-klausul så måste högersidan av en UNION vara en SELECT" + +#: parser/parse_cte.c:401 +#, c-format +msgid "search column \"%s\" not in WITH query column list" +msgstr "sökkolumn \"%s\" finns inte med i kolumnlistan för WITH-fråga" + +#: parser/parse_cte.c:408 +#, c-format +msgid "search column \"%s\" specified more than once" +msgstr "sökkolumn \"%s\" angiven mer än en gång" + +#: parser/parse_cte.c:417 +#, c-format +msgid "search sequence column name \"%s\" already used in WITH query column list" +msgstr "namn på söksekvensenskolumn \"%s\" används redan i kolumnlistan till WITH-fråga" + +#: parser/parse_cte.c:436 +#, c-format +msgid "cycle column \"%s\" not in WITH query column list" +msgstr "cycle-kolumn \"%s\" finns inte i kolumnlistan i WITH-fråga" + +#: parser/parse_cte.c:443 +#, c-format +msgid "cycle column \"%s\" specified more than once" +msgstr "cycle-kolumn \"%s\" angiven mer än en gång" + +#: parser/parse_cte.c:452 +#, c-format +msgid "cycle mark column name \"%s\" already used in WITH query column list" +msgstr "mark-kolumnnamn \"%s\" för cycle används redan i kolumnlistan i WITH-fråga" + +#: parser/parse_cte.c:464 +#, c-format +msgid "cycle path column name \"%s\" already used in WITH query column list" +msgstr "path-kolumnnamn \"%s\" för cycle används redan i kolumnlistan i WITH-fråga" + +#: parser/parse_cte.c:472 +#, c-format +msgid "cycle mark column name and cycle path column name are the same" +msgstr "mark-kolumnnamn och path-kolumnnamn i cycle är båda samma" + +#: parser/parse_cte.c:508 +#, c-format +msgid "could not identify an inequality operator for type %s" +msgstr "kunde inte hitta en olikhetsoperator för typ %s" + +#: parser/parse_cte.c:520 +#, c-format +msgid "search sequence column name and cycle mark column name are the same" +msgstr "namn på söksekvenskolumn och namn på mark-kolumn i cycle är båda samma" + +#: parser/parse_cte.c:527 +#, c-format +msgid "search sequence column name and cycle path column name are the same" +msgstr "namn på söksekvenskolumn och namn på path-kolumn i cycle är båda samma" + +#: parser/parse_cte.c:611 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "WITH-fråga \"%s\" har %d kolumner tillgängliga men %d kolumner angivna" -#: parser/parse_cte.c:598 +#: parser/parse_cte.c:791 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "ömsesidig rekursion mellan WITH-poster är inte implementerat" -#: parser/parse_cte.c:650 +#: parser/parse_cte.c:843 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "rekursiv fråga \"%s\" får inte innehålla datamodifierande satser" -#: parser/parse_cte.c:658 +#: parser/parse_cte.c:851 #, c-format msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" msgstr "rekursiv fråga \"%s\" är inte på formen icke-rekursiv-term UNION [ALL] rekursiv-term" -#: parser/parse_cte.c:702 +#: parser/parse_cte.c:895 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY i en rekursiv fråga är inte implementerat" -#: parser/parse_cte.c:708 +#: parser/parse_cte.c:901 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET i en rekursiv fråga är inte implementerat" -#: parser/parse_cte.c:714 +#: parser/parse_cte.c:907 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT i en rekursiv fråga är inte implementerat" -#: parser/parse_cte.c:720 +#: parser/parse_cte.c:913 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE i en rekursiv fråga är inte implementerat" -#: parser/parse_cte.c:777 +#: parser/parse_cte.c:970 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "rekursiv referens till fråga \"%s\" får inte finnas med mer än en gång" -#: parser/parse_expr.c:349 +#: parser/parse_expr.c:300 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT tillåts inte i detta kontext" -#: parser/parse_expr.c:402 parser/parse_relation.c:3506 -#: parser/parse_relation.c:3526 +#: parser/parse_expr.c:397 parser/parse_relation.c:3608 +#: parser/parse_relation.c:3628 #, c-format msgid "column %s.%s does not exist" msgstr "kolumnen %s.%s finns inte" -#: parser/parse_expr.c:414 +#: parser/parse_expr.c:409 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "kolumn \"%s\" fanns inte i datatypen %s" -#: parser/parse_expr.c:420 +#: parser/parse_expr.c:415 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "kunde inte hitta kolumnen \"%s\" i record-datatyp" -#: parser/parse_expr.c:426 +#: parser/parse_expr.c:421 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "kolumnotation .%s använd på typ %s som inte är en sammanslagen typ" -#: parser/parse_expr.c:457 parser/parse_target.c:729 +#: parser/parse_expr.c:452 parser/parse_target.c:739 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "radexpansion via \"*\" stöds inte här" -#: parser/parse_expr.c:578 +#: parser/parse_expr.c:574 msgid "cannot use column reference in DEFAULT expression" msgstr "kan inte använda kolumnreferenser i DEFAULT-uttryck" -#: parser/parse_expr.c:581 +#: parser/parse_expr.c:577 msgid "cannot use column reference in partition bound expression" msgstr "kan inte använda kolumnreferenser i partitionsgränsuttryck" -#: parser/parse_expr.c:850 parser/parse_relation.c:799 -#: parser/parse_relation.c:881 parser/parse_target.c:1207 +#: parser/parse_expr.c:846 parser/parse_relation.c:818 +#: parser/parse_relation.c:900 parser/parse_target.c:1234 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "kolumnreferens \"%s\" är tvetydig" -#: parser/parse_expr.c:906 parser/parse_param.c:110 parser/parse_param.c:142 -#: parser/parse_param.c:199 parser/parse_param.c:298 +#: parser/parse_expr.c:902 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_param.c:208 parser/parse_param.c:307 #, c-format msgid "there is no parameter $%d" msgstr "det finns ingen parameter $%d" -#: parser/parse_expr.c:1149 +#: parser/parse_expr.c:1102 #, c-format msgid "NULLIF requires = operator to yield boolean" msgstr "NULLIF kräver att =-operatorn returnerar boolean" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1155 parser/parse_expr.c:3135 +#: parser/parse_expr.c:1108 parser/parse_expr.c:3029 #, c-format msgid "%s must not return a set" msgstr "%s får inte returnera en mängd" -#: parser/parse_expr.c:1603 parser/parse_expr.c:1635 +#: parser/parse_expr.c:1493 parser/parse_expr.c:1525 #, c-format msgid "number of columns does not match number of values" msgstr "antalet kolumner matchar inte antalet värden" -#: parser/parse_expr.c:1649 +#: parser/parse_expr.c:1539 #, c-format msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" msgstr "källa till en multiple-kolumn-UPDATE-post måste vara en sub-SELECT eller ROW()-uttryck" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1843 parser/parse_expr.c:2330 parser/parse_func.c:2540 +#: parser/parse_expr.c:1734 parser/parse_expr.c:2208 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "mängdreturnerande funktioner tillåts inte i %s" -#: parser/parse_expr.c:1904 +#: parser/parse_expr.c:1797 msgid "cannot use subquery in check constraint" msgstr "kan inte använda subfråga i check-villkor" -#: parser/parse_expr.c:1908 +#: parser/parse_expr.c:1801 msgid "cannot use subquery in DEFAULT expression" msgstr "kan inte använda underfråga i DEFAULT-uttryck" -#: parser/parse_expr.c:1911 +#: parser/parse_expr.c:1804 msgid "cannot use subquery in index expression" msgstr "kan inte använda subfråga i indexuttryck" -#: parser/parse_expr.c:1914 +#: parser/parse_expr.c:1807 msgid "cannot use subquery in index predicate" msgstr "kan inte använda subfråga i indexpredikat" -#: parser/parse_expr.c:1917 +#: parser/parse_expr.c:1810 +msgid "cannot use subquery in statistics expression" +msgstr "kan inte använda underfråga i statistikuttryck" + +#: parser/parse_expr.c:1813 msgid "cannot use subquery in transform expression" msgstr "kan inte använda underfråga i transformeringsuttrycket" -#: parser/parse_expr.c:1920 +#: parser/parse_expr.c:1816 msgid "cannot use subquery in EXECUTE parameter" msgstr "kan inte använda subfråga i EXECUTE-parameter" -#: parser/parse_expr.c:1923 +#: parser/parse_expr.c:1819 msgid "cannot use subquery in trigger WHEN condition" msgstr "kan inte använda subfråga i utlösares WHEN-villkor" -#: parser/parse_expr.c:1926 +#: parser/parse_expr.c:1822 msgid "cannot use subquery in partition bound" msgstr "kan inte använda underfråga i partitionsgräns" -#: parser/parse_expr.c:1929 +#: parser/parse_expr.c:1825 msgid "cannot use subquery in partition key expression" msgstr "kan inte använda underfråga i partitionsnyckeluttryck" -#: parser/parse_expr.c:1932 +#: parser/parse_expr.c:1828 msgid "cannot use subquery in CALL argument" msgstr "kan inte använda subfråga i CALL-argument" -#: parser/parse_expr.c:1935 +#: parser/parse_expr.c:1831 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "kan inte använda subfråga i COPY FROM WHERE-villkor" -#: parser/parse_expr.c:1938 +#: parser/parse_expr.c:1834 msgid "cannot use subquery in column generation expression" msgstr "kan inte använda subfråga i kolumngenereringsuttryck" -#: parser/parse_expr.c:1991 +#: parser/parse_expr.c:1887 parser/parse_expr.c:3716 #, c-format msgid "subquery must return only one column" msgstr "underfråga kan bara returnera en kolumn" -#: parser/parse_expr.c:2075 +#: parser/parse_expr.c:1958 #, c-format msgid "subquery has too many columns" msgstr "underfråga har för många kolumner" -#: parser/parse_expr.c:2080 +#: parser/parse_expr.c:1963 #, c-format msgid "subquery has too few columns" msgstr "underfråga har för få kolumner" -#: parser/parse_expr.c:2181 +#: parser/parse_expr.c:2059 #, c-format msgid "cannot determine type of empty array" msgstr "kan inte bestämma typen av en tom array" -#: parser/parse_expr.c:2182 +#: parser/parse_expr.c:2060 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "Typomvandla explicit till den önskade typen, till exempel ARRAY[]::integer[]." -#: parser/parse_expr.c:2196 +#: parser/parse_expr.c:2074 #, c-format msgid "could not find element type for data type %s" msgstr "kunde inte hitta elementtyp för datatyp %s" -#: parser/parse_expr.c:2481 +#: parser/parse_expr.c:2354 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "onamnat XML-attributvärde måste vara en kolumnreferens" -#: parser/parse_expr.c:2482 +#: parser/parse_expr.c:2355 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "onamnat XML-elementvärde måste vara en kolumnreferens" -#: parser/parse_expr.c:2497 +#: parser/parse_expr.c:2370 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "XML-attributnamn \"%s\" finns med mer än en gång" -#: parser/parse_expr.c:2604 +#: parser/parse_expr.c:2477 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "kan inte typomvandla XMLSERIALIZE-resultat till %s" -#: parser/parse_expr.c:2892 parser/parse_expr.c:3088 +#: parser/parse_expr.c:2786 parser/parse_expr.c:2982 #, c-format msgid "unequal number of entries in row expressions" msgstr "olika antal element i raduttryck" -#: parser/parse_expr.c:2902 +#: parser/parse_expr.c:2796 #, c-format msgid "cannot compare rows of zero length" msgstr "kan inte jämföra rader med längden noll" -#: parser/parse_expr.c:2927 +#: parser/parse_expr.c:2821 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "operator för radjämförelse måste resultera i typen boolean, inte %s" -#: parser/parse_expr.c:2934 +#: parser/parse_expr.c:2828 #, c-format msgid "row comparison operator must not return a set" msgstr "radjämförelseoperator får inte returnera en mängd" -#: parser/parse_expr.c:2993 parser/parse_expr.c:3034 +#: parser/parse_expr.c:2887 parser/parse_expr.c:2928 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "kunde inte lista ut tolkning av radjämförelseoperator %s" -#: parser/parse_expr.c:2995 +#: parser/parse_expr.c:2889 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "Radjämförelseoperatorer måste vara associerade med btreee-operatorfamiljer." -#: parser/parse_expr.c:3036 +#: parser/parse_expr.c:2930 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Det finns flera lika sannolika kandidater." -#: parser/parse_expr.c:3129 +#: parser/parse_expr.c:3023 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "IS DISTINCT FROM kräver att operatorn = ger tillbaka en boolean" -#: parser/parse_expr.c:3448 parser/parse_expr.c:3466 +#: parser/parse_expr.c:3275 +#, c-format +msgid "JSON ENCODING clause is only allowed for bytea input type" +msgstr "JSON ENCODING-sats tillåts bara med indatatypen bytea" + +#: parser/parse_expr.c:3282 +#, c-format +msgid "FORMAT JSON has no effect for json and jsonb types" +msgstr "FORMAT JSON har ingen effekt för typerna json och jsonb" + +#: parser/parse_expr.c:3337 +#, c-format +msgid "cannot use non-string types with implicit FORMAT JSON clause" +msgstr "" + +#: parser/parse_expr.c:3441 +#, fuzzy, c-format +#| msgid "cannot cast jsonb string to type %s" +msgid "cannot use JSON format with non-string output types" +msgstr "kan inte typomvandla jsonb-sträng till typ %s" + +#: parser/parse_expr.c:3454 +#, c-format +msgid "cannot set JSON encoding for non-bytea output types" +msgstr "" + +#: parser/parse_expr.c:3459 +#, fuzzy, c-format +#| msgid "unsupported format code: %d" +msgid "unsupported JSON encoding" +msgstr "ej stödd formatkod: %d" + +#: parser/parse_expr.c:3460 +#, c-format +msgid "only UTF8 JSON encoding is supported" +msgstr "bara JSON-kodning som UTF8 stöds" + +#: parser/parse_expr.c:3497 +#, fuzzy, c-format +#| msgid "return type %s is not supported for SQL functions" +msgid "returning SETOF types is not supported in SQL/JSON functions" +msgstr "returtyp %s stöds inte för SQL-funktioner" + +#: parser/parse_expr.c:3797 parser/parse_func.c:864 +#, c-format +msgid "aggregate ORDER BY is not implemented for window functions" +msgstr "aggregat-ORDER BY är inte implementerat för fönsterfunktioner" + +#: parser/parse_expr.c:4014 +#, c-format +msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" +msgstr "" + +#: parser/parse_expr.c:4035 +#, fuzzy, c-format +#| msgid "cannot use subquery in index predicate" +msgid "cannot use type %s in IS JSON predicate" +msgstr "kan inte använda subfråga i indexpredikat" + +#: parser/parse_expr.c:4100 +#, fuzzy, c-format +#| msgid "SELECT ... INTO is not allowed here" +msgid "JSON_TABLE path name is not allowed here" +msgstr "SELECT ... INTO tillåts inte här" + +#: parser/parse_expr.c:4127 +#, fuzzy, c-format +#| msgid "argument of %s must be type %s, not type %s" +msgid "JSON path expression must be type %s, not type %s" +msgstr "argumentet till %s måste vara av typ %s, inte av typ %s" + +#: parser/parse_expr.c:4289 +#, fuzzy, c-format +#| msgid "cannot cast type %s to %s" +msgid "cannot cast DEFAULT expression type %s to %s" +msgstr "kan inte omvandla typ %s till %s" + +#: parser/parse_expr.c:4458 +#, fuzzy, c-format +#| msgid "policies not yet implemented for this command" +msgid "JSON_TABLE() is not yet implemented for the json type" +msgstr "policys är ännu inte implementerat för detta kommando" + +#: parser/parse_expr.c:4459 parser/parse_expr.c:4469 +#, fuzzy, c-format +#| msgid "query string argument of EXECUTE is null" +msgid "Try casting the argument to jsonb" +msgstr "frågesträngargumentet till EXECUTE är null" + +#: parser/parse_expr.c:4468 +#, fuzzy, c-format +#| msgid "policies not yet implemented for this command" +msgid "%s() is not yet implemented for the json type" +msgstr "policys är ännu inte implementerat för detta kommando" + +#: parser/parse_expr.c:4489 +#, fuzzy, c-format +#| msgid "cannot cast type %s to %s" +msgid "cannot use RETURNING type %s in %s" +msgstr "kan inte omvandla typ %s till %s" + +#: parser/parse_expr.c:4532 #, c-format -msgid "operator precedence change: %s is now lower precedence than %s" -msgstr "operator-precedence-ändring: %s har nu lägre precedence än %s" +msgid "cannot use non-string types with WITH UNIQUE KEYS clause" +msgstr "" -#: parser/parse_func.c:191 +#: parser/parse_func.c:194 #, c-format msgid "argument name \"%s\" used more than once" msgstr "argumentnamn \"%s\" angivet mer än en gång" -#: parser/parse_func.c:202 +#: parser/parse_func.c:205 #, c-format msgid "positional argument cannot follow named argument" msgstr "positionella argument kan inte komma efter namngivna argument" -#: parser/parse_func.c:284 parser/parse_func.c:2243 +#: parser/parse_func.c:287 parser/parse_func.c:2369 #, c-format msgid "%s is not a procedure" msgstr "%s är inte en procedur" -#: parser/parse_func.c:288 +#: parser/parse_func.c:291 #, c-format msgid "To call a function, use SELECT." msgstr "För att anropa en funktion, använd SELECT." -#: parser/parse_func.c:294 +#: parser/parse_func.c:297 #, c-format msgid "%s is a procedure" msgstr "\"%s\" är en procedur" -#: parser/parse_func.c:298 +#: parser/parse_func.c:301 #, c-format msgid "To call a procedure, use CALL." msgstr "För att anropa en procedur, använd CALL" -#: parser/parse_func.c:312 +#: parser/parse_func.c:315 #, c-format msgid "%s(*) specified, but %s is not an aggregate function" msgstr "%s(*) angivet, men %s är inte en aggregatfunktion" -#: parser/parse_func.c:319 +#: parser/parse_func.c:322 #, c-format msgid "DISTINCT specified, but %s is not an aggregate function" msgstr "DISTINCT angiven, men %s är inte en aggregatfunktion" -#: parser/parse_func.c:325 +#: parser/parse_func.c:328 #, c-format msgid "WITHIN GROUP specified, but %s is not an aggregate function" msgstr "WITHIN GROUP angiven, men %s är inte en aggregatfunktion" -#: parser/parse_func.c:331 +#: parser/parse_func.c:334 #, c-format msgid "ORDER BY specified, but %s is not an aggregate function" msgstr "ORDER BY angiven, men %s är inte en aggregatfunktion" -#: parser/parse_func.c:337 +#: parser/parse_func.c:340 #, c-format msgid "FILTER specified, but %s is not an aggregate function" msgstr "FILTER angiven, men %s är inte en aggregatfunktion" -#: parser/parse_func.c:343 +#: parser/parse_func.c:346 #, c-format msgid "OVER specified, but %s is not a window function nor an aggregate function" msgstr "OVER angiven, men %s är inte en fönsterfunktion eller en aggregatfunktion" -#: parser/parse_func.c:381 +#: parser/parse_func.c:384 #, c-format msgid "WITHIN GROUP is required for ordered-set aggregate %s" msgstr "WITHIN GROUP krävs för sorterad-mängd-aggregat %s" -#: parser/parse_func.c:387 +#: parser/parse_func.c:390 #, c-format msgid "OVER is not supported for ordered-set aggregate %s" msgstr "DISTINCT stöds inte för sorterad-mängd-aggregat %s" -#: parser/parse_func.c:418 parser/parse_func.c:447 +#: parser/parse_func.c:421 parser/parse_func.c:452 #, c-format -msgid "There is an ordered-set aggregate %s, but it requires %d direct arguments, not %d." -msgstr "Det finns ett sorterad-mängd-aggregat %s, men det kräver %d direkta argument, inte %d." +msgid "There is an ordered-set aggregate %s, but it requires %d direct argument, not %d." +msgid_plural "There is an ordered-set aggregate %s, but it requires %d direct arguments, not %d." +msgstr[0] "Det finns ett sorterad-mängd-aggregat %s, men det kräver %d direkt argument, inte %d." +msgstr[1] "Det finns ett sorterad-mängd-aggregat %s, men det kräver %d direkta argument, inte %d." -#: parser/parse_func.c:472 +#: parser/parse_func.c:479 #, c-format msgid "To use the hypothetical-set aggregate %s, the number of hypothetical direct arguments (here %d) must match the number of ordering columns (here %d)." msgstr "För att använda hypotetiskt mängdaggregat %s så måste antalet direkta hypotetiska argument (här %d) matcha antalet sorteringskolumner (här %d)." -#: parser/parse_func.c:486 +#: parser/parse_func.c:493 #, c-format -msgid "There is an ordered-set aggregate %s, but it requires at least %d direct arguments." -msgstr "Det finns ett sorterad-mängd-aggregat %s, men det kräver minst %d direkta argument." +msgid "There is an ordered-set aggregate %s, but it requires at least %d direct argument." +msgid_plural "There is an ordered-set aggregate %s, but it requires at least %d direct arguments." +msgstr[0] "Det finns ett sorterad-mängd-aggregat %s, men det kräver minst %d direkt argument." +msgstr[1] "Det finns ett sorterad-mängd-aggregat %s, men det kräver minst %d direkta argument." -#: parser/parse_func.c:505 +#: parser/parse_func.c:514 #, c-format msgid "%s is not an ordered-set aggregate, so it cannot have WITHIN GROUP" msgstr "%s är inte en sorterad-mängd-aggregat, så den kan inte ha WITHIN GROUP" -#: parser/parse_func.c:518 +#: parser/parse_func.c:527 #, c-format msgid "window function %s requires an OVER clause" msgstr "fönsterfunktion %s kräver en OVER-klausul" -#: parser/parse_func.c:525 +#: parser/parse_func.c:534 #, c-format msgid "window function %s cannot have WITHIN GROUP" msgstr "fönsterfunktion %s kan inte ha en WITHIN GROUP" -#: parser/parse_func.c:554 +#: parser/parse_func.c:563 #, c-format msgid "procedure %s is not unique" msgstr "proceduren \"%s\" är inte unik" -#: parser/parse_func.c:557 +#: parser/parse_func.c:566 #, c-format msgid "Could not choose a best candidate procedure. You might need to add explicit type casts." msgstr "Kunde inte välja en bästa kandidatprocedur. Du behöver troligen lägga till en explicit typomvandling." -#: parser/parse_func.c:563 +#: parser/parse_func.c:572 #, c-format msgid "function %s is not unique" msgstr "funktionen %s är inte unik" -#: parser/parse_func.c:566 +#: parser/parse_func.c:575 #, c-format msgid "Could not choose a best candidate function. You might need to add explicit type casts." msgstr "Kunde inte välja en bästa kandidatfunktion: Du kan behöva lägga till explicita typomvandlingar." -#: parser/parse_func.c:605 +#: parser/parse_func.c:614 #, c-format msgid "No aggregate function matches the given name and argument types. Perhaps you misplaced ORDER BY; ORDER BY must appear after all regular arguments of the aggregate." msgstr "Ingen aggregatfunktion matchar det givna namnet och argumenttyperna. Kanske har du placerat ORDER BY på fel plats; ORDER BY måste komma efter alla vanliga argument till aggregatet." -#: parser/parse_func.c:613 parser/parse_func.c:2286 +#: parser/parse_func.c:622 parser/parse_func.c:2412 #, c-format msgid "procedure %s does not exist" msgstr "proceduren \"%s\" finns inte" -#: parser/parse_func.c:616 +#: parser/parse_func.c:625 #, c-format msgid "No procedure matches the given name and argument types. You might need to add explicit type casts." msgstr "Ingen procedur matchar det angivna namnet och argumenttyperna. Du kan behöva lägga till explicita typomvandlingar." -#: parser/parse_func.c:625 +#: parser/parse_func.c:634 #, c-format msgid "No function matches the given name and argument types. You might need to add explicit type casts." msgstr "Ingen funktion matchar det angivna namnet och argumenttyperna. Du kan behöva lägga till explicita typomvandlingar." -#: parser/parse_func.c:727 +#: parser/parse_func.c:736 #, c-format msgid "VARIADIC argument must be an array" msgstr "VARIADIC-argument måste vara en array" -#: parser/parse_func.c:779 parser/parse_func.c:843 +#: parser/parse_func.c:790 parser/parse_func.c:854 #, c-format msgid "%s(*) must be used to call a parameterless aggregate function" msgstr "%s(*) måste användas för att anropa en parameterlös aggregatfunktion" -#: parser/parse_func.c:786 +#: parser/parse_func.c:797 #, c-format msgid "aggregates cannot return sets" msgstr "aggregat kan inte returnera mängder" -#: parser/parse_func.c:801 +#: parser/parse_func.c:812 #, c-format msgid "aggregates cannot use named arguments" msgstr "aggregat kan inte använda namngivna argument" -#: parser/parse_func.c:833 +#: parser/parse_func.c:844 #, c-format msgid "DISTINCT is not implemented for window functions" msgstr "DISTINCT är inte implementerad för fönsterfunktioner" -#: parser/parse_func.c:853 -#, c-format -msgid "aggregate ORDER BY is not implemented for window functions" -msgstr "aggregat-ORDER BY är inte implementerat för fönsterfunktioner" - -#: parser/parse_func.c:862 +#: parser/parse_func.c:873 #, c-format msgid "FILTER is not implemented for non-aggregate window functions" msgstr "FILTER är inte implementerat för icke-aggregat-fönsterfunktioner" -#: parser/parse_func.c:871 +#: parser/parse_func.c:882 #, c-format msgid "window function calls cannot contain set-returning function calls" msgstr "fönsterfunktioner kan inte innehålla funtionsanrop till funktioner som returnerar mängder" -#: parser/parse_func.c:879 +#: parser/parse_func.c:890 #, c-format msgid "window functions cannot return sets" msgstr "fönsterfunktioner kan inte returnera mängder" -#: parser/parse_func.c:2124 parser/parse_func.c:2315 +#: parser/parse_func.c:2168 parser/parse_func.c:2441 #, c-format msgid "could not find a function named \"%s\"" msgstr "kunde inte hitta funktion med namn \"%s\"" -#: parser/parse_func.c:2138 parser/parse_func.c:2333 +#: parser/parse_func.c:2182 parser/parse_func.c:2459 #, c-format msgid "function name \"%s\" is not unique" msgstr "funktionsnamn \"%s\" är inte unikt" -#: parser/parse_func.c:2140 parser/parse_func.c:2335 +#: parser/parse_func.c:2184 parser/parse_func.c:2462 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "Ange argumentlistan för att välja funktionen entydigt." -#: parser/parse_func.c:2184 +#: parser/parse_func.c:2228 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" msgstr[0] "procedurer kan inte ha mer än %d argument" msgstr[1] "procedurer kan inte ha mer än %d argument" -#: parser/parse_func.c:2233 +#: parser/parse_func.c:2359 #, c-format msgid "%s is not a function" msgstr "%s är inte en funktion" -#: parser/parse_func.c:2253 +#: parser/parse_func.c:2379 #, c-format msgid "function %s is not an aggregate" msgstr "funktionen %s är inte en aggregatfunktion" -#: parser/parse_func.c:2281 +#: parser/parse_func.c:2407 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "kunde inte hitta en procedur med namn \"%s\"" -#: parser/parse_func.c:2295 +#: parser/parse_func.c:2421 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "kunde inte hitta ett aggregat med namn \"%s\"" -#: parser/parse_func.c:2300 +#: parser/parse_func.c:2426 #, c-format msgid "aggregate %s(*) does not exist" msgstr "aggregatfunktion %s(*) existerar inte" -#: parser/parse_func.c:2305 +#: parser/parse_func.c:2431 #, c-format msgid "aggregate %s does not exist" msgstr "aggregatfunktion %s existerar inte" -#: parser/parse_func.c:2340 +#: parser/parse_func.c:2467 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "procedurnamn \"%s\" är inte unikt" -#: parser/parse_func.c:2342 +#: parser/parse_func.c:2470 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "Ange argumentlistan för att välja proceduren entydigt." -#: parser/parse_func.c:2347 +#: parser/parse_func.c:2475 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "aggregatnamn \"%s\" är inte unikt" -#: parser/parse_func.c:2349 +#: parser/parse_func.c:2478 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "Ange argumentlistan för att välja aggregatet entydigt." -#: parser/parse_func.c:2354 +#: parser/parse_func.c:2483 #, c-format msgid "routine name \"%s\" is not unique" msgstr "rutinnamn \"%s\" är inte unikt" -#: parser/parse_func.c:2356 +#: parser/parse_func.c:2486 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "Ange argumentlistan för att välja rutinen entydigt." -#: parser/parse_func.c:2411 +#: parser/parse_func.c:2541 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "mängdreturnerande funktioner tillåts inte i JOIN-villkor" -#: parser/parse_func.c:2432 +#: parser/parse_func.c:2562 msgid "set-returning functions are not allowed in policy expressions" msgstr "mängdreturnerande funktioner tillåts inte i policy-uttryck" -#: parser/parse_func.c:2448 +#: parser/parse_func.c:2578 msgid "set-returning functions are not allowed in window definitions" msgstr "mängdreturnerande funktioner tillåts inte i fönsterdefinitioner" -#: parser/parse_func.c:2486 +#: parser/parse_func.c:2615 +msgid "set-returning functions are not allowed in MERGE WHEN conditions" +msgstr "mängdreturnerande funktioner tillåts inte i MERGE WHEN-villkor" + +#: parser/parse_func.c:2619 msgid "set-returning functions are not allowed in check constraints" msgstr "mängdreturnerande funktioner tillåts inte i check-villkor" -#: parser/parse_func.c:2490 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "mängdreturnerande funktioner tillåts inte i DEFAULT-uttryck" -#: parser/parse_func.c:2493 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index expressions" msgstr "mängdreturnerande funktioner tillåts inte i indexuttryck" -#: parser/parse_func.c:2496 +#: parser/parse_func.c:2629 msgid "set-returning functions are not allowed in index predicates" msgstr "mängdreturnerande funktioner tillåts inte i indexpredukat" -#: parser/parse_func.c:2499 +#: parser/parse_func.c:2632 +msgid "set-returning functions are not allowed in statistics expressions" +msgstr "mängdreturnerande funktioner tillåts inte i statistikuttryck" + +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in transform expressions" msgstr "mängdreturnerande funktioner tillåts inte i transformuttryck" -#: parser/parse_func.c:2502 -msgid "set-returning functions are not allowed in EXECUTE parameters" -msgstr "mängdreturnerande funktioner tillåts inte i EXECUTE-parametrar" +#: parser/parse_func.c:2638 +msgid "set-returning functions are not allowed in EXECUTE parameters" +msgstr "mängdreturnerande funktioner tillåts inte i EXECUTE-parametrar" + +#: parser/parse_func.c:2641 +msgid "set-returning functions are not allowed in trigger WHEN conditions" +msgstr "mängdreturnerande funktioner tillåts inte i WHEN-utlösarvillkor" + +#: parser/parse_func.c:2644 +msgid "set-returning functions are not allowed in partition bound" +msgstr "mängdreturnerande funktioner tillåts inte i partitionsgräns" + +#: parser/parse_func.c:2647 +msgid "set-returning functions are not allowed in partition key expressions" +msgstr "mängdreturnerande funktioner tillåts inte i partitionsnyckeluttryck" + +#: parser/parse_func.c:2650 +msgid "set-returning functions are not allowed in CALL arguments" +msgstr "mängdreturnerande funktioner tillåts inte i CALL-argument" + +#: parser/parse_func.c:2653 +msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" +msgstr "mängdreturnerande funktioner tillåts inte i COPY FROM WHERE-villkor" + +#: parser/parse_func.c:2656 +msgid "set-returning functions are not allowed in column generation expressions" +msgstr "mängdreturnerande funktioner tillåts inte i kolumngenereringsuttryck" + +#: parser/parse_jsontable.c:143 +#, c-format +msgid "duplicate JSON_TABLE column name: %s" +msgstr "" + +#: parser/parse_jsontable.c:144 +#, c-format +msgid "JSON_TABLE column names must be distinct from one another" +msgstr "" + +#: parser/parse_jsontable.c:247 +#, c-format +msgid "nested JSON_TABLE columns must contain an explicit AS pathname specification if an explicit PLAN clause is used" +msgstr "" + +#: parser/parse_jsontable.c:260 parser/parse_jsontable.c:271 +#: parser/parse_jsontable.c:387 parser/parse_jsontable.c:591 +#: parser/parse_jsontable.c:610 +#, c-format +msgid "invalid JSON_TABLE plan" +msgstr "ogiltigt JSON_TABLE-plan" + +#: parser/parse_jsontable.c:261 +#, c-format +msgid "plan node for nested path %s was not found in plan" +msgstr "plan-nod för nästlad sökväg %s hittades inte i planen" + +#: parser/parse_jsontable.c:272 +#, c-format +msgid "plan node contains some extra or duplicate sibling nodes" +msgstr "" + +#: parser/parse_jsontable.c:388 +#, fuzzy, c-format +#| msgid "old database \"%s\" not found in the new cluster\n" +msgid "path name was %s not found in nested columns list" +msgstr "gamla databasen \"%s\" kan inte hittas i nya klustret\n" + +#: parser/parse_jsontable.c:477 +#, c-format +msgid "cannot use WITH WRAPPER clause with scalar columns" +msgstr "" + +#: parser/parse_jsontable.c:482 +#, c-format +msgid "cannot use OMIT QUOTES clause with scalar columns" +msgstr "" + +#: parser/parse_jsontable.c:569 +#, fuzzy, c-format +#| msgid "invalid regular expression: %s" +msgid "invalid JSON_TABLE expression" +msgstr "ogiltigt reguljärt uttryck: %s" + +#: parser/parse_jsontable.c:570 +#, c-format +msgid "JSON_TABLE columns must contain explicit AS pathname specification if explicit PLAN clause is used" +msgstr "" + +#: parser/parse_jsontable.c:592 +#, c-format +msgid "expected INNER or OUTER JSON_TABLE plan node" +msgstr "förväntade INNER eller OUTER JSON_TABLE-plan-nod" + +#: parser/parse_jsontable.c:611 +#, c-format +msgid "path name mismatch: expected %s but %s is given" +msgstr "sökvägens namn matchade inte: förväntade %s men fick %s" -#: parser/parse_func.c:2505 -msgid "set-returning functions are not allowed in trigger WHEN conditions" -msgstr "mängdreturnerande funktioner tillåts inte i WHEN-utlösarvillkor" +#: parser/parse_jsontable.c:712 +#, c-format +msgid "only string constants supported in JSON_TABLE path specification" +msgstr "" -#: parser/parse_func.c:2508 -msgid "set-returning functions are not allowed in partition bound" -msgstr "mängdreturnerande funktioner tillåts inte i partitionsgräns" +#: parser/parse_merge.c:119 +#, fuzzy, c-format +#| msgid "WHERE CURRENT OF is not supported for this table type" +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "WHERE CURRENT OF stöds inte för denna tabelltyp" -#: parser/parse_func.c:2511 -msgid "set-returning functions are not allowed in partition key expressions" -msgstr "mängdreturnerande funktioner tillåts inte i partitionsnyckeluttryck" +#: parser/parse_merge.c:163 +#, c-format +msgid "unreachable WHEN clause specified after unconditional WHEN clause" +msgstr "" -#: parser/parse_func.c:2514 -msgid "set-returning functions are not allowed in CALL arguments" -msgstr "mängdreturnerande funktioner tillåts inte i CALL-argument" +#: parser/parse_merge.c:178 parser/parse_merge.c:184 +#, fuzzy, c-format +#| msgid "cannot change relation \"%s\"" +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "kan inte ändra relation \"%s\"" -#: parser/parse_func.c:2517 -msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" -msgstr "mängdreturnerande funktioner tillåts inte i COPY FROM WHERE-villkor" +#: parser/parse_merge.c:186 +#, fuzzy, c-format +#| msgid "LIKE is not supported for creating foreign tables" +msgid "MERGE is not supported for relations with rules." +msgstr "LIKE stöds inte för att skapa främmande tabeller" -#: parser/parse_func.c:2520 -msgid "set-returning functions are not allowed in column generation expressions" -msgstr "mängdreturnerande funktioner tillåts inte i kolumngenereringsuttryck" +#: parser/parse_merge.c:203 +#, fuzzy, c-format +#| msgid "table name \"%s\" specified more than once" +msgid "name \"%s\" specified more than once" +msgstr "tabellnamn \"%s\" angivet mer än en gång" + +#: parser/parse_merge.c:205 +#, c-format +msgid "The name is used both as MERGE target table and data source." +msgstr "" #: parser/parse_node.c:86 #, c-format msgid "target lists can have at most %d entries" msgstr "mållista kan ha som mest %d poster" -#: parser/parse_node.c:235 -#, c-format -msgid "cannot subscript type %s because it is not an array" -msgstr "kan inte indexera typ %s då det inte är en array" - -#: parser/parse_node.c:340 parser/parse_node.c:377 +#: parser/parse_oper.c:123 parser/parse_oper.c:690 #, c-format -msgid "array subscript must have type integer" -msgstr "arrayindex måste ha typen integer" - -#: parser/parse_node.c:408 -#, c-format -msgid "array assignment requires type %s but expression is of type %s" -msgstr "array-tilldelning kräver typ %s men uttrycket har typ %s" +msgid "postfix operators are not supported" +msgstr "postfix-operatorer stöds inte" -#: parser/parse_oper.c:125 parser/parse_oper.c:724 utils/adt/regproc.c:521 -#: utils/adt/regproc.c:705 +#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:539 +#: utils/adt/regproc.c:723 #, c-format msgid "operator does not exist: %s" msgstr "operator existerar inte: %s" -#: parser/parse_oper.c:224 +#: parser/parse_oper.c:229 #, c-format msgid "Use an explicit ordering operator or modify the query." msgstr "Använd en explicit ordningsoperator eller ändra frågan." -#: parser/parse_oper.c:480 +#: parser/parse_oper.c:485 #, c-format msgid "operator requires run-time type coercion: %s" msgstr "operator kräver run-time-typomvandling: %s" -#: parser/parse_oper.c:716 +#: parser/parse_oper.c:641 #, c-format msgid "operator is not unique: %s" msgstr "operatorn är inte unik: %s" -#: parser/parse_oper.c:718 +#: parser/parse_oper.c:643 #, c-format msgid "Could not choose a best candidate operator. You might need to add explicit type casts." msgstr "Kunde inte välja en bästa kandidatoperator. Du behöver troligen lägga till en explicit typomvandling." -#: parser/parse_oper.c:727 +#: parser/parse_oper.c:652 #, c-format msgid "No operator matches the given name and argument type. You might need to add an explicit type cast." msgstr "Ingen operator matchar det angivna namnet och argumenttyp. Du kan behöva lägga till explicita typomvandlingar." -#: parser/parse_oper.c:729 +#: parser/parse_oper.c:654 #, c-format msgid "No operator matches the given name and argument types. You might need to add explicit type casts." msgstr "Ingen operator matchar det angivna namnet och argumenttyperna. Du kan behöva lägga till explicita typomvandlingar." -#: parser/parse_oper.c:790 parser/parse_oper.c:912 +#: parser/parse_oper.c:714 parser/parse_oper.c:828 #, c-format msgid "operator is only a shell: %s" msgstr "operator är bara en shell-typ: %s" -#: parser/parse_oper.c:900 +#: parser/parse_oper.c:816 #, c-format msgid "op ANY/ALL (array) requires array on right side" msgstr "op ANY/ALL (array) kräver en array på höger sida" -#: parser/parse_oper.c:942 +#: parser/parse_oper.c:858 #, c-format msgid "op ANY/ALL (array) requires operator to yield boolean" msgstr "op ANY/ALL (array) kräver att operatorn returnerar en boolean" -#: parser/parse_oper.c:947 +#: parser/parse_oper.c:863 #, c-format msgid "op ANY/ALL (array) requires operator not to return a set" msgstr "op ANY/ALL (array) kräver att operatorn inte returnerar en mängd" -#: parser/parse_param.c:216 +#: parser/parse_param.c:225 #, c-format msgid "inconsistent types deduced for parameter $%d" msgstr "inkonsistenta typer härledda för parameter $%d" +#: parser/parse_param.c:313 tcop/postgres.c:709 +#, c-format +msgid "could not determine data type of parameter $%d" +msgstr "kunde inte lista ut datatypen för parameter $%d" + #: parser/parse_relation.c:201 #, c-format msgid "table reference \"%s\" is ambiguous" @@ -16437,153 +17970,168 @@ msgstr "tabellreferens \"%s\" är tvetydig" msgid "table reference %u is ambiguous" msgstr "tabellreferens %u är tvetydig" -#: parser/parse_relation.c:444 +#: parser/parse_relation.c:445 #, c-format msgid "table name \"%s\" specified more than once" msgstr "tabellnamn \"%s\" angivet mer än en gång" -#: parser/parse_relation.c:473 parser/parse_relation.c:3446 +#: parser/parse_relation.c:474 parser/parse_relation.c:3548 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "ogiltig referens till FROM-klausulpost för tabell \"%s\"" -#: parser/parse_relation.c:477 parser/parse_relation.c:3451 +#: parser/parse_relation.c:478 parser/parse_relation.c:3553 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "Det finns en post för tabell \"%s\" men den kan inte refereras till från denna del av frågan." -#: parser/parse_relation.c:479 +#: parser/parse_relation.c:480 #, c-format msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." msgstr "JOIN-typen måste vara INNER eller LEFT för att fungera med LATERAL." -#: parser/parse_relation.c:690 +#: parser/parse_relation.c:691 #, c-format msgid "system column \"%s\" reference in check constraint is invalid" msgstr "systemkolumn \"%s\" som refereras till i check-villkor är ogiltigt" -#: parser/parse_relation.c:699 +#: parser/parse_relation.c:700 #, c-format msgid "cannot use system column \"%s\" in column generation expression" msgstr "kan inte använda systemkolumn \"%s\" i kolumngenereringsuttryck" -#: parser/parse_relation.c:1170 parser/parse_relation.c:1620 -#: parser/parse_relation.c:2262 +#: parser/parse_relation.c:711 +#, c-format +msgid "cannot use system column \"%s\" in MERGE WHEN condition" +msgstr "kan inte använda systemkolumn \"%s\" i MERGE WHEN-villkor" + +#: parser/parse_relation.c:1184 parser/parse_relation.c:1636 +#: parser/parse_relation.c:2314 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "tabell \"%s\" har %d kolumner tillgängliga men %d kolumner angivna" -#: parser/parse_relation.c:1372 +#: parser/parse_relation.c:1388 #, c-format msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." msgstr "Det finns en WITH-post med namn \"%s\" men den kan inte refereras till från denna del av frågan." -#: parser/parse_relation.c:1374 +#: parser/parse_relation.c:1390 #, c-format msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." msgstr "Använd WITH RECURSIVE eller ändra ordning på WITH-posterna för att ta bort framåt-referenser." -#: parser/parse_relation.c:1747 +#: parser/parse_relation.c:1778 +#, c-format +msgid "a column definition list is redundant for a function with OUT parameters" +msgstr "en kolumndefinitionslista är redundant för en funktion med OUT-parametrar" + +#: parser/parse_relation.c:1784 +#, c-format +msgid "a column definition list is redundant for a function returning a named composite type" +msgstr "en kolumndefinitionslista är redundant för en funktion som returnerar en namngiven composite-typ" + +#: parser/parse_relation.c:1791 #, c-format msgid "a column definition list is only allowed for functions returning \"record\"" msgstr "en kolumndefinitionslista tillåts bara för funktioner som returnerar \"record\"" -#: parser/parse_relation.c:1756 +#: parser/parse_relation.c:1802 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "en kolumndefinitionslista krävs för funktioner som returnerar \"record\"" -#: parser/parse_relation.c:1845 +#: parser/parse_relation.c:1891 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "funktion \"%s\" i FROM har en icke stödd returtyp %s" -#: parser/parse_relation.c:2054 +#: parser/parse_relation.c:2101 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "VALUES-lista \"%s\" har %d kolumner tillgängliga men %d kolumner angivna" -#: parser/parse_relation.c:2125 +#: parser/parse_relation.c:2173 #, c-format msgid "joins can have at most %d columns" msgstr "joins kan ha som mest %d kolumner" -#: parser/parse_relation.c:2235 +#: parser/parse_relation.c:2287 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "WITH-fråga \"%s\" har ingen RETURNING-klausul" -#: parser/parse_relation.c:3221 parser/parse_relation.c:3231 +#: parser/parse_relation.c:3323 parser/parse_relation.c:3333 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "kolumn %d i relation \"%s\" finns inte" -#: parser/parse_relation.c:3449 +#: parser/parse_relation.c:3551 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Kanske tänkte du referera till tabellaliaset \"%s\"." -#: parser/parse_relation.c:3457 +#: parser/parse_relation.c:3559 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "saknar FROM-klausulpost för tabell \"%s\"" -#: parser/parse_relation.c:3509 +#: parser/parse_relation.c:3611 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "Kanske tänkte du referera till kolumnen \"%s.%s\"." -#: parser/parse_relation.c:3511 +#: parser/parse_relation.c:3613 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "Det finns en kolumn med namn \"%s\" i tabell \"%s\" men den kan inte refereras till från denna del av frågan." -#: parser/parse_relation.c:3528 +#: parser/parse_relation.c:3630 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "Kanske tänkte du referera till kolumnen \"%s.%s\" eller kolumnen \"%s.%s\"." -#: parser/parse_target.c:478 parser/parse_target.c:792 +#: parser/parse_target.c:482 parser/parse_target.c:803 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "kan inte skriva till systemkolumn \"%s\"" -#: parser/parse_target.c:506 +#: parser/parse_target.c:510 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "kan inte sätta ett array-element till DEFAULT" -#: parser/parse_target.c:511 +#: parser/parse_target.c:515 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "kan inte sätta ett underfält till DEFAULT" -#: parser/parse_target.c:584 +#: parser/parse_target.c:589 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "kolumn \"%s\" har typ %s men uttrycket är av typ %s" -#: parser/parse_target.c:776 +#: parser/parse_target.c:787 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" msgstr "kan inte tilldela till fält \"%s\" i kolumn \"%s\" då dess typ %s inte är en composit-typ" -#: parser/parse_target.c:785 +#: parser/parse_target.c:796 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" msgstr "kan inte tilldela till fält \"%s\" i kolumn \"%s\" då det inte finns någon sådan kolumn i datatypen %s" -#: parser/parse_target.c:864 +#: parser/parse_target.c:877 #, c-format -msgid "array assignment to \"%s\" requires type %s but expression is of type %s" -msgstr "array-tilldelning till \"%s\" kräver typ %s men uttrycket har typ %s" +msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" +msgstr "tilldelning med array-index till \"%s\" kräver typ %s men uttrycket har typ %s" -#: parser/parse_target.c:874 +#: parser/parse_target.c:887 #, c-format msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "underfält \"%s\" har typ %s men uttrycket har typ %s" -#: parser/parse_target.c:1295 +#: parser/parse_target.c:1323 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * utan tabeller angivna är inte giltigt" @@ -16603,8 +18151,8 @@ msgstr "dålig %%TYPE-referens (för många punktade namn): %s" msgid "type reference %s converted to %s" msgstr "typreferens %s konverterad till %s" -#: parser/parse_type.c:278 parser/parse_type.c:857 utils/cache/typcache.c:383 -#: utils/cache/typcache.c:437 +#: parser/parse_type.c:278 parser/parse_type.c:807 utils/cache/typcache.c:390 +#: utils/cache/typcache.c:445 #, c-format msgid "type \"%s\" is only a shell" msgstr "typ \"%s\" är bara ett skal" @@ -16614,453 +18162,467 @@ msgstr "typ \"%s\" är bara ett skal" msgid "type modifier is not allowed for type \"%s\"" msgstr "typmodifierare tillåts inte för typ \"%s\"" -#: parser/parse_type.c:405 +#: parser/parse_type.c:409 #, c-format msgid "type modifiers must be simple constants or identifiers" msgstr "typmodifierare måste vare enkla konstanter eller identifierare" -#: parser/parse_type.c:721 parser/parse_type.c:820 +#: parser/parse_type.c:725 parser/parse_type.c:770 #, c-format msgid "invalid type name \"%s\"" msgstr "ogiltigt typnamn \"%s\"" -#: parser/parse_utilcmd.c:264 +#: parser/parse_utilcmd.c:256 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "kan inte skapa partitionerad tabell som barnarv" -#: parser/parse_utilcmd.c:428 -#, c-format -msgid "%s will create implicit sequence \"%s\" for serial column \"%s.%s\"" -msgstr "%s kommer skapa en implicit sekvens \"%s\" för \"serial\"-kolumnen \"%s.%s\"" - -#: parser/parse_utilcmd.c:559 +#: parser/parse_utilcmd.c:569 #, c-format msgid "array of serial is not implemented" msgstr "array med serial är inte implementerat" -#: parser/parse_utilcmd.c:637 parser/parse_utilcmd.c:649 +#: parser/parse_utilcmd.c:648 parser/parse_utilcmd.c:660 +#: parser/parse_utilcmd.c:719 #, c-format msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "motstridiga NULL/NOT NULL-villkor för kolumnen \"%s\" i tabell \"%s\"" -#: parser/parse_utilcmd.c:661 +#: parser/parse_utilcmd.c:672 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "multipla default-värden angivna för kolumn \"%s\" i tabell \"%s\"" -#: parser/parse_utilcmd.c:678 +#: parser/parse_utilcmd.c:689 #, c-format msgid "identity columns are not supported on typed tables" msgstr "identitetskolumner stöds inte på typade tabeller" -#: parser/parse_utilcmd.c:682 +#: parser/parse_utilcmd.c:693 #, c-format msgid "identity columns are not supported on partitions" msgstr "identitetskolumner stöds inte för partitioner" -#: parser/parse_utilcmd.c:691 +#: parser/parse_utilcmd.c:702 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "multipla identitetspecifikationer för kolumn \"%s\" i tabell \"%s\"" -#: parser/parse_utilcmd.c:711 +#: parser/parse_utilcmd.c:732 #, c-format msgid "generated columns are not supported on typed tables" msgstr "genererade kolumner stöds inte på typade tabeller" -#: parser/parse_utilcmd.c:715 +#: parser/parse_utilcmd.c:736 #, c-format msgid "generated columns are not supported on partitions" msgstr "genererade kolumner stöds inte för partitioner" -#: parser/parse_utilcmd.c:720 +#: parser/parse_utilcmd.c:741 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "multipla genereringsklausuler angivna för kolumn \"%s\" i tabell \"%s\"" -#: parser/parse_utilcmd.c:738 parser/parse_utilcmd.c:853 +#: parser/parse_utilcmd.c:759 parser/parse_utilcmd.c:874 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "primärnyckelvillkor stöds inte på främmande tabeller" -#: parser/parse_utilcmd.c:747 parser/parse_utilcmd.c:863 +#: parser/parse_utilcmd.c:768 parser/parse_utilcmd.c:884 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "unika villkor stöds inte på främmande tabeller" -#: parser/parse_utilcmd.c:792 +#: parser/parse_utilcmd.c:813 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "både default och identity angiven för kolumn \"%s\" i tabell \"%s\"" -#: parser/parse_utilcmd.c:800 +#: parser/parse_utilcmd.c:821 #, c-format msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" msgstr "både default och genereringsuttryck angiven för kolumn \"%s\" i tabell \"%s\"" -#: parser/parse_utilcmd.c:808 +#: parser/parse_utilcmd.c:829 #, c-format msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" msgstr "både identity och genereringsuttryck angiven för kolumn \"%s\" i tabell \"%s\"" -#: parser/parse_utilcmd.c:873 +#: parser/parse_utilcmd.c:894 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "uteslutningsvillkor stöds inte på främmande tabeller" -#: parser/parse_utilcmd.c:879 +#: parser/parse_utilcmd.c:900 #, c-format msgid "exclusion constraints are not supported on partitioned tables" msgstr "uteslutningsvillkor stöds inte för partitionerade tabeller" -#: parser/parse_utilcmd.c:944 +#: parser/parse_utilcmd.c:965 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE stöds inte för att skapa främmande tabeller" -#: parser/parse_utilcmd.c:1704 parser/parse_utilcmd.c:1813 +#: parser/parse_utilcmd.c:978 +#, fuzzy, c-format +#| msgid "relation \"%s\" in %s clause not found in FROM clause" +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "relationen \"%s\" i %s-klausul hittades inte i FROM-klausul" + +#: parser/parse_utilcmd.c:1744 parser/parse_utilcmd.c:1852 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "Index \"%s\" innehåller en hela-raden-referens." -#: parser/parse_utilcmd.c:2163 +#: parser/parse_utilcmd.c:2241 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "kan inte använda ett existerande index i CREATE TABLE" -#: parser/parse_utilcmd.c:2183 +#: parser/parse_utilcmd.c:2261 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "index \"%s\" är redan associerad med ett villkor" -#: parser/parse_utilcmd.c:2198 +#: parser/parse_utilcmd.c:2276 #, c-format msgid "index \"%s\" is not valid" msgstr "index \"%s\" är inte giltigt" -#: parser/parse_utilcmd.c:2204 +#: parser/parse_utilcmd.c:2282 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\" är inte ett unikt index" -#: parser/parse_utilcmd.c:2205 parser/parse_utilcmd.c:2212 -#: parser/parse_utilcmd.c:2219 parser/parse_utilcmd.c:2296 +#: parser/parse_utilcmd.c:2283 parser/parse_utilcmd.c:2290 +#: parser/parse_utilcmd.c:2297 parser/parse_utilcmd.c:2374 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "Kan inte skapa en primärnyckel eller ett unikt villkor med hjälp av ett sådant index." -#: parser/parse_utilcmd.c:2211 +#: parser/parse_utilcmd.c:2289 #, c-format msgid "index \"%s\" contains expressions" msgstr "index \"%s\" innehåller uttryck" -#: parser/parse_utilcmd.c:2218 +#: parser/parse_utilcmd.c:2296 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\" är ett partiellt index" -#: parser/parse_utilcmd.c:2230 +#: parser/parse_utilcmd.c:2308 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\" är ett \"deferrable\" index" -#: parser/parse_utilcmd.c:2231 +#: parser/parse_utilcmd.c:2309 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "Kan inte skapa ett icke-\"deferrable\" integritetsvillkor från ett \"deferrable\" index." -#: parser/parse_utilcmd.c:2295 +#: parser/parse_utilcmd.c:2373 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "index \"%s\" kolumn nummer %d har ingen standard för sorteringsbeteende" -#: parser/parse_utilcmd.c:2452 +#: parser/parse_utilcmd.c:2530 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "kolumn \"%s\" finns med två gånger i primära nyckel-villkoret" -#: parser/parse_utilcmd.c:2458 +#: parser/parse_utilcmd.c:2536 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "kolumn \"%s\" finns med två gånger i unique-villkoret" -#: parser/parse_utilcmd.c:2811 +#: parser/parse_utilcmd.c:2883 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "indexuttryck och predikat kan bara referera till tabellen som indexeras" -#: parser/parse_utilcmd.c:2857 +#: parser/parse_utilcmd.c:2955 +#, c-format +msgid "statistics expressions can refer only to the table being referenced" +msgstr "statistikuttryck kan bara referera till tabellen som är refererad" + +#: parser/parse_utilcmd.c:2998 #, c-format msgid "rules on materialized views are not supported" msgstr "regler på materialiserade vyer stöds inte" -#: parser/parse_utilcmd.c:2920 +#: parser/parse_utilcmd.c:3061 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "WHERE-villkor i regel kan inte innehålla referenser till andra relationer" -#: parser/parse_utilcmd.c:2994 +#: parser/parse_utilcmd.c:3134 #, c-format msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "regler med WHERE-villkor kan bara innehålla SELECT-, INSERT-, UPDATE- eller DELETE-handlingar" -#: parser/parse_utilcmd.c:3012 parser/parse_utilcmd.c:3113 -#: rewrite/rewriteHandler.c:502 rewrite/rewriteManip.c:1018 +#: parser/parse_utilcmd.c:3152 parser/parse_utilcmd.c:3253 +#: rewrite/rewriteHandler.c:508 rewrite/rewriteManip.c:1018 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "UNION-/INTERSECT-/EXCEPT-satser med villkor är inte implementerat" -#: parser/parse_utilcmd.c:3030 +#: parser/parse_utilcmd.c:3170 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "ON SELECT-regel kan inte använda OLD" -#: parser/parse_utilcmd.c:3034 +#: parser/parse_utilcmd.c:3174 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "ON SELECT-regel kan inte använda NEW" -#: parser/parse_utilcmd.c:3043 +#: parser/parse_utilcmd.c:3183 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "ON INSERT-regel kan inte använda OLD" -#: parser/parse_utilcmd.c:3049 +#: parser/parse_utilcmd.c:3189 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "ON DELETE-regel kan inte använda NEW" -#: parser/parse_utilcmd.c:3077 +#: parser/parse_utilcmd.c:3217 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "kan inte referera till OLD i WITH-fråga" -#: parser/parse_utilcmd.c:3084 +#: parser/parse_utilcmd.c:3224 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "kan inte referera till NEW i WITH-fråga" -#: parser/parse_utilcmd.c:3542 +#: parser/parse_utilcmd.c:3678 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "felplacerad DEFERRABLE-klausul" -#: parser/parse_utilcmd.c:3547 parser/parse_utilcmd.c:3562 +#: parser/parse_utilcmd.c:3683 parser/parse_utilcmd.c:3698 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "multipla DEFERRABLE/NOT DEFERRABLE-klausuler tillåts inte" -#: parser/parse_utilcmd.c:3557 +#: parser/parse_utilcmd.c:3693 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "felplacerad NOT DEFERRABLE-klausul" -#: parser/parse_utilcmd.c:3578 +#: parser/parse_utilcmd.c:3714 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "felplacerad INITIALLY DEFERRED-klausul" -#: parser/parse_utilcmd.c:3583 parser/parse_utilcmd.c:3609 +#: parser/parse_utilcmd.c:3719 parser/parse_utilcmd.c:3745 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "multipla INITIALLY IMMEDIATE/DEFERRED-klausuler tillåts inte" -#: parser/parse_utilcmd.c:3604 +#: parser/parse_utilcmd.c:3740 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "felplacerad klausul INITIALLY IMMEDIATE" -#: parser/parse_utilcmd.c:3795 +#: parser/parse_utilcmd.c:3931 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATE anger ett schema (%s) som skiljer sig från det som skapas (%s)" -#: parser/parse_utilcmd.c:3830 +#: parser/parse_utilcmd.c:3966 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\" är inte en partitionerad tabell" -#: parser/parse_utilcmd.c:3837 +#: parser/parse_utilcmd.c:3973 #, c-format msgid "table \"%s\" is not partitioned" msgstr "tabell \"%s\" är inte partitionerad" -#: parser/parse_utilcmd.c:3844 +#: parser/parse_utilcmd.c:3980 #, c-format msgid "index \"%s\" is not partitioned" msgstr "index \"%s\" är inte partitionerad" -#: parser/parse_utilcmd.c:3884 +#: parser/parse_utilcmd.c:4020 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "en hash-partitionerad tabell får inte ha en standardpartition" -#: parser/parse_utilcmd.c:3901 +#: parser/parse_utilcmd.c:4037 #, c-format msgid "invalid bound specification for a hash partition" msgstr "ogiltig gränsangivelse för hash-partition" -#: parser/parse_utilcmd.c:3907 partitioning/partbounds.c:4691 +#: parser/parse_utilcmd.c:4043 partitioning/partbounds.c:4823 #, c-format -msgid "modulus for hash partition must be a positive integer" -msgstr "modulo för hash-partition vara ett positivt integer" +msgid "modulus for hash partition must be an integer value greater than zero" +msgstr "modulo för hash-partition vara ett heltalsvärde större än noll" -#: parser/parse_utilcmd.c:3914 partitioning/partbounds.c:4699 +#: parser/parse_utilcmd.c:4050 partitioning/partbounds.c:4831 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "rest för hash-partition måste vara lägre än modulo" -#: parser/parse_utilcmd.c:3927 +#: parser/parse_utilcmd.c:4063 #, c-format msgid "invalid bound specification for a list partition" msgstr "ogiltig gränsangivelse för listpartition" -#: parser/parse_utilcmd.c:3980 +#: parser/parse_utilcmd.c:4116 #, c-format msgid "invalid bound specification for a range partition" msgstr "ogiltig gränsangivelse för range-partition" -#: parser/parse_utilcmd.c:3986 +#: parser/parse_utilcmd.c:4122 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROM måste ge exakt ett värde per partitionerande kolumn" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:4126 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TO måste ge exakt ett värde per partitionerande kolumn" -#: parser/parse_utilcmd.c:4104 +#: parser/parse_utilcmd.c:4240 #, c-format msgid "cannot specify NULL in range bound" msgstr "kan inte ange NULL i range-gräns" -#: parser/parse_utilcmd.c:4153 +#: parser/parse_utilcmd.c:4289 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "varje gräns efter MAXVALUE måste också vara MAXVALUE" -#: parser/parse_utilcmd.c:4160 +#: parser/parse_utilcmd.c:4296 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "varje gräns efter MINVALUE måste också vara MINVALUE" -#: parser/parse_utilcmd.c:4202 -#, c-format -msgid "could not determine which collation to use for partition bound expression" -msgstr "kunde inte bestämma vilken jämförelse (collation) som skulle användas för partitionsgränsuttryck" - -#: parser/parse_utilcmd.c:4219 -#, c-format -msgid "collation of partition bound value for column \"%s\" does not match partition key collation \"%s\"" -msgstr "jämförelse (collation) av partitioneringsgränsvärde \"%s\" matchar inte partitioneringsnyckelns jämförelse \"%s\"" - -#: parser/parse_utilcmd.c:4236 +#: parser/parse_utilcmd.c:4339 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "angivet värde kan inte typomvandlas till typ %s för kolumn \"%s\"" -#: parser/parser.c:228 +#: parser/parser.c:263 msgid "UESCAPE must be followed by a simple string literal" msgstr "UESCAPE måste följas av en enkel stränglitteral" -#: parser/parser.c:233 +#: parser/parser.c:268 msgid "invalid Unicode escape character" msgstr "ogiltigt Unicode-escapetecken" -#: parser/parser.c:302 scan.l:1329 +#: parser/parser.c:337 scan.l:1338 #, c-format msgid "invalid Unicode escape value" msgstr "ogiltigt Unicode-escapevärde" -#: parser/parser.c:449 scan.l:677 +#: parser/parser.c:484 scan.l:684 utils/adt/varlena.c:6533 #, c-format msgid "invalid Unicode escape" msgstr "ogiltig Unicode-escapesekvens" -#: parser/parser.c:450 +#: parser/parser.c:485 #, c-format msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Unicode-escapesekvenser måste vara \\XXXX eller \\+XXXXXX." -#: parser/parser.c:478 scan.l:638 scan.l:654 scan.l:670 +#: parser/parser.c:513 scan.l:645 scan.l:661 scan.l:677 +#: utils/adt/varlena.c:6558 #, c-format msgid "invalid Unicode surrogate pair" msgstr "ogiltigt Unicode-surrogatpar" -#: parser/scansup.c:203 +#: parser/scansup.c:101 #, c-format -msgid "identifier \"%s\" will be truncated to \"%s\"" -msgstr "identifierare \"%s\" kommer trunkeras till \"%s\"" +msgid "identifier \"%s\" will be truncated to \"%.*s\"" +msgstr "identifierare \"%s\" kommer trunkeras till \"%.*s\"" -#: partitioning/partbounds.c:2831 +#: partitioning/partbounds.c:2932 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "partition \"%s\" står i konflikt med existerande default-partition \"%s\"" -#: partitioning/partbounds.c:2890 +#: partitioning/partbounds.c:2984 partitioning/partbounds.c:3003 +#: partitioning/partbounds.c:3025 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "varje hash-partition-modulo måste vara en faktror av näste högre modulo" -#: partitioning/partbounds.c:2986 +#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3026 +#, c-format +msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." +msgstr "Ny modulon %d är inte en faktor av %d som är modulo för den existerande partitionen \"%s\"." + +#: partitioning/partbounds.c:3004 +#, c-format +msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." +msgstr "Ny modulon %d är inte delbar med %d som är modulo för den existerande paritionen \"%s\"." + +#: partitioning/partbounds.c:3139 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "tom intervallsgräns angiven för partition \"%s\"" -#: partitioning/partbounds.c:2988 +#: partitioning/partbounds.c:3141 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "Angiven lägre gräns %s är större än eller lika med övre gräns %s." -#: partitioning/partbounds.c:3085 +#: partitioning/partbounds.c:3253 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "partition \"%s\" skulle överlappa partition \"%s\"" -#: partitioning/partbounds.c:3202 +#: partitioning/partbounds.c:3370 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "hoppade över skanning av främmand tabell \"%s\" som er en partition för standardpartitionen \"%s\"" -#: partitioning/partbounds.c:4695 +#: partitioning/partbounds.c:4827 #, c-format -msgid "remainder for hash partition must be a non-negative integer" -msgstr "rest för hash-partition måste vara ett icke-negativt heltal" +msgid "remainder for hash partition must be an integer value greater than or equal to zero" +msgstr "rest för hash-partition måste vara ett heltalsvärde större än eller lika med noll" -#: partitioning/partbounds.c:4722 +#: partitioning/partbounds.c:4851 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\" är inte en hash-partitionerad tabell" -#: partitioning/partbounds.c:4733 partitioning/partbounds.c:4850 +#: partitioning/partbounds.c:4862 partitioning/partbounds.c:4979 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "antalet partitioneringskolumner (%d) stämmer inte med antalet partioneringsnycklas som angivits (%d)" -#: partitioning/partbounds.c:4755 partitioning/partbounds.c:4787 +#: partitioning/partbounds.c:4884 +#, c-format +msgid "column %d of the partition key has type %s, but supplied value is of type %s" +msgstr "kolumn %d i partitioneringsnyckeln har typ %s men använt värde har typ %s" + +#: partitioning/partbounds.c:4916 #, c-format msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" msgstr "kolumn %d i partitioneringsnyckeln har typ \"%s\" men använt värde har typ \"%s\"" -#: port/pg_sema.c:209 port/pg_shmem.c:640 port/posix_sema.c:209 -#: port/sysv_sema.c:327 port/sysv_shmem.c:640 +#: port/pg_sema.c:209 port/pg_shmem.c:695 port/posix_sema.c:209 +#: port/sysv_sema.c:327 port/sysv_shmem.c:695 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "kunde inte göra stat() på datakatalog \"%s\": %m" -#: port/pg_shmem.c:216 port/sysv_shmem.c:216 +#: port/pg_shmem.c:227 port/sysv_shmem.c:227 #, c-format msgid "could not create shared memory segment: %m" msgstr "kunde inte skapa delat minnessegment: %m" -#: port/pg_shmem.c:217 port/sysv_shmem.c:217 +#: port/pg_shmem.c:228 port/sysv_shmem.c:228 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "Misslyckade systemanropet var semget(key=%lu, size=%zu, 0%o)." -#: port/pg_shmem.c:221 port/sysv_shmem.c:221 +#: port/pg_shmem.c:232 port/sysv_shmem.c:232 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" @@ -17069,7 +18631,7 @@ msgstr "" "Felet betyder vanligen att PostgreSQLs begäran av delat minnessegment överskred kärnans SHMMAX-parameter eller möjligen att det är lägre än kärnans SHMMIN-parameter.\n" "PostgreSQLs dokumentation innehåller mer information om konfigueration av delat minne." -#: port/pg_shmem.c:228 port/sysv_shmem.c:228 +#: port/pg_shmem.c:239 port/sysv_shmem.c:239 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" @@ -17078,7 +18640,7 @@ msgstr "" "Felet betyder vanligen att PostgreSQLs begäran av delat minnessegment överskred kärnans SHMALL-parameter. Du kan behöva rekonfigurera kärnan med ett större SHMALL.\n" "PostgreSQLs dokumentation innehåller mer information om konfigueration av delat minne." -#: port/pg_shmem.c:234 port/sysv_shmem.c:234 +#: port/pg_shmem.c:245 port/sysv_shmem.c:245 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" @@ -17087,27 +18649,32 @@ msgstr "" "Felet betyder *inte* att diskutrymmet tagit slut. Felet sker aningen om alla tillgängliga ID-nummer för delat minne tagit slut och då behöver du öka kärnans SHMMNI-parameter eller för att systemets totala gräns för delat minne ha nåtts.\n" "PostgreSQLs dokumentation innehåller mer information om konfigueration av delat minne." -#: port/pg_shmem.c:578 port/sysv_shmem.c:578 +#: port/pg_shmem.c:633 port/sysv_shmem.c:633 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "kunde inte mappa anonymt delat minne: %m" -#: port/pg_shmem.c:580 port/sysv_shmem.c:580 +#: port/pg_shmem.c:635 port/sysv_shmem.c:635 #, c-format msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections." msgstr "Detta fel betyder vanligtvis att PostgreSQL:s begäran av delat minnessegment överskrider mängden tillgängligt minne, swap eller stora sidor. För att minska begärd storlek (nu %zu byte) minska PostgreSQL:s användning av delat minne t.ex. genom att dra ner på shared_buffers eller max_connections." -#: port/pg_shmem.c:648 port/sysv_shmem.c:648 +#: port/pg_shmem.c:703 port/sysv_shmem.c:703 #, c-format msgid "huge pages not supported on this platform" msgstr "stora sidor stöds inte på denna plattform" -#: port/pg_shmem.c:709 port/sysv_shmem.c:709 utils/init/miscinit.c:1137 +#: port/pg_shmem.c:710 port/sysv_shmem.c:710 +#, c-format +msgid "huge pages not supported with the current shared_memory_type setting" +msgstr "stora sidor stöds inte vid nuvarande inställning av shared_memory_type" + +#: port/pg_shmem.c:770 port/sysv_shmem.c:770 utils/init/miscinit.c:1187 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "redan existerande delat minnesblock (nyckel %lu, ID %lu) används fortfarande" -#: port/pg_shmem.c:712 port/sysv_shmem.c:712 utils/init/miscinit.c:1139 +#: port/pg_shmem.c:773 port/sysv_shmem.c:773 utils/init/miscinit.c:1189 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "Stäng ner gamla serverprocesser som hör ihop med datakatalogen \"%s\"." @@ -17134,37 +18701,37 @@ msgstr "Detta fel betyder *inte* att disken blivit full. Detta fel kommer när s msgid "You possibly need to raise your kernel's SEMVMX value to be at least %d. Look into the PostgreSQL documentation for details." msgstr "Du kan behöva öka kärnans SEMVMX-värde till minst %d. Se PostgreSQL:s dokumentation för mer information." -#: port/win32/crashdump.c:121 +#: port/win32/crashdump.c:119 #, c-format msgid "could not load dbghelp.dll, cannot write crash dump\n" msgstr "kunde inte ladda dbghelp.dll, kan inte skiva krash-dump\n" -#: port/win32/crashdump.c:129 +#: port/win32/crashdump.c:127 #, c-format msgid "could not load required functions in dbghelp.dll, cannot write crash dump\n" msgstr "kunde inte ladda behövda funktioner i dbghelp.dll, kan inte skriva krash-dump\n" -#: port/win32/crashdump.c:160 +#: port/win32/crashdump.c:158 #, c-format msgid "could not open crash dump file \"%s\" for writing: error code %lu\n" msgstr "kunde inte öppna krashdumpfil \"%s\" för skrivning: felkod %lu\n" -#: port/win32/crashdump.c:167 +#: port/win32/crashdump.c:165 #, c-format msgid "wrote crash dump to file \"%s\"\n" msgstr "skrev krashdump till fil \"%s\".\n" -#: port/win32/crashdump.c:169 +#: port/win32/crashdump.c:167 #, c-format msgid "could not write crash dump to file \"%s\": error code %lu\n" msgstr "kunde inte skriva krashdump till fil \"%s\": felkod %lu\n" -#: port/win32/signal.c:196 +#: port/win32/signal.c:206 #, c-format msgid "could not create signal listener pipe for PID %d: error code %lu" msgstr "kunde inte skapa signallyssnarrör (pipe) för PID %d: felkod %lu" -#: port/win32/signal.c:251 +#: port/win32/signal.c:261 #, c-format msgid "could not create signal listener pipe: error code %lu; retrying\n" msgstr "kunde inte skapa signallyssnar-pipe: felkod %lu; försöker igen\n" @@ -17189,521 +18756,362 @@ msgstr "kunde inte låsa upp semafor: felkod %lu" msgid "could not try-lock semaphore: error code %lu" msgstr "kunde inte utföra \"try-lock\" på semafor: felkod %lu" -#: port/win32_shmem.c:144 port/win32_shmem.c:152 port/win32_shmem.c:164 -#: port/win32_shmem.c:179 +#: port/win32_shmem.c:144 port/win32_shmem.c:159 port/win32_shmem.c:171 +#: port/win32_shmem.c:187 #, c-format -msgid "could not enable Lock Pages in Memory user right: error code %lu" -msgstr "kunde inte aktivera användarrättigheten \"Lock Pages in Memory\": felkod %lu" +msgid "could not enable user right \"%s\": error code %lu" +msgstr "kunde inte aktivera användarrättighet \"%s\": felkod %lu" + +#. translator: This is a term from Windows and should be translated to +#. match the Windows localization. +#. +#: port/win32_shmem.c:150 port/win32_shmem.c:159 port/win32_shmem.c:171 +#: port/win32_shmem.c:182 port/win32_shmem.c:184 port/win32_shmem.c:187 +msgid "Lock pages in memory" +msgstr "Lås sidor i minnet" -#: port/win32_shmem.c:145 port/win32_shmem.c:153 port/win32_shmem.c:165 -#: port/win32_shmem.c:180 +#: port/win32_shmem.c:152 port/win32_shmem.c:160 port/win32_shmem.c:172 +#: port/win32_shmem.c:188 #, c-format msgid "Failed system call was %s." msgstr "Misslyckat systemanrop var %s." -#: port/win32_shmem.c:175 +#: port/win32_shmem.c:182 #, c-format -msgid "could not enable Lock Pages in Memory user right" -msgstr "kunde inte aktivera användarrättigheten \"Lock Pages in Memory\"" +msgid "could not enable user right \"%s\"" +msgstr "kunde inte aktivera användarrättighet \"%s\"" -#: port/win32_shmem.c:176 +#: port/win32_shmem.c:183 #, c-format -msgid "Assign Lock Pages in Memory user right to the Windows user account which runs PostgreSQL." -msgstr "Tilldela användarrättigheten \"Lock Pages in Memory\" till Windows-användarkontot som kör PostgreSQL." +msgid "Assign user right \"%s\" to the Windows user account which runs PostgreSQL." +msgstr "Sätt användarrättighet \"%s\" på Windows-användarkontot som kör PostgreSQL." -#: port/win32_shmem.c:233 +#: port/win32_shmem.c:241 #, c-format msgid "the processor does not support large pages" msgstr "processorn stöder inte stora sidor" -#: port/win32_shmem.c:235 port/win32_shmem.c:240 -#, c-format -msgid "disabling huge pages" -msgstr "stänger av stora sidor" - -#: port/win32_shmem.c:302 port/win32_shmem.c:338 port/win32_shmem.c:356 +#: port/win32_shmem.c:310 port/win32_shmem.c:346 port/win32_shmem.c:364 #, c-format msgid "could not create shared memory segment: error code %lu" msgstr "kunde inte skapa delat minnessegment: felkod %lu" -#: port/win32_shmem.c:303 +#: port/win32_shmem.c:311 #, c-format msgid "Failed system call was CreateFileMapping(size=%zu, name=%s)." msgstr "Misslyckade systemanropet var CreateFileMapping(size=%zu, name=%s)." -#: port/win32_shmem.c:328 +#: port/win32_shmem.c:336 #, c-format msgid "pre-existing shared memory block is still in use" msgstr "redan existerande delat minnesblock används fortfarande" -#: port/win32_shmem.c:329 +#: port/win32_shmem.c:337 #, c-format msgid "Check if there are any old server processes still running, and terminate them." msgstr "Kontrollera om det finns några gamla serverprocesser som fortfarande kör och stäng ner dem." -#: port/win32_shmem.c:339 +#: port/win32_shmem.c:347 #, c-format msgid "Failed system call was DuplicateHandle." msgstr "Misslyckat systemanrop var DuplicateHandle." -#: port/win32_shmem.c:357 +#: port/win32_shmem.c:365 #, c-format msgid "Failed system call was MapViewOfFileEx." msgstr "Misslyckat systemanrop var MapViewOfFileEx." -#: postmaster/autovacuum.c:406 +#: postmaster/autovacuum.c:404 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "kunde inte starta autovacuum-process: %m" -#: postmaster/autovacuum.c:442 -#, c-format -msgid "autovacuum launcher started" -msgstr "autovacuum-startare startad" - -#: postmaster/autovacuum.c:839 +#: postmaster/autovacuum.c:752 #, c-format -msgid "autovacuum launcher shutting down" -msgstr "autovacuum-startare stänger ner" +msgid "autovacuum worker took too long to start; canceled" +msgstr "autovacuum-arbetaren tog för lång tid på sig att starta; avbruten" -#: postmaster/autovacuum.c:1477 +#: postmaster/autovacuum.c:1482 #, c-format msgid "could not fork autovacuum worker process: %m" msgstr "kunde inte starta autovacuum-arbetsprocess: %m" -#: postmaster/autovacuum.c:1686 -#, c-format -msgid "autovacuum: processing database \"%s\"" -msgstr "autovacuum: processar databas \"%s\"" - -#: postmaster/autovacuum.c:2256 +#: postmaster/autovacuum.c:2261 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "autovacuum: slänger övergiven temptabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2485 +#: postmaster/autovacuum.c:2486 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "automatisk vacuum av tabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2488 +#: postmaster/autovacuum.c:2489 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "automatisk analys av tabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2681 +#: postmaster/autovacuum.c:2682 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "processar arbetspost för relation \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3285 +#: postmaster/autovacuum.c:3293 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "autovacuum har inte startats på grund av en felkonfigurering" -#: postmaster/autovacuum.c:3286 +#: postmaster/autovacuum.c:3294 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Slå på flaggan \"track_counts\"." -#: postmaster/bgworker.c:394 postmaster/bgworker.c:841 -#, c-format -msgid "registering background worker \"%s\"" -msgstr "registrerar bakgrundsarbetare \"%s\"" - -#: postmaster/bgworker.c:426 +#: postmaster/bgworker.c:256 #, c-format -msgid "unregistering background worker \"%s\"" -msgstr "avregistrerar bakgrundsarbetare \"%s\"" +msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" +msgstr "inkonsistent tillstånd i bakgrundsarbetare (max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:591 +#: postmaster/bgworker.c:666 #, c-format -msgid "background worker \"%s\": must attach to shared memory in order to request a database connection" -msgstr "bakgrundsarbetare \"%s\": måste ansluta till delat minne för att kunna få en databasanslutning" +msgid "background worker \"%s\": background worker without shared memory access are not supported" +msgstr "bakgrundsarbetare \"%s\": bakgrundsarbetare utan access till delat minne stöds inte" -#: postmaster/bgworker.c:600 +#: postmaster/bgworker.c:677 #, c-format msgid "background worker \"%s\": cannot request database access if starting at postmaster start" msgstr "bakgrundsarbetare \"%s\" kan inte få databasaccess om den startar när postmaster startar" -#: postmaster/bgworker.c:614 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "bakgrundsarbetare \"%s\": ogiltigt omstartsintervall" -#: postmaster/bgworker.c:629 +#: postmaster/bgworker.c:706 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "bakgrundsarbetare \"%s\": parallella arbetare kan inte konfigureras för omstart" -#: postmaster/bgworker.c:653 +#: postmaster/bgworker.c:730 tcop/postgres.c:3201 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "terminerar bakgrundsarbetare \"%s\" pga administratörskommando" -#: postmaster/bgworker.c:849 +#: postmaster/bgworker.c:887 #, c-format msgid "background worker \"%s\": must be registered in shared_preload_libraries" msgstr "bakgrundsarbetare \"%s\": måste vara registrerad i shared_preload_libraries" -#: postmaster/bgworker.c:861 +#: postmaster/bgworker.c:899 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "bakgrundsarbetare \"%s\": bara dynamiska bakgrundsarbetare kan be om notifiering" -#: postmaster/bgworker.c:876 +#: postmaster/bgworker.c:914 #, c-format msgid "too many background workers" msgstr "för många bakgrundsarbetare" -#: postmaster/bgworker.c:877 +#: postmaster/bgworker.c:915 #, c-format msgid "Up to %d background worker can be registered with the current settings." msgid_plural "Up to %d background workers can be registered with the current settings." msgstr[0] "Upp till %d bakgrundsarbetare kan registreras med nuvarande inställning." msgstr[1] "Upp till %d bakgrundsarbetare kan registreras med nuvarande inställning." -#: postmaster/bgworker.c:881 +#: postmaster/bgworker.c:919 #, c-format msgid "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "Överväg att öka konfigurationsparametern \"max_worker_processes\"." -#: postmaster/checkpointer.c:418 +#: postmaster/checkpointer.c:432 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" msgstr[0] "checkpoint:s sker för ofta (%d sekund emellan)" msgstr[1] "checkpoint:s sker för ofta (%d sekunder emellan)" -#: postmaster/checkpointer.c:422 +#: postmaster/checkpointer.c:436 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "Överväg att öka konfigurationsparametern \"max_wal_size\"." -#: postmaster/checkpointer.c:1032 +#: postmaster/checkpointer.c:1060 #, c-format msgid "checkpoint request failed" msgstr "checkpoint-behgäran misslyckades" -#: postmaster/checkpointer.c:1033 +#: postmaster/checkpointer.c:1061 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Se senaste meddelanden i serverloggen för mer information." -#: postmaster/checkpointer.c:1217 -#, c-format -msgid "compacted fsync request queue from %d entries to %d entries" -msgstr "minskade fsync-kön från %d poster till %d poster" - -#: postmaster/pgarch.c:155 -#, c-format -msgid "could not fork archiver: %m" -msgstr "kunde inte fork():a arkiveraren: %m" - -#: postmaster/pgarch.c:425 +#: postmaster/pgarch.c:429 #, c-format -msgid "archive_mode enabled, yet archive_command is not set" -msgstr "archive_mode är påslagen, men ändå är archive_command inte satt" +msgid "archive_mode enabled, yet archiving is not configured" +msgstr "archive_mode är påslagen, men ändå är arkivering inte konfigurerad" -#: postmaster/pgarch.c:447 +#: postmaster/pgarch.c:451 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "tog bort övergiven arkivstatusfil \"%s\": %m" -#: postmaster/pgarch.c:457 +#: postmaster/pgarch.c:461 #, c-format msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" msgstr "borttagning av övergiven arkivstatusfil \"%s\" misslyckades för många gånger, kommer försöka igen senare" -#: postmaster/pgarch.c:493 +#: postmaster/pgarch.c:497 #, c-format msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" msgstr "arkivering av write-ahead-logg-fil \"%s\" misslyckades för många gånger, kommer försöka igen senare" -#: postmaster/pgarch.c:594 -#, c-format -msgid "archive command failed with exit code %d" -msgstr "arkiveringskommando misslyckades med felkod %d" - -#: postmaster/pgarch.c:596 postmaster/pgarch.c:606 postmaster/pgarch.c:612 -#: postmaster/pgarch.c:621 -#, c-format -msgid "The failed archive command was: %s" -msgstr "Det misslyckade arkiveringskommandot var: %s" - -#: postmaster/pgarch.c:603 -#, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "arkiveringskommandot terminerades med avbrott 0x%X" - -#: postmaster/pgarch.c:605 postmaster/postmaster.c:3742 -#, c-format -msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." -msgstr "Se C-include-fil \"ntstatus.h\" för en beskrivning av det hexdecimala värdet." - -#: postmaster/pgarch.c:610 -#, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "arkiveringskommandot terminerades av signal %d: %s" - -#: postmaster/pgarch.c:619 -#, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "arkiveringskommandot avslutade med okänd statuskod %d" - -#: postmaster/pgstat.c:419 -#, c-format -msgid "could not resolve \"localhost\": %s" -msgstr "kunde inte slå upp \"localhost\": %s" - -#: postmaster/pgstat.c:442 -#, c-format -msgid "trying another address for the statistics collector" -msgstr "försöker med en annan adress till statistikinsamlare" - -#: postmaster/pgstat.c:451 -#, c-format -msgid "could not create socket for statistics collector: %m" -msgstr "kunde inte skapa uttag (socket) för statistikinsamlare: %m" - -#: postmaster/pgstat.c:463 -#, c-format -msgid "could not bind socket for statistics collector: %m" -msgstr "kunde inte göra bind på uttag (socket) för statistikinsamlare: %m" - -#: postmaster/pgstat.c:474 -#, c-format -msgid "could not get address of socket for statistics collector: %m" -msgstr "kunde inte få adress till uttag (socket) för statistikinsamlare: %m" - -#: postmaster/pgstat.c:490 -#, c-format -msgid "could not connect socket for statistics collector: %m" -msgstr "kunde inte ansluta uttag (socket) för statistikinsamlare: %m" - -#: postmaster/pgstat.c:511 -#, c-format -msgid "could not send test message on socket for statistics collector: %m" -msgstr "kunde inte skicka testmeddelande till uttag (socket) för statistikinsamlaren: %m" - -#: postmaster/pgstat.c:537 -#, c-format -msgid "select() failed in statistics collector: %m" -msgstr "select() misslyckades i statistikinsamlaren: %m" - -#: postmaster/pgstat.c:552 -#, c-format -msgid "test message did not get through on socket for statistics collector" -msgstr "testmeddelande kom inte igenom på uttag (socket) för statistikinsamlare" - -#: postmaster/pgstat.c:567 -#, c-format -msgid "could not receive test message on socket for statistics collector: %m" -msgstr "kunde inte ta emot testmeddelande på uttag (socket) för statistikinsamlaren: %m" - -#: postmaster/pgstat.c:577 -#, c-format -msgid "incorrect test message transmission on socket for statistics collector" -msgstr "inkorrekt överföring av testmeddelande på uttag (socket) till statistikinsamlare" - -#: postmaster/pgstat.c:600 -#, c-format -msgid "could not set statistics collector socket to nonblocking mode: %m" -msgstr "kunde inte sätta statistikinsamlarens uttag (socket) till ickeblockerande läge: %m" - -#: postmaster/pgstat.c:642 -#, c-format -msgid "disabling statistics collector for lack of working socket" -msgstr "stänger av statistikinsamlare då arbetsuttag (socket) saknas" - -#: postmaster/pgstat.c:789 -#, c-format -msgid "could not fork statistics collector: %m" -msgstr "kunde inte fork():a statistikinsamlaren: %m" - -#: postmaster/pgstat.c:1376 -#, c-format -msgid "unrecognized reset target: \"%s\"" -msgstr "okänt återställningsmål \"%s\"" - -#: postmaster/pgstat.c:1377 -#, c-format -msgid "Target must be \"archiver\" or \"bgwriter\"." -msgstr "Målet måste vara \"archiver\" eller \"bgwriter\"." - -#: postmaster/pgstat.c:4561 -#, c-format -msgid "could not read statistics message: %m" -msgstr "kunde inte läsa statistikmeddelande: %m" - -#: postmaster/pgstat.c:4883 postmaster/pgstat.c:5046 -#, c-format -msgid "could not open temporary statistics file \"%s\": %m" -msgstr "kunde inte öppna temporär statistikfil \"%s\": %m" - -#: postmaster/pgstat.c:4956 postmaster/pgstat.c:5091 -#, c-format -msgid "could not write temporary statistics file \"%s\": %m" -msgstr "kunde inte skriva temporär statistikfil \"%s\": %m" - -#: postmaster/pgstat.c:4965 postmaster/pgstat.c:5100 -#, c-format -msgid "could not close temporary statistics file \"%s\": %m" -msgstr "kunde inte stänga temporär statistikfil \"%s\": %m" - -#: postmaster/pgstat.c:4973 postmaster/pgstat.c:5108 -#, c-format -msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" -msgstr "kunde inte döpa om temporär statistikfil \"%s\" till \"%s\": %m" - -#: postmaster/pgstat.c:5205 postmaster/pgstat.c:5422 postmaster/pgstat.c:5576 -#, c-format -msgid "could not open statistics file \"%s\": %m" -msgstr "kunde inte öppna statistikfil \"%s\": %m" - -#: postmaster/pgstat.c:5217 postmaster/pgstat.c:5227 postmaster/pgstat.c:5248 -#: postmaster/pgstat.c:5259 postmaster/pgstat.c:5281 postmaster/pgstat.c:5296 -#: postmaster/pgstat.c:5359 postmaster/pgstat.c:5434 postmaster/pgstat.c:5454 -#: postmaster/pgstat.c:5472 postmaster/pgstat.c:5488 postmaster/pgstat.c:5506 -#: postmaster/pgstat.c:5522 postmaster/pgstat.c:5588 postmaster/pgstat.c:5600 -#: postmaster/pgstat.c:5612 postmaster/pgstat.c:5623 postmaster/pgstat.c:5648 -#: postmaster/pgstat.c:5670 +#: postmaster/pgarch.c:809 #, c-format -msgid "corrupted statistics file \"%s\"" -msgstr "korrupt statistikfil \"%s\"" +msgid "restarting archiver process because value of \"archive_library\" was changed" +msgstr "" -#: postmaster/pgstat.c:5799 +#: postmaster/pgarch.c:842 #, c-format -msgid "using stale statistics instead of current ones because stats collector is not responding" -msgstr "använder gammal statistik istället för aktuell data då statistikinsamlaren inte svarar" +msgid "archive modules have to declare the _PG_archive_module_init symbol" +msgstr "" -#: postmaster/pgstat.c:6129 +#: postmaster/pgarch.c:848 #, c-format -msgid "database hash table corrupted during cleanup --- abort" -msgstr "databasens hashtabell har blivit korrupt vid uppstädning --- avbryter" +msgid "archive modules must register an archive callback" +msgstr "" -#: postmaster/postmaster.c:733 +#: postmaster/postmaster.c:744 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: ogiltigt argument till flagga -f: \"%s\"\n" -#: postmaster/postmaster.c:819 +#: postmaster/postmaster.c:823 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: ogiltigt argument till flagga -t: \"%s\"\n" -#: postmaster/postmaster.c:870 +#: postmaster/postmaster.c:874 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: ogiltigt argument: \"%s\"\n" -#: postmaster/postmaster.c:912 +#: postmaster/postmaster.c:942 #, c-format msgid "%s: superuser_reserved_connections (%d) must be less than max_connections (%d)\n" msgstr "%s: superuser_reserved_connections (%d) måste vara mindre än max_connections (%d)\n" -#: postmaster/postmaster.c:919 +#: postmaster/postmaster.c:949 #, c-format msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" msgstr "WAL-arkivering kan inte slås på när wal_level är \"minimal\"" -#: postmaster/postmaster.c:922 +#: postmaster/postmaster.c:952 #, c-format msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" msgstr "WAL-strömning (max_wal_senders > 0) kräver wal_level \"replica\" eller \"logical\"" -#: postmaster/postmaster.c:930 +#: postmaster/postmaster.c:960 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: ogiltiga datumtokentabeller, det behöver lagas\n" -#: postmaster/postmaster.c:1047 +#: postmaster/postmaster.c:1108 #, c-format msgid "could not create I/O completion port for child queue" msgstr "kunde inte skapa \"I/O completion port\" för barnkö" -#: postmaster/postmaster.c:1113 +#: postmaster/postmaster.c:1173 #, c-format msgid "ending log output to stderr" msgstr "avslutar loggutmatning till stderr" -#: postmaster/postmaster.c:1114 +#: postmaster/postmaster.c:1174 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "Framtida loggutmatning kommer gå till logg-destination \"%s\"." -#: postmaster/postmaster.c:1125 +#: postmaster/postmaster.c:1185 #, c-format msgid "starting %s" msgstr "startar %s" -#: postmaster/postmaster.c:1154 postmaster/postmaster.c:1252 -#: utils/init/miscinit.c:1597 +#: postmaster/postmaster.c:1214 postmaster/postmaster.c:1313 +#: utils/init/miscinit.c:1648 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "ogiltigt listsyntax för parameter \"%s\"" -#: postmaster/postmaster.c:1185 +#: postmaster/postmaster.c:1245 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "kunde inte skapa lyssnande uttag (socket) för \"%s\"" -#: postmaster/postmaster.c:1191 +#: postmaster/postmaster.c:1251 #, c-format msgid "could not create any TCP/IP sockets" msgstr "kunde inte skapa TCP/IP-uttag (socket)" -#: postmaster/postmaster.c:1274 +#: postmaster/postmaster.c:1283 +#, c-format +msgid "DNSServiceRegister() failed: error code %ld" +msgstr "DNSServiceRegister() misslyckades: felkod %ld" + +#: postmaster/postmaster.c:1335 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "kunde inte skapa unix-domän-uttag (socket) i katalog \"%s\"" -#: postmaster/postmaster.c:1280 +#: postmaster/postmaster.c:1341 #, c-format msgid "could not create any Unix-domain sockets" msgstr "kunde inte skapa något Unix-domän-uttag (socket)" -#: postmaster/postmaster.c:1292 +#: postmaster/postmaster.c:1353 #, c-format msgid "no socket created for listening" msgstr "inget uttag (socket) skapat för lyssnande" -#: postmaster/postmaster.c:1323 +#: postmaster/postmaster.c:1384 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %s\n" msgstr "%s: kunde inte ändra rättigheter på extern PID-fil \"%s\": %s\n" -#: postmaster/postmaster.c:1327 +#: postmaster/postmaster.c:1388 #, c-format msgid "%s: could not write external PID file \"%s\": %s\n" msgstr "%s: kunde inte skriva extern PID-fil \"%s\": %s\n" -#: postmaster/postmaster.c:1360 utils/init/postinit.c:215 +#: postmaster/postmaster.c:1415 utils/init/postinit.c:220 #, c-format msgid "could not load pg_hba.conf" msgstr "kunde inte ladda pg_hba.conf" -#: postmaster/postmaster.c:1386 +#: postmaster/postmaster.c:1441 #, c-format msgid "postmaster became multithreaded during startup" msgstr "postmaster blev flertrådad under uppstart" -#: postmaster/postmaster.c:1387 +#: postmaster/postmaster.c:1442 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Sätt omgivningsvariabeln LC_ALL till en giltig lokal." -#: postmaster/postmaster.c:1488 +#: postmaster/postmaster.c:1543 +#, c-format +msgid "%s: could not locate my own executable path" +msgstr "%s: kunde inte hitta min egna körbara fils sökväg" + +#: postmaster/postmaster.c:1550 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: kunde inte hitta matchande postgres-binär" -#: postmaster/postmaster.c:1511 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1573 utils/misc/tzparser.c:340 #, c-format msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." msgstr "Detta tyder på en inkomplett PostgreSQL-installation alternativt att filen \"%s\" har flyttats bort från sin korrekta plats." -#: postmaster/postmaster.c:1538 +#: postmaster/postmaster.c:1600 #, c-format msgid "" "%s: could not find the database system\n" @@ -17714,2020 +19122,2349 @@ msgstr "" "Förväntade mig att hitta det i katalogen \"%s\",\n" "men kunde inte öppna filen \"%s\": %s\n" -#: postmaster/postmaster.c:1715 +#: postmaster/postmaster.c:1777 #, c-format msgid "select() failed in postmaster: %m" msgstr "select() misslyckades i postmaster: %m" -#: postmaster/postmaster.c:1870 +#: postmaster/postmaster.c:1908 +#, c-format +msgid "issuing SIGKILL to recalcitrant children" +msgstr "skickar SIGKILL till motsträviga barn" + +#: postmaster/postmaster.c:1929 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "stänger ner omedelbart då datakatalogens låsfil är ogiltig" -#: postmaster/postmaster.c:1973 postmaster/postmaster.c:2004 +#: postmaster/postmaster.c:2032 postmaster/postmaster.c:2060 #, c-format msgid "incomplete startup packet" msgstr "ofullständigt startuppaket" -#: postmaster/postmaster.c:1985 +#: postmaster/postmaster.c:2044 #, c-format msgid "invalid length of startup packet" msgstr "ogiltig längd på startuppaket" -#: postmaster/postmaster.c:2043 +#: postmaster/postmaster.c:2099 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "misslyckades att skicka SSL-förhandlingssvar: %m" -#: postmaster/postmaster.c:2074 +#: postmaster/postmaster.c:2117 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "tog emot okrypterad data efter SSL-förfrågan" + +#: postmaster/postmaster.c:2118 postmaster/postmaster.c:2162 +#, c-format +msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." +msgstr "Detta kan antingen vara en bug i klientens mjukvara eller bevis på ett försök att utföra en attack av typen man-in-the-middle." + +#: postmaster/postmaster.c:2143 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "misslyckades att skicka GSSAPI-förhandlingssvar: %m" -#: postmaster/postmaster.c:2104 +#: postmaster/postmaster.c:2161 +#, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "tog emot okrypterad data efter GSSAPI-krypteringsförfrågan" + +#: postmaster/postmaster.c:2185 #, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "inget stöd för framändans protokoll %u.%u: servern stöder %u.0 till %u.%u" -#: postmaster/postmaster.c:2168 utils/misc/guc.c:6769 utils/misc/guc.c:6805 -#: utils/misc/guc.c:6875 utils/misc/guc.c:8226 utils/misc/guc.c:11072 -#: utils/misc/guc.c:11106 +#: postmaster/postmaster.c:2249 utils/misc/guc.c:7392 utils/misc/guc.c:7428 +#: utils/misc/guc.c:7498 utils/misc/guc.c:8869 utils/misc/guc.c:11869 +#: utils/misc/guc.c:11910 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "ogiltigt värde för parameter \"%s\": \"%s\"" -#: postmaster/postmaster.c:2171 +#: postmaster/postmaster.c:2252 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Giltiga värden är: \"false\", 0, \"true\", 1, \"database\"." -#: postmaster/postmaster.c:2216 +#: postmaster/postmaster.c:2297 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "ogiltig startpaketlayout: förväntade en terminator som sista byte" -#: postmaster/postmaster.c:2254 +#: postmaster/postmaster.c:2314 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "inget PostgreSQL-användarnamn angivet i startuppaketet" -#: postmaster/postmaster.c:2318 +#: postmaster/postmaster.c:2378 #, c-format msgid "the database system is starting up" msgstr "databassystemet startar upp" -#: postmaster/postmaster.c:2323 +#: postmaster/postmaster.c:2384 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "databassystemet tar ännu inte emot anslutningar" + +#: postmaster/postmaster.c:2385 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "Konsistent återställningstillstånd har ännu inte uppnåtts." + +#: postmaster/postmaster.c:2389 +#, c-format +msgid "the database system is not accepting connections" +msgstr "databassystemet tar inte emot anslutningar" + +#: postmaster/postmaster.c:2390 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "Hot standby-läge är avstängt." + +#: postmaster/postmaster.c:2395 #, c-format msgid "the database system is shutting down" msgstr "databassystemet stänger ner" -#: postmaster/postmaster.c:2328 +#: postmaster/postmaster.c:2400 #, c-format msgid "the database system is in recovery mode" msgstr "databassystemet är återställningsläge" -#: postmaster/postmaster.c:2333 storage/ipc/procarray.c:293 -#: storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:362 +#: postmaster/postmaster.c:2405 storage/ipc/procarray.c:474 +#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:359 #, c-format msgid "sorry, too many clients already" msgstr "ledsen, för många klienter" -#: postmaster/postmaster.c:2423 +#: postmaster/postmaster.c:2492 #, c-format msgid "wrong key in cancel request for process %d" msgstr "fel nyckel i avbrytbegäran för process %d" -#: postmaster/postmaster.c:2435 +#: postmaster/postmaster.c:2504 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "PID %d i avbrytbegäran matchade inte någon process" -#: postmaster/postmaster.c:2706 +#: postmaster/postmaster.c:2758 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "mottog SIGHUP, läser om konfigurationsfiler" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2732 postmaster/postmaster.c:2736 +#: postmaster/postmaster.c:2782 postmaster/postmaster.c:2786 #, c-format msgid "%s was not reloaded" msgstr "%s laddades inte om" -#: postmaster/postmaster.c:2746 +#: postmaster/postmaster.c:2796 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL-konfiguration laddades inte om" -#: postmaster/postmaster.c:2802 +#: postmaster/postmaster.c:2852 #, c-format msgid "received smart shutdown request" msgstr "tog emot förfrågan om att stänga ner smart" -#: postmaster/postmaster.c:2848 +#: postmaster/postmaster.c:2893 #, c-format msgid "received fast shutdown request" msgstr "tog emot förfrågan om att stänga ner snabbt" -#: postmaster/postmaster.c:2866 +#: postmaster/postmaster.c:2911 #, c-format msgid "aborting any active transactions" msgstr "avbryter aktiva transaktioner" -#: postmaster/postmaster.c:2890 +#: postmaster/postmaster.c:2935 #, c-format msgid "received immediate shutdown request" msgstr "mottog begäran för omedelbar nedstängning" -#: postmaster/postmaster.c:2965 +#: postmaster/postmaster.c:3012 #, c-format msgid "shutdown at recovery target" msgstr "nedstängs vid återställningsmål" -#: postmaster/postmaster.c:2983 postmaster/postmaster.c:3019 +#: postmaster/postmaster.c:3030 postmaster/postmaster.c:3066 msgid "startup process" msgstr "uppstartprocess" -#: postmaster/postmaster.c:2986 +#: postmaster/postmaster.c:3033 #, c-format msgid "aborting startup due to startup process failure" msgstr "avbryter uppstart på grund av fel i startprocessen" -#: postmaster/postmaster.c:3061 +#: postmaster/postmaster.c:3106 #, c-format msgid "database system is ready to accept connections" msgstr "databassystemet är redo att ta emot anslutningar" -#: postmaster/postmaster.c:3082 +#: postmaster/postmaster.c:3127 msgid "background writer process" msgstr "bakgrundsskrivarprocess" -#: postmaster/postmaster.c:3136 +#: postmaster/postmaster.c:3174 msgid "checkpointer process" msgstr "checkpoint-process" -#: postmaster/postmaster.c:3152 +#: postmaster/postmaster.c:3190 msgid "WAL writer process" msgstr "WAL-skrivarprocess" -#: postmaster/postmaster.c:3167 +#: postmaster/postmaster.c:3205 msgid "WAL receiver process" msgstr "WAL-mottagarprocess" -#: postmaster/postmaster.c:3182 +#: postmaster/postmaster.c:3220 msgid "autovacuum launcher process" msgstr "autovacuum-startprocess" -#: postmaster/postmaster.c:3197 +#: postmaster/postmaster.c:3238 msgid "archiver process" msgstr "arkiveringsprocess" -#: postmaster/postmaster.c:3213 -msgid "statistics collector process" -msgstr "statistikinsamlingsprocess" - -#: postmaster/postmaster.c:3227 +#: postmaster/postmaster.c:3251 msgid "system logger process" msgstr "system-logg-process" -#: postmaster/postmaster.c:3291 +#: postmaster/postmaster.c:3315 #, c-format msgid "background worker \"%s\"" msgstr "bakgrundsarbetare \"%s\"" -#: postmaster/postmaster.c:3375 postmaster/postmaster.c:3395 -#: postmaster/postmaster.c:3402 postmaster/postmaster.c:3420 +#: postmaster/postmaster.c:3394 postmaster/postmaster.c:3414 +#: postmaster/postmaster.c:3421 postmaster/postmaster.c:3439 msgid "server process" msgstr "serverprocess" -#: postmaster/postmaster.c:3474 +#: postmaster/postmaster.c:3493 #, c-format msgid "terminating any other active server processes" msgstr "avslutar andra aktiva serverprocesser" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3729 +#: postmaster/postmaster.c:3730 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) avslutade med felkod %d" -#: postmaster/postmaster.c:3731 postmaster/postmaster.c:3743 -#: postmaster/postmaster.c:3753 postmaster/postmaster.c:3764 +#: postmaster/postmaster.c:3732 postmaster/postmaster.c:3744 +#: postmaster/postmaster.c:3754 postmaster/postmaster.c:3765 #, c-format msgid "Failed process was running: %s" msgstr "Misslyckad process körde: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3740 +#: postmaster/postmaster.c:3741 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) terminerades av avbrott 0x%X" +#: postmaster/postmaster.c:3743 postmaster/shell_archive.c:132 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "Se C-include-fil \"ntstatus.h\" för en beskrivning av det hexdecimala värdet." + #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3750 +#: postmaster/postmaster.c:3751 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) terminerades av signal %d: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3762 +#: postmaster/postmaster.c:3763 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) avslutade med okänd status %d" -#: postmaster/postmaster.c:3970 +#: postmaster/postmaster.c:3963 #, c-format msgid "abnormal database system shutdown" msgstr "ej normal databasnedstängning" -#: postmaster/postmaster.c:4010 +#: postmaster/postmaster.c:3989 +#, c-format +msgid "shutting down due to startup process failure" +msgstr "stänger ner på grund av fel i startprocessen" + +#: postmaster/postmaster.c:3995 +#, c-format +msgid "shutting down because restart_after_crash is off" +msgstr "stänger ner då restart_after_crash är av" + +#: postmaster/postmaster.c:4007 #, c-format msgid "all server processes terminated; reinitializing" msgstr "alla serverprocesser är avslutade; initierar på nytt" -#: postmaster/postmaster.c:4180 postmaster/postmaster.c:5599 -#: postmaster/postmaster.c:5986 +#: postmaster/postmaster.c:4179 postmaster/postmaster.c:5515 +#: postmaster/postmaster.c:5905 #, c-format msgid "could not generate random cancel key" msgstr "kunde inte skapa slumpad avbrytningsnyckel" -#: postmaster/postmaster.c:4234 +#: postmaster/postmaster.c:4241 #, c-format msgid "could not fork new process for connection: %m" msgstr "kunde inte fork():a ny process for uppkoppling: %m" -#: postmaster/postmaster.c:4276 +#: postmaster/postmaster.c:4283 msgid "could not fork new process for connection: " msgstr "kunde inte fork():a ny process for uppkoppling: " -#: postmaster/postmaster.c:4393 +#: postmaster/postmaster.c:4389 #, c-format msgid "connection received: host=%s port=%s" msgstr "ansluting mottagen: värd=%s port=%s" -#: postmaster/postmaster.c:4398 +#: postmaster/postmaster.c:4394 #, c-format msgid "connection received: host=%s" msgstr "ansluting mottagen: värd=%s" -#: postmaster/postmaster.c:4668 +#: postmaster/postmaster.c:4631 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "kunde inte köra serverprocess \"%s\": %m" -#: postmaster/postmaster.c:4827 +#: postmaster/postmaster.c:4689 +#, c-format +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "kunde inte skapa fil-mapping för backend-parametrar: felkod %lu" + +#: postmaster/postmaster.c:4698 +#, c-format +msgid "could not map backend parameter memory: error code %lu" +msgstr "kunde inte mappa minne för backend-parametrar: felkod %lu" + +#: postmaster/postmaster.c:4725 +#, c-format +msgid "subprocess command line too long" +msgstr "subprocessens kommando är för långt" + +#: postmaster/postmaster.c:4743 +#, c-format +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "Anrop till CreateProcess() misslyckades: %m (felkod %lu)" + +#: postmaster/postmaster.c:4770 +#, c-format +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "kunde inte avmappa vy för backend:ens parameterfil: felkod %lu" + +#: postmaster/postmaster.c:4774 +#, c-format +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "kunde inte stänga \"handle\" till backend:ens parameterfil: felkod %lu" + +#: postmaster/postmaster.c:4796 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "ger upp efter för många försök att reservera delat minne" -#: postmaster/postmaster.c:4828 +#: postmaster/postmaster.c:4797 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "Detta kan orsakas av ASLR eller antivirusprogram." -#: postmaster/postmaster.c:5034 +#: postmaster/postmaster.c:4978 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "SSL-konfigurering kunde inte laddas i barnprocess" -#: postmaster/postmaster.c:5166 +#: postmaster/postmaster.c:5103 #, c-format msgid "Please report this to <%s>." msgstr "Rapportera gärna detta till <%s>." -#: postmaster/postmaster.c:5259 +#: postmaster/postmaster.c:5175 #, c-format -msgid "database system is ready to accept read only connections" +msgid "database system is ready to accept read-only connections" msgstr "databassystemet är redo att ta emot read-only-anslutningar" -#: postmaster/postmaster.c:5527 +#: postmaster/postmaster.c:5439 #, c-format msgid "could not fork startup process: %m" msgstr "kunde inte starta startup-processen: %m" -#: postmaster/postmaster.c:5531 +#: postmaster/postmaster.c:5443 +#, c-format +msgid "could not fork archiver process: %m" +msgstr "kunde inte fork:a arkivprocess: %m" + +#: postmaster/postmaster.c:5447 #, c-format msgid "could not fork background writer process: %m" msgstr "kunde inte starta process för bakgrundsskrivare: %m" -#: postmaster/postmaster.c:5535 +#: postmaster/postmaster.c:5451 #, c-format msgid "could not fork checkpointer process: %m" msgstr "kunde inte fork:a bakgrundsprocess: %m" -#: postmaster/postmaster.c:5539 +#: postmaster/postmaster.c:5455 #, c-format msgid "could not fork WAL writer process: %m" msgstr "kunde inte fork:a WAL-skrivprocess: %m" -#: postmaster/postmaster.c:5543 +#: postmaster/postmaster.c:5459 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "kunde inte fork:a WAL-mottagarprocess: %m" -#: postmaster/postmaster.c:5547 +#: postmaster/postmaster.c:5463 #, c-format msgid "could not fork process: %m" msgstr "kunde inte fork:a process: %m" -#: postmaster/postmaster.c:5744 postmaster/postmaster.c:5767 +#: postmaster/postmaster.c:5664 postmaster/postmaster.c:5687 #, c-format msgid "database connection requirement not indicated during registration" msgstr "krav på databasanslutning fanns inte med vid registering" -#: postmaster/postmaster.c:5751 postmaster/postmaster.c:5774 +#: postmaster/postmaster.c:5671 postmaster/postmaster.c:5694 #, c-format msgid "invalid processing mode in background worker" msgstr "ogiltigt processläge i bakgrundsarbetare" -#: postmaster/postmaster.c:5847 -#, c-format -msgid "starting background worker process \"%s\"" -msgstr "startar bakgrundsarbetarprocess \"%s\"" - -#: postmaster/postmaster.c:5859 +#: postmaster/postmaster.c:5779 #, c-format msgid "could not fork worker process: %m" msgstr "kunde inte starta (fork) arbetarprocess: %m" -#: postmaster/postmaster.c:5972 +#: postmaster/postmaster.c:5891 #, c-format msgid "no slot available for new worker process" msgstr "ingen slot tillgänglig för ny arbetsprocess" -#: postmaster/postmaster.c:6307 +#: postmaster/postmaster.c:6222 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "kunde inte duplicera uttag (socket) %d för att använda i backend: felkod %d" -#: postmaster/postmaster.c:6339 +#: postmaster/postmaster.c:6254 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "kunde inte skapa ärvt uttag (socket): felkod %d\n" -#: postmaster/postmaster.c:6368 +#: postmaster/postmaster.c:6283 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "kunde inte öppna bakändans variabelfil \"%s\": %s\n" -#: postmaster/postmaster.c:6375 +#: postmaster/postmaster.c:6290 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "kunde inte läsa från bakändans variabelfil \"%s\": %s\n" -#: postmaster/postmaster.c:6384 +#: postmaster/postmaster.c:6299 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "kunde inte ta bort fil \"%s\": %s\n" -#: postmaster/postmaster.c:6401 +#: postmaster/postmaster.c:6316 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "kunde inte mappa in vy för bakgrundsvariabler: felkod %lu\n" -#: postmaster/postmaster.c:6410 +#: postmaster/postmaster.c:6325 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "kunde inte avmappa vy för bakgrundsvariabler: felkod %lu\n" -#: postmaster/postmaster.c:6417 +#: postmaster/postmaster.c:6332 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "kunde inte stänga \"handle\" till backend:ens parametervariabler: felkod %lu\n" -#: postmaster/postmaster.c:6595 +#: postmaster/postmaster.c:6506 #, c-format msgid "could not read exit code for process\n" msgstr "kunde inte läsa avslutningskod för process\n" -#: postmaster/postmaster.c:6600 +#: postmaster/postmaster.c:6511 #, c-format msgid "could not post child completion status\n" msgstr "kunde inte skicka barnets avslutningsstatus\n" -#: postmaster/syslogger.c:474 postmaster/syslogger.c:1153 +#: postmaster/shell_archive.c:121 #, c-format -msgid "could not read from logger pipe: %m" -msgstr "kunde inte läsa från loggrör (pipe): %m" +msgid "archive command failed with exit code %d" +msgstr "arkiveringskommando misslyckades med felkod %d" + +#: postmaster/shell_archive.c:123 postmaster/shell_archive.c:133 +#: postmaster/shell_archive.c:139 postmaster/shell_archive.c:148 +#, c-format +msgid "The failed archive command was: %s" +msgstr "Det misslyckade arkiveringskommandot var: %s" + +#: postmaster/shell_archive.c:130 +#, c-format +msgid "archive command was terminated by exception 0x%X" +msgstr "arkiveringskommandot terminerades med avbrott 0x%X" + +#: postmaster/shell_archive.c:137 +#, c-format +msgid "archive command was terminated by signal %d: %s" +msgstr "arkiveringskommandot terminerades av signal %d: %s" + +#: postmaster/shell_archive.c:146 +#, c-format +msgid "archive command exited with unrecognized status %d" +msgstr "arkiveringskommandot avslutade med okänd statuskod %d" -#: postmaster/syslogger.c:522 +#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 #, c-format -msgid "logger shutting down" -msgstr "loggaren stänger ner" +msgid "could not read from logger pipe: %m" +msgstr "kunde inte läsa från loggrör (pipe): %m" -#: postmaster/syslogger.c:571 postmaster/syslogger.c:585 +#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 #, c-format msgid "could not create pipe for syslog: %m" msgstr "kunde inte skapa rör (pipe) för syslog: %m" -#: postmaster/syslogger.c:636 +#: postmaster/syslogger.c:677 #, c-format msgid "could not fork system logger: %m" msgstr "kunde inte fork:a systemloggaren: %m" -#: postmaster/syslogger.c:672 +#: postmaster/syslogger.c:713 #, c-format msgid "redirecting log output to logging collector process" msgstr "omdirigerar loggutmatning till logginsamlingsprocess" -#: postmaster/syslogger.c:673 +#: postmaster/syslogger.c:714 #, c-format msgid "Future log output will appear in directory \"%s\"." msgstr "Framtida loggutmatning kommer dyka upp i katalog \"%s\"." -#: postmaster/syslogger.c:681 +#: postmaster/syslogger.c:722 #, c-format msgid "could not redirect stdout: %m" msgstr "kunde inte omdirigera stdout: %m" -#: postmaster/syslogger.c:686 postmaster/syslogger.c:703 +#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 #, c-format msgid "could not redirect stderr: %m" msgstr "kunde inte omdirigera stderr: %m" -#: postmaster/syslogger.c:1108 +#: postmaster/syslogger.c:1177 #, c-format msgid "could not write to log file: %s\n" msgstr "kunde inte skriva till loggfil: %s\n" -#: postmaster/syslogger.c:1225 +#: postmaster/syslogger.c:1295 #, c-format msgid "could not open log file \"%s\": %m" msgstr "kunde inte öppna loggfil \"%s\": %m" -#: postmaster/syslogger.c:1287 postmaster/syslogger.c:1337 +#: postmaster/syslogger.c:1385 #, c-format msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "stänger av automatisk rotation (använd SIGHUP för att slå på igen)" -#: regex/regc_pg_locale.c:262 +#: regex/regc_pg_locale.c:242 #, c-format msgid "could not determine which collation to use for regular expression" msgstr "kunde inte bestämma vilken jämförelse (collation) som skall användas för reguljära uttryck" -#: regex/regc_pg_locale.c:269 +#: regex/regc_pg_locale.c:265 #, c-format msgid "nondeterministic collations are not supported for regular expressions" msgstr "ickedeterministiska jämförelser (collation) stöds inte för reguljära uttryck" -#: repl_gram.y:349 repl_gram.y:381 +#: repl_gram.y:303 repl_gram.y:335 #, c-format msgid "invalid timeline %u" msgstr "ogiltig tidslinje %u" -#: repl_scanner.l:131 +#: repl_scanner.l:142 msgid "invalid streaming start location" msgstr "ogiltig startposition för strömning" -#: repl_scanner.l:182 scan.l:717 +#: repl_scanner.l:198 scan.l:724 msgid "unterminated quoted string" msgstr "icketerminerad citerad sträng" -#: replication/backup_manifest.c:231 +#: replication/backup_manifest.c:253 #, c-format msgid "expected end timeline %u but found timeline %u" msgstr "förväntade sluttidslinje %u men hittade tidslinje %u" -#: replication/backup_manifest.c:248 +#: replication/backup_manifest.c:277 #, c-format msgid "expected start timeline %u but found timeline %u" msgstr "förväntade starttidslinje %u men hittade tidslinje %u" -#: replication/backup_manifest.c:275 +#: replication/backup_manifest.c:304 #, c-format msgid "start timeline %u not found in history of timeline %u" msgstr "starttidslinje %u hittades inte i historiken för tidslinje %u" -#: replication/backup_manifest.c:322 +#: replication/backup_manifest.c:355 #, c-format msgid "could not rewind temporary file" msgstr "kunde inte spola tillbaka temporär fil" -#: replication/backup_manifest.c:349 +#: replication/backup_manifest.c:374 #, c-format msgid "could not read from temporary file: %m" msgstr "kunde inte läsa från temporär fil: %m" -#: replication/basebackup.c:108 -#, c-format -msgid "could not read from file \"%s\"" -msgstr "kunde inte läsa från fil \"%s\"" - -#: replication/basebackup.c:551 +#: replication/basebackup.c:454 #, c-format msgid "could not find any WAL files" msgstr "kunde inte hitta några WAL-filer" -#: replication/basebackup.c:566 replication/basebackup.c:582 -#: replication/basebackup.c:591 +#: replication/basebackup.c:469 replication/basebackup.c:484 +#: replication/basebackup.c:493 #, c-format msgid "could not find WAL file \"%s\"" msgstr "kunde inte hitta WAL-fil \"%s\"" -#: replication/basebackup.c:634 replication/basebackup.c:665 +#: replication/basebackup.c:535 replication/basebackup.c:560 #, c-format msgid "unexpected WAL file size \"%s\"" msgstr "oväntad WAL-filstorlek \"%s\"" -#: replication/basebackup.c:648 replication/basebackup.c:1752 -#, c-format -msgid "base backup could not send data, aborting backup" -msgstr "basbackup kunde inte skicka data, avbryter backup" - -#: replication/basebackup.c:724 +#: replication/basebackup.c:630 #, c-format msgid "%lld total checksum verification failure" msgid_plural "%lld total checksum verification failures" msgstr[0] "totalt %lld verifieringsfel av checksumma" msgstr[1] "totalt %lld verifieringsfel av checksumma" -#: replication/basebackup.c:731 +#: replication/basebackup.c:637 #, c-format msgid "checksum verification failure during base backup" msgstr "misslyckad verifiering av checksumma under basbackup" -#: replication/basebackup.c:784 replication/basebackup.c:793 -#: replication/basebackup.c:802 replication/basebackup.c:811 -#: replication/basebackup.c:820 replication/basebackup.c:831 -#: replication/basebackup.c:848 replication/basebackup.c:857 -#: replication/basebackup.c:869 replication/basebackup.c:893 +#: replication/basebackup.c:706 replication/basebackup.c:715 +#: replication/basebackup.c:726 replication/basebackup.c:743 +#: replication/basebackup.c:752 replication/basebackup.c:763 +#: replication/basebackup.c:780 replication/basebackup.c:789 +#: replication/basebackup.c:801 replication/basebackup.c:825 +#: replication/basebackup.c:839 replication/basebackup.c:850 +#: replication/basebackup.c:861 replication/basebackup.c:874 #, c-format msgid "duplicate option \"%s\"" msgstr "duplicerad flagga \"%s\"" -#: replication/basebackup.c:837 +#: replication/basebackup.c:734 +#, c-format +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "okänd checkpoint-typ: \"%s\"" + +#: replication/basebackup.c:769 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d är utanför giltigt intervall för parameter \"%s\" (%d .. %d)" -#: replication/basebackup.c:882 +#: replication/basebackup.c:814 +#, c-format +msgid "unrecognized manifest option: \"%s\"" +msgstr "okänd manifestflagga: \"%s\"" + +#: replication/basebackup.c:830 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "okänd checksum-algoritm: \"%s\"" + +#: replication/basebackup.c:865 +#, c-format +msgid "unrecognized compression algorithm \"%s\"" +msgstr "okänd komprimeringsalgoritm \"%s\"" + +#: replication/basebackup.c:881 +#, c-format +msgid "unrecognized base backup option: \"%s\"" +msgstr "okänd basbackupflagga: \"%s\"" + +#: replication/basebackup.c:892 +#, c-format +msgid "manifest checksums require a backup manifest" +msgstr "manifestchecksummor kräver ett backup-manifest" + +#: replication/basebackup.c:901 +#, fuzzy, c-format +#| msgid "--no-slot cannot be used with slot name" +msgid "target detail cannot be used without target" +msgstr "--no-slot kan inte användas tillsammans med slot-namn" + +#: replication/basebackup.c:910 replication/basebackup_target.c:218 #, c-format -msgid "unrecognized manifest option: \"%s\"" -msgstr "okänd manifestflagga: \"%s\"" +msgid "target '%s' does not accept a target detail" +msgstr "" -#: replication/basebackup.c:898 +#: replication/basebackup.c:921 #, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "okänd checksum-algoritm: \"%s\"" +msgid "compression detail requires compression" +msgstr "" -#: replication/basebackup.c:913 +#: replication/basebackup.c:934 #, c-format -msgid "manifest checksums require a backup manifest" -msgstr "manifestchecksummor kräver ett backup-manifest" +msgid "invalid compression specification: %s" +msgstr "ogiltig komprimeringsangivelse: %s" -#: replication/basebackup.c:1504 +#: replication/basebackup.c:1424 #, c-format msgid "skipping special file \"%s\"" msgstr "hoppar över specialfil \"%s\"" -#: replication/basebackup.c:1623 +#: replication/basebackup.c:1543 #, c-format msgid "invalid segment number %d in file \"%s\"" msgstr "ogiltigt segmentnummer %d i fil \"%s\"" -#: replication/basebackup.c:1642 +#: replication/basebackup.c:1583 #, c-format -msgid "could not verify checksum in file \"%s\", block %d: read buffer size %d and page size %d differ" -msgstr "kunde inte verifiera checksumma i fil \"%s\", block %d: läsbufferstorlek %d och sidstorlek %d skiljer sig åt" +msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" +msgstr "kunde inte verifiera checksumma i fil \"%s\", block %u: läsbufferstorlek %d och sidstorlek %d skiljer sig åt" -#: replication/basebackup.c:1686 replication/basebackup.c:1716 +#: replication/basebackup.c:1657 #, c-format -msgid "could not fseek in file \"%s\": %m" -msgstr "kunde inte gör fseek i fil \"%s\": %m" +msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" +msgstr "checksumkontroll misslyckades i fil \"%s\", block %u: beräknade %X men förväntade %X" -#: replication/basebackup.c:1708 -#, c-format -msgid "could not reread block %d of file \"%s\": %m" -msgstr "kunde inte läsa tillbaka block %d i fil \"%s\": %m" - -#: replication/basebackup.c:1732 -#, c-format -msgid "checksum verification failed in file \"%s\", block %d: calculated %X but expected %X" -msgstr "checksumkontroll misslyckades i fil \"%s\", block %d: beräknade %X men förväntade %X" - -#: replication/basebackup.c:1739 +#: replication/basebackup.c:1664 #, c-format msgid "further checksum verification failures in file \"%s\" will not be reported" msgstr "ytterligare kontroller av checksummor i fil \"%s\" kommer inte rapporteras" -#: replication/basebackup.c:1807 +#: replication/basebackup.c:1711 #, c-format msgid "file \"%s\" has a total of %d checksum verification failure" msgid_plural "file \"%s\" has a total of %d checksum verification failures" msgstr[0] "filen \"%s\" har totalt %d kontrollerad felaktiga checksumma" msgstr[1] "filen \"%s\" har totalt %d kontrollerade felaktiga checksummor" -#: replication/basebackup.c:1843 +#: replication/basebackup.c:1757 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "filnamnet är för långt för tar-format: \"%s\"" -#: replication/basebackup.c:1848 +#: replication/basebackup.c:1762 #, c-format msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" msgstr "mål för symbolisk länk är för långt för tar-format: filnamn \"%s\", mål \"%s\"" -#: replication/libpqwalreceiver/libpqwalreceiver.c:227 +#: replication/basebackup_gzip.c:67 +#, c-format +msgid "gzip compression is not supported by this build" +msgstr "gzip-komprimering stöds inte av detta bygge" + +#: replication/basebackup_gzip.c:147 +#, c-format +msgid "could not initialize compression library" +msgstr "kunde inte initierar komprimeringsbibliotek" + +#: replication/basebackup_lz4.c:67 +#, c-format +msgid "lz4 compression is not supported by this build" +msgstr "lz4-komprimering stöds inte av detta bygge" + +#: replication/basebackup_server.c:75 +#, fuzzy, c-format +#| msgid "must be superuser or a member of the pg_write_server_files role to COPY to a file" +msgid "must be superuser or a role with privileges of the pg_write_server_files role to create server backup" +msgstr "måste vara superuser eller medlem i rollen pg_write_server_files för att göra COPY till en fil" + +#: replication/basebackup_server.c:89 +#, c-format +msgid "relative path not allowed for server backup" +msgstr "relativ sökväg tillåts inte för serverbackup" + +#: replication/basebackup_server.c:115 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "katalogen \"%s\" existerar men är inte tom" + +#: replication/basebackup_server.c:123 utils/init/postinit.c:1052 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "kunde inte komma åt katalog \"%s\": %m" + +#: replication/basebackup_server.c:175 replication/basebackup_server.c:182 +#: replication/basebackup_server.c:268 replication/basebackup_server.c:275 +#: storage/smgr/md.c:456 storage/smgr/md.c:463 storage/smgr/md.c:754 +#, c-format +msgid "Check free disk space." +msgstr "Kontrollera ledigt diskutrymme." + +#: replication/basebackup_server.c:179 replication/basebackup_server.c:272 +#, c-format +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "kunde inte skriva fil \"%s\": skrev bara %d av %d byte vid offset %u" + +#: replication/basebackup_target.c:146 +#, c-format +msgid "unrecognized target: \"%s\"" +msgstr "okänt mål \"%s\"" + +#: replication/basebackup_target.c:237 +#, fuzzy, c-format +#| msgid "%s requires a parameter" +msgid "target '%s' requires a target detail" +msgstr "%s kräver en parameter" + +#: replication/basebackup_zstd.c:66 +#, c-format +msgid "zstd compression is not supported by this build" +msgstr "zstd-komprimering stöds inte av detta bygge" + +#: replication/basebackup_zstd.c:120 +#, fuzzy, c-format +#| msgid "could not set compression level %d: %s" +msgid "could not set compression worker count to %d: %s" +msgstr "kunde inte sätta komprimeringsnivå %d: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:240 #, c-format msgid "could not clear search path: %s" msgstr "kunde inte nollställa sökväg: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:251 +#: replication/libpqwalreceiver/libpqwalreceiver.c:269 #, c-format msgid "invalid connection string syntax: %s" msgstr "ogiltig anslutningssträngsyntax %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:275 +#: replication/libpqwalreceiver/libpqwalreceiver.c:295 #, c-format msgid "could not parse connection string: %s" msgstr "kunde inte parsa anslutningssträng: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:347 +#: replication/libpqwalreceiver/libpqwalreceiver.c:368 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "kunde inte hämta databassystemidentifierare och tidslinje-ID från primära servern: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:358 -#: replication/libpqwalreceiver/libpqwalreceiver.c:576 +#: replication/libpqwalreceiver/libpqwalreceiver.c:380 +#: replication/libpqwalreceiver/libpqwalreceiver.c:618 #, c-format msgid "invalid response from primary server" msgstr "ogiltigt svar från primär server" -#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#: replication/libpqwalreceiver/libpqwalreceiver.c:381 #, c-format msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." msgstr "Kunde inte identifiera system: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält." -#: replication/libpqwalreceiver/libpqwalreceiver.c:432 -#: replication/libpqwalreceiver/libpqwalreceiver.c:438 -#: replication/libpqwalreceiver/libpqwalreceiver.c:463 +#: replication/libpqwalreceiver/libpqwalreceiver.c:461 +#: replication/libpqwalreceiver/libpqwalreceiver.c:468 +#: replication/libpqwalreceiver/libpqwalreceiver.c:498 #, c-format msgid "could not start WAL streaming: %s" msgstr "kunde inte starta WAL-strömning: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:486 +#: replication/libpqwalreceiver/libpqwalreceiver.c:522 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "kunde inte skicka meddelandet end-of-streaming till primären: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:508 +#: replication/libpqwalreceiver/libpqwalreceiver.c:545 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "oväntad resultatmängd efter end-of-streaming" -#: replication/libpqwalreceiver/libpqwalreceiver.c:522 +#: replication/libpqwalreceiver/libpqwalreceiver.c:560 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "fel vid nestängning av strömmande COPY: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:531 +#: replication/libpqwalreceiver/libpqwalreceiver.c:570 #, c-format msgid "error reading result of streaming command: %s" -msgstr "fel vid läsning av resultat från strömmningskommando: %s" +msgstr "fel vid läsning av resultat från strömningskommando: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:539 -#: replication/libpqwalreceiver/libpqwalreceiver.c:773 +#: replication/libpqwalreceiver/libpqwalreceiver.c:579 +#: replication/libpqwalreceiver/libpqwalreceiver.c:817 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "oväntat resultat efter CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:565 +#: replication/libpqwalreceiver/libpqwalreceiver.c:606 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "kan inte ta emot fil med tidslinjehistorik från primära servern: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:577 +#: replication/libpqwalreceiver/libpqwalreceiver.c:619 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "Förväntade 1 tupel med 2 fält, fick %d tupler med %d fält." -#: replication/libpqwalreceiver/libpqwalreceiver.c:737 -#: replication/libpqwalreceiver/libpqwalreceiver.c:788 -#: replication/libpqwalreceiver/libpqwalreceiver.c:794 +#: replication/libpqwalreceiver/libpqwalreceiver.c:780 +#: replication/libpqwalreceiver/libpqwalreceiver.c:833 +#: replication/libpqwalreceiver/libpqwalreceiver.c:840 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "kunde inte ta emot data från WAL-ström: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:813 +#: replication/libpqwalreceiver/libpqwalreceiver.c:860 #, c-format msgid "could not send data to WAL stream: %s" msgstr "kunde inte skicka data till WAL-ström: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:866 +#: replication/libpqwalreceiver/libpqwalreceiver.c:952 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "kunde inte skapa replikeringsslot \"%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:911 +#: replication/libpqwalreceiver/libpqwalreceiver.c:998 #, c-format msgid "invalid query response" msgstr "ogiltigt frågerespons" -#: replication/libpqwalreceiver/libpqwalreceiver.c:912 +#: replication/libpqwalreceiver/libpqwalreceiver.c:999 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Förväntade %d fält, fick %d fält." -#: replication/libpqwalreceiver/libpqwalreceiver.c:981 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1069 #, c-format msgid "the query interface requires a database connection" msgstr "frågeinterface:et kräver en databasanslutning" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1012 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1100 msgid "empty query" msgstr "tom fråga" -#: replication/logical/launcher.c:295 -#, c-format -msgid "starting logical replication worker for subscription \"%s\"" -msgstr "startar logisk replikeringsarbetare för prenumeration \"%s\"" +#: replication/libpqwalreceiver/libpqwalreceiver.c:1106 +msgid "unexpected pipeline mode" +msgstr "oväntat pipeline-läge" -#: replication/logical/launcher.c:302 +#: replication/logical/launcher.c:285 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "kan inte starta logisk replikeringsarbetare när max_replication_slots = 0" -#: replication/logical/launcher.c:382 +#: replication/logical/launcher.c:365 #, c-format msgid "out of logical replication worker slots" msgstr "slut på logiska replikeringsarbetarslots" -#: replication/logical/launcher.c:383 +#: replication/logical/launcher.c:366 #, c-format msgid "You might need to increase max_logical_replication_workers." msgstr "Du kan behöva öka max_logical_replication_workers." -#: replication/logical/launcher.c:438 +#: replication/logical/launcher.c:422 #, c-format msgid "out of background worker slots" msgstr "slut på bakgrundsarbetarslots" -#: replication/logical/launcher.c:439 +#: replication/logical/launcher.c:423 #, c-format msgid "You might need to increase max_worker_processes." msgstr "Du kan behöva öka max_worker_processes." -#: replication/logical/launcher.c:638 +#: replication/logical/launcher.c:577 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "logisk replikeringsarbetarslot %d är tom, kan inte ansluta" -#: replication/logical/launcher.c:647 +#: replication/logical/launcher.c:586 #, c-format msgid "logical replication worker slot %d is already used by another worker, cannot attach" msgstr "logiisk replikeringsarbetarslot %d används redan av en annan arbetare, kan inte ansluta" -#: replication/logical/launcher.c:951 -#, c-format -msgid "logical replication launcher started" -msgstr "logisk replikeringsstartare startad" - -#: replication/logical/logical.c:87 +#: replication/logical/logical.c:115 #, c-format msgid "logical decoding requires wal_level >= logical" msgstr "logisk avkodning kräver wal_level >= logical" -#: replication/logical/logical.c:92 +#: replication/logical/logical.c:120 #, c-format msgid "logical decoding requires a database connection" msgstr "logisk avkodning kräver en databasanslutning" -#: replication/logical/logical.c:110 +#: replication/logical/logical.c:138 #, c-format msgid "logical decoding cannot be used while in recovery" msgstr "logisk avkodning kan inte användas under återställning" -#: replication/logical/logical.c:258 replication/logical/logical.c:399 +#: replication/logical/logical.c:348 replication/logical/logical.c:502 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "kan inte använda fysisk replikeringsslot för logisk avkodning" -#: replication/logical/logical.c:263 replication/logical/logical.c:404 +#: replication/logical/logical.c:353 replication/logical/logical.c:507 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "replikeringsslot \"%s\" har inte skapats i denna databasen" -#: replication/logical/logical.c:270 +#: replication/logical/logical.c:360 #, c-format msgid "cannot create logical replication slot in transaction that has performed writes" msgstr "kan inte skapa logisk replikeringsslot i transaktion som redan har utfört skrivningar" -#: replication/logical/logical.c:444 +#: replication/logical/logical.c:568 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "startar logisk avkodning för slot \"%s\"" -#: replication/logical/logical.c:446 +#: replication/logical/logical.c:570 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Strömmar transaktioner commit:ade efter %X/%X, läser WAL från %X/%X" -#: replication/logical/logical.c:593 +#: replication/logical/logical.c:718 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "slot \"%s\", utdata-plugin \"%s\", i callback:en %s, associerad LSN %X/%X" -#: replication/logical/logical.c:600 +#: replication/logical/logical.c:724 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "slot \"%s\", utdata-plugin \"%s\", i callback:en %s" -#: replication/logical/logicalfuncs.c:104 replication/slotfuncs.c:34 +#: replication/logical/logical.c:895 replication/logical/logical.c:940 +#: replication/logical/logical.c:985 replication/logical/logical.c:1031 #, c-format -msgid "must be superuser or replication role to use replication slots" -msgstr "måste vara superanvändare eller replikeringsroll för att använda replikeringsslottar" +msgid "logical replication at prepare time requires a %s callback" +msgstr "logisk replikering vid prepare-tillfället kräver en %s-callback" + +#: replication/logical/logical.c:1263 replication/logical/logical.c:1312 +#: replication/logical/logical.c:1353 replication/logical/logical.c:1439 +#: replication/logical/logical.c:1488 +#, c-format +msgid "logical streaming requires a %s callback" +msgstr "logisk strömning kräven en %s-callback" -#: replication/logical/logicalfuncs.c:134 +#: replication/logical/logical.c:1398 +#, c-format +msgid "logical streaming at prepare time requires a %s callback" +msgstr "logisk strömning vid prepare-tillfället kräver en %s-callback" + +#: replication/logical/logicalfuncs.c:126 #, c-format msgid "slot name must not be null" msgstr "slot-namn får inte vara null" -#: replication/logical/logicalfuncs.c:150 +#: replication/logical/logicalfuncs.c:142 #, c-format msgid "options array must not be null" msgstr "flagg-array får inte vara null" -#: replication/logical/logicalfuncs.c:181 +#: replication/logical/logicalfuncs.c:159 #, c-format msgid "array must be one-dimensional" msgstr "array:en måste vara endimensionell" -#: replication/logical/logicalfuncs.c:187 +#: replication/logical/logicalfuncs.c:165 #, c-format msgid "array must not contain nulls" msgstr "array:en får inte innehålla null" -#: replication/logical/logicalfuncs.c:203 utils/adt/json.c:1128 -#: utils/adt/jsonb.c:1303 +#: replication/logical/logicalfuncs.c:181 utils/adt/json.c:1437 +#: utils/adt/jsonb.c:1365 #, c-format msgid "array must have even number of elements" msgstr "array:en måste ha ett jämnt antal element" -#: replication/logical/logicalfuncs.c:251 +#: replication/logical/logicalfuncs.c:227 #, c-format msgid "can no longer get changes from replication slot \"%s\"" msgstr "kan inte längre få ändringar från replikeringsslot \"%s\"" -#: replication/logical/logicalfuncs.c:253 replication/slotfuncs.c:648 +#: replication/logical/logicalfuncs.c:229 replication/slotfuncs.c:616 #, c-format -msgid "This slot has never previously reserved WAL, or has been invalidated." -msgstr "Denna slot har aldrig tidigare reserverat WAL eller har invaliderats." +msgid "This slot has never previously reserved WAL, or it has been invalidated." +msgstr "Denna slot har aldrig tidigare reserverat WAL eller så har den invaliderats." -#: replication/logical/logicalfuncs.c:265 +#: replication/logical/logicalfuncs.c:241 #, c-format msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" msgstr "utdata-plugin \"%s\" för logisk avkodning producerar binär utdata men funktionen \"%s\" förväntar sig textdata" -#: replication/logical/origin.c:188 -#, c-format -msgid "only superusers can query or manipulate replication origins" -msgstr "bara superanvändare kan läsa eller ändra replikeringskällor" - -#: replication/logical/origin.c:193 +#: replication/logical/origin.c:189 #, c-format msgid "cannot query or manipulate replication origin when max_replication_slots = 0" msgstr "kan inte se eller ändra replikeringskällor när max_replication_slots = 0" -#: replication/logical/origin.c:198 +#: replication/logical/origin.c:194 #, c-format msgid "cannot manipulate replication origins during recovery" msgstr "kan inte ändra replikeringskällor under tiden återställning sker" -#: replication/logical/origin.c:233 +#: replication/logical/origin.c:228 #, c-format msgid "replication origin \"%s\" does not exist" msgstr "replikeringskälla \"%s\" finns inte" -#: replication/logical/origin.c:324 +#: replication/logical/origin.c:319 #, c-format msgid "could not find free replication origin OID" msgstr "kunde inte hitta ledig replikering-origin-OID" -#: replication/logical/origin.c:372 +#: replication/logical/origin.c:355 #, c-format msgid "could not drop replication origin with OID %d, in use by PID %d" msgstr "kunde inte slänga replikeringskälla med OID %d som används av PID %d" -#: replication/logical/origin.c:464 +#: replication/logical/origin.c:476 #, c-format msgid "replication origin with OID %u does not exist" msgstr "replikeringskälla med OID %u finns inte" -#: replication/logical/origin.c:729 +#: replication/logical/origin.c:741 #, c-format msgid "replication checkpoint has wrong magic %u instead of %u" msgstr "replikeringscheckpoint har fel magiskt tal %u istället för %u" -#: replication/logical/origin.c:770 +#: replication/logical/origin.c:782 #, c-format msgid "could not find free replication state, increase max_replication_slots" msgstr "kunde inte hitta ledig replikeringsplats, öka max_replication_slots" -#: replication/logical/origin.c:788 +#: replication/logical/origin.c:790 +#, c-format +msgid "recovered replication state of node %u to %X/%X" +msgstr "återställde replikeringstillstånd för nod %u till %X/%X" + +#: replication/logical/origin.c:800 #, c-format msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "replikeringsslot-checkpoint har felaktig kontrollsumma %u, förväntade %u" -#: replication/logical/origin.c:916 replication/logical/origin.c:1102 +#: replication/logical/origin.c:928 replication/logical/origin.c:1117 #, c-format msgid "replication origin with OID %d is already active for PID %d" msgstr "replikeringskälla med OID %d är redan aktiv för PID %d" -#: replication/logical/origin.c:927 replication/logical/origin.c:1114 +#: replication/logical/origin.c:939 replication/logical/origin.c:1129 #, c-format msgid "could not find free replication state slot for replication origin with OID %u" msgstr "kunde inte hitta ledig replikerings-state-slot för replikerings-origin med OID %u" -#: replication/logical/origin.c:929 replication/logical/origin.c:1116 -#: replication/slot.c:1762 +#: replication/logical/origin.c:941 replication/logical/origin.c:1131 +#: replication/slot.c:1955 #, c-format msgid "Increase max_replication_slots and try again." msgstr "Öka max_replication_slots och försök igen." -#: replication/logical/origin.c:1073 +#: replication/logical/origin.c:1088 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "kan inte ställa in replikeringskälla när en redan är inställd" -#: replication/logical/origin.c:1153 replication/logical/origin.c:1369 -#: replication/logical/origin.c:1389 +#: replication/logical/origin.c:1168 replication/logical/origin.c:1380 +#: replication/logical/origin.c:1400 #, c-format msgid "no replication origin is configured" msgstr "ingen replikeringskälla är konfigurerad" -#: replication/logical/origin.c:1236 +#: replication/logical/origin.c:1251 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "replikeringskällnamn \"%s\" är reserverat" -#: replication/logical/origin.c:1238 +#: replication/logical/origin.c:1253 #, c-format msgid "Origin names starting with \"pg_\" are reserved." msgstr "Källnamn som startar med \"pg_\" är reserverade." -#: replication/logical/relation.c:302 +#: replication/logical/relation.c:234 #, c-format -msgid "logical replication target relation \"%s.%s\" does not exist" -msgstr "logisk replikeringsmålrelation \"%s.%s\" finns inte" +msgid "\"%s\"" +msgstr "\"%s\"" + +#: replication/logical/relation.c:237 +#, c-format +msgid ", \"%s\"" +msgstr ", \"%s\"" + +#: replication/logical/relation.c:243 +#, c-format +msgid "logical replication target relation \"%s.%s\" is missing replicated column: %s" +msgid_plural "logical replication target relation \"%s.%s\" is missing replicated columns: %s" +msgstr[0] "destinationsrelation \"%s.%s\" för logisk replikering saknar en replikerad kolumn: %s" +msgstr[1] "destinationsrelation \"%s.%s\" för logisk replikering saknar några replikerade kolumner: %s" -#: replication/logical/relation.c:345 +#: replication/logical/relation.c:323 #, c-format -msgid "logical replication target relation \"%s.%s\" is missing some replicated columns" -msgstr "logisk replikeringsmålrelation \"%s.%s\" saknar några replikerade kolumner" +msgid "logical replication target relation \"%s.%s\" does not exist" +msgstr "destinationsrelation \"%s.%s\" för logisk replikering finns inte" -#: replication/logical/relation.c:385 +#: replication/logical/relation.c:404 #, c-format msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" -msgstr "logisk replikeringsmålrelation \"%s.%s\" använder systemkolumner i REPLICA IDENTITY-index" +msgstr "destinationsrelation \"%s.%s\" för logisk replikering använder systemkolumner i REPLICA IDENTITY-index" -#: replication/logical/reorderbuffer.c:2663 +#: replication/logical/reorderbuffer.c:3810 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "kunde inte skriva till datafil för XID %u: %m" -#: replication/logical/reorderbuffer.c:2850 -#: replication/logical/reorderbuffer.c:2875 +#: replication/logical/reorderbuffer.c:4154 +#: replication/logical/reorderbuffer.c:4179 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "kunde inte läsa från reorderbuffer spill-fil: %m" -#: replication/logical/reorderbuffer.c:2854 -#: replication/logical/reorderbuffer.c:2879 +#: replication/logical/reorderbuffer.c:4158 +#: replication/logical/reorderbuffer.c:4183 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "kunde inte läsa från reorderbuffer spill-fil: läste %d istället för %u byte" -#: replication/logical/reorderbuffer.c:3114 +#: replication/logical/reorderbuffer.c:4433 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "kunde inte radera fil \"%s\" vid borttagning av pg_replslot/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:3606 +#: replication/logical/reorderbuffer.c:4932 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "kunde inte läsa från fil \"%s\": läste %d istället för %d byte" -#: replication/logical/snapbuild.c:606 +#: replication/logical/snapbuild.c:597 #, c-format msgid "initial slot snapshot too large" msgstr "initialt slot-snapshot är för stort" -#: replication/logical/snapbuild.c:660 +#: replication/logical/snapbuild.c:651 #, c-format msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" msgstr[0] "exporterade logisk avkodnings-snapshot: \"%s\" med %u transaktions-ID" msgstr[1] "exporterade logisk avkodnings-snapshot: \"%s\" med %u transaktions-ID" -#: replication/logical/snapbuild.c:1265 replication/logical/snapbuild.c:1358 -#: replication/logical/snapbuild.c:1912 +#: replication/logical/snapbuild.c:1279 replication/logical/snapbuild.c:1372 +#: replication/logical/snapbuild.c:1901 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "logisk avkodning hittade konsistent punkt vid %X/%X" -#: replication/logical/snapbuild.c:1267 +#: replication/logical/snapbuild.c:1281 #, c-format msgid "There are no running transactions." msgstr "Det finns inga körande transaktioner." -#: replication/logical/snapbuild.c:1309 +#: replication/logical/snapbuild.c:1323 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "logisk avkodning hittade initial startpunkt vid %X/%X" -#: replication/logical/snapbuild.c:1311 replication/logical/snapbuild.c:1335 +#: replication/logical/snapbuild.c:1325 replication/logical/snapbuild.c:1349 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "Väntar på att transaktioner (cirka %d) äldre än %u skall gå klart." -#: replication/logical/snapbuild.c:1333 +#: replication/logical/snapbuild.c:1347 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "logisk avkodning hittade initial konsistent punkt vid %X/%X" -#: replication/logical/snapbuild.c:1360 +#: replication/logical/snapbuild.c:1374 #, c-format msgid "There are no old transactions anymore." msgstr "Det finns inte längre några gamla transaktioner." -#: replication/logical/snapbuild.c:1754 +#: replication/logical/snapbuild.c:1769 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "snapbuild-state-fil \"%s\" har fel magiskt tal: %u istället för %u" -#: replication/logical/snapbuild.c:1760 +#: replication/logical/snapbuild.c:1775 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "snapbuild-state-fil \"%s\" har en ej stödd version: %u istället för %u" -#: replication/logical/snapbuild.c:1859 +#: replication/logical/snapbuild.c:1846 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "checksumma stämmer inte för snapbuild-state-fil \"%s\": är %u, skall vara %u" -#: replication/logical/snapbuild.c:1914 +#: replication/logical/snapbuild.c:1903 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Logisk avkodning kommer starta med sparat snapshot." -#: replication/logical/snapbuild.c:1986 +#: replication/logical/snapbuild.c:1975 #, c-format msgid "could not parse file name \"%s\"" msgstr "kunde inte parsa filnamn \"%s\"" -#: replication/logical/tablesync.c:132 +#: replication/logical/tablesync.c:151 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" msgstr "logisk replikerings tabellsynkroniseringsarbetare för prenumeration \"%s\", tabell \"%s\" är klar" -#: replication/logical/tablesync.c:664 +#: replication/logical/tablesync.c:422 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" +msgid "logical replication apply worker for subscription \"%s\" will restart so that two_phase can be enabled" +msgstr "arbetarprocess för uppspelning av logisk replikering av prenumeration \"%s\" kommer starta om på grund av ändrade parametrar" + +#: replication/logical/tablesync.c:732 replication/logical/tablesync.c:875 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "kunde inte hämta tabellinfo för tabell \"%s.%s\" från publicerare: %s" -#: replication/logical/tablesync.c:670 +#: replication/logical/tablesync.c:739 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "tabell \"%s.%s\" hittades inte hos publicerare" -#: replication/logical/tablesync.c:704 -#, c-format -msgid "could not fetch table info for table \"%s.%s\": %s" -msgstr "kunde inte hämta tabellinfo för tabell \"%s.%s\": %s" +#: replication/logical/tablesync.c:815 +#, fuzzy, c-format +#| msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "kunde inte hämta tabellinfo för tabell \"%s.%s\" från publicerare: %s" + +#: replication/logical/tablesync.c:983 +#, fuzzy, c-format +#| msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" +msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" +msgstr "kunde inte hämta tabellinfo för tabell \"%s.%s\" från publicerare: %s" -#: replication/logical/tablesync.c:791 +#: replication/logical/tablesync.c:1120 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "kunde inte starta initial innehållskopiering för tabell \"%s.%s\": %s" -#: replication/logical/tablesync.c:905 +#: replication/logical/tablesync.c:1332 replication/logical/worker.c:1631 +#, c-format +msgid "\"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "" + +#: replication/logical/tablesync.c:1347 #, c-format -msgid "table copy could not start transaction on publisher" -msgstr "tabellkopiering kunde inte starta transaktion på publiceraren" +msgid "table copy could not start transaction on publisher: %s" +msgstr "tabellkopiering kunde inte starta transaktion på publiceraren: %s" -#: replication/logical/tablesync.c:927 +#: replication/logical/tablesync.c:1396 #, c-format -msgid "table copy could not finish transaction on publisher" -msgstr "tabellkopiering kunde inte slutföra transaktion på publiceraren" +msgid "replication origin \"%s\" already exists" +msgstr "replikeringsurspring \"%s\" finns redan" -#: replication/logical/worker.c:313 +#: replication/logical/tablesync.c:1409 #, c-format -msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\", remote type %s, local type %s" -msgstr "processar fjärrdata för replikeringsmålrelation \"%s.%s\" kolumn \"%s\", fjärrtyp %s, lokal typ %s" +msgid "table copy could not finish transaction on publisher: %s" +msgstr "tabellkopiering kunde inte slutföra transaktion på publiceraren: %s" -#: replication/logical/worker.c:552 +#: replication/logical/worker.c:671 replication/logical/worker.c:786 #, c-format -msgid "ORIGIN message sent out of order" -msgstr "ORIGIN-meddelande skickat i fel ordning" +msgid "incorrect binary data format in logical replication column %d" +msgstr "inkorrekt binärt dataformat i logisk replikeringskolumn %d" -#: replication/logical/worker.c:702 +#: replication/logical/worker.c:1417 replication/logical/worker.c:1431 +#, c-format +msgid "could not read from streaming transaction's changes file \"%s\": %m" +msgstr "kunde inte läsa från strömmande transaktionens ändringfil \"%s\": %m" + +#: replication/logical/worker.c:1750 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" msgstr "publicerare skickade inte identitetskolumn för replika som förväntades av den logiska replikeringens målrelation \"%s.%s\"" -#: replication/logical/worker.c:709 +#: replication/logical/worker.c:1757 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "logisk replikeringsmålrelation \"%s.%s\" har varken REPLICA IDENTITY-index eller PRIMARY KEY och den publicerade relationen har inte REPLICA IDENTITY FULL" -#: replication/logical/worker.c:1394 +#: replication/logical/worker.c:2552 #, c-format msgid "invalid logical replication message type \"%c\"" msgstr "ogiltig logisk replikeringsmeddelandetyp \"%c\"" -#: replication/logical/worker.c:1537 +#: replication/logical/worker.c:2716 #, c-format msgid "data stream from publisher has ended" msgstr "dataströmmen från publiceraren har avslutats" -#: replication/logical/worker.c:1692 +#: replication/logical/worker.c:2867 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "avslutar logisk replikeringsarbetare på grund av timeout" -#: replication/logical/worker.c:1837 +#: replication/logical/worker.c:3024 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" kommer stoppa då prenumerationen har tagits bort" -#: replication/logical/worker.c:1851 +#: replication/logical/worker.c:3035 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" kommer stoppa då prenumerationen har stängts av" -#: replication/logical/worker.c:1865 -#, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because the connection information was changed" -msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" kommer starta om då uppkopplingsinformationen ändrats" - -#: replication/logical/worker.c:1879 +#: replication/logical/worker.c:3061 #, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because subscription was renamed" -msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" kommer starta om då prenumerationen bytt namn" +msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" +msgstr "arbetarprocess för uppspelning av logisk replikering av prenumeration \"%s\" kommer starta om på grund av ändrade parametrar" -#: replication/logical/worker.c:1896 +#: replication/logical/worker.c:3185 replication/logical/worker.c:3207 #, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because the replication slot name was changed" -msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" kommer starta om då replikeringsslotten bytt namn" +msgid "could not read from streaming transaction's subxact file \"%s\": %m" +msgstr "kunde inte läsa från strömmande transaktions subxact-fil \"%s\": %m" -#: replication/logical/worker.c:1910 -#, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because subscription's publications were changed" -msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" kommer starta om då prenumerationens publiceringar ändrats" - -#: replication/logical/worker.c:2006 +#: replication/logical/worker.c:3606 #, c-format msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" msgstr "logisk replikerings uppspelningsarbetare för prenumeration %u kommer inte starta då prenumerationen togs bort under uppstart" -#: replication/logical/worker.c:2018 +#: replication/logical/worker.c:3618 #, c-format msgid "logical replication apply worker for subscription \"%s\" will not start because the subscription was disabled during startup" msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" kommer inte starta då prenumerationen stänges av under uppstart" -#: replication/logical/worker.c:2036 +#: replication/logical/worker.c:3636 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "logisk replikerings tabellsynkroniseringsarbetare för prenumeration \"%s\", tabell \"%s\" har startat" -#: replication/logical/worker.c:2040 +#: replication/logical/worker.c:3640 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" har startat" -#: replication/logical/worker.c:2079 +#: replication/logical/worker.c:3681 #, c-format msgid "subscription has no replication slot set" msgstr "prenumeration har ingen replikeringsslot angiven" -#: replication/pgoutput/pgoutput.c:147 +#: replication/logical/worker.c:3768 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription \"%s\" has started" +msgid "logical replication apply worker for subscription \"%s\" two_phase is %s" +msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" har startat" + +#: replication/logical/worker.c:3817 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription \"%s\" has started" +msgid "logical replication subscription \"%s\" has been disabled due to an error" +msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" har startat" + +#: replication/logical/worker.c:3856 +#, c-format +msgid "start skipping logical replication transaction finished at %X/%X" +msgstr "" + +#: replication/logical/worker.c:3870 +#, c-format +msgid "done skipping logical replication transaction finished at %X/%X" +msgstr "" + +#: replication/logical/worker.c:3952 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription \"%s\" has started" +msgid "skip-LSN of logical replication subscription \"%s\" cleared" +msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" har startat" + +#: replication/logical/worker.c:3953 +#, c-format +msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X" +msgstr "" + +#: replication/logical/worker.c:3979 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during \"%s\"" +msgstr "processar fjärrdata för replikeringsmålrelation \"%s.%s\" kolumn \"%s\"" + +#: replication/logical/worker.c:3983 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during \"%s\" in transaction %u" +msgstr "processar fjärrdata för replikeringsmålrelation \"%s.%s\" kolumn \"%s\"" + +#: replication/logical/worker.c:3988 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during \"%s\" in transaction %u finished at %X/%X" +msgstr "processar fjärrdata för replikeringsmålrelation \"%s.%s\" kolumn \"%s\"" + +#: replication/logical/worker.c:3995 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during \"%s\" for replication target relation \"%s.%s\" in transaction %u finished at %X/%X" +msgstr "processar fjärrdata för replikeringsmålrelation \"%s.%s\" kolumn \"%s\"" + +#: replication/logical/worker.c:4003 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u finished at %X/%X" +msgstr "processar fjärrdata för replikeringsmålrelation \"%s.%s\" kolumn \"%s\"" + +#: replication/pgoutput/pgoutput.c:319 #, c-format msgid "invalid proto_version" msgstr "ogiltig proto_version" -#: replication/pgoutput/pgoutput.c:152 +#: replication/pgoutput/pgoutput.c:324 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version \"%s\" är utanför giltigt intervall" -#: replication/pgoutput/pgoutput.c:169 +#: replication/pgoutput/pgoutput.c:341 #, c-format msgid "invalid publication_names syntax" msgstr "ogiltig publication_names-syntax" -#: replication/pgoutput/pgoutput.c:211 +#: replication/pgoutput/pgoutput.c:425 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or lower" msgstr "klienten skickade proto_version=%d men vi stöder bara protokoll %d eller lägre" -#: replication/pgoutput/pgoutput.c:217 +#: replication/pgoutput/pgoutput.c:431 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or higher" msgstr "klienten skickade proto_version=%d men vi stöder bara protokoll %d eller högre" -#: replication/pgoutput/pgoutput.c:223 +#: replication/pgoutput/pgoutput.c:437 #, c-format msgid "publication_names parameter missing" msgstr "saknar parameter publication_names" -#: replication/slot.c:183 +#: replication/pgoutput/pgoutput.c:450 +#, c-format +msgid "requested proto_version=%d does not support streaming, need %d or higher" +msgstr "efterfrågade proto_version=%d stöder inte strömning, kräver %d eller högre" + +#: replication/pgoutput/pgoutput.c:455 +#, c-format +msgid "streaming requested, but not supported by output plugin" +msgstr "ströming begärdes men det stöds inte av utdata-plugin:en" + +#: replication/pgoutput/pgoutput.c:472 +#, fuzzy, c-format +#| msgid "requested proto_version=%d does not support streaming, need %d or higher" +msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" +msgstr "efterfrågade proto_version=%d stöder inte strömning, kräver %d eller högre" + +#: replication/pgoutput/pgoutput.c:477 +#, fuzzy, c-format +#| msgid "streaming requested, but not supported by output plugin" +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "ströming begärdes men det stöds inte av utdata-plugin:en" + +#: replication/slot.c:209 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "replikeringsslotnamn \"%s\" är för kort" -#: replication/slot.c:192 +#: replication/slot.c:218 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "replikeringsslotnamn \"%s\" är för långt" -#: replication/slot.c:205 +#: replication/slot.c:231 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "replikeringsslotnamn \"%s\" innehåller ogiltiga tecken" -#: replication/slot.c:207 +#: replication/slot.c:233 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "Replikeringsslotnamn får bara innehålla små bokstäver, nummer och understreck." -#: replication/slot.c:254 +#: replication/slot.c:287 #, c-format msgid "replication slot \"%s\" already exists" msgstr "replikeringsslot \"%s\" finns redan" -#: replication/slot.c:264 +#: replication/slot.c:297 #, c-format msgid "all replication slots are in use" msgstr "alla replikeringsslots används" -#: replication/slot.c:265 +#: replication/slot.c:298 #, c-format msgid "Free one or increase max_replication_slots." msgstr "Frigör en eller öka max_replication_slots." -#: replication/slot.c:407 replication/slotfuncs.c:760 +#: replication/slot.c:448 replication/slotfuncs.c:727 +#: utils/activity/pgstat_replslot.c:55 utils/adt/genfile.c:704 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "replikeringsslot \"%s\" existerar inte" -#: replication/slot.c:445 replication/slot.c:1006 +#: replication/slot.c:494 replication/slot.c:1089 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "replikeringsslot \"%s\" är aktiv för PID %d" -#: replication/slot.c:683 replication/slot.c:1314 replication/slot.c:1697 +#: replication/slot.c:752 replication/slot.c:1507 replication/slot.c:1890 #, c-format msgid "could not remove directory \"%s\"" msgstr "kunde inte ta bort katalog \"%s\"" -#: replication/slot.c:1041 +#: replication/slot.c:1124 #, c-format msgid "replication slots can only be used if max_replication_slots > 0" msgstr "replikeringsslots kan bara användas om max_replication_slots > 0" -#: replication/slot.c:1046 +#: replication/slot.c:1129 #, c-format msgid "replication slots can only be used if wal_level >= replica" msgstr "replikeringsslots kan bara användas om wal_level >= replica" -#: replication/slot.c:1202 +#: replication/slot.c:1141 +#, c-format +msgid "must be superuser or replication role to use replication slots" +msgstr "måste vara superuser eller replikeringsroll för att använda replikeringsslottar" + +#: replication/slot.c:1326 #, c-format -msgid "terminating process %d because replication slot \"%s\" is too far behind" -msgstr "avslutar process %d då replikeringsslot \"%s\" är för långt efter" +msgid "terminating process %d to release replication slot \"%s\"" +msgstr "avslutar process %d för att frigöra replikeringsslot \"%s\"" -#: replication/slot.c:1221 +#: replication/slot.c:1370 #, c-format msgid "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds max_slot_wal_keep_size" msgstr "invaliderar slot \"%s\" då dess restart_lsn %X/%X överskrider max_slot_wal_keep_size" -#: replication/slot.c:1635 +#: replication/slot.c:1828 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "replikeringsslotfil \"%s\" har fel magiskt nummer: %u istället för %u" -#: replication/slot.c:1642 +#: replication/slot.c:1835 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "replikeringsslotfil \"%s\" har en icke stödd version %u" -#: replication/slot.c:1649 +#: replication/slot.c:1842 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "replikeringsslotfil \"%s\" har felaktig längd %u" -#: replication/slot.c:1685 +#: replication/slot.c:1878 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "kontrollsummefel för replikeringsslot-fil \"%s\": är %u, skall vara %u" -#: replication/slot.c:1719 +#: replication/slot.c:1912 #, c-format msgid "logical replication slot \"%s\" exists, but wal_level < logical" msgstr "logisk replikeringsslot \"%s\" finns men wal_level < replica" -#: replication/slot.c:1721 +#: replication/slot.c:1914 #, c-format msgid "Change wal_level to be logical or higher." msgstr "Ändra wal_level till logical eller högre." -#: replication/slot.c:1725 +#: replication/slot.c:1918 #, c-format msgid "physical replication slot \"%s\" exists, but wal_level < replica" msgstr "fysisk replikeringsslot \"%s\" finns men wal_level < replica" -#: replication/slot.c:1727 +#: replication/slot.c:1920 #, c-format msgid "Change wal_level to be replica or higher." msgstr "Ändra wal_level till replica eller högre." -#: replication/slot.c:1761 +#: replication/slot.c:1954 #, c-format msgid "too many replication slots active before shutdown" msgstr "för många aktiva replikeringsslottar innan nerstängning" -#: replication/slotfuncs.c:624 +#: replication/slotfuncs.c:592 #, c-format msgid "invalid target WAL LSN" msgstr "ogiltig mål-LSN för WAL" -#: replication/slotfuncs.c:646 +#: replication/slotfuncs.c:614 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "replikeringsslot \"%s\" kan inte avanceras" -#: replication/slotfuncs.c:664 +#: replication/slotfuncs.c:632 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" msgstr "kan inte flytta fram replikeringsslot till %X/%X, minimum är %X/%X" -#: replication/slotfuncs.c:772 +#: replication/slotfuncs.c:739 #, c-format msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" msgstr "kan inte kopiera fysisk replikeringsslot \"%s\" som en logisk replikeringsslot" -#: replication/slotfuncs.c:774 +#: replication/slotfuncs.c:741 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "kan inte kopiera logisk replikeringsslot \"%s\" som en fysisk replikeringsslot" -#: replication/slotfuncs.c:781 +#: replication/slotfuncs.c:748 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "kan inte kopiera en replikeringsslot som inte tidigare har reserverat WAL" -#: replication/slotfuncs.c:857 +#: replication/slotfuncs.c:825 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "kunde inte kopiera replikeringsslot \"%s\"" -#: replication/slotfuncs.c:859 +#: replication/slotfuncs.c:827 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "Källreplikeringsslotten ändrades på ett inkompatibelt sätt under copy-operationen." -#: replication/slotfuncs.c:865 +#: replication/slotfuncs.c:833 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "kan inte kopiera ej slutförd replikeringsslot \"%s\"" -#: replication/slotfuncs.c:867 +#: replication/slotfuncs.c:835 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "Försök igen när källreplikeringsslottens confirmed_flush_lsn är giltig." -#: replication/syncrep.c:257 +#: replication/syncrep.c:268 #, c-format msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" msgstr "avbryter väntan på synkron replikering samt avslutar anslutning på grund av ett administratörskommando" -#: replication/syncrep.c:258 replication/syncrep.c:275 +#: replication/syncrep.c:269 replication/syncrep.c:286 #, c-format msgid "The transaction has already committed locally, but might not have been replicated to the standby." msgstr "Transaktionen har redan commit:ats lokalt men har kanske inte replikerats till standby:en." -#: replication/syncrep.c:274 +#: replication/syncrep.c:285 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "avbryter väntan på synkron replikering efter användarens önskemål" -#: replication/syncrep.c:416 -#, c-format -msgid "standby \"%s\" now has synchronous standby priority %u" -msgstr "standby \"%s\" har nu synkron standby-prioritet %u" - -#: replication/syncrep.c:483 +#: replication/syncrep.c:494 #, c-format msgid "standby \"%s\" is now a synchronous standby with priority %u" msgstr "standby \"%s\" är nu en synkron standby med prioritet %u" -#: replication/syncrep.c:487 +#: replication/syncrep.c:498 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "standby \"%s\" är nu en kvorumkandidat för synkron standby" -#: replication/syncrep.c:1034 +#: replication/syncrep.c:1045 #, c-format msgid "synchronous_standby_names parser failed" msgstr "synchronous_standby_names-parser misslyckades" -#: replication/syncrep.c:1040 +#: replication/syncrep.c:1051 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "antal synkrona standbys (%d) måste vara fler än noll" -#: replication/walreceiver.c:171 +#: replication/walreceiver.c:164 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "avslutar wal-mottagarprocessen på grund av ett administratörskommando" -#: replication/walreceiver.c:297 +#: replication/walreceiver.c:292 #, c-format msgid "could not connect to the primary server: %s" msgstr "kunde inte ansluta till primärserver: %s" -#: replication/walreceiver.c:343 +#: replication/walreceiver.c:339 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "databassystemets identifierare skiljer sig åt mellan primären och standby:en" -#: replication/walreceiver.c:344 +#: replication/walreceiver.c:340 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "Primärens identifierare är %s, standby:ens identifierare är %s." -#: replication/walreceiver.c:354 +#: replication/walreceiver.c:351 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "högsta tidslinjen %u i primären är efter återställningstidslinjen %u" -#: replication/walreceiver.c:408 +#: replication/walreceiver.c:404 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "startade strömning av WAL från primären vid %X/%X på tidslinje %u" -#: replication/walreceiver.c:413 +#: replication/walreceiver.c:408 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "återstartade WAL-strömning vid %X/%X på tidslinje %u" -#: replication/walreceiver.c:442 +#: replication/walreceiver.c:437 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "kan inte fortsätta WAL-strömning, återställning har redan avslutats" -#: replication/walreceiver.c:479 +#: replication/walreceiver.c:475 #, c-format msgid "replication terminated by primary server" msgstr "replikering avslutad av primär server" -#: replication/walreceiver.c:480 +#: replication/walreceiver.c:476 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "Slut på WAL nådd på tidslinje %u vid %X/%X." -#: replication/walreceiver.c:568 +#: replication/walreceiver.c:565 #, c-format msgid "terminating walreceiver due to timeout" msgstr "avslutar wal-mottagare på grund av timeout" -#: replication/walreceiver.c:606 +#: replication/walreceiver.c:603 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "primär server har ingen mer WAL på efterfrågad tidslinje %u" -#: replication/walreceiver.c:622 replication/walreceiver.c:938 +#: replication/walreceiver.c:619 replication/walreceiver.c:1045 #, c-format msgid "could not close log segment %s: %m" msgstr "kunde inte stänga loggsegment %s: %m" -#: replication/walreceiver.c:742 +#: replication/walreceiver.c:738 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "hämtar tidslinjehistorikfil för tidslinje %u från primära servern" -#: replication/walreceiver.c:985 +#: replication/walreceiver.c:933 #, c-format msgid "could not write to log segment %s at offset %u, length %lu: %m" msgstr "kunde inte skriva till loggfilsegment %s på offset %u, längd %lu: %m" -#: replication/walsender.c:523 storage/smgr/md.c:1291 +#: replication/walsender.c:521 +#, c-format +msgid "cannot use \"%s\" with logical replication slot \"%s\"" +msgstr "kan inte använda \"%s\" med logisk replikeringsslot \"%s\"" + +#: replication/walsender.c:639 storage/smgr/md.c:1333 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "kunde inte söka (seek) till slutet av filen \"%s\": %m" -#: replication/walsender.c:527 +#: replication/walsender.c:643 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "kunde inte söka till början av filen \"%s\": %m" -#: replication/walsender.c:578 -#, c-format -msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" -msgstr "IDENTIFY_SYSTEM har inte körts före START_REPLICATION" - -#: replication/walsender.c:607 +#: replication/walsender.c:720 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "kan inte använda logisk replikeringsslot för fysisk replikering" -#: replication/walsender.c:676 +#: replication/walsender.c:786 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "efterfrågad startpunkt %X/%X på tidslinje %u finns inte i denna servers historik" -#: replication/walsender.c:680 +#: replication/walsender.c:789 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "Denna servers historik delade sig från tidslinje %u vid %X/%X." -#: replication/walsender.c:725 +#: replication/walsender.c:833 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "efterfrågad startpunkt %X/%X är längre fram än denna servers flush:ade WAL-skrivposition %X/%X" +#: replication/walsender.c:1016 +#, c-format +msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" +msgstr "okänt värde för CREATE_REPLICATION_SLOT-flagga \"%s\": \"%s\"" + #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:976 +#: replication/walsender.c:1101 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s får inte anropas i en transaktion" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:986 +#: replication/walsender.c:1111 #, c-format msgid "%s must be called inside a transaction" msgstr "%s måste anropas i en transaktion" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:992 +#: replication/walsender.c:1117 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s måste anropas i transaktions REPEATABLE READ-isolationsläge" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:998 +#: replication/walsender.c:1123 #, c-format msgid "%s must be called before any query" msgstr "%s måste anropas innan någon fråga" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1004 +#: replication/walsender.c:1129 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s får inte anropas i en undertransaktion" -#: replication/walsender.c:1148 +#: replication/walsender.c:1272 #, c-format msgid "cannot read from logical replication slot \"%s\"" msgstr "kan inte läsa från logisk replikeringsslot \"%s\"" -#: replication/walsender.c:1150 +#: replication/walsender.c:1274 #, c-format msgid "This slot has been invalidated because it exceeded the maximum reserved size." msgstr "Denna slot har invaliderats då den överskred maximal reserverad storlek." -#: replication/walsender.c:1160 +#: replication/walsender.c:1284 #, c-format msgid "terminating walsender process after promotion" msgstr "stänger ner walsender-process efter befordring" -#: replication/walsender.c:1534 +#: replication/walsender.c:1705 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "kan inte utföra nya kommandon när WAL-sändare är i stopp-läge" -#: replication/walsender.c:1567 +#: replication/walsender.c:1740 +#, c-format +msgid "cannot execute SQL commands in WAL sender for physical replication" +msgstr "kan inte köra SQL-kommandon i WAL-sändare för fysisk replikering" + +#: replication/walsender.c:1773 #, c-format msgid "received replication command: %s" msgstr "tog emot replikeringskommando: %s" -#: replication/walsender.c:1583 tcop/fastpath.c:279 tcop/postgres.c:1103 -#: tcop/postgres.c:1455 tcop/postgres.c:1716 tcop/postgres.c:2174 -#: tcop/postgres.c:2535 tcop/postgres.c:2614 +#: replication/walsender.c:1781 tcop/fastpath.c:208 tcop/postgres.c:1114 +#: tcop/postgres.c:1465 tcop/postgres.c:1705 tcop/postgres.c:2190 +#: tcop/postgres.c:2600 tcop/postgres.c:2678 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "aktuella transaktionen har avbrutits, alla kommandon ignoreras tills slutet på transaktionen" -#: replication/walsender.c:1670 -#, c-format -msgid "cannot execute SQL commands in WAL sender for physical replication" -msgstr "kan inte köra SQL-kommandon i WAL-sändare för fysisk replikering" - -#: replication/walsender.c:1715 replication/walsender.c:1731 +#: replication/walsender.c:1923 replication/walsender.c:1958 #, c-format msgid "unexpected EOF on standby connection" msgstr "oväntat EOF från standby-anslutning" -#: replication/walsender.c:1745 -#, c-format -msgid "unexpected standby message type \"%c\", after receiving CopyDone" -msgstr "oväntat standby-meddelandetyp \"%c\" efter att vi tagit emot CopyDone" - -#: replication/walsender.c:1783 +#: replication/walsender.c:1946 #, c-format msgid "invalid standby message type \"%c\"" msgstr "ogiltigt standby-meddelandetyp \"%c\"" -#: replication/walsender.c:1824 +#: replication/walsender.c:2035 #, c-format msgid "unexpected message type \"%c\"" msgstr "oväntad meddelandetyp \"%c\"" -#: replication/walsender.c:2242 +#: replication/walsender.c:2448 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "avslutar walsender-process på grund av replikerings-timeout" -#: replication/walsender.c:2319 -#, c-format -msgid "\"%s\" has now caught up with upstream server" -msgstr "\"%s\" har nu kommit ikapp servern uppströms" - -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:989 +#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1001 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "regel \"%s\" för relation \"%s\" existerar redan" -#: rewrite/rewriteDefine.c:301 +#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:939 +#, fuzzy, c-format +#| msgid "portal \"%s\" cannot be run" +msgid "relation \"%s\" cannot have rules" +msgstr "portal \"%s\" kan inte köras" + +#: rewrite/rewriteDefine.c:302 #, c-format msgid "rule actions on OLD are not implemented" msgstr "regelhandlingar på OLD är inte implementerat" -#: rewrite/rewriteDefine.c:302 +#: rewrite/rewriteDefine.c:303 #, c-format msgid "Use views or triggers instead." msgstr "Använd vyer eller utlösare (trigger) istället." -#: rewrite/rewriteDefine.c:306 +#: rewrite/rewriteDefine.c:307 #, c-format msgid "rule actions on NEW are not implemented" msgstr "regelhandlingar på NEW är inte implementerat" -#: rewrite/rewriteDefine.c:307 +#: rewrite/rewriteDefine.c:308 #, c-format msgid "Use triggers instead." msgstr "Använd utlösare (trigger) istället." -#: rewrite/rewriteDefine.c:320 +#: rewrite/rewriteDefine.c:321 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "INSTEAD NOTHING-regler på SELECT är inte implementerat ännu" -#: rewrite/rewriteDefine.c:321 +#: rewrite/rewriteDefine.c:322 #, c-format msgid "Use views instead." msgstr "Använd vyer istället." -#: rewrite/rewriteDefine.c:329 +#: rewrite/rewriteDefine.c:330 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "flera regelhandlingar på SELECT är inte implementerat" -#: rewrite/rewriteDefine.c:339 +#: rewrite/rewriteDefine.c:340 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "regler på SELECT måste ha handlingen INSTEAD SELECT" -#: rewrite/rewriteDefine.c:347 +#: rewrite/rewriteDefine.c:348 #, c-format msgid "rules on SELECT must not contain data-modifying statements in WITH" msgstr "regler på SELECT får inte innehålla datamodifierande satser i WITH" -#: rewrite/rewriteDefine.c:355 +#: rewrite/rewriteDefine.c:356 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "händelsebegränsningar är inte implementerat för regler på SELECT" -#: rewrite/rewriteDefine.c:382 +#: rewrite/rewriteDefine.c:383 #, c-format msgid "\"%s\" is already a view" msgstr "\"%s\" är redan en vy" -#: rewrite/rewriteDefine.c:406 +#: rewrite/rewriteDefine.c:407 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "vy-regel (rule) för \"%s\" måste ha namnet \"%s\"" -#: rewrite/rewriteDefine.c:434 +#: rewrite/rewriteDefine.c:436 #, c-format msgid "cannot convert partitioned table \"%s\" to a view" msgstr "kan inte konvertera partitionerad tabell \"%s\" till en vy" -#: rewrite/rewriteDefine.c:440 +#: rewrite/rewriteDefine.c:445 #, c-format msgid "cannot convert partition \"%s\" to a view" msgstr "kan inte konvertera partition \"%s\" till en vy" -#: rewrite/rewriteDefine.c:449 +#: rewrite/rewriteDefine.c:454 #, c-format msgid "could not convert table \"%s\" to a view because it is not empty" msgstr "kunde inte konvertera tabell \"%s\" till en vy då den inte är tom" -#: rewrite/rewriteDefine.c:458 +#: rewrite/rewriteDefine.c:463 #, c-format msgid "could not convert table \"%s\" to a view because it has triggers" msgstr "kunde inte konvertera tabell \"%s\" till en vy då den har utlösare" -#: rewrite/rewriteDefine.c:460 +#: rewrite/rewriteDefine.c:465 #, c-format msgid "In particular, the table cannot be involved in any foreign key relationships." msgstr "Mer specifikt, tabellen kan inte vare inblandad i främmande-nyckelberoenden." -#: rewrite/rewriteDefine.c:465 +#: rewrite/rewriteDefine.c:470 #, c-format msgid "could not convert table \"%s\" to a view because it has indexes" msgstr "kunde inte konvertera tabell \"%s\" till en vy eftersom den har index" -#: rewrite/rewriteDefine.c:471 +#: rewrite/rewriteDefine.c:476 #, c-format msgid "could not convert table \"%s\" to a view because it has child tables" msgstr "kunde inte konvertera tabell \"%s\" till en vy då den har barntabeller" -#: rewrite/rewriteDefine.c:477 +#: rewrite/rewriteDefine.c:482 +#, c-format +msgid "could not convert table \"%s\" to a view because it has parent tables" +msgstr "kunde inte konvertera tabell \"%s\" till en vy då den har föräldratabeller" + +#: rewrite/rewriteDefine.c:488 #, c-format msgid "could not convert table \"%s\" to a view because it has row security enabled" msgstr "kunde inte konvertera tabell \"%s\" till en vy eftersom den har radsäkerhet påslagen" -#: rewrite/rewriteDefine.c:483 +#: rewrite/rewriteDefine.c:494 #, c-format msgid "could not convert table \"%s\" to a view because it has row security policies" msgstr "kunde inte konvertera tabell \"%s\" till en vy eftersom den har radsäkerhetspolicy" -#: rewrite/rewriteDefine.c:510 +#: rewrite/rewriteDefine.c:521 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "kan inte ha flera RETURNING-listor i en regel" -#: rewrite/rewriteDefine.c:515 +#: rewrite/rewriteDefine.c:526 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "RETURNING-listor stöds inte i villkorade regler" -#: rewrite/rewriteDefine.c:519 +#: rewrite/rewriteDefine.c:530 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "RETURNING-listor stöds inte i icke-INSTEAD-regler" -#: rewrite/rewriteDefine.c:683 +#: rewrite/rewriteDefine.c:694 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "SELECT-regelns mållista har för många poster" -#: rewrite/rewriteDefine.c:684 +#: rewrite/rewriteDefine.c:695 #, c-format msgid "RETURNING list has too many entries" msgstr "RETURNING-lista har för många element" -#: rewrite/rewriteDefine.c:711 +#: rewrite/rewriteDefine.c:722 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "kan inte konvertera en relation som har borttagna kolumner till en vy" -#: rewrite/rewriteDefine.c:712 +#: rewrite/rewriteDefine.c:723 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "kan inte skapa en RETURNING-lista för relationer som innehåller borttagna kolumner" -#: rewrite/rewriteDefine.c:718 +#: rewrite/rewriteDefine.c:729 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "SELECT-regels målpost %d har ett annat kolumnnamn än kolumnen \"%s\"" -#: rewrite/rewriteDefine.c:720 +#: rewrite/rewriteDefine.c:731 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "SELECT-målpost har namn \"%s\"." -#: rewrite/rewriteDefine.c:729 +#: rewrite/rewriteDefine.c:740 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "SELECT-regels målpot %d har en annan typ än kolumnen \"%s\"" -#: rewrite/rewriteDefine.c:731 +#: rewrite/rewriteDefine.c:742 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "RETURNING-listans post %d har en annan typ än kolumnen \"%s\"" -#: rewrite/rewriteDefine.c:734 rewrite/rewriteDefine.c:758 +#: rewrite/rewriteDefine.c:745 rewrite/rewriteDefine.c:769 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "SELECT-målpost har typ %s men kolumnen har typ %s." -#: rewrite/rewriteDefine.c:737 rewrite/rewriteDefine.c:762 +#: rewrite/rewriteDefine.c:748 rewrite/rewriteDefine.c:773 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "RETURNING-listpost har typ %s men kolumnen har typ %s." -#: rewrite/rewriteDefine.c:753 +#: rewrite/rewriteDefine.c:764 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "SELECT-regelns målpost %d har en annan storlek än kolumnen \"%s\"" -#: rewrite/rewriteDefine.c:755 +#: rewrite/rewriteDefine.c:766 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "RETURNING-listpost %d har en annan storlek än kolumnen\"%s\"" -#: rewrite/rewriteDefine.c:772 +#: rewrite/rewriteDefine.c:783 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "SELECT-regels mållista har för få element" -#: rewrite/rewriteDefine.c:773 +#: rewrite/rewriteDefine.c:784 #, c-format msgid "RETURNING list has too few entries" msgstr "RETURNING-lista har för få element" -#: rewrite/rewriteDefine.c:866 rewrite/rewriteDefine.c:980 +#: rewrite/rewriteDefine.c:877 rewrite/rewriteDefine.c:992 #: rewrite/rewriteSupport.c:109 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "regel \"%s\" för relation \"%s\" existerar inte" -#: rewrite/rewriteDefine.c:999 +#: rewrite/rewriteDefine.c:1011 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "byta namn på en ON SELECT-regel tillåts inte" -#: rewrite/rewriteHandler.c:545 +#: rewrite/rewriteHandler.c:554 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "WITH-frågenamn \"%s\" finns både i en regelhändelse och i frågan som skrivs om" -#: rewrite/rewriteHandler.c:605 +#: rewrite/rewriteHandler.c:581 +#, c-format +msgid "INSERT...SELECT rule actions are not supported for queries having data-modifying statements in WITH" +msgstr "INSERT...SELECT-regler stöds inte för frågor som har datamodifierande satser i WITH" + +#: rewrite/rewriteHandler.c:634 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "kan inte ha RETURNING-listor i multipla regler" -#: rewrite/rewriteHandler.c:816 rewrite/rewriteHandler.c:828 +#: rewrite/rewriteHandler.c:866 rewrite/rewriteHandler.c:905 #, c-format -msgid "cannot insert into column \"%s\"" -msgstr "kan inte sätta in i kolumn \"%s\"" +msgid "cannot insert a non-DEFAULT value into column \"%s\"" +msgstr "kan inte sätta in ett icke-DEFAULT-värde i kolumn \"%s\"" -#: rewrite/rewriteHandler.c:817 rewrite/rewriteHandler.c:839 +#: rewrite/rewriteHandler.c:868 rewrite/rewriteHandler.c:934 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "Kolumn \"%s\" är en identitetskolumn definierad som GENERATED ALWAYS." -#: rewrite/rewriteHandler.c:819 +#: rewrite/rewriteHandler.c:870 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Använd OVERRIDING SYSTEM VALUE för att överskugga." -#: rewrite/rewriteHandler.c:838 rewrite/rewriteHandler.c:845 +#: rewrite/rewriteHandler.c:932 rewrite/rewriteHandler.c:940 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "kolumn \"%s\" kan bara uppdateras till DEFAULT" -#: rewrite/rewriteHandler.c:1014 rewrite/rewriteHandler.c:1032 +#: rewrite/rewriteHandler.c:1087 rewrite/rewriteHandler.c:1105 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "flera tilldelningar till samma kolumn \"%s\"" -#: rewrite/rewriteHandler.c:2062 +#: rewrite/rewriteHandler.c:2111 rewrite/rewriteHandler.c:3978 +#, c-format +msgid "infinite recursion detected in rules for relation \"%s\"" +msgstr "oändlig rekursion detekterad i reglerna för relation \"%s\"" + +#: rewrite/rewriteHandler.c:2196 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "oändlig rekursion detekterad i policy för relation \"%s\"" -#: rewrite/rewriteHandler.c:2382 +#: rewrite/rewriteHandler.c:2516 msgid "Junk view columns are not updatable." msgstr "Skräpkolumner i vy är inte uppdateringsbara." -#: rewrite/rewriteHandler.c:2387 +#: rewrite/rewriteHandler.c:2521 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Vykolumner som inte är kolumner i dess basrelation är inte uppdateringsbara." -#: rewrite/rewriteHandler.c:2390 +#: rewrite/rewriteHandler.c:2524 msgid "View columns that refer to system columns are not updatable." msgstr "Vykolumner som refererar till systemkolumner är inte uppdateringsbara." -#: rewrite/rewriteHandler.c:2393 +#: rewrite/rewriteHandler.c:2527 msgid "View columns that return whole-row references are not updatable." msgstr "Vykolumner som returnerar hel-rad-referenser är inte uppdateringsbara." -#: rewrite/rewriteHandler.c:2454 +#: rewrite/rewriteHandler.c:2588 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Vyer som innehåller DISTINCT är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2457 +#: rewrite/rewriteHandler.c:2591 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Vyer som innehåller GROUP BY är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2460 +#: rewrite/rewriteHandler.c:2594 msgid "Views containing HAVING are not automatically updatable." msgstr "Vyer som innehåller HAVING är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2463 +#: rewrite/rewriteHandler.c:2597 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Vyer som innehåller UNION, INTERSECT eller EXCEPT är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2466 +#: rewrite/rewriteHandler.c:2600 msgid "Views containing WITH are not automatically updatable." msgstr "Vyer som innehåller WITH är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2469 +#: rewrite/rewriteHandler.c:2603 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Vyer som innehåller LIMIT eller OFFSET är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2481 +#: rewrite/rewriteHandler.c:2615 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Vyer som returnerar aggregatfunktioner är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2484 +#: rewrite/rewriteHandler.c:2618 msgid "Views that return window functions are not automatically updatable." msgstr "Vyer som returnerar fönsterfunktioner uppdateras inte automatiskt." -#: rewrite/rewriteHandler.c:2487 +#: rewrite/rewriteHandler.c:2621 msgid "Views that return set-returning functions are not automatically updatable." msgstr "Vyer som returnerar mängd-returnerande funktioner är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2494 rewrite/rewriteHandler.c:2498 -#: rewrite/rewriteHandler.c:2506 +#: rewrite/rewriteHandler.c:2628 rewrite/rewriteHandler.c:2632 +#: rewrite/rewriteHandler.c:2640 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "Vyer som inte läser från en ensam tabell eller vy är inte automatiskt uppdateringsbar." -#: rewrite/rewriteHandler.c:2509 +#: rewrite/rewriteHandler.c:2643 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Vyer som innehåller TABLESAMPLE är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2533 +#: rewrite/rewriteHandler.c:2667 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Vyer som inte har några uppdateringsbara kolumner är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:3010 +#: rewrite/rewriteHandler.c:3144 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "kan inte insert:a i kolumn \"%s\" i vy \"%s\"" -#: rewrite/rewriteHandler.c:3018 +#: rewrite/rewriteHandler.c:3152 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "kan inte uppdatera kolumn \"%s\" i view \"%s\"" -#: rewrite/rewriteHandler.c:3496 +#: rewrite/rewriteHandler.c:3639 +#, c-format +msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" +msgstr "DO INSTEAD NOTIFY-regler stöds inte för datamodifierande satser i WITH" + +#: rewrite/rewriteHandler.c:3650 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "DO INSTEAD NOTHING-regler stöds inte för datamodifierande satser i WITH" -#: rewrite/rewriteHandler.c:3510 +#: rewrite/rewriteHandler.c:3664 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "villkorliga DO INSTEAD-regler stöds inte för datamodifierande satser i WITH" -#: rewrite/rewriteHandler.c:3514 +#: rewrite/rewriteHandler.c:3668 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "DO ALSO-regler stöds inte för datamodifierande satser i WITH" -#: rewrite/rewriteHandler.c:3519 +#: rewrite/rewriteHandler.c:3673 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "fler-satsiga DO INSTEAD-regler stöds inte för datamodifierande satser i WITH" -#: rewrite/rewriteHandler.c:3710 rewrite/rewriteHandler.c:3718 -#: rewrite/rewriteHandler.c:3726 +#: rewrite/rewriteHandler.c:3906 rewrite/rewriteHandler.c:3914 +#: rewrite/rewriteHandler.c:3922 #, c-format msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "Vyer med villkorliga DO INSTEAD-regler är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:3819 +#: rewrite/rewriteHandler.c:4015 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "kan inte utföra INSERT RETURNING på relation \"%s\"" -#: rewrite/rewriteHandler.c:3821 +#: rewrite/rewriteHandler.c:4017 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "Du behöver en villkorslös ON INSERT DO INSTEAD-regel med en RETURNING-klausul." -#: rewrite/rewriteHandler.c:3826 +#: rewrite/rewriteHandler.c:4022 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "kan inte utföra UPDATE RETURNING på relation \"%s\"" -#: rewrite/rewriteHandler.c:3828 +#: rewrite/rewriteHandler.c:4024 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "Du behöver en villkorslös ON UPDATE DO INSTEAD-regel med en RETURNING-klausul." -#: rewrite/rewriteHandler.c:3833 +#: rewrite/rewriteHandler.c:4029 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "kan inte utföra DELETE RETURNING på relation \"%s\"" -#: rewrite/rewriteHandler.c:3835 +#: rewrite/rewriteHandler.c:4031 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "Du behöver en villkorslös ON DELETE DO INSTEAD-regel med en RETURNING-klausul." -#: rewrite/rewriteHandler.c:3853 +#: rewrite/rewriteHandler.c:4049 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "INSERT med ON CONFLICT-klausul kan inte användas med tabell som har INSERT- eller UPDATE-regler" -#: rewrite/rewriteHandler.c:3910 +#: rewrite/rewriteHandler.c:4106 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH kan inte användas i en fråga där regler skrivit om den till flera olika frågor" @@ -19747,185 +21484,198 @@ msgstr "WHERE CURRENT OF för en vy är inte implementerat" msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" msgstr "NEW-variabler i ON UPDATE-regler kan inte referera till kolumner som är del av en multiple uppdatering i subjektets UPDATE-kommando" -#: scan.l:458 +#: rewrite/rewriteSearchCycle.c:410 +#, fuzzy, c-format +#| msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" +msgid "with a SEARCH or CYCLE clause, the recursive reference to WITH query \"%s\" must be at the top level of its right-hand SELECT" +msgstr "med en SEARCH- eller CYCLE-klausul så måste vänstersidan av en UNION vara en SELECT" + +#: scan.l:465 msgid "unterminated /* comment" msgstr "ej avslutad /*-kommentar" -#: scan.l:478 +#: scan.l:485 msgid "unterminated bit string literal" msgstr "ej avslutad bitsträngslitteral" -#: scan.l:492 +#: scan.l:499 msgid "unterminated hexadecimal string literal" msgstr "ej avslutad hexadecimal stränglitteral" -#: scan.l:542 +#: scan.l:549 #, c-format msgid "unsafe use of string constant with Unicode escapes" msgstr "osäker användning av strängkonstand med Unicode-escape:r" -#: scan.l:543 +#: scan.l:550 #, c-format msgid "String constants with Unicode escapes cannot be used when standard_conforming_strings is off." msgstr "Strängkonstanter som innehåller Unicode-escapesekvenser kan inte användas när standard_conforming_strings är av." -#: scan.l:604 +#: scan.l:611 msgid "unhandled previous state in xqs" msgstr "tidigare state i xqs som ej kan hanteras" -#: scan.l:678 +#: scan.l:685 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "Unicode-escapesekvenser måste vara \\uXXXX eller \\UXXXXXXXX." -#: scan.l:689 +#: scan.l:696 #, c-format msgid "unsafe use of \\' in a string literal" msgstr "osäker användning av \\' i stränglitteral" -#: scan.l:690 +#: scan.l:697 #, c-format msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." msgstr "Använd '' för att inkludera ett enkelcitattecken i en sträng. \\' är inte säkert i klient-teckenkodning." -#: scan.l:762 +#: scan.l:769 msgid "unterminated dollar-quoted string" msgstr "icke terminerad dollarciterad sträng" -#: scan.l:779 scan.l:789 +#: scan.l:786 scan.l:796 msgid "zero-length delimited identifier" msgstr "noll-längds avdelad identifierare" -#: scan.l:800 syncrep_scanner.l:91 +#: scan.l:807 syncrep_scanner.l:91 msgid "unterminated quoted identifier" msgstr "icke terminerad citerad identifierare" -#: scan.l:963 +#: scan.l:970 msgid "operator too long" msgstr "operatorn är för lång" +#: scan.l:983 +#, fuzzy +#| msgid "missing Language parameter" +msgid "trailing junk after parameter" +msgstr "saknar parameter \"Language\"" + +#: scan.l:1008 scan.l:1012 scan.l:1016 scan.l:1020 +msgid "trailing junk after numeric literal" +msgstr "efterföljande skräp efter numerisk literal" + #. translator: %s is typically the translation of "syntax error" -#: scan.l:1171 +#: scan.l:1183 #, c-format msgid "%s at end of input" msgstr "%s vid slutet av indatan" #. translator: first %s is typically the translation of "syntax error" -#: scan.l:1179 +#: scan.l:1191 #, c-format msgid "%s at or near \"%s\"" msgstr "%s vid eller nära \"%s\"" -#: scan.l:1373 +#: scan.l:1382 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "ickestandard användning av \\' i stränglitteral" -#: scan.l:1374 +#: scan.l:1383 #, c-format msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "Använd '' för att skriva citattecken i strängar eller använd escape-strängsyntac (E'...')." -#: scan.l:1383 +#: scan.l:1392 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "ickestandard användning av \\\\ i strängslitteral" -#: scan.l:1384 +#: scan.l:1393 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "Använd escape-strängsyntax för bakstreck, dvs. E'\\\\'." -#: scan.l:1398 +#: scan.l:1407 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "ickestandard användning av escape i stränglitteral" -#: scan.l:1399 +#: scan.l:1408 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "Använd escape-strängsyntax, dvs E'\\r\\n'." -#: snowball/dict_snowball.c:199 +#: snowball/dict_snowball.c:215 #, c-format msgid "no Snowball stemmer available for language \"%s\" and encoding \"%s\"" msgstr "det finns ingen Snowball-stemmer för språk \"%s\" och kodning \"%s\"" -#: snowball/dict_snowball.c:222 tsearch/dict_ispell.c:74 +#: snowball/dict_snowball.c:238 tsearch/dict_ispell.c:74 #: tsearch/dict_simple.c:49 #, c-format msgid "multiple StopWords parameters" msgstr "multipla StoppOrd-parametrar" -#: snowball/dict_snowball.c:231 +#: snowball/dict_snowball.c:247 #, c-format msgid "multiple Language parameters" msgstr "multipla parametrar \"Language\"" -#: snowball/dict_snowball.c:238 +#: snowball/dict_snowball.c:254 #, c-format msgid "unrecognized Snowball parameter: \"%s\"" msgstr "okänd Snowball-parameter: \"%s\"" -#: snowball/dict_snowball.c:246 +#: snowball/dict_snowball.c:262 #, c-format msgid "missing Language parameter" msgstr "saknar parameter \"Language\"" -#: statistics/dependencies.c:667 statistics/dependencies.c:720 -#: statistics/mcv.c:1477 statistics/mcv.c:1508 statistics/mvdistinct.c:348 -#: statistics/mvdistinct.c:401 utils/adt/pseudotypes.c:42 -#: utils/adt/pseudotypes.c:76 -#, c-format -msgid "cannot accept a value of type %s" -msgstr "kan inte acceptera ett värde av type %s" - -#: statistics/extended_stats.c:145 +#: statistics/extended_stats.c:179 #, c-format msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "statistikobjekt \"%s.%s\" kunde inte beräknas för relation \"%s.%s\"" -#: statistics/mcv.c:1365 utils/adt/jsonfuncs.c:1800 +#: statistics/mcv.c:1372 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "en funktion med post som värde anropades i sammanhang där poster inte kan godtagas." -#: storage/buffer/bufmgr.c:588 storage/buffer/bufmgr.c:669 +#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:763 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "får inte röra temporära tabeller som tillhör andra sessioner" -#: storage/buffer/bufmgr.c:825 +#: storage/buffer/bufmgr.c:841 +#, c-format +msgid "cannot extend relation %s beyond %u blocks" +msgstr "kan inte utöka relation %s utöver %u block" + +#: storage/buffer/bufmgr.c:928 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "oväntad data efter EOF i block %u för relation %s" -#: storage/buffer/bufmgr.c:827 +#: storage/buffer/bufmgr.c:930 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "Detta beteende har observerats med buggiga kärnor; fundera på att uppdatera ditt system." -#: storage/buffer/bufmgr.c:925 +#: storage/buffer/bufmgr.c:1029 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "felaktig sida i block %u för relation %s; nollställer sidan" -#: storage/buffer/bufmgr.c:4211 +#: storage/buffer/bufmgr.c:4657 #, c-format msgid "could not write block %u of %s" msgstr "kunde inte skriva block %u av %s" -#: storage/buffer/bufmgr.c:4213 +#: storage/buffer/bufmgr.c:4659 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Multipla fel --- skrivfelet kan vara permanent." -#: storage/buffer/bufmgr.c:4234 storage/buffer/bufmgr.c:4253 +#: storage/buffer/bufmgr.c:4680 storage/buffer/bufmgr.c:4699 #, c-format msgid "writing block %u of relation %s" msgstr "skriver block %u i relation %s" -#: storage/buffer/bufmgr.c:4556 +#: storage/buffer/bufmgr.c:5003 #, c-format msgid "snapshot too old" msgstr "snapshot för gammal" @@ -19940,226 +21690,270 @@ msgstr "ingen tom lokal buffer tillgänglig" msgid "cannot access temporary tables during a parallel operation" msgstr "kan inte komma åt temporära tabeller under en parallell operation" -#: storage/file/buffile.c:319 +#: storage/file/buffile.c:333 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "kunde inte öppna temporär fil \"%s\" från BufFile \"%s\": %m" -#: storage/file/buffile.c:795 +#: storage/file/buffile.c:723 storage/file/buffile.c:844 #, c-format msgid "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" msgstr "kunde inte bestämma storlek på temporär fil \"%s\" från BufFile \"%s\": %m" -#: storage/file/fd.c:508 storage/file/fd.c:580 storage/file/fd.c:616 +#: storage/file/buffile.c:923 +#, fuzzy, c-format +#| msgid "could not delete file \"%s\": %m" +msgid "could not delete fileset \"%s\": %m" +msgstr "kunde inte radera fil \"%s\": %m" + +#: storage/file/buffile.c:941 storage/smgr/md.c:310 storage/smgr/md.c:873 +#, c-format +msgid "could not truncate file \"%s\": %m" +msgstr "kunde inte trunkera fil \"%s\": %m" + +#: storage/file/fd.c:522 storage/file/fd.c:594 storage/file/fd.c:630 #, c-format msgid "could not flush dirty data: %m" msgstr "kunde inte flush:a smutsig data: %m" -#: storage/file/fd.c:538 +#: storage/file/fd.c:552 #, c-format msgid "could not determine dirty data size: %m" msgstr "kunde inte lista ut storlek på smutsig data: %m" -#: storage/file/fd.c:590 +#: storage/file/fd.c:604 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "kunde inte göra munmap() vid flush:ning av data: %m" -#: storage/file/fd.c:798 +#: storage/file/fd.c:843 #, c-format msgid "could not link file \"%s\" to \"%s\": %m" msgstr "kunde inte länka fil \"%s\" till \"%s\": %m" -#: storage/file/fd.c:881 +#: storage/file/fd.c:967 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit misslyckades: %m" -#: storage/file/fd.c:971 +#: storage/file/fd.c:1057 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "otillräckligt antal fildeskriptorer tillgängligt för att starta serverprocessen" -#: storage/file/fd.c:972 +#: storage/file/fd.c:1058 #, c-format msgid "System allows %d, we need at least %d." msgstr "Systemet tillåter %d, vi behöver minst %d." -#: storage/file/fd.c:1023 storage/file/fd.c:2357 storage/file/fd.c:2467 -#: storage/file/fd.c:2618 +#: storage/file/fd.c:1153 storage/file/fd.c:2496 storage/file/fd.c:2606 +#: storage/file/fd.c:2757 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "slut på fildeskriptorer: %m; frigör och försök igen" -#: storage/file/fd.c:1397 +#: storage/file/fd.c:1527 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "temporär fil: sökväg \"%s\", storlek %lu" -#: storage/file/fd.c:1528 +#: storage/file/fd.c:1658 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "kunde inte skapa temporär katalog \"%s\": %m" -#: storage/file/fd.c:1535 +#: storage/file/fd.c:1665 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "kunde inte skapa temporär underkatalog \"%s\": %m" -#: storage/file/fd.c:1728 +#: storage/file/fd.c:1862 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "kan inte skapa temporär fil \"%s\": %m" -#: storage/file/fd.c:1763 +#: storage/file/fd.c:1898 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "kunde inte öppna temporär fil \"%s\": %m" # unlink refererar till unix-funktionen unlink() så den översätter vi inte -#: storage/file/fd.c:1804 +#: storage/file/fd.c:1939 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "kunde inte unlink:a temporär fil \"%s\": %m" -#: storage/file/fd.c:2068 +#: storage/file/fd.c:2027 +#, c-format +msgid "could not delete file \"%s\": %m" +msgstr "kunde inte radera fil \"%s\": %m" + +#: storage/file/fd.c:2207 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "storlek på temporär fil överskrider temp_file_limit (%dkB)" -#: storage/file/fd.c:2333 storage/file/fd.c:2392 +#: storage/file/fd.c:2472 storage/file/fd.c:2531 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "överskred maxAllocatedDescs (%d) vid försök att öppna fil \"%s\"" -#: storage/file/fd.c:2437 +#: storage/file/fd.c:2576 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "överskred maxAllocatedDescs (%d) vid försök att köra kommando \"%s\"" -#: storage/file/fd.c:2594 +#: storage/file/fd.c:2733 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "överskred maxAllocatedDescs (%d) vid försök att öppna katalog \"%s\"" -#: storage/file/fd.c:3122 +#: storage/file/fd.c:3269 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "oväntad fil hittades i katalogen för temporära filer: \"%s\"" -#: storage/file/sharedfileset.c:111 +#: storage/file/fd.c:3387 +#, c-format +msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/fd.c:3401 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" + +#: storage/file/fd.c:3619 +#, c-format +msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/fd.c:3651 +#, c-format +msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/reinit.c:145 +#, c-format +msgid "resetting unlogged relations (init), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/reinit.c:148 +#, c-format +msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/sharedfileset.c:79 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "kunde inte koppla till en SharedFileSet som redan tagits bort" -#: storage/ipc/dsm.c:338 +#: storage/ipc/dsm.c:353 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "dynamiskt delat minnes kontrollsegment är korrupt" -#: storage/ipc/dsm.c:399 +#: storage/ipc/dsm.c:418 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "dynamiskt delat minnes kontrollsegment är inte giltigt" -#: storage/ipc/dsm.c:494 +#: storage/ipc/dsm.c:600 #, c-format msgid "too many dynamic shared memory segments" msgstr "för många dynamiska delade minnessegment" -#: storage/ipc/dsm_impl.c:230 storage/ipc/dsm_impl.c:526 -#: storage/ipc/dsm_impl.c:630 storage/ipc/dsm_impl.c:801 +#: storage/ipc/dsm_impl.c:233 storage/ipc/dsm_impl.c:529 +#: storage/ipc/dsm_impl.c:633 storage/ipc/dsm_impl.c:804 #, c-format msgid "could not unmap shared memory segment \"%s\": %m" msgstr "kunde inte avmappa delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:240 storage/ipc/dsm_impl.c:536 -#: storage/ipc/dsm_impl.c:640 storage/ipc/dsm_impl.c:811 +#: storage/ipc/dsm_impl.c:243 storage/ipc/dsm_impl.c:539 +#: storage/ipc/dsm_impl.c:643 storage/ipc/dsm_impl.c:814 #, c-format msgid "could not remove shared memory segment \"%s\": %m" msgstr "kunde inte ta bort delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:264 storage/ipc/dsm_impl.c:711 -#: storage/ipc/dsm_impl.c:825 +#: storage/ipc/dsm_impl.c:267 storage/ipc/dsm_impl.c:714 +#: storage/ipc/dsm_impl.c:828 #, c-format msgid "could not open shared memory segment \"%s\": %m" msgstr "kunde inte öppna delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:289 storage/ipc/dsm_impl.c:552 -#: storage/ipc/dsm_impl.c:756 storage/ipc/dsm_impl.c:849 +#: storage/ipc/dsm_impl.c:292 storage/ipc/dsm_impl.c:555 +#: storage/ipc/dsm_impl.c:759 storage/ipc/dsm_impl.c:852 #, c-format msgid "could not stat shared memory segment \"%s\": %m" msgstr "kunde inte göra stat() på delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:316 storage/ipc/dsm_impl.c:900 +#: storage/ipc/dsm_impl.c:319 storage/ipc/dsm_impl.c:903 #, c-format msgid "could not resize shared memory segment \"%s\" to %zu bytes: %m" msgstr "kunde inte ändra storlek på delat minnessegment \"%s\" till %zu byte: %m" -#: storage/ipc/dsm_impl.c:338 storage/ipc/dsm_impl.c:573 -#: storage/ipc/dsm_impl.c:732 storage/ipc/dsm_impl.c:922 +#: storage/ipc/dsm_impl.c:341 storage/ipc/dsm_impl.c:576 +#: storage/ipc/dsm_impl.c:735 storage/ipc/dsm_impl.c:925 #, c-format msgid "could not map shared memory segment \"%s\": %m" msgstr "kunde inte mappa delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:508 +#: storage/ipc/dsm_impl.c:511 #, c-format msgid "could not get shared memory segment: %m" msgstr "kunde inte hämta delat minnessegment: %m" -#: storage/ipc/dsm_impl.c:696 +#: storage/ipc/dsm_impl.c:699 #, c-format msgid "could not create shared memory segment \"%s\": %m" msgstr "kunde inte skapa delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:933 +#: storage/ipc/dsm_impl.c:936 #, c-format msgid "could not close shared memory segment \"%s\": %m" msgstr "kunde inte stänga delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:972 storage/ipc/dsm_impl.c:1020 +#: storage/ipc/dsm_impl.c:976 storage/ipc/dsm_impl.c:1025 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "kunde inte duplicera handle för \"%s\": %m" -#. translator: %s is a syscall name, such as "poll()" -#: storage/ipc/latch.c:940 storage/ipc/latch.c:1095 storage/ipc/latch.c:1308 -#: storage/ipc/latch.c:1461 storage/ipc/latch.c:1581 -#, c-format -msgid "%s failed: %m" -msgstr "%s misslyckades: %m" - -#: storage/ipc/procarray.c:3014 +#: storage/ipc/procarray.c:3830 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "databasen \"%s\" används av förberedda transationer" -#: storage/ipc/procarray.c:3046 storage/ipc/signalfuncs.c:142 +#: storage/ipc/procarray.c:3862 storage/ipc/signalfuncs.c:226 #, c-format msgid "must be a superuser to terminate superuser process" -msgstr "måste vara superanvändare för stoppa superanvändares process" +msgstr "måste vara superuser för stoppa en superusers process" -#: storage/ipc/procarray.c:3053 storage/ipc/signalfuncs.c:147 +#: storage/ipc/procarray.c:3869 storage/ipc/signalfuncs.c:231 #, c-format msgid "must be a member of the role whose process is being terminated or member of pg_signal_backend" msgstr "måste vara medlem i den roll vars process håller på att avslutas eller medlem i pg_signal_backend" -#: storage/ipc/shm_mq.c:368 +#: storage/ipc/procsignal.c:419 +#, c-format +msgid "still waiting for backend with PID %lu to accept ProcSignalBarrier" +msgstr "" + +#: storage/ipc/shm_mq.c:384 #, c-format msgid "cannot send a message of size %zu via shared memory queue" msgstr "kan inte skicka ett meddelande med storlek %zu via kö i delat minne" -#: storage/ipc/shm_mq.c:694 +#: storage/ipc/shm_mq.c:720 #, c-format msgid "invalid message size %zu in shared memory queue" msgstr "ogiltig meddelandestorlek %zu i kö i delat minne" #: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:982 -#: storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 storage/lmgr/lock.c:4175 -#: storage/lmgr/lock.c:4240 storage/lmgr/lock.c:4532 -#: storage/lmgr/predicate.c:2401 storage/lmgr/predicate.c:2416 -#: storage/lmgr/predicate.c:3898 storage/lmgr/predicate.c:5009 -#: utils/hash/dynahash.c:1067 +#: storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 storage/lmgr/lock.c:4259 +#: storage/lmgr/lock.c:4324 storage/lmgr/lock.c:4674 +#: storage/lmgr/predicate.c:2472 storage/lmgr/predicate.c:2487 +#: storage/lmgr/predicate.c:3969 storage/lmgr/predicate.c:5081 +#: utils/hash/dynahash.c:1112 #, c-format msgid "out of shared memory" msgstr "slut på delat minne" @@ -20169,208 +21963,265 @@ msgstr "slut på delat minne" msgid "out of shared memory (%zu bytes requested)" msgstr "slut på delat minne (%zu byte efterfrågat)" -#: storage/ipc/shmem.c:441 +#: storage/ipc/shmem.c:445 #, c-format msgid "could not create ShmemIndex entry for data structure \"%s\"" msgstr "kunde inte skapa ShmemIndex-post för datastrukturen \"%s\"" -#: storage/ipc/shmem.c:456 +#: storage/ipc/shmem.c:460 #, c-format msgid "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, actual %zu" msgstr "ShmemIndex-poststorlek är fel för datastruktur \"%s\": förväntade %zu var %zu" -#: storage/ipc/shmem.c:475 +#: storage/ipc/shmem.c:479 #, c-format msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" msgstr "otillräckligt delat minne för datastruktur \"%s\" (efterfrågade %zu byte)" -#: storage/ipc/shmem.c:507 storage/ipc/shmem.c:526 +#: storage/ipc/shmem.c:511 storage/ipc/shmem.c:530 #, c-format msgid "requested shared memory size overflows size_t" msgstr "efterfrågad delat minnesstorlek överskrider size_t" -#: storage/ipc/signalfuncs.c:67 -#, c-format -msgid "PID %d is not a PostgreSQL server process" +#: storage/ipc/signalfuncs.c:72 +#, fuzzy, c-format +#| msgid "PID %d is not a PostgreSQL server process" +msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %d är inte en PostgreSQL serverprocess" -#: storage/ipc/signalfuncs.c:98 storage/lmgr/proc.c:1366 +#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1430 +#: utils/adt/mcxtfuncs.c:190 #, c-format msgid "could not send signal to process %d: %m" msgstr "kunde inte skicka signal till process %d: %m" -#: storage/ipc/signalfuncs.c:118 +#: storage/ipc/signalfuncs.c:124 #, c-format msgid "must be a superuser to cancel superuser query" -msgstr "måste vara superanvändare för att avbryta superanvändares fråga" +msgstr "måste vara superuser för att avbryta en superusers fråga" -#: storage/ipc/signalfuncs.c:123 +#: storage/ipc/signalfuncs.c:129 #, c-format msgid "must be a member of the role whose query is being canceled or member of pg_signal_backend" msgstr "måste vara medlem i den roll vars fråga håller på att avbrytas eller medlem i pg_signal_backend" -#: storage/ipc/signalfuncs.c:183 +#: storage/ipc/signalfuncs.c:170 +#, c-format +msgid "could not check the existence of the backend with PID %d: %m" +msgstr "kunde inte kontrollera existensen av en backend med PID %d: %m" + +#: storage/ipc/signalfuncs.c:188 +#, c-format +msgid "backend with PID %d did not terminate within %lld millisecond" +msgid_plural "backend with PID %d did not terminate within %lld milliseconds" +msgstr[0] "backend med PID %d terminerade inte inom %lld millisekund" +msgstr[1] "backend med PID %d terminerade inte inom %lld millisekunder" + +#: storage/ipc/signalfuncs.c:219 +#, c-format +msgid "\"timeout\" must not be negative" +msgstr "\"timeout\" kan inte vara negativ" + +#: storage/ipc/signalfuncs.c:271 #, c-format msgid "must be superuser to rotate log files with adminpack 1.0" -msgstr "måste vara superanvändare för att rotera loggfiler med adminpack 1.0" +msgstr "måste vara superuser för att rotera loggfiler med adminpack 1.0" #. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:185 utils/adt/genfile.c:253 +#: storage/ipc/signalfuncs.c:273 utils/adt/genfile.c:250 #, c-format msgid "Consider using %s, which is part of core, instead." msgstr "Du kanske kan använda %s istället som är en del av core." -#: storage/ipc/signalfuncs.c:191 storage/ipc/signalfuncs.c:211 +#: storage/ipc/signalfuncs.c:279 storage/ipc/signalfuncs.c:299 #, c-format msgid "rotation not possible because log collection not active" msgstr "rotering är inte möjligt då logginsamling inte är aktiverad" -#: storage/ipc/standby.c:580 tcop/postgres.c:3177 +#: storage/ipc/standby.c:307 +#, c-format +msgid "recovery still waiting after %ld.%03d ms: %s" +msgstr "återställning väntar fortfarande efter %ld.%03d ms: %s" + +#: storage/ipc/standby.c:316 +#, c-format +msgid "recovery finished waiting after %ld.%03d ms: %s" +msgstr "återställning slutade vänta efter efter %ld.%03d ms: %s" + +#: storage/ipc/standby.c:884 tcop/postgres.c:3330 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "avbryter sats på grund av konflikt med återställning" -#: storage/ipc/standby.c:581 tcop/postgres.c:2469 +#: storage/ipc/standby.c:885 tcop/postgres.c:2485 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "Användartransaktion orsakade deadlock för buffer vid återställning." +#: storage/ipc/standby.c:1424 +msgid "unknown reason" +msgstr "okänt skäl" + +#: storage/ipc/standby.c:1429 +msgid "recovery conflict on buffer pin" +msgstr "återställningskonflikt vid bufferfastlåsning" + +#: storage/ipc/standby.c:1432 +msgid "recovery conflict on lock" +msgstr "återställningskonflikt vid lås" + +#: storage/ipc/standby.c:1435 +msgid "recovery conflict on tablespace" +msgstr "återställningskonflikt vid tabellutrymme" + +#: storage/ipc/standby.c:1438 +msgid "recovery conflict on snapshot" +msgstr "återställningskonflikt vid snapshot" + +#: storage/ipc/standby.c:1441 +msgid "recovery conflict on buffer deadlock" +msgstr "återställningskonflikt vid bufferdeadlock" + +#: storage/ipc/standby.c:1444 +msgid "recovery conflict on database" +msgstr "återställningskonflikt vid databas" + #: storage/large_object/inv_api.c:191 #, c-format msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" msgstr "pg_largeobject-post för OID %u, sida %d har ogiltig datafältstorlek %d" -#: storage/large_object/inv_api.c:272 +#: storage/large_object/inv_api.c:274 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "ogiltiga flaggor för att öppna stort objekt: %d" -#: storage/large_object/inv_api.c:462 +#: storage/large_object/inv_api.c:457 #, c-format msgid "invalid whence setting: %d" msgstr "ogiltig whence-inställning: %d" -#: storage/large_object/inv_api.c:634 +#: storage/large_object/inv_api.c:629 #, c-format msgid "invalid large object write request size: %d" msgstr "ogiltig storlek för stort objects skrivningbegäran: %d" -#: storage/lmgr/deadlock.c:1124 +#: storage/lmgr/deadlock.c:1122 #, c-format msgid "Process %d waits for %s on %s; blocked by process %d." msgstr "Process %d väntar på %s för %s; blockerad av process %d." -#: storage/lmgr/deadlock.c:1143 +#: storage/lmgr/deadlock.c:1141 #, c-format msgid "Process %d: %s" msgstr "Process %d: %s" -#: storage/lmgr/deadlock.c:1152 +#: storage/lmgr/deadlock.c:1150 #, c-format msgid "deadlock detected" msgstr "deadlock upptäckt" -#: storage/lmgr/deadlock.c:1155 +#: storage/lmgr/deadlock.c:1153 #, c-format msgid "See server log for query details." msgstr "Se server-logg för frågedetaljer." -#: storage/lmgr/lmgr.c:830 +#: storage/lmgr/lmgr.c:859 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "vid uppdatering av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:833 +#: storage/lmgr/lmgr.c:862 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "vid borttagning av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:836 +#: storage/lmgr/lmgr.c:865 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "vid låsning av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:839 +#: storage/lmgr/lmgr.c:868 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "vid låsning av uppdaterad version (%u,%u) av tupel i relation \"%s\"" -#: storage/lmgr/lmgr.c:842 +#: storage/lmgr/lmgr.c:871 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "vid insättning av indextupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:845 +#: storage/lmgr/lmgr.c:874 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "vid kontroll av unikhet av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:848 +#: storage/lmgr/lmgr.c:877 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "vid återkontroll av uppdaterad tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:851 +#: storage/lmgr/lmgr.c:880 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "vid kontroll av uteslutningsvillkor av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:1106 +#: storage/lmgr/lmgr.c:1135 #, c-format msgid "relation %u of database %u" msgstr "relation %u i databasen %u" -#: storage/lmgr/lmgr.c:1112 +#: storage/lmgr/lmgr.c:1141 #, c-format msgid "extension of relation %u of database %u" msgstr "utökning av relation %u i databas %u" -#: storage/lmgr/lmgr.c:1118 +#: storage/lmgr/lmgr.c:1147 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid för databas %u" -#: storage/lmgr/lmgr.c:1123 +#: storage/lmgr/lmgr.c:1152 #, c-format msgid "page %u of relation %u of database %u" msgstr "sida %u i relation %u i databas %u" -#: storage/lmgr/lmgr.c:1130 +#: storage/lmgr/lmgr.c:1159 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "tuple (%u,%u) i relation %u i databas %u" -#: storage/lmgr/lmgr.c:1138 +#: storage/lmgr/lmgr.c:1167 #, c-format msgid "transaction %u" msgstr "transaktion %u" -#: storage/lmgr/lmgr.c:1143 +#: storage/lmgr/lmgr.c:1172 #, c-format msgid "virtual transaction %d/%u" msgstr "vituell transaktion %d/%u" -#: storage/lmgr/lmgr.c:1149 +#: storage/lmgr/lmgr.c:1178 #, c-format msgid "speculative token %u of transaction %u" msgstr "spekulativ token %u för transaktion %u" -#: storage/lmgr/lmgr.c:1155 +#: storage/lmgr/lmgr.c:1184 #, c-format msgid "object %u of class %u of database %u" msgstr "objekt %u av klass %u i databas %u" -#: storage/lmgr/lmgr.c:1163 +#: storage/lmgr/lmgr.c:1192 #, c-format msgid "user lock [%u,%u,%u]" msgstr "användarlås [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1170 +#: storage/lmgr/lmgr.c:1199 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "rådgivande lås [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1178 +#: storage/lmgr/lmgr.c:1207 #, c-format msgid "unrecognized locktag type %d" msgstr "okänd låsetikettyp %d" @@ -20386,12 +22237,12 @@ msgid "Only RowExclusiveLock or less can be acquired on database objects during msgstr "Bara RowExclusiveLock eller lägre kan tas på databasobjekt under återställning." #: storage/lmgr/lock.c:983 storage/lmgr/lock.c:1021 storage/lmgr/lock.c:2846 -#: storage/lmgr/lock.c:4176 storage/lmgr/lock.c:4241 storage/lmgr/lock.c:4533 +#: storage/lmgr/lock.c:4260 storage/lmgr/lock.c:4325 storage/lmgr/lock.c:4675 #, c-format msgid "You might need to increase max_locks_per_transaction." msgstr "Du kan behöva öka parametern max_locks_per_transaction." -#: storage/lmgr/lock.c:3292 storage/lmgr/lock.c:3408 +#: storage/lmgr/lock.c:3301 storage/lmgr/lock.c:3369 storage/lmgr/lock.c:3485 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" msgstr "kan inte göra PREPARE samtidigt som vi håller lås på sessionsnivå och transaktionsnivå för samma objekt" @@ -20411,564 +22262,555 @@ msgstr "Du kan behöva köra färre samtidiga transaktioner eller öka max_conne msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "ej tillräckligt med element i RWConflictPool för att spara ner en potentiell läs/skriv-konflikt" -#: storage/lmgr/predicate.c:1535 -#, c-format -msgid "deferrable snapshot was unsafe; trying a new one" -msgstr "deferrable-snapshot var osäklert; försöker med ett nytt" - -#: storage/lmgr/predicate.c:1624 +#: storage/lmgr/predicate.c:1695 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "\"default_transaction_isolation\" är satt till \"serializable\"." -#: storage/lmgr/predicate.c:1625 +#: storage/lmgr/predicate.c:1696 #, c-format msgid "You can use \"SET default_transaction_isolation = 'repeatable read'\" to change the default." msgstr "Du kan använda \"SET default_transaction_isolation = 'repeatable read'\" för att ändra standardvärdet." -#: storage/lmgr/predicate.c:1676 +#: storage/lmgr/predicate.c:1747 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "en snapshot-importerande transaktion får inte vara READ ONLY DEFERRABLE" -#: storage/lmgr/predicate.c:1755 utils/time/snapmgr.c:623 -#: utils/time/snapmgr.c:629 +#: storage/lmgr/predicate.c:1826 utils/time/snapmgr.c:569 +#: utils/time/snapmgr.c:575 #, c-format msgid "could not import the requested snapshot" msgstr "kunde inte importera efterfrågat snapshot" -#: storage/lmgr/predicate.c:1756 utils/time/snapmgr.c:630 +#: storage/lmgr/predicate.c:1827 utils/time/snapmgr.c:576 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "Källprocessen med PID %d kör inte längre." -#: storage/lmgr/predicate.c:2402 storage/lmgr/predicate.c:2417 -#: storage/lmgr/predicate.c:3899 +#: storage/lmgr/predicate.c:2473 storage/lmgr/predicate.c:2488 +#: storage/lmgr/predicate.c:3970 #, c-format msgid "You might need to increase max_pred_locks_per_transaction." msgstr "Du kan behöva öka parametern max_pred_locks_per_transaction." -#: storage/lmgr/predicate.c:4030 storage/lmgr/predicate.c:4066 -#: storage/lmgr/predicate.c:4099 storage/lmgr/predicate.c:4107 -#: storage/lmgr/predicate.c:4146 storage/lmgr/predicate.c:4388 -#: storage/lmgr/predicate.c:4725 storage/lmgr/predicate.c:4737 -#: storage/lmgr/predicate.c:4780 storage/lmgr/predicate.c:4818 +#: storage/lmgr/predicate.c:4101 storage/lmgr/predicate.c:4137 +#: storage/lmgr/predicate.c:4170 storage/lmgr/predicate.c:4178 +#: storage/lmgr/predicate.c:4217 storage/lmgr/predicate.c:4459 +#: storage/lmgr/predicate.c:4796 storage/lmgr/predicate.c:4808 +#: storage/lmgr/predicate.c:4851 storage/lmgr/predicate.c:4889 #, c-format msgid "could not serialize access due to read/write dependencies among transactions" msgstr "kunde inte serialisera åtkomst på grund av läs/skriv-beroenden bland transaktionerna" -#: storage/lmgr/predicate.c:4032 storage/lmgr/predicate.c:4068 -#: storage/lmgr/predicate.c:4101 storage/lmgr/predicate.c:4109 -#: storage/lmgr/predicate.c:4148 storage/lmgr/predicate.c:4390 -#: storage/lmgr/predicate.c:4727 storage/lmgr/predicate.c:4739 -#: storage/lmgr/predicate.c:4782 storage/lmgr/predicate.c:4820 +#: storage/lmgr/predicate.c:4103 storage/lmgr/predicate.c:4139 +#: storage/lmgr/predicate.c:4172 storage/lmgr/predicate.c:4180 +#: storage/lmgr/predicate.c:4219 storage/lmgr/predicate.c:4461 +#: storage/lmgr/predicate.c:4798 storage/lmgr/predicate.c:4810 +#: storage/lmgr/predicate.c:4853 storage/lmgr/predicate.c:4891 #, c-format msgid "The transaction might succeed if retried." msgstr "Transaktionen kan lyckas om den körs igen." -#: storage/lmgr/proc.c:358 +#: storage/lmgr/proc.c:355 #, c-format msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" msgstr "antalet efterfrågade standby-anslutningar överskrider max_wal_senders (nu %d)" -#: storage/lmgr/proc.c:1337 -#, c-format -msgid "Process %d waits for %s on %s." -msgstr "Process %d väntar på %s för %s." - -#: storage/lmgr/proc.c:1348 -#, c-format -msgid "sending cancel to blocking autovacuum PID %d" -msgstr "skickar avbryt till blockerande autovacuum-PID %d" - -#: storage/lmgr/proc.c:1468 +#: storage/lmgr/proc.c:1527 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "process %d undvek deadlock på %s för %s genom att kasta om köordningen efter %ld.%03d ms" -#: storage/lmgr/proc.c:1483 +#: storage/lmgr/proc.c:1542 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "process %d upptäckte deadlock medan den väntade på %s för %s efter %ld.%03d ms" -#: storage/lmgr/proc.c:1492 +#: storage/lmgr/proc.c:1551 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "process %d väntar fortfarande på %s för %s efter %ld.%03d ms" -#: storage/lmgr/proc.c:1499 +#: storage/lmgr/proc.c:1558 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "process %d fick %s på %s efter %ld.%03d ms" -#: storage/lmgr/proc.c:1515 +#: storage/lmgr/proc.c:1575 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "process %d misslyckades att ta %s på %s efter %ld.%03d ms" -#: storage/page/bufpage.c:145 +#: storage/page/bufpage.c:152 #, c-format msgid "page verification failed, calculated checksum %u but expected %u" msgstr "sidverifiering misslyckades, beräknade kontrollsumma %u men förväntade %u" -#: storage/page/bufpage.c:209 storage/page/bufpage.c:503 -#: storage/page/bufpage.c:740 storage/page/bufpage.c:873 -#: storage/page/bufpage.c:969 storage/page/bufpage.c:1081 +#: storage/page/bufpage.c:217 storage/page/bufpage.c:730 +#: storage/page/bufpage.c:1073 storage/page/bufpage.c:1208 +#: storage/page/bufpage.c:1314 storage/page/bufpage.c:1426 #, c-format msgid "corrupted page pointers: lower = %u, upper = %u, special = %u" msgstr "korrupta sidpekare: lägre = %u, övre = %u, special = %u" -#: storage/page/bufpage.c:525 +#: storage/page/bufpage.c:759 #, c-format msgid "corrupted line pointer: %u" msgstr "korrupt radpekare: %u" -#: storage/page/bufpage.c:552 storage/page/bufpage.c:924 +#: storage/page/bufpage.c:789 storage/page/bufpage.c:1266 #, c-format msgid "corrupted item lengths: total %u, available space %u" msgstr "trasiga postlängder: totalt %u, tillgänglig plats %u" -#: storage/page/bufpage.c:759 storage/page/bufpage.c:897 -#: storage/page/bufpage.c:985 storage/page/bufpage.c:1097 +#: storage/page/bufpage.c:1092 storage/page/bufpage.c:1233 +#: storage/page/bufpage.c:1330 storage/page/bufpage.c:1442 #, c-format msgid "corrupted line pointer: offset = %u, size = %u" msgstr "korrupt radpekare: offset = %u, storlek = %u" -#: storage/smgr/md.c:333 storage/smgr/md.c:836 -#, c-format -msgid "could not truncate file \"%s\": %m" -msgstr "kunde inte trunkera fil \"%s\": %m" - -#: storage/smgr/md.c:407 +#: storage/smgr/md.c:439 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "kan inte utöka fil \"%s\" utöver %u block" -#: storage/smgr/md.c:422 +#: storage/smgr/md.c:454 #, c-format msgid "could not extend file \"%s\": %m" msgstr "kunde inte utöka fil \"%s\": %m" -#: storage/smgr/md.c:424 storage/smgr/md.c:431 storage/smgr/md.c:719 -#, c-format -msgid "Check free disk space." -msgstr "Kontrollera ledigt diskutrymme." - -#: storage/smgr/md.c:428 +#: storage/smgr/md.c:460 #, c-format msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgstr "kunde inte utöka fil \"%s\": skrev bara %d av %d byte vid block %u" -#: storage/smgr/md.c:640 +#: storage/smgr/md.c:675 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "kunde inte läsa block %u i fil \"%s\": %m" -#: storage/smgr/md.c:656 +#: storage/smgr/md.c:691 #, c-format msgid "could not read block %u in file \"%s\": read only %d of %d bytes" msgstr "kunde inte läsa block %u i fil \"%s\": läste bara %d av %d byte" -#: storage/smgr/md.c:710 +#: storage/smgr/md.c:745 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "kunde inte skriva block %u i fil \"%s\": %m" -#: storage/smgr/md.c:715 +#: storage/smgr/md.c:750 #, c-format msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" msgstr "kunde inte skriva block %u i fil \"%s\": skrev bara %d av %d byte" -#: storage/smgr/md.c:807 +#: storage/smgr/md.c:844 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "kunde inte trunkera fil \"%s\" till %u block: den är bara %u block nu" -#: storage/smgr/md.c:862 +#: storage/smgr/md.c:899 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "kunde inte trunkera fil \"%s\" till %u block: %m" -#: storage/smgr/md.c:957 -#, c-format -msgid "could not forward fsync request because request queue is full" -msgstr "kunde inte skicka vidare fsync-förfrågan då kön för förfrågningar är full" - -#: storage/smgr/md.c:1256 +#: storage/smgr/md.c:1298 #, c-format msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" msgstr "kunde inte öppna fil \"%s\" (målblock %u): föregående segment är bara %u block" -#: storage/smgr/md.c:1270 +#: storage/smgr/md.c:1312 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "kunde inte öppna fil \"%s\" (målblock %u): %m" -#: storage/sync/sync.c:401 -#, c-format -msgid "could not fsync file \"%s\" but retrying: %m" -msgstr "kunde inte fsync:a fil \"%s\" men försöker igen: %m" - -#: tcop/fastpath.c:109 tcop/fastpath.c:461 tcop/fastpath.c:591 +#: tcop/fastpath.c:148 #, c-format -msgid "invalid argument size %d in function call message" -msgstr "ogiltig argumentstorlek %d i funktionsaropsmeddelande" +msgid "cannot call function \"%s\" via fastpath interface" +msgstr "kan inte anropa funktionen \"%s\" via fastpath-interface" -#: tcop/fastpath.c:307 +#: tcop/fastpath.c:233 #, c-format msgid "fastpath function call: \"%s\" (OID %u)" msgstr "fastpath funktionsanrop: \"%s\" (OID %u)" -#: tcop/fastpath.c:389 tcop/postgres.c:1323 tcop/postgres.c:1581 -#: tcop/postgres.c:2013 tcop/postgres.c:2250 +#: tcop/fastpath.c:312 tcop/postgres.c:1334 tcop/postgres.c:1570 +#: tcop/postgres.c:2029 tcop/postgres.c:2266 #, c-format msgid "duration: %s ms" msgstr "varaktighet %s ms" -#: tcop/fastpath.c:393 +#: tcop/fastpath.c:316 #, c-format msgid "duration: %s ms fastpath function call: \"%s\" (OID %u)" msgstr "varaktighet: %s ms fastpath funktionsanrop: \"%s\" (OID %u)" -#: tcop/fastpath.c:429 tcop/fastpath.c:556 +#: tcop/fastpath.c:352 #, c-format msgid "function call message contains %d arguments but function requires %d" msgstr "meddelande för funktionsanrop innehåller %d argument men funktionen kräver %d" -#: tcop/fastpath.c:437 +#: tcop/fastpath.c:360 #, c-format msgid "function call message contains %d argument formats but %d arguments" msgstr "meddelande för funktioonsanrop innehåller %d argumentformat men %d argument" -#: tcop/fastpath.c:524 tcop/fastpath.c:607 +#: tcop/fastpath.c:384 #, c-format -msgid "incorrect binary data format in function argument %d" -msgstr "inkorrekt binärt dataformat i funktionsargument %d" +msgid "invalid argument size %d in function call message" +msgstr "ogiltig argumentstorlek %d i funktionsaropsmeddelande" -#: tcop/postgres.c:355 tcop/postgres.c:391 tcop/postgres.c:418 +#: tcop/fastpath.c:447 #, c-format -msgid "unexpected EOF on client connection" -msgstr "oväntat EOF från klienten" +msgid "incorrect binary data format in function argument %d" +msgstr "inkorrekt binärt dataformat i funktionsargument %d" -#: tcop/postgres.c:441 tcop/postgres.c:453 tcop/postgres.c:464 -#: tcop/postgres.c:476 tcop/postgres.c:4539 +#: tcop/postgres.c:444 tcop/postgres.c:4774 #, c-format msgid "invalid frontend message type %d" msgstr "ogiltig frontend-meddelandetyp %d" -#: tcop/postgres.c:1042 +#: tcop/postgres.c:1051 #, c-format msgid "statement: %s" msgstr "sats: %s" -#: tcop/postgres.c:1328 +#: tcop/postgres.c:1339 #, c-format msgid "duration: %s ms statement: %s" msgstr "varaktighet: %s ms sats: %s" -#: tcop/postgres.c:1377 -#, c-format -msgid "parse %s: %s" -msgstr "parse %s: %s" - -#: tcop/postgres.c:1434 +#: tcop/postgres.c:1445 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "kan inte stoppa in multipla kommandon i en förberedd sats" -#: tcop/postgres.c:1586 +#: tcop/postgres.c:1575 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "varaktighet: %s ms parse %s: %s" -#: tcop/postgres.c:1633 -#, c-format -msgid "bind %s to %s" -msgstr "bind %s till %s" - -#: tcop/postgres.c:1652 tcop/postgres.c:2516 +#: tcop/postgres.c:1641 tcop/postgres.c:2581 #, c-format msgid "unnamed prepared statement does not exist" msgstr "förberedd sats utan namn existerar inte" -#: tcop/postgres.c:1693 +#: tcop/postgres.c:1682 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "bind-meddelande har %d parameterformat men %d parametrar" -#: tcop/postgres.c:1699 +#: tcop/postgres.c:1688 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "bind-meddelande ger %d parametrar men förberedd sats \"%s\" kräver %d" -#: tcop/postgres.c:1897 +#: tcop/postgres.c:1907 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "inkorrekt binärdataformat i bind-parameter %d" -#: tcop/postgres.c:2018 +#: tcop/postgres.c:2034 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "varaktighet: %s ms bind %s%s%s: %s" -#: tcop/postgres.c:2068 tcop/postgres.c:2600 +#: tcop/postgres.c:2084 tcop/postgres.c:2664 #, c-format msgid "portal \"%s\" does not exist" msgstr "portal \"%s\" existerar inte" -#: tcop/postgres.c:2153 +#: tcop/postgres.c:2169 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2155 tcop/postgres.c:2258 +#: tcop/postgres.c:2171 tcop/postgres.c:2274 msgid "execute fetch from" msgstr "kör hämtning från" -#: tcop/postgres.c:2156 tcop/postgres.c:2259 +#: tcop/postgres.c:2172 tcop/postgres.c:2275 msgid "execute" msgstr "kör" -#: tcop/postgres.c:2255 +#: tcop/postgres.c:2271 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "varaktighet: %s ms %s %s%s%s: %s" -#: tcop/postgres.c:2401 +#: tcop/postgres.c:2417 #, c-format msgid "prepare: %s" msgstr "prepare: %s" -#: tcop/postgres.c:2426 +#: tcop/postgres.c:2442 #, c-format msgid "parameters: %s" msgstr "parametrar: %s" -#: tcop/postgres.c:2441 +#: tcop/postgres.c:2457 #, c-format msgid "abort reason: recovery conflict" msgstr "abortskäl: återställningskonflikt" -#: tcop/postgres.c:2457 +#: tcop/postgres.c:2473 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "Användaren höll delad bufferfastlåsning för länge." -#: tcop/postgres.c:2460 +#: tcop/postgres.c:2476 #, c-format msgid "User was holding a relation lock for too long." msgstr "Användare höll ett relationslås för länge." -#: tcop/postgres.c:2463 +#: tcop/postgres.c:2479 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "Användaren använde eller har använt ett tablespace som tagits bort." -#: tcop/postgres.c:2466 +#: tcop/postgres.c:2482 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "Användarfrågan kan ha behövt se radversioner som har tagits bort." -#: tcop/postgres.c:2472 +#: tcop/postgres.c:2488 #, c-format msgid "User was connected to a database that must be dropped." msgstr "Användare var ansluten till databas som måste slängas." -#: tcop/postgres.c:2796 +#: tcop/postgres.c:2527 +#, c-format +msgid "portal \"%s\" parameter $%d = %s" +msgstr "portal \"%s\" parameter $%d = %s" + +#: tcop/postgres.c:2530 +#, c-format +msgid "portal \"%s\" parameter $%d" +msgstr "portal \"%s\" parameter $%d" + +#: tcop/postgres.c:2536 +#, c-format +msgid "unnamed portal parameter $%d = %s" +msgstr "ej namngiven portalparameter $%d = %s" + +#: tcop/postgres.c:2539 +#, c-format +msgid "unnamed portal parameter $%d" +msgstr "ej namngiven portalparameter $%d" + +#: tcop/postgres.c:2884 +#, c-format +msgid "terminating connection because of unexpected SIGQUIT signal" +msgstr "stänger anslutning på grund av oväntad SIGQUIT-signal" + +#: tcop/postgres.c:2890 #, c-format msgid "terminating connection because of crash of another server process" msgstr "avbryter anslutning på grund av en krash i en annan serverprocess" -#: tcop/postgres.c:2797 +#: tcop/postgres.c:2891 #, c-format msgid "The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory." msgstr "Postmastern har sagt åt denna serverprocess att rulla tillbaka den aktuella transaktionen och avsluta då en annan process har avslutats onormalt och har eventuellt trasat sönder delat minne." -#: tcop/postgres.c:2801 tcop/postgres.c:3107 +#: tcop/postgres.c:2895 tcop/postgres.c:3256 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "Du kan strax återansluta till databasen och upprepa kommandot." -#: tcop/postgres.c:2883 +#: tcop/postgres.c:2902 +#, c-format +msgid "terminating connection due to immediate shutdown command" +msgstr "stänger anslutning på grund av kommando för omedelbar nedstängning" + +#: tcop/postgres.c:2988 #, c-format msgid "floating-point exception" msgstr "flyttalsavbrott" -#: tcop/postgres.c:2884 +#: tcop/postgres.c:2989 #, c-format msgid "An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, such as division by zero." msgstr "En ogiltig flyttalsoperation har signalerats. Detta beror troligen på ett resultat som är utanför giltigt intervall eller en ogiltig operation så som division med noll." -#: tcop/postgres.c:3037 +#: tcop/postgres.c:3160 #, c-format msgid "canceling authentication due to timeout" msgstr "avbryter autentisering på grund av timeout" -#: tcop/postgres.c:3041 +#: tcop/postgres.c:3164 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "avslutar autovacuum-process på grund av ett administratörskommando" -#: tcop/postgres.c:3045 +#: tcop/postgres.c:3168 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "avslutar logisk replikeringsarbetare på grund av ett administratörskommando" -#: tcop/postgres.c:3049 -#, c-format -msgid "logical replication launcher shutting down" -msgstr "logisk replikeringsuppstartare stänger ner" - -#: tcop/postgres.c:3062 tcop/postgres.c:3072 tcop/postgres.c:3105 +#: tcop/postgres.c:3185 tcop/postgres.c:3195 tcop/postgres.c:3254 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "avslutar anslutning på grund av konflikt med återställning" -#: tcop/postgres.c:3078 +#: tcop/postgres.c:3206 #, c-format msgid "terminating connection due to administrator command" msgstr "avslutar anslutning på grund av ett administratörskommando" -#: tcop/postgres.c:3088 +#: tcop/postgres.c:3237 #, c-format msgid "connection to client lost" msgstr "anslutning till klient har brutits" -#: tcop/postgres.c:3154 +#: tcop/postgres.c:3307 #, c-format msgid "canceling statement due to lock timeout" msgstr "avbryter sats på grund av lås-timeout" -#: tcop/postgres.c:3161 +#: tcop/postgres.c:3314 #, c-format msgid "canceling statement due to statement timeout" msgstr "avbryter sats på grund av sats-timeout" -#: tcop/postgres.c:3168 +#: tcop/postgres.c:3321 #, c-format msgid "canceling autovacuum task" msgstr "avbryter autovacuum-uppgift" -#: tcop/postgres.c:3191 +#: tcop/postgres.c:3344 #, c-format msgid "canceling statement due to user request" msgstr "avbryter sats på användares begäran" -#: tcop/postgres.c:3201 +#: tcop/postgres.c:3358 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "terminerar anslutning på grund av idle-in-transaction-timeout" -#: tcop/postgres.c:3318 +#: tcop/postgres.c:3369 +#, c-format +msgid "terminating connection due to idle-session timeout" +msgstr "stänger anslutning på grund av idle-session-timeout" + +#: tcop/postgres.c:3506 #, c-format msgid "stack depth limit exceeded" msgstr "maximalt stackdjup överskridet" -#: tcop/postgres.c:3319 +#: tcop/postgres.c:3507 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "Öka konfigurationsparametern \"max_stack_depth\" (nu %dkB) efter att ha undersökt att plattformens gräns för stackdjup är tillräcklig." -#: tcop/postgres.c:3382 +#: tcop/postgres.c:3570 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "\"max_stack_depth\" får ej överskrida %ldkB." -#: tcop/postgres.c:3384 +#: tcop/postgres.c:3572 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "Öka plattformens stackdjupbegränsning via \"ulimit -s\" eller motsvarande." -#: tcop/postgres.c:3744 +#: tcop/postgres.c:3928 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "ogiltigt kommandoradsargument för serverprocess: %s" -#: tcop/postgres.c:3745 tcop/postgres.c:3751 +#: tcop/postgres.c:3929 tcop/postgres.c:3935 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." -#: tcop/postgres.c:3749 +#: tcop/postgres.c:3933 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: ogiltigt kommandoradsargument: %s" -#: tcop/postgres.c:3811 +#: tcop/postgres.c:3986 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: ingen databas eller användarnamn angivet" -#: tcop/postgres.c:4447 +#: tcop/postgres.c:4676 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "ogiltig subtyp %d för CLOSE-meddelande" -#: tcop/postgres.c:4482 +#: tcop/postgres.c:4711 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "ogiltig subtyp %d för DESCRIBE-meddelande" -#: tcop/postgres.c:4560 +#: tcop/postgres.c:4795 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "fastpath-funktionsanrop stöds inte i en replikeringsanslutning" -#: tcop/postgres.c:4564 +#: tcop/postgres.c:4799 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "utökat frågeprotokoll stöds inte i en replikeringsanslutning" -#: tcop/postgres.c:4741 +#: tcop/postgres.c:4976 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" msgstr "nedkoppling: sessionstid: %d:%02d:%02d.%03d användare=%s databas=%s värd=%s%s%s" -#: tcop/pquery.c:629 +#: tcop/pquery.c:641 #, c-format msgid "bind message has %d result formats but query has %d columns" msgstr "bind-meddelande har %d resultatformat men frågan har %d kolumner" -#: tcop/pquery.c:932 +#: tcop/pquery.c:944 tcop/pquery.c:1701 #, c-format msgid "cursor can only scan forward" msgstr "markör kan bara hoppa framåt" -#: tcop/pquery.c:933 +#: tcop/pquery.c:945 tcop/pquery.c:1702 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Deklarera den med flaggan SCROLL för att kunna traversera bakåt." #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:413 +#: tcop/utility.c:417 #, c-format msgid "cannot execute %s in a read-only transaction" msgstr "kan inte köra %s i read-only-transaktion" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:431 +#: tcop/utility.c:435 #, c-format msgid "cannot execute %s during a parallel operation" msgstr "kan inte köra %s under parallell operation" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:450 +#: tcop/utility.c:454 #, c-format msgid "cannot execute %s during recovery" msgstr "kan inte köra %s under återställning" #. translator: %s is name of a SQL command, eg PREPARE -#: tcop/utility.c:468 +#: tcop/utility.c:472 #, c-format msgid "cannot execute %s within security-restricted operation" msgstr "kan inte köra %s inom säkerhetsbegränsad operation" -#: tcop/utility.c:912 +#. translator: %s is name of a SQL command, eg LISTEN +#: tcop/utility.c:828 #, c-format -msgid "must be superuser to do CHECKPOINT" -msgstr "måste vara superanvändare för att göra CHECKPOINT" +msgid "cannot execute %s within a background process" +msgstr "kan inte köra %s i en bakgrundsprocess" -#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:620 +#: tcop/utility.c:953 +#, fuzzy, c-format +#| msgid "must be superuser to do CHECKPOINT" +msgid "must be superuser or have privileges of pg_checkpointer to do CHECKPOINT" +msgstr "måste vara superuser för att göra CHECKPOINT" + +#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 #, c-format msgid "multiple DictFile parameters" msgstr "multipla DictFile-parametrar" @@ -20988,7 +22830,7 @@ msgstr "okänd Ispell-parameter: \"%s\"" msgid "missing AffFile parameter" msgstr "saknar AffFile-parameter" -#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:644 +#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:639 #, c-format msgid "missing DictFile parameter" msgstr "saknar DictFile-parameter" @@ -21038,63 +22880,63 @@ msgstr "oväntat slut på raden eller lexem" msgid "unexpected end of line" msgstr "oväntat slut på raden" -#: tsearch/dict_thesaurus.c:297 +#: tsearch/dict_thesaurus.c:292 #, c-format msgid "too many lexemes in thesaurus entry" msgstr "för många lexem i synonymordbokspost" -#: tsearch/dict_thesaurus.c:421 +#: tsearch/dict_thesaurus.c:416 #, c-format msgid "thesaurus sample word \"%s\" isn't recognized by subdictionary (rule %d)" msgstr "synonymordbokens exempelord \"%s\" känns inte igen av underordbok (regel %d)" -#: tsearch/dict_thesaurus.c:427 +#: tsearch/dict_thesaurus.c:422 #, c-format msgid "thesaurus sample word \"%s\" is a stop word (rule %d)" msgstr "synonymordbokens exempelord \"%s\" är ett stoppord (regel %d)" -#: tsearch/dict_thesaurus.c:430 +#: tsearch/dict_thesaurus.c:425 #, c-format msgid "Use \"?\" to represent a stop word within a sample phrase." msgstr "Använd \"?\" för att representera ett stoppord i en exempelfras." -#: tsearch/dict_thesaurus.c:572 +#: tsearch/dict_thesaurus.c:567 #, c-format msgid "thesaurus substitute word \"%s\" is a stop word (rule %d)" msgstr "synonymordbokens ersättningsord \"%s\" är ett stoppord (regel %d)" -#: tsearch/dict_thesaurus.c:579 +#: tsearch/dict_thesaurus.c:574 #, c-format msgid "thesaurus substitute word \"%s\" isn't recognized by subdictionary (rule %d)" msgstr "synonymordbokens ersättningsord \"%s\" känns inte igen av underordbok (regel %d)" -#: tsearch/dict_thesaurus.c:591 +#: tsearch/dict_thesaurus.c:586 #, c-format msgid "thesaurus substitute phrase is empty (rule %d)" msgstr "synonymordbokens ersättningsfras är tim (regel %d)" -#: tsearch/dict_thesaurus.c:629 +#: tsearch/dict_thesaurus.c:624 #, c-format msgid "multiple Dictionary parameters" msgstr "multipla ordboksparametrar" -#: tsearch/dict_thesaurus.c:636 +#: tsearch/dict_thesaurus.c:631 #, c-format msgid "unrecognized Thesaurus parameter: \"%s\"" msgstr "okänd synonymordboksparameter: \"%s\"" -#: tsearch/dict_thesaurus.c:648 +#: tsearch/dict_thesaurus.c:643 #, c-format msgid "missing Dictionary parameter" msgstr "saknar ordlistparameter" #: tsearch/spell.c:380 tsearch/spell.c:397 tsearch/spell.c:406 -#: tsearch/spell.c:1036 +#: tsearch/spell.c:1062 #, c-format msgid "invalid affix flag \"%s\"" msgstr "ogiltig affix-flagga \"%s\"" -#: tsearch/spell.c:384 tsearch/spell.c:1040 +#: tsearch/spell.c:384 tsearch/spell.c:1066 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "affix-flaggan \"%s\" är utanför giltigt intervall" @@ -21114,53 +22956,53 @@ msgstr "ogiltig affix-flagga \"%s\" med flaggvärdet \"long\"" msgid "could not open dictionary file \"%s\": %m" msgstr "kunde inte öppna ordboksfil \"%s\": %m" -#: tsearch/spell.c:742 utils/adt/regexp.c:208 +#: tsearch/spell.c:763 utils/adt/regexp.c:209 #, c-format msgid "invalid regular expression: %s" msgstr "ogiltigt reguljärt uttryck: %s" -#: tsearch/spell.c:1163 tsearch/spell.c:1175 tsearch/spell.c:1734 -#: tsearch/spell.c:1739 tsearch/spell.c:1744 +#: tsearch/spell.c:1189 tsearch/spell.c:1201 tsearch/spell.c:1761 +#: tsearch/spell.c:1766 tsearch/spell.c:1771 #, c-format msgid "invalid affix alias \"%s\"" msgstr "ogiltigt affix-alias \"%s\"" -#: tsearch/spell.c:1216 tsearch/spell.c:1287 tsearch/spell.c:1436 +#: tsearch/spell.c:1242 tsearch/spell.c:1313 tsearch/spell.c:1462 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "kunde inte öppna affix-fil \"%s\": %m" -#: tsearch/spell.c:1270 +#: tsearch/spell.c:1296 #, c-format msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" msgstr "Ispell-ordbok stöder bara flaggorna \"default\", \"long\" och \"num\"" -#: tsearch/spell.c:1314 +#: tsearch/spell.c:1340 #, c-format msgid "invalid number of flag vector aliases" msgstr "ogiltigt antal alias i flaggvektor" -#: tsearch/spell.c:1337 +#: tsearch/spell.c:1363 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "antalet alias överskriver angivet antal %d" -#: tsearch/spell.c:1552 +#: tsearch/spell.c:1578 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "affix-fil innehåller kommandon på gammalt och nytt format" -#: tsearch/to_tsany.c:185 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1121 +#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1127 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "strängen är för lång för tsvector (%d byte, max %d byte)" -#: tsearch/ts_locale.c:212 +#: tsearch/ts_locale.c:227 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "rad %d i konfigureringsfil \"%s\": \"%s\"" -#: tsearch/ts_locale.c:329 +#: tsearch/ts_locale.c:307 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "konvertering från wchar_t till serverkodning misslyckades: %m" @@ -21192,154 +23034,213 @@ msgstr "kunde inte öppna stoppordsfil \"%s\": %m" msgid "text search parser does not support headline creation" msgstr "textsökparsern stöder inte skapande av rubriker" -#: tsearch/wparser_def.c:2585 +#: tsearch/wparser_def.c:2578 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "okänd rubrikparameter: \"%s\"" -#: tsearch/wparser_def.c:2604 +#: tsearch/wparser_def.c:2597 #, c-format msgid "MinWords should be less than MaxWords" msgstr "MinWords skall vara mindre än MaxWords" -#: tsearch/wparser_def.c:2608 +#: tsearch/wparser_def.c:2601 #, c-format msgid "MinWords should be positive" msgstr "MinWords skall vara positiv" -#: tsearch/wparser_def.c:2612 +#: tsearch/wparser_def.c:2605 #, c-format msgid "ShortWord should be >= 0" msgstr "ShortWord skall vara >= 0" -#: tsearch/wparser_def.c:2616 +#: tsearch/wparser_def.c:2609 #, c-format msgid "MaxFragments should be >= 0" msgstr "MaxFragments skall vara >= 0" -#: utils/adt/acl.c:172 utils/adt/name.c:93 +#: utils/activity/pgstat.c:420 +#, fuzzy, c-format +#| msgid "could not open statistics file \"%s\": %m" +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "kunde inte öppna statistikfil \"%s\": %m" + +#: utils/activity/pgstat.c:427 +#, fuzzy, c-format +#| msgid "could not open statistics file \"%s\": %m" +msgid "unlinked permanent statistics file \"%s\"" +msgstr "kunde inte öppna statistikfil \"%s\": %m" + +#: utils/activity/pgstat.c:1199 +#, fuzzy, c-format +#| msgid "unrecognized statistics kind \"%s\"" +msgid "invalid statistics kind: \"%s\"" +msgstr "okänd statistiktyp \"%s\"" + +#: utils/activity/pgstat.c:1279 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "kunde inte öppna temporär statistikfil \"%s\": %m" + +#: utils/activity/pgstat.c:1385 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "kunde inte skriva temporär statistikfil \"%s\": %m" + +#: utils/activity/pgstat.c:1394 +#, c-format +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "kunde inte stänga temporär statistikfil \"%s\": %m" + +#: utils/activity/pgstat.c:1402 +#, c-format +msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" +msgstr "kunde inte döpa om temporär statistikfil \"%s\" till \"%s\": %m" + +#: utils/activity/pgstat.c:1451 +#, c-format +msgid "could not open statistics file \"%s\": %m" +msgstr "kunde inte öppna statistikfil \"%s\": %m" + +#: utils/activity/pgstat.c:1607 +#, c-format +msgid "corrupted statistics file \"%s\"" +msgstr "korrupt statistikfil \"%s\"" + +#: utils/activity/pgstat_function.c:118 +#, fuzzy, c-format +#| msgid "cast function must be a normal function" +msgid "function call to dropped function" +msgstr "typomvandlingsgfunktionen måste vara en vanlig funktion" + +#: utils/activity/pgstat_xact.c:371 +#, c-format +msgid "resetting existing stats for type %s, db=%u, oid=%u" +msgstr "" + +#: utils/adt/acl.c:168 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "identifieraren för lång" -#: utils/adt/acl.c:173 utils/adt/name.c:94 +#: utils/adt/acl.c:169 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "Identifierare måste vara mindre än %d tecken." -#: utils/adt/acl.c:256 +#: utils/adt/acl.c:252 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "okänt nyckelord: \"%s\"" -#: utils/adt/acl.c:257 +#: utils/adt/acl.c:253 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "ACL-nyckelord måste vara \"group\" eller \"user\"." -#: utils/adt/acl.c:262 +#: utils/adt/acl.c:258 #, c-format msgid "missing name" msgstr "namn saknas" -#: utils/adt/acl.c:263 +#: utils/adt/acl.c:259 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "Ett namn måste följa efter nyckelorden \"group\" resp. \"user\"." -#: utils/adt/acl.c:269 +#: utils/adt/acl.c:265 #, c-format msgid "missing \"=\" sign" msgstr "saknar \"=\"-tecken" -#: utils/adt/acl.c:322 +#: utils/adt/acl.c:324 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "ogiltigt lägestecken: måste vara en av \"%s\"" -#: utils/adt/acl.c:344 +#: utils/adt/acl.c:346 #, c-format msgid "a name must follow the \"/\" sign" msgstr "ett namn måste följa på tecknet \"/\"" -#: utils/adt/acl.c:352 +#: utils/adt/acl.c:354 #, c-format msgid "defaulting grantor to user ID %u" msgstr "sätter fullmaktsgivaranvändar-ID till standardvärdet %u" -#: utils/adt/acl.c:538 +#: utils/adt/acl.c:540 #, c-format msgid "ACL array contains wrong data type" msgstr "ACL-array innehåller fel datatyp" -#: utils/adt/acl.c:542 +#: utils/adt/acl.c:544 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "ACL-array:er måste vara endimensionella" -#: utils/adt/acl.c:546 +#: utils/adt/acl.c:548 #, c-format msgid "ACL arrays must not contain null values" msgstr "ACL-array:er får inte innehålla null-värden" -#: utils/adt/acl.c:570 +#: utils/adt/acl.c:572 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "skräp vid slutet av ACL-angivelse" -#: utils/adt/acl.c:1205 +#: utils/adt/acl.c:1214 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "fullmaksgivarflaggor kan inte ges tillbaka till den som givit det till dig" -#: utils/adt/acl.c:1266 +#: utils/adt/acl.c:1275 #, c-format msgid "dependent privileges exist" msgstr "det finns beroende privilegier" -#: utils/adt/acl.c:1267 +#: utils/adt/acl.c:1276 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Använd CASCADE för att återkalla dem med." -#: utils/adt/acl.c:1521 +#: utils/adt/acl.c:1530 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert stöds inte länge" -#: utils/adt/acl.c:1531 +#: utils/adt/acl.c:1540 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove stöds inte längre" -#: utils/adt/acl.c:1617 utils/adt/acl.c:1671 +#: utils/adt/acl.c:1630 utils/adt/acl.c:1684 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "okänd privilegietyp: \"%s\"" -#: utils/adt/acl.c:3471 utils/adt/regproc.c:103 utils/adt/regproc.c:278 +#: utils/adt/acl.c:3469 utils/adt/regproc.c:101 utils/adt/regproc.c:277 #, c-format msgid "function \"%s\" does not exist" msgstr "funktionen \"%s\" finns inte" -#: utils/adt/acl.c:4943 +#: utils/adt/acl.c:5008 #, c-format msgid "must be member of role \"%s\"" msgstr "måste vara medlem i rollen \"%s\"" -#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:933 -#: utils/adt/arrayfuncs.c:1533 utils/adt/arrayfuncs.c:3236 -#: utils/adt/arrayfuncs.c:3376 utils/adt/arrayfuncs.c:5911 -#: utils/adt/arrayfuncs.c:6252 utils/adt/arrayutils.c:93 -#: utils/adt/arrayutils.c:102 utils/adt/arrayutils.c:109 +#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:936 +#: utils/adt/arrayfuncs.c:1544 utils/adt/arrayfuncs.c:3263 +#: utils/adt/arrayfuncs.c:3405 utils/adt/arrayfuncs.c:5981 +#: utils/adt/arrayfuncs.c:6322 utils/adt/arrayutils.c:94 +#: utils/adt/arrayutils.c:103 utils/adt/arrayutils.c:110 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "array-storlek överskrider maximalt tillåtna (%d)" -#: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:466 -#: utils/adt/array_userfuncs.c:546 utils/adt/json.c:645 utils/adt/json.c:740 -#: utils/adt/json.c:778 utils/adt/jsonb.c:1115 utils/adt/jsonb.c:1144 -#: utils/adt/jsonb.c:1538 utils/adt/jsonb.c:1702 utils/adt/jsonb.c:1712 +#: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:467 +#: utils/adt/array_userfuncs.c:547 utils/adt/json.c:667 utils/adt/json.c:803 +#: utils/adt/json.c:837 utils/adt/jsonb.c:1104 utils/adt/jsonb.c:1177 +#: utils/adt/jsonb.c:1598 utils/adt/jsonb.c:1785 utils/adt/jsonb.c:1795 #, c-format msgid "could not determine input data type" msgstr "kan inte bestämma indatatyp" @@ -21350,16 +23251,16 @@ msgid "input data type is not an array" msgstr "indatatyp är inte en array" #: utils/adt/array_userfuncs.c:129 utils/adt/array_userfuncs.c:181 -#: utils/adt/arrayfuncs.c:1336 utils/adt/float.c:1243 utils/adt/float.c:1317 -#: utils/adt/float.c:3960 utils/adt/float.c:3974 utils/adt/int.c:759 -#: utils/adt/int.c:781 utils/adt/int.c:795 utils/adt/int.c:809 -#: utils/adt/int.c:840 utils/adt/int.c:861 utils/adt/int.c:978 -#: utils/adt/int.c:992 utils/adt/int.c:1006 utils/adt/int.c:1039 -#: utils/adt/int.c:1053 utils/adt/int.c:1067 utils/adt/int.c:1098 -#: utils/adt/int.c:1180 utils/adt/int.c:1244 utils/adt/int.c:1312 -#: utils/adt/int.c:1318 utils/adt/int8.c:1292 utils/adt/numeric.c:1559 -#: utils/adt/numeric.c:3435 utils/adt/varbit.c:1188 utils/adt/varbit.c:1576 -#: utils/adt/varlena.c:1087 utils/adt/varlena.c:3377 +#: utils/adt/float.c:1234 utils/adt/float.c:1308 utils/adt/float.c:4046 +#: utils/adt/float.c:4060 utils/adt/int.c:781 utils/adt/int.c:803 +#: utils/adt/int.c:817 utils/adt/int.c:831 utils/adt/int.c:862 +#: utils/adt/int.c:883 utils/adt/int.c:1000 utils/adt/int.c:1014 +#: utils/adt/int.c:1028 utils/adt/int.c:1061 utils/adt/int.c:1075 +#: utils/adt/int.c:1089 utils/adt/int.c:1120 utils/adt/int.c:1202 +#: utils/adt/int.c:1266 utils/adt/int.c:1334 utils/adt/int.c:1340 +#: utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4265 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 +#: utils/adt/varlena.c:3395 #, c-format msgid "integer out of range" msgstr "heltal utanför giltigt intervall" @@ -21396,269 +23297,291 @@ msgstr "Array:er med olika elementdimensioner är inte kompatibla för sammaslag msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "Array:er med olika dimensioner fungerar inte vid konkatenering." -#: utils/adt/array_userfuncs.c:662 utils/adt/array_userfuncs.c:814 +#: utils/adt/array_userfuncs.c:663 utils/adt/array_userfuncs.c:815 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "sökning efter element i en multidimensionell array stöds inte" -#: utils/adt/array_userfuncs.c:686 +#: utils/adt/array_userfuncs.c:687 #, c-format msgid "initial position must not be null" msgstr "initiala positionen får ej vara null" -#: utils/adt/arrayfuncs.c:270 utils/adt/arrayfuncs.c:284 -#: utils/adt/arrayfuncs.c:295 utils/adt/arrayfuncs.c:317 -#: utils/adt/arrayfuncs.c:332 utils/adt/arrayfuncs.c:346 -#: utils/adt/arrayfuncs.c:352 utils/adt/arrayfuncs.c:359 -#: utils/adt/arrayfuncs.c:490 utils/adt/arrayfuncs.c:506 -#: utils/adt/arrayfuncs.c:517 utils/adt/arrayfuncs.c:532 -#: utils/adt/arrayfuncs.c:553 utils/adt/arrayfuncs.c:583 -#: utils/adt/arrayfuncs.c:590 utils/adt/arrayfuncs.c:598 -#: utils/adt/arrayfuncs.c:632 utils/adt/arrayfuncs.c:655 -#: utils/adt/arrayfuncs.c:675 utils/adt/arrayfuncs.c:787 -#: utils/adt/arrayfuncs.c:796 utils/adt/arrayfuncs.c:826 -#: utils/adt/arrayfuncs.c:841 utils/adt/arrayfuncs.c:894 +#: utils/adt/arrayfuncs.c:271 utils/adt/arrayfuncs.c:285 +#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:318 +#: utils/adt/arrayfuncs.c:333 utils/adt/arrayfuncs.c:347 +#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 +#: utils/adt/arrayfuncs.c:493 utils/adt/arrayfuncs.c:509 +#: utils/adt/arrayfuncs.c:520 utils/adt/arrayfuncs.c:535 +#: utils/adt/arrayfuncs.c:556 utils/adt/arrayfuncs.c:586 +#: utils/adt/arrayfuncs.c:593 utils/adt/arrayfuncs.c:601 +#: utils/adt/arrayfuncs.c:635 utils/adt/arrayfuncs.c:658 +#: utils/adt/arrayfuncs.c:678 utils/adt/arrayfuncs.c:790 +#: utils/adt/arrayfuncs.c:799 utils/adt/arrayfuncs.c:829 +#: utils/adt/arrayfuncs.c:844 utils/adt/arrayfuncs.c:897 #, c-format msgid "malformed array literal: \"%s\"" msgstr "felaktig array-literal: \"%s\"" -#: utils/adt/arrayfuncs.c:271 +#: utils/adt/arrayfuncs.c:272 #, c-format msgid "\"[\" must introduce explicitly-specified array dimensions." msgstr "\"[\" måste införa explicit angivna array-dimensioner." -#: utils/adt/arrayfuncs.c:285 +#: utils/adt/arrayfuncs.c:286 #, c-format msgid "Missing array dimension value." msgstr "Saknar värde i array-dimension." -#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:333 +#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "Saknar \"%s\" efter array-dimensioner." -#: utils/adt/arrayfuncs.c:305 utils/adt/arrayfuncs.c:2884 -#: utils/adt/arrayfuncs.c:2916 utils/adt/arrayfuncs.c:2931 +#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2910 +#: utils/adt/arrayfuncs.c:2942 utils/adt/arrayfuncs.c:2957 #, c-format msgid "upper bound cannot be less than lower bound" msgstr "övre gränsen kan inte vara lägre än undre gränsen" -#: utils/adt/arrayfuncs.c:318 +#: utils/adt/arrayfuncs.c:319 #, c-format msgid "Array value must start with \"{\" or dimension information." msgstr "Array-värde måste starta med \"{\" eller dimensionsinformation" -#: utils/adt/arrayfuncs.c:347 +#: utils/adt/arrayfuncs.c:348 #, c-format msgid "Array contents must start with \"{\"." msgstr "Array-innehåll måste starta med \"{\"." -#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 +#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 #, c-format msgid "Specified array dimensions do not match array contents." msgstr "Angivna array-dimensioner matchar inte array-innehållet." -#: utils/adt/arrayfuncs.c:491 utils/adt/arrayfuncs.c:518 -#: utils/adt/rangetypes.c:2181 utils/adt/rangetypes.c:2189 -#: utils/adt/rowtypes.c:210 utils/adt/rowtypes.c:218 +#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:521 +#: utils/adt/multirangetypes.c:164 utils/adt/rangetypes.c:2310 +#: utils/adt/rangetypes.c:2318 utils/adt/rowtypes.c:211 +#: utils/adt/rowtypes.c:219 #, c-format msgid "Unexpected end of input." msgstr "oväntat slut på indata." -#: utils/adt/arrayfuncs.c:507 utils/adt/arrayfuncs.c:554 -#: utils/adt/arrayfuncs.c:584 utils/adt/arrayfuncs.c:633 +#: utils/adt/arrayfuncs.c:510 utils/adt/arrayfuncs.c:557 +#: utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 #, c-format msgid "Unexpected \"%c\" character." msgstr "oväntat tecken \"%c\"." -#: utils/adt/arrayfuncs.c:533 utils/adt/arrayfuncs.c:656 +#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 #, c-format msgid "Unexpected array element." msgstr "Oväntat array-element." -#: utils/adt/arrayfuncs.c:591 +#: utils/adt/arrayfuncs.c:594 #, c-format msgid "Unmatched \"%c\" character." msgstr "Icke matchat tecken \"%c\"." -#: utils/adt/arrayfuncs.c:599 utils/adt/jsonfuncs.c:2452 +#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2482 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "Flerdimensionella array:er måste ha underarray:er med matchande dimensioner." -#: utils/adt/arrayfuncs.c:676 +#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:287 #, c-format msgid "Junk after closing right brace." msgstr "Skräp efter avslutande höger parentes." -#: utils/adt/arrayfuncs.c:1298 utils/adt/arrayfuncs.c:3344 -#: utils/adt/arrayfuncs.c:5817 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3371 +#: utils/adt/arrayfuncs.c:5885 #, c-format msgid "invalid number of dimensions: %d" msgstr "felaktigt antal dimensioner: %d" -#: utils/adt/arrayfuncs.c:1309 +#: utils/adt/arrayfuncs.c:1312 #, c-format msgid "invalid array flags" msgstr "ogiltiga array-flaggor" -#: utils/adt/arrayfuncs.c:1317 +#: utils/adt/arrayfuncs.c:1334 #, c-format -msgid "wrong element type" -msgstr "fel elementtyp" +msgid "binary data has array element type %u (%s) instead of expected %u (%s)" +msgstr "binär data har array-elementtyp typ %u (%s) istället för förväntade %u (%s)" -#: utils/adt/arrayfuncs.c:1367 utils/adt/rangetypes.c:335 -#: utils/cache/lsyscache.c:2835 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:445 +#: utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2915 #, c-format msgid "no binary input function available for type %s" msgstr "ingen binär indatafunktion finns för typen %s" -#: utils/adt/arrayfuncs.c:1507 +#: utils/adt/arrayfuncs.c:1518 #, c-format msgid "improper binary format in array element %d" msgstr "felaktigt binärt format i array-element %d" -#: utils/adt/arrayfuncs.c:1588 utils/adt/rangetypes.c:340 -#: utils/cache/lsyscache.c:2868 +#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:450 +#: utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2948 #, c-format msgid "no binary output function available for type %s" msgstr "det saknas en binär output-funktion för typen %s" -#: utils/adt/arrayfuncs.c:2066 +#: utils/adt/arrayfuncs.c:2078 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "slice av fixlängd-array är inte implementerat" -#: utils/adt/arrayfuncs.c:2244 utils/adt/arrayfuncs.c:2266 -#: utils/adt/arrayfuncs.c:2315 utils/adt/arrayfuncs.c:2551 -#: utils/adt/arrayfuncs.c:2862 utils/adt/arrayfuncs.c:5803 -#: utils/adt/arrayfuncs.c:5829 utils/adt/arrayfuncs.c:5840 -#: utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 -#: utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4340 utils/adt/jsonfuncs.c:4490 -#: utils/adt/jsonfuncs.c:4602 utils/adt/jsonfuncs.c:4648 +#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 +#: utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2566 +#: utils/adt/arrayfuncs.c:2888 utils/adt/arrayfuncs.c:5871 +#: utils/adt/arrayfuncs.c:5897 utils/adt/arrayfuncs.c:5908 +#: utils/adt/json.c:1450 utils/adt/json.c:1524 utils/adt/jsonb.c:1378 +#: utils/adt/jsonb.c:1464 utils/adt/jsonfuncs.c:4363 utils/adt/jsonfuncs.c:4516 +#: utils/adt/jsonfuncs.c:4628 utils/adt/jsonfuncs.c:4677 #, c-format msgid "wrong number of array subscripts" msgstr "fel antal array-indexeringar" -#: utils/adt/arrayfuncs.c:2249 utils/adt/arrayfuncs.c:2357 -#: utils/adt/arrayfuncs.c:2615 utils/adt/arrayfuncs.c:2921 +#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 +#: utils/adt/arrayfuncs.c:2633 utils/adt/arrayfuncs.c:2947 #, c-format msgid "array subscript out of range" msgstr "array-index utanför giltigt område" -#: utils/adt/arrayfuncs.c:2254 +#: utils/adt/arrayfuncs.c:2266 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "kan inte tilldela null-värde till ett element i en array med fast längd" -#: utils/adt/arrayfuncs.c:2809 +#: utils/adt/arrayfuncs.c:2835 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "uppdatering av slice på fixlängd-array är inte implementerat" -#: utils/adt/arrayfuncs.c:2840 +#: utils/adt/arrayfuncs.c:2866 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "array-slice-index måste inkludera båda gränser" -#: utils/adt/arrayfuncs.c:2841 +#: utils/adt/arrayfuncs.c:2867 #, c-format msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." msgstr "Vid tilldelning till en slice av en tom array så måste slice-gränserna anges" -#: utils/adt/arrayfuncs.c:2852 utils/adt/arrayfuncs.c:2947 +#: utils/adt/arrayfuncs.c:2878 utils/adt/arrayfuncs.c:2974 #, c-format msgid "source array too small" msgstr "käll-array för liten" -#: utils/adt/arrayfuncs.c:3500 +#: utils/adt/arrayfuncs.c:3529 #, c-format msgid "null array element not allowed in this context" msgstr "null-element i arrayer stöds inte i detta kontext" -#: utils/adt/arrayfuncs.c:3602 utils/adt/arrayfuncs.c:3773 -#: utils/adt/arrayfuncs.c:4129 +#: utils/adt/arrayfuncs.c:3631 utils/adt/arrayfuncs.c:3802 +#: utils/adt/arrayfuncs.c:4193 #, c-format msgid "cannot compare arrays of different element types" msgstr "kan inte jämföra arrayer med olika elementtyper" -#: utils/adt/arrayfuncs.c:3951 utils/adt/rangetypes.c:1254 -#: utils/adt/rangetypes.c:1318 +#: utils/adt/arrayfuncs.c:3980 utils/adt/multirangetypes.c:2799 +#: utils/adt/multirangetypes.c:2871 utils/adt/rangetypes.c:1343 +#: utils/adt/rangetypes.c:1407 utils/adt/rowtypes.c:1858 #, c-format msgid "could not identify a hash function for type %s" msgstr "kunde inte hitta en hash-funktion för typ %s" -#: utils/adt/arrayfuncs.c:4044 +#: utils/adt/arrayfuncs.c:4108 utils/adt/rowtypes.c:1979 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "kunde inte hitta en utökad hash-funktion för typ %s" -#: utils/adt/arrayfuncs.c:5221 +#: utils/adt/arrayfuncs.c:5285 #, c-format msgid "data type %s is not an array type" msgstr "datatypen %s är inte en arraytyp" -#: utils/adt/arrayfuncs.c:5276 +#: utils/adt/arrayfuncs.c:5340 #, c-format msgid "cannot accumulate null arrays" msgstr "kan inte ackumulera null-array:er" -#: utils/adt/arrayfuncs.c:5304 +#: utils/adt/arrayfuncs.c:5368 #, c-format msgid "cannot accumulate empty arrays" msgstr "kan inte ackumulera tomma array:er" -#: utils/adt/arrayfuncs.c:5331 utils/adt/arrayfuncs.c:5337 +#: utils/adt/arrayfuncs.c:5395 utils/adt/arrayfuncs.c:5401 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "kan inte ackumulera arrayer med olika dimensioner" -#: utils/adt/arrayfuncs.c:5701 utils/adt/arrayfuncs.c:5741 +#: utils/adt/arrayfuncs.c:5769 utils/adt/arrayfuncs.c:5809 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "dimensionsarray eller undre gränsarray kan inte vara null" -#: utils/adt/arrayfuncs.c:5804 utils/adt/arrayfuncs.c:5830 +#: utils/adt/arrayfuncs.c:5872 utils/adt/arrayfuncs.c:5898 #, c-format msgid "Dimension array must be one dimensional." msgstr "Dimensionsarray måste vara endimensionell." -#: utils/adt/arrayfuncs.c:5809 utils/adt/arrayfuncs.c:5835 +#: utils/adt/arrayfuncs.c:5877 utils/adt/arrayfuncs.c:5903 #, c-format msgid "dimension values cannot be null" msgstr "dimensionsvärden kan inte vara null" -#: utils/adt/arrayfuncs.c:5841 +#: utils/adt/arrayfuncs.c:5909 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Undre arraygräns har annan storlek än dimensionsarray." -#: utils/adt/arrayfuncs.c:6117 +#: utils/adt/arrayfuncs.c:6187 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "borttagning av element från en multidimensionell array stöds inte" -#: utils/adt/arrayfuncs.c:6394 +#: utils/adt/arrayfuncs.c:6464 #, c-format msgid "thresholds must be one-dimensional array" msgstr "gränsvärden måste vara en endimensionell array" -#: utils/adt/arrayfuncs.c:6399 +#: utils/adt/arrayfuncs.c:6469 #, c-format msgid "thresholds array must not contain NULLs" msgstr "gränsvärdesarray får inte innehålla NULLL-värden" -#: utils/adt/arrayutils.c:209 +#: utils/adt/arrayfuncs.c:6702 +#, c-format +msgid "number of elements to trim must be between 0 and %d" +msgstr "antal element att trimma måste vara mellan 0 och %d" + +#: utils/adt/arraysubs.c:93 utils/adt/arraysubs.c:130 +#, c-format +msgid "array subscript must have type integer" +msgstr "array-index måste ha typen integer" + +#: utils/adt/arraysubs.c:198 utils/adt/arraysubs.c:217 +#, c-format +msgid "array subscript in assignment must not be null" +msgstr "array-index i tilldelning kan inte vara null" + +#: utils/adt/arrayutils.c:140 +#, c-format +msgid "array lower bound is too large: %d" +msgstr "lägre gräns för array är för stor: %d" + +#: utils/adt/arrayutils.c:240 #, c-format msgid "typmod array must be type cstring[]" msgstr "typmod-array måste ha typ cstring[]" -#: utils/adt/arrayutils.c:214 +#: utils/adt/arrayutils.c:245 #, c-format msgid "typmod array must be one-dimensional" msgstr "typmod-array måste vara endimensionell" -#: utils/adt/arrayutils.c:219 +#: utils/adt/arrayutils.c:250 #, c-format msgid "typmod array must not contain nulls" msgstr "typmod-arrayen får inte innehålla null-värden" @@ -21669,45 +23592,46 @@ msgid "encoding conversion from %s to ASCII not supported" msgstr "kodningskonvertering från %s till ASCII stöds inte" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:3757 -#: utils/adt/float.c:187 utils/adt/float.c:271 utils/adt/float.c:295 -#: utils/adt/float.c:412 utils/adt/float.c:497 utils/adt/float.c:525 +#: utils/adt/bool.c:153 utils/adt/cash.c:276 utils/adt/datetime.c:4058 +#: utils/adt/float.c:188 utils/adt/float.c:272 utils/adt/float.c:284 +#: utils/adt/float.c:401 utils/adt/float.c:486 utils/adt/float.c:502 #: utils/adt/geo_ops.c:220 utils/adt/geo_ops.c:230 utils/adt/geo_ops.c:242 #: utils/adt/geo_ops.c:274 utils/adt/geo_ops.c:316 utils/adt/geo_ops.c:326 -#: utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1378 utils/adt/geo_ops.c:1413 -#: utils/adt/geo_ops.c:1421 utils/adt/geo_ops.c:3476 utils/adt/geo_ops.c:4645 -#: utils/adt/geo_ops.c:4660 utils/adt/geo_ops.c:4667 utils/adt/int8.c:126 -#: utils/adt/jsonpath.c:182 utils/adt/mac.c:94 utils/adt/mac8.c:93 -#: utils/adt/mac8.c:166 utils/adt/mac8.c:184 utils/adt/mac8.c:202 -#: utils/adt/mac8.c:221 utils/adt/network.c:100 utils/adt/numeric.c:601 -#: utils/adt/numeric.c:628 utils/adt/numeric.c:6001 utils/adt/numeric.c:6025 -#: utils/adt/numeric.c:6049 utils/adt/numeric.c:6882 utils/adt/numeric.c:6908 -#: utils/adt/numutils.c:116 utils/adt/numutils.c:126 utils/adt/numutils.c:170 -#: utils/adt/numutils.c:246 utils/adt/numutils.c:322 utils/adt/oid.c:44 -#: utils/adt/oid.c:58 utils/adt/oid.c:64 utils/adt/oid.c:86 -#: utils/adt/pg_lsn.c:73 utils/adt/tid.c:74 utils/adt/tid.c:82 -#: utils/adt/tid.c:90 utils/adt/timestamp.c:494 utils/adt/uuid.c:136 -#: utils/adt/xid8funcs.c:346 +#: utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1389 utils/adt/geo_ops.c:1424 +#: utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3392 utils/adt/geo_ops.c:4604 +#: utils/adt/geo_ops.c:4619 utils/adt/geo_ops.c:4626 utils/adt/int.c:165 +#: utils/adt/int.c:177 utils/adt/jsonpath.c:184 utils/adt/mac.c:93 +#: utils/adt/mac8.c:93 utils/adt/mac8.c:166 utils/adt/mac8.c:184 +#: utils/adt/mac8.c:202 utils/adt/mac8.c:221 utils/adt/network.c:99 +#: utils/adt/numeric.c:698 utils/adt/numeric.c:717 utils/adt/numeric.c:6854 +#: utils/adt/numeric.c:6878 utils/adt/numeric.c:6902 utils/adt/numeric.c:7904 +#: utils/adt/numutils.c:158 utils/adt/numutils.c:234 utils/adt/numutils.c:318 +#: utils/adt/oid.c:44 utils/adt/oid.c:58 utils/adt/oid.c:64 utils/adt/oid.c:86 +#: utils/adt/pg_lsn.c:74 utils/adt/tid.c:76 utils/adt/tid.c:84 +#: utils/adt/tid.c:98 utils/adt/tid.c:107 utils/adt/timestamp.c:497 +#: utils/adt/uuid.c:135 utils/adt/xid8funcs.c:345 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "ogiltig indatasyntax för type %s: \"%s\"" -#: utils/adt/cash.c:215 utils/adt/cash.c:240 utils/adt/cash.c:250 -#: utils/adt/cash.c:290 utils/adt/int8.c:118 utils/adt/numutils.c:140 -#: utils/adt/numutils.c:147 utils/adt/numutils.c:240 utils/adt/numutils.c:316 -#: utils/adt/oid.c:70 utils/adt/oid.c:109 +#: utils/adt/cash.c:214 utils/adt/cash.c:239 utils/adt/cash.c:249 +#: utils/adt/cash.c:289 utils/adt/int.c:171 utils/adt/numutils.c:152 +#: utils/adt/numutils.c:228 utils/adt/numutils.c:312 utils/adt/oid.c:70 +#: utils/adt/oid.c:109 #, c-format msgid "value \"%s\" is out of range for type %s" msgstr "värdet \"%s\" är utanför giltigt intervall för typen %s" -#: utils/adt/cash.c:652 utils/adt/cash.c:702 utils/adt/cash.c:753 -#: utils/adt/cash.c:802 utils/adt/cash.c:854 utils/adt/cash.c:904 -#: utils/adt/float.c:104 utils/adt/int.c:824 utils/adt/int.c:940 -#: utils/adt/int.c:1020 utils/adt/int.c:1082 utils/adt/int.c:1120 -#: utils/adt/int.c:1148 utils/adt/int8.c:593 utils/adt/int8.c:651 -#: utils/adt/int8.c:978 utils/adt/int8.c:1058 utils/adt/int8.c:1120 -#: utils/adt/int8.c:1200 utils/adt/numeric.c:7446 utils/adt/numeric.c:7736 -#: utils/adt/numeric.c:9318 utils/adt/timestamp.c:3243 +#: utils/adt/cash.c:651 utils/adt/cash.c:701 utils/adt/cash.c:752 +#: utils/adt/cash.c:801 utils/adt/cash.c:853 utils/adt/cash.c:903 +#: utils/adt/float.c:105 utils/adt/int.c:846 utils/adt/int.c:962 +#: utils/adt/int.c:1042 utils/adt/int.c:1104 utils/adt/int.c:1142 +#: utils/adt/int.c:1170 utils/adt/int8.c:515 utils/adt/int8.c:573 +#: utils/adt/int8.c:943 utils/adt/int8.c:1023 utils/adt/int8.c:1085 +#: utils/adt/int8.c:1165 utils/adt/numeric.c:3093 utils/adt/numeric.c:3116 +#: utils/adt/numeric.c:3201 utils/adt/numeric.c:3219 utils/adt/numeric.c:3315 +#: utils/adt/numeric.c:8453 utils/adt/numeric.c:8743 utils/adt/numeric.c:9068 +#: utils/adt/numeric.c:10525 utils/adt/timestamp.c:3337 #, c-format msgid "division by zero" msgstr "division med noll" @@ -21717,175 +23641,192 @@ msgstr "division med noll" msgid "\"char\" out of range" msgstr "\"char\" utanför sitt intervall" -#: utils/adt/date.c:61 utils/adt/timestamp.c:95 utils/adt/varbit.c:104 +#: utils/adt/cryptohashfuncs.c:47 utils/adt/cryptohashfuncs.c:69 +#, fuzzy, c-format +#| msgid "could not compress data: %s" +msgid "could not compute %s hash: %s" +msgstr "kunde inte komprimera data: %s" + +#: utils/adt/date.c:63 utils/adt/timestamp.c:98 utils/adt/varbit.c:105 #: utils/adt/varchar.c:48 #, c-format msgid "invalid type modifier" msgstr "ogiltig typmodifierare" -#: utils/adt/date.c:73 +#: utils/adt/date.c:75 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "TIME(%d)%s-precisionen får inte vara negativ" -#: utils/adt/date.c:79 +#: utils/adt/date.c:81 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "TIME(%d)%s-precisionen reducerad till maximalt tillåtna, %d" -#: utils/adt/date.c:158 utils/adt/date.c:166 utils/adt/formatting.c:4210 -#: utils/adt/formatting.c:4219 utils/adt/formatting.c:4325 -#: utils/adt/formatting.c:4335 +#: utils/adt/date.c:160 utils/adt/date.c:168 utils/adt/formatting.c:4294 +#: utils/adt/formatting.c:4303 utils/adt/formatting.c:4409 +#: utils/adt/formatting.c:4419 #, c-format msgid "date out of range: \"%s\"" msgstr "datum utanför giltigt intervall \"%s\"" -#: utils/adt/date.c:213 utils/adt/date.c:525 utils/adt/date.c:549 -#: utils/adt/xml.c:2210 +#: utils/adt/date.c:215 utils/adt/date.c:513 utils/adt/date.c:537 +#: utils/adt/xml.c:2209 #, c-format msgid "date out of range" msgstr "datum utanför giltigt intervall" -#: utils/adt/date.c:259 utils/adt/timestamp.c:574 +#: utils/adt/date.c:261 utils/adt/timestamp.c:581 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "datumfältvärde utanför giltigt område: %d-%02d-%02d" -#: utils/adt/date.c:266 utils/adt/date.c:275 utils/adt/timestamp.c:580 +#: utils/adt/date.c:268 utils/adt/date.c:277 utils/adt/timestamp.c:587 #, c-format msgid "date out of range: %d-%02d-%02d" msgstr "datum utanför giltigt område: %d-%02d-%02d" -#: utils/adt/date.c:313 utils/adt/date.c:336 utils/adt/date.c:362 -#: utils/adt/date.c:1142 utils/adt/date.c:1188 utils/adt/date.c:1744 -#: utils/adt/date.c:1775 utils/adt/date.c:1804 utils/adt/date.c:2636 -#: utils/adt/datetime.c:1655 utils/adt/formatting.c:4067 -#: utils/adt/formatting.c:4099 utils/adt/formatting.c:4179 -#: utils/adt/formatting.c:4301 utils/adt/json.c:418 utils/adt/json.c:457 -#: utils/adt/timestamp.c:222 utils/adt/timestamp.c:254 -#: utils/adt/timestamp.c:692 utils/adt/timestamp.c:701 -#: utils/adt/timestamp.c:779 utils/adt/timestamp.c:812 -#: utils/adt/timestamp.c:2822 utils/adt/timestamp.c:2843 -#: utils/adt/timestamp.c:2856 utils/adt/timestamp.c:2865 -#: utils/adt/timestamp.c:2873 utils/adt/timestamp.c:2928 -#: utils/adt/timestamp.c:2951 utils/adt/timestamp.c:2964 -#: utils/adt/timestamp.c:2975 utils/adt/timestamp.c:2983 -#: utils/adt/timestamp.c:3643 utils/adt/timestamp.c:3768 -#: utils/adt/timestamp.c:3809 utils/adt/timestamp.c:3899 -#: utils/adt/timestamp.c:3943 utils/adt/timestamp.c:4046 -#: utils/adt/timestamp.c:4531 utils/adt/timestamp.c:4727 -#: utils/adt/timestamp.c:5054 utils/adt/timestamp.c:5068 -#: utils/adt/timestamp.c:5073 utils/adt/timestamp.c:5087 -#: utils/adt/timestamp.c:5120 utils/adt/timestamp.c:5207 -#: utils/adt/timestamp.c:5248 utils/adt/timestamp.c:5252 -#: utils/adt/timestamp.c:5321 utils/adt/timestamp.c:5325 -#: utils/adt/timestamp.c:5339 utils/adt/timestamp.c:5373 utils/adt/xml.c:2232 -#: utils/adt/xml.c:2239 utils/adt/xml.c:2259 utils/adt/xml.c:2266 -#, c-format -msgid "timestamp out of range" -msgstr "timestamp utanför giltigt intervall" - -#: utils/adt/date.c:500 +#: utils/adt/date.c:488 #, c-format msgid "cannot subtract infinite dates" msgstr "kan inte subtrahera oändliga datum" -#: utils/adt/date.c:598 utils/adt/date.c:661 utils/adt/date.c:697 -#: utils/adt/date.c:2673 utils/adt/date.c:2683 +#: utils/adt/date.c:586 utils/adt/date.c:649 utils/adt/date.c:685 +#: utils/adt/date.c:2868 utils/adt/date.c:2878 #, c-format msgid "date out of range for timestamp" msgstr "datum utanför filtigt område för timestamp" -#: utils/adt/date.c:1361 utils/adt/date.c:2131 utils/adt/formatting.c:4387 +#: utils/adt/date.c:1115 utils/adt/date.c:1198 utils/adt/date.c:1214 +#: utils/adt/date.c:2195 utils/adt/date.c:2973 utils/adt/timestamp.c:4032 +#: utils/adt/timestamp.c:4225 utils/adt/timestamp.c:4397 +#: utils/adt/timestamp.c:4650 utils/adt/timestamp.c:4851 +#: utils/adt/timestamp.c:4898 utils/adt/timestamp.c:5122 +#: utils/adt/timestamp.c:5169 utils/adt/timestamp.c:5299 +#, fuzzy, c-format +#| msgid "date units \"%s\" not supported" +msgid "unit \"%s\" not supported for type %s" +msgstr "datumenhet \"%s\" stöds inte" + +#: utils/adt/date.c:1223 utils/adt/date.c:2211 utils/adt/date.c:2993 +#: utils/adt/timestamp.c:4046 utils/adt/timestamp.c:4242 +#: utils/adt/timestamp.c:4411 utils/adt/timestamp.c:4610 +#: utils/adt/timestamp.c:4907 utils/adt/timestamp.c:5178 +#: utils/adt/timestamp.c:5360 +#, fuzzy, c-format +#| msgid "date units \"%s\" not recognized" +msgid "unit \"%s\" not recognized for type %s" +msgstr "datumenheten \"%s\" är okänd" + +#: utils/adt/date.c:1307 utils/adt/date.c:1353 utils/adt/date.c:1907 +#: utils/adt/date.c:1938 utils/adt/date.c:1967 utils/adt/date.c:2831 +#: utils/adt/date.c:3078 utils/adt/datetime.c:420 utils/adt/datetime.c:1869 +#: utils/adt/formatting.c:4136 utils/adt/formatting.c:4172 +#: utils/adt/formatting.c:4263 utils/adt/formatting.c:4385 utils/adt/json.c:440 +#: utils/adt/json.c:479 utils/adt/timestamp.c:225 utils/adt/timestamp.c:257 +#: utils/adt/timestamp.c:699 utils/adt/timestamp.c:708 +#: utils/adt/timestamp.c:786 utils/adt/timestamp.c:819 +#: utils/adt/timestamp.c:2916 utils/adt/timestamp.c:2937 +#: utils/adt/timestamp.c:2950 utils/adt/timestamp.c:2959 +#: utils/adt/timestamp.c:2967 utils/adt/timestamp.c:3022 +#: utils/adt/timestamp.c:3045 utils/adt/timestamp.c:3058 +#: utils/adt/timestamp.c:3069 utils/adt/timestamp.c:3077 +#: utils/adt/timestamp.c:3736 utils/adt/timestamp.c:3860 +#: utils/adt/timestamp.c:3950 utils/adt/timestamp.c:4040 +#: utils/adt/timestamp.c:4133 utils/adt/timestamp.c:4236 +#: utils/adt/timestamp.c:4715 utils/adt/timestamp.c:4989 +#: utils/adt/timestamp.c:5439 utils/adt/timestamp.c:5453 +#: utils/adt/timestamp.c:5458 utils/adt/timestamp.c:5472 +#: utils/adt/timestamp.c:5505 utils/adt/timestamp.c:5592 +#: utils/adt/timestamp.c:5633 utils/adt/timestamp.c:5637 +#: utils/adt/timestamp.c:5706 utils/adt/timestamp.c:5710 +#: utils/adt/timestamp.c:5724 utils/adt/timestamp.c:5758 utils/adt/xml.c:2231 +#: utils/adt/xml.c:2238 utils/adt/xml.c:2258 utils/adt/xml.c:2265 +#, c-format +msgid "timestamp out of range" +msgstr "timestamp utanför giltigt intervall" + +#: utils/adt/date.c:1524 utils/adt/date.c:2326 utils/adt/formatting.c:4471 #, c-format msgid "time out of range" msgstr "time utanför giltigt intervall" -#: utils/adt/date.c:1413 utils/adt/timestamp.c:589 +#: utils/adt/date.c:1576 utils/adt/timestamp.c:596 #, c-format msgid "time field value out of range: %d:%02d:%02g" msgstr "time-värde utanför giltigt område: %d:%02d:%02g" -#: utils/adt/date.c:1933 utils/adt/date.c:2435 utils/adt/float.c:1071 -#: utils/adt/float.c:1140 utils/adt/int.c:616 utils/adt/int.c:663 -#: utils/adt/int.c:698 utils/adt/int8.c:492 utils/adt/numeric.c:2197 -#: utils/adt/timestamp.c:3292 utils/adt/timestamp.c:3323 -#: utils/adt/timestamp.c:3354 +#: utils/adt/date.c:2096 utils/adt/date.c:2630 utils/adt/float.c:1048 +#: utils/adt/float.c:1124 utils/adt/int.c:638 utils/adt/int.c:685 +#: utils/adt/int.c:720 utils/adt/int8.c:414 utils/adt/numeric.c:2497 +#: utils/adt/timestamp.c:3386 utils/adt/timestamp.c:3417 +#: utils/adt/timestamp.c:3448 #, c-format msgid "invalid preceding or following size in window function" msgstr "ogiltig föregående eller efterföljande storlek i fönsterfunktion" -#: utils/adt/date.c:2018 utils/adt/date.c:2031 -#, c-format -msgid "\"time\" units \"%s\" not recognized" -msgstr "känner inte igen \"time\"-enhet \"%s\"" - -#: utils/adt/date.c:2139 +#: utils/adt/date.c:2334 #, c-format msgid "time zone displacement out of range" msgstr "tidszonförskjutning utanför giltigt intervall" -#: utils/adt/date.c:2768 utils/adt/date.c:2781 -#, c-format -msgid "\"time with time zone\" units \"%s\" not recognized" -msgstr "känner inte igen \"time with time zone\" enhet \"%s\"" - -#: utils/adt/date.c:2854 utils/adt/datetime.c:906 utils/adt/datetime.c:1813 -#: utils/adt/datetime.c:4601 utils/adt/timestamp.c:513 -#: utils/adt/timestamp.c:540 utils/adt/timestamp.c:4129 -#: utils/adt/timestamp.c:5079 utils/adt/timestamp.c:5331 +#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 +#: utils/adt/datetime.c:4906 utils/adt/timestamp.c:516 +#: utils/adt/timestamp.c:543 utils/adt/timestamp.c:4319 +#: utils/adt/timestamp.c:5464 utils/adt/timestamp.c:5716 #, c-format msgid "time zone \"%s\" not recognized" msgstr "tidszon \"%s\" känns inte igen" -#: utils/adt/date.c:2886 utils/adt/timestamp.c:5109 utils/adt/timestamp.c:5362 +#: utils/adt/date.c:3116 utils/adt/timestamp.c:5494 utils/adt/timestamp.c:5747 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "intervalltidszonen \"%s\" kan inte inkludera månader eller år" -#: utils/adt/datetime.c:3730 utils/adt/datetime.c:3737 +#: utils/adt/datetime.c:4031 utils/adt/datetime.c:4038 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "datum/tid-värde utanför giltigt område: \"%s\"" -#: utils/adt/datetime.c:3739 +#: utils/adt/datetime.c:4040 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Du kanske behöver en annan inställning av variabeln \"datestyle\"." -#: utils/adt/datetime.c:3744 +#: utils/adt/datetime.c:4045 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "intervall-värde utanför giltigt område: \"%s\"" -#: utils/adt/datetime.c:3750 +#: utils/adt/datetime.c:4051 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "tidszonförskjutning itanför sitt intervall: \"%s\"" -#: utils/adt/datetime.c:4603 +#: utils/adt/datetime.c:4908 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "Detta tidszonsnamn finns i konfigurationsfilen för tidszonsförkortning \"%s\"." -#: utils/adt/datum.c:89 utils/adt/datum.c:101 +#: utils/adt/datum.c:90 utils/adt/datum.c:102 #, c-format msgid "invalid Datum pointer" msgstr "ogiltigt Datum-pekare" -#: utils/adt/dbsize.c:759 utils/adt/dbsize.c:827 +#: utils/adt/dbsize.c:747 utils/adt/dbsize.c:813 #, c-format msgid "invalid size: \"%s\"" msgstr "ogiltig storlek: \"%s\"" -#: utils/adt/dbsize.c:828 +#: utils/adt/dbsize.c:814 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Ogiltig storleksenhet: \"%s\"." -#: utils/adt/dbsize.c:829 -#, c-format -msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." +#: utils/adt/dbsize.c:815 +#, fuzzy, c-format +#| msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." +msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." msgstr "Giltiga enheter är \"bytes\", \"kB\", \"MB\", \"GB\" och \"TB\"." #: utils/adt/domains.c:92 @@ -21893,1058 +23834,1090 @@ msgstr "Giltiga enheter är \"bytes\", \"kB\", \"MB\", \"GB\" och \"TB\"." msgid "type %s is not a domain" msgstr "typen %s är inte en domän" -#: utils/adt/encode.c:64 utils/adt/encode.c:112 +#: utils/adt/encode.c:65 utils/adt/encode.c:113 #, c-format msgid "unrecognized encoding: \"%s\"" msgstr "okänd kodning: \"%s\"" -#: utils/adt/encode.c:78 +#: utils/adt/encode.c:79 #, c-format msgid "result of encoding conversion is too large" msgstr "resultat från kodningskonvertering är för stort" -#: utils/adt/encode.c:126 +#: utils/adt/encode.c:127 #, c-format msgid "result of decoding conversion is too large" msgstr "resultatet av avkodningskonverteringen är för stort" -#: utils/adt/encode.c:184 +#: utils/adt/encode.c:186 #, c-format -msgid "invalid hexadecimal digit: \"%c\"" -msgstr "ogiltigt hexdecimal siffra: \"%c\"" +msgid "invalid hexadecimal digit: \"%.*s\"" +msgstr "ogiltigt hexdecimal siffra: \"%.*s\"" -#: utils/adt/encode.c:212 +#: utils/adt/encode.c:216 #, c-format msgid "invalid hexadecimal data: odd number of digits" msgstr "ogiltig hexadecimal data: udda antal siffror" -#: utils/adt/encode.c:329 +#: utils/adt/encode.c:334 #, c-format msgid "unexpected \"=\" while decoding base64 sequence" msgstr "oväntat \"=\" vid avkodning av base64-sekvens" -#: utils/adt/encode.c:341 +#: utils/adt/encode.c:346 #, c-format -msgid "invalid symbol \"%c\" while decoding base64 sequence" -msgstr "ogiltig symbol \"%c\" vid avkodning av base64-sekvens" +msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" +msgstr "ogiltig symbol \"%.*s\" hittades vid avkodning av base64-sekvens" -#: utils/adt/encode.c:361 +#: utils/adt/encode.c:367 #, c-format msgid "invalid base64 end sequence" msgstr "ogiltig base64-slutsekvens" -#: utils/adt/encode.c:362 +#: utils/adt/encode.c:368 #, c-format msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "Indata saknar paddning, är trunkerad eller är trasig på annat sätt." -#: utils/adt/enum.c:100 +#: utils/adt/enum.c:99 #, c-format msgid "unsafe use of new value \"%s\" of enum type %s" msgstr "osäker användning av nytt värde \"%s\" i enum typ %s" -#: utils/adt/enum.c:103 +#: utils/adt/enum.c:102 #, c-format msgid "New enum values must be committed before they can be used." msgstr "Nya enum-värden måste commit:as innan de kan användas." -#: utils/adt/enum.c:121 utils/adt/enum.c:131 utils/adt/enum.c:189 -#: utils/adt/enum.c:199 +#: utils/adt/enum.c:120 utils/adt/enum.c:130 utils/adt/enum.c:188 +#: utils/adt/enum.c:198 #, c-format msgid "invalid input value for enum %s: \"%s\"" msgstr "ogiltigt indata-värde för enum %s: \"%s\"" -#: utils/adt/enum.c:161 utils/adt/enum.c:227 utils/adt/enum.c:286 +#: utils/adt/enum.c:160 utils/adt/enum.c:226 utils/adt/enum.c:285 #, c-format msgid "invalid internal value for enum: %u" msgstr "ogiltigt internt värde för enum: %u" -#: utils/adt/enum.c:446 utils/adt/enum.c:475 utils/adt/enum.c:515 -#: utils/adt/enum.c:535 +#: utils/adt/enum.c:445 utils/adt/enum.c:474 utils/adt/enum.c:514 +#: utils/adt/enum.c:534 #, c-format msgid "could not determine actual enum type" msgstr "kunde inte bestämma den verkliga enum-typen" -#: utils/adt/enum.c:454 utils/adt/enum.c:483 +#: utils/adt/enum.c:453 utils/adt/enum.c:482 #, c-format msgid "enum %s contains no values" msgstr "enum %s innehåller inga värden" -#: utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 -#: utils/cache/typcache.c:1632 utils/cache/typcache.c:1788 -#: utils/cache/typcache.c:1918 utils/fmgr/funcapi.c:456 -#, c-format -msgid "type %s is not composite" -msgstr "typen %s är inte composite" - -#: utils/adt/float.c:88 +#: utils/adt/float.c:89 #, c-format msgid "value out of range: overflow" msgstr "värde utanför giltigt intervall: overflow" -#: utils/adt/float.c:96 +#: utils/adt/float.c:97 #, c-format msgid "value out of range: underflow" msgstr "värde utanför giltigt intervall: underflow" -#: utils/adt/float.c:265 +#: utils/adt/float.c:266 #, c-format msgid "\"%s\" is out of range for type real" msgstr "\"%s\" är utanför giltigt intervall för typen real" -#: utils/adt/float.c:489 +#: utils/adt/float.c:478 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "\"%s\" är utanför giltigt intervall för typen double precision" -#: utils/adt/float.c:1268 utils/adt/float.c:1342 utils/adt/int.c:336 -#: utils/adt/int.c:874 utils/adt/int.c:896 utils/adt/int.c:910 -#: utils/adt/int.c:924 utils/adt/int.c:956 utils/adt/int.c:1194 -#: utils/adt/int8.c:1313 utils/adt/numeric.c:3553 utils/adt/numeric.c:3562 +#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:358 +#: utils/adt/int.c:896 utils/adt/int.c:918 utils/adt/int.c:932 +#: utils/adt/int.c:946 utils/adt/int.c:978 utils/adt/int.c:1216 +#: utils/adt/int8.c:1278 utils/adt/numeric.c:4377 utils/adt/numeric.c:4382 #, c-format msgid "smallint out of range" msgstr "smallint utanför sitt intervall" -#: utils/adt/float.c:1468 utils/adt/numeric.c:8329 +#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9482 #, c-format msgid "cannot take square root of a negative number" msgstr "kan inte ta kvadratroten av ett negativt tal" -#: utils/adt/float.c:1536 utils/adt/numeric.c:3239 +#: utils/adt/float.c:1527 utils/adt/numeric.c:3886 utils/adt/numeric.c:3998 #, c-format msgid "zero raised to a negative power is undefined" msgstr "noll upphöjt med ett negativt tal är odefinierat" -#: utils/adt/float.c:1540 utils/adt/numeric.c:3245 +#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10378 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "ett negativt tal upphöjt i en icke-negativ potens ger ett komplext resultat" -#: utils/adt/float.c:1614 utils/adt/float.c:1647 utils/adt/numeric.c:8993 +#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 +#: utils/adt/numeric.c:10153 #, c-format msgid "cannot take logarithm of zero" msgstr "kan inte ta logartimen av noll" -#: utils/adt/float.c:1618 utils/adt/float.c:1651 utils/adt/numeric.c:8997 +#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 +#: utils/adt/numeric.c:3793 utils/adt/numeric.c:10157 #, c-format msgid "cannot take logarithm of a negative number" msgstr "kan inte ta logaritmen av ett negativt tal" -#: utils/adt/float.c:1684 utils/adt/float.c:1715 utils/adt/float.c:1810 -#: utils/adt/float.c:1837 utils/adt/float.c:1865 utils/adt/float.c:1892 -#: utils/adt/float.c:2039 utils/adt/float.c:2076 utils/adt/float.c:2246 -#: utils/adt/float.c:2302 utils/adt/float.c:2367 utils/adt/float.c:2424 -#: utils/adt/float.c:2615 utils/adt/float.c:2639 +#: utils/adt/float.c:1777 utils/adt/float.c:1808 utils/adt/float.c:1903 +#: utils/adt/float.c:1930 utils/adt/float.c:1958 utils/adt/float.c:1985 +#: utils/adt/float.c:2132 utils/adt/float.c:2169 utils/adt/float.c:2339 +#: utils/adt/float.c:2395 utils/adt/float.c:2460 utils/adt/float.c:2517 +#: utils/adt/float.c:2708 utils/adt/float.c:2732 #, c-format msgid "input is out of range" msgstr "indata är utanför giltigt intervall" -#: utils/adt/float.c:2706 +#: utils/adt/float.c:2796 #, c-format msgid "setseed parameter %g is out of allowed range [-1,1]" msgstr "setseed-parameter %g är utanför giltigt intervall [-1,1]" -#: utils/adt/float.c:3938 utils/adt/numeric.c:1509 +#: utils/adt/float.c:4024 utils/adt/numeric.c:1770 #, c-format msgid "count must be greater than zero" msgstr "antal måste vara större än noll" -#: utils/adt/float.c:3943 utils/adt/numeric.c:1516 +#: utils/adt/float.c:4029 utils/adt/numeric.c:1781 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "operand, lägre gräns och övre gräns kan inte vara NaN" -#: utils/adt/float.c:3949 +#: utils/adt/float.c:4035 utils/adt/numeric.c:1786 #, c-format msgid "lower and upper bounds must be finite" msgstr "lägre och övre gräns måste vara ändliga" -#: utils/adt/float.c:3983 utils/adt/numeric.c:1529 +#: utils/adt/float.c:4069 utils/adt/numeric.c:1800 #, c-format msgid "lower bound cannot equal upper bound" msgstr "lägre gräns kan inte vara samma som övre gräns" -#: utils/adt/formatting.c:532 +#: utils/adt/formatting.c:561 #, c-format msgid "invalid format specification for an interval value" msgstr "ogiltig formatspecifikation för ett intervallvärdei" -#: utils/adt/formatting.c:533 +#: utils/adt/formatting.c:562 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "Intervaller är inte kopplade till specifika kalenderdatum." -#: utils/adt/formatting.c:1157 +#: utils/adt/formatting.c:1187 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\" måste vara det sista mönstret som används" -#: utils/adt/formatting.c:1165 +#: utils/adt/formatting.c:1195 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\" måste vara före \"PR\"" -#: utils/adt/formatting.c:1181 +#: utils/adt/formatting.c:1211 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\" måste vara före \"PR\"" -#: utils/adt/formatting.c:1208 +#: utils/adt/formatting.c:1238 #, c-format msgid "multiple decimal points" msgstr "multipla decimalpunkter" -#: utils/adt/formatting.c:1212 utils/adt/formatting.c:1295 +#: utils/adt/formatting.c:1242 utils/adt/formatting.c:1325 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "kan inte använda \"V\" ach decimalpunkt tillsammans" -#: utils/adt/formatting.c:1224 +#: utils/adt/formatting.c:1254 #, c-format msgid "cannot use \"S\" twice" msgstr "kan inte använda \"S\" två gånger" -#: utils/adt/formatting.c:1228 +#: utils/adt/formatting.c:1258 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "kan inte använda \"S\" och \"PL\"/\"MI\"/\"SG\"/\"PR\" tillsammans" -#: utils/adt/formatting.c:1248 +#: utils/adt/formatting.c:1278 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "kan inte använda \"S\" och \"MI\" tillsammans." -#: utils/adt/formatting.c:1258 +#: utils/adt/formatting.c:1288 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "kan inte använda \"S\" och \"PL\" tillsammans." -#: utils/adt/formatting.c:1268 +#: utils/adt/formatting.c:1298 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "kan inte använda \"S\" och \"SG\" tillsammans." -#: utils/adt/formatting.c:1277 +#: utils/adt/formatting.c:1307 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "kan inte använda \"PR\" och \"S\"/\"PL\"/\"MI\"/\"SG\" tillsammans." -#: utils/adt/formatting.c:1303 +#: utils/adt/formatting.c:1333 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "kan inte använda \"EEEE\" två gånger" -#: utils/adt/formatting.c:1309 +#: utils/adt/formatting.c:1339 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\" är inkompatibel med andra format" -#: utils/adt/formatting.c:1310 +#: utils/adt/formatting.c:1340 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "\"EEEE\" får bara användas tillsammans med siffror- och decimalpunkts-mönster." -#: utils/adt/formatting.c:1394 +#: utils/adt/formatting.c:1424 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "ogiltigt formatseparator för datetime: \"%s\"" -#: utils/adt/formatting.c:1522 +#: utils/adt/formatting.c:1551 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\" är inte ett nummer" -#: utils/adt/formatting.c:1600 +#: utils/adt/formatting.c:1629 #, c-format msgid "case conversion failed: %s" msgstr "case-konvertering misslyckades: %s" -#: utils/adt/formatting.c:1665 utils/adt/formatting.c:1789 -#: utils/adt/formatting.c:1914 +#: utils/adt/formatting.c:1683 utils/adt/formatting.c:1805 +#: utils/adt/formatting.c:1928 #, c-format msgid "could not determine which collation to use for %s function" msgstr "kunde inte bestämma jämförelse (collation) för funktionen %s" -#: utils/adt/formatting.c:2286 +#: utils/adt/formatting.c:2309 #, c-format msgid "invalid combination of date conventions" msgstr "ogiltig kombination av datumkonventioner" -#: utils/adt/formatting.c:2287 +#: utils/adt/formatting.c:2310 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "Blanda inte datumkonventionerna Gregoriansk och ISO-veckor i formatteringsmall." -#: utils/adt/formatting.c:2310 +#: utils/adt/formatting.c:2333 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "värden för \"%s\" i formatsträng står i konflikt med varandra" -#: utils/adt/formatting.c:2313 +#: utils/adt/formatting.c:2336 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Detta värde motsäger en tidigare inställning för samma fälttyp." -#: utils/adt/formatting.c:2384 +#: utils/adt/formatting.c:2407 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "källsträngen är för kort för formatfält \"%s\"" -#: utils/adt/formatting.c:2387 +#: utils/adt/formatting.c:2410 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Fältet kräver %d tecken men bara %d återstår." -#: utils/adt/formatting.c:2390 utils/adt/formatting.c:2405 +#: utils/adt/formatting.c:2413 utils/adt/formatting.c:2428 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "Om din källsträng inte är av fast längd så testa med modifieraren \"FM\"." -#: utils/adt/formatting.c:2400 utils/adt/formatting.c:2414 -#: utils/adt/formatting.c:2637 +#: utils/adt/formatting.c:2423 utils/adt/formatting.c:2437 +#: utils/adt/formatting.c:2660 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "ogiltigt värde \"%s\" för \"%s\"" -#: utils/adt/formatting.c:2402 +#: utils/adt/formatting.c:2425 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Fältet kräver %d tecken men bara %d kunde parsas." -#: utils/adt/formatting.c:2416 +#: utils/adt/formatting.c:2439 #, c-format msgid "Value must be an integer." msgstr "Värdet måste vara ett heltal." -#: utils/adt/formatting.c:2421 +#: utils/adt/formatting.c:2444 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "värdet för \"%s\" i källsträng är utanför giltigt intervall" -#: utils/adt/formatting.c:2423 +#: utils/adt/formatting.c:2446 #, c-format msgid "Value must be in the range %d to %d." msgstr "Värdet måste vara i intervallet %d till %d." -#: utils/adt/formatting.c:2639 +#: utils/adt/formatting.c:2662 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "Det givna värdet matchar inget av de tillåtna värdena för detta fält." -#: utils/adt/formatting.c:2856 utils/adt/formatting.c:2876 -#: utils/adt/formatting.c:2896 utils/adt/formatting.c:2916 -#: utils/adt/formatting.c:2935 utils/adt/formatting.c:2954 -#: utils/adt/formatting.c:2978 utils/adt/formatting.c:2996 -#: utils/adt/formatting.c:3014 utils/adt/formatting.c:3032 -#: utils/adt/formatting.c:3049 utils/adt/formatting.c:3066 +#: utils/adt/formatting.c:2881 utils/adt/formatting.c:2901 +#: utils/adt/formatting.c:2921 utils/adt/formatting.c:2941 +#: utils/adt/formatting.c:2960 utils/adt/formatting.c:2979 +#: utils/adt/formatting.c:3003 utils/adt/formatting.c:3021 +#: utils/adt/formatting.c:3039 utils/adt/formatting.c:3057 +#: utils/adt/formatting.c:3074 utils/adt/formatting.c:3091 #, c-format msgid "localized string format value too long" msgstr "lokaliserat strängformatvärde är för långt" -#: utils/adt/formatting.c:3300 +#: utils/adt/formatting.c:3368 #, c-format msgid "unmatched format separator \"%c\"" msgstr "ej matchande formatteringsseparator \"%c\"" -#: utils/adt/formatting.c:3361 +#: utils/adt/formatting.c:3429 #, c-format msgid "unmatched format character \"%s\"" msgstr "ej matchande formatteringstecken \"%s\"" -#: utils/adt/formatting.c:3467 utils/adt/formatting.c:3811 +#: utils/adt/formatting.c:3535 utils/adt/formatting.c:3879 #, c-format msgid "formatting field \"%s\" is only supported in to_char" msgstr "formateringsfält \"%s\" stöds bara i to_char" -#: utils/adt/formatting.c:3642 +#: utils/adt/formatting.c:3710 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "ogiltig indatasträng för \"Y,YYY\"" -#: utils/adt/formatting.c:3728 +#: utils/adt/formatting.c:3796 #, c-format msgid "input string is too short for datetime format" msgstr "indatasträngen är för kort för datetime-formatet" -#: utils/adt/formatting.c:3736 +#: utils/adt/formatting.c:3804 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "efterföljande tecken finns kvar i indatasträngen efter datetime-formattering" -#: utils/adt/formatting.c:4281 +#: utils/adt/formatting.c:4365 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "saknar tidszon i indatasträngen för typen timestamptz" -#: utils/adt/formatting.c:4287 +#: utils/adt/formatting.c:4371 #, c-format msgid "timestamptz out of range" msgstr "timestamptz utanför giltigt intervall" -#: utils/adt/formatting.c:4315 +#: utils/adt/formatting.c:4399 #, c-format msgid "datetime format is zoned but not timed" msgstr "datetime-format har zon men inte tid" -#: utils/adt/formatting.c:4367 +#: utils/adt/formatting.c:4451 #, c-format msgid "missing time zone in input string for type timetz" msgstr "saknar tidszon i indatasträng för typ timetz" -#: utils/adt/formatting.c:4373 +#: utils/adt/formatting.c:4457 #, c-format msgid "timetz out of range" msgstr "timetz utanför giltigt intervall" -#: utils/adt/formatting.c:4399 +#: utils/adt/formatting.c:4483 #, c-format msgid "datetime format is not dated and not timed" msgstr "datetime-format har inte datum och inte tid" -#: utils/adt/formatting.c:4532 +#: utils/adt/formatting.c:4616 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "timmen \"%d\" är ogiltigt för en 12-timmars-klocka" -#: utils/adt/formatting.c:4534 +#: utils/adt/formatting.c:4618 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Använd en 24-timmars-klocka eller ange en timme mellan 1 och 12." -#: utils/adt/formatting.c:4645 +#: utils/adt/formatting.c:4729 #, c-format msgid "cannot calculate day of year without year information" msgstr "kan inte beräkna dag på året utan årsinformation" -#: utils/adt/formatting.c:5564 +#: utils/adt/formatting.c:5648 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\" stöds inte för indata" -#: utils/adt/formatting.c:5576 +#: utils/adt/formatting.c:5660 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\" stöds inte för indata" -#: utils/adt/genfile.c:75 -#, c-format -msgid "reference to parent directory (\"..\") not allowed" -msgstr "referens till föräldrakatalog (\"..\") tillåts inte" - -#: utils/adt/genfile.c:86 +#: utils/adt/genfile.c:84 #, c-format msgid "absolute path not allowed" msgstr "absolut sökväg tillåts inte" -#: utils/adt/genfile.c:91 +#: utils/adt/genfile.c:89 #, c-format msgid "path must be in or below the current directory" msgstr "sökväg måste vara i eller under den aktuella katalogen" -#: utils/adt/genfile.c:116 utils/adt/oracle_compat.c:185 -#: utils/adt/oracle_compat.c:283 utils/adt/oracle_compat.c:759 -#: utils/adt/oracle_compat.c:1054 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:187 +#: utils/adt/oracle_compat.c:285 utils/adt/oracle_compat.c:833 +#: utils/adt/oracle_compat.c:1134 #, c-format msgid "requested length too large" msgstr "efterfrågad längd är för lång" -#: utils/adt/genfile.c:133 +#: utils/adt/genfile.c:131 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "kunde inte söka (seek) i fil \"%s\": %m" -#: utils/adt/genfile.c:174 +#: utils/adt/genfile.c:171 #, c-format msgid "file length too large" msgstr "fillängd är för stor" -#: utils/adt/genfile.c:251 +#: utils/adt/genfile.c:248 #, c-format msgid "must be superuser to read files with adminpack 1.0" -msgstr "måste vara superanvändare för att läsa filer med adminpack 1.0" +msgstr "måste vara superuser för att läsa filer med adminpack 1.0" #: utils/adt/geo_ops.c:979 utils/adt/geo_ops.c:1025 #, c-format msgid "invalid line specification: A and B cannot both be zero" msgstr "ogiltig radangivelse: A och B kan inte båda vara noll" -#: utils/adt/geo_ops.c:987 utils/adt/geo_ops.c:1090 +#: utils/adt/geo_ops.c:987 utils/adt/geo_ops.c:1097 #, c-format msgid "invalid line specification: must be two distinct points" msgstr "ogiltig linjeangivelse: måste vara två enskilda punkter" -#: utils/adt/geo_ops.c:1399 utils/adt/geo_ops.c:3486 utils/adt/geo_ops.c:4354 -#: utils/adt/geo_ops.c:5248 +#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4327 +#: utils/adt/geo_ops.c:5207 #, c-format msgid "too many points requested" msgstr "för många punkter efterfrågade" -#: utils/adt/geo_ops.c:1461 +#: utils/adt/geo_ops.c:1472 #, c-format msgid "invalid number of points in external \"path\" value" msgstr "ogiltigt antal punkter i externt \"path\"-värde" -#: utils/adt/geo_ops.c:2537 -#, c-format -msgid "function \"dist_lb\" not implemented" -msgstr "funktionen \"dist_lb\" är inte implementerad" - -#: utils/adt/geo_ops.c:2556 -#, c-format -msgid "function \"dist_bl\" not implemented" -msgstr "funktionen \"dist_bl\" är inte implementerad" - -#: utils/adt/geo_ops.c:2975 -#, c-format -msgid "function \"close_sl\" not implemented" -msgstr "funktionen \"close_sl\" är inte implementerad" - -#: utils/adt/geo_ops.c:3122 -#, c-format -msgid "function \"close_lb\" not implemented" -msgstr "funktionen \"close_lb\" är inte implementerad" - -#: utils/adt/geo_ops.c:3533 +#: utils/adt/geo_ops.c:3449 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "ogiltigt antal punkter i ett externt \"polygon\"-värde" -#: utils/adt/geo_ops.c:4069 -#, c-format -msgid "function \"poly_distance\" not implemented" -msgstr "funktionen \"poly_distance\" är inte implementerad" - -#: utils/adt/geo_ops.c:4446 -#, c-format -msgid "function \"path_center\" not implemented" -msgstr "funktionen \"path_center\" är inte implementerad" - -#: utils/adt/geo_ops.c:4463 +#: utils/adt/geo_ops.c:4422 #, c-format msgid "open path cannot be converted to polygon" msgstr "öppen väg kan inte konverteras till en polygon" -#: utils/adt/geo_ops.c:4713 +#: utils/adt/geo_ops.c:4672 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "ogiltig radie i ett externt cirkelvärde" -#: utils/adt/geo_ops.c:5234 +#: utils/adt/geo_ops.c:5193 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "kan inte konvertera en cirkel med radie noll till en polygon" -#: utils/adt/geo_ops.c:5239 +#: utils/adt/geo_ops.c:5198 #, c-format msgid "must request at least 2 points" msgstr "måste efterfråga minst 2 punkter" -#: utils/adt/int.c:164 +#: utils/adt/int.c:188 #, c-format msgid "int2vector has too many elements" msgstr "int2vector har för många element" -#: utils/adt/int.c:239 +#: utils/adt/int.c:261 #, c-format msgid "invalid int2vector data" msgstr "ogiltig int2vector-data" -#: utils/adt/int.c:245 utils/adt/oid.c:215 utils/adt/oid.c:296 +#: utils/adt/int.c:267 utils/adt/oid.c:215 utils/adt/oid.c:296 #, c-format msgid "oidvector has too many elements" msgstr "oidvector har för många element" -#: utils/adt/int.c:1510 utils/adt/int8.c:1439 utils/adt/numeric.c:1417 -#: utils/adt/timestamp.c:5424 utils/adt/timestamp.c:5504 +#: utils/adt/int.c:1532 utils/adt/int8.c:1404 utils/adt/numeric.c:1678 +#: utils/adt/timestamp.c:5809 utils/adt/timestamp.c:5889 #, c-format msgid "step size cannot equal zero" msgstr "stegstorleken kan inte vara noll" -#: utils/adt/int8.c:527 utils/adt/int8.c:550 utils/adt/int8.c:564 -#: utils/adt/int8.c:578 utils/adt/int8.c:609 utils/adt/int8.c:633 -#: utils/adt/int8.c:715 utils/adt/int8.c:783 utils/adt/int8.c:789 -#: utils/adt/int8.c:815 utils/adt/int8.c:829 utils/adt/int8.c:853 -#: utils/adt/int8.c:866 utils/adt/int8.c:935 utils/adt/int8.c:949 -#: utils/adt/int8.c:963 utils/adt/int8.c:994 utils/adt/int8.c:1016 -#: utils/adt/int8.c:1030 utils/adt/int8.c:1044 utils/adt/int8.c:1077 -#: utils/adt/int8.c:1091 utils/adt/int8.c:1105 utils/adt/int8.c:1136 -#: utils/adt/int8.c:1158 utils/adt/int8.c:1172 utils/adt/int8.c:1186 -#: utils/adt/int8.c:1348 utils/adt/int8.c:1383 utils/adt/numeric.c:3508 -#: utils/adt/varbit.c:1656 +#: utils/adt/int8.c:449 utils/adt/int8.c:472 utils/adt/int8.c:486 +#: utils/adt/int8.c:500 utils/adt/int8.c:531 utils/adt/int8.c:555 +#: utils/adt/int8.c:637 utils/adt/int8.c:705 utils/adt/int8.c:711 +#: utils/adt/int8.c:737 utils/adt/int8.c:751 utils/adt/int8.c:775 +#: utils/adt/int8.c:788 utils/adt/int8.c:900 utils/adt/int8.c:914 +#: utils/adt/int8.c:928 utils/adt/int8.c:959 utils/adt/int8.c:981 +#: utils/adt/int8.c:995 utils/adt/int8.c:1009 utils/adt/int8.c:1042 +#: utils/adt/int8.c:1056 utils/adt/int8.c:1070 utils/adt/int8.c:1101 +#: utils/adt/int8.c:1123 utils/adt/int8.c:1137 utils/adt/int8.c:1151 +#: utils/adt/int8.c:1313 utils/adt/int8.c:1348 utils/adt/numeric.c:4336 +#: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigint utanför sitt intervall" -#: utils/adt/int8.c:1396 +#: utils/adt/int8.c:1361 #, c-format msgid "OID out of range" msgstr "OID utanför sitt intervall" -#: utils/adt/json.c:271 utils/adt/jsonb.c:757 +#: utils/adt/json.c:293 utils/adt/jsonb.c:747 #, c-format msgid "key value must be scalar, not array, composite, or json" msgstr "nyckelvärde måste vara skalär, inte array, composite eller json" -#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:1812 +#: utils/adt/json.c:1069 utils/adt/json.c:1079 utils/fmgr/funcapi.c:2061 #, c-format msgid "could not determine data type for argument %d" msgstr "kunde inte lista ut datatypen för argument %d" -#: utils/adt/json.c:926 utils/adt/jsonb.c:1728 +#: utils/adt/json.c:1102 utils/adt/jsonb.c:1811 #, c-format msgid "field name must not be null" msgstr "fältnamnet får inte vara null" -#: utils/adt/json.c:1010 utils/adt/jsonb.c:1178 +#: utils/adt/json.c:1141 utils/adt/json.c:1305 +#, fuzzy, c-format +#| msgid "Duplicate keys exist." +msgid "duplicate JSON key %s" +msgstr "Duplicerade nycklar existerar." + +#: utils/adt/json.c:1249 utils/adt/jsonb.c:1195 #, c-format msgid "argument list must have even number of elements" msgstr "argumentlistan måste ha ett jämt antal element" #. translator: %s is a SQL function name -#: utils/adt/json.c:1012 utils/adt/jsonb.c:1180 +#: utils/adt/json.c:1251 utils/adt/jsonb.c:1197 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "Argumenten till %s måste bestå av varannan nyckel och varannat värde." -#: utils/adt/json.c:1028 +#: utils/adt/json.c:1289 #, c-format msgid "argument %d cannot be null" msgstr "argument %d kan inte vara null" -#: utils/adt/json.c:1029 +#: utils/adt/json.c:1290 #, c-format msgid "Object keys should be text." msgstr "Objektnycklar skall vara text." -#: utils/adt/json.c:1135 utils/adt/jsonb.c:1310 +#: utils/adt/json.c:1444 utils/adt/jsonb.c:1372 #, c-format msgid "array must have two columns" msgstr "array:en måste ha två kolumner" -#: utils/adt/json.c:1159 utils/adt/json.c:1243 utils/adt/jsonb.c:1334 -#: utils/adt/jsonb.c:1429 +#: utils/adt/json.c:1468 utils/adt/json.c:1551 utils/adt/jsonb.c:1396 +#: utils/adt/jsonb.c:1491 #, c-format msgid "null value not allowed for object key" msgstr "null-värde tillåts inte som objektnyckel" -#: utils/adt/json.c:1232 utils/adt/jsonb.c:1418 +#: utils/adt/json.c:1540 utils/adt/jsonb.c:1480 #, c-format msgid "mismatched array dimensions" msgstr "array-dimensionerna stämmer inte" -#: utils/adt/jsonb.c:287 +#: utils/adt/json.c:1720 utils/adt/jsonb_util.c:1958 +#, c-format +msgid "duplicate JSON object key value" +msgstr "" + +#: utils/adt/jsonb.c:276 #, c-format msgid "string too long to represent as jsonb string" msgstr "strängen är för lång för att representeras som en jsonb-sträng" -#: utils/adt/jsonb.c:288 +#: utils/adt/jsonb.c:277 #, c-format msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "På grund av en implementationsbegränsning så kan jsonb-strängar inte överstiga %d byte." -#: utils/adt/jsonb.c:1193 +#: utils/adt/jsonb.c:1214 #, c-format msgid "argument %d: key must not be null" msgstr "argument %d: nyckeln får inte vara null" -#: utils/adt/jsonb.c:1781 +#: utils/adt/jsonb.c:1873 #, c-format msgid "object keys must be strings" msgstr "objektnycklar måste vara strängar" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:2083 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "kan inte typomvandla jsonb-null till type %s" -#: utils/adt/jsonb.c:1945 +#: utils/adt/jsonb.c:2084 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "kan inte typomvandla jsonb-sträng till typ %s" -#: utils/adt/jsonb.c:1946 +#: utils/adt/jsonb.c:2085 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "kan inte typomvandla jsonb-numeric till typ %s" -#: utils/adt/jsonb.c:1947 +#: utils/adt/jsonb.c:2086 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "kan inte typomvandla jsonb-boolean till typ %s" -#: utils/adt/jsonb.c:1948 +#: utils/adt/jsonb.c:2087 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "kan inte typomvandla jsonb-array till typ %s" -#: utils/adt/jsonb.c:1949 +#: utils/adt/jsonb.c:2088 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "kan inte typomvandla jsonb-objekt till typ %s" -#: utils/adt/jsonb.c:1950 +#: utils/adt/jsonb.c:2089 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "kan inte typomvandla jsonb-array eller objekt till typ %s" -#: utils/adt/jsonb_util.c:699 +#: utils/adt/jsonb_util.c:758 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "antalet jsonb-objektpar överskrider det maximalt tillåtna (%zu)" -#: utils/adt/jsonb_util.c:740 +#: utils/adt/jsonb_util.c:799 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "antalet jsonb-array-element överskrider det maximalt tillåtna (%zu)" -#: utils/adt/jsonb_util.c:1614 utils/adt/jsonb_util.c:1634 +#: utils/adt/jsonb_util.c:1673 utils/adt/jsonb_util.c:1693 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %u bytes" msgstr "total storlek på elementen i jsonb-array överskrider maximala %u byte" -#: utils/adt/jsonb_util.c:1695 utils/adt/jsonb_util.c:1730 -#: utils/adt/jsonb_util.c:1750 +#: utils/adt/jsonb_util.c:1754 utils/adt/jsonb_util.c:1789 +#: utils/adt/jsonb_util.c:1809 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %u bytes" msgstr "total storlek på element i jsonb-objekt överskrider maximum på %u byte" -#: utils/adt/jsonfuncs.c:551 utils/adt/jsonfuncs.c:796 -#: utils/adt/jsonfuncs.c:2330 utils/adt/jsonfuncs.c:2770 -#: utils/adt/jsonfuncs.c:3560 utils/adt/jsonfuncs.c:3891 +#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 +#, c-format +msgid "jsonb subscript does not support slices" +msgstr "array-index-syntax för jsonb stöder inte slices" + +#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 +#, c-format +msgid "subscript type %s is not supported" +msgstr "array-index-typ %s stöds inte" + +#: utils/adt/jsonbsubs.c:104 +#, c-format +msgid "jsonb subscript must be coercible to only one type, integer or text." +msgstr "array-index för jsonb måste vara konverterbar till en av typerna integer eller text." + +#: utils/adt/jsonbsubs.c:118 +#, c-format +msgid "jsonb subscript must be coercible to either integer or text." +msgstr "array-index för jsonb måste vara konverterbar till antingen integer eller text." + +#: utils/adt/jsonbsubs.c:139 +#, c-format +msgid "jsonb subscript must have text type" +msgstr "array-index för jsonb måste ha typen text" + +#: utils/adt/jsonbsubs.c:207 +#, c-format +msgid "jsonb subscript in assignment must not be null" +msgstr "array-index för jsonb i tilldelning kan inte vara null" + +#: utils/adt/jsonfuncs.c:555 utils/adt/jsonfuncs.c:791 +#: utils/adt/jsonfuncs.c:2360 utils/adt/jsonfuncs.c:2800 +#: utils/adt/jsonfuncs.c:3634 utils/adt/jsonfuncs.c:3967 #, c-format msgid "cannot call %s on a scalar" msgstr "kan inte anropa %s på en skalär" -#: utils/adt/jsonfuncs.c:556 utils/adt/jsonfuncs.c:783 -#: utils/adt/jsonfuncs.c:2772 utils/adt/jsonfuncs.c:3549 +#: utils/adt/jsonfuncs.c:560 utils/adt/jsonfuncs.c:778 +#: utils/adt/jsonfuncs.c:2802 utils/adt/jsonfuncs.c:3623 #, c-format msgid "cannot call %s on an array" msgstr "kan inte anropa %s på en array" -#: utils/adt/jsonfuncs.c:692 +#: utils/adt/jsonfuncs.c:687 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "JSON-data, rad %d: %s%s%s" -#: utils/adt/jsonfuncs.c:1682 utils/adt/jsonfuncs.c:1717 +#: utils/adt/jsonfuncs.c:1825 utils/adt/jsonfuncs.c:1860 #, c-format msgid "cannot get array length of a scalar" msgstr "kan inte hämta array-längd på skalär" -#: utils/adt/jsonfuncs.c:1686 utils/adt/jsonfuncs.c:1705 +#: utils/adt/jsonfuncs.c:1829 utils/adt/jsonfuncs.c:1848 #, c-format msgid "cannot get array length of a non-array" msgstr "kan inte hämta array-längd på icke-array" -#: utils/adt/jsonfuncs.c:1782 +#: utils/adt/jsonfuncs.c:1922 #, c-format msgid "cannot call %s on a non-object" msgstr "kan inte anropa %s på ett icke-objekt" -#: utils/adt/jsonfuncs.c:2021 +#: utils/adt/jsonfuncs.c:2106 #, c-format msgid "cannot deconstruct an array as an object" msgstr "kan inte dekonstruera en array som ett objekt" -#: utils/adt/jsonfuncs.c:2033 +#: utils/adt/jsonfuncs.c:2118 #, c-format msgid "cannot deconstruct a scalar" msgstr "kan inte dekonstruera en skalär" -#: utils/adt/jsonfuncs.c:2079 +#: utils/adt/jsonfuncs.c:2161 #, c-format msgid "cannot extract elements from a scalar" msgstr "kan inte extrahera element från en skalär" -#: utils/adt/jsonfuncs.c:2083 +#: utils/adt/jsonfuncs.c:2165 #, c-format msgid "cannot extract elements from an object" msgstr "kan inte extrahera element från ett objekt" -#: utils/adt/jsonfuncs.c:2317 utils/adt/jsonfuncs.c:3775 +#: utils/adt/jsonfuncs.c:2347 utils/adt/jsonfuncs.c:3852 #, c-format msgid "cannot call %s on a non-array" msgstr "kan inte anropa %s på icke-array" -#: utils/adt/jsonfuncs.c:2387 utils/adt/jsonfuncs.c:2392 -#: utils/adt/jsonfuncs.c:2409 utils/adt/jsonfuncs.c:2415 +#: utils/adt/jsonfuncs.c:2417 utils/adt/jsonfuncs.c:2422 +#: utils/adt/jsonfuncs.c:2439 utils/adt/jsonfuncs.c:2445 #, c-format msgid "expected JSON array" msgstr "förväntade JSON-array" -#: utils/adt/jsonfuncs.c:2388 +#: utils/adt/jsonfuncs.c:2418 #, c-format msgid "See the value of key \"%s\"." msgstr "Se värdetypen för nyckel \"%s\"" -#: utils/adt/jsonfuncs.c:2410 +#: utils/adt/jsonfuncs.c:2440 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Se array-element %s för nyckel \"%s\"." -#: utils/adt/jsonfuncs.c:2416 +#: utils/adt/jsonfuncs.c:2446 #, c-format msgid "See the array element %s." msgstr "Se array-element %s." -#: utils/adt/jsonfuncs.c:2451 +#: utils/adt/jsonfuncs.c:2481 #, c-format msgid "malformed JSON array" msgstr "felaktig JSON-array" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3278 +#: utils/adt/jsonfuncs.c:3353 #, c-format msgid "first argument of %s must be a row type" msgstr "första argumentet till %s måste vara en radtyp" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3302 +#: utils/adt/jsonfuncs.c:3377 #, c-format msgid "could not determine row type for result of %s" msgstr "kunde inte lista ut radtyp för resultat av %s" -#: utils/adt/jsonfuncs.c:3304 +#: utils/adt/jsonfuncs.c:3379 #, c-format msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." msgstr "Ange en icke-null record som argument eller anropa funktionen i FROM-klausulen med en kolumndefinitionslista." -#: utils/adt/jsonfuncs.c:3792 utils/adt/jsonfuncs.c:3873 +#: utils/adt/jsonfuncs.c:3741 utils/fmgr/funcapi.c:94 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "materialiserat läge krävs, men stöds inte i detta kontext" + +#: utils/adt/jsonfuncs.c:3869 utils/adt/jsonfuncs.c:3949 #, c-format msgid "argument of %s must be an array of objects" msgstr "argumentet till %s måste vara en array med objekt" -#: utils/adt/jsonfuncs.c:3825 +#: utils/adt/jsonfuncs.c:3902 #, c-format msgid "cannot call %s on an object" msgstr "kan inte anropa %s på ett objekt" -#: utils/adt/jsonfuncs.c:4286 utils/adt/jsonfuncs.c:4345 -#: utils/adt/jsonfuncs.c:4425 +#: utils/adt/jsonfuncs.c:4309 utils/adt/jsonfuncs.c:4368 +#: utils/adt/jsonfuncs.c:4448 #, c-format msgid "cannot delete from scalar" msgstr "kan inte radera från en skalär" -#: utils/adt/jsonfuncs.c:4430 +#: utils/adt/jsonfuncs.c:4453 #, c-format msgid "cannot delete from object using integer index" msgstr "kan inte radera från objekt genom att använda heltalsindex" -#: utils/adt/jsonfuncs.c:4495 utils/adt/jsonfuncs.c:4653 +#: utils/adt/jsonfuncs.c:4521 utils/adt/jsonfuncs.c:4682 #, c-format msgid "cannot set path in scalar" msgstr "kan inte sätta sökväg i skalär" -#: utils/adt/jsonfuncs.c:4537 utils/adt/jsonfuncs.c:4579 +#: utils/adt/jsonfuncs.c:4563 utils/adt/jsonfuncs.c:4605 #, c-format msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" msgstr "null_value_treatment måste vara \"delete_key\", \"return_target\", \"use_json_null\" eller \"raise_exception\"" -#: utils/adt/jsonfuncs.c:4550 +#: utils/adt/jsonfuncs.c:4576 #, c-format msgid "JSON value must not be null" msgstr "JSON-värde får inte vara null" -#: utils/adt/jsonfuncs.c:4551 +#: utils/adt/jsonfuncs.c:4577 #, c-format msgid "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "Avbrott utlöstes då null_value_treatment är \"raise_exception\"." -#: utils/adt/jsonfuncs.c:4552 +#: utils/adt/jsonfuncs.c:4578 #, c-format msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." msgstr "För att undvika detta så ändra null_value_treatment-argumentet eller se till att ett SQL-NULL inte skickas." -#: utils/adt/jsonfuncs.c:4607 +#: utils/adt/jsonfuncs.c:4633 #, c-format msgid "cannot delete path in scalar" msgstr "kan inte radera sökväg i skalär" -#: utils/adt/jsonfuncs.c:4776 -#, c-format -msgid "invalid concatenation of jsonb objects" -msgstr "ogiltig sammanslagning av jsonb-objekt" - -#: utils/adt/jsonfuncs.c:4810 +#: utils/adt/jsonfuncs.c:4849 #, c-format msgid "path element at position %d is null" msgstr "sökvägselement vid position %d är null" -#: utils/adt/jsonfuncs.c:4896 +#: utils/adt/jsonfuncs.c:4868 utils/adt/jsonfuncs.c:4899 +#: utils/adt/jsonfuncs.c:4966 #, c-format msgid "cannot replace existing key" msgstr "kan inte ersätta befintlig nyckel" -#: utils/adt/jsonfuncs.c:4897 +#: utils/adt/jsonfuncs.c:4869 utils/adt/jsonfuncs.c:4900 +#, c-format +msgid "The path assumes key is a composite object, but it is a scalar value." +msgstr "Sökvägen förväntar sig att nyckeln är ett sammansatt objekt men det är ett skalärt värde." + +#: utils/adt/jsonfuncs.c:4967 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Försök använda funktionen jsonb_set för att ersätta nyckelvärde." -#: utils/adt/jsonfuncs.c:4979 +#: utils/adt/jsonfuncs.c:5071 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "sökvägselement vid position %d är inte ett heltal: \"%s\"" -#: utils/adt/jsonfuncs.c:5098 +#: utils/adt/jsonfuncs.c:5088 +#, c-format +msgid "path element at position %d is out of range: %d" +msgstr "sökvägselement vid position %d är utanför giltigt intervall: %d\"" + +#: utils/adt/jsonfuncs.c:5240 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "fel flaggtyp, bara array:er och skalärer tillåts" -#: utils/adt/jsonfuncs.c:5105 +#: utils/adt/jsonfuncs.c:5247 #, c-format msgid "flag array element is not a string" msgstr "flaggelement i arrayen är inte en sträng" -#: utils/adt/jsonfuncs.c:5106 utils/adt/jsonfuncs.c:5128 +#: utils/adt/jsonfuncs.c:5248 utils/adt/jsonfuncs.c:5270 #, c-format msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." msgstr "Möjliga värden är: \"string\", \"numeric\", \"boolean\", \"key\" samt \"all\"." -#: utils/adt/jsonfuncs.c:5126 +#: utils/adt/jsonfuncs.c:5268 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "fel flagga i flagg-array: \"%s\"" -#: utils/adt/jsonpath.c:362 +#: utils/adt/jsonpath.c:364 #, c-format msgid "@ is not allowed in root expressions" msgstr "@ är inte tillåten i rotuttryck" -#: utils/adt/jsonpath.c:368 +#: utils/adt/jsonpath.c:370 #, c-format msgid "LAST is allowed only in array subscripts" msgstr "LAST tillåts bara i array-indexeringar" -#: utils/adt/jsonpath_exec.c:360 +#: utils/adt/jsonpath_exec.c:434 #, c-format msgid "single boolean result is expected" msgstr "förväntade ett booleanskt resultat" -#: utils/adt/jsonpath_exec.c:556 -#, c-format -msgid "\"vars\" argument is not an object" -msgstr "\"variabel\"-argumentet är inte ett objekt" - -#: utils/adt/jsonpath_exec.c:557 -#, c-format -msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." -msgstr "Jsonpath-parametrar skall kodas som nyckel-värde-par av \"variabel\"-objekt." - -#: utils/adt/jsonpath_exec.c:674 +#: utils/adt/jsonpath_exec.c:746 #, c-format msgid "JSON object does not contain key \"%s\"" msgstr "JSON-objekt innehåller inte nyckeln \"%s\"" -#: utils/adt/jsonpath_exec.c:686 +#: utils/adt/jsonpath_exec.c:758 #, c-format msgid "jsonpath member accessor can only be applied to an object" msgstr "jsonpaths medlemsväljare kan bara appliceras på ett objekt" -#: utils/adt/jsonpath_exec.c:715 +#: utils/adt/jsonpath_exec.c:787 #, c-format msgid "jsonpath wildcard array accessor can only be applied to an array" msgstr "jsonpaths arrayväljare med wildcard kan bara applcieras på en array" -#: utils/adt/jsonpath_exec.c:763 +#: utils/adt/jsonpath_exec.c:835 #, c-format msgid "jsonpath array subscript is out of bounds" -msgstr "jsonpaths array-index är utanför giltigt område" +msgstr "array-index för jsonpath är utanför giltigt område" -#: utils/adt/jsonpath_exec.c:820 +#: utils/adt/jsonpath_exec.c:892 #, c-format msgid "jsonpath array accessor can only be applied to an array" msgstr "jsonpaths arrayväljare kan bara appliceras på en array" -#: utils/adt/jsonpath_exec.c:874 +#: utils/adt/jsonpath_exec.c:944 #, c-format msgid "jsonpath wildcard member accessor can only be applied to an object" msgstr "jsonpaths medlemsväljare med wildcard kan bara appliceras på ett objekt" -#: utils/adt/jsonpath_exec.c:1004 +#: utils/adt/jsonpath_exec.c:1074 #, c-format msgid "jsonpath item method .%s() can only be applied to an array" msgstr "jsonpaths elementmetod .%s() lkan bara applicerar på en array" -#: utils/adt/jsonpath_exec.c:1059 +#: utils/adt/jsonpath_exec.c:1127 #, c-format msgid "numeric argument of jsonpath item method .%s() is out of range for type double precision" msgstr "numeriskt argument till jsonpaths elementmetod .%s() är utanför giltigt intervall för typen double precision" -#: utils/adt/jsonpath_exec.c:1080 +#: utils/adt/jsonpath_exec.c:1148 #, c-format msgid "string argument of jsonpath item method .%s() is not a valid representation of a double precision number" msgstr "strängargument till jsonpaths elementmetod .%s() är inte en giltig representation av ett double precision-nummer" -#: utils/adt/jsonpath_exec.c:1093 +#: utils/adt/jsonpath_exec.c:1161 #, c-format msgid "jsonpath item method .%s() can only be applied to a string or numeric value" msgstr "jsonpaths elementmetod .%s() kan bara applicerar på en sträng eller ett numeriskt värde" -#: utils/adt/jsonpath_exec.c:1583 +#: utils/adt/jsonpath_exec.c:1651 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "vänster operand på jsonpath-operator %s är inte ett ensamt numeriskt värde" -#: utils/adt/jsonpath_exec.c:1590 +#: utils/adt/jsonpath_exec.c:1658 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "höger operand på jsonpath-operator %s är inte ett ensamt numeriskt värde" -#: utils/adt/jsonpath_exec.c:1658 +#: utils/adt/jsonpath_exec.c:1726 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "operand till unär jsonpath-operator %s är inte ett numeriskt värde" -#: utils/adt/jsonpath_exec.c:1756 +#: utils/adt/jsonpath_exec.c:1824 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "jsonpaths elementmetod .%s() kan bara appliceras på ett numeriskt värde" -#: utils/adt/jsonpath_exec.c:1796 +#: utils/adt/jsonpath_exec.c:1864 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "jsonpaths elementmetod .%s() lkan bara applicerar på en sträng" -#: utils/adt/jsonpath_exec.c:1890 +#: utils/adt/jsonpath_exec.c:1958 #, c-format msgid "datetime format is not recognized: \"%s\"" msgstr "datetime-format känns inte igen: \"%s\"" -#: utils/adt/jsonpath_exec.c:1892 +#: utils/adt/jsonpath_exec.c:1960 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "Använd ett datetime-mallargument för att ange indataformatet." -#: utils/adt/jsonpath_exec.c:1960 +#: utils/adt/jsonpath_exec.c:2028 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" -msgstr "jsonpaths elementmetod .%s() kan bara appliceras på ett objekt" +msgstr "elementmetod .%s() för jsonpath kan bara appliceras på ett objekt" -#: utils/adt/jsonpath_exec.c:2143 +#: utils/adt/jsonpath_exec.c:2195 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "kunde inte hitta jsonpath-variabel \"%s\"" -#: utils/adt/jsonpath_exec.c:2407 +#: utils/adt/jsonpath_exec.c:2216 +#, c-format +msgid "\"vars\" argument is not an object" +msgstr "\"variabel\"-argumentet är inte ett objekt" + +#: utils/adt/jsonpath_exec.c:2217 +#, c-format +msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." +msgstr "Jsonpath-parametrar skall kodas som nyckel-värde-par av \"variabel\"-objekt." + +#: utils/adt/jsonpath_exec.c:2495 #, c-format msgid "jsonpath array subscript is not a single numeric value" -msgstr "jsonpaths array-index är inte ett ensamt numeriskt värde" +msgstr "array-index för jsonpath är inte ett ensamt numeriskt värde" -#: utils/adt/jsonpath_exec.c:2419 +#: utils/adt/jsonpath_exec.c:2507 #, c-format msgid "jsonpath array subscript is out of integer range" -msgstr "jsonpaths array-index är utanför giltigt interval för integer" +msgstr "array-index för jsonpath är utanför giltigt interval för integer" -#: utils/adt/jsonpath_exec.c:2596 +#: utils/adt/jsonpath_exec.c:2691 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "kan inte konvertera värde från %s till %s utan att använda tidszon" -#: utils/adt/jsonpath_exec.c:2598 +#: utils/adt/jsonpath_exec.c:2693 #, c-format msgid "Use *_tz() function for time zone support." msgstr "ANvända *_tz()-funktioner som stöder tidszon." +#: utils/adt/jsonpath_exec.c:2974 +#, c-format +msgid "JSON path expression in JSON_QUERY should return singleton item without wrapper" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2976 +#, c-format +msgid "use WITH WRAPPER clause to wrap SQL/JSON item sequence into array" +msgstr "" + +#: utils/adt/jsonpath_exec.c:3024 utils/adt/jsonpath_exec.c:3044 +#, c-format +msgid "JSON path expression in JSON_VALUE should return singleton scalar item" +msgstr "" + +#: utils/adt/jsonpath_exec.c:3137 +#, c-format +msgid "only bool, numeric, and text types could be casted to supported jsonpath types." +msgstr "" + #: utils/adt/levenshtein.c:133 #, c-format msgid "levenshtein argument exceeds maximum length of %d characters" @@ -22955,7 +24928,7 @@ msgstr "levenshtein-argument överskrider maximala längden på %d tecken" msgid "nondeterministic collations are not supported for LIKE" msgstr "ickedeterministiska jämförelser (collation) stöds inte för LIKE" -#: utils/adt/like.c:193 utils/adt/like_support.c:1002 +#: utils/adt/like.c:189 utils/adt/like_support.c:1023 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "kunde inte bestämma vilken jämförelse (collation) som skall användas för ILIKE" @@ -22970,27 +24943,27 @@ msgstr "ickedeterministiska jämförelser (collation) stöds inte för ILIKE" msgid "LIKE pattern must not end with escape character" msgstr "LIKE-mönster för inte sluta med ett escape-tecken" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:700 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:786 #, c-format msgid "invalid escape string" msgstr "ogiltig escape-sträng" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:701 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:787 #, c-format msgid "Escape string must be empty or one character." msgstr "Escape-sträng måste vara tom eller ett tecken." -#: utils/adt/like_support.c:987 +#: utils/adt/like_support.c:1013 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "matchning utan skiftlägeskänslighet stöds inte för typen bytea" -#: utils/adt/like_support.c:1089 +#: utils/adt/like_support.c:1114 #, c-format msgid "regular-expression matching not supported on type bytea" msgstr "matching med reguljär-uttryck stöds inte för typen bytea" -#: utils/adt/mac.c:102 +#: utils/adt/mac.c:101 #, c-format msgid "invalid octet value in \"macaddr\" value: \"%s\"" msgstr "ogiltigt oktet-värde i \"macaddr\"-värde: \"%s\"" @@ -23005,724 +24978,839 @@ msgstr "macaddr8-data utanför giltigt intervall för att konverteras till macad msgid "Only addresses that have FF and FE as values in the 4th and 5th bytes from the left, for example xx:xx:xx:ff:fe:xx:xx:xx, are eligible to be converted from macaddr8 to macaddr." msgstr "Bara adresser som har FF och FE som värden i 4:e och 5:e byten från vänster, till exempel xx:xx:xx:ff:fe:xx:xx:xx, är möjliga att konvertera från macaddr8 till macaddr." -#: utils/adt/misc.c:240 +#: utils/adt/mcxtfuncs.c:182 +#, c-format +msgid "PID %d is not a PostgreSQL server process" +msgstr "PID %d är inte en PostgreSQL serverprocess" + +#: utils/adt/misc.c:216 #, c-format msgid "global tablespace never has databases" msgstr "globala tablespace:t innehåller aldrig databaser" -#: utils/adt/misc.c:262 +#: utils/adt/misc.c:238 #, c-format msgid "%u is not a tablespace OID" msgstr "%u är inte ett tabelespace-OID" -#: utils/adt/misc.c:448 +#: utils/adt/misc.c:457 msgid "unreserved" msgstr "oreserverad" -#: utils/adt/misc.c:452 +#: utils/adt/misc.c:461 msgid "unreserved (cannot be function or type name)" msgstr "ej reserverad (kan inte vara funktion eller typnamn)" -#: utils/adt/misc.c:456 +#: utils/adt/misc.c:465 msgid "reserved (can be function or type name)" msgstr "reserverad (kan vara funktion eller typnamn)" -#: utils/adt/misc.c:460 +#: utils/adt/misc.c:469 msgid "reserved" msgstr "reserverad" -#: utils/adt/misc.c:634 utils/adt/misc.c:648 utils/adt/misc.c:687 -#: utils/adt/misc.c:693 utils/adt/misc.c:699 utils/adt/misc.c:722 +#: utils/adt/misc.c:480 +msgid "can be bare label" +msgstr "kan vara en enkelt namn" + +#: utils/adt/misc.c:485 +msgid "requires AS" +msgstr "kräver AS" + +#: utils/adt/misc.c:732 utils/adt/misc.c:746 utils/adt/misc.c:785 +#: utils/adt/misc.c:791 utils/adt/misc.c:797 utils/adt/misc.c:820 #, c-format msgid "string is not a valid identifier: \"%s\"" msgstr "sträng är inte en giltig identifierare: \"%s\"" -#: utils/adt/misc.c:636 +#: utils/adt/misc.c:734 #, c-format msgid "String has unclosed double quotes." msgstr "Sträng har ej avslutade dubbla citattecken." -#: utils/adt/misc.c:650 +#: utils/adt/misc.c:748 #, c-format msgid "Quoted identifier must not be empty." msgstr "Citerad identifierare får inte vara tom." -#: utils/adt/misc.c:689 +#: utils/adt/misc.c:787 #, c-format msgid "No valid identifier before \".\"." msgstr "Ingen giltig indentifierare innan \".\"." -#: utils/adt/misc.c:695 +#: utils/adt/misc.c:793 #, c-format msgid "No valid identifier after \".\"." msgstr "Ingen giltig identifierare efter \".\"." -#: utils/adt/misc.c:753 +#: utils/adt/misc.c:853 #, c-format msgid "log format \"%s\" is not supported" msgstr "loggformat \"%s\" stöds inte" -#: utils/adt/misc.c:754 -#, c-format -msgid "The supported log formats are \"stderr\" and \"csvlog\"." +#: utils/adt/misc.c:854 +#, fuzzy, c-format +#| msgid "The supported log formats are \"stderr\" and \"csvlog\"." +msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." msgstr "Loggformat som stöds är \"stderr\" och \"csvlog\"." -#: utils/adt/network.c:111 +#: utils/adt/multirangetypes.c:149 utils/adt/multirangetypes.c:162 +#: utils/adt/multirangetypes.c:191 utils/adt/multirangetypes.c:261 +#: utils/adt/multirangetypes.c:285 +#, c-format +msgid "malformed multirange literal: \"%s\"" +msgstr "trasig multirange-litteral: \"%s\"" + +#: utils/adt/multirangetypes.c:151 +#, c-format +msgid "Missing left brace." +msgstr "Saknar vänster krullparentes" + +#: utils/adt/multirangetypes.c:193 +#, c-format +msgid "Expected range start." +msgstr "Förväntade range-start" + +#: utils/adt/multirangetypes.c:263 +#, c-format +msgid "Expected comma or end of multirange." +msgstr "Oväntat komma eller slut på multirange." + +#: utils/adt/multirangetypes.c:976 +#, c-format +msgid "multiranges cannot be constructed from multidimensional arrays" +msgstr "multiranges kan inte skapas från en multidimensionell array" + +#: utils/adt/multirangetypes.c:1002 +#, c-format +msgid "multirange values cannot contain null members" +msgstr "multirange-värden kan inte innehålla null-medlemmar" + +#: utils/adt/network.c:110 #, c-format msgid "invalid cidr value: \"%s\"" msgstr "ogiltigt cidr-värde: \"%s\"" -#: utils/adt/network.c:112 utils/adt/network.c:242 +#: utils/adt/network.c:111 utils/adt/network.c:241 #, c-format msgid "Value has bits set to right of mask." msgstr "Värdet har bitar till höger om masken." -#: utils/adt/network.c:153 utils/adt/network.c:1199 utils/adt/network.c:1224 -#: utils/adt/network.c:1249 +#: utils/adt/network.c:152 utils/adt/network.c:1184 utils/adt/network.c:1209 +#: utils/adt/network.c:1234 #, c-format msgid "could not format inet value: %m" msgstr "kunde inte formattera inet-värde: %m" #. translator: %s is inet or cidr -#: utils/adt/network.c:210 +#: utils/adt/network.c:209 #, c-format msgid "invalid address family in external \"%s\" value" msgstr "ogiltig adressfamilj i externt \"%s\"-värde" #. translator: %s is inet or cidr -#: utils/adt/network.c:217 +#: utils/adt/network.c:216 #, c-format msgid "invalid bits in external \"%s\" value" msgstr "ogiltig bitar i externt \"%s\"-värde" #. translator: %s is inet or cidr -#: utils/adt/network.c:226 +#: utils/adt/network.c:225 #, c-format msgid "invalid length in external \"%s\" value" msgstr "ogiltig längd i extern \"%s\"-värde" -#: utils/adt/network.c:241 +#: utils/adt/network.c:240 #, c-format msgid "invalid external \"cidr\" value" msgstr "ogiltigt externt \"cidr\"-värde" -#: utils/adt/network.c:337 utils/adt/network.c:360 +#: utils/adt/network.c:336 utils/adt/network.c:359 #, c-format msgid "invalid mask length: %d" msgstr "ogiltig masklängd: %d" -#: utils/adt/network.c:1267 +#: utils/adt/network.c:1252 #, c-format msgid "could not format cidr value: %m" msgstr "kunde inte formattera \"cidr\"-värde: %m" -#: utils/adt/network.c:1500 +#: utils/adt/network.c:1485 #, c-format msgid "cannot merge addresses from different families" msgstr "kan inte slå samman adresser från olika familjer" -#: utils/adt/network.c:1916 +#: utils/adt/network.c:1901 #, c-format msgid "cannot AND inet values of different sizes" msgstr "kan inte AND:a inet-värden av olika storlek" -#: utils/adt/network.c:1948 +#: utils/adt/network.c:1933 #, c-format msgid "cannot OR inet values of different sizes" msgstr "kan inte OR:a inet-värden av olika storlek" -#: utils/adt/network.c:2009 utils/adt/network.c:2085 +#: utils/adt/network.c:1994 utils/adt/network.c:2070 #, c-format msgid "result is out of range" msgstr "resultatet är utanför giltigt intervall" -#: utils/adt/network.c:2050 +#: utils/adt/network.c:2035 #, c-format msgid "cannot subtract inet values of different sizes" msgstr "kan inte subtrahera inet-värden av olika storlek" -#: utils/adt/numeric.c:827 +#: utils/adt/numeric.c:1027 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "ogiltigt tecken i externt \"numric\"-värde" -#: utils/adt/numeric.c:833 +#: utils/adt/numeric.c:1033 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "ogiltig skala i externt \"numeric\"-värde" -#: utils/adt/numeric.c:842 +#: utils/adt/numeric.c:1042 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "felaktig siffra i externt numeriskt (\"numeric\") värde " -#: utils/adt/numeric.c:1040 utils/adt/numeric.c:1054 +#: utils/adt/numeric.c:1257 utils/adt/numeric.c:1271 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "Precisionen %d för NUMERIC måste vara mellan 1 och %d" -#: utils/adt/numeric.c:1045 -#, c-format -msgid "NUMERIC scale %d must be between 0 and precision %d" +#: utils/adt/numeric.c:1262 +#, fuzzy, c-format +#| msgid "NUMERIC scale %d must be between 0 and precision %d" +msgid "NUMERIC scale %d must be between %d and %d" msgstr "Skalan %d för NUMERIC måste vara mellan 0 och precisionen %d" -#: utils/adt/numeric.c:1063 +#: utils/adt/numeric.c:1280 #, c-format msgid "invalid NUMERIC type modifier" msgstr "ogiltig typmodifierare för NUMERIC" -#: utils/adt/numeric.c:1395 +#: utils/adt/numeric.c:1638 #, c-format msgid "start value cannot be NaN" msgstr "startvärde får inte vara NaN" -#: utils/adt/numeric.c:1400 +#: utils/adt/numeric.c:1642 +#, c-format +msgid "start value cannot be infinity" +msgstr "startvärde får inte vara oändligt" + +#: utils/adt/numeric.c:1649 #, c-format msgid "stop value cannot be NaN" msgstr "stoppvärde får inte vara NaN" -#: utils/adt/numeric.c:1410 +#: utils/adt/numeric.c:1653 +#, c-format +msgid "stop value cannot be infinity" +msgstr "stoppvärde får inte vara oändligt" + +#: utils/adt/numeric.c:1666 #, c-format msgid "step size cannot be NaN" msgstr "stegstorlek får inte vara NaN" -#: utils/adt/numeric.c:2958 utils/adt/numeric.c:6064 utils/adt/numeric.c:6522 -#: utils/adt/numeric.c:8802 utils/adt/numeric.c:9240 utils/adt/numeric.c:9354 -#: utils/adt/numeric.c:9427 +#: utils/adt/numeric.c:1670 #, c-format -msgid "value overflows numeric format" -msgstr "overflow på värde i formatet numeric" +msgid "step size cannot be infinity" +msgstr "stegstorlek får inte vara oändligt" + +#: utils/adt/numeric.c:3551 +#, c-format +msgid "factorial of a negative number is undefined" +msgstr "fakultet av ett negativt tal är odefinierat" -#: utils/adt/numeric.c:3417 +#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6917 utils/adt/numeric.c:7432 +#: utils/adt/numeric.c:9956 utils/adt/numeric.c:10435 utils/adt/numeric.c:10561 +#: utils/adt/numeric.c:10634 #, c-format -msgid "cannot convert NaN to integer" -msgstr "kan inte konvertera NaN till ett integer" +msgid "value overflows numeric format" +msgstr "overflow på värde i formatet numeric" -#: utils/adt/numeric.c:3500 +#: utils/adt/numeric.c:4243 utils/adt/numeric.c:4323 utils/adt/numeric.c:4364 +#: utils/adt/numeric.c:4558 #, c-format -msgid "cannot convert NaN to bigint" -msgstr "kan inte konvertera NaN till ett bigint" +msgid "cannot convert NaN to %s" +msgstr "kan inte konvertera NaN till %s" -#: utils/adt/numeric.c:3545 +#: utils/adt/numeric.c:4247 utils/adt/numeric.c:4327 utils/adt/numeric.c:4368 +#: utils/adt/numeric.c:4562 #, c-format -msgid "cannot convert NaN to smallint" -msgstr "kan inte konvertera NaN till ett smallint" +msgid "cannot convert infinity to %s" +msgstr "kan inte konvertera oändlighet till %s" -#: utils/adt/numeric.c:3582 utils/adt/numeric.c:3653 +#: utils/adt/numeric.c:4571 #, c-format -msgid "cannot convert infinity to numeric" -msgstr "kan inte konvertera oändlighet till numeric" +msgid "pg_lsn out of range" +msgstr "pg_lsn är utanför giltigt intervall" -#: utils/adt/numeric.c:6606 +#: utils/adt/numeric.c:7519 utils/adt/numeric.c:7565 #, c-format msgid "numeric field overflow" msgstr "overflow i numeric-fält" -#: utils/adt/numeric.c:6607 +#: utils/adt/numeric.c:7520 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "Ett fält med precision %d, skala %d måste avrundas till ett absolut värde mindre än %s%d." -#: utils/adt/numutils.c:154 +#: utils/adt/numeric.c:7566 #, c-format -msgid "value \"%s\" is out of range for 8-bit integer" -msgstr "värdet \"%s\" är utanför intervallet för ett 8-bitars heltal" +msgid "A field with precision %d, scale %d cannot hold an infinite value." +msgstr "Ett fält med precision %d, skala %d kan inte innehålla ett oändligt värde." #: utils/adt/oid.c:290 #, c-format msgid "invalid oidvector data" msgstr "ogiltig oidvector-data" -#: utils/adt/oracle_compat.c:896 +#: utils/adt/oracle_compat.c:969 #, c-format msgid "requested character too large" msgstr "efterfrågat tecken är för stort" -#: utils/adt/oracle_compat.c:946 utils/adt/oracle_compat.c:1008 -#, c-format -msgid "requested character too large for encoding: %d" -msgstr "efterfrågat tecken är för stort för kodning: %d" - -#: utils/adt/oracle_compat.c:987 -#, c-format -msgid "requested character not valid for encoding: %d" -msgstr "efterfrågat tecken är inte giltigt för kodning: %d" +#: utils/adt/oracle_compat.c:1013 +#, fuzzy, c-format +#| msgid "COST must be positive" +msgid "character number must be positive" +msgstr "COST måste vara positiv" -#: utils/adt/oracle_compat.c:1001 +#: utils/adt/oracle_compat.c:1017 #, c-format msgid "null character not permitted" msgstr "nolltecken tillåts inte" -#: utils/adt/orderedsetaggs.c:442 utils/adt/orderedsetaggs.c:546 -#: utils/adt/orderedsetaggs.c:684 +#: utils/adt/oracle_compat.c:1035 utils/adt/oracle_compat.c:1088 +#, fuzzy, c-format +#| msgid "requested character too large for encoding: %d" +msgid "requested character too large for encoding: %u" +msgstr "efterfrågat tecken är för stort för kodning: %d" + +#: utils/adt/oracle_compat.c:1076 +#, fuzzy, c-format +#| msgid "requested character not valid for encoding: %d" +msgid "requested character not valid for encoding: %u" +msgstr "efterfrågat tecken är inte giltigt för kodning: %d" + +#: utils/adt/orderedsetaggs.c:448 utils/adt/orderedsetaggs.c:552 +#: utils/adt/orderedsetaggs.c:690 #, c-format msgid "percentile value %g is not between 0 and 1" msgstr "percentil-värde %g är inte mellan 0 och 1" -#: utils/adt/pg_locale.c:1262 +#: utils/adt/pg_locale.c:1228 #, c-format msgid "Apply system library package updates." msgstr "Applicera paketuppdateringar för systembibliotek." -#: utils/adt/pg_locale.c:1477 +#: utils/adt/pg_locale.c:1452 utils/adt/pg_locale.c:1700 +#: utils/adt/pg_locale.c:1979 utils/adt/pg_locale.c:2001 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "kunde inte öppna jämförelse för lokal \"%s\": %s" + +#: utils/adt/pg_locale.c:1465 utils/adt/pg_locale.c:2010 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ICU stöds inte av detta bygge" + +#: utils/adt/pg_locale.c:1494 #, c-format msgid "could not create locale \"%s\": %m" msgstr "kunde inte skapa locale \"%s\": %m" -#: utils/adt/pg_locale.c:1480 +#: utils/adt/pg_locale.c:1497 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "Operativsystemet kunde inte hitta någon lokaldata för lokalnamnet \"%s\"." -#: utils/adt/pg_locale.c:1582 +#: utils/adt/pg_locale.c:1605 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "jämförelser (collations) med olika collate- och ctype-värden stöds inte på denna plattform" -#: utils/adt/pg_locale.c:1591 +#: utils/adt/pg_locale.c:1614 #, c-format msgid "collation provider LIBC is not supported on this platform" msgstr "leverantören LIBC för jämförelse (collation) stöds inte på denna plattform" -#: utils/adt/pg_locale.c:1603 -#, c-format -msgid "collations with different collate and ctype values are not supported by ICU" -msgstr "jämförelser (collation) med olika collate- och ctype-värden stöds inte av ICU" - -#: utils/adt/pg_locale.c:1609 utils/adt/pg_locale.c:1696 -#: utils/adt/pg_locale.c:1969 -#, c-format -msgid "could not open collator for locale \"%s\": %s" -msgstr "kunde inte öppna jämförelse för lokal \"%s\": %s" - -#: utils/adt/pg_locale.c:1623 -#, c-format -msgid "ICU is not supported in this build" -msgstr "ICU stöds inte av detta bygge" - -#: utils/adt/pg_locale.c:1624 -#, c-format -msgid "You need to rebuild PostgreSQL using --with-icu." -msgstr "Du behöver bygga om PostgreSQL med --with-icu." - -#: utils/adt/pg_locale.c:1644 -#, c-format -msgid "collation \"%s\" has no actual version, but a version was specified" +#: utils/adt/pg_locale.c:1649 +#, fuzzy, c-format +#| msgid "collation \"%s\" has no actual version, but a version was specified" +msgid "collation \"%s\" has no actual version, but a version was recorded" msgstr "jämförelse (collation) \"%s\" har ingen version men en version angavs" -#: utils/adt/pg_locale.c:1651 +#: utils/adt/pg_locale.c:1655 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "jämförelse (collation) \"%s\" har en version som inte matchar" -#: utils/adt/pg_locale.c:1653 +#: utils/adt/pg_locale.c:1657 #, c-format msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgstr "Jämförelsen (collation) i databasen har skapats med version %s men operativsystemet har version %s." -#: utils/adt/pg_locale.c:1656 +#: utils/adt/pg_locale.c:1660 #, c-format msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." msgstr "Bygg om alla objekt som påverkas av denna jämförelse (collation) och kör ALTER COLLATION %s REFRESH VERSION eller bygg PostgreSQL med rätt bibliotekversion." -#: utils/adt/pg_locale.c:1747 +#: utils/adt/pg_locale.c:1731 +#, c-format +msgid "could not load locale \"%s\"" +msgstr "kunde inte skapa locale \"%s\"" + +#: utils/adt/pg_locale.c:1756 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "kunde inte hitta jämförelseversion (collation) för lokal \"%s\": felkod %lu" -#: utils/adt/pg_locale.c:1784 +#: utils/adt/pg_locale.c:1794 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "kodning \"%s\" stöds inte av ICU" -#: utils/adt/pg_locale.c:1791 +#: utils/adt/pg_locale.c:1801 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "kunde inte öppna ICU-konverterare för kodning \"%s\": %s" -#: utils/adt/pg_locale.c:1822 utils/adt/pg_locale.c:1831 -#: utils/adt/pg_locale.c:1860 utils/adt/pg_locale.c:1870 +#: utils/adt/pg_locale.c:1832 utils/adt/pg_locale.c:1841 +#: utils/adt/pg_locale.c:1870 utils/adt/pg_locale.c:1880 #, c-format msgid "%s failed: %s" msgstr "%s misslyckades: %s" -#: utils/adt/pg_locale.c:2142 +#: utils/adt/pg_locale.c:2179 #, c-format msgid "invalid multibyte character for locale" msgstr "ogiltigt multibyte-tecken för lokalen" -#: utils/adt/pg_locale.c:2143 +#: utils/adt/pg_locale.c:2180 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "Serverns LC_CTYPE-lokal är troligen inkompatibel med databasens teckenkodning." +#: utils/adt/pg_lsn.c:263 +#, c-format +msgid "cannot add NaN to pg_lsn" +msgstr "kan inte addera NaN till pg_lsn" + +#: utils/adt/pg_lsn.c:297 +#, c-format +msgid "cannot subtract NaN from pg_lsn" +msgstr "kan inte subtrahera Nan från pg_lsn" + #: utils/adt/pg_upgrade_support.c:29 #, c-format msgid "function can only be called when server is in binary upgrade mode" msgstr "funktionen kan bara anropas när servern är i binärt uppgraderingsläge" -#: utils/adt/pgstatfuncs.c:500 +#: utils/adt/pgstatfuncs.c:482 #, c-format msgid "invalid command name: \"%s\"" msgstr "ogiltigt kommandonamn: \"%s\"" -#: utils/adt/pseudotypes.c:57 utils/adt/pseudotypes.c:91 +#: utils/adt/pgstatfuncs.c:2114 +#, c-format +msgid "unrecognized reset target: \"%s\"" +msgstr "okänt återställningsmål \"%s\"" + +#: utils/adt/pgstatfuncs.c:2115 +#, fuzzy, c-format +#| msgid "Target must be \"archiver\", \"bgwriter\", or \"wal\"." +msgid "Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." +msgstr "Målet måste vara \"archiver\", \"bgwriter\" eller \"all\"." + +#: utils/adt/pgstatfuncs.c:2193 +#, fuzzy, c-format +#| msgid "invalid role OID: %u" +msgid "invalid subscription OID %u" +msgstr "ogiltigt roll-OID: %u" + +#: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 #, c-format msgid "cannot display a value of type %s" msgstr "kan inte visa ett värde av typ %s" -#: utils/adt/pseudotypes.c:283 +#: utils/adt/pseudotypes.c:321 #, c-format msgid "cannot accept a value of a shell type" msgstr "kan inte acceptera ett värde av typen shell" -#: utils/adt/pseudotypes.c:293 +#: utils/adt/pseudotypes.c:331 #, c-format msgid "cannot display a value of a shell type" msgstr "kan inte visa ett värde av typen shell" -#: utils/adt/rangetypes.c:406 +#: utils/adt/rangetypes.c:404 #, c-format msgid "range constructor flags argument must not be null" msgstr "konstruktorflaggargument till range får inte vara null" -#: utils/adt/rangetypes.c:993 +#: utils/adt/rangetypes.c:1003 #, c-format msgid "result of range difference would not be contiguous" msgstr "resultatet av range-skillnad skulle inte vara angränsande" -#: utils/adt/rangetypes.c:1054 +#: utils/adt/rangetypes.c:1064 #, c-format msgid "result of range union would not be contiguous" msgstr "resultatet av range-union skulle inte vara angränsande" -#: utils/adt/rangetypes.c:1600 +#: utils/adt/rangetypes.c:1689 #, c-format msgid "range lower bound must be less than or equal to range upper bound" msgstr "lägre gräns för range måste vara lägre eller lika med övre gräns för range" -#: utils/adt/rangetypes.c:1983 utils/adt/rangetypes.c:1996 -#: utils/adt/rangetypes.c:2010 +#: utils/adt/rangetypes.c:2112 utils/adt/rangetypes.c:2125 +#: utils/adt/rangetypes.c:2139 #, c-format msgid "invalid range bound flags" msgstr "ogiltig gränsflagga för range" -#: utils/adt/rangetypes.c:1984 utils/adt/rangetypes.c:1997 -#: utils/adt/rangetypes.c:2011 +#: utils/adt/rangetypes.c:2113 utils/adt/rangetypes.c:2126 +#: utils/adt/rangetypes.c:2140 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "Giltiga värden är \"[]\", \"[)\", \"(]\" och \"()\"." -#: utils/adt/rangetypes.c:2076 utils/adt/rangetypes.c:2093 -#: utils/adt/rangetypes.c:2106 utils/adt/rangetypes.c:2124 -#: utils/adt/rangetypes.c:2135 utils/adt/rangetypes.c:2179 -#: utils/adt/rangetypes.c:2187 +#: utils/adt/rangetypes.c:2205 utils/adt/rangetypes.c:2222 +#: utils/adt/rangetypes.c:2235 utils/adt/rangetypes.c:2253 +#: utils/adt/rangetypes.c:2264 utils/adt/rangetypes.c:2308 +#: utils/adt/rangetypes.c:2316 #, c-format msgid "malformed range literal: \"%s\"" msgstr "trasig range-litteral: \"%s\"" -#: utils/adt/rangetypes.c:2078 +#: utils/adt/rangetypes.c:2207 #, c-format msgid "Junk after \"empty\" key word." msgstr "Skräp efter nyckelordet \"empty\"." -#: utils/adt/rangetypes.c:2095 +#: utils/adt/rangetypes.c:2224 #, c-format msgid "Missing left parenthesis or bracket." msgstr "Saknar vänster parentes eller hakparentes." -#: utils/adt/rangetypes.c:2108 +#: utils/adt/rangetypes.c:2237 #, c-format msgid "Missing comma after lower bound." msgstr "Saknar komma efter lägre gräns." -#: utils/adt/rangetypes.c:2126 +#: utils/adt/rangetypes.c:2255 #, c-format msgid "Too many commas." msgstr "För många komman." -#: utils/adt/rangetypes.c:2137 +#: utils/adt/rangetypes.c:2266 #, c-format msgid "Junk after right parenthesis or bracket." msgstr "Skräp efter höger parentes eller hakparentes." -#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4493 +#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4532 #, c-format msgid "regular expression failed: %s" msgstr "reguljärt uttryck misslyckades: %s" -#: utils/adt/regexp.c:426 +#: utils/adt/regexp.c:431 utils/adt/regexp.c:666 +#, c-format +msgid "invalid regular expression option: \"%.*s\"" +msgstr "ogiltigt flagga till reguljärt uttryck: \"%.*s\"" + +#: utils/adt/regexp.c:668 #, c-format -msgid "invalid regular expression option: \"%c\"" -msgstr "ogiltigt flagga till reguljärt uttryck: \"%c\"" +msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." +msgstr "" + +#: utils/adt/regexp.c:702 utils/adt/regexp.c:711 utils/adt/regexp.c:1068 +#: utils/adt/regexp.c:1132 utils/adt/regexp.c:1141 utils/adt/regexp.c:1150 +#: utils/adt/regexp.c:1159 utils/adt/regexp.c:1839 utils/adt/regexp.c:1848 +#: utils/adt/regexp.c:1857 utils/misc/guc.c:11758 utils/misc/guc.c:11792 +#, c-format +msgid "invalid value for parameter \"%s\": %d" +msgstr "ogiltigt värde för parameter \"%s\": %d" -#: utils/adt/regexp.c:836 +#: utils/adt/regexp.c:922 #, c-format msgid "SQL regular expression may not contain more than two escape-double-quote separators" msgstr "Regulart uttryck i SQL får inte innehålla mer än två dubbelcitat-escape-separatorer" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:981 utils/adt/regexp.c:1363 utils/adt/regexp.c:1418 +#: utils/adt/regexp.c:1079 utils/adt/regexp.c:1170 utils/adt/regexp.c:1257 +#: utils/adt/regexp.c:1296 utils/adt/regexp.c:1684 utils/adt/regexp.c:1739 +#: utils/adt/regexp.c:1868 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s stöder inte \"global\"-flaggan" -#: utils/adt/regexp.c:983 +#: utils/adt/regexp.c:1298 #, c-format msgid "Use the regexp_matches function instead." msgstr "Använd regexp_matches-funktionen istället." -#: utils/adt/regexp.c:1165 +#: utils/adt/regexp.c:1486 #, c-format msgid "too many regular expression matches" msgstr "för många reguljära uttryck matchar" -#: utils/adt/regproc.c:107 +#: utils/adt/regproc.c:105 #, c-format msgid "more than one function named \"%s\"" msgstr "mer än en funktion med namn %s" -#: utils/adt/regproc.c:525 +#: utils/adt/regproc.c:543 #, c-format msgid "more than one operator named %s" msgstr "mer än en operator med namn %s" -#: utils/adt/regproc.c:697 utils/adt/regproc.c:738 utils/adt/regproc.c:2018 -#: utils/adt/ruleutils.c:9297 utils/adt/ruleutils.c:9466 +#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 +#: utils/adt/ruleutils.c:10054 utils/adt/ruleutils.c:10336 #, c-format msgid "too many arguments" msgstr "för många argument" -#: utils/adt/regproc.c:698 utils/adt/regproc.c:739 +#: utils/adt/regproc.c:716 utils/adt/regproc.c:757 #, c-format msgid "Provide two argument types for operator." msgstr "Ange två argumenttyper för operatorn." -#: utils/adt/regproc.c:1602 utils/adt/regproc.c:1626 utils/adt/regproc.c:1727 -#: utils/adt/regproc.c:1751 utils/adt/regproc.c:1853 utils/adt/regproc.c:1858 -#: utils/adt/varlena.c:3642 utils/adt/varlena.c:3647 +#: utils/adt/regproc.c:1639 utils/adt/regproc.c:1663 utils/adt/regproc.c:1764 +#: utils/adt/regproc.c:1788 utils/adt/regproc.c:1890 utils/adt/regproc.c:1895 +#: utils/adt/varlena.c:3671 utils/adt/varlena.c:3676 #, c-format msgid "invalid name syntax" msgstr "ogiltig namnsyntax" -#: utils/adt/regproc.c:1916 +#: utils/adt/regproc.c:1953 #, c-format msgid "expected a left parenthesis" msgstr "förväntade en vänsterparentes" -#: utils/adt/regproc.c:1932 +#: utils/adt/regproc.c:1969 #, c-format msgid "expected a right parenthesis" msgstr "förväntade en högreparentes" -#: utils/adt/regproc.c:1951 +#: utils/adt/regproc.c:1988 #, c-format msgid "expected a type name" msgstr "förväntade ett typnamn" -#: utils/adt/regproc.c:1983 +#: utils/adt/regproc.c:2020 #, c-format msgid "improper type name" msgstr "olämpligt typnamn" -#: utils/adt/ri_triggers.c:296 utils/adt/ri_triggers.c:1537 -#: utils/adt/ri_triggers.c:2470 +#: utils/adt/ri_triggers.c:307 utils/adt/ri_triggers.c:1611 +#: utils/adt/ri_triggers.c:2598 #, c-format msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" msgstr "insert eller update på tabell \"%s\" bryter mot främmande nyckel-villkoret \"%s\"" -#: utils/adt/ri_triggers.c:299 utils/adt/ri_triggers.c:1540 +#: utils/adt/ri_triggers.c:310 utils/adt/ri_triggers.c:1614 #, c-format msgid "MATCH FULL does not allow mixing of null and nonnull key values." msgstr "MATCH FULL tillåter inte att man blandar null och icke-null-värden." -#: utils/adt/ri_triggers.c:1940 +#: utils/adt/ri_triggers.c:2031 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "funktionen \"%s\" måste köras för INSERT" -#: utils/adt/ri_triggers.c:1946 +#: utils/adt/ri_triggers.c:2037 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "funktionen \"%s\" måste köras för UPDATE" -#: utils/adt/ri_triggers.c:1952 +#: utils/adt/ri_triggers.c:2043 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "funktionen \"%s\" måste köras för DELETE" -#: utils/adt/ri_triggers.c:1975 +#: utils/adt/ri_triggers.c:2066 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "ingen pg_constraint-post för utlösare \"%s\" på tabell \"%s\"" -#: utils/adt/ri_triggers.c:1977 +#: utils/adt/ri_triggers.c:2068 #, c-format msgid "Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT." msgstr "Ta bort denna utlösare för referensiell integritet och dess kollegor, gör sen ALTER TABLE ADD CONSTRAINT." -#: utils/adt/ri_triggers.c:2295 +#: utils/adt/ri_triggers.c:2423 #, c-format msgid "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result" msgstr "referentiell integritetsfråga på \"%s\" från villkor \"%s\" på \"%s\" gav oväntat resultat" -#: utils/adt/ri_triggers.c:2299 +#: utils/adt/ri_triggers.c:2427 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "Detta beror troligen på att en regel har skrivit om frågan." -#: utils/adt/ri_triggers.c:2460 +#: utils/adt/ri_triggers.c:2588 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "borttagning av partition \"%s\" bryter mot främmande nyckel-villkoret \"%s\"" -#: utils/adt/ri_triggers.c:2463 utils/adt/ri_triggers.c:2488 +#: utils/adt/ri_triggers.c:2591 utils/adt/ri_triggers.c:2616 #, c-format msgid "Key (%s)=(%s) is still referenced from table \"%s\"." msgstr "Nyckeln (%s)=(%s) refereras fortfarande till från tabell \"%s\"." -#: utils/adt/ri_triggers.c:2474 +#: utils/adt/ri_triggers.c:2602 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "Nyckel (%s)=(%s) finns inte i tabellen \"%s\"." -#: utils/adt/ri_triggers.c:2477 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key is not present in table \"%s\"." msgstr "Nyckeln finns inte i tabellen \"%s\"." -#: utils/adt/ri_triggers.c:2483 +#: utils/adt/ri_triggers.c:2611 #, c-format msgid "update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"" msgstr "update eller delete på tabell \"%s\" bryter mot främmande nyckel-villkoret \"%s\" för tabell \"%s\"" -#: utils/adt/ri_triggers.c:2491 +#: utils/adt/ri_triggers.c:2619 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "Nyckel refereras fortfarande till från tabell \"%s\"." -#: utils/adt/rowtypes.c:104 utils/adt/rowtypes.c:482 +#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:483 #, c-format msgid "input of anonymous composite types is not implemented" msgstr "inläsning av annonym composite-typ är inte implementerat" -#: utils/adt/rowtypes.c:156 utils/adt/rowtypes.c:185 utils/adt/rowtypes.c:208 -#: utils/adt/rowtypes.c:216 utils/adt/rowtypes.c:268 utils/adt/rowtypes.c:276 +#: utils/adt/rowtypes.c:157 utils/adt/rowtypes.c:186 utils/adt/rowtypes.c:209 +#: utils/adt/rowtypes.c:217 utils/adt/rowtypes.c:269 utils/adt/rowtypes.c:277 #, c-format msgid "malformed record literal: \"%s\"" msgstr "felaktig postliteral: \"%s\"" -#: utils/adt/rowtypes.c:157 +#: utils/adt/rowtypes.c:158 #, c-format msgid "Missing left parenthesis." msgstr "Saknar vänster parentes" -#: utils/adt/rowtypes.c:186 +#: utils/adt/rowtypes.c:187 #, c-format msgid "Too few columns." msgstr "För få kolumner." -#: utils/adt/rowtypes.c:269 +#: utils/adt/rowtypes.c:270 #, c-format msgid "Too many columns." msgstr "För många kolumner." -#: utils/adt/rowtypes.c:277 +#: utils/adt/rowtypes.c:278 #, c-format msgid "Junk after right parenthesis." msgstr "Skräp efter höger parentes" -#: utils/adt/rowtypes.c:531 +#: utils/adt/rowtypes.c:532 #, c-format msgid "wrong number of columns: %d, expected %d" msgstr "fel antal kolumner: %d, förväntade %d" -#: utils/adt/rowtypes.c:559 +#: utils/adt/rowtypes.c:574 #, c-format -msgid "wrong data type: %u, expected %u" -msgstr "fel datatyp: %u, förväntade %u" +msgid "binary data has type %u (%s) instead of expected %u (%s) in record column %d" +msgstr "binär data har typ %u (%s) istället för förväntad %u (%s) i postkolumn %d" -#: utils/adt/rowtypes.c:620 +#: utils/adt/rowtypes.c:641 #, c-format msgid "improper binary format in record column %d" msgstr "felaktigt binärt format i postkolumn %d" -#: utils/adt/rowtypes.c:911 utils/adt/rowtypes.c:1157 utils/adt/rowtypes.c:1415 -#: utils/adt/rowtypes.c:1661 +#: utils/adt/rowtypes.c:932 utils/adt/rowtypes.c:1178 utils/adt/rowtypes.c:1436 +#: utils/adt/rowtypes.c:1682 #, c-format msgid "cannot compare dissimilar column types %s and %s at record column %d" msgstr "kan inte jämföra olika kolumntyper %s och %s vid postkolumn %d" -#: utils/adt/rowtypes.c:1002 utils/adt/rowtypes.c:1227 -#: utils/adt/rowtypes.c:1512 utils/adt/rowtypes.c:1697 +#: utils/adt/rowtypes.c:1023 utils/adt/rowtypes.c:1248 +#: utils/adt/rowtypes.c:1533 utils/adt/rowtypes.c:1718 #, c-format msgid "cannot compare record types with different numbers of columns" msgstr "kan inte jämföra record-typer med olika antal kolumner" -#: utils/adt/ruleutils.c:4821 +#: utils/adt/ruleutils.c:2710 +#, fuzzy, c-format +#| msgid "cannot use subquery in index expression" +msgid "input is a query, not an expression" +msgstr "kan inte använda subfråga i indexuttryck" + +#: utils/adt/ruleutils.c:2722 +#, fuzzy, c-format +#| msgid "USING expression contains a whole-row table reference." +msgid "expression contains variables of more than one relation" +msgstr "USING-uttryck innehåller en hela-raden-tabellreferens." + +#: utils/adt/ruleutils.c:2729 +#, fuzzy, c-format +#| msgid "argument of %s must not contain variables" +msgid "expression contains variables" +msgstr "argumentet till %s får inte innehålla variabler" + +#: utils/adt/ruleutils.c:5228 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "regel \"%s\" har en icke stödd händelsetyp %d" -#: utils/adt/timestamp.c:107 +#: utils/adt/timestamp.c:110 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "prceision för TIMESTAMP(%d)%s kan inte vara negativ" -#: utils/adt/timestamp.c:113 +#: utils/adt/timestamp.c:116 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "precision för TIMESTAMP(%d)%s reducerad till högsta tillåtna, %d" -#: utils/adt/timestamp.c:176 utils/adt/timestamp.c:434 utils/misc/guc.c:11929 +#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12782 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestamp utanför giltigt intervall: \"%s\"" -#: utils/adt/timestamp.c:372 +#: utils/adt/timestamp.c:375 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "timestamp(%d)-precision måste vara mellan %d och %d" -#: utils/adt/timestamp.c:496 +#: utils/adt/timestamp.c:499 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "Numeriska tidszoner måste ha \"-\" eller \"+\" som sitt första tecken." -#: utils/adt/timestamp.c:509 +#: utils/adt/timestamp.c:512 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "numerisk tidszon \"%s\" utanför giltigt intervall" -#: utils/adt/timestamp.c:601 utils/adt/timestamp.c:611 -#: utils/adt/timestamp.c:619 +#: utils/adt/timestamp.c:608 utils/adt/timestamp.c:618 +#: utils/adt/timestamp.c:626 #, c-format msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" msgstr "timestamp utanför giltigt intervall: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:720 +#: utils/adt/timestamp.c:727 #, c-format msgid "timestamp cannot be NaN" msgstr "timestamp kan inte vara NaN" -#: utils/adt/timestamp.c:738 utils/adt/timestamp.c:750 +#: utils/adt/timestamp.c:745 utils/adt/timestamp.c:757 #, c-format msgid "timestamp out of range: \"%g\"" msgstr "timestamp utanför giltigt intervall: \"%g\"" -#: utils/adt/timestamp.c:935 utils/adt/timestamp.c:1509 -#: utils/adt/timestamp.c:1944 utils/adt/timestamp.c:3021 -#: utils/adt/timestamp.c:3026 utils/adt/timestamp.c:3031 -#: utils/adt/timestamp.c:3081 utils/adt/timestamp.c:3088 -#: utils/adt/timestamp.c:3095 utils/adt/timestamp.c:3115 -#: utils/adt/timestamp.c:3122 utils/adt/timestamp.c:3129 -#: utils/adt/timestamp.c:3159 utils/adt/timestamp.c:3167 -#: utils/adt/timestamp.c:3211 utils/adt/timestamp.c:3638 -#: utils/adt/timestamp.c:3763 utils/adt/timestamp.c:4223 -#, c-format -msgid "interval out of range" -msgstr "interval utanför giltigt intervall" - #: utils/adt/timestamp.c:1062 utils/adt/timestamp.c:1095 #, c-format msgid "invalid INTERVAL type modifier" @@ -23743,50 +25831,32 @@ msgstr "INTERVAL(%d)-precision reducerad till maximalt tillåtna, %d" msgid "interval(%d) precision must be between %d and %d" msgstr "interval(%d)-precision måste vara mellan %d och %d" -#: utils/adt/timestamp.c:2622 +#: utils/adt/timestamp.c:2689 #, c-format msgid "cannot subtract infinite timestamps" msgstr "kan inte subtrahera oändliga tider (timestamp)" -#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:4484 -#: utils/adt/timestamp.c:4646 utils/adt/timestamp.c:4667 -#, c-format -msgid "timestamp units \"%s\" not supported" -msgstr "timestamp-enhet \"%s\" stöds inte" - -#: utils/adt/timestamp.c:3905 utils/adt/timestamp.c:4438 -#: utils/adt/timestamp.c:4677 +#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:4074 #, c-format -msgid "timestamp units \"%s\" not recognized" -msgstr "timestamp-enhet \"%s\" känns inte igen" +msgid "origin out of range" +msgstr "origin utanför giltigt intervall" -#: utils/adt/timestamp.c:4035 utils/adt/timestamp.c:4479 -#: utils/adt/timestamp.c:4842 utils/adt/timestamp.c:4864 +#: utils/adt/timestamp.c:3896 utils/adt/timestamp.c:4079 #, c-format -msgid "timestamp with time zone units \"%s\" not supported" -msgstr "timestamp with time zone, enhet \"%s\" stöds inte" +msgid "timestamps cannot be binned into intervals containing months or years" +msgstr "timestamps kan inte injusteras in i intervall som innehåller månader eller år" -#: utils/adt/timestamp.c:4052 utils/adt/timestamp.c:4433 -#: utils/adt/timestamp.c:4873 +#: utils/adt/timestamp.c:3903 utils/adt/timestamp.c:4086 #, c-format -msgid "timestamp with time zone units \"%s\" not recognized" -msgstr "timestamp with time zone, enhet \"%s\" känns inte igen" +msgid "stride must be greater than zero" +msgstr "\"stride\" måste vara större än noll" -#: utils/adt/timestamp.c:4210 -#, c-format -msgid "interval units \"%s\" not supported because months usually have fractional weeks" +#: utils/adt/timestamp.c:4399 +#, fuzzy, c-format +#| msgid "interval units \"%s\" not supported because months usually have fractional weeks" +msgid "Months usually have fractional weeks." msgstr "intervallenhet \"%s\" stöds inte då månader typiskt har veckor på bråkform" -#: utils/adt/timestamp.c:4216 utils/adt/timestamp.c:4967 -#, c-format -msgid "interval units \"%s\" not supported" -msgstr "intervallenhet \"%s\" stöds inte" - -#: utils/adt/timestamp.c:4232 utils/adt/timestamp.c:4990 -#, c-format -msgid "interval units \"%s\" not recognized" -msgstr "intervallenhet \"%s\" känns inte igen" - #: utils/adt/trigfuncs.c:42 #, c-format msgid "suppress_redundant_updates_trigger: must be called as trigger" @@ -23812,43 +25882,43 @@ msgstr "suppress_redundant_updates_trigger: måste anropas för varje rad" msgid "gtsvector_in not implemented" msgstr "gtsvector_in är inte implementerad" -#: utils/adt/tsquery.c:200 +#: utils/adt/tsquery.c:199 utils/adt/tsquery_op.c:124 #, c-format -msgid "distance in phrase operator should not be greater than %d" -msgstr "distans i frasoperator skall inte vara större än %d" +msgid "distance in phrase operator must be an integer value between zero and %d inclusive" +msgstr "distans i frasoperator måste vara ett heltalsvärde mellan noll och %d, inklusive" -#: utils/adt/tsquery.c:310 utils/adt/tsquery.c:725 +#: utils/adt/tsquery.c:306 utils/adt/tsquery.c:691 #: utils/adt/tsvector_parser.c:133 #, c-format msgid "syntax error in tsquery: \"%s\"" msgstr "syntaxfel i tsquery: \"%s\"" -#: utils/adt/tsquery.c:334 +#: utils/adt/tsquery.c:330 #, c-format msgid "no operand in tsquery: \"%s\"" msgstr "ingen operand i tsquery: \"%s\"" -#: utils/adt/tsquery.c:568 +#: utils/adt/tsquery.c:534 #, c-format msgid "value is too big in tsquery: \"%s\"" msgstr "värdet är för stort i tsquery: \"%s\"" -#: utils/adt/tsquery.c:573 +#: utils/adt/tsquery.c:539 #, c-format msgid "operand is too long in tsquery: \"%s\"" msgstr "operanden är för lång i tsquery: \"%s\"" -#: utils/adt/tsquery.c:601 +#: utils/adt/tsquery.c:567 #, c-format msgid "word is too long in tsquery: \"%s\"" msgstr "ord för långt i tsquery: \"%s\"" -#: utils/adt/tsquery.c:870 +#: utils/adt/tsquery.c:835 #, c-format msgid "text-search query doesn't contain lexemes: \"%s\"" msgstr "textsökfråga innehåller inte lexem: \"%s\"" -#: utils/adt/tsquery.c:881 utils/adt/tsquery_util.c:375 +#: utils/adt/tsquery.c:846 utils/adt/tsquery_util.c:375 #, c-format msgid "tsquery is too large" msgstr "tsquery är för stor" @@ -23858,11 +25928,6 @@ msgstr "tsquery är för stor" msgid "text-search query contains only stop words or doesn't contain lexemes, ignored" msgstr "textsökfråga innehåller bara stoppord eller innehåller inga lexem, hoppar över" -#: utils/adt/tsquery_op.c:124 -#, c-format -msgid "distance in phrase operator should be non-negative and less than %d" -msgstr "distans i frasoperator skall vara icke-negativ och mindre än %d" - #: utils/adt/tsquery_rewrite.c:321 #, c-format msgid "ts_rewrite query must return two tsquery columns" @@ -23883,7 +25948,7 @@ msgstr "array med vikter är för kort" msgid "array of weight must not contain nulls" msgstr "array med vikter får inte innehålla null-värden" -#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:872 +#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:871 #, c-format msgid "weight out of range" msgstr "vikten är utanför giltigt intervall" @@ -23898,58 +25963,63 @@ msgstr "ordet är för långt (%ld byte, max %ld byte)" msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "strängen är för lång för tsvector (%ld byte, max %ld byte)" -#: utils/adt/tsvector_op.c:328 utils/adt/tsvector_op.c:608 -#: utils/adt/tsvector_op.c:770 +#: utils/adt/tsvector_op.c:771 #, c-format msgid "lexeme array may not contain nulls" msgstr "lexem-array:en får inte innehålla null-värden" -#: utils/adt/tsvector_op.c:840 +#: utils/adt/tsvector_op.c:776 +#, fuzzy, c-format +#| msgid "lexeme array may not contain nulls" +msgid "lexeme array may not contain empty strings" +msgstr "lexem-array:en får inte innehålla null-värden" + +#: utils/adt/tsvector_op.c:846 #, c-format msgid "weight array may not contain nulls" msgstr "vikt-array:en får inte innehålla null-värden" -#: utils/adt/tsvector_op.c:864 +#: utils/adt/tsvector_op.c:870 #, c-format msgid "unrecognized weight: \"%c\"" msgstr "okänd vikt: \"%c\"" -#: utils/adt/tsvector_op.c:2414 +#: utils/adt/tsvector_op.c:2431 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "ts_stat-frågan måste returnera en tsvector-kolumn" -#: utils/adt/tsvector_op.c:2603 +#: utils/adt/tsvector_op.c:2620 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "tsvector-kolumnen \"%s\" existerar inte" -#: utils/adt/tsvector_op.c:2610 +#: utils/adt/tsvector_op.c:2627 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "kolumnen \"%s\" är inte av typen tsvector" -#: utils/adt/tsvector_op.c:2622 +#: utils/adt/tsvector_op.c:2639 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "konfigurationskolumnen \"%s\" existerar inte" -#: utils/adt/tsvector_op.c:2628 +#: utils/adt/tsvector_op.c:2645 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "kolumn \"%s\" har inte regconfig-typ" -#: utils/adt/tsvector_op.c:2635 +#: utils/adt/tsvector_op.c:2652 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "konfigurationskolumn \"%s\" får inte vara null" -#: utils/adt/tsvector_op.c:2648 +#: utils/adt/tsvector_op.c:2665 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "Textsökkonfigurationsnamn \"%s\" måste vara angivet med schema" -#: utils/adt/tsvector_op.c:2673 +#: utils/adt/tsvector_op.c:2690 #, c-format msgid "column \"%s\" is not of a character type" msgstr "kolumnen \"%s\" är inte av typen character" @@ -23969,79 +26039,79 @@ msgstr "det finns inget escape-tecken: \"%s\"" msgid "wrong position info in tsvector: \"%s\"" msgstr "fel positionsinfo i tsvector: \"%s\"" -#: utils/adt/uuid.c:428 +#: utils/adt/uuid.c:413 #, c-format msgid "could not generate random values" msgstr "kunde inte generera slumpmässiga värden" -#: utils/adt/varbit.c:109 utils/adt/varchar.c:53 +#: utils/adt/varbit.c:110 utils/adt/varchar.c:53 #, c-format msgid "length for type %s must be at least 1" msgstr "längden för typ %s måste vara minst 1" -#: utils/adt/varbit.c:114 utils/adt/varchar.c:57 +#: utils/adt/varbit.c:115 utils/adt/varchar.c:57 #, c-format msgid "length for type %s cannot exceed %d" msgstr "längden för typ %s kan inte överstiga %d" -#: utils/adt/varbit.c:197 utils/adt/varbit.c:498 utils/adt/varbit.c:993 +#: utils/adt/varbit.c:198 utils/adt/varbit.c:499 utils/adt/varbit.c:994 #, c-format msgid "bit string length exceeds the maximum allowed (%d)" msgstr "bitstränglängden överskrider det maximalt tillåtna (%d)" -#: utils/adt/varbit.c:211 utils/adt/varbit.c:355 utils/adt/varbit.c:405 +#: utils/adt/varbit.c:212 utils/adt/varbit.c:356 utils/adt/varbit.c:406 #, c-format msgid "bit string length %d does not match type bit(%d)" msgstr "bitsträngslängden %d matchar inte typen bit(%d)" -#: utils/adt/varbit.c:233 utils/adt/varbit.c:534 +#: utils/adt/varbit.c:234 utils/adt/varbit.c:535 #, c-format -msgid "\"%c\" is not a valid binary digit" -msgstr "\"%c\" är inte en giltig binär siffra" +msgid "\"%.*s\" is not a valid binary digit" +msgstr "\"%.*s\" är inte en giltig binär siffra" -#: utils/adt/varbit.c:258 utils/adt/varbit.c:559 +#: utils/adt/varbit.c:259 utils/adt/varbit.c:560 #, c-format -msgid "\"%c\" is not a valid hexadecimal digit" -msgstr "\"%c\" är inte en giltig hexdecimal siffra" +msgid "\"%.*s\" is not a valid hexadecimal digit" +msgstr "\"%.*s\" är inte en giltig hexdecimal siffra" -#: utils/adt/varbit.c:346 utils/adt/varbit.c:651 +#: utils/adt/varbit.c:347 utils/adt/varbit.c:652 #, c-format msgid "invalid length in external bit string" msgstr "ogiltig längd på extern bitsträng" -#: utils/adt/varbit.c:512 utils/adt/varbit.c:660 utils/adt/varbit.c:756 +#: utils/adt/varbit.c:513 utils/adt/varbit.c:661 utils/adt/varbit.c:757 #, c-format msgid "bit string too long for type bit varying(%d)" msgstr "bitsträngen för lång för typen bit varying(%d)" -#: utils/adt/varbit.c:1086 utils/adt/varbit.c:1184 utils/adt/varlena.c:875 -#: utils/adt/varlena.c:939 utils/adt/varlena.c:1083 utils/adt/varlena.c:3306 -#: utils/adt/varlena.c:3373 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:889 +#: utils/adt/varlena.c:952 utils/adt/varlena.c:1109 utils/adt/varlena.c:3313 +#: utils/adt/varlena.c:3391 #, c-format msgid "negative substring length not allowed" msgstr "negativ substräng-läng tillåts inte" -#: utils/adt/varbit.c:1241 +#: utils/adt/varbit.c:1261 #, c-format msgid "cannot AND bit strings of different sizes" msgstr "kan inte AND:a bitsträngar av olika storlek" -#: utils/adt/varbit.c:1282 +#: utils/adt/varbit.c:1302 #, c-format msgid "cannot OR bit strings of different sizes" msgstr "kan inte OR:a bitsträngar av olika storlek" -#: utils/adt/varbit.c:1322 +#: utils/adt/varbit.c:1342 #, c-format msgid "cannot XOR bit strings of different sizes" msgstr "kan inte XOR:a bitsträngar av olika storlek" -#: utils/adt/varbit.c:1804 utils/adt/varbit.c:1862 +#: utils/adt/varbit.c:1824 utils/adt/varbit.c:1882 #, c-format msgid "bit index %d out of valid range (0..%d)" msgstr "bitindex %d utanför giltigt intervall (0..%d)" -#: utils/adt/varbit.c:1813 utils/adt/varlena.c:3566 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3595 #, c-format msgid "new bit must be 0 or 1" msgstr "nya biten måste vara 0 eller 1" @@ -24056,117 +26126,128 @@ msgstr "värdet för långt för typen character (%d)" msgid "value too long for type character varying(%d)" msgstr "värdet för långt för typen character varying(%d)" -#: utils/adt/varchar.c:732 utils/adt/varlena.c:1475 +#: utils/adt/varchar.c:732 utils/adt/varlena.c:1498 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "kunde inte bestämma vilken jämförelse (collation) som skall användas för strängjämförelse" -#: utils/adt/varlena.c:1182 utils/adt/varlena.c:1915 +#: utils/adt/varlena.c:1208 utils/adt/varlena.c:1947 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "ickedeterministiska jämförelser (collation) stöds inte för substrängsökningar" -#: utils/adt/varlena.c:1574 utils/adt/varlena.c:1587 +#: utils/adt/varlena.c:1596 utils/adt/varlena.c:1609 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "kunde inte konvertera sträng till UTF-16: felkod %lu" -#: utils/adt/varlena.c:1602 +#: utils/adt/varlena.c:1624 #, c-format msgid "could not compare Unicode strings: %m" msgstr "kunde inte jämföra Unicode-strängar: %m" -#: utils/adt/varlena.c:1653 utils/adt/varlena.c:2367 +#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2398 #, c-format msgid "collation failed: %s" msgstr "jämförelse misslyckades: %s" -#: utils/adt/varlena.c:2575 +#: utils/adt/varlena.c:2585 #, c-format msgid "sort key generation failed: %s" msgstr "generering av sorteringsnyckel misslyckades: %s" -#: utils/adt/varlena.c:3450 utils/adt/varlena.c:3517 +#: utils/adt/varlena.c:3479 utils/adt/varlena.c:3546 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "index %d utanför giltigt intervall, 0..%d" -#: utils/adt/varlena.c:3481 utils/adt/varlena.c:3553 +#: utils/adt/varlena.c:3510 utils/adt/varlena.c:3582 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "index %lld utanför giltigt intervall, 0..%lld" -#: utils/adt/varlena.c:4590 +#: utils/adt/varlena.c:4644 #, c-format -msgid "field position must be greater than zero" -msgstr "fältpositionen måste vara större än noll" +msgid "field position must not be zero" +msgstr "fältpositionen får inte vara noll" -#: utils/adt/varlena.c:5456 +#: utils/adt/varlena.c:5664 #, c-format msgid "unterminated format() type specifier" msgstr "icketerminerad typangivelse för format()" -#: utils/adt/varlena.c:5457 utils/adt/varlena.c:5591 utils/adt/varlena.c:5712 +#: utils/adt/varlena.c:5665 utils/adt/varlena.c:5799 utils/adt/varlena.c:5920 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "För ett ensamt \"%%\" använd \"%%%%\"." -#: utils/adt/varlena.c:5589 utils/adt/varlena.c:5710 +#: utils/adt/varlena.c:5797 utils/adt/varlena.c:5918 #, c-format -msgid "unrecognized format() type specifier \"%c\"" -msgstr "okänd typspecifierare \"%c\" för format()" +msgid "unrecognized format() type specifier \"%.*s\"" +msgstr "okänd typspecifierare \"%.*s\" för format()" -#: utils/adt/varlena.c:5602 utils/adt/varlena.c:5659 +#: utils/adt/varlena.c:5810 utils/adt/varlena.c:5867 #, c-format msgid "too few arguments for format()" msgstr "för få argument till format()" -#: utils/adt/varlena.c:5755 utils/adt/varlena.c:5937 +#: utils/adt/varlena.c:5963 utils/adt/varlena.c:6145 #, c-format msgid "number is out of range" msgstr "numret är utanför giltigt intervall" -#: utils/adt/varlena.c:5818 utils/adt/varlena.c:5846 +#: utils/adt/varlena.c:6026 utils/adt/varlena.c:6054 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "formatet anger argument 0 men argumenten är numrerade från 1" -#: utils/adt/varlena.c:5839 +#: utils/adt/varlena.c:6047 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "argumentposition för bredd måste avslutas med \"$\"" -#: utils/adt/varlena.c:5884 +#: utils/adt/varlena.c:6092 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "null-värden kan inte formatteras som SQL-identifierare" -#: utils/adt/varlena.c:6010 +#: utils/adt/varlena.c:6218 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "Unicode-normalisering kan bara utföras om server-kodningen är UTF8" -#: utils/adt/varlena.c:6023 +#: utils/adt/varlena.c:6231 +#, c-format +msgid "invalid normalization form: %s" +msgstr "ogiltigt normaliseringsform: %s" + +#: utils/adt/varlena.c:6434 utils/adt/varlena.c:6469 utils/adt/varlena.c:6504 +#, c-format +msgid "invalid Unicode code point: %04X" +msgstr "ogiltig Unicode-kodpunkt: %04X" + +#: utils/adt/varlena.c:6534 #, c-format -msgid "invalid normalization form: %s" -msgstr "ogiltigt normaliseringsform: %s" +msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." +msgstr "Unicode-escapesekvenser måste vara \\XXXX, \\+XXXXXX, \\UXXXX eller \\UXXXXXXXX." -#: utils/adt/windowfuncs.c:243 +#: utils/adt/windowfuncs.c:306 #, c-format msgid "argument of ntile must be greater than zero" msgstr "argumentet till ntile måste vara större än noll" -#: utils/adt/windowfuncs.c:465 +#: utils/adt/windowfuncs.c:528 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "argumentet till nth_value måste vara större än noll" #: utils/adt/xid8funcs.c:116 -#, c-format -msgid "transaction ID %s is in the future" +#, fuzzy, c-format +#| msgid "transaction ID %s is in the future" +msgid "transaction ID %llu is in the future" msgstr "transaktions-ID %s är från framtiden" -#: utils/adt/xid8funcs.c:547 +#: utils/adt/xid8funcs.c:546 #, c-format msgid "invalid external pg_snapshot data" msgstr "ogiltig extern pg_snapshot-data" @@ -24181,172 +26262,168 @@ msgstr "ej stödd XML-finess" msgid "This functionality requires the server to be built with libxml support." msgstr "Denna funktionalitet kräver att servern byggts med libxml-support." -#: utils/adt/xml.c:224 -#, c-format -msgid "You need to rebuild PostgreSQL using --with-libxml." -msgstr "Du behöver bygga om PostgreSQL med flaggan --with-libxml." - -#: utils/adt/xml.c:243 utils/mb/mbutils.c:570 +#: utils/adt/xml.c:242 utils/mb/mbutils.c:627 #, c-format msgid "invalid encoding name \"%s\"" msgstr "ogiltigt kodningsnamn \"%s\"" -#: utils/adt/xml.c:486 utils/adt/xml.c:491 +#: utils/adt/xml.c:485 utils/adt/xml.c:490 #, c-format msgid "invalid XML comment" msgstr "ogiltigt XML-kommentar" -#: utils/adt/xml.c:620 +#: utils/adt/xml.c:619 #, c-format msgid "not an XML document" msgstr "inget XML-dokument" -#: utils/adt/xml.c:779 utils/adt/xml.c:802 +#: utils/adt/xml.c:778 utils/adt/xml.c:801 #, c-format msgid "invalid XML processing instruction" msgstr "ogiltig XML-processinstruktion" -#: utils/adt/xml.c:780 +#: utils/adt/xml.c:779 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "XML-processinstruktions målnamn kan inte vara \"%s\"." -#: utils/adt/xml.c:803 +#: utils/adt/xml.c:802 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML-processinstruktion kan inte innehålla \"?>\"." -#: utils/adt/xml.c:882 +#: utils/adt/xml.c:881 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidate är inte implementerat" -#: utils/adt/xml.c:961 +#: utils/adt/xml.c:960 #, c-format msgid "could not initialize XML library" msgstr "kunde inte initiera XML-bibliotek" -#: utils/adt/xml.c:962 -#, c-format -msgid "libxml2 has incompatible char type: sizeof(char)=%u, sizeof(xmlChar)=%u." +#: utils/adt/xml.c:961 +#, fuzzy, c-format +#| msgid "libxml2 has incompatible char type: sizeof(char)=%u, sizeof(xmlChar)=%u." +msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." msgstr "libxml2 har inkompatibel char-typ: sizeof(char)=%u, sizeof(xmlChar)=%u." -#: utils/adt/xml.c:1048 +#: utils/adt/xml.c:1047 #, c-format msgid "could not set up XML error handler" msgstr "kunde inte ställa in XML-felhanterare" -#: utils/adt/xml.c:1049 +#: utils/adt/xml.c:1048 #, c-format msgid "This probably indicates that the version of libxml2 being used is not compatible with the libxml2 header files that PostgreSQL was built with." msgstr "Detta tyder på att libxml2-versionen som används inte är kompatibel med libxml2-header-filerna som PostgreSQL byggts med." -#: utils/adt/xml.c:1936 +#: utils/adt/xml.c:1935 msgid "Invalid character value." msgstr "Ogiltigt teckenvärde." -#: utils/adt/xml.c:1939 +#: utils/adt/xml.c:1938 msgid "Space required." msgstr "Mellanslag krävs." -#: utils/adt/xml.c:1942 +#: utils/adt/xml.c:1941 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone tillåter bara 'yes' eller 'no'." -#: utils/adt/xml.c:1945 +#: utils/adt/xml.c:1944 msgid "Malformed declaration: missing version." msgstr "Felaktig deklaration: saknar version." -#: utils/adt/xml.c:1948 +#: utils/adt/xml.c:1947 msgid "Missing encoding in text declaration." msgstr "Saknar kodning i textdeklaration." -#: utils/adt/xml.c:1951 +#: utils/adt/xml.c:1950 msgid "Parsing XML declaration: '?>' expected." msgstr "Parsar XML-deklaration: förväntade sig '?>'" -#: utils/adt/xml.c:1954 +#: utils/adt/xml.c:1953 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Okänd libxml-felkod: %d." -#: utils/adt/xml.c:2211 +#: utils/adt/xml.c:2210 #, c-format msgid "XML does not support infinite date values." msgstr "XML stöder inte oändliga datumvärden." -#: utils/adt/xml.c:2233 utils/adt/xml.c:2260 +#: utils/adt/xml.c:2232 utils/adt/xml.c:2259 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML stöder inte oändliga timestamp-värden." -#: utils/adt/xml.c:2676 +#: utils/adt/xml.c:2675 #, c-format msgid "invalid query" msgstr "ogiltig fråga" -#: utils/adt/xml.c:4016 +#: utils/adt/xml.c:4015 #, c-format msgid "invalid array for XML namespace mapping" msgstr "ogiltig array till XML-namnrymdmappning" -#: utils/adt/xml.c:4017 +#: utils/adt/xml.c:4016 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "Arrayen måste vara tvådimensionell där längden på andra axeln är 2." -#: utils/adt/xml.c:4041 +#: utils/adt/xml.c:4040 #, c-format msgid "empty XPath expression" msgstr "tomt XPath-uttryck" -#: utils/adt/xml.c:4093 +#: utils/adt/xml.c:4092 #, c-format msgid "neither namespace name nor URI may be null" msgstr "varken namnrymdnamn eller URI får vara null" -#: utils/adt/xml.c:4100 +#: utils/adt/xml.c:4099 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "kunde inte registrera XML-namnrymd med namn \"%s\" och URL \"%s\"" -#: utils/adt/xml.c:4451 +#: utils/adt/xml.c:4450 #, c-format msgid "DEFAULT namespace is not supported" msgstr "namnrymden DEFAULT stöds inte" -#: utils/adt/xml.c:4480 +#: utils/adt/xml.c:4479 #, c-format msgid "row path filter must not be empty string" msgstr "sökvägsfilter för rad får inte vara tomma strängen" -#: utils/adt/xml.c:4511 +#: utils/adt/xml.c:4510 #, c-format msgid "column path filter must not be empty string" msgstr "sokvägsfilter för kolumn får inte vara tomma strängen" -#: utils/adt/xml.c:4661 +#: utils/adt/xml.c:4654 #, c-format msgid "more than one value returned by column XPath expression" msgstr "mer än ett värde returnerades från kolumns XPath-uttryck" -#: utils/cache/lsyscache.c:1015 +#: utils/cache/lsyscache.c:1042 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "typomvandling från typ %s till typ %s finns inte" -#: utils/cache/lsyscache.c:2764 utils/cache/lsyscache.c:2797 -#: utils/cache/lsyscache.c:2830 utils/cache/lsyscache.c:2863 +#: utils/cache/lsyscache.c:2844 utils/cache/lsyscache.c:2877 +#: utils/cache/lsyscache.c:2910 utils/cache/lsyscache.c:2943 #, c-format msgid "type %s is only a shell" msgstr "typ %s är bara en shell-typ" -#: utils/cache/lsyscache.c:2769 +#: utils/cache/lsyscache.c:2849 #, c-format msgid "no input function available for type %s" msgstr "ingen inläsningsfunktion finns för typ %s" -#: utils/cache/lsyscache.c:2802 +#: utils/cache/lsyscache.c:2882 #, c-format msgid "no output function available for type %s" msgstr "ingen utmatningsfunktion finns för typ %s" @@ -24356,152 +26433,151 @@ msgstr "ingen utmatningsfunktion finns för typ %s" msgid "operator class \"%s\" of access method %s is missing support function %d for type %s" msgstr "operatorklass \"%s\" för accessmetod %s saknar supportfunktion %d för typ %s" -#: utils/cache/plancache.c:718 +#: utils/cache/plancache.c:720 #, c-format msgid "cached plan must not change result type" msgstr "cache:ad plan får inte ändra resultattyp" -#: utils/cache/relcache.c:6078 +#: utils/cache/relcache.c:6402 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "kunde inte skapa initieringsfil \"%s\" för relations-cache: %m" -#: utils/cache/relcache.c:6080 +#: utils/cache/relcache.c:6404 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Fortsätter ändå, trots att något är fel." -#: utils/cache/relcache.c:6402 +#: utils/cache/relcache.c:6726 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "kunde inte ta bort cache-fil \"%s\": %m" -#: utils/cache/relmapper.c:531 +#: utils/cache/relmapper.c:590 #, c-format msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "kan inte göra PREPARE på en transaktion som ändrat relationsmappningen" -#: utils/cache/relmapper.c:761 +#: utils/cache/relmapper.c:836 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "relationsmappningsfilen \"%s\" innehåller ogiltig data" -#: utils/cache/relmapper.c:771 +#: utils/cache/relmapper.c:846 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "relationsmappningsfilen \"%s\" innehåller en felaktig checksumma" -#: utils/cache/typcache.c:1692 utils/fmgr/funcapi.c:461 +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:532 #, c-format msgid "record type has not been registered" msgstr "posttypen har inte registrerats" -#: utils/error/assert.c:37 +#: utils/error/assert.c:39 #, c-format -msgid "TRAP: ExceptionalCondition: bad arguments\n" -msgstr "TRAP: ExceptionalCondition: fel argument\n" +msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" +msgstr "TRAP: ExceptionalCondition: fel argument i PID %d\n" -#: utils/error/assert.c:40 +#: utils/error/assert.c:42 #, c-format -msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d)\n" -msgstr "TRAP: %s(\"%s\", Fil: \"%s\", Rad: %d)\n" +msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" +msgstr "TRAP: %s(\"%s\", Fil: \"%s\", Rad: %d, PID: %d)\n" -#: utils/error/elog.c:322 +#: utils/error/elog.c:404 #, c-format msgid "error occurred before error message processing is available\n" msgstr "fel uppstod innan processning av felmeddelande är tillgängligt\n" -#: utils/error/elog.c:1868 +#: utils/error/elog.c:1943 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "kunde inte återöppna filen \"%s\" som stderr: %m" -#: utils/error/elog.c:1881 +#: utils/error/elog.c:1956 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "kunde inte återöppna filen \"%s\" som stdout: %m" -#: utils/error/elog.c:2373 utils/error/elog.c:2407 utils/error/elog.c:2423 +#: utils/error/elog.c:2521 utils/error/elog.c:2548 utils/error/elog.c:2564 msgid "[unknown]" msgstr "[okänd]" -#: utils/error/elog.c:2893 utils/error/elog.c:3203 utils/error/elog.c:3311 +#: utils/error/elog.c:2837 utils/error/elog.c:3158 utils/error/elog.c:3265 msgid "missing error text" msgstr "saknar feltext" -#: utils/error/elog.c:2896 utils/error/elog.c:2899 utils/error/elog.c:3314 -#: utils/error/elog.c:3317 +#: utils/error/elog.c:2840 utils/error/elog.c:2843 #, c-format msgid " at character %d" msgstr " vid tecken %d" -#: utils/error/elog.c:2909 utils/error/elog.c:2916 +#: utils/error/elog.c:2853 utils/error/elog.c:2860 msgid "DETAIL: " msgstr "DETALJ: " -#: utils/error/elog.c:2923 +#: utils/error/elog.c:2867 msgid "HINT: " msgstr "TIPS: " -#: utils/error/elog.c:2930 +#: utils/error/elog.c:2874 msgid "QUERY: " msgstr "FRÅGA: " -#: utils/error/elog.c:2937 +#: utils/error/elog.c:2881 msgid "CONTEXT: " msgstr "KONTEXT: " -#: utils/error/elog.c:2947 +#: utils/error/elog.c:2891 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "PLATS: %s, %s:%d\n" -#: utils/error/elog.c:2954 +#: utils/error/elog.c:2898 #, c-format msgid "LOCATION: %s:%d\n" msgstr "PLATS: %s:%d\n" -#: utils/error/elog.c:2961 +#: utils/error/elog.c:2905 msgid "BACKTRACE: " msgstr "BACKTRACE: " -#: utils/error/elog.c:2975 +#: utils/error/elog.c:2917 msgid "STATEMENT: " msgstr "SATS: " -#: utils/error/elog.c:3364 +#: utils/error/elog.c:3310 msgid "DEBUG" msgstr "DEBUG" -#: utils/error/elog.c:3368 +#: utils/error/elog.c:3314 msgid "LOG" msgstr "LOGG" -#: utils/error/elog.c:3371 +#: utils/error/elog.c:3317 msgid "INFO" msgstr "INFO" -#: utils/error/elog.c:3374 +#: utils/error/elog.c:3320 msgid "NOTICE" msgstr "NOTIS" -#: utils/error/elog.c:3377 +#: utils/error/elog.c:3324 msgid "WARNING" msgstr "VARNING" -#: utils/error/elog.c:3380 +#: utils/error/elog.c:3327 msgid "ERROR" msgstr "FEL" -#: utils/error/elog.c:3383 +#: utils/error/elog.c:3330 msgid "FATAL" msgstr "FATALT" -#: utils/error/elog.c:3386 +#: utils/error/elog.c:3333 msgid "PANIC" msgstr "PANIK" -#: utils/fmgr/dfmgr.c:130 +#: utils/fmgr/dfmgr.c:128 #, c-format msgid "could not find function \"%s\" in file \"%s\"" msgstr "kunde inte hitta funktionen \"%s\" i filen \"%s\"" @@ -24531,51 +26607,63 @@ msgstr "inkompatibelt bibliotek \"%s\": versionen stämmer inte" msgid "Server is version %d, library is version %s." msgstr "Servern är version %d, biblioteket är version %s." -#: utils/fmgr/dfmgr.c:346 +#: utils/fmgr/dfmgr.c:341 +#, fuzzy, c-format +#| msgid "incompatible library \"%s\": version mismatch" +msgid "incompatible library \"%s\": ABI mismatch" +msgstr "inkompatibelt bibliotek \"%s\": versionen stämmer inte" + +#: utils/fmgr/dfmgr.c:343 +#, fuzzy, c-format +#| msgid "Server has FLOAT8PASSBYVAL = %s, library has %s." +msgid "Server has ABI \"%s\", library has \"%s\"." +msgstr "Servern har FLOAT8PASSBYVAL = %s, biblioteket har %s." + +#: utils/fmgr/dfmgr.c:361 #, c-format msgid "Server has FUNC_MAX_ARGS = %d, library has %d." msgstr "Servern har FUNC_MAX_ARGS = %d, biblioteket har %d." -#: utils/fmgr/dfmgr.c:355 +#: utils/fmgr/dfmgr.c:370 #, c-format msgid "Server has INDEX_MAX_KEYS = %d, library has %d." msgstr "Servern har INDEX_MAX_KEYS = %d, biblioteket har %d." -#: utils/fmgr/dfmgr.c:364 +#: utils/fmgr/dfmgr.c:379 #, c-format msgid "Server has NAMEDATALEN = %d, library has %d." msgstr "Servern har NAMEDATALEN = %d, biblioteket har %d." -#: utils/fmgr/dfmgr.c:373 +#: utils/fmgr/dfmgr.c:388 #, c-format msgid "Server has FLOAT8PASSBYVAL = %s, library has %s." msgstr "Servern har FLOAT8PASSBYVAL = %s, biblioteket har %s." -#: utils/fmgr/dfmgr.c:380 +#: utils/fmgr/dfmgr.c:395 msgid "Magic block has unexpected length or padding difference." msgstr "Magiskt block har oväntad längd eller annan paddning." -#: utils/fmgr/dfmgr.c:383 +#: utils/fmgr/dfmgr.c:398 #, c-format msgid "incompatible library \"%s\": magic block mismatch" msgstr "inkompatibelt bibliotek \"%s\": magiskt block matchar inte" -#: utils/fmgr/dfmgr.c:547 +#: utils/fmgr/dfmgr.c:492 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "åtkomst till biblioteket \"%s\" tillåts inte" -#: utils/fmgr/dfmgr.c:573 +#: utils/fmgr/dfmgr.c:518 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "ogiltigt macro-namn i dynamisk biblioteksökväg: %s" -#: utils/fmgr/dfmgr.c:613 +#: utils/fmgr/dfmgr.c:558 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "komponent med längden noll i parameter \"dynamic_library_path\"" -#: utils/fmgr/dfmgr.c:632 +#: utils/fmgr/dfmgr.c:577 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "komponent som inte är en absolut sökväg i parameter \"dynamic_library_path\"" @@ -24585,308 +26673,308 @@ msgstr "komponent som inte är en absolut sökväg i parameter \"dynamic_library msgid "internal function \"%s\" is not in internal lookup table" msgstr "interna funktionen \"%s\" finns inte i den interna uppslagstabellen" -#: utils/fmgr/fmgr.c:487 +#: utils/fmgr/fmgr.c:484 #, c-format msgid "could not find function information for function \"%s\"" msgstr "kunde inte hitta funktionsinformation för funktion \"%s\"" -#: utils/fmgr/fmgr.c:489 +#: utils/fmgr/fmgr.c:486 #, c-format msgid "SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname)." msgstr "SQL-anropbara funktioner kräver en medföljande PG_FUNCTION_INFO_V1(funknamn)." -#: utils/fmgr/fmgr.c:507 +#: utils/fmgr/fmgr.c:504 #, c-format msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "okänd API-version %d rapporterad av infofunktion \"%s\"" -#: utils/fmgr/fmgr.c:2003 +#: utils/fmgr/fmgr.c:1985 #, c-format msgid "operator class options info is absent in function call context" msgstr "info om operatorklassflaggor saknas i funktionens anropskontext" -#: utils/fmgr/fmgr.c:2070 +#: utils/fmgr/fmgr.c:2052 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "språkvalideringsfunktion %u anropad för språk %u istället för %u" -#: utils/fmgr/funcapi.c:384 +#: utils/fmgr/funcapi.c:455 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" msgstr "kunde inte bestämma resultattyp för funktion \"%s\" som deklarerats att returnera typ %s" -#: utils/fmgr/funcapi.c:1651 utils/fmgr/funcapi.c:1683 +#: utils/fmgr/funcapi.c:600 +#, c-format +msgid "argument declared %s does not contain a range type but type %s" +msgstr "argumentet deklarerad %s innehåller inte en range-typ utan typ %s" + +#: utils/fmgr/funcapi.c:683 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "kunde inte hitta multirange-typ för datatyp %s" + +#: utils/fmgr/funcapi.c:1900 utils/fmgr/funcapi.c:1932 #, c-format msgid "number of aliases does not match number of columns" msgstr "antalet alias matchar inte antalet kolumner" -#: utils/fmgr/funcapi.c:1677 +#: utils/fmgr/funcapi.c:1926 #, c-format msgid "no column alias was provided" msgstr "inget kolumnalias angivet" -#: utils/fmgr/funcapi.c:1701 +#: utils/fmgr/funcapi.c:1950 #, c-format msgid "could not determine row description for function returning record" msgstr "kunde inte få radbeskrivning för funktion som returnerar en record" -#: utils/init/miscinit.c:285 +#: utils/init/miscinit.c:329 #, c-format msgid "data directory \"%s\" does not exist" msgstr "databaskatalogen \"%s\" existerar inte" -#: utils/init/miscinit.c:290 +#: utils/init/miscinit.c:334 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "kunde inte läsa rättigheter på katalog \"%s\": %m" -#: utils/init/miscinit.c:298 +#: utils/init/miscinit.c:342 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "angiven datakatalog \"%s\" är inte en katalog" -#: utils/init/miscinit.c:314 +#: utils/init/miscinit.c:358 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "datakatalogen \"%s\" har fel ägare" -#: utils/init/miscinit.c:316 +#: utils/init/miscinit.c:360 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "Servern måste startas av den användare som äger datakatalogen." -#: utils/init/miscinit.c:334 +#: utils/init/miscinit.c:378 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "datakatalogen \"%s\" har felaktiga rättigheter" -#: utils/init/miscinit.c:336 +#: utils/init/miscinit.c:380 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "Rättigheterna skall vara u=rwx (0700) eller u=rwx,g=rx (0750)." -#: utils/init/miscinit.c:615 utils/misc/guc.c:7139 +#: utils/init/miscinit.c:665 utils/misc/guc.c:7782 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "kan inte sätta parameter \"%s\" från en säkerhetsbegränsad operation" -#: utils/init/miscinit.c:683 +#: utils/init/miscinit.c:733 #, c-format msgid "role with OID %u does not exist" msgstr "roll med OID %u existerar inte" -#: utils/init/miscinit.c:713 +#: utils/init/miscinit.c:763 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "roll \"%s\" tillåts inte logga in" -#: utils/init/miscinit.c:731 +#: utils/init/miscinit.c:781 #, c-format msgid "too many connections for role \"%s\"" msgstr "för många uppkopplingar för roll \"%s\"" -#: utils/init/miscinit.c:791 +#: utils/init/miscinit.c:841 #, c-format msgid "permission denied to set session authorization" msgstr "rättighet saknas för att sätta sessionsauktorisation" -#: utils/init/miscinit.c:874 +#: utils/init/miscinit.c:924 #, c-format msgid "invalid role OID: %u" msgstr "ogiltigt roll-OID: %u" -#: utils/init/miscinit.c:928 +#: utils/init/miscinit.c:978 #, c-format msgid "database system is shut down" msgstr "databassystemet är nedstängt" -#: utils/init/miscinit.c:1015 +#: utils/init/miscinit.c:1065 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "kan inte skapa låsfil \"%s\": %m" -#: utils/init/miscinit.c:1029 +#: utils/init/miscinit.c:1079 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "kunde inte öppna låsfil \"%s\": %m" -#: utils/init/miscinit.c:1036 +#: utils/init/miscinit.c:1086 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "kunde inte läsa låsfil \"%s\": %m" -#: utils/init/miscinit.c:1045 +#: utils/init/miscinit.c:1095 #, c-format msgid "lock file \"%s\" is empty" msgstr "låsfilen \"%s\" är tom" -#: utils/init/miscinit.c:1046 +#: utils/init/miscinit.c:1096 #, c-format msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." msgstr "Antingen startar en annan server eller så är låsfilen kvar från en tidigare serverkrash vid uppstart." -#: utils/init/miscinit.c:1090 +#: utils/init/miscinit.c:1140 #, c-format msgid "lock file \"%s\" already exists" msgstr "låsfil med namn \"%s\" finns redan" -#: utils/init/miscinit.c:1094 +#: utils/init/miscinit.c:1144 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "Kör en annan postgres (PID %d) i datakatalogen \"%s\"?" -#: utils/init/miscinit.c:1096 +#: utils/init/miscinit.c:1146 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "Kör en annan postmaster (PID %d) i datakatalogen \"%s\"?" -#: utils/init/miscinit.c:1099 +#: utils/init/miscinit.c:1149 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "Använder en annan postgres (PID %d) uttagesfilen (socket) \"%s\"?" -#: utils/init/miscinit.c:1101 +#: utils/init/miscinit.c:1151 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "Använder en annan postmaster (PID %d) uttagesfilen (socket) \"%s\"?" -#: utils/init/miscinit.c:1152 +#: utils/init/miscinit.c:1202 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "kunde inte ta bort gammal låsfil \"%s\": %m" -#: utils/init/miscinit.c:1154 +#: utils/init/miscinit.c:1204 #, c-format msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." msgstr "Filen verkar ha lämnats kvar av misstag, men kan inte tas bort. Ta bort den för hand och försök igen.>" -#: utils/init/miscinit.c:1191 utils/init/miscinit.c:1205 -#: utils/init/miscinit.c:1216 +#: utils/init/miscinit.c:1241 utils/init/miscinit.c:1255 +#: utils/init/miscinit.c:1266 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "kunde inte skriva låsfil \"%s\": %m" -#: utils/init/miscinit.c:1327 utils/init/miscinit.c:1469 utils/misc/guc.c:10066 +#: utils/init/miscinit.c:1377 utils/init/miscinit.c:1519 utils/misc/guc.c:10740 #, c-format msgid "could not read from file \"%s\": %m" msgstr "kunde inte läsa från fil \"%s\": %m" -#: utils/init/miscinit.c:1457 +#: utils/init/miscinit.c:1507 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "kunde inte öppna fil \"%s\": %m: fortsätter ändå" -#: utils/init/miscinit.c:1482 +#: utils/init/miscinit.c:1532 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "låsfil \"%s\" innehåller fel PID: %ld istället för %ld" -#: utils/init/miscinit.c:1521 utils/init/miscinit.c:1537 +#: utils/init/miscinit.c:1571 utils/init/miscinit.c:1587 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\" är inte en giltigt datakatalog" -#: utils/init/miscinit.c:1523 +#: utils/init/miscinit.c:1573 #, c-format msgid "File \"%s\" is missing." msgstr "Filen \"%s\" saknas." -#: utils/init/miscinit.c:1539 +#: utils/init/miscinit.c:1589 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Filen \"%s\" innehåller inte giltig data." -#: utils/init/miscinit.c:1541 +#: utils/init/miscinit.c:1591 #, c-format msgid "You might need to initdb." msgstr "Du kan behöva köra initdb." -#: utils/init/miscinit.c:1549 +#: utils/init/miscinit.c:1599 #, c-format msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." msgstr "Datakatalogen har skapats av PostgreSQL version %s, som inte är kompatibel med version %s." -#: utils/init/miscinit.c:1616 +#: utils/init/postinit.c:258 #, c-format -msgid "loaded library \"%s\"" -msgstr "laddat bibliotek \"%s\"" +msgid "replication connection authorized: user=%s" +msgstr "replikeringsanslutning auktoriserad: användare=%s" -#: utils/init/postinit.c:255 +#: utils/init/postinit.c:261 #, c-format -msgid "replication connection authorized: user=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr "replikeringsanslutning auktoriserad: användare=%s application_name=%s SSL påslagen (protokoll=%s, krypto=%s, bitar=%d, komprimering=%s)" - -#: utils/init/postinit.c:261 utils/init/postinit.c:267 -#: utils/init/postinit.c:289 utils/init/postinit.c:295 -msgid "off" -msgstr "av" +msgid "connection authorized: user=%s" +msgstr "anslutning auktoriserad: användare=%s" -#: utils/init/postinit.c:261 utils/init/postinit.c:267 -#: utils/init/postinit.c:289 utils/init/postinit.c:295 -msgid "on" -msgstr "på" - -#: utils/init/postinit.c:262 +#: utils/init/postinit.c:264 #, c-format -msgid "replication connection authorized: user=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr "replikeringsanslutning auktoriserad: användare=%s SSL påslagen (protokoll=%s, krypto=%s, bitar=%d, komprimering=%s)" +msgid " database=%s" +msgstr "databas=%s" -#: utils/init/postinit.c:272 +#: utils/init/postinit.c:267 #, c-format -msgid "replication connection authorized: user=%s application_name=%s" -msgstr "replikeringsanslutning auktoriserad: användare=%s application_name=%s" +msgid " application_name=%s" +msgstr " applikationsnamn=%s" -#: utils/init/postinit.c:275 +#: utils/init/postinit.c:272 #, c-format -msgid "replication connection authorized: user=%s" -msgstr "replikeringsanslutning auktoriserad: användare=%s" +msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" +msgstr "SSL påslagen (protokoll=%s, krypto=%s, bitar=%d)" #: utils/init/postinit.c:284 #, c-format -msgid "connection authorized: user=%s database=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr "anslutning auktoriserad: användare=%s databas=%s application_name=%s SSL påslagen (protokoll=%s, krypto=%s, bitar=%d, komprimering=%s)" +msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" +msgstr " GSS (autentiserad=%s, krypterad=%s, principal=%s)" -#: utils/init/postinit.c:290 -#, c-format -msgid "connection authorized: user=%s database=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr "anslutning auktoriserad: användare=%s databas=%s SSL påslagen (protokoll=%s, krypto=%s, bitar=%d, komprimering=%s)" +#: utils/init/postinit.c:285 utils/init/postinit.c:286 +#: utils/init/postinit.c:291 utils/init/postinit.c:292 +msgid "no" +msgstr "nej" -#: utils/init/postinit.c:300 -#, c-format -msgid "connection authorized: user=%s database=%s application_name=%s" -msgstr "anslutning auktoriserad: användare=%s databas=%s application_name=%s" +#: utils/init/postinit.c:285 utils/init/postinit.c:286 +#: utils/init/postinit.c:291 utils/init/postinit.c:292 +msgid "yes" +msgstr "ja" -#: utils/init/postinit.c:302 +#: utils/init/postinit.c:290 #, c-format -msgid "connection authorized: user=%s database=%s" -msgstr "anslutning auktoriserad: användare=%s databas=%s" +msgid " GSS (authenticated=%s, encrypted=%s)" +msgstr "GSS (autentiserad=%s, krypterad=%s)" -#: utils/init/postinit.c:334 +#: utils/init/postinit.c:330 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "databasen \"%s\" har försvunnit från pg_database" -#: utils/init/postinit.c:336 +#: utils/init/postinit.c:332 #, c-format msgid "Database OID %u now seems to belong to \"%s\"." msgstr "Databasen med OID %u verkar nu höra till \"%s\"." -#: utils/init/postinit.c:356 +#: utils/init/postinit.c:352 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "databasen \"%s\" tar för närvarande inte emot uppkopplingar" -#: utils/init/postinit.c:369 +#: utils/init/postinit.c:365 #, c-format msgid "permission denied for database \"%s\"" msgstr "rättighet saknas för databas \"%s\"" -#: utils/init/postinit.c:370 +#: utils/init/postinit.c:366 #, c-format msgid "User does not have CONNECT privilege." msgstr "Användaren har inte rättigheten CONNECT." -#: utils/init/postinit.c:387 +#: utils/init/postinit.c:383 #, c-format msgid "too many connections for database \"%s\"" msgstr "för många uppkopplingar till databasen \"%s\"" @@ -24911,79 +26999,88 @@ msgstr "Återskapa databasen med en annan lokal eller installera den saknade lok msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." msgstr "Databasen initierades med LC_CTYPE \"%s\", vilket inte känns igen av setlocale()." -#: utils/init/postinit.c:762 +#: utils/init/postinit.c:457 +#, fuzzy, c-format +#| msgid "collation \"%s\" has no actual version, but a version was specified" +msgid "database \"%s\" has no actual collation version, but a version was recorded" +msgstr "jämförelse (collation) \"%s\" har ingen version men en version angavs" + +#: utils/init/postinit.c:461 +#, fuzzy, c-format +#| msgid "collation \"%s\" has version mismatch" +msgid "database \"%s\" has a collation version mismatch" +msgstr "jämförelse (collation) \"%s\" har en version som inte matchar" + +#: utils/init/postinit.c:463 +#, fuzzy, c-format +#| msgid "The collation in the database was created using version %s, but the operating system provides version %s." +msgid "The database was created using collation version %s, but the operating system provides version %s." +msgstr "Jämförelsen (collation) i databasen har skapats med version %s men operativsystemet har version %s." + +#: utils/init/postinit.c:466 +#, fuzzy, c-format +#| msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." +msgid "Rebuild all objects in this database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." +msgstr "Bygg om alla objekt som påverkas av denna jämförelse (collation) och kör ALTER COLLATION %s REFRESH VERSION eller bygg PostgreSQL med rätt bibliotekversion." + +#: utils/init/postinit.c:815 #, c-format msgid "no roles are defined in this database system" msgstr "inga roller är definierade i detta databassystem" -#: utils/init/postinit.c:763 +#: utils/init/postinit.c:816 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "Du borde direkt köra CREATE USER \"%s\" SUPERUSER;." -#: utils/init/postinit.c:799 -#, c-format -msgid "new replication connections are not allowed during database shutdown" -msgstr "nya replikeringsanslutningar tillåts inte under databasnedstängning" - -#: utils/init/postinit.c:803 -#, c-format -msgid "must be superuser to connect during database shutdown" -msgstr "måste vara superanvändare för att ansluta när databasen håller på att stängas ner" - -#: utils/init/postinit.c:813 +#: utils/init/postinit.c:848 #, c-format msgid "must be superuser to connect in binary upgrade mode" -msgstr "måste vara superanvändare för att ansluta i binärt uppgraderingsläger" +msgstr "måste vara superuser för att ansluta i binärt uppgraderingsläger" -#: utils/init/postinit.c:826 +#: utils/init/postinit.c:861 #, c-format msgid "remaining connection slots are reserved for non-replication superuser connections" -msgstr "resterande anslutningsslottar är reserverade för superanvändaranslutningar utan replikering" +msgstr "resterande anslutningsslottar är reserverade för superuser-anslutningar utan replikering" -#: utils/init/postinit.c:836 +#: utils/init/postinit.c:871 #, c-format msgid "must be superuser or replication role to start walsender" -msgstr "måste vara superanvändare eller replikeringsroll för att starta \"walsender\"" +msgstr "måste vara superuser eller replikeringsroll för att starta \"walsender\"" -#: utils/init/postinit.c:905 +#: utils/init/postinit.c:940 #, c-format msgid "database %u does not exist" msgstr "databasen %u existerar inte" -#: utils/init/postinit.c:994 +#: utils/init/postinit.c:1029 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Det verkar precis ha tagits bort eller döpts om." -#: utils/init/postinit.c:1012 +#: utils/init/postinit.c:1047 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Databasens underbibliotek \"%s\" saknas." -#: utils/init/postinit.c:1017 -#, c-format -msgid "could not access directory \"%s\": %m" -msgstr "kunde inte komma åt katalog \"%s\": %m" - -#: utils/mb/conv.c:443 utils/mb/conv.c:635 +#: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" msgstr "ogiltigt kodningsnummer: %d" -#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:122 -#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:154 +#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:129 +#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:165 #, c-format msgid "unexpected encoding ID %d for ISO 8859 character sets" msgstr "oväntat kodnings-ID %d för ISO 8859-teckenuppsättningarna" -#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:103 -#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:135 +#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:110 +#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:146 #, c-format msgid "unexpected encoding ID %d for WIN character sets" msgstr "oväntat kodnings-ID %d för WIN-teckenuppsättningarna" -#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:842 +#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:900 #, c-format msgid "conversion between %s and %s is not supported" msgstr "konvertering mellan %s och %s stöds inte" @@ -24993,1907 +27090,2051 @@ msgstr "konvertering mellan %s och %s stöds inte" msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" msgstr "standardkonverteringsfunktion för kodning \"%s\" till \"%s\" finns inte" -#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:429 utils/mb/mbutils.c:758 -#: utils/mb/mbutils.c:784 +#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 +#: utils/mb/mbutils.c:842 #, c-format msgid "String of %d bytes is too long for encoding conversion." msgstr "Sträng på %d byte är för lång för kodningskonvertering." -#: utils/mb/mbutils.c:511 +#: utils/mb/mbutils.c:568 #, c-format msgid "invalid source encoding name \"%s\"" msgstr "ogiltigt källkodningsnamn \"%s\"" -#: utils/mb/mbutils.c:516 +#: utils/mb/mbutils.c:573 #, c-format msgid "invalid destination encoding name \"%s\"" msgstr "ogiltigt målkodningsnamn \"%s\"" -#: utils/mb/mbutils.c:656 +#: utils/mb/mbutils.c:713 #, c-format msgid "invalid byte value for encoding \"%s\": 0x%02x" msgstr "ogiltigt byte-sekvens för kodning \"%s\": 0x%02x\"" -#: utils/mb/mbutils.c:819 +#: utils/mb/mbutils.c:877 #, c-format msgid "invalid Unicode code point" msgstr "ogiltig Unicode-kodpunkt" -#: utils/mb/mbutils.c:1087 +#: utils/mb/mbutils.c:1146 #, c-format msgid "bind_textdomain_codeset failed" msgstr "bind_textdomain_codeset misslyckades" -#: utils/mb/mbutils.c:1595 +#: utils/mb/mbutils.c:1667 #, c-format msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "ogiltigt byte-sekvens för kodning \"%s\": %s" -#: utils/mb/mbutils.c:1628 +#: utils/mb/mbutils.c:1700 #, c-format msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "tecken med byte-sekvens %s i kodning \"%s\" har inget motsvarande i kodning \"%s\"" -#: utils/misc/guc.c:679 +#: utils/misc/guc.c:776 msgid "Ungrouped" msgstr "Ej grupperad" -#: utils/misc/guc.c:681 +#: utils/misc/guc.c:778 msgid "File Locations" msgstr "Filplatser" -#: utils/misc/guc.c:683 -msgid "Connections and Authentication" -msgstr "Uppkopplingar och Autentisering" - -#: utils/misc/guc.c:685 +#: utils/misc/guc.c:780 msgid "Connections and Authentication / Connection Settings" msgstr "Uppkopplingar och Autentisering / Uppkopplingsinställningar" -#: utils/misc/guc.c:687 +#: utils/misc/guc.c:782 msgid "Connections and Authentication / Authentication" msgstr "Uppkopplingar och Autentisering / Autentisering" -#: utils/misc/guc.c:689 +#: utils/misc/guc.c:784 msgid "Connections and Authentication / SSL" msgstr "Uppkopplingar och Autentisering / SSL" -#: utils/misc/guc.c:691 -msgid "Resource Usage" -msgstr "Resursanvändning" - -#: utils/misc/guc.c:693 +#: utils/misc/guc.c:786 msgid "Resource Usage / Memory" msgstr "Resursanvändning / Minne" -#: utils/misc/guc.c:695 +#: utils/misc/guc.c:788 msgid "Resource Usage / Disk" msgstr "Resursanvändning / Disk" -#: utils/misc/guc.c:697 +#: utils/misc/guc.c:790 msgid "Resource Usage / Kernel Resources" msgstr "Resursanvändning / Kärnresurser" -#: utils/misc/guc.c:699 +#: utils/misc/guc.c:792 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Resursanvändning / Kostnadsbaserad Vacuum-fördröjning" -#: utils/misc/guc.c:701 +#: utils/misc/guc.c:794 msgid "Resource Usage / Background Writer" msgstr "Resursanvändning / Bakgrundskrivare" -#: utils/misc/guc.c:703 +#: utils/misc/guc.c:796 msgid "Resource Usage / Asynchronous Behavior" msgstr "Resursanvändning / Asynkront beteende" -#: utils/misc/guc.c:705 -msgid "Write-Ahead Log" -msgstr "Write-Ahead Log" - -#: utils/misc/guc.c:707 +#: utils/misc/guc.c:798 msgid "Write-Ahead Log / Settings" msgstr "Write-Ahead Log / Inställningar" -#: utils/misc/guc.c:709 +#: utils/misc/guc.c:800 msgid "Write-Ahead Log / Checkpoints" msgstr "Write-Ahead Log / Checkpoint:er" -#: utils/misc/guc.c:711 +#: utils/misc/guc.c:802 msgid "Write-Ahead Log / Archiving" msgstr "Write-Ahead Log / Arkivering" -#: utils/misc/guc.c:713 +#: utils/misc/guc.c:804 +#, fuzzy +#| msgid "Write-Ahead Log / Recovery Target" +msgid "Write-Ahead Log / Recovery" +msgstr "Write-Ahead Log / Återställningsmål" + +#: utils/misc/guc.c:806 msgid "Write-Ahead Log / Archive Recovery" msgstr "Write-Ahead Log / Återställning från arkiv" -#: utils/misc/guc.c:715 +#: utils/misc/guc.c:808 msgid "Write-Ahead Log / Recovery Target" msgstr "Write-Ahead Log / Återställningsmål" -#: utils/misc/guc.c:717 -msgid "Replication" -msgstr "Replikering" - -#: utils/misc/guc.c:719 +#: utils/misc/guc.c:810 msgid "Replication / Sending Servers" msgstr "Replilering / Skickande servrar" -#: utils/misc/guc.c:721 -msgid "Replication / Master Server" -msgstr "Replikering / Master-server" +#: utils/misc/guc.c:812 +msgid "Replication / Primary Server" +msgstr "Replikering / Primärserver" -#: utils/misc/guc.c:723 +#: utils/misc/guc.c:814 msgid "Replication / Standby Servers" msgstr "Replikering / Standby-servrar" -#: utils/misc/guc.c:725 +#: utils/misc/guc.c:816 msgid "Replication / Subscribers" msgstr "Replikering / Prenumeranter" -#: utils/misc/guc.c:727 -msgid "Query Tuning" -msgstr "Frågeoptimering" - -#: utils/misc/guc.c:729 +#: utils/misc/guc.c:818 msgid "Query Tuning / Planner Method Configuration" msgstr "Frågeoptimering / Planeringsmetodinställningar" -#: utils/misc/guc.c:731 +#: utils/misc/guc.c:820 msgid "Query Tuning / Planner Cost Constants" msgstr "Frågeoptimering / Plannerarens kostnadskonstanter" -#: utils/misc/guc.c:733 +#: utils/misc/guc.c:822 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Frågeoptimering / Genetisk frågeoptimerare" -#: utils/misc/guc.c:735 +#: utils/misc/guc.c:824 msgid "Query Tuning / Other Planner Options" msgstr "Frågeoptimering / Andra planeringsinställningar" -#: utils/misc/guc.c:737 -msgid "Reporting and Logging" -msgstr "Rapportering och loggning" - -#: utils/misc/guc.c:739 +#: utils/misc/guc.c:826 msgid "Reporting and Logging / Where to Log" msgstr "Rapportering och loggning / Logga var?" -#: utils/misc/guc.c:741 +#: utils/misc/guc.c:828 msgid "Reporting and Logging / When to Log" msgstr "Rapportering och loggning / Logga när?" -#: utils/misc/guc.c:743 +#: utils/misc/guc.c:830 msgid "Reporting and Logging / What to Log" msgstr "Rapportering och loggning / Logga vad?" -#: utils/misc/guc.c:745 -msgid "Process Title" -msgstr "Processtitel" - -#: utils/misc/guc.c:747 -msgid "Statistics" -msgstr "Statistik" +#: utils/misc/guc.c:832 +msgid "Reporting and Logging / Process Title" +msgstr "Rapportering och loggning / Processtitel" -#: utils/misc/guc.c:749 +#: utils/misc/guc.c:834 msgid "Statistics / Monitoring" msgstr "Statistik / Övervakning" -#: utils/misc/guc.c:751 -msgid "Statistics / Query and Index Statistics Collector" +#: utils/misc/guc.c:836 +#, fuzzy +#| msgid "Statistics / Query and Index Statistics Collector" +msgid "Statistics / Cumulative Query and Index Statistics" msgstr "Statistik / Insamlare av fråge- och index-statistik" -#: utils/misc/guc.c:753 +#: utils/misc/guc.c:838 msgid "Autovacuum" msgstr "Autovacuum" -#: utils/misc/guc.c:755 -msgid "Client Connection Defaults" -msgstr "Standard för klientanslutning" - -#: utils/misc/guc.c:757 +#: utils/misc/guc.c:840 msgid "Client Connection Defaults / Statement Behavior" msgstr "Standard för klientanslutning / Satsbeteende" -#: utils/misc/guc.c:759 +#: utils/misc/guc.c:842 msgid "Client Connection Defaults / Locale and Formatting" msgstr "Standard för klientanslutning / Lokal och formattering" -#: utils/misc/guc.c:761 +#: utils/misc/guc.c:844 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "Standard för klientanslutning / Förladdning av delat bibliotek" -#: utils/misc/guc.c:763 +#: utils/misc/guc.c:846 msgid "Client Connection Defaults / Other Defaults" msgstr "Standard för klientanslutning / Övriga standardvärden" -#: utils/misc/guc.c:765 +#: utils/misc/guc.c:848 msgid "Lock Management" msgstr "Låshantering" -#: utils/misc/guc.c:767 -msgid "Version and Platform Compatibility" -msgstr "Version och plattformskompabilitet" - -#: utils/misc/guc.c:769 +#: utils/misc/guc.c:850 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Version och plattformskompabilitet / Tidigare PostrgreSQL-versioner" -#: utils/misc/guc.c:771 +#: utils/misc/guc.c:852 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "Version och plattformskompabilitet / Andra plattformar och klienter" -#: utils/misc/guc.c:773 +#: utils/misc/guc.c:854 msgid "Error Handling" msgstr "Felhantering" -#: utils/misc/guc.c:775 +#: utils/misc/guc.c:856 msgid "Preset Options" msgstr "Förinställningsflaggor" -#: utils/misc/guc.c:777 +#: utils/misc/guc.c:858 msgid "Customized Options" msgstr "Ändrade flaggor" -#: utils/misc/guc.c:779 +#: utils/misc/guc.c:860 msgid "Developer Options" msgstr "Utvecklarflaggor" -#: utils/misc/guc.c:837 +#: utils/misc/guc.c:918 msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." msgstr "Giltiga enheter för denna parameter är \"B\", \"kB\", \"MB\", \"GB\" och \"TB\"." -#: utils/misc/guc.c:874 +#: utils/misc/guc.c:955 msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." msgstr "Giltiga enheter för denna parameter är \"us\", \"ms\", \"s\", \"min\", \"h\" och \"d\"." -#: utils/misc/guc.c:936 +#: utils/misc/guc.c:1017 msgid "Enables the planner's use of sequential-scan plans." msgstr "Aktiverar planerarens användning av planer med sekvensiell skanning." -#: utils/misc/guc.c:946 +#: utils/misc/guc.c:1027 msgid "Enables the planner's use of index-scan plans." msgstr "Aktiverar planerarens användning av planer med indexskanning." -#: utils/misc/guc.c:956 +#: utils/misc/guc.c:1037 msgid "Enables the planner's use of index-only-scan plans." msgstr "Aktiverar planerarens användning av planer med skanning av enbart index." -#: utils/misc/guc.c:966 +#: utils/misc/guc.c:1047 msgid "Enables the planner's use of bitmap-scan plans." msgstr "Aktiverar planerarens användning av planer med bitmapskanning." -#: utils/misc/guc.c:976 +#: utils/misc/guc.c:1057 msgid "Enables the planner's use of TID scan plans." msgstr "Aktiverar planerarens användning av planer med TID-skanning." -#: utils/misc/guc.c:986 +#: utils/misc/guc.c:1067 msgid "Enables the planner's use of explicit sort steps." msgstr "Slår på planerarens användning av explicita sorteringssteg." -#: utils/misc/guc.c:996 +#: utils/misc/guc.c:1077 msgid "Enables the planner's use of incremental sort steps." msgstr "Aktiverar planerarens användning av inkrementella sorteringssteg." -#: utils/misc/guc.c:1005 +#: utils/misc/guc.c:1087 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Aktiverar planerarens användning av planer med hash-aggregering" -#: utils/misc/guc.c:1015 +#: utils/misc/guc.c:1097 msgid "Enables the planner's use of materialization." msgstr "Aktiverar planerarens användning av materialisering." -#: utils/misc/guc.c:1025 +#: utils/misc/guc.c:1107 +msgid "Enables the planner's use of memoization." +msgstr "Aktiverar planerarens användning av memoization." + +#: utils/misc/guc.c:1117 msgid "Enables the planner's use of nested-loop join plans." msgstr "Aktiverar planerarens användning av planer med nästlad loop-join," -#: utils/misc/guc.c:1035 +#: utils/misc/guc.c:1127 msgid "Enables the planner's use of merge join plans." msgstr "Aktiverar planerarens användning av merge-join-planer." -#: utils/misc/guc.c:1045 +#: utils/misc/guc.c:1137 msgid "Enables the planner's use of hash join plans." msgstr "Aktiverar planerarens användning av hash-join-planer." -#: utils/misc/guc.c:1055 +#: utils/misc/guc.c:1147 msgid "Enables the planner's use of gather merge plans." msgstr "Aktiverar planerarens användning av planer med gather-merge." -#: utils/misc/guc.c:1065 +#: utils/misc/guc.c:1157 msgid "Enables partitionwise join." msgstr "Aktiverar join per partition." -#: utils/misc/guc.c:1075 +#: utils/misc/guc.c:1167 msgid "Enables partitionwise aggregation and grouping." msgstr "Aktiverar aggregering och gruppering per partition." -#: utils/misc/guc.c:1085 +#: utils/misc/guc.c:1177 msgid "Enables the planner's use of parallel append plans." msgstr "Aktiverar planerarens användning av planer med parallell append." -#: utils/misc/guc.c:1095 +#: utils/misc/guc.c:1187 msgid "Enables the planner's use of parallel hash plans." msgstr "Aktiverar planerarens användning av planer med parallell hash." -#: utils/misc/guc.c:1105 -msgid "Enables plan-time and run-time partition pruning." -msgstr "Aktiverar partitionsbeskärning vid planering och vid körning." +#: utils/misc/guc.c:1197 +msgid "Enables plan-time and execution-time partition pruning." +msgstr "Aktiverar rensning av partitioner vid planering och vid körning." -#: utils/misc/guc.c:1106 +#: utils/misc/guc.c:1198 msgid "Allows the query planner and executor to compare partition bounds to conditions in the query to determine which partitions must be scanned." msgstr "Tillåter att frågeplaneraren och exekveraren jämför partitionsgränser med villkor i frågan för att bestämma vilka partitioner som skall skannas." -#: utils/misc/guc.c:1117 +#: utils/misc/guc.c:1209 +msgid "Enables the planner's use of async append plans." +msgstr "Aktiverar planerarens användning av planer med async append." + +#: utils/misc/guc.c:1219 +msgid "enable reordering of GROUP BY key" +msgstr "" + +#: utils/misc/guc.c:1229 msgid "Enables genetic query optimization." msgstr "Aktiverar genetisk frågeoptimering." -#: utils/misc/guc.c:1118 +#: utils/misc/guc.c:1230 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Denna algoritm försöker utföra planering utan fullständig sökning." -#: utils/misc/guc.c:1129 +#: utils/misc/guc.c:1241 msgid "Shows whether the current user is a superuser." -msgstr "Visar om den aktuella användaren är en superanvändare." +msgstr "Visar om den aktuella användaren är en superuser." -#: utils/misc/guc.c:1139 +#: utils/misc/guc.c:1251 msgid "Enables advertising the server via Bonjour." msgstr "Aktiverar annonsering av servern via Bonjour." -#: utils/misc/guc.c:1148 +#: utils/misc/guc.c:1260 msgid "Collects transaction commit time." msgstr "Samlar in tid för transaktions-commit." -#: utils/misc/guc.c:1157 +#: utils/misc/guc.c:1269 msgid "Enables SSL connections." msgstr "Tillåter SSL-anslutningar." -#: utils/misc/guc.c:1166 -msgid "Also use ssl_passphrase_command during server reload." +#: utils/misc/guc.c:1278 +#, fuzzy +#| msgid "Also use ssl_passphrase_command during server reload." +msgid "Controls whether ssl_passphrase_command is called during server reload." msgstr "Använd ssl_passphrase_command även vid server-reload." -#: utils/misc/guc.c:1175 +#: utils/misc/guc.c:1287 msgid "Give priority to server ciphersuite order." msgstr "Ge prioritet till serverns ordning av kryptometoder." -#: utils/misc/guc.c:1184 +#: utils/misc/guc.c:1296 msgid "Forces synchronization of updates to disk." msgstr "Tvingar synkronisering av uppdateringar till disk." -#: utils/misc/guc.c:1185 +#: utils/misc/guc.c:1297 msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This insures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "Servern kommer använda systemanropet fsync() på ett antal platser för att se till att uppdateringar fysiskt skrivs till disk. Detta för att säkerställa att databasklustret kan starta i ett konsistent tillstånd efter en operativsystemkrash eller hårdvarukrash." -#: utils/misc/guc.c:1196 +#: utils/misc/guc.c:1308 msgid "Continues processing after a checksum failure." msgstr "Fortsätter processande efter checksummefel." -#: utils/misc/guc.c:1197 +#: utils/misc/guc.c:1309 msgid "Detection of a checksum failure normally causes PostgreSQL to report an error, aborting the current transaction. Setting ignore_checksum_failure to true causes the system to ignore the failure (but still report a warning), and continue processing. This behavior could cause crashes or other serious problems. Only has an effect if checksums are enabled." msgstr "Normalt vid detektion av checksummefel så rapporterar PostgreSQL felet och avbryter den aktuella transaktionen. Sätts ignore_checksum_failure till true så kommer systemet hoppa över felet (men fortfarande rapportera en varning). Detta beteende kan orsaka krasher eller andra allvarliga problem. Detta påverkas bara om checksummor är påslaget." -#: utils/misc/guc.c:1211 +#: utils/misc/guc.c:1323 msgid "Continues processing past damaged page headers." msgstr "Fortsätter processande efter trasiga sidhuvuden." -#: utils/misc/guc.c:1212 +#: utils/misc/guc.c:1324 msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting zero_damaged_pages to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." msgstr "Normalt vid detektion av trasiga sidhuvuden så rapporterar PostgreSQL felet och avbryter den aktuella transaktionen. Sätts zero_damaged_pages till true så kommer systemet istället rapportera en varning, nollställa den trasiga sidan samt fortsätta processa. Detta kommer förstöra data (alla rader i den trasiga sidan)." -#: utils/misc/guc.c:1225 +#: utils/misc/guc.c:1337 msgid "Continues recovery after an invalid pages failure." msgstr "Fortsätter återställande efter fel på grund av ogiltiga sidor." -#: utils/misc/guc.c:1226 +#: utils/misc/guc.c:1338 msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting ignore_invalid_pages to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." msgstr "Normalt vid detektion av WAL-poster som refererar till ogiltiga sidor under återställning så kommer PostgreSQL att signalera ett fel på PANIC-nivå och avbryta återställningen. Sätts ignore_invalid_pages till true så kommer systemet hoppa över ogiltiga sidreferenser i WAL-poster (men fortfarande rapportera en varning) och fortsätta återställningen. Detta beteende kan orsaka krasher, dataförluster, sprida eller dölja korruption eller ge andra allvarliga problem. Detta påverkar bara under återställning eller i standby-läge." -#: utils/misc/guc.c:1244 +#: utils/misc/guc.c:1356 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "Skriver fulla sidor till WAL första gången de ändras efter en checkpoint." -#: utils/misc/guc.c:1245 +#: utils/misc/guc.c:1357 msgid "A page write in process during an operating system crash might be only partially written to disk. During recovery, the row changes stored in WAL are not enough to recover. This option writes pages when first modified after a checkpoint to WAL so full recovery is possible." msgstr "En sidskrivning som sker vid en operativsystemkrash kan bli delvis utskriven till disk. Under återställning så kommer radändringar i WAL:en inte vara tillräckligt för att återställa datan. Denna flagga skriver ut sidor först efter att en WAL-checkpoint gjorts vilket gör att full återställning kan ske." -#: utils/misc/guc.c:1258 -msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modifications." -msgstr "Skriver fulla sidor till WAL första gången de ändras efter en checkpoint, även för ickekritiska ändringar." - -#: utils/misc/guc.c:1268 -msgid "Compresses full-page writes written in WAL file." -msgstr "Komprimerar skrivning av hela sidor som skrivs i WAL-fil." +#: utils/misc/guc.c:1370 +msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." +msgstr "Skriver fulla sidor till WAL första gången de ändras efter en checkpoint, även för ickekritisk ändring." -#: utils/misc/guc.c:1278 +#: utils/misc/guc.c:1380 msgid "Writes zeroes to new WAL files before first use." msgstr "Skriv nollor till nya WAL-filer innan första användning." -#: utils/misc/guc.c:1288 +#: utils/misc/guc.c:1390 msgid "Recycles WAL files by renaming them." msgstr "Återanvänder WAL-filer genom att byta namn på dem." -#: utils/misc/guc.c:1298 +#: utils/misc/guc.c:1400 msgid "Logs each checkpoint." msgstr "Logga varje checkpoint." -#: utils/misc/guc.c:1307 +#: utils/misc/guc.c:1409 msgid "Logs each successful connection." msgstr "Logga varje lyckad anslutning." -#: utils/misc/guc.c:1316 +#: utils/misc/guc.c:1418 msgid "Logs end of a session, including duration." msgstr "Loggar slut på session, inklusive längden." -#: utils/misc/guc.c:1325 +#: utils/misc/guc.c:1427 msgid "Logs each replication command." msgstr "Loggar alla replikeringskommanon." -#: utils/misc/guc.c:1334 +#: utils/misc/guc.c:1436 msgid "Shows whether the running server has assertion checks enabled." msgstr "Visar om den körande servern har assert-kontroller påslagna." -#: utils/misc/guc.c:1349 +#: utils/misc/guc.c:1451 msgid "Terminate session on any error." msgstr "Avbryt sessionen vid fel." -#: utils/misc/guc.c:1358 +#: utils/misc/guc.c:1460 msgid "Reinitialize server after backend crash." msgstr "Återinitiera servern efter en backend-krash." -#: utils/misc/guc.c:1368 +#: utils/misc/guc.c:1469 +msgid "Remove temporary files after backend crash." +msgstr "Ta bort temporära filer efter en backend-krash." + +#: utils/misc/guc.c:1480 msgid "Logs the duration of each completed SQL statement." msgstr "Loggar tiden för varje avslutad SQL-sats." -#: utils/misc/guc.c:1377 +#: utils/misc/guc.c:1489 msgid "Logs each query's parse tree." msgstr "Loggar alla frågors parse-träd." -#: utils/misc/guc.c:1386 +#: utils/misc/guc.c:1498 msgid "Logs each query's rewritten parse tree." msgstr "Logga alla frågors omskrivet parse-träd." -#: utils/misc/guc.c:1395 +#: utils/misc/guc.c:1507 msgid "Logs each query's execution plan." msgstr "Logga alla frågors körningsplan." -#: utils/misc/guc.c:1404 +#: utils/misc/guc.c:1516 msgid "Indents parse and plan tree displays." msgstr "Indentera parse och planeringsträdutskrifter" -#: utils/misc/guc.c:1413 +#: utils/misc/guc.c:1525 msgid "Writes parser performance statistics to the server log." msgstr "Skriver parserns prestandastatistik till serverloggen." -#: utils/misc/guc.c:1422 +#: utils/misc/guc.c:1534 msgid "Writes planner performance statistics to the server log." msgstr "Skriver planerarens prestandastatistik till serverloggen." -#: utils/misc/guc.c:1431 +#: utils/misc/guc.c:1543 msgid "Writes executor performance statistics to the server log." msgstr "Skrivere exekverarens prestandastatistik till serverloggen." -#: utils/misc/guc.c:1440 +#: utils/misc/guc.c:1552 msgid "Writes cumulative performance statistics to the server log." msgstr "Skriver ackumulerad prestandastatistik till serverloggen." -#: utils/misc/guc.c:1450 +#: utils/misc/guc.c:1562 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "Loggar statisik för användning av systemresurser (minne och CPU) för olika B-tree-operationer." -#: utils/misc/guc.c:1462 +#: utils/misc/guc.c:1574 msgid "Collects information about executing commands." msgstr "Samla information om körda kommanon." -#: utils/misc/guc.c:1463 +#: utils/misc/guc.c:1575 msgid "Enables the collection of information on the currently executing command of each session, along with the time at which that command began execution." msgstr "Slår på insamling av information om det nu körande kommandot för varje session, tillsammans med klockslaget när det kommandot började köra." -#: utils/misc/guc.c:1473 +#: utils/misc/guc.c:1585 msgid "Collects statistics on database activity." msgstr "Samla in statistik om databasaktivitet." -#: utils/misc/guc.c:1482 +#: utils/misc/guc.c:1594 msgid "Collects timing statistics for database I/O activity." msgstr "Samla in timingstatistik om databasens I/O-aktivitet." -#: utils/misc/guc.c:1492 +#: utils/misc/guc.c:1603 +msgid "Collects timing statistics for WAL I/O activity." +msgstr "Samla in timingstatistik om I/O-aktivitet för WAL." + +#: utils/misc/guc.c:1613 msgid "Updates the process title to show the active SQL command." msgstr "Uppdaterar processtitel till att visa aktivt SQL-kommando." -#: utils/misc/guc.c:1493 +#: utils/misc/guc.c:1614 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "Slår på uppdatering av processtiteln varje gång ett nytt SQL-kommando tas emot av servern." -#: utils/misc/guc.c:1506 +#: utils/misc/guc.c:1627 msgid "Starts the autovacuum subprocess." msgstr "Starta autovacuum-barnprocess." -#: utils/misc/guc.c:1516 +#: utils/misc/guc.c:1637 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Skapar debug-output för LISTEN och NOTIFY." -#: utils/misc/guc.c:1528 +#: utils/misc/guc.c:1649 msgid "Emits information about lock usage." msgstr "Visar information om låsanvändning." -#: utils/misc/guc.c:1538 +#: utils/misc/guc.c:1659 msgid "Emits information about user lock usage." msgstr "Visar information om användares låsanvändning." -#: utils/misc/guc.c:1548 +#: utils/misc/guc.c:1669 msgid "Emits information about lightweight lock usage." msgstr "Visar information om lättviktig låsanvändning." -#: utils/misc/guc.c:1558 +#: utils/misc/guc.c:1679 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "Dumpar information om alla aktuella lås när en deadlock-timeout sker." -#: utils/misc/guc.c:1570 +#: utils/misc/guc.c:1691 msgid "Logs long lock waits." msgstr "Loggar långa väntetider på lås." -#: utils/misc/guc.c:1580 +#: utils/misc/guc.c:1700 +msgid "Logs standby recovery conflict waits." +msgstr "Loggar väntande på återställningskonflikter i standby" + +#: utils/misc/guc.c:1709 msgid "Logs the host name in the connection logs." msgstr "Loggar hostnamnet i anslutningsloggen." -#: utils/misc/guc.c:1581 +#: utils/misc/guc.c:1710 msgid "By default, connection logs only show the IP address of the connecting host. If you want them to show the host name you can turn this on, but depending on your host name resolution setup it might impose a non-negligible performance penalty." msgstr "Som standard visar anslutningsloggen bara IP-adressen för den anslutande värden. Om du vill att värdnamnet skall visas så kan du slå på detta men beroende på hur uppsättningen av namnuppslag är gjored så kan detta ha en markant prestandapåverkan." -#: utils/misc/guc.c:1592 +#: utils/misc/guc.c:1721 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Tolkar \"uttryck=NULL\" som \"uttryck IS NULL\"." -#: utils/misc/guc.c:1593 +#: utils/misc/guc.c:1722 msgid "When turned on, expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL, that is, they return true if expr evaluates to the null value, and false otherwise. The correct behavior of expr = NULL is to always return null (unknown)." msgstr "Om påslagen så kommer uttryck på formen uttryck = NULL (eller NULL = uttryck) att behandlas som uttryck IS NULL, det vill säga returnera true om uttryck evalueras till värdet null eller evalueras till false annars. Det korrekta beteendet för uttryck = NULL är att alltid returnera null (okänt)." -#: utils/misc/guc.c:1605 +#: utils/misc/guc.c:1734 msgid "Enables per-database user names." msgstr "Aktiverar användarnamn per databas." -#: utils/misc/guc.c:1614 +#: utils/misc/guc.c:1743 msgid "Sets the default read-only status of new transactions." msgstr "Ställer in standard read-only-status för nya transaktioner." -#: utils/misc/guc.c:1623 +#: utils/misc/guc.c:1753 msgid "Sets the current transaction's read-only status." msgstr "Ställer in nuvarande transaktions read-only-status." -#: utils/misc/guc.c:1633 +#: utils/misc/guc.c:1763 msgid "Sets the default deferrable status of new transactions." msgstr "Ställer in standard deferrable-status för nya transaktioner." -#: utils/misc/guc.c:1642 +#: utils/misc/guc.c:1772 msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." msgstr "Bestämmer om en serialiserbar transaktion för läsning kommer fördröjas tills den kan köras utan serialiseringsfel." -#: utils/misc/guc.c:1652 +#: utils/misc/guc.c:1782 msgid "Enable row security." msgstr "Aktiverar radsäkerhet." -#: utils/misc/guc.c:1653 +#: utils/misc/guc.c:1783 msgid "When enabled, row security will be applied to all users." msgstr "Om aktiv så kommer radsäkerhet användas för alla användare." -#: utils/misc/guc.c:1661 -msgid "Check function bodies during CREATE FUNCTION." -msgstr "Kontrollera funktionskroppen vid CREATE FUNCTION." +#: utils/misc/guc.c:1791 +msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." +msgstr "Kontrollera funktionskroppen vid CREATE FUNCTION och CREATE PROCEDURE." -#: utils/misc/guc.c:1670 +#: utils/misc/guc.c:1800 msgid "Enable input of NULL elements in arrays." msgstr "Aktiverar inmatning av NULL-element i arrayer." -#: utils/misc/guc.c:1671 +#: utils/misc/guc.c:1801 msgid "When turned on, unquoted NULL in an array input value means a null value; otherwise it is taken literally." msgstr "Om påslagen så kommer ej citerade NULL i indatavärden för en array betyda värdet null, annars tolkas det bokstavligt." -#: utils/misc/guc.c:1687 +#: utils/misc/guc.c:1817 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS stöds inte längre; denna kan bara vara false." -#: utils/misc/guc.c:1697 +#: utils/misc/guc.c:1827 msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "Starta en subprocess för att fånga output från stderr och/eller csv-loggar till loggfiler." -#: utils/misc/guc.c:1706 +#: utils/misc/guc.c:1836 msgid "Truncate existing log files of same name during log rotation." msgstr "Trunkera existerande loggfiler med samma namn under loggrotering." -#: utils/misc/guc.c:1717 +#: utils/misc/guc.c:1847 msgid "Emit information about resource usage in sorting." msgstr "Skicka ut information om resursanvändning vid sortering." -#: utils/misc/guc.c:1731 +#: utils/misc/guc.c:1861 msgid "Generate debugging output for synchronized scanning." msgstr "Generera debug-output för synkroniserad skanning." -#: utils/misc/guc.c:1746 +#: utils/misc/guc.c:1876 msgid "Enable bounded sorting using heap sort." msgstr "Slår på begränsad sortering med heap-sort." -#: utils/misc/guc.c:1759 +#: utils/misc/guc.c:1889 msgid "Emit WAL-related debugging output." msgstr "Skicka ut WAL-relaterad debug-data." -#: utils/misc/guc.c:1771 -msgid "Datetimes are integer based." -msgstr "Datetime är heltalsbaserad" +#: utils/misc/guc.c:1901 +msgid "Shows whether datetimes are integer based." +msgstr "Visa hurvida datetime är heltalsbaserad" -#: utils/misc/guc.c:1782 +#: utils/misc/guc.c:1912 msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgstr "Anger hurvida Kerberos- och GSSAPI-användarnamn skall tolkas skiftlägesokänsligt." -#: utils/misc/guc.c:1792 +#: utils/misc/guc.c:1922 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Varna om backåtstreck-escape i vanliga stränglitteraler." -#: utils/misc/guc.c:1802 +#: utils/misc/guc.c:1932 msgid "Causes '...' strings to treat backslashes literally." msgstr "Gör att '...'-stängar tolkar bakåtstreck bokstavligt." -#: utils/misc/guc.c:1813 +#: utils/misc/guc.c:1943 msgid "Enable synchronized sequential scans." msgstr "Slå på synkroniserad sekvensiell skanning." -#: utils/misc/guc.c:1823 +#: utils/misc/guc.c:1953 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "Anger hurvida man skall inkludera eller exkludera transaktion för återställningmål." -#: utils/misc/guc.c:1833 +#: utils/misc/guc.c:1963 msgid "Allows connections and queries during recovery." msgstr "Tillåt anslutningar och frågor under återställning." -#: utils/misc/guc.c:1843 +#: utils/misc/guc.c:1973 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "Tillåter feedback från en hot standby till primären för att undvika frågekonflikter." -#: utils/misc/guc.c:1853 +#: utils/misc/guc.c:1983 +msgid "Shows whether hot standby is currently active." +msgstr "Visar hurvida hot standby är aktiv för närvarande." + +#: utils/misc/guc.c:1994 msgid "Allows modifications of the structure of system tables." msgstr "Tillåter strukturförändringar av systemtabeller." -#: utils/misc/guc.c:1864 +#: utils/misc/guc.c:2005 msgid "Disables reading from system indexes." msgstr "Stänger av läsning från systemindex." -#: utils/misc/guc.c:1865 +#: utils/misc/guc.c:2006 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "Det förhindrar inte uppdatering av index så det är helt säkert att använda. Det värsta som kan hända är att det är långsamt." -#: utils/misc/guc.c:1876 +#: utils/misc/guc.c:2017 +msgid "Allows tablespaces directly inside pg_tblspc, for testing." +msgstr "" + +#: utils/misc/guc.c:2028 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "Slår på bakåtkompabilitetsläge för rättighetskontroller på stora objekt." -#: utils/misc/guc.c:1877 +#: utils/misc/guc.c:2029 msgid "Skips privilege checks when reading or modifying large objects, for compatibility with PostgreSQL releases prior to 9.0." msgstr "Hoppar över rättighetskontroller vid läsning eller modifiering av stora objekt, för kompabilitet med PostgreSQL-releaser innan 9.0." -#: utils/misc/guc.c:1887 -msgid "Emit a warning for constructs that changed meaning since PostgreSQL 9.4." -msgstr "Skicka ut varning för konstruktioner som ändrat semantik sedan PostgreSQL 9.4." - -#: utils/misc/guc.c:1897 +#: utils/misc/guc.c:2039 msgid "When generating SQL fragments, quote all identifiers." msgstr "När SQL-fragment genereras så citera alla identifierare." -#: utils/misc/guc.c:1907 +#: utils/misc/guc.c:2049 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Visar om datachecksummor är påslagna för detta kluster." -#: utils/misc/guc.c:1918 +#: utils/misc/guc.c:2060 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "Lägg till sekvensnummer till syslog-meddelanden för att undvika att duplikat tas bort." -#: utils/misc/guc.c:1928 +#: utils/misc/guc.c:2070 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "Dela meddelanden som skickas till syslog till egna rader och begränsa till 1024 byte." -#: utils/misc/guc.c:1938 +#: utils/misc/guc.c:2080 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "Bestämmer om \"Gather\" och \"Gather Merge\" också exekverar subplaner." -#: utils/misc/guc.c:1939 -msgid "Should gather nodes also run subplans, or just gather tuples?" +#: utils/misc/guc.c:2081 +msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "Skall gather-noder också exekvera subplaner eller bara samla in tupler?" -#: utils/misc/guc.c:1949 +#: utils/misc/guc.c:2091 msgid "Allow JIT compilation." msgstr "Tillåt JIT-kompilering." -#: utils/misc/guc.c:1960 -msgid "Register JIT compiled function with debugger." -msgstr "Registrera JIT-kompilerad funktion hos debuggern." +#: utils/misc/guc.c:2102 +msgid "Register JIT-compiled functions with debugger." +msgstr "Registrera JIT-kompilerade funktioner hos debuggern." -#: utils/misc/guc.c:1977 +#: utils/misc/guc.c:2119 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "Skriv ut LLVM-bitkod för att möjliggöra JIT-debuggning." -#: utils/misc/guc.c:1988 +#: utils/misc/guc.c:2130 msgid "Allow JIT compilation of expressions." msgstr "Tillåt JIT-kompilering av uttryck." -#: utils/misc/guc.c:1999 -msgid "Register JIT compiled function with perf profiler." -msgstr "Registrera JIT-kompilerad funktion med perf-profilerare." +#: utils/misc/guc.c:2141 +msgid "Register JIT-compiled functions with perf profiler." +msgstr "Registrera JIT-kompilerade funktioner med perf-profilerare." -#: utils/misc/guc.c:2016 +#: utils/misc/guc.c:2158 msgid "Allow JIT compilation of tuple deforming." msgstr "Tillåt JIT-kompilering av tupeluppdelning." -#: utils/misc/guc.c:2027 +#: utils/misc/guc.c:2169 msgid "Whether to continue running after a failure to sync data files." msgstr "Hurvida vi skall fortsätta efter ett fel att synka datafiler." -#: utils/misc/guc.c:2036 +#: utils/misc/guc.c:2178 msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." msgstr "Anger hurvida en WAL-mottagare skall skapa en temporär replikeringsslot om ingen permanent slot är konfigurerad." -#: utils/misc/guc.c:2054 -msgid "Forces a switch to the next WAL file if a new file has not been started within N seconds." -msgstr "Tvingar byte till nästa WAL-fil om en ny fil inte har startats inom N sekunder." +#: utils/misc/guc.c:2196 +#, fuzzy +#| msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." +msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." +msgstr "Sätter väntetiden innan databasen försöker ta emot WAL efter ett misslyckat försök." -#: utils/misc/guc.c:2065 -msgid "Waits N seconds on connection startup after authentication." -msgstr "Väntar N sekunder vid anslutningsstart efter authentisering." +#: utils/misc/guc.c:2207 +#, fuzzy +#| msgid "Sets the maximum time to wait for WAL replication." +msgid "Sets the amount of time to wait after authentication on connection startup." +msgstr "Sätter maximal tid att vänta på WAL-replikering." -#: utils/misc/guc.c:2066 utils/misc/guc.c:2624 +#: utils/misc/guc.c:2209 utils/misc/guc.c:2830 msgid "This allows attaching a debugger to the process." msgstr "Detta tillåter att man ansluter en debugger till processen." -#: utils/misc/guc.c:2075 +#: utils/misc/guc.c:2218 msgid "Sets the default statistics target." msgstr "Sätter standardstatistikmålet." -#: utils/misc/guc.c:2076 +#: utils/misc/guc.c:2219 msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." msgstr "Detta gäller tabellkolumner som inte har ett kolumnspecifikt mål satt med ALTER TABLE SET STATISTICS." -#: utils/misc/guc.c:2085 +#: utils/misc/guc.c:2228 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "Sätter en övre gräns på FROM-listans storlek där subfrågor slås isär." -#: utils/misc/guc.c:2087 +#: utils/misc/guc.c:2230 msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." msgstr "Planeraren kommer slå samman subfrågor med yttre frågor om den resulterande FROM-listan inte har fler än så här många poster." -#: utils/misc/guc.c:2098 +#: utils/misc/guc.c:2241 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "Sätter en övre gräns på FROM-listans storlek där JOIN-konstruktioner plattas till." -#: utils/misc/guc.c:2100 +#: utils/misc/guc.c:2243 msgid "The planner will flatten explicit JOIN constructs into lists of FROM items whenever a list of no more than this many items would result." msgstr "Planeraren kommer platta till explicita JOIN-konstruktioner till listor av FROM-poster när resultatet blir en lista med max så här många poster." -#: utils/misc/guc.c:2111 +#: utils/misc/guc.c:2254 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "Sätter en undre gräns på antal FROM-poster när GEQO används." -#: utils/misc/guc.c:2121 +#: utils/misc/guc.c:2264 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: effort används som standard för andra GEQO-parametrar." -#: utils/misc/guc.c:2131 +#: utils/misc/guc.c:2274 msgid "GEQO: number of individuals in the population." msgstr "GEQO: antal individer i populationen." -#: utils/misc/guc.c:2132 utils/misc/guc.c:2142 +#: utils/misc/guc.c:2275 utils/misc/guc.c:2285 msgid "Zero selects a suitable default value." msgstr "Noll väljer ett lämpligt standardvärde." -#: utils/misc/guc.c:2141 +#: utils/misc/guc.c:2284 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: antal iterationer för algoritmen." -#: utils/misc/guc.c:2153 +#: utils/misc/guc.c:2296 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Sätter tiden som väntas på ett lås innan kontroll av deadlock sker." -#: utils/misc/guc.c:2164 +#: utils/misc/guc.c:2307 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "Sätter maximal fördröjning innan frågor avbryts när en \"hot standby\"-server processar arkiverad WAL-data." -#: utils/misc/guc.c:2175 +#: utils/misc/guc.c:2318 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "Sätter maximal fördröjning innan frågor avbryts när en \"hot stanby\"-server processar strömmad WAL-data." -#: utils/misc/guc.c:2186 +#: utils/misc/guc.c:2329 msgid "Sets the minimum delay for applying changes during recovery." msgstr "Ställer in minsta fördröjning för att applicera ändringar under återställning." -#: utils/misc/guc.c:2197 +#: utils/misc/guc.c:2340 msgid "Sets the maximum interval between WAL receiver status reports to the sending server." msgstr "Sätter maximalt intervall mellan statusrapporter till skickande server från WAL-mottagaren." -#: utils/misc/guc.c:2208 +#: utils/misc/guc.c:2351 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "Sätter maximal väntetid för att ta emot data från skickande server." -#: utils/misc/guc.c:2219 +#: utils/misc/guc.c:2362 msgid "Sets the maximum number of concurrent connections." msgstr "Sätter maximalt antal samtidiga anslutningar." -#: utils/misc/guc.c:2230 +#: utils/misc/guc.c:2373 msgid "Sets the number of connection slots reserved for superusers." -msgstr "Sätter antalet anslutningsslottar som reserverats för superanvändare." +msgstr "Sätter antalet anslutningsslottar som reserverats för superusers." + +#: utils/misc/guc.c:2383 +msgid "Amount of dynamic shared memory reserved at startup." +msgstr "Mängd dynamiskt delat minne som reserveras vid uppstart" -#: utils/misc/guc.c:2244 +#: utils/misc/guc.c:2398 msgid "Sets the number of shared memory buffers used by the server." msgstr "Sätter antalet delade minnesbuffrar som används av servern." -#: utils/misc/guc.c:2255 +#: utils/misc/guc.c:2409 +msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." +msgstr "" + +#: utils/misc/guc.c:2420 +#, fuzzy +#| msgid "Sets the number of disk-page buffers in shared memory for WAL." +msgid "Shows the number of huge pages needed for the main shared memory area." +msgstr "Sätter antal buffrar för disksidor i delat minne för WAL." + +#: utils/misc/guc.c:2421 +msgid "-1 indicates that the value could not be determined." +msgstr "" + +#: utils/misc/guc.c:2431 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Sätter maximalt antal temporära buffertar som används per session." -#: utils/misc/guc.c:2266 +#: utils/misc/guc.c:2442 msgid "Sets the TCP port the server listens on." msgstr "Sätter TCP-porten som servern lyssnar på." -#: utils/misc/guc.c:2276 +#: utils/misc/guc.c:2452 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Sätter accessrättigheter för Unix-domainuttag (socket)." -#: utils/misc/guc.c:2277 +#: utils/misc/guc.c:2453 msgid "Unix-domain sockets use the usual Unix file system permission set. The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Unixdomänuttag (socket) använder unix vanliga filsystemsrättigheter. Parametervärdet förväntas vara en numerisk rättighetsangivelse så som accepteras av systemanropen chmod och umask. (För att använda det vanliga oktala formatet så måste numret börja med 0 (noll).)" -#: utils/misc/guc.c:2291 +#: utils/misc/guc.c:2467 msgid "Sets the file permissions for log files." msgstr "Sätter filrättigheter för loggfiler." -#: utils/misc/guc.c:2292 +#: utils/misc/guc.c:2468 msgid "The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Parametervärdet förväntas vara en numerisk rättighetsangivelse så som accepteras av systemanropen chmod och umask. (För att använda det vanliga oktala formatet så måste numret börja med 0 (noll).)" -#: utils/misc/guc.c:2306 -msgid "Mode of the data directory." -msgstr "Läge för datakatalog." +#: utils/misc/guc.c:2482 +msgid "Shows the mode of the data directory." +msgstr "Visar rättigheter för datakatalog" -#: utils/misc/guc.c:2307 +#: utils/misc/guc.c:2483 msgid "The parameter value is a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Parametervärdet är en numerisk rättighetsangivelse så som accepteras av systemanropen chmod och umask. (För att använda det vanliga oktala formatet så måste numret börja med 0 (noll).)" -#: utils/misc/guc.c:2320 +#: utils/misc/guc.c:2496 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Sätter maximalt minne som används för frågors arbetsyta." -#: utils/misc/guc.c:2321 +#: utils/misc/guc.c:2497 msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." msgstr "Så här mycket minne kan användas av varje intern sorteringsoperation resp. hash-tabell innan temporära filer på disk börjar användas." -#: utils/misc/guc.c:2333 +#: utils/misc/guc.c:2509 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Sätter det maximala minnet som får användas för underhållsoperationer." -#: utils/misc/guc.c:2334 +#: utils/misc/guc.c:2510 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Detta inkluderar operationer som VACUUM och CREATE INDEX." -#: utils/misc/guc.c:2344 +#: utils/misc/guc.c:2520 msgid "Sets the maximum memory to be used for logical decoding." msgstr "Sätter det maximala minnet som får användas för logisk avkodning." -#: utils/misc/guc.c:2345 +#: utils/misc/guc.c:2521 msgid "This much memory can be used by each internal reorder buffer before spilling to disk." msgstr "Så här mycket minne kan användas av varje intern omsorteringsbuffer innan data spills till disk." -#: utils/misc/guc.c:2361 +#: utils/misc/guc.c:2537 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Sätter det maximala stackdjupet, i kilobyte." -#: utils/misc/guc.c:2372 +#: utils/misc/guc.c:2548 msgid "Limits the total size of all temporary files used by each process." msgstr "Begränsar den totala storleken för alla temporära filer som används i en process." -#: utils/misc/guc.c:2373 +#: utils/misc/guc.c:2549 msgid "-1 means no limit." msgstr "-1 betyder ingen gräns." -#: utils/misc/guc.c:2383 +#: utils/misc/guc.c:2559 msgid "Vacuum cost for a page found in the buffer cache." msgstr "Vacuum-kostnad för en sida som hittas i buffer-cache:n." -#: utils/misc/guc.c:2393 +#: utils/misc/guc.c:2569 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "Vacuum-kostnad för en sida som inte hittas i buffer-cache:n." -#: utils/misc/guc.c:2403 +#: utils/misc/guc.c:2579 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Vacuum-kostnad för sidor som smutsats ner vid vacuum." -#: utils/misc/guc.c:2413 +#: utils/misc/guc.c:2589 msgid "Vacuum cost amount available before napping." msgstr "Vacuum-kostnad kvar innan pausande." -#: utils/misc/guc.c:2423 +#: utils/misc/guc.c:2599 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Vacuum-kostnad kvar innan pausande, för autovacuum." -#: utils/misc/guc.c:2433 +#: utils/misc/guc.c:2609 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "Sätter det maximala antalet filer som en serverprocess kan ha öppna på en gång." -#: utils/misc/guc.c:2446 +#: utils/misc/guc.c:2622 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Sätter det maximala antalet förberedda transaktioner man får ha på en gång." -#: utils/misc/guc.c:2457 +#: utils/misc/guc.c:2633 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Sätter minsta tabell-OID för spårning av lås." -#: utils/misc/guc.c:2458 +#: utils/misc/guc.c:2634 msgid "Is used to avoid output on system tables." msgstr "Används för att undvika utdata för systemtabeller." -#: utils/misc/guc.c:2467 +#: utils/misc/guc.c:2643 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Sätter OID för tabellen med ovillkorlig låsspårning." -#: utils/misc/guc.c:2479 +#: utils/misc/guc.c:2655 msgid "Sets the maximum allowed duration of any statement." msgstr "Sätter den maximala tiden som en sats får köra." -#: utils/misc/guc.c:2480 utils/misc/guc.c:2491 utils/misc/guc.c:2502 +#: utils/misc/guc.c:2656 utils/misc/guc.c:2667 utils/misc/guc.c:2678 +#: utils/misc/guc.c:2689 msgid "A value of 0 turns off the timeout." msgstr "Värdet 0 stänger av timeout:en." -#: utils/misc/guc.c:2490 +#: utils/misc/guc.c:2666 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Sätter den maximala tiden som man får vänta på ett lås." -#: utils/misc/guc.c:2501 -msgid "Sets the maximum allowed duration of any idling transaction." -msgstr "Sätter den maximala tiden som en transaktion tillås vara \"idle\"." +#: utils/misc/guc.c:2677 +msgid "Sets the maximum allowed idle time between queries, when in a transaction." +msgstr "Sätter den maximalt tillåtna inaktiva tiden mellan frågor i en transaktion." -#: utils/misc/guc.c:2512 +#: utils/misc/guc.c:2688 +msgid "Sets the maximum allowed idle time between queries, when not in a transaction." +msgstr "Sätter den maximalt tillåtna inaktiva tiden mellan frågor utanför en transaktion." + +#: utils/misc/guc.c:2699 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "Minimal ålder där VACUUM skall frysa en tabellrad." -#: utils/misc/guc.c:2522 +#: utils/misc/guc.c:2709 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "Ålder där VACUUM skall skanna hela tabellen för att frysa tupler." -#: utils/misc/guc.c:2532 +#: utils/misc/guc.c:2719 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "Minsta ålder där VACUUM skall frysa en MultiXactId i en tabellrad." -#: utils/misc/guc.c:2542 +#: utils/misc/guc.c:2729 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "Multixact-ålder där VACUUM skall skanna hela tabellen för att frysa tupler." -#: utils/misc/guc.c:2552 +#: utils/misc/guc.c:2739 msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." msgstr "Antalet transaktioner som VACUUM och HOT-städning skall fördröjas (om någon)." -#: utils/misc/guc.c:2565 +#: utils/misc/guc.c:2748 +msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "Ålder där VACUUM skall startas som skyddsåtgärd för att undvika wraparound-stopp." + +#: utils/misc/guc.c:2757 +msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "Multixact-ålder där VACUUM skall startas som skyddsåtgärd för att undvika wraparound-stopp." + +#: utils/misc/guc.c:2770 msgid "Sets the maximum number of locks per transaction." msgstr "Sätter det maximala antalet lås per transaktion." -#: utils/misc/guc.c:2566 +#: utils/misc/guc.c:2771 msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." msgstr "Den delade låstabellen har storlek efter antagandet att maximalt max_locks_per_transaction * max_connections olika objekt kommer behöva låsas vid en tidpunkt." -#: utils/misc/guc.c:2577 +#: utils/misc/guc.c:2782 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Sätter det maximala antalet predikatlås per transaktion." -#: utils/misc/guc.c:2578 +#: utils/misc/guc.c:2783 msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." msgstr "Den delade predikatlåstabellen har storlek efter antagandet att maximalt max_pred_locks_per_transaction * max_connections olika objekt kommer behöva låsas vid en tidpunkt." -#: utils/misc/guc.c:2589 +#: utils/misc/guc.c:2794 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "Sätter det maximala antalet predikatlåsta sidor och tupler per relation." -#: utils/misc/guc.c:2590 +#: utils/misc/guc.c:2795 msgid "If more than this total of pages and tuples in the same relation are locked by a connection, those locks are replaced by a relation-level lock." msgstr "Om fler än detta totala antal sidor och tupler för samma relation är låsta av en anslutning så ersätts dessa lås med ett lås på relationen." -#: utils/misc/guc.c:2600 +#: utils/misc/guc.c:2805 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "Sätter det maximala antalet predikatlåsta tupler per sida." -#: utils/misc/guc.c:2601 +#: utils/misc/guc.c:2806 msgid "If more than this number of tuples on the same page are locked by a connection, those locks are replaced by a page-level lock." msgstr "Om fler än detta antal tupler på samma sida är låsta av en anslutning så ersätts dessa lås med ett lås på sidan." -#: utils/misc/guc.c:2611 +#: utils/misc/guc.c:2816 msgid "Sets the maximum allowed time to complete client authentication." msgstr "Sätter maximalt tillåten tid att slutföra klientautentisering." -#: utils/misc/guc.c:2623 -msgid "Waits N seconds on connection startup before authentication." -msgstr "Väntar N sekunder efter anslutning innan autentisering." +#: utils/misc/guc.c:2828 +#, fuzzy +#| msgid "Sets the maximum time to wait for WAL replication." +msgid "Sets the amount of time to wait before authentication on connection startup." +msgstr "Sätter maximal tid att vänta på WAL-replikering." + +#: utils/misc/guc.c:2840 +msgid "Maximum buffer size for reading ahead in the WAL during recovery." +msgstr "" -#: utils/misc/guc.c:2634 +#: utils/misc/guc.c:2841 +msgid "This controls the maximum distance we can read ahead in the WAL to prefetch referenced blocks." +msgstr "" + +#: utils/misc/guc.c:2851 msgid "Sets the size of WAL files held for standby servers." msgstr "Sätter storlek på WAL-filer som sparas för standby-servrar." -#: utils/misc/guc.c:2645 +#: utils/misc/guc.c:2862 msgid "Sets the minimum size to shrink the WAL to." msgstr "Sätter maximal storlek som WAL kan krympas till." -#: utils/misc/guc.c:2657 +#: utils/misc/guc.c:2874 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Sätter WAL-storlek som utlöser en checkpoint." -#: utils/misc/guc.c:2669 +#: utils/misc/guc.c:2886 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "Sätter maximal tid mellan två automatiska WAL-checkpoint:er." -#: utils/misc/guc.c:2680 -msgid "Enables warnings if checkpoint segments are filled more frequently than this." -msgstr "Slår på varning om checkpoint-segment fylls oftare än det här." +#: utils/misc/guc.c:2897 +msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." +msgstr "" -#: utils/misc/guc.c:2682 -msgid "Write a message to the server log if checkpoints caused by the filling of checkpoint segment files happens more frequently than this number of seconds. Zero turns off the warning." +#: utils/misc/guc.c:2899 +#, fuzzy +#| msgid "Write a message to the server log if checkpoints caused by the filling of checkpoint segment files happens more frequently than this number of seconds. Zero turns off the warning." +msgid "Write a message to the server log if checkpoints caused by the filling of WAL segment files happen more frequently than this amount of time. Zero turns off the warning." msgstr "Skriv ett meddelande i serverloggen om checkpoint:er som orsakas av fulla checkpoint-segmentfiler händer oftare än detta antal sekunder. Noll stänger av varningen." -#: utils/misc/guc.c:2694 utils/misc/guc.c:2910 utils/misc/guc.c:2957 +#: utils/misc/guc.c:2912 utils/misc/guc.c:3130 utils/misc/guc.c:3178 msgid "Number of pages after which previously performed writes are flushed to disk." msgstr "Antal sidor varefter tidigare skrivningar flush:as till disk." -#: utils/misc/guc.c:2705 +#: utils/misc/guc.c:2923 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "Sätter antal buffrar för disksidor i delat minne för WAL." -#: utils/misc/guc.c:2716 +#: utils/misc/guc.c:2934 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Tid mellan WAL-flush:ar utförda i WAL-skrivaren." -#: utils/misc/guc.c:2727 +#: utils/misc/guc.c:2945 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "Mängden WAL utskrivna av WAL-skrivaren som utlöser en flush." -#: utils/misc/guc.c:2738 -msgid "Size of new file to fsync instead of writing WAL." -msgstr "Storlek på ny fil som skall fsync:as istället för att skriva till WAL." +#: utils/misc/guc.c:2956 +msgid "Minimum size of new file to fsync instead of writing WAL." +msgstr "Minimal storlek på ny fil som skall fsync:as istället för att skriva till WAL." -#: utils/misc/guc.c:2749 +#: utils/misc/guc.c:2967 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "Sätter maximalt antal samtidigt körande WAL-sändarprocesser." -#: utils/misc/guc.c:2760 +#: utils/misc/guc.c:2978 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Sätter maximalt antal samtidigt definierade replikeringsslottar." -#: utils/misc/guc.c:2770 +#: utils/misc/guc.c:2988 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "Sätter maximalt WAL-storlek som kan reserveras av replikeringsslottar." -#: utils/misc/guc.c:2771 +#: utils/misc/guc.c:2989 msgid "Replication slots will be marked as failed, and segments released for deletion or recycling, if this much space is occupied by WAL on disk." msgstr "Replikeringsslottar kommer markeras som misslyckade och segment kommer släppas till borttagning eller återanvändning när så här mycket plats används av WAL på disk." -#: utils/misc/guc.c:2783 +#: utils/misc/guc.c:3001 msgid "Sets the maximum time to wait for WAL replication." msgstr "Sätter maximal tid att vänta på WAL-replikering." -#: utils/misc/guc.c:2794 +#: utils/misc/guc.c:3012 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "Sätter fördröjning i mikrosekunder mellan transaktions-commit ochj flush:ning av WAL till disk." -#: utils/misc/guc.c:2806 -msgid "Sets the minimum concurrent open transactions before performing commit_delay." +#: utils/misc/guc.c:3024 +#, fuzzy +#| msgid "Sets the minimum concurrent open transactions before performing commit_delay." +msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." msgstr "Sätter minsta antal samtida öppna transaktioner innan vi utför en commit_delay." -#: utils/misc/guc.c:2817 +#: utils/misc/guc.c:3035 msgid "Sets the number of digits displayed for floating-point values." msgstr "Sätter antal siffror som visas för flyttalsvärden." -#: utils/misc/guc.c:2818 +#: utils/misc/guc.c:3036 msgid "This affects real, double precision, and geometric data types. A zero or negative parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate). Any value greater than zero selects precise output mode." msgstr "Detta påverkar real, double precision och geometriska datatyper. Noll eller negativt parametervärde läggs till standard antal siffror (FLT_DIG eller DBL_DIG respektive). Ett värde större än noll väljer ett exakt utmatningsläge." -#: utils/misc/guc.c:2830 +#: utils/misc/guc.c:3048 msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." msgstr "Sätter minimal körtid där ett urval av långsammare satser kommer loggas. Urvalet bestämms av log_statement_sample_rate." -#: utils/misc/guc.c:2833 +#: utils/misc/guc.c:3051 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "Noll loggar ett urval som inkluderar alla frågor. -1 stänger av denna funktion." -#: utils/misc/guc.c:2843 +#: utils/misc/guc.c:3061 msgid "Sets the minimum execution time above which all statements will be logged." msgstr "Sätter minimal körtid där alla långsammare satser kommer loggas." -#: utils/misc/guc.c:2845 +#: utils/misc/guc.c:3063 msgid "Zero prints all queries. -1 turns this feature off." msgstr "Noll skriver ut alla frågor. -1 stänger av denna finess." -#: utils/misc/guc.c:2855 +#: utils/misc/guc.c:3073 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "Sätter minimal körtid där långsammare autovacuum-operationer kommer loggas." -#: utils/misc/guc.c:2857 +#: utils/misc/guc.c:3075 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "Noll skriver ut alla operationer. -1 stänger av autovacuum." -#: utils/misc/guc.c:2867 -msgid "When logging statements, limit logged parameter values to first N bytes." -msgstr "När satser loggas så begränsa loggade parametervärden till de första N byten." +#: utils/misc/guc.c:3085 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." +msgstr "" -#: utils/misc/guc.c:2868 utils/misc/guc.c:2879 +#: utils/misc/guc.c:3087 utils/misc/guc.c:3099 msgid "-1 to print values in full." msgstr "-1 för att skriva ut hela värden." -#: utils/misc/guc.c:2878 -msgid "When reporting an error, limit logged parameter values to first N bytes." -msgstr "Vid rapportering av fel så begränsa loggade parametervärden till de första N byten." +#: utils/misc/guc.c:3097 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." +msgstr "" -#: utils/misc/guc.c:2889 +#: utils/misc/guc.c:3109 msgid "Background writer sleep time between rounds." msgstr "Bakgrundsskrivarens sleep-tid mellan körningar." -#: utils/misc/guc.c:2900 +#: utils/misc/guc.c:3120 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "Bakgrundsskrivarens maximala antal LRU-sidor som flush:as per omgång." -#: utils/misc/guc.c:2923 +#: utils/misc/guc.c:3143 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "Antal samtidiga förfrågningar som kan effektivt kan hanteras av disksystemet." -#: utils/misc/guc.c:2924 -msgid "For RAID arrays, this should be approximately the number of drive spindles in the array." -msgstr "För RAID-array:er så borde det vara ungerfär så många som antalet spindlar i array:en." - -#: utils/misc/guc.c:2941 +#: utils/misc/guc.c:3161 msgid "A variant of effective_io_concurrency that is used for maintenance work." msgstr "En variant av effective_io_concurrency som används för underhållsarbete." -#: utils/misc/guc.c:2970 +#: utils/misc/guc.c:3191 msgid "Maximum number of concurrent worker processes." msgstr "Maximalt antal samtidiga arbetsprocesser." -#: utils/misc/guc.c:2982 +#: utils/misc/guc.c:3203 msgid "Maximum number of logical replication worker processes." msgstr "Maximalt antal arbetsprocesser för logisk replikering." -#: utils/misc/guc.c:2994 +#: utils/misc/guc.c:3215 msgid "Maximum number of table synchronization workers per subscription." msgstr "Maximalt antal tabellsynkroniseringsarbetare per prenumeration." -#: utils/misc/guc.c:3004 -msgid "Automatic log file rotation will occur after N minutes." -msgstr "Automatisk loggfilsrotering kommer ske efter N minuter." +#: utils/misc/guc.c:3225 +#, fuzzy +#| msgid "Sets the maximum time to wait for WAL replication." +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "Sätter maximal tid att vänta på WAL-replikering." -#: utils/misc/guc.c:3015 -msgid "Automatic log file rotation will occur after N kilobytes." -msgstr "Automatisk loggfilsrotering kommer ske efter N kilobyte." +#: utils/misc/guc.c:3237 +#, fuzzy +#| msgid "Sets the maximum WAL size that can be reserved by replication slots." +msgid "Sets the maximum size a log file can reach before being rotated." +msgstr "Sätter maximalt WAL-storlek som kan reserveras av replikeringsslottar." -#: utils/misc/guc.c:3026 +#: utils/misc/guc.c:3249 msgid "Shows the maximum number of function arguments." msgstr "Visar maximalt antal funktionsargument." -#: utils/misc/guc.c:3037 +#: utils/misc/guc.c:3260 msgid "Shows the maximum number of index keys." msgstr "Visar maximalt antal indexnycklar." -#: utils/misc/guc.c:3048 +#: utils/misc/guc.c:3271 msgid "Shows the maximum identifier length." msgstr "Visar den maximala identifierarlängden." -#: utils/misc/guc.c:3059 +#: utils/misc/guc.c:3282 msgid "Shows the size of a disk block." msgstr "Visar storleken på ett diskblock." -#: utils/misc/guc.c:3070 +#: utils/misc/guc.c:3293 msgid "Shows the number of pages per disk file." msgstr "Visar antal sidor per diskfil." -#: utils/misc/guc.c:3081 +#: utils/misc/guc.c:3304 msgid "Shows the block size in the write ahead log." msgstr "Visar blockstorleken i the write-ahead-loggen." -#: utils/misc/guc.c:3092 +#: utils/misc/guc.c:3315 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "Sätter väntetiden innan databasen försöker ta emot WAL efter ett misslyckat försök." -#: utils/misc/guc.c:3104 +#: utils/misc/guc.c:3327 msgid "Shows the size of write ahead log segments." msgstr "Visar storleken på write-ahead-log-segment." -#: utils/misc/guc.c:3117 +#: utils/misc/guc.c:3340 msgid "Time to sleep between autovacuum runs." msgstr "Tid att sova mellan körningar av autovacuum." -#: utils/misc/guc.c:3127 +#: utils/misc/guc.c:3350 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Minst antal tupel-uppdateringar eller raderingar innan vacuum." -#: utils/misc/guc.c:3136 +#: utils/misc/guc.c:3359 msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." msgstr "Minsta antal tupel-insert innnan vacuum eller -1 för att stänga av insert-vacuum." -#: utils/misc/guc.c:3145 +#: utils/misc/guc.c:3368 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "Minsta antal tupel-insert, -update eller -delete innan analyze." -#: utils/misc/guc.c:3155 +#: utils/misc/guc.c:3378 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "Ålder då autovacuum körs på en tabell för att förhindra wrapaound på transaktions-ID." -#: utils/misc/guc.c:3166 +#: utils/misc/guc.c:3390 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "Ålder på multixact då autovacuum körs på en tabell för att förhindra wrapaound på multixact." -#: utils/misc/guc.c:3176 +#: utils/misc/guc.c:3400 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "Sätter maximalt antal samtidigt körande arbetsprocesser för autovacuum." -#: utils/misc/guc.c:3186 +#: utils/misc/guc.c:3410 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "Sätter maximalt antal parallella processer per underhållsoperation." -#: utils/misc/guc.c:3196 +#: utils/misc/guc.c:3420 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Sätter maximalt antal parallella processer per exekveringsnod." -#: utils/misc/guc.c:3207 +#: utils/misc/guc.c:3431 msgid "Sets the maximum number of parallel workers that can be active at one time." msgstr "Sätter maximalt antal parallella arbetare som kan vara aktiva på en gång." -#: utils/misc/guc.c:3218 +#: utils/misc/guc.c:3442 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "Sätter maximalt minne som kan användas av varje arbetsprocess för autovacuum." -#: utils/misc/guc.c:3229 +#: utils/misc/guc.c:3453 msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." msgstr "Tid innan ett snapshot är för gammalt för att läsa sidor som ändrats efter snapshot:en tagits." -#: utils/misc/guc.c:3230 +#: utils/misc/guc.c:3454 msgid "A value of -1 disables this feature." msgstr "Värdet -1 stänger av denna funktion." -#: utils/misc/guc.c:3240 +#: utils/misc/guc.c:3464 msgid "Time between issuing TCP keepalives." msgstr "Tid mellan skickande av TCP-keepalive." -#: utils/misc/guc.c:3241 utils/misc/guc.c:3252 utils/misc/guc.c:3376 +#: utils/misc/guc.c:3465 utils/misc/guc.c:3476 utils/misc/guc.c:3600 msgid "A value of 0 uses the system default." msgstr "Värdet 0 anger systemets standardvärde." -#: utils/misc/guc.c:3251 +#: utils/misc/guc.c:3475 msgid "Time between TCP keepalive retransmits." msgstr "Tid mellan omsändning av TCP-keepalive." -#: utils/misc/guc.c:3262 +#: utils/misc/guc.c:3486 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "SSL-förhandling stöds inte längre; denna kan bara vara 0." -#: utils/misc/guc.c:3273 +#: utils/misc/guc.c:3497 msgid "Maximum number of TCP keepalive retransmits." msgstr "Maximalt antal omsändningar av TCP-keepalive." -#: utils/misc/guc.c:3274 +#: utils/misc/guc.c:3498 msgid "This controls the number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." msgstr "Detta bestämmer antalet keepalive-omsändingar i rad som kan försvinna innan en anslutning anses vara död. Värdet 0 betyder systemstandardvärdet." -#: utils/misc/guc.c:3285 +#: utils/misc/guc.c:3509 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "Sätter maximalt tillåtna resultat för exakt sökning med GIN." -#: utils/misc/guc.c:3296 +#: utils/misc/guc.c:3520 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "Sätter planerarens antagande om totala storleken på datacachen." -#: utils/misc/guc.c:3297 +#: utils/misc/guc.c:3521 msgid "That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." msgstr "Det är totala storleken på cachen (kernelcache och delade buffertar) som användas för PostgreSQLs datafiler. Det mäts i disksidor som normalt är 8 kb styck." -#: utils/misc/guc.c:3308 +#: utils/misc/guc.c:3532 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "Sätter minsta mängd tabelldata för en parallell skanning." -#: utils/misc/guc.c:3309 +#: utils/misc/guc.c:3533 msgid "If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered." msgstr "Om planeraren beräknar att den kommer läsa för få tabellsidor för att nå denna gräns så kommer den inte försöka med en parallell skanning." -#: utils/misc/guc.c:3319 +#: utils/misc/guc.c:3543 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "Anger minimala mängden indexdata för en parallell scan." -#: utils/misc/guc.c:3320 +#: utils/misc/guc.c:3544 msgid "If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered." msgstr "Om planeraren beräknar att den kommer läsa för få indexsidor för att nå denna gräns så kommer den inte försöka med en parallell skanning." -#: utils/misc/guc.c:3331 +#: utils/misc/guc.c:3555 msgid "Shows the server version as an integer." msgstr "Visar serverns version som ett heltal." -#: utils/misc/guc.c:3342 +#: utils/misc/guc.c:3566 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "Logga användning av temporära filer som är större än detta antal kilobyte." -#: utils/misc/guc.c:3343 +#: utils/misc/guc.c:3567 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "Noll loggar alla filer. Standard är -1 (stänger av denna finess)." -#: utils/misc/guc.c:3353 +#: utils/misc/guc.c:3577 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Ställer in storleken reserverad för pg_stat_activity.query, i byte." -#: utils/misc/guc.c:3364 +#: utils/misc/guc.c:3588 msgid "Sets the maximum size of the pending list for GIN index." msgstr "Sätter maximal storlek på väntelistan för GIN-index." -#: utils/misc/guc.c:3375 +#: utils/misc/guc.c:3599 msgid "TCP user timeout." msgstr "Användartimeout för TCP." -#: utils/misc/guc.c:3395 +#: utils/misc/guc.c:3610 +msgid "The size of huge page that should be requested." +msgstr "Storleken på stora sidor skall hämtas." + +#: utils/misc/guc.c:3621 +msgid "Aggressively flush system caches for debugging purposes." +msgstr "Flush:a systemcache aggressivt för att förenkla debugging." + +#: utils/misc/guc.c:3644 +msgid "Sets the time interval between checks for disconnection while running queries." +msgstr "Sätter tidsintervall mellan test för nedkoppling när frågor körs." + +#: utils/misc/guc.c:3655 +msgid "Time between progress updates for long-running startup operations." +msgstr "" + +#: utils/misc/guc.c:3657 +#, fuzzy +#| msgid "Zero prints all queries. -1 turns this feature off." +msgid "0 turns this feature off." +msgstr "Noll skriver ut alla frågor. -1 stänger av denna finess." + +#: utils/misc/guc.c:3676 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "Ställer in planerarens estimat av kostnaden för att hämta en disksida sekvensiellt." -#: utils/misc/guc.c:3406 +#: utils/misc/guc.c:3687 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "Ställer in planerarens estimat av kostnaden för att hämta en disksida icke-sekvensiellt." -#: utils/misc/guc.c:3417 +#: utils/misc/guc.c:3698 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "Ställer in planerarens estimat av kostnaden för att processa varje tupel (rad)." -#: utils/misc/guc.c:3428 +#: utils/misc/guc.c:3709 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." msgstr "Sätter planerarens kostnadsuppskattning för att processa varje indexpost under en indexskanning." -#: utils/misc/guc.c:3439 +#: utils/misc/guc.c:3720 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "Sätter planerarens kostnadsuppskattning för att processa varje operator- eller funktions-anrop." -#: utils/misc/guc.c:3450 -msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to master backend." -msgstr "Sätter planerarens kostnadsuppskattning för att skicka varje tupel (rad) från en arbetare till huvud-backend:en. " +#: utils/misc/guc.c:3731 +msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." +msgstr "Sätter planerarens kostnadsuppskattning för att skicka varje tupel (rad) från en arbetare till ledar-backend:en. " -#: utils/misc/guc.c:3461 +#: utils/misc/guc.c:3742 msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." msgstr "Sätter planerarens kostnadsuppskattning för att starta upp en arbetsprocess för en parallell fråga." -#: utils/misc/guc.c:3473 +#: utils/misc/guc.c:3754 msgid "Perform JIT compilation if query is more expensive." msgstr "Utför JIT-kompilering om frågan är dyrare." -#: utils/misc/guc.c:3474 +#: utils/misc/guc.c:3755 msgid "-1 disables JIT compilation." msgstr "-1 stänger av JIT-kompilering." -#: utils/misc/guc.c:3484 -msgid "Optimize JITed functions if query is more expensive." -msgstr "Optimera JIT-funktioner om frågan är dyrare." +#: utils/misc/guc.c:3765 +msgid "Optimize JIT-compiled functions if query is more expensive." +msgstr "Optimera JIT-kompilerade funktioner om frågan är dyrare." -#: utils/misc/guc.c:3485 +#: utils/misc/guc.c:3766 msgid "-1 disables optimization." msgstr "-1 stänger av optimering." -#: utils/misc/guc.c:3495 +#: utils/misc/guc.c:3776 msgid "Perform JIT inlining if query is more expensive." msgstr "Utför JIT-\"inlining\" om frågan är dyrare." -#: utils/misc/guc.c:3496 +#: utils/misc/guc.c:3777 msgid "-1 disables inlining." msgstr "-1 stänger av \"inlining\"" -#: utils/misc/guc.c:3506 +#: utils/misc/guc.c:3787 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgstr "Sätter planerarens uppskattning av hur stor del av markörens rader som kommer hämtas. " -#: utils/misc/guc.c:3518 +#: utils/misc/guc.c:3799 +#, fuzzy +#| msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." +msgid "Sets the planner's estimate of the average size of a recursive query's working table." +msgstr "Sätter planerarens uppskattning av hur stor del av markörens rader som kommer hämtas. " + +#: utils/misc/guc.c:3811 msgid "GEQO: selective pressure within the population." msgstr "GEQO: selektionstryck inom populationen." -#: utils/misc/guc.c:3529 +#: utils/misc/guc.c:3822 msgid "GEQO: seed for random path selection." msgstr "GEQO: slumptalsfrö för val av slumpad sökväg." -#: utils/misc/guc.c:3540 +#: utils/misc/guc.c:3833 msgid "Multiple of work_mem to use for hash tables." msgstr "Multipel av work_mem för att använda till hash-tabeller." -#: utils/misc/guc.c:3551 +#: utils/misc/guc.c:3844 msgid "Multiple of the average buffer usage to free per round." msgstr "Multipel av genomsnittlig bufferanvändning som frias per runda." -#: utils/misc/guc.c:3561 +#: utils/misc/guc.c:3854 msgid "Sets the seed for random-number generation." msgstr "Sätter fröet för slumptalsgeneratorn." -#: utils/misc/guc.c:3572 +#: utils/misc/guc.c:3865 msgid "Vacuum cost delay in milliseconds." msgstr "Städkostfördröjning i millisekunder." -#: utils/misc/guc.c:3583 +#: utils/misc/guc.c:3876 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Städkostfördröjning i millisekunder, för autovacuum." -#: utils/misc/guc.c:3594 +#: utils/misc/guc.c:3887 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "Antalet tupeluppdateringar eller borttagningar innan vacuum relativt reltuples." -#: utils/misc/guc.c:3604 +#: utils/misc/guc.c:3897 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "Antal tupelinsättningar innan vacuum relativt reltuples." -#: utils/misc/guc.c:3614 +#: utils/misc/guc.c:3907 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "Antalet tupelinsättningar, uppdateringar eller borttagningar innan analyze relativt reltuples." -#: utils/misc/guc.c:3624 +#: utils/misc/guc.c:3917 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." msgstr "Tid lagd på att flusha nedsmutsade buffrar vid checkpoint relativt checkpoint-intervallet." -#: utils/misc/guc.c:3634 -msgid "Number of tuple inserts prior to index cleanup as a fraction of reltuples." -msgstr "Antal tupelinsättningar innan indexuppstädning relativt reltuples." - -#: utils/misc/guc.c:3644 +#: utils/misc/guc.c:3927 msgid "Fraction of statements exceeding log_min_duration_sample to be logged." msgstr "Bråkdel av satser som överskrider log_min_duration_sample som skall loggas." -#: utils/misc/guc.c:3645 +#: utils/misc/guc.c:3928 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "Använd ett värde mellan 0.0 (logga aldrig) och 1.0 (logga alltid)." -#: utils/misc/guc.c:3654 -msgid "Set the fraction of transactions to log for new transactions." -msgstr "Ställer in bråkdel av transaktioner som skall loggas av nya transaktioner." +#: utils/misc/guc.c:3937 +msgid "Sets the fraction of transactions from which to log all statements." +msgstr "Ställer in bråkdel av transaktionerna från vilka alla satser skall loggas." -#: utils/misc/guc.c:3655 -msgid "Logs all statements from a fraction of transactions. Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." -msgstr "Loggar all satser från en bråkdel av transaktionerna. Använd ett värde mellan 0.0 (logga aldrig) till 1.0 (logga all satser i alla transaktioner)." +#: utils/misc/guc.c:3938 +msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." +msgstr "Använd ett värde mellan 0.0 (logga aldrig) till 1.0 (logga all satser i alla transaktioner)." -#: utils/misc/guc.c:3675 +#: utils/misc/guc.c:3957 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "Sätter shell-kommandot som kommer anropas för att arkivera en WAL-fil." -#: utils/misc/guc.c:3685 +#: utils/misc/guc.c:3958 +msgid "This is used only if \"archive_library\" is not set." +msgstr "" + +#: utils/misc/guc.c:3967 +#, fuzzy +#| msgid "Sets the shell command that will be called to archive a WAL file." +msgid "Sets the library that will be called to archive a WAL file." +msgstr "Sätter shell-kommandot som kommer anropas för att arkivera en WAL-fil." + +#: utils/misc/guc.c:3968 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "" + +#: utils/misc/guc.c:3977 msgid "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "Sätter shell-kommandot som kommer anropas för att få en arkiverad WAL-fil." -#: utils/misc/guc.c:3695 +#: utils/misc/guc.c:3987 msgid "Sets the shell command that will be executed at every restart point." msgstr "Sätter shell-kommandot som kommer anropas vid varje omstartspunkt." -#: utils/misc/guc.c:3705 +#: utils/misc/guc.c:3997 msgid "Sets the shell command that will be executed once at the end of recovery." msgstr "Sätter shell-kommandot som kommer anropas en gång i slutet av en återställning." -#: utils/misc/guc.c:3715 +#: utils/misc/guc.c:4007 msgid "Specifies the timeline to recover into." msgstr "Anger tidslinjen att återställa till." -#: utils/misc/guc.c:3725 +#: utils/misc/guc.c:4017 msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." msgstr "Sätt till \"immediate\" för att avsluta återställning så snart ett konsistent tillstånd uppnås." -#: utils/misc/guc.c:3734 +#: utils/misc/guc.c:4026 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "Sätter transaktions-ID som återställning kommer gå till." -#: utils/misc/guc.c:3743 +#: utils/misc/guc.c:4035 msgid "Sets the time stamp up to which recovery will proceed." msgstr "Sätter tidsstämpel som återställning kommer gå till." -#: utils/misc/guc.c:3752 +#: utils/misc/guc.c:4044 msgid "Sets the named restore point up to which recovery will proceed." msgstr "Sätter namngiven återställningspunkt som återställning kommer gå till." -#: utils/misc/guc.c:3761 +#: utils/misc/guc.c:4053 msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." msgstr "Sätter LSN för write-ahead-logg-position som återställning kommer få till." -#: utils/misc/guc.c:3771 +#: utils/misc/guc.c:4063 msgid "Specifies a file name whose presence ends recovery in the standby." msgstr "Anger ett filnamn vars närvaro gör att återställning avslutas i en standby." -#: utils/misc/guc.c:3781 +#: utils/misc/guc.c:4073 msgid "Sets the connection string to be used to connect to the sending server." msgstr "Sätter anslutningssträng som anvönds för att ansluta till skickande server." -#: utils/misc/guc.c:3792 +#: utils/misc/guc.c:4084 msgid "Sets the name of the replication slot to use on the sending server." msgstr "Sätter namnet på replikeringsslotten som skall användas av den skickande servern." -#: utils/misc/guc.c:3802 +#: utils/misc/guc.c:4094 msgid "Sets the client's character set encoding." msgstr "Ställer in klientens teckenkodning." -#: utils/misc/guc.c:3813 +#: utils/misc/guc.c:4105 msgid "Controls information prefixed to each log line." msgstr "Styr information prefixat till varje loggrad." -#: utils/misc/guc.c:3814 +#: utils/misc/guc.c:4106 msgid "If blank, no prefix is used." msgstr "Om tom så används inget prefix." -#: utils/misc/guc.c:3823 +#: utils/misc/guc.c:4115 msgid "Sets the time zone to use in log messages." msgstr "Sätter tidszonen som används i loggmeddelanden." -#: utils/misc/guc.c:3833 +#: utils/misc/guc.c:4125 msgid "Sets the display format for date and time values." msgstr "Sätter displayformat för datum och tidvärden." -#: utils/misc/guc.c:3834 +#: utils/misc/guc.c:4126 msgid "Also controls interpretation of ambiguous date inputs." msgstr "Styr också tolkning av tvetydig datumindata." -#: utils/misc/guc.c:3845 +#: utils/misc/guc.c:4137 msgid "Sets the default table access method for new tables." msgstr "Ställer in standard tabellaccessmetod för nya tabeller." -#: utils/misc/guc.c:3856 +#: utils/misc/guc.c:4148 msgid "Sets the default tablespace to create tables and indexes in." msgstr "Ställer in standard tabellutrymme där tabeller och index skapas." -#: utils/misc/guc.c:3857 +#: utils/misc/guc.c:4149 msgid "An empty string selects the database's default tablespace." msgstr "En tom sträng väljer databasens standardtabellutrymme." -#: utils/misc/guc.c:3867 +#: utils/misc/guc.c:4159 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "Ställer in tablespace för temporära tabeller och sorteringsfiler." -#: utils/misc/guc.c:3878 +#: utils/misc/guc.c:4170 msgid "Sets the path for dynamically loadable modules." msgstr "Sätter sökvägen till dynamiskt laddade moduler." -#: utils/misc/guc.c:3879 +#: utils/misc/guc.c:4171 msgid "If a dynamically loadable module needs to be opened and the specified name does not have a directory component (i.e., the name does not contain a slash), the system will search this path for the specified file." msgstr "Om en dynamiskt laddad modul behöver öppnas och det angivna namnet inte har en katalogkomponent (dvs, namnet inte innehåller snedstreck) så kommer systemet använda denna sökväg för filen." -#: utils/misc/guc.c:3892 +#: utils/misc/guc.c:4184 msgid "Sets the location of the Kerberos server key file." msgstr "Ställer in platsen för Kerberos servernyckelfil." -#: utils/misc/guc.c:3903 +#: utils/misc/guc.c:4195 msgid "Sets the Bonjour service name." msgstr "Sätter Bonjour-tjänstens namn." -#: utils/misc/guc.c:3915 +#: utils/misc/guc.c:4207 msgid "Shows the collation order locale." msgstr "Visar lokal för jämförelseordning." -#: utils/misc/guc.c:3926 +#: utils/misc/guc.c:4218 msgid "Shows the character classification and case conversion locale." msgstr "Visar lokal för teckenklassificering samt skiftlägeskonvertering." -#: utils/misc/guc.c:3937 +#: utils/misc/guc.c:4229 msgid "Sets the language in which messages are displayed." msgstr "Sätter språket som meddelanden visas i." -#: utils/misc/guc.c:3947 +#: utils/misc/guc.c:4239 msgid "Sets the locale for formatting monetary amounts." msgstr "Sätter lokalen för att formattera monetära belopp." -#: utils/misc/guc.c:3957 +#: utils/misc/guc.c:4249 msgid "Sets the locale for formatting numbers." msgstr "Ställer in lokalen för att formattera nummer." -#: utils/misc/guc.c:3967 +#: utils/misc/guc.c:4259 msgid "Sets the locale for formatting date and time values." msgstr "Sätter lokalen för att formattera datum och tider." -#: utils/misc/guc.c:3977 +#: utils/misc/guc.c:4269 msgid "Lists shared libraries to preload into each backend." msgstr "Listar delade bibliotek som skall förladdas i varje backend." -#: utils/misc/guc.c:3988 +#: utils/misc/guc.c:4280 msgid "Lists shared libraries to preload into server." msgstr "Listar delade bibliotek som skall förladdas i servern." -#: utils/misc/guc.c:3999 +#: utils/misc/guc.c:4291 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "Listar ej priviligerade delade bibliotek som förladdas in i varje backend." -#: utils/misc/guc.c:4010 +#: utils/misc/guc.c:4302 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "Sätter schemats sökordning för namn som inte är schema-prefixade." -#: utils/misc/guc.c:4022 -msgid "Sets the server (database) character set encoding." -msgstr "Ställer in serverns (databasens) teckenkodning." +#: utils/misc/guc.c:4314 +msgid "Shows the server (database) character set encoding." +msgstr "Visar serverns (databasens) teckenkodning." -#: utils/misc/guc.c:4034 +#: utils/misc/guc.c:4326 msgid "Shows the server version." msgstr "Visar serverversionen" -#: utils/misc/guc.c:4046 +#: utils/misc/guc.c:4338 msgid "Sets the current role." msgstr "Ställer in den aktiva rollen." -#: utils/misc/guc.c:4058 +#: utils/misc/guc.c:4350 msgid "Sets the session user name." msgstr "Sätter sessionens användarnamn." -#: utils/misc/guc.c:4069 +#: utils/misc/guc.c:4361 msgid "Sets the destination for server log output." msgstr "Sätter serverloggens destination." -#: utils/misc/guc.c:4070 -msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and \"eventlog\", depending on the platform." +#: utils/misc/guc.c:4362 +#, fuzzy +#| msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and \"eventlog\", depending on the platform." +msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", depending on the platform." msgstr "Giltiga värden är kombinationer av \"stderr\", \"syslog\", \"csvlog\" och \"eventlog\", beroende på plattform." -#: utils/misc/guc.c:4081 +#: utils/misc/guc.c:4373 msgid "Sets the destination directory for log files." msgstr "Sätter destinationskatalogen för loggfiler." -#: utils/misc/guc.c:4082 +#: utils/misc/guc.c:4374 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "Kan anges relativt datakatalogen eller som en absolut sökväg." -#: utils/misc/guc.c:4092 +#: utils/misc/guc.c:4384 msgid "Sets the file name pattern for log files." msgstr "Sätter filnamnsmallen för loggfiler." -#: utils/misc/guc.c:4103 +#: utils/misc/guc.c:4395 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "Sätter programnamnet som används för att identifiera PostgreSQLs meddelanden i syslog." -#: utils/misc/guc.c:4114 +#: utils/misc/guc.c:4406 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "Sätter applikationsnamnet som används för att identifiera PostgreSQLs meddelanden i händelseloggen." -#: utils/misc/guc.c:4125 +#: utils/misc/guc.c:4417 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "Ställer in tidszon för visande och tolkande av tidsstämplar." -#: utils/misc/guc.c:4135 +#: utils/misc/guc.c:4427 msgid "Selects a file of time zone abbreviations." msgstr "Väljer en fil för tidszonsförkortningar." -#: utils/misc/guc.c:4145 +#: utils/misc/guc.c:4437 msgid "Sets the owning group of the Unix-domain socket." msgstr "Sätter ägande grupp för Unix-domainuttaget (socket)." -#: utils/misc/guc.c:4146 +#: utils/misc/guc.c:4438 msgid "The owning user of the socket is always the user that starts the server." msgstr "Ägaren av uttaget (socker) är alltid användaren som startar servern." -#: utils/misc/guc.c:4156 +#: utils/misc/guc.c:4448 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Ställer in kataloger där Unix-domän-uttag (socket) kommer skapas." -#: utils/misc/guc.c:4171 +#: utils/misc/guc.c:4463 msgid "Sets the host name or IP address(es) to listen to." msgstr "Sätter värdnamn eller IP-adress(er) att lyssna på." -#: utils/misc/guc.c:4186 +#: utils/misc/guc.c:4478 msgid "Sets the server's data directory." msgstr "Ställer in serverns datakatalog." -#: utils/misc/guc.c:4197 +#: utils/misc/guc.c:4489 msgid "Sets the server's main configuration file." msgstr "Sätter serverns huvudkonfigurationsfil." -#: utils/misc/guc.c:4208 +#: utils/misc/guc.c:4500 msgid "Sets the server's \"hba\" configuration file." msgstr "Sätter serverns \"hba\"-konfigurationsfil." -#: utils/misc/guc.c:4219 +#: utils/misc/guc.c:4511 msgid "Sets the server's \"ident\" configuration file." msgstr "Sätter serverns \"ident\"-konfigurationsfil." -#: utils/misc/guc.c:4230 +#: utils/misc/guc.c:4522 msgid "Writes the postmaster PID to the specified file." msgstr "Skriver postmaster-PID till angiven fil." -#: utils/misc/guc.c:4241 -msgid "Name of the SSL library." -msgstr "Namn på SSL-biblioteket." +#: utils/misc/guc.c:4533 +msgid "Shows the name of the SSL library." +msgstr "Visar namnet på SSL-biblioteket." -#: utils/misc/guc.c:4256 +#: utils/misc/guc.c:4548 msgid "Location of the SSL server certificate file." msgstr "Plats för serverns SSL-certifikatfil." -#: utils/misc/guc.c:4266 +#: utils/misc/guc.c:4558 msgid "Location of the SSL server private key file." msgstr "Plats för serverns privata SSL-nyckelfil." -#: utils/misc/guc.c:4276 +#: utils/misc/guc.c:4568 msgid "Location of the SSL certificate authority file." msgstr "Plats för SSL-certifikats auktoritetsfil." -#: utils/misc/guc.c:4286 +#: utils/misc/guc.c:4578 msgid "Location of the SSL certificate revocation list file." msgstr "Plats för SSL-certifikats återkallningsfil." -#: utils/misc/guc.c:4296 -msgid "Writes temporary statistics files to the specified directory." -msgstr "Skriver temporära statistikfiler till angiven katalog." +#: utils/misc/guc.c:4588 +msgid "Location of the SSL certificate revocation list directory." +msgstr "Plats av katalog för SSL-certifikats återkallningslistor." -#: utils/misc/guc.c:4307 +#: utils/misc/guc.c:4598 msgid "Number of synchronous standbys and list of names of potential synchronous ones." msgstr "Antalet synkrona standby och en lista med namn på potentiellt synkrona sådana." -#: utils/misc/guc.c:4318 +#: utils/misc/guc.c:4609 msgid "Sets default text search configuration." msgstr "Ställer in standard textsökkonfiguration." -#: utils/misc/guc.c:4328 +#: utils/misc/guc.c:4619 msgid "Sets the list of allowed SSL ciphers." msgstr "Ställer in listan med tillåtna SSL-krypton." -#: utils/misc/guc.c:4343 +#: utils/misc/guc.c:4634 msgid "Sets the curve to use for ECDH." msgstr "Ställer in kurvan att använda för ECDH." -#: utils/misc/guc.c:4358 +#: utils/misc/guc.c:4649 msgid "Location of the SSL DH parameters file." msgstr "Plats för SSL DH-parameterfil." -#: utils/misc/guc.c:4369 +#: utils/misc/guc.c:4660 msgid "Command to obtain passphrases for SSL." msgstr "Kommando för att hämta lösenfraser för SSL." -#: utils/misc/guc.c:4380 +#: utils/misc/guc.c:4671 msgid "Sets the application name to be reported in statistics and logs." msgstr "Sätter applikationsnamn som rapporteras i statistik och loggar." -#: utils/misc/guc.c:4391 +#: utils/misc/guc.c:4682 msgid "Sets the name of the cluster, which is included in the process title." msgstr "Sätter namnet på klustret som inkluderas i processtiteln." -#: utils/misc/guc.c:4402 +#: utils/misc/guc.c:4693 msgid "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "Sätter WAL-resurshanterare som WAL-konsistenskontoller görs med." -#: utils/misc/guc.c:4403 +#: utils/misc/guc.c:4694 msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." msgstr "Hela sidkopior kommer loggas för alla datablock och kontrolleras mot resultatet av en WAL-uppspelning." -#: utils/misc/guc.c:4413 +#: utils/misc/guc.c:4704 msgid "JIT provider to use." msgstr "JIT-leverantör som används." -#: utils/misc/guc.c:4424 +#: utils/misc/guc.c:4715 msgid "Log backtrace for errors in these functions." msgstr "Loggar backtrace vid fel i dessa funktioner." -#: utils/misc/guc.c:4444 +#: utils/misc/guc.c:4735 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Anger hurvida \"\\'\" tillåts i sträng-literaler." -#: utils/misc/guc.c:4454 +#: utils/misc/guc.c:4745 msgid "Sets the output format for bytea." msgstr "Ställer in output-format för bytea." -#: utils/misc/guc.c:4464 +#: utils/misc/guc.c:4755 msgid "Sets the message levels that are sent to the client." msgstr "Ställer in meddelandenivåer som skickas till klienten." -#: utils/misc/guc.c:4465 utils/misc/guc.c:4530 utils/misc/guc.c:4541 -#: utils/misc/guc.c:4617 +#: utils/misc/guc.c:4756 utils/misc/guc.c:4842 utils/misc/guc.c:4853 +#: utils/misc/guc.c:4929 msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." msgstr "Varje nivå inkluderar de efterföljande nivåerna. Ju senare nivå destå färre meddlanden skickas." -#: utils/misc/guc.c:4475 +#: utils/misc/guc.c:4766 +#, fuzzy +#| msgid "Compute query identifiers." +msgid "Enables in-core computation of query identifiers." +msgstr "Beräkna identifierare för frågor." + +#: utils/misc/guc.c:4776 msgid "Enables the planner to use constraints to optimize queries." msgstr "Slår på planerarens användning av integritetsvillkor för att optimera frågor." -#: utils/misc/guc.c:4476 +#: utils/misc/guc.c:4777 msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." msgstr "Tabellskanningar kommer hoppas över om dess integritetsvillkor garanterar att inga rader komma matchas av frågan." -#: utils/misc/guc.c:4487 +#: utils/misc/guc.c:4788 +msgid "Sets the default compression method for compressible values." +msgstr "Ställer in standard komprimeringsmetod för komprimeringsbara värden." + +#: utils/misc/guc.c:4799 msgid "Sets the transaction isolation level of each new transaction." msgstr "Ställer in isolationsnivån för nya transaktioner." -#: utils/misc/guc.c:4497 +#: utils/misc/guc.c:4809 msgid "Sets the current transaction's isolation level." msgstr "Sätter den aktuella transaktionsisolationsnivån." -#: utils/misc/guc.c:4508 +#: utils/misc/guc.c:4820 msgid "Sets the display format for interval values." msgstr "Ställer in visningsformat för intervallvärden." -#: utils/misc/guc.c:4519 +#: utils/misc/guc.c:4831 msgid "Sets the verbosity of logged messages." msgstr "Ställer in pratighet för loggade meddelanden." -#: utils/misc/guc.c:4529 +#: utils/misc/guc.c:4841 msgid "Sets the message levels that are logged." msgstr "Ställer in meddelandenivåer som loggas." -#: utils/misc/guc.c:4540 +#: utils/misc/guc.c:4852 msgid "Causes all statements generating error at or above this level to be logged." msgstr "Gör att alla satser som genererar fel vid eller över denna nivå kommer loggas." -#: utils/misc/guc.c:4551 +#: utils/misc/guc.c:4863 msgid "Sets the type of statements logged." msgstr "Ställer in vilken sorts satser som loggas." -#: utils/misc/guc.c:4561 +#: utils/misc/guc.c:4873 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "Ställer in syslog-\"facility\" som används när syslog är påslagen." -#: utils/misc/guc.c:4576 +#: utils/misc/guc.c:4888 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "Sätter sessionens beteende för utlösare och omskrivningsregler." -#: utils/misc/guc.c:4586 +#: utils/misc/guc.c:4898 msgid "Sets the current transaction's synchronization level." msgstr "Ställer in den nuvarande transaktionens synkroniseringsnivå." -#: utils/misc/guc.c:4596 +#: utils/misc/guc.c:4908 msgid "Allows archiving of WAL files using archive_command." msgstr "Tillåter arkivering av WAL-filer med hjälp av archive_command." -#: utils/misc/guc.c:4606 +#: utils/misc/guc.c:4918 msgid "Sets the action to perform upon reaching the recovery target." msgstr "Sätter handling som skall utföras när återställningsmål nås." -#: utils/misc/guc.c:4616 +#: utils/misc/guc.c:4928 msgid "Enables logging of recovery-related debugging information." msgstr "Slår på loggning av återställningsrelaterad debug-information." -#: utils/misc/guc.c:4632 +#: utils/misc/guc.c:4945 msgid "Collects function-level statistics on database activity." msgstr "Samlar in statistik på funktionsnivå över databasaktivitet." -#: utils/misc/guc.c:4642 -msgid "Set the level of information written to the WAL." +#: utils/misc/guc.c:4956 +#, fuzzy +#| msgid "Sets the default statistics target." +msgid "Sets the consistency of accesses to statistics data" +msgstr "Sätter standardstatistikmålet." + +#: utils/misc/guc.c:4966 +#, fuzzy +#| msgid "Compresses full-page writes written in WAL file." +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "Komprimerar skrivning av hela sidor som skrivs i WAL-fil." + +#: utils/misc/guc.c:4976 +msgid "Sets the level of information written to the WAL." msgstr "Ställer in mängden information som skrivs till WAL." -#: utils/misc/guc.c:4652 +#: utils/misc/guc.c:4986 msgid "Selects the dynamic shared memory implementation used." msgstr "Väljer implementation som används för dynamiskt delat minne." -#: utils/misc/guc.c:4662 +#: utils/misc/guc.c:4996 msgid "Selects the shared memory implementation used for the main shared memory region." msgstr "Väljer implementation för delat minne som används för det delade minnets huvudregionen." -#: utils/misc/guc.c:4672 +#: utils/misc/guc.c:5006 msgid "Selects the method used for forcing WAL updates to disk." msgstr "Väljer metod för att tvinga WAL-uppdateringar till disk." -#: utils/misc/guc.c:4682 +#: utils/misc/guc.c:5016 msgid "Sets how binary values are to be encoded in XML." msgstr "Ställer in hur binära värden kodas i XML." -#: utils/misc/guc.c:4692 +#: utils/misc/guc.c:5026 msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." msgstr "Anger hurvida XML-data vid implicit parsning och serialiseringsoperationer ses som dokument eller innehållsfragment." -#: utils/misc/guc.c:4703 +#: utils/misc/guc.c:5037 msgid "Use of huge pages on Linux or Windows." msgstr "Använd stora sidor på Linux resp. Windows." -#: utils/misc/guc.c:4713 +#: utils/misc/guc.c:5047 +#, fuzzy +#| msgid "cannot execute %s during recovery" +msgid "Prefetch referenced blocks during recovery" +msgstr "kan inte köra %s under återställning" + +#: utils/misc/guc.c:5048 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "" + +#: utils/misc/guc.c:5057 msgid "Forces use of parallel query facilities." msgstr "Tvingar användning av parallella frågefinesser." -#: utils/misc/guc.c:4714 +#: utils/misc/guc.c:5058 msgid "If possible, run query using a parallel worker and with parallel restrictions." msgstr "Om det är möjligt så kör fråga med en parallell arbetare och med parallella begränsningar." -#: utils/misc/guc.c:4724 +#: utils/misc/guc.c:5068 msgid "Chooses the algorithm for encrypting passwords." msgstr "Väljer algoritm för att kryptera lösenord." -#: utils/misc/guc.c:4734 +#: utils/misc/guc.c:5078 msgid "Controls the planner's selection of custom or generic plan." msgstr "Styr planerarens användning av egendefinierad eller generell plan." -#: utils/misc/guc.c:4735 +#: utils/misc/guc.c:5079 msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." msgstr "Preparerade satser kan ha egendefinierade och generella planer och planeraren kommer försöka välja den som är bäst. Detta kan anges att övertrumfa standardbeteendet." -#: utils/misc/guc.c:4747 +#: utils/misc/guc.c:5091 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "Sätter minsta SSL/TLS-protokollversion som skall användas." -#: utils/misc/guc.c:4759 +#: utils/misc/guc.c:5103 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "Sätter högsta SSL/TLS-protokollversion som skall användas." -#: utils/misc/guc.c:5562 +#: utils/misc/guc.c:5115 +msgid "Sets the method for synchronizing the data directory before crash recovery." +msgstr "Ställer in metoden för att synkronisera datakatalogen innan kraschåterställning." + +#: utils/misc/guc.c:5689 utils/misc/guc.c:5705 +#, c-format +msgid "invalid configuration parameter name \"%s\"" +msgstr "ogiltig konfigurationsparameter \"%s\"" + +#: utils/misc/guc.c:5691 +#, c-format +msgid "Custom parameter names must be two or more simple identifiers separated by dots." +msgstr "Egenskapade parameternamn måste vara två eller fler enkla identifierare separerade med punkter." + +#: utils/misc/guc.c:5707 +#, fuzzy, c-format +#| msgid "\"%s\" is a procedure." +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\" är en procedur." + +#: utils/misc/guc.c:5721 +#, c-format +msgid "unrecognized configuration parameter \"%s\"" +msgstr "okänd konfigurationsparameter \"%s\"" + +#: utils/misc/guc.c:6102 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s: kunde inte komma åt katalogen \"%s\": %s\n" -#: utils/misc/guc.c:5567 +#: utils/misc/guc.c:6107 #, c-format msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" msgstr "Kör initdb eller pg_basebackup för att initiera en PostgreSQL-datakatalog.\n" -#: utils/misc/guc.c:5587 +#: utils/misc/guc.c:6127 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -26902,12 +29143,12 @@ msgstr "" "%s vet inte var servens konfigurationsfil är.\n" "Du måste ange flaggan --config-file eller -D alternativt sätta omgivningsvariabeln PGDATA.\n" -#: utils/misc/guc.c:5606 +#: utils/misc/guc.c:6146 #, c-format msgid "%s: could not access the server configuration file \"%s\": %s\n" msgstr "%s: har inte åtkomst till serverns konfigureringsfil \"%s\": %s\n" -#: utils/misc/guc.c:5632 +#: utils/misc/guc.c:6172 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -26916,7 +29157,7 @@ msgstr "" "%s vet inte var databasens systemdata är.\n" "Det kan anges med \"data_directory\" i \"%s\" eller med flaggan -D alternativt genom att sätta omgivningsvariabeln PGDATA.\n" -#: utils/misc/guc.c:5680 +#: utils/misc/guc.c:6220 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -26925,7 +29166,7 @@ msgstr "" "%s vet inte var \"hba\"-konfigurationsfilen är.\n" "Detta kan anges som \"hba_file\" i \"%s\" eller med flaggan -D alternativt genom att sätta omgivningsvariabeln PGDATA.\n" -#: utils/misc/guc.c:5703 +#: utils/misc/guc.c:6243 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -26934,178 +29175,192 @@ msgstr "" "%s vet inte var \"ident\"-konfigurationsfilen är.\n" "Detta kan anges som \"ident_file\" i \"%s\" eller med flaggan -D alternativt genom att sätta omgivningsvariabeln PGDATA.\n" -#: utils/misc/guc.c:6545 +#: utils/misc/guc.c:7168 msgid "Value exceeds integer range." msgstr "Värde överskriver heltalsintervall." -#: utils/misc/guc.c:6781 +#: utils/misc/guc.c:7404 #, c-format msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d%s%s är utanför giltigt intervall för parameter \"%s\" (%d .. %d)" -#: utils/misc/guc.c:6817 +#: utils/misc/guc.c:7440 #, c-format msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" msgstr "%g%s%s är utanför giltigt intervall för parameter \"%s\" (%g .. %g)" -#: utils/misc/guc.c:6973 utils/misc/guc.c:8368 +#: utils/misc/guc.c:7600 utils/misc/guc.c:9028 #, c-format msgid "cannot set parameters during a parallel operation" msgstr "kan inte sätta parametrar under en parallell operation" -#: utils/misc/guc.c:6980 utils/misc/guc.c:7760 utils/misc/guc.c:7813 -#: utils/misc/guc.c:7864 utils/misc/guc.c:8197 utils/misc/guc.c:8964 -#: utils/misc/guc.c:9226 utils/misc/guc.c:10892 -#, c-format -msgid "unrecognized configuration parameter \"%s\"" -msgstr "okänd konfigurationsparameter \"%s\"" - -#: utils/misc/guc.c:6995 utils/misc/guc.c:8209 +#: utils/misc/guc.c:7617 utils/misc/guc.c:8852 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "parameter \"%s\" kan inte ändras" -#: utils/misc/guc.c:7028 +#: utils/misc/guc.c:7650 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "parameter \"%s\" kan inte ändras nu" -#: utils/misc/guc.c:7046 utils/misc/guc.c:7093 utils/misc/guc.c:10908 +#: utils/misc/guc.c:7677 utils/misc/guc.c:7735 utils/misc/guc.c:8828 +#: utils/misc/guc.c:11696 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "rättighet saknas för att sätta parameter \"%s\"" -#: utils/misc/guc.c:7083 +#: utils/misc/guc.c:7715 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "parameter \"%s\" kan inte ändras efter uppkopplingen startats" -#: utils/misc/guc.c:7131 +#: utils/misc/guc.c:7774 #, c-format msgid "cannot set parameter \"%s\" within security-definer function" msgstr "kan inte sätta parameter \"%s\" inom en security-definer-funktion" -#: utils/misc/guc.c:7768 utils/misc/guc.c:7818 utils/misc/guc.c:9233 -#, c-format -msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" -msgstr "måste vara superanvändare eller medlem i pg_read_all_settings för att undersöka \"%s\"" +#: utils/misc/guc.c:8407 utils/misc/guc.c:8454 utils/misc/guc.c:9917 +#, fuzzy, c-format +#| msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" +msgid "must be superuser or have privileges of pg_read_all_settings to examine \"%s\"" +msgstr "måste vara superuser eller medlem i pg_read_all_settings för att undersöka \"%s\"" -#: utils/misc/guc.c:7909 +#: utils/misc/guc.c:8538 #, c-format msgid "SET %s takes only one argument" msgstr "SET %s tar bara ett argument" -#: utils/misc/guc.c:8157 -#, c-format -msgid "must be superuser to execute ALTER SYSTEM command" -msgstr "måste vara superanvändare för att köra kommandot ALTER SYSTEM" +#: utils/misc/guc.c:8818 +#, fuzzy, c-format +#| msgid "permission denied for operator %s" +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "rättighet saknas för operator %s" -#: utils/misc/guc.c:8242 +#: utils/misc/guc.c:8885 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "parametervärde till ALTER SYSTEM kan inte innehålla nyradstecken" -#: utils/misc/guc.c:8287 +#: utils/misc/guc.c:8930 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "kunde inte parsa innehållet i fil \"%s\"" -#: utils/misc/guc.c:8444 +#: utils/misc/guc.c:9104 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOT är inte implementerat ännu" -#: utils/misc/guc.c:8528 +#: utils/misc/guc.c:9191 #, c-format msgid "SET requires parameter name" msgstr "SET kräver ett parameternamn" -#: utils/misc/guc.c:8661 +#: utils/misc/guc.c:9324 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "försök att omdefiniera parameter \"%s\"" -#: utils/misc/guc.c:10454 +#: utils/misc/guc.c:9645 +#, fuzzy, c-format +#| msgid "invalid configuration parameter name \"%s\"" +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "ogiltig konfigurationsparameter \"%s\"" + +#: utils/misc/guc.c:9647 +#, fuzzy, c-format +#| msgid "\"%s\" is not a sequence" +msgid "\"%s\" is now a reserved prefix." +msgstr "\"%s\" är inte en sekvens" + +#: utils/misc/guc.c:11143 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "vid sättande av parameter \"%s\" till \"%s\"" -#: utils/misc/guc.c:10522 +#: utils/misc/guc.c:11308 #, c-format msgid "parameter \"%s\" could not be set" msgstr "parameter \"%s\" kunde inte sättas" -#: utils/misc/guc.c:10612 +#: utils/misc/guc.c:11400 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "kunde inte tolka inställningen för parameter \"%s\"" -#: utils/misc/guc.c:10970 utils/misc/guc.c:11004 -#, c-format -msgid "invalid value for parameter \"%s\": %d" -msgstr "ogiltigt värde för parameter \"%s\": %d" - -#: utils/misc/guc.c:11038 +#: utils/misc/guc.c:11826 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "ogiltigt värde för parameter \"%s\": %g" -#: utils/misc/guc.c:11308 +#: utils/misc/guc.c:12139 #, c-format msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." msgstr "\"temp_buffers\" kan inte ändras efter att man använt temporära tabeller i sessionen." -#: utils/misc/guc.c:11320 +#: utils/misc/guc.c:12151 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour stöds inte av detta bygge" -#: utils/misc/guc.c:11333 +#: utils/misc/guc.c:12164 #, c-format msgid "SSL is not supported by this build" msgstr "SSL stöds inte av detta bygge" -#: utils/misc/guc.c:11345 +#: utils/misc/guc.c:12176 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "Kan inte slå på parameter när \"log_statement_stats\" är satt." -#: utils/misc/guc.c:11357 +#: utils/misc/guc.c:12188 #, c-format msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." msgstr "Kan inte slå på \"log_statement_stats\" när \"log_parser_stats\", \"log_planner_stats\" eller \"log_executor_stats\" är satta." -#: utils/misc/guc.c:11587 +#: utils/misc/guc.c:12418 #, c-format msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "effective_io_concurrency måste sättas till 0 på plattformar som saknar posix_fadvise()." -#: utils/misc/guc.c:11600 +#: utils/misc/guc.c:12431 #, c-format msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "maintenance_io_concurrency måste sättas till 0 på plattformar som saknar posix_fadvise()." -#: utils/misc/guc.c:11716 +#: utils/misc/guc.c:12445 +#, c-format +msgid "huge_page_size must be 0 on this platform." +msgstr "huge_page_size måste vara 0 på denna plattform." + +#: utils/misc/guc.c:12457 +#, fuzzy, c-format +#| msgid "client_connection_check_interval must be set to 0 on platforms that lack POLLRDHUP." +msgid "client_connection_check_interval must be set to 0 on this platform" +msgstr "client_connection_check_interval måste sättas till 0 på plattformar som saknar PULLRDHUP." + +#: utils/misc/guc.c:12569 #, c-format msgid "invalid character" msgstr "ogiltigt tecken" -#: utils/misc/guc.c:11776 +#: utils/misc/guc.c:12629 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timeline är inte ett giltigt nummer." -#: utils/misc/guc.c:11816 +#: utils/misc/guc.c:12669 #, c-format msgid "multiple recovery targets specified" msgstr "multipla återställningsmål angivna" -#: utils/misc/guc.c:11817 +#: utils/misc/guc.c:12670 #, c-format msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." msgstr "Som mest en av recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time och recovery_target_xid kan sättas." -#: utils/misc/guc.c:11825 +#: utils/misc/guc.c:12678 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "Det enda tillåtna värdet är \"immediate\"." @@ -27115,11 +29370,6 @@ msgstr "Det enda tillåtna värdet är \"immediate\"." msgid "internal error: unrecognized run-time parameter type\n" msgstr "internt fel: okänd parametertyp\n" -#: utils/misc/pg_config.c:60 -#, c-format -msgid "query-specified return tuple and function return type are not compatible" -msgstr "fråge-angiven typ för retur-tupel och funktions returtyp är inte kompatibla" - #: utils/misc/pg_controldata.c:60 utils/misc/pg_controldata.c:138 #: utils/misc/pg_controldata.c:241 utils/misc/pg_controldata.c:306 #, c-format @@ -27141,7 +29391,7 @@ msgstr "frågan påverkas av radsäkerhetspolicyn för tabell \"%s\"" msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." msgstr "För att slå av policyn för tabellens ägare, använd ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/timeout.c:395 +#: utils/misc/timeout.c:524 #, c-format msgid "cannot add more timeout reasons" msgstr "kan inte lägga till fler timeoutskäl" @@ -27211,55 +29461,60 @@ msgstr "raden är för lång i tidszonfil \"%s\", rad %d" msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "@INCLUDE utan filnamn i tidszonfil \"%s\", rad %d" -#: utils/mmgr/aset.c:476 utils/mmgr/generation.c:234 utils/mmgr/slab.c:236 +#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:237 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Misslyckades vid skapande av minneskontext \"%s\"." -#: utils/mmgr/dsa.c:519 utils/mmgr/dsa.c:1332 +#: utils/mmgr/dsa.c:519 utils/mmgr/dsa.c:1329 #, c-format msgid "could not attach to dynamic shared area" msgstr "kunde inte ansluta till dynamisk delad area" -#: utils/mmgr/mcxt.c:822 utils/mmgr/mcxt.c:858 utils/mmgr/mcxt.c:896 -#: utils/mmgr/mcxt.c:934 utils/mmgr/mcxt.c:970 utils/mmgr/mcxt.c:1001 -#: utils/mmgr/mcxt.c:1037 utils/mmgr/mcxt.c:1089 utils/mmgr/mcxt.c:1124 -#: utils/mmgr/mcxt.c:1159 +#: utils/mmgr/mcxt.c:889 utils/mmgr/mcxt.c:925 utils/mmgr/mcxt.c:963 +#: utils/mmgr/mcxt.c:1001 utils/mmgr/mcxt.c:1089 utils/mmgr/mcxt.c:1120 +#: utils/mmgr/mcxt.c:1156 utils/mmgr/mcxt.c:1208 utils/mmgr/mcxt.c:1243 +#: utils/mmgr/mcxt.c:1278 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "Misslyckades med förfrågan av storlek %zu i minneskontext \"%s\"." -#: utils/mmgr/portalmem.c:187 +#: utils/mmgr/mcxt.c:1052 +#, c-format +msgid "logging memory contexts of PID %d" +msgstr "loggar minneskontext för PID %d" + +#: utils/mmgr/portalmem.c:188 #, c-format msgid "cursor \"%s\" already exists" msgstr "markör \"%s\" finns redan" -#: utils/mmgr/portalmem.c:191 +#: utils/mmgr/portalmem.c:192 #, c-format msgid "closing existing cursor \"%s\"" msgstr "stänger existerande markör \"%s\"" -#: utils/mmgr/portalmem.c:400 +#: utils/mmgr/portalmem.c:402 #, c-format msgid "portal \"%s\" cannot be run" msgstr "portal \"%s\" kan inte köras" -#: utils/mmgr/portalmem.c:478 +#: utils/mmgr/portalmem.c:480 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "kan inte ta bort fastsatt portal \"%s\"" -#: utils/mmgr/portalmem.c:486 +#: utils/mmgr/portalmem.c:488 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "kan inte ta bort aktiv portal \"%s\"" -#: utils/mmgr/portalmem.c:731 +#: utils/mmgr/portalmem.c:739 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "kan inte göra PREPARE på en transaktion som skapat en markör med WITH HOLD" -#: utils/mmgr/portalmem.c:1270 +#: utils/mmgr/portalmem.c:1232 #, c-format msgid "cannot perform transaction commands inside a cursor loop that is not read-only" msgstr "kan inte utföra transaktionskommandon i en markörloop som inte är read-only" @@ -27274,44 +29529,44 @@ msgstr "kunde inte söka (seek) till block %ld i temporärfil" msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" msgstr "kunde inte läsa block %ld i temporärfil: läste bara %zu av %zu byte" -#: utils/sort/sharedtuplestore.c:430 utils/sort/sharedtuplestore.c:439 -#: utils/sort/sharedtuplestore.c:462 utils/sort/sharedtuplestore.c:479 -#: utils/sort/sharedtuplestore.c:496 +#: utils/sort/sharedtuplestore.c:431 utils/sort/sharedtuplestore.c:440 +#: utils/sort/sharedtuplestore.c:463 utils/sort/sharedtuplestore.c:480 +#: utils/sort/sharedtuplestore.c:497 #, c-format msgid "could not read from shared tuplestore temporary file" msgstr "kunde inte läsa från delad temporär lagringsfil för tupler" -#: utils/sort/sharedtuplestore.c:485 +#: utils/sort/sharedtuplestore.c:486 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "oväntad chunk i delad temporär lagringsfil för tupler" -#: utils/sort/sharedtuplestore.c:569 +#: utils/sort/sharedtuplestore.c:571 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "kunde inte söka (seek) till block %u i delad temporär lagringsfil för tupler" -#: utils/sort/sharedtuplestore.c:576 +#: utils/sort/sharedtuplestore.c:578 #, c-format msgid "could not read from shared tuplestore temporary file: read only %zu of %zu bytes" msgstr "kunde inte läsa från delad temporär lagringsfil för tupler: läste bara %zu av %zu byte" -#: utils/sort/tuplesort.c:3140 +#: utils/sort/tuplesort.c:3321 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "kan inte ha mer än %d körningar för en extern sortering" -#: utils/sort/tuplesort.c:4221 +#: utils/sort/tuplesort.c:4429 #, c-format msgid "could not create unique index \"%s\"" msgstr "kunde inte skapa unikt index \"%s\"" -#: utils/sort/tuplesort.c:4223 +#: utils/sort/tuplesort.c:4431 #, c-format msgid "Key %s is duplicated." msgstr "Nyckeln %s är duplicerad." -#: utils/sort/tuplesort.c:4224 +#: utils/sort/tuplesort.c:4432 #, c-format msgid "Duplicate keys exist." msgstr "Duplicerade nycklar existerar." @@ -27331,118 +29586,52 @@ msgstr "kunde inte söka i temporär lagringsfil för tupler" msgid "could not read from tuplestore temporary file: read only %zu of %zu bytes" msgstr "kunde inte läsa från temporär lagringsfil för tupler: läste bara %zu av %zu byte" -#: utils/time/snapmgr.c:624 +#: utils/time/snapmgr.c:570 #, c-format msgid "The source transaction is not running anymore." msgstr "Källtransaktionen kör inte längre." -#: utils/time/snapmgr.c:1232 +#: utils/time/snapmgr.c:1164 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "kan inte exportera ett snapshot från en subtransaktion" -#: utils/time/snapmgr.c:1391 utils/time/snapmgr.c:1396 -#: utils/time/snapmgr.c:1401 utils/time/snapmgr.c:1416 -#: utils/time/snapmgr.c:1421 utils/time/snapmgr.c:1426 -#: utils/time/snapmgr.c:1441 utils/time/snapmgr.c:1446 -#: utils/time/snapmgr.c:1451 utils/time/snapmgr.c:1553 -#: utils/time/snapmgr.c:1569 utils/time/snapmgr.c:1594 +#: utils/time/snapmgr.c:1323 utils/time/snapmgr.c:1328 +#: utils/time/snapmgr.c:1333 utils/time/snapmgr.c:1348 +#: utils/time/snapmgr.c:1353 utils/time/snapmgr.c:1358 +#: utils/time/snapmgr.c:1373 utils/time/snapmgr.c:1378 +#: utils/time/snapmgr.c:1383 utils/time/snapmgr.c:1485 +#: utils/time/snapmgr.c:1501 utils/time/snapmgr.c:1526 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "ogiltig snapshot-data i fil \"%s\"" -#: utils/time/snapmgr.c:1488 +#: utils/time/snapmgr.c:1420 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "SET TRANSACTION SNAPSHOT måste anropas innan någon fråga" -#: utils/time/snapmgr.c:1497 +#: utils/time/snapmgr.c:1429 #, c-format msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" msgstr "en snapshot-importerande transaktion måste ha isoleringsnivå SERIALIZABLE eller REPEATABLE READ" -#: utils/time/snapmgr.c:1506 utils/time/snapmgr.c:1515 +#: utils/time/snapmgr.c:1438 utils/time/snapmgr.c:1447 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "ogiltig snapshot-identifierare: \"%s\"" -#: utils/time/snapmgr.c:1607 +#: utils/time/snapmgr.c:1539 #, c-format msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" msgstr "en serialiserbar transaktion kan inte importera ett snapshot från en icke-serialiserbar transaktion" -#: utils/time/snapmgr.c:1611 +#: utils/time/snapmgr.c:1543 #, c-format msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" msgstr "en serialiserbar transaktion som inte är read-only kan inte importera en snapshot från en read-only-transaktion." -#: utils/time/snapmgr.c:1626 +#: utils/time/snapmgr.c:1558 #, c-format msgid "cannot import a snapshot from a different database" msgstr "kan inte importera en snapshot från en annan databas" - -#~ msgid "starting parallel vacuum worker for %s" -#~ msgstr "startar parallell vacuum-arbetsprocess för %s" - -#~ msgid "leftover placeholder tuple detected in BRIN index \"%s\", deleting" -#~ msgstr "kvarlämnad platshållartuple hittad i BRIN-index \"%s\", raderar" - -#~ msgid "EXPLAIN option BUFFERS requires ANALYZE" -#~ msgstr "EXPLAIN-flagga BUFFERS kräver ANALYZE" - -#~ msgid "could not write to file \"%s\" : %m" -#~ msgstr "kunde inte skriva till fil \"%s\" : %m" - -#~ msgid "Causes the planner to avoid hashed aggregation plans that are expected to use the disk." -#~ msgstr "Gör så att planeraren unviker planer med hash-aggregering som förväntas använda disk." - -#~ msgid "cannot specify both FULL and PARALLEL options" -#~ msgstr "kan inte ange både flaggan FULL och PARALLEL" - -#~ msgid "could not load wldap32.dll" -#~ msgstr "kunde inte ladda wldap32.dll" - -#~ msgid "could not load advapi32.dll: error code %lu" -#~ msgstr "kunde inte ladda advapi32.dll: felkod %lu" - -#~ msgid "cannot advance replication slot that has not previously reserved WAL" -#~ msgstr "kan inte flytta fram replikeringsslot som inte en tidigare reserverad WAL" - -#~ msgid "could not write to tuplestore temporary file: %m" -#~ msgstr "kunde inte skriva till temporär lagringsfil för tupler: %m" - -#~ msgid "When a password is specified in CREATE USER or ALTER USER without writing either ENCRYPTED or UNENCRYPTED, this parameter determines whether the password is to be encrypted." -#~ msgstr "När ett lösenord anges i CREATE USER eller ALTER USER utan man skrivit varken ENCRYPTED eller UNENCRYPTED så bestämmer denna parameter om lösenordet kommer krypteras." - -#~ msgid "Encrypt passwords." -#~ msgstr "Kryptera lösenord." - -#~ msgid "Enables the planner's use of hashed aggregation plans for groupingsets when the total size of the hash tables is expected to exceed work_mem." -#~ msgstr "Aktiverar planerarens användning av planer med hash-aggregering för grupperingsmängder när totala storleken på hash-tabellerna förväntas överstiga work_mem." - -#~ msgid "could not write to temporary file: %m" -#~ msgstr "kunde inte skriva till temporär fil: %m" - -#~ msgid "could not write to hash-join temporary file: %m" -#~ msgstr "kunde inte skriva till hash-join-temporärfil: %m" - -#~ msgid "could not write block %ld of temporary file: %m" -#~ msgstr "kunde inte skriva block %ld i temporär fil: %m" - -#~ msgid "could not restore file \"%s\" from archive" -#~ msgstr "kunde inte återställa fil \"%s\" från arkiv" - -#~ msgid "restore_command failed due to the signal: %s" -#~ msgstr "restore_command misslyckades på grund av signal: %s" - -#~ msgid "could not open file \"%s\" restored from archive: %m" -#~ msgstr "kunde inte öppna fil \"%s\" återställd från arkiv: %m" - -#~ msgid "unexpected file size for \"%s\": %lu instead of %lu" -#~ msgstr "oväntad filstorlek på \"%s\": %lu istället för %lu" - -#~ msgid "could not use restore_command with %%r alias" -#~ msgstr "kunde inte använda restore_command med %%r-alias" - -#~ msgid "insufficient columns in %s constraint definition" -#~ msgstr "otillräckligt med kolumner i villkorsdefinitionen %s" diff --git a/src/backend/po/uk.po b/src/backend/po/uk.po index 48f9d1f3f8..eea5981b42 100644 --- a/src/backend/po/uk.po +++ b/src/backend/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:10+0000\n" -"PO-Revision-Date: 2020-09-22 13:45\n" +"POT-Creation-Date: 2021-08-17 08:40+0000\n" +"PO-Revision-Date: 2021-08-17 11:41\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/postgres.pot\n" -"X-Crowdin-File-ID: 524\n" +"X-Crowdin-File: /REL_14_DEV/postgres.pot\n" +"X-Crowdin-File-ID: 754\n" #: ../common/config_info.c:134 ../common/config_info.c:142 #: ../common/config_info.c:150 ../common/config_info.c:158 @@ -25,59 +25,58 @@ msgid "not recorded" msgstr "не записано" #: ../common/controldata_utils.c:68 ../common/controldata_utils.c:73 -#: commands/copy.c:3495 commands/extension.c:3436 utils/adt/genfile.c:125 +#: commands/copyfrom.c:1516 commands/extension.c:3464 utils/adt/genfile.c:128 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не вдалося відкрити файл \"%s\" для читання: %m" #: ../common/controldata_utils.c:86 ../common/controldata_utils.c:89 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1276 access/transam/xlog.c:3503 -#: access/transam/xlog.c:4728 access/transam/xlog.c:11121 -#: access/transam/xlog.c:11134 access/transam/xlog.c:11587 -#: access/transam/xlog.c:11667 access/transam/xlog.c:11706 -#: access/transam/xlog.c:11749 access/transam/xlogfuncs.c:662 -#: access/transam/xlogfuncs.c:681 commands/extension.c:3446 libpq/hba.c:499 -#: replication/logical/origin.c:717 replication/logical/origin.c:753 -#: replication/logical/reorderbuffer.c:3599 -#: replication/logical/snapbuild.c:1741 replication/logical/snapbuild.c:1783 -#: replication/logical/snapbuild.c:1811 replication/logical/snapbuild.c:1838 -#: replication/slot.c:1622 replication/slot.c:1663 replication/walsender.c:543 -#: storage/file/buffile.c:441 storage/file/copydir.c:195 -#: utils/adt/genfile.c:200 utils/adt/misc.c:763 utils/cache/relmapper.c:741 +#: access/transam/twophase.c:1271 access/transam/xlog.c:3545 +#: access/transam/xlog.c:4770 access/transam/xlog.c:11367 +#: access/transam/xlog.c:11380 access/transam/xlog.c:11833 +#: access/transam/xlog.c:11913 access/transam/xlog.c:11950 +#: access/transam/xlog.c:12010 access/transam/xlogfuncs.c:703 +#: access/transam/xlogfuncs.c:722 commands/extension.c:3474 libpq/hba.c:534 +#: replication/basebackup.c:2020 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4907 +#: replication/logical/snapbuild.c:1733 replication/logical/snapbuild.c:1775 +#: replication/logical/snapbuild.c:1802 replication/slot.c:1720 +#: replication/slot.c:1761 replication/walsender.c:544 +#: storage/file/buffile.c:445 storage/file/copydir.c:195 +#: utils/adt/genfile.c:202 utils/adt/misc.c:859 utils/cache/relmapper.c:744 #, c-format msgid "could not read file \"%s\": %m" msgstr "не вдалося прочитати файл \"%s\": %m" #: ../common/controldata_utils.c:97 ../common/controldata_utils.c:101 -#: access/transam/twophase.c:1279 access/transam/xlog.c:3508 -#: access/transam/xlog.c:4733 replication/logical/origin.c:722 -#: replication/logical/origin.c:761 replication/logical/snapbuild.c:1746 -#: replication/logical/snapbuild.c:1788 replication/logical/snapbuild.c:1816 -#: replication/logical/snapbuild.c:1843 replication/slot.c:1626 -#: replication/slot.c:1667 replication/walsender.c:548 -#: utils/cache/relmapper.c:745 +#: access/transam/xlog.c:3550 access/transam/xlog.c:4775 +#: replication/basebackup.c:2024 replication/logical/origin.c:734 +#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1738 +#: replication/logical/snapbuild.c:1780 replication/logical/snapbuild.c:1807 +#: replication/slot.c:1724 replication/slot.c:1765 replication/walsender.c:549 +#: utils/cache/relmapper.c:748 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "не вдалося прочитати файл \"%s\": прочитано %d з %zu" #: ../common/controldata_utils.c:112 ../common/controldata_utils.c:117 #: ../common/controldata_utils.c:256 ../common/controldata_utils.c:259 -#: access/heap/rewriteheap.c:1181 access/heap/rewriteheap.c:1284 +#: access/heap/rewriteheap.c:1185 access/heap/rewriteheap.c:1288 #: access/transam/timeline.c:392 access/transam/timeline.c:438 -#: access/transam/timeline.c:516 access/transam/twophase.c:1288 -#: access/transam/twophase.c:1676 access/transam/xlog.c:3375 -#: access/transam/xlog.c:3543 access/transam/xlog.c:3548 -#: access/transam/xlog.c:3876 access/transam/xlog.c:4698 -#: access/transam/xlog.c:5622 access/transam/xlogfuncs.c:687 -#: commands/copy.c:1810 libpq/be-fsstubs.c:462 libpq/be-fsstubs.c:533 -#: replication/logical/origin.c:655 replication/logical/origin.c:794 -#: replication/logical/reorderbuffer.c:3657 -#: replication/logical/snapbuild.c:1653 replication/logical/snapbuild.c:1851 -#: replication/slot.c:1513 replication/slot.c:1674 replication/walsender.c:558 -#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:704 -#: storage/file/fd.c:3425 storage/file/fd.c:3528 utils/cache/relmapper.c:753 -#: utils/cache/relmapper.c:892 +#: access/transam/timeline.c:516 access/transam/twophase.c:1283 +#: access/transam/twophase.c:1680 access/transam/xlog.c:3417 +#: access/transam/xlog.c:3585 access/transam/xlog.c:3590 +#: access/transam/xlog.c:3918 access/transam/xlog.c:4740 +#: access/transam/xlog.c:5665 access/transam/xlogfuncs.c:728 +#: commands/copyfrom.c:1576 commands/copyto.c:328 libpq/be-fsstubs.c:462 +#: libpq/be-fsstubs.c:533 replication/logical/origin.c:667 +#: replication/logical/origin.c:806 replication/logical/reorderbuffer.c:4965 +#: replication/logical/snapbuild.c:1642 replication/logical/snapbuild.c:1815 +#: replication/slot.c:1611 replication/slot.c:1772 replication/walsender.c:559 +#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:738 +#: storage/file/fd.c:3534 storage/file/fd.c:3637 utils/cache/relmapper.c:759 +#: utils/cache/relmapper.c:898 #, c-format msgid "could not close file \"%s\": %m" msgstr "неможливо закрити файл \"%s\": %m" @@ -96,125 +95,126 @@ msgstr "можлива помилка у послідовності байтів "Порядок байтів, що використовують для зберігання файлу pg_control, може не відповідати тому, який використовується цією програмою. У такому випадку результати нижче будуть неправильним, і інсталяція PostgreSQL буде несумісною з цим каталогом даних." #: ../common/controldata_utils.c:197 ../common/controldata_utils.c:203 -#: ../common/file_utils.c:224 ../common/file_utils.c:283 -#: ../common/file_utils.c:357 access/heap/rewriteheap.c:1267 +#: ../common/file_utils.c:232 ../common/file_utils.c:291 +#: ../common/file_utils.c:365 access/heap/rewriteheap.c:1271 #: access/transam/timeline.c:111 access/transam/timeline.c:251 -#: access/transam/timeline.c:348 access/transam/twophase.c:1232 -#: access/transam/xlog.c:3277 access/transam/xlog.c:3417 -#: access/transam/xlog.c:3458 access/transam/xlog.c:3656 -#: access/transam/xlog.c:3741 access/transam/xlog.c:3844 -#: access/transam/xlog.c:4718 access/transam/xlogutils.c:807 -#: postmaster/syslogger.c:1488 replication/basebackup.c:621 -#: replication/basebackup.c:1593 replication/logical/origin.c:707 -#: replication/logical/reorderbuffer.c:2465 -#: replication/logical/reorderbuffer.c:2825 -#: replication/logical/reorderbuffer.c:3579 -#: replication/logical/snapbuild.c:1608 replication/logical/snapbuild.c:1712 -#: replication/slot.c:1594 replication/walsender.c:516 -#: replication/walsender.c:2516 storage/file/copydir.c:161 -#: storage/file/fd.c:679 storage/file/fd.c:3412 storage/file/fd.c:3499 -#: storage/smgr/md.c:475 utils/cache/relmapper.c:724 -#: utils/cache/relmapper.c:836 utils/error/elog.c:1858 -#: utils/init/miscinit.c:1316 utils/init/miscinit.c:1450 -#: utils/init/miscinit.c:1527 utils/misc/guc.c:8252 utils/misc/guc.c:8284 +#: access/transam/timeline.c:348 access/transam/twophase.c:1227 +#: access/transam/xlog.c:3303 access/transam/xlog.c:3459 +#: access/transam/xlog.c:3500 access/transam/xlog.c:3698 +#: access/transam/xlog.c:3783 access/transam/xlog.c:3886 +#: access/transam/xlog.c:4760 access/transam/xlogutils.c:803 +#: postmaster/syslogger.c:1488 replication/basebackup.c:616 +#: replication/basebackup.c:1610 replication/logical/origin.c:719 +#: replication/logical/reorderbuffer.c:3572 +#: replication/logical/reorderbuffer.c:4121 +#: replication/logical/reorderbuffer.c:4887 +#: replication/logical/snapbuild.c:1597 replication/logical/snapbuild.c:1704 +#: replication/slot.c:1692 replication/walsender.c:517 +#: replication/walsender.c:2526 storage/file/copydir.c:161 +#: storage/file/fd.c:713 storage/file/fd.c:3298 storage/file/fd.c:3521 +#: storage/file/fd.c:3608 storage/smgr/md.c:502 utils/cache/relmapper.c:724 +#: utils/cache/relmapper.c:842 utils/error/elog.c:1938 +#: utils/init/miscinit.c:1346 utils/init/miscinit.c:1480 +#: utils/init/miscinit.c:1557 utils/misc/guc.c:8605 utils/misc/guc.c:8637 #, c-format msgid "could not open file \"%s\": %m" msgstr "не можливо відкрити файл \"%s\": %m" #: ../common/controldata_utils.c:221 ../common/controldata_utils.c:224 -#: access/transam/twophase.c:1649 access/transam/twophase.c:1658 -#: access/transam/xlog.c:10878 access/transam/xlog.c:10916 -#: access/transam/xlog.c:11329 access/transam/xlogfuncs.c:741 -#: postmaster/syslogger.c:1499 postmaster/syslogger.c:1512 -#: utils/cache/relmapper.c:870 +#: access/transam/twophase.c:1653 access/transam/twophase.c:1662 +#: access/transam/xlog.c:11124 access/transam/xlog.c:11162 +#: access/transam/xlog.c:11575 access/transam/xlogfuncs.c:782 +#: postmaster/postmaster.c:5658 postmaster/syslogger.c:1499 +#: postmaster/syslogger.c:1512 utils/cache/relmapper.c:876 #, c-format msgid "could not write file \"%s\": %m" msgstr "не вдалося записати файл \"%s\": %m" #: ../common/controldata_utils.c:239 ../common/controldata_utils.c:245 -#: ../common/file_utils.c:295 ../common/file_utils.c:365 -#: access/heap/rewriteheap.c:961 access/heap/rewriteheap.c:1175 -#: access/heap/rewriteheap.c:1278 access/transam/timeline.c:432 -#: access/transam/timeline.c:510 access/transam/twophase.c:1670 -#: access/transam/xlog.c:3368 access/transam/xlog.c:3537 -#: access/transam/xlog.c:4691 access/transam/xlog.c:10386 -#: access/transam/xlog.c:10413 replication/logical/snapbuild.c:1646 -#: replication/slot.c:1499 replication/slot.c:1604 storage/file/fd.c:696 -#: storage/file/fd.c:3520 storage/smgr/md.c:921 storage/smgr/md.c:962 -#: storage/sync/sync.c:396 utils/cache/relmapper.c:885 utils/misc/guc.c:8035 +#: ../common/file_utils.c:303 ../common/file_utils.c:373 +#: access/heap/rewriteheap.c:967 access/heap/rewriteheap.c:1179 +#: access/heap/rewriteheap.c:1282 access/transam/timeline.c:432 +#: access/transam/timeline.c:510 access/transam/twophase.c:1674 +#: access/transam/xlog.c:3410 access/transam/xlog.c:3579 +#: access/transam/xlog.c:4733 access/transam/xlog.c:10615 +#: access/transam/xlog.c:10656 replication/logical/snapbuild.c:1635 +#: replication/slot.c:1597 replication/slot.c:1702 storage/file/fd.c:730 +#: storage/file/fd.c:3629 storage/smgr/md.c:950 storage/smgr/md.c:991 +#: storage/sync/sync.c:417 utils/cache/relmapper.c:891 utils/misc/guc.c:8392 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "не вдалося fsync файл \"%s\": %m" -#: ../common/exec.c:137 ../common/exec.c:254 ../common/exec.c:300 +#: ../common/cryptohash_openssl.c:104 ../common/exec.c:522 ../common/exec.c:567 +#: ../common/exec.c:659 ../common/hmac_openssl.c:103 ../common/psprintf.c:143 +#: ../common/stringinfo.c:305 ../port/path.c:630 ../port/path.c:668 +#: ../port/path.c:685 access/transam/twophase.c:1341 access/transam/xlog.c:6640 +#: lib/dshash.c:246 libpq/auth.c:1491 libpq/auth.c:1559 libpq/auth.c:2117 +#: libpq/be-secure-gssapi.c:520 postmaster/bgworker.c:349 +#: postmaster/bgworker.c:948 postmaster/postmaster.c:2516 +#: postmaster/postmaster.c:4174 postmaster/postmaster.c:4844 +#: postmaster/postmaster.c:5583 postmaster/postmaster.c:5947 +#: replication/libpqwalreceiver/libpqwalreceiver.c:283 +#: replication/logical/logical.c:205 replication/walsender.c:591 +#: storage/buffer/localbuf.c:442 storage/file/fd.c:882 storage/file/fd.c:1352 +#: storage/file/fd.c:1513 storage/file/fd.c:2321 storage/ipc/procarray.c:1422 +#: storage/ipc/procarray.c:2247 storage/ipc/procarray.c:2254 +#: storage/ipc/procarray.c:2743 storage/ipc/procarray.c:3367 +#: utils/adt/cryptohashfuncs.c:46 utils/adt/cryptohashfuncs.c:66 +#: utils/adt/formatting.c:1699 utils/adt/formatting.c:1823 +#: utils/adt/formatting.c:1948 utils/adt/pg_locale.c:450 +#: utils/adt/pg_locale.c:614 utils/adt/regexp.c:223 utils/fmgr/dfmgr.c:229 +#: utils/hash/dynahash.c:513 utils/hash/dynahash.c:613 +#: utils/hash/dynahash.c:1116 utils/mb/mbutils.c:401 utils/mb/mbutils.c:429 +#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5036 +#: utils/misc/guc.c:5052 utils/misc/guc.c:5065 utils/misc/guc.c:8370 +#: utils/misc/tzparser.c:467 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:701 +#: utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:234 +#: utils/mmgr/mcxt.c:888 utils/mmgr/mcxt.c:924 utils/mmgr/mcxt.c:962 +#: utils/mmgr/mcxt.c:1000 utils/mmgr/mcxt.c:1082 utils/mmgr/mcxt.c:1113 +#: utils/mmgr/mcxt.c:1149 utils/mmgr/mcxt.c:1201 utils/mmgr/mcxt.c:1236 +#: utils/mmgr/mcxt.c:1271 utils/mmgr/slab.c:236 +#, c-format +msgid "out of memory" +msgstr "недостатньо пам'яті" + +#: ../common/exec.c:136 ../common/exec.c:253 ../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "не вдалося визначити поточний каталог: %m" -#: ../common/exec.c:156 +#: ../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "невірний бінарний файл \"%s\"" -#: ../common/exec.c:206 +#: ../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "неможливо прочитати бінарний файл \"%s\"" -#: ../common/exec.c:214 +#: ../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "неможливо знайти \"%s\" для виконання" -#: ../common/exec.c:270 ../common/exec.c:309 utils/init/miscinit.c:395 +#: ../common/exec.c:269 ../common/exec.c:308 utils/init/miscinit.c:425 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не вдалося змінити каталог на \"%s\": %m" -#: ../common/exec.c:287 access/transam/xlog.c:10750 -#: replication/basebackup.c:1418 utils/adt/misc.c:337 +#: ../common/exec.c:286 access/transam/xlog.c:10998 +#: replication/basebackup.c:1428 utils/adt/misc.c:340 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не можливо прочитати символічне послання \"%s\": %m" -#: ../common/exec.c:410 -#, c-format -msgid "pclose failed: %m" -msgstr "помилка pclose: %m" - -#: ../common/exec.c:539 ../common/exec.c:584 ../common/exec.c:676 -#: ../common/psprintf.c:143 ../common/stringinfo.c:305 ../port/path.c:630 -#: ../port/path.c:668 ../port/path.c:685 access/transam/twophase.c:1341 -#: access/transam/xlog.c:6493 lib/dshash.c:246 libpq/auth.c:1090 -#: libpq/auth.c:1491 libpq/auth.c:1559 libpq/auth.c:2089 -#: libpq/be-secure-gssapi.c:484 postmaster/bgworker.c:336 -#: postmaster/bgworker.c:893 postmaster/postmaster.c:2518 -#: postmaster/postmaster.c:2540 postmaster/postmaster.c:4166 -#: postmaster/postmaster.c:4868 postmaster/postmaster.c:4938 -#: postmaster/postmaster.c:5635 postmaster/postmaster.c:5995 -#: replication/libpqwalreceiver/libpqwalreceiver.c:276 -#: replication/logical/logical.c:176 replication/walsender.c:590 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:834 storage/file/fd.c:1304 -#: storage/file/fd.c:1465 storage/file/fd.c:2270 storage/ipc/procarray.c:1045 -#: storage/ipc/procarray.c:1541 storage/ipc/procarray.c:1548 -#: storage/ipc/procarray.c:1972 storage/ipc/procarray.c:2597 -#: utils/adt/cryptohashes.c:45 utils/adt/cryptohashes.c:65 -#: utils/adt/formatting.c:1698 utils/adt/formatting.c:1822 -#: utils/adt/formatting.c:1947 utils/adt/pg_locale.c:484 -#: utils/adt/pg_locale.c:648 utils/adt/regexp.c:223 utils/fmgr/dfmgr.c:229 -#: utils/hash/dynahash.c:450 utils/hash/dynahash.c:559 -#: utils/hash/dynahash.c:1071 utils/mb/mbutils.c:401 utils/mb/mbutils.c:428 -#: utils/mb/mbutils.c:757 utils/mb/mbutils.c:783 utils/misc/guc.c:4846 -#: utils/misc/guc.c:4862 utils/misc/guc.c:4875 utils/misc/guc.c:8013 -#: utils/misc/tzparser.c:467 utils/mmgr/aset.c:475 utils/mmgr/dsa.c:701 -#: utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:233 -#: utils/mmgr/mcxt.c:821 utils/mmgr/mcxt.c:857 utils/mmgr/mcxt.c:895 -#: utils/mmgr/mcxt.c:933 utils/mmgr/mcxt.c:969 utils/mmgr/mcxt.c:1000 -#: utils/mmgr/mcxt.c:1036 utils/mmgr/mcxt.c:1088 utils/mmgr/mcxt.c:1123 -#: utils/mmgr/mcxt.c:1158 utils/mmgr/slab.c:235 +#: ../common/exec.c:409 libpq/pqcomm.c:746 storage/ipc/latch.c:1064 +#: storage/ipc/latch.c:1233 storage/ipc/latch.c:1462 storage/ipc/latch.c:1614 +#: storage/ipc/latch.c:1730 #, c-format -msgid "out of memory" -msgstr "недостатньо пам'яті" +msgid "%s() failed: %m" +msgstr "%s() помилка: %m" #: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 #: ../common/fe_memutils.c:98 ../common/fe_memutils.c:162 @@ -230,137 +230,163 @@ msgstr "недостатньо пам'яті\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "неможливо дублювати нульовий покажчик (внутрішня помилка)\n" -#: ../common/file_utils.c:79 ../common/file_utils.c:181 -#: access/transam/twophase.c:1244 access/transam/xlog.c:10854 -#: access/transam/xlog.c:10892 access/transam/xlog.c:11109 -#: access/transam/xlogarchive.c:110 access/transam/xlogarchive.c:226 -#: commands/copy.c:1938 commands/copy.c:3505 commands/extension.c:3425 -#: commands/tablespace.c:795 commands/tablespace.c:886 -#: replication/basebackup.c:444 replication/basebackup.c:627 -#: replication/basebackup.c:700 replication/logical/snapbuild.c:1522 -#: storage/file/copydir.c:68 storage/file/copydir.c:107 storage/file/fd.c:1816 -#: storage/file/fd.c:3096 storage/file/fd.c:3278 storage/file/fd.c:3364 -#: utils/adt/dbsize.c:70 utils/adt/dbsize.c:222 utils/adt/dbsize.c:302 -#: utils/adt/genfile.c:416 utils/adt/genfile.c:642 guc-file.l:1061 +#: ../common/file_utils.c:87 ../common/file_utils.c:451 +#: ../common/file_utils.c:455 access/transam/twophase.c:1239 +#: access/transam/xlog.c:11100 access/transam/xlog.c:11138 +#: access/transam/xlog.c:11355 access/transam/xlogarchive.c:110 +#: access/transam/xlogarchive.c:227 commands/copyfrom.c:1526 +#: commands/copyto.c:728 commands/extension.c:3453 commands/tablespace.c:807 +#: commands/tablespace.c:898 replication/basebackup.c:439 +#: replication/basebackup.c:622 replication/basebackup.c:698 +#: replication/logical/snapbuild.c:1514 storage/file/copydir.c:68 +#: storage/file/copydir.c:107 storage/file/fd.c:1863 storage/file/fd.c:1949 +#: storage/file/fd.c:3149 storage/file/fd.c:3353 utils/adt/dbsize.c:70 +#: utils/adt/dbsize.c:222 utils/adt/dbsize.c:302 utils/adt/genfile.c:418 +#: utils/adt/genfile.c:644 guc-file.l:1062 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не вдалося отримати інформацію від файлу \"%s\": %m" -#: ../common/file_utils.c:158 ../common/pgfnames.c:48 commands/tablespace.c:718 -#: commands/tablespace.c:728 postmaster/postmaster.c:1509 -#: storage/file/fd.c:2673 storage/file/reinit.c:122 utils/adt/misc.c:259 +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:730 +#: commands/tablespace.c:740 postmaster/postmaster.c:1515 +#: storage/file/fd.c:2724 storage/file/reinit.c:122 utils/adt/misc.c:262 #: utils/misc/tzparser.c:338 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не вдалося відкрити каталог \"%s\": %m" -#: ../common/file_utils.c:192 ../common/pgfnames.c:69 storage/file/fd.c:2685 +#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2736 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не вдалося прочитати каталог \"%s\": %m" -#: ../common/file_utils.c:375 access/transam/xlogarchive.c:411 -#: postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1665 -#: replication/slot.c:650 replication/slot.c:1385 replication/slot.c:1527 -#: storage/file/fd.c:714 utils/time/snapmgr.c:1350 +#: ../common/file_utils.c:383 access/transam/xlogarchive.c:412 +#: postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1654 +#: replication/slot.c:643 replication/slot.c:1483 replication/slot.c:1625 +#: storage/file/fd.c:748 storage/file/fd.c:846 utils/time/snapmgr.c:1265 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "не вдалося перейменувати файл \"%s\" на \"%s\": %m" -#: ../common/jsonapi.c:1064 +#: ../common/hex.c:54 +#, c-format +msgid "invalid hexadecimal digit" +msgstr "неприпустиме шістнадцяткове число" + +#: ../common/hex.c:59 +#, c-format +msgid "invalid hexadecimal digit: \"%.*s\"" +msgstr "неприпустиме шістнадцяткове число: \"%.*s\"" + +#: ../common/hex.c:90 +#, c-format +msgid "overflow of destination buffer in hex encoding" +msgstr "переповнення буфера призначення в шістнадцятковому кодуванні" + +#: ../common/hex.c:136 ../common/hex.c:141 +#, c-format +msgid "invalid hexadecimal data: odd number of digits" +msgstr "неприпустимі шістнадцядкові дані: непарна кількість чисел" + +#: ../common/hex.c:152 +#, c-format +msgid "overflow of destination buffer in hex decoding" +msgstr "переповнення буфера призначення в шістнадцятковому декодуванні" + +#: ../common/jsonapi.c:1066 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Неприпустима спеціальна послідовність \"\\%s\"." -#: ../common/jsonapi.c:1067 +#: ../common/jsonapi.c:1069 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ зі значенням 0x%02x повинен бути пропущений." -#: ../common/jsonapi.c:1070 +#: ../common/jsonapi.c:1072 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Очікувався кінець введення, але знайдено \"%s\"." -#: ../common/jsonapi.c:1073 +#: ../common/jsonapi.c:1075 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Очікувався елемент масиву або \"]\", але знайдено \"%s\"." -#: ../common/jsonapi.c:1076 +#: ../common/jsonapi.c:1078 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "Очікувалось \",\" або \"]\", але знайдено \"%s\"." -#: ../common/jsonapi.c:1079 +#: ../common/jsonapi.c:1081 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "Очікувалось \":\", але знайдено \"%s\"." -#: ../common/jsonapi.c:1082 +#: ../common/jsonapi.c:1084 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Очікувалось значення JSON, але знайдено \"%s\"." -#: ../common/jsonapi.c:1085 +#: ../common/jsonapi.c:1087 msgid "The input string ended unexpectedly." msgstr "Несподіваний кінець вхідного рядка." -#: ../common/jsonapi.c:1087 +#: ../common/jsonapi.c:1089 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Очікувався рядок або \"}\", але знайдено \"%s\"." -#: ../common/jsonapi.c:1090 +#: ../common/jsonapi.c:1092 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "Очікувалось \",\" або \"}\", але знайдено \"%s\"." -#: ../common/jsonapi.c:1093 +#: ../common/jsonapi.c:1095 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Очікувався рядок, але знайдено \"%s\"." -#: ../common/jsonapi.c:1096 +#: ../common/jsonapi.c:1098 #, c-format msgid "Token \"%s\" is invalid." msgstr "Неприпустимий маркер \"%s\"." -#: ../common/jsonapi.c:1099 jsonpath_scan.l:499 +#: ../common/jsonapi.c:1101 jsonpath_scan.l:499 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 не можна перетворити в текст." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:1103 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" повинні прямувати чотири шістнадцяткових числа." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:1106 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Значення виходу Unicode не можна використовувати для значень кодових точок більше 007F, якщо кодування не UTF8." -#: ../common/jsonapi.c:1106 jsonpath_scan.l:520 +#: ../common/jsonapi.c:1108 jsonpath_scan.l:520 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Старший сурогат Unicode не повинен прямувати за іншим старшим сурогатом." -#: ../common/jsonapi.c:1108 jsonpath_scan.l:531 jsonpath_scan.l:541 +#: ../common/jsonapi.c:1110 jsonpath_scan.l:531 jsonpath_scan.l:541 #: jsonpath_scan.l:583 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Молодший сурогат Unicode не повинен прямувати за іншим молодшим сурогатом." -#: ../common/logging.c:236 +#: ../common/logging.c:259 #, c-format msgid "fatal: " msgstr "збій: " -#: ../common/logging.c:243 +#: ../common/logging.c:266 #, c-format msgid "error: " msgstr "помилка: " -#: ../common/logging.c:250 +#: ../common/logging.c:273 #, c-format msgid "warning: " msgstr "попередження: " @@ -380,7 +406,7 @@ msgstr "неприпустима назва відгалуження" msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." msgstr "Дозволені назви відгалуження: \"main\", \"fsm\", \"vm\" або \"init\"." -#: ../common/restricted_token.c:64 libpq/auth.c:1521 libpq/auth.c:2520 +#: ../common/restricted_token.c:64 libpq/auth.c:1521 libpq/auth.c:2553 #, c-format msgid "could not load library \"%s\": error code %lu" msgstr "не вдалося завантажити бібліотеку \"%s\": код помилки %lu" @@ -420,8 +446,8 @@ msgstr "не вдалося перезапустити з обмеженим т msgid "could not get exit code from subprocess: error code %lu" msgstr "не вдалося отримати код завершення підпроцесу: код помилки %lu" -#: ../common/rmtree.c:79 replication/basebackup.c:1171 -#: replication/basebackup.c:1347 +#: ../common/rmtree.c:79 replication/basebackup.c:1181 +#: replication/basebackup.c:1357 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "не вдалося отримати інформацію про файл або каталог \"%s\": %m" @@ -431,11 +457,6 @@ msgstr "не вдалося отримати інформацію про фай msgid "could not remove file or directory \"%s\": %m" msgstr "не вдалося видалити файл або каталог \"%s\": %m" -#: ../common/saslprep.c:1087 -#, c-format -msgid "password too long" -msgstr "пароль задовгий" - #: ../common/stringinfo.c:306 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." @@ -453,7 +474,7 @@ msgstr "недостатньо пам'яті\n\n" msgid "could not look up effective user ID %ld: %s" msgstr "не можу знайти користувача з ефективним ID %ld: %s" -#: ../common/username.c:45 libpq/auth.c:2027 +#: ../common/username.c:45 libpq/auth.c:2053 msgid "user does not exist" msgstr "користувача не існує" @@ -570,13 +591,13 @@ msgstr "не вдалося отримати SID для групи PowerUsers: msgid "could not check access token membership: error code %lu\n" msgstr "не вдається перевірити членство токену доступу: код помилки %lu\n" -#: access/brin/brin.c:210 +#: access/brin/brin.c:214 #, c-format msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "запит на підсумок діапазону BRIN для індексу «%s» сторінки %u не вдалося записати" -#: access/brin/brin.c:873 access/brin/brin.c:950 access/gin/ginfast.c:1035 -#: access/transam/xlog.c:10522 access/transam/xlog.c:11060 +#: access/brin/brin.c:1015 access/brin/brin.c:1092 access/gin/ginfast.c:1035 +#: access/transam/xlog.c:10777 access/transam/xlog.c:11306 #: access/transam/xlogfuncs.c:274 access/transam/xlogfuncs.c:301 #: access/transam/xlogfuncs.c:340 access/transam/xlogfuncs.c:361 #: access/transam/xlogfuncs.c:382 access/transam/xlogfuncs.c:452 @@ -585,80 +606,106 @@ msgstr "запит на підсумок діапазону BRIN для інде msgid "recovery is in progress" msgstr "відновлення у процесі" -#: access/brin/brin.c:874 access/brin/brin.c:951 +#: access/brin/brin.c:1016 access/brin/brin.c:1093 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "Контрольна функція BRIN не може бути виконана під час відновлення." -#: access/brin/brin.c:882 access/brin/brin.c:959 +#: access/brin/brin.c:1024 access/brin/brin.c:1101 #, c-format msgid "block number out of range: %s" msgstr "заблоковане число за межами діапазону: %s" -#: access/brin/brin.c:905 access/brin/brin.c:982 +#: access/brin/brin.c:1047 access/brin/brin.c:1124 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\" не є індексом BRIN" -#: access/brin/brin.c:921 access/brin/brin.c:998 +#: access/brin/brin.c:1063 access/brin/brin.c:1140 +#, c-format +msgid "could not open parent table of index \"%s\"" +msgstr "не вдалося відкрити батьківську таблицю індексу \"%s\"" + +#: access/brin/brin_bloom.c:751 access/brin/brin_bloom.c:793 +#: access/brin/brin_minmax_multi.c:2987 access/brin/brin_minmax_multi.c:3130 +#: statistics/dependencies.c:651 statistics/dependencies.c:704 +#: statistics/mcv.c:1483 statistics/mcv.c:1514 statistics/mvdistinct.c:343 +#: statistics/mvdistinct.c:396 utils/adt/pseudotypes.c:43 +#: utils/adt/pseudotypes.c:77 utils/adt/pseudotypes.c:252 #, c-format -msgid "could not open parent table of index %s" -msgstr "не вдалося відкрити батьківську таблицю індексу %s" +msgid "cannot accept a value of type %s" +msgstr "не можна прийняти значення типу %s" + +#: access/brin/brin_minmax_multi.c:2146 access/brin/brin_minmax_multi.c:2153 +#: access/brin/brin_minmax_multi.c:2160 utils/adt/timestamp.c:941 +#: utils/adt/timestamp.c:1515 utils/adt/timestamp.c:1982 +#: utils/adt/timestamp.c:3059 utils/adt/timestamp.c:3064 +#: utils/adt/timestamp.c:3069 utils/adt/timestamp.c:3119 +#: utils/adt/timestamp.c:3126 utils/adt/timestamp.c:3133 +#: utils/adt/timestamp.c:3153 utils/adt/timestamp.c:3160 +#: utils/adt/timestamp.c:3167 utils/adt/timestamp.c:3197 +#: utils/adt/timestamp.c:3205 utils/adt/timestamp.c:3249 +#: utils/adt/timestamp.c:3676 utils/adt/timestamp.c:3801 +#: utils/adt/timestamp.c:4359 +#, c-format +msgid "interval out of range" +msgstr "інтервал поза діапазоном" #: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 #: access/brin/brin_pageops.c:843 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1435 access/spgist/spgdoinsert.c:1957 +#: access/gist/gist.c:1441 access/spgist/spgdoinsert.c:2000 +#: access/spgist/spgdoinsert.c:2275 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "розмір рядка індексу %zu перевищує максимальний %zu для індексу \"%s\"" -#: access/brin/brin_revmap.c:392 access/brin/brin_revmap.c:398 +#: access/brin/brin_revmap.c:393 access/brin/brin_revmap.c:399 #, c-format msgid "corrupted BRIN index: inconsistent range map" msgstr "пошкоджений BRIN індекс: несумісна карта діапазонів" -#: access/brin/brin_revmap.c:601 +#: access/brin/brin_revmap.c:602 #, c-format msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" msgstr "неочікуваний тип сторінки 0x%04X в BRIN індексі \"%s\" блокує %u" #: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:151 -#: access/gist/gistvalidate.c:149 access/hash/hashvalidate.c:136 -#: access/nbtree/nbtvalidate.c:117 access/spgist/spgvalidate.c:168 +#: access/gist/gistvalidate.c:153 access/hash/hashvalidate.c:139 +#: access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:189 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with invalid support number %d" msgstr "сімейство операторів \"%s\" методу доступу %s містить функцію %s з недопустимим номером підтримки %d" #: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:163 -#: access/gist/gistvalidate.c:161 access/hash/hashvalidate.c:115 -#: access/nbtree/nbtvalidate.c:129 access/spgist/spgvalidate.c:180 +#: access/gist/gistvalidate.c:165 access/hash/hashvalidate.c:118 +#: access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:201 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with wrong signature for support number %d" msgstr "сімейство операторів \"%s\" з доступом %s містить функцію %s з неправильним підписом для номеру підтримки %d" #: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:182 -#: access/gist/gistvalidate.c:181 access/hash/hashvalidate.c:157 -#: access/nbtree/nbtvalidate.c:149 access/spgist/spgvalidate.c:200 +#: access/gist/gistvalidate.c:185 access/hash/hashvalidate.c:160 +#: access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:221 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with invalid strategy number %d" msgstr "сімейство операторів \"%s\" з доступом %s містить оператор %s з недопустимим стратегічним номером %d" #: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:195 -#: access/hash/hashvalidate.c:170 access/nbtree/nbtvalidate.c:162 -#: access/spgist/spgvalidate.c:216 +#: access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 +#: access/spgist/spgvalidate.c:237 #, c-format msgid "operator family \"%s\" of access method %s contains invalid ORDER BY specification for operator %s" msgstr "сімейство операторів \"%s\" з доступом %s містить некоректну специфікацію ORDER BY для оператора %s" #: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:208 -#: access/gist/gistvalidate.c:229 access/hash/hashvalidate.c:183 -#: access/nbtree/nbtvalidate.c:175 access/spgist/spgvalidate.c:232 +#: access/gist/gistvalidate.c:233 access/hash/hashvalidate.c:186 +#: access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:253 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with wrong signature" msgstr "сімейство операторів \"%s\" з доступом %s містить оператор %s з неправильним підписом" -#: access/brin/brin_validate.c:236 access/hash/hashvalidate.c:223 -#: access/nbtree/nbtvalidate.c:233 access/spgist/spgvalidate.c:259 +#: access/brin/brin_validate.c:236 access/hash/hashvalidate.c:226 +#: access/nbtree/nbtvalidate.c:236 access/spgist/spgvalidate.c:280 #, c-format msgid "operator family \"%s\" of access method %s is missing operator(s) for types %s and %s" msgstr "сімейство операторів \"%s\" методу доступу %s не містить операторів для типів %s і %s" @@ -668,14 +715,14 @@ msgstr "сімейство операторів \"%s\" методу доступ msgid "operator family \"%s\" of access method %s is missing support function(s) for types %s and %s" msgstr "сімейство операторів \"%s\" з методом доступа %s не містить функцію підтримки для типів %s і %s" -#: access/brin/brin_validate.c:259 access/hash/hashvalidate.c:237 -#: access/nbtree/nbtvalidate.c:257 access/spgist/spgvalidate.c:294 +#: access/brin/brin_validate.c:259 access/hash/hashvalidate.c:240 +#: access/nbtree/nbtvalidate.c:260 access/spgist/spgvalidate.c:315 #, c-format msgid "operator class \"%s\" of access method %s is missing operator(s)" msgstr "клас операторів \"%s\" з методом доступа %s не має операторів" #: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:250 -#: access/gist/gistvalidate.c:270 +#: access/gist/gistvalidate.c:274 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d" msgstr "клас операторів \"%s\" з доступом %s немає функції підтримки %d" @@ -715,92 +762,108 @@ msgstr "кількість стовпців (%d) перевищує обмеже msgid "number of index columns (%d) exceeds limit (%d)" msgstr "кількість індексних стовпців (%d) перевищує обмеження (%d)" -#: access/common/indextuple.c:187 access/spgist/spgutils.c:703 +#: access/common/indextuple.c:190 access/spgist/spgutils.c:947 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "індексний рядок вимагає %zu байтів, максимальний розмір %zu" -#: access/common/printtup.c:369 tcop/fastpath.c:180 tcop/fastpath.c:530 -#: tcop/postgres.c:1904 +#: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 +#: tcop/postgres.c:1900 #, c-format msgid "unsupported format code: %d" msgstr "цей формат коду не підтримується:%d" -#: access/common/reloptions.c:506 +#: access/common/reloptions.c:512 access/common/reloptions.c:523 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "Дійсні значення \"увімкнено\", \"вимкнено\" та \"автоматично\"." -#: access/common/reloptions.c:517 +#: access/common/reloptions.c:534 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "Припустимі значення лише \"local\" і \"cascaded\"." -#: access/common/reloptions.c:665 +#: access/common/reloptions.c:682 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "перевищено встановлене користувачем обмеження типу параметрів відношення" -#: access/common/reloptions.c:1208 +#: access/common/reloptions.c:1225 #, c-format msgid "RESET must not include values for parameters" msgstr "RESET не має містити значення для параметрів" -#: access/common/reloptions.c:1240 +#: access/common/reloptions.c:1257 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "нерозпізнаний параметр простору імен \"%s\"" -#: access/common/reloptions.c:1277 utils/misc/guc.c:12004 +#: access/common/reloptions.c:1294 utils/misc/guc.c:12515 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "таблиці, позначені WITH OIDS, не підтримуються" -#: access/common/reloptions.c:1447 +#: access/common/reloptions.c:1464 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "нерозпізнаний параметр \"%s\"" -#: access/common/reloptions.c:1559 +#: access/common/reloptions.c:1576 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "параметр «%s» вказано кілька разів" -#: access/common/reloptions.c:1575 +#: access/common/reloptions.c:1592 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "неприпустиме значення для булевого параметра \"%s\": %s" -#: access/common/reloptions.c:1587 +#: access/common/reloptions.c:1604 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "неприпустиме значення для цілого параметра \"%s\": %s" -#: access/common/reloptions.c:1593 access/common/reloptions.c:1613 +#: access/common/reloptions.c:1610 access/common/reloptions.c:1630 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "значення %s поза допустимими межами для параметра \"%s\"" -#: access/common/reloptions.c:1595 +#: access/common/reloptions.c:1612 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Припустимі значення знаходяться між \"%d\" і \"%d\"." -#: access/common/reloptions.c:1607 +#: access/common/reloptions.c:1624 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "неприпустиме значення для числа з плавучою точкою параметра \"%s\": %s" -#: access/common/reloptions.c:1615 +#: access/common/reloptions.c:1632 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Припустимі значення знаходяться між \"%f\" і \"%f\"." -#: access/common/reloptions.c:1637 +#: access/common/reloptions.c:1654 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "неприпустиме значення для параметра переліку \"%s\": %s" -#: access/common/tupdesc.c:842 parser/parse_clause.c:772 -#: parser/parse_relation.c:1803 +#: access/common/toast_compression.c:32 +#, c-format +msgid "compression method lz4 not supported" +msgstr "метод стискання lz4 не підтримується" + +#: access/common/toast_compression.c:33 +#, c-format +msgid "This functionality requires the server to be built with lz4 support." +msgstr "Ця функціональність потребує, щоб сервер був побудований з підтримкою lz4." + +#: access/common/toast_compression.c:34 utils/adt/pg_locale.c:1589 +#: utils/adt/xml.c:224 +#, c-format +msgid "You need to rebuild PostgreSQL using %s." +msgstr "Вам потрібно перебудувати PostgreSQL за допомогою %s." + +#: access/common/tupdesc.c:825 parser/parse_clause.c:771 +#: parser/parse_relation.c:1838 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "стовпець\"%s\" не може бути оголошений SETOF" @@ -830,7 +893,7 @@ msgstr "\"%s\" не є індексом GIN" msgid "cannot access temporary indexes of other sessions" msgstr "доступ до тимчасових індексів з інших сесій заблокований" -#: access/gin/ginget.c:270 access/nbtree/nbtinsert.c:745 +#: access/gin/ginget.c:270 access/nbtree/nbtinsert.c:759 #, c-format msgid "failed to re-find tuple within index \"%s\"" msgstr "не вдалося повторно знайти кортеж в межах індексу \"%s\"" @@ -845,15 +908,15 @@ msgstr "старі індекси GIN не підтримують сканува msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Щоб виправити це, зробіть REINDEX INDEX \"%s\"." -#: access/gin/ginutil.c:144 executor/execExpr.c:1862 -#: utils/adt/arrayfuncs.c:3790 utils/adt/arrayfuncs.c:6418 -#: utils/adt/rowtypes.c:936 +#: access/gin/ginutil.c:145 executor/execExpr.c:2166 +#: utils/adt/arrayfuncs.c:3818 utils/adt/arrayfuncs.c:6452 +#: utils/adt/rowtypes.c:957 #, c-format msgid "could not identify a comparison function for type %s" msgstr "не вдалося визначити порівняльну функцію для типу %s" #: access/gin/ginvalidate.c:92 access/gist/gistvalidate.c:93 -#: access/hash/hashvalidate.c:99 access/spgist/spgvalidate.c:99 +#: access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 #, c-format msgid "operator family \"%s\" of access method %s contains support function %s with different left and right input types" msgstr "сімейство операторів \"%s\" з методом доступу %s містить функцію підтримки %s з різними типами вводу зліва і справа" @@ -863,25 +926,36 @@ msgstr "сімейство операторів \"%s\" з методом дос msgid "operator class \"%s\" of access method %s is missing support function %d or %d" msgstr "клас операторів \"%s\" з методом доступу %s не має функції підтримки %d або %d" -#: access/gist/gist.c:753 access/gist/gistvacuum.c:408 +#: access/gin/ginvalidate.c:333 access/gist/gistvalidate.c:350 +#: access/spgist/spgvalidate.c:387 +#, c-format +msgid "support function number %d is invalid for access method %s" +msgstr "номер функції підтримки %d неприпустимий для методу доступу %s" + +#: access/gist/gist.c:758 access/gist/gistvacuum.c:420 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "індекс \"%s\" містить внутрішній кортеж, позначений як неправильний" -#: access/gist/gist.c:755 access/gist/gistvacuum.c:410 +#: access/gist/gist.c:760 access/gist/gistvacuum.c:422 #, c-format msgid "This is caused by an incomplete page split at crash recovery before upgrading to PostgreSQL 9.1." msgstr "Це викликано неповним поділом сторінки під час відновлення перед покращенням до версії PostgreSQL 9.1." -#: access/gist/gist.c:756 access/gist/gistutil.c:786 access/gist/gistutil.c:797 -#: access/gist/gistvacuum.c:411 access/hash/hashutil.c:227 +#: access/gist/gist.c:761 access/gist/gistutil.c:800 access/gist/gistutil.c:811 +#: access/gist/gistvacuum.c:423 access/hash/hashutil.c:227 #: access/hash/hashutil.c:238 access/hash/hashutil.c:250 -#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:741 -#: access/nbtree/nbtpage.c:752 +#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:810 +#: access/nbtree/nbtpage.c:821 #, c-format msgid "Please REINDEX it." msgstr "Будь ласка, виконайте REINDEX." +#: access/gist/gist.c:1175 +#, c-format +msgid "fixing incomplete split in index \"%s\", block %u" +msgstr "виправлення неповного розділу в індексі \"%s\", блок %u" + #: access/gist/gistsplit.c:446 #, c-format msgid "picksplit method for column %d of index \"%s\" failed" @@ -892,24 +966,24 @@ msgstr "помилка методу picksplit для стовпця %d інде msgid "The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command." msgstr "Індекс не є оптимальним. Щоб оптимізувати його, зв'яжіться з розробником або спробуйте використати стовпець як другий індекс у команді CREATE INDEX." -#: access/gist/gistutil.c:783 access/hash/hashutil.c:224 -#: access/nbtree/nbtpage.c:738 +#: access/gist/gistutil.c:797 access/hash/hashutil.c:224 +#: access/nbtree/nbtpage.c:807 #, c-format msgid "index \"%s\" contains unexpected zero page at block %u" msgstr "індекс \"%s\" містить неочікувану нульову сторінку в блоці %u" -#: access/gist/gistutil.c:794 access/hash/hashutil.c:235 -#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:749 +#: access/gist/gistutil.c:808 access/hash/hashutil.c:235 +#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:818 #, c-format msgid "index \"%s\" contains corrupted page at block %u" msgstr "індекс \"%s\" містить пошкоджену сторінку в блоці %u" -#: access/gist/gistvalidate.c:199 +#: access/gist/gistvalidate.c:203 #, c-format msgid "operator family \"%s\" of access method %s contains unsupported ORDER BY specification for operator %s" msgstr "сімейство операторів \"%s\" з методом доступу %s містить непідтримувану для оператора специфікацію ORDER BY %s" -#: access/gist/gistvalidate.c:210 +#: access/gist/gistvalidate.c:214 #, c-format msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY opfamily specification for operator %s" msgstr "сімейство операторів \"%s\" з методом доступу %s містить некоректну для оператора специфікацію ORDER BY opfamily %s" @@ -920,14 +994,13 @@ msgstr "сімейство операторів \"%s\" з методом дос msgid "could not determine which collation to use for string hashing" msgstr "не вдалося визначити, який параметр сортування використати для обчислення хешу рядків" -#: access/hash/hashfunc.c:256 access/hash/hashfunc.c:312 catalog/heap.c:702 -#: catalog/heap.c:708 commands/createas.c:206 commands/createas.c:489 -#: commands/indexcmds.c:1815 commands/tablecmds.c:16035 commands/view.c:86 -#: parser/parse_utilcmd.c:4203 regex/regc_pg_locale.c:263 -#: utils/adt/formatting.c:1665 utils/adt/formatting.c:1789 -#: utils/adt/formatting.c:1914 utils/adt/like.c:194 +#: access/hash/hashfunc.c:256 access/hash/hashfunc.c:312 catalog/heap.c:713 +#: catalog/heap.c:719 commands/createas.c:206 commands/createas.c:503 +#: commands/indexcmds.c:1869 commands/tablecmds.c:16758 commands/view.c:86 +#: regex/regc_pg_locale.c:263 utils/adt/formatting.c:1666 +#: utils/adt/formatting.c:1790 utils/adt/formatting.c:1915 utils/adt/like.c:194 #: utils/adt/like_support.c:1003 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:994 utils/adt/varchar.c:1054 utils/adt/varlena.c:1476 +#: utils/adt/varchar.c:994 utils/adt/varchar.c:1054 utils/adt/varlena.c:1524 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "Використайте опцію COLLATE для задання параметрів сортування." @@ -937,8 +1010,8 @@ msgstr "Використайте опцію COLLATE для задання пар msgid "index row size %zu exceeds hash maximum %zu" msgstr "індексний рядок розміру %zu перевищує максимальний хеш %zu" -#: access/hash/hashinsert.c:84 access/spgist/spgdoinsert.c:1961 -#: access/spgist/spgutils.c:764 +#: access/hash/hashinsert.c:84 access/spgist/spgdoinsert.c:2004 +#: access/spgist/spgdoinsert.c:2279 access/spgist/spgutils.c:1008 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "Значення, що перевищують буфер сторінки, не можна індексувати." @@ -968,189 +1041,238 @@ msgstr "індекс \"%s\" не є хеш-індексом" msgid "index \"%s\" has wrong hash version" msgstr "індекс \"%s\" має неправильну версію хешу" -#: access/hash/hashvalidate.c:195 +#: access/hash/hashvalidate.c:198 #, c-format msgid "operator family \"%s\" of access method %s lacks support function for operator %s" msgstr "сімейство операторів \"%s\" з методом доступу %s не містить функції підтримки для оператора %s" -#: access/hash/hashvalidate.c:253 access/nbtree/nbtvalidate.c:273 +#: access/hash/hashvalidate.c:256 access/nbtree/nbtvalidate.c:276 #, c-format msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "сімейство операторів \"%s\" з методом доступу %s не містить міжтипового оператора (ів)" -#: access/heap/heapam.c:2024 +#: access/heap/heapam.c:2260 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "не вдалося вставити кортежі в паралельного працівника" -#: access/heap/heapam.c:2442 +#: access/heap/heapam.c:2731 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "не вдалося видалити кортежі під час паралельної операції" -#: access/heap/heapam.c:2488 +#: access/heap/heapam.c:2777 #, c-format msgid "attempted to delete invisible tuple" msgstr "спроба видалити невидимий кортеж" -#: access/heap/heapam.c:2914 access/heap/heapam.c:5703 +#: access/heap/heapam.c:3209 access/heap/heapam.c:6010 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "неможливо оновити кортежі під час паралельної операції" -#: access/heap/heapam.c:3047 +#: access/heap/heapam.c:3342 #, c-format msgid "attempted to update invisible tuple" msgstr "спроба оновити невидимий кортеж" -#: access/heap/heapam.c:4358 access/heap/heapam.c:4396 -#: access/heap/heapam.c:4653 access/heap/heapam_handler.c:450 +#: access/heap/heapam.c:4663 access/heap/heapam.c:4701 +#: access/heap/heapam.c:4957 access/heap/heapam_handler.c:452 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "не вдалося отримати блокування у рядку стосовно \"%s\"" -#: access/heap/heapam_handler.c:399 +#: access/heap/heapam_handler.c:401 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update" msgstr "кортеж, який підлягає блокуванню, вже був переміщений до іншої секції в результаті паралельного оновлення" -#: access/heap/hio.c:345 access/heap/rewriteheap.c:662 +#: access/heap/hio.c:360 access/heap/rewriteheap.c:665 #, c-format msgid "row is too big: size %zu, maximum size %zu" msgstr "рядок завеликий: розмір %zu, максимальний розмір %zu" -#: access/heap/rewriteheap.c:921 +#: access/heap/rewriteheap.c:927 #, c-format msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "не вдалося записати до файлу \"%s\", записано %d з %d: %m" -#: access/heap/rewriteheap.c:1015 access/heap/rewriteheap.c:1134 +#: access/heap/rewriteheap.c:1020 access/heap/rewriteheap.c:1138 #: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:3300 access/transam/xlog.c:3472 -#: access/transam/xlog.c:4670 access/transam/xlog.c:10869 -#: access/transam/xlog.c:10907 access/transam/xlog.c:11312 -#: access/transam/xlogfuncs.c:735 postmaster/postmaster.c:4629 -#: replication/logical/origin.c:575 replication/slot.c:1446 -#: storage/file/copydir.c:167 storage/smgr/md.c:218 utils/time/snapmgr.c:1329 +#: access/transam/xlog.c:3326 access/transam/xlog.c:3514 +#: access/transam/xlog.c:4712 access/transam/xlog.c:11115 +#: access/transam/xlog.c:11153 access/transam/xlog.c:11558 +#: access/transam/xlogfuncs.c:776 postmaster/postmaster.c:4599 +#: postmaster/postmaster.c:5645 replication/logical/origin.c:587 +#: replication/slot.c:1544 storage/file/copydir.c:167 storage/smgr/md.c:218 +#: utils/time/snapmgr.c:1244 #, c-format msgid "could not create file \"%s\": %m" msgstr "неможливо створити файл \"%s\": %m" -#: access/heap/rewriteheap.c:1144 +#: access/heap/rewriteheap.c:1148 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "не вдалося скоротити файл \"%s\" до потрібного розміру %u: %m" -#: access/heap/rewriteheap.c:1162 access/transam/timeline.c:384 +#: access/heap/rewriteheap.c:1166 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3356 access/transam/xlog.c:3528 -#: access/transam/xlog.c:4682 postmaster/postmaster.c:4639 -#: postmaster/postmaster.c:4649 replication/logical/origin.c:587 -#: replication/logical/origin.c:629 replication/logical/origin.c:648 -#: replication/logical/snapbuild.c:1622 replication/slot.c:1481 -#: storage/file/buffile.c:502 storage/file/copydir.c:207 -#: utils/init/miscinit.c:1391 utils/init/miscinit.c:1402 -#: utils/init/miscinit.c:1410 utils/misc/guc.c:7996 utils/misc/guc.c:8027 -#: utils/misc/guc.c:9947 utils/misc/guc.c:9961 utils/time/snapmgr.c:1334 -#: utils/time/snapmgr.c:1341 +#: access/transam/xlog.c:3398 access/transam/xlog.c:3570 +#: access/transam/xlog.c:4724 postmaster/postmaster.c:4609 +#: postmaster/postmaster.c:4619 replication/logical/origin.c:599 +#: replication/logical/origin.c:641 replication/logical/origin.c:660 +#: replication/logical/snapbuild.c:1611 replication/slot.c:1579 +#: storage/file/buffile.c:506 storage/file/copydir.c:207 +#: utils/init/miscinit.c:1421 utils/init/miscinit.c:1432 +#: utils/init/miscinit.c:1440 utils/misc/guc.c:8353 utils/misc/guc.c:8384 +#: utils/misc/guc.c:10293 utils/misc/guc.c:10307 utils/time/snapmgr.c:1249 +#: utils/time/snapmgr.c:1256 #, c-format msgid "could not write to file \"%s\": %m" msgstr "неможливо записати до файлу \"%s\": %m" -#: access/heap/rewriteheap.c:1252 access/transam/twophase.c:1609 -#: access/transam/xlogarchive.c:118 access/transam/xlogarchive.c:421 -#: postmaster/postmaster.c:1092 postmaster/syslogger.c:1465 -#: replication/logical/origin.c:563 replication/logical/reorderbuffer.c:3079 -#: replication/logical/snapbuild.c:1564 replication/logical/snapbuild.c:2006 -#: replication/slot.c:1578 storage/file/fd.c:754 storage/file/fd.c:3116 -#: storage/file/fd.c:3178 storage/file/reinit.c:255 storage/ipc/dsm.c:302 -#: storage/smgr/md.c:311 storage/smgr/md.c:367 storage/sync/sync.c:210 -#: utils/time/snapmgr.c:1674 +#: access/heap/rewriteheap.c:1256 access/transam/twophase.c:1613 +#: access/transam/xlogarchive.c:118 access/transam/xlogarchive.c:422 +#: postmaster/postmaster.c:1096 postmaster/syslogger.c:1465 +#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4389 +#: replication/logical/snapbuild.c:1556 replication/logical/snapbuild.c:1972 +#: replication/slot.c:1676 storage/file/fd.c:788 storage/file/fd.c:3169 +#: storage/file/fd.c:3231 storage/file/reinit.c:250 storage/ipc/dsm.c:315 +#: storage/smgr/md.c:344 storage/smgr/md.c:394 storage/sync/sync.c:231 +#: utils/time/snapmgr.c:1589 #, c-format msgid "could not remove file \"%s\": %m" msgstr "не можливо видалити файл \"%s\": %m" -#: access/heap/vacuumlazy.c:648 +#: access/heap/vacuumlazy.c:772 #, c-format msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "автоматичний агресивний вакуум для запобігання зацикленню таблиці \"%s.%s.%s\": сканування індексу: %d\n" -#: access/heap/vacuumlazy.c:650 +#: access/heap/vacuumlazy.c:774 #, c-format msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "автоматичне очищення для запобігання зацикленню таблиці \"%s.%s.%s\": сканування індексу: %d\n" -#: access/heap/vacuumlazy.c:655 +#: access/heap/vacuumlazy.c:779 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "автоматична агресивне очищення таблиці \"%s.%s.%s\": сканувань індексу: %d\n" -#: access/heap/vacuumlazy.c:657 +#: access/heap/vacuumlazy.c:781 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "автоматичне очищення таблиці \"%s.%s.%s\": сканувань індексу: %d\n" -#: access/heap/vacuumlazy.c:664 +#: access/heap/vacuumlazy.c:788 #, c-format msgid "pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n" msgstr "сторінок: %u видалено, %u залишилось, %u пропущено закріплених, %u пропущено заморожених\n" -#: access/heap/vacuumlazy.c:670 +#: access/heap/vacuumlazy.c:794 #, c-format -msgid "tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable, oldest xmin: %u\n" -msgstr "кортежів: %.0f видалено, %.0f залишилось, %.0fв мертвих, але все ще не підлягають видаленню, найстарший xmin: %u\n" +msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable, oldest xmin: %u\n" +msgstr "кортежів: %lld видалено, %lld залишилось, %lld \"мертвих\", але все ще не підлягають видаленню, найстарший xmin: %u\n" -#: access/heap/vacuumlazy.c:676 +#: access/heap/vacuumlazy.c:800 commands/analyze.c:780 #, c-format msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" msgstr "використання буферу: %lld збігів, %lld пропусків, %lld брудних записів\n" -#: access/heap/vacuumlazy.c:680 +#: access/heap/vacuumlazy.c:810 +#, c-format +msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" +msgstr "у %u сторінок з таблиці (%.2f%% від загальної кількості) було видалено %lld мертвих ідентифікаторів елементів\n" + +#: access/heap/vacuumlazy.c:813 +msgid "index scan not needed: " +msgstr "сканування індексу не потрібне: " + +#: access/heap/vacuumlazy.c:815 +msgid "index scan needed: " +msgstr "сканування індексу потрібне: " + +#: access/heap/vacuumlazy.c:819 +#, c-format +msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" +msgstr "%u сторінок з таблиці (%.2f%% від загальної кількості) мають %lld мертвих ідентифікаторів елементів\n" + +#: access/heap/vacuumlazy.c:822 +msgid "index scan bypassed: " +msgstr "сканування індексу пропущено: " + +#: access/heap/vacuumlazy.c:824 +msgid "index scan bypassed by failsafe: " +msgstr "сканування індексу безпечно пропущено: " + +#: access/heap/vacuumlazy.c:840 +#, c-format +msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" +msgstr "індекс \"%s\": сторінок: %u загалом, %u нещодавно видалено, %u наразі видалено, %u для повторного використання\n" + +#: access/heap/vacuumlazy.c:847 commands/analyze.c:784 #, c-format msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" msgstr "середня швидкість читання: %.3f МБ/с, середня швидкість запису: %.3f МБ/с\n" -#: access/heap/vacuumlazy.c:682 +#: access/heap/vacuumlazy.c:851 commands/analyze.c:788 +msgid "I/O timings:" +msgstr "Час вводу/виводу:" + +#: access/heap/vacuumlazy.c:853 commands/analyze.c:790 +#, c-format +msgid " read: %.3f ms" +msgstr " читання: %.3f мс" + +#: access/heap/vacuumlazy.c:856 commands/analyze.c:793 +msgid "," +msgstr "," + +#: access/heap/vacuumlazy.c:858 commands/analyze.c:795 +#, c-format +msgid " write: %.3f ms" +msgstr " запис: %.3f мс" + +#: access/heap/vacuumlazy.c:862 #, c-format msgid "system usage: %s\n" msgstr "використання системи: %s\n" -#: access/heap/vacuumlazy.c:684 +#: access/heap/vacuumlazy.c:864 #, c-format -msgid "WAL usage: %ld records, %ld full page images, %llu bytes" -msgstr "Використання WAL: %ld записів, %ld зображень на повну сторінку, %llu байтів" +msgid "WAL usage: %lld records, %lld full page images, %llu bytes" +msgstr "Використання WAL: %lld записів, %lld зображень на повну сторінку, %llu байтів" -#: access/heap/vacuumlazy.c:795 +#: access/heap/vacuumlazy.c:939 #, c-format msgid "aggressively vacuuming \"%s.%s\"" msgstr "агресивне очищення \"%s.%s\"" -#: access/heap/vacuumlazy.c:800 commands/cluster.c:874 +#: access/heap/vacuumlazy.c:944 commands/cluster.c:898 #, c-format msgid "vacuuming \"%s.%s\"" msgstr "очищення \"%s.%s\"" -#: access/heap/vacuumlazy.c:837 -#, c-format -msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" -msgstr "вимкнення паралельної опції очищення на \"%s\" --- не можна паралельно очистити тимчасові таблиці" - -#: access/heap/vacuumlazy.c:1725 +#: access/heap/vacuumlazy.c:1655 access/heap/vacuumlazy.c:2393 #, c-format -msgid "\"%s\": removed %.0f row versions in %u pages" -msgstr "\"%s\": видалено %.0f версій рядків, в %u сторінок" +msgid "table \"%s\": removed %lld dead item identifiers in %u pages" +msgstr "таблиця \"%s\": видалено %lld мертвих ідентифікаторів елементів в %u сторінках" -#: access/heap/vacuumlazy.c:1735 +#: access/heap/vacuumlazy.c:1661 #, c-format -msgid "%.0f dead row versions cannot be removed yet, oldest xmin: %u\n" -msgstr "Все ще не можна видалити мертві рядки %.0f, найстарший xmin: %u\n" +msgid "%lld dead row versions cannot be removed yet, oldest xmin: %u\n" +msgstr "%lld версій мертвих рядків поки не можна видалити, найстарший xmin: %u\n" -#: access/heap/vacuumlazy.c:1737 +#: access/heap/vacuumlazy.c:1663 #, c-format -msgid "There were %.0f unused item identifiers.\n" -msgstr "Знайдено %.0f невикористаних ідентифікаторів елементів.\n" +msgid "%u page removed.\n" +msgid_plural "%u pages removed.\n" +msgstr[0] "%u сторінка видалена.\n" +msgstr[1] "%u сторінки видалено.\n" +msgstr[2] "%u сторінок видалено.\n" +msgstr[3] "%u сторінок видалено.\n" -#: access/heap/vacuumlazy.c:1739 +#: access/heap/vacuumlazy.c:1667 #, c-format msgid "Skipped %u page due to buffer pins, " msgid_plural "Skipped %u pages due to buffer pins, " @@ -1159,7 +1281,7 @@ msgstr[1] "Пропущено %u сторінки, закріплені в бу msgstr[2] "Пропущено %u сторінок, закріплених в буфері " msgstr[3] "Пропущено %u сторінок, закріплених в буфері " -#: access/heap/vacuumlazy.c:1743 +#: access/heap/vacuumlazy.c:1671 #, c-format msgid "%u frozen page.\n" msgid_plural "%u frozen pages.\n" @@ -1168,32 +1290,40 @@ msgstr[1] "%u заморожені сторінки.\n" msgstr[2] "%u заморожених сторінок.\n" msgstr[3] "%u заморожених сторінок.\n" -#: access/heap/vacuumlazy.c:1747 -#, c-format -msgid "%u page is entirely empty.\n" -msgid_plural "%u pages are entirely empty.\n" -msgstr[0] "%u сторінка повністю порожня.\n" -msgstr[1] "%u сторінки повністю порожні.\n" -msgstr[2] "%u сторінок повністю порожні.\n" -msgstr[3] "%u сторінок повністю порожні.\n" - -#: access/heap/vacuumlazy.c:1751 commands/indexcmds.c:3450 -#: commands/indexcmds.c:3468 +#: access/heap/vacuumlazy.c:1675 commands/indexcmds.c:3986 +#: commands/indexcmds.c:4005 #, c-format msgid "%s." msgstr "%s." -#: access/heap/vacuumlazy.c:1754 +#: access/heap/vacuumlazy.c:1678 +#, c-format +msgid "table \"%s\": found %lld removable, %lld nonremovable row versions in %u out of %u pages" +msgstr "таблиця \"%s\": знайдено %lld знімних, %lld незнімних версій рядків у %u з %u сторінок" + +#: access/heap/vacuumlazy.c:2182 +#, c-format +msgid "table \"%s\": index scan bypassed: %u pages from table (%.2f%% of total) have %lld dead item identifiers" +msgstr "таблиця \"%s\": сканування індексу пропущено: %u сторінок з таблиці (%.2f%% від загальної кількості) мають %lld мертвих ідентифікаторів елементів" + +#: access/heap/vacuumlazy.c:2625 +#, c-format +msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" +msgstr "безпечне пропущення неістотного обслуговування таблиці \"%s.%s.%s\" після %d сканів індексу" + +#: access/heap/vacuumlazy.c:2630 #, c-format -msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u out of %u pages" -msgstr "\"%s\": знайдено %.0f видалених, %.0f невидалених версій рядків у %u з %u сторінок" +msgid "The table's relfrozenxid or relminmxid is too far in the past." +msgstr "relfrozenxid або relminmxid таблиці занадто далеко в минулому." -#: access/heap/vacuumlazy.c:1888 +#: access/heap/vacuumlazy.c:2631 #, c-format -msgid "\"%s\": removed %d row versions in %d pages" -msgstr "\"%s\": видалено %d версій рядків у %d сторінках" +msgid "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" +"You might also need to consider other ways for VACUUM to keep up with the allocation of transaction IDs." +msgstr "Можливо, слід збільшити параметр конфігурації \"maintenance_work_mem\" або \"autovacuum_work_mem\".\n" +"Можливо, вам також доведеться розглянути інші способи, щоб VACUUM не відставав від розподілу ідентифікаторів транзакцій." -#: access/heap/vacuumlazy.c:2143 +#: access/heap/vacuumlazy.c:2771 #, c-format msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" @@ -1202,7 +1332,7 @@ msgstr[1] "запущено %d паралельних виконавців оч msgstr[2] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" msgstr[3] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" -#: access/heap/vacuumlazy.c:2149 +#: access/heap/vacuumlazy.c:2777 #, c-format msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" @@ -1211,86 +1341,93 @@ msgstr[1] "запущено %d паралельних виконавців оч msgstr[2] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" msgstr[3] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" -#: access/heap/vacuumlazy.c:2441 -#, c-format -msgid "scanned index \"%s\" to remove %d row versions by parallel vacuum worker" -msgstr "відсканований індекс \"%s\" видалити %d версії рядків паралельним виконавцем очистки" - -#: access/heap/vacuumlazy.c:2443 +#: access/heap/vacuumlazy.c:3066 #, c-format msgid "scanned index \"%s\" to remove %d row versions" msgstr "просканований індекс \"%s\", видалено версій рядків %d" -#: access/heap/vacuumlazy.c:2501 -#, c-format -msgid "index \"%s\" now contains %.0f row versions in %u pages as reported by parallel vacuum worker" -msgstr "індекс \"%s\" тепер містить %.0f версій рядків у %u сторінках, як повідомлено паралельним виконавцем очистки" - -#: access/heap/vacuumlazy.c:2503 +#: access/heap/vacuumlazy.c:3123 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "індекс \"%s\" наразі містить %.0f версій рядків у %u сторінках" -#: access/heap/vacuumlazy.c:2510 +#: access/heap/vacuumlazy.c:3127 #, c-format msgid "%.0f index row versions were removed.\n" -"%u index pages have been deleted, %u are currently reusable.\n" +"%u index pages were newly deleted.\n" +"%u index pages are currently deleted, of which %u are currently reusable.\n" "%s." -msgstr "Видалено версій рядків індексу: %.0f.\n" -"Видалено індексних сторінок %u, придатні для повторного користування: %u.\n" +msgstr "%.0f версій індексних рядків було видалено.\n" +"%u індексних сторінок було нещодавно видалено.\n" +"%u індексних сторінок наразі видалено, з яких %u зараз можна повторно використати.\n" "%s." -#: access/heap/vacuumlazy.c:2613 +#: access/heap/vacuumlazy.c:3236 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\": зупинка скорочення через конфліктний запит блокування" -#: access/heap/vacuumlazy.c:2679 +#: access/heap/vacuumlazy.c:3302 #, c-format msgid "\"%s\": truncated %u to %u pages" msgstr "\"%s\": скорочено (було: %u, стало: %u сторінок)" -#: access/heap/vacuumlazy.c:2744 +#: access/heap/vacuumlazy.c:3366 #, c-format msgid "\"%s\": suspending truncate due to conflicting lock request" msgstr "\"%s\" припинення скорочення через конфліктний запит блокування" -#: access/heap/vacuumlazy.c:3583 +#: access/heap/vacuumlazy.c:3511 +#, c-format +msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" +msgstr "вимкнення паралельної опції очищення на \"%s\" --- не можна паралельно очистити тимчасові таблиці" + +#: access/heap/vacuumlazy.c:4266 +#, c-format +msgid "while scanning block %u offset %u of relation \"%s.%s\"" +msgstr "під час сканування блоку %u зсувом %u відношення \"%s.%s\"" + +#: access/heap/vacuumlazy.c:4269 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "під час сканування блоку %u відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:3586 +#: access/heap/vacuumlazy.c:4273 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "під час сканування відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:3592 +#: access/heap/vacuumlazy.c:4281 +#, c-format +msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" +msgstr "під час очищення блоку %u зсувом %u відношення \"%s.%s\"" + +#: access/heap/vacuumlazy.c:4284 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "під час очищення блоку %u відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:3595 +#: access/heap/vacuumlazy.c:4288 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "під час очищення відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:3600 +#: access/heap/vacuumlazy.c:4293 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "під час очищення індексу \"%s\" відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:3605 +#: access/heap/vacuumlazy.c:4298 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "під час очищення індексу \"%s\" відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:3611 +#: access/heap/vacuumlazy.c:4304 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "під час скорочення відношення \"%s.%s\" до %u блоків" -#: access/index/amapi.c:83 commands/amcmds.c:170 +#: access/index/amapi.c:83 commands/amcmds.c:143 #, c-format msgid "access method \"%s\" is not of type %s" msgstr "метод доступу \"%s\" не є типу %s" @@ -1300,104 +1437,115 @@ msgstr "метод доступу \"%s\" не є типу %s" msgid "index access method \"%s\" does not have a handler" msgstr "для методу доступу індекса \"%s\" не заданий обробник" -#: access/index/indexam.c:142 catalog/objectaddress.c:1260 -#: commands/indexcmds.c:2517 commands/tablecmds.c:254 commands/tablecmds.c:278 -#: commands/tablecmds.c:15733 commands/tablecmds.c:17188 +#: access/index/genam.c:486 +#, c-format +msgid "transaction aborted during system catalog scan" +msgstr "транзакцію перервано під час сканування системного каталогу" + +#: access/index/indexam.c:142 catalog/objectaddress.c:1355 +#: commands/indexcmds.c:2670 commands/tablecmds.c:267 commands/tablecmds.c:291 +#: commands/tablecmds.c:16456 commands/tablecmds.c:18158 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" не є індексом" -#: access/index/indexam.c:970 +#: access/index/indexam.c:973 #, c-format msgid "operator class %s has no options" msgstr "клас операторів %s не має параметрів" -#: access/nbtree/nbtinsert.c:651 +#: access/nbtree/nbtinsert.c:665 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "повторювані значення ключа порушують обмеження унікальності \"%s\"" -#: access/nbtree/nbtinsert.c:653 +#: access/nbtree/nbtinsert.c:667 #, c-format msgid "Key %s already exists." msgstr "Ключ %s вже існує." -#: access/nbtree/nbtinsert.c:747 +#: access/nbtree/nbtinsert.c:761 #, c-format msgid "This may be because of a non-immutable index expression." msgstr "Можливо, це викликано змінною природою індексного вираження." -#: access/nbtree/nbtpage.c:150 access/nbtree/nbtpage.c:538 -#: parser/parse_utilcmd.c:2244 +#: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 +#: parser/parse_utilcmd.c:2319 #, c-format msgid "index \"%s\" is not a btree" msgstr "індекс \"%s\" не є b-деревом" -#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:545 +#: access/nbtree/nbtpage.c:166 access/nbtree/nbtpage.c:615 #, c-format msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" msgstr "невідповідність версії в індексі \"%s\": версія файла %d, поточна версія %d, мінімальна підтримувана версія %d" -#: access/nbtree/nbtpage.c:1501 +#: access/nbtree/nbtpage.c:1875 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "індекс \"%s\" містить наполовину мертву внутрішню сторінку" -#: access/nbtree/nbtpage.c:1503 +#: access/nbtree/nbtpage.c:1877 #, c-format msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." msgstr "Це могло статися через переривання VACUUM у версії 9.3 або старше перед оновленням. Будь ласка, виконайте REINDEX." -#: access/nbtree/nbtutils.c:2664 +#: access/nbtree/nbtutils.c:2665 #, c-format msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" msgstr "розмір рядка індексу %zu перевищує максимальний розмір для версії %u btree %zu для індексу \"%s\"" -#: access/nbtree/nbtutils.c:2670 +#: access/nbtree/nbtutils.c:2671 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "Рядок індексу посилається на кортеж (%u,,%u) у відношенні \"%s\"." -#: access/nbtree/nbtutils.c:2674 +#: access/nbtree/nbtutils.c:2675 #, c-format msgid "Values larger than 1/3 of a buffer page cannot be indexed.\n" "Consider a function index of an MD5 hash of the value, or use full text indexing." msgstr "Значення, що займають більше, ніж 1/3 сторінки буферу, не можуть бути індексовані.\n" "Радимо застосувати індекс MD5-хеш значення або використати повнотекстове індексування." -#: access/nbtree/nbtvalidate.c:243 +#: access/nbtree/nbtvalidate.c:246 #, c-format msgid "operator family \"%s\" of access method %s is missing support function for types %s and %s" msgstr "сімейство операторів \"%s\" методу доступу %s не має опорної функції для типів %s та %s" -#: access/spgist/spgutils.c:147 +#: access/spgist/spgutils.c:232 #, c-format msgid "compress method must be defined when leaf type is different from input type" msgstr "метод стиснення повинен бути визначений, коли тип листів відрізняється від вхідного типу" -#: access/spgist/spgutils.c:761 +#: access/spgist/spgutils.c:1005 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "Внутрішній розмір кортежу SP-GiST %zu перевищує максимальний %zu" -#: access/spgist/spgvalidate.c:281 +#: access/spgist/spgvalidate.c:136 +#, c-format +msgid "SP-GiST leaf data type %s does not match declared type %s" +msgstr "тип даних кінцевого вузла SP-GiST %s не відповідає оголошеному типу %s" + +#: access/spgist/spgvalidate.c:302 #, c-format msgid "operator family \"%s\" of access method %s is missing support function %d for type %s" msgstr "сімейство операторів \"%s\" методу доступу %s не має опорної функції для типів %d для типу %s" -#: access/table/table.c:49 access/table/table.c:78 access/table/table.c:111 -#: catalog/aclchk.c:1806 +#: access/table/table.c:49 access/table/table.c:83 access/table/table.c:112 +#: access/table/table.c:145 catalog/aclchk.c:1792 #, c-format msgid "\"%s\" is an index" msgstr "\"%s\" є індексом" -#: access/table/table.c:54 access/table/table.c:83 access/table/table.c:116 -#: catalog/aclchk.c:1813 commands/tablecmds.c:12554 commands/tablecmds.c:15742 +#: access/table/table.c:54 access/table/table.c:88 access/table/table.c:117 +#: access/table/table.c:150 catalog/aclchk.c:1799 commands/tablecmds.c:13161 +#: commands/tablecmds.c:16465 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\" це складений тип" -#: access/table/tableam.c:244 +#: access/table/tableam.c:266 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "невірний tid (%u, %u) для відношення \"%s\"" @@ -1407,7 +1555,7 @@ msgstr "невірний tid (%u, %u) для відношення \"%s\"" msgid "%s cannot be empty." msgstr "%s не може бути пустим." -#: access/table/tableamapi.c:122 utils/misc/guc.c:11928 +#: access/table/tableamapi.c:122 utils/misc/guc.c:12439 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s занадто довгий (максимум %d символів)." @@ -1427,45 +1575,45 @@ msgstr "Табличного методу доступу \"%s\" не існує. msgid "sample percentage must be between 0 and 100" msgstr "відсоток вибірки повинен задаватися числом від 0 до 100" -#: access/transam/commit_ts.c:295 +#: access/transam/commit_ts.c:278 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "не вдалося отримати мітку позначки часу транзакції %u" -#: access/transam/commit_ts.c:393 +#: access/transam/commit_ts.c:376 #, c-format msgid "could not get commit timestamp data" msgstr "не вдалося отримати позначку часу фіксації" -#: access/transam/commit_ts.c:395 +#: access/transam/commit_ts.c:378 #, c-format -msgid "Make sure the configuration parameter \"%s\" is set on the master server." -msgstr "Переконайтесь, що в конфігурації головного серверу встановлений параметр \"%s\"." +msgid "Make sure the configuration parameter \"%s\" is set on the primary server." +msgstr "Переконайтесь, що в конфігурації основного серверу встановлений параметр \"%s\"." -#: access/transam/commit_ts.c:397 +#: access/transam/commit_ts.c:380 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Переконайтесь, що в конфігурації встановлений параметр \"%s\"." -#: access/transam/multixact.c:1002 +#: access/transam/multixact.c:1021 #, c-format msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"" msgstr "щоб уникнути втрат даних у базі даних \"%s\", база даних не приймає команди, що створюють нові MultiXactIds" -#: access/transam/multixact.c:1004 access/transam/multixact.c:1011 -#: access/transam/multixact.c:1035 access/transam/multixact.c:1044 +#: access/transam/multixact.c:1023 access/transam/multixact.c:1030 +#: access/transam/multixact.c:1054 access/transam/multixact.c:1063 #, c-format msgid "Execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots." msgstr "Виконати очистку (VACUUM) по всій базі даних.\n" "Можливо, вам доведеться зафіксувати, відкотити назад старі підготовані транзакції або видалити застарілі слоти реплікації." -#: access/transam/multixact.c:1009 +#: access/transam/multixact.c:1028 #, c-format msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u" msgstr "щоб уникнути втрат даних в базі даних з OID %u, база даних не приймає команди, що створюють нові MultiXactIds" -#: access/transam/multixact.c:1030 access/transam/multixact.c:2320 +#: access/transam/multixact.c:1049 access/transam/multixact.c:2333 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" @@ -1474,7 +1622,7 @@ msgstr[1] "бази даних \"%s\" повинні бути очищені (va msgstr[2] "баз даних \"%s\" повинні бути очищені (vacuumed) перед тим, як більшість MultiXactIds буде використано (%u)" msgstr[3] "баз даних \"%s\" повинні бути очищені (vacuumed) перед тим, як більшість MultiXactId буде використано (%u)" -#: access/transam/multixact.c:1039 access/transam/multixact.c:2329 +#: access/transam/multixact.c:1058 access/transam/multixact.c:2342 #, c-format msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" @@ -1483,12 +1631,12 @@ msgstr[1] "бази даних з OID %u повинні бути очищені msgstr[2] "баз даних з OID %u повинні бути очищені (vacuumed), перед тим як більшість MultiXactIds буде використано (%u)" msgstr[3] "баз даних з OID %u повинні бути очищені (vacuumed), перед тим як більшість MultiXactId буде використано (%u)" -#: access/transam/multixact.c:1100 +#: access/transam/multixact.c:1119 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "перевищено ліміт членів мультитранзакції" -#: access/transam/multixact.c:1101 +#: access/transam/multixact.c:1120 #, c-format msgid "This command would create a multixact with %u members, but the remaining space is only enough for %u member." msgid_plural "This command would create a multixact with %u members, but the remaining space is only enough for %u members." @@ -1497,12 +1645,12 @@ msgstr[1] "Мультитранзакція створена цією коман msgstr[2] "Мультитранзакція створена цією командою з %u членів, але місця вистачає лише для %u членів." msgstr[3] "Мультитранзакція створена цією командою з %u членів, але місця вистачає лише для %u членів." -#: access/transam/multixact.c:1106 +#: access/transam/multixact.c:1125 #, c-format msgid "Execute a database-wide VACUUM in database with OID %u with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." msgstr "Виконати очистку (VACUUM) по всій базі даних з OID %u зі зменшенням значення vacuum_multixact_freeze_min_age та vacuum_multixact_freeze_table_age settings." -#: access/transam/multixact.c:1137 +#: access/transam/multixact.c:1156 #, c-format msgid "database with OID %u must be vacuumed before %d more multixact member is used" msgid_plural "database with OID %u must be vacuumed before %d more multixact members are used" @@ -1511,167 +1659,147 @@ msgstr[1] "база даних з OID %u повинна бути очищена msgstr[2] "база даних з OID %u повинна бути очищена перед використанням додаткових членів мультитранзакції (%d)" msgstr[3] "база даних з OID %u повинна бути очищена перед використанням додаткових членів мультитранзакції (%d)" -#: access/transam/multixact.c:1142 +#: access/transam/multixact.c:1161 #, c-format msgid "Execute a database-wide VACUUM in that database with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." msgstr "Виконати очищення (VACUUM) по всій цій базі даних зі зменшенням значення vacuum_multixact_freeze_min_age та vacuum_multixact_freeze_table_age settings." -#: access/transam/multixact.c:1279 +#: access/transam/multixact.c:1300 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "MultiXactId %u припинив існування -- очевидно відбулося зациклення" -#: access/transam/multixact.c:1287 +#: access/transam/multixact.c:1306 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "MultiXactId %u ще не був створений -- очевидно відбулося зациклення" -#: access/transam/multixact.c:2270 -#, c-format -msgid "MultiXactId wrap limit is %u, limited by database with OID %u" -msgstr "Межа зациклення MultiXactId дорівнює %u. Обмежено базою даних з OID %u" - -#: access/transam/multixact.c:2325 access/transam/multixact.c:2334 -#: access/transam/varsup.c:149 access/transam/varsup.c:156 -#: access/transam/varsup.c:447 access/transam/varsup.c:454 +#: access/transam/multixact.c:2338 access/transam/multixact.c:2347 +#: access/transam/varsup.c:151 access/transam/varsup.c:158 +#: access/transam/varsup.c:466 access/transam/varsup.c:473 #, c-format msgid "To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots." msgstr "Щоб уникнути вимкнення бази даних, виконайте VACUUM для всієї бази даних.\n" "Можливо, вам доведеться зафіксувати або відкотити назад старі підготовленні транзакції або видалити застарілі слоти реплікації." -#: access/transam/multixact.c:2604 -#, c-format -msgid "oldest MultiXactId member is at offset %u" -msgstr "зсув члену найстарішої MultiXactId: %u" - -#: access/transam/multixact.c:2608 +#: access/transam/multixact.c:2621 #, c-format msgid "MultiXact member wraparound protections are disabled because oldest checkpointed MultiXact %u does not exist on disk" msgstr "Захист від зациклення члену MultiXact вимкнена, оскільки найстаріша контрольна точка MultiXact %u не існує на диску" -#: access/transam/multixact.c:2630 +#: access/transam/multixact.c:2643 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "Захист від зациклення члену MultiXact наразі ввімкнена" -#: access/transam/multixact.c:2633 -#, c-format -msgid "MultiXact member stop limit is now %u based on MultiXact %u" -msgstr "Межа зупинки члену MultiXact %u заснована на MultiXact %u" - -#: access/transam/multixact.c:3013 +#: access/transam/multixact.c:3030 #, c-format msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" msgstr "найстарішу MultiXact %u не знайдено, найновіша MultiXact %u, скорочення пропускається" -#: access/transam/multixact.c:3031 +#: access/transam/multixact.c:3048 #, c-format msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" msgstr "неможливо виконати скорочення до MultiXact %u, оскільки її не існує на диску, скорочення пропускається" -#: access/transam/multixact.c:3345 +#: access/transam/multixact.c:3362 #, c-format msgid "invalid MultiXactId: %u" msgstr "неприпустимий MultiXactId: %u" -#: access/transam/parallel.c:706 access/transam/parallel.c:825 +#: access/transam/parallel.c:707 access/transam/parallel.c:826 #, c-format msgid "parallel worker failed to initialize" msgstr "не вдалося виконати ініціалізацію паралельного виконавця" -#: access/transam/parallel.c:707 access/transam/parallel.c:826 +#: access/transam/parallel.c:708 access/transam/parallel.c:827 #, c-format msgid "More details may be available in the server log." msgstr "Більше деталей можуть бути доступні в журналі серверу." -#: access/transam/parallel.c:887 +#: access/transam/parallel.c:888 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "postmaster завершився під час паралельної транзакції" -#: access/transam/parallel.c:1074 +#: access/transam/parallel.c:1075 #, c-format msgid "lost connection to parallel worker" msgstr "втрачено зв'язок з паралельним виконавцем" -#: access/transam/parallel.c:1140 access/transam/parallel.c:1142 +#: access/transam/parallel.c:1141 access/transam/parallel.c:1143 msgid "parallel worker" msgstr "паралельний виконавець" -#: access/transam/parallel.c:1293 +#: access/transam/parallel.c:1294 #, c-format msgid "could not map dynamic shared memory segment" msgstr "не вдалося відобразити динамічний сегмент спільної пам'яті" -#: access/transam/parallel.c:1298 +#: access/transam/parallel.c:1299 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "неприпустиме магічне число в динамічному сегменті спільної пам'яті" -#: access/transam/slru.c:696 +#: access/transam/slru.c:712 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "файл \"%s\" не існує, вважається нульовим" -#: access/transam/slru.c:937 access/transam/slru.c:943 -#: access/transam/slru.c:951 access/transam/slru.c:956 -#: access/transam/slru.c:963 access/transam/slru.c:968 -#: access/transam/slru.c:975 access/transam/slru.c:982 +#: access/transam/slru.c:944 access/transam/slru.c:950 +#: access/transam/slru.c:958 access/transam/slru.c:963 +#: access/transam/slru.c:970 access/transam/slru.c:975 +#: access/transam/slru.c:982 access/transam/slru.c:989 #, c-format msgid "could not access status of transaction %u" msgstr "не можливо отримати статус транзакції %u" -#: access/transam/slru.c:938 +#: access/transam/slru.c:945 #, c-format msgid "Could not open file \"%s\": %m." msgstr "Не можливо відкрити файл \"%s\": %m." -#: access/transam/slru.c:944 +#: access/transam/slru.c:951 #, c-format msgid "Could not seek in file \"%s\" to offset %u: %m." msgstr "Не вдалося переміститися у файлі \"%s\" до зсуву %u: %m." -#: access/transam/slru.c:952 +#: access/transam/slru.c:959 #, c-format msgid "Could not read from file \"%s\" at offset %u: %m." msgstr "Не вдалося прочитати файл \"%s\" по зсуву %u: %m." -#: access/transam/slru.c:957 +#: access/transam/slru.c:964 #, c-format msgid "Could not read from file \"%s\" at offset %u: read too few bytes." msgstr "Не вдалося прочитати з файлу \"%s\" із зсувом %u: прочитано занадто мало байтів." -#: access/transam/slru.c:964 +#: access/transam/slru.c:971 #, c-format msgid "Could not write to file \"%s\" at offset %u: %m." msgstr "Не вдалося записати файл \"%s\" по зсуву %u: %m." -#: access/transam/slru.c:969 +#: access/transam/slru.c:976 #, c-format msgid "Could not write to file \"%s\" at offset %u: wrote too few bytes." msgstr "Не вдалося записати файл \"%s\" із зсувом %u: записано занадто мало байтів." -#: access/transam/slru.c:976 +#: access/transam/slru.c:983 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "Не вдалося синхронізувати файл \"%s\": %m." -#: access/transam/slru.c:983 +#: access/transam/slru.c:990 #, c-format msgid "Could not close file \"%s\": %m." msgstr "Не можливо закрити файл \"%s\": %m." -#: access/transam/slru.c:1254 +#: access/transam/slru.c:1251 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "не вдалося спустошити каталог \"%s\": очевидно сталося зациклення" -#: access/transam/slru.c:1309 access/transam/slru.c:1365 -#, c-format -msgid "removing file \"%s\"" -msgstr "видалення файлу \"%s\"" - #: access/transam/timeline.c:163 access/transam/timeline.c:168 #, c-format msgid "syntax error in history file: %s" @@ -1732,101 +1860,106 @@ msgstr "Встановіть ненульове значення парамет msgid "transaction identifier \"%s\" is already in use" msgstr "ідентифікатор транзакції \"%s\" вже використовується" -#: access/transam/twophase.c:417 access/transam/twophase.c:2368 +#: access/transam/twophase.c:417 access/transam/twophase.c:2385 #, c-format msgid "maximum number of prepared transactions reached" msgstr "досягнуто максимального числа підготованих транзакцій" -#: access/transam/twophase.c:418 access/transam/twophase.c:2369 +#: access/transam/twophase.c:418 access/transam/twophase.c:2386 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "Збільшіть max_prepared_transactions (наразі %d)." -#: access/transam/twophase.c:586 +#: access/transam/twophase.c:584 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "підготовлена транзакція з ідентифікатором \"%s\" зайнята" -#: access/transam/twophase.c:592 +#: access/transam/twophase.c:590 #, c-format msgid "permission denied to finish prepared transaction" msgstr "немає дозволу для завершення підготовлених транзакцій" -#: access/transam/twophase.c:593 +#: access/transam/twophase.c:591 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "Треба пути суперкористувачем або користувачем, який підготував транзакцію." -#: access/transam/twophase.c:604 +#: access/transam/twophase.c:602 #, c-format msgid "prepared transaction belongs to another database" msgstr "підготовлена транзакція належить до іншої бази даних" -#: access/transam/twophase.c:605 +#: access/transam/twophase.c:603 #, c-format msgid "Connect to the database where the transaction was prepared to finish it." msgstr "З'єднайтесь з базою даних, де була підготовлена транзакція, щоб завершити її." -#: access/transam/twophase.c:620 +#: access/transam/twophase.c:618 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "підготовленої транзакції з ідентифікатором \"%s\" не існує" -#: access/transam/twophase.c:1098 +#: access/transam/twophase.c:1093 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "перевищено граничний розмір файла у 2-фазовому стані" -#: access/transam/twophase.c:1252 +#: access/transam/twophase.c:1247 #, c-format -msgid "incorrect size of file \"%s\": %zu byte" -msgid_plural "incorrect size of file \"%s\": %zu bytes" -msgstr[0] "неправильний розмір файлу \"%s\": %zu байт" -msgstr[1] "неправильний розмір файлу \"%s\": %zu байти" -msgstr[2] "неправильний розмір файлу \"%s\": %zu байтів" -msgstr[3] "неправильний розмір файлу \"%s\": %zu байтів" +msgid "incorrect size of file \"%s\": %lld byte" +msgid_plural "incorrect size of file \"%s\": %lld bytes" +msgstr[0] "неправильний розмір файлу \"%s\": %lld байт" +msgstr[1] "неправильний розмір файлу \"%s\": %lld байти" +msgstr[2] "неправильний розмір файлу \"%s\": %lld байтів" +msgstr[3] "неправильний розмір файлу \"%s\": %lld байтів" -#: access/transam/twophase.c:1261 +#: access/transam/twophase.c:1256 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "неправильне вирівнювання зсуву CRC для файлу \"%s\"" -#: access/transam/twophase.c:1294 +#: access/transam/twophase.c:1274 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "не вдалося прочитати файл \"%s\": прочитано %d з %lld" + +#: access/transam/twophase.c:1289 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "неприпустиме магічне число, збережене у файлі\"%s\"" -#: access/transam/twophase.c:1300 +#: access/transam/twophase.c:1295 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "неприпустимий розмір, збережений у файлі \"%s\"" -#: access/transam/twophase.c:1312 +#: access/transam/twophase.c:1307 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "обчислена контрольна сума CRC не відповідає значенню, збереженому у файлі \"%s\"" -#: access/transam/twophase.c:1342 access/transam/xlog.c:6494 +#: access/transam/twophase.c:1342 access/transam/xlog.c:6641 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Не вдалося розмістити обробник журналу транзакцій." -#: access/transam/twophase.c:1349 +#: access/transam/twophase.c:1357 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "не вдалося прочитати 2-фазовий стан з WAL при %X/%X" -#: access/transam/twophase.c:1357 +#: access/transam/twophase.c:1364 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "очікувані дані 2-фазного стану відсутні в WAL при %X/%X" -#: access/transam/twophase.c:1637 +#: access/transam/twophase.c:1641 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "не вдалося відтворити файл \"%s\": %m" -#: access/transam/twophase.c:1764 +#: access/transam/twophase.c:1768 #, c-format msgid "%u two-phase state file was written for a long-running prepared transaction" msgid_plural "%u two-phase state files were written for long-running prepared transactions" @@ -1835,366 +1968,346 @@ msgstr[1] "%u 2-фазовий стан файлів був записаний msgstr[2] "%u 2-фазовий стан файлів був записаний завдяки довготривалим підготовленим транзакціям" msgstr[3] "%u 2-фазовий стан файлів був записаний завдяки довготривалим підготовленим транзакціям" -#: access/transam/twophase.c:1998 +#: access/transam/twophase.c:2002 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "відновлення підготовленої транзакції %u із спільної пам'яті" -#: access/transam/twophase.c:2089 +#: access/transam/twophase.c:2093 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "видалення застарілого файла 2-фазового стану для транзакції %u" -#: access/transam/twophase.c:2096 +#: access/transam/twophase.c:2100 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "видалення з пам'яті застарілого 2-фазового стану для транзакції %u" -#: access/transam/twophase.c:2109 +#: access/transam/twophase.c:2113 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "видалення файлу майбутнього 2-фазового стану для транзакції %u" -#: access/transam/twophase.c:2116 +#: access/transam/twophase.c:2120 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "видалення з пам'яті майбутнього 2-фазового стану для транзакції %u" -#: access/transam/twophase.c:2141 +#: access/transam/twophase.c:2145 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "пошкоджений файл двофазного стану для транзакції %u" -#: access/transam/twophase.c:2146 +#: access/transam/twophase.c:2150 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "пошкоджена пам'ять двофазного стану для транзакції %u" -#: access/transam/varsup.c:127 +#: access/transam/varsup.c:129 #, c-format msgid "database is not accepting commands to avoid wraparound data loss in database \"%s\"" msgstr "база даних не приймає команди, щоб уникнути втрати даних через зациклення транзакцій в БД \"%s\"" -#: access/transam/varsup.c:129 access/transam/varsup.c:136 +#: access/transam/varsup.c:131 access/transam/varsup.c:138 #, c-format msgid "Stop the postmaster and vacuum that database in single-user mode.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots." msgstr "Зупиніть postmaster і виконайте очищення (vacuum) бази даних в однокористувацькому режимі.\n" "Можливо, також доведеться зафіксувати або відкотити назад старі підготовлені транзакції, або розірвати застарілі реплікаційні слоти." -#: access/transam/varsup.c:134 +#: access/transam/varsup.c:136 #, c-format msgid "database is not accepting commands to avoid wraparound data loss in database with OID %u" msgstr "база даних не приймає команди задля уникнення втрати даних через зациклення транзакцій в базі даних з OID %u" -#: access/transam/varsup.c:146 access/transam/varsup.c:444 +#: access/transam/varsup.c:148 access/transam/varsup.c:463 #, c-format msgid "database \"%s\" must be vacuumed within %u transactions" msgstr "база даних \"%s\" повинна бути очищена (граничне число транзакцій: %u)" -#: access/transam/varsup.c:153 access/transam/varsup.c:451 +#: access/transam/varsup.c:155 access/transam/varsup.c:470 #, c-format msgid "database with OID %u must be vacuumed within %u transactions" msgstr "база даних з OID %u повинна бути очищена (граничне число транзакцій: %u)" -#: access/transam/varsup.c:409 -#, c-format -msgid "transaction ID wrap limit is %u, limited by database with OID %u" -msgstr "обмеження зациклення транзакції ID %u, обмежена за допомогою бази даних з OID %u" - -#: access/transam/xact.c:1030 +#: access/transam/xact.c:1045 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "в одній транзакції не може бути більше 2^32-2 команд" -#: access/transam/xact.c:1555 +#: access/transam/xact.c:1582 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "перевищено межу числа зафіксованих підтранзакцій (%d)" -#: access/transam/xact.c:2395 +#: access/transam/xact.c:2423 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "неможливо виконати PREPARE для транзакції, що здійснювалася на тимчасових об'єктах" -#: access/transam/xact.c:2405 +#: access/transam/xact.c:2433 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "не можна виконати PREPARE для транзакції, яка має експортовані знімки" -#: access/transam/xact.c:2414 -#, c-format -msgid "cannot PREPARE a transaction that has manipulated logical replication workers" -msgstr "не можна виконати PREPARE для транзакції, яка маніпулює процесами логічної реплікації" - #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3359 +#: access/transam/xact.c:3388 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s неможливо запустити всередині блоку транзакції" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3369 +#: access/transam/xact.c:3398 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%s неможливо запустити всередині підтранзакції" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3379 +#: access/transam/xact.c:3408 #, c-format msgid "%s cannot be executed from a function" msgstr "%s неможливо виконати з функції" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3448 access/transam/xact.c:3754 -#: access/transam/xact.c:3833 access/transam/xact.c:3956 -#: access/transam/xact.c:4107 access/transam/xact.c:4176 -#: access/transam/xact.c:4287 +#: access/transam/xact.c:3477 access/transam/xact.c:3783 +#: access/transam/xact.c:3862 access/transam/xact.c:3985 +#: access/transam/xact.c:4136 access/transam/xact.c:4205 +#: access/transam/xact.c:4316 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s може використовуватися тільки в блоках транзакції" -#: access/transam/xact.c:3640 +#: access/transam/xact.c:3669 #, c-format msgid "there is already a transaction in progress" msgstr "транзакція вже виконується" -#: access/transam/xact.c:3759 access/transam/xact.c:3838 -#: access/transam/xact.c:3961 +#: access/transam/xact.c:3788 access/transam/xact.c:3867 +#: access/transam/xact.c:3990 #, c-format msgid "there is no transaction in progress" msgstr "немає незавершеної транзакції" -#: access/transam/xact.c:3849 +#: access/transam/xact.c:3878 #, c-format msgid "cannot commit during a parallel operation" msgstr "не можна фіксувати транзакції під час паралельних операцій" -#: access/transam/xact.c:3972 +#: access/transam/xact.c:4001 #, c-format msgid "cannot abort during a parallel operation" msgstr "не можна перервати під час паралельних операцій" -#: access/transam/xact.c:4071 +#: access/transam/xact.c:4100 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "не можна визначати точки збереження під час паралельних операцій" -#: access/transam/xact.c:4158 +#: access/transam/xact.c:4187 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "не можна вивільняти точки збереження під час паралельних транзакцій" -#: access/transam/xact.c:4168 access/transam/xact.c:4219 -#: access/transam/xact.c:4279 access/transam/xact.c:4328 +#: access/transam/xact.c:4197 access/transam/xact.c:4248 +#: access/transam/xact.c:4308 access/transam/xact.c:4357 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "точка збереження \"%s\" не існує" -#: access/transam/xact.c:4225 access/transam/xact.c:4334 +#: access/transam/xact.c:4254 access/transam/xact.c:4363 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "точка збереження \"%s\" не існує на поточному рівні збереження точок" -#: access/transam/xact.c:4267 +#: access/transam/xact.c:4296 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "не можна відкотити назад до точки збереження під час паралельних операцій" -#: access/transam/xact.c:4395 +#: access/transam/xact.c:4424 #, c-format msgid "cannot start subtransactions during a parallel operation" msgstr "не можна запустити підтранзакцію під час паралельних операцій" -#: access/transam/xact.c:4463 +#: access/transam/xact.c:4492 #, c-format msgid "cannot commit subtransactions during a parallel operation" msgstr "не можна визначити підтранзакцію під час паралельних операцій" -#: access/transam/xact.c:5103 +#: access/transam/xact.c:5133 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "в одній транзакції не може бути більше 2^32-1 підтранзакцій" -#: access/transam/xlog.c:2554 +#: access/transam/xlog.c:1823 #, c-format -msgid "could not write to log file %s at offset %u, length %zu: %m" -msgstr "не вдалося записати у файл журналу %s (зсув: %u, довжина: %zu): %m" +msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" +msgstr "запит на очищення минулого кінця згенерованого WAL; запит %X/%X, поточна позиція %X/%X" -#: access/transam/xlog.c:2830 +#: access/transam/xlog.c:2584 #, c-format -msgid "updated min recovery point to %X/%X on timeline %u" -msgstr "мінімальна точка відновлення змінена на %X/%X на лінії часу %u" +msgid "could not write to log file %s at offset %u, length %zu: %m" +msgstr "не вдалося записати у файл журналу %s (зсув: %u, довжина: %zu): %m" -#: access/transam/xlog.c:3944 access/transam/xlogutils.c:802 -#: replication/walsender.c:2510 +#: access/transam/xlog.c:3986 access/transam/xlogutils.c:798 +#: replication/walsender.c:2520 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "запитуваний сегмент WAL %s вже видалений" -#: access/transam/xlog.c:4187 -#, c-format -msgid "recycled write-ahead log file \"%s\"" -msgstr "файл випереджувального журналювання \"%s\" використовується повторно" - -#: access/transam/xlog.c:4199 -#, c-format -msgid "removing write-ahead log file \"%s\"" -msgstr "файл випереджувального журналювання \"%s\" видаляється" - -#: access/transam/xlog.c:4219 +#: access/transam/xlog.c:4261 #, c-format msgid "could not rename file \"%s\": %m" msgstr "не вдалося перейменувати файл \"%s\": %m" -#: access/transam/xlog.c:4261 access/transam/xlog.c:4271 +#: access/transam/xlog.c:4303 access/transam/xlog.c:4313 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "необхідний каталог WAL \"%s\" не існує" -#: access/transam/xlog.c:4277 +#: access/transam/xlog.c:4319 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "створюється відсутній каталог WAL \"%s\"" -#: access/transam/xlog.c:4280 +#: access/transam/xlog.c:4322 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "не вдалося створити відстуній каталог \"%s\": %m" -#: access/transam/xlog.c:4383 +#: access/transam/xlog.c:4425 #, c-format msgid "unexpected timeline ID %u in log segment %s, offset %u" msgstr "неочіукваний ID лінії часу %u в сегменті журналу %s, зсув %u" -#: access/transam/xlog.c:4521 +#: access/transam/xlog.c:4563 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "нова лінія часу %u не є дочірньою для лінії часу системи бази даних %u" -#: access/transam/xlog.c:4535 +#: access/transam/xlog.c:4577 #, c-format msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" msgstr "нова лінія часу %u відгалузилась від поточної лінії часу бази даних %u до поточної точки відновлення %X/%X" -#: access/transam/xlog.c:4554 +#: access/transam/xlog.c:4596 #, c-format msgid "new target timeline is %u" msgstr "нова цільова лінія часу %u" -#: access/transam/xlog.c:4590 +#: access/transam/xlog.c:4632 #, c-format msgid "could not generate secret authorization token" msgstr "не вдалося згенерувати секретний токен для авторизації" -#: access/transam/xlog.c:4749 access/transam/xlog.c:4758 -#: access/transam/xlog.c:4782 access/transam/xlog.c:4789 -#: access/transam/xlog.c:4796 access/transam/xlog.c:4801 -#: access/transam/xlog.c:4808 access/transam/xlog.c:4815 -#: access/transam/xlog.c:4822 access/transam/xlog.c:4829 -#: access/transam/xlog.c:4836 access/transam/xlog.c:4843 -#: access/transam/xlog.c:4852 access/transam/xlog.c:4859 -#: utils/init/miscinit.c:1548 +#: access/transam/xlog.c:4791 access/transam/xlog.c:4800 +#: access/transam/xlog.c:4824 access/transam/xlog.c:4831 +#: access/transam/xlog.c:4838 access/transam/xlog.c:4843 +#: access/transam/xlog.c:4850 access/transam/xlog.c:4857 +#: access/transam/xlog.c:4864 access/transam/xlog.c:4871 +#: access/transam/xlog.c:4878 access/transam/xlog.c:4885 +#: access/transam/xlog.c:4894 access/transam/xlog.c:4901 +#: utils/init/miscinit.c:1578 #, c-format msgid "database files are incompatible with server" msgstr "файли бази даних є несумісними з даним сервером" -#: access/transam/xlog.c:4750 +#: access/transam/xlog.c:4792 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." msgstr "Кластер бази даних було ініціалізовано з PG_CONTROL_VERSION %d (0x%08x), але сервер було скомпільовано з PG_CONTROL_VERSION %d (0x%08x)." -#: access/transam/xlog.c:4754 +#: access/transam/xlog.c:4796 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." msgstr "Можливо, проблема викликана різним порядком байту. Здається, вам потрібно виконати команду \"initdb\"." -#: access/transam/xlog.c:4759 +#: access/transam/xlog.c:4801 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." msgstr "Кластер баз даних був ініціалізований з PG_CONTROL_VERSION %d, але сервер скомпільований з PG_CONTROL_VERSION %d." -#: access/transam/xlog.c:4762 access/transam/xlog.c:4786 -#: access/transam/xlog.c:4793 access/transam/xlog.c:4798 +#: access/transam/xlog.c:4804 access/transam/xlog.c:4828 +#: access/transam/xlog.c:4835 access/transam/xlog.c:4840 #, c-format msgid "It looks like you need to initdb." msgstr "Здається, Вам треба виконати initdb." -#: access/transam/xlog.c:4773 +#: access/transam/xlog.c:4815 #, c-format msgid "incorrect checksum in control file" msgstr "помилка контрольної суми у файлі pg_control" -#: access/transam/xlog.c:4783 +#: access/transam/xlog.c:4825 #, c-format msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." msgstr "Кластер бази даних було ініціалізовано з CATALOG_VERSION_NO %d, але сервер було скомпільовано з CATALOG_VERSION_NO %d." -#: access/transam/xlog.c:4790 +#: access/transam/xlog.c:4832 #, c-format msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." msgstr "Кластер бази даних було ініціалізовано з MAXALIGN %d, але сервер було скомпільовано з MAXALIGN %d." -#: access/transam/xlog.c:4797 +#: access/transam/xlog.c:4839 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "Здається, в кластері баз даних і в програмі сервера використовуються різні формати чисел з плаваючою точкою." -#: access/transam/xlog.c:4802 +#: access/transam/xlog.c:4844 #, c-format msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." msgstr "Кластер бази даних було ініціалізовано з BLCKSZ %d, але сервер було скомпільовано з BLCKSZ %d." -#: access/transam/xlog.c:4805 access/transam/xlog.c:4812 -#: access/transam/xlog.c:4819 access/transam/xlog.c:4826 -#: access/transam/xlog.c:4833 access/transam/xlog.c:4840 -#: access/transam/xlog.c:4847 access/transam/xlog.c:4855 -#: access/transam/xlog.c:4862 +#: access/transam/xlog.c:4847 access/transam/xlog.c:4854 +#: access/transam/xlog.c:4861 access/transam/xlog.c:4868 +#: access/transam/xlog.c:4875 access/transam/xlog.c:4882 +#: access/transam/xlog.c:4889 access/transam/xlog.c:4897 +#: access/transam/xlog.c:4904 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Здається, вам потрібно перекомпілювати сервер або виконати initdb." -#: access/transam/xlog.c:4809 +#: access/transam/xlog.c:4851 #, c-format msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." msgstr "Кластер бази даних було ініціалізовано з ELSEG_SIZE %d, але сервер було скомпільовано з ELSEG_SIZE %d." -#: access/transam/xlog.c:4816 +#: access/transam/xlog.c:4858 #, c-format msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." msgstr "Кластер бази даних було ініціалізовано з XLOG_BLCKSZ %d, але сервер було скомпільовано з XLOG_BLCKSZ %d." -#: access/transam/xlog.c:4823 +#: access/transam/xlog.c:4865 #, c-format msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." msgstr "Кластер бази даних було ініціалізовано з NAMEDATALEN %d, але сервер було скомпільовано з NAMEDATALEN %d." -#: access/transam/xlog.c:4830 +#: access/transam/xlog.c:4872 #, c-format msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." msgstr "Кластер бази даних було ініціалізовано з INDEX_MAX_KEYS %d, але сервер було скомпільовано з INDEX_MAX_KEYS %d." -#: access/transam/xlog.c:4837 +#: access/transam/xlog.c:4879 #, c-format msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." msgstr "Кластер бази даних було ініціалізовано з TOAST_MAX_CHUNK_SIZE %d, але сервер було скомпільовано з TOAST_MAX_CHUNK_SIZE %d." -#: access/transam/xlog.c:4844 +#: access/transam/xlog.c:4886 #, c-format msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." msgstr "Кластер бази даних було ініціалізовано з LOBLKSIZE %d, але сервер було скомпільовано з LOBLKSIZE %d." -#: access/transam/xlog.c:4853 +#: access/transam/xlog.c:4895 #, c-format msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." msgstr "Кластер бази даних було ініціалізовано без USE_FLOAT8_BYVAL, але сервер було скомпільовано з USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4860 +#: access/transam/xlog.c:4902 #, c-format msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." msgstr "Кластер бази даних було ініціалізовано з USE_FLOAT8_BYVAL, але сервер було скомпільовано без USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4869 +#: access/transam/xlog.c:4911 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" @@ -2203,247 +2316,273 @@ msgstr[1] "Розмір сегменту WAL повинен задаватись msgstr[2] "Розмір сегменту WAL повинен задаватись ступенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано значення %d" msgstr[3] "Розмір сегменту WAL повинен задаватись ступенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано значення %d" -#: access/transam/xlog.c:4881 +#: access/transam/xlog.c:4923 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"min_wal_size\" має бути мінімум у 2 рази більше, ніж \"wal_segment_size\"" -#: access/transam/xlog.c:4885 +#: access/transam/xlog.c:4927 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"max_wal_size\" має бути мінімум у 2 рази більше, ніж \"wal_segment_size\"" -#: access/transam/xlog.c:5318 +#: access/transam/xlog.c:5361 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "не вдалося записати початкове завантаження випереджувального журналювання: %m" -#: access/transam/xlog.c:5326 +#: access/transam/xlog.c:5369 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "не вдалося скинути на диск початкове завантаження випереджувального журналювання: %m" -#: access/transam/xlog.c:5332 +#: access/transam/xlog.c:5375 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "не вдалося закрити початкове завантаження випереджувального журналювання: %m" -#: access/transam/xlog.c:5393 +#: access/transam/xlog.c:5436 #, c-format msgid "using recovery command file \"%s\" is not supported" msgstr "використання файлу команд відновлення \"%s\" не підтримується" -#: access/transam/xlog.c:5458 +#: access/transam/xlog.c:5501 #, c-format msgid "standby mode is not supported by single-user servers" msgstr "режим очікування не підтримується однокористувацьким сервером" -#: access/transam/xlog.c:5475 +#: access/transam/xlog.c:5518 #, c-format msgid "specified neither primary_conninfo nor restore_command" msgstr "не заззначено ані параметр primary_conninfo, ані параметр restore_command" -#: access/transam/xlog.c:5476 +#: access/transam/xlog.c:5519 #, c-format msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." msgstr "Сервер бази даних буде регулярно опитувати підкатолог pg_wal і перевіряти файли, що містяться у ньому." -#: access/transam/xlog.c:5484 +#: access/transam/xlog.c:5527 #, c-format msgid "must specify restore_command when standby mode is not enabled" msgstr "необхідно вказати restore_command, якщо не ввімкнено режиму очікування" -#: access/transam/xlog.c:5522 +#: access/transam/xlog.c:5565 #, c-format msgid "recovery target timeline %u does not exist" msgstr "цільова лінія часу відновлення %u не існує" -#: access/transam/xlog.c:5644 +#: access/transam/xlog.c:5687 #, c-format msgid "archive recovery complete" msgstr "відновлення архіву завершено" -#: access/transam/xlog.c:5710 access/transam/xlog.c:5983 +#: access/transam/xlog.c:5753 access/transam/xlog.c:6024 #, c-format msgid "recovery stopping after reaching consistency" msgstr "відновлення зупиняється після досягнення узгодженості" -#: access/transam/xlog.c:5731 +#: access/transam/xlog.c:5774 #, c-format msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" msgstr "відновлення зупиняється перед позицією WAL (LSN) \"%X/%X\"" -#: access/transam/xlog.c:5817 +#: access/transam/xlog.c:5859 #, c-format msgid "recovery stopping before commit of transaction %u, time %s" msgstr "відновлення припиняється до підтвердження транзакції %u, час %s" -#: access/transam/xlog.c:5824 +#: access/transam/xlog.c:5866 #, c-format msgid "recovery stopping before abort of transaction %u, time %s" msgstr "відновлення припиняється до скасування транзакції %u, час %s" -#: access/transam/xlog.c:5877 +#: access/transam/xlog.c:5919 #, c-format msgid "recovery stopping at restore point \"%s\", time %s" msgstr "відновлення припиняється в точці відновлення\"%s\", час %s" -#: access/transam/xlog.c:5895 +#: access/transam/xlog.c:5937 #, c-format msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" msgstr "відновлення припиняється пісня локації WAL (LSN) \"%X/%X\"" -#: access/transam/xlog.c:5963 +#: access/transam/xlog.c:6004 #, c-format msgid "recovery stopping after commit of transaction %u, time %s" msgstr "відновлення припиняється після підтвердження транзакції %u, час %s" -#: access/transam/xlog.c:5971 +#: access/transam/xlog.c:6012 #, c-format msgid "recovery stopping after abort of transaction %u, time %s" msgstr "відновлення припиняється після скасування транзакції %u, час %s" -#: access/transam/xlog.c:6020 +#: access/transam/xlog.c:6057 #, c-format msgid "pausing at the end of recovery" msgstr "призупинення в кінці відновлення" -#: access/transam/xlog.c:6021 +#: access/transam/xlog.c:6058 #, c-format msgid "Execute pg_wal_replay_resume() to promote." msgstr "Виконайте pg_wal_replay_resume() для просування." -#: access/transam/xlog.c:6024 +#: access/transam/xlog.c:6061 access/transam/xlog.c:6343 #, c-format msgid "recovery has paused" msgstr "відновлення зупинено" -#: access/transam/xlog.c:6025 +#: access/transam/xlog.c:6062 #, c-format msgid "Execute pg_wal_replay_resume() to continue." msgstr "Виконайте pg_wal_replay_resume(), щоб продовжити." -#: access/transam/xlog.c:6242 +#: access/transam/xlog.c:6334 +#, c-format +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "hot standby неможливий через недостатнє налаштування параметрів" + +#: access/transam/xlog.c:6335 access/transam/xlog.c:6362 +#: access/transam/xlog.c:6392 +#, c-format +msgid "%s = %d is a lower setting than on the primary server, where its value was %d." +msgstr "%s = %d є нижчим параметром, ніж на основному сервері, де його значення було %d." + +#: access/transam/xlog.c:6344 +#, c-format +msgid "If recovery is unpaused, the server will shut down." +msgstr "Якщо відновлення не буде зупинено, сервер завершить роботу." + +#: access/transam/xlog.c:6345 +#, c-format +msgid "You can then restart the server after making the necessary configuration changes." +msgstr "Після здійснення необхідних змін у конфігурації, ви можете перезапустити сервер." + +#: access/transam/xlog.c:6356 #, c-format -msgid "hot standby is not possible because %s = %d is a lower setting than on the master server (its value was %d)" -msgstr "hot standby неможливий, так як параметр %s = %d менший, ніж на головному сервері (його значення було %d)" +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "підвищення неможливе через недостатнє налаштування параметрів" -#: access/transam/xlog.c:6266 +#: access/transam/xlog.c:6366 #, c-format -msgid "WAL was generated with wal_level=minimal, data may be missing" -msgstr "WAL був створений з параметром wal_level=minimal, можлива втрата даних" +msgid "Restart the server after making the necessary configuration changes." +msgstr "Перезапустити сервер після здійснення необхідних змін у конфігурації." -#: access/transam/xlog.c:6267 +#: access/transam/xlog.c:6390 #, c-format -msgid "This happens if you temporarily set wal_level=minimal without taking a new base backup." -msgstr "Це трапляється, якщо ви тимчасово встановили wal_level=minimal і не зробили резервну копію бази даних." +msgid "recovery aborted because of insufficient parameter settings" +msgstr "відновлення перервано через недостатнє налаштування параметрів" -#: access/transam/xlog.c:6278 +#: access/transam/xlog.c:6396 #, c-format -msgid "hot standby is not possible because wal_level was not set to \"replica\" or higher on the master server" -msgstr "hot standby неможливий, так як на головному сервері встановлений невідповідний wal_level (повинен бути \"replica\" або вище)" +msgid "You can restart the server after making the necessary configuration changes." +msgstr "Ви можете перезапустити сервер, після здійснення необхідних змін у конфігурації." -#: access/transam/xlog.c:6279 +#: access/transam/xlog.c:6418 #, c-format -msgid "Either set wal_level to \"replica\" on the master, or turn off hot_standby here." -msgstr "Або встановіть для wal_level значення \"replica\" на головному сервері, або вимкніть hot_standby тут." +msgid "WAL was generated with wal_level=minimal, cannot continue recovering" +msgstr "WAL був створений з параметром wal_level=minimal, неможливо продовжити відновлення" -#: access/transam/xlog.c:6341 +#: access/transam/xlog.c:6419 +#, c-format +msgid "This happens if you temporarily set wal_level=minimal on the server." +msgstr "Це трапляється, якщо ви тимчасово встановили параметр wal_level=minimal на сервері." + +#: access/transam/xlog.c:6420 +#, c-format +msgid "Use a backup taken after setting wal_level to higher than minimal." +msgstr "Використовуйте резервну копію, зроблену після встановлення значення wal_level, що перевищує максимальне." + +#: access/transam/xlog.c:6489 #, c-format msgid "control file contains invalid checkpoint location" msgstr "контрольний файл містить неприпустиме розташування контрольної точки" -#: access/transam/xlog.c:6352 +#: access/transam/xlog.c:6500 #, c-format msgid "database system was shut down at %s" msgstr "система бази даних була вимкнена %s" -#: access/transam/xlog.c:6358 +#: access/transam/xlog.c:6506 #, c-format msgid "database system was shut down in recovery at %s" msgstr "система бази даних завершила роботу у процесі відновлення %s" -#: access/transam/xlog.c:6364 +#: access/transam/xlog.c:6512 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "завершення роботи бази даних було перервано; останній момент роботи %s" -#: access/transam/xlog.c:6370 +#: access/transam/xlog.c:6518 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "система бази даних була перервана в процесі відновлення %s" -#: access/transam/xlog.c:6372 +#: access/transam/xlog.c:6520 #, c-format msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." msgstr "Це, ймовірно, означає, що деякі дані були пошкоджені, і вам доведеться відновити базу даних з останнього збереження." -#: access/transam/xlog.c:6378 +#: access/transam/xlog.c:6526 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "робота системи бази даних була перервана в процесі відновлення, час в журналі %s" -#: access/transam/xlog.c:6380 +#: access/transam/xlog.c:6528 #, c-format msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." msgstr "Якщо це відбувається більше, ніж один раз, можливо, якісь дані були зіпсовані, і для відновлення треба вибрати більш ранню точку." -#: access/transam/xlog.c:6386 +#: access/transam/xlog.c:6534 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "робота системи бази даних була перервана; останній момент роботи %s" -#: access/transam/xlog.c:6392 +#: access/transam/xlog.c:6540 #, c-format msgid "control file contains invalid database cluster state" msgstr "контрольний файл містить неприпустимий стан кластеру бази даних" -#: access/transam/xlog.c:6449 +#: access/transam/xlog.c:6597 #, c-format msgid "entering standby mode" msgstr "перехід у режим очікування" -#: access/transam/xlog.c:6452 +#: access/transam/xlog.c:6600 #, c-format msgid "starting point-in-time recovery to XID %u" msgstr "починається відновлення точки в часі до XID %u" -#: access/transam/xlog.c:6456 +#: access/transam/xlog.c:6604 #, c-format msgid "starting point-in-time recovery to %s" msgstr "починається відновлення точки в часі до %s" -#: access/transam/xlog.c:6460 +#: access/transam/xlog.c:6608 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "починається відновлення точки в часі до \"%s\"" -#: access/transam/xlog.c:6464 +#: access/transam/xlog.c:6612 #, c-format msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" msgstr "починається відновлення точки в часі до локації WAL (LSN) \"%X/%X\"" -#: access/transam/xlog.c:6469 +#: access/transam/xlog.c:6616 #, c-format msgid "starting point-in-time recovery to earliest consistent point" msgstr "починається відновлення даних до першої точки домовленості" -#: access/transam/xlog.c:6472 +#: access/transam/xlog.c:6619 #, c-format msgid "starting archive recovery" msgstr "початок відновлення архіву" -#: access/transam/xlog.c:6531 access/transam/xlog.c:6664 -#, c-format -msgid "checkpoint record is at %X/%X" -msgstr "запис контрольної точки є на %X/%X" - -#: access/transam/xlog.c:6546 +#: access/transam/xlog.c:6693 #, c-format msgid "could not find redo location referenced by checkpoint record" msgstr "не вдалося знайти положення REDO, вказане записом контрольної точки" -#: access/transam/xlog.c:6547 access/transam/xlog.c:6557 +#: access/transam/xlog.c:6694 access/transam/xlog.c:6704 #, c-format msgid "If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" "If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" @@ -2452,278 +2591,280 @@ msgstr "Якщо ви відновлюєте з резервної копії, "Якщо ви не відновлюєте з резервної копії, спробуйте видалити файл \"%s/backup_label\".\n" "Будьте обережні: видалення \"%s/backup_label\" призведе до пошкодження кластеру при відновленні з резервної копії." -#: access/transam/xlog.c:6556 +#: access/transam/xlog.c:6703 #, c-format msgid "could not locate required checkpoint record" msgstr "не вдалося знайти запис потрібної контрольної точки" -#: access/transam/xlog.c:6585 commands/tablespace.c:654 +#: access/transam/xlog.c:6732 commands/tablespace.c:666 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "не вдалося створити символічне послання \"%s\": %m" -#: access/transam/xlog.c:6617 access/transam/xlog.c:6623 +#: access/transam/xlog.c:6764 access/transam/xlog.c:6770 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "файл \"%s\" ігнорується, тому що файлу \"%s\" не існує" -#: access/transam/xlog.c:6619 access/transam/xlog.c:11828 +#: access/transam/xlog.c:6766 access/transam/xlog.c:12089 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "Файл \"%s\" був перейменований на \"%s\"." -#: access/transam/xlog.c:6625 +#: access/transam/xlog.c:6772 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "Неможливо перейменувати файл \"%s\" на \"%s\": %m." -#: access/transam/xlog.c:6676 +#: access/transam/xlog.c:6823 #, c-format msgid "could not locate a valid checkpoint record" msgstr "не вдалося знайти запис допустимої контрольної точки" -#: access/transam/xlog.c:6714 +#: access/transam/xlog.c:6861 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "запитувана лінія часу %u не є відгалуженням історії цього серверу" -#: access/transam/xlog.c:6716 +#: access/transam/xlog.c:6863 #, c-format msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." msgstr "Остання контрольна точка %X/%X на лінії часу %u, але в історії запитуваної лінії часу сервер відгалузився з цієї лінії в %X/%X." -#: access/transam/xlog.c:6732 +#: access/transam/xlog.c:6877 #, c-format msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" msgstr "запитувана лінія часу %u не містить мінімальну точку відновлення %X/%X на лінії часу %u" -#: access/transam/xlog.c:6763 +#: access/transam/xlog.c:6907 #, c-format msgid "invalid next transaction ID" msgstr "невірний ID наступної транзакції" -#: access/transam/xlog.c:6857 +#: access/transam/xlog.c:7007 #, c-format msgid "invalid redo in checkpoint record" msgstr "невірний запис REDO в контрольній точці" -#: access/transam/xlog.c:6868 +#: access/transam/xlog.c:7018 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "невірний запис REDO в контрольній точці вимкнення" -#: access/transam/xlog.c:6902 +#: access/transam/xlog.c:7052 #, c-format msgid "database system was not properly shut down; automatic recovery in progress" msgstr "робота системи бази даних не була завершена належним чином; відбувається автоматичне відновлення" -#: access/transam/xlog.c:6906 +#: access/transam/xlog.c:7056 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "відновлення після збою починається на лінії часу %u і має цільову лінію часу: %u" -#: access/transam/xlog.c:6953 +#: access/transam/xlog.c:7103 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_label містить дані, які не узгоджені з файлом pg_control" -#: access/transam/xlog.c:6954 +#: access/transam/xlog.c:7104 #, c-format msgid "This means that the backup is corrupted and you will have to use another backup for recovery." msgstr "Це означає, що резервна копія була пошкоджена і вам доведеться використати іншу резервну копію для відновлення." -#: access/transam/xlog.c:7045 -#, c-format -msgid "initializing for hot standby" -msgstr "ініціалізація для hot standby" - -#: access/transam/xlog.c:7178 +#: access/transam/xlog.c:7330 #, c-format msgid "redo starts at %X/%X" msgstr "запис REDO починається з %X/%X" -#: access/transam/xlog.c:7402 +#: access/transam/xlog.c:7555 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "запитувана точка відновлення передує узгодженій точці відновлення" -#: access/transam/xlog.c:7440 +#: access/transam/xlog.c:7593 #, c-format -msgid "redo done at %X/%X" -msgstr "записи REDO оброблені до %X/%X" +msgid "redo done at %X/%X system usage: %s" +msgstr "повторно виконано через %X/%X системне використання: %s" -#: access/transam/xlog.c:7445 +#: access/transam/xlog.c:7599 #, c-format msgid "last completed transaction was at log time %s" msgstr "остання завершена транзакція була в %s" -#: access/transam/xlog.c:7454 +#: access/transam/xlog.c:7608 #, c-format msgid "redo is not required" msgstr "дані REDO не потрібні" -#: access/transam/xlog.c:7466 +#: access/transam/xlog.c:7620 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "відновлення завершилось до досягення налаштованої мети відновлення" -#: access/transam/xlog.c:7545 access/transam/xlog.c:7549 +#: access/transam/xlog.c:7699 access/transam/xlog.c:7703 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL завершився до завершення онлайн резервного копіювання" -#: access/transam/xlog.c:7546 +#: access/transam/xlog.c:7700 #, c-format msgid "All WAL generated while online backup was taken must be available at recovery." msgstr "Всі журнали WAL, створені під час резервного копіювання \"на ходу\", повинні бути в наявності для відновлення." -#: access/transam/xlog.c:7550 +#: access/transam/xlog.c:7704 #, c-format msgid "Online backup started with pg_start_backup() must be ended with pg_stop_backup(), and all WAL up to that point must be available at recovery." msgstr "Резервне копіювання БД \"на ходу\", розпочате за допомогою команди \"pg_start_backup()\", повинне завершуватися командою \"pg_stop_backup()\", і для відновлення повинні бути доступні усі журнали WAL. " -#: access/transam/xlog.c:7553 +#: access/transam/xlog.c:7707 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL завершився до узгодженої точки відновлення" -#: access/transam/xlog.c:7588 +#: access/transam/xlog.c:7742 #, c-format msgid "selected new timeline ID: %u" msgstr "вибрано новий ID часової лінії: %u" -#: access/transam/xlog.c:8036 +#: access/transam/xlog.c:8185 #, c-format msgid "consistent recovery state reached at %X/%X" msgstr "узгоджений стан відновлення досягнутий %X/%X" -#: access/transam/xlog.c:8246 +#: access/transam/xlog.c:8394 #, c-format msgid "invalid primary checkpoint link in control file" msgstr "невірне посилання на первинну контрольну точку в контрольному файлі" -#: access/transam/xlog.c:8250 +#: access/transam/xlog.c:8398 #, c-format msgid "invalid checkpoint link in backup_label file" msgstr "невірне посилання на контрольну точку в файлі backup_label" -#: access/transam/xlog.c:8268 +#: access/transam/xlog.c:8416 #, c-format msgid "invalid primary checkpoint record" msgstr "невірний запис первинної контрольної точки" -#: access/transam/xlog.c:8272 +#: access/transam/xlog.c:8420 #, c-format msgid "invalid checkpoint record" msgstr "невірний запис контрольної точки" -#: access/transam/xlog.c:8283 +#: access/transam/xlog.c:8431 #, c-format msgid "invalid resource manager ID in primary checkpoint record" msgstr "невірний ID менеджера ресурсів в записі первинної контрольної точки" -#: access/transam/xlog.c:8287 +#: access/transam/xlog.c:8435 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "невірний ID менеджера ресурсів в записі контрольної точки" -#: access/transam/xlog.c:8300 +#: access/transam/xlog.c:8448 #, c-format msgid "invalid xl_info in primary checkpoint record" msgstr "невірний xl_info у записі первинної контрольної точки" -#: access/transam/xlog.c:8304 +#: access/transam/xlog.c:8452 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "невірний xl_info у записі контрольної точки" -#: access/transam/xlog.c:8315 +#: access/transam/xlog.c:8463 #, c-format msgid "invalid length of primary checkpoint record" msgstr "невірна довжина запису первинної контрольної очки" -#: access/transam/xlog.c:8319 +#: access/transam/xlog.c:8467 #, c-format msgid "invalid length of checkpoint record" msgstr "невірна довжина запису контрольної точки" -#: access/transam/xlog.c:8499 +#: access/transam/xlog.c:8648 #, c-format msgid "shutting down" msgstr "завершення роботи" -#: access/transam/xlog.c:8819 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:8687 #, c-format -msgid "checkpoint skipped because system is idle" -msgstr "контрольну точку пропущено, тому що система перебуває в режимі простоювання" +msgid "restartpoint starting:%s%s%s%s%s%s%s%s" +msgstr "початок точки перезапуску: %s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:9019 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:8699 #, c-format -msgid "concurrent write-ahead log activity while database system is shutting down" -msgstr "під час того вимкнення БД помічено конкурентну активність у випереджувальному журналюванні" +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "початок контрольної точки: %s%s%s%s%s%s%s%s" + +#: access/transam/xlog.c:8759 +#, c-format +msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" +msgstr "точка перезапуску завершена: записано %d буферів (%.1f%%); %d WAL файлів додано, %d видалено, %d перероблених; запис=%ld.%03d сек, синхронізація=%ld.%03d сек, усього=%ld.%03d сек; файли синхронізації=%d, найдовший=%ld.%03d сек, середній=%ld.%03d сек; дистанція=%d кб, приблизно=%d кб" -#: access/transam/xlog.c:9276 +#: access/transam/xlog.c:8779 #, c-format -msgid "skipping restartpoint, recovery has already ended" -msgstr "пропуск контрольної точки, відновлення вже завершено" +msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" +msgstr "контрольна точка завершена: записано %d буферів (%.1f%%); %d WAL файлів додано, %d видалено, %d перероблених; запис=%ld.%03d сек, синхронізація=%ld.%03d сек, усього=%ld.%03d сек; файли синхронізації=%d, найдовший=%ld.%03d сек, середній=%ld.%03d сек; дистанція=%d кб, приблизно=%d кб" -#: access/transam/xlog.c:9299 +#: access/transam/xlog.c:9212 #, c-format -msgid "skipping restartpoint, already performed at %X/%X" -msgstr "створення точки перезапуску пропускається, вона вже створена в %X/%X" +msgid "concurrent write-ahead log activity while database system is shutting down" +msgstr "під час того вимкнення БД помічено конкурентну активність у випереджувальному журналюванні" -#: access/transam/xlog.c:9467 +#: access/transam/xlog.c:9684 #, c-format msgid "recovery restart point at %X/%X" msgstr "відновлення збереженої точки %X/%X" -#: access/transam/xlog.c:9469 +#: access/transam/xlog.c:9686 #, c-format msgid "Last completed transaction was at log time %s." msgstr "Остання завершена транзакція була в %s." -#: access/transam/xlog.c:9711 +#: access/transam/xlog.c:9932 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "точка відновлення \"%s\" створена в %X/%X" -#: access/transam/xlog.c:9856 +#: access/transam/xlog.c:10077 #, c-format msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" msgstr "несподіваний ID попередньої лінії часу %u (ID теперішньої лінії часу %u) в записі контрольної точки" -#: access/transam/xlog.c:9865 +#: access/transam/xlog.c:10086 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "неочікуваний ID лінії часу %u (після %u) в записі контрольної точки" -#: access/transam/xlog.c:9881 +#: access/transam/xlog.c:10102 #, c-format msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" msgstr "неочікуваний ID лінії часу %u в записі контрольної точки, до досягнення мінімальної точки відновлення %X/%X на лінії часу %u" -#: access/transam/xlog.c:9957 +#: access/transam/xlog.c:10177 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "онлайн резервне копіювання скасовано, неможливо продовжити відновлення" -#: access/transam/xlog.c:10013 access/transam/xlog.c:10069 -#: access/transam/xlog.c:10092 +#: access/transam/xlog.c:10233 access/transam/xlog.c:10289 +#: access/transam/xlog.c:10312 #, c-format msgid "unexpected timeline ID %u (should be %u) in checkpoint record" msgstr "несподіваний ID лінії часу %u (повинен бути %u) в записі контрольної точки" -#: access/transam/xlog.c:10418 +#: access/transam/xlog.c:10661 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "не вдалосьясинхронізувати файл наскрізного запису %s: %m" -#: access/transam/xlog.c:10424 +#: access/transam/xlog.c:10667 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "не вдалося fdatasync файл \"%s\": %m" -#: access/transam/xlog.c:10523 access/transam/xlog.c:11061 +#: access/transam/xlog.c:10778 access/transam/xlog.c:11307 #: access/transam/xlogfuncs.c:275 access/transam/xlogfuncs.c:302 #: access/transam/xlogfuncs.c:341 access/transam/xlogfuncs.c:362 #: access/transam/xlogfuncs.c:383 @@ -2731,216 +2872,206 @@ msgstr "не вдалося fdatasync файл \"%s\": %m" msgid "WAL control functions cannot be executed during recovery." msgstr "Функції управління WAL не можна використовувати під час відновлення." -#: access/transam/xlog.c:10532 access/transam/xlog.c:11070 +#: access/transam/xlog.c:10787 access/transam/xlog.c:11316 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "Обраний рівень WAL недостатній для резервного копіювання \"на ходу\"" -#: access/transam/xlog.c:10533 access/transam/xlog.c:11071 +#: access/transam/xlog.c:10788 access/transam/xlog.c:11317 #: access/transam/xlogfuncs.c:308 #, c-format msgid "wal_level must be set to \"replica\" or \"logical\" at server start." msgstr "встановіть wal_level \"replica\" або \"logical\" при запуску серверу." -#: access/transam/xlog.c:10538 +#: access/transam/xlog.c:10793 #, c-format msgid "backup label too long (max %d bytes)" msgstr "мітка резервного копіювання задовга (максимум %d байт)" -#: access/transam/xlog.c:10575 access/transam/xlog.c:10860 -#: access/transam/xlog.c:10898 +#: access/transam/xlog.c:10830 access/transam/xlog.c:11106 +#: access/transam/xlog.c:11144 #, c-format msgid "a backup is already in progress" msgstr "резервне копіювання вже триває" -#: access/transam/xlog.c:10576 +#: access/transam/xlog.c:10831 #, c-format msgid "Run pg_stop_backup() and try again." msgstr "Запустіть pg_stop_backup() і спробуйте знову." -#: access/transam/xlog.c:10672 +#: access/transam/xlog.c:10927 #, c-format msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" msgstr "Після останньої точки відновлення був відтворений WAL, створений в режимі full_page_writes=off" -#: access/transam/xlog.c:10674 access/transam/xlog.c:11266 +#: access/transam/xlog.c:10929 access/transam/xlog.c:11512 #, c-format -msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the master, and then try an online backup again." -msgstr "Це означає, що резервна копія, зроблена на резервному сервері, зіпсована і її не слід використовувати. Активуйте режим full_page_writes та запустіть CHECKPOINT на головному сервері, а потім спробуйте резервне копіювання \"на ходу\" ще раз." +msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." +msgstr "Це означає, що резервна копія, зроблена на резервному сервері пошкоджена і не повинна використовуватись. Активуйте full_page_writes і запустіть CHECKPOINT на основному сервері, а потім спробуйте ще раз створити резервну копію в Інтернеті." -#: access/transam/xlog.c:10757 replication/basebackup.c:1423 -#: utils/adt/misc.c:342 +#: access/transam/xlog.c:11005 replication/basebackup.c:1433 +#: utils/adt/misc.c:345 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "таргет символічного посилання \"%s\" задовгий" -#: access/transam/xlog.c:10810 commands/tablespace.c:402 -#: commands/tablespace.c:566 replication/basebackup.c:1438 utils/adt/misc.c:350 +#: access/transam/xlog.c:11055 commands/tablespace.c:402 +#: commands/tablespace.c:578 replication/basebackup.c:1448 utils/adt/misc.c:353 #, c-format msgid "tablespaces are not supported on this platform" msgstr "табличний простір не підтримується на цій платформі" -#: access/transam/xlog.c:10861 access/transam/xlog.c:10899 +#: access/transam/xlog.c:11107 access/transam/xlog.c:11145 #, c-format msgid "If you're sure there is no backup in progress, remove file \"%s\" and try again." msgstr "Якщо ви вважаєте, що жодне резервне копіювання не триває, видаліть файл \"%s\" і спробуйте знову." -#: access/transam/xlog.c:11086 +#: access/transam/xlog.c:11332 #, c-format msgid "exclusive backup not in progress" msgstr "ексклюзивне резервне копіювання не виконується" -#: access/transam/xlog.c:11113 +#: access/transam/xlog.c:11359 #, c-format msgid "a backup is not in progress" msgstr "резервне копіювання не виконується" -#: access/transam/xlog.c:11199 access/transam/xlog.c:11212 -#: access/transam/xlog.c:11601 access/transam/xlog.c:11607 -#: access/transam/xlog.c:11655 access/transam/xlog.c:11728 -#: access/transam/xlogfuncs.c:692 +#: access/transam/xlog.c:11445 access/transam/xlog.c:11458 +#: access/transam/xlog.c:11847 access/transam/xlog.c:11853 +#: access/transam/xlog.c:11901 access/transam/xlog.c:11981 +#: access/transam/xlog.c:12005 access/transam/xlogfuncs.c:733 #, c-format msgid "invalid data in file \"%s\"" msgstr "невірні дані у файлі \"%s\"" -#: access/transam/xlog.c:11216 replication/basebackup.c:1271 +#: access/transam/xlog.c:11462 replication/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "режим очікування було підвищено у процесі резервного копіювання \"на ходу\"" -#: access/transam/xlog.c:11217 replication/basebackup.c:1272 +#: access/transam/xlog.c:11463 replication/basebackup.c:1282 #, c-format msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "Це означає, що вибрана резервна копія є пошкодженою і її не слід використовувати. Спробуйте використати іншу онлайн резервну копію." -#: access/transam/xlog.c:11264 +#: access/transam/xlog.c:11510 #, c-format msgid "WAL generated with full_page_writes=off was replayed during online backup" msgstr "У процесі резервного копіювання \"на ходу\" був відтворений WAL, створений в режимі full_page_writes=off" -#: access/transam/xlog.c:11384 +#: access/transam/xlog.c:11630 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "резервне копіювання виконане, очікуються необхідні сегменти WAL для архівації" -#: access/transam/xlog.c:11396 +#: access/transam/xlog.c:11642 #, c-format msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" msgstr "все ще чекає на необхідні сегменти WAL для архівації (%d секунд пройшло)" -#: access/transam/xlog.c:11398 +#: access/transam/xlog.c:11644 #, c-format msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." msgstr "Перевірте, чи правильно виконується команда archive_command. Ви можете безпечно скасувати це резервне копіювання, але резервна копія БД буде непридатна без усіх сегментів WAL." -#: access/transam/xlog.c:11405 +#: access/transam/xlog.c:11651 #, c-format msgid "all required WAL segments have been archived" msgstr "усі необхідні сегменти WAL архівовані" -#: access/transam/xlog.c:11409 +#: access/transam/xlog.c:11655 #, c-format msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" msgstr "архівація WAL не налаштована; ви повинні забезпечити копіювання всіх необхідних сегментів WAL іншими засобами для отримання резервної копії" -#: access/transam/xlog.c:11462 +#: access/transam/xlog.c:11708 #, c-format msgid "aborting backup due to backend exiting before pg_stop_backup was called" msgstr "припинення резервного копіювання через завершення обслуговуючого процесу до виклику pg_stop_backup" -#: access/transam/xlog.c:11638 -#, c-format -msgid "backup time %s in file \"%s\"" -msgstr "час резервного копіювання %s у файлі \"%s\"" - -#: access/transam/xlog.c:11643 -#, c-format -msgid "backup label %s in file \"%s\"" -msgstr "мітка резервного копіювання %s у файлі \"%s\"" - -#: access/transam/xlog.c:11656 +#: access/transam/xlog.c:11902 #, c-format msgid "Timeline ID parsed is %u, but expected %u." msgstr "Проаналізовано ID часової лінії %u, очіувалося %u." -#: access/transam/xlog.c:11660 -#, c-format -msgid "backup timeline %u in file \"%s\"" -msgstr "лінія часу резервного копіювання %u у файлі \"%s\"" - #. translator: %s is a WAL record description -#: access/transam/xlog.c:11768 +#: access/transam/xlog.c:12030 #, c-format msgid "WAL redo at %X/%X for %s" msgstr "запис REDO в WAL в позиції %X/%X для %s" -#: access/transam/xlog.c:11817 +#: access/transam/xlog.c:12078 #, c-format msgid "online backup mode was not canceled" msgstr "режим копіювання онлайн не був відмінений" -#: access/transam/xlog.c:11818 +#: access/transam/xlog.c:12079 #, c-format msgid "File \"%s\" could not be renamed to \"%s\": %m." msgstr "Файл \"%s\" не може бути перейменований на \"%s\": %m." -#: access/transam/xlog.c:11827 access/transam/xlog.c:11839 -#: access/transam/xlog.c:11849 +#: access/transam/xlog.c:12088 access/transam/xlog.c:12100 +#: access/transam/xlog.c:12110 #, c-format msgid "online backup mode canceled" msgstr "режим копіювання онлайн був відмінений" -#: access/transam/xlog.c:11840 +#: access/transam/xlog.c:12101 #, c-format msgid "Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." msgstr "Файли \"%s\" і \"%s\" було перейменовано на \"%s\" і \"%s\" відповідно." -#: access/transam/xlog.c:11850 +#: access/transam/xlog.c:12111 #, c-format msgid "File \"%s\" was renamed to \"%s\", but file \"%s\" could not be renamed to \"%s\": %m." msgstr "Файл \"%s\" було перейменовано на \"%s\", але файл \"%s\" не можливо перейменувати на \"%s\": %m." -#: access/transam/xlog.c:11983 access/transam/xlogutils.c:971 +#: access/transam/xlog.c:12244 access/transam/xlogutils.c:967 #, c-format msgid "could not read from log segment %s, offset %u: %m" msgstr "не вдалося прочитати сегмент журналу %s, зсув %u: %m" -#: access/transam/xlog.c:11989 access/transam/xlogutils.c:978 +#: access/transam/xlog.c:12250 access/transam/xlogutils.c:974 #, c-format msgid "could not read from log segment %s, offset %u: read %d of %zu" msgstr "не вдалося прочитати сегмент журналу %s, зсув %u: прочитано %d з %zu" -#: access/transam/xlog.c:12518 +#: access/transam/xlog.c:12795 #, c-format msgid "WAL receiver process shutdown requested" msgstr "Запитано відключення процесу приймача WAL" -#: access/transam/xlog.c:12624 +#: access/transam/xlog.c:12890 #, c-format msgid "received promote request" msgstr "отримано запит підвищення статусу" -#: access/transam/xlog.c:12637 +#: access/transam/xlog.c:12903 #, c-format msgid "promote trigger file found: %s" msgstr "знайдено файл тригера підвищення: %s" -#: access/transam/xlog.c:12646 +#: access/transam/xlog.c:12911 #, c-format msgid "could not stat promote trigger file \"%s\": %m" msgstr "не вдалося отримати інформацію про файл тригера підвищення \"%s\": %m" #: access/transam/xlogarchive.c:205 #, c-format -msgid "archive file \"%s\" has wrong size: %lu instead of %lu" -msgstr "файл архіву \"%s\" має неправильний розмір: %lu замість %lu" +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "файл архіву \"%s\" має неправильний розмір: %lld замість %lld" #: access/transam/xlogarchive.c:214 #, c-format msgid "restored log file \"%s\" from archive" msgstr "відновлений файл журналу \"%s\" з архіву" -#: access/transam/xlogarchive.c:259 +#: access/transam/xlogarchive.c:228 +#, c-format +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "restore_command повернула нульовий статус виходу, але stat() не вдався." + +#: access/transam/xlogarchive.c:260 #, c-format msgid "could not restore file \"%s\" from archive: %s" msgstr "неможливо відновити файл \"%s\" з архіву: %s" @@ -2948,17 +3079,17 @@ msgstr "неможливо відновити файл \"%s\" з архіву: % #. translator: First %s represents a postgresql.conf parameter name like #. "recovery_end_command", the 2nd is the value of that parameter, the #. third an already translated error message. -#: access/transam/xlogarchive.c:368 +#: access/transam/xlogarchive.c:369 #, c-format msgid "%s \"%s\": %s" msgstr "%s \"%s\": %s" -#: access/transam/xlogarchive.c:478 access/transam/xlogarchive.c:542 +#: access/transam/xlogarchive.c:479 access/transam/xlogarchive.c:543 #, c-format msgid "could not create archive status file \"%s\": %m" msgstr "неможливо створити файл статусу архіву \"%s\": %m" -#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:550 +#: access/transam/xlogarchive.c:487 access/transam/xlogarchive.c:551 #, c-format msgid "could not write archive status file \"%s\": %m" msgstr "неможливо записати файл архівного статусу \"%s\": %m" @@ -2978,34 +3109,36 @@ msgstr "виконується не ексклюзивне резервне ко msgid "Did you mean to use pg_stop_backup('f')?" msgstr "Ви мали на увазі використаня pg_stop_backup('f')?" -#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1332 -#: commands/event_trigger.c:1890 commands/extension.c:1944 -#: commands/extension.c:2052 commands/extension.c:2337 commands/prepare.c:712 -#: executor/execExpr.c:2203 executor/execSRF.c:728 executor/functions.c:1046 -#: foreign/foreign.c:520 libpq/hba.c:2666 replication/logical/launcher.c:1086 -#: replication/logical/logicalfuncs.c:157 replication/logical/origin.c:1486 -#: replication/slotfuncs.c:252 replication/walsender.c:3265 -#: storage/ipc/shmem.c:550 utils/adt/datetime.c:4765 utils/adt/genfile.c:505 -#: utils/adt/genfile.c:588 utils/adt/jsonfuncs.c:1792 -#: utils/adt/jsonfuncs.c:1904 utils/adt/jsonfuncs.c:2092 -#: utils/adt/jsonfuncs.c:2201 utils/adt/jsonfuncs.c:3663 utils/adt/misc.c:215 -#: utils/adt/pgstatfuncs.c:476 utils/adt/pgstatfuncs.c:584 -#: utils/adt/pgstatfuncs.c:1719 utils/fmgr/funcapi.c:72 utils/misc/guc.c:9648 -#: utils/mmgr/portalmem.c:1136 +#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1311 +#: commands/event_trigger.c:1869 commands/extension.c:1945 +#: commands/extension.c:2053 commands/extension.c:2338 commands/prepare.c:713 +#: executor/execExpr.c:2507 executor/execSRF.c:738 executor/functions.c:1058 +#: foreign/foreign.c:520 libpq/hba.c:2718 replication/logical/launcher.c:937 +#: replication/logical/logicalfuncs.c:157 replication/logical/origin.c:1494 +#: replication/slotfuncs.c:255 replication/walsender.c:3291 +#: storage/ipc/shmem.c:554 utils/adt/datetime.c:4812 utils/adt/genfile.c:507 +#: utils/adt/genfile.c:590 utils/adt/jsonfuncs.c:1933 +#: utils/adt/jsonfuncs.c:2045 utils/adt/jsonfuncs.c:2233 +#: utils/adt/jsonfuncs.c:2342 utils/adt/jsonfuncs.c:3803 +#: utils/adt/mcxtfuncs.c:132 utils/adt/misc.c:218 utils/adt/pgstatfuncs.c:477 +#: utils/adt/pgstatfuncs.c:587 utils/adt/pgstatfuncs.c:1887 +#: utils/adt/varlena.c:4832 utils/fmgr/funcapi.c:74 utils/misc/guc.c:9994 +#: utils/mmgr/portalmem.c:1141 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "функція \"set-valued\" викликана в контексті, де йому немає місця" -#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1336 -#: commands/event_trigger.c:1894 commands/extension.c:1948 -#: commands/extension.c:2056 commands/extension.c:2341 commands/prepare.c:716 -#: foreign/foreign.c:525 libpq/hba.c:2670 replication/logical/launcher.c:1090 -#: replication/logical/logicalfuncs.c:161 replication/logical/origin.c:1490 -#: replication/slotfuncs.c:256 replication/walsender.c:3269 -#: storage/ipc/shmem.c:554 utils/adt/datetime.c:4769 utils/adt/genfile.c:509 -#: utils/adt/genfile.c:592 utils/adt/misc.c:219 utils/adt/pgstatfuncs.c:480 -#: utils/adt/pgstatfuncs.c:588 utils/adt/pgstatfuncs.c:1723 -#: utils/misc/guc.c:9652 utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1140 +#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1315 +#: commands/event_trigger.c:1873 commands/extension.c:1949 +#: commands/extension.c:2057 commands/extension.c:2342 commands/prepare.c:717 +#: foreign/foreign.c:525 libpq/hba.c:2722 replication/logical/launcher.c:941 +#: replication/logical/logicalfuncs.c:161 replication/logical/origin.c:1498 +#: replication/slotfuncs.c:259 replication/walsender.c:3295 +#: storage/ipc/shmem.c:558 utils/adt/datetime.c:4816 utils/adt/genfile.c:511 +#: utils/adt/genfile.c:594 utils/adt/mcxtfuncs.c:136 utils/adt/misc.c:222 +#: utils/adt/pgstatfuncs.c:481 utils/adt/pgstatfuncs.c:591 +#: utils/adt/pgstatfuncs.c:1891 utils/adt/varlena.c:4836 utils/misc/guc.c:9998 +#: utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1145 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "необхідний режим матеріалізації (materialize mode), але він неприпустимий у цьому контексті" @@ -3035,42 +3168,48 @@ msgstr "значення для точки відновлення перевищ msgid "%s cannot be executed during recovery." msgstr "%s не можна використовувати під час відновлення." -#: access/transam/xlogfuncs.c:531 access/transam/xlogfuncs.c:558 -#: access/transam/xlogfuncs.c:582 access/transam/xlogfuncs.c:722 +#: access/transam/xlogfuncs.c:531 access/transam/xlogfuncs.c:561 +#: access/transam/xlogfuncs.c:585 access/transam/xlogfuncs.c:608 +#: access/transam/xlogfuncs.c:763 #, c-format msgid "recovery is not in progress" msgstr "відновлення не виконується" -#: access/transam/xlogfuncs.c:532 access/transam/xlogfuncs.c:559 -#: access/transam/xlogfuncs.c:583 access/transam/xlogfuncs.c:723 +#: access/transam/xlogfuncs.c:532 access/transam/xlogfuncs.c:562 +#: access/transam/xlogfuncs.c:586 access/transam/xlogfuncs.c:609 +#: access/transam/xlogfuncs.c:764 #, c-format msgid "Recovery control functions can only be executed during recovery." msgstr "Функції управління відновленням можна використовувати тільки під час відновлення." -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:564 +#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:567 #, c-format msgid "standby promotion is ongoing" msgstr "триває просування в режимі очікування" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:565 +#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 #, c-format msgid "%s cannot be executed after promotion is triggered." msgstr "%s не може бути виконаний після того як просування запущено." -#: access/transam/xlogfuncs.c:728 +#: access/transam/xlogfuncs.c:769 #, c-format msgid "\"wait_seconds\" must not be negative or zero" msgstr "\"wait_seconds\" не має бути від'ємним чи нулем" -#: access/transam/xlogfuncs.c:748 storage/ipc/signalfuncs.c:164 +#: access/transam/xlogfuncs.c:789 storage/ipc/signalfuncs.c:247 #, c-format msgid "failed to send signal to postmaster: %m" msgstr "надіслати сигнал процесу postmaster не вдалося: %m" -#: access/transam/xlogfuncs.c:784 +#: access/transam/xlogfuncs.c:825 #, c-format -msgid "server did not promote within %d seconds" -msgstr "сервер не підвищено протягом %d секунд" +msgid "server did not promote within %d second" +msgid_plural "server did not promote within %d seconds" +msgstr[0] "сервер не підвищувався протягом %d секунди" +msgstr[1] "сервер не підвищувався протягом %d секунд" +msgstr[2] "сервер не підвищувався протягом %d секунд" +msgstr[3] "сервер не підвищувався протягом %d секунд" #: access/transam/xlogreader.c:349 #, c-format @@ -3092,143 +3231,143 @@ msgstr "невірна довжина запису по зсуву %X/%X: очі msgid "record length %u at %X/%X too long" msgstr "довжина запису %u на %X/%X є задовгою" -#: access/transam/xlogreader.c:454 +#: access/transam/xlogreader.c:453 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "немає флага contrecord в позиції %X/%X" -#: access/transam/xlogreader.c:467 +#: access/transam/xlogreader.c:466 #, c-format -msgid "invalid contrecord length %u at %X/%X" -msgstr "невірна довижна contrecord (%u) в позиції %X/%X" +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "неприпустима довжина contrecord %u (очікувалось %lld) на %X/%X" #: access/transam/xlogreader.c:703 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "невірний ID менеджера ресурсів %u в %X/%X" -#: access/transam/xlogreader.c:717 access/transam/xlogreader.c:734 +#: access/transam/xlogreader.c:716 access/transam/xlogreader.c:732 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "запис з неправильним попереднім посиланням %X/%X на %X/%X" -#: access/transam/xlogreader.c:771 +#: access/transam/xlogreader.c:768 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "некоректна контрольна сума даних менеджера ресурсів у запису по зсуву %X/%X" -#: access/transam/xlogreader.c:808 +#: access/transam/xlogreader.c:805 #, c-format msgid "invalid magic number %04X in log segment %s, offset %u" msgstr "невірне магічне число %04X в сегменті журналу %s, зсув %u" -#: access/transam/xlogreader.c:822 access/transam/xlogreader.c:863 +#: access/transam/xlogreader.c:819 access/transam/xlogreader.c:860 #, c-format msgid "invalid info bits %04X in log segment %s, offset %u" msgstr "невірні інформаційні біти %04X в сегменті журналу %s, зсув %u" -#: access/transam/xlogreader.c:837 +#: access/transam/xlogreader.c:834 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL файл належить іншій системі баз даних: ідентифікатор системи баз даних де міститься WAL файл - %llu, а ідентифікатор системи баз даних pg_control - %llu" -#: access/transam/xlogreader.c:845 +#: access/transam/xlogreader.c:842 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "Файл WAL належить іншій системі баз даних: некоректний розмір сегменту в заголовку сторінки" -#: access/transam/xlogreader.c:851 +#: access/transam/xlogreader.c:848 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "Файл WAL належить іншій системі баз даних: некоректний XLOG_BLCKSZ в заголовку сторінки" -#: access/transam/xlogreader.c:882 +#: access/transam/xlogreader.c:879 #, c-format msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" msgstr "неочікуваний pageaddr %X/%X в сегменті журналу %s, зсув %u" -#: access/transam/xlogreader.c:907 +#: access/transam/xlogreader.c:904 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" msgstr "порушення послідовності ID лінії часу %u (після %u) в сегменті журналу %s, зсув %u" -#: access/transam/xlogreader.c:1247 +#: access/transam/xlogreader.c:1249 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "ідентифікатор блока %u out-of-order в позиції %X/%X" -#: access/transam/xlogreader.c:1270 +#: access/transam/xlogreader.c:1271 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA встановлений, але немає даних в позиції %X/%X" -#: access/transam/xlogreader.c:1277 +#: access/transam/xlogreader.c:1278 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA встановлений, але довжина даних дорівнює %u в позиції %X/%X" -#: access/transam/xlogreader.c:1313 +#: access/transam/xlogreader.c:1314 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE встановлений, але для пропуску задані: зсув %u, довжина %u, при довжині образу блока %u в позиції %X/%X" -#: access/transam/xlogreader.c:1329 +#: access/transam/xlogreader.c:1330 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE не встановлений, але для пропуску задані: зсув %u, довжина %u в позиції %X/%X" -#: access/transam/xlogreader.c:1344 +#: access/transam/xlogreader.c:1345 #, c-format msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_IS_COMPRESSED встановлений, але довжина образу блока дорівнює %u в позиції %X/%X" -#: access/transam/xlogreader.c:1359 +#: access/transam/xlogreader.c:1360 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" msgstr "ні BKPIMAGE_HAS_HOLE, ні BKPIMAGE_IS_COMPRESSED не встановлені, але довжина образу блока дорвінює %u в позиції %X/%X" -#: access/transam/xlogreader.c:1375 +#: access/transam/xlogreader.c:1376 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL встановлений, але попереднє значення не задано в позиції %X/%X" -#: access/transam/xlogreader.c:1387 +#: access/transam/xlogreader.c:1388 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "невірний ідентифікатор блоку %u в позиції %X/%X" -#: access/transam/xlogreader.c:1476 +#: access/transam/xlogreader.c:1475 #, c-format msgid "record with invalid length at %X/%X" msgstr "запис з невірною довжиною на %X/%X" -#: access/transam/xlogreader.c:1565 +#: access/transam/xlogreader.c:1564 #, c-format msgid "invalid compressed image at %X/%X, block %d" msgstr "невірно стиснутий образ в позиції %X/%X, блок %d" -#: bootstrap/bootstrap.c:271 +#: bootstrap/bootstrap.c:270 #, c-format msgid "-X requires a power of two value between 1 MB and 1 GB" msgstr "для -X необхідне число, яке дорівнює ступеню 2 в інтервалі від 1 МБ до 1 ГБ" -#: bootstrap/bootstrap.c:288 postmaster/postmaster.c:842 tcop/postgres.c:3705 +#: bootstrap/bootstrap.c:287 postmaster/postmaster.c:847 tcop/postgres.c:3858 #, c-format msgid "--%s requires a value" msgstr "--%s необхідне значення" -#: bootstrap/bootstrap.c:293 postmaster/postmaster.c:847 tcop/postgres.c:3710 +#: bootstrap/bootstrap.c:292 postmaster/postmaster.c:852 tcop/postgres.c:3863 #, c-format msgid "-c %s requires a value" msgstr "-c %s необхідне значення" -#: bootstrap/bootstrap.c:304 postmaster/postmaster.c:859 -#: postmaster/postmaster.c:872 +#: bootstrap/bootstrap.c:303 postmaster/postmaster.c:864 +#: postmaster/postmaster.c:877 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" для отримання додаткової інформації.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" -#: bootstrap/bootstrap.c:313 +#: bootstrap/bootstrap.c:312 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s: невірні аргументи командного рядка\n" @@ -3278,93 +3417,98 @@ msgstr "для стовпця \"%s\" відношення \"%s\" не всі п msgid "not all privileges could be revoked for \"%s\"" msgstr "для \"%s\" не всі права можуть бути відкликані" -#: catalog/aclchk.c:430 catalog/aclchk.c:973 +#: catalog/aclchk.c:379 +#, c-format +msgid "grantor must be current user" +msgstr "грантодавець повинен бути поточним користувачем" + +#: catalog/aclchk.c:446 catalog/aclchk.c:989 #, c-format msgid "invalid privilege type %s for relation" msgstr "недійсний тип права %s для відношення" -#: catalog/aclchk.c:434 catalog/aclchk.c:977 +#: catalog/aclchk.c:450 catalog/aclchk.c:993 #, c-format msgid "invalid privilege type %s for sequence" msgstr "невірний тип права %s для послідовності" -#: catalog/aclchk.c:438 +#: catalog/aclchk.c:454 #, c-format msgid "invalid privilege type %s for database" msgstr "недійсний тип права %s для бази даних" -#: catalog/aclchk.c:442 +#: catalog/aclchk.c:458 #, c-format msgid "invalid privilege type %s for domain" msgstr "недійсний тип права %s для домену" -#: catalog/aclchk.c:446 catalog/aclchk.c:981 +#: catalog/aclchk.c:462 catalog/aclchk.c:997 #, c-format msgid "invalid privilege type %s for function" msgstr "недійсний тип права %s для функції" -#: catalog/aclchk.c:450 +#: catalog/aclchk.c:466 #, c-format msgid "invalid privilege type %s for language" msgstr "недійсний тип права %s для мови" -#: catalog/aclchk.c:454 +#: catalog/aclchk.c:470 #, c-format msgid "invalid privilege type %s for large object" msgstr "недійсний тип права %s для великого об'єкту" -#: catalog/aclchk.c:458 catalog/aclchk.c:997 +#: catalog/aclchk.c:474 catalog/aclchk.c:1013 #, c-format msgid "invalid privilege type %s for schema" msgstr "недійсний тип права %s для схеми" -#: catalog/aclchk.c:462 catalog/aclchk.c:985 +#: catalog/aclchk.c:478 catalog/aclchk.c:1001 #, c-format msgid "invalid privilege type %s for procedure" msgstr "недійсний тип права %s для процедури" -#: catalog/aclchk.c:466 catalog/aclchk.c:989 +#: catalog/aclchk.c:482 catalog/aclchk.c:1005 #, c-format msgid "invalid privilege type %s for routine" msgstr "недійсний тип права %s для підпрограми" -#: catalog/aclchk.c:470 +#: catalog/aclchk.c:486 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "недійсний тип права %s для табличного простору" -#: catalog/aclchk.c:474 catalog/aclchk.c:993 +#: catalog/aclchk.c:490 catalog/aclchk.c:1009 #, c-format msgid "invalid privilege type %s for type" msgstr "недійсний тип права %s для типу" -#: catalog/aclchk.c:478 +#: catalog/aclchk.c:494 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "недійсний тип права %s для джерела сторонніх даних" -#: catalog/aclchk.c:482 +#: catalog/aclchk.c:498 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "недійсний тип права %s для стороннього серверу" -#: catalog/aclchk.c:521 +#: catalog/aclchk.c:537 #, c-format msgid "column privileges are only valid for relations" msgstr "права стовпця дійсні тільки для відношень" -#: catalog/aclchk.c:681 catalog/aclchk.c:4100 catalog/aclchk.c:4882 -#: catalog/objectaddress.c:965 catalog/pg_largeobject.c:116 +#: catalog/aclchk.c:697 catalog/aclchk.c:4164 catalog/aclchk.c:4985 +#: catalog/objectaddress.c:1060 catalog/pg_largeobject.c:116 #: storage/large_object/inv_api.c:285 #, c-format msgid "large object %u does not exist" msgstr "великий об'єкт %u не існує" -#: catalog/aclchk.c:910 catalog/aclchk.c:919 commands/collationcmds.c:118 -#: commands/copy.c:1134 commands/copy.c:1154 commands/copy.c:1163 -#: commands/copy.c:1172 commands/copy.c:1181 commands/copy.c:1190 -#: commands/copy.c:1199 commands/copy.c:1208 commands/copy.c:1226 -#: commands/copy.c:1242 commands/copy.c:1262 commands/copy.c:1279 +#: catalog/aclchk.c:926 catalog/aclchk.c:935 commands/collationcmds.c:119 +#: commands/copy.c:362 commands/copy.c:382 commands/copy.c:392 +#: commands/copy.c:401 commands/copy.c:410 commands/copy.c:420 +#: commands/copy.c:429 commands/copy.c:438 commands/copy.c:456 +#: commands/copy.c:472 commands/copy.c:492 commands/copy.c:509 #: commands/dbcommands.c:157 commands/dbcommands.c:166 #: commands/dbcommands.c:175 commands/dbcommands.c:184 #: commands/dbcommands.c:193 commands/dbcommands.c:202 @@ -3372,625 +3516,647 @@ msgstr "великий об'єкт %u не існує" #: commands/dbcommands.c:229 commands/dbcommands.c:238 #: commands/dbcommands.c:260 commands/dbcommands.c:1502 #: commands/dbcommands.c:1511 commands/dbcommands.c:1520 -#: commands/dbcommands.c:1529 commands/extension.c:1735 -#: commands/extension.c:1745 commands/extension.c:1755 -#: commands/extension.c:3055 commands/foreigncmds.c:539 -#: commands/foreigncmds.c:548 commands/functioncmds.c:570 -#: commands/functioncmds.c:736 commands/functioncmds.c:745 -#: commands/functioncmds.c:754 commands/functioncmds.c:763 -#: commands/functioncmds.c:2014 commands/functioncmds.c:2022 +#: commands/dbcommands.c:1529 commands/extension.c:1736 +#: commands/extension.c:1746 commands/extension.c:1756 +#: commands/extension.c:3056 commands/foreigncmds.c:539 +#: commands/foreigncmds.c:548 commands/functioncmds.c:604 +#: commands/functioncmds.c:770 commands/functioncmds.c:779 +#: commands/functioncmds.c:788 commands/functioncmds.c:797 +#: commands/functioncmds.c:2094 commands/functioncmds.c:2102 #: commands/publicationcmds.c:90 commands/publicationcmds.c:133 -#: commands/sequence.c:1267 commands/sequence.c:1277 commands/sequence.c:1287 -#: commands/sequence.c:1297 commands/sequence.c:1307 commands/sequence.c:1317 -#: commands/sequence.c:1327 commands/sequence.c:1337 commands/sequence.c:1347 -#: commands/subscriptioncmds.c:104 commands/subscriptioncmds.c:114 +#: commands/sequence.c:1266 commands/sequence.c:1276 commands/sequence.c:1286 +#: commands/sequence.c:1296 commands/sequence.c:1306 commands/sequence.c:1316 +#: commands/sequence.c:1326 commands/sequence.c:1336 commands/sequence.c:1346 #: commands/subscriptioncmds.c:124 commands/subscriptioncmds.c:134 -#: commands/subscriptioncmds.c:148 commands/subscriptioncmds.c:159 -#: commands/subscriptioncmds.c:173 commands/tablecmds.c:7102 -#: commands/typecmds.c:322 commands/typecmds.c:1355 commands/typecmds.c:1364 -#: commands/typecmds.c:1372 commands/typecmds.c:1380 commands/typecmds.c:1388 -#: commands/user.c:133 commands/user.c:147 commands/user.c:156 -#: commands/user.c:165 commands/user.c:174 commands/user.c:183 -#: commands/user.c:192 commands/user.c:201 commands/user.c:210 -#: commands/user.c:219 commands/user.c:228 commands/user.c:237 -#: commands/user.c:246 commands/user.c:582 commands/user.c:590 -#: commands/user.c:598 commands/user.c:606 commands/user.c:614 -#: commands/user.c:622 commands/user.c:630 commands/user.c:638 -#: commands/user.c:647 commands/user.c:655 commands/user.c:663 -#: parser/parse_utilcmd.c:387 replication/pgoutput/pgoutput.c:141 -#: replication/pgoutput/pgoutput.c:162 replication/walsender.c:886 -#: replication/walsender.c:897 replication/walsender.c:907 +#: commands/subscriptioncmds.c:144 commands/subscriptioncmds.c:154 +#: commands/subscriptioncmds.c:170 commands/subscriptioncmds.c:181 +#: commands/subscriptioncmds.c:195 commands/subscriptioncmds.c:205 +#: commands/subscriptioncmds.c:215 commands/tablecmds.c:7463 +#: commands/typecmds.c:335 commands/typecmds.c:1416 commands/typecmds.c:1425 +#: commands/typecmds.c:1433 commands/typecmds.c:1441 commands/typecmds.c:1449 +#: commands/typecmds.c:1457 commands/user.c:133 commands/user.c:147 +#: commands/user.c:156 commands/user.c:165 commands/user.c:174 +#: commands/user.c:183 commands/user.c:192 commands/user.c:201 +#: commands/user.c:210 commands/user.c:219 commands/user.c:228 +#: commands/user.c:237 commands/user.c:246 commands/user.c:582 +#: commands/user.c:590 commands/user.c:598 commands/user.c:606 +#: commands/user.c:614 commands/user.c:622 commands/user.c:630 +#: commands/user.c:638 commands/user.c:647 commands/user.c:655 +#: commands/user.c:663 parser/parse_utilcmd.c:397 +#: replication/pgoutput/pgoutput.c:189 replication/pgoutput/pgoutput.c:210 +#: replication/pgoutput/pgoutput.c:224 replication/pgoutput/pgoutput.c:234 +#: replication/pgoutput/pgoutput.c:244 replication/walsender.c:882 +#: replication/walsender.c:893 replication/walsender.c:903 #, c-format msgid "conflicting or redundant options" msgstr "конфліктуючі або надлишкові параметри" -#: catalog/aclchk.c:1030 +#: catalog/aclchk.c:1046 #, c-format msgid "default privileges cannot be set for columns" msgstr "права за замовчуванням не можна встановити для стовпців" -#: catalog/aclchk.c:1190 +#: catalog/aclchk.c:1206 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "речення IN SCHEMA не можна використати в GRANT/REVOKE ON SCHEMAS" -#: catalog/aclchk.c:1558 catalog/catalog.c:506 catalog/objectaddress.c:1427 -#: commands/analyze.c:389 commands/copy.c:5080 commands/sequence.c:1702 -#: commands/tablecmds.c:6578 commands/tablecmds.c:6721 -#: commands/tablecmds.c:6771 commands/tablecmds.c:6845 -#: commands/tablecmds.c:6915 commands/tablecmds.c:7027 -#: commands/tablecmds.c:7121 commands/tablecmds.c:7180 -#: commands/tablecmds.c:7253 commands/tablecmds.c:7282 -#: commands/tablecmds.c:7437 commands/tablecmds.c:7519 -#: commands/tablecmds.c:7612 commands/tablecmds.c:7767 -#: commands/tablecmds.c:10972 commands/tablecmds.c:11154 -#: commands/tablecmds.c:11314 commands/tablecmds.c:12397 commands/trigger.c:876 -#: parser/analyze.c:2339 parser/parse_relation.c:713 parser/parse_target.c:1036 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3289 -#: parser/parse_utilcmd.c:3324 parser/parse_utilcmd.c:3366 utils/adt/acl.c:2870 -#: utils/adt/ruleutils.c:2535 +#: catalog/aclchk.c:1544 catalog/catalog.c:557 catalog/objectaddress.c:1522 +#: commands/analyze.c:390 commands/copy.c:741 commands/sequence.c:1701 +#: commands/tablecmds.c:6939 commands/tablecmds.c:7082 +#: commands/tablecmds.c:7132 commands/tablecmds.c:7206 +#: commands/tablecmds.c:7276 commands/tablecmds.c:7388 +#: commands/tablecmds.c:7482 commands/tablecmds.c:7541 +#: commands/tablecmds.c:7630 commands/tablecmds.c:7659 +#: commands/tablecmds.c:7814 commands/tablecmds.c:7896 +#: commands/tablecmds.c:8052 commands/tablecmds.c:8170 +#: commands/tablecmds.c:11519 commands/tablecmds.c:11701 +#: commands/tablecmds.c:11861 commands/tablecmds.c:13004 +#: commands/tablecmds.c:15565 commands/trigger.c:942 parser/analyze.c:2415 +#: parser/parse_relation.c:714 parser/parse_target.c:1064 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3421 +#: parser/parse_utilcmd.c:3456 parser/parse_utilcmd.c:3498 utils/adt/acl.c:2845 +#: utils/adt/ruleutils.c:2708 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "стовпець \"%s\" відношення \"%s\" не існує" -#: catalog/aclchk.c:1821 catalog/objectaddress.c:1267 commands/sequence.c:1140 -#: commands/tablecmds.c:236 commands/tablecmds.c:15706 utils/adt/acl.c:2060 -#: utils/adt/acl.c:2090 utils/adt/acl.c:2122 utils/adt/acl.c:2154 -#: utils/adt/acl.c:2182 utils/adt/acl.c:2212 +#: catalog/aclchk.c:1807 catalog/objectaddress.c:1362 commands/sequence.c:1139 +#: commands/tablecmds.c:249 commands/tablecmds.c:16429 utils/adt/acl.c:2053 +#: utils/adt/acl.c:2083 utils/adt/acl.c:2115 utils/adt/acl.c:2147 +#: utils/adt/acl.c:2175 utils/adt/acl.c:2205 #, c-format msgid "\"%s\" is not a sequence" msgstr "\"%s\" не є послідовністю" -#: catalog/aclchk.c:1859 +#: catalog/aclchk.c:1845 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "послідовність \"%s\" підтримує тільки права USAGE, SELECT і UPDATE" -#: catalog/aclchk.c:1876 +#: catalog/aclchk.c:1862 #, c-format msgid "invalid privilege type %s for table" msgstr "недійсний тип права %s для таблиці" -#: catalog/aclchk.c:2042 +#: catalog/aclchk.c:2028 #, c-format msgid "invalid privilege type %s for column" msgstr "недійсний тип права %s для стовпця" -#: catalog/aclchk.c:2055 +#: catalog/aclchk.c:2041 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "послідовність \"%s\" підтримує тільки право стовпця SELECT" -#: catalog/aclchk.c:2637 +#: catalog/aclchk.c:2623 #, c-format msgid "language \"%s\" is not trusted" msgstr "мова \"%s\" не є довіреною" -#: catalog/aclchk.c:2639 +#: catalog/aclchk.c:2625 #, c-format msgid "GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages." msgstr "GRANT і REVOKE не допустимі для недовірених мов, тому що тільки суперкористувачі можуть використовувати недовірені мови." -#: catalog/aclchk.c:3153 +#: catalog/aclchk.c:3139 #, c-format msgid "cannot set privileges of array types" msgstr "не можна встановити права для типів масивів" -#: catalog/aclchk.c:3154 +#: catalog/aclchk.c:3140 #, c-format msgid "Set the privileges of the element type instead." msgstr "Замість цього встановіть права для типу елементу." -#: catalog/aclchk.c:3161 catalog/objectaddress.c:1561 +#: catalog/aclchk.c:3147 catalog/objectaddress.c:1656 #, c-format msgid "\"%s\" is not a domain" msgstr "\"%s\" не є доменом" -#: catalog/aclchk.c:3281 +#: catalog/aclchk.c:3267 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "нерозпізнане право \"%s\"" -#: catalog/aclchk.c:3342 +#: catalog/aclchk.c:3328 #, c-format msgid "permission denied for aggregate %s" msgstr "немає дозволу для агрегату %s" -#: catalog/aclchk.c:3345 +#: catalog/aclchk.c:3331 #, c-format msgid "permission denied for collation %s" msgstr "немає дозволу для сортування %s" -#: catalog/aclchk.c:3348 +#: catalog/aclchk.c:3334 #, c-format msgid "permission denied for column %s" msgstr "немає дозволу для стовпця %s" -#: catalog/aclchk.c:3351 +#: catalog/aclchk.c:3337 #, c-format msgid "permission denied for conversion %s" msgstr "немає дозволу для перетворення %s" -#: catalog/aclchk.c:3354 +#: catalog/aclchk.c:3340 #, c-format msgid "permission denied for database %s" msgstr "немає доступу для бази даних %s" -#: catalog/aclchk.c:3357 +#: catalog/aclchk.c:3343 #, c-format msgid "permission denied for domain %s" msgstr "немає дозволу для домену %s" -#: catalog/aclchk.c:3360 +#: catalog/aclchk.c:3346 #, c-format msgid "permission denied for event trigger %s" msgstr "немає дозволу для тригера подій %s" -#: catalog/aclchk.c:3363 +#: catalog/aclchk.c:3349 #, c-format msgid "permission denied for extension %s" msgstr "немає дозволу для розширення %s" -#: catalog/aclchk.c:3366 +#: catalog/aclchk.c:3352 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "немає дозволу для джерела сторонніх даних %s" -#: catalog/aclchk.c:3369 +#: catalog/aclchk.c:3355 #, c-format msgid "permission denied for foreign server %s" msgstr "немає дозволу для стороннього серверу %s" -#: catalog/aclchk.c:3372 +#: catalog/aclchk.c:3358 #, c-format msgid "permission denied for foreign table %s" msgstr "немає дозволу для сторонньої таблиці %s" -#: catalog/aclchk.c:3375 +#: catalog/aclchk.c:3361 #, c-format msgid "permission denied for function %s" msgstr "немає дозволу для функції %s" -#: catalog/aclchk.c:3378 +#: catalog/aclchk.c:3364 #, c-format msgid "permission denied for index %s" msgstr "немає дозволу для індексу %s" -#: catalog/aclchk.c:3381 +#: catalog/aclchk.c:3367 #, c-format msgid "permission denied for language %s" msgstr "немає дозволу для мови %s" -#: catalog/aclchk.c:3384 +#: catalog/aclchk.c:3370 #, c-format msgid "permission denied for large object %s" msgstr "немає дозволу для великого об'єкту %s" -#: catalog/aclchk.c:3387 +#: catalog/aclchk.c:3373 #, c-format msgid "permission denied for materialized view %s" msgstr "немає дозволу для матеріалізованого подання %s" -#: catalog/aclchk.c:3390 +#: catalog/aclchk.c:3376 #, c-format msgid "permission denied for operator class %s" msgstr "немає дозволу для класу операторів %s" -#: catalog/aclchk.c:3393 +#: catalog/aclchk.c:3379 #, c-format msgid "permission denied for operator %s" msgstr "немає дозволу для оператора %s" -#: catalog/aclchk.c:3396 +#: catalog/aclchk.c:3382 #, c-format msgid "permission denied for operator family %s" msgstr "немає дозволу для сімейства операторів %s" -#: catalog/aclchk.c:3399 +#: catalog/aclchk.c:3385 #, c-format msgid "permission denied for policy %s" msgstr "немає дозволу для політики %s" -#: catalog/aclchk.c:3402 +#: catalog/aclchk.c:3388 #, c-format msgid "permission denied for procedure %s" msgstr "немає дозволу для процедури %s" -#: catalog/aclchk.c:3405 +#: catalog/aclchk.c:3391 #, c-format msgid "permission denied for publication %s" msgstr "немає дозволу для публікації %s" -#: catalog/aclchk.c:3408 +#: catalog/aclchk.c:3394 #, c-format msgid "permission denied for routine %s" msgstr "немає дозволу для підпрограми %s" -#: catalog/aclchk.c:3411 +#: catalog/aclchk.c:3397 #, c-format msgid "permission denied for schema %s" msgstr "немає дозволу для схеми %s" -#: catalog/aclchk.c:3414 commands/sequence.c:610 commands/sequence.c:844 -#: commands/sequence.c:886 commands/sequence.c:927 commands/sequence.c:1800 -#: commands/sequence.c:1864 +#: catalog/aclchk.c:3400 commands/sequence.c:610 commands/sequence.c:844 +#: commands/sequence.c:886 commands/sequence.c:927 commands/sequence.c:1799 +#: commands/sequence.c:1863 #, c-format msgid "permission denied for sequence %s" msgstr "немає дозволу для послідовності %s" -#: catalog/aclchk.c:3417 +#: catalog/aclchk.c:3403 #, c-format msgid "permission denied for statistics object %s" msgstr "немає дозволу для об'єкту статистики %s" -#: catalog/aclchk.c:3420 +#: catalog/aclchk.c:3406 #, c-format msgid "permission denied for subscription %s" msgstr "немає дозволу для підписки %s" -#: catalog/aclchk.c:3423 +#: catalog/aclchk.c:3409 #, c-format msgid "permission denied for table %s" msgstr "немає дозволу для таблиці %s" -#: catalog/aclchk.c:3426 +#: catalog/aclchk.c:3412 #, c-format msgid "permission denied for tablespace %s" msgstr "немає дозволу для табличного простору %s" -#: catalog/aclchk.c:3429 +#: catalog/aclchk.c:3415 #, c-format msgid "permission denied for text search configuration %s" msgstr "немає дозволу для конфігурації текстового пошуку %s" -#: catalog/aclchk.c:3432 +#: catalog/aclchk.c:3418 #, c-format msgid "permission denied for text search dictionary %s" msgstr "немає дозволу для словника текстового пошуку %s" -#: catalog/aclchk.c:3435 +#: catalog/aclchk.c:3421 #, c-format msgid "permission denied for type %s" msgstr "немає дозволу для типу %s" -#: catalog/aclchk.c:3438 +#: catalog/aclchk.c:3424 #, c-format msgid "permission denied for view %s" msgstr "немає дозволу для подання %s" -#: catalog/aclchk.c:3473 +#: catalog/aclchk.c:3459 #, c-format msgid "must be owner of aggregate %s" msgstr "треба бути власником агрегату %s" -#: catalog/aclchk.c:3476 +#: catalog/aclchk.c:3462 #, c-format msgid "must be owner of collation %s" msgstr "треба бути власником правил сортування %s" -#: catalog/aclchk.c:3479 +#: catalog/aclchk.c:3465 #, c-format msgid "must be owner of conversion %s" msgstr "треба бути власником перетворення %s" -#: catalog/aclchk.c:3482 +#: catalog/aclchk.c:3468 #, c-format msgid "must be owner of database %s" msgstr "треба бути власником бази даних %s" -#: catalog/aclchk.c:3485 +#: catalog/aclchk.c:3471 #, c-format msgid "must be owner of domain %s" msgstr "треба бути власником домену %s" -#: catalog/aclchk.c:3488 +#: catalog/aclchk.c:3474 #, c-format msgid "must be owner of event trigger %s" msgstr "треба бути власником тригеру подій %s" -#: catalog/aclchk.c:3491 +#: catalog/aclchk.c:3477 #, c-format msgid "must be owner of extension %s" msgstr "треба бути власником розширення %s" -#: catalog/aclchk.c:3494 +#: catalog/aclchk.c:3480 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "треба бути власником джерела сторонніх даних %s" -#: catalog/aclchk.c:3497 +#: catalog/aclchk.c:3483 #, c-format msgid "must be owner of foreign server %s" msgstr "треба бути власником стороннього серверу %s" -#: catalog/aclchk.c:3500 +#: catalog/aclchk.c:3486 #, c-format msgid "must be owner of foreign table %s" msgstr "треба бути власником сторонньої таблиці %s" -#: catalog/aclchk.c:3503 +#: catalog/aclchk.c:3489 #, c-format msgid "must be owner of function %s" msgstr "треба бути власником функції %s" -#: catalog/aclchk.c:3506 +#: catalog/aclchk.c:3492 #, c-format msgid "must be owner of index %s" msgstr "треба бути власником індексу %s" -#: catalog/aclchk.c:3509 +#: catalog/aclchk.c:3495 #, c-format msgid "must be owner of language %s" msgstr "треба бути власником мови %s" -#: catalog/aclchk.c:3512 +#: catalog/aclchk.c:3498 #, c-format msgid "must be owner of large object %s" msgstr "треба бути власником великого об'єкту %s" -#: catalog/aclchk.c:3515 +#: catalog/aclchk.c:3501 #, c-format msgid "must be owner of materialized view %s" msgstr "треба бути власником матеріалізованого подання %s" -#: catalog/aclchk.c:3518 +#: catalog/aclchk.c:3504 #, c-format msgid "must be owner of operator class %s" msgstr "треба бути власником класу операторів %s" -#: catalog/aclchk.c:3521 +#: catalog/aclchk.c:3507 #, c-format msgid "must be owner of operator %s" msgstr "треба бути власником оператора %s" -#: catalog/aclchk.c:3524 +#: catalog/aclchk.c:3510 #, c-format msgid "must be owner of operator family %s" msgstr "треба бути власником сімейства операторів %s" -#: catalog/aclchk.c:3527 +#: catalog/aclchk.c:3513 #, c-format msgid "must be owner of procedure %s" msgstr "треба бути власником процедури %s" -#: catalog/aclchk.c:3530 +#: catalog/aclchk.c:3516 #, c-format msgid "must be owner of publication %s" msgstr "треба бути власником публікації %s" -#: catalog/aclchk.c:3533 +#: catalog/aclchk.c:3519 #, c-format msgid "must be owner of routine %s" msgstr "треба бути власником підпрограми %s" -#: catalog/aclchk.c:3536 +#: catalog/aclchk.c:3522 #, c-format msgid "must be owner of sequence %s" msgstr "треба бути власником послідовності %s" -#: catalog/aclchk.c:3539 +#: catalog/aclchk.c:3525 #, c-format msgid "must be owner of subscription %s" msgstr "треба бути власником підписки %s" -#: catalog/aclchk.c:3542 +#: catalog/aclchk.c:3528 #, c-format msgid "must be owner of table %s" msgstr "треба бути власником таблиці %s" -#: catalog/aclchk.c:3545 +#: catalog/aclchk.c:3531 #, c-format msgid "must be owner of type %s" msgstr "треба бути власником типу %s" -#: catalog/aclchk.c:3548 +#: catalog/aclchk.c:3534 #, c-format msgid "must be owner of view %s" msgstr "треба бути власником подання %s" -#: catalog/aclchk.c:3551 +#: catalog/aclchk.c:3537 #, c-format msgid "must be owner of schema %s" msgstr "треба бути власником схеми %s" -#: catalog/aclchk.c:3554 +#: catalog/aclchk.c:3540 #, c-format msgid "must be owner of statistics object %s" msgstr "треба бути власником об'єкту статистики %s" -#: catalog/aclchk.c:3557 +#: catalog/aclchk.c:3543 #, c-format msgid "must be owner of tablespace %s" msgstr "треба бути власником табличного простору %s" -#: catalog/aclchk.c:3560 +#: catalog/aclchk.c:3546 #, c-format msgid "must be owner of text search configuration %s" msgstr "треба бути власником конфігурації текстового пошуку %s" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:3549 #, c-format msgid "must be owner of text search dictionary %s" msgstr "треба бути власником словника текстового пошуку %s" -#: catalog/aclchk.c:3577 +#: catalog/aclchk.c:3563 #, c-format msgid "must be owner of relation %s" msgstr "треба бути власником відношення %s" -#: catalog/aclchk.c:3621 +#: catalog/aclchk.c:3607 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "немає дозволу для стовпця \"%s\" відношення \"%s\"" -#: catalog/aclchk.c:3742 catalog/aclchk.c:3750 +#: catalog/aclchk.c:3750 catalog/aclchk.c:3769 #, c-format msgid "attribute %d of relation with OID %u does not exist" msgstr "атрибут %d відношення з OID %u не існує" -#: catalog/aclchk.c:3823 catalog/aclchk.c:4733 +#: catalog/aclchk.c:3864 catalog/aclchk.c:4836 #, c-format msgid "relation with OID %u does not exist" msgstr "відношення з OID %u не існує" -#: catalog/aclchk.c:3913 catalog/aclchk.c:5151 +#: catalog/aclchk.c:3977 catalog/aclchk.c:5254 #, c-format msgid "database with OID %u does not exist" msgstr "база даних з OID %u не існує" -#: catalog/aclchk.c:3967 catalog/aclchk.c:4811 tcop/fastpath.c:221 -#: utils/fmgr/fmgr.c:2055 +#: catalog/aclchk.c:4031 catalog/aclchk.c:4914 tcop/fastpath.c:141 +#: utils/fmgr/fmgr.c:2051 #, c-format msgid "function with OID %u does not exist" msgstr "функція з OID %u не існує" -#: catalog/aclchk.c:4021 catalog/aclchk.c:4837 +#: catalog/aclchk.c:4085 catalog/aclchk.c:4940 #, c-format msgid "language with OID %u does not exist" msgstr "мова з OID %u не існує" -#: catalog/aclchk.c:4185 catalog/aclchk.c:4909 +#: catalog/aclchk.c:4249 catalog/aclchk.c:5012 commands/collationcmds.c:517 #, c-format msgid "schema with OID %u does not exist" msgstr "схема з OID %u не існує" -#: catalog/aclchk.c:4239 catalog/aclchk.c:4936 utils/adt/genfile.c:686 +#: catalog/aclchk.c:4313 catalog/aclchk.c:5039 utils/adt/genfile.c:688 #, c-format msgid "tablespace with OID %u does not exist" msgstr "табличний простір з OID %u не існує" -#: catalog/aclchk.c:4298 catalog/aclchk.c:5070 commands/foreigncmds.c:325 +#: catalog/aclchk.c:4372 catalog/aclchk.c:5173 commands/foreigncmds.c:325 #, c-format msgid "foreign-data wrapper with OID %u does not exist" msgstr "джерело сторонніх даних з OID %u не існує" -#: catalog/aclchk.c:4360 catalog/aclchk.c:5097 commands/foreigncmds.c:462 +#: catalog/aclchk.c:4434 catalog/aclchk.c:5200 commands/foreigncmds.c:462 #, c-format msgid "foreign server with OID %u does not exist" msgstr "стороннього серверу з OID %u не усніє" -#: catalog/aclchk.c:4420 catalog/aclchk.c:4759 utils/cache/typcache.c:378 -#: utils/cache/typcache.c:432 +#: catalog/aclchk.c:4494 catalog/aclchk.c:4862 utils/cache/typcache.c:384 +#: utils/cache/typcache.c:439 #, c-format msgid "type with OID %u does not exist" msgstr "тип з OID %u не існує" -#: catalog/aclchk.c:4785 +#: catalog/aclchk.c:4888 #, c-format msgid "operator with OID %u does not exist" msgstr "оператора з OID %u не існує" -#: catalog/aclchk.c:4962 +#: catalog/aclchk.c:5065 #, c-format msgid "operator class with OID %u does not exist" msgstr "класу операторів з OID %u не існує" -#: catalog/aclchk.c:4989 +#: catalog/aclchk.c:5092 #, c-format msgid "operator family with OID %u does not exist" msgstr "сімейства операторів з OID %u не існує" -#: catalog/aclchk.c:5016 +#: catalog/aclchk.c:5119 #, c-format msgid "text search dictionary with OID %u does not exist" msgstr "словник текстового пошуку з OID %u не існує" -#: catalog/aclchk.c:5043 +#: catalog/aclchk.c:5146 #, c-format msgid "text search configuration with OID %u does not exist" msgstr "конфігурація текстового пошуку %u з OID не існує" -#: catalog/aclchk.c:5124 commands/event_trigger.c:475 +#: catalog/aclchk.c:5227 commands/event_trigger.c:453 #, c-format msgid "event trigger with OID %u does not exist" msgstr "тригер подій %u з OID не існує" -#: catalog/aclchk.c:5177 commands/collationcmds.c:367 +#: catalog/aclchk.c:5280 commands/collationcmds.c:368 #, c-format msgid "collation with OID %u does not exist" msgstr "порядку сортування %u з OID не існує" -#: catalog/aclchk.c:5203 +#: catalog/aclchk.c:5306 #, c-format msgid "conversion with OID %u does not exist" msgstr "перетворення %u з OID не існує" -#: catalog/aclchk.c:5244 +#: catalog/aclchk.c:5347 #, c-format msgid "extension with OID %u does not exist" msgstr "розширення %u з OID не існує" -#: catalog/aclchk.c:5271 commands/publicationcmds.c:794 +#: catalog/aclchk.c:5374 commands/publicationcmds.c:771 #, c-format msgid "publication with OID %u does not exist" msgstr "публікації %u з OID не існує" -#: catalog/aclchk.c:5297 commands/subscriptioncmds.c:1112 +#: catalog/aclchk.c:5400 commands/subscriptioncmds.c:1464 #, c-format msgid "subscription with OID %u does not exist" msgstr "підписки %u з OID не існує" -#: catalog/aclchk.c:5323 +#: catalog/aclchk.c:5426 #, c-format msgid "statistics object with OID %u does not exist" msgstr "об'єкту статистики %u з OID не існує" -#: catalog/catalog.c:485 +#: catalog/catalog.c:378 +#, c-format +msgid "still searching for an unused OID in relation \"%s\"" +msgstr "все ще шукаю невикористаний OID у відношенні \"%s\"" + +#: catalog/catalog.c:380 +#, c-format +msgid "OID candidates have been checked %llu time, but no unused OID has been found yet." +msgid_plural "OID candidates have been checked %llu times, but no unused OID has been found yet." +msgstr[0] "OID кандидати буле перевірені %llu раз, але невикористаного OID все ще не знайдено." +msgstr[1] "OID кандидати буле перевірені %llu рази, але невикористаного OID все ще не знайдено." +msgstr[2] "OID кандидати буле перевірені %llu разів, але невикористаного OID все ще не знайдено." +msgstr[3] "OID кандидати буле перевірені %llu разів, але невикористаного OID все ще не знайдено." + +#: catalog/catalog.c:405 +#, c-format +msgid "new OID has been assigned in relation \"%s\" after %llu retry" +msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" +msgstr[0] "новий OID було призначено у відношенні \"%s\" після %llu повторної спроби" +msgstr[1] "новий OID було призначено у відношенні \"%s\" після %llu повторних спроб" +msgstr[2] "новий OID було призначено у відношенні \"%s\" після %llu повторних спроб" +msgstr[3] "новий OID було призначено у відношенні \"%s\" після %llu повторних спроб" + +#: catalog/catalog.c:536 #, c-format msgid "must be superuser to call pg_nextoid()" msgstr "для виклику pg_nextoid() потрібно бути суперкористувачем" -#: catalog/catalog.c:493 +#: catalog/catalog.c:544 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() можна використовувати лише для системних каталогів" -#: catalog/catalog.c:498 parser/parse_utilcmd.c:2191 +#: catalog/catalog.c:549 parser/parse_utilcmd.c:2266 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "індекс \"%s\" не належить таблиці \"%s\"" -#: catalog/catalog.c:515 +#: catalog/catalog.c:566 #, c-format msgid "column \"%s\" is not of type oid" msgstr "стовпець \"%s\" повинен мати тип oid" -#: catalog/catalog.c:522 +#: catalog/catalog.c:573 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "індекс \"%s\" не є індексом для стовпця \"%s\"" -#: catalog/dependency.c:823 catalog/dependency.c:1061 +#: catalog/dependency.c:821 catalog/dependency.c:1060 #, c-format msgid "cannot drop %s because %s requires it" msgstr "не вдалося видалити %s, оскільки %s потребує його" -#: catalog/dependency.c:825 catalog/dependency.c:1063 +#: catalog/dependency.c:823 catalog/dependency.c:1062 #, c-format msgid "You can drop %s instead." msgstr "Ви можете видалити %s замість цього." -#: catalog/dependency.c:933 catalog/pg_shdepend.c:640 +#: catalog/dependency.c:931 catalog/pg_shdepend.c:696 #, c-format msgid "cannot drop %s because it is required by the database system" msgstr "не вдалося видалити %s, оскільки він потрібний системі бази даних" -#: catalog/dependency.c:1129 -#, c-format -msgid "drop auto-cascades to %s" -msgstr "видалення автоматично поширюється (auto-cascades) на об'єкт %s" - -#: catalog/dependency.c:1141 catalog/dependency.c:1150 +#: catalog/dependency.c:1135 catalog/dependency.c:1144 #, c-format msgid "%s depends on %s" msgstr "%s залежить від %s" -#: catalog/dependency.c:1162 catalog/dependency.c:1171 +#: catalog/dependency.c:1156 catalog/dependency.c:1165 #, c-format msgid "drop cascades to %s" msgstr "видалення поширюється (cascades) на об'єкт %s" -#: catalog/dependency.c:1179 catalog/pg_shdepend.c:769 +#: catalog/dependency.c:1173 catalog/pg_shdepend.c:825 #, c-format msgid "\n" "and %d other object (see server log for list)" @@ -4005,37 +4171,37 @@ msgstr[2] "\n" msgstr[3] "\n" "і ще %d інші об'єкти (див. список у протоколі сервера)" -#: catalog/dependency.c:1191 +#: catalog/dependency.c:1185 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "неможливо видалити %s, тому що від нього залежать інші об'єкти" -#: catalog/dependency.c:1193 catalog/dependency.c:1194 -#: catalog/dependency.c:1200 catalog/dependency.c:1201 -#: catalog/dependency.c:1212 catalog/dependency.c:1213 -#: commands/tablecmds.c:1249 commands/tablecmds.c:13016 commands/user.c:1093 -#: commands/view.c:495 libpq/auth.c:334 replication/syncrep.c:1032 -#: storage/lmgr/deadlock.c:1154 storage/lmgr/proc.c:1350 utils/adt/acl.c:5329 -#: utils/adt/jsonfuncs.c:614 utils/adt/jsonfuncs.c:620 utils/misc/guc.c:6771 -#: utils/misc/guc.c:6807 utils/misc/guc.c:6877 utils/misc/guc.c:10947 -#: utils/misc/guc.c:10981 utils/misc/guc.c:11015 utils/misc/guc.c:11049 -#: utils/misc/guc.c:11084 +#: catalog/dependency.c:1187 catalog/dependency.c:1188 +#: catalog/dependency.c:1194 catalog/dependency.c:1195 +#: catalog/dependency.c:1206 catalog/dependency.c:1207 +#: commands/tablecmds.c:1297 commands/tablecmds.c:13622 +#: commands/tablespace.c:481 commands/user.c:1095 commands/view.c:492 +#: libpq/auth.c:338 replication/syncrep.c:1043 storage/lmgr/deadlock.c:1152 +#: storage/lmgr/proc.c:1433 utils/adt/acl.c:5250 utils/adt/jsonfuncs.c:618 +#: utils/adt/jsonfuncs.c:624 utils/misc/guc.c:7115 utils/misc/guc.c:7151 +#: utils/misc/guc.c:7221 utils/misc/guc.c:11401 utils/misc/guc.c:11435 +#: utils/misc/guc.c:11469 utils/misc/guc.c:11512 utils/misc/guc.c:11554 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1195 catalog/dependency.c:1202 +#: catalog/dependency.c:1189 catalog/dependency.c:1196 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "Використайте DROP ... CASCADE для видалення залежних об'єктів також." -#: catalog/dependency.c:1199 +#: catalog/dependency.c:1193 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "не можна видалити бажаний(-і) об'єкт(-и) тому, що інші об'єкти залежні від нього(них)" #. translator: %d always has a value larger than 1 -#: catalog/dependency.c:1208 +#: catalog/dependency.c:1202 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" @@ -4044,639 +4210,637 @@ msgstr[1] "видалення поширюється (cascades) на ще %d і msgstr[2] "видалення поширюється (cascades) на ще %d інших об'єктів" msgstr[3] "видалення поширюється (cascades) на ще %d інших об'єктів" -#: catalog/dependency.c:1875 +#: catalog/dependency.c:1863 #, c-format msgid "constant of the type %s cannot be used here" msgstr "константа типу %s не може бути використана тут" -#: catalog/heap.c:330 +#: catalog/heap.c:332 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "немає дозволу для створення \"%s.%s\"" -#: catalog/heap.c:332 +#: catalog/heap.c:334 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Змінення системного каталогу наразі заборонено." -#: catalog/heap.c:500 commands/tablecmds.c:2145 commands/tablecmds.c:2745 -#: commands/tablecmds.c:6175 +#: catalog/heap.c:511 commands/tablecmds.c:2290 commands/tablecmds.c:2927 +#: commands/tablecmds.c:6530 #, c-format msgid "tables can have at most %d columns" msgstr "таблиці можуть містити максимум %d стовпців" -#: catalog/heap.c:518 commands/tablecmds.c:6468 +#: catalog/heap.c:529 commands/tablecmds.c:6829 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "ім'я стовпця \"%s\" конфліктує з системним іменем стовпця" -#: catalog/heap.c:534 +#: catalog/heap.c:545 #, c-format msgid "column name \"%s\" specified more than once" msgstr "ім'я стовпця \"%s\" вказано кілька разів" #. translator: first %s is an integer not a name -#: catalog/heap.c:609 +#: catalog/heap.c:620 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "стовпець ключа секціонування %s має псевдотип %s" -#: catalog/heap.c:614 +#: catalog/heap.c:625 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "стовпець \"%s\" має псевдо-тип %s" -#: catalog/heap.c:645 +#: catalog/heap.c:656 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "складений тип %s не може містити сам себе" #. translator: first %s is an integer not a name -#: catalog/heap.c:700 +#: catalog/heap.c:711 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "для стовпця ключа секціонування \"%s\" з сортируючим типом %s не вдалося отримати параметри сортування" -#: catalog/heap.c:706 commands/createas.c:203 commands/createas.c:486 +#: catalog/heap.c:717 commands/createas.c:203 commands/createas.c:500 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "для стовпця \"%s\" із сортувальним типом %s не вдалося отримати параметри сортування" -#: catalog/heap.c:1155 catalog/index.c:865 commands/tablecmds.c:3520 +#: catalog/heap.c:1199 catalog/index.c:870 commands/createas.c:405 +#: commands/tablecmds.c:3808 #, c-format msgid "relation \"%s\" already exists" msgstr "відношення \"%s\" вже існує" -#: catalog/heap.c:1171 catalog/pg_type.c:428 catalog/pg_type.c:775 -#: commands/typecmds.c:238 commands/typecmds.c:250 commands/typecmds.c:719 -#: commands/typecmds.c:1125 commands/typecmds.c:1337 commands/typecmds.c:2124 +#: catalog/heap.c:1215 catalog/pg_type.c:435 catalog/pg_type.c:773 +#: catalog/pg_type.c:920 commands/typecmds.c:249 commands/typecmds.c:261 +#: commands/typecmds.c:757 commands/typecmds.c:1172 commands/typecmds.c:1398 +#: commands/typecmds.c:1590 commands/typecmds.c:2563 #, c-format msgid "type \"%s\" already exists" msgstr "тип \"%s\" вже існує" -#: catalog/heap.c:1172 +#: catalog/heap.c:1216 #, c-format msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." msgstr "З відношенням вже пов'язаний тип з таким самим іменем, тому виберіть ім'я, яке не буде конфліктувати з типами, що існують." -#: catalog/heap.c:1201 +#: catalog/heap.c:1245 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "значення OID в pg_class не задано в режимі двійкового оновлення" -#: catalog/heap.c:2400 +#: catalog/heap.c:2458 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "не можна додати обмеження NO INHERIT до секціонованої таблиці \"%s\"" -#: catalog/heap.c:2670 +#: catalog/heap.c:2730 #, c-format msgid "check constraint \"%s\" already exists" msgstr "обмеження перевірки \"%s\" вже інсує" -#: catalog/heap.c:2840 catalog/index.c:879 catalog/pg_constraint.c:668 -#: commands/tablecmds.c:8117 +#: catalog/heap.c:2900 catalog/index.c:884 catalog/pg_constraint.c:670 +#: commands/tablecmds.c:8544 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "обмеження \"%s\" відношення \"%s\" вже існує" -#: catalog/heap.c:2847 +#: catalog/heap.c:2907 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "обмеження \"%s\" конфліктує з неуспадкованим обмеженням відношення \"%s\"" -#: catalog/heap.c:2858 +#: catalog/heap.c:2918 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "обмеження \"%s\" конфліктує з успадкованим обмеженням відношення \"%s\"" -#: catalog/heap.c:2868 +#: catalog/heap.c:2928 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "обмеження \"%s\" конфліктує з обмеженням NOT VALID в відношенні \"%s\"" -#: catalog/heap.c:2873 +#: catalog/heap.c:2933 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "злиття обмеження \"%s\" з успадкованим визначенням" -#: catalog/heap.c:2975 +#: catalog/heap.c:3038 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "в виразі створення стовпця не можна використовувати згенерований стовпець \"%s\" " -#: catalog/heap.c:2977 +#: catalog/heap.c:3040 #, c-format msgid "A generated column cannot reference another generated column." msgstr "Згенерований стовпець не може посилатися на інший згенерований стовпець." -#: catalog/heap.c:3029 +#: catalog/heap.c:3046 +#, c-format +msgid "cannot use whole-row variable in column generation expression" +msgstr "у виразі створення стовпців не можна використовувати змінну усього рядка" + +#: catalog/heap.c:3047 +#, c-format +msgid "This would cause the generated column to depend on its own value." +msgstr "Це призведе до того, що згенерований стовпець буде залежати від власного значення." + +#: catalog/heap.c:3100 #, c-format msgid "generation expression is not immutable" msgstr "вираз генерації не є незмінним" -#: catalog/heap.c:3057 rewrite/rewriteHandler.c:1192 +#: catalog/heap.c:3128 rewrite/rewriteHandler.c:1245 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "стовпець \"%s\" має тип %s, але тип виразу за замовчуванням %s" -#: catalog/heap.c:3062 commands/prepare.c:367 parser/parse_node.c:412 -#: parser/parse_target.c:589 parser/parse_target.c:869 -#: parser/parse_target.c:879 rewrite/rewriteHandler.c:1197 +#: catalog/heap.c:3133 commands/prepare.c:368 parser/analyze.c:2639 +#: parser/parse_target.c:595 parser/parse_target.c:883 +#: parser/parse_target.c:893 rewrite/rewriteHandler.c:1250 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Потрібно буде переписати або привести вираз." -#: catalog/heap.c:3109 +#: catalog/heap.c:3180 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "в обмеженні-перевірці можна посилатися лише на таблицю \"%s\"" -#: catalog/heap.c:3366 +#: catalog/heap.c:3478 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "непідтримуване поєднання зовнішнього ключа з ON COMMIT" -#: catalog/heap.c:3367 +#: catalog/heap.c:3479 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "Таблиця \"%s\" посилається на \"%s\", але вони не мають той же параметр ON COMMIT." -#: catalog/heap.c:3372 +#: catalog/heap.c:3484 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "скоротити таблицю, на яку посилається зовнішній ключ, не можливо" -#: catalog/heap.c:3373 +#: catalog/heap.c:3485 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Таблиця \"%s\" посилається на \"%s\"." -#: catalog/heap.c:3375 +#: catalog/heap.c:3487 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Скоротіть таблицю \"%s\" паралельно або використайте TRUNCATE ... CASCADE." -#: catalog/index.c:219 parser/parse_utilcmd.c:2097 +#: catalog/index.c:221 parser/parse_utilcmd.c:2172 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "таблиця \"%s\" не може містити кілька первинних ключів" -#: catalog/index.c:237 +#: catalog/index.c:239 #, c-format msgid "primary keys cannot be expressions" msgstr "первинні ключі не можуть бути виразами" -#: catalog/index.c:254 +#: catalog/index.c:256 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "стовпець первинного ключа \"%s\" не позначений як NOT NULL" -#: catalog/index.c:764 catalog/index.c:1843 +#: catalog/index.c:769 catalog/index.c:1905 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "користувацькі індекси в таблицях системного каталогу не підтримуються" -#: catalog/index.c:804 +#: catalog/index.c:809 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "недетерміновані правила сортування не підтримуються для класу операторів \"%s\"" -#: catalog/index.c:819 +#: catalog/index.c:824 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "паралельне створення індексу в таблицях системного каталогу не підтримується" -#: catalog/index.c:828 catalog/index.c:1281 +#: catalog/index.c:833 catalog/index.c:1284 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "парарельне створення індексу для обмежень-виключень не підтримується" -#: catalog/index.c:837 +#: catalog/index.c:842 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "не можливо створити спільні індекси після initdb" -#: catalog/index.c:857 commands/createas.c:252 commands/sequence.c:154 -#: parser/parse_utilcmd.c:210 +#: catalog/index.c:862 commands/createas.c:411 commands/sequence.c:154 +#: parser/parse_utilcmd.c:201 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "ввідношення \"%s\" вже існує, пропускаємо" -#: catalog/index.c:907 +#: catalog/index.c:912 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "значення OID індекса в pg_class не встановлено в режимі двійкового оновлення" -#: catalog/index.c:2128 +#: catalog/index.c:2191 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY повинен бути першою дією в транзакції" -#: catalog/index.c:2859 -#, c-format -msgid "building index \"%s\" on table \"%s\" serially" -msgstr "створення індексу \"%s\" в таблиці \"%s\" у непаралельному режимі (serially)" - -#: catalog/index.c:2864 -#, c-format -msgid "building index \"%s\" on table \"%s\" with request for %d parallel worker" -msgid_plural "building index \"%s\" on table \"%s\" with request for %d parallel workers" -msgstr[0] "створення індексу \"%s\" в таблиці \"%s\" з розрахунком на %d паралельного виконавця" -msgstr[1] "створення індексу \"%s\" в таблиці \"%s\" з розрахунком на %d паралельних виконавців" -msgstr[2] "створення індексу \"%s\" в таблиці \"%s\" з розрахунком на %d паралельних виконавців" -msgstr[3] "створення індексу \"%s\" в таблиці \"%s\" з розрахунком на %d паралельних виконавців" - -#: catalog/index.c:3492 +#: catalog/index.c:3576 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "повторно індексувати тимчасові таблиці інших сеансів не можна" -#: catalog/index.c:3503 +#: catalog/index.c:3587 commands/indexcmds.c:3426 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "переіндексувати неприпустимий індекс в таблиці TOAST не можна" -#: catalog/index.c:3625 +#: catalog/index.c:3603 commands/indexcmds.c:3306 commands/indexcmds.c:3450 +#: commands/tablecmds.c:3247 #, c-format -msgid "index \"%s\" was reindexed" -msgstr "індекс \"%s\" був перебудований" +msgid "cannot move system relation \"%s\"" +msgstr "перемістити системне відношення \"%s\" не можна" -#: catalog/index.c:3701 commands/indexcmds.c:3017 +#: catalog/index.c:3747 #, c-format -msgid "REINDEX of partitioned tables is not yet implemented, skipping \"%s\"" -msgstr "REINDEX для секціонованих таблиць ще не реалізовано, пропускається \"%s\"" +msgid "index \"%s\" was reindexed" +msgstr "індекс \"%s\" був перебудований" -#: catalog/index.c:3756 +#: catalog/index.c:3878 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "переіндексувати неприпустимий індекс \"%s.%s\" в таблиці TOAST не можна, пропускається" -#: catalog/namespace.c:257 catalog/namespace.c:461 catalog/namespace.c:553 -#: commands/trigger.c:5043 +#: catalog/namespace.c:258 catalog/namespace.c:462 catalog/namespace.c:554 +#: commands/trigger.c:5152 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "cross-database посилання не реалізовані: \"%s.%s.%s\"" -#: catalog/namespace.c:314 +#: catalog/namespace.c:315 #, c-format msgid "temporary tables cannot specify a schema name" msgstr "для тимчасових таблиць ім'я схеми не вказується" -#: catalog/namespace.c:395 +#: catalog/namespace.c:396 #, c-format msgid "could not obtain lock on relation \"%s.%s\"" msgstr "не вдалося отримати блокування зв'язку \"%s.%s\"" -#: catalog/namespace.c:400 commands/lockcmds.c:142 commands/lockcmds.c:227 +#: catalog/namespace.c:401 commands/lockcmds.c:143 commands/lockcmds.c:228 #, c-format msgid "could not obtain lock on relation \"%s\"" msgstr "не вдалося отримати блокування зв'язку \"%s\"" -#: catalog/namespace.c:428 parser/parse_relation.c:1357 +#: catalog/namespace.c:429 parser/parse_relation.c:1362 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "відношення \"%s.%s\" не існує" -#: catalog/namespace.c:433 parser/parse_relation.c:1370 -#: parser/parse_relation.c:1378 +#: catalog/namespace.c:434 parser/parse_relation.c:1375 +#: parser/parse_relation.c:1383 #, c-format msgid "relation \"%s\" does not exist" msgstr "відношення \"%s\" не існує" -#: catalog/namespace.c:499 catalog/namespace.c:3030 commands/extension.c:1519 -#: commands/extension.c:1525 +#: catalog/namespace.c:500 catalog/namespace.c:3075 commands/extension.c:1520 +#: commands/extension.c:1526 #, c-format msgid "no schema has been selected to create in" msgstr "не вибрано схему для створення об'єктів" -#: catalog/namespace.c:651 catalog/namespace.c:664 +#: catalog/namespace.c:652 catalog/namespace.c:665 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "неможливо створити відношення в тимчасових схемах з інших сеансів" -#: catalog/namespace.c:655 +#: catalog/namespace.c:656 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "неможливо створити тимчасове відношення в не тимчасовій схемі" -#: catalog/namespace.c:670 +#: catalog/namespace.c:671 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "в тимчасових схемах можуть бути створені тільки тимчасові відношення" -#: catalog/namespace.c:2222 +#: catalog/namespace.c:2267 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "об'єкт статистики \"%s\" не існує" -#: catalog/namespace.c:2345 +#: catalog/namespace.c:2390 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "парсер текстового пошуку \"%s\" не існує" -#: catalog/namespace.c:2471 +#: catalog/namespace.c:2516 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "словник текстового пошуку \"%s\" не існує" -#: catalog/namespace.c:2598 +#: catalog/namespace.c:2643 #, c-format msgid "text search template \"%s\" does not exist" msgstr "шаблон текстового пошуку \"%s\" не існує" -#: catalog/namespace.c:2724 commands/tsearchcmds.c:1194 -#: utils/cache/ts_cache.c:617 +#: catalog/namespace.c:2769 commands/tsearchcmds.c:1121 +#: utils/cache/ts_cache.c:613 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "конфігурація текстового пошуку \"%s\" не існує" -#: catalog/namespace.c:2837 parser/parse_expr.c:872 parser/parse_target.c:1228 +#: catalog/namespace.c:2882 parser/parse_expr.c:810 parser/parse_target.c:1256 #, c-format msgid "cross-database references are not implemented: %s" msgstr "міжбазові посилання не реалізовані: %s" -#: catalog/namespace.c:2843 parser/parse_expr.c:879 parser/parse_target.c:1235 -#: gram.y:14981 gram.y:16435 +#: catalog/namespace.c:2888 parser/parse_expr.c:817 parser/parse_target.c:1263 +#: gram.y:15102 gram.y:17061 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неправильне повне ім'я (забагато компонентів): %s" -#: catalog/namespace.c:2973 +#: catalog/namespace.c:3018 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "не можна переміщати об'єкти в або з тимчасових схем" -#: catalog/namespace.c:2979 +#: catalog/namespace.c:3024 #, c-format msgid "cannot move objects into or out of TOAST schema" msgstr "не можна переміщати об'єкти в або з схем TOAST" -#: catalog/namespace.c:3052 commands/schemacmds.c:256 commands/schemacmds.c:336 -#: commands/tablecmds.c:1194 +#: catalog/namespace.c:3097 commands/schemacmds.c:234 commands/schemacmds.c:314 +#: commands/tablecmds.c:1242 #, c-format msgid "schema \"%s\" does not exist" msgstr "схема \"%s\" не існує" -#: catalog/namespace.c:3083 +#: catalog/namespace.c:3128 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "неправильне ім'я зв'язку (забагато компонентів): %s" -#: catalog/namespace.c:3646 +#: catalog/namespace.c:3691 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "правило сортування \"%s\" для кодування \"%s\" не існує" -#: catalog/namespace.c:3701 +#: catalog/namespace.c:3746 #, c-format msgid "conversion \"%s\" does not exist" msgstr "перетворення\"%s\" не існує" -#: catalog/namespace.c:3965 +#: catalog/namespace.c:4010 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "немає дозволу для створення тимчасових таблиць в базі даних \"%s\"" -#: catalog/namespace.c:3981 +#: catalog/namespace.c:4026 #, c-format msgid "cannot create temporary tables during recovery" msgstr "не можна створити тимчасові таблиці під час відновлення" -#: catalog/namespace.c:3987 +#: catalog/namespace.c:4032 #, c-format msgid "cannot create temporary tables during a parallel operation" msgstr "не можна створити тимчасові таблиці під час паралельної операції" -#: catalog/namespace.c:4286 commands/tablespace.c:1205 commands/variable.c:64 -#: utils/misc/guc.c:11116 utils/misc/guc.c:11194 +#: catalog/namespace.c:4331 commands/tablespace.c:1217 commands/variable.c:64 +#: utils/misc/guc.c:11586 utils/misc/guc.c:11664 #, c-format msgid "List syntax is invalid." msgstr "Помилка синтаксису у списку." -#: catalog/objectaddress.c:1275 catalog/pg_publication.c:57 -#: commands/policy.c:95 commands/policy.c:395 commands/policy.c:485 -#: commands/tablecmds.c:230 commands/tablecmds.c:272 commands/tablecmds.c:1989 -#: commands/tablecmds.c:5626 commands/tablecmds.c:11089 +#: catalog/objectaddress.c:1370 catalog/pg_publication.c:57 +#: commands/policy.c:96 commands/policy.c:376 commands/tablecmds.c:243 +#: commands/tablecmds.c:285 commands/tablecmds.c:2134 commands/tablecmds.c:5970 +#: commands/tablecmds.c:11636 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" не є таблицею" -#: catalog/objectaddress.c:1282 commands/tablecmds.c:242 -#: commands/tablecmds.c:5656 commands/tablecmds.c:15711 commands/view.c:119 +#: catalog/objectaddress.c:1377 commands/tablecmds.c:255 +#: commands/tablecmds.c:6009 commands/tablecmds.c:16434 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" не є поданням" -#: catalog/objectaddress.c:1289 commands/matview.c:175 commands/tablecmds.c:248 -#: commands/tablecmds.c:15716 +#: catalog/objectaddress.c:1384 commands/matview.c:175 commands/tablecmds.c:261 +#: commands/tablecmds.c:16439 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" не є матеріалізованим поданням" -#: catalog/objectaddress.c:1296 commands/tablecmds.c:266 -#: commands/tablecmds.c:5659 commands/tablecmds.c:15721 +#: catalog/objectaddress.c:1391 commands/tablecmds.c:279 +#: commands/tablecmds.c:6012 commands/tablecmds.c:16444 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" не є сторонньою таблицею" -#: catalog/objectaddress.c:1337 +#: catalog/objectaddress.c:1432 #, c-format msgid "must specify relation and object name" msgstr "треба вказати відношення й ім'я об'єкта" -#: catalog/objectaddress.c:1413 catalog/objectaddress.c:1466 +#: catalog/objectaddress.c:1508 catalog/objectaddress.c:1561 #, c-format msgid "column name must be qualified" msgstr "слід вказати ім'я стовпця" -#: catalog/objectaddress.c:1513 +#: catalog/objectaddress.c:1608 #, c-format msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "значення за замовчуванням для стовпця \"%s\" відношення \"%s\" не існує" -#: catalog/objectaddress.c:1550 commands/functioncmds.c:133 -#: commands/tablecmds.c:258 commands/typecmds.c:263 commands/typecmds.c:3275 -#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:845 -#: utils/adt/acl.c:4436 +#: catalog/objectaddress.c:1645 commands/functioncmds.c:137 +#: commands/tablecmds.c:271 commands/typecmds.c:274 commands/typecmds.c:3713 +#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:791 +#: utils/adt/acl.c:4411 #, c-format msgid "type \"%s\" does not exist" msgstr "тип \"%s\" не існує" -#: catalog/objectaddress.c:1669 +#: catalog/objectaddress.c:1764 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "оператор %d (%s, %s) з %s не існує" -#: catalog/objectaddress.c:1700 +#: catalog/objectaddress.c:1795 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "функція %d (%s, %s) з %s не існує" -#: catalog/objectaddress.c:1751 catalog/objectaddress.c:1777 +#: catalog/objectaddress.c:1846 catalog/objectaddress.c:1872 #, c-format msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "відображення користувача для користувача \"%s\" на сервері \"%s\"не існує" -#: catalog/objectaddress.c:1766 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:1012 commands/foreigncmds.c:1395 -#: foreign/foreign.c:723 +#: catalog/objectaddress.c:1861 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:988 commands/foreigncmds.c:1347 foreign/foreign.c:723 #, c-format msgid "server \"%s\" does not exist" msgstr "сервер \"%s\" не існує" -#: catalog/objectaddress.c:1833 +#: catalog/objectaddress.c:1928 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "відношення публікації \"%s\" в публікації \"%s\" не існує" -#: catalog/objectaddress.c:1895 +#: catalog/objectaddress.c:1990 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "нерозпізнаний тип об'єкта ACL за замовчуванням \"%c\"" -#: catalog/objectaddress.c:1896 +#: catalog/objectaddress.c:1991 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "Припустимі типи об'єктів: \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." -#: catalog/objectaddress.c:1947 +#: catalog/objectaddress.c:2042 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "ACL за замовчуванням для користувача \"%s\" в схемі \"%s\" для об'єкту %s не існує" -#: catalog/objectaddress.c:1952 +#: catalog/objectaddress.c:2047 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "ACL за замовчуванням для користувача \"%s\" і для об'єкту %s не існує" -#: catalog/objectaddress.c:1979 catalog/objectaddress.c:2037 -#: catalog/objectaddress.c:2094 +#: catalog/objectaddress.c:2074 catalog/objectaddress.c:2132 +#: catalog/objectaddress.c:2189 #, c-format msgid "name or argument lists may not contain nulls" msgstr "списки імен та аргументів не повинні містити Null" -#: catalog/objectaddress.c:2013 +#: catalog/objectaddress.c:2108 #, c-format msgid "unsupported object type \"%s\"" msgstr "непідтримуваний тип об'єкта \"%s\"" -#: catalog/objectaddress.c:2033 catalog/objectaddress.c:2051 -#: catalog/objectaddress.c:2192 +#: catalog/objectaddress.c:2128 catalog/objectaddress.c:2146 +#: catalog/objectaddress.c:2287 #, c-format msgid "name list length must be exactly %d" msgstr "довжина списку імен повинна бути точно %d" -#: catalog/objectaddress.c:2055 +#: catalog/objectaddress.c:2150 #, c-format msgid "large object OID may not be null" msgstr "OID великого об'єкта не повинно бути нулем" -#: catalog/objectaddress.c:2064 catalog/objectaddress.c:2127 -#: catalog/objectaddress.c:2134 +#: catalog/objectaddress.c:2159 catalog/objectaddress.c:2222 +#: catalog/objectaddress.c:2229 #, c-format msgid "name list length must be at least %d" msgstr "довжина списку імен повинна бути щонайменше %d" -#: catalog/objectaddress.c:2120 catalog/objectaddress.c:2141 +#: catalog/objectaddress.c:2215 catalog/objectaddress.c:2236 #, c-format msgid "argument list length must be exactly %d" msgstr "довжина списку аргументів повинна бути точно %d" -#: catalog/objectaddress.c:2393 libpq/be-fsstubs.c:321 +#: catalog/objectaddress.c:2488 libpq/be-fsstubs.c:321 #, c-format msgid "must be owner of large object %u" msgstr "треба бути власником великого об'єкта %u" -#: catalog/objectaddress.c:2408 commands/functioncmds.c:1445 +#: catalog/objectaddress.c:2503 commands/functioncmds.c:1581 #, c-format msgid "must be owner of type %s or type %s" msgstr "треба бути власником типу %s або типу %s" -#: catalog/objectaddress.c:2458 catalog/objectaddress.c:2475 +#: catalog/objectaddress.c:2553 catalog/objectaddress.c:2570 #, c-format msgid "must be superuser" msgstr "треба бути суперкористувачем" -#: catalog/objectaddress.c:2465 +#: catalog/objectaddress.c:2560 #, c-format msgid "must have CREATEROLE privilege" msgstr "треба мати право CREATEROLE" -#: catalog/objectaddress.c:2544 +#: catalog/objectaddress.c:2639 #, c-format msgid "unrecognized object type \"%s\"" msgstr "нерозпізнаний тип об'єкту \"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2772 +#: catalog/objectaddress.c:2882 #, c-format msgid "column %s of %s" msgstr "стовпець %s з %s" -#: catalog/objectaddress.c:2782 +#: catalog/objectaddress.c:2897 #, c-format msgid "function %s" msgstr "функція %s" -#: catalog/objectaddress.c:2787 +#: catalog/objectaddress.c:2910 #, c-format msgid "type %s" msgstr "тип %s" -#: catalog/objectaddress.c:2817 +#: catalog/objectaddress.c:2947 #, c-format msgid "cast from %s to %s" msgstr "приведення від %s до %s" -#: catalog/objectaddress.c:2845 +#: catalog/objectaddress.c:2980 #, c-format msgid "collation %s" msgstr "сортування %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2871 +#: catalog/objectaddress.c:3011 #, c-format msgid "constraint %s on %s" msgstr "обмеження %s на %s" -#: catalog/objectaddress.c:2877 +#: catalog/objectaddress.c:3017 #, c-format msgid "constraint %s" msgstr "обмеження %s" -#: catalog/objectaddress.c:2904 +#: catalog/objectaddress.c:3049 #, c-format msgid "conversion %s" msgstr "перетворення %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:2943 +#: catalog/objectaddress.c:3095 #, c-format msgid "default value for %s" msgstr "значення за замовчуванням для %s" -#: catalog/objectaddress.c:2952 +#: catalog/objectaddress.c:3109 #, c-format msgid "language %s" msgstr "мова %s" -#: catalog/objectaddress.c:2957 +#: catalog/objectaddress.c:3117 #, c-format msgid "large object %u" msgstr "великий об'єкт %u" -#: catalog/objectaddress.c:2962 +#: catalog/objectaddress.c:3130 #, c-format msgid "operator %s" msgstr "оператор %s" -#: catalog/objectaddress.c:2994 +#: catalog/objectaddress.c:3167 #, c-format msgid "operator class %s for access method %s" msgstr "клас операторів %s для методу доступу %s" -#: catalog/objectaddress.c:3017 +#: catalog/objectaddress.c:3195 #, c-format msgid "access method %s" msgstr "метод доступу %s" @@ -4685,7 +4849,7 @@ msgstr "метод доступу %s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3059 +#: catalog/objectaddress.c:3244 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "оператор %d (%s, %s) з %s: %s" @@ -4694,226 +4858,226 @@ msgstr "оператор %d (%s, %s) з %s: %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3109 +#: catalog/objectaddress.c:3301 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "функція %d (%s, %s) з %s: %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3153 +#: catalog/objectaddress.c:3353 #, c-format msgid "rule %s on %s" msgstr "правило %s на %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3191 +#: catalog/objectaddress.c:3399 #, c-format msgid "trigger %s on %s" msgstr "тригер %s на %s" -#: catalog/objectaddress.c:3207 +#: catalog/objectaddress.c:3419 #, c-format msgid "schema %s" msgstr "схема %s" -#: catalog/objectaddress.c:3230 +#: catalog/objectaddress.c:3447 #, c-format msgid "statistics object %s" msgstr "об'єкт статистики %s" -#: catalog/objectaddress.c:3257 +#: catalog/objectaddress.c:3478 #, c-format msgid "text search parser %s" msgstr "парсер текстового пошуку %s" -#: catalog/objectaddress.c:3283 +#: catalog/objectaddress.c:3509 #, c-format msgid "text search dictionary %s" msgstr "словник текстового пошуку %s" -#: catalog/objectaddress.c:3309 +#: catalog/objectaddress.c:3540 #, c-format msgid "text search template %s" msgstr "шаблон текстового пошуку %s" -#: catalog/objectaddress.c:3335 +#: catalog/objectaddress.c:3571 #, c-format msgid "text search configuration %s" msgstr "конфігурація текстового пошуку %s" -#: catalog/objectaddress.c:3344 +#: catalog/objectaddress.c:3584 #, c-format msgid "role %s" msgstr "роль %s" -#: catalog/objectaddress.c:3357 +#: catalog/objectaddress.c:3600 #, c-format msgid "database %s" msgstr "база даних %s" -#: catalog/objectaddress.c:3369 +#: catalog/objectaddress.c:3616 #, c-format msgid "tablespace %s" msgstr "табличний простір %s" -#: catalog/objectaddress.c:3378 +#: catalog/objectaddress.c:3627 #, c-format msgid "foreign-data wrapper %s" msgstr "джерело сторонніх даних %s" -#: catalog/objectaddress.c:3387 +#: catalog/objectaddress.c:3637 #, c-format msgid "server %s" msgstr "сервер %s" -#: catalog/objectaddress.c:3415 +#: catalog/objectaddress.c:3670 #, c-format msgid "user mapping for %s on server %s" msgstr "зіставлення користувача для %s на сервері %s" -#: catalog/objectaddress.c:3460 +#: catalog/objectaddress.c:3722 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "права за замовчуванням для нових відношень, що належать ролі %s в схемі %s" -#: catalog/objectaddress.c:3464 +#: catalog/objectaddress.c:3726 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "права за замовчуванням для нових відношень, що належать ролі %s" -#: catalog/objectaddress.c:3470 +#: catalog/objectaddress.c:3732 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "права за замовчуванням для нових послідовностей, що належать ролі %s в схемі %s" -#: catalog/objectaddress.c:3474 +#: catalog/objectaddress.c:3736 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "права за замовчуванням для нових послідовностей, що належать ролі %s" -#: catalog/objectaddress.c:3480 +#: catalog/objectaddress.c:3742 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "права за замовчуванням для нових функцій, що належать ролі %s в схемі %s" -#: catalog/objectaddress.c:3484 +#: catalog/objectaddress.c:3746 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "права за замовчуванням для нових функцій, що належать ролі %s" -#: catalog/objectaddress.c:3490 +#: catalog/objectaddress.c:3752 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "права за замовчуванням для нових типів, що належать ролі %s в схемі %s" -#: catalog/objectaddress.c:3494 +#: catalog/objectaddress.c:3756 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "права за замовчуванням для нових типів, що належать ролі %s" -#: catalog/objectaddress.c:3500 +#: catalog/objectaddress.c:3762 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "права за замовчуванням для нових схем, що належать ролі %s" -#: catalog/objectaddress.c:3507 +#: catalog/objectaddress.c:3769 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "права за замовчуванням, що належать ролі %s в схемі %s" -#: catalog/objectaddress.c:3511 +#: catalog/objectaddress.c:3773 #, c-format msgid "default privileges belonging to role %s" msgstr "права за замовчуванням належать ролі %s" -#: catalog/objectaddress.c:3529 +#: catalog/objectaddress.c:3795 #, c-format msgid "extension %s" msgstr "розширення %s" -#: catalog/objectaddress.c:3542 +#: catalog/objectaddress.c:3812 #, c-format msgid "event trigger %s" msgstr "тригер подій %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3578 +#: catalog/objectaddress.c:3856 #, c-format msgid "policy %s on %s" msgstr "політика %s на %s" -#: catalog/objectaddress.c:3588 +#: catalog/objectaddress.c:3870 #, c-format msgid "publication %s" msgstr "публікація %s" #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:3614 +#: catalog/objectaddress.c:3898 #, c-format msgid "publication of %s in publication %s" msgstr "відношення публікації %s в публікації %s" -#: catalog/objectaddress.c:3623 +#: catalog/objectaddress.c:3911 #, c-format msgid "subscription %s" msgstr "підписка %s" -#: catalog/objectaddress.c:3642 +#: catalog/objectaddress.c:3932 #, c-format msgid "transform for %s language %s" msgstr "трансформація для %s мови %s" -#: catalog/objectaddress.c:3705 +#: catalog/objectaddress.c:4003 #, c-format msgid "table %s" msgstr "таблиця %s" -#: catalog/objectaddress.c:3710 +#: catalog/objectaddress.c:4008 #, c-format msgid "index %s" msgstr "індекс %s" -#: catalog/objectaddress.c:3714 +#: catalog/objectaddress.c:4012 #, c-format msgid "sequence %s" msgstr "послідовність %s" -#: catalog/objectaddress.c:3718 +#: catalog/objectaddress.c:4016 #, c-format msgid "toast table %s" msgstr "таблиця toast %s" -#: catalog/objectaddress.c:3722 +#: catalog/objectaddress.c:4020 #, c-format msgid "view %s" msgstr "подання %s" -#: catalog/objectaddress.c:3726 +#: catalog/objectaddress.c:4024 #, c-format msgid "materialized view %s" msgstr "матеріалізоване подання %s" -#: catalog/objectaddress.c:3730 +#: catalog/objectaddress.c:4028 #, c-format msgid "composite type %s" msgstr "складений тип %s" -#: catalog/objectaddress.c:3734 +#: catalog/objectaddress.c:4032 #, c-format msgid "foreign table %s" msgstr "зовнішня таблиця %s" -#: catalog/objectaddress.c:3739 +#: catalog/objectaddress.c:4037 #, c-format msgid "relation %s" msgstr "відношення %s" -#: catalog/objectaddress.c:3776 +#: catalog/objectaddress.c:4078 #, c-format msgid "operator family %s for access method %s" msgstr "сімейство операторів %s для методу доступу %s" -#: catalog/pg_aggregate.c:128 +#: catalog/pg_aggregate.c:129 #, c-format msgid "aggregates cannot have more than %d argument" msgid_plural "aggregates cannot have more than %d arguments" @@ -4922,138 +5086,138 @@ msgstr[1] "агрегати не можуть мати більше ніж %d а msgstr[2] "агрегати не можуть мати більше ніж %d аргументів" msgstr[3] "агрегати не можуть мати більше ніж %d аргументів" -#: catalog/pg_aggregate.c:143 catalog/pg_aggregate.c:157 +#: catalog/pg_aggregate.c:144 catalog/pg_aggregate.c:158 #, c-format msgid "cannot determine transition data type" msgstr "неможливо визначити тип перехідних даних" -#: catalog/pg_aggregate.c:172 +#: catalog/pg_aggregate.c:173 #, c-format msgid "a variadic ordered-set aggregate must use VARIADIC type ANY" msgstr "сортувальна агрегатна функція з (variadic) повинна використовувати тип VARIADIC ANY" -#: catalog/pg_aggregate.c:198 +#: catalog/pg_aggregate.c:199 #, c-format msgid "a hypothetical-set aggregate must have direct arguments matching its aggregated arguments" msgstr "hypothetical-set-функція повинна мати прямі аргументи, які відповідають агрегатним" -#: catalog/pg_aggregate.c:245 catalog/pg_aggregate.c:289 +#: catalog/pg_aggregate.c:246 catalog/pg_aggregate.c:290 #, c-format msgid "return type of transition function %s is not %s" msgstr "функція переходу %s повинна повертати тип %s" -#: catalog/pg_aggregate.c:265 catalog/pg_aggregate.c:308 +#: catalog/pg_aggregate.c:266 catalog/pg_aggregate.c:309 #, c-format msgid "must not omit initial value when transition function is strict and transition type is not compatible with input type" msgstr "не можна пропустити початкове значення, коли перехідна функція сувора і перехідний тип не сумісний з типом введення" -#: catalog/pg_aggregate.c:334 +#: catalog/pg_aggregate.c:335 #, c-format msgid "return type of inverse transition function %s is not %s" msgstr "інвертована функція переходу %s повинна повертати тип %s" -#: catalog/pg_aggregate.c:351 executor/nodeWindowAgg.c:2852 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2852 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "пряма й інвертована функції переходу агрегату повинні мати однакову суворість" -#: catalog/pg_aggregate.c:395 catalog/pg_aggregate.c:553 +#: catalog/pg_aggregate.c:396 catalog/pg_aggregate.c:554 #, c-format msgid "final function with extra arguments must not be declared STRICT" msgstr "фінальна функція з додатковими аргументами не повинна оголошуватись як сувора (STRICT)" -#: catalog/pg_aggregate.c:426 +#: catalog/pg_aggregate.c:427 #, c-format msgid "return type of combine function %s is not %s" msgstr "комбінуюча функція %s повинна повертати тип %s" -#: catalog/pg_aggregate.c:438 executor/nodeAgg.c:4177 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:4132 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "комбінуюча функція з перехідним типом %s не повинна оголошуватись як сувора (STRICT)" -#: catalog/pg_aggregate.c:457 +#: catalog/pg_aggregate.c:458 #, c-format msgid "return type of serialization function %s is not %s" msgstr "функція серіалізації %s повинна повертати тип %s" -#: catalog/pg_aggregate.c:478 +#: catalog/pg_aggregate.c:479 #, c-format msgid "return type of deserialization function %s is not %s" msgstr "функція десеріалізації %s повинна повертати тип %s" -#: catalog/pg_aggregate.c:497 catalog/pg_proc.c:186 catalog/pg_proc.c:220 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:189 catalog/pg_proc.c:223 #, c-format msgid "cannot determine result data type" msgstr "не вдалося визначити тип результату" -#: catalog/pg_aggregate.c:512 catalog/pg_proc.c:199 catalog/pg_proc.c:228 +#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:202 catalog/pg_proc.c:231 #, c-format msgid "unsafe use of pseudo-type \"internal\"" msgstr "небезпечне використання псевдотипу (pseudo-type) \"internal\"" -#: catalog/pg_aggregate.c:566 +#: catalog/pg_aggregate.c:567 #, c-format msgid "moving-aggregate implementation returns type %s, but plain implementation returns type %s" msgstr "реалізація рухомого агрегату повертає тип %s, але проста реалізація повертає %s" -#: catalog/pg_aggregate.c:577 +#: catalog/pg_aggregate.c:578 #, c-format msgid "sort operator can only be specified for single-argument aggregates" msgstr "оператора сортування можна вказати лише для агрегатних функцій з одним аргументом" -#: catalog/pg_aggregate.c:704 catalog/pg_proc.c:374 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:384 #, c-format msgid "cannot change routine kind" msgstr "неможливо змінити тип підпрограми" -#: catalog/pg_aggregate.c:706 +#: catalog/pg_aggregate.c:708 #, c-format msgid "\"%s\" is an ordinary aggregate function." msgstr "\"%s\" є звичайною агрегатною функцією." -#: catalog/pg_aggregate.c:708 +#: catalog/pg_aggregate.c:710 #, c-format msgid "\"%s\" is an ordered-set aggregate." msgstr "\"%s\" є сортувальним агрегатом." -#: catalog/pg_aggregate.c:710 +#: catalog/pg_aggregate.c:712 #, c-format msgid "\"%s\" is a hypothetical-set aggregate." msgstr "\"%s\" є агрегатом для гіпотетичних наборів." -#: catalog/pg_aggregate.c:715 +#: catalog/pg_aggregate.c:717 #, c-format msgid "cannot change number of direct arguments of an aggregate function" msgstr "змінити кількість прямих аргументів агрегатної функції не можна" -#: catalog/pg_aggregate.c:870 commands/functioncmds.c:667 -#: commands/typecmds.c:1658 commands/typecmds.c:1704 commands/typecmds.c:1756 -#: commands/typecmds.c:1793 commands/typecmds.c:1827 commands/typecmds.c:1861 -#: commands/typecmds.c:1895 commands/typecmds.c:1972 commands/typecmds.c:2014 -#: parser/parse_func.c:414 parser/parse_func.c:443 parser/parse_func.c:468 -#: parser/parse_func.c:482 parser/parse_func.c:602 parser/parse_func.c:622 -#: parser/parse_func.c:2129 parser/parse_func.c:2320 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:701 +#: commands/typecmds.c:1992 commands/typecmds.c:2038 commands/typecmds.c:2090 +#: commands/typecmds.c:2127 commands/typecmds.c:2161 commands/typecmds.c:2195 +#: commands/typecmds.c:2229 commands/typecmds.c:2258 commands/typecmds.c:2345 +#: commands/typecmds.c:2387 parser/parse_func.c:417 parser/parse_func.c:448 +#: parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 +#: parser/parse_func.c:631 parser/parse_func.c:2173 parser/parse_func.c:2446 #, c-format msgid "function %s does not exist" msgstr "функції %s не існує" -#: catalog/pg_aggregate.c:876 +#: catalog/pg_aggregate.c:864 #, c-format msgid "function %s returns a set" msgstr "функція %s повертає набір" -#: catalog/pg_aggregate.c:891 +#: catalog/pg_aggregate.c:879 #, c-format msgid "function %s must accept VARIADIC ANY to be used in this aggregate" msgstr "функція %s повинна прийняти VARIADIC ANY для використання в цій агрегатній функції" -#: catalog/pg_aggregate.c:915 +#: catalog/pg_aggregate.c:903 #, c-format msgid "function %s requires run-time type coercion" msgstr "функція %s потребує приведення типів під час виконання" -#: catalog/pg_cast.c:67 +#: catalog/pg_cast.c:68 #, c-format msgid "cast from type %s to type %s already exists" msgstr "приведення від типу %s до типу %s вже існує" @@ -5078,7 +5242,7 @@ msgstr "правило сортування \"%s\" вже існує" msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "правило сортування \"%s \" для кодування \"%s\" вже існує" -#: catalog/pg_constraint.c:676 +#: catalog/pg_constraint.c:678 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "обмеження \"%s\" для домену %s вже існує" @@ -5103,25 +5267,25 @@ msgstr "перетворення \"%s\" вже існує" msgid "default conversion for %s to %s already exists" msgstr "перетворення за замовчуванням від %s до %s вже існує" -#: catalog/pg_depend.c:162 commands/extension.c:3324 +#: catalog/pg_depend.c:204 commands/extension.c:3352 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s вже є членом розширення \"%s\"" -#: catalog/pg_depend.c:538 +#: catalog/pg_depend.c:580 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "неможливо видалити залежність від об'єкта %s, тому що це системний об'єкт" -#: catalog/pg_enum.c:127 catalog/pg_enum.c:230 catalog/pg_enum.c:525 +#: catalog/pg_enum.c:128 catalog/pg_enum.c:230 catalog/pg_enum.c:525 #, c-format msgid "invalid enum label \"%s\"" msgstr "неприпустима мітка перераховування \"%s\"" -#: catalog/pg_enum.c:128 catalog/pg_enum.c:231 catalog/pg_enum.c:526 +#: catalog/pg_enum.c:129 catalog/pg_enum.c:231 catalog/pg_enum.c:526 #, c-format -msgid "Labels must be %d characters or less." -msgstr "Мітки повинні містити %d символів або менше." +msgid "Labels must be %d bytes or less." +msgstr "Мітки повинні бути %d байт або менше." #: catalog/pg_enum.c:259 #, c-format @@ -5148,7 +5312,33 @@ msgstr "значення OID в pg_enum не встановлено в режи msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" msgstr "Конструкція ALTER TYPE ADD BEFORE/AFTER несумісна з двійковим оновленням даних" -#: catalog/pg_namespace.c:64 commands/schemacmds.c:265 +#: catalog/pg_inherits.c:593 +#, c-format +msgid "cannot detach partition \"%s\"" +msgstr "не можна відключити розділ \"%s\"" + +#: catalog/pg_inherits.c:595 +#, c-format +msgid "The partition is being detached concurrently or has an unfinished detach." +msgstr "Розділ відключається одночасно або має незакінчене відключення." + +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4360 +#: commands/tablecmds.c:14740 +#, c-format +msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." +msgstr "Використайте ALTER TABLE ... DETACH PARTITION ... FINALIZE щоб завершити очікувану операцію відключення." + +#: catalog/pg_inherits.c:600 +#, c-format +msgid "cannot complete detaching partition \"%s\"" +msgstr "не можна завершити відключення розділу \"%s\"" + +#: catalog/pg_inherits.c:602 +#, c-format +msgid "There's no pending concurrent detach." +msgstr "Немає жодного очікуючого паралельного відключення." + +#: catalog/pg_namespace.c:64 commands/schemacmds.c:243 #, c-format msgid "schema \"%s\" already exists" msgstr "схема \"%s\" вже існує" @@ -5163,7 +5353,7 @@ msgstr "\"%s\" не є коректним оператором" msgid "only binary operators can have commutators" msgstr "(commutators) можна визначити лише для бінарних операторів" -#: catalog/pg_operator.c:374 commands/operatorcmds.c:495 +#: catalog/pg_operator.c:374 commands/operatorcmds.c:507 #, c-format msgid "only binary operators can have join selectivity" msgstr "функцію оцінки з'єднання можливо визначити лише для бінарних операторів" @@ -5183,12 +5373,12 @@ msgstr "підтримка хешу можливо позначити лише msgid "only boolean operators can have negators" msgstr "зворотню операцію можливо визначити лише для логічних операторів" -#: catalog/pg_operator.c:397 commands/operatorcmds.c:503 +#: catalog/pg_operator.c:397 commands/operatorcmds.c:515 #, c-format msgid "only boolean operators can have restriction selectivity" msgstr "функцію оцінки обмеження можливо визначити лише для логічних операторів" -#: catalog/pg_operator.c:401 commands/operatorcmds.c:507 +#: catalog/pg_operator.c:401 commands/operatorcmds.c:519 #, c-format msgid "only boolean operators can have join selectivity" msgstr "функцію оцінки з'єднання можливо визначити лише для логічних операторів" @@ -5213,7 +5403,7 @@ msgstr "оператор %s вже існує" msgid "operator cannot be its own negator or sort operator" msgstr "оператор не може бути зворотнім до себе або власним оператором сортування" -#: catalog/pg_proc.c:127 parser/parse_func.c:2191 +#: catalog/pg_proc.c:130 parser/parse_func.c:2235 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" @@ -5222,37 +5412,37 @@ msgstr[1] "функції не можуть мати більше %d аргум msgstr[2] "функції не можуть мати більше %d аргументів" msgstr[3] "функції не можуть мати більше %d аргументів" -#: catalog/pg_proc.c:364 +#: catalog/pg_proc.c:374 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "функція \"%s\" з аргументами таких типів вже існує" -#: catalog/pg_proc.c:376 +#: catalog/pg_proc.c:386 #, c-format msgid "\"%s\" is an aggregate function." msgstr "\"%s\" є функцією агрегату." -#: catalog/pg_proc.c:378 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is a function." msgstr "\"%s\" є функцією." -#: catalog/pg_proc.c:380 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a procedure." msgstr "\"%s\" є процедурою." -#: catalog/pg_proc.c:382 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a window function." msgstr "\"%s\" є функцією вікна." -#: catalog/pg_proc.c:402 +#: catalog/pg_proc.c:412 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "неможливо визначити вихідні параметри для процедури" -#: catalog/pg_proc.c:403 catalog/pg_proc.c:433 +#: catalog/pg_proc.c:413 catalog/pg_proc.c:443 #, c-format msgid "cannot change return type of existing function" msgstr "неможливо змінити тип повернення існуючої функції" @@ -5261,48 +5451,48 @@ msgstr "неможливо змінити тип повернення існую #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: catalog/pg_proc.c:409 catalog/pg_proc.c:436 catalog/pg_proc.c:481 -#: catalog/pg_proc.c:507 catalog/pg_proc.c:533 +#: catalog/pg_proc.c:419 catalog/pg_proc.c:446 catalog/pg_proc.c:491 +#: catalog/pg_proc.c:517 catalog/pg_proc.c:543 #, c-format msgid "Use %s %s first." msgstr "Використайте %s %s спочатку." -#: catalog/pg_proc.c:434 +#: catalog/pg_proc.c:444 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "Параметри OUT визначають другий тип рядку." -#: catalog/pg_proc.c:478 +#: catalog/pg_proc.c:488 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "неможливо змінити ім'я вхідного параметру \"%s\"" -#: catalog/pg_proc.c:505 +#: catalog/pg_proc.c:515 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "неможливо прибрати параметр за замовчуванням з існуючої функції" -#: catalog/pg_proc.c:531 +#: catalog/pg_proc.c:541 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "неможливо змінити тип даних для існуючого значення параметру за замовчуванням" -#: catalog/pg_proc.c:748 +#: catalog/pg_proc.c:751 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "немає вбудованої функції \"%s\"" -#: catalog/pg_proc.c:846 +#: catalog/pg_proc.c:849 #, c-format msgid "SQL functions cannot return type %s" msgstr "Функції SQL не можуть повернути тип %s" -#: catalog/pg_proc.c:861 +#: catalog/pg_proc.c:864 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "функції SQL не можуть мати аргументи типу %s" -#: catalog/pg_proc.c:954 executor/functions.c:1446 +#: catalog/pg_proc.c:976 executor/functions.c:1458 #, c-format msgid "SQL function \"%s\"" msgstr "Функція SQL \"%s\"" @@ -5338,12 +5528,12 @@ msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "відношення \"%s\" вже є членом публікації \"%s\"" #: catalog/pg_publication.c:470 commands/publicationcmds.c:451 -#: commands/publicationcmds.c:762 +#: commands/publicationcmds.c:739 #, c-format msgid "publication \"%s\" does not exist" msgstr "публікація \"%s\" вже існує" -#: catalog/pg_shdepend.c:776 +#: catalog/pg_shdepend.c:832 #, c-format msgid "\n" "and objects in %d other database (see server log for list)" @@ -5358,38 +5548,43 @@ msgstr[2] "\n" msgstr[3] "\n" "і об'єкти в %d інших базах даних (див. список в протоколі сервера)" -#: catalog/pg_shdepend.c:1082 +#: catalog/pg_shdepend.c:1176 #, c-format msgid "role %u was concurrently dropped" msgstr "роль %u було видалено паралельним способом" -#: catalog/pg_shdepend.c:1101 +#: catalog/pg_shdepend.c:1188 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "табличний простір %u було видалено паралельним способом" -#: catalog/pg_shdepend.c:1116 +#: catalog/pg_shdepend.c:1202 #, c-format msgid "database %u was concurrently dropped" msgstr "базу даних %u було видалено паралельним способом" -#: catalog/pg_shdepend.c:1161 +#: catalog/pg_shdepend.c:1247 #, c-format msgid "owner of %s" msgstr "власник об'єкту %s" -#: catalog/pg_shdepend.c:1163 +#: catalog/pg_shdepend.c:1249 #, c-format msgid "privileges for %s" msgstr "права для %s" -#: catalog/pg_shdepend.c:1165 +#: catalog/pg_shdepend.c:1251 #, c-format msgid "target of %s" msgstr "ціль %s" +#: catalog/pg_shdepend.c:1253 +#, c-format +msgid "tablespace for %s" +msgstr "табличний простір для %s" + #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1173 +#: catalog/pg_shdepend.c:1261 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" @@ -5398,155 +5593,183 @@ msgstr[1] "%d об'єкти в %s" msgstr[2] "%d об'єктів у %s" msgstr[3] "%d об'єктів у %s" -#: catalog/pg_shdepend.c:1284 +#: catalog/pg_shdepend.c:1372 #, c-format msgid "cannot drop objects owned by %s because they are required by the database system" msgstr "не вдалося видалити об'єкти, що належать %s, оскільки вони потрібні системі бази даних" -#: catalog/pg_shdepend.c:1431 +#: catalog/pg_shdepend.c:1519 #, c-format msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" msgstr "не вдалося змінити власника об'єктів, що належать ролі %s, тому що вони необхідні системі баз даних" -#: catalog/pg_subscription.c:171 commands/subscriptioncmds.c:644 -#: commands/subscriptioncmds.c:858 commands/subscriptioncmds.c:1080 +#: catalog/pg_subscription.c:174 commands/subscriptioncmds.c:779 +#: commands/subscriptioncmds.c:1089 commands/subscriptioncmds.c:1432 #, c-format msgid "subscription \"%s\" does not exist" msgstr "підписка \"%s\" не існує" -#: catalog/pg_type.c:131 catalog/pg_type.c:468 +#: catalog/pg_subscription.c:432 +#, c-format +msgid "could not drop relation mapping for subscription \"%s\"" +msgstr "не вдалося видалити зіставлення відношень для підписки \"%s\"" + +#: catalog/pg_subscription.c:434 +#, c-format +msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." +msgstr "Синхронізація таблиць для відношення \"%s\" у процесі та знаходиться у стані \"%c\"." + +#. translator: first %s is a SQL ALTER command and second %s is a +#. SQL DROP command +#. +#: catalog/pg_subscription.c:441 +#, c-format +msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." +msgstr "Використайте %s, щоб активувати підписку, якщо вона ще не активована, або використайте %s, щоб видалити підписку." + +#: catalog/pg_type.c:136 catalog/pg_type.c:475 #, c-format msgid "pg_type OID value not set when in binary upgrade mode" msgstr "значення OID в pg_type не задано в режимі двійкового оновлення" -#: catalog/pg_type.c:249 +#: catalog/pg_type.c:255 #, c-format msgid "invalid type internal size %d" msgstr "неприпустимий внутрішній розмір типу %d" -#: catalog/pg_type.c:265 catalog/pg_type.c:273 catalog/pg_type.c:281 -#: catalog/pg_type.c:290 +#: catalog/pg_type.c:271 catalog/pg_type.c:279 catalog/pg_type.c:287 +#: catalog/pg_type.c:296 #, c-format msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" msgstr "вирівнювання \"%c\" недійсне для типу переданого за значенням розміром: %d" -#: catalog/pg_type.c:297 +#: catalog/pg_type.c:303 #, c-format msgid "internal size %d is invalid for passed-by-value type" msgstr "внутрішній розмір %d недійсний для типу, переданого за значенням" -#: catalog/pg_type.c:307 catalog/pg_type.c:313 +#: catalog/pg_type.c:313 catalog/pg_type.c:319 #, c-format msgid "alignment \"%c\" is invalid for variable-length type" msgstr "вирівнювання \"%c\" недійсне для типу змінної довжини" -#: catalog/pg_type.c:321 commands/typecmds.c:3727 +#: catalog/pg_type.c:327 commands/typecmds.c:4164 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "для типів фіксованого розміру застосовується лише режим зберігання PLAIN" -#: catalog/pg_type.c:839 +#: catalog/pg_type.c:816 #, c-format msgid "could not form array type name for type \"%s\"" msgstr "не вдалося сформувати ім'я типу масиву для типу \"%s\"" -#: catalog/storage.c:449 storage/buffer/bufmgr.c:933 +#: catalog/pg_type.c:921 +#, c-format +msgid "Failed while creating a multirange type for type \"%s\"." +msgstr "Помилка під час створення багатодіапазонного типу для типу \"%s\"." + +#: catalog/pg_type.c:922 +#, c-format +msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." +msgstr "Ви можете вручну вказати назву багатодіапазонного типу за допомогою атрибуту \"multirange_type_name\"." + +#: catalog/storage.c:450 storage/buffer/bufmgr.c:1026 #, c-format msgid "invalid page in block %u of relation %s" msgstr "неприпустима сторінка в блоці %u відношення %s" -#: catalog/toasting.c:106 commands/indexcmds.c:639 commands/tablecmds.c:5638 -#: commands/tablecmds.c:15576 +#: catalog/toasting.c:104 commands/indexcmds.c:667 commands/tablecmds.c:5982 +#: commands/tablecmds.c:16299 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\" не є таблицею або матеріалізованим поданням" -#: commands/aggregatecmds.c:171 +#: commands/aggregatecmds.c:170 #, c-format msgid "only ordered-set aggregates can be hypothetical" msgstr "гіпотетичними можуть бути тільки впорядковані агрегати" -#: commands/aggregatecmds.c:196 +#: commands/aggregatecmds.c:195 #, c-format msgid "aggregate attribute \"%s\" not recognized" msgstr "атрибут агрегату \"%s\" не розпізнано" -#: commands/aggregatecmds.c:206 +#: commands/aggregatecmds.c:205 #, c-format msgid "aggregate stype must be specified" msgstr "у визначенні агрегату необхідно вказати stype" -#: commands/aggregatecmds.c:210 +#: commands/aggregatecmds.c:209 #, c-format msgid "aggregate sfunc must be specified" msgstr "в визначенні агрегату потребується sfunc" -#: commands/aggregatecmds.c:222 +#: commands/aggregatecmds.c:221 #, c-format msgid "aggregate msfunc must be specified when mstype is specified" msgstr "в визначенні агрегату потребується msfunc, коли mstype визначений" -#: commands/aggregatecmds.c:226 +#: commands/aggregatecmds.c:225 #, c-format msgid "aggregate minvfunc must be specified when mstype is specified" msgstr "в визначенні агрегату потребується minvfunc, коли mstype визначений" -#: commands/aggregatecmds.c:233 +#: commands/aggregatecmds.c:232 #, c-format msgid "aggregate msfunc must not be specified without mstype" msgstr "msfunc для агрегату не повинна визначатись без mstype" -#: commands/aggregatecmds.c:237 +#: commands/aggregatecmds.c:236 #, c-format msgid "aggregate minvfunc must not be specified without mstype" msgstr "minvfunc для агрегату не повинна визначатись без mstype" -#: commands/aggregatecmds.c:241 +#: commands/aggregatecmds.c:240 #, c-format msgid "aggregate mfinalfunc must not be specified without mstype" msgstr "mfinalfunc для агрегату не повинна визначатись без mstype" -#: commands/aggregatecmds.c:245 +#: commands/aggregatecmds.c:244 #, c-format msgid "aggregate msspace must not be specified without mstype" msgstr "msspace для агрегату не повинна визначатись без mstype" -#: commands/aggregatecmds.c:249 +#: commands/aggregatecmds.c:248 #, c-format msgid "aggregate minitcond must not be specified without mstype" msgstr "minitcond для агрегату не повинна визначатись без mstype" -#: commands/aggregatecmds.c:278 +#: commands/aggregatecmds.c:277 #, c-format msgid "aggregate input type must be specified" msgstr "слід указати тип агрегату вводу" -#: commands/aggregatecmds.c:308 +#: commands/aggregatecmds.c:307 #, c-format msgid "basetype is redundant with aggregate input type specification" msgstr "в визначенні агрегату з зазначенням вхідного типу не потрібен базовий тип" -#: commands/aggregatecmds.c:349 commands/aggregatecmds.c:390 +#: commands/aggregatecmds.c:350 commands/aggregatecmds.c:391 #, c-format msgid "aggregate transition data type cannot be %s" msgstr "тип даних агрегату транзакції не може бути %s" -#: commands/aggregatecmds.c:361 +#: commands/aggregatecmds.c:362 #, c-format msgid "serialization functions may be specified only when the aggregate transition data type is %s" msgstr "функції серіалізації можуть визначатись, лише коли перехідний тип даних агрегату %s" -#: commands/aggregatecmds.c:371 +#: commands/aggregatecmds.c:372 #, c-format msgid "must specify both or neither of serialization and deserialization functions" msgstr "повинні визначатись обидві або жодна з серіалізуючих та десеріалізуючих функцій" -#: commands/aggregatecmds.c:436 commands/functioncmds.c:615 +#: commands/aggregatecmds.c:437 commands/functioncmds.c:649 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "параметр \"parallel\" має мати значення SAFE, RESTRICTED, або UNSAFE" -#: commands/aggregatecmds.c:492 +#: commands/aggregatecmds.c:493 #, c-format msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" msgstr "параметр \"%s\" має мати значення READ_ONLY, SHAREABLE, або READ_WRITE" @@ -5561,12 +5784,12 @@ msgstr "тригер подій \"%s\" вже існує" msgid "foreign-data wrapper \"%s\" already exists" msgstr "джерело сторонніх даних \"%s\" вже існує" -#: commands/alter.c:90 commands/foreigncmds.c:903 +#: commands/alter.c:90 commands/foreigncmds.c:879 #, c-format msgid "server \"%s\" already exists" msgstr "сервер \"%s\" вже існує" -#: commands/alter.c:93 commands/proclang.c:132 +#: commands/alter.c:93 commands/proclang.c:133 #, c-format msgid "language \"%s\" already exists" msgstr "мова \"%s\" вже існує" @@ -5576,7 +5799,7 @@ msgstr "мова \"%s\" вже існує" msgid "publication \"%s\" already exists" msgstr "публікація \"%s\" вже існує" -#: commands/alter.c:99 commands/subscriptioncmds.c:371 +#: commands/alter.c:99 commands/subscriptioncmds.c:400 #, c-format msgid "subscription \"%s\" already exists" msgstr "підписка \"%s\" вже існує" @@ -5636,258 +5859,263 @@ msgstr "Тільки суперкористувач може створити м msgid "access method \"%s\" already exists" msgstr "метод доступу \"%s\" вже існує" -#: commands/amcmds.c:130 -#, c-format -msgid "must be superuser to drop access methods" -msgstr "тільки суперкористувач може видалити метод доступу" - -#: commands/amcmds.c:181 commands/indexcmds.c:188 commands/indexcmds.c:790 -#: commands/opclasscmds.c:373 commands/opclasscmds.c:793 +#: commands/amcmds.c:154 commands/indexcmds.c:210 commands/indexcmds.c:818 +#: commands/opclasscmds.c:370 commands/opclasscmds.c:824 #, c-format msgid "access method \"%s\" does not exist" msgstr "методу доступу \"%s\" не існує" -#: commands/amcmds.c:270 +#: commands/amcmds.c:243 #, c-format msgid "handler function is not specified" msgstr "функція-обробник не вказана" -#: commands/amcmds.c:291 commands/event_trigger.c:183 -#: commands/foreigncmds.c:489 commands/proclang.c:79 commands/trigger.c:687 -#: parser/parse_clause.c:941 +#: commands/amcmds.c:264 commands/event_trigger.c:183 +#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:699 +#: parser/parse_clause.c:940 #, c-format msgid "function %s must return type %s" msgstr "функція %s повинна повертати тип %s" -#: commands/analyze.c:226 +#: commands/analyze.c:227 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "пропуск об'єкту \"%s\" --- неможливо аналізувати цю сторонню таблицю" -#: commands/analyze.c:243 +#: commands/analyze.c:244 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "пропуск об'єкту \"%s\" --- неможливо аналізувати не-таблиці або спеціальні системні таблиці" -#: commands/analyze.c:329 +#: commands/analyze.c:324 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "аналізується дерево наслідування \"%s.%s\"" -#: commands/analyze.c:334 +#: commands/analyze.c:329 #, c-format msgid "analyzing \"%s.%s\"" msgstr "аналіз \"%s.%s\"" -#: commands/analyze.c:394 +#: commands/analyze.c:395 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "стовпець \"%s\" відносно \"%s\" з'являється більше одного разу" -#: commands/analyze.c:700 +#: commands/analyze.c:776 #, c-format -msgid "automatic analyze of table \"%s.%s.%s\" system usage: %s" -msgstr "автоматичний аналіз таблиці \"%s.%s.%s\" використання системи: %s" +msgid "automatic analyze of table \"%s.%s.%s\"\n" +msgstr "автоматичний аналіз таблиці \"%s.%s.%s\"\n" -#: commands/analyze.c:1169 +#: commands/analyze.c:799 +#, c-format +msgid "system usage: %s" +msgstr "використання системи: %s" + +#: commands/analyze.c:1338 #, c-format msgid "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead rows; %d rows in sample, %.0f estimated total rows" msgstr "\"%s\": проскановано %d з %u сторінок, вони містять %.0f живих рядків і %.0f мертвих рядків; %d рядків вибрані; %.0f приблизне загальне число рядків" -#: commands/analyze.c:1249 +#: commands/analyze.c:1418 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" msgstr "пропускається аналіз дерева наслідування \"%s.%s\" --- це дерево наслідування не містить дочірніх таблиць" -#: commands/analyze.c:1347 +#: commands/analyze.c:1516 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no analyzable child tables" msgstr "пропускається аналіз дерева наслідування \"%s.%s\" --- це дерево наслідування не містить аналізуючих дочірніх таблиць" -#: commands/async.c:634 +#: commands/async.c:639 #, c-format msgid "channel name cannot be empty" msgstr "ім'я каналу не може бути пустим" -#: commands/async.c:640 +#: commands/async.c:645 #, c-format msgid "channel name too long" msgstr "ім'я каналу задовге" -#: commands/async.c:645 +#: commands/async.c:650 #, c-format msgid "payload string too long" msgstr "рядок навантаження задовгий" -#: commands/async.c:864 +#: commands/async.c:869 #, c-format msgid "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" msgstr "виконати PREPARE для транзакції, яка виконала LISTEN, UNLISTEN або NOTIFY неможливо" -#: commands/async.c:970 +#: commands/async.c:975 #, c-format msgid "too many notifications in the NOTIFY queue" msgstr "занадто багато сповіщень у черзі NOTIFY" -#: commands/async.c:1636 +#: commands/async.c:1646 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "Черга NOTIFY заповнена на %.0f%%" -#: commands/async.c:1638 +#: commands/async.c:1648 #, c-format msgid "The server process with PID %d is among those with the oldest transactions." msgstr "Серверний процес з PID %d серед процесів з найдавнішими транзакціями." -#: commands/async.c:1641 +#: commands/async.c:1651 #, c-format msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." msgstr "Черга NOTIFY не може бути спорожненою, поки цей процес не завершить поточну транзакцію." -#: commands/cluster.c:125 commands/cluster.c:362 +#: commands/cluster.c:119 +#, c-format +msgid "unrecognized CLUSTER option \"%s\"" +msgstr "нерозпізнаний параметр CLUSTER \"%s\"" + +#: commands/cluster.c:147 commands/cluster.c:386 #, c-format msgid "cannot cluster temporary tables of other sessions" msgstr "не можна кластеризувати тимчасові таблиці з інших сеансів" -#: commands/cluster.c:133 +#: commands/cluster.c:155 #, c-format msgid "cannot cluster a partitioned table" msgstr "не можна кластеризувати секційну таблицю" -#: commands/cluster.c:151 +#: commands/cluster.c:173 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "немає попереднього кластеризованого індексу для таблиці \"%s\"" -#: commands/cluster.c:165 commands/tablecmds.c:12853 commands/tablecmds.c:14659 +#: commands/cluster.c:187 commands/tablecmds.c:13459 commands/tablecmds.c:15327 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "індекс \"%s\" для таблці \"%s\" не існує" -#: commands/cluster.c:351 +#: commands/cluster.c:375 #, c-format msgid "cannot cluster a shared catalog" msgstr "не можна кластеризувати спільний каталог" -#: commands/cluster.c:366 +#: commands/cluster.c:390 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "не можна очищати тимчасові таблиці з інших сеансів" -#: commands/cluster.c:432 commands/tablecmds.c:14669 +#: commands/cluster.c:456 commands/tablecmds.c:15337 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" не є індексом для таблиці \"%s\"" -#: commands/cluster.c:440 +#: commands/cluster.c:464 #, c-format msgid "cannot cluster on index \"%s\" because access method does not support clustering" msgstr "кластеризація за індексом \"%s\" неможлива, тому що метод доступу не підтримує кластеризацію" -#: commands/cluster.c:452 +#: commands/cluster.c:476 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "неможливо кластеризувати за секційним індексом \"%s\"" -#: commands/cluster.c:466 +#: commands/cluster.c:490 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "неможливо кластеризувати за невірним індексом \"%s\"" -#: commands/cluster.c:490 +#: commands/cluster.c:514 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "неможливо помітити індекс кластеризованим в секційній таблиці" -#: commands/cluster.c:863 +#: commands/cluster.c:887 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "кластеризація \"%s.%s\" з використанням сканування індексу \"%s\"" -#: commands/cluster.c:869 +#: commands/cluster.c:893 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "кластеризація \"%s.%s\"з використанням послідовного сканування та сортування" -#: commands/cluster.c:900 +#: commands/cluster.c:924 #, c-format msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" msgstr "\"%s\": знайдено версій рядків, що можуть бути видалені: %.0f, що не можуть бути видалені - %.0f, переглянуто сторінок: %u" -#: commands/cluster.c:904 +#: commands/cluster.c:928 #, c-format msgid "%.0f dead row versions cannot be removed yet.\n" "%s." msgstr "%.0f \"мертві\" версії рядків досі не можуть бути видалені.\n" "%s." -#: commands/collationcmds.c:105 +#: commands/collationcmds.c:106 #, c-format msgid "collation attribute \"%s\" not recognized" msgstr "атрибут collation \"%s\" не розпізнаний" -#: commands/collationcmds.c:148 +#: commands/collationcmds.c:149 #, c-format msgid "collation \"default\" cannot be copied" msgstr "сортування \"за замовчуванням\" не може бути скопійовано" -#: commands/collationcmds.c:181 +#: commands/collationcmds.c:182 #, c-format msgid "unrecognized collation provider: %s" msgstr "нерозпізнаний постачальник правил сортування: %s" -#: commands/collationcmds.c:190 +#: commands/collationcmds.c:191 #, c-format msgid "parameter \"lc_collate\" must be specified" msgstr "необхідно вказати параметр \"lc_collate\"" -#: commands/collationcmds.c:195 +#: commands/collationcmds.c:196 #, c-format msgid "parameter \"lc_ctype\" must be specified" msgstr "необхідно вказати параметр \"lc_ctype\"" -#: commands/collationcmds.c:205 +#: commands/collationcmds.c:206 #, c-format msgid "nondeterministic collations not supported with this provider" msgstr "недетерміновані правила сортування не підтримуються цим провайдером" -#: commands/collationcmds.c:265 +#: commands/collationcmds.c:266 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "правило сортування \"%s\" для кодування \"%s\" вже існує в схемі \"%s\"" -#: commands/collationcmds.c:276 +#: commands/collationcmds.c:277 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "правило сортування \"%s\" вже існує в схемі \"%s\"" -#: commands/collationcmds.c:324 +#: commands/collationcmds.c:325 #, c-format msgid "changing version from %s to %s" msgstr "зміна версії з %s на %s" -#: commands/collationcmds.c:339 +#: commands/collationcmds.c:340 #, c-format msgid "version has not changed" msgstr "версію не змінено" -#: commands/collationcmds.c:470 +#: commands/collationcmds.c:454 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "не вдалося перетворити локальну назву \"%s\" на мітку мови: %s" -#: commands/collationcmds.c:531 +#: commands/collationcmds.c:512 #, c-format msgid "must be superuser to import system collations" msgstr "імпортувати систмені правила сортування може тільки суперкористувач" -#: commands/collationcmds.c:554 commands/copy.c:1894 commands/copy.c:3480 +#: commands/collationcmds.c:540 commands/copyfrom.c:1500 commands/copyto.c:682 #: libpq/be-secure-common.c:81 #, c-format msgid "could not execute command \"%s\": %m" msgstr "не вдалося виконати команду \"%s\": %m" -#: commands/collationcmds.c:685 +#: commands/collationcmds.c:671 #, c-format msgid "no usable system locales were found" msgstr "придатні системні локалі не знайдені" @@ -5895,23 +6123,23 @@ msgstr "придатні системні локалі не знайдені" #: commands/comment.c:61 commands/dbcommands.c:841 commands/dbcommands.c:1037 #: commands/dbcommands.c:1150 commands/dbcommands.c:1340 #: commands/dbcommands.c:1588 commands/dbcommands.c:1702 -#: commands/dbcommands.c:2142 utils/init/postinit.c:888 -#: utils/init/postinit.c:993 utils/init/postinit.c:1010 +#: commands/dbcommands.c:2142 utils/init/postinit.c:887 +#: utils/init/postinit.c:992 utils/init/postinit.c:1009 #, c-format msgid "database \"%s\" does not exist" msgstr "бази даних \"%s\" не існує" -#: commands/comment.c:101 commands/seclabel.c:117 parser/parse_utilcmd.c:957 +#: commands/comment.c:101 commands/seclabel.c:191 parser/parse_utilcmd.c:979 #, c-format msgid "\"%s\" is not a table, view, materialized view, composite type, or foreign table" msgstr "\"%s\" не є таблицею, поданням, матеріалізованим поданням, композитним типом або сторонньою таблицею" -#: commands/constraint.c:63 utils/adt/ri_triggers.c:1923 +#: commands/constraint.c:63 utils/adt/ri_triggers.c:1948 #, c-format msgid "function \"%s\" was not called by trigger manager" msgstr "функція \"%s\" не була викликана менеджером тригерів" -#: commands/constraint.c:70 utils/adt/ri_triggers.c:1932 +#: commands/constraint.c:70 utils/adt/ri_triggers.c:1957 #, c-format msgid "function \"%s\" must be fired AFTER ROW" msgstr "функція \"%s\" повинна запускатися в AFTER ROW" @@ -5921,554 +6149,550 @@ msgstr "функція \"%s\" повинна запускатися в AFTER ROW msgid "function \"%s\" must be fired for INSERT or UPDATE" msgstr "функція \"%s\" повинна запускатися для INSERT або UPDATE" -#: commands/conversioncmds.c:66 +#: commands/conversioncmds.c:67 #, c-format msgid "source encoding \"%s\" does not exist" msgstr "вихідного кодування \"%s\" не існує" -#: commands/conversioncmds.c:73 +#: commands/conversioncmds.c:74 #, c-format msgid "destination encoding \"%s\" does not exist" msgstr "цільового кодування \"%s\" не існує" -#: commands/conversioncmds.c:86 +#: commands/conversioncmds.c:87 #, c-format msgid "encoding conversion to or from \"SQL_ASCII\" is not supported" msgstr "перетворення кодування в або з \"SQL_ASCII\" не підтримується" -#: commands/conversioncmds.c:99 +#: commands/conversioncmds.c:100 #, c-format msgid "encoding conversion function %s must return type %s" msgstr "функція перетворення кодування %s повинна повертати тип %s" -#: commands/copy.c:426 commands/copy.c:460 +#: commands/conversioncmds.c:130 #, c-format -msgid "COPY BINARY is not supported to stdout or from stdin" -msgstr "COPY BINARY не підтримує stdout або stdin" +msgid "encoding conversion function %s returned incorrect result for empty input" +msgstr "функція перетворення кодування %s повернула неправильний результат для порожнього вводу" -#: commands/copy.c:560 +#: commands/copy.c:86 #, c-format -msgid "could not write to COPY program: %m" -msgstr "не вдалося записати в канал програми COPY: %m" +msgid "must be superuser or a member of the pg_execute_server_program role to COPY to or from an external program" +msgstr "для використання COPY із зовнішніми програмами потрібноно бути суперкористувачем або членом ролі pg_execute_server_program" -#: commands/copy.c:565 +#: commands/copy.c:87 commands/copy.c:96 commands/copy.c:103 #, c-format -msgid "could not write to COPY file: %m" -msgstr "не можливо записати в файл COPY: %m" +msgid "Anyone can COPY to stdout or from stdin. psql's \\copy command also works for anyone." +msgstr "Будь-хто може використати COPY to stdout або from stdin, а також команду psql \\copy." -#: commands/copy.c:578 +#: commands/copy.c:95 #, c-format -msgid "connection lost during COPY to stdout" -msgstr "втрачено з'єднання під час COPY в stdout" +msgid "must be superuser or a member of the pg_read_server_files role to COPY from a file" +msgstr "потрібно бути суперкористувачем або членом ролі pg_read_server_files, щоб виконати COPY з читанням файлу" -#: commands/copy.c:622 +#: commands/copy.c:102 #, c-format -msgid "could not read from COPY file: %m" -msgstr "не вдалося прочитати файл COPY: %m" +msgid "must be superuser or a member of the pg_write_server_files role to COPY to a file" +msgstr "потрібно бути суперкористувачем або членом ролі pg_write_server_files, щоб виконати COPY з записом у файл" -#: commands/copy.c:640 commands/copy.c:661 commands/copy.c:665 -#: tcop/postgres.c:344 tcop/postgres.c:380 tcop/postgres.c:407 +#: commands/copy.c:188 #, c-format -msgid "unexpected EOF on client connection with an open transaction" -msgstr "неочікуваний обрив з'єднання з клієнтом при відкритій транзакції" +msgid "COPY FROM not supported with row-level security" +msgstr "COPY FROM не підтримується із захистом на рівні рядків" -#: commands/copy.c:678 +#: commands/copy.c:189 #, c-format -msgid "COPY from stdin failed: %s" -msgstr "помилка при stdin COPY: %s" +msgid "Use INSERT statements instead." +msgstr "Використайте оператори INSERT замість цього." -#: commands/copy.c:694 -#, c-format -msgid "unexpected message type 0x%02X during COPY from stdin" -msgstr "неочікуваний тип повідомлення 0x%02X під час COPY з stdin" - -#: commands/copy.c:861 -#, c-format -msgid "must be superuser or a member of the pg_execute_server_program role to COPY to or from an external program" -msgstr "для використання COPY із зовнішніми програмами потрібноно бути суперкористувачем або членом ролі pg_execute_server_program" - -#: commands/copy.c:862 commands/copy.c:871 commands/copy.c:878 -#, c-format -msgid "Anyone can COPY to stdout or from stdin. psql's \\copy command also works for anyone." -msgstr "Будь-хто може використати COPY to stdout або from stdin, а також команду psql \\copy." - -#: commands/copy.c:870 -#, c-format -msgid "must be superuser or a member of the pg_read_server_files role to COPY from a file" -msgstr "потрібно бути суперкористувачем або членом ролі pg_read_server_files, щоб виконати COPY з читанням файлу" - -#: commands/copy.c:877 -#, c-format -msgid "must be superuser or a member of the pg_write_server_files role to COPY to a file" -msgstr "потрібно бути суперкористувачем або членом ролі pg_write_server_files, щоб виконати COPY з записом у файл" - -#: commands/copy.c:963 -#, c-format -msgid "COPY FROM not supported with row-level security" -msgstr "COPY FROM не підтримується із захистом на рівні рядків" - -#: commands/copy.c:964 -#, c-format -msgid "Use INSERT statements instead." -msgstr "Використайте оператори INSERT замість цього." - -#: commands/copy.c:1146 +#: commands/copy.c:374 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "Формат \"%s\" для COPY не розпізнано" -#: commands/copy.c:1217 commands/copy.c:1233 commands/copy.c:1248 -#: commands/copy.c:1270 +#: commands/copy.c:447 commands/copy.c:463 commands/copy.c:478 +#: commands/copy.c:500 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "аргументом функції \"%s\" повинен бути список імен стовпців" -#: commands/copy.c:1285 +#: commands/copy.c:515 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "аргументом функції \"%s\" повинне бути припустиме ім'я коду" -#: commands/copy.c:1292 commands/dbcommands.c:253 commands/dbcommands.c:1536 +#: commands/copy.c:522 commands/dbcommands.c:253 commands/dbcommands.c:1536 #, c-format msgid "option \"%s\" not recognized" msgstr "параметр \"%s\" не розпізнано" -#: commands/copy.c:1304 +#: commands/copy.c:534 #, c-format msgid "cannot specify DELIMITER in BINARY mode" msgstr "неможливо визначити DELIMITER в режимі BINARY" -#: commands/copy.c:1309 +#: commands/copy.c:539 #, c-format msgid "cannot specify NULL in BINARY mode" msgstr "неможливо визначити NULL в режимі BINARY" -#: commands/copy.c:1331 +#: commands/copy.c:561 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "роздільник для COPY повинен бути однобайтовим символом" -#: commands/copy.c:1338 +#: commands/copy.c:568 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "Роздільник для COPY не може бути символом нового рядка або повернення каретки" -#: commands/copy.c:1344 +#: commands/copy.c:574 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "Подання NULL для COPY не може включати символ нового рядка або повернення каретки" -#: commands/copy.c:1361 +#: commands/copy.c:591 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "роздільник COPY не може бути \"%s\"" -#: commands/copy.c:1367 +#: commands/copy.c:597 #, c-format msgid "COPY HEADER available only in CSV mode" msgstr "COPY HEADER доступний тільки в режимі CSV" -#: commands/copy.c:1373 +#: commands/copy.c:603 #, c-format msgid "COPY quote available only in CSV mode" msgstr "лапки для COPY доустпні тільки в режимі CSV" -#: commands/copy.c:1378 +#: commands/copy.c:608 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "лапки для COPY повинні бути однобайтовим символом" -#: commands/copy.c:1383 +#: commands/copy.c:613 #, c-format msgid "COPY delimiter and quote must be different" msgstr "роздільник і лапки для COPY повинні бути різними" -#: commands/copy.c:1389 +#: commands/copy.c:619 #, c-format msgid "COPY escape available only in CSV mode" msgstr "вихід для COPY доступний тільки в режимі CSV" -#: commands/copy.c:1394 +#: commands/copy.c:624 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "вихід для COPY повинен бути однобайтовим символом" -#: commands/copy.c:1400 +#: commands/copy.c:630 #, c-format msgid "COPY force quote available only in CSV mode" msgstr "Параметр force quote для COPY можна використати тільки в режимі CSV" -#: commands/copy.c:1404 +#: commands/copy.c:634 #, c-format msgid "COPY force quote only available using COPY TO" msgstr "Параметр force quote для COPY можна використати тільки з COPY TO" -#: commands/copy.c:1410 +#: commands/copy.c:640 #, c-format msgid "COPY force not null available only in CSV mode" msgstr "Параметр force not null для COPY можна використати тільки в режимі CSV" -#: commands/copy.c:1414 +#: commands/copy.c:644 #, c-format msgid "COPY force not null only available using COPY FROM" msgstr "Параметр force not null для COPY можна використати тільки з COPY FROM" -#: commands/copy.c:1420 +#: commands/copy.c:650 #, c-format msgid "COPY force null available only in CSV mode" msgstr "Параметр force null для COPY можна використати тільки в режимі CSV" -#: commands/copy.c:1425 +#: commands/copy.c:655 #, c-format msgid "COPY force null only available using COPY FROM" msgstr "Параметр force null only для COPY можна використати тільки з COPY FROM" -#: commands/copy.c:1431 +#: commands/copy.c:661 #, c-format msgid "COPY delimiter must not appear in the NULL specification" msgstr "роздільник COPY не повинен з'являтися у специфікації NULL" -#: commands/copy.c:1438 +#: commands/copy.c:668 #, c-format msgid "CSV quote character must not appear in the NULL specification" msgstr "лапки CSV не повинні з'являтися у специфікації NULL" -#: commands/copy.c:1524 -#, c-format -msgid "DO INSTEAD NOTHING rules are not supported for COPY" -msgstr "правила DO INSTEAD NOTHING не підтримуються для COPY" - -#: commands/copy.c:1538 -#, c-format -msgid "conditional DO INSTEAD rules are not supported for COPY" -msgstr "умовні правила DO INSTEAD не підтримуються для COPY" - -#: commands/copy.c:1542 -#, c-format -msgid "DO ALSO rules are not supported for the COPY" -msgstr "правила DO ALSO не підтримуються для COPY" - -#: commands/copy.c:1547 +#: commands/copy.c:729 #, c-format -msgid "multi-statement DO INSTEAD rules are not supported for COPY" -msgstr "складові правила DO INSTEAD не підтримуються з COPY" - -#: commands/copy.c:1557 -#, c-format -msgid "COPY (SELECT INTO) is not supported" -msgstr "COPY (SELECT INTO) не підтримується" - -#: commands/copy.c:1574 -#, c-format -msgid "COPY query must have a RETURNING clause" -msgstr "В запиті COPY повинно бути речення RETURNING" - -#: commands/copy.c:1603 -#, c-format -msgid "relation referenced by COPY statement has changed" -msgstr "відношення, згадане в операторі COPY, змінилось" - -#: commands/copy.c:1662 -#, c-format -msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" -msgstr "Стовпець FORCE_QUOTE \"%s\" не фігурує в COPY" - -#: commands/copy.c:1685 -#, c-format -msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" -msgstr "Стовпець FORCE_NOT_NULL \"%s\" не фігурує в COPY" - -#: commands/copy.c:1708 -#, c-format -msgid "FORCE_NULL column \"%s\" not referenced by COPY" -msgstr "Стовпець FORCE_NULL \"%s\" не фігурує в COPY" - -#: commands/copy.c:1774 libpq/be-secure-common.c:105 -#, c-format -msgid "could not close pipe to external command: %m" -msgstr "не вдалося закрити канал за допомогою зовнішньої команди: %m" - -#: commands/copy.c:1789 -#, c-format -msgid "program \"%s\" failed" -msgstr "збій програми \"%s\"" - -#: commands/copy.c:1840 -#, c-format -msgid "cannot copy from view \"%s\"" -msgstr "неможливо скопіювати з подання \"%s\"" - -#: commands/copy.c:1842 commands/copy.c:1848 commands/copy.c:1854 -#: commands/copy.c:1865 -#, c-format -msgid "Try the COPY (SELECT ...) TO variant." -msgstr "Спробуйте варіацію COPY (SELECT ...) TO." - -#: commands/copy.c:1846 -#, c-format -msgid "cannot copy from materialized view \"%s\"" -msgstr "неможливо скопіювати з матеріалізованого подання \"%s\"" - -#: commands/copy.c:1852 -#, c-format -msgid "cannot copy from foreign table \"%s\"" -msgstr "неможливо скопіювати зі сторонньої таблиці \"%s\"" - -#: commands/copy.c:1858 -#, c-format -msgid "cannot copy from sequence \"%s\"" -msgstr "не вдалося скопіювати з послідовності \"%s\"" - -#: commands/copy.c:1863 -#, c-format -msgid "cannot copy from partitioned table \"%s\"" -msgstr "неможливо скопіювати з секційної таблиці \"%s\"" - -#: commands/copy.c:1869 -#, c-format -msgid "cannot copy from non-table relation \"%s\"" -msgstr "не можна копіювати з відношення \"%s\", котре не є таблицею" - -#: commands/copy.c:1909 -#, c-format -msgid "relative path not allowed for COPY to file" -msgstr "при виконанні COPY в файл не можна вказувати відносний шлях" +msgid "column \"%s\" is a generated column" +msgstr "стовпець \"%s\" є згенерованим стовпцем" -#: commands/copy.c:1928 +#: commands/copy.c:731 #, c-format -msgid "could not open file \"%s\" for writing: %m" -msgstr "не вдалося відкрити файл \"%s\" для запису: %m" +msgid "Generated columns cannot be used in COPY." +msgstr "Згенеровані стовпці не можна використовувати в COPY." -#: commands/copy.c:1931 +#: commands/copy.c:746 commands/indexcmds.c:1754 commands/statscmds.c:238 +#: commands/tablecmds.c:2321 commands/tablecmds.c:2977 +#: commands/tablecmds.c:3470 parser/parse_relation.c:3593 +#: parser/parse_relation.c:3613 utils/adt/tsvector_op.c:2680 #, c-format -msgid "COPY TO instructs the PostgreSQL server process to write a file. You may want a client-side facility such as psql's \\copy." -msgstr "COPY TO наказує серверному процесу PostgreSQL записати дані до файлу. Можливо, вам потрібна клієнтська команда, наприклад \\copy в psql." +msgid "column \"%s\" does not exist" +msgstr "стовпця \"%s\" не існує" -#: commands/copy.c:1944 commands/copy.c:3511 +#: commands/copy.c:753 commands/tablecmds.c:2347 commands/trigger.c:951 +#: parser/parse_target.c:1080 parser/parse_target.c:1091 #, c-format -msgid "\"%s\" is a directory" -msgstr "\"%s\" - каталог" +msgid "column \"%s\" specified more than once" +msgstr "стовпець \"%s\" вказано більше чим один раз" -#: commands/copy.c:2246 +#: commands/copyfrom.c:127 #, c-format msgid "COPY %s, line %s, column %s" msgstr "COPY %s, рядок%s, стовпець %s" -#: commands/copy.c:2250 commands/copy.c:2297 +#: commands/copyfrom.c:131 commands/copyfrom.c:172 #, c-format msgid "COPY %s, line %s" msgstr "COPY %s, рядок %s" -#: commands/copy.c:2261 +#: commands/copyfrom.c:142 #, c-format msgid "COPY %s, line %s, column %s: \"%s\"" msgstr "COPY %s, рядок %s, стовпець %s: \"%s\"" -#: commands/copy.c:2269 +#: commands/copyfrom.c:150 #, c-format msgid "COPY %s, line %s, column %s: null input" msgstr "COPY %s, рядок %s, стовпець %s: значення нуль" -#: commands/copy.c:2291 +#: commands/copyfrom.c:166 #, c-format msgid "COPY %s, line %s: \"%s\"" msgstr "COPY %s, рядок %s: \"%s\"" -#: commands/copy.c:2692 +#: commands/copyfrom.c:566 #, c-format msgid "cannot copy to view \"%s\"" msgstr "неможливо скопіювати до подання \"%s\"" -#: commands/copy.c:2694 +#: commands/copyfrom.c:568 #, c-format msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." msgstr "Щоб подання допускало копіювання даних у нього, встановіть тригер INSTEAD OF INSERT." -#: commands/copy.c:2698 +#: commands/copyfrom.c:572 #, c-format msgid "cannot copy to materialized view \"%s\"" msgstr "не можна копіювати матеріалізоване подання \"%s\"" -#: commands/copy.c:2703 +#: commands/copyfrom.c:577 #, c-format msgid "cannot copy to sequence \"%s\"" msgstr "неможливо скопіювати послідовність \"%s\"" -#: commands/copy.c:2708 +#: commands/copyfrom.c:582 #, c-format msgid "cannot copy to non-table relation \"%s\"" msgstr "неможливо копіювати у відношення \"%s\", яке не є таблицею" -#: commands/copy.c:2748 +#: commands/copyfrom.c:622 #, c-format msgid "cannot perform COPY FREEZE on a partitioned table" msgstr "виконати COPY FREEZE в секціонованій таблиці не можна" -#: commands/copy.c:2763 +#: commands/copyfrom.c:637 #, c-format msgid "cannot perform COPY FREEZE because of prior transaction activity" msgstr "виконати COPY FREEZE через попередню активність в транзакції не можна" -#: commands/copy.c:2769 +#: commands/copyfrom.c:643 #, c-format msgid "cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction" msgstr "не можна виконати COPY FREEZE, тому, що таблиця не була створена або скорочена в поточній підтранзакції" -#: commands/copy.c:3498 +#: commands/copyfrom.c:1264 commands/copyto.c:612 +#, c-format +msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" +msgstr "Стовпець FORCE_NOT_NULL \"%s\" не фігурує в COPY" + +#: commands/copyfrom.c:1287 commands/copyto.c:635 +#, c-format +msgid "FORCE_NULL column \"%s\" not referenced by COPY" +msgstr "Стовпець FORCE_NULL \"%s\" не фігурує в COPY" + +#: commands/copyfrom.c:1519 #, c-format msgid "COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \\copy." msgstr "COPY FROM наказує серверному процесу PostgreSQL прочитати дані з файлу. Можливо, вам потрібна клієнтська команда, наприклад \\copy в psql." -#: commands/copy.c:3526 +#: commands/copyfrom.c:1532 commands/copyto.c:734 +#, c-format +msgid "\"%s\" is a directory" +msgstr "\"%s\" - каталог" + +#: commands/copyfrom.c:1600 commands/copyto.c:302 libpq/be-secure-common.c:105 +#, c-format +msgid "could not close pipe to external command: %m" +msgstr "не вдалося закрити канал за допомогою зовнішньої команди: %m" + +#: commands/copyfrom.c:1615 commands/copyto.c:307 +#, c-format +msgid "program \"%s\" failed" +msgstr "збій програми \"%s\"" + +#: commands/copyfromparse.c:199 #, c-format msgid "COPY file signature not recognized" msgstr "Підпис COPY-файлу не розпізнано" -#: commands/copy.c:3531 +#: commands/copyfromparse.c:204 #, c-format msgid "invalid COPY file header (missing flags)" msgstr "невірний заголовок файлу COPY (відсутні прапори)" -#: commands/copy.c:3535 +#: commands/copyfromparse.c:208 #, c-format msgid "invalid COPY file header (WITH OIDS)" msgstr "невірний заголовок файла COPY (WITH OIDS)" -#: commands/copy.c:3540 +#: commands/copyfromparse.c:213 #, c-format msgid "unrecognized critical flags in COPY file header" msgstr "не розпізнано важливі прапори в заголовку файлу COPY" -#: commands/copy.c:3546 +#: commands/copyfromparse.c:219 #, c-format msgid "invalid COPY file header (missing length)" msgstr "невірний заголовок файлу COPY (відсутня довжина)" -#: commands/copy.c:3553 +#: commands/copyfromparse.c:226 #, c-format msgid "invalid COPY file header (wrong length)" msgstr "невірний заголовок файлу COPY (невірна довжина)" -#: commands/copy.c:3672 commands/copy.c:4337 commands/copy.c:4567 +#: commands/copyfromparse.c:255 +#, c-format +msgid "could not read from COPY file: %m" +msgstr "не вдалося прочитати файл COPY: %m" + +#: commands/copyfromparse.c:277 commands/copyfromparse.c:302 +#: tcop/postgres.c:360 +#, c-format +msgid "unexpected EOF on client connection with an open transaction" +msgstr "неочікуваний обрив з'єднання з клієнтом при відкритій транзакції" + +#: commands/copyfromparse.c:293 +#, c-format +msgid "unexpected message type 0x%02X during COPY from stdin" +msgstr "неочікуваний тип повідомлення 0x%02X під час COPY з stdin" + +#: commands/copyfromparse.c:316 +#, c-format +msgid "COPY from stdin failed: %s" +msgstr "помилка при stdin COPY: %s" + +#: commands/copyfromparse.c:841 commands/copyfromparse.c:1451 +#: commands/copyfromparse.c:1681 #, c-format msgid "extra data after last expected column" msgstr "зайві дані після вмісту останнього стовпця" -#: commands/copy.c:3686 +#: commands/copyfromparse.c:855 #, c-format msgid "missing data for column \"%s\"" msgstr "відсутні дані для стовпця \"%s\"" -#: commands/copy.c:3769 +#: commands/copyfromparse.c:933 #, c-format msgid "received copy data after EOF marker" msgstr "після маркера кінця файлу продовжуються дані COPY" -#: commands/copy.c:3776 +#: commands/copyfromparse.c:940 #, c-format msgid "row field count is %d, expected %d" msgstr "кількість полів у рядку: %d, очікувалось: %d" -#: commands/copy.c:4096 commands/copy.c:4113 +#: commands/copyfromparse.c:1233 commands/copyfromparse.c:1250 #, c-format msgid "literal carriage return found in data" msgstr "в даних виявлено явне повернення каретки" -#: commands/copy.c:4097 commands/copy.c:4114 +#: commands/copyfromparse.c:1234 commands/copyfromparse.c:1251 #, c-format msgid "unquoted carriage return found in data" msgstr "в даних виявлено повернення каретки без лапок" -#: commands/copy.c:4099 commands/copy.c:4116 +#: commands/copyfromparse.c:1236 commands/copyfromparse.c:1253 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "Використайте \"\\r\", щоб позначити повернення каретки." -#: commands/copy.c:4100 commands/copy.c:4117 +#: commands/copyfromparse.c:1237 commands/copyfromparse.c:1254 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "Використайте CSV в лапках, щоб позначити повернення каретки." -#: commands/copy.c:4129 +#: commands/copyfromparse.c:1266 #, c-format msgid "literal newline found in data" msgstr "в даних знайдено явний новий рядок" -#: commands/copy.c:4130 +#: commands/copyfromparse.c:1267 #, c-format msgid "unquoted newline found in data" msgstr "в даних знайдено новий рядок без лапок" -#: commands/copy.c:4132 +#: commands/copyfromparse.c:1269 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "Використайте \"\\n\", щоб представити новий рядок." -#: commands/copy.c:4133 +#: commands/copyfromparse.c:1270 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "Використайте CSV в лапках, щоб позначити новий рядок." -#: commands/copy.c:4179 commands/copy.c:4215 +#: commands/copyfromparse.c:1316 commands/copyfromparse.c:1352 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "маркер \"кінець копії\" не відповідає попередньому стилю нового рядка" -#: commands/copy.c:4188 commands/copy.c:4204 +#: commands/copyfromparse.c:1325 commands/copyfromparse.c:1341 #, c-format msgid "end-of-copy marker corrupt" msgstr "маркер \"кінець копії\" зіпсований" -#: commands/copy.c:4651 +#: commands/copyfromparse.c:1765 #, c-format msgid "unterminated CSV quoted field" msgstr "незакінчене поле в лапках CSV" -#: commands/copy.c:4728 commands/copy.c:4747 +#: commands/copyfromparse.c:1841 commands/copyfromparse.c:1860 #, c-format msgid "unexpected EOF in COPY data" msgstr "неочікуваний кінец файлу в даних COPY" -#: commands/copy.c:4737 +#: commands/copyfromparse.c:1850 #, c-format msgid "invalid field size" msgstr "невірний розмір поля" -#: commands/copy.c:4760 +#: commands/copyfromparse.c:1873 #, c-format msgid "incorrect binary data format" msgstr "невірний двійковий формат даних" -#: commands/copy.c:5068 +#: commands/copyto.c:235 #, c-format -msgid "column \"%s\" is a generated column" -msgstr "стовпець \"%s\" є згенерованим стовпцем" +msgid "could not write to COPY program: %m" +msgstr "не вдалося записати в канал програми COPY: %m" -#: commands/copy.c:5070 +#: commands/copyto.c:240 #, c-format -msgid "Generated columns cannot be used in COPY." -msgstr "Згенеровані стовпці не можна використовувати в COPY." +msgid "could not write to COPY file: %m" +msgstr "не можливо записати в файл COPY: %m" -#: commands/copy.c:5085 commands/indexcmds.c:1700 commands/statscmds.c:217 -#: commands/tablecmds.c:2176 commands/tablecmds.c:2795 -#: commands/tablecmds.c:3182 parser/parse_relation.c:3507 -#: parser/parse_relation.c:3527 utils/adt/tsvector_op.c:2668 +#: commands/copyto.c:370 #, c-format -msgid "column \"%s\" does not exist" -msgstr "стовпця \"%s\" не існує" +msgid "cannot copy from view \"%s\"" +msgstr "неможливо скопіювати з подання \"%s\"" -#: commands/copy.c:5092 commands/tablecmds.c:2202 commands/trigger.c:885 -#: parser/parse_target.c:1052 parser/parse_target.c:1063 +#: commands/copyto.c:372 commands/copyto.c:378 commands/copyto.c:384 +#: commands/copyto.c:395 #, c-format -msgid "column \"%s\" specified more than once" -msgstr "стовпець \"%s\" вказано більше чим один раз" +msgid "Try the COPY (SELECT ...) TO variant." +msgstr "Спробуйте варіацію COPY (SELECT ...) TO." + +#: commands/copyto.c:376 +#, c-format +msgid "cannot copy from materialized view \"%s\"" +msgstr "неможливо скопіювати з матеріалізованого подання \"%s\"" + +#: commands/copyto.c:382 +#, c-format +msgid "cannot copy from foreign table \"%s\"" +msgstr "неможливо скопіювати зі сторонньої таблиці \"%s\"" + +#: commands/copyto.c:388 +#, c-format +msgid "cannot copy from sequence \"%s\"" +msgstr "не вдалося скопіювати з послідовності \"%s\"" + +#: commands/copyto.c:393 +#, c-format +msgid "cannot copy from partitioned table \"%s\"" +msgstr "неможливо скопіювати з секційної таблиці \"%s\"" + +#: commands/copyto.c:399 +#, c-format +msgid "cannot copy from non-table relation \"%s\"" +msgstr "не можна копіювати з відношення \"%s\", котре не є таблицею" + +#: commands/copyto.c:451 +#, c-format +msgid "DO INSTEAD NOTHING rules are not supported for COPY" +msgstr "правила DO INSTEAD NOTHING не підтримуються для COPY" + +#: commands/copyto.c:465 +#, c-format +msgid "conditional DO INSTEAD rules are not supported for COPY" +msgstr "умовні правила DO INSTEAD не підтримуються для COPY" + +#: commands/copyto.c:469 +#, c-format +msgid "DO ALSO rules are not supported for the COPY" +msgstr "правила DO ALSO не підтримуються для COPY" -#: commands/createas.c:215 commands/createas.c:497 +#: commands/copyto.c:474 +#, c-format +msgid "multi-statement DO INSTEAD rules are not supported for COPY" +msgstr "складові правила DO INSTEAD не підтримуються з COPY" + +#: commands/copyto.c:484 +#, c-format +msgid "COPY (SELECT INTO) is not supported" +msgstr "COPY (SELECT INTO) не підтримується" + +#: commands/copyto.c:501 +#, c-format +msgid "COPY query must have a RETURNING clause" +msgstr "В запиті COPY повинно бути речення RETURNING" + +#: commands/copyto.c:530 +#, c-format +msgid "relation referenced by COPY statement has changed" +msgstr "відношення, згадане в операторі COPY, змінилось" + +#: commands/copyto.c:589 +#, c-format +msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" +msgstr "Стовпець FORCE_QUOTE \"%s\" не фігурує в COPY" + +#: commands/copyto.c:699 +#, c-format +msgid "relative path not allowed for COPY to file" +msgstr "при виконанні COPY в файл не можна вказувати відносний шлях" + +#: commands/copyto.c:718 +#, c-format +msgid "could not open file \"%s\" for writing: %m" +msgstr "не вдалося відкрити файл \"%s\" для запису: %m" + +#: commands/copyto.c:721 +#, c-format +msgid "COPY TO instructs the PostgreSQL server process to write a file. You may want a client-side facility such as psql's \\copy." +msgstr "COPY TO наказує серверному процесу PostgreSQL записати дані до файлу. Можливо, вам потрібна клієнтська команда, наприклад \\copy в psql." + +#: commands/createas.c:215 commands/createas.c:511 #, c-format msgid "too many column names were specified" msgstr "вказано забагато імен стовпців" -#: commands/createas.c:539 +#: commands/createas.c:534 #, c-format msgid "policies not yet implemented for this command" msgstr "політики для цієї команди все ще не реалізовані" @@ -6675,7 +6899,7 @@ msgstr "Перед тим, як виконувати цю команду, вам #: commands/dbcommands.c:1404 commands/dbcommands.c:1980 #: commands/dbcommands.c:2203 commands/dbcommands.c:2261 -#: commands/tablespace.c:619 +#: commands/tablespace.c:631 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "у старому каталозі бази даних \"%s\" могли залишитися непотрібні файли" @@ -6714,7 +6938,7 @@ msgstr[1] "Є %d інші сеанси з використанням цієї б msgstr[2] "Є %d інших сеансів з використанням цієї бази даних." msgstr[3] "Є %d інших сеансів з використанням цієї бази даних." -#: commands/dbcommands.c:2094 storage/ipc/procarray.c:3016 +#: commands/dbcommands.c:2094 storage/ipc/procarray.c:3791 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." @@ -6760,8 +6984,8 @@ msgstr "аргументом %s повинно бути ім'я типу" msgid "invalid argument for %s: \"%s\"" msgstr "невірний аргумент для %s: \"%s\"" -#: commands/dropcmds.c:100 commands/functioncmds.c:1274 -#: utils/adt/ruleutils.c:2633 +#: commands/dropcmds.c:100 commands/functioncmds.c:1410 +#: utils/adt/ruleutils.c:2806 #, c-format msgid "\"%s\" is an aggregate function" msgstr "\"%s\" є функцією агрегату" @@ -6771,19 +6995,19 @@ msgstr "\"%s\" є функцією агрегату" msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "Використайте DROP AGGREGATE, щоб видалити агрегатні функції." -#: commands/dropcmds.c:158 commands/sequence.c:447 commands/tablecmds.c:3266 -#: commands/tablecmds.c:3424 commands/tablecmds.c:3469 -#: commands/tablecmds.c:15038 tcop/utility.c:1309 +#: commands/dropcmds.c:158 commands/sequence.c:447 commands/tablecmds.c:3554 +#: commands/tablecmds.c:3712 commands/tablecmds.c:3757 +#: commands/tablecmds.c:15760 tcop/utility.c:1307 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "відношення \"%s\" не існує, пропускаємо" -#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1199 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1247 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "схеми \"%s\" не існує, пропускаємо" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:259 +#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:272 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "типу \"%s\" не існує, пропускаємо" @@ -6803,7 +7027,7 @@ msgstr "правила сортування \"%s\" не існує, пропус msgid "conversion \"%s\" does not exist, skipping" msgstr "перетворення \"%s\" не існує, пропускаємо" -#: commands/dropcmds.c:293 commands/statscmds.c:479 +#: commands/dropcmds.c:293 commands/statscmds.c:630 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "об'єкту статистики \"%s\" не існує, пропускаємо" @@ -6898,7 +7122,7 @@ msgstr "правила \"%s\" для відношення \"%s\" не існує msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "джерела сторонніх даних \"%s\" не існує, пропускаємо" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1399 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1351 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "серверу \"%s\" не існує, пропускаємо" @@ -6954,58 +7178,58 @@ msgstr "для %s тригери подій не підтримуються" msgid "filter variable \"%s\" specified more than once" msgstr "змінну фільтра \"%s\" вказано кілька разів" -#: commands/event_trigger.c:399 commands/event_trigger.c:443 -#: commands/event_trigger.c:537 +#: commands/event_trigger.c:377 commands/event_trigger.c:421 +#: commands/event_trigger.c:515 #, c-format msgid "event trigger \"%s\" does not exist" msgstr "тригеру подій \"%s\" не існує" -#: commands/event_trigger.c:505 +#: commands/event_trigger.c:483 #, c-format msgid "permission denied to change owner of event trigger \"%s\"" msgstr "немає дозволу для зміни власника тригера подій \"%s\"" -#: commands/event_trigger.c:507 +#: commands/event_trigger.c:485 #, c-format msgid "The owner of an event trigger must be a superuser." msgstr "Власником тригеру подій може бути тільки суперкористувач." -#: commands/event_trigger.c:1325 +#: commands/event_trigger.c:1304 #, c-format msgid "%s can only be called in a sql_drop event trigger function" msgstr "%s можливо викликати лише в подієвій тригерній функції sql_drop" -#: commands/event_trigger.c:1445 commands/event_trigger.c:1466 +#: commands/event_trigger.c:1424 commands/event_trigger.c:1445 #, c-format msgid "%s can only be called in a table_rewrite event trigger function" msgstr "%s можливо викликати лише в подієвій тригерній функції table_rewrite" -#: commands/event_trigger.c:1883 +#: commands/event_trigger.c:1862 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s можливо викликати тільки в подієвій тригерній функції" -#: commands/explain.c:213 +#: commands/explain.c:218 #, c-format msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" msgstr "нерозпізнане значення параметру EXPLAIN \"%s\": \"%s\"" -#: commands/explain.c:220 +#: commands/explain.c:225 #, c-format msgid "unrecognized EXPLAIN option \"%s\"" msgstr "нерозпізнаний параметр EXPLAIN \"%s\"" -#: commands/explain.c:228 +#: commands/explain.c:233 #, c-format msgid "EXPLAIN option WAL requires ANALYZE" msgstr "Параметр WAL оператора EXPLAIN потребує вказівки ANALYZE" -#: commands/explain.c:237 +#: commands/explain.c:242 #, c-format msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "Параметр TIMING оператора EXPLAIN потребує вказівки ANALYZE" -#: commands/extension.c:173 commands/extension.c:3013 +#: commands/extension.c:173 commands/extension.c:3014 #, c-format msgid "extension \"%s\" does not exist" msgstr "розширення \"%s\" не існує" @@ -7073,7 +7297,7 @@ msgid "parameter \"%s\" cannot be set in a secondary extension control file" msgstr "параметр \"%s\" не можна задавати в додатковому керуючому файлі розширення" #: commands/extension.c:552 commands/extension.c:560 commands/extension.c:568 -#: utils/misc/guc.c:6749 +#: utils/misc/guc.c:7093 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "параметр \"%s\" потребує логічного значення" @@ -7103,147 +7327,152 @@ msgstr "параметр \"schema\" не може бути вказаним, к msgid "transaction control statements are not allowed within an extension script" msgstr "в скрипті розширення не повинно бути операторів управління транзакціями" -#: commands/extension.c:861 +#: commands/extension.c:862 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "немає дозволу для створення розширення %s\"" -#: commands/extension.c:864 +#: commands/extension.c:865 #, c-format msgid "Must have CREATE privilege on current database to create this extension." msgstr "Необхідно мати право CREATE для поточної бази даних щоб створити це розширення." -#: commands/extension.c:865 +#: commands/extension.c:866 #, c-format msgid "Must be superuser to create this extension." msgstr "Тільки суперкористувач може створити це розширення." -#: commands/extension.c:869 +#: commands/extension.c:870 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "немає дозволу для оновлення розширення %s\"" -#: commands/extension.c:872 +#: commands/extension.c:873 #, c-format msgid "Must have CREATE privilege on current database to update this extension." msgstr "Необхідно мати право CREATE для поточної бази даних щоб оновити це розширення." -#: commands/extension.c:873 +#: commands/extension.c:874 #, c-format msgid "Must be superuser to update this extension." msgstr "Тільки суперкористувач може оновити це розширення." -#: commands/extension.c:1200 +#: commands/extension.c:1201 #, c-format msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" msgstr "розширення \"%s\" не має жодного шляху оновлення від версії \"%s\" до версії \"%s\"" -#: commands/extension.c:1408 commands/extension.c:3074 +#: commands/extension.c:1409 commands/extension.c:3075 #, c-format msgid "version to install must be specified" msgstr "для інсталяції слід указати версію" -#: commands/extension.c:1445 +#: commands/extension.c:1446 #, c-format msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" msgstr "розширення \"%s\" не має ні скрипту для встановлення, ні шляху оновлення для версії \"%s\"" -#: commands/extension.c:1479 +#: commands/extension.c:1480 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "розширення \"%s\" треба встановлювати в схемі \"%s\"" -#: commands/extension.c:1639 +#: commands/extension.c:1640 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "виявлено циклічну залежність між розширеннями \"%s\" і \"%s\"" -#: commands/extension.c:1644 +#: commands/extension.c:1645 #, c-format msgid "installing required extension \"%s\"" msgstr "встановлення необхідних розширень \"%s\"" -#: commands/extension.c:1667 +#: commands/extension.c:1668 #, c-format msgid "required extension \"%s\" is not installed" msgstr "необхідні розширення \"%s\" не встановлено" -#: commands/extension.c:1670 +#: commands/extension.c:1671 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "Використайте CREATE EXTENSION ... CASCADE також для встановлення необхідних розширень." -#: commands/extension.c:1705 +#: commands/extension.c:1706 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "розширення \"%s\" вже існує, пропускаємо" -#: commands/extension.c:1712 +#: commands/extension.c:1713 #, c-format msgid "extension \"%s\" already exists" msgstr "розширення \"%s\" вже існує" -#: commands/extension.c:1723 +#: commands/extension.c:1724 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "вкладенні оператори CREATE EXTENSION не підтримуються" -#: commands/extension.c:1896 +#: commands/extension.c:1897 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "неможливо видалити розширення \"%s\", оскільки воно змінюється" -#: commands/extension.c:2457 +#: commands/extension.c:2458 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "%s можна викликати лише з SQL-скрипта, виконаного CREATE EXTENSION" -#: commands/extension.c:2469 +#: commands/extension.c:2470 #, c-format msgid "OID %u does not refer to a table" msgstr "OID %u не посилається на таблицю" -#: commands/extension.c:2474 +#: commands/extension.c:2475 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "таблиця \"%s\" не є членом створеного розширення" -#: commands/extension.c:2828 +#: commands/extension.c:2829 #, c-format msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" msgstr "неможливо перемістити розширення \"%s\" в схему \"%s\", оскільки розширення містить схему" -#: commands/extension.c:2869 commands/extension.c:2932 +#: commands/extension.c:2870 commands/extension.c:2933 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "розширення \"%s\" не підтримує SET SCHEMA" -#: commands/extension.c:2934 +#: commands/extension.c:2935 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "%s не є схемою розширення \"%s\"" -#: commands/extension.c:2993 +#: commands/extension.c:2994 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "вкладенні оператори ALTER EXTENSION не підтримуються" -#: commands/extension.c:3085 +#: commands/extension.c:3086 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "версія \"%s\" розширення \"%s\" вже встановлена" -#: commands/extension.c:3336 +#: commands/extension.c:3298 +#, c-format +msgid "cannot add an object of this type to an extension" +msgstr "додати об'єкт цього типу до розширення не можна" + +#: commands/extension.c:3364 #, c-format msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "неможливо додати схему \"%s\" до розширення \"%s\", оскільки схема містить розширення" -#: commands/extension.c:3364 +#: commands/extension.c:3392 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s не є членом розширення \"%s\"" -#: commands/extension.c:3430 +#: commands/extension.c:3458 #, c-format msgid "file \"%s\" is too large" msgstr "файл \"%s\" занадто великий" @@ -7308,383 +7537,403 @@ msgstr "при зміні обробника в обгортці сторонн msgid "changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid" msgstr "при зміні функції перевірки в обгортці сторонніх даних параметри залежних об'єктів можуть стати невірними" -#: commands/foreigncmds.c:895 +#: commands/foreigncmds.c:871 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "сервер \"%s\" вже існує, пропускаємо" -#: commands/foreigncmds.c:1183 +#: commands/foreigncmds.c:1135 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "зіставлення користувача \"%s\" для сервера \"%s\" вже існує, пропускаємо" -#: commands/foreigncmds.c:1193 +#: commands/foreigncmds.c:1145 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "зіставлення користувача \"%s\" для сервера \"%s\" вже існує\"" -#: commands/foreigncmds.c:1293 commands/foreigncmds.c:1413 +#: commands/foreigncmds.c:1245 commands/foreigncmds.c:1365 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "зіставлення користувача \"%s\" не існує для сервера \"%s\"" -#: commands/foreigncmds.c:1418 +#: commands/foreigncmds.c:1370 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "зіставлення користувача \"%s\" не існує для сервера \"%s\", пропускаємо" -#: commands/foreigncmds.c:1569 foreign/foreign.c:389 +#: commands/foreigncmds.c:1498 foreign/foreign.c:389 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "джерело сторонніх даних \"%s\" не має обробника" -#: commands/foreigncmds.c:1575 +#: commands/foreigncmds.c:1504 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "джерело сторонніх даних \"%s\" не підтримує IMPORT FOREIGN SCHEMA" -#: commands/foreigncmds.c:1678 +#: commands/foreigncmds.c:1606 #, c-format msgid "importing foreign table \"%s\"" msgstr "імпорт сторонньої таблиці \"%s\"" -#: commands/functioncmds.c:104 +#: commands/functioncmds.c:108 #, c-format msgid "SQL function cannot return shell type %s" msgstr "SQL-функція не може повертати тип оболонки %s" -#: commands/functioncmds.c:109 +#: commands/functioncmds.c:113 #, c-format msgid "return type %s is only a shell" msgstr "тип, що повертається, %s - лише оболонка" -#: commands/functioncmds.c:139 parser/parse_type.c:354 +#: commands/functioncmds.c:143 parser/parse_type.c:354 #, c-format msgid "type modifier cannot be specified for shell type \"%s\"" msgstr "для типу оболонки \"%s\" неможливо вказати модифікатор типу" -#: commands/functioncmds.c:145 +#: commands/functioncmds.c:149 #, c-format msgid "type \"%s\" is not yet defined" msgstr "тип \"%s\" все ще не визначений" -#: commands/functioncmds.c:146 +#: commands/functioncmds.c:150 #, c-format msgid "Creating a shell type definition." msgstr "Створення визначення типу оболонки." -#: commands/functioncmds.c:238 +#: commands/functioncmds.c:249 #, c-format msgid "SQL function cannot accept shell type %s" msgstr "SQL-функція не може приймати значення типу оболонки %s" -#: commands/functioncmds.c:244 +#: commands/functioncmds.c:255 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "агрегатна функція не може приймати значення типу оболонки %s" -#: commands/functioncmds.c:249 +#: commands/functioncmds.c:260 #, c-format msgid "argument type %s is only a shell" msgstr "тип аргументу %s - лише оболонка" -#: commands/functioncmds.c:259 +#: commands/functioncmds.c:270 #, c-format msgid "type %s does not exist" msgstr "тип \"%s\" не існує" -#: commands/functioncmds.c:273 +#: commands/functioncmds.c:284 #, c-format msgid "aggregates cannot accept set arguments" msgstr "агрегатні функції не приймають в аргументах набору" -#: commands/functioncmds.c:277 +#: commands/functioncmds.c:288 #, c-format msgid "procedures cannot accept set arguments" msgstr "процедури не приймають в аргументах набору" -#: commands/functioncmds.c:281 +#: commands/functioncmds.c:292 #, c-format msgid "functions cannot accept set arguments" msgstr "функції не приймають в аргументах набору" -#: commands/functioncmds.c:289 -#, c-format -msgid "procedures cannot have OUT arguments" -msgstr "процедури не можуть мати OUT-аргументи" - -#: commands/functioncmds.c:290 -#, c-format -msgid "INOUT arguments are permitted." -msgstr "Аргументи INOUT дозволені." - -#: commands/functioncmds.c:300 +#: commands/functioncmds.c:302 #, c-format msgid "VARIADIC parameter must be the last input parameter" msgstr "Параметр VARIADIC повинен бути останнім в списку вхідних параметрів" -#: commands/functioncmds.c:331 +#: commands/functioncmds.c:322 +#, c-format +msgid "VARIADIC parameter must be the last parameter" +msgstr "Параметр VARIADIC повинен бути останнім параметром" + +#: commands/functioncmds.c:347 #, c-format msgid "VARIADIC parameter must be an array" msgstr "Параметр VARIADIC повинен бути масивом" -#: commands/functioncmds.c:371 +#: commands/functioncmds.c:392 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "ім'я параметру «%s» використано декілька разів" -#: commands/functioncmds.c:386 +#: commands/functioncmds.c:410 #, c-format msgid "only input parameters can have default values" msgstr "тільки ввідні параметри можуть мати значення за замовчуванням" -#: commands/functioncmds.c:401 +#: commands/functioncmds.c:425 #, c-format msgid "cannot use table references in parameter default value" msgstr "у значенні параметру за замовчуванням не можна посилатись на таблиці" -#: commands/functioncmds.c:425 +#: commands/functioncmds.c:449 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "вхідні параметри, наступні за параметром зі значенням \"за замовчуванням\", також повинні мати значення \"за замовчуванням\"" -#: commands/functioncmds.c:577 commands/functioncmds.c:768 +#: commands/functioncmds.c:459 +#, c-format +msgid "procedure OUT parameters cannot appear after one with a default value" +msgstr "параметри процедури OUT не можуть з'являтись після параметра зі значенням за замовчуванням" + +#: commands/functioncmds.c:611 commands/functioncmds.c:802 #, c-format msgid "invalid attribute in procedure definition" msgstr "некоректний атрибут у визначенні процедури" -#: commands/functioncmds.c:673 +#: commands/functioncmds.c:707 #, c-format msgid "support function %s must return type %s" msgstr "функція підтримки %s повинна повертати тип %s" -#: commands/functioncmds.c:684 +#: commands/functioncmds.c:718 #, c-format msgid "must be superuser to specify a support function" msgstr "для уточнення функції підтримки потрібно бути суперкористувачем" -#: commands/functioncmds.c:800 +#: commands/functioncmds.c:851 commands/functioncmds.c:1455 +#, c-format +msgid "COST must be positive" +msgstr "COST має бути додатнім" + +#: commands/functioncmds.c:859 commands/functioncmds.c:1463 +#, c-format +msgid "ROWS must be positive" +msgstr "Значення ROWS повинно бути позитивним" + +#: commands/functioncmds.c:888 #, c-format msgid "no function body specified" msgstr "не вказано тіло функції" -#: commands/functioncmds.c:810 +#: commands/functioncmds.c:893 #, c-format -msgid "no language specified" -msgstr "не вказано жодної мови" +msgid "duplicate function body specified" +msgstr "вказано тіло дубліката функції" -#: commands/functioncmds.c:835 commands/functioncmds.c:1319 +#: commands/functioncmds.c:898 #, c-format -msgid "COST must be positive" -msgstr "COST має бути додатнім" +msgid "inline SQL function body only valid for language SQL" +msgstr "вбудоване тіло функції SQL допустиме лише для мови SQL" -#: commands/functioncmds.c:843 commands/functioncmds.c:1327 +#: commands/functioncmds.c:940 #, c-format -msgid "ROWS must be positive" -msgstr "Значення ROWS повинно бути позитивним" +msgid "SQL function with unquoted function body cannot have polymorphic arguments" +msgstr "SQL функція з тілом без лапок не може мати поліморфні аргументи" + +#: commands/functioncmds.c:966 commands/functioncmds.c:985 +#, c-format +msgid "%s is not yet supported in unquoted SQL function body" +msgstr "%s ще не підтримується у тілі SQL функції без лапок" -#: commands/functioncmds.c:897 +#: commands/functioncmds.c:1013 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "для мови \"%s\" потрібен лише один вираз AS" -#: commands/functioncmds.c:995 commands/functioncmds.c:2048 -#: commands/proclang.c:259 +#: commands/functioncmds.c:1118 +#, c-format +msgid "no language specified" +msgstr "не вказано жодної мови" + +#: commands/functioncmds.c:1126 commands/functioncmds.c:2128 +#: commands/proclang.c:237 #, c-format msgid "language \"%s\" does not exist" msgstr "мови \"%s\" не існує" -#: commands/functioncmds.c:997 commands/functioncmds.c:2050 +#: commands/functioncmds.c:1128 commands/functioncmds.c:2130 #, c-format msgid "Use CREATE EXTENSION to load the language into the database." msgstr "Використайте CREATE EXTENSION, щоб завантажити мову в базу даних." -#: commands/functioncmds.c:1032 commands/functioncmds.c:1311 +#: commands/functioncmds.c:1163 commands/functioncmds.c:1447 #, c-format msgid "only superuser can define a leakproof function" msgstr "лише суперкористувачі можуть визначити функцію з атрибутом leakproof" -#: commands/functioncmds.c:1081 +#: commands/functioncmds.c:1214 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "результат функції повинен мати тип %s відповідно з параметрами OUT" -#: commands/functioncmds.c:1094 +#: commands/functioncmds.c:1227 #, c-format msgid "function result type must be specified" msgstr "необхідно вказати тип результату функції" -#: commands/functioncmds.c:1146 commands/functioncmds.c:1331 +#: commands/functioncmds.c:1281 commands/functioncmds.c:1467 #, c-format msgid "ROWS is not applicable when function does not return a set" msgstr "ROWS не застосовується, коли функція не повертає набір" -#: commands/functioncmds.c:1431 +#: commands/functioncmds.c:1567 #, c-format msgid "source data type %s is a pseudo-type" msgstr "вихідний тип даних %s є псевдотипом" -#: commands/functioncmds.c:1437 +#: commands/functioncmds.c:1573 #, c-format msgid "target data type %s is a pseudo-type" msgstr "цільовий тип даних %s є псевдотипом" -#: commands/functioncmds.c:1461 +#: commands/functioncmds.c:1597 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "приведення буде ігноруватися, оскільки вихідні дані мають тип домену" -#: commands/functioncmds.c:1466 +#: commands/functioncmds.c:1602 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "приведення буде ігноруватися, оскільки цільові дані мають тип домену" -#: commands/functioncmds.c:1491 +#: commands/functioncmds.c:1627 #, c-format msgid "cast function must take one to three arguments" msgstr "функція приведення повинна приймати від одного до трьох аргументів" -#: commands/functioncmds.c:1495 +#: commands/functioncmds.c:1631 #, c-format msgid "argument of cast function must match or be binary-coercible from source data type" msgstr "аргумент функції приведення повинен співпадати або бути двійково-сумісним з вихідним типом даних" -#: commands/functioncmds.c:1499 +#: commands/functioncmds.c:1635 #, c-format msgid "second argument of cast function must be type %s" msgstr "другий аргумент функції приведення повинен мати тип %s" -#: commands/functioncmds.c:1504 +#: commands/functioncmds.c:1640 #, c-format msgid "third argument of cast function must be type %s" msgstr "третій аргумент функції приведення повинен мати тип %s" -#: commands/functioncmds.c:1509 +#: commands/functioncmds.c:1645 #, c-format msgid "return data type of cast function must match or be binary-coercible to target data type" msgstr "тип вертаючих даних функції приведення повинен співпадати або бути двійково-сумісним з цільовим типом даних" -#: commands/functioncmds.c:1520 +#: commands/functioncmds.c:1656 #, c-format msgid "cast function must not be volatile" msgstr "функція приведення не може бути змінною (volatile)" -#: commands/functioncmds.c:1525 +#: commands/functioncmds.c:1661 #, c-format msgid "cast function must be a normal function" msgstr "функція приведення повинна бути звичайною функцією" -#: commands/functioncmds.c:1529 +#: commands/functioncmds.c:1665 #, c-format msgid "cast function must not return a set" msgstr "функція приведення не може вертати набір" -#: commands/functioncmds.c:1555 +#: commands/functioncmds.c:1691 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "тільки суперкористувач може створити приведення WITHOUT FUNCTION" -#: commands/functioncmds.c:1570 +#: commands/functioncmds.c:1706 #, c-format msgid "source and target data types are not physically compatible" msgstr "вихідний та цільовий типи даних не сумісні фізично" -#: commands/functioncmds.c:1585 +#: commands/functioncmds.c:1721 #, c-format msgid "composite data types are not binary-compatible" msgstr "складені типи даних не сумісні на двійковому рівні" -#: commands/functioncmds.c:1591 +#: commands/functioncmds.c:1727 #, c-format msgid "enum data types are not binary-compatible" msgstr "типи переліку не сумісні на двійковому рівні" -#: commands/functioncmds.c:1597 +#: commands/functioncmds.c:1733 #, c-format msgid "array data types are not binary-compatible" msgstr "типи масивів не сумісні на двійковому рівні" -#: commands/functioncmds.c:1614 +#: commands/functioncmds.c:1750 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "типи доменів не можуть вважатись сумісними на двійковому рівні" -#: commands/functioncmds.c:1624 +#: commands/functioncmds.c:1760 #, c-format msgid "source data type and target data type are the same" msgstr "вихідний тип даних співпадає з цільовим типом" -#: commands/functioncmds.c:1682 +#: commands/functioncmds.c:1793 #, c-format msgid "transform function must not be volatile" msgstr "функція перетворення не може бути мінливою" -#: commands/functioncmds.c:1686 +#: commands/functioncmds.c:1797 #, c-format msgid "transform function must be a normal function" msgstr "функція перетворення повинна бути нормальною функцією" -#: commands/functioncmds.c:1690 +#: commands/functioncmds.c:1801 #, c-format msgid "transform function must not return a set" msgstr "функція перетворення не повинна повертати набір" -#: commands/functioncmds.c:1694 +#: commands/functioncmds.c:1805 #, c-format msgid "transform function must take one argument" msgstr "функція перетворення повинна приймати один аргумент" -#: commands/functioncmds.c:1698 +#: commands/functioncmds.c:1809 #, c-format msgid "first argument of transform function must be type %s" msgstr "перший аргумент функції перетворення повинен бути типу %s" -#: commands/functioncmds.c:1736 +#: commands/functioncmds.c:1848 #, c-format msgid "data type %s is a pseudo-type" msgstr "тип даних %s є псевдотипом" -#: commands/functioncmds.c:1742 +#: commands/functioncmds.c:1854 #, c-format msgid "data type %s is a domain" msgstr "тип даних %s є доменом" -#: commands/functioncmds.c:1782 +#: commands/functioncmds.c:1894 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "результат функції FROM SQL має бути типу %s" -#: commands/functioncmds.c:1808 +#: commands/functioncmds.c:1920 #, c-format msgid "return data type of TO SQL function must be the transform data type" msgstr "результат функції TO SQL повинен мати тип даних перетворення" -#: commands/functioncmds.c:1837 +#: commands/functioncmds.c:1949 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "перетворення для типу %s мови \"%s\" вже існує" -#: commands/functioncmds.c:1929 +#: commands/functioncmds.c:2036 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "перетворення для типу %s мови \"%s\" не існує" -#: commands/functioncmds.c:1980 +#: commands/functioncmds.c:2060 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "функція %s вже існує в схемі \"%s\"" -#: commands/functioncmds.c:2035 +#: commands/functioncmds.c:2115 #, c-format msgid "no inline code specified" msgstr "не вказано жодного впровадженого коду" -#: commands/functioncmds.c:2081 +#: commands/functioncmds.c:2161 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "мова \"%s\" не підтримує виконання впровадженого коду" -#: commands/functioncmds.c:2193 +#: commands/functioncmds.c:2256 #, c-format msgid "cannot pass more than %d argument to a procedure" msgid_plural "cannot pass more than %d arguments to a procedure" @@ -7693,300 +7942,303 @@ msgstr[1] "процедурі неможливо передати більше % msgstr[2] "процедурі неможливо передати більше %d аргументів" msgstr[3] "процедурі неможливо передати більше %d аргументів" -#: commands/indexcmds.c:590 +#: commands/indexcmds.c:618 #, c-format msgid "must specify at least one column" msgstr "треба вказати хоча б один стовпець" -#: commands/indexcmds.c:594 +#: commands/indexcmds.c:622 #, c-format msgid "cannot use more than %d columns in an index" msgstr "не можна використовувати більше ніж %d стовпців в індексі" -#: commands/indexcmds.c:633 +#: commands/indexcmds.c:661 #, c-format msgid "cannot create index on foreign table \"%s\"" msgstr "неможливо створити індекс в сторонній таблиці \"%s\"" -#: commands/indexcmds.c:664 +#: commands/indexcmds.c:692 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "неможливо створити індекс в секційній таблиці \"%s\" паралельним способом" -#: commands/indexcmds.c:669 +#: commands/indexcmds.c:697 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "створити обмеження-виняток в секціонованій таблиці \"%s\" не можна" -#: commands/indexcmds.c:679 +#: commands/indexcmds.c:707 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "неможливо створити індекси в тимчасових таблицях в інших сеансах" -#: commands/indexcmds.c:717 commands/tablecmds.c:704 commands/tablespace.c:1173 +#: commands/indexcmds.c:745 commands/tablecmds.c:747 commands/tablespace.c:1185 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "для секціонованих відношень не можна вказати табличний простір за замовчуванням" -#: commands/indexcmds.c:749 commands/tablecmds.c:739 commands/tablecmds.c:13162 -#: commands/tablecmds.c:13276 +#: commands/indexcmds.c:777 commands/tablecmds.c:782 commands/tablecmds.c:3254 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "тільки спільні відношення можуть бути поміщені в табличний pg_global" -#: commands/indexcmds.c:782 +#: commands/indexcmds.c:810 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "застарілий метод доступу \"rtree\" підміняється методом \"gist\"" -#: commands/indexcmds.c:803 +#: commands/indexcmds.c:831 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "методу доступу \"%s\" не підтримує унікальні індекси" -#: commands/indexcmds.c:808 +#: commands/indexcmds.c:836 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "методу доступу \"%s\" не підтримує включені стовпці" -#: commands/indexcmds.c:813 +#: commands/indexcmds.c:841 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "метод доступу \"%s\" не підтримує багатостовпцеві індекси" -#: commands/indexcmds.c:818 +#: commands/indexcmds.c:846 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "метод доступу \"%s\" не підтримує обмеження-винятки" -#: commands/indexcmds.c:941 +#: commands/indexcmds.c:969 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "не можна зіставити ключ розділу з індексом використовуючи метод доступу \"%s\"" -#: commands/indexcmds.c:951 +#: commands/indexcmds.c:979 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "непідтримуване обмеження \"%s\" з визначенням ключа секціонування" -#: commands/indexcmds.c:953 +#: commands/indexcmds.c:981 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "обмеження %s не можуть використовуватись, якщо ключі секціонування включають вирази." -#: commands/indexcmds.c:992 +#: commands/indexcmds.c:1020 #, c-format -msgid "insufficient columns in %s constraint definition" -msgstr "недостатньо стовпців у визначенні обмеження %s" +msgid "unique constraint on partitioned table must include all partitioning columns" +msgstr "обмеження унікальності в секціонованій таблиці повинно включати всі стовпці секціонування" -#: commands/indexcmds.c:994 +#: commands/indexcmds.c:1021 #, c-format msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." msgstr "в обмеженні %s таблиці\"%s\" не вистачає стовпця \"%s\", що є частиною ключа секціонування." -#: commands/indexcmds.c:1013 commands/indexcmds.c:1032 +#: commands/indexcmds.c:1040 commands/indexcmds.c:1059 #, c-format msgid "index creation on system columns is not supported" msgstr "створення індексу для системних стовпців не підтримується" -#: commands/indexcmds.c:1057 -#, c-format -msgid "%s %s will create implicit index \"%s\" for table \"%s\"" -msgstr "%s %s створить неявний індекс \"%s\" для таблиці \"%s\"" - -#: commands/indexcmds.c:1198 tcop/utility.c:1495 +#: commands/indexcmds.c:1231 tcop/utility.c:1493 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "не можна створити унікальний індекс в секціонованій таблиці \"%s\"" -#: commands/indexcmds.c:1200 tcop/utility.c:1497 +#: commands/indexcmds.c:1233 tcop/utility.c:1495 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "Таблиця \"%s\" містить секції, які є зовнішніми таблицями." -#: commands/indexcmds.c:1629 +#: commands/indexcmds.c:1683 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "функції в предикаті індексу повинні бути позначені як IMMUTABLE" -#: commands/indexcmds.c:1695 parser/parse_utilcmd.c:2440 -#: parser/parse_utilcmd.c:2575 +#: commands/indexcmds.c:1749 parser/parse_utilcmd.c:2515 +#: parser/parse_utilcmd.c:2650 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "вказаний у ключі стовпець \"%s\" не існує" -#: commands/indexcmds.c:1719 parser/parse_utilcmd.c:1776 +#: commands/indexcmds.c:1773 parser/parse_utilcmd.c:1814 #, c-format msgid "expressions are not supported in included columns" msgstr "вирази не підтримуються у включених стовпцях " -#: commands/indexcmds.c:1760 +#: commands/indexcmds.c:1814 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "функції в індексному виразі повинні бути позначені як IMMUTABLE" -#: commands/indexcmds.c:1775 +#: commands/indexcmds.c:1829 #, c-format msgid "including column does not support a collation" msgstr "включені стовпці не підтримують правила сортування" -#: commands/indexcmds.c:1779 +#: commands/indexcmds.c:1833 #, c-format msgid "including column does not support an operator class" msgstr "включені стовпці не підтримують класи операторів" -#: commands/indexcmds.c:1783 +#: commands/indexcmds.c:1837 #, c-format msgid "including column does not support ASC/DESC options" msgstr "включені стовпці не підтримують параметри ASC/DESC" -#: commands/indexcmds.c:1787 +#: commands/indexcmds.c:1841 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "включені стовпці не підтримують параметри NULLS FIRST/LAST" -#: commands/indexcmds.c:1814 +#: commands/indexcmds.c:1868 #, c-format msgid "could not determine which collation to use for index expression" msgstr "не вдалося визначити, яке правило сортування використати для індексного виразу" -#: commands/indexcmds.c:1822 commands/tablecmds.c:16042 commands/typecmds.c:771 -#: parser/parse_expr.c:2850 parser/parse_type.c:566 parser/parse_utilcmd.c:3649 -#: parser/parse_utilcmd.c:4210 utils/adt/misc.c:503 +#: commands/indexcmds.c:1876 commands/tablecmds.c:16765 commands/typecmds.c:810 +#: parser/parse_expr.c:2680 parser/parse_type.c:566 parser/parse_utilcmd.c:3781 +#: utils/adt/misc.c:599 #, c-format msgid "collations are not supported by type %s" msgstr "тип %s не підтримує правила сортування" -#: commands/indexcmds.c:1860 +#: commands/indexcmds.c:1914 #, c-format msgid "operator %s is not commutative" msgstr "оператор %s не комутативний" -#: commands/indexcmds.c:1862 +#: commands/indexcmds.c:1916 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "В обмеженнях-виключеннях можуть використовуватись лише комутативні оператори." -#: commands/indexcmds.c:1888 +#: commands/indexcmds.c:1942 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "оператор %s не є членом сімейства операторів \"%s\"" -#: commands/indexcmds.c:1891 +#: commands/indexcmds.c:1945 #, c-format msgid "The exclusion operator must be related to the index operator class for the constraint." msgstr "Оператор винятку для обмеження повинен відноситись до класу операторів індексу." -#: commands/indexcmds.c:1926 +#: commands/indexcmds.c:1980 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "метод доступу \"%s\" не підтримує параметри ASC/DESC" -#: commands/indexcmds.c:1931 +#: commands/indexcmds.c:1985 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "метод доступу \"%s\" не підтримує параметри NULLS FIRST/LAST" -#: commands/indexcmds.c:1977 commands/tablecmds.c:16067 -#: commands/tablecmds.c:16073 commands/typecmds.c:1945 +#: commands/indexcmds.c:2031 commands/tablecmds.c:16790 +#: commands/tablecmds.c:16796 commands/typecmds.c:2318 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "тип даних %s не має класу операторів за замовчуванням для методу доступу \"%s\"" -#: commands/indexcmds.c:1979 +#: commands/indexcmds.c:2033 #, c-format msgid "You must specify an operator class for the index or define a default operator class for the data type." msgstr "Ви повинні вказати клас операторів для індексу або визначити клас операторів за замовчуванням для цього типу даних." -#: commands/indexcmds.c:2008 commands/indexcmds.c:2016 -#: commands/opclasscmds.c:208 +#: commands/indexcmds.c:2062 commands/indexcmds.c:2070 +#: commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "клас операторів \"%s\" не існує для методу доступу \"%s\"" -#: commands/indexcmds.c:2030 commands/typecmds.c:1933 +#: commands/indexcmds.c:2084 commands/typecmds.c:2306 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "клас операторів \"%s\" не приймає тип даних %s" -#: commands/indexcmds.c:2120 +#: commands/indexcmds.c:2174 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "для типу даних %s є кілька класів операторів за замовчуванням" -#: commands/indexcmds.c:2569 +#: commands/indexcmds.c:2502 +#, c-format +msgid "unrecognized REINDEX option \"%s\"" +msgstr "нерозпізнаний параметр REINDEX \"%s\"" + +#: commands/indexcmds.c:2726 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "таблиця \"%s\" не має індексів, які можна переіндексувати паралельно" -#: commands/indexcmds.c:2580 +#: commands/indexcmds.c:2740 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "таблиця \"%s\" не має індексів для переіндексування" -#: commands/indexcmds.c:2619 commands/indexcmds.c:2893 -#: commands/indexcmds.c:2986 +#: commands/indexcmds.c:2780 commands/indexcmds.c:3287 +#: commands/indexcmds.c:3415 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "не можна конкурентно переіндексувати системні каталоги" -#: commands/indexcmds.c:2642 +#: commands/indexcmds.c:2803 #, c-format msgid "can only reindex the currently open database" msgstr "переіндексувати можна тільки наразі відкриту базу даних" -#: commands/indexcmds.c:2733 +#: commands/indexcmds.c:2891 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "не можна конкурентно переіндексувати системні каталоги, пропускаємо" -#: commands/indexcmds.c:2785 commands/indexcmds.c:3466 +#: commands/indexcmds.c:2924 +#, c-format +msgid "cannot move system relations, skipping all" +msgstr "не можна перемістити системні відношення, пропускаються усі" + +#: commands/indexcmds.c:2971 +#, c-format +msgid "while reindexing partitioned table \"%s.%s\"" +msgstr "під час переіндексування секціонованої таблиці \"%s.%s\"" + +#: commands/indexcmds.c:2974 +#, c-format +msgid "while reindexing partitioned index \"%s.%s\"" +msgstr "під час переіндексування секціонованого індексу \"%s.%s\"" + +#: commands/indexcmds.c:3167 commands/indexcmds.c:4003 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "таблиця \"%s.%s\" була переіндексована" -#: commands/indexcmds.c:2908 commands/indexcmds.c:2954 +#: commands/indexcmds.c:3319 commands/indexcmds.c:3371 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "неможливо переіндексувати пошкоджений індекс \"%s.%s\" паралельно, пропускається" -#: commands/indexcmds.c:2914 +#: commands/indexcmds.c:3325 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "неможливо переіндексувати індекс обмеження-виключення \"%s.%s\" паралельно, пропускається" -#: commands/indexcmds.c:2996 -#, c-format -msgid "cannot reindex invalid index on TOAST table concurrently" -msgstr "переіндексувати неприпустимий індекс в таблиці TOAST в даний час не можна" - -#: commands/indexcmds.c:3024 +#: commands/indexcmds.c:3480 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "неможливо переіндексувати цей тип відношень паралельон" -#: commands/indexcmds.c:3448 commands/indexcmds.c:3459 +#: commands/indexcmds.c:3501 #, c-format -msgid "index \"%s.%s\" was reindexed" -msgstr "індекс \"%s.%s\" був перебудований" +msgid "cannot move non-shared relation to tablespace \"%s\"" +msgstr "не можна перемістити не спільне відношення до табличного простору \"%s\"" -#: commands/indexcmds.c:3491 +#: commands/indexcmds.c:3984 commands/indexcmds.c:3996 #, c-format -msgid "REINDEX is not yet implemented for partitioned indexes" -msgstr "REINDEX для секціонованих індексів ще не реалізований" +msgid "index \"%s.%s\" was reindexed" +msgstr "індекс \"%s.%s\" був перебудований" -#: commands/lockcmds.c:91 commands/tablecmds.c:5629 commands/trigger.c:295 -#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:928 +#: commands/lockcmds.c:92 commands/tablecmds.c:5973 commands/trigger.c:307 +#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:938 #, c-format msgid "\"%s\" is not a table or view" msgstr "\"%s\" - не таблиця або подання" -#: commands/lockcmds.c:213 rewrite/rewriteHandler.c:1977 -#: rewrite/rewriteHandler.c:3782 -#, c-format -msgid "infinite recursion detected in rules for relation \"%s\"" -msgstr "виявлена безкінечна рекурсія у правилах для відносин \"%s\"" - #: commands/matview.c:182 #, c-format msgid "CONCURRENTLY cannot be used when the materialized view is not populated" @@ -8007,234 +8259,234 @@ msgstr "оновити матеріалізоване подання \"%s\" па msgid "Create a unique index with no WHERE clause on one or more columns of the materialized view." msgstr "Створіть унікальний індекс без речення WHERE для одного або більше стовпців матеріалізованого подання." -#: commands/matview.c:641 +#: commands/matview.c:659 #, c-format msgid "new data for materialized view \"%s\" contains duplicate rows without any null columns" msgstr "нові дані для матеріалізованого подання \"%s\" містять рядки, які дублюються (без урахування стовпців з null)" -#: commands/matview.c:643 +#: commands/matview.c:661 #, c-format msgid "Row: %s" msgstr "Рядок: %s" -#: commands/opclasscmds.c:127 +#: commands/opclasscmds.c:124 #, c-format msgid "operator family \"%s\" does not exist for access method \"%s\"" msgstr "сімейство операторів \"%s\" не існує для методу доступу \"%s\"" -#: commands/opclasscmds.c:269 +#: commands/opclasscmds.c:266 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists" msgstr "сімейство операторів \"%s\" для методу доступу \"%s\" вже існує" -#: commands/opclasscmds.c:414 +#: commands/opclasscmds.c:411 #, c-format msgid "must be superuser to create an operator class" msgstr "тільки суперкористувач може створити клас операторів" -#: commands/opclasscmds.c:487 commands/opclasscmds.c:869 -#: commands/opclasscmds.c:993 +#: commands/opclasscmds.c:484 commands/opclasscmds.c:901 +#: commands/opclasscmds.c:1047 #, c-format msgid "invalid operator number %d, must be between 1 and %d" msgstr "неприпустимий номер оператора %d, число має бути між 1 і %d" -#: commands/opclasscmds.c:531 commands/opclasscmds.c:913 -#: commands/opclasscmds.c:1008 +#: commands/opclasscmds.c:529 commands/opclasscmds.c:951 +#: commands/opclasscmds.c:1063 #, c-format msgid "invalid function number %d, must be between 1 and %d" msgstr "неприпустимий номер функції %d, число має бути між 1 і %d" -#: commands/opclasscmds.c:559 +#: commands/opclasscmds.c:558 #, c-format msgid "storage type specified more than once" msgstr "тип сховища вказано більше одного разу" -#: commands/opclasscmds.c:586 +#: commands/opclasscmds.c:585 #, c-format msgid "storage type cannot be different from data type for access method \"%s\"" msgstr "тип сховища не може відрізнятися від типу даних для методу доступу \"%s\"" -#: commands/opclasscmds.c:602 +#: commands/opclasscmds.c:601 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists" msgstr "клас операторів \"%s\" для методу доступу \"%s\" вже існує" -#: commands/opclasscmds.c:630 +#: commands/opclasscmds.c:629 #, c-format msgid "could not make operator class \"%s\" be default for type %s" msgstr "клас операторів \"%s\" не вдалося зробити класом за замовчуванням для типу %s" -#: commands/opclasscmds.c:633 +#: commands/opclasscmds.c:632 #, c-format msgid "Operator class \"%s\" already is the default." msgstr "Клас операторів \"%s\" вже є класом за замовчуванням." -#: commands/opclasscmds.c:761 +#: commands/opclasscmds.c:792 #, c-format msgid "must be superuser to create an operator family" msgstr "тільки суперкористувач може створити сімейство операторів" -#: commands/opclasscmds.c:821 +#: commands/opclasscmds.c:852 #, c-format msgid "must be superuser to alter an operator family" msgstr "тільки суперкористувач може змінити сімейство операторів" -#: commands/opclasscmds.c:878 +#: commands/opclasscmds.c:910 #, c-format msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" msgstr "типи аргументу оператора повинні бути вказані в ALTER OPERATOR FAMILY" -#: commands/opclasscmds.c:941 +#: commands/opclasscmds.c:985 #, c-format msgid "STORAGE cannot be specified in ALTER OPERATOR FAMILY" msgstr "STORAGE не може бути вказано в ALTER OPERATOR FAMILY" -#: commands/opclasscmds.c:1063 +#: commands/opclasscmds.c:1119 #, c-format msgid "one or two argument types must be specified" msgstr "треба вказати один або два типи аргументу" -#: commands/opclasscmds.c:1089 +#: commands/opclasscmds.c:1145 #, c-format msgid "index operators must be binary" msgstr "індексні оператори повинні бути бінарними" -#: commands/opclasscmds.c:1108 +#: commands/opclasscmds.c:1164 #, c-format msgid "access method \"%s\" does not support ordering operators" msgstr "метод доступу \"%s\" не підтримує сортувальних операторів" -#: commands/opclasscmds.c:1119 +#: commands/opclasscmds.c:1175 #, c-format msgid "index search operators must return boolean" msgstr "оператори пошуку по індексу повинні повертати логічне значення" -#: commands/opclasscmds.c:1159 +#: commands/opclasscmds.c:1215 #, c-format msgid "associated data types for operator class options parsing functions must match opclass input type" msgstr "пов'язані типи даних для функцій обробки параметрів класів операторів повинні відповідати типу вхідних даних opclass" -#: commands/opclasscmds.c:1166 +#: commands/opclasscmds.c:1222 #, c-format msgid "left and right associated data types for operator class options parsing functions must match" msgstr "ліві та праві пов'язані типи даних для функцій розбору параметрів класів операторів повинні збігатись" -#: commands/opclasscmds.c:1174 +#: commands/opclasscmds.c:1230 #, c-format msgid "invalid operator class options parsing function" msgstr "неприпустима функція розбору параметрів класів операторів" -#: commands/opclasscmds.c:1175 +#: commands/opclasscmds.c:1231 #, c-format msgid "Valid signature of operator class options parsing function is %s." msgstr "Допустимий підпис для функції розбору параметрів класів операторів: %s." -#: commands/opclasscmds.c:1194 +#: commands/opclasscmds.c:1250 #, c-format msgid "btree comparison functions must have two arguments" msgstr "функції порівняння btree повинні мати два аргумента" -#: commands/opclasscmds.c:1198 +#: commands/opclasscmds.c:1254 #, c-format msgid "btree comparison functions must return integer" msgstr "функції порівняння btree повинні повертати ціле число" -#: commands/opclasscmds.c:1215 +#: commands/opclasscmds.c:1271 #, c-format msgid "btree sort support functions must accept type \"internal\"" msgstr "опорні функції сортування btree повинні приймати тип \"internal\"" -#: commands/opclasscmds.c:1219 +#: commands/opclasscmds.c:1275 #, c-format msgid "btree sort support functions must return void" msgstr "опорні функції сортування btree повинні повертати недійсне (void)" -#: commands/opclasscmds.c:1230 +#: commands/opclasscmds.c:1286 #, c-format msgid "btree in_range functions must have five arguments" msgstr "функції in_range для btree повинні приймати п'ять аргументів" -#: commands/opclasscmds.c:1234 +#: commands/opclasscmds.c:1290 #, c-format msgid "btree in_range functions must return boolean" msgstr "функції in_range для btree повинні повертати логічне значення" -#: commands/opclasscmds.c:1250 +#: commands/opclasscmds.c:1306 #, c-format msgid "btree equal image functions must have one argument" msgstr "функції equal image для btree повинні приймати один аргумент" -#: commands/opclasscmds.c:1254 +#: commands/opclasscmds.c:1310 #, c-format msgid "btree equal image functions must return boolean" msgstr "функції equal image для btree повинні повертати логічне значення" -#: commands/opclasscmds.c:1267 +#: commands/opclasscmds.c:1323 #, c-format msgid "btree equal image functions must not be cross-type" msgstr "функції equal image для btree не можуть бути хрестоподібного типу" -#: commands/opclasscmds.c:1277 +#: commands/opclasscmds.c:1333 #, c-format msgid "hash function 1 must have one argument" msgstr "геш-функція 1 повинна приймати один аргумент" -#: commands/opclasscmds.c:1281 +#: commands/opclasscmds.c:1337 #, c-format msgid "hash function 1 must return integer" msgstr "геш-функція 1 повинна повертати ціле число" -#: commands/opclasscmds.c:1288 +#: commands/opclasscmds.c:1344 #, c-format msgid "hash function 2 must have two arguments" msgstr "геш-функція 2 повинна приймати два аргументи" -#: commands/opclasscmds.c:1292 +#: commands/opclasscmds.c:1348 #, c-format msgid "hash function 2 must return bigint" msgstr "геш-функція 2 повинна повертати велике ціле (bigint)" -#: commands/opclasscmds.c:1317 +#: commands/opclasscmds.c:1373 #, c-format msgid "associated data types must be specified for index support function" msgstr "для опорної функції індексів повинні бути вказані пов'язані типи даних" -#: commands/opclasscmds.c:1342 +#: commands/opclasscmds.c:1398 #, c-format msgid "function number %d for (%s,%s) appears more than once" msgstr "номер функції %d для (%s,%s) з'являється більш ніж один раз" -#: commands/opclasscmds.c:1349 +#: commands/opclasscmds.c:1405 #, c-format msgid "operator number %d for (%s,%s) appears more than once" msgstr "номер оператора %d для (%s,%s) з'являється більш ніж один раз" -#: commands/opclasscmds.c:1398 +#: commands/opclasscmds.c:1451 #, c-format msgid "operator %d(%s,%s) already exists in operator family \"%s\"" msgstr "оператор %d(%s,%s) вже існує в сімействі операторів \"%s\"" -#: commands/opclasscmds.c:1515 +#: commands/opclasscmds.c:1557 #, c-format msgid "function %d(%s,%s) already exists in operator family \"%s\"" msgstr "функція %d(%s,%s) вже існує в сімействі операторів \"%s\"" -#: commands/opclasscmds.c:1606 +#: commands/opclasscmds.c:1638 #, c-format msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" msgstr "оператора %d(%s,%s) не існує в сімействі операторів \"%s\"" -#: commands/opclasscmds.c:1646 +#: commands/opclasscmds.c:1678 #, c-format msgid "function %d(%s,%s) does not exist in operator family \"%s\"" msgstr "функції %d(%s,%s) не існує в сімействі операторів \"%s\"" -#: commands/opclasscmds.c:1776 +#: commands/opclasscmds.c:1709 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "клас операторів \"%s\" для методу доступу \"%s\" вже існує в схемі \"%s\"" -#: commands/opclasscmds.c:1799 +#: commands/opclasscmds.c:1732 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "сімейство операторів \"%s\" для методу доступу \"%s\" вже існує в схемі \"%s\"" @@ -8244,7 +8496,7 @@ msgstr "сімейство операторів \"%s\" для методу до msgid "SETOF type not allowed for operator argument" msgstr "Аргументом оператора не може бути тип SETOF" -#: commands/operatorcmds.c:152 commands/operatorcmds.c:467 +#: commands/operatorcmds.c:152 commands/operatorcmds.c:479 #, c-format msgid "operator attribute \"%s\" not recognized" msgstr "атрибут оператора \"%s\" не розпізнаний" @@ -8254,88 +8506,98 @@ msgstr "атрибут оператора \"%s\" не розпізнаний" msgid "operator function must be specified" msgstr "необхідно вказати функцію оператора" -#: commands/operatorcmds.c:174 +#: commands/operatorcmds.c:181 +#, c-format +msgid "operator argument types must be specified" +msgstr "необхідно вказати типи аргументу оператора" + +#: commands/operatorcmds.c:185 +#, c-format +msgid "operator right argument type must be specified" +msgstr "необхідно вказати правильний тип аргументу оператора" + +#: commands/operatorcmds.c:186 #, c-format -msgid "at least one of leftarg or rightarg must be specified" -msgstr "як мінімум один лівий або правий аргумент повинні бути вказані" +msgid "Postfix operators are not supported." +msgstr "Постфіксні оператори не підтримуються." -#: commands/operatorcmds.c:278 +#: commands/operatorcmds.c:290 #, c-format msgid "restriction estimator function %s must return type %s" msgstr "функція оцінювання обмеження %s повинна повертати тип %s" -#: commands/operatorcmds.c:321 +#: commands/operatorcmds.c:333 #, c-format msgid "join estimator function %s has multiple matches" msgstr "функція оцінювання з'єднання %s має декілька збігів" -#: commands/operatorcmds.c:336 +#: commands/operatorcmds.c:348 #, c-format msgid "join estimator function %s must return type %s" msgstr "функція оцінювання з'єднання %s повинна повертати тип %s" -#: commands/operatorcmds.c:461 +#: commands/operatorcmds.c:473 #, c-format msgid "operator attribute \"%s\" cannot be changed" msgstr "атрибут оператора \"%s\" неможливо змінити" -#: commands/policy.c:88 commands/policy.c:401 commands/policy.c:491 -#: commands/tablecmds.c:1512 commands/tablecmds.c:1994 -#: commands/tablecmds.c:3076 commands/tablecmds.c:5608 -#: commands/tablecmds.c:8395 commands/tablecmds.c:15632 -#: commands/tablecmds.c:15667 commands/trigger.c:301 commands/trigger.c:1206 -#: commands/trigger.c:1315 rewrite/rewriteDefine.c:277 -#: rewrite/rewriteDefine.c:933 rewrite/rewriteRemove.c:80 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:150 +#: commands/tablecmds.c:1560 commands/tablecmds.c:2139 +#: commands/tablecmds.c:3364 commands/tablecmds.c:5952 +#: commands/tablecmds.c:8823 commands/tablecmds.c:16355 +#: commands/tablecmds.c:16390 commands/trigger.c:313 commands/trigger.c:1289 +#: commands/trigger.c:1398 rewrite/rewriteDefine.c:277 +#: rewrite/rewriteDefine.c:943 rewrite/rewriteRemove.c:80 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "доступ заборонений: \"%s\" - системний каталог" -#: commands/policy.c:171 +#: commands/policy.c:172 #, c-format msgid "ignoring specified roles other than PUBLIC" msgstr "всі вказані ролі, крім PUBLIC, ігноруються" -#: commands/policy.c:172 +#: commands/policy.c:173 #, c-format msgid "All roles are members of the PUBLIC role." msgstr "Роль PUBLIC включає в себе всі інші ролі." -#: commands/policy.c:515 -#, c-format -msgid "role \"%s\" could not be removed from policy \"%s\" on \"%s\"" -msgstr "роль \"%s\" не можна видалити з політики \"%s\" відношення \"%s\"" - -#: commands/policy.c:724 +#: commands/policy.c:607 #, c-format msgid "WITH CHECK cannot be applied to SELECT or DELETE" msgstr "WITH CHECK не можна застосувати до SELECT або DELETE" -#: commands/policy.c:733 commands/policy.c:1038 +#: commands/policy.c:616 commands/policy.c:921 #, c-format msgid "only WITH CHECK expression allowed for INSERT" msgstr "для INSERT допускається лише вираз WITH CHECK" -#: commands/policy.c:808 commands/policy.c:1261 +#: commands/policy.c:691 commands/policy.c:1144 #, c-format msgid "policy \"%s\" for table \"%s\" already exists" msgstr "політика \"%s\" для таблиці \"%s\" вже існує" -#: commands/policy.c:1010 commands/policy.c:1289 commands/policy.c:1360 +#: commands/policy.c:893 commands/policy.c:1172 commands/policy.c:1243 #, c-format msgid "policy \"%s\" for table \"%s\" does not exist" msgstr "політика \"%s\" для таблиці \"%s\" не існує" -#: commands/policy.c:1028 +#: commands/policy.c:911 #, c-format msgid "only USING expression allowed for SELECT, DELETE" msgstr "для SELECT, DELETE допускається лише вираз USING" -#: commands/portalcmds.c:59 commands/portalcmds.c:182 commands/portalcmds.c:233 +#: commands/portalcmds.c:60 commands/portalcmds.c:181 commands/portalcmds.c:232 #, c-format msgid "invalid cursor name: must not be empty" msgstr "неприпустиме ім'я курсора: не повинне бути пустим" -#: commands/portalcmds.c:190 commands/portalcmds.c:243 +#: commands/portalcmds.c:72 +#, c-format +msgid "cannot create a cursor WITH HOLD within security-restricted operation" +msgstr "не можна створити курсос WITH HOLD в межах операції з обмеженням по безпеці" + +#: commands/portalcmds.c:189 commands/portalcmds.c:242 #: executor/execCurrent.c:70 utils/adt/xml.c:2594 utils/adt/xml.c:2764 #, c-format msgid "cursor \"%s\" does not exist" @@ -8346,47 +8608,47 @@ msgstr "курсор \"%s\" не існує" msgid "invalid statement name: must not be empty" msgstr "неприпустиме ім'я оператора: не повинне бути пустим" -#: commands/prepare.c:134 parser/parse_param.c:304 tcop/postgres.c:1498 +#: commands/prepare.c:131 parser/parse_param.c:313 tcop/postgres.c:1473 #, c-format msgid "could not determine data type of parameter $%d" msgstr "не вдалося визначити тип даних параметра $%d" -#: commands/prepare.c:152 +#: commands/prepare.c:149 #, c-format msgid "utility statements cannot be prepared" msgstr "службових операторів не можна підготувати" -#: commands/prepare.c:256 commands/prepare.c:261 +#: commands/prepare.c:264 commands/prepare.c:269 #, c-format msgid "prepared statement is not a SELECT" msgstr "підготовлений оператор не SELECT" -#: commands/prepare.c:328 +#: commands/prepare.c:329 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "невірне число параметрів для підготовленого оператора \"%s\"" -#: commands/prepare.c:330 +#: commands/prepare.c:331 #, c-format msgid "Expected %d parameters but got %d." msgstr "Очікувалось %d параметрів, але отримано %d." -#: commands/prepare.c:363 +#: commands/prepare.c:364 #, c-format msgid "parameter $%d of type %s cannot be coerced to the expected type %s" msgstr "параметр $%d типу %s не можна привести до очікуваного типу %s" -#: commands/prepare.c:449 +#: commands/prepare.c:448 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "підготовлений оператор \"%s\" вже існує" -#: commands/prepare.c:488 +#: commands/prepare.c:487 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "підготовлений оператор \"%s\" не існує" -#: commands/proclang.c:67 +#: commands/proclang.c:68 #, c-format msgid "must be superuser to create custom procedural language" msgstr "для створення користувацької мови потрібно бути суперкористувачем" @@ -8431,27 +8693,27 @@ msgstr "публікація \"%s\" визначена ДЛЯ ВСІХ ТАБЛ msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "У публікації ВСІХ ТАБЛИЦЬ не можна додати або видалити таблиці." -#: commands/publicationcmds.c:683 +#: commands/publicationcmds.c:660 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "відносини \"%s\" не є частиною публікації" -#: commands/publicationcmds.c:726 +#: commands/publicationcmds.c:703 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "немає прав на зміну власника публікації \"%s\"" -#: commands/publicationcmds.c:728 +#: commands/publicationcmds.c:705 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "Власником публікації УСІХ ТАБЛИЦЬ повинен бути суперкористувач." -#: commands/schemacmds.c:105 commands/schemacmds.c:281 +#: commands/schemacmds.c:105 commands/schemacmds.c:259 #, c-format msgid "unacceptable schema name \"%s\"" msgstr "непримустиме ім'я схеми \"%s\"" -#: commands/schemacmds.c:106 commands/schemacmds.c:282 +#: commands/schemacmds.c:106 commands/schemacmds.c:260 #, c-format msgid "The prefix \"pg_\" is reserved for system schemas." msgstr "Префікс \"pg_\" зарезервований для системних схем." @@ -8461,21 +8723,26 @@ msgstr "Префікс \"pg_\" зарезервований для систем msgid "schema \"%s\" already exists, skipping" msgstr "схема \"%s\" вже існує, пропускається" -#: commands/seclabel.c:60 +#: commands/seclabel.c:129 #, c-format msgid "no security label providers have been loaded" msgstr "постачальники міток безпеки не завантажені" -#: commands/seclabel.c:64 +#: commands/seclabel.c:133 #, c-format msgid "must specify provider when multiple security label providers have been loaded" msgstr "коли завантажено кілька постачальників міток безпеки, потрібний слід вказати явно" -#: commands/seclabel.c:82 +#: commands/seclabel.c:151 #, c-format msgid "security label provider \"%s\" is not loaded" msgstr "постачальник міток безпеки \"%s\" не завантажений" +#: commands/seclabel.c:158 +#, c-format +msgid "security labels are not supported for this type of object" +msgstr "мітки безпеки не підтримуються для цього типу об'єктів" + #: commands/sequence.c:140 #, c-format msgid "unlogged sequences are not supported" @@ -8506,1699 +8773,1766 @@ msgstr "останнє значення ще не визначено в цьом msgid "setval: value %s is out of bounds for sequence \"%s\" (%s..%s)" msgstr "setval: значення %s поза межами послідовності \"%s\" (%s..%s)" -#: commands/sequence.c:1360 +#: commands/sequence.c:1359 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "неприпустимий параметр послідовності SEQUENCE NAME" -#: commands/sequence.c:1386 +#: commands/sequence.c:1385 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "типом стовпця ідентифікації може бути тільки smallint, integer або bigint" -#: commands/sequence.c:1387 +#: commands/sequence.c:1386 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "типом послідовності може бути тільки smallint, integer або bigint" -#: commands/sequence.c:1421 +#: commands/sequence.c:1420 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENT не повинен бути нулем" -#: commands/sequence.c:1474 +#: commands/sequence.c:1473 #, c-format msgid "MAXVALUE (%s) is out of range for sequence data type %s" msgstr "MAXVALUE (%s) виходить за межі типу даних послідовності %s" -#: commands/sequence.c:1511 +#: commands/sequence.c:1510 #, c-format msgid "MINVALUE (%s) is out of range for sequence data type %s" msgstr "MINVALUE (%s) виходить за межі типу даних послідовності %s" -#: commands/sequence.c:1525 +#: commands/sequence.c:1524 #, c-format msgid "MINVALUE (%s) must be less than MAXVALUE (%s)" msgstr "MINVALUE (%s) повинно бути менше за MAXVALUE (%s)" -#: commands/sequence.c:1552 +#: commands/sequence.c:1551 #, c-format msgid "START value (%s) cannot be less than MINVALUE (%s)" msgstr "Значення START (%s) не може бути менше за MINVALUE (%s)" -#: commands/sequence.c:1564 +#: commands/sequence.c:1563 #, c-format msgid "START value (%s) cannot be greater than MAXVALUE (%s)" msgstr "Значення START (%s) не може бути більше за MAXVALUE (%s)" -#: commands/sequence.c:1594 +#: commands/sequence.c:1593 #, c-format msgid "RESTART value (%s) cannot be less than MINVALUE (%s)" msgstr "Значення RESTART (%s) не може бути менше за MINVALUE (%s)" -#: commands/sequence.c:1606 +#: commands/sequence.c:1605 #, c-format msgid "RESTART value (%s) cannot be greater than MAXVALUE (%s)" msgstr "Значення RESTART (%s) не може бути більше за MAXVALUE (%s)" -#: commands/sequence.c:1621 +#: commands/sequence.c:1620 #, c-format msgid "CACHE (%s) must be greater than zero" msgstr "Значення CACHE (%s) повинно бути більше нуля" -#: commands/sequence.c:1658 +#: commands/sequence.c:1657 #, c-format msgid "invalid OWNED BY option" msgstr "неприпустимий параметр OWNED BY" -#: commands/sequence.c:1659 +#: commands/sequence.c:1658 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "Вкажіть OWNED BY таблиця.стовпець або OWNED BY NONE." -#: commands/sequence.c:1684 +#: commands/sequence.c:1683 #, c-format msgid "referenced relation \"%s\" is not a table or foreign table" msgstr "вказаний об'єкт \"%s\" не є таблицею або сторонньою таблицею" -#: commands/sequence.c:1691 +#: commands/sequence.c:1690 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "послідовність повинна мати того ж власника, що і таблиця, з якою вона зв'язана" -#: commands/sequence.c:1695 +#: commands/sequence.c:1694 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "послідовність повинна бути в тій самій схемі, що і таблиця, з якою вона зв'язана" -#: commands/sequence.c:1717 +#: commands/sequence.c:1716 #, c-format msgid "cannot change ownership of identity sequence" msgstr "змінити власника послідовності ідентифікації не можна" -#: commands/sequence.c:1718 commands/tablecmds.c:12544 -#: commands/tablecmds.c:15058 +#: commands/sequence.c:1717 commands/tablecmds.c:13151 +#: commands/tablecmds.c:15780 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Послідовність \"%s\" зв'язана з таблицею \"%s\"." -#: commands/statscmds.c:104 commands/statscmds.c:113 +#: commands/statscmds.c:111 commands/statscmds.c:120 tcop/utility.c:1843 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "в CREATE STATISTICS можна вказати лише одне відношення" -#: commands/statscmds.c:131 +#: commands/statscmds.c:138 #, c-format msgid "relation \"%s\" is not a table, foreign table, or materialized view" msgstr "відношення \"%s\" - не таблиця, не зовнішня таблиця і не матеріалізоване подання" -#: commands/statscmds.c:174 +#: commands/statscmds.c:188 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "об'єкт статистики \"%s\" вже існує, пропускається" -#: commands/statscmds.c:182 +#: commands/statscmds.c:196 #, c-format msgid "statistics object \"%s\" already exists" msgstr "об'єкт статистики \"%s\" вже існує" -#: commands/statscmds.c:204 commands/statscmds.c:210 +#: commands/statscmds.c:207 #, c-format -msgid "only simple column references are allowed in CREATE STATISTICS" -msgstr "в CREATE STATISTICS допускаються лише прості посилання на стовпці" +msgid "cannot have more than %d columns in statistics" +msgstr "в статистиці не може бути більше ніж %d стовпців" -#: commands/statscmds.c:225 +#: commands/statscmds.c:246 #, c-format msgid "statistics creation on system columns is not supported" msgstr "створення статистики для системних стовпців не підтримується" -#: commands/statscmds.c:232 +#: commands/statscmds.c:253 #, c-format msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" msgstr "стовпець \"%s\" не можна використати в статистиці, тому що для його типу %s не визначений клас оператора (btree) за замовчуванням" -#: commands/statscmds.c:239 +#: commands/statscmds.c:282 #, c-format -msgid "cannot have more than %d columns in statistics" -msgstr "в статистиці не може бути більше ніж %d стовпців" +msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" +msgstr "вираз не може використовуватись у багатоваріативній статистиці, тому що його тип %s немає визначеного класу оператора btree за замовчуванням" + +#: commands/statscmds.c:303 +#, c-format +msgid "when building statistics on a single expression, statistics kinds may not be specified" +msgstr "при побудові статистики для одного виразу види статистики можуть не вказуватись" + +#: commands/statscmds.c:332 +#, c-format +msgid "unrecognized statistics kind \"%s\"" +msgstr "нерозпізнаний вид статистики \"%s\"" -#: commands/statscmds.c:254 +#: commands/statscmds.c:361 #, c-format msgid "extended statistics require at least 2 columns" msgstr "для розширеної статистики потрібно мінімум 2 стовпці" -#: commands/statscmds.c:272 +#: commands/statscmds.c:379 #, c-format msgid "duplicate column name in statistics definition" msgstr "дублювання імені стовпця у визначенні статистики" -#: commands/statscmds.c:306 +#: commands/statscmds.c:414 #, c-format -msgid "unrecognized statistics kind \"%s\"" -msgstr "нерозпізнаний вид статистики \"%s\"" +msgid "duplicate expression in statistics definition" +msgstr "дублікат виразу у визначенні статистики" -#: commands/statscmds.c:444 commands/tablecmds.c:7416 +#: commands/statscmds.c:595 commands/tablecmds.c:7793 #, c-format msgid "statistics target %d is too low" msgstr "мета статистики занадто мала %d" -#: commands/statscmds.c:452 commands/tablecmds.c:7424 +#: commands/statscmds.c:603 commands/tablecmds.c:7801 #, c-format msgid "lowering statistics target to %d" msgstr "мета статистики знижується до %d" -#: commands/statscmds.c:475 +#: commands/statscmds.c:626 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "об'єкт статистики \"%s.%s\" не існує, пропускається" -#: commands/subscriptioncmds.c:181 +#: commands/subscriptioncmds.c:223 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "нерозпізнаний параметр підписки: \"%s\"" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:195 commands/subscriptioncmds.c:201 -#: commands/subscriptioncmds.c:207 commands/subscriptioncmds.c:226 -#: commands/subscriptioncmds.c:232 +#: commands/subscriptioncmds.c:237 commands/subscriptioncmds.c:243 +#: commands/subscriptioncmds.c:249 commands/subscriptioncmds.c:268 +#: commands/subscriptioncmds.c:274 #, c-format msgid "%s and %s are mutually exclusive options" msgstr "%s та %s є взаємовиключними опціями" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:239 commands/subscriptioncmds.c:245 +#: commands/subscriptioncmds.c:281 commands/subscriptioncmds.c:287 #, c-format msgid "subscription with %s must also set %s" msgstr "підписка з %s повинна також встановити %s" -#: commands/subscriptioncmds.c:287 -#, c-format -msgid "publication name \"%s\" used more than once" -msgstr "ім'я публікації \"%s\" використовується більше ніж один раз" - -#: commands/subscriptioncmds.c:351 +#: commands/subscriptioncmds.c:380 #, c-format msgid "must be superuser to create subscriptions" msgstr "для створення підписок потрібно бути суперкористувачем" -#: commands/subscriptioncmds.c:442 commands/subscriptioncmds.c:530 -#: replication/logical/tablesync.c:857 replication/logical/worker.c:2096 +#: commands/subscriptioncmds.c:474 commands/subscriptioncmds.c:572 +#: replication/logical/tablesync.c:975 replication/logical/worker.c:3189 #, c-format msgid "could not connect to the publisher: %s" msgstr "не вдалося підключитись до сервера публікації: %s" -#: commands/subscriptioncmds.c:484 +#: commands/subscriptioncmds.c:516 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "на сервері публікації створений слот реплікації \"%s\"" #. translator: %s is an SQL ALTER statement -#: commands/subscriptioncmds.c:497 +#: commands/subscriptioncmds.c:529 #, c-format msgid "tables were not subscribed, you will have to run %s to subscribe the tables" msgstr "таблиці не були підписані, вам необхідно виконати %s, щоб підписати таблиці" -#: commands/subscriptioncmds.c:586 -#, c-format -msgid "table \"%s.%s\" added to subscription \"%s\"" -msgstr "таблиця \"%s.%s\" додана в підписку \"%s\"" - -#: commands/subscriptioncmds.c:610 -#, c-format -msgid "table \"%s.%s\" removed from subscription \"%s\"" -msgstr "таблиця \"%s.%s\" видалена з підписки \"%s\"" - -#: commands/subscriptioncmds.c:682 +#: commands/subscriptioncmds.c:828 #, c-format msgid "cannot set %s for enabled subscription" msgstr "неможливо встановити %s для увімкненої підписки" -#: commands/subscriptioncmds.c:717 +#: commands/subscriptioncmds.c:884 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "увімкнути підписку, для якої не задано ім'я слота, не можна" -#: commands/subscriptioncmds.c:763 +#: commands/subscriptioncmds.c:936 commands/subscriptioncmds.c:984 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION з оновленням для відключених підписок не допускається" -#: commands/subscriptioncmds.c:764 +#: commands/subscriptioncmds.c:937 commands/subscriptioncmds.c:985 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "Використайте ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:782 +#: commands/subscriptioncmds.c:1005 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH для відключених підписок не допускається" -#: commands/subscriptioncmds.c:862 +#: commands/subscriptioncmds.c:1093 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "підписка \"%s\" не існує, пропускається" -#: commands/subscriptioncmds.c:987 +#: commands/subscriptioncmds.c:1345 +#, c-format +msgid "dropped replication slot \"%s\" on publisher" +msgstr "видалено слот реплікації \"%s\" на сервері публікації" + +#: commands/subscriptioncmds.c:1354 commands/subscriptioncmds.c:1362 #, c-format -msgid "could not connect to publisher when attempting to drop the replication slot \"%s\"" -msgstr "не вдалося з'єднатися з сервером публікації для видалення слота реплікації \"%s\"" +msgid "could not drop replication slot \"%s\" on publisher: %s" +msgstr "не вдалося видалити слот реплікації \"%s\" на сервері публікації: %s" -#: commands/subscriptioncmds.c:989 commands/subscriptioncmds.c:1004 -#: replication/logical/tablesync.c:906 replication/logical/tablesync.c:928 +#: commands/subscriptioncmds.c:1396 #, c-format -msgid "The error was: %s" -msgstr "Сталася помилка: %s" +msgid "permission denied to change owner of subscription \"%s\"" +msgstr "немає прав на зміну власника підписки \"%s\"" + +#: commands/subscriptioncmds.c:1398 +#, c-format +msgid "The owner of a subscription must be a superuser." +msgstr "Власником підписки повинен бути суперкористувач." + +#: commands/subscriptioncmds.c:1514 +#, c-format +msgid "could not receive list of replicated tables from the publisher: %s" +msgstr "не вдалося отримати список реплікованих таблиць із сервера публікації: %s" + +#: commands/subscriptioncmds.c:1579 +#, c-format +msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" +msgstr "не вдалося з'єднатись з сервером публікації під час спроби видалити слот реплікації \"%s\": %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:991 +#: commands/subscriptioncmds.c:1582 #, c-format msgid "Use %s to disassociate the subscription from the slot." msgstr "Використовуйте %s , щоб відв'язати підписку від слоту." -#: commands/subscriptioncmds.c:1002 +#: commands/subscriptioncmds.c:1612 #, c-format -msgid "could not drop the replication slot \"%s\" on publisher" -msgstr "не вдалося видалити слот реплікації \"%s\" на сервері публікації" - -#: commands/subscriptioncmds.c:1007 -#, c-format -msgid "dropped replication slot \"%s\" on publisher" -msgstr "видалено слот реплікації \"%s\" на сервері публікації" +msgid "publication name \"%s\" used more than once" +msgstr "ім'я публікації \"%s\" використовується більше ніж один раз" -#: commands/subscriptioncmds.c:1044 +#: commands/subscriptioncmds.c:1656 #, c-format -msgid "permission denied to change owner of subscription \"%s\"" -msgstr "немає прав на зміну власника підписки \"%s\"" +msgid "publication \"%s\" is already in subscription \"%s\"" +msgstr "публікація \"%s\" вже в підписці \"%s\"" -#: commands/subscriptioncmds.c:1046 +#: commands/subscriptioncmds.c:1670 #, c-format -msgid "The owner of a subscription must be a superuser." -msgstr "Власником підписки повинен бути суперкористувач." +msgid "publication \"%s\" is not in subscription \"%s\"" +msgstr "публікація \"%s\" не знаходиться в підписці \"%s\"" -#: commands/subscriptioncmds.c:1161 +#: commands/subscriptioncmds.c:1681 #, c-format -msgid "could not receive list of replicated tables from the publisher: %s" -msgstr "не вдалося отримати список реплікованих таблиць із сервера публікації: %s" +msgid "cannot drop all the publications from a subscription" +msgstr "не можна видалити всі публікації з підписки" -#: commands/tablecmds.c:228 commands/tablecmds.c:270 +#: commands/tablecmds.c:241 commands/tablecmds.c:283 #, c-format msgid "table \"%s\" does not exist" msgstr "таблиця \"%s\" не існує" -#: commands/tablecmds.c:229 commands/tablecmds.c:271 +#: commands/tablecmds.c:242 commands/tablecmds.c:284 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "таблиця \"%s\" не існує, пропускається" -#: commands/tablecmds.c:231 commands/tablecmds.c:273 +#: commands/tablecmds.c:244 commands/tablecmds.c:286 msgid "Use DROP TABLE to remove a table." msgstr "Використайте DROP TABLE для видалення таблиці." -#: commands/tablecmds.c:234 +#: commands/tablecmds.c:247 #, c-format msgid "sequence \"%s\" does not exist" msgstr "послідовність \"%s\" не існує" -#: commands/tablecmds.c:235 +#: commands/tablecmds.c:248 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "послідовність \"%s\" не існує, пропускається" -#: commands/tablecmds.c:237 +#: commands/tablecmds.c:250 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "Використайте DROP SEQUENCE, щоб видалити послідовність." -#: commands/tablecmds.c:240 +#: commands/tablecmds.c:253 #, c-format msgid "view \"%s\" does not exist" msgstr "подання \"%s\" не існує" -#: commands/tablecmds.c:241 +#: commands/tablecmds.c:254 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "подання \"%s\" не існує, пропускається" -#: commands/tablecmds.c:243 +#: commands/tablecmds.c:256 msgid "Use DROP VIEW to remove a view." msgstr "Використайте DROP VIEW для видалення подання." -#: commands/tablecmds.c:246 +#: commands/tablecmds.c:259 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "матеріалізоване подання \"%s\" не існує" -#: commands/tablecmds.c:247 +#: commands/tablecmds.c:260 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "матеріалізоване подання \"%s\" не існує, пропускається" -#: commands/tablecmds.c:249 +#: commands/tablecmds.c:262 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "Використайте DROP MATERIALIZED VIEW, щоб видалити матеріалізоване подання." -#: commands/tablecmds.c:252 commands/tablecmds.c:276 commands/tablecmds.c:17231 -#: parser/parse_utilcmd.c:2172 +#: commands/tablecmds.c:265 commands/tablecmds.c:289 commands/tablecmds.c:18201 +#: parser/parse_utilcmd.c:2247 #, c-format msgid "index \"%s\" does not exist" msgstr "індекс \"%s\" не існує" -#: commands/tablecmds.c:253 commands/tablecmds.c:277 +#: commands/tablecmds.c:266 commands/tablecmds.c:290 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "індекс \"%s\" не існує, пропускається" -#: commands/tablecmds.c:255 commands/tablecmds.c:279 +#: commands/tablecmds.c:268 commands/tablecmds.c:292 msgid "Use DROP INDEX to remove an index." msgstr "Використайте DROP INDEX, щоб видалити індекс." -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:273 #, c-format msgid "\"%s\" is not a type" msgstr "\"%s\" не є типом" -#: commands/tablecmds.c:261 +#: commands/tablecmds.c:274 msgid "Use DROP TYPE to remove a type." msgstr "Використайте DROP TYPE, щоб видалити тип." -#: commands/tablecmds.c:264 commands/tablecmds.c:12383 -#: commands/tablecmds.c:14838 +#: commands/tablecmds.c:277 commands/tablecmds.c:12990 +#: commands/tablecmds.c:15483 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "зовнішня таблиця \"%s\" не існує" -#: commands/tablecmds.c:265 +#: commands/tablecmds.c:278 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "зовнішня таблиця \"%s\" не існує, пропускається" -#: commands/tablecmds.c:267 +#: commands/tablecmds.c:280 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Використайте DROP FOREIGN TABLE щоб видалити сторонню таблицю." -#: commands/tablecmds.c:620 +#: commands/tablecmds.c:663 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT можна використовувати лише для тимчасових таблиць" -#: commands/tablecmds.c:651 +#: commands/tablecmds.c:694 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "неможливо створити тимчасову таблицю в межах операції з обмеженням безпеки" -#: commands/tablecmds.c:687 commands/tablecmds.c:13742 +#: commands/tablecmds.c:730 commands/tablecmds.c:14274 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "відношення \"%s\" буде успадковуватись більш ніж один раз" -#: commands/tablecmds.c:868 +#: commands/tablecmds.c:915 #, c-format msgid "specifying a table access method is not supported on a partitioned table" msgstr "вказання методу доступу до таблиці не підтримується з секційною таблицею" -#: commands/tablecmds.c:964 +#: commands/tablecmds.c:1011 #, c-format msgid "\"%s\" is not partitioned" msgstr "\"%s\" не секціоновано" -#: commands/tablecmds.c:1058 +#: commands/tablecmds.c:1106 #, c-format msgid "cannot partition using more than %d columns" msgstr "число стовпців в ключі секціонування не може перевищувати %d" -#: commands/tablecmds.c:1114 +#: commands/tablecmds.c:1162 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "не можна створити зовнішню секцію в секціонованій таблиці \"%s\"" -#: commands/tablecmds.c:1116 +#: commands/tablecmds.c:1164 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "Таблиця \"%s\" містить індекси, які унікальні." -#: commands/tablecmds.c:1279 +#: commands/tablecmds.c:1327 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY не підтримує видалення кількох об'єктів" -#: commands/tablecmds.c:1283 +#: commands/tablecmds.c:1331 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY не підтримує режим CASCADE" -#: commands/tablecmds.c:1384 +#: commands/tablecmds.c:1432 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "неможливо видалити секціонований індекс \"%s\" паралельно" -#: commands/tablecmds.c:1654 +#: commands/tablecmds.c:1704 #, c-format msgid "cannot truncate only a partitioned table" msgstr "скоротити тільки секціоновану таблицю не можна" -#: commands/tablecmds.c:1655 +#: commands/tablecmds.c:1705 #, c-format msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." msgstr "Не вказуйте ключове слово ONLY або використайте TRUNCATE ONLY безпосередньо для секцій." -#: commands/tablecmds.c:1724 +#: commands/tablecmds.c:1777 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "скорочення поширюється на таблицю \"%s\"" -#: commands/tablecmds.c:2031 +#: commands/tablecmds.c:2127 +#, c-format +msgid "cannot truncate foreign table \"%s\"" +msgstr "скоротити зовнішню таблицю \"%s\" не можна" + +#: commands/tablecmds.c:2176 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "тимчасові таблиці інших сеансів не можна скоротити" -#: commands/tablecmds.c:2259 commands/tablecmds.c:13639 +#: commands/tablecmds.c:2404 commands/tablecmds.c:14171 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "успадкування від секціонованої таблиці \"%s\" не допускається" -#: commands/tablecmds.c:2264 +#: commands/tablecmds.c:2409 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "успадкування від розділу \"%s\" не допускається" -#: commands/tablecmds.c:2272 parser/parse_utilcmd.c:2402 -#: parser/parse_utilcmd.c:2544 +#: commands/tablecmds.c:2417 parser/parse_utilcmd.c:2477 +#: parser/parse_utilcmd.c:2619 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "успадковане відношення \"%s\" не є таблицею або сторонньою таблицею" -#: commands/tablecmds.c:2284 +#: commands/tablecmds.c:2429 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "створити тимчасове відношення як секцію постійного відношення\"%s\" не можна" -#: commands/tablecmds.c:2293 commands/tablecmds.c:13618 +#: commands/tablecmds.c:2438 commands/tablecmds.c:14150 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "тимчасове відношення \"%s\" не може успадковуватись" -#: commands/tablecmds.c:2303 commands/tablecmds.c:13626 +#: commands/tablecmds.c:2448 commands/tablecmds.c:14158 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "успадкування від тимчасового відношення іншого сеансу неможливе" -#: commands/tablecmds.c:2357 +#: commands/tablecmds.c:2502 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "злиття декількох успадкованих визначень стовпця \"%s\"" -#: commands/tablecmds.c:2365 +#: commands/tablecmds.c:2510 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "конфлікт типів в успадкованому стовпці \"%s\"" -#: commands/tablecmds.c:2367 commands/tablecmds.c:2390 -#: commands/tablecmds.c:2639 commands/tablecmds.c:2669 -#: parser/parse_coerce.c:1935 parser/parse_coerce.c:1955 -#: parser/parse_coerce.c:1975 parser/parse_coerce.c:2030 -#: parser/parse_coerce.c:2107 parser/parse_coerce.c:2141 -#: parser/parse_param.c:218 +#: commands/tablecmds.c:2512 commands/tablecmds.c:2535 +#: commands/tablecmds.c:2552 commands/tablecmds.c:2808 +#: commands/tablecmds.c:2838 commands/tablecmds.c:2852 +#: parser/parse_coerce.c:2091 parser/parse_coerce.c:2111 +#: parser/parse_coerce.c:2131 parser/parse_coerce.c:2152 +#: parser/parse_coerce.c:2207 parser/parse_coerce.c:2241 +#: parser/parse_coerce.c:2317 parser/parse_coerce.c:2348 +#: parser/parse_coerce.c:2387 parser/parse_coerce.c:2454 +#: parser/parse_param.c:227 #, c-format msgid "%s versus %s" msgstr "%s проти %s" -#: commands/tablecmds.c:2376 +#: commands/tablecmds.c:2521 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "конфлікт правил сортування в успадкованому стовпці \"%s\"" -#: commands/tablecmds.c:2378 commands/tablecmds.c:2651 -#: commands/tablecmds.c:6106 +#: commands/tablecmds.c:2523 commands/tablecmds.c:2820 +#: commands/tablecmds.c:6461 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "\"%s\" проти \"%s\"" -#: commands/tablecmds.c:2388 +#: commands/tablecmds.c:2533 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "конфлікт параметрів зберігання в успадкованому стовпці \"%s\"" -#: commands/tablecmds.c:2404 +#: commands/tablecmds.c:2550 commands/tablecmds.c:2850 +#, c-format +msgid "column \"%s\" has a compression method conflict" +msgstr "конфлікт методів стиснення в стовпці \"%s\"" + +#: commands/tablecmds.c:2565 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "конфлікт генерування в успадкованому стовпці \"%s\"" -#: commands/tablecmds.c:2490 commands/tablecmds.c:2545 -#: commands/tablecmds.c:11188 parser/parse_utilcmd.c:1252 -#: parser/parse_utilcmd.c:1295 parser/parse_utilcmd.c:1703 -#: parser/parse_utilcmd.c:1812 +#: commands/tablecmds.c:2659 commands/tablecmds.c:2714 +#: commands/tablecmds.c:11735 parser/parse_utilcmd.c:1291 +#: parser/parse_utilcmd.c:1334 parser/parse_utilcmd.c:1742 +#: parser/parse_utilcmd.c:1850 #, c-format msgid "cannot convert whole-row table reference" msgstr "перетворити посилання на тип усього рядка таблиці не можна" -#: commands/tablecmds.c:2491 parser/parse_utilcmd.c:1253 +#: commands/tablecmds.c:2660 parser/parse_utilcmd.c:1292 #, c-format msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." msgstr "Вираз генерації для стовпця \"%s\" містить посилання на весь рядок на таблицю \"%s\"." -#: commands/tablecmds.c:2546 parser/parse_utilcmd.c:1296 +#: commands/tablecmds.c:2715 parser/parse_utilcmd.c:1335 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "Обмеження \"%s\" посилається на тип усього рядка в таблиці \"%s\"." -#: commands/tablecmds.c:2625 +#: commands/tablecmds.c:2794 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "злиття стовпця \"%s\" з успадкованим визначенням" -#: commands/tablecmds.c:2629 +#: commands/tablecmds.c:2798 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "переміщення і злиття стовпця \"%s\" з успадкованим визначенням" -#: commands/tablecmds.c:2630 +#: commands/tablecmds.c:2799 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "Визначений користувачем стовпець переміщений в позицію успадкованого стовпця." -#: commands/tablecmds.c:2637 +#: commands/tablecmds.c:2806 #, c-format msgid "column \"%s\" has a type conflict" msgstr "конфлікт типів в стовпці \"%s\"" -#: commands/tablecmds.c:2649 +#: commands/tablecmds.c:2818 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "конфлікт правил сортування в стовпці \"%s\"" -#: commands/tablecmds.c:2667 +#: commands/tablecmds.c:2836 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "конфлікт параметрів зберігання в стовпці \"%s\"" -#: commands/tablecmds.c:2695 +#: commands/tablecmds.c:2877 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "дочірній стовпець \"%s\" визначає вираз генерації" -#: commands/tablecmds.c:2697 +#: commands/tablecmds.c:2879 #, c-format msgid "Omit the generation expression in the definition of the child table column to inherit the generation expression from the parent table." msgstr "Пропустіть вираз генерації у визначенні стовпця дочірьної таблиці щоб успадкувати вираз генерації з батьківської таблиці." -#: commands/tablecmds.c:2701 +#: commands/tablecmds.c:2883 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "стовпець \"%s\" успадковується із згенерованого стовпця, але вказує за замовчуванням" -#: commands/tablecmds.c:2706 +#: commands/tablecmds.c:2888 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" msgstr "стовпець \"%s\" успадковується із згенерованого стовпця, але вказує ідентичність" -#: commands/tablecmds.c:2815 +#: commands/tablecmds.c:2997 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "стовпець \"%s\" успадковує конфліктуючи вирази генерації" -#: commands/tablecmds.c:2820 +#: commands/tablecmds.c:3002 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "стовпець \"%s\" успадковує конфліктні значення за замовчуванням" -#: commands/tablecmds.c:2822 +#: commands/tablecmds.c:3004 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "Для усунення конфлікту вкажіть бажане значення за замовчуванням." -#: commands/tablecmds.c:2868 +#: commands/tablecmds.c:3050 #, c-format msgid "check constraint name \"%s\" appears multiple times but with different expressions" msgstr "ім'я перевірочного обмеження \"%s\" з'являється декілька разів, але з різними виразами" -#: commands/tablecmds.c:3045 +#: commands/tablecmds.c:3263 +#, c-format +msgid "cannot move temporary tables of other sessions" +msgstr "переміщувати тимчасові таблиці інших сеансів не можна" + +#: commands/tablecmds.c:3333 #, c-format msgid "cannot rename column of typed table" msgstr "перейменувати стовпець типізованої таблиці не можна" -#: commands/tablecmds.c:3064 +#: commands/tablecmds.c:3352 #, c-format msgid "\"%s\" is not a table, view, materialized view, composite type, index, or foreign table" msgstr "\"%s\" - не таблиця, подання, матеріалізоване подання, складений тип, індекс або зовнішня таблиця" -#: commands/tablecmds.c:3158 +#: commands/tablecmds.c:3446 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "успадкований стовпець \"%s\" повинен бути перейменований в дочірніх таблицях також" -#: commands/tablecmds.c:3190 +#: commands/tablecmds.c:3478 #, c-format msgid "cannot rename system column \"%s\"" msgstr "не можна перейменувати системний стовпець \"%s\"" -#: commands/tablecmds.c:3205 +#: commands/tablecmds.c:3493 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "не можна перейменувати успадкований стовпець \"%s\"" -#: commands/tablecmds.c:3357 +#: commands/tablecmds.c:3645 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "успадковане обмеження \"%s\" повинно бути перейменовано в дочірніх таблицях також" -#: commands/tablecmds.c:3364 +#: commands/tablecmds.c:3652 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "не можна перейменувати успадковане обмеження \"%s\"" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3597 +#: commands/tablecmds.c:3885 #, c-format msgid "cannot %s \"%s\" because it is being used by active queries in this session" msgstr "не можна виконати %s \"%s\", тому що цей об'єкт використовується активними запитами в цьому сеансі" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3606 +#: commands/tablecmds.c:3894 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "не можна виконати %s \"%s\", тому що з цим об'єктом зв'язані очікуванні події тригерів" -#: commands/tablecmds.c:4237 commands/tablecmds.c:4252 +#: commands/tablecmds.c:4358 +#, c-format +msgid "cannot alter partition \"%s\" with an incomplete detach" +msgstr "не можна змінити розділ \"%s\" з неповним відключенням" + +#: commands/tablecmds.c:4551 commands/tablecmds.c:4566 #, c-format msgid "cannot change persistence setting twice" msgstr "неможливо двічі змінити параметр стійкості" -#: commands/tablecmds.c:4969 +#: commands/tablecmds.c:5309 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "перезаписати системне відношення \"%s\" не можна" -#: commands/tablecmds.c:4975 +#: commands/tablecmds.c:5315 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "перезаписати таблицю \"%s\", що використовується як таблиця каталогу, не можна" -#: commands/tablecmds.c:4985 +#: commands/tablecmds.c:5325 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "неможливо перезаписати тимчасові таблиці інших сеансів" -#: commands/tablecmds.c:5274 -#, c-format -msgid "rewriting table \"%s\"" -msgstr "перезапис таблиці \"%s\"" - -#: commands/tablecmds.c:5278 -#, c-format -msgid "verifying table \"%s\"" -msgstr "перевірка таблиці \"%s\"" - -#: commands/tablecmds.c:5443 +#: commands/tablecmds.c:5786 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "стовпець \"%s\" відношення \"%s\" містить null значення" -#: commands/tablecmds.c:5460 +#: commands/tablecmds.c:5803 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "перевірка обмеження \"%s\" відношення \"%s\" порушується деяким рядком" -#: commands/tablecmds.c:5479 partitioning/partbounds.c:3235 +#: commands/tablecmds.c:5822 partitioning/partbounds.c:3292 #, c-format msgid "updated partition constraint for default partition \"%s\" would be violated by some row" msgstr "оновлене обмеження секції для секції за замовчуванням \"%s\" буде порушено деякими рядками" -#: commands/tablecmds.c:5485 +#: commands/tablecmds.c:5828 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "обмеження секції відношення \"%s\" порушується деяким рядком" -#: commands/tablecmds.c:5632 commands/trigger.c:1200 commands/trigger.c:1306 +#: commands/tablecmds.c:5976 commands/trigger.c:1283 commands/trigger.c:1389 #, c-format msgid "\"%s\" is not a table, view, or foreign table" msgstr "\"%s\" - не таблиця, подання або зовнішня таблиця" -#: commands/tablecmds.c:5635 +#: commands/tablecmds.c:5979 #, c-format msgid "\"%s\" is not a table, view, materialized view, or index" msgstr "\"%s\" - не таблиця, подання, матеріалізоване подання або індекс" -#: commands/tablecmds.c:5641 +#: commands/tablecmds.c:5985 #, c-format msgid "\"%s\" is not a table, materialized view, or index" msgstr "\"%s\" - не таблиця, матеріалізоване подання або індекс" -#: commands/tablecmds.c:5644 +#: commands/tablecmds.c:5988 +#, c-format +msgid "\"%s\" is not a table, materialized view, index, or partitioned index" +msgstr "\"%s\" - не таблиця, матеріалізоване подання, індекс або секціонований індекс" + +#: commands/tablecmds.c:5991 +#, c-format +msgid "\"%s\" is not a table, materialized view, index, partitioned index, or foreign table" +msgstr "\"%s\" - не таблиця, матеріалізоване подання, секціонований індекс або зовнішня таблиця" + +#: commands/tablecmds.c:5994 #, c-format msgid "\"%s\" is not a table, materialized view, or foreign table" msgstr "\"%s\" - не таблиця, матеріалізоване подання або зовнішня таблиця" -#: commands/tablecmds.c:5647 +#: commands/tablecmds.c:5997 #, c-format msgid "\"%s\" is not a table or foreign table" msgstr "\"%s\" - не таблиця або зовнішня таблиця" -#: commands/tablecmds.c:5650 +#: commands/tablecmds.c:6000 #, c-format msgid "\"%s\" is not a table, composite type, or foreign table" msgstr "\"%s\" - не таблиця, складений тип або зовнішня таблиця" -#: commands/tablecmds.c:5653 +#: commands/tablecmds.c:6003 #, c-format msgid "\"%s\" is not a table, materialized view, index, or foreign table" msgstr "\"%s\" - не таблиця, матеріалізоване подання, індекс або зовнішня таблиця" -#: commands/tablecmds.c:5663 +#: commands/tablecmds.c:6006 +#, c-format +msgid "\"%s\" is not a table or partitioned index" +msgstr "\"%s\" не є таблицею або секціонованим індексом" + +#: commands/tablecmds.c:6016 #, c-format msgid "\"%s\" is of the wrong type" msgstr "\"%s\" - неправильний тип" -#: commands/tablecmds.c:5866 commands/tablecmds.c:5873 +#: commands/tablecmds.c:6219 commands/tablecmds.c:6226 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "неможливо змінити тип \"%s\", тому що стовпець \"%s.%s\" використовує його" -#: commands/tablecmds.c:5880 +#: commands/tablecmds.c:6233 #, c-format msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" msgstr "неможливо змінити сторонню таблицю \"%s\", тому що стовпець \"%s.%s\" використовує тип її рядка" -#: commands/tablecmds.c:5887 +#: commands/tablecmds.c:6240 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "неможливо змінити таблицю \"%s\", тому що стовпець \"%s.%s\" використовує тип її рядка" -#: commands/tablecmds.c:5943 +#: commands/tablecmds.c:6296 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "неможливо змінити тип \"%s\", тому що це тип типізованої таблиці" -#: commands/tablecmds.c:5945 +#: commands/tablecmds.c:6298 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "Щоб змінити типізовані таблиці, використайте також ALTER ... CASCADE." -#: commands/tablecmds.c:5991 +#: commands/tablecmds.c:6344 #, c-format msgid "type %s is not a composite type" msgstr "тип %s не є складеним" -#: commands/tablecmds.c:6018 +#: commands/tablecmds.c:6371 #, c-format msgid "cannot add column to typed table" msgstr "неможливо додати стовпець до типізованої таблиці" -#: commands/tablecmds.c:6069 +#: commands/tablecmds.c:6424 #, c-format msgid "cannot add column to a partition" msgstr "неможливо додати стовпець до розділу" -#: commands/tablecmds.c:6098 commands/tablecmds.c:13869 +#: commands/tablecmds.c:6453 commands/tablecmds.c:14401 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "дочірня таблиця \"%s\" має інший тип для стовпця \"%s\"" -#: commands/tablecmds.c:6104 commands/tablecmds.c:13876 +#: commands/tablecmds.c:6459 commands/tablecmds.c:14408 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "дочірня таблиця \"%s\" має інше правило сортування для стовпця \"%s\"" -#: commands/tablecmds.c:6118 +#: commands/tablecmds.c:6473 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "об'єднання визначення стовпця \"%s\" для нащадка \"%s\"" -#: commands/tablecmds.c:6161 +#: commands/tablecmds.c:6516 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "неможливо додати стовпець ідентифікації в таблицю, яка має дочірні таблиці" -#: commands/tablecmds.c:6398 +#: commands/tablecmds.c:6759 #, c-format msgid "column must be added to child tables too" msgstr "стовпець також повинен бути доданий до дочірніх таблиць" -#: commands/tablecmds.c:6476 +#: commands/tablecmds.c:6837 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "стовпець \"%s\" відношення \"%s\" вже існує, пропускається" -#: commands/tablecmds.c:6483 +#: commands/tablecmds.c:6844 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "стовпець \"%s\" відношення \"%s\" вже існує" -#: commands/tablecmds.c:6549 commands/tablecmds.c:10826 +#: commands/tablecmds.c:6910 commands/tablecmds.c:11373 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "неможливо видалити обмеження тільки з секціонованої таблиці, коли існують секції" -#: commands/tablecmds.c:6550 commands/tablecmds.c:6854 -#: commands/tablecmds.c:7834 commands/tablecmds.c:10827 +#: commands/tablecmds.c:6911 commands/tablecmds.c:7215 +#: commands/tablecmds.c:8238 commands/tablecmds.c:11374 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Не вказуйте ключове слово ONLY." -#: commands/tablecmds.c:6587 commands/tablecmds.c:6780 -#: commands/tablecmds.c:6922 commands/tablecmds.c:7036 -#: commands/tablecmds.c:7130 commands/tablecmds.c:7189 -#: commands/tablecmds.c:7291 commands/tablecmds.c:7457 -#: commands/tablecmds.c:7527 commands/tablecmds.c:7620 -#: commands/tablecmds.c:10981 commands/tablecmds.c:12406 +#: commands/tablecmds.c:6948 commands/tablecmds.c:7141 +#: commands/tablecmds.c:7283 commands/tablecmds.c:7397 +#: commands/tablecmds.c:7491 commands/tablecmds.c:7550 +#: commands/tablecmds.c:7668 commands/tablecmds.c:7834 +#: commands/tablecmds.c:7904 commands/tablecmds.c:8060 +#: commands/tablecmds.c:11528 commands/tablecmds.c:13013 +#: commands/tablecmds.c:15574 #, c-format msgid "cannot alter system column \"%s\"" msgstr "не можна змінити системний стовпець \"%s\"" -#: commands/tablecmds.c:6593 commands/tablecmds.c:6928 +#: commands/tablecmds.c:6954 commands/tablecmds.c:7289 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "стовпець \"%s\" відношення \"%s\" є стовпцем ідентифікації" -#: commands/tablecmds.c:6629 +#: commands/tablecmds.c:6990 #, c-format msgid "column \"%s\" is in a primary key" msgstr "стовпець \"%s\" входить до первинного ключа" -#: commands/tablecmds.c:6651 +#: commands/tablecmds.c:7012 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "стовпець \"%s\" в батьківській таблиці позначений як NOT NULL" -#: commands/tablecmds.c:6851 commands/tablecmds.c:8293 +#: commands/tablecmds.c:7212 commands/tablecmds.c:8721 #, c-format msgid "constraint must be added to child tables too" msgstr "обмеження повинно бути додано у дочірні таблиці також" -#: commands/tablecmds.c:6852 +#: commands/tablecmds.c:7213 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "Стовпець \"%s\" відношення \"%s\" вже не NOT NULL." -#: commands/tablecmds.c:6887 -#, c-format -msgid "existing constraints on column \"%s.%s\" are sufficient to prove that it does not contain nulls" -msgstr "існуючих обмежень в стовпці \"%s.%s\" досить, щоб довести, що він не містить nulls" - -#: commands/tablecmds.c:6930 +#: commands/tablecmds.c:7291 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." msgstr "Замість цього використайте ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." -#: commands/tablecmds.c:6935 +#: commands/tablecmds.c:7296 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "стовпець \"%s\" відношення \"%s\" є згенерованим стовпцем" -#: commands/tablecmds.c:6938 +#: commands/tablecmds.c:7299 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." msgstr "Замість цього використайте ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION" -#: commands/tablecmds.c:7047 +#: commands/tablecmds.c:7408 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "стовпець \"%s\" відношення \"%s\" повинен бути оголошений як NOT NULL, щоб додати ідентифікацію" -#: commands/tablecmds.c:7053 +#: commands/tablecmds.c:7414 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "стовпець \"%s\" відношення \"%s\" вже є стовпцем ідентифікації" -#: commands/tablecmds.c:7059 +#: commands/tablecmds.c:7420 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "стовпець \"%s\" відношення \"%s\" вже має значення за замовчуванням" -#: commands/tablecmds.c:7136 commands/tablecmds.c:7197 +#: commands/tablecmds.c:7497 commands/tablecmds.c:7558 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "стовпець \"%s\" відношення \"%s\" не є стовпцем ідентифікації" -#: commands/tablecmds.c:7202 +#: commands/tablecmds.c:7563 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "стовпець \"%s\" відношення \"%s\" не є стовпцем ідентифікації, пропускається" -#: commands/tablecmds.c:7261 +#: commands/tablecmds.c:7616 +#, c-format +msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" +msgstr "ALTER TABLE / DROP EXPRESSION повинен бути застосований і до дочірніх таблиць" + +#: commands/tablecmds.c:7638 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "не можна видалити вираз генерації з успадкованого стовпця" -#: commands/tablecmds.c:7299 +#: commands/tablecmds.c:7676 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "стовпець \"%s\" відношення \"%s\" не є збереженим згенерованим стовпцем" -#: commands/tablecmds.c:7304 +#: commands/tablecmds.c:7681 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "стовпець \"%s\" відношення \"%s\" не є збереженим згенерованим стовпцем, пропускається" -#: commands/tablecmds.c:7404 +#: commands/tablecmds.c:7781 #, c-format msgid "cannot refer to non-index column by number" msgstr "не можна посилатись на неіндексований стовпець за номером" -#: commands/tablecmds.c:7447 +#: commands/tablecmds.c:7824 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "стовпець з номером %d відношення %s не існує" -#: commands/tablecmds.c:7466 +#: commands/tablecmds.c:7843 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "змінити статистику включеного стовпця \"%s\" індексу \"%s\" не можна" -#: commands/tablecmds.c:7471 +#: commands/tablecmds.c:7848 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "змінити статистику невираженого стовпця \"%s\" індексу \"%s\" не можна" -#: commands/tablecmds.c:7473 +#: commands/tablecmds.c:7850 #, c-format msgid "Alter statistics on table column instead." msgstr "Замість цього змініть статистику стовпця в таблиці." -#: commands/tablecmds.c:7600 +#: commands/tablecmds.c:8040 #, c-format msgid "invalid storage type \"%s\"" msgstr "неприпустимий тип сховища \"%s\"" -#: commands/tablecmds.c:7632 +#: commands/tablecmds.c:8072 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "тип даних стовпця %s може мати тільки сховище PLAIN" -#: commands/tablecmds.c:7714 +#: commands/tablecmds.c:8117 #, c-format msgid "cannot drop column from typed table" msgstr "не можна видалити стовпець з типізованої таблиці" -#: commands/tablecmds.c:7773 +#: commands/tablecmds.c:8176 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "стовпець \"%s\" відношення \"%s\" не існує, пропускається" -#: commands/tablecmds.c:7786 +#: commands/tablecmds.c:8189 #, c-format msgid "cannot drop system column \"%s\"" msgstr "не можна видалити системний стовпець \"%s\"" -#: commands/tablecmds.c:7796 +#: commands/tablecmds.c:8199 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "не можна видалити успадкований стовпець \"%s\"" -#: commands/tablecmds.c:7809 +#: commands/tablecmds.c:8212 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "не можна видалити стовпець \"%s\", тому що він є частиною ключа секції відношення \"%s\"" -#: commands/tablecmds.c:7833 +#: commands/tablecmds.c:8237 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "видалити стовпець тільки з секціонованої таблиці, коли існують секції, не можна" -#: commands/tablecmds.c:8014 +#: commands/tablecmds.c:8441 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX не підтримується із секціонованими таблицями" -#: commands/tablecmds.c:8039 +#: commands/tablecmds.c:8466 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX перейменує індекс \"%s\" в \"%s\"" -#: commands/tablecmds.c:8373 +#: commands/tablecmds.c:8801 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "не можна використати ONLY для стороннього ключа в секціонованій таблиці \"%s\", який посилається на відношення \"%s\"" -#: commands/tablecmds.c:8379 +#: commands/tablecmds.c:8807 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "не можна додати сторонній ключ з характеристикою NOT VALID в секціоновану таблицю \"%s\", який посилається на відношення \"%s\"" -#: commands/tablecmds.c:8382 +#: commands/tablecmds.c:8810 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "Ця функція ще не підтримується з секціонованими таблицями." -#: commands/tablecmds.c:8389 commands/tablecmds.c:8794 +#: commands/tablecmds.c:8817 commands/tablecmds.c:9222 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "вказане відношення \"%s\" не є таблицею" -#: commands/tablecmds.c:8412 +#: commands/tablecmds.c:8840 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "обмеження в постійних таблицях можуть посилатись лише на постійні таблиці" -#: commands/tablecmds.c:8419 +#: commands/tablecmds.c:8847 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "обмеження в нежурнальованих таблицях можуть посилатись тільки на постійні або нежурналюємі таблиці" -#: commands/tablecmds.c:8425 +#: commands/tablecmds.c:8853 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "обмеження в тимчасових таблицях можуть посилатись лише на тимчасові таблиці" -#: commands/tablecmds.c:8429 +#: commands/tablecmds.c:8857 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "обмеження в тимчасових таблицях повинні посилатись лише на тичасові таблиці поточного сеансу" -#: commands/tablecmds.c:8495 commands/tablecmds.c:8501 +#: commands/tablecmds.c:8923 commands/tablecmds.c:8929 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "неприпустима дія %s для обмеження зовнішнього ключа, який містить згеренований стовпець" -#: commands/tablecmds.c:8517 +#: commands/tablecmds.c:8945 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "число стовпців в джерелі і призначенні зовнішнього ключа не збігається" -#: commands/tablecmds.c:8624 +#: commands/tablecmds.c:9052 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "обмеження зовнішнього ключа \"%s\" не можна реалізувати" -#: commands/tablecmds.c:8626 +#: commands/tablecmds.c:9054 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Стовпці ключа \"%s\" і \"%s\" містять несумісні типи: %s і %s." -#: commands/tablecmds.c:8989 commands/tablecmds.c:9382 -#: parser/parse_utilcmd.c:764 parser/parse_utilcmd.c:893 +#: commands/tablecmds.c:9417 commands/tablecmds.c:9810 +#: parser/parse_utilcmd.c:786 parser/parse_utilcmd.c:915 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "обмеження зовнішнього ключа для сторонніх таблиць не підтримуються" -#: commands/tablecmds.c:9748 commands/tablecmds.c:9911 -#: commands/tablecmds.c:10783 commands/tablecmds.c:10858 +#: commands/tablecmds.c:10177 commands/tablecmds.c:10455 +#: commands/tablecmds.c:11330 commands/tablecmds.c:11405 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "обмеження \"%s\" відношення \"%s\" не існує" -#: commands/tablecmds.c:9755 +#: commands/tablecmds.c:10184 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "обмеження \"%s\" відношення \"%s\" не є обмеженням зовнішнього ключа" -#: commands/tablecmds.c:9919 +#: commands/tablecmds.c:10222 +#, c-format +msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgstr "неможливо змінити обмеження \"%s\" відношення \"%s\"" + +#: commands/tablecmds.c:10225 +#, c-format +msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." +msgstr "Обмеження \"%s\" походить з обмеження \"%s\" відношення \"%s\"." + +#: commands/tablecmds.c:10227 +#, c-format +msgid "You may alter the constraint it derives from, instead." +msgstr "Натомість ви можете змінити початкове обмеження." + +#: commands/tablecmds.c:10463 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "обмеження \"%s\" відношення \"%s\" не є зовнішнім ключем або перевіркою обмеженням " -#: commands/tablecmds.c:9997 +#: commands/tablecmds.c:10541 #, c-format msgid "constraint must be validated on child tables too" msgstr "обмеження повинно дотримуватися в дочірніх таблицях також" -#: commands/tablecmds.c:10081 +#: commands/tablecmds.c:10625 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "стовпець \"%s\", вказаний в обмеженні зовнішнього ключа, не існує" -#: commands/tablecmds.c:10086 +#: commands/tablecmds.c:10630 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "у зовнішньому ключі не може бути більш ніж %d ключів" -#: commands/tablecmds.c:10151 +#: commands/tablecmds.c:10695 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "використовувати затримуваний первинний ключ в цільовій зовнішній таблиці \"%s\" не можна" -#: commands/tablecmds.c:10168 +#: commands/tablecmds.c:10712 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "у цільовій зовнішній таблиці \"%s\" немає первинного ключа" -#: commands/tablecmds.c:10233 +#: commands/tablecmds.c:10777 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "у списку стовпців зовнішнього ключа не повинно бути повторень" -#: commands/tablecmds.c:10327 +#: commands/tablecmds.c:10871 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "використовувати затримане обмеження унікальності в цільовій зовнішній таблиці \"%s\" не можна" -#: commands/tablecmds.c:10332 +#: commands/tablecmds.c:10876 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "у цільовій зовнішній таблиці \"%s\" немає обмеження унікальності, відповідного даним ключам" -#: commands/tablecmds.c:10420 -#, c-format -msgid "validating foreign key constraint \"%s\"" -msgstr "перевірка обмеження зовнішнього ключа \"%s\"" - -#: commands/tablecmds.c:10739 +#: commands/tablecmds.c:11286 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "видалити успадковане обмеження \"%s\" відношення \"%s\" не можна" -#: commands/tablecmds.c:10789 +#: commands/tablecmds.c:11336 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "обмеження \"%s\" відношення \"%s\" не існує, пропускається" -#: commands/tablecmds.c:10965 +#: commands/tablecmds.c:11512 #, c-format msgid "cannot alter column type of typed table" msgstr "змінити тип стовпця в типізованій таблиці не можна" -#: commands/tablecmds.c:10992 +#: commands/tablecmds.c:11539 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "змінити успадкований стовпець \"%s\" не можна" -#: commands/tablecmds.c:11001 +#: commands/tablecmds.c:11548 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "не можна змінити стовпець \"%s\", тому що він є частиною ключа секції відношення \"%s\"" -#: commands/tablecmds.c:11051 +#: commands/tablecmds.c:11598 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "результати речення USING для стовпця \"%s\" не можна автоматично наведено для типу %s" -#: commands/tablecmds.c:11054 +#: commands/tablecmds.c:11601 #, c-format msgid "You might need to add an explicit cast." msgstr "Можливо, необхідно додати явне приведення типу." -#: commands/tablecmds.c:11058 +#: commands/tablecmds.c:11605 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "стовпець \"%s\" не можна автоматично привести до типу %s" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:11061 +#: commands/tablecmds.c:11608 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Можливо, необхідно вказати \"USING %s::%s\"." -#: commands/tablecmds.c:11161 +#: commands/tablecmds.c:11708 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "не можна змінити успадкований стовпець \"%s\" відношення \"%s\"" -#: commands/tablecmds.c:11189 +#: commands/tablecmds.c:11736 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "Вираз USING містить посилання на тип усього рядка таблиці." -#: commands/tablecmds.c:11200 +#: commands/tablecmds.c:11747 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "тип успадкованого стовпця \"%s\" повинен бути змінений і в дочірніх таблицях" -#: commands/tablecmds.c:11325 +#: commands/tablecmds.c:11872 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "не можна змінити тип стовпця \"%s\" двічі" -#: commands/tablecmds.c:11363 +#: commands/tablecmds.c:11910 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "вираз генерації для стовпця \"%s\" не можна автоматично привести до типу %s" -#: commands/tablecmds.c:11368 +#: commands/tablecmds.c:11915 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "значення за замовчуванням для стовпця \"%s\" не можна автоматично привести до типу %s" -#: commands/tablecmds.c:11446 +#: commands/tablecmds.c:11993 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "змінити тип стовпця, який використовується згенерованим стовпцем, не можна" -#: commands/tablecmds.c:11447 +#: commands/tablecmds.c:11994 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Стовпець \"%s\" використовується згенерованим стовпцем \"%s\"." -#: commands/tablecmds.c:11468 +#: commands/tablecmds.c:12015 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "змінити тип стовпця, залученого в поданні або правилі, не можна" -#: commands/tablecmds.c:11469 commands/tablecmds.c:11488 -#: commands/tablecmds.c:11506 +#: commands/tablecmds.c:12016 commands/tablecmds.c:12035 +#: commands/tablecmds.c:12053 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s залежить від стовпця \"%s\"" -#: commands/tablecmds.c:11487 +#: commands/tablecmds.c:12034 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "неможливо змінити тип стовпця, що використовується у визначенні тригеру" -#: commands/tablecmds.c:11505 +#: commands/tablecmds.c:12052 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "неможливо змінити тип стовпця, що використовується у визначенні політики" -#: commands/tablecmds.c:12514 commands/tablecmds.c:12526 +#: commands/tablecmds.c:13121 commands/tablecmds.c:13133 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "неможливо змінити власника індексу \"%s\"" -#: commands/tablecmds.c:12516 commands/tablecmds.c:12528 +#: commands/tablecmds.c:13123 commands/tablecmds.c:13135 #, c-format msgid "Change the ownership of the index's table, instead." msgstr "Замість цього змініть власника таблиці, що містить цей індекс." -#: commands/tablecmds.c:12542 +#: commands/tablecmds.c:13149 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "неможливо змінити власника послідовності \"%s\"" -#: commands/tablecmds.c:12556 commands/tablecmds.c:15743 +#: commands/tablecmds.c:13163 commands/tablecmds.c:16466 #, c-format msgid "Use ALTER TYPE instead." msgstr "Замість цього використайте ALTER TYPE." -#: commands/tablecmds.c:12565 +#: commands/tablecmds.c:13172 #, c-format msgid "\"%s\" is not a table, view, sequence, or foreign table" msgstr "\"%s\" - не таблиця, подання, послідовність або зовнішня таблиця" -#: commands/tablecmds.c:12905 +#: commands/tablecmds.c:13511 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "в одній інструкції не може бути декілька підкоманд SET TABLESPACE" -#: commands/tablecmds.c:12982 +#: commands/tablecmds.c:13588 #, c-format msgid "\"%s\" is not a table, view, materialized view, index, or TOAST table" msgstr "\"%s\" - не таблиця, подання, матеріалізоване подання, індекс або TOAST-таблиця" -#: commands/tablecmds.c:13015 commands/view.c:494 +#: commands/tablecmds.c:13621 commands/view.c:491 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTION підтримується лише з автооновлюваними поданнями" -#: commands/tablecmds.c:13155 -#, c-format -msgid "cannot move system relation \"%s\"" -msgstr "перемістити системне відношення \"%s\" не можна" - -#: commands/tablecmds.c:13171 -#, c-format -msgid "cannot move temporary tables of other sessions" -msgstr "переміщувати тимчасові таблиці інших сеансів не можна" - -#: commands/tablecmds.c:13341 +#: commands/tablecmds.c:13873 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "у табличних просторах існують лише таблиці, індекси та матеріалізовані подання" -#: commands/tablecmds.c:13353 +#: commands/tablecmds.c:13885 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "переміщувати відношення у або з табличного простору pg_global не можна" -#: commands/tablecmds.c:13445 +#: commands/tablecmds.c:13977 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "переривання через блокування відношення \"%s.%s\" неможливе" -#: commands/tablecmds.c:13461 +#: commands/tablecmds.c:13993 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr " табличному просторі \"%s\" не знайдені відповідні відносини" -#: commands/tablecmds.c:13577 +#: commands/tablecmds.c:14109 #, c-format msgid "cannot change inheritance of typed table" msgstr "змінити успадкування типізованої таблиці не можна" -#: commands/tablecmds.c:13582 commands/tablecmds.c:14078 +#: commands/tablecmds.c:14114 commands/tablecmds.c:14670 #, c-format msgid "cannot change inheritance of a partition" msgstr "змінити успадкування секції не можна" -#: commands/tablecmds.c:13587 +#: commands/tablecmds.c:14119 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "змінити успадкування секціонованої таблиці не можна" -#: commands/tablecmds.c:13633 +#: commands/tablecmds.c:14165 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "успадкування для тимчасового відношення іншого сеансу не можливе" -#: commands/tablecmds.c:13646 +#: commands/tablecmds.c:14178 #, c-format msgid "cannot inherit from a partition" msgstr "успадкування від секції неможливе" -#: commands/tablecmds.c:13668 commands/tablecmds.c:16383 +#: commands/tablecmds.c:14200 commands/tablecmds.c:17110 #, c-format msgid "circular inheritance not allowed" msgstr "циклічне успадкування неприпустиме" -#: commands/tablecmds.c:13669 commands/tablecmds.c:16384 +#: commands/tablecmds.c:14201 commands/tablecmds.c:17111 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" вже є нащадком \"%s\"." -#: commands/tablecmds.c:13682 +#: commands/tablecmds.c:14214 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "тригер \"%s\" не дозволяє таблиці \"%s\" стати нащадком успадкування" -#: commands/tablecmds.c:13684 +#: commands/tablecmds.c:14216 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "Тригери ROW з перехідними таблицями не підтримуються в ієрархіях успадкування." -#: commands/tablecmds.c:13887 +#: commands/tablecmds.c:14419 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "стовпець \"%s\" в дочірній таблиці має бути позначений як NOT NULL" -#: commands/tablecmds.c:13914 +#: commands/tablecmds.c:14428 +#, c-format +msgid "column \"%s\" in child table must be a generated column" +msgstr "стовпець \"%s\" у дочірній таблиці повинен бути згенерованим стовпцем" + +#: commands/tablecmds.c:14478 +#, c-format +msgid "column \"%s\" in child table has a conflicting generation expression" +msgstr "стовпець \"%s\" в дочірній таблиці містить конфліктний вираз генерування" + +#: commands/tablecmds.c:14506 #, c-format msgid "child table is missing column \"%s\"" msgstr "у дочірній таблиці не вистачає стовпця \"%s\"" -#: commands/tablecmds.c:14002 +#: commands/tablecmds.c:14594 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "дочірня таблиця \"%s\" має інше визначення перевірочного обмеження \"%s\"" -#: commands/tablecmds.c:14010 +#: commands/tablecmds.c:14602 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "обмеження \"%s\" конфліктує з неуспадкованим обмеженням дочірньої таблиці \"%s\"" -#: commands/tablecmds.c:14021 +#: commands/tablecmds.c:14613 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "обмеження \"%s\" конфліктує з NOT VALID обмеженням дочірньої таблиці \"%s\"" -#: commands/tablecmds.c:14056 +#: commands/tablecmds.c:14648 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "у дочірній таблиці не вистачає обмеження \"%s\"" -#: commands/tablecmds.c:14145 +#: commands/tablecmds.c:14736 +#, c-format +msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" +msgstr "розділ \"%s\" вже очікує відключення в секціонованій таблиці \"%s.%s\"" + +#: commands/tablecmds.c:14765 commands/tablecmds.c:14813 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "відношення \"%s\" не є секцією відношення \"%s\"" -#: commands/tablecmds.c:14151 +#: commands/tablecmds.c:14819 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "відношення \"%s\" не є предком відношення \"%s\"" -#: commands/tablecmds.c:14379 +#: commands/tablecmds.c:15047 #, c-format msgid "typed tables cannot inherit" msgstr "типізовані таблиці не можуть успадковуватись" -#: commands/tablecmds.c:14409 +#: commands/tablecmds.c:15077 #, c-format msgid "table is missing column \"%s\"" msgstr "у таблиці не вистачає стовпця \"%s\"" -#: commands/tablecmds.c:14420 +#: commands/tablecmds.c:15088 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "таблиця містить стовпець \"%s\", а тип потребує \"%s\"" -#: commands/tablecmds.c:14429 +#: commands/tablecmds.c:15097 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "таблиця \"%s\" містить стовпець \"%s\" іншого типу" -#: commands/tablecmds.c:14443 +#: commands/tablecmds.c:15111 #, c-format msgid "table has extra column \"%s\"" msgstr "таблиця містить зайвий стовпець \"%s\"" -#: commands/tablecmds.c:14495 +#: commands/tablecmds.c:15163 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" - не типізована таблиця" -#: commands/tablecmds.c:14677 +#: commands/tablecmds.c:15345 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "для ідентифікації репліки не можна використати неунікальний індекс \"%s\"" -#: commands/tablecmds.c:14683 +#: commands/tablecmds.c:15351 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "для ідентифікації репліки не можна використати небезпосередній індекс \"%s\"" -#: commands/tablecmds.c:14689 +#: commands/tablecmds.c:15357 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "для ідентифікації репліки не можна використати індекс з виразом \"%s\"" -#: commands/tablecmds.c:14695 +#: commands/tablecmds.c:15363 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "для ідентифікації репліки не можна використати частковий індекс \"%s\"" -#: commands/tablecmds.c:14701 +#: commands/tablecmds.c:15369 #, c-format msgid "cannot use invalid index \"%s\" as replica identity" msgstr "для ідентифікації репліки не можна використати неприпустимий індекс \"%s\"" -#: commands/tablecmds.c:14718 +#: commands/tablecmds.c:15386 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "індекс \"%s\" не можна використати як ідентифікацію репліки, тому що стовпець %d - системний стовпець" -#: commands/tablecmds.c:14725 +#: commands/tablecmds.c:15393 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "індекс \"%s\" не можна використати як ідентифікацію репліки, тому що стовпець \"%s\" допускає Null" -#: commands/tablecmds.c:14918 +#: commands/tablecmds.c:15640 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "змінити стан журналювання таблиці \"%s\" не можна, тому що вона тимчасова" -#: commands/tablecmds.c:14942 +#: commands/tablecmds.c:15664 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "таблицю \"%s\" не можна змінити на нежурнальовану, тому що вона є частиною публікації" -#: commands/tablecmds.c:14944 +#: commands/tablecmds.c:15666 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Нежурнальовані відношення не підтримують реплікацію." -#: commands/tablecmds.c:14989 +#: commands/tablecmds.c:15711 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "не вдалося змінити таблицю \"%s\" на журнальовану, тому що вона посилається на нежурнальовану таблицю \"%s\"" -#: commands/tablecmds.c:14999 +#: commands/tablecmds.c:15721 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "не вдалося змінити таблицю \"%s\" на нежурнальовану, тому що вона посилається на журнальовану таблицю \"%s\"" -#: commands/tablecmds.c:15057 +#: commands/tablecmds.c:15779 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "перемістити послідовність з власником в іншу схему не можна" -#: commands/tablecmds.c:15163 +#: commands/tablecmds.c:15886 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "відношення \"%s\" вже існує в схемі \"%s\"" -#: commands/tablecmds.c:15726 +#: commands/tablecmds.c:16449 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" - не складений тип" -#: commands/tablecmds.c:15758 +#: commands/tablecmds.c:16481 #, c-format msgid "\"%s\" is not a table, view, materialized view, sequence, or foreign table" msgstr "\"%s\" - не таблиця, подання, матеріалізоване подання, послідовність або зовнішня таблиця" -#: commands/tablecmds.c:15793 +#: commands/tablecmds.c:16516 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "нерозпізнана стратегія секціонування \"%s\"" -#: commands/tablecmds.c:15801 +#: commands/tablecmds.c:16524 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "стратегія секціонування \"по списку\" не може використовувати декілька стовпців" -#: commands/tablecmds.c:15867 +#: commands/tablecmds.c:16590 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "стовпець \"%s\", згаданий в ключі секціонування, не існує" -#: commands/tablecmds.c:15875 +#: commands/tablecmds.c:16598 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "системний стовпець \"%s\" не можна використати в ключі секціонування" -#: commands/tablecmds.c:15886 commands/tablecmds.c:16000 +#: commands/tablecmds.c:16609 commands/tablecmds.c:16723 #, c-format msgid "cannot use generated column in partition key" msgstr "використати згенерований стовпець в ключі секції, не можна" -#: commands/tablecmds.c:15887 commands/tablecmds.c:16001 commands/trigger.c:641 -#: rewrite/rewriteHandler.c:829 rewrite/rewriteHandler.c:846 +#: commands/tablecmds.c:16610 commands/tablecmds.c:16724 commands/trigger.c:653 +#: rewrite/rewriteHandler.c:884 rewrite/rewriteHandler.c:919 #, c-format msgid "Column \"%s\" is a generated column." msgstr "Стовпець \"%s\" є згенерованим стовпцем." -#: commands/tablecmds.c:15963 +#: commands/tablecmds.c:16686 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "функції у виразі ключа секціонування повинні бути позначені як IMMUTABLE" -#: commands/tablecmds.c:15983 +#: commands/tablecmds.c:16706 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "вирази ключа секціонування не можуть містити посилання на системний стовпець" -#: commands/tablecmds.c:16013 +#: commands/tablecmds.c:16736 #, c-format msgid "cannot use constant expression as partition key" msgstr "не можна використати константий вираз як ключ секціонування" -#: commands/tablecmds.c:16034 +#: commands/tablecmds.c:16757 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "не вдалося визначити, яке правило сортування використати для виразу секціонування" -#: commands/tablecmds.c:16069 +#: commands/tablecmds.c:16792 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "Ви повинні вказати клас операторів гешування або визначити клас операторів гешування за замовчуванням для цього типу даних." -#: commands/tablecmds.c:16075 +#: commands/tablecmds.c:16798 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "Ви повинні вказати клас операторів (btree) або визначити клас операторів (btree) за замовчуванням для цього типу даних." -#: commands/tablecmds.c:16220 -#, c-format -msgid "partition constraint for table \"%s\" is implied by existing constraints" -msgstr "обмеження секції для таблиці \"%s\" має на увазі наявні обмеження" - -#: commands/tablecmds.c:16224 partitioning/partbounds.c:3129 -#: partitioning/partbounds.c:3180 -#, c-format -msgid "updated partition constraint for default partition \"%s\" is implied by existing constraints" -msgstr "оновлене обмеження секції для секції за замовчуванням \"%s\" має на увазі наявні обмеження" - -#: commands/tablecmds.c:16323 +#: commands/tablecmds.c:17050 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" вже є секцією" -#: commands/tablecmds.c:16329 +#: commands/tablecmds.c:17056 #, c-format msgid "cannot attach a typed table as partition" msgstr "неможливо підключити типізовану таблицю в якості секції" -#: commands/tablecmds.c:16345 +#: commands/tablecmds.c:17072 #, c-format msgid "cannot attach inheritance child as partition" msgstr "неможливо підключити нащадка успадкування в якості секції" -#: commands/tablecmds.c:16359 +#: commands/tablecmds.c:17086 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "неможливо підключити предка успадкування в якості секції" -#: commands/tablecmds.c:16393 +#: commands/tablecmds.c:17120 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "неможливо підкючити тимчасове відношення в якості секції постійного відношення \"%s\"" -#: commands/tablecmds.c:16401 +#: commands/tablecmds.c:17128 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "неможливо підключити постійне відношення в якості секції тимчасового відношення \"%s\"" -#: commands/tablecmds.c:16409 +#: commands/tablecmds.c:17136 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "неможливо підключити секцію до тимчасового відношення в іншому сеансі" -#: commands/tablecmds.c:16416 +#: commands/tablecmds.c:17143 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "неможливо підключити тимчасове відношення з іншого сеансу в якості секції" -#: commands/tablecmds.c:16436 +#: commands/tablecmds.c:17163 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "таблиця \"%s\" містить стовпець \"%s\", відсутній в батьківській \"%s\"" -#: commands/tablecmds.c:16439 +#: commands/tablecmds.c:17166 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "Нова секція може містити лише стовпці, що є у батьківській таблиці." -#: commands/tablecmds.c:16451 +#: commands/tablecmds.c:17178 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "тригер \"%s\" не дозволяє зробити таблицю \"%s\" секцією" -#: commands/tablecmds.c:16453 commands/trigger.c:447 +#: commands/tablecmds.c:17180 commands/trigger.c:459 #, c-format msgid "ROW triggers with transition tables are not supported on partitions" msgstr "Тригери ROW з перехідними таблицями для секцій не підтримуються" -#: commands/tablecmds.c:16616 +#: commands/tablecmds.c:17343 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "не можна підключити зовнішню таблицю \"%s\" в якості секції секціонованої таблиці \"%s\"" -#: commands/tablecmds.c:16619 +#: commands/tablecmds.c:17346 +#, c-format +msgid "Partitioned table \"%s\" contains unique indexes." +msgstr "Секціонована таблиця \"%s\" містить унікальні індекси." + +#: commands/tablecmds.c:17666 #, c-format -msgid "Table \"%s\" contains unique indexes." -msgstr "Таблиця \"%s\" містить унікальні індекси." +msgid "cannot detach partitions concurrently when a default partition exists" +msgstr "не можна одночасно відключити розділи, коли існує розділ за замовчуванням" -#: commands/tablecmds.c:17265 commands/tablecmds.c:17285 -#: commands/tablecmds.c:17305 commands/tablecmds.c:17324 -#: commands/tablecmds.c:17366 +#: commands/tablecmds.c:17775 +#, c-format +msgid "partitioned table \"%s\" was removed concurrently" +msgstr "секціоновану таблицю \"%s\" було видалено одночасно" + +#: commands/tablecmds.c:17781 +#, c-format +msgid "partition \"%s\" was removed concurrently" +msgstr "розділ \"%s\" було видалено паралельно" + +#: commands/tablecmds.c:18235 commands/tablecmds.c:18255 +#: commands/tablecmds.c:18275 commands/tablecmds.c:18294 +#: commands/tablecmds.c:18336 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "неможливо підключити індекс \"%s\" в якості секції індексу \"%s\"" -#: commands/tablecmds.c:17268 +#: commands/tablecmds.c:18238 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Індекс \"%s\" вже підключений до іншого індексу." -#: commands/tablecmds.c:17288 +#: commands/tablecmds.c:18258 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Індекс \"%s\" не є індексом жодної секції таблиці \"%s\"." -#: commands/tablecmds.c:17308 +#: commands/tablecmds.c:18278 #, c-format msgid "The index definitions do not match." msgstr "Визначення індексів не співпадають." -#: commands/tablecmds.c:17327 +#: commands/tablecmds.c:18297 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "Індекс \"%s\" належить обмеженню в таблиці \"%s\", але обмеження для індексу \"%s\" не існує." -#: commands/tablecmds.c:17369 +#: commands/tablecmds.c:18339 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "До секції \"%s\" вже підключений інший індекс." +#: commands/tablecmds.c:18569 +#, c-format +msgid "column data type %s does not support compression" +msgstr "тип даних стовпця %s не підтримує стискання" + +#: commands/tablecmds.c:18576 +#, c-format +msgid "invalid compression method \"%s\"" +msgstr "неприпустимий метод стискання \"%s\"" + #: commands/tablespace.c:162 commands/tablespace.c:179 #: commands/tablespace.c:190 commands/tablespace.c:198 -#: commands/tablespace.c:638 replication/slot.c:1373 storage/file/copydir.c:47 +#: commands/tablespace.c:650 replication/slot.c:1471 storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не вдалося створити каталог \"%s\": %m" @@ -10243,751 +10577,791 @@ msgstr "шлях до розташування табличного просто msgid "tablespace location should not be inside the data directory" msgstr "табличний простір не повинен розташовуватись всередині каталогу даних" -#: commands/tablespace.c:305 commands/tablespace.c:965 +#: commands/tablespace.c:305 commands/tablespace.c:977 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "неприпустиме ім'я табличного простору \"%s\"" -#: commands/tablespace.c:307 commands/tablespace.c:966 +#: commands/tablespace.c:307 commands/tablespace.c:978 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "Префікс \"\"pg_\" зарезервований для системних табличних просторів." -#: commands/tablespace.c:326 commands/tablespace.c:987 +#: commands/tablespace.c:326 commands/tablespace.c:999 #, c-format msgid "tablespace \"%s\" already exists" msgstr "табличний простір \"%s\" вже існує" -#: commands/tablespace.c:442 commands/tablespace.c:948 -#: commands/tablespace.c:1037 commands/tablespace.c:1106 -#: commands/tablespace.c:1252 commands/tablespace.c:1455 +#: commands/tablespace.c:444 commands/tablespace.c:960 +#: commands/tablespace.c:1049 commands/tablespace.c:1118 +#: commands/tablespace.c:1264 commands/tablespace.c:1467 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "табличний простір \"%s\" не існує" -#: commands/tablespace.c:448 +#: commands/tablespace.c:450 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "табличний простір \"%s\" вже існує, пропускається" -#: commands/tablespace.c:525 +#: commands/tablespace.c:478 +#, c-format +msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" +msgstr "табличний простір \"%s\" не можна видалити, тому що деякі об'єкти залежать від нього" + +#: commands/tablespace.c:537 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "табличний простір \"%s\" не пустий" -#: commands/tablespace.c:597 +#: commands/tablespace.c:609 #, c-format msgid "directory \"%s\" does not exist" msgstr "каталог \"%s\" не існує" -#: commands/tablespace.c:598 +#: commands/tablespace.c:610 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "Створіть цей каталог для табличного простору до перезапуску сервера." -#: commands/tablespace.c:603 +#: commands/tablespace.c:615 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "не вдалося встановити права для каталогу \"%s\": %m" -#: commands/tablespace.c:633 +#: commands/tablespace.c:645 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "каталог \"%s\" вже використовується в якості табличного простору" -#: commands/tablespace.c:757 commands/tablespace.c:770 -#: commands/tablespace.c:806 commands/tablespace.c:898 storage/file/fd.c:3108 -#: storage/file/fd.c:3448 +#: commands/tablespace.c:769 commands/tablespace.c:782 +#: commands/tablespace.c:818 commands/tablespace.c:910 storage/file/fd.c:3161 +#: storage/file/fd.c:3557 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "не вдалося видалити каталог \"%s\": %m" -#: commands/tablespace.c:819 commands/tablespace.c:907 +#: commands/tablespace.c:831 commands/tablespace.c:919 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "не вдалося видалити символьне посилання \"%s\": %m" -#: commands/tablespace.c:829 commands/tablespace.c:916 +#: commands/tablespace.c:841 commands/tablespace.c:928 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "\"%s\" - не каталог або символьне посилання" -#: commands/tablespace.c:1111 +#: commands/tablespace.c:1123 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "Табличний простір \"%s\" не існує." -#: commands/tablespace.c:1554 +#: commands/tablespace.c:1566 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "не вдалося видалити каталоги табличного простору %u" -#: commands/tablespace.c:1556 +#: commands/tablespace.c:1568 #, c-format msgid "You can remove the directories manually if necessary." msgstr "За потреби ви можете видалити каталоги вручну." -#: commands/trigger.c:204 commands/trigger.c:215 +#: commands/trigger.c:216 commands/trigger.c:227 #, c-format msgid "\"%s\" is a table" msgstr "\"%s\" - таблиця" -#: commands/trigger.c:206 commands/trigger.c:217 +#: commands/trigger.c:218 commands/trigger.c:229 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "Таблиці не можуть мати тригери INSTEAD OF." -#: commands/trigger.c:238 +#: commands/trigger.c:250 #, c-format msgid "\"%s\" is a partitioned table" msgstr "\"%s\" є секційною таблицею" -#: commands/trigger.c:240 +#: commands/trigger.c:252 #, c-format msgid "Triggers on partitioned tables cannot have transition tables." msgstr "Тригери секціонованих таблиць не можуть використовувати перехідні таблиці." -#: commands/trigger.c:252 commands/trigger.c:259 commands/trigger.c:429 +#: commands/trigger.c:264 commands/trigger.c:271 commands/trigger.c:441 #, c-format msgid "\"%s\" is a view" msgstr "\"%s\" - подання" -#: commands/trigger.c:254 +#: commands/trigger.c:266 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "Подання не можуть мати рядкові тригери BEFORE або AFTER." -#: commands/trigger.c:261 +#: commands/trigger.c:273 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "Подання не можуть мати тригери TRUNCATE." -#: commands/trigger.c:269 commands/trigger.c:276 commands/trigger.c:288 -#: commands/trigger.c:422 +#: commands/trigger.c:281 commands/trigger.c:288 commands/trigger.c:300 +#: commands/trigger.c:434 #, c-format msgid "\"%s\" is a foreign table" msgstr "\"%s\" - зовнішня таблиця" -#: commands/trigger.c:271 +#: commands/trigger.c:283 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "Зовнішні таблиці не можуть мати тригери INSTEAD OF." -#: commands/trigger.c:278 +#: commands/trigger.c:290 #, c-format msgid "Foreign tables cannot have TRUNCATE triggers." msgstr "Зовнішні таблиці не можуть мати тригери TRUNCATE." -#: commands/trigger.c:290 +#: commands/trigger.c:302 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "Зовнішні таблиці не можуть мати обмежувальні тригери." -#: commands/trigger.c:365 +#: commands/trigger.c:377 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "Тригери TRUNCATE FOR EACH ROW не підтримуються" -#: commands/trigger.c:373 +#: commands/trigger.c:385 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "Тригери INSTEAD OF повинні мати тип FOR EACH ROW" -#: commands/trigger.c:377 +#: commands/trigger.c:389 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "Тригери INSTEAD OF не можуть мати умови WHEN" -#: commands/trigger.c:381 +#: commands/trigger.c:393 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "Тригери INSTEAD OF не можуть мати список стовпців" -#: commands/trigger.c:410 +#: commands/trigger.c:422 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "Змінна іменування ROW в реченні REFERENCING не підтримується" -#: commands/trigger.c:411 +#: commands/trigger.c:423 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "Використайте OLD TABLE або NEW TABLE для іменування перехідних таблиць." -#: commands/trigger.c:424 +#: commands/trigger.c:436 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Тригери зовнішніх таблиць не можуть використовувати перехідні таблиці." -#: commands/trigger.c:431 +#: commands/trigger.c:443 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Тригери подань не можуть використовувати перехідні таблиці." -#: commands/trigger.c:451 +#: commands/trigger.c:463 #, c-format msgid "ROW triggers with transition tables are not supported on inheritance children" msgstr "Тригери ROW з перехідними таблицями для нащадків успадкування не підтримуються" -#: commands/trigger.c:457 +#: commands/trigger.c:469 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "ім'я перехідної таблиці можна задати лише для тригеру AFTER" -#: commands/trigger.c:462 +#: commands/trigger.c:474 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "Тригери TRUNCATE з перехідними таблицями не підтримуються" -#: commands/trigger.c:479 +#: commands/trigger.c:491 #, c-format msgid "transition tables cannot be specified for triggers with more than one event" msgstr "перехідні таблиці не можна задати для тригерів, призначених для кількох подій" -#: commands/trigger.c:490 +#: commands/trigger.c:502 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "перехідні таблиці не можна задати для тригерів зі списками стовпців" -#: commands/trigger.c:507 +#: commands/trigger.c:519 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "NEW TABLE можна задати лише для тригерів INSERT або UPDATE" -#: commands/trigger.c:512 +#: commands/trigger.c:524 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE не можна задавати декілька разів" -#: commands/trigger.c:522 +#: commands/trigger.c:534 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE можна задати лише для тригерів DELETE або UPDATE" -#: commands/trigger.c:527 +#: commands/trigger.c:539 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE не можна задавати декілька разів" -#: commands/trigger.c:537 +#: commands/trigger.c:549 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "Ім'я OLD TABLE та ім'я NEW TABLE не можуть бути однаковими" -#: commands/trigger.c:601 commands/trigger.c:614 +#: commands/trigger.c:613 commands/trigger.c:626 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "в умові WHEN операторного тригера не можна посилатись на значення стовпця" -#: commands/trigger.c:606 +#: commands/trigger.c:618 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "В умові WHEN тригеру INSERT не можна посилатись на значення OLD" -#: commands/trigger.c:619 +#: commands/trigger.c:631 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "В умові WHEN тригера DELETE не можна посилатись на значення NEW" -#: commands/trigger.c:624 +#: commands/trigger.c:636 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "В умові WHEN тригера BEFORE не можна посилатись на системні стовпці NEW" -#: commands/trigger.c:632 commands/trigger.c:640 +#: commands/trigger.c:644 commands/trigger.c:652 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "В умові WHEN тригера BEFORE не можна посилатись на згенеровані стовпці NEW" -#: commands/trigger.c:633 +#: commands/trigger.c:645 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "Використовується посилання на весь рядок і таблиця містить згенеровані стовпці." -#: commands/trigger.c:780 commands/trigger.c:1385 +#: commands/trigger.c:759 commands/trigger.c:1468 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "тригер \"%s\" для відношення \"%s\" вже існує" -#: commands/trigger.c:1271 commands/trigger.c:1432 commands/trigger.c:1568 +#: commands/trigger.c:773 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is an internal trigger" +msgstr "тригер \"%s\" для відношення \"%s\" є внутрішнім тригером" + +#: commands/trigger.c:792 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" +msgstr "тригер \"%s\" для відношення \"%s\" є зовнішнім тригером" + +#: commands/trigger.c:1354 commands/trigger.c:1515 commands/trigger.c:1630 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "тригер \"%s\" для таблиці \"%s\" не існує" -#: commands/trigger.c:1515 +#: commands/trigger.c:1598 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "немає доступу: \"%s\" - системний тригер" -#: commands/trigger.c:2116 +#: commands/trigger.c:2178 #, c-format msgid "trigger function %u returned null value" msgstr "тригерна функція %u повернула значення null" -#: commands/trigger.c:2176 commands/trigger.c:2390 commands/trigger.c:2625 -#: commands/trigger.c:2933 +#: commands/trigger.c:2238 commands/trigger.c:2452 commands/trigger.c:2691 +#: commands/trigger.c:2995 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "Тригер BEFORE STATEMENT не може повертати значення" -#: commands/trigger.c:2250 +#: commands/trigger.c:2312 #, c-format msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" msgstr "переміщення рядка до іншої секції під час тригеру BEFORE FOR EACH ROW не підтримується" -#: commands/trigger.c:2251 commands/trigger.c:2755 +#: commands/trigger.c:2313 #, c-format msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "Перед виконанням тригера \"%s\", рядок повинен був бути в секції \"%s.%s\"." -#: commands/trigger.c:2754 -#, c-format -msgid "moving row to another partition during a BEFORE trigger is not supported" -msgstr "переміщення рядка до іншої секції під час тригеру BEFORE не підтримується" - -#: commands/trigger.c:2996 executor/nodeModifyTable.c:1380 -#: executor/nodeModifyTable.c:1449 +#: commands/trigger.c:3061 executor/nodeModifyTable.c:1824 +#: executor/nodeModifyTable.c:1906 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "кортеж, який повинен бути оновленим, вже змінений в операції, яка викликана поточною командою" -#: commands/trigger.c:2997 executor/nodeModifyTable.c:840 -#: executor/nodeModifyTable.c:914 executor/nodeModifyTable.c:1381 -#: executor/nodeModifyTable.c:1450 +#: commands/trigger.c:3062 executor/nodeModifyTable.c:1206 +#: executor/nodeModifyTable.c:1280 executor/nodeModifyTable.c:1825 +#: executor/nodeModifyTable.c:1907 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "Можливо, для поширення змін в інші рядки слід використати тригер AFTER замість тригера BEFORE." -#: commands/trigger.c:3026 executor/nodeLockRows.c:225 -#: executor/nodeLockRows.c:234 executor/nodeModifyTable.c:220 -#: executor/nodeModifyTable.c:856 executor/nodeModifyTable.c:1397 -#: executor/nodeModifyTable.c:1613 +#: commands/trigger.c:3091 executor/nodeLockRows.c:229 +#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:228 +#: executor/nodeModifyTable.c:1222 executor/nodeModifyTable.c:1842 +#: executor/nodeModifyTable.c:2072 #, c-format msgid "could not serialize access due to concurrent update" msgstr "не вдалося серіалізувати доступ через паралельне оновлення" -#: commands/trigger.c:3034 executor/nodeModifyTable.c:946 -#: executor/nodeModifyTable.c:1467 executor/nodeModifyTable.c:1637 +#: commands/trigger.c:3099 executor/nodeModifyTable.c:1312 +#: executor/nodeModifyTable.c:1924 executor/nodeModifyTable.c:2096 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "не вдалося серіалізувати доступ через паралельне видалення" -#: commands/trigger.c:5094 +#: commands/trigger.c:4160 +#, c-format +msgid "cannot fire deferred trigger within security-restricted operation" +msgstr "не можна виконати відкладений тригер в межах операції з обмеженням по безпеці" + +#: commands/trigger.c:5203 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "обмеження \"%s\" не є відкладеним" -#: commands/trigger.c:5117 +#: commands/trigger.c:5226 #, c-format msgid "constraint \"%s\" does not exist" msgstr "обмеження \"%s\" не існує" -#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:683 +#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:635 #, c-format msgid "function %s should return type %s" msgstr "функція %s повинна повертати тип %s" -#: commands/tsearchcmds.c:195 +#: commands/tsearchcmds.c:194 #, c-format msgid "must be superuser to create text search parsers" msgstr "для створення аналізаторів текстового пошуку потрібно бути суперкористувачем" -#: commands/tsearchcmds.c:248 +#: commands/tsearchcmds.c:247 #, c-format msgid "text search parser parameter \"%s\" not recognized" msgstr "параметр аналізатора текстового пошуку \"%s\" не розпізнаний" -#: commands/tsearchcmds.c:258 +#: commands/tsearchcmds.c:257 #, c-format msgid "text search parser start method is required" msgstr "для аналізатора текстового пошуку необхідний метод start" -#: commands/tsearchcmds.c:263 +#: commands/tsearchcmds.c:262 #, c-format msgid "text search parser gettoken method is required" msgstr "для аналізатора текстового пошуку необхідний метод gettoken" -#: commands/tsearchcmds.c:268 +#: commands/tsearchcmds.c:267 #, c-format msgid "text search parser end method is required" msgstr "для аналізатора текстового пошуку необхідний метод end" -#: commands/tsearchcmds.c:273 +#: commands/tsearchcmds.c:272 #, c-format msgid "text search parser lextypes method is required" msgstr "для аналізатора текстового пошуку необхідний метод lextypes" -#: commands/tsearchcmds.c:390 +#: commands/tsearchcmds.c:366 #, c-format msgid "text search template \"%s\" does not accept options" msgstr "шаблон текстового пошуку \"%s\" не приймає параметри" -#: commands/tsearchcmds.c:464 +#: commands/tsearchcmds.c:440 #, c-format msgid "text search template is required" msgstr "необхідний шаблон текстового пошуку" -#: commands/tsearchcmds.c:750 +#: commands/tsearchcmds.c:701 #, c-format msgid "must be superuser to create text search templates" msgstr "для створення шаблонів текстового пошуку потрібно бути суперкористувачем" -#: commands/tsearchcmds.c:792 +#: commands/tsearchcmds.c:743 #, c-format msgid "text search template parameter \"%s\" not recognized" msgstr "параметр шаблону текстового пошуку \"%s\" не розпізнаний" -#: commands/tsearchcmds.c:802 +#: commands/tsearchcmds.c:753 #, c-format msgid "text search template lexize method is required" msgstr "для шаблону текстового пошуку необхідний метод lexize" -#: commands/tsearchcmds.c:1006 +#: commands/tsearchcmds.c:933 #, c-format msgid "text search configuration parameter \"%s\" not recognized" msgstr "параметр конфігурації текстового пошуку \"%s\" не розпізнаний" -#: commands/tsearchcmds.c:1013 +#: commands/tsearchcmds.c:940 #, c-format msgid "cannot specify both PARSER and COPY options" msgstr "вказати параметри PARSER і COPY одночасно не можна" -#: commands/tsearchcmds.c:1049 +#: commands/tsearchcmds.c:976 #, c-format msgid "text search parser is required" msgstr "необхідний аналізатор текстового пошуку" -#: commands/tsearchcmds.c:1273 +#: commands/tsearchcmds.c:1200 #, c-format msgid "token type \"%s\" does not exist" msgstr "тип маркера \"%s\" не існує" -#: commands/tsearchcmds.c:1500 +#: commands/tsearchcmds.c:1427 #, c-format msgid "mapping for token type \"%s\" does not exist" msgstr "зіставлення для типу маркера \"%s\" не існує" -#: commands/tsearchcmds.c:1506 +#: commands/tsearchcmds.c:1433 #, c-format msgid "mapping for token type \"%s\" does not exist, skipping" msgstr "зіставлення для типу маркера \"%s\" не існує, пропускається" -#: commands/tsearchcmds.c:1669 commands/tsearchcmds.c:1784 +#: commands/tsearchcmds.c:1596 commands/tsearchcmds.c:1711 #, c-format msgid "invalid parameter list format: \"%s\"" msgstr "неприпустимий формат списку параметрів: \"%s\"" -#: commands/typecmds.c:206 +#: commands/typecmds.c:217 #, c-format msgid "must be superuser to create a base type" msgstr "для створення базового типу потрібно бути суперкористувачем" -#: commands/typecmds.c:264 +#: commands/typecmds.c:275 #, c-format msgid "Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE." msgstr "Створіть тип в якості оболонки, потім створіть його функції вводу-виводу, а потім виконайте повну CREATE TYPE." -#: commands/typecmds.c:314 commands/typecmds.c:1394 commands/typecmds.c:3832 +#: commands/typecmds.c:327 commands/typecmds.c:1465 commands/typecmds.c:4281 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "атрибут типу \"%s\" не розпізнаний" -#: commands/typecmds.c:370 +#: commands/typecmds.c:385 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "неприпустима категорія типу \"%s\": повинен бути простий ASCII" -#: commands/typecmds.c:389 +#: commands/typecmds.c:404 #, c-format msgid "array element type cannot be %s" msgstr "типом елементу масиву не може бути %s" -#: commands/typecmds.c:421 +#: commands/typecmds.c:436 #, c-format msgid "alignment \"%s\" not recognized" msgstr "тип вирівнювання \"%s\" не розпізнаний" -#: commands/typecmds.c:438 commands/typecmds.c:3718 +#: commands/typecmds.c:453 commands/typecmds.c:4155 #, c-format msgid "storage \"%s\" not recognized" msgstr "сховище \"%s\" не розпізнане" -#: commands/typecmds.c:449 +#: commands/typecmds.c:464 #, c-format msgid "type input function must be specified" msgstr "необхідно вказати функцію вводу типу" -#: commands/typecmds.c:453 +#: commands/typecmds.c:468 #, c-format msgid "type output function must be specified" msgstr "необхідно вказати функцію виводу типу" -#: commands/typecmds.c:458 +#: commands/typecmds.c:473 #, c-format msgid "type modifier output function is useless without a type modifier input function" msgstr "функція виводу модифікатора типу недоцільна без функції вводу модифікатора типу" -#: commands/typecmds.c:745 +#: commands/typecmds.c:515 +#, c-format +msgid "element type cannot be specified without a valid subscripting procedure" +msgstr "тип елементу не можна вказати без припустимої процедури підписки" + +#: commands/typecmds.c:784 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "\"%s\" - невідповідний базовий тип для домену" -#: commands/typecmds.c:837 +#: commands/typecmds.c:882 #, c-format msgid "multiple default expressions" msgstr "неодноразове визначення значення типу за замовчуванням" -#: commands/typecmds.c:900 commands/typecmds.c:909 +#: commands/typecmds.c:945 commands/typecmds.c:954 #, c-format msgid "conflicting NULL/NOT NULL constraints" msgstr "конфліктуючі обмеження NULL/NOT NULL" -#: commands/typecmds.c:925 +#: commands/typecmds.c:970 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "перевірки обмеження для доменів не можуть позначатись як NO INHERIT" -#: commands/typecmds.c:934 commands/typecmds.c:2536 +#: commands/typecmds.c:979 commands/typecmds.c:2975 #, c-format msgid "unique constraints not possible for domains" msgstr "обмеження унікальності неможливе для доменів" -#: commands/typecmds.c:940 commands/typecmds.c:2542 +#: commands/typecmds.c:985 commands/typecmds.c:2981 #, c-format msgid "primary key constraints not possible for domains" msgstr "обмеження первинного ключа неможливі для доменів" -#: commands/typecmds.c:946 commands/typecmds.c:2548 +#: commands/typecmds.c:991 commands/typecmds.c:2987 #, c-format msgid "exclusion constraints not possible for domains" msgstr "обмеження винятків неможливі для доменів" -#: commands/typecmds.c:952 commands/typecmds.c:2554 +#: commands/typecmds.c:997 commands/typecmds.c:2993 #, c-format msgid "foreign key constraints not possible for domains" msgstr "обмеження зовнішніх ключів неможливі для доменів" -#: commands/typecmds.c:961 commands/typecmds.c:2563 +#: commands/typecmds.c:1006 commands/typecmds.c:3002 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "зазначення відкладення обмежень для доменів не підтримується" -#: commands/typecmds.c:1271 utils/cache/typcache.c:2430 +#: commands/typecmds.c:1320 utils/cache/typcache.c:2563 #, c-format msgid "%s is not an enum" msgstr "%s не є переліком" -#: commands/typecmds.c:1402 +#: commands/typecmds.c:1473 #, c-format msgid "type attribute \"subtype\" is required" msgstr "вимагається атрибут типу \"subtype\"" -#: commands/typecmds.c:1407 +#: commands/typecmds.c:1478 #, c-format msgid "range subtype cannot be %s" msgstr "%s не може бути підтипом діапазону" -#: commands/typecmds.c:1426 +#: commands/typecmds.c:1497 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "вказано правило сортування для діапазону, але підтип не підтримує сортування" -#: commands/typecmds.c:1436 +#: commands/typecmds.c:1507 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "неможливо вказати канонічну функцію без попередньо створеного типу оболонки" -#: commands/typecmds.c:1437 +#: commands/typecmds.c:1508 #, c-format msgid "Create the type as a shell type, then create its canonicalization function, then do a full CREATE TYPE." msgstr "Створіть тип в якості оболонки, потім створіть його функцію канонізації, а потім виконайте повну CREATE TYPE." -#: commands/typecmds.c:1648 +#: commands/typecmds.c:1982 #, c-format msgid "type input function %s has multiple matches" msgstr "функція введення типу %s має декілька збігів" -#: commands/typecmds.c:1666 +#: commands/typecmds.c:2000 #, c-format msgid "type input function %s must return type %s" msgstr "функція вводу типу %s повинна повертати тип %s" -#: commands/typecmds.c:1682 +#: commands/typecmds.c:2016 #, c-format msgid "type input function %s should not be volatile" msgstr "функція введення типу %s не повинна бути змінною" -#: commands/typecmds.c:1710 +#: commands/typecmds.c:2044 #, c-format msgid "type output function %s must return type %s" msgstr "функція виводу типу %s повинна повертати тип %s" -#: commands/typecmds.c:1717 +#: commands/typecmds.c:2051 #, c-format msgid "type output function %s should not be volatile" msgstr "функція виводу типу %s не повинна бути змінною" -#: commands/typecmds.c:1746 +#: commands/typecmds.c:2080 #, c-format msgid "type receive function %s has multiple matches" msgstr "функція отримання типу %s має декілька збігів" -#: commands/typecmds.c:1764 +#: commands/typecmds.c:2098 #, c-format msgid "type receive function %s must return type %s" msgstr "функція отримання типу %s повинна повертати тип %s" -#: commands/typecmds.c:1771 +#: commands/typecmds.c:2105 #, c-format msgid "type receive function %s should not be volatile" msgstr "функція отримання типу %s не повинна бути змінною" -#: commands/typecmds.c:1799 +#: commands/typecmds.c:2133 #, c-format msgid "type send function %s must return type %s" msgstr "функція відправлення типу %s повинна повертати тип %s" -#: commands/typecmds.c:1806 +#: commands/typecmds.c:2140 #, c-format msgid "type send function %s should not be volatile" msgstr "функція відправлення типу %s не повинна бути змінною" -#: commands/typecmds.c:1833 +#: commands/typecmds.c:2167 #, c-format msgid "typmod_in function %s must return type %s" msgstr "функція typmod_in %s повинна повертати тип %s" -#: commands/typecmds.c:1840 +#: commands/typecmds.c:2174 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "функція вводу модифікатора типу %s не повинна бути змінною" -#: commands/typecmds.c:1867 +#: commands/typecmds.c:2201 #, c-format msgid "typmod_out function %s must return type %s" msgstr "функція typmod_out %s повинна повертати тип %s" -#: commands/typecmds.c:1874 +#: commands/typecmds.c:2208 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "функція виводу модифікатора типу %s не повинна бути змінною" -#: commands/typecmds.c:1901 +#: commands/typecmds.c:2235 #, c-format msgid "type analyze function %s must return type %s" msgstr "функція аналізу типу %s повинна повертати тип %s" -#: commands/typecmds.c:1947 +#: commands/typecmds.c:2264 +#, c-format +msgid "type subscripting function %s must return type %s" +msgstr "функція підписки типу %s повинна повертати тип %s" + +#: commands/typecmds.c:2274 +#, c-format +msgid "user-defined types cannot use subscripting function %s" +msgstr "типи визначені користувачем не можуть використовувати функцію підписки %s" + +#: commands/typecmds.c:2320 #, c-format msgid "You must specify an operator class for the range type or define a default operator class for the subtype." msgstr "Ви повинні вказати клас операторів для типу діапазону або визначити клас операторів за замовчуванням для цього підтипу." -#: commands/typecmds.c:1978 +#: commands/typecmds.c:2351 #, c-format msgid "range canonical function %s must return range type" msgstr "функція канонічного діапазону %s повинна вертати тип діапазону" -#: commands/typecmds.c:1984 +#: commands/typecmds.c:2357 #, c-format msgid "range canonical function %s must be immutable" msgstr "функція канонічного діапазону %s повинна бути незмінною" -#: commands/typecmds.c:2020 +#: commands/typecmds.c:2393 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "функція розбіжностей для підтипу діапазону %s повинна повертати тип %s" -#: commands/typecmds.c:2027 +#: commands/typecmds.c:2400 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "функція розбіжностей для підтипу діапазону %s повинна бути незмінною" -#: commands/typecmds.c:2054 +#: commands/typecmds.c:2427 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "значення OID масиву pg_type не встановлено в режимі двійкового оновлення" -#: commands/typecmds.c:2352 +#: commands/typecmds.c:2460 +#, c-format +msgid "pg_type multirange OID value not set when in binary upgrade mode" +msgstr "значення OID в pg_type не задано під час режиму двійкового оновлення" + +#: commands/typecmds.c:2493 +#, c-format +msgid "pg_type multirange array OID value not set when in binary upgrade mode" +msgstr "значення OID масиву в pg_type не задано під час режиму двійкового оновлення" + +#: commands/typecmds.c:2791 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "стовпець \"%s\" таблиці \"%s\" містить значення NULL" -#: commands/typecmds.c:2465 commands/typecmds.c:2667 +#: commands/typecmds.c:2904 commands/typecmds.c:3106 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "обмеження \"%s\" для домену \"%s\" не існує" -#: commands/typecmds.c:2469 +#: commands/typecmds.c:2908 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "обмеження \"%s\" для домену \"%s\" не існує, пропускається" -#: commands/typecmds.c:2674 +#: commands/typecmds.c:3113 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "обмеження \"%s\" для домену \"%s\" не є перевірочним обмеженням" -#: commands/typecmds.c:2780 +#: commands/typecmds.c:3219 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "стовпець \"%s\" таблиці \"%s\" містить значення, які порушують нове обмеження" -#: commands/typecmds.c:3009 commands/typecmds.c:3207 commands/typecmds.c:3289 -#: commands/typecmds.c:3476 +#: commands/typecmds.c:3448 commands/typecmds.c:3646 commands/typecmds.c:3727 +#: commands/typecmds.c:3913 #, c-format msgid "%s is not a domain" msgstr "%s - не домен" -#: commands/typecmds.c:3041 +#: commands/typecmds.c:3480 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "обмеження \"%s\" для домену \"%s\" вже існує" -#: commands/typecmds.c:3092 +#: commands/typecmds.c:3531 #, c-format msgid "cannot use table references in domain check constraint" msgstr "у перевірочному обмеженні для домену не можна посилатись на таблиці" -#: commands/typecmds.c:3219 commands/typecmds.c:3301 commands/typecmds.c:3593 +#: commands/typecmds.c:3658 commands/typecmds.c:3739 commands/typecmds.c:4030 #, c-format msgid "%s is a table's row type" msgstr "%s - тип рядків таблиці" -#: commands/typecmds.c:3221 commands/typecmds.c:3303 commands/typecmds.c:3595 +#: commands/typecmds.c:3660 commands/typecmds.c:3741 commands/typecmds.c:4032 #, c-format msgid "Use ALTER TABLE instead." msgstr "Замість цього використайте ALTER TABLE." -#: commands/typecmds.c:3228 commands/typecmds.c:3310 commands/typecmds.c:3508 +#: commands/typecmds.c:3666 commands/typecmds.c:3747 commands/typecmds.c:3945 #, c-format msgid "cannot alter array type %s" msgstr "змінити тип масиву \"%s\" не можна" -#: commands/typecmds.c:3230 commands/typecmds.c:3312 commands/typecmds.c:3510 +#: commands/typecmds.c:3668 commands/typecmds.c:3749 commands/typecmds.c:3947 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "Ви можете змінити тип %s, який спричинить зміну типу масиву." -#: commands/typecmds.c:3578 +#: commands/typecmds.c:4015 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "тип \"%s\" вже існує в схемі \"%s\"" -#: commands/typecmds.c:3746 +#: commands/typecmds.c:4183 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "неможливо змінити сховище типу на PLAIN" -#: commands/typecmds.c:3827 +#: commands/typecmds.c:4276 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "атрибут типу \"%s\" неможливо змінити" -#: commands/typecmds.c:3845 +#: commands/typecmds.c:4294 #, c-format msgid "must be superuser to alter a type" msgstr "для зміни типу потрібно бути суперкористувачем" -#: commands/typecmds.c:3866 commands/typecmds.c:3876 +#: commands/typecmds.c:4315 commands/typecmds.c:4324 #, c-format msgid "%s is not a base type" msgstr "%s - не є базовим типом" @@ -11007,33 +11381,33 @@ msgstr "для створення суперкористувачів необх msgid "must be superuser to create replication users" msgstr "для створення користувачів реплікацій потрібно бути суперкористувачем" -#: commands/user.c:308 commands/user.c:734 +#: commands/user.c:308 #, c-format -msgid "must be superuser to change bypassrls attribute" -msgstr "для зміни атрибута bypassrls потрібно бути суперкористувачем" +msgid "must be superuser to create bypassrls users" +msgstr "для створення bypassrls користувачів потрібно бути суперкористувачем" #: commands/user.c:315 #, c-format msgid "permission denied to create role" msgstr "немає прав для створення ролі" -#: commands/user.c:325 commands/user.c:1224 commands/user.c:1231 -#: utils/adt/acl.c:5327 utils/adt/acl.c:5333 gram.y:15146 gram.y:15184 +#: commands/user.c:325 commands/user.c:1226 commands/user.c:1233 +#: utils/adt/acl.c:5248 utils/adt/acl.c:5254 gram.y:15259 gram.y:15304 #, c-format msgid "role name \"%s\" is reserved" msgstr "ім'я ролі \"%s\" зарезервовано" -#: commands/user.c:327 commands/user.c:1226 commands/user.c:1233 +#: commands/user.c:327 commands/user.c:1228 commands/user.c:1235 #, c-format msgid "Role names starting with \"pg_\" are reserved." msgstr "Імена ролей, які починаються на \"pg_\", зарезервовані." -#: commands/user.c:348 commands/user.c:1248 +#: commands/user.c:348 commands/user.c:1250 #, c-format msgid "role \"%s\" already exists" msgstr "роль \"%s\" вже існує" -#: commands/user.c:414 commands/user.c:843 +#: commands/user.c:414 commands/user.c:845 #, c-format msgid "empty string is not a valid password, clearing password" msgstr "пустий рядок є неприпустимим паролем, пароль скидається" @@ -11043,262 +11417,287 @@ msgstr "пустий рядок є неприпустимим паролем, п msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "значення OID в pg_authid не встановлено в режимі двійкового оновлення" -#: commands/user.c:720 commands/user.c:944 commands/user.c:1485 -#: commands/user.c:1627 +#: commands/user.c:722 #, c-format -msgid "must be superuser to alter superusers" -msgstr "для зміни суперкористувачів потрібно бути суперкористувачем" +msgid "must be superuser to alter superuser roles or change superuser attribute" +msgstr "для зміни ролей суперкористувача або зміни атрибуту суперкористувача потрібно бути суперкористувачем" + +#: commands/user.c:729 +#, c-format +msgid "must be superuser to alter replication roles or change replication attribute" +msgstr "для зміни ролей реплікації або зміни атрибуту реплікації потрібно бути суперкористувачем" -#: commands/user.c:727 +#: commands/user.c:736 #, c-format -msgid "must be superuser to alter replication users" -msgstr "для зміни користувачів реплікацій потрібно бути суперкористувачем" +msgid "must be superuser to change bypassrls attribute" +msgstr "для зміни атрибута bypassrls потрібно бути суперкористувачем" -#: commands/user.c:750 commands/user.c:951 +#: commands/user.c:752 commands/user.c:953 #, c-format msgid "permission denied" msgstr "немає доступу" -#: commands/user.c:981 +#: commands/user.c:946 commands/user.c:1487 commands/user.c:1665 +#, c-format +msgid "must be superuser to alter superusers" +msgstr "для зміни суперкористувачів потрібно бути суперкористувачем" + +#: commands/user.c:983 #, c-format msgid "must be superuser to alter settings globally" msgstr "для глобальної зміни параметрів потрібно бути суперкористувачем" -#: commands/user.c:1003 +#: commands/user.c:1005 #, c-format msgid "permission denied to drop role" msgstr "немає прав для видалення ролі" -#: commands/user.c:1028 +#: commands/user.c:1030 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "використати спеціальну роль у DROP ROLE не можна" -#: commands/user.c:1038 commands/user.c:1195 commands/variable.c:770 -#: commands/variable.c:844 utils/adt/acl.c:5184 utils/adt/acl.c:5231 -#: utils/adt/acl.c:5259 utils/adt/acl.c:5277 utils/init/miscinit.c:675 +#: commands/user.c:1040 commands/user.c:1197 commands/variable.c:778 +#: commands/variable.c:781 commands/variable.c:865 commands/variable.c:868 +#: utils/adt/acl.c:5103 utils/adt/acl.c:5151 utils/adt/acl.c:5179 +#: utils/adt/acl.c:5198 utils/init/miscinit.c:705 #, c-format msgid "role \"%s\" does not exist" msgstr "роль \"%s\" не існує" -#: commands/user.c:1043 +#: commands/user.c:1045 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "роль \"%s\" не існує, пропускається" -#: commands/user.c:1056 commands/user.c:1060 +#: commands/user.c:1058 commands/user.c:1062 #, c-format msgid "current user cannot be dropped" msgstr "користувач не можна видалити сам себе" -#: commands/user.c:1064 +#: commands/user.c:1066 #, c-format msgid "session user cannot be dropped" msgstr "користувача поточного сеансу не можна видалити" -#: commands/user.c:1074 +#: commands/user.c:1076 #, c-format msgid "must be superuser to drop superusers" msgstr "для видалення суперкористувачів потрібно бути суперкористувачем" -#: commands/user.c:1090 +#: commands/user.c:1092 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "роль \"%s\" не можна видалити, тому що деякі об'єкти залежать від неї" -#: commands/user.c:1211 +#: commands/user.c:1213 #, c-format msgid "session user cannot be renamed" msgstr "користувача поточного сеансу не можна перейменувати" -#: commands/user.c:1215 +#: commands/user.c:1217 #, c-format msgid "current user cannot be renamed" msgstr "користувач не може перейменувати сам себе" -#: commands/user.c:1258 +#: commands/user.c:1260 #, c-format msgid "must be superuser to rename superusers" msgstr "для перейменування суперкористувачів потрібно бути суперкористувачем" -#: commands/user.c:1265 +#: commands/user.c:1267 #, c-format msgid "permission denied to rename role" msgstr "немає прав на перейменування ролі" -#: commands/user.c:1286 +#: commands/user.c:1288 #, c-format msgid "MD5 password cleared because of role rename" msgstr "У результаті перейменування ролі сума MD5 паролю очищена" -#: commands/user.c:1346 +#: commands/user.c:1348 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "в GRANT/REVOKE ROLE не можна включати назви стовпців" -#: commands/user.c:1384 +#: commands/user.c:1386 #, c-format msgid "permission denied to drop objects" msgstr "немає прав на видалення об'єктів" -#: commands/user.c:1411 commands/user.c:1420 +#: commands/user.c:1413 commands/user.c:1422 #, c-format msgid "permission denied to reassign objects" msgstr "немає прав на повторне призначення об'єктів" -#: commands/user.c:1493 commands/user.c:1635 +#: commands/user.c:1495 commands/user.c:1673 #, c-format msgid "must have admin option on role \"%s\"" msgstr "потрібно мати параметр admin для ролі \"%s\"" -#: commands/user.c:1510 +#: commands/user.c:1509 +#, c-format +msgid "role \"%s\" cannot have explicit members" +msgstr "роль \"%s\" не може мати явних членів" + +#: commands/user.c:1524 #, c-format msgid "must be superuser to set grantor" msgstr "для встановлення права управління правами необхідно бути суперкористувачем" -#: commands/user.c:1535 +#: commands/user.c:1560 +#, c-format +msgid "role \"%s\" cannot be a member of any role" +msgstr "роль \"%s\" не може бути членом якої-небудь ролі" + +#: commands/user.c:1573 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "роль \"%s\" - учасник ролі \"%s\"" -#: commands/user.c:1550 +#: commands/user.c:1588 #, c-format msgid "role \"%s\" is already a member of role \"%s\"" msgstr "роль \"%s\" вже є учасником ролі \"%s\"" -#: commands/user.c:1657 +#: commands/user.c:1695 #, c-format msgid "role \"%s\" is not a member of role \"%s\"" msgstr "роль \"%s\" не є учасником ролі \"%s\"" -#: commands/vacuum.c:129 +#: commands/vacuum.c:132 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "нерозпізнаний параметр ANALYZE \"%s\"" -#: commands/vacuum.c:151 +#: commands/vacuum.c:170 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "паралельний параметр потребує значення між 0 і %d" -#: commands/vacuum.c:163 +#: commands/vacuum.c:182 #, c-format -msgid "parallel vacuum degree must be between 0 and %d" -msgstr "ступінь паралельної очистки повинен бути між 0 і %d" +msgid "parallel workers for vacuum must be between 0 and %d" +msgstr "одночасні процеси для очищення повинні бути між 0 і %d" -#: commands/vacuum.c:180 +#: commands/vacuum.c:199 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "нерозпізнаний параметр VACUUM \"%s\"" -#: commands/vacuum.c:203 +#: commands/vacuum.c:222 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULL не можна виконати паралельно" -#: commands/vacuum.c:219 +#: commands/vacuum.c:238 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "Якщо задається список стовпців, необхідно вказати параметр ANALYZE" -#: commands/vacuum.c:309 +#: commands/vacuum.c:328 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s не можна виконати під час VACUUM або ANALYZE" -#: commands/vacuum.c:319 +#: commands/vacuum.c:338 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "Параметр VACUUM DISABLE_PAGE_SKIPPING не можна використовувати з FULL" -#: commands/vacuum.c:560 +#: commands/vacuum.c:345 +#, c-format +msgid "PROCESS_TOAST required with VACUUM FULL" +msgstr "PROCESS_TOAST потребується з VACUUM FULL" + +#: commands/vacuum.c:586 #, c-format msgid "skipping \"%s\" --- only superuser can vacuum it" msgstr "\"%s\" пропускається --- лише суперкористувач може очистити" -#: commands/vacuum.c:564 +#: commands/vacuum.c:590 #, c-format msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" msgstr "пропускається \"%s\" --- лише суперкористувач або власник БД може очистити" -#: commands/vacuum.c:568 +#: commands/vacuum.c:594 #, c-format msgid "skipping \"%s\" --- only table or database owner can vacuum it" msgstr "пропускається \"%s\" --- лише власник таблиці або бази даних може очистити" -#: commands/vacuum.c:583 +#: commands/vacuum.c:609 #, c-format msgid "skipping \"%s\" --- only superuser can analyze it" msgstr "пропуск об'єкта \"%s\" --- тільки суперкористувач може його аналізувати" -#: commands/vacuum.c:587 +#: commands/vacuum.c:613 #, c-format msgid "skipping \"%s\" --- only superuser or database owner can analyze it" msgstr "пропуск об'єкта \"%s\" --- тільки суперкористувач або власник бази даних може його аналізувати" -#: commands/vacuum.c:591 +#: commands/vacuum.c:617 #, c-format msgid "skipping \"%s\" --- only table or database owner can analyze it" msgstr "пропуск об'єкта \"%s\" --- тільки власник таблиці або бази даних може його аналізувати" -#: commands/vacuum.c:670 commands/vacuum.c:766 +#: commands/vacuum.c:696 commands/vacuum.c:792 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "очистка \"%s\" пропускається --- блокування недоступне" -#: commands/vacuum.c:675 +#: commands/vacuum.c:701 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "очистка \"%s\" пропускається --- це відношення більше не існує" -#: commands/vacuum.c:691 commands/vacuum.c:771 +#: commands/vacuum.c:717 commands/vacuum.c:797 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "пропуск аналізу об'єкта \"%s\" --- блокування недоступне" -#: commands/vacuum.c:696 +#: commands/vacuum.c:722 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "пропуск аналізу об'єкта\"%s\" --- відношення більше не існує" -#: commands/vacuum.c:994 +#: commands/vacuum.c:1040 #, c-format msgid "oldest xmin is far in the past" msgstr "найстарший xmin далеко в минулому" -#: commands/vacuum.c:995 +#: commands/vacuum.c:1041 #, c-format msgid "Close open transactions soon to avoid wraparound problems.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots." msgstr "Завершіть відкриті транзакції якнайшвидше, щоб уникнути проблеми зациклення.\n" "Можливо, вам також доведеться затвердити або відкотити старі підготовленні транзакції, або видалити застарілі слоти реплікації." -#: commands/vacuum.c:1036 +#: commands/vacuum.c:1082 #, c-format msgid "oldest multixact is far in the past" msgstr "найстарший multixact далеко в минулому" -#: commands/vacuum.c:1037 +#: commands/vacuum.c:1083 #, c-format msgid "Close open transactions with multixacts soon to avoid wraparound problems." msgstr "Завершіть відкриті транзакції з multixacts якнайшвидше, щоб уникнути проблеми зациклення." -#: commands/vacuum.c:1623 +#: commands/vacuum.c:1740 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "деякі бази даних не очищалися протягом більш ніж 2 мільярдів транзакцій" -#: commands/vacuum.c:1624 +#: commands/vacuum.c:1741 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "Можливо, ви вже втратили дані в результаті зациклення транзакцій." -#: commands/vacuum.c:1784 +#: commands/vacuum.c:1905 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "пропускається \"%s\" --- очищати не таблиці або спеціальні системні таблиці не можна" -#: commands/variable.c:165 utils/misc/guc.c:11156 utils/misc/guc.c:11218 +#: commands/variable.c:165 utils/misc/guc.c:11626 utils/misc/guc.c:11688 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "Нерозпізнане ключове слово: \"%s\"." @@ -11358,7 +11757,7 @@ msgstr "Команда SET TRANSACTION ISOLATION LEVEL повинна викли msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" msgstr "Команда SET TRANSACTION ISOLATION LEVEL не повинна викликатияь в підтранзакції" -#: commands/variable.c:548 storage/lmgr/predicate.c:1623 +#: commands/variable.c:548 storage/lmgr/predicate.c:1693 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "використовувати серіалізований режим в hot standby не можна" @@ -11393,7 +11792,12 @@ msgstr "Змінити клієнтське кодування зараз нем msgid "cannot change client_encoding during a parallel operation" msgstr "змінити клієнтське кодування під час паралельної операції неможливо" -#: commands/variable.c:863 +#: commands/variable.c:890 +#, c-format +msgid "permission will be denied to set role \"%s\"" +msgstr "немає дозволу для встановлення ролі \"%s\"" + +#: commands/variable.c:895 #, c-format msgid "permission denied to set role \"%s\"" msgstr "немає прав для встановлення ролі \"%s\"" @@ -11423,27 +11827,27 @@ msgstr "Щоб змінити назву стовпця подання, замі msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "змінити тип стовпця подання \"%s\" з %s на %s неможливо" -#: commands/view.c:441 +#: commands/view.c:438 #, c-format msgid "views must not contain SELECT INTO" msgstr "подання не повинні містити SELECT INTO" -#: commands/view.c:453 +#: commands/view.c:450 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "подання не повинні містити інструкції, які змінюють дані в WITH" -#: commands/view.c:523 +#: commands/view.c:520 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "У CREATE VIEW вказано більше імен стовпців, ніж самих стовпців" -#: commands/view.c:531 +#: commands/view.c:528 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "подання не можуть бути нежурнальованими, так як вони не мають сховища" -#: commands/view.c:545 +#: commands/view.c:542 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "подання \"%s\" буде тичасовим поданням" @@ -11479,33 +11883,58 @@ msgstr "курсор \"%s\" не розташовується у рядку" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "курсор \"%s\" - не просте оновлюване сканування таблиці \"%s\"" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2404 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2451 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "тип параметру %d (%s) не відповідає тому, з котрим тривала підготовка плану (%s)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2416 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2463 #, c-format msgid "no value found for parameter %d" msgstr "не знайдено значення для параметру %d" -#: executor/execExpr.c:859 parser/parse_agg.c:816 +#: executor/execExpr.c:632 executor/execExpr.c:639 executor/execExpr.c:645 +#: executor/execExprInterp.c:4023 executor/execExprInterp.c:4040 +#: executor/execExprInterp.c:4141 executor/nodeModifyTable.c:117 +#: executor/nodeModifyTable.c:128 executor/nodeModifyTable.c:145 +#: executor/nodeModifyTable.c:153 +#, c-format +msgid "table row type and query-specified row type do not match" +msgstr "тип рядка таблиці відрізняється від типу рядка-результату запиту" + +#: executor/execExpr.c:633 executor/nodeModifyTable.c:118 +#, c-format +msgid "Query has too many columns." +msgstr "Запит повертає дуже багато стовпців." + +#: executor/execExpr.c:640 executor/nodeModifyTable.c:146 +#, c-format +msgid "Query provides a value for a dropped column at ordinal position %d." +msgstr "Запит надає значення для видаленого стовпця з порядковим номером %d." + +#: executor/execExpr.c:646 executor/execExprInterp.c:4041 +#: executor/nodeModifyTable.c:129 +#, c-format +msgid "Table has type %s at ordinal position %d, but query expects %s." +msgstr "Таблиця має тип %s у порядковому розташуванні %d, але запит очікує %s." + +#: executor/execExpr.c:1110 parser/parse_agg.c:827 #, c-format msgid "window function calls cannot be nested" msgstr "виклики віконних функцій не можуть бути вкладеними" -#: executor/execExpr.c:1318 +#: executor/execExpr.c:1615 #, c-format msgid "target type is not an array" msgstr "цільовий тип не є масивом" -#: executor/execExpr.c:1651 +#: executor/execExpr.c:1955 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "Стовпець ROW() має тип %s замість %s" -#: executor/execExpr.c:2176 executor/execSRF.c:708 parser/parse_func.c:135 -#: parser/parse_func.c:646 parser/parse_func.c:1020 +#: executor/execExpr.c:2480 executor/execSRF.c:718 parser/parse_func.c:138 +#: parser/parse_func.c:655 parser/parse_func.c:1031 #, c-format msgid "cannot pass more than %d argument to a function" msgid_plural "cannot pass more than %d arguments to a function" @@ -11514,80 +11943,85 @@ msgstr[1] "функції не можна передати більше ніж % msgstr[2] "функції не можна передати більше ніж %d аргументів" msgstr[3] "функції не можна передати більше ніж %d аргументів" -#: executor/execExpr.c:2587 executor/execExpr.c:2593 -#: executor/execExprInterp.c:2730 utils/adt/arrayfuncs.c:262 -#: utils/adt/arrayfuncs.c:560 utils/adt/arrayfuncs.c:1302 -#: utils/adt/arrayfuncs.c:3348 utils/adt/arrayfuncs.c:5308 -#: utils/adt/arrayfuncs.c:5821 +#: executor/execExpr.c:2866 parser/parse_node.c:277 parser/parse_node.c:327 #, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "число вимірів масива (%d) перевищує ліміт (%d)" +msgid "cannot subscript type %s because it does not support subscripting" +msgstr "не можна підписати вказати тип %s, тому що він не підтримує підписку" -#: executor/execExprInterp.c:1894 +#: executor/execExpr.c:2994 executor/execExpr.c:3016 +#, c-format +msgid "type %s does not support subscripted assignment" +msgstr "тип %s не підтримує вказані присвоєння за підпискою" + +#: executor/execExprInterp.c:1916 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "атрибут %d типу %s був видалений" -#: executor/execExprInterp.c:1900 +#: executor/execExprInterp.c:1922 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "атрибут %d типу %s має неправильний тип" -#: executor/execExprInterp.c:1902 executor/execExprInterp.c:3002 -#: executor/execExprInterp.c:3049 +#: executor/execExprInterp.c:1924 executor/execExprInterp.c:3052 +#: executor/execExprInterp.c:3098 #, c-format msgid "Table has type %s, but query expects %s." msgstr "Таблиця має тип %s, але запит очікував %s." -#: executor/execExprInterp.c:2494 +#: executor/execExprInterp.c:2003 utils/adt/expandedrecord.c:99 +#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1748 +#: utils/cache/typcache.c:1904 utils/cache/typcache.c:2051 +#: utils/fmgr/funcapi.c:458 +#, c-format +msgid "type %s is not composite" +msgstr "тип %s не є складеним" + +#: executor/execExprInterp.c:2541 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF для таблиць такого типу не підтримується" -#: executor/execExprInterp.c:2708 +#: executor/execExprInterp.c:2754 #, c-format msgid "cannot merge incompatible arrays" msgstr "не можна об'єднати несумісні масиви" -#: executor/execExprInterp.c:2709 +#: executor/execExprInterp.c:2755 #, c-format msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." msgstr "Масив з типом елементів %s не може бути включений в конструкцію ARRAY з типом елементів %s." -#: executor/execExprInterp.c:2750 executor/execExprInterp.c:2780 +#: executor/execExprInterp.c:2776 utils/adt/arrayfuncs.c:262 +#: utils/adt/arrayfuncs.c:562 utils/adt/arrayfuncs.c:1304 +#: utils/adt/arrayfuncs.c:3374 utils/adt/arrayfuncs.c:5336 +#: utils/adt/arrayfuncs.c:5853 utils/adt/arraysubs.c:150 +#: utils/adt/arraysubs.c:488 +#, c-format +msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +msgstr "число вимірів масива (%d) перевищує ліміт (%d)" + +#: executor/execExprInterp.c:2796 executor/execExprInterp.c:2826 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "для багатовимірних масивів повинні задаватись вирази з відповідними вимірами" -#: executor/execExprInterp.c:3001 executor/execExprInterp.c:3048 +#: executor/execExprInterp.c:3051 executor/execExprInterp.c:3097 #, c-format msgid "attribute %d has wrong type" msgstr "атрибут %d має неправильний тип" -#: executor/execExprInterp.c:3158 -#, c-format -msgid "array subscript in assignment must not be null" -msgstr "підрядковий символ масиву у призначенні не може бути NULL" - -#: executor/execExprInterp.c:3588 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3652 utils/adt/domains.c:149 #, c-format msgid "domain %s does not allow null values" msgstr "домен %s не допускає значення null" -#: executor/execExprInterp.c:3603 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3667 utils/adt/domains.c:184 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "значення домену %s порушує перевірочнео бмеження \"%s\"" -#: executor/execExprInterp.c:3973 executor/execExprInterp.c:3990 -#: executor/execExprInterp.c:4091 executor/nodeModifyTable.c:109 -#: executor/nodeModifyTable.c:120 executor/nodeModifyTable.c:137 -#: executor/nodeModifyTable.c:145 -#, c-format -msgid "table row type and query-specified row type do not match" -msgstr "тип рядка таблиці відрізняється від типу рядка-результату запиту" - -#: executor/execExprInterp.c:3974 +#: executor/execExprInterp.c:4024 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." @@ -11596,220 +12030,215 @@ msgstr[1] "Рядок таблиці містить %d атрибути, але msgstr[2] "Рядок таблиці містить %d атрибутів, але запит очікував %d." msgstr[3] "Рядок таблиці містить %d атрибутів, але запит очікував %d." -#: executor/execExprInterp.c:3991 executor/nodeModifyTable.c:121 -#, c-format -msgid "Table has type %s at ordinal position %d, but query expects %s." -msgstr "Таблиця має тип %s у порядковому розташуванні %d, але запит очікує %s." - -#: executor/execExprInterp.c:4092 executor/execSRF.c:967 +#: executor/execExprInterp.c:4142 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "Невідповідність параметрів фізичного зберігання видаленого атрибуту %d." -#: executor/execIndexing.c:550 +#: executor/execIndexing.c:571 #, c-format msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" msgstr "ON CONFLICT не підтримує відкладені обмеження унікальності/обмеження-виключення в якості визначального індексу" -#: executor/execIndexing.c:821 +#: executor/execIndexing.c:842 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "не вдалося створити обмеження-виключення \"%s\"" -#: executor/execIndexing.c:824 +#: executor/execIndexing.c:845 #, c-format msgid "Key %s conflicts with key %s." msgstr "Ключ %s конфліктує з ключем %s." -#: executor/execIndexing.c:826 +#: executor/execIndexing.c:847 #, c-format msgid "Key conflicts exist." msgstr "Існують конфлікти ключей." -#: executor/execIndexing.c:832 +#: executor/execIndexing.c:853 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "конфліктуюче значення ключа порушує обмеження-виключення \"%s\"" -#: executor/execIndexing.c:835 +#: executor/execIndexing.c:856 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "Ключ %s конфліктує з існуючим ключем %s." -#: executor/execIndexing.c:837 +#: executor/execIndexing.c:858 #, c-format msgid "Key conflicts with existing key." msgstr "Ключ конфліктує з існуючим ключем." -#: executor/execMain.c:1091 +#: executor/execMain.c:1007 #, c-format msgid "cannot change sequence \"%s\"" msgstr "послідовність \"%s\" не можна змінити" -#: executor/execMain.c:1097 +#: executor/execMain.c:1013 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "TOAST-відношення \"%s\" не можна змінити" -#: executor/execMain.c:1115 rewrite/rewriteHandler.c:2934 -#: rewrite/rewriteHandler.c:3708 +#: executor/execMain.c:1031 rewrite/rewriteHandler.c:3041 +#: rewrite/rewriteHandler.c:3838 #, c-format msgid "cannot insert into view \"%s\"" msgstr "вставити дані в подання \"%s\" не можна" -#: executor/execMain.c:1117 rewrite/rewriteHandler.c:2937 -#: rewrite/rewriteHandler.c:3711 +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3044 +#: rewrite/rewriteHandler.c:3841 #, c-format msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." msgstr "Щоб подання допускало додавання даних, встановіть тригер INSTEAD OF INSERT або безумовне правило ON INSERT DO INSTEAD." -#: executor/execMain.c:1123 rewrite/rewriteHandler.c:2942 -#: rewrite/rewriteHandler.c:3716 +#: executor/execMain.c:1039 rewrite/rewriteHandler.c:3049 +#: rewrite/rewriteHandler.c:3846 #, c-format msgid "cannot update view \"%s\"" msgstr "оновити подання \"%s\" не можна" -#: executor/execMain.c:1125 rewrite/rewriteHandler.c:2945 -#: rewrite/rewriteHandler.c:3719 +#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3052 +#: rewrite/rewriteHandler.c:3849 #, c-format msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." msgstr "Щоб подання допускало оновлення, встановіть тригер INSTEAD OF UPDATE або безумовне правило ON UPDATE DO INSTEAD." -#: executor/execMain.c:1131 rewrite/rewriteHandler.c:2950 -#: rewrite/rewriteHandler.c:3724 +#: executor/execMain.c:1047 rewrite/rewriteHandler.c:3057 +#: rewrite/rewriteHandler.c:3854 #, c-format msgid "cannot delete from view \"%s\"" msgstr "видалити дані з подання \"%s\" не можна" -#: executor/execMain.c:1133 rewrite/rewriteHandler.c:2953 -#: rewrite/rewriteHandler.c:3727 +#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3060 +#: rewrite/rewriteHandler.c:3857 #, c-format msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." msgstr "Щоб подання допускало видалення даних, встановіть тригер INSTEAD OF DELETE або безумновне правило ON DELETE DO INSTEAD." -#: executor/execMain.c:1144 +#: executor/execMain.c:1060 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "змінити матеріалізоване подання \"%s\" не можна" -#: executor/execMain.c:1156 +#: executor/execMain.c:1072 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "вставляти дані в зовнішню таблицю \"%s\" не можна" -#: executor/execMain.c:1162 +#: executor/execMain.c:1078 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "зовнішня таблиця \"%s\" не допускає додавання даних" -#: executor/execMain.c:1169 +#: executor/execMain.c:1085 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "оновити зовнішню таблицю \"%s\" не можна" -#: executor/execMain.c:1175 +#: executor/execMain.c:1091 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "зовнішня таблиця \"%s\" не дозволяє оновлення" -#: executor/execMain.c:1182 +#: executor/execMain.c:1098 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "видаляти дані з зовнішньої таблиці \"%s\" не можна" -#: executor/execMain.c:1188 +#: executor/execMain.c:1104 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "зовнішня таблиця \"%s\" не дозволяє видалення даних" -#: executor/execMain.c:1199 +#: executor/execMain.c:1115 #, c-format msgid "cannot change relation \"%s\"" msgstr "відношення \"%s\" не можна змінити" -#: executor/execMain.c:1226 +#: executor/execMain.c:1142 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "блокувати рядки в послідовності \"%s\" не можна" -#: executor/execMain.c:1233 +#: executor/execMain.c:1149 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "блокувати рядки в TOAST-відношенні \"%s\" не можна" -#: executor/execMain.c:1240 +#: executor/execMain.c:1156 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "блокувати рядки в поданні \"%s\" не можна" -#: executor/execMain.c:1248 +#: executor/execMain.c:1164 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "блокувати рядки в матеріалізованому поданні \"%s\" не можна" -#: executor/execMain.c:1257 executor/execMain.c:2627 -#: executor/nodeLockRows.c:132 +#: executor/execMain.c:1173 executor/execMain.c:2555 +#: executor/nodeLockRows.c:136 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "блокувати рядки в зовнішній таблиці \"%s\" не можна" -#: executor/execMain.c:1263 +#: executor/execMain.c:1179 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "блокувати рядки у відношенні \"%s\" не можна" -#: executor/execMain.c:1879 +#: executor/execMain.c:1803 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "новий рядок для відношення \"%s\" порушує обмеження секції" -#: executor/execMain.c:1881 executor/execMain.c:1964 executor/execMain.c:2012 -#: executor/execMain.c:2120 +#: executor/execMain.c:1805 executor/execMain.c:1888 executor/execMain.c:1938 +#: executor/execMain.c:2047 #, c-format msgid "Failing row contains %s." msgstr "Помилковий рядок містить %s." -#: executor/execMain.c:1961 +#: executor/execMain.c:1885 #, c-format msgid "null value in column \"%s\" of relation \"%s\" violates not-null constraint" msgstr "null значення в стовпці \"%s\" відношення \"%s\" порушує not-null обмеження" -#: executor/execMain.c:2010 +#: executor/execMain.c:1936 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "новий рядок для відношення \"%s\" порушує перевірне обмеження перевірку \"%s\"" -#: executor/execMain.c:2118 +#: executor/execMain.c:2045 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "новий рядок порушує параметр перевірки для подання \"%s\"" -#: executor/execMain.c:2128 +#: executor/execMain.c:2055 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "новий рядок порушує політику захисту на рівні рядків \"%s\" для таблиці \"%s\"" -#: executor/execMain.c:2133 +#: executor/execMain.c:2060 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "новий рядок порушує політику захисту на рівні рядків для таблиці \"%s\"" -#: executor/execMain.c:2140 +#: executor/execMain.c:2067 #, c-format msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "новий рядок порушує політику захисту на рівні рядків \"%s\" (вираз USING) для таблиці \"%s\"" -#: executor/execMain.c:2145 +#: executor/execMain.c:2072 #, c-format msgid "new row violates row-level security policy (USING expression) for table \"%s\"" msgstr "новий рядок порушує політику захисту на рівні рядків (вираз USING) для таблиці \"%s\"" -#: executor/execPartition.c:341 +#: executor/execPartition.c:322 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "для рядка не знайдено секції у відношенні \"%s\"" -#: executor/execPartition.c:344 +#: executor/execPartition.c:325 #, c-format msgid "Partition key of the failing row contains %s." msgstr "Ключ секціонування для невідповідного рядка містить %s." @@ -11829,45 +12258,46 @@ msgstr "паралельне оновлення, триває повторна msgid "concurrent delete, retrying" msgstr "паралельне видалення, триває повторна спроба" -#: executor/execReplication.c:269 parser/parse_oper.c:228 -#: utils/adt/array_userfuncs.c:719 utils/adt/array_userfuncs.c:858 -#: utils/adt/arrayfuncs.c:3626 utils/adt/arrayfuncs.c:4146 -#: utils/adt/arrayfuncs.c:6132 utils/adt/rowtypes.c:1182 +#: executor/execReplication.c:269 parser/parse_cte.c:502 +#: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:720 +#: utils/adt/array_userfuncs.c:859 utils/adt/arrayfuncs.c:3654 +#: utils/adt/arrayfuncs.c:4174 utils/adt/arrayfuncs.c:6166 +#: utils/adt/rowtypes.c:1203 #, c-format msgid "could not identify an equality operator for type %s" msgstr "не вдалося визначити оператора рівності для типу %s" -#: executor/execReplication.c:586 +#: executor/execReplication.c:590 #, c-format msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" msgstr "оновлення в таблиці \"%s\" неможливе, тому що в ній відсутній ідентифікатор репліки, і вона публікує оновлення" -#: executor/execReplication.c:588 +#: executor/execReplication.c:592 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Щоб ця таблиця підтримувала оновлення, встановіть REPLICA IDENTITY, використавши ALTER TABLE." -#: executor/execReplication.c:592 +#: executor/execReplication.c:596 #, c-format msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" msgstr "видалення з таблиці \"%s\" неможливе, тому що в ній відсутній ідентифікатор репліки, і вона публікує видалення" -#: executor/execReplication.c:594 +#: executor/execReplication.c:598 #, c-format msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Щоб ця таблиця підтримувала видалення, встановіть REPLICA IDENTITY, використавши ALTER TABLE." -#: executor/execReplication.c:613 executor/execReplication.c:621 +#: executor/execReplication.c:617 executor/execReplication.c:625 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "використовувати відношення \"%s.%s\" як ціль логічної реплікації, не можна" -#: executor/execReplication.c:615 +#: executor/execReplication.c:619 #, c-format msgid "\"%s.%s\" is a foreign table." msgstr "\"%s.%s\" є зовнішньою таблицею." -#: executor/execReplication.c:623 +#: executor/execReplication.c:627 #, c-format msgid "\"%s.%s\" is not a table." msgstr "\"%s.%s\" не є таблицею." @@ -11877,27 +12307,32 @@ msgstr "\"%s.%s\" не є таблицею." msgid "rows returned by function are not all of the same row type" msgstr "рядки, які повернула функція, не мають однаковий тип рядка" -#: executor/execSRF.c:363 executor/execSRF.c:657 +#: executor/execSRF.c:365 +#, c-format +msgid "table-function protocol for value-per-call mode was not followed" +msgstr "протокол функції-таблиці для режиму значення-на-виклик не дотримувався" + +#: executor/execSRF.c:373 executor/execSRF.c:667 #, c-format msgid "table-function protocol for materialize mode was not followed" msgstr "порушення протоколу табличної функції в режимі матеріалізації" -#: executor/execSRF.c:370 executor/execSRF.c:675 +#: executor/execSRF.c:380 executor/execSRF.c:685 #, c-format msgid "unrecognized table-function returnMode: %d" msgstr "нерозпізнаний режим повернення табличної функції: %d" -#: executor/execSRF.c:884 +#: executor/execSRF.c:894 #, c-format msgid "function returning setof record called in context that cannot accept type record" msgstr "функція, що повертає набір записів, викликана в контексті, що не може прийняти тип запису" -#: executor/execSRF.c:940 executor/execSRF.c:956 executor/execSRF.c:966 +#: executor/execSRF.c:950 executor/execSRF.c:966 executor/execSRF.c:976 #, c-format msgid "function return row and query-specified return row do not match" msgstr "тип результату функції відрізняється від типу рядка-результату запиту" -#: executor/execSRF.c:941 +#: executor/execSRF.c:951 #, c-format msgid "Returned row contains %d attribute, but query expects %d." msgid_plural "Returned row contains %d attributes, but query expects %d." @@ -11906,111 +12341,117 @@ msgstr[1] "Повернений рядок містить %d атрибути, msgstr[2] "Повернений рядок містить %d атрибутів, але запит очікував %d." msgstr[3] "Повернений рядок містить %d атрибутів, але запит очікував %d." -#: executor/execSRF.c:957 +#: executor/execSRF.c:967 #, c-format msgid "Returned type %s at ordinal position %d, but query expects %s." msgstr "Повернений тип %s у порядковій позиції %d, але запит очікував %s." -#: executor/execUtils.c:750 +#: executor/execTuples.c:146 executor/execTuples.c:353 +#: executor/execTuples.c:521 executor/execTuples.c:712 +#, c-format +msgid "cannot retrieve a system column in this context" +msgstr "не можна отримати системний стовпець в цьому контексті" + +#: executor/execUtils.c:736 #, c-format msgid "materialized view \"%s\" has not been populated" msgstr "матеріалізоване подання \"%s\" не було наповнене" -#: executor/execUtils.c:752 +#: executor/execUtils.c:738 #, c-format msgid "Use the REFRESH MATERIALIZED VIEW command." msgstr "Використайте команду REFRESH MATERIALIZED VIEW." -#: executor/functions.c:231 +#: executor/functions.c:217 #, c-format msgid "could not determine actual type of argument declared %s" msgstr "не вдалося визначити фактичний тип аргументу, оголошеного як %s" -#: executor/functions.c:528 +#: executor/functions.c:514 #, c-format -msgid "cannot COPY to/from client in a SQL function" -msgstr "у функції SQL не можна виконати COPY to/from client" +msgid "cannot COPY to/from client in an SQL function" +msgstr "у функції SQL не можна виконати COPY до/з клієнта" #. translator: %s is a SQL statement name -#: executor/functions.c:534 +#: executor/functions.c:520 #, c-format -msgid "%s is not allowed in a SQL function" +msgid "%s is not allowed in an SQL function" msgstr "функція SQL не дозволяє використання %s" #. translator: %s is a SQL statement name -#: executor/functions.c:542 executor/spi.c:1471 executor/spi.c:2257 +#: executor/functions.c:528 executor/spi.c:1633 executor/spi.c:2485 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "незмінна функція не дозволяє використання %s" -#: executor/functions.c:1430 +#: executor/functions.c:1442 #, c-format msgid "SQL function \"%s\" statement %d" msgstr "SQL функція \"%s\" оператор %d" -#: executor/functions.c:1456 +#: executor/functions.c:1468 #, c-format msgid "SQL function \"%s\" during startup" msgstr "SQL функція \"%s\" під час запуску" -#: executor/functions.c:1549 +#: executor/functions.c:1553 #, c-format msgid "calling procedures with output arguments is not supported in SQL functions" msgstr "виклик процедур з вихідними аргументами в функціях SQL не підтримується" -#: executor/functions.c:1671 executor/functions.c:1708 -#: executor/functions.c:1722 executor/functions.c:1812 -#: executor/functions.c:1845 executor/functions.c:1859 +#: executor/functions.c:1686 executor/functions.c:1724 +#: executor/functions.c:1738 executor/functions.c:1828 +#: executor/functions.c:1861 executor/functions.c:1875 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "невідповідність типу повернення в функції, оголошеній як %s" -#: executor/functions.c:1673 +#: executor/functions.c:1688 #, c-format msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." msgstr "Останнім оператором у функції повинен бути SELECT або INSERT/UPDATE/DELETE RETURNING." -#: executor/functions.c:1710 +#: executor/functions.c:1726 #, c-format msgid "Final statement must return exactly one column." msgstr "Останній оператор повинен вертати один стовпець." -#: executor/functions.c:1724 +#: executor/functions.c:1740 #, c-format msgid "Actual return type is %s." msgstr "Фактичний тип повернення: %s." -#: executor/functions.c:1814 +#: executor/functions.c:1830 #, c-format msgid "Final statement returns too many columns." msgstr "Останній оператор вертає дуже багато стовпців." -#: executor/functions.c:1847 +#: executor/functions.c:1863 #, c-format msgid "Final statement returns %s instead of %s at column %d." msgstr "Останній оператор поветрає %s замість %s для стовпця %d." -#: executor/functions.c:1861 +#: executor/functions.c:1877 #, c-format msgid "Final statement returns too few columns." msgstr "Останній оператор вертає дуже мало стовпців." -#: executor/functions.c:1889 +#: executor/functions.c:1905 #, c-format msgid "return type %s is not supported for SQL functions" msgstr "для SQL функцій тип повернення %s не підтримується" -#: executor/nodeAgg.c:3075 executor/nodeAgg.c:3084 executor/nodeAgg.c:3096 +#: executor/nodeAgg.c:3087 executor/nodeAgg.c:3096 executor/nodeAgg.c:3108 #, c-format msgid "unexpected EOF for tape %d: requested %zu bytes, read %zu bytes" msgstr "неочікуваний обрив для стрічки %d: запитано %zu байт, прочитано %zu байт" -#: executor/nodeAgg.c:4026 parser/parse_agg.c:655 parser/parse_agg.c:685 +#: executor/nodeAgg.c:3981 parser/parse_agg.c:666 parser/parse_agg.c:696 #, c-format msgid "aggregate function calls cannot be nested" msgstr "виклики агрегатних функцій не можуть бути вкладеними" -#: executor/nodeAgg.c:4234 executor/nodeWindowAgg.c:2836 +#: executor/nodeAgg.c:4189 executor/nodeWindowAgg.c:2836 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "агрегатна функція %u повинна мати сумісні тип введення і тип переходу" @@ -12055,42 +12496,32 @@ msgstr "RIGHT JOIN підтримується лише з умовами, які msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOIN підтримується лише з умовами, які допускають з'єднання злиттям" -#: executor/nodeModifyTable.c:110 -#, c-format -msgid "Query has too many columns." -msgstr "Запит повертає дуже багато стовпців." - -#: executor/nodeModifyTable.c:138 -#, c-format -msgid "Query provides a value for a dropped column at ordinal position %d." -msgstr "Запит надає значення для видаленого стовпця з порядковим номером %d." - -#: executor/nodeModifyTable.c:146 +#: executor/nodeModifyTable.c:154 #, c-format msgid "Query has too few columns." msgstr "Запит повертає дуже мало стовпців." -#: executor/nodeModifyTable.c:839 executor/nodeModifyTable.c:913 +#: executor/nodeModifyTable.c:1205 executor/nodeModifyTable.c:1279 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "кортеж, який підлягає видаленню, вже змінений в операції, яка викликана поточною командою." -#: executor/nodeModifyTable.c:1220 +#: executor/nodeModifyTable.c:1454 #, c-format msgid "invalid ON UPDATE specification" msgstr "неприпустима специфікація ON UPDATE" -#: executor/nodeModifyTable.c:1221 +#: executor/nodeModifyTable.c:1455 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "Результуючий кортеж з'явиться в іншій секції в порівнянні з оригінальним кортежем." -#: executor/nodeModifyTable.c:1592 +#: executor/nodeModifyTable.c:2051 #, c-format msgid "ON CONFLICT DO UPDATE command cannot affect row a second time" msgstr "Команда ON CONFLICT DO UPDATE не може змінювати рядок вдруге" -#: executor/nodeModifyTable.c:1593 +#: executor/nodeModifyTable.c:2052 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "Переконайтеся, що немає рядків для вставки з тією ж командою з дуплікованими обмежувальними значеннями." @@ -12106,7 +12537,7 @@ msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "Параметр TABLESAMPLE REPEATABLE не може бути null" #: executor/nodeSubplan.c:346 executor/nodeSubplan.c:385 -#: executor/nodeSubplan.c:1151 +#: executor/nodeSubplan.c:1159 #, c-format msgid "more than one row returned by a subquery used as an expression" msgstr "підзапит, використаний в якості вираження, повернув більше ніж один рядок" @@ -12166,58 +12597,68 @@ msgstr "зсув кінця рамки не повинен бути негати msgid "aggregate function %s does not support use as a window function" msgstr "агрегатна функція %s не підтримує використання в якості віконної функції" -#: executor/spi.c:228 executor/spi.c:297 +#: executor/spi.c:237 executor/spi.c:302 #, c-format msgid "invalid transaction termination" msgstr "неприпустиме завершення транзакції" -#: executor/spi.c:242 +#: executor/spi.c:251 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "неможливо затвердити, коли підтранзакції активні" -#: executor/spi.c:303 +#: executor/spi.c:308 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "неможливо відкотити, коли підтранзакції активні" -#: executor/spi.c:372 +#: executor/spi.c:380 #, c-format msgid "transaction left non-empty SPI stack" msgstr "транзакція залишила непорожню групу SPI" -#: executor/spi.c:373 executor/spi.c:435 +#: executor/spi.c:381 executor/spi.c:443 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "Перевірте наявність виклику \"SPI_finish\"." -#: executor/spi.c:434 +#: executor/spi.c:442 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "підтранзакція залишила непорожню групу SPI" -#: executor/spi.c:1335 +#: executor/spi.c:1495 #, c-format msgid "cannot open multi-query plan as cursor" msgstr "неможливо відкрити план декількох запитів як курсор" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:1340 +#: executor/spi.c:1500 #, c-format msgid "cannot open %s query as cursor" msgstr "неможливо відкрити запит %s як курсор" -#: executor/spi.c:1445 +#: executor/spi.c:1607 #, c-format msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE не підтримується" -#: executor/spi.c:1446 parser/analyze.c:2508 +#: executor/spi.c:1608 parser/analyze.c:2808 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Курсори з прокручуванням повинні бути READ ONLY." -#: executor/spi.c:2560 +#: executor/spi.c:2809 +#, c-format +msgid "SQL expression \"%s\"" +msgstr "SQL вираз \"%s\"" + +#: executor/spi.c:2814 +#, c-format +msgid "PL/pgSQL assignment \"%s\"" +msgstr "PL/pgSQL присвоєння \"%s\"" + +#: executor/spi.c:2817 #, c-format msgid "SQL statement \"%s\"" msgstr "SQL-оператор \"%s\"" @@ -12248,388 +12689,371 @@ msgstr "У цьому контексті припустимі параметри msgid "could not access file \"%s\": %m" msgstr "немає доступу до файлу \"%s\": %m" -#: jit/llvm/llvmjit.c:595 -#, c-format -msgid "time to inline: %.3fs, opt: %.3fs, emit: %.3fs" -msgstr "час впровадження: %.3fs, оптимізації: %.3fs, видачі: %.3fs" - #: lib/dshash.c:247 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 #: utils/mmgr/dsa.c:805 #, c-format msgid "Failed on DSA request of size %zu." msgstr "Не вдалося виконати запит DSA розміру %zu." -#: libpq/auth-scram.c:248 +#: libpq/auth-scram.c:249 #, c-format msgid "client selected an invalid SASL authentication mechanism" msgstr "клієнт обрав неприпустимий механізм автентифікації SASL" -#: libpq/auth-scram.c:269 libpq/auth-scram.c:509 libpq/auth-scram.c:520 +#: libpq/auth-scram.c:270 libpq/auth-scram.c:510 libpq/auth-scram.c:521 #, c-format msgid "invalid SCRAM secret for user \"%s\"" msgstr "неприпустимий секрет SCRAM для користувача \"%s\"" -#: libpq/auth-scram.c:280 +#: libpq/auth-scram.c:281 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "Користувач \"%s\" не має припустимого секрету SCRAM." -#: libpq/auth-scram.c:358 libpq/auth-scram.c:363 libpq/auth-scram.c:693 -#: libpq/auth-scram.c:701 libpq/auth-scram.c:806 libpq/auth-scram.c:819 -#: libpq/auth-scram.c:829 libpq/auth-scram.c:937 libpq/auth-scram.c:944 -#: libpq/auth-scram.c:959 libpq/auth-scram.c:974 libpq/auth-scram.c:988 -#: libpq/auth-scram.c:1006 libpq/auth-scram.c:1021 libpq/auth-scram.c:1321 -#: libpq/auth-scram.c:1329 +#: libpq/auth-scram.c:359 libpq/auth-scram.c:364 libpq/auth-scram.c:701 +#: libpq/auth-scram.c:709 libpq/auth-scram.c:814 libpq/auth-scram.c:827 +#: libpq/auth-scram.c:837 libpq/auth-scram.c:945 libpq/auth-scram.c:952 +#: libpq/auth-scram.c:967 libpq/auth-scram.c:982 libpq/auth-scram.c:996 +#: libpq/auth-scram.c:1014 libpq/auth-scram.c:1029 libpq/auth-scram.c:1340 +#: libpq/auth-scram.c:1348 #, c-format msgid "malformed SCRAM message" msgstr "неправильне повідомлення SCRAM" -#: libpq/auth-scram.c:359 +#: libpq/auth-scram.c:360 #, c-format msgid "The message is empty." msgstr "Повідомлення порожнє." -#: libpq/auth-scram.c:364 +#: libpq/auth-scram.c:365 #, c-format msgid "Message length does not match input length." msgstr "Довжина повідомлення не відповідає довжині вводу." -#: libpq/auth-scram.c:396 +#: libpq/auth-scram.c:397 #, c-format msgid "invalid SCRAM response" msgstr "неприпустима відповідь SCRAM" -#: libpq/auth-scram.c:397 +#: libpq/auth-scram.c:398 #, c-format msgid "Nonce does not match." msgstr "Одноразовий ідентифікатор не збігається." -#: libpq/auth-scram.c:471 +#: libpq/auth-scram.c:472 #, c-format msgid "could not generate random salt" msgstr "не вдалося згенерувати випадкову сіль" -#: libpq/auth-scram.c:694 +#: libpq/auth-scram.c:702 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "Очікувався атрибут \"%c\", але знайдено \"%s\"." -#: libpq/auth-scram.c:702 libpq/auth-scram.c:830 +#: libpq/auth-scram.c:710 libpq/auth-scram.c:838 #, c-format msgid "Expected character \"=\" for attribute \"%c\"." msgstr "Очікувався символ \"=\" для атрибуту \"%c\"." -#: libpq/auth-scram.c:807 +#: libpq/auth-scram.c:815 #, c-format msgid "Attribute expected, but found end of string." msgstr "Очікувався атрибут, але знайдено кінець рядка." -#: libpq/auth-scram.c:820 +#: libpq/auth-scram.c:828 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "Очікувався атрибут, але знайдено неприпустимий символ \"%s\"." -#: libpq/auth-scram.c:938 libpq/auth-scram.c:960 +#: libpq/auth-scram.c:946 libpq/auth-scram.c:968 #, c-format msgid "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not include channel binding data." msgstr "Клієнт обрав алгоритм SCRAM-SHA-256-PLUS, але повідомлення SCRAM не містить даних зв’язування каналів." -#: libpq/auth-scram.c:945 libpq/auth-scram.c:975 +#: libpq/auth-scram.c:953 libpq/auth-scram.c:983 #, c-format msgid "Comma expected, but found character \"%s\"." msgstr "Очікувалась кома, але знайдено символ \"%s\"." -#: libpq/auth-scram.c:966 +#: libpq/auth-scram.c:974 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "Помилка узгодження зв’язування каналів SCRAM" -#: libpq/auth-scram.c:967 +#: libpq/auth-scram.c:975 #, c-format msgid "The client supports SCRAM channel binding but thinks the server does not. However, this server does support channel binding." msgstr "Клієнт підтримує зв’язування каналів SCRAM, але думає, що сервер не підтримує. Однак, сервер теж підтримує зв’язування каналів." -#: libpq/auth-scram.c:989 +#: libpq/auth-scram.c:997 #, c-format msgid "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM message includes channel binding data." msgstr "Клієнт обрав алгоритм SCRAM-SHA-256 без зв’язування каналів, але повідомлення SCRAM містить дані зв’язування каналів." -#: libpq/auth-scram.c:1000 +#: libpq/auth-scram.c:1008 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "непідтримуваний тип зв'язування каналів SCRAM \"%s\"" -#: libpq/auth-scram.c:1007 +#: libpq/auth-scram.c:1015 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "Неочікувана позначка зв'язування каналів \"%s\"." -#: libpq/auth-scram.c:1017 +#: libpq/auth-scram.c:1025 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "клієнт використовує ідентифікатор для авторизації, але це не підтримується" -#: libpq/auth-scram.c:1022 +#: libpq/auth-scram.c:1030 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "Неочікуваний атрибут \"%s\" у першому повідомленні клієнта." -#: libpq/auth-scram.c:1038 +#: libpq/auth-scram.c:1046 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "клієнт потребує непідтримуване розширення SCRAM" -#: libpq/auth-scram.c:1052 +#: libpq/auth-scram.c:1060 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "недруковані символи в одноразовому ідентифікаторі SCRAM" -#: libpq/auth-scram.c:1169 +#: libpq/auth-scram.c:1188 #, c-format msgid "could not generate random nonce" msgstr "не вдалося згенерувати випадковий одноразовий ідентифікатор" -#: libpq/auth-scram.c:1179 +#: libpq/auth-scram.c:1198 #, c-format msgid "could not encode random nonce" msgstr "не вдалося кодувати випадковий одноразовий ідентифікатор" -#: libpq/auth-scram.c:1285 +#: libpq/auth-scram.c:1304 #, c-format msgid "SCRAM channel binding check failed" msgstr "Помилка перевірки зв'язування каналів SCRAM" -#: libpq/auth-scram.c:1303 +#: libpq/auth-scram.c:1322 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" msgstr "неочікуваний атрибут зв'язування каналів SCRAM в останньому повідомленні клієнта" -#: libpq/auth-scram.c:1322 +#: libpq/auth-scram.c:1341 #, c-format msgid "Malformed proof in client-final-message." msgstr "Неправильне підтвердження в останньому повідомленні клієнта." -#: libpq/auth-scram.c:1330 +#: libpq/auth-scram.c:1349 #, c-format msgid "Garbage found at the end of client-final-message." msgstr "Сміття знайдено в кінці останнього повідомлення клієнта." -#: libpq/auth.c:280 +#: libpq/auth.c:284 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "користувач \"%s\" не пройшов автентифікацію: відхилений хост" -#: libpq/auth.c:283 +#: libpq/auth.c:287 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "користувач \"%s\" не пройшов автентифікацію \"trust\"" -#: libpq/auth.c:286 +#: libpq/auth.c:290 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію Ident" -#: libpq/auth.c:289 +#: libpq/auth.c:293 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію Peer" -#: libpq/auth.c:294 +#: libpq/auth.c:298 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "користувач \"%s\" не пройшов автентифікацію за допомогою пароля" -#: libpq/auth.c:299 +#: libpq/auth.c:303 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію GSSAPI" -#: libpq/auth.c:302 +#: libpq/auth.c:306 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію SSPI" -#: libpq/auth.c:305 +#: libpq/auth.c:309 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію PAM" -#: libpq/auth.c:308 +#: libpq/auth.c:312 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію BSD" -#: libpq/auth.c:311 +#: libpq/auth.c:315 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію LDAP" -#: libpq/auth.c:314 +#: libpq/auth.c:318 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "користувач \"%s\" не пройшов автентифікацію за сертифікатом" -#: libpq/auth.c:317 +#: libpq/auth.c:321 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію RADIUS" -#: libpq/auth.c:320 +#: libpq/auth.c:324 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "користувач \"%s\" не пройшов автентифікацію: неприпустимий метод автентифікації" -#: libpq/auth.c:324 +#: libpq/auth.c:328 #, c-format msgid "Connection matched pg_hba.conf line %d: \"%s\"" msgstr "З'єднання відповідає рядку %d в pg_hba.conf: \"%s\"" #: libpq/auth.c:371 #, c-format +msgid "connection was re-authenticated" +msgstr "підключення було повторно автентифіковано" + +#: libpq/auth.c:372 +#, c-format +msgid "previous ID: \"%s\"; new ID: \"%s\"" +msgstr "попередній ID: \"%s\"; новий ID: \"%s\"" + +#: libpq/auth.c:381 +#, c-format +msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" +msgstr "підключення автентифіковано: ідентифікатор=\"%s\" метод=%s (%s:%d)" + +#: libpq/auth.c:420 +#, c-format msgid "client certificates can only be checked if a root certificate store is available" msgstr "сертифікати клієнтів можуть перевірятися, лише якщо доступне сховище кореневих сертифікатів" -#: libpq/auth.c:382 +#: libpq/auth.c:431 #, c-format msgid "connection requires a valid client certificate" msgstr "підключення потребує припустимий сертифікат клієнта" -#: libpq/auth.c:392 -#, c-format -msgid "GSSAPI encryption can only be used with gss, trust, or reject authentication methods" -msgstr "Шифрування GSSAPI можна використовувати лише з методами gss, trust, або відхилення автентифікації" - -#: libpq/auth.c:426 -#, c-format -msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" -msgstr "pg_hba.conf відхиляє підключення реплікації для хосту \"%s\", користувача \"%s\", %s" +#: libpq/auth.c:462 libpq/auth.c:508 +msgid "GSS encryption" +msgstr "Шифрування GSS" -#: libpq/auth.c:428 libpq/auth.c:444 libpq/auth.c:502 libpq/auth.c:520 -msgid "SSL off" -msgstr "SSL вимк" +#: libpq/auth.c:465 libpq/auth.c:511 +msgid "SSL encryption" +msgstr "Шифрування SSL" -#: libpq/auth.c:428 libpq/auth.c:444 libpq/auth.c:502 libpq/auth.c:520 -msgid "SSL on" -msgstr "SSL увімк" +#: libpq/auth.c:467 libpq/auth.c:513 +msgid "no encryption" +msgstr "без шифрування" -#: libpq/auth.c:432 +#. translator: last %s describes encryption state +#: libpq/auth.c:473 #, c-format -msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\"" -msgstr "pg_hba.conf відхиляє підключення реплікації для хосту \"%s\", користувача \"%s\"" +msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" +msgstr "pg_hba.conf відхиляє підключення реплікації для хосту \"%s\", користувача \"%s\", %s" -#: libpq/auth.c:441 +#. translator: last %s describes encryption state +#: libpq/auth.c:480 #, c-format msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "pg_hba.conf відхиляє підключення для хосту \"%s\", користувача \"%s\", бази даних \"%s\", %s" -#: libpq/auth.c:448 -#, c-format -msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\"" -msgstr "pg_hba.conf відхиляє підключення для хосту \"%s\", користувача \"%s\", бази даних \"%s\"" - -#: libpq/auth.c:477 +#: libpq/auth.c:518 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "IP-адреса клієнта дозволяється в \"%s\", відповідає прямому перетворенню." -#: libpq/auth.c:480 +#: libpq/auth.c:521 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "IP-адреса клієнта дозволяється в \"%s\", пряме перетворення не перевірялося." -#: libpq/auth.c:483 +#: libpq/auth.c:524 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "IP-адреса клієнта дозволяється в \"%s\", не відповідає прямому перетворенню." -#: libpq/auth.c:486 +#: libpq/auth.c:527 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "Перекласти ім'я клієнтського хосту \"%s\" в IP-адресу: %s, не вдалося." -#: libpq/auth.c:491 +#: libpq/auth.c:532 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "Отримати ім'я хосту з IP-адреси клієнта: %s, не вдалося." -#: libpq/auth.c:500 +#. translator: last %s describes encryption state +#: libpq/auth.c:540 #, c-format msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" msgstr "в pg_hba.conf немає запису, що дозволяє підключення для реплікації з хосту \"%s\", користувача \"%s\", %s" -#: libpq/auth.c:507 -#, c-format -msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\"" -msgstr "в pg_hba.conf немає запису, що дозволяє підключення для реплікації з хосту \"%s\", користувача \"%s\"" - -#: libpq/auth.c:517 +#. translator: last %s describes encryption state +#: libpq/auth.c:548 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "в pg_hba.conf немає запису для хосту \"%s\", користувача \"%s\", бази даних \"%s\", %s" -#: libpq/auth.c:525 -#, c-format -msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\"" -msgstr "в pg_hba.conf немає запису для хосту \"%s\", користувача \"%s\", бази даних \"%s\"" - -#: libpq/auth.c:688 +#: libpq/auth.c:721 #, c-format msgid "expected password response, got message type %d" msgstr "очікувалася відповід з паролем, але отримано тип повідомлення %d" -#: libpq/auth.c:716 +#: libpq/auth.c:742 #, c-format msgid "invalid password packet size" msgstr "неприпустимий розмір пакету з паролем" -#: libpq/auth.c:734 +#: libpq/auth.c:760 #, c-format msgid "empty password returned by client" msgstr "клієнт повернув пустий пароль" -#: libpq/auth.c:854 libpq/hba.c:1340 +#: libpq/auth.c:887 libpq/hba.c:1366 #, c-format msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" msgstr "Автентифікація MD5 не підтримується, коли увімкнуто режим \"db_user_namespace\"" -#: libpq/auth.c:860 +#: libpq/auth.c:893 #, c-format msgid "could not generate random MD5 salt" msgstr "не вдалося створити випадкову сіль для MD5" -#: libpq/auth.c:906 -#, c-format -msgid "SASL authentication is not supported in protocol version 2" -msgstr "Автентифікація SASL не підтримується в протоколі версії 2" - -#: libpq/auth.c:939 +#: libpq/auth.c:959 #, c-format msgid "expected SASL response, got message type %d" msgstr "очікувалася відповідь SASL, але отримано тип повідомлення %d" -#: libpq/auth.c:1068 +#: libpq/auth.c:1088 libpq/be-secure-gssapi.c:535 #, c-format -msgid "GSSAPI is not supported in protocol version 2" -msgstr "GSSAPI не підтримується в протоколі версії 2" +msgid "could not set environment: %m" +msgstr "не вдалося встановити середовище: %m" -#: libpq/auth.c:1128 +#: libpq/auth.c:1124 #, c-format msgid "expected GSS response, got message type %d" msgstr "очікувалася відповідь GSS, але отримано тип повідомлення %d" -#: libpq/auth.c:1189 +#: libpq/auth.c:1184 msgid "accepting GSS security context failed" msgstr "прийняти контекст безпеки GSS не вдалось" -#: libpq/auth.c:1228 +#: libpq/auth.c:1225 msgid "retrieving GSS user name failed" msgstr "отримання ім'я користувача GSS не виконано" -#: libpq/auth.c:1359 -#, c-format -msgid "SSPI is not supported in protocol version 2" -msgstr "SSPI не підтримується в протоколі версії 2" - #: libpq/auth.c:1374 msgid "could not acquire SSPI credentials" msgstr "не вдалось отримати облікові дані SSPI" @@ -12647,202 +13071,207 @@ msgstr "прийняти контекст безпеки SSPI не вдалос msgid "could not get token from SSPI security context" msgstr "не вдалося отримати маркер з контексту безпеки SSPI" -#: libpq/auth.c:1658 libpq/auth.c:1677 +#: libpq/auth.c:1678 libpq/auth.c:1697 #, c-format msgid "could not translate name" msgstr "не вдалося перекласти ім'я" -#: libpq/auth.c:1690 +#: libpq/auth.c:1710 #, c-format msgid "realm name too long" msgstr "ім'я області дуже довге" -#: libpq/auth.c:1705 +#: libpq/auth.c:1725 #, c-format msgid "translated account name too long" msgstr "ім'я перекладеного облікового запису дуже довге" -#: libpq/auth.c:1886 +#: libpq/auth.c:1906 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "не вдалося створити сокет для підключення до серверу Ident: %m" -#: libpq/auth.c:1901 +#: libpq/auth.c:1921 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "не вдалося прив'язатися до локальної адреси \"%s\": %m" -#: libpq/auth.c:1913 +#: libpq/auth.c:1933 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "не вдалося підключитися до Ident-серверу за адресою \"%s\", порт %s: %m" -#: libpq/auth.c:1935 +#: libpq/auth.c:1955 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "не вдалося надіслати запит до Ident -серверу за адресою \"%s\", порт %s: %m" -#: libpq/auth.c:1952 +#: libpq/auth.c:1972 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "не вдалося отримати відповідь від Ident-серверу за адресою \"%s\", порт %s: %m" -#: libpq/auth.c:1962 +#: libpq/auth.c:1982 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "неприпустимо форматована відповідь від Ident-серверу: \"%s\"" -#: libpq/auth.c:2009 +#: libpq/auth.c:2035 #, c-format msgid "peer authentication is not supported on this platform" msgstr "автентифікація peer не підтримується на цій платформі" -#: libpq/auth.c:2013 +#: libpq/auth.c:2039 #, c-format msgid "could not get peer credentials: %m" msgstr "не вдалося отримати облікові дані користувача через peer: %m" -#: libpq/auth.c:2025 +#: libpq/auth.c:2051 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "не вдалося знайти локального користувача за ідентифікатором (%ld): %s" -#: libpq/auth.c:2124 +#: libpq/auth.c:2152 #, c-format msgid "error from underlying PAM layer: %s" msgstr "помилка у нижчому шарі PAM: %s" -#: libpq/auth.c:2194 +#: libpq/auth.c:2163 +#, c-format +msgid "unsupported PAM conversation %d/\"%s\"" +msgstr "непідтримувана розмова PAM %d/\"%s\"" + +#: libpq/auth.c:2223 #, c-format msgid "could not create PAM authenticator: %s" msgstr "не вдалося створити автентифікатор PAM: %s" -#: libpq/auth.c:2205 +#: libpq/auth.c:2234 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "помилка в pam_set_item(PAM_USER): %s" -#: libpq/auth.c:2237 +#: libpq/auth.c:2266 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "помилка в pam_set_item(PAM_RHOST): %s" -#: libpq/auth.c:2249 +#: libpq/auth.c:2278 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "помилка в pam_set_item(PAM_CONV): %s" -#: libpq/auth.c:2262 +#: libpq/auth.c:2291 #, c-format msgid "pam_authenticate failed: %s" msgstr "помилка в pam_authenticate: %sв" -#: libpq/auth.c:2275 +#: libpq/auth.c:2304 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "помилка в pam_acct_mgmt: %s" -#: libpq/auth.c:2286 +#: libpq/auth.c:2315 #, c-format msgid "could not release PAM authenticator: %s" msgstr "не вдалося вивільнити автентифікатор PAM: %s" -#: libpq/auth.c:2362 +#: libpq/auth.c:2395 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "не вдалося ініціалізувати протокол LDAP: код помилки %d" -#: libpq/auth.c:2399 +#: libpq/auth.c:2432 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "не вдалося отримати назву домена з ldapbasedn" -#: libpq/auth.c:2407 +#: libpq/auth.c:2440 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "Автентифікація LDAP не змогла знайти записи DNS SRV для \"%s\"" -#: libpq/auth.c:2409 +#: libpq/auth.c:2442 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Встановіть назву сервера LDAP, явно." -#: libpq/auth.c:2461 +#: libpq/auth.c:2494 #, c-format msgid "could not initialize LDAP: %s" msgstr "не вдалося ініціалізувати протокол LDAP: %s" -#: libpq/auth.c:2471 +#: libpq/auth.c:2504 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "протокол ldaps з поточною бібліотекою LDAP не підтримується" -#: libpq/auth.c:2479 +#: libpq/auth.c:2512 #, c-format msgid "could not initialize LDAP: %m" msgstr "не вдалося ініціалізувати протокол LDAP: %m" -#: libpq/auth.c:2489 +#: libpq/auth.c:2522 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "не вдалося встановити версію протоколу LDAP: %s" -#: libpq/auth.c:2529 +#: libpq/auth.c:2562 #, c-format msgid "could not load function _ldap_start_tls_sA in wldap32.dll" msgstr "не вдалося завантажити функцію _ldap_start_tls_sA in wldap32.dll" -#: libpq/auth.c:2530 +#: libpq/auth.c:2563 #, c-format msgid "LDAP over SSL is not supported on this platform." msgstr "Протокол LDAP через протокол SSL не підтримується на цій платформі." -#: libpq/auth.c:2546 +#: libpq/auth.c:2579 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "не вдалося почати сеанс протоколу LDAP TLS: %s" -#: libpq/auth.c:2617 +#: libpq/auth.c:2650 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "Сервер LDAP не вказаний, і не ldapbasedn" -#: libpq/auth.c:2624 +#: libpq/auth.c:2657 #, c-format msgid "LDAP server not specified" msgstr "LDAP-сервер не вказаний" -#: libpq/auth.c:2686 +#: libpq/auth.c:2719 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "неприпустимий символ в імені користувача для автентифікації LDAP" -#: libpq/auth.c:2703 +#: libpq/auth.c:2736 #, c-format msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" msgstr "не вдалося виконати початкову прив'язку LDAP для ldapbinddn \"%s\" на сервері \"%s\": %s" -#: libpq/auth.c:2732 +#: libpq/auth.c:2765 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "не вдалося виконати LDAP-пошук за фільтром \"%s\" на сервері \"%s\": %s" -#: libpq/auth.c:2746 +#: libpq/auth.c:2779 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "LDAP-користувач \"%s\" не існує" -#: libpq/auth.c:2747 +#: libpq/auth.c:2780 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "LDAP-пошук за фільтром \"%s\" на сервері \"%s\" не повернув записів." -#: libpq/auth.c:2751 +#: libpq/auth.c:2784 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "LDAP-користувач \"%s\" не унікальний" -#: libpq/auth.c:2752 +#: libpq/auth.c:2785 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." @@ -12851,127 +13280,137 @@ msgstr[1] "LDAP-пошук за фільтром \"%s\" на сервері \"%s msgstr[2] "LDAP-пошук за фільтром \"%s\" на сервері \"%s\" повернув %d записів." msgstr[3] "LDAP-пошук за фільтром \"%s\" на сервері \"%s\" повернув %d записів." -#: libpq/auth.c:2772 +#: libpq/auth.c:2805 #, c-format msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" msgstr "не вдалося отримати dn для першого результату, що відповідає \"%s\" на сервері \"%s\": %s" -#: libpq/auth.c:2793 +#: libpq/auth.c:2826 #, c-format msgid "could not unbind after searching for user \"%s\" on server \"%s\"" msgstr "не вдалося відв'язатись після пошуку користувача \"%s\" на сервері \"%s\"" -#: libpq/auth.c:2824 +#: libpq/auth.c:2857 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "Помилка під час реєстрації в протоколі LDAP користувача \"%s\" на сервері \"%s\": %s" -#: libpq/auth.c:2853 +#: libpq/auth.c:2889 #, c-format msgid "LDAP diagnostics: %s" msgstr "Діагностика LDAP: %s" -#: libpq/auth.c:2880 +#: libpq/auth.c:2927 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "помилка автентифікації сертифіката для користувача \"%s\": сертифікат клієнта не містить імені користувача" -#: libpq/auth.c:2897 +#: libpq/auth.c:2948 +#, c-format +msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" +msgstr "помилка автентифікації сертифікату для користувача \"%s\": не вдалося отримати DN суб'єкта" + +#: libpq/auth.c:2971 +#, c-format +msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" +msgstr "помилка перевірки сертифікату (clientcert=verify-full) для користувача \"%s\": DN невідповідність" + +#: libpq/auth.c:2976 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "помилка перевірки сертифікату (clientcert=verify-full) для користувача \"%s\": CN невідповідність" -#: libpq/auth.c:2998 +#: libpq/auth.c:3078 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-сервер не вказаний" -#: libpq/auth.c:3005 +#: libpq/auth.c:3085 #, c-format msgid "RADIUS secret not specified" msgstr "Секрет RADIUS не вказаний" -#: libpq/auth.c:3019 +#: libpq/auth.c:3099 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "Автентифікація RADIUS не підтримує паролі довші ніж %d символів" -#: libpq/auth.c:3124 libpq/hba.c:1954 +#: libpq/auth.c:3206 libpq/hba.c:2004 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "не вдалося перетворити ім'я серверу RADIUS \"%s\" в адресу: %s" -#: libpq/auth.c:3138 +#: libpq/auth.c:3220 #, c-format msgid "could not generate random encryption vector" msgstr "не вдалося створити випадковий вектор шифрування" -#: libpq/auth.c:3172 +#: libpq/auth.c:3254 #, c-format msgid "could not perform MD5 encryption of password" msgstr "не вдалося виконати MD5 шифрування паролю" -#: libpq/auth.c:3198 +#: libpq/auth.c:3280 #, c-format msgid "could not create RADIUS socket: %m" msgstr "не вдалося створити сокет RADIUS: %m" -#: libpq/auth.c:3220 +#: libpq/auth.c:3302 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "не вдалося прив'язатися до локального сокету RADIUS: %m" -#: libpq/auth.c:3230 +#: libpq/auth.c:3312 #, c-format msgid "could not send RADIUS packet: %m" msgstr "не вдалося відправити пакет RADIUS: %m" -#: libpq/auth.c:3263 libpq/auth.c:3289 +#: libpq/auth.c:3345 libpq/auth.c:3371 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "перевищено час очікування відповіді RADIUS від %s" -#: libpq/auth.c:3282 +#: libpq/auth.c:3364 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "не вдалося перевірити статус сокету RADIUS: %m" -#: libpq/auth.c:3312 +#: libpq/auth.c:3394 #, c-format msgid "could not read RADIUS response: %m" msgstr "не вдалося прочитати відповідь RADIUS: %m" -#: libpq/auth.c:3325 libpq/auth.c:3329 +#: libpq/auth.c:3407 libpq/auth.c:3411 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "Відповідь RADIUS від %s була відправлена з неправильного порту: %d" -#: libpq/auth.c:3338 +#: libpq/auth.c:3420 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "Занадто коротка відповідь RADIUS від %s: %d" -#: libpq/auth.c:3345 +#: libpq/auth.c:3427 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "У відповіді RADIUS від %s покшоджена довжина: %d (фактична довжина %d)" -#: libpq/auth.c:3353 +#: libpq/auth.c:3435 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "Прийшла відповідь RADIUS від %s на інший запит: %d (очікувалася %d)" -#: libpq/auth.c:3378 +#: libpq/auth.c:3460 #, c-format msgid "could not perform MD5 encryption of received packet" msgstr "не вдалося виконати шифрування MD5 для отриманого пакету" -#: libpq/auth.c:3387 +#: libpq/auth.c:3469 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "Відповідь RADIUS від %s має неправильний підпис MD5" -#: libpq/auth.c:3405 +#: libpq/auth.c:3487 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "Відповідь RADIUS від %s має неприпустимий код (%d) для користувача \"%s\"" @@ -13028,8 +13467,8 @@ msgstr "не вдалося написати файл сервера \"%s\": %m" msgid "large object read request is too large" msgstr "запит на читання великого об'єкту має завеликий розмір" -#: libpq/be-fsstubs.c:802 utils/adt/genfile.c:265 utils/adt/genfile.c:304 -#: utils/adt/genfile.c:340 +#: libpq/be-fsstubs.c:802 utils/adt/genfile.c:267 utils/adt/genfile.c:306 +#: utils/adt/genfile.c:342 #, c-format msgid "requested length cannot be negative" msgstr "запитувана довжина не може бути негативною" @@ -13054,245 +13493,271 @@ msgstr "помилка команди \"%s\"" #: libpq/be-secure-common.c:141 #, c-format msgid "could not access private key file \"%s\": %m" -msgstr "не вдалося отримати доступ до файлу приватного ключа \"%s\": %m" +msgstr "не вдалось отримати доступ до файла закритиго ключа \"%s\": %m" #: libpq/be-secure-common.c:150 #, c-format msgid "private key file \"%s\" is not a regular file" -msgstr "файл приватного ключа \"%s\" не є звичайним" +msgstr "файл закритого ключа \"%s\" не є звичайним" #: libpq/be-secure-common.c:165 #, c-format msgid "private key file \"%s\" must be owned by the database user or root" -msgstr "файл приватного ключа \"%s\" повинен належати користувачу бази даних або кореня" +msgstr "файл закритого ключа \"%s\" повинен належати користувачу бази даних або коріня" #: libpq/be-secure-common.c:188 #, c-format msgid "private key file \"%s\" has group or world access" -msgstr "до файлу приватного ключа \"%s\" мають доступ група або всі" +msgstr "до файлу закритого ключа \"%s\" мають доступ група або всі" #: libpq/be-secure-common.c:190 #, c-format msgid "File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root." msgstr "Файл повинен мати дозволи u=rw (0600) або менше, якщо він належить користувачу бази даних, або u=rw,g=r (0640) або менше, якщо він належить кореню." -#: libpq/be-secure-gssapi.c:195 +#: libpq/be-secure-gssapi.c:204 msgid "GSSAPI wrap error" msgstr "помилка при згортанні GSSAPI" -#: libpq/be-secure-gssapi.c:199 +#: libpq/be-secure-gssapi.c:211 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "вихідне повідомлення GSSAPI не буде використовувати конфіденційність" -#: libpq/be-secure-gssapi.c:203 libpq/be-secure-gssapi.c:574 +#: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:622 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "сервер намагався надіслати переповнений пакет GSSAPI (%zu > %zu)" -#: libpq/be-secure-gssapi.c:330 +#: libpq/be-secure-gssapi.c:351 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" msgstr "переповнений пакет GSSAPI, надісланий клієнтом (%zu > %zu)" -#: libpq/be-secure-gssapi.c:364 +#: libpq/be-secure-gssapi.c:389 msgid "GSSAPI unwrap error" msgstr "помилка при розгортанні GSSAPI" -#: libpq/be-secure-gssapi.c:369 +#: libpq/be-secure-gssapi.c:396 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "вхідне повідомлення GSSAPI не використовувало конфіденційність" -#: libpq/be-secure-gssapi.c:525 +#: libpq/be-secure-gssapi.c:570 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %d)" msgstr "переповнений пакет GSSAPI, надісланий клієнтом (%zu > %d)" -#: libpq/be-secure-gssapi.c:547 +#: libpq/be-secure-gssapi.c:594 msgid "could not accept GSSAPI security context" msgstr "не вдалося прийняти контекст безпеки GSSAPI" -#: libpq/be-secure-gssapi.c:637 +#: libpq/be-secure-gssapi.c:689 msgid "GSSAPI size check error" msgstr "помилка перевірки розміру GSSAPI" -#: libpq/be-secure-openssl.c:112 +#: libpq/be-secure-openssl.c:115 #, c-format msgid "could not create SSL context: %s" msgstr "не вдалося створити контекст SSL: %s" -#: libpq/be-secure-openssl.c:138 +#: libpq/be-secure-openssl.c:141 #, c-format msgid "could not load server certificate file \"%s\": %s" msgstr "не вдалося завантажити сертифікат серверу \"%s\": %s" -#: libpq/be-secure-openssl.c:158 +#: libpq/be-secure-openssl.c:161 #, c-format msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" msgstr "файл закритого ключа \"%s\" не можна перезавантажити, тому що це потребує парольну фразу" -#: libpq/be-secure-openssl.c:163 +#: libpq/be-secure-openssl.c:166 #, c-format msgid "could not load private key file \"%s\": %s" -msgstr "не вдалося завантажити файл приватного ключа \"%s\": %s" +msgstr "не вдалось завантажити файл закритого ключа \"%s\": %s" -#: libpq/be-secure-openssl.c:172 +#: libpq/be-secure-openssl.c:175 #, c-format msgid "check of private key failed: %s" msgstr "помилка під час перевірки приватного ключа: %s" -#: libpq/be-secure-openssl.c:184 libpq/be-secure-openssl.c:206 +#. translator: first %s is a GUC option name, second %s is its value +#: libpq/be-secure-openssl.c:188 libpq/be-secure-openssl.c:211 #, c-format msgid "\"%s\" setting \"%s\" not supported by this build" msgstr "\"%s\" налаштування \"%s\" не підтримується цією збіркою" -#: libpq/be-secure-openssl.c:194 +#: libpq/be-secure-openssl.c:198 #, c-format msgid "could not set minimum SSL protocol version" msgstr "не вдалося встановити мінімальну версію протоколу SSL" -#: libpq/be-secure-openssl.c:216 +#: libpq/be-secure-openssl.c:221 #, c-format msgid "could not set maximum SSL protocol version" msgstr "не вдалося встановити максимальну версію протоколу SSL" -#: libpq/be-secure-openssl.c:232 +#: libpq/be-secure-openssl.c:237 #, c-format msgid "could not set SSL protocol version range" msgstr "не вдалося встановити діапазон версій протоколу SSL" -#: libpq/be-secure-openssl.c:233 +#: libpq/be-secure-openssl.c:238 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "\"%s\" не може бути більше, ніж \"%s\"" -#: libpq/be-secure-openssl.c:257 +#: libpq/be-secure-openssl.c:275 #, c-format msgid "could not set the cipher list (no valid ciphers available)" msgstr "не вдалося встановити список шифрів (немає дійсних шифрів)" -#: libpq/be-secure-openssl.c:275 +#: libpq/be-secure-openssl.c:295 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "не вдалося завантажити файл кореневого сертифікату \"%s\": %s" -#: libpq/be-secure-openssl.c:302 +#: libpq/be-secure-openssl.c:344 #, c-format msgid "could not load SSL certificate revocation list file \"%s\": %s" msgstr "не вдалося завантажити файл зі списком відкликаних сертифікатів SSL \"%s\": %s" -#: libpq/be-secure-openssl.c:378 +#: libpq/be-secure-openssl.c:352 +#, c-format +msgid "could not load SSL certificate revocation list directory \"%s\": %s" +msgstr "не вдалося завантажити каталог списку відкликаних сертифікатів SSL \"%s\": %s" + +#: libpq/be-secure-openssl.c:360 +#, c-format +msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" +msgstr "не вдалося завантажити файл \"%s\" або каталог \"%s\" списку відкликаних сертифікатів SSL: %s" + +#: libpq/be-secure-openssl.c:418 #, c-format msgid "could not initialize SSL connection: SSL context not set up" msgstr "не вдалося ініціалізувати SSL-підключення: контекст SSL не встановлений" -#: libpq/be-secure-openssl.c:386 +#: libpq/be-secure-openssl.c:429 #, c-format msgid "could not initialize SSL connection: %s" msgstr "не вдалося ініціалізувати SSL-підключення: %s" -#: libpq/be-secure-openssl.c:394 +#: libpq/be-secure-openssl.c:437 #, c-format msgid "could not set SSL socket: %s" msgstr "не вдалося встановити SSL-сокет: %s" -#: libpq/be-secure-openssl.c:449 +#: libpq/be-secure-openssl.c:492 #, c-format msgid "could not accept SSL connection: %m" msgstr "не вдалося прийняти SSL-підключення: %m" -#: libpq/be-secure-openssl.c:453 libpq/be-secure-openssl.c:506 +#: libpq/be-secure-openssl.c:496 libpq/be-secure-openssl.c:549 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "не вдалося прийняти SSL-підключення: виявлений EOF" -#: libpq/be-secure-openssl.c:492 +#: libpq/be-secure-openssl.c:535 #, c-format msgid "could not accept SSL connection: %s" msgstr "не вдалося отримати підключення SSL: %s" -#: libpq/be-secure-openssl.c:495 +#: libpq/be-secure-openssl.c:538 #, c-format msgid "This may indicate that the client does not support any SSL protocol version between %s and %s." msgstr "Це може вказувати, що клієнт не підтримує жодної версії протоколу SSL між %s і %s." -#: libpq/be-secure-openssl.c:511 libpq/be-secure-openssl.c:642 -#: libpq/be-secure-openssl.c:706 +#: libpq/be-secure-openssl.c:554 libpq/be-secure-openssl.c:734 +#: libpq/be-secure-openssl.c:798 #, c-format msgid "unrecognized SSL error code: %d" -msgstr "нерозпізнаний код помилки: %d" +msgstr "нерозпізнаний код помилки SSL: %d" -#: libpq/be-secure-openssl.c:553 +#: libpq/be-secure-openssl.c:600 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "Спільне ім'я SSL-сертифікату містить нульовий байт" -#: libpq/be-secure-openssl.c:631 libpq/be-secure-openssl.c:690 +#: libpq/be-secure-openssl.c:640 +#, c-format +msgid "SSL certificate's distinguished name contains embedded null" +msgstr "Унікальна назва сертифікату SSL містить вбудоване null-значення" + +#: libpq/be-secure-openssl.c:723 libpq/be-secure-openssl.c:782 #, c-format msgid "SSL error: %s" msgstr "Помилка SSL: %s" -#: libpq/be-secure-openssl.c:871 +#: libpq/be-secure-openssl.c:963 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "не вдалося відкрити файл параметрів DH \"%s\": %m" -#: libpq/be-secure-openssl.c:883 +#: libpq/be-secure-openssl.c:975 #, c-format msgid "could not load DH parameters file: %s" msgstr "не вдалося завантажити файл параметрів DH: %s" -#: libpq/be-secure-openssl.c:893 +#: libpq/be-secure-openssl.c:985 #, c-format msgid "invalid DH parameters: %s" msgstr "неприпустимі параметри DH: %s" -#: libpq/be-secure-openssl.c:901 +#: libpq/be-secure-openssl.c:994 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "неприпустимі параметри DH: р - не штрих" -#: libpq/be-secure-openssl.c:909 +#: libpq/be-secure-openssl.c:1003 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "неприпустимі параметри DH: немає придатного генератора або безпечного штриха" -#: libpq/be-secure-openssl.c:1065 +#: libpq/be-secure-openssl.c:1164 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: не вдалося завантажити параметри DH" -#: libpq/be-secure-openssl.c:1073 +#: libpq/be-secure-openssl.c:1172 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: не вдалося встановити параметри DH: %s" -#: libpq/be-secure-openssl.c:1100 +#: libpq/be-secure-openssl.c:1199 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: нерозпізнане ім'я кривої: %s" -#: libpq/be-secure-openssl.c:1109 +#: libpq/be-secure-openssl.c:1208 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: не вдалося створити ключ" -#: libpq/be-secure-openssl.c:1137 +#: libpq/be-secure-openssl.c:1236 msgid "no SSL error reported" msgstr "немає повідомлення про помилку SSL" -#: libpq/be-secure-openssl.c:1141 +#: libpq/be-secure-openssl.c:1240 #, c-format msgid "SSL error code %lu" msgstr "Код помилки SSL %lu" -#: libpq/be-secure.c:122 +#: libpq/be-secure-openssl.c:1394 +#, c-format +msgid "failed to create BIO" +msgstr "не вдалося створити BIO" + +#: libpq/be-secure-openssl.c:1404 +#, c-format +msgid "could not get NID for ASN1_OBJECT object" +msgstr "не вдалося отримати NID для об'єкту ASN1_OBJECT" + +#: libpq/be-secure-openssl.c:1412 #, c-format -msgid "SSL connection from \"%s\"" -msgstr "SSL-підключення від \"%s\"" +msgid "could not convert NID %d to an ASN1_OBJECT structure" +msgstr "не вдалося перетворити NID %d в структуру ASN1_OBJECT" -#: libpq/be-secure.c:207 libpq/be-secure.c:303 +#: libpq/be-secure.c:209 libpq/be-secure.c:305 #, c-format msgid "terminating connection due to unexpected postmaster exit" msgstr "завершення підключення через неочікуване закриття головного процесу" @@ -13327,531 +13792,569 @@ msgstr "Пароль не підходить для користувача \"%s\ msgid "Password of user \"%s\" is in unrecognized format." msgstr "Пароль користувача \"%s\" представлений в нерозпізнаному форматі." -#: libpq/hba.c:235 +#: libpq/hba.c:241 #, c-format msgid "authentication file token too long, skipping: \"%s\"" msgstr "занадто довгий маркер у файлі автентифікації, пропускається: \"%s\"" -#: libpq/hba.c:407 +#: libpq/hba.c:413 #, c-format msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" msgstr "не вдалося відкрити додатковий файл автентифікації \"@%s\" as \"%s\": %m" -#: libpq/hba.c:509 -#, c-format -msgid "authentication file line too long" -msgstr "занадто довгий рядок у файлі автентифікації" - -#: libpq/hba.c:510 libpq/hba.c:867 libpq/hba.c:887 libpq/hba.c:925 -#: libpq/hba.c:975 libpq/hba.c:989 libpq/hba.c:1013 libpq/hba.c:1022 -#: libpq/hba.c:1035 libpq/hba.c:1056 libpq/hba.c:1069 libpq/hba.c:1089 -#: libpq/hba.c:1111 libpq/hba.c:1123 libpq/hba.c:1179 libpq/hba.c:1199 -#: libpq/hba.c:1213 libpq/hba.c:1232 libpq/hba.c:1243 libpq/hba.c:1258 -#: libpq/hba.c:1276 libpq/hba.c:1292 libpq/hba.c:1304 libpq/hba.c:1341 -#: libpq/hba.c:1382 libpq/hba.c:1395 libpq/hba.c:1417 libpq/hba.c:1430 -#: libpq/hba.c:1442 libpq/hba.c:1460 libpq/hba.c:1510 libpq/hba.c:1554 -#: libpq/hba.c:1565 libpq/hba.c:1581 libpq/hba.c:1598 libpq/hba.c:1608 -#: libpq/hba.c:1666 libpq/hba.c:1704 libpq/hba.c:1726 libpq/hba.c:1738 -#: libpq/hba.c:1825 libpq/hba.c:1843 libpq/hba.c:1937 libpq/hba.c:1956 -#: libpq/hba.c:1985 libpq/hba.c:1998 libpq/hba.c:2021 libpq/hba.c:2043 -#: libpq/hba.c:2057 tsearch/ts_locale.c:190 +#: libpq/hba.c:859 #, c-format -msgid "line %d of configuration file \"%s\"" -msgstr "рядок %d файла конфігурації \"%s\"" +msgid "error enumerating network interfaces: %m" +msgstr "помилка перерахування мережевих інтерфейсів: %m" #. translator: the second %s is a list of auth methods -#: libpq/hba.c:865 +#: libpq/hba.c:886 #, c-format msgid "authentication option \"%s\" is only valid for authentication methods %s" msgstr "параметр автентифікації \"%s\" припустимий лише для способів автентифікації %s" -#: libpq/hba.c:885 +#: libpq/hba.c:888 libpq/hba.c:908 libpq/hba.c:946 libpq/hba.c:996 +#: libpq/hba.c:1010 libpq/hba.c:1034 libpq/hba.c:1043 libpq/hba.c:1056 +#: libpq/hba.c:1077 libpq/hba.c:1090 libpq/hba.c:1110 libpq/hba.c:1132 +#: libpq/hba.c:1144 libpq/hba.c:1203 libpq/hba.c:1223 libpq/hba.c:1237 +#: libpq/hba.c:1257 libpq/hba.c:1268 libpq/hba.c:1283 libpq/hba.c:1302 +#: libpq/hba.c:1318 libpq/hba.c:1330 libpq/hba.c:1367 libpq/hba.c:1408 +#: libpq/hba.c:1421 libpq/hba.c:1443 libpq/hba.c:1455 libpq/hba.c:1473 +#: libpq/hba.c:1523 libpq/hba.c:1567 libpq/hba.c:1578 libpq/hba.c:1594 +#: libpq/hba.c:1611 libpq/hba.c:1622 libpq/hba.c:1641 libpq/hba.c:1657 +#: libpq/hba.c:1673 libpq/hba.c:1727 libpq/hba.c:1744 libpq/hba.c:1757 +#: libpq/hba.c:1769 libpq/hba.c:1788 libpq/hba.c:1875 libpq/hba.c:1893 +#: libpq/hba.c:1987 libpq/hba.c:2006 libpq/hba.c:2035 libpq/hba.c:2048 +#: libpq/hba.c:2071 libpq/hba.c:2093 libpq/hba.c:2107 tsearch/ts_locale.c:232 +#, c-format +msgid "line %d of configuration file \"%s\"" +msgstr "рядок %d файла конфігурації \"%s\"" + +#: libpq/hba.c:906 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "спосіб автентифікації \"%s\" потребує аргумент \"%s\" для встановлення" -#: libpq/hba.c:913 +#: libpq/hba.c:934 #, c-format msgid "missing entry in file \"%s\" at end of line %d" msgstr "відсутнє введення в файлі \"%s\" в кінці рядка %d" -#: libpq/hba.c:924 +#: libpq/hba.c:945 #, c-format msgid "multiple values in ident field" msgstr "кілька значень в полі ident" -#: libpq/hba.c:973 +#: libpq/hba.c:994 #, c-format msgid "multiple values specified for connection type" msgstr "кілька значень вказано для типу підключення" -#: libpq/hba.c:974 +#: libpq/hba.c:995 #, c-format msgid "Specify exactly one connection type per line." msgstr "Вкажіть в рядку єдиний тип підключення." -#: libpq/hba.c:988 +#: libpq/hba.c:1009 #, c-format msgid "local connections are not supported by this build" msgstr "локальні підключення не підтримуються цією збіркою" -#: libpq/hba.c:1011 +#: libpq/hba.c:1032 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "запис hostssl не збігається, тому що протокол SSL вимкнутий" -#: libpq/hba.c:1012 +#: libpq/hba.c:1033 #, c-format msgid "Set ssl = on in postgresql.conf." msgstr "Встановіть ssl = on в postgresql.conf." -#: libpq/hba.c:1020 +#: libpq/hba.c:1041 #, c-format msgid "hostssl record cannot match because SSL is not supported by this build" msgstr "запис hostssl не збігається, тому що SSL не підтримується цією збіркою" -#: libpq/hba.c:1021 +#: libpq/hba.c:1042 #, c-format -msgid "Compile with --with-openssl to use SSL connections." -msgstr "Щоб використовувати SSL-підключення, скомпілюйте з --with-openssl." +msgid "Compile with --with-ssl to use SSL connections." +msgstr "Щоб використати SSL-підключення, скомпілюйте з --with-ssl." -#: libpq/hba.c:1033 +#: libpq/hba.c:1054 #, c-format msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" msgstr "запис hostgssenc не може збігатись, оскільки GSSAPI не підтримується цією збіркою" -#: libpq/hba.c:1034 +#: libpq/hba.c:1055 #, c-format msgid "Compile with --with-gssapi to use GSSAPI connections." msgstr "Скомпілюйте з --with-gssapi, щоб використовувати GSSAPI з'єднання." -#: libpq/hba.c:1054 +#: libpq/hba.c:1075 #, c-format msgid "invalid connection type \"%s\"" msgstr "неприпустимий тип підключення \"%s\"" -#: libpq/hba.c:1068 +#: libpq/hba.c:1089 #, c-format msgid "end-of-line before database specification" msgstr "кінець рядка перед визначенням бази даних" -#: libpq/hba.c:1088 +#: libpq/hba.c:1109 #, c-format msgid "end-of-line before role specification" msgstr "кінець рядка перед визначенням ролі" -#: libpq/hba.c:1110 +#: libpq/hba.c:1131 #, c-format msgid "end-of-line before IP address specification" msgstr "кінець рядка перед визначенням IP-адрес" -#: libpq/hba.c:1121 +#: libpq/hba.c:1142 #, c-format msgid "multiple values specified for host address" msgstr "для адреси хоста вказано кілька значень" -#: libpq/hba.c:1122 +#: libpq/hba.c:1143 #, c-format msgid "Specify one address range per line." msgstr "Вкажіть один діапазон адреси в рядку." -#: libpq/hba.c:1177 +#: libpq/hba.c:1201 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "неприпустима IP адреса \"%s\": %s" -#: libpq/hba.c:1197 +#: libpq/hba.c:1221 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "визначити одночасно ім’я хоста і маску CIDR не можна: \"%s\"" -#: libpq/hba.c:1211 +#: libpq/hba.c:1235 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "неприпустима маска CIDR в адресі \"%s\"" -#: libpq/hba.c:1230 +#: libpq/hba.c:1255 #, c-format msgid "end-of-line before netmask specification" msgstr "кінець рядка перед визначенням маски мережі" -#: libpq/hba.c:1231 +#: libpq/hba.c:1256 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "Вкажіть діапазон адрес в нотації CIDR або надайте окрему маску мережі." -#: libpq/hba.c:1242 +#: libpq/hba.c:1267 #, c-format msgid "multiple values specified for netmask" msgstr "для маски мережі вказано декілька значень" -#: libpq/hba.c:1256 +#: libpq/hba.c:1281 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "неприпустима маска IP \"%s\": %s" -#: libpq/hba.c:1275 +#: libpq/hba.c:1301 #, c-format msgid "IP address and mask do not match" msgstr "IP-адреса і маска не збігаються" -#: libpq/hba.c:1291 +#: libpq/hba.c:1317 #, c-format msgid "end-of-line before authentication method" msgstr "кінець рядка перед способом автентифікації" -#: libpq/hba.c:1302 +#: libpq/hba.c:1328 #, c-format msgid "multiple values specified for authentication type" msgstr "для типу автентифікації вказано декілька значень" -#: libpq/hba.c:1303 +#: libpq/hba.c:1329 #, c-format msgid "Specify exactly one authentication type per line." msgstr "Вкажіть у рядку єдиний тип автентифікації." -#: libpq/hba.c:1380 +#: libpq/hba.c:1406 #, c-format msgid "invalid authentication method \"%s\"" msgstr "неприпустимий спосіб автентифікації \"%s\"" -#: libpq/hba.c:1393 +#: libpq/hba.c:1419 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "неприпустимий спосіб автентифікації \"%s\": не підтримується цією збіркою" -#: libpq/hba.c:1416 +#: libpq/hba.c:1442 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "автентифікація gssapi для локальних сокетів не підтримується" -#: libpq/hba.c:1429 -#, c-format -msgid "GSSAPI encryption only supports gss, trust, or reject authentication" -msgstr "Шифрування GSSAPI підтримує лише gss, trust, або відхилення автентифікації" - -#: libpq/hba.c:1441 +#: libpq/hba.c:1454 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "автентифікація peer підтримується лише для локальних сокетів" -#: libpq/hba.c:1459 +#: libpq/hba.c:1472 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "автентифікація cert підтримується лише для підключень hostssl" -#: libpq/hba.c:1509 +#: libpq/hba.c:1522 #, c-format msgid "authentication option not in name=value format: %s" msgstr "параметр автентифікації вказаний не в форматі ім’я=значення: %s" -#: libpq/hba.c:1553 +#: libpq/hba.c:1566 #, c-format msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" msgstr "не можна використовувати ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter або ldapurl разом з ldapprefix" -#: libpq/hba.c:1564 +#: libpq/hba.c:1577 #, c-format msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" msgstr "спосіб автентифікації \"ldap\" потребує встановити аргумент \"ldapbasedn\", \"ldapprefix\" або \"ldapsuffix\"" -#: libpq/hba.c:1580 +#: libpq/hba.c:1593 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "не можна використовувати ldapsearchattribute разом з ldapsearchfilter" -#: libpq/hba.c:1597 +#: libpq/hba.c:1610 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "список серверів RADIUS не може бути порожнім" -#: libpq/hba.c:1607 +#: libpq/hba.c:1621 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "список секретів RADIUS не може бути порожнім" -#: libpq/hba.c:1660 +#: libpq/hba.c:1638 +#, c-format +msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "кількість секретів RADIUS (%d) повинна бути 1 або дорівнювати кількості серверів RADIUS (%d)" + +#: libpq/hba.c:1654 +#, c-format +msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "кількість портів RADIUS (%d) повинна бути 1 або дорівнювати кількості серверів RADIUS (%d)" + +#: libpq/hba.c:1670 #, c-format -msgid "the number of %s (%d) must be 1 or the same as the number of %s (%d)" -msgstr "кількість %s (%d) повинна дорівнювати 1 або кількості %s (%d)" +msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "кількість ідентифікаторів RADIUS (%d) повинна бути 1 або дорівнювати кількості серверів RADIUS (%d)" -#: libpq/hba.c:1694 +#: libpq/hba.c:1717 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi і cert" -#: libpq/hba.c:1703 +#: libpq/hba.c:1726 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert може бути налаштовано лише для рядків \"hostssl\"" -#: libpq/hba.c:1725 +#: libpq/hba.c:1743 #, c-format -msgid "clientcert cannot be set to \"no-verify\" when using \"cert\" authentication" -msgstr "clientcert не може бути встановлений на \"no-verify\", коли використовується автентифікація \"cert\"" +msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" +msgstr "clientcert приймає лише \"verify-full\" під час використання автентифікації \"cert\"" -#: libpq/hba.c:1737 +#: libpq/hba.c:1756 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "неприпустиме значення для clientcert: \"%s\"" -#: libpq/hba.c:1771 +#: libpq/hba.c:1768 +#, c-format +msgid "clientname can only be configured for \"hostssl\" rows" +msgstr "clientname можна налаштувати лише для рядків \"hostssl\"" + +#: libpq/hba.c:1787 +#, c-format +msgid "invalid value for clientname: \"%s\"" +msgstr "неприпустиме значення для clientname: \"%s\"" + +#: libpq/hba.c:1821 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "не вдалося аналізувати URL-адресу LDAP \"%s\": %s" -#: libpq/hba.c:1782 +#: libpq/hba.c:1832 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "непідтримувана схема в URL-адресі LDAP: %s" -#: libpq/hba.c:1806 +#: libpq/hba.c:1856 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "URL-адреса LDAP не підтримується на цій платформі" -#: libpq/hba.c:1824 +#: libpq/hba.c:1874 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "недійсне значення ldapscheme: \"%s\"" -#: libpq/hba.c:1842 +#: libpq/hba.c:1892 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "недійсний номер порту LDAP: \"%s\"" -#: libpq/hba.c:1888 libpq/hba.c:1895 +#: libpq/hba.c:1938 libpq/hba.c:1945 msgid "gssapi and sspi" msgstr "gssapi і sspi" -#: libpq/hba.c:1904 libpq/hba.c:1913 +#: libpq/hba.c:1954 libpq/hba.c:1963 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1935 +#: libpq/hba.c:1985 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "не вдалося проаналізувати список серверів RADIUS \"%s\"" -#: libpq/hba.c:1983 +#: libpq/hba.c:2033 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "не вдалося проаналізувати список портів RADIUS \"%s\"" -#: libpq/hba.c:1997 +#: libpq/hba.c:2047 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "недійсний номер порту RADIUS: \"%s\"" -#: libpq/hba.c:2019 +#: libpq/hba.c:2069 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "не вдалося проаналізувати список секретів RADIUS \"%s\"" -#: libpq/hba.c:2041 +#: libpq/hba.c:2091 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "не вдалося проаналізувати список ідентифікаторів RADIUS \"%s\"" -#: libpq/hba.c:2055 +#: libpq/hba.c:2105 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "нерозпізнане ім’я параметра автентифікації: \"%s\"" -#: libpq/hba.c:2199 libpq/hba.c:2613 guc-file.l:631 +#: libpq/hba.c:2251 libpq/hba.c:2665 guc-file.l:632 #, c-format msgid "could not open configuration file \"%s\": %m" msgstr "не вдалося відкрити файл конфігурації \"%s\": %m" -#: libpq/hba.c:2250 +#: libpq/hba.c:2302 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "файл конфігурації \"%s\" не містить елементів" -#: libpq/hba.c:2768 +#: libpq/hba.c:2820 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "недійсний регулярний вираз \"%s\": %s" -#: libpq/hba.c:2828 +#: libpq/hba.c:2880 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "помилка при пошуку за регулярним виразом для \"%s\": %s" -#: libpq/hba.c:2847 +#: libpq/hba.c:2899 #, c-format msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" msgstr "регулярний вираз \"%s не містить підвиразів, необхідних для зворотного посилання в \"%s\"" -#: libpq/hba.c:2943 +#: libpq/hba.c:2995 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "вказане ім'я користувача (%s) і автентифіковане ім'я користувача (%s) не збігаються" -#: libpq/hba.c:2963 +#: libpq/hba.c:3015 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "немає відповідності у файлі зіставлень \"%s\" для користувача \"%s\" автентифікованого як \"%s\"" -#: libpq/hba.c:2996 +#: libpq/hba.c:3048 #, c-format msgid "could not open usermap file \"%s\": %m" msgstr "не вдалося відкрити файл usermap: \"%s\": %m" -#: libpq/pqcomm.c:218 +#: libpq/pqcomm.c:204 #, c-format msgid "could not set socket to nonblocking mode: %m" msgstr "не вдалося перевести сокет у неблокуючий режим: %m" -#: libpq/pqcomm.c:372 +#: libpq/pqcomm.c:362 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" -msgstr "Довжина шляху Unix-сокета \"%s\" перевищує ліміт (максимум %d байт)" +msgstr "Шлях Unix-сокету \"%s\" занадто довгий (максимум %d байтів)" -#: libpq/pqcomm.c:393 +#: libpq/pqcomm.c:383 #, c-format msgid "could not translate host name \"%s\", service \"%s\" to address: %s" msgstr "не вдалось перекласти ім'я хоста \"%s\", служби \"%s\" в адресу: %s" -#: libpq/pqcomm.c:397 +#: libpq/pqcomm.c:387 #, c-format msgid "could not translate service \"%s\" to address: %s" msgstr "не вдалось перекласти службу \"%s\" в адресу: %s" -#: libpq/pqcomm.c:424 +#: libpq/pqcomm.c:414 #, c-format msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" msgstr "не вдалось прив'язатись до всіх запитаних адрес: MAXLISTEN (%d) перевищено" -#: libpq/pqcomm.c:433 +#: libpq/pqcomm.c:423 msgid "IPv4" msgstr "IPv4" -#: libpq/pqcomm.c:437 +#: libpq/pqcomm.c:427 msgid "IPv6" msgstr "IPv6" -#: libpq/pqcomm.c:442 +#: libpq/pqcomm.c:432 msgid "Unix" msgstr "Unix" -#: libpq/pqcomm.c:447 +#: libpq/pqcomm.c:437 #, c-format msgid "unrecognized address family %d" msgstr "нерозпізнане сімейство адресів %d" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:473 +#: libpq/pqcomm.c:463 #, c-format msgid "could not create %s socket for address \"%s\": %m" msgstr "не вдалось створити сокет %s для адреси \"%s\": %m" -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:499 -#, c-format -msgid "setsockopt(SO_REUSEADDR) failed for %s address \"%s\": %m" -msgstr "помилка в setsockopt(SO_REUSEADDR) для адреси %s \"%s\": %m" - -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:516 +#. translator: third %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:489 libpq/pqcomm.c:507 #, c-format -msgid "setsockopt(IPV6_V6ONLY) failed for %s address \"%s\": %m" -msgstr "помилка в setsockopt(IPV6_V6ONLY) для адреси %s \"%s\": %m" +msgid "%s(%s) failed for %s address \"%s\": %m" +msgstr "%s(%s) помилка %s для адреси \"%s\": %m" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:536 +#: libpq/pqcomm.c:530 #, c-format msgid "could not bind %s address \"%s\": %m" msgstr "не вдалось прив'язатись до адреси %s \"%s\": %m" -#: libpq/pqcomm.c:539 +#: libpq/pqcomm.c:534 #, c-format -msgid "Is another postmaster already running on port %d? If not, remove socket file \"%s\" and retry." -msgstr "Можливо порт %d вже зайнятий іншим процесом postmaster? Якщо ні, видаліть файл сокету \"%s\" і спробуйте знову." +msgid "Is another postmaster already running on port %d?" +msgstr "Можливо інший процес postmaster вже виконується на порті %d?" -#: libpq/pqcomm.c:542 +#: libpq/pqcomm.c:536 #, c-format msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." msgstr "Можливо порт %d вже зайнятий іншим процесом postmaster? Якщо ні, почекайте пару секунд і спробуйте знову." #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:575 +#: libpq/pqcomm.c:569 #, c-format msgid "could not listen on %s address \"%s\": %m" msgstr "не вдалось прослухати на адресі %s \"%s\": %m" -#: libpq/pqcomm.c:584 +#: libpq/pqcomm.c:578 #, c-format msgid "listening on Unix socket \"%s\"" msgstr "прослуховувати UNIX сокет \"%s\"" #. translator: first %s is IPv4 or IPv6 -#: libpq/pqcomm.c:590 +#: libpq/pqcomm.c:584 #, c-format msgid "listening on %s address \"%s\", port %d" msgstr "прослуховувати %s адресу \"%s\", порт %d" -#: libpq/pqcomm.c:673 +#: libpq/pqcomm.c:675 #, c-format msgid "group \"%s\" does not exist" msgstr "група \"%s\" не існує" -#: libpq/pqcomm.c:683 +#: libpq/pqcomm.c:685 #, c-format msgid "could not set group of file \"%s\": %m" msgstr "не вдалось встановити групу для файла \"%s\": %m" -#: libpq/pqcomm.c:694 +#: libpq/pqcomm.c:696 #, c-format msgid "could not set permissions of file \"%s\": %m" msgstr "не вдалось встановити дозволи для файла \"%s\": %m" -#: libpq/pqcomm.c:724 +#: libpq/pqcomm.c:726 #, c-format msgid "could not accept new connection: %m" msgstr "не вдалось прийняти нове підключення: %m" -#: libpq/pqcomm.c:914 +#: libpq/pqcomm.c:766 libpq/pqcomm.c:775 libpq/pqcomm.c:807 libpq/pqcomm.c:817 +#: libpq/pqcomm.c:1630 libpq/pqcomm.c:1675 libpq/pqcomm.c:1715 +#: libpq/pqcomm.c:1759 libpq/pqcomm.c:1798 libpq/pqcomm.c:1837 +#: libpq/pqcomm.c:1873 libpq/pqcomm.c:1912 postmaster/pgstat.c:616 +#: postmaster/pgstat.c:627 +#, c-format +msgid "%s(%s) failed: %m" +msgstr "%s(%s) помилка: %m" + +#: libpq/pqcomm.c:921 #, c-format msgid "there is no client connection" msgstr "немає клієнтського підключення" -#: libpq/pqcomm.c:965 libpq/pqcomm.c:1061 +#: libpq/pqcomm.c:972 libpq/pqcomm.c:1068 #, c-format msgid "could not receive data from client: %m" msgstr "не вдалось отримати дані від клієнта: %m" -#: libpq/pqcomm.c:1206 tcop/postgres.c:4142 +#: libpq/pqcomm.c:1161 tcop/postgres.c:4290 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "завершення підключення через втрату синхронізації протоколу" -#: libpq/pqcomm.c:1272 +#: libpq/pqcomm.c:1227 #, c-format msgid "unexpected EOF within message length word" msgstr "неочікуваний EOF в слові довжини повідомлення" -#: libpq/pqcomm.c:1283 +#: libpq/pqcomm.c:1237 #, c-format msgid "invalid message length" msgstr "неприпустима довжина повідомлення" -#: libpq/pqcomm.c:1305 libpq/pqcomm.c:1318 +#: libpq/pqcomm.c:1259 libpq/pqcomm.c:1272 #, c-format msgid "incomplete message from client" msgstr "неповне повідомлення від клієнта" -#: libpq/pqcomm.c:1451 +#: libpq/pqcomm.c:1383 #, c-format msgid "could not send data to client: %m" msgstr "не вдалось надіслати дані клієнту: %m" +#: libpq/pqcomm.c:1598 +#, c-format +msgid "%s(%s) failed: error code %d" +msgstr "%s(%s) помилка: код помилки %d" + +#: libpq/pqcomm.c:1687 +#, c-format +msgid "setting the keepalive idle time is not supported" +msgstr "встановлення часу простою keepalive не підтримується" + +#: libpq/pqcomm.c:1771 libpq/pqcomm.c:1846 libpq/pqcomm.c:1921 +#, c-format +msgid "%s(%s) not supported" +msgstr "%s(%s) не підтримується" + +#: libpq/pqcomm.c:1956 +#, c-format +msgid "could not poll socket: %m" +msgstr "не вдалося опитати сокет: %m" + #: libpq/pqformat.c:406 #, c-format msgid "no data left in message" msgstr "у повідомлення не залишилось даних" #: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 -#: utils/adt/arrayfuncs.c:1471 utils/adt/rowtypes.c:567 +#: utils/adt/arrayfuncs.c:1481 utils/adt/rowtypes.c:588 #, c-format msgid "insufficient data left in message" msgstr "недостатьно даних залишилось в повідомленні" @@ -13866,230 +14369,225 @@ msgstr "неприпустимий рядок в повідомленні" msgid "invalid message format" msgstr "неприпустимий формат повідомлення" -#: main/main.c:246 +#: main/main.c:245 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: помилка WSAStartup: %d\n" -#: main/main.c:310 +#: main/main.c:309 #, c-format msgid "%s is the PostgreSQL server.\n\n" msgstr "%s - сервер PostgreSQL.\n\n" -#: main/main.c:311 +#: main/main.c:310 #, c-format msgid "Usage:\n" " %s [OPTION]...\n\n" msgstr "Використання:\n" " %s [OPTION]...\n\n" -#: main/main.c:312 +#: main/main.c:311 #, c-format msgid "Options:\n" msgstr "Параметри:\n" -#: main/main.c:313 +#: main/main.c:312 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B NBUFFERS число спільних буферів\n" -#: main/main.c:314 +#: main/main.c:313 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NAME=VALUE встановити параметр під час виконання\n" -#: main/main.c:315 +#: main/main.c:314 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C NAME вивести значення параметру під час виконання і вийти\n" -#: main/main.c:316 +#: main/main.c:315 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 рівень налагодження\n" -#: main/main.c:317 +#: main/main.c:316 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D DATADIR каталог бази даних\n" -#: main/main.c:318 +#: main/main.c:317 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e використати європейський формат дат (DMY)\n" -#: main/main.c:319 +#: main/main.c:318 #, c-format msgid " -F turn fsync off\n" msgstr " -F вимкнути fsync\n" -#: main/main.c:320 +#: main/main.c:319 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h HOSTNAME ім’я хоста або IP-адреса для прослуховування\n" -#: main/main.c:321 +#: main/main.c:320 #, c-format msgid " -i enable TCP/IP connections\n" msgstr " -i активувати підключення TCP/IP\n" -#: main/main.c:322 +#: main/main.c:321 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k DIRECTORY розташування Unix-сокетів\n" -#: main/main.c:324 +#: main/main.c:323 #, c-format msgid " -l enable SSL connections\n" msgstr " -l активувати SSL-підключення\n" -#: main/main.c:326 +#: main/main.c:325 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N MAX-CONNECT максимальне число дозволених підключень\n" -#: main/main.c:327 -#, c-format -msgid " -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n" -msgstr " -o OPTIONS передати \"ПАРАМЕТРИ\" для кожного серверного процесу (застаріле)\n" - -#: main/main.c:328 +#: main/main.c:326 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT номер порту для прослуховування\n" -#: main/main.c:329 +#: main/main.c:327 #, c-format msgid " -s show statistics after each query\n" msgstr " -s відображувати статистику після кожного запиту\n" -#: main/main.c:330 +#: main/main.c:328 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S WORK-MEM вказати обсяг пам'яті для сортування (в КБ)\n" -#: main/main.c:331 +#: main/main.c:329 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію і вийти\n" -#: main/main.c:332 +#: main/main.c:330 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NAME=VALUE встановити параметр під час виконання\n" -#: main/main.c:333 +#: main/main.c:331 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config описати параметри конфігурації і вийти\n" -#: main/main.c:334 +#: main/main.c:332 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати довідку і вийти\n" -#: main/main.c:336 +#: main/main.c:334 #, c-format msgid "\n" "Developer options:\n" msgstr "\n" "Параметри для розробників:\n" -#: main/main.c:337 +#: main/main.c:335 #, c-format msgid " -f s|i|n|m|h forbid use of some plan types\n" msgstr " -f s|i|n|m|h заборонити використання деяких типів плану\n" -#: main/main.c:338 +#: main/main.c:336 #, c-format msgid " -n do not reinitialize shared memory after abnormal exit\n" msgstr " -n не повторювати ініціалізацію спільної пам'яті після ненормального виходу\n" -#: main/main.c:339 +#: main/main.c:337 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O дозволити змінювати структуру системних таблиць\n" -#: main/main.c:340 +#: main/main.c:338 #, c-format msgid " -P disable system indexes\n" msgstr " -P вимкнути системні індекси\n" -#: main/main.c:341 +#: main/main.c:339 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex показувати час після кожного запиту\n" -#: main/main.c:342 +#: main/main.c:340 #, c-format msgid " -T send SIGSTOP to all backend processes if one dies\n" msgstr " -T надіслати SIGSTOP усім внутрішнім процесам, якщо один вимкнеться\n" -#: main/main.c:343 +#: main/main.c:341 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr " -W NUM очікувати NUM секунд, щоб дозволити підключення від налагоджувача\n" -#: main/main.c:345 +#: main/main.c:343 #, c-format msgid "\n" "Options for single-user mode:\n" msgstr "\n" "Параметри для однокористувацького режиму:\n" -#: main/main.c:346 +#: main/main.c:344 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr " --single установка однокористувацького режиму (цей аргумент повинен бути першим)\n" -#: main/main.c:347 +#: main/main.c:345 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAME ім’я бази даних (за замовчуванням - ім'я користувача)\n" -#: main/main.c:348 +#: main/main.c:346 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 змінити рівень налагодження\n" -#: main/main.c:349 +#: main/main.c:347 #, c-format msgid " -E echo statement before execution\n" msgstr " -E інструкція відлуння перед виконанням\n" -#: main/main.c:350 +#: main/main.c:348 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr " -j не використовувати новий рядок як роздільник інтерактивних запитів\n" -#: main/main.c:351 main/main.c:356 +#: main/main.c:349 main/main.c:354 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr " -r FILENAME надіслати stdout і stderr до вказаного файлу\n" -#: main/main.c:353 +#: main/main.c:351 #, c-format msgid "\n" "Options for bootstrapping mode:\n" msgstr "\n" "Параметри для режиму початкового завантаження:\n" -#: main/main.c:354 +#: main/main.c:352 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot установка режиму початкового завантаження (цей аргумент повинен бути першим)\n" -#: main/main.c:355 +#: main/main.c:353 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr " DBNAME ім'я бази даних (обов'язковий аргумент у режимі початкового завантаження)\n" -#: main/main.c:357 +#: main/main.c:355 #, c-format msgid " -x NUM internal use\n" msgstr " -x NUM внутрішнє використання\n" -#: main/main.c:359 +#: main/main.c:357 #, c-format msgid "\n" "Please read the documentation for the complete list of run-time\n" @@ -14100,12 +14598,12 @@ msgstr "\n" "Будь-ласка прочитайте інструкцію для повного списку параметрів конфігурації виконання і їх встановлення у командний рядок або в файл конфігурації.\n\n" "Про помилки повідомляйте <%s>.\n" -#: main/main.c:363 +#: main/main.c:361 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" -#: main/main.c:374 +#: main/main.c:372 #, c-format msgid "\"root\" execution of the PostgreSQL server is not permitted.\n" "The server must be started under an unprivileged user ID to prevent\n" @@ -14114,12 +14612,12 @@ msgid "\"root\" execution of the PostgreSQL server is not permitted.\n" msgstr "Запускати сервер PostgreSQL під іменем \"root\" не дозволено.\n" "Для запобігання компрометації системи безпеки сервер повинен запускати непривілейований користувач. Дивіться документацію, щоб дізнатися більше про те, як правильно запустити сервер.\n" -#: main/main.c:391 +#: main/main.c:389 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: дійсний і ефективний ID користувача повинні збігатися\n" -#: main/main.c:398 +#: main/main.c:396 #, c-format msgid "Execution of PostgreSQL by a user with administrative permissions is not\n" "permitted.\n" @@ -14139,20 +14637,25 @@ msgstr "розширений тип вузла \"%s\" вже існує" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "Методи розширеного вузла \"%s\" не зареєстровані" -#: nodes/nodeFuncs.c:122 nodes/nodeFuncs.c:153 parser/parse_coerce.c:2208 -#: parser/parse_coerce.c:2317 parser/parse_coerce.c:2352 -#: parser/parse_expr.c:2207 parser/parse_func.c:701 parser/parse_oper.c:967 -#: utils/fmgr/funcapi.c:528 +#: nodes/makefuncs.c:150 statistics/extended_stats.c:2277 +#, c-format +msgid "relation \"%s\" does not have a composite type" +msgstr "відношення \"%s\" не має складеного типу" + +#: nodes/nodeFuncs.c:114 nodes/nodeFuncs.c:145 parser/parse_coerce.c:2495 +#: parser/parse_coerce.c:2633 parser/parse_coerce.c:2680 +#: parser/parse_expr.c:2021 parser/parse_func.c:710 parser/parse_oper.c:883 +#: utils/fmgr/funcapi.c:558 #, c-format msgid "could not find array type for data type %s" msgstr "не вдалося знайти тип масиву для типу даних %s" -#: nodes/params.c:359 +#: nodes/params.c:417 #, c-format msgid "portal \"%s\" with parameters: %s" msgstr "портал \"%s\" з параметрами: %s" -#: nodes/params.c:362 +#: nodes/params.c:420 #, c-format msgid "unnamed portal with parameters: %s" msgstr "портал без імені з параметрами: %s" @@ -14163,76 +14666,76 @@ msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join con msgstr "FULL JOIN підтримується лише з умовами, які допускають з'єднання злиттям або хеш-з'єднанням" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1193 +#: optimizer/plan/initsplan.c:1192 #, c-format msgid "%s cannot be applied to the nullable side of an outer join" msgstr "%s не можна застосовувати до нульової сторони зовнішнього з’єднання" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1922 parser/analyze.c:1639 parser/analyze.c:1855 -#: parser/analyze.c:2715 +#: optimizer/plan/planner.c:1315 parser/analyze.c:1677 parser/analyze.c:1921 +#: parser/analyze.c:3099 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s несумісно з UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:2509 optimizer/plan/planner.c:4162 +#: optimizer/plan/planner.c:1978 optimizer/plan/planner.c:3634 #, c-format msgid "could not implement GROUP BY" msgstr "не вдалося реалізувати GROUP BY" -#: optimizer/plan/planner.c:2510 optimizer/plan/planner.c:4163 -#: optimizer/plan/planner.c:4890 optimizer/prep/prepunion.c:1045 +#: optimizer/plan/planner.c:1979 optimizer/plan/planner.c:3635 +#: optimizer/plan/planner.c:4392 optimizer/prep/prepunion.c:1046 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "Деякі типи даних підтримують лише хешування, в той час як інші підтримують тільки сортування." -#: optimizer/plan/planner.c:4889 +#: optimizer/plan/planner.c:4391 #, c-format msgid "could not implement DISTINCT" msgstr "не вдалося реалізувати DISTINCT" -#: optimizer/plan/planner.c:5737 +#: optimizer/plan/planner.c:5239 #, c-format msgid "could not implement window PARTITION BY" msgstr "не вдалося реалізувати PARTITION BY для вікна" -#: optimizer/plan/planner.c:5738 +#: optimizer/plan/planner.c:5240 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Стовпці, що розділяють вікна, повинні мати типи даних з можливістю сортування." -#: optimizer/plan/planner.c:5742 +#: optimizer/plan/planner.c:5244 #, c-format msgid "could not implement window ORDER BY" msgstr "не вдалося реалізувати ORDER BY для вікна" -#: optimizer/plan/planner.c:5743 +#: optimizer/plan/planner.c:5245 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Стовпці, що впорядковують вікна, повинні мати типи даних з можливістю сортування." -#: optimizer/plan/setrefs.c:451 +#: optimizer/plan/setrefs.c:479 #, c-format msgid "too many range table entries" msgstr "дуже багато елементів RTE" -#: optimizer/prep/prepunion.c:508 +#: optimizer/prep/prepunion.c:509 #, c-format msgid "could not implement recursive UNION" msgstr "не вдалося реалізувати рекурсивний UNION" -#: optimizer/prep/prepunion.c:509 +#: optimizer/prep/prepunion.c:510 #, c-format msgid "All column datatypes must be hashable." msgstr "Усі стовпці повинні мати типи даних з можливістю хешування." #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1044 +#: optimizer/prep/prepunion.c:1045 #, c-format msgid "could not implement %s" msgstr "не вдалося реалізувати %s" -#: optimizer/util/clauses.c:4746 +#: optimizer/util/clauses.c:4721 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "Впроваджена в код SQL-функція \"%s\"" @@ -14242,229 +14745,244 @@ msgstr "Впроваджена в код SQL-функція \"%s\"" msgid "cannot access temporary or unlogged relations during recovery" msgstr "отримати доступ до тимчасових або нежурнальованих відношень під час відновлення не можна" -#: optimizer/util/plancat.c:662 +#: optimizer/util/plancat.c:672 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "вказівки з посиланням на весь рядок для вибору унікального індексу не підтримуються" -#: optimizer/util/plancat.c:679 +#: optimizer/util/plancat.c:689 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "з обмеженням в реченні ON CONFLICT не пов'язаний індекс" -#: optimizer/util/plancat.c:729 +#: optimizer/util/plancat.c:739 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATE не підтримується з обмеженнями-винятками" -#: optimizer/util/plancat.c:834 +#: optimizer/util/plancat.c:844 #, c-format msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "немає унікального обмеження або обмеження-виключення відповідного специфікації ON CONFLICT" -#: parser/analyze.c:705 parser/analyze.c:1401 +#: parser/analyze.c:737 parser/analyze.c:1451 #, c-format msgid "VALUES lists must all be the same length" msgstr "Списки VALUES повинні мати однакову довжину" -#: parser/analyze.c:904 +#: parser/analyze.c:938 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT містить більше виразів, ніж цільових стовпців" -#: parser/analyze.c:922 +#: parser/analyze.c:956 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT містить більше цільових стовпців, ніж виразів" -#: parser/analyze.c:926 +#: parser/analyze.c:960 #, c-format msgid "The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?" msgstr "Джерелом даних є вираз рядка, який містить стільки ж стовпців, скільки потребується для INSERT. Ви випадково використовували додаткові дужки?" -#: parser/analyze.c:1210 parser/analyze.c:1612 +#: parser/analyze.c:1259 parser/analyze.c:1650 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "SELECT ... INTO не дозволяється тут" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1542 parser/analyze.c:2894 +#: parser/analyze.c:1580 parser/analyze.c:3278 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s не можна застосовувати до VALUES" -#: parser/analyze.c:1777 +#: parser/analyze.c:1816 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "неприпустиме речення UNION/INTERSECT/EXCEPT ORDER BY" -#: parser/analyze.c:1778 +#: parser/analyze.c:1817 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "Дозволено використання тільки імен стовпців, але не виразів або функцій." -#: parser/analyze.c:1779 +#: parser/analyze.c:1818 #, c-format msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." msgstr "Додайте вираз/функція до кожного SELECT, або перемістіть UNION у речення FROM." -#: parser/analyze.c:1845 +#: parser/analyze.c:1911 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTO дозволяється додати лише до першого SELECT в UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:1917 +#: parser/analyze.c:1983 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "Учасник інструкції UNION/INTERSECT/EXCEPT не може посилатись на інші відносини на тому ж рівні" -#: parser/analyze.c:2004 +#: parser/analyze.c:2070 #, c-format msgid "each %s query must have the same number of columns" msgstr "кожен %s запит повинен мати однакову кількість стовпців" -#: parser/analyze.c:2426 +#: parser/analyze.c:2470 #, c-format msgid "RETURNING must have at least one column" msgstr "В RETURNING повинен бути мінімум один стовпець" -#: parser/analyze.c:2467 +#: parser/analyze.c:2573 +#, c-format +msgid "assignment source returned %d column" +msgid_plural "assignment source returned %d columns" +msgstr[0] "джерело призначення повернуло %d стовпець" +msgstr[1] "джерело призначення повернуло %d стовпця" +msgstr[2] "джерело призначення повернуло %d стовпців" +msgstr[3] "джерело призначення повернуло %d стовпців" + +#: parser/analyze.c:2634 +#, c-format +msgid "variable \"%s\" is of type %s but expression is of type %s" +msgstr "змінна \"%s\" має тип %s, але вираз має тип %s" + +#. translator: %s is a SQL keyword +#: parser/analyze.c:2758 parser/analyze.c:2766 #, c-format -msgid "cannot specify both SCROLL and NO SCROLL" -msgstr "не можна вказати SCROLL і NO SCROLL одночасно" +msgid "cannot specify both %s and %s" +msgstr "не можна вказати як %s, так і %s" -#: parser/analyze.c:2486 +#: parser/analyze.c:2786 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR не повинен містити операторів, які змінюють дані в WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2494 +#: parser/analyze.c:2794 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s не підтримується" -#: parser/analyze.c:2497 +#: parser/analyze.c:2797 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "Курсори, що зберігаються повинні бути READ ONLY." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2505 +#: parser/analyze.c:2805 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %s не підтримується" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2516 +#: parser/analyze.c:2816 #, c-format -msgid "DECLARE INSENSITIVE CURSOR ... %s is not supported" -msgstr "DECLARE INSENSITIVE CURSOR ... %s не підтримується" +msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" +msgstr "DECLARE INSENSITIVE CURSOR ... %s не є припустимим" -#: parser/analyze.c:2519 +#: parser/analyze.c:2819 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Нечутливі курсори повинні бути READ ONLY." -#: parser/analyze.c:2585 +#: parser/analyze.c:2885 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "в матеріалізованих поданнях не повинні використовуватись оператори, які змінюють дані в WITH" -#: parser/analyze.c:2595 +#: parser/analyze.c:2895 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "в матеріалізованих поданнях не повинні використовуватись тимчасові таблиці або подання" -#: parser/analyze.c:2605 +#: parser/analyze.c:2905 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "визначати матеріалізовані подання з зв'язаними параметрами не можна" -#: parser/analyze.c:2617 +#: parser/analyze.c:2917 #, c-format msgid "materialized views cannot be unlogged" msgstr "матеріалізовані подання не можуть бути нежурнальованими" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2722 +#: parser/analyze.c:3106 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "%s не дозволяється з реченням DISTINCT" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2729 +#: parser/analyze.c:3113 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "%s не дозволяється з реченням GROUP BY" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2736 +#: parser/analyze.c:3120 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "%s не дозволяється з реченням HAVING" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2743 +#: parser/analyze.c:3127 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "%s не дозволяється з агрегатними функціями" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2750 +#: parser/analyze.c:3134 #, c-format msgid "%s is not allowed with window functions" msgstr "%s не дозволяється з віконними функціями" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2757 +#: parser/analyze.c:3141 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "%s не дозволяється з функціями, які повертають безлічі, в цільовому списку" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2836 +#: parser/analyze.c:3220 #, c-format msgid "%s must specify unqualified relation names" msgstr "для %s потрібно вказати некваліфіковані імена відносин" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2867 +#: parser/analyze.c:3251 #, c-format msgid "%s cannot be applied to a join" msgstr "%s не можна застосовувати до з'єднання" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2876 +#: parser/analyze.c:3260 #, c-format msgid "%s cannot be applied to a function" msgstr "%s не можна застосовувати до функції" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2885 +#: parser/analyze.c:3269 #, c-format msgid "%s cannot be applied to a table function" msgstr "%s не можна застосовувати до табличної функції" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2903 +#: parser/analyze.c:3287 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%s не можна застосовувати до запиту WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2912 +#: parser/analyze.c:3296 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s не можна застосовувати до іменованого джерела кортежів" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2932 +#: parser/analyze.c:3316 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "відношення \"%s\" в реченні %s не знайдено в реченні FROM" -#: parser/parse_agg.c:220 parser/parse_oper.c:222 +#: parser/parse_agg.c:220 parser/parse_oper.c:227 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "для типу %s не вдалося визначити оператора сортування" @@ -14568,278 +15086,290 @@ msgid "grouping operations are not allowed in index predicates" msgstr "операції групування не можна застосовувати в предикатах індексів" #: parser/parse_agg.c:490 +msgid "aggregate functions are not allowed in statistics expressions" +msgstr "агрегатні функції не можна застосовувати у виразах статистики" + +#: parser/parse_agg.c:492 +msgid "grouping operations are not allowed in statistics expressions" +msgstr "операції групування не можна застосовувати у виразах статистики" + +#: parser/parse_agg.c:497 msgid "aggregate functions are not allowed in transform expressions" msgstr "агрегатні функції не можна застосовувати у виразах перетворювання" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:499 msgid "grouping operations are not allowed in transform expressions" msgstr "операції групування не можна застосовувати у виразах перетворювання" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:504 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "агрегатні функції не можна застосовувати в параметрах EXECUTE" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:506 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "операції групування не можна застосовувати в параметрах EXECUTE" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:511 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "агрегатні функції не можна застосовувати в умовах для тригерів WHEN" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:513 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "операції групування не можна застосовувати в умовах для тригерів WHEN" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:518 msgid "aggregate functions are not allowed in partition bound" msgstr "агрегатні функції не можна застосовувати в границі секції" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:520 msgid "grouping operations are not allowed in partition bound" msgstr "операції групування не можна застосовувати в границі секції" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:525 msgid "aggregate functions are not allowed in partition key expressions" msgstr "агрегатні функції не можна застосовувати у виразах ключа секціонування" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:527 msgid "grouping operations are not allowed in partition key expressions" msgstr "операції групування не можна застосовувати у виразах ключа секціонування" -#: parser/parse_agg.c:526 +#: parser/parse_agg.c:533 msgid "aggregate functions are not allowed in column generation expressions" msgstr "агрегатні функції не можна застосовувати у виразах генерації стовпців" -#: parser/parse_agg.c:528 +#: parser/parse_agg.c:535 msgid "grouping operations are not allowed in column generation expressions" msgstr "операції групування не можна застосовувати у виразах генерації стовпців" -#: parser/parse_agg.c:534 +#: parser/parse_agg.c:541 msgid "aggregate functions are not allowed in CALL arguments" msgstr "агрегатні функції не можна застосовувати в аргументах CALL" -#: parser/parse_agg.c:536 +#: parser/parse_agg.c:543 msgid "grouping operations are not allowed in CALL arguments" msgstr "операції групування не можна застосовувати в аргументах CALL" -#: parser/parse_agg.c:542 +#: parser/parse_agg.c:549 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "агрегатні функції не можна застосовувати в умовах COPY FROM WHERE" -#: parser/parse_agg.c:544 +#: parser/parse_agg.c:551 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "операції групування не можна застосовувати в умовах COPY FROM WHERE" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:567 parser/parse_clause.c:1828 +#: parser/parse_agg.c:578 parser/parse_clause.c:1846 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "агрегатні функції не можна застосовувати в %s" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:570 +#: parser/parse_agg.c:581 #, c-format msgid "grouping operations are not allowed in %s" msgstr "операції групування не можна застосовувати в %s" -#: parser/parse_agg.c:678 +#: parser/parse_agg.c:689 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" msgstr "агрегат зовнішнього рівня не може містити змінну нижчого рівня у своїх аргументах" -#: parser/parse_agg.c:757 +#: parser/parse_agg.c:768 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "виклики агрегатної функції не можуть містити викликів функції, що повертають множину" -#: parser/parse_agg.c:758 parser/parse_expr.c:1845 parser/parse_expr.c:2332 -#: parser/parse_func.c:872 +#: parser/parse_agg.c:769 parser/parse_expr.c:1673 parser/parse_expr.c:2146 +#: parser/parse_func.c:883 #, c-format msgid "You might be able to move the set-returning function into a LATERAL FROM item." msgstr "Можливо перемістити функцію, що повертає множину, в елемент LATERAL FROM." -#: parser/parse_agg.c:763 +#: parser/parse_agg.c:774 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "виклики агрегатних функцій не можуть містити виклики віконних функцій" -#: parser/parse_agg.c:842 +#: parser/parse_agg.c:853 msgid "window functions are not allowed in JOIN conditions" msgstr "віконні функції не можна застосовувати в умовах JOIN" -#: parser/parse_agg.c:849 +#: parser/parse_agg.c:860 msgid "window functions are not allowed in functions in FROM" msgstr "віконні функції не можна застосовувати у функціях в FROM" -#: parser/parse_agg.c:855 +#: parser/parse_agg.c:866 msgid "window functions are not allowed in policy expressions" msgstr "віконні функції не можна застосовувати у виразах політики" -#: parser/parse_agg.c:868 +#: parser/parse_agg.c:879 msgid "window functions are not allowed in window definitions" msgstr "віконні функції не можна застосовувати у визначенні вікна" -#: parser/parse_agg.c:900 +#: parser/parse_agg.c:911 msgid "window functions are not allowed in check constraints" msgstr "віконні функції не можна застосовувати в перевірках обмежень" -#: parser/parse_agg.c:904 +#: parser/parse_agg.c:915 msgid "window functions are not allowed in DEFAULT expressions" msgstr "віконні функції не можна застосовувати у виразах DEFAULT" -#: parser/parse_agg.c:907 +#: parser/parse_agg.c:918 msgid "window functions are not allowed in index expressions" msgstr "віконні функції не можна застосовувати у виразах індексів" -#: parser/parse_agg.c:910 +#: parser/parse_agg.c:921 +msgid "window functions are not allowed in statistics expressions" +msgstr "віконні функції не можна застосовувати у виразах статистики" + +#: parser/parse_agg.c:924 msgid "window functions are not allowed in index predicates" msgstr "віконні функції не можна застосовувати в предикатах індексів" -#: parser/parse_agg.c:913 +#: parser/parse_agg.c:927 msgid "window functions are not allowed in transform expressions" msgstr "віконні функції не можна застосовувати у виразах перетворювання" -#: parser/parse_agg.c:916 +#: parser/parse_agg.c:930 msgid "window functions are not allowed in EXECUTE parameters" msgstr "віконні функції не можна застосовувати в параметрах EXECUTE" -#: parser/parse_agg.c:919 +#: parser/parse_agg.c:933 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "віконні функції не можна застосовувати в умовах WHEN для тригерів" -#: parser/parse_agg.c:922 +#: parser/parse_agg.c:936 msgid "window functions are not allowed in partition bound" msgstr "віконні функції не можна застосовувати в границі секції" -#: parser/parse_agg.c:925 +#: parser/parse_agg.c:939 msgid "window functions are not allowed in partition key expressions" msgstr "віконні функції не можна застосовувати у виразах ключа секціонування" -#: parser/parse_agg.c:928 +#: parser/parse_agg.c:942 msgid "window functions are not allowed in CALL arguments" msgstr "віконні функції не можна застосовувати в аргументах CALL" -#: parser/parse_agg.c:931 +#: parser/parse_agg.c:945 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "віконні функції не можна застосовувати в умовах COPY FROM WHERE" -#: parser/parse_agg.c:934 +#: parser/parse_agg.c:948 msgid "window functions are not allowed in column generation expressions" msgstr "віконні функції не можна застосовувати у виразах генерації стовпців" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:954 parser/parse_clause.c:1837 +#: parser/parse_agg.c:971 parser/parse_clause.c:1855 #, c-format msgid "window functions are not allowed in %s" msgstr "віконні функції не можна застосовувати в %s" -#: parser/parse_agg.c:988 parser/parse_clause.c:2671 +#: parser/parse_agg.c:1005 parser/parse_clause.c:2689 #, c-format msgid "window \"%s\" does not exist" msgstr "вікно \"%s\" не існує" -#: parser/parse_agg.c:1072 +#: parser/parse_agg.c:1089 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "забагато наборів групування (максимум 4096)" -#: parser/parse_agg.c:1212 +#: parser/parse_agg.c:1229 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "агрегатні функції не дозволені у рекурсивному терміні рекурсивного запиту" -#: parser/parse_agg.c:1405 +#: parser/parse_agg.c:1422 #, c-format msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" msgstr "стовпець \"%s.%s\" повинен з'являтися у реченні Група BY або використовуватися в агрегатній функції" -#: parser/parse_agg.c:1408 +#: parser/parse_agg.c:1425 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "Прямі аргументи сортувального агрегату можуть використовувати лише згруповані стовпці." -#: parser/parse_agg.c:1413 +#: parser/parse_agg.c:1430 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "вкладений запит використовує не згруповані стовпці \"%s.%s\" з зовнішнього запиту" -#: parser/parse_agg.c:1577 +#: parser/parse_agg.c:1594 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "аргументами групування мають бути вирази групування пов'язаного рівня запиту" -#: parser/parse_clause.c:191 +#: parser/parse_clause.c:190 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "відношення \"%s\" не може бути метою модифікованої інструкції" -#: parser/parse_clause.c:571 parser/parse_clause.c:599 parser/parse_func.c:2424 +#: parser/parse_clause.c:570 parser/parse_clause.c:598 parser/parse_func.c:2554 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "функції, що повертають множину, мають з'являтися на вищому рівні FROM" -#: parser/parse_clause.c:611 +#: parser/parse_clause.c:610 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "кілька списків з визначенням стовпців не дозволені для тої самої функції" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:643 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "ROWS FROM() з декількома функціями не можуть мати список з визначенням стовпців" -#: parser/parse_clause.c:645 +#: parser/parse_clause.c:644 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "Укладіть окремі списки з визначенням стовпців для кожної з функцій всередині ROWS FROM()." -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:650 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "UNNEST() з кількома аргументами не можуть мати список з визначенням стовпців" -#: parser/parse_clause.c:652 +#: parser/parse_clause.c:651 #, c-format msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." msgstr "Використайте окремі виклики UNNEST() всередині ROWS FROM() і підключіть список з визначенням стовпців до кожного." -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:658 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY не можна використовувати з списком з визначенням стовпців" -#: parser/parse_clause.c:660 +#: parser/parse_clause.c:659 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "Помістіть список з визначенням стовпців всередину ROWS FROM()." -#: parser/parse_clause.c:760 +#: parser/parse_clause.c:759 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "FOR ORDINALITY дозволяється лише для одного стовпця" -#: parser/parse_clause.c:821 +#: parser/parse_clause.c:820 #, c-format msgid "column name \"%s\" is not unique" msgstr "ім'я стовпця \"%s\" не є унікальним" -#: parser/parse_clause.c:863 +#: parser/parse_clause.c:862 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "ім'я простору імен \"%s\" не є унікальним" -#: parser/parse_clause.c:873 +#: parser/parse_clause.c:872 #, c-format msgid "only one default namespace is allowed" msgstr "дозволено тільки один простір імен за замовчуванням" -#: parser/parse_clause.c:933 +#: parser/parse_clause.c:932 #, c-format msgid "tablesample method %s does not exist" msgstr "метод %s для отримання вибірки не існує" -#: parser/parse_clause.c:955 +#: parser/parse_clause.c:954 #, c-format msgid "tablesample method %s requires %d argument, not %d" msgid_plural "tablesample method %s requires %d arguments, not %d" @@ -14848,889 +15378,971 @@ msgstr[1] "метод %s для отримання вибірки потребу msgstr[2] "метод %s для отримання вибірки потребує аргументів: %d, отримано: %d" msgstr[3] "метод %s для отримання вибірки потребує аргументів: %d, отримано: %d" -#: parser/parse_clause.c:989 +#: parser/parse_clause.c:988 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "метод %s для отримання вибірки не підтримує REPEATABLE" -#: parser/parse_clause.c:1135 +#: parser/parse_clause.c:1134 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "Речення TABLESAMPLE можна застосовувати лише до таблиць або матеріалізованих подань" -#: parser/parse_clause.c:1318 +#: parser/parse_clause.c:1324 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "ім’я стовпця \"%s\" з'являється у реченні USING неодноразово" -#: parser/parse_clause.c:1333 +#: parser/parse_clause.c:1339 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "ім’я спільного стовпця \"%s\" з'являється у таблиці зліва неодноразово" -#: parser/parse_clause.c:1342 +#: parser/parse_clause.c:1348 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "в таблиці зліва не існує стовпець \"%s\", вказаний в реченні USING" -#: parser/parse_clause.c:1357 +#: parser/parse_clause.c:1363 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "ім’я спільного стовпця \"%s\" з'являється в таблиці справа неодноразово" -#: parser/parse_clause.c:1366 +#: parser/parse_clause.c:1372 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "в таблиці справа не існує стовпець \"%s\", вказаний в реченні USING" -#: parser/parse_clause.c:1447 +#: parser/parse_clause.c:1451 #, c-format msgid "column alias list for \"%s\" has too many entries" msgstr "занадто багато елементів у списку псевдонімів стовпця \"%s\"" -#: parser/parse_clause.c:1773 +#: parser/parse_clause.c:1791 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" msgstr "кількість рядків не може бути NULL в операторі FETCH FIRST ... WITH TIES" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1798 +#: parser/parse_clause.c:1816 #, c-format msgid "argument of %s must not contain variables" msgstr "аргумент %s не може містити змінні" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1963 +#: parser/parse_clause.c:1981 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "вираз %s \"%s\" неоднозначний" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1992 +#: parser/parse_clause.c:2010 #, c-format msgid "non-integer constant in %s" msgstr "нецілочисельна константа в %s" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2014 +#: parser/parse_clause.c:2032 #, c-format msgid "%s position %d is not in select list" msgstr "в списку вибірки %s немає позиції %d" -#: parser/parse_clause.c:2453 +#: parser/parse_clause.c:2471 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE має обмеження в 12 елементів" -#: parser/parse_clause.c:2659 +#: parser/parse_clause.c:2677 #, c-format msgid "window \"%s\" is already defined" msgstr "вікно \"%s\" вже визначено" -#: parser/parse_clause.c:2720 +#: parser/parse_clause.c:2738 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "змінити речення PARTITION BY для вікна \"%s\" не можна" -#: parser/parse_clause.c:2732 +#: parser/parse_clause.c:2750 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "змінити речення ORDER BY для вікна \"%s\" не можна" -#: parser/parse_clause.c:2762 parser/parse_clause.c:2768 +#: parser/parse_clause.c:2780 parser/parse_clause.c:2786 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "скопіювати вікно \"%s\", яке має речення рамки, не можна" -#: parser/parse_clause.c:2770 +#: parser/parse_clause.c:2788 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Пропустіть дужки в реченні OVER." -#: parser/parse_clause.c:2790 +#: parser/parse_clause.c:2808 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "Для RANGE з зсувом PRECEDING/FOLLOWING потребується лише один стовпець в ORDER BY" -#: parser/parse_clause.c:2813 +#: parser/parse_clause.c:2831 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "Для режиму GROUPS потребується речення ORDER BY" -#: parser/parse_clause.c:2883 +#: parser/parse_clause.c:2901 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "для агрегатної функції з DISTINCT, вирази ORDER BY повинні з'являтись у списку аргументів" -#: parser/parse_clause.c:2884 +#: parser/parse_clause.c:2902 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "для SELECT DISTINCT вирази ORDER BY повинні бути в списку вибірки" -#: parser/parse_clause.c:2916 +#: parser/parse_clause.c:2934 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "агрегатна функція з DISTINCT повинна мати мінімум один аргумент" -#: parser/parse_clause.c:2917 +#: parser/parse_clause.c:2935 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT повинен мати мінімум один стовпець" -#: parser/parse_clause.c:2983 parser/parse_clause.c:3015 +#: parser/parse_clause.c:3001 parser/parse_clause.c:3033 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "Вирази SELECT DISTINCT ON повинні відповідати початковим виразам ORDER BY" -#: parser/parse_clause.c:3093 +#: parser/parse_clause.c:3111 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC не дозволяється в реченні ON CONFLICT" -#: parser/parse_clause.c:3099 +#: parser/parse_clause.c:3117 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST не довзоляється в реченні ON CONFLICT" -#: parser/parse_clause.c:3178 +#: parser/parse_clause.c:3196 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE вимагає специфікації висновку або імені обмеження" -#: parser/parse_clause.c:3179 +#: parser/parse_clause.c:3197 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Наприклад, ON CONFLICT (ім'я_стовпця)." -#: parser/parse_clause.c:3190 +#: parser/parse_clause.c:3208 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT не підтримується таблицями системного каталогу" -#: parser/parse_clause.c:3198 +#: parser/parse_clause.c:3216 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT не підтримується в таблиці \"%s\", що використовується як таблиця каталогу" -#: parser/parse_clause.c:3341 +#: parser/parse_clause.c:3346 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "оператор %s не є дійсним оператором сортування" -#: parser/parse_clause.c:3343 +#: parser/parse_clause.c:3348 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "Оператори сортування повинні бути учасниками \"<\" або \">\" сімейств операторів btree." -#: parser/parse_clause.c:3654 +#: parser/parse_clause.c:3659 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "RANGE зі зсувом PRECEDING/FOLLOWING не підтримується для типу стовпця %s" -#: parser/parse_clause.c:3660 +#: parser/parse_clause.c:3665 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" msgstr "RANGE зі зсувом PRECEDING/FOLLOWING не підтримується для типу стовпця %s і типу зсуву %s" -#: parser/parse_clause.c:3663 +#: parser/parse_clause.c:3668 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Приведіть значення зсуву до потрібного типу." -#: parser/parse_clause.c:3668 +#: parser/parse_clause.c:3673 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" msgstr "RANGE зі зсувом PRECEDING/FOLLOWING має декілька інтерпретацій для типу стовпця %s і типу зсуву %s" -#: parser/parse_clause.c:3671 +#: parser/parse_clause.c:3676 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "Приведіть значення зсуву в точності до призначеного типу." -#: parser/parse_coerce.c:1024 parser/parse_coerce.c:1062 -#: parser/parse_coerce.c:1080 parser/parse_coerce.c:1095 -#: parser/parse_expr.c:2241 parser/parse_expr.c:2819 parser/parse_target.c:967 +#: parser/parse_coerce.c:1042 parser/parse_coerce.c:1080 +#: parser/parse_coerce.c:1098 parser/parse_coerce.c:1113 +#: parser/parse_expr.c:2055 parser/parse_expr.c:2649 parser/parse_target.c:995 #, c-format msgid "cannot cast type %s to %s" msgstr "неможливо транслювати тип %s в %s" -#: parser/parse_coerce.c:1065 +#: parser/parse_coerce.c:1083 #, c-format msgid "Input has too few columns." msgstr "У вхідних даних дуже мало стовпців." -#: parser/parse_coerce.c:1083 +#: parser/parse_coerce.c:1101 #, c-format msgid "Cannot cast type %s to %s in column %d." msgstr "Неможливо транслювати тип %s в %s у стовпці %d." -#: parser/parse_coerce.c:1098 +#: parser/parse_coerce.c:1116 #, c-format msgid "Input has too many columns." msgstr "У вхідних даних дуже багато стовпців." #. translator: first %s is name of a SQL construct, eg WHERE #. translator: first %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1153 parser/parse_coerce.c:1201 +#: parser/parse_coerce.c:1171 parser/parse_coerce.c:1219 #, c-format msgid "argument of %s must be type %s, not type %s" msgstr "аргумент конструкції %s повинен бути типу %s, не типу %s" #. translator: %s is name of a SQL construct, eg WHERE #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1164 parser/parse_coerce.c:1213 +#: parser/parse_coerce.c:1182 parser/parse_coerce.c:1231 #, c-format msgid "argument of %s must not return a set" msgstr "аргумент конструкції %s не повинен повертати набір" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1353 +#: parser/parse_coerce.c:1371 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "у конструкції %s типи %s і %s не можуть бути відповідними" -#: parser/parse_coerce.c:1465 +#: parser/parse_coerce.c:1483 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "типи аргументів %s і %s не можуть збігатись" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1517 +#: parser/parse_coerce.c:1535 #, c-format msgid "%s could not convert type %s to %s" msgstr "у конструкції %s не можна перетворити тип %s в %s" -#: parser/parse_coerce.c:1934 -#, c-format -msgid "arguments declared \"anyelement\" are not all alike" -msgstr "аргументи, оголошенні як \"anyelement\", повинні бути схожими" - -#: parser/parse_coerce.c:1954 +#: parser/parse_coerce.c:2090 parser/parse_coerce.c:2110 +#: parser/parse_coerce.c:2130 parser/parse_coerce.c:2151 +#: parser/parse_coerce.c:2206 parser/parse_coerce.c:2240 #, c-format -msgid "arguments declared \"anyarray\" are not all alike" -msgstr "аргументи, оголошенні як \"anyarray\", повинні бути схожими" +msgid "arguments declared \"%s\" are not all alike" +msgstr "оголошенні аргументи \"%s\", повинні бути схожими" -#: parser/parse_coerce.c:1974 -#, c-format -msgid "arguments declared \"anyrange\" are not all alike" -msgstr "аргументи, оголошенні як \"anyrange\", повинні бути схожими" - -#: parser/parse_coerce.c:2008 parser/parse_coerce.c:2088 -#: utils/fmgr/funcapi.c:487 +#: parser/parse_coerce.c:2185 parser/parse_coerce.c:2298 +#: utils/fmgr/funcapi.c:489 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "аргумент, оголошений як %s , є не масивом, а типом %s" -#: parser/parse_coerce.c:2029 -#, c-format -msgid "arguments declared \"anycompatiblerange\" are not all alike" -msgstr "аргументи, оголошенні як \"anycompatiblerange\", повинні бути схожими" - -#: parser/parse_coerce.c:2041 parser/parse_coerce.c:2122 -#: utils/fmgr/funcapi.c:501 +#: parser/parse_coerce.c:2218 parser/parse_coerce.c:2368 +#: utils/fmgr/funcapi.c:503 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "аргумент, оголошений як %s, є не діапазонним типом, а типом %s" -#: parser/parse_coerce.c:2079 +#: parser/parse_coerce.c:2252 parser/parse_coerce.c:2332 +#: parser/parse_coerce.c:2465 utils/fmgr/funcapi.c:521 utils/fmgr/funcapi.c:586 +#, c-format +msgid "argument declared %s is not a multirange type but type %s" +msgstr "оголошений аргумент %s не є багатодіапазонним типом, а типом %s" + +#: parser/parse_coerce.c:2289 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "не можна визначити тип елемента аргументу \"anyarray\"" -#: parser/parse_coerce.c:2105 parser/parse_coerce.c:2139 +#: parser/parse_coerce.c:2315 parser/parse_coerce.c:2346 +#: parser/parse_coerce.c:2385 parser/parse_coerce.c:2451 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "аргумент, оголошений як %s, не узгоджується з аргументом, оголошеним як %s" -#: parser/parse_coerce.c:2163 +#: parser/parse_coerce.c:2410 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "не вдалося визначити поліморфний тип, тому що вхідні аргументи мають тип %s" -#: parser/parse_coerce.c:2177 +#: parser/parse_coerce.c:2424 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "тип, відповідний \"anynonarray\", є масивом: %s" -#: parser/parse_coerce.c:2187 +#: parser/parse_coerce.c:2434 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "тип, відповідний \"anyenum\", не є переліком: %s" -#: parser/parse_coerce.c:2218 parser/parse_coerce.c:2267 -#: parser/parse_coerce.c:2329 parser/parse_coerce.c:2365 +#: parser/parse_coerce.c:2505 parser/parse_coerce.c:2526 +#: parser/parse_coerce.c:2576 parser/parse_coerce.c:2581 +#: parser/parse_coerce.c:2645 parser/parse_coerce.c:2657 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "не вдалося визначити поліморфний тип %s тому що вхідні дані мають тип %s" -#: parser/parse_coerce.c:2228 +#: parser/parse_coerce.c:2515 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "тип anycompatiblerange %s не збігається з типом anycompatible %s" -#: parser/parse_coerce.c:2242 +#: parser/parse_coerce.c:2536 +#, c-format +msgid "anycompatiblemultirange type %s does not match anycompatible type %s" +msgstr "тип anycompatiblemultirange %s не збігається з типом anycompatible %s" + +#: parser/parse_coerce.c:2550 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "тип відповідний до anycompatiblenonarray є масивом: %s" -#: parser/parse_coerce.c:2433 +#: parser/parse_coerce.c:2785 #, c-format -msgid "A result of type %s requires at least one input of type %s." -msgstr "Результат типу %s потребує ввести як мінімум один тип %s." +msgid "A result of type %s requires at least one input of type anyrange or anymultirange." +msgstr "Результат типу %s потребує принаймні одного введення типу anyrange або anymultirange." -#: parser/parse_coerce.c:2445 +#: parser/parse_coerce.c:2802 #, c-format -msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, or anyrange." -msgstr "Результат типу %s потребує ввести як мінімум один тип anyelement, anyarray, anynonarray, anyenum, або anyrange." +msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." +msgstr "Результат типу %s потребує принаймні одного введення типу anycompatiblerange або anycompatiblemultirange." -#: parser/parse_coerce.c:2457 +#: parser/parse_coerce.c:2814 #, c-format -msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, or anycompatiblerange." -msgstr "Результат типу %s потребує ввести як мінімум один тип anycompatible, anycompatiblearray, anycompatiblenonarray, або anycompatiblerange." +msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." +msgstr "Результат типу %s потребує принаймні одного введення типу anyelement, anyarray, anynonarray, anyenum, anyrange, або anymultirange." -#: parser/parse_coerce.c:2487 +#: parser/parse_coerce.c:2826 +#, c-format +msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." +msgstr "Результат типу %s потребує ввести як мінімум один тип anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange або anycompatiblemultirange." + +#: parser/parse_coerce.c:2856 msgid "A result of type internal requires at least one input of type internal." msgstr "Результат внутрішнього типу потребує ввести як мінімум один внутрішній тип." #: parser/parse_collate.c:228 parser/parse_collate.c:475 -#: parser/parse_collate.c:981 +#: parser/parse_collate.c:1004 #, c-format msgid "collation mismatch between implicit collations \"%s\" and \"%s\"" msgstr "невідповідність параметрів сортування між неявними параметрами сортування \"%s\" і \"%s\"" #: parser/parse_collate.c:231 parser/parse_collate.c:478 -#: parser/parse_collate.c:984 +#: parser/parse_collate.c:1007 #, c-format msgid "You can choose the collation by applying the COLLATE clause to one or both expressions." msgstr "Ви можете обрати параметри сортування, застосувавши речення COLLATE до одного або обох виразів." -#: parser/parse_collate.c:831 +#: parser/parse_collate.c:854 #, c-format msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" msgstr "невідповідність параметрів сортування між явними параметрами сортування \"%s\" і \"%s\"" -#: parser/parse_cte.c:42 +#: parser/parse_cte.c:46 #, c-format msgid "recursive reference to query \"%s\" must not appear within its non-recursive term" msgstr "рекурсивне посилання на запит \"%s\" не повинне з'являтись в його не рекурсивній частині" -#: parser/parse_cte.c:44 +#: parser/parse_cte.c:48 #, c-format msgid "recursive reference to query \"%s\" must not appear within a subquery" msgstr "рекурсивне посилання на запит \"%s\" не повинне з'являтись у підзапиті" -#: parser/parse_cte.c:46 +#: parser/parse_cte.c:50 #, c-format msgid "recursive reference to query \"%s\" must not appear within an outer join" msgstr "рекурсивне посилання на запит \"%s\" не повинне з'являтись у зовнішньому з’єднанні" -#: parser/parse_cte.c:48 +#: parser/parse_cte.c:52 #, c-format msgid "recursive reference to query \"%s\" must not appear within INTERSECT" msgstr "рекурсивне посилання на запит \"%s\" не повинне з'являтись в INTERSECT" -#: parser/parse_cte.c:50 +#: parser/parse_cte.c:54 #, c-format msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "рекурсивне посилання на запит \"%s\" не повинне з'являтись в EXCEPT" -#: parser/parse_cte.c:132 +#: parser/parse_cte.c:136 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "Ім’я запиту WITH \"%s\" вказано неодноразово" -#: parser/parse_cte.c:264 +#: parser/parse_cte.c:268 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "Речення WITH, яке містить оператор, що змінює дані, повинне бути на верхньому рівні" -#: parser/parse_cte.c:313 +#: parser/parse_cte.c:317 #, c-format msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" msgstr "у рекурсивному запиті \"%s\" стовпець %d має тип %s у нерекурсивній частині, але загалом тип %s" -#: parser/parse_cte.c:319 +#: parser/parse_cte.c:323 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Приведіть результат нерекурсивної частини до правильного типу." -#: parser/parse_cte.c:324 +#: parser/parse_cte.c:328 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" msgstr "у рекурсивному запиті \"%s\" стовпець %d має параметри сортування \"%s\" у нерекурсивній частині, але загалом параметри сортування \"%s\"" -#: parser/parse_cte.c:328 +#: parser/parse_cte.c:332 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "Використайте речення COLLATE, щоб встановити параметри сортування в нерекурсивній частині." -#: parser/parse_cte.c:418 +#: parser/parse_cte.c:350 +#, c-format +msgid "WITH query is not recursive" +msgstr "Запит WITH не є рекурсивним" + +#: parser/parse_cte.c:381 +#, c-format +msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" +msgstr "з реченням з SEARCH або CYCLE, ліва сторона UNION повинна бути SELECT" + +#: parser/parse_cte.c:386 +#, c-format +msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" +msgstr "з реченням з SEARCH або CYCLE, права сторона UNION повинна бути SELECT" + +#: parser/parse_cte.c:401 +#, c-format +msgid "search column \"%s\" not in WITH query column list" +msgstr "пошуковий стовпець \"%s\" відсутній в списку стовпців запиту WITH" + +#: parser/parse_cte.c:408 +#, c-format +msgid "search column \"%s\" specified more than once" +msgstr "пошуковий стовпець \"%s\" вказано більше одного разу" + +#: parser/parse_cte.c:417 +#, c-format +msgid "search sequence column name \"%s\" already used in WITH query column list" +msgstr "назва послідовності пошуку \"%s\" вже використовується у списку стовпців запиту WITH" + +#: parser/parse_cte.c:436 +#, c-format +msgid "cycle column \"%s\" not in WITH query column list" +msgstr "стовпець циклу \"%s\" відсутній в списку стовпців запиту WITH" + +#: parser/parse_cte.c:443 +#, c-format +msgid "cycle column \"%s\" specified more than once" +msgstr "стовпець циклу \"%s\" вказано більше одного разу" + +#: parser/parse_cte.c:452 +#, c-format +msgid "cycle mark column name \"%s\" already used in WITH query column list" +msgstr "назва стовпця позначки циклу \"%s\" вже використовується у списку стовпців запиту WITH" + +#: parser/parse_cte.c:464 +#, c-format +msgid "cycle path column name \"%s\" already used in WITH query column list" +msgstr "назва стовпця циклу шляху \"%s\" вже використовується у списку стовпців запиту WITH" + +#: parser/parse_cte.c:472 +#, c-format +msgid "cycle mark column name and cycle path column name are the same" +msgstr "назва стовпця позначки циклу і назва стовпця циклу шляху однакові" + +#: parser/parse_cte.c:508 +#, c-format +msgid "could not identify an inequality operator for type %s" +msgstr "не вдалося визначити оператора нерівності для типу %s" + +#: parser/parse_cte.c:520 +#, c-format +msgid "search sequence column name and cycle mark column name are the same" +msgstr "назва стовпця послідовності пошуку і назва стовпця позначки циклу однакові" + +#: parser/parse_cte.c:527 +#, c-format +msgid "search sequence column name and cycle path column name are the same" +msgstr "назва стовпця послідовності пошуку і назва стовпця циклу шляху однакові" + +#: parser/parse_cte.c:611 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "Запит WITH \"%s\" має %d доступних стовпців, але %d стовпців вказано" -#: parser/parse_cte.c:598 +#: parser/parse_cte.c:791 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "взаємна рекурсія між елементами WITH не реалізована" -#: parser/parse_cte.c:650 +#: parser/parse_cte.c:843 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "рекурсивний запит \"%s\" не повинен містити оператори, які змінюють дані" -#: parser/parse_cte.c:658 +#: parser/parse_cte.c:851 #, c-format msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" msgstr "рекурсивний запит \"%s\" не має форми (нерекурсивна частина) UNION [ALL] (рекурсивна частина)" -#: parser/parse_cte.c:702 +#: parser/parse_cte.c:895 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY в рекурсивному запиті не реалізовано" -#: parser/parse_cte.c:708 +#: parser/parse_cte.c:901 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET у рекурсивному запиті не реалізовано" -#: parser/parse_cte.c:714 +#: parser/parse_cte.c:907 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT у рекурсивному запиті не реалізовано" -#: parser/parse_cte.c:720 +#: parser/parse_cte.c:913 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE в рекурсивному запиті не реалізовано" -#: parser/parse_cte.c:777 +#: parser/parse_cte.c:970 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "рекурсивне посилання на запит \"%s\" не повинне з'являтись неодноразово" -#: parser/parse_expr.c:349 +#: parser/parse_expr.c:287 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT не допускається в цьому контексті" -#: parser/parse_expr.c:402 parser/parse_relation.c:3506 -#: parser/parse_relation.c:3526 +#: parser/parse_expr.c:340 parser/parse_relation.c:3592 +#: parser/parse_relation.c:3612 #, c-format msgid "column %s.%s does not exist" msgstr "стовпець %s.%s не існує" -#: parser/parse_expr.c:414 +#: parser/parse_expr.c:352 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "стовпець \"%s\" не знайдено в типі даних %s" -#: parser/parse_expr.c:420 +#: parser/parse_expr.c:358 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "не вдалося ідентифікувати стовпець \"%s\" в типі запису" -#: parser/parse_expr.c:426 +#: parser/parse_expr.c:364 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "запис імені стовпця .%s застосований до типу %s, котрий не є складеним типом" -#: parser/parse_expr.c:457 parser/parse_target.c:729 +#: parser/parse_expr.c:395 parser/parse_target.c:740 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "розширення рядка через \"*\" тут не підтримується" -#: parser/parse_expr.c:578 +#: parser/parse_expr.c:516 msgid "cannot use column reference in DEFAULT expression" msgstr "у виразі DEFAULT не можна використовувати посилання на стовпець" -#: parser/parse_expr.c:581 +#: parser/parse_expr.c:519 msgid "cannot use column reference in partition bound expression" msgstr "у виразі границі секції не можна використовувати посилання на стовпці" -#: parser/parse_expr.c:850 parser/parse_relation.c:799 -#: parser/parse_relation.c:881 parser/parse_target.c:1207 +#: parser/parse_expr.c:788 parser/parse_relation.c:807 +#: parser/parse_relation.c:889 parser/parse_target.c:1235 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "посилання на стовпець \"%s\" є неоднозначним" -#: parser/parse_expr.c:906 parser/parse_param.c:110 parser/parse_param.c:142 -#: parser/parse_param.c:199 parser/parse_param.c:298 +#: parser/parse_expr.c:844 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_param.c:208 parser/parse_param.c:307 #, c-format msgid "there is no parameter $%d" msgstr "параметр $%d не існує" -#: parser/parse_expr.c:1149 +#: parser/parse_expr.c:1044 #, c-format msgid "NULLIF requires = operator to yield boolean" msgstr "NULLIF потребує = щоб оператор повертав логічне значення" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1155 parser/parse_expr.c:3135 +#: parser/parse_expr.c:1050 parser/parse_expr.c:2965 #, c-format msgid "%s must not return a set" msgstr "%s не повинна повертати набір" -#: parser/parse_expr.c:1603 parser/parse_expr.c:1635 +#: parser/parse_expr.c:1430 parser/parse_expr.c:1462 #, c-format msgid "number of columns does not match number of values" msgstr "кількість стовпців не відповідає кількості значень" -#: parser/parse_expr.c:1649 +#: parser/parse_expr.c:1476 #, c-format msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" msgstr "джерелом для елементу UPDATE з декількома стовпцями повинен бути вкладений SELECT або вираз ROW()" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1843 parser/parse_expr.c:2330 parser/parse_func.c:2540 +#: parser/parse_expr.c:1671 parser/parse_expr.c:2144 parser/parse_func.c:2676 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "функції, повертаючі набори, не дозволяються в %s" -#: parser/parse_expr.c:1904 +#: parser/parse_expr.c:1733 msgid "cannot use subquery in check constraint" msgstr "в обмеженні-перевірці не можна використовувати підзапити" -#: parser/parse_expr.c:1908 +#: parser/parse_expr.c:1737 msgid "cannot use subquery in DEFAULT expression" msgstr "у виразі DEFAULT не можна використовувати підзапити" -#: parser/parse_expr.c:1911 +#: parser/parse_expr.c:1740 msgid "cannot use subquery in index expression" msgstr "в індексному виразі не можна використовувати підзапити" -#: parser/parse_expr.c:1914 +#: parser/parse_expr.c:1743 msgid "cannot use subquery in index predicate" msgstr "в предикаті індексу не можна використовувати підзапити" -#: parser/parse_expr.c:1917 +#: parser/parse_expr.c:1746 +msgid "cannot use subquery in statistics expression" +msgstr "у виразі статистики не можна використовувати підзапит" + +#: parser/parse_expr.c:1749 msgid "cannot use subquery in transform expression" msgstr "у виразі перетворення не можна використовувати підзапити" -#: parser/parse_expr.c:1920 +#: parser/parse_expr.c:1752 msgid "cannot use subquery in EXECUTE parameter" msgstr "в параметрі EXECUTE не можна використовувати підзапити" -#: parser/parse_expr.c:1923 +#: parser/parse_expr.c:1755 msgid "cannot use subquery in trigger WHEN condition" msgstr "в умові WHEN для тригеру не можна використовувати підзапити" -#: parser/parse_expr.c:1926 +#: parser/parse_expr.c:1758 msgid "cannot use subquery in partition bound" msgstr "в границі секції не можна використовувати підзапити" -#: parser/parse_expr.c:1929 +#: parser/parse_expr.c:1761 msgid "cannot use subquery in partition key expression" msgstr "у виразі ключа секціонування не можна використовувати підзапити" -#: parser/parse_expr.c:1932 +#: parser/parse_expr.c:1764 msgid "cannot use subquery in CALL argument" msgstr "в аргументі CALL не можна використовувати підзапити" -#: parser/parse_expr.c:1935 +#: parser/parse_expr.c:1767 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "не можна використовувати підзапити в умові COPY FROM WHERE" -#: parser/parse_expr.c:1938 +#: parser/parse_expr.c:1770 msgid "cannot use subquery in column generation expression" msgstr "у виразі генерації стовпців не можна використовувати підзапити" -#: parser/parse_expr.c:1991 +#: parser/parse_expr.c:1823 #, c-format msgid "subquery must return only one column" msgstr "підзапит повинен повертати лише один стовпець" -#: parser/parse_expr.c:2075 +#: parser/parse_expr.c:1894 #, c-format msgid "subquery has too many columns" msgstr "підзапит має занадто багато стовпців" -#: parser/parse_expr.c:2080 +#: parser/parse_expr.c:1899 #, c-format msgid "subquery has too few columns" msgstr "підзапит має занадто мало стовпців" -#: parser/parse_expr.c:2181 +#: parser/parse_expr.c:1995 #, c-format msgid "cannot determine type of empty array" msgstr "тип пустого масиву визначити не можна" -#: parser/parse_expr.c:2182 +#: parser/parse_expr.c:1996 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "Приведіть його до бажаного типу явним чином, наприклад ARRAY[]::integer[]." -#: parser/parse_expr.c:2196 +#: parser/parse_expr.c:2010 #, c-format msgid "could not find element type for data type %s" msgstr "не вдалося знайти тип елементу для типу даних %s" -#: parser/parse_expr.c:2481 +#: parser/parse_expr.c:2290 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "замість значення XML-атрибуту без імені повинен вказуватись стовпець" -#: parser/parse_expr.c:2482 +#: parser/parse_expr.c:2291 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "замість значення XML-елементу без імені повинен вказуватись стовпець" -#: parser/parse_expr.c:2497 +#: parser/parse_expr.c:2306 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "Ім'я XML-атрибуту \"%s\" з'являється неодноразово" -#: parser/parse_expr.c:2604 +#: parser/parse_expr.c:2413 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "привести результат XMLSERIALIZE до %s не можна" -#: parser/parse_expr.c:2892 parser/parse_expr.c:3088 +#: parser/parse_expr.c:2722 parser/parse_expr.c:2918 #, c-format msgid "unequal number of entries in row expressions" msgstr "неоднакова кількість елементів у виразах рядка" -#: parser/parse_expr.c:2902 +#: parser/parse_expr.c:2732 #, c-format msgid "cannot compare rows of zero length" msgstr "рядки нульової довжини порівнювати не можна" -#: parser/parse_expr.c:2927 +#: parser/parse_expr.c:2757 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "оператор порівняння рядків повинен видавати логічний тип, а не %s" -#: parser/parse_expr.c:2934 +#: parser/parse_expr.c:2764 #, c-format msgid "row comparison operator must not return a set" msgstr "оператор порівняння рядків повинен вертати набір" -#: parser/parse_expr.c:2993 parser/parse_expr.c:3034 +#: parser/parse_expr.c:2823 parser/parse_expr.c:2864 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "не вдалося визначити інтерпретацію оператора порівняння рядків %s" -#: parser/parse_expr.c:2995 +#: parser/parse_expr.c:2825 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "Оператори порівняння рядків повинні бути пов'язанні з сімейством операторів btree." -#: parser/parse_expr.c:3036 +#: parser/parse_expr.c:2866 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Існує декілька рівноцінних кандидатів." -#: parser/parse_expr.c:3129 +#: parser/parse_expr.c:2959 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "IS DISTINCT FROM, потребує = щоб оператор повертав логічне значення" -#: parser/parse_expr.c:3448 parser/parse_expr.c:3466 -#, c-format -msgid "operator precedence change: %s is now lower precedence than %s" -msgstr "пріоритет оператора змінен: %s тепер має меньший пріоритет, ніж %s" - -#: parser/parse_func.c:191 +#: parser/parse_func.c:194 #, c-format msgid "argument name \"%s\" used more than once" msgstr "ім’я аргументу \"%s\" використовується неодноразово" -#: parser/parse_func.c:202 +#: parser/parse_func.c:205 #, c-format msgid "positional argument cannot follow named argument" msgstr "позиційний аргумент не може стежити за іменованим аргументомв" -#: parser/parse_func.c:284 parser/parse_func.c:2243 +#: parser/parse_func.c:287 parser/parse_func.c:2369 #, c-format msgid "%s is not a procedure" msgstr "%s не є процедурою" -#: parser/parse_func.c:288 +#: parser/parse_func.c:291 #, c-format msgid "To call a function, use SELECT." msgstr "Щоб викликати функцію, використайте SELECT." -#: parser/parse_func.c:294 +#: parser/parse_func.c:297 #, c-format msgid "%s is a procedure" msgstr "%s - процедура" -#: parser/parse_func.c:298 +#: parser/parse_func.c:301 #, c-format msgid "To call a procedure, use CALL." msgstr "Щоб викликати процедуру, використайте CALL." -#: parser/parse_func.c:312 +#: parser/parse_func.c:315 #, c-format msgid "%s(*) specified, but %s is not an aggregate function" msgstr "%s(*) вказано, але %s не є агрегатною функцією" -#: parser/parse_func.c:319 +#: parser/parse_func.c:322 #, c-format msgid "DISTINCT specified, but %s is not an aggregate function" msgstr "DISTINCT вказано, але %s не є агрегатною функцією" -#: parser/parse_func.c:325 +#: parser/parse_func.c:328 #, c-format msgid "WITHIN GROUP specified, but %s is not an aggregate function" msgstr "WITHIN GROUP вказано, але %s не є агрегатною функцією" -#: parser/parse_func.c:331 +#: parser/parse_func.c:334 #, c-format msgid "ORDER BY specified, but %s is not an aggregate function" msgstr "ORDER BY вказано, але %s не є агрегатною функцією" -#: parser/parse_func.c:337 +#: parser/parse_func.c:340 #, c-format msgid "FILTER specified, but %s is not an aggregate function" msgstr "FILTER вказано, але %s не є агрегатною функцією" -#: parser/parse_func.c:343 +#: parser/parse_func.c:346 #, c-format msgid "OVER specified, but %s is not a window function nor an aggregate function" msgstr "OVER вказано, але %s не є ні віконною функцією, ні агрегатною функцією" -#: parser/parse_func.c:381 +#: parser/parse_func.c:384 #, c-format msgid "WITHIN GROUP is required for ordered-set aggregate %s" msgstr "Для сортувального агрегату %s необхідна WITHIN GROUP" -#: parser/parse_func.c:387 +#: parser/parse_func.c:390 #, c-format msgid "OVER is not supported for ordered-set aggregate %s" msgstr "Сортувальний агрегат %s не підтримує OVER" -#: parser/parse_func.c:418 parser/parse_func.c:447 +#: parser/parse_func.c:421 parser/parse_func.c:452 #, c-format -msgid "There is an ordered-set aggregate %s, but it requires %d direct arguments, not %d." -msgstr "Є сортувальний агрегат %s, але він потребує %d прямих аргументів, а не %d." +msgid "There is an ordered-set aggregate %s, but it requires %d direct argument, not %d." +msgid_plural "There is an ordered-set aggregate %s, but it requires %d direct arguments, not %d." +msgstr[0] "Існує впорядкована агрегатна функція %s, але вона потребує %d прямого аргументу, а не %d." +msgstr[1] "Існує впорядкована агрегатна функція %s, але вона потребує %d прямих аргументів, а не %d." +msgstr[2] "Існує впорядкована агрегатна функція %s, але вона потребує %d прямих аргументів, а не %d." +msgstr[3] "Існує впорядкована агрегатна функція %s, але вона потребує %d прямих аргументів, а не %d." -#: parser/parse_func.c:472 +#: parser/parse_func.c:479 #, c-format msgid "To use the hypothetical-set aggregate %s, the number of hypothetical direct arguments (here %d) must match the number of ordering columns (here %d)." msgstr "Для використання гіпотетичного агрегату %s кількість прямих гіпотетичних аргументів (тут %d) повинна відповідати кількості сортувальних стовпців (тут %d)." -#: parser/parse_func.c:486 +#: parser/parse_func.c:493 #, c-format -msgid "There is an ordered-set aggregate %s, but it requires at least %d direct arguments." -msgstr "Є сортувальний агрегат %s, але він потребує мінімум %d прямих аргументів." +msgid "There is an ordered-set aggregate %s, but it requires at least %d direct argument." +msgid_plural "There is an ordered-set aggregate %s, but it requires at least %d direct arguments." +msgstr[0] "Існує впорядкована агрегатна функція %s, але вона потребує як мінімум %d прямого аргументу." +msgstr[1] "Існує впорядкована агрегатна функція %s, але вона потребує як мінімум %d прямих аргументів." +msgstr[2] "Існує впорядкована агрегатна функція %s, але вона потребує як мінімум %d прямих аргументів." +msgstr[3] "Існує впорядкована агрегатна функція %s, але вона потребує як мінімум %d прямих аргументів." -#: parser/parse_func.c:505 +#: parser/parse_func.c:514 #, c-format msgid "%s is not an ordered-set aggregate, so it cannot have WITHIN GROUP" msgstr "%s не є сортувальним агрегатом, тому він не може мати WITHIN GROUP" -#: parser/parse_func.c:518 +#: parser/parse_func.c:527 #, c-format msgid "window function %s requires an OVER clause" msgstr "віконна функція %s потребує речення OVER" -#: parser/parse_func.c:525 +#: parser/parse_func.c:534 #, c-format msgid "window function %s cannot have WITHIN GROUP" msgstr "віконна функція %s не може матив WITHIN GROUP" -#: parser/parse_func.c:554 +#: parser/parse_func.c:563 #, c-format msgid "procedure %s is not unique" msgstr "процедура %s не є унікальною" -#: parser/parse_func.c:557 +#: parser/parse_func.c:566 #, c-format msgid "Could not choose a best candidate procedure. You might need to add explicit type casts." msgstr "Не вдалося обрати найкращу кандидатуру процедури. Можливо, вам слід додати явні приведення типів." -#: parser/parse_func.c:563 +#: parser/parse_func.c:572 #, c-format msgid "function %s is not unique" msgstr "функція %s не є унікальною" -#: parser/parse_func.c:566 +#: parser/parse_func.c:575 #, c-format msgid "Could not choose a best candidate function. You might need to add explicit type casts." msgstr "Не вдалося обрати найкращу кандидатуру функції. Можливо, вам слід додати явні приведення типів." -#: parser/parse_func.c:605 +#: parser/parse_func.c:614 #, c-format msgid "No aggregate function matches the given name and argument types. Perhaps you misplaced ORDER BY; ORDER BY must appear after all regular arguments of the aggregate." msgstr "Агрегатну функцію з цим ім'ям і типами аргументів не знайдено. Можливо, ви невірно розмістили речення ORDER BY; речення ORDER BY повинно з'являтись після всіх звичайних аргументів агрегату." -#: parser/parse_func.c:613 parser/parse_func.c:2286 +#: parser/parse_func.c:622 parser/parse_func.c:2412 #, c-format msgid "procedure %s does not exist" msgstr "процедура %s не існує" -#: parser/parse_func.c:616 +#: parser/parse_func.c:625 #, c-format msgid "No procedure matches the given name and argument types. You might need to add explicit type casts." msgstr "Процедуру з цим ім'ям і типами аргументів не знайдено. Можливо, вам слід додати явні приведення типів." -#: parser/parse_func.c:625 +#: parser/parse_func.c:634 #, c-format msgid "No function matches the given name and argument types. You might need to add explicit type casts." msgstr "Функцію з цим ім'ям і типами аргументів не знайдено. Можливо, вам слід додати явні приведення типів." -#: parser/parse_func.c:727 +#: parser/parse_func.c:736 #, c-format msgid "VARIADIC argument must be an array" msgstr "Аргумент VARIADIC повинен бути масивом" -#: parser/parse_func.c:779 parser/parse_func.c:843 +#: parser/parse_func.c:790 parser/parse_func.c:854 #, c-format msgid "%s(*) must be used to call a parameterless aggregate function" msgstr " %s(*) треба використовувати для виклику агрегатної функції без параметрів" -#: parser/parse_func.c:786 +#: parser/parse_func.c:797 #, c-format msgid "aggregates cannot return sets" msgstr "агрегатні функції не можуть повертати набори" -#: parser/parse_func.c:801 +#: parser/parse_func.c:812 #, c-format msgid "aggregates cannot use named arguments" msgstr "агрегатні функції не можуть використовувати іменовані аргументи" -#: parser/parse_func.c:833 +#: parser/parse_func.c:844 #, c-format msgid "DISTINCT is not implemented for window functions" msgstr "DISTINCT для віконних функції не реалізовано" -#: parser/parse_func.c:853 +#: parser/parse_func.c:864 #, c-format msgid "aggregate ORDER BY is not implemented for window functions" msgstr "агрегатне речення ORDER BY для віконних функцій не реалізовано" -#: parser/parse_func.c:862 +#: parser/parse_func.c:873 #, c-format msgid "FILTER is not implemented for non-aggregate window functions" msgstr "FILTER для неагрегатних віконних функцій не реалізовано" -#: parser/parse_func.c:871 +#: parser/parse_func.c:882 #, c-format msgid "window function calls cannot contain set-returning function calls" msgstr "виклики віконних функцій не можуть містити виклики функцій, які повертають набори" -#: parser/parse_func.c:879 +#: parser/parse_func.c:890 #, c-format msgid "window functions cannot return sets" msgstr "віконні функції не можуть повертати набори" -#: parser/parse_func.c:2124 parser/parse_func.c:2315 +#: parser/parse_func.c:2168 parser/parse_func.c:2441 #, c-format msgid "could not find a function named \"%s\"" msgstr "не вдалося знайти функцію з іменем \"%s\"" -#: parser/parse_func.c:2138 parser/parse_func.c:2333 +#: parser/parse_func.c:2182 parser/parse_func.c:2459 #, c-format msgid "function name \"%s\" is not unique" msgstr "ім’я функції \"%s\" не є унікальним" -#: parser/parse_func.c:2140 parser/parse_func.c:2335 +#: parser/parse_func.c:2184 parser/parse_func.c:2462 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "Укажіть список аргументів для однозначного вибору функції." -#: parser/parse_func.c:2184 +#: parser/parse_func.c:2228 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" @@ -15739,203 +16351,197 @@ msgstr[1] "процедури не можуть мати більш ніж %d а msgstr[2] "процедури не можуть мати більш ніж %d аргументів" msgstr[3] "процедури не можуть мати більш ніж %d аргументів" -#: parser/parse_func.c:2233 +#: parser/parse_func.c:2359 #, c-format msgid "%s is not a function" msgstr "%s не є функцією" -#: parser/parse_func.c:2253 +#: parser/parse_func.c:2379 #, c-format msgid "function %s is not an aggregate" msgstr "функція %s не є агрегатною" -#: parser/parse_func.c:2281 +#: parser/parse_func.c:2407 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "не вдалося знайти процедуру з іменем \"%s\"" -#: parser/parse_func.c:2295 +#: parser/parse_func.c:2421 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "не вдалося знайти агрегат з ім'ям \"%s\"" -#: parser/parse_func.c:2300 +#: parser/parse_func.c:2426 #, c-format msgid "aggregate %s(*) does not exist" msgstr "агрегат %s (*) не існує" -#: parser/parse_func.c:2305 +#: parser/parse_func.c:2431 #, c-format msgid "aggregate %s does not exist" msgstr "агрегат %s не існує" -#: parser/parse_func.c:2340 +#: parser/parse_func.c:2467 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "назва процедури \"%s\" не є унікальною" -#: parser/parse_func.c:2342 +#: parser/parse_func.c:2470 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "Вкажіть список аргументів для однозначного вибору процедури." -#: parser/parse_func.c:2347 +#: parser/parse_func.c:2475 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "назва агрегатної функції \"%s\" не є унікальною" -#: parser/parse_func.c:2349 +#: parser/parse_func.c:2478 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "Вкажіть список аргументів для однозначного вибору агрегатної функції." -#: parser/parse_func.c:2354 +#: parser/parse_func.c:2483 #, c-format msgid "routine name \"%s\" is not unique" msgstr "назва підпрограми \"%s\" не є унікальною" -#: parser/parse_func.c:2356 +#: parser/parse_func.c:2486 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "Вкажіть список аргументів для однозначного вибору підпрограми." -#: parser/parse_func.c:2411 +#: parser/parse_func.c:2541 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "функції, що повертають множину, не можна застосовувати в умовах групування" -#: parser/parse_func.c:2432 +#: parser/parse_func.c:2562 msgid "set-returning functions are not allowed in policy expressions" msgstr "функції, що повертають множину, не можна застосовувати у виразах політики" -#: parser/parse_func.c:2448 +#: parser/parse_func.c:2578 msgid "set-returning functions are not allowed in window definitions" msgstr "функції, що повертають множину, не можна застосовувати у віконних визначеннях" -#: parser/parse_func.c:2486 +#: parser/parse_func.c:2616 msgid "set-returning functions are not allowed in check constraints" msgstr "функції, що повертають множину, не можна застосовувати в обмеженнях Check" -#: parser/parse_func.c:2490 +#: parser/parse_func.c:2620 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "функції, що повертають множину, не можна застосовувати у стандартних виразах" -#: parser/parse_func.c:2493 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in index expressions" msgstr "функції, що повертають множину, не можна застосовувати в індексних виразах" -#: parser/parse_func.c:2496 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index predicates" msgstr "функції, що повертають множину, не можна застосовувати в індексних предикатах" -#: parser/parse_func.c:2499 +#: parser/parse_func.c:2629 +msgid "set-returning functions are not allowed in statistics expressions" +msgstr "функції, що повертають набори, не можна застосовувати у виразах статистики" + +#: parser/parse_func.c:2632 msgid "set-returning functions are not allowed in transform expressions" msgstr "функції, що повертають множину, не можна застосовувати у виразах перетворення" -#: parser/parse_func.c:2502 +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "функції, що повертають множину, не можна застосовуватив параметрах виконання" -#: parser/parse_func.c:2505 +#: parser/parse_func.c:2638 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "функції, що повертають множину, не можна застосовувати в умовах для тригерів WHEN" -#: parser/parse_func.c:2508 +#: parser/parse_func.c:2641 msgid "set-returning functions are not allowed in partition bound" msgstr "функції, що повертають множину не можна застосовувати в границі секції" -#: parser/parse_func.c:2511 +#: parser/parse_func.c:2644 msgid "set-returning functions are not allowed in partition key expressions" msgstr "функції, що повертають множину, не можна застосовувати у виразах ключа розділення" -#: parser/parse_func.c:2514 +#: parser/parse_func.c:2647 msgid "set-returning functions are not allowed in CALL arguments" msgstr "функції, що повертають множину, не можна застосовувати в аргументах Відеовикликів" -#: parser/parse_func.c:2517 +#: parser/parse_func.c:2650 msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" msgstr "функції, що повертають множину не можна застосовувати в умовах COPY FROM WHERE" -#: parser/parse_func.c:2520 +#: parser/parse_func.c:2653 msgid "set-returning functions are not allowed in column generation expressions" msgstr "функції, що повертають множину не можна застосовувати у виразах генерації стовпців" -#: parser/parse_node.c:86 -#, c-format -msgid "target lists can have at most %d entries" -msgstr "цільові списки можуть мати максимум %d елементів" - -#: parser/parse_node.c:235 -#, c-format -msgid "cannot subscript type %s because it is not an array" -msgstr "не можливо вказати тип %s тому, що він не є масивом" - -#: parser/parse_node.c:340 parser/parse_node.c:377 +#: parser/parse_node.c:87 #, c-format -msgid "array subscript must have type integer" -msgstr "індекс елементу масиву має бути цілим числом" +msgid "target lists can have at most %d entries" +msgstr "цільові списки можуть мати максимум %d елементів" -#: parser/parse_node.c:408 +#: parser/parse_oper.c:123 parser/parse_oper.c:690 #, c-format -msgid "array assignment requires type %s but expression is of type %s" -msgstr "для присвоєння масиву потрібен тип %s, але вираз має тип %s" +msgid "postfix operators are not supported" +msgstr "постфіксні оператори не підтримуються" -#: parser/parse_oper.c:125 parser/parse_oper.c:724 utils/adt/regproc.c:521 -#: utils/adt/regproc.c:705 +#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:539 +#: utils/adt/regproc.c:723 #, c-format msgid "operator does not exist: %s" msgstr "оператор не існує: %s" -#: parser/parse_oper.c:224 +#: parser/parse_oper.c:229 #, c-format msgid "Use an explicit ordering operator or modify the query." msgstr "Використати явний оператор сортування або змінити запит." -#: parser/parse_oper.c:480 +#: parser/parse_oper.c:485 #, c-format msgid "operator requires run-time type coercion: %s" msgstr "оператор вимагає приведення типів під час виконання: %s" -#: parser/parse_oper.c:716 +#: parser/parse_oper.c:641 #, c-format msgid "operator is not unique: %s" msgstr "оператор не є унікальним: %s" -#: parser/parse_oper.c:718 +#: parser/parse_oper.c:643 #, c-format msgid "Could not choose a best candidate operator. You might need to add explicit type casts." msgstr "Не вдалося вибрати найкращу кандидатуру оператора. Вам, можливо треба додати явні приведення типів." -#: parser/parse_oper.c:727 +#: parser/parse_oper.c:652 #, c-format msgid "No operator matches the given name and argument type. You might need to add an explicit type cast." msgstr "Жодний оператор не відповідає даному імені та типу аргументу. Вам, можливо, треба додати явне приведення типу." -#: parser/parse_oper.c:729 +#: parser/parse_oper.c:654 #, c-format msgid "No operator matches the given name and argument types. You might need to add explicit type casts." msgstr "Жодний оператор не відповідає даному імені та типу аргументу. Вам, можливо, треба додати явні приведення типів." -#: parser/parse_oper.c:790 parser/parse_oper.c:912 +#: parser/parse_oper.c:714 parser/parse_oper.c:828 #, c-format msgid "operator is only a shell: %s" msgstr "оператор є лише оболонкою: %s" -#: parser/parse_oper.c:900 +#: parser/parse_oper.c:816 #, c-format msgid "op ANY/ALL (array) requires array on right side" msgstr "op ANY/ALL (масив) вимагає масив справа" -#: parser/parse_oper.c:942 +#: parser/parse_oper.c:858 #, c-format msgid "op ANY/ALL (array) requires operator to yield boolean" msgstr "op ANY/ALL (масив) вимагає оператора для видання логічного типу" -#: parser/parse_oper.c:947 +#: parser/parse_oper.c:863 #, c-format msgid "op ANY/ALL (array) requires operator not to return a set" msgstr "op ANY/ALL (масив) вимагає оператора не для повернення множини" -#: parser/parse_param.c:216 +#: parser/parse_param.c:225 #, c-format msgid "inconsistent types deduced for parameter $%d" msgstr "для параметру $%d виведені неузгоджені типи" @@ -15950,153 +16556,163 @@ msgstr "посилання на таблицю \"%s\" неоднозначне" msgid "table reference %u is ambiguous" msgstr "посилання на таблицю %u неоднозначне" -#: parser/parse_relation.c:444 +#: parser/parse_relation.c:445 #, c-format msgid "table name \"%s\" specified more than once" msgstr "ім'я таблиці \"%s\" вказано більше одного разу" -#: parser/parse_relation.c:473 parser/parse_relation.c:3446 +#: parser/parse_relation.c:474 parser/parse_relation.c:3532 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "в елементі речення FROM неприпустиме посилання на таблицю \"%s\"" -#: parser/parse_relation.c:477 parser/parse_relation.c:3451 +#: parser/parse_relation.c:478 parser/parse_relation.c:3537 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "Таблиця \"%s\" присутня в запиті, але посилатися на неї з цієї частини запиту не можна." -#: parser/parse_relation.c:479 +#: parser/parse_relation.c:480 #, c-format msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." msgstr "Для посилання LATERAL тип JOIN повинен бути INNER або LEFT." -#: parser/parse_relation.c:690 +#: parser/parse_relation.c:691 #, c-format msgid "system column \"%s\" reference in check constraint is invalid" msgstr "недопустиме посилання системи стовпців \"%s\" в обмеженні Check" -#: parser/parse_relation.c:699 +#: parser/parse_relation.c:700 #, c-format msgid "cannot use system column \"%s\" in column generation expression" msgstr "використовувати системний стовпець \"%s\" у виразах генерації стовпців, не можна" -#: parser/parse_relation.c:1170 parser/parse_relation.c:1620 -#: parser/parse_relation.c:2262 +#: parser/parse_relation.c:1173 parser/parse_relation.c:1625 +#: parser/parse_relation.c:2302 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "таблиця \"%s\" має %d доступних стовпців, але вказано %d стовпців" -#: parser/parse_relation.c:1372 +#: parser/parse_relation.c:1377 #, c-format msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." msgstr "Існує WITH елемент \"%s\" але на нього не можна посилатися з цієї частини запиту." -#: parser/parse_relation.c:1374 +#: parser/parse_relation.c:1379 #, c-format msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." msgstr "Використовувати WITH RECURSIVE, або перевпорядкувати елементи WITH, щоб видалити попередні посилання." -#: parser/parse_relation.c:1747 +#: parser/parse_relation.c:1767 +#, c-format +msgid "a column definition list is redundant for a function with OUT parameters" +msgstr "список з визначенням стовпців не потрібен для функції з параметрами OUT" + +#: parser/parse_relation.c:1773 +#, c-format +msgid "a column definition list is redundant for a function returning a named composite type" +msgstr "список з визначенням стовпців не потрібен для функції, яка повертає іменований складений тип" + +#: parser/parse_relation.c:1780 #, c-format msgid "a column definition list is only allowed for functions returning \"record\"" msgstr "список з визначенням стовпців дозволений лише для функцій, що повертають \"запис\"" -#: parser/parse_relation.c:1756 +#: parser/parse_relation.c:1791 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "список з визначенням стовпців вимагається для функцій, що повертають \"запис\"" -#: parser/parse_relation.c:1845 +#: parser/parse_relation.c:1880 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "функція \"%s\" у FROM повертає тип, що не підтримується %s" -#: parser/parse_relation.c:2054 +#: parser/parse_relation.c:2089 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "VALUES списки \"%s\" мають %d доступних стовпців, але %d стовпців вказано" -#: parser/parse_relation.c:2125 +#: parser/parse_relation.c:2161 #, c-format msgid "joins can have at most %d columns" msgstr "з'єднання можуть мати максимум %d стовпців" -#: parser/parse_relation.c:2235 +#: parser/parse_relation.c:2275 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "WITH запит \"%s\" не має речення RETURNING" -#: parser/parse_relation.c:3221 parser/parse_relation.c:3231 +#: parser/parse_relation.c:3307 parser/parse_relation.c:3317 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "стовпець %d відношення \"%s\" не існує" -#: parser/parse_relation.c:3449 +#: parser/parse_relation.c:3535 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Можливо, малося на увазі посилання на псевдонім таблиці \"%s\"." -#: parser/parse_relation.c:3457 +#: parser/parse_relation.c:3543 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "таблиця \"%s\" відсутня в реченні FROM" -#: parser/parse_relation.c:3509 +#: parser/parse_relation.c:3595 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "Можливо, передбачалось посилання на стовпець \"%s.%s\"." -#: parser/parse_relation.c:3511 +#: parser/parse_relation.c:3597 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "Є стовпець з іменем \"%s\" в таблиці \"%s\", але на нього не можна посилатись з цієї частини запиту." -#: parser/parse_relation.c:3528 +#: parser/parse_relation.c:3614 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "Можливо, передбачалось посилання на стовпець \"%s.%s\" або стовпець \"%s.%s\"." -#: parser/parse_target.c:478 parser/parse_target.c:792 +#: parser/parse_target.c:483 parser/parse_target.c:804 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "призначити значення системному стовпцю \"%s\" не можна" -#: parser/parse_target.c:506 +#: parser/parse_target.c:511 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "елементу масива не можна встановити значення DEFAULT" -#: parser/parse_target.c:511 +#: parser/parse_target.c:516 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "підполю не можна встановити значення DEFAULT" -#: parser/parse_target.c:584 +#: parser/parse_target.c:590 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "стовпець \"%s\" має тип %s, а вираз %s" -#: parser/parse_target.c:776 +#: parser/parse_target.c:788 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" msgstr "призначити значення полю \"%s\" стовпця \"%s\" не можна, тому, що тип %s не є складеним типом" -#: parser/parse_target.c:785 +#: parser/parse_target.c:797 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" msgstr "призначити значення полю \"%s\" стовпця \"%s\" не можна, тому, що в типі даних %s немає такого стовпця" -#: parser/parse_target.c:864 +#: parser/parse_target.c:878 #, c-format -msgid "array assignment to \"%s\" requires type %s but expression is of type %s" -msgstr "для призначення масиву полю \"%s\" потрібен тип %s, але вираз має тип %s" +msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" +msgstr "індексоване присвоєння \"%s\" вимагає тип %s, але вираз має тип %s" -#: parser/parse_target.c:874 +#: parser/parse_target.c:888 #, c-format msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "підполе \"%s\" має тип %s, але вираз має тип %s" -#: parser/parse_target.c:1295 +#: parser/parse_target.c:1323 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * повинен посилатись на таблиці" @@ -16116,8 +16732,8 @@ msgstr "неправильне посилання %%TYPE (занадто баг msgid "type reference %s converted to %s" msgstr "посилання на тип %s перетворене на тип %s" -#: parser/parse_type.c:278 parser/parse_type.c:857 utils/cache/typcache.c:383 -#: utils/cache/typcache.c:437 +#: parser/parse_type.c:278 parser/parse_type.c:803 utils/cache/typcache.c:389 +#: utils/cache/typcache.c:444 #, c-format msgid "type \"%s\" is only a shell" msgstr "тип \"%s\" є лише оболонкою" @@ -16132,494 +16748,507 @@ msgstr "тип \"%s\" не дозволяє використання модиф msgid "type modifiers must be simple constants or identifiers" msgstr "модифікатором типу повинна бути звичайна константа або ідентифікатор" -#: parser/parse_type.c:721 parser/parse_type.c:820 +#: parser/parse_type.c:721 parser/parse_type.c:766 #, c-format msgid "invalid type name \"%s\"" msgstr "невірне ім'я типу \"%s\"" -#: parser/parse_utilcmd.c:264 +#: parser/parse_utilcmd.c:256 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "створити секціоновану таблицю в якості нащадка не можна" -#: parser/parse_utilcmd.c:428 -#, c-format -msgid "%s will create implicit sequence \"%s\" for serial column \"%s.%s\"" -msgstr "%s створить неявну послідовність \"%s\" для послідовного стовпця \"%s.%s\"" - -#: parser/parse_utilcmd.c:559 +#: parser/parse_utilcmd.c:570 #, c-format msgid "array of serial is not implemented" msgstr "масиви послідовності не реалізовані" -#: parser/parse_utilcmd.c:637 parser/parse_utilcmd.c:649 +#: parser/parse_utilcmd.c:649 parser/parse_utilcmd.c:661 +#: parser/parse_utilcmd.c:720 #, c-format msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "несумісні оголошення NULL/NOT NULL для стовпця \"%s\" таблиці \"%s\"" -#: parser/parse_utilcmd.c:661 +#: parser/parse_utilcmd.c:673 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "для стовпця \"%s\" таблиці \"%s\" вказано декілька значень за замовчуванням" -#: parser/parse_utilcmd.c:678 +#: parser/parse_utilcmd.c:690 #, c-format msgid "identity columns are not supported on typed tables" msgstr "ідентифікаційні стовпці не підтримуються в типізованих таблицях" -#: parser/parse_utilcmd.c:682 +#: parser/parse_utilcmd.c:694 #, c-format msgid "identity columns are not supported on partitions" msgstr "ідентифікаційні стовпці не підтримуються з секціями" -#: parser/parse_utilcmd.c:691 +#: parser/parse_utilcmd.c:703 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "для стовпця \"%s\" таблиці \"%s\" властивість identity вказана неодноразово" -#: parser/parse_utilcmd.c:711 +#: parser/parse_utilcmd.c:733 #, c-format msgid "generated columns are not supported on typed tables" msgstr "згенеровані стовпці не підтримуються в типізованих таблицях" -#: parser/parse_utilcmd.c:715 +#: parser/parse_utilcmd.c:737 #, c-format msgid "generated columns are not supported on partitions" msgstr "згенеровані стовпці не підтримуються в секціях" -#: parser/parse_utilcmd.c:720 +#: parser/parse_utilcmd.c:742 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "для стовпця \"%s\" таблиці \"%s\" вказано декілька речень генерації" -#: parser/parse_utilcmd.c:738 parser/parse_utilcmd.c:853 +#: parser/parse_utilcmd.c:760 parser/parse_utilcmd.c:875 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "обмеження первинного ключа для сторонніх таблиць не підтримуються" -#: parser/parse_utilcmd.c:747 parser/parse_utilcmd.c:863 +#: parser/parse_utilcmd.c:769 parser/parse_utilcmd.c:885 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "обмеження унікальності для сторонніх таблиць не підтримуються" -#: parser/parse_utilcmd.c:792 +#: parser/parse_utilcmd.c:814 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "для стовпця \"%s\" таблиці \"%s\" вказано значення за замовчуванням і властивість identity" -#: parser/parse_utilcmd.c:800 +#: parser/parse_utilcmd.c:822 #, c-format msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" msgstr "для стовпця \"%s\" таблиці \"%s\" вказано вираз за замовчуванням і вираз генерації" -#: parser/parse_utilcmd.c:808 +#: parser/parse_utilcmd.c:830 #, c-format msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" msgstr "для стовпця \"%s\" таблиці \"%s\" вказано вираз ідентичності і вираз генерації" -#: parser/parse_utilcmd.c:873 +#: parser/parse_utilcmd.c:895 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "обмеження-виключення для сторонніх таблиць не підтримуються" -#: parser/parse_utilcmd.c:879 +#: parser/parse_utilcmd.c:901 #, c-format msgid "exclusion constraints are not supported on partitioned tables" msgstr "обмеження-виключення для секціонованих таблиць не підтримуються" -#: parser/parse_utilcmd.c:944 +#: parser/parse_utilcmd.c:966 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE не підтримується при створенні сторонніх таблиць" -#: parser/parse_utilcmd.c:1704 parser/parse_utilcmd.c:1813 +#: parser/parse_utilcmd.c:1743 parser/parse_utilcmd.c:1851 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "Індекс \"%s\" містить посилання на таблицю на весь рядок." -#: parser/parse_utilcmd.c:2163 +#: parser/parse_utilcmd.c:2238 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "у CREATE TABLE не можна використовувати існуючий індекс" -#: parser/parse_utilcmd.c:2183 +#: parser/parse_utilcmd.c:2258 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "індекс \"%s\" вже пов'язаний з обмеженням" -#: parser/parse_utilcmd.c:2198 +#: parser/parse_utilcmd.c:2273 #, c-format msgid "index \"%s\" is not valid" msgstr "індекс \"%s\" не є припустимим" -#: parser/parse_utilcmd.c:2204 +#: parser/parse_utilcmd.c:2279 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\" не є унікальним індексом" -#: parser/parse_utilcmd.c:2205 parser/parse_utilcmd.c:2212 -#: parser/parse_utilcmd.c:2219 parser/parse_utilcmd.c:2296 +#: parser/parse_utilcmd.c:2280 parser/parse_utilcmd.c:2287 +#: parser/parse_utilcmd.c:2294 parser/parse_utilcmd.c:2371 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "Створити первинний ключ або обмеження унікальності, використовуючи такий індекс, не можна." -#: parser/parse_utilcmd.c:2211 +#: parser/parse_utilcmd.c:2286 #, c-format msgid "index \"%s\" contains expressions" msgstr "індекс \"%s\" містить вирази" -#: parser/parse_utilcmd.c:2218 +#: parser/parse_utilcmd.c:2293 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\" є частковим індексом" -#: parser/parse_utilcmd.c:2230 +#: parser/parse_utilcmd.c:2305 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\" є індексом, що відкладається" -#: parser/parse_utilcmd.c:2231 +#: parser/parse_utilcmd.c:2306 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "Створити обмеження, що не відкладається, використовуючи індекс, що відкладається, не можна." -#: parser/parse_utilcmd.c:2295 +#: parser/parse_utilcmd.c:2370 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "індекс \"%s\" номер стовпця %d не має поведінки сортування за замовчуванням" -#: parser/parse_utilcmd.c:2452 +#: parser/parse_utilcmd.c:2527 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "стовпець \"%s\" з'являється двічі в обмеженні первинного ключа" -#: parser/parse_utilcmd.c:2458 +#: parser/parse_utilcmd.c:2533 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "стовпець \"%s\" з'являється двічі в обмеженні унікальності" -#: parser/parse_utilcmd.c:2811 +#: parser/parse_utilcmd.c:2880 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "індекс-вирази й предикати можуть посилатись лише на індексовану таблицю" -#: parser/parse_utilcmd.c:2857 +#: parser/parse_utilcmd.c:2952 +#, c-format +msgid "statistics expressions can refer only to the table being indexed" +msgstr "вирази статистики можуть посилатись лише на індексовану таблицю" + +#: parser/parse_utilcmd.c:2995 #, c-format msgid "rules on materialized views are not supported" msgstr "правила для матеріалізованих подань не підтримуються" -#: parser/parse_utilcmd.c:2920 +#: parser/parse_utilcmd.c:3058 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "в умовах WHERE правила не можуть містити посилання на інші зв'язки" -#: parser/parse_utilcmd.c:2994 +#: parser/parse_utilcmd.c:3131 #, c-format msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "правила з умовами WHERE можуть мати лише дії SELECT, INSERT, UPDATE або DELETE" -#: parser/parse_utilcmd.c:3012 parser/parse_utilcmd.c:3113 -#: rewrite/rewriteHandler.c:502 rewrite/rewriteManip.c:1018 +#: parser/parse_utilcmd.c:3149 parser/parse_utilcmd.c:3250 +#: rewrite/rewriteHandler.c:508 rewrite/rewriteManip.c:1018 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "умовні оператори UNION/INTERSECT/EXCEPT не реалізовані" -#: parser/parse_utilcmd.c:3030 +#: parser/parse_utilcmd.c:3167 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "у правилі ON SELECT не можна використовувати OLD" -#: parser/parse_utilcmd.c:3034 +#: parser/parse_utilcmd.c:3171 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "у правилі ON SELECT не можна використовувати NEW" -#: parser/parse_utilcmd.c:3043 +#: parser/parse_utilcmd.c:3180 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "у правилі ON INSERT не можна використовувати OLD" -#: parser/parse_utilcmd.c:3049 +#: parser/parse_utilcmd.c:3186 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "у правилі ON DELETE не можна використовувати NEW" -#: parser/parse_utilcmd.c:3077 +#: parser/parse_utilcmd.c:3214 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "у запиті WITH не можна посилатися на OLD" -#: parser/parse_utilcmd.c:3084 +#: parser/parse_utilcmd.c:3221 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "у запиті WITH не можна посилатися на NEW" -#: parser/parse_utilcmd.c:3542 +#: parser/parse_utilcmd.c:3674 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "речення DEFERRABLE розташовано неправильно" -#: parser/parse_utilcmd.c:3547 parser/parse_utilcmd.c:3562 +#: parser/parse_utilcmd.c:3679 parser/parse_utilcmd.c:3694 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "декілька речень DEFERRABLE/NOT DEFERRABLE не допускаються" -#: parser/parse_utilcmd.c:3557 +#: parser/parse_utilcmd.c:3689 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "речення NOT DEFERRABLE розташовано неправильно" -#: parser/parse_utilcmd.c:3570 parser/parse_utilcmd.c:3596 gram.y:5593 +#: parser/parse_utilcmd.c:3702 parser/parse_utilcmd.c:3728 gram.y:5558 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "обмеження, оголошене як INITIALLY DEFERRED, повинно бути оголошене як DEFERRABLE" -#: parser/parse_utilcmd.c:3578 +#: parser/parse_utilcmd.c:3710 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "речення INITIALLY DEFERRED розташовано неправильно" -#: parser/parse_utilcmd.c:3583 parser/parse_utilcmd.c:3609 +#: parser/parse_utilcmd.c:3715 parser/parse_utilcmd.c:3741 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "декілька речень INITIALLY IMMEDIATE/DEFERRED не допускаються" -#: parser/parse_utilcmd.c:3604 +#: parser/parse_utilcmd.c:3736 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "речення INITIALLY IMMEDIATE розташовано неправильно" -#: parser/parse_utilcmd.c:3795 +#: parser/parse_utilcmd.c:3927 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "В CREATE вказана схема (%s), яка відрізняється від створюваної (%s)" -#: parser/parse_utilcmd.c:3830 +#: parser/parse_utilcmd.c:3962 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\" не є секціонованою таблицею" -#: parser/parse_utilcmd.c:3837 +#: parser/parse_utilcmd.c:3969 #, c-format msgid "table \"%s\" is not partitioned" msgstr "таблиця \"%s\" не є секційною" -#: parser/parse_utilcmd.c:3844 +#: parser/parse_utilcmd.c:3976 #, c-format msgid "index \"%s\" is not partitioned" msgstr "індекс \"%s\" не є секціонованим" -#: parser/parse_utilcmd.c:3884 +#: parser/parse_utilcmd.c:4016 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "у геш-секціонованій таблиці не може бути розділу за замовчуванням" -#: parser/parse_utilcmd.c:3901 +#: parser/parse_utilcmd.c:4033 #, c-format msgid "invalid bound specification for a hash partition" msgstr "неприпустима вказівка границі для геш-секції" -#: parser/parse_utilcmd.c:3907 partitioning/partbounds.c:4691 +#: parser/parse_utilcmd.c:4039 #, c-format msgid "modulus for hash partition must be a positive integer" msgstr "модуль для геш-секції повинен бути додатним цілим" -#: parser/parse_utilcmd.c:3914 partitioning/partbounds.c:4699 +#: parser/parse_utilcmd.c:4046 partitioning/partbounds.c:4719 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "залишок для геш-секції повинен бути меньшим, ніж модуль" -#: parser/parse_utilcmd.c:3927 +#: parser/parse_utilcmd.c:4059 #, c-format msgid "invalid bound specification for a list partition" msgstr "нерипустима вказівка границі для секції по списку" -#: parser/parse_utilcmd.c:3980 +#: parser/parse_utilcmd.c:4112 #, c-format msgid "invalid bound specification for a range partition" msgstr "неприпустима вказівка границі для секції діапазону" -#: parser/parse_utilcmd.c:3986 +#: parser/parse_utilcmd.c:4118 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "В FROM повинно вказуватися лише одне значення для стовпця секціонування" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:4122 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "В TO повинно вказуватися лише одне значення для стовпця секціонування" -#: parser/parse_utilcmd.c:4104 +#: parser/parse_utilcmd.c:4236 #, c-format msgid "cannot specify NULL in range bound" msgstr "вказати NULL в діапазоні границі не можна" -#: parser/parse_utilcmd.c:4153 +#: parser/parse_utilcmd.c:4285 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "за кожною границею MAXVALUE повинні бути лише границі MAXVALUE" -#: parser/parse_utilcmd.c:4160 +#: parser/parse_utilcmd.c:4292 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "за кожною границею MINVALUE повинні бути лише границі MINVALUE" -#: parser/parse_utilcmd.c:4202 -#, c-format -msgid "could not determine which collation to use for partition bound expression" -msgstr "не вдалося визначити яке правило сортування використати для виразу границі розділу" - -#: parser/parse_utilcmd.c:4219 -#, c-format -msgid "collation of partition bound value for column \"%s\" does not match partition key collation \"%s\"" -msgstr "значення параметру сортування границі секції для стовпця \"%s\" не відповідає параметру сортування ключа секціонування \"%s\"" - -#: parser/parse_utilcmd.c:4236 +#: parser/parse_utilcmd.c:4335 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "вказане значення не можна привести до типу %s для стовпця \"%s\"" -#: parser/parser.c:228 +#: parser/parser.c:247 msgid "UESCAPE must be followed by a simple string literal" msgstr "UESCAPE повинен відстежуватись простим літеральним рядком" -#: parser/parser.c:233 +#: parser/parser.c:252 msgid "invalid Unicode escape character" msgstr "неприпустимий символ спеціального коду Unicode" -#: parser/parser.c:302 scan.l:1329 +#: parser/parser.c:321 scan.l:1329 #, c-format msgid "invalid Unicode escape value" msgstr "неприпустиме значення спеціального коду Unicode" -#: parser/parser.c:449 scan.l:677 +#: parser/parser.c:468 utils/adt/varlena.c:6566 scan.l:677 #, c-format msgid "invalid Unicode escape" msgstr "неприпустимий спеціальний код Unicode" -#: parser/parser.c:450 +#: parser/parser.c:469 #, c-format msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Спеціальні символи Unicode повинні бути \\XXXX або \\+XXXXXX." -#: parser/parser.c:478 scan.l:638 scan.l:654 scan.l:670 +#: parser/parser.c:497 utils/adt/varlena.c:6591 scan.l:638 scan.l:654 +#: scan.l:670 #, c-format msgid "invalid Unicode surrogate pair" msgstr "неприпустима сурогатна пара Unicode" -#: parser/scansup.c:203 +#: parser/scansup.c:101 #, c-format -msgid "identifier \"%s\" will be truncated to \"%s\"" -msgstr "ідентифікатор \"%s\" буде скорочено до \"%s\"" +msgid "identifier \"%s\" will be truncated to \"%.*s\"" +msgstr "ідентифікатор \"%s\" буде скорочено до \"%.*s\"" -#: partitioning/partbounds.c:2831 +#: partitioning/partbounds.c:2821 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "існують конфлікти між розділом \"%s\" та існуючим розділом за замовчуванням \"%s\"" -#: partitioning/partbounds.c:2890 +#: partitioning/partbounds.c:2873 partitioning/partbounds.c:2892 +#: partitioning/partbounds.c:2914 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "модуль кожної геш-секції повинен бути дільником наступних більших модулів" -#: partitioning/partbounds.c:2986 +#: partitioning/partbounds.c:2874 partitioning/partbounds.c:2915 +#, c-format +msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." +msgstr "Новий модуль %d не є дільником %d, поточний модуль розділу \"%s\"." + +#: partitioning/partbounds.c:2893 +#, c-format +msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." +msgstr "Новий модуль %d не ділиться на %d, поточний модуль розділу \"%s\"." + +#: partitioning/partbounds.c:3028 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "для секції \"%s\" вказані границі, які утворюють пустий діапазон" -#: partitioning/partbounds.c:2988 +#: partitioning/partbounds.c:3030 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "Вказана нижня границя %s більша або дорівнює верхній границі %s." -#: partitioning/partbounds.c:3085 +#: partitioning/partbounds.c:3142 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "секція \"%s\" буде перекривати секцію \"%s\"" -#: partitioning/partbounds.c:3202 +#: partitioning/partbounds.c:3259 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "пропущено сканування зовнішньої таблиці \"%s\" яка є секцією секції за замовчуванням \"%s\"" -#: partitioning/partbounds.c:4695 +#: partitioning/partbounds.c:4711 #, c-format -msgid "remainder for hash partition must be a non-negative integer" -msgstr "залишок для геш-секції повинен бути не від'ємним цілим" +msgid "modulus for hash partition must be an integer value greater than zero" +msgstr "модуль для хеш-секції повинен бути цілим числом більше за нуль" -#: partitioning/partbounds.c:4722 +#: partitioning/partbounds.c:4715 +#, c-format +msgid "remainder for hash partition must be an integer value greater than or equal to zero" +msgstr "залишок для хеш-секції повинен бути цілим числом більше або дорівнювати нулю" + +#: partitioning/partbounds.c:4739 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\" не є геш-секціонованою таблицею" -#: partitioning/partbounds.c:4733 partitioning/partbounds.c:4850 +#: partitioning/partbounds.c:4750 partitioning/partbounds.c:4867 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "кількість секціонованих стовпців (%d) не дорівнює кількості наданих ключів секціонування (%d)" -#: partitioning/partbounds.c:4755 partitioning/partbounds.c:4787 +#: partitioning/partbounds.c:4772 +#, c-format +msgid "column %d of the partition key has type %s, but supplied value is of type %s" +msgstr "стовпець %d ключа секціонування має тип %s, але для нього вказане значення типу %s" + +#: partitioning/partbounds.c:4804 #, c-format msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" msgstr "стовпець %d ключа секціонування має тип \"%s\", але для нього вказано значення типу \"%s\"" -#: port/pg_sema.c:209 port/pg_shmem.c:640 port/posix_sema.c:209 -#: port/sysv_sema.c:327 port/sysv_shmem.c:640 +#: port/pg_sema.c:209 port/pg_shmem.c:678 port/posix_sema.c:209 +#: port/sysv_sema.c:327 port/sysv_shmem.c:678 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "не вдалося встановити дані каталогу \"%s\": %m" -#: port/pg_shmem.c:216 port/sysv_shmem.c:216 +#: port/pg_shmem.c:227 port/sysv_shmem.c:227 #, c-format msgid "could not create shared memory segment: %m" msgstr "не вдалося створити сегмент спільної пам'яті: %m" -#: port/pg_shmem.c:217 port/sysv_shmem.c:217 +#: port/pg_shmem.c:228 port/sysv_shmem.c:228 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "Помилка в системному виклику shmget (ключ=%lu, розмір=%zu, 0%o)." -#: port/pg_shmem.c:221 port/sysv_shmem.c:221 +#: port/pg_shmem.c:232 port/sysv_shmem.c:232 #, c-format msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" "The PostgreSQL documentation contains more information about shared memory configuration." msgstr "Ця помилка зазвичай означає, що запит PostgreSQL для сегменту спільної пам'яті перевищує параметр SHMMAX вашого ядра, або можливо що він менший за параметр SHMMIN вашого ядра.\n" "Більше інформації про налаштування спільної пам'яті міститься в інструкції PostgreSQL." -#: port/pg_shmem.c:228 port/sysv_shmem.c:228 +#: port/pg_shmem.c:239 port/sysv_shmem.c:239 #, c-format msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" "The PostgreSQL documentation contains more information about shared memory configuration." msgstr "Ця помилка зазвичай означає, що запит PostgreSQL для сегменту спільної пам'яті перевищує параметр SHMALL вашого ядра. Можливо, вам слід переналаштувати ваше ядро, збільшивши параметр SHMALL.\n" "Більше інформації про налаштування спільної пам'яті міститься в інструкції PostgreSQL." -#: port/pg_shmem.c:234 port/sysv_shmem.c:234 +#: port/pg_shmem.c:245 port/sysv_shmem.c:245 #, c-format msgid "This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" "The PostgreSQL documentation contains more information about shared memory configuration." msgstr "Ця помилка НЕ означає, що на диску немає місця. Ймовірніше за все, були зайняті всі доступні ID спільної пам'яті, в такому випадку вам потрібно підвищити параметр SHMMNI у вашому ядрі, або перевищено граничний розмір спільної пам'яті.\n" "Детальна інформація про налаштування спільної пам'яті міститься в інструкції PostgreSQL." -#: port/pg_shmem.c:578 port/sysv_shmem.c:578 +#: port/pg_shmem.c:616 port/sysv_shmem.c:616 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "не вдалося показати анонімну спільну пам'ять: %m" -#: port/pg_shmem.c:580 port/sysv_shmem.c:580 +#: port/pg_shmem.c:618 port/sysv_shmem.c:618 #, c-format msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections." msgstr "Ця помилка зазвичай означає, що запит PostgreSQL для сегменту спільної пам'яті перевищує об'єм доступної фізичної або віртуальної пам'яті або гігантских сторінок. Щоб зменшити розмір запиту (поточний: %zu байтів), зменшіть використання спільної пам'яті PostgreSQL, можливо зменшив shared_buffers або max_connections." -#: port/pg_shmem.c:648 port/sysv_shmem.c:648 +#: port/pg_shmem.c:686 port/sysv_shmem.c:686 #, c-format msgid "huge pages not supported on this platform" msgstr "величезні сторінки на цій плтаформі не підтримуються" -#: port/pg_shmem.c:709 port/sysv_shmem.c:709 utils/init/miscinit.c:1137 +#: port/pg_shmem.c:747 port/sysv_shmem.c:747 utils/init/miscinit.c:1167 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "раніше виділений блок спільної пам'яті (ключ %lu, ідентифікатор %lu) все ще використовується" -#: port/pg_shmem.c:712 port/sysv_shmem.c:712 utils/init/miscinit.c:1139 +#: port/pg_shmem.c:750 port/sysv_shmem.c:750 utils/init/miscinit.c:1169 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "Припинити будь-які старі серверні процеси, пов'язані з каталогом даних \"%s\"." @@ -16701,174 +17330,157 @@ msgstr "не вдалося розблокувати семафор: код по msgid "could not try-lock semaphore: error code %lu" msgstr "не вдалося спробувати заблокувати семафор: код помилки %lu" -#: port/win32_shmem.c:144 port/win32_shmem.c:152 port/win32_shmem.c:164 -#: port/win32_shmem.c:179 +#: port/win32_shmem.c:144 port/win32_shmem.c:159 port/win32_shmem.c:171 +#: port/win32_shmem.c:187 #, c-format -msgid "could not enable Lock Pages in Memory user right: error code %lu" -msgstr "не вдалося активізувати право користувача на блокування сторінок у пам’яті: код помилки %lu" +msgid "could not enable user right \"%s\": error code %lu" +msgstr "не вдалося активувати право користувача \"%s\": код помилки %lu" + +#. translator: This is a term from Windows and should be translated to +#. match the Windows localization. +#. +#: port/win32_shmem.c:150 port/win32_shmem.c:159 port/win32_shmem.c:171 +#: port/win32_shmem.c:182 port/win32_shmem.c:184 port/win32_shmem.c:187 +msgid "Lock pages in memory" +msgstr "Блокування сторінок у пам'яті" -#: port/win32_shmem.c:145 port/win32_shmem.c:153 port/win32_shmem.c:165 -#: port/win32_shmem.c:180 +#: port/win32_shmem.c:152 port/win32_shmem.c:160 port/win32_shmem.c:172 +#: port/win32_shmem.c:188 #, c-format msgid "Failed system call was %s." msgstr "Помилка системного виклику %s." -#: port/win32_shmem.c:175 +#: port/win32_shmem.c:182 #, c-format -msgid "could not enable Lock Pages in Memory user right" -msgstr "не вдалося активізувати право користувача на блокування сторінок в пам'яті" +msgid "could not enable user right \"%s\"" +msgstr "не вдалося активувати право користувача \"%s\"" -#: port/win32_shmem.c:176 +#: port/win32_shmem.c:183 #, c-format -msgid "Assign Lock Pages in Memory user right to the Windows user account which runs PostgreSQL." -msgstr "Призначити право користувача на блокування сторінок в пам'яті для облікового запису користувача Windows, що запускає PostgreSQL." +msgid "Assign user right \"%s\" to the Windows user account which runs PostgreSQL." +msgstr "Призначити право користувача \"%s\" до облікового запису користувача Windows, що запускає PostgreSQL." -#: port/win32_shmem.c:233 +#: port/win32_shmem.c:241 #, c-format msgid "the processor does not support large pages" msgstr "процесор не підтримує великі сторінки" -#: port/win32_shmem.c:235 port/win32_shmem.c:240 -#, c-format -msgid "disabling huge pages" -msgstr "відключення величезних сторінок" - -#: port/win32_shmem.c:302 port/win32_shmem.c:338 port/win32_shmem.c:356 +#: port/win32_shmem.c:310 port/win32_shmem.c:346 port/win32_shmem.c:364 #, c-format msgid "could not create shared memory segment: error code %lu" msgstr "не вдалося створити сегмент спільної пам'яті: код помилки %lu" -#: port/win32_shmem.c:303 +#: port/win32_shmem.c:311 #, c-format msgid "Failed system call was CreateFileMapping(size=%zu, name=%s)." msgstr "Помилка системного виклику CreateFileMapping(розмір=%zu, ім'я=%s)." -#: port/win32_shmem.c:328 +#: port/win32_shmem.c:336 #, c-format msgid "pre-existing shared memory block is still in use" msgstr "раніше створений блок спільної пам'яті все ще використовується" -#: port/win32_shmem.c:329 +#: port/win32_shmem.c:337 #, c-format msgid "Check if there are any old server processes still running, and terminate them." msgstr "Перевірити, якщо будь-які старі серверні процеси все ще працюють, та завершити їх." -#: port/win32_shmem.c:339 +#: port/win32_shmem.c:347 #, c-format msgid "Failed system call was DuplicateHandle." msgstr "Помилка в системному виклику DuplicateHandle." -#: port/win32_shmem.c:357 +#: port/win32_shmem.c:365 #, c-format msgid "Failed system call was MapViewOfFileEx." msgstr "Помилка в системному виклику MapViewOfFileEx." -#: postmaster/autovacuum.c:406 +#: postmaster/autovacuum.c:410 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "не вдалося породити процес запуску автоочистки: %m" -#: postmaster/autovacuum.c:442 -#, c-format -msgid "autovacuum launcher started" -msgstr "процес запуску автоочистки почався" - -#: postmaster/autovacuum.c:839 -#, c-format -msgid "autovacuum launcher shutting down" -msgstr "процес запуску автоочитски завершується" - -#: postmaster/autovacuum.c:1477 +#: postmaster/autovacuum.c:1488 #, c-format msgid "could not fork autovacuum worker process: %m" msgstr "не вдалося породити робочий процес автоочитски: %m" -#: postmaster/autovacuum.c:1686 -#, c-format -msgid "autovacuum: processing database \"%s\"" -msgstr "автоочистка: обробка бази даних \"%s\"" - -#: postmaster/autovacuum.c:2256 +#: postmaster/autovacuum.c:2279 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "автоочистка: видалення застарілої тимчасової таблиці \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2485 +#: postmaster/autovacuum.c:2508 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "автоматична очистка таблиці \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2488 +#: postmaster/autovacuum.c:2511 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "автоматичний аналіз таблиці \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2681 +#: postmaster/autovacuum.c:2704 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "обробка робочого введення для відношення \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3285 +#: postmaster/autovacuum.c:3390 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "автоочистку не запущено через неправильну конфігурацію" -#: postmaster/autovacuum.c:3286 +#: postmaster/autovacuum.c:3391 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Активувати параметр \"track_counts\"." -#: postmaster/bgworker.c:394 postmaster/bgworker.c:841 +#: postmaster/bgworker.c:256 #, c-format -msgid "registering background worker \"%s\"" -msgstr "реєстрація фонового виконавця \"%s\"" +msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" +msgstr "несумісний стан фонового процесу (max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:426 -#, c-format -msgid "unregistering background worker \"%s\"" -msgstr "розреєстрація фонового виконавця \"%s\"" - -#: postmaster/bgworker.c:591 +#: postmaster/bgworker.c:661 #, c-format msgid "background worker \"%s\": must attach to shared memory in order to request a database connection" msgstr "фоновий виконавець \"%s\": повинен підключатися до спільної пам'яті на замовлення для запиту підключення до бази даних" -#: postmaster/bgworker.c:600 +#: postmaster/bgworker.c:670 #, c-format msgid "background worker \"%s\": cannot request database access if starting at postmaster start" msgstr "фоновий виконавець \"%s\": не може запитувати доступ до бази даних, якщо його запущено при старті адміністратора поштового сервісу" -#: postmaster/bgworker.c:614 +#: postmaster/bgworker.c:684 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "фоновий виконавець \"%s\": неприпустимий інтервал перезавантаження" -#: postmaster/bgworker.c:629 +#: postmaster/bgworker.c:699 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "фоновий виконавець\"%s\": паралельні виконавці не можуть бути налаштовані для перезавантаження" -#: postmaster/bgworker.c:653 +#: postmaster/bgworker.c:723 tcop/postgres.c:3188 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "завершення фонового процесу \"%s\" по команді адміністратора" -#: postmaster/bgworker.c:849 +#: postmaster/bgworker.c:904 #, c-format msgid "background worker \"%s\": must be registered in shared_preload_libraries" msgstr "фоновий процес \"%s\": повинен бути зареєстрований в shared_preload_libraries" -#: postmaster/bgworker.c:861 +#: postmaster/bgworker.c:916 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "фоновий процес \"%s\": лише динамічні фонові процеси можуть запитувати сповіщення" -#: postmaster/bgworker.c:876 +#: postmaster/bgworker.c:931 #, c-format msgid "too many background workers" msgstr "занадто багато фонових процесів" -#: postmaster/bgworker.c:877 +#: postmaster/bgworker.c:932 #, c-format msgid "Up to %d background worker can be registered with the current settings." msgid_plural "Up to %d background workers can be registered with the current settings." @@ -16877,12 +17489,12 @@ msgstr[1] "Максимальне можливе число фонових пр msgstr[2] "Максимальне можливе число фонових процесів при поточних параметрах: %d." msgstr[3] "Максимальне можливе число фонових процесів при поточних параметрах: %d." -#: postmaster/bgworker.c:881 +#: postmaster/bgworker.c:936 #, c-format msgid "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "Можливо, слід збільшити параметр конфігурації \"max_worker_processes\"." -#: postmaster/checkpointer.c:418 +#: postmaster/checkpointer.c:428 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" @@ -16891,335 +17503,346 @@ msgstr[1] "контрольні точки відбуваються занадт msgstr[2] "контрольні точки відбуваються занадто часто (через %d сек.)" msgstr[3] "контрольні точки відбуваються занадто часто (через %d сек.)" -#: postmaster/checkpointer.c:422 +#: postmaster/checkpointer.c:432 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "Можливо, слід збільшити параметр конфігурації \"max_wal_size\"." -#: postmaster/checkpointer.c:1032 +#: postmaster/checkpointer.c:1056 #, c-format msgid "checkpoint request failed" msgstr "збій при запиті контрольної точки" -#: postmaster/checkpointer.c:1033 +#: postmaster/checkpointer.c:1057 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Для деталей, зверніться до останніх повідомлень в протоколі серверу." -#: postmaster/checkpointer.c:1217 -#, c-format -msgid "compacted fsync request queue from %d entries to %d entries" -msgstr "чергу запитів fsync стиснуто з %d елементів, до %d елементів" - -#: postmaster/pgarch.c:155 -#, c-format -msgid "could not fork archiver: %m" -msgstr "не вдалося породити процес архівації: %m" - -#: postmaster/pgarch.c:425 +#: postmaster/pgarch.c:365 #, c-format msgid "archive_mode enabled, yet archive_command is not set" msgstr "archive_mode активний, але archive_command не встановлена" -#: postmaster/pgarch.c:447 +#: postmaster/pgarch.c:387 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "видалено залишковий файл статусу архіву \"%s\"" -#: postmaster/pgarch.c:457 +#: postmaster/pgarch.c:397 #, c-format msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" msgstr "видалення залишкового файлу статусу архіву \"%s\" не вдалося занадто багато разів, пізніже спробуємо знову" -#: postmaster/pgarch.c:493 +#: postmaster/pgarch.c:433 #, c-format msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" msgstr "архівація файлу випереджувальног журналювання \"%s\" не виконана багато разів, наступна спроба буде пізніже" -#: postmaster/pgarch.c:594 +#: postmaster/pgarch.c:534 #, c-format msgid "archive command failed with exit code %d" msgstr "команда архівації завершилась помилкой з кодом %d" -#: postmaster/pgarch.c:596 postmaster/pgarch.c:606 postmaster/pgarch.c:612 -#: postmaster/pgarch.c:621 +#: postmaster/pgarch.c:536 postmaster/pgarch.c:546 postmaster/pgarch.c:552 +#: postmaster/pgarch.c:561 #, c-format msgid "The failed archive command was: %s" msgstr "Команда архівації з помилкою: %s" -#: postmaster/pgarch.c:603 +#: postmaster/pgarch.c:543 #, c-format msgid "archive command was terminated by exception 0x%X" msgstr "команда архівації була перервана винятком 0x%X" -#: postmaster/pgarch.c:605 postmaster/postmaster.c:3742 +#: postmaster/pgarch.c:545 postmaster/postmaster.c:3724 #, c-format msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." msgstr "Опис цього Шістнадцяткового значення дивіться у включаємому C-файлі \"ntstatus.h\"." -#: postmaster/pgarch.c:610 +#: postmaster/pgarch.c:550 #, c-format msgid "archive command was terminated by signal %d: %s" msgstr "команда архівації була перервана сигналом %d: %s" -#: postmaster/pgarch.c:619 +#: postmaster/pgarch.c:559 #, c-format msgid "archive command exited with unrecognized status %d" msgstr "команда архівації завершена з нерозпізнаним статусом %d" -#: postmaster/pgstat.c:419 +#: postmaster/pgstat.c:415 #, c-format msgid "could not resolve \"localhost\": %s" msgstr "не вдалося закрити \"localhost\": %s" -#: postmaster/pgstat.c:442 +#: postmaster/pgstat.c:438 #, c-format msgid "trying another address for the statistics collector" msgstr "спроба іншої адреси для збирача статистики" -#: postmaster/pgstat.c:451 +#: postmaster/pgstat.c:447 #, c-format msgid "could not create socket for statistics collector: %m" msgstr "не вдалося створити сокет для збирача статистики: %m" -#: postmaster/pgstat.c:463 +#: postmaster/pgstat.c:459 #, c-format msgid "could not bind socket for statistics collector: %m" msgstr "не вдалося прив'язати сокет для збирача статистики: %m" -#: postmaster/pgstat.c:474 +#: postmaster/pgstat.c:470 #, c-format msgid "could not get address of socket for statistics collector: %m" msgstr "не вдалося отримати адресу сокета для збирача статистики: %m" -#: postmaster/pgstat.c:490 +#: postmaster/pgstat.c:486 #, c-format msgid "could not connect socket for statistics collector: %m" msgstr "не вдалося підключити сокет для збирача статистики: %m" -#: postmaster/pgstat.c:511 +#: postmaster/pgstat.c:507 #, c-format msgid "could not send test message on socket for statistics collector: %m" msgstr "не вдалося надіслати тестове повідомлення в сокет для збирача статистики: %m" -#: postmaster/pgstat.c:537 +#: postmaster/pgstat.c:533 #, c-format msgid "select() failed in statistics collector: %m" msgstr "помилка select() в збирачі статистики: %m" -#: postmaster/pgstat.c:552 +#: postmaster/pgstat.c:548 #, c-format msgid "test message did not get through on socket for statistics collector" msgstr "тестове повідомлення не пройшло крізь сокет для збирача статистики" -#: postmaster/pgstat.c:567 +#: postmaster/pgstat.c:563 #, c-format msgid "could not receive test message on socket for statistics collector: %m" msgstr "не вдалося отримати тестове повідомлення крізь сокет для збирача статистики: %m" -#: postmaster/pgstat.c:577 +#: postmaster/pgstat.c:573 #, c-format msgid "incorrect test message transmission on socket for statistics collector" msgstr "неправильне передавання тестового повідомлення крізь сокет для збирача статистики" -#: postmaster/pgstat.c:600 +#: postmaster/pgstat.c:596 #, c-format msgid "could not set statistics collector socket to nonblocking mode: %m" msgstr "не вдалося встановити сокет збирача статистики в неблокуючий режим: %m" -#: postmaster/pgstat.c:642 +#: postmaster/pgstat.c:640 #, c-format msgid "disabling statistics collector for lack of working socket" msgstr "вимкнення збирача статистики відбувається через нестачі робочого сокету" -#: postmaster/pgstat.c:789 +#: postmaster/pgstat.c:787 #, c-format msgid "could not fork statistics collector: %m" msgstr "не вдалося породити процес збирача статистики: %m" -#: postmaster/pgstat.c:1376 +#: postmaster/pgstat.c:1457 #, c-format msgid "unrecognized reset target: \"%s\"" msgstr "нерозпізнане відновлення мети: \"%s\"" -#: postmaster/pgstat.c:1377 +#: postmaster/pgstat.c:1458 #, c-format -msgid "Target must be \"archiver\" or \"bgwriter\"." -msgstr "Мета повинна бути \"archiver\" або \"bgwriter\"." +msgid "Target must be \"archiver\", \"bgwriter\", or \"wal\"." +msgstr "Ціль повинна бути \"archiver\", \"bgwriter\" або \"wal\"." -#: postmaster/pgstat.c:4561 +#: postmaster/pgstat.c:3240 #, c-format msgid "could not read statistics message: %m" msgstr "не вдалося прочитати повідомлення статистики: %m" -#: postmaster/pgstat.c:4883 postmaster/pgstat.c:5046 +#: postmaster/pgstat.c:3581 postmaster/pgstat.c:3766 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "не вдалося відкрити тимчасовий файл статистики \"%s\": %m" -#: postmaster/pgstat.c:4956 postmaster/pgstat.c:5091 +#: postmaster/pgstat.c:3676 postmaster/pgstat.c:3811 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "не вдалося записати в тимчасовий файл статистики \"%s\": %m" -#: postmaster/pgstat.c:4965 postmaster/pgstat.c:5100 +#: postmaster/pgstat.c:3685 postmaster/pgstat.c:3820 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "не вдалося закрити тимчасовий файл статистики \"%s\": %m" -#: postmaster/pgstat.c:4973 postmaster/pgstat.c:5108 +#: postmaster/pgstat.c:3693 postmaster/pgstat.c:3828 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "не вдалося перейменувати тимчасовий файл статистики з \"%s\" в \"%s\": %m" -#: postmaster/pgstat.c:5205 postmaster/pgstat.c:5422 postmaster/pgstat.c:5576 +#: postmaster/pgstat.c:3926 postmaster/pgstat.c:4192 postmaster/pgstat.c:4349 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "не вдалося відкрити файл статистики \"%s\": %m" -#: postmaster/pgstat.c:5217 postmaster/pgstat.c:5227 postmaster/pgstat.c:5248 -#: postmaster/pgstat.c:5259 postmaster/pgstat.c:5281 postmaster/pgstat.c:5296 -#: postmaster/pgstat.c:5359 postmaster/pgstat.c:5434 postmaster/pgstat.c:5454 -#: postmaster/pgstat.c:5472 postmaster/pgstat.c:5488 postmaster/pgstat.c:5506 -#: postmaster/pgstat.c:5522 postmaster/pgstat.c:5588 postmaster/pgstat.c:5600 -#: postmaster/pgstat.c:5612 postmaster/pgstat.c:5623 postmaster/pgstat.c:5648 -#: postmaster/pgstat.c:5670 +#: postmaster/pgstat.c:3938 postmaster/pgstat.c:3948 postmaster/pgstat.c:3969 +#: postmaster/pgstat.c:3980 postmaster/pgstat.c:3991 postmaster/pgstat.c:4013 +#: postmaster/pgstat.c:4028 postmaster/pgstat.c:4098 postmaster/pgstat.c:4129 +#: postmaster/pgstat.c:4204 postmaster/pgstat.c:4224 postmaster/pgstat.c:4242 +#: postmaster/pgstat.c:4258 postmaster/pgstat.c:4276 postmaster/pgstat.c:4292 +#: postmaster/pgstat.c:4361 postmaster/pgstat.c:4373 postmaster/pgstat.c:4385 +#: postmaster/pgstat.c:4396 postmaster/pgstat.c:4407 postmaster/pgstat.c:4432 +#: postmaster/pgstat.c:4459 postmaster/pgstat.c:4472 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "пошкоджений файл статистики \"%s\"" -#: postmaster/pgstat.c:5799 +#: postmaster/pgstat.c:4581 +#, c-format +msgid "statistics collector's time %s is later than backend local time %s" +msgstr "час збирача статистики %s пізніший, ніж місцевий час внутрішнього сервера %s" + +#: postmaster/pgstat.c:4604 #, c-format msgid "using stale statistics instead of current ones because stats collector is not responding" msgstr "використовується застаріла статистика замість поточної, тому, що збирач статистики не відповідає" -#: postmaster/pgstat.c:6129 +#: postmaster/pgstat.c:4731 +#, c-format +msgid "stats_timestamp %s is later than collector's time %s for database %u" +msgstr "stats_timestamp %s пізніший, ніж час збирача %s для бази даних %u" + +#: postmaster/pgstat.c:4940 #, c-format msgid "database hash table corrupted during cleanup --- abort" msgstr "таблиця гешування бази даних пошкоджена під час очищення --- переривання" -#: postmaster/postmaster.c:733 +#: postmaster/postmaster.c:745 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: неприпустимий аргумент для параметру -f: \"%s\"\n" -#: postmaster/postmaster.c:819 +#: postmaster/postmaster.c:824 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: неприпустимий аргумент для параметру -t: \"%s\"\n" -#: postmaster/postmaster.c:870 +#: postmaster/postmaster.c:875 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: неприпустимий аргумент: \"%s\"\n" -#: postmaster/postmaster.c:912 +#: postmaster/postmaster.c:917 #, c-format msgid "%s: superuser_reserved_connections (%d) must be less than max_connections (%d)\n" msgstr "%s: superuser_reserved_connections (%d) має бути меншим ніж max_connections (%d)\n" -#: postmaster/postmaster.c:919 +#: postmaster/postmaster.c:924 #, c-format msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" msgstr "WAL архіватор не може бути активованим, коли wal_level \"мінімальний\"" -#: postmaster/postmaster.c:922 +#: postmaster/postmaster.c:927 #, c-format msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" msgstr "Потокове передавання WAL (max_wal_senders > 0) вимагає wal_level \"replica\" або \"logical\"" -#: postmaster/postmaster.c:930 +#: postmaster/postmaster.c:935 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: неприпустимі таблиці маркерів часу, будь-ласка виправіть\n" -#: postmaster/postmaster.c:1047 +#: postmaster/postmaster.c:1052 #, c-format msgid "could not create I/O completion port for child queue" msgstr "не вдалося створити завершений порт вводу-виводу для черги дітей" -#: postmaster/postmaster.c:1113 +#: postmaster/postmaster.c:1117 #, c-format msgid "ending log output to stderr" msgstr "завершення запису виводу Stderr" -#: postmaster/postmaster.c:1114 +#: postmaster/postmaster.c:1118 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "В майбутньому запис виведення буде записуватися в призначення \"%s\"." -#: postmaster/postmaster.c:1125 +#: postmaster/postmaster.c:1129 #, c-format msgid "starting %s" msgstr "початок %s" -#: postmaster/postmaster.c:1154 postmaster/postmaster.c:1252 -#: utils/init/miscinit.c:1597 +#: postmaster/postmaster.c:1158 postmaster/postmaster.c:1257 +#: utils/init/miscinit.c:1627 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "неприпустимий синтаксис списку в параметрі \"%s\"" -#: postmaster/postmaster.c:1185 +#: postmaster/postmaster.c:1189 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "не вдалося створити сокет прослуховування для \"%s\"" -#: postmaster/postmaster.c:1191 +#: postmaster/postmaster.c:1195 #, c-format msgid "could not create any TCP/IP sockets" msgstr "не вдалося створити TCP/IP сокети" -#: postmaster/postmaster.c:1274 +#: postmaster/postmaster.c:1227 +#, c-format +msgid "DNSServiceRegister() failed: error code %ld" +msgstr "Помилка DNSServiceRegister(): код помилки %ld" + +#: postmaster/postmaster.c:1279 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "не вдалося створити Unix-domain сокет в каталозі \"%s\"" -#: postmaster/postmaster.c:1280 +#: postmaster/postmaster.c:1285 #, c-format msgid "could not create any Unix-domain sockets" msgstr "не вдалося створити Unix-domain сокети" -#: postmaster/postmaster.c:1292 +#: postmaster/postmaster.c:1297 #, c-format msgid "no socket created for listening" msgstr "не створено жодного сокету для прослуховування" -#: postmaster/postmaster.c:1323 +#: postmaster/postmaster.c:1328 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %s\n" msgstr "%s: не вдалося змінити дозволи зовнішнього PID файлу \"%s\": %s\n" -#: postmaster/postmaster.c:1327 +#: postmaster/postmaster.c:1332 #, c-format msgid "%s: could not write external PID file \"%s\": %s\n" msgstr "%s: не вдалося записати зовнішній PID файл \"%s\": %s\n" -#: postmaster/postmaster.c:1360 utils/init/postinit.c:215 +#: postmaster/postmaster.c:1365 utils/init/postinit.c:216 #, c-format msgid "could not load pg_hba.conf" msgstr "не вдалося завантажити pg_hba.conf" -#: postmaster/postmaster.c:1386 +#: postmaster/postmaster.c:1391 #, c-format msgid "postmaster became multithreaded during startup" msgstr "адміністратор поштового сервера став багатопотоковим під час запуску" -#: postmaster/postmaster.c:1387 +#: postmaster/postmaster.c:1392 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Встановити в змінній середовища LC_ALL дійісну локаль." -#: postmaster/postmaster.c:1488 +#: postmaster/postmaster.c:1487 +#, c-format +msgid "%s: could not locate my own executable path" +msgstr "%s: не вдалося знайти свій власний шлях для виконання" + +#: postmaster/postmaster.c:1494 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: не вдалося знайти відповідний postgres файл, що виконується" -#: postmaster/postmaster.c:1511 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1517 utils/misc/tzparser.c:340 #, c-format msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." msgstr "Це може означати неповне встановлення PostgreSQL, або те, що файл \"%s\" було переміщено з його правильного розташування." -#: postmaster/postmaster.c:1538 +#: postmaster/postmaster.c:1544 #, c-format msgid "%s: could not find the database system\n" "Expected to find it in the directory \"%s\",\n" @@ -17228,396 +17851,461 @@ msgstr "%s: не вдалося знайти систему бази даних\ "Очікувалося знайти її у каталозі \"%s\",\n" "але не вдалося відкрити файл \"%s\": %s\n" -#: postmaster/postmaster.c:1715 +#: postmaster/postmaster.c:1721 #, c-format msgid "select() failed in postmaster: %m" msgstr "помилка вибирати() в адміністраторі поштового сервера: %m" -#: postmaster/postmaster.c:1870 +#: postmaster/postmaster.c:1857 +#, c-format +msgid "issuing SIGKILL to recalcitrant children" +msgstr "надсилання SIGKILL непокірливим дітям" + +#: postmaster/postmaster.c:1878 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "виконується негайне припинення роботи через неприпустимий файл блокування каталогу даних" -#: postmaster/postmaster.c:1973 postmaster/postmaster.c:2004 +#: postmaster/postmaster.c:1981 postmaster/postmaster.c:2009 #, c-format msgid "incomplete startup packet" msgstr "неповний стартовий пакет" -#: postmaster/postmaster.c:1985 +#: postmaster/postmaster.c:1993 #, c-format msgid "invalid length of startup packet" msgstr "неприпустима довжина стартового пакету" -#: postmaster/postmaster.c:2043 +#: postmaster/postmaster.c:2048 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "помилка надсилання протоколу SSL в процесі відповіді зв'язування: %m" -#: postmaster/postmaster.c:2074 +#: postmaster/postmaster.c:2080 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "помилка надсилання GSSAPI в процесі відповіді зв'язування: %m" -#: postmaster/postmaster.c:2104 +#: postmaster/postmaster.c:2110 #, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "протокол інтерфейсу, що не підтримується, %u.%u: сервер підтримує %u.0 до %u.%u" -#: postmaster/postmaster.c:2168 utils/misc/guc.c:6769 utils/misc/guc.c:6805 -#: utils/misc/guc.c:6875 utils/misc/guc.c:8198 utils/misc/guc.c:11044 -#: utils/misc/guc.c:11078 +#: postmaster/postmaster.c:2174 utils/misc/guc.c:7113 utils/misc/guc.c:7149 +#: utils/misc/guc.c:7219 utils/misc/guc.c:8551 utils/misc/guc.c:11507 +#: utils/misc/guc.c:11548 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "неприпустиме значення параметру \"%s\": \"%s\"" -#: postmaster/postmaster.c:2171 +#: postmaster/postmaster.c:2177 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Дійсні значення: \"false\", 0, \"true\", 1, \"database\"." -#: postmaster/postmaster.c:2216 +#: postmaster/postmaster.c:2222 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "неприпустима структура стартового пакету: останнім байтом очікувався термінатор" -#: postmaster/postmaster.c:2254 +#: postmaster/postmaster.c:2239 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "не вказано жодного ім'я користувача PostgreSQL у стартовому пакеті" -#: postmaster/postmaster.c:2318 +#: postmaster/postmaster.c:2303 #, c-format msgid "the database system is starting up" msgstr "система бази даних запускається" -#: postmaster/postmaster.c:2323 +#: postmaster/postmaster.c:2309 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "система бази даних ще не приймає підключення" + +#: postmaster/postmaster.c:2310 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "Узгодженого стану відновлення ще не досягнуто." + +#: postmaster/postmaster.c:2314 +#, c-format +msgid "the database system is not accepting connections" +msgstr "система бази даних не приймає підключення" + +#: postmaster/postmaster.c:2315 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "Режим Hot standby вимкнений." + +#: postmaster/postmaster.c:2320 #, c-format msgid "the database system is shutting down" msgstr "система бази даних завершує роботу" -#: postmaster/postmaster.c:2328 +#: postmaster/postmaster.c:2325 #, c-format msgid "the database system is in recovery mode" msgstr "система бази даних у режимі відновлення" -#: postmaster/postmaster.c:2333 storage/ipc/procarray.c:293 -#: storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:362 +#: postmaster/postmaster.c:2330 storage/ipc/procarray.c:475 +#: storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:361 #, c-format msgid "sorry, too many clients already" msgstr "вибачте, вже забагато клієнтів" -#: postmaster/postmaster.c:2423 +#: postmaster/postmaster.c:2420 #, c-format msgid "wrong key in cancel request for process %d" msgstr "неправильний ключ в запиті скасування процесу %d" -#: postmaster/postmaster.c:2435 +#: postmaster/postmaster.c:2432 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "PID %d в запиті на скасування не відповідає жодному процесу" -#: postmaster/postmaster.c:2706 +#: postmaster/postmaster.c:2686 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "отримано SIGHUP, поновлення файлів конфігурацій" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2732 postmaster/postmaster.c:2736 +#: postmaster/postmaster.c:2712 postmaster/postmaster.c:2716 #, c-format msgid "%s was not reloaded" msgstr "%s не було перезавантажено" -#: postmaster/postmaster.c:2746 +#: postmaster/postmaster.c:2726 #, c-format msgid "SSL configuration was not reloaded" msgstr "Конфігурація протоколу SSL не була перезавантажена" -#: postmaster/postmaster.c:2802 +#: postmaster/postmaster.c:2782 #, c-format msgid "received smart shutdown request" msgstr "отримано smart запит на завершення роботи" -#: postmaster/postmaster.c:2848 +#: postmaster/postmaster.c:2828 #, c-format msgid "received fast shutdown request" msgstr "отримано швидкий запит на завершення роботи" -#: postmaster/postmaster.c:2866 +#: postmaster/postmaster.c:2846 #, c-format msgid "aborting any active transactions" msgstr "переривання будь-яких активних транзакцій" -#: postmaster/postmaster.c:2890 +#: postmaster/postmaster.c:2870 #, c-format msgid "received immediate shutdown request" msgstr "отримано запит на негайне завершення роботи" -#: postmaster/postmaster.c:2965 +#: postmaster/postmaster.c:2947 #, c-format msgid "shutdown at recovery target" msgstr "завершення роботи при відновленні мети" -#: postmaster/postmaster.c:2983 postmaster/postmaster.c:3019 +#: postmaster/postmaster.c:2965 postmaster/postmaster.c:3001 msgid "startup process" msgstr "стартовий процес" -#: postmaster/postmaster.c:2986 +#: postmaster/postmaster.c:2968 #, c-format msgid "aborting startup due to startup process failure" msgstr "переривання запуску через помилку в стартовому процесі" -#: postmaster/postmaster.c:3061 +#: postmaster/postmaster.c:3043 #, c-format msgid "database system is ready to accept connections" msgstr "система бази даних готова до отримання підключення" -#: postmaster/postmaster.c:3082 +#: postmaster/postmaster.c:3064 msgid "background writer process" msgstr "процес фонового запису" -#: postmaster/postmaster.c:3136 +#: postmaster/postmaster.c:3118 msgid "checkpointer process" msgstr "процес контрольних точок" -#: postmaster/postmaster.c:3152 +#: postmaster/postmaster.c:3134 msgid "WAL writer process" msgstr "Процес запису WAL" -#: postmaster/postmaster.c:3167 +#: postmaster/postmaster.c:3149 msgid "WAL receiver process" msgstr "Процес отримання WAL" -#: postmaster/postmaster.c:3182 +#: postmaster/postmaster.c:3164 msgid "autovacuum launcher process" msgstr "процес запуску автоочистки" -#: postmaster/postmaster.c:3197 +#: postmaster/postmaster.c:3182 msgid "archiver process" msgstr "процес архівації" -#: postmaster/postmaster.c:3213 +#: postmaster/postmaster.c:3197 msgid "statistics collector process" msgstr "процес збору статистики" -#: postmaster/postmaster.c:3227 +#: postmaster/postmaster.c:3211 msgid "system logger process" msgstr "процес системного журналювання" -#: postmaster/postmaster.c:3291 +#: postmaster/postmaster.c:3275 #, c-format msgid "background worker \"%s\"" msgstr "фоновий виконавець \"%s\"" -#: postmaster/postmaster.c:3375 postmaster/postmaster.c:3395 -#: postmaster/postmaster.c:3402 postmaster/postmaster.c:3420 +#: postmaster/postmaster.c:3359 postmaster/postmaster.c:3379 +#: postmaster/postmaster.c:3386 postmaster/postmaster.c:3404 msgid "server process" msgstr "процес сервера" -#: postmaster/postmaster.c:3474 +#: postmaster/postmaster.c:3458 #, c-format msgid "terminating any other active server processes" msgstr "завершення будь-яких інших активних серверних процесів" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3729 +#: postmaster/postmaster.c:3711 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) завершився з кодом виходу %d" -#: postmaster/postmaster.c:3731 postmaster/postmaster.c:3743 -#: postmaster/postmaster.c:3753 postmaster/postmaster.c:3764 +#: postmaster/postmaster.c:3713 postmaster/postmaster.c:3725 +#: postmaster/postmaster.c:3735 postmaster/postmaster.c:3746 #, c-format msgid "Failed process was running: %s" msgstr "Процес що завершився виконував дію: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3740 +#: postmaster/postmaster.c:3722 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) був перерваний винятком 0x%X" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3750 +#: postmaster/postmaster.c:3732 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) був перерваний сигналом %d: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3762 +#: postmaster/postmaster.c:3744 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) завершився з нерозпізнаним статусом %d" -#: postmaster/postmaster.c:3970 +#: postmaster/postmaster.c:3958 #, c-format msgid "abnormal database system shutdown" msgstr "ненормальне завершення роботи системи бази даних" -#: postmaster/postmaster.c:4010 +#: postmaster/postmaster.c:3996 +#, c-format +msgid "shutting down due to startup process failure" +msgstr "завершення роботи через помилку в стартовому процесі" + +#: postmaster/postmaster.c:4002 +#, c-format +msgid "shutting down because restart_after_crash is off" +msgstr "завершення роботи, тому що restart_after_crash вимкнено" + +#: postmaster/postmaster.c:4014 #, c-format msgid "all server processes terminated; reinitializing" msgstr "усі серверні процеси перервано; повторна ініціалізація" -#: postmaster/postmaster.c:4180 postmaster/postmaster.c:5599 -#: postmaster/postmaster.c:5986 +#: postmaster/postmaster.c:4188 postmaster/postmaster.c:5547 +#: postmaster/postmaster.c:5938 #, c-format msgid "could not generate random cancel key" msgstr "не вдалося згенерувати випадковий ключ скасування" -#: postmaster/postmaster.c:4234 +#: postmaster/postmaster.c:4242 #, c-format msgid "could not fork new process for connection: %m" msgstr "не вдалося породити нові процеси для з'єднання: %m" -#: postmaster/postmaster.c:4276 +#: postmaster/postmaster.c:4284 msgid "could not fork new process for connection: " msgstr "не вдалося породити нові процеси для з'єднання: " -#: postmaster/postmaster.c:4393 +#: postmaster/postmaster.c:4390 #, c-format msgid "connection received: host=%s port=%s" msgstr "з'єднання отримано: хост=%s порт=%s" -#: postmaster/postmaster.c:4398 +#: postmaster/postmaster.c:4395 #, c-format msgid "connection received: host=%s" msgstr "з'єднання отримано: хост=%s" -#: postmaster/postmaster.c:4668 +#: postmaster/postmaster.c:4638 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "не вдалося виконати серверні процеси \"%s\":%m" -#: postmaster/postmaster.c:4827 +#: postmaster/postmaster.c:4696 +#, c-format +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "не вдалося створити відображення файлу параметру внутрішнього сервера: код помилки %lu" + +#: postmaster/postmaster.c:4705 +#, c-format +msgid "could not map backend parameter memory: error code %lu" +msgstr "не вдалося відобразити пам'ять параметру внутрішнього сервера: код помилки %lu" + +#: postmaster/postmaster.c:4732 +#, c-format +msgid "subprocess command line too long" +msgstr "командний рядок підпроцесу занадто довгий" + +#: postmaster/postmaster.c:4750 +#, c-format +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "помилка виклику CreateProcess(): %m (код помилки %lu)" + +#: postmaster/postmaster.c:4777 +#, c-format +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "не вдалося вимкнути відображення файлу параметру внутрішнього сервера: код помилки %lu" + +#: postmaster/postmaster.c:4781 +#, c-format +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "не вдалося закрити покажчик файлу параметру внутрішнього сервера: код помилки %lu" + +#: postmaster/postmaster.c:4803 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "кількість повторних спроб резервування спільної пам'яті досягло межі" -#: postmaster/postmaster.c:4828 +#: postmaster/postmaster.c:4804 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "Це може бути викликано антивірусним програмним забезпеченням або ASLR." -#: postmaster/postmaster.c:5034 +#: postmaster/postmaster.c:4994 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "Не вдалося завантажити конфігурацію SSL в дочірній процес" -#: postmaster/postmaster.c:5166 +#: postmaster/postmaster.c:5120 #, c-format msgid "Please report this to <%s>." msgstr "Будь-ласка повідомте про це <%s>." -#: postmaster/postmaster.c:5259 +#: postmaster/postmaster.c:5207 #, c-format msgid "database system is ready to accept read only connections" msgstr "система бази даних готова до отримання підключення \"лише читати\"" -#: postmaster/postmaster.c:5527 +#: postmaster/postmaster.c:5471 #, c-format msgid "could not fork startup process: %m" msgstr "не вдалося породити стартовий процес: %m" -#: postmaster/postmaster.c:5531 +#: postmaster/postmaster.c:5475 +#, c-format +msgid "could not fork archiver process: %m" +msgstr "не вдалося породити процес архіватора: %m" + +#: postmaster/postmaster.c:5479 #, c-format msgid "could not fork background writer process: %m" msgstr "не вдалося породити фоновий процес запису: %m" -#: postmaster/postmaster.c:5535 +#: postmaster/postmaster.c:5483 #, c-format msgid "could not fork checkpointer process: %m" msgstr "не вдалося породити процес контрольних точок: %m" -#: postmaster/postmaster.c:5539 +#: postmaster/postmaster.c:5487 #, c-format msgid "could not fork WAL writer process: %m" msgstr "не вдалося породити процес запису WAL: %m" -#: postmaster/postmaster.c:5543 +#: postmaster/postmaster.c:5491 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "не вдалося породити процес отримання WAL: %m" -#: postmaster/postmaster.c:5547 +#: postmaster/postmaster.c:5495 #, c-format msgid "could not fork process: %m" msgstr "не вдалося породити процес: %m" -#: postmaster/postmaster.c:5744 postmaster/postmaster.c:5767 +#: postmaster/postmaster.c:5696 postmaster/postmaster.c:5719 #, c-format msgid "database connection requirement not indicated during registration" msgstr "під час реєстрації не вказувалося, що вимагається підключення до бази даних" -#: postmaster/postmaster.c:5751 postmaster/postmaster.c:5774 +#: postmaster/postmaster.c:5703 postmaster/postmaster.c:5726 #, c-format msgid "invalid processing mode in background worker" msgstr "неприпустимий режим обробки у фоновому записі" -#: postmaster/postmaster.c:5847 -#, c-format -msgid "starting background worker process \"%s\"" -msgstr "початок процесу фонового запису \"%s\"" - -#: postmaster/postmaster.c:5859 +#: postmaster/postmaster.c:5811 #, c-format msgid "could not fork worker process: %m" msgstr "не вдалося породити процес запису: %m" -#: postmaster/postmaster.c:5972 +#: postmaster/postmaster.c:5924 #, c-format msgid "no slot available for new worker process" msgstr "немає доступного слоту для нового робочого процесу" -#: postmaster/postmaster.c:6307 +#: postmaster/postmaster.c:6258 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "не вдалося продублювати сокет %d для використання: код помилки %d" -#: postmaster/postmaster.c:6339 +#: postmaster/postmaster.c:6290 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "не вдалося створити успадкований сокет: код помилки %d\n" -#: postmaster/postmaster.c:6368 +#: postmaster/postmaster.c:6319 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "не вдалося відкрити внутрішні змінні файли \"%s\": %s\n" -#: postmaster/postmaster.c:6375 +#: postmaster/postmaster.c:6326 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "не вдалося прочитати внутрішні змінні файли \"%s\": %s\n" -#: postmaster/postmaster.c:6384 +#: postmaster/postmaster.c:6335 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "не вдалося видалити файл \"%s\": %s\n" -#: postmaster/postmaster.c:6401 +#: postmaster/postmaster.c:6352 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "не вдалося відобразити файл серверних змінних: код помилки %lu\n" -#: postmaster/postmaster.c:6410 +#: postmaster/postmaster.c:6361 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "не вдалося вимкнути відображення файлу серверних змінних: код помилки %lu\n" -#: postmaster/postmaster.c:6417 +#: postmaster/postmaster.c:6368 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "не вдалося закрити покажчик файлу серверних змінних: код помилки %lu\n" -#: postmaster/postmaster.c:6595 +#: postmaster/postmaster.c:6545 #, c-format msgid "could not read exit code for process\n" msgstr "не вдалося прочитати код завершення процесу\n" -#: postmaster/postmaster.c:6600 +#: postmaster/postmaster.c:6550 #, c-format msgid "could not post child completion status\n" msgstr "не вдалося надіслати статус завершення нащадка\n" @@ -17627,11 +18315,6 @@ msgstr "не вдалося надіслати статус завершення msgid "could not read from logger pipe: %m" msgstr "не вдалося прочитати з каналу журналювання: %m" -#: postmaster/syslogger.c:522 -#, c-format -msgid "logger shutting down" -msgstr "завершення журналювання" - #: postmaster/syslogger.c:571 postmaster/syslogger.c:585 #, c-format msgid "could not create pipe for syslog: %m" @@ -17670,7 +18353,7 @@ msgstr "не вдалося записати до файлу протокола: #: postmaster/syslogger.c:1225 #, c-format msgid "could not open log file \"%s\": %m" -msgstr "не вдалося відкрити файл протоколу \"%s\": %m" +msgstr "не вдалося відкрити файл журналу \"%s\": %m" #: postmaster/syslogger.c:1287 postmaster/syslogger.c:1337 #, c-format @@ -17687,58 +18370,53 @@ msgstr "не вдалося визначити які параметри сор msgid "nondeterministic collations are not supported for regular expressions" msgstr "недетерміновані правила сортування не підтримуються для регулярних виразів" -#: replication/backup_manifest.c:231 +#: replication/backup_manifest.c:255 #, c-format msgid "expected end timeline %u but found timeline %u" msgstr "очікувався кінець часової шкали %u але знайдено часову шкалу %u" -#: replication/backup_manifest.c:248 +#: replication/backup_manifest.c:272 #, c-format msgid "expected start timeline %u but found timeline %u" msgstr "очікувався початок часової шкали %u але знайдено часову шкалу %u" -#: replication/backup_manifest.c:275 +#: replication/backup_manifest.c:299 #, c-format msgid "start timeline %u not found in history of timeline %u" msgstr "початок часової шкали %u не знайдено в історії часової шкали %u" -#: replication/backup_manifest.c:322 +#: replication/backup_manifest.c:352 #, c-format msgid "could not rewind temporary file" msgstr "не вдалося перемотати назад тимчасовий файл" -#: replication/backup_manifest.c:349 +#: replication/backup_manifest.c:379 #, c-format msgid "could not read from temporary file: %m" msgstr "не вдалося прочитати з тимчасового файлу: %m" -#: replication/basebackup.c:108 -#, c-format -msgid "could not read from file \"%s\"" -msgstr "не вдалося прочитати з файлу \"%s\"" - -#: replication/basebackup.c:551 +#: replication/basebackup.c:546 #, c-format msgid "could not find any WAL files" msgstr "не вдалося знайти ні одного файла WAL" -#: replication/basebackup.c:566 replication/basebackup.c:582 -#: replication/basebackup.c:591 +#: replication/basebackup.c:561 replication/basebackup.c:577 +#: replication/basebackup.c:586 #, c-format msgid "could not find WAL file \"%s\"" msgstr "не вдалося знайти файл WAL \"%s\"" -#: replication/basebackup.c:634 replication/basebackup.c:665 +#: replication/basebackup.c:629 replication/basebackup.c:659 #, c-format msgid "unexpected WAL file size \"%s\"" msgstr "неочікуаний розмір файлу WAL \"%s\"" -#: replication/basebackup.c:648 replication/basebackup.c:1752 +#: replication/basebackup.c:644 replication/basebackup.c:1771 #, c-format msgid "base backup could not send data, aborting backup" msgstr "в процесі базового резервного копіювання не вдалося передати дані, копіювання переривається" -#: replication/basebackup.c:724 +#: replication/basebackup.c:722 #, c-format msgid "%lld total checksum verification failure" msgid_plural "%lld total checksum verification failures" @@ -17747,76 +18425,66 @@ msgstr[1] "всього помилок перевірки контрольних msgstr[2] "всього помилок перевірки контрольних сум: %lld" msgstr[3] "всього помилок перевірки контрольних сум: %lld" -#: replication/basebackup.c:731 +#: replication/basebackup.c:729 #, c-format msgid "checksum verification failure during base backup" msgstr "під час базового резервного копіювання виявлено неполадки контрольних сум" -#: replication/basebackup.c:784 replication/basebackup.c:793 -#: replication/basebackup.c:802 replication/basebackup.c:811 -#: replication/basebackup.c:820 replication/basebackup.c:831 -#: replication/basebackup.c:848 replication/basebackup.c:857 -#: replication/basebackup.c:869 replication/basebackup.c:893 +#: replication/basebackup.c:789 replication/basebackup.c:798 +#: replication/basebackup.c:807 replication/basebackup.c:816 +#: replication/basebackup.c:825 replication/basebackup.c:836 +#: replication/basebackup.c:853 replication/basebackup.c:862 +#: replication/basebackup.c:874 replication/basebackup.c:898 #, c-format msgid "duplicate option \"%s\"" msgstr "повторюваний параметр \"%s\"" -#: replication/basebackup.c:837 +#: replication/basebackup.c:842 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d за припустимим діапазномо для параметру \"%s\" (%d .. %d)" -#: replication/basebackup.c:882 +#: replication/basebackup.c:887 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "нерозпізнаний параметр маніфесту: \"%s\"" -#: replication/basebackup.c:898 +#: replication/basebackup.c:903 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "нерозпізнаний алгоритм контрольної суми: \"%s\"" -#: replication/basebackup.c:913 +#: replication/basebackup.c:918 #, c-format msgid "manifest checksums require a backup manifest" msgstr "контрольні суми маніфесту потребують резервного копіювання маніфесту" -#: replication/basebackup.c:1504 +#: replication/basebackup.c:1519 #, c-format msgid "skipping special file \"%s\"" msgstr "спеціальний файл \"%s\" пропускається" -#: replication/basebackup.c:1623 +#: replication/basebackup.c:1640 #, c-format msgid "invalid segment number %d in file \"%s\"" msgstr "неприпустимий номер сегменту %d в файлі \"%s\"" -#: replication/basebackup.c:1642 -#, c-format -msgid "could not verify checksum in file \"%s\", block %d: read buffer size %d and page size %d differ" -msgstr "не вдалося перевірити контрольну суму у файлі \"%s\", блок %d: зчитаний розмір буфера %d і розмір сторінки %d відрізняються" - -#: replication/basebackup.c:1686 replication/basebackup.c:1716 +#: replication/basebackup.c:1678 #, c-format -msgid "could not fseek in file \"%s\": %m" -msgstr "не вдалося переміститись в файлі \"%s\": %m" +msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" +msgstr "не вдалося перевірити контрольну суму у файлі \"%s\", блок %u: розмір прочитаного буфера %d і розмір прочитаної сторінки %d відрізняються" -#: replication/basebackup.c:1708 +#: replication/basebackup.c:1751 #, c-format -msgid "could not reread block %d of file \"%s\": %m" -msgstr "не вдалося перечитати блок %d файлу \"%s\": %m" +msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" +msgstr "помилка перевірки контрольної суми у файлі \"%s\", блок %u: обчислено %X, але очікувалось %X" -#: replication/basebackup.c:1732 -#, c-format -msgid "checksum verification failed in file \"%s\", block %d: calculated %X but expected %X" -msgstr "помилка перевірки контрольної суми в файлі \"%s\", блоку %d: обчислено %X, але очікувалось %X" - -#: replication/basebackup.c:1739 +#: replication/basebackup.c:1758 #, c-format msgid "further checksum verification failures in file \"%s\" will not be reported" msgstr "про подальші помилки під час перевірки контрольної суми в файлі \"%s\" повідомлятись не буде" -#: replication/basebackup.c:1807 +#: replication/basebackup.c:1816 #, c-format msgid "file \"%s\" has a total of %d checksum verification failure" msgid_plural "file \"%s\" has a total of %d checksum verification failures" @@ -17825,12 +18493,12 @@ msgstr[1] "файл \"%s\" має загальну кількість помил msgstr[2] "файл \"%s\" має загальну кількість помилок перевірки контрольної суми: %d" msgstr[3] "файл \"%s\" має загальну кількість помилок перевірки контрольної суми: %d" -#: replication/basebackup.c:1843 +#: replication/basebackup.c:1852 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "ім'я файлу занадто довге для tar формату: \"%s\"" -#: replication/basebackup.c:1848 +#: replication/basebackup.c:1857 #, c-format msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" msgstr "мета символьного посилання занадто довга для формату tar: ім'я файлу \"%s\", мета \"%s\"" @@ -17840,206 +18508,218 @@ msgstr "мета символьного посилання занадто дов msgid "could not clear search path: %s" msgstr "не вдалося очистити шлях пошуку: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:251 +#: replication/libpqwalreceiver/libpqwalreceiver.c:256 #, c-format msgid "invalid connection string syntax: %s" msgstr "неприпустимий синтаксис рядка підключення: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:275 +#: replication/libpqwalreceiver/libpqwalreceiver.c:282 #, c-format msgid "could not parse connection string: %s" msgstr "не вдалося аналізувати рядок підключення: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:347 +#: replication/libpqwalreceiver/libpqwalreceiver.c:355 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "не вдалося отримати ідентифікатор системи бази даних та ідентифікатор часової шкали з основного серверу: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:358 -#: replication/libpqwalreceiver/libpqwalreceiver.c:576 +#: replication/libpqwalreceiver/libpqwalreceiver.c:367 +#: replication/libpqwalreceiver/libpqwalreceiver.c:601 #, c-format msgid "invalid response from primary server" msgstr "неприпустима відповідь з основного серверу" -#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#: replication/libpqwalreceiver/libpqwalreceiver.c:368 #, c-format msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." msgstr "Не вдалося ідентифікувати систему: отримано %d рядків і %d полів, очікувалось %d рядків і %d або більше полів." -#: replication/libpqwalreceiver/libpqwalreceiver.c:432 -#: replication/libpqwalreceiver/libpqwalreceiver.c:438 -#: replication/libpqwalreceiver/libpqwalreceiver.c:463 +#: replication/libpqwalreceiver/libpqwalreceiver.c:444 +#: replication/libpqwalreceiver/libpqwalreceiver.c:451 +#: replication/libpqwalreceiver/libpqwalreceiver.c:481 #, c-format msgid "could not start WAL streaming: %s" msgstr "не вдалося почати потокове передавання WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:486 +#: replication/libpqwalreceiver/libpqwalreceiver.c:505 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "не вдалося передати основному серверу повідомлення про кінець передвання: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:508 +#: replication/libpqwalreceiver/libpqwalreceiver.c:528 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "неочікуваний набір результатів після кінця передачі" -#: replication/libpqwalreceiver/libpqwalreceiver.c:522 +#: replication/libpqwalreceiver/libpqwalreceiver.c:543 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "помилка при завершенні потокового передавання \"копіювати\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:531 +#: replication/libpqwalreceiver/libpqwalreceiver.c:553 #, c-format msgid "error reading result of streaming command: %s" msgstr "помилка при читанні результату команди потокового передавання: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:539 -#: replication/libpqwalreceiver/libpqwalreceiver.c:773 +#: replication/libpqwalreceiver/libpqwalreceiver.c:562 +#: replication/libpqwalreceiver/libpqwalreceiver.c:800 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "неочікуваний результат CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:565 +#: replication/libpqwalreceiver/libpqwalreceiver.c:589 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "не вдалося отримати файл історії часової шкали з основного сервера: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:577 +#: replication/libpqwalreceiver/libpqwalreceiver.c:602 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "Очікувалося 1 кортеж з 2 поле, отримано %d кортежів з %d полями." -#: replication/libpqwalreceiver/libpqwalreceiver.c:737 -#: replication/libpqwalreceiver/libpqwalreceiver.c:788 -#: replication/libpqwalreceiver/libpqwalreceiver.c:794 +#: replication/libpqwalreceiver/libpqwalreceiver.c:763 +#: replication/libpqwalreceiver/libpqwalreceiver.c:816 +#: replication/libpqwalreceiver/libpqwalreceiver.c:823 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "не вдалося отримати дані з WAL потоку: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:813 +#: replication/libpqwalreceiver/libpqwalreceiver.c:843 #, c-format msgid "could not send data to WAL stream: %s" msgstr "не вдалося передати дані потоку WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:866 +#: replication/libpqwalreceiver/libpqwalreceiver.c:897 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "не вдалося створити слот реплікації \"%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:911 +#: replication/libpqwalreceiver/libpqwalreceiver.c:943 #, c-format msgid "invalid query response" msgstr "неприпустима відповідь на запит" -#: replication/libpqwalreceiver/libpqwalreceiver.c:912 +#: replication/libpqwalreceiver/libpqwalreceiver.c:944 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Очікувалося %d полів, отримано %d полі." -#: replication/libpqwalreceiver/libpqwalreceiver.c:981 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1014 #, c-format msgid "the query interface requires a database connection" msgstr "інтерфейс запитів вимагає підключення до бази даних" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1012 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1045 msgid "empty query" msgstr "пустий запит" -#: replication/logical/launcher.c:295 -#, c-format -msgid "starting logical replication worker for subscription \"%s\"" -msgstr "початок логічного запису реплікації для передплати \"%s\"" +#: replication/libpqwalreceiver/libpqwalreceiver.c:1051 +msgid "unexpected pipeline mode" +msgstr "неочікуваний режим конвеєра" -#: replication/logical/launcher.c:302 +#: replication/logical/launcher.c:286 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "неможливо почати логічні записи реплікацій, коли max_replication_slots = 0" -#: replication/logical/launcher.c:382 +#: replication/logical/launcher.c:366 #, c-format msgid "out of logical replication worker slots" msgstr "недостатньо слотів для процесів логічної реплікації" -#: replication/logical/launcher.c:383 +#: replication/logical/launcher.c:367 #, c-format msgid "You might need to increase max_logical_replication_workers." msgstr "Можливо, вам слід збільшити max_logical_replication_workers." -#: replication/logical/launcher.c:438 +#: replication/logical/launcher.c:422 #, c-format msgid "out of background worker slots" msgstr "недостатньо слотів для фонових робочих процесів" -#: replication/logical/launcher.c:439 +#: replication/logical/launcher.c:423 #, c-format msgid "You might need to increase max_worker_processes." msgstr "Можливо, вам слід збільшити max_worker_processes." -#: replication/logical/launcher.c:638 +#: replication/logical/launcher.c:577 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "слот запису логічної реплікації %d пустий, неможливо підключитися" -#: replication/logical/launcher.c:647 +#: replication/logical/launcher.c:586 #, c-format msgid "logical replication worker slot %d is already used by another worker, cannot attach" msgstr "слот запису логічної реплікації %d вже використовується іншим виконавцем, неможливо підключитися" -#: replication/logical/launcher.c:951 -#, c-format -msgid "logical replication launcher started" -msgstr "запуск логічної реплікації почався" - -#: replication/logical/logical.c:87 +#: replication/logical/logical.c:115 #, c-format msgid "logical decoding requires wal_level >= logical" msgstr "логічне декодування вимагає wal_level >= logical" -#: replication/logical/logical.c:92 +#: replication/logical/logical.c:120 #, c-format msgid "logical decoding requires a database connection" msgstr "логічне декодування вимагає підключення до бази даних" -#: replication/logical/logical.c:110 +#: replication/logical/logical.c:138 #, c-format msgid "logical decoding cannot be used while in recovery" msgstr "логічне декодування неможливо використовувати під час відновлення" -#: replication/logical/logical.c:258 replication/logical/logical.c:399 +#: replication/logical/logical.c:347 replication/logical/logical.c:499 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "неможливо використовувати слот невідповідної реплікації для логічного кодування" -#: replication/logical/logical.c:263 replication/logical/logical.c:404 +#: replication/logical/logical.c:352 replication/logical/logical.c:504 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "слот реплікації \"%s\" був створений не в цій базі даних" -#: replication/logical/logical.c:270 +#: replication/logical/logical.c:359 #, c-format msgid "cannot create logical replication slot in transaction that has performed writes" msgstr "неможливо створити слот логічної реплікації у транзакції, що виконує записування" -#: replication/logical/logical.c:444 +#: replication/logical/logical.c:549 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "початок логічного декодування для слоту \"%s\"" -#: replication/logical/logical.c:446 +#: replication/logical/logical.c:551 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Потокове передавання транзакцій, що затверджені, після %X/%X, читання WAL з %X/%X." -#: replication/logical/logical.c:593 +#: replication/logical/logical.c:696 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "слот \"%s\", плагін виходу \"%s\", у зворотньому виклику %s, пов'язаний номер LSN %X/%X" -#: replication/logical/logical.c:600 +#: replication/logical/logical.c:702 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "слот \"%s\", плагін виходу \"%s\", у зворотньому виклику %s" +#: replication/logical/logical.c:868 replication/logical/logical.c:912 +#: replication/logical/logical.c:956 replication/logical/logical.c:1001 +#, c-format +msgid "logical replication at prepare time requires a %s callback" +msgstr "логічна реплікація під час підготовки потребує %s зворотнього виклику" + +#: replication/logical/logical.c:1224 replication/logical/logical.c:1271 +#: replication/logical/logical.c:1311 replication/logical/logical.c:1395 +#: replication/logical/logical.c:1442 +#, c-format +msgid "logical streaming requires a %s callback" +msgstr "логічне потокове передавання потребує %s зворотнього виклику" + +#: replication/logical/logical.c:1355 +#, c-format +msgid "logical streaming at prepare time requires a %s callback" +msgstr "логічне потокове передавання під час підготовки потребує %s зворотнього виклику" + #: replication/logical/logicalfuncs.c:104 replication/slotfuncs.c:34 #, c-format msgid "must be superuser or replication role to use replication slots" @@ -18076,10 +18756,10 @@ msgstr "масив повинен мати парну кількість еле msgid "can no longer get changes from replication slot \"%s\"" msgstr "більше не можна отримувати зміни з слоту реплікації \"%s\"" -#: replication/logical/logicalfuncs.c:253 replication/slotfuncs.c:648 +#: replication/logical/logicalfuncs.c:253 replication/slotfuncs.c:650 #, c-format -msgid "This slot has never previously reserved WAL, or has been invalidated." -msgstr "Цей слот ніколи раніше не резервував WAL, або не був недійсним." +msgid "This slot has never previously reserved WAL, or it has been invalidated." +msgstr "Цей слот ніколи раніше не резервував WAL, або він був недійсним." #: replication/logical/logicalfuncs.c:265 #, c-format @@ -18088,139 +18768,153 @@ msgstr "плагін виходу логічного декодування \"%s #: replication/logical/origin.c:188 #, c-format -msgid "only superusers can query or manipulate replication origins" -msgstr "лише суперкористувачі можуть вимагати або маніпулювати джерелами реплікації" - -#: replication/logical/origin.c:193 -#, c-format msgid "cannot query or manipulate replication origin when max_replication_slots = 0" msgstr "неможливо вимагати або маніпулювати джерелами реплікації, коли max_replication_slots = 0" -#: replication/logical/origin.c:198 +#: replication/logical/origin.c:193 #, c-format msgid "cannot manipulate replication origins during recovery" msgstr "неможливо маніпулювати джерелами реплікації під час відновлення" -#: replication/logical/origin.c:233 +#: replication/logical/origin.c:228 #, c-format msgid "replication origin \"%s\" does not exist" msgstr "джерело реплікації \"%s\" не існує" -#: replication/logical/origin.c:324 +#: replication/logical/origin.c:319 #, c-format msgid "could not find free replication origin OID" msgstr "не вдалося знайти вільний ідентифікатор OID джерела реплікації" -#: replication/logical/origin.c:372 +#: replication/logical/origin.c:355 #, c-format msgid "could not drop replication origin with OID %d, in use by PID %d" msgstr "не вдалося розірвати джерело реплікації з ідентифікатором OID %d, використовується PID %d" -#: replication/logical/origin.c:464 +#: replication/logical/origin.c:476 #, c-format msgid "replication origin with OID %u does not exist" msgstr "джерело реплікації з ідентифікатором OID %u не існує" -#: replication/logical/origin.c:729 +#: replication/logical/origin.c:741 #, c-format msgid "replication checkpoint has wrong magic %u instead of %u" msgstr "контрольна точка реплікації має неправильну сигнатуру %u замість %u" -#: replication/logical/origin.c:770 +#: replication/logical/origin.c:782 #, c-format msgid "could not find free replication state, increase max_replication_slots" msgstr "не вдалося знайти вільний слот для стану реплікації, збільшіть max_replication_slots" -#: replication/logical/origin.c:788 +#: replication/logical/origin.c:790 +#, c-format +msgid "recovered replication state of node %u to %X/%X" +msgstr "відновлений стан реплікації вузла %u в %X/%X" + +#: replication/logical/origin.c:800 #, c-format msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "неправильна контрольна сума файлу контрольної точки для слота реплікації %u, очікувалось %u" -#: replication/logical/origin.c:916 replication/logical/origin.c:1102 +#: replication/logical/origin.c:928 replication/logical/origin.c:1114 #, c-format msgid "replication origin with OID %d is already active for PID %d" msgstr "джерело реплікації з OID %d вже активний для PID %d" -#: replication/logical/origin.c:927 replication/logical/origin.c:1114 +#: replication/logical/origin.c:939 replication/logical/origin.c:1126 #, c-format msgid "could not find free replication state slot for replication origin with OID %u" msgstr "не вдалося знайти вільний слот стану реплікації для джерела реплікації з OID %u" -#: replication/logical/origin.c:929 replication/logical/origin.c:1116 -#: replication/slot.c:1762 +#: replication/logical/origin.c:941 replication/logical/origin.c:1128 +#: replication/slot.c:1860 #, c-format msgid "Increase max_replication_slots and try again." msgstr "Збільшіть max_replication_slots і спробуйте знову." -#: replication/logical/origin.c:1073 +#: replication/logical/origin.c:1085 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "не можна налаштувати джерело реплікації, коли один вже налаштований" -#: replication/logical/origin.c:1153 replication/logical/origin.c:1369 -#: replication/logical/origin.c:1389 +#: replication/logical/origin.c:1165 replication/logical/origin.c:1377 +#: replication/logical/origin.c:1397 #, c-format msgid "no replication origin is configured" msgstr "жодне джерело реплікації не налаштоване" -#: replication/logical/origin.c:1236 +#: replication/logical/origin.c:1248 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "назва джерела реплікації \"%s\" зарезервована" -#: replication/logical/origin.c:1238 +#: replication/logical/origin.c:1250 #, c-format msgid "Origin names starting with \"pg_\" are reserved." msgstr "Назви джерел, які починаються на \"pg_\" зарезервовані." -#: replication/logical/relation.c:302 +#: replication/logical/relation.c:234 #, c-format -msgid "logical replication target relation \"%s.%s\" does not exist" -msgstr "цільове відношення логічної реплікації \"%s.%s\" не існує" +msgid "\"%s\"" +msgstr "\"%s\"" + +#: replication/logical/relation.c:237 +#, c-format +msgid ", \"%s\"" +msgstr ", \"%s\"" + +#: replication/logical/relation.c:243 +#, c-format +msgid "logical replication target relation \"%s.%s\" is missing replicated column: %s" +msgid_plural "logical replication target relation \"%s.%s\" is missing replicated columns: %s" +msgstr[0] "в цільовому відношенні логічної реплікації \"%s.%s\" пропущено реплікований стовпець: %s" +msgstr[1] "в цільовому відношенні логічної реплікації \"%s.%s\" пропущено репліковані стовпці: %s" +msgstr[2] "в цільовому відношенні логічної реплікації \"%s.%s\" пропущено репліковані стовпці: %s" +msgstr[3] "в цільовому відношенні логічної реплікації \"%s.%s\" пропущено репліковані стовпці: %s" -#: replication/logical/relation.c:345 +#: replication/logical/relation.c:323 #, c-format -msgid "logical replication target relation \"%s.%s\" is missing some replicated columns" -msgstr "в цільовому відношенні логічної реплікації \"%s.%s\" пропущені деякі репліковані стовпці" +msgid "logical replication target relation \"%s.%s\" does not exist" +msgstr "цільове відношення логічної реплікації \"%s.%s\" не існує" -#: replication/logical/relation.c:385 +#: replication/logical/relation.c:404 #, c-format msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" msgstr "в цільовому відношенні логічної реплікації \"%s.%s\" в індексі REPLICA IDENTITY використовуються системні стовпці" -#: replication/logical/reorderbuffer.c:2663 +#: replication/logical/reorderbuffer.c:3802 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "не вдалося записати у файл даних для XID %u: %m" -#: replication/logical/reorderbuffer.c:2850 -#: replication/logical/reorderbuffer.c:2875 +#: replication/logical/reorderbuffer.c:4146 +#: replication/logical/reorderbuffer.c:4171 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "не вдалося прочитати з файлу розгортання буферу пересортування: %m" -#: replication/logical/reorderbuffer.c:2854 -#: replication/logical/reorderbuffer.c:2879 +#: replication/logical/reorderbuffer.c:4150 +#: replication/logical/reorderbuffer.c:4175 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "не вдалося прочитати з файлу розгортання буферу пересортування: прочитано %d замість %u байт" -#: replication/logical/reorderbuffer.c:3114 +#: replication/logical/reorderbuffer.c:4424 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "не вдалося видалити файл \"%s\" під час видалення pg_replslot/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:3606 +#: replication/logical/reorderbuffer.c:4914 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "не вдалося прочитати з файлу \"%s\": прочитано %d замість %d байт" -#: replication/logical/snapbuild.c:606 +#: replication/logical/snapbuild.c:588 #, c-format msgid "initial slot snapshot too large" msgstr "початковий знімок слота занадто великий" -#: replication/logical/snapbuild.c:660 +#: replication/logical/snapbuild.c:642 #, c-format msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" @@ -18229,518 +18923,514 @@ msgstr[1] "експортовано знімок логічного декоду msgstr[2] "експортовано знімок логічного декодування \"%s\" з %u ID транзакціями" msgstr[3] "експортовано знімок логічного декодування \"%s\" з %u ID транзакціями" -#: replication/logical/snapbuild.c:1265 replication/logical/snapbuild.c:1358 -#: replication/logical/snapbuild.c:1912 +#: replication/logical/snapbuild.c:1254 replication/logical/snapbuild.c:1347 +#: replication/logical/snapbuild.c:1878 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "узгодження процесу логічного кодування знайдено в точці %X/%X" -#: replication/logical/snapbuild.c:1267 +#: replication/logical/snapbuild.c:1256 #, c-format msgid "There are no running transactions." msgstr "Більше активних транзакцій немає." -#: replication/logical/snapbuild.c:1309 +#: replication/logical/snapbuild.c:1298 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "початкова стартова точка процесу логічного декодування знайдена в точці %X/%X" -#: replication/logical/snapbuild.c:1311 replication/logical/snapbuild.c:1335 +#: replication/logical/snapbuild.c:1300 replication/logical/snapbuild.c:1324 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "Очікування транзакцій (приблизно %d) старіше, ніж %u до кінця." -#: replication/logical/snapbuild.c:1333 +#: replication/logical/snapbuild.c:1322 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "початкова точка узгодження процесу логічного кодування знайдена в точці %X/%X" -#: replication/logical/snapbuild.c:1360 +#: replication/logical/snapbuild.c:1349 #, c-format msgid "There are no old transactions anymore." msgstr "Більше старих транзакцій немає." -#: replication/logical/snapbuild.c:1754 +#: replication/logical/snapbuild.c:1746 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "файл стану snapbuild \"%s\" має неправильне магічне число: %u замість %u" -#: replication/logical/snapbuild.c:1760 +#: replication/logical/snapbuild.c:1752 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "файл стану snapbuild \"%s\" має непідтримуючу версію: %u замість %u" -#: replication/logical/snapbuild.c:1859 +#: replication/logical/snapbuild.c:1823 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "у файлі стану snapbuild \"%s\" невідповідність контрольної суми: %u, повинно бути %u" -#: replication/logical/snapbuild.c:1914 +#: replication/logical/snapbuild.c:1880 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Логічне декодування почнеться зі збереженого знімку." -#: replication/logical/snapbuild.c:1986 +#: replication/logical/snapbuild.c:1952 #, c-format msgid "could not parse file name \"%s\"" msgstr "не вдалося аналізувати ім'я файлу \"%s\"" -#: replication/logical/tablesync.c:132 +#: replication/logical/tablesync.c:144 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" msgstr "процес синхронізації таблиці при логічній реплікації для підписки \"%s\", таблиці \"%s\" закінчив обробку" -#: replication/logical/tablesync.c:664 +#: replication/logical/tablesync.c:727 replication/logical/tablesync.c:770 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "не вдалося отримати інформацію про таблицю \"%s.%s\" з серверу публікації: %s" -#: replication/logical/tablesync.c:670 +#: replication/logical/tablesync.c:734 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "таблиця \"%s.%s\" не знайдена на сервері публікації" -#: replication/logical/tablesync.c:704 -#, c-format -msgid "could not fetch table info for table \"%s.%s\": %s" -msgstr "не вдалося отримати інформацію про таблицю \"%s.%s\": %s" - -#: replication/logical/tablesync.c:791 +#: replication/logical/tablesync.c:858 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "не вдалося почати копіювання початкового змісту таблиці \"%s.%s\": %s" -#: replication/logical/tablesync.c:905 +#: replication/logical/tablesync.c:1059 +#, c-format +msgid "table copy could not start transaction on publisher: %s" +msgstr "копії таблиці не вдалося запустити транзакцію на сервері публікації: %s" + +#: replication/logical/tablesync.c:1107 +#, c-format +msgid "replication origin \"%s\" already exists" +msgstr "джерело реплікації \"%s\" вже існує" + +#: replication/logical/tablesync.c:1120 #, c-format -msgid "table copy could not start transaction on publisher" -msgstr "під час копіювання таблиці не вдалося почати транзакцію на сервері публікації" +msgid "table copy could not finish transaction on publisher: %s" +msgstr "копії таблиці не вдалося завершити транзакцію на сервері публікації: %s" -#: replication/logical/tablesync.c:927 +#: replication/logical/worker.c:518 #, c-format -msgid "table copy could not finish transaction on publisher" -msgstr "під час копіювання таблиці не вдалося завершити транзакцію на сервері публікації" +msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgstr "обробка віддалених даних для цільового зв'язку реплікації \"%s.%s\" стовпця \"%s\"" -#: replication/logical/worker.c:313 +#: replication/logical/worker.c:593 replication/logical/worker.c:719 #, c-format -msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\", remote type %s, local type %s" -msgstr "обробка віддалених даних для цільового зв'язку реплікації \"%s.%s\" стовпця \"%s\", віддалений тип %s, локальний тип %s" +msgid "incorrect binary data format in logical replication column %d" +msgstr "невірний формат двійкових даних в стовпці логічної реплікації %d" -#: replication/logical/worker.c:552 +#: replication/logical/worker.c:1090 replication/logical/worker.c:1104 #, c-format -msgid "ORIGIN message sent out of order" -msgstr "Повідомлення ORIGIN відправлено недоречно" +msgid "could not read from streaming transaction's changes file \"%s\": %m" +msgstr "не вдалося прочитати з файлу змін потокової транзакції \"%s\": %m" -#: replication/logical/worker.c:702 +#: replication/logical/worker.c:1332 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" msgstr "сервер публікації не передав стовпець ідентифікації репліки очікуваний для цільового зв'язку логічної реплікації \"%s.%s\"" -#: replication/logical/worker.c:709 +#: replication/logical/worker.c:1339 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "в цільовому зв'язку логічної реплікації \"%s.%s\" немає ні індексу REPLICA IDENTITY, ні ключа PRIMARY KEY і публіковаий зв'язок не має REPLICA IDENTITY FULL" -#: replication/logical/worker.c:1394 -#, c-format -msgid "invalid logical replication message type \"%c\"" -msgstr "неприпустимий тип повідомлення логічної реплікації \"%c\"" - -#: replication/logical/worker.c:1537 +#: replication/logical/worker.c:2218 #, c-format msgid "data stream from publisher has ended" msgstr "потік даних з серверу публікації завершився" -#: replication/logical/worker.c:1692 +#: replication/logical/worker.c:2369 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "завершення процесу логічної реплікації через тайм-аут" -#: replication/logical/worker.c:1837 +#: replication/logical/worker.c:2517 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" msgstr "застосовуючий процес логічної реплікації для підписки \"%s\" буде зупинено, тому, що підписка була видалена" -#: replication/logical/worker.c:1851 +#: replication/logical/worker.c:2531 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "застосовуючий процес логічної реплікації для підписки \"%s\" буде зупинено, тому, що підписка була вимкнута" -#: replication/logical/worker.c:1865 -#, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because the connection information was changed" -msgstr "застосовуючий процес логічної реплікації для підписки \"%s\" буде перезавантажено, тому, що інформація про підключення була змінена" - -#: replication/logical/worker.c:1879 -#, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because subscription was renamed" -msgstr "застосовуючий процес логічної реплікації для підписки \"%s\" буде перезавантажено, тому, що підписка була перейменована" - -#: replication/logical/worker.c:1896 +#: replication/logical/worker.c:2553 #, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because the replication slot name was changed" -msgstr "застосовуючий процес логічної реплікації для підписки \"%s\" буде перезавантажено, тому, що ім'я слоту реплікації було змінено" +msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" +msgstr "процес, що застосовує логічну реплікацію для підписки \"%s\", буде перезавантажено через зміну параметру" -#: replication/logical/worker.c:1910 +#: replication/logical/worker.c:2718 replication/logical/worker.c:2740 #, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because subscription's publications were changed" -msgstr "застосовуючий процес логічної реплікації для підписки \"%s\" буде перезавантажено, тому, що публікації підписки були змінені" +msgid "could not read from streaming transaction's subxact file \"%s\": %m" +msgstr "не вдалося прочитати з файлу subxact потокової транзакції \"%s\": %m" -#: replication/logical/worker.c:2006 +#: replication/logical/worker.c:3099 #, c-format msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" msgstr "застосовуючий процес логічної реплікації для підписки %u не буде почато, тому, що підписка була видалена під час запуску" -#: replication/logical/worker.c:2018 +#: replication/logical/worker.c:3111 #, c-format msgid "logical replication apply worker for subscription \"%s\" will not start because the subscription was disabled during startup" msgstr "застосовуючий процес логічної реплікації для підписки \"%s\" не буде почато, тому, що підписка була вимкнута під час запуску" -#: replication/logical/worker.c:2036 +#: replication/logical/worker.c:3129 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "просец синхронізації таблиці під час логічної реплікації для підписки \"%s\", таблиці \"%s\" запущений" -#: replication/logical/worker.c:2040 +#: replication/logical/worker.c:3133 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "застосовуючий процес логічної реплікації для підписки \"%s\" запущений" -#: replication/logical/worker.c:2079 +#: replication/logical/worker.c:3171 #, c-format msgid "subscription has no replication slot set" msgstr "для підписки не встановлений слот реплікації" -#: replication/pgoutput/pgoutput.c:147 +#: replication/pgoutput/pgoutput.c:195 #, c-format msgid "invalid proto_version" msgstr "неприпустиме значення proto_version" -#: replication/pgoutput/pgoutput.c:152 +#: replication/pgoutput/pgoutput.c:200 #, c-format msgid "proto_version \"%s\" out of range" msgstr "значення proto_version \"%s\" за межами діапазону" -#: replication/pgoutput/pgoutput.c:169 +#: replication/pgoutput/pgoutput.c:217 #, c-format msgid "invalid publication_names syntax" msgstr "неприпустимий синтаксис publication_names" -#: replication/pgoutput/pgoutput.c:211 +#: replication/pgoutput/pgoutput.c:287 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or lower" msgstr "клієнт передав proto_version=%d, але ми підтримуємо лише протокол %d або нижче" -#: replication/pgoutput/pgoutput.c:217 +#: replication/pgoutput/pgoutput.c:293 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or higher" msgstr "клієнт передав proto_version=%d, але ми підтримуємо лише протокол %d або вище" -#: replication/pgoutput/pgoutput.c:223 +#: replication/pgoutput/pgoutput.c:299 #, c-format msgid "publication_names parameter missing" msgstr "пропущено параметр publication_names" -#: replication/slot.c:183 +#: replication/pgoutput/pgoutput.c:312 +#, c-format +msgid "requested proto_version=%d does not support streaming, need %d or higher" +msgstr "запитувана proto_version=%d не підтримує потокову передачу, потребується %d або вища" + +#: replication/pgoutput/pgoutput.c:317 +#, c-format +msgid "streaming requested, but not supported by output plugin" +msgstr "запитане потокова передавача, але не підтримується плагіном виводу" + +#: replication/slot.c:180 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "ім'я слоту реплікації \"%s\" занадто коротке" -#: replication/slot.c:192 +#: replication/slot.c:189 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "ім'я слоту реплікації \"%s\" занадто довге" -#: replication/slot.c:205 +#: replication/slot.c:202 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "ім'я слоту реплікації \"%s\" містить неприпустимий символ" -#: replication/slot.c:207 +#: replication/slot.c:204 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "Імена слота реплікації можуть містити лише букви в нижньому кейсі, числа, і символ підкреслення." -#: replication/slot.c:254 +#: replication/slot.c:258 #, c-format msgid "replication slot \"%s\" already exists" msgstr "слот реплікації \"%s\" вже існує" -#: replication/slot.c:264 +#: replication/slot.c:268 #, c-format msgid "all replication slots are in use" msgstr "використовуються всі слоти реплікації" -#: replication/slot.c:265 +#: replication/slot.c:269 #, c-format msgid "Free one or increase max_replication_slots." msgstr "Звільніть непотрібні або збільшіть max_replication_slots." -#: replication/slot.c:407 replication/slotfuncs.c:760 +#: replication/slot.c:402 replication/slotfuncs.c:761 +#: utils/adt/pgstatfuncs.c:2227 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "слот реплікації \"%s\" не існує" -#: replication/slot.c:445 replication/slot.c:1006 +#: replication/slot.c:448 replication/slot.c:1018 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "слот реплікації \"%s\" активний для PID %d" -#: replication/slot.c:683 replication/slot.c:1314 replication/slot.c:1697 +#: replication/slot.c:676 replication/slot.c:1412 replication/slot.c:1795 #, c-format msgid "could not remove directory \"%s\"" msgstr "не вдалося видалити каталог \"%s\"" -#: replication/slot.c:1041 +#: replication/slot.c:1053 #, c-format msgid "replication slots can only be used if max_replication_slots > 0" msgstr "слоти реплікації можна використовувати лише якщо max_replication_slots > 0" -#: replication/slot.c:1046 +#: replication/slot.c:1058 #, c-format msgid "replication slots can only be used if wal_level >= replica" msgstr "слоти реплікації можна використовувати лише якщо wal_level >= replica" -#: replication/slot.c:1202 +#: replication/slot.c:1243 #, c-format -msgid "terminating process %d because replication slot \"%s\" is too far behind" -msgstr "завершення процесу %d тому, що слот реплікації \"%s\" занадто далеко позаду" +msgid "terminating process %d to release replication slot \"%s\"" +msgstr "завершення процесу %d для звільнення слоту реплікації \"%s\"" -#: replication/slot.c:1221 +#: replication/slot.c:1281 #, c-format msgid "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds max_slot_wal_keep_size" msgstr "припинення слоту \"%s\" тому, що його restart_lsn %X/%X перевищує max_slot_wal_keep_size" -#: replication/slot.c:1635 +#: replication/slot.c:1733 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "файл слоту реплікації \"%s\" має неправильне магічне число: %u замість %u" -#: replication/slot.c:1642 +#: replication/slot.c:1740 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "файл слоту реплікації \"%s\" має непідтримуючу версію %u" -#: replication/slot.c:1649 +#: replication/slot.c:1747 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "файл слоту реплікації \"%s\" має пошкоджену довжину %u" -#: replication/slot.c:1685 +#: replication/slot.c:1783 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "у файлі слоту реплікації \"%s\" невідповідність контрольної суми: %u, повинно бути %u" -#: replication/slot.c:1719 +#: replication/slot.c:1817 #, c-format msgid "logical replication slot \"%s\" exists, but wal_level < logical" msgstr "слот логічної реплікації \"%s\" існує, але wal_level < logical" -#: replication/slot.c:1721 +#: replication/slot.c:1819 #, c-format msgid "Change wal_level to be logical or higher." msgstr "Змініть wal_level на logical або вище." -#: replication/slot.c:1725 +#: replication/slot.c:1823 #, c-format msgid "physical replication slot \"%s\" exists, but wal_level < replica" msgstr "слот фізичної реплікації \"%s\" існує, але wal_level < replica" -#: replication/slot.c:1727 +#: replication/slot.c:1825 #, c-format msgid "Change wal_level to be replica or higher." msgstr "Змініть wal_level на replica або вище." -#: replication/slot.c:1761 +#: replication/slot.c:1859 #, c-format msgid "too many replication slots active before shutdown" msgstr "перед завершенням роботи активно занадто багато слотів реплікації" -#: replication/slotfuncs.c:624 +#: replication/slotfuncs.c:626 #, c-format msgid "invalid target WAL LSN" msgstr "неприпустима ціль WAL LSN" -#: replication/slotfuncs.c:646 +#: replication/slotfuncs.c:648 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "слот реплікації \"%s\" не може бути розширеним" -#: replication/slotfuncs.c:664 +#: replication/slotfuncs.c:666 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" msgstr "просунути слот реплікації до позиції %X/%X не можна, мінімальна позиція %X/%X" -#: replication/slotfuncs.c:772 +#: replication/slotfuncs.c:773 #, c-format msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" msgstr "не можна скопіювати слот фізичної реплікації \"%s\" як слот логічної реплікації" -#: replication/slotfuncs.c:774 +#: replication/slotfuncs.c:775 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "не можна скопіювати слот логічної реплікації \"%s\" як слот фізичної реплікації" -#: replication/slotfuncs.c:781 +#: replication/slotfuncs.c:782 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "не можна скопіювати слот реплікації, який не резервує WAL" -#: replication/slotfuncs.c:857 +#: replication/slotfuncs.c:859 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "не вдалося скопіювати слот реплікації \"%s\"" -#: replication/slotfuncs.c:859 +#: replication/slotfuncs.c:861 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "Слот реплікації джерела був змінений несумісно під час операції копіювання." -#: replication/slotfuncs.c:865 +#: replication/slotfuncs.c:867 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "не можна скопіювати незавершений слот логічної реплікації \"%s\"" -#: replication/slotfuncs.c:867 +#: replication/slotfuncs.c:869 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "Повторіть, коли confirmed_flush_lsn слоту джерела реплікації є дійсним." -#: replication/syncrep.c:257 +#: replication/syncrep.c:268 #, c-format msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" msgstr "скасування очікування синхронної реплікації і завершення з'єднання по команді адміністратора" -#: replication/syncrep.c:258 replication/syncrep.c:275 +#: replication/syncrep.c:269 replication/syncrep.c:286 #, c-format msgid "The transaction has already committed locally, but might not have been replicated to the standby." msgstr "Транзакція вже була затверджена локально, але можливо не була реплікована до режиму очікування." -#: replication/syncrep.c:274 +#: replication/syncrep.c:285 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "скасування очікування синхронної реплікації по запиту користувача" -#: replication/syncrep.c:416 -#, c-format -msgid "standby \"%s\" now has synchronous standby priority %u" -msgstr "режим очікування \"%s\" зараз має пріоритет синхронної реплікації %u" - -#: replication/syncrep.c:483 +#: replication/syncrep.c:494 #, c-format msgid "standby \"%s\" is now a synchronous standby with priority %u" msgstr "режим очікування \"%s\" зараз є синхронним з пріоритетом %u" -#: replication/syncrep.c:487 +#: replication/syncrep.c:498 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "режим очікування \"%s\" зараз є кандидатом для включення в кворум синхронних" -#: replication/syncrep.c:1034 +#: replication/syncrep.c:1045 #, c-format msgid "synchronous_standby_names parser failed" msgstr "помилка при аналізуванні synchronous_standby_names" -#: replication/syncrep.c:1040 +#: replication/syncrep.c:1051 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "кількість синхронних режимів очікування (%d) повинно бути більше нуля" -#: replication/walreceiver.c:171 +#: replication/walreceiver.c:160 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "завершення процесу walreceiver по команді адміністратора" -#: replication/walreceiver.c:297 +#: replication/walreceiver.c:288 #, c-format msgid "could not connect to the primary server: %s" msgstr "не вдалося підключитися до основного серверу: %s" -#: replication/walreceiver.c:343 +#: replication/walreceiver.c:335 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "ідентифікатор системи бази даних на основному і резервному серверах відрізняються" -#: replication/walreceiver.c:344 +#: replication/walreceiver.c:336 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "Ідентифікатор на основному сервері %s, на резервному %s." -#: replication/walreceiver.c:354 +#: replication/walreceiver.c:347 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "остання часова шкала %u на основному сервері відстає від відновлюючої часової шкали %u" -#: replication/walreceiver.c:408 +#: replication/walreceiver.c:401 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "запущено потокове передавання WAL з основного серверу з позиції %X/%X на часовій шкалі %u" -#: replication/walreceiver.c:413 +#: replication/walreceiver.c:405 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "перезапуска потокового передавання WAL з позиції %X/%X на часовій шкалі %u" -#: replication/walreceiver.c:442 +#: replication/walreceiver.c:434 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "продовжити потокове передавання WAL не можна, відновлення вже завершено" -#: replication/walreceiver.c:479 +#: replication/walreceiver.c:471 #, c-format msgid "replication terminated by primary server" msgstr "реплікація завершена основним сервером" -#: replication/walreceiver.c:480 +#: replication/walreceiver.c:472 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "На часовій шкалі %u в позиції %X/%X WAL досяг кінця." -#: replication/walreceiver.c:568 +#: replication/walreceiver.c:561 #, c-format msgid "terminating walreceiver due to timeout" msgstr "завершення процесу walreceiver через тайм-аут" -#: replication/walreceiver.c:606 +#: replication/walreceiver.c:599 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "основний сервер більше не містить WAL для запитаної часової шкали %u" -#: replication/walreceiver.c:622 replication/walreceiver.c:929 +#: replication/walreceiver.c:615 replication/walreceiver.c:910 #, c-format msgid "could not close log segment %s: %m" msgstr "не вдалося закрити сегмент журналу %s: %m" -#: replication/walreceiver.c:742 +#: replication/walreceiver.c:734 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "отримання файлу історії часової шкали для часової шкали %u з основного серверу" -#: replication/walreceiver.c:976 +#: replication/walreceiver.c:957 #, c-format msgid "could not write to log segment %s at offset %u, length %lu: %m" msgstr "не вдалося записати в сегмент журналу %s зсув %u, довжина %lu: %m" -#: replication/walsender.c:523 storage/smgr/md.c:1291 +#: replication/walsender.c:524 storage/smgr/md.c:1320 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "не вдалося досягти кінця файлу \"%s\": %m" -#: replication/walsender.c:527 +#: replication/walsender.c:528 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "не вдалося знайти початок файлу \"%s\": %m" -#: replication/walsender.c:578 +#: replication/walsender.c:579 #, c-format msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" msgstr "Команда IDENTIFY_SYSTEM не виконувалась до START_REPLICATION" -#: replication/walsender.c:607 +#: replication/walsender.c:608 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "використовувати логічний слот реплікації для фізичної реплікації, не можна" -#: replication/walsender.c:676 +#: replication/walsender.c:677 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "в історії серверу немає запитаної початкової точки %X/%X на часовій шкалі %u" @@ -18750,109 +19440,99 @@ msgstr "в історії серверу немає запитаної поча msgid "This server's history forked from timeline %u at %X/%X." msgstr "Історія цього серверу відгалузилась від часової шкали %u в позиції %X/%X." -#: replication/walsender.c:725 +#: replication/walsender.c:724 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "запитана початкова точка %X/%X попереду позиція очищених даних WAL на цьому сервері %X/%X" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:976 +#: replication/walsender.c:974 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s не має викликатися всередині транзакції" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:986 +#: replication/walsender.c:984 #, c-format msgid "%s must be called inside a transaction" msgstr "%s має викликатися всередині транзакції" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:992 +#: replication/walsender.c:990 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s повинен бути викликаний в режимі ізоляції REPEATABLE READ" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:998 +#: replication/walsender.c:996 #, c-format msgid "%s must be called before any query" msgstr "%s має викликатися до будь-якого запиту" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1004 +#: replication/walsender.c:1002 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s не має викликатися всередині підтранзакції" -#: replication/walsender.c:1148 +#: replication/walsender.c:1145 #, c-format msgid "cannot read from logical replication slot \"%s\"" msgstr "не можна прочитати із слоту логічної реплікації \"%s\"" -#: replication/walsender.c:1150 +#: replication/walsender.c:1147 #, c-format msgid "This slot has been invalidated because it exceeded the maximum reserved size." msgstr "Цей слот визнано недійсним, тому що він перевищив максимально зарезервований розмір." -#: replication/walsender.c:1160 +#: replication/walsender.c:1157 #, c-format msgid "terminating walsender process after promotion" msgstr "завершення процесу walsender після підвищення" -#: replication/walsender.c:1534 +#: replication/walsender.c:1523 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "не можна виконувати нові команди, поки процес відправки WAL знаходиться в режимі зупинки" -#: replication/walsender.c:1567 +#: replication/walsender.c:1560 +#, c-format +msgid "cannot execute SQL commands in WAL sender for physical replication" +msgstr "не можна виконувати команди SQL в процесі відправки WAL для фізичної реплікації" + +#: replication/walsender.c:1583 #, c-format msgid "received replication command: %s" msgstr "отримано команду реплікації: %s" -#: replication/walsender.c:1583 tcop/fastpath.c:279 tcop/postgres.c:1103 -#: tcop/postgres.c:1455 tcop/postgres.c:1716 tcop/postgres.c:2174 -#: tcop/postgres.c:2535 tcop/postgres.c:2614 +#: replication/walsender.c:1591 tcop/fastpath.c:208 tcop/postgres.c:1078 +#: tcop/postgres.c:1430 tcop/postgres.c:1691 tcop/postgres.c:2176 +#: tcop/postgres.c:2586 tcop/postgres.c:2665 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "поточна транзакція перервана, команди до кінця блока транзакції пропускаються" -#: replication/walsender.c:1669 -#, c-format -msgid "cannot execute SQL commands in WAL sender for physical replication" -msgstr "не можна виконувати команди SQL в процесі відправки WAL для фізичної реплікації" - -#: replication/walsender.c:1714 replication/walsender.c:1730 +#: replication/walsender.c:1726 replication/walsender.c:1761 #, c-format msgid "unexpected EOF on standby connection" msgstr "неочікуваний обрив з'єднання з резервним сервером" -#: replication/walsender.c:1744 -#, c-format -msgid "unexpected standby message type \"%c\", after receiving CopyDone" -msgstr "після отримання CopyDone резервний сервер передав повідомлення неочікуваного типу \"%c\"" - -#: replication/walsender.c:1782 +#: replication/walsender.c:1749 #, c-format msgid "invalid standby message type \"%c\"" msgstr "неприпустимий тип повідомлення резервного серверу \"%c\"" -#: replication/walsender.c:1823 +#: replication/walsender.c:1838 #, c-format msgid "unexpected message type \"%c\"" msgstr "неочікуваний тип повідомлення \"%c\"" -#: replication/walsender.c:2241 +#: replication/walsender.c:2251 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "завершення процесу walsender через тайм-аут реплікації" -#: replication/walsender.c:2318 -#, c-format -msgid "\"%s\" has now caught up with upstream server" -msgstr "\"%s\" зараз надолужив висхідний сервер" - -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:989 +#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:999 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "правило \"%s\" для зв'язка \"%s\" вже існує" @@ -18917,324 +19597,339 @@ msgstr "\"%s\" вже є поданням" msgid "view rule for \"%s\" must be named \"%s\"" msgstr "правило подання для \"%s\" повинно називатися \"%s\"" -#: rewrite/rewriteDefine.c:434 +#: rewrite/rewriteDefine.c:435 #, c-format msgid "cannot convert partitioned table \"%s\" to a view" msgstr "перетворити секціоновану таблицю \"%s\" на подання, не можна" -#: rewrite/rewriteDefine.c:440 +#: rewrite/rewriteDefine.c:444 #, c-format msgid "cannot convert partition \"%s\" to a view" msgstr "перетворити секцію \"%s\" на подання, не можна" -#: rewrite/rewriteDefine.c:449 +#: rewrite/rewriteDefine.c:453 #, c-format msgid "could not convert table \"%s\" to a view because it is not empty" msgstr "не вдалося перетворити таблицю \"%s\" на подання, тому, що вона не пуста" -#: rewrite/rewriteDefine.c:458 +#: rewrite/rewriteDefine.c:462 #, c-format msgid "could not convert table \"%s\" to a view because it has triggers" msgstr "не вдалося перетворити таблицю \"%s\" на подання, тому, що вона має тригери" -#: rewrite/rewriteDefine.c:460 +#: rewrite/rewriteDefine.c:464 #, c-format msgid "In particular, the table cannot be involved in any foreign key relationships." msgstr "Крім того, таблиця не може бути включена в зв'язок зовнішніх ключів." -#: rewrite/rewriteDefine.c:465 +#: rewrite/rewriteDefine.c:469 #, c-format msgid "could not convert table \"%s\" to a view because it has indexes" msgstr "не вдалося перетворити таблицю \"%s\" на подання, тому, що вона має індекси" -#: rewrite/rewriteDefine.c:471 +#: rewrite/rewriteDefine.c:475 #, c-format msgid "could not convert table \"%s\" to a view because it has child tables" msgstr "не вдалося перетворити таблицю \"%s\" на подання, тому, що вона має дочірні таблиці" -#: rewrite/rewriteDefine.c:477 +#: rewrite/rewriteDefine.c:481 +#, c-format +msgid "could not convert table \"%s\" to a view because it has parent tables" +msgstr "не вдалося перетворити таблицю \"%s\" на подання, тому, що вона має батьківські таблиці" + +#: rewrite/rewriteDefine.c:487 #, c-format msgid "could not convert table \"%s\" to a view because it has row security enabled" msgstr "не вдалося перетворити таблицю \"%s\" на подання, тому, що для неї активований захист на рівні рядків" -#: rewrite/rewriteDefine.c:483 +#: rewrite/rewriteDefine.c:493 #, c-format msgid "could not convert table \"%s\" to a view because it has row security policies" msgstr "не вдалося перетворити таблицю \"%s\" на подання, тому, що вона має політику захисту рядків" -#: rewrite/rewriteDefine.c:510 +#: rewrite/rewriteDefine.c:520 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "правило не може мати декілька списків RETURNING" -#: rewrite/rewriteDefine.c:515 +#: rewrite/rewriteDefine.c:525 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "Умовні правила не підтримують списки RETURNING" -#: rewrite/rewriteDefine.c:519 +#: rewrite/rewriteDefine.c:529 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "Правила non-INSTEAD не підтримують списки RETURNING" -#: rewrite/rewriteDefine.c:683 +#: rewrite/rewriteDefine.c:693 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "Список цілей правила для SELECT має занадто багато елементів" -#: rewrite/rewriteDefine.c:684 +#: rewrite/rewriteDefine.c:694 #, c-format msgid "RETURNING list has too many entries" msgstr "Список RETURNING має занадто багато елементів" -#: rewrite/rewriteDefine.c:711 +#: rewrite/rewriteDefine.c:721 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "перетворити зв'язок, який містить видаленні стовпці, на подання не можна" -#: rewrite/rewriteDefine.c:712 +#: rewrite/rewriteDefine.c:722 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "створити список RETURNING для зв'язка, який містить видаленні стовпці, не можна" -#: rewrite/rewriteDefine.c:718 +#: rewrite/rewriteDefine.c:728 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "Елемент результата правила для SELECT %d відрізняється іменем стовпця від стовпця \"%s\"" -#: rewrite/rewriteDefine.c:720 +#: rewrite/rewriteDefine.c:730 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "Ім'я елемента результату SELECT \"%s\"." -#: rewrite/rewriteDefine.c:729 +#: rewrite/rewriteDefine.c:739 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "Елемент результата правила для SELECT %d відрізняється типом від стовпця \"%s\"" -#: rewrite/rewriteDefine.c:731 +#: rewrite/rewriteDefine.c:741 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "Елемент списку RETURNING %d відрізняється типом від стовпця \"%s\"" -#: rewrite/rewriteDefine.c:734 rewrite/rewriteDefine.c:758 +#: rewrite/rewriteDefine.c:744 rewrite/rewriteDefine.c:768 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "Елемент результату SELECT має тип %s, але стовпець має тип %s." -#: rewrite/rewriteDefine.c:737 rewrite/rewriteDefine.c:762 +#: rewrite/rewriteDefine.c:747 rewrite/rewriteDefine.c:772 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "Елемент списку RETURNING має тип %s, але стовпець має тип %s." -#: rewrite/rewriteDefine.c:753 +#: rewrite/rewriteDefine.c:763 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "Елемент результата правил для SELECT %d відрізняється розміром від стовпця \"%s\"" -#: rewrite/rewriteDefine.c:755 +#: rewrite/rewriteDefine.c:765 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "Елемент списку RETURNING %d відрізняється розміром від стовпця \"%s\"" -#: rewrite/rewriteDefine.c:772 +#: rewrite/rewriteDefine.c:782 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "Список результату правила для SELECT має занадто мало елементів" -#: rewrite/rewriteDefine.c:773 +#: rewrite/rewriteDefine.c:783 #, c-format msgid "RETURNING list has too few entries" msgstr "Список RETURNING має занадто мало елементів" -#: rewrite/rewriteDefine.c:866 rewrite/rewriteDefine.c:980 +#: rewrite/rewriteDefine.c:876 rewrite/rewriteDefine.c:990 #: rewrite/rewriteSupport.c:109 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "правило \"%s\" для відношення \"%s\" не існує" -#: rewrite/rewriteDefine.c:999 +#: rewrite/rewriteDefine.c:1009 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "не допускається перейменування правила ON SELECT" -#: rewrite/rewriteHandler.c:545 +#: rewrite/rewriteHandler.c:551 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "Ім'я запиту WITH \"%s\" з'являється і в дії правила, і в переписаному запиті" -#: rewrite/rewriteHandler.c:605 +#: rewrite/rewriteHandler.c:611 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "списки RETURNING може мати лише одне правило" -#: rewrite/rewriteHandler.c:816 rewrite/rewriteHandler.c:828 +#: rewrite/rewriteHandler.c:843 rewrite/rewriteHandler.c:882 #, c-format -msgid "cannot insert into column \"%s\"" -msgstr "вставити дані в стовпець \"%s\" не можна" +msgid "cannot insert a non-DEFAULT value into column \"%s\"" +msgstr "вставити значення non-DEFAULT до стовпця \"%s\" не можна" -#: rewrite/rewriteHandler.c:817 rewrite/rewriteHandler.c:839 +#: rewrite/rewriteHandler.c:845 rewrite/rewriteHandler.c:911 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "Стовпець \"%s\" є ідентифікаційним стовпцем визначеним як GENERATED ALWAYS." -#: rewrite/rewriteHandler.c:819 +#: rewrite/rewriteHandler.c:847 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Для зміни використайте OVERRIDING SYSTEM VALUE." -#: rewrite/rewriteHandler.c:838 rewrite/rewriteHandler.c:845 +#: rewrite/rewriteHandler.c:909 rewrite/rewriteHandler.c:917 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "стовпець \"%s\" може бути оновлено тільки до DEFAULT" -#: rewrite/rewriteHandler.c:1014 rewrite/rewriteHandler.c:1032 +#: rewrite/rewriteHandler.c:1064 rewrite/rewriteHandler.c:1082 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "кілька завдань для одного стовпця \"%s\"" -#: rewrite/rewriteHandler.c:2062 +#: rewrite/rewriteHandler.c:2084 rewrite/rewriteHandler.c:3912 +#, c-format +msgid "infinite recursion detected in rules for relation \"%s\"" +msgstr "виявлена безкінечна рекурсія у правилах для відносин \"%s\"" + +#: rewrite/rewriteHandler.c:2169 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "виявлена безкінечна рекурсія в політиці для зв'язка \"%s\"" -#: rewrite/rewriteHandler.c:2382 +#: rewrite/rewriteHandler.c:2489 msgid "Junk view columns are not updatable." msgstr "Утилізовані стовпці подань не оновлюються." -#: rewrite/rewriteHandler.c:2387 +#: rewrite/rewriteHandler.c:2494 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Стовпці подання, які не є стовпцями базового зв'язку, не оновлюються." -#: rewrite/rewriteHandler.c:2390 +#: rewrite/rewriteHandler.c:2497 msgid "View columns that refer to system columns are not updatable." msgstr "Стовпці подання, які посилаються на системні стовпці, не оновлюються." -#: rewrite/rewriteHandler.c:2393 +#: rewrite/rewriteHandler.c:2500 msgid "View columns that return whole-row references are not updatable." msgstr "Стовпці подання, що повертають посилання на весь рядок, не оновлюються." -#: rewrite/rewriteHandler.c:2454 +#: rewrite/rewriteHandler.c:2561 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Подання які містять DISTINCT не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2457 +#: rewrite/rewriteHandler.c:2564 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Подання які містять GROUP BY не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2460 +#: rewrite/rewriteHandler.c:2567 msgid "Views containing HAVING are not automatically updatable." msgstr "Подання які містять HAVING не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2463 +#: rewrite/rewriteHandler.c:2570 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Подання які містять UNION, INTERSECT, або EXCEPT не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2466 +#: rewrite/rewriteHandler.c:2573 msgid "Views containing WITH are not automatically updatable." msgstr "Подання які містять WITH не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2469 +#: rewrite/rewriteHandler.c:2576 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Подання які містять LIMIT або OFFSET не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2481 +#: rewrite/rewriteHandler.c:2588 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Подання які повертають агрегатні функції не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2484 +#: rewrite/rewriteHandler.c:2591 msgid "Views that return window functions are not automatically updatable." msgstr "Подання які повертають віконні функції не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2487 +#: rewrite/rewriteHandler.c:2594 msgid "Views that return set-returning functions are not automatically updatable." msgstr "Подання які повертають set-returning функції не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2494 rewrite/rewriteHandler.c:2498 -#: rewrite/rewriteHandler.c:2506 +#: rewrite/rewriteHandler.c:2601 rewrite/rewriteHandler.c:2605 +#: rewrite/rewriteHandler.c:2613 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "Подання які обирають дані не з одної таблиці або подання не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2509 +#: rewrite/rewriteHandler.c:2616 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Подання які містять TABLESAMPLE не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2533 +#: rewrite/rewriteHandler.c:2640 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Подання які не мають оновлюваних стовпців не оновлюються автоматично." -#: rewrite/rewriteHandler.c:3010 +#: rewrite/rewriteHandler.c:3117 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "вставити дані в стовпець \"%s\" подання \"%s\" не можна" -#: rewrite/rewriteHandler.c:3018 +#: rewrite/rewriteHandler.c:3125 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "оновити дані в стовпці \"%s\" подання \"%s\" не можна" -#: rewrite/rewriteHandler.c:3496 +#: rewrite/rewriteHandler.c:3606 +#, c-format +msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" +msgstr "Правила DO INSTEAD NOTIFY не підтримуються для операторів, які змінюють дані в WITH" + +#: rewrite/rewriteHandler.c:3617 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "Правила DO INSTEAD NOTHING не підтримуються для операторів, які змінюють дані в WITH" -#: rewrite/rewriteHandler.c:3510 +#: rewrite/rewriteHandler.c:3631 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "умовні правила DO INSTEAD не підтримуються для операторів, які змінюють дані в WITH" -#: rewrite/rewriteHandler.c:3514 +#: rewrite/rewriteHandler.c:3635 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "Правила DO ALSO не підтримуються для операторів, які змінюють дані в WITH" -#: rewrite/rewriteHandler.c:3519 +#: rewrite/rewriteHandler.c:3640 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "складові правила DO INSTEAD не підтримуються операторами, які змінюють дані у WITH" -#: rewrite/rewriteHandler.c:3710 rewrite/rewriteHandler.c:3718 -#: rewrite/rewriteHandler.c:3726 +#: rewrite/rewriteHandler.c:3840 rewrite/rewriteHandler.c:3848 +#: rewrite/rewriteHandler.c:3856 #, c-format msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "Подання з умовними правилами DO INSTEAD не оновлюються автоматично." -#: rewrite/rewriteHandler.c:3819 +#: rewrite/rewriteHandler.c:3949 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "виконати INSERT RETURNING для зв'язка \"%s\" не можна" -#: rewrite/rewriteHandler.c:3821 +#: rewrite/rewriteHandler.c:3951 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "Вам потрібне безумовне правило ON INSERT DO INSTEAD з реченням RETURNING." -#: rewrite/rewriteHandler.c:3826 +#: rewrite/rewriteHandler.c:3956 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "виконати UPDATE RETURNING для зв'язка \"%s\" не можна" -#: rewrite/rewriteHandler.c:3828 +#: rewrite/rewriteHandler.c:3958 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "Вам потрібне безумовне правило ON UPDATE DO INSTEAD з реченням RETURNING." -#: rewrite/rewriteHandler.c:3833 +#: rewrite/rewriteHandler.c:3963 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "виконати DELETE RETURNING для зв'язка \"%s\" не можна" -#: rewrite/rewriteHandler.c:3835 +#: rewrite/rewriteHandler.c:3965 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "Вам потрібне безумовне правило ON DELETE DO INSTEAD з реченням RETURNING." -#: rewrite/rewriteHandler.c:3853 +#: rewrite/rewriteHandler.c:3983 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "INSERT з реченням ON CONFLICT не можна використовувати з таблицею, яка має правила INSERT або UPDATE" -#: rewrite/rewriteHandler.c:3910 +#: rewrite/rewriteHandler.c:4040 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH не можна використовувати в запиті, який переписаний правилами в декілька запитів" @@ -19254,86 +19949,78 @@ msgstr "Умова WHERE CURRENT OF для подання не реалізов msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" msgstr "Змінні NEW в правилах ON UPDATE не можуть посилатись на стовпці, які є частиною декілької призначень в команді UPDATE" -#: snowball/dict_snowball.c:199 +#: snowball/dict_snowball.c:215 #, c-format msgid "no Snowball stemmer available for language \"%s\" and encoding \"%s\"" msgstr "засіб визначення основи слова Snowball для мови \"%s\" і кодування \"%s\" не знайдено" -#: snowball/dict_snowball.c:222 tsearch/dict_ispell.c:74 +#: snowball/dict_snowball.c:238 tsearch/dict_ispell.c:74 #: tsearch/dict_simple.c:49 #, c-format msgid "multiple StopWords parameters" msgstr "повторюваний параметр StopWords" -#: snowball/dict_snowball.c:231 +#: snowball/dict_snowball.c:247 #, c-format msgid "multiple Language parameters" msgstr "повторюваний параметр Language" -#: snowball/dict_snowball.c:238 +#: snowball/dict_snowball.c:254 #, c-format msgid "unrecognized Snowball parameter: \"%s\"" msgstr "нерозпізнаний параметр Snowball: \"%s\"" -#: snowball/dict_snowball.c:246 +#: snowball/dict_snowball.c:262 #, c-format msgid "missing Language parameter" msgstr "пропущений параметр Language" -#: statistics/dependencies.c:667 statistics/dependencies.c:720 -#: statistics/mcv.c:1477 statistics/mcv.c:1508 statistics/mvdistinct.c:348 -#: statistics/mvdistinct.c:401 utils/adt/pseudotypes.c:42 -#: utils/adt/pseudotypes.c:76 -#, c-format -msgid "cannot accept a value of type %s" -msgstr "не можна прийняти значення типу %s" - -#: statistics/extended_stats.c:145 +#: statistics/extended_stats.c:175 #, c-format msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "об'єкт статистики \"%s.%s\" не вдалося обчислити для відношення \"%s.%s\"" -#: statistics/mcv.c:1365 utils/adt/jsonfuncs.c:1800 +#: statistics/mcv.c:1371 utils/adt/jsonfuncs.c:1941 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "функція, що повертає набір, викликана у контексті, що не приймає тип запис" -#: storage/buffer/bufmgr.c:588 storage/buffer/bufmgr.c:669 +#: storage/buffer/bufmgr.c:601 storage/buffer/bufmgr.c:761 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "доступ до тимчасових таблиць з інших сесій заблоковано" -#: storage/buffer/bufmgr.c:825 +#: storage/buffer/bufmgr.c:917 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "неочікуванні дані після EOF в блоці %u відношення %s" -#: storage/buffer/bufmgr.c:827 +#: storage/buffer/bufmgr.c:919 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "Ця ситуація може виникати через помилки в ядрі; можливо, вам слід оновити вашу систему." -#: storage/buffer/bufmgr.c:925 +#: storage/buffer/bufmgr.c:1018 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "неприпустима сторінка в блоці %u відношення %s; сторінка обнуляється" -#: storage/buffer/bufmgr.c:4211 +#: storage/buffer/bufmgr.c:4524 #, c-format msgid "could not write block %u of %s" msgstr "неможливо записати блок %u файлу %s" -#: storage/buffer/bufmgr.c:4213 +#: storage/buffer/bufmgr.c:4526 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Кілька неполадок --- можливо, постійна помилка запису." -#: storage/buffer/bufmgr.c:4234 storage/buffer/bufmgr.c:4253 +#: storage/buffer/bufmgr.c:4547 storage/buffer/bufmgr.c:4566 #, c-format msgid "writing block %u of relation %s" msgstr "записування блоку %u зв'язку %s" -#: storage/buffer/bufmgr.c:4556 +#: storage/buffer/bufmgr.c:4870 #, c-format msgid "snapshot too old" msgstr "знімок є застарим" @@ -19348,215 +20035,238 @@ msgstr "немає жодного пустого локального буфер msgid "cannot access temporary tables during a parallel operation" msgstr "немає доступу до тимчасових таблиць під час паралельної операції" -#: storage/file/buffile.c:319 +#: storage/file/buffile.c:323 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "не вдалося відкрити тимчасовий файл \"%s\" з BufFile \"%s\": %m" -#: storage/file/buffile.c:795 +#: storage/file/buffile.c:684 storage/file/buffile.c:805 #, c-format msgid "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" msgstr "не вдалося визначити розмір тимчасового файлу \"%s\" з BufFile \"%s\": %m" -#: storage/file/fd.c:508 storage/file/fd.c:580 storage/file/fd.c:616 +#: storage/file/buffile.c:884 +#, c-format +msgid "could not delete shared fileset \"%s\": %m" +msgstr "не вдалося видалити спільний набір файлів \"%s\": %m" + +#: storage/file/buffile.c:902 storage/smgr/md.c:306 storage/smgr/md.c:865 +#, c-format +msgid "could not truncate file \"%s\": %m" +msgstr "не вдалося скоротити файл \"%s\": %m" + +#: storage/file/fd.c:515 storage/file/fd.c:587 storage/file/fd.c:623 #, c-format msgid "could not flush dirty data: %m" msgstr "не вдалося очистити \"брудні\" дані: %m" -#: storage/file/fd.c:538 +#: storage/file/fd.c:545 #, c-format msgid "could not determine dirty data size: %m" msgstr "не вдалося визначити розмір \"брудних\" даних: %m" -#: storage/file/fd.c:590 +#: storage/file/fd.c:597 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "не вдалося munmap() під час очищення даних: %m" -#: storage/file/fd.c:798 +#: storage/file/fd.c:836 #, c-format msgid "could not link file \"%s\" to \"%s\": %m" msgstr "для файлу \"%s\" не вдалося створити посилання \"%s\": %m" -#: storage/file/fd.c:881 +#: storage/file/fd.c:929 #, c-format msgid "getrlimit failed: %m" msgstr "помилка getrlimit: %m" -#: storage/file/fd.c:971 +#: storage/file/fd.c:1019 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "недостатньо доступних дескрипторів файлу для запуску серверного процесу" -#: storage/file/fd.c:972 +#: storage/file/fd.c:1020 #, c-format msgid "System allows %d, we need at least %d." msgstr "Система дозволяє %d, потрібно щонайменше %d." -#: storage/file/fd.c:1023 storage/file/fd.c:2357 storage/file/fd.c:2467 -#: storage/file/fd.c:2618 +#: storage/file/fd.c:1071 storage/file/fd.c:2408 storage/file/fd.c:2518 +#: storage/file/fd.c:2669 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "нестача дескрипторів файлу: %m; вивільніть і спробуйте знову" -#: storage/file/fd.c:1397 +#: storage/file/fd.c:1445 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "тимчасовий файл: шлях \"%s\", розмір %lu" -#: storage/file/fd.c:1528 +#: storage/file/fd.c:1576 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "неможливо створити тимчасовий каталог \"%s\": %m" -#: storage/file/fd.c:1535 +#: storage/file/fd.c:1583 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "неможливо створити тимчасовий підкаталог \"%s\": %m" -#: storage/file/fd.c:1728 +#: storage/file/fd.c:1776 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "неможливо створити тимчасовий файл \"%s\": %m" -#: storage/file/fd.c:1763 +#: storage/file/fd.c:1810 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "неможливо відкрити тимчасовий файл \"%s\": %m" -#: storage/file/fd.c:1804 +#: storage/file/fd.c:1851 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "помилка видалення тимчасового файлу \"%s\": %m" -#: storage/file/fd.c:2068 +#: storage/file/fd.c:1939 +#, c-format +msgid "could not delete file \"%s\": %m" +msgstr "не вдалося видалити файл \"%s\": %m" + +#: storage/file/fd.c:2119 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "розмір тимчасового файлу перевищує temp_file_limit (%d Кб)" -#: storage/file/fd.c:2333 storage/file/fd.c:2392 +#: storage/file/fd.c:2384 storage/file/fd.c:2443 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "перевищено maxAllocatedDescs (%d) при спробі відкрити файл \"%s\"" -#: storage/file/fd.c:2437 +#: storage/file/fd.c:2488 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "перевищено maxAllocatedDescs (%d) при спробі виконати команду \"%s\"" -#: storage/file/fd.c:2594 +#: storage/file/fd.c:2645 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "перевищено maxAllocatedDescs (%d) при спробі відкрити каталог \"%s\"" -#: storage/file/fd.c:3122 +#: storage/file/fd.c:3175 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "знайдено неочікуваний файл в каталозі тимчасових файлів: \"%s\"" -#: storage/file/sharedfileset.c:111 +#: storage/file/fd.c:3304 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не вдалося синхронізувати файлову систему для файлу \"%s\": %m" + +#: storage/file/sharedfileset.c:144 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "не вдалося підключитися до вже знищеному набору SharedFileSet" -#: storage/ipc/dsm.c:338 +#: storage/ipc/dsm.c:351 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "сегмент керування динамічної спільної пам'яті пошкоджений" -#: storage/ipc/dsm.c:399 +#: storage/ipc/dsm.c:415 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "сегмент керування динамічної спільної пам'яті недійсний" -#: storage/ipc/dsm.c:494 +#: storage/ipc/dsm.c:592 #, c-format msgid "too many dynamic shared memory segments" msgstr "занадто багато сегментів динамічної спільної пам'яті" -#: storage/ipc/dsm_impl.c:230 storage/ipc/dsm_impl.c:526 -#: storage/ipc/dsm_impl.c:630 storage/ipc/dsm_impl.c:801 +#: storage/ipc/dsm_impl.c:233 storage/ipc/dsm_impl.c:529 +#: storage/ipc/dsm_impl.c:633 storage/ipc/dsm_impl.c:804 #, c-format msgid "could not unmap shared memory segment \"%s\": %m" msgstr "не вдалося звільнити сегмент спільної пам'яті \"%s\": %m" -#: storage/ipc/dsm_impl.c:240 storage/ipc/dsm_impl.c:536 -#: storage/ipc/dsm_impl.c:640 storage/ipc/dsm_impl.c:811 +#: storage/ipc/dsm_impl.c:243 storage/ipc/dsm_impl.c:539 +#: storage/ipc/dsm_impl.c:643 storage/ipc/dsm_impl.c:814 #, c-format msgid "could not remove shared memory segment \"%s\": %m" msgstr "не вдалося видалити сегмент спільної пам'яті \"%s\": %m" -#: storage/ipc/dsm_impl.c:264 storage/ipc/dsm_impl.c:711 -#: storage/ipc/dsm_impl.c:825 +#: storage/ipc/dsm_impl.c:267 storage/ipc/dsm_impl.c:714 +#: storage/ipc/dsm_impl.c:828 #, c-format msgid "could not open shared memory segment \"%s\": %m" msgstr "не вдалося відкрити сегмент спільної пам'яті \"%s\": %m" -#: storage/ipc/dsm_impl.c:289 storage/ipc/dsm_impl.c:552 -#: storage/ipc/dsm_impl.c:756 storage/ipc/dsm_impl.c:849 +#: storage/ipc/dsm_impl.c:292 storage/ipc/dsm_impl.c:555 +#: storage/ipc/dsm_impl.c:759 storage/ipc/dsm_impl.c:852 #, c-format msgid "could not stat shared memory segment \"%s\": %m" msgstr "не вдалося звернутися до сегменту спільної пам'яті \"%s\": %m" -#: storage/ipc/dsm_impl.c:316 storage/ipc/dsm_impl.c:900 +#: storage/ipc/dsm_impl.c:319 storage/ipc/dsm_impl.c:903 #, c-format msgid "could not resize shared memory segment \"%s\" to %zu bytes: %m" msgstr "не вдалося змінити розмір сегменту спільної пам'яті \"%s\" до %zu байтів: %m" -#: storage/ipc/dsm_impl.c:338 storage/ipc/dsm_impl.c:573 -#: storage/ipc/dsm_impl.c:732 storage/ipc/dsm_impl.c:922 +#: storage/ipc/dsm_impl.c:341 storage/ipc/dsm_impl.c:576 +#: storage/ipc/dsm_impl.c:735 storage/ipc/dsm_impl.c:925 #, c-format msgid "could not map shared memory segment \"%s\": %m" msgstr "не вдалося показати сегмент спільної пам'яті \"%s\": %m" -#: storage/ipc/dsm_impl.c:508 +#: storage/ipc/dsm_impl.c:511 #, c-format msgid "could not get shared memory segment: %m" msgstr "не вдалося отримати сегмент спільної пам'яті: %m" -#: storage/ipc/dsm_impl.c:696 +#: storage/ipc/dsm_impl.c:699 #, c-format msgid "could not create shared memory segment \"%s\": %m" msgstr "не вдалося створити сегмент спільної пам'яті \"%s\": %m" -#: storage/ipc/dsm_impl.c:933 +#: storage/ipc/dsm_impl.c:936 #, c-format msgid "could not close shared memory segment \"%s\": %m" msgstr "не вдалося закрити сегмент спільної пам'яті \"%s\": %m" -#: storage/ipc/dsm_impl.c:972 storage/ipc/dsm_impl.c:1020 +#: storage/ipc/dsm_impl.c:975 storage/ipc/dsm_impl.c:1023 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "не вдалося продублювати маркер для \"%s\": %m" -#. translator: %s is a syscall name, such as "poll()" -#: storage/ipc/latch.c:940 storage/ipc/latch.c:1094 storage/ipc/latch.c:1307 -#: storage/ipc/latch.c:1457 storage/ipc/latch.c:1570 -#, c-format -msgid "%s failed: %m" -msgstr "%s помилка: %m" - -#: storage/ipc/procarray.c:3014 +#: storage/ipc/procarray.c:3789 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "база даних \"%s\" використовується підготовленими транзакціями" -#: storage/ipc/procarray.c:3046 storage/ipc/signalfuncs.c:142 +#: storage/ipc/procarray.c:3821 storage/ipc/signalfuncs.c:221 #, c-format msgid "must be a superuser to terminate superuser process" msgstr "щоб припинити процес суперкористувача потрібно бути суперкористувачем" -#: storage/ipc/procarray.c:3053 storage/ipc/signalfuncs.c:147 +#: storage/ipc/procarray.c:3828 storage/ipc/signalfuncs.c:226 #, c-format msgid "must be a member of the role whose process is being terminated or member of pg_signal_backend" msgstr "потрібно бути учасником ролі, процес котрої припиняється або учасником pg_signal_backend" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:982 -#: storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 storage/lmgr/lock.c:4175 -#: storage/lmgr/lock.c:4240 storage/lmgr/lock.c:4532 -#: storage/lmgr/predicate.c:2401 storage/lmgr/predicate.c:2416 -#: storage/lmgr/predicate.c:3898 storage/lmgr/predicate.c:5009 -#: utils/hash/dynahash.c:1067 +#: storage/ipc/shm_mq.c:368 +#, c-format +msgid "cannot send a message of size %zu via shared memory queue" +msgstr "не можна надсилати повідомлення розміру %zu через чергу спільної пам'яті" + +#: storage/ipc/shm_mq.c:694 +#, c-format +msgid "invalid message size %zu in shared memory queue" +msgstr "неприпустимий розмір повідомлення %zu в черзі спільної пам'яті" + +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:981 +#: storage/lmgr/lock.c:1019 storage/lmgr/lock.c:2844 storage/lmgr/lock.c:4254 +#: storage/lmgr/lock.c:4319 storage/lmgr/lock.c:4626 +#: storage/lmgr/predicate.c:2470 storage/lmgr/predicate.c:2485 +#: storage/lmgr/predicate.c:3967 storage/lmgr/predicate.c:5078 +#: utils/hash/dynahash.c:1112 #, c-format msgid "out of shared memory" msgstr "нестача спільної пам'яті" @@ -19566,72 +20276,130 @@ msgstr "нестача спільної пам'яті" msgid "out of shared memory (%zu bytes requested)" msgstr "нестача спільної пам'яті (потребується %zu байт)" -#: storage/ipc/shmem.c:441 +#: storage/ipc/shmem.c:445 #, c-format msgid "could not create ShmemIndex entry for data structure \"%s\"" msgstr "не вдалося створити введення ShmemIndex для структури даних \"%s\"" -#: storage/ipc/shmem.c:456 +#: storage/ipc/shmem.c:460 #, c-format msgid "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, actual %zu" msgstr "розмір введення ShmemIndex є неправильним для структури даних \"%s\": очікувано %zu, фактично %zu" -#: storage/ipc/shmem.c:475 +#: storage/ipc/shmem.c:479 #, c-format msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" msgstr "недостатньо спільної пам'яті для структури даних \"%s\" (потрібно було %zu байтів)" -#: storage/ipc/shmem.c:507 storage/ipc/shmem.c:526 +#: storage/ipc/shmem.c:511 storage/ipc/shmem.c:530 #, c-format msgid "requested shared memory size overflows size_t" msgstr "запитаний сегмент спільної пам'яті не вміщається в size_t" -#: storage/ipc/signalfuncs.c:67 +#: storage/ipc/signalfuncs.c:68 utils/adt/mcxtfuncs.c:204 #, c-format msgid "PID %d is not a PostgreSQL server process" msgstr "PID %d не є серверним процесом PostgreSQL" -#: storage/ipc/signalfuncs.c:98 storage/lmgr/proc.c:1366 +#: storage/ipc/signalfuncs.c:99 storage/lmgr/proc.c:1454 +#: utils/adt/mcxtfuncs.c:212 #, c-format msgid "could not send signal to process %d: %m" msgstr "не вдалося надіслати сигнал процесу %d: %m" -#: storage/ipc/signalfuncs.c:118 +#: storage/ipc/signalfuncs.c:119 #, c-format msgid "must be a superuser to cancel superuser query" msgstr "щоб скасувати запит суперкористувача потрібно бути суперкористувачем" -#: storage/ipc/signalfuncs.c:123 +#: storage/ipc/signalfuncs.c:124 #, c-format msgid "must be a member of the role whose query is being canceled or member of pg_signal_backend" msgstr "потрібно бути учасником ролі, запит котрої скасовується, або учасником pg_signal_backend" +#: storage/ipc/signalfuncs.c:165 +#, c-format +msgid "could not check the existence of the backend with PID %d: %m" +msgstr "не вдалося перевірити наявність процесу з PID %d: %m" + #: storage/ipc/signalfuncs.c:183 #, c-format +msgid "backend with PID %d did not terminate within %lld millisecond" +msgid_plural "backend with PID %d did not terminate within %lld milliseconds" +msgstr[0] "процес з PID %d не завершився протягом %lld мілісекунди" +msgstr[1] "процес з PID %d не завершився протягом %lld мілісекунд" +msgstr[2] "процес з PID %d не завершився протягом %lld мілісекунд" +msgstr[3] "процес з PID %d не завершився протягом %lld мілісекунд" + +#: storage/ipc/signalfuncs.c:214 +#, c-format +msgid "\"timeout\" must not be negative" +msgstr "\"timeout\" повинен не може бути негативним" + +#: storage/ipc/signalfuncs.c:266 +#, c-format msgid "must be superuser to rotate log files with adminpack 1.0" msgstr "прокручувати файли протоколів використовуючи adminpack 1.0, може лише суперкористувач" #. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:185 utils/adt/genfile.c:253 +#: storage/ipc/signalfuncs.c:268 utils/adt/genfile.c:255 #, c-format msgid "Consider using %s, which is part of core, instead." msgstr "Розгляньте використання %s, що є частиною ядра." -#: storage/ipc/signalfuncs.c:191 storage/ipc/signalfuncs.c:211 +#: storage/ipc/signalfuncs.c:274 storage/ipc/signalfuncs.c:294 #, c-format msgid "rotation not possible because log collection not active" msgstr "обертання неможливе тому, що записування колекції не активоване" -#: storage/ipc/standby.c:580 tcop/postgres.c:3177 +#: storage/ipc/standby.c:305 +#, c-format +msgid "recovery still waiting after %ld.%03d ms: %s" +msgstr "відновлення все ще чекає, після %ld.%03d мс: %s" + +#: storage/ipc/standby.c:314 +#, c-format +msgid "recovery finished waiting after %ld.%03d ms: %s" +msgstr "відновлення закінчило очікування після %ld.%03d мс: %s" + +#: storage/ipc/standby.c:878 tcop/postgres.c:3317 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "виконання оператора скасовано через конфлікт з процесом відновлення" -#: storage/ipc/standby.c:581 tcop/postgres.c:2469 +#: storage/ipc/standby.c:879 tcop/postgres.c:2471 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "Транзакція користувача призвела до взаємного блокування з процесом відновлення." +#: storage/ipc/standby.c:1421 +msgid "unknown reason" +msgstr "невідома причина" + +#: storage/ipc/standby.c:1426 +msgid "recovery conflict on buffer pin" +msgstr "конфлікт відновлення, закріпленого в буфері" + +#: storage/ipc/standby.c:1429 +msgid "recovery conflict on lock" +msgstr "конфлікт відновлення при блокуванні" + +#: storage/ipc/standby.c:1432 +msgid "recovery conflict on tablespace" +msgstr "конфлікт відновлення у табличному просторі" + +#: storage/ipc/standby.c:1435 +msgid "recovery conflict on snapshot" +msgstr "конфлікт відновлення під час знімку" + +#: storage/ipc/standby.c:1438 +msgid "recovery conflict on buffer deadlock" +msgstr "конфлікт відновлення при взаємному блокуванні буфера" + +#: storage/ipc/standby.c:1441 +msgid "recovery conflict on database" +msgstr "конфлікт відновлення у базі даних" + #: storage/large_object/inv_api.c:191 #, c-format msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" @@ -19652,62 +20420,62 @@ msgstr "неприпустиме значення орієнтиру: %d" msgid "invalid large object write request size: %d" msgstr "неприпустимий розмір запису великого об'єкту: %d" -#: storage/lmgr/deadlock.c:1124 +#: storage/lmgr/deadlock.c:1122 #, c-format msgid "Process %d waits for %s on %s; blocked by process %d." msgstr "Процес %d очікує в режимі %s блокування \"%s\"; заблокований процесом %d." -#: storage/lmgr/deadlock.c:1143 +#: storage/lmgr/deadlock.c:1141 #, c-format msgid "Process %d: %s" msgstr "Процес %d: %s" -#: storage/lmgr/deadlock.c:1152 +#: storage/lmgr/deadlock.c:1150 #, c-format msgid "deadlock detected" msgstr "виявлено взаємне блокування" -#: storage/lmgr/deadlock.c:1155 +#: storage/lmgr/deadlock.c:1153 #, c-format msgid "See server log for query details." msgstr "Подробиці запиту перегляньте в записі серверу." -#: storage/lmgr/lmgr.c:830 +#: storage/lmgr/lmgr.c:831 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "при оновленні кортежу (%u,%u) в зв'язку \"%s\"" -#: storage/lmgr/lmgr.c:833 +#: storage/lmgr/lmgr.c:834 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "при видаленні кортежу (%u,%u) в зв'язку \"%s\"" -#: storage/lmgr/lmgr.c:836 +#: storage/lmgr/lmgr.c:837 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "при блокуванні кортежу (%u,%u) в зв'язку \"%s\"" -#: storage/lmgr/lmgr.c:839 +#: storage/lmgr/lmgr.c:840 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "при блокуванні оновленої версії (%u,%u) кортежу в зв'язку \"%s\"" -#: storage/lmgr/lmgr.c:842 +#: storage/lmgr/lmgr.c:843 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "при вставці кортежу індексу (%u,%u) в зв'язку \"%s\"" -#: storage/lmgr/lmgr.c:845 +#: storage/lmgr/lmgr.c:846 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "під час перевірки унікальності кортежа (%u,%u) у відношенні \"%s\"" -#: storage/lmgr/lmgr.c:848 +#: storage/lmgr/lmgr.c:849 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "під час повторної перевірки оновленого кортежа (%u,%u) у відношенні \"%s\"" -#: storage/lmgr/lmgr.c:851 +#: storage/lmgr/lmgr.c:852 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "під час перевірки обмеження-виключення для кортежа (%u,%u) у відношенні \"%s\"" @@ -19772,23 +20540,23 @@ msgstr "рекомендаційне блокування [%u,%u,%u,%u]" msgid "unrecognized locktag type %d" msgstr "нерозпізнаний тип блокування %d" -#: storage/lmgr/lock.c:803 +#: storage/lmgr/lock.c:802 #, c-format msgid "cannot acquire lock mode %s on database objects while recovery is in progress" msgstr "поки виконується відновлення, не можна отримати блокування об'єктів бази даних в режимі %s" -#: storage/lmgr/lock.c:805 +#: storage/lmgr/lock.c:804 #, c-format msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." msgstr "Під час процесу відновлення для об'єктів бази даних може бути отримане лише блокування RowExclusiveLock або менш сильна." -#: storage/lmgr/lock.c:983 storage/lmgr/lock.c:1021 storage/lmgr/lock.c:2846 -#: storage/lmgr/lock.c:4176 storage/lmgr/lock.c:4241 storage/lmgr/lock.c:4533 +#: storage/lmgr/lock.c:982 storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 +#: storage/lmgr/lock.c:4255 storage/lmgr/lock.c:4320 storage/lmgr/lock.c:4627 #, c-format msgid "You might need to increase max_locks_per_transaction." msgstr "Можливо, слід збільшити параметр max_locks_per_transaction." -#: storage/lmgr/lock.c:3292 storage/lmgr/lock.c:3408 +#: storage/lmgr/lock.c:3296 storage/lmgr/lock.c:3364 storage/lmgr/lock.c:3480 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" msgstr "не можна виконати PREPARE, під час утримання блокування на рівні сеансу і на рівні транзакції для одного об'єкта" @@ -19808,564 +20576,553 @@ msgstr "Можливо, вам слід виконувати менше тран msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "в RWConflictPool недостатньо елементів для запису про потенціальний конфлікт читання/запису" -#: storage/lmgr/predicate.c:1535 -#, c-format -msgid "deferrable snapshot was unsafe; trying a new one" -msgstr "знімок, який відкладається, був небезпечним; пробуємо новий" - -#: storage/lmgr/predicate.c:1624 +#: storage/lmgr/predicate.c:1694 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "параметр \"default_transaction_isolation\" має значення \"serializable\"." -#: storage/lmgr/predicate.c:1625 +#: storage/lmgr/predicate.c:1695 #, c-format msgid "You can use \"SET default_transaction_isolation = 'repeatable read'\" to change the default." msgstr "Ви можете використати \"SET default_transaction_isolation = 'repeatable read'\" щоб змінити режим за замовчуванням." -#: storage/lmgr/predicate.c:1676 +#: storage/lmgr/predicate.c:1746 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "транзакція, яка імпортує знімок не повинна бутив READ ONLY DEFERRABLE" -#: storage/lmgr/predicate.c:1755 utils/time/snapmgr.c:623 -#: utils/time/snapmgr.c:629 +#: storage/lmgr/predicate.c:1825 utils/time/snapmgr.c:567 +#: utils/time/snapmgr.c:573 #, c-format msgid "could not import the requested snapshot" msgstr "не вдалося імпортувати запитаний знімок" -#: storage/lmgr/predicate.c:1756 utils/time/snapmgr.c:630 +#: storage/lmgr/predicate.c:1826 utils/time/snapmgr.c:574 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "Вихідний процес з PID %d вже не виконується." -#: storage/lmgr/predicate.c:2402 storage/lmgr/predicate.c:2417 -#: storage/lmgr/predicate.c:3899 +#: storage/lmgr/predicate.c:2471 storage/lmgr/predicate.c:2486 +#: storage/lmgr/predicate.c:3968 #, c-format msgid "You might need to increase max_pred_locks_per_transaction." msgstr "Можливо, вам слід збільшити параметр max_pred_locks_per_transaction." -#: storage/lmgr/predicate.c:4030 storage/lmgr/predicate.c:4066 -#: storage/lmgr/predicate.c:4099 storage/lmgr/predicate.c:4107 -#: storage/lmgr/predicate.c:4146 storage/lmgr/predicate.c:4388 -#: storage/lmgr/predicate.c:4725 storage/lmgr/predicate.c:4737 -#: storage/lmgr/predicate.c:4780 storage/lmgr/predicate.c:4818 +#: storage/lmgr/predicate.c:4099 storage/lmgr/predicate.c:4135 +#: storage/lmgr/predicate.c:4168 storage/lmgr/predicate.c:4176 +#: storage/lmgr/predicate.c:4215 storage/lmgr/predicate.c:4457 +#: storage/lmgr/predicate.c:4794 storage/lmgr/predicate.c:4806 +#: storage/lmgr/predicate.c:4849 storage/lmgr/predicate.c:4887 #, c-format msgid "could not serialize access due to read/write dependencies among transactions" msgstr "не вдалося серіалізувати доступ через залежність читання/запису серед транзакцій" -#: storage/lmgr/predicate.c:4032 storage/lmgr/predicate.c:4068 -#: storage/lmgr/predicate.c:4101 storage/lmgr/predicate.c:4109 -#: storage/lmgr/predicate.c:4148 storage/lmgr/predicate.c:4390 -#: storage/lmgr/predicate.c:4727 storage/lmgr/predicate.c:4739 -#: storage/lmgr/predicate.c:4782 storage/lmgr/predicate.c:4820 +#: storage/lmgr/predicate.c:4101 storage/lmgr/predicate.c:4137 +#: storage/lmgr/predicate.c:4170 storage/lmgr/predicate.c:4178 +#: storage/lmgr/predicate.c:4217 storage/lmgr/predicate.c:4459 +#: storage/lmgr/predicate.c:4796 storage/lmgr/predicate.c:4808 +#: storage/lmgr/predicate.c:4851 storage/lmgr/predicate.c:4889 #, c-format msgid "The transaction might succeed if retried." msgstr "Транзакція може завершитися успішно, якщо повторити спробу." -#: storage/lmgr/proc.c:358 +#: storage/lmgr/proc.c:357 #, c-format msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" msgstr "кількість запитаних підключень резервного серверу перевищує max_wal_senders (поточна %d)" -#: storage/lmgr/proc.c:1337 -#, c-format -msgid "Process %d waits for %s on %s." -msgstr "Процес %d очікує в режимі %s блокування %s." - -#: storage/lmgr/proc.c:1348 -#, c-format -msgid "sending cancel to blocking autovacuum PID %d" -msgstr "зняття блокуючого процесу автоочистки PID %d" - -#: storage/lmgr/proc.c:1468 +#: storage/lmgr/proc.c:1551 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "процес %d уникнув взаємного блокування, чекаючи в режимі %s блокування %s змінивши порядок черги після %ld.%03d мс" -#: storage/lmgr/proc.c:1483 +#: storage/lmgr/proc.c:1566 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "процес %d виявив взаємне блокування, чекаючи в режимі %s блокування %s після %ld.%03d мс" -#: storage/lmgr/proc.c:1492 +#: storage/lmgr/proc.c:1575 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "процес %d все ще чекає в режимі %s блокування %s після %ld.%03d мс" -#: storage/lmgr/proc.c:1499 +#: storage/lmgr/proc.c:1582 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "процес %d отримав в режимі %s блокування %s після %ld.%03d мс" -#: storage/lmgr/proc.c:1515 +#: storage/lmgr/proc.c:1599 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "процес %d не зміг отримати в режимі %s блокування %s після %ld.%03d мс" -#: storage/page/bufpage.c:145 +#: storage/page/bufpage.c:152 #, c-format msgid "page verification failed, calculated checksum %u but expected %u" msgstr "помилка перевірки сторінки, обчислена контрольна сума %u але очікувалось %u" -#: storage/page/bufpage.c:209 storage/page/bufpage.c:503 -#: storage/page/bufpage.c:740 storage/page/bufpage.c:873 -#: storage/page/bufpage.c:969 storage/page/bufpage.c:1081 +#: storage/page/bufpage.c:217 storage/page/bufpage.c:739 +#: storage/page/bufpage.c:1066 storage/page/bufpage.c:1201 +#: storage/page/bufpage.c:1307 storage/page/bufpage.c:1419 #, c-format msgid "corrupted page pointers: lower = %u, upper = %u, special = %u" msgstr "пошкоджені вказівники сторінки: нижній = %u, верхній = %u, спеціальний = %u" -#: storage/page/bufpage.c:525 +#: storage/page/bufpage.c:768 #, c-format msgid "corrupted line pointer: %u" msgstr "пошкоджений вказівник рядка: %u" -#: storage/page/bufpage.c:552 storage/page/bufpage.c:924 +#: storage/page/bufpage.c:795 storage/page/bufpage.c:1259 #, c-format msgid "corrupted item lengths: total %u, available space %u" msgstr "пошкоджена довжина елементу: загальний розмір %u, доступний розмір %u" -#: storage/page/bufpage.c:759 storage/page/bufpage.c:897 -#: storage/page/bufpage.c:985 storage/page/bufpage.c:1097 +#: storage/page/bufpage.c:1085 storage/page/bufpage.c:1226 +#: storage/page/bufpage.c:1323 storage/page/bufpage.c:1435 #, c-format msgid "corrupted line pointer: offset = %u, size = %u" msgstr "пошкоджений вказівник рядка: зсув = %u, розмір = %u" -#: storage/smgr/md.c:333 storage/smgr/md.c:836 -#, c-format -msgid "could not truncate file \"%s\": %m" -msgstr "не вдалося скоротити файл \"%s\": %m" - -#: storage/smgr/md.c:407 +#: storage/smgr/md.c:434 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "не можна розширити файл \"%s\" до блоку %u" -#: storage/smgr/md.c:422 +#: storage/smgr/md.c:449 #, c-format msgid "could not extend file \"%s\": %m" msgstr "не вдалося розширити файл \"%s\": %m" -#: storage/smgr/md.c:424 storage/smgr/md.c:431 storage/smgr/md.c:719 +#: storage/smgr/md.c:451 storage/smgr/md.c:458 storage/smgr/md.c:746 #, c-format msgid "Check free disk space." msgstr "Перевірьте вільний дисковий простір." -#: storage/smgr/md.c:428 +#: storage/smgr/md.c:455 #, c-format msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgstr "не вдалося розширити файл \"%s\" записано лише %d з %d байт в блоку %u" -#: storage/smgr/md.c:640 +#: storage/smgr/md.c:667 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "не вдалося прочитати блок %u в файлі \"%s\": %m" -#: storage/smgr/md.c:656 +#: storage/smgr/md.c:683 #, c-format msgid "could not read block %u in file \"%s\": read only %d of %d bytes" msgstr "не вдалося прочитати блок %u в файлі \"%s\": прочитано лише %d з %d байт" -#: storage/smgr/md.c:710 +#: storage/smgr/md.c:737 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "не вдалося записати блок %u у файл \"%s\": %m" -#: storage/smgr/md.c:715 +#: storage/smgr/md.c:742 #, c-format msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" msgstr "не вдалося записати блок %u в файл \"%s\": записано лише %d з %d байт" -#: storage/smgr/md.c:807 +#: storage/smgr/md.c:836 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "не вдалося скоротити файл \"%s\" до %u блоків: лише %u блоків зараз" -#: storage/smgr/md.c:862 +#: storage/smgr/md.c:891 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "не вдалося скоротити файл \"%s\" до %u блоків: %m" -#: storage/smgr/md.c:957 -#, c-format -msgid "could not forward fsync request because request queue is full" -msgstr "не вдалося переслати запит синхронізації, тому, що черга запитів переповнена" - -#: storage/smgr/md.c:1256 +#: storage/smgr/md.c:1285 #, c-format msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" msgstr "не вдалося відкрити файл \"%s\" (цільовий блок %u): попередній сегмент має лише %u блоків" -#: storage/smgr/md.c:1270 +#: storage/smgr/md.c:1299 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "не вдалося відкрити файл \"%s\" (цільовий блок %u): %m" -#: storage/sync/sync.c:401 -#, c-format -msgid "could not fsync file \"%s\" but retrying: %m" -msgstr "не вдалося синхронізувати файл \"%s\" але триває повторна спроба: %m" - -#: tcop/fastpath.c:109 tcop/fastpath.c:461 tcop/fastpath.c:591 +#: tcop/fastpath.c:148 #, c-format -msgid "invalid argument size %d in function call message" -msgstr "неприпустимий розмір аргументу %d в повідомленні виклику функції" +msgid "cannot call function \"%s\" via fastpath interface" +msgstr "неможливо викликати функцію \"%s\" через інтерфейс fastpath" -#: tcop/fastpath.c:307 +#: tcop/fastpath.c:233 #, c-format msgid "fastpath function call: \"%s\" (OID %u)" msgstr "виклик функції fastpath: \"%s\" (OID %u)" -#: tcop/fastpath.c:389 tcop/postgres.c:1323 tcop/postgres.c:1581 -#: tcop/postgres.c:2013 tcop/postgres.c:2250 +#: tcop/fastpath.c:312 tcop/postgres.c:1298 tcop/postgres.c:1556 +#: tcop/postgres.c:2015 tcop/postgres.c:2252 #, c-format msgid "duration: %s ms" msgstr "тривалість: %s мс" -#: tcop/fastpath.c:393 +#: tcop/fastpath.c:316 #, c-format msgid "duration: %s ms fastpath function call: \"%s\" (OID %u)" msgstr "тривалість: %s мс, виклик функції fastpath: \"%s\" (OID %u)" -#: tcop/fastpath.c:429 tcop/fastpath.c:556 +#: tcop/fastpath.c:352 #, c-format msgid "function call message contains %d arguments but function requires %d" msgstr "повідомлення виклику функції містить %d аргументів, але функція потребує %d" -#: tcop/fastpath.c:437 +#: tcop/fastpath.c:360 #, c-format msgid "function call message contains %d argument formats but %d arguments" msgstr "повідомлення виклику функції містить %d форматів, але %d аргументів" -#: tcop/fastpath.c:524 tcop/fastpath.c:607 +#: tcop/fastpath.c:384 #, c-format -msgid "incorrect binary data format in function argument %d" -msgstr "неправильний формат двійкових даних в аргументі функції %d" +msgid "invalid argument size %d in function call message" +msgstr "неприпустимий розмір аргументу %d в повідомленні виклику функції" -#: tcop/postgres.c:355 tcop/postgres.c:391 tcop/postgres.c:418 +#: tcop/fastpath.c:447 #, c-format -msgid "unexpected EOF on client connection" -msgstr "неочікуваний обрив з'єднання з клієнтом" +msgid "incorrect binary data format in function argument %d" +msgstr "неправильний формат двійкових даних в аргументі функції %d" -#: tcop/postgres.c:441 tcop/postgres.c:453 tcop/postgres.c:464 -#: tcop/postgres.c:476 tcop/postgres.c:4539 +#: tcop/postgres.c:446 tcop/postgres.c:4716 #, c-format msgid "invalid frontend message type %d" msgstr "неприпустимий тип клієнтського повідомлення %d" -#: tcop/postgres.c:1042 +#: tcop/postgres.c:1015 #, c-format msgid "statement: %s" msgstr "оператор: %s" -#: tcop/postgres.c:1328 +#: tcop/postgres.c:1303 #, c-format msgid "duration: %s ms statement: %s" msgstr "тривалість: %s мс, оператор: %s" -#: tcop/postgres.c:1377 -#, c-format -msgid "parse %s: %s" -msgstr "аналізування %s: %s" - -#: tcop/postgres.c:1434 +#: tcop/postgres.c:1409 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "до підтготовленого оператору не можна вставити декілька команд" -#: tcop/postgres.c:1586 +#: tcop/postgres.c:1561 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "тривалість: %s мс, аналізування %s: %s" -#: tcop/postgres.c:1633 -#, c-format -msgid "bind %s to %s" -msgstr "прив'язка %s до %s" - -#: tcop/postgres.c:1652 tcop/postgres.c:2516 +#: tcop/postgres.c:1627 tcop/postgres.c:2567 #, c-format msgid "unnamed prepared statement does not exist" msgstr "підготовлений оператор без імені не існує" -#: tcop/postgres.c:1693 +#: tcop/postgres.c:1668 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "повідомлення bind має %d форматів, але %d параметрів" -#: tcop/postgres.c:1699 +#: tcop/postgres.c:1674 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "в повідомленні bind передано %d параметрів, але підготовлений оператор \"%s\" потребує %d" -#: tcop/postgres.c:1897 +#: tcop/postgres.c:1893 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "невірний формат двійкових даних в параметрі bind %d" -#: tcop/postgres.c:2018 +#: tcop/postgres.c:2020 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "тривалість: %s мс, повідомлення bind %s%s%s: %s" -#: tcop/postgres.c:2068 tcop/postgres.c:2600 +#: tcop/postgres.c:2070 tcop/postgres.c:2651 #, c-format msgid "portal \"%s\" does not exist" msgstr "портал \"%s\" не існує" -#: tcop/postgres.c:2153 +#: tcop/postgres.c:2155 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2155 tcop/postgres.c:2258 +#: tcop/postgres.c:2157 tcop/postgres.c:2260 msgid "execute fetch from" msgstr "виконати витягнення з" -#: tcop/postgres.c:2156 tcop/postgres.c:2259 +#: tcop/postgres.c:2158 tcop/postgres.c:2261 msgid "execute" msgstr "виконувати" -#: tcop/postgres.c:2255 +#: tcop/postgres.c:2257 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "тривалість: %s мс %s %s%s%s: %s" -#: tcop/postgres.c:2401 +#: tcop/postgres.c:2403 #, c-format msgid "prepare: %s" msgstr "підготовка: %s" -#: tcop/postgres.c:2426 +#: tcop/postgres.c:2428 #, c-format msgid "parameters: %s" msgstr "параметри: %s" -#: tcop/postgres.c:2441 +#: tcop/postgres.c:2443 #, c-format msgid "abort reason: recovery conflict" msgstr "причина переривання: конфлікт під час відновлення" -#: tcop/postgres.c:2457 +#: tcop/postgres.c:2459 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "Користувач утримував позначку спільного буферу занадто довго." -#: tcop/postgres.c:2460 +#: tcop/postgres.c:2462 #, c-format msgid "User was holding a relation lock for too long." msgstr "Користувач утримував блокування відношення занадто довго." -#: tcop/postgres.c:2463 +#: tcop/postgres.c:2465 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "Користувач використовував табличний простір який повинен бути видаленим." -#: tcop/postgres.c:2466 +#: tcop/postgres.c:2468 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "Запиту користувача потрібно було бачити версії рядків, які повинні бути видалені." -#: tcop/postgres.c:2472 +#: tcop/postgres.c:2474 #, c-format msgid "User was connected to a database that must be dropped." msgstr "Користувач був підключен до бази даних, яка повинна бути видалена." -#: tcop/postgres.c:2796 +#: tcop/postgres.c:2513 +#, c-format +msgid "portal \"%s\" parameter $%d = %s" +msgstr "параметр порталу \"%s\": $%d = %s" + +#: tcop/postgres.c:2516 +#, c-format +msgid "portal \"%s\" parameter $%d" +msgstr "параметр порталу \"%s\": $%d" + +#: tcop/postgres.c:2522 +#, c-format +msgid "unnamed portal parameter $%d = %s" +msgstr "параметр порталу без назви $%d = %s" + +#: tcop/postgres.c:2525 +#, c-format +msgid "unnamed portal parameter $%d" +msgstr "параметр порталу без назви $%d" + +#: tcop/postgres.c:2871 +#, c-format +msgid "terminating connection because of unexpected SIGQUIT signal" +msgstr "завершення підключення через неочікуваний сигнал SIGQUIT" + +#: tcop/postgres.c:2877 #, c-format msgid "terminating connection because of crash of another server process" msgstr "завершення підключення через аварійне завершення роботи іншого серверного процесу" -#: tcop/postgres.c:2797 +#: tcop/postgres.c:2878 #, c-format msgid "The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory." msgstr "Керуючий процес віддав команду цьому серверному процесу відкотити поточну транзакцію і завершитися, тому, що інший серверний процес завершився неправильно і можливо пошкодив спільну пам'ять." -#: tcop/postgres.c:2801 tcop/postgres.c:3107 +#: tcop/postgres.c:2882 tcop/postgres.c:3243 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "В цей момент ви можете повторно підключитися до бази даних і повторити вашу команду." -#: tcop/postgres.c:2883 +#: tcop/postgres.c:2889 +#, c-format +msgid "terminating connection due to immediate shutdown command" +msgstr "завершення підключення через команду негайного завершення роботи" + +#: tcop/postgres.c:2975 #, c-format msgid "floating-point exception" msgstr "виняток в операції з рухомою комою" -#: tcop/postgres.c:2884 +#: tcop/postgres.c:2976 #, c-format msgid "An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, such as division by zero." msgstr "Надійшло повідомлення про неприпустиму операцію з рухомою комою. Можливо, це значить, що результат виявився за діапазоном або виникла неприпустима операція, така як ділення на нуль." -#: tcop/postgres.c:3037 +#: tcop/postgres.c:3147 #, c-format msgid "canceling authentication due to timeout" msgstr "скасування автентифікації через тайм-аут" -#: tcop/postgres.c:3041 +#: tcop/postgres.c:3151 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "завершення процесу автоочистки по команді адміністратора" -#: tcop/postgres.c:3045 +#: tcop/postgres.c:3155 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "завершення обробника логічної реплікації по команді адміністратора" -#: tcop/postgres.c:3049 -#, c-format -msgid "logical replication launcher shutting down" -msgstr "процес запуску логічної реплікації зупинен" - -#: tcop/postgres.c:3062 tcop/postgres.c:3072 tcop/postgres.c:3105 +#: tcop/postgres.c:3172 tcop/postgres.c:3182 tcop/postgres.c:3241 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "завершення підключення через конфлікт з процесом відновлення" -#: tcop/postgres.c:3078 +#: tcop/postgres.c:3193 #, c-format msgid "terminating connection due to administrator command" msgstr "завершення підключення по команді адміністратора" -#: tcop/postgres.c:3088 +#: tcop/postgres.c:3224 #, c-format msgid "connection to client lost" msgstr "підключення до клієнта втрачено" -#: tcop/postgres.c:3154 +#: tcop/postgres.c:3294 #, c-format msgid "canceling statement due to lock timeout" msgstr "виконання оператора скасовано через тайм-аут блокування" -#: tcop/postgres.c:3161 +#: tcop/postgres.c:3301 #, c-format msgid "canceling statement due to statement timeout" msgstr "виконання оператора скасовано через тайм-аут" -#: tcop/postgres.c:3168 +#: tcop/postgres.c:3308 #, c-format msgid "canceling autovacuum task" msgstr "скасування завдання автоочистки" -#: tcop/postgres.c:3191 +#: tcop/postgres.c:3331 #, c-format msgid "canceling statement due to user request" msgstr "виконання оператора скасовано по запиту користувача" -#: tcop/postgres.c:3201 +#: tcop/postgres.c:3345 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "завершення підключення через тайм-аут бездіяльності в транзакції" -#: tcop/postgres.c:3318 +#: tcop/postgres.c:3356 +#, c-format +msgid "terminating connection due to idle-session timeout" +msgstr "завершення підключення через тайм-аут неактивного сеансу" + +#: tcop/postgres.c:3475 #, c-format msgid "stack depth limit exceeded" msgstr "перевищено ліміт глибини стека" -#: tcop/postgres.c:3319 +#: tcop/postgres.c:3476 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "Збільште параметр конфігурації \"max_stack_depth\" (поточне значення %d КБ), попередньо переконавшись, що ОС надає достатній розмір стеку." -#: tcop/postgres.c:3382 +#: tcop/postgres.c:3539 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "Значення \"max_stack_depth\" не повинно перевищувати %ld КБ." -#: tcop/postgres.c:3384 +#: tcop/postgres.c:3541 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "Збільшіть ліміт глибини стека в системі через команду \"ulimit -s\" або через локальний еквівалент." -#: tcop/postgres.c:3744 +#: tcop/postgres.c:3897 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "неприпустимий аргумент командного рядка для серверного процесу: %s" -#: tcop/postgres.c:3745 tcop/postgres.c:3751 +#: tcop/postgres.c:3898 tcop/postgres.c:3904 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Спробуйте \"%s --help\" для додаткової інформації." -#: tcop/postgres.c:3749 +#: tcop/postgres.c:3902 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: неприпустимий аргумент командного рядка: %s" -#: tcop/postgres.c:3811 +#: tcop/postgres.c:3965 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: ні база даних, ні ім'я користувача не вказані" -#: tcop/postgres.c:4447 +#: tcop/postgres.c:4618 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "неприпустимий підтип повідомлення CLOSE %d" -#: tcop/postgres.c:4482 +#: tcop/postgres.c:4653 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "неприпустимий підтип повідомлення DESCRIBE %d" -#: tcop/postgres.c:4560 +#: tcop/postgres.c:4737 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "виклики функції fastpath не підтримуються в підключенні реплікації" -#: tcop/postgres.c:4564 +#: tcop/postgres.c:4741 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "протокол розширених запитів не підтримується в підключенні реплікації" -#: tcop/postgres.c:4741 +#: tcop/postgres.c:4918 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" msgstr "відключення: час сеансу: %d:%02d:%02d.%03d користувач = %s база даних = %s хост = %s%s%s" -#: tcop/pquery.c:629 +#: tcop/pquery.c:636 #, c-format msgid "bind message has %d result formats but query has %d columns" msgstr "повідомлення bind має %d форматів, але запит має %d стовпців" -#: tcop/pquery.c:932 +#: tcop/pquery.c:939 #, c-format msgid "cursor can only scan forward" msgstr "курсор може сканувати лише вперед" -#: tcop/pquery.c:933 +#: tcop/pquery.c:940 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Оголосити з параметром SCROLL, щоб активувати зворотню розгортку." #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:413 +#: tcop/utility.c:414 #, c-format msgid "cannot execute %s in a read-only transaction" msgstr "не можна виконати %s в транзакції \"лише для читання\"" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:431 +#: tcop/utility.c:432 #, c-format msgid "cannot execute %s during a parallel operation" msgstr "не можна виконати %s під час паралельних операцій" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:450 +#: tcop/utility.c:451 #, c-format msgid "cannot execute %s during recovery" msgstr "не можна виконати %s під час відновлення" #. translator: %s is name of a SQL command, eg PREPARE -#: tcop/utility.c:468 +#: tcop/utility.c:469 #, c-format msgid "cannot execute %s within security-restricted operation" msgstr "не можна виконати %s в межах операції з обмеженнями безпеки" -#: tcop/utility.c:912 +#: tcop/utility.c:928 #, c-format msgid "must be superuser to do CHECKPOINT" msgstr "для виконання CHECKPOINT потрібно бути суперкористувачем" -#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:620 +#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 #, c-format msgid "multiple DictFile parameters" msgstr "повторюваний параметр DictFile" @@ -20385,7 +21142,7 @@ msgstr "нерозпізнаний параметр Ispell: \"%s\"" msgid "missing AffFile parameter" msgstr "пропущено параметр AffFile" -#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:644 +#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:639 #, c-format msgid "missing DictFile parameter" msgstr "пропущено параметр DictFile" @@ -20435,63 +21192,63 @@ msgstr "неочікуваний конець рядка або лексеми" msgid "unexpected end of line" msgstr "неочікуваний кінець рядка" -#: tsearch/dict_thesaurus.c:297 +#: tsearch/dict_thesaurus.c:292 #, c-format msgid "too many lexemes in thesaurus entry" msgstr "занадто багато лексем в елементі тезаурусу" -#: tsearch/dict_thesaurus.c:421 +#: tsearch/dict_thesaurus.c:416 #, c-format msgid "thesaurus sample word \"%s\" isn't recognized by subdictionary (rule %d)" msgstr "слова-зразка в тезаурусі \"%s\" немає у внутрішньому словнику (правило %d)" -#: tsearch/dict_thesaurus.c:427 +#: tsearch/dict_thesaurus.c:422 #, c-format msgid "thesaurus sample word \"%s\" is a stop word (rule %d)" msgstr "слово-зразок в тезаурусі \"%s\" має стоп-слово (правило %d)" -#: tsearch/dict_thesaurus.c:430 +#: tsearch/dict_thesaurus.c:425 #, c-format msgid "Use \"?\" to represent a stop word within a sample phrase." msgstr "Для представлення стоп-слова в межах зразка використайте \"?\"." -#: tsearch/dict_thesaurus.c:572 +#: tsearch/dict_thesaurus.c:567 #, c-format msgid "thesaurus substitute word \"%s\" is a stop word (rule %d)" msgstr "слово-замінник в тезаурусі \"%s\" має стоп-слово (правило %d)" -#: tsearch/dict_thesaurus.c:579 +#: tsearch/dict_thesaurus.c:574 #, c-format msgid "thesaurus substitute word \"%s\" isn't recognized by subdictionary (rule %d)" msgstr "слова-замінника в тезаурусі \"%s\" немає у внутрішньому словнику (правило %d)" -#: tsearch/dict_thesaurus.c:591 +#: tsearch/dict_thesaurus.c:586 #, c-format msgid "thesaurus substitute phrase is empty (rule %d)" msgstr "фраза-замінник в тезаурусі пуста (правило %d)" -#: tsearch/dict_thesaurus.c:629 +#: tsearch/dict_thesaurus.c:624 #, c-format msgid "multiple Dictionary parameters" msgstr "повторюваний параметр Dictionary" -#: tsearch/dict_thesaurus.c:636 +#: tsearch/dict_thesaurus.c:631 #, c-format msgid "unrecognized Thesaurus parameter: \"%s\"" msgstr "нерозпізнаний параметр тезаурусу: \"%s\"" -#: tsearch/dict_thesaurus.c:648 +#: tsearch/dict_thesaurus.c:643 #, c-format msgid "missing Dictionary parameter" msgstr "пропущено параметр Dictionary" #: tsearch/spell.c:380 tsearch/spell.c:397 tsearch/spell.c:406 -#: tsearch/spell.c:1036 +#: tsearch/spell.c:1062 #, c-format msgid "invalid affix flag \"%s\"" msgstr "неприпустимиа позначка affix \"%s\"" -#: tsearch/spell.c:384 tsearch/spell.c:1040 +#: tsearch/spell.c:384 tsearch/spell.c:1066 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "позначка affix \"%s\" поза діапазоном" @@ -20511,59 +21268,59 @@ msgstr "неприпустима позначка affix \"%s\" зі значен msgid "could not open dictionary file \"%s\": %m" msgstr "не вдалося відкрити файл словника \"%s\": %m" -#: tsearch/spell.c:742 utils/adt/regexp.c:208 +#: tsearch/spell.c:763 utils/adt/regexp.c:208 #, c-format msgid "invalid regular expression: %s" msgstr "неприпустимий регулярний вираз: %s" -#: tsearch/spell.c:956 tsearch/spell.c:973 tsearch/spell.c:990 -#: tsearch/spell.c:1007 tsearch/spell.c:1072 gram.y:15993 gram.y:16010 +#: tsearch/spell.c:982 tsearch/spell.c:999 tsearch/spell.c:1016 +#: tsearch/spell.c:1033 tsearch/spell.c:1098 gram.y:16629 gram.y:16646 #, c-format msgid "syntax error" msgstr "синтаксична помилка" -#: tsearch/spell.c:1163 tsearch/spell.c:1175 tsearch/spell.c:1734 -#: tsearch/spell.c:1739 tsearch/spell.c:1744 +#: tsearch/spell.c:1189 tsearch/spell.c:1201 tsearch/spell.c:1760 +#: tsearch/spell.c:1765 tsearch/spell.c:1770 #, c-format msgid "invalid affix alias \"%s\"" msgstr "неприпустимий псевдонім affix \"%s\"" -#: tsearch/spell.c:1216 tsearch/spell.c:1287 tsearch/spell.c:1436 +#: tsearch/spell.c:1242 tsearch/spell.c:1313 tsearch/spell.c:1462 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "не вдалося відкрити файл affix \"%s\": %m" -#: tsearch/spell.c:1270 +#: tsearch/spell.c:1296 #, c-format msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" msgstr "Словник Ispell підтримує для позначки лише значення \"default\", \"long\", і\"num\"" -#: tsearch/spell.c:1314 +#: tsearch/spell.c:1340 #, c-format msgid "invalid number of flag vector aliases" msgstr "неприпустима кількість векторів позначок" -#: tsearch/spell.c:1337 +#: tsearch/spell.c:1363 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "кількість псевдонімів перевищує вказане число %d" -#: tsearch/spell.c:1552 +#: tsearch/spell.c:1578 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "файл affix містить команди і в старому, і в новому стилі" -#: tsearch/to_tsany.c:185 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1121 +#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1121 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "рядок занадто довгий для tsvector (%d байт, максимум %d байт)" -#: tsearch/ts_locale.c:185 +#: tsearch/ts_locale.c:227 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "рядок %d файлу конфігурації \"%s\": \"%s\"" -#: tsearch/ts_locale.c:302 +#: tsearch/ts_locale.c:307 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "перетворити wchar_t в кодування серверу не вдалося: %mв" @@ -20595,152 +21352,152 @@ msgstr "не вдалося відкрити файл стоп-слова \"%s\" msgid "text search parser does not support headline creation" msgstr "аналізатор текстового пошуку не підтримує створення заголовку" -#: tsearch/wparser_def.c:2585 +#: tsearch/wparser_def.c:2578 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "нерозпізнаний параметр заголовку: \"%s\"" -#: tsearch/wparser_def.c:2604 +#: tsearch/wparser_def.c:2597 #, c-format msgid "MinWords should be less than MaxWords" msgstr "Значення MinWords повинно бути меньшим за MaxWords" -#: tsearch/wparser_def.c:2608 +#: tsearch/wparser_def.c:2601 #, c-format msgid "MinWords should be positive" msgstr "Значення MinWords повинно бути позитивним" -#: tsearch/wparser_def.c:2612 +#: tsearch/wparser_def.c:2605 #, c-format msgid "ShortWord should be >= 0" msgstr "Значення ShortWord повинно бути >= 0" -#: tsearch/wparser_def.c:2616 +#: tsearch/wparser_def.c:2609 #, c-format msgid "MaxFragments should be >= 0" msgstr "Значення MaxFragments повинно бути >= 0" -#: utils/adt/acl.c:172 utils/adt/name.c:93 +#: utils/adt/acl.c:165 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "занадто довгий ідентифікатор" -#: utils/adt/acl.c:173 utils/adt/name.c:94 +#: utils/adt/acl.c:166 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "Ідентифікатор повинен бути короче ніж %d символів." -#: utils/adt/acl.c:256 +#: utils/adt/acl.c:249 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "нерозпізнане ключове слово: \"%s\"" -#: utils/adt/acl.c:257 +#: utils/adt/acl.c:250 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "Ключовим словом ACL повинно бути \"group\" або \"user\"." -#: utils/adt/acl.c:262 +#: utils/adt/acl.c:255 #, c-format msgid "missing name" msgstr "пропущено ім'я" -#: utils/adt/acl.c:263 +#: utils/adt/acl.c:256 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "За ключовими словами \"group\" або \"user\" повинно йти ім'я." -#: utils/adt/acl.c:269 +#: utils/adt/acl.c:262 #, c-format msgid "missing \"=\" sign" msgstr "пропущено знак \"=\"" -#: utils/adt/acl.c:322 +#: utils/adt/acl.c:315 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "неприпустимий символ режиму: повинен бути один з \"%s\"" -#: utils/adt/acl.c:344 +#: utils/adt/acl.c:337 #, c-format msgid "a name must follow the \"/\" sign" msgstr "за знаком \"/\" повинно прямувати ім'я" -#: utils/adt/acl.c:352 +#: utils/adt/acl.c:345 #, c-format msgid "defaulting grantor to user ID %u" msgstr "призначив права користувач з ідентифікатором %u" -#: utils/adt/acl.c:538 +#: utils/adt/acl.c:531 #, c-format msgid "ACL array contains wrong data type" msgstr "Масив ACL містить неправильний тип даних" -#: utils/adt/acl.c:542 +#: utils/adt/acl.c:535 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "Масиви ACL повинні бути одновимірними" -#: utils/adt/acl.c:546 +#: utils/adt/acl.c:539 #, c-format msgid "ACL arrays must not contain null values" msgstr "Масиви ACL не повинні містити значення null" -#: utils/adt/acl.c:570 +#: utils/adt/acl.c:563 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "зайве сміття в кінці специфікації ACL" -#: utils/adt/acl.c:1205 +#: utils/adt/acl.c:1198 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "параметри призначення прав не можна повернути тому, хто призначив їх вам" -#: utils/adt/acl.c:1266 +#: utils/adt/acl.c:1259 #, c-format msgid "dependent privileges exist" msgstr "залежні права існують" -#: utils/adt/acl.c:1267 +#: utils/adt/acl.c:1260 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Використайте CASCADE, щоб відкликати їх." -#: utils/adt/acl.c:1521 +#: utils/adt/acl.c:1514 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert більше не підтримується" -#: utils/adt/acl.c:1531 +#: utils/adt/acl.c:1524 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove більше не підтримується" -#: utils/adt/acl.c:1617 utils/adt/acl.c:1671 +#: utils/adt/acl.c:1610 utils/adt/acl.c:1664 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "нерозпізнаний тип прав: \"%s\"" -#: utils/adt/acl.c:3471 utils/adt/regproc.c:103 utils/adt/regproc.c:278 +#: utils/adt/acl.c:3446 utils/adt/regproc.c:101 utils/adt/regproc.c:277 #, c-format msgid "function \"%s\" does not exist" msgstr "функція \"%s\" не існує" -#: utils/adt/acl.c:4943 +#: utils/adt/acl.c:4898 #, c-format msgid "must be member of role \"%s\"" msgstr "потрібно бути учасником ролі \"%s\"" -#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:933 -#: utils/adt/arrayfuncs.c:1533 utils/adt/arrayfuncs.c:3236 -#: utils/adt/arrayfuncs.c:3376 utils/adt/arrayfuncs.c:5911 -#: utils/adt/arrayfuncs.c:6252 utils/adt/arrayutils.c:93 -#: utils/adt/arrayutils.c:102 utils/adt/arrayutils.c:109 +#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:935 +#: utils/adt/arrayfuncs.c:1543 utils/adt/arrayfuncs.c:3262 +#: utils/adt/arrayfuncs.c:3404 utils/adt/arrayfuncs.c:5945 +#: utils/adt/arrayfuncs.c:6286 utils/adt/arrayutils.c:94 +#: utils/adt/arrayutils.c:103 utils/adt/arrayutils.c:110 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "розмір масиву перевищує максимальний допустимий розмір (%d)" -#: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:466 -#: utils/adt/array_userfuncs.c:546 utils/adt/json.c:645 utils/adt/json.c:740 +#: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:467 +#: utils/adt/array_userfuncs.c:547 utils/adt/json.c:645 utils/adt/json.c:740 #: utils/adt/json.c:778 utils/adt/jsonb.c:1115 utils/adt/jsonb.c:1144 #: utils/adt/jsonb.c:1538 utils/adt/jsonb.c:1702 utils/adt/jsonb.c:1712 #, c-format @@ -20753,16 +21510,16 @@ msgid "input data type is not an array" msgstr "тип вхідних даних не є масивом" #: utils/adt/array_userfuncs.c:129 utils/adt/array_userfuncs.c:181 -#: utils/adt/arrayfuncs.c:1336 utils/adt/float.c:1243 utils/adt/float.c:1317 -#: utils/adt/float.c:3960 utils/adt/float.c:3974 utils/adt/int.c:759 -#: utils/adt/int.c:781 utils/adt/int.c:795 utils/adt/int.c:809 -#: utils/adt/int.c:840 utils/adt/int.c:861 utils/adt/int.c:978 -#: utils/adt/int.c:992 utils/adt/int.c:1006 utils/adt/int.c:1039 -#: utils/adt/int.c:1053 utils/adt/int.c:1067 utils/adt/int.c:1098 -#: utils/adt/int.c:1180 utils/adt/int.c:1244 utils/adt/int.c:1312 -#: utils/adt/int.c:1318 utils/adt/int8.c:1292 utils/adt/numeric.c:1559 -#: utils/adt/numeric.c:3435 utils/adt/varbit.c:1188 utils/adt/varbit.c:1576 -#: utils/adt/varlena.c:1087 utils/adt/varlena.c:3377 +#: utils/adt/float.c:1233 utils/adt/float.c:1307 utils/adt/float.c:4052 +#: utils/adt/float.c:4066 utils/adt/int.c:757 utils/adt/int.c:779 +#: utils/adt/int.c:793 utils/adt/int.c:807 utils/adt/int.c:838 +#: utils/adt/int.c:859 utils/adt/int.c:976 utils/adt/int.c:990 +#: utils/adt/int.c:1004 utils/adt/int.c:1037 utils/adt/int.c:1051 +#: utils/adt/int.c:1065 utils/adt/int.c:1096 utils/adt/int.c:1178 +#: utils/adt/int.c:1242 utils/adt/int.c:1310 utils/adt/int.c:1316 +#: utils/adt/int8.c:1299 utils/adt/numeric.c:1768 utils/adt/numeric.c:4203 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1121 +#: utils/adt/varlena.c:3433 #, c-format msgid "integer out of range" msgstr "ціле число поза діапазоном" @@ -20799,12 +21556,12 @@ msgstr "Масиви з різними вимірами елементів не msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "Масиви з різними вимірами не є сумісними для об'єднання." -#: utils/adt/array_userfuncs.c:662 utils/adt/array_userfuncs.c:814 +#: utils/adt/array_userfuncs.c:663 utils/adt/array_userfuncs.c:815 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "пошук елементів у багатовимірних масивах не підтримується" -#: utils/adt/array_userfuncs.c:686 +#: utils/adt/array_userfuncs.c:687 #, c-format msgid "initial position must not be null" msgstr "початкова позиція не повинна бути null" @@ -20813,14 +21570,14 @@ msgstr "початкова позиція не повинна бути null" #: utils/adt/arrayfuncs.c:295 utils/adt/arrayfuncs.c:317 #: utils/adt/arrayfuncs.c:332 utils/adt/arrayfuncs.c:346 #: utils/adt/arrayfuncs.c:352 utils/adt/arrayfuncs.c:359 -#: utils/adt/arrayfuncs.c:490 utils/adt/arrayfuncs.c:506 -#: utils/adt/arrayfuncs.c:517 utils/adt/arrayfuncs.c:532 -#: utils/adt/arrayfuncs.c:553 utils/adt/arrayfuncs.c:583 -#: utils/adt/arrayfuncs.c:590 utils/adt/arrayfuncs.c:598 -#: utils/adt/arrayfuncs.c:632 utils/adt/arrayfuncs.c:655 -#: utils/adt/arrayfuncs.c:675 utils/adt/arrayfuncs.c:787 -#: utils/adt/arrayfuncs.c:796 utils/adt/arrayfuncs.c:826 -#: utils/adt/arrayfuncs.c:841 utils/adt/arrayfuncs.c:894 +#: utils/adt/arrayfuncs.c:492 utils/adt/arrayfuncs.c:508 +#: utils/adt/arrayfuncs.c:519 utils/adt/arrayfuncs.c:534 +#: utils/adt/arrayfuncs.c:555 utils/adt/arrayfuncs.c:585 +#: utils/adt/arrayfuncs.c:592 utils/adt/arrayfuncs.c:600 +#: utils/adt/arrayfuncs.c:634 utils/adt/arrayfuncs.c:657 +#: utils/adt/arrayfuncs.c:677 utils/adt/arrayfuncs.c:789 +#: utils/adt/arrayfuncs.c:798 utils/adt/arrayfuncs.c:828 +#: utils/adt/arrayfuncs.c:843 utils/adt/arrayfuncs.c:896 #, c-format msgid "malformed array literal: \"%s\"" msgstr "неправильний літерал масиву: \"%s\"" @@ -20840,8 +21597,8 @@ msgstr "Пропущено значення виміру масиву." msgid "Missing \"%s\" after array dimensions." msgstr "Пропущено \"%s\" після вимірів масиву." -#: utils/adt/arrayfuncs.c:305 utils/adt/arrayfuncs.c:2884 -#: utils/adt/arrayfuncs.c:2916 utils/adt/arrayfuncs.c:2931 +#: utils/adt/arrayfuncs.c:305 utils/adt/arrayfuncs.c:2909 +#: utils/adt/arrayfuncs.c:2941 utils/adt/arrayfuncs.c:2956 #, c-format msgid "upper bound cannot be less than lower bound" msgstr "верхня границя не може бути меньше нижньої границі" @@ -20861,207 +21618,229 @@ msgstr "Вміст масиву повинен починатись з \"{\"." msgid "Specified array dimensions do not match array contents." msgstr "Вказані виміри масиву не відповідають його вмісту." -#: utils/adt/arrayfuncs.c:491 utils/adt/arrayfuncs.c:518 -#: utils/adt/rangetypes.c:2181 utils/adt/rangetypes.c:2189 -#: utils/adt/rowtypes.c:210 utils/adt/rowtypes.c:218 +#: utils/adt/arrayfuncs.c:493 utils/adt/arrayfuncs.c:520 +#: utils/adt/multirangetypes.c:163 utils/adt/rangetypes.c:2310 +#: utils/adt/rangetypes.c:2318 utils/adt/rowtypes.c:211 +#: utils/adt/rowtypes.c:219 #, c-format msgid "Unexpected end of input." msgstr "Неочікуваний кінец введення." -#: utils/adt/arrayfuncs.c:507 utils/adt/arrayfuncs.c:554 -#: utils/adt/arrayfuncs.c:584 utils/adt/arrayfuncs.c:633 +#: utils/adt/arrayfuncs.c:509 utils/adt/arrayfuncs.c:556 +#: utils/adt/arrayfuncs.c:586 utils/adt/arrayfuncs.c:635 #, c-format msgid "Unexpected \"%c\" character." msgstr "Неочікуваний символ \"%c\"." -#: utils/adt/arrayfuncs.c:533 utils/adt/arrayfuncs.c:656 +#: utils/adt/arrayfuncs.c:535 utils/adt/arrayfuncs.c:658 #, c-format msgid "Unexpected array element." msgstr "Неочікуваний елемент масиву." -#: utils/adt/arrayfuncs.c:591 +#: utils/adt/arrayfuncs.c:593 #, c-format msgid "Unmatched \"%c\" character." msgstr "Невідповідний символ \"%c\"." -#: utils/adt/arrayfuncs.c:599 utils/adt/jsonfuncs.c:2452 +#: utils/adt/arrayfuncs.c:601 utils/adt/jsonfuncs.c:2593 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "Багатовимірні масиви повинні мати вкладені масиви з відповідними вимірами." -#: utils/adt/arrayfuncs.c:676 +#: utils/adt/arrayfuncs.c:678 utils/adt/multirangetypes.c:286 #, c-format msgid "Junk after closing right brace." msgstr "Сміття після закриття правої дужки." -#: utils/adt/arrayfuncs.c:1298 utils/adt/arrayfuncs.c:3344 -#: utils/adt/arrayfuncs.c:5817 +#: utils/adt/arrayfuncs.c:1300 utils/adt/arrayfuncs.c:3370 +#: utils/adt/arrayfuncs.c:5849 #, c-format msgid "invalid number of dimensions: %d" msgstr "неприпустима кількість вимірів: %d" -#: utils/adt/arrayfuncs.c:1309 +#: utils/adt/arrayfuncs.c:1311 #, c-format msgid "invalid array flags" msgstr "неприпустимі позначки масиву" -#: utils/adt/arrayfuncs.c:1317 +#: utils/adt/arrayfuncs.c:1333 #, c-format -msgid "wrong element type" -msgstr "неправильний тип елементу" +msgid "binary data has array element type %u (%s) instead of expected %u (%s)" +msgstr "двійкові дані мають тип елементу масиву %u (%s) замість очікуваного %u (%s)" -#: utils/adt/arrayfuncs.c:1367 utils/adt/rangetypes.c:335 -#: utils/cache/lsyscache.c:2835 +#: utils/adt/arrayfuncs.c:1377 utils/adt/multirangetypes.c:444 +#: utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2905 #, c-format msgid "no binary input function available for type %s" msgstr "для типу %s немає функції введення двійкових даних" -#: utils/adt/arrayfuncs.c:1507 +#: utils/adt/arrayfuncs.c:1517 #, c-format msgid "improper binary format in array element %d" msgstr "неправильний двійковий формат в елементі масиву %d" -#: utils/adt/arrayfuncs.c:1588 utils/adt/rangetypes.c:340 -#: utils/cache/lsyscache.c:2868 +#: utils/adt/arrayfuncs.c:1598 utils/adt/multirangetypes.c:449 +#: utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2938 #, c-format msgid "no binary output function available for type %s" msgstr "для типу %s немає функції виводу двійкових даних" -#: utils/adt/arrayfuncs.c:2066 +#: utils/adt/arrayfuncs.c:2077 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "розрізання масивів постійної довжини не реалізовано" -#: utils/adt/arrayfuncs.c:2244 utils/adt/arrayfuncs.c:2266 -#: utils/adt/arrayfuncs.c:2315 utils/adt/arrayfuncs.c:2551 -#: utils/adt/arrayfuncs.c:2862 utils/adt/arrayfuncs.c:5803 -#: utils/adt/arrayfuncs.c:5829 utils/adt/arrayfuncs.c:5840 +#: utils/adt/arrayfuncs.c:2255 utils/adt/arrayfuncs.c:2277 +#: utils/adt/arrayfuncs.c:2326 utils/adt/arrayfuncs.c:2565 +#: utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5835 +#: utils/adt/arrayfuncs.c:5861 utils/adt/arrayfuncs.c:5872 #: utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 -#: utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4340 utils/adt/jsonfuncs.c:4490 -#: utils/adt/jsonfuncs.c:4602 utils/adt/jsonfuncs.c:4648 +#: utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4427 utils/adt/jsonfuncs.c:4580 +#: utils/adt/jsonfuncs.c:4692 utils/adt/jsonfuncs.c:4741 #, c-format msgid "wrong number of array subscripts" msgstr "невірне число верхніх індексів масива" -#: utils/adt/arrayfuncs.c:2249 utils/adt/arrayfuncs.c:2357 -#: utils/adt/arrayfuncs.c:2615 utils/adt/arrayfuncs.c:2921 +#: utils/adt/arrayfuncs.c:2260 utils/adt/arrayfuncs.c:2368 +#: utils/adt/arrayfuncs.c:2632 utils/adt/arrayfuncs.c:2946 #, c-format msgid "array subscript out of range" msgstr "верхній індекс масиву поза діапазоном" -#: utils/adt/arrayfuncs.c:2254 +#: utils/adt/arrayfuncs.c:2265 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "не можна призначати значення null значення елементу масива постійної довжини" -#: utils/adt/arrayfuncs.c:2809 +#: utils/adt/arrayfuncs.c:2834 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "оновлення в зрізах масивів постійної довжини не реалізовані" -#: utils/adt/arrayfuncs.c:2840 +#: utils/adt/arrayfuncs.c:2865 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "у вказівці зрізу масива повинні бути задані обидві межі" -#: utils/adt/arrayfuncs.c:2841 +#: utils/adt/arrayfuncs.c:2866 #, c-format msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." msgstr "Під час присвоєння значень зрізу в пустому масиві, межі зрізу повинні вказуватися повністю." -#: utils/adt/arrayfuncs.c:2852 utils/adt/arrayfuncs.c:2947 +#: utils/adt/arrayfuncs.c:2877 utils/adt/arrayfuncs.c:2973 #, c-format msgid "source array too small" msgstr "вихідний масив занадто малий" -#: utils/adt/arrayfuncs.c:3500 +#: utils/adt/arrayfuncs.c:3528 #, c-format msgid "null array element not allowed in this context" msgstr "елемент масиву null не дозволений в цьому контексті" -#: utils/adt/arrayfuncs.c:3602 utils/adt/arrayfuncs.c:3773 -#: utils/adt/arrayfuncs.c:4129 +#: utils/adt/arrayfuncs.c:3630 utils/adt/arrayfuncs.c:3801 +#: utils/adt/arrayfuncs.c:4157 #, c-format msgid "cannot compare arrays of different element types" msgstr "не можна порівнювати масиви з елементами різних типів" -#: utils/adt/arrayfuncs.c:3951 utils/adt/rangetypes.c:1254 -#: utils/adt/rangetypes.c:1318 +#: utils/adt/arrayfuncs.c:3979 utils/adt/multirangetypes.c:2743 +#: utils/adt/multirangetypes.c:2815 utils/adt/rangetypes.c:1343 +#: utils/adt/rangetypes.c:1407 utils/adt/rowtypes.c:1858 #, c-format msgid "could not identify a hash function for type %s" msgstr "не вдалося визначити геш-функцію для типу %s" -#: utils/adt/arrayfuncs.c:4044 +#: utils/adt/arrayfuncs.c:4072 utils/adt/rowtypes.c:1979 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "не вдалося визначити розширену геш-функцію для типу %s" -#: utils/adt/arrayfuncs.c:5221 +#: utils/adt/arrayfuncs.c:5249 #, c-format msgid "data type %s is not an array type" msgstr "тип даних %s не є типом масиву" -#: utils/adt/arrayfuncs.c:5276 +#: utils/adt/arrayfuncs.c:5304 #, c-format msgid "cannot accumulate null arrays" msgstr "накопичувати null-масиви не можна" -#: utils/adt/arrayfuncs.c:5304 +#: utils/adt/arrayfuncs.c:5332 #, c-format msgid "cannot accumulate empty arrays" msgstr "накопичувати пусті масиви не можна" -#: utils/adt/arrayfuncs.c:5331 utils/adt/arrayfuncs.c:5337 +#: utils/adt/arrayfuncs.c:5359 utils/adt/arrayfuncs.c:5365 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "накопичувати масиви різної розмірності не можна" -#: utils/adt/arrayfuncs.c:5701 utils/adt/arrayfuncs.c:5741 +#: utils/adt/arrayfuncs.c:5733 utils/adt/arrayfuncs.c:5773 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "масив розмірності або масив нижніх границь не може бути null" -#: utils/adt/arrayfuncs.c:5804 utils/adt/arrayfuncs.c:5830 +#: utils/adt/arrayfuncs.c:5836 utils/adt/arrayfuncs.c:5862 #, c-format msgid "Dimension array must be one dimensional." msgstr "Масив розмірності повинен бути одновимірним." -#: utils/adt/arrayfuncs.c:5809 utils/adt/arrayfuncs.c:5835 +#: utils/adt/arrayfuncs.c:5841 utils/adt/arrayfuncs.c:5867 #, c-format msgid "dimension values cannot be null" msgstr "значення розмірностей не можуть бути null" -#: utils/adt/arrayfuncs.c:5841 +#: utils/adt/arrayfuncs.c:5873 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Масив нижніх границь відрізняється за розміром від масиву розмірностей." -#: utils/adt/arrayfuncs.c:6117 +#: utils/adt/arrayfuncs.c:6151 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "видалення елементів з багатовимірних масивів не підтримується" -#: utils/adt/arrayfuncs.c:6394 +#: utils/adt/arrayfuncs.c:6428 #, c-format msgid "thresholds must be one-dimensional array" msgstr "граничне значення повинно вказуватись одновимірним масивом" -#: utils/adt/arrayfuncs.c:6399 +#: utils/adt/arrayfuncs.c:6433 #, c-format msgid "thresholds array must not contain NULLs" msgstr "масив границь не повинен містити NULL" -#: utils/adt/arrayutils.c:209 +#: utils/adt/arrayfuncs.c:6666 +#, c-format +msgid "number of elements to trim must be between 0 and %d" +msgstr "кількість елементів для обрізки має бути між 0 і %d" + +#: utils/adt/arraysubs.c:93 utils/adt/arraysubs.c:130 +#, c-format +msgid "array subscript must have type integer" +msgstr "індекс елементу масиву має бути цілим числом" + +#: utils/adt/arraysubs.c:198 utils/adt/arraysubs.c:217 +#, c-format +msgid "array subscript in assignment must not be null" +msgstr "підрядковий символ масиву у призначенні не може бути NULL" + +#: utils/adt/arrayutils.c:140 +#, c-format +msgid "array lower bound is too large: %d" +msgstr "нижня границя масиву занадто велика: %d" + +#: utils/adt/arrayutils.c:240 #, c-format msgid "typmod array must be type cstring[]" msgstr "масив typmod повинен мати тип cstring[]" -#: utils/adt/arrayutils.c:214 +#: utils/adt/arrayutils.c:245 #, c-format msgid "typmod array must be one-dimensional" msgstr "масив typmod повинен бути одновимірним" -#: utils/adt/arrayutils.c:219 +#: utils/adt/arrayutils.c:250 #, c-format msgid "typmod array must not contain nulls" msgstr "масив typmod не повинен містити елементи nulls" @@ -21072,25 +21851,24 @@ msgid "encoding conversion from %s to ASCII not supported" msgstr "перетворення кодування з %s в ASCII не підтримується" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:3757 -#: utils/adt/float.c:187 utils/adt/float.c:271 utils/adt/float.c:295 -#: utils/adt/float.c:412 utils/adt/float.c:497 utils/adt/float.c:525 +#: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:3802 +#: utils/adt/float.c:187 utils/adt/float.c:271 utils/adt/float.c:283 +#: utils/adt/float.c:400 utils/adt/float.c:485 utils/adt/float.c:501 #: utils/adt/geo_ops.c:220 utils/adt/geo_ops.c:230 utils/adt/geo_ops.c:242 #: utils/adt/geo_ops.c:274 utils/adt/geo_ops.c:316 utils/adt/geo_ops.c:326 -#: utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1378 utils/adt/geo_ops.c:1413 -#: utils/adt/geo_ops.c:1421 utils/adt/geo_ops.c:3476 utils/adt/geo_ops.c:4645 -#: utils/adt/geo_ops.c:4660 utils/adt/geo_ops.c:4667 utils/adt/int8.c:126 +#: utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1389 utils/adt/geo_ops.c:1424 +#: utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3488 utils/adt/geo_ops.c:4657 +#: utils/adt/geo_ops.c:4672 utils/adt/geo_ops.c:4679 utils/adt/int8.c:126 #: utils/adt/jsonpath.c:182 utils/adt/mac.c:94 utils/adt/mac8.c:93 #: utils/adt/mac8.c:166 utils/adt/mac8.c:184 utils/adt/mac8.c:202 -#: utils/adt/mac8.c:221 utils/adt/network.c:100 utils/adt/numeric.c:601 -#: utils/adt/numeric.c:628 utils/adt/numeric.c:6001 utils/adt/numeric.c:6025 -#: utils/adt/numeric.c:6049 utils/adt/numeric.c:6882 utils/adt/numeric.c:6908 -#: utils/adt/numutils.c:116 utils/adt/numutils.c:126 utils/adt/numutils.c:170 -#: utils/adt/numutils.c:246 utils/adt/numutils.c:322 utils/adt/oid.c:44 -#: utils/adt/oid.c:58 utils/adt/oid.c:64 utils/adt/oid.c:86 -#: utils/adt/pg_lsn.c:73 utils/adt/tid.c:74 utils/adt/tid.c:82 -#: utils/adt/tid.c:90 utils/adt/timestamp.c:494 utils/adt/uuid.c:136 -#: utils/adt/xid8funcs.c:346 +#: utils/adt/mac8.c:221 utils/adt/network.c:100 utils/adt/numeric.c:694 +#: utils/adt/numeric.c:713 utils/adt/numeric.c:6858 utils/adt/numeric.c:6882 +#: utils/adt/numeric.c:6906 utils/adt/numeric.c:7864 utils/adt/numutils.c:116 +#: utils/adt/numutils.c:126 utils/adt/numutils.c:170 utils/adt/numutils.c:246 +#: utils/adt/numutils.c:322 utils/adt/oid.c:44 utils/adt/oid.c:58 +#: utils/adt/oid.c:64 utils/adt/oid.c:86 utils/adt/pg_lsn.c:74 +#: utils/adt/tid.c:76 utils/adt/tid.c:84 utils/adt/tid.c:92 +#: utils/adt/timestamp.c:496 utils/adt/uuid.c:136 utils/adt/xid8funcs.c:346 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "неприпустимий синтаксис для типу %s: \"%s\"" @@ -21105,12 +21883,14 @@ msgstr "значення \"%s\" поза діапазоном для типу %s #: utils/adt/cash.c:652 utils/adt/cash.c:702 utils/adt/cash.c:753 #: utils/adt/cash.c:802 utils/adt/cash.c:854 utils/adt/cash.c:904 -#: utils/adt/float.c:104 utils/adt/int.c:824 utils/adt/int.c:940 -#: utils/adt/int.c:1020 utils/adt/int.c:1082 utils/adt/int.c:1120 -#: utils/adt/int.c:1148 utils/adt/int8.c:593 utils/adt/int8.c:651 -#: utils/adt/int8.c:978 utils/adt/int8.c:1058 utils/adt/int8.c:1120 -#: utils/adt/int8.c:1200 utils/adt/numeric.c:7446 utils/adt/numeric.c:7736 -#: utils/adt/numeric.c:9318 utils/adt/timestamp.c:3264 +#: utils/adt/float.c:104 utils/adt/int.c:822 utils/adt/int.c:938 +#: utils/adt/int.c:1018 utils/adt/int.c:1080 utils/adt/int.c:1118 +#: utils/adt/int.c:1146 utils/adt/int8.c:600 utils/adt/int8.c:658 +#: utils/adt/int8.c:985 utils/adt/int8.c:1065 utils/adt/int8.c:1127 +#: utils/adt/int8.c:1207 utils/adt/numeric.c:3031 utils/adt/numeric.c:3054 +#: utils/adt/numeric.c:3139 utils/adt/numeric.c:3157 utils/adt/numeric.c:3253 +#: utils/adt/numeric.c:8413 utils/adt/numeric.c:8703 utils/adt/numeric.c:10336 +#: utils/adt/timestamp.c:3281 #, c-format msgid "division by zero" msgstr "ділення на нуль" @@ -21120,153 +21900,162 @@ msgstr "ділення на нуль" msgid "\"char\" out of range" msgstr "значення \"char\" поза діапазоном" -#: utils/adt/date.c:61 utils/adt/timestamp.c:95 utils/adt/varbit.c:104 +#: utils/adt/date.c:62 utils/adt/timestamp.c:97 utils/adt/varbit.c:105 #: utils/adt/varchar.c:48 #, c-format msgid "invalid type modifier" msgstr "неприпустимий тип модифікатора" -#: utils/adt/date.c:73 +#: utils/adt/date.c:74 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "TIME(%d)%s точність не повинна бути від'ємною" -#: utils/adt/date.c:79 +#: utils/adt/date.c:80 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "TIME(%d)%s точність зменшена до дозволеного максимуму, %d" -#: utils/adt/date.c:158 utils/adt/date.c:166 utils/adt/formatting.c:4196 -#: utils/adt/formatting.c:4205 utils/adt/formatting.c:4311 -#: utils/adt/formatting.c:4321 +#: utils/adt/date.c:159 utils/adt/date.c:167 utils/adt/formatting.c:4252 +#: utils/adt/formatting.c:4261 utils/adt/formatting.c:4367 +#: utils/adt/formatting.c:4377 #, c-format msgid "date out of range: \"%s\"" msgstr "дата поза діапазоном: \"%s\"" -#: utils/adt/date.c:213 utils/adt/date.c:525 utils/adt/date.c:549 +#: utils/adt/date.c:214 utils/adt/date.c:525 utils/adt/date.c:549 #: utils/adt/xml.c:2210 #, c-format msgid "date out of range" msgstr "дата поза діапазоном" -#: utils/adt/date.c:259 utils/adt/timestamp.c:574 +#: utils/adt/date.c:260 utils/adt/timestamp.c:580 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "значення поля типу date поза діапазоном: %d-%02d-%02d" -#: utils/adt/date.c:266 utils/adt/date.c:275 utils/adt/timestamp.c:580 +#: utils/adt/date.c:267 utils/adt/date.c:276 utils/adt/timestamp.c:586 #, c-format msgid "date out of range: %d-%02d-%02d" msgstr "дата поза діапазоном: %d-%02d-%02d" -#: utils/adt/date.c:313 utils/adt/date.c:336 utils/adt/date.c:362 -#: utils/adt/date.c:1170 utils/adt/date.c:1216 utils/adt/date.c:1772 -#: utils/adt/date.c:1803 utils/adt/date.c:1832 utils/adt/date.c:2664 -#: utils/adt/datetime.c:1655 utils/adt/formatting.c:4053 -#: utils/adt/formatting.c:4085 utils/adt/formatting.c:4165 -#: utils/adt/formatting.c:4287 utils/adt/json.c:418 utils/adt/json.c:457 -#: utils/adt/timestamp.c:222 utils/adt/timestamp.c:254 -#: utils/adt/timestamp.c:692 utils/adt/timestamp.c:701 -#: utils/adt/timestamp.c:779 utils/adt/timestamp.c:812 -#: utils/adt/timestamp.c:2843 utils/adt/timestamp.c:2864 -#: utils/adt/timestamp.c:2877 utils/adt/timestamp.c:2886 -#: utils/adt/timestamp.c:2894 utils/adt/timestamp.c:2949 -#: utils/adt/timestamp.c:2972 utils/adt/timestamp.c:2985 -#: utils/adt/timestamp.c:2996 utils/adt/timestamp.c:3004 -#: utils/adt/timestamp.c:3664 utils/adt/timestamp.c:3789 -#: utils/adt/timestamp.c:3830 utils/adt/timestamp.c:3920 -#: utils/adt/timestamp.c:3964 utils/adt/timestamp.c:4067 -#: utils/adt/timestamp.c:4552 utils/adt/timestamp.c:4748 -#: utils/adt/timestamp.c:5075 utils/adt/timestamp.c:5089 -#: utils/adt/timestamp.c:5094 utils/adt/timestamp.c:5108 -#: utils/adt/timestamp.c:5141 utils/adt/timestamp.c:5218 -#: utils/adt/timestamp.c:5259 utils/adt/timestamp.c:5263 -#: utils/adt/timestamp.c:5332 utils/adt/timestamp.c:5336 -#: utils/adt/timestamp.c:5350 utils/adt/timestamp.c:5384 utils/adt/xml.c:2232 -#: utils/adt/xml.c:2239 utils/adt/xml.c:2259 utils/adt/xml.c:2266 -#, c-format -msgid "timestamp out of range" -msgstr "позначка часу поза діапазоном" - #: utils/adt/date.c:500 #, c-format msgid "cannot subtract infinite dates" msgstr "віднімати безкінечні дати не можна" -#: utils/adt/date.c:589 utils/adt/date.c:646 utils/adt/date.c:680 -#: utils/adt/date.c:2701 utils/adt/date.c:2711 +#: utils/adt/date.c:598 utils/adt/date.c:661 utils/adt/date.c:697 +#: utils/adt/date.c:2881 utils/adt/date.c:2891 #, c-format msgid "date out of range for timestamp" msgstr "для позначки часу дата поза діапазоном" -#: utils/adt/date.c:1389 utils/adt/date.c:2159 utils/adt/formatting.c:4373 +#: utils/adt/date.c:1127 utils/adt/date.c:1210 utils/adt/date.c:1226 +#, c-format +msgid "date units \"%s\" not supported" +msgstr "одиниці вимірювання дати \"%s\" не підтримуються" + +#: utils/adt/date.c:1235 +#, c-format +msgid "date units \"%s\" not recognized" +msgstr "одиниці вимірювання дати \"%s\" не розпізнано" + +#: utils/adt/date.c:1318 utils/adt/date.c:1364 utils/adt/date.c:1920 +#: utils/adt/date.c:1951 utils/adt/date.c:1980 utils/adt/date.c:2844 +#: utils/adt/datetime.c:405 utils/adt/datetime.c:1700 +#: utils/adt/formatting.c:4109 utils/adt/formatting.c:4141 +#: utils/adt/formatting.c:4221 utils/adt/formatting.c:4343 utils/adt/json.c:418 +#: utils/adt/json.c:457 utils/adt/timestamp.c:224 utils/adt/timestamp.c:256 +#: utils/adt/timestamp.c:698 utils/adt/timestamp.c:707 +#: utils/adt/timestamp.c:785 utils/adt/timestamp.c:818 +#: utils/adt/timestamp.c:2860 utils/adt/timestamp.c:2881 +#: utils/adt/timestamp.c:2894 utils/adt/timestamp.c:2903 +#: utils/adt/timestamp.c:2911 utils/adt/timestamp.c:2966 +#: utils/adt/timestamp.c:2989 utils/adt/timestamp.c:3002 +#: utils/adt/timestamp.c:3013 utils/adt/timestamp.c:3021 +#: utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3806 +#: utils/adt/timestamp.c:3896 utils/adt/timestamp.c:3986 +#: utils/adt/timestamp.c:4079 utils/adt/timestamp.c:4182 +#: utils/adt/timestamp.c:4684 utils/adt/timestamp.c:4958 +#: utils/adt/timestamp.c:5411 utils/adt/timestamp.c:5425 +#: utils/adt/timestamp.c:5430 utils/adt/timestamp.c:5444 +#: utils/adt/timestamp.c:5477 utils/adt/timestamp.c:5564 +#: utils/adt/timestamp.c:5605 utils/adt/timestamp.c:5609 +#: utils/adt/timestamp.c:5678 utils/adt/timestamp.c:5682 +#: utils/adt/timestamp.c:5696 utils/adt/timestamp.c:5730 utils/adt/xml.c:2232 +#: utils/adt/xml.c:2239 utils/adt/xml.c:2259 utils/adt/xml.c:2266 +#, c-format +msgid "timestamp out of range" +msgstr "позначка часу поза діапазоном" + +#: utils/adt/date.c:1537 utils/adt/date.c:2339 utils/adt/formatting.c:4429 #, c-format msgid "time out of range" msgstr "час поза діапазоном" -#: utils/adt/date.c:1441 utils/adt/timestamp.c:589 +#: utils/adt/date.c:1589 utils/adt/timestamp.c:595 #, c-format msgid "time field value out of range: %d:%02d:%02g" msgstr "значення поля типу time поза діапазоном: %d:%02d:%02g" -#: utils/adt/date.c:1961 utils/adt/date.c:2463 utils/adt/float.c:1071 -#: utils/adt/float.c:1140 utils/adt/int.c:616 utils/adt/int.c:663 -#: utils/adt/int.c:698 utils/adt/int8.c:492 utils/adt/numeric.c:2197 -#: utils/adt/timestamp.c:3313 utils/adt/timestamp.c:3344 -#: utils/adt/timestamp.c:3375 +#: utils/adt/date.c:2109 utils/adt/date.c:2643 utils/adt/float.c:1047 +#: utils/adt/float.c:1123 utils/adt/int.c:614 utils/adt/int.c:661 +#: utils/adt/int.c:696 utils/adt/int8.c:499 utils/adt/numeric.c:2435 +#: utils/adt/timestamp.c:3330 utils/adt/timestamp.c:3361 +#: utils/adt/timestamp.c:3392 #, c-format msgid "invalid preceding or following size in window function" msgstr "неприпустимий розмір preceding або following у віконній функції" -#: utils/adt/date.c:2046 utils/adt/date.c:2059 +#: utils/adt/date.c:2208 utils/adt/date.c:2224 #, c-format msgid "\"time\" units \"%s\" not recognized" msgstr "\"час\" містить нерозпізанін одиниці \"%s\"" -#: utils/adt/date.c:2167 +#: utils/adt/date.c:2347 #, c-format msgid "time zone displacement out of range" msgstr "зсув часового поясу поза діапазоном" -#: utils/adt/date.c:2796 utils/adt/date.c:2809 +#: utils/adt/date.c:2986 utils/adt/date.c:3006 #, c-format msgid "\"time with time zone\" units \"%s\" not recognized" msgstr "\"час з часовим поясом\" містить нерозпізнані одиниці \"%s\"" -#: utils/adt/date.c:2882 utils/adt/datetime.c:906 utils/adt/datetime.c:1813 -#: utils/adt/datetime.c:4601 utils/adt/timestamp.c:513 -#: utils/adt/timestamp.c:540 utils/adt/timestamp.c:4150 -#: utils/adt/timestamp.c:5100 utils/adt/timestamp.c:5342 +#: utils/adt/date.c:3095 utils/adt/datetime.c:951 utils/adt/datetime.c:1858 +#: utils/adt/datetime.c:4648 utils/adt/timestamp.c:515 +#: utils/adt/timestamp.c:542 utils/adt/timestamp.c:4265 +#: utils/adt/timestamp.c:5436 utils/adt/timestamp.c:5688 #, c-format msgid "time zone \"%s\" not recognized" msgstr "часовий пояс \"%s\" не розпізнаний" -#: utils/adt/date.c:2914 utils/adt/timestamp.c:5130 utils/adt/timestamp.c:5373 +#: utils/adt/date.c:3127 utils/adt/timestamp.c:5466 utils/adt/timestamp.c:5719 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "інтервал \"%s\", який задає часовий пояс, не повинен включати місяці або дні" -#: utils/adt/datetime.c:3730 utils/adt/datetime.c:3737 +#: utils/adt/datetime.c:3775 utils/adt/datetime.c:3782 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "значення поля типу дата/час поза діапазоном: \"%s\"" -#: utils/adt/datetime.c:3739 +#: utils/adt/datetime.c:3784 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Можливо, вам потрібні інші налаштування \"datestyle\"." -#: utils/adt/datetime.c:3744 +#: utils/adt/datetime.c:3789 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "значення поля типу інтервал, поза діапазоном: \"%s\"" -#: utils/adt/datetime.c:3750 +#: utils/adt/datetime.c:3795 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "зміщення часового поясу, поза діапазоном: \"%s\"" -#: utils/adt/datetime.c:4603 +#: utils/adt/datetime.c:4650 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "Це ім'я часового поясу з'являється у файлі конфігурації часового поясу з кодом \"%s\"." @@ -21276,17 +22065,17 @@ msgstr "Це ім'я часового поясу з'являється у фай msgid "invalid Datum pointer" msgstr "неприпустимий вказівник Datum" -#: utils/adt/dbsize.c:759 utils/adt/dbsize.c:827 +#: utils/adt/dbsize.c:754 utils/adt/dbsize.c:822 #, c-format msgid "invalid size: \"%s\"" msgstr "неприпустимий розмір: \"%s\"" -#: utils/adt/dbsize.c:828 +#: utils/adt/dbsize.c:823 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Неприпустима одиниця вимірювання розміру: \"%s\"." -#: utils/adt/dbsize.c:829 +#: utils/adt/dbsize.c:824 #, c-format msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." msgstr "Припустимі одиниці вимірювання: \"bytes\", \"kB\", \"MB\", \"GB\", і \"TB\"." @@ -21296,12 +22085,12 @@ msgstr "Припустимі одиниці вимірювання: \"bytes\", \ msgid "type %s is not a domain" msgstr "тип %s не є доменом" -#: utils/adt/encode.c:64 utils/adt/encode.c:112 +#: utils/adt/encode.c:68 utils/adt/encode.c:112 #, c-format msgid "unrecognized encoding: \"%s\"" msgstr "нерозпізнане кодування: \"%s\"" -#: utils/adt/encode.c:78 +#: utils/adt/encode.c:82 #, c-format msgid "result of encoding conversion is too large" msgstr "результат перетворення кодування занадто великий" @@ -21311,83 +22100,66 @@ msgstr "результат перетворення кодування зана msgid "result of decoding conversion is too large" msgstr "результат перетворення декодування занадто великий" -#: utils/adt/encode.c:184 -#, c-format -msgid "invalid hexadecimal digit: \"%c\"" -msgstr "неприпустиме шістнадцяткове число: \"%c\"" - -#: utils/adt/encode.c:212 -#, c-format -msgid "invalid hexadecimal data: odd number of digits" -msgstr "неприпустимі шістнадцядкові дані: непарна кількість чисел" - -#: utils/adt/encode.c:329 +#: utils/adt/encode.c:261 #, c-format msgid "unexpected \"=\" while decoding base64 sequence" msgstr "неочікуваний символ \"=\" під час декодування послідовності base64" -#: utils/adt/encode.c:341 +#: utils/adt/encode.c:273 #, c-format -msgid "invalid symbol \"%c\" while decoding base64 sequence" -msgstr "неприпустимий символ \"%c\" під час декодування послідовності base64" +msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" +msgstr "виявлено неприпустимий символ \"%.*s\" під час декодування послідовності base64" -#: utils/adt/encode.c:361 +#: utils/adt/encode.c:304 #, c-format msgid "invalid base64 end sequence" msgstr "неприпустима скінченна послідовність base64" -#: utils/adt/encode.c:362 +#: utils/adt/encode.c:305 #, c-format msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "Вхідні дані позбавлені можливості заповнення, скорочені, або пошкоджені іншим чином." -#: utils/adt/encode.c:476 utils/adt/encode.c:541 utils/adt/jsonfuncs.c:619 -#: utils/adt/varlena.c:319 utils/adt/varlena.c:360 jsonpath_gram.y:528 +#: utils/adt/encode.c:435 utils/adt/encode.c:501 utils/adt/jsonfuncs.c:623 +#: utils/adt/varlena.c:339 utils/adt/varlena.c:380 jsonpath_gram.y:528 #: jsonpath_scan.l:519 jsonpath_scan.l:530 jsonpath_scan.l:540 #: jsonpath_scan.l:582 #, c-format msgid "invalid input syntax for type %s" msgstr "неприпустимий вхідний синтаксис для типу %s" -#: utils/adt/enum.c:100 +#: utils/adt/enum.c:99 #, c-format msgid "unsafe use of new value \"%s\" of enum type %s" msgstr "небезпечне використання нового значення \"%s\" типу переліку %s" -#: utils/adt/enum.c:103 +#: utils/adt/enum.c:102 #, c-format msgid "New enum values must be committed before they can be used." msgstr "Нові значення переліку повинні бути затверджені, перш ніж їх можна використовувати." -#: utils/adt/enum.c:121 utils/adt/enum.c:131 utils/adt/enum.c:189 -#: utils/adt/enum.c:199 +#: utils/adt/enum.c:120 utils/adt/enum.c:130 utils/adt/enum.c:188 +#: utils/adt/enum.c:198 #, c-format msgid "invalid input value for enum %s: \"%s\"" msgstr "неприпустиме вхідне значення для переліку %s: \"%s\"" -#: utils/adt/enum.c:161 utils/adt/enum.c:227 utils/adt/enum.c:286 +#: utils/adt/enum.c:160 utils/adt/enum.c:226 utils/adt/enum.c:285 #, c-format msgid "invalid internal value for enum: %u" msgstr "неприпустиме внутрішнє значення для переліку: %u" -#: utils/adt/enum.c:446 utils/adt/enum.c:475 utils/adt/enum.c:515 -#: utils/adt/enum.c:535 +#: utils/adt/enum.c:445 utils/adt/enum.c:474 utils/adt/enum.c:514 +#: utils/adt/enum.c:534 #, c-format msgid "could not determine actual enum type" msgstr "не вдалося визначити фактичний тип переліку" -#: utils/adt/enum.c:454 utils/adt/enum.c:483 +#: utils/adt/enum.c:453 utils/adt/enum.c:482 #, c-format msgid "enum %s contains no values" msgstr "перелік %s не містить значень" -#: utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 -#: utils/cache/typcache.c:1632 utils/cache/typcache.c:1788 -#: utils/cache/typcache.c:1918 utils/fmgr/funcapi.c:456 -#, c-format -msgid "type %s is not composite" -msgstr "тип %s не є складеним" - #: utils/adt/float.c:88 #, c-format msgid "value out of range: overflow" @@ -21403,74 +22175,76 @@ msgstr "значення поза діапазоном: недостача" msgid "\"%s\" is out of range for type real" msgstr "\"%s\" поза діапазоном для дійсного типу" -#: utils/adt/float.c:489 +#: utils/adt/float.c:477 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "\"%s\" поза діапазоном для типу double precision" -#: utils/adt/float.c:1268 utils/adt/float.c:1342 utils/adt/int.c:336 -#: utils/adt/int.c:874 utils/adt/int.c:896 utils/adt/int.c:910 -#: utils/adt/int.c:924 utils/adt/int.c:956 utils/adt/int.c:1194 -#: utils/adt/int8.c:1313 utils/adt/numeric.c:3553 utils/adt/numeric.c:3562 +#: utils/adt/float.c:1258 utils/adt/float.c:1332 utils/adt/int.c:334 +#: utils/adt/int.c:872 utils/adt/int.c:894 utils/adt/int.c:908 +#: utils/adt/int.c:922 utils/adt/int.c:954 utils/adt/int.c:1192 +#: utils/adt/int8.c:1320 utils/adt/numeric.c:4315 utils/adt/numeric.c:4320 #, c-format msgid "smallint out of range" msgstr "двобайтове ціле поза діапазоном" -#: utils/adt/float.c:1468 utils/adt/numeric.c:8329 +#: utils/adt/float.c:1458 utils/adt/numeric.c:3549 utils/adt/numeric.c:9296 #, c-format msgid "cannot take square root of a negative number" msgstr "вилучити квадратний корінь від'ємного числа не можна" -#: utils/adt/float.c:1536 utils/adt/numeric.c:3239 +#: utils/adt/float.c:1526 utils/adt/numeric.c:3824 utils/adt/numeric.c:3936 #, c-format msgid "zero raised to a negative power is undefined" msgstr "нуль у від'ємному ступені дає невизначеність" -#: utils/adt/float.c:1540 utils/adt/numeric.c:3245 +#: utils/adt/float.c:1530 utils/adt/numeric.c:3828 utils/adt/numeric.c:10193 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "від'ємне число у не цілому ступені дає комплексний результат" -#: utils/adt/float.c:1614 utils/adt/float.c:1647 utils/adt/numeric.c:8993 +#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3736 +#: utils/adt/numeric.c:9966 #, c-format msgid "cannot take logarithm of zero" msgstr "обчислити логарифм нуля не можна" -#: utils/adt/float.c:1618 utils/adt/float.c:1651 utils/adt/numeric.c:8997 +#: utils/adt/float.c:1710 utils/adt/float.c:1743 utils/adt/numeric.c:3674 +#: utils/adt/numeric.c:3731 utils/adt/numeric.c:9970 #, c-format msgid "cannot take logarithm of a negative number" msgstr "обчислити логарифм від'ємного числа не можна" -#: utils/adt/float.c:1684 utils/adt/float.c:1715 utils/adt/float.c:1810 -#: utils/adt/float.c:1837 utils/adt/float.c:1865 utils/adt/float.c:1892 -#: utils/adt/float.c:2039 utils/adt/float.c:2076 utils/adt/float.c:2246 -#: utils/adt/float.c:2302 utils/adt/float.c:2367 utils/adt/float.c:2424 -#: utils/adt/float.c:2615 utils/adt/float.c:2639 +#: utils/adt/float.c:1776 utils/adt/float.c:1807 utils/adt/float.c:1902 +#: utils/adt/float.c:1929 utils/adt/float.c:1957 utils/adt/float.c:1984 +#: utils/adt/float.c:2131 utils/adt/float.c:2168 utils/adt/float.c:2338 +#: utils/adt/float.c:2394 utils/adt/float.c:2459 utils/adt/float.c:2516 +#: utils/adt/float.c:2707 utils/adt/float.c:2731 #, c-format msgid "input is out of range" msgstr "введене значення поза діапазоном" -#: utils/adt/float.c:2706 +#: utils/adt/float.c:2798 #, c-format msgid "setseed parameter %g is out of allowed range [-1,1]" msgstr "параметр setseed %g поза допустимим діапазоном [-1,1]" -#: utils/adt/float.c:3938 utils/adt/numeric.c:1509 +#: utils/adt/float.c:4030 utils/adt/numeric.c:1708 #, c-format msgid "count must be greater than zero" msgstr "лічильник повинен бути більше нуля" -#: utils/adt/float.c:3943 utils/adt/numeric.c:1516 +#: utils/adt/float.c:4035 utils/adt/numeric.c:1719 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "операнд, нижня границя і верхня границя не можуть бути NaN" -#: utils/adt/float.c:3949 +#: utils/adt/float.c:4041 utils/adt/numeric.c:1724 #, c-format msgid "lower and upper bounds must be finite" msgstr "нижня і верхня границі повинні бути скінченними" -#: utils/adt/float.c:3983 utils/adt/numeric.c:1529 +#: utils/adt/float.c:4075 utils/adt/numeric.c:1738 #, c-format msgid "lower bound cannot equal upper bound" msgstr "нижня границя не може дорівнювати верхній границі" @@ -21555,216 +22329,221 @@ msgstr "\"EEEE\" є несумісним з іншими форматами" msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "\"EEEE\" може використовуватись лише разом з шаблонами цифр і десяткової точки." -#: utils/adt/formatting.c:1392 +#: utils/adt/formatting.c:1394 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "неприпустимий роздільник формату дати й часу: \"%s\"" -#: utils/adt/formatting.c:1520 +#: utils/adt/formatting.c:1521 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\" не є числом" -#: utils/adt/formatting.c:1598 +#: utils/adt/formatting.c:1599 #, c-format msgid "case conversion failed: %s" msgstr "помилка при перетворенні регістру: %s" -#: utils/adt/formatting.c:1663 utils/adt/formatting.c:1787 -#: utils/adt/formatting.c:1912 +#: utils/adt/formatting.c:1664 utils/adt/formatting.c:1788 +#: utils/adt/formatting.c:1913 #, c-format msgid "could not determine which collation to use for %s function" msgstr "не вдалося визначити який параметр сортування використати для функції %s" -#: utils/adt/formatting.c:2284 +#: utils/adt/formatting.c:2285 #, c-format msgid "invalid combination of date conventions" msgstr "неприпустиме поєднання стилів дат" -#: utils/adt/formatting.c:2285 +#: utils/adt/formatting.c:2286 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "Не змішуйте Gregorian і ISO стилі дат (тижнів) в одному шаблоні форматування." -#: utils/adt/formatting.c:2308 +#: utils/adt/formatting.c:2309 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "конфліктуючі значення для \"%s\" поля в рядку форматування" -#: utils/adt/formatting.c:2311 +#: utils/adt/formatting.c:2312 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Це значення суперечить попередньому параметри для поля того ж типу." -#: utils/adt/formatting.c:2382 +#: utils/adt/formatting.c:2383 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "вихідний рядок занадто короткий для \"%s\" поля форматування" -#: utils/adt/formatting.c:2385 +#: utils/adt/formatting.c:2386 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Поле потребує %d символів, але залишилось лише %d." -#: utils/adt/formatting.c:2388 utils/adt/formatting.c:2403 +#: utils/adt/formatting.c:2389 utils/adt/formatting.c:2404 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "Якщо ваш вихідний рядок не має постійної ширини, спробуйте використати \"FM\" модифікатор." -#: utils/adt/formatting.c:2398 utils/adt/formatting.c:2412 -#: utils/adt/formatting.c:2635 +#: utils/adt/formatting.c:2399 utils/adt/formatting.c:2413 +#: utils/adt/formatting.c:2636 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "неприпустиме значення \"%s\" для \"%s\"" -#: utils/adt/formatting.c:2400 +#: utils/adt/formatting.c:2401 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Поле потребує %d символів, але вдалося аналізувати лише %d." -#: utils/adt/formatting.c:2414 +#: utils/adt/formatting.c:2415 #, c-format msgid "Value must be an integer." msgstr "Значення повинне бути цілим числом." -#: utils/adt/formatting.c:2419 +#: utils/adt/formatting.c:2420 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "значення для \"%s\" у вихідному рядку поза діапазоном" -#: utils/adt/formatting.c:2421 +#: utils/adt/formatting.c:2422 #, c-format msgid "Value must be in the range %d to %d." msgstr "Значення повинне бути в діапазоні %d до %d." -#: utils/adt/formatting.c:2637 +#: utils/adt/formatting.c:2638 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "Дане значення не відповідає жодному з доступних значень для цього поля." -#: utils/adt/formatting.c:2854 utils/adt/formatting.c:2874 -#: utils/adt/formatting.c:2894 utils/adt/formatting.c:2914 -#: utils/adt/formatting.c:2933 utils/adt/formatting.c:2952 -#: utils/adt/formatting.c:2976 utils/adt/formatting.c:2994 -#: utils/adt/formatting.c:3012 utils/adt/formatting.c:3030 -#: utils/adt/formatting.c:3047 utils/adt/formatting.c:3064 +#: utils/adt/formatting.c:2855 utils/adt/formatting.c:2875 +#: utils/adt/formatting.c:2895 utils/adt/formatting.c:2915 +#: utils/adt/formatting.c:2934 utils/adt/formatting.c:2953 +#: utils/adt/formatting.c:2977 utils/adt/formatting.c:2995 +#: utils/adt/formatting.c:3013 utils/adt/formatting.c:3031 +#: utils/adt/formatting.c:3048 utils/adt/formatting.c:3065 #, c-format msgid "localized string format value too long" msgstr "занадто довге значення формату локалізованого рядка" -#: utils/adt/formatting.c:3298 +#: utils/adt/formatting.c:3342 #, c-format msgid "unmatched format separator \"%c\"" msgstr "невідповідний роздільник формату \"%c\"" -#: utils/adt/formatting.c:3453 utils/adt/formatting.c:3797 +#: utils/adt/formatting.c:3403 +#, c-format +msgid "unmatched format character \"%s\"" +msgstr "невідповідний формат символу \"%s\"" + +#: utils/adt/formatting.c:3509 utils/adt/formatting.c:3853 #, c-format msgid "formatting field \"%s\" is only supported in to_char" msgstr "поле форматування \"%s\" підтримується лише в функції to_char" -#: utils/adt/formatting.c:3628 +#: utils/adt/formatting.c:3684 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "неприпустимий вхідний рядок для \"Y,YYY\"" -#: utils/adt/formatting.c:3714 +#: utils/adt/formatting.c:3770 #, c-format msgid "input string is too short for datetime format" msgstr "вхідний рядок занадто короткий для формату дати й часу" -#: utils/adt/formatting.c:3722 +#: utils/adt/formatting.c:3778 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "символи наприкінці залишаються у вхідному рядку після формату дати й часу" -#: utils/adt/formatting.c:4267 +#: utils/adt/formatting.c:4323 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "пропущено часовий пояс у вхідному рядку для типу timestamptz" -#: utils/adt/formatting.c:4273 +#: utils/adt/formatting.c:4329 #, c-format msgid "timestamptz out of range" msgstr "timestamptz поза діапазоном" -#: utils/adt/formatting.c:4301 +#: utils/adt/formatting.c:4357 #, c-format msgid "datetime format is zoned but not timed" msgstr "формат дати й часу зоновано, але не приурочено" -#: utils/adt/formatting.c:4353 +#: utils/adt/formatting.c:4409 #, c-format msgid "missing time zone in input string for type timetz" msgstr "пропущено часовий пояс у вхідному рядку для типу timetz" -#: utils/adt/formatting.c:4359 +#: utils/adt/formatting.c:4415 #, c-format msgid "timetz out of range" msgstr "timetz поза діапазоном" -#: utils/adt/formatting.c:4385 +#: utils/adt/formatting.c:4441 #, c-format msgid "datetime format is not dated and not timed" msgstr "формат дати й часу не датований і не приурочений" -#: utils/adt/formatting.c:4518 +#: utils/adt/formatting.c:4574 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "година \"%d\" неприпустима для 12-часового годинника" -#: utils/adt/formatting.c:4520 +#: utils/adt/formatting.c:4576 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Використайте 24-часовий годинник, або передавайте години від 1 до 12." -#: utils/adt/formatting.c:4628 +#: utils/adt/formatting.c:4687 #, c-format msgid "cannot calculate day of year without year information" msgstr "не можна обчислити день року без інформації про рік" -#: utils/adt/formatting.c:5547 +#: utils/adt/formatting.c:5606 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\" не підтримується при введенні" -#: utils/adt/formatting.c:5559 +#: utils/adt/formatting.c:5618 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\" не підтримується при введенні" -#: utils/adt/genfile.c:75 +#: utils/adt/genfile.c:78 #, c-format msgid "reference to parent directory (\"..\") not allowed" msgstr "посилання на батьківський каталог (\"..\") не дозволене" -#: utils/adt/genfile.c:86 +#: utils/adt/genfile.c:89 #, c-format msgid "absolute path not allowed" msgstr "абсолютний шлях не дозволений" -#: utils/adt/genfile.c:91 +#: utils/adt/genfile.c:94 #, c-format msgid "path must be in or below the current directory" msgstr "шлях повинен вказувати поточний або вкладений каталог" -#: utils/adt/genfile.c:116 utils/adt/oracle_compat.c:185 -#: utils/adt/oracle_compat.c:283 utils/adt/oracle_compat.c:759 -#: utils/adt/oracle_compat.c:1054 +#: utils/adt/genfile.c:119 utils/adt/oracle_compat.c:187 +#: utils/adt/oracle_compat.c:285 utils/adt/oracle_compat.c:833 +#: utils/adt/oracle_compat.c:1128 #, c-format msgid "requested length too large" msgstr "запитана довжина занадто велика" -#: utils/adt/genfile.c:133 +#: utils/adt/genfile.c:136 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "не вдалося знайти в файлі \"%s\": %m" -#: utils/adt/genfile.c:174 +#: utils/adt/genfile.c:176 #, c-format msgid "file length too large" msgstr "довжина файлу завелика" -#: utils/adt/genfile.c:251 +#: utils/adt/genfile.c:253 #, c-format msgid "must be superuser to read files with adminpack 1.0" msgstr "щоб читати файли, використовуючи adminpack 1.0 потрібно бути суперкористувачем" @@ -21774,73 +22553,73 @@ msgstr "щоб читати файли, використовуючи adminpack 1 msgid "invalid line specification: A and B cannot both be zero" msgstr "неприпустима специфікація рядка: A і B не можуть бути нульовими" -#: utils/adt/geo_ops.c:987 utils/adt/geo_ops.c:1090 +#: utils/adt/geo_ops.c:987 utils/adt/geo_ops.c:1097 #, c-format msgid "invalid line specification: must be two distinct points" msgstr "неприпустима специфікація рядка: повинно бути дві різних точки" -#: utils/adt/geo_ops.c:1399 utils/adt/geo_ops.c:3486 utils/adt/geo_ops.c:4354 -#: utils/adt/geo_ops.c:5248 +#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3498 utils/adt/geo_ops.c:4366 +#: utils/adt/geo_ops.c:5260 #, c-format msgid "too many points requested" msgstr "запитано занадто багато точок" -#: utils/adt/geo_ops.c:1461 +#: utils/adt/geo_ops.c:1472 #, c-format msgid "invalid number of points in external \"path\" value" msgstr "неприпустима кількість точок у зовнішньому значенні \"path\"" -#: utils/adt/geo_ops.c:2537 +#: utils/adt/geo_ops.c:2549 #, c-format msgid "function \"dist_lb\" not implemented" msgstr "функція \"dist_lb\" не реалізована" -#: utils/adt/geo_ops.c:2556 +#: utils/adt/geo_ops.c:2568 #, c-format msgid "function \"dist_bl\" not implemented" msgstr "функція \"dist_bl\" не реалізована" -#: utils/adt/geo_ops.c:2975 +#: utils/adt/geo_ops.c:2987 #, c-format msgid "function \"close_sl\" not implemented" msgstr "функція \"close_sl\" не реалізована" -#: utils/adt/geo_ops.c:3122 +#: utils/adt/geo_ops.c:3134 #, c-format msgid "function \"close_lb\" not implemented" msgstr "функція \"close_lb\" не реалізована" -#: utils/adt/geo_ops.c:3533 +#: utils/adt/geo_ops.c:3545 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "неприпустима кількість точок в зовнішньому значенні \"polygon\"" -#: utils/adt/geo_ops.c:4069 +#: utils/adt/geo_ops.c:4081 #, c-format msgid "function \"poly_distance\" not implemented" msgstr "функція \"poly_distance\" не реалізована" -#: utils/adt/geo_ops.c:4446 +#: utils/adt/geo_ops.c:4458 #, c-format msgid "function \"path_center\" not implemented" msgstr "функція \"path_center\" не реалізована" -#: utils/adt/geo_ops.c:4463 +#: utils/adt/geo_ops.c:4475 #, c-format msgid "open path cannot be converted to polygon" msgstr "відкритий шлях не можна перетворити в багатокутник" -#: utils/adt/geo_ops.c:4713 +#: utils/adt/geo_ops.c:4725 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "неприпустимий радіус у зовнішньому значенні \"circle\"" -#: utils/adt/geo_ops.c:5234 +#: utils/adt/geo_ops.c:5246 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "круг з нульовим радіусом не можна перетворити в багатокутник" -#: utils/adt/geo_ops.c:5239 +#: utils/adt/geo_ops.c:5251 #, c-format msgid "must request at least 2 points" msgstr "повинно бути запитано мінімум 2 точки" @@ -21850,38 +22629,38 @@ msgstr "повинно бути запитано мінімум 2 точки" msgid "int2vector has too many elements" msgstr "int2vector має занадто багато елементів" -#: utils/adt/int.c:239 +#: utils/adt/int.c:237 #, c-format msgid "invalid int2vector data" msgstr "неприпустимі дані int2vector" -#: utils/adt/int.c:245 utils/adt/oid.c:215 utils/adt/oid.c:296 +#: utils/adt/int.c:243 utils/adt/oid.c:215 utils/adt/oid.c:296 #, c-format msgid "oidvector has too many elements" msgstr "oidvector має занадто багато елементів" -#: utils/adt/int.c:1510 utils/adt/int8.c:1439 utils/adt/numeric.c:1417 -#: utils/adt/timestamp.c:5435 utils/adt/timestamp.c:5515 +#: utils/adt/int.c:1508 utils/adt/int8.c:1446 utils/adt/numeric.c:1616 +#: utils/adt/timestamp.c:5781 utils/adt/timestamp.c:5861 #, c-format msgid "step size cannot equal zero" msgstr "розмір кроку не може дорівнювати нулю" -#: utils/adt/int8.c:527 utils/adt/int8.c:550 utils/adt/int8.c:564 -#: utils/adt/int8.c:578 utils/adt/int8.c:609 utils/adt/int8.c:633 -#: utils/adt/int8.c:715 utils/adt/int8.c:783 utils/adt/int8.c:789 -#: utils/adt/int8.c:815 utils/adt/int8.c:829 utils/adt/int8.c:853 -#: utils/adt/int8.c:866 utils/adt/int8.c:935 utils/adt/int8.c:949 -#: utils/adt/int8.c:963 utils/adt/int8.c:994 utils/adt/int8.c:1016 -#: utils/adt/int8.c:1030 utils/adt/int8.c:1044 utils/adt/int8.c:1077 -#: utils/adt/int8.c:1091 utils/adt/int8.c:1105 utils/adt/int8.c:1136 -#: utils/adt/int8.c:1158 utils/adt/int8.c:1172 utils/adt/int8.c:1186 -#: utils/adt/int8.c:1348 utils/adt/int8.c:1383 utils/adt/numeric.c:3508 -#: utils/adt/varbit.c:1656 +#: utils/adt/int8.c:534 utils/adt/int8.c:557 utils/adt/int8.c:571 +#: utils/adt/int8.c:585 utils/adt/int8.c:616 utils/adt/int8.c:640 +#: utils/adt/int8.c:722 utils/adt/int8.c:790 utils/adt/int8.c:796 +#: utils/adt/int8.c:822 utils/adt/int8.c:836 utils/adt/int8.c:860 +#: utils/adt/int8.c:873 utils/adt/int8.c:942 utils/adt/int8.c:956 +#: utils/adt/int8.c:970 utils/adt/int8.c:1001 utils/adt/int8.c:1023 +#: utils/adt/int8.c:1037 utils/adt/int8.c:1051 utils/adt/int8.c:1084 +#: utils/adt/int8.c:1098 utils/adt/int8.c:1112 utils/adt/int8.c:1143 +#: utils/adt/int8.c:1165 utils/adt/int8.c:1179 utils/adt/int8.c:1193 +#: utils/adt/int8.c:1355 utils/adt/int8.c:1390 utils/adt/numeric.c:4274 +#: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigint поза діапазоном" -#: utils/adt/int8.c:1396 +#: utils/adt/int8.c:1403 #, c-format msgid "OID out of range" msgstr "OID поза діапазоном" @@ -21891,7 +22670,7 @@ msgstr "OID поза діапазоном" msgid "key value must be scalar, not array, composite, or json" msgstr "значенням ключа повинен бути скаляр, не масив, композитний тип, або json" -#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:1812 +#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:1992 #, c-format msgid "could not determine data type for argument %d" msgstr "не вдалося визначити тип даних для аргументу %d" @@ -21993,225 +22772,261 @@ msgstr "привести об'єкт jsonb до типу %s не можна" msgid "cannot cast jsonb array or object to type %s" msgstr "привести масив або об'єкт jsonb до типу %s не можна" -#: utils/adt/jsonb_util.c:699 +#: utils/adt/jsonb_util.c:751 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "кількість пар об'єкта jsonb перевищує максимально дозволену (%zu)" -#: utils/adt/jsonb_util.c:740 +#: utils/adt/jsonb_util.c:792 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "кількість елементів масиву jsonb перевищує максимально дозволену(%zu)" -#: utils/adt/jsonb_util.c:1614 utils/adt/jsonb_util.c:1634 +#: utils/adt/jsonb_util.c:1666 utils/adt/jsonb_util.c:1686 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %u bytes" msgstr "загальний розмір елементів масиву jsonb перевищує максимум (%u байт)" -#: utils/adt/jsonb_util.c:1695 utils/adt/jsonb_util.c:1730 -#: utils/adt/jsonb_util.c:1750 +#: utils/adt/jsonb_util.c:1747 utils/adt/jsonb_util.c:1782 +#: utils/adt/jsonb_util.c:1802 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %u bytes" msgstr "загальний розмір елементів об'єкту jsonb перевищує максимум (%u байт)" -#: utils/adt/jsonfuncs.c:551 utils/adt/jsonfuncs.c:796 -#: utils/adt/jsonfuncs.c:2330 utils/adt/jsonfuncs.c:2770 -#: utils/adt/jsonfuncs.c:3560 utils/adt/jsonfuncs.c:3891 +#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:152 +#, c-format +msgid "jsonb subscript does not support slices" +msgstr "підрядковий символ jsonb не підтримує сектори" + +#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:118 +#, c-format +msgid "subscript type is not supported" +msgstr "тип підрядкового символу не підтримується" + +#: utils/adt/jsonbsubs.c:104 +#, c-format +msgid "Jsonb subscript must be coerced only to one type, integer or text." +msgstr "Підрядковий символ jsonb повинен бути приведений лише до одного типу, integer або text." + +#: utils/adt/jsonbsubs.c:119 +#, c-format +msgid "Jsonb subscript must be coerced to either integer or text" +msgstr "Підрядковий символ jsonb повинен бути приведений або до integer, або до text" + +#: utils/adt/jsonbsubs.c:140 +#, c-format +msgid "jsonb subscript must have text type" +msgstr "підрядковий символ jsonb повинен мати тип text" + +#: utils/adt/jsonbsubs.c:208 +#, c-format +msgid "jsonb subscript in assignment must not be null" +msgstr "підрядковий символ jsonb у присвоєнні не повинен бути null" + +#: utils/adt/jsonfuncs.c:555 utils/adt/jsonfuncs.c:789 +#: utils/adt/jsonfuncs.c:2471 utils/adt/jsonfuncs.c:2911 +#: utils/adt/jsonfuncs.c:3700 utils/adt/jsonfuncs.c:4030 #, c-format msgid "cannot call %s on a scalar" msgstr "викликати %s зі скаляром, не можна" -#: utils/adt/jsonfuncs.c:556 utils/adt/jsonfuncs.c:783 -#: utils/adt/jsonfuncs.c:2772 utils/adt/jsonfuncs.c:3549 +#: utils/adt/jsonfuncs.c:560 utils/adt/jsonfuncs.c:776 +#: utils/adt/jsonfuncs.c:2913 utils/adt/jsonfuncs.c:3689 #, c-format msgid "cannot call %s on an array" msgstr "викликати %s з масивом, не можна" -#: utils/adt/jsonfuncs.c:613 jsonpath_scan.l:498 +#: utils/adt/jsonfuncs.c:617 jsonpath_scan.l:498 #, c-format msgid "unsupported Unicode escape sequence" msgstr "непідтримувана спеціальна послідовність Unicode" -#: utils/adt/jsonfuncs.c:692 +#: utils/adt/jsonfuncs.c:685 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "Дані JSON, рядок %d: %s%s%s" -#: utils/adt/jsonfuncs.c:1682 utils/adt/jsonfuncs.c:1717 +#: utils/adt/jsonfuncs.c:1823 utils/adt/jsonfuncs.c:1858 #, c-format msgid "cannot get array length of a scalar" msgstr "отримати довжину скаляра масиву не можна" -#: utils/adt/jsonfuncs.c:1686 utils/adt/jsonfuncs.c:1705 +#: utils/adt/jsonfuncs.c:1827 utils/adt/jsonfuncs.c:1846 #, c-format msgid "cannot get array length of a non-array" msgstr "отримати довжину масива для не масиву не можна" -#: utils/adt/jsonfuncs.c:1782 +#: utils/adt/jsonfuncs.c:1923 #, c-format msgid "cannot call %s on a non-object" msgstr "викликати %s з не об'єктом, не можна" -#: utils/adt/jsonfuncs.c:2021 +#: utils/adt/jsonfuncs.c:2162 #, c-format msgid "cannot deconstruct an array as an object" msgstr "вилучити масив у вигляді об'єкту не можна" -#: utils/adt/jsonfuncs.c:2033 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot deconstruct a scalar" msgstr "вилучити скаляр не можна" -#: utils/adt/jsonfuncs.c:2079 +#: utils/adt/jsonfuncs.c:2220 #, c-format msgid "cannot extract elements from a scalar" msgstr "вилучити елементи зі скаляру не можна" -#: utils/adt/jsonfuncs.c:2083 +#: utils/adt/jsonfuncs.c:2224 #, c-format msgid "cannot extract elements from an object" msgstr "вилучити елементи з об'єкту не можна" -#: utils/adt/jsonfuncs.c:2317 utils/adt/jsonfuncs.c:3775 +#: utils/adt/jsonfuncs.c:2458 utils/adt/jsonfuncs.c:3915 #, c-format msgid "cannot call %s on a non-array" msgstr "викликати %s з не масивом не можна" -#: utils/adt/jsonfuncs.c:2387 utils/adt/jsonfuncs.c:2392 -#: utils/adt/jsonfuncs.c:2409 utils/adt/jsonfuncs.c:2415 +#: utils/adt/jsonfuncs.c:2528 utils/adt/jsonfuncs.c:2533 +#: utils/adt/jsonfuncs.c:2550 utils/adt/jsonfuncs.c:2556 #, c-format msgid "expected JSON array" msgstr "очікувався масив JSON" -#: utils/adt/jsonfuncs.c:2388 +#: utils/adt/jsonfuncs.c:2529 #, c-format msgid "See the value of key \"%s\"." msgstr "Перевірте значення ключа \"%s\"." -#: utils/adt/jsonfuncs.c:2410 +#: utils/adt/jsonfuncs.c:2551 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Перевірте елемент масиву %s ключа \"%s\"." -#: utils/adt/jsonfuncs.c:2416 +#: utils/adt/jsonfuncs.c:2557 #, c-format msgid "See the array element %s." msgstr "Перевірте елемент масиву %s." -#: utils/adt/jsonfuncs.c:2451 +#: utils/adt/jsonfuncs.c:2592 #, c-format msgid "malformed JSON array" msgstr "неправильний масив JSON" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3278 +#: utils/adt/jsonfuncs.c:3419 #, c-format msgid "first argument of %s must be a row type" msgstr "першим аргументом %s повинен бути тип рядка" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3302 +#: utils/adt/jsonfuncs.c:3443 #, c-format msgid "could not determine row type for result of %s" msgstr "не вдалося визначити тип рядка для результату %s" -#: utils/adt/jsonfuncs.c:3304 +#: utils/adt/jsonfuncs.c:3445 #, c-format msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." msgstr "Надайте аргумент ненульового запису, або викличте функцію в реченні FROM, використовуючи список визначення стовпців." -#: utils/adt/jsonfuncs.c:3792 utils/adt/jsonfuncs.c:3873 +#: utils/adt/jsonfuncs.c:3932 utils/adt/jsonfuncs.c:4012 #, c-format msgid "argument of %s must be an array of objects" msgstr "аргументом %s повинен бути масив об'єктів" -#: utils/adt/jsonfuncs.c:3825 +#: utils/adt/jsonfuncs.c:3965 #, c-format msgid "cannot call %s on an object" msgstr "викликати %s з об'єктом не можна" -#: utils/adt/jsonfuncs.c:4286 utils/adt/jsonfuncs.c:4345 -#: utils/adt/jsonfuncs.c:4425 +#: utils/adt/jsonfuncs.c:4373 utils/adt/jsonfuncs.c:4432 +#: utils/adt/jsonfuncs.c:4512 #, c-format msgid "cannot delete from scalar" msgstr "видалити зі скаляру не можна" -#: utils/adt/jsonfuncs.c:4430 +#: utils/adt/jsonfuncs.c:4517 #, c-format msgid "cannot delete from object using integer index" msgstr "видалити з об'єкту по числовому індексу не можна" -#: utils/adt/jsonfuncs.c:4495 utils/adt/jsonfuncs.c:4653 +#: utils/adt/jsonfuncs.c:4585 utils/adt/jsonfuncs.c:4746 #, c-format msgid "cannot set path in scalar" msgstr "встановити шлях в скалярі не можна" -#: utils/adt/jsonfuncs.c:4537 utils/adt/jsonfuncs.c:4579 +#: utils/adt/jsonfuncs.c:4627 utils/adt/jsonfuncs.c:4669 #, c-format msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" msgstr "null_value_treatment має бути \"delete_key\", \"return_target\", \"use_json_null\", або \"raise_exception\"" -#: utils/adt/jsonfuncs.c:4550 +#: utils/adt/jsonfuncs.c:4640 #, c-format msgid "JSON value must not be null" msgstr "Значення JSON не повинне бути null" -#: utils/adt/jsonfuncs.c:4551 +#: utils/adt/jsonfuncs.c:4641 #, c-format msgid "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "Виняток було запущено через те, що null_value_treatment дорівнює \"raise_exception\"." -#: utils/adt/jsonfuncs.c:4552 +#: utils/adt/jsonfuncs.c:4642 #, c-format msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." msgstr "Щоб уникнути, або змініть аргумент null_value_treatment або переконайтесь що SQL NULL не передано." -#: utils/adt/jsonfuncs.c:4607 +#: utils/adt/jsonfuncs.c:4697 #, c-format msgid "cannot delete path in scalar" msgstr "видалити шлях в скалярі не можна" -#: utils/adt/jsonfuncs.c:4776 -#, c-format -msgid "invalid concatenation of jsonb objects" -msgstr "неприпустиме злиття об'єктів jsonb" - -#: utils/adt/jsonfuncs.c:4810 +#: utils/adt/jsonfuncs.c:4913 #, c-format msgid "path element at position %d is null" msgstr "елемент шляху в позиції %d є null" -#: utils/adt/jsonfuncs.c:4896 +#: utils/adt/jsonfuncs.c:4932 utils/adt/jsonfuncs.c:4963 +#: utils/adt/jsonfuncs.c:5030 #, c-format msgid "cannot replace existing key" msgstr "замініти існуючий ключ не можна" -#: utils/adt/jsonfuncs.c:4897 +#: utils/adt/jsonfuncs.c:4933 utils/adt/jsonfuncs.c:4964 +#, c-format +msgid "The path assumes key is a composite object, but it is a scalar value." +msgstr "Шлях припускає, що ключ є складеним об'єктом, але це скалярне значення." + +#: utils/adt/jsonfuncs.c:5031 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Спробуйте, використати функцію jsonb_set, щоб замінити значення ключа." -#: utils/adt/jsonfuncs.c:4979 +#: utils/adt/jsonfuncs.c:5135 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "елмент шляху в позиції %d не є цілим числом: \"%s\"" -#: utils/adt/jsonfuncs.c:5098 +#: utils/adt/jsonfuncs.c:5152 +#, c-format +msgid "path element at position %d is out of range: %d" +msgstr "елемент шляху в позиції %d поза діапазоном: %d" + +#: utils/adt/jsonfuncs.c:5304 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "неправильний тип позначки, дозволені лише масиви і скаляри" -#: utils/adt/jsonfuncs.c:5105 +#: utils/adt/jsonfuncs.c:5311 #, c-format msgid "flag array element is not a string" msgstr "елемент масиву позначок не є рядком" -#: utils/adt/jsonfuncs.c:5106 utils/adt/jsonfuncs.c:5128 +#: utils/adt/jsonfuncs.c:5312 utils/adt/jsonfuncs.c:5334 #, c-format msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." msgstr "Можливі значення: \"string\", \"numeric\", \"boolean\", \"key\", і \"all\"." -#: utils/adt/jsonfuncs.c:5126 +#: utils/adt/jsonfuncs.c:5332 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "неправильна позначка в масиві позначок: \"%s\"" @@ -22266,92 +23081,92 @@ msgstr "підрядковий символ масиву jsonpath поза ме msgid "jsonpath array accessor can only be applied to an array" msgstr "доступ до масиву jsonpath може бути застосований лише до масиву" -#: utils/adt/jsonpath_exec.c:874 +#: utils/adt/jsonpath_exec.c:872 #, c-format msgid "jsonpath wildcard member accessor can only be applied to an object" msgstr "доступ до підстановочного елемента jsonpath може бути застосований лише до об'єкта" -#: utils/adt/jsonpath_exec.c:1004 +#: utils/adt/jsonpath_exec.c:1002 #, c-format msgid "jsonpath item method .%s() can only be applied to an array" msgstr "метод елемента jsonpath .%s() може бути застосований лише до масиву" -#: utils/adt/jsonpath_exec.c:1059 +#: utils/adt/jsonpath_exec.c:1055 #, c-format msgid "numeric argument of jsonpath item method .%s() is out of range for type double precision" msgstr "числовий аргумент методу елемента jsonpath .%s() поза діапазоном для типу double precision" -#: utils/adt/jsonpath_exec.c:1080 +#: utils/adt/jsonpath_exec.c:1076 #, c-format msgid "string argument of jsonpath item method .%s() is not a valid representation of a double precision number" msgstr "строковий аргумент методу елемента jsonpath .%s() не є представленням числа double precision" -#: utils/adt/jsonpath_exec.c:1093 +#: utils/adt/jsonpath_exec.c:1089 #, c-format msgid "jsonpath item method .%s() can only be applied to a string or numeric value" msgstr "метод елемента jsonpath .%s() може бути застосований лише до рядка або числового значення" -#: utils/adt/jsonpath_exec.c:1583 +#: utils/adt/jsonpath_exec.c:1579 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "лівий операнд оператора jsonpath %s не є єдиним числовим значенням" -#: utils/adt/jsonpath_exec.c:1590 +#: utils/adt/jsonpath_exec.c:1586 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "правий операнд оператора jsonpath %s не є єдиним числовим значенням" -#: utils/adt/jsonpath_exec.c:1658 +#: utils/adt/jsonpath_exec.c:1654 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "операнд унарного оператора jsonpath %s не є єдиним числовим значенням" -#: utils/adt/jsonpath_exec.c:1756 +#: utils/adt/jsonpath_exec.c:1752 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "метод елемента jsonpath .%s() може бути застосований лише до числового значення" -#: utils/adt/jsonpath_exec.c:1796 +#: utils/adt/jsonpath_exec.c:1792 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "метод елемента jsonpath .%s() може бути застосований лише до рядку" -#: utils/adt/jsonpath_exec.c:1884 +#: utils/adt/jsonpath_exec.c:1886 #, c-format msgid "datetime format is not recognized: \"%s\"" msgstr "формат дати й часу не розпізнано: \"%s\"" -#: utils/adt/jsonpath_exec.c:1886 +#: utils/adt/jsonpath_exec.c:1888 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "Використайте аргумент шаблону дати й часу щоб вказати формат вхідних даних." -#: utils/adt/jsonpath_exec.c:1954 +#: utils/adt/jsonpath_exec.c:1956 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "метод елемента jsonpath .%s() може бути застосований лише до об'єкта" -#: utils/adt/jsonpath_exec.c:2137 +#: utils/adt/jsonpath_exec.c:2138 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "не вдалося знайти змінну jsonpath \"%s\"" -#: utils/adt/jsonpath_exec.c:2401 +#: utils/adt/jsonpath_exec.c:2402 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "підрядковий символ масиву jsonpath не є єдиним числовим значенням" -#: utils/adt/jsonpath_exec.c:2413 +#: utils/adt/jsonpath_exec.c:2414 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "підрядковий символ масиву jsonpath поза цілим діапазоном" -#: utils/adt/jsonpath_exec.c:2590 +#: utils/adt/jsonpath_exec.c:2591 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "не можна перетворити значення з %s в %s без використання часового поясу" -#: utils/adt/jsonpath_exec.c:2592 +#: utils/adt/jsonpath_exec.c:2593 #, c-format msgid "Use *_tz() function for time zone support." msgstr "Використовуйте функцію *_tz() для підтримки часового поясу." @@ -22416,68 +23231,128 @@ msgstr "дані macaddr8 поза діапазоном, для перетвор msgid "Only addresses that have FF and FE as values in the 4th and 5th bytes from the left, for example xx:xx:xx:ff:fe:xx:xx:xx, are eligible to be converted from macaddr8 to macaddr." msgstr "Лише адреси, які мають FF і FE в якості значень в четвертому і п'ятому байті зліва, наприклад xx:xx:xx:ff:fe:xx:xx:xx можуть бути перетворені з macaddr8 в macaddr." -#: utils/adt/misc.c:240 +#: utils/adt/mcxtfuncs.c:184 +#, c-format +msgid "must be a superuser to log memory contexts" +msgstr "щоб записувати контексти пам'яті, потрібно бути суперкористувачем" + +#: utils/adt/misc.c:243 #, c-format msgid "global tablespace never has databases" msgstr "в табличному просторі global николи не було баз даних" -#: utils/adt/misc.c:262 +#: utils/adt/misc.c:265 #, c-format msgid "%u is not a tablespace OID" msgstr "%u не є OID табличного простору" -#: utils/adt/misc.c:448 +#: utils/adt/misc.c:455 msgid "unreserved" msgstr "не зарезервовано" -#: utils/adt/misc.c:452 +#: utils/adt/misc.c:459 msgid "unreserved (cannot be function or type name)" msgstr "не зарезервовано (не може бути іменем типу або функції)" -#: utils/adt/misc.c:456 +#: utils/adt/misc.c:463 msgid "reserved (can be function or type name)" msgstr "зарезервовано (може бути іменем типу або функції)" -#: utils/adt/misc.c:460 +#: utils/adt/misc.c:467 msgid "reserved" msgstr "зарезервовано" -#: utils/adt/misc.c:634 utils/adt/misc.c:648 utils/adt/misc.c:687 -#: utils/adt/misc.c:693 utils/adt/misc.c:699 utils/adt/misc.c:722 +#: utils/adt/misc.c:478 +msgid "can be bare label" +msgstr "може бути пустою міткою" + +#: utils/adt/misc.c:483 +msgid "requires AS" +msgstr "потребує AS" + +#: utils/adt/misc.c:730 utils/adt/misc.c:744 utils/adt/misc.c:783 +#: utils/adt/misc.c:789 utils/adt/misc.c:795 utils/adt/misc.c:818 #, c-format msgid "string is not a valid identifier: \"%s\"" msgstr "рядок не є припустимим ідентифікатором: \"%s\"" -#: utils/adt/misc.c:636 +#: utils/adt/misc.c:732 #, c-format msgid "String has unclosed double quotes." msgstr "Рядок має не закриті лапки." -#: utils/adt/misc.c:650 +#: utils/adt/misc.c:746 #, c-format msgid "Quoted identifier must not be empty." msgstr "Ідентифікатор в лапках не повинен бути пустим." -#: utils/adt/misc.c:689 +#: utils/adt/misc.c:785 #, c-format msgid "No valid identifier before \".\"." msgstr "Перед \".\" немає припустимого ідентифікатору." -#: utils/adt/misc.c:695 +#: utils/adt/misc.c:791 #, c-format msgid "No valid identifier after \".\"." msgstr "Після \".\" немає припустимого ідентифікатора." -#: utils/adt/misc.c:753 +#: utils/adt/misc.c:849 #, c-format msgid "log format \"%s\" is not supported" msgstr "формат журналу \"%s\" не підтримується" -#: utils/adt/misc.c:754 +#: utils/adt/misc.c:850 #, c-format msgid "The supported log formats are \"stderr\" and \"csvlog\"." msgstr "Підтримуються формати журналів \"stderr\" і \"csvlog\"." +#: utils/adt/multirangetypes.c:148 utils/adt/multirangetypes.c:161 +#: utils/adt/multirangetypes.c:190 utils/adt/multirangetypes.c:260 +#: utils/adt/multirangetypes.c:284 +#, c-format +msgid "malformed multirange literal: \"%s\"" +msgstr "неправильний багатодіапазонний літерал: \"%s\"" + +#: utils/adt/multirangetypes.c:150 +#, c-format +msgid "Missing left brace." +msgstr "Пропущено ліву дужку." + +#: utils/adt/multirangetypes.c:192 +#, c-format +msgid "Expected range start." +msgstr "Очікуваний початок діапазону." + +#: utils/adt/multirangetypes.c:262 +#, c-format +msgid "Expected comma or end of multirange." +msgstr "Очікувалась кома або закінчення мультидіапазону." + +#: utils/adt/multirangetypes.c:972 +#, c-format +msgid "multiranges cannot be constructed from multidimensional arrays" +msgstr "мультидіапазони не можуть бути побудовані з багатовимірних масивів" + +#: utils/adt/multirangetypes.c:978 utils/adt/multirangetypes.c:1043 +#, c-format +msgid "type %u does not match constructor type" +msgstr "тип %u не відповідає типу конструктора" + +#: utils/adt/multirangetypes.c:1000 +#, c-format +msgid "multirange values cannot contain NULL members" +msgstr "мультидіапазонні значення не можуть містити членів NULL" + +#: utils/adt/multirangetypes.c:1350 +#, c-format +msgid "range_agg must be called with a range" +msgstr "range_agg потрібно викликати з діапазоном" + +#: utils/adt/multirangetypes.c:1421 +#, c-format +msgid "range_intersect_agg must be called with a multirange" +msgstr "range_intersect_agg потрібно викликати з мультидіапазоном" + #: utils/adt/network.c:111 #, c-format msgid "invalid cidr value: \"%s\"" @@ -22552,88 +23427,110 @@ msgstr "результат поза діапазоном" msgid "cannot subtract inet values of different sizes" msgstr "не можна віднімати значення inet різного розміру" -#: utils/adt/numeric.c:827 +#: utils/adt/numeric.c:967 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "неприпустимий знак у зовнішньому значенні \"numeric\"" -#: utils/adt/numeric.c:833 +#: utils/adt/numeric.c:973 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "неприпустимий масштаб у зовнішньому значенні \"numeric\"" -#: utils/adt/numeric.c:842 +#: utils/adt/numeric.c:982 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "неприпустиме число у зовнішньому значенні \"numeric\"" -#: utils/adt/numeric.c:1040 utils/adt/numeric.c:1054 +#: utils/adt/numeric.c:1195 utils/adt/numeric.c:1209 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "Точність NUMERIC %d повинна бути між 1 і %d" -#: utils/adt/numeric.c:1045 +#: utils/adt/numeric.c:1200 #, c-format msgid "NUMERIC scale %d must be between 0 and precision %d" msgstr "Масштаб NUMERIC %d повинен бути між 0 і точністю %d" -#: utils/adt/numeric.c:1063 +#: utils/adt/numeric.c:1218 #, c-format msgid "invalid NUMERIC type modifier" msgstr "неприпустимий модифікатор типу NUMERIC" -#: utils/adt/numeric.c:1395 +#: utils/adt/numeric.c:1576 #, c-format msgid "start value cannot be NaN" msgstr "початкове значення не може бути NaN" -#: utils/adt/numeric.c:1400 +#: utils/adt/numeric.c:1580 +#, c-format +msgid "start value cannot be infinity" +msgstr "початкове значення не може бути нескінченністю" + +#: utils/adt/numeric.c:1587 #, c-format msgid "stop value cannot be NaN" msgstr "кінцеве значення не може бути NaN" -#: utils/adt/numeric.c:1410 +#: utils/adt/numeric.c:1591 +#, c-format +msgid "stop value cannot be infinity" +msgstr "кінцеве значення не може бути нескінченністю" + +#: utils/adt/numeric.c:1604 #, c-format msgid "step size cannot be NaN" msgstr "розмір кроку не може бути NaN" -#: utils/adt/numeric.c:2958 utils/adt/numeric.c:6064 utils/adt/numeric.c:6522 -#: utils/adt/numeric.c:8802 utils/adt/numeric.c:9240 utils/adt/numeric.c:9354 -#: utils/adt/numeric.c:9427 +#: utils/adt/numeric.c:1608 #, c-format -msgid "value overflows numeric format" -msgstr "значення переповнюють формат numeric" +msgid "step size cannot be infinity" +msgstr "розмір кроку не може бути нескінченністю" -#: utils/adt/numeric.c:3417 +#: utils/adt/numeric.c:3489 #, c-format -msgid "cannot convert NaN to integer" -msgstr "перетворити NaN в ціле число не можна" +msgid "factorial of a negative number is undefined" +msgstr "факторіал від'ємного числа не визначено" + +#: utils/adt/numeric.c:3499 utils/adt/numeric.c:6921 utils/adt/numeric.c:7394 +#: utils/adt/numeric.c:9771 utils/adt/numeric.c:10246 utils/adt/numeric.c:10372 +#: utils/adt/numeric.c:10445 +#, c-format +msgid "value overflows numeric format" +msgstr "значення переповнюють формат numeric" -#: utils/adt/numeric.c:3500 +#: utils/adt/numeric.c:4181 utils/adt/numeric.c:4261 utils/adt/numeric.c:4302 +#: utils/adt/numeric.c:4496 #, c-format -msgid "cannot convert NaN to bigint" -msgstr "перетворити NaN в велике ціле не можна" +msgid "cannot convert NaN to %s" +msgstr "неможливо перетворити NaN на %s" -#: utils/adt/numeric.c:3545 +#: utils/adt/numeric.c:4185 utils/adt/numeric.c:4265 utils/adt/numeric.c:4306 +#: utils/adt/numeric.c:4500 #, c-format -msgid "cannot convert NaN to smallint" -msgstr "перетворити NaN в двобайтове ціле не можна" +msgid "cannot convert infinity to %s" +msgstr "неможливо перетворити нескінченність на %s" -#: utils/adt/numeric.c:3582 utils/adt/numeric.c:3653 +#: utils/adt/numeric.c:4509 #, c-format -msgid "cannot convert infinity to numeric" -msgstr "перетворити безкінченість в число не можна" +msgid "pg_lsn out of range" +msgstr "pg_lsn поза діапазоном" -#: utils/adt/numeric.c:6606 +#: utils/adt/numeric.c:7478 utils/adt/numeric.c:7525 #, c-format msgid "numeric field overflow" msgstr "надлишок поля numeric" -#: utils/adt/numeric.c:6607 +#: utils/adt/numeric.c:7479 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "Поле з точністю %d, масштабом %d повинне округлятись до абсолютного значення меньше, ніж %s%d." +#: utils/adt/numeric.c:7526 +#, c-format +msgid "A field with precision %d, scale %d cannot hold an infinite value." +msgstr "Поле з точністю %d, масштабом %d не може містити нескінченне значення." + #: utils/adt/numutils.c:154 #, c-format msgid "value \"%s\" is out of range for 8-bit integer" @@ -22644,22 +23541,22 @@ msgstr "значення \"%s\" поза діапазоном для 8-бітн msgid "invalid oidvector data" msgstr "неприпустимі дані oidvector" -#: utils/adt/oracle_compat.c:896 +#: utils/adt/oracle_compat.c:970 #, c-format msgid "requested character too large" msgstr "запитаний символ занадто великий" -#: utils/adt/oracle_compat.c:946 utils/adt/oracle_compat.c:1008 +#: utils/adt/oracle_compat.c:1020 utils/adt/oracle_compat.c:1082 #, c-format msgid "requested character too large for encoding: %d" msgstr "запитаний символ занадто великий для кодування: %d" -#: utils/adt/oracle_compat.c:987 +#: utils/adt/oracle_compat.c:1061 #, c-format msgid "requested character not valid for encoding: %d" msgstr "запитаний символ не припустимий для кодування: %d" -#: utils/adt/oracle_compat.c:1001 +#: utils/adt/oracle_compat.c:1075 #, c-format msgid "null character not permitted" msgstr "символ не може бути null" @@ -22670,202 +23567,217 @@ msgstr "символ не може бути null" msgid "percentile value %g is not between 0 and 1" msgstr "значення процентиля %g не є між 0 і 1" -#: utils/adt/pg_locale.c:1262 +#: utils/adt/pg_locale.c:1228 #, c-format msgid "Apply system library package updates." msgstr "Застосуйте оновлення для пакету з системною бібліотекою." -#: utils/adt/pg_locale.c:1477 +#: utils/adt/pg_locale.c:1442 #, c-format msgid "could not create locale \"%s\": %m" msgstr "не вдалося створити локалізацію \"%s\": %m" -#: utils/adt/pg_locale.c:1480 +#: utils/adt/pg_locale.c:1445 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "Операційній системі не вдалося знайти дані локалізації з іменем \"%s\"." -#: utils/adt/pg_locale.c:1582 +#: utils/adt/pg_locale.c:1547 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "параметри сортування з різними значеннями collate і ctype не підтримуються на цій платформі" -#: utils/adt/pg_locale.c:1591 +#: utils/adt/pg_locale.c:1556 #, c-format msgid "collation provider LIBC is not supported on this platform" msgstr "провайдер параметрів сортування LIBC не підтримується на цій платформі" -#: utils/adt/pg_locale.c:1603 +#: utils/adt/pg_locale.c:1568 #, c-format msgid "collations with different collate and ctype values are not supported by ICU" msgstr "ICU не підтримує параметри сортування з різними значеннями collate і ctype" -#: utils/adt/pg_locale.c:1609 utils/adt/pg_locale.c:1696 -#: utils/adt/pg_locale.c:1969 +#: utils/adt/pg_locale.c:1574 utils/adt/pg_locale.c:1661 +#: utils/adt/pg_locale.c:1940 #, c-format msgid "could not open collator for locale \"%s\": %s" msgstr "не вдалося відкрити сортувальник для локалізації \"%s\": %s" -#: utils/adt/pg_locale.c:1623 +#: utils/adt/pg_locale.c:1588 #, c-format msgid "ICU is not supported in this build" msgstr "ICU не підтримується в цій збірці" -#: utils/adt/pg_locale.c:1624 -#, c-format -msgid "You need to rebuild PostgreSQL using --with-icu." -msgstr "Необхідно перебудувати PostgreSQL з ключем --with-icu." - -#: utils/adt/pg_locale.c:1644 +#: utils/adt/pg_locale.c:1609 #, c-format msgid "collation \"%s\" has no actual version, but a version was specified" msgstr "для параметру сортування \"%s\" який не має фактичної версії, була вказана версія" -#: utils/adt/pg_locale.c:1651 +#: utils/adt/pg_locale.c:1616 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "невідповідність версій для параметру сортування \"%s\"" -#: utils/adt/pg_locale.c:1653 +#: utils/adt/pg_locale.c:1618 #, c-format msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgstr "Параметр сортування в базі даних був створений з версією %s, але операційна система надає версію %s." -#: utils/adt/pg_locale.c:1656 +#: utils/adt/pg_locale.c:1621 #, c-format msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." msgstr "Перебудуйте всі об'єкти, які стосуються цього параметру сортування і виконайте ALTER COLLATION %s REFRESH VERSION, або побудуйте PostgreSQL з правильною версією бібліотеки." -#: utils/adt/pg_locale.c:1747 +#: utils/adt/pg_locale.c:1692 +#, c-format +msgid "could not load locale \"%s\"" +msgstr "не вдалося завантажити локаль \"%s\"" + +#: utils/adt/pg_locale.c:1717 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "не вдалося отримати версію параметрів сортування для локалізації \"%s\": код помилки %lu" -#: utils/adt/pg_locale.c:1784 +#: utils/adt/pg_locale.c:1755 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "ICU не підтримує кодування \"%s\"" -#: utils/adt/pg_locale.c:1791 +#: utils/adt/pg_locale.c:1762 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "не вдалося відкрити перетворювач ICU для кодування \"%s\": %s" -#: utils/adt/pg_locale.c:1822 utils/adt/pg_locale.c:1831 -#: utils/adt/pg_locale.c:1860 utils/adt/pg_locale.c:1870 +#: utils/adt/pg_locale.c:1793 utils/adt/pg_locale.c:1802 +#: utils/adt/pg_locale.c:1831 utils/adt/pg_locale.c:1841 #, c-format msgid "%s failed: %s" msgstr "%s помилка: %s" -#: utils/adt/pg_locale.c:2142 +#: utils/adt/pg_locale.c:2113 #, c-format msgid "invalid multibyte character for locale" msgstr "неприпустимий мультибайтний символ для локалізації" -#: utils/adt/pg_locale.c:2143 +#: utils/adt/pg_locale.c:2114 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "Параметр локалізації серверу LC_CTYPE, можливо, несумісний з кодуванням бази даних." +#: utils/adt/pg_lsn.c:263 +#, c-format +msgid "cannot add NaN to pg_lsn" +msgstr "не можна додати NaN в pg_lsn" + +#: utils/adt/pg_lsn.c:297 +#, c-format +msgid "cannot subtract NaN from pg_lsn" +msgstr "віднімати NaN з pg_lsn не можна" + #: utils/adt/pg_upgrade_support.c:29 #, c-format msgid "function can only be called when server is in binary upgrade mode" msgstr "функцію можна викликати тільки коли сервер знаходиться в режимі двійкового оновлення" -#: utils/adt/pgstatfuncs.c:500 +#: utils/adt/pgstatfuncs.c:503 #, c-format msgid "invalid command name: \"%s\"" msgstr "неприпустиме ім’я команди: \"%s\"" -#: utils/adt/pseudotypes.c:57 utils/adt/pseudotypes.c:91 +#: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 #, c-format msgid "cannot display a value of type %s" msgstr "значення типу %s не можна відобразити" -#: utils/adt/pseudotypes.c:283 +#: utils/adt/pseudotypes.c:321 #, c-format msgid "cannot accept a value of a shell type" msgstr "не можна прийняти значення типу shell" -#: utils/adt/pseudotypes.c:293 +#: utils/adt/pseudotypes.c:331 #, c-format msgid "cannot display a value of a shell type" msgstr "не можна відобразити значення типу shell" -#: utils/adt/rangetypes.c:406 +#: utils/adt/rangetypes.c:404 #, c-format msgid "range constructor flags argument must not be null" msgstr "аргумент позначок конструктору діапазону не може бути null" -#: utils/adt/rangetypes.c:993 +#: utils/adt/rangetypes.c:1003 #, c-format msgid "result of range difference would not be contiguous" msgstr "результат різниці діапазонів не буде безперервним" -#: utils/adt/rangetypes.c:1054 +#: utils/adt/rangetypes.c:1064 #, c-format msgid "result of range union would not be contiguous" msgstr "результат об'єднання діапазонів не буде безперервним" -#: utils/adt/rangetypes.c:1600 +#: utils/adt/rangetypes.c:1214 +#, c-format +msgid "range_intersect_agg must be called with a range" +msgstr "range_intersect_agg потрібно викликати з діапазоном" + +#: utils/adt/rangetypes.c:1689 #, c-format msgid "range lower bound must be less than or equal to range upper bound" msgstr "нижня границя діапазону повинна бути менше або дорівнювати верхній границі діапазону" -#: utils/adt/rangetypes.c:1983 utils/adt/rangetypes.c:1996 -#: utils/adt/rangetypes.c:2010 +#: utils/adt/rangetypes.c:2112 utils/adt/rangetypes.c:2125 +#: utils/adt/rangetypes.c:2139 #, c-format msgid "invalid range bound flags" msgstr "неприпустимі позначки границь діапазону" -#: utils/adt/rangetypes.c:1984 utils/adt/rangetypes.c:1997 -#: utils/adt/rangetypes.c:2011 +#: utils/adt/rangetypes.c:2113 utils/adt/rangetypes.c:2126 +#: utils/adt/rangetypes.c:2140 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "Припустимі значення \"[]\", \"[)\", \"(]\", і \"()\"." -#: utils/adt/rangetypes.c:2076 utils/adt/rangetypes.c:2093 -#: utils/adt/rangetypes.c:2106 utils/adt/rangetypes.c:2124 -#: utils/adt/rangetypes.c:2135 utils/adt/rangetypes.c:2179 -#: utils/adt/rangetypes.c:2187 +#: utils/adt/rangetypes.c:2205 utils/adt/rangetypes.c:2222 +#: utils/adt/rangetypes.c:2235 utils/adt/rangetypes.c:2253 +#: utils/adt/rangetypes.c:2264 utils/adt/rangetypes.c:2308 +#: utils/adt/rangetypes.c:2316 #, c-format msgid "malformed range literal: \"%s\"" msgstr "неправильний літерал діапазону: \"%s\"" -#: utils/adt/rangetypes.c:2078 +#: utils/adt/rangetypes.c:2207 #, c-format msgid "Junk after \"empty\" key word." msgstr "Сміття після ключового слова \"empty\"." -#: utils/adt/rangetypes.c:2095 +#: utils/adt/rangetypes.c:2224 #, c-format msgid "Missing left parenthesis or bracket." msgstr "Пропущено ліву дужку (круглу або квадратну)." -#: utils/adt/rangetypes.c:2108 +#: utils/adt/rangetypes.c:2237 #, c-format msgid "Missing comma after lower bound." msgstr "Пропущено кому після нижньої границі." -#: utils/adt/rangetypes.c:2126 +#: utils/adt/rangetypes.c:2255 #, c-format msgid "Too many commas." msgstr "Занадто багато ком." -#: utils/adt/rangetypes.c:2137 +#: utils/adt/rangetypes.c:2266 #, c-format msgid "Junk after right parenthesis or bracket." msgstr "Сміття після правої дужки." -#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4493 +#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4560 #, c-format msgid "regular expression failed: %s" msgstr "помилка в регулярному виразі: %s" #: utils/adt/regexp.c:426 #, c-format -msgid "invalid regular expression option: \"%c\"" -msgstr "неприпустимий параметр регулярного виразу: \"%c\"" +msgid "invalid regular expression option: \"%.*s\"" +msgstr "неприпустимий параметр регулярного виразу: \"%.*s\"" #: utils/adt/regexp.c:836 #, c-format @@ -22888,327 +23800,329 @@ msgstr "Використайте функцію regexp_matches замість." msgid "too many regular expression matches" msgstr "занадто багато відповідностей для регулярного виразу" -#: utils/adt/regproc.c:107 +#: utils/adt/regproc.c:105 #, c-format msgid "more than one function named \"%s\"" msgstr "ім'я \"%s\" мають декілька функцій" -#: utils/adt/regproc.c:525 +#: utils/adt/regproc.c:543 #, c-format msgid "more than one operator named %s" msgstr "ім'я %s мають декілька операторів" -#: utils/adt/regproc.c:692 utils/adt/regproc.c:733 gram.y:8223 +#: utils/adt/regproc.c:710 utils/adt/regproc.c:751 gram.y:8188 #, c-format msgid "missing argument" msgstr "пропущено аргумент" -#: utils/adt/regproc.c:693 utils/adt/regproc.c:734 gram.y:8224 +#: utils/adt/regproc.c:711 utils/adt/regproc.c:752 gram.y:8189 #, c-format msgid "Use NONE to denote the missing argument of a unary operator." msgstr "Щоб позначити пропущений аргумент унарного оператору, використайте NONE." -#: utils/adt/regproc.c:697 utils/adt/regproc.c:738 utils/adt/regproc.c:2018 -#: utils/adt/ruleutils.c:9299 utils/adt/ruleutils.c:9468 +#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 +#: utils/adt/ruleutils.c:9650 utils/adt/ruleutils.c:9819 #, c-format msgid "too many arguments" msgstr "занадто багато аргументів" -#: utils/adt/regproc.c:698 utils/adt/regproc.c:739 +#: utils/adt/regproc.c:716 utils/adt/regproc.c:757 #, c-format msgid "Provide two argument types for operator." msgstr "Надайте для оператора два типи аргументів." -#: utils/adt/regproc.c:1602 utils/adt/regproc.c:1626 utils/adt/regproc.c:1727 -#: utils/adt/regproc.c:1751 utils/adt/regproc.c:1853 utils/adt/regproc.c:1858 -#: utils/adt/varlena.c:3642 utils/adt/varlena.c:3647 +#: utils/adt/regproc.c:1639 utils/adt/regproc.c:1663 utils/adt/regproc.c:1764 +#: utils/adt/regproc.c:1788 utils/adt/regproc.c:1890 utils/adt/regproc.c:1895 +#: utils/adt/varlena.c:3709 utils/adt/varlena.c:3714 #, c-format msgid "invalid name syntax" msgstr "неприпустимий синтаксис в імені" -#: utils/adt/regproc.c:1916 +#: utils/adt/regproc.c:1953 #, c-format msgid "expected a left parenthesis" msgstr "очікувалась ліва дужка" -#: utils/adt/regproc.c:1932 +#: utils/adt/regproc.c:1969 #, c-format msgid "expected a right parenthesis" msgstr "очікувалась права дужка" -#: utils/adt/regproc.c:1951 +#: utils/adt/regproc.c:1988 #, c-format msgid "expected a type name" msgstr "очікувалось ім'я типу" -#: utils/adt/regproc.c:1983 +#: utils/adt/regproc.c:2020 #, c-format msgid "improper type name" msgstr "неправильне ім'я типу" -#: utils/adt/ri_triggers.c:296 utils/adt/ri_triggers.c:1537 -#: utils/adt/ri_triggers.c:2470 +#: utils/adt/ri_triggers.c:300 utils/adt/ri_triggers.c:1545 +#: utils/adt/ri_triggers.c:2530 #, c-format msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" msgstr "insert або update в таблиці \"%s\" порушує обмеження зовнішнього ключа \"%s\"" -#: utils/adt/ri_triggers.c:299 utils/adt/ri_triggers.c:1540 +#: utils/adt/ri_triggers.c:303 utils/adt/ri_triggers.c:1548 #, c-format msgid "MATCH FULL does not allow mixing of null and nonnull key values." msgstr "MATCH FULL не дозволяє змішувати в значенні ключа null і nonnull." -#: utils/adt/ri_triggers.c:1940 +#: utils/adt/ri_triggers.c:1965 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "функція \"%s\" повинна запускатись для INSERT" -#: utils/adt/ri_triggers.c:1946 +#: utils/adt/ri_triggers.c:1971 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "функція \"%s\" повинна запускатись для UPDATE" -#: utils/adt/ri_triggers.c:1952 +#: utils/adt/ri_triggers.c:1977 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "функція \"%s\" повинна запускатись для DELETE" -#: utils/adt/ri_triggers.c:1975 +#: utils/adt/ri_triggers.c:2000 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "для тригеру \"%s\" таблиці \"%s\" немає введення pg_constraint" -#: utils/adt/ri_triggers.c:1977 +#: utils/adt/ri_triggers.c:2002 #, c-format msgid "Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT." msgstr "Видаліть цей тригер цілісності зв’язків і пов'язані об'єкти, а потім виконайте ALTER TABLE ADD CONSTRAINT." -#: utils/adt/ri_triggers.c:2007 gram.y:3818 +#: utils/adt/ri_triggers.c:2032 gram.y:3933 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "Вираз MATCH PARTIAL все ще не реалізований" -#: utils/adt/ri_triggers.c:2295 +#: utils/adt/ri_triggers.c:2355 #, c-format msgid "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result" msgstr "неочікуваний результат запиту цілісності зв’язків до \"%s\" з обмеження \"%s\" таблиці \"%s\"" -#: utils/adt/ri_triggers.c:2299 +#: utils/adt/ri_triggers.c:2359 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "Скоріше за все, це викликано правилом, яке переписало запит." -#: utils/adt/ri_triggers.c:2460 +#: utils/adt/ri_triggers.c:2520 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "видалення секції \"%s\" порушує обмеження зовнішнього ключа \"%s" -#: utils/adt/ri_triggers.c:2463 utils/adt/ri_triggers.c:2488 +#: utils/adt/ri_triggers.c:2523 utils/adt/ri_triggers.c:2548 #, c-format msgid "Key (%s)=(%s) is still referenced from table \"%s\"." msgstr "На ключ (%s)=(%s) все ще є посилання в таблиці \"%s\"." -#: utils/adt/ri_triggers.c:2474 +#: utils/adt/ri_triggers.c:2534 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "Ключ (%s)=(%s) не присутній в таблиці \"%s\"." -#: utils/adt/ri_triggers.c:2477 +#: utils/adt/ri_triggers.c:2537 #, c-format msgid "Key is not present in table \"%s\"." msgstr "Ключ не присутній в таблиці \"%s\"." -#: utils/adt/ri_triggers.c:2483 +#: utils/adt/ri_triggers.c:2543 #, c-format msgid "update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"" msgstr "update або delete в таблиці \"%s\" порушує обмеження зовнішнього ключа \"%s\" таблиці \"%s\"" -#: utils/adt/ri_triggers.c:2491 +#: utils/adt/ri_triggers.c:2551 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "На ключ все ще є посилання в таблиці \"%s\"." -#: utils/adt/rowtypes.c:104 utils/adt/rowtypes.c:482 +#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:483 #, c-format msgid "input of anonymous composite types is not implemented" msgstr "введення анонімних складених типів не реалізовано" -#: utils/adt/rowtypes.c:156 utils/adt/rowtypes.c:185 utils/adt/rowtypes.c:208 -#: utils/adt/rowtypes.c:216 utils/adt/rowtypes.c:268 utils/adt/rowtypes.c:276 +#: utils/adt/rowtypes.c:157 utils/adt/rowtypes.c:186 utils/adt/rowtypes.c:209 +#: utils/adt/rowtypes.c:217 utils/adt/rowtypes.c:269 utils/adt/rowtypes.c:277 #, c-format msgid "malformed record literal: \"%s\"" msgstr "невірно сформований літерал запису: \"%s\"" -#: utils/adt/rowtypes.c:157 +#: utils/adt/rowtypes.c:158 #, c-format msgid "Missing left parenthesis." msgstr "Відсутня ліва дужка." -#: utils/adt/rowtypes.c:186 +#: utils/adt/rowtypes.c:187 #, c-format msgid "Too few columns." msgstr "Занадто мало стовпців." -#: utils/adt/rowtypes.c:269 +#: utils/adt/rowtypes.c:270 #, c-format msgid "Too many columns." msgstr "Занадто багато стовпців." -#: utils/adt/rowtypes.c:277 +#: utils/adt/rowtypes.c:278 #, c-format msgid "Junk after right parenthesis." msgstr "Сміття післа правої дужки." -#: utils/adt/rowtypes.c:531 +#: utils/adt/rowtypes.c:532 #, c-format msgid "wrong number of columns: %d, expected %d" msgstr "неправильна кількість стовпців: %d, очікувалось %d" -#: utils/adt/rowtypes.c:559 +#: utils/adt/rowtypes.c:574 #, c-format -msgid "wrong data type: %u, expected %u" -msgstr "неправильний тип даних: %u, очікувався %u" +msgid "binary data has type %u (%s) instead of expected %u (%s) in record column %d" +msgstr "двійкові дані мають тип %u (%s) замість очікуваного %u (%s) в стовпці запису %d" -#: utils/adt/rowtypes.c:620 +#: utils/adt/rowtypes.c:641 #, c-format msgid "improper binary format in record column %d" msgstr "неправильний двійковий формат у стовпці запису %d" -#: utils/adt/rowtypes.c:911 utils/adt/rowtypes.c:1157 utils/adt/rowtypes.c:1415 -#: utils/adt/rowtypes.c:1661 +#: utils/adt/rowtypes.c:932 utils/adt/rowtypes.c:1178 utils/adt/rowtypes.c:1436 +#: utils/adt/rowtypes.c:1682 #, c-format msgid "cannot compare dissimilar column types %s and %s at record column %d" msgstr "не можна порівнювати неподібні типи стовпців %s і %s, стовпець запису %d" -#: utils/adt/rowtypes.c:1002 utils/adt/rowtypes.c:1227 -#: utils/adt/rowtypes.c:1512 utils/adt/rowtypes.c:1697 +#: utils/adt/rowtypes.c:1023 utils/adt/rowtypes.c:1248 +#: utils/adt/rowtypes.c:1533 utils/adt/rowtypes.c:1718 #, c-format msgid "cannot compare record types with different numbers of columns" msgstr "не можна порівнювати типи записів з різної кількістю стовпців" -#: utils/adt/ruleutils.c:4821 +#: utils/adt/ruleutils.c:5077 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "правило \"%s\" має непідтримуваний тип подій %d" -#: utils/adt/timestamp.c:107 +#: utils/adt/timestamp.c:109 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "TIMESTAMP(%d)%s точність не повинна бути від'ємною" -#: utils/adt/timestamp.c:113 +#: utils/adt/timestamp.c:115 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "TIMESTAMP(%d)%s точність зменшена до дозволеного максимуму, %d" -#: utils/adt/timestamp.c:176 utils/adt/timestamp.c:434 utils/misc/guc.c:11901 +#: utils/adt/timestamp.c:178 utils/adt/timestamp.c:436 utils/misc/guc.c:12412 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "позначка часу поза діапазоном: \"%s\"" -#: utils/adt/timestamp.c:372 +#: utils/adt/timestamp.c:374 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "точність позначки часу (%d) повинна бути між %d і %d" -#: utils/adt/timestamp.c:496 +#: utils/adt/timestamp.c:498 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "Числові часові пояси повинні мати \"-\" або \"+\" в якості першого символу." -#: utils/adt/timestamp.c:509 +#: utils/adt/timestamp.c:511 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "числовий часовий пояс \"%s\" поза діапазоном" -#: utils/adt/timestamp.c:601 utils/adt/timestamp.c:611 -#: utils/adt/timestamp.c:619 +#: utils/adt/timestamp.c:607 utils/adt/timestamp.c:617 +#: utils/adt/timestamp.c:625 #, c-format msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" msgstr "позначка часу поза діапазоном: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:720 +#: utils/adt/timestamp.c:726 #, c-format msgid "timestamp cannot be NaN" msgstr "позначка часу не може бути NaN" -#: utils/adt/timestamp.c:738 utils/adt/timestamp.c:750 +#: utils/adt/timestamp.c:744 utils/adt/timestamp.c:756 #, c-format msgid "timestamp out of range: \"%g\"" msgstr "позначка часу поза діапазоном: \"%g\"" -#: utils/adt/timestamp.c:935 utils/adt/timestamp.c:1509 -#: utils/adt/timestamp.c:1944 utils/adt/timestamp.c:3042 -#: utils/adt/timestamp.c:3047 utils/adt/timestamp.c:3052 -#: utils/adt/timestamp.c:3102 utils/adt/timestamp.c:3109 -#: utils/adt/timestamp.c:3116 utils/adt/timestamp.c:3136 -#: utils/adt/timestamp.c:3143 utils/adt/timestamp.c:3150 -#: utils/adt/timestamp.c:3180 utils/adt/timestamp.c:3188 -#: utils/adt/timestamp.c:3232 utils/adt/timestamp.c:3659 -#: utils/adt/timestamp.c:3784 utils/adt/timestamp.c:4244 -#, c-format -msgid "interval out of range" -msgstr "інтервал поза діапазоном" - -#: utils/adt/timestamp.c:1062 utils/adt/timestamp.c:1095 +#: utils/adt/timestamp.c:1068 utils/adt/timestamp.c:1101 #, c-format msgid "invalid INTERVAL type modifier" msgstr "неприпустимий модифікатор типу INTERVAL" -#: utils/adt/timestamp.c:1078 +#: utils/adt/timestamp.c:1084 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "INTERVAL(%d) точність не повинна бути від'ємною" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1090 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "INTERVAL(%d) точність зменшена до максимально можливої, %d" -#: utils/adt/timestamp.c:1466 +#: utils/adt/timestamp.c:1472 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "interval(%d) точність повинна бути між %d і %d" -#: utils/adt/timestamp.c:2643 +#: utils/adt/timestamp.c:2660 #, c-format msgid "cannot subtract infinite timestamps" msgstr "віднімати безкінечні позначки часу не можна" -#: utils/adt/timestamp.c:3912 utils/adt/timestamp.c:4505 -#: utils/adt/timestamp.c:4667 utils/adt/timestamp.c:4688 +#: utils/adt/timestamp.c:3837 utils/adt/timestamp.c:4020 +#, c-format +msgid "origin out of range" +msgstr "джерело поза діапазоном" + +#: utils/adt/timestamp.c:3842 utils/adt/timestamp.c:4025 +#, c-format +msgid "timestamps cannot be binned into intervals containing months or years" +msgstr "позначки часу не можна розділяти на інтервали, що містять місяці або роки" + +#: utils/adt/timestamp.c:3849 utils/adt/timestamp.c:4032 +#, c-format +msgid "stride must be greater than zero" +msgstr "крок повинен бути більше нуля" + +#: utils/adt/timestamp.c:3978 utils/adt/timestamp.c:4620 +#: utils/adt/timestamp.c:4820 utils/adt/timestamp.c:4867 #, c-format msgid "timestamp units \"%s\" not supported" msgstr "одиниці позначки часу \"%s\" не підтримуються" -#: utils/adt/timestamp.c:3926 utils/adt/timestamp.c:4459 -#: utils/adt/timestamp.c:4698 +#: utils/adt/timestamp.c:3992 utils/adt/timestamp.c:4574 +#: utils/adt/timestamp.c:4877 #, c-format msgid "timestamp units \"%s\" not recognized" msgstr "одиниці позначки часу \"%s\" не розпізнані" -#: utils/adt/timestamp.c:4056 utils/adt/timestamp.c:4500 -#: utils/adt/timestamp.c:4863 utils/adt/timestamp.c:4885 +#: utils/adt/timestamp.c:4171 utils/adt/timestamp.c:4615 +#: utils/adt/timestamp.c:5091 utils/adt/timestamp.c:5139 #, c-format msgid "timestamp with time zone units \"%s\" not supported" msgstr "одиниці позначки часу з часовим поясом \"%s\" не підтримуються" -#: utils/adt/timestamp.c:4073 utils/adt/timestamp.c:4454 -#: utils/adt/timestamp.c:4894 +#: utils/adt/timestamp.c:4188 utils/adt/timestamp.c:4569 +#: utils/adt/timestamp.c:5148 #, c-format msgid "timestamp with time zone units \"%s\" not recognized" msgstr "одиниці позначки часу з часовим поясом \"%s\" не розпізнані" -#: utils/adt/timestamp.c:4231 +#: utils/adt/timestamp.c:4346 #, c-format msgid "interval units \"%s\" not supported because months usually have fractional weeks" msgstr "одиниці інтервалу \"%s\" не підтримуються, тому, що місяці зазвичай мають дробове число тижнів" -#: utils/adt/timestamp.c:4237 utils/adt/timestamp.c:4988 +#: utils/adt/timestamp.c:4352 utils/adt/timestamp.c:5271 #, c-format msgid "interval units \"%s\" not supported" msgstr "одиниці інтервалу \"%s\" не підтримуються" -#: utils/adt/timestamp.c:4253 utils/adt/timestamp.c:5011 +#: utils/adt/timestamp.c:4368 utils/adt/timestamp.c:5332 #, c-format msgid "interval units \"%s\" not recognized" msgstr "одиниці інтервалу \"%s\" не розпізнані" @@ -23238,43 +24152,43 @@ msgstr "suppress_redundant_updates_trigger: повинна викликатис msgid "gtsvector_in not implemented" msgstr "функція gtsvector_in не реалізована" -#: utils/adt/tsquery.c:200 +#: utils/adt/tsquery.c:199 #, c-format msgid "distance in phrase operator should not be greater than %d" msgstr "дистанція у фразовому операторі повинна бути не більше %d" -#: utils/adt/tsquery.c:310 utils/adt/tsquery.c:725 +#: utils/adt/tsquery.c:306 utils/adt/tsquery.c:691 #: utils/adt/tsvector_parser.c:133 #, c-format msgid "syntax error in tsquery: \"%s\"" msgstr "синтаксична помилка в tsquery: \"%s\"" -#: utils/adt/tsquery.c:334 +#: utils/adt/tsquery.c:330 #, c-format msgid "no operand in tsquery: \"%s\"" msgstr "немає оператора в tsquery: \"%s\"" -#: utils/adt/tsquery.c:568 +#: utils/adt/tsquery.c:534 #, c-format msgid "value is too big in tsquery: \"%s\"" msgstr "занадто велике значення в tsquery: \"%s\"" -#: utils/adt/tsquery.c:573 +#: utils/adt/tsquery.c:539 #, c-format msgid "operand is too long in tsquery: \"%s\"" msgstr "занадто довгий операнд в tsquery: \"%s\"" -#: utils/adt/tsquery.c:601 +#: utils/adt/tsquery.c:567 #, c-format msgid "word is too long in tsquery: \"%s\"" msgstr "занадто довге слово в tsquery: \"%s\"" -#: utils/adt/tsquery.c:870 +#: utils/adt/tsquery.c:835 #, c-format msgid "text-search query doesn't contain lexemes: \"%s\"" msgstr "запит пошуку тексту не містить лексем: \"%s\"" -#: utils/adt/tsquery.c:881 utils/adt/tsquery_util.c:375 +#: utils/adt/tsquery.c:846 utils/adt/tsquery_util.c:375 #, c-format msgid "tsquery is too large" msgstr "tsquery занадто великий" @@ -23286,8 +24200,8 @@ msgstr "запит пошуку тексту ігнорується, тому, #: utils/adt/tsquery_op.c:124 #, c-format -msgid "distance in phrase operator should be non-negative and less than %d" -msgstr "дистанція у фразовому операторі повинна бути невід'ємною і менше %d" +msgid "distance in phrase operator must be an integer value between zero and %d inclusive" +msgstr "відстань у фразовому операторі повинна бути цілим числом від нуля до %d включно" #: utils/adt/tsquery_rewrite.c:321 #, c-format @@ -23309,7 +24223,7 @@ msgstr "масив значимості занадто малий" msgid "array of weight must not contain nulls" msgstr "масив значимості не повинен містити null" -#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:872 +#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:871 #, c-format msgid "weight out of range" msgstr "значимість поза діапазоном" @@ -23340,42 +24254,42 @@ msgstr "масив значимості не може містити null" msgid "unrecognized weight: \"%c\"" msgstr "нерозпізнана значимість: \"%c\"" -#: utils/adt/tsvector_op.c:2414 +#: utils/adt/tsvector_op.c:2426 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "запит ts_stat повинен повернути один стовпець tsvector" -#: utils/adt/tsvector_op.c:2603 +#: utils/adt/tsvector_op.c:2615 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "стовпець типу tsvector \"%s\" не існує" -#: utils/adt/tsvector_op.c:2610 +#: utils/adt/tsvector_op.c:2622 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "стовпець \"%s\" повинен мати тип tsvector" -#: utils/adt/tsvector_op.c:2622 +#: utils/adt/tsvector_op.c:2634 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "стовпець конфігурації \"%s\" не існує" -#: utils/adt/tsvector_op.c:2628 +#: utils/adt/tsvector_op.c:2640 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "стовпець \"%s\" повинен мати тип regconfig" -#: utils/adt/tsvector_op.c:2635 +#: utils/adt/tsvector_op.c:2647 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "значення стовпця конфігурації \"%s\" не повинне бути null" -#: utils/adt/tsvector_op.c:2648 +#: utils/adt/tsvector_op.c:2660 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "ім'я конфігурації текстового пошуку \"%s\" повинно вказуватися зі схемою" -#: utils/adt/tsvector_op.c:2673 +#: utils/adt/tsvector_op.c:2685 #, c-format msgid "column \"%s\" is not of a character type" msgstr "стовпець \"%s\" має не символьний тип" @@ -23400,74 +24314,74 @@ msgstr "неправильна інформація про позицію в tsv msgid "could not generate random values" msgstr "не вдалося згенерувати випадкові значення" -#: utils/adt/varbit.c:109 utils/adt/varchar.c:53 +#: utils/adt/varbit.c:110 utils/adt/varchar.c:53 #, c-format msgid "length for type %s must be at least 1" msgstr "довжина для типу %s повинна бути мінімум 1" -#: utils/adt/varbit.c:114 utils/adt/varchar.c:57 +#: utils/adt/varbit.c:115 utils/adt/varchar.c:57 #, c-format msgid "length for type %s cannot exceed %d" msgstr "довжина для типу %s не може перевищувати %d" -#: utils/adt/varbit.c:197 utils/adt/varbit.c:498 utils/adt/varbit.c:993 +#: utils/adt/varbit.c:198 utils/adt/varbit.c:499 utils/adt/varbit.c:994 #, c-format msgid "bit string length exceeds the maximum allowed (%d)" msgstr "довжина бітового рядка перевищує максимально допустиму (%d)" -#: utils/adt/varbit.c:211 utils/adt/varbit.c:355 utils/adt/varbit.c:405 +#: utils/adt/varbit.c:212 utils/adt/varbit.c:356 utils/adt/varbit.c:406 #, c-format msgid "bit string length %d does not match type bit(%d)" msgstr "довжина бітового рядка %d не відповідає типу bit(%d)" -#: utils/adt/varbit.c:233 utils/adt/varbit.c:534 +#: utils/adt/varbit.c:234 utils/adt/varbit.c:535 #, c-format -msgid "\"%c\" is not a valid binary digit" -msgstr "\"%c\" не є припустимою двійковою цифрою" +msgid "\"%.*s\" is not a valid binary digit" +msgstr "\"%.*s\" не є припустимим двійковим числом" -#: utils/adt/varbit.c:258 utils/adt/varbit.c:559 +#: utils/adt/varbit.c:259 utils/adt/varbit.c:560 #, c-format -msgid "\"%c\" is not a valid hexadecimal digit" -msgstr "\"%c\" не є припустимою шістнадцятковою цифрою" +msgid "\"%.*s\" is not a valid hexadecimal digit" +msgstr "\"%.*s\" не є припустимим шістнадцятковим числом" -#: utils/adt/varbit.c:346 utils/adt/varbit.c:651 +#: utils/adt/varbit.c:347 utils/adt/varbit.c:652 #, c-format msgid "invalid length in external bit string" msgstr "неприпустима довжина у зовнішньому рядку бітів" -#: utils/adt/varbit.c:512 utils/adt/varbit.c:660 utils/adt/varbit.c:756 +#: utils/adt/varbit.c:513 utils/adt/varbit.c:661 utils/adt/varbit.c:757 #, c-format msgid "bit string too long for type bit varying(%d)" msgstr "рядок бітів занадто довгий для типу bit varying(%d)" -#: utils/adt/varbit.c:1086 utils/adt/varbit.c:1184 utils/adt/varlena.c:875 -#: utils/adt/varlena.c:939 utils/adt/varlena.c:1083 utils/adt/varlena.c:3306 -#: utils/adt/varlena.c:3373 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:897 +#: utils/adt/varlena.c:960 utils/adt/varlena.c:1117 utils/adt/varlena.c:3351 +#: utils/adt/varlena.c:3429 #, c-format msgid "negative substring length not allowed" msgstr "від'ємна довжина підрядка не дозволена" -#: utils/adt/varbit.c:1241 +#: utils/adt/varbit.c:1261 #, c-format msgid "cannot AND bit strings of different sizes" msgstr "не можна використовувати \"І\" (AND) для бітових рядків різного розміру" -#: utils/adt/varbit.c:1282 +#: utils/adt/varbit.c:1302 #, c-format msgid "cannot OR bit strings of different sizes" msgstr "не можна використовувати \"АБО\" (OR) для бітових рядків різного розміру" -#: utils/adt/varbit.c:1322 +#: utils/adt/varbit.c:1342 #, c-format msgid "cannot XOR bit strings of different sizes" msgstr "не можна використовувати (XOR) для бітових рядків різного розміру" -#: utils/adt/varbit.c:1804 utils/adt/varbit.c:1862 +#: utils/adt/varbit.c:1824 utils/adt/varbit.c:1882 #, c-format msgid "bit index %d out of valid range (0..%d)" msgstr "індекс біту %d поза припустимим діапазоном (0..%d)" -#: utils/adt/varbit.c:1813 utils/adt/varlena.c:3566 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3633 #, c-format msgid "new bit must be 0 or 1" msgstr "новий біт повинен бути 0 або 1" @@ -23482,101 +24396,111 @@ msgstr "значення занадто довге для типу character(%d) msgid "value too long for type character varying(%d)" msgstr "значення занадто довге для типу character varying(%d)" -#: utils/adt/varchar.c:732 utils/adt/varlena.c:1475 +#: utils/adt/varchar.c:732 utils/adt/varlena.c:1523 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "не вдалося визначити, який параметр сортування використати для порівняння рядків" -#: utils/adt/varlena.c:1182 utils/adt/varlena.c:1915 +#: utils/adt/varlena.c:1216 utils/adt/varlena.c:1963 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "недетерміновані параметри сортування не підтримуються для пошуку підрядків" -#: utils/adt/varlena.c:1574 utils/adt/varlena.c:1587 +#: utils/adt/varlena.c:1622 utils/adt/varlena.c:1635 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "не вдалося перетворити рядок в UTF-16: код помилки %lu" -#: utils/adt/varlena.c:1602 +#: utils/adt/varlena.c:1650 #, c-format msgid "could not compare Unicode strings: %m" msgstr "не вдалося порівняти рядки в Unicode: %m" -#: utils/adt/varlena.c:1653 utils/adt/varlena.c:2367 +#: utils/adt/varlena.c:1701 utils/adt/varlena.c:2415 #, c-format msgid "collation failed: %s" msgstr "помилка в бібліотеці сортування: %s" -#: utils/adt/varlena.c:2575 +#: utils/adt/varlena.c:2623 #, c-format msgid "sort key generation failed: %s" msgstr "не вдалося згенерувати ключ сортування: %s" -#: utils/adt/varlena.c:3450 utils/adt/varlena.c:3517 +#: utils/adt/varlena.c:3517 utils/adt/varlena.c:3584 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "індекс %d поза припустимим діапазоном, 0..%d" -#: utils/adt/varlena.c:3481 utils/adt/varlena.c:3553 +#: utils/adt/varlena.c:3548 utils/adt/varlena.c:3620 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "індекс %lld поза допустимим діапазоном, 0..%lld" -#: utils/adt/varlena.c:4590 +#: utils/adt/varlena.c:4656 #, c-format -msgid "field position must be greater than zero" -msgstr "позиція поля повинна бути більше нуля" +msgid "field position must not be zero" +msgstr "позиція поля не повинна бути нульовою" -#: utils/adt/varlena.c:5456 +#: utils/adt/varlena.c:5697 #, c-format msgid "unterminated format() type specifier" msgstr "незавершений специфікатор типу format()" -#: utils/adt/varlena.c:5457 utils/adt/varlena.c:5591 utils/adt/varlena.c:5712 +#: utils/adt/varlena.c:5698 utils/adt/varlena.c:5832 utils/adt/varlena.c:5953 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Для представлення одного знаку \"%%\", використайте \"%%%%\"." -#: utils/adt/varlena.c:5589 utils/adt/varlena.c:5710 +#: utils/adt/varlena.c:5830 utils/adt/varlena.c:5951 #, c-format -msgid "unrecognized format() type specifier \"%c\"" -msgstr "нерозпізнаний специфікатор типу format() \"%c\"" +msgid "unrecognized format() type specifier \"%.*s\"" +msgstr "нерозпізнаний специфікатор типу format() \"%.*s\"" -#: utils/adt/varlena.c:5602 utils/adt/varlena.c:5659 +#: utils/adt/varlena.c:5843 utils/adt/varlena.c:5900 #, c-format msgid "too few arguments for format()" msgstr "занадто мало аргументів для format()" -#: utils/adt/varlena.c:5755 utils/adt/varlena.c:5937 +#: utils/adt/varlena.c:5996 utils/adt/varlena.c:6178 #, c-format msgid "number is out of range" msgstr "число поза діапазоном" -#: utils/adt/varlena.c:5818 utils/adt/varlena.c:5846 +#: utils/adt/varlena.c:6059 utils/adt/varlena.c:6087 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "формат посилається на аргумент 0, але аргументи нумеруются з 1" -#: utils/adt/varlena.c:5839 +#: utils/adt/varlena.c:6080 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "вказівка аргументу ширини повинно закінчуватися \"$\"" -#: utils/adt/varlena.c:5884 +#: utils/adt/varlena.c:6125 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "значення null не можна форматувати у вигляді SQL-ідентифікатору" -#: utils/adt/varlena.c:6010 +#: utils/adt/varlena.c:6251 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "Нормалізація Unicode може виконуватись лише тоді, коли кодування серверу - UTF8" -#: utils/adt/varlena.c:6023 +#: utils/adt/varlena.c:6264 #, c-format msgid "invalid normalization form: %s" msgstr "неприпустима форма нормалізації: %s" +#: utils/adt/varlena.c:6467 utils/adt/varlena.c:6502 utils/adt/varlena.c:6537 +#, c-format +msgid "invalid Unicode code point: %04X" +msgstr "неприпустима точка коду Unicode: %04X" + +#: utils/adt/varlena.c:6567 +#, c-format +msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." +msgstr "Спеціальні коди Unicode повинні бути \\XXXX, \\+XXXXXX, \\uXXXXXX, або \\UXXXXXX." + #: utils/adt/windowfuncs.c:243 #, c-format msgid "argument of ntile must be greater than zero" @@ -23607,12 +24531,7 @@ msgstr "XML-функції не підтримуються" msgid "This functionality requires the server to be built with libxml support." msgstr "Ця функціональність потребує, щоб сервер був побудований з підтримкою libxml." -#: utils/adt/xml.c:224 -#, c-format -msgid "You need to rebuild PostgreSQL using --with-libxml." -msgstr "Необхідно перебудувати PostgreSQL з ключем --with-libxml." - -#: utils/adt/xml.c:243 utils/mb/mbutils.c:570 +#: utils/adt/xml.c:243 utils/mb/mbutils.c:627 #, c-format msgid "invalid encoding name \"%s\"" msgstr "неприпустиме ім’я кодування \"%s\"" @@ -23751,28 +24670,28 @@ msgstr "шлях фільтруючих рядків не повинен бут msgid "column path filter must not be empty string" msgstr "шлях фільтруючого стовпця не повинен бути пустим" -#: utils/adt/xml.c:4661 +#: utils/adt/xml.c:4655 #, c-format msgid "more than one value returned by column XPath expression" msgstr "вираз XPath, який відбирає стовпець, повернув більше одного значення" -#: utils/cache/lsyscache.c:1015 +#: utils/cache/lsyscache.c:1042 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "приведення від типу %s до типу %s не існує" -#: utils/cache/lsyscache.c:2764 utils/cache/lsyscache.c:2797 -#: utils/cache/lsyscache.c:2830 utils/cache/lsyscache.c:2863 +#: utils/cache/lsyscache.c:2834 utils/cache/lsyscache.c:2867 +#: utils/cache/lsyscache.c:2900 utils/cache/lsyscache.c:2933 #, c-format msgid "type %s is only a shell" msgstr "тип %s лише оболонка" -#: utils/cache/lsyscache.c:2769 +#: utils/cache/lsyscache.c:2839 #, c-format msgid "no input function available for type %s" msgstr "для типу %s немає доступної функції введення" -#: utils/cache/lsyscache.c:2802 +#: utils/cache/lsyscache.c:2872 #, c-format msgid "no output function available for type %s" msgstr "для типу %s немає доступної функції виводу" @@ -23782,22 +24701,22 @@ msgstr "для типу %s немає доступної функції виво msgid "operator class \"%s\" of access method %s is missing support function %d for type %s" msgstr "в класі операторів \"%s\" методу доступу %s пропущено опорну функцію %d для типу %s" -#: utils/cache/plancache.c:718 +#: utils/cache/plancache.c:720 #, c-format msgid "cached plan must not change result type" msgstr "в кешованому плані не повинен змінюватись тип результату" -#: utils/cache/relcache.c:6078 +#: utils/cache/relcache.c:6221 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "не вдалося створити файл ініціалізації для кешу відношень \"%s\": %m" -#: utils/cache/relcache.c:6080 +#: utils/cache/relcache.c:6223 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Продовжуємо усе одно, але щось не так." -#: utils/cache/relcache.c:6402 +#: utils/cache/relcache.c:6545 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "не вдалося видалити файл кешу \"%s\": %m" @@ -23807,123 +24726,122 @@ msgstr "не вдалося видалити файл кешу \"%s\": %m" msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "виконати PREPARE для транзакції, яка змінила зіставлення відношень, не можна" -#: utils/cache/relmapper.c:761 +#: utils/cache/relmapper.c:767 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "файл зіставлень відношень \"%s\" містить неприпустимі дані" -#: utils/cache/relmapper.c:771 +#: utils/cache/relmapper.c:777 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "файл зіставлень відношень \"%s\" містить неправильну контрольну суму" -#: utils/cache/typcache.c:1692 utils/fmgr/funcapi.c:461 +#: utils/cache/typcache.c:1808 utils/fmgr/funcapi.c:463 #, c-format msgid "record type has not been registered" msgstr "тип запису не зареєстрований" -#: utils/error/assert.c:37 +#: utils/error/assert.c:39 #, c-format -msgid "TRAP: ExceptionalCondition: bad arguments\n" -msgstr "TRAP: ExceptionalCondition: невірні аргументи\n" +msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" +msgstr "TRAP: ExceptionalCondition: невірні аргументи в PID %d\n" -#: utils/error/assert.c:40 +#: utils/error/assert.c:42 #, c-format -msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d)\n" -msgstr "TRAP: %s(\"%s\", Файл: \"%s\", Рядок: %d)\n" +msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" +msgstr "TRAP: %s(\"%s\", Файл: \"%s\", Рядок: %d, PID: %d)\n" -#: utils/error/elog.c:322 +#: utils/error/elog.c:409 #, c-format msgid "error occurred before error message processing is available\n" msgstr "сталася помилка перед тим, як обробка повідомлення про помилку була доступна\n" -#: utils/error/elog.c:1868 +#: utils/error/elog.c:1948 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "не вдалося повторно відкрити файл \"%s\" як stderr: %m" -#: utils/error/elog.c:1881 +#: utils/error/elog.c:1961 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "не вдалося повторно відкрити файл \"%s\" як stdout: %m" -#: utils/error/elog.c:2373 utils/error/elog.c:2407 utils/error/elog.c:2423 +#: utils/error/elog.c:2456 utils/error/elog.c:2490 utils/error/elog.c:2506 msgid "[unknown]" msgstr "[unknown]" -#: utils/error/elog.c:2893 utils/error/elog.c:3203 utils/error/elog.c:3311 +#: utils/error/elog.c:3026 utils/error/elog.c:3344 utils/error/elog.c:3451 msgid "missing error text" msgstr "пропущено текст помилки" -#: utils/error/elog.c:2896 utils/error/elog.c:2899 utils/error/elog.c:3314 -#: utils/error/elog.c:3317 +#: utils/error/elog.c:3029 utils/error/elog.c:3032 #, c-format msgid " at character %d" msgstr " символ %d" -#: utils/error/elog.c:2909 utils/error/elog.c:2916 +#: utils/error/elog.c:3042 utils/error/elog.c:3049 msgid "DETAIL: " msgstr "ВІДОМОСТІ: " -#: utils/error/elog.c:2923 +#: utils/error/elog.c:3056 msgid "HINT: " msgstr "УКАЗІВКА: " -#: utils/error/elog.c:2930 +#: utils/error/elog.c:3063 msgid "QUERY: " msgstr "ЗАПИТ: " -#: utils/error/elog.c:2937 +#: utils/error/elog.c:3070 msgid "CONTEXT: " msgstr "КОНТЕКСТ: " -#: utils/error/elog.c:2947 +#: utils/error/elog.c:3080 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "РОЗТАШУВАННЯ: %s, %s:%d\n" -#: utils/error/elog.c:2954 +#: utils/error/elog.c:3087 #, c-format msgid "LOCATION: %s:%d\n" msgstr "РОЗТАШУВАННЯ: %s:%d\n" -#: utils/error/elog.c:2961 +#: utils/error/elog.c:3094 msgid "BACKTRACE: " msgstr "ВІДСТЕЖУВАТИ: " -#: utils/error/elog.c:2975 +#: utils/error/elog.c:3108 msgid "STATEMENT: " msgstr "ІНСТРУКЦІЯ: " -#: utils/error/elog.c:3364 +#: utils/error/elog.c:3496 msgid "DEBUG" msgstr "НАЛАГОДЖЕННЯ" -#: utils/error/elog.c:3368 +#: utils/error/elog.c:3500 msgid "LOG" msgstr "ЗАПИСУВАННЯ" -#: utils/error/elog.c:3371 +#: utils/error/elog.c:3503 msgid "INFO" msgstr "ІНФОРМАЦІЯ" -#: utils/error/elog.c:3374 +#: utils/error/elog.c:3506 msgid "NOTICE" msgstr "ПОВІДОМЛЕННЯ" -#: utils/error/elog.c:3377 +#: utils/error/elog.c:3510 msgid "WARNING" msgstr "ПОПЕРЕДЖЕННЯ" -#: utils/error/elog.c:3380 +#: utils/error/elog.c:3513 msgid "ERROR" msgstr "ПОМИЛКА" -#: utils/error/elog.c:3383 +#: utils/error/elog.c:3516 msgid "FATAL" msgstr "ФАТАЛЬНО" -#: utils/error/elog.c:3386 +#: utils/error/elog.c:3519 msgid "PANIC" msgstr "ПАНІКА" @@ -24011,405 +24929,405 @@ msgstr "параметр \"dynamic_library_path\" містить компоне msgid "internal function \"%s\" is not in internal lookup table" msgstr "внутрішньої функції \"%s\" немає у внутрішній таблиці підстановки" -#: utils/fmgr/fmgr.c:487 +#: utils/fmgr/fmgr.c:484 #, c-format msgid "could not find function information for function \"%s\"" msgstr "не вдалося знайти інформацію про функцію \"%s\"" -#: utils/fmgr/fmgr.c:489 +#: utils/fmgr/fmgr.c:486 #, c-format msgid "SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname)." msgstr "Функції, які викликаються з SQL, потребують додаткове оголошення PG_FUNCTION_INFO_V1(ім'я_функції)." -#: utils/fmgr/fmgr.c:507 +#: utils/fmgr/fmgr.c:504 #, c-format msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "нерозпізнана версія API %d, повідомлена інформаційною функцією \"%s\"" -#: utils/fmgr/fmgr.c:2003 +#: utils/fmgr/fmgr.c:1999 #, c-format msgid "operator class options info is absent in function call context" msgstr "в контексті виклику функції відсутня інформація стосовно параметрів класів операторів" -#: utils/fmgr/fmgr.c:2070 +#: utils/fmgr/fmgr.c:2066 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "функція мовної перевірки %u викликана для мови %u замість %u" -#: utils/fmgr/funcapi.c:384 +#: utils/fmgr/funcapi.c:386 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" msgstr "не вдалося визначити фактичний тип результату для функції \"%s\" оголошеної як, та, котра повертає тип %s" -#: utils/fmgr/funcapi.c:1651 utils/fmgr/funcapi.c:1683 +#: utils/fmgr/funcapi.c:531 +#, c-format +msgid "argument declared %s does not contain a range type but type %s" +msgstr "оголошений аргумент %s не містить тип діапазону, а тип %s" + +#: utils/fmgr/funcapi.c:614 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "не вдалося знайти багатодіапазонний тип для типу даних %s" + +#: utils/fmgr/funcapi.c:1831 utils/fmgr/funcapi.c:1863 #, c-format msgid "number of aliases does not match number of columns" msgstr "кількість псевдонімів не відповідає кількості стовпців" -#: utils/fmgr/funcapi.c:1677 +#: utils/fmgr/funcapi.c:1857 #, c-format msgid "no column alias was provided" msgstr "жодного псевдоніму для стовпця не було надано" -#: utils/fmgr/funcapi.c:1701 +#: utils/fmgr/funcapi.c:1881 #, c-format msgid "could not determine row description for function returning record" msgstr "не вдалося визначити опис рядка для функції, що повертає запис" -#: utils/init/miscinit.c:285 +#: utils/init/miscinit.c:315 #, c-format msgid "data directory \"%s\" does not exist" msgstr "каталог даних \"%s\" не існує" -#: utils/init/miscinit.c:290 +#: utils/init/miscinit.c:320 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "не вдалося прочитати дозволи на каталог \"%s\": %m" -#: utils/init/miscinit.c:298 +#: utils/init/miscinit.c:328 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "вказаний каталог даних \"%s\" не є каталогом" -#: utils/init/miscinit.c:314 +#: utils/init/miscinit.c:344 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "власник каталогу даних \"%s\" визначений неправильно" -#: utils/init/miscinit.c:316 +#: utils/init/miscinit.c:346 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "Сервер повинен запускати користувач, який володіє каталогом даних." -#: utils/init/miscinit.c:334 +#: utils/init/miscinit.c:364 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "каталог даних \"%s\" має неприпустимі дозволи" -#: utils/init/miscinit.c:336 +#: utils/init/miscinit.c:366 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "Дозволи повинні бути u=rwx (0700) або u=rwx,g=rx (0750)." -#: utils/init/miscinit.c:615 utils/misc/guc.c:7139 +#: utils/init/miscinit.c:645 utils/misc/guc.c:7482 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "встановити параметр \"%s\" в межах операції з обмеженнями по безпеці, не можна" -#: utils/init/miscinit.c:683 +#: utils/init/miscinit.c:713 #, c-format msgid "role with OID %u does not exist" msgstr "роль з OID %u не існує" -#: utils/init/miscinit.c:713 +#: utils/init/miscinit.c:743 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "для ролі \"%s\" вхід не дозволений" -#: utils/init/miscinit.c:731 +#: utils/init/miscinit.c:761 #, c-format msgid "too many connections for role \"%s\"" msgstr "занадто багато підключень для ролі \"%s\"" -#: utils/init/miscinit.c:791 +#: utils/init/miscinit.c:821 #, c-format msgid "permission denied to set session authorization" msgstr "немає прав для встановлення авторизації в сеансі" -#: utils/init/miscinit.c:874 +#: utils/init/miscinit.c:904 #, c-format msgid "invalid role OID: %u" msgstr "неприпустимий OID ролі: %u" -#: utils/init/miscinit.c:928 +#: utils/init/miscinit.c:958 #, c-format msgid "database system is shut down" msgstr "система бази даних вимкнена" -#: utils/init/miscinit.c:1015 +#: utils/init/miscinit.c:1045 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "не вдалося створити файл блокування \"%s\": %m" -#: utils/init/miscinit.c:1029 +#: utils/init/miscinit.c:1059 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "не вдалося відкрити файл блокування \"%s\": %m" -#: utils/init/miscinit.c:1036 +#: utils/init/miscinit.c:1066 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "не вдалося прочитати файл блокування \"%s\": %m" -#: utils/init/miscinit.c:1045 +#: utils/init/miscinit.c:1075 #, c-format msgid "lock file \"%s\" is empty" msgstr "файл блокування \"%s\" пустий" -#: utils/init/miscinit.c:1046 +#: utils/init/miscinit.c:1076 #, c-format msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." msgstr "Або зараз запускається інший сервер, або цей файл блокування залишився в результаті збою під час попереднього запуску." -#: utils/init/miscinit.c:1090 +#: utils/init/miscinit.c:1120 #, c-format msgid "lock file \"%s\" already exists" msgstr "файл блокування \"%s\" вже існує" -#: utils/init/miscinit.c:1094 +#: utils/init/miscinit.c:1124 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "Інший postgres (PID %d) працює з каталогом даних \"%s\"?" -#: utils/init/miscinit.c:1096 +#: utils/init/miscinit.c:1126 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "Інший postmaster (PID %d) працює з каталогом даних \"%s\"?" -#: utils/init/miscinit.c:1099 +#: utils/init/miscinit.c:1129 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "Інший postgres (PID %d) використовує файл сокету \"%s\"?" -#: utils/init/miscinit.c:1101 +#: utils/init/miscinit.c:1131 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "Інший postmaster (PID %d) використовує файл сокету \"%s\"?" -#: utils/init/miscinit.c:1152 +#: utils/init/miscinit.c:1182 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "не вдалося видалити старий файл блокування \"%s\": %m" -#: utils/init/miscinit.c:1154 +#: utils/init/miscinit.c:1184 #, c-format msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." msgstr "Здається, файл залишився випадково, але видалити його не вийшло. Будь-ласка, видаліть файл вручну або спробуйте знову." -#: utils/init/miscinit.c:1191 utils/init/miscinit.c:1205 -#: utils/init/miscinit.c:1216 +#: utils/init/miscinit.c:1221 utils/init/miscinit.c:1235 +#: utils/init/miscinit.c:1246 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "не вдалося записати файл блокування \"%s\": %m" -#: utils/init/miscinit.c:1327 utils/init/miscinit.c:1469 utils/misc/guc.c:10038 +#: utils/init/miscinit.c:1357 utils/init/miscinit.c:1499 utils/misc/guc.c:10378 #, c-format msgid "could not read from file \"%s\": %m" msgstr "не вдалося прочитати з файлу \"%s\": %m" -#: utils/init/miscinit.c:1457 +#: utils/init/miscinit.c:1487 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "не вдалося відкрити файл \"%s\": %m; все одно продовжується" -#: utils/init/miscinit.c:1482 +#: utils/init/miscinit.c:1512 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "файл блокування \"%s\" містить неправильний PID: %ld замість %ld" -#: utils/init/miscinit.c:1521 utils/init/miscinit.c:1537 +#: utils/init/miscinit.c:1551 utils/init/miscinit.c:1567 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\" не є припустимим каталогом даних" -#: utils/init/miscinit.c:1523 +#: utils/init/miscinit.c:1553 #, c-format msgid "File \"%s\" is missing." msgstr "Файл \"%s\" пропущено." -#: utils/init/miscinit.c:1539 +#: utils/init/miscinit.c:1569 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Файл \"%s\" не містить припустимих даних." -#: utils/init/miscinit.c:1541 +#: utils/init/miscinit.c:1571 #, c-format msgid "You might need to initdb." msgstr "Можливо, вам слід виконати initdb." -#: utils/init/miscinit.c:1549 +#: utils/init/miscinit.c:1579 #, c-format msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." msgstr "Каталог даних ініціалізований сервером PostgreSQL версії %s, не сумісною з цією версією %s." -#: utils/init/miscinit.c:1616 +#: utils/init/postinit.c:254 #, c-format -msgid "loaded library \"%s\"" -msgstr "завантажена бібліотека \"%s\"" +msgid "replication connection authorized: user=%s" +msgstr "підключення для реплікації авторизовано: користувач=%s" -#: utils/init/postinit.c:255 +#: utils/init/postinit.c:257 #, c-format -msgid "replication connection authorized: user=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr "авторизовано підключення реплікації: користувач=%s назва_програми=%s SSL активовано (протокол=%s, шифр=%s, біти=%d, стискання=%s)" - -#: utils/init/postinit.c:261 utils/init/postinit.c:267 -#: utils/init/postinit.c:289 utils/init/postinit.c:295 -msgid "off" -msgstr "вимк" +msgid "connection authorized: user=%s" +msgstr "підключення авторизовано: користувач=%s" -#: utils/init/postinit.c:261 utils/init/postinit.c:267 -#: utils/init/postinit.c:289 utils/init/postinit.c:295 -msgid "on" -msgstr "увімк" - -#: utils/init/postinit.c:262 +#: utils/init/postinit.c:260 #, c-format -msgid "replication connection authorized: user=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr "підключення для реплікації авторизовано: користувач=%s SSL активований (протокол=%s, шифр=%s, біти=%d, стискання=%s)" +msgid " database=%s" +msgstr " database=%s" -#: utils/init/postinit.c:272 +#: utils/init/postinit.c:263 #, c-format -msgid "replication connection authorized: user=%s application_name=%s" -msgstr "авторизовано підключення реплікації: користувач=%s назва_програми=%s" +msgid " application_name=%s" +msgstr " application_name=%s" -#: utils/init/postinit.c:275 +#: utils/init/postinit.c:268 #, c-format -msgid "replication connection authorized: user=%s" -msgstr "підключення для реплікації авторизовано: користувач=%s" +msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" +msgstr " SSL активовано (протокол=%s, шифр=%s, біти=%d)" -#: utils/init/postinit.c:284 +#: utils/init/postinit.c:280 #, c-format -msgid "connection authorized: user=%s database=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr "підключення авторизовано: користувач=%s база даних=%s назва_програми=%s SSL активовано (протокол=%s, шифр=%s, біти=%d, стискання=%s)" +msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" +msgstr " GSS (автентифіковано=%s, закодовано=%s, ведучій=%s)" -#: utils/init/postinit.c:290 -#, c-format -msgid "connection authorized: user=%s database=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr "підключення для реплікації авторизовано: користувач=%s база даних=%s SSL активований (протокол=%s, шифр=%s, біти=%d, стискання=%s)" +#: utils/init/postinit.c:281 utils/init/postinit.c:282 +#: utils/init/postinit.c:287 utils/init/postinit.c:288 +msgid "no" +msgstr "ні" -#: utils/init/postinit.c:300 -#, c-format -msgid "connection authorized: user=%s database=%s application_name=%s" -msgstr "підключення авторизовано: користувач=%s база даних=%s назва_програми=%s" +#: utils/init/postinit.c:281 utils/init/postinit.c:282 +#: utils/init/postinit.c:287 utils/init/postinit.c:288 +msgid "yes" +msgstr "так" -#: utils/init/postinit.c:302 +#: utils/init/postinit.c:286 #, c-format -msgid "connection authorized: user=%s database=%s" -msgstr "підключення авторизовано: користувач=%s база даних=%s" +msgid " GSS (authenticated=%s, encrypted=%s)" +msgstr " GSS (автентифіковано=%s, закодовано=%s)" -#: utils/init/postinit.c:334 +#: utils/init/postinit.c:323 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "база даних \"%s\" зникла з pg_database" -#: utils/init/postinit.c:336 +#: utils/init/postinit.c:325 #, c-format msgid "Database OID %u now seems to belong to \"%s\"." msgstr "Здається, база даних з OID %u тепер належить \"%s\"." -#: utils/init/postinit.c:356 +#: utils/init/postinit.c:345 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "база даних \"%s\" не приймає підключення в даний момент" -#: utils/init/postinit.c:369 +#: utils/init/postinit.c:358 #, c-format msgid "permission denied for database \"%s\"" msgstr "доступ до бази даних \"%s\" відхилений" -#: utils/init/postinit.c:370 +#: utils/init/postinit.c:359 #, c-format msgid "User does not have CONNECT privilege." msgstr "Користувач не має права CONNECT." -#: utils/init/postinit.c:387 +#: utils/init/postinit.c:376 #, c-format msgid "too many connections for database \"%s\"" msgstr "занадто багато підключень до бази даних \"%s\"" -#: utils/init/postinit.c:409 utils/init/postinit.c:416 +#: utils/init/postinit.c:398 utils/init/postinit.c:405 #, c-format msgid "database locale is incompatible with operating system" msgstr "локалізація бази даних несумісна з операційною системою" -#: utils/init/postinit.c:410 +#: utils/init/postinit.c:399 #, c-format msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." msgstr "База даних була ініціалізована з параметром LC_COLLATE \"%s\", але зараз setlocale() не розпізнає його." -#: utils/init/postinit.c:412 utils/init/postinit.c:419 +#: utils/init/postinit.c:401 utils/init/postinit.c:408 #, c-format msgid "Recreate the database with another locale or install the missing locale." msgstr "Повторно створіть базу даних з іншою локалізацією або встановіть пропущену локалізацію." -#: utils/init/postinit.c:417 +#: utils/init/postinit.c:406 #, c-format msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." msgstr "База даних була ініціалізована з параметром LC_CTYPE \"%s\", але зараз setlocale() не розпізнає його." -#: utils/init/postinit.c:762 +#: utils/init/postinit.c:761 #, c-format msgid "no roles are defined in this database system" msgstr "в цій системі баз даних не визначено жодної ролі" -#: utils/init/postinit.c:763 +#: utils/init/postinit.c:762 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "Ви повинні негайно виконати CREATE USER \"%s\" SUPERUSER;." -#: utils/init/postinit.c:799 +#: utils/init/postinit.c:798 #, c-format msgid "new replication connections are not allowed during database shutdown" msgstr "нові підключення для реплікації не дозволені під час завершення роботи бази даних" -#: utils/init/postinit.c:803 +#: utils/init/postinit.c:802 #, c-format msgid "must be superuser to connect during database shutdown" msgstr "потрібно бути суперкористувачем, щоб підключитись під час завершення роботи бази даних" -#: utils/init/postinit.c:813 +#: utils/init/postinit.c:812 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "потрібно бути суперкористувачем, щоб підключитись в режимі двійкового оновлення" -#: utils/init/postinit.c:826 +#: utils/init/postinit.c:825 #, c-format msgid "remaining connection slots are reserved for non-replication superuser connections" msgstr "слоти підключень, які залишились, зарезервовані для підключень суперкористувача (не для реплікації)" -#: utils/init/postinit.c:836 +#: utils/init/postinit.c:835 #, c-format msgid "must be superuser or replication role to start walsender" msgstr "для запуску процесу walsender потребується роль реплікації або бути суперкористувачем" -#: utils/init/postinit.c:905 +#: utils/init/postinit.c:904 #, c-format msgid "database %u does not exist" msgstr "база даних %u не існує" -#: utils/init/postinit.c:994 +#: utils/init/postinit.c:993 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Схоже, вона щойно була видалена або перейменована." -#: utils/init/postinit.c:1012 +#: utils/init/postinit.c:1011 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Підкаталог бази даних \"%s\" пропущений." -#: utils/init/postinit.c:1017 +#: utils/init/postinit.c:1016 #, c-format msgid "could not access directory \"%s\": %m" msgstr "немає доступу до каталогу \"%s\": %m" -#: utils/mb/conv.c:443 utils/mb/conv.c:635 +#: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" msgstr "неприпустимий номер кодування: %d" -#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:122 -#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:154 +#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:129 +#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:165 #, c-format msgid "unexpected encoding ID %d for ISO 8859 character sets" msgstr "неочікуваний ідентифікатор кодування %d для наборів символів ISO 8859" -#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:103 -#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:135 +#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:110 +#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:146 #, c-format msgid "unexpected encoding ID %d for WIN character sets" msgstr "неочікуваний ідентифікатор кодування %d для наборів символів WIN" -#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:842 +#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:900 #, c-format msgid "conversion between %s and %s is not supported" msgstr "перетворення між %s і %s не підтримується" @@ -24419,2118 +25337,2157 @@ msgstr "перетворення між %s і %s не підтримується msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" msgstr "функції за замовчуванням перетворення з кодування \"%s\" в \"%s\" не існує" -#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:429 utils/mb/mbutils.c:758 -#: utils/mb/mbutils.c:784 +#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 +#: utils/mb/mbutils.c:842 #, c-format msgid "String of %d bytes is too long for encoding conversion." msgstr "Рядок з %d байт занадто довгий для перетворення кодування." -#: utils/mb/mbutils.c:511 +#: utils/mb/mbutils.c:568 #, c-format msgid "invalid source encoding name \"%s\"" msgstr "неприпустиме ім’я вихідного кодування \"%s\"" -#: utils/mb/mbutils.c:516 +#: utils/mb/mbutils.c:573 #, c-format msgid "invalid destination encoding name \"%s\"" msgstr "неприпустиме ім’я кодування результату \"%s\"" -#: utils/mb/mbutils.c:656 +#: utils/mb/mbutils.c:713 #, c-format msgid "invalid byte value for encoding \"%s\": 0x%02x" msgstr "неприпустиме значення байту для кодування \"%s\": 0x%02x" -#: utils/mb/mbutils.c:819 +#: utils/mb/mbutils.c:877 #, c-format msgid "invalid Unicode code point" msgstr "неприпустима кодова точка Unicode" -#: utils/mb/mbutils.c:1087 +#: utils/mb/mbutils.c:1146 #, c-format msgid "bind_textdomain_codeset failed" msgstr "помилка в bind_textdomain_codeset" -#: utils/mb/mbutils.c:1595 +#: utils/mb/mbutils.c:1667 #, c-format msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "неприпустима послідовність байтів для кодування \"%s\": %s" -#: utils/mb/mbutils.c:1628 +#: utils/mb/mbutils.c:1700 #, c-format msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "символ з послідовністю байтів %s в кодуванні \"%s\" не має еквіваленту в кодуванні \"%s\"" -#: utils/misc/guc.c:679 +#: utils/misc/guc.c:718 msgid "Ungrouped" msgstr "Розгруповано" -#: utils/misc/guc.c:681 +#: utils/misc/guc.c:720 msgid "File Locations" msgstr "Розташування файлів" -#: utils/misc/guc.c:683 -msgid "Connections and Authentication" -msgstr "Підключення і автентифікація" - -#: utils/misc/guc.c:685 +#: utils/misc/guc.c:722 msgid "Connections and Authentication / Connection Settings" msgstr "Підключення і автентифікація / Параметри підключень" -#: utils/misc/guc.c:687 +#: utils/misc/guc.c:724 msgid "Connections and Authentication / Authentication" msgstr "Підключення і автентифікація / Автентифікація" -#: utils/misc/guc.c:689 +#: utils/misc/guc.c:726 msgid "Connections and Authentication / SSL" msgstr "Підключення і автентифікація / SSL" -#: utils/misc/guc.c:691 -msgid "Resource Usage" -msgstr "Використання ресурсу" - -#: utils/misc/guc.c:693 +#: utils/misc/guc.c:728 msgid "Resource Usage / Memory" msgstr "Використання ресурсу / Пам'ять" -#: utils/misc/guc.c:695 +#: utils/misc/guc.c:730 msgid "Resource Usage / Disk" msgstr "Використання ресурсу / Диск" -#: utils/misc/guc.c:697 +#: utils/misc/guc.c:732 msgid "Resource Usage / Kernel Resources" msgstr "Використання ресурсу / Ресурси ядра" -#: utils/misc/guc.c:699 +#: utils/misc/guc.c:734 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Використання ресурсу / Затримка очистки по вартості" -#: utils/misc/guc.c:701 +#: utils/misc/guc.c:736 msgid "Resource Usage / Background Writer" msgstr "Використання ресурсу / Фоновий запис" -#: utils/misc/guc.c:703 +#: utils/misc/guc.c:738 msgid "Resource Usage / Asynchronous Behavior" msgstr "Використання ресурсу / Асинхронна поведінка" -#: utils/misc/guc.c:705 -msgid "Write-Ahead Log" -msgstr "Журнал WAL" - -#: utils/misc/guc.c:707 +#: utils/misc/guc.c:740 msgid "Write-Ahead Log / Settings" msgstr "Журнал WAL / Параметри" -#: utils/misc/guc.c:709 +#: utils/misc/guc.c:742 msgid "Write-Ahead Log / Checkpoints" msgstr "Журнал WAL / Контрольні точки" -#: utils/misc/guc.c:711 +#: utils/misc/guc.c:744 msgid "Write-Ahead Log / Archiving" msgstr "Журнал WAL / Архівація" -#: utils/misc/guc.c:713 +#: utils/misc/guc.c:746 msgid "Write-Ahead Log / Archive Recovery" msgstr "Журнал WAL / Відновлення архіву" -#: utils/misc/guc.c:715 +#: utils/misc/guc.c:748 msgid "Write-Ahead Log / Recovery Target" msgstr "Журнал WAL / Мета відновлення" -#: utils/misc/guc.c:717 -msgid "Replication" -msgstr "Реплікація" - -#: utils/misc/guc.c:719 +#: utils/misc/guc.c:750 msgid "Replication / Sending Servers" msgstr "Реплікація / Надсилання серверів" -#: utils/misc/guc.c:721 -msgid "Replication / Master Server" -msgstr "Реплікація / Головний сервер" +#: utils/misc/guc.c:752 +msgid "Replication / Primary Server" +msgstr "Реплікація / Основний сервер" -#: utils/misc/guc.c:723 +#: utils/misc/guc.c:754 msgid "Replication / Standby Servers" msgstr "Реплікація / Резервні сервера" -#: utils/misc/guc.c:725 +#: utils/misc/guc.c:756 msgid "Replication / Subscribers" msgstr "Реплікація / Підписники" -#: utils/misc/guc.c:727 -msgid "Query Tuning" -msgstr "Налаштування запитів" - -#: utils/misc/guc.c:729 +#: utils/misc/guc.c:758 msgid "Query Tuning / Planner Method Configuration" msgstr "Налаштування запитів / Конфігурація методів планувальника" -#: utils/misc/guc.c:731 +#: utils/misc/guc.c:760 msgid "Query Tuning / Planner Cost Constants" msgstr "Налаштування запитів / Константи вартості для планувальника" -#: utils/misc/guc.c:733 +#: utils/misc/guc.c:762 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Налаштування запитів / Генетичний оптимізатор запитів" -#: utils/misc/guc.c:735 +#: utils/misc/guc.c:764 msgid "Query Tuning / Other Planner Options" msgstr "Налаштування запитів / Інші параметри планувальника" -#: utils/misc/guc.c:737 -msgid "Reporting and Logging" -msgstr "Звіти і журналювання" - -#: utils/misc/guc.c:739 +#: utils/misc/guc.c:766 msgid "Reporting and Logging / Where to Log" msgstr "Звіти і журналювання / Куди записувати" -#: utils/misc/guc.c:741 +#: utils/misc/guc.c:768 msgid "Reporting and Logging / When to Log" msgstr "Звіти і журналювання / Коли записувати" -#: utils/misc/guc.c:743 +#: utils/misc/guc.c:770 msgid "Reporting and Logging / What to Log" msgstr "Звіти і журналювання / Що записувати" -#: utils/misc/guc.c:745 -msgid "Process Title" -msgstr "Заголовок процесу" - -#: utils/misc/guc.c:747 -msgid "Statistics" -msgstr "Статистика" +#: utils/misc/guc.c:772 +msgid "Reporting and Logging / Process Title" +msgstr "Звітування і журналювання / Назва процесу" -#: utils/misc/guc.c:749 +#: utils/misc/guc.c:774 msgid "Statistics / Monitoring" msgstr "Статистика / Моніторинг" -#: utils/misc/guc.c:751 +#: utils/misc/guc.c:776 msgid "Statistics / Query and Index Statistics Collector" msgstr "Статистика / Збирач статистики по запитам і індексам" -#: utils/misc/guc.c:753 +#: utils/misc/guc.c:778 msgid "Autovacuum" msgstr "Автоочистка" -#: utils/misc/guc.c:755 -msgid "Client Connection Defaults" -msgstr "Параметри клієнтських сеансів за замовчуванням" - -#: utils/misc/guc.c:757 +#: utils/misc/guc.c:780 msgid "Client Connection Defaults / Statement Behavior" msgstr "Параметри клієнтських сеансів за замовчуванням / Поведінка декларацій" -#: utils/misc/guc.c:759 +#: utils/misc/guc.c:782 msgid "Client Connection Defaults / Locale and Formatting" msgstr "Параметри клієнтських сеансів за замовчуванням / Локалізація і форматування" -#: utils/misc/guc.c:761 +#: utils/misc/guc.c:784 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "Параметри клієнтських сеансів за замовчуванням / Попереднє завантаження спільних бібліотек" -#: utils/misc/guc.c:763 +#: utils/misc/guc.c:786 msgid "Client Connection Defaults / Other Defaults" msgstr "Параметри клієнтських сеансів за замовчуванням / Інші параметри за замовчуванням" -#: utils/misc/guc.c:765 +#: utils/misc/guc.c:788 msgid "Lock Management" msgstr "Керування блокуванням" -#: utils/misc/guc.c:767 -msgid "Version and Platform Compatibility" -msgstr "Сумісність версій і платформ" - -#: utils/misc/guc.c:769 +#: utils/misc/guc.c:790 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Сумісність версій і платформ / Попередні версії PostgreSQL" -#: utils/misc/guc.c:771 +#: utils/misc/guc.c:792 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "Сумісність версій і платформ / Інші платформи і клієнти" -#: utils/misc/guc.c:773 +#: utils/misc/guc.c:794 msgid "Error Handling" msgstr "Обробка помилок" -#: utils/misc/guc.c:775 +#: utils/misc/guc.c:796 msgid "Preset Options" msgstr "Визначені параметри" -#: utils/misc/guc.c:777 +#: utils/misc/guc.c:798 msgid "Customized Options" msgstr "Настроєні параметри" -#: utils/misc/guc.c:779 +#: utils/misc/guc.c:800 msgid "Developer Options" msgstr "Параметри для розробників" -#: utils/misc/guc.c:837 +#: utils/misc/guc.c:858 msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." msgstr "Припустимі одиниці для цього параметру: \"B\", \"kB\", \"MB\", \"GB\", і \"TB\"." -#: utils/misc/guc.c:874 +#: utils/misc/guc.c:895 msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." msgstr "Припустимі одиниці для цього параметру: \"us\", \"ms\", \"s\", \"min\", \"h\", і \"d\"." -#: utils/misc/guc.c:936 +#: utils/misc/guc.c:957 msgid "Enables the planner's use of sequential-scan plans." msgstr "Дає змогу планувальнику використати плани послідовного сканування." -#: utils/misc/guc.c:946 +#: utils/misc/guc.c:967 msgid "Enables the planner's use of index-scan plans." msgstr "Дає змогу планувальнику використати плани сканування по індексу." -#: utils/misc/guc.c:956 +#: utils/misc/guc.c:977 msgid "Enables the planner's use of index-only-scan plans." msgstr "Дає змогу планувальнику використати плани сканування лише індекса." -#: utils/misc/guc.c:966 +#: utils/misc/guc.c:987 msgid "Enables the planner's use of bitmap-scan plans." msgstr "Дає змогу планувальнику використати плани сканування по точковому рисунку." -#: utils/misc/guc.c:976 +#: utils/misc/guc.c:997 msgid "Enables the planner's use of TID scan plans." msgstr "Дає змогу планувальнику використати плани сканування TID." -#: utils/misc/guc.c:986 +#: utils/misc/guc.c:1007 msgid "Enables the planner's use of explicit sort steps." msgstr "Дає змогу планувальнику використати кроки з явним сортуванням." -#: utils/misc/guc.c:996 +#: utils/misc/guc.c:1017 msgid "Enables the planner's use of incremental sort steps." msgstr "Дає змогу планувальнику використати кроки інкрементного сортування." -#: utils/misc/guc.c:1005 +#: utils/misc/guc.c:1026 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Дає змогу планувальнику використовувати плани агрегації по гешу." -#: utils/misc/guc.c:1015 +#: utils/misc/guc.c:1036 msgid "Enables the planner's use of materialization." msgstr "Дає змогу планувальнику використовувати матеріалізацію." -#: utils/misc/guc.c:1025 +#: utils/misc/guc.c:1046 +msgid "Enables the planner's use of memoization." +msgstr "Дає змогу планувальнику використовувати мемоїзацію." + +#: utils/misc/guc.c:1056 msgid "Enables the planner's use of nested-loop join plans." msgstr "Дає змогу планувальнику використовувати плани з'єднання з вкладеними циклами." -#: utils/misc/guc.c:1035 +#: utils/misc/guc.c:1066 msgid "Enables the planner's use of merge join plans." msgstr "Дає змогу планувальнику використовувати плани з'єднання об'єднанням." -#: utils/misc/guc.c:1045 +#: utils/misc/guc.c:1076 msgid "Enables the planner's use of hash join plans." msgstr "Дає змогу планувальнику використовувати плани з'єднання по гешу." -#: utils/misc/guc.c:1055 +#: utils/misc/guc.c:1086 msgid "Enables the planner's use of gather merge plans." msgstr "Дає змогу планувальнику використовувати плани збору об'єднанням." -#: utils/misc/guc.c:1065 +#: utils/misc/guc.c:1096 msgid "Enables partitionwise join." msgstr "Вмикає з'єднання з урахуванням секціонування." -#: utils/misc/guc.c:1075 +#: utils/misc/guc.c:1106 msgid "Enables partitionwise aggregation and grouping." msgstr "Вмикає агрегацію і групування з урахуванням секціонування." -#: utils/misc/guc.c:1085 +#: utils/misc/guc.c:1116 msgid "Enables the planner's use of parallel append plans." msgstr "Дає змогу планувальнику використовувати плани паралельного додавання." -#: utils/misc/guc.c:1095 +#: utils/misc/guc.c:1126 msgid "Enables the planner's use of parallel hash plans." msgstr "Дає змогу планувальнику використовувати плани паралельного з'єднання по гешу." -#: utils/misc/guc.c:1105 -msgid "Enables plan-time and run-time partition pruning." -msgstr "Вмикає видалення секцій під час планування і виконання запитів." +#: utils/misc/guc.c:1136 +msgid "Enables plan-time and execution-time partition pruning." +msgstr "Активує видалення розділу під час планування і виконання." -#: utils/misc/guc.c:1106 +#: utils/misc/guc.c:1137 msgid "Allows the query planner and executor to compare partition bounds to conditions in the query to determine which partitions must be scanned." msgstr "Дозволяє планувальнику і виконавцю запитів порівнювати границі секцій з умовами в запиті і визначати які секції повинні бути відскановані." -#: utils/misc/guc.c:1117 +#: utils/misc/guc.c:1148 +msgid "Enables the planner's use of async append plans." +msgstr "Дає змогу планувальнику використовувати асинхронні плани додавання." + +#: utils/misc/guc.c:1158 msgid "Enables genetic query optimization." msgstr "Вмикає генетичну оптимізацію запитів." -#: utils/misc/guc.c:1118 +#: utils/misc/guc.c:1159 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Цей алгоритм намагається побудувати план без повного перебору." -#: utils/misc/guc.c:1129 +#: utils/misc/guc.c:1170 msgid "Shows whether the current user is a superuser." msgstr "Показує, чи є поточний користувач суперкористувачем." -#: utils/misc/guc.c:1139 +#: utils/misc/guc.c:1180 msgid "Enables advertising the server via Bonjour." msgstr "Вмикає оголошення серверу через Bonjour." -#: utils/misc/guc.c:1148 +#: utils/misc/guc.c:1189 msgid "Collects transaction commit time." msgstr "Збирає час затвердження транзакцій." -#: utils/misc/guc.c:1157 +#: utils/misc/guc.c:1198 msgid "Enables SSL connections." msgstr "Вмикає SSL-підключення." -#: utils/misc/guc.c:1166 +#: utils/misc/guc.c:1207 msgid "Also use ssl_passphrase_command during server reload." msgstr "Також використовувати ssl_passphrase_command під час перезавантаження серверу." -#: utils/misc/guc.c:1175 +#: utils/misc/guc.c:1216 msgid "Give priority to server ciphersuite order." msgstr "Віддавати перевагу замовленню набору шрифтів сервера." -#: utils/misc/guc.c:1184 +#: utils/misc/guc.c:1225 msgid "Forces synchronization of updates to disk." msgstr "Примусова синхронізація оновлень на диск." -#: utils/misc/guc.c:1185 +#: utils/misc/guc.c:1226 msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This insures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "Сервер буде використовувати системний виклик fsync() в декількох місцях, щоб впевнитись, що оновлення фізично записані на диск. Це дозволить привести кластер бази даних в узгоджений стан після аварійного завершення роботи операційної системи або апаратного забезпечення." -#: utils/misc/guc.c:1196 +#: utils/misc/guc.c:1237 msgid "Continues processing after a checksum failure." msgstr "Продовжує обробку після помилки контрольної суми." -#: utils/misc/guc.c:1197 +#: utils/misc/guc.c:1238 msgid "Detection of a checksum failure normally causes PostgreSQL to report an error, aborting the current transaction. Setting ignore_checksum_failure to true causes the system to ignore the failure (but still report a warning), and continue processing. This behavior could cause crashes or other serious problems. Only has an effect if checksums are enabled." msgstr "Виявляючи помилку контрольної суми, PostgreSQL звичайно повідомляє про помилку і перериває поточну транзакцію. Але якщо ignore_checksum_failure дорівнює true, система пропустить помилку (але видасть попередження) і продовжить обробку. Ця поведінка може бути причиною аварійних завершень роботи або інших серйозних проблем. Це має місце, лише якщо ввімкнен контроль цілосності сторінок." -#: utils/misc/guc.c:1211 +#: utils/misc/guc.c:1252 msgid "Continues processing past damaged page headers." msgstr "Продовжує обробку при пошкоджені заголовків сторінок." -#: utils/misc/guc.c:1212 +#: utils/misc/guc.c:1253 msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting zero_damaged_pages to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." msgstr "Виявляючи пошкоджений заголовок сторінки, PostgreSQL звичайно повідомляє про помилку, перериваючи поточну транзакцію. Але якщо zero_damaged_pages дорівнює true система видасть попередження, обнулить пошкоджену сторінку, і продовжить обробку. Ця поведінка знищить дані, а саме рядків в пошкодженій сторінці." -#: utils/misc/guc.c:1225 +#: utils/misc/guc.c:1266 msgid "Continues recovery after an invalid pages failure." msgstr "Продовжує відновлення після помилки неприпустимих сторінок." -#: utils/misc/guc.c:1226 +#: utils/misc/guc.c:1267 msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting ignore_invalid_pages to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." msgstr "Виявлення WAL записів, які мають посилання на неприпустимі сторінки під час відновлення, змушує PostgreSQL підняти помилку на рівень PANIC, перериваючи відновлення. Встановлення параметру ignore_invalid_pages на true змусить систему ігнорувати неприпустимі посилання на сторінки в WAL записах (але все ще буде повідомляти про попередження), і продовжити відновлення. Ця поведінка може викликати збої, втрату даних, розповсюдження або приховання пошкоджень, або інші серйозні проблеми. Діє лише під час відновлення або в режимі очікування." -#: utils/misc/guc.c:1244 +#: utils/misc/guc.c:1285 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "Запис повних сторінок до WAL при першій зміні після контрольної точки." -#: utils/misc/guc.c:1245 +#: utils/misc/guc.c:1286 msgid "A page write in process during an operating system crash might be only partially written to disk. During recovery, the row changes stored in WAL are not enough to recover. This option writes pages when first modified after a checkpoint to WAL so full recovery is possible." msgstr "Сторінка, записувана під час аварійного завершення роботи операційної системи може бути записаною на диск частково. Під час відновлення, журналу змін рядків в WAL буде недостатньо для відновлення. Цей параметр записує повні сторінки після першої зміни після контрольної точки, тож відновлення можливе." -#: utils/misc/guc.c:1258 -msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modifications." +#: utils/misc/guc.c:1299 +msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." msgstr "Запис повних сторінок до WAL при першій зміні після контрольної точки, навіть при некритичних змінах." -#: utils/misc/guc.c:1268 +#: utils/misc/guc.c:1309 msgid "Compresses full-page writes written in WAL file." msgstr "Стискати дані під час запису повних сторінок до файлу WAL." -#: utils/misc/guc.c:1278 +#: utils/misc/guc.c:1319 msgid "Writes zeroes to new WAL files before first use." msgstr "Перед першим використанням записує нулі до нових файлів WAL." -#: utils/misc/guc.c:1288 +#: utils/misc/guc.c:1329 msgid "Recycles WAL files by renaming them." msgstr "Перезаписує файли WAL, перейменувавши їх." -#: utils/misc/guc.c:1298 +#: utils/misc/guc.c:1339 msgid "Logs each checkpoint." msgstr "Журналювати кожну контрольну точку." -#: utils/misc/guc.c:1307 +#: utils/misc/guc.c:1348 msgid "Logs each successful connection." msgstr "Журналювати кожне успішне підключення." -#: utils/misc/guc.c:1316 +#: utils/misc/guc.c:1357 msgid "Logs end of a session, including duration." msgstr "Журналювати кінець сеансу, зокрема тривалість." -#: utils/misc/guc.c:1325 +#: utils/misc/guc.c:1366 msgid "Logs each replication command." msgstr "Журналювати кожну команду реплікації." -#: utils/misc/guc.c:1334 +#: utils/misc/guc.c:1375 msgid "Shows whether the running server has assertion checks enabled." msgstr "Показує, чи активовані перевірки твердження на працюючому сервері." -#: utils/misc/guc.c:1349 +#: utils/misc/guc.c:1390 msgid "Terminate session on any error." msgstr "Припиняти сеанси при будь-якій помилці." -#: utils/misc/guc.c:1358 +#: utils/misc/guc.c:1399 msgid "Reinitialize server after backend crash." msgstr "Повторити ініціалізацію сервера, після внутрішнього аварійного завершення роботи." -#: utils/misc/guc.c:1368 +#: utils/misc/guc.c:1408 +msgid "Remove temporary files after backend crash." +msgstr "Видалити тимчасові файли після аварійного завершення роботи внутрішнього сервера." + +#: utils/misc/guc.c:1419 msgid "Logs the duration of each completed SQL statement." msgstr "Журналювати тривалість кожного виконаного SQL-оператора." -#: utils/misc/guc.c:1377 +#: utils/misc/guc.c:1428 msgid "Logs each query's parse tree." msgstr "Журналювати дерево аналізу для кожного запиту." -#: utils/misc/guc.c:1386 +#: utils/misc/guc.c:1437 msgid "Logs each query's rewritten parse tree." msgstr "Журналювати переписане дерево аналізу для кожного запиту." -#: utils/misc/guc.c:1395 +#: utils/misc/guc.c:1446 msgid "Logs each query's execution plan." msgstr "Журналювати план виконання кожного запиту." -#: utils/misc/guc.c:1404 +#: utils/misc/guc.c:1455 msgid "Indents parse and plan tree displays." msgstr "Відступи при відображенні дерев аналізу і плану запитів." -#: utils/misc/guc.c:1413 +#: utils/misc/guc.c:1464 msgid "Writes parser performance statistics to the server log." msgstr "Запис статистики продуктивності аналізу до запису сервера." -#: utils/misc/guc.c:1422 +#: utils/misc/guc.c:1473 msgid "Writes planner performance statistics to the server log." msgstr "Запис статистики продуктивності планувальника до запису сервера." -#: utils/misc/guc.c:1431 +#: utils/misc/guc.c:1482 msgid "Writes executor performance statistics to the server log." msgstr "Запис статистики продуктивності виконувача до запису сервера." -#: utils/misc/guc.c:1440 +#: utils/misc/guc.c:1491 msgid "Writes cumulative performance statistics to the server log." msgstr "Запис сукупної статистики продуктивності до запису сервера." -#: utils/misc/guc.c:1450 +#: utils/misc/guc.c:1501 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "Журналювати статистику використання системних ресурсів (пам'яті і ЦП) при різноманітних операціях з B-tree." -#: utils/misc/guc.c:1462 +#: utils/misc/guc.c:1513 msgid "Collects information about executing commands." msgstr "Збирати інформацію про команди які виконуються." -#: utils/misc/guc.c:1463 +#: utils/misc/guc.c:1514 msgid "Enables the collection of information on the currently executing command of each session, along with the time at which that command began execution." msgstr "Активує збір інформації про поточні команди, які виконуються в кожному сеансі, разом з часом запуску команди." -#: utils/misc/guc.c:1473 +#: utils/misc/guc.c:1524 msgid "Collects statistics on database activity." msgstr "Збирати статистику про активність бази даних." -#: utils/misc/guc.c:1482 +#: utils/misc/guc.c:1533 msgid "Collects timing statistics for database I/O activity." msgstr "Збирати статистику за часом активності введення/виведення для бази даних." -#: utils/misc/guc.c:1492 +#: utils/misc/guc.c:1542 +msgid "Collects timing statistics for WAL I/O activity." +msgstr "Збирає статистику часу для активності вводу/виводу WAL." + +#: utils/misc/guc.c:1552 msgid "Updates the process title to show the active SQL command." msgstr "Оновлення виводить в заголовок процесу активну SQL-команду." -#: utils/misc/guc.c:1493 +#: utils/misc/guc.c:1553 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "Відображає в заголовку процеса кожну SQL-команду, отриману сервером." -#: utils/misc/guc.c:1506 +#: utils/misc/guc.c:1566 msgid "Starts the autovacuum subprocess." msgstr "Запускає підпроцес автоочистки." -#: utils/misc/guc.c:1516 +#: utils/misc/guc.c:1576 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Генерує налагодженні повідомлення для LISTEN і NOTIFY." -#: utils/misc/guc.c:1528 +#: utils/misc/guc.c:1588 msgid "Emits information about lock usage." msgstr "Видає інформацію про блокування, які використовуються." -#: utils/misc/guc.c:1538 +#: utils/misc/guc.c:1598 msgid "Emits information about user lock usage." msgstr "Видає інформацію про користувацькі блокування, які використовуються." -#: utils/misc/guc.c:1548 +#: utils/misc/guc.c:1608 msgid "Emits information about lightweight lock usage." msgstr "Видає інформацію про спрощені блокування, які використовуються." -#: utils/misc/guc.c:1558 +#: utils/misc/guc.c:1618 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "Виводить інформацію про всі поточні блокування, при тайм-ауті взаємного блокування." -#: utils/misc/guc.c:1570 +#: utils/misc/guc.c:1630 msgid "Logs long lock waits." msgstr "Журналювати тривалі очікування в блокуваннях." -#: utils/misc/guc.c:1580 +#: utils/misc/guc.c:1639 +msgid "Logs standby recovery conflict waits." +msgstr "Журналює очікування конфлікту відновлення." + +#: utils/misc/guc.c:1648 msgid "Logs the host name in the connection logs." msgstr "Журналювати ім’я хоста до записів підключення." -#: utils/misc/guc.c:1581 +#: utils/misc/guc.c:1649 msgid "By default, connection logs only show the IP address of the connecting host. If you want them to show the host name you can turn this on, but depending on your host name resolution setup it might impose a non-negligible performance penalty." msgstr "За замовчуванням, записи підключень показують лише IP-адреси хостів, які підключилися. Якщо ви хочете бачити імена хостів ви можете ввімкнути цей параметр, але врахуйте, що це може значно вплинути на продуктивність." -#: utils/misc/guc.c:1592 +#: utils/misc/guc.c:1660 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Вважати \"expr=NULL\" як \"expr IS NULL\"." -#: utils/misc/guc.c:1593 +#: utils/misc/guc.c:1661 msgid "When turned on, expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL, that is, they return true if expr evaluates to the null value, and false otherwise. The correct behavior of expr = NULL is to always return null (unknown)." msgstr "Коли цей параметр ввімкнений, вирази форми expr = NULL (або NULL = expr) вважаються як expr IS NULL, тобто, повертають true, якщо expr співпадає зі значенням null, і false в іншому разі. Правильна поведінка expr = NULL - завжди повертати null (невідомо)." -#: utils/misc/guc.c:1605 +#: utils/misc/guc.c:1673 msgid "Enables per-database user names." msgstr "Вмикає зв'язування імен користувачів з базами даних." -#: utils/misc/guc.c:1614 +#: utils/misc/guc.c:1682 msgid "Sets the default read-only status of new transactions." msgstr "Встановлює статус \"лише читання\" за замовчуванням для нових транзакцій." -#: utils/misc/guc.c:1623 +#: utils/misc/guc.c:1692 msgid "Sets the current transaction's read-only status." msgstr "Встановлює статус \"лише читання\" для поточної транзакції." -#: utils/misc/guc.c:1633 +#: utils/misc/guc.c:1702 msgid "Sets the default deferrable status of new transactions." msgstr "Встановлює статус відкладеного виконання за замовчуванням для нових транзакцій." -#: utils/misc/guc.c:1642 +#: utils/misc/guc.c:1711 msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." msgstr "Визначає, чи відкладати серіалізовану транзакцію \"лише читання\" до моменту, коли збій серіалізації буде виключений." -#: utils/misc/guc.c:1652 +#: utils/misc/guc.c:1721 msgid "Enable row security." msgstr "Вмикає захист на рівні рядків." -#: utils/misc/guc.c:1653 +#: utils/misc/guc.c:1722 msgid "When enabled, row security will be applied to all users." msgstr "Коли ввімкнено, захист на рівні рядків буде застосовано до всіх користувачів." -#: utils/misc/guc.c:1661 -msgid "Check function bodies during CREATE FUNCTION." -msgstr "Перевіряти тіло функції під час CREATE FUNCTION." +#: utils/misc/guc.c:1730 +msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." +msgstr "Перевірте тіла підпрограм під час CREATE FUNCTION і CREATE PROCEDURE." -#: utils/misc/guc.c:1670 +#: utils/misc/guc.c:1739 msgid "Enable input of NULL elements in arrays." msgstr "Дозволяє введення NULL елементів у масивах." -#: utils/misc/guc.c:1671 +#: utils/misc/guc.c:1740 msgid "When turned on, unquoted NULL in an array input value means a null value; otherwise it is taken literally." msgstr "Коли цей параметр ввімкнений, NULL без лапок при введенні до масиву сприймається як значення null; в іншому разі як рядок." -#: utils/misc/guc.c:1687 +#: utils/misc/guc.c:1756 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS більше не підтримується; це може бути помилковим." -#: utils/misc/guc.c:1697 +#: utils/misc/guc.c:1766 msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "Запускає підпроцес записування виводу stderr і/або csvlogs до файлів журналу." -#: utils/misc/guc.c:1706 +#: utils/misc/guc.c:1775 msgid "Truncate existing log files of same name during log rotation." msgstr "Скорочувати існуючі файли журналу з тим самим іменем під час обертання журналу." -#: utils/misc/guc.c:1717 +#: utils/misc/guc.c:1786 msgid "Emit information about resource usage in sorting." msgstr "Виводити інформацію про використання ресурсу при сортуванні." -#: utils/misc/guc.c:1731 +#: utils/misc/guc.c:1800 msgid "Generate debugging output for synchronized scanning." msgstr "Створює налагодженні повідомлення для синхронного сканування." -#: utils/misc/guc.c:1746 +#: utils/misc/guc.c:1815 msgid "Enable bounded sorting using heap sort." msgstr "Вмикає обмежене сортування використовуючи динамічне сортування." -#: utils/misc/guc.c:1759 +#: utils/misc/guc.c:1828 msgid "Emit WAL-related debugging output." msgstr "Виводити налагодженні повідомлення пов'язані з WAL." -#: utils/misc/guc.c:1771 -msgid "Datetimes are integer based." -msgstr "Дата й час на базі цілого числа." +#: utils/misc/guc.c:1840 +msgid "Shows whether datetimes are integer based." +msgstr "Показує, чи базуються дати на цілих числах." -#: utils/misc/guc.c:1782 +#: utils/misc/guc.c:1851 msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgstr "Встановлює обробку без урахування регістру імен користувачів Kerberos і GSSAPI." -#: utils/misc/guc.c:1792 +#: utils/misc/guc.c:1861 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Попередження про спецсимволи \"\\\" в звичайних рядках." -#: utils/misc/guc.c:1802 +#: utils/misc/guc.c:1871 msgid "Causes '...' strings to treat backslashes literally." msgstr "Вмикає буквальну обробку символів \"\\\" в рядках '...'." -#: utils/misc/guc.c:1813 +#: utils/misc/guc.c:1882 msgid "Enable synchronized sequential scans." msgstr "Вмикає синхронізацію послідовного сканування." -#: utils/misc/guc.c:1823 +#: utils/misc/guc.c:1892 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "Встановлює, включати чи виключати транзакції з метою відновлення." -#: utils/misc/guc.c:1833 +#: utils/misc/guc.c:1902 msgid "Allows connections and queries during recovery." msgstr "Дозволяє підключення і запити під час відновлення." -#: utils/misc/guc.c:1843 +#: utils/misc/guc.c:1912 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "Дозволяє зворотній зв'язок серверу hot standby з основним для уникнення конфліктів запитів." -#: utils/misc/guc.c:1853 +#: utils/misc/guc.c:1922 +msgid "Shows whether hot standby is currently active." +msgstr "Показує, чи hot standby наразі активний." + +#: utils/misc/guc.c:1933 msgid "Allows modifications of the structure of system tables." msgstr "Дозволяє модифікації структури системних таблиць." -#: utils/misc/guc.c:1864 +#: utils/misc/guc.c:1944 msgid "Disables reading from system indexes." msgstr "Вимикає читання з системних індексів." -#: utils/misc/guc.c:1865 +#: utils/misc/guc.c:1945 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "Це не забороняє оновлення індексів, тож дана поведінка безпечна. Найгірший наслідок це сповільнення." -#: utils/misc/guc.c:1876 +#: utils/misc/guc.c:1956 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "Вмикає режим зворотньої сумісності при перевірці прав для великих об'єктів." -#: utils/misc/guc.c:1877 +#: utils/misc/guc.c:1957 msgid "Skips privilege checks when reading or modifying large objects, for compatibility with PostgreSQL releases prior to 9.0." msgstr "Пропускає перевірки прав при читанні або зміненні великих об'єктів, для сумісності з версіями PostgreSQL до 9.0." -#: utils/misc/guc.c:1887 -msgid "Emit a warning for constructs that changed meaning since PostgreSQL 9.4." -msgstr "Видає попередження для конструкцій, значення яких змінилось після PostgreSQL 9.4." - -#: utils/misc/guc.c:1897 +#: utils/misc/guc.c:1967 msgid "When generating SQL fragments, quote all identifiers." msgstr "Генеруючи SQL-фрагменти, включати всі ідентифікатори в лапки." -#: utils/misc/guc.c:1907 +#: utils/misc/guc.c:1977 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Показує, чи ввімкнена контрольна сума даних для цього кластеру." -#: utils/misc/guc.c:1918 +#: utils/misc/guc.c:1988 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "Додає послідовне число до повідомлень syslog, щоб уникнути ігнорування дублікатів." -#: utils/misc/guc.c:1928 +#: utils/misc/guc.c:1998 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "Розділяє повідомлення, які передаються в syslog, рядками розміром не більше 1024 байт." -#: utils/misc/guc.c:1938 +#: utils/misc/guc.c:2008 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "Визначає, чи вузли зібрання і зібрання об'єднанням також виконають підплани." -#: utils/misc/guc.c:1939 -msgid "Should gather nodes also run subplans, or just gather tuples?" -msgstr "Чи повинні вузли зібрання також виконувати підплани, або тільки збирати кортежі?" +#: utils/misc/guc.c:2009 +msgid "Should gather nodes also run subplans or just gather tuples?" +msgstr "Чи повинні вузли збірки також виконувати підплани або тільки збирати кортежі?" -#: utils/misc/guc.c:1949 +#: utils/misc/guc.c:2019 msgid "Allow JIT compilation." msgstr "Дозволити JIT-компіляцію." -#: utils/misc/guc.c:1960 -msgid "Register JIT compiled function with debugger." -msgstr "Реєструвати JIT-скомпільовані функції в налагоджувачі." +#: utils/misc/guc.c:2030 +msgid "Register JIT-compiled functions with debugger." +msgstr "Зареєструйте функції JIT-compiled за допомогою налагоджувача." -#: utils/misc/guc.c:1977 +#: utils/misc/guc.c:2047 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "Виводити бітовий код LLVM для полегшення налагодження JIT." -#: utils/misc/guc.c:1988 +#: utils/misc/guc.c:2058 msgid "Allow JIT compilation of expressions." msgstr "Дозволити JIT-компіляцію виразів." -#: utils/misc/guc.c:1999 -msgid "Register JIT compiled function with perf profiler." -msgstr "Реєструвати JIT-скомпільовані функції в профілювальнику perf." +#: utils/misc/guc.c:2069 +msgid "Register JIT-compiled functions with perf profiler." +msgstr "Зареєструйте функції JIT-compiled за допомогою профілювальника perf." -#: utils/misc/guc.c:2016 +#: utils/misc/guc.c:2086 msgid "Allow JIT compilation of tuple deforming." msgstr "Дозволити JIT-компіляцію перетворення кортежів." -#: utils/misc/guc.c:2027 +#: utils/misc/guc.c:2097 msgid "Whether to continue running after a failure to sync data files." msgstr "Чи продовжувати виконання після помилки синхронізації файлів даних на диску." -#: utils/misc/guc.c:2036 +#: utils/misc/guc.c:2106 msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." msgstr "Встановлює чи повинен одержувач WAL створити тимчасовий слот реплікації, якщо постійний слот не налаштований." -#: utils/misc/guc.c:2054 +#: utils/misc/guc.c:2124 msgid "Forces a switch to the next WAL file if a new file has not been started within N seconds." msgstr "Примусово переключитися на наступний файл WAL, якщо новий файл не був розпочат за N секунд." -#: utils/misc/guc.c:2065 +#: utils/misc/guc.c:2135 msgid "Waits N seconds on connection startup after authentication." msgstr "Чекати N секунд при підключенні після автентифікації." -#: utils/misc/guc.c:2066 utils/misc/guc.c:2624 +#: utils/misc/guc.c:2136 utils/misc/guc.c:2734 msgid "This allows attaching a debugger to the process." msgstr "Це дозволяє підключити налагоджувач до процесу." -#: utils/misc/guc.c:2075 +#: utils/misc/guc.c:2145 msgid "Sets the default statistics target." msgstr "Встановлює мету статистики за замовчуванням." -#: utils/misc/guc.c:2076 +#: utils/misc/guc.c:2146 msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." msgstr "Це застосовується до стовпців таблиці, для котрих мета статистики не встановлена явно через ALTER TABLE SET STATISTICS." -#: utils/misc/guc.c:2085 +#: utils/misc/guc.c:2155 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "Встановлює розмір для списку FROM, при перевищені котрого вкладені запити не згортаються." -#: utils/misc/guc.c:2087 +#: utils/misc/guc.c:2157 msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." msgstr "Планувальник об'єднає вкладені запити з зовнішніми, якщо в отриманому списку FROM буде не більше заданої кількості елементів." -#: utils/misc/guc.c:2098 +#: utils/misc/guc.c:2168 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "Встановлює розмір для списку FROM, при перевищенні котрого конструкції JOIN не подаються у вигляді рядка." -#: utils/misc/guc.c:2100 +#: utils/misc/guc.c:2170 msgid "The planner will flatten explicit JOIN constructs into lists of FROM items whenever a list of no more than this many items would result." msgstr "Планувальник буде подавати у вигляді рядка явні конструкції JOIN в списки FROM, допоки в отриманому списку не більше заданої кількості елементів." -#: utils/misc/guc.c:2111 +#: utils/misc/guc.c:2181 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "Встановлює граничне значення для елементів FROM, при перевищенні котрого використовується GEQO." -#: utils/misc/guc.c:2121 +#: utils/misc/guc.c:2191 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: зусилля використовувались щоб встановити значення за замовчуванням для інших параметрів GEQO." -#: utils/misc/guc.c:2131 +#: utils/misc/guc.c:2201 msgid "GEQO: number of individuals in the population." msgstr "GEQO: кількість користувачів у популяції." -#: utils/misc/guc.c:2132 utils/misc/guc.c:2142 +#: utils/misc/guc.c:2202 utils/misc/guc.c:2212 msgid "Zero selects a suitable default value." msgstr "Нуль вибирає придатне значення за замовчуванням." -#: utils/misc/guc.c:2141 +#: utils/misc/guc.c:2211 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: кількість ітерацій в алгоритмі." -#: utils/misc/guc.c:2153 +#: utils/misc/guc.c:2223 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Встановлює час очікування в блокуванні до перевірки на взаємне блокування." -#: utils/misc/guc.c:2164 +#: utils/misc/guc.c:2234 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "Встановлює максимальну затримку до скасування запитів, коли hot standby сервер обробляє архівні дані WAL." -#: utils/misc/guc.c:2175 +#: utils/misc/guc.c:2245 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "Встановлює максимальну затримку до скасування запитів, коли hot standby сервер обробляє дані WAL з потоку." -#: utils/misc/guc.c:2186 +#: utils/misc/guc.c:2256 msgid "Sets the minimum delay for applying changes during recovery." msgstr "Встановлює мінімальну затримку для застосування змін під час відновлення." -#: utils/misc/guc.c:2197 +#: utils/misc/guc.c:2267 msgid "Sets the maximum interval between WAL receiver status reports to the sending server." msgstr "Встановлює максимальний інтервал між звітами про стан одержувачів WAL для серверу надсилання." -#: utils/misc/guc.c:2208 +#: utils/misc/guc.c:2278 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "Встановлює максимальний час очікування для отримання даних з серверу надсилання." -#: utils/misc/guc.c:2219 +#: utils/misc/guc.c:2289 msgid "Sets the maximum number of concurrent connections." msgstr "Встановлює максимальну кілкість паралельних підключень." -#: utils/misc/guc.c:2230 +#: utils/misc/guc.c:2300 msgid "Sets the number of connection slots reserved for superusers." msgstr "Встановлює кількість зарезервованих слотів підключень для суперкористувачів." -#: utils/misc/guc.c:2244 +#: utils/misc/guc.c:2310 +msgid "Amount of dynamic shared memory reserved at startup." +msgstr "Кількість динамічної спільної пам'яті, зарезервованої під час запуску." + +#: utils/misc/guc.c:2325 msgid "Sets the number of shared memory buffers used by the server." msgstr "Встановлює кількість буферів спільної пам'яті, використовуваних сервером." -#: utils/misc/guc.c:2255 +#: utils/misc/guc.c:2336 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Встановлює максимальну кількість використовуваних тимчасових буферів, для кожного сеансу." -#: utils/misc/guc.c:2266 +#: utils/misc/guc.c:2347 msgid "Sets the TCP port the server listens on." msgstr "Встановлює TCP-порт для роботи серверу." -#: utils/misc/guc.c:2276 +#: utils/misc/guc.c:2357 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Встановлює дозволи на доступ для Unix-сокету." -#: utils/misc/guc.c:2277 +#: utils/misc/guc.c:2358 msgid "Unix-domain sockets use the usual Unix file system permission set. The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Для Unix-сокетів використовується звичний набір дозволів, як у файлових системах Unix. Очікується, що значення параметра вказується у формі, яка прийнята для системних викликів chmod і umask. (Щоб використати звичний вісімковий формат, додайте в початок 0 (нуль).)" -#: utils/misc/guc.c:2291 +#: utils/misc/guc.c:2372 msgid "Sets the file permissions for log files." msgstr "Встановлює права дозволу для файлів журналу." -#: utils/misc/guc.c:2292 +#: utils/misc/guc.c:2373 msgid "The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Очікується, що значення параметру буде вказано в числовому форматі, який сприймається системними викликами chmod і umask. (Щоб використати звичний вісімковий формат, додайте в початок 0 (нуль).)" -#: utils/misc/guc.c:2306 -msgid "Mode of the data directory." -msgstr "Режим каталогу даних." +#: utils/misc/guc.c:2387 +msgid "Shows the mode of the data directory." +msgstr "Показує режим каталогу даних." -#: utils/misc/guc.c:2307 +#: utils/misc/guc.c:2388 msgid "The parameter value is a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Значення параметру вказується в числовому форматі, який сприймається системними викликами chmod і umask. (Щоб використати звичний вісімковий формат, додайте в початок 0 (нуль).)" -#: utils/misc/guc.c:2320 +#: utils/misc/guc.c:2401 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Встановлює максимальний об'єм пам'яті для робочих просторів запитів." -#: utils/misc/guc.c:2321 +#: utils/misc/guc.c:2402 msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." msgstr "Такий об'єм пам'яті може використовуватись кожною внутрішньою операцією сортування і таблицею гешування до переключення на тимчасові файли на диску." -#: utils/misc/guc.c:2333 +#: utils/misc/guc.c:2414 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Встановлює максимальний об'єм пам'яті для операцій по обслуговуванню." -#: utils/misc/guc.c:2334 +#: utils/misc/guc.c:2415 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Це включає такі операції як VACUUM і CREATE INDEX." -#: utils/misc/guc.c:2344 +#: utils/misc/guc.c:2425 msgid "Sets the maximum memory to be used for logical decoding." msgstr "Встановлює максимальний об'єм пам'яті для логічного декодування." -#: utils/misc/guc.c:2345 +#: utils/misc/guc.c:2426 msgid "This much memory can be used by each internal reorder buffer before spilling to disk." msgstr "Ця велика кількість пам'яті може бути використана кожним внутрішнім перевпорядковуючим буфером перед записом на диск." -#: utils/misc/guc.c:2361 +#: utils/misc/guc.c:2442 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Встановлює максимальну глибину стека, в КБ." -#: utils/misc/guc.c:2372 +#: utils/misc/guc.c:2453 msgid "Limits the total size of all temporary files used by each process." msgstr "Обмежує загальний розмір всіх тимчасових файлів, які використовуються кожним процесом." -#: utils/misc/guc.c:2373 +#: utils/misc/guc.c:2454 msgid "-1 means no limit." msgstr "-1 вимикає обмеження." -#: utils/misc/guc.c:2383 +#: utils/misc/guc.c:2464 msgid "Vacuum cost for a page found in the buffer cache." msgstr "Вартість очистки для сторінки, яка була знайдена в буферному кеші." -#: utils/misc/guc.c:2393 +#: utils/misc/guc.c:2474 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "Вартість очистки для сторінки, яка не була знайдена в буферному кеші." -#: utils/misc/guc.c:2403 +#: utils/misc/guc.c:2484 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Вартість очистки для сторінки, яка не була \"брудною\"." -#: utils/misc/guc.c:2413 +#: utils/misc/guc.c:2494 msgid "Vacuum cost amount available before napping." msgstr "Кількість доступних витрат вакууму перед від'єднанням." -#: utils/misc/guc.c:2423 +#: utils/misc/guc.c:2504 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Кількість доступних витрат вакууму перед від'єднанням, для автовакууму." -#: utils/misc/guc.c:2433 +#: utils/misc/guc.c:2514 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "Встановлює максимальну кількість одночасно відкритих файлів для кожного процесу." -#: utils/misc/guc.c:2446 +#: utils/misc/guc.c:2527 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Встановлює максимальну кількість одночасно підготовлених транзакцій." -#: utils/misc/guc.c:2457 +#: utils/misc/guc.c:2538 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Встановлює мінімальний OID таблиць, для яких відстежуються блокування." -#: utils/misc/guc.c:2458 +#: utils/misc/guc.c:2539 msgid "Is used to avoid output on system tables." msgstr "Використовується для уникнення системних таблиць." -#: utils/misc/guc.c:2467 +#: utils/misc/guc.c:2548 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Встановлює OID таблиці для безумовного трасування блокувань." -#: utils/misc/guc.c:2479 +#: utils/misc/guc.c:2560 msgid "Sets the maximum allowed duration of any statement." msgstr "Встановлює максимальну тривалість для будь-якого оператору." -#: utils/misc/guc.c:2480 utils/misc/guc.c:2491 utils/misc/guc.c:2502 +#: utils/misc/guc.c:2561 utils/misc/guc.c:2572 utils/misc/guc.c:2583 +#: utils/misc/guc.c:2594 msgid "A value of 0 turns off the timeout." msgstr "Значення 0 (нуль) вимикає тайм-аут." -#: utils/misc/guc.c:2490 +#: utils/misc/guc.c:2571 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Встановлює максимально дозволену тривалість очікування блокувань." -#: utils/misc/guc.c:2501 -msgid "Sets the maximum allowed duration of any idling transaction." -msgstr "Встановлює максимально дозволену тривалість для транзакцій, які простоюють." +#: utils/misc/guc.c:2582 +msgid "Sets the maximum allowed idle time between queries, when in a transaction." +msgstr "Встановлює максимально дозволений час очікування між запитами під час транзакції." -#: utils/misc/guc.c:2512 +#: utils/misc/guc.c:2593 +msgid "Sets the maximum allowed idle time between queries, when not in a transaction." +msgstr "Встановлює максимально дозволений час очікування між запитами поза транзакцією." + +#: utils/misc/guc.c:2604 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "Мінімальний вік рядків таблиці, при котрому VACUUM зможе їх закріпити." -#: utils/misc/guc.c:2522 +#: utils/misc/guc.c:2614 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "Вік, при котрому VACUUM повинен сканувати всю таблицю, щоб закріпити кортежі." -#: utils/misc/guc.c:2532 +#: utils/misc/guc.c:2624 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "Мінімальний вік, при котрому VACUUM повинен закріпити MultiXactId в рядку таблиці." -#: utils/misc/guc.c:2542 +#: utils/misc/guc.c:2634 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "Вік Multixact, при котрому VACUUM повинен сканувати всю таблицю, щоб закріпити кортежі." -#: utils/misc/guc.c:2552 +#: utils/misc/guc.c:2644 msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." msgstr "Визначає, кількість транзакцій які потрібно буде відкласти, виконуючи VACUUM і HOT очищення." -#: utils/misc/guc.c:2565 +#: utils/misc/guc.c:2653 +msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "Вік, у якому VACUUM повинен спрацювати безпечно, щоб уникнути зациклення." + +#: utils/misc/guc.c:2662 +msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "Вік Multixact, у якому VACUUM повинен спрацювати безпечно, щоб уникнути зациклення." + +#: utils/misc/guc.c:2675 msgid "Sets the maximum number of locks per transaction." msgstr "Встановлює максимальну кілкість блокувань на транзакцію." -#: utils/misc/guc.c:2566 +#: utils/misc/guc.c:2676 msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." msgstr "Розмір спільної таблиці блокувань вибирається з припущення, що в один момент часу буде потрібно заблокувати не більше ніж max_locks_per_transaction * max_connections різних об'єктів." -#: utils/misc/guc.c:2577 +#: utils/misc/guc.c:2687 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Встановлює максимальну кількість предикатних блокувань на транзакцію." -#: utils/misc/guc.c:2578 +#: utils/misc/guc.c:2688 msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." msgstr "Розмір спільної таблиці предикатних блокувань вибирається з припущення, що в один момент часу буде потрібно заблокувати не більше ніж max_locks_per_transaction * max_connections різних об'єктів." -#: utils/misc/guc.c:2589 +#: utils/misc/guc.c:2699 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "Встановлює максимальну кількість сторінок і кортежів, блокованих предикатними блокуваннями в одному відношенні." -#: utils/misc/guc.c:2590 +#: utils/misc/guc.c:2700 msgid "If more than this total of pages and tuples in the same relation are locked by a connection, those locks are replaced by a relation-level lock." msgstr "Якщо одним підключенням блокується більше цієї загальної кількості сторінок і кортежів, ці блокування замінюються блокуванням на рівні відношення." -#: utils/misc/guc.c:2600 +#: utils/misc/guc.c:2710 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "Встановлює максимальну кількість кортежів, блокованих предикатними блокуваннями в одній сторінці." -#: utils/misc/guc.c:2601 +#: utils/misc/guc.c:2711 msgid "If more than this number of tuples on the same page are locked by a connection, those locks are replaced by a page-level lock." msgstr "Якщо одним підключенням блокується більше цієї кількості кортежів на одній і тій же сторінці, ці блокування замінюються блокуванням на рівні сторінки." -#: utils/misc/guc.c:2611 +#: utils/misc/guc.c:2721 msgid "Sets the maximum allowed time to complete client authentication." msgstr "Встановлює максимально допустимий час, за котрий клієнт повинен завершити автентифікацію." -#: utils/misc/guc.c:2623 +#: utils/misc/guc.c:2733 msgid "Waits N seconds on connection startup before authentication." msgstr "Чекати N секунд при підключенні до автентифікації." -#: utils/misc/guc.c:2634 +#: utils/misc/guc.c:2744 msgid "Sets the size of WAL files held for standby servers." msgstr "Встановлює розмір WAL файлів, які потрібно зберігати для резервних серверів." -#: utils/misc/guc.c:2645 +#: utils/misc/guc.c:2755 msgid "Sets the minimum size to shrink the WAL to." msgstr "Встановлює мінімальний розмір WAL при стисканні." -#: utils/misc/guc.c:2657 +#: utils/misc/guc.c:2767 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Встановлює розмір WAL, при котрому ініціюється контрольна точка." -#: utils/misc/guc.c:2669 +#: utils/misc/guc.c:2779 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "Встановлює максимальний час між автоматичними контрольними точками WAL." -#: utils/misc/guc.c:2680 +#: utils/misc/guc.c:2790 msgid "Enables warnings if checkpoint segments are filled more frequently than this." msgstr "Видає попередження, якщо сегменти контрольних точок заповнуються частіше." -#: utils/misc/guc.c:2682 +#: utils/misc/guc.c:2792 msgid "Write a message to the server log if checkpoints caused by the filling of checkpoint segment files happens more frequently than this number of seconds. Zero turns off the warning." msgstr "Записує в запис серверу повідомлення, якщо контрольні точки, викликані переповненням файлів сегментів контрольних точок, з'являються частіше. 0 (нуль) вимикає попередження." -#: utils/misc/guc.c:2694 utils/misc/guc.c:2910 utils/misc/guc.c:2957 +#: utils/misc/guc.c:2804 utils/misc/guc.c:3020 utils/misc/guc.c:3067 msgid "Number of pages after which previously performed writes are flushed to disk." msgstr "Число сторінок, після досягнення якого раніше виконані операції запису скидаються на диск." -#: utils/misc/guc.c:2705 +#: utils/misc/guc.c:2815 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "Встановлює кількість буферів дискових сторінок в спільній пам'яті для WAL." -#: utils/misc/guc.c:2716 +#: utils/misc/guc.c:2826 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Час між скиданням WAL в процесі, записуючого WAL." -#: utils/misc/guc.c:2727 +#: utils/misc/guc.c:2837 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "Обсяг WAL, оброблений пишучим WAL процесом, при котрому ініціюється скидання журналу на диск." -#: utils/misc/guc.c:2738 -msgid "Size of new file to fsync instead of writing WAL." -msgstr "Розмір нового файлу для fsync замість записування WAL." +#: utils/misc/guc.c:2848 +msgid "Minimum size of new file to fsync instead of writing WAL." +msgstr "Мінімальний розмір нового файлу для fsync замість записування WAL." -#: utils/misc/guc.c:2749 +#: utils/misc/guc.c:2859 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "Встановлює максимальну кількість одночасно працюючих процесів передачі WAL." -#: utils/misc/guc.c:2760 +#: utils/misc/guc.c:2870 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Встановлює максимальну кількість одночасно визначених слотів реплікації." -#: utils/misc/guc.c:2770 +#: utils/misc/guc.c:2880 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "Встановлює максимальний розмір WAL, який може бути зарезервований слотами реплікації." -#: utils/misc/guc.c:2771 +#: utils/misc/guc.c:2881 msgid "Replication slots will be marked as failed, and segments released for deletion or recycling, if this much space is occupied by WAL on disk." msgstr "Слоти реплікації будуть позначені як невдалі, і розблоковані сегменти для видалення або переробки, якщо цю кількість місця на диску займає WAL." -#: utils/misc/guc.c:2783 +#: utils/misc/guc.c:2893 msgid "Sets the maximum time to wait for WAL replication." msgstr "Встановлює максимальний час очікування реплікації WAL." -#: utils/misc/guc.c:2794 +#: utils/misc/guc.c:2904 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "Встановлює затримку в мілісекундах між затвердженням транзакцій і скиданням WAL на диск." -#: utils/misc/guc.c:2806 +#: utils/misc/guc.c:2916 msgid "Sets the minimum concurrent open transactions before performing commit_delay." msgstr "Встановлює мінімальну кількість одночасно відкритих транзакцій до виконання commit_delay." -#: utils/misc/guc.c:2817 +#: utils/misc/guc.c:2927 msgid "Sets the number of digits displayed for floating-point values." msgstr "Встановлює кількість виведених чисел для значень з плаваючою точкою." -#: utils/misc/guc.c:2818 +#: utils/misc/guc.c:2928 msgid "This affects real, double precision, and geometric data types. A zero or negative parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate). Any value greater than zero selects precise output mode." msgstr "Це впливає на типи реальних, подвійної точності та геометричних даних. Нульове або від'ємне значення параметру додається до стандартної кількості цифр (FLT_DIG або DBL_DIG у відповідних випадках). Будь-яке значення більше нуля, обирає точний режим виводу." -#: utils/misc/guc.c:2830 +#: utils/misc/guc.c:2940 msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." msgstr "Встановлює мінімальний час виконання, понад якого вибірка тверджень буде записуватись. Вибірка визначається log_statement_sample_rate." -#: utils/misc/guc.c:2833 +#: utils/misc/guc.c:2943 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "При 0 (нуль) фіксує зразок всіх запитів. -1 вимикає цю функцію." -#: utils/misc/guc.c:2843 +#: utils/misc/guc.c:2953 msgid "Sets the minimum execution time above which all statements will be logged." msgstr "Встановлює мінімальний час виконання, понад якого всі твердження будуть записуватись." -#: utils/misc/guc.c:2845 +#: utils/misc/guc.c:2955 msgid "Zero prints all queries. -1 turns this feature off." msgstr "При 0 (нуль) протоколюються всі запити. -1 вимикає цю функцію." -#: utils/misc/guc.c:2855 +#: utils/misc/guc.c:2965 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "Встановлює мінімальний час виконання автоочистки, при перевищенні котрого ця дія фіксується в протоколі." -#: utils/misc/guc.c:2857 +#: utils/misc/guc.c:2967 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "При 0 (нуль) протоколюються всі дії автоочистки. -1 вимикає журналювання автоочистки." -#: utils/misc/guc.c:2867 +#: utils/misc/guc.c:2977 msgid "When logging statements, limit logged parameter values to first N bytes." msgstr "Під час журналювання тверджень, обмежте записуваних параметрів до перших N байт." -#: utils/misc/guc.c:2868 utils/misc/guc.c:2879 +#: utils/misc/guc.c:2978 utils/misc/guc.c:2989 msgid "-1 to print values in full." msgstr "-1 для друку значень в повному вигляді." -#: utils/misc/guc.c:2878 +#: utils/misc/guc.c:2988 msgid "When reporting an error, limit logged parameter values to first N bytes." msgstr "Під час звітування про помилку, обмежте значення записуваних параметрів до перших N байт." -#: utils/misc/guc.c:2889 +#: utils/misc/guc.c:2999 msgid "Background writer sleep time between rounds." msgstr "Час призупинення в процесі фонового запису між підходами." -#: utils/misc/guc.c:2900 +#: utils/misc/guc.c:3010 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "Максимальна кількість LRU-сторінок, які скидаються за один підхід, в процесі фонового запису." -#: utils/misc/guc.c:2923 +#: utils/misc/guc.c:3033 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "Кількість одночасних запитів, які можуть бути ефективно оброблені дисковою підсистемою." -#: utils/misc/guc.c:2924 -msgid "For RAID arrays, this should be approximately the number of drive spindles in the array." -msgstr "Для RAID-масивів це повинно приблизно дорівнювати кількості фізичних дисків у масиві." - -#: utils/misc/guc.c:2941 +#: utils/misc/guc.c:3051 msgid "A variant of effective_io_concurrency that is used for maintenance work." msgstr "Варіант effective_io_concurrency, що використовується для роботи з обслуговування." -#: utils/misc/guc.c:2970 +#: utils/misc/guc.c:3080 msgid "Maximum number of concurrent worker processes." msgstr "Максимальна кількість одночасно працюючих процесів." -#: utils/misc/guc.c:2982 +#: utils/misc/guc.c:3092 msgid "Maximum number of logical replication worker processes." msgstr "Максимальна кількість працюючих процесів логічної реплікації." -#: utils/misc/guc.c:2994 +#: utils/misc/guc.c:3104 msgid "Maximum number of table synchronization workers per subscription." msgstr "Максимальна кількість процесів синхронізації таблиць для однієї підписки." -#: utils/misc/guc.c:3004 +#: utils/misc/guc.c:3114 msgid "Automatic log file rotation will occur after N minutes." -msgstr "Автоматичне обертання файлу протоколу буде здійснюватись через кожні N хвилин." +msgstr "Автоматичне обертання файлу журналу буде здійснюватись через кожні N хвилин." -#: utils/misc/guc.c:3015 +#: utils/misc/guc.c:3125 msgid "Automatic log file rotation will occur after N kilobytes." -msgstr "Автоматичне обертання файлу протоколу буде здійснюватись після кожних N кілобайт." +msgstr "Автоматичне обертання файлу журналу буде здійснюватись після кожних N кілобайт." -#: utils/misc/guc.c:3026 +#: utils/misc/guc.c:3136 msgid "Shows the maximum number of function arguments." msgstr "Показує максимальну кількість аргументів функції." -#: utils/misc/guc.c:3037 +#: utils/misc/guc.c:3147 msgid "Shows the maximum number of index keys." msgstr "Показує максимальну кількість ключів в індексі." -#: utils/misc/guc.c:3048 +#: utils/misc/guc.c:3158 msgid "Shows the maximum identifier length." msgstr "Показує максимальну довжину ідентифікатора." -#: utils/misc/guc.c:3059 +#: utils/misc/guc.c:3169 msgid "Shows the size of a disk block." msgstr "Показує розмір дискового блоку." -#: utils/misc/guc.c:3070 +#: utils/misc/guc.c:3180 msgid "Shows the number of pages per disk file." msgstr "Показує кількість сторінок в одному дисковому файлі." -#: utils/misc/guc.c:3081 +#: utils/misc/guc.c:3191 msgid "Shows the block size in the write ahead log." msgstr "Показує розмір блоку в журналі WAL." -#: utils/misc/guc.c:3092 +#: utils/misc/guc.c:3202 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "Встановлює час очікування перед повторною спробою звертання до WAL після невдачі." -#: utils/misc/guc.c:3104 +#: utils/misc/guc.c:3214 msgid "Shows the size of write ahead log segments." msgstr "Показує розмір сегментів WAL." -#: utils/misc/guc.c:3117 +#: utils/misc/guc.c:3227 msgid "Time to sleep between autovacuum runs." msgstr "Час призупинення між запусками автоочистки." -#: utils/misc/guc.c:3127 +#: utils/misc/guc.c:3237 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Мінімальна кількість оновлень або видалень кортежів перед очисткою." -#: utils/misc/guc.c:3136 +#: utils/misc/guc.c:3246 msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." msgstr "Мінімальна кількість вставлених кортежів перед очищенням, або -1 щоб вимкнути очищення після вставки." -#: utils/misc/guc.c:3145 +#: utils/misc/guc.c:3255 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "Мінімальна кількість вставлень, оновлень або видалень кортежів перед аналізом." -#: utils/misc/guc.c:3155 +#: utils/misc/guc.c:3265 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "Вік, при котрому необхідна автоочистка таблиці для запобігання зациклення ID транзакцій." -#: utils/misc/guc.c:3166 +#: utils/misc/guc.c:3280 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "Вік Multixact, при котрому необхідна автоочистка таблиці для запобігання зациклення multixact." -#: utils/misc/guc.c:3176 +#: utils/misc/guc.c:3290 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "Встановлює максимальну кількість одночасно працюючих робочих процесів автоочистки." -#: utils/misc/guc.c:3186 +#: utils/misc/guc.c:3300 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "Встановлює максимальну кількість паралельних процесів на одну операцію обслуговування." -#: utils/misc/guc.c:3196 +#: utils/misc/guc.c:3310 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Встановлює максимальну кількість паралельних процесів на вузол виконавця." -#: utils/misc/guc.c:3207 +#: utils/misc/guc.c:3321 msgid "Sets the maximum number of parallel workers that can be active at one time." msgstr "Встановлює максимальну кількість паралельних процесів, які можуть бути активні в один момент." -#: utils/misc/guc.c:3218 +#: utils/misc/guc.c:3332 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "Встановлює максимальний об'єм пам'яті для кожного робочого процесу автоочистки." -#: utils/misc/guc.c:3229 +#: utils/misc/guc.c:3343 msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." msgstr "Термін, після закінчення котрого знімок вважається занадто старим для отримання сторінок, змінених після створення знімку." -#: utils/misc/guc.c:3230 +#: utils/misc/guc.c:3344 msgid "A value of -1 disables this feature." msgstr "Значення -1 вимикає цю функцію." -#: utils/misc/guc.c:3240 +#: utils/misc/guc.c:3354 msgid "Time between issuing TCP keepalives." msgstr "Час між видачею TCP keepalives." -#: utils/misc/guc.c:3241 utils/misc/guc.c:3252 utils/misc/guc.c:3376 +#: utils/misc/guc.c:3355 utils/misc/guc.c:3366 utils/misc/guc.c:3490 msgid "A value of 0 uses the system default." msgstr "Значення 0 (нуль) використовує систему за замовчуванням." -#: utils/misc/guc.c:3251 +#: utils/misc/guc.c:3365 msgid "Time between TCP keepalive retransmits." msgstr "Час між повтореннями TCP keepalive." -#: utils/misc/guc.c:3262 +#: utils/misc/guc.c:3376 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "Повторне узгодження SSL більше не підтримується; єдине допустиме значення - 0 (нуль)." -#: utils/misc/guc.c:3273 +#: utils/misc/guc.c:3387 msgid "Maximum number of TCP keepalive retransmits." msgstr "Максимальна кількість повторень TCP keepalive." -#: utils/misc/guc.c:3274 +#: utils/misc/guc.c:3388 msgid "This controls the number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." msgstr "Цей параметр визначає, яка кількість послідовних повторень keepalive може бути втрачена, перед тим як підключення буде вважатись \"мертвим\". Значення 0 (нуль) використовує систему за замовчуванням." -#: utils/misc/guc.c:3285 +#: utils/misc/guc.c:3399 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "Встановлює максимально допустимий результат для точного пошуку з використанням GIN." -#: utils/misc/guc.c:3296 +#: utils/misc/guc.c:3410 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "Встановлює планувальнику припустимий загальний розмір кешей даних." -#: utils/misc/guc.c:3297 +#: utils/misc/guc.c:3411 msgid "That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." msgstr "Мається на увазі загальний розмір кешей (кеша ядра і спільних буферів), які використовуються для файлів даних PostgreSQL. Розмір задається в дискових сторінках, звичайно це 8 КБ." -#: utils/misc/guc.c:3308 +#: utils/misc/guc.c:3422 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "Встановлює мінімальний обсяг даних в таблиці для паралельного сканування." -#: utils/misc/guc.c:3309 +#: utils/misc/guc.c:3423 msgid "If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered." msgstr "Якщо планувальник вважає, що він прочитає меньше сторінок таблиці, ніж задано цим обмеженням, паралельне сканування не буде розглядатись." -#: utils/misc/guc.c:3319 +#: utils/misc/guc.c:3433 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "Встановлює мінімальний обсяг даних в індексі для паралельного сканування." -#: utils/misc/guc.c:3320 +#: utils/misc/guc.c:3434 msgid "If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered." msgstr "Якщо планувальник вважає, що він прочитає меньше сторінок індексу, ніж задано цим обмеженням, паралельне сканування не буде розглядатись." -#: utils/misc/guc.c:3331 +#: utils/misc/guc.c:3445 msgid "Shows the server version as an integer." msgstr "Показує версію сервера у вигляді цілого числа." -#: utils/misc/guc.c:3342 +#: utils/misc/guc.c:3456 msgid "Log the use of temporary files larger than this number of kilobytes." -msgstr "Записує до протоколу перевищення тимчасовими файлами заданого розміру в КБ." +msgstr "Записує до журналу перевищення тимчасовими файлами заданого розміру в КБ." -#: utils/misc/guc.c:3343 +#: utils/misc/guc.c:3457 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "0 (нуль) фіксує всі файли. -1 вимикає цю функцію (за замовчуванням)." -#: utils/misc/guc.c:3353 +#: utils/misc/guc.c:3467 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Встановлює розмір, зарезервований для pg_stat_activity.query, в байтах." -#: utils/misc/guc.c:3364 +#: utils/misc/guc.c:3478 msgid "Sets the maximum size of the pending list for GIN index." msgstr "Встановлює максимальний розмір списку-очікування для GIN-індексу." -#: utils/misc/guc.c:3375 +#: utils/misc/guc.c:3489 msgid "TCP user timeout." msgstr "Таймаут користувача TCP." -#: utils/misc/guc.c:3395 +#: utils/misc/guc.c:3500 +msgid "The size of huge page that should be requested." +msgstr "Розмір величезної сторінки, яку необхідно затребувати." + +#: utils/misc/guc.c:3511 +msgid "Aggressively flush system caches for debugging purposes." +msgstr "Агресивно скидати системні кеші для цілей налагодження." + +#: utils/misc/guc.c:3534 +msgid "Sets the time interval between checks for disconnection while running queries." +msgstr "Встановлює інтервал часу між перевірками відключення під час виконання запитів." + +#: utils/misc/guc.c:3554 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "Встановлює для планувальника орієнтир вартості послідовного читання дискових сторінок." -#: utils/misc/guc.c:3406 +#: utils/misc/guc.c:3565 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "Встановлює для планувальника орієнтир вартості непослідовного читання дискових сторінок." -#: utils/misc/guc.c:3417 +#: utils/misc/guc.c:3576 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "Встановлює для планувальника орієнтир вартості обробки кожного кортежу (рядка)." -#: utils/misc/guc.c:3428 +#: utils/misc/guc.c:3587 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." msgstr "Встановлює для планувальника орієнтир вартості обробки кожного елементу індекса під час сканування індексу." -#: utils/misc/guc.c:3439 +#: utils/misc/guc.c:3598 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "Встановлює для планувальника орієнтир вартості обробки кожного оператора або виклику функції." -#: utils/misc/guc.c:3450 -msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to master backend." -msgstr "Встановлює для планувальника орієнтир вартості передавання кожного кортежу (рядка) від робочого процесу обслуговуючому процесу." +#: utils/misc/guc.c:3609 +msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." +msgstr "Встановлює для планувальника приблизну вартість передавання кожного кортежу (рядка) від робочого процесу вихідному процесу." -#: utils/misc/guc.c:3461 +#: utils/misc/guc.c:3620 msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." msgstr "Встановлює для планувальника орієнтир вартості запуску робочих процесів для паралельного запиту." -#: utils/misc/guc.c:3473 +#: utils/misc/guc.c:3632 msgid "Perform JIT compilation if query is more expensive." msgstr "Якщо запит дорожчий, виконується JIT-компіляція." -#: utils/misc/guc.c:3474 +#: utils/misc/guc.c:3633 msgid "-1 disables JIT compilation." msgstr "-1 вимикає JIT-компіляцію." -#: utils/misc/guc.c:3484 -msgid "Optimize JITed functions if query is more expensive." -msgstr "Якщо запит дорожчий, оптимізуютьсяв JITed-функції." +#: utils/misc/guc.c:3643 +msgid "Optimize JIT-compiled functions if query is more expensive." +msgstr "Оптимізувати функції JIT-compiled, якщо запит дорожчий." -#: utils/misc/guc.c:3485 +#: utils/misc/guc.c:3644 msgid "-1 disables optimization." msgstr "-1 вимикає оптимізацію." -#: utils/misc/guc.c:3495 +#: utils/misc/guc.c:3654 msgid "Perform JIT inlining if query is more expensive." msgstr "Якщо запит дорожчий, виконується вбудовування JIT." -#: utils/misc/guc.c:3496 +#: utils/misc/guc.c:3655 msgid "-1 disables inlining." msgstr "-1 вимикає вбудовування." -#: utils/misc/guc.c:3506 +#: utils/misc/guc.c:3665 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgstr "Встановлює для планувальника орієнтир частки необхідних рядків курсора в загальній кількості." -#: utils/misc/guc.c:3518 +#: utils/misc/guc.c:3677 msgid "GEQO: selective pressure within the population." msgstr "GEQO: вибірковий тиск в популяції." -#: utils/misc/guc.c:3529 +#: utils/misc/guc.c:3688 msgid "GEQO: seed for random path selection." msgstr "GEQO: відправна значення для випадкового вибору шляху." -#: utils/misc/guc.c:3540 +#: utils/misc/guc.c:3699 msgid "Multiple of work_mem to use for hash tables." msgstr "Декілька work_mem для використання геш-таблиць." -#: utils/misc/guc.c:3551 +#: utils/misc/guc.c:3710 msgid "Multiple of the average buffer usage to free per round." msgstr "Множник для середньої кількості використаних буферів, який визначає кількість буферів, які звільняються за один підхід." -#: utils/misc/guc.c:3561 +#: utils/misc/guc.c:3720 msgid "Sets the seed for random-number generation." msgstr "Встановлює відправне значення для генератора випадкових чисел." -#: utils/misc/guc.c:3572 +#: utils/misc/guc.c:3731 msgid "Vacuum cost delay in milliseconds." msgstr "Затримка вартості очистки в мілісекундах." -#: utils/misc/guc.c:3583 +#: utils/misc/guc.c:3742 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Затримка вартості очистки в мілісекундах, для автоочистки." -#: utils/misc/guc.c:3594 +#: utils/misc/guc.c:3753 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "Кількість оновлень або видалень кортежів до reltuples, яка визначає потребу в очистці." -#: utils/misc/guc.c:3604 +#: utils/misc/guc.c:3763 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "Кількість вставлень кортежів до reltuples, яка визначає потребу в очистці." -#: utils/misc/guc.c:3614 +#: utils/misc/guc.c:3773 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "Кількість вставлень, оновлень або видалень кортежів до reltuples, яка визначає потребу в аналізі." -#: utils/misc/guc.c:3624 +#: utils/misc/guc.c:3783 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." msgstr "Час тривалості очищення \"брудних\" буферів під час контрольної точки до інтервалу контрольних точок." -#: utils/misc/guc.c:3634 -msgid "Number of tuple inserts prior to index cleanup as a fraction of reltuples." -msgstr "Кількість вставлень кортежів до reltuples, яка визначає потребу в очистці індекса." - -#: utils/misc/guc.c:3644 +#: utils/misc/guc.c:3793 msgid "Fraction of statements exceeding log_min_duration_sample to be logged." msgstr "Частка тверджень, перевищує log_min_duration_sample, що підлягає запису." -#: utils/misc/guc.c:3645 +#: utils/misc/guc.c:3794 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "Використайте значення між 0.0 (ніколи не записувати) і 1.0 (завжди записувати)." -#: utils/misc/guc.c:3654 -msgid "Set the fraction of transactions to log for new transactions." -msgstr "Встановіть частину транзакцій для запису нових транзакцій." +#: utils/misc/guc.c:3803 +msgid "Sets the fraction of transactions from which to log all statements." +msgstr "Встановлює частину транзакцій, від яких необхідно журналювати всі команди." -#: utils/misc/guc.c:3655 -msgid "Logs all statements from a fraction of transactions. Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." -msgstr "Журналює всі вирази з частини транзакцій. Використайте значення між 0.0 (ніколи не записувати) і 1.0 (записувати всі вирази для всіх транзакцій)." +#: utils/misc/guc.c:3804 +msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." +msgstr "Використайте значення між 0.0 (ніколи не записувати) і 1.0 (записувати всі команди для всіх транзакцій)." -#: utils/misc/guc.c:3675 +#: utils/misc/guc.c:3823 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "Встановлює команду оболонки, яка буде викликатись для архівації файлу WAL." -#: utils/misc/guc.c:3685 +#: utils/misc/guc.c:3833 msgid "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "Встановлює команду оболонки, яка буде викликана для отримання архівованого файлу WAL." -#: utils/misc/guc.c:3695 +#: utils/misc/guc.c:3843 msgid "Sets the shell command that will be executed at every restart point." msgstr "Встановлює команду оболонки, яка буде виконуватися в кожній точці перезапуску." -#: utils/misc/guc.c:3705 +#: utils/misc/guc.c:3853 msgid "Sets the shell command that will be executed once at the end of recovery." msgstr "Встановлює команду оболонки, яка буде виконуватися один раз в кінці відновлення." -#: utils/misc/guc.c:3715 +#: utils/misc/guc.c:3863 msgid "Specifies the timeline to recover into." msgstr "Вказує лінію часу для відновлення." -#: utils/misc/guc.c:3725 +#: utils/misc/guc.c:3873 msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." msgstr "Встановіть на \"негайно\" щоб закінчити відновлення як тільки буде досягнуто узгодженого стану." -#: utils/misc/guc.c:3734 +#: utils/misc/guc.c:3882 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "Встановлює ідентифікатор транзакції, до якої буде продовжуватися відновлення." -#: utils/misc/guc.c:3743 +#: utils/misc/guc.c:3891 msgid "Sets the time stamp up to which recovery will proceed." msgstr "Встановлює позначку часу, до якої буде продовжуватися відновлення." -#: utils/misc/guc.c:3752 +#: utils/misc/guc.c:3900 msgid "Sets the named restore point up to which recovery will proceed." msgstr "Встановлює назву точки відновлення, до якої буде продовжуватися відновлення." -#: utils/misc/guc.c:3761 +#: utils/misc/guc.c:3909 msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." msgstr "Встановлює номер LSN розташування випереджувального журналювання, до якого буде продовжуватися відновлення." -#: utils/misc/guc.c:3771 +#: utils/misc/guc.c:3919 msgid "Specifies a file name whose presence ends recovery in the standby." msgstr "Вказує назву файлу, наявність якого закінчує відновлення в режимі очікування." -#: utils/misc/guc.c:3781 +#: utils/misc/guc.c:3929 msgid "Sets the connection string to be used to connect to the sending server." msgstr "Встановлює рядок підключення який буде використовуватися для підключення до серверу надсилання." -#: utils/misc/guc.c:3792 +#: utils/misc/guc.c:3940 msgid "Sets the name of the replication slot to use on the sending server." msgstr "Встановлює назву слота реплікації, для використання на сервері надсилання." -#: utils/misc/guc.c:3802 +#: utils/misc/guc.c:3950 msgid "Sets the client's character set encoding." msgstr "Встановлює кодування символів, використовуване клієнтом." -#: utils/misc/guc.c:3813 +#: utils/misc/guc.c:3961 msgid "Controls information prefixed to each log line." msgstr "Визначає інформацію префікса кожного рядка протокола." -#: utils/misc/guc.c:3814 +#: utils/misc/guc.c:3962 msgid "If blank, no prefix is used." msgstr "При пустому значенні, префікс також відсутній." -#: utils/misc/guc.c:3823 +#: utils/misc/guc.c:3971 msgid "Sets the time zone to use in log messages." msgstr "Встановлює часовий пояс для виведення часу в повідомленях протокола." -#: utils/misc/guc.c:3833 +#: utils/misc/guc.c:3981 msgid "Sets the display format for date and time values." msgstr "Встановлює формат виведення значень часу і дат." -#: utils/misc/guc.c:3834 +#: utils/misc/guc.c:3982 msgid "Also controls interpretation of ambiguous date inputs." msgstr "Також визначає багатозначні задані дати, які вводяться." -#: utils/misc/guc.c:3845 +#: utils/misc/guc.c:3993 msgid "Sets the default table access method for new tables." msgstr "Встановлює метод доступу до таблиці за замовчуванням для нових таблиць." -#: utils/misc/guc.c:3856 +#: utils/misc/guc.c:4004 msgid "Sets the default tablespace to create tables and indexes in." msgstr "Встановлює табличний простір за замовчуванням, для створення таблиць і індексів." -#: utils/misc/guc.c:3857 +#: utils/misc/guc.c:4005 msgid "An empty string selects the database's default tablespace." msgstr "Пустий рядок вибирає табличний простір за замовчуванням бази даних." -#: utils/misc/guc.c:3867 +#: utils/misc/guc.c:4015 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "Встановлює табличний простір(простори) для використання в тимчасових таблицях і файлах сортування." -#: utils/misc/guc.c:3878 +#: utils/misc/guc.c:4026 msgid "Sets the path for dynamically loadable modules." msgstr "Встановлює шлях для динамічно завантажуваних модулів." -#: utils/misc/guc.c:3879 +#: utils/misc/guc.c:4027 msgid "If a dynamically loadable module needs to be opened and the specified name does not have a directory component (i.e., the name does not contain a slash), the system will search this path for the specified file." msgstr "Якщо динамічно завантажений модуль потрібно відкрити і у вказаному імені немає компонента каталогу (наприклад, ім'я не містить символ \"/\"), система буде шукати цей шлях у вказаному файлі." -#: utils/misc/guc.c:3892 +#: utils/misc/guc.c:4040 msgid "Sets the location of the Kerberos server key file." msgstr "Встановлює розташування файлу з ключем Kerberos для даного сервера." -#: utils/misc/guc.c:3903 +#: utils/misc/guc.c:4051 msgid "Sets the Bonjour service name." msgstr "Встановлює ім'я служби Bonjour." -#: utils/misc/guc.c:3915 +#: utils/misc/guc.c:4063 msgid "Shows the collation order locale." msgstr "Показує порядок локалізації параметра сортування." -#: utils/misc/guc.c:3926 +#: utils/misc/guc.c:4074 msgid "Shows the character classification and case conversion locale." msgstr "Показує класифікацію символу і перетворення локалізації." -#: utils/misc/guc.c:3937 +#: utils/misc/guc.c:4085 msgid "Sets the language in which messages are displayed." msgstr "Встановлює мову виведених повідомлень." -#: utils/misc/guc.c:3947 +#: utils/misc/guc.c:4095 msgid "Sets the locale for formatting monetary amounts." msgstr "Встановлює локалізацію для форматування грошових сум." -#: utils/misc/guc.c:3957 +#: utils/misc/guc.c:4105 msgid "Sets the locale for formatting numbers." msgstr "Встановлює локалізацію для форматування чисел." -#: utils/misc/guc.c:3967 +#: utils/misc/guc.c:4115 msgid "Sets the locale for formatting date and time values." msgstr "Встановлює локалізацію для форматування значень дати і часу." -#: utils/misc/guc.c:3977 +#: utils/misc/guc.c:4125 msgid "Lists shared libraries to preload into each backend." msgstr "Список спільних бібліотек, попередньо завантажених до кожного внутрішнього серверу." -#: utils/misc/guc.c:3988 +#: utils/misc/guc.c:4136 msgid "Lists shared libraries to preload into server." msgstr "Список спільних бібліотек, попередньо завантажених до серверу." -#: utils/misc/guc.c:3999 +#: utils/misc/guc.c:4147 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "Список непривілейованих спільних бібліотек, попередньо завантажених до кожного внутрішнього серверу." -#: utils/misc/guc.c:4010 +#: utils/misc/guc.c:4158 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "Встановлює порядок пошуку схеми для імен, які не є схемо-кваліфікованими." -#: utils/misc/guc.c:4022 -msgid "Sets the server (database) character set encoding." -msgstr "Встановлює кодування символів сервера (бази даних)." +#: utils/misc/guc.c:4170 +msgid "Shows the server (database) character set encoding." +msgstr "Показує набір символів кодування сервера (бази даних)." -#: utils/misc/guc.c:4034 +#: utils/misc/guc.c:4182 msgid "Shows the server version." msgstr "Показує версію сервера." -#: utils/misc/guc.c:4046 +#: utils/misc/guc.c:4194 msgid "Sets the current role." msgstr "Встановлює чинну роль." -#: utils/misc/guc.c:4058 +#: utils/misc/guc.c:4206 msgid "Sets the session user name." msgstr "Встановлює ім'я користувача в сеансі." -#: utils/misc/guc.c:4069 +#: utils/misc/guc.c:4217 msgid "Sets the destination for server log output." msgstr "Встановлює, куди буде виводитися протокол серверу." -#: utils/misc/guc.c:4070 +#: utils/misc/guc.c:4218 msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and \"eventlog\", depending on the platform." msgstr "Дійсними значеннями є комбінації \"stderr\", \"syslog\", \"csvlog\", і \"eventlog\" в залежності від платформи." -#: utils/misc/guc.c:4081 +#: utils/misc/guc.c:4229 msgid "Sets the destination directory for log files." msgstr "Встановлює каталог призначення для файлів журналу." -#: utils/misc/guc.c:4082 +#: utils/misc/guc.c:4230 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "Шлях може бути абсолютним або вказуватися відносно каталогу даних." -#: utils/misc/guc.c:4092 +#: utils/misc/guc.c:4240 msgid "Sets the file name pattern for log files." msgstr "Встановлює шаблон імені для файлів журналу." -#: utils/misc/guc.c:4103 +#: utils/misc/guc.c:4251 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "Встановлює ім'я програми для ідентифікації повідомлень PostgreSQL в syslog." -#: utils/misc/guc.c:4114 +#: utils/misc/guc.c:4262 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "Встановлює ім'я програми для ідентифікації повідомлень PostgreSQL в журналі подій." -#: utils/misc/guc.c:4125 +#: utils/misc/guc.c:4273 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "Встановлює часовий пояс для відображення та інтерпретації позначок часу." -#: utils/misc/guc.c:4135 +#: utils/misc/guc.c:4283 msgid "Selects a file of time zone abbreviations." msgstr "Вибирає файл з скороченими іменами часових поясів." -#: utils/misc/guc.c:4145 +#: utils/misc/guc.c:4293 msgid "Sets the owning group of the Unix-domain socket." msgstr "Встановлює відповідальну групу Unix-сокету." -#: utils/misc/guc.c:4146 +#: utils/misc/guc.c:4294 msgid "The owning user of the socket is always the user that starts the server." msgstr "Відповідальний користувач сокету це завжди той користувач який запустив сервер." -#: utils/misc/guc.c:4156 +#: utils/misc/guc.c:4304 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Встановлює каталоги, де будуть створюватись Unix-сокети." -#: utils/misc/guc.c:4171 +#: utils/misc/guc.c:4319 msgid "Sets the host name or IP address(es) to listen to." msgstr "Встановлює ім'я хосту або IP-адресу для прив'язки." -#: utils/misc/guc.c:4186 +#: utils/misc/guc.c:4334 msgid "Sets the server's data directory." msgstr "Встановлює каталог даних серверу." -#: utils/misc/guc.c:4197 +#: utils/misc/guc.c:4345 msgid "Sets the server's main configuration file." msgstr "Встановлює основний файл конфігурації серверу." -#: utils/misc/guc.c:4208 +#: utils/misc/guc.c:4356 msgid "Sets the server's \"hba\" configuration file." msgstr "Встановлює \"hba\" файл конфігурації серверу." -#: utils/misc/guc.c:4219 +#: utils/misc/guc.c:4367 msgid "Sets the server's \"ident\" configuration file." msgstr "Встановлює \"ident\" файл конфігурації серверу." -#: utils/misc/guc.c:4230 +#: utils/misc/guc.c:4378 msgid "Writes the postmaster PID to the specified file." msgstr "Записує ідентифікатор процесу (PID) postmaster у вказаний файл." -#: utils/misc/guc.c:4241 -msgid "Name of the SSL library." -msgstr "Назва бібліотеки SSL." +#: utils/misc/guc.c:4389 +msgid "Shows the name of the SSL library." +msgstr "Показує назву бібліотеки SSL." -#: utils/misc/guc.c:4256 +#: utils/misc/guc.c:4404 msgid "Location of the SSL server certificate file." msgstr "Розташування файла сертифікату сервера для SSL." -#: utils/misc/guc.c:4266 +#: utils/misc/guc.c:4414 msgid "Location of the SSL server private key file." msgstr "Розташування файла з закритим ключем сервера для SSL." -#: utils/misc/guc.c:4276 +#: utils/misc/guc.c:4424 msgid "Location of the SSL certificate authority file." msgstr "Розташування файла центру сертифікації для SSL." -#: utils/misc/guc.c:4286 +#: utils/misc/guc.c:4434 msgid "Location of the SSL certificate revocation list file." msgstr "Розташування файла зі списком відкликаних сертфікатів для SSL." -#: utils/misc/guc.c:4296 +#: utils/misc/guc.c:4444 +msgid "Location of the SSL certificate revocation list directory." +msgstr "Розташування каталогу списку відкликаних сертифікатів SSL." + +#: utils/misc/guc.c:4454 msgid "Writes temporary statistics files to the specified directory." msgstr "Записує тимчасові файли статистики у вказаний каталог." -#: utils/misc/guc.c:4307 +#: utils/misc/guc.c:4465 msgid "Number of synchronous standbys and list of names of potential synchronous ones." msgstr "Кількість потенційно синхронних режимів очікування і список їх імен." -#: utils/misc/guc.c:4318 +#: utils/misc/guc.c:4476 msgid "Sets default text search configuration." msgstr "Встановлює конфігурацію текстового пошуку за замовчуванням." -#: utils/misc/guc.c:4328 +#: utils/misc/guc.c:4486 msgid "Sets the list of allowed SSL ciphers." msgstr "Встановлює список дозволених шифрів для SSL." -#: utils/misc/guc.c:4343 +#: utils/misc/guc.c:4501 msgid "Sets the curve to use for ECDH." msgstr "Встановлює криву для ECDH." -#: utils/misc/guc.c:4358 +#: utils/misc/guc.c:4516 msgid "Location of the SSL DH parameters file." msgstr "Розташування файла з параметрами SSL DH." -#: utils/misc/guc.c:4369 +#: utils/misc/guc.c:4527 msgid "Command to obtain passphrases for SSL." msgstr "Команда, що дозволяє отримати парольну фразу для SSL." -#: utils/misc/guc.c:4380 +#: utils/misc/guc.c:4538 msgid "Sets the application name to be reported in statistics and logs." msgstr "Встановлює ім'я програми, яке буде повідомлятись у статистиці і протоколах." -#: utils/misc/guc.c:4391 +#: utils/misc/guc.c:4549 msgid "Sets the name of the cluster, which is included in the process title." msgstr "Встановлює ім'я кластеру, яке буде включене до заголовка процесу." -#: utils/misc/guc.c:4402 +#: utils/misc/guc.c:4560 msgid "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "Встановлює менеджерів ресурсу WAL, для яких виконано перевірки узгодженості WAL." -#: utils/misc/guc.c:4403 +#: utils/misc/guc.c:4561 msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." msgstr "При цьому до журналу будуть записуватись зображення повнихс сторінок для всіх блоків даних для перевірки з результатами відтворення WAL." -#: utils/misc/guc.c:4413 +#: utils/misc/guc.c:4571 msgid "JIT provider to use." msgstr "Використовувати провайдер JIT." -#: utils/misc/guc.c:4424 +#: utils/misc/guc.c:4582 msgid "Log backtrace for errors in these functions." msgstr "Відстежувати записи помилок у ціх функціях." -#: utils/misc/guc.c:4444 +#: utils/misc/guc.c:4602 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Встановлює, чи дозволене використання \"\\\" в текстових рядках." -#: utils/misc/guc.c:4454 +#: utils/misc/guc.c:4612 msgid "Sets the output format for bytea." msgstr "Встановлює формат виводу для типу bytea." -#: utils/misc/guc.c:4464 +#: utils/misc/guc.c:4622 msgid "Sets the message levels that are sent to the client." msgstr "Встановлює рівень повідомлень, переданих клієнту." -#: utils/misc/guc.c:4465 utils/misc/guc.c:4530 utils/misc/guc.c:4541 -#: utils/misc/guc.c:4617 +#: utils/misc/guc.c:4623 utils/misc/guc.c:4709 utils/misc/guc.c:4720 +#: utils/misc/guc.c:4796 msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." msgstr "Кожен рівень включає всі наступні рівні. Чим вище рівень, тим менше повідомлень надіслано." -#: utils/misc/guc.c:4475 +#: utils/misc/guc.c:4633 +msgid "Compute query identifiers." +msgstr "Обчислення ідентифікаторів запитів." + +#: utils/misc/guc.c:4643 msgid "Enables the planner to use constraints to optimize queries." msgstr "Дає змогу планувальнику оптимізувати запити, використовуючи обмеження." -#: utils/misc/guc.c:4476 +#: utils/misc/guc.c:4644 msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." msgstr "Сканування таблиці буде пропущено, якщо її обмеження гарантують, що запиту не відповідають ніякі рядки." -#: utils/misc/guc.c:4487 +#: utils/misc/guc.c:4655 +msgid "Sets the default compression method for compressible values." +msgstr "Встановлює метод стискання за замовчуванням для стисливих значень." + +#: utils/misc/guc.c:4666 msgid "Sets the transaction isolation level of each new transaction." msgstr "Встановлює рівень ізоляції транзакції для кожної нової транзакції." -#: utils/misc/guc.c:4497 +#: utils/misc/guc.c:4676 msgid "Sets the current transaction's isolation level." msgstr "Встановлює чинний рівень ізоляції транзакцій." -#: utils/misc/guc.c:4508 +#: utils/misc/guc.c:4687 msgid "Sets the display format for interval values." msgstr "Встановлює формат відображення внутрішніх значень." -#: utils/misc/guc.c:4519 +#: utils/misc/guc.c:4698 msgid "Sets the verbosity of logged messages." msgstr "Встановлює детальність повідомлень, які протоколюються." -#: utils/misc/guc.c:4529 +#: utils/misc/guc.c:4708 msgid "Sets the message levels that are logged." msgstr "Встанолвює рівні повідомлень, які протоколюються." -#: utils/misc/guc.c:4540 +#: utils/misc/guc.c:4719 msgid "Causes all statements generating error at or above this level to be logged." msgstr "Вмикає протоколювання для всіх операторів, виконаних з помилкою цього або вище рівня." -#: utils/misc/guc.c:4551 +#: utils/misc/guc.c:4730 msgid "Sets the type of statements logged." msgstr "Встановлює тип операторів, які протоколюються." -#: utils/misc/guc.c:4561 +#: utils/misc/guc.c:4740 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "Встановлює отримувача повідомлень, які відправляються до syslog." -#: utils/misc/guc.c:4576 +#: utils/misc/guc.c:4755 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "Встановлює поведінку для тригерів і правил перезапису для сеансу." -#: utils/misc/guc.c:4586 +#: utils/misc/guc.c:4765 msgid "Sets the current transaction's synchronization level." msgstr "Встановлює рівень синхронізації поточної транзакції." -#: utils/misc/guc.c:4596 +#: utils/misc/guc.c:4775 msgid "Allows archiving of WAL files using archive_command." msgstr "Дозволяє архівацію файлів WAL, використовуючи archive_command." -#: utils/misc/guc.c:4606 +#: utils/misc/guc.c:4785 msgid "Sets the action to perform upon reaching the recovery target." msgstr "Встновлює дію яку потрібно виконати в разі досягнення мети відновлення." -#: utils/misc/guc.c:4616 +#: utils/misc/guc.c:4795 msgid "Enables logging of recovery-related debugging information." msgstr "Вмикає протоколювання налагодженної інформації, пов'язаної з відновленням." -#: utils/misc/guc.c:4632 +#: utils/misc/guc.c:4811 msgid "Collects function-level statistics on database activity." msgstr "Збирає статистику активності в базі даних на рівні функцій." -#: utils/misc/guc.c:4642 -msgid "Set the level of information written to the WAL." -msgstr "Встановити рівень інформації, яка записується до WAL." +#: utils/misc/guc.c:4821 +msgid "Sets the level of information written to the WAL." +msgstr "Встановлює рівень інформації, яка записується до WAL." -#: utils/misc/guc.c:4652 +#: utils/misc/guc.c:4831 msgid "Selects the dynamic shared memory implementation used." msgstr "Вибирає використовуване впровадження динамічної спільної пам'яті." -#: utils/misc/guc.c:4662 +#: utils/misc/guc.c:4841 msgid "Selects the shared memory implementation used for the main shared memory region." msgstr "Вибирає впровадження спільної пам'яті, що використовується для основної області спільної пам'яті." -#: utils/misc/guc.c:4672 +#: utils/misc/guc.c:4851 msgid "Selects the method used for forcing WAL updates to disk." msgstr "Вибирає метод примусового запису оновлень в WAL на диск." -#: utils/misc/guc.c:4682 +#: utils/misc/guc.c:4861 msgid "Sets how binary values are to be encoded in XML." msgstr "Встановлює, як повинні кодуватись двійкові значення в XML." -#: utils/misc/guc.c:4692 +#: utils/misc/guc.c:4871 msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." msgstr "Встановлює, чи слід розглядати XML-дані в неявних операціях аналізу і серіалізації як документи або як фрагменти змісту." -#: utils/misc/guc.c:4703 +#: utils/misc/guc.c:4882 msgid "Use of huge pages on Linux or Windows." msgstr "Використовувати величезні сторінки в Linux або Windows." -#: utils/misc/guc.c:4713 +#: utils/misc/guc.c:4892 msgid "Forces use of parallel query facilities." msgstr "Примусово використовувати паралельне виконання запитів." -#: utils/misc/guc.c:4714 +#: utils/misc/guc.c:4893 msgid "If possible, run query using a parallel worker and with parallel restrictions." msgstr "Якщо можливо, виконувати запит використовуючи паралельного працівника і з обмеженнями паралельності." -#: utils/misc/guc.c:4724 +#: utils/misc/guc.c:4903 msgid "Chooses the algorithm for encrypting passwords." msgstr "Виберіть алгоритм для шифрування паролів." -#: utils/misc/guc.c:4734 +#: utils/misc/guc.c:4913 msgid "Controls the planner's selection of custom or generic plan." msgstr "Контролює вибір планувальником спеціального або загального плану." -#: utils/misc/guc.c:4735 +#: utils/misc/guc.c:4914 msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." msgstr "Підготовлені оператори можуть мати спеціальні або загальні плани, і планувальник спробує вибрати, який краще. Це може бути встановлено для зміни поведінки за замовчуванням." -#: utils/misc/guc.c:4747 +#: utils/misc/guc.c:4926 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "Встановлює мінімальну версію протоколу SSL/TLS для використання." -#: utils/misc/guc.c:4759 +#: utils/misc/guc.c:4938 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "Встановлює максимальну версію протоколу SSL/TLS для використання." -#: utils/misc/guc.c:5562 +#: utils/misc/guc.c:4950 +msgid "Sets the method for synchronizing the data directory before crash recovery." +msgstr "Встановлює метод для синхронізації каталогу даних перед аварійним відновленням." + +#: utils/misc/guc.c:5519 +#, c-format +msgid "invalid configuration parameter name \"%s\"" +msgstr "неприпустима назва параметра конфігурації \"%s\"" + +#: utils/misc/guc.c:5521 +#, c-format +msgid "Custom parameter names must be two or more simple identifiers separated by dots." +msgstr "Власні назви параметрів повинні містити два або більше простих ідентифікаторів, розділених крапками." + +#: utils/misc/guc.c:5530 utils/misc/guc.c:9289 +#, c-format +msgid "unrecognized configuration parameter \"%s\"" +msgstr "нерозпізнаний параметр конфігурації \"%s\"" + +#: utils/misc/guc.c:5823 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s: немає доступу до каталогу \"%s\": %s\n" -#: utils/misc/guc.c:5567 +#: utils/misc/guc.c:5828 #, c-format msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" msgstr "Запустіть initdb або pg_basebackup для ініціалізації каталогу даних PostgreSQL.\n" -#: utils/misc/guc.c:5587 +#: utils/misc/guc.c:5848 #, c-format msgid "%s does not know where to find the server configuration file.\n" "You must specify the --config-file or -D invocation option or set the PGDATA environment variable.\n" msgstr "%s не знає де знайти файл конфігурації сервера.\n" "Ви повинні вказати його розташування в параметрі --config-file або -D, або встановити змінну середовища PGDATA.\n" -#: utils/misc/guc.c:5606 +#: utils/misc/guc.c:5867 #, c-format msgid "%s: could not access the server configuration file \"%s\": %s\n" msgstr "%s: не вдалося отримати доступ до файлу конфігурації сервера \"%s\": %s\n" -#: utils/misc/guc.c:5632 +#: utils/misc/guc.c:5893 #, c-format msgid "%s does not know where to find the database system data.\n" "This can be specified as \"data_directory\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" msgstr "%s не знає де знайти дані системи бази даних.\n" "Їх розташування може бути вказано як \"data_directory\" в \"%s\", або передано в параметрі -D, або встановлено змінну середовища PGDATA.\n" -#: utils/misc/guc.c:5680 +#: utils/misc/guc.c:5941 #, c-format msgid "%s does not know where to find the \"hba\" configuration file.\n" "This can be specified as \"hba_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" msgstr "%s не знає де знайти файл конфігурації \"hba\".\n" "Його розташування може бути вказано як \"hba_file\" в \"%s\", або передано в параметрі -D, або встановлено змінну середовища PGDATA.\n" -#: utils/misc/guc.c:5703 +#: utils/misc/guc.c:5964 #, c-format msgid "%s does not know where to find the \"ident\" configuration file.\n" "This can be specified as \"ident_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" msgstr "%s не знає де знайти файл конфігурації \"ident\".\n" "Його розташування може бути вказано як \"ident_file\" в \"%s\", або передано в параметрі -D, або встановлено змінну середовища PGDATA.\n" -#: utils/misc/guc.c:6545 +#: utils/misc/guc.c:6889 msgid "Value exceeds integer range." msgstr "Значення перевищує діапазон цілих чисел." -#: utils/misc/guc.c:6781 +#: utils/misc/guc.c:7125 #, c-format msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d%s%s поза припустимим діапазоном для параметру \"%s\" (%d .. %d)" -#: utils/misc/guc.c:6817 +#: utils/misc/guc.c:7161 #, c-format msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" msgstr "%g%s%s поза припустимим діапазоном для параметру \"%s\" (%g .. %g)" -#: utils/misc/guc.c:6973 utils/misc/guc.c:8340 +#: utils/misc/guc.c:7321 utils/misc/guc.c:8693 #, c-format msgid "cannot set parameters during a parallel operation" msgstr "встановити параметри під час паралельної операції не можна" -#: utils/misc/guc.c:6980 utils/misc/guc.c:7732 utils/misc/guc.c:7785 -#: utils/misc/guc.c:7836 utils/misc/guc.c:8169 utils/misc/guc.c:8936 -#: utils/misc/guc.c:9198 utils/misc/guc.c:10864 -#, c-format -msgid "unrecognized configuration parameter \"%s\"" -msgstr "нерозпізнаний параметр конфігурації \"%s\"" - -#: utils/misc/guc.c:6995 utils/misc/guc.c:8181 +#: utils/misc/guc.c:7338 utils/misc/guc.c:8534 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "параметр \"%s\" не може бути змінений" -#: utils/misc/guc.c:7018 utils/misc/guc.c:7212 utils/misc/guc.c:7302 -#: utils/misc/guc.c:7392 utils/misc/guc.c:7500 utils/misc/guc.c:7595 -#: guc-file.l:352 +#: utils/misc/guc.c:7361 utils/misc/guc.c:7559 utils/misc/guc.c:7653 +#: utils/misc/guc.c:7747 utils/misc/guc.c:7867 utils/misc/guc.c:7966 +#: guc-file.l:353 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "параметр \"%s\" не може бути змінений, без перезавантаження сервера" -#: utils/misc/guc.c:7028 +#: utils/misc/guc.c:7371 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "параметр \"%s\" не може бути змінений зараз" -#: utils/misc/guc.c:7046 utils/misc/guc.c:7093 utils/misc/guc.c:10880 +#: utils/misc/guc.c:7389 utils/misc/guc.c:7436 utils/misc/guc.c:11334 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "немає прав для встановлення параметру \"%s\"" -#: utils/misc/guc.c:7083 +#: utils/misc/guc.c:7426 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "параметр \"%s\" не можна встановити після встановлення підключення" -#: utils/misc/guc.c:7131 +#: utils/misc/guc.c:7474 #, c-format msgid "cannot set parameter \"%s\" within security-definer function" msgstr "параметр \"%s\" не можна встановити в межах функції безпеки" -#: utils/misc/guc.c:7740 utils/misc/guc.c:7790 utils/misc/guc.c:9205 +#: utils/misc/guc.c:8107 utils/misc/guc.c:8154 utils/misc/guc.c:9551 #, c-format msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" msgstr "щоб дослідити \"%s\" потрібно бути суперкористувачем або учасником ролі pg_read_all_settings" -#: utils/misc/guc.c:7881 +#: utils/misc/guc.c:8238 #, c-format msgid "SET %s takes only one argument" msgstr "SET %s приймає лише один аргумент" -#: utils/misc/guc.c:8129 +#: utils/misc/guc.c:8486 #, c-format msgid "must be superuser to execute ALTER SYSTEM command" msgstr "щоб виконати команду ALTER SYSTEM потрібно бути суперкористувачем" -#: utils/misc/guc.c:8214 +#: utils/misc/guc.c:8567 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "значення параметру для ALTER SYSTEM не повинне містити нового рядка" -#: utils/misc/guc.c:8259 +#: utils/misc/guc.c:8612 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "не вдалося аналізувати зміст файла \"%s\"" -#: utils/misc/guc.c:8416 +#: utils/misc/guc.c:8769 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOT не реалізовано" -#: utils/misc/guc.c:8500 +#: utils/misc/guc.c:8853 #, c-format msgid "SET requires parameter name" msgstr "SET потребує ім'я параметра" -#: utils/misc/guc.c:8633 +#: utils/misc/guc.c:8986 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "спроба перевизначити параметр \"%s\"" -#: utils/misc/guc.c:10426 +#: utils/misc/guc.c:10781 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "під час налаштування параметру \"%s\" на \"%s\"" -#: utils/misc/guc.c:10494 +#: utils/misc/guc.c:10946 #, c-format msgid "parameter \"%s\" could not be set" msgstr "параметр \"%s\" не вдалося встановити" -#: utils/misc/guc.c:10584 +#: utils/misc/guc.c:11038 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "не вдалося аналізувати налаштування параметру \"%s\"" -#: utils/misc/guc.c:10942 utils/misc/guc.c:10976 +#: utils/misc/guc.c:11396 utils/misc/guc.c:11430 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "неприпустиме значення для параметра \"%s\": %d" -#: utils/misc/guc.c:11010 +#: utils/misc/guc.c:11464 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "неприпустиме значення для параметра \"%s\": %g" -#: utils/misc/guc.c:11280 +#: utils/misc/guc.c:11751 #, c-format msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." msgstr "параметр \"temp_buffers\" не можна змінити після того, як тимчасові таблиці отримали доступ в сеансі." -#: utils/misc/guc.c:11292 +#: utils/misc/guc.c:11763 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour не підтримується даною збіркою" -#: utils/misc/guc.c:11305 +#: utils/misc/guc.c:11776 #, c-format msgid "SSL is not supported by this build" msgstr "SSL не підтримується даною збіркою" -#: utils/misc/guc.c:11317 +#: utils/misc/guc.c:11788 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "Не можна ввімкнути параметр, коли \"log_statement_stats\" дорівнює true." -#: utils/misc/guc.c:11329 +#: utils/misc/guc.c:11800 #, c-format msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." msgstr "Не можна ввімкнути \"log_statement_stats\", коли \"log_parser_stats\", \"log_planner_stats\", або \"log_executor_stats\" дорівнюють true." -#: utils/misc/guc.c:11559 +#: utils/misc/guc.c:12030 #, c-format msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "значення effective_io_concurrency повинне дорівнювати 0 (нулю) на платформах, де відсутній posix_fadvise()." -#: utils/misc/guc.c:11572 +#: utils/misc/guc.c:12043 #, c-format msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "maintenance_io_concurrency повинне бути встановлене на 0, на платформах які не мають posix_fadvise()." -#: utils/misc/guc.c:11688 +#: utils/misc/guc.c:12057 +#, c-format +msgid "huge_page_size must be 0 on this platform." +msgstr "huge_page_size повинен бути 0 на цій платформі." + +#: utils/misc/guc.c:12071 +#, c-format +msgid "client_connection_check_interval must be set to 0 on platforms that lack POLLRDHUP." +msgstr "client_connection_check_interval повинен бути встановлений в 0, на платформах де відсутній POLLRDHUP." + +#: utils/misc/guc.c:12199 #, c-format msgid "invalid character" msgstr "неприпустимий символ" -#: utils/misc/guc.c:11748 +#: utils/misc/guc.c:12259 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timeline не є допустимим числом." -#: utils/misc/guc.c:11788 +#: utils/misc/guc.c:12299 #, c-format msgid "multiple recovery targets specified" msgstr "вказано декілька цілей відновлення" -#: utils/misc/guc.c:11789 +#: utils/misc/guc.c:12300 #, c-format msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." msgstr "Максимум один із recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid може бути встановлений." -#: utils/misc/guc.c:11797 +#: utils/misc/guc.c:12308 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "Єдиним дозволеним значенням є \"immediate\"." @@ -26566,7 +27523,7 @@ msgstr "запит буде обмежений політикою безпеки msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." msgstr "Щоб вимкнути політику для власника таблиці, використайте ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/timeout.c:395 +#: utils/misc/timeout.c:484 #, c-format msgid "cannot add more timeout reasons" msgstr "додати більше причин тайм-ауту не можна" @@ -26636,24 +27593,29 @@ msgstr "занадто довгий рядок у файлі часового п msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "в @INCLUDE не вказано ім'я файла у файлі часового поясу \"%s\", рядок %d" -#: utils/mmgr/aset.c:476 utils/mmgr/generation.c:234 utils/mmgr/slab.c:236 +#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:235 utils/mmgr/slab.c:237 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Помилка під час створення контексту пам'яті \"%s\"." -#: utils/mmgr/dsa.c:519 utils/mmgr/dsa.c:1332 +#: utils/mmgr/dsa.c:519 utils/mmgr/dsa.c:1329 #, c-format msgid "could not attach to dynamic shared area" msgstr "не вдалося підключитись до динамічно-спільної області" -#: utils/mmgr/mcxt.c:822 utils/mmgr/mcxt.c:858 utils/mmgr/mcxt.c:896 -#: utils/mmgr/mcxt.c:934 utils/mmgr/mcxt.c:970 utils/mmgr/mcxt.c:1001 -#: utils/mmgr/mcxt.c:1037 utils/mmgr/mcxt.c:1089 utils/mmgr/mcxt.c:1124 -#: utils/mmgr/mcxt.c:1159 +#: utils/mmgr/mcxt.c:889 utils/mmgr/mcxt.c:925 utils/mmgr/mcxt.c:963 +#: utils/mmgr/mcxt.c:1001 utils/mmgr/mcxt.c:1083 utils/mmgr/mcxt.c:1114 +#: utils/mmgr/mcxt.c:1150 utils/mmgr/mcxt.c:1202 utils/mmgr/mcxt.c:1237 +#: utils/mmgr/mcxt.c:1272 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "Помилка в запиті розміру %zu в контексті пам'яті \"%s\"." +#: utils/mmgr/mcxt.c:1046 +#, c-format +msgid "logging memory contexts of PID %d" +msgstr "журналювання контекстів пам'яті PID %d" + #: utils/mmgr/portalmem.c:187 #, c-format msgid "cursor \"%s\" already exists" @@ -26679,22 +27641,22 @@ msgstr "видалити закріплений портал \"%s\" не мож msgid "cannot drop active portal \"%s\"" msgstr "видалити активний портал \"%s\" не можна" -#: utils/mmgr/portalmem.c:731 +#: utils/mmgr/portalmem.c:736 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "не можна виконати PREPARE для транзакції, яка створила курсор WITH HOLD" -#: utils/mmgr/portalmem.c:1270 +#: utils/mmgr/portalmem.c:1275 #, c-format msgid "cannot perform transaction commands inside a cursor loop that is not read-only" msgstr "виконати команди транзакції всередині циклу з курсором, який не є \"лише для читання\", не можна" -#: utils/sort/logtape.c:266 utils/sort/logtape.c:289 +#: utils/sort/logtape.c:268 utils/sort/logtape.c:291 #, c-format msgid "could not seek to block %ld of temporary file" msgstr "не вдалося знайти шлях до блокування %ld тимчасового файлу" -#: utils/sort/logtape.c:295 +#: utils/sort/logtape.c:297 #, c-format msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" msgstr "не вдалося прочитати блок %ld тимчасового файлу: прочитано лише %zu з %zu байт." @@ -26721,22 +27683,22 @@ msgstr "не вдалося знайти для блокування %u у ти msgid "could not read from shared tuplestore temporary file: read only %zu of %zu bytes" msgstr "не вдалося прочитати з тимчасового файлу зі спільного сховища кортежів: прочитано лише %zu з %zu байт" -#: utils/sort/tuplesort.c:3140 +#: utils/sort/tuplesort.c:3216 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "кількість виконуючих процесів для зовнішнього сортування не може перевищувати %d" -#: utils/sort/tuplesort.c:4221 +#: utils/sort/tuplesort.c:4297 #, c-format msgid "could not create unique index \"%s\"" msgstr "не вдалося створити унікальний індекс \"%s\"" -#: utils/sort/tuplesort.c:4223 +#: utils/sort/tuplesort.c:4299 #, c-format msgid "Key %s is duplicated." msgstr "Ключ %s дублюється." -#: utils/sort/tuplesort.c:4224 +#: utils/sort/tuplesort.c:4300 #, c-format msgid "Duplicate keys exist." msgstr "Дублікати ключів існують." @@ -26756,466 +27718,471 @@ msgstr "не вдалося знайти у тимчасовому файлі з msgid "could not read from tuplestore temporary file: read only %zu of %zu bytes" msgstr "не вдалося прочитати з тимчасового файлу зі сховища кортежів: прочитано лише %zu з %zu байт" -#: utils/time/snapmgr.c:624 +#: utils/time/snapmgr.c:568 #, c-format msgid "The source transaction is not running anymore." msgstr "Вихідна транзакція вже не виконується." -#: utils/time/snapmgr.c:1232 +#: utils/time/snapmgr.c:1147 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "експортувати знімок з підтранзакції не можна" -#: utils/time/snapmgr.c:1391 utils/time/snapmgr.c:1396 -#: utils/time/snapmgr.c:1401 utils/time/snapmgr.c:1416 -#: utils/time/snapmgr.c:1421 utils/time/snapmgr.c:1426 -#: utils/time/snapmgr.c:1441 utils/time/snapmgr.c:1446 -#: utils/time/snapmgr.c:1451 utils/time/snapmgr.c:1553 -#: utils/time/snapmgr.c:1569 utils/time/snapmgr.c:1594 +#: utils/time/snapmgr.c:1306 utils/time/snapmgr.c:1311 +#: utils/time/snapmgr.c:1316 utils/time/snapmgr.c:1331 +#: utils/time/snapmgr.c:1336 utils/time/snapmgr.c:1341 +#: utils/time/snapmgr.c:1356 utils/time/snapmgr.c:1361 +#: utils/time/snapmgr.c:1366 utils/time/snapmgr.c:1468 +#: utils/time/snapmgr.c:1484 utils/time/snapmgr.c:1509 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "неприпустимі дані знімку в файлі \"%s\"" -#: utils/time/snapmgr.c:1488 +#: utils/time/snapmgr.c:1403 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "SET TRANSACTION SNAPSHOT повинна викликатись перед будь-яким запитом" -#: utils/time/snapmgr.c:1497 +#: utils/time/snapmgr.c:1412 #, c-format msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" msgstr "транзакція, яка імпортує знімок, повинна мати рівень ізоляції SERIALIZABLE або REPEATABLE READ" -#: utils/time/snapmgr.c:1506 utils/time/snapmgr.c:1515 +#: utils/time/snapmgr.c:1421 utils/time/snapmgr.c:1430 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "неприпустимий ідентифікатор знімка: \"%s\"" -#: utils/time/snapmgr.c:1607 +#: utils/time/snapmgr.c:1522 #, c-format msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" msgstr "серіалізована транзакція не може імпортувати знімок з не серіалізованої транзакції" -#: utils/time/snapmgr.c:1611 +#: utils/time/snapmgr.c:1526 #, c-format msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" msgstr "серіалізована транзакція в режимі \"читання-запис\" не може імпортувати знімок з транзакції в режимі \"тільки читання\"" -#: utils/time/snapmgr.c:1626 +#: utils/time/snapmgr.c:1541 #, c-format msgid "cannot import a snapshot from a different database" msgstr "імпортувати знімок з іншої бази даних не можна" -#: gram.y:1047 +#: gram.y:1107 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD більше не підтримується" -#: gram.y:1048 +#: gram.y:1108 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "Видаліть UNENCRYPTED, щоб зберегти пароль у зашифрованій формі." -#: gram.y:1110 +#: gram.y:1170 #, c-format msgid "unrecognized role option \"%s\"" msgstr "нерозпізнаний параметр ролі \"%s\"" -#: gram.y:1357 gram.y:1372 +#: gram.y:1417 gram.y:1432 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTS не може включати елементи схеми" -#: gram.y:1518 +#: gram.y:1578 #, c-format msgid "current database cannot be changed" msgstr "поточна база даних не може бути змінена" -#: gram.y:1642 +#: gram.y:1702 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "інтервал, який задає часовий пояс, повинен бути HOUR або HOUR TO MINUTE" -#: gram.y:2177 +#: gram.y:2270 #, c-format msgid "column number must be in range from 1 to %d" msgstr "номер стовпця повинен бути в діапазоні від 1 до %d" -#: gram.y:2709 +#: gram.y:2811 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "параметр послідовності \"%s\" тут не підтримується" -#: gram.y:2738 +#: gram.y:2840 #, c-format msgid "modulus for hash partition provided more than once" msgstr "модуль для геш-секції вказано неодноразово" -#: gram.y:2747 +#: gram.y:2849 #, c-format msgid "remainder for hash partition provided more than once" msgstr "решта для геш-секції вказана неодноразово" -#: gram.y:2754 +#: gram.y:2856 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "нерозпізнана специфікація границі геш-секції \"%s\"" -#: gram.y:2762 +#: gram.y:2864 #, c-format msgid "modulus for hash partition must be specified" msgstr "потрібно вказати модуль для геш-секції" -#: gram.y:2766 +#: gram.y:2868 #, c-format msgid "remainder for hash partition must be specified" msgstr "потрібно вказати решту для геш-секції" -#: gram.y:2967 gram.y:3000 +#: gram.y:3069 gram.y:3102 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "STDIN/STDOUT не допускається з PROGRAM" -#: gram.y:2973 +#: gram.y:3075 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "Речення WHERE не дозволяється використовувати з COPY TO" -#: gram.y:3305 gram.y:3312 gram.y:11647 gram.y:11655 +#: gram.y:3407 gram.y:3414 gram.y:11665 gram.y:11673 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "GLOBAL при створенні тимчасових таблиць застаріло" -#: gram.y:3552 +#: gram.y:3665 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "для згенерованого стовпця, потрібно вказати GENERATED ALWAYS" -#: gram.y:4512 +#: gram.y:4634 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM більше не підтримується" -#: gram.y:5338 +#: gram.y:5297 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "нерозпізнаний параметр безпеки рядка \"%s\"" -#: gram.y:5339 +#: gram.y:5298 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "Наразі підтримуються лише політики PERMISSIVE або RESTRICTIVE." -#: gram.y:5452 +#: gram.y:5380 +#, c-format +msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" +msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER не підтримується" + +#: gram.y:5417 msgid "duplicate trigger events specified" msgstr "вказані події тригера повторюються" -#: gram.y:5600 +#: gram.y:5565 #, c-format msgid "conflicting constraint properties" msgstr "конфліктуючі властивості обмеження" -#: gram.y:5696 +#: gram.y:5661 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTION ще не реалізований" -#: gram.y:6079 +#: gram.y:6044 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK більше не потребується" -#: gram.y:6080 +#: gram.y:6045 #, c-format msgid "Update your data type." msgstr "Поновіть ваш тип даних." -#: gram.y:7831 +#: gram.y:7741 #, c-format msgid "aggregates cannot have output arguments" msgstr "агрегатні функції не можуть мати вихідних аргументів" -#: gram.y:10153 gram.y:10171 +#: gram.y:10128 gram.y:10146 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTION не підтримується для рекурсивних подань" -#: gram.y:11779 +#: gram.y:11802 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "Синтаксис LIMIT #,# не підтримується" -#: gram.y:11780 +#: gram.y:11803 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "Використайте окремі речення LIMIT і OFFSET." -#: gram.y:12106 gram.y:12131 +#: gram.y:12141 gram.y:12166 #, c-format msgid "VALUES in FROM must have an alias" msgstr "VALUES в FROM повинен мати псевдонім" -#: gram.y:12107 gram.y:12132 +#: gram.y:12142 gram.y:12167 #, c-format msgid "For example, FROM (VALUES ...) [AS] foo." msgstr "Наприклад, FROM (VALUES ...) [AS] foo." -#: gram.y:12112 gram.y:12137 +#: gram.y:12147 gram.y:12172 #, c-format msgid "subquery in FROM must have an alias" msgstr "підзапит в FROM повинен мати псевдонім" -#: gram.y:12113 gram.y:12138 +#: gram.y:12148 gram.y:12173 #, c-format msgid "For example, FROM (SELECT ...) [AS] foo." msgstr "Наприклад, FROM (SELECT ...) [AS] foo." -#: gram.y:12591 +#: gram.y:12668 #, c-format msgid "only one DEFAULT value is allowed" msgstr "допускається лише одне значення DEFAULT" -#: gram.y:12600 +#: gram.y:12677 #, c-format msgid "only one PATH value per column is allowed" msgstr "для стовпця допускається лише одне значення PATH" -#: gram.y:12609 +#: gram.y:12686 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "конфліктуючі або надлишкові оголошення NULL / NOT NULL для стовпця \"%s\"" -#: gram.y:12618 +#: gram.y:12695 #, c-format msgid "unrecognized column option \"%s\"" msgstr "нерозпізнаний параметр стовпця \"%s\"" -#: gram.y:12872 +#: gram.y:12949 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "точність для типу float повинна бути мінімум 1 біт" -#: gram.y:12881 +#: gram.y:12958 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "точність для типу float повинна бути меньше 54 біт" -#: gram.y:13372 +#: gram.y:13456 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "неправильна кількість параметрів у лівій частині виразу OVERLAPS" -#: gram.y:13377 +#: gram.y:13461 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "неправильна кількість параметрів у правій частині виразу OVERLAPS" -#: gram.y:13552 +#: gram.y:13629 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "Предикат UNIQUE ще не реалізований" -#: gram.y:13915 +#: gram.y:13988 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "використовувати речення ORDER BY з WITHIN GROUP неодноразово, не можна" -#: gram.y:13920 +#: gram.y:13993 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "використовувати DISTINCT з WITHIN GROUP не можна" -#: gram.y:13925 +#: gram.y:13998 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "використовувати VARIADIC з WITHIN GROUP не можна" -#: gram.y:14391 gram.y:14414 +#: gram.y:14522 gram.y:14545 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "початком рамки не може бути UNBOUNDED FOLLOWING" -#: gram.y:14396 +#: gram.y:14527 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "рамка, яка починається з наступного рядка не можна закінчуватись поточним рядком" -#: gram.y:14419 +#: gram.y:14550 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "кінцем рамки не може бути UNBOUNDED PRECEDING" -#: gram.y:14425 +#: gram.y:14556 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "рамка, яка починається з поточного рядка не може мати попередніх рядків" -#: gram.y:14432 +#: gram.y:14563 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "рамка, яка починається з наступного рядка не може мати попередніх рядків" -#: gram.y:15082 +#: gram.y:15195 #, c-format msgid "type modifier cannot have parameter name" msgstr "тип modifier не може мати ім'я параметра" -#: gram.y:15088 +#: gram.y:15201 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "тип modifier не може мати ORDER BY" -#: gram.y:15153 gram.y:15160 +#: gram.y:15266 gram.y:15273 gram.y:15280 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s не можна використовувати тут як ім'я ролі" -#: gram.y:15841 gram.y:16030 +#: gram.y:15369 gram.y:16800 +#, c-format +msgid "WITH TIES cannot be specified without ORDER BY clause" +msgstr "WITH TIES не можна задати без оператора ORDER BY" + +#: gram.y:16477 gram.y:16666 msgid "improper use of \"*\"" msgstr "неправильне використання \"*\"" -#: gram.y:16094 +#: gram.y:16730 #, c-format msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" msgstr "сортувальна агрегатна функція з прямим аргументом VARIADIC повинна мати один агрегатний аргумент VARIADIC того ж типу даних" -#: gram.y:16131 +#: gram.y:16767 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "кілька речень ORDER BY не допускається" -#: gram.y:16142 +#: gram.y:16778 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "кілька речень OFFSET не допускається" -#: gram.y:16151 +#: gram.y:16787 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "кілька речень LIMIT не допускається" -#: gram.y:16160 +#: gram.y:16796 #, c-format msgid "multiple limit options not allowed" msgstr "використання декількох параметрів обмеження не дозволяється" -#: gram.y:16164 -#, c-format -msgid "WITH TIES cannot be specified without ORDER BY clause" -msgstr "WITH TIES не можна задати без оператора ORDER BY" - -#: gram.y:16172 +#: gram.y:16808 #, c-format msgid "multiple WITH clauses not allowed" msgstr "кілька речень WITH не допускається" -#: gram.y:16376 +#: gram.y:17002 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "В табличних функціях аргументи OUT і INOUT не дозволяються" -#: gram.y:16472 +#: gram.y:17098 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "кілька речень COLLATE не допускається" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16510 gram.y:16523 +#: gram.y:17136 gram.y:17149 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "обмеження %s не можуть бути позначені DEFERRABLE" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16536 +#: gram.y:17162 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "обмеження %s не можуть бути позначені NOT VALID" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16549 +#: gram.y:17175 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "обмеження %s не можуть бути позначені NO INHERIT" -#: guc-file.l:315 +#: guc-file.l:314 #, c-format -msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %u" -msgstr "нерозпізнаний параметр конфігурації \"%s\" у файлі \"%s\" рядок %u" +msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" +msgstr "нерозпізнаний параметр конфігурації \"%s\" у файлі \"%s\" рядок %d" -#: guc-file.l:388 +#: guc-file.l:389 #, c-format msgid "parameter \"%s\" removed from configuration file, reset to default" msgstr "параметр \"%s\" видалений з файла конфігурації, значення скинуто до \"за замовчуванням\"" -#: guc-file.l:454 +#: guc-file.l:455 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "параметр \"%s\" змінено на \"%s\"" -#: guc-file.l:496 +#: guc-file.l:497 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "файл конфігурації \"%s\" містить помилки" -#: guc-file.l:501 +#: guc-file.l:502 #, c-format msgid "configuration file \"%s\" contains errors; unaffected changes were applied" msgstr "файл конфігурації \"%s\" містить помилки; були застосовані не залежні зміни" -#: guc-file.l:506 +#: guc-file.l:507 #, c-format msgid "configuration file \"%s\" contains errors; no changes were applied" msgstr "файл конфігурації \"%s\" містить помилки; зміни не були застосовані" -#: guc-file.l:578 +#: guc-file.l:579 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "пуста назва файлу конфігурації: \"%s\"" -#: guc-file.l:595 +#: guc-file.l:596 #, c-format msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" msgstr "не вдалося відкрити файл конфігурації \"%s\": максимальну глибину вкладення перевищено" -#: guc-file.l:615 +#: guc-file.l:616 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "рекурсія файлу конфігурації в \"%s\"" -#: guc-file.l:642 +#: guc-file.l:643 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "відсутній файл конфігурації \"%s\" пропускається" -#: guc-file.l:896 +#: guc-file.l:897 #, c-format msgid "syntax error in file \"%s\" line %u, near end of line" msgstr "синтаксична помилка у файлі \"%s\" поблизу кінця рядка %u" -#: guc-file.l:906 +#: guc-file.l:907 #, c-format msgid "syntax error in file \"%s\" line %u, near token \"%s\"" msgstr "синтаксична помилка у файлі \"%s\" рядок %u, поблизу маркера \"%s\"" -#: guc-file.l:926 +#: guc-file.l:927 #, c-format msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "знайдено занадто багато синтаксичних помилок, переривання файла \"%s\"" -#: guc-file.l:981 +#: guc-file.l:982 #, c-format msgid "empty configuration directory name: \"%s\"" msgstr "пуста назва каталогу конфігурації: \"%s\"" -#: guc-file.l:1000 +#: guc-file.l:1001 #, c-format msgid "could not open configuration directory \"%s\": %m" msgstr "не вдалося відкрити каталог конфігурації \"%s\": %m" #: jsonpath_gram.y:529 #, c-format -msgid "unrecognized flag character \"%c\" in LIKE_REGEX predicate" -msgstr "нерозпізнаний символ позначки \"%c\" в предикаті LIKE_REGEX" +msgid "unrecognized flag character \"%.*s\" in LIKE_REGEX predicate" +msgstr "нерозпізнаний символ позначки \"%.*s\" в предикаті LIKE_REGEX" #: jsonpath_gram.y:583 #, c-format diff --git a/src/bin/initdb/po/de.po b/src/bin/initdb/po/de.po index 4543e9cad3..0b38e3d51d 100644 --- a/src/bin/initdb/po/de.po +++ b/src/bin/initdb/po/de.po @@ -1,14 +1,14 @@ # German message translation file for initdb. -# Peter Eisentraut , 2003 - 2021. +# Peter Eisentraut , 2003 - 2022. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-27 04:17+0000\n" -"PO-Revision-Date: 2021-04-27 07:33+0200\n" +"POT-Creation-Date: 2022-05-16 04:49+0000\n" +"PO-Revision-Date: 2022-05-16 07:59+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -16,58 +16,63 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "Fatal: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "Warnung: " -#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "Tipp: " + +#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "konnte aktuelles Verzeichnis nicht ermitteln: %m" -#: ../../common/exec.c:155 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "ungültige Programmdatei »%s«" -#: ../../common/exec.c:205 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "konnte Programmdatei »%s« nicht lesen" -#: ../../common/exec.c:213 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "konnte kein »%s« zum Ausführen finden" -#: ../../common/exec.c:269 ../../common/exec.c:308 +#: ../../common/exec.c:282 ../../common/exec.c:321 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m" -#: ../../common/exec.c:286 +#: ../../common/exec.c:299 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m" -#: ../../common/exec.c:409 +#: ../../common/exec.c:422 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 -#: initdb.c:328 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: initdb.c:334 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" @@ -154,7 +159,7 @@ msgstr "konnte Prozess für Befehl »%s« nicht starten: Fehlercode %lu" msgid "could not re-execute with restricted token: error code %lu" msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu" @@ -223,244 +228,244 @@ msgstr "konnte Junction für »%s« nicht erzeugen: %s\n" msgid "could not get junction for \"%s\": %s\n" msgstr "konnte Junction für »%s« nicht ermitteln: %s\n" -#: initdb.c:461 initdb.c:1493 +#: initdb.c:464 initdb.c:1456 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" -#: initdb.c:505 initdb.c:827 initdb.c:853 +#: initdb.c:505 initdb.c:809 initdb.c:829 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "konnte Datei »%s« nicht zum Schreiben öffnen: %m" -#: initdb.c:512 initdb.c:519 initdb.c:833 initdb.c:858 +#: initdb.c:509 initdb.c:812 initdb.c:831 #, c-format msgid "could not write file \"%s\": %m" msgstr "konnte Datei »%s« nicht schreiben: %m" -#: initdb.c:537 +#: initdb.c:513 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schließen: %m" + +#: initdb.c:529 #, c-format msgid "could not execute command \"%s\": %m" msgstr "konnte Befehl »%s« nicht ausführen: %m" -#: initdb.c:555 +#: initdb.c:547 #, c-format msgid "removing data directory \"%s\"" msgstr "entferne Datenverzeichnis »%s«" -#: initdb.c:557 +#: initdb.c:549 #, c-format msgid "failed to remove data directory" msgstr "konnte Datenverzeichnis nicht entfernen" -#: initdb.c:561 +#: initdb.c:553 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "entferne Inhalt des Datenverzeichnisses »%s«" -#: initdb.c:564 +#: initdb.c:556 #, c-format msgid "failed to remove contents of data directory" msgstr "konnte Inhalt des Datenverzeichnisses nicht entfernen" -#: initdb.c:569 +#: initdb.c:561 #, c-format msgid "removing WAL directory \"%s\"" msgstr "entferne WAL-Verzeichnis »%s«" -#: initdb.c:571 +#: initdb.c:563 #, c-format msgid "failed to remove WAL directory" msgstr "konnte WAL-Verzeichnis nicht entfernen" -#: initdb.c:575 +#: initdb.c:567 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "entferne Inhalt des WAL-Verzeichnisses »%s«" -#: initdb.c:577 +#: initdb.c:569 #, c-format msgid "failed to remove contents of WAL directory" msgstr "konnte Inhalt des WAL-Verzeichnisses nicht entfernen" -#: initdb.c:584 +#: initdb.c:576 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "Datenverzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt" -#: initdb.c:588 +#: initdb.c:580 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "WAL-Verzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt" -#: initdb.c:606 +#: initdb.c:598 #, c-format msgid "cannot be run as root" msgstr "kann nicht als root ausgeführt werden" -#: initdb.c:608 +#: initdb.c:599 #, c-format -msgid "" -"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" -"own the server process.\n" -msgstr "" -"Bitte loggen Sie sich (z.B. mit »su«) als der (unprivilegierte) Benutzer\n" -"ein, der Eigentümer des Serverprozesses sein soll.\n" +msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." +msgstr "Bitte loggen Sie sich (z.B. mit »su«) als der (unprivilegierte) Benutzer ein, der Eigentümer des Serverprozesses sein soll." -#: initdb.c:641 +#: initdb.c:631 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "»%s« ist keine gültige Serverkodierung" -#: initdb.c:786 +#: initdb.c:775 #, c-format msgid "file \"%s\" does not exist" msgstr "Datei »%s« existiert nicht" -#: initdb.c:788 initdb.c:795 initdb.c:804 +#: initdb.c:776 initdb.c:781 initdb.c:788 #, c-format -msgid "" -"This might mean you have a corrupted installation or identified\n" -"the wrong directory with the invocation option -L.\n" -msgstr "" -"Das könnte bedeuten, dass Ihre Installation fehlerhaft ist oder dass Sie das\n" -"falsche Verzeichnis mit der Kommandozeilenoption -L angegeben haben.\n" +msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." +msgstr "Das könnte bedeuten, dass Ihre Installation fehlerhaft ist oder dass Sie das falsche Verzeichnis mit der Kommandozeilenoption -L angegeben haben." -#: initdb.c:793 +#: initdb.c:780 #, c-format msgid "could not access file \"%s\": %m" msgstr "konnte nicht auf Datei »%s« zugreifen: %m" -#: initdb.c:802 +#: initdb.c:787 #, c-format msgid "file \"%s\" is not a regular file" msgstr "Datei »%s« ist keine normale Datei" -#: initdb.c:947 +#: initdb.c:919 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "wähle Implementierung von dynamischem Shared Memory ... " -#: initdb.c:956 +#: initdb.c:928 #, c-format msgid "selecting default max_connections ... " msgstr "wähle Vorgabewert für max_connections ... " -#: initdb.c:987 +#: initdb.c:959 #, c-format msgid "selecting default shared_buffers ... " msgstr "wähle Vorgabewert für shared_buffers ... " -#: initdb.c:1021 +#: initdb.c:993 #, c-format msgid "selecting default time zone ... " msgstr "wähle Vorgabewert für Zeitzone ... " -#: initdb.c:1055 +#: initdb.c:1027 msgid "creating configuration files ... " msgstr "erzeuge Konfigurationsdateien ... " -#: initdb.c:1214 initdb.c:1233 initdb.c:1319 initdb.c:1334 +#: initdb.c:1185 initdb.c:1201 initdb.c:1284 initdb.c:1296 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "konnte Zugriffsrechte von »%s« nicht ändern: %m" -#: initdb.c:1356 +#: initdb.c:1316 #, c-format msgid "running bootstrap script ... " msgstr "führe Bootstrap-Skript aus ... " -#: initdb.c:1368 +#: initdb.c:1328 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "Eingabedatei »%s« gehört nicht zu PostgreSQL %s" -#: initdb.c:1371 +#: initdb.c:1330 #, c-format -msgid "Check your installation or specify the correct path using the option -L.\n" -msgstr "" -"Prüfen Sie Ihre Installation oder geben Sie den korrekten Pfad mit der\n" -"Option -L an.\n" +msgid "Specify the correct path using the option -L." +msgstr "Geben Sie den korrekten Pfad mit der Option -L an." -#: initdb.c:1470 +#: initdb.c:1434 msgid "Enter new superuser password: " msgstr "Geben Sie das neue Superuser-Passwort ein: " -#: initdb.c:1471 +#: initdb.c:1435 msgid "Enter it again: " msgstr "Geben Sie es noch einmal ein: " -#: initdb.c:1474 +#: initdb.c:1438 #, c-format msgid "Passwords didn't match.\n" msgstr "Passwörter stimmten nicht überein.\n" -#: initdb.c:1501 +#: initdb.c:1462 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "konnte Passwort nicht aus Datei »%s« lesen: %m" -#: initdb.c:1504 +#: initdb.c:1465 #, c-format msgid "password file \"%s\" is empty" msgstr "Passwortdatei »%s« ist leer" -#: initdb.c:1995 +#: initdb.c:1912 #, c-format msgid "caught signal\n" msgstr "Signal abgefangen\n" -#: initdb.c:2001 +#: initdb.c:1918 #, c-format msgid "could not write to child process: %s\n" msgstr "konnte nicht an Kindprozess schreiben: %s\n" -#: initdb.c:2009 +#: initdb.c:1926 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2099 +#: initdb.c:2015 #, c-format msgid "setlocale() failed" msgstr "setlocale() fehlgeschlagen" -#: initdb.c:2120 +#: initdb.c:2033 #, c-format msgid "failed to restore old locale \"%s\"" msgstr "konnte alte Locale »%s« nicht wiederherstellen" -#: initdb.c:2129 +#: initdb.c:2040 #, c-format msgid "invalid locale name \"%s\"" msgstr "ungültiger Locale-Name: »%s«" -#: initdb.c:2140 +#: initdb.c:2051 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "ungültige Locale-Einstellungen; prüfen Sie die Umgebungsvariablen LANG und LC_*" -#: initdb.c:2167 +#: initdb.c:2077 #, c-format msgid "encoding mismatch" msgstr "unpassende Kodierungen" -#: initdb.c:2169 +#: initdb.c:2078 #, c-format -msgid "" -"The encoding you selected (%s) and the encoding that the\n" -"selected locale uses (%s) do not match. This would lead to\n" -"misbehavior in various character string processing functions.\n" -"Rerun %s and either do not specify an encoding explicitly,\n" -"or choose a matching combination.\n" -msgstr "" -"Die von Ihnen gewählte Kodierung (%s) und die von der gewählten\n" -"Locale verwendete Kodierung (%s) passen nicht zu einander. Das\n" -"würde in verschiedenen Zeichenkettenfunktionen zu Fehlverhalten\n" -"führen. Starten Sie %s erneut und geben Sie entweder keine\n" -"Kodierung explizit an oder wählen Sie eine passende Kombination.\n" +msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." +msgstr "Die von Ihnen gewählte Kodierung (%s) und die von der gewählten Locale verwendete Kodierung (%s) passen nicht zu einander. Das würde in verschiedenen Zeichenkettenfunktionen zu Fehlverhalten führen." + +#: initdb.c:2083 +#, c-format +msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." +msgstr "Starten Sie %s erneut und geben Sie entweder keine Kodierung explizit an oder wählen Sie eine passende Kombination." + +#: initdb.c:2145 +#, c-format +msgid "ICU locale must be specified" +msgstr "ICU-Locale muss angegeben werden" + +#: initdb.c:2152 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ICU wird in dieser Installation nicht unterstützt" -#: initdb.c:2241 +#: initdb.c:2163 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -469,17 +474,17 @@ msgstr "" "%s initialisiert einen PostgreSQL-Datenbankcluster.\n" "\n" -#: initdb.c:2242 +#: initdb.c:2164 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: initdb.c:2243 +#: initdb.c:2165 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATENVERZEICHNIS]\n" -#: initdb.c:2244 +#: initdb.c:2166 #, c-format msgid "" "\n" @@ -488,53 +493,58 @@ msgstr "" "\n" "Optionen:\n" -#: initdb.c:2245 +#: initdb.c:2167 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, --auth=METHODE vorgegebene Authentifizierungsmethode für lokale Verbindungen\n" -#: initdb.c:2246 +#: initdb.c:2168 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr "" " --auth-host=METHODE vorgegebene Authentifizierungsmethode für lokale\n" " TCP/IP-Verbindungen\n" -#: initdb.c:2247 +#: initdb.c:2169 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr "" " --auth-local=METHODE vorgegebene Authentifizierungsmethode für Verbindungen\n" " auf lokalen Sockets\n" -#: initdb.c:2248 +#: initdb.c:2170 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DATENVERZ Datenverzeichnis für diesen Datenbankcluster\n" -#: initdb.c:2249 +#: initdb.c:2171 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=KODIERUNG setze Standardkodierung für neue Datenbanken\n" -#: initdb.c:2250 +#: initdb.c:2172 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr "" " -g, --allow-group-access Lese- und Ausführungsrechte am Datenverzeichnis\n" " für Gruppe setzen\n" -#: initdb.c:2251 +#: initdb.c:2173 +#, c-format +msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" +msgstr " --icu-locale=LOCALE setze ICU-Locale-ID für neue Datenbanken\n" + +#: initdb.c:2174 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums Datenseitenprüfsummen verwenden\n" -#: initdb.c:2252 +#: initdb.c:2175 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOCALE setze Standardlocale für neue Datenbanken\n" -#: initdb.c:2253 +#: initdb.c:2176 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -548,17 +558,26 @@ msgstr "" " für neue Datenbanken (Voreinstellung aus der\n" " Umgebung entnommen)\n" -#: initdb.c:2257 +#: initdb.c:2180 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale entspricht --locale=C\n" -#: initdb.c:2258 +#: initdb.c:2181 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" set default locale provider for new databases\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" setze Standard-Locale-Provider für neue Datenbanken\n" + +#: initdb.c:2183 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr " --pwfile=DATEI lese Passwort des neuen Superusers aus Datei\n" -#: initdb.c:2259 +#: initdb.c:2184 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -567,27 +586,27 @@ msgstr "" " -T, --text-search-config=KFG\n" " Standardtextsuchekonfiguration\n" -#: initdb.c:2261 +#: initdb.c:2186 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NAME Datenbank-Superusername\n" -#: initdb.c:2262 +#: initdb.c:2187 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt frage nach Passwort für neuen Superuser\n" -#: initdb.c:2263 +#: initdb.c:2188 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALVERZ Verzeichnis für das Write-Ahead-Log\n" -#: initdb.c:2264 +#: initdb.c:2189 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=ZAHL Größe eines WAL-Segments, in Megabyte\n" -#: initdb.c:2265 +#: initdb.c:2190 #, c-format msgid "" "\n" @@ -596,44 +615,51 @@ msgstr "" "\n" "Weniger häufig verwendete Optionen:\n" -#: initdb.c:2266 +#: initdb.c:2191 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug erzeuge eine Menge Debug-Ausgaben\n" -#: initdb.c:2267 +#: initdb.c:2192 +#, c-format +msgid " --discard-caches set debug_discard_caches=1\n" +msgstr " --discard-caches debug_discard_caches=1 setzen\n" + +#: initdb.c:2193 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L VERZEICHNIS wo sind die Eingabedateien zu finden\n" -#: initdb.c:2268 +#: initdb.c:2194 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean nach Fehlern nicht aufräumen\n" -#: initdb.c:2269 +#: initdb.c:2195 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n" " geschrieben sind\n" -#: initdb.c:2270 +#: initdb.c:2196 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr " --no-instructions Anleitung für nächste Schritte nicht ausgeben\n" -#: initdb.c:2271 +#: initdb.c:2197 #, c-format msgid " -s, --show show internal settings\n" msgstr " -s, --show zeige interne Einstellungen\n" -#: initdb.c:2272 +#: initdb.c:2198 #, c-format -msgid " -S, --sync-only only sync data directory\n" -msgstr " -S, --sync-only nur Datenverzeichnis synchronisieren\n" +msgid " -S, --sync-only only sync database files to disk, then exit\n" +msgstr "" +" -S, --sync-only nur Datenbankdateien auf Festplatte synchronisieren,\n" +" dann beenden\n" -#: initdb.c:2273 +#: initdb.c:2199 #, c-format msgid "" "\n" @@ -642,17 +668,17 @@ msgstr "" "\n" "Weitere Optionen:\n" -#: initdb.c:2274 +#: initdb.c:2200 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: initdb.c:2275 +#: initdb.c:2201 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: initdb.c:2276 +#: initdb.c:2202 #, c-format msgid "" "\n" @@ -663,7 +689,7 @@ msgstr "" "Wenn kein Datenverzeichnis angegeben ist, dann wird die Umgebungsvariable\n" "PGDATA verwendet.\n" -#: initdb.c:2278 +#: initdb.c:2204 #, c-format msgid "" "\n" @@ -672,109 +698,104 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: initdb.c:2279 +#: initdb.c:2205 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: initdb.c:2307 +#: initdb.c:2233 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "ungültige Authentifizierungsmethode »%s« für »%s«-Verbindungen" -#: initdb.c:2323 +#: initdb.c:2247 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "Superuser-Passwort muss angegeben werden um Passwortauthentifizierung einzuschalten" -#: initdb.c:2344 +#: initdb.c:2266 #, c-format msgid "no data directory specified" msgstr "kein Datenverzeichnis angegeben" -#: initdb.c:2346 +#: initdb.c:2267 #, c-format -msgid "" -"You must identify the directory where the data for this database system\n" -"will reside. Do this with either the invocation option -D or the\n" -"environment variable PGDATA.\n" -msgstr "" -"Sie müssen das Verzeichnis angeben, wo dieses Datenbanksystem abgelegt\n" -"werden soll. Machen Sie dies entweder mit der Kommandozeilenoption -D\n" -"oder mit der Umgebungsvariable PGDATA.\n" +msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." +msgstr "Sie müssen das Verzeichnis angeben, wo dieses Datenbanksystem abgelegt werden soll. Machen Sie dies entweder mit der Kommandozeilenoption -D oder mit der Umgebungsvariable PGDATA." -#: initdb.c:2364 +#: initdb.c:2284 #, c-format msgid "could not set environment" msgstr "konnte Umgebung nicht setzen" -#: initdb.c:2384 +#: initdb.c:2302 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"Das Programm »%s« wird von %s benötigt, aber wurde nicht im\n" -"selben Verzeichnis wie »%s« gefunden.\n" -"Prüfen Sie Ihre Installation." +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden" -#: initdb.c:2389 +#: initdb.c:2305 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"Das Programm »%s« wurde von %s gefunden,\n" -"aber es hatte nicht die gleiche Version wie %s.\n" -"Prüfen Sie Ihre Installation." +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s" -#: initdb.c:2408 +#: initdb.c:2320 #, c-format msgid "input file location must be an absolute path" msgstr "Eingabedatei muss absoluten Pfad haben" -#: initdb.c:2425 +#: initdb.c:2337 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "Der Datenbankcluster wird mit der Locale »%s« initialisiert werden.\n" -#: initdb.c:2428 +#: initdb.c:2340 +#, c-format +msgid "The database cluster will be initialized with this locale configuration:\n" +msgstr "Der Datenbankcluster wird mit dieser Locale-Konfiguration initialisiert werden:\n" + +#: initdb.c:2341 +#, c-format +msgid " provider: %s\n" +msgstr " Provider: %s\n" + +#: initdb.c:2343 +#, c-format +msgid " ICU locale: %s\n" +msgstr " ICU-Locale: %s\n" + +#: initdb.c:2344 #, c-format msgid "" -"The database cluster will be initialized with locales\n" -" COLLATE: %s\n" -" CTYPE: %s\n" -" MESSAGES: %s\n" -" MONETARY: %s\n" -" NUMERIC: %s\n" -" TIME: %s\n" +" LC_COLLATE: %s\n" +" LC_CTYPE: %s\n" +" LC_MESSAGES: %s\n" +" LC_MONETARY: %s\n" +" LC_NUMERIC: %s\n" +" LC_TIME: %s\n" msgstr "" -"Der Datenbankcluster wird mit folgenden Locales initialisiert werden:\n" -" COLLATE: %s\n" -" CTYPE: %s\n" -" MESSAGES: %s\n" -" MONETARY: %s\n" -" NUMERIC: %s\n" -" TIME: %s\n" +" LC_COLLATE: %s\n" +" LC_CTYPE: %s\n" +" LC_MESSAGES: %s\n" +" LC_MONETARY: %s\n" +" LC_NUMERIC: %s\n" +" LC_TIME: %s\n" -#: initdb.c:2452 +#: initdb.c:2369 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "konnte keine passende Kodierung für Locale »%s« finden" -#: initdb.c:2454 +#: initdb.c:2371 #, c-format -msgid "Rerun %s with the -E option.\n" -msgstr "Führen Sie %s erneut mit der Option -E aus.\n" +msgid "Rerun %s with the -E option." +msgstr "Führen Sie %s erneut mit der Option -E aus." -#: initdb.c:2455 initdb.c:3089 initdb.c:3110 +#: initdb.c:2372 initdb.c:2989 initdb.c:3009 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: initdb.c:2468 +#: initdb.c:2384 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -783,178 +804,179 @@ msgstr "" "Die von der Locale gesetzte Kodierung »%s« ist nicht als serverseitige Kodierung erlaubt.\n" "Die Standarddatenbankkodierung wird stattdessen auf »%s« gesetzt.\n" -#: initdb.c:2473 +#: initdb.c:2389 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "Locale »%s« benötigt nicht unterstützte Kodierung »%s«" -#: initdb.c:2476 +#: initdb.c:2391 #, c-format -msgid "" -"Encoding \"%s\" is not allowed as a server-side encoding.\n" -"Rerun %s with a different locale selection.\n" -msgstr "" -"Kodierung »%s« ist nicht als serverseitige Kodierung erlaubt.\n" -"Starten Sie %s erneut mit einer anderen Locale-Wahl.\n" +msgid "Encoding \"%s\" is not allowed as a server-side encoding." +msgstr "Kodierung »%s« ist nicht als serverseitige Kodierung erlaubt." -#: initdb.c:2485 +#: initdb.c:2393 +#, c-format +msgid "Rerun %s with a different locale selection." +msgstr "Starten Sie %s erneut mit einer anderen Locale-Wahl." + +#: initdb.c:2401 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "Die Standarddatenbankkodierung wurde entsprechend auf »%s« gesetzt.\n" -#: initdb.c:2551 +#: initdb.c:2466 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "konnte keine passende Textsuchekonfiguration für Locale »%s« finden" -#: initdb.c:2562 +#: initdb.c:2477 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "passende Textsuchekonfiguration für Locale »%s« ist unbekannt" -#: initdb.c:2567 +#: initdb.c:2482 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "angegebene Textsuchekonfiguration »%s« passt möglicherweise nicht zur Locale »%s«" -#: initdb.c:2572 +#: initdb.c:2487 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "Die Standardtextsuchekonfiguration wird auf »%s« gesetzt.\n" -#: initdb.c:2616 initdb.c:2698 +#: initdb.c:2530 initdb.c:2601 #, c-format msgid "creating directory %s ... " msgstr "erzeuge Verzeichnis %s ... " -#: initdb.c:2622 initdb.c:2704 initdb.c:2769 initdb.c:2831 +#: initdb.c:2535 initdb.c:2606 initdb.c:2658 initdb.c:2714 #, c-format msgid "could not create directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" -#: initdb.c:2633 initdb.c:2716 +#: initdb.c:2544 initdb.c:2616 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "berichtige Zugriffsrechte des bestehenden Verzeichnisses %s ... " -#: initdb.c:2639 initdb.c:2722 +#: initdb.c:2549 initdb.c:2621 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "konnte Rechte des Verzeichnisses »%s« nicht ändern: %m" -#: initdb.c:2653 initdb.c:2736 +#: initdb.c:2561 initdb.c:2633 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "Verzeichnis »%s« existiert aber ist nicht leer" -#: initdb.c:2658 +#: initdb.c:2565 #, c-format -msgid "" -"If you want to create a new database system, either remove or empty\n" -"the directory \"%s\" or run %s\n" -"with an argument other than \"%s\".\n" -msgstr "" -"Wenn Sie ein neues Datenbanksystem erzeugen wollen, entfernen oder leeren\n" -"Sie das Verzeichnis »%s« or führen Sie %s\n" -"mit einem anderen Argument als »%s« aus.\n" +msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." +msgstr "Wenn Sie ein neues Datenbanksystem erzeugen wollen, entfernen oder leeren Sie das Verzeichnis »%s« or führen Sie %s mit einem anderen Argument als »%s« aus." -#: initdb.c:2666 initdb.c:2748 initdb.c:3125 +#: initdb.c:2573 initdb.c:2643 initdb.c:3026 #, c-format msgid "could not access directory \"%s\": %m" msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" -#: initdb.c:2689 +#: initdb.c:2594 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL-Verzeichnis muss absoluten Pfad haben" -#: initdb.c:2741 +#: initdb.c:2637 #, c-format -msgid "" -"If you want to store the WAL there, either remove or empty the directory\n" -"\"%s\".\n" -msgstr "" -"Wenn Sie dort den WAL ablegen wollen, entfernen oder leeren Sie das\n" -"Verzeichnis »%s«.\n" +msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." +msgstr "Wenn Sie dort den WAL ablegen wollen, entfernen oder leeren Sie das Verzeichnis »%s«." -#: initdb.c:2755 +#: initdb.c:2648 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m" -#: initdb.c:2760 +#: initdb.c:2651 #, c-format msgid "symlinks are not supported on this platform" msgstr "symbolische Verknüpfungen werden auf dieser Plattform nicht unterstützt" -#: initdb.c:2784 +#: initdb.c:2670 #, c-format -msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n" -msgstr "Es enthält eine unsichtbare Datei (beginnt mit Punkt), vielleicht weil es ein Einhängepunkt ist.\n" +msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." +msgstr "Es enthält eine unsichtbare Datei (beginnt mit Punkt), vielleicht weil es ein Einhängepunkt ist." -#: initdb.c:2787 +#: initdb.c:2672 #, c-format -msgid "It contains a lost+found directory, perhaps due to it being a mount point.\n" -msgstr "Es enthält ein Verzeichnis »lost+found«, vielleicht weil es ein Einhängepunkt ist.\n" +msgid "It contains a lost+found directory, perhaps due to it being a mount point." +msgstr "Es enthält ein Verzeichnis »lost+found«, vielleicht weil es ein Einhängepunkt ist." -#: initdb.c:2790 +#: initdb.c:2674 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" -"Create a subdirectory under the mount point.\n" +"Create a subdirectory under the mount point." msgstr "" "Einen Einhängepunkt direkt als Datenverzeichnis zu verwenden wird nicht empfohlen.\n" -"Erzeugen Sie ein Unterverzeichnis unter dem Einhängepunkt.\n" +"Erzeugen Sie ein Unterverzeichnis unter dem Einhängepunkt." -#: initdb.c:2816 +#: initdb.c:2700 #, c-format msgid "creating subdirectories ... " msgstr "erzeuge Unterverzeichnisse ... " -#: initdb.c:2862 +#: initdb.c:2743 msgid "performing post-bootstrap initialization ... " msgstr "führe Post-Bootstrap-Initialisierung durch ... " -#: initdb.c:3024 +#: initdb.c:2908 #, c-format msgid "Running in debug mode.\n" msgstr "Debug-Modus ist an.\n" -#: initdb.c:3028 +#: initdb.c:2912 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "No-Clean-Modus ist an. Bei Fehlern wird nicht aufgeräumt.\n" -#: initdb.c:3108 +#: initdb.c:2982 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "unbekannter Locale-Provider: %s" + +#: initdb.c:3007 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: initdb.c:3129 initdb.c:3218 +#: initdb.c:3014 +#, c-format +msgid "%s cannot be specified unless locale provider \"%s\" is chosen" +msgstr "%s kann nur angegeben werden, wenn Locale-Provider »%s« gewählt ist" + +#: initdb.c:3028 initdb.c:3105 msgid "syncing data to disk ... " msgstr "synchronisiere Daten auf Festplatte ... " -#: initdb.c:3138 +#: initdb.c:3036 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "Passwortprompt und Passwortdatei können nicht zusammen angegeben werden" -#: initdb.c:3163 +#: initdb.c:3058 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "Argument von --wal-segsize muss eine Zahl sein" -#: initdb.c:3168 +#: initdb.c:3060 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "Argument von --wal-segsize muss eine Zweierpotenz zwischen 1 und 1024 sein" -#: initdb.c:3185 +#: initdb.c:3074 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "Superuser-Name »%s« nicht erlaubt; Rollennamen können nicht mit »pg_« anfangen" -#: initdb.c:3189 +#: initdb.c:3076 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -965,17 +987,17 @@ msgstr "" "»%s« gehören. Diesem Benutzer muss auch der Serverprozess gehören.\n" "\n" -#: initdb.c:3205 +#: initdb.c:3092 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Datenseitenprüfsummen sind eingeschaltet.\n" -#: initdb.c:3207 +#: initdb.c:3094 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Datenseitenprüfsummen sind ausgeschaltet.\n" -#: initdb.c:3224 +#: initdb.c:3111 #, c-format msgid "" "\n" @@ -986,27 +1008,22 @@ msgstr "" "Synchronisation auf Festplatte übersprungen.\n" "Das Datenverzeichnis könnte verfälscht werden, falls das Betriebssystem abstürzt.\n" -#: initdb.c:3229 +#: initdb.c:3116 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "Authentifizierung für lokale Verbindungen auf »trust« gesetzt" -#: initdb.c:3230 +#: initdb.c:3117 #, c-format -msgid "" -"You can change this by editing pg_hba.conf or using the option -A, or\n" -"--auth-local and --auth-host, the next time you run initdb.\n" -msgstr "" -"Sie können dies ändern, indem Sie pg_hba.conf bearbeiten oder beim\n" -"nächsten Aufruf von initdb die Option -A, oder --auth-local und\n" -"--auth-host, verwenden.\n" +msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." +msgstr "Sie können dies ändern, indem Sie pg_hba.conf bearbeiten oder beim nächsten Aufruf von initdb die Option -A, oder --auth-local und --auth-host, verwenden." #. translator: This is a placeholder in a shell command. -#: initdb.c:3260 +#: initdb.c:3147 msgid "logfile" msgstr "logdatei" -#: initdb.c:3262 +#: initdb.c:3149 #, c-format msgid "" "\n" diff --git a/src/bin/initdb/po/el.po b/src/bin/initdb/po/el.po index c5c41a8ff3..83b776c9d9 100644 --- a/src/bin/initdb/po/el.po +++ b/src/bin/initdb/po/el.po @@ -3,35 +3,37 @@ # This file is distributed under the same license as the initdb (PostgreSQL) package. # Georgios Kokolatos , 2021 # +# +# msgid "" msgstr "" -"Project-Id-Version: initdb (PostgreSQL) 13\n" +"Project-Id-Version: initdb (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-25 05:47+0000\n" -"PO-Revision-Date: 2021-02-25 11:14+0100\n" +"POT-Creation-Date: 2021-11-03 18:16+0000\n" +"PO-Revision-Date: 2021-11-05 11:25+0100\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " -msgstr "κρίσιμο:" +msgstr "κρίσιμο: " #: ../../../src/common/logging.c:266 #, c-format msgid "error: " -msgstr "σφάλμα:" +msgstr "σφάλμα: " #: ../../../src/common/logging.c:273 #, c-format msgid "warning: " -msgstr "προειδοποίηση:" +msgstr "προειδοποίηση: " #: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format @@ -41,35 +43,35 @@ msgstr "δεν ήταν δυνατή η αναγνώριση του τρέχον #: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" -msgstr "μη έγκυρο δυαδικό αρχείο “%s”" +msgstr "μη έγκυρο δυαδικό αρχείο «%s»" #: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" -msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου “%s”" +msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου «%s»" #: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" -msgstr "δεν βρέθηκε το αρχείο “%s” για να εκτελεστεί" +msgstr "δεν βρέθηκε το αρχείο «%s» για να εκτελεστεί" #: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" -msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο “%s”: %m" +msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" #: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου “%s”: %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου «%s»: %m" #: ../../common/exec.c:409 #, c-format msgid "%s() failed: %m" -msgstr "%s () απέτυχε: %m" +msgstr "%s() απέτυχε: %m" #: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 -#: initdb.c:328 +#: initdb.c:331 #, c-format msgid "out of memory" msgstr "έλλειψη μνήμης" @@ -88,43 +90,43 @@ msgstr "δεν ήταν δυνατή η αντιγραφή δείκτη null (ε #: ../../common/file_utils.c:87 ../../common/file_utils.c:451 #, c-format msgid "could not stat file \"%s\": %m" -msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο “%s”: %m" +msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο «%s»: %m" #: ../../common/file_utils.c:166 ../../common/pgfnames.c:48 #, c-format msgid "could not open directory \"%s\": %m" -msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου “%s”: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m" #: ../../common/file_utils.c:200 ../../common/pgfnames.c:69 #, c-format msgid "could not read directory \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου “%s”: %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m" #: ../../common/file_utils.c:232 ../../common/file_utils.c:291 #: ../../common/file_utils.c:365 #, c-format msgid "could not open file \"%s\": %m" -msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου “%s”: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %m" #: ../../common/file_utils.c:303 ../../common/file_utils.c:373 #, c-format msgid "could not fsync file \"%s\": %m" -msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής fsync στο αρχείο “%s”: %m" +msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής fsync στο αρχείο «%s»: %m" #: ../../common/file_utils.c:383 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" -msgstr "δεν ήταν δυνατή η μετονομασία του αρχείου “%s” σε “%s”: %m" +msgstr "δεν ήταν δυνατή η μετονομασία του αρχείου «%s» σε «%s»: %m" #: ../../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" -msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου “%s”: %m" +msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m" #: ../../common/restricted_token.c:64 #, c-format msgid "could not load library \"%s\": error code %lu" -msgstr "δεν ήταν δυνατή η φόρτωση της βιβλιοθήκης “%s”: κωδικός σφάλματος %lu" +msgstr "δεν ήταν δυνατή η φόρτωση της βιβλιοθήκης «%s»: κωδικός σφάλματος %lu" #: ../../common/restricted_token.c:73 #, c-format @@ -149,7 +151,7 @@ msgstr "δεν ήταν δυνατή η δημιουργία διακριτικ #: ../../common/restricted_token.c:140 #, c-format msgid "could not start process for command \"%s\": error code %lu" -msgstr "δεν ήταν δυνατή η εκκίνηση διεργασίας για την εντολή “%s”: κωδικός σφάλματος %lu" +msgstr "δεν ήταν δυνατή η εκκίνηση διεργασίας για την εντολή «%s»: κωδικός σφάλματος %lu" #: ../../common/restricted_token.c:178 #, c-format @@ -164,12 +166,12 @@ msgstr "δεν ήταν δυνατή η απόκτηση κωδικού εξόδ #: ../../common/rmtree.c:79 #, c-format msgid "could not stat file or directory \"%s\": %m" -msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο ή κατάλογο “%s”: %m" +msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο ή κατάλογο «%s»: %m" #: ../../common/rmtree.c:101 ../../common/rmtree.c:113 #, c-format msgid "could not remove file or directory \"%s\": %m" -msgstr "δεν ήταν δυνατή η αφαίρεση αρχείου ή καταλόγου “%s”: %m" +msgstr "δεν ήταν δυνατή η αφαίρεση αρχείου ή καταλόγου «%s»: %m" #: ../../common/username.c:43 #, c-format @@ -218,108 +220,108 @@ msgstr "απόγονος διεργασίας τερμάτισε με μη αν #: ../../port/dirmod.c:221 #, c-format msgid "could not set junction for \"%s\": %s\n" -msgstr "δεν ήταν δυνατός ο ορισμός διασταύρωσης για “%s”: %s\n" +msgstr "δεν ήταν δυνατός ο ορισμός διασταύρωσης για «%s»: %s\n" #: ../../port/dirmod.c:298 #, c-format msgid "could not get junction for \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η απόκτηση διασταύρωσης για “%s”: %s\n" +msgstr "δεν ήταν δυνατή η απόκτηση διασταύρωσης για «%s»: %s\n" -#: initdb.c:461 initdb.c:1493 +#: initdb.c:464 initdb.c:1496 #, c-format msgid "could not open file \"%s\" for reading: %m" -msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου “%s” για ανάγνωση: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου «%s» για ανάγνωση: %m" -#: initdb.c:505 initdb.c:827 initdb.c:853 +#: initdb.c:508 initdb.c:830 initdb.c:856 #, c-format msgid "could not open file \"%s\" for writing: %m" -msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου “%s” για εγγραφή: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου «%s» για εγγραφή: %m" -#: initdb.c:512 initdb.c:519 initdb.c:833 initdb.c:858 +#: initdb.c:515 initdb.c:522 initdb.c:836 initdb.c:861 #, c-format msgid "could not write file \"%s\": %m" -msgstr "δεν ήταν δυνατή η εγγραφή αρχείου “%s”: %m" +msgstr "δεν ήταν δυνατή η εγγραφή αρχείου «%s»: %m" -#: initdb.c:537 +#: initdb.c:540 #, c-format msgid "could not execute command \"%s\": %m" -msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής “%s”: %m" +msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής «%s»: %m" -#: initdb.c:555 +#: initdb.c:558 #, c-format msgid "removing data directory \"%s\"" -msgstr "αφαιρείται ο κατάλογος δεδομένων “%s”" +msgstr "αφαιρείται ο κατάλογος δεδομένων «%s»" -#: initdb.c:557 +#: initdb.c:560 #, c-format msgid "failed to remove data directory" msgstr "απέτυχε η αφαίρεση καταλόγου δεδομένων" -#: initdb.c:561 +#: initdb.c:564 #, c-format msgid "removing contents of data directory \"%s\"" -msgstr "αφαιρούνται περιεχόμενα του καταλόγου δεδομένων “%s”" +msgstr "αφαιρούνται περιεχόμενα του καταλόγου δεδομένων «%s»" -#: initdb.c:564 +#: initdb.c:567 #, c-format msgid "failed to remove contents of data directory" msgstr "απέτυχε η αφαίρεση περιεχομένων του καταλόγου δεδομένων" -#: initdb.c:569 +#: initdb.c:572 #, c-format msgid "removing WAL directory \"%s\"" -msgstr "αφαίρεση καταλόγου WAL “%s”" +msgstr "αφαίρεση καταλόγου WAL «%s»" -#: initdb.c:571 +#: initdb.c:574 #, c-format msgid "failed to remove WAL directory" msgstr "απέτυχε η αφαίρεση καταλόγου WAL" -#: initdb.c:575 +#: initdb.c:578 #, c-format msgid "removing contents of WAL directory \"%s\"" -msgstr "αφαιρούνται τα περιεχόμενα του καταλόγου WAL “%s”" +msgstr "αφαιρούνται τα περιεχόμενα του καταλόγου WAL «%s»" -#: initdb.c:577 +#: initdb.c:580 #, c-format msgid "failed to remove contents of WAL directory" msgstr "απέτυχε η αφαίρεση περιεχόμενων του καταλόγου WAL" -#: initdb.c:584 +#: initdb.c:587 #, c-format msgid "data directory \"%s\" not removed at user's request" -msgstr "ο κατάλογος δεδομένων “%s” δεν αφαιρείται κατα απαίτηση του χρήστη" +msgstr "ο κατάλογος δεδομένων «%s» δεν αφαιρείται κατα απαίτηση του χρήστη" -#: initdb.c:588 +#: initdb.c:591 #, c-format msgid "WAL directory \"%s\" not removed at user's request" -msgstr "κατάλογος WAL “%s” δεν αφαιρέθηκε κατά απαίτηση του χρήστη" +msgstr "ο κατάλογος WAL «%s» δεν αφαιρέθηκε κατά απαίτηση του χρήστη" -#: initdb.c:606 +#: initdb.c:609 #, c-format msgid "cannot be run as root" msgstr "δεν δύναται η εκτέλεση ως υπερχρήστης" -#: initdb.c:608 +#: initdb.c:611 #, c-format msgid "" "Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" "own the server process.\n" msgstr "" -"Παρακαλώ συνδεθείτε (χρησιμοποιώντας, π.χ. την εντολή “su”) ως ο (μη προνομιούχος) χρήστης που θα\n" +"Παρακαλώ συνδεθείτε (χρησιμοποιώντας, π.χ. την εντολή «su») ως ο (μη προνομιούχος) χρήστης που θα\n" "είναι κάτοχος της διεργασίας του διακομιστή.\n" -#: initdb.c:641 +#: initdb.c:644 #, c-format msgid "\"%s\" is not a valid server encoding name" -msgstr "“%s” δεν είναι έγκυρο όνομα κωδικοποίησης διακομιστή" +msgstr "«%s» δεν είναι έγκυρο όνομα κωδικοποίησης διακομιστή" -#: initdb.c:786 +#: initdb.c:789 #, c-format msgid "file \"%s\" does not exist" -msgstr "το αρχείο “%s” δεν υπάρχει" +msgstr "το αρχείο «%s» δεν υπάρχει" -#: initdb.c:788 initdb.c:795 initdb.c:804 +#: initdb.c:791 initdb.c:798 initdb.c:807 #, c-format msgid "" "This might mean you have a corrupted installation or identified\n" @@ -328,124 +330,124 @@ msgstr "" "Αυτό μπορεί να σημαίνει ότι έχετε μια κατεστραμμένη εγκατάσταση ή\n" "ορίσατε λάθος κατάλογο με την επιλογή επίκλησης -L.\n" -#: initdb.c:793 +#: initdb.c:796 #, c-format msgid "could not access file \"%s\": %m" -msgstr "δεν ήταν δυνατή η πρόσβαση του αρχείο “%s”: %m" +msgstr "δεν ήταν δυνατή η πρόσβαση του αρχείο «%s»: %m" -#: initdb.c:802 +#: initdb.c:805 #, c-format msgid "file \"%s\" is not a regular file" -msgstr "το αρχείο “%s” δεν είναι ένα κανονικό αρχείο" +msgstr "το αρχείο «%s» δεν είναι ένα κανονικό αρχείο" -#: initdb.c:947 +#: initdb.c:950 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "επιλογή εφαρμογής δυναμικής κοινόχρηστης μνήμης ... " -#: initdb.c:956 +#: initdb.c:959 #, c-format msgid "selecting default max_connections ... " -msgstr "επιλογή προκαθορισμένης τιμής max_connections … " +msgstr "επιλογή προκαθορισμένης τιμής max_connections ... " -#: initdb.c:987 +#: initdb.c:990 #, c-format msgid "selecting default shared_buffers ... " -msgstr "επιλογή προκαθορισμένης τιμής shared_buffers … " +msgstr "επιλογή προκαθορισμένης τιμής shared_buffers ... " -#: initdb.c:1021 +#: initdb.c:1024 #, c-format msgid "selecting default time zone ... " -msgstr "επιλογή προκαθορισμένης ζώνης ώρας … " +msgstr "επιλογή προκαθορισμένης ζώνης ώρας ... " -#: initdb.c:1055 +#: initdb.c:1058 msgid "creating configuration files ... " -msgstr "δημιουργία αρχείων ρύθμισης … " +msgstr "δημιουργία αρχείων ρύθμισης ... " -#: initdb.c:1214 initdb.c:1233 initdb.c:1319 initdb.c:1334 +#: initdb.c:1217 initdb.c:1236 initdb.c:1322 initdb.c:1337 #, c-format msgid "could not change permissions of \"%s\": %m" -msgstr "δεν ήταν δυνατή η αλλαγή δικαιωμάτων του “%s”: %m" +msgstr "δεν ήταν δυνατή η αλλαγή δικαιωμάτων του «%s»: %m" -#: initdb.c:1356 +#: initdb.c:1359 #, c-format msgid "running bootstrap script ... " -msgstr "εκτέλεση σεναρίου bootstrap … " +msgstr "εκτέλεση σεναρίου bootstrap ... " -#: initdb.c:1368 +#: initdb.c:1371 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" -msgstr "το αρχείο εισόδου “%s” δεν ανήκει στην PostgreSQL %s" +msgstr "το αρχείο εισόδου «%s» δεν ανήκει στην PostgreSQL %s" -#: initdb.c:1371 +#: initdb.c:1374 #, c-format msgid "Check your installation or specify the correct path using the option -L.\n" msgstr "Ελέγξτε την εγκατάστασή σας ή καθορίστε τη σωστή διαδρομή χρησιμοποιώντας την επιλογή -L.\n" -#: initdb.c:1470 +#: initdb.c:1473 msgid "Enter new superuser password: " msgstr "Εισάγετε νέο κωδικό πρόσβασης υπερχρήστη: " -#: initdb.c:1471 +#: initdb.c:1474 msgid "Enter it again: " msgstr "Εισάγετε ξανά: " -#: initdb.c:1474 +#: initdb.c:1477 #, c-format msgid "Passwords didn't match.\n" msgstr "Οι κωδικοί πρόσβασης δεν είναι ίδιοι.\n" -#: initdb.c:1501 +#: initdb.c:1504 #, c-format msgid "could not read password from file \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση κωδικού πρόσβασης από το αρχείο “%s”: %m" +msgstr "δεν ήταν δυνατή η ανάγνωση κωδικού πρόσβασης από το αρχείο «%s»: %m" -#: initdb.c:1504 +#: initdb.c:1507 #, c-format msgid "password file \"%s\" is empty" -msgstr "αρχείο κωδικών πρόσβασης “%s” είναι άδειο" +msgstr "αρχείο κωδικών πρόσβασης «%s» είναι άδειο" -#: initdb.c:1995 +#: initdb.c:1998 #, c-format msgid "caught signal\n" msgstr "συνελήφθει σήμα\n" -#: initdb.c:2001 +#: initdb.c:2004 #, c-format msgid "could not write to child process: %s\n" msgstr "δεν ήταν δυνατή η εγγραφή στην απογονική διεργασία: %s\n" -#: initdb.c:2009 +#: initdb.c:2012 #, c-format msgid "ok\n" msgstr "εντάξει\n" -#: initdb.c:2099 +#: initdb.c:2102 #, c-format msgid "setlocale() failed" -msgstr "εντολή setlocale() απέτυχε" +msgstr "setlocale() απέτυχε" -#: initdb.c:2120 +#: initdb.c:2123 #, c-format msgid "failed to restore old locale \"%s\"" -msgstr "απέτυχε να επαναφέρει την παλαιά εντοπιότητα “%s”" +msgstr "απέτυχε να επαναφέρει την παλαιά εντοπιότητα «%s»" -#: initdb.c:2129 +#: initdb.c:2132 #, c-format msgid "invalid locale name \"%s\"" -msgstr "άκυρη ονομασία εντοπιότητας “%s”" +msgstr "άκυρη ονομασία εντοπιότητας «%s»" -#: initdb.c:2140 +#: initdb.c:2143 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "μη έγκυρες ρυθμίσεις εντοπιότητας, ελέγξτε τις μεταβλητές περιβάλλοντος LANG και LC_*" -#: initdb.c:2167 +#: initdb.c:2170 #, c-format msgid "encoding mismatch" msgstr "αναντιστοιχία κωδικοποίησης" -#: initdb.c:2169 +#: initdb.c:2172 #, c-format msgid "" "The encoding you selected (%s) and the encoding that the\n" @@ -460,7 +462,7 @@ msgstr "" "Επανεκτελέστε %s και είτε μην καθορίσετε ρητά κωδικοποίηση,\n" "ή επιλέξτε έναν ταιριαστό συνδυασμό.\n" -#: initdb.c:2241 +#: initdb.c:2244 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -469,17 +471,17 @@ msgstr "" "%s αρχικοποιεί μία συστάδα PostgreSQL βάσης δεδομένων.\n" "\n" -#: initdb.c:2242 +#: initdb.c:2245 #, c-format msgid "Usage:\n" msgstr "Χρήση:\n" -#: initdb.c:2243 +#: initdb.c:2246 #, c-format msgid " %s [OPTION]... [DATADIR]\n" -msgstr " %s [ΕΠΙΛΟΓΕΣ]… [DATADIR]\n" +msgstr " %s [ΕΠΙΛΟΓH]... [DATADIR]\n" -#: initdb.c:2244 +#: initdb.c:2247 #, c-format msgid "" "\n" @@ -488,47 +490,47 @@ msgstr "" "\n" "Επιλογές:\n" -#: initdb.c:2245 +#: initdb.c:2248 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" -msgstr " -A, —auth=METHOD προκαθορισμένη μέθοδος ταυτοποίησης για τοπικές συνδέσεις\n" +msgstr " -A, --auth=METHOD προκαθορισμένη μέθοδος ταυτοποίησης για τοπικές συνδέσεις\n" -#: initdb.c:2246 +#: initdb.c:2249 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" -msgstr " —auth-host=METHOD προκαθορισμένη μέθοδος ταυτοποίησης για τοπικές συνδέσεις πρωτοκόλλου TCP/IP\n" +msgstr " --auth-host=METHOD προκαθορισμένη μέθοδος ταυτοποίησης για τοπικές συνδέσεις πρωτοκόλλου TCP/IP\n" -#: initdb.c:2247 +#: initdb.c:2250 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" -msgstr " —auth-local=METHOD προκαθορισμένη μέθοδος ταυτοποίησης για συνδέσεις τοπικής υποδοχής\n" +msgstr " --auth-local=METHOD προκαθορισμένη μέθοδος ταυτοποίησης για συνδέσεις τοπικής υποδοχής\n" -#: initdb.c:2248 +#: initdb.c:2251 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" -msgstr " [-D, —pgdata=]DATADIR τοποθεσία για αυτή τη συστάδα βάσης δεδομένων\n" +msgstr " [-D, --pgdata=]DATADIR τοποθεσία για αυτή τη συστάδα βάσης δεδομένων\n" -#: initdb.c:2249 +#: initdb.c:2252 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" -msgstr " -E, —encoding=ENCODING όρισε την προκαθορισμένη κωδικοποίηση για καινούριες βάσεις δεδομένων\n" +msgstr " -E, --encoding=ENCODING όρισε την προκαθορισμένη κωδικοποίηση για καινούριες βάσεις δεδομένων\n" -#: initdb.c:2250 +#: initdb.c:2253 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" -msgstr " -g, —allow-group-access επέτρεψε εγγραφή/ανάγνωση για την ομάδα στο κατάλογο δεδομένων\n" +msgstr " -g, --allow-group-access επέτρεψε εγγραφή/ανάγνωση για την ομάδα στο κατάλογο δεδομένων\n" -#: initdb.c:2251 +#: initdb.c:2254 #, c-format msgid " -k, --data-checksums use data page checksums\n" -msgstr " -k, —data-checksums χρησιμοποίησε αθροίσματα ελέγχου σελίδων δεδομένων\n" +msgstr " -k, --data-checksums χρησιμοποίησε αθροίσματα ελέγχου σελίδων δεδομένων\n" -#: initdb.c:2252 +#: initdb.c:2255 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" -msgstr " —locale=LOCALE όρισε την προκαθορισμένη εντοπιότητα για καινούριες βάσεις δεδομένων\n" +msgstr " --locale=LOCALE όρισε την προκαθορισμένη εντοπιότητα για καινούριες βάσεις δεδομένων\n" -#: initdb.c:2253 +#: initdb.c:2256 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -536,51 +538,51 @@ msgid "" " set default locale in the respective category for\n" " new databases (default taken from environment)\n" msgstr "" -" —lc-collate=, —lc-ctype=, —lc-messages=LOCALE\n" -" —lc-monetary=, —lc-numeric=, —lc-time=LOCALE\n" +" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" +" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n" " όρισε την προκαθορισμένη εντοπιότητα για τις σχετικές κατηγορίες\n" " καινούριων βάσεων δεδομένων (προκαθορισμένη τιμή διαβάζεται από το περιβάλλον)\n" -#: initdb.c:2257 +#: initdb.c:2260 #, c-format msgid " --no-locale equivalent to --locale=C\n" -msgstr " —no-locale ισοδύναμο με —locale=C\n" +msgstr " --no-locale ισοδύναμο με --locale=C\n" -#: initdb.c:2258 +#: initdb.c:2261 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" -msgstr " —pwfile=FILE διάβασε τον κωδικό πρόσβασης για τον νέο υπερχρήστη από το αρχείο\n" +msgstr " --pwfile=FILE διάβασε τον κωδικό πρόσβασης για τον νέο υπερχρήστη από το αρχείο\n" -#: initdb.c:2259 +#: initdb.c:2262 #, c-format msgid "" " -T, --text-search-config=CFG\n" " default text search configuration\n" msgstr "" -" -T, —text-search-config=CFG\n" +" -T, --text-search-config=CFG\n" " προκαθορισμένη ρύθμιση αναζήτησης κειμένου\n" -#: initdb.c:2261 +#: initdb.c:2264 #, c-format msgid " -U, --username=NAME database superuser name\n" -msgstr " -U, —username=NAME όνομα υπερχρήστη βάσης δεδομένων\n" +msgstr " -U, --username=NAME όνομα υπερχρήστη βάσης δεδομένων\n" -#: initdb.c:2262 +#: initdb.c:2265 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" -msgstr " -W, —pwprompt προτροπή για κωδικό πρόσβασης για τον νέο υπερχρήστη\n" +msgstr " -W, --pwprompt προτροπή για κωδικό πρόσβασης για τον νέο υπερχρήστη\n" -#: initdb.c:2263 +#: initdb.c:2266 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" -msgstr " -X, —waldir=WALDIR τοποθεσία για τον κατάλογο write-ahead log\n" +msgstr " -X, --waldir=WALDIR τοποθεσία για τον κατάλογο write-ahead log\n" -#: initdb.c:2264 +#: initdb.c:2267 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" -msgstr " —wal-segsize=SIZE μέγεθος των τμημάτων WAL, σε megabytes\n" +msgstr " --wal-segsize=SIZE μέγεθος των τμημάτων WAL, σε megabytes\n" -#: initdb.c:2265 +#: initdb.c:2268 #, c-format msgid "" "\n" @@ -589,43 +591,47 @@ msgstr "" "\n" "Λιγότερο συχνά χρησιμοποιούμενες επιλογές:\n" -#: initdb.c:2266 +#: initdb.c:2269 #, c-format msgid " -d, --debug generate lots of debugging output\n" -msgstr " -d, —debug δημιούργησε πολλές καταγραφές αποσφαλμάτωσης\n" +msgstr " -d, --debug δημιούργησε πολλές καταγραφές αποσφαλμάτωσης\n" -#: initdb.c:2267 +#: initdb.c:2270 +#, c-format +msgid " --discard-caches set debug_discard_caches=1\n" +msgstr " --discard-caches όρισε debug_discard_caches=1\n" + +#: initdb.c:2271 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRECTORY τοποθεσία εύρεσης αρχείων εισόδου\n" -#: initdb.c:2268 +#: initdb.c:2272 #, c-format msgid " -n, --no-clean do not clean up after errors\n" -msgstr " -n, —no-clean να μην καθαριστούν σφάλματα\n" +msgstr " -n, --no-clean να μην καθαριστούν σφάλματα\n" -#: initdb.c:2269 +#: initdb.c:2273 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" -msgstr " -N, —no-sync να μην αναμένει την ασφαλή εγγραφή αλλαγών στον δίσκο\n" +msgstr " -N, --no-sync να μην αναμένει την ασφαλή εγγραφή αλλαγών στον δίσκο\n" -#: initdb.c:2270 -#, fuzzy, c-format -#| msgid " --no-subscriptions do not restore subscriptions\n" +#: initdb.c:2274 +#, c-format msgid " --no-instructions do not print instructions for next steps\n" -msgstr " —no-publications να μην επαναφέρεις συνδρομές\n" +msgstr " --no-instructions να μην εκτυπώσει οδηγίες για τα επόμενα βήματα\n" -#: initdb.c:2271 +#: initdb.c:2275 #, c-format msgid " -s, --show show internal settings\n" -msgstr " -s, —show δείξε τις εσωτερικές ρυθμίσεις\n" +msgstr " -s, --show δείξε τις εσωτερικές ρυθμίσεις\n" -#: initdb.c:2272 +#: initdb.c:2276 #, c-format msgid " -S, --sync-only only sync data directory\n" -msgstr " -S, —sync-only συγχρόνισε μόνο τον κατάλογο δεδομένων\n" +msgstr " -S, --sync-only συγχρόνισε μόνο τον κατάλογο δεδομένων\n" -#: initdb.c:2273 +#: initdb.c:2277 #, c-format msgid "" "\n" @@ -634,17 +640,17 @@ msgstr "" "\n" "Άλλες επιλογές:\n" -#: initdb.c:2274 +#: initdb.c:2278 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, —version δείξε πληροφορίες έκδοσης και έξοδος\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" -#: initdb.c:2275 +#: initdb.c:2279 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, —help δείξε αυτό το μήνυμα βοήθειας και μετά έξοδος\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" -#: initdb.c:2276 +#: initdb.c:2280 #, c-format msgid "" "\n" @@ -655,7 +661,7 @@ msgstr "" "Εάν δεν έχει καθοριστεί ο κατάλογος δεδομένων, χρησιμοποιείται η\n" "μεταβλητή περιβάλλοντος PGDATA.\n" -#: initdb.c:2278 +#: initdb.c:2282 #, c-format msgid "" "\n" @@ -664,28 +670,27 @@ msgstr "" "\n" "Υποβάλετε αναφορές σφάλματων σε <%s>.\n" -#: initdb.c:2279 +#: initdb.c:2283 #, c-format msgid "%s home page: <%s>\n" msgstr "%s αρχική σελίδα: <%s>\n" -#: initdb.c:2307 +#: initdb.c:2311 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" -msgstr "μη έγκυρη μέθοδος ταυτοποίησης “%s” για συνδέσεις “%s”" +msgstr "μη έγκυρη μέθοδος ταυτοποίησης «%s» για συνδέσεις «%s»" -#: initdb.c:2323 -#, fuzzy, c-format -#| msgid "must specify a password for the superuser to enable %s authentication" +#: initdb.c:2327 +#, c-format msgid "must specify a password for the superuser to enable password authentication" -msgstr "απαιτείται ο καθορισμός κωδικού πρόσβασης για τον υπερχρήστη για να την ενεργοποίηση του ελέγχου ταυτότητας %s" +msgstr "απαιτείται ο καθορισμός κωδικού πρόσβασης για τον υπερχρήστη για να την ενεργοποίηση του ελέγχου ταυτότητας κωδικού πρόσβασης" -#: initdb.c:2344 +#: initdb.c:2348 #, c-format msgid "no data directory specified" msgstr "δεν ορίστηκε κατάλογος δεδομένων" -#: initdb.c:2346 +#: initdb.c:2350 #, c-format msgid "" "You must identify the directory where the data for this database system\n" @@ -696,45 +701,44 @@ msgstr "" "το σύστημα βάσης δεδομένων. Αυτό μπορείτε να το κάνετε είτε με την επιλογή κλήσης -D\n" "ή με τη μεταβλητή περιβάλλοντος PGDATA.\n" -#: initdb.c:2364 -#, fuzzy, c-format -#| msgid "could not get server version" +#: initdb.c:2368 +#, c-format msgid "could not set environment" -msgstr "δεν ήταν δυνατή η απόκτηση έκδοσης διακομιστή" +msgstr "δεν ήταν δυνατή η ρύθμιση περιβάλλοντος" -#: initdb.c:2384 +#: initdb.c:2388 #, c-format msgid "" "The program \"%s\" is needed by %s but was not found in the\n" "same directory as \"%s\".\n" "Check your installation." msgstr "" -"Το πρόγραμμα \"%s\" απαιτείται από %s αλλά δεν βρέθηκε στο\n" -"ίδιος κατάλογος με το \"%s\".\n" +"Το πρόγραμμα «%s» απαιτείται από %s αλλά δεν βρέθηκε στον\n" +"ίδιο κατάλογο με το «%s».\n" "Ελέγξτε την εγκατάστασή σας." -#: initdb.c:2389 +#: initdb.c:2393 #, c-format msgid "" "The program \"%s\" was found by \"%s\"\n" "but was not the same version as %s.\n" "Check your installation." msgstr "" -"Το πρόγραμμα \"%s\" βρέθηκε από το \"%s\"\n" +"Το πρόγραμμα «%s» βρέθηκε από το \"%s\"\n" "αλλά δεν ήταν η ίδια εκδοχή με %s.\n" "Ελέγξτε την εγκατάστασή σας." -#: initdb.c:2408 +#: initdb.c:2412 #, c-format msgid "input file location must be an absolute path" msgstr "η τοποθεσία του αρχείου εισόδου πρέπει να είναι μία πλήρης διαδρομή" -#: initdb.c:2425 +#: initdb.c:2429 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" -msgstr "Η συστάδα βάσης δεδομένων θα αρχικοποιηθεί με εντοπιότητα “%s”.\n" +msgstr "Η συστάδα βάσης δεδομένων θα αρχικοποιηθεί με εντοπιότητα «%s».\n" -#: initdb.c:2428 +#: initdb.c:2432 #, c-format msgid "" "The database cluster will be initialized with locales\n" @@ -753,95 +757,95 @@ msgstr "" " NUMERIC: %s\n" " TIME: %s\n" -#: initdb.c:2452 +#: initdb.c:2456 #, c-format msgid "could not find suitable encoding for locale \"%s\"" -msgstr "δεν μπόρεσε να βρεθεί κατάλληλη κωδικοποίηση για την εντοπιότητα “%s”" +msgstr "δεν μπόρεσε να βρεθεί κατάλληλη κωδικοποίηση για την εντοπιότητα «%s»" -#: initdb.c:2454 +#: initdb.c:2458 #, c-format msgid "Rerun %s with the -E option.\n" msgstr "Επανεκτελέστε %s με την επιλογή -E.\n" -#: initdb.c:2455 initdb.c:3089 initdb.c:3110 +#: initdb.c:2459 initdb.c:3099 initdb.c:3120 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Δοκιμάστε “%s —help” για περισσότερες πληροφορίες.\n" +msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n" -#: initdb.c:2468 +#: initdb.c:2472 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" "The default database encoding will be set to \"%s\" instead.\n" msgstr "" -"Η κωδικοποίηση \"%s\" που υπονοείται από τις τοπικές ρυθμίσεις δεν επιτρέπεται ως κωδικοποίηση από την πλευρά του διακομιστή.\n" -"Η προεπιλεγμένη κωδικοποίηση βάσης δεδομένων θα οριστεί σε \"%s\".\n" +"Η κωδικοποίηση «%s» που υπονοείται από τις τοπικές ρυθμίσεις δεν επιτρέπεται ως κωδικοποίηση από την πλευρά του διακομιστή.\n" +"Η προεπιλεγμένη κωδικοποίηση βάσης δεδομένων θα οριστεί σε «%s».\n" -#: initdb.c:2473 +#: initdb.c:2477 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" -msgstr "εντοπιότητα “%s” προαπαιτεί τη μην υποστηριζόμενη κωδικοποίηση“%s”" +msgstr "εντοπιότητα «%s» προαπαιτεί τη μην υποστηριζόμενη κωδικοποίηση«%s»" -#: initdb.c:2476 +#: initdb.c:2480 #, c-format msgid "" "Encoding \"%s\" is not allowed as a server-side encoding.\n" "Rerun %s with a different locale selection.\n" msgstr "" -"Η κωδικοποίηση \"%s\" δεν επιτρέπεται ως κωδικοποίηση από την πλευρά του διακομιστή.\n" +"Η κωδικοποίηση «%s» δεν επιτρέπεται ως κωδικοποίηση από την πλευρά του διακομιστή.\n" "Επανεκτελέστε %s με διαφορετική επιλογή εντοπιότητας.\n" -#: initdb.c:2485 +#: initdb.c:2489 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" -msgstr "Η προεπιλεγμένη κωδικοποίηση βάσης δεδομένων έχει οριστεί ως \"%s\".\n" +msgstr "Η προεπιλεγμένη κωδικοποίηση βάσης δεδομένων έχει οριστεί ως «%s».\n" -#: initdb.c:2551 +#: initdb.c:2555 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" -msgstr "δεν ήταν δυνατή η εύρεση κατάλληλων ρυθμίσεων για την μηχανή αναζήτησης για την εντοπιότητα “%s”" +msgstr "δεν ήταν δυνατή η εύρεση κατάλληλων ρυθμίσεων για την μηχανή αναζήτησης για την εντοπιότητα «%s»" -#: initdb.c:2562 +#: initdb.c:2566 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" -msgstr "οι κατάλληλες ρυθμίσεις για την μηχανή αναζήτησης για την εντοπιότητα “%s” δεν είναι γνωστές" +msgstr "οι κατάλληλες ρυθμίσεις για την μηχανή αναζήτησης για την εντοπιότητα «%s» δεν είναι γνωστές" -#: initdb.c:2567 +#: initdb.c:2571 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" -msgstr "η ορισμένη ρύθμιση μηχανής αναζήτησης “%s” μπορεί να μην ταιριάζει με την εντοπιότητα “%s”" +msgstr "η ορισμένη ρύθμιση μηχανής αναζήτησης «%s» μπορεί να μην ταιριάζει με την εντοπιότητα «%s»" -#: initdb.c:2572 +#: initdb.c:2576 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" -msgstr "Η προκαθορισμένη ρύθμιση μηχανής αναζήτησης θα οριστεί ως “%s”.\n" +msgstr "Η προκαθορισμένη ρύθμιση μηχανής αναζήτησης θα οριστεί ως «%s».\n" -#: initdb.c:2616 initdb.c:2698 +#: initdb.c:2620 initdb.c:2702 #, c-format msgid "creating directory %s ... " -msgstr "δημιουργία καταλόγου %s …" +msgstr "δημιουργία καταλόγου %s ... " -#: initdb.c:2622 initdb.c:2704 initdb.c:2769 initdb.c:2831 +#: initdb.c:2626 initdb.c:2708 initdb.c:2773 initdb.c:2835 #, c-format msgid "could not create directory \"%s\": %m" -msgstr "δεν ήταν δυνατή η δημιουργία του καταλόγου “%s”: %m" +msgstr "δεν ήταν δυνατή η δημιουργία του καταλόγου «%s»: %m" -#: initdb.c:2633 initdb.c:2716 +#: initdb.c:2637 initdb.c:2720 #, c-format msgid "fixing permissions on existing directory %s ... " -msgstr "διορθώνονται τα δικαιώματα του υπάρχοντος καταλόγου %s … " +msgstr "διορθώνονται τα δικαιώματα του υπάρχοντος καταλόγου %s ... " -#: initdb.c:2639 initdb.c:2722 +#: initdb.c:2643 initdb.c:2726 #, c-format msgid "could not change permissions of directory \"%s\": %m" -msgstr "δεν ήταν δυνατή η αλλαγή δικαιωμάτων του καταλόγου “%s”: %m" +msgstr "δεν ήταν δυνατή η αλλαγή δικαιωμάτων του καταλόγου «%s»: %m" -#: initdb.c:2653 initdb.c:2736 +#: initdb.c:2657 initdb.c:2740 #, c-format msgid "directory \"%s\" exists but is not empty" -msgstr "ο κατάλογος “%s” υπάρχει και δεν είναι άδειος" +msgstr "ο κατάλογος «%s» υπάρχει και δεν είναι άδειος" -#: initdb.c:2658 +#: initdb.c:2662 #, c-format msgid "" "If you want to create a new database system, either remove or empty\n" @@ -852,46 +856,46 @@ msgstr "" "τον κατάλογο \"%s\" ή εκτελέστε %s\n" "με διαφορετική παράμετρο από \"%s\".\n" -#: initdb.c:2666 initdb.c:2748 initdb.c:3125 +#: initdb.c:2670 initdb.c:2752 initdb.c:3135 #, c-format msgid "could not access directory \"%s\": %m" -msgstr "δεν ήταν δυνατή η πρόσβαση του καταλόγου “%s”: %m" +msgstr "δεν ήταν δυνατή η πρόσβαση του καταλόγου «%s»: %m" -#: initdb.c:2689 +#: initdb.c:2693 #, c-format msgid "WAL directory location must be an absolute path" msgstr "η τοποθεσία του καταλόγου WAL πρέπει να είναι μία πλήρης διαδρομή" -#: initdb.c:2741 +#: initdb.c:2745 #, c-format msgid "" "If you want to store the WAL there, either remove or empty the directory\n" "\"%s\".\n" msgstr "" "Εάν θέλετε να αποθηκεύσετε το WAL εκεί, είτε αφαιρέστε ή αδειάστε τον κατάλογο\n" -"\"%s\".\n" +"«%s».\n" -#: initdb.c:2755 +#: initdb.c:2759 #, c-format msgid "could not create symbolic link \"%s\": %m" -msgstr "δεν ήταν δυνατή η δημιουργία του συμβολικού συνδέσμου “%s”: %m" +msgstr "δεν ήταν δυνατή η δημιουργία του συμβολικού συνδέσμου «%s»: %m" -#: initdb.c:2760 +#: initdb.c:2764 #, c-format msgid "symlinks are not supported on this platform" msgstr "συμβολικοί σύνδεσμοι δεν υποστηρίζονται στην παρούσα πλατφόρμα" -#: initdb.c:2784 +#: initdb.c:2788 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n" msgstr "Περιέχει ένα αρχείο με πρόθεμα κουκκίδας/αόρατο, ίσως λόγω του ότι είναι ένα σημείο προσάρτησης.\n" -#: initdb.c:2787 +#: initdb.c:2791 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point.\n" msgstr "Περιέχει έναν κατάλογο lost+found, ίσως επειδή είναι ένα σημείο προσάρτησης.\n" -#: initdb.c:2790 +#: initdb.c:2794 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -900,76 +904,76 @@ msgstr "" "Δεν προτείνεται η άμεση χρήση ενός σημείου προσάρτησης ως καταλόγου δεδομένων.\n" "Δημιουργείστε έναν υποκατάλογο υπό του σημείου προσάρτησης.\n" -#: initdb.c:2816 +#: initdb.c:2820 #, c-format msgid "creating subdirectories ... " -msgstr "δημιουργία υποκαταλόγων …" +msgstr "δημιουργία υποκαταλόγων ... " -#: initdb.c:2862 +#: initdb.c:2866 msgid "performing post-bootstrap initialization ... " -msgstr "πραγματοποίηση σταδίου αρχικοποίησης post-bootstrap … " +msgstr "πραγματοποίηση σταδίου αρχικοποίησης post-bootstrap ... " -#: initdb.c:3024 +#: initdb.c:3029 #, c-format msgid "Running in debug mode.\n" msgstr "Εκτέλεση σε λειτουργία αποσφαλμάτωσης.\n" -#: initdb.c:3028 +#: initdb.c:3033 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" -msgstr "Εκτέλεση σε λειτουργία μη καθαρισμού. Τα σφάλματα δεν θα καθαριστούν.\n" +msgstr "Εκτέλεση σε λειτουργία μη καθαρισμού. Τα σφάλματα δεν θα καθαριστούν.\n" -#: initdb.c:3108 +#: initdb.c:3118 #, c-format msgid "too many command-line arguments (first is \"%s\")" -msgstr "πάρα πολλοί παραμέτροι εισόδου από την γραμμή εντολών (ο πρώτη είναι η “%s”)" +msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)" -#: initdb.c:3129 initdb.c:3218 +#: initdb.c:3139 initdb.c:3228 msgid "syncing data to disk ... " -msgstr "συγχρονίζονται δεδομένα στο δίσκο … " +msgstr "συγχρονίζονται δεδομένα στο δίσκο ... " -#: initdb.c:3138 +#: initdb.c:3148 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "η προτροπή κωδικού εισόδου και το αρχείο κωδικού εισόδου δεν δύναται να οριστούν ταυτόχρονα" -#: initdb.c:3163 +#: initdb.c:3173 #, c-format msgid "argument of --wal-segsize must be a number" -msgstr "η παράμετρος —wal-segsize πρέπει να είναι αριθμός" +msgstr "η παράμετρος --wal-segsize πρέπει να είναι αριθμός" -#: initdb.c:3168 +#: initdb.c:3178 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "η παράμετρος —wal-segsize πρέπει να έχει τιμή δύναμης 2 μεταξύ 1 και 1024" +msgstr "η παράμετρος --wal-segsize πρέπει να έχει τιμή δύναμης 2 μεταξύ 1 και 1024" -#: initdb.c:3185 +#: initdb.c:3195 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" -msgstr "το όνομα υπερχρήστη “%s” δεν επιτρέπεται, τα ονόματα ρόλων δεν δύναται να αρχίζουν με “pg_”" +msgstr "το όνομα υπερχρήστη «%s» δεν επιτρέπεται, τα ονόματα ρόλων δεν δύναται να αρχίζουν με «pg_»" -#: initdb.c:3189 +#: initdb.c:3199 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" "This user must also own the server process.\n" "\n" msgstr "" -"Τα αρχεία που ανήκουν σε αυτό το σύστημα βάσης δεδομένων θα ανήκουν στο χρήστη \"%s\".\n" +"Τα αρχεία που ανήκουν σε αυτό το σύστημα βάσης δεδομένων θα ανήκουν στο χρήστη «%s».\n" "Αυτός ο χρήστης πρέπει επίσης να κατέχει τη διαδικασία διακομιστή.\n" "\n" -#: initdb.c:3205 +#: initdb.c:3215 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Τα αθροίσματα ελέγχου σελίδων δεδομένων είναι ενεργοποιημένα.\n" -#: initdb.c:3207 +#: initdb.c:3217 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Τα αθροίσματα ελέγχου των σελίδων δεδομένων είναι απενεργοποιημένα.\n" -#: initdb.c:3224 +#: initdb.c:3234 #, c-format msgid "" "\n" @@ -980,26 +984,26 @@ msgstr "" "Ο συγχρονισμός με το δίσκο παραλείφθηκε.\n" "Ο κατάλογος δεδομένων ενδέχεται να αλλοιωθεί εάν καταρρεύσει το λειτουργικού συστήματος.\n" -#: initdb.c:3229 +#: initdb.c:3239 #, c-format msgid "enabling \"trust\" authentication for local connections" -msgstr "ενεργοποιείται η μέθοδος ταυτοποίησης “trust” για τοπικές συνδέσεις" +msgstr "ενεργοποιείται η μέθοδος ταυτοποίησης «trust» για τοπικές συνδέσεις" -#: initdb.c:3230 +#: initdb.c:3240 #, c-format msgid "" "You can change this by editing pg_hba.conf or using the option -A, or\n" "--auth-local and --auth-host, the next time you run initdb.\n" msgstr "" "Μπορείτε να το αλλάξετε αυτό με την επεξεργασία pg_hba.conf ή χρησιμοποιώντας την επιλογή -A, ή\n" -"--auth-τοπικό και --auth-host, την επόμενη φορά που θα εκτελέσετε initdb.\n" +"--auth-local και --auth-host, την επόμενη φορά που θα εκτελέσετε initdb.\n" #. translator: This is a placeholder in a shell command. -#: initdb.c:3260 +#: initdb.c:3270 msgid "logfile" msgstr "logfile" -#: initdb.c:3262 +#: initdb.c:3272 #, c-format msgid "" "\n" @@ -1015,4 +1019,7 @@ msgstr "" "\n" #~ msgid "pclose failed: %m" -#~ msgstr "απέτυχε η εντολή pclose: %m" +#~ msgstr "απέτυχε η εντολή pclose: %m" + +#~ msgid " --clobber-cache use cache-clobbering debug option\n" +#~ msgstr " --clobber-cache χρησιμοποίησε την επιλογή εντοπισμού σφαλμάτων cache-clobbering\n" diff --git a/src/bin/initdb/po/es.po b/src/bin/initdb/po/es.po index deb8505a0e..429e77180f 100644 --- a/src/bin/initdb/po/es.po +++ b/src/bin/initdb/po/es.po @@ -1,24 +1,24 @@ # Spanish translation of initdb. # -# Copyright (c) 2004-2019, PostgreSQL Global Development Group +# Copyright (c) 2004-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Álvaro Herrera , 2004-2013 -# Carlos Chapi , 2014-2021 +# Carlos Chapi , 2014, 2021 # msgid "" msgstr "" -"Project-Id-Version: initdb (PostgreSQL) 12\n" +"Project-Id-Version: initdb (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-14 19:47+0000\n" -"PO-Revision-Date: 2021-05-19 22:22-0500\n" +"POT-Creation-Date: 2021-10-13 22:16+0000\n" +"PO-Revision-Date: 2021-10-13 23:44-0500\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: BlackCAT 1.1\n" #: ../../../src/common/logging.c:259 #, c-format @@ -71,7 +71,7 @@ msgid "%s() failed: %m" msgstr "%s() falló: %m" #: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 -#: initdb.c:328 +#: initdb.c:331 #, c-format msgid "out of memory" msgstr "memoria agotada" @@ -227,82 +227,82 @@ msgstr "no se pudo definir un junction para «%s»: %s\n" msgid "could not get junction for \"%s\": %s\n" msgstr "no se pudo obtener junction para «%s»: %s\n" -#: initdb.c:461 initdb.c:1493 +#: initdb.c:464 initdb.c:1496 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "no se pudo abrir archivo «%s» para lectura: %m" -#: initdb.c:505 initdb.c:827 initdb.c:853 +#: initdb.c:508 initdb.c:830 initdb.c:856 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "no se pudo abrir el archivo «%s» para escritura: %m" -#: initdb.c:512 initdb.c:519 initdb.c:833 initdb.c:858 +#: initdb.c:515 initdb.c:522 initdb.c:836 initdb.c:861 #, c-format msgid "could not write file \"%s\": %m" msgstr "no se pudo escribir el archivo «%s»: %m" -#: initdb.c:537 +#: initdb.c:540 #, c-format msgid "could not execute command \"%s\": %m" msgstr "no se pudo ejecutar la orden «%s»: %m" -#: initdb.c:555 +#: initdb.c:558 #, c-format msgid "removing data directory \"%s\"" msgstr "eliminando el directorio de datos «%s»" -#: initdb.c:557 +#: initdb.c:560 #, c-format msgid "failed to remove data directory" msgstr "no se pudo eliminar el directorio de datos" -#: initdb.c:561 +#: initdb.c:564 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "eliminando el contenido del directorio «%s»" -#: initdb.c:564 +#: initdb.c:567 #, c-format msgid "failed to remove contents of data directory" msgstr "no se pudo eliminar el contenido del directorio de datos" -#: initdb.c:569 +#: initdb.c:572 #, c-format msgid "removing WAL directory \"%s\"" msgstr "eliminando el directorio de WAL «%s»" -#: initdb.c:571 +#: initdb.c:574 #, c-format msgid "failed to remove WAL directory" msgstr "no se pudo eliminar el directorio de WAL" -#: initdb.c:575 +#: initdb.c:578 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "eliminando el contenido del directorio de WAL «%s»" -#: initdb.c:577 +#: initdb.c:580 #, c-format msgid "failed to remove contents of WAL directory" msgstr "no se pudo eliminar el contenido del directorio de WAL" -#: initdb.c:584 +#: initdb.c:587 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "directorio de datos «%s» no eliminado a petición del usuario" -#: initdb.c:588 +#: initdb.c:591 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "directorio de WAL «%s» no eliminado a petición del usuario" -#: initdb.c:606 +#: initdb.c:609 #, c-format msgid "cannot be run as root" msgstr "no se puede ejecutar como «root»" -#: initdb.c:608 +#: initdb.c:611 #, c-format msgid "" "Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" @@ -311,17 +311,17 @@ msgstr "" "Por favor conéctese (usando, por ejemplo, «su») con un usuario no privilegiado,\n" "quien ejecutará el proceso servidor.\n" -#: initdb.c:641 +#: initdb.c:644 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "«%s» no es un nombre válido de codificación" -#: initdb.c:786 +#: initdb.c:789 #, c-format msgid "file \"%s\" does not exist" msgstr "el archivo «%s» no existe" -#: initdb.c:788 initdb.c:795 initdb.c:804 +#: initdb.c:791 initdb.c:798 initdb.c:807 #, c-format msgid "" "This might mean you have a corrupted installation or identified\n" @@ -330,124 +330,124 @@ msgstr "" "Esto puede significar que tiene una instalación corrupta o ha\n" "identificado el directorio equivocado con la opción -L.\n" -#: initdb.c:793 +#: initdb.c:796 #, c-format msgid "could not access file \"%s\": %m" msgstr "no se pudo acceder al archivo «%s»: %m" -#: initdb.c:802 +#: initdb.c:805 #, c-format msgid "file \"%s\" is not a regular file" msgstr "el archivo «%s» no es un archivo regular" -#: initdb.c:947 +#: initdb.c:950 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "seleccionando implementación de memoria compartida dinámica ... " -#: initdb.c:956 +#: initdb.c:959 #, c-format msgid "selecting default max_connections ... " msgstr "seleccionando el valor para max_connections ... " -#: initdb.c:987 +#: initdb.c:990 #, c-format msgid "selecting default shared_buffers ... " msgstr "seleccionando el valor para shared_buffers ... " -#: initdb.c:1021 +#: initdb.c:1024 #, c-format msgid "selecting default time zone ... " msgstr "seleccionando el huso horario por omisión ... " -#: initdb.c:1055 +#: initdb.c:1058 msgid "creating configuration files ... " msgstr "creando archivos de configuración ... " -#: initdb.c:1214 initdb.c:1233 initdb.c:1319 initdb.c:1334 +#: initdb.c:1217 initdb.c:1236 initdb.c:1322 initdb.c:1337 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "no se pudo cambiar los permisos de «%s»: %m" -#: initdb.c:1356 +#: initdb.c:1359 #, c-format msgid "running bootstrap script ... " msgstr "ejecutando script de inicio (bootstrap) ... " -#: initdb.c:1368 +#: initdb.c:1371 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "el archivo de entrada «%s» no pertenece a PostgreSQL %s" -#: initdb.c:1371 +#: initdb.c:1374 #, c-format msgid "Check your installation or specify the correct path using the option -L.\n" msgstr "Verifique su instalación o especifique la ruta correcta usando la opción -L.\n" -#: initdb.c:1470 +#: initdb.c:1473 msgid "Enter new superuser password: " msgstr "Ingrese la nueva contraseña del superusuario: " -#: initdb.c:1471 +#: initdb.c:1474 msgid "Enter it again: " msgstr "Ingrésela nuevamente: " -#: initdb.c:1474 +#: initdb.c:1477 #, c-format msgid "Passwords didn't match.\n" msgstr "Las constraseñas no coinciden.\n" -#: initdb.c:1501 +#: initdb.c:1504 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "no se pudo leer la contraseña desde el archivo «%s»: %m" -#: initdb.c:1504 +#: initdb.c:1507 #, c-format msgid "password file \"%s\" is empty" msgstr "el archivo de contraseña «%s» está vacío" -#: initdb.c:1995 +#: initdb.c:1998 #, c-format msgid "caught signal\n" msgstr "se ha capturado una señal\n" -#: initdb.c:2001 +#: initdb.c:2004 #, c-format msgid "could not write to child process: %s\n" msgstr "no se pudo escribir al proceso hijo: %s\n" -#: initdb.c:2009 +#: initdb.c:2012 #, c-format msgid "ok\n" msgstr "hecho\n" -#: initdb.c:2099 +#: initdb.c:2102 #, c-format msgid "setlocale() failed" msgstr "setlocale() falló" -#: initdb.c:2120 +#: initdb.c:2123 #, c-format msgid "failed to restore old locale \"%s\"" msgstr "no se pudo restaurar la configuración regional anterior «%s»" -#: initdb.c:2129 +#: initdb.c:2132 #, c-format msgid "invalid locale name \"%s\"" msgstr "nombre de configuración regional «%s» no es válido" -#: initdb.c:2140 +#: initdb.c:2143 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "configuración regional inválida; revise las variables de entorno LANG y LC_*" -#: initdb.c:2167 +#: initdb.c:2170 #, c-format msgid "encoding mismatch" msgstr "codificaciones no coinciden" -#: initdb.c:2169 +#: initdb.c:2172 #, c-format msgid "" "The encoding you selected (%s) and the encoding that the\n" @@ -462,7 +462,7 @@ msgstr "" "Ejecute %s nuevamente y no especifique una codificación, o bien especifique\n" "una combinación adecuada.\n" -#: initdb.c:2241 +#: initdb.c:2244 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -471,17 +471,17 @@ msgstr "" "%s inicializa un cluster de base de datos PostgreSQL.\n" "\n" -#: initdb.c:2242 +#: initdb.c:2245 #, c-format msgid "Usage:\n" msgstr "Empleo:\n" -#: initdb.c:2243 +#: initdb.c:2246 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPCIÓN]... [DATADIR]\n" -#: initdb.c:2244 +#: initdb.c:2247 #, c-format msgid "" "\n" @@ -490,57 +490,57 @@ msgstr "" "\n" "Opciones:\n" -#: initdb.c:2245 +#: initdb.c:2248 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr "" " -A, --auth=MÉTODO método de autentificación por omisión para\n" " conexiones locales\n" -#: initdb.c:2246 +#: initdb.c:2249 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr "" " --auth-host=MÉTODO método de autentificación por omisión para\n" " conexiones locales TCP/IP\n" -#: initdb.c:2247 +#: initdb.c:2250 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr "" " --auth-local=MÉTODO método de autentificación por omisión para\n" " conexiones de socket local\n" -#: initdb.c:2248 +#: initdb.c:2251 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DATADIR ubicación para este cluster de bases de datos\n" -#: initdb.c:2249 +#: initdb.c:2252 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=CODIF codificación por omisión para nuevas bases de datos\n" -#: initdb.c:2250 +#: initdb.c:2253 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr "" " -g, --allow-group-access dar al grupo permisos de lectura/ejecución sobre\n" " el directorio de datos\n" -#: initdb.c:2251 +#: initdb.c:2254 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums activar sumas de verificación en páginas de datos\n" -#: initdb.c:2252 +#: initdb.c:2255 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr "" " --locale=LOCALE configuración regional por omisión para \n" " nuevas bases de datos\n" -#: initdb.c:2253 +#: initdb.c:2256 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -554,17 +554,17 @@ msgstr "" " en la categoría respectiva (el valor por omisión\n" " es tomado de variables de ambiente)\n" -#: initdb.c:2257 +#: initdb.c:2260 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale equivalente a --locale=C\n" -#: initdb.c:2258 +#: initdb.c:2261 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr " --pwfile=ARCHIVO leer contraseña del nuevo superusuario del archivo\n" -#: initdb.c:2259 +#: initdb.c:2262 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -573,27 +573,27 @@ msgstr "" " -T, --text-search-config=CONF\n" " configuración de búsqueda en texto por omisión\n" -#: initdb.c:2261 +#: initdb.c:2264 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=USUARIO nombre del superusuario del cluster\n" -#: initdb.c:2262 +#: initdb.c:2265 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt pedir una contraseña para el nuevo superusuario\n" -#: initdb.c:2263 +#: initdb.c:2266 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR ubicación del directorio WAL\n" -#: initdb.c:2264 +#: initdb.c:2267 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=TAMAÑO tamaño de los segmentos de WAL, en megabytes\n" -#: initdb.c:2265 +#: initdb.c:2268 #, c-format msgid "" "\n" @@ -602,42 +602,47 @@ msgstr "" "\n" "Opciones menos usadas:\n" -#: initdb.c:2266 +#: initdb.c:2269 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug genera mucha salida de depuración\n" -#: initdb.c:2267 +#: initdb.c:2270 +#, c-format +msgid " --discard-caches set debug_discard_caches=1\n" +msgstr " --discard-caches establece debug_discard_caches=1\n" + +#: initdb.c:2271 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRECTORIO donde encontrar los archivos de entrada\n" -#: initdb.c:2268 +#: initdb.c:2272 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean no limpiar después de errores\n" -#: initdb.c:2269 +#: initdb.c:2273 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n" -#: initdb.c:2270 +#: initdb.c:2274 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr " --no-instructions no mostrar instrucciones para los siguientes pasos\n" -#: initdb.c:2271 +#: initdb.c:2275 #, c-format msgid " -s, --show show internal settings\n" msgstr " -s, --show muestra variables internas\n" -#: initdb.c:2272 +#: initdb.c:2276 #, c-format msgid " -S, --sync-only only sync data directory\n" msgstr " -S, --sync-only sólo sincronizar el directorio de datos\n" -#: initdb.c:2273 +#: initdb.c:2277 #, c-format msgid "" "\n" @@ -646,17 +651,17 @@ msgstr "" "\n" "Otras opciones:\n" -#: initdb.c:2274 +#: initdb.c:2278 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de version y salir\n" -#: initdb.c:2275 +#: initdb.c:2279 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: initdb.c:2276 +#: initdb.c:2280 #, c-format msgid "" "\n" @@ -667,7 +672,7 @@ msgstr "" "Si el directorio de datos no es especificado, se usa la variable de\n" "ambiente PGDATA.\n" -#: initdb.c:2278 +#: initdb.c:2282 #, c-format msgid "" "\n" @@ -676,27 +681,27 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: initdb.c:2279 +#: initdb.c:2283 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: initdb.c:2307 +#: initdb.c:2311 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "método de autentificación «%s» no válido para conexiones «%s»" -#: initdb.c:2323 +#: initdb.c:2327 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "debe especificar una contraseña al superusuario para activar autentificación mediante contraseña" -#: initdb.c:2344 +#: initdb.c:2348 #, c-format msgid "no data directory specified" msgstr "no se especificó un directorio de datos" -#: initdb.c:2346 +#: initdb.c:2350 #, c-format msgid "" "You must identify the directory where the data for this database system\n" @@ -706,12 +711,12 @@ msgstr "" "Debe especificar el directorio donde residirán los datos para este clúster.\n" "Hágalo usando la opción -D o la variable de ambiente PGDATA.\n" -#: initdb.c:2364 +#: initdb.c:2368 #, c-format msgid "could not set environment" msgstr "no se pudo establecer el ambiente" -#: initdb.c:2384 +#: initdb.c:2388 #, c-format msgid "" "The program \"%s\" is needed by %s but was not found in the\n" @@ -722,7 +727,7 @@ msgstr "" "directorio que «%s».\n" "Verifique su instalación." -#: initdb.c:2389 +#: initdb.c:2393 #, c-format msgid "" "The program \"%s\" was found by \"%s\"\n" @@ -733,17 +738,17 @@ msgstr "" "pero no es de la misma versión que %s.\n" "Verifique su instalación." -#: initdb.c:2408 +#: initdb.c:2412 #, c-format msgid "input file location must be an absolute path" msgstr "la ubicación de archivos de entrada debe ser una ruta absoluta" -#: initdb.c:2425 +#: initdb.c:2429 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "El cluster será inicializado con configuración regional «%s».\n" -#: initdb.c:2428 +#: initdb.c:2432 #, c-format msgid "" "The database cluster will be initialized with locales\n" @@ -762,24 +767,24 @@ msgstr "" " NUMERIC: %s\n" " TIME: %s\n" -#: initdb.c:2452 +#: initdb.c:2456 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "" "no se pudo encontrar una codificación apropiada para\n" "la configuración regional «%s»" -#: initdb.c:2454 +#: initdb.c:2458 #, c-format msgid "Rerun %s with the -E option.\n" msgstr "Ejecute %s con la opción -E.\n" -#: initdb.c:2455 initdb.c:3089 initdb.c:3110 +#: initdb.c:2459 initdb.c:3099 initdb.c:3120 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Use «%s --help» para obtener mayor información.\n" -#: initdb.c:2468 +#: initdb.c:2472 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -789,12 +794,12 @@ msgstr "" "no puede ser usada como codificación del lado del servidor.\n" "La codificación por omisión será «%s».\n" -#: initdb.c:2473 +#: initdb.c:2477 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "la configuración regional «%s» requiere la codificación no soportada «%s»" -#: initdb.c:2476 +#: initdb.c:2480 #, c-format msgid "" "Encoding \"%s\" is not allowed as a server-side encoding.\n" @@ -804,59 +809,59 @@ msgstr "" "del servidor.\n" "Ejecute %s nuevamente con una selección de configuración regional diferente.\n" -#: initdb.c:2485 +#: initdb.c:2489 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "La codificación por omisión ha sido por lo tanto definida a «%s».\n" -#: initdb.c:2551 +#: initdb.c:2555 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "" "no se pudo encontrar una configuración para búsqueda en texto apropiada\n" "para la configuración regional «%s»" -#: initdb.c:2562 +#: initdb.c:2566 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "la configuración de búsqueda en texto apropiada para la configuración regional «%s» es desconocida" -#: initdb.c:2567 +#: initdb.c:2571 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "la configuración de búsqueda en texto «%s» especificada podría no coincidir con la configuración regional «%s»" -#: initdb.c:2572 +#: initdb.c:2576 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "La configuración de búsqueda en texto ha sido definida a «%s».\n" -#: initdb.c:2616 initdb.c:2698 +#: initdb.c:2620 initdb.c:2702 #, c-format msgid "creating directory %s ... " msgstr "creando el directorio %s ... " -#: initdb.c:2622 initdb.c:2704 initdb.c:2769 initdb.c:2831 +#: initdb.c:2626 initdb.c:2708 initdb.c:2773 initdb.c:2835 #, c-format msgid "could not create directory \"%s\": %m" msgstr "no se pudo crear el directorio «%s»: %m" -#: initdb.c:2633 initdb.c:2716 +#: initdb.c:2637 initdb.c:2720 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "corrigiendo permisos en el directorio existente %s ... " -#: initdb.c:2639 initdb.c:2722 +#: initdb.c:2643 initdb.c:2726 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "no se pudo cambiar los permisos del directorio «%s»: %m" -#: initdb.c:2653 initdb.c:2736 +#: initdb.c:2657 initdb.c:2740 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "el directorio «%s» existe pero no está vacío" -#: initdb.c:2658 +#: initdb.c:2662 #, c-format msgid "" "If you want to create a new database system, either remove or empty\n" @@ -867,17 +872,17 @@ msgstr "" "el directorio «%s», o ejecute %s\n" "con un argumento distinto de «%s».\n" -#: initdb.c:2666 initdb.c:2748 initdb.c:3125 +#: initdb.c:2670 initdb.c:2752 initdb.c:3135 #, c-format msgid "could not access directory \"%s\": %m" msgstr "no se pudo acceder al directorio «%s»: %m" -#: initdb.c:2689 +#: initdb.c:2693 #, c-format msgid "WAL directory location must be an absolute path" msgstr "la ubicación del directorio de WAL debe ser una ruta absoluta" -#: initdb.c:2741 +#: initdb.c:2745 #, c-format msgid "" "If you want to store the WAL there, either remove or empty the directory\n" @@ -886,27 +891,27 @@ msgstr "" "Si quiere almacenar el WAL ahí, elimine o vacíe el directorio\n" "«%s».\n" -#: initdb.c:2755 +#: initdb.c:2759 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "no se pudo crear el enlace simbólico «%s»: %m" -#: initdb.c:2760 +#: initdb.c:2764 #, c-format msgid "symlinks are not supported on this platform" msgstr "los enlaces simbólicos no están soportados en esta plataforma" -#: initdb.c:2784 +#: initdb.c:2788 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n" msgstr "Contiene un archivo invisible, quizás por ser un punto de montaje.\n" -#: initdb.c:2787 +#: initdb.c:2791 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point.\n" msgstr "Contiene un directorio lost+found, quizás por ser un punto de montaje.\n" -#: initdb.c:2790 +#: initdb.c:2794 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -915,57 +920,57 @@ msgstr "" "Usar un punto de montaje directamente como directorio de datos no es\n" "recomendado. Cree un subdirectorio bajo el punto de montaje.\n" -#: initdb.c:2816 +#: initdb.c:2820 #, c-format msgid "creating subdirectories ... " msgstr "creando subdirectorios ... " -#: initdb.c:2862 +#: initdb.c:2866 msgid "performing post-bootstrap initialization ... " msgstr "realizando inicialización post-bootstrap ... " -#: initdb.c:3024 +#: initdb.c:3029 #, c-format msgid "Running in debug mode.\n" msgstr "Ejecutando en modo de depuración.\n" -#: initdb.c:3028 +#: initdb.c:3033 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "Ejecutando en modo no-clean. Los errores no serán limpiados.\n" -#: initdb.c:3108 +#: initdb.c:3118 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: initdb.c:3129 initdb.c:3218 +#: initdb.c:3139 initdb.c:3228 msgid "syncing data to disk ... " msgstr "sincronizando los datos a disco ... " -#: initdb.c:3138 +#: initdb.c:3148 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "" "la petición de contraseña y el archivo de contraseña no pueden\n" "ser especificados simultáneamente" -#: initdb.c:3163 +#: initdb.c:3173 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "el argumento de --wal-segsize debe ser un número" -#: initdb.c:3168 +#: initdb.c:3178 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "el argumento de --wal-segsize debe ser una potencia de 2 entre 1 y 1024" -#: initdb.c:3185 +#: initdb.c:3195 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "nombre de superusuario «%s» no permitido; los nombres de rol no pueden comenzar con «pg_»" -#: initdb.c:3189 +#: initdb.c:3199 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -976,17 +981,17 @@ msgstr "" "Este usuario también debe ser quien ejecute el proceso servidor.\n" "\n" -#: initdb.c:3205 +#: initdb.c:3215 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Las sumas de verificación en páginas de datos han sido activadas.\n" -#: initdb.c:3207 +#: initdb.c:3217 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Las sumas de verificación en páginas de datos han sido desactivadas.\n" -#: initdb.c:3224 +#: initdb.c:3234 #, c-format msgid "" "\n" @@ -998,12 +1003,12 @@ msgstr "" "El directorio de datos podría corromperse si el sistema operativo sufre\n" "una caída.\n" -#: initdb.c:3229 +#: initdb.c:3239 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "activando el método de autentificación «trust» para conexiones locales" -#: initdb.c:3230 +#: initdb.c:3240 #, c-format msgid "" "You can change this by editing pg_hba.conf or using the option -A, or\n" @@ -1013,11 +1018,11 @@ msgstr "" "o --auth-local y --auth-host la próxima vez que ejecute initdb.\n" #. translator: This is a placeholder in a shell command. -#: initdb.c:3260 +#: initdb.c:3270 msgid "logfile" msgstr "archivo_de_registro" -#: initdb.c:3262 +#: initdb.c:3272 #, c-format msgid "" "\n" @@ -1032,5 +1037,8 @@ msgstr "" " %s\n" "\n" +#~ msgid " --clobber-cache use cache-clobbering debug option\n" +#~ msgstr " --clobber-cache usar la opción de depuración para invalidación de caché\n" + #~ msgid "pclose failed: %m" #~ msgstr "pclose falló: %m" diff --git a/src/bin/initdb/po/fr.po b/src/bin/initdb/po/fr.po index 8566b394e1..1388aac6d7 100644 --- a/src/bin/initdb/po/fr.po +++ b/src/bin/initdb/po/fr.po @@ -1,76 +1,85 @@ -# translation of initdb.po to fr_fr -# french message translation file for initdb +# LANGUAGE message translation file for initdb +# Copyright (C) 2004-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the initdb (PostgreSQL) package. # # Use these quotes: « %s » # # Guillaume Lelarge , 2004-2009. # Stéphane Schildknecht , 2009. +# Guillaume Lelarge , 2010-2022. +# msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-26 06:48+0000\n" -"PO-Revision-Date: 2021-04-26 11:36+0200\n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" "Last-Translator: Guillaume Lelarge \n" -"Language-Team: PostgreSQLfr \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" - -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "fatal : " +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:273 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:280 #, c-format msgid "warning: " msgstr "attention : " -#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 +#: ../../../src/common/logging.c:291 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:298 +#, c-format +msgid "hint: " +msgstr "astuce : " + +#: ../../common/exec.c:144 ../../common/exec.c:261 ../../common/exec.c:307 #, c-format msgid "could not identify current directory: %m" msgstr "n'a pas pu identifier le répertoire courant : %m" -#: ../../common/exec.c:155 +#: ../../common/exec.c:163 #, c-format msgid "invalid binary \"%s\"" msgstr "binaire « %s » invalide" -#: ../../common/exec.c:205 +#: ../../common/exec.c:213 #, c-format msgid "could not read binary \"%s\"" msgstr "n'a pas pu lire le binaire « %s »" -#: ../../common/exec.c:213 +#: ../../common/exec.c:221 #, c-format msgid "could not find a \"%s\" to execute" msgstr "n'a pas pu trouver un « %s » à exécuter" -#: ../../common/exec.c:269 ../../common/exec.c:308 +#: ../../common/exec.c:277 ../../common/exec.c:316 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "n'a pas pu modifier le répertoire par « %s » : %m" -#: ../../common/exec.c:286 +#: ../../common/exec.c:294 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "n'a pas pu lire le lien symbolique « %s » : %m" -#: ../../common/exec.c:409 +#: ../../common/exec.c:417 #, c-format msgid "%s() failed: %m" msgstr "échec de %s() : %m" -#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 -#: initdb.c:328 +#: ../../common/exec.c:555 ../../common/exec.c:600 ../../common/exec.c:692 +#: initdb.c:334 #, c-format msgid "out of memory" msgstr "mémoire épuisée" @@ -157,7 +166,7 @@ msgstr "n'a pas pu démarrer le processus pour la commande « %s » : code d'err msgid "could not re-execute with restricted token: error code %lu" msgstr "n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu" @@ -186,7 +195,7 @@ msgstr "l'utilisateur n'existe pas" #: ../../common/username.c:60 #, c-format msgid "user name lookup failure: error code %lu" -msgstr "échec de la recherche du nom d'utilisateur : code erreur %lu" +msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu" #: ../../common/wait_error.c:45 #, c-format @@ -228,261 +237,263 @@ msgstr "n'a pas pu configurer la jonction pour « %s » : %s\n" msgid "could not get junction for \"%s\": %s\n" msgstr "n'a pas pu obtenir la jonction pour « %s » : %s\n" -#: initdb.c:461 initdb.c:1493 +#: initdb.c:464 initdb.c:1456 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" -#: initdb.c:505 initdb.c:827 initdb.c:853 +#: initdb.c:505 initdb.c:809 initdb.c:829 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "n'a pas pu ouvrir le fichier « %s » en écriture : %m" -#: initdb.c:512 initdb.c:519 initdb.c:833 initdb.c:858 +#: initdb.c:509 initdb.c:812 initdb.c:831 #, c-format msgid "could not write file \"%s\": %m" msgstr "impossible d'écrire le fichier « %s » : %m" -#: initdb.c:537 +#: initdb.c:513 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "n'a pas pu fermer le fichier « %s » : %m" + +#: initdb.c:529 #, c-format msgid "could not execute command \"%s\": %m" msgstr "n'a pas pu exécuter la commande « %s » : %m" -#: initdb.c:555 +#: initdb.c:547 #, c-format msgid "removing data directory \"%s\"" msgstr "suppression du répertoire des données « %s »" -#: initdb.c:557 +#: initdb.c:549 #, c-format msgid "failed to remove data directory" msgstr "échec de la suppression du répertoire des données" -#: initdb.c:561 +#: initdb.c:553 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "suppression du contenu du répertoire des données « %s »" -#: initdb.c:564 +#: initdb.c:556 #, c-format msgid "failed to remove contents of data directory" msgstr "échec de la suppression du contenu du répertoire des données" -#: initdb.c:569 +#: initdb.c:561 #, c-format msgid "removing WAL directory \"%s\"" msgstr "suppression du répertoire des journaux de transactions « %s »" -#: initdb.c:571 +#: initdb.c:563 #, c-format msgid "failed to remove WAL directory" msgstr "échec de la suppression du répertoire des journaux de transactions" -#: initdb.c:575 +#: initdb.c:567 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "suppression du contenu du répertoire des journaux de transactions « %s »" -#: initdb.c:577 +#: initdb.c:569 #, c-format msgid "failed to remove contents of WAL directory" msgstr "échec de la suppression du contenu du répertoire des journaux de transactions" -#: initdb.c:584 +#: initdb.c:576 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "répertoire des données « %s » non supprimé à la demande de l'utilisateur" -#: initdb.c:588 +#: initdb.c:580 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "répertoire des journaux de transactions « %s » non supprimé à la demande de l'utilisateur" -#: initdb.c:606 +#: initdb.c:598 #, c-format msgid "cannot be run as root" msgstr "ne peut pas être exécuté en tant que root" -#: initdb.c:608 +#: initdb.c:599 #, c-format -msgid "" -"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" -"own the server process.\n" -msgstr "" -"Connectez-vous (par exemple en utilisant « su ») sous l'utilisateur (non\n" -" privilégié) qui sera propriétaire du processus serveur.\n" +msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." +msgstr "Connectez-vous (par exemple en utilisant « su ») sous l'utilisateur (non privilégié) qui sera propriétaire du processus serveur." -#: initdb.c:641 +#: initdb.c:631 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "« %s » n'est pas un nom d'encodage serveur valide" -#: initdb.c:786 +#: initdb.c:775 #, c-format msgid "file \"%s\" does not exist" msgstr "le rôle « %s » n'existe pas" -#: initdb.c:788 initdb.c:795 initdb.c:804 +#: initdb.c:776 initdb.c:781 initdb.c:788 #, c-format -msgid "" -"This might mean you have a corrupted installation or identified\n" -"the wrong directory with the invocation option -L.\n" -msgstr "" -"Cela peut signifier que votre installation est corrompue ou que vous avez\n" -"identifié le mauvais répertoire avec l'option -L.\n" +msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." +msgstr "Cela peut signifier que votre installation est corrompue ou que vous avez identifié le mauvais répertoire avec l'option -L." -#: initdb.c:793 +#: initdb.c:780 #, c-format msgid "could not access file \"%s\": %m" msgstr "n'a pas pu accéder au fichier « %s » : %m" -#: initdb.c:802 +#: initdb.c:787 #, c-format msgid "file \"%s\" is not a regular file" msgstr "le fichier « %s » n'est pas un fichier standard" -#: initdb.c:947 +#: initdb.c:919 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "sélection de l'implémentation de la mémoire partagée dynamique..." -#: initdb.c:956 +#: initdb.c:928 #, c-format msgid "selecting default max_connections ... " msgstr "sélection de la valeur par défaut pour max_connections... " -#: initdb.c:987 +#: initdb.c:959 #, c-format msgid "selecting default shared_buffers ... " msgstr "sélection de la valeur par défaut pour shared_buffers... " -#: initdb.c:1021 +#: initdb.c:993 #, c-format msgid "selecting default time zone ... " msgstr "sélection du fuseau horaire par défaut... " -#: initdb.c:1055 +#: initdb.c:1027 msgid "creating configuration files ... " msgstr "création des fichiers de configuration... " -#: initdb.c:1214 initdb.c:1233 initdb.c:1319 initdb.c:1334 +#: initdb.c:1185 initdb.c:1201 initdb.c:1284 initdb.c:1296 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "n'a pas pu modifier les droits de « %s » : %m" -#: initdb.c:1356 +#: initdb.c:1316 #, c-format msgid "running bootstrap script ... " msgstr "lancement du script bootstrap..." -#: initdb.c:1368 +#: initdb.c:1328 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "le fichier en entrée « %s » n'appartient pas à PostgreSQL %s" -#: initdb.c:1371 +#: initdb.c:1330 #, c-format -msgid "Check your installation or specify the correct path using the option -L.\n" -msgstr "Vérifiez votre installation ou indiquez le bon chemin avec l'option -L.\n" +msgid "Specify the correct path using the option -L." +msgstr "Indiquez le bon chemin avec l'option -L." -#: initdb.c:1470 +#: initdb.c:1434 msgid "Enter new superuser password: " -msgstr "Saisissez le nouveau mot de passe du super-utilisateur : " +msgstr "Saisir le nouveau mot de passe du super-utilisateur : " -#: initdb.c:1471 +#: initdb.c:1435 msgid "Enter it again: " -msgstr "Saisissez-le à nouveau : " +msgstr "Saisir le mot de passe à nouveau : " -#: initdb.c:1474 +#: initdb.c:1438 #, c-format msgid "Passwords didn't match.\n" msgstr "Les mots de passe ne sont pas identiques.\n" -#: initdb.c:1501 +#: initdb.c:1462 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "n'a pas pu lire le mot de passe à partir du fichier « %s » : %m" -#: initdb.c:1504 +#: initdb.c:1465 #, c-format msgid "password file \"%s\" is empty" msgstr "le fichier de mots de passe « %s » est vide" -#: initdb.c:1995 +#: initdb.c:1911 #, c-format msgid "caught signal\n" msgstr "signal reçu\n" -#: initdb.c:2001 +#: initdb.c:1917 #, c-format msgid "could not write to child process: %s\n" msgstr "n'a pas pu écrire au processus fils : %s\n" -#: initdb.c:2009 +#: initdb.c:1925 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2099 +#: initdb.c:2014 #, c-format msgid "setlocale() failed" msgstr "échec de setlocale()" -#: initdb.c:2120 +#: initdb.c:2032 #, c-format msgid "failed to restore old locale \"%s\"" msgstr "a échoué pour restaurer l'ancienne locale « %s »" -#: initdb.c:2129 +#: initdb.c:2039 #, c-format msgid "invalid locale name \"%s\"" msgstr "nom de locale « %s » invalide" -#: initdb.c:2140 +#: initdb.c:2050 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "configuration invalide de la locale ; vérifiez les variables d'environnement LANG et LC_*" -#: initdb.c:2167 +#: initdb.c:2076 #, c-format msgid "encoding mismatch" msgstr "différence d'encodage" -#: initdb.c:2169 +#: initdb.c:2077 #, c-format -msgid "" -"The encoding you selected (%s) and the encoding that the\n" -"selected locale uses (%s) do not match. This would lead to\n" -"misbehavior in various character string processing functions.\n" -"Rerun %s and either do not specify an encoding explicitly,\n" -"or choose a matching combination.\n" -msgstr "" -"L'encodage que vous avez sélectionné (%s) et celui que la locale\n" -"sélectionnée utilise (%s) ne sont pas compatibles. Cela peut conduire à\n" -"des erreurs dans les fonctions de manipulation de chaînes de caractères.\n" -"Ré-exécutez %s sans préciser d'encodage, ou en choisissant une combinaison\n" -"compatible.\n" +msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." +msgstr "L'encodage que vous avez sélectionné (%s) et celui que la locale sélectionnée utilise (%s) ne sont pas compatibles. Cela peut conduire à des erreurs dans les fonctions de manipulation de chaînes de caractères." -#: initdb.c:2241 +#: initdb.c:2082 +#, c-format +msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." +msgstr "Relancez %s et soit vous ne spécifiez pas explicitement d'encodage, soit vous choisissez une combinaison compatible." + +#: initdb.c:2144 +#, c-format +msgid "ICU locale must be specified" +msgstr "la locale ICU doit être précisée" + +#: initdb.c:2151 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ICU n'est pas supporté dans cette installation" + +#: initdb.c:2162 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" "\n" msgstr "" -"%s initialise un cluster PostgreSQL.\n" +"%s initialise une instance PostgreSQL.\n" "\n" -#: initdb.c:2242 +#: initdb.c:2163 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: initdb.c:2243 +#: initdb.c:2164 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [RÉP_DONNÉES]\n" -#: initdb.c:2244 +#: initdb.c:2165 #, c-format msgid "" "\n" @@ -491,59 +502,66 @@ msgstr "" "\n" "Options :\n" -#: initdb.c:2245 +#: initdb.c:2166 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr "" -" -A, --auth=MÉTHODE méthode d'authentification par défaut pour les\n" -" connexions locales\n" +" -A, --auth=MÉTHODE méthode d'authentification par défaut pour les\n" +" connexions locales\n" -#: initdb.c:2246 +#: initdb.c:2167 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr "" -" --auth-host=MÉTHODE méthode d'authentification par défaut pour les\n" -" connexions locales TCP/IP\n" +" --auth-host=MÉTHODE méthode d'authentification par défaut pour les\n" +" connexions locales TCP/IP\n" -#: initdb.c:2247 +#: initdb.c:2168 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr "" -" --auth-local=MÉTHODE méthode d'authentification par défaut pour les\n" -" connexions locales socket\n" +" --auth-local=MÉTHODE méthode d'authentification par défaut pour les\n" +" connexions locales socket\n" -#: initdb.c:2248 +#: initdb.c:2169 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" -msgstr " [-D, --pgdata=]RÉP_DONNÉES emplacement du cluster\n" +msgstr " [-D, --pgdata=]RÉP_DONNÉES emplacement du répertoire principal des données\n" -#: initdb.c:2249 +#: initdb.c:2170 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr "" -" -E, --encoding=ENCODAGE initialise l'encodage par défaut des nouvelles\n" -" bases de données\n" +" -E, --encoding=ENCODAGE initialise l'encodage par défaut des nouvelles\n" +" bases de données\n" -#: initdb.c:2250 +#: initdb.c:2171 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr "" -" -g, --allow-group-access autorise la lecture/écriture pour le groupe sur\n" -" le répertoire des données\n" +" -g, --allow-group-access autorise la lecture/écriture pour le groupe sur\n" +" le répertoire des données\n" + +#: initdb.c:2172 +#, c-format +msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" +msgstr " --icu-locale=LOCALE initialise l'identifiant de locale ICU pour les nouvelles bases de données\n" -#: initdb.c:2251 +#: initdb.c:2173 #, c-format msgid " -k, --data-checksums use data page checksums\n" -msgstr " -k, --data-checksums utilise les sommes de contrôle pour les pages de données\n" +msgstr "" +" -k, --data-checksums active les sommes de contrôle pour les blocs des\n" +" fichiers de données\n" -#: initdb.c:2252 +#: initdb.c:2174 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr "" -" --locale=LOCALE initialise la locale par défaut pour les\n" -" nouvelles bases de données\n" +" --locale=LOCALE initialise la locale par défaut pour les\n" +" nouvelles bases de données\n" -#: initdb.c:2253 +#: initdb.c:2175 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -553,58 +571,67 @@ msgid "" msgstr "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" " --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n" -" initialise la locale par défaut dans la\n" -" catégorie respective pour les nouvelles bases\n" -" de données (les valeurs par défaut sont prises\n" -" dans l'environnement)\n" +" initialise la locale par défaut dans la catégorie\n" +" respective pour les nouvelles bases de données\n" +" (les valeurs par défaut sont prises dans\n" +" l'environnement)\n" -#: initdb.c:2257 +#: initdb.c:2179 #, c-format msgid " --no-locale equivalent to --locale=C\n" -msgstr " --no-locale équivalent à --locale=C\n" +msgstr " --no-locale équivalent à --locale=C\n" + +#: initdb.c:2180 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" set default locale provider for new databases\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" initialise le fournisseur de locale par défaut pour\n" +" les nouvelles bases de données\n" -#: initdb.c:2258 +#: initdb.c:2182 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr "" -" --pwfile=NOMFICHIER lit le mot de passe du nouveau\n" -" super-utilisateur à partir de ce fichier\n" +" --pwfile=FICHIER lit le mot de passe du nouveau super-utilisateur\n" +" à partir de ce fichier\n" -#: initdb.c:2259 +#: initdb.c:2183 #, c-format msgid "" " -T, --text-search-config=CFG\n" " default text search configuration\n" msgstr "" -" -T, --text-search-config=CFG\n" -" configuration par défaut de la recherche plein\n" -" texte\n" +" -T, --text-search-config=CFG configuration par défaut de la recherche plein\n" +" texte\n" -#: initdb.c:2261 +#: initdb.c:2185 #, c-format msgid " -U, --username=NAME database superuser name\n" -msgstr " -U, --username=NOM nom du super-utilisateur de la base de données\n" +msgstr " -U, --username=NOM nom du super-utilisateur de la base de données\n" -#: initdb.c:2262 +#: initdb.c:2186 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr "" -" -W, --pwprompt demande un mot de passe pour le nouveau\n" -" super-utilisateur\n" +" -W, --pwprompt demande un mot de passe pour le nouveau\n" +" super-utilisateur\n" -#: initdb.c:2263 +#: initdb.c:2187 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr "" -" -X, --waldir=RÉP_WAL emplacement du répertoire des journaux de\n" -" transactions\n" +" -X, --waldir=RÉP_WAL emplacement du répertoire des journaux de\n" +" transactions\n" -#: initdb.c:2264 +#: initdb.c:2188 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" -msgstr " --wal-segsize=TAILLE taille des segments WAL, en mégaoctets\n" +msgstr " --wal-segsize=TAILLE configure la taille des segments WAL, en Mo\n" -#: initdb.c:2265 +#: initdb.c:2189 #, c-format msgid "" "\n" @@ -613,44 +640,53 @@ msgstr "" "\n" "Options moins utilisées :\n" -#: initdb.c:2266 +#: initdb.c:2190 #, c-format msgid " -d, --debug generate lots of debugging output\n" -msgstr " -d, --debug engendre un grand nombre de traces de débogage\n" +msgstr " -d, --debug engendre un grand nombre de traces de débogage\n" + +#: initdb.c:2191 +#, c-format +msgid " --discard-caches set debug_discard_caches=1\n" +msgstr " --discard-caches initialise debug_discard_caches à 1\n" -#: initdb.c:2267 +#: initdb.c:2192 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr "" -" -L RÉPERTOIRE indique où trouver les fichiers servant à la\n" -" création du cluster\n" +" -L RÉPERTOIRE indique où trouver les fichiers servant à la\n" +" création de l'instance\n" -#: initdb.c:2268 +#: initdb.c:2193 #, c-format msgid " -n, --no-clean do not clean up after errors\n" -msgstr " -n, --noclean ne nettoie pas après des erreurs\n" +msgstr " -n, --noclean ne nettoie pas après des erreurs\n" -#: initdb.c:2269 +#: initdb.c:2194 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" -msgstr " -N, --nosync n'attend pas que les modifications soient proprement écrites sur disque\n" +msgstr "" +" -N, --nosync n'attend pas que les modifications soient\n" +" proprement écrites sur disque\n" -#: initdb.c:2270 +#: initdb.c:2195 #, c-format msgid " --no-instructions do not print instructions for next steps\n" -msgstr " --no-instructions n'affiche pas les instructions des prochaines étapes\n" +msgstr "" +" --no-instructions n'affiche pas les instructions des prochaines\n" +" étapes\n" -#: initdb.c:2271 +#: initdb.c:2196 #, c-format msgid " -s, --show show internal settings\n" -msgstr " -s, --show affiche la configuration interne\n" +msgstr " -s, --show affiche la configuration interne\n" -#: initdb.c:2272 +#: initdb.c:2197 #, c-format -msgid " -S, --sync-only only sync data directory\n" -msgstr " -S, --sync-only synchronise uniquement le répertoire des données\n" +msgid " -S, --sync-only only sync database files to disk, then exit\n" +msgstr " -S, --sync-only synchronise uniquement le répertoire des données, puis quitte\n" -#: initdb.c:2273 +#: initdb.c:2198 #, c-format msgid "" "\n" @@ -659,17 +695,17 @@ msgstr "" "\n" "Autres options :\n" -#: initdb.c:2274 +#: initdb.c:2199 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version puis quitte\n" +msgstr " -V, --version affiche la version puis quitte\n" -#: initdb.c:2275 +#: initdb.c:2200 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide puis quitte\n" +msgstr " -?, --help affiche cette aide puis quitte\n" -#: initdb.c:2276 +#: initdb.c:2201 #, c-format msgid "" "\n" @@ -680,7 +716,7 @@ msgstr "" "Si le répertoire des données n'est pas indiqué, la variable d'environnement\n" "PGDATA est utilisée.\n" -#: initdb.c:2278 +#: initdb.c:2203 #, c-format msgid "" "\n" @@ -689,109 +725,104 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: initdb.c:2279 +#: initdb.c:2204 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil de %s : <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" -#: initdb.c:2307 +#: initdb.c:2232 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "méthode d'authentification « %s » invalide pour « %s » connexions" -#: initdb.c:2323 +#: initdb.c:2246 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "doit indiquer un mot de passe pour le super-utilisateur afin d'activer l'authentification par mot de passe" -#: initdb.c:2344 +#: initdb.c:2265 #, c-format msgid "no data directory specified" msgstr "aucun répertoire de données indiqué" -#: initdb.c:2346 +#: initdb.c:2266 #, c-format -msgid "" -"You must identify the directory where the data for this database system\n" -"will reside. Do this with either the invocation option -D or the\n" -"environment variable PGDATA.\n" -msgstr "" -"Vous devez identifier le répertoire où résideront les données pour ce\n" -"système de bases de données. Faites-le soit avec l'option -D soit avec\n" -"la variable d'environnement PGDATA.\n" +msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." +msgstr "Vous devez identifier le répertoire où résideront les données pour ce système de bases de données. Faites-le soit avec l'option -D soit avec la variable d'environnement PGDATA." -#: initdb.c:2364 +#: initdb.c:2283 #, c-format msgid "could not set environment" msgstr "n'a pas pu configurer l'environnement" -#: initdb.c:2384 +#: initdb.c:2301 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"Le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé\n" -"dans le même répertoire que « %s ».\n" -"Vérifiez votre installation." +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »" -#: initdb.c:2389 +#: initdb.c:2304 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"Le programme « %s » a été trouvé par « %s »,\n" -"mais n'est pas de la même version que %s.\n" -"Vérifiez votre installation." +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s" -#: initdb.c:2408 +#: initdb.c:2319 #, c-format msgid "input file location must be an absolute path" msgstr "l'emplacement du fichier d'entrée doit être indiqué avec un chemin absolu" -#: initdb.c:2425 +#: initdb.c:2336 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "L'instance sera initialisée avec la locale « %s ».\n" -#: initdb.c:2428 +#: initdb.c:2339 +#, c-format +msgid "The database cluster will be initialized with this locale configuration:\n" +msgstr "L'instance sera initialisée avec cette configuration de locale :\n" + +#: initdb.c:2340 +#, c-format +msgid " provider: %s\n" +msgstr " fournisseur: %s\n" + +#: initdb.c:2342 +#, c-format +msgid " ICU locale: %s\n" +msgstr " locale ICU : %s\n" + +#: initdb.c:2343 #, c-format msgid "" -"The database cluster will be initialized with locales\n" -" COLLATE: %s\n" -" CTYPE: %s\n" -" MESSAGES: %s\n" -" MONETARY: %s\n" -" NUMERIC: %s\n" -" TIME: %s\n" +" LC_COLLATE: %s\n" +" LC_CTYPE: %s\n" +" LC_MESSAGES: %s\n" +" LC_MONETARY: %s\n" +" LC_NUMERIC: %s\n" +" LC_TIME: %s\n" msgstr "" -"Le cluster sera initialisé avec les locales\n" -" COLLATE: %s\n" -" CTYPE: %s\n" -" MESSAGES: %s\n" -" MONETARY: %s\n" -" NUMERIC: %s\n" -" TIME: %s\n" +" LC_COLLATE: %s\n" +" LC_CTYPE: %s\n" +" LC_MESSAGES: %s\n" +" LC_MONETARY: %s\n" +" LC_NUMERIC: %s\n" +" LC_TIME: %s\n" -#: initdb.c:2452 +#: initdb.c:2368 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "n'a pas pu trouver un encodage adéquat pour la locale « %s »" -#: initdb.c:2454 +#: initdb.c:2370 #, c-format -msgid "Rerun %s with the -E option.\n" -msgstr "Relancez %s avec l'option -E.\n" +msgid "Rerun %s with the -E option." +msgstr "Relancez %s avec l'option -E." -#: initdb.c:2455 initdb.c:3089 initdb.c:3110 +#: initdb.c:2371 initdb.c:2990 initdb.c:3010 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Essayer « %s --help » pour plus d'informations.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." -#: initdb.c:2468 +#: initdb.c:2383 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -800,182 +831,183 @@ msgstr "" "L'encodage « %s » a été déduit de la locale mais n'est pas autorisé en tant qu'encodage serveur.\n" "L'encodage par défaut des bases de données sera configuré à « %s ».\n" -#: initdb.c:2473 +#: initdb.c:2388 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "la locale « %s » nécessite l'encodage « %s » non supporté" -#: initdb.c:2476 +#: initdb.c:2390 #, c-format -msgid "" -"Encoding \"%s\" is not allowed as a server-side encoding.\n" -"Rerun %s with a different locale selection.\n" -msgstr "" -"L'encodage « %s » n'est pas autorisé en tant qu'encodage serveur.\n" -"Ré-exécuter %s avec une locale différente.\n" +msgid "Encoding \"%s\" is not allowed as a server-side encoding." +msgstr "L'encodage « %s » n'est pas autorisé en tant qu'encodage serveur." -#: initdb.c:2485 +#: initdb.c:2392 +#, c-format +msgid "Rerun %s with a different locale selection." +msgstr "Relancez %s avec une locale différente." + +#: initdb.c:2400 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "" "L'encodage par défaut des bases de données a été configuré en conséquence\n" "avec « %s ».\n" -#: initdb.c:2551 +#: initdb.c:2466 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "n'a pas pu trouver la configuration de la recherche plein texte en adéquation avec la locale « %s »" -#: initdb.c:2562 +#: initdb.c:2477 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "la configuration de la recherche plein texte convenable pour la locale « %s » est inconnue" -#: initdb.c:2567 +#: initdb.c:2482 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "la configuration indiquée pour la recherche plein texte, « %s », pourrait ne pas correspondre à la locale « %s »" -#: initdb.c:2572 +#: initdb.c:2487 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "La configuration de la recherche plein texte a été initialisée à « %s ».\n" -#: initdb.c:2616 initdb.c:2698 +#: initdb.c:2531 initdb.c:2602 #, c-format msgid "creating directory %s ... " msgstr "création du répertoire %s... " -#: initdb.c:2622 initdb.c:2704 initdb.c:2769 initdb.c:2831 +#: initdb.c:2536 initdb.c:2607 initdb.c:2659 initdb.c:2715 #, c-format msgid "could not create directory \"%s\": %m" msgstr "n'a pas pu créer le répertoire « %s » : %m" -#: initdb.c:2633 initdb.c:2716 +#: initdb.c:2545 initdb.c:2617 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "correction des droits sur le répertoire existant %s... " -#: initdb.c:2639 initdb.c:2722 +#: initdb.c:2550 initdb.c:2622 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "n'a pas pu modifier les droits du répertoire « %s » : %m" -#: initdb.c:2653 initdb.c:2736 +#: initdb.c:2562 initdb.c:2634 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "le répertoire « %s » existe mais n'est pas vide" -#: initdb.c:2658 +#: initdb.c:2566 #, c-format -msgid "" -"If you want to create a new database system, either remove or empty\n" -"the directory \"%s\" or run %s\n" -"with an argument other than \"%s\".\n" -msgstr "" -"Si vous voulez créer un nouveau système de bases de données, supprimez ou\n" -"videz le répertoire « %s ».\n" -"Vous pouvez aussi exécuter %s avec un argument autre que « %s ».\n" +msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." +msgstr "Si vous voulez créer un nouveau système de bases de données, supprimez ou videz le répertoire « %s ». Vous pouvez aussi exécuter %s avec un argument autre que « %s »." -#: initdb.c:2666 initdb.c:2748 initdb.c:3125 +#: initdb.c:2574 initdb.c:2644 initdb.c:3027 #, c-format msgid "could not access directory \"%s\": %m" msgstr "n'a pas pu accéder au répertoire « %s » : %m" -#: initdb.c:2689 +#: initdb.c:2595 #, c-format msgid "WAL directory location must be an absolute path" msgstr "l'emplacement du répertoire des journaux de transactions doit être indiqué avec un chemin absolu" -#: initdb.c:2741 +#: initdb.c:2638 #, c-format -msgid "" -"If you want to store the WAL there, either remove or empty the directory\n" -"\"%s\".\n" -msgstr "" -"Si vous voulez enregistrer ici le journal des transactions, supprimez ou\n" -"videz le répertoire « %s ».\n" +msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." +msgstr "Si vous voulez enregistrer ici les WAL, supprimez ou videz le répertoire « %s »." -#: initdb.c:2755 +#: initdb.c:2649 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "n'a pas pu créer le lien symbolique « %s » : %m" -#: initdb.c:2760 +#: initdb.c:2652 #, c-format msgid "symlinks are not supported on this platform" msgstr "les liens symboliques ne sont pas supportés sur cette plateforme" -#: initdb.c:2784 +#: initdb.c:2671 #, c-format -msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n" -msgstr "Il contient un fichier invisible, peut-être parce qu'il s'agit d'un point de montage.\n" +msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." +msgstr "Il contient un fichier invisible, peut-être parce qu'il s'agit d'un point de montage." -#: initdb.c:2787 +#: initdb.c:2673 #, c-format -msgid "It contains a lost+found directory, perhaps due to it being a mount point.\n" -msgstr "Il contient un répertoire lost+found, peut-être parce qu'il s'agit d'un point de montage.\n" +msgid "It contains a lost+found directory, perhaps due to it being a mount point." +msgstr "Il contient un répertoire lost+found, peut-être parce qu'il s'agit d'un point de montage.\\" -#: initdb.c:2790 +#: initdb.c:2675 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" -"Create a subdirectory under the mount point.\n" +"Create a subdirectory under the mount point." msgstr "" "Utiliser un point de montage comme répertoire des données n'est pas recommandé.\n" -"Créez un sous-répertoire sous le point de montage.\n" +"Créez un sous-répertoire sous le point de montage." -#: initdb.c:2816 +#: initdb.c:2701 #, c-format msgid "creating subdirectories ... " msgstr "création des sous-répertoires... " -#: initdb.c:2862 +#: initdb.c:2744 msgid "performing post-bootstrap initialization ... " msgstr "exécution de l'initialisation après bootstrap... " -#: initdb.c:3024 +#: initdb.c:2909 #, c-format msgid "Running in debug mode.\n" msgstr "Lancé en mode débogage.\n" -#: initdb.c:3028 +#: initdb.c:2913 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "Lancé en mode « sans nettoyage ». Les erreurs ne seront pas nettoyées.\n" -#: initdb.c:3108 +#: initdb.c:2983 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "fournisseur de locale non reconnu : %s" + +#: initdb.c:3008 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: initdb.c:3129 initdb.c:3218 +#: initdb.c:3015 +#, c-format +msgid "%s cannot be specified unless locale provider \"%s\" is chosen" +msgstr "%s ne peut pas être spécifié sauf si le fournisseur de locale « %s » est choisi" + +#: initdb.c:3029 initdb.c:3106 msgid "syncing data to disk ... " msgstr "synchronisation des données sur disque... " -#: initdb.c:3138 +#: initdb.c:3037 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "" "les options d'invite du mot de passe et de fichier de mots de passe ne\n" "peuvent pas être indiquées simultanément" -#: initdb.c:3163 +#: initdb.c:3059 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "l'argument de --wal-segsize doit être un nombre" -#: initdb.c:3168 +#: initdb.c:3061 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "l'argument de --wal-segsize doit être une puissance de 2 comprise entre 1 et 1024" -#: initdb.c:3185 +#: initdb.c:3075 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "le nom de superutilisateur « %s » n'est pas autorisé ; les noms de rôle ne peuvent pas commencer par « pg_ »" -#: initdb.c:3189 +#: initdb.c:3077 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -986,17 +1018,17 @@ msgstr "" "Le processus serveur doit également lui appartenir.\n" "\n" -#: initdb.c:3205 +#: initdb.c:3093 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Les sommes de contrôle des pages de données sont activées.\n" -#: initdb.c:3207 +#: initdb.c:3095 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Les sommes de contrôle des pages de données sont désactivées.\n" -#: initdb.c:3224 +#: initdb.c:3112 #, c-format msgid "" "\n" @@ -1007,27 +1039,22 @@ msgstr "" "Synchronisation sur disque ignorée.\n" "Le répertoire des données pourrait être corrompu si le système d'exploitation s'arrêtait brutalement.\n" -#: initdb.c:3229 +#: initdb.c:3117 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "activation de l'authentification « trust » pour les connexions locales" -#: initdb.c:3230 +#: initdb.c:3118 #, c-format -msgid "" -"You can change this by editing pg_hba.conf or using the option -A, or\n" -"--auth-local and --auth-host, the next time you run initdb.\n" -msgstr "" -"Vous pouvez changer cette configuration en éditant le fichier pg_hba.conf\n" -"ou en utilisant l'option -A, ou --auth-local et --auth-host au prochain\n" -"lancement d'initdb.\n" +msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." +msgstr "Vous pouvez changer cette configuration en éditant le fichier pg_hba.conf ou en utilisant l'option -A, ou --auth-local et --auth-host, à la prochaine exécution d'initdb." #. translator: This is a placeholder in a shell command. -#: initdb.c:3260 +#: initdb.c:3148 msgid "logfile" msgstr "fichier_de_trace" -#: initdb.c:3262 +#: initdb.c:3150 #, c-format msgid "" "\n" @@ -1049,46 +1076,43 @@ msgstr "" #~ "\n" #~ "Rapporter les bogues à .\n" -#~ msgid "could not change directory to \"%s\": %s" -#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %s" - -#~ msgid "could not read symbolic link \"%s\"" -#~ msgstr "n'a pas pu lire le lien symbolique « %s »" +#~ msgid "%s: The password file was not generated. Please report this problem.\n" +#~ msgstr "" +#~ "%s : le fichier de mots de passe n'a pas été créé.\n" +#~ "Merci de rapporter ce problème.\n" -#~ msgid "%s: could not stat file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n" +#~ msgid "%s: could not access directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n" -#~ msgid "%s: could not open directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n" +#~ msgid "%s: could not access file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu accéder au fichier « %s » : %s\n" -#~ msgid "%s: could not read directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n" +#~ msgid "%s: could not close directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n" -#~ msgid "%s: could not open file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" +#~ msgid "%s: could not create directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu créer le répertoire « %s » : %s\n" -#~ msgid "%s: could not fsync file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n" +#~ msgid "%s: could not create symbolic link \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu créer le lien symbolique « %s » : %s\n" -#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu renommer le fichier « %s » en « %s » : %s\n" +#~ msgid "%s: could not determine valid short version string\n" +#~ msgstr "%s : n'a pas pu déterminer une chaîne de version courte valide\n" -#~ msgid "could not open directory \"%s\": %s\n" -#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s\n" +#~ msgid "%s: could not execute command \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu exécuter la commande « %s » : %s\n" -#~ msgid "could not read directory \"%s\": %s\n" -#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n" +#~ msgid "%s: could not fsync file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n" -#~ msgid "could not stat file or directory \"%s\": %s\n" -#~ msgstr "" -#~ "n'a pas pu récupérer les informations sur le fichier ou répertoire\n" -#~ "« %s » : %s\n" +#~ msgid "%s: could not get current user name: %s\n" +#~ msgstr "%s : n'a pas pu obtenir le nom de l'utilisateur courant : %s\n" -#~ msgid "child process was terminated by signal %s" -#~ msgstr "le processus fils a été terminé par le signal %s" +#~ msgid "%s: could not obtain information about current user: %s\n" +#~ msgstr "%s : n'a pas pu obtenir d'informations sur l'utilisateur courant : %s\n" -#~ msgid "%s: out of memory\n" -#~ msgstr "%s : mémoire épuisée\n" +#~ msgid "%s: could not open directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n" #~ msgid "%s: could not open file \"%s\" for reading: %s\n" #~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n" @@ -1096,156 +1120,167 @@ msgstr "" #~ msgid "%s: could not open file \"%s\" for writing: %s\n" #~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en écriture : %s\n" -#~ msgid "%s: could not write file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu écrire le fichier « %s » : %s\n" +#~ msgid "%s: could not open file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" -#~ msgid "%s: could not execute command \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu exécuter la commande « %s » : %s\n" +#~ msgid "%s: could not read directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n" -#~ msgid "%s: file \"%s\" does not exist\n" -#~ msgstr "%s : le fichier « %s » n'existe pas\n" +#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu renommer le fichier « %s » en « %s » : %s\n" -#~ msgid "%s: could not access file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu accéder au fichier « %s » : %s\n" +#~ msgid "%s: could not stat file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n" -#~ msgid "%s: failed to restore old locale \"%s\"\n" -#~ msgstr "%s : n'a pas pu restaurer l'ancienne locale « %s »\n" +#~ msgid "%s: could not to allocate SIDs: error code %lu\n" +#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n" -#~ msgid "%s: invalid locale name \"%s\"\n" -#~ msgstr "%s : nom de locale invalide (« %s »)\n" +#~ msgid "%s: could not write file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu écrire le fichier « %s » : %s\n" -#~ msgid "%s: could not create directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu créer le répertoire « %s » : %s\n" +#~ msgid "%s: failed to remove contents of transaction log directory\n" +#~ msgstr "%s : échec de la suppression du contenu du répertoire des journaux de transaction\n" -#~ msgid "%s: could not access directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n" +#~ msgid "%s: failed to remove transaction log directory\n" +#~ msgstr "%s : échec de la suppression du répertoire des journaux de transaction\n" -#~ msgid "%s: could not create symbolic link \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu créer le lien symbolique « %s » : %s\n" +#~ msgid "%s: failed to restore old locale \"%s\"\n" +#~ msgstr "%s : n'a pas pu restaurer l'ancienne locale « %s »\n" -#~ msgid "%s: symlinks are not supported on this platform\n" -#~ msgstr "%s : les liens symboliques ne sont pas supportés sur cette plateforme\n" +#~ msgid "%s: file \"%s\" does not exist\n" +#~ msgstr "%s : le fichier « %s » n'existe pas\n" -#~ msgid "creating template1 database in %s/base/1 ... " -#~ msgstr "création de la base de données template1 dans %s/base/1... " +#~ msgid "%s: invalid locale name \"%s\"\n" +#~ msgstr "%s : nom de locale invalide (« %s »)\n" -#~ msgid "initializing pg_authid ... " -#~ msgstr "initialisation de pg_authid... " +#~ msgid "%s: locale name has non-ASCII characters, skipped: \"%s\"\n" +#~ msgstr "%s : le nom de la locale contient des caractères non ASCII, ignoré : « %s »\n" -#~ msgid "setting password ... " -#~ msgstr "initialisation du mot de passe... " +#~ msgid "%s: locale name too long, skipped: \"%s\"\n" +#~ msgstr "%s : nom de locale trop long, ignoré : « %s »\n" -#~ msgid "initializing dependencies ... " -#~ msgstr "initialisation des dépendances... " +#~ msgid "%s: out of memory\n" +#~ msgstr "%s : mémoire épuisée\n" -#~ msgid "creating system views ... " -#~ msgstr "création des vues système... " +#~ msgid "%s: removing contents of transaction log directory \"%s\"\n" +#~ msgstr "%s : suppression du contenu du répertoire des journaux de transaction « %s »\n" -#~ msgid "loading system objects' descriptions ... " -#~ msgstr "chargement de la description des objets système... " +#~ msgid "%s: removing transaction log directory \"%s\"\n" +#~ msgstr "%s : suppression du répertoire des journaux de transaction « %s »\n" -#~ msgid "creating collations ... " -#~ msgstr "création des collationnements... " +#~ msgid "%s: symlinks are not supported on this platform\n" +#~ msgstr "%s : les liens symboliques ne sont pas supportés sur cette plateforme\n" -#~ msgid "not supported on this platform\n" -#~ msgstr "non supporté sur cette plateforme\n" +#~ msgid "%s: transaction log directory \"%s\" not removed at user's request\n" +#~ msgstr "" +#~ "%s : répertoire des journaux de transaction « %s » non supprimé à la demande\n" +#~ "de l'utilisateur\n" -#~ msgid "creating conversions ... " -#~ msgstr "création des conversions... " +#~ msgid "%s: unrecognized authentication method \"%s\"\n" +#~ msgstr "%s : méthode d'authentification « %s » inconnue.\n" -#~ msgid "creating dictionaries ... " -#~ msgstr "création des dictionnaires... " +#~ msgid "No usable system locales were found.\n" +#~ msgstr "Aucune locale système utilisable n'a été trouvée.\n" -#~ msgid "setting privileges on built-in objects ... " -#~ msgstr "initialisation des droits sur les objets internes... " +#~ msgid "" +#~ "The program \"postgres\" is needed by %s but was not found in the\n" +#~ "same directory as \"%s\".\n" +#~ "Check your installation." +#~ msgstr "" +#~ "Le programme « postgres » est nécessaire à %s mais n'a pas été trouvé dans\n" +#~ "le même répertoire que « %s ».\n" +#~ "Vérifiez votre installation." -#~ msgid "creating information schema ... " -#~ msgstr "création du schéma d'informations... " +#~ msgid "" +#~ "The program \"postgres\" was found by \"%s\"\n" +#~ "but was not the same version as %s.\n" +#~ "Check your installation." +#~ msgstr "" +#~ "Le programme « postgres » a été trouvé par « %s » mais n'est pas de la même\n" +#~ "version que « %s ».\n" +#~ "Vérifiez votre installation." -#~ msgid "loading PL/pgSQL server-side language ... " -#~ msgstr "chargement du langage PL/pgSQL... " +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Essayer « %s --help » pour plus d'informations.\n" -#~ msgid "vacuuming database template1 ... " -#~ msgstr "lancement du vacuum sur la base de données template1... " +#~ msgid "Use the option \"--debug\" to see details.\n" +#~ msgstr "Utilisez l'option « --debug » pour voir le détail.\n" -#~ msgid "copying template1 to template0 ... " -#~ msgstr "copie de template1 vers template0... " +#~ msgid "child process was terminated by signal %s" +#~ msgstr "le processus fils a été terminé par le signal %s" #~ msgid "copying template1 to postgres ... " #~ msgstr "copie de template1 vers postgres... " -#~ msgid "%s: could not to allocate SIDs: error code %lu\n" -#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n" +#~ msgid "copying template1 to template0 ... " +#~ msgstr "copie de template1 vers template0... " #~ msgid "could not change directory to \"%s\"" #~ msgstr "n'a pas pu accéder au répertoire « %s »" -#~ msgid "%s: The password file was not generated. Please report this problem.\n" -#~ msgstr "" -#~ "%s : le fichier de mots de passe n'a pas été créé.\n" -#~ "Merci de rapporter ce problème.\n" +#~ msgid "could not change directory to \"%s\": %s" +#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %s" -#~ msgid "%s: could not determine valid short version string\n" -#~ msgstr "%s : n'a pas pu déterminer une chaîne de version courte valide\n" +#~ msgid "could not open directory \"%s\": %s\n" +#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s\n" -#~ msgid "%s: unrecognized authentication method \"%s\"\n" -#~ msgstr "%s : méthode d'authentification « %s » inconnue.\n" +#~ msgid "could not read directory \"%s\": %s\n" +#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n" -#~ msgid "%s: could not get current user name: %s\n" -#~ msgstr "%s : n'a pas pu obtenir le nom de l'utilisateur courant : %s\n" +#~ msgid "could not read symbolic link \"%s\"" +#~ msgstr "n'a pas pu lire le lien symbolique « %s »" -#~ msgid "%s: could not obtain information about current user: %s\n" -#~ msgstr "%s : n'a pas pu obtenir d'informations sur l'utilisateur courant : %s\n" +#~ msgid "could not stat file or directory \"%s\": %s\n" +#~ msgstr "" +#~ "n'a pas pu récupérer les informations sur le fichier ou répertoire\n" +#~ "« %s » : %s\n" -#~ msgid "%s: could not close directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n" +#~ msgid "creating collations ... " +#~ msgstr "création des collationnements... " -#~ msgid "Use the option \"--debug\" to see details.\n" -#~ msgstr "Utilisez l'option « --debug » pour voir le détail.\n" +#~ msgid "creating conversions ... " +#~ msgstr "création des conversions... " -#~ msgid "No usable system locales were found.\n" -#~ msgstr "Aucune locale système utilisable n'a été trouvée.\n" +#~ msgid "creating dictionaries ... " +#~ msgstr "création des dictionnaires... " -#~ msgid "%s: locale name has non-ASCII characters, skipped: \"%s\"\n" -#~ msgstr "%s : le nom de la locale contient des caractères non ASCII, ignoré : « %s »\n" +#~ msgid "creating information schema ... " +#~ msgstr "création du schéma d'informations... " -#~ msgid "%s: locale name too long, skipped: \"%s\"\n" -#~ msgstr "%s : nom de locale trop long, ignoré : « %s »\n" +#~ msgid "creating system views ... " +#~ msgstr "création des vues système... " -#~ msgid "%s: transaction log directory \"%s\" not removed at user's request\n" -#~ msgstr "" -#~ "%s : répertoire des journaux de transaction « %s » non supprimé à la demande\n" -#~ "de l'utilisateur\n" +#~ msgid "creating template1 database in %s/base/1 ... " +#~ msgstr "création de la base de données template1 dans %s/base/1... " -#~ msgid "%s: failed to remove contents of transaction log directory\n" -#~ msgstr "%s : échec de la suppression du contenu du répertoire des journaux de transaction\n" +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatal : " -#~ msgid "%s: removing contents of transaction log directory \"%s\"\n" -#~ msgstr "%s : suppression du contenu du répertoire des journaux de transaction « %s »\n" +#~ msgid "initializing dependencies ... " +#~ msgstr "initialisation des dépendances... " -#~ msgid "%s: failed to remove transaction log directory\n" -#~ msgstr "%s : échec de la suppression du répertoire des journaux de transaction\n" +#~ msgid "initializing pg_authid ... " +#~ msgstr "initialisation de pg_authid... " -#~ msgid "%s: removing transaction log directory \"%s\"\n" -#~ msgstr "%s : suppression du répertoire des journaux de transaction « %s »\n" +#~ msgid "loading PL/pgSQL server-side language ... " +#~ msgstr "chargement du langage PL/pgSQL... " -#~ msgid "" -#~ "The program \"postgres\" was found by \"%s\"\n" -#~ "but was not the same version as %s.\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « postgres » a été trouvé par « %s » mais n'est pas de la même\n" -#~ "version que « %s ».\n" -#~ "Vérifiez votre installation." +#~ msgid "loading system objects' descriptions ... " +#~ msgstr "chargement de la description des objets système... " -#~ msgid "" -#~ "The program \"postgres\" is needed by %s but was not found in the\n" -#~ "same directory as \"%s\".\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « postgres » est nécessaire à %s mais n'a pas été trouvé dans\n" -#~ "le même répertoire que « %s ».\n" -#~ "Vérifiez votre installation." +#~ msgid "not supported on this platform\n" +#~ msgstr "non supporté sur cette plateforme\n" #~ msgid "pclose failed: %m" #~ msgstr "échec de pclose : %m" + +#~ msgid "setting password ... " +#~ msgstr "initialisation du mot de passe... " + +#~ msgid "setting privileges on built-in objects ... " +#~ msgstr "initialisation des droits sur les objets internes... " + +#~ msgid "vacuuming database template1 ... " +#~ msgstr "lancement du vacuum sur la base de données template1... " diff --git a/src/bin/initdb/po/ja.po b/src/bin/initdb/po/ja.po index 420caed5af..998c9b597d 100644 --- a/src/bin/initdb/po/ja.po +++ b/src/bin/initdb/po/ja.po @@ -1,13 +1,13 @@ # Japanese message translation file for initdb -# Copyright (C) 2019 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: initdb (PostgreSQL 13)\n" +"Project-Id-Version: initdb (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:53+0900\n" -"PO-Revision-Date: 2020-09-13 08:55+0200\n" +"POT-Creation-Date: 2022-05-11 14:16+0900\n" +"PO-Revision-Date: 2022-05-10 10:32+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -17,58 +17,63 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:241 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " - -#: ../../../src/common/logging.c:248 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:255 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "警告: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "ヒント: " + +#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "カレントディレクトリを特定できませんでした: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "バイナリ\"%s\"は無効です" -#: ../../common/exec.c:206 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "バイナリ\"%s\"を読み取れませんでした" -#: ../../common/exec.c:214 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "実行する\"%s\"がありませんでした" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:282 ../../common/exec.c:321 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "ディレクトリ\"%s\"に移動できませんでした: %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:299 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を読めませんでした: %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:422 #, c-format -msgid "pclose failed: %m" -msgstr "pcloseが失敗しました: %m" +msgid "%s() failed: %m" +msgstr "%s() が失敗しました: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 -#: initdb.c:325 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: initdb.c:334 #, c-format msgid "out of memory" msgstr "メモリ不足です" @@ -84,33 +89,33 @@ msgstr "メモリ不足です\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ポインタを複製できません(内部エラー)。\n" -#: ../../common/file_utils.c:84 ../../common/file_utils.c:186 +#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"のstatに失敗しました: %m" -#: ../../common/file_utils.c:163 ../../common/pgfnames.c:48 +#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" -#: ../../common/file_utils.c:197 ../../common/pgfnames.c:69 +#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69 #, c-format msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m" -#: ../../common/file_utils.c:229 ../../common/file_utils.c:288 -#: ../../common/file_utils.c:362 +#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 +#: ../../common/file_utils.c:365 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンできませんでした: %m" -#: ../../common/file_utils.c:300 ../../common/file_utils.c:370 +#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"をfsyncできませんでした: %m" -#: ../../common/file_utils.c:380 +#: ../../common/file_utils.c:383 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" @@ -155,7 +160,7 @@ msgstr "コマンド\"%s\"のためのプロセスを起動できませんでし msgid "could not re-execute with restricted token: error code %lu" msgstr "制限付きトークンで再実行できませんでした: %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "サブプロセスの終了コードを取得できませんでした: エラーコード %lu" @@ -173,16 +178,16 @@ msgstr "\"%s\"というファイルまたはディレクトリを削除できま #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" -msgstr "実効ユーザID %ld が見つかりませんでした: %s" +msgstr "実効ユーザーID %ld が見つかりませんでした: %s" #: ../../common/username.c:45 msgid "user does not exist" -msgstr "ユーザが存在しません" +msgstr "ユーザーが存在しません" #: ../../common/username.c:60 #, c-format msgid "user name lookup failure: error code %lu" -msgstr "ユーザ名の参照に失敗: エラーコード %lu" +msgstr "ユーザー名の参照に失敗: エラーコード %lu" #: ../../common/wait_error.c:45 #, c-format @@ -224,258 +229,261 @@ msgstr "\"%s\"のjunctionを設定できませんでした: %s\n" msgid "could not get junction for \"%s\": %s\n" msgstr "\"%s\"のjunctionを入手できませんでした: %s\n" -#: initdb.c:481 initdb.c:1517 +#: initdb.c:464 initdb.c:1456 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読み取り用にオープンできませんでした: %m" -#: initdb.c:536 initdb.c:852 initdb.c:878 +#: initdb.c:505 initdb.c:809 initdb.c:829 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "ファイル\"%s\"を書き込み用にオープンできませんでした: %m" -#: initdb.c:543 initdb.c:550 initdb.c:858 initdb.c:883 +#: initdb.c:509 initdb.c:812 initdb.c:831 #, c-format msgid "could not write file \"%s\": %m" msgstr "ファイル\"%s\"を書き出せませんでした: %m" -#: initdb.c:568 +#: initdb.c:513 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "ファイル\"%s\"をクローズできませんでした: %m" + +#: initdb.c:529 #, c-format msgid "could not execute command \"%s\": %m" msgstr "コマンド\"%s\"を実行できませんでした: %m" -#: initdb.c:586 +#: initdb.c:547 #, c-format msgid "removing data directory \"%s\"" msgstr "データディレクトリ\"%s\"を削除しています" -#: initdb.c:588 +#: initdb.c:549 #, c-format msgid "failed to remove data directory" msgstr "データディレクトリの削除に失敗しました" -#: initdb.c:592 +#: initdb.c:553 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "データディレクトリ\"%s\"の内容を削除しています" -#: initdb.c:595 +#: initdb.c:556 #, c-format msgid "failed to remove contents of data directory" msgstr "データディレクトリの内容の削除に失敗しました" -#: initdb.c:600 +#: initdb.c:561 #, c-format msgid "removing WAL directory \"%s\"" msgstr "WAL ディレクトリ\"%s\"を削除しています" -#: initdb.c:602 +#: initdb.c:563 #, c-format msgid "failed to remove WAL directory" msgstr "WAL ディレクトリの削除に失敗しました" -#: initdb.c:606 +#: initdb.c:567 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "WAL ディレクトリ\"%s\"の中身を削除しています" -#: initdb.c:608 +#: initdb.c:569 #, c-format msgid "failed to remove contents of WAL directory" msgstr "WAL ディレクトリの中身の削除に失敗しました" -#: initdb.c:615 +#: initdb.c:576 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "ユーザの要求によりデータディレクトリ\"%s\"を削除しませんでした" -#: initdb.c:619 +#: initdb.c:580 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "ユーザの要求により WAL ディレクトリ\"%s\"を削除しませんでした" -#: initdb.c:637 +#: initdb.c:598 #, c-format msgid "cannot be run as root" msgstr "root では実行できません" -#: initdb.c:639 +#: initdb.c:599 #, c-format -msgid "" -"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" -"own the server process.\n" -msgstr "" -"サーバプロセスの所有者となる(非特権)ユーザとして(例えば\"su\"を使用して)ログイン\n" -"してください。\n" +msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." +msgstr "サーバープロセスの所有者となる(非特権)ユーザーとして(例えば\"su\"を使用して)ログインしてください。" -#: initdb.c:672 +#: initdb.c:631 #, c-format msgid "\"%s\" is not a valid server encoding name" -msgstr "\"%s\"は有効なサーバ符号化方式名ではありません" +msgstr "\"%s\"は有効なサーバー符号化方式名ではありません" -#: initdb.c:811 +#: initdb.c:775 #, c-format msgid "file \"%s\" does not exist" msgstr "ファイル\"%s\"は存在しません" -#: initdb.c:813 initdb.c:820 initdb.c:829 +#: initdb.c:776 initdb.c:781 initdb.c:788 #, c-format -msgid "" -"This might mean you have a corrupted installation or identified\n" -"the wrong directory with the invocation option -L.\n" -msgstr "" -"インストール先が破損しているか -L オプションで間違ったディレクトリを指定した\n" -"可能性があります。\n" +msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." +msgstr "インストール先が破損しているか実行時オプション-Lで間違ったディレクトリを指定した可能性があります。" -#: initdb.c:818 +#: initdb.c:780 #, c-format msgid "could not access file \"%s\": %m" msgstr "ファイル\"%s\"にアクセスできませんでした: %m" -#: initdb.c:827 +#: initdb.c:787 #, c-format msgid "file \"%s\" is not a regular file" msgstr "ファイル\"%s\"は通常のファイルではありません" -#: initdb.c:972 +#: initdb.c:919 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "動的共有メモリの実装を選択しています ... " -#: initdb.c:981 +#: initdb.c:928 #, c-format msgid "selecting default max_connections ... " msgstr "デフォルトのmax_connectionsを選択しています ... " -#: initdb.c:1012 +#: initdb.c:959 #, c-format msgid "selecting default shared_buffers ... " msgstr "デフォルトのshared_buffersを選択しています ... " -#: initdb.c:1046 +#: initdb.c:993 #, c-format msgid "selecting default time zone ... " msgstr "デフォルトの時間帯を選択しています ... " -#: initdb.c:1080 +#: initdb.c:1027 msgid "creating configuration files ... " msgstr "設定ファイルを作成しています ... " -#: initdb.c:1239 initdb.c:1258 initdb.c:1344 initdb.c:1359 +#: initdb.c:1185 initdb.c:1201 initdb.c:1284 initdb.c:1296 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "\"%s\"の権限を変更できませんでした: %m" -#: initdb.c:1381 +#: initdb.c:1316 #, c-format msgid "running bootstrap script ... " msgstr "ブートストラップスクリプトを実行しています ... " -#: initdb.c:1393 +#: initdb.c:1328 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "入力ファイル\"%s\"は PostgreSQL %s のものではありません" -#: initdb.c:1396 +#: initdb.c:1330 #, c-format -msgid "Check your installation or specify the correct path using the option -L.\n" -msgstr "インストール先を確認するか、-Lオプションを使用して正しいパスを指定してください。\n" +msgid "Specify the correct path using the option -L." +msgstr "-Lオプションを使用して正しいパスを指定してください。" -#: initdb.c:1494 +#: initdb.c:1434 msgid "Enter new superuser password: " -msgstr "新しいスーパユーザのパスワードを入力してください:" +msgstr "新しいスーパーユーザーのパスワードを入力してください:" -#: initdb.c:1495 +#: initdb.c:1435 msgid "Enter it again: " msgstr "再入力してください:" -#: initdb.c:1498 +#: initdb.c:1438 #, c-format msgid "Passwords didn't match.\n" msgstr "パスワードが一致しません。\n" -#: initdb.c:1524 +#: initdb.c:1462 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "ファイル\"%s\"からパスワードを読み取ることができませんでした: %m" -#: initdb.c:1527 +#: initdb.c:1465 #, c-format msgid "password file \"%s\" is empty" msgstr "パスワードファイル\"%s\"が空です" -#: initdb.c:2055 +#: initdb.c:1912 #, c-format msgid "caught signal\n" msgstr "シグナルが発生しました\n" -#: initdb.c:2061 +#: initdb.c:1918 #, c-format msgid "could not write to child process: %s\n" msgstr "子プロセスへの書き込みができませんでした: %s\n" -#: initdb.c:2069 +#: initdb.c:1926 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2159 +#: initdb.c:2015 #, c-format msgid "setlocale() failed" msgstr "setlocale()が失敗しました" -#: initdb.c:2180 +#: initdb.c:2033 #, c-format msgid "failed to restore old locale \"%s\"" msgstr "古いロケール\"%s\"を復元できませんでした" -#: initdb.c:2189 +#: initdb.c:2040 #, c-format msgid "invalid locale name \"%s\"" msgstr "ロケール名\"%s\"は不正です" -#: initdb.c:2200 +#: initdb.c:2051 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "不正なロケール設定; 環境変数LANGおよびLC_* を確認してください" -#: initdb.c:2227 +#: initdb.c:2077 #, c-format msgid "encoding mismatch" msgstr "符号化方式が合いません" -#: initdb.c:2229 +#: initdb.c:2078 #, c-format -msgid "" -"The encoding you selected (%s) and the encoding that the\n" -"selected locale uses (%s) do not match. This would lead to\n" -"misbehavior in various character string processing functions.\n" -"Rerun %s and either do not specify an encoding explicitly,\n" -"or choose a matching combination.\n" -msgstr "" -"選択した符号化方式(%s)と選択したロケールが使用する符号化方式(%s)が\n" -"合っていません。これにより各種の文字列処理関数が間違った動作をすることに\n" -"なります。明示的な符号化方式の指定を止めるか合致する組み合わせを\n" -"選択して %s を再実行してください\n" +msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." +msgstr "選択した符号化方式(%s)と選択したロケールが使用する符号化方式(%s)が合っていません。これにより各種の文字列処理関数が間違った動作をすることになります。" + +#: initdb.c:2083 +#, c-format +msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." +msgstr "%sを再度実行してください、その際にはエンコーディングを明示的に指定しないか、適合する組み合わせを選択してください。" + +#: initdb.c:2145 +#, c-format +msgid "ICU locale must be specified" +msgstr "ICUロケールを指定しなければなりません" -#: initdb.c:2301 +#: initdb.c:2152 +#, c-format +msgid "ICU is not supported in this build" +msgstr "このビルドではICUはサポートされていません" + +#: initdb.c:2163 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" "\n" msgstr "%sはPostgreSQLデータベースクラスタを初期化します。\n" -#: initdb.c:2302 +#: initdb.c:2164 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: initdb.c:2303 +#: initdb.c:2165 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATADIR]\n" -#: initdb.c:2304 +#: initdb.c:2166 #, c-format msgid "" "\n" @@ -484,42 +492,52 @@ msgstr "" "\n" "オプション:\n" -#: initdb.c:2305 +#: initdb.c:2167 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, --auth=METHOD ローカル接続のデフォルト認証方式\n" -#: initdb.c:2306 +#: initdb.c:2168 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr " --auth-host=METHOD ローカルTCP/IP接続のデフォルト認証方式\n" -#: initdb.c:2307 +#: initdb.c:2169 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr " --auth-local=METHOD ローカルソケット接続のデフォルト認証方式\n" -#: initdb.c:2308 +#: initdb.c:2170 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DATADIR データベースクラスタの場所\n" -#: initdb.c:2309 +#: initdb.c:2171 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=ENCODING 新規データベースのデフォルト符号化方式\n" -#: initdb.c:2310 +#: initdb.c:2172 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr " -g, --allow-group-access データディレクトリのグループ読み取り/実行を許可\n" -#: initdb.c:2311 +#: initdb.c:2173 +#, c-format +msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" +msgstr " --icu-locale=LOCALE 新しいデータベースのICUロケールIDを設定\n" + +#: initdb.c:2174 +#, c-format +msgid " -k, --data-checksums use data page checksums\n" +msgstr " -k, --data-checksums データページのチェックサムを使用\n" + +#: initdb.c:2175 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOCALE 新しいデータベースのデフォルトロケールをセット\n" -#: initdb.c:2312 +#: initdb.c:2176 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -533,19 +551,29 @@ msgstr "" " デフォルトロケールを設定(デフォルト値は環境変数から\n" " 取得)\n" -#: initdb.c:2316 +#: initdb.c:2180 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale --locale=C と同じ\n" -#: initdb.c:2317 +#: initdb.c:2181 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" set default locale provider for new databases\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" 新しいデータベースにおけるデフォルトのロケール\n" +" プロバイダを設定\n" + +#: initdb.c:2183 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr "" -" --pwfile=ファイル名 新しいスーパーユーザのパスワードをファイルから\n" +" --pwfile=ファイル名 新しいスーパーユーザーのパスワードをファイルから\n" " 読み込む\n" -#: initdb.c:2318 +#: initdb.c:2184 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -554,27 +582,27 @@ msgstr "" " -T, --text-search-config=CFG\\\n" " デフォルトのテキスト検索設定\n" -#: initdb.c:2320 +#: initdb.c:2186 #, c-format msgid " -U, --username=NAME database superuser name\n" -msgstr " -U, --username=NAME データベーススーパーユーザの名前\n" +msgstr " -U, --username=NAME データベースのスーパーユーザーの名前\n" -#: initdb.c:2321 +#: initdb.c:2187 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" -msgstr " -W, --pwprompt 新規スーパーユーザに対してパスワード入力を促す\n" +msgstr " -W, --pwprompt 新規スーパーユーザーに対してパスワード入力を促す\n" -#: initdb.c:2322 +#: initdb.c:2188 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR 先行書き込みログ用ディレクトリの位置\n" -#: initdb.c:2323 +#: initdb.c:2189 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=SIZE WALセグメントのサイズ、メガバイト単位\n" -#: initdb.c:2324 +#: initdb.c:2190 #, c-format msgid "" "\n" @@ -583,42 +611,47 @@ msgstr "" "\n" "使用頻度の低いオプション:\n" -#: initdb.c:2325 +#: initdb.c:2191 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug 多くのデバッグ用の出力を生成\n" -#: initdb.c:2326 +#: initdb.c:2192 #, c-format -msgid " -k, --data-checksums use data page checksums\n" -msgstr " -k, --data-checksums データページのチェックサムを使用\n" +msgid " --discard-caches set debug_discard_caches=1\n" +msgstr " --discard-caches debug_discard_cachesを1に設定する\n" -#: initdb.c:2327 +#: initdb.c:2193 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRECTORY 入力ファイルの場所を指定\n" -#: initdb.c:2328 +#: initdb.c:2194 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean エラー発生後のクリーンアップを行わない\n" -#: initdb.c:2329 +#: initdb.c:2195 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync 変更の安全なディスクへの書き出しを待機しない\n" -#: initdb.c:2330 +#: initdb.c:2196 +#, c-format +msgid " --no-instructions do not print instructions for next steps\n" +msgstr " --no-instructions 次の手順の指示を表示しない\n" + +#: initdb.c:2197 #, c-format msgid " -s, --show show internal settings\n" msgstr " -s, --show 内部設定を表示\n" -#: initdb.c:2331 +#: initdb.c:2198 #, c-format -msgid " -S, --sync-only only sync data directory\n" -msgstr " -S, --sync-only データディレクトリのsyncのみを実行\n" +msgid " -S, --sync-only only sync database files to disk, then exit\n" +msgstr " -S, --sync-only データベースファイルのsyncのみを実行して終了\n" -#: initdb.c:2332 +#: initdb.c:2199 #, c-format msgid "" "\n" @@ -627,17 +660,17 @@ msgstr "" "\n" "その他のオプション:\n" -#: initdb.c:2333 +#: initdb.c:2200 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: initdb.c:2334 +#: initdb.c:2201 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: initdb.c:2335 +#: initdb.c:2202 #, c-format msgid "" "\n" @@ -647,7 +680,7 @@ msgstr "" "\n" "データディレクトリが指定されない場合、PGDATA環境変数が使用されます。\n" -#: initdb.c:2337 +#: initdb.c:2204 #, c-format msgid "" "\n" @@ -656,305 +689,307 @@ msgstr "" "\n" "バグは<%s>に報告してください。\n" -#: initdb.c:2338 +#: initdb.c:2205 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: initdb.c:2366 +#: initdb.c:2233 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "\"%2$s\"接続では認証方式\"%1$s\"は無効です" -#: initdb.c:2382 +#: initdb.c:2247 #, c-format msgid "must specify a password for the superuser to enable password authentication" -msgstr "パスワード認証を有効にするにはスーパユーザのパスワードを指定する必要があります" +msgstr "パスワード認証を有効にするにはスーパーユーザーのパスワードを指定する必要があります" -#: initdb.c:2404 +#: initdb.c:2266 #, c-format msgid "no data directory specified" msgstr "データディレクトリが指定されていません" -#: initdb.c:2406 +#: initdb.c:2267 #, c-format -msgid "" -"You must identify the directory where the data for this database system\n" -"will reside. Do this with either the invocation option -D or the\n" -"environment variable PGDATA.\n" -msgstr "" -"データベースシステムのデータを格納するディレクトリを指定する必要があります。\n" -"実行時オプション -D、もしくは、PGDATA環境変数で指定してください。\n" +msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." +msgstr "データベースシステムのデータを格納するディレクトリを指定する必要があります。実行時オプション -D、もしくは、PGDATA環境変数で指定してください。" -#: initdb.c:2441 +#: initdb.c:2284 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"%2$sにはプログラム\"%1$s\"が必要ですが、\"%3$s\"と同じディレクトリ\n" -"にありませんでした。\n" -"インストール状況を確認してください。" +msgid "could not set environment" +msgstr "環境を設定できません" -#: initdb.c:2446 +#: initdb.c:2302 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じ\n" -"バージョンではありませんでした。\n" -"インストール状況を確認してください。" +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "%2$sにはプログラム\"%1$s\"が必要ですが、\"%3$s\"と同じディレクトリにはありませんでした。" -#: initdb.c:2465 +#: initdb.c:2305 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じバージョンではありませんでした。" + +#: initdb.c:2320 #, c-format msgid "input file location must be an absolute path" msgstr "入力ファイルの場所は絶対パスでなければなりません" -#: initdb.c:2482 +#: initdb.c:2337 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "データベースクラスタはロケール\"%s\"で初期化されます。\n" -#: initdb.c:2485 +#: initdb.c:2340 +#, c-format +msgid "The database cluster will be initialized with this locale configuration:\n" +msgstr "データベースクラスタは以下のロケール構成で初期化されます。\n" + +#: initdb.c:2341 +#, c-format +msgid " provider: %s\n" +msgstr " プロバイダ: %s\n" + +#: initdb.c:2343 +#, c-format +msgid " ICU locale: %s\n" +msgstr " ICUロケール: %s\n" + +#: initdb.c:2344 #, c-format msgid "" -"The database cluster will be initialized with locales\n" -" COLLATE: %s\n" -" CTYPE: %s\n" -" MESSAGES: %s\n" -" MONETARY: %s\n" -" NUMERIC: %s\n" -" TIME: %s\n" +" LC_COLLATE: %s\n" +" LC_CTYPE: %s\n" +" LC_MESSAGES: %s\n" +" LC_MONETARY: %s\n" +" LC_NUMERIC: %s\n" +" LC_TIME: %s\n" msgstr "" -"データベースクラスタは以下のロケールで初期化されます。\n" -" COLLATE: %s\n" -" CTYPE: %s\n" -" MESSAGES: %s\n" -" MONETARY: %s\n" -" NUMERIC: %s\n" -" TIME: %s\n" +" LC_COLLATE: %s\n" +" LC_CTYPE: %s\n" +" LC_MESSAGES: %s\n" +" LC_MONETARY: %s\n" +" LC_NUMERIC: %s\n" +" LC_TIME: %s\n" -#: initdb.c:2509 +#: initdb.c:2369 #, c-format msgid "could not find suitable encoding for locale \"%s\"" -msgstr "ロケール\"%s\"用に適切な符号化方式がありませんでした" +msgstr "ロケール\"%s\"に対して適切な符号化方式がありませんでした" -#: initdb.c:2511 +#: initdb.c:2371 #, c-format -msgid "Rerun %s with the -E option.\n" -msgstr "-Eオプションを付けて%sを再実行してください。\n" +msgid "Rerun %s with the -E option." +msgstr "-Eオプションを付けて%sを再実行してください。" -#: initdb.c:2512 initdb.c:3134 initdb.c:3155 +#: initdb.c:2372 initdb.c:2989 initdb.c:3009 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "詳細は\"%s --help\"で確認してください。\n" +msgid "Try \"%s --help\" for more information." +msgstr "詳細は\"%s --help\"を実行してください。" -#: initdb.c:2525 +#: initdb.c:2384 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" "The default database encoding will be set to \"%s\" instead.\n" msgstr "" -"ロケールにより暗黙的に指定される符号化方式\"%s\"はサーバ側の\n" +"ロケールにより暗黙的に指定される符号化方式\"%s\"はサーバー側の\n" "符号化方式として使用できません。\n" "デフォルトのデータベース符号化方式は代わりに\"%s\"に設定されます。\n" -#: initdb.c:2530 +#: initdb.c:2389 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "ロケール\"%s\"は非サポートの符号化方式\"%s\"を必要とします" -#: initdb.c:2533 +#: initdb.c:2391 #, c-format -msgid "" -"Encoding \"%s\" is not allowed as a server-side encoding.\n" -"Rerun %s with a different locale selection.\n" -msgstr "" -"符号化方式\"%s\"はサーバ側の符号化方式として使用できません。\n" -"別のロケールを選択して%sを再実行してください。\n" +msgid "Encoding \"%s\" is not allowed as a server-side encoding." +msgstr "符号化方式\"%s\"はサーバー側の符号化方式として使用できません。" -#: initdb.c:2542 +#: initdb.c:2393 +#, c-format +msgid "Rerun %s with a different locale selection." +msgstr "別のローケルを選択して%sを再実行してください。" + +#: initdb.c:2401 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "デフォルトのデータベース符号化方式はそれに対応して%sに設定されました。\n" -#: initdb.c:2604 +#: initdb.c:2466 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "ロケール\"%s\"用の適切なテキスト検索設定が見つかりませんでした" -#: initdb.c:2615 +#: initdb.c:2477 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "ロケール\"%s\"に適したテキスト検索設定が不明です" -#: initdb.c:2620 +#: initdb.c:2482 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "指定したテキスト検索設定\"%s\"がロケール\"%s\"に合わない可能性があります" -#: initdb.c:2625 +#: initdb.c:2487 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "デフォルトのテキスト検索構成は %s に設定されます。\n" -#: initdb.c:2669 initdb.c:2751 +#: initdb.c:2530 initdb.c:2601 #, c-format msgid "creating directory %s ... " msgstr "ディレクトリ%sを作成しています ... " -#: initdb.c:2675 initdb.c:2757 initdb.c:2822 initdb.c:2884 +#: initdb.c:2535 initdb.c:2606 initdb.c:2658 initdb.c:2714 #, c-format msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" -#: initdb.c:2686 initdb.c:2769 +#: initdb.c:2544 initdb.c:2616 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "ディレクトリ%sの権限を設定しています ... " -#: initdb.c:2692 initdb.c:2775 +#: initdb.c:2549 initdb.c:2621 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "ディレクトリ\"%s\"の権限を変更できませんでした: %m" -#: initdb.c:2706 initdb.c:2789 +#: initdb.c:2561 initdb.c:2633 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "ディレクトリ\"%s\"は存在しますが、空ではありません" -#: initdb.c:2711 +#: initdb.c:2565 #, c-format -msgid "" -"If you want to create a new database system, either remove or empty\n" -"the directory \"%s\" or run %s\n" -"with an argument other than \"%s\".\n" -msgstr "" -"新規にデータベースシステムを作成したいのであれば、ディレクトリ\n" -"\"%s\"を削除するか空にしてください。\n" -"または、%sを\"%s\"以外の引数で実行してください。\n" +msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." +msgstr "新規にデータベースシステムを作成したいのであれば、ディレクトリ\"%s\"を削除あるいは空にする、または%sを\"%s\"以外の引数で実行してください。" -#: initdb.c:2719 initdb.c:2801 initdb.c:3170 +#: initdb.c:2573 initdb.c:2643 initdb.c:3026 #, c-format msgid "could not access directory \"%s\": %m" msgstr "ディレクトリ\"%s\"にアクセスできませんでした: %m" -#: initdb.c:2742 +#: initdb.c:2594 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL ディレクトリの位置は、絶対パスでなければなりません" -#: initdb.c:2794 +#: initdb.c:2637 #, c-format -msgid "" -"If you want to store the WAL there, either remove or empty the directory\n" -"\"%s\".\n" -msgstr "" -"そこにトランザクションログを格納したい場合は、ディレクトリ\"%s\"を削除するか\n" -"空にしてください。\n" +msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." +msgstr "そこにWALを格納したい場合は、ディレクトリ\"%s\"を削除するか空にしてください。" -#: initdb.c:2808 +#: initdb.c:2648 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を作成できませんでした: %m" -#: initdb.c:2813 +#: initdb.c:2651 #, c-format msgid "symlinks are not supported on this platform" msgstr "このプラットフォームでシンボリックリンクはサポートされていません" -#: initdb.c:2837 +#: initdb.c:2670 #, c-format -msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n" -msgstr "先頭がドットまたは不可視なファイルが含まれています。マウントポイントであることが原因かもしれません\n" +msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." +msgstr "おそらくマウントポイントであることに起因した先頭がドットであるファイル、または不可視なファイルが含まれています。" -#: initdb.c:2840 +#: initdb.c:2672 #, c-format -msgid "It contains a lost+found directory, perhaps due to it being a mount point.\n" -msgstr "lost+foundディレクトリが含まれています。マウントポイントであることが原因かもしれません\n" +msgid "It contains a lost+found directory, perhaps due to it being a mount point." +msgstr "おそらくマウントポイントであることに起因したlost+foundディレクトリが含まれています。" -#: initdb.c:2843 +#: initdb.c:2674 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" -"Create a subdirectory under the mount point.\n" +"Create a subdirectory under the mount point." msgstr "" -"マウントポイントであるディレクトリをデータディレクトリとして使用することは勧めません\n" -"マウントポイントの下にサブディレクトリを作成してください\n" +"マウントポイントであるディレクトリをデータディレクトリとして使用することはお勧めしません。\n" +"この下にサブディレクトリを作成してください。" -#: initdb.c:2869 +#: initdb.c:2700 #, c-format msgid "creating subdirectories ... " msgstr "サブディレクトリを作成しています ... " -#: initdb.c:2915 +#: initdb.c:2743 msgid "performing post-bootstrap initialization ... " msgstr "ブートストラップ後の初期化を実行しています ... " -#: initdb.c:3072 +#: initdb.c:2908 #, c-format msgid "Running in debug mode.\n" msgstr "デバッグモードで実行しています。\n" -#: initdb.c:3076 +#: initdb.c:2912 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "no-clean モードで実行しています。失敗した状況は削除されません。\n" -#: initdb.c:3153 +#: initdb.c:2982 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "認識できない照合順序プロバイダ: %s" + +#: initdb.c:3007 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")" -#: initdb.c:3174 initdb.c:3263 +#: initdb.c:3014 +#, c-format +msgid "%s cannot be specified unless locale provider \"%s\" is chosen" +msgstr "ロケールプロバイダ\"%2$s\"が選択されていなければ%1$sは指定できません" + +#: initdb.c:3028 initdb.c:3105 msgid "syncing data to disk ... " msgstr "データをディスクに同期しています ... " -#: initdb.c:3183 +#: initdb.c:3036 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "パスワードプロンプトとパスワードファイルは同時に指定できません" -#: initdb.c:3208 +#: initdb.c:3058 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "--wal-segsize の引数は数値でなければなりません" -#: initdb.c:3213 +#: initdb.c:3060 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "--wal-segsize のパラメータは1から1024の間の2の倍数でなければなりません" -#: initdb.c:3230 +#: initdb.c:3074 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" -msgstr "スーパユーザ名\"%s\"は許可されません; ロール名は\"pg_\"で始めることはできません" +msgstr "スーパーユーザー名\"%s\"は許可されません; ロール名は\"pg_\"で始めることはできません" -#: initdb.c:3234 +#: initdb.c:3076 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" "This user must also own the server process.\n" "\n" msgstr "" -"データベースシステム内のファイルの所有者はユーザ\"%s\"となります。\n" -"このユーザをサーバプロセスの所有者とする必要があります。\n" +"データベースシステム内のファイルの所有者はユーザー\"%s\"となります。\n" +"このユーザーをサーバープロセスの所有者とする必要があります。\n" "\n" -#: initdb.c:3250 +#: initdb.c:3092 #, c-format msgid "Data page checksums are enabled.\n" msgstr "データページのチェックサムは有効です。\n" -#: initdb.c:3252 +#: initdb.c:3094 #, c-format msgid "Data page checksums are disabled.\n" msgstr "データベージのチェックサムは無効です。\n" -#: initdb.c:3269 +#: initdb.c:3111 #, c-format msgid "" "\n" @@ -965,27 +1000,22 @@ msgstr "" "ディスクへの同期がスキップされました。\n" "オペレーティングシステムがクラッシュした場合データディレクトリは破損されるかもしれません。\n" -#: initdb.c:3274 +#: initdb.c:3116 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "ローカル接続に対して\"trust\"認証を有効にします " -#: initdb.c:3275 +#: initdb.c:3117 #, c-format -msgid "" -"You can change this by editing pg_hba.conf or using the option -A, or\n" -"--auth-local and --auth-host, the next time you run initdb.\n" -msgstr "" -"pg_hba.confを編集する、もしくは、次回initdbを実行する時に -A オプション、\n" -"あるいは --auth-local および --auth-host オプションを使用することで変更する\n" -"ことがきます。\n" +msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." +msgstr "pg_hba.confを編集する、もしくは、次回initdbを実行する時に -A オプション、あるいは --auth-local および --auth-host オプションを使用することで変更できます。" #. translator: This is a placeholder in a shell command. -#: initdb.c:3300 +#: initdb.c:3147 msgid "logfile" msgstr "ログファイル" -#: initdb.c:3302 +#: initdb.c:3149 #, c-format msgid "" "\n" @@ -995,11 +1025,20 @@ msgid "" "\n" msgstr "" "\n" -"成功しました。以下のようにしてデータベースサーバを起動することができます:\n" +"成功しました。以下のようにしてデータベースサーバーを起動できます:\n" "\n" " %s\n" "\n" +#~ msgid "fatal: " +#~ msgstr "致命的エラー: " + +#~ msgid "pclose failed: %m" +#~ msgstr "pcloseが失敗しました: %m" + +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "詳細は\"%s --help\"で確認してください。\n" + #~ msgid "%s: could not open file \"%s\": %s\n" #~ msgstr "%s: ファイル\"%s\"をオープンできませんでした: %s\n" diff --git a/src/bin/initdb/po/ru.po b/src/bin/initdb/po/ru.po index 0cfc218c9e..23a2ddf823 100644 --- a/src/bin/initdb/po/ru.po +++ b/src/bin/initdb/po/ru.po @@ -6,13 +6,13 @@ # Sergey Burladyan , 2009. # Andrey Sudnik , 2010. # Dmitriy Olshevskiy , 2014. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021. msgid "" msgstr "" "Project-Id-Version: initdb (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-03 11:22+0300\n" -"PO-Revision-Date: 2020-10-29 15:03+0300\n" +"POT-Creation-Date: 2021-08-14 06:29+0300\n" +"PO-Revision-Date: 2021-09-04 11:38+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -22,58 +22,58 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "важно: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "ошибка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "предупреждение: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "не удалось определить текущий каталог: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "неверный исполняемый файл \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "не удалось прочитать исполняемый файл \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "не удалось найти запускаемый файл \"%s\"" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не удалось перейти в каталог \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не удалось прочитать символическую ссылку \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:409 #, c-format -msgid "pclose failed: %m" -msgstr "ошибка pclose: %m" +msgid "%s() failed: %m" +msgstr "ошибка в %s(): %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 -#: initdb.c:325 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 +#: initdb.c:331 #, c-format msgid "out of memory" msgstr "нехватка памяти" @@ -89,33 +89,33 @@ msgstr "нехватка памяти\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" -#: ../../common/file_utils.c:79 ../../common/file_utils.c:181 +#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не удалось получить информацию о файле \"%s\": %m" -#: ../../common/file_utils.c:158 ../../common/pgfnames.c:48 +#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не удалось открыть каталог \"%s\": %m" -#: ../../common/file_utils.c:192 ../../common/pgfnames.c:69 +#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не удалось прочитать каталог \"%s\": %m" -#: ../../common/file_utils.c:224 ../../common/file_utils.c:283 -#: ../../common/file_utils.c:357 +#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 +#: ../../common/file_utils.c:365 #, c-format msgid "could not open file \"%s\": %m" msgstr "не удалось открыть файл \"%s\": %m" -#: ../../common/file_utils.c:295 ../../common/file_utils.c:365 +#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл \"%s\": %m" -#: ../../common/file_utils.c:375 +#: ../../common/file_utils.c:383 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "не удалось переименовать файл \"%s\" в \"%s\": %m" @@ -229,82 +229,82 @@ msgstr "не удалось создать связь для каталога \" msgid "could not get junction for \"%s\": %s\n" msgstr "не удалось получить связь для каталога \"%s\": %s\n" -#: initdb.c:481 initdb.c:1505 +#: initdb.c:464 initdb.c:1496 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не удалось открыть файл \"%s\" для чтения: %m" -#: initdb.c:536 initdb.c:846 initdb.c:872 +#: initdb.c:508 initdb.c:830 initdb.c:856 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "не удалось открыть файл \"%s\" для записи: %m" -#: initdb.c:543 initdb.c:550 initdb.c:852 initdb.c:877 +#: initdb.c:515 initdb.c:522 initdb.c:836 initdb.c:861 #, c-format msgid "could not write file \"%s\": %m" msgstr "не удалось записать файл \"%s\": %m" -#: initdb.c:568 +#: initdb.c:540 #, c-format msgid "could not execute command \"%s\": %m" msgstr "не удалось выполнить команду \"%s\": %m" -#: initdb.c:586 +#: initdb.c:558 #, c-format msgid "removing data directory \"%s\"" msgstr "удаление каталога данных \"%s\"" -#: initdb.c:588 +#: initdb.c:560 #, c-format msgid "failed to remove data directory" msgstr "ошибка при удалении каталога данных" -#: initdb.c:592 +#: initdb.c:564 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "удаление содержимого каталога данных \"%s\"" -#: initdb.c:595 +#: initdb.c:567 #, c-format msgid "failed to remove contents of data directory" msgstr "ошибка при удалении содержимого каталога данных" -#: initdb.c:600 +#: initdb.c:572 #, c-format msgid "removing WAL directory \"%s\"" msgstr "удаление каталога WAL \"%s\"" -#: initdb.c:602 +#: initdb.c:574 #, c-format msgid "failed to remove WAL directory" msgstr "ошибка при удалении каталога WAL" -#: initdb.c:606 +#: initdb.c:578 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "удаление содержимого каталога WAL \"%s\"" -#: initdb.c:608 +#: initdb.c:580 #, c-format msgid "failed to remove contents of WAL directory" msgstr "ошибка при удалении содержимого каталога WAL" -#: initdb.c:615 +#: initdb.c:587 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "каталог данных \"%s\" не был удалён по запросу пользователя" -#: initdb.c:619 +#: initdb.c:591 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "каталог WAL \"%s\" не был удалён по запросу пользователя" -#: initdb.c:637 +#: initdb.c:609 #, c-format msgid "cannot be run as root" msgstr "программу не должен запускать root" -#: initdb.c:639 +#: initdb.c:611 #, c-format msgid "" "Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" @@ -313,17 +313,17 @@ msgstr "" "Пожалуйста, переключитесь на обычного пользователя (например,\n" "используя \"su\"), который будет запускать серверный процесс.\n" -#: initdb.c:672 +#: initdb.c:644 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "\"%s\" — некорректное имя серверной кодировки" -#: initdb.c:805 +#: initdb.c:789 #, c-format msgid "file \"%s\" does not exist" msgstr "файл \"%s\" не существует" -#: initdb.c:807 initdb.c:814 initdb.c:823 +#: initdb.c:791 initdb.c:798 initdb.c:807 #, c-format msgid "" "This might mean you have a corrupted installation or identified\n" @@ -332,56 +332,56 @@ msgstr "" "Это означает, что ваша установка PostgreSQL испорчена или в параметре -L\n" "задан неправильный каталог.\n" -#: initdb.c:812 +#: initdb.c:796 #, c-format msgid "could not access file \"%s\": %m" msgstr "нет доступа к файлу \"%s\": %m" -#: initdb.c:821 +#: initdb.c:805 #, c-format msgid "file \"%s\" is not a regular file" msgstr "\"%s\" — не обычный файл" -#: initdb.c:966 +#: initdb.c:950 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "выбирается реализация динамической разделяемой памяти... " -#: initdb.c:975 +#: initdb.c:959 #, c-format msgid "selecting default max_connections ... " msgstr "выбирается значение max_connections по умолчанию... " -#: initdb.c:1006 +#: initdb.c:990 #, c-format msgid "selecting default shared_buffers ... " msgstr "выбирается значение shared_buffers по умолчанию... " -#: initdb.c:1040 +#: initdb.c:1024 #, c-format msgid "selecting default time zone ... " msgstr "выбирается часовой пояс по умолчанию... " -#: initdb.c:1074 +#: initdb.c:1058 msgid "creating configuration files ... " msgstr "создание конфигурационных файлов... " -#: initdb.c:1227 initdb.c:1246 initdb.c:1332 initdb.c:1347 +#: initdb.c:1217 initdb.c:1236 initdb.c:1322 initdb.c:1337 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "не удалось поменять права для \"%s\": %m" -#: initdb.c:1369 +#: initdb.c:1359 #, c-format msgid "running bootstrap script ... " msgstr "выполняется подготовительный скрипт... " -#: initdb.c:1381 +#: initdb.c:1371 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "входной файл \"%s\" не принадлежит PostgreSQL %s" -#: initdb.c:1384 +#: initdb.c:1374 #, c-format msgid "" "Check your installation or specify the correct path using the option -L.\n" @@ -389,70 +389,70 @@ msgstr "" "Проверьте правильность установки или укажите корректный путь в параметре -" "L.\n" -#: initdb.c:1482 +#: initdb.c:1473 msgid "Enter new superuser password: " msgstr "Введите новый пароль суперпользователя: " -#: initdb.c:1483 +#: initdb.c:1474 msgid "Enter it again: " msgstr "Повторите его: " -#: initdb.c:1486 +#: initdb.c:1477 #, c-format msgid "Passwords didn't match.\n" msgstr "Пароли не совпадают.\n" -#: initdb.c:1512 +#: initdb.c:1504 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "не удалось прочитать пароль из файла \"%s\": %m" -#: initdb.c:1515 +#: initdb.c:1507 #, c-format msgid "password file \"%s\" is empty" msgstr "файл пароля \"%s\" пуст" -#: initdb.c:2043 +#: initdb.c:1998 #, c-format msgid "caught signal\n" msgstr "получен сигнал\n" -#: initdb.c:2049 +#: initdb.c:2004 #, c-format msgid "could not write to child process: %s\n" msgstr "не удалось записать в поток дочернего процесса: %s\n" -#: initdb.c:2057 +#: initdb.c:2012 #, c-format msgid "ok\n" msgstr "ок\n" -#: initdb.c:2147 +#: initdb.c:2102 #, c-format msgid "setlocale() failed" msgstr "ошибка в setlocale()" -#: initdb.c:2168 +#: initdb.c:2123 #, c-format msgid "failed to restore old locale \"%s\"" msgstr "не удалось восстановить старую локаль \"%s\"" -#: initdb.c:2177 +#: initdb.c:2132 #, c-format msgid "invalid locale name \"%s\"" msgstr "ошибочное имя локали \"%s\"" -#: initdb.c:2188 +#: initdb.c:2143 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "неверные установки локали; проверьте переменные окружения LANG и LC_*" -#: initdb.c:2215 +#: initdb.c:2170 #, c-format msgid "encoding mismatch" msgstr "несоответствие кодировки" -#: initdb.c:2217 +#: initdb.c:2172 #, c-format msgid "" "The encoding you selected (%s) and the encoding that the\n" @@ -467,7 +467,7 @@ msgstr "" "Для исправления перезапустите %s, не указывая кодировку явно, \n" "либо выберите подходящее сочетание параметров локализации.\n" -#: initdb.c:2289 +#: initdb.c:2244 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -476,17 +476,17 @@ msgstr "" "%s инициализирует кластер PostgreSQL.\n" "\n" -#: initdb.c:2290 +#: initdb.c:2245 #, c-format msgid "Usage:\n" msgstr "Использование:\n" -#: initdb.c:2291 +#: initdb.c:2246 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [ПАРАМЕТР]... [КАТАЛОГ]\n" -#: initdb.c:2292 +#: initdb.c:2247 #, c-format msgid "" "\n" @@ -495,7 +495,7 @@ msgstr "" "\n" "Параметры:\n" -#: initdb.c:2293 +#: initdb.c:2248 #, c-format msgid "" " -A, --auth=METHOD default authentication method for local " @@ -504,7 +504,7 @@ msgstr "" " -A, --auth=МЕТОД метод проверки подлинности по умолчанию\n" " для локальных подключений\n" -#: initdb.c:2294 +#: initdb.c:2249 #, c-format msgid "" " --auth-host=METHOD default authentication method for local TCP/IP " @@ -513,7 +513,7 @@ msgstr "" " --auth-host=МЕТОД метод проверки подлинности по умолчанию\n" " для локальных TCP/IP-подключений\n" -#: initdb.c:2295 +#: initdb.c:2250 #, c-format msgid "" " --auth-local=METHOD default authentication method for local-socket " @@ -522,17 +522,17 @@ msgstr "" " --auth-local=МЕТОД метод проверки подлинности по умолчанию\n" " для локальных подключений через сокет\n" -#: initdb.c:2296 +#: initdb.c:2251 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]КАТАЛОГ расположение данных этого кластера БД\n" -#: initdb.c:2297 +#: initdb.c:2252 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=КОДИРОВКА кодировка по умолчанию для новых баз\n" -#: initdb.c:2298 +#: initdb.c:2253 #, c-format msgid "" " -g, --allow-group-access allow group read/execute on data directory\n" @@ -541,12 +541,17 @@ msgstr "" "для\n" " группы\n" -#: initdb.c:2299 +#: initdb.c:2254 +#, c-format +msgid " -k, --data-checksums use data page checksums\n" +msgstr " -k, --data-checksums включить контроль целостности страниц\n" + +#: initdb.c:2255 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=ЛОКАЛЬ локаль по умолчанию для новых баз\n" -#: initdb.c:2300 +#: initdb.c:2256 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -560,19 +565,19 @@ msgstr "" " установить соответствующий параметр локали\n" " для новых баз (вместо значения из окружения)\n" -#: initdb.c:2304 +#: initdb.c:2260 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale эквивалентно --locale=C\n" -#: initdb.c:2305 +#: initdb.c:2261 #, c-format msgid "" " --pwfile=FILE read password for the new superuser from file\n" msgstr "" " --pwfile=ФАЙЛ прочитать пароль суперпользователя из файла\n" -#: initdb.c:2306 +#: initdb.c:2262 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -581,29 +586,29 @@ msgstr "" " -T, --text-search-config=КОНФИГУРАЦИЯ\n" " конфигурация текстового поиска по умолчанию\n" -#: initdb.c:2308 +#: initdb.c:2264 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=ИМЯ имя суперпользователя БД\n" -#: initdb.c:2309 +#: initdb.c:2265 #, c-format msgid "" " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt запросить пароль суперпользователя\n" -#: initdb.c:2310 +#: initdb.c:2266 #, c-format msgid "" " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=КАТАЛОГ расположение журнала предзаписи\n" -#: initdb.c:2311 +#: initdb.c:2267 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=РАЗМЕР размер сегментов WAL (в мегабайтах)\n" -#: initdb.c:2312 +#: initdb.c:2268 #, c-format msgid "" "\n" @@ -612,27 +617,27 @@ msgstr "" "\n" "Редко используемые параметры:\n" -#: initdb.c:2313 +#: initdb.c:2269 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug выдавать много отладочных сообщений\n" -#: initdb.c:2314 +#: initdb.c:2270 #, c-format -msgid " -k, --data-checksums use data page checksums\n" -msgstr " -k, --data-checksums включить контроль целостности страниц\n" +msgid " --discard-caches set debug_discard_caches=1\n" +msgstr " --discard-caches установить debug_discard_caches=1\n" -#: initdb.c:2315 +#: initdb.c:2271 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L КАТАЛОГ расположение входных файлов\n" -#: initdb.c:2316 +#: initdb.c:2272 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean не очищать после ошибок\n" -#: initdb.c:2317 +#: initdb.c:2273 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written safely to " @@ -640,18 +645,24 @@ msgid "" msgstr "" " -N, --no-sync не ждать завершения сохранения данных на диске\n" -#: initdb.c:2318 +#: initdb.c:2274 +#, c-format +msgid " --no-instructions do not print instructions for next steps\n" +msgstr "" +" --no-instructions не выводить инструкции для дальнейших действий\n" + +#: initdb.c:2275 #, c-format msgid " -s, --show show internal settings\n" msgstr " -s, --show показать внутренние установки\n" -#: initdb.c:2319 +#: initdb.c:2276 #, c-format msgid " -S, --sync-only only sync data directory\n" msgstr "" " -S, --sync-only только синхронизировать с ФС каталог данных\n" -#: initdb.c:2320 +#: initdb.c:2277 #, c-format msgid "" "\n" @@ -660,17 +671,17 @@ msgstr "" "\n" "Другие параметры:\n" -#: initdb.c:2321 +#: initdb.c:2278 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: initdb.c:2322 +#: initdb.c:2279 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: initdb.c:2323 +#: initdb.c:2280 #, c-format msgid "" "\n" @@ -680,7 +691,7 @@ msgstr "" "\n" "Если каталог данных не указан, используется переменная окружения PGDATA.\n" -#: initdb.c:2325 +#: initdb.c:2282 #, c-format msgid "" "\n" @@ -689,28 +700,31 @@ msgstr "" "\n" "Об ошибках сообщайте по адресу <%s>.\n" -#: initdb.c:2326 +#: initdb.c:2283 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" -#: initdb.c:2354 +#: initdb.c:2311 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "" "нераспознанный метод проверки подлинности \"%s\" для подключений \"%s\"" -#: initdb.c:2370 +#: initdb.c:2327 #, c-format -msgid "must specify a password for the superuser to enable %s authentication" -msgstr "для применения метода %s необходимо указать пароль суперпользователя" +msgid "" +"must specify a password for the superuser to enable password authentication" +msgstr "" +"для включения аутентификации по паролю необходимо указать пароль " +"суперпользователя" -#: initdb.c:2397 +#: initdb.c:2348 #, c-format msgid "no data directory specified" msgstr "каталог данных не указан" -#: initdb.c:2399 +#: initdb.c:2350 #, c-format msgid "" "You must identify the directory where the data for this database system\n" @@ -721,7 +735,12 @@ msgstr "" "Это можно сделать, добавив ключ -D или установив переменную\n" "окружения PGDATA.\n" -#: initdb.c:2434 +#: initdb.c:2368 +#, c-format +msgid "could not set environment" +msgstr "не удалось задать переменную окружения" + +#: initdb.c:2388 #, c-format msgid "" "The program \"%s\" is needed by %s but was not found in the\n" @@ -732,7 +751,7 @@ msgstr "" "в каталоге \"%s\".\n" "Проверьте правильность установки СУБД." -#: initdb.c:2439 +#: initdb.c:2393 #, c-format msgid "" "The program \"%s\" was found by \"%s\"\n" @@ -743,17 +762,17 @@ msgstr "" "но её версия отличается от версии %s.\n" "Проверьте правильность установки СУБД." -#: initdb.c:2458 +#: initdb.c:2412 #, c-format msgid "input file location must be an absolute path" msgstr "расположение входных файлов должно задаваться абсолютным путём" -#: initdb.c:2475 +#: initdb.c:2429 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "Кластер баз данных будет инициализирован с локалью \"%s\".\n" -#: initdb.c:2478 +#: initdb.c:2432 #, c-format msgid "" "The database cluster will be initialized with locales\n" @@ -772,22 +791,22 @@ msgstr "" " NUMERIC: %s\n" " TIME: %s\n" -#: initdb.c:2502 +#: initdb.c:2456 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "не удалось найти подходящую кодировку для локали \"%s\"" -#: initdb.c:2504 +#: initdb.c:2458 #, c-format msgid "Rerun %s with the -E option.\n" msgstr "Перезапустите %s с параметром -E.\n" -#: initdb.c:2505 initdb.c:3127 initdb.c:3148 +#: initdb.c:2459 initdb.c:3099 initdb.c:3120 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Для дополнительной информации попробуйте \"%s --help\".\n" -#: initdb.c:2518 +#: initdb.c:2472 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -796,12 +815,12 @@ msgstr "" "Кодировка \"%s\", подразумеваемая локалью, не годится для сервера.\n" "Вместо неё в качестве кодировки БД по умолчанию будет выбрана \"%s\".\n" -#: initdb.c:2523 +#: initdb.c:2477 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "для локали \"%s\" требуется неподдерживаемая кодировка \"%s\"" -#: initdb.c:2526 +#: initdb.c:2480 #, c-format msgid "" "Encoding \"%s\" is not allowed as a server-side encoding.\n" @@ -810,25 +829,25 @@ msgstr "" "Кодировка \"%s\" недопустима в качестве кодировки сервера.\n" "Перезапустите %s, выбрав другую локаль.\n" -#: initdb.c:2535 +#: initdb.c:2489 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "" "Кодировка БД по умолчанию, выбранная в соответствии с настройками: \"%s\".\n" -#: initdb.c:2597 +#: initdb.c:2555 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "" "не удалось найти подходящую конфигурацию текстового поиска для локали \"%s\"" -#: initdb.c:2608 +#: initdb.c:2566 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "" "внимание: для локали \"%s\" нет известной конфигурации текстового поиска" -#: initdb.c:2613 +#: initdb.c:2571 #, c-format msgid "" "specified text search configuration \"%s\" might not match locale \"%s\"" @@ -836,37 +855,37 @@ msgstr "" "указанная конфигурация текстового поиска \"%s\" может не соответствовать " "локали \"%s\"" -#: initdb.c:2618 +#: initdb.c:2576 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "Выбрана конфигурация текстового поиска по умолчанию \"%s\".\n" -#: initdb.c:2662 initdb.c:2744 +#: initdb.c:2620 initdb.c:2702 #, c-format msgid "creating directory %s ... " msgstr "создание каталога %s... " -#: initdb.c:2668 initdb.c:2750 initdb.c:2815 initdb.c:2877 +#: initdb.c:2626 initdb.c:2708 initdb.c:2773 initdb.c:2835 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не удалось создать каталог \"%s\": %m" -#: initdb.c:2679 initdb.c:2762 +#: initdb.c:2637 initdb.c:2720 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "исправление прав для существующего каталога %s... " -#: initdb.c:2685 initdb.c:2768 +#: initdb.c:2643 initdb.c:2726 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "не удалось поменять права для каталога \"%s\": %m" -#: initdb.c:2699 initdb.c:2782 +#: initdb.c:2657 initdb.c:2740 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "каталог \"%s\" существует, но он не пуст" -#: initdb.c:2704 +#: initdb.c:2662 #, c-format msgid "" "If you want to create a new database system, either remove or empty\n" @@ -877,17 +896,17 @@ msgstr "" "удалите или очистите каталог \"%s\",\n" "либо при запуске %s в качестве пути укажите не \"%s\".\n" -#: initdb.c:2712 initdb.c:2794 initdb.c:3163 +#: initdb.c:2670 initdb.c:2752 initdb.c:3135 #, c-format msgid "could not access directory \"%s\": %m" -msgstr "нет доступа к каталогу \"%s\": %m" +msgstr "ошибка доступа к каталогу \"%s\": %m" -#: initdb.c:2735 +#: initdb.c:2693 #, c-format msgid "WAL directory location must be an absolute path" msgstr "расположение каталога WAL должно определяться абсолютным путём" -#: initdb.c:2787 +#: initdb.c:2745 #, c-format msgid "" "If you want to store the WAL there, either remove or empty the directory\n" @@ -896,17 +915,17 @@ msgstr "" "Если вы хотите хранить WAL здесь, удалите или очистите каталог\n" "\"%s\".\n" -#: initdb.c:2801 +#: initdb.c:2759 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "не удалось создать символическую ссылку \"%s\": %m" -#: initdb.c:2806 +#: initdb.c:2764 #, c-format msgid "symlinks are not supported on this platform" msgstr "символические ссылки не поддерживаются в этой ОС" -#: initdb.c:2830 +#: initdb.c:2788 #, c-format msgid "" "It contains a dot-prefixed/invisible file, perhaps due to it being a mount " @@ -914,13 +933,13 @@ msgid "" msgstr "" "Он содержит файл с точкой (невидимый), возможно это точка монтирования.\n" -#: initdb.c:2833 +#: initdb.c:2791 #, c-format msgid "" "It contains a lost+found directory, perhaps due to it being a mount point.\n" msgstr "Он содержит подкаталог lost+found, возможно это точка монтирования.\n" -#: initdb.c:2836 +#: initdb.c:2794 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -930,52 +949,52 @@ msgstr "" "рекомендуется.\n" "Создайте в монтируемом ресурсе подкаталог и используйте его.\n" -#: initdb.c:2862 +#: initdb.c:2820 #, c-format msgid "creating subdirectories ... " msgstr "создание подкаталогов... " -#: initdb.c:2908 +#: initdb.c:2866 msgid "performing post-bootstrap initialization ... " msgstr "выполняется заключительная инициализация... " -#: initdb.c:3065 +#: initdb.c:3029 #, c-format msgid "Running in debug mode.\n" msgstr "Программа запущена в режиме отладки.\n" -#: initdb.c:3069 +#: initdb.c:3033 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "" "Программа запущена в режиме 'no-clean' - очистки и исправления ошибок не " "будет.\n" -#: initdb.c:3146 +#: initdb.c:3118 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "слишком много аргументов командной строки (первый: \"%s\")" -#: initdb.c:3167 initdb.c:3256 +#: initdb.c:3139 initdb.c:3228 msgid "syncing data to disk ... " msgstr "сохранение данных на диске... " -#: initdb.c:3176 +#: initdb.c:3148 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "нельзя одновременно запросить пароль и прочитать пароль из файла" -#: initdb.c:3201 +#: initdb.c:3173 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "аргументом --wal-segsize должно быть число" -#: initdb.c:3206 +#: initdb.c:3178 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "аргументом --wal-segsize должна быть степень 2 от 1 до 1024" -#: initdb.c:3223 +#: initdb.c:3195 #, c-format msgid "" "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" @@ -983,7 +1002,7 @@ msgstr "" "имя \"%s\" для суперпользователя не допускается; имена ролей не могут " "начинаться с \"pg_\"" -#: initdb.c:3227 +#: initdb.c:3199 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -994,17 +1013,17 @@ msgstr "" "От его имени также будет запускаться процесс сервера.\n" "\n" -#: initdb.c:3243 +#: initdb.c:3215 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Контроль целостности страниц данных включён.\n" -#: initdb.c:3245 +#: initdb.c:3217 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Контроль целостности страниц данных отключён.\n" -#: initdb.c:3262 +#: initdb.c:3234 #, c-format msgid "" "\n" @@ -1015,12 +1034,12 @@ msgstr "" "Сохранение данных на диск пропускается.\n" "Каталог данных может повредиться при сбое операционной системы.\n" -#: initdb.c:3267 +#: initdb.c:3239 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "включение метода аутентификации \"trust\" для локальных подключений" -#: initdb.c:3268 +#: initdb.c:3240 #, c-format msgid "" "You can change this by editing pg_hba.conf or using the option -A, or\n" @@ -1031,11 +1050,11 @@ msgstr "" "--auth-local или --auth-host при следующем выполнении initdb.\n" #. translator: This is a placeholder in a shell command. -#: initdb.c:3293 +#: initdb.c:3270 msgid "logfile" msgstr "файл_журнала" -#: initdb.c:3295 +#: initdb.c:3272 #, c-format msgid "" "\n" diff --git a/src/bin/initdb/po/sv.po b/src/bin/initdb/po/sv.po index c33e259430..d4f55b7d92 100644 --- a/src/bin/initdb/po/sv.po +++ b/src/bin/initdb/po/sv.po @@ -1,5 +1,5 @@ # Swedish message translation file for initdb -# Dennis Björklund , 2004, 2005, 2006, 2017, 2018, 2019, 2020. +# Dennis Björklund , 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. # Magnus Hagander , 2007. # Peter Eisentraut , 2009. # Mats Erik Andersson , 2014. @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-05-09 08:46+0000\n" -"PO-Revision-Date: 2020-05-09 13:56+0200\n" +"POT-Creation-Date: 2022-04-11 20:19+0000\n" +"PO-Revision-Date: 2022-04-11 22:41+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -20,58 +20,63 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatalt: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:273 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:280 #, c-format msgid "warning: " msgstr "varning: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../../src/common/logging.c:291 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:298 +#, c-format +msgid "hint: " +msgstr "tips: " + +#: ../../common/exec.c:144 ../../common/exec.c:261 ../../common/exec.c:307 #, c-format msgid "could not identify current directory: %m" msgstr "kunde inte identifiera aktuell katalog: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:163 #, c-format msgid "invalid binary \"%s\"" msgstr "ogiltig binär \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:213 #, c-format msgid "could not read binary \"%s\"" msgstr "kunde inte läsa binär \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:221 #, c-format msgid "could not find a \"%s\" to execute" msgstr "kunde inte hitta en \"%s\" att köra" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:277 ../../common/exec.c:316 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "kunde inte byta katalog till \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:294 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "kan inte läsa symbolisk länk \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:417 #, c-format -msgid "pclose failed: %m" -msgstr "pclose misslyckades: %m" +msgid "%s() failed: %m" +msgstr "%s() misslyckades: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 -#: initdb.c:325 +#: ../../common/exec.c:555 ../../common/exec.c:600 ../../common/exec.c:692 +#: initdb.c:334 #, c-format msgid "out of memory" msgstr "slut på minne" @@ -87,33 +92,33 @@ msgstr "slut på minne\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" -#: ../../common/file_utils.c:79 ../../common/file_utils.c:181 +#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 #, c-format msgid "could not stat file \"%s\": %m" msgstr "kunde inte göra stat() på fil \"%s\": %m" -#: ../../common/file_utils.c:158 ../../common/pgfnames.c:48 +#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48 #, c-format msgid "could not open directory \"%s\": %m" msgstr "kunde inte öppna katalog \"%s\": %m" -#: ../../common/file_utils.c:192 ../../common/pgfnames.c:69 +#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69 #, c-format msgid "could not read directory \"%s\": %m" msgstr "kunde inte läsa katalog \"%s\": %m" -#: ../../common/file_utils.c:224 ../../common/file_utils.c:283 -#: ../../common/file_utils.c:357 +#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 +#: ../../common/file_utils.c:365 #, c-format msgid "could not open file \"%s\": %m" msgstr "kunde inte öppna fil \"%s\": %m" -#: ../../common/file_utils.c:295 ../../common/file_utils.c:365 +#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "kunde inte fsync:a fil \"%s\": %m" -#: ../../common/file_utils.c:375 +#: ../../common/file_utils.c:383 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" @@ -158,7 +163,7 @@ msgstr "kunde inte starta process för kommando \"%s\": felkod %lu" msgid "could not re-execute with restricted token: error code %lu" msgstr "kunde inte köra igen med token för begränsad åtkomst: felkod %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "kunde inte hämta statuskod för underprocess: felkod %lu" @@ -227,154 +232,151 @@ msgstr "kunde inte sätta en knutpunkt (junction) för \"%s\": %s\n" msgid "could not get junction for \"%s\": %s\n" msgstr "kunde inte få en knutpunkt (junction) för \"%s\": %s\n" -#: initdb.c:481 initdb.c:1505 +#: initdb.c:464 initdb.c:1456 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "kunde inte öppna filen \"%s\" för läsning: %m" -#: initdb.c:536 initdb.c:846 initdb.c:872 +#: initdb.c:505 initdb.c:809 initdb.c:829 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "kunde inte öppna fil \"%s\" för skrivning: %m" -#: initdb.c:543 initdb.c:550 initdb.c:852 initdb.c:877 +#: initdb.c:509 initdb.c:812 initdb.c:831 #, c-format msgid "could not write file \"%s\": %m" msgstr "kunde inte skriva fil \"%s\": %m" -#: initdb.c:568 +#: initdb.c:513 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "kunde inte stänga fil \"%s\": %m" + +#: initdb.c:529 #, c-format msgid "could not execute command \"%s\": %m" msgstr "kunde inte köra kommandot \"%s\": %m" -#: initdb.c:586 +#: initdb.c:547 #, c-format msgid "removing data directory \"%s\"" msgstr "tar bort datakatalog \"%s\"" -#: initdb.c:588 +#: initdb.c:549 #, c-format msgid "failed to remove data directory" msgstr "misslyckades med att ta bort datakatalog" -#: initdb.c:592 +#: initdb.c:553 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "tar bort innehållet i datakatalog \"%s\"" -#: initdb.c:595 +#: initdb.c:556 #, c-format msgid "failed to remove contents of data directory" msgstr "misslyckades med att ta bort innehållet i datakatalogen" -#: initdb.c:600 +#: initdb.c:561 #, c-format msgid "removing WAL directory \"%s\"" msgstr "tar bort WAL-katalog \"%s\"" -#: initdb.c:602 +#: initdb.c:563 #, c-format msgid "failed to remove WAL directory" msgstr "misslyckades med att ta bort WAL-katalog" -#: initdb.c:606 +#: initdb.c:567 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "tar bort innehållet i WAL-katalog \"%s\"" -#: initdb.c:608 +#: initdb.c:569 #, c-format msgid "failed to remove contents of WAL directory" msgstr "misslyckades med att ta bort innehållet i WAL-katalogen" -#: initdb.c:615 +#: initdb.c:576 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "datakatalog \"%s\" är ej borttagen på användares begäran" -#: initdb.c:619 +#: initdb.c:580 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "WAL-katalog \"%s\" är ej borttagen på användares begäran" -#: initdb.c:637 +#: initdb.c:598 #, c-format msgid "cannot be run as root" msgstr "kan inte köras som root" -#: initdb.c:639 +#: initdb.c:599 #, c-format -msgid "" -"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" -"own the server process.\n" -msgstr "" -"Logga in (t.ex. med \"su\") som den (opriviligerade) användare\n" -"som skall äga serverprocessen.\n" +msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." +msgstr "Logga in (t.ex. med \"su\") som den (opriviligerade) användare som skall äga serverprocessen." -#: initdb.c:672 +#: initdb.c:631 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "\"%s\" är inte en giltig teckenkodning för servern" -#: initdb.c:805 +#: initdb.c:775 #, c-format msgid "file \"%s\" does not exist" msgstr "filen \"%s\" finns inte" -#: initdb.c:807 initdb.c:814 initdb.c:823 +#: initdb.c:776 initdb.c:781 initdb.c:788 #, c-format -msgid "" -"This might mean you have a corrupted installation or identified\n" -"the wrong directory with the invocation option -L.\n" -msgstr "" -"Detta kan betyda att du har en korrupt installation eller att du har\n" -"angivit felaktig katalog till flaggan -L.\n" +msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." +msgstr "Detta kan betyda att du har en korrupt installation eller att du har angivit felaktig katalog till flaggan -L." -#: initdb.c:812 +#: initdb.c:780 #, c-format msgid "could not access file \"%s\": %m" msgstr "kunde inte komma åt filen \"%s\": %m" -#: initdb.c:821 +#: initdb.c:787 #, c-format msgid "file \"%s\" is not a regular file" msgstr "filen \"%s\" är inte en normal fil" -#: initdb.c:966 +#: initdb.c:919 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "väljer mekanism för dynamiskt, delat minne ... " -#: initdb.c:975 +#: initdb.c:928 #, c-format msgid "selecting default max_connections ... " msgstr "sätter förvalt värde för max_connections ... " -#: initdb.c:1006 +#: initdb.c:959 #, c-format msgid "selecting default shared_buffers ... " msgstr "sätter förvalt värde för shared_buffers ... " -#: initdb.c:1040 +#: initdb.c:993 #, c-format msgid "selecting default time zone ... " msgstr "sätter förvalt värde för tidszon ... " -#: initdb.c:1074 +#: initdb.c:1027 msgid "creating configuration files ... " msgstr "skapar konfigurationsfiler ... " -#: initdb.c:1227 initdb.c:1246 initdb.c:1332 initdb.c:1347 +#: initdb.c:1185 initdb.c:1201 initdb.c:1284 initdb.c:1296 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "kunde inte ändra rättigheter på \"%s\": %m" -#: initdb.c:1369 +#: initdb.c:1316 #, c-format msgid "running bootstrap script ... " msgstr "kör uppsättningsskript..." -#: initdb.c:1381 +#: initdb.c:1328 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "indatafil \"%s\" tillhör inte PostgreSQL %s" @@ -383,90 +385,95 @@ msgstr "indatafil \"%s\" tillhör inte PostgreSQL %s" # with a standard directory "/usr/local/pgsql", is such that # the translated message string produces a reasonable output. # -#: initdb.c:1384 +#: initdb.c:1330 #, c-format -msgid "Check your installation or specify the correct path using the option -L.\n" -msgstr "Kontrollera din installation eller ange korrekt sökväg med flaggan -L.\n" +msgid "Specify the correct path using the option -L." +msgstr "Ange korrekt sökväg med flaggan -L." -#: initdb.c:1482 +#: initdb.c:1434 msgid "Enter new superuser password: " -msgstr "Mata in ett nytt lösenord för superanvändaren: " +msgstr "Mata in ett nytt lösenord för superuser: " -#: initdb.c:1483 +#: initdb.c:1435 msgid "Enter it again: " msgstr "Mata in det igen: " -#: initdb.c:1486 +#: initdb.c:1438 #, c-format msgid "Passwords didn't match.\n" msgstr "Lösenorden stämde inte överens.\n" -#: initdb.c:1512 +#: initdb.c:1462 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "kunde inte läsa lösenord i filen \"%s\": %m" -#: initdb.c:1515 +#: initdb.c:1465 #, c-format msgid "password file \"%s\" is empty" msgstr "lösenordsfilen \"%s\" är tom" -#: initdb.c:2043 +#: initdb.c:1911 #, c-format msgid "caught signal\n" msgstr "mottog signal\n" -#: initdb.c:2049 +#: initdb.c:1917 #, c-format msgid "could not write to child process: %s\n" msgstr "kunde inte skriva till barnprocess: %s\n" -#: initdb.c:2057 +#: initdb.c:1925 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2147 +#: initdb.c:2014 #, c-format msgid "setlocale() failed" msgstr "setlocale() misslyckades" -#: initdb.c:2168 +#: initdb.c:2032 #, c-format msgid "failed to restore old locale \"%s\"" msgstr "misslyckades med att återställa gamla lokalen \"%s\"" -#: initdb.c:2177 +#: initdb.c:2039 #, c-format msgid "invalid locale name \"%s\"" msgstr "ogiltigt lokalnamn \"%s\"" -#: initdb.c:2188 +#: initdb.c:2050 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "ogiltig lokalinställning. Kontrollera miljövariablerna LANG och LC_*" -#: initdb.c:2215 +#: initdb.c:2076 #, c-format msgid "encoding mismatch" msgstr "teckenkodning matchar inte" -#: initdb.c:2217 +#: initdb.c:2077 #, c-format -msgid "" -"The encoding you selected (%s) and the encoding that the\n" -"selected locale uses (%s) do not match. This would lead to\n" -"misbehavior in various character string processing functions.\n" -"Rerun %s and either do not specify an encoding explicitly,\n" -"or choose a matching combination.\n" -msgstr "" -"Teckenkodningen du har valt (%s) och teckenkodningen som\n" -"valda lokalen använder (%s) passar inte ihop. Detta kommer leda\n" -"till problem för funktioner som arbetar med strängar.\n" -"Kör %s igen och låt bli ange teckenkodning eller välj\n" -"en kombination som passar ihop.\n" +msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." +msgstr "Teckenkodningen du har valt (%s) och teckenkodningen som valda lokalen använder (%s) passar inte ihop. Detta kommer leda till problem för funktioner som arbetar med strängar." + +#: initdb.c:2082 +#, c-format +msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." +msgstr "Kör %s igen och ange antingen ingen explicit kodning eller välj en matchande kombination." -#: initdb.c:2289 +#: initdb.c:2144 +#, c-format +msgid "ICU locale must be specified" +msgstr "ICU-lokal måste anges" + +#: initdb.c:2151 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ICU stöds inte av detta bygge" + +#: initdb.c:2162 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -475,17 +482,17 @@ msgstr "" "%s initierar ett databaskluster för PostgreSQL.\n" "\n" -#: initdb.c:2290 +#: initdb.c:2163 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: initdb.c:2291 +#: initdb.c:2164 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [FLAGGA]... [DATAKATALOG]\n" -#: initdb.c:2292 +#: initdb.c:2165 #, c-format msgid "" "\n" @@ -494,42 +501,52 @@ msgstr "" "\n" "Flaggor:\n" -#: initdb.c:2293 +#: initdb.c:2166 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" -msgstr " -A, --auth=METOD förvald autentiseringsmetod för alla förbindelser\n" +msgstr " -A, --auth=METOD förvald autentiseringsmetod för alla anslutningar\n" -#: initdb.c:2294 +#: initdb.c:2167 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" -msgstr " --auth-host=METOD autentiseringsmetod för TCP/IP-förbindelser\n" +msgstr " --auth-host=METOD autentiseringsmetod för TCP/IP-anslutningar\n" -#: initdb.c:2295 +#: initdb.c:2168 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" -msgstr " --auth-local=METOD autentiseringsmetod för förbindelser via unix-uttag\n" +msgstr " --auth-local=METOD autentiseringsmetod för anslutningar via unix-uttag\n" -#: initdb.c:2296 +#: initdb.c:2169 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DATAKATALOG läge för detta databaskluster\n" -#: initdb.c:2297 +#: initdb.c:2170 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=KODNING sätter teckenkodning för nya databaser\n" -#: initdb.c:2298 +#: initdb.c:2171 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr " -g, --allow-group-access tillåt läs/kör för grupp på datakatalogen\n" -#: initdb.c:2299 +#: initdb.c:2172 +#, c-format +msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" +msgstr " --icu-locale=LOKAL sätt ID för ICU-lokal för nya databaser\n" + +#: initdb.c:2173 +#, c-format +msgid " -k, --data-checksums use data page checksums\n" +msgstr " -k, --data-checksums använd checksummor på datablock\n" + +#: initdb.c:2174 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" -msgstr " --locale=LOKAL sätter standardlokal för nya databaser\n" +msgstr " --locale=LOKAL sätt standardlokal för nya databaser\n" -#: initdb.c:2300 +#: initdb.c:2175 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -542,17 +559,26 @@ msgstr "" " sätter standardlokal i utvald kategori för\n" " nya databaser (förval hämtas ur omgivningen)\n" -#: initdb.c:2304 +#: initdb.c:2179 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale samma som --locale=C\n" -#: initdb.c:2305 +#: initdb.c:2180 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" set default locale provider for new databases\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" sätt standard lokalleverantör för nya databaser\n" + +#: initdb.c:2182 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" -msgstr " --pwfile=FIL läser lösenord för superanvändare från fil\n" +msgstr " --pwfile=FIL läser lösenord för superuser från fil\n" -#: initdb.c:2306 +#: initdb.c:2183 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -561,27 +587,27 @@ msgstr "" " -T, --text-search-config=CFG\n" " standardkonfiguration för textsökning\n" -#: initdb.c:2308 +#: initdb.c:2185 #, c-format msgid " -U, --username=NAME database superuser name\n" -msgstr " -U, --username=NAMN namn på databasens superanvändare\n" +msgstr " -U, --username=NAMN namn på databasens superuser\n" -#: initdb.c:2309 +#: initdb.c:2186 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" -msgstr " -W, --pwprompt efterfråga lösenord för superanvändare\n" +msgstr " -W, --pwprompt efterfråga lösenord för superuser\n" -#: initdb.c:2310 +#: initdb.c:2187 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR katalog för write-ahead-log (WAL)\n" -#: initdb.c:2311 +#: initdb.c:2188 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=STORLEK storlek på WAL-segment i megabyte\n" -#: initdb.c:2312 +#: initdb.c:2189 #, c-format msgid "" "\n" @@ -590,42 +616,47 @@ msgstr "" "\n" "Mindre vanliga flaggor:\n" -#: initdb.c:2313 +#: initdb.c:2190 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug generera massor med debug-utskrifter\n" -#: initdb.c:2314 +#: initdb.c:2191 #, c-format -msgid " -k, --data-checksums use data page checksums\n" -msgstr " -k, --data-checksums använd checksummor på datablock\n" +msgid " --discard-caches set debug_discard_caches=1\n" +msgstr " --discard-caches sätt debug_discard_caches=1\n" -#: initdb.c:2315 +#: initdb.c:2192 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L KATALOG katalog där indatafiler skall sökas\n" -#: initdb.c:2316 +#: initdb.c:2193 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean städa inte upp efter fel\n" -#: initdb.c:2317 +#: initdb.c:2194 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync vänta inte på att ändingar säkert skrivits till disk\n" -#: initdb.c:2318 +#: initdb.c:2195 +#, c-format +msgid " --no-instructions do not print instructions for next steps\n" +msgstr " --no-instructions skriv inte instruktioner för nästa steg\n" + +#: initdb.c:2196 #, c-format msgid " -s, --show show internal settings\n" msgstr " -s, --show visa interna inställningar\n" -#: initdb.c:2319 +#: initdb.c:2197 #, c-format -msgid " -S, --sync-only only sync data directory\n" -msgstr " -S, --sync-only synkning endast av datakatalog\n" +msgid " -S, --sync-only only sync database files to disk, then exit\n" +msgstr " -S, --sync-only synka bara databasfiler till disk, avsluta seden\n" -#: initdb.c:2320 +#: initdb.c:2198 #, c-format msgid "" "\n" @@ -634,17 +665,17 @@ msgstr "" "\n" "Andra flaggor:\n" -#: initdb.c:2321 +#: initdb.c:2199 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: initdb.c:2322 +#: initdb.c:2200 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: initdb.c:2323 +#: initdb.c:2201 #, c-format msgid "" "\n" @@ -654,7 +685,7 @@ msgstr "" "\n" "Om datakatalogen inte anges så tas den från omgivningsvariabeln PGDATA.\n" -#: initdb.c:2325 +#: initdb.c:2203 #, c-format msgid "" "\n" @@ -663,104 +694,104 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: initdb.c:2326 +#: initdb.c:2204 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: initdb.c:2354 +#: initdb.c:2232 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "ogiltig autentiseringsmetod \"%s\" för anslutning av typen \"%s\"" -#: initdb.c:2370 +#: initdb.c:2246 #, c-format -msgid "must specify a password for the superuser to enable %s authentication" -msgstr "du måste ange ett lösenord för superanvändaren för att kunna slå på autentisering %s" +msgid "must specify a password for the superuser to enable password authentication" +msgstr "du måste ange ett lösenord för superuser för att kunna slå på lösenordsautentisering" -#: initdb.c:2397 +#: initdb.c:2265 #, c-format msgid "no data directory specified" msgstr "ingen datakatalog angiven" -#: initdb.c:2399 +#: initdb.c:2266 #, c-format -msgid "" -"You must identify the directory where the data for this database system\n" -"will reside. Do this with either the invocation option -D or the\n" -"environment variable PGDATA.\n" -msgstr "" -"Du måste uppge den katalog där data för detta databassystem\n" -"skall lagras. Gör det antingen med flaggan -D eller genom att\n" -"sätta omgivningsvariabeln PGDATA.\n" +msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." +msgstr "Du måste uppge den katalog där data för detta databassystem skall lagras. Gör det antingen med flaggan -D eller genom att sätta omgivningsvariabeln PGDATA." -#: initdb.c:2434 +#: initdb.c:2283 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"Programmet \"%s\" behövs av %s men hittades inte i samma\n" -"katalog som \"%s\".\n" -"Kontrollera din installation." +msgid "could not set environment" +msgstr "kunde inte sätta omgivningen" -#: initdb.c:2439 +#: initdb.c:2301 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"Programmet \"%s\" hittades av \"%s\"\n" -"men är inte av samma version som %s.\n" -"Kontrollera din installation." +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\"" -#: initdb.c:2458 +#: initdb.c:2304 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s" + +#: initdb.c:2319 #, c-format msgid "input file location must be an absolute path" msgstr "plats för indatafiler måste vara en absolut sökväg" -#: initdb.c:2475 +#: initdb.c:2336 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "Databasklustret kommer att skapas med lokalnamn \"%s\".\n" -#: initdb.c:2478 +#: initdb.c:2339 +#, c-format +msgid "The database cluster will be initialized with this locale configuration:\n" +msgstr "Databasklustret kommer att initieras med denna lokalkonfiguration:\n" + +#: initdb.c:2340 +#, c-format +msgid " provider: %s\n" +msgstr " leverantör: %s\n" + +#: initdb.c:2342 +#, c-format +msgid " ICU locale: %s\n" +msgstr " ICU-lokal: %s\n" + +#: initdb.c:2343 #, c-format msgid "" -"The database cluster will be initialized with locales\n" -" COLLATE: %s\n" -" CTYPE: %s\n" -" MESSAGES: %s\n" -" MONETARY: %s\n" -" NUMERIC: %s\n" -" TIME: %s\n" +" LC_COLLATE: %s\n" +" LC_CTYPE: %s\n" +" LC_MESSAGES: %s\n" +" LC_MONETARY: %s\n" +" LC_NUMERIC: %s\n" +" LC_TIME: %s\n" msgstr "" -"Databasklustret kommer att initieras med lokalkategorier:\n" -" COLLATE: %s\n" -" CTYPE: %s\n" -" MESSAGES: %s\n" -" MONETARY: %s\n" -" NUMERIC: %s\n" -" TIME: %s\n" +" LC_COLLATE: %s\n" +" LC_CTYPE: %s\n" +" LC_MESSAGES: %s\n" +" LC_MONETARY: %s\n" +" LC_NUMERIC: %s\n" +" LC_TIME: %s\n" -#: initdb.c:2502 +#: initdb.c:2368 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "kunde inte välja en lämplig kodning för lokal \"%s\"" -#: initdb.c:2504 +#: initdb.c:2370 #, c-format -msgid "Rerun %s with the -E option.\n" -msgstr "Upprepa %s, men nu med flaggan -E.\n" +msgid "Rerun %s with the -E option." +msgstr "Kör %s igen men med flaggan -E." -#: initdb.c:2505 initdb.c:3127 initdb.c:3148 +#: initdb.c:2371 initdb.c:2990 initdb.c:3010 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Försök med \"%s --help\" för mer information.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." -#: initdb.c:2518 +#: initdb.c:2383 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -769,178 +800,179 @@ msgstr "" "Teckenkodning \"%s\", tagen ur lokalnamnet, är inte godtagbar för servern.\n" "I dess ställe sättes databasens förvalda teckenkodning till \"%s\".\n" -#: initdb.c:2523 +#: initdb.c:2388 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "lokalen \"%s\" kräver ej supportad teckenkodning \"%s\"" -#: initdb.c:2526 +#: initdb.c:2390 #, c-format -msgid "" -"Encoding \"%s\" is not allowed as a server-side encoding.\n" -"Rerun %s with a different locale selection.\n" -msgstr "" -"Teckenkodning \"%s\" är inte godtagbar för servern.\n" -"Upprepa %s med annat lokalnamn.\n" +msgid "Encoding \"%s\" is not allowed as a server-side encoding." +msgstr "Teckenkodning \"%s\" tillåts inte som serverteckenkodning." -#: initdb.c:2535 +#: initdb.c:2392 +#, c-format +msgid "Rerun %s with a different locale selection." +msgstr "Kör %s igen men välj en annan lokal." + +#: initdb.c:2400 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "Förvald teckenkodning för databaser är satt till \"%s\".\n" -#: initdb.c:2597 +#: initdb.c:2466 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "kunde inte hitta en lämplig textsökningskonfiguration för lokalnamn \"%s\"" -#: initdb.c:2608 +#: initdb.c:2477 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "ingen lämplig textsökningskonfiguration för lokalnamn \"%s\"" -#: initdb.c:2613 +#: initdb.c:2482 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "uppgiven textsökningskonfiguration \"%s\" passar kanske inte till lokalnamn \"%s\"" -#: initdb.c:2618 +#: initdb.c:2487 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "Förvald textsökningskonfiguration för databaser är satt till \"%s\".\n" -#: initdb.c:2662 initdb.c:2744 +#: initdb.c:2531 initdb.c:2602 #, c-format msgid "creating directory %s ... " msgstr "skapar katalog %s ... " -#: initdb.c:2668 initdb.c:2750 initdb.c:2815 initdb.c:2877 +#: initdb.c:2536 initdb.c:2607 initdb.c:2659 initdb.c:2715 #, c-format msgid "could not create directory \"%s\": %m" msgstr "kunde inte skapa katalog \"%s\": %m" -#: initdb.c:2679 initdb.c:2762 +#: initdb.c:2545 initdb.c:2617 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "sätter rättigheter på existerande katalog %s ... " -#: initdb.c:2685 initdb.c:2768 +#: initdb.c:2550 initdb.c:2622 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "kunde inte ändra rättigheter på katalogen \"%s\": %m" -#: initdb.c:2699 initdb.c:2782 +#: initdb.c:2562 initdb.c:2634 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "katalogen \"%s\" existerar men är inte tom" -#: initdb.c:2704 +#: initdb.c:2566 #, c-format -msgid "" -"If you want to create a new database system, either remove or empty\n" -"the directory \"%s\" or run %s\n" -"with an argument other than \"%s\".\n" -msgstr "" -"Om du vill skapa ett nytt databassystem, tag då antingen bort\n" -"eller töm katalogen \"%s\" eller kör %s\n" -"med annat argument än \"%s\".\n" +msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." +msgstr "Om du vill skapa ett nytt databassystem, tag då antingen bort eller töm katalogen \"%s\" eller kör %s med annat argument än \"%s\"." -#: initdb.c:2712 initdb.c:2794 initdb.c:3163 +#: initdb.c:2574 initdb.c:2644 initdb.c:3027 #, c-format msgid "could not access directory \"%s\": %m" msgstr "kunde inte komma åt katalog \"%s\": %m" -#: initdb.c:2735 +#: initdb.c:2595 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL-katalogen måste vara en absolut sökväg" -#: initdb.c:2787 +#: initdb.c:2638 #, c-format -msgid "" -"If you want to store the WAL there, either remove or empty the directory\n" -"\"%s\".\n" -msgstr "" -"Om du vill spara WAL där, antingen radera eller töm\n" -"katalogen \"%s\".\n" +msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." +msgstr "Om du vill spara WAL där, antingen radera eller töm katalogen \"%s\"." -#: initdb.c:2801 +#: initdb.c:2649 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "kan inte skapa symbolisk länk \"%s\": %m" -#: initdb.c:2806 +#: initdb.c:2652 #, c-format msgid "symlinks are not supported on this platform" msgstr "symboliska länkar stöds inte på denna plattform" -#: initdb.c:2830 +#: initdb.c:2671 #, c-format -msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n" -msgstr "Den innehåller en gömd fil, med inledande punkt i namnet; kanske är detta en monteringspunkt.\n" +msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." +msgstr "Den innehåller en gömd fil, med inledande punkt i namnet; kanske är detta en monteringspunkt." -#: initdb.c:2833 +#: initdb.c:2673 #, c-format -msgid "It contains a lost+found directory, perhaps due to it being a mount point.\n" -msgstr "Den innehåller \"lost+found\"; kanske är detta en monteringspunkt.\n" +msgid "It contains a lost+found directory, perhaps due to it being a mount point." +msgstr "Den innehåller \"lost+found\"; kanske är detta en monteringspunkt." -#: initdb.c:2836 +#: initdb.c:2675 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" -"Create a subdirectory under the mount point.\n" +"Create a subdirectory under the mount point." msgstr "" "Att använda en monteringspunkt som datakatalog rekommenderas inte.\n" -"Skapa först en underkatalog under monteringspunkten.\n" +"Skapa först en underkatalog under monteringspunkten." -#: initdb.c:2862 +#: initdb.c:2701 #, c-format msgid "creating subdirectories ... " msgstr "Skapar underkataloger ... " -#: initdb.c:2908 +#: initdb.c:2744 msgid "performing post-bootstrap initialization ... " msgstr "utför initiering efter uppstättning..." -#: initdb.c:3065 +#: initdb.c:2909 #, c-format msgid "Running in debug mode.\n" msgstr "Kör i debug-läge.\n" -#: initdb.c:3069 +#: initdb.c:2913 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "Kör i no-clean-läge. Misstag kommer inte städas bort.\n" -#: initdb.c:3146 +#: initdb.c:2983 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "okänd lokalleverantör: %s" + +#: initdb.c:3008 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för många kommandoradsargument (första är \"%s\")" -#: initdb.c:3167 initdb.c:3256 +#: initdb.c:3015 +#, c-format +msgid "%s cannot be specified unless locale provider \"%s\" is chosen" +msgstr "%s kan inte anges om inte lokalleverantör \"%s\" valts" + +#: initdb.c:3029 initdb.c:3106 msgid "syncing data to disk ... " msgstr "synkar data till disk ... " -#: initdb.c:3176 +#: initdb.c:3037 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "lösenordsfråga och lösenordsfil kan inte anges samtidigt" -#: initdb.c:3201 +#: initdb.c:3059 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "argumentet till --wal-segsize måste vara ett tal" -#: initdb.c:3206 +#: initdb.c:3061 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "argumentet till --wal-segsize måste vara en tvåpotens mellan 1 och 1024" -#: initdb.c:3223 +#: initdb.c:3075 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "superuser-namn \"%s\" tillåts inte; rollnamn får inte börja på \"pg_\"" -#: initdb.c:3227 +#: initdb.c:3077 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -951,17 +983,17 @@ msgstr "" "Denna användare måste också vara ägare av server-processen.\n" "\n" -#: initdb.c:3243 +#: initdb.c:3093 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Checksummor för datablock är aktiva.\n" -#: initdb.c:3245 +#: initdb.c:3095 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Checksummor för datablock är avstängda.\n" -#: initdb.c:3262 +#: initdb.c:3112 #, c-format msgid "" "\n" @@ -972,26 +1004,22 @@ msgstr "" "Avstod från synkning mot lagringsmedium.\n" "Datakatalogen kan komma att fördärvas om operativsystemet störtar.\n" -#: initdb.c:3267 +#: initdb.c:3117 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "slår på autentiseringsmetod \"trust\" för lokala anslutningar" -#: initdb.c:3268 +#: initdb.c:3118 #, c-format -msgid "" -"You can change this by editing pg_hba.conf or using the option -A, or\n" -"--auth-local and --auth-host, the next time you run initdb.\n" -msgstr "" -"Du kan ändra detta genom att redigera pg_hba.conf eller genom att sätta\n" -"flaggor -A eller --auth-local och --auth-host nästa gång du kör initdb.\n" +msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." +msgstr "Du kan ändra detta genom att redigera pg_hba.conf eller genom att sätta flaggor -A eller --auth-local och --auth-host nästa gång du kör initdb." #. translator: This is a placeholder in a shell command. -#: initdb.c:3293 +#: initdb.c:3148 msgid "logfile" msgstr "loggfil" -#: initdb.c:3295 +#: initdb.c:3150 #, c-format msgid "" "\n" @@ -1005,24 +1033,3 @@ msgstr "" "\n" " %s\n" "\n" - -#~ msgid "could not load advapi32.dll: error code %lu" -#~ msgstr "kunde inte ladda advapi32.dll: felkod %lu" - -#~ msgid "" -#~ "The program \"postgres\" was found by \"%s\"\n" -#~ "but was not the same version as %s.\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Programmet \"postgres\" hittades av \"%s\",\n" -#~ "men det är inte byggt i samma version som %s.\n" -#~ "Kontrollera din installation." - -#~ msgid "" -#~ "The program \"postgres\" is needed by %s but was not found in the\n" -#~ "same directory as \"%s\".\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Programmet \"postgres\" behövs av %s men kunde inte hittas\n" -#~ "i samma katalog som \"%s\".\n" -#~ "Kontrollera din installation." diff --git a/src/bin/initdb/po/uk.po b/src/bin/initdb/po/uk.po index 9851ac5e80..3e30623003 100644 --- a/src/bin/initdb/po/uk.po +++ b/src/bin/initdb/po/uk.po @@ -2,11 +2,11 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:16+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" -"Last-Translator: pasha_golub\n" +"POT-Creation-Date: 2021-08-17 08:47+0000\n" +"PO-Revision-Date: 2021-08-17 11:18\n" +"Last-Translator: \n" "Language-Team: Ukrainian\n" -"Language: uk\n" +"Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -14,61 +14,61 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/initdb.pot\n" -"X-Crowdin-File-ID: 484\n" +"X-Crowdin-File: /REL_14_DEV/initdb.pot\n" +"X-Crowdin-File-ID: 780\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "збій: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "помилка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "попередження: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "не вдалося визначити поточний каталог: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "невірний бінарний файл \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "неможливо прочитати бінарний файл \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "неможливо знайти \"%s\" для виконання" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не вдалося змінити каталог на \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не можливо прочитати символічне послання \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:409 #, c-format -msgid "pclose failed: %m" -msgstr "помилка pclose: %m" +msgid "%s() failed: %m" +msgstr "%s() помилка: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 -#: initdb.c:325 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 +#: initdb.c:331 #, c-format msgid "out of memory" msgstr "недостатньо пам'яті" @@ -84,33 +84,33 @@ msgstr "недостатньо пам'яті\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "неможливо дублювати нульовий покажчик (внутрішня помилка)\n" -#: ../../common/file_utils.c:79 ../../common/file_utils.c:181 +#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не вдалося отримати інформацію від файлу \"%s\": %m" -#: ../../common/file_utils.c:158 ../../common/pgfnames.c:48 +#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не вдалося відкрити каталог \"%s\": %m" -#: ../../common/file_utils.c:192 ../../common/pgfnames.c:69 +#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не вдалося прочитати каталог \"%s\": %m" -#: ../../common/file_utils.c:224 ../../common/file_utils.c:283 -#: ../../common/file_utils.c:357 +#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 +#: ../../common/file_utils.c:365 #, c-format msgid "could not open file \"%s\": %m" msgstr "не можливо відкрити файл \"%s\": %m" -#: ../../common/file_utils.c:295 ../../common/file_utils.c:365 +#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "не вдалося fsync файл \"%s\": %m" -#: ../../common/file_utils.c:375 +#: ../../common/file_utils.c:383 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "не вдалося перейменувати файл \"%s\" на \"%s\": %m" @@ -224,222 +224,222 @@ msgstr "не вдалося встановити сполучення для \"% msgid "could not get junction for \"%s\": %s\n" msgstr "не вдалося встановити сполучення для \"%s\": %s\n" -#: initdb.c:481 initdb.c:1505 +#: initdb.c:464 initdb.c:1496 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не вдалося відкрити файл \"%s\" для читання: %m" -#: initdb.c:536 initdb.c:846 initdb.c:872 +#: initdb.c:508 initdb.c:830 initdb.c:856 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "не вдалося відкрити файл \"%s\" для запису: %m" -#: initdb.c:543 initdb.c:550 initdb.c:852 initdb.c:877 +#: initdb.c:515 initdb.c:522 initdb.c:836 initdb.c:861 #, c-format msgid "could not write file \"%s\": %m" msgstr "не вдалося записати файл \"%s\": %m" -#: initdb.c:568 +#: initdb.c:540 #, c-format msgid "could not execute command \"%s\": %m" msgstr "не вдалося виконати команду \"%s\": %m" -#: initdb.c:586 +#: initdb.c:558 #, c-format msgid "removing data directory \"%s\"" msgstr "видалення даних з директорії \"%s\"" -#: initdb.c:588 +#: initdb.c:560 #, c-format msgid "failed to remove data directory" msgstr "не вдалося видалити дані директорії" -#: initdb.c:592 +#: initdb.c:564 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "видалення даних з директорії \"%s\"" -#: initdb.c:595 +#: initdb.c:567 #, c-format msgid "failed to remove contents of data directory" msgstr "не вдалося видалити дані директорії" -#: initdb.c:600 +#: initdb.c:572 #, c-format msgid "removing WAL directory \"%s\"" msgstr "видалення WAL директорії \"%s\"" -#: initdb.c:602 +#: initdb.c:574 #, c-format msgid "failed to remove WAL directory" msgstr "не вдалося видалити директорію WAL" -#: initdb.c:606 +#: initdb.c:578 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "видалення даних з директорії WAL \"%s\"" -#: initdb.c:608 +#: initdb.c:580 #, c-format msgid "failed to remove contents of WAL directory" msgstr "не вдалося видалити дані директорії WAL" -#: initdb.c:615 +#: initdb.c:587 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "директорія даних \"%s\" не видалена за запитом користувача" -#: initdb.c:619 +#: initdb.c:591 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "директорія WAL \"%s\" не видалена за запитом користувача" -#: initdb.c:637 +#: initdb.c:609 #, c-format msgid "cannot be run as root" msgstr "не може виконуватись як root" -#: initdb.c:639 +#: initdb.c:611 #, c-format msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" "own the server process.\n" msgstr "Будь ласка, увійдіть (за допомогою, наприклад, \"su\") як (непривілейований) користувач, від імені якого буде запущено серверний процес. \n" -#: initdb.c:672 +#: initdb.c:644 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "\"%s\" невірне ім'я серверного кодування" -#: initdb.c:805 +#: initdb.c:789 #, c-format msgid "file \"%s\" does not exist" msgstr "файл \"%s\" не існує" -#: initdb.c:807 initdb.c:814 initdb.c:823 +#: initdb.c:791 initdb.c:798 initdb.c:807 #, c-format msgid "This might mean you have a corrupted installation or identified\n" "the wrong directory with the invocation option -L.\n" msgstr "Це означає, що ваша інсталяція пошкоджена або в параметрі -L задана неправильна директорія.\n" -#: initdb.c:812 +#: initdb.c:796 #, c-format msgid "could not access file \"%s\": %m" msgstr "немає доступу до файлу \"%s\": %m" -#: initdb.c:821 +#: initdb.c:805 #, c-format msgid "file \"%s\" is not a regular file" msgstr "файл \"%s\" не є звичайним файлом" -#: initdb.c:966 +#: initdb.c:950 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "обирається реалізація динамічної спільної пам'яті ... " -#: initdb.c:975 +#: initdb.c:959 #, c-format msgid "selecting default max_connections ... " msgstr "обирається значення max_connections ... \n" " " -#: initdb.c:1006 +#: initdb.c:990 #, c-format msgid "selecting default shared_buffers ... " msgstr "обирається значення shared_buffers... " -#: initdb.c:1040 +#: initdb.c:1024 #, c-format msgid "selecting default time zone ... " msgstr "обирається часовий пояс за замовчуванням ... " -#: initdb.c:1074 +#: initdb.c:1058 msgid "creating configuration files ... " msgstr "створення конфігураційних файлів... " -#: initdb.c:1227 initdb.c:1246 initdb.c:1332 initdb.c:1347 +#: initdb.c:1217 initdb.c:1236 initdb.c:1322 initdb.c:1337 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "неможливо змінити дозволи \"%s\": %m" -#: initdb.c:1369 +#: initdb.c:1359 #, c-format msgid "running bootstrap script ... " msgstr "виконуємо сценарій ініціалізації ... " -#: initdb.c:1381 +#: initdb.c:1371 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "вхідний файл \"%s\" не належить PostgreSQL %s" -#: initdb.c:1384 +#: initdb.c:1374 #, c-format msgid "Check your installation or specify the correct path using the option -L.\n" msgstr "Перевірте вашу установку або вкажіть правильний перелік дій використання параметру-L.\n" -#: initdb.c:1482 +#: initdb.c:1473 msgid "Enter new superuser password: " msgstr "Введіть новий пароль для superuser: " -#: initdb.c:1483 +#: initdb.c:1474 msgid "Enter it again: " msgstr "Введіть знову: " -#: initdb.c:1486 +#: initdb.c:1477 #, c-format msgid "Passwords didn't match.\n" msgstr "Паролі не співпадають.\n" -#: initdb.c:1512 +#: initdb.c:1504 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "не вдалося прочитати пароль з файлу \"%s\": %m" -#: initdb.c:1515 +#: initdb.c:1507 #, c-format msgid "password file \"%s\" is empty" msgstr "файл з паролями \"%s\" є порожнім" -#: initdb.c:2043 +#: initdb.c:1998 #, c-format msgid "caught signal\n" msgstr "отримано сигнал\n" -#: initdb.c:2049 +#: initdb.c:2004 #, c-format msgid "could not write to child process: %s\n" msgstr "не вдалося написати у дочірній процес: %s\n" -#: initdb.c:2057 +#: initdb.c:2012 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2147 +#: initdb.c:2102 #, c-format msgid "setlocale() failed" msgstr "setlocale() завершився невдало" -#: initdb.c:2168 +#: initdb.c:2123 #, c-format msgid "failed to restore old locale \"%s\"" -msgstr "не вдалося відновити старі локалі \"%s\"" +msgstr "не вдалося відновити стару локаль \"%s\"" -#: initdb.c:2177 +#: initdb.c:2132 #, c-format msgid "invalid locale name \"%s\"" msgstr "не допустиме ім'я локалі \"%s\"" -#: initdb.c:2188 +#: initdb.c:2143 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "неприпустимі параметри локалі; перевірте LANG та LC_* змінні середовища" -#: initdb.c:2215 +#: initdb.c:2170 #, c-format msgid "encoding mismatch" msgstr "невідповідність кодування" -#: initdb.c:2217 +#: initdb.c:2172 #, c-format msgid "The encoding you selected (%s) and the encoding that the\n" "selected locale uses (%s) do not match. This would lead to\n" @@ -450,64 +450,69 @@ msgstr "Кодування, яке ви вибрали (%s), та кодуван "Це може спричинити некоректну поведінку у функціях, що обробляють символьні рядки.\n" "Перезапустіть %s і не вказуйте явне кодування або виберіть відповідну комбінацію.\n" -#: initdb.c:2289 +#: initdb.c:2244 #, c-format msgid "%s initializes a PostgreSQL database cluster.\n\n" msgstr "%s ініціалізує кластер баз даних PostgreSQL.\n\n" -#: initdb.c:2290 +#: initdb.c:2245 #, c-format msgid "Usage:\n" msgstr "Використання:\n" -#: initdb.c:2291 +#: initdb.c:2246 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATADIR]\n" -#: initdb.c:2292 +#: initdb.c:2247 #, c-format msgid "\n" "Options:\n" msgstr "\n" "Параметри:\n" -#: initdb.c:2293 +#: initdb.c:2248 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, -- auth=METHOD метод аутентифікації за замовчуванням для локальних підключень\n" -#: initdb.c:2294 +#: initdb.c:2249 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr " --auth-host=METHOD метод аутентифікації за замовчуванням для локального TCP/IP підключення\n" -#: initdb.c:2295 +#: initdb.c:2250 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr " --auth-local=METHOD метод аутентифікації за замовчуванням для локального під'єднання через сокет\n" -#: initdb.c:2296 +#: initdb.c:2251 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D - pgdata =] DATADIR розташування кластеру цієї бази даних\n" -#: initdb.c:2297 +#: initdb.c:2252 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=ENCODING встановлення кодування за замовчуванням для нової бази даних\n" -#: initdb.c:2298 +#: initdb.c:2253 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr " -g, --allow-group-access дозволити читати/виконувати у каталозі даних для групи\n" -#: initdb.c:2299 +#: initdb.c:2254 +#, c-format +msgid " -k, --data-checksums use data page checksums\n" +msgstr " -k, --data-checksums використовувати контрольні суми сторінок\n" + +#: initdb.c:2255 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOCALE встановлює локаль за замовчуванням для нових баз даних\n" -#: initdb.c:2300 +#: initdb.c:2256 #, c-format msgid " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" " --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n" @@ -518,103 +523,108 @@ msgstr " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" " встановлення локалі за замовчуванням для відповідної категорії в\n" " нових базах даних (замість значення з середовища)\n" -#: initdb.c:2304 +#: initdb.c:2260 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale еквівалентно --locale=C\n" -#: initdb.c:2305 +#: initdb.c:2261 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr " --pwfile=FILE прочитати пароль для нового суперкористувача з файлу\n" -#: initdb.c:2306 +#: initdb.c:2262 #, c-format msgid " -T, --text-search-config=CFG\n" " default text search configuration\n" msgstr " -T, --text-search-config=CFG конфігурація текстового пошуку за замовчуванням\n" -#: initdb.c:2308 +#: initdb.c:2264 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NAME ім'я суперкористувача бази даних\n" -#: initdb.c:2309 +#: initdb.c:2265 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt запитувати пароль нового суперкористувача\n" -#: initdb.c:2310 +#: initdb.c:2266 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR розташування журналу попереднього запису\n" -#: initdb.c:2311 +#: initdb.c:2267 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=SIZE розмір сегментів WAL у мегабайтах\n" -#: initdb.c:2312 +#: initdb.c:2268 #, c-format msgid "\n" "Less commonly used options:\n" msgstr "\n" "Рідковживані параметри:\n" -#: initdb.c:2313 +#: initdb.c:2269 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug генерувати багато налагоджувальних повідомлень\n" -#: initdb.c:2314 +#: initdb.c:2270 #, c-format -msgid " -k, --data-checksums use data page checksums\n" -msgstr " -k, --data-checksums використовувати контрольні суми сторінок\n" +msgid " --discard-caches set debug_discard_caches=1\n" +msgstr " --discard-caches встановити debug_discard_caches=1\n" -#: initdb.c:2315 +#: initdb.c:2271 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRECTORY розташування вхідних файлів\n" -#: initdb.c:2316 +#: initdb.c:2272 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean не очищувати після помилок\n" " \n" -#: initdb.c:2317 +#: initdb.c:2273 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync не чекати на безпечний запис змін на диск\n" -#: initdb.c:2318 +#: initdb.c:2274 +#, c-format +msgid " --no-instructions do not print instructions for next steps\n" +msgstr " --no-instructions не друкувати інструкції для наступних кроків\n" + +#: initdb.c:2275 #, c-format msgid " -s, --show show internal settings\n" msgstr " -s, --show показати внутрішні налаштування\n" -#: initdb.c:2319 +#: initdb.c:2276 #, c-format msgid " -S, --sync-only only sync data directory\n" msgstr " -S, --sync-only синхронізувати тільки каталог даних\n" -#: initdb.c:2320 +#: initdb.c:2277 #, c-format msgid "\n" "Other options:\n" msgstr "\n" "Інші параметри:\n" -#: initdb.c:2321 +#: initdb.c:2278 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію і вийти\n" -#: initdb.c:2322 +#: initdb.c:2279 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: initdb.c:2323 +#: initdb.c:2280 #, c-format msgid "\n" "If the data directory is not specified, the environment variable PGDATA\n" @@ -622,41 +632,46 @@ msgid "\n" msgstr "\n" "Якщо каталог даних не вказано, використовується змінна середовища PGDATA.\n" -#: initdb.c:2325 +#: initdb.c:2282 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "Повідомляти про помилки на <%s>.\n" -#: initdb.c:2326 +#: initdb.c:2283 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" -#: initdb.c:2354 +#: initdb.c:2311 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "неприпустимий спосіб автентифікації \"%s\" для \"%s\" підключення" -#: initdb.c:2370 +#: initdb.c:2327 #, c-format -msgid "must specify a password for the superuser to enable %s authentication" -msgstr "необхідно вказати пароль суперкористувача для активації автентифікації %s" +msgid "must specify a password for the superuser to enable password authentication" +msgstr "необхідно вказати пароль суперкористувача для активації автентифікації за допомогою пароля" -#: initdb.c:2397 +#: initdb.c:2348 #, c-format msgid "no data directory specified" msgstr "каталог даних не вказано" -#: initdb.c:2399 +#: initdb.c:2350 #, c-format msgid "You must identify the directory where the data for this database system\n" "will reside. Do this with either the invocation option -D or the\n" "environment variable PGDATA.\n" msgstr "Вам потрібно ідентифікувати каталог, у якому будуть розташовані дані для цієї бази даних. Зробіть це за допомогою параметру -D або змінного середовища PGDATA.\n" -#: initdb.c:2434 +#: initdb.c:2368 +#, c-format +msgid "could not set environment" +msgstr "не вдалося встановити середовище" + +#: initdb.c:2388 #, c-format msgid "The program \"%s\" is needed by %s but was not found in the\n" "same directory as \"%s\".\n" @@ -664,7 +679,7 @@ msgid "The program \"%s\" is needed by %s but was not found in the\n" msgstr "Програма \"%s\" потрібна для %s, але не знайдена в тому ж каталозі, що й \"%s\".\n" "Перевірте вашу установку." -#: initdb.c:2439 +#: initdb.c:2393 #, c-format msgid "The program \"%s\" was found by \"%s\"\n" "but was not the same version as %s.\n" @@ -672,17 +687,17 @@ msgid "The program \"%s\" was found by \"%s\"\n" msgstr "Програма \"%s\" була знайдена \"%s\", але не була тієї ж версії, що %s.\n" "Перевірте вашу установку." -#: initdb.c:2458 +#: initdb.c:2412 #, c-format msgid "input file location must be an absolute path" msgstr "розташування вхідного файлу має бути абсолютним шляхом" -#: initdb.c:2475 +#: initdb.c:2429 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "Кластер бази даних буде ініціалізовано з локалізацією \"%s\".\n" -#: initdb.c:2478 +#: initdb.c:2432 #, c-format msgid "The database cluster will be initialized with locales\n" " COLLATE: %s\n" @@ -699,206 +714,206 @@ msgstr "Кластер бази даних буде ініціалізовано " NUMERIC: %s\n" " TIME: %s\n" -#: initdb.c:2502 +#: initdb.c:2456 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "не вдалося знайти відповідне кодування для локалі \"%s\"" -#: initdb.c:2504 +#: initdb.c:2458 #, c-format msgid "Rerun %s with the -E option.\n" msgstr "Перезапустіть %s з параметром -E.\n" -#: initdb.c:2505 initdb.c:3127 initdb.c:3148 +#: initdb.c:2459 initdb.c:3099 initdb.c:3120 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" для отримання додаткової інформації.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" -#: initdb.c:2518 +#: initdb.c:2472 #, c-format msgid "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" "The default database encoding will be set to \"%s\" instead.\n" msgstr "Кодування \"%s\", що очікується локалізацією, не дозволено у якості кодування сервера.\n" "Замість нього буде встановлене кодування \"%s\" за замовчуванням.\n" -#: initdb.c:2523 +#: initdb.c:2477 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "локалізація \"%s\" потребує кодування \"%s\", що не підтримується" -#: initdb.c:2526 +#: initdb.c:2480 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding.\n" "Rerun %s with a different locale selection.\n" msgstr "Кодування \"%s\" не дозволяється у якості кодування сервера.\n" "Перезапустіть %s, обравши іншу локалізацію.\n" -#: initdb.c:2535 +#: initdb.c:2489 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "Кодування бази даних за замовчуванням встановлено: \"%s\".\n" -#: initdb.c:2597 +#: initdb.c:2555 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "не вдалося знайти відповідну конфігурацію текстового пошуку для локалі\"%s\"" -#: initdb.c:2608 +#: initdb.c:2566 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "відповідна конфігурація текстового пошуку для локалі \"%s\" невідома" -#: initdb.c:2613 +#: initdb.c:2571 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "вказана конфігурація текстового пошуку \"%s\" може не підходити локалі \"%s\"" -#: initdb.c:2618 +#: initdb.c:2576 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "Конфігурація текстового пошуку за замовчуванням буде встановлена в \"%s\".\n" -#: initdb.c:2662 initdb.c:2744 +#: initdb.c:2620 initdb.c:2702 #, c-format msgid "creating directory %s ... " msgstr "створення каталогу %s... " -#: initdb.c:2668 initdb.c:2750 initdb.c:2815 initdb.c:2877 +#: initdb.c:2626 initdb.c:2708 initdb.c:2773 initdb.c:2835 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не вдалося створити каталог \"%s\": %m" -#: initdb.c:2679 initdb.c:2762 +#: initdb.c:2637 initdb.c:2720 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "виправляю дозволи для створеного каталогу %s... " -#: initdb.c:2685 initdb.c:2768 +#: initdb.c:2643 initdb.c:2726 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "не вдалося змінити дозволи каталогу \"%s\": %m" -#: initdb.c:2699 initdb.c:2782 +#: initdb.c:2657 initdb.c:2740 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "каталог \"%s\" існує, але він не порожній" -#: initdb.c:2704 +#: initdb.c:2662 #, c-format msgid "If you want to create a new database system, either remove or empty\n" "the directory \"%s\" or run %s\n" "with an argument other than \"%s\".\n" msgstr "Якщо ви хочете створити нову систему бази даних, видаліть або очистіть каталог \"%s\", або запустіть %s з іншим аргументом, ніж \"%s\".\n" -#: initdb.c:2712 initdb.c:2794 initdb.c:3163 +#: initdb.c:2670 initdb.c:2752 initdb.c:3135 #, c-format msgid "could not access directory \"%s\": %m" msgstr "немає доступу до каталогу \"%s\": %m" -#: initdb.c:2735 +#: initdb.c:2693 #, c-format msgid "WAL directory location must be an absolute path" msgstr "розташування WAL каталогу має бути абсолютним шляхом" -#: initdb.c:2787 +#: initdb.c:2745 #, c-format msgid "If you want to store the WAL there, either remove or empty the directory\n" "\"%s\".\n" msgstr "Якщо ви хочете зберегти WAL, видаліть або спорожніть каталог \"%s\".\n" -#: initdb.c:2801 +#: initdb.c:2759 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "не вдалося створити символічне послання \"%s\": %m" -#: initdb.c:2806 +#: initdb.c:2764 #, c-format msgid "symlinks are not supported on this platform" msgstr "символічні посилання не підтримуються цією платформою" -#: initdb.c:2830 +#: initdb.c:2788 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n" msgstr "Він містить файл з крапкою або невидимий файл, можливо це точка під'єднання.\n" -#: initdb.c:2833 +#: initdb.c:2791 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point.\n" msgstr "Він містить каталог lost+found, можливо це точка під'єднання.\n" -#: initdb.c:2836 +#: initdb.c:2794 #, c-format msgid "Using a mount point directly as the data directory is not recommended.\n" "Create a subdirectory under the mount point.\n" msgstr "Не рекомендується використовувати точку під'єднання у якості каталогу даних.\n" "Створіть підкаталог і використайте його.\n" -#: initdb.c:2862 +#: initdb.c:2820 #, c-format msgid "creating subdirectories ... " msgstr "створення підкаталогів... " -#: initdb.c:2908 +#: initdb.c:2866 msgid "performing post-bootstrap initialization ... " msgstr "виконується кінцева фаза ініціалізації ... " -#: initdb.c:3065 +#: initdb.c:3029 #, c-format msgid "Running in debug mode.\n" msgstr "Виконується у режимі налагодження.\n" -#: initdb.c:3069 +#: initdb.c:3033 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "Виконується у режимі 'no-clean'. Помилки не будуть виправлені.\n" -#: initdb.c:3146 +#: initdb.c:3118 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному рядку (перший \"%s\")" -#: initdb.c:3167 initdb.c:3256 +#: initdb.c:3139 initdb.c:3228 msgid "syncing data to disk ... " msgstr "синхронізація даних з диском ... " -#: initdb.c:3176 +#: initdb.c:3148 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "неможливо вказати одночасно пароль і файл паролю" -#: initdb.c:3201 +#: initdb.c:3173 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "аргумент --wal-segsize повинен бути числом" -#: initdb.c:3206 +#: initdb.c:3178 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "аргумент --wal-segsize повинен бути ступенем 2 між 1 і 1024" -#: initdb.c:3223 +#: initdb.c:3195 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "неприпустиме ім'я суперкористувача \"%s\"; імена ролей не можуть починатися на \"pg_\"" -#: initdb.c:3227 +#: initdb.c:3199 #, c-format msgid "The files belonging to this database system will be owned by user \"%s\".\n" "This user must also own the server process.\n\n" msgstr "Файли цієї бази даних будуть належати користувачеві \"%s\".\n" "Від імені цього користувача повинен запускатися процес сервера.\n\n" -#: initdb.c:3243 +#: initdb.c:3215 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Контроль цілісності сторінок даних увімкнено.\n" -#: initdb.c:3245 +#: initdb.c:3217 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Контроль цілісності сторінок даних вимкнено.\n" -#: initdb.c:3262 +#: initdb.c:3234 #, c-format msgid "\n" "Sync to disk skipped.\n" @@ -907,12 +922,12 @@ msgstr "\n" "Синхронізація з диском пропущена.\n" "Каталог з даними може бути пошкоджено під час аварійного завершення роботи операційної системи.\n" -#: initdb.c:3267 +#: initdb.c:3239 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "увімкнення автентифікації \"довіри\" для локальних підключень" -#: initdb.c:3268 +#: initdb.c:3240 #, c-format msgid "You can change this by editing pg_hba.conf or using the option -A, or\n" "--auth-local and --auth-host, the next time you run initdb.\n" @@ -920,11 +935,11 @@ msgstr "Ви можете змінити це, змінивши pg_hba.conf аб "--auth-local і --auth-host, наступний раз, коли ви запускаєте initdb.\n" #. translator: This is a placeholder in a shell command. -#: initdb.c:3293 +#: initdb.c:3270 msgid "logfile" msgstr "logfile" -#: initdb.c:3295 +#: initdb.c:3272 #, c-format msgid "\n" "Success. You can now start the database server using:\n\n" diff --git a/src/bin/initdb/po/zh_CN.po b/src/bin/initdb/po/zh_CN.po index 8a4d4f62cc..9876679154 100644 --- a/src/bin/initdb/po/zh_CN.po +++ b/src/bin/initdb/po/zh_CN.po @@ -4,112 +4,111 @@ # msgid "" msgstr "" -"Project-Id-Version: initdb (PostgreSQL) 12\n" +"Project-Id-Version: initdb (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-05-28 18:00+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:47+0000\n" +"PO-Revision-Date: 2021-08-15 18:00+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "X-Generator: Poedit 1.5.7\n" -#: ../../../src/common/logging.c:188 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "致命的: " -#: ../../../src/common/logging.c:195 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "错误: " -#: ../../../src/common/logging.c:202 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "警告: " -#: ../../common/exec.c:138 ../../common/exec.c:255 ../../common/exec.c:301 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "无法确认当前目录: %m" -#: ../../common/exec.c:157 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "无效的二进制码 \"%s\"" -#: ../../common/exec.c:207 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "无法读取二进制码 \"%s\"" -#: ../../common/exec.c:215 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "未能找到一个 \"%s\" 来执行" -#: ../../common/exec.c:271 ../../common/exec.c:310 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "无法跳转到目录 \"%s\" 中: %m" -#: ../../common/exec.c:288 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "无法读取符号链接 \"%s\": %m" -#: ../../common/exec.c:541 -#, c-format -msgid "pclose failed: %m" -msgstr "pclose调用失败: %m" +#: ../../common/exec.c:409 +msgid "%s() failed: %m" +msgstr "%s()失败: %m" -#: ../../common/exec.c:670 ../../common/exec.c:715 ../../common/exec.c:807 -#: initdb.c:339 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 +#: initdb.c:331 #, c-format msgid "out of memory" -msgstr "内存用尽" +msgstr "内存不足" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format msgid "out of memory\n" -msgstr "内存溢出\n" +msgstr "内存不足\n" -#: ../../common/fe_memutils.c:92 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "无法复制空指针 (内部错误)\n" -#: ../../common/file_utils.c:81 ../../common/file_utils.c:183 +#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 #, c-format msgid "could not stat file \"%s\": %m" msgstr "无法取文件 \"%s\" 的状态: %m" -#: ../../common/file_utils.c:160 ../../common/pgfnames.c:48 +#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48 #, c-format msgid "could not open directory \"%s\": %m" msgstr "无法打开目录 \"%s\": %m" -#: ../../common/file_utils.c:194 ../../common/pgfnames.c:69 +#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69 #, c-format msgid "could not read directory \"%s\": %m" msgstr "无法读取目录 \"%s\": %m" -#: ../../common/file_utils.c:226 ../../common/file_utils.c:285 -#: ../../common/file_utils.c:359 +#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 +#: ../../common/file_utils.c:365 #, c-format msgid "could not open file \"%s\": %m" msgstr "无法打开文件 \"%s\": %m" -#: ../../common/file_utils.c:297 ../../common/file_utils.c:367 +#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "无法 fsync 文件 \"%s\": %m" -#: ../../common/file_utils.c:377 +#: ../../common/file_utils.c:383 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "无法把文件 \"%s\" 重命名为 \"%s\": %m" @@ -119,37 +118,42 @@ msgstr "无法把文件 \"%s\" 重命名为 \"%s\": %m" msgid "could not close directory \"%s\": %m" msgstr "无法关闭目录 \"%s\": %m" -#: ../../common/restricted_token.c:69 +#: ../../common/restricted_token.c:64 +#, c-format +msgid "could not load library \"%s\": error code %lu" +msgstr "无法加载库 \"%s\": 错误码 %lu" + +#: ../../common/restricted_token.c:73 #, c-format -msgid "cannot create restricted tokens on this platform" -msgstr "无法为该平台创建受限制的令牌" +msgid "cannot create restricted tokens on this platform: error code %lu" +msgstr "无法为该平台创建受限制的令牌:错误码 %lu" -#: ../../common/restricted_token.c:78 +#: ../../common/restricted_token.c:82 #, c-format msgid "could not open process token: error code %lu" msgstr "无法打开进程令牌 (token): 错误码 %lu" -#: ../../common/restricted_token.c:91 +#: ../../common/restricted_token.c:97 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "无法分配SID: 错误码 %lu" -#: ../../common/restricted_token.c:110 +#: ../../common/restricted_token.c:119 #, c-format msgid "could not create restricted token: error code %lu" msgstr "无法创建受限令牌: 错误码为 %lu" -#: ../../common/restricted_token.c:131 +#: ../../common/restricted_token.c:140 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "无法为命令 \"%s\"创建进程: 错误码 %lu" -#: ../../common/restricted_token.c:169 +#: ../../common/restricted_token.c:178 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "无法使用受限令牌再次执行: 错误码 %lu" -#: ../../common/restricted_token.c:185 +#: ../../common/restricted_token.c:194 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "无法从子进程得到退出码: 错误码 %lu" @@ -181,7 +185,7 @@ msgstr "用户名查找失败:错误代码%lu" #: ../../common/wait_error.c:45 #, c-format msgid "command not executable" -msgstr "命令无法执行" +msgstr "无法执行命令" #: ../../common/wait_error.c:49 #, c-format @@ -201,7 +205,7 @@ msgstr "子进程被例外(exception) 0x%X 终止" #: ../../common/wait_error.c:66 #, c-format msgid "child process was terminated by signal %d: %s" -msgstr "子进程被信号 %d: %s" +msgstr "子进程被信号 %d 终止: %s" #: ../../common/wait_error.c:72 #, c-format @@ -218,82 +222,82 @@ msgstr "无法为 \"%s\"设置连接: %s\n" msgid "could not get junction for \"%s\": %s\n" msgstr "无法为\"%s\"得到连接: %s\n" -#: initdb.c:495 initdb.c:1534 +#: initdb.c:464 initdb.c:1496 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "为了读取, 无法打开文件 \"%s\": %m" -#: initdb.c:550 initdb.c:858 initdb.c:884 +#: initdb.c:508 initdb.c:830 initdb.c:856 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "为了写入, 无法打开文件 \"%s\": %m" -#: initdb.c:557 initdb.c:564 initdb.c:864 initdb.c:889 +#: initdb.c:515 initdb.c:522 initdb.c:836 initdb.c:861 #, c-format msgid "could not write file \"%s\": %m" msgstr "无法写入文件 \"%s\": %m" -#: initdb.c:582 +#: initdb.c:540 #, c-format msgid "could not execute command \"%s\": %m" msgstr "无法执行命令 \"%s\": %m" -#: initdb.c:600 +#: initdb.c:558 #, c-format msgid "removing data directory \"%s\"" msgstr "删除数据目录 \"%s\"" -#: initdb.c:602 +#: initdb.c:560 #, c-format msgid "failed to remove data directory" msgstr "删除数据目录失败" -#: initdb.c:606 +#: initdb.c:564 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "删除数据目录 \"%s\" 的内容" -#: initdb.c:609 +#: initdb.c:567 #, c-format msgid "failed to remove contents of data directory" msgstr "删除数据目录内容失败" -#: initdb.c:614 +#: initdb.c:572 #, c-format msgid "removing WAL directory \"%s\"" -msgstr "删除WAL目录 \"%s\"" +msgstr "正在删除WAL目录\"%s\"" -#: initdb.c:616 +#: initdb.c:574 #, c-format msgid "failed to remove WAL directory" msgstr "删除WAL目录失败" -#: initdb.c:620 +#: initdb.c:578 #, c-format msgid "removing contents of WAL directory \"%s\"" -msgstr "删除WAL目录 \"%s\" 的内容" +msgstr "正在删除WAL目录 \"%s\" 的内容" -#: initdb.c:622 +#: initdb.c:580 #, c-format msgid "failed to remove contents of WAL directory" msgstr "删除WAL目录内容失败" -#: initdb.c:629 +#: initdb.c:587 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "在用户的要求下数据库目录 \"%s\" 不被删除" -#: initdb.c:633 +#: initdb.c:591 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "在用户的要求下WAL目录 \"%s\" 不被删除" -#: initdb.c:651 +#: initdb.c:609 #, c-format msgid "cannot be run as root" msgstr "不能使用root用户运行" -#: initdb.c:653 +#: initdb.c:611 #, c-format msgid "" "Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" @@ -302,17 +306,17 @@ msgstr "" "请以服务器进程所有者的用户 (无特权) 身份\n" "登陆 (使用, e.g., \"su\").\n" -#: initdb.c:686 +#: initdb.c:644 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "\"%s\" 不是一个有效的服务器编码名字" -#: initdb.c:817 +#: initdb.c:789 #, c-format msgid "file \"%s\" does not exist" msgstr "文件 \"%s\" 不存在" -#: initdb.c:819 initdb.c:826 initdb.c:835 +#: initdb.c:791 initdb.c:798 initdb.c:807 #, c-format msgid "" "This might mean you have a corrupted installation or identified\n" @@ -321,124 +325,123 @@ msgstr "" "这意味着您的安装发生了错误或\n" "使用 -L 选项指定了错误的路径.\n" -#: initdb.c:824 +#: initdb.c:796 #, c-format msgid "could not access file \"%s\": %m" msgstr "无法访问文件 \"%s\": %m" -#: initdb.c:833 +#: initdb.c:805 #, c-format msgid "file \"%s\" is not a regular file" msgstr "文件 \"%s\" 不是常规文件" -#: initdb.c:978 +#: initdb.c:950 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "选择动态共享内存实现 ......" -#: initdb.c:987 +#: initdb.c:959 #, c-format msgid "selecting default max_connections ... " msgstr "选择默认最大联接数 (max_connections) ... " -#: initdb.c:1018 +#: initdb.c:990 #, c-format msgid "selecting default shared_buffers ... " msgstr "选择默认共享缓冲区大小 (shared_buffers) ... " -#: initdb.c:1052 -#, c-format -msgid "selecting default timezone ... " +#: initdb.c:1024 +msgid "selecting default time zone ... " msgstr "选择默认时区 ... " -#: initdb.c:1086 +#: initdb.c:1058 msgid "creating configuration files ... " msgstr "创建配置文件 ... " -#: initdb.c:1239 initdb.c:1258 initdb.c:1344 initdb.c:1359 +#: initdb.c:1217 initdb.c:1236 initdb.c:1322 initdb.c:1337 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "无法改变\"%s\"的权限: %m" -#: initdb.c:1381 +#: initdb.c:1359 #, c-format msgid "running bootstrap script ... " msgstr "正在运行自举脚本 ..." -#: initdb.c:1393 +#: initdb.c:1371 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "输入文件 \"%s\" 不属于PostgreSQL %s" -#: initdb.c:1396 +#: initdb.c:1374 #, c-format msgid "Check your installation or specify the correct path using the option -L.\n" msgstr "检查你的安装或使用 -L 选项指定正确的路径.\n" -#: initdb.c:1511 +#: initdb.c:1473 msgid "Enter new superuser password: " msgstr "输入新的超级用户口令: " -#: initdb.c:1512 +#: initdb.c:1474 msgid "Enter it again: " msgstr "再输入一遍: " -#: initdb.c:1515 +#: initdb.c:1477 #, c-format msgid "Passwords didn't match.\n" msgstr "口令不匹配.\n" -#: initdb.c:1541 +#: initdb.c:1504 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "无法从文件 \"%s\" 读取口令: %m" -#: initdb.c:1544 +#: initdb.c:1507 #, c-format msgid "password file \"%s\" is empty" msgstr "口令文件\"%s\"为空" -#: initdb.c:2107 +#: initdb.c:1998 #, c-format msgid "caught signal\n" msgstr "捕获信号\n" -#: initdb.c:2113 +#: initdb.c:2004 #, c-format msgid "could not write to child process: %s\n" msgstr "无法写到子进程: %s\n" -#: initdb.c:2121 +#: initdb.c:2012 #, c-format msgid "ok\n" msgstr "成功\n" -#: initdb.c:2211 +#: initdb.c:2102 #, c-format msgid "setlocale() failed" msgstr "setlocale()调用失败" -#: initdb.c:2232 +#: initdb.c:2123 #, c-format msgid "failed to restore old locale \"%s\"" msgstr "还原旧区域\"%s\"失败" -#: initdb.c:2241 +#: initdb.c:2132 #, c-format msgid "invalid locale name \"%s\"" msgstr "无效的语言环境名称 \"%s\"" -#: initdb.c:2252 +#: initdb.c:2143 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "无效的本地化设置; 请检查环境变量LANG和LC_*的值" -#: initdb.c:2279 +#: initdb.c:2170 #, c-format msgid "encoding mismatch" msgstr "编码不匹配" -#: initdb.c:2281 +#: initdb.c:2172 #, c-format msgid "" "The encoding you selected (%s) and the encoding that the\n" @@ -453,7 +456,7 @@ msgstr "" "组合类型.\n" "\n" -#: initdb.c:2353 +#: initdb.c:2244 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -462,17 +465,17 @@ msgstr "" "%s 初始化一个 PostgreSQL 数据库簇.\n" "\n" -#: initdb.c:2354 +#: initdb.c:2245 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: initdb.c:2355 +#: initdb.c:2246 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [选项]... [DATADIR]\n" -#: initdb.c:2356 +#: initdb.c:2247 #, c-format msgid "" "\n" @@ -481,42 +484,47 @@ msgstr "" "\n" "选项:\n" -#: initdb.c:2357 +#: initdb.c:2248 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, --auth=METHOD 本地连接的默认认证方法\n" -#: initdb.c:2358 +#: initdb.c:2249 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr " --auth-host=METHOD 本地的TCP/IP连接的默认认证方法\n" -#: initdb.c:2359 +#: initdb.c:2250 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr " --auth-local=METHOD 本地socket连接的默认认证方法\n" -#: initdb.c:2360 +#: initdb.c:2251 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " -D, --pgdata=DATADIR 当前数据库簇的位置\n" -#: initdb.c:2361 +#: initdb.c:2252 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=ENCODING 为新数据库设置默认编码\n" -#: initdb.c:2362 +#: initdb.c:2253 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr " -g, --allow-group-access 允许组对数据目录进行读/执行\n" -#: initdb.c:2363 +#: initdb.c:2254 +#, c-format +msgid " -k, --data-checksums use data page checksums\n" +msgstr " -k, --data-checksums 使用数据页产生效验和\n" + +#: initdb.c:2255 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOCALE 为新数据库设置默认语言环境\n" -#: initdb.c:2364 +#: initdb.c:2256 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -529,17 +537,17 @@ msgstr "" " 为新的数据库簇在各自的目录中分别\n" " 设定缺省语言环境(默认使用环境变量)\n" -#: initdb.c:2368 +#: initdb.c:2260 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale 等同于 --locale=C\n" -#: initdb.c:2369 +#: initdb.c:2261 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr " --pwfile=FILE 对于新的超级用户从文件读取口令\n" -#: initdb.c:2370 +#: initdb.c:2262 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -548,27 +556,27 @@ msgstr "" " -T, --text-search-config=CFG\n" " 缺省的文本搜索配置\n" -#: initdb.c:2372 +#: initdb.c:2264 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NAME 数据库超级用户名\n" -#: initdb.c:2373 +#: initdb.c:2265 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt 对于新的超级用户提示输入口令\n" -#: initdb.c:2374 +#: initdb.c:2266 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR 预写日志目录的位置\n" -#: initdb.c:2375 +#: initdb.c:2267 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=SIZE WAL段的大小(兆字节)\n" -#: initdb.c:2376 +#: initdb.c:2268 #, c-format msgid "" "\n" @@ -577,42 +585,46 @@ msgstr "" "\n" "非普通使用选项:\n" -#: initdb.c:2377 +#: initdb.c:2269 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug 产生大量的除错信息\n" -#: initdb.c:2378 +#: initdb.c:2270 #, c-format -msgid " -k, --data-checksums use data page checksums\n" -msgstr " -k, --data-checksums 使用数据页产生效验和\n" +msgid " --discard-caches set debug_discard_caches=1\n" +msgstr " --discard-caches 设置debug_discard_caches=1\n" -#: initdb.c:2379 +#: initdb.c:2271 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRECTORY 输入文件的位置\n" -#: initdb.c:2380 +#: initdb.c:2272 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean 出错后不清理\n" -#: initdb.c:2381 +#: initdb.c:2273 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync 不用等待变化安全写入磁盘\n" -#: initdb.c:2382 +#: initdb.c:2274 +msgid " --no-instructions do not print instructions for next steps\n" +msgstr " --no-instructions 不要打印后续步骤的说明\n" + +#: initdb.c:2275 #, c-format msgid " -s, --show show internal settings\n" msgstr " -s, --show 显示内部设置\n" -#: initdb.c:2383 +#: initdb.c:2276 #, c-format msgid " -S, --sync-only only sync data directory\n" msgstr " -S, --sync-only 只同步数据目录\n" -#: initdb.c:2384 +#: initdb.c:2277 #, c-format msgid "" "\n" @@ -621,17 +633,17 @@ msgstr "" "\n" "其它选项:\n" -#: initdb.c:2385 +#: initdb.c:2278 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 输出版本信息, 然后退出\n" -#: initdb.c:2386 +#: initdb.c:2279 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 显示此帮助, 然后退出\n" -#: initdb.c:2387 +#: initdb.c:2280 #, c-format msgid "" "\n" @@ -641,31 +653,35 @@ msgstr "" "\n" "如果没有指定数据目录, 将使用环境变量 PGDATA\n" -#: initdb.c:2389 +#: initdb.c:2282 #, c-format msgid "" "\n" -"Report bugs to .\n" +"Report bugs to <%s>.\n" msgstr "" "\n" -"报告错误至 <.\n" +"臭虫报告至<%s>.\n" + +#: initdb.c:2283 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 主页: <%s>\n" -#: initdb.c:2417 +#: initdb.c:2311 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "无效认证方法 \"%s\" 用于 \"%s\" 连接" -#: initdb.c:2433 -#, c-format -msgid "must specify a password for the superuser to enable %s authentication" -msgstr "为了启动 %s 认证, 你需要为超级用户指定一个口令" +#: initdb.c:2327 +msgid "must specify a password for the superuser to enable password authentication" +msgstr "为了启动密码认证, 你需要为超级用户指定一个口令" -#: initdb.c:2460 +#: initdb.c:2348 #, c-format msgid "no data directory specified" msgstr "没有指定数据目录" -#: initdb.c:2462 +#: initdb.c:2350 #, c-format msgid "" "You must identify the directory where the data for this database system\n" @@ -676,37 +692,43 @@ msgstr "" "存在. 使用 -D 选项或者\n" "环境变量 PGDATA.\n" -#: initdb.c:2497 +#: initdb.c:2368 +msgid "could not set environment" +msgstr "无法设置环境" + +#: initdb.c:2388 #, c-format msgid "" -"The program \"postgres\" is needed by %s but was not found in the\n" +"The program \"%s\" is needed by %s but was not found in the\n" "same directory as \"%s\".\n" "Check your installation." msgstr "" -"%s 需要程序 \"postgres\", 但是在同一个目录 \"%s\" 中没找到.\n" -"检查您的安装" +"%2$s需要程序\"%1$s\"\n" +"但在与\"%3$s\"相同的目录中找不到该程序.\n" +"检查您的安装." -#: initdb.c:2502 +#: initdb.c:2393 #, c-format msgid "" -"The program \"postgres\" was found by \"%s\"\n" +"The program \"%s\" was found by \"%s\"\n" "but was not the same version as %s.\n" "Check your installation." msgstr "" -"%s 找到程序 \"postgres\", 但是和版本 \"%s\" 不一致.\n" +"程序\"%s\"是由\"%s\"找到的\n" +"但与%s的版本不同.\n" "检查您的安装." -#: initdb.c:2521 +#: initdb.c:2412 #, c-format msgid "input file location must be an absolute path" msgstr "输入文件位置必须为绝对路径" -#: initdb.c:2538 +#: initdb.c:2429 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "数据库簇将使用本地化语言 \"%s\"进行初始化.\n" -#: initdb.c:2541 +#: initdb.c:2432 #, c-format msgid "" "The database cluster will be initialized with locales\n" @@ -725,22 +747,22 @@ msgstr "" " NUMERIC: %s\n" " TIME: %s\n" -#: initdb.c:2565 +#: initdb.c:2456 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "无法为locale(本地化语言)\"%s\"找到合适的编码" -#: initdb.c:2567 +#: initdb.c:2458 #, c-format msgid "Rerun %s with the -E option.\n" msgstr "带 -E 选项重新运行 %s.\n" -#: initdb.c:2568 initdb.c:3196 initdb.c:3217 +#: initdb.c:2459 initdb.c:3099 initdb.c:3120 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "请用 \"%s --help\" 获取更多的信息.\n" -#: initdb.c:2581 +#: initdb.c:2472 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -749,12 +771,12 @@ msgstr "" "本地化隐含的编码 \"%s\" 不允许作为服务器端的编码.\n" "默认的数据库编码将采用 \"%s\" 作为代替.\n" -#: initdb.c:2586 +#: initdb.c:2477 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "本地化语言环境 \"%s\"要求使用不支持的编码\"%s\"" -#: initdb.c:2589 +#: initdb.c:2480 #, c-format msgid "" "Encoding \"%s\" is not allowed as a server-side encoding.\n" @@ -763,57 +785,54 @@ msgstr "" "不允许将编码\"%s\"作为服务器端编码.\n" "使用一个不同的本地化语言环境重新运行%s.\n" -#: initdb.c:2598 +#: initdb.c:2489 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "默认的数据库编码已经相应的设置为 \"%s\".\n" -#: initdb.c:2666 -#, c-format -msgid "%s: could not find suitable text search configuration for locale \"%s\"\n" -msgstr "%s: 无法为本地化语言环境\"%s\"找到合适的文本搜索配置\n" +#: initdb.c:2555 +msgid "could not find suitable text search configuration for locale \"%s\"" +msgstr "无法为本地化语言环境\"%s\"找到合适的文本搜索配置" -#: initdb.c:2677 -#, c-format -msgid "%s: warning: suitable text search configuration for locale \"%s\" is unknown\n" -msgstr "%s: 警告: 对于本地化语言环境\"%s\"合适的文本搜索配置未知\n" +#: initdb.c:2566 +msgid "suitable text search configuration for locale \"%s\" is unknown" +msgstr "对于本地化语言环境\"%s\"合适的文本搜索配置未知" -#: initdb.c:2682 -#, c-format -msgid "%s: warning: specified text search configuration \"%s\" might not match locale \"%s\"\n" -msgstr "%s: 警告: 所指定的文本搜索配置\"%s\"可能与本地语言环境\"%s\"不匹配\n" +#: initdb.c:2571 +msgid "specified text search configuration \"%s\" might not match locale \"%s\"" +msgstr "所指定的文本搜索配置\"%s\"可能与本地语言环境\"%s\"不匹配" -#: initdb.c:2687 +#: initdb.c:2576 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "缺省的文本搜索配置将会被设置到\"%s\"\n" -#: initdb.c:2731 initdb.c:2813 +#: initdb.c:2620 initdb.c:2702 #, c-format msgid "creating directory %s ... " msgstr "创建目录 %s ... " -#: initdb.c:2737 initdb.c:2819 initdb.c:2884 initdb.c:2946 +#: initdb.c:2626 initdb.c:2708 initdb.c:2773 initdb.c:2835 #, c-format msgid "could not create directory \"%s\": %m" msgstr "无法创建目录 \"%s\": %m" -#: initdb.c:2748 initdb.c:2831 +#: initdb.c:2637 initdb.c:2720 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "修复已存在目录 %s 的权限 ... " -#: initdb.c:2754 initdb.c:2837 +#: initdb.c:2643 initdb.c:2726 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "无法改变目录 \"%s\" 的权限: %m" -#: initdb.c:2768 initdb.c:2851 +#: initdb.c:2657 initdb.c:2740 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "目录\"%s\"已存在,但不是空的" -#: initdb.c:2773 +#: initdb.c:2662 #, c-format msgid "" "If you want to create a new database system, either remove or empty\n" @@ -824,44 +843,44 @@ msgstr "" "目录 \"%s\" 或者运行带参数的 %s\n" "而不是 \"%s\".\n" -#: initdb.c:2781 initdb.c:2863 initdb.c:3232 +#: initdb.c:2670 initdb.c:2752 initdb.c:3135 #, c-format msgid "could not access directory \"%s\": %m" msgstr "无法访问目录 \"%s\": %m" -#: initdb.c:2804 +#: initdb.c:2693 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL目录的位置必须为绝对路径" -#: initdb.c:2856 +#: initdb.c:2745 #, c-format msgid "" "If you want to store the WAL there, either remove or empty the directory\n" "\"%s\".\n" msgstr "如果您要存储WAL日志,需要删除或者清空目录\"%s\".\n" -#: initdb.c:2870 +#: initdb.c:2759 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "无法创建符号链接 \"%s\": %m" -#: initdb.c:2875 +#: initdb.c:2764 #, c-format msgid "symlinks are not supported on this platform" -msgstr "在这个平台上不支持使用符号链接" +msgstr "在这个平台上不支持符号链接" -#: initdb.c:2899 +#: initdb.c:2788 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n" msgstr "它包含一个不可见的带固定点的文件,可能因为它是一个装载点。\n" -#: initdb.c:2902 +#: initdb.c:2791 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point.\n" msgstr "它包含名为lost+found的目录,可能因为它是一个加载点.\n" -#: initdb.c:2905 +#: initdb.c:2794 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -870,55 +889,55 @@ msgstr "" "不推荐将加载点作为数据目录.\n" "通常在加载点下边创建一个子目录.\n" -#: initdb.c:2931 +#: initdb.c:2820 #, c-format msgid "creating subdirectories ... " msgstr "正在创建子目录 ... " -#: initdb.c:2977 +#: initdb.c:2866 msgid "performing post-bootstrap initialization ... " msgstr "正在执行自举后初始化 ..." -#: initdb.c:3134 +#: initdb.c:3029 #, c-format msgid "Running in debug mode.\n" msgstr "运行在除错模式中. \n" -#: initdb.c:3138 +#: initdb.c:3033 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "运行在 no-clean 模式中. 错误将不被清理.\n" -#: initdb.c:3215 +#: initdb.c:3118 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "命令行参数太多 (第一个是 \"%s\")" -#: initdb.c:3236 initdb.c:3325 +#: initdb.c:3139 initdb.c:3228 msgid "syncing data to disk ... " msgstr "同步数据到磁盘..." -#: initdb.c:3245 +#: initdb.c:3148 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "口令提示和口令文件不能同时都指定" -#: initdb.c:3270 +#: initdb.c:3173 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "--wal-segsize的参数必须是一个数字" -#: initdb.c:3275 +#: initdb.c:3178 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "--wal-segsize参数必须是2的幂次方(在2到1024之间)" +msgstr "--wal-segsize的参数必须是2的幂次方(在1和1024之间)" -#: initdb.c:3292 +#: initdb.c:3195 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "超级用户名\"%s\"是不允许的;角色名称不能以\"pg_\"开始" -#: initdb.c:3296 +#: initdb.c:3199 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -928,17 +947,17 @@ msgstr "" "属于此数据库系统的文件宿主为用户 \"%s\".\n" "此用户也必须为服务器进程的宿主.\n" -#: initdb.c:3312 +#: initdb.c:3215 #, c-format msgid "Data page checksums are enabled.\n" msgstr "允许生成数据页校验和.\n" -#: initdb.c:3314 +#: initdb.c:3217 #, c-format msgid "Data page checksums are disabled.\n" msgstr "禁止为数据页生成校验和.\n" -#: initdb.c:3331 +#: initdb.c:3234 #, c-format msgid "" "\n" @@ -949,12 +968,12 @@ msgstr "" "跳过同步到磁盘操作.\n" "如果操作系统宕机,数据目录可能会毁坏.\n" -#: initdb.c:3336 +#: initdb.c:3239 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "为本地连接启用\"trust\"身份验证" -#: initdb.c:3337 +#: initdb.c:3240 #, c-format msgid "" "You can change this by editing pg_hba.conf or using the option -A, or\n" @@ -964,11 +983,11 @@ msgstr "" "执行 initdb 时使用 -A或者--auth-local和--auth-host选项.\n" #. translator: This is a placeholder in a shell command. -#: initdb.c:3362 +#: initdb.c:3270 msgid "logfile" msgstr "日志文件" -#: initdb.c:3364 +#: initdb.c:3272 #, c-format msgid "" "\n" @@ -982,3 +1001,4 @@ msgstr "" "\n" " %s\n" "\n" + diff --git a/src/bin/pg_amcheck/nls.mk b/src/bin/pg_amcheck/nls.mk index f73d2d377e..0813fe1cec 100644 --- a/src/bin/pg_amcheck/nls.mk +++ b/src/bin/pg_amcheck/nls.mk @@ -1,6 +1,6 @@ # src/bin/pg_amcheck/nls.mk CATALOG_NAME = pg_amcheck -AVAIL_LANGUAGES = de el es fr zh_CN +AVAIL_LANGUAGES = de el es fr ja ru sv uk zh_CN GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ pg_amcheck.c \ ../../fe_utils/cancel.c \ diff --git a/src/bin/pg_amcheck/po/de.po b/src/bin/pg_amcheck/po/de.po index ce036e3645..cf5b3b93db 100644 --- a/src/bin/pg_amcheck/po/de.po +++ b/src/bin/pg_amcheck/po/de.po @@ -1,13 +1,13 @@ # German message translation file for pg_amcheck -# Copyright (C) 2021 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_amcheck (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: pg_amcheck (PostgreSQL) 14\n" +"Project-Id-Version: pg_amcheck (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-14 01:48+0000\n" -"PO-Revision-Date: 2021-05-14 10:03+0200\n" +"POT-Creation-Date: 2022-05-11 15:50+0000\n" +"PO-Revision-Date: 2022-05-11 22:10+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -15,179 +15,241 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "Fatal: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "Warnung: " -#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "Tipp: " + +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 msgid "Cancel request sent\n" msgstr "Abbruchsanforderung gesendet\n" -#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 msgid "Could not send cancel request: " msgstr "Konnte Abbruchsanforderung nicht senden: " -#: ../../fe_utils/connect_utils.c:92 +#: ../../fe_utils/connect_utils.c:91 #, c-format msgid "could not connect to database %s: out of memory" msgstr "konnte nicht mit Datenbank %s verbinden: Speicher aufgebraucht" -#: ../../fe_utils/connect_utils.c:120 +#: ../../fe_utils/connect_utils.c:117 #, c-format msgid "%s" msgstr "%s" +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ungültiger Wert »%s« für Option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s muss im Bereich %d..%d sein" + #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 -#: pg_amcheck.c:1645 pg_amcheck.c:2084 +#: pg_amcheck.c:1645 pg_amcheck.c:2090 #, c-format msgid "query failed: %s" msgstr "Anfrage fehlgeschlagen: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 -#: pg_amcheck.c:597 pg_amcheck.c:1116 pg_amcheck.c:1646 pg_amcheck.c:2085 +#: pg_amcheck.c:571 pg_amcheck.c:1100 pg_amcheck.c:1646 pg_amcheck.c:2091 #, c-format -msgid "query was: %s" +msgid "Query was: %s" msgstr "Anfrage war: %s" -#: pg_amcheck.c:332 -#, c-format -msgid "number of parallel jobs must be at least 1" -msgstr "Anzahl paralleler Jobs muss mindestens 1 sein" - -#: pg_amcheck.c:405 +#: pg_amcheck.c:399 #, c-format msgid "invalid argument for option %s" msgstr "ungültiges Argument für Option %s" -#: pg_amcheck.c:413 +#: pg_amcheck.c:405 #, c-format msgid "invalid start block" msgstr "ungültiger Startblock" -#: pg_amcheck.c:418 +#: pg_amcheck.c:407 #, c-format msgid "start block out of bounds" msgstr "Startblock außerhalb des gültigen Bereichs" -#: pg_amcheck.c:426 +#: pg_amcheck.c:414 #, c-format msgid "invalid end block" msgstr "ungültiger Endblock" -#: pg_amcheck.c:431 +#: pg_amcheck.c:416 #, c-format msgid "end block out of bounds" msgstr "Endblock außerhalb des gültigen Bereichs" -#: pg_amcheck.c:455 pg_amcheck.c:481 +#: pg_amcheck.c:439 pg_amcheck.c:461 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_amcheck.c:463 +#: pg_amcheck.c:445 #, c-format msgid "end block precedes start block" msgstr "Endblock kommt vor dem Startblock" -#: pg_amcheck.c:479 +#: pg_amcheck.c:459 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_amcheck.c:500 +#: pg_amcheck.c:479 #, c-format msgid "cannot specify a database name with --all" msgstr "ein Datenbankname kann nicht mit --all angegeben werden" -#: pg_amcheck.c:509 +#: pg_amcheck.c:485 #, c-format msgid "cannot specify both a database name and database patterns" msgstr "Datenbankname und Datenbankmuster können nicht zusammen angegeben werden" -#: pg_amcheck.c:539 +#: pg_amcheck.c:513 #, c-format msgid "no databases to check" msgstr "keine zu prüfenden Datenbanken" -#: pg_amcheck.c:595 +#: pg_amcheck.c:569 #, c-format msgid "database \"%s\": %s" msgstr "Datenbank »%s«: %s" -#: pg_amcheck.c:606 +#: pg_amcheck.c:580 #, c-format msgid "skipping database \"%s\": amcheck is not installed" msgstr "Datenbank »%s« übersprungen: amcheck nicht installiert" -#: pg_amcheck.c:614 +#: pg_amcheck.c:588 #, c-format msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" msgstr "in Datenbank »%s«: verwende amcheck Version »%s« in Schema »%s«" -#: pg_amcheck.c:676 +#: pg_amcheck.c:610 +#, c-format +msgid "no heap tables to check matching \"%s\"" +msgstr "keine zu prüfenden Tabellen, die mit »%s« übereinstimmen" + +#: pg_amcheck.c:613 +#, c-format +msgid "no btree indexes to check matching \"%s\"" +msgstr "keine zu prüfenden B-Tree-Indexe, die mit »%s« übereinstimmen" + +#: pg_amcheck.c:616 +#, c-format +msgid "no relations to check in schemas matching \"%s\"" +msgstr "keine zu prüfenden Relationen in Schemas, die mit »%s« übereinstimmen" + +#: pg_amcheck.c:619 +#, c-format +msgid "no relations to check matching \"%s\"" +msgstr "keine zu prüfenden Relationen, die mit »%s« übereinstimmen" + +#: pg_amcheck.c:647 #, c-format msgid "no relations to check" msgstr "keine zu prüfenden Relationen" -#: pg_amcheck.c:762 +#: pg_amcheck.c:730 #, c-format -msgid "checking heap table \"%s\".\"%s\".\"%s\"" -msgstr "prüfe Heap-Tabelle \"%s\".\"%s\".\"%s\"" +msgid "checking heap table \"%s.%s.%s\"" +msgstr "prüfe Heap-Tabelle »%s.%s.%s«" -#: pg_amcheck.c:778 +#: pg_amcheck.c:746 #, c-format -msgid "checking btree index \"%s\".\"%s\".\"%s\"" -msgstr "prüfe B-Tree-Index \"%s\".\"%s\".\"%s\"" +msgid "checking btree index \"%s.%s.%s\"" +msgstr "prüfe B-Tree-Index »%s.%s.%s«" -#: pg_amcheck.c:911 +#: pg_amcheck.c:893 #, c-format msgid "error sending command to database \"%s\": %s" msgstr "Fehler beim Senden von Befehl an Datenbank »%s«: %s" -#: pg_amcheck.c:914 +#: pg_amcheck.c:896 #, c-format -msgid "command was: %s" -msgstr "Befehl war: %s" +msgid "Command was: %s" +msgstr "Die Anweisung war: %s" -#: pg_amcheck.c:1113 +#: pg_amcheck.c:1013 #, c-format -msgid "btree index \"%s\".\"%s\".\"%s\": btree checking function returned unexpected number of rows: %d" -msgstr "" +msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" +msgstr "Heap-Tabelle »%s.%s.%s«, Block %s, Offset %s, Attribut %s:\n" + +#: pg_amcheck.c:1020 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" +msgstr "Heap-Tabelle »%s.%s.%s«, Block %s, Offset %s:\n" + +#: pg_amcheck.c:1026 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s:\n" +msgstr "Heap-Tabelle »%s.%s.%s«, Block %s:\n" + +#: pg_amcheck.c:1031 pg_amcheck.c:1042 +#, c-format +msgid "heap table \"%s.%s.%s\":\n" +msgstr "Heap-Tabelle »%s.%s.%s«:\n" -#: pg_amcheck.c:1117 +#: pg_amcheck.c:1046 pg_amcheck.c:1115 +#, c-format +msgid "query was: %s\n" +msgstr "Anfrage war: %s\n" + +#: pg_amcheck.c:1097 +#, c-format +msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" +msgstr "B-Tree-Index »%s.%s.%s«: B-Tree-Prüffunktion gab unerwartete Anzahl Zeilen zurück: %d" + +#: pg_amcheck.c:1101 #, c-format msgid "Are %s's and amcheck's versions compatible?" msgstr "Sind die Versionen von %s und amcheck kompatibel?" -#: pg_amcheck.c:1151 +#: pg_amcheck.c:1111 +#, c-format +msgid "btree index \"%s.%s.%s\":\n" +msgstr "B-Tree-Index »%s.%s.%s«:\n" + +#: pg_amcheck.c:1136 #, c-format msgid "" "%s checks objects in a PostgreSQL database for corruption.\n" "\n" -msgstr "%s prüft Objekte in einer PostgreSQL-Datenbank auf Beschädigung.\n\n" +msgstr "" +"%s prüft Objekte in einer PostgreSQL-Datenbank auf Beschädigung.\n" +"\n" -#: pg_amcheck.c:1152 +#: pg_amcheck.c:1137 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_amcheck.c:1153 +#: pg_amcheck.c:1138 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: pg_amcheck.c:1154 +#: pg_amcheck.c:1139 #, c-format msgid "" "\n" @@ -196,77 +258,77 @@ msgstr "" "\n" "Zieloptionen:\n" -#: pg_amcheck.c:1155 +#: pg_amcheck.c:1140 #, c-format msgid " -a, --all check all databases\n" msgstr " -a, --all alle Datenbanken prüfen\n" -#: pg_amcheck.c:1156 +#: pg_amcheck.c:1141 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" msgstr " -d, --database=MUSTER übereinstimmende Datenbanken prüfen\n" -#: pg_amcheck.c:1157 +#: pg_amcheck.c:1142 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" msgstr " -D, --exclude-database=MUSTER übereinstimmende Datenbanken NICHT prüfen\n" -#: pg_amcheck.c:1158 +#: pg_amcheck.c:1143 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" msgstr " -i, --index=MUSTER übereinstimmende Indexe prüfen\n" -#: pg_amcheck.c:1159 +#: pg_amcheck.c:1144 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" msgstr " -I, --exclude-index=MUSTER übereinstimmende Indexe NICHT prüfen\n" -#: pg_amcheck.c:1160 +#: pg_amcheck.c:1145 #, c-format msgid " -r, --relation=PATTERN check matching relation(s)\n" msgstr " -r, --relation=MUSTER übereinstimmende Relationen prüfen\n" -#: pg_amcheck.c:1161 +#: pg_amcheck.c:1146 #, c-format msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" msgstr " -R, --exclude-relation=MUSTER übereinstimmende Relationen NICHT prüfen\n" -#: pg_amcheck.c:1162 +#: pg_amcheck.c:1147 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" msgstr " -s, --schema=MUSTER übereinstimmende Schemas prüfen\n" -#: pg_amcheck.c:1163 +#: pg_amcheck.c:1148 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" msgstr " -S, --exclude-schema=MUSTER übereinstimmende Schemas NICHT prüfen\n" -#: pg_amcheck.c:1164 +#: pg_amcheck.c:1149 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" msgstr " -t, --table=MUSTER übereinstimmende Tabellen prüfen\n" -#: pg_amcheck.c:1165 +#: pg_amcheck.c:1150 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" msgstr " -T, --exclude-table=MUSTER übereinstimmende Tabellen NICHT prüfen\n" -#: pg_amcheck.c:1166 +#: pg_amcheck.c:1151 #, c-format msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" msgstr " --no-dependent-indexes Liste der Relationen NICHT um Indexe erweitern\n" -#: pg_amcheck.c:1167 +#: pg_amcheck.c:1152 #, c-format msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" msgstr " --no-dependent-toast Liste der Relationen NICHT um TOAST-Tabellen erweitern\n" -#: pg_amcheck.c:1168 +#: pg_amcheck.c:1153 #, c-format msgid " --no-strict-names do NOT require patterns to match objects\n" msgstr " --no-strict-names Muster müssen NICHT mit Objekten übereinstimmen\n" -#: pg_amcheck.c:1169 +#: pg_amcheck.c:1154 #, c-format msgid "" "\n" @@ -275,32 +337,32 @@ msgstr "" "\n" "Optionen für Tabellen:\n" -#: pg_amcheck.c:1170 +#: pg_amcheck.c:1155 #, c-format msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" msgstr " --exclude-toast-pointers TOAST-Zeigern NICHT folgen\n" -#: pg_amcheck.c:1171 +#: pg_amcheck.c:1156 #, c-format msgid " --on-error-stop stop checking at end of first corrupt page\n" msgstr " --on-error-stop Prüfung nach der ersten beschädigten Seite beenden\n" -#: pg_amcheck.c:1172 +#: pg_amcheck.c:1157 #, c-format msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" msgstr " --skip=OPTION Blöcke mit »all-frozen« oder »all-visible« NICHT prüfen\n" -#: pg_amcheck.c:1173 +#: pg_amcheck.c:1158 #, c-format msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" -msgstr "" +msgstr " --startblock=BLOCK Prüfen der Tabelle(n) bei angegebener Blocknummer beginnen\n" -#: pg_amcheck.c:1174 +#: pg_amcheck.c:1159 #, c-format msgid " --endblock=BLOCK check table(s) only up to the given block number\n" -msgstr "" +msgstr " --endblock=BLOCK Tabelle(n) nur bis zur angegebenen Blocknummer prüfen\n" -#: pg_amcheck.c:1175 +#: pg_amcheck.c:1160 #, c-format msgid "" "\n" @@ -309,22 +371,22 @@ msgstr "" "\n" "Optionen für B-Tree-Indexe:\n" -#: pg_amcheck.c:1176 +#: pg_amcheck.c:1161 #, c-format -msgid " --heapallindexed check all heap tuples are found within indexes\n" -msgstr "" +msgid " --heapallindexed check that all heap tuples are found within indexes\n" +msgstr " --heapallindexed prüfen, dass alle Heap-Tupel in Indexen zu finden sind\n" -#: pg_amcheck.c:1177 +#: pg_amcheck.c:1162 #, c-format msgid " --parent-check check index parent/child relationships\n" -msgstr "" +msgstr " --parent-check Index-Eltern/Kind-Beziehungen prüfen\n" -#: pg_amcheck.c:1178 +#: pg_amcheck.c:1163 #, c-format msgid " --rootdescend search from root page to refind tuples\n" -msgstr "" +msgstr " --rootdescend Tupel erneut von der Wurzelseite aus suchen\n" -#: pg_amcheck.c:1179 +#: pg_amcheck.c:1164 #, c-format msgid "" "\n" @@ -333,37 +395,37 @@ msgstr "" "\n" "Verbindungsoptionen:\n" -#: pg_amcheck.c:1180 +#: pg_amcheck.c:1165 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: pg_amcheck.c:1181 +#: pg_amcheck.c:1166 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT Port des Datenbankservers\n" -#: pg_amcheck.c:1182 +#: pg_amcheck.c:1167 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: pg_amcheck.c:1183 +#: pg_amcheck.c:1168 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: pg_amcheck.c:1184 +#: pg_amcheck.c:1169 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password Passwortfrage erzwingen\n" -#: pg_amcheck.c:1185 +#: pg_amcheck.c:1170 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n" -#: pg_amcheck.c:1186 +#: pg_amcheck.c:1171 #, c-format msgid "" "\n" @@ -372,51 +434,46 @@ msgstr "" "\n" "Weitere Optionen:\n" -#: pg_amcheck.c:1187 +#: pg_amcheck.c:1172 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr "" " -e, --echo zeige die Befehle, die an den Server\n" " gesendet werden\n" -#: pg_amcheck.c:1188 +#: pg_amcheck.c:1173 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" msgstr "" " -j, --jobs=NUM so viele parallele Verbindungen zum Server\n" " verwenden\n" -#: pg_amcheck.c:1189 +#: pg_amcheck.c:1174 #, c-format -msgid " -q, --quiet don't write any messages\n" -msgstr " -q, --quiet unterdrücke alle Mitteilungen\n" +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress Fortschrittsinformationen zeigen\n" -#: pg_amcheck.c:1190 +#: pg_amcheck.c:1175 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: pg_amcheck.c:1191 +#: pg_amcheck.c:1176 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_amcheck.c:1192 +#: pg_amcheck.c:1177 #, c-format -msgid " -P, --progress show progress information\n" -msgstr " -P, --progress Fortschrittsinformationen zeigen\n" +msgid " --install-missing install missing extensions\n" +msgstr " --install-missing fehlende Erweiterungen installieren\n" -#: pg_amcheck.c:1193 +#: pg_amcheck.c:1178 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_amcheck.c:1194 -#, c-format -msgid " --install-missing install missing extensions\n" -msgstr " --install-missing fehlende Erweiterungen installieren\n" - -#: pg_amcheck.c:1196 +#: pg_amcheck.c:1180 #, c-format msgid "" "\n" @@ -425,37 +482,52 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_amcheck.c:1197 +#: pg_amcheck.c:1181 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_amcheck.c:1255 +#: pg_amcheck.c:1234 #, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%) %*s" -msgstr "" +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" +msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%) %*s" -#: pg_amcheck.c:1266 +#: pg_amcheck.c:1245 #, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%), (%s%-*.*s)" -msgstr "" +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" +msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%) (%s%-*.*s)" -#: pg_amcheck.c:1281 +#: pg_amcheck.c:1260 #, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%)" -msgstr "" +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" +msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%)" -#: pg_amcheck.c:1550 pg_amcheck.c:1692 +#: pg_amcheck.c:1319 pg_amcheck.c:1352 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "falscher qualifizierter Name (zu viele Namensteile): %s" + +#: pg_amcheck.c:1397 +#, c-format +msgid "improper relation name (too many dotted names): %s" +msgstr "falscher Relationsname (zu viele Namensteile): %s" + +#: pg_amcheck.c:1550 pg_amcheck.c:1689 #, c-format msgid "including database \"%s\"" msgstr "Datenbank »%s« einbezogen" -#: pg_amcheck.c:1672 +#: pg_amcheck.c:1671 #, c-format msgid "internal error: received unexpected database pattern_id %d" -msgstr "" +msgstr "interner Fehler: unerwartete pattern_id %d für Datenbank empfangen" -#: pg_amcheck.c:2126 +#: pg_amcheck.c:1673 +#, c-format +msgid "no connectable databases to check matching \"%s\"" +msgstr "keine Datenbanken, mit denen verbunden werden kann und die mit »%s« übereinstimmen" + +#: pg_amcheck.c:2131 #, c-format msgid "internal error: received unexpected relation pattern_id %d" -msgstr "" +msgstr "interner Fehler: unerwartete pattern_id %d für Relation empfangen" diff --git a/src/bin/pg_amcheck/po/el.po b/src/bin/pg_amcheck/po/el.po index 0df10aaa5c..e9b4fca560 100644 --- a/src/bin/pg_amcheck/po/el.po +++ b/src/bin/pg_amcheck/po/el.po @@ -3,19 +3,21 @@ # This file is distributed under the same license as the pg_amcheck (PostgreSQL) package. # Georgios Kokolatos , 2021. # +# +# msgid "" msgstr "" "Project-Id-Version: pg_amcheck (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-17 03:48+0000\n" -"PO-Revision-Date: 2021-05-24 10:34+0200\n" +"POT-Creation-Date: 2021-11-08 10:17+0000\n" +"PO-Revision-Date: 2021-11-08 11:49+0100\n" +"Last-Translator: Georgios Kokolatos \n" +"Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Last-Translator: Georgios Kokolatos \n" -"Language-Team: \n" -"X-Generator: Poedit 2.4.3\n" +"X-Generator: Poedit 3.0\n" #: ../../../src/common/logging.c:259 #, c-format @@ -51,33 +53,33 @@ msgid "%s" msgstr "%s" #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 -#: pg_amcheck.c:1645 pg_amcheck.c:2084 +#: pg_amcheck.c:1657 pg_amcheck.c:2105 #, c-format msgid "query failed: %s" msgstr "το ερώτημα απέτυχε: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 -#: pg_amcheck.c:597 pg_amcheck.c:1116 pg_amcheck.c:1646 pg_amcheck.c:2085 +#: pg_amcheck.c:598 pg_amcheck.c:1128 pg_amcheck.c:1658 pg_amcheck.c:2106 #, c-format msgid "query was: %s" msgstr "το ερώτημα ήταν: %s" -#: pg_amcheck.c:332 +#: pg_amcheck.c:330 #, c-format msgid "number of parallel jobs must be at least 1" msgstr "ο αριθμός παράλληλων εργασιών πρέπει να είναι τουλάχιστον 1" -#: pg_amcheck.c:405 +#: pg_amcheck.c:402 #, c-format msgid "invalid argument for option %s" msgstr "μη έγκυρη παράμετρος για την επιλογή %s" -#: pg_amcheck.c:413 +#: pg_amcheck.c:411 #, c-format msgid "invalid start block" msgstr "μη έγκυρο μπλοκ εκκίνησης" -#: pg_amcheck.c:418 +#: pg_amcheck.c:416 #, c-format msgid "start block out of bounds" msgstr "μπλοκ εκκίνησης εκτός ορίων" @@ -92,87 +94,137 @@ msgstr "μη έγκυρο μπλοκ τερματισμού" msgid "end block out of bounds" msgstr "μπλοκ τερματισμού εκτός ορίων" -#: pg_amcheck.c:455 pg_amcheck.c:481 +#: pg_amcheck.c:456 pg_amcheck.c:482 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Δοκιμάστε “%s —help” για περισσότερες πληροφορίες.\n" +msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n" -#: pg_amcheck.c:463 +#: pg_amcheck.c:464 #, c-format msgid "end block precedes start block" msgstr "μπλοκ τερματισμού προηγείται του μπλοκ εκκίνησης" -#: pg_amcheck.c:479 +#: pg_amcheck.c:480 #, c-format msgid "too many command-line arguments (first is \"%s\")" -msgstr "πάρα πολλοί παραμέτροι εισόδου από την γραμμή εντολών (ο πρώτη είναι η “%s”)" +msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)" -#: pg_amcheck.c:500 +#: pg_amcheck.c:501 #, c-format msgid "cannot specify a database name with --all" -msgstr "δεν είναι δυνατό να οριστεί ένα όνομα βάσης δεδομένων μαζί με —all" +msgstr "δεν είναι δυνατό να οριστεί ένα όνομα βάσης δεδομένων μαζί με --all" -#: pg_amcheck.c:509 +#: pg_amcheck.c:510 #, c-format msgid "cannot specify both a database name and database patterns" msgstr "δεν είναι δυνατός ο καθορισμός τόσο ενός ονόματος βάσης δεδομένων όσο και μοτίβων βάσης δεδομένων" -#: pg_amcheck.c:539 +#: pg_amcheck.c:540 #, c-format msgid "no databases to check" msgstr "καθόλου βάσεις δεδομένων για έλεγχο" -#: pg_amcheck.c:595 +#: pg_amcheck.c:596 #, c-format msgid "database \"%s\": %s" -msgstr "βάση δεδομένων “%s”: %s" +msgstr "βάση δεδομένων «%s»: %s" -#: pg_amcheck.c:606 +#: pg_amcheck.c:607 #, c-format msgid "skipping database \"%s\": amcheck is not installed" -msgstr "παρακάμπτει βάση δεδομένων “%s”: το amcheck δεν είναι εγκαταστημένο" +msgstr "παρακάμπτει βάση δεδομένων «%s»: το amcheck δεν είναι εγκαταστημένο" -#: pg_amcheck.c:614 +#: pg_amcheck.c:615 #, c-format msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" -msgstr "στη βάση δεδομένων \"%s\": χρησιμοποιώντας την έκδοση \"%s\" του amcheck στο σχήμα \"%s\"" +msgstr "στη βάση δεδομένων «%s»: χρησιμοποιώντας την έκδοση «%s» του amcheck στο σχήμα «%s»" + +#: pg_amcheck.c:637 +#, c-format +msgid "no heap tables to check matching \"%s\"" +msgstr "δεν υπάρχουν πίνακες heap για έλεγχο που ταιριάζουν με «%s»" + +#: pg_amcheck.c:640 +#, c-format +msgid "no btree indexes to check matching \"%s\"" +msgstr "δεν υπάρχουν ευρετήρια BTREE για έλεγχο που ταιριάζουν με «%s»" + +#: pg_amcheck.c:643 +#, c-format +msgid "no relations to check in schemas matching \"%s\"" +msgstr "καθόλου σχέσεις για έλεγχο σε σχήματα που ταιριάζουν με «%s»" + +#: pg_amcheck.c:646 +#, c-format +msgid "no relations to check matching \"%s\"" +msgstr "καθόλου σχέσεις για έλεγχο που ταιριάζουν με «%s»" -#: pg_amcheck.c:676 +#: pg_amcheck.c:674 #, c-format msgid "no relations to check" msgstr "καθόλου σχέσεις για έλεγχο" -#: pg_amcheck.c:762 +#: pg_amcheck.c:758 #, c-format -msgid "checking heap table \"%s\".\"%s\".\"%s\"" -msgstr "ελέγχει τον πίνακα heap “%s”.”%s”.”%s”" +msgid "checking heap table \"%s.%s.%s\"" +msgstr "ελέγχει τον πίνακα heap «%s.%s.%s»" -#: pg_amcheck.c:778 +#: pg_amcheck.c:774 #, c-format -msgid "checking btree index \"%s\".\"%s\".\"%s\"" -msgstr "ελέγχει το ευρετήριο btree “%s”.”%s”.”%s”" +msgid "checking btree index \"%s.%s.%s\"" +msgstr "ελέγχει το ευρετήριο btree «%s.%s.%s»" -#: pg_amcheck.c:911 +#: pg_amcheck.c:921 #, c-format msgid "error sending command to database \"%s\": %s" -msgstr "εντολή αποστολής σφάλματος στη βάση δεδομένων \"%s\": %s" +msgstr "εντολή αποστολής σφάλματος στη βάση δεδομένων «%s»: %s" -#: pg_amcheck.c:914 +#: pg_amcheck.c:924 #, c-format msgid "command was: %s" msgstr "η εντολή ήταν: %s" -#: pg_amcheck.c:1113 +#: pg_amcheck.c:1041 #, c-format -msgid "btree index \"%s\".\"%s\".\"%s\": btree checking function returned unexpected number of rows: %d" -msgstr "ευρετήριο btree \"%s\". %s\".\" %s\": η συνάρτηση ελέγχου btree επέστρεψε απροσδόκητο αριθμό γραμμών: %d" +msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" +msgstr "πίνακας heap «%s.%s.%s», μπλοκ %s, μετατόπιση %s, χαρακτηριστικό %s:\n" -#: pg_amcheck.c:1117 +#: pg_amcheck.c:1048 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" +msgstr "πίνακας heap «%s.%s.%s», μπλοκ %s, μετατόπιση %s:\n" + +#: pg_amcheck.c:1054 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s:\n" +msgstr "πίνακας heap «%s.%s.%s», μπλοκ %s:\n" + +#: pg_amcheck.c:1059 pg_amcheck.c:1070 +#, c-format +msgid "heap table \"%s.%s.%s\":\n" +msgstr "πίνακας heap «%s.%s.%s»:\n" + +#: pg_amcheck.c:1074 pg_amcheck.c:1143 +#, c-format +msgid "query was: %s\n" +msgstr "το ερώτημα ήταν: %s\n" + +#: pg_amcheck.c:1125 +#, c-format +msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" +msgstr "ευρετήριο btree «%s.%s.%s»: η συνάρτηση ελέγχου btree επέστρεψε απροσδόκητο αριθμό γραμμών: %d" + +#: pg_amcheck.c:1129 #, c-format msgid "Are %s's and amcheck's versions compatible?" msgstr "Είναι συμβατές οι εκδόσεις του %s και του amcheck;" -#: pg_amcheck.c:1151 +#: pg_amcheck.c:1139 +#, c-format +msgid "btree index \"%s.%s.%s\":\n" +msgstr "ευρετήριο btree «%s.%s.%s»:\n" + +#: pg_amcheck.c:1164 #, c-format msgid "" "%s checks objects in a PostgreSQL database for corruption.\n" @@ -181,17 +233,17 @@ msgstr "" "%s ελέγχει αντικείμενα σε μια βάση δεδομένων PostgreSQL για αλλοίωση.\n" "\n" -#: pg_amcheck.c:1152 +#: pg_amcheck.c:1165 #, c-format msgid "Usage:\n" msgstr "Χρήση:\n" -#: pg_amcheck.c:1153 +#: pg_amcheck.c:1166 #, c-format msgid " %s [OPTION]... [DBNAME]\n" -msgstr " %s [OPTION]… [DBNAME]\n" +msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n" -#: pg_amcheck.c:1154 +#: pg_amcheck.c:1167 #, c-format msgid "" "\n" @@ -200,79 +252,77 @@ msgstr "" "\n" "Επιλογές στόχου:\n" -#: pg_amcheck.c:1155 +#: pg_amcheck.c:1168 #, c-format msgid " -a, --all check all databases\n" -msgstr " -a, —all έλεγξε όλες τις βάσεις δεδομένων\n" +msgstr " -a, --all έλεγξε όλες τις βάσεις δεδομένων\n" -#: pg_amcheck.c:1156 +#: pg_amcheck.c:1169 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" -msgstr " -d, —database=PATTERN έλεγξε ταιριαστή(-ες) με το μοτίβο βάση(-εις) δεδομένων\n" +msgstr " -d, --database=PATTERN έλεγξε ταιριαστή(-ες) με το μοτίβο βάση(-εις) δεδομένων\n" -#: pg_amcheck.c:1157 +#: pg_amcheck.c:1170 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" -msgstr " -D, —exclude-database=PATTERN να ΜΗΝ ελέγξει ταιριαστή(-ες) με το μοτίβο βάση(-εις) δεδομένων\n" +msgstr " -D, --exclude-database=PATTERN να ΜΗΝ ελέγξει ταιριαστή(-ες) με το μοτίβο βάση(-εις) δεδομένων\n" -#: pg_amcheck.c:1158 +#: pg_amcheck.c:1171 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" -msgstr " -i, —index=PATTERN έλεγξε ταιριαστό(-ά) με το μοτίβο ευρετήριο(-ά)\n" +msgstr " -i, --index=PATTERN έλεγξε ταιριαστό(-ά) με το μοτίβο ευρετήριο(-ά)\n" -#: pg_amcheck.c:1159 +#: pg_amcheck.c:1172 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" -msgstr " -I, —exclude-index=PATTERN να ΜΗΝ ελέγξει ταιριαστό(-ά) με το μοτίβο ευρετήριο(-ά)\n" +msgstr " -I, --exclude-index=PATTERN να ΜΗΝ ελέγξει ταιριαστό(-ά) με το μοτίβο ευρετήριο(-ά)\n" -#: pg_amcheck.c:1160 +#: pg_amcheck.c:1173 #, c-format msgid " -r, --relation=PATTERN check matching relation(s)\n" -msgstr " -i, —index=PATTERN έλεγξε ταιριαστή(-ές) με το μοτίβο σχέση(-εις)\n" +msgstr " -i, --index=PATTERN έλεγξε ταιριαστή(-ές) με το μοτίβο σχέση(-εις)\n" -#: pg_amcheck.c:1161 +#: pg_amcheck.c:1174 #, c-format msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" -msgstr " -R, —exclude-relation=PATTERN να ΜΗΝ ελέγξει ταιριαστή(-ές) με το μοτίβο σχέση(-εις)\n" +msgstr " -R, --exclude-relation=PATTERN να ΜΗΝ ελέγξει ταιριαστή(-ές) με το μοτίβο σχέση(-εις)\n" -#: pg_amcheck.c:1162 +#: pg_amcheck.c:1175 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" -msgstr " -s, --schema=PATTERN έλεγξε ταιριαστό(-ά) με το μοτίβο σχήμα(-τα)\n" +msgstr " -s, --schema=PATTERN έλεγξε ταιριαστό(-ά) με το μοτίβο σχήμα(-τα)\n" -#: pg_amcheck.c:1163 +#: pg_amcheck.c:1176 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" -msgstr " -S, —exclude-schema=PATTERN να ΜΗΝ ελέγξει ταιριαστό(-ά) με το μοτίβο σχήμα(-τα)\n" +msgstr " -S, --exclude-schema=PATTERN να ΜΗΝ ελέγξει ταιριαστό(-ά) με το μοτίβο σχήμα(-τα)\n" -#: pg_amcheck.c:1164 +#: pg_amcheck.c:1177 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" -msgstr " -t, —table=PATTERN έλεγξε ταιριαστό(-ούς) με το μοτίβο πίνακα(-ες)\n" +msgstr " -t, --table=PATTERN έλεγξε ταιριαστό(-ούς) με το μοτίβο πίνακα(-ες)\n" -#: pg_amcheck.c:1165 +#: pg_amcheck.c:1178 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" -msgstr " -T, —exclude-table=PATTERN να ΜΗΝ ελέγξει ταιριαστό(-ούς) με το μοτίβο πίνακα(-ες)\n" +msgstr " -T, --exclude-table=PATTERN να ΜΗΝ ελέγξει ταιριαστό(-ούς) με το μοτίβο πίνακα(-ες)\n" -#: pg_amcheck.c:1166 +#: pg_amcheck.c:1179 #, c-format msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" -msgstr " —no-dependent-indexes να ΜΗΝ επεκτείνεις τη λίστα σχέσεων ώστε να συμπεριλάβει ευρετήρια\n" +msgstr " --no-dependent-indexes να ΜΗΝ επεκτείνεις τη λίστα σχέσεων ώστε να συμπεριλάβει ευρετήρια\n" -#: pg_amcheck.c:1167 +#: pg_amcheck.c:1180 #, c-format msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" -msgstr "" -" —no-dependent-toast να ΜΗΝ επεκτείνεις τη λίστα σχέσεων ώστε να συμπεριλάβει πίνακες TOAST\n" -"\n" +msgstr " --no-dependent-toast να ΜΗΝ επεκτείνεις τη λίστα σχέσεων ώστε να συμπεριλάβει πίνακες TOAST\n" -#: pg_amcheck.c:1168 +#: pg_amcheck.c:1181 #, c-format msgid " --no-strict-names do NOT require patterns to match objects\n" -msgstr " —no-strict-names να ΜΗΝ απαιτήσει μοτίβα για την αντιστοίχιση αντικειμένων\n" +msgstr " --no-strict-names να ΜΗΝ απαιτήσει μοτίβα για την αντιστοίχιση αντικειμένων\n" -#: pg_amcheck.c:1169 +#: pg_amcheck.c:1182 #, c-format msgid "" "\n" @@ -281,34 +331,32 @@ msgstr "" "\n" "Επιλογές ελέγχου πίνακα:\n" -#: pg_amcheck.c:1170 +#: pg_amcheck.c:1183 #, c-format msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" -msgstr " —exclude-toast-pointers να ΜΗΝ ακολουθήσει τους δείκτες σχέσεων TOAST\n" +msgstr " --exclude-toast-pointers να ΜΗΝ ακολουθήσει τους δείκτες σχέσεων TOAST\n" -#: pg_amcheck.c:1171 +#: pg_amcheck.c:1184 #, c-format msgid " --on-error-stop stop checking at end of first corrupt page\n" -msgstr " —on-error-stop διακοπή ελέγχου στο τέλος της πρώτης αλλοιωμένης σελίδας\n" +msgstr " --on-error-stop διακοπή ελέγχου στο τέλος της πρώτης αλλοιωμένης σελίδας\n" -#: pg_amcheck.c:1172 +#: pg_amcheck.c:1185 #, c-format msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" -msgstr " —skip=OPTION να ΜΗΝ ελέγξει τα “all-frozen” ή “all-visible” μπλοκ\n" +msgstr " --skip=OPTION να ΜΗΝ ελέγξει τα «all-frozen» ή «all-visible» μπλοκ\n" -#: pg_amcheck.c:1173 +#: pg_amcheck.c:1186 #, c-format msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" -msgstr " —startblock=BLOCK εκκίνηση του ελέγχου πίνακα(-ων) από τον δοσμένο αριθμό μπλοκ\n" +msgstr " --startblock=BLOCK εκκίνηση του ελέγχου πίνακα(-ων) από τον δοσμένο αριθμό μπλοκ\n" -#: pg_amcheck.c:1174 +#: pg_amcheck.c:1187 #, c-format msgid " --endblock=BLOCK check table(s) only up to the given block number\n" -msgstr "" -" —endblock=BLOCK τερματισμός του ελέγχου πίνακα(-ων) από τον δοσμένο αριθμό μπλοκ\n" -"\n" +msgstr " --endblock=BLOCK τερματισμός του ελέγχου πίνακα(-ων) από τον δοσμένο αριθμό μπλοκ\n" -#: pg_amcheck.c:1175 +#: pg_amcheck.c:1188 #, c-format msgid "" "\n" @@ -317,22 +365,22 @@ msgstr "" "\n" "Επιλογές ελέγχου ευρετηρίου B-tree:\n" -#: pg_amcheck.c:1176 +#: pg_amcheck.c:1189 #, c-format -msgid " --heapallindexed check all heap tuples are found within indexes\n" -msgstr " —heapallindexed έλεγξε όλες τις πλειάδες πλείαδες που βρίσκονται στο εύρος ευρετηρίων\n" +msgid " --heapallindexed check that all heap tuples are found within indexes\n" +msgstr " --heapallindexed έλεγξε ότι όλες οι πλειάδες heap περιλαμβάνονται σε ευρετήρια\n" -#: pg_amcheck.c:1177 +#: pg_amcheck.c:1190 #, c-format msgid " --parent-check check index parent/child relationships\n" -msgstr " —parent-check έλεγξε σχέσεις γονέα/απογόνου ευρετηρίου\n" +msgstr " --parent-check έλεγξε σχέσεις γονέα/απογόνου ευρετηρίου\n" -#: pg_amcheck.c:1178 +#: pg_amcheck.c:1191 #, c-format msgid " --rootdescend search from root page to refind tuples\n" -msgstr " —rootdescend αναζήτησε από τη ριζική σελίδα για την επανεύρεση πλειάδων\n" +msgstr " --rootdescend αναζήτησε από τη ριζική σελίδα για την επανεύρεση πλειάδων\n" -#: pg_amcheck.c:1179 +#: pg_amcheck.c:1192 #, c-format msgid "" "\n" @@ -341,37 +389,37 @@ msgstr "" "\n" "Επιλογές σύνδεσης:\n" -#: pg_amcheck.c:1180 +#: pg_amcheck.c:1193 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" -msgstr " -h, —host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n" +msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n" -#: pg_amcheck.c:1181 +#: pg_amcheck.c:1194 #, c-format msgid " -p, --port=PORT database server port\n" -msgstr " -p, —port=PORT θύρα διακομιστή βάσης δεδομένων\n" +msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων\n" -#: pg_amcheck.c:1182 +#: pg_amcheck.c:1195 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" -msgstr " -U, —username=USERNAME όνομα χρήστη με το οποίο να συνδεθεί\n" +msgstr " -U, --username=USERNAME όνομα χρήστη με το οποίο να συνδεθεί\n" -#: pg_amcheck.c:1183 +#: pg_amcheck.c:1196 #, c-format msgid " -w, --no-password never prompt for password\n" -msgstr " -w, —no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n" +msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n" -#: pg_amcheck.c:1184 +#: pg_amcheck.c:1197 #, c-format msgid " -W, --password force password prompt\n" -msgstr " -W, —password αναγκαστική προτροπή κωδικού πρόσβασης\n" +msgstr " -W, --password αναγκαστική προτροπή κωδικού πρόσβασης\n" -#: pg_amcheck.c:1185 +#: pg_amcheck.c:1198 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" -msgstr " —maintenance-db=DBNAME εναλλακτική βάση δεδομένων συντήρησης\n" +msgstr " --maintenance-db=DBNAME εναλλακτική βάση δεδομένων συντήρησης\n" -#: pg_amcheck.c:1186 +#: pg_amcheck.c:1199 #, c-format msgid "" "\n" @@ -380,47 +428,42 @@ msgstr "" "\n" "Άλλες επιλογές:\n" -#: pg_amcheck.c:1187 +#: pg_amcheck.c:1200 #, c-format msgid " -e, --echo show the commands being sent to the server\n" -msgstr " -e, —echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n" +msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n" -#: pg_amcheck.c:1188 +#: pg_amcheck.c:1201 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" -msgstr " -j, —jobs=NUM χρησιμοποιήσε τόσες πολλές ταυτόχρονες συνδέσεις με το διακομιστή\n" +msgstr " -j, --jobs=NUM χρησιμοποιήσε τόσες πολλές ταυτόχρονες συνδέσεις με το διακομιστή\n" -#: pg_amcheck.c:1189 +#: pg_amcheck.c:1202 #, c-format -msgid " -q, --quiet don't write any messages\n" -msgstr " -q, —quiet να μην γράψεις κανένα μήνυμα\n" +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress εμφάνισε πληροφορίες προόδου\n" -#: pg_amcheck.c:1190 +#: pg_amcheck.c:1203 #, c-format msgid " -v, --verbose write a lot of output\n" -msgstr " -v, —verbose γράψε πολλά μηνύματα εξόδου\n" +msgstr " -v, --verbose γράψε πολλά μηνύματα εξόδου\n" -#: pg_amcheck.c:1191 +#: pg_amcheck.c:1204 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr ", —version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" -#: pg_amcheck.c:1192 +#: pg_amcheck.c:1205 #, c-format -msgid " -P, --progress show progress information\n" -msgstr " -P, —progress εμφάνισε πληροφορίες προόδου\n" +msgid " --install-missing install missing extensions\n" +msgstr " --install-missing εγκατάστησε επεκτάσεις που λείπουν\n" -#: pg_amcheck.c:1193 +#: pg_amcheck.c:1206 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, —help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" -#: pg_amcheck.c:1194 -#, c-format -msgid " --install-missing install missing extensions\n" -msgstr " —install-missing εγκατάστησε επεκτάσεις που λείπουν\n" - -#: pg_amcheck.c:1196 +#: pg_amcheck.c:1208 #, c-format msgid "" "\n" @@ -429,37 +472,45 @@ msgstr "" "\n" "Υποβάλετε αναφορές σφάλματων σε <%s>.\n" -#: pg_amcheck.c:1197 +#: pg_amcheck.c:1209 #, c-format msgid "%s home page: <%s>\n" msgstr "%s αρχική σελίδα: <%s>\n" -#: pg_amcheck.c:1255 +#: pg_amcheck.c:1267 #, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%) %*s" -msgstr "%*s/%s σχέσεις (%d%%) σελίδες %*s/%s (%d%%) %*s" +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" +msgstr "%*s/%s σχέσεις (%d%%), %*s/%s σελίδες (%d%%) %*s" -#: pg_amcheck.c:1266 +#: pg_amcheck.c:1278 #, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%), (%s%-*.*s)" -msgstr "%*s/%s σχέσεις (%d%%) σελίδες %*s/%s (%d%%), (%s%-*.*s)" +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" +msgstr "%*s/%s σχέσεις (%d%%), %*s/%s σελίδες (%d%%) (%s%-*.*s)" -#: pg_amcheck.c:1281 +#: pg_amcheck.c:1293 #, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%)" -msgstr "%*s/%s σχέσεις (%d%%) σελίδες %*s/%s (%d%%)" +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" +msgstr "%*s/%s σχέσεις (%d%%), %*s/%s σελίδες (%d%%)" -#: pg_amcheck.c:1550 pg_amcheck.c:1692 +#: pg_amcheck.c:1562 pg_amcheck.c:1704 #, c-format msgid "including database \"%s\"" -msgstr "συμπεριλαμβανομένης της βάσης δεδομένων \"%s\"" +msgstr "συμπεριλαμβανομένης της βάσης δεδομένων «%s»" -#: pg_amcheck.c:1672 +#: pg_amcheck.c:1684 #, c-format msgid "internal error: received unexpected database pattern_id %d" -msgstr "Εσωτερικό σφάλμα: ελήφθη μη αναμενόμενο pattern_id βάσης δεδομένων %d" +msgstr "εσωτερικό σφάλμα: ελήφθη μη αναμενόμενο pattern_id %d" -#: pg_amcheck.c:2126 +#: pg_amcheck.c:1688 +#, c-format +msgid "no connectable databases to check matching \"%s\"" +msgstr "δεν υπάρχουν βάσεις δεδομένων με δυνατότητα σύνδεσης για έλεγχο που να ταιριάζουν με «%s»" + +#: pg_amcheck.c:2147 #, c-format msgid "internal error: received unexpected relation pattern_id %d" msgstr "εσωτερικό σφάλμα: ελήφθη μη αναμενόμενο pattern_id σχέσης %d" + +#~ msgid " -q, --quiet don't write any messages\n" +#~ msgstr " -q, --quiet να μην γράψεις κανένα μήνυμα\n" diff --git a/src/bin/pg_amcheck/po/es.po b/src/bin/pg_amcheck/po/es.po index 2118cc12bf..ceedac01cd 100644 --- a/src/bin/pg_amcheck/po/es.po +++ b/src/bin/pg_amcheck/po/es.po @@ -9,15 +9,15 @@ msgid "" msgstr "" "Project-Id-Version: pg_amcheck (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-14 19:48+0000\n" -"PO-Revision-Date: 2021-05-19 18:24-0500\n" +"POT-Creation-Date: 2021-10-13 22:17+0000\n" +"PO-Revision-Date: 2021-10-13 23:57-0500\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: BlackCAT 1.1\n" #: ../../../src/common/logging.c:259 #, c-format @@ -53,33 +53,33 @@ msgid "%s" msgstr "%s" #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 -#: pg_amcheck.c:1645 pg_amcheck.c:2084 +#: pg_amcheck.c:1657 pg_amcheck.c:2105 #, c-format msgid "query failed: %s" msgstr "la consulta falló: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 -#: pg_amcheck.c:597 pg_amcheck.c:1116 pg_amcheck.c:1646 pg_amcheck.c:2085 +#: pg_amcheck.c:598 pg_amcheck.c:1128 pg_amcheck.c:1658 pg_amcheck.c:2106 #, c-format msgid "query was: %s" msgstr "la consulta era: %s" -#: pg_amcheck.c:332 +#: pg_amcheck.c:330 #, c-format msgid "number of parallel jobs must be at least 1" msgstr "número de trabajos en paralelo debe ser al menos 1" -#: pg_amcheck.c:405 +#: pg_amcheck.c:402 #, c-format msgid "invalid argument for option %s" msgstr "argumento no válido para la opción %s" -#: pg_amcheck.c:413 +#: pg_amcheck.c:411 #, c-format msgid "invalid start block" msgstr "bloque de inicio no válido" -#: pg_amcheck.c:418 +#: pg_amcheck.c:416 #, c-format msgid "start block out of bounds" msgstr "bloque de inicio fuera de rango" @@ -94,87 +94,137 @@ msgstr "bloque final no válido" msgid "end block out of bounds" msgstr "bloque final fuera de rango" -#: pg_amcheck.c:455 pg_amcheck.c:481 +#: pg_amcheck.c:456 pg_amcheck.c:482 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Pruebe «%s --help» para mayor información.\n" -#: pg_amcheck.c:463 +#: pg_amcheck.c:464 #, c-format msgid "end block precedes start block" msgstr "bloque final precede al bloque de inicio" -#: pg_amcheck.c:479 +#: pg_amcheck.c:480 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: pg_amcheck.c:500 +#: pg_amcheck.c:501 #, c-format msgid "cannot specify a database name with --all" msgstr "no se puede especificar un nombre de base de datos al usar --all" -#: pg_amcheck.c:509 +#: pg_amcheck.c:510 #, c-format msgid "cannot specify both a database name and database patterns" msgstr "no se puede especificar al mismo tiempo un nombre de base de datos junto con patrones de bases de datos" -#: pg_amcheck.c:539 +#: pg_amcheck.c:540 #, c-format msgid "no databases to check" msgstr "no hay bases de datos para revisar" -#: pg_amcheck.c:595 +#: pg_amcheck.c:596 #, c-format msgid "database \"%s\": %s" msgstr "base de datos «%s»: %s" -#: pg_amcheck.c:606 +#: pg_amcheck.c:607 #, c-format msgid "skipping database \"%s\": amcheck is not installed" msgstr "omitiendo la base de datos «%s»: amcheck no está instalado" -#: pg_amcheck.c:614 +#: pg_amcheck.c:615 #, c-format msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" msgstr "en base de datos «%s»: usando amcheck versión «%s» en esquema «%s»" -#: pg_amcheck.c:676 +#: pg_amcheck.c:637 +#, c-format +msgid "no heap tables to check matching \"%s\"" +msgstr "no hay tablas heap para revisar que coincidan con «%s»" + +#: pg_amcheck.c:640 +#, c-format +msgid "no btree indexes to check matching \"%s\"" +msgstr "no hay índices btree para revisar que coincidan con «%s»" + +#: pg_amcheck.c:643 +#, c-format +msgid "no relations to check in schemas matching \"%s\"" +msgstr "no hay relaciones para revisar en esquemas que coincidan con «%s»" + +#: pg_amcheck.c:646 +#, c-format +msgid "no relations to check matching \"%s\"" +msgstr "no hay relaciones para revisar que coincidan con «%s»" + +#: pg_amcheck.c:674 #, c-format msgid "no relations to check" msgstr "no hay relaciones para revisar" -#: pg_amcheck.c:762 +#: pg_amcheck.c:758 #, c-format -msgid "checking heap table \"%s\".\"%s\".\"%s\"" -msgstr "revisando tabla heap «%s».«%s».«%s»" +msgid "checking heap table \"%s.%s.%s\"" +msgstr "revisando tabla heap «%s.%s.%s»" -#: pg_amcheck.c:778 +#: pg_amcheck.c:774 #, c-format -msgid "checking btree index \"%s\".\"%s\".\"%s\"" -msgstr "revisando índice btree «%s».«%s».«%s»" +msgid "checking btree index \"%s.%s.%s\"" +msgstr "revisando índice btree «%s.%s.%s»" -#: pg_amcheck.c:911 +#: pg_amcheck.c:921 #, c-format msgid "error sending command to database \"%s\": %s" msgstr "error al enviar orden a la base de datos «%s»: %s" -#: pg_amcheck.c:914 +#: pg_amcheck.c:924 #, c-format msgid "command was: %s" msgstr "la orden era: %s" -#: pg_amcheck.c:1113 +#: pg_amcheck.c:1041 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" +msgstr "tabla heap «%s.%s.%s», bloque %s, posición %s, atributo %s:\n" + +#: pg_amcheck.c:1048 #, c-format -msgid "btree index \"%s\".\"%s\".\"%s\": btree checking function returned unexpected number of rows: %d" -msgstr "índice btree «%s».«%s».«%s»: la función de comprobación de btree devolvió un número inesperado de registros: %d" +msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" +msgstr "tabla heap «%s.%s.%s», bloque %s, posición %s:\n" -#: pg_amcheck.c:1117 +#: pg_amcheck.c:1054 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s:\n" +msgstr "tabla heap «%s.%s.%s», bloque %s:\n" + +#: pg_amcheck.c:1059 pg_amcheck.c:1070 +#, c-format +msgid "heap table \"%s.%s.%s\":\n" +msgstr "tabla heap «%s.%s.%s»:\n" + +#: pg_amcheck.c:1074 pg_amcheck.c:1143 +#, c-format +msgid "query was: %s\n" +msgstr "la consulta era: %s\n" + +#: pg_amcheck.c:1125 +#, c-format +msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" +msgstr "índice btree «%s.%s.%s»: la función de comprobación de btree devolvió un número inesperado de registros: %d" + +#: pg_amcheck.c:1129 #, c-format msgid "Are %s's and amcheck's versions compatible?" msgstr "¿Son compatibles la versión de %s con la de amcheck?" -#: pg_amcheck.c:1151 +#: pg_amcheck.c:1139 +#, c-format +msgid "btree index \"%s.%s.%s\":\n" +msgstr "índice btree «%s.%s.%s»:\n" + +#: pg_amcheck.c:1164 #, c-format msgid "" "%s checks objects in a PostgreSQL database for corruption.\n" @@ -183,17 +233,17 @@ msgstr "" "%s busca corrupción en objetos de una base de datos PostgreSQL.\n" "\n" -#: pg_amcheck.c:1152 +#: pg_amcheck.c:1165 #, c-format msgid "Usage:\n" msgstr "Empleo:\n" -#: pg_amcheck.c:1153 +#: pg_amcheck.c:1166 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPCIÓN]... [BASE-DE-DATOS]\n" -#: pg_amcheck.c:1154 +#: pg_amcheck.c:1167 #, c-format msgid "" "\n" @@ -202,77 +252,77 @@ msgstr "" "\n" "Opciones de objetivo:\n" -#: pg_amcheck.c:1155 +#: pg_amcheck.c:1168 #, c-format msgid " -a, --all check all databases\n" msgstr " -a, --all revisar todas las bases de datos\n" -#: pg_amcheck.c:1156 +#: pg_amcheck.c:1169 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" msgstr " -d, --database=PATRÓN revisar la(s) base(s) de datos que coincida(n)\n" -#: pg_amcheck.c:1157 +#: pg_amcheck.c:1170 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" msgstr " -D, --exclude-database=PATRÓN NO revisar la(s) base(s) de datos que coincida(n)\n" -#: pg_amcheck.c:1158 +#: pg_amcheck.c:1171 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" msgstr " -i, --index=PATRÓN revisar el(los) índice(s) que coincida(n)\n" -#: pg_amcheck.c:1159 +#: pg_amcheck.c:1172 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" msgstr " -I, --exclude-index=PATRÓN NO revisar el(los) índice(s) que coincida(n)\n" -#: pg_amcheck.c:1160 +#: pg_amcheck.c:1173 #, c-format msgid " -r, --relation=PATTERN check matching relation(s)\n" msgstr " -r, --relation=PATRÓN revisar la(s) relación(es) que coincida(n)\n" -#: pg_amcheck.c:1161 +#: pg_amcheck.c:1174 #, c-format msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" msgstr " -R, --exclude-relation=PATRÓN NO revisar la(s) relación(es) que coincida(n)\n" -#: pg_amcheck.c:1162 +#: pg_amcheck.c:1175 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" msgstr " -s, --schema=PATRÓN revisar el(los) esquema(s) que coincida(n)\n" -#: pg_amcheck.c:1163 +#: pg_amcheck.c:1176 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" msgstr " -S, --exclude-schema=PATRÓN NO revisar el(los) esquema(s) que coincida(n)\n" -#: pg_amcheck.c:1164 +#: pg_amcheck.c:1177 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" msgstr " -t, --table=PATRÓN revisar la(s) tabla(s) que coincida(n)\n" -#: pg_amcheck.c:1165 +#: pg_amcheck.c:1178 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" msgstr " -T, --exclude-table=PATRÓN NO revisar la(s) tabla(s) que coincida(n)\n" -#: pg_amcheck.c:1166 +#: pg_amcheck.c:1179 #, c-format msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" msgstr " --no-dependent-indexes NO expandir la lista de relaciones para incluir índices\n" -#: pg_amcheck.c:1167 +#: pg_amcheck.c:1180 #, c-format msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" msgstr " --no-dependent-toast NO expandir lista de relaciones para incluir tablas TOAST\n" -#: pg_amcheck.c:1168 +#: pg_amcheck.c:1181 #, c-format msgid " --no-strict-names do NOT require patterns to match objects\n" msgstr " --no-strict-names NO requerir que los patrones coincidan con los objetos\n" -#: pg_amcheck.c:1169 +#: pg_amcheck.c:1182 #, c-format msgid "" "\n" @@ -281,32 +331,32 @@ msgstr "" "\n" "Opciones para revisión de tabla:\n" -#: pg_amcheck.c:1170 +#: pg_amcheck.c:1183 #, c-format msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" msgstr " --exclude-toast-pointers NO seguir punteros TOAST de la relación\n" -#: pg_amcheck.c:1171 +#: pg_amcheck.c:1184 #, c-format msgid " --on-error-stop stop checking at end of first corrupt page\n" msgstr " --on-error-stop detener la revisión al final de la primera página corrupta\n" -#: pg_amcheck.c:1172 +#: pg_amcheck.c:1185 #, c-format msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" msgstr " --skip=OPTION NO revisar bloques «all-frozen» u «all-visible»\n" -#: pg_amcheck.c:1173 +#: pg_amcheck.c:1186 #, c-format msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" msgstr " --startblock=BLOQUE empezar la revisión de la(s) tabla(s) en el número de bloque especificado\n" -#: pg_amcheck.c:1174 +#: pg_amcheck.c:1187 #, c-format msgid " --endblock=BLOCK check table(s) only up to the given block number\n" msgstr " --endblock=BLOQUE solo revisar la(s) tabla(s) hasta el número de bloque especificado\n" -#: pg_amcheck.c:1175 +#: pg_amcheck.c:1188 #, c-format msgid "" "\n" @@ -315,22 +365,22 @@ msgstr "" "\n" "Opciones para revisión de índices B-tree:\n" -#: pg_amcheck.c:1176 +#: pg_amcheck.c:1189 #, c-format -msgid " --heapallindexed check all heap tuples are found within indexes\n" +msgid " --heapallindexed check that all heap tuples are found within indexes\n" msgstr " --heapallindexed revisar que todas las tuplas heap se encuentren en los índices\n" -#: pg_amcheck.c:1177 +#: pg_amcheck.c:1190 #, c-format msgid " --parent-check check index parent/child relationships\n" msgstr " --parent-check revisar relaciones padre/hijo de índice\n" -#: pg_amcheck.c:1178 +#: pg_amcheck.c:1191 #, c-format msgid " --rootdescend search from root page to refind tuples\n" msgstr " --rootdescend buscar desde la página raíz para volver a encontrar tuplas\n" -#: pg_amcheck.c:1179 +#: pg_amcheck.c:1192 #, c-format msgid "" "\n" @@ -339,37 +389,37 @@ msgstr "" "\n" "Opciones de conexión:\n" -#: pg_amcheck.c:1180 +#: pg_amcheck.c:1193 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=ANFITRIÓN nombre del servidor o directorio del socket\n" -#: pg_amcheck.c:1181 +#: pg_amcheck.c:1194 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PUERTO puerto del servidor de base de datos\n" -#: pg_amcheck.c:1182 +#: pg_amcheck.c:1195 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n" -#: pg_amcheck.c:1183 +#: pg_amcheck.c:1196 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password nunca pedir contraseña\n" -#: pg_amcheck.c:1184 +#: pg_amcheck.c:1197 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password forzar la petición de contraseña\n" -#: pg_amcheck.c:1185 +#: pg_amcheck.c:1198 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=BASE base de datos de mantención alternativa\n" -#: pg_amcheck.c:1186 +#: pg_amcheck.c:1199 #, c-format msgid "" "\n" @@ -378,47 +428,42 @@ msgstr "" "\n" "Otras opciones:\n" -#: pg_amcheck.c:1187 +#: pg_amcheck.c:1200 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo mostrar las órdenes enviadas al servidor\n" -#: pg_amcheck.c:1188 +#: pg_amcheck.c:1201 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" msgstr " -j, --jobs=NUM usar esta cantidad de conexiones concurrentes hacia el servidor\n" -#: pg_amcheck.c:1189 +#: pg_amcheck.c:1202 #, c-format -msgid " -q, --quiet don't write any messages\n" -msgstr " -q, --quiet no desplegar mensajes\n" +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress mostrar información de progreso\n" -#: pg_amcheck.c:1190 +#: pg_amcheck.c:1203 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose desplegar varios mensajes informativos\n" -#: pg_amcheck.c:1191 +#: pg_amcheck.c:1204 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión y salir\n" -#: pg_amcheck.c:1192 +#: pg_amcheck.c:1205 #, c-format -msgid " -P, --progress show progress information\n" -msgstr " -P, --progress mostrar información de progreso\n" +msgid " --install-missing install missing extensions\n" +msgstr " --install-missing instalar extensiones faltantes\n" -#: pg_amcheck.c:1193 +#: pg_amcheck.c:1206 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: pg_amcheck.c:1194 -#, c-format -msgid " --install-missing install missing extensions\n" -msgstr " --install-missing instalar extensiones faltantes\n" - -#: pg_amcheck.c:1196 +#: pg_amcheck.c:1208 #, c-format msgid "" "\n" @@ -427,37 +472,45 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: pg_amcheck.c:1197 +#: pg_amcheck.c:1209 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: pg_amcheck.c:1255 +#: pg_amcheck.c:1267 #, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%) %*s" -msgstr "%*s/%s relaciones (%d%%) %*s/%s páginas (%d%%) %*s" +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" +msgstr "%*s/%s relaciones (%d%%), %*s/%s páginas (%d%%) %*s" -#: pg_amcheck.c:1266 +#: pg_amcheck.c:1278 #, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%), (%s%-*.*s)" -msgstr "%*s/%s relaciones (%d%%) %*s/%s páginas (%d%%), (%s%-*.*s)" +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" +msgstr "%*s/%s relaciones (%d%%), %*s/%s páginas (%d%%), (%s%-*.*s)" -#: pg_amcheck.c:1281 +#: pg_amcheck.c:1293 #, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%)" -msgstr "%*s/%s relaciones (%d%%) %*s/%s páginas (%d%%)" +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" +msgstr "%*s/%s relaciones (%d%%), %*s/%s páginas (%d%%)" -#: pg_amcheck.c:1550 pg_amcheck.c:1692 +#: pg_amcheck.c:1562 pg_amcheck.c:1704 #, c-format msgid "including database \"%s\"" msgstr "incluyendo base de datos «%s»" -#: pg_amcheck.c:1672 +#: pg_amcheck.c:1684 #, c-format msgid "internal error: received unexpected database pattern_id %d" msgstr "error interno: se recibió pattern_id de base de datos inesperado (%d)" -#: pg_amcheck.c:2126 +#: pg_amcheck.c:1688 +#, c-format +msgid "no connectable databases to check matching \"%s\"" +msgstr "no hay bases de datos a las que se pueda conectar que coincidan con «%s»" + +#: pg_amcheck.c:2147 #, c-format msgid "internal error: received unexpected relation pattern_id %d" msgstr "error interno: se recibió pattern_id de relación inesperado (%d)" + +#~ msgid " -q, --quiet don't write any messages\n" +#~ msgstr " -q, --quiet no desplegar mensajes\n" diff --git a/src/bin/pg_amcheck/po/fr.po b/src/bin/pg_amcheck/po/fr.po index f359e35aa0..9fc553f23b 100644 --- a/src/bin/pg_amcheck/po/fr.po +++ b/src/bin/pg_amcheck/po/fr.po @@ -1,197 +1,262 @@ # LANGUAGE message translation file for pg_amcheck -# Copyright (C) 2021 PostgreSQL Global Development Group +# Copyright (C) 2021-2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_amcheck (PostgreSQL) package. -# FIRST AUTHOR , 2021. +# +# Use these quotes: « %s » +# +# Guillaume Lelarge , 2021-2022. # msgid "" msgstr "" -"Project-Id-Version: pg_amcheck (PostgreSQL) 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-06-14 06:18+0000\n" -"PO-Revision-Date: 2021-06-14 16:56+0200\n" -"Last-Translator: \n" -"Language-Team: \n" +"POT-Creation-Date: 2022-05-14 10:19+0000\n" +"PO-Revision-Date: 2022-05-14 17:15+0200\n" +"Last-Translator: Guillaume Lelarge \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.3\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "fatal : " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "attention : " -#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "astuce : " + +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 msgid "Cancel request sent\n" msgstr "Requête d'annulation envoyée\n" -#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 msgid "Could not send cancel request: " msgstr "N'a pas pu envoyer la requête d'annulation : " -#: ../../fe_utils/connect_utils.c:92 +#: ../../fe_utils/connect_utils.c:91 #, c-format msgid "could not connect to database %s: out of memory" msgstr "n'a pas pu se connecter à la base de données %s : plus de mémoire" -#: ../../fe_utils/connect_utils.c:120 +#: ../../fe_utils/connect_utils.c:117 #, c-format msgid "%s" msgstr "%s" +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "valeur « %s » invalide pour l'option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s doit être compris entre %d et %d" + #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 -#: pg_amcheck.c:1645 pg_amcheck.c:2084 +#: pg_amcheck.c:1645 pg_amcheck.c:2090 #, c-format msgid "query failed: %s" msgstr "échec de la requête : %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 -#: pg_amcheck.c:597 pg_amcheck.c:1116 pg_amcheck.c:1646 pg_amcheck.c:2085 +#: pg_amcheck.c:571 pg_amcheck.c:1100 pg_amcheck.c:1646 pg_amcheck.c:2091 #, c-format -msgid "query was: %s" -msgstr "la requête était : %s" +msgid "Query was: %s" +msgstr "La requête était : %s" -#: pg_amcheck.c:332 -#, c-format -msgid "number of parallel jobs must be at least 1" -msgstr "le nombre maximum de jobs en parallèle doit être au moins de 1" - -#: pg_amcheck.c:405 +#: pg_amcheck.c:399 #, c-format msgid "invalid argument for option %s" msgstr "argument invalide pour l'option %s" -#: pg_amcheck.c:413 +#: pg_amcheck.c:405 #, c-format msgid "invalid start block" msgstr "bloc de début invalide" -#: pg_amcheck.c:418 +#: pg_amcheck.c:407 #, c-format msgid "start block out of bounds" msgstr "bloc de début hors des limites" -#: pg_amcheck.c:426 +#: pg_amcheck.c:414 #, c-format msgid "invalid end block" msgstr "bloc de fin invalide" -#: pg_amcheck.c:431 +#: pg_amcheck.c:416 #, c-format msgid "end block out of bounds" msgstr "bloc de fin hors des limites" -#: pg_amcheck.c:455 pg_amcheck.c:481 +#: pg_amcheck.c:439 pg_amcheck.c:461 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Essayez « %s --help » pour plus d'informations.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_amcheck.c:463 +#: pg_amcheck.c:445 #, c-format msgid "end block precedes start block" msgstr "le bloc de fin précède le bloc de début" -#: pg_amcheck.c:479 +#: pg_amcheck.c:459 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_amcheck.c:500 +#: pg_amcheck.c:479 #, c-format msgid "cannot specify a database name with --all" msgstr "ne peut pas spécifier un nom de base de données avec --all" -#: pg_amcheck.c:509 +#: pg_amcheck.c:485 #, c-format msgid "cannot specify both a database name and database patterns" msgstr "ne peut pas spécifier à la fois le nom d'une base de données et des motifs de noms de base" -#: pg_amcheck.c:539 +#: pg_amcheck.c:513 #, c-format msgid "no databases to check" msgstr "aucune base de données à vérifier" -#: pg_amcheck.c:595 +#: pg_amcheck.c:569 #, c-format msgid "database \"%s\": %s" msgstr "base de données « %s » : %s" -#: pg_amcheck.c:606 +#: pg_amcheck.c:580 #, c-format msgid "skipping database \"%s\": amcheck is not installed" msgstr "ignore la base « %s » : amcheck n'est pas installé" -#: pg_amcheck.c:614 +#: pg_amcheck.c:588 #, c-format msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" msgstr "dans la base de données « %s » : utilisation de la version « %s » d'amcheck dans le schéma « %s »" -#: pg_amcheck.c:676 +#: pg_amcheck.c:610 +#, c-format +msgid "no heap tables to check matching \"%s\"" +msgstr "aucune table heap à vérifier correspondant à « %s »" + +#: pg_amcheck.c:613 +#, c-format +msgid "no btree indexes to check matching \"%s\"" +msgstr "aucun index btree à vérifier correspondant à « %s »" + +#: pg_amcheck.c:616 +#, c-format +msgid "no relations to check in schemas matching \"%s\"" +msgstr "aucune relation à vérifier dans les schémas correspondant à « %s »" + +#: pg_amcheck.c:619 +#, c-format +msgid "no relations to check matching \"%s\"" +msgstr "aucune relation à vérifier correspondant à « %s »" + +#: pg_amcheck.c:647 #, c-format msgid "no relations to check" msgstr "aucune relation à vérifier" -#: pg_amcheck.c:762 +#: pg_amcheck.c:730 #, c-format -msgid "checking heap table \"%s\".\"%s\".\"%s\"" -msgstr "vérification de la table heap « %s %s\".\"%s\"" +msgid "checking heap table \"%s.%s.%s\"" +msgstr "vérification de la table heap « %s %s.%s »" -#: pg_amcheck.c:778 +#: pg_amcheck.c:746 #, c-format -msgid "checking btree index \"%s\".\"%s\".\"%s\"" -msgstr "vérification de l'index btree \"%s\".\"%s\".\"%s\"" +msgid "checking btree index \"%s.%s.%s\"" +msgstr "vérification de l'index btree « %s %s.%s »" -#: pg_amcheck.c:911 +#: pg_amcheck.c:893 #, c-format msgid "error sending command to database \"%s\": %s" msgstr "erreur de l'envoi d'une commande à la base de données « %s » : %s" -#: pg_amcheck.c:914 +#: pg_amcheck.c:896 #, c-format -msgid "command was: %s" -msgstr "la commande était : %s" +msgid "Command was: %s" +msgstr "La commande était : %s" -#: pg_amcheck.c:1113 +#: pg_amcheck.c:1013 #, c-format -msgid "btree index \"%s\".\"%s\".\"%s\": btree checking function returned unexpected number of rows: %d" -msgstr "index btree \"%s\".\"%s\".\"%s\" : la fonction de vérification de btree a renvoyé un nombre de lignes inattendu : %d" +msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" +msgstr "table heap « %s.%s.%s », bloc %s, décalage %s, attribut %s :\n" -#: pg_amcheck.c:1117 +#: pg_amcheck.c:1020 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" +msgstr "table heap « %s.%s.%s », bloc %s, décalage %s :\n" + +#: pg_amcheck.c:1026 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s:\n" +msgstr "table heap « %s %s.%s », bloc %s :\n" + +#: pg_amcheck.c:1031 pg_amcheck.c:1042 +#, c-format +msgid "heap table \"%s.%s.%s\":\n" +msgstr "table heap « %s %s.%s » :\n" + +#: pg_amcheck.c:1046 pg_amcheck.c:1115 +#, c-format +msgid "query was: %s\n" +msgstr "la requête était : %s\n" + +#: pg_amcheck.c:1097 +#, c-format +msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" +msgstr "index btree « %s.%s.%s » : la fonction de vérification des index btree a renvoyé un nombre de lignes inattendu : %d" + +#: pg_amcheck.c:1101 #, c-format msgid "Are %s's and amcheck's versions compatible?" msgstr "est-ce que les versions de %s et d'amcheck sont compatibles ?" -#: pg_amcheck.c:1151 +#: pg_amcheck.c:1111 +#, c-format +msgid "btree index \"%s.%s.%s\":\n" +msgstr "vérification de l'index btree« %s %s.%s » :\n" + +#: pg_amcheck.c:1136 #, c-format msgid "" "%s checks objects in a PostgreSQL database for corruption.\n" "\n" msgstr "" -"%s utilise le module amcheck pour vérifier les objets dans une base PostgreSQL pour corruption.\n" +"%s utilise le module amcheck pour vérifier si les objets d' une base\n" +"PostgreSQL sont corrompus.\n" "\n" -#: pg_amcheck.c:1152 +#: pg_amcheck.c:1137 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: pg_amcheck.c:1153 +#: pg_amcheck.c:1138 #, c-format msgid " %s [OPTION]... [DBNAME]\n" -msgstr " %s [OPTION]... [NOMBASE]\n" +msgstr " %s [OPTION]... [BASE]\n" -#: pg_amcheck.c:1154 +#: pg_amcheck.c:1139 #, c-format msgid "" "\n" @@ -200,77 +265,83 @@ msgstr "" "\n" "Options de la cible :\n" -#: pg_amcheck.c:1155 +#: pg_amcheck.c:1140 #, c-format msgid " -a, --all check all databases\n" msgstr " -a, --all vérifie toutes les bases\n" -#: pg_amcheck.c:1156 +#: pg_amcheck.c:1141 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" msgstr " -d, --database=MOTIF vérifie les bases correspondantes\n" -#: pg_amcheck.c:1157 +#: pg_amcheck.c:1142 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" msgstr " -D, --exclude-database=MOTIF ne vérifie PAS les bases correspondantes\n" -#: pg_amcheck.c:1158 +#: pg_amcheck.c:1143 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" msgstr " -i, --index=MOTIF vérifie les index correspondants\n" -#: pg_amcheck.c:1159 +#: pg_amcheck.c:1144 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" msgstr " -I, --exclude-index=MOTIF ne vérifie PAS les index correspondants\n" -#: pg_amcheck.c:1160 +#: pg_amcheck.c:1145 #, c-format msgid " -r, --relation=PATTERN check matching relation(s)\n" msgstr " -r, --relation=MOTIF vérifie les relations correspondantes\n" -#: pg_amcheck.c:1161 +#: pg_amcheck.c:1146 #, c-format msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" msgstr " -R, --exclude-relation=MOTIF ne vérifie PAS les relations correspondantes\n" -#: pg_amcheck.c:1162 +#: pg_amcheck.c:1147 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" msgstr " -s, --schema=MOTIF vérifie les schémas correspondants\n" -#: pg_amcheck.c:1163 +#: pg_amcheck.c:1148 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" msgstr " -S, --exclude-schema=MOTIF ne vérifie PAS les schémas correspondants\n" -#: pg_amcheck.c:1164 +#: pg_amcheck.c:1149 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" msgstr " -t, --table=MOTIF vérifie les tables correspondantes\n" -#: pg_amcheck.c:1165 +#: pg_amcheck.c:1150 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" msgstr " -T, --exclude-table=MOTIF ne vérifie PAS les tables correspondantes\n" -#: pg_amcheck.c:1166 +#: pg_amcheck.c:1151 #, c-format msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" -msgstr " --no-dependent-indexes n'étend PAS la liste des relations pour inclure les index\n" +msgstr "" +" --no-dependent-indexes n'étend PAS la liste des relations pour inclure\n" +" les index\n" -#: pg_amcheck.c:1167 +#: pg_amcheck.c:1152 #, c-format msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" -msgstr " --no-dependent-toast n'étend PAS la liste des relations pour inclure les TOAST\n" +msgstr "" +" --no-dependent-toast n'étend PAS la liste des relations pour inclure\n" +" les TOAST\n" -#: pg_amcheck.c:1168 +#: pg_amcheck.c:1153 #, c-format msgid " --no-strict-names do NOT require patterns to match objects\n" -msgstr " --no-strict-names ne requiert PAS que les motifs correspondent à des objets\n" +msgstr "" +" --no-strict-names ne requiert PAS que les motifs correspondent à\n" +" des objets\n" -#: pg_amcheck.c:1169 +#: pg_amcheck.c:1154 #, c-format msgid "" "\n" @@ -279,32 +350,40 @@ msgstr "" "\n" "Options de vérification des tables :\n" -#: pg_amcheck.c:1170 +#: pg_amcheck.c:1155 #, c-format msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" msgstr " --exclude-toast-pointers ne suit PAS les pointeurs de TOAST\n" -#: pg_amcheck.c:1171 +#: pg_amcheck.c:1156 #, c-format msgid " --on-error-stop stop checking at end of first corrupt page\n" -msgstr " --on-error-stop arrête la vérification à la fin du premier bloc corrompu\n" +msgstr "" +" --on-error-stop arrête la vérification à la fin du premier bloc\n" +" corrompu\n" -#: pg_amcheck.c:1172 +#: pg_amcheck.c:1157 #, c-format msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" -msgstr " --skip=OPTION ne vérifie PAS les blocs « all-frozen » et « all-visible »\n" +msgstr "" +" --skip=OPTION ne vérifie PAS les blocs « all-frozen » et\n" +" « all-visible »\n" -#: pg_amcheck.c:1173 +#: pg_amcheck.c:1158 #, c-format msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" -msgstr " --startblock=BLOC commence la vérification des tables au numéro de bloc indiqué\n" +msgstr "" +" --startblock=BLOC commence la vérification des tables au numéro\n" +" de bloc indiqué\n" -#: pg_amcheck.c:1174 +#: pg_amcheck.c:1159 #, c-format msgid " --endblock=BLOCK check table(s) only up to the given block number\n" -msgstr " --endblock=BLOC vérifie les tables jusqu'au numéro de bloc indiqué\n" +msgstr "" +" --endblock=BLOC vérifie les tables jusqu'au numéro de bloc\n" +" indiqué\n" -#: pg_amcheck.c:1175 +#: pg_amcheck.c:1160 #, c-format msgid "" "\n" @@ -313,22 +392,28 @@ msgstr "" "\n" "Options de vérification des index Btree :\n" -#: pg_amcheck.c:1176 +#: pg_amcheck.c:1161 #, c-format -msgid " --heapallindexed check all heap tuples are found within indexes\n" -msgstr " --heapallindexed vérifie que tous les enregistrements de la table sont référencés dans les index\n" +msgid " --heapallindexed check that all heap tuples are found within indexes\n" +msgstr "" +" --heapallindexed vérifie que tous les enregistrements de la\n" +" table sont référencés dans les index\n" -#: pg_amcheck.c:1177 +#: pg_amcheck.c:1162 #, c-format msgid " --parent-check check index parent/child relationships\n" -msgstr " --parent-check vérifie les relations parent/enfants dans les index\n" +msgstr "" +" --parent-check vérifie les relations parent/enfants dans les\n" +" index\n" -#: pg_amcheck.c:1178 +#: pg_amcheck.c:1163 #, c-format msgid " --rootdescend search from root page to refind tuples\n" -msgstr " --rootdescend recherche à partir de la racine pour trouver les lignes\n" +msgstr "" +" --rootdescend recherche à partir de la racine pour trouver\n" +" les lignes\n" -#: pg_amcheck.c:1179 +#: pg_amcheck.c:1164 #, c-format msgid "" "\n" @@ -337,37 +422,37 @@ msgstr "" "\n" "Options de connexion :\n" -#: pg_amcheck.c:1180 +#: pg_amcheck.c:1165 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" -msgstr " -h, --host=HOSTNAME IP/alias du serveur ou répertoire du socket\n" +msgstr " -h, --host=HÔTE IP/alias du serveur ou répertoire du socket\n" -#: pg_amcheck.c:1181 +#: pg_amcheck.c:1166 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT port du serveur de bases de données\n" -#: pg_amcheck.c:1182 +#: pg_amcheck.c:1167 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" -msgstr " -U, --username=NOM_UTILSATEUR nom d'utilisateur pour la connexion\n" +msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n" -#: pg_amcheck.c:1183 +#: pg_amcheck.c:1168 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ne demande jamais un mot de passe\n" -#: pg_amcheck.c:1184 +#: pg_amcheck.c:1169 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password force la saisie d'un mot de passe\n" -#: pg_amcheck.c:1185 +#: pg_amcheck.c:1170 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" -msgstr " --maintenance-db=NOM_BASE change la base de maintenance\n" +msgstr " --maintenance-db=BASE change la base de maintenance\n" -#: pg_amcheck.c:1186 +#: pg_amcheck.c:1171 #, c-format msgid "" "\n" @@ -376,47 +461,44 @@ msgstr "" "\n" "Autres options :\n" -#: pg_amcheck.c:1187 +#: pg_amcheck.c:1172 #, c-format msgid " -e, --echo show the commands being sent to the server\n" -msgstr " -e, --echo affiche les commandes envoyées au serveur\n" +msgstr " -e, --echo affiche les commandes envoyées au serveur\n" -#: pg_amcheck.c:1188 +#: pg_amcheck.c:1173 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" -msgstr " -j, --jobs=NOMBRE utilise ce nombre de connexions simultanées au serveur\n" - -#: pg_amcheck.c:1189 -#, c-format -msgid " -q, --quiet don't write any messages\n" -msgstr " -q, --quiet n'écrit aucun message\n" +msgstr "" +" -j, --jobs=NOMBRE utilise ce nombre de connexions simultanées au\n" +" serveur\n" -#: pg_amcheck.c:1190 +#: pg_amcheck.c:1174 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress affiche la progression\n" -#: pg_amcheck.c:1191 +#: pg_amcheck.c:1175 #, c-format msgid " -v, --verbose write a lot of output\n" -msgstr " -v, --verbose mode verbeux\n" +msgstr " -v, --verbose mode verbeux\n" -#: pg_amcheck.c:1192 +#: pg_amcheck.c:1176 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version puis quitte\n" +msgstr " -V, --version affiche la version puis quitte\n" -#: pg_amcheck.c:1193 +#: pg_amcheck.c:1177 #, c-format msgid " --install-missing install missing extensions\n" msgstr " --install-missing installe les extensions manquantes\n" -#: pg_amcheck.c:1194 +#: pg_amcheck.c:1178 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide puis quitte\n" +msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_amcheck.c:1196 +#: pg_amcheck.c:1180 #, c-format msgid "" "\n" @@ -425,43 +507,62 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_amcheck.c:1197 +#: pg_amcheck.c:1181 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil de %s : <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" + +#: pg_amcheck.c:1234 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" +msgstr "relations %*s/%s (%d%%), blocs %*s/%s (%d%%) %*s" -#: pg_amcheck.c:1255 +#: pg_amcheck.c:1245 #, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%) %*s" -msgstr "relations %*s/%s (%d%%) pages %*s/%s (%d%%) %*s" +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" +msgstr "relations %*s/%s (%d%%), blocs %*s/%s (%d%%) (%s%-*.*s)" -#: pg_amcheck.c:1266 +#: pg_amcheck.c:1260 #, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%), (%s%-*.*s)" -msgstr "relations %*s/%s (%d%%) pages %*s/%s (%d%%), (%s%-*.*s)" +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" +msgstr "relations %*s/%s (%d%%), blocs %*s/%s (%d%%)" -#: pg_amcheck.c:1281 +#: pg_amcheck.c:1319 pg_amcheck.c:1352 #, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%)" -msgstr "relations %*s/%s (%d%%) pages %*s/%s (%d%%)" +msgid "improper qualified name (too many dotted names): %s" +msgstr "mauvaise qualification du nom (trop de points entre les noms) : %s" -#: pg_amcheck.c:1550 pg_amcheck.c:1692 +#: pg_amcheck.c:1397 +#, c-format +msgid "improper relation name (too many dotted names): %s" +msgstr "nom de relation incorrecte (trop de points entre les noms) : %s" + +#: pg_amcheck.c:1550 pg_amcheck.c:1689 #, c-format msgid "including database \"%s\"" msgstr "en incluant la base de données : « %s »" -#: pg_amcheck.c:1672 +#: pg_amcheck.c:1671 #, c-format msgid "internal error: received unexpected database pattern_id %d" msgstr "erreur interne : a reçu un pattern_id %d inattendu de la base" -#: pg_amcheck.c:2126 +#: pg_amcheck.c:1673 +#, c-format +msgid "no connectable databases to check matching \"%s\"" +msgstr "aucune base de données connectable à vérifier correspondant à « %s »" + +#: pg_amcheck.c:2131 #, c-format msgid "internal error: received unexpected relation pattern_id %d" msgstr "erreur interne : a reçu un pattern_id %d inattendu de la relation" -#~ msgid "number of parallel jobs must be at least 1\n" -#~ msgstr "le nombre de jobs parallèles doit être au moins de 1\n" +#~ msgid "" +#~ "\n" +#~ "Other Options:\n" +#~ msgstr "" +#~ "\n" +#~ "Autres options:\n" #~ msgid " -?, --help show this help, then exit\n" #~ msgstr " -?, --help affiche cette aide, puis quitte\n" @@ -469,21 +570,36 @@ msgstr "erreur interne : a reçu un pattern_id %d inattendu de la relation" #~ msgid " -V, --version output version information, then exit\n" #~ msgstr " -V, --version affiche la version, puis quitte\n" -#~ msgid " -v, --verbose write a lot of output\n" -#~ msgstr " -v, --verbose mode verbeux\n" +#~ msgid " -e, --echo show the commands being sent to the server\n" +#~ msgstr " -e, --echo affiche les commandes envoyées au serveur\n" + +#~ msgid " -q, --quiet don't write any messages\n" +#~ msgstr " -q, --quiet n'écrit aucun message\n" #~ msgid " -q, --quiet don't write any messages\n" #~ msgstr " -q, --quiet n'écrit aucun message\n" -#~ msgid " -e, --echo show the commands being sent to the server\n" -#~ msgstr " -e, --echo affiche les commandes envoyées au serveur\n" +#~ msgid " -v, --verbose write a lot of output\n" +#~ msgstr " -v, --verbose mode verbeux\n" -#~ msgid "" -#~ "\n" -#~ "Other Options:\n" -#~ msgstr "" -#~ "\n" -#~ "Autres options:\n" +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" + +#, c-format +#~ msgid "command was: %s" +#~ msgstr "la commande était : %s" + +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatal : " #~ msgid "invalid skip option" #~ msgstr "option skip invalide" + +#, c-format +#~ msgid "number of parallel jobs must be at least 1" +#~ msgstr "le nombre maximum de jobs en parallèle doit être au moins de 1" + +#~ msgid "number of parallel jobs must be at least 1\n" +#~ msgstr "le nombre de jobs parallèles doit être au moins de 1\n" diff --git a/src/bin/pg_amcheck/po/ja.po b/src/bin/pg_amcheck/po/ja.po new file mode 100644 index 0000000000..7fbbcd347e --- /dev/null +++ b/src/bin/pg_amcheck/po/ja.po @@ -0,0 +1,545 @@ +# LANGUAGE message translation file for pg_amcheck +# Copyright (C) 2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package. +# FIRST AUTHOR , 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_amcheck (PostgreSQL 15)\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-05-11 14:16+0900\n" +"PO-Revision-Date: 2022-05-10 11:31+0900\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.13\n" + +#: ../../../src/common/logging.c:277 +#, c-format +msgid "error: " +msgstr "エラー: " + +#: ../../../src/common/logging.c:284 +#, c-format +msgid "warning: " +msgstr "警告: " + +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "ヒント: " + +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +msgid "Cancel request sent\n" +msgstr "キャンセル要求を送信しました\n" + +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +msgid "Could not send cancel request: " +msgstr "キャンセル要求を送信できませんでした: " + +#: ../../fe_utils/connect_utils.c:91 +#, c-format +msgid "could not connect to database %s: out of memory" +msgstr "データベース%sに接続できませんでした: メモリ不足です" + +#: ../../fe_utils/connect_utils.c:117 +#, c-format +msgid "%s" +msgstr "%s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "オプション%2$sに対する不正な値\"%1$s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%sは%d..%dの範囲になければなりません" + +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 +#: pg_amcheck.c:1645 pg_amcheck.c:2090 +#, c-format +msgid "query failed: %s" +msgstr "問い合わせが失敗しました: %s" + +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#: pg_amcheck.c:571 pg_amcheck.c:1100 pg_amcheck.c:1646 pg_amcheck.c:2091 +#, c-format +msgid "Query was: %s" +msgstr "問い合わせ: %s" + +#: pg_amcheck.c:399 +#, c-format +msgid "invalid argument for option %s" +msgstr "オプション%sの引数が不正です" + +#: pg_amcheck.c:405 +#, c-format +msgid "invalid start block" +msgstr "不正な開始ブロック" + +#: pg_amcheck.c:407 +#, c-format +msgid "start block out of bounds" +msgstr "開始ブロックが範囲外です" + +#: pg_amcheck.c:414 +#, c-format +msgid "invalid end block" +msgstr "不正な終了ブロック" + +#: pg_amcheck.c:416 +#, c-format +msgid "end block out of bounds" +msgstr "終了ブロックが範囲外です" + +#: pg_amcheck.c:439 pg_amcheck.c:461 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "詳細は\"%s --help\"を実行してください。" + +#: pg_amcheck.c:445 +#, c-format +msgid "end block precedes start block" +msgstr "終了ブロックが開始ブロックより前になっています" + +#: pg_amcheck.c:459 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")" + +#: pg_amcheck.c:479 +#, c-format +msgid "cannot specify a database name with --all" +msgstr "--allではデータベース名は指定できません" + +#: pg_amcheck.c:485 +#, c-format +msgid "cannot specify both a database name and database patterns" +msgstr "データベース名とデータベースパターンは同時に指定はできません" + +#: pg_amcheck.c:513 +#, c-format +msgid "no databases to check" +msgstr "検査すべきデータベースがありません" + +#: pg_amcheck.c:569 +#, c-format +msgid "database \"%s\": %s" +msgstr "データベース\"%s\": %s" + +#: pg_amcheck.c:580 +#, c-format +msgid "skipping database \"%s\": amcheck is not installed" +msgstr "データベース\"%s\"をスキップします: amcheckがインストールされていません" + +#: pg_amcheck.c:588 +#, c-format +msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" +msgstr "データベース\"%1$s\"内: スキーマ\"%3$s\"内でamcheck バージョン\"%2$s\"を使用中" + +#: pg_amcheck.c:610 +#, c-format +msgid "no heap tables to check matching \"%s\"" +msgstr "\"%s\"に合致する検査対象のヒープテーブルがありません" + +#: pg_amcheck.c:613 +#, c-format +msgid "no btree indexes to check matching \"%s\"" +msgstr "%s\"に合致する検査対象のbtreeインデックスがありません" + +#: pg_amcheck.c:616 +#, c-format +msgid "no relations to check in schemas matching \"%s\"" +msgstr "\"%s\"に合致するスキーマ内に検査対象のリレーションがありません" + +#: pg_amcheck.c:619 +#, c-format +msgid "no relations to check matching \"%s\"" +msgstr "\"%s\"に合致する検査対象のリレーションがありません" + +#: pg_amcheck.c:647 +#, c-format +msgid "no relations to check" +msgstr "検査対象のリレーションがありません" + +#: pg_amcheck.c:730 +#, c-format +msgid "checking heap table \"%s.%s.%s\"" +msgstr "ヒープテーブル\"%s.%s.%s\"を検査" + +#: pg_amcheck.c:746 +#, c-format +msgid "checking btree index \"%s.%s.%s\"" +msgstr "btreeインデックス\"%s.%s.%s\"を検査" + +#: pg_amcheck.c:893 +#, c-format +msgid "error sending command to database \"%s\": %s" +msgstr "データベース\"%s\"へのコマンド送出中のエラー: %s" + +#: pg_amcheck.c:896 +#, c-format +msgid "Command was: %s" +msgstr "コマンド: %s" + +#: pg_amcheck.c:1013 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" +msgstr "ヒープテーブル\"%s.%s.%s\"、ブロック%s、オフセット%s、属性%s:\n" + +#: pg_amcheck.c:1020 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" +msgstr "ヒープテーブル\"%s.%s.%s\"、ブロック%s、オフセット%s:\n" + +#: pg_amcheck.c:1026 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s:\n" +msgstr "ヒープテーブル\"%s.%s.%s\"、ブロック%s:\n" + +#: pg_amcheck.c:1031 pg_amcheck.c:1042 +#, c-format +msgid "heap table \"%s.%s.%s\":\n" +msgstr "ヒープテーブル\"%s.%s.%s\":\n" + +#: pg_amcheck.c:1046 pg_amcheck.c:1115 +#, c-format +msgid "query was: %s\n" +msgstr "問い合わせ: %s\n" + +#: pg_amcheck.c:1097 +#, c-format +msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" +msgstr "btreeインデックス\"%s.%s.%s\": btree検索関数が予期しない数の行を返却しました: %d" + +#: pg_amcheck.c:1101 +#, c-format +msgid "Are %s's and amcheck's versions compatible?" +msgstr "%sとamcheckのバージョンは合っていますか?" + +#: pg_amcheck.c:1111 +#, c-format +msgid "btree index \"%s.%s.%s\":\n" +msgstr "btreeインデックス\"%s.%s.%s\":\n" + +#: pg_amcheck.c:1136 +#, c-format +msgid "" +"%s checks objects in a PostgreSQL database for corruption.\n" +"\n" +msgstr "" +"%sはPostgreSQLデータベース内のオブジェクトの破損を検査します。\n" +"\n" + +#: pg_amcheck.c:1137 +#, c-format +msgid "Usage:\n" +msgstr "使用方法:\n" + +#: pg_amcheck.c:1138 +#, c-format +msgid " %s [OPTION]... [DBNAME]\n" +msgstr " %s [オプション]... [データベース名]\n" + +#: pg_amcheck.c:1139 +#, c-format +msgid "" +"\n" +"Target options:\n" +msgstr "" +"\n" +"対象指定オプション:\n" + +#: pg_amcheck.c:1140 +#, c-format +msgid " -a, --all check all databases\n" +msgstr " -a, --all すべてのデータベースを検査\n" + +#: pg_amcheck.c:1141 +#, c-format +msgid " -d, --database=PATTERN check matching database(s)\n" +msgstr " -d, --database=PATTERN 合致するデータベースを検査\n" + +#: pg_amcheck.c:1142 +#, c-format +msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" +msgstr " -D, --exclude-database=PATTERN 合致するデータベースを検査「しない」\n" + +#: pg_amcheck.c:1143 +#, c-format +msgid " -i, --index=PATTERN check matching index(es)\n" +msgstr " -i, --index=PATTERN 合致するインデックスを検査\n" + +#: pg_amcheck.c:1144 +#, c-format +msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" +msgstr " -I, --exclude-index=PATTERN 合致するインデックスを検査「しない」\n" + +#: pg_amcheck.c:1145 +#, c-format +msgid " -r, --relation=PATTERN check matching relation(s)\n" +msgstr " -r, --relation=PATTERN 合致するリレーションを検査\n" + +#: pg_amcheck.c:1146 +#, c-format +msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" +msgstr " -R, --exclude-relation=PATTERN 合致するリレーションを検査「しない」\n" + +#: pg_amcheck.c:1147 +#, c-format +msgid " -s, --schema=PATTERN check matching schema(s)\n" +msgstr " -s, --schema=PATTERN 合致するスキーマを検査\n" + +#: pg_amcheck.c:1148 +#, c-format +msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" +msgstr " -S, --exclude-schema=PATTERN 合致するスキーマを検査「しない」\n" + +#: pg_amcheck.c:1149 +#, c-format +msgid " -t, --table=PATTERN check matching table(s)\n" +msgstr " -t, --table=PATTERN 合致するテーブルを検査\n" + +#: pg_amcheck.c:1150 +#, c-format +msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" +msgstr " -T, --exclude-table=PATTERN 合致するテーブルを検査「しない」\n" + +#: pg_amcheck.c:1151 +#, c-format +msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" +msgstr "" +" --no-dependent-indexes リレーションのリストをインデックスを含むように\n" +" 拡張「しない」\n" + +#: pg_amcheck.c:1152 +#, c-format +msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" +msgstr "" +" --no-dependent-toast リレーションのリストをTOASTテーブルを含む\n" +" ように拡張「しない」\n" + +#: pg_amcheck.c:1153 +#, c-format +msgid " --no-strict-names do NOT require patterns to match objects\n" +msgstr "" +" --no-strict-names パターンがオブジェクトに合致することを必須と\n" +" しない\n" + +#: pg_amcheck.c:1154 +#, c-format +msgid "" +"\n" +"Table checking options:\n" +msgstr "" +"\n" +"テーブル検査オプション:\n" + +#: pg_amcheck.c:1155 +#, c-format +msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" +msgstr " --exclude-toast-pointers リレーションのTOASTポインタを追跡「しない」\n" + +#: pg_amcheck.c:1156 +#, c-format +msgid " --on-error-stop stop checking at end of first corrupt page\n" +msgstr " --on-error-stop 最初の破損ページの終わりで検査を中断する\n" + +#: pg_amcheck.c:1157 +#, c-format +msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" +msgstr "" +" --skip=OPTION \"all-frozen\"および\"all-visible\"である\n" +" ブロックを検査「しない」\n" + +#: pg_amcheck.c:1158 +#, c-format +msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" +msgstr "" +" --startblock=BLOCK 指定したブロック番号からテーブルの検査を\n" +" 開始する\n" + +#: pg_amcheck.c:1159 +#, c-format +msgid " --endblock=BLOCK check table(s) only up to the given block number\n" +msgstr " --endblock=BLOCK 指定したブロック番号までデーブルの検査を行う\n" + +#: pg_amcheck.c:1160 +#, c-format +msgid "" +"\n" +"B-tree index checking options:\n" +msgstr "" +"\n" +"B-treeインデックス検査オプション:\n" + +#: pg_amcheck.c:1161 +#, c-format +msgid " --heapallindexed check that all heap tuples are found within indexes\n" +msgstr "" +" --heapallindexed すべてのヒープタプルがインデックス内に\n" +" 見つかることを検査\n" + +#: pg_amcheck.c:1162 +#, c-format +msgid " --parent-check check index parent/child relationships\n" +msgstr " --parent-check インデックスの親子関係を検査\n" + +#: pg_amcheck.c:1163 +#, c-format +msgid " --rootdescend search from root page to refind tuples\n" +msgstr " --rootdescend タプル再探索をルートページから実行する\n" + +#: pg_amcheck.c:1164 +#, c-format +msgid "" +"\n" +"Connection options:\n" +msgstr "" +"\n" +"接続オプション:\n" + +#: pg_amcheck.c:1165 +#, c-format +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr "" +" -h, --host=HOSTNAME データベースサーバーのホストまたは\n" +" ソケットディレクトリ\n" + +#: pg_amcheck.c:1166 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT データベースサーバーのポート\n" + +#: pg_amcheck.c:1167 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=USERNAME 接続に用いるユーザー名\n" + +#: pg_amcheck.c:1168 +#, c-format +msgid " -w, --no-password never prompt for password\n" +msgstr " -w, --no-password パスワード入力を要求しない\n" + +#: pg_amcheck.c:1169 +#, c-format +msgid " -W, --password force password prompt\n" +msgstr " -W, --password パスワード入力要求を強制する\n" + +#: pg_amcheck.c:1170 +#, c-format +msgid " --maintenance-db=DBNAME alternate maintenance database\n" +msgstr " --maintenance-db=DBNAME 代替の保守データベース\n" + +#: pg_amcheck.c:1171 +#, c-format +msgid "" +"\n" +"Other options:\n" +msgstr "" +"\n" +"その他のオプション:\n" + +#: pg_amcheck.c:1172 +#, c-format +msgid " -e, --echo show the commands being sent to the server\n" +msgstr " -e, --echo サーバに送られるコマンドを表示\n" + +#: pg_amcheck.c:1173 +#, c-format +msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" +msgstr " -j, --jobs=NUM サーバーに対して指定した数の接続を使用する\n" + +#: pg_amcheck.c:1174 +#, c-format +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress 進行状況を表示\n" + +#: pg_amcheck.c:1175 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose 多くのメッセージを出力します\n" + +#: pg_amcheck.c:1176 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version バージョン情報を表示して終了\n" + +#: pg_amcheck.c:1177 +#, c-format +msgid " --install-missing install missing extensions\n" +msgstr " --install-missing 機能拡張がない場合にインストールする\n" + +#: pg_amcheck.c:1178 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help このヘルプを表示して終了\n" + +#: pg_amcheck.c:1180 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"バグは<%s>に報告してください。\n" + +#: pg_amcheck.c:1181 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s ホームページ: <%s>\n" + +#: pg_amcheck.c:1234 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" +msgstr "%*s/%s個のリレーション(%d%%), %*s/%sページ(%d%%) %*s" + +#: pg_amcheck.c:1245 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" +msgstr "%*s/%s個のリレーション(%d%%), %*s/%sページ(%d%%) (%s%-*.*s)" + +#: pg_amcheck.c:1260 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" +msgstr "%*s/%s個のリレーション(%d%%), %*s/%sページ(%d%%)" + +#: pg_amcheck.c:1319 pg_amcheck.c:1352 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "修飾名が不適切です(ドット区切りの名前が多すぎます): %s" + +#: pg_amcheck.c:1397 +#, c-format +msgid "improper relation name (too many dotted names): %s" +msgstr "リレーション名が不適切です(ドット区切りの名前が多すぎます): %s" + +#: pg_amcheck.c:1550 pg_amcheck.c:1689 +#, c-format +msgid "including database \"%s\"" +msgstr "データベース\"%s\"を含めます" + +#: pg_amcheck.c:1671 +#, c-format +msgid "internal error: received unexpected database pattern_id %d" +msgstr "内部エラー: 予期しないデータベースパターンID %dを受信" + +#: pg_amcheck.c:1673 +#, c-format +msgid "no connectable databases to check matching \"%s\"" +msgstr "\"%s\"に合致する検査対象の接続可能なデータベースがありません" + +#: pg_amcheck.c:2131 +#, c-format +msgid "internal error: received unexpected relation pattern_id %d" +msgstr "内部エラー: 予期しないリレーションパターンID %dを受信" diff --git a/src/bin/pg_amcheck/po/ru.po b/src/bin/pg_amcheck/po/ru.po new file mode 100644 index 0000000000..597228ffd5 --- /dev/null +++ b/src/bin/pg_amcheck/po/ru.po @@ -0,0 +1,581 @@ +# Alexander Lakhin , 2021. +msgid "" +msgstr "" +"Project-Id-Version: pg_amcheck (PostgreSQL) 14\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-02-07 11:21+0300\n" +"PO-Revision-Date: 2021-09-06 10:51+0300\n" +"Last-Translator: Alexander Lakhin \n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../../../src/common/logging.c:259 +#, c-format +msgid "fatal: " +msgstr "важно: " + +#: ../../../src/common/logging.c:266 +#, c-format +msgid "error: " +msgstr "ошибка: " + +#: ../../../src/common/logging.c:273 +#, c-format +msgid "warning: " +msgstr "предупреждение: " + +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +msgid "Cancel request sent\n" +msgstr "Сигнал отмены отправлен\n" + +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +msgid "Could not send cancel request: " +msgstr "Отправить сигнал отмены не удалось: " + +#: ../../fe_utils/connect_utils.c:92 +#, c-format +msgid "could not connect to database %s: out of memory" +msgstr "не удалось подключиться к базе %s (нехватка памяти)" + +#: ../../fe_utils/connect_utils.c:120 +#, c-format +msgid "%s" +msgstr "%s" + +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 +#: pg_amcheck.c:1657 pg_amcheck.c:2105 +#, c-format +msgid "query failed: %s" +msgstr "ошибка при выполнении запроса: %s" + +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#: pg_amcheck.c:598 pg_amcheck.c:1128 pg_amcheck.c:1658 pg_amcheck.c:2106 +#, c-format +msgid "query was: %s" +msgstr "запрос: %s" + +#: pg_amcheck.c:330 +#, c-format +msgid "number of parallel jobs must be at least 1" +msgstr "число параллельных заданий должно быть не меньше 1" + +#: pg_amcheck.c:402 +#, c-format +msgid "invalid argument for option %s" +msgstr "недопустимый аргумент параметра %s" + +#: pg_amcheck.c:411 +#, c-format +msgid "invalid start block" +msgstr "неверный начальный блок" + +#: pg_amcheck.c:416 +#, c-format +msgid "start block out of bounds" +msgstr "начальный блок вне допустимых пределов" + +#: pg_amcheck.c:426 +#, c-format +msgid "invalid end block" +msgstr "неверный конечный блок" + +#: pg_amcheck.c:431 +#, c-format +msgid "end block out of bounds" +msgstr "конечный блок вне допустимых пределов" + +#: pg_amcheck.c:456 pg_amcheck.c:482 +#, c-format +msgid "Try \"%s --help\" for more information.\n" +msgstr "Для дополнительной информации попробуйте \"%s --help\".\n" + +#: pg_amcheck.c:464 +#, c-format +msgid "end block precedes start block" +msgstr "конечный блок предшествует начальному" + +#: pg_amcheck.c:480 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "слишком много аргументов командной строки (первый: \"%s\")" + +#: pg_amcheck.c:501 +#, c-format +msgid "cannot specify a database name with --all" +msgstr "имя базы данных нельзя задавать с --all" + +#: pg_amcheck.c:510 +#, c-format +msgid "cannot specify both a database name and database patterns" +msgstr "нельзя задавать одновременно имя базы данных и шаблоны имён" + +#: pg_amcheck.c:540 +#, c-format +msgid "no databases to check" +msgstr "не указаны базы для проверки" + +#: pg_amcheck.c:596 +#, c-format +msgid "database \"%s\": %s" +msgstr "база данных \"%s\": %s" + +#: pg_amcheck.c:607 +#, c-format +msgid "skipping database \"%s\": amcheck is not installed" +msgstr "база \"%s\" пропускается: расширение amcheck не установлено" + +#: pg_amcheck.c:615 +#, c-format +msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" +msgstr "база \"%s\": используется amcheck версии \"%s\" в схеме \"%s\"" + +#: pg_amcheck.c:637 +#, c-format +msgid "no heap tables to check matching \"%s\"" +msgstr "не найдены подлежащие проверке базовые таблицы, соответствующие \"%s\"" + +#: pg_amcheck.c:640 +#, c-format +msgid "no btree indexes to check matching \"%s\"" +msgstr "не найдены подлежащие проверке индексы btree, соответствующие \"%s\"" + +#: pg_amcheck.c:643 +#, c-format +msgid "no relations to check in schemas matching \"%s\"" +msgstr "" +"не найдены подлежащие проверке отношения в схемах, соответствующих \"%s\"" + +#: pg_amcheck.c:646 +#, c-format +msgid "no relations to check matching \"%s\"" +msgstr "не найдены подлежащие проверке отношения, соответствующие \"%s\"" + +#: pg_amcheck.c:674 +#, c-format +msgid "no relations to check" +msgstr "не найдены отношения для проверки" + +#: pg_amcheck.c:758 +#, c-format +msgid "checking heap table \"%s.%s.%s\"" +msgstr "проверка базовой таблицы \"%s.%s.%s\"" + +#: pg_amcheck.c:774 +#, c-format +msgid "checking btree index \"%s.%s.%s\"" +msgstr "проверка индекса btree \"%s.%s.%s\"" + +#: pg_amcheck.c:921 +#, c-format +msgid "error sending command to database \"%s\": %s" +msgstr "ошибка передачи команды базе \"%s\": %s" + +#: pg_amcheck.c:924 +#, c-format +msgid "command was: %s" +msgstr "команда: %s" + +#: pg_amcheck.c:1041 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" +msgstr "базовая таблица \"%s.%s.%s\", блок %s, смещение %s, атрибут %s:\n" + +#: pg_amcheck.c:1048 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" +msgstr "базовая таблица \"%s.%s.%s\", блок %s, смещение %s:\n" + +#: pg_amcheck.c:1054 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s:\n" +msgstr "базовая таблица \"%s.%s.%s\", блок %s:\n" + +#: pg_amcheck.c:1059 pg_amcheck.c:1070 +#, c-format +msgid "heap table \"%s.%s.%s\":\n" +msgstr "базовая таблица \"%s.%s.%s\":\n" + +#: pg_amcheck.c:1074 pg_amcheck.c:1143 +#, c-format +msgid "query was: %s\n" +msgstr "запрос: %s\n" + +#: pg_amcheck.c:1125 +#, c-format +msgid "" +"btree index \"%s.%s.%s\": btree checking function returned unexpected number " +"of rows: %d" +msgstr "" +"индекс btree \"%s.%s.%s\": функция проверки btree выдала неожиданное " +"количество строк: %d" + +#: pg_amcheck.c:1129 +#, c-format +msgid "Are %s's and amcheck's versions compatible?" +msgstr "Совместимы ли версии %s и amcheck?" + +#: pg_amcheck.c:1139 +#, c-format +msgid "btree index \"%s.%s.%s\":\n" +msgstr "индекс btree \"%s.%s.%s\":\n" + +#: pg_amcheck.c:1164 +#, c-format +msgid "" +"%s checks objects in a PostgreSQL database for corruption.\n" +"\n" +msgstr "" +"%s проверяет объекты в базе данных PostgreSQL на предмет повреждений.\n" +"\n" + +#: pg_amcheck.c:1165 +#, c-format +msgid "Usage:\n" +msgstr "Использование:\n" + +#: pg_amcheck.c:1166 +#, c-format +msgid " %s [OPTION]... [DBNAME]\n" +msgstr " %s [ПАРАМЕТР]... [ИМЯ_БД]\n" + +#: pg_amcheck.c:1167 +#, c-format +msgid "" +"\n" +"Target options:\n" +msgstr "" +"\n" +"Параметры выбора объектов:\n" + +#: pg_amcheck.c:1168 +#, c-format +msgid " -a, --all check all databases\n" +msgstr " -a, --all проверить все базы\n" + +#: pg_amcheck.c:1169 +#, c-format +msgid " -d, --database=PATTERN check matching database(s)\n" +msgstr "" +" -d, --database=ШАБЛОН проверить соответствующие шаблону базы\n" + +#: pg_amcheck.c:1170 +#, c-format +msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" +msgstr "" +" -D, --exclude-database=ШАБЛОН не проверять соответствующие шаблону базы\n" + +#: pg_amcheck.c:1171 +#, c-format +msgid " -i, --index=PATTERN check matching index(es)\n" +msgstr "" +" -i, --index=ШАБЛОН проверить соответствующие шаблону индексы\n" + +#: pg_amcheck.c:1172 +#, c-format +msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" +msgstr "" +" -I, --exclude-index=ШАБЛОН не проверять соответствующие шаблону " +"индексы\n" + +#: pg_amcheck.c:1173 +#, c-format +msgid " -r, --relation=PATTERN check matching relation(s)\n" +msgstr "" +" -r, --relation=ШАБЛОН проверить соответствующие шаблону " +"отношения\n" + +#: pg_amcheck.c:1174 +#, c-format +msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" +msgstr "" +" -R, --exclude-relation=ШАБЛОН не проверять соответствующие шаблону " +"отношения\n" + +#: pg_amcheck.c:1175 +#, c-format +msgid " -s, --schema=PATTERN check matching schema(s)\n" +msgstr "" +" -s, --schema=ШАБЛОН проверить соответствующие шаблону схемы\n" + +#: pg_amcheck.c:1176 +#, c-format +msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" +msgstr "" +" -S, --exclude-schema=ШАБЛОН не проверять соответствующие шаблону " +"схемы\n" + +#: pg_amcheck.c:1177 +#, c-format +msgid " -t, --table=PATTERN check matching table(s)\n" +msgstr "" +" -t, --table=ШАБЛОН проверить соответствующие шаблону таблицы\n" + +#: pg_amcheck.c:1178 +#, c-format +msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" +msgstr "" +" -T, --exclude-table=ШАБЛОН не проверять соответствующие шаблону " +"таблицы\n" + +#: pg_amcheck.c:1179 +#, c-format +msgid "" +" --no-dependent-indexes do NOT expand list of relations to include " +"indexes\n" +msgstr "" +" --no-dependent-indexes не включать в список проверяемых отношений " +"индексы\n" + +#: pg_amcheck.c:1180 +#, c-format +msgid "" +" --no-dependent-toast do NOT expand list of relations to include " +"TOAST tables\n" +msgstr "" +" --no-dependent-toast не включать в список проверяемых отношений " +"TOAST-таблицы\n" + +#: pg_amcheck.c:1181 +#, c-format +msgid "" +" --no-strict-names do NOT require patterns to match objects\n" +msgstr "" +" --no-strict-names не требовать наличия объектов, " +"соответствующих шаблонам\n" + +#: pg_amcheck.c:1182 +#, c-format +msgid "" +"\n" +"Table checking options:\n" +msgstr "" +"\n" +"Параметры проверки таблиц:\n" + +#: pg_amcheck.c:1183 +#, c-format +msgid "" +" --exclude-toast-pointers do NOT follow relation TOAST pointers\n" +msgstr "" +" --exclude-toast-pointers не переходить по указателям в TOAST\n" + +#: pg_amcheck.c:1184 +#, c-format +msgid "" +" --on-error-stop stop checking at end of first corrupt " +"page\n" +msgstr "" +" --on-error-stop прекратить проверку по достижении конца " +"первой повреждённой страницы\n" + +#: pg_amcheck.c:1185 +#, c-format +msgid "" +" --skip=OPTION do NOT check \"all-frozen\" or \"all-" +"visible\" blocks\n" +msgstr "" +" --skip=ТИП_БЛОКА не проверять блоки типа \"all-frozen\" или " +"\"all-visible\"\n" + +#: pg_amcheck.c:1186 +#, c-format +msgid "" +" --startblock=BLOCK begin checking table(s) at the given block " +"number\n" +msgstr "" +" --startblock=БЛОК начать проверку таблиц(ы) с блока с " +"заданным номером\n" + +# skip-rule: no-space-before-parentheses +#: pg_amcheck.c:1187 +#, c-format +msgid "" +" --endblock=BLOCK check table(s) only up to the given block " +"number\n" +msgstr "" +" --endblock=БЛОК проверить таблицы(у) до блока с заданным " +"номером\n" + +#: pg_amcheck.c:1188 +#, c-format +msgid "" +"\n" +"B-tree index checking options:\n" +msgstr "" +"\n" +"Параметры проверки индексов-B-деревьев:\n" + +#: pg_amcheck.c:1189 +#, c-format +msgid "" +" --heapallindexed check that all heap tuples are found " +"within indexes\n" +msgstr "" +" --heapallindexed проверить, что всем кортежам кучи " +"находится соответствие в индексах\n" + +#: pg_amcheck.c:1190 +#, c-format +msgid "" +" --parent-check check index parent/child relationships\n" +msgstr "" +" --parent-check проверить связи родитель/потомок в " +"индексах\n" + +#: pg_amcheck.c:1191 +#, c-format +msgid "" +" --rootdescend search from root page to refind tuples\n" +msgstr "" +" --rootdescend перепроверять поиск кортежей от корневой " +"страницы\n" + +#: pg_amcheck.c:1192 +#, c-format +msgid "" +"\n" +"Connection options:\n" +msgstr "" +"\n" +"Параметры подключения:\n" + +#: pg_amcheck.c:1193 +#, c-format +msgid "" +" -h, --host=HOSTNAME database server host or socket directory\n" +msgstr "" +" -h, --host=ИМЯ имя сервера баз данных или каталог " +"сокетов\n" + +#: pg_amcheck.c:1194 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=ПОРТ порт сервера баз данных\n" + +#: pg_amcheck.c:1195 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr "" +" -U, --username=ИМЯ имя пользователя для подключения к " +"серверу\n" + +#: pg_amcheck.c:1196 +#, c-format +msgid " -w, --no-password never prompt for password\n" +msgstr " -w, --no-password не запрашивать пароль\n" + +#: pg_amcheck.c:1197 +#, c-format +msgid " -W, --password force password prompt\n" +msgstr " -W, --password запросить пароль\n" + +#: pg_amcheck.c:1198 +#, c-format +msgid " --maintenance-db=DBNAME alternate maintenance database\n" +msgstr " --maintenance-db=ИМЯ_БД другая опорная база данных\n" + +#: pg_amcheck.c:1199 +#, c-format +msgid "" +"\n" +"Other options:\n" +msgstr "" +"\n" +"Другие параметры:\n" + +#: pg_amcheck.c:1200 +#, c-format +msgid "" +" -e, --echo show the commands being sent to the " +"server\n" +msgstr "" +" -e, --echo отображать команды, отправляемые серверу\n" + +#: pg_amcheck.c:1201 +#, c-format +msgid "" +" -j, --jobs=NUM use this many concurrent connections to " +"the server\n" +msgstr "" +" -j, --jobs=ЧИСЛО устанавливать заданное число подключений к " +"серверу\n" + +#: pg_amcheck.c:1202 +#, c-format +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress показывать прогресс операции\n" + +#: pg_amcheck.c:1203 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose выводить исчерпывающие сообщения\n" + +#: pg_amcheck.c:1204 +#, c-format +msgid "" +" -V, --version output version information, then exit\n" +msgstr " -V, --version показать версию и выйти\n" + +#: pg_amcheck.c:1205 +#, c-format +msgid " --install-missing install missing extensions\n" +msgstr " --install-missing установить недостающие расширения\n" + +#: pg_amcheck.c:1206 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help показать эту справку и выйти\n" + +#: pg_amcheck.c:1208 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Об ошибках сообщайте по адресу <%s>.\n" + +#: pg_amcheck.c:1209 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "Домашняя страница %s: <%s>\n" + +#: pg_amcheck.c:1267 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" +msgstr "отношений: %*s/%s (%d%%), страниц: %*s/%s (%d%%) %*s" + +#: pg_amcheck.c:1278 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" +msgstr "отношений: %*s/%s (%d%%), страниц: %*s/%s (%d%%) (%s%-*.*s)" + +#: pg_amcheck.c:1293 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" +msgstr "отношений: %*s/%s (%d%%), страниц: %*s/%s (%d%%)" + +#: pg_amcheck.c:1562 pg_amcheck.c:1704 +#, c-format +msgid "including database \"%s\"" +msgstr "выбирается база \"%s\"" + +#: pg_amcheck.c:1684 +#, c-format +msgid "internal error: received unexpected database pattern_id %d" +msgstr "внутренняя ошибка: получен неожиданный идентификатор шаблона базы %d" + +#: pg_amcheck.c:1688 +#, c-format +msgid "no connectable databases to check matching \"%s\"" +msgstr "" +"не найдены подлежащие проверке доступные базы, соответствующие шаблону \"%s\"" + +#: pg_amcheck.c:2147 +#, c-format +msgid "internal error: received unexpected relation pattern_id %d" +msgstr "" +"внутренняя ошибка: получен неожиданный идентификатор шаблона отношения %d" diff --git a/src/bin/pg_amcheck/po/sv.po b/src/bin/pg_amcheck/po/sv.po new file mode 100644 index 0000000000..96aa844ed2 --- /dev/null +++ b/src/bin/pg_amcheck/po/sv.po @@ -0,0 +1,546 @@ +# SWEDISH message translation file for pg_amcheck +# Copyright (C) 2021 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package. +# Dennis Björklund , 2021, 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: PostgreSQL 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-05-09 18:50+0000\n" +"PO-Revision-Date: 2022-05-09 21:45+0200\n" +"Last-Translator: Dennis Björklund \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../../../src/common/logging.c:277 +#, c-format +msgid "error: " +msgstr "fel: " + +#: ../../../src/common/logging.c:284 +#, c-format +msgid "warning: " +msgstr "varning: " + +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "tips: " + +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +msgid "Cancel request sent\n" +msgstr "Förfrågan om avbrytning skickad\n" + +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +msgid "Could not send cancel request: " +msgstr "Kunde inte skicka förfrågan om avbrytning: " + +#: ../../fe_utils/connect_utils.c:91 +#, c-format +msgid "could not connect to database %s: out of memory" +msgstr "kunde inte ansluta till databas %s: slut på minne" + +#: ../../fe_utils/connect_utils.c:117 +#, c-format +msgid "%s" +msgstr "%s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s måste vara i intervallet %d..%d" + +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 +#: pg_amcheck.c:1645 pg_amcheck.c:2090 +#, c-format +msgid "query failed: %s" +msgstr "fråga misslyckades: %s" + +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#: pg_amcheck.c:571 pg_amcheck.c:1100 pg_amcheck.c:1646 pg_amcheck.c:2091 +#, c-format +msgid "Query was: %s" +msgstr "Frågan var: %s" + +#: pg_amcheck.c:399 +#, c-format +msgid "invalid argument for option %s" +msgstr "ogiltigt argument för flaggan %s" + +#: pg_amcheck.c:405 +#, c-format +msgid "invalid start block" +msgstr "ogiltigt startblock" + +#: pg_amcheck.c:407 +#, c-format +msgid "start block out of bounds" +msgstr "startblocket utanför giltig gräns" + +#: pg_amcheck.c:414 +#, c-format +msgid "invalid end block" +msgstr "ogiltigt slutblock" + +#: pg_amcheck.c:416 +#, c-format +msgid "end block out of bounds" +msgstr "slutblocket utanför giltig gräns" + +#: pg_amcheck.c:439 pg_amcheck.c:461 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." + +#: pg_amcheck.c:445 +#, c-format +msgid "end block precedes start block" +msgstr "slutblocket kommer före startblocket" + +#: pg_amcheck.c:459 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "för många kommandoradsargument (första är \"%s\")" + +#: pg_amcheck.c:479 +#, c-format +msgid "cannot specify a database name with --all" +msgstr "kan inte ange databasnamn tillsammans med --all" + +#: pg_amcheck.c:485 +#, c-format +msgid "cannot specify both a database name and database patterns" +msgstr "kan inte ange både ett databasnamn och ett databasmönster" + +#: pg_amcheck.c:513 +#, c-format +msgid "no databases to check" +msgstr "inga databaser att kontrollera" + +#: pg_amcheck.c:569 +#, c-format +msgid "database \"%s\": %s" +msgstr "databas \"%s\": %s" + +#: pg_amcheck.c:580 +#, c-format +msgid "skipping database \"%s\": amcheck is not installed" +msgstr "hoppar över databas \"%s\": amcheck är inte installerad" + +#: pg_amcheck.c:588 +#, c-format +msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" +msgstr "i databas \"%s\": använder amcheck version \"%s\" i schema \"%s\"" + +#: pg_amcheck.c:610 +#, c-format +msgid "no heap tables to check matching \"%s\"" +msgstr "finns inga heap-tabeller för att kontrollera matchning \"%s\"" + +#: pg_amcheck.c:613 +#, c-format +msgid "no btree indexes to check matching \"%s\"" +msgstr "finns inga btree-index för att kontrollera matching \"%s\"" + +#: pg_amcheck.c:616 +#, c-format +msgid "no relations to check in schemas matching \"%s\"" +msgstr "finns inga relationer att kontrollera i schemamatchning \"%s\"" + +#: pg_amcheck.c:619 +#, c-format +msgid "no relations to check matching \"%s\"" +msgstr "finns inga relations för att kontrollera matching \"%s\"" + +#: pg_amcheck.c:647 +#, c-format +msgid "no relations to check" +msgstr "finns inga relationer att kontrollera" + +#: pg_amcheck.c:730 +#, c-format +msgid "checking heap table \"%s.%s.%s\"" +msgstr "kontrollerar heap-tabell \"%s.%s.%s\"" + +#: pg_amcheck.c:746 +#, c-format +msgid "checking btree index \"%s.%s.%s\"" +msgstr "kontrollerar btree-index \"%s.%s.%s\"" + +#: pg_amcheck.c:893 +#, c-format +msgid "error sending command to database \"%s\": %s" +msgstr "fel vid skickande av kommando till databas \"%s\": %s" + +#: pg_amcheck.c:896 +#, c-format +msgid "Command was: %s" +msgstr "Kommandot var: %s" + +#: pg_amcheck.c:1013 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" +msgstr "heap-tabell \"%s.%s.%s\", block %s, offset %s, attribut %s:\n" + +#: pg_amcheck.c:1020 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" +msgstr "heap-tabell \"%s.%s.%s\", block %s, offset %s:\n" + +#: pg_amcheck.c:1026 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s:\n" +msgstr "heap-tabell \"%s.%s.%s\", block %s:\n" + +#: pg_amcheck.c:1031 pg_amcheck.c:1042 +#, c-format +msgid "heap table \"%s.%s.%s\":\n" +msgstr "heap-tabell \"%s.%s.%s\":\n" + +#: pg_amcheck.c:1046 pg_amcheck.c:1115 +#, c-format +msgid "query was: %s\n" +msgstr "frågan var: %s\n" + +#: pg_amcheck.c:1097 +#, c-format +msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" +msgstr "btree-index \"%s.%s.%s\": kontrollfunktion för btree returnerade oväntat antal rader: %d" + +#: pg_amcheck.c:1101 +#, c-format +msgid "Are %s's and amcheck's versions compatible?" +msgstr "Är versionerna på %s och amcheck kompatibla?" + +#: pg_amcheck.c:1111 +#, c-format +msgid "btree index \"%s.%s.%s\":\n" +msgstr "btree-index \"%s.%s.%s\":\n" + +#: pg_amcheck.c:1136 +#, c-format +msgid "" +"%s checks objects in a PostgreSQL database for corruption.\n" +"\n" +msgstr "" +"%s kontrollerar objekt i en PostgreSQL-database för att hitta korruption.\n" +"\n" + +#: pg_amcheck.c:1137 +#, c-format +msgid "Usage:\n" +msgstr "Användning:\n" + +#: pg_amcheck.c:1138 +#, c-format +msgid " %s [OPTION]... [DBNAME]\n" +msgstr " %s [FLAGGA]... [DBNAMN]\n" + +#: pg_amcheck.c:1139 +#, c-format +msgid "" +"\n" +"Target options:\n" +msgstr "" +"\n" +"Flaggor för destinationen:\n" + +#: pg_amcheck.c:1140 +#, c-format +msgid " -a, --all check all databases\n" +msgstr " -a, --all kontrollera alla databaser\n" + +#: pg_amcheck.c:1141 +#, c-format +msgid " -d, --database=PATTERN check matching database(s)\n" +msgstr " -d, --database=MALL kontrollera matchande databas(er)\n" + +#: pg_amcheck.c:1142 +#, c-format +msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" +msgstr " -D, --exclude-database=MALL kontrollera INTE matchande databas(er)\n" + +#: pg_amcheck.c:1143 +#, c-format +msgid " -i, --index=PATTERN check matching index(es)\n" +msgstr " -i, --index=MALL kontrollera matchande index\n" + +#: pg_amcheck.c:1144 +#, c-format +msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" +msgstr " -I, --exclude-index=MALL kontrollera INTE matchande index\n" + +#: pg_amcheck.c:1145 +#, c-format +msgid " -r, --relation=PATTERN check matching relation(s)\n" +msgstr " -r, --relation=MALL kontrollera matchande relation(er)\n" + +#: pg_amcheck.c:1146 +#, c-format +msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" +msgstr " -R, --exclude-relation=MALL kontrollera INTE matchande relation(er)\n" + +#: pg_amcheck.c:1147 +#, c-format +msgid " -s, --schema=PATTERN check matching schema(s)\n" +msgstr " -s, --schema=MALL kontrollera matchande schema(n)\n" + +#: pg_amcheck.c:1148 +#, c-format +msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" +msgstr " -S, --exclude-schema=MALL kontrollera INTE matchande schema(n)\n" + +#: pg_amcheck.c:1149 +#, c-format +msgid " -t, --table=PATTERN check matching table(s)\n" +msgstr " -t, --table=MALL kontollera matchande tabell(er)\n" + +#: pg_amcheck.c:1150 +#, c-format +msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" +msgstr " -T, --exclude-table=MALL kontollera INTE matchande tabell(er)\n" + +#: pg_amcheck.c:1151 +#, c-format +msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" +msgstr " --no-dependent-indexes expandera INTE listan med relationer för att inkludera index\n" + +#: pg_amcheck.c:1152 +#, c-format +msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" +msgstr " --no-dependent-toast expandera inte listan av relationer för att inkludera TOAST-tabeller\n" + +#: pg_amcheck.c:1153 +#, c-format +msgid " --no-strict-names do NOT require patterns to match objects\n" +msgstr " --no-strict-names kräv INTE mallar för matcha objekt\n" + +#: pg_amcheck.c:1154 +#, c-format +msgid "" +"\n" +"Table checking options:\n" +msgstr "" +"\n" +"Flaggor för kontroll av tabeller:\n" + +#: pg_amcheck.c:1155 +#, c-format +msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" +msgstr " --exclude-toast-pointers följ INTE relationers TOAST-pekare\n" + +#: pg_amcheck.c:1156 +#, c-format +msgid " --on-error-stop stop checking at end of first corrupt page\n" +msgstr " --on-error-stop sluta kontrollera efter första korrupta sidan\n" + +#: pg_amcheck.c:1157 +#, c-format +msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" +msgstr " --skip=FLAGGA kontrollera INTE block som är \"all-frozen\" eller \"all-visible\"\n" + +#: pg_amcheck.c:1158 +#, c-format +msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" +msgstr " --startblock=BLOCK börja kontollera tabell(er) vid angivet blocknummer\n" + +#: pg_amcheck.c:1159 +#, c-format +msgid " --endblock=BLOCK check table(s) only up to the given block number\n" +msgstr " --endblock=BLOCK kontrollera tabell(er) fram till angivet blocknummer\n" + +#: pg_amcheck.c:1160 +#, c-format +msgid "" +"\n" +"B-tree index checking options:\n" +msgstr "" +"\n" +"Flaggor för kontroll av B-tree-index:\n" + +#: pg_amcheck.c:1161 +#, c-format +msgid " --heapallindexed check that all heap tuples are found within indexes\n" +msgstr " --heapallindexed kontrollera att alla heap-tupler hittas i index\n" + +#: pg_amcheck.c:1162 +#, c-format +msgid " --parent-check check index parent/child relationships\n" +msgstr " --parent-check kontrollera förhållandet mellan barn/förälder i index\n" + +#: pg_amcheck.c:1163 +#, c-format +msgid " --rootdescend search from root page to refind tuples\n" +msgstr " --rootdescend sök från root-sidan för att återfinna tupler\n" + +#: pg_amcheck.c:1164 +#, c-format +msgid "" +"\n" +"Connection options:\n" +msgstr "" +"\n" +"Flaggor för anslutning:\n" + +#: pg_amcheck.c:1165 +#, c-format +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n" + +#: pg_amcheck.c:1166 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT databasserverns port\n" + +#: pg_amcheck.c:1167 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n" + +#: pg_amcheck.c:1168 +#, c-format +msgid " -w, --no-password never prompt for password\n" +msgstr " -w, --no-password fråga ej efter lösenord\n" + +#: pg_amcheck.c:1169 +#, c-format +msgid " -W, --password force password prompt\n" +msgstr " -W, --password tvinga fram lösenordsfråga\n" + +#: pg_amcheck.c:1170 +#, c-format +msgid " --maintenance-db=DBNAME alternate maintenance database\n" +msgstr " --maintenance-db=DBNAMN val av underhållsdatabas\n" + +#: pg_amcheck.c:1171 +#, c-format +msgid "" +"\n" +"Other options:\n" +msgstr "" +"\n" +"Andra flaggor:\n" + +#: pg_amcheck.c:1172 +#, c-format +msgid " -e, --echo show the commands being sent to the server\n" +msgstr " -e, --echo visa kommandon som skickas till servern\n" + +#: pg_amcheck.c:1173 +#, c-format +msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" +msgstr " -j, --jobs=NUM antal samtidiga anslutningar till servern\n" + +#: pg_amcheck.c:1174 +#, c-format +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress visa förloppsinformation\n" + +#: pg_amcheck.c:1175 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose skriv massor med utdata\n" + +#: pg_amcheck.c:1176 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version visa versionsinformation, avsluta sedan\n" + +#: pg_amcheck.c:1177 +#, c-format +msgid " --install-missing install missing extensions\n" +msgstr " --install-missing installera utökningar som saknas\n" + +#: pg_amcheck.c:1178 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help visa denna hjälp, avsluta sedan\n" + +#: pg_amcheck.c:1180 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Rapportera fel till <%s>.\n" + +#: pg_amcheck.c:1181 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "hemsida för %s: <%s>\n" + +#: pg_amcheck.c:1234 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" +msgstr "%*s/%s relationer (%d%%), %*s/%s sidor (%d%%) %*s" + +#: pg_amcheck.c:1245 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" +msgstr "%*s/%s relationer (%d%%), %*s/%s sidor (%d%%) (%s%-*.*s)" + +#: pg_amcheck.c:1260 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" +msgstr "%*s/%s relationer (%d%%), %*s/%s sidor (%d%%)" + +#: pg_amcheck.c:1319 pg_amcheck.c:1352 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "ej korrekt kvalificerat namn (för många namn med punkt): %s" + +#: pg_amcheck.c:1397 +#, c-format +msgid "improper relation name (too many dotted names): %s" +msgstr "ej korrekt relationsnamn (för många namn med punkt): %s" + +#: pg_amcheck.c:1550 pg_amcheck.c:1689 +#, c-format +msgid "including database \"%s\"" +msgstr "inkludera databas \"%s\"" + +#: pg_amcheck.c:1671 +#, c-format +msgid "internal error: received unexpected database pattern_id %d" +msgstr "internt fel: tog emot oväntat pattern_id %d för databas" + +#: pg_amcheck.c:1673 +#, c-format +msgid "no connectable databases to check matching \"%s\"" +msgstr "finns inga anslutningsbara databaser att kontrollera som matchar \"%s\"" + +#: pg_amcheck.c:2131 +#, c-format +msgid "internal error: received unexpected relation pattern_id %d" +msgstr "internt fel: tog emot oväntat pattern_id %d för relation" + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Försök med \"%s --help\" för mer information.\n" + +#, c-format +#~ msgid "command was: %s" +#~ msgstr "kommandot var: %s" + +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatalt: " + +#, c-format +#~ msgid "number of parallel jobs must be at least 1" +#~ msgstr "antalet parallella jobb måste vara minst 1" diff --git a/src/bin/pg_amcheck/po/uk.po b/src/bin/pg_amcheck/po/uk.po new file mode 100644 index 0000000000..ba3c2fc2fb --- /dev/null +++ b/src/bin/pg_amcheck/po/uk.po @@ -0,0 +1,501 @@ +msgid "" +msgstr "" +"Project-Id-Version: postgresql\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2021-08-17 08:48+0000\n" +"PO-Revision-Date: 2021-08-17 11:21\n" +"Last-Translator: \n" +"Language-Team: Ukrainian\n" +"Language: uk_UA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: postgresql\n" +"X-Crowdin-Project-ID: 324573\n" +"X-Crowdin-Language: uk\n" +"X-Crowdin-File: /REL_14_DEV/pg_amcheck.pot\n" +"X-Crowdin-File-ID: 786\n" + +#: ../../../src/common/logging.c:259 +#, c-format +msgid "fatal: " +msgstr "збій: " + +#: ../../../src/common/logging.c:266 +#, c-format +msgid "error: " +msgstr "помилка: " + +#: ../../../src/common/logging.c:273 +#, c-format +msgid "warning: " +msgstr "попередження: " + +#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +msgid "Cancel request sent\n" +msgstr "Запит на скасування відправлений\n" + +#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 +msgid "Could not send cancel request: " +msgstr "Не вдалося надіслати запит на скасування: " + +#: ../../fe_utils/connect_utils.c:92 +#, c-format +msgid "could not connect to database %s: out of memory" +msgstr "не можливо під'єднатися до бази даних %s: не вистачає пам'яті" + +#: ../../fe_utils/connect_utils.c:120 +#, c-format +msgid "%s" +msgstr "%s" + +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 +#: pg_amcheck.c:1646 pg_amcheck.c:2085 +#, c-format +msgid "query failed: %s" +msgstr "запит не вдався: %s" + +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#: pg_amcheck.c:597 pg_amcheck.c:1116 pg_amcheck.c:1647 pg_amcheck.c:2086 +#, c-format +msgid "query was: %s" +msgstr "запит був: %s" + +#: pg_amcheck.c:332 +#, c-format +msgid "number of parallel jobs must be at least 1" +msgstr "число паралельних завдань повинно бути не менше 1" + +#: pg_amcheck.c:405 +#, c-format +msgid "invalid argument for option %s" +msgstr "неприпустимий аргумент для параметру %s" + +#: pg_amcheck.c:413 +#, c-format +msgid "invalid start block" +msgstr "неприпустимий початковий блок" + +#: pg_amcheck.c:418 +#, c-format +msgid "start block out of bounds" +msgstr "початковий блок поза межами" + +#: pg_amcheck.c:426 +#, c-format +msgid "invalid end block" +msgstr "неприпустимий кінцевий блок" + +#: pg_amcheck.c:431 +#, c-format +msgid "end block out of bounds" +msgstr "кінцевий блок поза межами" + +#: pg_amcheck.c:455 pg_amcheck.c:481 +#, c-format +msgid "Try \"%s --help\" for more information.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" + +#: pg_amcheck.c:463 +#, c-format +msgid "end block precedes start block" +msgstr "кінцевий блок передує початковому блоку" + +#: pg_amcheck.c:479 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "забагато аргументів у командному рядку (перший \"%s\")" + +#: pg_amcheck.c:500 +#, c-format +msgid "cannot specify a database name with --all" +msgstr "не можна вказати назву бази даних з --all" + +#: pg_amcheck.c:509 +#, c-format +msgid "cannot specify both a database name and database patterns" +msgstr "не можна вказати одночасно ім'я бази даних і шаблони бази даних" + +#: pg_amcheck.c:539 +#, c-format +msgid "no databases to check" +msgstr "немає баз даних для перевірки" + +#: pg_amcheck.c:595 +#, c-format +msgid "database \"%s\": %s" +msgstr "база даних \"%s\": %s" + +#: pg_amcheck.c:606 +#, c-format +msgid "skipping database \"%s\": amcheck is not installed" +msgstr "пропуск бази даних \"%s\": amcheck не встановлено" + +#: pg_amcheck.c:614 +#, c-format +msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" +msgstr "у базі даних \"%s\": використовується amcheck версії \"%s\" у схемі \"%s\"" + +#: pg_amcheck.c:638 +#, c-format +msgid "no heap tables to check matching \"%s\"" +msgstr "немає таблиць в динамічній пам'яті для перевірки відповідності \"%s\"" + +#: pg_amcheck.c:641 +#, c-format +msgid "no btree indexes to check matching \"%s\"" +msgstr "немає індексів btree для перевірки відповідності \"%s\"" + +#: pg_amcheck.c:644 +#, c-format +msgid "no relations to check in schemas matching \"%s\"" +msgstr "немає відношень для перевірки в схемах, відповідних \"%s\"" + +#: pg_amcheck.c:647 +#, c-format +msgid "no relations to check matching \"%s\"" +msgstr "немає відношень для перевірки відповідності \"%s\"" + +#: pg_amcheck.c:676 +#, c-format +msgid "no relations to check" +msgstr "немає зв'язків для перевірки" + +#: pg_amcheck.c:762 +#, c-format +msgid "checking heap table \"%s.%s.%s\"" +msgstr "перевірка таблиць динамічної пам'яті \"%s.%s.%s\"" + +#: pg_amcheck.c:778 +#, c-format +msgid "checking btree index \"%s.%s.%s\"" +msgstr "перевірка індексу btree \"%s.%s.%s\"" + +#: pg_amcheck.c:911 +#, c-format +msgid "error sending command to database \"%s\": %s" +msgstr "помилка надсилання команди до бази даних \"%s: %s" + +#: pg_amcheck.c:914 +#, c-format +msgid "command was: %s" +msgstr "команда була: %s" + +#: pg_amcheck.c:1031 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" +msgstr "таблиця динамічної пам'яті \"%s.%s.%s\", блок %s, зсув %s, атрибут %s:\n" + +#: pg_amcheck.c:1038 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" +msgstr "таблиця динамічної пам'яті \"%s.%s.%s\", блок %s, зсув %s:\n" + +#: pg_amcheck.c:1044 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s:\n" +msgstr "таблиця динамічної пам'яті \"%s.%s.%s\", блок %s:\n" + +#: pg_amcheck.c:1049 pg_amcheck.c:1060 +#, c-format +msgid "heap table \"%s.%s.%s\":\n" +msgstr "таблиця динамічної пам'яті \"%s.%s.%s\":\n" + +#: pg_amcheck.c:1064 pg_amcheck.c:1131 +#, c-format +msgid "query was: %s\n" +msgstr "запит був: %s\n" + +#: pg_amcheck.c:1113 +#, c-format +msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" +msgstr "індекс btree \"%s.%s.%s\": функція перевірки btree повернула неочікувану кількість рядків: %d" + +#: pg_amcheck.c:1117 +#, c-format +msgid "Are %s's and amcheck's versions compatible?" +msgstr "Чи сумісні версії %s і amcheck?" + +#: pg_amcheck.c:1127 +#, c-format +msgid "btree index \"%s.%s.%s\":\n" +msgstr "індекс btree \"%s.%s.%s\":\n" + +#: pg_amcheck.c:1152 +#, c-format +msgid "%s checks objects in a PostgreSQL database for corruption.\n\n" +msgstr "%s перевіряє об'єкти бази даних PostgreSQL на пошкодження.\n\n" + +#: pg_amcheck.c:1153 +#, c-format +msgid "Usage:\n" +msgstr "Використання:\n" + +#: pg_amcheck.c:1154 +#, c-format +msgid " %s [OPTION]... [DBNAME]\n" +msgstr " %s [OPTION]... [DBNAME]\n" + +#: pg_amcheck.c:1155 +#, c-format +msgid "\n" +"Target options:\n" +msgstr "\n" +"Цільові параметри:\n" + +#: pg_amcheck.c:1156 +#, c-format +msgid " -a, --all check all databases\n" +msgstr " -a, --all перевірити всі бази даних\n" + +#: pg_amcheck.c:1157 +#, c-format +msgid " -d, --database=PATTERN check matching database(s)\n" +msgstr " -d, --database=PATTERN перевірити відповідні бази даних\n" + +#: pg_amcheck.c:1158 +#, c-format +msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" +msgstr " -D, --exclude-database=PATTERN НЕ перевіряти відповідні бази даних\n" + +#: pg_amcheck.c:1159 +#, c-format +msgid " -i, --index=PATTERN check matching index(es)\n" +msgstr " -i, --index=PATTERN перевірити відповідні індекси\n" + +#: pg_amcheck.c:1160 +#, c-format +msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" +msgstr " -I, --exclude-index=PATTERN НЕ перевіряти відповідні індекси\n" + +#: pg_amcheck.c:1161 +#, c-format +msgid " -r, --relation=PATTERN check matching relation(s)\n" +msgstr " -r, --relation=PATTERN перевірити відповідні відношення\n" + +#: pg_amcheck.c:1162 +#, c-format +msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" +msgstr " -R, --exclude-relation=PATTERN НЕ перевіряти відповідні відношення\n" + +#: pg_amcheck.c:1163 +#, c-format +msgid " -s, --schema=PATTERN check matching schema(s)\n" +msgstr " -s, --schema=PATTERN перевірити відповідні схеми\n" + +#: pg_amcheck.c:1164 +#, c-format +msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" +msgstr " -S, --exclude-schema=PATTERN НЕ перевіряти відповідні схеми\n" + +#: pg_amcheck.c:1165 +#, c-format +msgid " -t, --table=PATTERN check matching table(s)\n" +msgstr " -t, --table=PATTERN перевірити відповідні таблиці\n" + +#: pg_amcheck.c:1166 +#, c-format +msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" +msgstr " -T, --exclude-table=PATTERN НЕ перевіряти відповідні таблиці\n" + +#: pg_amcheck.c:1167 +#, c-format +msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" +msgstr " --no-dependent-indexes НЕ розширювати список відносин, щоб включити індекси\n" + +#: pg_amcheck.c:1168 +#, c-format +msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" +msgstr " --no-dependent-toast НЕ розширювати список відносин, щоб включити таблиці TOAST\n" + +#: pg_amcheck.c:1169 +#, c-format +msgid " --no-strict-names do NOT require patterns to match objects\n" +msgstr " --no-strict-names НЕ вимагати відповідності шаблонів об'єктам\n" + +#: pg_amcheck.c:1170 +#, c-format +msgid "\n" +"Table checking options:\n" +msgstr "\n" +"Параметри перевірки таблиць:\n" + +#: pg_amcheck.c:1171 +#, c-format +msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" +msgstr " --exclude-toast-pointers НЕ слідувати покажчикам відношень TOAST\n" + +#: pg_amcheck.c:1172 +#, c-format +msgid " --on-error-stop stop checking at end of first corrupt page\n" +msgstr " --on-error-stop зупинити перевірку наприкінці першої пошкодженої сторінки\n" + +#: pg_amcheck.c:1173 +#, c-format +msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" +msgstr " --skip=OPTION НЕ перевіряти \"всі заморожені\" або \"всі видимі\" блоки\n" + +#: pg_amcheck.c:1174 +#, c-format +msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" +msgstr " --startblock=BLOCK почати перевірку таблиць за поданим номером блоку\n" + +#: pg_amcheck.c:1175 +#, c-format +msgid " --endblock=BLOCK check table(s) only up to the given block number\n" +msgstr " --endblock=BLOCK перевіряти таблиці лише до поданого номеру блоку\n" + +#: pg_amcheck.c:1176 +#, c-format +msgid "\n" +"B-tree index checking options:\n" +msgstr "\n" +"Параметри перевірки індексів B-tree:\n" + +#: pg_amcheck.c:1177 +#, c-format +msgid " --heapallindexed check that all heap tuples are found within indexes\n" +msgstr " --heapallindexed перевірити чи всі кортежі динамічної пам'яті містяться в індексах\n" + +#: pg_amcheck.c:1178 +#, c-format +msgid " --parent-check check index parent/child relationships\n" +msgstr " --parent-check перевірити індекс батьківських/дочірніх відносин\n" + +#: pg_amcheck.c:1179 +#, c-format +msgid " --rootdescend search from root page to refind tuples\n" +msgstr " --rootdescend шукати з кореневої сторінки, для повторного пошуку кортежів\n" + +#: pg_amcheck.c:1180 +#, c-format +msgid "\n" +"Connection options:\n" +msgstr "\n" +"Налаштування з'єднання:\n" + +#: pg_amcheck.c:1181 +#, c-format +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=HOSTNAME хост сервера бази даних або каталог сокетів\n" + +#: pg_amcheck.c:1182 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT порт серверу бази даних\n" + +#: pg_amcheck.c:1183 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=USERNAME ім'я користувача для з'єднання з сервером\n" + +#: pg_amcheck.c:1184 +#, c-format +msgid " -w, --no-password never prompt for password\n" +msgstr " -w, --no-password ніколи не запитувати пароль\n" + +#: pg_amcheck.c:1185 +#, c-format +msgid " -W, --password force password prompt\n" +msgstr " -W, --password примусовий запит пароля\n" + +#: pg_amcheck.c:1186 +#, c-format +msgid " --maintenance-db=DBNAME alternate maintenance database\n" +msgstr " --maintenance-db=DBNAME база даних альтернативного обслуговування\n" + +#: pg_amcheck.c:1187 +#, c-format +msgid "\n" +"Other options:\n" +msgstr "\n" +"Інші параметри:\n" + +#: pg_amcheck.c:1188 +#, c-format +msgid " -e, --echo show the commands being sent to the server\n" +msgstr " -e, --echo показати команди, надіслані серверу\n" + +#: pg_amcheck.c:1189 +#, c-format +msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" +msgstr " -j, --jobs=NUM використати цю кількість одночасних з'єднань з сервером\n" + +#: pg_amcheck.c:1190 +#, c-format +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet не писати жодних повідомлень\n" + +#: pg_amcheck.c:1191 +#, c-format +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress показати інформацію про прогрес\n" + +#: pg_amcheck.c:1192 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose виводити багато інформації\n" + +#: pg_amcheck.c:1193 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version вивести інформацію про версію і вийти\n" + +#: pg_amcheck.c:1194 +#, c-format +msgid " --install-missing install missing extensions\n" +msgstr " --install-missing встановити відсутні розширення\n" + +#: pg_amcheck.c:1195 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help показати цю справку, потім вийти\n" + +#: pg_amcheck.c:1197 +#, c-format +msgid "\n" +"Report bugs to <%s>.\n" +msgstr "\n" +"Повідомляти про помилки на <%s>.\n" + +#: pg_amcheck.c:1198 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "Домашня сторінка %s: <%s>\n" + +#: pg_amcheck.c:1256 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" +msgstr "%*s/%s відношень (%d%%), %*s/%s сторінок (%d%%) %*s" + +#: pg_amcheck.c:1267 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" +msgstr "%*s/%s відношень (%d%%), %*s/%s сторінок (%d%%) (%s%-*.*s)" + +#: pg_amcheck.c:1282 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" +msgstr "%*s/%s відношень (%d%%), %*s/%s сторінок (%d%%)" + +#: pg_amcheck.c:1551 pg_amcheck.c:1693 +#, c-format +msgid "including database \"%s\"" +msgstr "включаючи базу даних \"%s\"" + +#: pg_amcheck.c:1673 +#, c-format +msgid "internal error: received unexpected database pattern_id %d" +msgstr "внутрішня помилка: отримано неочікувану помилку шаблону бази даних %d" + +#: pg_amcheck.c:1677 +#, c-format +msgid "no connectable databases to check matching \"%s\"" +msgstr "немає бази даних для підключення, щоб перевірити відповідність\"%s\"" + +#: pg_amcheck.c:2127 +#, c-format +msgid "internal error: received unexpected relation pattern_id %d" +msgstr "внутрішня помилка: отримано неочікувану помилку шаблону відношення %d" + diff --git a/src/bin/pg_amcheck/po/zh_CN.po b/src/bin/pg_amcheck/po/zh_CN.po index 8e1cff9f7b..5ca9f01945 100644 --- a/src/bin/pg_amcheck/po/zh_CN.po +++ b/src/bin/pg_amcheck/po/zh_CN.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_amcheck (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-06-08 23:18+0000\n" -"PO-Revision-Date: 2021-06-09 18:00+0800\n" +"POT-Creation-Date: 2021-08-14 05:48+0000\n" +"PO-Revision-Date: 2021-08-15 18:00+0800\n" "Last-Translator: Jie Zhang \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" @@ -50,13 +50,13 @@ msgid "%s" msgstr "%s" #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 -#: pg_amcheck.c:1645 pg_amcheck.c:2084 +#: pg_amcheck.c:1646 pg_amcheck.c:2085 #, c-format msgid "query failed: %s" msgstr "查询失败: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 -#: pg_amcheck.c:597 pg_amcheck.c:1116 pg_amcheck.c:1646 pg_amcheck.c:2085 +#: pg_amcheck.c:597 pg_amcheck.c:1116 pg_amcheck.c:1647 pg_amcheck.c:2086 #, c-format msgid "query was: %s" msgstr "查询是: %s" @@ -136,20 +136,35 @@ msgstr "正在跳过数据库\"%s\":未安装amcheck" msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" msgstr "在数据库\"%1$s\"中:在模式\"%3$s\"中使用amcheck版本\"%2$s\"" +#: pg_amcheck.c:638 +msgid "no heap tables to check matching \"%s\"" +msgstr "没有要检查匹配\"%s\"的堆表" + +#: pg_amcheck.c:641 +#, c-format +msgid "no btree indexes to check matching \"%s\"" +msgstr "没有要检查匹配\"%s\"的B树索引" + +#: pg_amcheck.c:644 +msgid "no relations to check in schemas matching \"%s\"" +msgstr "在模式中没有要检查匹配\"%s\"的关系" + +#: pg_amcheck.c:647 +msgid "no relations to check matching \"%s\"" +msgstr "没有要检查匹配\"%s\"的关系" + #: pg_amcheck.c:676 #, c-format msgid "no relations to check" msgstr "没有要检查的关系" #: pg_amcheck.c:762 -#, c-format -msgid "checking heap table \"%s\".\"%s\".\"%s\"" -msgstr "正在检查堆表\"%s\".\"%s\".\"%s\"" +msgid "checking heap table \"%s.%s.%s\"" +msgstr "正在检查堆表\"%s.%s.%s\"" #: pg_amcheck.c:778 -#, c-format -msgid "checking btree index \"%s\".\"%s\".\"%s\"" -msgstr "检查btree索引\"%s\".\"%s\".\"%s\"" +msgid "checking btree index \"%s.%s.%s\"" +msgstr "检查B树索引\"%s.%s.%s\"" #: pg_amcheck.c:911 #, c-format @@ -161,17 +176,42 @@ msgstr "向数据库\"%s\"发送命令时出错: %s" msgid "command was: %s" msgstr "命令是: %s" -#: pg_amcheck.c:1113 +#: pg_amcheck.c:1031 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" +msgstr "堆表\"%s.%s.%s\",块%s,偏移量%s,属性%s:\n" + +#: pg_amcheck.c:1038 #, c-format -msgid "btree index \"%s\".\"%s\".\"%s\": btree checking function returned unexpected number of rows: %d" -msgstr "B树索引\"%s\".\"%s\".\"%s\":B树检查函数返回了意外的行数: %d" +msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" +msgstr "堆表\"%s.%s.%s\",块%s,偏移量%s:\n" + +#: pg_amcheck.c:1044 +msgid "heap table \"%s.%s.%s\", block %s:\n" +msgstr "堆表\"%s.%s.%s\",块%s:\n" + +#: pg_amcheck.c:1049 pg_amcheck.c:1060 +msgid "heap table \"%s.%s.%s\":\n" +msgstr "堆表\"%s.%s.%s\":\n" + +#: pg_amcheck.c:1064 pg_amcheck.c:1131 +msgid "query was: %s\n" +msgstr "查询是: %s\n" + +#: pg_amcheck.c:1113 +msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" +msgstr "B树索引\"%s.%s.%s\":B树检查函数返回了意外的行数: %d" #: pg_amcheck.c:1117 #, c-format msgid "Are %s's and amcheck's versions compatible?" msgstr "%s和amcheck的版本兼容吗?" -#: pg_amcheck.c:1151 +#: pg_amcheck.c:1127 +msgid "btree index \"%s.%s.%s\":\n" +msgstr "B树索引\"%s.%s.%s\":\n" + +#: pg_amcheck.c:1152 #, c-format msgid "" "%s checks objects in a PostgreSQL database for corruption.\n" @@ -180,17 +220,17 @@ msgstr "" "%s检查PostgreSQL数据库中的对象是否损坏.\n" "\n" -#: pg_amcheck.c:1152 +#: pg_amcheck.c:1153 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_amcheck.c:1153 +#: pg_amcheck.c:1154 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [选项]... [数据库名字]\n" -#: pg_amcheck.c:1154 +#: pg_amcheck.c:1155 #, c-format msgid "" "\n" @@ -199,77 +239,77 @@ msgstr "" "\n" "目标选项:\n" -#: pg_amcheck.c:1155 +#: pg_amcheck.c:1156 #, c-format msgid " -a, --all check all databases\n" msgstr " -a, --all 检查所有数据库\n" -#: pg_amcheck.c:1156 +#: pg_amcheck.c:1157 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" msgstr " -d, --database=PATTERN 检查匹配的数据库\n" -#: pg_amcheck.c:1157 +#: pg_amcheck.c:1158 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" msgstr " -D, --exclude-database=PATTERN 不检查匹配的数据库\n" -#: pg_amcheck.c:1158 +#: pg_amcheck.c:1159 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" msgstr " -i, --index=PATTERN 检查匹配的索引\n" -#: pg_amcheck.c:1159 +#: pg_amcheck.c:1160 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" msgstr " -I, --exclude-index=PATTERN 不检查匹配的索引\n" -#: pg_amcheck.c:1160 +#: pg_amcheck.c:1161 #, c-format msgid " -r, --relation=PATTERN check matching relation(s)\n" msgstr " -r, --relation=PATTERN 检查匹配的关系\n" -#: pg_amcheck.c:1161 +#: pg_amcheck.c:1162 #, c-format msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" msgstr " -R, --exclude-relation=PATTERN 不检查匹配的关系\n" -#: pg_amcheck.c:1162 +#: pg_amcheck.c:1163 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" msgstr " -s, --schema=PATTERN 检查匹配的模式\n" -#: pg_amcheck.c:1163 +#: pg_amcheck.c:1164 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" msgstr " -S, --exclude-schema=PATTERN 不检查匹配模式\n" -#: pg_amcheck.c:1164 +#: pg_amcheck.c:1165 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" msgstr " -t, --table=PATTERN 检查匹配的表\n" -#: pg_amcheck.c:1165 +#: pg_amcheck.c:1166 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" msgstr " -T, --exclude-table=PATTERN 不检查匹的配表\n" -#: pg_amcheck.c:1166 +#: pg_amcheck.c:1167 #, c-format msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" msgstr " --no-dependent-indexes 不要展开关系列表以包含索引\n" -#: pg_amcheck.c:1167 +#: pg_amcheck.c:1168 #, c-format msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" msgstr " --no-dependent-toast 不要展开关系列表以包括TOAST表\n" -#: pg_amcheck.c:1168 +#: pg_amcheck.c:1169 #, c-format msgid " --no-strict-names do NOT require patterns to match objects\n" msgstr " --no-strict-names 不需要模式来匹配对象\n" -#: pg_amcheck.c:1169 +#: pg_amcheck.c:1170 #, c-format msgid "" "\n" @@ -278,32 +318,32 @@ msgstr "" "\n" "表检查选项:\n" -#: pg_amcheck.c:1170 +#: pg_amcheck.c:1171 #, c-format msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" msgstr " --exclude-toast-pointers 不要遵循关系TOAST指示\n" -#: pg_amcheck.c:1171 +#: pg_amcheck.c:1172 #, c-format msgid " --on-error-stop stop checking at end of first corrupt page\n" msgstr " --on-error-stop 在第一个损坏页的末尾停止检查\n" -#: pg_amcheck.c:1172 +#: pg_amcheck.c:1173 #, c-format msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" msgstr " --skip=OPTION 不要检查\"all-frozen\"或\"all-visible\"块\n" -#: pg_amcheck.c:1173 +#: pg_amcheck.c:1174 #, c-format msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" msgstr " --startblock=BLOCK 在给定的块编号处开始检查表\n" -#: pg_amcheck.c:1174 +#: pg_amcheck.c:1175 #, c-format msgid " --endblock=BLOCK check table(s) only up to the given block number\n" msgstr " --endblock=BLOCK 检查表仅限于给定的块编号\n" -#: pg_amcheck.c:1175 +#: pg_amcheck.c:1176 #, c-format msgid "" "\n" @@ -312,22 +352,21 @@ msgstr "" "\n" "B树索引检查选项:\n" -#: pg_amcheck.c:1176 -#, c-format -msgid " --heapallindexed check all heap tuples are found within indexes\n" +#: pg_amcheck.c:1177 +msgid " --heapallindexed check that all heap tuples are found within indexes\n" msgstr " --heapallindexed 检查是否在索引中找到所有堆元组\n" -#: pg_amcheck.c:1177 +#: pg_amcheck.c:1178 #, c-format msgid " --parent-check check index parent/child relationships\n" msgstr " --parent-check 检查索引父/子关系\n" -#: pg_amcheck.c:1178 +#: pg_amcheck.c:1179 #, c-format msgid " --rootdescend search from root page to refind tuples\n" msgstr " --rootdescend 从根页搜索到重新填充元组\n" -#: pg_amcheck.c:1179 +#: pg_amcheck.c:1180 #, c-format msgid "" "\n" @@ -336,37 +375,37 @@ msgstr "" "\n" "联接选项:\n" -#: pg_amcheck.c:1180 +#: pg_amcheck.c:1181 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME 数据库服务器主机或套接字目录\n" -#: pg_amcheck.c:1181 +#: pg_amcheck.c:1182 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT 数据库服务器端口\n" -#: pg_amcheck.c:1182 +#: pg_amcheck.c:1183 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME 要连接的用户名\n" -#: pg_amcheck.c:1183 +#: pg_amcheck.c:1184 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password 从不提示输入密码\n" -#: pg_amcheck.c:1184 +#: pg_amcheck.c:1185 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password 强制密码提示\n" -#: pg_amcheck.c:1185 +#: pg_amcheck.c:1186 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME 备用维护数据库\n" -#: pg_amcheck.c:1186 +#: pg_amcheck.c:1187 #, c-format msgid "" "\n" @@ -375,47 +414,47 @@ msgstr "" "\n" "其它选项:\n" -#: pg_amcheck.c:1187 +#: pg_amcheck.c:1188 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo 显示发送到服务端的命令\n" -#: pg_amcheck.c:1188 +#: pg_amcheck.c:1189 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" msgstr " -j, --jobs=NUM 使用这么多到服务器的并发连接\n" -#: pg_amcheck.c:1189 +#: pg_amcheck.c:1190 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet 不写任何信息\n" -#: pg_amcheck.c:1190 +#: pg_amcheck.c:1191 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress 显示进度信息\n" -#: pg_amcheck.c:1191 +#: pg_amcheck.c:1192 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose 写大量的输出\n" -#: pg_amcheck.c:1192 +#: pg_amcheck.c:1193 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 输出版本信息, 然后退出\n" -#: pg_amcheck.c:1193 +#: pg_amcheck.c:1194 #, c-format msgid " --install-missing install missing extensions\n" msgstr " --install-missing 安装缺少的扩展\n" -#: pg_amcheck.c:1194 +#: pg_amcheck.c:1195 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 显示此帮助信息, 然后退出\n" -#: pg_amcheck.c:1196 +#: pg_amcheck.c:1197 #, c-format msgid "" "\n" @@ -424,37 +463,38 @@ msgstr "" "\n" "臭虫报告至<%s>.\n" -#: pg_amcheck.c:1197 +#: pg_amcheck.c:1198 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 主页: <%s>\n" -#: pg_amcheck.c:1255 -#, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%) %*s" -msgstr "%*s/%s 关系 (%d%%) %*s/%s 页 (%d%%) %*s" +#: pg_amcheck.c:1256 +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" +msgstr "%*s/%s 关系 (%d%%), %*s/%s 页 (%d%%) %*s" -#: pg_amcheck.c:1266 -#, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%), (%s%-*.*s)" -msgstr "%*s/%s 关系 (%d%%) %*s/%s 页 (%d%%), (%s%-*.*s)" +#: pg_amcheck.c:1267 +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" +msgstr "%*s/%s 关系 (%d%%), %*s/%s 页 (%d%%) (%s%-*.*s)" -#: pg_amcheck.c:1281 -#, c-format -msgid "%*s/%s relations (%d%%) %*s/%s pages (%d%%)" -msgstr "%*s/%s 关系 (%d%%) %*s/%s 页 (%d%%)" +#: pg_amcheck.c:1282 +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" +msgstr "%*s/%s 关系 (%d%%), %*s/%s 页 (%d%%)" -#: pg_amcheck.c:1550 pg_amcheck.c:1692 +#: pg_amcheck.c:1551 pg_amcheck.c:1693 #, c-format msgid "including database \"%s\"" msgstr "包含的数据库\"%s\"" -#: pg_amcheck.c:1672 +#: pg_amcheck.c:1673 #, c-format msgid "internal error: received unexpected database pattern_id %d" msgstr "内部错误:收到意外的数据库pattern_id %d" -#: pg_amcheck.c:2126 +#: pg_amcheck.c:1677 +msgid "no connectable databases to check matching \"%s\"" +msgstr "没有可连接的数据库来检查匹配的\"%s\"" + +#: pg_amcheck.c:2127 #, c-format msgid "internal error: received unexpected relation pattern_id %d" msgstr "内部错误:收到意外的关系pattern_id %d" diff --git a/src/bin/pg_archivecleanup/po/de.po b/src/bin/pg_archivecleanup/po/de.po index 7f1664b09d..64ff8d9baf 100644 --- a/src/bin/pg_archivecleanup/po/de.po +++ b/src/bin/pg_archivecleanup/po/de.po @@ -1,14 +1,14 @@ # pg_archivecleanup message translation file for pg_archivecleanup -# Copyright (C) 2019-2020 PostgreSQL Global Development Group +# Copyright (C) 2019-2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Peter Eisentraut , 2019 - 2020. +# Peter Eisentraut , 2019 - 2022. # msgid "" msgstr "" -"Project-Id-Version: pg_archivecleanup (PostgreSQL) 13\n" +"Project-Id-Version: pg_archivecleanup (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-09 10:17+0000\n" -"PO-Revision-Date: 2020-04-09 15:15+0200\n" +"POT-Creation-Date: 2022-05-11 15:50+0000\n" +"PO-Revision-Date: 2022-05-11 22:07+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -16,58 +16,63 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "Fatal: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "Warnung: " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "Tipp: " + #: pg_archivecleanup.c:66 #, c-format msgid "archive location \"%s\" does not exist" msgstr "Archivverzeichnis »%s« existiert nicht" -#: pg_archivecleanup.c:152 +#: pg_archivecleanup.c:151 #, c-format msgid "could not remove file \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %m" -#: pg_archivecleanup.c:160 +#: pg_archivecleanup.c:157 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "konnte Archivverzeichnis »%s« nicht lesen: %m" -#: pg_archivecleanup.c:163 +#: pg_archivecleanup.c:160 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "konnte Archivverzeichnis »%s« nicht schließen: %m" -#: pg_archivecleanup.c:167 +#: pg_archivecleanup.c:164 #, c-format msgid "could not open archive location \"%s\": %m" msgstr "konnte Archivverzeichnis »%s« nicht öffnen: %m" -#: pg_archivecleanup.c:240 +#: pg_archivecleanup.c:237 #, c-format msgid "invalid file name argument" msgstr "ungültiges Dateinamenargument" -#: pg_archivecleanup.c:241 pg_archivecleanup.c:315 pg_archivecleanup.c:336 -#: pg_archivecleanup.c:348 pg_archivecleanup.c:355 +#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333 +#: pg_archivecleanup.c:345 pg_archivecleanup.c:352 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_archivecleanup.c:254 +#: pg_archivecleanup.c:251 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" @@ -76,17 +81,17 @@ msgstr "" "%s entfernt alte WAL-Dateien aus PostgreSQL-Archiven.\n" "\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:252 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:253 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr " %s [OPTION]... ARCHIVVERZEICHNIS ÄLTESTE-ZU-BEHALTENE-WALDATEI\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:254 #, c-format msgid "" "\n" @@ -95,32 +100,32 @@ msgstr "" "\n" "Optionen:\n" -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:255 #, c-format msgid " -d generate debug output (verbose mode)\n" msgstr " -d Debug-Ausgaben erzeugen (Verbose-Modus)\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:256 #, c-format msgid " -n dry run, show the names of the files that would be removed\n" msgstr " -n Probelauf, Namen der Dateien anzeigen, die entfernt würden\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:257 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_archivecleanup.c:261 +#: pg_archivecleanup.c:258 #, c-format msgid " -x EXT clean up files if they have this extension\n" msgstr " -x ERW Dateien mit dieser Erweiterung aufräumen\n" -#: pg_archivecleanup.c:262 +#: pg_archivecleanup.c:259 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_archivecleanup.c:263 +#: pg_archivecleanup.c:260 #, c-format msgid "" "\n" @@ -135,7 +140,7 @@ msgstr "" "z.B.\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiv %%r'\n" -#: pg_archivecleanup.c:268 +#: pg_archivecleanup.c:265 #, c-format msgid "" "\n" @@ -148,7 +153,7 @@ msgstr "" "z.B.\n" " pg_archivecleanup /mnt/server/archiv 000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:272 +#: pg_archivecleanup.c:269 #, c-format msgid "" "\n" @@ -157,22 +162,22 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_archivecleanup.c:273 +#: pg_archivecleanup.c:270 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_archivecleanup.c:335 +#: pg_archivecleanup.c:332 #, c-format msgid "must specify archive location" msgstr "Archivverzeichnis muss angegeben werden" -#: pg_archivecleanup.c:347 +#: pg_archivecleanup.c:344 #, c-format msgid "must specify oldest kept WAL file" msgstr "älteste zu behaltene WAL-Datei muss angegeben werden" -#: pg_archivecleanup.c:354 +#: pg_archivecleanup.c:351 #, c-format msgid "too many command-line arguments" msgstr "zu viele Kommandozeilenargumente" diff --git a/src/bin/pg_archivecleanup/po/el.po b/src/bin/pg_archivecleanup/po/el.po index c400e19e7b..0d2d49e685 100644 --- a/src/bin/pg_archivecleanup/po/el.po +++ b/src/bin/pg_archivecleanup/po/el.po @@ -3,19 +3,21 @@ # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # Georgios Kokolatos , 2021 # +# +# msgid "" msgstr "" "Project-Id-Version: pg_archivecleanup (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-25 05:48+0000\n" -"PO-Revision-Date: 2021-04-27 10:30+0200\n" +"POT-Creation-Date: 2021-07-21 05:18+0000\n" +"PO-Revision-Date: 2021-07-21 10:02+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 3.0\n" #: ../../../src/common/logging.c:259 #, c-format @@ -35,27 +37,27 @@ msgstr "προειδοποίηση: " #: pg_archivecleanup.c:66 #, c-format msgid "archive location \"%s\" does not exist" -msgstr "η τοποθεσία της αρχειοθήκης \"%s\" δεν υπάρχει" +msgstr "η τοποθεσία της αρχειοθήκης «%s» δεν υπάρχει" #: pg_archivecleanup.c:152 #, c-format msgid "could not remove file \"%s\": %m" -msgstr "δεν ήταν δυνατή η αφαίρεση του αρχείου \"%s\": %m" +msgstr "δεν ήταν δυνατή η αφαίρεση του αρχείου «%s»: %m" #: pg_archivecleanup.c:160 #, c-format msgid "could not read archive location \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση της τοποθεσίας αρχειοθήκης \"%s\": %m" +msgstr "δεν ήταν δυνατή η ανάγνωση της τοποθεσίας αρχειοθήκης «%s»: %m" #: pg_archivecleanup.c:163 #, c-format msgid "could not close archive location \"%s\": %m" -msgstr "δεν ήταν δυνατό το κλείσιμο της τοποθεσίας αρχειοθήκης “%s”: %m" +msgstr "δεν ήταν δυνατό το κλείσιμο της τοποθεσίας αρχειοθήκης «%s»: %m" #: pg_archivecleanup.c:167 #, c-format msgid "could not open archive location \"%s\": %m" -msgstr "δεν ήταν δυνατό το άνοιγμα της τοποθεσίας αρχειοθήκης “%s”: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα της τοποθεσίας αρχειοθήκης «%s»: %m" #: pg_archivecleanup.c:240 #, c-format @@ -66,7 +68,7 @@ msgstr "μη έγκυρη παράμετρος ονόματος αρχείου" #: pg_archivecleanup.c:348 pg_archivecleanup.c:355 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Δοκιμάστε “%s —help” για περισσότερες πληροφορίες.\n" +msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n" #: pg_archivecleanup.c:254 #, c-format @@ -85,7 +87,7 @@ msgstr "Χρήση:\n" #: pg_archivecleanup.c:256 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" -msgstr " %s [ΕΠΙΛΟΓΗ]… ARCHIVELOCATION OLDESTKEPTWALFILE\n" +msgstr " %s [ΕΠΙΛΟΓΗ]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" #: pg_archivecleanup.c:257 #, c-format @@ -109,7 +111,7 @@ msgstr " -n ξηρή λειτουργία, εμφάνιση των #: pg_archivecleanup.c:260 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, —version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" #: pg_archivecleanup.c:261 #, c-format @@ -119,7 +121,7 @@ msgstr " -x EXT εκκαθάριση αρχείων εάν περιέχ #: pg_archivecleanup.c:262 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, —help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" #: pg_archivecleanup.c:263 #, c-format @@ -176,4 +178,4 @@ msgstr "πρέπει να καθορίσετε το παλαιότερο κρα #: pg_archivecleanup.c:354 #, c-format msgid "too many command-line arguments" -msgstr "πάρα πολλοί παραμέτροι εισόδου από την γραμμή εντολών" +msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών" diff --git a/src/bin/pg_archivecleanup/po/es.po b/src/bin/pg_archivecleanup/po/es.po index 91289be776..98bb50653e 100644 --- a/src/bin/pg_archivecleanup/po/es.po +++ b/src/bin/pg_archivecleanup/po/es.po @@ -1,12 +1,12 @@ # Spanish message translation file for pg_archivecleanup -# Copyright (c) 2017-2019, PostgreSQL Global Development Group +# Copyright (c) 2017-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Carlos Chapi , 2017. # msgid "" msgstr "" -"Project-Id-Version: pg_archivecleanup (PostgreSQL) 12\n" +"Project-Id-Version: pg_archivecleanup (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2020-09-13 10:47+0000\n" "PO-Revision-Date: 2020-09-12 23:13-0300\n" diff --git a/src/bin/pg_archivecleanup/po/fr.po b/src/bin/pg_archivecleanup/po/fr.po index 2280202a36..0ac310cc70 100644 --- a/src/bin/pg_archivecleanup/po/fr.po +++ b/src/bin/pg_archivecleanup/po/fr.po @@ -1,74 +1,83 @@ # LANGUAGE message translation file for pg_archivecleanup -# Copyright (C) 2017 PostgreSQL Global Development Group -# This file is distributed under the same license as the PostgreSQL package. -# FIRST AUTHOR , 2017. +# Copyright (C) 2017-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package. +# +# Use these quotes: « %s » +# +# Guillaume Lelarge , 2017-2022. # msgid "" msgstr "" -"Project-Id-Version: pg_archivecleanup (PostgreSQL) 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-16 06:16+0000\n" -"PO-Revision-Date: 2020-04-16 13:39+0200\n" -"Last-Translator: \n" -"Language-Team: \n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"Last-Translator: Guillaume Lelarge \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.3\n" - -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatal : " +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:273 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:280 #, c-format msgid "warning: " msgstr "attention : " +#: ../../../src/common/logging.c:291 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:298 +#, c-format +msgid "hint: " +msgstr "astuce : " + #: pg_archivecleanup.c:66 #, c-format msgid "archive location \"%s\" does not exist" msgstr "l'emplacement d'archivage « %s » n'existe pas" -#: pg_archivecleanup.c:152 +#: pg_archivecleanup.c:151 #, c-format msgid "could not remove file \"%s\": %m" msgstr "n'a pas pu supprimer le fichier « %s » : %m" -#: pg_archivecleanup.c:160 +#: pg_archivecleanup.c:157 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "n'a pas pu lire l'emplacement de l'archive « %s » : %m" -#: pg_archivecleanup.c:163 +#: pg_archivecleanup.c:160 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "n'a pas pu fermer l'emplacement de l'archive « %s » : %m" -#: pg_archivecleanup.c:167 +#: pg_archivecleanup.c:164 #, c-format msgid "could not open archive location \"%s\": %m" msgstr "n'a pas pu ouvrir l'emplacement de l'archive « %s » : %m" -#: pg_archivecleanup.c:240 +#: pg_archivecleanup.c:237 #, c-format msgid "invalid file name argument" msgstr "argument du nom de fichier invalide" -#: pg_archivecleanup.c:241 pg_archivecleanup.c:315 pg_archivecleanup.c:336 -#: pg_archivecleanup.c:348 pg_archivecleanup.c:355 +#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333 +#: pg_archivecleanup.c:345 pg_archivecleanup.c:352 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Essayez « %s --help » pour plus d'informations.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_archivecleanup.c:254 +#: pg_archivecleanup.c:251 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" @@ -77,17 +86,17 @@ msgstr "" "%s supprime les anciens fichiers WAL des archives de PostgreSQL.\n" "\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:252 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:253 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr " %s [OPTION]... EMPLACEMENTARCHIVE PLUSANCIENFICHIERWALCONSERVÉ\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:254 #, c-format msgid "" "\n" @@ -96,32 +105,32 @@ msgstr "" "\n" "Options :\n" -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:255 #, c-format msgid " -d generate debug output (verbose mode)\n" msgstr " -d affiche des informations de débugage (mode verbeux)\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:256 #, c-format msgid " -n dry run, show the names of the files that would be removed\n" msgstr " -n test, affiche le nom des fichiers qui seraient supprimés\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:257 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version et quitte\n" -#: pg_archivecleanup.c:261 +#: pg_archivecleanup.c:258 #, c-format msgid " -x EXT clean up files if they have this extension\n" msgstr " -x EXT nettoie les fichiers s'ils ont cette extension\n" -#: pg_archivecleanup.c:262 +#: pg_archivecleanup.c:259 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide et quitte\n" -#: pg_archivecleanup.c:263 +#: pg_archivecleanup.c:260 #, c-format msgid "" "\n" @@ -133,10 +142,10 @@ msgstr "" "\n" "Pour utiliser comme archive_cleanup_command dans postgresql.conf :\n" " archive_cleanup_command = 'pg_archivecleanup [OPTION]... EMPLACEMENTARCHIVE %%r'\n" -"e.g.\n" +"Par exemple :\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/serveur/reparchives %%r'\n" -#: pg_archivecleanup.c:268 +#: pg_archivecleanup.c:265 #, c-format msgid "" "\n" @@ -146,10 +155,10 @@ msgid "" msgstr "" "\n" "Ou pour utiliser comme nettoyeur autonome d'archives :\n" -"e.g.\n" +"Par exemple :\n" " pg_archivecleanup /mnt/serveur/reparchives 000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:272 +#: pg_archivecleanup.c:269 #, c-format msgid "" "\n" @@ -158,44 +167,52 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_archivecleanup.c:273 +#: pg_archivecleanup.c:270 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil de %s : <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" -#: pg_archivecleanup.c:335 +#: pg_archivecleanup.c:332 #, c-format msgid "must specify archive location" msgstr "doit spécifier l'emplacement de l'archive" -#: pg_archivecleanup.c:347 +#: pg_archivecleanup.c:344 #, c-format msgid "must specify oldest kept WAL file" msgstr "doit spécifier le plus ancien journal de transactions conservé" -#: pg_archivecleanup.c:354 +#: pg_archivecleanup.c:351 #, c-format msgid "too many command-line arguments" msgstr "trop d'arguments en ligne de commande" -#~ msgid "%s: file \"%s\" would be removed\n" -#~ msgstr "%s : le fichier « %s » serait supprimé\n" - -#~ msgid "%s: removing file \"%s\"\n" -#~ msgstr "%s : suppression du fichier « %s »\n" +#~ msgid "" +#~ "\n" +#~ "Report bugs to .\n" +#~ msgstr "" +#~ "\n" +#~ "Rapporter les bogues à .\n" #~ msgid "%s: ERROR: could not remove file \"%s\": %s\n" #~ msgstr "%s : ERREUR : n'a pas pu supprimer le fichier « %s » : %s\n" +#~ msgid "%s: file \"%s\" would be removed\n" +#~ msgstr "%s : le fichier « %s » serait supprimé\n" + #~ msgid "%s: keeping WAL file \"%s\" and later\n" #~ msgstr "%s : conservation du fichier WAL « %s » et des suivants\n" +#~ msgid "%s: removing file \"%s\"\n" +#~ msgstr "%s : suppression du fichier « %s »\n" + #~ msgid "%s: too many parameters\n" #~ msgstr "%s : trop de paramètres\n" -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" + +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatal : " diff --git a/src/bin/pg_archivecleanup/po/ja.po b/src/bin/pg_archivecleanup/po/ja.po index 9a5d1b277e..548c10ff55 100644 --- a/src/bin/pg_archivecleanup/po/ja.po +++ b/src/bin/pg_archivecleanup/po/ja.po @@ -1,12 +1,12 @@ # Japanese message translation file for pg_archivecleanup -# Copyright (C) 2019 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: pg_archivecleanup (PostgreSQL 13)\n" +"Project-Id-Version: pg_archivecleanup (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:54+0900\n" +"POT-Creation-Date: 2022-05-10 09:34+0900\n" "PO-Revision-Date: 2020-09-13 08:55+0200\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" @@ -16,58 +16,63 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:241 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " - -#: ../../../src/common/logging.c:248 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:255 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "警告: " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "ヒント: " + #: pg_archivecleanup.c:66 #, c-format msgid "archive location \"%s\" does not exist" msgstr "アーカイブの場所\"%s\"が存在しません" -#: pg_archivecleanup.c:152 +#: pg_archivecleanup.c:151 #, c-format msgid "could not remove file \"%s\": %m" msgstr "ファイル\"%s\"を削除できませんでした: %m" -#: pg_archivecleanup.c:160 +#: pg_archivecleanup.c:157 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "アーカイブの場所\"%s\"を読み込めませんでした: %m" -#: pg_archivecleanup.c:163 +#: pg_archivecleanup.c:160 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "アーカイブの場所\"%s\"をクローズできませんでした: %m" -#: pg_archivecleanup.c:167 +#: pg_archivecleanup.c:164 #, c-format msgid "could not open archive location \"%s\": %m" msgstr "アーカイブの場所\"%s\"をオープンできませんでした: %m" -#: pg_archivecleanup.c:240 +#: pg_archivecleanup.c:237 #, c-format msgid "invalid file name argument" msgstr "ファイル名引数が無効です" -#: pg_archivecleanup.c:241 pg_archivecleanup.c:315 pg_archivecleanup.c:336 -#: pg_archivecleanup.c:348 pg_archivecleanup.c:355 +#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333 +#: pg_archivecleanup.c:345 pg_archivecleanup.c:352 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "\"%s --help\"で詳細が参照できます。\n" +msgid "Try \"%s --help\" for more information." +msgstr "詳細は\"%s --help\"を実行してください。" -#: pg_archivecleanup.c:254 +#: pg_archivecleanup.c:251 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" @@ -76,17 +81,17 @@ msgstr "" "%sはPostgreSQLのアーカイブから古いWALファイルを削除します。\n" "\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:252 #, c-format msgid "Usage:\n" msgstr "使用法:\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:253 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr "%s [オプション] ... {アーカイブの場所} {保存する最古の WAL ファイル名}\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:254 #, c-format msgid "" "\n" @@ -95,32 +100,32 @@ msgstr "" "\n" "オプション:\n" -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:255 #, c-format msgid " -d generate debug output (verbose mode)\n" msgstr " -d デバッグ情報を出力(冗長モード)\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:256 #, c-format msgid " -n dry run, show the names of the files that would be removed\n" msgstr " -n リハーサル、削除対象のファイル名を表示\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:257 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を出力して終了\n" -#: pg_archivecleanup.c:261 +#: pg_archivecleanup.c:258 #, c-format msgid " -x EXT clean up files if they have this extension\n" msgstr " -x EXT この拡張子を持つファイルを削除対象とする\n" -#: pg_archivecleanup.c:262 +#: pg_archivecleanup.c:259 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: pg_archivecleanup.c:263 +#: pg_archivecleanup.c:260 #, c-format msgid "" "\n" @@ -135,7 +140,7 @@ msgstr "" "例としては:\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" -#: pg_archivecleanup.c:268 +#: pg_archivecleanup.c:265 #, c-format msgid "" "\n" @@ -148,7 +153,7 @@ msgstr "" "使用例\n" " pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:272 +#: pg_archivecleanup.c:269 #, c-format msgid "" "\n" @@ -157,34 +162,40 @@ msgstr "" "\n" "バグは<%s>に報告してください。\n" -#: pg_archivecleanup.c:273 +#: pg_archivecleanup.c:270 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_archivecleanup.c:335 +#: pg_archivecleanup.c:332 #, c-format msgid "must specify archive location" msgstr "アーカイブの場所を指定してください" -#: pg_archivecleanup.c:347 +#: pg_archivecleanup.c:344 #, c-format msgid "must specify oldest kept WAL file" msgstr "保存する最古のWALファイルを指定してください" -#: pg_archivecleanup.c:354 +#: pg_archivecleanup.c:351 #, c-format msgid "too many command-line arguments" msgstr "コマンドライン引数が多すぎます" -#~ msgid "%s: file \"%s\" would be removed\n" -#~ msgstr "%s: ファイル \"%s\" は削除されます\n" +#~ msgid "%s: keeping WAL file \"%s\" and later\n" +#~ msgstr "%s: WAL file \"%s\" とそれ以降の分を保存しています\n" + +#~ msgid "%s: ERROR: could not remove file \"%s\": %s\n" +#~ msgstr "%s: エラー: ファイル \"%s\" を削除できませんでした: %s\n" #~ msgid "%s: removing file \"%s\"\n" #~ msgstr "%s: ファイル \"%s\" を削除しています\n" -#~ msgid "%s: ERROR: could not remove file \"%s\": %s\n" -#~ msgstr "%s: エラー: ファイル \"%s\" を削除できませんでした: %s\n" +#~ msgid "%s: file \"%s\" would be removed\n" +#~ msgstr "%s: ファイル \"%s\" は削除されます\n" -#~ msgid "%s: keeping WAL file \"%s\" and later\n" -#~ msgstr "%s: WAL file \"%s\" とそれ以降の分を保存しています\n" +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "\"%s --help\"で詳細が参照できます。\n" + +#~ msgid "fatal: " +#~ msgstr "致命的エラー: " diff --git a/src/bin/pg_archivecleanup/po/ru.po b/src/bin/pg_archivecleanup/po/ru.po index ec22c128e8..22d0f77986 100644 --- a/src/bin/pg_archivecleanup/po/ru.po +++ b/src/bin/pg_archivecleanup/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_archivecleanup (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-03 11:22+0300\n" +"POT-Creation-Date: 2021-08-14 06:29+0300\n" "PO-Revision-Date: 2020-09-03 12:40+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -17,17 +17,17 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "важно: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "ошибка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "предупреждение: " diff --git a/src/bin/pg_archivecleanup/po/sv.po b/src/bin/pg_archivecleanup/po/sv.po index c0f3a77282..6cebbc1ad1 100644 --- a/src/bin/pg_archivecleanup/po/sv.po +++ b/src/bin/pg_archivecleanup/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_archivecleanup # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-11 01:17+0000\n" -"PO-Revision-Date: 2020-04-11 07:37+0200\n" +"POT-Creation-Date: 2022-04-11 13:50+0000\n" +"PO-Revision-Date: 2022-04-11 16:06+0200\n" "Last-Translator: FDennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,58 +17,63 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatalt: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:268 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:275 #, c-format msgid "warning: " msgstr "varning: " +#: ../../../src/common/logging.c:284 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:287 +#, c-format +msgid "hint: " +msgstr "tips: " + #: pg_archivecleanup.c:66 #, c-format msgid "archive location \"%s\" does not exist" msgstr "arkivplats \"%s\" finns inte" -#: pg_archivecleanup.c:152 +#: pg_archivecleanup.c:151 #, c-format msgid "could not remove file \"%s\": %m" msgstr "kunde inte ta bort fil \"%s\": %m" -#: pg_archivecleanup.c:160 +#: pg_archivecleanup.c:157 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "kunde inte läsa arkivplats \"%s\": %m" -#: pg_archivecleanup.c:163 +#: pg_archivecleanup.c:160 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "kunde inte stänga arkivplats \"%s\": %m" -#: pg_archivecleanup.c:167 +#: pg_archivecleanup.c:164 #, c-format msgid "could not open archive location \"%s\": %m" msgstr "kunde inte öppna arkivplats \"%s\": %m" -#: pg_archivecleanup.c:240 +#: pg_archivecleanup.c:237 #, c-format msgid "invalid file name argument" msgstr "ogiltigt filnamnsargument" -#: pg_archivecleanup.c:241 pg_archivecleanup.c:315 pg_archivecleanup.c:336 -#: pg_archivecleanup.c:348 pg_archivecleanup.c:355 +#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333 +#: pg_archivecleanup.c:345 pg_archivecleanup.c:352 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Försök med \"%s --help\" för mer information.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." -#: pg_archivecleanup.c:254 +#: pg_archivecleanup.c:251 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" @@ -77,17 +82,17 @@ msgstr "" "%s tar bort gamla WAL-filer från PostgreSQLs arkiv.\n" "\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:252 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:253 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr " %s [FLAGGA]... ARKIVPLATS ÄLDSTASPARADEWALFIL\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:254 #, c-format msgid "" "\n" @@ -96,32 +101,32 @@ msgstr "" "\n" "Flaggor:\n" -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:255 #, c-format msgid " -d generate debug output (verbose mode)\n" msgstr " -d generera debugutskrift (utförligt läge)\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:256 #, c-format msgid " -n dry run, show the names of the files that would be removed\n" msgstr " -n gör inga ändringar visa namn på de filer som skulle ha tagits bort\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:257 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_archivecleanup.c:261 +#: pg_archivecleanup.c:258 #, c-format msgid " -x EXT clean up files if they have this extension\n" msgstr " -x SUF städa upp filer om de har detta suffix\n" -#: pg_archivecleanup.c:262 +#: pg_archivecleanup.c:259 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: pg_archivecleanup.c:263 +#: pg_archivecleanup.c:260 #, c-format msgid "" "\n" @@ -136,7 +141,7 @@ msgstr "" "t.ex.\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" -#: pg_archivecleanup.c:268 +#: pg_archivecleanup.c:265 #, c-format msgid "" "\n" @@ -149,7 +154,7 @@ msgstr "" "t.ex.\n" " pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:272 +#: pg_archivecleanup.c:269 #, c-format msgid "" "\n" @@ -158,22 +163,22 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_archivecleanup.c:273 +#: pg_archivecleanup.c:270 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_archivecleanup.c:335 +#: pg_archivecleanup.c:332 #, c-format msgid "must specify archive location" msgstr "måste ange en arkivplats" -#: pg_archivecleanup.c:347 +#: pg_archivecleanup.c:344 #, c-format msgid "must specify oldest kept WAL file" msgstr "måste ange äldsta sparade WAL-filen" -#: pg_archivecleanup.c:354 +#: pg_archivecleanup.c:351 #, c-format msgid "too many command-line arguments" msgstr "för många kommandoradsargument" diff --git a/src/bin/pg_archivecleanup/po/tr.po b/src/bin/pg_archivecleanup/po/tr.po index c61889af82..fac3be6af4 100644 --- a/src/bin/pg_archivecleanup/po/tr.po +++ b/src/bin/pg_archivecleanup/po/tr.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pg_archivecleanup (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2019-04-26 13:48+0000\n" -"PO-Revision-Date: 2019-05-28 10:30+0300\n" +"PO-Revision-Date: 2021-09-16 09:39+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: tr\n" @@ -112,7 +112,7 @@ msgstr " -V, --version sürüm bilgisini göster, sonra çık\n" #: pg_archivecleanup.c:262 #, c-format msgid " -x EXT clean up files if they have this extension\n" -msgstr " -x EXT bu uzantıya sahip dosyaları temizle\n" +msgstr " -x EXT bu uzantıya sahip dosyaları temizle\n" #: pg_archivecleanup.c:263 #, c-format diff --git a/src/bin/pg_archivecleanup/po/uk.po b/src/bin/pg_archivecleanup/po/uk.po index 3458cea869..3dee30aba7 100644 --- a/src/bin/pg_archivecleanup/po/uk.po +++ b/src/bin/pg_archivecleanup/po/uk.po @@ -2,11 +2,11 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:17+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" -"Last-Translator: pasha_golub\n" +"POT-Creation-Date: 2021-06-10 08:49+0000\n" +"PO-Revision-Date: 2021-08-17 10:54\n" +"Last-Translator: \n" "Language-Team: Ukrainian\n" -"Language: uk\n" +"Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -14,20 +14,20 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/pg_archivecleanup.pot\n" -"X-Crowdin-File-ID: 488\n" +"X-Crowdin-File: /REL_14_DEV/pg_archivecleanup.pot\n" +"X-Crowdin-File-ID: 760\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "збій: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "помилка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "попередження: " @@ -66,7 +66,7 @@ msgstr "недійсна назва файла з аргументом" #: pg_archivecleanup.c:348 pg_archivecleanup.c:355 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" для отримання додаткової інформації.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" #: pg_archivecleanup.c:254 #, c-format @@ -166,10 +166,3 @@ msgstr "необхідно вказати найдавніший збереже msgid "too many command-line arguments" msgstr "занадто багато аргументів командного рядка" -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Про помилки повідомляйте на .\n" - diff --git a/src/bin/pg_archivecleanup/po/zh_CN.po b/src/bin/pg_archivecleanup/po/zh_CN.po index 39c8569f34..e8c33482e1 100644 --- a/src/bin/pg_archivecleanup/po/zh_CN.po +++ b/src/bin/pg_archivecleanup/po/zh_CN.po @@ -1,73 +1,73 @@ # LANGUAGE message translation file for pg_archivecleanup # Copyright (C) 2019 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. -# FIRST AUTHOR , 2019. +# FIRST AUTHOR , 2019. # msgid "" msgstr "" -"Project-Id-Version: pg_archivecleanup (PostgreSQL) 12\n" +"Project-Id-Version: pg_archivecleanup (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-06-16 19:40+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:48+0000\n" +"PO-Revision-Date: 2021-08-14 19:40+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -#: ../../../src/common/logging.c:188 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "致命的: " -#: ../../../src/common/logging.c:195 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "错误: " -#: ../../../src/common/logging.c:202 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "警告: " -#: pg_archivecleanup.c:68 +#: pg_archivecleanup.c:66 #, c-format msgid "archive location \"%s\" does not exist" msgstr "存档位置\"%s\"不存在" -#: pg_archivecleanup.c:153 +#: pg_archivecleanup.c:152 #, c-format msgid "could not remove file \"%s\": %m" msgstr "无法删除文件 \"%s\": %m" -#: pg_archivecleanup.c:161 +#: pg_archivecleanup.c:160 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "无法读取存档位置\"%s\": %m" -#: pg_archivecleanup.c:164 +#: pg_archivecleanup.c:163 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "无法关闭存档位置 \"%s\": %m" -#: pg_archivecleanup.c:168 +#: pg_archivecleanup.c:167 #, c-format msgid "could not open archive location \"%s\": %m" msgstr "无法打开存档位置\"%s\": %m" -#: pg_archivecleanup.c:241 +#: pg_archivecleanup.c:240 #, c-format msgid "invalid file name argument" msgstr "文件名参数无效" -#: pg_archivecleanup.c:242 pg_archivecleanup.c:315 pg_archivecleanup.c:336 +#: pg_archivecleanup.c:241 pg_archivecleanup.c:315 pg_archivecleanup.c:336 #: pg_archivecleanup.c:348 pg_archivecleanup.c:355 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "请用 \"%s --help\" 获取更多的信息.\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:254 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" @@ -76,17 +76,17 @@ msgstr "" "%s 从PostgreSQL存档中删除旧的WAL文件.\n" "\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:255 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:256 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr " %s [OPTION]... 归档文件位置 最早保存的WAL文件\n" -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:257 #, c-format msgid "" "\n" @@ -95,32 +95,32 @@ msgstr "" "\n" "选项:\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:258 #, c-format msgid " -d generate debug output (verbose mode)\n" msgstr " -d 生成调试输出(详细模式)\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:259 #, c-format msgid " -n dry run, show the names of the files that would be removed\n" msgstr " -n dry运行,显示要删除的文件的名称\n" -#: pg_archivecleanup.c:261 +#: pg_archivecleanup.c:260 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 输出版本信息,然后退出\n" -#: pg_archivecleanup.c:262 +#: pg_archivecleanup.c:261 #, c-format msgid " -x EXT clean up files if they have this extension\n" msgstr " -x EXT 如果文件具有此扩展名,则清除文件\n" -#: pg_archivecleanup.c:263 +#: pg_archivecleanup.c:262 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 显示帮助信息,然后退出\n" -#: pg_archivecleanup.c:264 +#: pg_archivecleanup.c:263 #, c-format msgid "" "\n" @@ -135,7 +135,7 @@ msgstr "" "例.\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" -#: pg_archivecleanup.c:269 +#: pg_archivecleanup.c:268 #, c-format msgid "" "\n" @@ -148,14 +148,19 @@ msgstr "" "例.\n" " pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:273 +#: pg_archivecleanup.c:272 #, c-format msgid "" "\n" -"Report bugs to .\n" +"Report bugs to <%s>.\n" msgstr "" "\n" -"报告错误至 .\n" +"臭虫报告至<%s>.\n" + +#: pg_archivecleanup.c:273 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 主页: <%s>\n" #: pg_archivecleanup.c:335 #, c-format diff --git a/src/bin/pg_basebackup/po/de.po b/src/bin/pg_basebackup/po/de.po index 1c25945d0a..c88e1e9d0d 100644 --- a/src/bin/pg_basebackup/po/de.po +++ b/src/bin/pg_basebackup/po/de.po @@ -1,15 +1,15 @@ # German message translation file for pg_basebackup -# Copyright (C) 2011 - 2021 PostgreSQL Global Development Group +# Copyright (C) 2011 - 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-29 03:17+0000\n" -"PO-Revision-Date: 2021-04-29 06:55+0200\n" +"POT-Creation-Date: 2022-05-14 15:47+0000\n" +"PO-Revision-Date: 2022-05-15 15:14+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -18,21 +18,65 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "Fatal: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "Warnung: " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "Tipp: " + +#: ../../common/compression.c:157 +msgid "found empty string where a compression option was expected" +msgstr "" + +#: ../../common/compression.c:187 +#, fuzzy, c-format +#| msgid "invalid compression method \"%s\"" +msgid "unknown compression option \"%s\"" +msgstr "ungültige Komprimierungsmethode »%s«" + +#: ../../common/compression.c:226 +#, fuzzy, c-format +#| msgid "-c %s requires a value" +msgid "compression option \"%s\" requires a value" +msgstr "-c %s benötigt einen Wert" + +#: ../../common/compression.c:235 +#, fuzzy, c-format +#| msgid "btree comparison functions must return integer" +msgid "value for compression option \"%s\" must be an integer" +msgstr "btree-Vergleichsfunktionen müssen Typ integer zurückgeben" + +#: ../../common/compression.c:273 +#, fuzzy, c-format +#| msgid "relation \"%s\" does not have a composite type" +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "Relation »%s« hat keinen zusammengesetzten Typ" + +#: ../../common/compression.c:277 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d" +msgstr "" + +#: ../../common/compression.c:289 +#, fuzzy, c-format +#| msgid "operator class \"%s\" does not accept data type %s" +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "Operatorklasse »%s« akzeptiert Datentyp %s nicht" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -45,138 +89,314 @@ msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" #: ../../common/file_utils.c:87 ../../common/file_utils.c:451 -#: pg_receivewal.c:266 pg_recvlogical.c:340 +#: pg_receivewal.c:380 pg_recvlogical.c:341 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" -#: ../../common/file_utils.c:166 pg_receivewal.c:169 +#: ../../common/file_utils.c:166 pg_receivewal.c:303 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: ../../common/file_utils.c:200 pg_receivewal.c:337 +#: ../../common/file_utils.c:200 pg_receivewal.c:534 #, c-format msgid "could not read directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht lesen: %m" #: ../../common/file_utils.c:232 ../../common/file_utils.c:291 -#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:134 +#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121 +#: pg_receivewal.c:447 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" #: ../../common/file_utils.c:303 ../../common/file_utils.c:373 -#: pg_recvlogical.c:193 +#: pg_recvlogical.c:196 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" -#: ../../common/file_utils.c:383 +#: ../../common/file_utils.c:383 pg_basebackup.c:2264 walmethods.c:459 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" -#: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49 -#: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100 -#: ../../fe_utils/recovery_gen.c:171 pg_basebackup.c:1248 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ungültiger Wert »%s« für Option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s muss im Bereich %d..%d sein" + +#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 +#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 +#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1643 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" -#: ../../fe_utils/recovery_gen.c:140 pg_basebackup.c:1021 pg_basebackup.c:1714 -#: pg_basebackup.c:1770 +#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121 +#: bbstreamer_file.c:258 pg_basebackup.c:1440 pg_basebackup.c:1734 #, c-format msgid "could not write to file \"%s\": %m" msgstr "konnte nicht in Datei »%s« schreiben: %m" -#: ../../fe_utils/recovery_gen.c:152 pg_basebackup.c:1166 pg_basebackup.c:1671 -#: pg_basebackup.c:1747 +#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339 +#: pg_basebackup.c:1504 pg_basebackup.c:1713 #, c-format msgid "could not create file \"%s\": %m" msgstr "konnte Datei »%s« nicht erstellen: %m" -#: pg_basebackup.c:224 +#: bbstreamer_file.c:138 pg_recvlogical.c:635 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schließen: %m" + +#: bbstreamer_file.c:275 +#, fuzzy, c-format +#| msgid "unexpected result set while fetching file list" +msgid "unexpected state while extracting archive" +msgstr "unerwartete Ergebnismenge beim Holen der Dateiliste" + +#: bbstreamer_file.c:298 pg_basebackup.c:686 pg_basebackup.c:738 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" + +#: bbstreamer_file.c:304 +#, c-format +msgid "could not set permissions on directory \"%s\": %m" +msgstr "konnte Zugriffsrechte für Verzeichnis »%s« nicht setzen: %m" + +#: bbstreamer_file.c:323 +#, c-format +msgid "could not create symbolic link from \"%s\" to \"%s\": %m" +msgstr "konnte symbolische Verknüpfung von »%s« nach »%s« nicht erzeugen: %m" + +#: bbstreamer_file.c:343 +#, c-format +msgid "could not set permissions on file \"%s\": %m" +msgstr "konnte Zugriffsrechte von Datei »%s« nicht setzen: %m" + +#: bbstreamer_gzip.c:95 +#, c-format +msgid "could not create compressed file \"%s\": %m" +msgstr "konnte komprimierte Datei »%s« nicht erzeugen: %m" + +#: bbstreamer_gzip.c:103 +#, c-format +msgid "could not duplicate stdout: %m" +msgstr "konnte Standardausgabe nicht duplizieren: %m" + +#: bbstreamer_gzip.c:107 +#, c-format +msgid "could not open output file: %m" +msgstr "konnte Ausgabedatei nicht öffnen: %m" + +#: bbstreamer_gzip.c:113 +#, c-format +msgid "could not set compression level %d: %s" +msgstr "konnte Komprimierungsniveau %d nicht setzen: %s" + +#: bbstreamer_gzip.c:118 bbstreamer_gzip.c:251 +#, c-format +msgid "this build does not support gzip compression" +msgstr "diese Installation unterstützt keine gzip-Komprimierung" + +#: bbstreamer_gzip.c:145 +#, c-format +msgid "could not write to compressed file \"%s\": %s" +msgstr "konnte nicht in komprimierte Datei »%s« schreiben: %s" + +#: bbstreamer_gzip.c:169 +#, c-format +msgid "could not close compressed file \"%s\": %m" +msgstr "konnte komprimierte Datei »%s« nicht schließen: %m" + +#: bbstreamer_gzip.c:247 walmethods.c:869 +#, c-format +msgid "could not initialize compression library" +msgstr "konnte Komprimierungsbibliothek nicht initialisieren" + +#: bbstreamer_gzip.c:298 bbstreamer_lz4.c:355 bbstreamer_zstd.c:319 +#, c-format +msgid "could not decompress data: %s" +msgstr "konnte Daten nicht dekomprimieren: %s" + +#: bbstreamer_inject.c:189 +#, fuzzy, c-format +#| msgid "unexpected result format while fetching remote files" +msgid "unexpected state while injecting recovery settings" +msgstr "unerwartetes Ergebnisformat beim Holen von fernen Dateien" + +#: bbstreamer_lz4.c:96 +#, fuzzy, c-format +#| msgid "could not create SSL context: %s" +msgid "could not create lz4 compression context: %s" +msgstr "konnte SSL-Kontext nicht erzeugen: %s" + +#: bbstreamer_lz4.c:101 bbstreamer_lz4.c:299 +#, c-format +msgid "this build does not support lz4 compression" +msgstr "diese Installation unterstützt keine lz4-Komprimierung" + +#: bbstreamer_lz4.c:141 +#, fuzzy, c-format +#| msgid "could not get backup header: %s" +msgid "could not write lz4 header: %s" +msgstr "konnte Kopf der Sicherung nicht empfangen: %s" + +#: bbstreamer_lz4.c:190 bbstreamer_zstd.c:171 bbstreamer_zstd.c:213 +#, c-format +msgid "could not compress data: %s" +msgstr "konnte Daten nicht komprimieren: %s" + +#: bbstreamer_lz4.c:242 +#, fuzzy, c-format +#| msgid "could not set compression level %d: %s" +msgid "could not end lz4 compression: %s" +msgstr "konnte Komprimierungsniveau %d nicht setzen: %s" + +#: bbstreamer_lz4.c:294 +#, c-format +msgid "could not initialize compression library: %s" +msgstr "konnte Komprimierungsbibliothek nicht initialisieren: %s" + +#: bbstreamer_tar.c:244 +#, c-format +msgid "tar file trailer exceeds 2 blocks" +msgstr "" + +#: bbstreamer_tar.c:249 +#, fuzzy, c-format +#| msgid "unrecognized data block type %d while restoring archive" +msgid "unexpected state while parsing tar archive" +msgstr "unerkannter Datenblocktyp %d beim Wiederherstellen des Archivs gefunden" + +#: bbstreamer_tar.c:296 +#, c-format +msgid "tar member has empty name" +msgstr "" + +#: bbstreamer_tar.c:328 +#, c-format +msgid "COPY stream ended before last file was finished" +msgstr "COPY-Strom endete vor dem Ende der letzten Datei" + +#: bbstreamer_zstd.c:85 +#, fuzzy, c-format +#| msgid "could not reset compression stream" +msgid "could not create zstd compression context" +msgstr "konnte Komprimierungsstrom nicht zurücksetzen" + +#: bbstreamer_zstd.c:93 +#, fuzzy, c-format +#| msgid "could not set compression level %d: %s" +msgid "could not set zstd compression level to %d: %s" +msgstr "konnte Komprimierungsniveau %d nicht setzen: %s" + +#: bbstreamer_zstd.c:108 +#, fuzzy, c-format +#| msgid "could not set compression level %d: %s" +msgid "could not set compression worker count to %d: %s" +msgstr "konnte Komprimierungsniveau %d nicht setzen: %s" + +#: bbstreamer_zstd.c:119 bbstreamer_zstd.c:274 +#, c-format +msgid "this build does not support zstd compression" +msgstr "diese Installation unterstützt keine zstd-Komprimierung" + +#: bbstreamer_zstd.c:265 +#, fuzzy, c-format +#| msgid "could not reset compression stream" +msgid "could not create zstd decompression context" +msgstr "konnte Komprimierungsstrom nicht zurücksetzen" + +#: pg_basebackup.c:240 #, c-format msgid "removing data directory \"%s\"" msgstr "entferne Datenverzeichnis »%s«" -#: pg_basebackup.c:226 +#: pg_basebackup.c:242 #, c-format msgid "failed to remove data directory" msgstr "konnte Datenverzeichnis nicht entfernen" -#: pg_basebackup.c:230 +#: pg_basebackup.c:246 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "entferne Inhalt des Datenverzeichnisses »%s«" -#: pg_basebackup.c:232 +#: pg_basebackup.c:248 #, c-format msgid "failed to remove contents of data directory" msgstr "konnte Inhalt des Datenverzeichnisses nicht entfernen" -#: pg_basebackup.c:237 +#: pg_basebackup.c:253 #, c-format msgid "removing WAL directory \"%s\"" msgstr "entferne WAL-Verzeichnis »%s«" -#: pg_basebackup.c:239 +#: pg_basebackup.c:255 #, c-format msgid "failed to remove WAL directory" msgstr "konnte WAL-Verzeichnis nicht entfernen" -#: pg_basebackup.c:243 +#: pg_basebackup.c:259 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "entferne Inhalt des WAL-Verzeichnisses »%s«" -#: pg_basebackup.c:245 +#: pg_basebackup.c:261 #, c-format msgid "failed to remove contents of WAL directory" msgstr "konnte Inhalt des WAL-Verzeichnisses nicht entfernen" -#: pg_basebackup.c:251 +#: pg_basebackup.c:267 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "Datenverzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt" -#: pg_basebackup.c:254 +#: pg_basebackup.c:270 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "WAL-Verzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt" -#: pg_basebackup.c:258 +#: pg_basebackup.c:274 #, c-format msgid "changes to tablespace directories will not be undone" msgstr "Änderungen in Tablespace-Verzeichnissen werden nicht rückgängig gemacht" -#: pg_basebackup.c:299 +#: pg_basebackup.c:326 #, c-format msgid "directory name too long" msgstr "Verzeichnisname zu lang" -#: pg_basebackup.c:309 +#: pg_basebackup.c:333 #, c-format msgid "multiple \"=\" signs in tablespace mapping" msgstr "mehrere »=«-Zeichen im Tablespace-Mapping" -#: pg_basebackup.c:321 +#: pg_basebackup.c:342 #, c-format msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "ungültiges Tablespace-Mapping-Format »%s«, muss »ALTES_VERZ=NEUES_VERZ« sein" -#: pg_basebackup.c:333 +#: pg_basebackup.c:351 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "altes Verzeichnis im Tablespace-Mapping ist kein absoluter Pfad: %s" -#: pg_basebackup.c:340 +#: pg_basebackup.c:355 #, c-format msgid "new directory is not an absolute path in tablespace mapping: %s" msgstr "neues Verzeichnis im Tablespace-Mapping ist kein absoluter Pfad: %s" -#: pg_basebackup.c:379 +#: pg_basebackup.c:377 #, c-format msgid "" "%s takes a base backup of a running PostgreSQL server.\n" @@ -185,17 +405,17 @@ msgstr "" "%s erzeugt eine Basissicherung eines laufenden PostgreSQL-Servers.\n" "\n" -#: pg_basebackup.c:381 pg_receivewal.c:79 pg_recvlogical.c:75 +#: pg_basebackup.c:379 pg_receivewal.c:81 pg_recvlogical.c:78 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_basebackup.c:382 pg_receivewal.c:80 pg_recvlogical.c:76 +#: pg_basebackup.c:380 pg_receivewal.c:82 pg_recvlogical.c:79 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_basebackup.c:383 +#: pg_basebackup.c:381 #, c-format msgid "" "\n" @@ -204,17 +424,17 @@ msgstr "" "\n" "Optionen die die Ausgabe kontrollieren:\n" -#: pg_basebackup.c:384 +#: pg_basebackup.c:382 #, c-format msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n" msgstr " -D, --pgdata=VERZ Basissicherung in dieses Verzeichnis empfangen\n" -#: pg_basebackup.c:385 +#: pg_basebackup.c:383 #, c-format msgid " -F, --format=p|t output format (plain (default), tar)\n" msgstr " -F, --format=p|t Ausgabeformat (plain (Voreinstellung), tar)\n" -#: pg_basebackup.c:386 +#: pg_basebackup.c:384 #, c-format msgid "" " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" @@ -223,7 +443,7 @@ msgstr "" " -r, --max-rate=RATE maximale Transferrate für Übertragung des Datenver-\n" " zeichnisses (in kB/s, oder Suffix »k« oder »M« abgeben)\n" -#: pg_basebackup.c:388 +#: pg_basebackup.c:386 #, c-format msgid "" " -R, --write-recovery-conf\n" @@ -232,6 +452,13 @@ msgstr "" " -R, --write-recovery-conf\n" " Konfiguration für Replikation schreiben\n" +#: pg_basebackup.c:388 +#, c-format +msgid "" +" -t, --target=TARGET[:DETAIL]\n" +" backup target (if other than client)\n" +msgstr "" + #: pg_basebackup.c:390 #, c-format msgid "" @@ -261,11 +488,24 @@ msgid " -z, --gzip compress tar output\n" msgstr " -z, --gzip Tar-Ausgabe komprimieren\n" #: pg_basebackup.c:396 -#, c-format -msgid " -Z, --compress=0-9 compress tar output with given compression level\n" -msgstr " -Z, --compress=0-9 Tar-Ausgabe mit angegebenem Niveau komprimieren\n" +#, fuzzy, c-format +#| msgid "" +#| " -s, --status-interval=INTERVAL\n" +#| " time between status packets sent to server (in seconds)\n" +msgid "" +" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" +" compress on client or server as specified\n" +msgstr "" +" -s, --status-interval=INTERVALL\n" +" Zeit zwischen an Server gesendeten Statuspaketen (in Sekunden)\n" -#: pg_basebackup.c:397 +#: pg_basebackup.c:398 +#, fuzzy, c-format +#| msgid " -z, --gzip compress tar output\n" +msgid " -Z, --compress=none do not compress tar output\n" +msgstr " -z, --gzip Tar-Ausgabe komprimieren\n" + +#: pg_basebackup.c:399 #, c-format msgid "" "\n" @@ -274,7 +514,7 @@ msgstr "" "\n" "Allgemeine Optionen:\n" -#: pg_basebackup.c:398 +#: pg_basebackup.c:400 #, c-format msgid "" " -c, --checkpoint=fast|spread\n" @@ -283,49 +523,49 @@ msgstr "" " -c, --checkpoint=fast|spread\n" " schnelles oder verteiltes Checkpointing einstellen\n" -#: pg_basebackup.c:400 +#: pg_basebackup.c:402 #, c-format msgid " -C, --create-slot create replication slot\n" msgstr " -C, --create-slot Replikations-Slot erzeugen\n" -#: pg_basebackup.c:401 +#: pg_basebackup.c:403 #, c-format msgid " -l, --label=LABEL set backup label\n" msgstr " -l, --label=LABEL Backup-Label setzen\n" -#: pg_basebackup.c:402 +#: pg_basebackup.c:404 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean nach Fehlern nicht aufräumen\n" -#: pg_basebackup.c:403 +#: pg_basebackup.c:405 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n" " geschrieben sind\n" -#: pg_basebackup.c:404 +#: pg_basebackup.c:406 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress Fortschrittsinformationen zeigen\n" -#: pg_basebackup.c:405 pg_receivewal.c:89 +#: pg_basebackup.c:407 pg_receivewal.c:91 #, c-format msgid " -S, --slot=SLOTNAME replication slot to use\n" msgstr " -S, --slot=SLOTNAME zu verwendender Replikations-Slot\n" -#: pg_basebackup.c:406 pg_receivewal.c:91 pg_recvlogical.c:96 +#: pg_basebackup.c:408 pg_receivewal.c:93 pg_recvlogical.c:100 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose »Verbose«-Modus\n" -#: pg_basebackup.c:407 pg_receivewal.c:92 pg_recvlogical.c:97 +#: pg_basebackup.c:409 pg_receivewal.c:94 pg_recvlogical.c:101 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_basebackup.c:408 +#: pg_basebackup.c:410 #, c-format msgid "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" @@ -334,7 +574,7 @@ msgstr "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" " Algorithmus für Manifest-Prüfsummen\n" -#: pg_basebackup.c:410 +#: pg_basebackup.c:412 #, c-format msgid "" " --manifest-force-encode\n" @@ -343,22 +583,22 @@ msgstr "" " --manifest-force-encode\n" " alle Dateinamen im Manifest hex-kodieren\n" -#: pg_basebackup.c:412 +#: pg_basebackup.c:414 #, c-format msgid " --no-estimate-size do not estimate backup size in server side\n" msgstr " --no-estimate-size nicht die Backup-Größe auf dem Server schätzen\n" -#: pg_basebackup.c:413 +#: pg_basebackup.c:415 #, c-format msgid " --no-manifest suppress generation of backup manifest\n" msgstr " --no-manifest kein Backup-Manifest erzeugen\n" -#: pg_basebackup.c:414 +#: pg_basebackup.c:416 #, c-format msgid " --no-slot prevent creation of temporary replication slot\n" msgstr " --no-slot keinen temporären Replikations-Slot erzeugen\n" -#: pg_basebackup.c:415 +#: pg_basebackup.c:417 #, c-format msgid "" " --no-verify-checksums\n" @@ -367,12 +607,12 @@ msgstr "" " --no-verify-checksums\n" " Prüfsummen nicht überprüfen\n" -#: pg_basebackup.c:417 pg_receivewal.c:94 pg_recvlogical.c:98 +#: pg_basebackup.c:419 pg_receivewal.c:97 pg_recvlogical.c:102 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_basebackup.c:418 pg_receivewal.c:95 pg_recvlogical.c:99 +#: pg_basebackup.c:420 pg_receivewal.c:98 pg_recvlogical.c:103 #, c-format msgid "" "\n" @@ -381,22 +621,22 @@ msgstr "" "\n" "Verbindungsoptionen:\n" -#: pg_basebackup.c:419 pg_receivewal.c:96 +#: pg_basebackup.c:421 pg_receivewal.c:99 #, c-format msgid " -d, --dbname=CONNSTR connection string\n" msgstr " -d, --dbname=VERBDG Verbindungsparameter\n" -#: pg_basebackup.c:420 pg_receivewal.c:97 pg_recvlogical.c:101 +#: pg_basebackup.c:422 pg_receivewal.c:100 pg_recvlogical.c:105 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: pg_basebackup.c:421 pg_receivewal.c:98 pg_recvlogical.c:102 +#: pg_basebackup.c:423 pg_receivewal.c:101 pg_recvlogical.c:106 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT Portnummer des Datenbankservers\n" -#: pg_basebackup.c:422 +#: pg_basebackup.c:424 #, c-format msgid "" " -s, --status-interval=INTERVAL\n" @@ -405,22 +645,22 @@ msgstr "" " -s, --status-interval=INTERVALL\n" " Zeit zwischen an Server gesendeten Statuspaketen (in Sekunden)\n" -#: pg_basebackup.c:424 pg_receivewal.c:99 pg_recvlogical.c:103 +#: pg_basebackup.c:426 pg_receivewal.c:102 pg_recvlogical.c:107 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: pg_basebackup.c:425 pg_receivewal.c:100 pg_recvlogical.c:104 +#: pg_basebackup.c:427 pg_receivewal.c:103 pg_recvlogical.c:108 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: pg_basebackup.c:426 pg_receivewal.c:101 pg_recvlogical.c:105 +#: pg_basebackup.c:428 pg_receivewal.c:104 pg_recvlogical.c:109 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password nach Passwort fragen (sollte automatisch geschehen)\n" -#: pg_basebackup.c:427 pg_receivewal.c:105 pg_recvlogical.c:106 +#: pg_basebackup.c:429 pg_receivewal.c:108 pg_recvlogical.c:110 #, c-format msgid "" "\n" @@ -429,443 +669,495 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_basebackup.c:428 pg_receivewal.c:106 pg_recvlogical.c:107 +#: pg_basebackup.c:430 pg_receivewal.c:109 pg_recvlogical.c:111 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_basebackup.c:471 +#: pg_basebackup.c:472 #, c-format msgid "could not read from ready pipe: %m" msgstr "konnte nicht aus bereiter Pipe lesen: %m" -#: pg_basebackup.c:477 pg_basebackup.c:608 pg_basebackup.c:2133 -#: streamutil.c:450 +#: pg_basebackup.c:475 pg_basebackup.c:622 pg_basebackup.c:2178 +#: streamutil.c:444 #, c-format msgid "could not parse write-ahead log location \"%s\"" msgstr "konnte Write-Ahead-Log-Position »%s« nicht interpretieren" -#: pg_basebackup.c:573 pg_receivewal.c:441 +#: pg_basebackup.c:581 pg_receivewal.c:665 #, c-format msgid "could not finish writing WAL files: %m" msgstr "konnte WAL-Dateien nicht zu Ende schreiben: %m" -#: pg_basebackup.c:620 +#: pg_basebackup.c:631 #, c-format msgid "could not create pipe for background process: %m" msgstr "konnte Pipe für Hintergrundprozess nicht erzeugen: %m" -#: pg_basebackup.c:655 +#: pg_basebackup.c:664 #, c-format msgid "created temporary replication slot \"%s\"" msgstr "temporärer Replikations-Slot »%s« wurde erzeugt" -#: pg_basebackup.c:658 +#: pg_basebackup.c:667 #, c-format msgid "created replication slot \"%s\"" msgstr "Replikations-Slot »%s« wurde erzeugt" -#: pg_basebackup.c:678 pg_basebackup.c:731 pg_basebackup.c:1620 +#: pg_basebackup.c:704 #, c-format -msgid "could not create directory \"%s\": %m" -msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" +msgid "log streamer with pid %d exiting" +msgstr "" -#: pg_basebackup.c:696 +#: pg_basebackup.c:709 #, c-format msgid "could not create background process: %m" msgstr "konnte Hintergrundprozess nicht erzeugen: %m" -#: pg_basebackup.c:708 +#: pg_basebackup.c:718 #, c-format msgid "could not create background thread: %m" msgstr "konnte Hintergrund-Thread nicht erzeugen: %m" -#: pg_basebackup.c:752 +#: pg_basebackup.c:757 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "Verzeichnis »%s« existiert aber ist nicht leer" -#: pg_basebackup.c:759 +#: pg_basebackup.c:763 #, c-format msgid "could not access directory \"%s\": %m" msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" -#: pg_basebackup.c:824 +#: pg_basebackup.c:840 #, c-format msgid "%*s/%s kB (100%%), %d/%d tablespace %*s" msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s" msgstr[0] "%*s/%s kB (100%%), %d/%d Tablespace %*s" msgstr[1] "%*s/%s kB (100%%), %d/%d Tablespaces %*s" -#: pg_basebackup.c:836 +#: pg_basebackup.c:852 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" msgstr[0] "%*s/%s kB (%d%%), %d/%d Tablespace (%s%-*.*s)" msgstr[1] "%*s/%s kB (%d%%), %d/%d Tablespaces (%s%-*.*s)" -#: pg_basebackup.c:852 +#: pg_basebackup.c:868 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces" msgstr[0] "%*s/%s kB (%d%%), %d/%d Tablespace" msgstr[1] "%*s/%s kB (%d%%), %d/%d Tablespaces" -#: pg_basebackup.c:877 +#: pg_basebackup.c:892 #, c-format msgid "transfer rate \"%s\" is not a valid value" msgstr "Transferrate »%s« ist kein gültiger Wert" -#: pg_basebackup.c:882 +#: pg_basebackup.c:894 #, c-format msgid "invalid transfer rate \"%s\": %m" msgstr "ungültige Transferrate »%s«: %m" -#: pg_basebackup.c:891 +#: pg_basebackup.c:901 #, c-format msgid "transfer rate must be greater than zero" msgstr "Transferrate muss größer als null sein" -#: pg_basebackup.c:923 +#: pg_basebackup.c:931 #, c-format msgid "invalid --max-rate unit: \"%s\"" msgstr "ungültige Einheit für --max-rate: »%s«" -#: pg_basebackup.c:930 +#: pg_basebackup.c:935 #, c-format msgid "transfer rate \"%s\" exceeds integer range" msgstr "Transferrate »%s« überschreitet Bereich für ganze Zahlen" -#: pg_basebackup.c:940 +#: pg_basebackup.c:942 #, c-format msgid "transfer rate \"%s\" is out of range" msgstr "Transferrate »%s« ist außerhalb des gültigen Bereichs" -#: pg_basebackup.c:961 +#: pg_basebackup.c:1038 #, c-format msgid "could not get COPY data stream: %s" msgstr "konnte COPY-Datenstrom nicht empfangen: %s" -#: pg_basebackup.c:981 pg_recvlogical.c:435 pg_recvlogical.c:607 -#: receivelog.c:964 +#: pg_basebackup.c:1055 pg_recvlogical.c:438 pg_recvlogical.c:610 +#: receivelog.c:981 #, c-format msgid "could not read COPY data: %s" msgstr "konnte COPY-Daten nicht lesen: %s" -#: pg_basebackup.c:1007 -#, c-format -msgid "could not write to compressed file \"%s\": %s" -msgstr "konnte nicht in komprimierte Datei »%s« schreiben: %s" +#: pg_basebackup.c:1059 +#, fuzzy, c-format +#| msgid "a worker process died unexpectedly" +msgid "background process terminated unexpectedly" +msgstr "ein Arbeitsprozess endete unerwartet" -#: pg_basebackup.c:1071 -#, c-format -msgid "could not duplicate stdout: %m" -msgstr "konnte Standardausgabe nicht duplizieren: %m" +#: pg_basebackup.c:1130 +#, fuzzy, c-format +#| msgid "cannot insert multiple commands into a prepared statement" +msgid "cannot inject manifest into a compressed tarfile" +msgstr "kann nicht mehrere Befehle in vorbereitete Anweisung einfügen" -#: pg_basebackup.c:1078 +#: pg_basebackup.c:1131 #, c-format -msgid "could not open output file: %m" -msgstr "konnte Ausgabedatei nicht öffnen: %m" +msgid "use client-side compression, send the output to a directory rather than standard output, or use --no-manifest" +msgstr "" -#: pg_basebackup.c:1085 pg_basebackup.c:1106 pg_basebackup.c:1135 -#, c-format -msgid "could not set compression level %d: %s" -msgstr "konnte Komprimierungsniveau %d nicht setzen: %s" +#: pg_basebackup.c:1146 +#, fuzzy, c-format +#| msgid "could not parse backup manifest: %s" +msgid "unable to parse archive: %s" +msgstr "konnte Backup-Manifest nicht parsen: %s" -#: pg_basebackup.c:1155 -#, c-format -msgid "could not create compressed file \"%s\": %s" -msgstr "konnte komprimierte Datei »%s« nicht erzeugen: %s" +#: pg_basebackup.c:1147 +#, fuzzy, c-format +#| msgid "only tar mode backups can be compressed" +msgid "Only tar archives can be parsed." +msgstr "nur Sicherungen im Tar-Modus können komprimiert werden" -#: pg_basebackup.c:1267 +#: pg_basebackup.c:1149 #, c-format -msgid "could not close compressed file \"%s\": %s" -msgstr "konnte komprimierte Datei »%s« nicht schließen: %s" +msgid "Plain format requires pg_basebackup to parse the archive." +msgstr "" -#: pg_basebackup.c:1279 pg_recvlogical.c:632 +#: pg_basebackup.c:1151 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "konnte Datei »%s« nicht schließen: %m" +msgid "Using - as the output directory requires pg_basebackup to parse the archive." +msgstr "" -#: pg_basebackup.c:1541 +#: pg_basebackup.c:1153 #, c-format -msgid "COPY stream ended before last file was finished" -msgstr "COPY-Strom endete vor dem Ende der letzten Datei" +msgid "The -R option requires pg_basebackup to parse the archive." +msgstr "" -#: pg_basebackup.c:1570 +#: pg_basebackup.c:1364 #, c-format -msgid "invalid tar block header size: %zu" -msgstr "ungültige Tar-Block-Kopf-Größe: %zu" +msgid "archives should precede manifest" +msgstr "" -#: pg_basebackup.c:1627 -#, c-format -msgid "could not set permissions on directory \"%s\": %m" -msgstr "konnte Zugriffsrechte für Verzeichnis »%s« nicht setzen: %m" +#: pg_basebackup.c:1379 +#, fuzzy, c-format +#| msgid "invalid variable name: \"%s\"" +msgid "invalid archive name: \"%s\"" +msgstr "ungültiger Variablenname: »%s«" -#: pg_basebackup.c:1651 -#, c-format -msgid "could not create symbolic link from \"%s\" to \"%s\": %m" -msgstr "konnte symbolische Verknüpfung von »%s« nach »%s« nicht erzeugen: %m" +#: pg_basebackup.c:1451 +#, fuzzy, c-format +#| msgid "unexpected array start" +msgid "unexpected payload data" +msgstr "unerwarteter Array-Start" -#: pg_basebackup.c:1658 -#, c-format -msgid "unrecognized link indicator \"%c\"" -msgstr "unbekannter Verknüpfungsindikator »%c«" +#: pg_basebackup.c:1594 +#, fuzzy, c-format +#| msgid "empty message text" +msgid "empty COPY message" +msgstr "leerer Nachrichtentext" -#: pg_basebackup.c:1677 -#, c-format -msgid "could not set permissions on file \"%s\": %m" -msgstr "konnte Zugriffsrechte von Datei »%s« nicht setzen: %m" +#: pg_basebackup.c:1596 +#, fuzzy, c-format +#| msgid "malformed SCRAM message (length mismatch)\n" +msgid "malformed COPY message of type %d, length %zu" +msgstr "fehlerhafte SCRAM-Nachricht (Länge stimmt nicht überein)\n" -#: pg_basebackup.c:1831 +#: pg_basebackup.c:1794 #, c-format msgid "incompatible server version %s" msgstr "inkompatible Serverversion %s" -#: pg_basebackup.c:1846 +#: pg_basebackup.c:1810 #, c-format msgid "HINT: use -X none or -X fetch to disable log streaming" msgstr "TIPP: -X none oder -X fetch verwenden um Log-Streaming abzuschalten" -#: pg_basebackup.c:1882 +#: pg_basebackup.c:1878 +#, fuzzy, c-format +#| msgid "Exported snapshots are not supported by this server version." +msgid "backup targets are not supported by this server version" +msgstr "Exportierte Snapshots werden in dieser Serverversion nicht unterstützt." + +#: pg_basebackup.c:1881 +#, c-format +msgid "recovery configuration cannot be written when a backup target is used" +msgstr "" + +#: pg_basebackup.c:1908 +#, fuzzy, c-format +#| msgid "this build does not support compression" +msgid "server does not support server-side compression" +msgstr "diese Installation unterstützt keine Komprimierung" + +#: pg_basebackup.c:1918 #, c-format msgid "initiating base backup, waiting for checkpoint to complete" msgstr "Basissicherung eingeleitet, warte auf Abschluss des Checkpoints" -#: pg_basebackup.c:1908 pg_recvlogical.c:262 receivelog.c:480 receivelog.c:529 -#: receivelog.c:568 streamutil.c:297 streamutil.c:370 streamutil.c:422 -#: streamutil.c:533 streamutil.c:578 +#: pg_basebackup.c:1935 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588 +#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504 +#: streamutil.c:656 streamutil.c:701 #, c-format msgid "could not send replication command \"%s\": %s" msgstr "konnte Replikationsbefehl »%s« nicht senden: %s" -#: pg_basebackup.c:1919 +#: pg_basebackup.c:1943 #, c-format msgid "could not initiate base backup: %s" msgstr "konnte Basissicherung nicht starten: %s" -#: pg_basebackup.c:1925 +#: pg_basebackup.c:1946 #, c-format msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields" msgstr "unerwartete Antwort auf Befehl BASE_BACKUP: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" -#: pg_basebackup.c:1933 +#: pg_basebackup.c:1952 #, c-format msgid "checkpoint completed" msgstr "Checkpoint abgeschlossen" -#: pg_basebackup.c:1948 +#: pg_basebackup.c:1967 #, c-format msgid "write-ahead log start point: %s on timeline %u" msgstr "Write-Ahead-Log-Startpunkt: %s auf Zeitleiste %u" -#: pg_basebackup.c:1957 +#: pg_basebackup.c:1975 #, c-format msgid "could not get backup header: %s" msgstr "konnte Kopf der Sicherung nicht empfangen: %s" -#: pg_basebackup.c:1963 +#: pg_basebackup.c:1978 #, c-format msgid "no data returned from server" msgstr "keine Daten vom Server zurückgegeben" -#: pg_basebackup.c:1995 +#: pg_basebackup.c:2013 #, c-format msgid "can only write single tablespace to stdout, database has %d" msgstr "kann nur einen einzelnen Tablespace auf die Standardausgabe schreiben, Datenbank hat %d" -#: pg_basebackup.c:2007 +#: pg_basebackup.c:2026 #, c-format msgid "starting background WAL receiver" msgstr "Hintergrund-WAL-Receiver wird gestartet" -#: pg_basebackup.c:2046 +#: pg_basebackup.c:2109 #, c-format -msgid "could not get write-ahead log end position from server: %s" -msgstr "konnte Write-Ahead-Log-Endposition nicht vom Server empfangen: %s" +msgid "backup failed: %s" +msgstr "Backup fehlgeschlagen: %s" -#: pg_basebackup.c:2052 +#: pg_basebackup.c:2112 #, c-format msgid "no write-ahead log end position returned from server" msgstr "keine Write-Ahead-Log-Endposition vom Server zurückgegeben" -#: pg_basebackup.c:2057 +#: pg_basebackup.c:2115 #, c-format msgid "write-ahead log end point: %s" msgstr "Write-Ahead-Log-Endposition: %s" -#: pg_basebackup.c:2068 +#: pg_basebackup.c:2126 #, c-format msgid "checksum error occurred" msgstr "ein Prüfsummenfehler ist aufgetreten" -#: pg_basebackup.c:2073 +#: pg_basebackup.c:2131 #, c-format msgid "final receive failed: %s" msgstr "letztes Empfangen fehlgeschlagen: %s" -#: pg_basebackup.c:2097 +#: pg_basebackup.c:2155 #, c-format msgid "waiting for background process to finish streaming ..." msgstr "warte bis Hintergrundprozess Streaming beendet hat ..." -#: pg_basebackup.c:2102 +#: pg_basebackup.c:2159 #, c-format msgid "could not send command to background pipe: %m" msgstr "konnte Befehl nicht an Hintergrund-Pipe senden: %m" -#: pg_basebackup.c:2110 +#: pg_basebackup.c:2164 #, c-format msgid "could not wait for child process: %m" msgstr "konnte nicht auf Kindprozess warten: %m" -#: pg_basebackup.c:2115 +#: pg_basebackup.c:2166 #, c-format msgid "child %d died, expected %d" msgstr "Kindprozess %d endete, aber %d wurde erwartet" -#: pg_basebackup.c:2120 streamutil.c:92 streamutil.c:203 +#: pg_basebackup.c:2168 streamutil.c:91 streamutil.c:197 #, c-format msgid "%s" msgstr "%s" -#: pg_basebackup.c:2145 +#: pg_basebackup.c:2188 #, c-format msgid "could not wait for child thread: %m" msgstr "konnte nicht auf Kind-Thread warten: %m" -#: pg_basebackup.c:2151 +#: pg_basebackup.c:2193 #, c-format msgid "could not get child thread exit status: %m" msgstr "konnte Statuscode des Kind-Threads nicht ermitteln: %m" -#: pg_basebackup.c:2156 +#: pg_basebackup.c:2196 #, c-format msgid "child thread exited with error %u" msgstr "Kind-Thread hat mit Fehler %u beendet" -#: pg_basebackup.c:2184 +#: pg_basebackup.c:2225 #, c-format msgid "syncing data to disk ..." msgstr "synchronisiere Daten auf Festplatte ..." -#: pg_basebackup.c:2209 +#: pg_basebackup.c:2250 #, c-format msgid "renaming backup_manifest.tmp to backup_manifest" msgstr "umbenennen von backup_manifest.tmp nach backup_manifest" -#: pg_basebackup.c:2220 +#: pg_basebackup.c:2270 #, c-format msgid "base backup completed" msgstr "Basissicherung abgeschlossen" -#: pg_basebackup.c:2305 +#: pg_basebackup.c:2359 #, c-format msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"" msgstr "ungültiges Ausgabeformat »%s«, muss »plain« oder »tar« sein" -#: pg_basebackup.c:2349 +#: pg_basebackup.c:2403 #, c-format msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"" msgstr "ungültige Option »%s« für --wal-method, muss »fetch«, »stream« oder »none« sein" -#: pg_basebackup.c:2377 pg_receivewal.c:580 -#, c-format -msgid "invalid compression level \"%s\"" -msgstr "ungültiges Komprimierungsniveau »%s«" - -#: pg_basebackup.c:2388 +#: pg_basebackup.c:2433 #, c-format msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" msgstr "ungültiges Checkpoint-Argument »%s«, muss »fast« oder »spread« sein" -#: pg_basebackup.c:2415 pg_receivewal.c:555 pg_recvlogical.c:820 +#: pg_basebackup.c:2484 pg_basebackup.c:2496 pg_basebackup.c:2518 +#: pg_basebackup.c:2530 pg_basebackup.c:2536 pg_basebackup.c:2588 +#: pg_basebackup.c:2599 pg_basebackup.c:2609 pg_basebackup.c:2615 +#: pg_basebackup.c:2622 pg_basebackup.c:2634 pg_basebackup.c:2646 +#: pg_basebackup.c:2654 pg_basebackup.c:2667 pg_basebackup.c:2673 +#: pg_basebackup.c:2682 pg_basebackup.c:2694 pg_basebackup.c:2705 +#: pg_basebackup.c:2713 pg_receivewal.c:816 pg_receivewal.c:828 +#: pg_receivewal.c:835 pg_receivewal.c:844 pg_receivewal.c:851 +#: pg_receivewal.c:861 pg_recvlogical.c:837 pg_recvlogical.c:849 +#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873 +#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894 +#: pg_recvlogical.c:901 pg_recvlogical.c:908 #, c-format -msgid "invalid status interval \"%s\"" -msgstr "ungültiges Statusintervall »%s«" +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_basebackup.c:2445 pg_basebackup.c:2458 pg_basebackup.c:2469 -#: pg_basebackup.c:2480 pg_basebackup.c:2488 pg_basebackup.c:2496 -#: pg_basebackup.c:2506 pg_basebackup.c:2519 pg_basebackup.c:2528 -#: pg_basebackup.c:2539 pg_basebackup.c:2549 pg_basebackup.c:2567 -#: pg_basebackup.c:2576 pg_basebackup.c:2585 pg_receivewal.c:605 -#: pg_receivewal.c:618 pg_receivewal.c:626 pg_receivewal.c:636 -#: pg_receivewal.c:644 pg_receivewal.c:655 pg_recvlogical.c:846 -#: pg_recvlogical.c:859 pg_recvlogical.c:870 pg_recvlogical.c:878 -#: pg_recvlogical.c:886 pg_recvlogical.c:894 pg_recvlogical.c:902 -#: pg_recvlogical.c:910 pg_recvlogical.c:918 -#, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" - -#: pg_basebackup.c:2456 pg_receivewal.c:616 pg_recvlogical.c:857 +#: pg_basebackup.c:2494 pg_receivewal.c:826 pg_recvlogical.c:847 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_basebackup.c:2468 pg_receivewal.c:654 +#: pg_basebackup.c:2517 +#, fuzzy, c-format +#| msgid "cannot specify both %s and %s" +msgid "cannot specify both format and backup target" +msgstr "%s und %s können nicht beide angegeben werden" + +#: pg_basebackup.c:2529 #, c-format -msgid "no target directory specified" -msgstr "kein Zielverzeichnis angegeben" +msgid "must specify output directory or backup target" +msgstr "" + +#: pg_basebackup.c:2535 +#, fuzzy, c-format +#| msgid "cannot specify both %s and %s" +msgid "cannot specify both output directory and backup target" +msgstr "%s und %s können nicht beide angegeben werden" + +#: pg_basebackup.c:2565 pg_receivewal.c:870 +#, fuzzy, c-format +#| msgid "unrecognized checksum algorithm: \"%s\"" +msgid "unrecognized compression algorithm \"%s\"" +msgstr "unbekannter Prüfsummenalgorithmus: »%s«" + +#: pg_basebackup.c:2571 pg_receivewal.c:877 +#, fuzzy, c-format +#| msgid "invalid compression code: %d" +msgid "invalid compression specification: %s" +msgstr "ungültiger Komprimierungscode: %d" -#: pg_basebackup.c:2479 +#: pg_basebackup.c:2587 +#, c-format +msgid "client-side compression is not possible when a backup target is specified" +msgstr "" + +#: pg_basebackup.c:2598 #, c-format msgid "only tar mode backups can be compressed" msgstr "nur Sicherungen im Tar-Modus können komprimiert werden" -#: pg_basebackup.c:2487 +#: pg_basebackup.c:2608 +#, c-format +msgid "WAL cannot be streamed when a backup target is specified" +msgstr "" + +#: pg_basebackup.c:2614 #, c-format msgid "cannot stream write-ahead logs in tar mode to stdout" msgstr "im Tar-Modus können Write-Ahead-Logs nicht auf Standardausgabe geschrieben werden" -#: pg_basebackup.c:2495 +#: pg_basebackup.c:2621 #, c-format msgid "replication slots can only be used with WAL streaming" msgstr "Replikations-Slots können nur mit WAL-Streaming verwendet werden" -#: pg_basebackup.c:2505 +#: pg_basebackup.c:2633 #, c-format msgid "--no-slot cannot be used with slot name" msgstr "--no-slot kann nicht zusammen mit einem Slot-Namen verwendet werden" #. translator: second %s is an option name -#: pg_basebackup.c:2517 pg_receivewal.c:634 +#: pg_basebackup.c:2644 pg_receivewal.c:842 #, c-format msgid "%s needs a slot to be specified using --slot" msgstr "für %s muss ein Slot mit --slot angegeben werden" -#: pg_basebackup.c:2526 pg_basebackup.c:2565 pg_basebackup.c:2574 -#: pg_basebackup.c:2583 +#: pg_basebackup.c:2652 pg_basebackup.c:2692 pg_basebackup.c:2703 +#: pg_basebackup.c:2711 #, c-format msgid "%s and %s are incompatible options" msgstr "%s und %s sind inkompatible Optionen" -#: pg_basebackup.c:2538 +#: pg_basebackup.c:2666 +#, fuzzy, c-format +#| msgid "WAL directory location can only be specified in plain mode" +msgid "WAL directory location cannot be specified along with a backup target" +msgstr "WAL-Verzeichnis kann nur im »plain«-Modus angegeben werden" + +#: pg_basebackup.c:2672 #, c-format msgid "WAL directory location can only be specified in plain mode" msgstr "WAL-Verzeichnis kann nur im »plain«-Modus angegeben werden" -#: pg_basebackup.c:2548 +#: pg_basebackup.c:2681 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL-Verzeichnis muss absoluten Pfad haben" -#: pg_basebackup.c:2558 pg_receivewal.c:663 -#, c-format -msgid "this build does not support compression" -msgstr "diese Installation unterstützt keine Komprimierung" - -#: pg_basebackup.c:2643 +#: pg_basebackup.c:2782 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m" -#: pg_basebackup.c:2647 +#: pg_basebackup.c:2784 #, c-format msgid "symlinks are not supported on this platform" msgstr "symbolische Verknüpfungen werden auf dieser Plattform nicht unterstützt" -#: pg_receivewal.c:77 +#: pg_receivewal.c:79 #, c-format msgid "" "%s receives PostgreSQL streaming write-ahead logs.\n" @@ -874,7 +1166,7 @@ msgstr "" "%s empfängt PostgreSQL-Write-Ahead-Logs.\n" "\n" -#: pg_receivewal.c:81 pg_recvlogical.c:81 +#: pg_receivewal.c:83 pg_recvlogical.c:84 #, c-format msgid "" "\n" @@ -883,34 +1175,34 @@ msgstr "" "\n" "Optionen:\n" -#: pg_receivewal.c:82 +#: pg_receivewal.c:84 #, c-format msgid " -D, --directory=DIR receive write-ahead log files into this directory\n" msgstr " -D, --directory=VERZ Write-Ahead-Log-Dateien in dieses Verzeichnis empfangen\n" -#: pg_receivewal.c:83 pg_recvlogical.c:82 +#: pg_receivewal.c:85 pg_recvlogical.c:85 #, c-format msgid " -E, --endpos=LSN exit after receiving the specified LSN\n" msgstr " -E, --endpos=LSN nach Empfang der angegebenen LSN beenden\n" -#: pg_receivewal.c:84 pg_recvlogical.c:86 +#: pg_receivewal.c:86 pg_recvlogical.c:89 #, c-format msgid " --if-not-exists do not error if slot already exists when creating a slot\n" msgstr " --if-not-exists keinen Fehler ausgeben, wenn Slot beim Erzeugen schon existiert\n" -#: pg_receivewal.c:85 pg_recvlogical.c:88 +#: pg_receivewal.c:87 pg_recvlogical.c:91 #, c-format msgid " -n, --no-loop do not loop on connection lost\n" msgstr " -n, --no-loop bei Verbindungsverlust nicht erneut probieren\n" -#: pg_receivewal.c:86 +#: pg_receivewal.c:88 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n" " geschrieben sind\n" -#: pg_receivewal.c:87 pg_recvlogical.c:93 +#: pg_receivewal.c:89 pg_recvlogical.c:96 #, c-format msgid "" " -s, --status-interval=SECS\n" @@ -919,17 +1211,19 @@ msgstr "" " -s, --status-interval=SEK\n" " Zeit zwischen an Server gesendeten Statuspaketen (Standard: %d)\n" -#: pg_receivewal.c:90 +#: pg_receivewal.c:92 #, c-format msgid " --synchronous flush write-ahead log immediately after writing\n" msgstr " --synchronous Write-Ahead-Log sofort nach dem Schreiben flushen\n" -#: pg_receivewal.c:93 +#: pg_receivewal.c:95 #, c-format -msgid " -Z, --compress=0-9 compress logs with given compression level\n" -msgstr " -Z, --compress=0-9 Logs mit angegebenem Niveau komprimieren\n" +msgid "" +" -Z, --compress=METHOD[:DETAIL]\n" +" compress as specified\n" +msgstr "" -#: pg_receivewal.c:102 +#: pg_receivewal.c:105 #, c-format msgid "" "\n" @@ -938,123 +1232,180 @@ msgstr "" "\n" "Optionale Aktionen:\n" -#: pg_receivewal.c:103 pg_recvlogical.c:78 +#: pg_receivewal.c:106 pg_recvlogical.c:81 #, c-format msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n" msgstr " --create-slot neuen Replikations-Slot erzeugen (Slot-Name siehe --slot)\n" -#: pg_receivewal.c:104 pg_recvlogical.c:79 +#: pg_receivewal.c:107 pg_recvlogical.c:82 #, c-format msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n" msgstr " --drop-slot Replikations-Slot löschen (Slot-Name siehe --slot)\n" -#: pg_receivewal.c:117 +#: pg_receivewal.c:252 #, c-format msgid "finished segment at %X/%X (timeline %u)" msgstr "Segment bei %X/%X abgeschlossen (Zeitleiste %u)" -#: pg_receivewal.c:124 +#: pg_receivewal.c:259 #, c-format msgid "stopped log streaming at %X/%X (timeline %u)" msgstr "Log-Streaming gestoppt bei %X/%X (Zeitleiste %u)" -#: pg_receivewal.c:140 +#: pg_receivewal.c:275 #, c-format msgid "switched to timeline %u at %X/%X" msgstr "auf Zeitleiste %u umgeschaltet bei %X/%X" -#: pg_receivewal.c:150 +#: pg_receivewal.c:285 #, c-format msgid "received interrupt signal, exiting" msgstr "Interrupt-Signal erhalten, beende" -#: pg_receivewal.c:186 +#: pg_receivewal.c:317 #, c-format msgid "could not close directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht schließen: %m" -#: pg_receivewal.c:272 +#: pg_receivewal.c:384 #, c-format msgid "segment file \"%s\" has incorrect size %lld, skipping" msgstr "Segmentdatei »%s« hat falsche Größe %lld, wird übersprungen" -#: pg_receivewal.c:290 +#: pg_receivewal.c:401 #, c-format msgid "could not open compressed file \"%s\": %m" msgstr "konnte komprimierte Datei »%s« nicht öffnen: %m" -#: pg_receivewal.c:296 +#: pg_receivewal.c:404 #, c-format msgid "could not seek in compressed file \"%s\": %m" msgstr "konnte Positionszeiger in komprimierter Datei »%s« nicht setzen: %m" -#: pg_receivewal.c:304 +#: pg_receivewal.c:410 #, c-format msgid "could not read compressed file \"%s\": %m" msgstr "konnte komprimierte Datei »%s« nicht lesen: %m" -#: pg_receivewal.c:307 +#: pg_receivewal.c:413 #, c-format msgid "could not read compressed file \"%s\": read %d of %zu" msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" -#: pg_receivewal.c:318 +#: pg_receivewal.c:423 #, c-format msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping" msgstr "komprimierte Segmentdatei »%s« hat falsche unkomprimierte Größe %d, wird übersprungen" -#: pg_receivewal.c:422 +#: pg_receivewal.c:451 +#, fuzzy, c-format +#| msgid "could not create SSL context: %s" +msgid "could not create LZ4 decompression context: %s" +msgstr "konnte SSL-Kontext nicht erzeugen: %s" + +#: pg_receivewal.c:463 #, c-format -msgid "starting log streaming at %X/%X (timeline %u)" -msgstr "starte Log-Streaming bei %X/%X (Zeitleiste %u)" +msgid "could not read file \"%s\": %m" +msgstr "konnte Datei »%s« nicht lesen: %m" -#: pg_receivewal.c:537 pg_recvlogical.c:762 +#: pg_receivewal.c:481 #, c-format -msgid "invalid port number \"%s\"" -msgstr "ungültige Portnummer »%s«" +msgid "could not decompress file \"%s\": %s" +msgstr "konnte Datei »%s« nicht dekomprimieren: %s" + +#: pg_receivewal.c:504 +#, fuzzy, c-format +#| msgid "could not close compression stream: %s" +msgid "could not free LZ4 decompression context: %s" +msgstr "konnte Komprimierungsstrom nicht schließen: %s" -#: pg_receivewal.c:565 pg_recvlogical.c:788 +#: pg_receivewal.c:509 +#, c-format +msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping" +msgstr "komprimierte Segmentdatei »%s« hat falsche unkomprimierte Größe %zu, wird übersprungen" + +#: pg_receivewal.c:514 +#, fuzzy, c-format +#| msgid "could not close file \"%s\": %m" +msgid "could not check file \"%s\"" +msgstr "konnte Datei »%s« nicht schließen: %m" + +#: pg_receivewal.c:516 +#, fuzzy, c-format +#| msgid "this build does not support compression" +msgid "This build does not support compression with %s." +msgstr "diese Installation unterstützt keine Komprimierung" + +#: pg_receivewal.c:643 +#, c-format +msgid "starting log streaming at %X/%X (timeline %u)" +msgstr "starte Log-Streaming bei %X/%X (Zeitleiste %u)" + +#: pg_receivewal.c:785 pg_recvlogical.c:785 #, c-format msgid "could not parse end position \"%s\"" msgstr "konnte Endposition »%s« nicht parsen" -#: pg_receivewal.c:625 +#: pg_receivewal.c:834 #, c-format msgid "cannot use --create-slot together with --drop-slot" msgstr "--create-slot kann nicht zusammen mit --drop-slot verwendet werden" -#: pg_receivewal.c:643 +#: pg_receivewal.c:850 #, c-format msgid "cannot use --synchronous together with --no-sync" msgstr "--synchronous kann nicht zusammen mit --no-sync verwendet werden" -#: pg_receivewal.c:719 +#: pg_receivewal.c:860 +#, c-format +msgid "no target directory specified" +msgstr "kein Zielverzeichnis angegeben" + +#: pg_receivewal.c:893 +#, fuzzy, c-format +#| msgid "multiple values specified for connection type" +msgid "no value specified for --compress, switching to default" +msgstr "mehrere Werte angegeben für Verbindungstyp" + +#: pg_receivewal.c:897 pg_receivewal.c:903 +#, fuzzy, c-format +#| msgid "this build does not support compression" +msgid "this build does not support compression with %s" +msgstr "diese Installation unterstützt keine Komprimierung" + +#: pg_receivewal.c:908 +#, fuzzy, c-format +#| msgid "compression method lz4 not supported" +msgid "compression with %s is not yet supported" +msgstr "Komprimierungsmethode lz4 nicht unterstützt" + +#: pg_receivewal.c:953 #, c-format msgid "replication connection using slot \"%s\" is unexpectedly database specific" msgstr "Replikationsverbindung, die Slot »%s« verwendet, ist unerwarteterweise datenbankspezifisch" -#: pg_receivewal.c:730 pg_recvlogical.c:966 +#: pg_receivewal.c:972 pg_recvlogical.c:955 #, c-format msgid "dropping replication slot \"%s\"" msgstr "lösche Replikations-Slot »%s«" -#: pg_receivewal.c:741 pg_recvlogical.c:976 +#: pg_receivewal.c:983 pg_recvlogical.c:965 #, c-format msgid "creating replication slot \"%s\"" msgstr "erzeuge Replikations-Slot »%s«" -#: pg_receivewal.c:767 pg_recvlogical.c:1001 +#: pg_receivewal.c:1012 pg_recvlogical.c:989 #, c-format msgid "disconnected" msgstr "Verbindung beendet" #. translator: check source for value for %d -#: pg_receivewal.c:773 pg_recvlogical.c:1007 +#: pg_receivewal.c:1016 pg_recvlogical.c:993 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "Verbindung beendet; erneuter Versuch in %d Sekunden" -#: pg_recvlogical.c:73 +#: pg_recvlogical.c:76 #, c-format msgid "" "%s controls PostgreSQL logical decoding streams.\n" @@ -1063,7 +1414,7 @@ msgstr "" "%s kontrolliert logische Dekodierungsströme von PostgreSQL.\n" "\n" -#: pg_recvlogical.c:77 +#: pg_recvlogical.c:80 #, c-format msgid "" "\n" @@ -1072,17 +1423,17 @@ msgstr "" "\n" "Auszuführende Aktion:\n" -#: pg_recvlogical.c:80 +#: pg_recvlogical.c:83 #, c-format msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n" msgstr " --start Streaming in einem Replikations-Slot starten (Slot-Name siehe --slot)\n" -#: pg_recvlogical.c:83 +#: pg_recvlogical.c:86 #, c-format msgid " -f, --file=FILE receive log into this file, - for stdout\n" msgstr " -f, --file=DATEI Log in diese Datei empfangen, - für Standardausgabe\n" -#: pg_recvlogical.c:84 +#: pg_recvlogical.c:87 #, c-format msgid "" " -F --fsync-interval=SECS\n" @@ -1091,12 +1442,12 @@ msgstr "" " -F --fsync-interval=SEK\n" " Zeit zwischen Fsyncs der Ausgabedatei (Standard: %d)\n" -#: pg_recvlogical.c:87 +#: pg_recvlogical.c:90 #, c-format msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n" msgstr " -I, --startpos=LSN wo in einem bestehenden Slot das Streaming starten soll\n" -#: pg_recvlogical.c:89 +#: pg_recvlogical.c:92 #, c-format msgid "" " -o, --option=NAME[=VALUE]\n" @@ -1107,32 +1458,37 @@ msgstr "" " Option NAME mit optionalem Wert WERT an den\n" " Ausgabe-Plugin übergeben\n" -#: pg_recvlogical.c:92 +#: pg_recvlogical.c:95 #, c-format msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n" msgstr " -P, --plugin=PLUGIN Ausgabe-Plugin PLUGIN verwenden (Standard: %s)\n" -#: pg_recvlogical.c:95 +#: pg_recvlogical.c:98 #, c-format msgid " -S, --slot=SLOTNAME name of the logical replication slot\n" msgstr " -S, --slot=SLOTNAME Name des logischen Replikations-Slots\n" -#: pg_recvlogical.c:100 +#: pg_recvlogical.c:99 +#, c-format +msgid " -t, --two-phase enable two-phase decoding when creating a slot\n" +msgstr "" + +#: pg_recvlogical.c:104 #, c-format msgid " -d, --dbname=DBNAME database to connect to\n" msgstr " -d, --dbname=DBNAME Datenbank, mit der verbunden werden soll\n" -#: pg_recvlogical.c:133 +#: pg_recvlogical.c:137 #, c-format msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)" msgstr "bestätige Schreiben bis %X/%X, Flush bis %X/%X (Slot %s)" -#: pg_recvlogical.c:157 receivelog.c:342 +#: pg_recvlogical.c:161 receivelog.c:366 #, c-format msgid "could not send feedback packet: %s" msgstr "konnte Rückmeldungspaket nicht senden: %s" -#: pg_recvlogical.c:230 +#: pg_recvlogical.c:229 #, c-format msgid "starting log streaming at %X/%X (slot %s)" msgstr "starte Log-Streaming bei %X/%X (Slot %s)" @@ -1147,97 +1503,99 @@ msgstr "Streaming eingeleitet" msgid "could not open log file \"%s\": %m" msgstr "konnte Logdatei »%s« nicht öffnen: %m" -#: pg_recvlogical.c:361 receivelog.c:872 +#: pg_recvlogical.c:364 receivelog.c:889 #, c-format msgid "invalid socket: %s" msgstr "ungültiges Socket: %s" -#: pg_recvlogical.c:414 receivelog.c:900 +#: pg_recvlogical.c:417 receivelog.c:917 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: pg_recvlogical.c:421 receivelog.c:950 +#: pg_recvlogical.c:424 receivelog.c:967 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "konnte keine Daten vom WAL-Stream empfangen: %s" -#: pg_recvlogical.c:463 pg_recvlogical.c:514 receivelog.c:994 receivelog.c:1060 +#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011 +#: receivelog.c:1074 #, c-format msgid "streaming header too small: %d" msgstr "Streaming-Header zu klein: %d" -#: pg_recvlogical.c:498 receivelog.c:832 +#: pg_recvlogical.c:501 receivelog.c:849 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "unbekannter Streaming-Header: »%c«" -#: pg_recvlogical.c:552 pg_recvlogical.c:564 +#: pg_recvlogical.c:555 pg_recvlogical.c:567 #, c-format -msgid "could not write %u bytes to log file \"%s\": %m" -msgstr "konnte %u Bytes nicht in Logdatei »%s« schreiben: %m" +msgid "could not write %d bytes to log file \"%s\": %m" +msgstr "konnte %d Bytes nicht in Logdatei »%s« schreiben: %m" -#: pg_recvlogical.c:618 receivelog.c:628 receivelog.c:665 +#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "unerwarteter Abbruch des Replikations-Streams: %s" -#: pg_recvlogical.c:742 -#, c-format -msgid "invalid fsync interval \"%s\"" -msgstr "ungültiges Fsync-Intervall »%s«" - #: pg_recvlogical.c:780 #, c-format msgid "could not parse start position \"%s\"" msgstr "konnte Startposition »%s« nicht parsen" -#: pg_recvlogical.c:869 +#: pg_recvlogical.c:858 #, c-format msgid "no slot specified" msgstr "kein Slot angegeben" -#: pg_recvlogical.c:877 +#: pg_recvlogical.c:865 #, c-format msgid "no target file specified" msgstr "keine Zieldatei angegeben" -#: pg_recvlogical.c:885 +#: pg_recvlogical.c:872 #, c-format msgid "no database specified" msgstr "keine Datenbank angegeben" -#: pg_recvlogical.c:893 +#: pg_recvlogical.c:879 #, c-format msgid "at least one action needs to be specified" msgstr "mindestens eine Aktion muss angegeben werden" -#: pg_recvlogical.c:901 +#: pg_recvlogical.c:886 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "--create-slot oder --start kann nicht zusammen mit --drop-slot verwendet werden" -#: pg_recvlogical.c:909 +#: pg_recvlogical.c:893 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "--create-slot oder --drop-slot kann nicht zusammen mit --startpos verwendet werden" -#: pg_recvlogical.c:917 +#: pg_recvlogical.c:900 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos kann nur zusammen mit --start angegeben werden" -#: pg_recvlogical.c:948 +#: pg_recvlogical.c:907 +#, fuzzy, c-format +#| msgid "--endpos may only be specified with --start" +msgid "--two-phase may only be specified with --create-slot" +msgstr "--endpos kann nur zusammen mit --start angegeben werden" + +#: pg_recvlogical.c:939 #, c-format msgid "could not establish database-specific replication connection" msgstr "konnte keine datenbankspezifische Replikationsverbindung herstellen" -#: pg_recvlogical.c:1047 +#: pg_recvlogical.c:1033 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "Endposition %X/%X durch Keepalive erreicht" -#: pg_recvlogical.c:1050 +#: pg_recvlogical.c:1036 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "Endposition %X/%X erreicht durch WAL-Eintrag bei %X/%X" @@ -1247,232 +1605,257 @@ msgstr "Endposition %X/%X erreicht durch WAL-Eintrag bei %X/%X" msgid "could not create archive status file \"%s\": %s" msgstr "konnte Archivstatusdatei »%s« nicht erstellen: %s" -#: receivelog.c:115 +#: receivelog.c:75 +#, c-format +msgid "could not close archive status file \"%s\": %s" +msgstr "konnte Archivstatusdatei »%s« nicht schließen: %s" + +#: receivelog.c:123 #, c-format msgid "could not get size of write-ahead log file \"%s\": %s" msgstr "konnte Größe der Write-Ahead-Log-Datei »%s« nicht ermittlen: %s" -#: receivelog.c:125 +#: receivelog.c:134 #, c-format msgid "could not open existing write-ahead log file \"%s\": %s" msgstr "konnte bestehende Write-Ahead-Log-Datei »%s« nicht öffnen: %s" -#: receivelog.c:133 +#: receivelog.c:143 #, c-format msgid "could not fsync existing write-ahead log file \"%s\": %s" msgstr "konnte bestehende Write-Ahead-Log-Datei »%s« nicht fsyncen: %s" -#: receivelog.c:147 +#: receivelog.c:158 #, c-format -msgid "write-ahead log file \"%s\" has %d byte, should be 0 or %d" -msgid_plural "write-ahead log file \"%s\" has %d bytes, should be 0 or %d" -msgstr[0] "Write-Ahead-Log-Datei »%s« hat %d Byte, sollte 0 oder %d sein" -msgstr[1] "Write-Ahead-Log-Datei »%s« hat %d Bytes, sollte 0 oder %d sein" +msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d" +msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d" +msgstr[0] "Write-Ahead-Log-Datei »%s« hat %zd Byte, sollte 0 oder %d sein" +msgstr[1] "Write-Ahead-Log-Datei »%s« hat %zd Bytes, sollte 0 oder %d sein" -#: receivelog.c:162 +#: receivelog.c:174 #, c-format msgid "could not open write-ahead log file \"%s\": %s" msgstr "konnte Write-Ahead-Log-Datei »%s« nicht öffnen: %s" -#: receivelog.c:188 +#: receivelog.c:208 #, c-format msgid "could not determine seek position in file \"%s\": %s" msgstr "konnte Positionszeiger in Datei »%s« nicht ermitteln: %s" -#: receivelog.c:202 +#: receivelog.c:223 #, c-format -msgid "not renaming \"%s%s\", segment is not complete" -msgstr "»%s%s« wird nicht umbenannt, Segment ist noch nicht vollständig" +msgid "not renaming \"%s\", segment is not complete" +msgstr "»%s« wird nicht umbenannt, Segment ist noch nicht vollständig" -#: receivelog.c:214 receivelog.c:299 receivelog.c:674 +#: receivelog.c:234 receivelog.c:323 receivelog.c:694 #, c-format msgid "could not close file \"%s\": %s" msgstr "konnte Datei »%s« nicht schließen: %s" -#: receivelog.c:271 +#: receivelog.c:295 #, c-format msgid "server reported unexpected history file name for timeline %u: %s" msgstr "Server berichtete unerwarteten History-Dateinamen für Zeitleiste %u: %s" -#: receivelog.c:279 +#: receivelog.c:303 #, c-format msgid "could not create timeline history file \"%s\": %s" msgstr "konnte Zeitleisten-History-Datei »%s« nicht erzeugen: %s" -#: receivelog.c:286 +#: receivelog.c:310 #, c-format msgid "could not write timeline history file \"%s\": %s" msgstr "konnte Zeitleisten-History-Datei »%s« nicht schreiben: %s" -#: receivelog.c:376 +#: receivelog.c:400 #, c-format msgid "incompatible server version %s; client does not support streaming from server versions older than %s" msgstr "inkompatible Serverversion %s; Client unterstützt Streaming nicht mit Serverversionen älter als %s" -#: receivelog.c:385 +#: receivelog.c:409 #, c-format msgid "incompatible server version %s; client does not support streaming from server versions newer than %s" msgstr "inkompatible Serverversion %s; Client unterstützt Streaming nicht mit Serverversionen neuer als %s" -#: receivelog.c:487 streamutil.c:430 streamutil.c:467 -#, c-format -msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" -msgstr "Konnte System nicht identifizieren: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet" - -#: receivelog.c:494 +#: receivelog.c:514 #, c-format msgid "system identifier does not match between base backup and streaming connection" msgstr "Systemidentifikator stimmt nicht zwischen Basissicherung und Streaming-Verbindung überein" -#: receivelog.c:500 +#: receivelog.c:522 #, c-format msgid "starting timeline %u is not present in the server" msgstr "Startzeitleiste %u ist auf dem Server nicht vorhanden" -#: receivelog.c:541 +#: receivelog.c:561 #, c-format msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields" msgstr "unerwartete Antwort auf Befehl TIMELINE_HISTORY: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" -#: receivelog.c:612 +#: receivelog.c:632 #, c-format msgid "server reported unexpected next timeline %u, following timeline %u" msgstr "Server berichtete unerwartete nächste Zeitleiste %u, folgend auf Zeitleiste %u" -#: receivelog.c:618 +#: receivelog.c:638 #, c-format msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X" msgstr "Server beendete Streaming von Zeitleiste %u bei %X/%X, aber gab an, dass nächste Zeitleiste %u bei %X/%X beginnt" -#: receivelog.c:658 +#: receivelog.c:678 #, c-format msgid "replication stream was terminated before stop point" msgstr "Replikationsstrom wurde vor Stopppunkt abgebrochen" -#: receivelog.c:704 +#: receivelog.c:724 #, c-format msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields" msgstr "unerwartete Ergebnismenge nach Ende der Zeitleiste: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" -#: receivelog.c:713 +#: receivelog.c:733 #, c-format msgid "could not parse next timeline's starting point \"%s\"" msgstr "konnte Startpunkt der nächsten Zeitleiste (»%s«) nicht interpretieren" -#: receivelog.c:762 receivelog.c:1014 +#: receivelog.c:781 receivelog.c:1030 walmethods.c:1203 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "konnte Datei »%s« nicht fsyncen: %s" -#: receivelog.c:1077 +#: receivelog.c:1091 #, c-format msgid "received write-ahead log record for offset %u with no file open" msgstr "Write-Ahead-Log-Eintrag für Offset %u erhalten ohne offene Datei" -#: receivelog.c:1087 +#: receivelog.c:1101 #, c-format msgid "got WAL data offset %08x, expected %08x" msgstr "WAL-Daten-Offset %08x erhalten, %08x erwartet" -#: receivelog.c:1121 +#: receivelog.c:1135 #, c-format -msgid "could not write %u bytes to WAL file \"%s\": %s" -msgstr "konnte %u Bytes nicht in WAL-Datei »%s« schreiben: %s" +msgid "could not write %d bytes to WAL file \"%s\": %s" +msgstr "konnte %d Bytes nicht in WAL-Datei »%s« schreiben: %s" -#: receivelog.c:1146 receivelog.c:1186 receivelog.c:1216 +#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230 #, c-format msgid "could not send copy-end packet: %s" msgstr "konnte COPY-Ende-Paket nicht senden: %s" -#: streamutil.c:162 +#: streamutil.c:159 msgid "Password: " msgstr "Passwort: " -#: streamutil.c:186 +#: streamutil.c:182 #, c-format msgid "could not connect to server" msgstr "konnte nicht mit Server verbinden" -#: streamutil.c:231 +#: streamutil.c:225 #, c-format msgid "could not clear search_path: %s" msgstr "konnte search_path nicht auf leer setzen: %s" -#: streamutil.c:247 +#: streamutil.c:241 #, c-format msgid "could not determine server setting for integer_datetimes" msgstr "konnte Servereinstellung für integer_datetimes nicht ermitteln" -#: streamutil.c:254 +#: streamutil.c:248 #, c-format msgid "integer_datetimes compile flag does not match server" msgstr "Kompilieroption »integer_datetimes« stimmt nicht mit Server überein" -#: streamutil.c:305 +#: streamutil.c:299 #, c-format msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "konnte WAL-Segmentgröße nicht ermitteln: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet" -#: streamutil.c:315 +#: streamutil.c:309 #, c-format msgid "WAL segment size could not be parsed" msgstr "WAL-Segmentgröße konnte nicht interpretiert werden" -#: streamutil.c:333 +#: streamutil.c:327 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes" msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Server gab einen Wert von %d Byte an" msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Server gab einen Wert von %d Bytes an" -#: streamutil.c:378 +#: streamutil.c:372 #, c-format msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "konnte Gruppenzugriffseinstellung nicht ermitteln: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet" -#: streamutil.c:387 +#: streamutil.c:381 #, c-format msgid "group access flag could not be parsed: %s" msgstr "Gruppenzugriffseinstellung konnte nicht interpretiert werden: %s" -#: streamutil.c:544 +#: streamutil.c:424 streamutil.c:461 +#, c-format +msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" +msgstr "Konnte System nicht identifizieren: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet" + +#: streamutil.c:513 +#, fuzzy, c-format +#| msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" +msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" +msgstr "konnte Replikations-Slot »%s« nicht erzeugen: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" + +#: streamutil.c:525 +#, fuzzy, c-format +#| msgid "could not copy replication slot \"%s\"" +msgid "could not find replication slot \"%s\"" +msgstr "konnte Replikations-Slot »%s« nicht kopieren" + +#: streamutil.c:536 +#, fuzzy, c-format +#| msgid "cannot read from logical replication slot \"%s\"" +msgid "expected a physical replication slot, got type \"%s\" instead" +msgstr "kann nicht aus logischem Replikations-Slot »%s« lesen" + +#: streamutil.c:550 +#, fuzzy, c-format +#| msgid "could not parse start WAL location \"%s\"" +msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" +msgstr "konnte WAL-Startposition »%s« nicht parsen" + +#: streamutil.c:667 #, c-format msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "konnte Replikations-Slot »%s« nicht erzeugen: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" -#: streamutil.c:588 +#: streamutil.c:711 #, c-format msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "konnte Replikations-Slot »%s« nicht löschen: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" -#: walmethods.c:438 walmethods.c:932 +#: walmethods.c:720 walmethods.c:1265 msgid "could not compress data" msgstr "konnte Daten nicht komprimieren" -#: walmethods.c:470 +#: walmethods.c:749 msgid "could not reset compression stream" msgstr "konnte Komprimierungsstrom nicht zurücksetzen" -#: walmethods.c:568 -msgid "could not initialize compression library" -msgstr "konnte Komprimierungsbibliothek nicht initialisieren" - -#: walmethods.c:580 +#: walmethods.c:880 msgid "implementation error: tar files can't have more than one open file" msgstr "Implementierungsfehler: Tar-Dateien können nicht mehr als eine offene Datei haben" -#: walmethods.c:594 +#: walmethods.c:894 msgid "could not create tar header" msgstr "konnte Tar-Dateikopf nicht erzeugen" -#: walmethods.c:608 walmethods.c:650 walmethods.c:847 walmethods.c:859 +#: walmethods.c:910 walmethods.c:950 walmethods.c:1169 walmethods.c:1181 msgid "could not change compression parameters" msgstr "konnte Komprimierungsparameter nicht ändern" -#: walmethods.c:734 +#: walmethods.c:1054 msgid "unlink not supported with compression" msgstr "Unlink wird bei Komprimierung nicht unterstützt" -#: walmethods.c:957 +#: walmethods.c:1289 msgid "could not close compression stream" msgstr "konnte Komprimierungsstrom nicht schließen" diff --git a/src/bin/pg_basebackup/po/fr.po b/src/bin/pg_basebackup/po/fr.po index b6903d4a14..31e118cc9b 100644 --- a/src/bin/pg_basebackup/po/fr.po +++ b/src/bin/pg_basebackup/po/fr.po @@ -1,38 +1,80 @@ # LANGUAGE message translation file for pg_basebackup -# Copyright (C) 2011 PostgreSQL Global Development Group -# This file is distributed under the same license as the PostgreSQL package. -# FIRST AUTHOR , 2011. +# Copyright (C) 2011-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_basebackup (PostgreSQL) package. +# +# Use these quotes: « %s » +# +# Guillaume Lelarge , 2011-2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-26 06:47+0000\n" -"PO-Revision-Date: 2021-04-26 11:37+0200\n" -"Last-Translator: Christophe Courtois \n" +"POT-Creation-Date: 2022-05-14 10:17+0000\n" +"PO-Revision-Date: 2022-05-14 17:15+0200\n" +"Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 2.4.2\n" - -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "fatal : " +"X-Generator: Poedit 3.0.1\n" -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "attention : " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "astuce : " + +#: ../../common/compression.c:157 +msgid "found empty string where a compression option was expected" +msgstr "a trouvé une chaîne vide alors qu'une option de compression était attendue" + +#: ../../common/compression.c:187 +#, c-format +msgid "unknown compression option \"%s\"" +msgstr "option de compression « %s » inconnue" + +#: ../../common/compression.c:226 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "l'option de compression « %s » requiert une valeur" + +#: ../../common/compression.c:235 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "la valeur pour l'option de compression « %s » doit être un entier" + +#: ../../common/compression.c:273 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "l'algorithme de compression « %s » n'accepte pas un niveau de compression" + +#: ../../common/compression.c:277 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d" +msgstr "l'algorithme de compression « %s » attend un niveau de compression compris entre %d et %d" + +#: ../../common/compression.c:289 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "l'algorithme de compression « %s » n'accepte pas un nombre de workers" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -45,157 +87,324 @@ msgid "cannot duplicate null pointer (internal error)\n" msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" #: ../../common/file_utils.c:87 ../../common/file_utils.c:451 -#: pg_receivewal.c:266 pg_recvlogical.c:340 +#: pg_receivewal.c:380 pg_recvlogical.c:341 #, c-format msgid "could not stat file \"%s\": %m" msgstr "n'a pas pu tester le fichier « %s » : %m" -#: ../../common/file_utils.c:166 pg_receivewal.c:169 +#: ../../common/file_utils.c:166 pg_receivewal.c:303 #, c-format msgid "could not open directory \"%s\": %m" msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" -#: ../../common/file_utils.c:200 pg_receivewal.c:337 +#: ../../common/file_utils.c:200 pg_receivewal.c:534 #, c-format msgid "could not read directory \"%s\": %m" msgstr "n'a pas pu lire le répertoire « %s » : %m" #: ../../common/file_utils.c:232 ../../common/file_utils.c:291 -#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:134 +#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121 +#: pg_receivewal.c:447 #, c-format msgid "could not open file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier « %s » : %m" #: ../../common/file_utils.c:303 ../../common/file_utils.c:373 -#: pg_recvlogical.c:193 +#: pg_recvlogical.c:196 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" -#: ../../common/file_utils.c:383 +#: ../../common/file_utils.c:383 pg_basebackup.c:2264 walmethods.c:459 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" -#: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49 -#: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100 -#: ../../fe_utils/recovery_gen.c:171 pg_basebackup.c:1248 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "valeur « %s » invalide pour l'option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s doit être compris entre %d et %d" + +#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 +#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 +#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1643 #, c-format msgid "out of memory" msgstr "mémoire épuisée" -#: ../../fe_utils/recovery_gen.c:140 pg_basebackup.c:1021 pg_basebackup.c:1714 -#: pg_basebackup.c:1770 +#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121 +#: bbstreamer_file.c:258 pg_basebackup.c:1440 pg_basebackup.c:1734 #, c-format msgid "could not write to file \"%s\": %m" msgstr "n'a pas pu écrire dans le fichier « %s » : %m" -#: ../../fe_utils/recovery_gen.c:152 pg_basebackup.c:1166 pg_basebackup.c:1671 -#: pg_basebackup.c:1747 +#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339 +#: pg_basebackup.c:1504 pg_basebackup.c:1713 #, c-format msgid "could not create file \"%s\": %m" msgstr "n'a pas pu créer le fichier « %s » : %m" -#: pg_basebackup.c:224 +#: bbstreamer_file.c:138 pg_recvlogical.c:635 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "n'a pas pu fermer le fichier « %s » : %m" + +#: bbstreamer_file.c:275 +#, c-format +msgid "unexpected state while extracting archive" +msgstr "état inattendu lors de l'extraction de l'archive" + +#: bbstreamer_file.c:298 pg_basebackup.c:686 pg_basebackup.c:738 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "n'a pas pu créer le répertoire « %s » : %m" + +#: bbstreamer_file.c:304 +#, c-format +msgid "could not set permissions on directory \"%s\": %m" +msgstr "n'a pas pu configurer les droits du répertoire « %s » : %m" + +#: bbstreamer_file.c:323 +#, c-format +msgid "could not create symbolic link from \"%s\" to \"%s\": %m" +msgstr "n'a pas pu créer le lien symbolique de « %s » vers « %s » : %m" + +#: bbstreamer_file.c:343 +#, c-format +msgid "could not set permissions on file \"%s\": %m" +msgstr "n'a pas pu initialiser les droits du fichier « %s » : %m" + +#: bbstreamer_gzip.c:95 +#, c-format +msgid "could not create compressed file \"%s\": %m" +msgstr "n'a pas pu créer le fichier compressé « %s » : %m" + +#: bbstreamer_gzip.c:103 +#, c-format +msgid "could not duplicate stdout: %m" +msgstr "n'a pas pu dupliquer la sortie (stdout) : %m" + +#: bbstreamer_gzip.c:107 +#, c-format +msgid "could not open output file: %m" +msgstr "n'a pas pu ouvrir le fichier de sauvegarde : %m" + +#: bbstreamer_gzip.c:113 +#, c-format +msgid "could not set compression level %d: %s" +msgstr "n'a pas pu configurer le niveau de compression %d : %s" + +#: bbstreamer_gzip.c:118 bbstreamer_gzip.c:251 +#, c-format +msgid "this build does not support gzip compression" +msgstr "cette construction ne supporte pas la compression gzip" + +#: bbstreamer_gzip.c:145 +#, c-format +msgid "could not write to compressed file \"%s\": %s" +msgstr "n'a pas pu écrire dans le fichier compressé « %s » : %s" + +#: bbstreamer_gzip.c:169 +#, c-format +msgid "could not close compressed file \"%s\": %m" +msgstr "n'a pas pu fermer le fichier compressé « %s » : %m" + +#: bbstreamer_gzip.c:247 walmethods.c:869 +#, c-format +msgid "could not initialize compression library" +msgstr "n'a pas pu initialiser la bibliothèque de compression" + +#: bbstreamer_gzip.c:298 bbstreamer_lz4.c:355 bbstreamer_zstd.c:319 +#, c-format +msgid "could not decompress data: %s" +msgstr "n'a pas pu décompresser les données : %s" + +#: bbstreamer_inject.c:189 +#, c-format +msgid "unexpected state while injecting recovery settings" +msgstr "état inattendu lors de l'injection des paramètres de restauration" + +#: bbstreamer_lz4.c:96 +#, c-format +msgid "could not create lz4 compression context: %s" +msgstr "n'a pas pu créer le contexte de compression lz4 : %s" + +#: bbstreamer_lz4.c:101 bbstreamer_lz4.c:299 +#, c-format +msgid "this build does not support lz4 compression" +msgstr "cette construction ne supporte pas la compression lz4" + +#: bbstreamer_lz4.c:141 +#, c-format +msgid "could not write lz4 header: %s" +msgstr "n'a pas pu écrire l'entête lz4 : %s" + +#: bbstreamer_lz4.c:190 bbstreamer_zstd.c:171 bbstreamer_zstd.c:213 +#, c-format +msgid "could not compress data: %s" +msgstr "n'a pas pu compresser les données : %s" + +#: bbstreamer_lz4.c:242 +#, c-format +msgid "could not end lz4 compression: %s" +msgstr "n'a pas pu terminer la compression lz4 : %s" + +#: bbstreamer_lz4.c:294 +#, c-format +msgid "could not initialize compression library: %s" +msgstr "n'a pas pu initialiser la bibliothèque de compression : %s" + +#: bbstreamer_tar.c:244 +#, c-format +msgid "tar file trailer exceeds 2 blocks" +msgstr "la fin du fichier tar fait plus de 2 blocs" + +#: bbstreamer_tar.c:249 +#, c-format +msgid "unexpected state while parsing tar archive" +msgstr "état inattendu lors de l'analyse de l'archive tar" + +#: bbstreamer_tar.c:296 +#, c-format +msgid "tar member has empty name" +msgstr "le membre de tar a un nom vide" + +#: bbstreamer_tar.c:328 +#, c-format +msgid "COPY stream ended before last file was finished" +msgstr "le flux COPY s'est terminé avant que le dernier fichier soit terminé" + +#: bbstreamer_zstd.c:85 +#, c-format +msgid "could not create zstd compression context" +msgstr "n'a pas pu créer le contexte de compression zstd" + +#: bbstreamer_zstd.c:93 +#, c-format +msgid "could not set zstd compression level to %d: %s" +msgstr "n'a pas pu configurer le niveau de compression zstd à %d : %s" + +#: bbstreamer_zstd.c:108 +#, c-format +msgid "could not set compression worker count to %d: %s" +msgstr "n'a pas pu configurer le nombre de workers de compression à %d : %s" + +#: bbstreamer_zstd.c:119 bbstreamer_zstd.c:274 +#, c-format +msgid "this build does not support zstd compression" +msgstr "cette construction ne supporte pas la compression zstd" + +#: bbstreamer_zstd.c:265 +#, c-format +msgid "could not create zstd decompression context" +msgstr "n'a pas pu créer le contexte de décompression zstd" + +#: pg_basebackup.c:240 #, c-format msgid "removing data directory \"%s\"" msgstr "suppression du répertoire des données « %s »" -#: pg_basebackup.c:226 +#: pg_basebackup.c:242 #, c-format msgid "failed to remove data directory" msgstr "échec de la suppression du répertoire des données" -#: pg_basebackup.c:230 +#: pg_basebackup.c:246 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "suppression du contenu du répertoire des données « %s »" -#: pg_basebackup.c:232 +#: pg_basebackup.c:248 #, c-format msgid "failed to remove contents of data directory" msgstr "échec de la suppression du contenu du répertoire des données" -#: pg_basebackup.c:237 +#: pg_basebackup.c:253 #, c-format msgid "removing WAL directory \"%s\"" msgstr "suppression du répertoire des journaux de transactions « %s »" -#: pg_basebackup.c:239 +#: pg_basebackup.c:255 #, c-format msgid "failed to remove WAL directory" msgstr "échec de la suppression du répertoire des journaux de transactions" -#: pg_basebackup.c:243 +#: pg_basebackup.c:259 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "suppression du contenu du répertoire des journaux de transactions « %s »" -#: pg_basebackup.c:245 +#: pg_basebackup.c:261 #, c-format msgid "failed to remove contents of WAL directory" msgstr "échec de la suppression du contenu du répertoire des journaux de transactions" -#: pg_basebackup.c:251 +#: pg_basebackup.c:267 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "répertoire des données « %s » non supprimé à la demande de l'utilisateur" -#: pg_basebackup.c:254 +#: pg_basebackup.c:270 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "répertoire des journaux de transactions « %s » non supprimé à la demande de l'utilisateur" -#: pg_basebackup.c:258 +#: pg_basebackup.c:274 #, c-format msgid "changes to tablespace directories will not be undone" msgstr "les modifications des répertoires des tablespaces ne seront pas annulées" -#: pg_basebackup.c:299 +#: pg_basebackup.c:326 #, c-format msgid "directory name too long" msgstr "nom du répertoire trop long" -#: pg_basebackup.c:309 +#: pg_basebackup.c:333 #, c-format msgid "multiple \"=\" signs in tablespace mapping" msgstr "multiple signes « = » dans la correspondance de tablespace" -#: pg_basebackup.c:321 +#: pg_basebackup.c:342 #, c-format msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "format de correspondance de tablespace « %s » invalide, doit être « ANCIENREPERTOIRE=NOUVEAUREPERTOIRE »" -#: pg_basebackup.c:333 +#: pg_basebackup.c:351 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "l'ancien répertoire n'est pas un chemin absolu dans la correspondance de tablespace : %s" -#: pg_basebackup.c:340 +#: pg_basebackup.c:355 #, c-format msgid "new directory is not an absolute path in tablespace mapping: %s" msgstr "le nouveau répertoire n'est pas un chemin absolu dans la correspondance de tablespace : %s" -#: pg_basebackup.c:379 +#: pg_basebackup.c:377 #, c-format msgid "" "%s takes a base backup of a running PostgreSQL server.\n" "\n" msgstr "" -"%s prend une sauvegarde binaire d'un serveur PostgreSQL en cours d'exécution.\n" +"%s prend une sauvegarde binaire d'un serveur PostgreSQL en cours\n" +"d'exécution.\n" "\n" -#: pg_basebackup.c:381 pg_receivewal.c:79 pg_recvlogical.c:75 +#: pg_basebackup.c:379 pg_receivewal.c:81 pg_recvlogical.c:78 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: pg_basebackup.c:382 pg_receivewal.c:80 pg_recvlogical.c:76 +#: pg_basebackup.c:380 pg_receivewal.c:82 pg_recvlogical.c:79 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_basebackup.c:383 +#: pg_basebackup.c:381 #, c-format msgid "" "\n" @@ -204,32 +413,39 @@ msgstr "" "\n" "Options contrôlant la sortie :\n" -#: pg_basebackup.c:384 +#: pg_basebackup.c:382 #, c-format msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n" -msgstr " -D, --pgdata=RÉPERTOIRE reçoit la sauvegarde de base dans ce répertoire\n" +msgstr " -D, --pgdata=RÉPERTOIRE reçoit la sauvegarde de base dans ce répertoire\n" -#: pg_basebackup.c:385 +#: pg_basebackup.c:383 #, c-format msgid " -F, --format=p|t output format (plain (default), tar)\n" -msgstr " -F, --format=p|t format en sortie (plain (par défaut), tar)\n" +msgstr " -F, --format=p|t format en sortie (plain (par défaut), tar)\n" -#: pg_basebackup.c:386 +#: pg_basebackup.c:384 #, c-format msgid "" " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" " (in kB/s, or use suffix \"k\" or \"M\")\n" msgstr "" -" -r, --max-rate=TAUX taux maximum de transfert du répertoire de\n" -" données (en Ko/s, ou utiliser le suffixe « k »\n" -" ou « M »)\n" +" -r, --max-rate=TAUX taux maximum de transfert du répertoire de\n" +" données (en Ko/s, ou utiliser le suffixe « k »\n" +" ou « M »)\n" -#: pg_basebackup.c:388 +#: pg_basebackup.c:386 #, c-format msgid "" " -R, --write-recovery-conf\n" " write configuration for replication\n" -msgstr " -R, --write-recovery-conf écrit la configuration pour la réplication\n" +msgstr " -R, --write-recovery-conf écrit la configuration pour la réplication\n" + +#: pg_basebackup.c:388 +#, c-format +msgid "" +" -t, --target=TARGET[:DETAIL]\n" +" backup target (if other than client)\n" +msgstr " -t, --target=CIBLE[:DETAIL] cible de sauvegarde (si autre que client)\n" #: pg_basebackup.c:390 #, c-format @@ -238,14 +454,14 @@ msgid "" " relocate tablespace in OLDDIR to NEWDIR\n" msgstr "" " -T, --tablespace-mapping=ANCIENREP=NOUVEAUREP\n" -" déplacer le répertoire ANCIENREP en NOUVEAUREP\n" +" déplace le répertoire ANCIENREP en NOUVEAUREP\n" #: pg_basebackup.c:392 #, c-format msgid " --waldir=WALDIR location for the write-ahead log directory\n" msgstr "" -" --waldir=RÉP_WAL emplacement du répertoire des journaux de\n" -" transactions\n" +" --waldir=RÉP_WAL emplacement du répertoire des journaux de\n" +" transactions\n" #: pg_basebackup.c:393 #, c-format @@ -254,22 +470,29 @@ msgid "" " include required WAL files with specified method\n" msgstr "" " -X, --wal-method=none|fetch|stream\n" -" inclut les journaux de transactions requis avec\n" -" la méthode spécifiée\n" +" inclut les journaux de transactions requis avec\n" +" la méthode spécifiée\n" #: pg_basebackup.c:395 #, c-format msgid " -z, --gzip compress tar output\n" -msgstr " -z, --gzip compresse la sortie tar\n" +msgstr " -z, --gzip compresse la sortie tar\n" #: pg_basebackup.c:396 #, c-format -msgid " -Z, --compress=0-9 compress tar output with given compression level\n" +msgid "" +" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" +" compress on client or server as specified\n" msgstr "" -" -Z, --compress=0-9 compresse la sortie tar avec le niveau de\n" -" compression indiqué\n" +" -Z, --compress=[{client|server}-]METHODE[:DETAIL]\n" +" compresse sur le client ou le serveur comme indiqué\n" + +#: pg_basebackup.c:398 +#, c-format +msgid " -Z, --compress=none do not compress tar output\n" +msgstr " -Z, --compress=none ne compresse pas la sortie tar\n" -#: pg_basebackup.c:397 +#: pg_basebackup.c:399 #, c-format msgid "" "\n" @@ -278,101 +501,108 @@ msgstr "" "\n" "Options générales :\n" -#: pg_basebackup.c:398 +#: pg_basebackup.c:400 #, c-format msgid "" " -c, --checkpoint=fast|spread\n" " set fast or spread checkpointing\n" -msgstr " -c, --checkpoint=fast|spread exécute un CHECKPOINT rapide ou réparti\n" +msgstr " -c, --checkpoint=fast|spread exécute un CHECKPOINT rapide ou réparti\n" -#: pg_basebackup.c:400 +#: pg_basebackup.c:402 #, c-format msgid " -C, --create-slot create replication slot\n" -msgstr " --create-slot créer un slot de réplication\n" +msgstr " --create-slot crée un slot de réplication\n" -#: pg_basebackup.c:401 +#: pg_basebackup.c:403 #, c-format msgid " -l, --label=LABEL set backup label\n" -msgstr " -l, --label=LABEL configure le label de sauvegarde\n" +msgstr " -l, --label=LABEL configure le label de sauvegarde\n" -#: pg_basebackup.c:402 +#: pg_basebackup.c:404 #, c-format msgid " -n, --no-clean do not clean up after errors\n" -msgstr " -n, --no-clean ne nettoie pas en cas d'erreur\n" +msgstr " -n, --no-clean ne nettoie pas en cas d'erreur\n" -#: pg_basebackup.c:403 +#: pg_basebackup.c:405 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" -msgstr " -N, --no-sync n'attend pas que les modifications soient proprement écrites sur disque\n" +msgstr "" +" -N, --no-sync n'attend pas que les modifications soient\n" +" proprement écrites sur disque\n" -#: pg_basebackup.c:404 +#: pg_basebackup.c:406 #, c-format msgid " -P, --progress show progress information\n" -msgstr " -P, --progress affiche la progression de la sauvegarde\n" +msgstr " -P, --progress affiche la progression de la sauvegarde\n" -#: pg_basebackup.c:405 pg_receivewal.c:89 +#: pg_basebackup.c:407 pg_receivewal.c:91 #, c-format msgid " -S, --slot=SLOTNAME replication slot to use\n" -msgstr " -S, --slot=NOMREP slot de réplication à utiliser\n" +msgstr " -S, --slot=NOMREP slot de réplication à utiliser\n" -#: pg_basebackup.c:406 pg_receivewal.c:91 pg_recvlogical.c:96 +#: pg_basebackup.c:408 pg_receivewal.c:93 pg_recvlogical.c:100 #, c-format msgid " -v, --verbose output verbose messages\n" -msgstr " -v, --verbose affiche des messages verbeux\n" +msgstr " -v, --verbose affiche des messages verbeux\n" -#: pg_basebackup.c:407 pg_receivewal.c:92 pg_recvlogical.c:97 +#: pg_basebackup.c:409 pg_receivewal.c:94 pg_recvlogical.c:101 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version puis quitte\n" +msgstr " -V, --version affiche la version puis quitte\n" -#: pg_basebackup.c:408 +#: pg_basebackup.c:410 #, c-format msgid "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" " use algorithm for manifest checksums\n" msgstr "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" -" utilise cet algorithme pour les sommes de contrôle du manifeste\n" +" utilise cet algorithme pour les sommes de\n" +" contrôle du manifeste\n" -#: pg_basebackup.c:410 +#: pg_basebackup.c:412 #, c-format msgid "" " --manifest-force-encode\n" " hex encode all file names in manifest\n" msgstr "" -" --manifest-force-encode\n" -" encode tous les noms de fichier dans le manifeste en hexadécimal\n" +" --manifest-force-encode encode tous les noms de fichier dans le\n" +" manifeste en hexadécimal\n" -#: pg_basebackup.c:412 +#: pg_basebackup.c:414 #, c-format msgid " --no-estimate-size do not estimate backup size in server side\n" -msgstr " --no-estimate-size ne réalise pas d'estimation sur la taille de la sauvegarde côté serveur\n" +msgstr "" +" --no-estimate-size ne réalise pas d'estimation sur la taille de la\n" +" sauvegarde côté serveur\n" -#: pg_basebackup.c:413 +#: pg_basebackup.c:415 #, c-format msgid " --no-manifest suppress generation of backup manifest\n" msgstr "" -" --no-manifest supprime la génération de manifeste de sauvegarde\n" -"\n" +" --no-manifest supprime la génération de manifeste de\n" +" sauvegarde\n" -#: pg_basebackup.c:414 +#: pg_basebackup.c:416 #, c-format msgid " --no-slot prevent creation of temporary replication slot\n" -msgstr " --no-slot empêche la création de slots de réplication temporaires\n" +msgstr "" +" --no-slot empêche la création de slots de réplication\n" +" temporaires\n" -#: pg_basebackup.c:415 +#: pg_basebackup.c:417 #, c-format msgid "" " --no-verify-checksums\n" " do not verify checksums\n" -msgstr " --no-verify-checksums ne vérifie pas les sommes de contrôle\n" +msgstr " --no-verify-checksums ne vérifie pas les sommes de contrôle\n" -#: pg_basebackup.c:417 pg_receivewal.c:94 pg_recvlogical.c:98 +#: pg_basebackup.c:419 pg_receivewal.c:97 pg_recvlogical.c:102 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide puis quitte\n" +msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_basebackup.c:418 pg_receivewal.c:95 pg_recvlogical.c:99 +#: pg_basebackup.c:420 pg_receivewal.c:98 pg_recvlogical.c:103 #, c-format msgid "" "\n" @@ -381,26 +611,24 @@ msgstr "" "\n" "Options de connexion :\n" -#: pg_basebackup.c:419 pg_receivewal.c:96 +#: pg_basebackup.c:421 pg_receivewal.c:99 #, c-format msgid " -d, --dbname=CONNSTR connection string\n" -msgstr " -d, --dbname=CONNSTR chaîne de connexion\n" +msgstr " -d, --dbname=CHAÎNE_CONNEX chaîne de connexion\n" -#: pg_basebackup.c:420 pg_receivewal.c:97 pg_recvlogical.c:101 +#: pg_basebackup.c:422 pg_receivewal.c:100 pg_recvlogical.c:105 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" -" -h, --host=NOMHÔTE hôte du serveur de bases de données ou\n" -" répertoire des sockets\n" +" -h, --host=HÔTE hôte du serveur de bases de données ou\n" +" répertoire des sockets\n" -#: pg_basebackup.c:421 pg_receivewal.c:98 pg_recvlogical.c:102 +#: pg_basebackup.c:423 pg_receivewal.c:101 pg_recvlogical.c:106 #, c-format msgid " -p, --port=PORT database server port number\n" -msgstr "" -" -p, --port=PORT numéro de port du serveur de bases de\n" -" données\n" +msgstr " -p, --port=PORT numéro de port du serveur de bases de données\n" -#: pg_basebackup.c:422 +#: pg_basebackup.c:424 #, c-format msgid "" " -s, --status-interval=INTERVAL\n" @@ -409,24 +637,24 @@ msgstr "" " -s, --status-interval=INTERVAL durée entre l'envoi de paquets de statut au\n" " serveur (en secondes)\n" -#: pg_basebackup.c:424 pg_receivewal.c:99 pg_recvlogical.c:103 +#: pg_basebackup.c:426 pg_receivewal.c:102 pg_recvlogical.c:107 #, c-format msgid " -U, --username=NAME connect as specified database user\n" -msgstr " -U, --username=NOM se connecte avec cet utilisateur\n" +msgstr " -U, --username=UTILISATEUR se connecte avec cet utilisateur\n" -#: pg_basebackup.c:425 pg_receivewal.c:100 pg_recvlogical.c:104 +#: pg_basebackup.c:427 pg_receivewal.c:103 pg_recvlogical.c:108 #, c-format msgid " -w, --no-password never prompt for password\n" -msgstr " -w, --no-password ne demande jamais le mot de passe\n" +msgstr " -w, --no-password ne demande jamais le mot de passe\n" -#: pg_basebackup.c:426 pg_receivewal.c:101 pg_recvlogical.c:105 +#: pg_basebackup.c:428 pg_receivewal.c:104 pg_recvlogical.c:109 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr "" -" -W, --password force la demande du mot de passe (devrait arriver\n" -" automatiquement)\n" +" -W, --password force la demande du mot de passe (devrait\n" +" survenir automatiquement)\n" -#: pg_basebackup.c:427 pg_receivewal.c:105 pg_recvlogical.c:106 +#: pg_basebackup.c:429 pg_receivewal.c:108 pg_recvlogical.c:110 #, c-format msgid "" "\n" @@ -435,443 +663,480 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_basebackup.c:428 pg_receivewal.c:106 pg_recvlogical.c:107 +#: pg_basebackup.c:430 pg_receivewal.c:109 pg_recvlogical.c:111 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil %s : <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" -#: pg_basebackup.c:471 +#: pg_basebackup.c:472 #, c-format msgid "could not read from ready pipe: %m" msgstr "n'a pas pu lire à partir du tube : %m" -#: pg_basebackup.c:477 pg_basebackup.c:608 pg_basebackup.c:2133 -#: streamutil.c:450 +#: pg_basebackup.c:475 pg_basebackup.c:622 pg_basebackup.c:2178 +#: streamutil.c:444 #, c-format msgid "could not parse write-ahead log location \"%s\"" msgstr "n'a pas pu analyser l'emplacement du journal des transactions « %s »" -#: pg_basebackup.c:573 pg_receivewal.c:441 +#: pg_basebackup.c:581 pg_receivewal.c:665 #, c-format msgid "could not finish writing WAL files: %m" msgstr "n'a pas pu finir l'écriture dans les fichiers de transactions : %m" -#: pg_basebackup.c:620 +#: pg_basebackup.c:631 #, c-format msgid "could not create pipe for background process: %m" msgstr "n'a pas pu créer un tube pour le processus en tâche de fond : %m" -#: pg_basebackup.c:655 +#: pg_basebackup.c:664 #, c-format msgid "created temporary replication slot \"%s\"" msgstr "a créé le slot de réplication temporaire « %s »" -#: pg_basebackup.c:658 +#: pg_basebackup.c:667 #, c-format msgid "created replication slot \"%s\"" msgstr "a créé le slot de réplication « %s »" -#: pg_basebackup.c:678 pg_basebackup.c:731 pg_basebackup.c:1620 +#: pg_basebackup.c:704 #, c-format -msgid "could not create directory \"%s\": %m" -msgstr "n'a pas pu créer le répertoire « %s » : %m" +msgid "log streamer with pid %d exiting" +msgstr "le processus d'envoi des journaux de PID %d quitte" -#: pg_basebackup.c:696 +#: pg_basebackup.c:709 #, c-format msgid "could not create background process: %m" msgstr "n'a pas pu créer un processus en tâche de fond : %m" -#: pg_basebackup.c:708 +#: pg_basebackup.c:718 #, c-format msgid "could not create background thread: %m" msgstr "n'a pas pu créer un thread en tâche de fond : %m" -#: pg_basebackup.c:752 +#: pg_basebackup.c:757 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "le répertoire « %s » existe mais n'est pas vide" -#: pg_basebackup.c:759 +#: pg_basebackup.c:763 #, c-format msgid "could not access directory \"%s\": %m" msgstr "n'a pas pu accéder au répertoire « %s » : %m" -#: pg_basebackup.c:824 +#: pg_basebackup.c:840 #, c-format msgid "%*s/%s kB (100%%), %d/%d tablespace %*s" msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s" msgstr[0] "%*s/%s Ko (100%%), %d/%d tablespace %*s" msgstr[1] "%*s/%s Ko (100%%), %d/%d tablespaces %*s" -#: pg_basebackup.c:836 +#: pg_basebackup.c:852 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" msgstr[0] "%*s/%s Ko (%d%%), %d/%d tablespace (%s%-*.*s)" msgstr[1] "%*s/%s Ko (%d%%), %d/%d tablespaces (%s%-*.*s)" -#: pg_basebackup.c:852 +#: pg_basebackup.c:868 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces" msgstr[0] "%*s/%s Ko (%d%%), %d/%d tablespace" msgstr[1] "%*s/%s Ko (%d%%), %d/%d tablespaces" -#: pg_basebackup.c:877 +#: pg_basebackup.c:892 #, c-format msgid "transfer rate \"%s\" is not a valid value" msgstr "le taux de transfert « %s » ne correspond pas à une valeur valide" -#: pg_basebackup.c:882 +#: pg_basebackup.c:894 #, c-format msgid "invalid transfer rate \"%s\": %m" msgstr "taux de transfert invalide (« %s ») : %m" -#: pg_basebackup.c:891 +#: pg_basebackup.c:901 #, c-format msgid "transfer rate must be greater than zero" msgstr "le taux de transfert doit être supérieur à zéro" -#: pg_basebackup.c:923 +#: pg_basebackup.c:931 #, c-format msgid "invalid --max-rate unit: \"%s\"" msgstr "unité invalide pour --max-rate : « %s »" -#: pg_basebackup.c:930 +#: pg_basebackup.c:935 #, c-format msgid "transfer rate \"%s\" exceeds integer range" msgstr "le taux de transfert « %s » dépasse l'échelle des entiers" -#: pg_basebackup.c:940 +#: pg_basebackup.c:942 #, c-format msgid "transfer rate \"%s\" is out of range" msgstr "le taux de transfert « %s » est en dehors des limites" -#: pg_basebackup.c:961 +#: pg_basebackup.c:1038 #, c-format msgid "could not get COPY data stream: %s" msgstr "n'a pas pu obtenir le flux de données de COPY : %s" -#: pg_basebackup.c:981 pg_recvlogical.c:435 pg_recvlogical.c:607 -#: receivelog.c:964 +#: pg_basebackup.c:1055 pg_recvlogical.c:438 pg_recvlogical.c:610 +#: receivelog.c:981 #, c-format msgid "could not read COPY data: %s" msgstr "n'a pas pu lire les données du COPY : %s" -#: pg_basebackup.c:1007 +#: pg_basebackup.c:1059 #, c-format -msgid "could not write to compressed file \"%s\": %s" -msgstr "n'a pas pu écrire dans le fichier compressé « %s » : %s" +msgid "background process terminated unexpectedly" +msgstr "un processus worker s'est arrêté de façon inattendue" -#: pg_basebackup.c:1071 +#: pg_basebackup.c:1130 #, c-format -msgid "could not duplicate stdout: %m" -msgstr "n'a pas pu dupliquer la sortie (stdout) : %m" +msgid "cannot inject manifest into a compressed tarfile" +msgstr "ne peut pas injecter le manifeste dans un fichier tar compressé" -#: pg_basebackup.c:1078 +#: pg_basebackup.c:1131 #, c-format -msgid "could not open output file: %m" -msgstr "n'a pas pu ouvrir le fichier de sauvegarde : %m" +msgid "use client-side compression, send the output to a directory rather than standard output, or use --no-manifest" +msgstr "utilisez la compression côté client, envoyez la sortie dans un répertoire plutôt que sur la sortie standard, ou utilisez --no-manifest" -#: pg_basebackup.c:1085 pg_basebackup.c:1106 pg_basebackup.c:1135 +#: pg_basebackup.c:1146 #, c-format -msgid "could not set compression level %d: %s" -msgstr "n'a pas pu configurer le niveau de compression %d : %s" +msgid "unable to parse archive: %s" +msgstr "incapable d'analyser l'archive : %s" -#: pg_basebackup.c:1155 +#: pg_basebackup.c:1147 #, c-format -msgid "could not create compressed file \"%s\": %s" -msgstr "n'a pas pu créer le fichier compressé « %s » : %s" +msgid "Only tar archives can be parsed." +msgstr "Seules les archives tar peuvent être analysées" -#: pg_basebackup.c:1267 +#: pg_basebackup.c:1149 #, c-format -msgid "could not close compressed file \"%s\": %s" -msgstr "n'a pas pu fermer le fichier compressé « %s » : %s" +msgid "Plain format requires pg_basebackup to parse the archive." +msgstr "Le format plain requiert que pg_basebackup analyse l'archive." -#: pg_basebackup.c:1279 pg_recvlogical.c:632 +#: pg_basebackup.c:1151 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "n'a pas pu fermer le fichier « %s » : %m" +msgid "Using - as the output directory requires pg_basebackup to parse the archive." +msgstr "Utiliser - comme répertoire de sortie requiert que pg_basebackup analyse l'archive." -#: pg_basebackup.c:1541 +#: pg_basebackup.c:1153 #, c-format -msgid "COPY stream ended before last file was finished" -msgstr "le flux COPY s'est terminé avant que le dernier fichier soit terminé" +msgid "The -R option requires pg_basebackup to parse the archive." +msgstr "L'option -R requiert que pg_basebackup analyse l'archive." -#: pg_basebackup.c:1570 +#: pg_basebackup.c:1364 #, c-format -msgid "invalid tar block header size: %zu" -msgstr "taille invalide de l'en-tête de bloc du fichier tar : %zu" +msgid "archives should precede manifest" +msgstr "les archives doivent précéder le manifeste" -#: pg_basebackup.c:1627 +#: pg_basebackup.c:1379 #, c-format -msgid "could not set permissions on directory \"%s\": %m" -msgstr "n'a pas pu configurer les droits du répertoire « %s » : %m" +msgid "invalid archive name: \"%s\"" +msgstr "nom d'archive invalide : « %s »" -#: pg_basebackup.c:1651 +#: pg_basebackup.c:1451 #, c-format -msgid "could not create symbolic link from \"%s\" to \"%s\": %m" -msgstr "n'a pas pu créer le lien symbolique de « %s » vers « %s » : %m" +msgid "unexpected payload data" +msgstr "donnée de charge inattendue" -#: pg_basebackup.c:1658 +#: pg_basebackup.c:1594 #, c-format -msgid "unrecognized link indicator \"%c\"" -msgstr "indicateur de lien « %c » non reconnu" +msgid "empty COPY message" +msgstr "message COPY vide" -#: pg_basebackup.c:1677 +#: pg_basebackup.c:1596 #, c-format -msgid "could not set permissions on file \"%s\": %m" -msgstr "n'a pas pu initialiser les droits du fichier « %s » : %m" +msgid "malformed COPY message of type %d, length %zu" +msgstr "message COPY malformé de type %d, longueur %zu" -#: pg_basebackup.c:1831 +#: pg_basebackup.c:1794 #, c-format msgid "incompatible server version %s" msgstr "version « %s » du serveur incompatible" -#: pg_basebackup.c:1846 +#: pg_basebackup.c:1810 #, c-format msgid "HINT: use -X none or -X fetch to disable log streaming" msgstr "ASTUCE : utilisez -X none ou -X fetch pour désactiver la réplication en flux" -#: pg_basebackup.c:1882 +#: pg_basebackup.c:1878 +#, c-format +msgid "backup targets are not supported by this server version" +msgstr "les cibles de sauvegarde ne sont pas supportées par cette version du serveur" + +#: pg_basebackup.c:1881 +#, c-format +msgid "recovery configuration cannot be written when a backup target is used" +msgstr "la configuration de la restauration ne peut pas être écrite quand une cible de restauration est utilisée" + +#: pg_basebackup.c:1908 +#, c-format +msgid "server does not support server-side compression" +msgstr "le serveur ne supporte pas la compression côté serveur" + +#: pg_basebackup.c:1918 #, c-format msgid "initiating base backup, waiting for checkpoint to complete" msgstr "début de la sauvegarde de base, en attente de la fin du checkpoint" -#: pg_basebackup.c:1908 pg_recvlogical.c:262 receivelog.c:480 receivelog.c:529 -#: receivelog.c:568 streamutil.c:297 streamutil.c:370 streamutil.c:422 -#: streamutil.c:533 streamutil.c:578 +#: pg_basebackup.c:1935 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588 +#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504 +#: streamutil.c:656 streamutil.c:701 #, c-format msgid "could not send replication command \"%s\": %s" msgstr "n'a pas pu envoyer la commande de réplication « %s » : %s" -#: pg_basebackup.c:1919 +#: pg_basebackup.c:1943 #, c-format msgid "could not initiate base backup: %s" msgstr "n'a pas pu initier la sauvegarde de base : %s" -#: pg_basebackup.c:1925 +#: pg_basebackup.c:1946 #, c-format msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields" msgstr "le serveur a renvoyé une réponse inattendue à la commande BASE_BACKUP ; a récupéré %d lignes et %d champs, alors qu'il attendait %d lignes et %d champs" -#: pg_basebackup.c:1933 +#: pg_basebackup.c:1952 #, c-format msgid "checkpoint completed" msgstr "checkpoint terminé" -#: pg_basebackup.c:1948 +#: pg_basebackup.c:1967 #, c-format msgid "write-ahead log start point: %s on timeline %u" msgstr "point de départ du journal de transactions : %s sur la timeline %u" -#: pg_basebackup.c:1957 +#: pg_basebackup.c:1975 #, c-format msgid "could not get backup header: %s" msgstr "n'a pas pu obtenir l'en-tête du serveur : %s" -#: pg_basebackup.c:1963 +#: pg_basebackup.c:1978 #, c-format msgid "no data returned from server" msgstr "aucune donnée renvoyée du serveur" -#: pg_basebackup.c:1995 +#: pg_basebackup.c:2013 #, c-format msgid "can only write single tablespace to stdout, database has %d" msgstr "peut seulement écrire un tablespace sur la sortie standard, la base en a %d" -#: pg_basebackup.c:2007 +#: pg_basebackup.c:2026 #, c-format msgid "starting background WAL receiver" msgstr "lance le récepteur de journaux de transactions en tâche de fond" -#: pg_basebackup.c:2046 +#: pg_basebackup.c:2109 #, c-format -msgid "could not get write-ahead log end position from server: %s" -msgstr "n'a pas pu obtenir la position finale des journaux de transactions à partir du serveur : %s" +msgid "backup failed: %s" +msgstr "échec de la sauvegarde : %s" -#: pg_basebackup.c:2052 +#: pg_basebackup.c:2112 #, c-format msgid "no write-ahead log end position returned from server" msgstr "aucune position de fin du journal de transactions renvoyée par le serveur" -#: pg_basebackup.c:2057 +#: pg_basebackup.c:2115 #, c-format msgid "write-ahead log end point: %s" msgstr "point final du journal de transactions : %s" -#: pg_basebackup.c:2068 +#: pg_basebackup.c:2126 #, c-format msgid "checksum error occurred" msgstr "erreur de somme de contrôle" -#: pg_basebackup.c:2073 +#: pg_basebackup.c:2131 #, c-format msgid "final receive failed: %s" msgstr "échec lors de la réception finale : %s" -#: pg_basebackup.c:2097 +#: pg_basebackup.c:2155 #, c-format msgid "waiting for background process to finish streaming ..." msgstr "en attente que le processus en tâche de fond termine le flux..." -#: pg_basebackup.c:2102 +#: pg_basebackup.c:2159 #, c-format msgid "could not send command to background pipe: %m" msgstr "n'a pas pu envoyer la commande au tube du processus : %m" -#: pg_basebackup.c:2110 +#: pg_basebackup.c:2164 #, c-format msgid "could not wait for child process: %m" msgstr "n'a pas pu attendre le processus fils : %m" -#: pg_basebackup.c:2115 +#: pg_basebackup.c:2166 #, c-format msgid "child %d died, expected %d" msgstr "le fils %d est mort, %d attendu" -#: pg_basebackup.c:2120 streamutil.c:92 streamutil.c:203 +#: pg_basebackup.c:2168 streamutil.c:91 streamutil.c:197 #, c-format msgid "%s" msgstr "%s" -#: pg_basebackup.c:2145 +#: pg_basebackup.c:2188 #, c-format msgid "could not wait for child thread: %m" msgstr "n'a pas pu attendre le thread : %m" -#: pg_basebackup.c:2151 +#: pg_basebackup.c:2193 #, c-format msgid "could not get child thread exit status: %m" msgstr "n'a pas pu obtenir le code de sortie du thread : %m" -#: pg_basebackup.c:2156 +#: pg_basebackup.c:2196 #, c-format msgid "child thread exited with error %u" msgstr "le thread a quitté avec le code d'erreur %u" -#: pg_basebackup.c:2184 +#: pg_basebackup.c:2225 #, c-format msgid "syncing data to disk ..." msgstr "synchronisation des données sur disque..." -#: pg_basebackup.c:2209 +#: pg_basebackup.c:2250 #, c-format msgid "renaming backup_manifest.tmp to backup_manifest" msgstr "renommage de backup_manifest.tmp en backup_manifest" -#: pg_basebackup.c:2220 +#: pg_basebackup.c:2270 #, c-format msgid "base backup completed" msgstr "sauvegarde de base terminée" -#: pg_basebackup.c:2305 +#: pg_basebackup.c:2359 #, c-format msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"" msgstr "format de sortie « %s » invalide, doit être soit « plain » soit « tar »" -#: pg_basebackup.c:2349 +#: pg_basebackup.c:2403 #, c-format msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"" msgstr "option wal-method « %s » invalide, doit être soit « fetch » soit « stream » soit « none »" -#: pg_basebackup.c:2377 pg_receivewal.c:580 -#, c-format -msgid "invalid compression level \"%s\"" -msgstr "niveau de compression « %s » invalide" - -#: pg_basebackup.c:2388 +#: pg_basebackup.c:2433 #, c-format msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" msgstr "argument « %s » invalide pour le CHECKPOINT, doit être soit « fast » soit « spread »" -#: pg_basebackup.c:2415 pg_receivewal.c:555 pg_recvlogical.c:820 -#, c-format -msgid "invalid status interval \"%s\"" -msgstr "intervalle « %s » invalide du statut" - -#: pg_basebackup.c:2445 pg_basebackup.c:2458 pg_basebackup.c:2469 -#: pg_basebackup.c:2480 pg_basebackup.c:2488 pg_basebackup.c:2496 -#: pg_basebackup.c:2506 pg_basebackup.c:2519 pg_basebackup.c:2528 -#: pg_basebackup.c:2539 pg_basebackup.c:2549 pg_basebackup.c:2567 -#: pg_basebackup.c:2576 pg_basebackup.c:2585 pg_receivewal.c:605 -#: pg_receivewal.c:618 pg_receivewal.c:626 pg_receivewal.c:636 -#: pg_receivewal.c:644 pg_receivewal.c:655 pg_recvlogical.c:846 -#: pg_recvlogical.c:859 pg_recvlogical.c:870 pg_recvlogical.c:878 -#: pg_recvlogical.c:886 pg_recvlogical.c:894 pg_recvlogical.c:902 -#: pg_recvlogical.c:910 pg_recvlogical.c:918 +#: pg_basebackup.c:2484 pg_basebackup.c:2496 pg_basebackup.c:2518 +#: pg_basebackup.c:2530 pg_basebackup.c:2536 pg_basebackup.c:2588 +#: pg_basebackup.c:2599 pg_basebackup.c:2609 pg_basebackup.c:2615 +#: pg_basebackup.c:2622 pg_basebackup.c:2634 pg_basebackup.c:2646 +#: pg_basebackup.c:2654 pg_basebackup.c:2667 pg_basebackup.c:2673 +#: pg_basebackup.c:2682 pg_basebackup.c:2694 pg_basebackup.c:2705 +#: pg_basebackup.c:2713 pg_receivewal.c:816 pg_receivewal.c:828 +#: pg_receivewal.c:835 pg_receivewal.c:844 pg_receivewal.c:851 +#: pg_receivewal.c:861 pg_recvlogical.c:837 pg_recvlogical.c:849 +#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873 +#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894 +#: pg_recvlogical.c:901 pg_recvlogical.c:908 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Essayer « %s --help » pour plus d'informations.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_basebackup.c:2456 pg_receivewal.c:616 pg_recvlogical.c:857 +#: pg_basebackup.c:2494 pg_receivewal.c:826 pg_recvlogical.c:847 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_basebackup.c:2468 pg_receivewal.c:654 +#: pg_basebackup.c:2517 #, c-format -msgid "no target directory specified" -msgstr "aucun répertoire cible indiqué" +msgid "cannot specify both format and backup target" +msgstr "ne peut pas spécifier à la fois le format et la cible de sauvegarde" + +#: pg_basebackup.c:2529 +#, c-format +msgid "must specify output directory or backup target" +msgstr "doit spécifier un répertoire de sortie ou une cible de sauvegarde" + +#: pg_basebackup.c:2535 +#, c-format +msgid "cannot specify both output directory and backup target" +msgstr "ne peut pas spécifier à la fois le répertoire en sortie et la cible de sauvegarde" + +#: pg_basebackup.c:2565 pg_receivewal.c:870 +#, c-format +msgid "unrecognized compression algorithm \"%s\"" +msgstr "algorithme de compression « %s » inconnu" + +#: pg_basebackup.c:2571 pg_receivewal.c:877 +#, c-format +msgid "invalid compression specification: %s" +msgstr "spécification de compression invalide : %s" + +#: pg_basebackup.c:2587 +#, c-format +msgid "client-side compression is not possible when a backup target is specified" +msgstr "la compression client n'est pas possible quand une cible de restauration est indiquée." -#: pg_basebackup.c:2479 +#: pg_basebackup.c:2598 #, c-format msgid "only tar mode backups can be compressed" msgstr "seules les sauvegardes en mode tar peuvent être compressées" -#: pg_basebackup.c:2487 +#: pg_basebackup.c:2608 +#, c-format +msgid "WAL cannot be streamed when a backup target is specified" +msgstr "Les journaux de transactions ne peuvent pas être envoyés en flux quand une cible de sauvegarde est indiquée." + +#: pg_basebackup.c:2614 #, c-format msgid "cannot stream write-ahead logs in tar mode to stdout" msgstr "ne peut pas envoyer les journaux de transactions vers stdout en mode tar" -#: pg_basebackup.c:2495 +#: pg_basebackup.c:2621 #, c-format msgid "replication slots can only be used with WAL streaming" msgstr "les slots de réplications peuvent seulement être utilisés avec la réplication en flux des WAL" -#: pg_basebackup.c:2505 +#: pg_basebackup.c:2633 #, c-format msgid "--no-slot cannot be used with slot name" msgstr "--no-slot ne peut pas être utilisé avec un nom de slot" #. translator: second %s is an option name -#: pg_basebackup.c:2517 pg_receivewal.c:634 +#: pg_basebackup.c:2644 pg_receivewal.c:842 #, c-format msgid "%s needs a slot to be specified using --slot" msgstr "%s a besoin du slot avec l'option --slot" -#: pg_basebackup.c:2526 pg_basebackup.c:2565 pg_basebackup.c:2574 -#: pg_basebackup.c:2583 +#: pg_basebackup.c:2652 pg_basebackup.c:2692 pg_basebackup.c:2703 +#: pg_basebackup.c:2711 #, c-format msgid "%s and %s are incompatible options" msgstr "%s et %s sont des options incompatibles" -#: pg_basebackup.c:2538 +#: pg_basebackup.c:2666 +#, c-format +msgid "WAL directory location cannot be specified along with a backup target" +msgstr "l'emplacement du répertoire des journaux de transactions ne peut pas être indiqué avec une cible de sauvegarde" + +#: pg_basebackup.c:2672 #, c-format msgid "WAL directory location can only be specified in plain mode" msgstr "l'emplacement du répertoire des journaux de transactions doit être indiqué uniquement dans le mode plain" -#: pg_basebackup.c:2548 +#: pg_basebackup.c:2681 #, c-format msgid "WAL directory location must be an absolute path" msgstr "l'emplacement du répertoire des journaux de transactions doit être indiqué avec un chemin absolu" -#: pg_basebackup.c:2558 pg_receivewal.c:663 -#, c-format -msgid "this build does not support compression" -msgstr "cette construction ne supporte pas la compression" - -#: pg_basebackup.c:2643 +#: pg_basebackup.c:2782 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "n'a pas pu créer le lien symbolique « %s » : %m" -#: pg_basebackup.c:2647 +#: pg_basebackup.c:2784 #, c-format msgid "symlinks are not supported on this platform" msgstr "les liens symboliques ne sont pas supportés sur cette plateforme" -#: pg_receivewal.c:77 +#: pg_receivewal.c:79 #, c-format msgid "" "%s receives PostgreSQL streaming write-ahead logs.\n" @@ -880,7 +1145,7 @@ msgstr "" "%s reçoit le flux des journaux de transactions PostgreSQL.\n" "\n" -#: pg_receivewal.c:81 pg_recvlogical.c:81 +#: pg_receivewal.c:83 pg_recvlogical.c:84 #, c-format msgid "" "\n" @@ -889,59 +1154,63 @@ msgstr "" "\n" "Options :\n" -#: pg_receivewal.c:82 +#: pg_receivewal.c:84 #, c-format msgid " -D, --directory=DIR receive write-ahead log files into this directory\n" msgstr "" -" -D, --directory=RÉP reçoit les journaux de transactions dans ce\n" -" répertoire\n" +" -D, --directory=RÉPERTOIRE reçoit les journaux de transactions dans ce\n" +" répertoire\n" -#: pg_receivewal.c:83 pg_recvlogical.c:82 +#: pg_receivewal.c:85 pg_recvlogical.c:85 #, c-format msgid " -E, --endpos=LSN exit after receiving the specified LSN\n" -msgstr " -E, --endpos=LSN quitte après avoir reçu le LSN spécifié\n" +msgstr " -E, --endpos=LSN quitte après avoir reçu le LSN spécifié\n" -#: pg_receivewal.c:84 pg_recvlogical.c:86 +#: pg_receivewal.c:86 pg_recvlogical.c:89 #, c-format msgid " --if-not-exists do not error if slot already exists when creating a slot\n" msgstr "" -" --if-not-exists ne pas renvoyer une erreur si le slot existe\n" -" déjà lors de sa création\n" +" --if-not-exists ne pas renvoyer une erreur si le slot existe\n" +" déjà lors de sa création\n" -#: pg_receivewal.c:85 pg_recvlogical.c:88 +#: pg_receivewal.c:87 pg_recvlogical.c:91 #, c-format msgid " -n, --no-loop do not loop on connection lost\n" -msgstr " -n, --no-loop ne boucle pas en cas de perte de la connexion\n" +msgstr " -n, --no-loop ne boucle pas en cas de perte de la connexion\n" -#: pg_receivewal.c:86 +#: pg_receivewal.c:88 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" -msgstr " --no-sync n'attend pas que les modifications soient proprement écrites sur disque\n" +msgstr "" +" --no-sync n'attend pas que les modifications soient\n" +" proprement écrites sur disque\n" -#: pg_receivewal.c:87 pg_recvlogical.c:93 +#: pg_receivewal.c:89 pg_recvlogical.c:96 #, c-format msgid "" " -s, --status-interval=SECS\n" " time between status packets sent to server (default: %d)\n" msgstr "" -" -s, --status-interval=SECS durée entre l'envoi de paquets de statut au\n" -" (par défaut %d)\n" +" -s, --status-interval=SECS durée entre l'envoi de paquets de statut au\n" +" (par défaut %d)\n" -#: pg_receivewal.c:90 +#: pg_receivewal.c:92 #, c-format msgid " --synchronous flush write-ahead log immediately after writing\n" msgstr "" -" --synchronous vide le journal de transactions immédiatement\n" -" après son écriture\n" +" --synchronous vide le journal de transactions immédiatement\n" +" après son écriture\n" -#: pg_receivewal.c:93 +#: pg_receivewal.c:95 #, c-format -msgid " -Z, --compress=0-9 compress logs with given compression level\n" +msgid "" +" -Z, --compress=METHOD[:DETAIL]\n" +" compress as specified\n" msgstr "" -" -Z, --compress=0-9 compresse la sortie tar avec le niveau de\n" -" compression indiqué\n" +" -Z, --compress=METHOD[:DETAIL]\n" +" compresse comme indiqué\n" -#: pg_receivewal.c:102 +#: pg_receivewal.c:105 #, c-format msgid "" "\n" @@ -950,127 +1219,177 @@ msgstr "" "\n" "Actions optionnelles :\n" -#: pg_receivewal.c:103 pg_recvlogical.c:78 +#: pg_receivewal.c:106 pg_recvlogical.c:81 #, c-format msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n" msgstr "" -" --create-slot créer un nouveau slot de réplication\n" -" (pour le nom du slot, voir --slot)\n" +" --create-slot crée un nouveau slot de réplication\n" +" (pour le nom du slot, voir --slot)\n" -#: pg_receivewal.c:104 pg_recvlogical.c:79 +#: pg_receivewal.c:107 pg_recvlogical.c:82 #, c-format msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n" msgstr "" -" --drop-slot supprimer un nouveau slot de réplication\n" -" (pour le nom du slot, voir --slot)\n" +" --drop-slot supprime un nouveau slot de réplication\n" +" (pour le nom du slot, voir --slot)\n" -#: pg_receivewal.c:117 +#: pg_receivewal.c:252 #, c-format msgid "finished segment at %X/%X (timeline %u)" msgstr "segment terminé à %X/%X (timeline %u)" -#: pg_receivewal.c:124 +#: pg_receivewal.c:259 #, c-format msgid "stopped log streaming at %X/%X (timeline %u)" msgstr "arrêt du flux streaming à %X/%X (timeline %u)" -#: pg_receivewal.c:140 +#: pg_receivewal.c:275 #, c-format msgid "switched to timeline %u at %X/%X" msgstr "a basculé sur la timeline %u à %X/%X" -#: pg_receivewal.c:150 +#: pg_receivewal.c:285 #, c-format msgid "received interrupt signal, exiting" msgstr "a reçu un signal d'interruption, quitte" -#: pg_receivewal.c:186 +#: pg_receivewal.c:317 #, c-format msgid "could not close directory \"%s\": %m" msgstr "n'a pas pu fermer le répertoire « %s » : %m" -#: pg_receivewal.c:272 +#: pg_receivewal.c:384 #, c-format msgid "segment file \"%s\" has incorrect size %lld, skipping" msgstr "le segment « %s » a une taille incorrecte (%lld), ignoré" -#: pg_receivewal.c:290 +#: pg_receivewal.c:401 #, c-format msgid "could not open compressed file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier compressé « %s » : %m" -#: pg_receivewal.c:296 +#: pg_receivewal.c:404 #, c-format msgid "could not seek in compressed file \"%s\": %m" msgstr "n'a pas pu chercher dans le fichier compressé « %s » : %m" -#: pg_receivewal.c:304 +#: pg_receivewal.c:410 #, c-format msgid "could not read compressed file \"%s\": %m" msgstr "n'a pas pu lire le fichier compressé « %s » : %m" -#: pg_receivewal.c:307 +#: pg_receivewal.c:413 #, c-format msgid "could not read compressed file \"%s\": read %d of %zu" msgstr "n'a pas pu lire le fichier compressé « %s » : a lu %d sur %zu" -#: pg_receivewal.c:318 +#: pg_receivewal.c:423 #, c-format msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping" msgstr "le segment compressé « %s » a une taille %d non compressé incorrecte, ignoré" -#: pg_receivewal.c:422 +#: pg_receivewal.c:451 #, c-format -msgid "starting log streaming at %X/%X (timeline %u)" -msgstr "commence le flux des journaux à %X/%X (timeline %u)" +msgid "could not create LZ4 decompression context: %s" +msgstr "n'a pas pu créer le contexte de décompression LZ4 : %s" + +#: pg_receivewal.c:463 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "n'a pas pu lire le fichier « %s » : %m" + +#: pg_receivewal.c:481 +#, c-format +msgid "could not decompress file \"%s\": %s" +msgstr "n'a pas pu décompresser le fichier « %s » : %s" + +#: pg_receivewal.c:504 +#, c-format +msgid "could not free LZ4 decompression context: %s" +msgstr "n'a pas pu libérer le contexte de décompression LZ4 : %s" + +#: pg_receivewal.c:509 +#, c-format +msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping" +msgstr "le fichier segment compressé « %s » a une taille %zu décompressée incorrecte, ignoré" + +#: pg_receivewal.c:514 +#, c-format +msgid "could not check file \"%s\"" +msgstr "n'a pas pu vérifier le fichier « %s »" + +#: pg_receivewal.c:516 +#, c-format +msgid "This build does not support compression with %s." +msgstr "Cette construction ne supporte pas la compression avec %s." -#: pg_receivewal.c:537 pg_recvlogical.c:762 +#: pg_receivewal.c:643 #, c-format -msgid "invalid port number \"%s\"" -msgstr "numéro de port invalide : « %s »" +msgid "starting log streaming at %X/%X (timeline %u)" +msgstr "commence le flux des journaux à %X/%X (timeline %u)" -#: pg_receivewal.c:565 pg_recvlogical.c:788 +#: pg_receivewal.c:785 pg_recvlogical.c:785 #, c-format msgid "could not parse end position \"%s\"" msgstr "n'a pas pu analyser la position finale « %s »" -#: pg_receivewal.c:625 +#: pg_receivewal.c:834 #, c-format msgid "cannot use --create-slot together with --drop-slot" msgstr "ne peut pas utiliser --create-slot avec --drop-slot" -#: pg_receivewal.c:643 +#: pg_receivewal.c:850 #, c-format msgid "cannot use --synchronous together with --no-sync" msgstr "ne peut pas utiliser --synchronous avec --no-sync" -#: pg_receivewal.c:719 +#: pg_receivewal.c:860 +#, c-format +msgid "no target directory specified" +msgstr "aucun répertoire cible indiqué" + +#: pg_receivewal.c:893 +#, c-format +msgid "no value specified for --compress, switching to default" +msgstr "aucune valeur indiquée pour --compression, utilise la valeur par défaut" + +#: pg_receivewal.c:897 pg_receivewal.c:903 +#, c-format +msgid "this build does not support compression with %s" +msgstr "cette construction ne supporte pas la compression avec %s" + +#: pg_receivewal.c:908 +#, c-format +msgid "compression with %s is not yet supported" +msgstr "la méthode de compression %s n'est pas encore supportée" + +#: pg_receivewal.c:953 #, c-format msgid "replication connection using slot \"%s\" is unexpectedly database specific" msgstr "la connexion de réplication utilisant le slot « %s » est spécifique à une base, ce qui est inattendu" -#: pg_receivewal.c:730 pg_recvlogical.c:966 +#: pg_receivewal.c:972 pg_recvlogical.c:955 #, c-format msgid "dropping replication slot \"%s\"" msgstr "suppression du slot de réplication « %s »" -#: pg_receivewal.c:741 pg_recvlogical.c:976 +#: pg_receivewal.c:983 pg_recvlogical.c:965 #, c-format msgid "creating replication slot \"%s\"" msgstr "création du slot de réplication « %s »" -#: pg_receivewal.c:767 pg_recvlogical.c:1001 +#: pg_receivewal.c:1012 pg_recvlogical.c:989 #, c-format msgid "disconnected" msgstr "déconnecté" #. translator: check source for value for %d -#: pg_receivewal.c:773 pg_recvlogical.c:1007 +#: pg_receivewal.c:1016 pg_recvlogical.c:993 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "déconnecté, attente de %d secondes avant une nouvelle tentative" -#: pg_recvlogical.c:73 +#: pg_recvlogical.c:76 #, c-format msgid "" "%s controls PostgreSQL logical decoding streams.\n" @@ -1079,7 +1398,7 @@ msgstr "" "%s contrôle le flux des modifications logiques de PostgreSQL.\n" "\n" -#: pg_recvlogical.c:77 +#: pg_recvlogical.c:80 #, c-format msgid "" "\n" @@ -1088,72 +1407,79 @@ msgstr "" "\n" "Action à réaliser :\n" -#: pg_recvlogical.c:80 +#: pg_recvlogical.c:83 #, c-format msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n" msgstr "" -" --start lance le flux dans un slot de réplication (pour\n" -" le nom du slot, voir --slot)\n" +" --start lance le flux dans un slot de réplication (pour\n" +" le nom du slot, voir --slot)\n" -#: pg_recvlogical.c:83 +#: pg_recvlogical.c:86 #, c-format msgid " -f, --file=FILE receive log into this file, - for stdout\n" -msgstr " -f, --file=NOMFICHIER trace la réception dans ce fichier, - pour stdout\n" +msgstr "" +" -f, --file=FICHIER trace la réception dans ce fichier, - pour\n" +" stdout\n" -#: pg_recvlogical.c:84 +#: pg_recvlogical.c:87 #, c-format msgid "" " -F --fsync-interval=SECS\n" " time between fsyncs to the output file (default: %d)\n" msgstr "" -" -F --fsync-interval=SECS durée entre les fsyncs vers le fichier de sortie\n" -" (par défaut %d)\n" +" -F --fsync-interval=SECS durée entre les fsyncs vers le fichier de sortie\n" +" (par défaut %d)\n" -#: pg_recvlogical.c:87 +#: pg_recvlogical.c:90 #, c-format msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n" msgstr "" -" -I, --startpos=LSN position de début du streaming dans le slot\n" -" existant\n" +" -I, --startpos=LSN position de début du streaming dans le slot\n" +" existant\n" -#: pg_recvlogical.c:89 +#: pg_recvlogical.c:92 #, c-format msgid "" " -o, --option=NAME[=VALUE]\n" " pass option NAME with optional value VALUE to the\n" " output plugin\n" msgstr "" -" -o, --option=NOM[=VALEUR] passe l'option NAME avec la valeur optionnelle\n" -" VALEUR au plugin en sortie\n" +" -o, --option=NOM[=VALEUR] passe l'option NOM avec la valeur optionnelle\n" +" VALEUR au plugin en sortie\n" -#: pg_recvlogical.c:92 +#: pg_recvlogical.c:95 #, c-format msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n" msgstr "" -" -P, --plugin=PLUGIN utilise le plugin PLUGIN en sortie\n" -" (par défaut %s)\n" +" -P, --plugin=PLUGIN utilise le plugin PLUGIN en sortie (par défaut\n" +" %s)\n" -#: pg_recvlogical.c:95 +#: pg_recvlogical.c:98 #, c-format msgid " -S, --slot=SLOTNAME name of the logical replication slot\n" -msgstr " -S, --slot=NOMSLOT nom du slot de réplication logique\n" +msgstr " -S, --slot=SLOT nom du slot de réplication logique\n" + +#: pg_recvlogical.c:99 +#, c-format +msgid " -t, --two-phase enable two-phase decoding when creating a slot\n" +msgstr " -t, --two-phase active le décodage two-phase lors de la création d'un slot\n" -#: pg_recvlogical.c:100 +#: pg_recvlogical.c:104 #, c-format msgid " -d, --dbname=DBNAME database to connect to\n" -msgstr " -d, --dbname=NOMBASE base de données de connexion\n" +msgstr " -d, --dbname=BASE base de données de connexion\n" -#: pg_recvlogical.c:133 +#: pg_recvlogical.c:137 #, c-format msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)" msgstr "confirmation d'écriture jusqu'à %X/%X et de synchronisation jusqu'à %X/%X (slot %s)" -#: pg_recvlogical.c:157 receivelog.c:342 +#: pg_recvlogical.c:161 receivelog.c:366 #, c-format msgid "could not send feedback packet: %s" msgstr "n'a pas pu envoyer le paquet d'informations en retour : %s" -#: pg_recvlogical.c:230 +#: pg_recvlogical.c:229 #, c-format msgid "starting log streaming at %X/%X (slot %s)" msgstr "commence le flux des journaux à %X/%X (slot %s)" @@ -1166,99 +1492,100 @@ msgstr "flux lancé" #: pg_recvlogical.c:335 #, c-format msgid "could not open log file \"%s\": %m" -msgstr "n'a pas pu ouvrir le fichier applicatif « %s » : %m" +msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m" -#: pg_recvlogical.c:361 receivelog.c:872 +#: pg_recvlogical.c:364 receivelog.c:889 #, c-format msgid "invalid socket: %s" msgstr "socket invalide : %s" -#: pg_recvlogical.c:414 receivelog.c:900 +#: pg_recvlogical.c:417 receivelog.c:917 #, c-format msgid "%s() failed: %m" msgstr "échec de %s() : %m" -#: pg_recvlogical.c:421 receivelog.c:950 +#: pg_recvlogical.c:424 receivelog.c:967 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "n'a pas pu recevoir des données du flux de WAL : %s" -#: pg_recvlogical.c:463 pg_recvlogical.c:514 receivelog.c:994 receivelog.c:1060 +#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011 +#: receivelog.c:1074 #, c-format msgid "streaming header too small: %d" msgstr "en-tête de flux trop petit : %d" -#: pg_recvlogical.c:498 receivelog.c:832 +#: pg_recvlogical.c:501 receivelog.c:849 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "entête non reconnu du flux : « %c »" -#: pg_recvlogical.c:552 pg_recvlogical.c:564 +#: pg_recvlogical.c:555 pg_recvlogical.c:567 #, c-format -msgid "could not write %u bytes to log file \"%s\": %m" -msgstr "n'a pas pu écrire %u octets dans le journal de transactions « %s » : %m" +msgid "could not write %d bytes to log file \"%s\": %m" +msgstr "n'a pas pu écrire %d octets dans le journal de transactions « %s » : %m" -#: pg_recvlogical.c:618 receivelog.c:628 receivelog.c:665 +#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "fin inattendue du flux de réplication : %s" -#: pg_recvlogical.c:742 -#, c-format -msgid "invalid fsync interval \"%s\"" -msgstr "intervalle fsync « %s » invalide" - #: pg_recvlogical.c:780 #, c-format msgid "could not parse start position \"%s\"" msgstr "n'a pas pu analyser la position de départ « %s »" -#: pg_recvlogical.c:869 +#: pg_recvlogical.c:858 #, c-format msgid "no slot specified" msgstr "aucun slot de réplication indiqué" -#: pg_recvlogical.c:877 +#: pg_recvlogical.c:865 #, c-format msgid "no target file specified" msgstr "aucun fichier cible indiqué" -#: pg_recvlogical.c:885 +#: pg_recvlogical.c:872 #, c-format msgid "no database specified" msgstr "aucune base de données indiquée" -#: pg_recvlogical.c:893 +#: pg_recvlogical.c:879 #, c-format msgid "at least one action needs to be specified" msgstr "au moins une action doit être indiquée" -#: pg_recvlogical.c:901 +#: pg_recvlogical.c:886 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "ne peut pas utiliser --create-slot ou --start avec --drop-slot" -#: pg_recvlogical.c:909 +#: pg_recvlogical.c:893 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "ne peut pas utiliser --create-slot ou --drop-slot avec --startpos" -#: pg_recvlogical.c:917 +#: pg_recvlogical.c:900 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos peut seulement être spécifié avec --start" -#: pg_recvlogical.c:948 +#: pg_recvlogical.c:907 +#, c-format +msgid "--two-phase may only be specified with --create-slot" +msgstr "--two-phase peut seulement être spécifié avec --create-slot" + +#: pg_recvlogical.c:939 #, c-format msgid "could not establish database-specific replication connection" msgstr "n'a pas pu établir une connexion de réplication spécifique à la base" -#: pg_recvlogical.c:1047 +#: pg_recvlogical.c:1033 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "position finale %X/%X atteinte par keepalive" -#: pg_recvlogical.c:1050 +#: pg_recvlogical.c:1036 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "position finale %X/%X atteinte à l'enregistrement WAL %X/%X" @@ -1268,251 +1595,257 @@ msgstr "position finale %X/%X atteinte à l'enregistrement WAL %X/%X" msgid "could not create archive status file \"%s\": %s" msgstr "n'a pas pu créer le fichier de statut d'archivage « %s » : %s" -#: receivelog.c:115 +#: receivelog.c:75 +#, c-format +msgid "could not close archive status file \"%s\": %s" +msgstr "n'a pas pu fermer le fichier de statut d'archivage « %s » : %s" + +#: receivelog.c:123 #, c-format msgid "could not get size of write-ahead log file \"%s\": %s" msgstr "n'a pas pu obtenir la taille du journal de transactions « %s » : %s" -#: receivelog.c:125 +#: receivelog.c:134 #, c-format msgid "could not open existing write-ahead log file \"%s\": %s" msgstr "n'a pas pu ouvrir le journal des transactions « %s » existant : %s" -#: receivelog.c:133 +#: receivelog.c:143 #, c-format msgid "could not fsync existing write-ahead log file \"%s\": %s" msgstr "n'a pas pu synchroniser sur disque le journal de transactions « %s » existant : %s" -#: receivelog.c:147 +#: receivelog.c:158 #, c-format -msgid "write-ahead log file \"%s\" has %d byte, should be 0 or %d" -msgid_plural "write-ahead log file \"%s\" has %d bytes, should be 0 or %d" -msgstr[0] "le journal de transactions « %s » comprend %d octet, cela devrait être 0 ou %d" -msgstr[1] "le journal de transactions « %s » comprend %d octets, cela devrait être 0 ou %d" +msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d" +msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d" +msgstr[0] "le journal de transactions « %s » comprend %zd octet, cela devrait être 0 ou %d" +msgstr[1] "le journal de transactions « %s » comprend %zd octets, cela devrait être 0 ou %d" -#: receivelog.c:162 +#: receivelog.c:174 #, c-format msgid "could not open write-ahead log file \"%s\": %s" msgstr "n'a pas pu ouvrir le journal de transactions « %s » : %s" -#: receivelog.c:188 +#: receivelog.c:208 #, c-format msgid "could not determine seek position in file \"%s\": %s" msgstr "n'a pas pu déterminer la position de recherche dans le fichier d'archive « %s » : %s" -#: receivelog.c:202 +#: receivelog.c:223 #, c-format -msgid "not renaming \"%s%s\", segment is not complete" -msgstr "pas de renommage de « %s%s », le segment n'est pas complet" +msgid "not renaming \"%s\", segment is not complete" +msgstr "pas de renommage de « %s », le segment n'est pas complet" -#: receivelog.c:214 receivelog.c:299 receivelog.c:674 +#: receivelog.c:234 receivelog.c:323 receivelog.c:694 #, c-format msgid "could not close file \"%s\": %s" msgstr "n'a pas pu fermer le fichier « %s » : %s" -#: receivelog.c:271 +#: receivelog.c:295 #, c-format msgid "server reported unexpected history file name for timeline %u: %s" msgstr "le serveur a renvoyé un nom de fichier historique inattendu pour la timeline %u : %s" -#: receivelog.c:279 +#: receivelog.c:303 #, c-format msgid "could not create timeline history file \"%s\": %s" msgstr "n'a pas pu créer le fichier historique de la timeline « %s » : %s" -#: receivelog.c:286 +#: receivelog.c:310 #, c-format msgid "could not write timeline history file \"%s\": %s" msgstr "n'a pas pu écrire dans le fichier historique de la timeline « %s » : %s" -#: receivelog.c:376 +#: receivelog.c:400 #, c-format msgid "incompatible server version %s; client does not support streaming from server versions older than %s" msgstr "version %s du serveur incompatible ; le client ne supporte pas le streaming de versions plus anciennes que %s" -#: receivelog.c:385 +#: receivelog.c:409 #, c-format msgid "incompatible server version %s; client does not support streaming from server versions newer than %s" msgstr "version %s du serveur incompatible ; le client ne supporte pas le streaming de versions plus récentes que %s" -#: receivelog.c:487 streamutil.c:430 streamutil.c:467 -#, c-format -msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" -msgstr "n'a pas pu identifier le système : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs (ou plus)." - -#: receivelog.c:494 +#: receivelog.c:514 #, c-format msgid "system identifier does not match between base backup and streaming connection" msgstr "l'identifiant système ne correspond pas entre la sauvegarde des fichiers et la connexion de réplication" -#: receivelog.c:500 +#: receivelog.c:522 #, c-format msgid "starting timeline %u is not present in the server" msgstr "la timeline %u de départ n'est pas dans le serveur" -#: receivelog.c:541 +#: receivelog.c:561 #, c-format msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields" msgstr "réponse inattendue à la commande TIMELINE_HISTORY : a récupéré %d lignes et %d champs, alors qu'il attendait %d lignes et %d champs" -#: receivelog.c:612 +#: receivelog.c:632 #, c-format msgid "server reported unexpected next timeline %u, following timeline %u" msgstr "le serveur a renvoyé une timeline suivante %u inattendue, après la timeline %u" -#: receivelog.c:618 +#: receivelog.c:638 #, c-format msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X" msgstr "le serveur a arrêté l'envoi de la timeline %u à %X/%X, mais a indiqué que la timeline suivante, %u, commence à %X/%X" -#: receivelog.c:658 +#: receivelog.c:678 #, c-format msgid "replication stream was terminated before stop point" msgstr "le flux de réplication a été abandonné avant d'arriver au point d'arrêt" -#: receivelog.c:704 +#: receivelog.c:724 #, c-format msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields" msgstr "ensemble de résultats inattendu après la fin de la timeline : a récupéré %d lignes et %d champs, alors qu'il attendait %d lignes et %d champs" -#: receivelog.c:713 +#: receivelog.c:733 #, c-format msgid "could not parse next timeline's starting point \"%s\"" msgstr "n'a pas pu analyser la position de départ de la prochaine timeline « %s »" -#: receivelog.c:762 receivelog.c:1014 +#: receivelog.c:781 receivelog.c:1030 walmethods.c:1203 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %s" -#: receivelog.c:1077 +#: receivelog.c:1091 #, c-format msgid "received write-ahead log record for offset %u with no file open" msgstr "a reçu l'enregistrement du journal de transactions pour le décalage %u sans fichier ouvert" -#: receivelog.c:1087 +#: receivelog.c:1101 #, c-format msgid "got WAL data offset %08x, expected %08x" msgstr "a obtenu le décalage %08x pour les données du journal, attendait %08x" -#: receivelog.c:1121 +#: receivelog.c:1135 #, c-format -msgid "could not write %u bytes to WAL file \"%s\": %s" -msgstr "n'a pas pu écrire %u octets dans le journal de transactions « %s » : %s" +msgid "could not write %d bytes to WAL file \"%s\": %s" +msgstr "n'a pas pu écrire %d octets dans le journal de transactions « %s » : %s" -#: receivelog.c:1146 receivelog.c:1186 receivelog.c:1216 +#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230 #, c-format msgid "could not send copy-end packet: %s" msgstr "n'a pas pu envoyer le paquet de fin de copie : %s" -#: streamutil.c:162 +#: streamutil.c:159 msgid "Password: " msgstr "Mot de passe : " -#: streamutil.c:186 +#: streamutil.c:182 #, c-format msgid "could not connect to server" msgstr "n'a pas pu se connecter au serveur" -#: streamutil.c:231 +#: streamutil.c:225 #, c-format msgid "could not clear search_path: %s" msgstr "n'a pas pu effacer search_path : %s" -#: streamutil.c:247 +#: streamutil.c:241 #, c-format msgid "could not determine server setting for integer_datetimes" msgstr "n'a pas pu déterminer la configuration serveur de integer_datetimes" -#: streamutil.c:254 +#: streamutil.c:248 #, c-format msgid "integer_datetimes compile flag does not match server" msgstr "l'option de compilation integer_datetimes ne correspond pas au serveur" -#: streamutil.c:305 +#: streamutil.c:299 #, c-format msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "n'a pas pu récupéré la taille d'un segment WAL : a obtenu %d lignes et %d champs, attendait %d lignes et %d champs (ou plus)" -#: streamutil.c:315 +#: streamutil.c:309 #, c-format msgid "WAL segment size could not be parsed" msgstr "la taille du segment WAL n'a pas pu être analysée" -#: streamutil.c:333 +#: streamutil.c:327 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes" msgstr[0] "la taille d'un WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go mais le serveur distant a rapporté une valeur de %d octet" msgstr[1] "la taille d'un WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go mais le serveur distant a rapporté une valeur de %d octets" -#: streamutil.c:378 +#: streamutil.c:372 #, c-format msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "n'a pas pu récupérer les options d'accès du groupe : a obtenu %d lignes et %d champs, attendait %d lignes et %d champs (ou plus)" -#: streamutil.c:387 +#: streamutil.c:381 #, c-format msgid "group access flag could not be parsed: %s" msgstr "l'option d'accès du groupe n'a pas pu être analysé : %s" -#: streamutil.c:544 +#: streamutil.c:424 streamutil.c:461 +#, c-format +msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" +msgstr "n'a pas pu identifier le système : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs (ou plus)." + +#: streamutil.c:513 +#, c-format +msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" +msgstr "n'a pas pu lire le slot de réplication « %s » : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs" + +#: streamutil.c:525 +#, c-format +msgid "could not find replication slot \"%s\"" +msgstr "n'a pas pu trouver le slot de réplication « %s »" + +#: streamutil.c:536 +#, c-format +msgid "expected a physical replication slot, got type \"%s\" instead" +msgstr "attendait un slot de réplication physique, a obtenu le type « %s » à la place" + +#: streamutil.c:550 +#, c-format +msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" +msgstr "n'a pas pu analyser le champ restart_lsn « %s » pour le slot de réplication « %s »" + +#: streamutil.c:667 #, c-format msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "n'a pas pu créer le slot de réplication « %s » : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs" -#: streamutil.c:588 +#: streamutil.c:711 #, c-format msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "n'a pas pu supprimer le slot de réplication « %s » : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs" -#: walmethods.c:438 walmethods.c:932 +#: walmethods.c:720 walmethods.c:1265 msgid "could not compress data" msgstr "n'a pas pu compresser les données" -#: walmethods.c:470 +#: walmethods.c:749 msgid "could not reset compression stream" msgstr "n'a pas pu réinitialiser le flux de compression" -#: walmethods.c:568 -msgid "could not initialize compression library" -msgstr "n'a pas pu initialiser la bibliothèque de compression" - -#: walmethods.c:580 +#: walmethods.c:880 msgid "implementation error: tar files can't have more than one open file" msgstr "erreur d'implémentation : les fichiers tar ne peuvent pas avoir plus d'un fichier ouvert" -#: walmethods.c:594 +#: walmethods.c:894 msgid "could not create tar header" msgstr "n'a pas pu créer l'en-tête du fichier tar" -#: walmethods.c:608 walmethods.c:650 walmethods.c:847 walmethods.c:859 +#: walmethods.c:910 walmethods.c:950 walmethods.c:1169 walmethods.c:1181 msgid "could not change compression parameters" msgstr "n'a pas pu modifier les paramètres de compression" -#: walmethods.c:734 +#: walmethods.c:1054 msgid "unlink not supported with compression" msgstr "suppression non supportée avec la compression" -#: walmethods.c:957 +#: walmethods.c:1289 msgid "could not close compression stream" msgstr "n'a pas pu fermer le flux de compression" -#~ msgid "--create-slot and --no-slot are incompatible options" -#~ msgstr "--create-slot et --no-slot sont des options incompatibles" - -#~ msgid "--progress and --no-estimate-size are incompatible options" -#~ msgstr "--progress et --no-estimate-size sont des options incompatibles" - -#~ msgid "--no-manifest and --manifest-checksums are incompatible options" -#~ msgstr "--no-manifest et --manifest-checksums sont des options incompatibles" - -#~ msgid "--no-manifest and --manifest-force-encode are incompatible options" -#~ msgstr "--no-manifest et --manifest-force-encode sont des options incompatibles" - -#~ msgid "could not connect to server: %s" -#~ msgstr "n'a pas pu se connecter au serveur : %s" - #~ msgid "" #~ "\n" #~ "Report bugs to .\n" @@ -1520,255 +1853,330 @@ msgstr "n'a pas pu fermer le flux de compression" #~ "\n" #~ "Rapporter les bogues à .\n" -#~ msgid "deflate failed" -#~ msgstr "échec en décompression" +#, c-format +#~ msgid "" +#~ " --compression-method=METHOD\n" +#~ " method to compress logs\n" +#~ msgstr "" +#~ " --compression-method=METHODE\n" +#~ " méthode pour compresser les journaux\n" -#~ msgid "deflateReset failed" -#~ msgstr "échec de deflateReset" +#~ msgid " --help show this help, then exit\n" +#~ msgstr " --help affiche cette aide et quitte\n" -#~ msgid "deflateInit2 failed" -#~ msgstr "échec de deflateInit2" +#~ msgid " --version output version information, then exit\n" +#~ msgstr " --version affiche la version et quitte\n" -#~ msgid "deflateParams failed" -#~ msgstr "échec de deflateParams" +#~ msgid " -?, --help show this help, then exit\n" +#~ msgstr " -?, --help affiche cette aide puis quitte\n" -#~ msgid "deflateEnd failed" -#~ msgstr "échec de deflateEnd" +#~ msgid " -V, --version output version information, then exit\n" +#~ msgstr " -V, --version affiche la version puis quitte\n" + +#, c-format +#~ msgid " -Z, --compress=0-9 compress tar output with given compression level\n" +#~ msgstr "" +#~ " -Z, --compress=0-9 compresse la sortie tar avec le niveau de\n" +#~ " compression indiqué\n" + +#, c-format +#~ msgid " -Z, --compress=1-9 compress logs with given compression level\n" +#~ msgstr "" +#~ " -Z, --compress=0-9 compresse les journaux avec le niveau de\n" +#~ " compression indiqué\n" #~ msgid " -x, --xlog include required WAL files in backup (fetch mode)\n" #~ msgstr "" #~ " -x, --xlog inclut les journaux de transactions nécessaires\n" #~ " dans la sauvegarde (mode fetch)\n" -#~ msgid "%s: cannot specify both --xlog and --xlog-method\n" -#~ msgstr "%s : ne peut pas spécifier à la fois --xlog et --xlog-method\n" +#~ msgid "%s: WAL directory \"%s\" not removed at user's request\n" +#~ msgstr "%s : répertoire des journaux de transactions « %s » non supprimé à la demande de l'utilisateur\n" + +#~ msgid "%s: WAL directory location must be an absolute path\n" +#~ msgstr "" +#~ "%s : l'emplacement du répertoire des journaux de transactions doit être\n" +#~ "indiqué avec un chemin absolu\n" #~ msgid "%s: WAL streaming can only be used in plain mode\n" #~ msgstr "%s : le flux de journaux de transactions peut seulement être utilisé en mode plain\n" -#~ msgid "%s: could not stat transaction log file \"%s\": %s\n" -#~ msgstr "" -#~ "%s : n'a pas pu récupérer les informations sur le journal de transactions\n" -#~ "« %s » : %s\n" - -#~ msgid "%s: could not pad transaction log file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu remplir de zéros le journal de transactions « %s » : %s\n" +#~ msgid "%s: cannot specify both --xlog and --xlog-method\n" +#~ msgstr "%s : ne peut pas spécifier à la fois --xlog et --xlog-method\n" -#~ msgid "%s: could not seek to beginning of transaction log file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu rechercher le début du journal de transaction « %s » : %s\n" +#~ msgid "%s: child process did not exit normally\n" +#~ msgstr "%s : le processus fils n'a pas quitté normalement\n" -#~ msgid "%s: could not rename file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu renommer le fichier « %s » : %s\n" +#~ msgid "%s: child process exited with error %d\n" +#~ msgstr "%s : le processus fils a quitté avec le code erreur %d\n" -#~ msgid "%s: could not open timeline history file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le journal historique de la timeline « %s » : %s\n" +#~ msgid "%s: could not access directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n" -#~ msgid "%s: could not parse file size\n" -#~ msgstr "%s : n'a pas pu analyser la taille du fichier\n" +#~ msgid "%s: could not clear search_path: %s" +#~ msgstr "%s : n'a pas pu effacer search_path : %s" -#~ msgid "%s: could not parse file mode\n" -#~ msgstr "%s : n'a pas pu analyser le mode du fichier\n" +#~ msgid "%s: could not close directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n" -#~ msgid "%s: could not parse transaction log file name \"%s\"\n" -#~ msgstr "%s : n'a pas pu analyser le nom du journal de transactions « %s »\n" +#~ msgid "%s: could not close file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu fermer le fichier « %s » : %s\n" #~ msgid "%s: could not close file %s: %s\n" #~ msgstr "%s : n'a pas pu fermer le fichier %s : %s\n" -#~ msgid " -V, --version output version information, then exit\n" -#~ msgstr " -V, --version affiche la version puis quitte\n" +#~ msgid "%s: could not connect to server\n" +#~ msgstr "%s : n'a pas pu se connecter au serveur\n" -#~ msgid " -?, --help show this help, then exit\n" -#~ msgstr " -?, --help affiche cette aide puis quitte\n" +#~ msgid "%s: could not connect to server: %s" +#~ msgstr "%s : n'a pas pu se connecter au serveur : %s" -#~ msgid "%s: invalid format of xlog location: %s\n" -#~ msgstr "%s : format invalide de l'emplacement du journal de transactions : %s\n" +#~ msgid "%s: could not create archive status file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu créer le fichier de statut d'archivage « %s » : %s\n" + +#~ msgid "%s: could not create directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu créer le répertoire « %s » : %s\n" + +#~ msgid "%s: could not create file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu créer le fichier « %s » : %s\n" + +#~ msgid "%s: could not create symbolic link \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu créer le lien symbolique « %s » : %s\n" + +#~ msgid "%s: could not fsync file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n" + +#~ msgid "%s: could not fsync log file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n" + +#~ msgid "%s: could not get current position in file %s: %s\n" +#~ msgstr "%s : n'a pas pu obtenir la position courant dans le fichier %s : %s\n" #~ msgid "%s: could not identify system: %s" #~ msgstr "%s : n'a pas pu identifier le système : %s" -#~ msgid "%s: could not send base backup command: %s" -#~ msgstr "%s : n'a pas pu envoyer la commande de sauvegarde de base : %s" - #~ msgid "%s: could not identify system: %s\n" #~ msgstr "%s : n'a pas pu identifier le système : %s\n" -#~ msgid "%s: could not parse log start position from value \"%s\"\n" -#~ msgstr "%s : n'a pas pu analyser la position de départ des WAL à partir de la valeur « %s »\n" +#~ msgid "%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n" +#~ msgstr "" +#~ "%s : n'a pas pu identifier le système, a récupéré %d lignes et %d champs,\n" +#~ "attendait %d lignes et %d champs (ou plus)\n" #~ msgid "%s: could not open WAL segment %s: %s\n" #~ msgstr "%s : n'a pas pu ouvrir le segment WAL %s : %s\n" -#~ msgid "%s: could not stat WAL segment %s: %s\n" -#~ msgstr "%s : n'a pas pu récupérer les informations sur le segment WAL %s : %s\n" +#~ msgid "%s: could not open directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n" + +#~ msgid "%s: could not open file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" + +#~ msgid "%s: could not open log file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %s\n" + +#~ msgid "%s: could not open timeline history file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le journal historique de la timeline « %s » : %s\n" + +#~ msgid "%s: could not open write-ahead log file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le journal de transactions « %s » : %s\n" #~ msgid "%s: could not pad WAL segment %s: %s\n" #~ msgstr "%s : n'a pas pu terminer le segment WAL %s : %s\n" -#~ msgid "%s: could not seek back to beginning of WAL segment %s: %s\n" -#~ msgstr "%s : n'a pas pu se déplacer au début du segment WAL %s : %s\n" +#~ msgid "%s: could not pad transaction log file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu remplir de zéros le journal de transactions « %s » : %s\n" -#~ msgid "%s: could not get current position in file %s: %s\n" -#~ msgstr "%s : n'a pas pu obtenir la position courant dans le fichier %s : %s\n" +#~ msgid "%s: could not parse file mode\n" +#~ msgstr "%s : n'a pas pu analyser le mode du fichier\n" + +#~ msgid "%s: could not parse file size\n" +#~ msgstr "%s : n'a pas pu analyser la taille du fichier\n" + +#~ msgid "%s: could not parse log start position from value \"%s\"\n" +#~ msgstr "%s : n'a pas pu analyser la position de départ des WAL à partir de la valeur « %s »\n" + +#~ msgid "%s: could not parse transaction log file name \"%s\"\n" +#~ msgstr "%s : n'a pas pu analyser le nom du journal de transactions « %s »\n" #~ msgid "%s: could not read copy data: %s\n" #~ msgstr "%s : n'a pas pu lire les données du COPY : %s\n" -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide et quitte\n" +#~ msgid "%s: could not read directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n" -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version et quitte\n" +#~ msgid "%s: could not receive data from WAL stream: %s" +#~ msgstr "%s : n'a pas pu recevoir des données du flux de WAL : %s" -#~ msgid "%s: keepalive message has incorrect size %d\n" -#~ msgstr "%s : le message keepalive a une taille %d incorrecte\n" +#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu renommer le fichier « %s » en « %s » : %s\n" -#~ msgid "%s: timeline does not match between base backup and streaming connection\n" -#~ msgstr "" -#~ "%s : la timeline ne correspond pas entre la sauvegarde des fichiers et la\n" -#~ "connexion de réplication\n" +#~ msgid "%s: could not rename file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu renommer le fichier « %s » : %s\n" -#~ msgid "%s: no start point returned from server\n" -#~ msgstr "%s : aucun point de redémarrage renvoyé du serveur\n" +#~ msgid "%s: could not seek back to beginning of WAL segment %s: %s\n" +#~ msgstr "%s : n'a pas pu se déplacer au début du segment WAL %s : %s\n" -#~ msgid "%s: socket not open" -#~ msgstr "%s : socket non ouvert" +#~ msgid "%s: could not seek to beginning of transaction log file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu rechercher le début du journal de transaction « %s » : %s\n" -#~ msgid "%s: could not clear search_path: %s" -#~ msgstr "%s : n'a pas pu effacer search_path : %s" +#~ msgid "%s: could not send base backup command: %s" +#~ msgstr "%s : n'a pas pu envoyer la commande de sauvegarde de base : %s" -#~ msgid "%s: could not connect to server: %s" -#~ msgstr "%s : n'a pas pu se connecter au serveur : %s" +#~ msgid "%s: could not set permissions on directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas configurer les droits sur le répertoire « %s » : %s\n" -#~ msgid "%s: could not connect to server\n" -#~ msgstr "%s : n'a pas pu se connecter au serveur\n" +#~ msgid "%s: could not set permissions on file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu configurer les droits sur le fichier « %s » : %s\n" -#~ msgid "%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n" +#~ msgid "%s: could not stat WAL segment %s: %s\n" +#~ msgstr "%s : n'a pas pu récupérer les informations sur le segment WAL %s : %s\n" + +#~ msgid "%s: could not stat file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n" + +#~ msgid "%s: could not stat transaction log file \"%s\": %s\n" #~ msgstr "" -#~ "%s : n'a pas pu identifier le système, a récupéré %d lignes et %d champs,\n" -#~ "attendait %d lignes et %d champs (ou plus)\n" +#~ "%s : n'a pas pu récupérer les informations sur le journal de transactions\n" +#~ "« %s » : %s\n" -#~ msgid "%s: could not open write-ahead log file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le journal de transactions « %s » : %s\n" +#~ msgid "%s: could not write to file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu écrire dans le fichier « %s » : %s\n" -#~ msgid "%s: could not create archive status file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu créer le fichier de statut d'archivage « %s » : %s\n" +#~ msgid "%s: data directory \"%s\" not removed at user's request\n" +#~ msgstr "%s : répertoire des données « %s » non supprimé à la demande de l'utilisateur\n" -#~ msgid "%s: could not receive data from WAL stream: %s" -#~ msgstr "%s : n'a pas pu recevoir des données du flux de WAL : %s" +#~ msgid "%s: directory \"%s\" exists but is not empty\n" +#~ msgstr "%s : le répertoire « %s » existe mais n'est pas vide\n" -#~ msgid "%s: select() failed: %s\n" -#~ msgstr "%s : échec de select() : %s\n" +#~ msgid "%s: failed to remove WAL directory\n" +#~ msgstr "%s : échec de la suppression du répertoire des journaux de transactions\n" -#~ msgid "%s: invalid socket: %s" -#~ msgstr "%s : socket invalide : %s" +#~ msgid "%s: failed to remove contents of WAL directory\n" +#~ msgstr "%s : échec de la suppression du contenu du répertoire des journaux de transactions\n" -#~ msgid "%s: could not open log file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %s\n" +#~ msgid "%s: failed to remove contents of data directory\n" +#~ msgstr "%s : échec de la suppression du contenu du répertoire des données\n" -#~ msgid "%s: could not fsync log file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n" +#~ msgid "%s: failed to remove data directory\n" +#~ msgstr "%s : échec de la suppression du répertoire des données\n" + +#~ msgid "%s: invalid format of xlog location: %s\n" +#~ msgstr "%s : format invalide de l'emplacement du journal de transactions : %s\n" #~ msgid "%s: invalid port number \"%s\"\n" #~ msgstr "%s : numéro de port invalide : « %s »\n" -#~ msgid "%s: could not close directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n" +#~ msgid "%s: invalid socket: %s" +#~ msgstr "%s : socket invalide : %s" -#~ msgid "%s: symlinks are not supported on this platform\n" -#~ msgstr "%s : les liens symboliques ne sont pas supportés sur cette plateforme\n" +#~ msgid "%s: keepalive message has incorrect size %d\n" +#~ msgstr "%s : le message keepalive a une taille %d incorrecte\n" -#~ msgid "%s: could not create symbolic link \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu créer le lien symbolique « %s » : %s\n" +#~ msgid "%s: no start point returned from server\n" +#~ msgstr "%s : aucun point de redémarrage renvoyé du serveur\n" -#~ msgid "%s: WAL directory location must be an absolute path\n" -#~ msgstr "" -#~ "%s : l'emplacement du répertoire des journaux de transactions doit être\n" -#~ "indiqué avec un chemin absolu\n" +#~ msgid "%s: out of memory\n" +#~ msgstr "%s : mémoire épuisée\n" -#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" -#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" +#~ msgid "%s: removing WAL directory \"%s\"\n" +#~ msgstr "%s : suppression du répertoire des journaux de transactions « %s »\n" -#~ msgid "%s: child process exited with error %d\n" -#~ msgstr "%s : le processus fils a quitté avec le code erreur %d\n" +#~ msgid "%s: removing contents of WAL directory \"%s\"\n" +#~ msgstr "%s : suppression du contenu du répertoire des journaux de transactions « %s »\n" -#~ msgid "%s: child process did not exit normally\n" -#~ msgstr "%s : le processus fils n'a pas quitté normalement\n" +#~ msgid "%s: removing contents of data directory \"%s\"\n" +#~ msgstr "%s : suppression du contenu du répertoire des données « %s »\n" -#~ msgid "%s: out of memory\n" -#~ msgstr "%s : mémoire épuisée\n" +#~ msgid "%s: removing data directory \"%s\"\n" +#~ msgstr "%s : suppression du répertoire des données « %s »\n" -#~ msgid "%s: could not set permissions on file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu configurer les droits sur le fichier « %s » : %s\n" +#~ msgid "%s: select() failed: %s\n" +#~ msgstr "%s : échec de select() : %s\n" -#~ msgid "%s: could not set permissions on directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas configurer les droits sur le répertoire « %s » : %s\n" +#~ msgid "%s: socket not open" +#~ msgstr "%s : socket non ouvert" -#~ msgid "%s: could not close file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu fermer le fichier « %s » : %s\n" +#~ msgid "%s: symlinks are not supported on this platform\n" +#~ msgstr "%s : les liens symboliques ne sont pas supportés sur cette plateforme\n" -#~ msgid "%s: could not create file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu créer le fichier « %s » : %s\n" +#~ msgid "%s: timeline does not match between base backup and streaming connection\n" +#~ msgstr "" +#~ "%s : la timeline ne correspond pas entre la sauvegarde des fichiers et la\n" +#~ "connexion de réplication\n" -#~ msgid "%s: could not write to file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu écrire dans le fichier « %s » : %s\n" +#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" +#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" -#~ msgid "%s: could not access directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n" +#~ msgid "--create-slot and --no-slot are incompatible options" +#~ msgstr "--create-slot et --no-slot sont des options incompatibles" -#~ msgid "%s: directory \"%s\" exists but is not empty\n" -#~ msgstr "%s : le répertoire « %s » existe mais n'est pas vide\n" +#~ msgid "--no-manifest and --manifest-checksums are incompatible options" +#~ msgstr "--no-manifest et --manifest-checksums sont des options incompatibles" -#~ msgid "%s: could not create directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu créer le répertoire « %s » : %s\n" +#~ msgid "--no-manifest and --manifest-force-encode are incompatible options" +#~ msgstr "--no-manifest et --manifest-force-encode sont des options incompatibles" -#~ msgid "%s: WAL directory \"%s\" not removed at user's request\n" -#~ msgstr "%s : répertoire des journaux de transactions « %s » non supprimé à la demande de l'utilisateur\n" +#~ msgid "--progress and --no-estimate-size are incompatible options" +#~ msgstr "--progress et --no-estimate-size sont des options incompatibles" -#~ msgid "%s: data directory \"%s\" not removed at user's request\n" -#~ msgstr "%s : répertoire des données « %s » non supprimé à la demande de l'utilisateur\n" +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Essayer « %s --help » pour plus d'informations.\n" -#~ msgid "%s: failed to remove contents of WAL directory\n" -#~ msgstr "%s : échec de la suppression du contenu du répertoire des journaux de transactions\n" +#, c-format +#~ msgid "cannot use --compress with --compression-method=%s" +#~ msgstr "ne peut pas utiliser --compress avec --compression-method=%s" -#~ msgid "%s: removing contents of WAL directory \"%s\"\n" -#~ msgstr "%s : suppression du contenu du répertoire des journaux de transactions « %s »\n" +#~ msgid "could not connect to server: %s" +#~ msgstr "n'a pas pu se connecter au serveur : %s" -#~ msgid "%s: failed to remove WAL directory\n" -#~ msgstr "%s : échec de la suppression du répertoire des journaux de transactions\n" +#, c-format +#~ msgid "could not get write-ahead log end position from server: %s" +#~ msgstr "n'a pas pu obtenir la position finale des journaux de transactions à partir du serveur : %s" -#~ msgid "%s: removing WAL directory \"%s\"\n" -#~ msgstr "%s : suppression du répertoire des journaux de transactions « %s »\n" +#~ msgid "deflate failed" +#~ msgstr "échec en décompression" -#~ msgid "%s: failed to remove contents of data directory\n" -#~ msgstr "%s : échec de la suppression du contenu du répertoire des données\n" +#~ msgid "deflateEnd failed" +#~ msgstr "échec de deflateEnd" -#~ msgid "%s: removing contents of data directory \"%s\"\n" -#~ msgstr "%s : suppression du contenu du répertoire des données « %s »\n" +#~ msgid "deflateInit2 failed" +#~ msgstr "échec de deflateInit2" -#~ msgid "%s: failed to remove data directory\n" -#~ msgstr "%s : échec de la suppression du répertoire des données\n" +#~ msgid "deflateParams failed" +#~ msgstr "échec de deflateParams" -#~ msgid "%s: removing data directory \"%s\"\n" -#~ msgstr "%s : suppression du répertoire des données « %s »\n" +#~ msgid "deflateReset failed" +#~ msgstr "échec de deflateReset" -#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu renommer le fichier « %s » en « %s » : %s\n" +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatal : " -#~ msgid "%s: could not fsync file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n" +#, c-format +#~ msgid "invalid compression level \"%s\"" +#~ msgstr "niveau de compression « %s » invalide" -#~ msgid "%s: could not open file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" +#, c-format +#~ msgid "invalid fsync interval \"%s\"" +#~ msgstr "intervalle fsync « %s » invalide" -#~ msgid "%s: could not read directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n" +#, c-format +#~ msgid "invalid port number \"%s\"" +#~ msgstr "numéro de port invalide : « %s »" -#~ msgid "%s: could not open directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n" +#, c-format +#~ msgid "invalid status interval \"%s\"" +#~ msgstr "intervalle « %s » invalide du statut" -#~ msgid "%s: could not stat file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n" +#, c-format +#~ msgid "invalid tar block header size: %zu" +#~ msgstr "taille invalide de l'en-tête de bloc du fichier tar : %zu" #~ msgid "select() failed: %m" #~ msgstr "échec de select() : %m" + +#, c-format +#~ msgid "unrecognized link indicator \"%c\"" +#~ msgstr "indicateur de lien « %c » non reconnu" diff --git a/src/bin/pg_basebackup/po/ja.po b/src/bin/pg_basebackup/po/ja.po index 1ecac3c55c..b3db6b1e19 100644 --- a/src/bin/pg_basebackup/po/ja.po +++ b/src/bin/pg_basebackup/po/ja.po @@ -1,13 +1,18 @@ -# Japanese message translation file for pg_basebackup -# Copyright (C) 2019 PostgreSQL Global Development Group -# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. -# , 2013 +# pg_basebackup.po +# Japanese message translation file for pg_basebackup +# +# Copyright (C) 2013-2022 PostgreSQL Global Development Group +# +# This file is distributed under the same license as the PostgreSQL package. +# +# , 2013. +# msgid "" msgstr "" -"Project-Id-Version: pg_basebackup (PostgreSQL 13)\n" +"Project-Id-Version: pg_basebackup (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:54+0900\n" -"PO-Revision-Date: 2020-09-13 08:55+0200\n" +"POT-Creation-Date: 2022-05-11 14:16+0900\n" +"PO-Revision-Date: 2022-05-10 13:38+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -17,21 +22,60 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:241 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " - -#: ../../../src/common/logging.c:248 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:255 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "警告: " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "ヒント: " + +#: ../../common/compression.c:157 +msgid "found empty string where a compression option was expected" +msgstr "圧縮オプションがあるはずの場所に空文字列が見つかりました" + +#: ../../common/compression.c:187 +#, c-format +msgid "unknown compression option \"%s\"" +msgstr "未知の圧縮オプション \"%s\"" + +#: ../../common/compression.c:226 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "圧縮オプション\"%s\"には値が必要です" + +#: ../../common/compression.c:235 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "圧縮オプション\"%s\"の値は整数でなければなりません" + +#: ../../common/compression.c:273 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "圧縮アルゴリズム\"%s\"は圧縮レベルを受け付けません" + +#: ../../common/compression.c:277 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d" +msgstr "圧縮アルゴリズム\"%s\"では%dから%dまでの圧縮レベルが指定可能です" + +#: ../../common/compression.c:289 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "圧縮アルゴリズム\"%s\"はワーカー数を受け付けません" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -43,139 +87,305 @@ msgstr "メモリ不足です\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ポインタを複製できません (内部エラー)\n" -#: ../../common/file_utils.c:84 ../../common/file_utils.c:186 -#: pg_receivewal.c:266 pg_recvlogical.c:340 +#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 +#: pg_receivewal.c:380 pg_recvlogical.c:341 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"のstatに失敗しました: %m" -#: ../../common/file_utils.c:163 pg_receivewal.c:169 +#: ../../common/file_utils.c:166 pg_receivewal.c:303 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" -#: ../../common/file_utils.c:197 pg_receivewal.c:337 +#: ../../common/file_utils.c:200 pg_receivewal.c:534 #, c-format msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m" -#: ../../common/file_utils.c:229 ../../common/file_utils.c:288 -#: ../../common/file_utils.c:362 ../../fe_utils/recovery_gen.c:134 +#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 +#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121 +#: pg_receivewal.c:447 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンできませんでした: %m" -#: ../../common/file_utils.c:300 ../../common/file_utils.c:370 -#: pg_recvlogical.c:193 +#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 +#: pg_recvlogical.c:196 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"をfsyncできませんでした: %m" -#: ../../common/file_utils.c:380 +#: ../../common/file_utils.c:383 pg_basebackup.c:2264 walmethods.c:459 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" -#: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49 -#: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100 -#: ../../fe_utils/recovery_gen.c:171 pg_basebackup.c:1248 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "オプション\"%2$s\"に対する不正な値\"%1$s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%sは%d..%dの範囲でなければなりません" + +#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 +#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 +#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1643 #, c-format msgid "out of memory" msgstr "メモリ不足です" -#: ../../fe_utils/recovery_gen.c:140 pg_basebackup.c:1021 pg_basebackup.c:1714 -#: pg_basebackup.c:1770 +#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121 +#: bbstreamer_file.c:258 pg_basebackup.c:1440 pg_basebackup.c:1734 #, c-format msgid "could not write to file \"%s\": %m" msgstr "ファイル\"%s\"を書き込めませんでした: %m" -#: ../../fe_utils/recovery_gen.c:152 pg_basebackup.c:1166 pg_basebackup.c:1671 -#: pg_basebackup.c:1747 +#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339 +#: pg_basebackup.c:1504 pg_basebackup.c:1713 #, c-format msgid "could not create file \"%s\": %m" msgstr "ファイル\"%s\"を作成できませんでした: %m" -#: pg_basebackup.c:224 +#: bbstreamer_file.c:138 pg_recvlogical.c:635 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "ファイル\"%s\"をクローズできませんでした: %m" + +#: bbstreamer_file.c:275 +#, c-format +msgid "unexpected state while extracting archive" +msgstr "アーカイブの抽出中に想定外の状態" + +#: bbstreamer_file.c:298 pg_basebackup.c:685 pg_basebackup.c:737 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" + +#: bbstreamer_file.c:304 +#, c-format +msgid "could not set permissions on directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"に権限を設定できませんでした: %m" + +#: bbstreamer_file.c:323 +#, c-format +msgid "could not create symbolic link from \"%s\" to \"%s\": %m" +msgstr "\"%s\"から\"%s\"へのシンボリックリンクを作成できませんでした: %m" + +#: bbstreamer_file.c:343 +#, c-format +msgid "could not set permissions on file \"%s\": %m" +msgstr "ファイル\"%s\"の権限を設定できませんでした: %m" + +#: bbstreamer_gzip.c:95 +#, c-format +msgid "could not create compressed file \"%s\": %m" +msgstr "圧縮ファイル\"%s\"を作成できませんでした: %m" + +#: bbstreamer_gzip.c:103 +#, c-format +msgid "could not duplicate stdout: %m" +msgstr "標準出力の複製に失敗しました: %m" + +#: bbstreamer_gzip.c:107 +#, c-format +msgid "could not open output file: %m" +msgstr "出力ファイルをオープンできませんでした: %m" + +#: bbstreamer_gzip.c:113 +#, c-format +msgid "could not set compression level %d: %s" +msgstr "圧縮レベルを%dに設定できませんでした: %s" + +#: bbstreamer_gzip.c:118 bbstreamer_gzip.c:251 +#, c-format +msgid "this build does not support gzip compression" +msgstr "このビルドではgzip圧縮をサポートしていません" + +#: bbstreamer_gzip.c:145 +#, c-format +msgid "could not write to compressed file \"%s\": %s" +msgstr "圧縮ファイル\"%s\"に書き込めませんでした: %s" + +#: bbstreamer_gzip.c:169 +#, c-format +msgid "could not close compressed file \"%s\": %m" +msgstr "圧縮ファイル\"%s\"をクローズすることができませんでした: %m" + +#: bbstreamer_gzip.c:247 walmethods.c:869 +#, c-format +msgid "could not initialize compression library" +msgstr "圧縮ライブラリを初期化できませんでした" + +#: bbstreamer_gzip.c:297 bbstreamer_lz4.c:355 bbstreamer_zstd.c:319 +#, c-format +msgid "could not decompress data: %s" +msgstr "データを伸張できませんでした: %s" + +#: bbstreamer_inject.c:189 +#, c-format +msgid "unexpected state while injecting recovery settings" +msgstr "リカバリ設定の出力中に想定外の状態" + +#: bbstreamer_lz4.c:96 +#, c-format +msgid "could not create lz4 compression context: %s" +msgstr "lz4圧縮コンテクストを生成できませんでした: %s" + +#: bbstreamer_lz4.c:101 bbstreamer_lz4.c:299 +#, c-format +msgid "this build does not support lz4 compression" +msgstr "このビルドではlz4圧縮をサポートしていません" + +#: bbstreamer_lz4.c:141 +#, c-format +msgid "could not write lz4 header: %s" +msgstr "lz4ヘッダを出力できませんでした: %s" + +#: bbstreamer_lz4.c:190 bbstreamer_zstd.c:171 bbstreamer_zstd.c:213 +#, c-format +msgid "could not compress data: %s" +msgstr "データを圧縮できませんでした: %s" + +#: bbstreamer_lz4.c:242 +#, c-format +msgid "could not end lz4 compression: %s" +msgstr "lz4圧縮を終了できませんでした: %s" + +#: bbstreamer_lz4.c:294 +#, c-format +msgid "could not initialize compression library: %s" +msgstr "圧縮ライブラリを初期化できませんでした: %s" + +#: bbstreamer_tar.c:244 +#, c-format +msgid "tar file trailer exceeds 2 blocks" +msgstr "tarファイル後続ブロックが2ブロックを超えています" + +#: bbstreamer_tar.c:249 +#, c-format +msgid "unexpected state while parsing tar archive" +msgstr "tarアーカイブのパース中に想定外の状態" + +#: bbstreamer_tar.c:296 +#, c-format +msgid "tar member has empty name" +msgstr "tarメンバーの名前が空です" + +#: bbstreamer_tar.c:328 +#, c-format +msgid "COPY stream ended before last file was finished" +msgstr "最後のファイルが終わる前にCOPYストリームが終了しました" + +#: bbstreamer_zstd.c:85 +#, c-format +msgid "could not create zstd compression context" +msgstr "zstd圧縮コンテクストを生成できませんでした" + +#: bbstreamer_zstd.c:93 +#, c-format +msgid "could not set zstd compression level to %d: %s" +msgstr "zstd圧縮レベルを%dに設定できませんでした: %s" + +#: bbstreamer_zstd.c:108 +#, c-format +msgid "could not set compression worker count to %d: %s" +msgstr "圧縮ワーカー数を%dに設定できませんでした: %s" + +#: bbstreamer_zstd.c:119 bbstreamer_zstd.c:274 +#, c-format +msgid "this build does not support zstd compression" +msgstr "このビルドではzstd圧縮をサポートしていません" + +#: bbstreamer_zstd.c:265 +#, c-format +msgid "could not create zstd decompression context" +msgstr "zstd伸張コンテクストを生成できませんでした" + +#: pg_basebackup.c:239 #, c-format msgid "removing data directory \"%s\"" msgstr "データディレクトリ\"%s\"を削除しています" -#: pg_basebackup.c:226 +#: pg_basebackup.c:241 #, c-format msgid "failed to remove data directory" msgstr "データディレクトリの削除に失敗しました" -#: pg_basebackup.c:230 +#: pg_basebackup.c:245 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "データディレクトリ\"%s\"の内容を削除しています" -#: pg_basebackup.c:232 +#: pg_basebackup.c:247 #, c-format msgid "failed to remove contents of data directory" msgstr "データディレクトリの中身の削除に失敗しました" -#: pg_basebackup.c:237 +#: pg_basebackup.c:252 #, c-format msgid "removing WAL directory \"%s\"" msgstr "WAL ディレクトリ\"%s\"を削除しています" -#: pg_basebackup.c:239 +#: pg_basebackup.c:254 #, c-format msgid "failed to remove WAL directory" msgstr "WAL ディレクトリの削除に失敗しました" -#: pg_basebackup.c:243 +#: pg_basebackup.c:258 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "WAL ディレクトリ\"%s\"の中身を削除しています" -#: pg_basebackup.c:245 +#: pg_basebackup.c:260 #, c-format msgid "failed to remove contents of WAL directory" msgstr "WAL ディレクトリの中身の削除に失敗しました" -#: pg_basebackup.c:251 +#: pg_basebackup.c:266 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "ユーザの要求により、データディレクトリ\"%s\"を削除しませんでした" -#: pg_basebackup.c:254 +#: pg_basebackup.c:269 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "ユーザの要求により、WAL ディレクトリ\"%s\"を削除しませんでした" -#: pg_basebackup.c:258 +#: pg_basebackup.c:273 #, c-format msgid "changes to tablespace directories will not be undone" msgstr "テーブル空間用ディレクトリへの変更は取り消されません" -#: pg_basebackup.c:299 +#: pg_basebackup.c:325 #, c-format msgid "directory name too long" msgstr "ディレクトリ名が長すぎます" -#: pg_basebackup.c:309 +#: pg_basebackup.c:332 #, c-format msgid "multiple \"=\" signs in tablespace mapping" msgstr "テーブル空間のマッピングに複数の\"=\"記号があります" -#: pg_basebackup.c:321 +#: pg_basebackup.c:341 #, c-format msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "テーブル空間のマッピング形式\"%s\"が不正です。\"旧DIR=新DIR\"でなければなりません" -#: pg_basebackup.c:333 +#: pg_basebackup.c:350 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "テーブル空間のマッピングにおいて、旧ディレクトリが絶対パスではありません: %s" -#: pg_basebackup.c:340 +#: pg_basebackup.c:354 #, c-format msgid "new directory is not an absolute path in tablespace mapping: %s" msgstr "テーブル空間のマッピングにおいて、新ディレクトリが絶対パスではありません: %s" -#: pg_basebackup.c:379 +#: pg_basebackup.c:376 #, c-format msgid "" "%s takes a base backup of a running PostgreSQL server.\n" @@ -184,17 +394,17 @@ msgstr "" "%sは実行中のPostgreSQLサーバのベースバックアップを取得します。\n" "\n" -#: pg_basebackup.c:381 pg_receivewal.c:79 pg_recvlogical.c:75 +#: pg_basebackup.c:378 pg_receivewal.c:81 pg_recvlogical.c:78 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_basebackup.c:382 pg_receivewal.c:80 pg_recvlogical.c:76 +#: pg_basebackup.c:379 pg_receivewal.c:82 pg_recvlogical.c:79 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [オプション]...\n" -#: pg_basebackup.c:383 +#: pg_basebackup.c:380 #, c-format msgid "" "\n" @@ -203,17 +413,17 @@ msgstr "" "\n" "出力を制御するオプション:\n" -#: pg_basebackup.c:384 +#: pg_basebackup.c:381 #, c-format msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n" msgstr " -D, --pgdata=DIRECTORY ベースバックアップをディレクトリ内に格納\n" -#: pg_basebackup.c:385 +#: pg_basebackup.c:382 #, c-format msgid " -F, --format=p|t output format (plain (default), tar)\n" msgstr " -F, --format=p|t 出力フォーマット(プレイン(デフォルト)またはtar)\n" -#: pg_basebackup.c:386 +#: pg_basebackup.c:383 #, c-format msgid "" " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" @@ -222,7 +432,7 @@ msgstr "" " -r, --max-rate=RATE データディレクトリ転送の際の最大転送速度\n" " (kB/s 単位、または 接尾辞 \"k\" か\"M\" を使用)\n" -#: pg_basebackup.c:388 +#: pg_basebackup.c:385 #, c-format msgid "" " -R, --write-recovery-conf\n" @@ -231,7 +441,16 @@ msgstr "" " -R, --write-recovery-conf\n" " レプリケーションのための設定を書き込む\n" -#: pg_basebackup.c:390 +#: pg_basebackup.c:387 +#, c-format +msgid "" +" -t, --target=TARGET[:DETAIL]\n" +" backup target (if other than client)\n" +msgstr "" +" -t, --target=ターゲット[:詳細]\n" +" バックアップターゲット(クライアント以外の場合)\n" + +#: pg_basebackup.c:389 #, c-format msgid "" " -T, --tablespace-mapping=OLDDIR=NEWDIR\n" @@ -240,33 +459,42 @@ msgstr "" " -T, --tablespace-mapping=旧DIR=新DIR\n" " テーブル空間を旧DIRから新DIRに移動する\n" -#: pg_basebackup.c:392 +#: pg_basebackup.c:391 #, c-format msgid " --waldir=WALDIR location for the write-ahead log directory\n" msgstr " --waldir=WALDIR 先行書き込みログ用ディレクトリの位置\n" -#: pg_basebackup.c:393 +#: pg_basebackup.c:392 #, c-format msgid "" " -X, --wal-method=none|fetch|stream\n" " include required WAL files with specified method\n" msgstr "" " -X, --wal-method=none|fetch|stream\n" -" 要求されたWALファイルを指定のメソッドを使ってバック\n" -" アップに含める\n" +" 要求されたWALファイルを指定の方式でバックアップ\n" +" に含める\n" -#: pg_basebackup.c:395 +#: pg_basebackup.c:394 #, c-format msgid " -z, --gzip compress tar output\n" msgstr " -z, --gzip tar の出力を圧縮する\n" -#: pg_basebackup.c:396 +#: pg_basebackup.c:395 #, c-format -msgid " -Z, --compress=0-9 compress tar output with given compression level\n" -msgstr " -Z, --compress=0-9 指定した圧縮レベルで tar の出力を圧縮する\n" +msgid "" +" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" +" compress on client or server as specified\n" +msgstr "" +" -Z, --compress=[{client|server}-]方式[:詳細]\n" +" 指定に従ってクライアント側またはサーバー側で圧縮\n" #: pg_basebackup.c:397 #, c-format +msgid " -Z, --compress=none do not compress tar output\n" +msgstr " -Z, --compress=none tar出力を圧縮しない\n" + +#: pg_basebackup.c:398 +#, c-format msgid "" "\n" "General options:\n" @@ -274,7 +502,7 @@ msgstr "" "\n" "汎用オプション:\n" -#: pg_basebackup.c:398 +#: pg_basebackup.c:399 #, c-format msgid "" " -c, --checkpoint=fast|spread\n" @@ -283,47 +511,47 @@ msgstr "" " -c, --checkpoint=fast|spread\n" " 高速または分散チェックポイント処理の指定\n" -#: pg_basebackup.c:400 +#: pg_basebackup.c:401 #, c-format msgid " -C, --create-slot create replication slot\n" msgstr " -C, --create-slot 新しいレプリケーションスロットを作成する\n" -#: pg_basebackup.c:401 +#: pg_basebackup.c:402 #, c-format msgid " -l, --label=LABEL set backup label\n" msgstr " -l, --label=LABEL バックアップラベルの設定\n" -#: pg_basebackup.c:402 +#: pg_basebackup.c:403 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --noclean エラー発生後作成したファイルの削除を行わない\n" -#: pg_basebackup.c:403 +#: pg_basebackup.c:404 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --nosync ディスクへの安全な書き込みを待機しない\n" -#: pg_basebackup.c:404 +#: pg_basebackup.c:405 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress 進行状況の表示\n" -#: pg_basebackup.c:405 pg_receivewal.c:89 +#: pg_basebackup.c:406 pg_receivewal.c:91 #, c-format msgid " -S, --slot=SLOTNAME replication slot to use\n" msgstr " -S, --slot=スロット名 使用するレプリケーションスロット\n" -#: pg_basebackup.c:406 pg_receivewal.c:91 pg_recvlogical.c:96 +#: pg_basebackup.c:407 pg_receivewal.c:93 pg_recvlogical.c:100 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose 冗長メッセージの出力\n" -#: pg_basebackup.c:407 pg_receivewal.c:92 pg_recvlogical.c:97 +#: pg_basebackup.c:408 pg_receivewal.c:94 pg_recvlogical.c:101 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: pg_basebackup.c:408 +#: pg_basebackup.c:409 #, c-format msgid "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" @@ -332,7 +560,7 @@ msgstr "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" " 目録チェックサムに使用するアルゴリズム\n" -#: pg_basebackup.c:410 +#: pg_basebackup.c:411 #, c-format msgid "" " --manifest-force-encode\n" @@ -341,22 +569,22 @@ msgstr "" " --manifest-force-encode\n" " 目録中の全てのファイル名を16進エンコードする\n" -#: pg_basebackup.c:412 +#: pg_basebackup.c:413 #, c-format msgid " --no-estimate-size do not estimate backup size in server side\n" msgstr " --no-estimate-size サーバ側でバックアップサイズを見積もらない\n" -#: pg_basebackup.c:413 +#: pg_basebackup.c:414 #, c-format msgid " --no-manifest suppress generation of backup manifest\n" msgstr " --no-manifest バックアップ目録の作成を省略する\n" -#: pg_basebackup.c:414 +#: pg_basebackup.c:415 #, c-format msgid " --no-slot prevent creation of temporary replication slot\n" msgstr " --no-slot 一時レプリケーションスロットの作成を行わない\n" -#: pg_basebackup.c:415 +#: pg_basebackup.c:416 #, c-format msgid "" " --no-verify-checksums\n" @@ -365,12 +593,12 @@ msgstr "" " --no-verify-checksums\n" " チェックサムを検証しない\n" -#: pg_basebackup.c:417 pg_receivewal.c:94 pg_recvlogical.c:98 +#: pg_basebackup.c:418 pg_receivewal.c:97 pg_recvlogical.c:102 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: pg_basebackup.c:418 pg_receivewal.c:95 pg_recvlogical.c:99 +#: pg_basebackup.c:419 pg_receivewal.c:98 pg_recvlogical.c:103 #, c-format msgid "" "\n" @@ -379,22 +607,22 @@ msgstr "" "\n" "接続オプション:\n" -#: pg_basebackup.c:419 pg_receivewal.c:96 +#: pg_basebackup.c:420 pg_receivewal.c:99 #, c-format msgid " -d, --dbname=CONNSTR connection string\n" msgstr " -d, --dbname=CONNSTR 接続文字列\n" -#: pg_basebackup.c:420 pg_receivewal.c:97 pg_recvlogical.c:101 +#: pg_basebackup.c:421 pg_receivewal.c:100 pg_recvlogical.c:105 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME データベースサーバホストまたはソケットディレクトリ\n" -#: pg_basebackup.c:421 pg_receivewal.c:98 pg_recvlogical.c:102 +#: pg_basebackup.c:422 pg_receivewal.c:101 pg_recvlogical.c:106 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT データベースサーバのポート番号\n" -#: pg_basebackup.c:422 +#: pg_basebackup.c:423 #, c-format msgid "" " -s, --status-interval=INTERVAL\n" @@ -403,22 +631,22 @@ msgstr "" " -s, --status-interval=INTERVAL\n" " サーバへ送出するステータスパケットの間隔(秒単位)\n" -#: pg_basebackup.c:424 pg_receivewal.c:99 pg_recvlogical.c:103 +#: pg_basebackup.c:425 pg_receivewal.c:102 pg_recvlogical.c:107 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAME 指定したデータベースユーザで接続\n" -#: pg_basebackup.c:425 pg_receivewal.c:100 pg_recvlogical.c:104 +#: pg_basebackup.c:426 pg_receivewal.c:103 pg_recvlogical.c:108 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password パスワードの入力を要求しない\n" -#: pg_basebackup.c:426 pg_receivewal.c:101 pg_recvlogical.c:105 +#: pg_basebackup.c:427 pg_receivewal.c:104 pg_recvlogical.c:109 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password パスワード入力要求を強制(自動的に行われるはず)\n" -#: pg_basebackup.c:427 pg_receivewal.c:105 pg_recvlogical.c:106 +#: pg_basebackup.c:428 pg_receivewal.c:108 pg_recvlogical.c:110 #, c-format msgid "" "\n" @@ -427,7 +655,7 @@ msgstr "" "\n" "バグは<%s>に報告してください。\n" -#: pg_basebackup.c:428 pg_receivewal.c:106 pg_recvlogical.c:107 +#: pg_basebackup.c:429 pg_receivewal.c:109 pg_recvlogical.c:111 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" @@ -437,430 +665,467 @@ msgstr "%s ホームページ: <%s>\n" msgid "could not read from ready pipe: %m" msgstr "準備ができたパイプからの読み込みが失敗しました: %m" -#: pg_basebackup.c:477 pg_basebackup.c:608 pg_basebackup.c:2133 -#: streamutil.c:450 +#: pg_basebackup.c:474 pg_basebackup.c:621 pg_basebackup.c:2178 +#: streamutil.c:444 #, c-format msgid "could not parse write-ahead log location \"%s\"" msgstr "先行書き込みログの位置\"%s\"をパースできませんでした" -#: pg_basebackup.c:573 pg_receivewal.c:441 +#: pg_basebackup.c:580 pg_receivewal.c:665 #, c-format msgid "could not finish writing WAL files: %m" msgstr "WALファイルの書き込みを終了できませんでした: %m" -#: pg_basebackup.c:620 +#: pg_basebackup.c:630 #, c-format msgid "could not create pipe for background process: %m" msgstr "バックグランドプロセス用のパイプを作成できませんでした: \"%m" -#: pg_basebackup.c:655 +#: pg_basebackup.c:663 #, c-format msgid "created temporary replication slot \"%s\"" msgstr "一時レプリケーションスロット\"%s\"を作成しました" -#: pg_basebackup.c:658 +#: pg_basebackup.c:666 #, c-format msgid "created replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"を作成していました" -#: pg_basebackup.c:678 pg_basebackup.c:731 pg_basebackup.c:1620 +#: pg_basebackup.c:703 #, c-format -msgid "could not create directory \"%s\": %m" -msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" +msgid "log streamer with pid %d exiting" +msgstr "PID %dのログストリーマーが終了します" -#: pg_basebackup.c:696 +#: pg_basebackup.c:708 #, c-format msgid "could not create background process: %m" msgstr "バックグラウンドプロセスを生成できませんでした: %m" -#: pg_basebackup.c:708 +#: pg_basebackup.c:717 #, c-format msgid "could not create background thread: %m" msgstr "バックグラウンドスレッドを生成できませんでした: %m" -#: pg_basebackup.c:752 +#: pg_basebackup.c:756 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "ディレクトリ\"%s\"は存在しますが空ではありません" -#: pg_basebackup.c:759 +#: pg_basebackup.c:762 #, c-format msgid "could not access directory \"%s\": %m" msgstr "ディレクトリ\"%s\"にアクセスできませんでした: %m" -#: pg_basebackup.c:824 +#: pg_basebackup.c:839 #, c-format msgid "%*s/%s kB (100%%), %d/%d tablespace %*s" msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s" msgstr[0] "%*s/%s kB (100%%), %d/%d テーブル空間 %*s" -#: pg_basebackup.c:836 +#: pg_basebackup.c:851 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" msgstr[0] "%*s/%s kB (%d%%), %d/%d テーブル空間 (%s%-*.*s)" -#: pg_basebackup.c:852 +#: pg_basebackup.c:867 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces" msgstr[0] "%*s/%s kB (%d%%), %d/%d テーブル空間" -#: pg_basebackup.c:877 +#: pg_basebackup.c:891 #, c-format msgid "transfer rate \"%s\" is not a valid value" msgstr "転送速度\"%s\"は無効な値です" -#: pg_basebackup.c:882 +#: pg_basebackup.c:893 #, c-format msgid "invalid transfer rate \"%s\": %m" msgstr "転送速度\"%s\"は無効です: %m" -#: pg_basebackup.c:891 +#: pg_basebackup.c:900 #, c-format msgid "transfer rate must be greater than zero" msgstr "転送速度は0より大きな値でなければなりません" -#: pg_basebackup.c:923 +#: pg_basebackup.c:930 #, c-format msgid "invalid --max-rate unit: \"%s\"" msgstr "--max-rate の単位が不正です: \"%s\"" -#: pg_basebackup.c:930 +#: pg_basebackup.c:934 #, c-format msgid "transfer rate \"%s\" exceeds integer range" msgstr "転送速度\"%s\"がintegerの範囲を超えています" -#: pg_basebackup.c:940 +#: pg_basebackup.c:941 #, c-format msgid "transfer rate \"%s\" is out of range" msgstr "転送速度\"%s\"が範囲外です" -#: pg_basebackup.c:961 +#: pg_basebackup.c:1037 #, c-format msgid "could not get COPY data stream: %s" msgstr "COPYデータストリームを取得できませんでした: %s" -#: pg_basebackup.c:981 pg_recvlogical.c:435 pg_recvlogical.c:607 -#: receivelog.c:965 +#: pg_basebackup.c:1054 pg_recvlogical.c:438 pg_recvlogical.c:610 +#: receivelog.c:981 #, c-format msgid "could not read COPY data: %s" msgstr "COPYデータを読み取ることができませんでした: %s" -#: pg_basebackup.c:1007 +#: pg_basebackup.c:1058 #, c-format -msgid "could not write to compressed file \"%s\": %s" -msgstr "圧縮ファイル\"%s\"に書き込めませんでした: %s" +msgid "background process terminated unexpectedly" +msgstr "バックグラウンドプロセスが突然終了しました" -#: pg_basebackup.c:1071 +#: pg_basebackup.c:1129 #, c-format -msgid "could not duplicate stdout: %m" -msgstr "標準出力の複製に失敗しました: %m" +msgid "cannot inject manifest into a compressed tarfile" +msgstr "圧縮tarファイルには目録は出力できません" -#: pg_basebackup.c:1078 +#: pg_basebackup.c:1130 #, c-format -msgid "could not open output file: %m" -msgstr "出力ファイルをオープンできませんでした: %m" +msgid "use client-side compression, send the output to a directory rather than standard output, or use --no-manifest" +msgstr "クライアントサイド圧縮を使用して標準出力ではなくディレクトリに出力する、または --no-manifestを使用してください" -#: pg_basebackup.c:1085 pg_basebackup.c:1106 pg_basebackup.c:1135 +#: pg_basebackup.c:1145 #, c-format -msgid "could not set compression level %d: %s" -msgstr "圧縮レベルを%dに設定できませんでした: %s" +msgid "unable to parse archive: %s" +msgstr "アーカイバのパースができませんでした: %s" -#: pg_basebackup.c:1155 +#: pg_basebackup.c:1146 #, c-format -msgid "could not create compressed file \"%s\": %s" -msgstr "圧縮ファイル\"%s\"を作成できませんでした: %s" +msgid "Only tar archives can be parsed." +msgstr "tarアーカイブのみパース可能です。" -#: pg_basebackup.c:1267 +#: pg_basebackup.c:1148 #, c-format -msgid "could not close compressed file \"%s\": %s" -msgstr "圧縮ファイル\"%s\"を閉じることができませんでした: %s" +msgid "Plain format requires pg_basebackup to parse the archive." +msgstr "Plainフォーマットではpg_basebackupがアーカイブをパースする必要があります。" -#: pg_basebackup.c:1279 pg_recvlogical.c:632 +#: pg_basebackup.c:1150 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "ファイル\"%s\"をクローズできませんでした: %m" +msgid "Using - as the output directory requires pg_basebackup to parse the archive." +msgstr "出力ディレクトリに - を指定する際にはpg_basebackupがアーカイブをパースする必要があります。" -#: pg_basebackup.c:1541 +#: pg_basebackup.c:1152 #, c-format -msgid "COPY stream ended before last file was finished" -msgstr "最後のファイルが終わる前にCOPYストリームが終了しました" +msgid "The -R option requires pg_basebackup to parse the archive." +msgstr "-Rオプションを指定する場合はpg_basebackupがアーカイブをパースする必要があります。" -#: pg_basebackup.c:1570 +#: pg_basebackup.c:1364 #, c-format -msgid "invalid tar block header size: %zu" -msgstr "無効なtarブロックヘッダサイズ: %zu" +msgid "archives should precede manifest" +msgstr "アーカイブは目録より先にあるべきです" -#: pg_basebackup.c:1627 +#: pg_basebackup.c:1379 #, c-format -msgid "could not set permissions on directory \"%s\": %m" -msgstr "ディレクトリ\"%s\"に権限を設定できませんでした: %m" +msgid "invalid archive name: \"%s\"" +msgstr "不正なアーカイブ名: \"%s\"" -#: pg_basebackup.c:1651 +#: pg_basebackup.c:1451 #, c-format -msgid "could not create symbolic link from \"%s\" to \"%s\": %m" -msgstr "\"%s\"から\"%s\"へのシンボリックリンクを作成できませんでした: %m" +msgid "unexpected payload data" +msgstr "予期しないペイロードのデータ" -#: pg_basebackup.c:1658 +#: pg_basebackup.c:1594 #, c-format -msgid "unrecognized link indicator \"%c\"" -msgstr "リンク指示子\"%c\"を認識できません" +msgid "empty COPY message" +msgstr "空のCOPYメッセージ" -#: pg_basebackup.c:1677 +#: pg_basebackup.c:1596 #, c-format -msgid "could not set permissions on file \"%s\": %m" -msgstr "ファイル\"%s\"の権限を設定できませんでした: %m" +msgid "malformed COPY message of type %d, length %zu" +msgstr "タイプ%d、長さ%zuのCOPYメッセージのフォーマット異常" -#: pg_basebackup.c:1831 +#: pg_basebackup.c:1794 #, c-format msgid "incompatible server version %s" msgstr "非互換のサーババージョン \"%s\"" -#: pg_basebackup.c:1846 +#: pg_basebackup.c:1810 #, c-format msgid "HINT: use -X none or -X fetch to disable log streaming" msgstr "ヒント: -X none または -X fetch でログストリーミングを無効にできます" -#: pg_basebackup.c:1882 +#: pg_basebackup.c:1878 +#, c-format +msgid "backup targets are not supported by this server version" +msgstr "バックアップターゲットはこのサーババージョンではサポートされません" + +#: pg_basebackup.c:1881 +#, c-format +msgid "recovery configuration cannot be written when a backup target is used" +msgstr "バックアップターゲットが使用されている場合にはリカバリ設定は出力できません" + +#: pg_basebackup.c:1908 +#, c-format +msgid "server does not support server-side compression" +msgstr "サーバーはサーバーサイド圧縮をサポートしていません" + +#: pg_basebackup.c:1918 #, c-format msgid "initiating base backup, waiting for checkpoint to complete" msgstr "ベースバックアップを開始しています - チェックポイントの完了を待機中" -#: pg_basebackup.c:1908 pg_recvlogical.c:262 receivelog.c:481 receivelog.c:530 -#: receivelog.c:569 streamutil.c:297 streamutil.c:370 streamutil.c:422 -#: streamutil.c:533 streamutil.c:578 +#: pg_basebackup.c:1935 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588 +#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504 +#: streamutil.c:656 streamutil.c:701 #, c-format msgid "could not send replication command \"%s\": %s" msgstr "レプリケーションコマンド\"%s\"を送信できませんでした: %s" -#: pg_basebackup.c:1919 +#: pg_basebackup.c:1943 #, c-format msgid "could not initiate base backup: %s" msgstr "ベースバックアップを開始できませんでした: %s" -#: pg_basebackup.c:1925 +#: pg_basebackup.c:1946 #, c-format msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields" msgstr "サーバが BASE_BACKUP コマンドに期待していない応答を返しました; %d行 %d列を受信しましたが期待は %d列 %d行でした" -#: pg_basebackup.c:1933 +#: pg_basebackup.c:1952 #, c-format msgid "checkpoint completed" msgstr "チェックポイントが完了しました" -#: pg_basebackup.c:1948 +#: pg_basebackup.c:1967 #, c-format msgid "write-ahead log start point: %s on timeline %u" msgstr "先行書き込みログの開始ポイント: タイムライン %2$u 上の %1$s" -#: pg_basebackup.c:1957 +#: pg_basebackup.c:1975 #, c-format msgid "could not get backup header: %s" msgstr "バックアップヘッダを取得できませんでした: %s" -#: pg_basebackup.c:1963 +#: pg_basebackup.c:1978 #, c-format msgid "no data returned from server" msgstr "サーバからデータが返されませんでした" -#: pg_basebackup.c:1995 +#: pg_basebackup.c:2013 #, c-format msgid "can only write single tablespace to stdout, database has %d" msgstr "標準出力に書き出せるテーブル空間は1つだけですが、データベースには%d個あります" -#: pg_basebackup.c:2007 +#: pg_basebackup.c:2026 #, c-format msgid "starting background WAL receiver" msgstr "バックグランドWAL受信処理を起動します" -#: pg_basebackup.c:2046 +#: pg_basebackup.c:2109 #, c-format -msgid "could not get write-ahead log end position from server: %s" -msgstr "サーバから先行書き込みログの終了位置を取得できませんでした: %s" +msgid "backup failed: %s" +msgstr "バックアップが失敗しました: %s" -#: pg_basebackup.c:2052 +#: pg_basebackup.c:2112 #, c-format msgid "no write-ahead log end position returned from server" msgstr "サーバから先行書き込みログの終了位置が返されませんでした" -#: pg_basebackup.c:2057 +#: pg_basebackup.c:2115 #, c-format msgid "write-ahead log end point: %s" msgstr "先行書き込みログの終了ポイント: %s" -#: pg_basebackup.c:2068 +#: pg_basebackup.c:2126 #, c-format msgid "checksum error occurred" msgstr "チェックサムエラーが発生しました" -#: pg_basebackup.c:2073 +#: pg_basebackup.c:2131 #, c-format msgid "final receive failed: %s" msgstr "終端の受信に失敗しました: %s" -#: pg_basebackup.c:2097 +#: pg_basebackup.c:2155 #, c-format msgid "waiting for background process to finish streaming ..." msgstr "バックグランドプロセスがストリーミング処理が終わるまで待機します ..." -#: pg_basebackup.c:2102 +#: pg_basebackup.c:2159 #, c-format msgid "could not send command to background pipe: %m" msgstr "バックグランドへのパイプにコマンドを送信できませんでした: %m" -#: pg_basebackup.c:2110 +#: pg_basebackup.c:2164 #, c-format msgid "could not wait for child process: %m" msgstr "子プロセスの待機ができませんでした: %m" -#: pg_basebackup.c:2115 +#: pg_basebackup.c:2166 #, c-format msgid "child %d died, expected %d" msgstr "子プロセス %d が終了しましたが、期待していたのは %d でした" -#: pg_basebackup.c:2120 streamutil.c:92 +#: pg_basebackup.c:2168 streamutil.c:91 streamutil.c:197 #, c-format msgid "%s" msgstr "%s" -#: pg_basebackup.c:2145 +#: pg_basebackup.c:2188 #, c-format msgid "could not wait for child thread: %m" msgstr "子スレッドの待機ができませんでした: %m" -#: pg_basebackup.c:2151 +#: pg_basebackup.c:2193 #, c-format msgid "could not get child thread exit status: %m" msgstr "子スレッドの終了ステータスを取得できませんでした: %m" -#: pg_basebackup.c:2156 +#: pg_basebackup.c:2196 #, c-format msgid "child thread exited with error %u" msgstr "子スレッドがエラー%uで終了しました" -#: pg_basebackup.c:2184 +#: pg_basebackup.c:2225 #, c-format msgid "syncing data to disk ..." msgstr "データをディスクに同期しています..." -#: pg_basebackup.c:2209 +#: pg_basebackup.c:2250 #, c-format msgid "renaming backup_manifest.tmp to backup_manifest" msgstr "backup_manifest.tmp の名前を backup_manifest に変更してください" -#: pg_basebackup.c:2220 +#: pg_basebackup.c:2270 #, c-format msgid "base backup completed" msgstr "ベースバックアップが完了しました" -#: pg_basebackup.c:2305 +#: pg_basebackup.c:2359 #, c-format msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"" msgstr "不正な出力フォーマット\"%s\"、\"plain\"か\"tar\"でなければなりません" -#: pg_basebackup.c:2349 +#: pg_basebackup.c:2403 #, c-format msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"" msgstr "不正な wal-method オプション\"%s\"、\"fetch\"、\"stream\" または \"none\" のいずれかでなければなりません" -#: pg_basebackup.c:2377 pg_receivewal.c:580 -#, c-format -msgid "invalid compression level \"%s\"" -msgstr "無効な圧縮レベル \"%s\"" - -#: pg_basebackup.c:2388 +#: pg_basebackup.c:2433 #, c-format msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" msgstr "不正な checkpoint の引数\"%s\"、\"fast\" または \"spreadでなければなりません" -#: pg_basebackup.c:2415 pg_receivewal.c:555 pg_recvlogical.c:820 -#, c-format -msgid "invalid status interval \"%s\"" -msgstr "不正な status-interval \"%s\"" - -#: pg_basebackup.c:2445 pg_basebackup.c:2458 pg_basebackup.c:2469 -#: pg_basebackup.c:2480 pg_basebackup.c:2488 pg_basebackup.c:2496 -#: pg_basebackup.c:2506 pg_basebackup.c:2519 pg_basebackup.c:2528 -#: pg_basebackup.c:2539 pg_basebackup.c:2549 pg_basebackup.c:2567 -#: pg_basebackup.c:2576 pg_basebackup.c:2585 pg_receivewal.c:605 -#: pg_receivewal.c:618 pg_receivewal.c:626 pg_receivewal.c:636 -#: pg_receivewal.c:644 pg_receivewal.c:655 pg_recvlogical.c:846 -#: pg_recvlogical.c:859 pg_recvlogical.c:870 pg_recvlogical.c:878 -#: pg_recvlogical.c:886 pg_recvlogical.c:894 pg_recvlogical.c:902 -#: pg_recvlogical.c:910 pg_recvlogical.c:918 +#: pg_basebackup.c:2484 pg_basebackup.c:2496 pg_basebackup.c:2518 +#: pg_basebackup.c:2530 pg_basebackup.c:2536 pg_basebackup.c:2588 +#: pg_basebackup.c:2599 pg_basebackup.c:2609 pg_basebackup.c:2615 +#: pg_basebackup.c:2622 pg_basebackup.c:2634 pg_basebackup.c:2646 +#: pg_basebackup.c:2654 pg_basebackup.c:2667 pg_basebackup.c:2673 +#: pg_basebackup.c:2682 pg_basebackup.c:2694 pg_basebackup.c:2705 +#: pg_basebackup.c:2713 pg_receivewal.c:816 pg_receivewal.c:828 +#: pg_receivewal.c:835 pg_receivewal.c:844 pg_receivewal.c:851 +#: pg_receivewal.c:861 pg_recvlogical.c:837 pg_recvlogical.c:849 +#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873 +#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894 +#: pg_recvlogical.c:901 pg_recvlogical.c:908 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "詳細は\"%s --help\"で確認してください。\n" +msgid "Try \"%s --help\" for more information." +msgstr "詳細は\"%s --help\"を実行してください。" -#: pg_basebackup.c:2456 pg_receivewal.c:616 pg_recvlogical.c:857 +#: pg_basebackup.c:2494 pg_receivewal.c:826 pg_recvlogical.c:847 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数が多過ぎます(先頭は\"%s\"です)" -#: pg_basebackup.c:2468 pg_receivewal.c:654 +#: pg_basebackup.c:2517 #, c-format -msgid "no target directory specified" -msgstr "格納先ディレクトリが指定されていません" +msgid "cannot specify both format and backup target" +msgstr "フォーマットとバックアップターゲットの両方を同時には指定できません" + +#: pg_basebackup.c:2529 +#, c-format +msgid "must specify output directory or backup target" +msgstr "出力ディレクトリかバックアップターゲットを指定する必要があります" + +#: pg_basebackup.c:2535 +#, c-format +msgid "cannot specify both output directory and backup target" +msgstr "出力先ディレクトリとバックアップターゲットの両方を同時には指定できません" -#: pg_basebackup.c:2479 +#: pg_basebackup.c:2565 pg_receivewal.c:870 +#, c-format +msgid "unrecognized compression algorithm \"%s\"" +msgstr "認識できない圧縮アルゴリズム: \"%s\"" + +#: pg_basebackup.c:2571 pg_receivewal.c:877 +#, c-format +msgid "invalid compression specification: %s" +msgstr "不正な圧縮指定: %s" + +#: pg_basebackup.c:2587 +#, c-format +msgid "client-side compression is not possible when a backup target is specified" +msgstr "バックアップターゲットが指定されているとクライアントサイド圧縮はできません" + +#: pg_basebackup.c:2598 #, c-format msgid "only tar mode backups can be compressed" msgstr "tarモードでのバックアップのみが圧縮可能です" -#: pg_basebackup.c:2487 +#: pg_basebackup.c:2608 +#, c-format +msgid "WAL cannot be streamed when a backup target is specified" +msgstr "バックアップターゲット指定されているとWALはストリーム出力できません" + +#: pg_basebackup.c:2614 #, c-format msgid "cannot stream write-ahead logs in tar mode to stdout" msgstr "標準出力への tar モードでは書き込み先行ログをストリーム出力できません" -#: pg_basebackup.c:2495 +#: pg_basebackup.c:2621 #, c-format msgid "replication slots can only be used with WAL streaming" msgstr "レプリケーションスロットはWALストリーミングでのみ使用可能です" -#: pg_basebackup.c:2505 +#: pg_basebackup.c:2633 #, c-format msgid "--no-slot cannot be used with slot name" msgstr "--no-slot はスロット名と同時には指定できません" #. translator: second %s is an option name -#: pg_basebackup.c:2517 pg_receivewal.c:634 +#: pg_basebackup.c:2644 pg_receivewal.c:842 #, c-format msgid "%s needs a slot to be specified using --slot" msgstr "%s は --slot でスロットを指定する必要があります" -#: pg_basebackup.c:2526 pg_basebackup.c:2565 pg_basebackup.c:2574 -#: pg_basebackup.c:2583 +#: pg_basebackup.c:2652 pg_basebackup.c:2692 pg_basebackup.c:2703 +#: pg_basebackup.c:2711 #, c-format msgid "%s and %s are incompatible options" msgstr "%s と %s は非互換なオプションです" -#: pg_basebackup.c:2538 +#: pg_basebackup.c:2666 +#, c-format +msgid "WAL directory location cannot be specified along with a backup target" +msgstr "WALディレクトリの位置はバックアップターゲットと同時には指定できません" + +#: pg_basebackup.c:2672 #, c-format msgid "WAL directory location can only be specified in plain mode" msgstr "WALディレクトリの位置は plainモードでのみ指定可能です" -#: pg_basebackup.c:2548 +#: pg_basebackup.c:2681 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WALディレクトリの位置は、絶対パスでなければなりません" -#: pg_basebackup.c:2558 pg_receivewal.c:663 -#, c-format -msgid "this build does not support compression" -msgstr "このビルドでは圧縮をサポートしていません" - -#: pg_basebackup.c:2643 +#: pg_basebackup.c:2781 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を作成できませんでした: %m" -#: pg_basebackup.c:2647 +#: pg_basebackup.c:2783 #, c-format msgid "symlinks are not supported on this platform" msgstr "このプラットフォームでシンボリックリンクはサポートされていません" -#: pg_receivewal.c:77 +#: pg_receivewal.c:79 #, c-format msgid "" "%s receives PostgreSQL streaming write-ahead logs.\n" @@ -869,7 +1134,7 @@ msgstr "" "%sはPostgreSQLの先行書き込みログストリームを受信します。\n" "\n" -#: pg_receivewal.c:81 pg_recvlogical.c:81 +#: pg_receivewal.c:83 pg_recvlogical.c:84 #, c-format msgid "" "\n" @@ -878,32 +1143,32 @@ msgstr "" "\n" "オプション:\n" -#: pg_receivewal.c:82 +#: pg_receivewal.c:84 #, c-format msgid " -D, --directory=DIR receive write-ahead log files into this directory\n" msgstr " -D, --directory=DIR 受信した先行書き込みログの格納ディレクトリ\n" -#: pg_receivewal.c:83 pg_recvlogical.c:82 +#: pg_receivewal.c:85 pg_recvlogical.c:85 #, c-format msgid " -E, --endpos=LSN exit after receiving the specified LSN\n" msgstr " -E, --endpos=LSN 指定したLSNの受信後に終了\n" -#: pg_receivewal.c:84 pg_recvlogical.c:86 +#: pg_receivewal.c:86 pg_recvlogical.c:89 #, c-format msgid " --if-not-exists do not error if slot already exists when creating a slot\n" msgstr "   --if-not-exists スロットの作成時に既に存在していてもエラーとしない\n" -#: pg_receivewal.c:85 pg_recvlogical.c:88 +#: pg_receivewal.c:87 pg_recvlogical.c:91 #, c-format msgid " -n, --no-loop do not loop on connection lost\n" msgstr " -n, --no-loop 接続断の際にループしない\n" -#: pg_receivewal.c:86 +#: pg_receivewal.c:88 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync ディスクへの安全な書き込みの待機を行わない\n" -#: pg_receivewal.c:87 pg_recvlogical.c:93 +#: pg_receivewal.c:89 pg_recvlogical.c:96 #, c-format msgid "" " -s, --status-interval=SECS\n" @@ -913,17 +1178,21 @@ msgstr "" " サーバへ送出するステータスパケットの間隔\n" " (デフォルト: %d)\n" -#: pg_receivewal.c:90 +#: pg_receivewal.c:92 #, c-format msgid " --synchronous flush write-ahead log immediately after writing\n" msgstr " --synchronous 先行書き込みログを書き込み後直ちにフラッシュ\n" -#: pg_receivewal.c:93 +#: pg_receivewal.c:95 #, c-format -msgid " -Z, --compress=0-9 compress logs with given compression level\n" -msgstr " -Z, --compress=0-9 指定した圧縮レベルでログを圧縮\n" +msgid "" +" -Z, --compress=METHOD[:DETAIL]\n" +" compress as specified\n" +msgstr "" +" -Z, --compress=方式[:詳細]\n" +" 指定のとおり圧縮\n" -#: pg_receivewal.c:102 +#: pg_receivewal.c:105 #, c-format msgid "" "\n" @@ -932,127 +1201,177 @@ msgstr "" "\n" "追加の動作:\n" -#: pg_receivewal.c:103 pg_recvlogical.c:78 +#: pg_receivewal.c:106 pg_recvlogical.c:81 #, c-format msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n" msgstr "" " --create-slot 新しいレプリケーションスロットを作成する\n" " (スロット名については --slot を参照)\n" -#: pg_receivewal.c:104 pg_recvlogical.c:79 +#: pg_receivewal.c:107 pg_recvlogical.c:82 #, c-format msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n" msgstr "" " --drop-slot レプリケーションスロットを削除する\n" " (スロット名については --slot を参照)\n" -#: pg_receivewal.c:117 +#: pg_receivewal.c:252 #, c-format msgid "finished segment at %X/%X (timeline %u)" msgstr "%X/%X (タイムライン %u)でセグメントが完了" -#: pg_receivewal.c:124 +#: pg_receivewal.c:259 #, c-format msgid "stopped log streaming at %X/%X (timeline %u)" msgstr "%X/%X (タイムライン %u)でログのストリーミングを停止しました" -#: pg_receivewal.c:140 +#: pg_receivewal.c:275 #, c-format msgid "switched to timeline %u at %X/%X" msgstr "%3$X/%2$Xで タイムライン%1$uに切り替えました" -#: pg_receivewal.c:150 +#: pg_receivewal.c:285 #, c-format msgid "received interrupt signal, exiting" msgstr "割り込みシグナルを受信、終了します" -#: pg_receivewal.c:186 +#: pg_receivewal.c:317 #, c-format msgid "could not close directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m" -#: pg_receivewal.c:272 +#: pg_receivewal.c:384 #, c-format -msgid "segment file \"%s\" has incorrect size %d, skipping" -msgstr "セグメントファイル\"%s\"のサイズ %d が不正です、スキップします" +msgid "segment file \"%s\" has incorrect size %lld, skipping" +msgstr "セグメントファイル\"%s\"のサイズ%lldが間違っています、スキップします" -#: pg_receivewal.c:290 +#: pg_receivewal.c:401 #, c-format msgid "could not open compressed file \"%s\": %m" msgstr "圧縮ファイル\"%s\"を開けませんでした: %m" -#: pg_receivewal.c:296 +#: pg_receivewal.c:404 #, c-format msgid "could not seek in compressed file \"%s\": %m" msgstr "圧縮ファイル\"%s\"でseekできませんでした: %m" -#: pg_receivewal.c:304 +#: pg_receivewal.c:410 #, c-format msgid "could not read compressed file \"%s\": %m" msgstr "圧縮ファイル\"%s\"を読めませんでした: %m" -#: pg_receivewal.c:307 +#: pg_receivewal.c:413 #, c-format msgid "could not read compressed file \"%s\": read %d of %zu" msgstr "圧縮ファイル\"%1$s\"を読めませんでした: %3$zuバイトのうち%2$dバイトを読み込み済み" -#: pg_receivewal.c:318 +#: pg_receivewal.c:423 #, c-format msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping" msgstr "圧縮セグメントファイル\"%s\"の展開後サイズ%dが不正です、スキップします" -#: pg_receivewal.c:422 +#: pg_receivewal.c:451 #, c-format -msgid "starting log streaming at %X/%X (timeline %u)" -msgstr "%X/%X (タイムライン %u)からログのストリーミングを開始" +msgid "could not create LZ4 decompression context: %s" +msgstr "LZ4伸張コンテキストを作成できませんでした: %s" + +#: pg_receivewal.c:463 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ファイル\"%s\"の読み取りに失敗しました: %m" + +#: pg_receivewal.c:481 +#, c-format +msgid "could not decompress file \"%s\": %s" +msgstr "ファイル\"%s\"を伸張できませんでした: %s" + +#: pg_receivewal.c:504 +#, c-format +msgid "could not free LZ4 decompression context: %s" +msgstr "LZ4伸張コンテクストを解放きませんでした: %s" + +#: pg_receivewal.c:509 +#, c-format +msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping" +msgstr "圧縮セグメントファイル\"%s\"の伸張後のサイズ%zuが不正です、スキップします" -#: pg_receivewal.c:537 pg_recvlogical.c:762 +#: pg_receivewal.c:514 #, c-format -msgid "invalid port number \"%s\"" -msgstr "不正なポート番号: \"%s\"" +msgid "could not check file \"%s\"" +msgstr "ファイル\"%s\"を検証できませんでした" -#: pg_receivewal.c:565 pg_recvlogical.c:788 +#: pg_receivewal.c:516 +#, c-format +msgid "This build does not support compression with %s." +msgstr "このビルドでは%sによる圧縮をサポートしていません。" + +#: pg_receivewal.c:643 +#, c-format +msgid "starting log streaming at %X/%X (timeline %u)" +msgstr "%X/%X (タイムライン %u)からログのストリーミングを開始" + +#: pg_receivewal.c:785 pg_recvlogical.c:785 #, c-format msgid "could not parse end position \"%s\"" msgstr "終了位置\"%s\"をパースできませんでした" -#: pg_receivewal.c:625 +#: pg_receivewal.c:834 #, c-format msgid "cannot use --create-slot together with --drop-slot" msgstr "--create-slot は --drop-slot と同時には指定できません" -#: pg_receivewal.c:643 +#: pg_receivewal.c:850 #, c-format msgid "cannot use --synchronous together with --no-sync" msgstr "--synchronous は --no-sync と同時には指定できません" -#: pg_receivewal.c:719 +#: pg_receivewal.c:860 +#, c-format +msgid "no target directory specified" +msgstr "格納先ディレクトリが指定されていません" + +#: pg_receivewal.c:893 +#, c-format +msgid "no value specified for --compress, switching to default" +msgstr "--compressに値が指定されていません、デフォルトに切り替えます" + +#: pg_receivewal.c:897 pg_receivewal.c:903 +#, c-format +msgid "this build does not support compression with %s" +msgstr "このビルドでは%sによる圧縮をサポートしていません" + +#: pg_receivewal.c:908 +#, c-format +msgid "compression with %s is not yet supported" +msgstr "%sによる圧縮`まだサポートされていません" + +#: pg_receivewal.c:953 #, c-format msgid "replication connection using slot \"%s\" is unexpectedly database specific" msgstr "スロット\"%s\"を使用するレプリケーション接続で、想定に反してデータベースが指定されています" -#: pg_receivewal.c:730 pg_recvlogical.c:966 +#: pg_receivewal.c:972 pg_recvlogical.c:955 #, c-format msgid "dropping replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"を削除しています" -#: pg_receivewal.c:741 pg_recvlogical.c:976 +#: pg_receivewal.c:983 pg_recvlogical.c:965 #, c-format msgid "creating replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"を作成しています" -#: pg_receivewal.c:767 pg_recvlogical.c:1001 +#: pg_receivewal.c:1012 pg_recvlogical.c:989 #, c-format msgid "disconnected" msgstr "切断しました" #. translator: check source for value for %d -#: pg_receivewal.c:773 pg_recvlogical.c:1007 +#: pg_receivewal.c:1016 pg_recvlogical.c:993 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "切断しました; %d秒待機して再試行します" -#: pg_recvlogical.c:73 +#: pg_recvlogical.c:76 #, c-format msgid "" "%s controls PostgreSQL logical decoding streams.\n" @@ -1061,7 +1380,7 @@ msgstr "" "%s はPostgreSQLの論理デコードストリームを制御します。\n" "\n" -#: pg_recvlogical.c:77 +#: pg_recvlogical.c:80 #, c-format msgid "" "\n" @@ -1070,19 +1389,19 @@ msgstr "" "\n" "実行する動作:\n" -#: pg_recvlogical.c:80 +#: pg_recvlogical.c:83 #, c-format msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n" msgstr "" " --start レプリケーションスロットでストリーミングを開始する\n" " (スロット名については --slot を参照)\n" -#: pg_recvlogical.c:83 +#: pg_recvlogical.c:86 #, c-format msgid " -f, --file=FILE receive log into this file, - for stdout\n" msgstr " -f, --file=FILE このファイルにログを受け取る、 - で標準出力\n" -#: pg_recvlogical.c:84 +#: pg_recvlogical.c:87 #, c-format msgid "" " -F --fsync-interval=SECS\n" @@ -1091,12 +1410,12 @@ msgstr "" " -F --fsync-interval=SECS\n" " 出力ファイルへのfsync時間間隔(デフォルト: %d)\n" -#: pg_recvlogical.c:87 +#: pg_recvlogical.c:90 #, c-format msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n" msgstr " -I, --startpos=LSN 既存スロット内のストリーミング開始位置\n" -#: pg_recvlogical.c:89 +#: pg_recvlogical.c:92 #, c-format msgid "" " -o, --option=NAME[=VALUE]\n" @@ -1107,32 +1426,37 @@ msgstr "" " 出力プラグインにオプションNAMEをオプション値VALUEと\n" " ともに渡す\n" -#: pg_recvlogical.c:92 +#: pg_recvlogical.c:95 #, c-format msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n" msgstr " -P, --plugin=PLUGIN 出力プラグインPLUGINを使う(デフォルト: %s)\n" -#: pg_recvlogical.c:95 +#: pg_recvlogical.c:98 #, c-format msgid " -S, --slot=SLOTNAME name of the logical replication slot\n" msgstr " -S, --slot=SLOTNAME 論理レプリケーションスロットの名前\n" -#: pg_recvlogical.c:100 +#: pg_recvlogical.c:99 +#, c-format +msgid " -t, --two-phase enable two-phase decoding when creating a slot\n" +msgstr " -t, --two-phase スロット作成時に2相デコードを有効にする\n" + +#: pg_recvlogical.c:104 #, c-format msgid " -d, --dbname=DBNAME database to connect to\n" msgstr " -d, --dbname=DBNAME 接続先データベース\n" -#: pg_recvlogical.c:133 +#: pg_recvlogical.c:137 #, c-format msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)" msgstr "PrecPpg%X/%Xまでの書き込みと、%X/%X (スロット %s)までのフラッシュを確認しています" -#: pg_recvlogical.c:157 receivelog.c:343 +#: pg_recvlogical.c:161 receivelog.c:366 #, c-format msgid "could not send feedback packet: %s" msgstr "フィードバックパケットを送信できませんでした: %s" -#: pg_recvlogical.c:230 +#: pg_recvlogical.c:229 #, c-format msgid "starting log streaming at %X/%X (slot %s)" msgstr "%X/%X (スロット %s)からログのストリーミングを開始します" @@ -1147,422 +1471,352 @@ msgstr "ストリーミングを開始しました" msgid "could not open log file \"%s\": %m" msgstr "ロックファイル\"%s\"をオープンできませんでした: %m" -#: pg_recvlogical.c:361 receivelog.c:873 +#: pg_recvlogical.c:364 receivelog.c:889 #, c-format msgid "invalid socket: %s" msgstr "無効なソケット: %s" -#: pg_recvlogical.c:414 receivelog.c:901 +#: pg_recvlogical.c:417 receivelog.c:917 #, c-format -msgid "select() failed: %m" -msgstr "select()が失敗しました: %m" +msgid "%s() failed: %m" +msgstr "%s() が失敗しました: %m" -#: pg_recvlogical.c:421 receivelog.c:951 +#: pg_recvlogical.c:424 receivelog.c:967 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "WAL ストリームからデータを受信できませんでした: %s" -#: pg_recvlogical.c:463 pg_recvlogical.c:514 receivelog.c:995 receivelog.c:1061 +#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011 +#: receivelog.c:1074 #, c-format msgid "streaming header too small: %d" msgstr "ストリーミングヘッダが小さ過ぎます: %d" -#: pg_recvlogical.c:498 receivelog.c:833 +#: pg_recvlogical.c:501 receivelog.c:849 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "ストリーミングヘッダを認識できませんでした: \"%c\"" -#: pg_recvlogical.c:552 pg_recvlogical.c:564 +#: pg_recvlogical.c:555 pg_recvlogical.c:567 #, c-format -msgid "could not write %u bytes to log file \"%s\": %m" -msgstr "%u バイトをログファイル\"%s\"に書き込めませんでした: %m" +msgid "could not write %d bytes to log file \"%s\": %m" +msgstr "%dバイトをログファイル\"%s\"に書き込めませんでした: %m" -#: pg_recvlogical.c:618 receivelog.c:629 receivelog.c:666 +#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "レプリケーションストリームが突然終了しました: %s" -#: pg_recvlogical.c:742 -#, c-format -msgid "invalid fsync interval \"%s\"" -msgstr "不正なfsync間隔 \"%s\"" - #: pg_recvlogical.c:780 #, c-format msgid "could not parse start position \"%s\"" msgstr "開始位置\"%s\"をパースできませんでした" -#: pg_recvlogical.c:869 +#: pg_recvlogical.c:858 #, c-format msgid "no slot specified" msgstr "スロットが指定されていません" -#: pg_recvlogical.c:877 +#: pg_recvlogical.c:865 #, c-format msgid "no target file specified" msgstr "ターゲットファイルが指定されていません" -#: pg_recvlogical.c:885 +#: pg_recvlogical.c:872 #, c-format msgid "no database specified" msgstr "データベースが指定されていません" -#: pg_recvlogical.c:893 +#: pg_recvlogical.c:879 #, c-format msgid "at least one action needs to be specified" msgstr "少なくとも一つのアクションを指定する必要があります" -#: pg_recvlogical.c:901 +#: pg_recvlogical.c:886 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "--create-slot や --start は --drop-slot と同時には指定できません" -#: pg_recvlogical.c:909 +#: pg_recvlogical.c:893 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "--create-slot や --drop-slot は --startpos と同時には指定できません" -#: pg_recvlogical.c:917 +#: pg_recvlogical.c:900 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos は --start が指定されているときにのみ指定可能です" -#: pg_recvlogical.c:948 +#: pg_recvlogical.c:907 +#, c-format +msgid "--two-phase may only be specified with --create-slot" +msgstr "--two-phaseは--create-slotが指定されているときにのみ指定可能です" + +#: pg_recvlogical.c:939 #, c-format msgid "could not establish database-specific replication connection" msgstr "データベース指定のレプリケーション接続が確立できませんでした" -#: pg_recvlogical.c:1047 +#: pg_recvlogical.c:1033 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "キープアライブで終了位置 %X/%X に到達しました " -#: pg_recvlogical.c:1050 +#: pg_recvlogical.c:1036 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "%X/%X のWALレコードで終了位置 %X/%X に到達しました" -#: receivelog.c:69 +#: receivelog.c:68 #, c-format msgid "could not create archive status file \"%s\": %s" msgstr "アーカイブステータスファイル\"%s\"を作成できませんでした: %s" -#: receivelog.c:116 +#: receivelog.c:75 +#, c-format +msgid "could not close archive status file \"%s\": %s" +msgstr "アーカイブステータスファイル\"%s\"をクローズできませんでした: %s" + +#: receivelog.c:123 #, c-format msgid "could not get size of write-ahead log file \"%s\": %s" msgstr "先行書き込みログファイル\"%s\"のサイズを取得できませんでした: %s" -#: receivelog.c:126 +#: receivelog.c:134 #, c-format msgid "could not open existing write-ahead log file \"%s\": %s" msgstr "既存の先行書き込みログファイル\"%s\"をオープンできませんでした: %s" -#: receivelog.c:134 +#: receivelog.c:143 #, c-format msgid "could not fsync existing write-ahead log file \"%s\": %s" msgstr "既存の先行書き込みログファイル\"%s\"をfsyncできませんでした: %s" -#: receivelog.c:148 +#: receivelog.c:158 #, c-format -msgid "write-ahead log file \"%s\" has %d byte, should be 0 or %d" -msgid_plural "write-ahead log file \"%s\" has %d bytes, should be 0 or %d" -msgstr[0] "先行書き込みログファイル\"%s\"は%dバイトですが、0または%dであるはずです" +msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d" +msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d" +msgstr[0] "先行書き込みログファイル\"%s\"は%zdバイトですが、0または%dであるはずです" -#: receivelog.c:163 +#: receivelog.c:174 #, c-format msgid "could not open write-ahead log file \"%s\": %s" msgstr "先行書き込みログファイル\"%s\"をオープンできませんでした: %s" -#: receivelog.c:189 +#: receivelog.c:208 #, c-format msgid "could not determine seek position in file \"%s\": %s" msgstr "ファイル\"%s\"のシーク位置を取得できませんでした: %s" -#: receivelog.c:203 +#: receivelog.c:223 #, c-format -msgid "not renaming \"%s%s\", segment is not complete" -msgstr "\"%s%s\"の名前を変更しません、セグメントが完全ではありません" +msgid "not renaming \"%s\", segment is not complete" +msgstr "\"%s\"の名前を変更しません、セグメントが完成していません" -#: receivelog.c:215 receivelog.c:300 receivelog.c:675 +#: receivelog.c:234 receivelog.c:323 receivelog.c:694 #, c-format msgid "could not close file \"%s\": %s" msgstr "ファイル\"%s\"をクローズできませんでした: %s" -#: receivelog.c:272 +#: receivelog.c:295 #, c-format msgid "server reported unexpected history file name for timeline %u: %s" msgstr "サーバがタイムライン%uに対する想定外の履歴ファイル名を通知してきました: %s" -#: receivelog.c:280 +#: receivelog.c:303 #, c-format msgid "could not create timeline history file \"%s\": %s" msgstr "タイムライン履歴ファイル\"%s\"を作成できませんでした: %s" -#: receivelog.c:287 +#: receivelog.c:310 #, c-format msgid "could not write timeline history file \"%s\": %s" msgstr "タイムライン履歴ファイル\"%s\"に書き込めませんでした: %s" -#: receivelog.c:377 +#: receivelog.c:400 #, c-format msgid "incompatible server version %s; client does not support streaming from server versions older than %s" msgstr "非互換のサーババージョン%s、クライアントは%sより古いサーババージョンからのストリーミングをサポートしていません" -#: receivelog.c:386 +#: receivelog.c:409 #, c-format msgid "incompatible server version %s; client does not support streaming from server versions newer than %s" msgstr "非互換のサーババージョン%s、クライアントは%sより新しいサーババージョンからのストリーミングをサポートしていません" -#: receivelog.c:488 streamutil.c:430 streamutil.c:467 -#, c-format -msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" -msgstr "システムを識別できませんでした: 受信したのは%d行%d列、想定は%d行%d列以上" - -#: receivelog.c:495 +#: receivelog.c:514 #, c-format msgid "system identifier does not match between base backup and streaming connection" msgstr "システム識別子がベースバックアップとストリーミング接続の間で一致しません" -#: receivelog.c:501 +#: receivelog.c:522 #, c-format msgid "starting timeline %u is not present in the server" msgstr "開始タイムライン%uがサーバに存在しません" -#: receivelog.c:542 +#: receivelog.c:561 #, c-format msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields" msgstr "TIMELINE_HISTORYコマンドへの想定外の応答: 受信したのは%d行%d列、想定は%d行%d列" -#: receivelog.c:613 +#: receivelog.c:632 #, c-format msgid "server reported unexpected next timeline %u, following timeline %u" msgstr "サーバがタイムライン%2$uに続いて想定外のタイムライン%1$uを通知してきました" -#: receivelog.c:619 +#: receivelog.c:638 #, c-format msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X" msgstr "サーバはタイムライン%uのストリーミングを%X/%Xで停止しました、しかし次のタイムライン%uが%X/%Xから開始すると通知してきています" -#: receivelog.c:659 +#: receivelog.c:678 #, c-format msgid "replication stream was terminated before stop point" msgstr "レプリケーションストリームが停止ポイントより前で終了しました" -#: receivelog.c:705 +#: receivelog.c:724 #, c-format msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields" msgstr "タイムライン終了後に想定外の結果セット: 受信したのは%d行%d列、想定は%d行%d列" -#: receivelog.c:714 +#: receivelog.c:733 #, c-format msgid "could not parse next timeline's starting point \"%s\"" msgstr "次のタイムラインの開始ポイント\"%s\"をパースできませんでした" -#: receivelog.c:763 receivelog.c:1015 +#: receivelog.c:781 receivelog.c:1030 walmethods.c:1203 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "ファイル\"%s\"をfsyncできませんでした: %s" -#: receivelog.c:1078 +#: receivelog.c:1091 #, c-format msgid "received write-ahead log record for offset %u with no file open" msgstr "ファイルがオープンされていない状態で、オフセット%uに対する先行書き込みログレコードを受信しました" -#: receivelog.c:1088 +#: receivelog.c:1101 #, c-format msgid "got WAL data offset %08x, expected %08x" msgstr "WALデータオフセット%08xを受信、想定は%08x" -#: receivelog.c:1122 +#: receivelog.c:1135 #, c-format -msgid "could not write %u bytes to WAL file \"%s\": %s" -msgstr "WALファイル\"%2$s\"に%1$uバイト書き込めませんでした: %3$s" +msgid "could not write %d bytes to WAL file \"%s\": %s" +msgstr "WALファイル\"%2$s\"に%1$dバイト書き込めませんでした: %3$s" -#: receivelog.c:1147 receivelog.c:1187 receivelog.c:1218 +#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230 #, c-format msgid "could not send copy-end packet: %s" msgstr "コピー終端パケットを送信できませんでした: %s" -#: streamutil.c:160 +#: streamutil.c:159 msgid "Password: " msgstr "パスワード: " -#: streamutil.c:185 +#: streamutil.c:182 #, c-format msgid "could not connect to server" msgstr "サーバに接続できませんでした" -#: streamutil.c:202 -#, c-format -msgid "could not connect to server: %s" -msgstr "サーバに接続できませんでした: %s" - -#: streamutil.c:231 +#: streamutil.c:225 #, c-format msgid "could not clear search_path: %s" msgstr "search_pathを消去できませんでした: %s" -#: streamutil.c:247 +#: streamutil.c:241 #, c-format msgid "could not determine server setting for integer_datetimes" msgstr "integer_datetimesのサーバ設定を取得できませんでした" -#: streamutil.c:254 +#: streamutil.c:248 #, c-format msgid "integer_datetimes compile flag does not match server" msgstr "integer_datetimesコンパイル時フラグがサーバと一致しません" -#: streamutil.c:305 +#: streamutil.c:299 #, c-format msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "WALセグメントサイズを取得できませんでした: 受信したのは%d行で%d列、想定は%d行で%d列以上" -#: streamutil.c:315 +#: streamutil.c:309 #, c-format msgid "WAL segment size could not be parsed" msgstr "WALセグメントサイズがパースできませんでした" -#: streamutil.c:333 +#: streamutil.c:327 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes" msgstr[0] "WALセグメントのサイズ指定は1MBと1GBの間の2の累乗でなければなりません、しかし対向サーバは%dバイトと報告してきました" -#: streamutil.c:378 +#: streamutil.c:372 #, c-format msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "グループアクセスフラグを取得できませんでした: 受信したのは%d行で%d列、想定は%d行で%d列以上" -#: streamutil.c:387 +#: streamutil.c:381 #, c-format msgid "group access flag could not be parsed: %s" msgstr "グループアクセスフラグがパースできませんでした: %s" -#: streamutil.c:544 +#: streamutil.c:424 streamutil.c:461 +#, c-format +msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" +msgstr "システムを識別できませんでした: 受信したのは%d行%d列、想定は%d行%d列以上" + +#: streamutil.c:513 +#, c-format +msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" +msgstr "レプリケーションスロット\"%s\"を読み取れませんでした: 受信したのは%d行%d列、想定は%d行%d列" + +#: streamutil.c:525 +#, c-format +msgid "could not find replication slot \"%s\"" +msgstr "レプリケーションスロット\"%s\"がありませんでした" + +#: streamutil.c:536 +#, c-format +msgid "expected a physical replication slot, got type \"%s\" instead" +msgstr "物理レプリケーションスロットが必要ですが、タイプは\"%s\"でした" + +#: streamutil.c:550 +#, c-format +msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" +msgstr "レプリケーションスロット\"%2$s\"のrestart_lsn\"%1$s\"をパースできませんでした" + +#: streamutil.c:667 #, c-format msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "レプリケーションスロット\"%s\"を作成できませんでした: 受信したのは%d行%d列、想定は%d行%d列" -#: streamutil.c:588 +#: streamutil.c:711 #, c-format msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "レプリケーションスロット\"%s\"を削除できませんでした: 受信したのは%d行%d列、想定は%d行%d列" -#: walmethods.c:438 walmethods.c:932 +#: walmethods.c:720 walmethods.c:1265 msgid "could not compress data" msgstr "データを圧縮できませんでした" -#: walmethods.c:470 +#: walmethods.c:749 msgid "could not reset compression stream" msgstr "圧縮ストリームをリセットできませんでした" -#: walmethods.c:568 -msgid "could not initialize compression library" -msgstr "圧縮ライブラリを初期化できませんでした" - -#: walmethods.c:580 +#: walmethods.c:880 msgid "implementation error: tar files can't have more than one open file" msgstr "実装エラー:tar ファイルが複数のオープンされたファイルを保持できません" -#: walmethods.c:594 +#: walmethods.c:894 msgid "could not create tar header" msgstr "tar ヘッダを作成できませんでした" -#: walmethods.c:608 walmethods.c:650 walmethods.c:847 walmethods.c:859 +#: walmethods.c:910 walmethods.c:950 walmethods.c:1169 walmethods.c:1181 msgid "could not change compression parameters" msgstr "圧縮用パラメーターを変更できませんでした" -#: walmethods.c:734 +#: walmethods.c:1054 msgid "unlink not supported with compression" msgstr "圧縮モードにおける unlink はサポートしていません" -#: walmethods.c:957 +#: walmethods.c:1289 msgid "could not close compression stream" msgstr "圧縮ストリームをクローズできませんでした" - -#~ msgid "%s: could not stat file \"%s\": %s\n" -#~ msgstr "%s: \"%s\"ファイルをstatできませんでした: %s\n" - -#~ msgid "%s: could not open directory \"%s\": %s\n" -#~ msgstr "%s: ディレクトリ\"%s\"をオープンできませんでした: %s\n" - -#~ msgid "%s: could not read directory \"%s\": %s\n" -#~ msgstr "%s: ディレクトリ\"%s\"を読み取ることができませんでした。: %s\n" - -#~ msgid "%s: could not open file \"%s\": %s\n" -#~ msgstr "%s: ファイル\"%s\"をオープンできませんでした: %s\n" - -#~ msgid "%s: could not fsync file \"%s\": %s\n" -#~ msgstr "%s: ファイル\"%s\"をfsyncできませんでした: %s\n" - -#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n" -#~ msgstr "%s: ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %s\n" - -#~ msgid "%s: could not create directory \"%s\": %s\n" -#~ msgstr "%s: ディレクトリ \"%s\" を作成できませんでした: %s\n" - -#~ msgid "%s: could not access directory \"%s\": %s\n" -#~ msgstr "%s: ディレクトリ \"%s\" にアクセスできませんでした: %s\n" - -#~ msgid "%s: could not write to file \"%s\": %s\n" -#~ msgstr "%s: ファイル \"%s\" に書き出すことができませんでした: %s\n" - -#~ msgid "%s: could not create file \"%s\": %s\n" -#~ msgstr "%s: ファイル \"%s\" を作成できませんでした: %s\n" - -#~ msgid "%s: could not close file \"%s\": %s\n" -#~ msgstr "%s: ファイル\"%s\"を閉じることができませんでした: %s\n" - -#~ msgid "%s: could not set permissions on directory \"%s\": %s\n" -#~ msgstr "%s: \"%s\"ディレクトリの権限を設定できませんでした: %s\n" - -#~ msgid "%s: could not set permissions on file \"%s\": %s\n" -#~ msgstr "%s: ファイル \"%s\" の権限を設定できませんでした: %s\n" - -#~ msgid "%s: out of memory\n" -#~ msgstr "%s: メモリ不足です\n" - -#~ msgid "%s: child process did not exit normally\n" -#~ msgstr "%s: 子プロセスが正常に終了しませんでした\n" - -#~ msgid "%s: child process exited with error %d\n" -#~ msgstr "%s: 子プロセスが終了コード%dで終了しました\n" - -#~ msgid "%s: could not create symbolic link \"%s\": %s\n" -#~ msgstr "%s: シンボリックリンク\"%s\"を作成できませんでした: %s\n" - -#~ msgid "%s: symlinks are not supported on this platform\n" -#~ msgstr "%s: シンボリックリンクはこのプラットフォームではサポートされていません\n" - -#~ msgid "%s: could not close directory \"%s\": %s\n" -#~ msgstr "%s: ディレクトリ \"%s\" をクローズできませんでした: %s\n" - -#~ msgid "%s: invalid port number \"%s\"\n" -#~ msgstr "%s: 無効なポート番号です: \"%s\"\n" - -#~ msgid "%s: could not fsync log file \"%s\": %s\n" -#~ msgstr "%s: ログファイル\"%s\"をfsyncできませんでした: %s\n" - -#~ msgid "%s: could not open log file \"%s\": %s\n" -#~ msgstr "%s: ログファイル \"%s\" をオープンできませんでした: %s\n" - -#~ msgid "%s: select() failed: %s\n" -#~ msgstr "%s: select()が失敗しました: %s\n" - -#~ msgid "%s: could not receive data from WAL stream: %s" -#~ msgstr "%s: WALストリームからデータを受信できませんでした: %s" - -#~ msgid "%s: could not create archive status file \"%s\": %s\n" -#~ msgstr "%s: アーカイブ状態ファイル \"%s\" を作成できませんでした: %s\n" - -#~ msgid "%s: could not open write-ahead log file \"%s\": %s\n" -#~ msgstr "%s: 先行書き込みログファイル \"%s\" をオープンできませんでした: %s\n" - -#~ msgid "%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n" -#~ msgstr "%s: システムを識別できませんでした: 受信したのは %d 行で %d フィールド、期待していたのは%d 行で %d 以上のフィールドでした\n" - -#~ msgid "%s: could not connect to server\n" -#~ msgstr "%s: サーバに接続できませんでした\n" - -#~ msgid "%s: could not connect to server: %s" -#~ msgstr "%s: サーバに接続できませんでした: %s" diff --git a/src/bin/pg_basebackup/po/sv.po b/src/bin/pg_basebackup/po/sv.po index 2dfc0d8289..ab43c942ec 100644 --- a/src/bin/pg_basebackup/po/sv.po +++ b/src/bin/pg_basebackup/po/sv.po @@ -1,14 +1,14 @@ # SWEDISH message translation file for pg_basebackup # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. # msgid "" msgstr "" -"Project-Id-Version: pg_basebackup (PostgreSQL) 10\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-05-02 21:15+0000\n" -"PO-Revision-Date: 2020-05-03 07:53+0200\n" +"POT-Creation-Date: 2022-05-09 18:48+0000\n" +"PO-Revision-Date: 2022-05-09 21:45+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,21 +17,60 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatalt: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "varning: " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "tips: " + +#: ../../common/compression.c:157 +msgid "found empty string where a compression option was expected" +msgstr "hittade en tom sträng där en komprimeringsinställning förväntades" + +#: ../../common/compression.c:187 +#, c-format +msgid "unknown compression option \"%s\"" +msgstr "okänd komprimeringsmetod \"%s\"" + +#: ../../common/compression.c:226 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "komprimeringsmetoden \"%s\" kräver ett värde" + +#: ../../common/compression.c:235 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "värdet på komprimeringsflaggan \"%s\" måste vara ett heltal" + +#: ../../common/compression.c:273 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "komprimeringsalgoritmen \"%s\" stöder inte komprimeringsnivåer" + +#: ../../common/compression.c:277 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d" +msgstr "komprimeringsalgoritmen \"%s\" förväntar sig en komprimeringsnivå mellan %d och %d" + +#: ../../common/compression.c:289 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "komprimeringsalgoritmen \"%s\" stöder inte inställning av antal arbetarprocesser" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -43,120 +82,305 @@ msgstr "slut på minne\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" -#: ../../common/file_utils.c:79 ../../common/file_utils.c:181 -#: pg_receivewal.c:266 pg_recvlogical.c:340 +#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 +#: pg_receivewal.c:380 pg_recvlogical.c:341 #, c-format msgid "could not stat file \"%s\": %m" msgstr "kunde inte göra stat() på fil \"%s\": %m" -#: ../../common/file_utils.c:158 pg_receivewal.c:169 +#: ../../common/file_utils.c:166 pg_receivewal.c:303 #, c-format msgid "could not open directory \"%s\": %m" msgstr "kunde inte öppna katalog \"%s\": %m" -#: ../../common/file_utils.c:192 pg_receivewal.c:337 +#: ../../common/file_utils.c:200 pg_receivewal.c:534 #, c-format msgid "could not read directory \"%s\": %m" msgstr "kunde inte läsa katalog \"%s\": %m" -#: ../../common/file_utils.c:224 ../../common/file_utils.c:283 -#: ../../common/file_utils.c:357 +#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 +#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121 +#: pg_receivewal.c:447 #, c-format msgid "could not open file \"%s\": %m" msgstr "kunde inte öppna fil \"%s\": %m" -#: ../../common/file_utils.c:295 ../../common/file_utils.c:365 -#: pg_recvlogical.c:193 +#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 +#: pg_recvlogical.c:196 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "kunde inte fsync:a fil \"%s\": %m" -#: ../../common/file_utils.c:375 +#: ../../common/file_utils.c:383 pg_basebackup.c:2264 walmethods.c:459 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" -#: pg_basebackup.c:223 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s måste vara i intervallet %d..%d" + +#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 +#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 +#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1643 +#, c-format +msgid "out of memory" +msgstr "slut på minne" + +#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121 +#: bbstreamer_file.c:258 pg_basebackup.c:1440 pg_basebackup.c:1734 +#, c-format +msgid "could not write to file \"%s\": %m" +msgstr "kunde inte skriva till fil \"%s\": %m" + +#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339 +#: pg_basebackup.c:1504 pg_basebackup.c:1713 +#, c-format +msgid "could not create file \"%s\": %m" +msgstr "kunde inte skapa fil \"%s\": %m" + +#: bbstreamer_file.c:138 pg_recvlogical.c:635 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "kunde inte stänga fil \"%s\": %m" + +#: bbstreamer_file.c:275 +#, c-format +msgid "unexpected state while extracting archive" +msgstr "oväntat tillstånd vid uppackning av arkiv" + +#: bbstreamer_file.c:298 pg_basebackup.c:685 pg_basebackup.c:737 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "kunde inte skapa katalog \"%s\": %m" + +#: bbstreamer_file.c:304 +#, c-format +msgid "could not set permissions on directory \"%s\": %m" +msgstr "kunde inte sätta rättigheter på katalogen \"%s\": %m" + +#: bbstreamer_file.c:323 +#, c-format +msgid "could not create symbolic link from \"%s\" to \"%s\": %m" +msgstr "kunde inte skapa symbolisk länk från \"%s\" till \"%s\": %m" + +#: bbstreamer_file.c:343 +#, c-format +msgid "could not set permissions on file \"%s\": %m" +msgstr "kunde inte sätta rättigheter på filen \"%s\": %m" + +#: bbstreamer_gzip.c:95 +#, c-format +msgid "could not create compressed file \"%s\": %m" +msgstr "kunde inte skapa komprimerad fil \"%s\": %m" + +#: bbstreamer_gzip.c:103 +#, c-format +msgid "could not duplicate stdout: %m" +msgstr "kunde inte duplicera stdout: %m" + +#: bbstreamer_gzip.c:107 +#, c-format +msgid "could not open output file: %m" +msgstr "kunde inte öppna utdatafilen: %m" + +#: bbstreamer_gzip.c:113 +#, c-format +msgid "could not set compression level %d: %s" +msgstr "kunde inte sätta komprimeringsnivå %d: %s" + +#: bbstreamer_gzip.c:118 bbstreamer_gzip.c:251 +#, c-format +msgid "this build does not support gzip compression" +msgstr "detta bygge stöder inte gzip-komprimering" + +#: bbstreamer_gzip.c:145 +#, c-format +msgid "could not write to compressed file \"%s\": %s" +msgstr "kunde inte skriva till komprimerad fil \"%s\": %s" + +#: bbstreamer_gzip.c:169 +#, c-format +msgid "could not close compressed file \"%s\": %m" +msgstr "kunde inte stänga komprimerad fil \"%s\": %m" + +#: bbstreamer_gzip.c:247 walmethods.c:869 +#, c-format +msgid "could not initialize compression library" +msgstr "kunde inte initierar komprimeringsbibliotek" + +#: bbstreamer_gzip.c:297 bbstreamer_lz4.c:355 bbstreamer_zstd.c:319 +#, c-format +msgid "could not decompress data: %s" +msgstr "kunde inte dekomprimera data: %s" + +#: bbstreamer_inject.c:189 +#, c-format +msgid "unexpected state while injecting recovery settings" +msgstr "oväntat tillstånd vid injicering av återställningsinställningar" + +#: bbstreamer_lz4.c:96 +#, c-format +msgid "could not create lz4 compression context: %s" +msgstr "kunde inte skapa kontext för lz4-komprimering: %s" + +#: bbstreamer_lz4.c:101 bbstreamer_lz4.c:299 +#, c-format +msgid "this build does not support lz4 compression" +msgstr "detta bygge stöder inte lz4-komprimering" + +#: bbstreamer_lz4.c:141 +#, c-format +msgid "could not write lz4 header: %s" +msgstr "kunde inte skriva lz4-header: %s" + +#: bbstreamer_lz4.c:190 bbstreamer_zstd.c:171 bbstreamer_zstd.c:213 +#, c-format +msgid "could not compress data: %s" +msgstr "kunde inte komprimera data: %s" + +#: bbstreamer_lz4.c:242 +#, c-format +msgid "could not end lz4 compression: %s" +msgstr "kunde inte avsluta lz4-komprimering: %s" + +#: bbstreamer_lz4.c:294 +#, c-format +msgid "could not initialize compression library: %s" +msgstr "kunde inte initiera komprimeringsbibliotek: %s" + +#: bbstreamer_tar.c:244 +#, c-format +msgid "tar file trailer exceeds 2 blocks" +msgstr "tarfilens slutdel överskred 2 block" + +#: bbstreamer_tar.c:249 +#, c-format +msgid "unexpected state while parsing tar archive" +msgstr "oväntat tillstånd vid parsning av tar-arkiv" + +#: bbstreamer_tar.c:296 +#, c-format +msgid "tar member has empty name" +msgstr "tar-medlem har tomt namn" + +#: bbstreamer_tar.c:328 +#, c-format +msgid "COPY stream ended before last file was finished" +msgstr "COPY-ström avslutade innan sista filen var klar" + +#: bbstreamer_zstd.c:85 +#, c-format +msgid "could not create zstd compression context" +msgstr "kunde inte skapa kontext för zstd-komprimering" + +#: bbstreamer_zstd.c:93 +#, c-format +msgid "could not set zstd compression level to %d: %s" +msgstr "kunde inte sätta zstd-komprimeringsnivå till %d: %s" + +#: bbstreamer_zstd.c:108 +#, c-format +msgid "could not set compression worker count to %d: %s" +msgstr "kunde inte sätta komprimeringsarbetarantalet till %d: %s" + +#: bbstreamer_zstd.c:119 bbstreamer_zstd.c:274 +#, c-format +msgid "this build does not support zstd compression" +msgstr "detta bygge stöder inte zstd-komprimering" + +#: bbstreamer_zstd.c:265 +#, c-format +msgid "could not create zstd decompression context" +msgstr "kunde inte skapa kontext för zstd-dekomprimering" + +#: pg_basebackup.c:239 #, c-format msgid "removing data directory \"%s\"" msgstr "tar bort datakatalog \"%s\"" -#: pg_basebackup.c:225 +#: pg_basebackup.c:241 #, c-format msgid "failed to remove data directory" msgstr "misslyckades med att ta bort datakatalog" -#: pg_basebackup.c:229 +#: pg_basebackup.c:245 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "tar bort innehållet i datakatalog \"%s\"" -#: pg_basebackup.c:231 +#: pg_basebackup.c:247 #, c-format msgid "failed to remove contents of data directory" msgstr "misslyckades med att ta bort innehållet i datakatalogen" -#: pg_basebackup.c:236 +#: pg_basebackup.c:252 #, c-format msgid "removing WAL directory \"%s\"" msgstr "tar bort WAL-katalog \"%s\"" -#: pg_basebackup.c:238 +#: pg_basebackup.c:254 #, c-format msgid "failed to remove WAL directory" msgstr "misslyckades med att ta bort WAL-katalog" -#: pg_basebackup.c:242 +#: pg_basebackup.c:258 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "tar bort innehållet i WAL-katalog \"%s\"" -#: pg_basebackup.c:244 +#: pg_basebackup.c:260 #, c-format msgid "failed to remove contents of WAL directory" msgstr "misslyckades med att ta bort innehållet i WAL-katalogen" -#: pg_basebackup.c:250 +#: pg_basebackup.c:266 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "datakatalog \"%s\" är ej borttagen på användares begäran" -#: pg_basebackup.c:253 +#: pg_basebackup.c:269 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "WAL-katalog \"%s\" är ej borttagen på användares begäran" -#: pg_basebackup.c:257 +#: pg_basebackup.c:273 #, c-format msgid "changes to tablespace directories will not be undone" msgstr "ändringar av tablespace-kataloger kan inte backas" -#: pg_basebackup.c:298 +#: pg_basebackup.c:325 #, c-format msgid "directory name too long" msgstr "katalognamn för långt" -#: pg_basebackup.c:308 +#: pg_basebackup.c:332 #, c-format msgid "multiple \"=\" signs in tablespace mapping" msgstr "multipla \"=\"-tecken i tablespace-mappning" -#: pg_basebackup.c:320 +#: pg_basebackup.c:341 #, c-format msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "ogiltigt tablespace-mappningsformat \"%s\", måste vara \"OLDDIR=NEWDIR\"" -#: pg_basebackup.c:332 +#: pg_basebackup.c:350 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "gammal katalog är inte en absolut sökväg i tablespace-mappning: %s" -#: pg_basebackup.c:339 +#: pg_basebackup.c:354 #, c-format msgid "new directory is not an absolute path in tablespace mapping: %s" msgstr "ny katalog är inte en absolut sökväg i tablespace-mappning: %s" -#: pg_basebackup.c:378 +#: pg_basebackup.c:376 #, c-format msgid "" "%s takes a base backup of a running PostgreSQL server.\n" @@ -165,17 +389,17 @@ msgstr "" "%s tar en basbackup av en körande PostgreSQL-server.\n" "\n" -#: pg_basebackup.c:380 pg_receivewal.c:79 pg_recvlogical.c:75 +#: pg_basebackup.c:378 pg_receivewal.c:81 pg_recvlogical.c:78 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: pg_basebackup.c:381 pg_receivewal.c:80 pg_recvlogical.c:76 +#: pg_basebackup.c:379 pg_receivewal.c:82 pg_recvlogical.c:79 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [FLAGGA]...\n" -#: pg_basebackup.c:382 +#: pg_basebackup.c:380 #, c-format msgid "" "\n" @@ -184,17 +408,17 @@ msgstr "" "\n" "Flaggor som styr utmatning:\n" -#: pg_basebackup.c:383 +#: pg_basebackup.c:381 #, c-format msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n" msgstr " -D, --pgdata=KATALOG ta emot basbackup till katalog\n" -#: pg_basebackup.c:384 +#: pg_basebackup.c:382 #, c-format msgid " -F, --format=p|t output format (plain (default), tar)\n" msgstr " -F, --format=p|t utdataformat (plain (standard), tar)\n" -#: pg_basebackup.c:385 +#: pg_basebackup.c:383 #, c-format msgid "" " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" @@ -203,7 +427,7 @@ msgstr "" " -r, --max-rate=RATE maximal överföringshastighet för att överföra datakatalog\n" " (i kB/s, eller använd suffix \"k\" resp. \"M\")\n" -#: pg_basebackup.c:387 +#: pg_basebackup.c:385 #, c-format msgid "" " -R, --write-recovery-conf\n" @@ -212,6 +436,15 @@ msgstr "" " -R, --write-recovery-conf\n" " skriv konfiguration för replikering\n" +#: pg_basebackup.c:387 +#, c-format +msgid "" +" -t, --target=TARGET[:DETAIL]\n" +" backup target (if other than client)\n" +msgstr "" +" -t, --target=MÅL[:DETALJ]\n" +" backupmål (om annat än klienten)\n" + #: pg_basebackup.c:389 #, c-format msgid "" @@ -242,10 +475,19 @@ msgstr " -z, --gzip komprimera tar-utdata\n" #: pg_basebackup.c:395 #, c-format -msgid " -Z, --compress=0-9 compress tar output with given compression level\n" -msgstr " -Z, --compress=0-9 komprimera tar-utdata med given komprimeringsnivå\n" +msgid "" +" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" +" compress on client or server as specified\n" +msgstr "" +" -Z, --compress=[{client|server}-]METOD[:DETALJ]\n" +" komprimera på klient- eller serversida\n" -#: pg_basebackup.c:396 +#: pg_basebackup.c:397 +#, c-format +msgid " -Z, --compress=none do not compress tar output\n" +msgstr " -Z, --compress=none komprimera inte tar-utdata\n" + +#: pg_basebackup.c:398 #, c-format msgid "" "\n" @@ -254,7 +496,7 @@ msgstr "" "\n" "Allmänna flaggor:\n" -#: pg_basebackup.c:397 +#: pg_basebackup.c:399 #, c-format msgid "" " -c, --checkpoint=fast|spread\n" @@ -263,47 +505,47 @@ msgstr "" " -c, --checkpoint=fast|spread\n" " ställ in \"fast\" eller \"spread\" checkpoint-metod\n" -#: pg_basebackup.c:399 +#: pg_basebackup.c:401 #, c-format msgid " -C, --create-slot create replication slot\n" msgstr " --create-slot skapa en replikeringsslot\n" -#: pg_basebackup.c:400 +#: pg_basebackup.c:402 #, c-format msgid " -l, --label=LABEL set backup label\n" msgstr " -l, --label=ETIKETT sätt backup-etikett\n" -#: pg_basebackup.c:401 +#: pg_basebackup.c:403 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean städa inte upp efter fel\n" -#: pg_basebackup.c:402 +#: pg_basebackup.c:404 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync vänta inte på att ändringar skall skrivas säkert till disk\n" -#: pg_basebackup.c:403 +#: pg_basebackup.c:405 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress visa förloppsinformation\n" -#: pg_basebackup.c:404 pg_receivewal.c:89 +#: pg_basebackup.c:406 pg_receivewal.c:91 #, c-format msgid " -S, --slot=SLOTNAME replication slot to use\n" msgstr " -S, --slot=SLOTNAMN replikerings-slot att använda\n" -#: pg_basebackup.c:405 pg_receivewal.c:91 pg_recvlogical.c:96 +#: pg_basebackup.c:407 pg_receivewal.c:93 pg_recvlogical.c:100 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose mata ut utförliga meddelanden\n" -#: pg_basebackup.c:406 pg_receivewal.c:92 pg_recvlogical.c:97 +#: pg_basebackup.c:408 pg_receivewal.c:94 pg_recvlogical.c:101 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_basebackup.c:407 +#: pg_basebackup.c:409 #, c-format msgid "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" @@ -312,7 +554,7 @@ msgstr "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" " använd algoritm för manifestchecksummor\n" -#: pg_basebackup.c:409 +#: pg_basebackup.c:411 #, c-format msgid "" " --manifest-force-encode\n" @@ -321,22 +563,22 @@ msgstr "" " --manifest-force-encode\n" " hex-koda alla filnamn i manifestet\n" -#: pg_basebackup.c:411 +#: pg_basebackup.c:413 #, c-format msgid " --no-estimate-size do not estimate backup size in server side\n" msgstr " --no-estimate-size estimerar inte backupstorlek på serversidan\n" -#: pg_basebackup.c:412 +#: pg_basebackup.c:414 #, c-format msgid " --no-manifest suppress generation of backup manifest\n" msgstr " --no-manifest förhindra att backupmanifest genereras\n" -#: pg_basebackup.c:413 +#: pg_basebackup.c:415 #, c-format msgid " --no-slot prevent creation of temporary replication slot\n" msgstr " --no-slot förhindra skapande av temporär replikerings-slot\n" -#: pg_basebackup.c:414 +#: pg_basebackup.c:416 #, c-format msgid "" " --no-verify-checksums\n" @@ -345,12 +587,12 @@ msgstr "" " --no-verify-checksums\n" " verifiera inte checksummor\n" -#: pg_basebackup.c:416 pg_receivewal.c:94 pg_recvlogical.c:98 +#: pg_basebackup.c:418 pg_receivewal.c:97 pg_recvlogical.c:102 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa den här hjälpen, avsluta sedan\n" -#: pg_basebackup.c:417 pg_receivewal.c:95 pg_recvlogical.c:99 +#: pg_basebackup.c:419 pg_receivewal.c:98 pg_recvlogical.c:103 #, c-format msgid "" "\n" @@ -359,22 +601,22 @@ msgstr "" "\n" "Flaggor för anslutning:\n" -#: pg_basebackup.c:418 pg_receivewal.c:96 +#: pg_basebackup.c:420 pg_receivewal.c:99 #, c-format msgid " -d, --dbname=CONNSTR connection string\n" msgstr " -d, --dbname=CONNSTR anslutningssträng\n" -#: pg_basebackup.c:419 pg_receivewal.c:97 pg_recvlogical.c:101 +#: pg_basebackup.c:421 pg_receivewal.c:100 pg_recvlogical.c:105 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAMN databasserverns värdnamn eller socket-katalog\n" -#: pg_basebackup.c:420 pg_receivewal.c:98 pg_recvlogical.c:102 +#: pg_basebackup.c:422 pg_receivewal.c:101 pg_recvlogical.c:106 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT databasserverns postnummer\n" -#: pg_basebackup.c:421 +#: pg_basebackup.c:423 #, c-format msgid "" " -s, --status-interval=INTERVAL\n" @@ -383,22 +625,22 @@ msgstr "" " -s, --status-interval=INTERVAL\n" " tid mellan att statuspaket skickas till servern (i sekunder)\n" -#: pg_basebackup.c:423 pg_receivewal.c:99 pg_recvlogical.c:103 +#: pg_basebackup.c:425 pg_receivewal.c:102 pg_recvlogical.c:107 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAMN ansluta som angiven databasanvändare\n" -#: pg_basebackup.c:424 pg_receivewal.c:100 pg_recvlogical.c:104 +#: pg_basebackup.c:426 pg_receivewal.c:103 pg_recvlogical.c:108 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password fråga aldrig efter lösenord\n" -#: pg_basebackup.c:425 pg_receivewal.c:101 pg_recvlogical.c:105 +#: pg_basebackup.c:427 pg_receivewal.c:104 pg_recvlogical.c:109 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password tvinga fram lösenordsfråga (skall ske automatiskt)\n" -#: pg_basebackup.c:426 pg_receivewal.c:105 pg_recvlogical.c:106 +#: pg_basebackup.c:428 pg_receivewal.c:108 pg_recvlogical.c:110 #, c-format msgid "" "\n" @@ -407,471 +649,480 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_basebackup.c:427 pg_receivewal.c:106 pg_recvlogical.c:107 +#: pg_basebackup.c:429 pg_receivewal.c:109 pg_recvlogical.c:111 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_basebackup.c:470 +#: pg_basebackup.c:471 #, c-format msgid "could not read from ready pipe: %m" msgstr "kunde inte läsa från rör (pipe) som har data: %m" -#: pg_basebackup.c:476 pg_basebackup.c:607 pg_basebackup.c:2114 -#: streamutil.c:450 +#: pg_basebackup.c:474 pg_basebackup.c:621 pg_basebackup.c:2178 +#: streamutil.c:444 #, c-format msgid "could not parse write-ahead log location \"%s\"" msgstr "kunde inte parsa write-ahead-logg-plats \"%s\"" -#: pg_basebackup.c:572 pg_receivewal.c:441 +#: pg_basebackup.c:580 pg_receivewal.c:665 #, c-format msgid "could not finish writing WAL files: %m" msgstr "kunde inte slutföra skrivning av WAL-filer: %m" -#: pg_basebackup.c:619 +#: pg_basebackup.c:630 #, c-format msgid "could not create pipe for background process: %m" msgstr "kunde inte skapa rör (pipe) för bakgrundsprocess: %m" -#: pg_basebackup.c:654 +#: pg_basebackup.c:663 #, c-format msgid "created temporary replication slot \"%s\"" msgstr "skapade en temporär replikeringsslot \"%s\"" -#: pg_basebackup.c:657 +#: pg_basebackup.c:666 #, c-format msgid "created replication slot \"%s\"" msgstr "skapade en replikeringsslot \"%s\"" -#: pg_basebackup.c:677 pg_basebackup.c:730 pg_basebackup.c:1605 +#: pg_basebackup.c:703 #, c-format -msgid "could not create directory \"%s\": %m" -msgstr "kunde inte skapa katalog \"%s\": %m" +msgid "log streamer with pid %d exiting" +msgstr "logg-strömmare med pid %d avslutar" -#: pg_basebackup.c:695 +#: pg_basebackup.c:708 #, c-format msgid "could not create background process: %m" msgstr "kunde inte skapa bakgrundsprocess: %m" -#: pg_basebackup.c:707 +#: pg_basebackup.c:717 #, c-format msgid "could not create background thread: %m" msgstr "kunde inte skapa bakgrundstråd: %m" -#: pg_basebackup.c:751 +#: pg_basebackup.c:756 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "katalogen \"%s\" existerar men är inte tom" -#: pg_basebackup.c:758 +#: pg_basebackup.c:762 #, c-format msgid "could not access directory \"%s\": %m" msgstr "kunde inte komma åt katalog \"%s\": %m" -#: pg_basebackup.c:819 +#: pg_basebackup.c:839 #, c-format msgid "%*s/%s kB (100%%), %d/%d tablespace %*s" msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s" msgstr[0] "%*s/%s kB (100%%), %d/%d tablespace %*s" msgstr[1] "%*s/%s kB (100%%), %d/%d tablespace %*s" -#: pg_basebackup.c:831 +#: pg_basebackup.c:851 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" -#: pg_basebackup.c:847 +#: pg_basebackup.c:867 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces" msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace" msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespace" -#: pg_basebackup.c:871 +#: pg_basebackup.c:891 #, c-format msgid "transfer rate \"%s\" is not a valid value" msgstr "överföringshastighet \"%s\" är inte ett giltigt värde" -#: pg_basebackup.c:876 +#: pg_basebackup.c:893 #, c-format msgid "invalid transfer rate \"%s\": %m" msgstr "ogiltig överföringshastighet \"%s\": %m" -#: pg_basebackup.c:885 +#: pg_basebackup.c:900 #, c-format msgid "transfer rate must be greater than zero" msgstr "överföringshastigheten måste vara större än noll" -#: pg_basebackup.c:917 +#: pg_basebackup.c:930 #, c-format msgid "invalid --max-rate unit: \"%s\"" msgstr "ogiltig enhet för --max-rate: \"%s\"" -#: pg_basebackup.c:924 +#: pg_basebackup.c:934 #, c-format msgid "transfer rate \"%s\" exceeds integer range" msgstr "överföringshastighet \"%s\" överskrider heltalsintervall" -#: pg_basebackup.c:934 +#: pg_basebackup.c:941 #, c-format msgid "transfer rate \"%s\" is out of range" msgstr "överföringshastighet \"%s\" är utanför sitt intervall" -#: pg_basebackup.c:955 +#: pg_basebackup.c:1037 #, c-format msgid "could not get COPY data stream: %s" msgstr "kunde inte hämta COPY-data-ström: %s" -#: pg_basebackup.c:975 pg_recvlogical.c:435 receivelog.c:965 +#: pg_basebackup.c:1054 pg_recvlogical.c:438 pg_recvlogical.c:610 +#: receivelog.c:981 #, c-format msgid "could not read COPY data: %s" msgstr "kunde inte läsa COPY-data: %s" -#: pg_basebackup.c:997 +#: pg_basebackup.c:1058 #, c-format -msgid "could not write to compressed file \"%s\": %s" -msgstr "kunde inte skriva till komprimerad fil \"%s\": %s" +msgid "background process terminated unexpectedly" +msgstr "en bakgrundsprocess avslutade oväntat" -#: pg_basebackup.c:1007 pg_basebackup.c:1695 pg_basebackup.c:1747 +#: pg_basebackup.c:1129 #, c-format -msgid "could not write to file \"%s\": %m" -msgstr "kunde inte skriva till fil \"%s\": %m" +msgid "cannot inject manifest into a compressed tarfile" +msgstr "kan inte injicera manifest in i en komprimerad tarfil" -#: pg_basebackup.c:1056 +#: pg_basebackup.c:1130 #, c-format -msgid "could not duplicate stdout: %m" -msgstr "kunde inte duplicera stdout: %m" +msgid "use client-side compression, send the output to a directory rather than standard output, or use --no-manifest" +msgstr "använd komprimering på klientsidan, skicka utdatan till en katalog istället för till standard ut eller använd --no-manifest" -#: pg_basebackup.c:1063 +#: pg_basebackup.c:1145 #, c-format -msgid "could not open output file: %m" -msgstr "kunde inte öppna utdatafilen: %m" +msgid "unable to parse archive: %s" +msgstr "kunde inte parsa arkiv: %s" -#: pg_basebackup.c:1070 pg_basebackup.c:1091 pg_basebackup.c:1120 +#: pg_basebackup.c:1146 #, c-format -msgid "could not set compression level %d: %s" -msgstr "kunde inte sätta komprimeringsnivå %d: %s" +msgid "Only tar archives can be parsed." +msgstr "Bara tar-arkiv kan parsas." -#: pg_basebackup.c:1140 +#: pg_basebackup.c:1148 #, c-format -msgid "could not create compressed file \"%s\": %s" -msgstr "kunde inte skapa komprimerad fil \"%s\": %s" +msgid "Plain format requires pg_basebackup to parse the archive." +msgstr "Enkelt format kräver pg_basebackup för att parsa arkivet." -#: pg_basebackup.c:1151 pg_basebackup.c:1656 pg_basebackup.c:1728 +#: pg_basebackup.c:1150 #, c-format -msgid "could not create file \"%s\": %m" -msgstr "kunde inte skapa fil \"%s\": %m" +msgid "Using - as the output directory requires pg_basebackup to parse the archive." +msgstr "Att använda - som utkatalog kräver att pg_basebackup parsar arkivet." -#: pg_basebackup.c:1233 +#: pg_basebackup.c:1152 #, c-format -msgid "out of memory" -msgstr "slut på minne" +msgid "The -R option requires pg_basebackup to parse the archive." +msgstr "Flaggan -R kräver att pg_basebackup parsar arkivet." -#: pg_basebackup.c:1252 +#: pg_basebackup.c:1364 #, c-format -msgid "could not close compressed file \"%s\": %s" -msgstr "kunde inte stänga komprimerad fil \"%s\": %s" +msgid "archives should precede manifest" +msgstr "arkiv skall komma före manifest" -#: pg_basebackup.c:1264 pg_recvlogical.c:606 +#: pg_basebackup.c:1379 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "kunde inte stänga fil \"%s\": %m" +msgid "invalid archive name: \"%s\"" +msgstr "ogiltigt arkivnamn: \"%s\"" -#: pg_basebackup.c:1526 +#: pg_basebackup.c:1451 #, c-format -msgid "COPY stream ended before last file was finished" -msgstr "COPY-ström avslutade innan sista filen var klar" +msgid "unexpected payload data" +msgstr "oväntat datainnehåll" -#: pg_basebackup.c:1555 +#: pg_basebackup.c:1594 #, c-format -msgid "invalid tar block header size: %zu" -msgstr "ogiltig tar-block-header-storlek: %zu" +msgid "empty COPY message" +msgstr "tomt COPY-meddelande" -#: pg_basebackup.c:1612 +#: pg_basebackup.c:1596 #, c-format -msgid "could not set permissions on directory \"%s\": %m" -msgstr "kunde inte sätta rättigheter på katalogen \"%s\": %m" +msgid "malformed COPY message of type %d, length %zu" +msgstr "felaktigt COPY-meddelande av typ %d, längd %zu" -#: pg_basebackup.c:1636 +#: pg_basebackup.c:1794 #, c-format -msgid "could not create symbolic link from \"%s\" to \"%s\": %m" -msgstr "kunde inte skapa symbolisk länk från \"%s\" till \"%s\": %m" +msgid "incompatible server version %s" +msgstr "inkompatibel serverversion %s" -#: pg_basebackup.c:1643 +#: pg_basebackup.c:1810 #, c-format -msgid "unrecognized link indicator \"%c\"" -msgstr "okänd länkindikator \"%c\"" +msgid "HINT: use -X none or -X fetch to disable log streaming" +msgstr "TIPS: använd -X none eller -X fetch för att stänga av logg-strömning" -#: pg_basebackup.c:1662 +#: pg_basebackup.c:1878 #, c-format -msgid "could not set permissions on file \"%s\": %m" -msgstr "kunde inte sätta rättigheter på filen \"%s\": %m" +msgid "backup targets are not supported by this server version" +msgstr "backupmål stöds inte av denna serverversion" -#: pg_basebackup.c:1808 +#: pg_basebackup.c:1881 #, c-format -msgid "incompatible server version %s" -msgstr "inkompatibel serverversion %s" +msgid "recovery configuration cannot be written when a backup target is used" +msgstr "återställningskonfiguration kan inte skrivas när backupmål används" -#: pg_basebackup.c:1823 +#: pg_basebackup.c:1908 #, c-format -msgid "HINT: use -X none or -X fetch to disable log streaming" -msgstr "TIPS: använd -X none eller -X fetch för att stänga av logg-strömning" +msgid "server does not support server-side compression" +msgstr "servern stöder inte komprimering på serversidan" -#: pg_basebackup.c:1859 +#: pg_basebackup.c:1918 #, c-format msgid "initiating base backup, waiting for checkpoint to complete" msgstr "initierar basbackup, väntar på att checkpoint skall gå klart" -#: pg_basebackup.c:1885 pg_recvlogical.c:262 receivelog.c:481 receivelog.c:530 -#: receivelog.c:569 streamutil.c:297 streamutil.c:370 streamutil.c:422 -#: streamutil.c:533 streamutil.c:578 +#: pg_basebackup.c:1935 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588 +#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504 +#: streamutil.c:656 streamutil.c:701 #, c-format msgid "could not send replication command \"%s\": %s" msgstr "kunde inte skicka replikeringskommando \"%s\": %s" -#: pg_basebackup.c:1896 +#: pg_basebackup.c:1943 #, c-format msgid "could not initiate base backup: %s" msgstr "kunde inte initiera basbackup: %s" -#: pg_basebackup.c:1902 +#: pg_basebackup.c:1946 #, c-format msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields" msgstr "servern retunerade ett oväntat svar på BASE_BACKUP-kommandot; fick %d rader och %d fält, förväntade %d rader och %d fält" -#: pg_basebackup.c:1910 +#: pg_basebackup.c:1952 #, c-format msgid "checkpoint completed" msgstr "checkpoint klar" -#: pg_basebackup.c:1925 +#: pg_basebackup.c:1967 #, c-format msgid "write-ahead log start point: %s on timeline %u" msgstr "write-ahead-loggens startposition: %s på tidslinje %u" -#: pg_basebackup.c:1934 +#: pg_basebackup.c:1975 #, c-format msgid "could not get backup header: %s" msgstr "kunde inte hämta backup-header: %s" -#: pg_basebackup.c:1940 +#: pg_basebackup.c:1978 #, c-format msgid "no data returned from server" msgstr "ingen data returnerades från servern" -#: pg_basebackup.c:1972 +#: pg_basebackup.c:2013 #, c-format msgid "can only write single tablespace to stdout, database has %d" msgstr "kunde bara skriva en endaste tablespace till stdout, databasen har %d" -#: pg_basebackup.c:1984 +#: pg_basebackup.c:2026 #, c-format msgid "starting background WAL receiver" msgstr "startar bakgrunds-WAL-mottagare" -#: pg_basebackup.c:2027 +#: pg_basebackup.c:2109 #, c-format -msgid "could not get write-ahead log end position from server: %s" -msgstr "kunde inte hämta write-ahead-loggens slutposition från servern: %s" +msgid "backup failed: %s" +msgstr "backup misslyckades: %s" -#: pg_basebackup.c:2033 +#: pg_basebackup.c:2112 #, c-format msgid "no write-ahead log end position returned from server" msgstr "ingen write-ahead-logg-slutposition returnerad från servern" -#: pg_basebackup.c:2038 +#: pg_basebackup.c:2115 #, c-format msgid "write-ahead log end point: %s" msgstr "write-ahead-logg-slutposition: %s" -#: pg_basebackup.c:2049 +#: pg_basebackup.c:2126 #, c-format msgid "checksum error occurred" msgstr "felaktig kontrollsumma upptäcktes" -#: pg_basebackup.c:2054 +#: pg_basebackup.c:2131 #, c-format msgid "final receive failed: %s" msgstr "sista mottagning misslyckades: %s" -#: pg_basebackup.c:2078 +#: pg_basebackup.c:2155 #, c-format msgid "waiting for background process to finish streaming ..." msgstr "väntat på att bakgrundsprocess skall avsluta strömmande ..." -#: pg_basebackup.c:2083 +#: pg_basebackup.c:2159 #, c-format msgid "could not send command to background pipe: %m" msgstr "kunde inte skicka kommando till bakgrundsrör (pipe): %m" -#: pg_basebackup.c:2091 +#: pg_basebackup.c:2164 #, c-format msgid "could not wait for child process: %m" msgstr "kunde inte vänta på barnprocess: %m" -#: pg_basebackup.c:2096 +#: pg_basebackup.c:2166 #, c-format msgid "child %d died, expected %d" msgstr "barn %d dog, förväntade %d" -#: pg_basebackup.c:2101 streamutil.c:92 +#: pg_basebackup.c:2168 streamutil.c:91 streamutil.c:197 #, c-format msgid "%s" msgstr "%s" -#: pg_basebackup.c:2126 +#: pg_basebackup.c:2188 #, c-format msgid "could not wait for child thread: %m" msgstr "kunde inte vänta på barntråd: %m" -#: pg_basebackup.c:2132 +#: pg_basebackup.c:2193 #, c-format msgid "could not get child thread exit status: %m" msgstr "kunde inte hämta barntrådens slutstatus: %m" -#: pg_basebackup.c:2137 +#: pg_basebackup.c:2196 #, c-format msgid "child thread exited with error %u" msgstr "barntråd avslutade med fel %u" -#: pg_basebackup.c:2165 +#: pg_basebackup.c:2225 #, c-format msgid "syncing data to disk ..." msgstr "synkar data till disk ..." -#: pg_basebackup.c:2190 +#: pg_basebackup.c:2250 #, c-format msgid "renaming backup_manifest.tmp to backup_manifest" msgstr "byter namn på backup_manifest.tmp till backup_manifest" -#: pg_basebackup.c:2201 +#: pg_basebackup.c:2270 #, c-format msgid "base backup completed" msgstr "basbackup klar" -#: pg_basebackup.c:2286 +#: pg_basebackup.c:2359 #, c-format msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"" msgstr "ogiltigt utdataformat \"%s\", måste vara \"plain\" eller \"tar\"" -#: pg_basebackup.c:2330 +#: pg_basebackup.c:2403 #, c-format msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"" msgstr "ogiltig wal-metod-flagga \"%s\", måste vara \"fetch\", \"stream\" eller \"none\"" -#: pg_basebackup.c:2358 pg_receivewal.c:580 -#, c-format -msgid "invalid compression level \"%s\"" -msgstr "ogiltig komprimeringsnivå \"%s\"" - -#: pg_basebackup.c:2369 +#: pg_basebackup.c:2433 #, c-format msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" msgstr "ogiltigt checkpoint-argument \"%s\", måste vara \"fast\" eller \"spread\"" -#: pg_basebackup.c:2396 pg_receivewal.c:555 pg_recvlogical.c:794 +#: pg_basebackup.c:2484 pg_basebackup.c:2496 pg_basebackup.c:2518 +#: pg_basebackup.c:2530 pg_basebackup.c:2536 pg_basebackup.c:2588 +#: pg_basebackup.c:2599 pg_basebackup.c:2609 pg_basebackup.c:2615 +#: pg_basebackup.c:2622 pg_basebackup.c:2634 pg_basebackup.c:2646 +#: pg_basebackup.c:2654 pg_basebackup.c:2667 pg_basebackup.c:2673 +#: pg_basebackup.c:2682 pg_basebackup.c:2694 pg_basebackup.c:2705 +#: pg_basebackup.c:2713 pg_receivewal.c:816 pg_receivewal.c:828 +#: pg_receivewal.c:835 pg_receivewal.c:844 pg_receivewal.c:851 +#: pg_receivewal.c:861 pg_recvlogical.c:837 pg_recvlogical.c:849 +#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873 +#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894 +#: pg_recvlogical.c:901 pg_recvlogical.c:908 #, c-format -msgid "invalid status interval \"%s\"" -msgstr "ogiltigt status-intervall \"%s\"" +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." -#: pg_basebackup.c:2426 pg_basebackup.c:2439 pg_basebackup.c:2450 -#: pg_basebackup.c:2461 pg_basebackup.c:2469 pg_basebackup.c:2477 -#: pg_basebackup.c:2487 pg_basebackup.c:2500 pg_basebackup.c:2508 -#: pg_basebackup.c:2519 pg_basebackup.c:2529 pg_basebackup.c:2546 -#: pg_basebackup.c:2554 pg_basebackup.c:2562 pg_receivewal.c:605 -#: pg_receivewal.c:618 pg_receivewal.c:626 pg_receivewal.c:636 -#: pg_receivewal.c:644 pg_receivewal.c:655 pg_recvlogical.c:820 -#: pg_recvlogical.c:833 pg_recvlogical.c:844 pg_recvlogical.c:852 -#: pg_recvlogical.c:860 pg_recvlogical.c:868 pg_recvlogical.c:876 -#: pg_recvlogical.c:884 pg_recvlogical.c:892 -#, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Försök med \"%s --help\" för mer information.\n" - -#: pg_basebackup.c:2437 pg_receivewal.c:616 pg_recvlogical.c:831 +#: pg_basebackup.c:2494 pg_receivewal.c:826 pg_recvlogical.c:847 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för många kommandoradsargument (första är \"%s\")" -#: pg_basebackup.c:2449 pg_receivewal.c:654 +#: pg_basebackup.c:2517 #, c-format -msgid "no target directory specified" -msgstr "ingen målkatalog angiven" +msgid "cannot specify both format and backup target" +msgstr "kan inte ange både format och backupmål" + +#: pg_basebackup.c:2529 +#, c-format +msgid "must specify output directory or backup target" +msgstr "måste ange utkatalog eller backupmål" + +#: pg_basebackup.c:2535 +#, c-format +msgid "cannot specify both output directory and backup target" +msgstr "kan inte ange både utdatakatalog och backupmål" + +#: pg_basebackup.c:2565 pg_receivewal.c:870 +#, c-format +msgid "unrecognized compression algorithm \"%s\"" +msgstr "okänd komprimeringsalgoritm \"%s\"" -#: pg_basebackup.c:2460 +#: pg_basebackup.c:2571 pg_receivewal.c:877 +#, c-format +msgid "invalid compression specification: %s" +msgstr "ogiltig komprimeringsangivelse: %s" + +#: pg_basebackup.c:2587 +#, c-format +msgid "client-side compression is not possible when a backup target is specified" +msgstr "komprimering på klientsidan är inte möjlig när backupmål angivits" + +#: pg_basebackup.c:2598 #, c-format msgid "only tar mode backups can be compressed" msgstr "bara backupper i tar-läge kan komprimeras" -#: pg_basebackup.c:2468 +#: pg_basebackup.c:2608 +#, c-format +msgid "WAL cannot be streamed when a backup target is specified" +msgstr "WAL kan inte strömmas när ett backupmål angivits" + +#: pg_basebackup.c:2614 #, c-format msgid "cannot stream write-ahead logs in tar mode to stdout" msgstr "kan inte strömma write-ahead-logg i tar-läge till stdout" -#: pg_basebackup.c:2476 +#: pg_basebackup.c:2621 #, c-format msgid "replication slots can only be used with WAL streaming" msgstr "replikerings-slot kan bara användas med WAL-strömning" -#: pg_basebackup.c:2486 +#: pg_basebackup.c:2633 #, c-format msgid "--no-slot cannot be used with slot name" msgstr "--no-slot kan inte användas tillsammans med slot-namn" #. translator: second %s is an option name -#: pg_basebackup.c:2498 pg_receivewal.c:634 +#: pg_basebackup.c:2644 pg_receivewal.c:842 #, c-format msgid "%s needs a slot to be specified using --slot" msgstr "%s kräver att en slot anges med --slot" -#: pg_basebackup.c:2507 +#: pg_basebackup.c:2652 pg_basebackup.c:2692 pg_basebackup.c:2703 +#: pg_basebackup.c:2711 +#, c-format +msgid "%s and %s are incompatible options" +msgstr "%s och %s är inkompatibla flaggor" + +#: pg_basebackup.c:2666 #, c-format -msgid "--create-slot and --no-slot are incompatible options" -msgstr "--create-slot och --no-slot är inkompatibla flaggor" +msgid "WAL directory location cannot be specified along with a backup target" +msgstr "WAL-katalogplats kan inte anges tillsammans med backupmål" -#: pg_basebackup.c:2518 +#: pg_basebackup.c:2672 #, c-format msgid "WAL directory location can only be specified in plain mode" msgstr "WAL-katalogplats kan bara anges i läget \"plain\"" -#: pg_basebackup.c:2528 +#: pg_basebackup.c:2681 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL-katalogen måste vara en absolut sökväg" -#: pg_basebackup.c:2538 pg_receivewal.c:663 -#, c-format -msgid "this build does not support compression" -msgstr "detta bygge stöder inte komprimering" - -#: pg_basebackup.c:2545 -#, c-format -msgid "--progress and --no-estimate-size are incompatible options" -msgstr "--progress och --no-estimate-size är inkompatibla flaggor" - -#: pg_basebackup.c:2553 -#, c-format -msgid "--no-manifest and --manifest-checksums are incompatible options" -msgstr "--no-manifest och --manifest-checksums är inkompatibla flaggor" - -#: pg_basebackup.c:2561 -#, c-format -msgid "--no-manifest and --manifest-force-encode are incompatible options" -msgstr "--no-manifest och --manifest-force-encode är inkompatibla flaggor" - -#: pg_basebackup.c:2620 +#: pg_basebackup.c:2781 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "kan inte skapa symbolisk länk \"%s\": %m" -#: pg_basebackup.c:2624 +#: pg_basebackup.c:2783 #, c-format msgid "symlinks are not supported on this platform" msgstr "symboliska länkar stöds inte på denna plattform" -#: pg_receivewal.c:77 +#: pg_receivewal.c:79 #, c-format msgid "" "%s receives PostgreSQL streaming write-ahead logs.\n" @@ -880,7 +1131,7 @@ msgstr "" "%s tar emot PostgreSQL-strömning-write-ahead-logg.\n" "\n" -#: pg_receivewal.c:81 pg_recvlogical.c:81 +#: pg_receivewal.c:83 pg_recvlogical.c:84 #, c-format msgid "" "\n" @@ -889,32 +1140,32 @@ msgstr "" "\n" "Flaggor:\n" -#: pg_receivewal.c:82 +#: pg_receivewal.c:84 #, c-format msgid " -D, --directory=DIR receive write-ahead log files into this directory\n" msgstr " -D, --directory=KAT ta emot write-ahead-logg-filer till denna katalog\n" -#: pg_receivewal.c:83 pg_recvlogical.c:82 +#: pg_receivewal.c:85 pg_recvlogical.c:85 #, c-format msgid " -E, --endpos=LSN exit after receiving the specified LSN\n" msgstr " -E, --endpos=LSN avsluta efter att ha taget emot den angivna LSN\n" -#: pg_receivewal.c:84 pg_recvlogical.c:86 +#: pg_receivewal.c:86 pg_recvlogical.c:89 #, c-format msgid " --if-not-exists do not error if slot already exists when creating a slot\n" msgstr " --if-not-exists inget fel om slot:en redan finns när vi skapar slot:en\n" -#: pg_receivewal.c:85 pg_recvlogical.c:88 +#: pg_receivewal.c:87 pg_recvlogical.c:91 #, c-format msgid " -n, --no-loop do not loop on connection lost\n" msgstr " -n, --no-loop loopa inte om anslutning tappas\n" -#: pg_receivewal.c:86 +#: pg_receivewal.c:88 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync vänta inte på att ändringar skall skrivas säkert till disk\n" -#: pg_receivewal.c:87 pg_recvlogical.c:93 +#: pg_receivewal.c:89 pg_recvlogical.c:96 #, c-format msgid "" " -s, --status-interval=SECS\n" @@ -923,17 +1174,21 @@ msgstr "" " -s, --status-interval=SEKS\n" " tid mellan att statuspaket skickas till serverb (standard: %d)\n" -#: pg_receivewal.c:90 +#: pg_receivewal.c:92 #, c-format msgid " --synchronous flush write-ahead log immediately after writing\n" msgstr " --synchronous flush:a write-ahead-logg direkt efter skrivning\n" -#: pg_receivewal.c:93 +#: pg_receivewal.c:95 #, c-format -msgid " -Z, --compress=0-9 compress logs with given compression level\n" -msgstr " -Z, --compress=0-9 komprimera loggar med angiven komprimeringsnivå\n" +msgid "" +" -Z, --compress=METHOD[:DETAIL]\n" +" compress as specified\n" +msgstr "" +" -Z, --compress=[{client|server}-]METOD[:DETALJ]\n" +" komprimera enligt detta\n" -#: pg_receivewal.c:102 +#: pg_receivewal.c:105 #, c-format msgid "" "\n" @@ -942,123 +1197,173 @@ msgstr "" "\n" "Valfria handlingar:\n" -#: pg_receivewal.c:103 pg_recvlogical.c:78 +#: pg_receivewal.c:106 pg_recvlogical.c:81 #, c-format msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n" msgstr " --create-slot skapa en ny replikeringsslot (angående slot:ens namn, se --slot)\n" -#: pg_receivewal.c:104 pg_recvlogical.c:79 +#: pg_receivewal.c:107 pg_recvlogical.c:82 #, c-format msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n" msgstr " --drop-slot släng replikeringsslot (angående slot:ens namn, se --slot)\n" -#: pg_receivewal.c:117 +#: pg_receivewal.c:252 #, c-format msgid "finished segment at %X/%X (timeline %u)" msgstr "slutförde segment vid %X/%X (tidslinje %u)" -#: pg_receivewal.c:124 +#: pg_receivewal.c:259 #, c-format msgid "stopped log streaming at %X/%X (timeline %u)" msgstr "stoppade logg-strömning vid %X/%X (tidslinje %u)" -#: pg_receivewal.c:140 +#: pg_receivewal.c:275 #, c-format msgid "switched to timeline %u at %X/%X" msgstr "bytte till tidslinje %u vid %X/%X" -#: pg_receivewal.c:150 +#: pg_receivewal.c:285 #, c-format msgid "received interrupt signal, exiting" msgstr "mottog avbrottsignal, avslutar" -#: pg_receivewal.c:186 +#: pg_receivewal.c:317 #, c-format msgid "could not close directory \"%s\": %m" msgstr "kunde inte stänga katalog \"%s\": %m" -#: pg_receivewal.c:272 +#: pg_receivewal.c:384 #, c-format -msgid "segment file \"%s\" has incorrect size %d, skipping" -msgstr "segmentfil \"%s\" har inkorrekt storlek %d, hoppar över" +msgid "segment file \"%s\" has incorrect size %lld, skipping" +msgstr "segmentfil \"%s\" har inkorrekt storlek %lld, hoppar över" -#: pg_receivewal.c:290 +#: pg_receivewal.c:401 #, c-format msgid "could not open compressed file \"%s\": %m" msgstr "kunde inte öppna komprimerad fil \"%s\": %m" -#: pg_receivewal.c:296 +#: pg_receivewal.c:404 #, c-format msgid "could not seek in compressed file \"%s\": %m" msgstr "kunde inte söka i komprimerad fil \"%s\": %m" -#: pg_receivewal.c:304 +#: pg_receivewal.c:410 #, c-format msgid "could not read compressed file \"%s\": %m" msgstr "kunde inte läsa komprimerad fil \"%s\": %m" -#: pg_receivewal.c:307 +#: pg_receivewal.c:413 #, c-format msgid "could not read compressed file \"%s\": read %d of %zu" msgstr "kunde inte läsa komprimerad fil \"%s\": läste %d av %zu" -#: pg_receivewal.c:318 +#: pg_receivewal.c:423 #, c-format msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping" msgstr "komprimerad segmentfil \"%s\" har inkorrekt okomprimerad storlek %d, hoppar över" -#: pg_receivewal.c:422 +#: pg_receivewal.c:451 #, c-format -msgid "starting log streaming at %X/%X (timeline %u)" -msgstr "startar logg-strömning vid %X/%X (tidslinje %u)" +msgid "could not create LZ4 decompression context: %s" +msgstr "kunde inte skapa kontext för LZ4-dekomprimering: %s" + +#: pg_receivewal.c:463 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "kunde inte läsa fil \"%s\": %m" + +#: pg_receivewal.c:481 +#, c-format +msgid "could not decompress file \"%s\": %s" +msgstr "kunde inte dekomprimera fil \"%s\": %s" + +#: pg_receivewal.c:504 +#, c-format +msgid "could not free LZ4 decompression context: %s" +msgstr "kunde inte frigöra kontext för LZ4-dekomprimering: %s" + +#: pg_receivewal.c:509 +#, c-format +msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping" +msgstr "komprimerad segmentfil \"%s\" har inkorrekt okomprimerad storlek %zu, hoppar över" -#: pg_receivewal.c:537 pg_recvlogical.c:736 +#: pg_receivewal.c:514 #, c-format -msgid "invalid port number \"%s\"" -msgstr "ogiltigt portnummer \"%s\"" +msgid "could not check file \"%s\"" +msgstr "kunde inte kontrollera fil \"%s\": %m" -#: pg_receivewal.c:565 pg_recvlogical.c:762 +#: pg_receivewal.c:516 +#, c-format +msgid "This build does not support compression with %s." +msgstr "Detta bygge stöder inte komprimering med %s." + +#: pg_receivewal.c:643 +#, c-format +msgid "starting log streaming at %X/%X (timeline %u)" +msgstr "startar logg-strömning vid %X/%X (tidslinje %u)" + +#: pg_receivewal.c:785 pg_recvlogical.c:785 #, c-format msgid "could not parse end position \"%s\"" msgstr "kunde inte parsa slutposition \"%s\"" -#: pg_receivewal.c:625 +#: pg_receivewal.c:834 #, c-format msgid "cannot use --create-slot together with --drop-slot" msgstr "kan inte använda --create-slot tillsammans med --drop-slot" -#: pg_receivewal.c:643 +#: pg_receivewal.c:850 #, c-format msgid "cannot use --synchronous together with --no-sync" msgstr "kan inte använda --synchronous tillsammans med --no-sync" -#: pg_receivewal.c:719 +#: pg_receivewal.c:860 +#, c-format +msgid "no target directory specified" +msgstr "ingen målkatalog angiven" + +#: pg_receivewal.c:893 +#, c-format +msgid "no value specified for --compress, switching to default" +msgstr "inget värde angivet för --compress, byter till default" + +#: pg_receivewal.c:897 pg_receivewal.c:903 +#, c-format +msgid "this build does not support compression with %s" +msgstr "detta bygge stöder inte komprimering med %s" + +#: pg_receivewal.c:908 +#, c-format +msgid "compression with %s is not yet supported" +msgstr "komprimering med %s stöds inte än" + +#: pg_receivewal.c:953 #, c-format msgid "replication connection using slot \"%s\" is unexpectedly database specific" msgstr "replikeringsanslutning som använder slot \"%s\" är oväntat databasspecifik" -#: pg_receivewal.c:730 pg_recvlogical.c:940 +#: pg_receivewal.c:972 pg_recvlogical.c:955 #, c-format msgid "dropping replication slot \"%s\"" msgstr "slänger replikeringsslot \"%s\"" -#: pg_receivewal.c:741 pg_recvlogical.c:950 +#: pg_receivewal.c:983 pg_recvlogical.c:965 #, c-format msgid "creating replication slot \"%s\"" msgstr "skapar replikeringsslot \"%s\"" -#: pg_receivewal.c:767 pg_recvlogical.c:975 +#: pg_receivewal.c:1012 pg_recvlogical.c:989 #, c-format msgid "disconnected" msgstr "nerkopplad" #. translator: check source for value for %d -#: pg_receivewal.c:773 pg_recvlogical.c:981 +#: pg_receivewal.c:1016 pg_recvlogical.c:993 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "nerkopplad; väntar %d sekunder för att försöka igen" -#: pg_recvlogical.c:73 +#: pg_recvlogical.c:76 #, c-format msgid "" "%s controls PostgreSQL logical decoding streams.\n" @@ -1067,7 +1372,7 @@ msgstr "" "%s styr PostgreSQL:s logiskt avkodade strömmar.\n" "\n" -#: pg_recvlogical.c:77 +#: pg_recvlogical.c:80 #, c-format msgid "" "\n" @@ -1076,17 +1381,17 @@ msgstr "" "\n" "Handling att utföra:\n" -#: pg_recvlogical.c:80 +#: pg_recvlogical.c:83 #, c-format msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n" msgstr " --start starta strömning i en replikeringsslot (angående slot:ens namn, se --slot)\n" -#: pg_recvlogical.c:83 +#: pg_recvlogical.c:86 #, c-format msgid " -f, --file=FILE receive log into this file, - for stdout\n" msgstr " -f, --file=FIL ta emot logg till denna fil, - för stdout\n" -#: pg_recvlogical.c:84 +#: pg_recvlogical.c:87 #, c-format msgid "" " -F --fsync-interval=SECS\n" @@ -1095,12 +1400,12 @@ msgstr "" " -F --fsync-interval=SEK\n" " tid mellan fsync av utdatafil (standard: %d)\n" -#: pg_recvlogical.c:87 +#: pg_recvlogical.c:90 #, c-format msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n" msgstr " -I, --startpos=LSN var i en existerande slot skall strömningen starta\n" -#: pg_recvlogical.c:89 +#: pg_recvlogical.c:92 #, c-format msgid "" " -o, --option=NAME[=VALUE]\n" @@ -1111,32 +1416,37 @@ msgstr "" " skicka vidare flaggan NAMN med ev. värde VÄRDE till\n" " utmatnings-plugin:en\n" -#: pg_recvlogical.c:92 +#: pg_recvlogical.c:95 #, c-format msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n" msgstr " -P, --plugin=PLUGIN använd utmatnings-plugin:en PLUGIN (standard: %s)\n" -#: pg_recvlogical.c:95 +#: pg_recvlogical.c:98 #, c-format msgid " -S, --slot=SLOTNAME name of the logical replication slot\n" msgstr " -S, --slot=SLOTNAMN namn på den logiska replikerings-slotten\n" -#: pg_recvlogical.c:100 +#: pg_recvlogical.c:99 +#, c-format +msgid " -t, --two-phase enable two-phase decoding when creating a slot\n" +msgstr " -t, --two-phase slå på tvåfasavkodning när en slot skapas\n" + +#: pg_recvlogical.c:104 #, c-format msgid " -d, --dbname=DBNAME database to connect to\n" msgstr " -d, --dbname=DBNAMN databas att ansluta till\n" -#: pg_recvlogical.c:133 +#: pg_recvlogical.c:137 #, c-format msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)" msgstr "bekräftar skrivning fram till %X/%X, flush till %X/%X (slot %s)" -#: pg_recvlogical.c:157 receivelog.c:343 +#: pg_recvlogical.c:161 receivelog.c:366 #, c-format msgid "could not send feedback packet: %s" msgstr "kunde inte skicka feedback-paket: %s" -#: pg_recvlogical.c:230 +#: pg_recvlogical.c:229 #, c-format msgid "starting log streaming at %X/%X (slot %s)" msgstr "startar logg-strömning vid %X/%X (slot %s)" @@ -1151,340 +1461,370 @@ msgstr "strömning initierad" msgid "could not open log file \"%s\": %m" msgstr "kunde inte öppna loggfil \"%s\": %m" -#: pg_recvlogical.c:361 receivelog.c:873 +#: pg_recvlogical.c:364 receivelog.c:889 #, c-format msgid "invalid socket: %s" msgstr "ogiltigt uttag: %s" -#: pg_recvlogical.c:414 receivelog.c:901 +#: pg_recvlogical.c:417 receivelog.c:917 #, c-format -msgid "select() failed: %m" -msgstr "select() misslyckades: %m" +msgid "%s() failed: %m" +msgstr "%s() misslyckades: %m" -#: pg_recvlogical.c:421 receivelog.c:951 +#: pg_recvlogical.c:424 receivelog.c:967 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "kunde inte ta emot data från WAL-ström: %s" -#: pg_recvlogical.c:463 pg_recvlogical.c:514 receivelog.c:995 receivelog.c:1061 +#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011 +#: receivelog.c:1074 #, c-format msgid "streaming header too small: %d" msgstr "strömningsheader för liten: %d" -#: pg_recvlogical.c:498 receivelog.c:833 +#: pg_recvlogical.c:501 receivelog.c:849 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "okänd strömningsheader: \"%c\"" -#: pg_recvlogical.c:552 pg_recvlogical.c:564 +#: pg_recvlogical.c:555 pg_recvlogical.c:567 #, c-format -msgid "could not write %u bytes to log file \"%s\": %m" -msgstr "kunde inte skriva %u byte till loggfil \"%s\": %m" +msgid "could not write %d bytes to log file \"%s\": %m" +msgstr "kunde inte skriva %d byte till loggfil \"%s\": %m" -#: pg_recvlogical.c:592 receivelog.c:629 receivelog.c:666 +#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "oväntad terminering av replikeringsström: %s" -#: pg_recvlogical.c:716 -#, c-format -msgid "invalid fsync interval \"%s\"" -msgstr "ogiltigt fsync-intervall \"%s\"" - -#: pg_recvlogical.c:754 +#: pg_recvlogical.c:780 #, c-format msgid "could not parse start position \"%s\"" msgstr "kunde inte parsa startposition \"%s\"" -#: pg_recvlogical.c:843 +#: pg_recvlogical.c:858 #, c-format msgid "no slot specified" msgstr "ingen slot angiven" -#: pg_recvlogical.c:851 +#: pg_recvlogical.c:865 #, c-format msgid "no target file specified" msgstr "ingen målfil angiven" -#: pg_recvlogical.c:859 +#: pg_recvlogical.c:872 #, c-format msgid "no database specified" msgstr "ingen databas angiven" -#: pg_recvlogical.c:867 +#: pg_recvlogical.c:879 #, c-format msgid "at least one action needs to be specified" msgstr "minst en handling måste anges" -#: pg_recvlogical.c:875 +#: pg_recvlogical.c:886 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "kan inte använda --create-slot eller --start tillsammans med --drop-slot" -#: pg_recvlogical.c:883 +#: pg_recvlogical.c:893 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "kan inte använda --create-slot eller --drop-slot tillsammans med --startpos" -#: pg_recvlogical.c:891 +#: pg_recvlogical.c:900 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos får bara anges tillsammans med --start" -#: pg_recvlogical.c:922 +#: pg_recvlogical.c:907 +#, c-format +msgid "--two-phase may only be specified with --create-slot" +msgstr "--two-phase får bara anges tillsammans med --create-slot" + +#: pg_recvlogical.c:939 #, c-format msgid "could not establish database-specific replication connection" msgstr "kunde inte upprätta databasspecifik replikeringsanslutning" -#: pg_recvlogical.c:1021 +#: pg_recvlogical.c:1033 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "slutposition %X/%X nådd av keepalive" -#: pg_recvlogical.c:1024 +#: pg_recvlogical.c:1036 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "slutposition %X/%X nådd av WAL-post vid %X/%X" -#: receivelog.c:69 +#: receivelog.c:68 #, c-format msgid "could not create archive status file \"%s\": %s" msgstr "kunde inte skapa arkiveringsstatusfil \"%s\": %s" -#: receivelog.c:116 +#: receivelog.c:75 +#, c-format +msgid "could not close archive status file \"%s\": %s" +msgstr "kunde inte stänga arkiveringsstatusfil \"%s\": %s" + +#: receivelog.c:123 #, c-format msgid "could not get size of write-ahead log file \"%s\": %s" msgstr "kunde inte hämta storleken på write-ahead-logg-fil \"%s\": %s" -#: receivelog.c:126 +#: receivelog.c:134 #, c-format msgid "could not open existing write-ahead log file \"%s\": %s" msgstr "kunde inte öppna existerande write-ahead-logg-fil \"%s\": %s" -#: receivelog.c:134 +#: receivelog.c:143 #, c-format msgid "could not fsync existing write-ahead log file \"%s\": %s" msgstr "kunde inte fsync:a befintlig write-ahead-logg-fil \"%s\": %s" -#: receivelog.c:148 +#: receivelog.c:158 #, c-format -msgid "write-ahead log file \"%s\" has %d byte, should be 0 or %d" -msgid_plural "write-ahead log file \"%s\" has %d bytes, should be 0 or %d" -msgstr[0] "write-ahead-logg-fil \"%s\" har %d byte, skall vara 0 eller %d" -msgstr[1] "write-ahead-logg-fil \"%s\" har %d byte, skall vara 0 eller %d" +msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d" +msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d" +msgstr[0] "write-ahead-logg-fil \"%s\" har %zd byte, skall vara 0 eller %d" +msgstr[1] "write-ahead-logg-fil \"%s\" har %zd byte, skall vara 0 eller %d" -#: receivelog.c:163 +#: receivelog.c:174 #, c-format msgid "could not open write-ahead log file \"%s\": %s" msgstr "kunde inte öppna write-ahead-logg-fil \"%s\": %s" -#: receivelog.c:189 +#: receivelog.c:208 #, c-format msgid "could not determine seek position in file \"%s\": %s" msgstr "kunde inte fastställa sökposition i fil \"%s\": %s" -#: receivelog.c:203 +#: receivelog.c:223 #, c-format -msgid "not renaming \"%s%s\", segment is not complete" -msgstr "byter inte namn på \"%s%s\", segmentet är inte komplett" +msgid "not renaming \"%s\", segment is not complete" +msgstr "byter inte namn på \"%s\", segmentet är inte komplett" -#: receivelog.c:215 receivelog.c:300 receivelog.c:675 +#: receivelog.c:234 receivelog.c:323 receivelog.c:694 #, c-format msgid "could not close file \"%s\": %s" msgstr "kunde inte stänga fil \"%s\": %s" -#: receivelog.c:272 +#: receivelog.c:295 #, c-format msgid "server reported unexpected history file name for timeline %u: %s" msgstr "servern rapporterade oväntat historikfilnamn för tidslinje %u: %s" -#: receivelog.c:280 +#: receivelog.c:303 #, c-format msgid "could not create timeline history file \"%s\": %s" msgstr "kunde inte skapa tidslinjehistorikfil \"%s\": %s" -#: receivelog.c:287 +#: receivelog.c:310 #, c-format msgid "could not write timeline history file \"%s\": %s" msgstr "kunde inte skriva tidslinjehistorikfil \"%s\": %s" -#: receivelog.c:377 +#: receivelog.c:400 #, c-format msgid "incompatible server version %s; client does not support streaming from server versions older than %s" msgstr "inkompatibel serverversion %s; klienten stöder inte stömning från serverversioner äldre än %s" -#: receivelog.c:386 +#: receivelog.c:409 #, c-format msgid "incompatible server version %s; client does not support streaming from server versions newer than %s" msgstr "inkompatibel serverversion %s; klienten stöder inte stömning från serverversioner nyare än %s" -#: receivelog.c:488 streamutil.c:430 streamutil.c:467 -#, c-format -msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" -msgstr "kunde inte identifiera system: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält" - -#: receivelog.c:495 +#: receivelog.c:514 #, c-format msgid "system identifier does not match between base backup and streaming connection" msgstr "systemidentifieraren matchar inte mellan basbackup och strömningsanslutning" -#: receivelog.c:501 +#: receivelog.c:522 #, c-format msgid "starting timeline %u is not present in the server" msgstr "starttidslinje %u finns inte tillgänglig i servern" -#: receivelog.c:542 +#: receivelog.c:561 #, c-format msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields" msgstr "oväntat svar på TIMELINE_HISTORY-kommando: fick %d rader och %d fält, förväntade %d rader och %d fält" -#: receivelog.c:613 +#: receivelog.c:632 #, c-format msgid "server reported unexpected next timeline %u, following timeline %u" msgstr "servern rapporterade oväntad nästa tidslinje %u, följer på tidslinje %u" -#: receivelog.c:619 +#: receivelog.c:638 #, c-format msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X" msgstr "servern stoppade strömning av tidslinje %u vid %X/%X men rapporterade nästa tidslinje %u skulle börja vid %X/%X" -#: receivelog.c:659 +#: receivelog.c:678 #, c-format msgid "replication stream was terminated before stop point" msgstr "replikeringsström avslutades innan stoppunkt" -#: receivelog.c:705 +#: receivelog.c:724 #, c-format msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields" msgstr "oväntad resultatmängd efter slut-på-tidslinje: fick %d rader och %d fält, förväntade %d rader och %d fält" -#: receivelog.c:714 +#: receivelog.c:733 #, c-format msgid "could not parse next timeline's starting point \"%s\"" msgstr "kunde inte parsa nästa tidslinjens startpunkt \"%s\"" -#: receivelog.c:763 receivelog.c:1015 +#: receivelog.c:781 receivelog.c:1030 walmethods.c:1203 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "kunde inte fsync:a fil \"%s\": %s" -#: receivelog.c:1078 +#: receivelog.c:1091 #, c-format msgid "received write-ahead log record for offset %u with no file open" msgstr "tog emot write-ahead-logg-post för offset %u utan att ha någon öppen fil" -#: receivelog.c:1088 +#: receivelog.c:1101 #, c-format msgid "got WAL data offset %08x, expected %08x" msgstr "fick WAL-data-offset %08x, förväntade %08x" -#: receivelog.c:1122 +#: receivelog.c:1135 #, c-format -msgid "could not write %u bytes to WAL file \"%s\": %s" -msgstr "kunde inte skriva %u byte till WAL-fil \"%s\": %s" +msgid "could not write %d bytes to WAL file \"%s\": %s" +msgstr "kunde inte skriva %d byte till WAL-fil \"%s\": %s" -#: receivelog.c:1147 receivelog.c:1187 receivelog.c:1218 +#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230 #, c-format msgid "could not send copy-end packet: %s" msgstr "kunde inte skicka \"copy-end\"-paket: %s" -#: streamutil.c:160 +#: streamutil.c:159 msgid "Password: " msgstr "Lösenord: " -#: streamutil.c:185 +#: streamutil.c:182 #, c-format msgid "could not connect to server" msgstr "kunde inte ansluta till server" -#: streamutil.c:202 -#, c-format -msgid "could not connect to server: %s" -msgstr "kunde inte ansluta till server: %s" - -#: streamutil.c:231 +#: streamutil.c:225 #, c-format msgid "could not clear search_path: %s" msgstr "kunde inte nollställa search_path: %s" -#: streamutil.c:247 +#: streamutil.c:241 #, c-format msgid "could not determine server setting for integer_datetimes" msgstr "kunde inte lista ut serverns inställning för integer_datetimes" -#: streamutil.c:254 +#: streamutil.c:248 #, c-format msgid "integer_datetimes compile flag does not match server" msgstr "kompileringsflaggan integer_datetimes matchar inte servern" -#: streamutil.c:305 +#: streamutil.c:299 #, c-format msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "kunde inte hämta WAL-segmentstorlek: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält" -#: streamutil.c:315 +#: streamutil.c:309 #, c-format msgid "WAL segment size could not be parsed" msgstr "WAL-segment-storlek kunde inte parsas" -#: streamutil.c:333 +#: streamutil.c:327 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes" msgstr[0] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men fjärrservern rapporterade värdet %d byte" msgstr[1] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men fjärrservern rapporterade värdet %d byte" -#: streamutil.c:378 +#: streamutil.c:372 #, c-format msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "kunde inte hämta gruppaccessflagga: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält" -#: streamutil.c:387 +#: streamutil.c:381 #, c-format msgid "group access flag could not be parsed: %s" msgstr "gruppaccessflagga kunde inte parsas: %s" -#: streamutil.c:544 +#: streamutil.c:424 streamutil.c:461 +#, c-format +msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" +msgstr "kunde inte identifiera system: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält" + +#: streamutil.c:513 +#, c-format +msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" +msgstr "kunde inte läsa replikeringsslot \"%s\": fick %d rader och %d fält, förväntade %d rader och %d fält" + +#: streamutil.c:525 +#, c-format +msgid "could not find replication slot \"%s\"" +msgstr "kunde inte hitta replikeringsslot \"%s\"" + +#: streamutil.c:536 +#, c-format +msgid "expected a physical replication slot, got type \"%s\" instead" +msgstr "förväntade en fysisk replikeringsslot men fick av typen \"%s\" istället" + +#: streamutil.c:550 +#, c-format +msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" +msgstr "kunde inte parsa restart_lsn \"%s\" för replikeringsslot \"%s\"" + +#: streamutil.c:667 #, c-format msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "kunde inte skapa replikeringsslot \"%s\": fick %d rader och %d fält, förväntade %d rader och %d fält" -#: streamutil.c:588 +#: streamutil.c:711 #, c-format msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "kunde inte slänga replikeringsslot \"%s\": fick %d rader och %d fält, förväntade %d rader och %d fält" -#: walmethods.c:438 walmethods.c:927 +#: walmethods.c:720 walmethods.c:1265 msgid "could not compress data" msgstr "kunde inte komprimera data" -#: walmethods.c:470 +#: walmethods.c:749 msgid "could not reset compression stream" msgstr "kunde inte nollställa komprimeringsström" -#: walmethods.c:568 -msgid "could not initialize compression library" -msgstr "kunde inte initierar komprimeringsbibliotek" - -#: walmethods.c:580 +#: walmethods.c:880 msgid "implementation error: tar files can't have more than one open file" msgstr "implementationsfel: tar-filer kan inte ha mer än en öppen fil" -#: walmethods.c:594 +#: walmethods.c:894 msgid "could not create tar header" msgstr "kunde inte skapa tar-header" -#: walmethods.c:608 walmethods.c:648 walmethods.c:843 walmethods.c:854 +#: walmethods.c:910 walmethods.c:950 walmethods.c:1169 walmethods.c:1181 msgid "could not change compression parameters" msgstr "kunde inte ändra komprimeringsparametrar" -#: walmethods.c:730 +#: walmethods.c:1054 msgid "unlink not supported with compression" msgstr "unlink stöds inte med komprimering" -#: walmethods.c:952 +#: walmethods.c:1289 msgid "could not close compression stream" msgstr "kunde inte stänga komprimeringsström" -#~ msgid "backup manifests are not supported by server version %s" -#~ msgstr "backupmanifest stöds inte av serverversion %s" +#, c-format +#~ msgid "" +#~ " --compression-method=METHOD\n" +#~ " method to compress logs\n" +#~ msgstr "" +#~ " --compression-method=METOD\n" +#~ " komprimeringsmetod för loggar\n" + +#, c-format +#~ msgid " -Z, --compress=1-9 compress logs with given compression level\n" +#~ msgstr " -Z, --compress=1-9 komprimera loggar med angiven komprimeringsnivå\n" + +#, c-format +#~ msgid "cannot use --compress with --compression-method=%s" +#~ msgstr "kan inte använda --compress tillsammans med --compress-method=%s" diff --git a/src/bin/pg_checksums/po/de.po b/src/bin/pg_checksums/po/de.po index d30fb2bd55..460b5b5be1 100644 --- a/src/bin/pg_checksums/po/de.po +++ b/src/bin/pg_checksums/po/de.po @@ -1,14 +1,14 @@ # German message translation file for pg_checksums -# Copyright (C) 2021 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Peter Eisentraut , 2018 - 2021. +# Peter Eisentraut , 2018 - 2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-01-12 03:47+0000\n" -"PO-Revision-Date: 2021-01-12 09:21+0100\n" +"POT-Creation-Date: 2022-05-11 15:51+0000\n" +"PO-Revision-Date: 2022-05-11 22:16+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -16,22 +16,37 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "Fatal: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "Warnung: " -#: pg_checksums.c:75 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "Tipp: " + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ungültiger Wert »%s« für Option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s muss im Bereich %d..%d sein" + +#: pg_checksums.c:79 #, c-format msgid "" "%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n" @@ -40,17 +55,17 @@ msgstr "" "%s überprüft die Datenprüfsummen in einem PostgreSQL-Datenbankcluster oder schaltet sie ein oder aus.\n" "\n" -#: pg_checksums.c:76 +#: pg_checksums.c:80 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_checksums.c:77 +#: pg_checksums.c:81 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATENVERZEICHNIS]\n" -#: pg_checksums.c:78 +#: pg_checksums.c:82 #, c-format msgid "" "\n" @@ -59,59 +74,59 @@ msgstr "" "\n" "Optionen:\n" -#: pg_checksums.c:79 +#: pg_checksums.c:83 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]VERZ Datenbankverzeichnis\n" -#: pg_checksums.c:80 +#: pg_checksums.c:84 #, c-format msgid " -c, --check check data checksums (default)\n" msgstr " -c, --check Datenprüfsummen prüfen (Voreinstellung)\n" -#: pg_checksums.c:81 +#: pg_checksums.c:85 #, c-format msgid " -d, --disable disable data checksums\n" msgstr " -d, --disable Datenprüfsummen ausschalten\n" -#: pg_checksums.c:82 +#: pg_checksums.c:86 #, c-format msgid " -e, --enable enable data checksums\n" msgstr " -e, --enable Datenprüfsummen einschalten\n" -#: pg_checksums.c:83 +#: pg_checksums.c:87 #, c-format msgid " -f, --filenode=FILENODE check only relation with specified filenode\n" msgstr " -f, --filenode=FILENODE nur Relation mit angegebenem Filenode prüfen\n" -#: pg_checksums.c:84 +#: pg_checksums.c:88 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n" " geschrieben sind\n" -#: pg_checksums.c:85 +#: pg_checksums.c:89 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress Fortschrittsinformationen zeigen\n" -#: pg_checksums.c:86 +#: pg_checksums.c:90 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose »Verbose«-Modus\n" -#: pg_checksums.c:87 +#: pg_checksums.c:91 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_checksums.c:88 +#: pg_checksums.c:92 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_checksums.c:89 +#: pg_checksums.c:93 #, c-format msgid "" "\n" @@ -124,187 +139,192 @@ msgstr "" "PGDATA verwendet.\n" "\n" -#: pg_checksums.c:91 +#: pg_checksums.c:95 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Berichten Sie Fehler an <%s>.\n" -#: pg_checksums.c:92 +#: pg_checksums.c:96 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_checksums.c:161 +#: pg_checksums.c:153 #, c-format -msgid "%*s/%s MB (%d%%) computed" -msgstr "%*s/%s MB (%d%%) berechnet" +msgid "%lld/%lld MB (%d%%) computed" +msgstr "%lld/%lld MB (%d%%) berechnet" -#: pg_checksums.c:207 +#: pg_checksums.c:200 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" -#: pg_checksums.c:223 +#: pg_checksums.c:214 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "konnte Block %u in Datei »%s« nicht lesen: %m" -#: pg_checksums.c:226 +#: pg_checksums.c:217 #, c-format msgid "could not read block %u in file \"%s\": read %d of %d" msgstr "konnte Block %u in Datei »%s« nicht lesen: %d von %d gelesen" -#: pg_checksums.c:243 +#: pg_checksums.c:240 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X" msgstr "Prüfsummenprüfung fehlgeschlagen in Datei »%s«, Block %u: berechnete Prüfsumme ist %X, aber der Block enthält %X" -#: pg_checksums.c:258 +#: pg_checksums.c:263 #, c-format msgid "seek failed for block %u in file \"%s\": %m" msgstr "seek fehlgeschlagen für Block %u in Datei »%s«: %m" -#: pg_checksums.c:267 +#: pg_checksums.c:270 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "konnte Block %u in Datei »%s« nicht schreiben: %m" -#: pg_checksums.c:270 +#: pg_checksums.c:273 #, c-format msgid "could not write block %u in file \"%s\": wrote %d of %d" msgstr "konnte Block %u in Datei »%s« nicht schreiben: %d von %d geschrieben" -#: pg_checksums.c:283 +#: pg_checksums.c:285 #, c-format msgid "checksums verified in file \"%s\"" msgstr "Prüfsummen wurden überprüft in Datei »%s«" -#: pg_checksums.c:285 +#: pg_checksums.c:287 #, c-format msgid "checksums enabled in file \"%s\"" msgstr "Prüfsummen wurden eingeschaltet in Datei »%s«" -#: pg_checksums.c:310 +#: pg_checksums.c:318 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: pg_checksums.c:337 pg_checksums.c:416 +#: pg_checksums.c:342 pg_checksums.c:415 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" -#: pg_checksums.c:364 +#: pg_checksums.c:366 #, c-format msgid "invalid segment number %d in file name \"%s\"" msgstr "ungültige Segmentnummer %d in Dateiname »%s«" -#: pg_checksums.c:497 -#, c-format -msgid "invalid filenode specification, must be numeric: %s" -msgstr "ungültige Relfilenode-Angabe, muss numerisch sein: %s" - -#: pg_checksums.c:515 pg_checksums.c:531 pg_checksums.c:541 pg_checksums.c:550 +#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_checksums.c:530 +#: pg_checksums.c:527 #, c-format msgid "no data directory specified" msgstr "kein Datenverzeichnis angegeben" -#: pg_checksums.c:539 +#: pg_checksums.c:536 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_checksums.c:549 +#: pg_checksums.c:545 #, c-format msgid "option -f/--filenode can only be used with --check" msgstr "Option -f/--filenode kann nur mit --check verwendet werden" -#: pg_checksums.c:559 +#: pg_checksums.c:553 #, c-format msgid "pg_control CRC value is incorrect" msgstr "CRC-Wert in pg_control ist falsch" -#: pg_checksums.c:565 +#: pg_checksums.c:556 #, c-format msgid "cluster is not compatible with this version of pg_checksums" msgstr "die Cluster sind nicht mit dieser Version von pg_checksums kompatibel" -#: pg_checksums.c:571 +#: pg_checksums.c:560 #, c-format msgid "database cluster is not compatible" msgstr "Datenbank-Cluster ist nicht kompatibel" -#: pg_checksums.c:572 +#: pg_checksums.c:561 #, c-format -msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.\n" -msgstr "Der Datenbank-Cluster wurde mit Blockgröße %u initialisiert, aber pg_checksums wurde mit Blockgröße %u kompiliert.\n" +msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u." +msgstr "Der Datenbank-Cluster wurde mit Blockgröße %u initialisiert, aber pg_checksums wurde mit Blockgröße %u kompiliert." -#: pg_checksums.c:585 +#: pg_checksums.c:573 #, c-format msgid "cluster must be shut down" msgstr "Cluster muss heruntergefahren sein" -#: pg_checksums.c:592 +#: pg_checksums.c:577 #, c-format msgid "data checksums are not enabled in cluster" msgstr "Datenprüfsummen sind im Cluster nicht eingeschaltet" -#: pg_checksums.c:599 +#: pg_checksums.c:581 #, c-format msgid "data checksums are already disabled in cluster" msgstr "Datenprüfsummen sind im Cluster bereits ausgeschaltet" -#: pg_checksums.c:606 +#: pg_checksums.c:585 #, c-format msgid "data checksums are already enabled in cluster" msgstr "Datenprüfsummen sind im Cluster bereits eingeschaltet" -#: pg_checksums.c:632 +#: pg_checksums.c:609 #, c-format msgid "Checksum operation completed\n" msgstr "Prüfsummenoperation abgeschlossen\n" -#: pg_checksums.c:633 +#: pg_checksums.c:610 #, c-format -msgid "Files scanned: %s\n" -msgstr "Überprüfte Dateien: %s\n" +msgid "Files scanned: %lld\n" +msgstr "Überprüfte Dateien: %lld\n" -#: pg_checksums.c:634 +#: pg_checksums.c:611 #, c-format -msgid "Blocks scanned: %s\n" -msgstr "Überprüfte Blöcke: %s\n" +msgid "Blocks scanned: %lld\n" +msgstr "Überprüfte Blöcke: %lld\n" -#: pg_checksums.c:637 +#: pg_checksums.c:614 #, c-format -msgid "Bad checksums: %s\n" -msgstr "Falsche Prüfsummen: %s\n" +msgid "Bad checksums: %lld\n" +msgstr "Falsche Prüfsummen: %lld\n" -#: pg_checksums.c:638 pg_checksums.c:665 +#: pg_checksums.c:615 pg_checksums.c:647 #, c-format msgid "Data checksum version: %u\n" msgstr "Datenprüfsummenversion: %u\n" -#: pg_checksums.c:657 +#: pg_checksums.c:622 +#, c-format +msgid "Files written: %lld\n" +msgstr "Geschriebene Dateien: %lld\n" + +#: pg_checksums.c:623 +#, c-format +msgid "Blocks written: %lld\n" +msgstr "Geschriebene Blöcke: %lld\n" + +#: pg_checksums.c:639 #, c-format msgid "syncing data directory" msgstr "synchronisiere Datenverzeichnis" -#: pg_checksums.c:661 +#: pg_checksums.c:643 #, c-format msgid "updating control file" msgstr "aktualisiere Kontrolldatei" -#: pg_checksums.c:667 +#: pg_checksums.c:649 #, c-format msgid "Checksums enabled in cluster\n" msgstr "Prüfsummen wurden im Cluster eingeschaltet\n" -#: pg_checksums.c:669 +#: pg_checksums.c:651 #, c-format msgid "Checksums disabled in cluster\n" msgstr "Prüfsummen wurden im Cluster ausgeschaltet\n" diff --git a/src/bin/pg_checksums/po/fr.po b/src/bin/pg_checksums/po/fr.po index 40633c5166..dcdb4c74f1 100644 --- a/src/bin/pg_checksums/po/fr.po +++ b/src/bin/pg_checksums/po/fr.po @@ -1,57 +1,77 @@ # LANGUAGE message translation file for pg_verify_checksums -# Copyright (C) 2018 PostgreSQL Global Development Group +# Copyright (C) 2018-2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_verify_checksums (PostgreSQL) package. -# FIRST AUTHOR , 2018. +# +# Use these quotes: « %s » +# +# Guillaume Lelarge , 2018-2022. # msgid "" msgstr "" -"Project-Id-Version: pg_verify_checksums (PostgreSQL) 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-12-23 15:18+0000\n" -"PO-Revision-Date: 2020-12-24 11:45+0100\n" -"Last-Translator: \n" -"Language-Team: \n" +"POT-Creation-Date: 2022-05-14 10:21+0000\n" +"PO-Revision-Date: 2022-05-14 17:15+0200\n" +"Last-Translator: Guillaume Lelarge \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatal : " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "attention : " -#: pg_checksums.c:75 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "astuce : " + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "valeur « %s » invalide pour l'option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s doit être compris entre %d et %d" + +#: pg_checksums.c:79 #, c-format msgid "" "%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n" "\n" msgstr "" -"%s active, désactive ou vérifie les sommes de contrôle de données dans une instance PostgreSQL.\n" +"%s active, désactive ou vérifie les sommes de contrôle de données dans\n" +"une instance PostgreSQL.\n" "\n" -#: pg_checksums.c:76 +#: pg_checksums.c:80 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: pg_checksums.c:77 +#: pg_checksums.c:81 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [RÉP_DONNÉES]\n" -#: pg_checksums.c:78 +#: pg_checksums.c:82 #, c-format msgid "" "\n" @@ -60,57 +80,61 @@ msgstr "" "\n" "Options :\n" -#: pg_checksums.c:79 +#: pg_checksums.c:83 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]REPDONNEES répertoire des données\n" +msgstr " [-D, --pgdata=]REP_DONNEES répertoire des données\n" -#: pg_checksums.c:80 +#: pg_checksums.c:84 #, c-format msgid " -c, --check check data checksums (default)\n" -msgstr " -c, --check vérifie les sommes de contrôle (par défaut)\n" +msgstr " -c, --check vérifie les sommes de contrôle (par défaut)\n" -#: pg_checksums.c:81 +#: pg_checksums.c:85 #, c-format msgid " -d, --disable disable data checksums\n" -msgstr " -d, --disable désactive les sommes de contrôle\n" +msgstr " -d, --disable désactive les sommes de contrôle\n" -#: pg_checksums.c:82 +#: pg_checksums.c:86 #, c-format msgid " -e, --enable enable data checksums\n" -msgstr " -e, --enable active les sommes de contrôle\n" +msgstr " -e, --enable active les sommes de contrôle\n" -#: pg_checksums.c:83 +#: pg_checksums.c:87 #, c-format msgid " -f, --filenode=FILENODE check only relation with specified filenode\n" -msgstr " -f, --filenode=FILENODE vérifie seulement la relation dont l'identifiant relfilenode est indiqué\n" +msgstr "" +" -f, --filenode=FILENODE vérifie seulement la relation dont l'identifiant\n" +" relfilenode est indiqué\n" -#: pg_checksums.c:84 +#: pg_checksums.c:88 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" -msgstr " -N, --no-sync n'attend pas que les modifications soient proprement écrites sur disque\n" +msgstr "" +" -N, --no-sync n'attend pas que les modifications soient\n" +" proprement écrites sur disque\n" -#: pg_checksums.c:85 +#: pg_checksums.c:89 #, c-format msgid " -P, --progress show progress information\n" -msgstr " -P, --progress affiche la progression de l'opération\n" +msgstr " -P, --progress affiche la progression de l'opération\n" -#: pg_checksums.c:86 +#: pg_checksums.c:90 #, c-format msgid " -v, --verbose output verbose messages\n" -msgstr " -v, --verbose affiche des messages verbeux\n" +msgstr " -v, --verbose affiche des messages verbeux\n" -#: pg_checksums.c:87 +#: pg_checksums.c:91 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: pg_checksums.c:88 +#: pg_checksums.c:92 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_checksums.c:89 +#: pg_checksums.c:93 #, c-format msgid "" "\n" @@ -119,210 +143,212 @@ msgid "" "\n" msgstr "" "\n" -"Si aucun répertoire (RÉP_DONNÉES) n'est indiqué, la variable\n" -"d'environnement PGDATA est utilisée.\n" +"Si aucun répertoire (RÉP_DONNÉES) n'est indiqué, la variable d'environnement\n" +"PGDATA est utilisée.\n" "\n" -#: pg_checksums.c:91 +#: pg_checksums.c:95 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapporter les bogues à <%s>.\n" -#: pg_checksums.c:92 +#: pg_checksums.c:96 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil de %s : <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" -#: pg_checksums.c:161 +#: pg_checksums.c:153 #, c-format -msgid "%*s/%s MB (%d%%) computed" -msgstr "%*s/%s Mo (%d%%) traités" +msgid "%lld/%lld MB (%d%%) computed" +msgstr "%lld/%lld Mo (%d%%) traités" -#: pg_checksums.c:207 +#: pg_checksums.c:200 #, c-format msgid "could not open file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier « %s » : %m" -#: pg_checksums.c:223 +#: pg_checksums.c:214 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "n'a pas pu lire le bloc %u dans le fichier « %s » : %m" -#: pg_checksums.c:226 +#: pg_checksums.c:217 #, c-format msgid "could not read block %u in file \"%s\": read %d of %d" msgstr "n'a pas pu lire le bloc %u dans le fichier « %s » : %d lus sur %d" -#: pg_checksums.c:243 +#: pg_checksums.c:240 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X" msgstr "échec de la vérification de la somme de contrôle dans le fichier « %s », bloc %u : somme de contrôle calculée %X, alors que le bloc contient %X" -#: pg_checksums.c:258 +#: pg_checksums.c:263 #, c-format msgid "seek failed for block %u in file \"%s\": %m" msgstr "n'a pas pu rechercher le bloc %u dans le fichier « %s » : %m" -#: pg_checksums.c:267 +#: pg_checksums.c:270 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "n'a pas pu écrire le bloc %u dans le fichier « %s » : %m" -#: pg_checksums.c:270 +#: pg_checksums.c:273 #, c-format msgid "could not write block %u in file \"%s\": wrote %d of %d" msgstr "n'a pas pu écrire le bloc %u du fichier « %s » : a écrit %d octets sur %d" -#: pg_checksums.c:283 +#: pg_checksums.c:285 #, c-format msgid "checksums verified in file \"%s\"" msgstr "sommes de contrôle vérifiées dans le fichier « %s »" -#: pg_checksums.c:285 +#: pg_checksums.c:287 #, c-format msgid "checksums enabled in file \"%s\"" msgstr "sommes de contrôle activées dans le fichier « %s »" -#: pg_checksums.c:310 +#: pg_checksums.c:318 #, c-format msgid "could not open directory \"%s\": %m" msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" -#: pg_checksums.c:337 pg_checksums.c:416 +#: pg_checksums.c:342 pg_checksums.c:415 #, c-format msgid "could not stat file \"%s\": %m" msgstr "n'a pas pu tester le fichier « %s » : %m" -#: pg_checksums.c:364 +#: pg_checksums.c:366 #, c-format msgid "invalid segment number %d in file name \"%s\"" msgstr "numéro de segment %d invalide dans le nom de fichier « %s »" -#: pg_checksums.c:497 -#, c-format -msgid "invalid filenode specification, must be numeric: %s" -msgstr "spécification invalide du relfilnode, doit être numérique : %s" - -#: pg_checksums.c:515 pg_checksums.c:531 pg_checksums.c:541 pg_checksums.c:550 +#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Essayez « %s --help » pour plus d'informations.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_checksums.c:530 +#: pg_checksums.c:527 #, c-format msgid "no data directory specified" msgstr "aucun répertoire de données indiqué" -#: pg_checksums.c:539 +#: pg_checksums.c:536 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_checksums.c:549 +#: pg_checksums.c:545 #, c-format msgid "option -f/--filenode can only be used with --check" msgstr "l'option « -f/--filenode » peut seulement être utilisée avec --check" -#: pg_checksums.c:559 +#: pg_checksums.c:553 #, c-format msgid "pg_control CRC value is incorrect" msgstr "la valeur CRC de pg_control n'est pas correcte" -#: pg_checksums.c:565 +#: pg_checksums.c:556 #, c-format msgid "cluster is not compatible with this version of pg_checksums" msgstr "l'instance n'est pas compatible avec cette version de pg_checksums" -#: pg_checksums.c:571 +#: pg_checksums.c:560 #, c-format msgid "database cluster is not compatible" msgstr "l'instance n'est pas compatible" -#: pg_checksums.c:572 +#: pg_checksums.c:561 #, c-format -msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.\n" -msgstr "L'instance a été initialisée avec une taille de bloc à %u alors que pg_checksums a été compilé avec une taille de bloc à %u.\n" +msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u." +msgstr "L'instance a été initialisée avec une taille de bloc à %u alors que pg_checksums a été compilé avec une taille de bloc à %u." -#: pg_checksums.c:585 +#: pg_checksums.c:573 #, c-format msgid "cluster must be shut down" msgstr "l'instance doit être arrêtée" -#: pg_checksums.c:592 +#: pg_checksums.c:577 #, c-format msgid "data checksums are not enabled in cluster" msgstr "les sommes de contrôle sur les données ne sont pas activées sur cette instance" -#: pg_checksums.c:599 +#: pg_checksums.c:581 #, c-format msgid "data checksums are already disabled in cluster" msgstr "les sommes de contrôle sur les données sont déjà désactivées sur cette instance" -#: pg_checksums.c:606 +#: pg_checksums.c:585 #, c-format msgid "data checksums are already enabled in cluster" msgstr "les sommes de contrôle sur les données sont déjà activées sur cette instance" -#: pg_checksums.c:632 +#: pg_checksums.c:609 #, c-format msgid "Checksum operation completed\n" msgstr "Opération sur les sommes de contrôle terminée\n" -#: pg_checksums.c:633 +#: pg_checksums.c:610 #, c-format -msgid "Files scanned: %s\n" -msgstr "Fichiers parcourus : %s\n" +msgid "Files scanned: %lld\n" +msgstr "Fichiers parcourus : %lld\n" -#: pg_checksums.c:634 +#: pg_checksums.c:611 #, c-format -msgid "Blocks scanned: %s\n" -msgstr "Blocs parcourus : %s\n" +msgid "Blocks scanned: %lld\n" +msgstr "Blocs parcourus : %lld\n" -#: pg_checksums.c:637 +#: pg_checksums.c:614 #, c-format -msgid "Bad checksums: %s\n" -msgstr "Mauvaises sommes de contrôle : %s\n" +msgid "Bad checksums: %lld\n" +msgstr "Mauvaises sommes de contrôle : %lld\n" -#: pg_checksums.c:638 pg_checksums.c:665 +#: pg_checksums.c:615 pg_checksums.c:647 #, c-format msgid "Data checksum version: %u\n" msgstr "Version des sommes de contrôle sur les données : %u\n" -#: pg_checksums.c:657 +#: pg_checksums.c:622 +#, c-format +msgid "Files written: %lld\n" +msgstr "Fichiers écrits : %lld\n" + +#: pg_checksums.c:623 +#, c-format +msgid "Blocks written: %lld\n" +msgstr "Blocs écrits : %lld\n" + +#: pg_checksums.c:639 #, c-format msgid "syncing data directory" msgstr "synchronisation du répertoire des données" -#: pg_checksums.c:661 +#: pg_checksums.c:643 #, c-format msgid "updating control file" msgstr "mise à jour du fichier de contrôle" -#: pg_checksums.c:667 +#: pg_checksums.c:649 #, c-format msgid "Checksums enabled in cluster\n" msgstr "Sommes de contrôle sur les données activées sur cette instance\n" -#: pg_checksums.c:669 +#: pg_checksums.c:651 #, c-format msgid "Checksums disabled in cluster\n" msgstr "Sommes de contrôle sur les données désactivées sur cette instance\n" -#~ msgid "Report bugs to .\n" -#~ msgstr "Rapporter les bogues à .\n" +#~ msgid " -?, --help show this help, then exit\n" +#~ msgstr " -?, --help affiche cette aide puis quitte\n" #~ msgid " -V, --version output version information, then exit\n" #~ msgstr " -V, --version affiche la version puis quitte\n" -#~ msgid " -?, --help show this help, then exit\n" -#~ msgstr " -?, --help affiche cette aide puis quitte\n" +#~ msgid "%s: could not open directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n" #~ msgid "%s: could not open file \"%s\": %s\n" #~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" -#~ msgid "%s: could not open directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n" - #~ msgid "%s: could not stat file \"%s\": %s\n" #~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n" @@ -331,3 +357,18 @@ msgstr "Sommes de contrôle sur les données désactivées sur cette instance\n" #~ msgid "%s: too many command-line arguments (first is \"%s\")\n" #~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" + +#~ msgid "Report bugs to .\n" +#~ msgstr "Rapporter les bogues à .\n" + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" + +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatal : " + +#, c-format +#~ msgid "invalid filenode specification, must be numeric: %s" +#~ msgstr "spécification invalide du relfilnode, doit être numérique : %s" diff --git a/src/bin/pg_checksums/po/ja.po b/src/bin/pg_checksums/po/ja.po index f43465a0e4..e17daaa134 100644 --- a/src/bin/pg_checksums/po/ja.po +++ b/src/bin/pg_checksums/po/ja.po @@ -1,13 +1,13 @@ # Japanese message translation file for pg_checksums -# Copyright (C) 2019 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: pg_checksums (PostgreSQL 13)\n" +"Project-Id-Version: pg_checksums (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:54+0900\n" -"PO-Revision-Date: 2020-08-21 23:22+0900\n" +"POT-Creation-Date: 2022-05-11 14:16+0900\n" +"PO-Revision-Date: 2022-05-10 13:45+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -16,41 +16,56 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:241 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " - -#: ../../../src/common/logging.c:248 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:255 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "警告: " -#: pg_checksums.c:75 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "ヒント: " + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "オプション%sの不正な値\"%s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%sは%d..%dの範囲でなければなりません" + +#: pg_checksums.c:79 #, c-format msgid "" "%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n" "\n" msgstr "" -"%s はPostgreSQLデータベースクラスタにおけるデータチェックサムの有効化、無効化および検証を行います。\n" +"%sはPostgreSQLデータベースクラスタにおけるデータチェックサムの有効化、無効化および検証を行います。\n" "\n" -#: pg_checksums.c:76 +#: pg_checksums.c:80 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_checksums.c:77 +#: pg_checksums.c:81 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATADIR]\n" -#: pg_checksums.c:78 +#: pg_checksums.c:82 #, c-format msgid "" "\n" @@ -59,57 +74,57 @@ msgstr "" "\n" "オプション:\n" -#: pg_checksums.c:79 +#: pg_checksums.c:83 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]DATADIR データディレクトリ\n" -#: pg_checksums.c:80 +#: pg_checksums.c:84 #, c-format msgid " -c, --check check data checksums (default)\n" msgstr " -c, --check データチェックサムを検証(デフォルト)\n" -#: pg_checksums.c:81 +#: pg_checksums.c:85 #, c-format msgid " -d, --disable disable data checksums\n" msgstr " -d, --disable データチェックサムを無効化\n" -#: pg_checksums.c:82 +#: pg_checksums.c:86 #, c-format msgid " -e, --enable enable data checksums\n" msgstr " -e, --enable データチェックサムを有効化\n" -#: pg_checksums.c:83 +#: pg_checksums.c:87 #, c-format msgid " -f, --filenode=FILENODE check only relation with specified filenode\n" msgstr " -f, --filenode=FILENODE 指定したファイルノードのリレーションのみ検証\n" -#: pg_checksums.c:84 +#: pg_checksums.c:88 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync ディスクへの安全な書き込みを待機しない\n" -#: pg_checksums.c:85 +#: pg_checksums.c:89 #, c-format msgid " -P, --progress show progress information\n" -msgstr " -P, --progress 進捗情報を表示\n" +msgstr " -P, --progress 進行状況を表示\n" -#: pg_checksums.c:86 +#: pg_checksums.c:90 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose 冗長メッセージを出力\n" -#: pg_checksums.c:87 +#: pg_checksums.c:91 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: pg_checksums.c:88 +#: pg_checksums.c:92 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: pg_checksums.c:89 +#: pg_checksums.c:93 #, c-format msgid "" "\n" @@ -121,191 +136,202 @@ msgstr "" "データディレクトリ(DATADIR)が指定されない場合、PGDATA環境変数が使用されます。\n" "\n" -#: pg_checksums.c:91 +#: pg_checksums.c:95 #, c-format msgid "Report bugs to <%s>.\n" msgstr "バグは<%s>に報告してください。\n" -#: pg_checksums.c:92 +#: pg_checksums.c:96 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_checksums.c:161 +#: pg_checksums.c:153 #, c-format -msgid "%*s/%s MB (%d%%) computed" -msgstr "%*s/%s MB (%d%%) 完了" +msgid "%lld/%lld MB (%d%%) computed" +msgstr "%lld/%lld MB (%d%%) 完了" -#: pg_checksums.c:207 +#: pg_checksums.c:200 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンできませんでした: %m" -#: pg_checksums.c:223 +#: pg_checksums.c:214 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "ファイル\"%2$s\"で%1$uブロックを読み取れませんでした: %3$m" -#: pg_checksums.c:226 +#: pg_checksums.c:217 #, c-format msgid "could not read block %u in file \"%s\": read %d of %d" msgstr " ファイル\"%2$s\"のブロック%1$uが読み込めませんでした: %4$d中%3$d読み込み済み" -#: pg_checksums.c:243 +#: pg_checksums.c:240 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X" msgstr "ファイル\"%s\" ブロック%uでチェックサム検証が失敗: 算出したチェックサムは%X 、しかしブロック上の値は%X" -#: pg_checksums.c:258 +#: pg_checksums.c:263 #, c-format msgid "seek failed for block %u in file \"%s\": %m" msgstr "ファイル\"%2$s\" ブロック%1$uへのシーク失敗: %3$m" -#: pg_checksums.c:267 +#: pg_checksums.c:270 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "ファイル\"%2$s\"で%1$uブロックが書き出せませんでした: %3$m" -#: pg_checksums.c:270 +#: pg_checksums.c:273 #, c-format msgid "could not write block %u in file \"%s\": wrote %d of %d" msgstr "ファイル\"%2$s\"のブロック%1$uの書き込みに失敗しました: %4$dバイト中%3$dバイトのみ書き込みました" -#: pg_checksums.c:283 +#: pg_checksums.c:285 #, c-format msgid "checksums verified in file \"%s\"" msgstr "ファイル\"%s\"のチェックサムは検証されました" -#: pg_checksums.c:285 +#: pg_checksums.c:287 #, c-format msgid "checksums enabled in file \"%s\"" msgstr "ファイル\"%s\"のチェックサムは有効化されました" -#: pg_checksums.c:310 +#: pg_checksums.c:318 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" -#: pg_checksums.c:337 pg_checksums.c:416 +#: pg_checksums.c:342 pg_checksums.c:415 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"のstatに失敗しました: %m" -#: pg_checksums.c:364 +#: pg_checksums.c:366 #, c-format msgid "invalid segment number %d in file name \"%s\"" msgstr "ファイル名\"%2$s\"の不正なセグメント番号%1$d" -#: pg_checksums.c:497 -#, c-format -msgid "invalid filenode specification, must be numeric: %s" -msgstr "不正なファイルノード指定、数値である必要があります: %s" - -#: pg_checksums.c:515 pg_checksums.c:531 pg_checksums.c:541 pg_checksums.c:550 +#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "詳細については\"%s --help\"を実行してください。\n" +msgid "Try \"%s --help\" for more information." +msgstr "詳細については\"%s --help\"を実行してください。" -#: pg_checksums.c:530 +#: pg_checksums.c:527 #, c-format msgid "no data directory specified" msgstr "データディレクトリが指定されていません" -#: pg_checksums.c:539 +#: pg_checksums.c:536 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数が多すぎます (最初は\"%s\")" -#: pg_checksums.c:549 +#: pg_checksums.c:545 #, c-format msgid "option -f/--filenode can only be used with --check" msgstr "オプション-f/--filenodeは--checkを指定したときのみ指定可能" -#: pg_checksums.c:559 +#: pg_checksums.c:553 #, c-format msgid "pg_control CRC value is incorrect" msgstr "pg_controlのCRC値が正しくありません" -#: pg_checksums.c:565 +#: pg_checksums.c:556 #, c-format msgid "cluster is not compatible with this version of pg_checksums" msgstr "クラスタはこのバージョンのpg_checksumsと互換性がありません" -#: pg_checksums.c:571 +#: pg_checksums.c:560 #, c-format msgid "database cluster is not compatible" msgstr "データベースクラスタが非互換です" -#: pg_checksums.c:572 +#: pg_checksums.c:561 #, c-format -msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.\n" -msgstr "データベースクラスタはブロックサイズ%uで初期化されています、しかしpg_checksumsはブロックサイズ%uでコンパイルされています。\n" +msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u." +msgstr "データベースクラスタはブロックサイズ%uで初期化されています、しかしpg_checksumsはブロックサイズ%uでコンパイルされています。" -#: pg_checksums.c:585 +#: pg_checksums.c:573 #, c-format msgid "cluster must be shut down" msgstr "クラスタはシャットダウンされていなければなりません" -#: pg_checksums.c:592 +#: pg_checksums.c:577 #, c-format msgid "data checksums are not enabled in cluster" msgstr "クラスタのデータチェックサムは有効になっていません" -#: pg_checksums.c:599 +#: pg_checksums.c:581 #, c-format msgid "data checksums are already disabled in cluster" msgstr "クラスタのデータチェックサムはすでに無効になっています" -#: pg_checksums.c:606 +#: pg_checksums.c:585 #, c-format msgid "data checksums are already enabled in cluster" msgstr "クラスタのデータチェックサムはすでに有効になっています" -#: pg_checksums.c:632 +#: pg_checksums.c:609 #, c-format msgid "Checksum operation completed\n" msgstr "チェックサム操作が完了しました\n" -#: pg_checksums.c:633 +#: pg_checksums.c:610 #, c-format -msgid "Files scanned: %s\n" -msgstr "スキャンしたファイル数: %s\n" +msgid "Files scanned: %lld\n" +msgstr "スキャンしたファイル数: %lld\n" -#: pg_checksums.c:634 +#: pg_checksums.c:611 #, c-format -msgid "Blocks scanned: %s\n" -msgstr "スキャンしたブロック数: %s\n" +msgid "Blocks scanned: %lld\n" +msgstr "スキャンしたブロック数: %lld\n" -#: pg_checksums.c:637 +#: pg_checksums.c:614 #, c-format -msgid "Bad checksums: %s\n" -msgstr "不正なチェックサム数: %s\n" +msgid "Bad checksums: %lld\n" +msgstr "不正なチェックサム数: %lld\n" -#: pg_checksums.c:638 pg_checksums.c:665 +#: pg_checksums.c:615 pg_checksums.c:647 #, c-format -msgid "Data checksum version: %d\n" -msgstr "データチェックサムバージョン: %d\n" +msgid "Data checksum version: %u\n" +msgstr "データチェックサムバージョン: %u\n" -#: pg_checksums.c:657 +#: pg_checksums.c:622 +#, c-format +msgid "Files written: %lld\n" +msgstr "スキャンしたファイル数: %lld\n" + +#: pg_checksums.c:623 +#, c-format +msgid "Blocks written: %lld\n" +msgstr "スキャンしたブロック数: %lld\n" + +#: pg_checksums.c:639 #, c-format msgid "syncing data directory" msgstr "データディレクトリを同期しています" -#: pg_checksums.c:661 +#: pg_checksums.c:643 #, c-format msgid "updating control file" msgstr "コントロールファイルを更新しています" -#: pg_checksums.c:667 +#: pg_checksums.c:649 #, c-format msgid "Checksums enabled in cluster\n" msgstr "クラスタのチェックサムが有効化されました\n" -#: pg_checksums.c:669 +#: pg_checksums.c:651 #, c-format msgid "Checksums disabled in cluster\n" msgstr "クラスタのチェックサムが無効化されました\n" +#~ msgid "fatal: " +#~ msgstr "致命的エラー: " + +#~ msgid "invalid filenode specification, must be numeric: %s" +#~ msgstr "不正なファイルノード指定、数値である必要があります: %s" + #~ msgid "could not update checksum of block %u in file \"%s\": %m" #~ msgstr "ファイル\"%2$s\" ブロック%1$uのチェックサム更新失敗: %3$m" diff --git a/src/bin/pg_checksums/po/sv.po b/src/bin/pg_checksums/po/sv.po index ce92a966e3..8e92a9e544 100644 --- a/src/bin/pg_checksums/po/sv.po +++ b/src/bin/pg_checksums/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_checksums # Copyright (C) 2019 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_checksums (PostgreSQL) package. -# Dennis Björklund , 2019, 2020. +# Dennis Björklund , 2019, 2020, 2021, 2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-11 01:17+0000\n" -"PO-Revision-Date: 2020-04-11 07:46+0200\n" +"POT-Creation-Date: 2022-05-09 18:52+0000\n" +"PO-Revision-Date: 2022-05-09 21:46+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,22 +17,37 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatalt: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "varning: " -#: pg_checksums.c:75 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "tips: " + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s måste vara i intervallet %d..%d" + +#: pg_checksums.c:79 #, c-format msgid "" "%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n" @@ -41,17 +56,17 @@ msgstr "" "%s slår på, slår av eller verifierar datakontrollsummor i ett PostgreSQL databaskluster.\n" "\n" -#: pg_checksums.c:76 +#: pg_checksums.c:80 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: pg_checksums.c:77 +#: pg_checksums.c:81 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [FLAGGA]... [DATAKATALOG]\n" -#: pg_checksums.c:78 +#: pg_checksums.c:82 #, c-format msgid "" "\n" @@ -60,57 +75,57 @@ msgstr "" "\n" "Flaggor:\n" -#: pg_checksums.c:79 +#: pg_checksums.c:83 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]DATAKAT datakatalog\n" -#: pg_checksums.c:80 +#: pg_checksums.c:84 #, c-format msgid " -c, --check check data checksums (default)\n" msgstr " -c, --check kontrollera datakontrollsummor (standard)\n" -#: pg_checksums.c:81 +#: pg_checksums.c:85 #, c-format msgid " -d, --disable disable data checksums\n" msgstr " -d, --disable slå av datakontrollsummor\n" -#: pg_checksums.c:82 +#: pg_checksums.c:86 #, c-format msgid " -e, --enable enable data checksums\n" msgstr " -e, --enable slå på datakontrollsummor\n" -#: pg_checksums.c:83 +#: pg_checksums.c:87 #, c-format msgid " -f, --filenode=FILENODE check only relation with specified filenode\n" msgstr " -f, --filenode=FILNOD kontrollera bara relation med angiven filnod\n" -#: pg_checksums.c:84 +#: pg_checksums.c:88 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync vänta inte på att ändingar säkert skrivits till disk\n" -#: pg_checksums.c:85 +#: pg_checksums.c:89 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress visa förloppsinformation\n" -#: pg_checksums.c:86 +#: pg_checksums.c:90 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose visa utförliga meddelanden\n" -#: pg_checksums.c:87 +#: pg_checksums.c:91 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_checksums.c:88 +#: pg_checksums.c:92 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: pg_checksums.c:89 +#: pg_checksums.c:93 #, c-format msgid "" "\n" @@ -123,32 +138,32 @@ msgstr "" "PGDATA för detta syfte.\n" "\n" -#: pg_checksums.c:91 +#: pg_checksums.c:95 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapportera fel till <%s>.\n" -#: pg_checksums.c:92 +#: pg_checksums.c:96 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_checksums.c:161 +#: pg_checksums.c:153 #, c-format -msgid "%*s/%s MB (%d%%) computed" -msgstr "%*s/%s MB (%d%%) beräknad" +msgid "%lld/%lld MB (%d%%) computed" +msgstr "%lld/%lld MB (%d%%) beräknad" -#: pg_checksums.c:204 +#: pg_checksums.c:200 #, c-format msgid "could not open file \"%s\": %m" msgstr "kunde inte öppna fil \"%s\": %m" -#: pg_checksums.c:220 +#: pg_checksums.c:214 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "kunde inte läsa block %u i fil \"%s\": %m" -#: pg_checksums.c:223 +#: pg_checksums.c:217 #, c-format msgid "could not read block %u in file \"%s\": read %d of %d" msgstr "kunde inte läsa block %u i fil \"%s\": läste %d av %d" @@ -158,55 +173,50 @@ msgstr "kunde inte läsa block %u i fil \"%s\": läste %d av %d" msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X" msgstr "verifiering av kontrollsumma misslyckades i fil \"%s\", block %u: beräknad kontrollsumma är %X men blocket innehåller %X" -#: pg_checksums.c:255 +#: pg_checksums.c:263 #, c-format msgid "seek failed for block %u in file \"%s\": %m" msgstr "seek misslyckades för block %u i fil \"%s\": %m" -#: pg_checksums.c:264 +#: pg_checksums.c:270 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "kunde inte skriva block %u i fil \"%s\": %m" -#: pg_checksums.c:267 +#: pg_checksums.c:273 #, c-format msgid "could not write block %u in file \"%s\": wrote %d of %d" msgstr "kunde inte skriva block %u i fil \"%s\": skrev %d av %d" -#: pg_checksums.c:280 +#: pg_checksums.c:285 #, c-format msgid "checksums verified in file \"%s\"" msgstr "kontrollsummor verifierade i fil \"%s\"" -#: pg_checksums.c:282 +#: pg_checksums.c:287 #, c-format msgid "checksums enabled in file \"%s\"" msgstr "kontrollsummor påslagen i fil \"%s\"" -#: pg_checksums.c:307 +#: pg_checksums.c:318 #, c-format msgid "could not open directory \"%s\": %m" msgstr "kunde inte öppna katalog \"%s\": %m" -#: pg_checksums.c:334 pg_checksums.c:413 +#: pg_checksums.c:342 pg_checksums.c:415 #, c-format msgid "could not stat file \"%s\": %m" msgstr "kunde inte göra stat() på fil \"%s\": %m" -#: pg_checksums.c:361 +#: pg_checksums.c:366 #, c-format msgid "invalid segment number %d in file name \"%s\"" msgstr "ogiltigt segmentnummer %d i filnamn \"%s\"" -#: pg_checksums.c:494 +#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546 #, c-format -msgid "invalid filenode specification, must be numeric: %s" -msgstr "ogiltigt angiven filnod, måste vara numerisk: %s" - -#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:547 -#, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Försök med \"%s --help\" för mer information.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." #: pg_checksums.c:527 #, c-format @@ -218,92 +228,102 @@ msgstr "ingen datakatalog angiven" msgid "too many command-line arguments (first is \"%s\")" msgstr "för många kommandoradsargument (första är \"%s\")" -#: pg_checksums.c:546 +#: pg_checksums.c:545 #, c-format msgid "option -f/--filenode can only be used with --check" msgstr "inställningen -f/--filenode tillåts bara med --check" -#: pg_checksums.c:556 +#: pg_checksums.c:553 #, c-format msgid "pg_control CRC value is incorrect" msgstr "pg_control CRC-värde är inkorrekt" -#: pg_checksums.c:562 +#: pg_checksums.c:556 #, c-format msgid "cluster is not compatible with this version of pg_checksums" msgstr "klustret är inte kompatibelt med denna version av pg_checksums" -#: pg_checksums.c:568 +#: pg_checksums.c:560 #, c-format msgid "database cluster is not compatible" msgstr "databasklustret är inte kompatibelt" -#: pg_checksums.c:569 +#: pg_checksums.c:561 #, c-format -msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.\n" -msgstr "Databasklustret initierades med blockstorlek %u men pg_checksums kompilerades med blockstorlek %u.\n" +msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u." +msgstr "Databasklustret initierades med blockstorlek %u men pg_checksums kompilerades med blockstorlek %u." -#: pg_checksums.c:582 +#: pg_checksums.c:573 #, c-format msgid "cluster must be shut down" msgstr "klustret måste stängas ner" -#: pg_checksums.c:589 +#: pg_checksums.c:577 #, c-format msgid "data checksums are not enabled in cluster" msgstr "datakontrollsummor är inte påslaget i klustret" -#: pg_checksums.c:596 +#: pg_checksums.c:581 #, c-format msgid "data checksums are already disabled in cluster" msgstr "datakontrollsummor är redan avslaget i klustret" -#: pg_checksums.c:603 +#: pg_checksums.c:585 #, c-format msgid "data checksums are already enabled in cluster" msgstr "datakontrollsummor är redan påslagna i klustret" -#: pg_checksums.c:632 +#: pg_checksums.c:609 #, c-format msgid "Checksum operation completed\n" msgstr "Kontrollsummeoperation avslutad\n" -#: pg_checksums.c:633 +#: pg_checksums.c:610 +#, c-format +msgid "Files scanned: %lld\n" +msgstr "Skannade filer: %lld\n" + +#: pg_checksums.c:611 +#, c-format +msgid "Blocks scanned: %lld\n" +msgstr "Skannade block: %lld\n" + +#: pg_checksums.c:614 #, c-format -msgid "Files scanned: %s\n" -msgstr "Skannade filer: %s\n" +msgid "Bad checksums: %lld\n" +msgstr "Felaktiga kontrollsummor: %lld\n" -#: pg_checksums.c:634 +#: pg_checksums.c:615 pg_checksums.c:647 #, c-format -msgid "Blocks scanned: %s\n" -msgstr "Skannade block: %s\n" +msgid "Data checksum version: %u\n" +msgstr "Datakontrollsummeversion: %u\n" -#: pg_checksums.c:637 +#: pg_checksums.c:622 #, c-format -msgid "Bad checksums: %s\n" -msgstr "Felaktiga kontrollsummor: %s\n" +msgid "Files written: %lld\n" +msgstr "Skrivna filer: %lld\n" -#: pg_checksums.c:638 pg_checksums.c:665 +#: pg_checksums.c:623 #, c-format -msgid "Data checksum version: %d\n" -msgstr "Datakontrollsummeversion: %d\n" +msgid "Blocks written: %lld\n" +msgstr "Skrivna block: %lld\n" -#: pg_checksums.c:657 +#: pg_checksums.c:639 #, c-format msgid "syncing data directory" msgstr "synkar datakatalogen" -#: pg_checksums.c:661 +#: pg_checksums.c:643 #, c-format msgid "updating control file" msgstr "uppdaterar kontrollfil" -#: pg_checksums.c:667 +#: pg_checksums.c:649 #, c-format msgid "Checksums enabled in cluster\n" msgstr "Kontrollsummor påslaget i klustret\n" -#: pg_checksums.c:669 +#: pg_checksums.c:651 #, c-format msgid "Checksums disabled in cluster\n" msgstr "Kontrollsummor avslaget i klustret\n" diff --git a/src/bin/pg_config/po/el.po b/src/bin/pg_config/po/el.po index d17d2b999b..5f96e8a2f7 100644 --- a/src/bin/pg_config/po/el.po +++ b/src/bin/pg_config/po/el.po @@ -3,19 +3,21 @@ # This file is distributed under the same license as the pg_config (PostgreSQL) package. # Georgios Kokolatos , 2021 # +# +# msgid "" msgstr "" "Project-Id-Version: pg_config (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-25 05:46+0000\n" -"PO-Revision-Date: 2021-05-04 14:33+0200\n" +"POT-Creation-Date: 2021-07-20 03:45+0000\n" +"PO-Revision-Date: 2021-07-20 10:27+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.3\n" +"X-Generator: Poedit 3.0\n" #: ../../common/config_info.c:134 ../../common/config_info.c:142 #: ../../common/config_info.c:150 ../../common/config_info.c:158 @@ -32,32 +34,32 @@ msgstr "δεν ήταν δυνατή η αναγνώριση του τρέχον #: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" -msgstr "μη έγκυρο δυαδικό αρχείο “%s”" +msgstr "μη έγκυρο δυαδικό αρχείο «%s»" #: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" -msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου “%s”" +msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου «%s»" #: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" -msgstr "δεν βρέθηκε το αρχείο “%s” για να εκτελεστεί" +msgstr "δεν βρέθηκε το αρχείο «%s» για να εκτελεστεί" #: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" -msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο “%s”: %m" +msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" #: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου “%s”: %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου «%s»: %m" #: ../../common/exec.c:409 #, c-format msgid "%s() failed: %m" -msgstr "%s () απέτυχε: %m" +msgstr "%s() απέτυχε: %m" #: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 msgid "out of memory" @@ -85,7 +87,7 @@ msgid "" " %s [OPTION]...\n" "\n" msgstr "" -" %s [ΕΠΙΛΟΓΗ]…\n" +" %s [ΕΠΙΛΟΓΗ]...\n" "\n" #: pg_config.c:77 @@ -96,17 +98,17 @@ msgstr "Επιλογές:\n" #: pg_config.c:78 #, c-format msgid " --bindir show location of user executables\n" -msgstr " —bindir εμφάνισε τη τοποθεσία των εκτελέσιμων αρχείων του χρήστη\n" +msgstr " --bindir εμφάνισε τη τοποθεσία των εκτελέσιμων αρχείων του χρήστη\n" #: pg_config.c:79 #, c-format msgid " --docdir show location of documentation files\n" -msgstr " —docdir εμφάνισε τη τοποθεσία των αρχείων τεκμηρίωσης\n" +msgstr " --docdir εμφάνισε τη τοποθεσία των αρχείων τεκμηρίωσης\n" #: pg_config.c:80 #, c-format msgid " --htmldir show location of HTML documentation files\n" -msgstr " —htmldir εμφάνισε τη τοποθεσία των αρχείων τεκμηρίωσης HTML\n" +msgstr " --htmldir εμφάνισε τη τοποθεσία των αρχείων τεκμηρίωσης HTML\n" #: pg_config.c:81 #, c-format @@ -114,53 +116,53 @@ msgid "" " --includedir show location of C header files of the client\n" " interfaces\n" msgstr "" -" —includedir εμφάνισε τη τοποθεσία των αρχείων κεφαλίδας C\n" +" --includedir εμφάνισε τη τοποθεσία των αρχείων κεφαλίδας C\n" " των διεπαφών πελάτη\n" #: pg_config.c:83 #, c-format msgid " --pkgincludedir show location of other C header files\n" -msgstr " —pkgincludedir εμφάνισε τη τοποθεσία άλλων αρχείων κεφαλίδας C\n" +msgstr " --pkgincludedir εμφάνισε τη τοποθεσία άλλων αρχείων κεφαλίδας C\n" #: pg_config.c:84 #, c-format msgid " --includedir-server show location of C header files for the server\n" -msgstr " —includedir-server εμφάνισε τη τοποθεσία των αρχείων κεφαλίδας C για τον διακομιστή\n" +msgstr " --includedir-server εμφάνισε τη τοποθεσία των αρχείων κεφαλίδας C για τον διακομιστή\n" #: pg_config.c:85 #, c-format msgid " --libdir show location of object code libraries\n" -msgstr " —libdir εμφάνισε τη τοποθεσία των βιβλιοθηκών κώδικα αντικειμένων\n" +msgstr " --libdir εμφάνισε τη τοποθεσία των βιβλιοθηκών κώδικα αντικειμένων\n" #: pg_config.c:86 #, c-format msgid " --pkglibdir show location of dynamically loadable modules\n" -msgstr " —pkglibdir εμφάνισε τη τοποθεσία των δυναμικά φορτώσιμων ενοτήτων\n" +msgstr " --pkglibdir εμφάνισε τη τοποθεσία των δυναμικά φορτώσιμων ενοτήτων\n" #: pg_config.c:87 #, c-format msgid " --localedir show location of locale support files\n" -msgstr " —localedir εμφάνισε τη τοποθεσία των αρχείων υποστήριξης εντοπιότητας\n" +msgstr " --localedir εμφάνισε τη τοποθεσία των αρχείων υποστήριξης εντοπιότητας\n" #: pg_config.c:88 #, c-format msgid " --mandir show location of manual pages\n" -msgstr " —mandir εμφάνισε τη τοποθεσία των σελίδων τεκμηρίωσης\n" +msgstr " --mandir εμφάνισε τη τοποθεσία των σελίδων τεκμηρίωσης\n" #: pg_config.c:89 #, c-format msgid " --sharedir show location of architecture-independent support files\n" -msgstr " —sharedir εμφάνισε τη τοποθεσία των ανεξάρτητων από την αρχιτεκτονική αρχείων υποστήριξης\n" +msgstr " --sharedir εμφάνισε τη τοποθεσία των ανεξάρτητων από την αρχιτεκτονική αρχείων υποστήριξης\n" #: pg_config.c:90 #, c-format msgid " --sysconfdir show location of system-wide configuration files\n" -msgstr " —sysconfdir εμφάνισε την τοποθεσία των αρχείων ρύθμισης παραμέτρων όλου του συστήματος\n" +msgstr " --sysconfdir εμφάνισε την τοποθεσία των αρχείων ρύθμισης παραμέτρων όλου του συστήματος\n" #: pg_config.c:91 #, c-format msgid " --pgxs show location of extension makefile\n" -msgstr " —pgxs εμφάνισε τη τοποθεσία του makefile επέκτασης\n" +msgstr " --pgxs εμφάνισε τη τοποθεσία του makefile επέκτασης\n" #: pg_config.c:92 #, c-format @@ -168,60 +170,59 @@ msgid "" " --configure show options given to \"configure\" script when\n" " PostgreSQL was built\n" msgstr "" -" —configure εμφάνισε τις παραμέτρους που δόθηκαν ώστε να “ρυθμιστεί” το σενάριο\n" +" --configure εμφάνισε τις παραμέτρους που δόθηκαν ώστε να «ρυθμιστεί» το σενάριο\n" " κατά την κατασκευή της PostgreSQL\n" #: pg_config.c:94 #, c-format msgid " --cc show CC value used when PostgreSQL was built\n" -msgstr " —cc εμφάνισε την τιμή CC που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" +msgstr " --cc εμφάνισε την τιμή CC που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" #: pg_config.c:95 #, c-format msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n" -msgstr " —cppflags εμφάνισε την τιμή CPPFLAGS που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" +msgstr " --cppflags εμφάνισε την τιμή CPPFLAGS που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" #: pg_config.c:96 #, c-format msgid " --cflags show CFLAGS value used when PostgreSQL was built\n" msgstr "" -" —cflags εμφάνισε την τιμή CFLAGS που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" -"\n" +" --cflags εμφάνισε την τιμή CFLAGS που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" #: pg_config.c:97 #, c-format msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n" -msgstr " —cflags_sl εμφάνισε την τιμή CFLAGS_SL που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" +msgstr " --cflags_sl εμφάνισε την τιμή CFLAGS_SL που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" #: pg_config.c:98 #, c-format msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n" -msgstr " —ldflags εμφάνισε την τιμή LDFLAGS που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" +msgstr " --ldflags εμφάνισε την τιμή LDFLAGS που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" #: pg_config.c:99 #, c-format msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n" -msgstr " —ldflags_ex εμφάνισε την τιμή LDFLAGS_EX που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" +msgstr " --ldflags_ex εμφάνισε την τιμή LDFLAGS_EX που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" #: pg_config.c:100 #, c-format msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n" -msgstr " —ldflags_sl εμφάνισε την τιμή LDFLAGS_SL που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" +msgstr " --ldflags_sl εμφάνισε την τιμή LDFLAGS_SL που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" #: pg_config.c:101 #, c-format msgid " --libs show LIBS value used when PostgreSQL was built\n" -msgstr " —libs εμφάνισε την τιμή LIBS που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" +msgstr " --libs εμφάνισε την τιμή LIBS που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" #: pg_config.c:102 #, c-format msgid " --version show the PostgreSQL version\n" -msgstr " —version εμφάνισε την έκδοση PostgreSQL\n" +msgstr " --version εμφάνισε την έκδοση PostgreSQL\n" #: pg_config.c:103 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, —help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" #: pg_config.c:104 #, c-format @@ -247,7 +248,7 @@ msgstr "%s αρχική σελίδα: <%s>\n" #: pg_config.c:112 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Δοκιμάστε “%s —help” για περισσότερες πληροφορίες.\n" +msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n" #: pg_config.c:154 #, c-format diff --git a/src/bin/pg_config/po/es.po b/src/bin/pg_config/po/es.po index d5aa1cf07d..37558806b9 100644 --- a/src/bin/pg_config/po/es.po +++ b/src/bin/pg_config/po/es.po @@ -1,6 +1,6 @@ # pg_config spanish translation # -# Copyright (c) 2004-2019, PostgreSQL Global Development Group +# Copyright (c) 2004-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Alvaro Herrera , 2004-2013 @@ -8,7 +8,7 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_config (PostgreSQL) 12\n" +"Project-Id-Version: pg_config (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2021-05-14 19:46+0000\n" "PO-Revision-Date: 2021-05-20 23:11-0500\n" diff --git a/src/bin/pg_config/po/fr.po b/src/bin/pg_config/po/fr.po index aa7b5e0806..0fb56a72ab 100644 --- a/src/bin/pg_config/po/fr.po +++ b/src/bin/pg_config/po/fr.po @@ -1,23 +1,27 @@ -# translation of pg_config.po to fr_fr -# french message translation file for pg_config +# LANGUAGE message translation file for pg_config +# Copyright (C) 2004-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_config (PostgreSQL) package. # # Use these quotes: « %s » # # Guillaume Lelarge , 2004-2009. # Stéphane Schildknecht , 2009. +# Guillaume Lelarge , 2010-2022. +# msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-26 06:46+0000\n" -"PO-Revision-Date: 2021-04-26 11:37+0200\n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" "Last-Translator: Guillaume Lelarge \n" -"Language-Team: PostgreSQLfr \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" #: ../../common/config_info.c:134 ../../common/config_info.c:142 #: ../../common/config_info.c:150 ../../common/config_info.c:158 @@ -109,8 +113,7 @@ msgstr " --docdir affiche l'emplacement des fichiers de documentat #, c-format msgid " --htmldir show location of HTML documentation files\n" msgstr "" -" --htmldir affiche l'emplacement des fichiers de documentation\n" -" HTML\n" +" --htmldir affiche l'emplacement des fichiers de documentation HTML\n" #: pg_config.c:81 #, c-format @@ -125,8 +128,7 @@ msgstr "" #, c-format msgid " --pkgincludedir show location of other C header files\n" msgstr "" -" --pkgincludedir affiche l'emplacement des autres fichiers d'en-tête\n" -" C\n" +" --pkgincludedir affiche l'emplacement des autres fichiers d'en-tête C\n" #: pg_config.c:84 #, c-format @@ -185,7 +187,7 @@ msgid "" " PostgreSQL was built\n" msgstr "" " --configure affiche les options passées au script « configure »\n" -" à la construction de PostgreSQL\n" +" lors de la construction de PostgreSQL\n" #: pg_config.c:94 #, c-format @@ -272,7 +274,7 @@ msgstr "Rapporter les bogues à <%s>.\n" #: pg_config.c:106 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil %s : %s\n" +msgstr "Page d'accueil de %s : <%s>\n" #: pg_config.c:112 #, c-format @@ -282,7 +284,7 @@ msgstr "Essayer « %s --help » pour plus d'informations.\n" #: pg_config.c:154 #, c-format msgid "%s: could not find own program executable\n" -msgstr "%s : n'a pas pu trouver son propre exécutable\n" +msgstr "%s : n'a pas pu trouver l'exécutable du programme\n" #: pg_config.c:181 #, c-format diff --git a/src/bin/pg_config/po/ja.po b/src/bin/pg_config/po/ja.po index 0252ccfac0..dac653c511 100644 --- a/src/bin/pg_config/po/ja.po +++ b/src/bin/pg_config/po/ja.po @@ -1,14 +1,14 @@ # Japanese message translation file for pg_config -# Copyright (C) 2019 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # Shigehiro Honda , 2005 # msgid "" msgstr "" -"Project-Id-Version: pg_config (PostgreSQL 13)\n" +"Project-Id-Version: pg_config (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:54+0900\n" -"PO-Revision-Date: 2020-09-13 08:56+0200\n" +"POT-Creation-Date: 2022-05-11 14:16+0900\n" +"PO-Revision-Date: 2022-05-10 13:47+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -25,42 +25,42 @@ msgstr "" msgid "not recorded" msgstr "記録されていません" -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "カレントディレクトリを識別できませんでした: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "バイナリ\"%s\"は無効です" -#: ../../common/exec.c:206 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "バイナリ\"%s\"を読み取れませんでした" -#: ../../common/exec.c:214 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "実行する\"%s\"がありませんでした" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:282 ../../common/exec.c:321 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "ディレクトリ\"%s\"に移動できませんでした: %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:299 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を読めませんでした: %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:422 #, c-format -msgid "pclose failed: %m" -msgstr "pcloseが失敗しました: %m" +msgid "%s() failed: %m" +msgstr "%s()が失敗しました: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 msgid "out of memory" msgstr "メモリ不足です" @@ -256,6 +256,9 @@ msgstr "%s: 実行ファイル自体がありませんでした\n" msgid "%s: invalid argument: %s\n" msgstr "%s: 無効な引数です: %s\n" +#~ msgid "pclose failed: %m" +#~ msgstr "pcloseが失敗しました: %m" + #~ msgid "could not identify current directory: %s" #~ msgstr "現在のディレクトリを認識できませんでした: %s" diff --git a/src/bin/pg_config/po/ru.po b/src/bin/pg_config/po/ru.po index 75c7f89599..4ef28d241a 100644 --- a/src/bin/pg_config/po/ru.po +++ b/src/bin/pg_config/po/ru.po @@ -5,13 +5,13 @@ # Serguei A. Mokhov , 2004-2005. # Sergey Burladyan , 2009, 2012. # Andrey Sudnik , 2010. -# Alexander Lakhin , 2012-2016, 2017, 2019, 2020. +# Alexander Lakhin , 2012-2016, 2017, 2019, 2020, 2021. msgid "" msgstr "" "Project-Id-Version: pg_config (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-03 11:22+0300\n" -"PO-Revision-Date: 2020-09-03 13:28+0300\n" +"POT-Creation-Date: 2021-08-14 06:29+0300\n" +"PO-Revision-Date: 2021-09-04 12:15+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -28,42 +28,42 @@ msgstr "" msgid "not recorded" msgstr "не записано" -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "не удалось определить текущий каталог: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "неверный исполняемый файл \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "не удалось прочитать исполняемый файл \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "не удалось найти запускаемый файл \"%s\"" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не удалось перейти в каталог \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не удалось прочитать символическую ссылку \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:409 #, c-format -msgid "pclose failed: %m" -msgstr "ошибка pclose: %m" +msgid "%s() failed: %m" +msgstr "ошибка в %s(): %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 msgid "out of memory" msgstr "нехватка памяти" diff --git a/src/bin/pg_config/po/sv.po b/src/bin/pg_config/po/sv.po index 34bb28612f..642168035f 100644 --- a/src/bin/pg_config/po/sv.po +++ b/src/bin/pg_config/po/sv.po @@ -1,13 +1,13 @@ # Swedish message translation file for pg_config. -# Dennis Björklund , 2004, 2005, 2006, 2017, 2018, 2019, 2020. +# Dennis Björklund , 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021. # Mats Erik Andersson , 2014. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-11 01:14+0000\n" -"PO-Revision-Date: 2020-04-11 07:48+0200\n" +"POT-Creation-Date: 2021-11-06 22:15+0000\n" +"PO-Revision-Date: 2021-11-07 06:44+0100\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -23,42 +23,42 @@ msgstr "" msgid "not recorded" msgstr "ej sparad" -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "kunde inte identifiera aktuell katalog: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "ogiltig binär \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "kunde inte läsa binär \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "kunde inte hitta en \"%s\" att köra" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "kunde inte byta katalog till \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "kan inte läsa symbolisk länk \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:409 #, c-format -msgid "pclose failed: %m" -msgstr "pclose misslyckades: %m" +msgid "%s() failed: %m" +msgstr "%s() misslyckades: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 msgid "out of memory" msgstr "slut på minne" diff --git a/src/bin/pg_config/po/tr.po b/src/bin/pg_config/po/tr.po index 61e838f2ff..6a9988c1e4 100644 --- a/src/bin/pg_config/po/tr.po +++ b/src/bin/pg_config/po/tr.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pg_config-tr\n" "Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" "POT-Creation-Date: 2018-11-27 07:44+0000\n" -"PO-Revision-Date: 2018-11-27 16:29+0300\n" +"PO-Revision-Date: 2021-09-16 09:40+0200\n" "Last-Translator: Abdullah Gülner\n" "Language-Team: Turkish \n" "Language: tr\n" @@ -111,7 +111,7 @@ msgid "" " --includedir show location of C header files of the client\n" " interfaces\n" msgstr "" -" --includedir İstemci arabirimlerinin C başlık dosyalarının yerlerini\n" +" --includedir İstemci arabirimlerinin C başlık dosyalarının yerlerini\n" " göster\n" #: pg_config.c:83 @@ -196,7 +196,7 @@ msgstr " --ldflags PostgreSQL derleme sırasında kullanılan LDFLA #: pg_config.c:99 #, c-format msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n" -msgstr " --ldflags_ex PostgreSQL derlemesi sırasında kullanılan LDFLAGS_EX değerini göster\n" +msgstr " --ldflags_ex PostgreSQL derlemesi sırasında kullanılan LDFLAGS_EX değerini göster\n" #: pg_config.c:100 #, c-format diff --git a/src/bin/pg_config/po/uk.po b/src/bin/pg_config/po/uk.po index 407ef9fc1b..3451c6c827 100644 --- a/src/bin/pg_config/po/uk.po +++ b/src/bin/pg_config/po/uk.po @@ -2,11 +2,11 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:14+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" -"Last-Translator: pasha_golub\n" +"POT-Creation-Date: 2021-06-10 08:46+0000\n" +"PO-Revision-Date: 2021-08-17 10:54\n" +"Last-Translator: \n" "Language-Team: Ukrainian\n" -"Language: uk\n" +"Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/pg_config.pot\n" -"X-Crowdin-File-ID: 494\n" +"X-Crowdin-File: /REL_14_DEV/pg_config.pot\n" +"X-Crowdin-File-ID: 766\n" #: ../../common/config_info.c:134 ../../common/config_info.c:142 #: ../../common/config_info.c:150 ../../common/config_info.c:158 @@ -24,42 +24,42 @@ msgstr "" msgid "not recorded" msgstr "не записано" -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "не вдалося визначити поточний каталог: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "невірний бінарний файл \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "неможливо прочитати бінарний файл \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "неможливо знайти \"%s\" для виконання" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не вдалося змінити каталог на \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не можливо прочитати символічне послання \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:409 #, c-format -msgid "pclose failed: %m" -msgstr "помилка pclose: %m" +msgid "%s() failed: %m" +msgstr "%s() помилка: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 msgid "out of memory" msgstr "недостатньо пам'яті" @@ -227,7 +227,7 @@ msgstr "Домашня сторінка %s: <%s>\n" #: pg_config.c:112 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" для отримання додаткової інформації.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" #: pg_config.c:154 #, c-format @@ -239,6 +239,3 @@ msgstr "%s: не вдалося знайти ехе файл власної пр msgid "%s: invalid argument: %s\n" msgstr "%s: недопустимий аргумент: %s\n" -#~ msgid "Report bugs to .\n" -#~ msgstr "Про помилки повідомляйте на .\n" - diff --git a/src/bin/pg_config/po/zh_CN.po b/src/bin/pg_config/po/zh_CN.po index 24029fc2ab..8c32e10321 100644 --- a/src/bin/pg_config/po/zh_CN.po +++ b/src/bin/pg_config/po/zh_CN.po @@ -4,64 +4,62 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_config (PostgreSQL) 12\n" +"Project-Id-Version: pg_config (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-05-31 17:25+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:46+0000\n" +"PO-Revision-Date: 2021-08-15 17:25+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "X-Generator: Poedit 1.5.4\n" -#: ../../common/config_info.c:130 ../../common/config_info.c:138 -#: ../../common/config_info.c:146 ../../common/config_info.c:154 -#: ../../common/config_info.c:162 ../../common/config_info.c:170 -#: ../../common/config_info.c:178 ../../common/config_info.c:186 -#: ../../common/config_info.c:194 +#: ../../common/config_info.c:134 ../../common/config_info.c:142 +#: ../../common/config_info.c:150 ../../common/config_info.c:158 +#: ../../common/config_info.c:166 ../../common/config_info.c:174 +#: ../../common/config_info.c:182 ../../common/config_info.c:190 msgid "not recorded" msgstr "没有被记录" -#: ../../common/exec.c:138 ../../common/exec.c:255 ../../common/exec.c:301 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "无法确认当前目录: %m" -#: ../../common/exec.c:157 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "无效的二进制码 \"%s\"" -#: ../../common/exec.c:207 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "无法读取二进制码 \"%s\"" -#: ../../common/exec.c:215 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "未能找到一个 \"%s\" 来执行" -#: ../../common/exec.c:271 ../../common/exec.c:310 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "无法跳转到目录 \"%s\" 中: %m" -#: ../../common/exec.c:288 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "无法读取符号链接 \"%s\": %m" -#: ../../common/exec.c:541 -#, c-format -msgid "pclose failed: %m" -msgstr "pclose调用失败: %m" +#: ../../common/exec.c:409 +msgid "%s() failed: %m" +msgstr "%s()失败: %m" -#: ../../common/exec.c:670 ../../common/exec.c:715 ../../common/exec.c:807 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 msgid "out of memory" -msgstr "内存用尽" +msgstr "内存不足" #: pg_config.c:74 #, c-format @@ -232,20 +230,25 @@ msgstr "" #: pg_config.c:105 #, c-format -msgid "Report bugs to .\n" -msgstr "臭虫报告至 .\n" +msgid "Report bugs to <%s>.\n" +msgstr "臭虫报告至<%s>.\n" + +#: pg_config.c:106 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 主页: <%s>\n" -#: pg_config.c:111 +#: pg_config.c:112 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "请用 \"%s --help\" 获取更多的信息.\n" -#: pg_config.c:153 +#: pg_config.c:154 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: 无法找到执行文件\n" -#: pg_config.c:180 +#: pg_config.c:181 #, c-format msgid "%s: invalid argument: %s\n" msgstr "%s: 无效参数: %s\n" diff --git a/src/bin/pg_controldata/po/de.po b/src/bin/pg_controldata/po/de.po index 4a8785d336..02b3a2dc1f 100644 --- a/src/bin/pg_controldata/po/de.po +++ b/src/bin/pg_controldata/po/de.po @@ -1,14 +1,14 @@ # German message translation file for pg_controldata -# Peter Eisentraut , 2002 - 2020. +# Peter Eisentraut , 2002 - 2022. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-09 10:17+0000\n" -"PO-Revision-Date: 2020-04-09 15:11+0200\n" +"POT-Creation-Date: 2022-04-10 13:51+0000\n" +"PO-Revision-Date: 2022-04-10 20:16+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -22,26 +22,26 @@ msgstr "" msgid "could not open file \"%s\" for reading: %m" msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" -#: ../../common/controldata_utils.c:89 +#: ../../common/controldata_utils.c:86 #, c-format msgid "could not read file \"%s\": %m" msgstr "konnte Datei »%s« nicht lesen: %m" -#: ../../common/controldata_utils.c:101 +#: ../../common/controldata_utils.c:95 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" -#: ../../common/controldata_utils.c:117 ../../common/controldata_utils.c:259 +#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244 #, c-format msgid "could not close file \"%s\": %m" msgstr "konnte Datei »%s« nicht schließen: %m" -#: ../../common/controldata_utils.c:135 +#: ../../common/controldata_utils.c:124 msgid "byte ordering mismatch" msgstr "falsche Byte-Reihenfolge" -#: ../../common/controldata_utils.c:137 +#: ../../common/controldata_utils.c:126 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -55,17 +55,17 @@ msgstr "" "diesem Fall wären die Ergebnisse unten falsch und die PostgreSQL-Installation\n" "wäre inkompatibel mit diesem Datenverzeichnis." -#: ../../common/controldata_utils.c:203 +#: ../../common/controldata_utils.c:194 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" -#: ../../common/controldata_utils.c:224 +#: ../../common/controldata_utils.c:213 #, c-format msgid "could not write file \"%s\": %m" msgstr "konnte Datei »%s« nicht schreiben: %m" -#: ../../common/controldata_utils.c:245 +#: ../../common/controldata_utils.c:232 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" @@ -172,12 +172,12 @@ msgstr "nicht erkannter Statuscode" msgid "unrecognized wal_level" msgstr "unbekanntes wal_level" -#: pg_controldata.c:137 pg_controldata.c:155 pg_controldata.c:163 +#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_controldata.c:153 +#: pg_controldata.c:154 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" @@ -263,250 +263,250 @@ msgstr "pg_control zuletzt geändert: %s\n" msgid "Latest checkpoint location: %X/%X\n" msgstr "Position des letzten Checkpoints: %X/%X\n" -#: pg_controldata.c:241 +#: pg_controldata.c:240 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "REDO-Position des letzten Checkpoints: %X/%X\n" -#: pg_controldata.c:244 +#: pg_controldata.c:242 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "REDO-WAL-Datei des letzten Checkpoints: %s\n" -#: pg_controldata.c:246 +#: pg_controldata.c:244 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "TimeLineID des letzten Checkpoints: %u\n" -#: pg_controldata.c:248 +#: pg_controldata.c:246 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "PrevTimeLineID des letzten Checkpoints: %u\n" -#: pg_controldata.c:250 +#: pg_controldata.c:248 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "full_page_writes des letzten Checkpoints: %s\n" -#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 msgid "off" msgstr "aus" -#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 msgid "on" msgstr "an" -#: pg_controldata.c:252 +#: pg_controldata.c:250 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID des letzten Checkpoints: %u:%u\n" -#: pg_controldata.c:255 +#: pg_controldata.c:253 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID des letzten Checkpoints: %u\n" -#: pg_controldata.c:257 +#: pg_controldata.c:255 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId des letzten Checkpoints: %u\n" -#: pg_controldata.c:259 +#: pg_controldata.c:257 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset des letzten Checkpoints: %u\n" -#: pg_controldata.c:261 +#: pg_controldata.c:259 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID des letzten Checkpoints: %u\n" -#: pg_controldata.c:263 +#: pg_controldata.c:261 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "DB der oldestXID des letzten Checkpoints: %u\n" -#: pg_controldata.c:265 +#: pg_controldata.c:263 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID des letzten Checkpoints: %u\n" -#: pg_controldata.c:267 +#: pg_controldata.c:265 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid des letzten Checkpoints: %u\n" -#: pg_controldata.c:269 +#: pg_controldata.c:267 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "DB des oldestMulti des letzten Checkpoints: %u\n" -#: pg_controldata.c:271 +#: pg_controldata.c:269 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid des letzten Checkpoints: %u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:271 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid des letzten Checkpoints: %u\n" -#: pg_controldata.c:275 +#: pg_controldata.c:273 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "Zeit des letzten Checkpoints: %s\n" -#: pg_controldata.c:277 +#: pg_controldata.c:275 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "Fake-LSN-Zähler für ungeloggte Relationen: %X/%X\n" -#: pg_controldata.c:280 +#: pg_controldata.c:277 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "Minimaler Wiederherstellungsendpunkt: %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:279 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "Zeitleiste des minimalen Wiederherstellungsendpunkts: %u\n" -#: pg_controldata.c:285 +#: pg_controldata.c:281 #, c-format msgid "Backup start location: %X/%X\n" msgstr "Backup-Startpunkt: %X/%X\n" -#: pg_controldata.c:288 +#: pg_controldata.c:283 #, c-format msgid "Backup end location: %X/%X\n" msgstr "Backup-Endpunkt: %X/%X\n" -#: pg_controldata.c:291 +#: pg_controldata.c:285 #, c-format msgid "End-of-backup record required: %s\n" msgstr "End-of-Backup-Eintrag erforderlich: %s\n" -#: pg_controldata.c:292 +#: pg_controldata.c:286 msgid "no" msgstr "nein" -#: pg_controldata.c:292 +#: pg_controldata.c:286 msgid "yes" msgstr "ja" -#: pg_controldata.c:293 +#: pg_controldata.c:287 #, c-format msgid "wal_level setting: %s\n" msgstr "wal_level-Einstellung: %s\n" -#: pg_controldata.c:295 +#: pg_controldata.c:289 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "wal_log_hints-Einstellung: %s\n" -#: pg_controldata.c:297 +#: pg_controldata.c:291 #, c-format msgid "max_connections setting: %d\n" msgstr "max_connections-Einstellung: %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:293 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "max_worker_processes-Einstellung: %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:295 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "max_wal_senders-Einstellung: %d\n" -#: pg_controldata.c:303 +#: pg_controldata.c:297 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "max_prepared_xacts-Einstellung: %d\n" -#: pg_controldata.c:305 +#: pg_controldata.c:299 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "max_locks_per_xact-Einstellung: %d\n" -#: pg_controldata.c:307 +#: pg_controldata.c:301 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "track_commit_timestamp-Einstellung: %s\n" -#: pg_controldata.c:309 +#: pg_controldata.c:303 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Maximale Datenausrichtung (Alignment): %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:306 #, c-format msgid "Database block size: %u\n" msgstr "Datenbankblockgröße: %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:308 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Blöcke pro Segment: %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:310 #, c-format msgid "WAL block size: %u\n" msgstr "WAL-Blockgröße: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:312 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Bytes pro WAL-Segment: %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:314 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Maximale Bezeichnerlänge: %u\n" -#: pg_controldata.c:322 +#: pg_controldata.c:316 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Maximale Spalten in einem Index: %u\n" -#: pg_controldata.c:324 +#: pg_controldata.c:318 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Maximale Größe eines Stücks TOAST: %u\n" -#: pg_controldata.c:326 +#: pg_controldata.c:320 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Größe eines Large-Object-Chunks: %u\n" -#: pg_controldata.c:329 +#: pg_controldata.c:323 #, c-format msgid "Date/time type storage: %s\n" msgstr "Speicherung von Datum/Zeit-Typen: %s\n" -#: pg_controldata.c:330 +#: pg_controldata.c:324 msgid "64-bit integers" msgstr "64-Bit-Ganzzahlen" -#: pg_controldata.c:331 +#: pg_controldata.c:325 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Übergabe von Float8-Argumenten: %s\n" -#: pg_controldata.c:332 +#: pg_controldata.c:326 msgid "by reference" msgstr "Referenz" -#: pg_controldata.c:332 +#: pg_controldata.c:326 msgid "by value" msgstr "Wert" -#: pg_controldata.c:333 +#: pg_controldata.c:327 #, c-format msgid "Data page checksum version: %u\n" msgstr "Datenseitenprüfsummenversion: %u\n" -#: pg_controldata.c:335 +#: pg_controldata.c:329 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "Mock-Authentifizierungs-Nonce: %s\n" diff --git a/src/bin/pg_controldata/po/el.po b/src/bin/pg_controldata/po/el.po index 12bbb0556b..8e8bbde248 100644 --- a/src/bin/pg_controldata/po/el.po +++ b/src/bin/pg_controldata/po/el.po @@ -3,40 +3,42 @@ # This file is distributed under the same license as the pg_controldata (PostgreSQL) package. # Georgios Kokolatos , 2021. # +# +# msgid "" msgstr "" "Project-Id-Version: pg_controldata (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-26 00:19+0000\n" +"POT-Creation-Date: 2021-07-14 09:48+0000\n" "PO-Revision-Date: 2021-05-31 11:02+0200\n" +"Last-Translator: Georgios Kokolatos \n" +"Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"Last-Translator: Georgios Kokolatos \n" -"Language-Team: \n" "X-Generator: Poedit 2.4.3\n" #: ../../common/controldata_utils.c:73 #, c-format msgid "could not open file \"%s\" for reading: %m" -msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου “%s” για ανάγνωση: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου «%s» για ανάγνωση: %m" #: ../../common/controldata_utils.c:89 #, c-format msgid "could not read file \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου \"%s\": %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: %m" #: ../../common/controldata_utils.c:101 #, c-format msgid "could not read file \"%s\": read %d of %zu" -msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου \"%s\": ανέγνωσε %d από %zu" +msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: ανέγνωσε %d από %zu" #: ../../common/controldata_utils.c:117 ../../common/controldata_utils.c:259 #, c-format msgid "could not close file \"%s\": %m" -msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου “%s”: %m" +msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου «%s»: %m" #: ../../common/controldata_utils.c:135 msgid "byte ordering mismatch" @@ -51,26 +53,24 @@ msgid "" "the PostgreSQL installation would be incompatible with this data directory." msgstr "" "πιθανή αναντιστοιχία διάταξης byte\n" -"Η διάταξη byte που χρησιμοποιείται για την αποθήκευση του αρχείου pg_control " -"ενδέχεται να μην ταιριάζει με αυτήν\n" -"που χρησιμοποιείται από αυτό το πρόγραμμα. Στην περίπτωση αυτή, τα παρακάτω " -"αποτελέσματα θα ήταν εσφαλμένα, και\n" +"Η διάταξη byte που χρησιμοποιείται για την αποθήκευση του αρχείου pg_control ενδέχεται να μην ταιριάζει με αυτήν\n" +"που χρησιμοποιείται από αυτό το πρόγραμμα. Στην περίπτωση αυτή, τα παρακάτω αποτελέσματα θα ήταν εσφαλμένα, και\n" "η εγκατάσταση PostgreSQL θα ήταν ασύμβατη με αυτόν τον κατάλογο δεδομένων." #: ../../common/controldata_utils.c:203 #, c-format msgid "could not open file \"%s\": %m" -msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου “%s”: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %m" #: ../../common/controldata_utils.c:224 #, c-format msgid "could not write file \"%s\": %m" -msgstr "δεν ήταν δυνατή η εγγραφή αρχείου “%s”: %m" +msgstr "δεν ήταν δυνατή η εγγραφή αρχείου «%s»: %m" #: ../../common/controldata_utils.c:245 #, c-format msgid "could not fsync file \"%s\": %m" -msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής fsync στο αρχείο “%s”: %m" +msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής fsync στο αρχείο «%s»: %m" #: pg_controldata.c:35 #, c-format @@ -89,7 +89,7 @@ msgstr "Χρήση:\n" #: pg_controldata.c:37 #, c-format msgid " %s [OPTION] [DATADIR]\n" -msgstr " %s [OPTION] [DATADIR]\n" +msgstr " %s [ΕΠΙΛΟΓΗ] [DATADIR]\n" #: pg_controldata.c:38 #, c-format @@ -103,17 +103,17 @@ msgstr "" #: pg_controldata.c:39 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, —pgdata=]DATADIR κατάλογος δεδομένων\n" +msgstr " [-D, --pgdata=]DATADIR κατάλογος δεδομένων\n" #: pg_controldata.c:40 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, —version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" #: pg_controldata.c:41 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, —help εμφάνισε αυτό το μήνυμα βοήθειας, μετά έξοδος\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, μετά έξοδος\n" #: pg_controldata.c:42 #, c-format @@ -164,7 +164,7 @@ msgstr "σε αποκατάσταση αρχειοθήκης" #: pg_controldata.c:67 msgid "in production" -msgstr "στην παραγωγή" +msgstr "σε παραγωγή" #: pg_controldata.c:69 msgid "unrecognized status code" @@ -177,12 +177,12 @@ msgstr "μη αναγνωρίσιμο wal_level" #: pg_controldata.c:137 pg_controldata.c:155 pg_controldata.c:163 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Δοκιμάστε “%s —help” για περισσότερες πληροφορίες.\n" +msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n" #: pg_controldata.c:153 #, c-format msgid "too many command-line arguments (first is \"%s\")" -msgstr "πάρα πολλοί παραμέτροι εισόδου από την γραμμή εντολών (ο πρώτη είναι η “%s”)" +msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)" #: pg_controldata.c:162 #, c-format @@ -197,10 +197,8 @@ msgid "" "is expecting. The results below are untrustworthy.\n" "\n" msgstr "" -"ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Το υπολογιζόμενο άθροισμα ελέγχου CRC δεν συμφωνεί με την τιμή που " -"είναι αποθηκευμένη στο αρχείο.\n" -"Είτε το αρχείο είναι αλλοιωμένο είτε έχει διαφορετική διάταξη από αυτή που " -"περιμένει\n" +"ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Το υπολογιζόμενο άθροισμα ελέγχου CRC δεν συμφωνεί με την τιμή που είναι αποθηκευμένη στο αρχείο.\n" +"Είτε το αρχείο είναι αλλοιωμένο είτε έχει διαφορετική διάταξη από αυτή που περιμένει\n" "αυτό το πρόγραμμα. Τα παρακάτω αποτελέσματα είναι αναξιόπιστα.\n" "\n" @@ -222,17 +220,13 @@ msgid_plural "" "untrustworthy.\n" "\n" msgstr[0] "" -"Το μέγεθος τμήματος WAL που είναι αποθηκευμένο στο αρχείο, %d byte, δεν είναι " -"δύναμη\n" -"του δύο μεταξύ 1 MB και 1 GB. Το αρχείο είναι αλλοιωμένο και τα παρακάτω " -"αποτελέσματα\n" +"Το μέγεθος τμήματος WAL που είναι αποθηκευμένο στο αρχείο, %d byte, δεν είναι δύναμη\n" +"του δύο μεταξύ 1 MB και 1 GB. Το αρχείο είναι αλλοιωμένο και τα παρακάτω αποτελέσματα\n" "είναι αναξιόπιστα.\n" "\n" msgstr[1] "" -"Το μέγεθος τμήματος WAL που είναι αποθηκευμένο στο αρχείο, %d bytes, δεν είναι " -"δύναμη\n" -"του δύο μεταξύ 1 MB και 1 GB. Το αρχείο είναι αλλοιωμένο και τα παρακάτω " -"αποτελέσματα\n" +"Το μέγεθος τμήματος WAL που είναι αποθηκευμένο στο αρχείο, %d bytes, δεν είναι δύναμη\n" +"του δύο μεταξύ 1 MB και 1 GB. Το αρχείο είναι αλλοιωμένο και τα παρακάτω αποτελέσματα\n" "είναι αναξιόπιστα.\n" "\n" @@ -244,53 +238,52 @@ msgstr "???" #, c-format msgid "pg_control version number: %u\n" msgstr "" -"pg_control αριθμός έκδοσης: %u\n" -"\n" +"pg_control αριθμός έκδοσης: %u\n" #: pg_controldata.c:230 #, c-format msgid "Catalog version number: %u\n" -msgstr "Αριθμός έκδοσης καταλόγου: %u\n" +msgstr "Αριθμός έκδοσης καταλόγου: %u\n" #: pg_controldata.c:232 #, c-format msgid "Database system identifier: %llu\n" -msgstr "Αναγνωριστικό συστήματος βάσης δεδομένων: %llu\n" +msgstr "Αναγνωριστικό συστήματος βάσης δεδομένων: %llu\n" #: pg_controldata.c:234 #, c-format msgid "Database cluster state: %s\n" -msgstr "Κατάσταση συστάδας βάσης δεδομένων: %s\n" +msgstr "Κατάσταση συστάδας βάσης δεδομένων: %s\n" #: pg_controldata.c:236 #, c-format msgid "pg_control last modified: %s\n" -msgstr "πιο πρόσφατη μετατροπή pg_control: %s\n" +msgstr "πιο πρόσφατη μετατροπή pg_control: %s\n" #: pg_controldata.c:238 #, c-format msgid "Latest checkpoint location: %X/%X\n" -msgstr "Πιο πρόσφατη τοποθεσία σημείου ελέγχου: %X/%X\n" +msgstr "Πιο πρόσφατη τοποθεσία σημείου ελέγχου: %X/%X\n" #: pg_controldata.c:240 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" -msgstr "Πιο πρόσφατη τοποθεσία REDO του σημείου ελέγχου: %X/%X\n" +msgstr "Πιο πρόσφατη τοποθεσία REDO του σημείου ελέγχου: %X/%X\n" #: pg_controldata.c:242 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" -msgstr "Πιο πρόσφατο αρχείο REDO WAL του σημείου ελέγχου: %s\n" +msgstr "Πιο πρόσφατο αρχείο REDO WAL του σημείου ελέγχου: %s\n" #: pg_controldata.c:244 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" -msgstr "Πιο πρόσφατο TimeLineID του σημείου ελέγχου: %u\n" +msgstr "Πιο πρόσφατο TimeLineID του σημείου ελέγχου: %u\n" #: pg_controldata.c:246 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" -msgstr "Πιο πρόσφατο PrevTimeLineID του σημείου ελέγχου: %u\n" +msgstr "Πιο πρόσφατο PrevTimeLineID του σημείου ελέγχου: %u\n" #: pg_controldata.c:248 #, c-format @@ -328,7 +321,7 @@ msgstr "Πιο πρόσφατο NextMultiOffset του σημείου ελέγχ #: pg_controldata.c:259 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" -msgstr "Πιο πρόσφατο oldestXID του σημείου ελέγχου: %u\n" +msgstr "Πιο πρόσφατο oldestXID του σημείου ελέγχου: %u\n" #: pg_controldata.c:261 #, c-format @@ -353,47 +346,47 @@ msgstr "Πιο πρόσφατο oldestMulti’s DB του σημείου ελέ #: pg_controldata.c:269 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" -msgstr "Πιο πρόσφατο oldestCommitTsXid του σημείου ελέγχου: %u\n" +msgstr "Πιο πρόσφατο oldestCommitTsXid του σημείου ελέγχου:%u\n" #: pg_controldata.c:271 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" -msgstr "Πιο πρόσφατο newestCommitTsXid του σημείου ελέγχου: %u\n" +msgstr "Πιο πρόσφατο newestCommitTsXid του σημείου ελέγχου:%u\n" #: pg_controldata.c:273 #, c-format msgid "Time of latest checkpoint: %s\n" -msgstr "Ώρα του πιο πρόσφατου σημείου ελέγχου: %s\n" +msgstr "Ώρα του πιο πρόσφατου σημείου ελέγχου: %s\n" #: pg_controldata.c:275 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" -msgstr "Ψεύτικος μετρητής LSN για μη κενές rels: %X/%X\n" +msgstr "Ψεύτικος μετρητής LSN για μη κενές rels: %X/%X\n" #: pg_controldata.c:277 #, c-format msgid "Minimum recovery ending location: %X/%X\n" -msgstr "Ελάχιστη τοποθεσία τερματισμού ανάκαμψης: %X/%X\n" +msgstr "Ελάχιστη τοποθεσία τερματισμού ανάκαμψης: %X/%X\n" #: pg_controldata.c:279 #, c-format msgid "Min recovery ending loc's timeline: %u\n" -msgstr "Χρονογραμμή ελάχιστης τοποθεσίας τερματισμού ανάκαμψης: %u\n" +msgstr "Χρονογραμμή ελάχιστης θέσης τερματισμού ανάκαμψης: %u\n" #: pg_controldata.c:281 #, c-format msgid "Backup start location: %X/%X\n" -msgstr "Τοποθεσία εκκίνησης Backup: %X/%X\n" +msgstr "Τοποθεσία εκκίνησης Backup: %X/%X\n" #: pg_controldata.c:283 #, c-format msgid "Backup end location: %X/%X\n" -msgstr "Τοποθεσία τερματισμου Backup: %X/%X\n" +msgstr "Τοποθεσία τερματισμου Backup: %X/%X\n" #: pg_controldata.c:285 #, c-format msgid "End-of-backup record required: %s\n" -msgstr "Απαιτείται εγγραφή end-of-backup: %s\n" +msgstr "Απαιτείται εγγραφή end-of-backup: %s\n" #: pg_controldata.c:286 msgid "no" @@ -406,92 +399,92 @@ msgstr "ναι" #: pg_controldata.c:287 #, c-format msgid "wal_level setting: %s\n" -msgstr "ρύθμιση wal_level: %s\n" +msgstr "ρύθμιση wal_level: %s\n" #: pg_controldata.c:289 #, c-format msgid "wal_log_hints setting: %s\n" -msgstr "ρύθμιση wal_log_hints: %s\n" +msgstr "ρύθμιση wal_log_hints: %s\n" #: pg_controldata.c:291 #, c-format msgid "max_connections setting: %d\n" -msgstr "ρύθμιση max_connections: %d\n" +msgstr "ρύθμιση max_connections: %d\n" #: pg_controldata.c:293 #, c-format msgid "max_worker_processes setting: %d\n" -msgstr "ρύθμιση max_worker_processes: %d\n" +msgstr "ρύθμιση max_worker_processes: %d\n" #: pg_controldata.c:295 #, c-format msgid "max_wal_senders setting: %d\n" -msgstr "ρύθμιση max_wal_senders: %d\n" +msgstr "ρύθμιση max_wal_senders: %d\n" #: pg_controldata.c:297 #, c-format msgid "max_prepared_xacts setting: %d\n" -msgstr "ρύθμιση max_prepared_xacts: %d\n" +msgstr "ρύθμιση max_prepared_xacts: %d\n" #: pg_controldata.c:299 #, c-format msgid "max_locks_per_xact setting: %d\n" -msgstr "ρύθμιση max_locks_per_xact: %d\n" +msgstr "ρύθμιση max_locks_per_xact: %d\n" #: pg_controldata.c:301 #, c-format msgid "track_commit_timestamp setting: %s\n" -msgstr "ρύθμιση track_commit_timestamp: %s\n" +msgstr "ρύθμιση track_commit_timestamp: %s\n" #: pg_controldata.c:303 #, c-format msgid "Maximum data alignment: %u\n" -msgstr "Μέγιστη στοίχιση δεδομένων: %u\n" +msgstr "Μέγιστη στοίχιση δεδομένων: %u\n" #: pg_controldata.c:306 #, c-format msgid "Database block size: %u\n" -msgstr "Μέγεθος μπλοκ βάσης δεδομένων: %u\n" +msgstr "Μέγεθος μπλοκ βάσης δεδομένων: %u\n" #: pg_controldata.c:308 #, c-format msgid "Blocks per segment of large relation: %u\n" -msgstr "Μπλοκ ανά τμήμα μεγάλης σχέσης: %u\n" +msgstr "Μπλοκ ανά τμήμα μεγάλης σχέσης: %u\n" #: pg_controldata.c:310 #, c-format msgid "WAL block size: %u\n" -msgstr "Μέγεθος μπλοκ WAL: %u\n" +msgstr "Μέγεθος μπλοκ WAL: %u\n" #: pg_controldata.c:312 #, c-format msgid "Bytes per WAL segment: %u\n" -msgstr "Bytes ανά τμήμα WAL: %u\n" +msgstr "Bytes ανά τμήμα WAL: %u\n" #: pg_controldata.c:314 #, c-format msgid "Maximum length of identifiers: %u\n" -msgstr "Μέγιστο μήκος αναγνωριστικών: %u\n" +msgstr "Μέγιστο μήκος αναγνωριστικών: %u\n" #: pg_controldata.c:316 #, c-format msgid "Maximum columns in an index: %u\n" -msgstr "Μέγιστες στήλες σε ένα ευρετήριο: %u\n" +msgstr "Μέγιστες στήλες σε ένα ευρετήριο: %u\n" #: pg_controldata.c:318 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" -msgstr "Μέγιστο μέγεθος ενός τμήματος TOAST: %u\n" +msgstr "Μέγιστο μέγεθος ενός τμήματος TOAST: %u\n" #: pg_controldata.c:320 #, c-format msgid "Size of a large-object chunk: %u\n" -msgstr "Μέγεθος τμήματος μεγάλου αντικειμένου: %u\n" +msgstr "Μέγεθος τμήματος μεγάλου αντικειμένου: %u\n" #: pg_controldata.c:323 #, c-format msgid "Date/time type storage: %s\n" -msgstr "Τύπος αποθήκευσης ημερομηνίας/ώρας: %s\n" +msgstr "Τύπος αποθήκευσης ημερομηνίας/ώρας: %s\n" #: pg_controldata.c:324 msgid "64-bit integers" @@ -500,7 +493,7 @@ msgstr "Ακέραιοι 64-bit" #: pg_controldata.c:325 #, c-format msgid "Float8 argument passing: %s\n" -msgstr "Μεταβλητή Float8 τέθηκε: %s\n" +msgstr "Μεταβλητή Float8 τέθηκε: %s\n" #: pg_controldata.c:326 msgid "by reference" @@ -513,9 +506,9 @@ msgstr "με τιμή" #: pg_controldata.c:327 #, c-format msgid "Data page checksum version: %u\n" -msgstr "Έκδοση αθροίσματος ελέγχου σελίδας δεδομένων: %u\n" +msgstr "Έκδοση αθροίσματος ελέγχου σελίδας δεδομένων: %u\n" #: pg_controldata.c:329 #, c-format msgid "Mock authentication nonce: %s\n" -msgstr "Μακέτα (mock) nonce ταυτοποίησης: %s\n" +msgstr "Μακέτα (mock) nonce ταυτοποίησης: %s\n" diff --git a/src/bin/pg_controldata/po/es.po b/src/bin/pg_controldata/po/es.po index 2764c38466..415617ab76 100644 --- a/src/bin/pg_controldata/po/es.po +++ b/src/bin/pg_controldata/po/es.po @@ -1,6 +1,6 @@ # Spanish message translation file for pg_controldata # -# Copyright (c) 2002-2019, PostgreSQL Global Development Group +# Copyright (c) 2002-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Karim Mribti , 2002. @@ -9,7 +9,7 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_controldata (PostgreSQL) 12\n" +"Project-Id-Version: pg_controldata (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2020-09-13 10:47+0000\n" "PO-Revision-Date: 2020-09-12 22:55-0300\n" diff --git a/src/bin/pg_controldata/po/fr.po b/src/bin/pg_controldata/po/fr.po index bd3b6d68c2..6f2a45a204 100644 --- a/src/bin/pg_controldata/po/fr.po +++ b/src/bin/pg_controldata/po/fr.po @@ -1,51 +1,54 @@ -# translation of pg_controldata.po to fr_fr -# french message translation file for pg_controldata +# LANGUAGE message translation file for pg_controldata +# Copyright (C) 2002-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_controldata (PostgreSQL) package. # # Use these quotes: « %s » # # Loïc Hennequin , 2002. # Guillaume Lelarge , 2003-2009. # Stéphane Schildknecht , 2009. +# Guillaume Lelarge , 2010-2022. +# msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-16 06:17+0000\n" -"PO-Revision-Date: 2020-04-16 14:06+0200\n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" "Last-Translator: Guillaume Lelarge \n" -"Language-Team: PostgreSQLfr \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.3\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" #: ../../common/controldata_utils.c:73 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" -#: ../../common/controldata_utils.c:89 +#: ../../common/controldata_utils.c:86 #, c-format msgid "could not read file \"%s\": %m" msgstr "n'a pas pu lire le fichier « %s » : %m" -#: ../../common/controldata_utils.c:101 +#: ../../common/controldata_utils.c:95 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" -#: ../../common/controldata_utils.c:117 ../../common/controldata_utils.c:259 +#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244 #, c-format msgid "could not close file \"%s\": %m" msgstr "n'a pas pu fermer le fichier « %s » : %m" -#: ../../common/controldata_utils.c:135 +#: ../../common/controldata_utils.c:124 msgid "byte ordering mismatch" msgstr "différence de l'ordre des octets" -#: ../../common/controldata_utils.c:137 +#: ../../common/controldata_utils.c:126 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -53,23 +56,23 @@ msgid "" "used by this program. In that case the results below would be incorrect, and\n" "the PostgreSQL installation would be incompatible with this data directory." msgstr "" -"ATTENTION : possible incohérence dans l'ordre des octets\n" +"possible incohérence dans l'ordre des octets\n" "L'ordre des octets utilisé pour enregistrer le fichier pg_control peut ne\n" "pas correspondre à celui utilisé par ce programme. Dans ce cas, les\n" "résultats ci-dessous sont incorrects, et l'installation de PostgreSQL\n" "est incompatible avec ce répertoire des données." -#: ../../common/controldata_utils.c:203 +#: ../../common/controldata_utils.c:194 #, c-format msgid "could not open file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier « %s » : %m" -#: ../../common/controldata_utils.c:224 +#: ../../common/controldata_utils.c:213 #, c-format msgid "could not write file \"%s\": %m" msgstr "impossible d'écrire le fichier « %s » : %m" -#: ../../common/controldata_utils.c:245 +#: ../../common/controldata_utils.c:232 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" @@ -80,8 +83,7 @@ msgid "" "%s displays control information of a PostgreSQL database cluster.\n" "\n" msgstr "" -"%s affiche les informations de contrôle du cluster de bases de données\n" -"PostgreSQL.\n" +"%s affiche les informations de contrôle de l'instance PostgreSQL.\n" "\n" #: pg_controldata.c:36 @@ -106,17 +108,17 @@ msgstr "" #: pg_controldata.c:39 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata] RÉPDONNEES répertoire de la base de données\n" +msgstr " [-D, --pgdata] RÉP_DONNEES répertoire de la base de données\n" #: pg_controldata.c:40 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version puis quitte\n" +msgstr " -V, --version affiche la version puis quitte\n" #: pg_controldata.c:41 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide puis quitte\n" +msgstr " -?, --help affiche cette aide puis quitte\n" #: pg_controldata.c:42 #, c-format @@ -127,8 +129,8 @@ msgid "" "\n" msgstr "" "\n" -"Si aucun répertoire (RÉP_DONNÉES) n'est indiqué, la variable\n" -"d'environnement PGDATA est utilisée.\n" +"Si aucun répertoire (RÉP_DONNÉES) n'est indiqué, la variable d'environnement\n" +"PGDATA est utilisée.\n" "\n" #: pg_controldata.c:44 @@ -139,7 +141,7 @@ msgstr "Rapporter les bogues à <%s>.\n" #: pg_controldata.c:45 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil %s : %s\n" +msgstr "Page d'accueil de %s : <%s>\n" #: pg_controldata.c:55 msgid "starting up" @@ -177,12 +179,12 @@ msgstr "code de statut inconnu" msgid "unrecognized wal_level" msgstr "wal_level non reconnu" -#: pg_controldata.c:137 pg_controldata.c:155 pg_controldata.c:163 +#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Essayer « %s --help » pour plus d'informations.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_controldata.c:153 +#: pg_controldata.c:154 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" @@ -269,254 +271,260 @@ msgstr "Dernière modification de pg_control : %s\n" msgid "Latest checkpoint location: %X/%X\n" msgstr "Dernier point de contrôle : %X/%X\n" -#: pg_controldata.c:241 +#: pg_controldata.c:240 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "Dernier REDO (reprise) du point de contrôle : %X/%X\n" -#: pg_controldata.c:244 +#: pg_controldata.c:242 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" -msgstr "Dernier fichier WAL du rejeu du point de restauration : %s\n" +msgstr "Dernier fichier WAL du rejeu du point de contrrôle : %s\n" -#: pg_controldata.c:246 +#: pg_controldata.c:244 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "Dernier TimeLineID du point de contrôle : %u\n" -#: pg_controldata.c:248 +#: pg_controldata.c:246 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" -msgstr "Dernier PrevTimeLineID du point de restauration : %u\n" +msgstr "Dernier PrevTimeLineID du point de contrôle : %u\n" -#: pg_controldata.c:250 +#: pg_controldata.c:248 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "Dernier full_page_writes du point de contrôle : %s\n" -#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 msgid "off" msgstr "désactivé" -#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 msgid "on" msgstr "activé" -#: pg_controldata.c:252 +#: pg_controldata.c:250 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "Dernier NextXID du point de contrôle : %u:%u\n" -#: pg_controldata.c:255 +#: pg_controldata.c:253 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "Dernier NextOID du point de contrôle : %u\n" -#: pg_controldata.c:257 +#: pg_controldata.c:255 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "Dernier NextMultiXactId du point de contrôle : %u\n" -#: pg_controldata.c:259 +#: pg_controldata.c:257 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "Dernier NextMultiOffset du point de contrôle : %u\n" -#: pg_controldata.c:261 +#: pg_controldata.c:259 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "Dernier oldestXID du point de contrôle : %u\n" -#: pg_controldata.c:263 +#: pg_controldata.c:261 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "Dernier oldestXID du point de contrôle de la base : %u\n" -#: pg_controldata.c:265 +#: pg_controldata.c:263 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "Dernier oldestActiveXID du point de contrôle : %u\n" -#: pg_controldata.c:267 +#: pg_controldata.c:265 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" -msgstr "Dernier oldestMultiXid du point de restauration : %u\n" +msgstr "Dernier oldestMultiXid du point de contrôle : %u\n" -#: pg_controldata.c:269 +#: pg_controldata.c:267 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" -msgstr "Dernier oldestMulti du point de restauration de base : %u\n" +msgstr "Dernier oldestMulti du point de contrôle de base : %u\n" -#: pg_controldata.c:271 +#: pg_controldata.c:269 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" -msgstr "Dernier oldestCommitTsXid du point de restauration : %u\n" +msgstr "Dernier oldestCommitTsXid du point de contrôle : %u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:271 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" -msgstr "Dernier newestCommitTsXid du point de restauration : %u\n" +msgstr "Dernier newestCommitTsXid du point de contrôle : %u\n" -#: pg_controldata.c:275 +#: pg_controldata.c:273 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "Heure du dernier point de contrôle : %s\n" -#: pg_controldata.c:277 +#: pg_controldata.c:275 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "Faux compteur LSN pour les relations non journalisés : %X/%X\n" -#: pg_controldata.c:280 +#: pg_controldata.c:277 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "Emplacement de fin de la récupération minimale : %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:279 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "Timeline de l'emplacement de fin de restauration : %u\n" -#: pg_controldata.c:285 +#: pg_controldata.c:281 #, c-format msgid "Backup start location: %X/%X\n" msgstr "Début de la sauvegarde : %X/%X\n" -#: pg_controldata.c:288 +#: pg_controldata.c:283 #, c-format msgid "Backup end location: %X/%X\n" msgstr "Fin de la sauvegarde : %X/%X\n" -#: pg_controldata.c:291 +#: pg_controldata.c:285 #, c-format msgid "End-of-backup record required: %s\n" msgstr "Enregistrement de fin de sauvegarde requis : %s\n" -#: pg_controldata.c:292 +#: pg_controldata.c:286 msgid "no" msgstr "non" -#: pg_controldata.c:292 +#: pg_controldata.c:286 msgid "yes" msgstr "oui" -#: pg_controldata.c:293 +#: pg_controldata.c:287 #, c-format msgid "wal_level setting: %s\n" msgstr "Paramètrage actuel de wal_level : %s\n" -#: pg_controldata.c:295 +#: pg_controldata.c:289 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "Paramétrage actuel de wal_log_hints : %s\n" -#: pg_controldata.c:297 +#: pg_controldata.c:291 #, c-format msgid "max_connections setting: %d\n" msgstr "Paramètrage actuel de max_connections : %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:293 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "Paramétrage actuel de max_worker_processes : %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:295 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "Paramètrage actuel de max_wal_senders : %d\n" -#: pg_controldata.c:303 +#: pg_controldata.c:297 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "Paramètrage actuel de max_prepared_xacts : %d\n" -#: pg_controldata.c:305 +#: pg_controldata.c:299 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "Paramètrage actuel de max_locks_per_xact : %d\n" -#: pg_controldata.c:307 +#: pg_controldata.c:301 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "Paramètrage actuel de track_commit_timestamp : %s\n" -#: pg_controldata.c:309 +#: pg_controldata.c:303 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Alignement maximal des données : %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:306 #, c-format msgid "Database block size: %u\n" msgstr "Taille du bloc de la base de données : %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:308 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Blocs par segment des relations volumineuses : %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:310 #, c-format msgid "WAL block size: %u\n" msgstr "Taille de bloc du journal de transaction : %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:312 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Octets par segment du journal de transaction : %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:314 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Longueur maximale des identifiants : %u\n" -#: pg_controldata.c:322 +#: pg_controldata.c:316 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Nombre maximum de colonnes d'un index: %u\n" -#: pg_controldata.c:324 +#: pg_controldata.c:318 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Longueur maximale d'un morceau TOAST : %u\n" -#: pg_controldata.c:326 +#: pg_controldata.c:320 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Taille d'un morceau de Large Object : %u\n" -#: pg_controldata.c:329 +#: pg_controldata.c:323 #, c-format msgid "Date/time type storage: %s\n" msgstr "Stockage du type date/heure : %s\n" -#: pg_controldata.c:330 +#: pg_controldata.c:324 msgid "64-bit integers" msgstr "entiers 64-bits" -#: pg_controldata.c:331 +#: pg_controldata.c:325 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Passage d'argument float8 : %s\n" -#: pg_controldata.c:332 +#: pg_controldata.c:326 msgid "by reference" msgstr "par référence" -#: pg_controldata.c:332 +#: pg_controldata.c:326 msgid "by value" msgstr "par valeur" -#: pg_controldata.c:333 +#: pg_controldata.c:327 #, c-format msgid "Data page checksum version: %u\n" msgstr "Version des sommes de contrôle des pages de données : %u\n" -#: pg_controldata.c:335 +#: pg_controldata.c:329 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "Nonce pour simuler une identité: %s\n" +#~ msgid " -?, --help show this help, then exit\n" +#~ msgstr " -?, --help affiche cette aide et quitte\n" + +#~ msgid " -V, --version output version information, then exit\n" +#~ msgstr " -V, --version affiche la version et quitte\n" + #~ msgid "%s: could not open file \"%s\" for reading: %s\n" #~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n" @@ -526,11 +534,18 @@ msgstr "Nonce pour simuler une identité: %s\n" #~ msgid "%s: could not read file \"%s\": read %d of %d\n" #~ msgstr "%s : n'a pas pu lire le fichier « %s » : a lu %d sur %d\n" -#~ msgid "calculated CRC checksum does not match value stored in file" -#~ msgstr "la somme de contrôle CRC calculée ne correspond par à la valeur enregistrée dans le fichier" +#~ msgid "Float4 argument passing: %s\n" +#~ msgstr "Passage d'argument float4 : %s\n" -#~ msgid "floating-point numbers" -#~ msgstr "nombres à virgule flottante" +#~ msgid "Prior checkpoint location: %X/%X\n" +#~ msgstr "Point de contrôle précédent : %X/%X\n" + +#~ msgid "Report bugs to .\n" +#~ msgstr "Rapporter les bogues à .\n" + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Essayer « %s --help » pour plus d'informations.\n" #~ msgid "" #~ "Usage:\n" @@ -547,17 +562,8 @@ msgstr "Nonce pour simuler une identité: %s\n" #~ " --help affiche cette aide et quitte\n" #~ " --version affiche les informations de version et quitte\n" -#~ msgid "Prior checkpoint location: %X/%X\n" -#~ msgstr "Point de contrôle précédent : %X/%X\n" - -#~ msgid " -?, --help show this help, then exit\n" -#~ msgstr " -?, --help affiche cette aide et quitte\n" - -#~ msgid " -V, --version output version information, then exit\n" -#~ msgstr " -V, --version affiche la version et quitte\n" - -#~ msgid "Float4 argument passing: %s\n" -#~ msgstr "Passage d'argument float4 : %s\n" +#~ msgid "calculated CRC checksum does not match value stored in file" +#~ msgstr "la somme de contrôle CRC calculée ne correspond par à la valeur enregistrée dans le fichier" -#~ msgid "Report bugs to .\n" -#~ msgstr "Rapporter les bogues à .\n" +#~ msgid "floating-point numbers" +#~ msgstr "nombres à virgule flottante" diff --git a/src/bin/pg_controldata/po/ja.po b/src/bin/pg_controldata/po/ja.po index a98a05fbf1..ae207b66ac 100644 --- a/src/bin/pg_controldata/po/ja.po +++ b/src/bin/pg_controldata/po/ja.po @@ -1,14 +1,14 @@ # Japanese message translation file for pg_controldata -# Copyright (C) 2019 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # Shigehiro Honda , 2005 # msgid "" msgstr "" -"Project-Id-Version: pg_controldata (PostgreSQL 13)\n" +"Project-Id-Version: pg_controldata (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:54+0900\n" -"PO-Revision-Date: 2020-09-13 08:56+0200\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" +"PO-Revision-Date: 2022-05-10 13:48+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -23,56 +23,49 @@ msgstr "" msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読み取り用にオープンできませんでした: %m" -#: ../../common/controldata_utils.c:89 +#: ../../common/controldata_utils.c:86 #, c-format msgid "could not read file \"%s\": %m" msgstr "ファイル\"%s\"の読み取りに失敗しました: %m" -#: ../../common/controldata_utils.c:101 +#: ../../common/controldata_utils.c:95 #, c-format msgid "could not read file \"%s\": read %d of %zu" -msgstr "" -"ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込" -"みました" +msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました" -#: ../../common/controldata_utils.c:117 ../../common/controldata_utils.c:259 +#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244 #, c-format msgid "could not close file \"%s\": %m" msgstr "ファイル\"%s\"をクローズできませんでした: %m" -#: ../../common/controldata_utils.c:135 +#: ../../common/controldata_utils.c:124 msgid "byte ordering mismatch" msgstr "バイトオーダの不整合" -#: ../../common/controldata_utils.c:137 +#: ../../common/controldata_utils.c:126 #, c-format msgid "" "possible byte ordering mismatch\n" -"The byte ordering used to store the pg_control file might not match the " -"one\n" -"used by this program. In that case the results below would be incorrect, " -"and\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" "the PostgreSQL installation would be incompatible with this data directory." msgstr "" "バイトオーダが異なる可能性があります。\n" -"pg_controlファイルを格納するために使用するバイトオーダが本プログラムで使" -"用\n" -"されるものと一致しないようです。この場合以下の結果は不正確になります。ま" -"た、\n" -"PostgreSQLインストレーションはこのデータディレクトリと互換性がなくなりま" -"す。" +"pg_controlファイルを格納するために使用するバイトオーダが本プログラムで使用\n" +"されるものと一致しないようです。この場合以下の結果は不正確になります。また、\n" +"PostgreSQLインストレーションはこのデータディレクトリと互換性がなくなります。" -#: ../../common/controldata_utils.c:203 +#: ../../common/controldata_utils.c:194 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンできませんでした: %m" -#: ../../common/controldata_utils.c:224 +#: ../../common/controldata_utils.c:213 #, c-format msgid "could not write file \"%s\": %m" msgstr "ファイル\"%s\"を書き出せませんでした: %m" -#: ../../common/controldata_utils.c:245 +#: ../../common/controldata_utils.c:232 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"をfsyncできませんでした: %m" @@ -124,14 +117,12 @@ msgstr " -?, --help このヘルプを表示して終了\n" #, c-format msgid "" "\n" -"If no data directory (DATADIR) is specified, the environment variable " -"PGDATA\n" +"If no data directory (DATADIR) is specified, the environment variable PGDATA\n" "is used.\n" "\n" msgstr "" "\n" -"データディレクトリ(DATADIR)が指定されない場合、PGDATA環境変数が使用されま" -"す。\n" +"データディレクトリ(DATADIR)が指定されない場合、PGDATA環境変数が使用されます。\n" "\n" #: pg_controldata.c:44 @@ -180,12 +171,12 @@ msgstr "未知のステータスコード" msgid "unrecognized wal_level" msgstr "wal_level を認識できません" -#: pg_controldata.c:137 pg_controldata.c:155 pg_controldata.c:163 +#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "詳細は\"%s --help\"を実行してください\n" +msgid "Try \"%s --help\" for more information." +msgstr "詳細は\"%s --help\"を実行してください。" -#: pg_controldata.c:153 +#: pg_controldata.c:154 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")" @@ -199,8 +190,7 @@ msgstr "データディレクトリが指定されていません" #, c-format msgid "" "WARNING: Calculated CRC checksum does not match value stored in file.\n" -"Either the file is corrupt, or it has a different layout than this " -"program\n" +"Either the file is corrupt, or it has a different layout than this program\n" "is expecting. The results below are untrustworthy.\n" "\n" msgstr "" @@ -266,250 +256,250 @@ msgstr "pg_control最終更新: %s\n" msgid "Latest checkpoint location: %X/%X\n" msgstr "最終チェックポイント位置: %X/%X\n" -#: pg_controldata.c:241 +#: pg_controldata.c:240 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "最終チェックポイントのREDO位置: %X/%X\n" -#: pg_controldata.c:244 +#: pg_controldata.c:242 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "最終チェックポイントのREDO WALファイル: %s\n" -#: pg_controldata.c:246 +#: pg_controldata.c:244 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "最終チェックポイントの時系列ID: %u\n" -#: pg_controldata.c:248 +#: pg_controldata.c:246 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "最終チェックポイントのPrevTimeLineID: %u\n" -#: pg_controldata.c:250 +#: pg_controldata.c:248 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "最終チェックポイントのfull_page_writes: %s\n" -#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 msgid "off" msgstr "オフ" -#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 msgid "on" msgstr "オン" -#: pg_controldata.c:252 +#: pg_controldata.c:250 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "最終チェックポイントのNextXID: %u:%u\n" -#: pg_controldata.c:255 +#: pg_controldata.c:253 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "最終チェックポイントのNextOID: %u\n" -#: pg_controldata.c:257 +#: pg_controldata.c:255 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "最終チェックポイントのNextMultiXactId: %u\n" -#: pg_controldata.c:259 +#: pg_controldata.c:257 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "最終チェックポイントのNextMultiOffset: %u\n" -#: pg_controldata.c:261 +#: pg_controldata.c:259 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "最終チェックポイントのoldestXID: %u\n" -#: pg_controldata.c:263 +#: pg_controldata.c:261 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "最終チェックポイントのoldestXIDのDB: %u\n" -#: pg_controldata.c:265 +#: pg_controldata.c:263 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "最終チェックポイントのoldestActiveXID: %u\n" -#: pg_controldata.c:267 +#: pg_controldata.c:265 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "最終チェックポイントのoldestMultiXid: %u\n" -#: pg_controldata.c:269 +#: pg_controldata.c:267 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "最終チェックポイントのoldestMultiのDB: %u\n" -#: pg_controldata.c:271 +#: pg_controldata.c:269 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "最終チェックポイントのoldestCommitTsXid: %u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:271 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "最終チェックポイントのnewestCommitTsXid: %u\n" -#: pg_controldata.c:275 +#: pg_controldata.c:273 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "最終チェックポイント時刻: %s\n" -#: pg_controldata.c:277 +#: pg_controldata.c:275 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "UNLOGGEDリレーションの偽のLSNカウンタ: %X/%X\n" -#: pg_controldata.c:280 +#: pg_controldata.c:277 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "最小リカバリ終了位置: %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:279 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "最小リカバリ終了位置のタイムライン: %u\n" -#: pg_controldata.c:285 +#: pg_controldata.c:281 #, c-format msgid "Backup start location: %X/%X\n" msgstr "バックアップ開始位置: %X/%X\n" -#: pg_controldata.c:288 +#: pg_controldata.c:283 #, c-format msgid "Backup end location: %X/%X\n" msgstr "バックアップ終了位置: %X/%X\n" -#: pg_controldata.c:291 +#: pg_controldata.c:285 #, c-format msgid "End-of-backup record required: %s\n" msgstr "必要なバックアップ最終レコード: %s\n" -#: pg_controldata.c:292 +#: pg_controldata.c:286 msgid "no" msgstr "いいえ" -#: pg_controldata.c:292 +#: pg_controldata.c:286 msgid "yes" msgstr "はい" -#: pg_controldata.c:293 +#: pg_controldata.c:287 #, c-format msgid "wal_level setting: %s\n" msgstr "wal_levelの設定: %s\n" -#: pg_controldata.c:295 +#: pg_controldata.c:289 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "wal_log_hintsの設定: %s\n" -#: pg_controldata.c:297 +#: pg_controldata.c:291 #, c-format msgid "max_connections setting: %d\n" msgstr "max_connectionsの設定: %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:293 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "max_worker_processesの設定: %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:295 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "max_wal_sendersの設定: %d\n" -#: pg_controldata.c:303 +#: pg_controldata.c:297 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "max_prepared_xactsの設定: %d\n" -#: pg_controldata.c:305 +#: pg_controldata.c:299 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "max_locks_per_xactの設定: %d\n" -#: pg_controldata.c:307 +#: pg_controldata.c:301 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "track_commit_timestampの設定: %s\n" -#: pg_controldata.c:309 +#: pg_controldata.c:303 #, c-format msgid "Maximum data alignment: %u\n" msgstr "最大データアラインメント: %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:306 #, c-format msgid "Database block size: %u\n" msgstr "データベースのブロックサイズ: %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:308 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "大きなリレーションのセグメント毎のブロック数:%u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:310 #, c-format msgid "WAL block size: %u\n" msgstr "WALのブロックサイズ: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:312 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "WALセグメント当たりのバイト数: %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:314 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "識別子の最大長: %u\n" -#: pg_controldata.c:322 +#: pg_controldata.c:316 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "インデックス内の最大列数: %u\n" -#: pg_controldata.c:324 +#: pg_controldata.c:318 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "TOASTチャンクの最大サイズ: %u\n" -#: pg_controldata.c:326 +#: pg_controldata.c:320 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "ラージオブジェクトチャンクのサイズ: %u\n" -#: pg_controldata.c:329 +#: pg_controldata.c:323 #, c-format msgid "Date/time type storage: %s\n" msgstr "日付/時刻型の格納方式: %s\n" -#: pg_controldata.c:330 +#: pg_controldata.c:324 msgid "64-bit integers" msgstr "64ビット整数" -#: pg_controldata.c:331 +#: pg_controldata.c:325 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Float8引数の渡し方: %s\n" -#: pg_controldata.c:332 +#: pg_controldata.c:326 msgid "by reference" msgstr "参照渡し" -#: pg_controldata.c:332 +#: pg_controldata.c:326 msgid "by value" msgstr "値渡し" -#: pg_controldata.c:333 +#: pg_controldata.c:327 #, c-format msgid "Data page checksum version: %u\n" msgstr "データベージチェックサムのバージョン: %u\n" -#: pg_controldata.c:335 +#: pg_controldata.c:329 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "認証用の疑似nonce: %s\n" @@ -521,9 +511,7 @@ msgstr "認証用の疑似nonce: %s\n" #~ msgstr "%s: \"%s\"ファイルの読み取りに失敗しました: %s\n" #~ msgid "%s: could not read file \"%s\": read %d of %d\n" -#~ msgstr "" -#~ "%1$s: ファイル\"%2$s\"を読み込めませんでした: %4$dバイトのうち%3$dバイト" -#~ "を読み込みました\n" +#~ msgstr "%1$s: ファイル\"%2$s\"を読み込めませんでした: %4$dバイトのうち%3$dバイトを読み込みました\n" #~ msgid "Prior checkpoint location: %X/%X\n" #~ msgstr "前回のチェックポイント位置: %X/%X\n" diff --git a/src/bin/pg_controldata/po/ru.po b/src/bin/pg_controldata/po/ru.po index 39343c05a1..2855bd2681 100644 --- a/src/bin/pg_controldata/po/ru.po +++ b/src/bin/pg_controldata/po/ru.po @@ -4,13 +4,13 @@ # Serguei A. Mokhov , 2002-2004. # Oleg Bartunov , 2004. # Andrey Sudnik , 2011. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021. msgid "" msgstr "" "Project-Id-Version: pg_controldata (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-03 11:22+0300\n" -"PO-Revision-Date: 2020-09-03 13:28+0300\n" +"POT-Creation-Date: 2021-08-14 06:29+0300\n" +"PO-Revision-Date: 2021-08-14 07:04+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -38,7 +38,7 @@ msgstr "не удалось прочитать файл \"%s\" (прочитан #: ../../common/controldata_utils.c:117 ../../common/controldata_utils.c:259 #, c-format msgid "could not close file \"%s\": %m" -msgstr "не удалось прочитать файл \"%s\": %m" +msgstr "не удалось закрыть файл \"%s\": %m" #: ../../common/controldata_utils.c:135 msgid "byte ordering mismatch" @@ -71,7 +71,7 @@ msgstr "не удалось записать файл \"%s\": %m" #: ../../common/controldata_utils.c:245 #, c-format msgid "could not fsync file \"%s\": %m" -msgstr "не удалось прочитать файл \"%s\": %m" +msgstr "не удалось синхронизировать с ФС файл \"%s\": %m" #: pg_controldata.c:35 #, c-format @@ -126,8 +126,8 @@ msgid "" "\n" msgstr "" "\n" -"Если каталог данных не задан, используется значение переменной окружения " -"PGDATA.\n" +"Если каталог данных (КАТ_ДАННЫХ) не задан, используется значение\n" +"переменной окружения PGDATA.\n" "\n" #: pg_controldata.c:44 @@ -277,270 +277,270 @@ msgid "Latest checkpoint location: %X/%X\n" msgstr "Положение последней конт. точки: %X/%X\n" # skip-rule: capital-letter-first -#: pg_controldata.c:241 +#: pg_controldata.c:240 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "Положение REDO последней конт. точки: %X/%X\n" # skip-rule: capital-letter-first -#: pg_controldata.c:244 +#: pg_controldata.c:242 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "Файл WAL c REDO последней к. т.: %s\n" # skip-rule: capital-letter-first -#: pg_controldata.c:246 +#: pg_controldata.c:244 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "Линия времени последней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:248 +#: pg_controldata.c:246 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "Пред. линия времени последней к. т.: %u\n" # skip-rule: no-space-after-period -#: pg_controldata.c:250 +#: pg_controldata.c:248 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "Режим full_page_writes последней к.т: %s\n" -#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 msgid "off" msgstr "выкл." -#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 msgid "on" msgstr "вкл." # skip-rule: capital-letter-first -#: pg_controldata.c:252 +#: pg_controldata.c:250 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID последней конт. точки: %u:%u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:255 +#: pg_controldata.c:253 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID последней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:257 +#: pg_controldata.c:255 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId послед. конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:259 +#: pg_controldata.c:257 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset послед. конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:261 +#: pg_controldata.c:259 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID последней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:263 +#: pg_controldata.c:261 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "БД с oldestXID последней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:265 +#: pg_controldata.c:263 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID последней к. т.: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:267 +#: pg_controldata.c:265 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid последней конт. точки: %u\n" # skip-rule: double-space, capital-letter-first -#: pg_controldata.c:269 +#: pg_controldata.c:267 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "БД с oldestMulti последней к. т.: %u\n" # skip-rule: double-space, capital-letter-first -#: pg_controldata.c:271 +#: pg_controldata.c:269 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid последней к. т.: %u\n" # skip-rule: capital-letter-first, double-space -#: pg_controldata.c:273 +#: pg_controldata.c:271 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid последней к. т.: %u\n" -#: pg_controldata.c:275 +#: pg_controldata.c:273 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "Время последней контрольной точки: %s\n" # skip-rule: capital-letter-first # well-spelled: нежурналир -#: pg_controldata.c:277 +#: pg_controldata.c:275 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "Фиктивный LSN для нежурналир. таблиц: %X/%X\n" -#: pg_controldata.c:280 +#: pg_controldata.c:277 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "Мин. положение конца восстановления: %X/%X\n" # skip-rule: capital-letter-first -#: pg_controldata.c:283 +#: pg_controldata.c:279 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "Линия времени мин. положения к. в.: %u\n" -#: pg_controldata.c:285 +#: pg_controldata.c:281 #, c-format msgid "Backup start location: %X/%X\n" msgstr "Положение начала копии: %X/%X\n" -#: pg_controldata.c:288 +#: pg_controldata.c:283 #, c-format msgid "Backup end location: %X/%X\n" msgstr "Положение конца копии: %X/%X\n" -#: pg_controldata.c:291 +#: pg_controldata.c:285 #, c-format msgid "End-of-backup record required: %s\n" msgstr "Требуется запись конец-копии: %s\n" -#: pg_controldata.c:292 +#: pg_controldata.c:286 msgid "no" msgstr "нет" -#: pg_controldata.c:292 +#: pg_controldata.c:286 msgid "yes" msgstr "да" -#: pg_controldata.c:293 +#: pg_controldata.c:287 #, c-format msgid "wal_level setting: %s\n" msgstr "Значение wal_level: %s\n" -#: pg_controldata.c:295 +#: pg_controldata.c:289 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "Значение wal_log_hints: %s\n" -#: pg_controldata.c:297 +#: pg_controldata.c:291 #, c-format msgid "max_connections setting: %d\n" msgstr "Значение max_connections: %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:293 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "Значение max_worker_processes: %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:295 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "Значение max_wal_senders: %d\n" -#: pg_controldata.c:303 +#: pg_controldata.c:297 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "Значение max_prepared_xacts: %d\n" -#: pg_controldata.c:305 +#: pg_controldata.c:299 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "Значение max_locks_per_xact: %d\n" -#: pg_controldata.c:307 +#: pg_controldata.c:301 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "Значение track_commit_timestamp: %s\n" -#: pg_controldata.c:309 +#: pg_controldata.c:303 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Макс. предел выравнивания данных: %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:306 #, c-format msgid "Database block size: %u\n" msgstr "Размер блока БД: %u\n" # skip-rule: double-space -#: pg_controldata.c:314 +#: pg_controldata.c:308 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Блоков в макс. сегменте отношений: %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:310 #, c-format msgid "WAL block size: %u\n" msgstr "Размер блока WAL: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:312 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Байт в сегменте WAL: %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:314 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Максимальная длина идентификаторов: %u\n" -#: pg_controldata.c:322 +#: pg_controldata.c:316 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Макс. число столбцов в индексе: %u\n" -#: pg_controldata.c:324 +#: pg_controldata.c:318 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Максимальный размер порции TOAST: %u\n" -#: pg_controldata.c:326 +#: pg_controldata.c:320 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Размер порции большого объекта: %u\n" -#: pg_controldata.c:329 +#: pg_controldata.c:323 #, c-format msgid "Date/time type storage: %s\n" msgstr "Формат хранения даты/времени: %s\n" -#: pg_controldata.c:330 +#: pg_controldata.c:324 msgid "64-bit integers" msgstr "64-битные целые" -#: pg_controldata.c:331 +#: pg_controldata.c:325 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Передача аргумента float8: %s\n" -#: pg_controldata.c:332 +#: pg_controldata.c:326 msgid "by reference" msgstr "по ссылке" -#: pg_controldata.c:332 +#: pg_controldata.c:326 msgid "by value" msgstr "по значению" -#: pg_controldata.c:333 +#: pg_controldata.c:327 #, c-format msgid "Data page checksum version: %u\n" msgstr "Версия контрольных сумм страниц: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:335 +#: pg_controldata.c:329 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "Случ. число для псевдоаутентификации: %s\n" diff --git a/src/bin/pg_controldata/po/sv.po b/src/bin/pg_controldata/po/sv.po index 3526df1a9c..aa7501af9d 100644 --- a/src/bin/pg_controldata/po/sv.po +++ b/src/bin/pg_controldata/po/sv.po @@ -1,16 +1,16 @@ # Swedish message translation file for pg_controldata # This file is put in the public domain. -# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020. +# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. # Mats Erik Andersson , 2014. # # Use these quotes: "%s" # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-11 01:17+0000\n" -"PO-Revision-Date: 2020-04-11 07:50+0200\n" +"POT-Creation-Date: 2022-04-11 09:21+0000\n" +"PO-Revision-Date: 2022-04-11 14:40+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -24,26 +24,26 @@ msgstr "" msgid "could not open file \"%s\" for reading: %m" msgstr "kunde inte öppna filen \"%s\" för läsning: %m" -#: ../../common/controldata_utils.c:89 +#: ../../common/controldata_utils.c:86 #, c-format msgid "could not read file \"%s\": %m" msgstr "kunde inte läsa fil \"%s\": %m" -#: ../../common/controldata_utils.c:101 +#: ../../common/controldata_utils.c:95 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" -#: ../../common/controldata_utils.c:117 ../../common/controldata_utils.c:259 +#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244 #, c-format msgid "could not close file \"%s\": %m" msgstr "kunde inte stänga fil \"%s\": %m" -#: ../../common/controldata_utils.c:135 +#: ../../common/controldata_utils.c:124 msgid "byte ordering mismatch" msgstr "byte-ordning stämmer inte" -#: ../../common/controldata_utils.c:137 +#: ../../common/controldata_utils.c:126 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -56,17 +56,17 @@ msgstr "" "inte detta program. I så fall kan nedanstående resultat vara felaktiga\n" "och PostgreSQL-installationen vara inkompatibel med databaskatalogen." -#: ../../common/controldata_utils.c:203 +#: ../../common/controldata_utils.c:194 #, c-format msgid "could not open file \"%s\": %m" msgstr "kunde inte öppna fil \"%s\": %m" -#: ../../common/controldata_utils.c:224 +#: ../../common/controldata_utils.c:213 #, c-format msgid "could not write file \"%s\": %m" msgstr "kunde inte skriva fil \"%s\": %m" -#: ../../common/controldata_utils.c:245 +#: ../../common/controldata_utils.c:232 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "kunde inte fsync:a fil \"%s\": %m" @@ -173,12 +173,12 @@ msgstr "okänd statuskod" msgid "unrecognized wal_level" msgstr "okänd wal_level" -#: pg_controldata.c:137 pg_controldata.c:155 pg_controldata.c:163 +#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Försök med \"%s --help\" för mer information.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." -#: pg_controldata.c:153 +#: pg_controldata.c:154 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för många kommandoradsargument (första är \"%s\")" @@ -269,250 +269,250 @@ msgstr "pg_control ändrades senast: %s\n" msgid "Latest checkpoint location: %X/%X\n" msgstr "Läge för senaste checkpoint: %X/%X\n" -#: pg_controldata.c:241 +#: pg_controldata.c:240 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "REDO-läge för senaste checkpoint: %X/%X\n" -#: pg_controldata.c:244 +#: pg_controldata.c:242 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "REDO-WAL-fil vid senaste checkpoint: %s\n" -#: pg_controldata.c:246 +#: pg_controldata.c:244 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "TimeLineID vid senaste checkpoint: %u\n" -#: pg_controldata.c:248 +#: pg_controldata.c:246 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "PrevTimeLineID vid senaste checkpoint: %u\n" -#: pg_controldata.c:250 +#: pg_controldata.c:248 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "Senaste checkpoint:ens full_page_writes: %s\n" -#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 msgid "off" msgstr "av" -#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 msgid "on" msgstr "på" -#: pg_controldata.c:252 +#: pg_controldata.c:250 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID vid senaste checkpoint: %u:%u\n" -#: pg_controldata.c:255 +#: pg_controldata.c:253 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID vid senaste checkpoint: %u\n" -#: pg_controldata.c:257 +#: pg_controldata.c:255 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId vid senaste checkpoint: %u\n" -#: pg_controldata.c:259 +#: pg_controldata.c:257 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset vid senaste checkpoint: %u\n" -#: pg_controldata.c:261 +#: pg_controldata.c:259 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID vid senaste checkpoint: %u\n" -#: pg_controldata.c:263 +#: pg_controldata.c:261 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "DB för oldestXID vid senaste checkpoint: %u\n" -#: pg_controldata.c:265 +#: pg_controldata.c:263 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID vid senaste checkpoint: %u\n" -#: pg_controldata.c:267 +#: pg_controldata.c:265 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid vid senaste checkpoint: %u\n" -#: pg_controldata.c:269 +#: pg_controldata.c:267 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "DB för oldestMulti vid senaste checkpoint: %u\n" -#: pg_controldata.c:271 +#: pg_controldata.c:269 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid vid senaste checkpoint: %u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:271 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid vid senaste checkpoint: %u\n" -#: pg_controldata.c:275 +#: pg_controldata.c:273 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "Tidpunkt för senaste checkpoint: %s\n" -#: pg_controldata.c:277 +#: pg_controldata.c:275 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "Beräknat LSN-tal av ologgade relationer: %X/%X\n" -#: pg_controldata.c:280 +#: pg_controldata.c:277 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "Minsta slutposition vid återställning: %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:279 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "Tidslinje för min slutpos vid återställning:%u\n" -#: pg_controldata.c:285 +#: pg_controldata.c:281 #, c-format msgid "Backup start location: %X/%X\n" msgstr "Startpunkt för backup: %X/%X\n" -#: pg_controldata.c:288 +#: pg_controldata.c:283 #, c-format msgid "Backup end location: %X/%X\n" msgstr "Slutpunkt för backup: %X/%X\n" -#: pg_controldata.c:291 +#: pg_controldata.c:285 #, c-format msgid "End-of-backup record required: %s\n" msgstr "Tvingande markering av backupslut: %s\n" -#: pg_controldata.c:292 +#: pg_controldata.c:286 msgid "no" msgstr "nej" -#: pg_controldata.c:292 +#: pg_controldata.c:286 msgid "yes" msgstr "ja" -#: pg_controldata.c:293 +#: pg_controldata.c:287 #, c-format msgid "wal_level setting: %s\n" msgstr "Värde på wal_level: %s\n" -#: pg_controldata.c:295 +#: pg_controldata.c:289 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "Värde på wal_log_hints: %s\n" -#: pg_controldata.c:297 +#: pg_controldata.c:291 #, c-format msgid "max_connections setting: %d\n" msgstr "Värde på max_connections: %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:293 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "Värde på max_worker_processes: %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:295 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "Värde på max_wal_senders setting %d\n" -#: pg_controldata.c:303 +#: pg_controldata.c:297 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "Värde på max_prepared_xacts: %d\n" -#: pg_controldata.c:305 +#: pg_controldata.c:299 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "Nuvarande max_locks_per_xact: %d\n" -#: pg_controldata.c:307 +#: pg_controldata.c:301 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "Värde på track_commit_timestamp: %s\n" -#: pg_controldata.c:309 +#: pg_controldata.c:303 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Maximal jämkning av data (alignment): %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:306 #, c-format msgid "Database block size: %u\n" msgstr "Databasens blockstorlek: %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:308 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Block per segment i en stor relation: %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:310 #, c-format msgid "WAL block size: %u\n" msgstr "Blockstorlek i transaktionsloggen: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:312 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Segmentstorlek i transaktionsloggen: %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:314 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Maximal längd för identifierare: %u\n" -#: pg_controldata.c:322 +#: pg_controldata.c:316 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Maximalt antal kolonner i ett index: %u\n" -#: pg_controldata.c:324 +#: pg_controldata.c:318 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Maximal storlek för en TOAST-enhet: %u\n" -#: pg_controldata.c:326 +#: pg_controldata.c:320 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Storlek för large-object-enheter: %u\n" -#: pg_controldata.c:329 +#: pg_controldata.c:323 #, c-format msgid "Date/time type storage: %s\n" msgstr "Representation av dag och tid: %s\n" -#: pg_controldata.c:330 +#: pg_controldata.c:324 msgid "64-bit integers" msgstr "64-bitars heltal" -#: pg_controldata.c:331 +#: pg_controldata.c:325 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Överföring av float8-argument: %s\n" -#: pg_controldata.c:332 +#: pg_controldata.c:326 msgid "by reference" msgstr "med referens" -#: pg_controldata.c:332 +#: pg_controldata.c:326 msgid "by value" msgstr "med värde" -#: pg_controldata.c:333 +#: pg_controldata.c:327 #, c-format msgid "Data page checksum version: %u\n" msgstr "Checksummaversion för datasidor: %u\n" -#: pg_controldata.c:335 +#: pg_controldata.c:329 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "Fejkat authentiseringsvärde: %s\n" diff --git a/src/bin/pg_controldata/po/uk.po b/src/bin/pg_controldata/po/uk.po index 23c5dfb714..673b4db46e 100644 --- a/src/bin/pg_controldata/po/uk.po +++ b/src/bin/pg_controldata/po/uk.po @@ -2,11 +2,11 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:17+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" -"Last-Translator: pasha_golub\n" +"POT-Creation-Date: 2021-06-10 08:49+0000\n" +"PO-Revision-Date: 2021-08-17 10:54\n" +"Last-Translator: \n" "Language-Team: Ukrainian\n" -"Language: uk\n" +"Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/pg_controldata.pot\n" -"X-Crowdin-File-ID: 496\n" +"X-Crowdin-File: /REL_14_DEV/pg_controldata.pot\n" +"X-Crowdin-File-ID: 744\n" #: ../../common/controldata_utils.c:73 #, c-format @@ -159,7 +159,7 @@ msgstr "невизнаний wal_рівень" #: pg_controldata.c:137 pg_controldata.c:155 pg_controldata.c:163 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" для отримання додаткової інформації.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" #: pg_controldata.c:153 #, c-format @@ -230,250 +230,250 @@ msgstr "pg_control був модифікований востаннє: % msgid "Latest checkpoint location: %X/%X\n" msgstr "Останнє місце знаходження контрольної точки: %X/%X\n" -#: pg_controldata.c:241 +#: pg_controldata.c:240 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "Розташування останньої контрольної точки: %X%X\n" -#: pg_controldata.c:244 +#: pg_controldata.c:242 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "Останній файл контрольної точки REDO WAL: %s\n" -#: pg_controldata.c:246 +#: pg_controldata.c:244 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "Останній TimeLineID контрольної точки: %u\n" -#: pg_controldata.c:248 +#: pg_controldata.c:246 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "Останній PrevTimeLineID контрольної точки: %u\n" -#: pg_controldata.c:250 +#: pg_controldata.c:248 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "Останній full_page_writes контрольної точки: %s\n" -#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 msgid "off" msgstr "вимк" -#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 msgid "on" msgstr "увімк" -#: pg_controldata.c:252 +#: pg_controldata.c:250 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "Останній NextXID контрольної точки: %u%u\n" -#: pg_controldata.c:255 +#: pg_controldata.c:253 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "Останній NextOID контрольної точки: %u\n" -#: pg_controldata.c:257 +#: pg_controldata.c:255 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "Останній NextMultiXactId контрольної точки: %u\n" -#: pg_controldata.c:259 +#: pg_controldata.c:257 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "Останній NextMultiOffset контрольної точки: %u\n" -#: pg_controldata.c:261 +#: pg_controldata.c:259 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "Останній oldestXID контрольної точки: %u\n" -#: pg_controldata.c:263 +#: pg_controldata.c:261 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "Остання DB останнього oldestXID контрольної точки: %u\n" -#: pg_controldata.c:265 +#: pg_controldata.c:263 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "Останній oldestActiveXID контрольної точки: %u\n" -#: pg_controldata.c:267 +#: pg_controldata.c:265 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "Останній oldestMultiXid контрольної точки: %u \n" -#: pg_controldata.c:269 +#: pg_controldata.c:267 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "Остання DB останньої oldestMulti контрольної точки: %u\n" -#: pg_controldata.c:271 +#: pg_controldata.c:269 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "Останній oldestCommitTsXid контрольної точки:%u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:271 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "Останній newestCommitTsXid контрольної точки: %u\n" -#: pg_controldata.c:275 +#: pg_controldata.c:273 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "Час останньої контрольної точки: %s\n" -#: pg_controldata.c:277 +#: pg_controldata.c:275 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "Фіктивний LSN для таблиць без журналювання: %X/%X\n" -#: pg_controldata.c:280 +#: pg_controldata.c:277 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "Мінімальне розташування кінця відновлення: %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:279 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "Мінімальна позиція історії часу завершення відновлення: %u\n" -#: pg_controldata.c:285 +#: pg_controldata.c:281 #, c-format msgid "Backup start location: %X/%X\n" msgstr "Початкове розташування резервного копіювання: %X/%X\n" -#: pg_controldata.c:288 +#: pg_controldata.c:283 #, c-format msgid "Backup end location: %X/%X\n" msgstr "Кінцеве розташування резервного копіювання: %X/%X\n" -#: pg_controldata.c:291 +#: pg_controldata.c:285 #, c-format msgid "End-of-backup record required: %s\n" msgstr "Вимагається запис кінця резервного копіювання: %s\n" -#: pg_controldata.c:292 +#: pg_controldata.c:286 msgid "no" msgstr "ні" -#: pg_controldata.c:292 +#: pg_controldata.c:286 msgid "yes" msgstr "так" -#: pg_controldata.c:293 +#: pg_controldata.c:287 #, c-format msgid "wal_level setting: %s\n" msgstr "налаштування wal_рівня: %s\n" -#: pg_controldata.c:295 +#: pg_controldata.c:289 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "налаштування wal_log_hints: %s\n" -#: pg_controldata.c:297 +#: pg_controldata.c:291 #, c-format msgid "max_connections setting: %d\n" msgstr "налаштування max_connections: %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:293 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "налаштування max_worker_processes: %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:295 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "налаштування max_wal_senders: %d\n" -#: pg_controldata.c:303 +#: pg_controldata.c:297 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "налаштування max_prepared_xacts: %d\n" -#: pg_controldata.c:305 +#: pg_controldata.c:299 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "налаштування max_locks_per_xact: %d\n" -#: pg_controldata.c:307 +#: pg_controldata.c:301 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "налаштування track_commit_timestamp: %s\n" -#: pg_controldata.c:309 +#: pg_controldata.c:303 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Максимальне вирівнювання даних: %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:306 #, c-format msgid "Database block size: %u\n" msgstr "Розмір блоку бази даних: %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:308 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Блоків на сегмент великого відношення: %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:310 #, c-format msgid "WAL block size: %u\n" msgstr "Pозмір блоку WAL: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:312 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Байтів на сегмент WAL: %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:314 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Максимальна довжина ідентифікаторів: %u\n" -#: pg_controldata.c:322 +#: pg_controldata.c:316 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Максимальна кількість стовпців в індексі: %u\n" -#: pg_controldata.c:324 +#: pg_controldata.c:318 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Максимальний розмір сегменту TOAST: %u\n" -#: pg_controldata.c:326 +#: pg_controldata.c:320 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Розмір сегменту великих обїєктів: %u\n" -#: pg_controldata.c:329 +#: pg_controldata.c:323 #, c-format msgid "Date/time type storage: %s\n" msgstr "Дата/час типу сховища: %s\n" -#: pg_controldata.c:330 +#: pg_controldata.c:324 msgid "64-bit integers" msgstr "64-бітні цілі" -#: pg_controldata.c:331 +#: pg_controldata.c:325 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Передача аргументу Float8: %s\n" -#: pg_controldata.c:332 +#: pg_controldata.c:326 msgid "by reference" msgstr "за посиланням" -#: pg_controldata.c:332 +#: pg_controldata.c:326 msgid "by value" msgstr "за значенням" -#: pg_controldata.c:333 +#: pg_controldata.c:327 #, c-format msgid "Data page checksum version: %u\n" msgstr "Версія контрольних сум сторінок даних: %u\n" -#: pg_controldata.c:335 +#: pg_controldata.c:329 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "Імітувати нонс для аутентифікації: %s\n" diff --git a/src/bin/pg_controldata/po/zh_CN.po b/src/bin/pg_controldata/po/zh_CN.po index 259996bfc0..d6d2140b77 100644 --- a/src/bin/pg_controldata/po/zh_CN.po +++ b/src/bin/pg_controldata/po/zh_CN.po @@ -3,16 +3,16 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_controldata (PostgreSQL) 12\n" +"Project-Id-Version: pg_controldata (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-06-14 18:00+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:49+0000\n" +"PO-Revision-Date: 2021-08-15 18:00+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.5.7\n" @@ -68,7 +68,7 @@ msgstr "无法写入文件 \"%s\": %m" msgid "could not fsync file \"%s\": %m" msgstr "无法 fsync 文件 \"%s\": %m" -#: pg_controldata.c:36 +#: pg_controldata.c:35 #, c-format msgid "" "%s displays control information of a PostgreSQL database cluster.\n" @@ -77,17 +77,17 @@ msgstr "" "%s 显示 PostgreSQL 数据库簇控制信息.\n" "\n" -#: pg_controldata.c:37 +#: pg_controldata.c:36 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_controldata.c:38 +#: pg_controldata.c:37 #, c-format msgid " %s [OPTION] [DATADIR]\n" msgstr " %s [选项][数据目录]\n" -#: pg_controldata.c:39 +#: pg_controldata.c:38 #, c-format msgid "" "\n" @@ -96,22 +96,22 @@ msgstr "" "\n" "选项:\n" -#: pg_controldata.c:40 +#: pg_controldata.c:39 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]DATADIR 数据目录\n" -#: pg_controldata.c:41 +#: pg_controldata.c:40 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 输出版本信息, 然后退出\n" -#: pg_controldata.c:42 +#: pg_controldata.c:41 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 显示此帮助, 然后退出\n" -#: pg_controldata.c:43 +#: pg_controldata.c:42 #, c-format msgid "" "\n" @@ -124,10 +124,15 @@ msgstr "" "环境变量PGDATA.\n" "\n" +#: pg_controldata.c:44 +#, c-format +msgid "Report bugs to <%s>.\n" +msgstr "臭虫报告至<%s>.\n" + #: pg_controldata.c:45 #, c-format -msgid "Report bugs to .\n" -msgstr "报告错误至 .\n" +msgid "%s home page: <%s>\n" +msgstr "%s 主页: <%s>\n" #: pg_controldata.c:55 msgid "starting up" @@ -165,22 +170,22 @@ msgstr "不被认可的状态码" msgid "unrecognized wal_level" msgstr "参数wal_level的值无法识别" -#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:164 +#: pg_controldata.c:137 pg_controldata.c:155 pg_controldata.c:163 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "用 \"%s --help\" 显示更多的信息.\n" +msgstr "请用 \"%s --help\" 获取更多的信息.\n" -#: pg_controldata.c:154 +#: pg_controldata.c:153 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "命令行参数太多 (第一个是 \"%s\")" -#: pg_controldata.c:163 +#: pg_controldata.c:162 #, c-format msgid "no data directory specified" msgstr "没有指定数据目录" -#: pg_controldata.c:171 +#: pg_controldata.c:170 #, c-format msgid "" "WARNING: Calculated CRC checksum does not match value stored in file.\n" @@ -193,12 +198,12 @@ msgstr "" "下面的结果是不可靠的.\n" "\n" -#: pg_controldata.c:180 +#: pg_controldata.c:179 #, c-format msgid "WARNING: invalid WAL segment size\n" msgstr "警告: 无效的WAL段大小\n" -#: pg_controldata.c:181 +#: pg_controldata.c:180 #, c-format msgid "" "The WAL segment size stored in the file, %d byte, is not a power of two\n" @@ -217,289 +222,284 @@ msgstr[1] "" "WAL段的大小保存在文件中,%d字节不是2的幂次方(在1MB至1BG之间)\n" "文件已损坏,下面的结果不可信.\n" -#: pg_controldata.c:223 +#: pg_controldata.c:222 msgid "???" msgstr "???" -#: pg_controldata.c:236 +#: pg_controldata.c:228 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_control 版本: %u\n" -#: pg_controldata.c:238 +#: pg_controldata.c:230 #, c-format msgid "Catalog version number: %u\n" msgstr "Catalog 版本: %u\n" -#: pg_controldata.c:240 -#, c-format -msgid "Database system identifier: %s\n" -msgstr "数据库系统标识符: %s\n" +#: pg_controldata.c:232 +msgid "Database system identifier: %llu\n" +msgstr "数据库系统标识符: %llu\n" -#: pg_controldata.c:242 +#: pg_controldata.c:234 #, c-format msgid "Database cluster state: %s\n" msgstr "数据库簇状态: %s\n" -#: pg_controldata.c:244 +#: pg_controldata.c:236 #, c-format msgid "pg_control last modified: %s\n" msgstr "pg_control 最后修改: %s\n" -#: pg_controldata.c:246 +#: pg_controldata.c:238 #, c-format msgid "Latest checkpoint location: %X/%X\n" msgstr "最新检查点位置: %X/%X\n" -#: pg_controldata.c:249 +#: pg_controldata.c:240 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "最新检查点的 REDO 位置: %X/%X\n" -#: pg_controldata.c:252 +#: pg_controldata.c:242 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "最新检查点的重做日志文件: %s\n" -#: pg_controldata.c:254 +#: pg_controldata.c:244 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "最新检查点的 TimeLineID: %u\n" -#: pg_controldata.c:256 +#: pg_controldata.c:246 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "最新检查点的PrevTimeLineID: %u\n" -#: pg_controldata.c:258 +#: pg_controldata.c:248 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "最新检查点的full_page_writes: %s\n" -#: pg_controldata.c:259 pg_controldata.c:304 pg_controldata.c:316 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 msgid "off" msgstr "关闭" -#: pg_controldata.c:259 pg_controldata.c:304 pg_controldata.c:316 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 msgid "on" msgstr "开启" -#: pg_controldata.c:260 +#: pg_controldata.c:250 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "最新检查点的NextXID: %u:%u\n" -#: pg_controldata.c:263 +#: pg_controldata.c:253 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "最新检查点的 NextOID: %u\n" -#: pg_controldata.c:265 +#: pg_controldata.c:255 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "最新检查点的NextMultiXactId: %u\n" -#: pg_controldata.c:267 +#: pg_controldata.c:257 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "最新检查点的NextMultiOffsetD: %u\n" -#: pg_controldata.c:269 +#: pg_controldata.c:259 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "最新检查点的oldestXID: %u\n" -#: pg_controldata.c:271 +#: pg_controldata.c:261 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "最新检查点的oldestXID所在的数据库:%u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:263 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "最新检查点的oldestActiveXID: %u\n" -#: pg_controldata.c:275 +#: pg_controldata.c:265 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "最新检查点的oldestMultiXid: %u\n" -#: pg_controldata.c:277 +#: pg_controldata.c:267 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "最新检查点的oldestMulti所在的数据库:%u\n" -#: pg_controldata.c:279 +#: pg_controldata.c:269 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "最新检查点的oldestCommitTsXid:%u\n" -#: pg_controldata.c:281 +#: pg_controldata.c:271 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "最新检查点的newestCommitTsXid:%u\n" -#: pg_controldata.c:283 +#: pg_controldata.c:273 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "最新检查点的时间: %s\n" -#: pg_controldata.c:285 +#: pg_controldata.c:275 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "不带日志的关系: %X/%X使用虚假的LSN计数器\n" -#: pg_controldata.c:288 +#: pg_controldata.c:277 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "最小恢复结束位置: %X/%X\n" -#: pg_controldata.c:291 +#: pg_controldata.c:279 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "最小恢复结束位置时间表: %u\n" -#: pg_controldata.c:293 +#: pg_controldata.c:281 #, c-format msgid "Backup start location: %X/%X\n" msgstr "开始进行备份的点位置: %X/%X\n" -#: pg_controldata.c:296 +#: pg_controldata.c:283 #, c-format msgid "Backup end location: %X/%X\n" msgstr "备份的最终位置: %X/%X\n" -#: pg_controldata.c:299 +#: pg_controldata.c:285 #, c-format msgid "End-of-backup record required: %s\n" msgstr "需要终止备份的记录: %s\n" -#: pg_controldata.c:300 +#: pg_controldata.c:286 msgid "no" msgstr "否" -#: pg_controldata.c:300 +#: pg_controldata.c:286 msgid "yes" msgstr "是" -#: pg_controldata.c:301 +#: pg_controldata.c:287 #, c-format msgid "wal_level setting: %s\n" msgstr "wal_level设置: %s\n" -#: pg_controldata.c:303 +#: pg_controldata.c:289 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "wal_log_hints设置: %s\n" -#: pg_controldata.c:305 +#: pg_controldata.c:291 #, c-format msgid "max_connections setting: %d\n" msgstr "max_connections设置: %d\n" -#: pg_controldata.c:307 +#: pg_controldata.c:293 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "max_worker_processes设置: %d\n" -#: pg_controldata.c:309 +#: pg_controldata.c:295 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "max_wal_senders设置: %d\n" -#: pg_controldata.c:311 +#: pg_controldata.c:297 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "max_prepared_xacts设置: %d\n" -#: pg_controldata.c:313 +#: pg_controldata.c:299 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "max_locks_per_xact设置: %d\n" -#: pg_controldata.c:315 +#: pg_controldata.c:301 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "track_commit_timestamp设置: %s\n" -#: pg_controldata.c:317 +#: pg_controldata.c:303 #, c-format msgid "Maximum data alignment: %u\n" msgstr "最大数据校准: %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:306 #, c-format msgid "Database block size: %u\n" msgstr "数据库块大小: %u\n" -#: pg_controldata.c:322 +#: pg_controldata.c:308 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "大关系的每段块数: %u\n" -#: pg_controldata.c:324 +#: pg_controldata.c:310 #, c-format msgid "WAL block size: %u\n" msgstr "WAL的块大小: %u\n" -#: pg_controldata.c:326 +#: pg_controldata.c:312 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "每一个 WAL 段字节数: %u\n" -#: pg_controldata.c:328 +#: pg_controldata.c:314 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "标识符的最大长度: %u\n" -#: pg_controldata.c:330 +#: pg_controldata.c:316 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "在索引中可允许使用最大的列数: %u\n" -#: pg_controldata.c:332 +#: pg_controldata.c:318 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "TOAST区块的最大长度: %u\n" -#: pg_controldata.c:334 +#: pg_controldata.c:320 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "大对象区块的大小: %u\n" -#: pg_controldata.c:337 +#: pg_controldata.c:323 #, c-format msgid "Date/time type storage: %s\n" msgstr "日期/时间 类型存储: %s\n" -#: pg_controldata.c:338 +#: pg_controldata.c:324 msgid "64-bit integers" msgstr "64位整数" -#: pg_controldata.c:339 +#: pg_controldata.c:325 #, c-format -msgid "Float4 argument passing: %s\n" -msgstr "正在传递Flloat4类型的参数: %s\n" +msgid "Float8 argument passing: %s\n" +msgstr "正在传递Flloat8类型的参数: %s\n" -#: pg_controldata.c:340 pg_controldata.c:342 +#: pg_controldata.c:326 msgid "by reference" msgstr "由引用" -#: pg_controldata.c:340 pg_controldata.c:342 +#: pg_controldata.c:326 msgid "by value" msgstr "由值" -#: pg_controldata.c:341 -#, c-format -msgid "Float8 argument passing: %s\n" -msgstr "正在传递Flloat8类型的参数: %s\n" - -#: pg_controldata.c:343 +#: pg_controldata.c:327 #, c-format msgid "Data page checksum version: %u\n" msgstr "数据页校验和版本: %u\n" -#: pg_controldata.c:345 +#: pg_controldata.c:329 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "当前身份验证: %s\n" + diff --git a/src/bin/pg_ctl/po/cs.po b/src/bin/pg_ctl/po/cs.po index c7b3237b8c..99183ab198 100644 --- a/src/bin/pg_ctl/po/cs.po +++ b/src/bin/pg_ctl/po/cs.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pg_ctl-cs (PostgreSQL 9.3)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2020-10-31 16:14+0000\n" -"PO-Revision-Date: 2020-10-31 21:30+0100\n" +"PO-Revision-Date: 2021-09-16 09:07+0200\n" "Last-Translator: Tomas Vondra \n" "Language-Team: Czech \n" "Language: cs\n" @@ -570,7 +570,7 @@ msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-c]\n" msgstr "" -" %s restart [-D ADRESÁŘ] [-m MÓD-UKONČENÍ] [-W] [-t SECS] [-s]\n" +" %s restart [-D ADRESÁŘ] [-m MÓD-UKONČENÍ] [-W] [-t SECS] [-s]\n" " [-o VOLBY] [-c]\n" #: pg_ctl.c:2040 @@ -591,7 +591,7 @@ msgstr " %s promote [-D ADRESÁŘ] [-W] [-t SECS] [-s]\n" #: pg_ctl.c:2043 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" -msgstr " %s reload [-D ADRESÁŘ] [-s]\n" +msgstr " %s logrotate [-D ADRESÁŘ] [-s]\n" #: pg_ctl.c:2044 #, c-format diff --git a/src/bin/pg_ctl/po/de.po b/src/bin/pg_ctl/po/de.po index 61afaf1f24..8a136f71f9 100644 --- a/src/bin/pg_ctl/po/de.po +++ b/src/bin/pg_ctl/po/de.po @@ -1,14 +1,14 @@ # German message translation file for pg_ctl -# Peter Eisentraut , 2004 - 2021. +# Peter Eisentraut , 2004 - 2022. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-24 06:46+0000\n" -"PO-Revision-Date: 2021-04-24 09:40+0200\n" +"POT-Creation-Date: 2022-05-06 07:48+0000\n" +"PO-Revision-Date: 2022-05-06 10:55+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -16,48 +16,48 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 +#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "konnte aktuelles Verzeichnis nicht ermitteln: %m" -#: ../../common/exec.c:155 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "ungültige Programmdatei »%s«" -#: ../../common/exec.c:205 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "konnte Programmdatei »%s« nicht lesen" -#: ../../common/exec.c:213 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "konnte kein »%s« zum Ausführen finden" -#: ../../common/exec.c:269 ../../common/exec.c:308 +#: ../../common/exec.c:282 ../../common/exec.c:321 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m" -#: ../../common/exec.c:286 +#: ../../common/exec.c:299 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m" -#: ../../common/exec.c:409 +#: ../../common/exec.c:422 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 msgid "out of memory" msgstr "Speicher aufgebraucht" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 -#: ../../port/path.c:632 ../../port/path.c:670 ../../port/path.c:687 +#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" @@ -97,135 +97,123 @@ msgstr "Kindprozess wurde von Signal %d beendet: %s" msgid "child process exited with unrecognized status %d" msgstr "Kindprozess hat mit unbekanntem Status %d beendet" -#: ../../port/path.c:654 +#: ../../port/path.c:775 #, c-format msgid "could not get current working directory: %s\n" msgstr "konnte aktuelles Arbeitsverzeichnis nicht ermitteln: %s\n" -#: pg_ctl.c:258 +#: pg_ctl.c:260 #, c-format msgid "%s: directory \"%s\" does not exist\n" msgstr "%s: Verzeichnis »%s« existiert nicht\n" -#: pg_ctl.c:261 +#: pg_ctl.c:263 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s: konnte nicht auf Verzeichnis »%s« zugreifen: %s\n" -#: pg_ctl.c:274 +#: pg_ctl.c:276 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" msgstr "%s: Verzeichnis »%s« ist kein Datenbankclusterverzeichnis\n" -#: pg_ctl.c:287 +#: pg_ctl.c:289 #, c-format msgid "%s: could not open PID file \"%s\": %s\n" msgstr "%s: konnte PID-Datei »%s« nicht öffnen: %s\n" -#: pg_ctl.c:296 +#: pg_ctl.c:298 #, c-format msgid "%s: the PID file \"%s\" is empty\n" msgstr "%s: die PID-Datei »%s« ist leer\n" -#: pg_ctl.c:299 +#: pg_ctl.c:301 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" msgstr "%s: ungültige Daten in PID-Datei »%s«\n" -#: pg_ctl.c:458 pg_ctl.c:500 +#: pg_ctl.c:464 pg_ctl.c:506 #, c-format msgid "%s: could not start server: %s\n" msgstr "%s: konnte Server nicht starten: %s\n" -#: pg_ctl.c:478 +#: pg_ctl.c:484 #, c-format msgid "%s: could not start server due to setsid() failure: %s\n" msgstr "%s: konnte Server wegen setsid()-Fehler nicht starten: %s\n" -#: pg_ctl.c:548 +#: pg_ctl.c:554 #, c-format msgid "%s: could not open log file \"%s\": %s\n" msgstr "%s: konnte Logdatei »%s« nicht öffnen: %s\n" -#: pg_ctl.c:565 +#: pg_ctl.c:571 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s: konnte Server nicht starten: Fehlercode %lu\n" -#: pg_ctl.c:712 +#: pg_ctl.c:788 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" msgstr "%s: kann Grenzwert für Core-Datei-Größe nicht setzen; durch harten Grenzwert verboten\n" -#: pg_ctl.c:738 +#: pg_ctl.c:814 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "%s: konnte Datei »%s« nicht lesen\n" -#: pg_ctl.c:743 +#: pg_ctl.c:819 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: Optionsdatei »%s« muss genau eine Zeile haben\n" -#: pg_ctl.c:785 pg_ctl.c:974 pg_ctl.c:1070 +#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112 #, c-format msgid "%s: could not send stop signal (PID: %ld): %s\n" msgstr "%s: konnte Stopp-Signal nicht senden (PID: %ld): %s\n" -#: pg_ctl.c:813 +#: pg_ctl.c:889 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation.\n" -msgstr "" -"Das Programm »%s« wird von %s benötigt, aber wurde nicht im\n" -"selben Verzeichnis wie »%s« gefunden.\n" -"Prüfen Sie Ihre Installation.\n" +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" +msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden\n" -#: pg_ctl.c:818 +#: pg_ctl.c:892 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation.\n" -msgstr "" -"Das Programm »%s« wurde von %s gefunden,\n" -"aber es hatte nicht die gleiche Version wie %s.\n" -"Prüfen Sie Ihre Installation.\n" +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" +msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s\n" -#: pg_ctl.c:851 +#: pg_ctl.c:923 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s: Initialisierung des Datenbanksystems fehlgeschlagen\n" -#: pg_ctl.c:866 +#: pg_ctl.c:938 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" msgstr "%s: ein anderer Server läuft möglicherweise; versuche trotzdem zu starten\n" -#: pg_ctl.c:914 +#: pg_ctl.c:986 msgid "waiting for server to start..." msgstr "warte auf Start des Servers..." -#: pg_ctl.c:919 pg_ctl.c:1024 pg_ctl.c:1116 pg_ctl.c:1241 +#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243 msgid " done\n" msgstr " fertig\n" -#: pg_ctl.c:920 +#: pg_ctl.c:992 msgid "server started\n" msgstr "Server gestartet\n" -#: pg_ctl.c:923 pg_ctl.c:929 pg_ctl.c:1246 +#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248 msgid " stopped waiting\n" msgstr " Warten beendet\n" -#: pg_ctl.c:924 +#: pg_ctl.c:996 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: Starten des Servers hat nicht rechtzeitig abgeschlossen\n" -#: pg_ctl.c:930 +#: pg_ctl.c:1002 #, c-format msgid "" "%s: could not start server\n" @@ -234,52 +222,42 @@ msgstr "" "%s: konnte Server nicht starten\n" "Prüfen Sie die Logausgabe.\n" -#: pg_ctl.c:938 +#: pg_ctl.c:1010 msgid "server starting\n" msgstr "Server startet\n" -#: pg_ctl.c:959 pg_ctl.c:1046 pg_ctl.c:1137 pg_ctl.c:1176 pg_ctl.c:1270 +#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: PID-Datei »%s« existiert nicht\n" -#: pg_ctl.c:960 pg_ctl.c:1048 pg_ctl.c:1138 pg_ctl.c:1177 pg_ctl.c:1271 +#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273 msgid "Is server running?\n" msgstr "Läuft der Server?\n" -#: pg_ctl.c:966 +#: pg_ctl.c:1036 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n" msgstr "%s: kann Server nicht anhalten; Einzelbenutzerserver läuft (PID: %ld)\n" -#: pg_ctl.c:981 +#: pg_ctl.c:1051 msgid "server shutting down\n" msgstr "Server fährt herunter\n" -#: pg_ctl.c:996 pg_ctl.c:1085 -msgid "" -"WARNING: online backup mode is active\n" -"Shutdown will not complete until pg_stop_backup() is called.\n" -"\n" -msgstr "" -"WARNUNG: Online-Backup-Modus ist aktiv\n" -"Herunterfahren wird erst abgeschlossen werden, wenn pg_stop_backup() aufgerufen wird.\n" -"\n" - -#: pg_ctl.c:1000 pg_ctl.c:1089 +#: pg_ctl.c:1056 pg_ctl.c:1117 msgid "waiting for server to shut down..." msgstr "warte auf Herunterfahren des Servers..." -#: pg_ctl.c:1016 pg_ctl.c:1107 +#: pg_ctl.c:1060 pg_ctl.c:1122 msgid " failed\n" msgstr " Fehler\n" -#: pg_ctl.c:1018 pg_ctl.c:1109 +#: pg_ctl.c:1062 pg_ctl.c:1124 #, c-format msgid "%s: server does not shut down\n" msgstr "%s: Server fährt nicht herunter\n" -#: pg_ctl.c:1020 pg_ctl.c:1111 +#: pg_ctl.c:1064 pg_ctl.c:1126 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -287,245 +265,245 @@ msgstr "" "TIPP: Die Option »-m fast« beendet Sitzungen sofort, statt auf das Beenden\n" "durch die Sitzungen selbst zu warten.\n" -#: pg_ctl.c:1026 pg_ctl.c:1117 +#: pg_ctl.c:1070 pg_ctl.c:1132 msgid "server stopped\n" msgstr "Server angehalten\n" -#: pg_ctl.c:1049 +#: pg_ctl.c:1091 msgid "trying to start server anyway\n" msgstr "versuche Server trotzdem zu starten\n" -#: pg_ctl.c:1058 +#: pg_ctl.c:1100 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n" msgstr "%s: kann Server nicht neu starten; Einzelbenutzerserver läuft (PID: %ld)\n" -#: pg_ctl.c:1061 pg_ctl.c:1147 +#: pg_ctl.c:1103 pg_ctl.c:1162 msgid "Please terminate the single-user server and try again.\n" msgstr "Bitte beenden Sie den Einzelbenutzerserver und versuchen Sie es noch einmal.\n" -#: pg_ctl.c:1121 +#: pg_ctl.c:1136 #, c-format msgid "%s: old server process (PID: %ld) seems to be gone\n" msgstr "%s: alter Serverprozess (PID: %ld) scheint verschwunden zu sein\n" -#: pg_ctl.c:1123 +#: pg_ctl.c:1138 msgid "starting server anyway\n" msgstr "starte Server trotzdem\n" -#: pg_ctl.c:1144 +#: pg_ctl.c:1159 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n" msgstr "%s: kann Server nicht neu laden; Einzelbenutzerserver läuft (PID: %ld)\n" -#: pg_ctl.c:1153 +#: pg_ctl.c:1168 #, c-format msgid "%s: could not send reload signal (PID: %ld): %s\n" msgstr "%s: konnte Signal zum Neuladen nicht senden (PID: %ld): %s\n" -#: pg_ctl.c:1158 +#: pg_ctl.c:1173 msgid "server signaled\n" msgstr "Signal an Server gesendet\n" -#: pg_ctl.c:1183 +#: pg_ctl.c:1198 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n" msgstr "%s: kann Server nicht befördern; Einzelbenutzerserver läuft (PID: %ld)\n" -#: pg_ctl.c:1191 +#: pg_ctl.c:1206 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s: kann Server nicht befördern; Server ist nicht im Standby-Modus\n" -#: pg_ctl.c:1201 +#: pg_ctl.c:1216 #, c-format msgid "%s: could not create promote signal file \"%s\": %s\n" msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht erzeugen: %s\n" -#: pg_ctl.c:1207 +#: pg_ctl.c:1222 #, c-format msgid "%s: could not write promote signal file \"%s\": %s\n" msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht schreiben: %s\n" -#: pg_ctl.c:1215 +#: pg_ctl.c:1230 #, c-format msgid "%s: could not send promote signal (PID: %ld): %s\n" msgstr "%s: konnte Signal zum Befördern nicht senden (PID: %ld): %s\n" -#: pg_ctl.c:1218 +#: pg_ctl.c:1233 #, c-format msgid "%s: could not remove promote signal file \"%s\": %s\n" msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht entfernen: %s\n" -#: pg_ctl.c:1228 +#: pg_ctl.c:1240 msgid "waiting for server to promote..." msgstr "warte auf Befördern des Servers..." -#: pg_ctl.c:1242 +#: pg_ctl.c:1244 msgid "server promoted\n" msgstr "Server wurde befördert\n" -#: pg_ctl.c:1247 +#: pg_ctl.c:1249 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s: Befördern des Servers hat nicht rechtzeitig abgeschlossen\n" -#: pg_ctl.c:1253 +#: pg_ctl.c:1255 msgid "server promoting\n" msgstr "Server wird befördert\n" -#: pg_ctl.c:1277 +#: pg_ctl.c:1279 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n" msgstr "%s: kann Logdatei nicht rotieren; Einzelbenutzerserver läuft (PID: %ld)\n" -#: pg_ctl.c:1287 +#: pg_ctl.c:1289 #, c-format msgid "%s: could not create log rotation signal file \"%s\": %s\n" msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht erzeugen: %s\n" -#: pg_ctl.c:1293 +#: pg_ctl.c:1295 #, c-format msgid "%s: could not write log rotation signal file \"%s\": %s\n" msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht schreiben: %s\n" -#: pg_ctl.c:1301 +#: pg_ctl.c:1303 #, c-format msgid "%s: could not send log rotation signal (PID: %ld): %s\n" msgstr "%s: konnte Signal zum Logrotieren nicht senden (PID: %ld): %s\n" -#: pg_ctl.c:1304 +#: pg_ctl.c:1306 #, c-format msgid "%s: could not remove log rotation signal file \"%s\": %s\n" msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht entfernen: %s\n" -#: pg_ctl.c:1309 +#: pg_ctl.c:1311 msgid "server signaled to rotate log file\n" msgstr "Signal zum Logrotieren an Server gesendet\n" -#: pg_ctl.c:1356 +#: pg_ctl.c:1358 #, c-format msgid "%s: single-user server is running (PID: %ld)\n" msgstr "%s: Einzelbenutzerserver läuft (PID: %ld)\n" -#: pg_ctl.c:1370 +#: pg_ctl.c:1372 #, c-format msgid "%s: server is running (PID: %ld)\n" msgstr "%s: Server läuft (PID: %ld)\n" -#: pg_ctl.c:1386 +#: pg_ctl.c:1388 #, c-format msgid "%s: no server running\n" msgstr "%s: kein Server läuft\n" -#: pg_ctl.c:1403 +#: pg_ctl.c:1405 #, c-format msgid "%s: could not send signal %d (PID: %ld): %s\n" msgstr "%s: konnte Signal %d nicht senden (PID: %ld): %s\n" -#: pg_ctl.c:1434 +#: pg_ctl.c:1436 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: konnte eigene Programmdatei nicht finden\n" -#: pg_ctl.c:1444 +#: pg_ctl.c:1446 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: konnte »postgres« Programmdatei nicht finden\n" -#: pg_ctl.c:1514 pg_ctl.c:1548 +#: pg_ctl.c:1516 pg_ctl.c:1550 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: konnte Servicemanager nicht öffnen\n" -#: pg_ctl.c:1520 +#: pg_ctl.c:1522 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: Systemdienst »%s« ist bereits registriert\n" -#: pg_ctl.c:1531 +#: pg_ctl.c:1533 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: konnte Systemdienst »%s« nicht registrieren: Fehlercode %lu\n" -#: pg_ctl.c:1554 +#: pg_ctl.c:1556 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: Systemdienst »%s« ist nicht registriert\n" -#: pg_ctl.c:1561 +#: pg_ctl.c:1563 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: konnte Systemdienst »%s« nicht öffnen: Fehlercode %lu\n" -#: pg_ctl.c:1570 +#: pg_ctl.c:1572 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: konnte Systemdienst »%s« nicht deregistrieren: Fehlercode %lu\n" -#: pg_ctl.c:1657 +#: pg_ctl.c:1659 msgid "Waiting for server startup...\n" msgstr "Warte auf Start des Servers...\n" -#: pg_ctl.c:1660 +#: pg_ctl.c:1662 msgid "Timed out waiting for server startup\n" msgstr "Zeitüberschreitung beim Warten auf Start des Servers\n" -#: pg_ctl.c:1664 +#: pg_ctl.c:1666 msgid "Server started and accepting connections\n" msgstr "Server wurde gestartet und nimmt Verbindungen an\n" -#: pg_ctl.c:1719 +#: pg_ctl.c:1721 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: konnte Systemdienst »%s« nicht starten: Fehlercode %lu\n" -#: pg_ctl.c:1789 +#: pg_ctl.c:1824 #, c-format msgid "%s: WARNING: cannot create restricted tokens on this platform\n" msgstr "%s: WARNUNG: auf dieser Plattform können keine beschränkten Token erzeugt werden\n" -#: pg_ctl.c:1802 +#: pg_ctl.c:1837 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: konnte Prozess-Token nicht öffnen: Fehlercode %lu\n" -#: pg_ctl.c:1816 +#: pg_ctl.c:1851 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: konnte SIDs nicht erzeugen: Fehlercode %lu\n" -#: pg_ctl.c:1843 +#: pg_ctl.c:1878 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: konnte beschränktes Token nicht erzeugen: Fehlercode %lu\n" -#: pg_ctl.c:1874 +#: pg_ctl.c:1909 #, c-format msgid "%s: WARNING: could not locate all job object functions in system API\n" msgstr "%s: WARNUNG: konnte nicht alle Job-Objekt-Funtionen in der System-API finden\n" -#: pg_ctl.c:1971 +#: pg_ctl.c:2006 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: konnte LUIDs für Privilegien nicht ermitteln: Fehlercode %lu\n" -#: pg_ctl.c:1979 pg_ctl.c:1994 +#: pg_ctl.c:2014 pg_ctl.c:2029 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: konnte Token-Informationen nicht ermitteln: Fehlercode %lu\n" -#: pg_ctl.c:1988 +#: pg_ctl.c:2023 #, c-format msgid "%s: out of memory\n" msgstr "%s: Speicher aufgebraucht\n" -#: pg_ctl.c:2018 +#: pg_ctl.c:2053 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" -#: pg_ctl.c:2026 +#: pg_ctl.c:2061 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" @@ -535,17 +513,17 @@ msgstr "" "starten, anzuhalten oder zu steuern.\n" "\n" -#: pg_ctl.c:2027 +#: pg_ctl.c:2062 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_ctl.c:2028 +#: pg_ctl.c:2063 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D DATENVERZ] [-s] [-o OPTIONEN]\n" -#: pg_ctl.c:2029 +#: pg_ctl.c:2064 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" @@ -554,12 +532,12 @@ msgstr "" " %s start [-D DATENVERZ] [-l DATEINAME] [-W] [-t SEK] [-s]\n" " [-o OPTIONEN] [-p PFAD] [-c]\n" -#: pg_ctl.c:2031 +#: pg_ctl.c:2066 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr " %s stop [-D DATENVERZ] [-m SHUTDOWN-MODUS] [-W] [-t SEK] [-s]\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2067 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" @@ -568,32 +546,32 @@ msgstr "" " %s restart [-D DATENVERZ] [-m SHUTDOWN-MODUS] [-W] [-t SEK] [-s]\n" " [-o OPTIONEN] [-c]\n" -#: pg_ctl.c:2034 +#: pg_ctl.c:2069 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D DATENVERZ] [-s]\n" -#: pg_ctl.c:2035 +#: pg_ctl.c:2070 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D DATENVERZ]\n" -#: pg_ctl.c:2036 +#: pg_ctl.c:2071 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D DATENVERZ] [-W] [-t SEK] [-s]\n" -#: pg_ctl.c:2037 +#: pg_ctl.c:2072 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D DATENVERZ] [-s]\n" -#: pg_ctl.c:2038 +#: pg_ctl.c:2073 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill SIGNALNAME PID\n" -#: pg_ctl.c:2040 +#: pg_ctl.c:2075 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" @@ -602,12 +580,12 @@ msgstr "" " %s register [-D DATENVERZ] [-N DIENSTNAME] [-U BENUTZERNAME] [-P PASSWORT]\n" " [-S STARTTYP] [-e QUELLE] [-W] [-t SEK] [-s] [-o OPTIONEN]\n" -#: pg_ctl.c:2042 +#: pg_ctl.c:2077 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N DIENSTNAME]\n" -#: pg_ctl.c:2045 +#: pg_ctl.c:2080 #, c-format msgid "" "\n" @@ -616,56 +594,56 @@ msgstr "" "\n" "Optionen für alle Modi:\n" -#: pg_ctl.c:2046 +#: pg_ctl.c:2081 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " -D, --pgdata=DATENVERZ Datenbankverzeichnis\n" -#: pg_ctl.c:2048 +#: pg_ctl.c:2083 #, c-format msgid " -e SOURCE event source for logging when running as a service\n" msgstr "" " -e QUELLE Ereignisquelle fürs Loggen, wenn als Systemdienst\n" " gestartet\n" -#: pg_ctl.c:2050 +#: pg_ctl.c:2085 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr " -s, --silent nur Fehler zeigen, keine Informationsmeldungen\n" -#: pg_ctl.c:2051 +#: pg_ctl.c:2086 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr " -t, --timeout=SEK Sekunden zu warten bei Option -w\n" -#: pg_ctl.c:2052 +#: pg_ctl.c:2087 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_ctl.c:2053 +#: pg_ctl.c:2088 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait warten bis Operation abgeschlossen ist (Voreinstellung)\n" -#: pg_ctl.c:2054 +#: pg_ctl.c:2089 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait nicht warten bis Operation abgeschlossen ist\n" -#: pg_ctl.c:2055 +#: pg_ctl.c:2090 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_ctl.c:2056 +#: pg_ctl.c:2091 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "" "Wenn die Option -D weggelassen wird, dann wird die Umgebungsvariable\n" "PGDATA verwendet.\n" -#: pg_ctl.c:2058 +#: pg_ctl.c:2093 #, c-format msgid "" "\n" @@ -674,24 +652,24 @@ msgstr "" "\n" "Optionen für Start oder Neustart:\n" -#: pg_ctl.c:2060 +#: pg_ctl.c:2095 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files erlaubt postgres Core-Dateien zu erzeugen\n" -#: pg_ctl.c:2062 +#: pg_ctl.c:2097 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files betrifft diese Plattform nicht\n" -#: pg_ctl.c:2064 +#: pg_ctl.c:2099 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr "" " -l, --log=DATEINAME Serverlog in DATEINAME schreiben (wird an bestehende\n" " Datei angehängt)\n" -#: pg_ctl.c:2065 +#: pg_ctl.c:2100 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" @@ -700,12 +678,12 @@ msgstr "" " -o, --options=OPTIONEN Kommandozeilenoptionen für postgres (PostgreSQL-\n" " Serverprogramm) oder initdb\n" -#: pg_ctl.c:2067 +#: pg_ctl.c:2102 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p PFAD-ZU-POSTGRES normalerweise nicht notwendig\n" -#: pg_ctl.c:2068 +#: pg_ctl.c:2103 #, c-format msgid "" "\n" @@ -714,12 +692,12 @@ msgstr "" "\n" "Optionen für Anhalten oder Neustart:\n" -#: pg_ctl.c:2069 +#: pg_ctl.c:2104 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr " -m, --mode=MODUS MODUS kann »smart«, »fast« oder »immediate« sein\n" -#: pg_ctl.c:2071 +#: pg_ctl.c:2106 #, c-format msgid "" "\n" @@ -728,24 +706,24 @@ msgstr "" "\n" "Shutdown-Modi sind:\n" -#: pg_ctl.c:2072 +#: pg_ctl.c:2107 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart beenden nachdem alle Clientverbindungen geschlossen sind\n" -#: pg_ctl.c:2073 +#: pg_ctl.c:2108 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast sofort beenden, mit richtigem Shutdown (Voreinstellung)\n" -#: pg_ctl.c:2074 +#: pg_ctl.c:2109 #, c-format msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" msgstr "" " immediate beenden ohne vollständigen Shutdown; führt zu Recovery-Lauf\n" " beim Neustart\n" -#: pg_ctl.c:2076 +#: pg_ctl.c:2111 #, c-format msgid "" "\n" @@ -754,7 +732,7 @@ msgstr "" "\n" "Erlaubte Signalnamen für »kill«:\n" -#: pg_ctl.c:2080 +#: pg_ctl.c:2115 #, c-format msgid "" "\n" @@ -763,27 +741,27 @@ msgstr "" "\n" "Optionen für »register« und »unregister«:\n" -#: pg_ctl.c:2081 +#: pg_ctl.c:2116 #, c-format msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr " -N DIENSTNAME Systemdienstname für Registrierung des PostgreSQL-Servers\n" -#: pg_ctl.c:2082 +#: pg_ctl.c:2117 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr " -P PASSWORD Passwort des Benutzers für Registrierung des PostgreSQL-Servers\n" -#: pg_ctl.c:2083 +#: pg_ctl.c:2118 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr " -U USERNAME Benutzername für Registrierung des PostgreSQL-Servers\n" -#: pg_ctl.c:2084 +#: pg_ctl.c:2119 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr " -S STARTTYP Systemdienst-Starttyp für PostgreSQL-Server\n" -#: pg_ctl.c:2086 +#: pg_ctl.c:2121 #, c-format msgid "" "\n" @@ -792,19 +770,19 @@ msgstr "" "\n" "Starttypen sind:\n" -#: pg_ctl.c:2087 +#: pg_ctl.c:2122 #, c-format msgid " auto start service automatically during system startup (default)\n" msgstr "" " auto Dienst automatisch starten beim Start des Betriebssystems\n" " (Voreinstellung)\n" -#: pg_ctl.c:2088 +#: pg_ctl.c:2123 #, c-format msgid " demand start service on demand\n" msgstr " demand Dienst bei Bedarf starten\n" -#: pg_ctl.c:2091 +#: pg_ctl.c:2126 #, c-format msgid "" "\n" @@ -813,37 +791,37 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_ctl.c:2092 +#: pg_ctl.c:2127 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_ctl.c:2117 +#: pg_ctl.c:2152 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: unbekannter Shutdown-Modus »%s«\n" -#: pg_ctl.c:2146 +#: pg_ctl.c:2181 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: unbekannter Signalname »%s«\n" -#: pg_ctl.c:2163 +#: pg_ctl.c:2198 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: unbekannter Starttyp »%s«\n" -#: pg_ctl.c:2218 +#: pg_ctl.c:2253 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: konnte das Datenverzeichnis mit Befehl »%s« nicht ermitteln\n" -#: pg_ctl.c:2242 +#: pg_ctl.c:2277 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: Kontrolldatei scheint kaputt zu sein\n" -#: pg_ctl.c:2310 +#: pg_ctl.c:2345 #, c-format msgid "" "%s: cannot be run as root\n" @@ -854,32 +832,32 @@ msgstr "" "Bitte loggen Sie sich (z.B. mit »su«) als der (unprivilegierte) Benutzer\n" "ein, der Eigentümer des Serverprozesses sein soll.\n" -#: pg_ctl.c:2393 +#: pg_ctl.c:2428 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: Option -S wird auf dieser Plattform nicht unterstützt\n" -#: pg_ctl.c:2430 +#: pg_ctl.c:2465 #, c-format msgid "%s: too many command-line arguments (first is \"%s\")\n" msgstr "%s: zu viele Kommandozeilenargumente (das erste ist »%s«)\n" -#: pg_ctl.c:2456 +#: pg_ctl.c:2491 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: fehlende Argumente für »kill«-Modus\n" -#: pg_ctl.c:2474 +#: pg_ctl.c:2509 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: unbekannter Operationsmodus »%s«\n" -#: pg_ctl.c:2484 +#: pg_ctl.c:2519 #, c-format msgid "%s: no operation specified\n" msgstr "%s: keine Operation angegeben\n" -#: pg_ctl.c:2505 +#: pg_ctl.c:2540 #, c-format msgid "%s: no database directory specified and environment variable PGDATA unset\n" msgstr "%s: kein Datenbankverzeichnis angegeben und Umgebungsvariable PGDATA nicht gesetzt\n" diff --git a/src/bin/pg_ctl/po/el.po b/src/bin/pg_ctl/po/el.po index b34c73ae7a..4feda08fd1 100644 --- a/src/bin/pg_ctl/po/el.po +++ b/src/bin/pg_ctl/po/el.po @@ -3,11 +3,13 @@ # This file is distributed under the same license as the pg_ctl (PostgreSQL) package. # Georgios Kokolatos , 2021 # +# +# msgid "" msgstr "" -"Project-Id-Version: pg_ctl (PostgreSQL) 13\n" +"Project-Id-Version: pg_ctl (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-25 05:46+0000\n" +"POT-Creation-Date: 2021-07-13 05:15+0000\n" "PO-Revision-Date: 2021-03-30 10:28+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" @@ -26,32 +28,32 @@ msgstr "δεν ήταν δυνατή η αναγνώριση του τρέχον #: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" -msgstr "μη έγκυρο δυαδικό αρχείο “%s”" +msgstr "μη έγκυρο δυαδικό αρχείο «%s»" #: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" -msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου “%s”" +msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου «%s»" #: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" -msgstr "δεν βρέθηκε το αρχείο “%s” για να εκτελεστεί" +msgstr "δεν βρέθηκε το αρχείο «%s» για να εκτελεστεί" #: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" -msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο “%s”: %m" +msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" #: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου “%s”: %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου «%s»: %m" #: ../../common/exec.c:409 #, c-format msgid "%s() failed: %m" -msgstr "%s () απέτυχε: %m" +msgstr "%s() απέτυχε: %m" #: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 msgid "out of memory" @@ -107,32 +109,32 @@ msgstr "δεν ήταν δυνατή η επεξεργασία του τρέχο #: pg_ctl.c:258 #, c-format msgid "%s: directory \"%s\" does not exist\n" -msgstr "%s: ο κατάλογος \"%s\" δεν υπάρχει\n" +msgstr "%s: ο κατάλογος «%s» δεν υπάρχει\n" #: pg_ctl.c:261 #, c-format msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: δεν ήταν δυνατή η πρόσβαση στον κατάλογο \"%s\": %s\n" +msgstr "%s: δεν ήταν δυνατή η πρόσβαση στον κατάλογο «%s»: %s\n" #: pg_ctl.c:274 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" -msgstr "%s: ο κατάλογος \"%s\" δεν είναι κατάλογος συστάδας βάσης δεδομένων\n" +msgstr "%s: ο κατάλογος «%s» δεν είναι κατάλογος συστάδας βάσης δεδομένων\n" #: pg_ctl.c:287 #, c-format msgid "%s: could not open PID file \"%s\": %s\n" -msgstr "%s: δεν ήταν δυνατό το άνοιγμα αρχείου PID “%s”: %s\n" +msgstr "%s: δεν ήταν δυνατό το άνοιγμα αρχείου PID «%s»: %s\n" #: pg_ctl.c:296 #, c-format msgid "%s: the PID file \"%s\" is empty\n" -msgstr "%s: το αρχείο PID “%s” είναι άδειο\n" +msgstr "%s: το αρχείο PID «%s» είναι άδειο\n" #: pg_ctl.c:299 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" -msgstr "%s: μη έγκυρα δεδομένα στο αρχείο PID “%s”\n" +msgstr "%s: μη έγκυρα δεδομένα στο αρχείο PID «%s»\n" #: pg_ctl.c:458 pg_ctl.c:500 #, c-format @@ -147,7 +149,7 @@ msgstr "%s: δεν ήταν δυνατή η εκκίνηση του διακομ #: pg_ctl.c:548 #, c-format msgid "%s: could not open log file \"%s\": %s\n" -msgstr "%s: δεν ήταν δυνατό το άνοιγμα του αρχείου καταγραφής “%s”: %s\n" +msgstr "%s: δεν ήταν δυνατό το άνοιγμα του αρχείου καταγραφής «%s»: %s\n" #: pg_ctl.c:565 #, c-format @@ -162,12 +164,12 @@ msgstr "%s: δεν είναι δυνατός ο ορισμός ορίου μεγ #: pg_ctl.c:738 #, c-format msgid "%s: could not read file \"%s\"\n" -msgstr "%s: δεν ήταν δυνατή η ανάγνωση αρχείου “%s”\n" +msgstr "%s: δεν ήταν δυνατή η ανάγνωση αρχείου «%s»\n" #: pg_ctl.c:743 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" -msgstr "%s: το αρχείο επιλογής \"%s\" πρέπει να έχει ακριβώς μία γραμμή\n" +msgstr "%s: το αρχείο επιλογής «%s» πρέπει να έχει ακριβώς μία γραμμή\n" #: pg_ctl.c:785 pg_ctl.c:974 pg_ctl.c:1070 #, c-format @@ -181,8 +183,8 @@ msgid "" "same directory as \"%s\".\n" "Check your installation.\n" msgstr "" -"Το πρόγραμμα \"%s\" απαιτείται από %s αλλά δεν βρέθηκε στον\n" -"ίδιο κατάλογο με το \"%s\".\n" +"Το πρόγραμμα «%s» απαιτείται από %s αλλά δεν βρέθηκε στον\n" +"ίδιο κατάλογο με το «%s».\n" "Ελέγξτε την εγκατάστασή σας.\n" #: pg_ctl.c:818 @@ -192,7 +194,7 @@ msgid "" "but was not the same version as %s.\n" "Check your installation.\n" msgstr "" -"Το πρόγραμμα \"%s\" βρέθηκε από το \"%s\"\n" +"Το πρόγραμμα «%s» βρέθηκε από το \"%s\"\n" "αλλά δεν ήταν στην ίδια έκδοση με %s.\n" "Ελέγξτε την εγκατάστασή σας.\n" @@ -243,7 +245,7 @@ msgstr "εκκίνηση διακομιστή\n" #: pg_ctl.c:959 pg_ctl.c:1046 pg_ctl.c:1137 pg_ctl.c:1176 pg_ctl.c:1270 #, c-format msgid "%s: PID file \"%s\" does not exist\n" -msgstr "%s: το αρχείο PID “%s” δεν υπάρχει\n" +msgstr "%s: το αρχείο PID «%s» δεν υπάρχει\n" #: pg_ctl.c:960 pg_ctl.c:1048 pg_ctl.c:1138 pg_ctl.c:1177 pg_ctl.c:1271 msgid "Is server running?\n" @@ -342,12 +344,12 @@ msgstr "%s: δεν είναι δυνατή η προβίβαση του διακ #: pg_ctl.c:1201 #, c-format msgid "%s: could not create promote signal file \"%s\": %s\n" -msgstr "%s: δεν ήταν δυνατή η δημιουργία του αρχείου σήματος προβιβασμού \"%s\": %s\n" +msgstr "%s: δεν ήταν δυνατή η δημιουργία του αρχείου σήματος προβιβασμού «%s»: %s\n" #: pg_ctl.c:1207 #, c-format msgid "%s: could not write promote signal file \"%s\": %s\n" -msgstr "%s: δεν ήταν δυνατή η εγγραφή του αρχείου σήματος προβιβασμού \"%s\": %s\n" +msgstr "%s: δεν ήταν δυνατή η εγγραφή του αρχείου σήματος προβιβασμού «%s»: %s\n" #: pg_ctl.c:1215 #, c-format @@ -357,7 +359,7 @@ msgstr "%s: δεν ήταν δυνατή η αποστολή σήματος πρ #: pg_ctl.c:1218 #, c-format msgid "%s: could not remove promote signal file \"%s\": %s\n" -msgstr "%s: δεν ήταν δυνατή η κατάργηση του αρχείου σήματος προβιβασμού \"%s\": %s\n" +msgstr "%s: δεν ήταν δυνατή η κατάργηση του αρχείου σήματος προβιβασμού «%s»: %s\n" #: pg_ctl.c:1228 msgid "waiting for server to promote..." @@ -384,12 +386,12 @@ msgstr "%s: δεν είναι δυνατή η περιστροφή του αρχ #: pg_ctl.c:1287 #, c-format msgid "%s: could not create log rotation signal file \"%s\": %s\n" -msgstr "%s: δεν ήταν δυνατή η δημιουργία αρχείου σήματος περιστροφής αρχείου καταγραφής \"%s\": %s\n" +msgstr "%s: δεν ήταν δυνατή η δημιουργία αρχείου σήματος περιστροφής αρχείου καταγραφής «%s»: %s\n" #: pg_ctl.c:1293 #, c-format msgid "%s: could not write log rotation signal file \"%s\": %s\n" -msgstr "%s: δεν ήταν δυνατή η εγγραφή του αρχείου σήματος περιστροφής αρχείου καταγραφής \"%s\": %s\n" +msgstr "%s: δεν ήταν δυνατή η εγγραφή του αρχείου σήματος περιστροφής αρχείου καταγραφής «%s»: %s\n" #: pg_ctl.c:1301 #, c-format @@ -399,7 +401,7 @@ msgstr "%s: δεν ήταν δυνατή η αποστολή σήματος πε #: pg_ctl.c:1304 #, c-format msgid "%s: could not remove log rotation signal file \"%s\": %s\n" -msgstr "%s: δεν ήταν δυνατή η κατάργηση του αρχείου σήματος περιστροφής αρχείου καταγραφής \"%s\": %s\n" +msgstr "%s: δεν ήταν δυνατή η κατάργηση του αρχείου σήματος περιστροφής αρχείου καταγραφής «%s»: %s\n" #: pg_ctl.c:1309 msgid "server signaled to rotate log file\n" @@ -443,27 +445,27 @@ msgstr "%s: δεν ήταν δυνατό το άνοιγμα του διαχει #: pg_ctl.c:1520 #, c-format msgid "%s: service \"%s\" already registered\n" -msgstr "%s: η υπηρεσία \"%s\" έχει ήδη καταχωρηθεί\n" +msgstr "%s: η υπηρεσία «%s» έχει ήδη καταχωρηθεί\n" #: pg_ctl.c:1531 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" -msgstr "%s: δεν ήταν δυνατή η καταχώρηση της υπηρεσίας \"%s\": κωδικός σφάλματος %lu\n" +msgstr "%s: δεν ήταν δυνατή η καταχώρηση της υπηρεσίας «%s»: κωδικός σφάλματος %lu\n" #: pg_ctl.c:1554 #, c-format msgid "%s: service \"%s\" not registered\n" -msgstr "%s: η υπηρεσία \"%s\" δεν έχει καταχωρηθεί\n" +msgstr "%s: η υπηρεσία «%s» δεν έχει καταχωρηθεί\n" #: pg_ctl.c:1561 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" -msgstr "%s: δεν ήταν δυνατό το άνοιγμα της υπηρεσίας \"%s\": κωδικός σφάλματος %lu\n" +msgstr "%s: δεν ήταν δυνατό το άνοιγμα της υπηρεσίας «%s»: κωδικός σφάλματος %lu\n" #: pg_ctl.c:1570 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" -msgstr "%s: δεν ήταν δυνατή η διαγραφή καταχώρησης της υπηρεσίας \"%s\": κωδικός σφάλματος %lu\n" +msgstr "%s: δεν ήταν δυνατή η διαγραφή καταχώρησης της υπηρεσίας «%s»: κωδικός σφάλματος %lu\n" #: pg_ctl.c:1657 msgid "Waiting for server startup...\n" @@ -480,7 +482,7 @@ msgstr "Ο διακομιστής ξεκίνησε και αποδέχτηκε #: pg_ctl.c:1719 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" -msgstr "%s: δεν ήταν δυνατή η εκκίνηση της υπηρεσίας \"%s\": κωδικός σφάλματος %lu\n" +msgstr "%s: δεν ήταν δυνατή η εκκίνηση της υπηρεσίας «%s»: κωδικός σφάλματος %lu\n" #: pg_ctl.c:1789 #, c-format @@ -525,7 +527,7 @@ msgstr "%s: έλλειψη μνήμης\n" #: pg_ctl.c:2018 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Δοκιμάστε “%s —help” για περισσότερες πληροφορίες.\n" +msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n" #: pg_ctl.c:2026 #, c-format @@ -623,7 +625,7 @@ msgstr "" #: pg_ctl.c:2046 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" -msgstr " [-D, —pgdata=]DATADIR τοποθεσία για τη περιοχή αποθήκευσης της βάσης δεδομένων\n" +msgstr " [-D, --pgdata=]DATADIR τοποθεσία για τη περιοχή αποθήκευσης της βάσης δεδομένων\n" #: pg_ctl.c:2048 #, c-format @@ -633,32 +635,32 @@ msgstr " -e SOURCE πηγή προέλευσης συμβάντω #: pg_ctl.c:2050 #, c-format msgid " -s, --silent only print errors, no informational messages\n" -msgstr " -s, —silent εκτύπωση μόνο σφαλμάτων, χωρίς ενημερωτικά μηνύματα\n" +msgstr " -s, --silent εκτύπωση μόνο σφαλμάτων, χωρίς ενημερωτικά μηνύματα\n" #: pg_ctl.c:2051 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" -msgstr " -t, —timeout=SECS δευτερόλεπτα αναμονής κατά τη χρήση της επιλογής -w\n" +msgstr " -t, --timeout=SECS δευτερόλεπτα αναμονής κατά τη χρήση της επιλογής -w\n" #: pg_ctl.c:2052 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, —version εμφάνισε πληροφορίες έκδοσης και, στη συνέχεια, έξοδος\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" #: pg_ctl.c:2053 #, c-format msgid " -w, --wait wait until operation completes (default)\n" -msgstr " -w, —wait περίμενε μέχρι να ολοκληρωθεί η λειτουργία (προεπιλογή)\n" +msgstr " -w, --wait περίμενε μέχρι να ολοκληρωθεί η λειτουργία (προεπιλογή)\n" #: pg_ctl.c:2054 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" -msgstr " -W, —no-wait να μην περιμένει μέχρι να ολοκληρωθεί η λειτουργία\n" +msgstr " -W, --no-wait να μην περιμένει μέχρι να ολοκληρωθεί η λειτουργία\n" #: pg_ctl.c:2055 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, —help εμφάνισε αυτό το μήνυμα βοήθειας, και μετά έξοδος\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" #: pg_ctl.c:2056 #, c-format @@ -677,12 +679,12 @@ msgstr "" #: pg_ctl.c:2060 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" -msgstr " -c, —core-files επίτρεψε στην postgres να παράγει αρχεία αποτύπωσης μνήμης\n" +msgstr " -c, --core-files επίτρεψε στην postgres να παράγει αρχεία αποτύπωσης μνήμης\n" #: pg_ctl.c:2062 #, c-format msgid " -c, --core-files not applicable on this platform\n" -msgstr " -c, —core-files ανεφάρμοστο σε αυτήν την πλατφόρμα\n" +msgstr " -c, --core-files ανεφάρμοστο σε αυτήν την πλατφόρμα\n" #: pg_ctl.c:2064 #, c-format @@ -695,13 +697,13 @@ msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" " (PostgreSQL server executable) or initdb\n" msgstr "" -" -o, —options=OPTIONS επιλογές γραμμής εντολών που θα διαβιστούν στη postgres\n" +" -o, --options=OPTIONS επιλογές γραμμής εντολών που θα διαβιστούν στη postgres\n" " (εκτελέσιμο αρχείο διακομιστή PostgreSQL) ή initdb\n" #: pg_ctl.c:2067 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" -msgstr " -p ΤΟ PATH-TO-POSTGRES κανονικά δεν είναι απαραίτητο\n" +msgstr " -p PATH-TO-POSTGRES κανονικά δεν είναι απαραίτητο\n" #: pg_ctl.c:2068 #, c-format @@ -715,7 +717,7 @@ msgstr "" #: pg_ctl.c:2069 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" -msgstr " -m, —mode=MODE MODE μπορεί να είνα “smart”, “fast”, ή “immediate”\n" +msgstr " -m, --mode=MODE MODE μπορεί να είνα «smart», «fast», ή «immediate»\n" #: pg_ctl.c:2071 #, c-format @@ -815,22 +817,22 @@ msgstr "%s αρχική σελίδα: <%s>\n" #: pg_ctl.c:2117 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" -msgstr "%s: μη αναγνωρισμένη λειτουργία τερματισμού λειτουργίας \"%s\"\n" +msgstr "%s: μη αναγνωρισμένη λειτουργία τερματισμού λειτουργίας «%s»\n" #: pg_ctl.c:2146 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" -msgstr "%s: μη αναγνωρισμένο όνομα σήματος \"%s\"\n" +msgstr "%s: μη αναγνωρισμένο όνομα σήματος «%s»\n" #: pg_ctl.c:2163 #, c-format msgid "%s: unrecognized start type \"%s\"\n" -msgstr "%s: μη αναγνωρίσιμος τύπος έναρξης \"%s\"\n" +msgstr "%s: μη αναγνωρίσιμος τύπος έναρξης «%s»\n" #: pg_ctl.c:2218 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" -msgstr "%s: δεν ήταν δυνατός ο προσδιορισμός του καταλόγου δεδομένων με χρήση της εντολής \"%s\"\n" +msgstr "%s: δεν ήταν δυνατός ο προσδιορισμός του καταλόγου δεδομένων με χρήση της εντολής «%s»\n" #: pg_ctl.c:2242 #, c-format @@ -856,7 +858,7 @@ msgstr "%s: επιλογή -S δεν υποστηρίζεται σε αυτήν #: pg_ctl.c:2430 #, c-format msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: πάρα πολλοί παραμέτροι εισόδου από την γραμμή εντολών (πρώτη είναι η “%s”)\n" +msgstr "%s: πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)\n" #: pg_ctl.c:2456 #, c-format @@ -866,7 +868,7 @@ msgstr "%s: λείπουν παράμετροι για τη λειτουργία #: pg_ctl.c:2474 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" -msgstr "%s: μη αναγνωρισμένη λειτουργία \"%s\"\n" +msgstr "%s: μη αναγνωρισμένη λειτουργία «%s»\n" #: pg_ctl.c:2484 #, c-format diff --git a/src/bin/pg_ctl/po/es.po b/src/bin/pg_ctl/po/es.po index b3be2080a6..bc82215904 100644 --- a/src/bin/pg_ctl/po/es.po +++ b/src/bin/pg_ctl/po/es.po @@ -1,6 +1,6 @@ # Spanish translation of pg_ctl. # -# Copyright (c) 2004-2019, PostgreSQL Global Development Group +# Copyright (c) 2004-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Alvaro Herrera , 2004-2013 @@ -9,7 +9,7 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_ctl (PostgreSQL) 12\n" +"Project-Id-Version: pg_ctl (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2021-05-14 19:46+0000\n" "PO-Revision-Date: 2021-05-20 23:12-0500\n" diff --git a/src/bin/pg_ctl/po/fr.po b/src/bin/pg_ctl/po/fr.po index 3c72fe5f60..0d6f124aff 100644 --- a/src/bin/pg_ctl/po/fr.po +++ b/src/bin/pg_ctl/po/fr.po @@ -1,66 +1,70 @@ -# translation of pg_ctl.po to fr_fr -# french message translation file for pg_ctl +# LANGUAGE message translation file for pg_ctl +# Copyright (C) 2003-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_ctl (PostgreSQL) package. # # Use these quotes: « %s » # # Guillaume Lelarge , 2003-2009. # Stéphane Schildknecht , 2009. +# Guillaume Lelarge , 2010-2022. +# msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-26 06:46+0000\n" -"PO-Revision-Date: 2021-04-26 11:37+0200\n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" "Last-Translator: Guillaume Lelarge \n" -"Language-Team: PostgreSQLfr \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" -#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 +#: ../../common/exec.c:144 ../../common/exec.c:261 ../../common/exec.c:307 #, c-format msgid "could not identify current directory: %m" msgstr "n'a pas pu identifier le répertoire courant : %m" -#: ../../common/exec.c:155 +#: ../../common/exec.c:163 #, c-format msgid "invalid binary \"%s\"" msgstr "binaire « %s » invalide" -#: ../../common/exec.c:205 +#: ../../common/exec.c:213 #, c-format msgid "could not read binary \"%s\"" msgstr "n'a pas pu lire le binaire « %s »" -#: ../../common/exec.c:213 +#: ../../common/exec.c:221 #, c-format msgid "could not find a \"%s\" to execute" msgstr "n'a pas pu trouver un « %s » à exécuter" -#: ../../common/exec.c:269 ../../common/exec.c:308 +#: ../../common/exec.c:277 ../../common/exec.c:316 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "n'a pas pu modifier le répertoire par « %s » : %m" -#: ../../common/exec.c:286 +#: ../../common/exec.c:294 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "n'a pas pu lire le lien symbolique « %s » : %m" -#: ../../common/exec.c:409 +#: ../../common/exec.c:417 #, c-format msgid "%s() failed: %m" msgstr "échec de %s() : %m" -#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 +#: ../../common/exec.c:555 ../../common/exec.c:600 ../../common/exec.c:692 msgid "out of memory" msgstr "mémoire épuisée" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 -#: ../../port/path.c:632 ../../port/path.c:670 ../../port/path.c:687 +#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 #, c-format msgid "out of memory\n" msgstr "mémoire épuisée\n" @@ -100,139 +104,127 @@ msgstr "le processus fils a été terminé par le signal %d : %s" msgid "child process exited with unrecognized status %d" msgstr "le processus fils a quitté avec un statut %d non reconnu" -#: ../../port/path.c:654 +#: ../../port/path.c:775 #, c-format msgid "could not get current working directory: %s\n" msgstr "n'a pas pu obtenir le répertoire de travail : %s\n" -#: pg_ctl.c:258 +#: pg_ctl.c:260 #, c-format msgid "%s: directory \"%s\" does not exist\n" msgstr "%s : le répertoire « %s » n'existe pas\n" -#: pg_ctl.c:261 +#: pg_ctl.c:263 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n" -#: pg_ctl.c:274 +#: pg_ctl.c:276 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" msgstr "%s : le répertoire « %s » n'est pas un répertoire d'instance\n" -#: pg_ctl.c:287 +#: pg_ctl.c:289 #, c-format msgid "%s: could not open PID file \"%s\": %s\n" msgstr "%s : n'a pas pu ouvrir le fichier de PID « %s » : %s\n" -#: pg_ctl.c:296 +#: pg_ctl.c:298 #, c-format msgid "%s: the PID file \"%s\" is empty\n" msgstr "%s : le fichier PID « %s » est vide\n" -#: pg_ctl.c:299 +#: pg_ctl.c:301 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" msgstr "%s : données invalides dans le fichier de PID « %s »\n" -#: pg_ctl.c:458 pg_ctl.c:500 +#: pg_ctl.c:464 pg_ctl.c:506 #, c-format msgid "%s: could not start server: %s\n" msgstr "%s : n'a pas pu démarrer le serveur : %s\n" -#: pg_ctl.c:478 +#: pg_ctl.c:484 #, c-format msgid "%s: could not start server due to setsid() failure: %s\n" msgstr "%s : n'a pas pu démarrer le serveur à cause d'un échec de setsid() : %s\n" -#: pg_ctl.c:548 +#: pg_ctl.c:554 #, c-format msgid "%s: could not open log file \"%s\": %s\n" msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %s\n" -#: pg_ctl.c:565 +#: pg_ctl.c:571 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s : n'a pas pu démarrer le serveur : code d'erreur %lu\n" -#: pg_ctl.c:712 +#: pg_ctl.c:788 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" msgstr "" "%s : n'a pas pu initialiser la taille des fichiers core, ceci est interdit\n" "par une limite dure\n" -#: pg_ctl.c:738 +#: pg_ctl.c:814 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "%s : n'a pas pu lire le fichier « %s »\n" -#: pg_ctl.c:743 +#: pg_ctl.c:819 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s : le fichier d'options « %s » ne doit comporter qu'une seule ligne\n" -#: pg_ctl.c:785 pg_ctl.c:974 pg_ctl.c:1070 +#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112 #, c-format msgid "%s: could not send stop signal (PID: %ld): %s\n" msgstr "%s : n'a pas pu envoyer le signal d'arrêt (PID : %ld) : %s\n" -#: pg_ctl.c:813 +#: pg_ctl.c:889 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation.\n" -msgstr "" -"Le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé\n" -"dans le même répertoire que « %s ».\n" -"Vérifiez votre installation.\n" +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" +msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »\n" -#: pg_ctl.c:818 +#: pg_ctl.c:892 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation.\n" -msgstr "" -"Le programme « %s », trouvé par « %s », n'est pas de la même version\n" -"que %s.\n" -"Vérifiez votre installation.\n" +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" +msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s\n" -#: pg_ctl.c:851 +#: pg_ctl.c:923 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s : l'initialisation du système a échoué\n" -#: pg_ctl.c:866 +#: pg_ctl.c:938 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" msgstr "" "%s : un autre serveur semble en cours d'exécution ; le démarrage du serveur\n" "va toutefois être tenté\n" -#: pg_ctl.c:914 +#: pg_ctl.c:986 msgid "waiting for server to start..." msgstr "en attente du démarrage du serveur..." -#: pg_ctl.c:919 pg_ctl.c:1024 pg_ctl.c:1116 pg_ctl.c:1241 +#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243 msgid " done\n" msgstr " effectué\n" -#: pg_ctl.c:920 +#: pg_ctl.c:992 msgid "server started\n" msgstr "serveur démarré\n" -#: pg_ctl.c:923 pg_ctl.c:929 pg_ctl.c:1246 +#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248 msgid " stopped waiting\n" msgstr " attente arrêtée\n" -#: pg_ctl.c:924 +#: pg_ctl.c:996 #, c-format msgid "%s: server did not start in time\n" msgstr "%s : le serveur ne s'est pas lancé à temps\n" -#: pg_ctl.c:930 +#: pg_ctl.c:1002 #, c-format msgid "" "%s: could not start server\n" @@ -241,54 +233,44 @@ msgstr "" "%s : n'a pas pu démarrer le serveur\n" "Examinez le journal applicatif.\n" -#: pg_ctl.c:938 +#: pg_ctl.c:1010 msgid "server starting\n" msgstr "serveur en cours de démarrage\n" -#: pg_ctl.c:959 pg_ctl.c:1046 pg_ctl.c:1137 pg_ctl.c:1176 pg_ctl.c:1270 +#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s : le fichier de PID « %s » n'existe pas\n" -#: pg_ctl.c:960 pg_ctl.c:1048 pg_ctl.c:1138 pg_ctl.c:1177 pg_ctl.c:1271 +#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273 msgid "Is server running?\n" msgstr "Le serveur est-il en cours d'exécution ?\n" -#: pg_ctl.c:966 +#: pg_ctl.c:1036 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n" msgstr "" "%s : ne peut pas arrêter le serveur ; le serveur mono-utilisateur est en\n" "cours d'exécution (PID : %ld)\n" -#: pg_ctl.c:981 +#: pg_ctl.c:1051 msgid "server shutting down\n" msgstr "serveur en cours d'arrêt\n" -#: pg_ctl.c:996 pg_ctl.c:1085 -msgid "" -"WARNING: online backup mode is active\n" -"Shutdown will not complete until pg_stop_backup() is called.\n" -"\n" -msgstr "" -"ATTENTION : le mode de sauvegarde en ligne est activé.\n" -"L'arrêt ne surviendra qu'au moment où pg_stop_backup() sera appelé.\n" -"\n" - -#: pg_ctl.c:1000 pg_ctl.c:1089 +#: pg_ctl.c:1056 pg_ctl.c:1117 msgid "waiting for server to shut down..." msgstr "en attente de l'arrêt du serveur..." -#: pg_ctl.c:1016 pg_ctl.c:1107 +#: pg_ctl.c:1060 pg_ctl.c:1122 msgid " failed\n" msgstr " a échoué\n" -#: pg_ctl.c:1018 pg_ctl.c:1109 +#: pg_ctl.c:1062 pg_ctl.c:1124 #, c-format msgid "%s: server does not shut down\n" msgstr "%s : le serveur ne s'est pas arrêté\n" -#: pg_ctl.c:1020 pg_ctl.c:1111 +#: pg_ctl.c:1064 pg_ctl.c:1126 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -296,253 +278,253 @@ msgstr "" "ASTUCE : l'option « -m fast » déconnecte immédiatement les sessions plutôt que\n" "d'attendre la déconnexion des sessions déjà présentes.\n" -#: pg_ctl.c:1026 pg_ctl.c:1117 +#: pg_ctl.c:1070 pg_ctl.c:1132 msgid "server stopped\n" msgstr "serveur arrêté\n" -#: pg_ctl.c:1049 +#: pg_ctl.c:1091 msgid "trying to start server anyway\n" msgstr "tentative de lancement du serveur malgré tout\n" -#: pg_ctl.c:1058 +#: pg_ctl.c:1100 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n" msgstr "" "%s : ne peut pas relancer le serveur ; le serveur mono-utilisateur est en\n" "cours d'exécution (PID : %ld)\n" -#: pg_ctl.c:1061 pg_ctl.c:1147 +#: pg_ctl.c:1103 pg_ctl.c:1162 msgid "Please terminate the single-user server and try again.\n" msgstr "Merci d'arrêter le serveur mono-utilisateur et de réessayer.\n" -#: pg_ctl.c:1121 +#: pg_ctl.c:1136 #, c-format msgid "%s: old server process (PID: %ld) seems to be gone\n" msgstr "%s : l'ancien processus serveur (PID : %ld) semble être parti\n" -#: pg_ctl.c:1123 +#: pg_ctl.c:1138 msgid "starting server anyway\n" msgstr "lancement du serveur malgré tout\n" -#: pg_ctl.c:1144 +#: pg_ctl.c:1159 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n" msgstr "" "%s : ne peut pas recharger le serveur ; le serveur mono-utilisateur est en\n" "cours d'exécution (PID : %ld)\n" -#: pg_ctl.c:1153 +#: pg_ctl.c:1168 #, c-format msgid "%s: could not send reload signal (PID: %ld): %s\n" msgstr "%s : n'a pas pu envoyer le signal de rechargement (PID : %ld) : %s\n" -#: pg_ctl.c:1158 +#: pg_ctl.c:1173 msgid "server signaled\n" msgstr "envoi d'un signal au serveur\n" -#: pg_ctl.c:1183 +#: pg_ctl.c:1198 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n" msgstr "" "%s : ne peut pas promouvoir le serveur ; le serveur mono-utilisateur est en\n" "cours d'exécution (PID : %ld)\n" -#: pg_ctl.c:1191 +#: pg_ctl.c:1206 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s : ne peut pas promouvoir le serveur ; le serveur n'est pas en standby\n" -#: pg_ctl.c:1201 +#: pg_ctl.c:1216 #, c-format msgid "%s: could not create promote signal file \"%s\": %s\n" msgstr "%s : n'a pas pu créer le fichier « %s » signalant la promotion : %s\n" -#: pg_ctl.c:1207 +#: pg_ctl.c:1222 #, c-format msgid "%s: could not write promote signal file \"%s\": %s\n" msgstr "%s : n'a pas pu écrire le fichier « %s » signalant la promotion : %s\n" -#: pg_ctl.c:1215 +#: pg_ctl.c:1230 #, c-format msgid "%s: could not send promote signal (PID: %ld): %s\n" msgstr "%s : n'a pas pu envoyer le signal de promotion (PID : %ld) : %s\n" -#: pg_ctl.c:1218 +#: pg_ctl.c:1233 #, c-format msgid "%s: could not remove promote signal file \"%s\": %s\n" msgstr "%s : n'a pas pu supprimer le fichier « %s » signalant la promotion : %s\n" -#: pg_ctl.c:1228 +#: pg_ctl.c:1240 msgid "waiting for server to promote..." msgstr "en attente du serveur à promouvoir..." -#: pg_ctl.c:1242 +#: pg_ctl.c:1244 msgid "server promoted\n" msgstr "serveur promu\n" -#: pg_ctl.c:1247 +#: pg_ctl.c:1249 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s : le serveur ne s'est pas promu à temps\n" -#: pg_ctl.c:1253 +#: pg_ctl.c:1255 msgid "server promoting\n" msgstr "serveur en cours de promotion\n" -#: pg_ctl.c:1277 +#: pg_ctl.c:1279 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n" msgstr "" "%s : ne peut pas faire une rotation de fichier de traces ; le serveur mono-utilisateur est en\n" "cours d'exécution (PID : %ld)\n" -#: pg_ctl.c:1287 +#: pg_ctl.c:1289 #, c-format msgid "%s: could not create log rotation signal file \"%s\": %s\n" msgstr "%s : n'a pas pu créer le fichier « %s » de demande de rotation des fichiers de trace : %s\n" -#: pg_ctl.c:1293 +#: pg_ctl.c:1295 #, c-format msgid "%s: could not write log rotation signal file \"%s\": %s\n" msgstr "%s : n'a pas pu écrire le fichier « %s » de demande de rotation des fichiers de trace : %s\n" -#: pg_ctl.c:1301 +#: pg_ctl.c:1303 #, c-format msgid "%s: could not send log rotation signal (PID: %ld): %s\n" msgstr "%s : n'a pas pu envoyer le signal de rotation des fichiers de trace (PID : %ld) : %s\n" -#: pg_ctl.c:1304 +#: pg_ctl.c:1306 #, c-format msgid "%s: could not remove log rotation signal file \"%s\": %s\n" msgstr "%s : n'a pas pu supprimer le fichier « %s » signalant la demande de rotation des fichiers de trace : %s\n" -#: pg_ctl.c:1309 +#: pg_ctl.c:1311 msgid "server signaled to rotate log file\n" msgstr "envoi d'un signal au serveur pour faire une rotation des traces\n" -#: pg_ctl.c:1356 +#: pg_ctl.c:1358 #, c-format msgid "%s: single-user server is running (PID: %ld)\n" msgstr "%s : le serveur mono-utilisateur est en cours d'exécution (PID : %ld)\n" -#: pg_ctl.c:1370 +#: pg_ctl.c:1372 #, c-format msgid "%s: server is running (PID: %ld)\n" msgstr "%s : le serveur est en cours d'exécution (PID : %ld)\n" -#: pg_ctl.c:1386 +#: pg_ctl.c:1388 #, c-format msgid "%s: no server running\n" msgstr "%s : aucun serveur en cours d'exécution\n" -#: pg_ctl.c:1403 +#: pg_ctl.c:1405 #, c-format msgid "%s: could not send signal %d (PID: %ld): %s\n" msgstr "%s : n'a pas pu envoyer le signal %d (PID : %ld) : %s\n" -#: pg_ctl.c:1434 +#: pg_ctl.c:1436 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s : n'a pas pu trouver l'exécutable du programme\n" -#: pg_ctl.c:1444 +#: pg_ctl.c:1446 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s : n'a pas pu trouver l'exécutable postgres\n" -#: pg_ctl.c:1514 pg_ctl.c:1548 +#: pg_ctl.c:1516 pg_ctl.c:1550 #, c-format msgid "%s: could not open service manager\n" msgstr "%s : n'a pas pu ouvrir le gestionnaire de services\n" -#: pg_ctl.c:1520 +#: pg_ctl.c:1522 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s : le service « %s » est déjà enregistré\n" -#: pg_ctl.c:1531 +#: pg_ctl.c:1533 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s : n'a pas pu enregistrer le service « %s » : code d'erreur %lu\n" -#: pg_ctl.c:1554 +#: pg_ctl.c:1556 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s : le service « %s » n'est pas enregistré\n" -#: pg_ctl.c:1561 +#: pg_ctl.c:1563 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s : n'a pas pu ouvrir le service « %s » : code d'erreur %lu\n" -#: pg_ctl.c:1570 +#: pg_ctl.c:1572 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s : n'a pas pu supprimer le service « %s » : code d'erreur %lu\n" -#: pg_ctl.c:1657 +#: pg_ctl.c:1659 msgid "Waiting for server startup...\n" msgstr "En attente du démarrage du serveur...\n" -#: pg_ctl.c:1660 +#: pg_ctl.c:1662 msgid "Timed out waiting for server startup\n" msgstr "Dépassement du délai pour le démarrage du serveur\n" -#: pg_ctl.c:1664 +#: pg_ctl.c:1666 msgid "Server started and accepting connections\n" msgstr "Serveur lancé et acceptant les connexions\n" -#: pg_ctl.c:1719 +#: pg_ctl.c:1721 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s : n'a pas pu démarrer le service « %s » : code d'erreur %lu\n" -#: pg_ctl.c:1789 +#: pg_ctl.c:1824 #, c-format msgid "%s: WARNING: cannot create restricted tokens on this platform\n" msgstr "%s : ATTENTION : ne peut pas créer les jetons restreints sur cette plateforme\n" -#: pg_ctl.c:1802 +#: pg_ctl.c:1837 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n" -#: pg_ctl.c:1816 +#: pg_ctl.c:1851 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n" -#: pg_ctl.c:1843 +#: pg_ctl.c:1878 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n" -#: pg_ctl.c:1874 +#: pg_ctl.c:1909 #, c-format msgid "%s: WARNING: could not locate all job object functions in system API\n" msgstr "%s : ATTENTION : n'a pas pu localiser toutes les fonctions objet de job dans l'API système\n" -#: pg_ctl.c:1971 +#: pg_ctl.c:2006 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s : n'a pas pu obtenir les LUID pour les droits : code d'erreur %lu\n" -#: pg_ctl.c:1979 pg_ctl.c:1994 +#: pg_ctl.c:2014 pg_ctl.c:2029 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s : n'a pas pu obtenir l'information sur le jeton : code d'erreur %lu\n" -#: pg_ctl.c:1988 +#: pg_ctl.c:2023 #, c-format msgid "%s: out of memory\n" msgstr "%s : mémoire épuisée\n" -#: pg_ctl.c:2018 +#: pg_ctl.c:2053 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Essayer « %s --help » pour plus d'informations.\n" -#: pg_ctl.c:2026 +#: pg_ctl.c:2061 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" @@ -552,65 +534,65 @@ msgstr "" "PostgreSQL.\n" "\n" -#: pg_ctl.c:2027 +#: pg_ctl.c:2062 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: pg_ctl.c:2028 +#: pg_ctl.c:2063 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D RÉP_DONNÉES] [-s] [-o OPTIONS]\n" -#: pg_ctl.c:2029 +#: pg_ctl.c:2064 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-p PATH] [-c]\n" msgstr "" -" %s start [-D RÉP_DONNÉES] [-l NOM_FICHIER] [-W] [-t SECS] [-s]\n" -" [-o OPTIONS] [-p CHEMIN] [-c]\n" +" %s start [-D RÉP_DONNÉES] [-l FICHIER] [-W] [-t SECS] [-s]\n" +" [-o OPTIONS] [-p CHEMIN] [-c]\n" -#: pg_ctl.c:2031 +#: pg_ctl.c:2066 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" -msgstr " %s stop [-D RÉP_DONNÉES] [-m MODE_ARRÊT] [-W] [-t SECS] [-s]\n" +msgstr " %s stop [-D RÉP_DONNÉES] [-m MODE_ARRÊT] [-W] [-t SECS] [-s]\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2067 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-c]\n" msgstr "" -" %s restart [-D RÉP_DONNÉES] [-m MODE_ARRÊT] [-W] [-t SECS] [-s]\n" -" [-o OPTIONS] [-c]\n" +" %s restart [-D RÉP_DONNÉES] [-m MODE_ARRÊT] [-W] [-t SECS] [-s]\n" +" [-o OPTIONS] [-c]\n" -#: pg_ctl.c:2034 +#: pg_ctl.c:2069 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" -msgstr " %s reload [-D RÉP_DONNÉES] [-s]\n" +msgstr " %s reload [-D RÉP_DONNÉES] [-s]\n" -#: pg_ctl.c:2035 +#: pg_ctl.c:2070 #, c-format msgid " %s status [-D DATADIR]\n" -msgstr " %s status [-D RÉP_DONNÉES]\n" +msgstr " %s status [-D RÉP_DONNÉES]\n" -#: pg_ctl.c:2036 +#: pg_ctl.c:2071 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" -msgstr " %s promote [-D RÉP_DONNÉES] [-W] [-t SECS] [-s]\n" +msgstr " %s promote [-D RÉP_DONNÉES] [-W] [-t SECS] [-s]\n" -#: pg_ctl.c:2037 +#: pg_ctl.c:2072 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" -msgstr " %s reload [-D RÉP_DONNÉES] [-s]\n" +msgstr " %s reload [-D RÉP_DONNÉES] [-s]\n" -#: pg_ctl.c:2038 +#: pg_ctl.c:2073 #, c-format msgid " %s kill SIGNALNAME PID\n" -msgstr " %s kill NOM_SIGNAL PID\n" +msgstr " %s kill NOM_SIGNAL PID\n" -#: pg_ctl.c:2040 +#: pg_ctl.c:2075 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" @@ -619,12 +601,12 @@ msgstr "" " %s register [-D RÉP_DONNÉES] [-N NOM_SERVICE] [-U NOM_UTILISATEUR] [-P MOT_DE_PASSE]\n" " [-S TYPE_DÉMARRAGE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" -#: pg_ctl.c:2042 +#: pg_ctl.c:2077 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N NOM_SERVICE]\n" -#: pg_ctl.c:2045 +#: pg_ctl.c:2080 #, c-format msgid "" "\n" @@ -633,58 +615,58 @@ msgstr "" "\n" "Options générales :\n" -#: pg_ctl.c:2046 +#: pg_ctl.c:2081 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" -msgstr " -D, --pgdata=RÉP_DONNÉES emplacement de stockage du cluster\n" +msgstr " -D, --pgdata=RÉP_DONNÉES emplacement du répertoire des données de l'instance\n" -#: pg_ctl.c:2048 +#: pg_ctl.c:2083 #, c-format msgid " -e SOURCE event source for logging when running as a service\n" msgstr "" " -e SOURCE source de l'événement pour la trace lors de\n" " l'exécution en tant que service\n" -#: pg_ctl.c:2050 +#: pg_ctl.c:2085 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr "" " -s, --silent affiche uniquement les erreurs, aucun message\n" " d'informations\n" -#: pg_ctl.c:2051 +#: pg_ctl.c:2086 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr "" -" -t, --timeout=SECS durée en secondes à attendre lors de\n" -" l'utilisation de l'option -w\n" +" -t, --timeout=SECS durée en secondes à attendre lors de l'utilisation\n" +" de l'option -w\n" -#: pg_ctl.c:2052 +#: pg_ctl.c:2087 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version puis quitte\n" +msgstr " -V, --version affiche la version puis quitte\n" -#: pg_ctl.c:2053 +#: pg_ctl.c:2088 #, c-format msgid " -w, --wait wait until operation completes (default)\n" -msgstr " -w, --wait attend la fin de l'opération (par défaut)\n" +msgstr " -w, --wait attend la fin de l'opération (par défaut)\n" -#: pg_ctl.c:2054 +#: pg_ctl.c:2089 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" -msgstr " -W, --no-wait n'attend pas la fin de l'opération\n" +msgstr " -W, --no-wait n'attend pas la fin de l'opération\n" -#: pg_ctl.c:2055 +#: pg_ctl.c:2090 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide puis quitte\n" +msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_ctl.c:2056 +#: pg_ctl.c:2091 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "Si l'option -D est omise, la variable d'environnement PGDATA est utilisée.\n" -#: pg_ctl.c:2058 +#: pg_ctl.c:2093 #, c-format msgid "" "\n" @@ -693,39 +675,37 @@ msgstr "" "\n" "Options pour le démarrage ou le redémarrage :\n" -#: pg_ctl.c:2060 +#: pg_ctl.c:2095 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files autorise postgres à produire des fichiers core\n" -#: pg_ctl.c:2062 +#: pg_ctl.c:2097 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files non applicable à cette plateforme\n" -#: pg_ctl.c:2064 +#: pg_ctl.c:2099 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" -msgstr "" -" -l, --log=NOM_FICHIER écrit (ou ajoute) le journal du serveur dans\n" -" NOM_FICHIER\n" +msgstr " -l, --log=FICHIER écrit (ou ajoute) le journal du serveur dans FICHIER\n" -#: pg_ctl.c:2065 +#: pg_ctl.c:2100 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" " (PostgreSQL server executable) or initdb\n" msgstr "" -" -o, --options=OPTIONS options de la ligne de commande à passer à\n" +" -o, --options=OPTIONS options de la ligne de commande à passer à\n" " postgres (exécutable du serveur PostgreSQL)\n" " ou à initdb\n" -#: pg_ctl.c:2067 +#: pg_ctl.c:2102 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p CHEMIN_POSTGRES normalement pas nécessaire\n" -#: pg_ctl.c:2068 +#: pg_ctl.c:2103 #, c-format msgid "" "\n" @@ -734,14 +714,14 @@ msgstr "" "\n" "Options pour l'arrêt ou le redémarrage :\n" -#: pg_ctl.c:2069 +#: pg_ctl.c:2104 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr "" " -m, --mode=MODE MODE peut valoir « smart », « fast » ou\n" " « immediate »\n" -#: pg_ctl.c:2071 +#: pg_ctl.c:2106 #, c-format msgid "" "\n" @@ -750,24 +730,24 @@ msgstr "" "\n" "Les modes d'arrêt sont :\n" -#: pg_ctl.c:2072 +#: pg_ctl.c:2107 #, c-format msgid " smart quit after all clients have disconnected\n" -msgstr " smart quitte après déconnexion de tous les clients\n" +msgstr " smart quitte après déconnexion de tous les clients\n" -#: pg_ctl.c:2073 +#: pg_ctl.c:2108 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" -msgstr " fast quitte directement, et arrête correctement (par défaut)\n" +msgstr " fast quitte directement, et arrête correctement (par défaut)\n" -#: pg_ctl.c:2074 +#: pg_ctl.c:2109 #, c-format msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" msgstr "" -" immediate quitte sans arrêt complet ; entraîne une\n" -" restauration au démarrage suivant\n" +" immediate quitte sans arrêt complet ; entraîne une restauration au démarrage\n" +" suivant\n" -#: pg_ctl.c:2076 +#: pg_ctl.c:2111 #, c-format msgid "" "\n" @@ -776,7 +756,7 @@ msgstr "" "\n" "Signaux autorisés pour kill :\n" -#: pg_ctl.c:2080 +#: pg_ctl.c:2115 #, c-format msgid "" "\n" @@ -785,35 +765,35 @@ msgstr "" "\n" "Options d'enregistrement ou de dés-enregistrement :\n" -#: pg_ctl.c:2081 +#: pg_ctl.c:2116 #, c-format msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr "" " -N NOM_SERVICE nom du service utilisé pour l'enregistrement du\n" " serveur PostgreSQL\n" -#: pg_ctl.c:2082 +#: pg_ctl.c:2117 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr "" " -P MOT_DE_PASSE mot de passe du compte utilisé pour\n" " l'enregistrement du serveur PostgreSQL\n" -#: pg_ctl.c:2083 +#: pg_ctl.c:2118 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr "" " -U NOM_UTILISATEUR nom de l'utilisateur du compte utilisé pour\n" " l'enregistrement du serveur PostgreSQL\n" -#: pg_ctl.c:2084 +#: pg_ctl.c:2119 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr "" " -S TYPE_DÉMARRAGE type de démarrage du service pour enregistrer le\n" " serveur PostgreSQL\n" -#: pg_ctl.c:2086 +#: pg_ctl.c:2121 #, c-format msgid "" "\n" @@ -822,19 +802,19 @@ msgstr "" "\n" "Les types de démarrage sont :\n" -#: pg_ctl.c:2087 +#: pg_ctl.c:2122 #, c-format msgid " auto start service automatically during system startup (default)\n" msgstr "" " auto démarre le service automatiquement lors du démarrage du système\n" " (par défaut)\n" -#: pg_ctl.c:2088 +#: pg_ctl.c:2123 #, c-format msgid " demand start service on demand\n" msgstr " demand démarre le service à la demande\n" -#: pg_ctl.c:2091 +#: pg_ctl.c:2126 #, c-format msgid "" "\n" @@ -843,37 +823,37 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_ctl.c:2092 +#: pg_ctl.c:2127 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil %s : %s\n" +msgstr "Page d'accueil de %s : <%s>\n" -#: pg_ctl.c:2117 +#: pg_ctl.c:2152 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s : mode d'arrêt non reconnu « %s »\n" -#: pg_ctl.c:2146 +#: pg_ctl.c:2181 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s : signal non reconnu « %s »\n" -#: pg_ctl.c:2163 +#: pg_ctl.c:2198 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s : type de redémarrage « %s » non reconnu\n" -#: pg_ctl.c:2218 +#: pg_ctl.c:2253 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s : n'a pas déterminer le répertoire des données en utilisant la commande « %s »\n" -#: pg_ctl.c:2242 +#: pg_ctl.c:2277 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s : le fichier de contrôle semble corrompu\n" -#: pg_ctl.c:2310 +#: pg_ctl.c:2345 #, c-format msgid "" "%s: cannot be run as root\n" @@ -884,59 +864,52 @@ msgstr "" "Connectez-vous (par exemple en utilisant « su ») sous l'utilisateur (non\n" " privilégié) qui sera propriétaire du processus serveur.\n" -#: pg_ctl.c:2393 +#: pg_ctl.c:2428 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s : option -S non supportée sur cette plateforme\n" -#: pg_ctl.c:2430 +#: pg_ctl.c:2465 #, c-format msgid "%s: too many command-line arguments (first is \"%s\")\n" msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" -#: pg_ctl.c:2456 +#: pg_ctl.c:2491 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s : arguments manquant pour le mode kill\n" -#: pg_ctl.c:2474 +#: pg_ctl.c:2509 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s : mode d'opération « %s » non reconnu\n" -#: pg_ctl.c:2484 +#: pg_ctl.c:2519 #, c-format msgid "%s: no operation specified\n" msgstr "%s : aucune opération indiquée\n" -#: pg_ctl.c:2505 +#: pg_ctl.c:2540 #, c-format msgid "%s: no database directory specified and environment variable PGDATA unset\n" msgstr "" "%s : aucun répertoire de bases de données indiqué et variable\n" "d'environnement PGDATA non initialisée\n" -#~ msgid "%s: could not create log file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu créer le fichier de traces « %s » : %s\n" - #~ msgid "" #~ "\n" -#~ "Report bugs to .\n" +#~ "%s: -w option cannot use a relative socket directory specification\n" #~ msgstr "" #~ "\n" -#~ "Rapporter les bogues à .\n" - -#~ msgid "could not change directory to \"%s\": %s" -#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %s" - -#~ msgid "could not read symbolic link \"%s\"" -#~ msgstr "n'a pas pu lire le lien symbolique « %s »" - -#~ msgid "child process was terminated by signal %s" -#~ msgstr "le processus fils a été terminé par le signal %s" +#~ "%s : l'option -w ne peut pas utiliser un chemin relatif vers le répertoire de\n" +#~ "la socket\n" -#~ msgid "server is still starting up\n" -#~ msgstr "le serveur est toujours en cours de démarrage\n" +#~ msgid "" +#~ "\n" +#~ "%s: -w option is not supported when starting a pre-9.1 server\n" +#~ msgstr "" +#~ "\n" +#~ "%s : l'option -w n'est pas supportée lors du démarrage d'un serveur pré-9.1\n" #~ msgid "" #~ "\n" @@ -945,11 +918,24 @@ msgstr "" #~ "\n" #~ "%s : ce répertoire des données semble être utilisé par un postmaster déjà existant\n" -#~ msgid "%s: could not start server: exit code was %d\n" -#~ msgstr "%s : n'a pas pu démarrer le serveur : le code de sortie est %d\n" +#~ msgid "" +#~ "\n" +#~ "Options for stop, restart, or promote:\n" +#~ msgstr "" +#~ "\n" +#~ "Options pour l'arrêt, le redémarrage ou la promotion :\n" -#~ msgid "%s: could not open process token: %lu\n" -#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : %lu\n" +#~ msgid "" +#~ "\n" +#~ "Report bugs to .\n" +#~ msgstr "" +#~ "\n" +#~ "Rapporter les bogues à .\n" + +#~ msgid " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n" +#~ msgstr "" +#~ " %s start [-w] [-t SECS] [-D RÉP_DONNÉES] [-s] [-l NOM_FICHIER]\n" +#~ " [-o \"OPTIONS\"]\n" #~ msgid " --help show this help, then exit\n" #~ msgstr " --help affiche cette aide et quitte\n" @@ -967,15 +953,17 @@ msgstr "" #~ "ou d'envoyer un signal à un processus PostgreSQL\n" #~ "\n" -#~ msgid "could not change directory to \"%s\"" -#~ msgstr "n'a pas pu accéder au répertoire « %s »" +#~ msgid "%s: could not create log file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu créer le fichier de traces « %s » : %s\n" -#~ msgid "" -#~ "\n" -#~ "Options for stop, restart, or promote:\n" -#~ msgstr "" -#~ "\n" -#~ "Options pour l'arrêt, le redémarrage ou la promotion :\n" +#~ msgid "%s: could not open process token: %lu\n" +#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : %lu\n" + +#~ msgid "%s: could not start server: exit code was %d\n" +#~ msgstr "%s : n'a pas pu démarrer le serveur : le code de sortie est %d\n" + +#~ msgid "%s: could not wait for server because of misconfiguration\n" +#~ msgstr "%s : n'a pas pu attendre le serveur à cause d'une mauvaise configuration\n" #~ msgid "" #~ "(The default is to wait for shutdown, but not for start or restart.)\n" @@ -985,28 +973,49 @@ msgstr "" #~ "redémarrage.)\n" #~ "\n" -#~ msgid " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n" +#, c-format +#~ msgid "" +#~ "The program \"%s\" is needed by %s but was not found in the\n" +#~ "same directory as \"%s\".\n" +#~ "Check your installation.\n" #~ msgstr "" -#~ " %s start [-w] [-t SECS] [-D RÉP_DONNÉES] [-s] [-l NOM_FICHIER]\n" -#~ " [-o \"OPTIONS\"]\n" - -#~ msgid "%s: could not wait for server because of misconfiguration\n" -#~ msgstr "%s : n'a pas pu attendre le serveur à cause d'une mauvaise configuration\n" +#~ "Le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé\n" +#~ "dans le même répertoire que « %s ».\n" +#~ "Vérifiez votre installation.\n" +#, c-format #~ msgid "" -#~ "\n" -#~ "%s: -w option cannot use a relative socket directory specification\n" +#~ "The program \"%s\" was found by \"%s\"\n" +#~ "but was not the same version as %s.\n" +#~ "Check your installation.\n" #~ msgstr "" -#~ "\n" -#~ "%s : l'option -w ne peut pas utiliser un chemin relatif vers le répertoire de\n" -#~ "la socket\n" +#~ "Le programme « %s » a été trouvé par « %s »\n" +#~ "mais n'est pas de la même version que %s.\n" +#~ "Vérifiez votre installation.\n" #~ msgid "" +#~ "WARNING: online backup mode is active\n" +#~ "Shutdown will not complete until pg_stop_backup() is called.\n" #~ "\n" -#~ "%s: -w option is not supported when starting a pre-9.1 server\n" #~ msgstr "" +#~ "ATTENTION : le mode de sauvegarde en ligne est activé.\n" +#~ "L'arrêt ne surviendra qu'au moment où pg_stop_backup() sera appelé.\n" #~ "\n" -#~ "%s : l'option -w n'est pas supportée lors du démarrage d'un serveur pré-9.1\n" + +#~ msgid "child process was terminated by signal %s" +#~ msgstr "le processus fils a été terminé par le signal %s" + +#~ msgid "could not change directory to \"%s\"" +#~ msgstr "n'a pas pu accéder au répertoire « %s »" + +#~ msgid "could not change directory to \"%s\": %s" +#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %s" + +#~ msgid "could not read symbolic link \"%s\"" +#~ msgstr "n'a pas pu lire le lien symbolique « %s »" #~ msgid "pclose failed: %m" #~ msgstr "échec de pclose : %m" + +#~ msgid "server is still starting up\n" +#~ msgstr "le serveur est toujours en cours de démarrage\n" diff --git a/src/bin/pg_ctl/po/ja.po b/src/bin/pg_ctl/po/ja.po index b16284c3e5..aa10993f97 100644 --- a/src/bin/pg_ctl/po/ja.po +++ b/src/bin/pg_ctl/po/ja.po @@ -1,14 +1,18 @@ -# Japanese message translation file for pg_ctl -# Copyright (C) 2019 PostgreSQL Global Development Group -# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. -# Shigehiro Honda , 2005 +# pg_ctl.po +# Japanese message translation file for pg_ctl +# +# Copyright (C) 2005-2022 PostgreSQL Global Development Group +# +# Shigehiro Honda , 2005. +# +# This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: pg_ctl (PostgreSQL 13)\n" +"Project-Id-Version: pg_ctl (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:54+0900\n" -"PO-Revision-Date: 2020-08-21 23:23+0900\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" +"PO-Revision-Date: 2022-05-10 13:49+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -18,48 +22,48 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "カレントディレクトリを識別できませんでした: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "バイナリ\"%s\"は無効です" -#: ../../common/exec.c:206 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "バイナリ\"%s\"を読み取れませんでした" -#: ../../common/exec.c:214 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "実行する\"%s\"がありませんでした" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:282 ../../common/exec.c:321 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "ディレクトリ\"%s\"に移動できませんでした: %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:299 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を読めませんでした: %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:422 #, c-format -msgid "pclose failed: %m" -msgstr "pcloseが失敗しました: %m" +msgid "%s() failed: %m" +msgstr "%s() が失敗しました: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 msgid "out of memory" msgstr "メモリ不足です" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 -#: ../../port/path.c:632 ../../port/path.c:670 ../../port/path.c:687 +#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 #, c-format msgid "out of memory\n" msgstr "メモリ不足です\n" @@ -99,135 +103,123 @@ msgstr "子プロセスはシグナル%dにより終了しました: %s" msgid "child process exited with unrecognized status %d" msgstr "子プロセスが未知のステータス%dで終了しました" -#: ../../port/path.c:654 +#: ../../port/path.c:775 #, c-format msgid "could not get current working directory: %s\n" msgstr "現在の作業ディレクトリを取得できませんでした: %s\n" -#: pg_ctl.c:258 +#: pg_ctl.c:260 #, c-format msgid "%s: directory \"%s\" does not exist\n" msgstr "%s: ディレクトリ \"%s\" は存在しません\n" -#: pg_ctl.c:261 +#: pg_ctl.c:263 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s: ディレクトリ\"%s\"にアクセスできませんでした: %s\n" -#: pg_ctl.c:274 +#: pg_ctl.c:276 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" msgstr "%s: ディレクトリ\"%s\"はデータベースクラスタディレクトリではありません\n" -#: pg_ctl.c:287 +#: pg_ctl.c:289 #, c-format msgid "%s: could not open PID file \"%s\": %s\n" msgstr "%s: PIDファイル\"%s\"をオープンできませんでした: %s\n" -#: pg_ctl.c:296 +#: pg_ctl.c:298 #, c-format msgid "%s: the PID file \"%s\" is empty\n" msgstr "%s: PIDファイル\"%s\"が空です\n" -#: pg_ctl.c:299 +#: pg_ctl.c:301 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" msgstr "%s: PIDファイル\"%s\"内に無効なデータがあります\n" -#: pg_ctl.c:458 pg_ctl.c:500 +#: pg_ctl.c:464 pg_ctl.c:506 #, c-format msgid "%s: could not start server: %s\n" msgstr "%s: サーバに接続できませんでした: %s\n" -#: pg_ctl.c:478 +#: pg_ctl.c:484 #, c-format msgid "%s: could not start server due to setsid() failure: %s\n" msgstr "%s: setsid()に失敗したためサーバに接続できませんでした: %s\n" -#: pg_ctl.c:548 +#: pg_ctl.c:554 #, c-format msgid "%s: could not open log file \"%s\": %s\n" msgstr "%s: ログファイル \"%s\" をオープンできませんでした: %s\n" -#: pg_ctl.c:565 +#: pg_ctl.c:571 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s: サーバの起動に失敗しました: エラーコード %lu\n" -#: pg_ctl.c:712 +#: pg_ctl.c:788 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" msgstr "%s: コアファイルのサイズ制限を設定できません:固定の制限により許されていません\n" -#: pg_ctl.c:738 +#: pg_ctl.c:814 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "%s: ファイル\"%s\"を読み取ることに失敗しました\n" -#: pg_ctl.c:743 +#: pg_ctl.c:819 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: オプションファイル\"%s\"は1行のみでなければなりません\n" -#: pg_ctl.c:785 pg_ctl.c:975 pg_ctl.c:1071 +#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112 #, c-format msgid "%s: could not send stop signal (PID: %ld): %s\n" msgstr "%s: 停止シグナルを送信できませんでした。(PID: %ld): %s\n" -#: pg_ctl.c:813 +#: pg_ctl.c:889 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation.\n" -msgstr "" -"%2$sには\"%1$s\"プログラムが必要ですが、\"%3$s\"と同じディレクトリ\n" -"にありませんでした。\n" -"インストール状況を確認してください。\n" +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" +msgstr "%2$sにはプログラム\"%1$s\"が必要ですが、\"%3$s\"と同じディレクトリにありませんでした\n" -#: pg_ctl.c:818 +#: pg_ctl.c:892 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation.\n" -msgstr "" -"\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じ\n" -"バージョンではありませんでした。\n" -"インストレーションを検査してください。\n" +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" +msgstr "\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じバージョンではありませんでした\n" -#: pg_ctl.c:851 +#: pg_ctl.c:923 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s: データベースシステムが初期化に失敗しました\n" -#: pg_ctl.c:866 +#: pg_ctl.c:938 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" msgstr "%s: 他のサーバが動作中の可能性がありますが、とにかくpostmasterの起動を試みます。\n" -#: pg_ctl.c:915 +#: pg_ctl.c:986 msgid "waiting for server to start..." msgstr "サーバの起動完了を待っています..." -#: pg_ctl.c:920 pg_ctl.c:1025 pg_ctl.c:1117 pg_ctl.c:1242 +#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243 msgid " done\n" msgstr "完了\n" -#: pg_ctl.c:921 +#: pg_ctl.c:992 msgid "server started\n" msgstr "サーバ起動完了\n" -#: pg_ctl.c:924 pg_ctl.c:930 pg_ctl.c:1247 +#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248 msgid " stopped waiting\n" msgstr " 待機処理が停止されました\n" -#: pg_ctl.c:925 +#: pg_ctl.c:996 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: サーバは時間内に停止しませんでした\n" -#: pg_ctl.c:931 +#: pg_ctl.c:1002 #, c-format msgid "" "%s: could not start server\n" @@ -236,52 +228,42 @@ msgstr "" "%s: サーバを起動できませんでした。\n" "ログ出力を確認してください。\n" -#: pg_ctl.c:939 +#: pg_ctl.c:1010 msgid "server starting\n" msgstr "サーバは起動中です。\n" -#: pg_ctl.c:960 pg_ctl.c:1047 pg_ctl.c:1138 pg_ctl.c:1177 pg_ctl.c:1271 +#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: PIDファイル\"%s\"がありません\n" -#: pg_ctl.c:961 pg_ctl.c:1049 pg_ctl.c:1139 pg_ctl.c:1178 pg_ctl.c:1272 +#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273 msgid "Is server running?\n" msgstr "サーバが動作していますか?\n" -#: pg_ctl.c:967 +#: pg_ctl.c:1036 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n" msgstr "%s: サーバを停止できません。シングルユーザサーバ(PID: %ld)が動作しています。\n" -#: pg_ctl.c:982 +#: pg_ctl.c:1051 msgid "server shutting down\n" msgstr "サーバの停止中です\n" -#: pg_ctl.c:997 pg_ctl.c:1086 -msgid "" -"WARNING: online backup mode is active\n" -"Shutdown will not complete until pg_stop_backup() is called.\n" -"\n" -msgstr "" -"警告: オンラインバックアップモードが実行中です。\n" -"pg_stop_backup()が呼び出されるまでシャットダウンは完了しません\n" -"\n" - -#: pg_ctl.c:1001 pg_ctl.c:1090 +#: pg_ctl.c:1056 pg_ctl.c:1117 msgid "waiting for server to shut down..." msgstr "サーバ停止処理の完了を待っています..." -#: pg_ctl.c:1017 pg_ctl.c:1108 +#: pg_ctl.c:1060 pg_ctl.c:1122 msgid " failed\n" msgstr "失敗しました\n" -#: pg_ctl.c:1019 pg_ctl.c:1110 +#: pg_ctl.c:1062 pg_ctl.c:1124 #, c-format msgid "%s: server does not shut down\n" msgstr "%s: サーバは停止していません\n" -#: pg_ctl.c:1021 pg_ctl.c:1112 +#: pg_ctl.c:1064 pg_ctl.c:1126 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -289,262 +271,262 @@ msgstr "" "ヒント: \"-m fast\"オプションは、セッション切断が始まるまで待機するのではなく\n" "即座にセッションを切断します。\n" -#: pg_ctl.c:1027 pg_ctl.c:1118 +#: pg_ctl.c:1070 pg_ctl.c:1132 msgid "server stopped\n" msgstr "サーバは停止しました\n" -#: pg_ctl.c:1050 +#: pg_ctl.c:1091 msgid "trying to start server anyway\n" msgstr "とにかくサーバの起動を試みます\n" -#: pg_ctl.c:1059 +#: pg_ctl.c:1100 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n" msgstr "%s: サーバを再起動できません。シングルユーザサーバ(PID: %ld)が動作中です。\n" -#: pg_ctl.c:1062 pg_ctl.c:1148 +#: pg_ctl.c:1103 pg_ctl.c:1162 msgid "Please terminate the single-user server and try again.\n" msgstr "シングルユーザサーバを終了させてから、再度実行してください\n" -#: pg_ctl.c:1122 +#: pg_ctl.c:1136 #, c-format msgid "%s: old server process (PID: %ld) seems to be gone\n" msgstr "%s: 古いサーバプロセス(PID: %ld)が動作していないようです\n" -#: pg_ctl.c:1124 +#: pg_ctl.c:1138 msgid "starting server anyway\n" msgstr "とにかくサーバを起動しています\n" -#: pg_ctl.c:1145 +#: pg_ctl.c:1159 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n" msgstr "%s: サーバをリロードできません。シングルユーザサーバ(PID: %ld)が動作中です\n" -#: pg_ctl.c:1154 +#: pg_ctl.c:1168 #, c-format msgid "%s: could not send reload signal (PID: %ld): %s\n" msgstr "%s: リロードシグナルを送信できませんでした。(PID: %ld): %s\n" -#: pg_ctl.c:1159 +#: pg_ctl.c:1173 msgid "server signaled\n" msgstr "サーバにシグナルを送信しました\n" -#: pg_ctl.c:1184 +#: pg_ctl.c:1198 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n" msgstr "%s: サーバを昇格できません; シングルユーザサーバ(PID: %ld)が動作中です\n" -#: pg_ctl.c:1192 +#: pg_ctl.c:1206 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s: サーバを昇格できません; サーバはスタンバイモードではありません\n" -#: pg_ctl.c:1202 +#: pg_ctl.c:1216 #, c-format msgid "%s: could not create promote signal file \"%s\": %s\n" msgstr "%s: 昇格指示ファイル\"%s\"を作成することができませんでした: %s\n" -#: pg_ctl.c:1208 +#: pg_ctl.c:1222 #, c-format msgid "%s: could not write promote signal file \"%s\": %s\n" msgstr "%s: 昇格指示ファイル\"%s\"に書き出すことができませんでした: %s\n" -#: pg_ctl.c:1216 +#: pg_ctl.c:1230 #, c-format msgid "%s: could not send promote signal (PID: %ld): %s\n" msgstr "%s: 昇格シグナルを送信できませんでした (PID: %ld): %s\n" -#: pg_ctl.c:1219 +#: pg_ctl.c:1233 #, c-format msgid "%s: could not remove promote signal file \"%s\": %s\n" msgstr "%s: 昇格指示ファイル\"%s\"の削除に失敗しました: %s\n" -#: pg_ctl.c:1229 +#: pg_ctl.c:1240 msgid "waiting for server to promote..." msgstr "サーバの昇格を待っています..." -#: pg_ctl.c:1243 +#: pg_ctl.c:1244 msgid "server promoted\n" msgstr "サーバは昇格しました\n" -#: pg_ctl.c:1248 +#: pg_ctl.c:1249 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s: サーバは時間内に昇格しませんでした\n" -#: pg_ctl.c:1254 +#: pg_ctl.c:1255 msgid "server promoting\n" msgstr "サーバを昇格中です\n" -#: pg_ctl.c:1278 +#: pg_ctl.c:1279 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n" msgstr "%s: ログをローテートできません; シングルユーザサーバが動作中です (PID: %ld)\n" -#: pg_ctl.c:1288 +#: pg_ctl.c:1289 #, c-format msgid "%s: could not create log rotation signal file \"%s\": %s\n" msgstr "%s: ログローテート指示ファイル\"%s\"を作成することができませんでした: %s\n" -#: pg_ctl.c:1294 +#: pg_ctl.c:1295 #, c-format msgid "%s: could not write log rotation signal file \"%s\": %s\n" msgstr "%s: ログローテート指示ファイル\"%s\"に書き出すことができませんでした: %s\n" -#: pg_ctl.c:1302 +#: pg_ctl.c:1303 #, c-format msgid "%s: could not send log rotation signal (PID: %ld): %s\n" msgstr "%s: ログローテートシグナルを送信できませんでした (PID: %ld): %s\n" -#: pg_ctl.c:1305 +#: pg_ctl.c:1306 #, c-format msgid "%s: could not remove log rotation signal file \"%s\": %s\n" msgstr "%s: ログローテーション指示ファイル\"%s\"の削除に失敗しました: %s\n" -#: pg_ctl.c:1310 +#: pg_ctl.c:1311 msgid "server signaled to rotate log file\n" msgstr "サーバがログローテートをシグナルされました\n" -#: pg_ctl.c:1357 +#: pg_ctl.c:1358 #, c-format msgid "%s: single-user server is running (PID: %ld)\n" msgstr "%s: シングルユーザサーバが動作中です(PID: %ld)\n" -#: pg_ctl.c:1371 +#: pg_ctl.c:1372 #, c-format msgid "%s: server is running (PID: %ld)\n" msgstr "%s: サーバが動作中です(PID: %ld)\n" -#: pg_ctl.c:1387 +#: pg_ctl.c:1388 #, c-format msgid "%s: no server running\n" msgstr "%s: サーバが動作していません\n" -#: pg_ctl.c:1404 +#: pg_ctl.c:1405 #, c-format msgid "%s: could not send signal %d (PID: %ld): %s\n" msgstr "%s: シグナル%dを送信できませんでした(PID: %ld): %s\n" -#: pg_ctl.c:1435 +#: pg_ctl.c:1436 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: 本プログラムの実行ファイルの検索に失敗しました\n" -#: pg_ctl.c:1445 +#: pg_ctl.c:1446 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: postgres の実行ファイルが見つかりません\n" -#: pg_ctl.c:1515 pg_ctl.c:1549 +#: pg_ctl.c:1516 pg_ctl.c:1550 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: サービスマネージャのオープンに失敗しました\n" -#: pg_ctl.c:1521 +#: pg_ctl.c:1522 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: サービス\\\"%s\\\"は登録済みです\n" -#: pg_ctl.c:1532 +#: pg_ctl.c:1533 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: サービス\"%s\"の登録に失敗しました: エラーコード %lu\n" -#: pg_ctl.c:1555 +#: pg_ctl.c:1556 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: サービス\"%s\"は登録されていません\n" -#: pg_ctl.c:1562 +#: pg_ctl.c:1563 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: サービス\"%s\"のオープンに失敗しました: エラーコード %lu\n" -#: pg_ctl.c:1571 +#: pg_ctl.c:1572 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: サービス\"%s\"の登録削除に失敗しました: エラーコード %lu\n" -#: pg_ctl.c:1658 +#: pg_ctl.c:1659 msgid "Waiting for server startup...\n" msgstr "サーバの起動完了を待っています...\n" -#: pg_ctl.c:1661 +#: pg_ctl.c:1662 msgid "Timed out waiting for server startup\n" msgstr "サーバの起動待機がタイムアウトしました\n" -#: pg_ctl.c:1665 +#: pg_ctl.c:1666 msgid "Server started and accepting connections\n" msgstr "サーバは起動し、接続を受け付けています\n" -#: pg_ctl.c:1720 +#: pg_ctl.c:1721 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: サービス\"%s\"の起動に失敗しました: エラーコード %lu\n" -#: pg_ctl.c:1790 +#: pg_ctl.c:1824 #, c-format msgid "%s: WARNING: cannot create restricted tokens on this platform\n" msgstr "%s: 警告: このプラットフォームでは制限付きトークンを作成できません\n" -#: pg_ctl.c:1803 +#: pg_ctl.c:1837 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: プロセストークンをオープンできませんでした: エラーコード %lu\n" -#: pg_ctl.c:1817 +#: pg_ctl.c:1851 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: SIDを割り当てられませんでした: エラーコード %lu\n" -#: pg_ctl.c:1844 +#: pg_ctl.c:1878 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: 制限付きトークンを作成できませんでした: エラーコード %lu\n" -#: pg_ctl.c:1875 +#: pg_ctl.c:1909 #, c-format msgid "%s: WARNING: could not locate all job object functions in system API\n" msgstr "%s: 警告: システムAPI内にすべてのジョブオブジェクト関数を格納できませんでした\n" -#: pg_ctl.c:1972 +#: pg_ctl.c:2006 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: 権限の LUID を取得できません: エラーコード %lu\n" -#: pg_ctl.c:1980 pg_ctl.c:1995 +#: pg_ctl.c:2014 pg_ctl.c:2029 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: トークン情報を取得できませんでした: エラーコード %lu\n" -#: pg_ctl.c:1989 +#: pg_ctl.c:2023 #, c-format msgid "%s: out of memory\n" msgstr "%s: メモリ不足です\n" -#: pg_ctl.c:2019 +#: pg_ctl.c:2053 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "詳細は\"%s --help\"を実行してください。\n" -#: pg_ctl.c:2027 +#: pg_ctl.c:2061 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" "\n" msgstr "%sはPostgreSQLサーバの初期化、起動、停止、制御を行うユーティリティです。\n" -#: pg_ctl.c:2028 +#: pg_ctl.c:2062 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_ctl.c:2029 +#: pg_ctl.c:2063 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" -#: pg_ctl.c:2030 +#: pg_ctl.c:2064 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" @@ -553,12 +535,12 @@ msgstr "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-p PATH] [-c]\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2066 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" -#: pg_ctl.c:2033 +#: pg_ctl.c:2067 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" @@ -567,32 +549,32 @@ msgstr "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-c]\n" -#: pg_ctl.c:2035 +#: pg_ctl.c:2069 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D DATADIR] [-s]\n" -#: pg_ctl.c:2036 +#: pg_ctl.c:2070 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D DATADIR]\n" -#: pg_ctl.c:2037 +#: pg_ctl.c:2071 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" -#: pg_ctl.c:2038 +#: pg_ctl.c:2072 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D DATADIR] [-s]\n" -#: pg_ctl.c:2039 +#: pg_ctl.c:2073 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill SIGNALNAME PID\n" -#: pg_ctl.c:2041 +#: pg_ctl.c:2075 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" @@ -601,12 +583,12 @@ msgstr "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" " [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" -#: pg_ctl.c:2043 +#: pg_ctl.c:2077 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N SERVICENAME]\n" -#: pg_ctl.c:2046 +#: pg_ctl.c:2080 #, c-format msgid "" "\n" @@ -615,52 +597,52 @@ msgstr "" "\n" "共通のオプション:\n" -#: pg_ctl.c:2047 +#: pg_ctl.c:2081 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " -D, --pgdata=DATADIR データベース格納領域の場所\n" -#: pg_ctl.c:2049 +#: pg_ctl.c:2083 #, c-format msgid " -e SOURCE event source for logging when running as a service\n" msgstr " -e SOURCE サービスとして起動させたときのログのイベントソース\n" -#: pg_ctl.c:2051 +#: pg_ctl.c:2085 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr " -s, --silent エラーメッセージのみを表示、情報メッセージは表示しない\n" -#: pg_ctl.c:2052 +#: pg_ctl.c:2086 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr " -t, --timeout=SECS -wオプションを使用する時に待機する秒数\n" -#: pg_ctl.c:2053 +#: pg_ctl.c:2087 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: pg_ctl.c:2054 +#: pg_ctl.c:2088 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait 操作が完了するまで待機 (デフォルト)\n" -#: pg_ctl.c:2055 +#: pg_ctl.c:2089 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait 作業の完了を待たない\n" -#: pg_ctl.c:2056 +#: pg_ctl.c:2090 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: pg_ctl.c:2057 +#: pg_ctl.c:2091 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "-Dオプションの省略時はPGDATA環境変数が使用されます。\n" -#: pg_ctl.c:2059 +#: pg_ctl.c:2093 #, c-format msgid "" "\n" @@ -669,22 +651,22 @@ msgstr "" "\n" "起動、再起動のオプション\n" -#: pg_ctl.c:2061 +#: pg_ctl.c:2095 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files postgresのコアファイル生成を許可\n" -#: pg_ctl.c:2063 +#: pg_ctl.c:2097 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files このプラットフォームでは適用されない\n" -#: pg_ctl.c:2065 +#: pg_ctl.c:2099 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr " -l, --log FILENAME サーバログをFILENAMEへ書き込む(または追加する)\n" -#: pg_ctl.c:2066 +#: pg_ctl.c:2100 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" @@ -693,12 +675,12 @@ msgstr "" " -o, --options=OPTIONS postgres(PostgreSQLサーバ実行ファイル)または\n" " initdb に渡すコマンドラインオプション\n" -#: pg_ctl.c:2068 +#: pg_ctl.c:2102 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p PATH-TO-POSTGRES 通常は不要\n" -#: pg_ctl.c:2069 +#: pg_ctl.c:2103 #, c-format msgid "" "\n" @@ -707,12 +689,12 @@ msgstr "" "\n" "停止、再起動のオプション\n" -#: pg_ctl.c:2070 +#: pg_ctl.c:2104 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr " -m, --mode=MODE MODEは\"smart\"、\"fast\"、\"immediate\"のいずれか\n" -#: pg_ctl.c:2072 +#: pg_ctl.c:2106 #, c-format msgid "" "\n" @@ -721,22 +703,22 @@ msgstr "" "\n" "シャットダウンモードは以下の通り:\n" -#: pg_ctl.c:2073 +#: pg_ctl.c:2107 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart 全クライアントの接続切断後に停止\n" -#: pg_ctl.c:2074 +#: pg_ctl.c:2108 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast 適切な手続きで直ちに停止(デフォルト)\n" -#: pg_ctl.c:2075 +#: pg_ctl.c:2109 #, c-format msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" msgstr " immediate 適切な手続き抜きで停止; 再起動時にはリカバリが実行される\n" -#: pg_ctl.c:2077 +#: pg_ctl.c:2111 #, c-format msgid "" "\n" @@ -745,7 +727,7 @@ msgstr "" "\n" "killモードで利用できるシグナル名:\n" -#: pg_ctl.c:2081 +#: pg_ctl.c:2115 #, c-format msgid "" "\n" @@ -754,27 +736,27 @@ msgstr "" "\n" "登録、登録解除のオプション:\n" -#: pg_ctl.c:2082 +#: pg_ctl.c:2116 #, c-format msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr " -N SERVICENAME PostgreSQLサーバを登録する際のサービス名\n" -#: pg_ctl.c:2083 +#: pg_ctl.c:2117 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr " -P PASSWORD PostgreSQLサーバを登録するためのアカウントのパスワード\n" -#: pg_ctl.c:2084 +#: pg_ctl.c:2118 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr " -U USERNAME PostgreSQLサーバを登録するためのアカウント名\n" -#: pg_ctl.c:2085 +#: pg_ctl.c:2119 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr " -S START-TYPE PostgreSQLサーバを登録する際のサービス起動タイプ\n" -#: pg_ctl.c:2087 +#: pg_ctl.c:2121 #, c-format msgid "" "\n" @@ -783,17 +765,17 @@ msgstr "" "\n" "起動タイプは以下の通り:\n" -#: pg_ctl.c:2088 +#: pg_ctl.c:2122 #, c-format msgid " auto start service automatically during system startup (default)\n" msgstr " auto システムの起動時にサービスを自動的に開始(デフォルト)\n" -#: pg_ctl.c:2089 +#: pg_ctl.c:2123 #, c-format msgid " demand start service on demand\n" msgstr " demand 要求に応じてサービスを開始\n" -#: pg_ctl.c:2092 +#: pg_ctl.c:2126 #, c-format msgid "" "\n" @@ -802,37 +784,37 @@ msgstr "" "\n" "バグは<%s>に報告してください。\n" -#: pg_ctl.c:2093 +#: pg_ctl.c:2127 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_ctl.c:2118 +#: pg_ctl.c:2152 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: 不正なシャットダウンモード\"%s\"\n" -#: pg_ctl.c:2147 +#: pg_ctl.c:2181 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: 不正なシグナル名\"%s\"\n" -#: pg_ctl.c:2164 +#: pg_ctl.c:2198 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: 不正な起動タイプ\"%s\"\n" -#: pg_ctl.c:2219 +#: pg_ctl.c:2253 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: コマンド\"%s\"を使用するデータディレクトリを決定できませんでした\n" -#: pg_ctl.c:2243 +#: pg_ctl.c:2277 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: 制御ファイルが壊れているようです\n" -#: pg_ctl.c:2311 +#: pg_ctl.c:2345 #, c-format msgid "" "%s: cannot be run as root\n" @@ -843,36 +825,66 @@ msgstr "" "サーバプロセスの所有者となる(非特権)ユーザとして(\"su\"などを使用して)\n" "ログインしてください。\n" -#: pg_ctl.c:2395 +#: pg_ctl.c:2428 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: -Sオプションはこのプラットフォームでサポートされていません\n" -#: pg_ctl.c:2432 +#: pg_ctl.c:2465 #, c-format msgid "%s: too many command-line arguments (first is \"%s\")\n" msgstr "%s: コマンドライン引数が多すぎます(先頭は\"%s\")\n" -#: pg_ctl.c:2458 +#: pg_ctl.c:2491 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: killモード用の引数がありません\n" -#: pg_ctl.c:2476 +#: pg_ctl.c:2509 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: 操作モード\"%s\"は不明です\n" -#: pg_ctl.c:2486 +#: pg_ctl.c:2519 #, c-format msgid "%s: no operation specified\n" msgstr "%s: 操作モードが指定されていません\n" -#: pg_ctl.c:2507 +#: pg_ctl.c:2540 #, c-format msgid "%s: no database directory specified and environment variable PGDATA unset\n" msgstr "%s: データベースの指定も、PGDATA環境変数の設定もありません\n" +#~ msgid "pclose failed: %m" +#~ msgstr "pcloseが失敗しました: %m" + +#~ msgid "" +#~ "The program \"%s\" is needed by %s but was not found in the\n" +#~ "same directory as \"%s\".\n" +#~ "Check your installation.\n" +#~ msgstr "" +#~ "%2$sには\"%1$s\"プログラムが必要ですが、\"%3$s\"と同じディレクトリ\n" +#~ "にありませんでした。\n" +#~ "インストール状況を確認してください。\n" + +#~ msgid "" +#~ "The program \"%s\" was found by \"%s\"\n" +#~ "but was not the same version as %s.\n" +#~ "Check your installation.\n" +#~ msgstr "" +#~ "\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じ\n" +#~ "バージョンではありませんでした。\n" +#~ "インストレーションを検査してください。\n" + +#~ msgid "" +#~ "WARNING: online backup mode is active\n" +#~ "Shutdown will not complete until pg_stop_backup() is called.\n" +#~ "\n" +#~ msgstr "" +#~ "警告: オンラインバックアップモードが実行中です。\n" +#~ "pg_stop_backup()が呼び出されるまでシャットダウンは完了しません\n" +#~ "\n" + #~ msgid "child process was terminated by signal %d" #~ msgstr "子プロセスがシグナル%dで終了しました" diff --git a/src/bin/pg_ctl/po/ru.po b/src/bin/pg_ctl/po/ru.po index 86fa24b9e0..9a941fd409 100644 --- a/src/bin/pg_ctl/po/ru.po +++ b/src/bin/pg_ctl/po/ru.po @@ -6,13 +6,13 @@ # Sergey Burladyan , 2009, 2012. # Andrey Sudnik , 2010. # Dmitriy Olshevskiy , 2014. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021. msgid "" msgstr "" "Project-Id-Version: pg_ctl (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-03 11:22+0300\n" -"PO-Revision-Date: 2020-10-29 15:01+0300\n" +"POT-Creation-Date: 2021-08-14 06:29+0300\n" +"PO-Revision-Date: 2021-09-04 12:15+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -22,42 +22,42 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "не удалось определить текущий каталог: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "неверный исполняемый файл \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "не удалось прочитать исполняемый файл \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "не удалось найти запускаемый файл \"%s\"" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не удалось перейти в каталог \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не удалось прочитать символическую ссылку \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:409 #, c-format -msgid "pclose failed: %m" -msgstr "ошибка pclose: %m" +msgid "%s() failed: %m" +msgstr "ошибка в %s(): %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 msgid "out of memory" msgstr "нехватка памяти" @@ -116,7 +116,7 @@ msgstr "%s: каталог \"%s\" не существует\n" #: pg_ctl.c:261 #, c-format msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: нет доступа к каталогу \"%s\": %s\n" +msgstr "%s: ошибка доступа к каталогу \"%s\": %s\n" #: pg_ctl.c:274 #, c-format @@ -151,7 +151,7 @@ msgstr "%s: не удалось запустить сервер из-за оши #: pg_ctl.c:548 #, c-format msgid "%s: could not open log file \"%s\": %s\n" -msgstr "%s: не удалось открыть файл журнала \"%s\": %s\n" +msgstr "%s: не удалось открыть файл протокола \"%s\": %s\n" #: pg_ctl.c:565 #, c-format @@ -175,7 +175,7 @@ msgstr "%s: не удалось прочитать файл \"%s\"\n" msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: в файле параметров \"%s\" должна быть ровно одна строка\n" -#: pg_ctl.c:785 pg_ctl.c:975 pg_ctl.c:1071 +#: pg_ctl.c:785 pg_ctl.c:974 pg_ctl.c:1070 #, c-format msgid "%s: could not send stop signal (PID: %ld): %s\n" msgstr "%s: не удалось отправить сигнал остановки (PID: %ld): %s\n" @@ -187,7 +187,7 @@ msgid "" "same directory as \"%s\".\n" "Check your installation.\n" msgstr "" -"Программа \"%s\" необходима для %s, но не найдена\n" +"Программа \"%s\" нужна для %s, но она не найдена\n" "в каталоге \"%s\".\n" "Проверьте правильность установки СУБД.\n" @@ -214,28 +214,28 @@ msgstr "" "%s: возможно, уже работает другой сервер; всё же пробуем запустить этот " "сервер\n" -#: pg_ctl.c:915 +#: pg_ctl.c:914 msgid "waiting for server to start..." msgstr "ожидание запуска сервера..." -#: pg_ctl.c:920 pg_ctl.c:1025 pg_ctl.c:1117 pg_ctl.c:1247 +#: pg_ctl.c:919 pg_ctl.c:1024 pg_ctl.c:1116 pg_ctl.c:1241 msgid " done\n" msgstr " готово\n" -#: pg_ctl.c:921 +#: pg_ctl.c:920 msgid "server started\n" msgstr "сервер запущен\n" -#: pg_ctl.c:924 pg_ctl.c:930 pg_ctl.c:1252 +#: pg_ctl.c:923 pg_ctl.c:929 pg_ctl.c:1246 msgid " stopped waiting\n" msgstr " прекращение ожидания\n" -#: pg_ctl.c:925 +#: pg_ctl.c:924 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: сервер не запустился за отведённое время\n" -#: pg_ctl.c:931 +#: pg_ctl.c:930 #, c-format msgid "" "%s: could not start server\n" @@ -244,30 +244,30 @@ msgstr "" "%s: не удалось запустить сервер\n" "Изучите протокол выполнения.\n" -#: pg_ctl.c:939 +#: pg_ctl.c:938 msgid "server starting\n" msgstr "сервер запускается\n" -#: pg_ctl.c:960 pg_ctl.c:1047 pg_ctl.c:1138 pg_ctl.c:1177 pg_ctl.c:1276 +#: pg_ctl.c:959 pg_ctl.c:1046 pg_ctl.c:1137 pg_ctl.c:1176 pg_ctl.c:1270 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: файл PID \"%s\" не существует\n" -#: pg_ctl.c:961 pg_ctl.c:1049 pg_ctl.c:1139 pg_ctl.c:1178 pg_ctl.c:1277 +#: pg_ctl.c:960 pg_ctl.c:1048 pg_ctl.c:1138 pg_ctl.c:1177 pg_ctl.c:1271 msgid "Is server running?\n" msgstr "Запущен ли сервер?\n" -#: pg_ctl.c:967 +#: pg_ctl.c:966 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n" msgstr "" "%s: остановить сервер с PID %ld нельзя - он запущен в монопольном режиме\n" -#: pg_ctl.c:982 +#: pg_ctl.c:981 msgid "server shutting down\n" msgstr "сервер останавливается\n" -#: pg_ctl.c:997 pg_ctl.c:1086 +#: pg_ctl.c:996 pg_ctl.c:1085 msgid "" "WARNING: online backup mode is active\n" "Shutdown will not complete until pg_stop_backup() is called.\n" @@ -277,20 +277,20 @@ msgstr "" "Выключение произойдёт только при вызове pg_stop_backup().\n" "\n" -#: pg_ctl.c:1001 pg_ctl.c:1090 +#: pg_ctl.c:1000 pg_ctl.c:1089 msgid "waiting for server to shut down..." msgstr "ожидание завершения работы сервера..." -#: pg_ctl.c:1017 pg_ctl.c:1108 +#: pg_ctl.c:1016 pg_ctl.c:1107 msgid " failed\n" msgstr " ошибка\n" -#: pg_ctl.c:1019 pg_ctl.c:1110 +#: pg_ctl.c:1018 pg_ctl.c:1109 #, c-format msgid "%s: server does not shut down\n" msgstr "%s: сервер не останавливается\n" -#: pg_ctl.c:1021 pg_ctl.c:1112 +#: pg_ctl.c:1020 pg_ctl.c:1111 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -298,255 +298,255 @@ msgstr "" "ПОДСКАЗКА: Параметр \"-m fast\" может сбросить сеансы принудительно,\n" "не дожидаясь, пока они завершатся сами.\n" -#: pg_ctl.c:1027 pg_ctl.c:1118 +#: pg_ctl.c:1026 pg_ctl.c:1117 msgid "server stopped\n" msgstr "сервер остановлен\n" -#: pg_ctl.c:1050 +#: pg_ctl.c:1049 msgid "trying to start server anyway\n" msgstr "производится попытка запуска сервера в любом случае\n" -#: pg_ctl.c:1059 +#: pg_ctl.c:1058 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n" msgstr "" "%s: перезапустить сервер с PID %ld нельзя - он запущен в монопольном режиме\n" -#: pg_ctl.c:1062 pg_ctl.c:1148 +#: pg_ctl.c:1061 pg_ctl.c:1147 msgid "Please terminate the single-user server and try again.\n" msgstr "Пожалуйста, остановите его и повторите попытку.\n" -#: pg_ctl.c:1122 +#: pg_ctl.c:1121 #, c-format msgid "%s: old server process (PID: %ld) seems to be gone\n" msgstr "%s: похоже, что старый серверный процесс (PID: %ld) исчез\n" -#: pg_ctl.c:1124 +#: pg_ctl.c:1123 msgid "starting server anyway\n" msgstr "сервер запускается, несмотря на это\n" -#: pg_ctl.c:1145 +#: pg_ctl.c:1144 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n" msgstr "" "%s: перезагрузить сервер с PID %ld нельзя - он запущен в монопольном режиме\n" -#: pg_ctl.c:1154 +#: pg_ctl.c:1153 #, c-format msgid "%s: could not send reload signal (PID: %ld): %s\n" msgstr "%s: не удалось отправить сигнал перезагрузки (PID: %ld): %s\n" -#: pg_ctl.c:1159 +#: pg_ctl.c:1158 msgid "server signaled\n" msgstr "сигнал отправлен серверу\n" -#: pg_ctl.c:1184 +#: pg_ctl.c:1183 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n" msgstr "" "%s: повысить сервер с PID %ld нельзя - он выполняется в монопольном режиме\n" -#: pg_ctl.c:1192 +#: pg_ctl.c:1191 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s: повысить сервер нельзя - он работает не в режиме резерва\n" -#: pg_ctl.c:1207 +#: pg_ctl.c:1201 #, c-format msgid "%s: could not create promote signal file \"%s\": %s\n" msgstr "%s: не удалось создать файл \"%s\" с сигналом к повышению: %s\n" -#: pg_ctl.c:1213 +#: pg_ctl.c:1207 #, c-format msgid "%s: could not write promote signal file \"%s\": %s\n" msgstr "%s: не удалось записать файл \"%s\" с сигналом к повышению: %s\n" -#: pg_ctl.c:1221 +#: pg_ctl.c:1215 #, c-format msgid "%s: could not send promote signal (PID: %ld): %s\n" msgstr "%s: не удалось отправить сигнал к повышению (PID: %ld): %s\n" -#: pg_ctl.c:1224 +#: pg_ctl.c:1218 #, c-format msgid "%s: could not remove promote signal file \"%s\": %s\n" msgstr "%s: ошибка при удалении файла \"%s\" с сигналом к повышению: %s\n" -#: pg_ctl.c:1234 +#: pg_ctl.c:1228 msgid "waiting for server to promote..." msgstr "ожидание повышения сервера..." -#: pg_ctl.c:1248 +#: pg_ctl.c:1242 msgid "server promoted\n" msgstr "сервер повышен\n" -#: pg_ctl.c:1253 +#: pg_ctl.c:1247 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s: повышение сервера не завершилось за отведённое время\n" -#: pg_ctl.c:1259 +#: pg_ctl.c:1253 msgid "server promoting\n" msgstr "сервер повышается\n" -#: pg_ctl.c:1283 +#: pg_ctl.c:1277 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n" msgstr "" "%s: не удалось прокрутить файл журнала; сервер работает в монопольном режиме " "(PID: %ld)\n" -#: pg_ctl.c:1293 +#: pg_ctl.c:1287 #, c-format msgid "%s: could not create log rotation signal file \"%s\": %s\n" msgstr "" "%s: не удалось создать файл \"%s\" с сигналом к прокрутке журнала: %s\n" -#: pg_ctl.c:1299 +#: pg_ctl.c:1293 #, c-format msgid "%s: could not write log rotation signal file \"%s\": %s\n" msgstr "" "%s: не удалось записать файл \"%s\" с сигналом к прокрутке журнала: %s\n" -#: pg_ctl.c:1307 +#: pg_ctl.c:1301 #, c-format msgid "%s: could not send log rotation signal (PID: %ld): %s\n" msgstr "%s: не удалось отправить сигнал к прокрутке журнала (PID: %ld): %s\n" -#: pg_ctl.c:1310 +#: pg_ctl.c:1304 #, c-format msgid "%s: could not remove log rotation signal file \"%s\": %s\n" msgstr "" "%s: ошибка при удалении файла \"%s\" с сигналом к прокрутке журнала: %s\n" -#: pg_ctl.c:1315 +#: pg_ctl.c:1309 msgid "server signaled to rotate log file\n" msgstr "сигнал для прокрутки файла журнала отправлен серверу\n" -#: pg_ctl.c:1362 +#: pg_ctl.c:1356 #, c-format msgid "%s: single-user server is running (PID: %ld)\n" msgstr "%s: сервер работает в монопольном режиме (PID: %ld)\n" -#: pg_ctl.c:1376 +#: pg_ctl.c:1370 #, c-format msgid "%s: server is running (PID: %ld)\n" msgstr "%s: сервер работает (PID: %ld)\n" -#: pg_ctl.c:1392 +#: pg_ctl.c:1386 #, c-format msgid "%s: no server running\n" msgstr "%s: сервер не работает\n" -#: pg_ctl.c:1409 +#: pg_ctl.c:1403 #, c-format msgid "%s: could not send signal %d (PID: %ld): %s\n" msgstr "%s: не удалось отправить сигнал %d (PID: %ld): %s\n" -#: pg_ctl.c:1440 +#: pg_ctl.c:1434 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: не удалось найти свой исполняемый файл\n" -#: pg_ctl.c:1450 +#: pg_ctl.c:1444 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: не удалось найти исполняемый файл postgres\n" -#: pg_ctl.c:1520 pg_ctl.c:1554 +#: pg_ctl.c:1514 pg_ctl.c:1548 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: не удалось открыть менеджер служб\n" -#: pg_ctl.c:1526 +#: pg_ctl.c:1520 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: служба \"%s\" уже зарегистрирована\n" -#: pg_ctl.c:1537 +#: pg_ctl.c:1531 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: не удалось зарегистрировать службу \"%s\" (код ошибки: %lu)\n" -#: pg_ctl.c:1560 +#: pg_ctl.c:1554 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: служба \"%s\" не зарегистрирована\n" -#: pg_ctl.c:1567 +#: pg_ctl.c:1561 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: не удалось открыть службу \"%s\" (код ошибки: %lu)\n" -#: pg_ctl.c:1576 +#: pg_ctl.c:1570 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: ошибка при удалении службы \"%s\" (код ошибки: %lu)\n" -#: pg_ctl.c:1663 +#: pg_ctl.c:1657 msgid "Waiting for server startup...\n" msgstr "Ожидание запуска сервера...\n" -#: pg_ctl.c:1666 +#: pg_ctl.c:1660 msgid "Timed out waiting for server startup\n" msgstr "Превышено время ожидания запуска сервера\n" -#: pg_ctl.c:1670 +#: pg_ctl.c:1664 msgid "Server started and accepting connections\n" msgstr "Сервер запущен и принимает подключения\n" -#: pg_ctl.c:1725 +#: pg_ctl.c:1719 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: не удалось запустить службу \"%s\" (код ошибки: %lu)\n" -#: pg_ctl.c:1795 +#: pg_ctl.c:1789 #, c-format msgid "%s: WARNING: cannot create restricted tokens on this platform\n" msgstr "%s: ПРЕДУПРЕЖДЕНИЕ: в этой ОС нельзя создавать ограниченные маркеры\n" -#: pg_ctl.c:1808 +#: pg_ctl.c:1802 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: не удалось открыть маркер процесса (код ошибки: %lu)\n" -#: pg_ctl.c:1822 +#: pg_ctl.c:1816 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: не удалось подготовить структуры SID (код ошибки: %lu)\n" -#: pg_ctl.c:1849 +#: pg_ctl.c:1843 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: не удалось создать ограниченный маркер (код ошибки: %lu)\n" -#: pg_ctl.c:1880 +#: pg_ctl.c:1874 #, c-format msgid "%s: WARNING: could not locate all job object functions in system API\n" msgstr "" "%s: ПРЕДУПРЕЖДЕНИЕ: не удалось найти все функции для работы с задачами в " "системном API\n" -#: pg_ctl.c:1977 +#: pg_ctl.c:1971 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: не удалось получить LUID для привилегий (код ошибки: %lu)\n" -#: pg_ctl.c:1985 pg_ctl.c:2000 +#: pg_ctl.c:1979 pg_ctl.c:1994 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: не удалось получить информацию о маркере (код ошибки: %lu)\n" -#: pg_ctl.c:1994 +#: pg_ctl.c:1988 #, c-format msgid "%s: out of memory\n" msgstr "%s: нехватка памяти\n" -#: pg_ctl.c:2024 +#: pg_ctl.c:2018 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Для дополнительной информации попробуйте \"%s --help\".\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2026 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" @@ -556,17 +556,17 @@ msgstr "" "PostgreSQL.\n" "\n" -#: pg_ctl.c:2033 +#: pg_ctl.c:2027 #, c-format msgid "Usage:\n" msgstr "Использование:\n" -#: pg_ctl.c:2034 +#: pg_ctl.c:2028 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D КАТАЛОГ-ДАННЫХ] [-s] [-o ПАРАМЕТРЫ]\n" -#: pg_ctl.c:2035 +#: pg_ctl.c:2029 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" @@ -575,13 +575,13 @@ msgstr "" " %s start [-D КАТАЛОГ-ДАННЫХ] [-l ИМЯ-ФАЙЛА] [-W] [-t СЕК] [-s]\n" " [-o ПАРАМЕТРЫ] [-p ПУТЬ] [-c]\n" -#: pg_ctl.c:2037 +#: pg_ctl.c:2031 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr "" " %s stop [-D КАТАЛОГ-ДАННЫХ] [-m РЕЖИМ-ОСТАНОВКИ] [-W] [-t СЕК] [-s]\n" -#: pg_ctl.c:2038 +#: pg_ctl.c:2032 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" @@ -590,32 +590,32 @@ msgstr "" " %s restart [-D КАТАЛОГ-ДАННЫХ] [-m РЕЖИМ-ОСТАНОВКИ] [-W] [-t СЕК] [-s]\n" " [-o ПАРАМЕТРЫ] [-c]\n" -#: pg_ctl.c:2040 +#: pg_ctl.c:2034 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D КАТАЛОГ-ДАННЫХ] [-s]\n" -#: pg_ctl.c:2041 +#: pg_ctl.c:2035 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D КАТАЛОГ-ДАННЫХ]\n" -#: pg_ctl.c:2042 +#: pg_ctl.c:2036 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D КАТАЛОГ-ДАННЫХ] [-W] [-t СЕК] [-s]\n" -#: pg_ctl.c:2043 +#: pg_ctl.c:2037 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D КАТАЛОГ-ДАННЫХ] [-s]\n" -#: pg_ctl.c:2044 +#: pg_ctl.c:2038 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill СИГНАЛ PID\n" -#: pg_ctl.c:2046 +#: pg_ctl.c:2040 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" @@ -627,12 +627,12 @@ msgstr "" " [-S ТИП-ЗАПУСКА] [-e ИСТОЧНИК] [-W] [-t СЕК] [-s] [-o " "ПАРАМЕТРЫ]\n" -#: pg_ctl.c:2048 +#: pg_ctl.c:2042 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N ИМЯ-СЛУЖБЫ]\n" -#: pg_ctl.c:2051 +#: pg_ctl.c:2045 #, c-format msgid "" "\n" @@ -641,12 +641,12 @@ msgstr "" "\n" "Общие параметры:\n" -#: pg_ctl.c:2052 +#: pg_ctl.c:2046 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " -D, --pgdata=КАТАЛОГ расположение хранилища баз данных\n" -#: pg_ctl.c:2054 +#: pg_ctl.c:2048 #, c-format msgid "" " -e SOURCE event source for logging when running as a service\n" @@ -655,45 +655,45 @@ msgstr "" "журнал,\n" " когда сервер работает в виде службы\n" -#: pg_ctl.c:2056 +#: pg_ctl.c:2050 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr "" " -s, --silent выводить только ошибки, без информационных " "сообщений\n" -#: pg_ctl.c:2057 +#: pg_ctl.c:2051 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr "" " -t, --timeout=СЕК время ожидания при использовании параметра -w\n" -#: pg_ctl.c:2058 +#: pg_ctl.c:2052 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: pg_ctl.c:2059 +#: pg_ctl.c:2053 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait ждать завершения операции (по умолчанию)\n" -#: pg_ctl.c:2060 +#: pg_ctl.c:2054 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait не ждать завершения операции\n" -#: pg_ctl.c:2061 +#: pg_ctl.c:2055 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: pg_ctl.c:2062 +#: pg_ctl.c:2056 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "Если параметр -D опущен, используется переменная окружения PGDATA.\n" -#: pg_ctl.c:2064 +#: pg_ctl.c:2058 #, c-format msgid "" "\n" @@ -702,24 +702,24 @@ msgstr "" "\n" "Параметры запуска и перезапуска:\n" -#: pg_ctl.c:2066 +#: pg_ctl.c:2060 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files указать postgres создавать дампы памяти\n" -#: pg_ctl.c:2068 +#: pg_ctl.c:2062 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files неприменимо на этой платформе\n" -#: pg_ctl.c:2070 +#: pg_ctl.c:2064 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr "" " -l, --log=ФАЙЛ записывать (или добавлять) протокол сервера в " "ФАЙЛ.\n" -#: pg_ctl.c:2071 +#: pg_ctl.c:2065 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" @@ -729,12 +729,12 @@ msgstr "" "PostgreSQL)\n" " или initdb параметры командной строки\n" -#: pg_ctl.c:2073 +#: pg_ctl.c:2067 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p ПУТЬ-К-POSTGRES обычно не требуется\n" -#: pg_ctl.c:2074 +#: pg_ctl.c:2068 #, c-format msgid "" "\n" @@ -743,14 +743,14 @@ msgstr "" "\n" "Параметры остановки и перезапуска:\n" -#: pg_ctl.c:2075 +#: pg_ctl.c:2069 #, c-format msgid "" " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr "" " -m, --mode=РЕЖИМ может быть \"smart\", \"fast\" или \"immediate\"\n" -#: pg_ctl.c:2077 +#: pg_ctl.c:2071 #, c-format msgid "" "\n" @@ -759,17 +759,17 @@ msgstr "" "\n" "Режимы остановки:\n" -#: pg_ctl.c:2078 +#: pg_ctl.c:2072 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart закончить работу после отключения всех клиентов\n" -#: pg_ctl.c:2079 +#: pg_ctl.c:2073 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast закончить сразу, в штатном режиме (по умолчанию)\n" -#: pg_ctl.c:2080 +#: pg_ctl.c:2074 #, c-format msgid "" " immediate quit without complete shutdown; will lead to recovery on " @@ -778,7 +778,7 @@ msgstr "" " immediate закончить немедленно, в экстренном режиме; влечёт за собой\n" " восстановление при перезапуске\n" -#: pg_ctl.c:2082 +#: pg_ctl.c:2076 #, c-format msgid "" "\n" @@ -787,7 +787,7 @@ msgstr "" "\n" "Разрешённые сигналы для команды kill:\n" -#: pg_ctl.c:2086 +#: pg_ctl.c:2080 #, c-format msgid "" "\n" @@ -796,30 +796,30 @@ msgstr "" "\n" "Параметры для регистрации и удаления:\n" -#: pg_ctl.c:2087 +#: pg_ctl.c:2081 #, c-format msgid "" " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr " -N ИМЯ-СЛУЖБЫ имя службы для регистрации сервера PostgreSQL\n" -#: pg_ctl.c:2088 +#: pg_ctl.c:2082 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr "" " -P ПАРОЛЬ пароль учётной записи для регистрации сервера PostgreSQL\n" -#: pg_ctl.c:2089 +#: pg_ctl.c:2083 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr "" " -U ПОЛЬЗОВАТЕЛЬ имя пользователя для регистрации сервера PostgreSQL\n" -#: pg_ctl.c:2090 +#: pg_ctl.c:2084 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr " -S ТИП-ЗАПУСКА тип запуска службы сервера PostgreSQL\n" -#: pg_ctl.c:2092 +#: pg_ctl.c:2086 #, c-format msgid "" "\n" @@ -828,7 +828,7 @@ msgstr "" "\n" "Типы запуска:\n" -#: pg_ctl.c:2093 +#: pg_ctl.c:2087 #, c-format msgid "" " auto start service automatically during system startup (default)\n" @@ -836,12 +836,12 @@ msgstr "" " auto запускать службу автоматически при старте системы (по " "умолчанию)\n" -#: pg_ctl.c:2094 +#: pg_ctl.c:2088 #, c-format msgid " demand start service on demand\n" msgstr " demand запускать службу по требованию\n" -#: pg_ctl.c:2097 +#: pg_ctl.c:2091 #, c-format msgid "" "\n" @@ -850,37 +850,37 @@ msgstr "" "\n" "Об ошибках сообщайте по адресу <%s>.\n" -#: pg_ctl.c:2098 +#: pg_ctl.c:2092 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" -#: pg_ctl.c:2123 +#: pg_ctl.c:2117 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: неизвестный режим остановки \"%s\"\n" -#: pg_ctl.c:2152 +#: pg_ctl.c:2146 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: нераспознанное имя сигнала \"%s\"\n" -#: pg_ctl.c:2169 +#: pg_ctl.c:2163 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: нераспознанный тип запуска \"%s\"\n" -#: pg_ctl.c:2224 +#: pg_ctl.c:2218 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: не удалось определить каталог данных с помощью команды \"%s\"\n" -#: pg_ctl.c:2248 +#: pg_ctl.c:2242 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: управляющий файл, по-видимому, испорчен\n" -#: pg_ctl.c:2316 +#: pg_ctl.c:2310 #, c-format msgid "" "%s: cannot be run as root\n" @@ -891,32 +891,32 @@ msgstr "" "Пожалуйста, переключитесь на обычного пользователя (например,\n" "используя \"su\"), который будет запускать серверный процесс.\n" -#: pg_ctl.c:2400 +#: pg_ctl.c:2393 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: параметр -S не поддерживается в этой ОС\n" -#: pg_ctl.c:2437 +#: pg_ctl.c:2430 #, c-format msgid "%s: too many command-line arguments (first is \"%s\")\n" msgstr "%s: слишком много аргументов командной строки (первый: \"%s\")\n" -#: pg_ctl.c:2463 +#: pg_ctl.c:2456 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: отсутствуют аргументы для режима kill\n" -#: pg_ctl.c:2481 +#: pg_ctl.c:2474 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: нераспознанный режим работы \"%s\"\n" -#: pg_ctl.c:2491 +#: pg_ctl.c:2484 #, c-format msgid "%s: no operation specified\n" msgstr "%s: команда не указана\n" -#: pg_ctl.c:2512 +#: pg_ctl.c:2505 #, c-format msgid "" "%s: no database directory specified and environment variable PGDATA unset\n" diff --git a/src/bin/pg_ctl/po/sv.po b/src/bin/pg_ctl/po/sv.po index 4efaa4a8df..9762a39ba0 100644 --- a/src/bin/pg_ctl/po/sv.po +++ b/src/bin/pg_ctl/po/sv.po @@ -1,5 +1,5 @@ # Swedish message translation file for pg_ctl -# Dennis Björklund , 2004, 2005, 2006, 2017, 2018, 2019, 2020. +# Dennis Björklund , 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. # Magnus Hagander , 2010. # Mats Erik Andersson , 2013, 2014. # @@ -7,10 +7,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-11 01:15+0000\n" -"PO-Revision-Date: 2020-04-11 07:51+0200\n" +"POT-Creation-Date: 2022-04-11 09:18+0000\n" +"PO-Revision-Date: 2022-04-11 14:43+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -19,48 +19,48 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:144 ../../common/exec.c:261 ../../common/exec.c:307 #, c-format msgid "could not identify current directory: %m" msgstr "kunde inte identifiera aktuell katalog: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:163 #, c-format msgid "invalid binary \"%s\"" msgstr "ogiltig binär \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:213 #, c-format msgid "could not read binary \"%s\"" msgstr "kunde inte läsa binär \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:221 #, c-format msgid "could not find a \"%s\" to execute" msgstr "kunde inte hitta en \"%s\" att köra" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:277 ../../common/exec.c:316 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "kunde inte byta katalog till \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:294 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "kan inte läsa symbolisk länk \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:417 #, c-format -msgid "pclose failed: %m" -msgstr "pclose misslyckades: %m" +msgid "%s() failed: %m" +msgstr "%s() misslyckades: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 +#: ../../common/exec.c:555 ../../common/exec.c:600 ../../common/exec.c:692 msgid "out of memory" msgstr "slut på minne" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 -#: ../../port/path.c:632 ../../port/path.c:670 ../../port/path.c:687 +#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 #, c-format msgid "out of memory\n" msgstr "slut på minne\n" @@ -100,135 +100,123 @@ msgstr "barnprocess terminerades av signal %d: %s" msgid "child process exited with unrecognized status %d" msgstr "barnprocess avslutade med okänd statuskod %d" -#: ../../port/path.c:654 +#: ../../port/path.c:775 #, c-format msgid "could not get current working directory: %s\n" msgstr "kunde inte fastställa nuvarande arbetskatalog: %s\n" -#: pg_ctl.c:258 +#: pg_ctl.c:260 #, c-format msgid "%s: directory \"%s\" does not exist\n" msgstr "%s: katalogen \"%s\" existerar inte\n" -#: pg_ctl.c:261 +#: pg_ctl.c:263 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s: kunde inte komma åt katalogen \"%s\": %s\n" -#: pg_ctl.c:274 +#: pg_ctl.c:276 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" msgstr "%s: katalogen \"%s\" innehåller inte något databaskluster.\n" -#: pg_ctl.c:287 +#: pg_ctl.c:289 #, c-format msgid "%s: could not open PID file \"%s\": %s\n" msgstr "%s: kunde inte öppna PID-fil \"%s\": %s\n" -#: pg_ctl.c:296 +#: pg_ctl.c:298 #, c-format msgid "%s: the PID file \"%s\" is empty\n" msgstr "%s: PID-filen \"%s\" är tom\n" -#: pg_ctl.c:299 +#: pg_ctl.c:301 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" msgstr "%s: ogiltig data i PID-fil \"%s\"\n" -#: pg_ctl.c:458 pg_ctl.c:500 +#: pg_ctl.c:464 pg_ctl.c:506 #, c-format msgid "%s: could not start server: %s\n" msgstr "%s: kunde inte starta servern: %s\n" -#: pg_ctl.c:478 +#: pg_ctl.c:484 #, c-format msgid "%s: could not start server due to setsid() failure: %s\n" msgstr "%s: kunde inte starta servern då setsid() misslyckades: %s\n" -#: pg_ctl.c:548 +#: pg_ctl.c:554 #, c-format msgid "%s: could not open log file \"%s\": %s\n" msgstr "%s: kunde inte öppna logg-fil \"%s\": %s\n" -#: pg_ctl.c:565 +#: pg_ctl.c:571 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s: kunde inte starta servern: felkod %lu\n" -#: pg_ctl.c:712 +#: pg_ctl.c:788 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" msgstr "%s: kan inte sätta storleksgränsning på core-fil; tillåts inte av hård gräns\n" -#: pg_ctl.c:738 +#: pg_ctl.c:814 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "%s: kunde inte läsa filen \"%s\"\n" -#: pg_ctl.c:743 +#: pg_ctl.c:819 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: inställningsfilen \"%s\" måste bestå av en enda rad.\n" -#: pg_ctl.c:785 pg_ctl.c:976 pg_ctl.c:1072 +#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112 #, c-format msgid "%s: could not send stop signal (PID: %ld): %s\n" msgstr "%s: kunde inte skicka stopp-signal (PID: %ld): %s\n" -#: pg_ctl.c:813 +#: pg_ctl.c:889 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation.\n" -msgstr "" -"Programmet \"%s\" behövs av %s men hittades inte i samma\n" -"katalog som \"%s\".\n" -"Kontrollera din installation.\n" +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" +msgstr "Programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\"\n" -#: pg_ctl.c:819 +#: pg_ctl.c:892 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation.\n" -msgstr "" -"Programmet \"%s\" hittades av \"%s\"\n" -"men är inte av samma version som %s.\n" -"Kontrollera din installation.\n" +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" +msgstr "Programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s.\n" -#: pg_ctl.c:852 +#: pg_ctl.c:923 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s: skapande av databaskluster misslyckades\n" -#: pg_ctl.c:867 +#: pg_ctl.c:938 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" msgstr "%s: en annan server verkar köra; försöker starta servern ändå.\n" -#: pg_ctl.c:916 +#: pg_ctl.c:986 msgid "waiting for server to start..." msgstr "väntar på att servern skall starta..." -#: pg_ctl.c:921 pg_ctl.c:1026 pg_ctl.c:1118 pg_ctl.c:1248 +#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243 msgid " done\n" msgstr " klar\n" -#: pg_ctl.c:922 +#: pg_ctl.c:992 msgid "server started\n" msgstr "servern startad\n" -#: pg_ctl.c:925 pg_ctl.c:931 pg_ctl.c:1253 +#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248 msgid " stopped waiting\n" msgstr " avslutade väntan\n" -#: pg_ctl.c:926 +#: pg_ctl.c:996 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: servern startade inte i tid\n" -#: pg_ctl.c:932 +#: pg_ctl.c:1002 #, c-format msgid "" "%s: could not start server\n" @@ -237,52 +225,42 @@ msgstr "" "%s: kunde inte starta servern\n" "Undersök logg-utskriften.\n" -#: pg_ctl.c:940 +#: pg_ctl.c:1010 msgid "server starting\n" msgstr "servern startar\n" -#: pg_ctl.c:961 pg_ctl.c:1048 pg_ctl.c:1139 pg_ctl.c:1178 pg_ctl.c:1277 +#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: PID-filen \"%s\" finns inte\n" -#: pg_ctl.c:962 pg_ctl.c:1050 pg_ctl.c:1140 pg_ctl.c:1179 pg_ctl.c:1278 +#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273 msgid "Is server running?\n" msgstr "Kör servern?\n" -#: pg_ctl.c:968 +#: pg_ctl.c:1036 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n" msgstr "%s: Kan inte stanna servern. En-användar-server i drift (PID: %ld).\n" -#: pg_ctl.c:983 +#: pg_ctl.c:1051 msgid "server shutting down\n" msgstr "servern stänger ner\n" -#: pg_ctl.c:998 pg_ctl.c:1087 -msgid "" -"WARNING: online backup mode is active\n" -"Shutdown will not complete until pg_stop_backup() is called.\n" -"\n" -msgstr "" -"VARNING: Läget för backup under drift är i gång.\n" -"Nedstängning är inte fullständig förrän pg_stop_backup() har anropats.\n" -"\n" - -#: pg_ctl.c:1002 pg_ctl.c:1091 +#: pg_ctl.c:1056 pg_ctl.c:1117 msgid "waiting for server to shut down..." msgstr "väntar på att servern skall stänga ner..." -#: pg_ctl.c:1018 pg_ctl.c:1109 +#: pg_ctl.c:1060 pg_ctl.c:1122 msgid " failed\n" msgstr " misslyckades\n" -#: pg_ctl.c:1020 pg_ctl.c:1111 +#: pg_ctl.c:1062 pg_ctl.c:1124 #, c-format msgid "%s: server does not shut down\n" msgstr "%s: servern stänger inte ner\n" -#: pg_ctl.c:1022 pg_ctl.c:1113 +#: pg_ctl.c:1064 pg_ctl.c:1126 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -290,245 +268,245 @@ msgstr "" "TIPS: Flaggan \"-m fast\" avslutar sessioner omedelbart, i stället för att\n" "vänta på deras självvalda avslut.\n" -#: pg_ctl.c:1028 pg_ctl.c:1119 +#: pg_ctl.c:1070 pg_ctl.c:1132 msgid "server stopped\n" msgstr "servern är stoppad\n" -#: pg_ctl.c:1051 +#: pg_ctl.c:1091 msgid "trying to start server anyway\n" msgstr "försöker starta servern ändå\n" -#: pg_ctl.c:1060 +#: pg_ctl.c:1100 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n" msgstr "%s: kan inte starta om servern. En-användar-server kör (PID: %ld).\n" -#: pg_ctl.c:1063 pg_ctl.c:1149 +#: pg_ctl.c:1103 pg_ctl.c:1162 msgid "Please terminate the single-user server and try again.\n" msgstr "Var vänlig att stanna en-användar-servern och försök sedan igen.\n" -#: pg_ctl.c:1123 +#: pg_ctl.c:1136 #, c-format msgid "%s: old server process (PID: %ld) seems to be gone\n" msgstr "%s: gamla serverprocessen (PID: %ld) verkar vara borta\n" -#: pg_ctl.c:1125 +#: pg_ctl.c:1138 msgid "starting server anyway\n" msgstr "startar servern ändå\n" -#: pg_ctl.c:1146 +#: pg_ctl.c:1159 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n" msgstr "%s: kan inte ladda om servern; en-användar-server kör (PID: %ld)\n" -#: pg_ctl.c:1155 +#: pg_ctl.c:1168 #, c-format msgid "%s: could not send reload signal (PID: %ld): %s\n" msgstr "%s: kunde inte skicka signalen \"reload\" (PID: %ld): %s\n" -#: pg_ctl.c:1160 +#: pg_ctl.c:1173 msgid "server signaled\n" msgstr "servern är signalerad\n" -#: pg_ctl.c:1185 +#: pg_ctl.c:1198 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n" msgstr "%s: kan inte befordra servern; en-användar-server kör (PID: %ld)\n" -#: pg_ctl.c:1193 +#: pg_ctl.c:1206 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s: kan inte befordra servern; servern är inte i beredskapsläge.\n" -#: pg_ctl.c:1208 +#: pg_ctl.c:1216 #, c-format msgid "%s: could not create promote signal file \"%s\": %s\n" msgstr "%s: kunde inte skapa befordringssignalfil \"%s\": %s\n" -#: pg_ctl.c:1214 +#: pg_ctl.c:1222 #, c-format msgid "%s: could not write promote signal file \"%s\": %s\n" msgstr "%s: kunde inte skriva befordringssignalfil \"%s\": %s\n" -#: pg_ctl.c:1222 +#: pg_ctl.c:1230 #, c-format msgid "%s: could not send promote signal (PID: %ld): %s\n" msgstr "%s: kunde inte skicka befordringssignal (PID: %ld): %s\n" -#: pg_ctl.c:1225 +#: pg_ctl.c:1233 #, c-format msgid "%s: could not remove promote signal file \"%s\": %s\n" msgstr "%s: kunde inte ta bort befordringssignalfil \"%s\": %s\n" -#: pg_ctl.c:1235 +#: pg_ctl.c:1240 msgid "waiting for server to promote..." msgstr "väntar på att servern skall befordras..." -#: pg_ctl.c:1249 +#: pg_ctl.c:1244 msgid "server promoted\n" msgstr "servern befordrad\n" -#: pg_ctl.c:1254 +#: pg_ctl.c:1249 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s: servern befordrades inte i tid\n" -#: pg_ctl.c:1260 +#: pg_ctl.c:1255 msgid "server promoting\n" msgstr "servern befordras\n" -#: pg_ctl.c:1284 +#: pg_ctl.c:1279 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n" msgstr "%s: kan inte rotera loggfil; en-användar-server kör (PID: %ld)\n" -#: pg_ctl.c:1294 +#: pg_ctl.c:1289 #, c-format msgid "%s: could not create log rotation signal file \"%s\": %s\n" msgstr "%s: kunde inte skapa loggroteringssignalfil \"%s\": %s\n" -#: pg_ctl.c:1300 +#: pg_ctl.c:1295 #, c-format msgid "%s: could not write log rotation signal file \"%s\": %s\n" msgstr "%s: kunde inte skriva loggroteringssignalfil \"%s\": %s\n" -#: pg_ctl.c:1308 +#: pg_ctl.c:1303 #, c-format msgid "%s: could not send log rotation signal (PID: %ld): %s\n" msgstr "%s: kunde inte skicka signalen för loggrotering (PID: %ld): %s\n" -#: pg_ctl.c:1311 +#: pg_ctl.c:1306 #, c-format msgid "%s: could not remove log rotation signal file \"%s\": %s\n" msgstr "%s: kunde inte ta bort loggroteringssignalfil \"%s\": %s\n" -#: pg_ctl.c:1316 +#: pg_ctl.c:1311 msgid "server signaled to rotate log file\n" msgstr "servern är signalerad att rotera loggfil\n" -#: pg_ctl.c:1363 +#: pg_ctl.c:1358 #, c-format msgid "%s: single-user server is running (PID: %ld)\n" msgstr "%s: en-användar-server kör. (PID: %ld)\n" -#: pg_ctl.c:1377 +#: pg_ctl.c:1372 #, c-format msgid "%s: server is running (PID: %ld)\n" msgstr "%s: servern kör (PID: %ld)\n" -#: pg_ctl.c:1393 +#: pg_ctl.c:1388 #, c-format msgid "%s: no server running\n" msgstr "%s: ingen server kör\n" -#: pg_ctl.c:1410 +#: pg_ctl.c:1405 #, c-format msgid "%s: could not send signal %d (PID: %ld): %s\n" msgstr "%s: kunde inte skicka signal %d (PID: %ld): %s\n" -#: pg_ctl.c:1441 +#: pg_ctl.c:1436 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: kunde inte hitta det egna programmets körbara fil\n" -#: pg_ctl.c:1451 +#: pg_ctl.c:1446 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: kunde inte hitta körbar postgres.\n" -#: pg_ctl.c:1521 pg_ctl.c:1555 +#: pg_ctl.c:1516 pg_ctl.c:1550 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: kunde inte öppna tjänstehanteraren\n" -#: pg_ctl.c:1527 +#: pg_ctl.c:1522 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: tjänsten \"%s\" är redan registrerad\n" -#: pg_ctl.c:1538 +#: pg_ctl.c:1533 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: kunde inte registrera tjänsten \"%s\": felkod %lu\n" -#: pg_ctl.c:1561 +#: pg_ctl.c:1556 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: tjänsten \"%s\" är inte registrerad\n" -#: pg_ctl.c:1568 +#: pg_ctl.c:1563 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: kunde inte öppna tjänsten \"%s\": felkod %lu\n" -#: pg_ctl.c:1577 +#: pg_ctl.c:1572 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: kunde inte avregistrera tjänsten \"%s\": felkod %lu\n" -#: pg_ctl.c:1664 +#: pg_ctl.c:1659 msgid "Waiting for server startup...\n" msgstr "Väntar på serverstart...\n" -#: pg_ctl.c:1667 +#: pg_ctl.c:1662 msgid "Timed out waiting for server startup\n" msgstr "Tidsfristen ute vid väntan på serverstart\n" -#: pg_ctl.c:1671 +#: pg_ctl.c:1666 msgid "Server started and accepting connections\n" msgstr "Server startad och accepterar nu anslutningar\n" -#: pg_ctl.c:1726 +#: pg_ctl.c:1721 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: kunde inte starta tjänsten \"%s\": felkod %lu\n" -#: pg_ctl.c:1796 +#: pg_ctl.c:1824 #, c-format msgid "%s: WARNING: cannot create restricted tokens on this platform\n" msgstr "%s: VARNING: \"Restricted Token\" stöds inte av plattformen.\n" -#: pg_ctl.c:1809 +#: pg_ctl.c:1837 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: kunde inte öppna process-token: felkod %lu\n" -#: pg_ctl.c:1823 +#: pg_ctl.c:1851 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: kunde inte tilldela SID: felkod %lu\n" -#: pg_ctl.c:1850 +#: pg_ctl.c:1878 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: kunde inte skapa restriktivt styrmärke (token): felkod %lu\n" -#: pg_ctl.c:1881 +#: pg_ctl.c:1909 #, c-format msgid "%s: WARNING: could not locate all job object functions in system API\n" msgstr "%s: VARNING: kunde inte hitta alla jobb-funktioner system-API:et.\n" -#: pg_ctl.c:1978 +#: pg_ctl.c:2006 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: kunde inte hämta LUID:er för rättigheter: felkod %lu\n" -#: pg_ctl.c:1986 pg_ctl.c:2001 +#: pg_ctl.c:2014 pg_ctl.c:2029 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: kunde inte hämta token-information: felkod %lu\n" -#: pg_ctl.c:1995 +#: pg_ctl.c:2023 #, c-format msgid "%s: out of memory\n" msgstr "%s: slut på minne\n" -#: pg_ctl.c:2025 +#: pg_ctl.c:2053 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Försök med \"%s --help\" för mer information.\n" -#: pg_ctl.c:2033 +#: pg_ctl.c:2061 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" @@ -538,17 +516,17 @@ msgstr "" "PostgreSQL-tjänsten.\n" "\n" -#: pg_ctl.c:2034 +#: pg_ctl.c:2062 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: pg_ctl.c:2035 +#: pg_ctl.c:2063 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D DATAKAT] [-s] [-o FLAGGOR]\n" -#: pg_ctl.c:2036 +#: pg_ctl.c:2064 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" @@ -557,12 +535,12 @@ msgstr "" " %s start [-D DATAKAT] [-l FILNAMN] [-W] [-t SEK] [-s]\n" " [-o FLAGGOR] [-p SOKVÄG] [-c]\n" -#: pg_ctl.c:2038 +#: pg_ctl.c:2066 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr " %s stop [-D DATAKAT] [-m STÄNGNINGSMETOD] [-W] [-t SEK] [-s]\n" -#: pg_ctl.c:2039 +#: pg_ctl.c:2067 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" @@ -571,32 +549,32 @@ msgstr "" " %s restart [-D DATAKAT] [-m STÄNGNINGSMETOD] [-W] [-t SEK] [-s]\n" " [-o FLAGGOR] [-c]\n" -#: pg_ctl.c:2041 +#: pg_ctl.c:2069 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D DATAKAT] [-s]\n" -#: pg_ctl.c:2042 +#: pg_ctl.c:2070 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D DATAKAT]\n" -#: pg_ctl.c:2043 +#: pg_ctl.c:2071 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D DATAKAT] [-W] [-t SEK] [-s]\n" -#: pg_ctl.c:2044 +#: pg_ctl.c:2072 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D DATAKAT] [-s]\n" -#: pg_ctl.c:2045 +#: pg_ctl.c:2073 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill SIGNALNAMN PID\n" -#: pg_ctl.c:2047 +#: pg_ctl.c:2075 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" @@ -605,12 +583,12 @@ msgstr "" " %s register [-D DATAKAT] [-N TJÄNSTENAMN] [-U ANVÄNDARNAMN] [-P LÖSENORD]\n" " [-S STARTTYPE] [-e KÄLLA] [-W] [-t SEK] [-s] [-o FLAGGOR]\n" -#: pg_ctl.c:2049 +#: pg_ctl.c:2077 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N TJÄNSTNAMN]\n" -#: pg_ctl.c:2052 +#: pg_ctl.c:2080 #, c-format msgid "" "\n" @@ -619,52 +597,52 @@ msgstr "" "\n" "Gemensamma flaggor:\n" -#: pg_ctl.c:2053 +#: pg_ctl.c:2081 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " -D, --pgdata=DATAKAT plats för databasens lagringsarea\n" -#: pg_ctl.c:2055 +#: pg_ctl.c:2083 #, c-format msgid " -e SOURCE event source for logging when running as a service\n" msgstr " -e KÄLLA händelsekälla för loggning när vi kör som en tjänst\n" -#: pg_ctl.c:2057 +#: pg_ctl.c:2085 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr " -s, --silent skriv bara ut fel, inga informationsmeddelanden\n" -#: pg_ctl.c:2058 +#: pg_ctl.c:2086 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr " -t, --timeout=SEK antal sekunder att vänta när växeln -w används\n" -#: pg_ctl.c:2059 +#: pg_ctl.c:2087 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_ctl.c:2060 +#: pg_ctl.c:2088 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait vänta på att operationen slutförs (standard)\n" -#: pg_ctl.c:2061 +#: pg_ctl.c:2089 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait vänta inte på att operationen slutförs\n" -#: pg_ctl.c:2062 +#: pg_ctl.c:2090 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa den här hjälpen, avsluta sedan\n" -#: pg_ctl.c:2063 +#: pg_ctl.c:2091 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "Om flaggan -D inte har angivits så används omgivningsvariabeln PGDATA.\n" -#: pg_ctl.c:2065 +#: pg_ctl.c:2093 #, c-format msgid "" "\n" @@ -673,22 +651,22 @@ msgstr "" "\n" "Flaggor för start eller omstart:\n" -#: pg_ctl.c:2067 +#: pg_ctl.c:2095 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files tillåt postgres att skapa core-filer\n" -#: pg_ctl.c:2069 +#: pg_ctl.c:2097 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files inte giltig för denna plattform\n" -#: pg_ctl.c:2071 +#: pg_ctl.c:2099 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr " -l, --log=FILNAMN skriv, eller tillfoga, server-loggen till FILNAMN\n" -#: pg_ctl.c:2072 +#: pg_ctl.c:2100 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" @@ -697,14 +675,14 @@ msgstr "" " -o, --options=OPTIONS kommandoradsflaggor som skickas vidare till postgres\n" " (PostgreSQL-serverns körbara fil) eller till initdb\n" -#: pg_ctl.c:2074 +#: pg_ctl.c:2102 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr "" " -p SÖKVÄG-TILL-POSTGRES\n" " behövs normalt inte\n" -#: pg_ctl.c:2075 +#: pg_ctl.c:2103 #, c-format msgid "" "\n" @@ -713,12 +691,12 @@ msgstr "" "\n" "Flaggor för stopp eller omstart:\n" -#: pg_ctl.c:2076 +#: pg_ctl.c:2104 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr " -m, --mode=METOD METOD kan vara \"smart\", \"fast\" eller \"immediate\"\n" -#: pg_ctl.c:2078 +#: pg_ctl.c:2106 #, c-format msgid "" "\n" @@ -727,22 +705,22 @@ msgstr "" "\n" "Stängningsmetoder är:\n" -#: pg_ctl.c:2079 +#: pg_ctl.c:2107 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart stäng när alla klienter har avslutat\n" -#: pg_ctl.c:2080 +#: pg_ctl.c:2108 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast stäng omedelbart, med en kontrollerad nedstängning (standard)\n" -#: pg_ctl.c:2081 +#: pg_ctl.c:2109 #, c-format msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" msgstr " immediate stäng utan kontroller; kommer leda till återställning vid omstart\n" -#: pg_ctl.c:2083 +#: pg_ctl.c:2111 #, c-format msgid "" "\n" @@ -751,7 +729,7 @@ msgstr "" "\n" "Tillåtna signalnamn för kommando \"kill\":\n" -#: pg_ctl.c:2087 +#: pg_ctl.c:2115 #, c-format msgid "" "\n" @@ -760,27 +738,27 @@ msgstr "" "\n" "Flaggor för registrering och avregistrering:\n" -#: pg_ctl.c:2088 +#: pg_ctl.c:2116 #, c-format msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr " -N TJÄNSTENAMN tjänstenamn att registrera PostgreSQL-servern med\n" -#: pg_ctl.c:2089 +#: pg_ctl.c:2117 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr " -P LÖSENORD lösenord för konto vid registrering av PostgreSQL-servern\n" -#: pg_ctl.c:2090 +#: pg_ctl.c:2118 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr " -U NAMN användarnamn för konto vid registrering av PostgreSQL-servern\n" -#: pg_ctl.c:2091 +#: pg_ctl.c:2119 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr " -S STARTSÄTT sätt att registrera PostgreSQL-servern vid tjänstestart\n" -#: pg_ctl.c:2093 +#: pg_ctl.c:2121 #, c-format msgid "" "\n" @@ -789,17 +767,17 @@ msgstr "" "\n" "Startmetoder är:\n" -#: pg_ctl.c:2094 +#: pg_ctl.c:2122 #, c-format msgid " auto start service automatically during system startup (default)\n" msgstr " auto starta tjänsten automatiskt vid systemstart (förval)\n" -#: pg_ctl.c:2095 +#: pg_ctl.c:2123 #, c-format msgid " demand start service on demand\n" msgstr " demand starta tjänsten vid behov\n" -#: pg_ctl.c:2098 +#: pg_ctl.c:2126 #, c-format msgid "" "\n" @@ -808,37 +786,37 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_ctl.c:2099 +#: pg_ctl.c:2127 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_ctl.c:2124 +#: pg_ctl.c:2152 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: ogiltig stängningsmetod \"%s\"\n" -#: pg_ctl.c:2153 +#: pg_ctl.c:2181 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: ogiltigt signalnamn \"%s\"\n" -#: pg_ctl.c:2170 +#: pg_ctl.c:2198 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: ogiltigt startvillkor \"%s\"\n" -#: pg_ctl.c:2225 +#: pg_ctl.c:2253 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: kunde inte bestämma databaskatalogen från kommandot \"%s\"\n" -#: pg_ctl.c:2249 +#: pg_ctl.c:2277 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: kontrollfilen verkar vara trasig\n" -#: pg_ctl.c:2317 +#: pg_ctl.c:2345 #, c-format msgid "" "%s: cannot be run as root\n" @@ -849,32 +827,32 @@ msgstr "" "Logga in (t.ex. med \"su\") som den (opriviligerade) användare\n" "vilken skall äga serverprocessen.\n" -#: pg_ctl.c:2401 +#: pg_ctl.c:2428 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: flaggan -S stöds inte på denna plattform.\n" -#: pg_ctl.c:2438 +#: pg_ctl.c:2465 #, c-format msgid "%s: too many command-line arguments (first is \"%s\")\n" msgstr "%s: för många kommandoradsargument (första är \"%s\")\n" -#: pg_ctl.c:2464 +#: pg_ctl.c:2491 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: saknar argument för \"kill\"-kommando.\n" -#: pg_ctl.c:2482 +#: pg_ctl.c:2509 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: okänd operationsmetod \"%s\"\n" -#: pg_ctl.c:2492 +#: pg_ctl.c:2519 #, c-format msgid "%s: no operation specified\n" msgstr "%s: ingen operation angiven\n" -#: pg_ctl.c:2513 +#: pg_ctl.c:2540 #, c-format msgid "%s: no database directory specified and environment variable PGDATA unset\n" msgstr "%s: ingen databaskatalog angiven och omgivningsvariabeln PGDATA är inte satt\n" diff --git a/src/bin/pg_ctl/po/uk.po b/src/bin/pg_ctl/po/uk.po index 34c19e3a28..05891ae545 100644 --- a/src/bin/pg_ctl/po/uk.po +++ b/src/bin/pg_ctl/po/uk.po @@ -2,11 +2,11 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:15+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" -"Last-Translator: pasha_golub\n" +"POT-Creation-Date: 2021-06-10 08:46+0000\n" +"PO-Revision-Date: 2021-08-17 10:54\n" +"Last-Translator: \n" "Language-Team: Ukrainian\n" -"Language: uk\n" +"Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -14,45 +14,45 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/pg_ctl.pot\n" -"X-Crowdin-File-ID: 498\n" +"X-Crowdin-File: /REL_14_DEV/pg_ctl.pot\n" +"X-Crowdin-File-ID: 740\n" -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "не вдалося визначити поточний каталог: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "невірний бінарний файл \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "неможливо прочитати бінарний файл \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "неможливо знайти \"%s\" для виконання" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не вдалося змінити каталог на \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не можливо прочитати символічне послання \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:409 #, c-format -msgid "pclose failed: %m" -msgstr "помилка pclose: %m" +msgid "%s() failed: %m" +msgstr "%s() помилка: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 msgid "out of memory" msgstr "недостатньо пам'яті" @@ -168,7 +168,7 @@ msgstr "%s: не вдалося прочитати файл \"%s\"\n" msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: файл параметрів \"%s\" повинен містити рівно один рядок\n" -#: pg_ctl.c:785 pg_ctl.c:975 pg_ctl.c:1071 +#: pg_ctl.c:785 pg_ctl.c:974 pg_ctl.c:1070 #, c-format msgid "%s: could not send stop signal (PID: %ld): %s\n" msgstr "%s: не вдалося надіслати стоп-сигнал (PID: %ld): %s\n" @@ -199,597 +199,597 @@ msgstr "%s: не вдалося виконати ініціалізацію си msgid "%s: another server might be running; trying to start server anyway\n" msgstr "%s: мабуть, інший сервер вже працює; у будь-якому разі спробуємо запустити сервер\n" -#: pg_ctl.c:915 +#: pg_ctl.c:914 msgid "waiting for server to start..." msgstr "очікується запуск серверу..." -#: pg_ctl.c:920 pg_ctl.c:1025 pg_ctl.c:1117 pg_ctl.c:1247 +#: pg_ctl.c:919 pg_ctl.c:1024 pg_ctl.c:1116 pg_ctl.c:1241 msgid " done\n" msgstr " готово\n" -#: pg_ctl.c:921 +#: pg_ctl.c:920 msgid "server started\n" msgstr "сервер запущено\n" -#: pg_ctl.c:924 pg_ctl.c:930 pg_ctl.c:1252 +#: pg_ctl.c:923 pg_ctl.c:929 pg_ctl.c:1246 msgid " stopped waiting\n" msgstr " очікування припинено\n" -#: pg_ctl.c:925 +#: pg_ctl.c:924 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: сервер не було запущено вчасно\n" -#: pg_ctl.c:931 +#: pg_ctl.c:930 #, c-format msgid "%s: could not start server\n" "Examine the log output.\n" msgstr "%s: неможливо запустити сервер\n" "Передивіться протокол виконання.\n" -#: pg_ctl.c:939 +#: pg_ctl.c:938 msgid "server starting\n" msgstr "запуск серверу\n" -#: pg_ctl.c:960 pg_ctl.c:1047 pg_ctl.c:1138 pg_ctl.c:1177 pg_ctl.c:1276 +#: pg_ctl.c:959 pg_ctl.c:1046 pg_ctl.c:1137 pg_ctl.c:1176 pg_ctl.c:1270 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: файл PID \"%s\" не існує\n" -#: pg_ctl.c:961 pg_ctl.c:1049 pg_ctl.c:1139 pg_ctl.c:1178 pg_ctl.c:1277 +#: pg_ctl.c:960 pg_ctl.c:1048 pg_ctl.c:1138 pg_ctl.c:1177 pg_ctl.c:1271 msgid "Is server running?\n" msgstr "Сервер працює?\n" -#: pg_ctl.c:967 +#: pg_ctl.c:966 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n" msgstr "%s: не можливо зупинити сервер; сервер запущений в режимі single-user (PID: %ld)\n" -#: pg_ctl.c:982 +#: pg_ctl.c:981 msgid "server shutting down\n" msgstr "сервер зупиняється\n" -#: pg_ctl.c:997 pg_ctl.c:1086 +#: pg_ctl.c:996 pg_ctl.c:1085 msgid "WARNING: online backup mode is active\n" "Shutdown will not complete until pg_stop_backup() is called.\n\n" msgstr "ПОПЕРЕДЖЕННЯ: режим онлайн копіювання активний\n" "Зупинку не буде завершено поки не буде викликано pg_stop_backup().\n\n" -#: pg_ctl.c:1001 pg_ctl.c:1090 +#: pg_ctl.c:1000 pg_ctl.c:1089 msgid "waiting for server to shut down..." msgstr "очікується зупинка серверу..." -#: pg_ctl.c:1017 pg_ctl.c:1108 +#: pg_ctl.c:1016 pg_ctl.c:1107 msgid " failed\n" msgstr " помилка\n" -#: pg_ctl.c:1019 pg_ctl.c:1110 +#: pg_ctl.c:1018 pg_ctl.c:1109 #, c-format msgid "%s: server does not shut down\n" msgstr "%s: сервер не зупинено\n" -#: pg_ctl.c:1021 pg_ctl.c:1112 +#: pg_ctl.c:1020 pg_ctl.c:1111 msgid "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" msgstr "ПІДКАЗКА: Режим \"-m fast\" закриває сесії відразу, не чекаючи на відключення ініційовані сесіями.\n" -#: pg_ctl.c:1027 pg_ctl.c:1118 +#: pg_ctl.c:1026 pg_ctl.c:1117 msgid "server stopped\n" msgstr "сервер зупинено\n" -#: pg_ctl.c:1050 +#: pg_ctl.c:1049 msgid "trying to start server anyway\n" msgstr "спроба запуску серверу в будь-якому разі\n" -#: pg_ctl.c:1059 +#: pg_ctl.c:1058 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n" msgstr "%s: не можливо перезапустити сервер; сервер запущений в режимі single-user (PID: %ld)\n" -#: pg_ctl.c:1062 pg_ctl.c:1148 +#: pg_ctl.c:1061 pg_ctl.c:1147 msgid "Please terminate the single-user server and try again.\n" msgstr "Будь ласка, припиніть однокористувацький сервер та спробуйте ще раз.\n" -#: pg_ctl.c:1122 +#: pg_ctl.c:1121 #, c-format msgid "%s: old server process (PID: %ld) seems to be gone\n" msgstr "%s: старий серверний процес (PID: %ld), здається, зник\n" -#: pg_ctl.c:1124 +#: pg_ctl.c:1123 msgid "starting server anyway\n" msgstr "запуск серверу в будь-якому разі\n" -#: pg_ctl.c:1145 +#: pg_ctl.c:1144 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n" msgstr "%s: неможливо перезавантажити сервер; сервер запущено в однокористувацькому режимі (PID: %ld)\n" -#: pg_ctl.c:1154 +#: pg_ctl.c:1153 #, c-format msgid "%s: could not send reload signal (PID: %ld): %s\n" msgstr "%s: не можливо надіслати сигнал перезавантаження (PID: %ld): %s\n" -#: pg_ctl.c:1159 +#: pg_ctl.c:1158 msgid "server signaled\n" msgstr "серверу надіслано сигнал\n" -#: pg_ctl.c:1184 +#: pg_ctl.c:1183 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n" msgstr "%s: неможливо підвищити сервер; сервер запущено в режимі single-user (PID: %ld)\n" -#: pg_ctl.c:1192 +#: pg_ctl.c:1191 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s: неможливо підвищити сервер; сервер запущено не в режимі резерву\n" -#: pg_ctl.c:1207 +#: pg_ctl.c:1201 #, c-format msgid "%s: could not create promote signal file \"%s\": %s\n" msgstr "%s: неможливо створити файл \"%s\" із сигналом для підвищення: %s\n" -#: pg_ctl.c:1213 +#: pg_ctl.c:1207 #, c-format msgid "%s: could not write promote signal file \"%s\": %s\n" msgstr "%s: неможливо записати файл \"%s\" із сигналом для підвищення: %s\n" -#: pg_ctl.c:1221 +#: pg_ctl.c:1215 #, c-format msgid "%s: could not send promote signal (PID: %ld): %s\n" msgstr "%s: неможливо надіслати сигнал підвищення (PID: %ld): %s\n" -#: pg_ctl.c:1224 +#: pg_ctl.c:1218 #, c-format msgid "%s: could not remove promote signal file \"%s\": %s\n" msgstr "%s: неможливо видалити файл \"%s\" із сигналом для підвищення: %s\n" -#: pg_ctl.c:1234 +#: pg_ctl.c:1228 msgid "waiting for server to promote..." msgstr "очікується підвищення серверу..." -#: pg_ctl.c:1248 +#: pg_ctl.c:1242 msgid "server promoted\n" msgstr "сервер підвищено\n" -#: pg_ctl.c:1253 +#: pg_ctl.c:1247 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s: сервер не було підвищено вчасно\n" -#: pg_ctl.c:1259 +#: pg_ctl.c:1253 msgid "server promoting\n" msgstr "сервер підвищується\n" -#: pg_ctl.c:1283 +#: pg_ctl.c:1277 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n" msgstr "%s: не можливо розвернути файл журналу; сервер працює в режимі одного користувача (PID: %ld)\n" -#: pg_ctl.c:1293 +#: pg_ctl.c:1287 #, c-format msgid "%s: could not create log rotation signal file \"%s\": %s\n" msgstr "%s: не вдалося створити файл сигналу розвороту журналу \"%s\": %s\n" -#: pg_ctl.c:1299 +#: pg_ctl.c:1293 #, c-format msgid "%s: could not write log rotation signal file \"%s\": %s\n" msgstr "%s: не вдалося записати у файл сигналу розвороту журналу \"%s\": %s\n" -#: pg_ctl.c:1307 +#: pg_ctl.c:1301 #, c-format msgid "%s: could not send log rotation signal (PID: %ld): %s\n" msgstr "%s: не вдалося надіслати сигнал розвороту журналу (PID: %ld): %s\n" -#: pg_ctl.c:1310 +#: pg_ctl.c:1304 #, c-format msgid "%s: could not remove log rotation signal file \"%s\": %s\n" msgstr "%s: не вдалося видалити файл сигналу розвороту журналу \"%s\": %s\n" -#: pg_ctl.c:1315 +#: pg_ctl.c:1309 msgid "server signaled to rotate log file\n" msgstr "серверу надіслано сигнал для розворот файлу журналу\n" -#: pg_ctl.c:1362 +#: pg_ctl.c:1356 #, c-format msgid "%s: single-user server is running (PID: %ld)\n" msgstr "%s: однокористувацький сервер працює (PID: %ld)\n" -#: pg_ctl.c:1376 +#: pg_ctl.c:1370 #, c-format msgid "%s: server is running (PID: %ld)\n" msgstr "%s: сервер працює (PID: %ld)\n" -#: pg_ctl.c:1392 +#: pg_ctl.c:1386 #, c-format msgid "%s: no server running\n" msgstr "%s: сервер не працює \n" -#: pg_ctl.c:1409 +#: pg_ctl.c:1403 #, c-format msgid "%s: could not send signal %d (PID: %ld): %s\n" msgstr "%s: не вдалося надіслати сигнал %d (PID: %ld): %s\n" -#: pg_ctl.c:1440 +#: pg_ctl.c:1434 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: не вдалося знайти ехе файл власної програми\n" -#: pg_ctl.c:1450 +#: pg_ctl.c:1444 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: не вдалося знайти виконану програму postgres\n" -#: pg_ctl.c:1520 pg_ctl.c:1554 +#: pg_ctl.c:1514 pg_ctl.c:1548 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: не вдалося відкрити менеджер служб\n" -#: pg_ctl.c:1526 +#: pg_ctl.c:1520 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: служба \"%s\" вже зареєстрована \n" -#: pg_ctl.c:1537 +#: pg_ctl.c:1531 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: не вдалося зареєструвати службу \"%s\": код помилки %lu\n" -#: pg_ctl.c:1560 +#: pg_ctl.c:1554 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: служба \"%s\" не зареєстрована \n" -#: pg_ctl.c:1567 +#: pg_ctl.c:1561 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: не вдалося відкрити службу \"%s\": код помилки %lu\n" -#: pg_ctl.c:1576 +#: pg_ctl.c:1570 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: не вдалося видалити службу \"%s\": код помилки %lu\n" -#: pg_ctl.c:1663 +#: pg_ctl.c:1657 msgid "Waiting for server startup...\n" msgstr "Очікування запуску сервера...\n" -#: pg_ctl.c:1666 +#: pg_ctl.c:1660 msgid "Timed out waiting for server startup\n" msgstr "Перевищено час очікування запуску сервера\n" -#: pg_ctl.c:1670 +#: pg_ctl.c:1664 msgid "Server started and accepting connections\n" msgstr "Сервер запущений і приймає з'єднання\n" -#: pg_ctl.c:1725 +#: pg_ctl.c:1719 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: не вдалося почати службу \"%s\": код помилки %lu\n" -#: pg_ctl.c:1795 +#: pg_ctl.c:1789 #, c-format msgid "%s: WARNING: cannot create restricted tokens on this platform\n" msgstr "%s: УВАГА: не вдалося створити обмежені токени на цій платформі\n" -#: pg_ctl.c:1808 +#: pg_ctl.c:1802 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: не вдалося відкрити токен процесу: код помилки %lu\n" -#: pg_ctl.c:1822 +#: pg_ctl.c:1816 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: не вдалося виділити SID: код помилки %lu\n" -#: pg_ctl.c:1849 +#: pg_ctl.c:1843 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: не вдалося створити обмежений токен: код помилки %lu\n" -#: pg_ctl.c:1880 +#: pg_ctl.c:1874 #, c-format msgid "%s: WARNING: could not locate all job object functions in system API\n" msgstr "%s: ПОПЕРЕДЖЕННЯ: не вдалося знайти усі робочі функції у системному API для завдань\n" -#: pg_ctl.c:1977 +#: pg_ctl.c:1971 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: не вдалося отримати LUIDs для прав: код помилки %lu\n" -#: pg_ctl.c:1985 pg_ctl.c:2000 +#: pg_ctl.c:1979 pg_ctl.c:1994 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: не вдалося отримати інформацію токену: код помилки %lu\n" -#: pg_ctl.c:1994 +#: pg_ctl.c:1988 #, c-format msgid "%s: out of memory\n" msgstr "%s: бракує пам'яті\n" -#: pg_ctl.c:2024 +#: pg_ctl.c:2018 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" для отримання додаткової інформації.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2026 #, c-format msgid "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n\n" msgstr "%s - це утиліта для ініціалізації, запуску, зупинки і контролю серверу PostgreSQL.\n\n" -#: pg_ctl.c:2033 +#: pg_ctl.c:2027 #, c-format msgid "Usage:\n" msgstr "Використання:\n" -#: pg_ctl.c:2034 +#: pg_ctl.c:2028 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D КАТАЛОГ-ДАНИХ] [-s] [-o ПАРАМЕТРИ]\n" -#: pg_ctl.c:2035 +#: pg_ctl.c:2029 #, c-format msgid " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-p PATH] [-c]\n" msgstr " %s start [-D КАТАЛОГ-ДАНИХ] [-l ІМ'Я-ФАЙЛ] [-W] [-t СЕК] [-s]\n" " [-o ПАРАМЕТРИ] [-p ШЛЯХ] [-c]\n" -#: pg_ctl.c:2037 +#: pg_ctl.c:2031 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr " %s stop [-D КАТАЛОГ-ДАНИХ] [-m РЕЖИМ-ЗУПИНКИ] [-W] [-t СЕК] [-s]\n" -#: pg_ctl.c:2038 +#: pg_ctl.c:2032 #, c-format msgid " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-c]\n" msgstr " %s restart [-D КАТАЛОГ-ДАНИХ] [-m РЕЖИМ-ЗУПИНКИ] [-W] [-t СЕК] [-s]\n" " [-o ПАРАМЕТРИ] [-c]\n" -#: pg_ctl.c:2040 +#: pg_ctl.c:2034 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D КАТАЛОГ-ДАНИХ] [-s]\n" -#: pg_ctl.c:2041 +#: pg_ctl.c:2035 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D DATADIR]\n" -#: pg_ctl.c:2042 +#: pg_ctl.c:2036 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D КАТАЛОГ-ДАНИХ] [-W] [-t СЕК] [-s]\n" -#: pg_ctl.c:2043 +#: pg_ctl.c:2037 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D DATADIR] [-s]\n" -#: pg_ctl.c:2044 +#: pg_ctl.c:2038 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill ІМ'Я-СИГНАЛУ PID\n" -#: pg_ctl.c:2046 +#: pg_ctl.c:2040 #, c-format msgid " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" " [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" msgstr " %s register [-D КАТАЛОГ-ДАНИХ] [-N ІМ'Я-СЛУЖБИ] [-U ІМ'Я-КОРИСТУВАЧА] [-P ПАРОЛЬ]\n" " [-S ТИП-ЗАПУСКУ] [-e ДЖЕРЕЛО] [-W] [-t СЕК] [-s] [-o ПАРАМЕТРИ]\n" -#: pg_ctl.c:2048 +#: pg_ctl.c:2042 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N ІМ'Я-СЛУЖБИ]\n" -#: pg_ctl.c:2051 +#: pg_ctl.c:2045 #, c-format msgid "\n" "Common options:\n" msgstr "\n" "Загальні параметри:\n" -#: pg_ctl.c:2052 +#: pg_ctl.c:2046 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " -D, --pgdata=КАТАЛОГ-ДАНИХ розташування простору зберігання бази даних\n" -#: pg_ctl.c:2054 +#: pg_ctl.c:2048 #, c-format msgid " -e SOURCE event source for logging when running as a service\n" msgstr " -e ДЖЕРЕЛО джерело подій для протоколу при запуску в якості послуги\n" -#: pg_ctl.c:2056 +#: pg_ctl.c:2050 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr " -s, --silent виводити лише помилки, без інформаційних повідомлень\n" -#: pg_ctl.c:2057 +#: pg_ctl.c:2051 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr " -t, --timeout=СЕК час очікування при використанні -w параметра\n" -#: pg_ctl.c:2058 +#: pg_ctl.c:2052 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію і вийти\n" -#: pg_ctl.c:2059 +#: pg_ctl.c:2053 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait чекати завершення операції (за замовчуванням)\n" -#: pg_ctl.c:2060 +#: pg_ctl.c:2054 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait не чекати завершення операції\n" -#: pg_ctl.c:2061 +#: pg_ctl.c:2055 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку потім вийти\n" -#: pg_ctl.c:2062 +#: pg_ctl.c:2056 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "Якщо -D параметр пропущено, використовувати змінну середовища PGDATA.\n" -#: pg_ctl.c:2064 +#: pg_ctl.c:2058 #, c-format msgid "\n" "Options for start or restart:\n" msgstr "\n" "Параметри запуску або перезапуску:\n" -#: pg_ctl.c:2066 +#: pg_ctl.c:2060 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files дозволяти postgres створювати дампи пам'яті\n" -#: pg_ctl.c:2068 +#: pg_ctl.c:2062 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files недопустимо цією платформою\n" -#: pg_ctl.c:2070 +#: pg_ctl.c:2064 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr " -l, --log=ФАЙЛ записувати (або додавати) протокол служби до ФАЙЛ\n" -#: pg_ctl.c:2071 +#: pg_ctl.c:2065 #, c-format msgid " -o, --options=OPTIONS command line options to pass to postgres\n" " (PostgreSQL server executable) or initdb\n" msgstr " -o, --options=ПАРАМЕТРИ параметри командного рядку для PostgreSQL або initdb\n" -#: pg_ctl.c:2073 +#: pg_ctl.c:2067 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p ШЛЯХ-ДО-СЕРВЕРУ зазвичай зайвий\n" -#: pg_ctl.c:2074 +#: pg_ctl.c:2068 #, c-format msgid "\n" "Options for stop or restart:\n" msgstr "\n" "Параметри припинення або перезапуску:\n" -#: pg_ctl.c:2075 +#: pg_ctl.c:2069 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr " -m, --mode=РЕЖИМ РЕЖИМ може бути \"smart\", \"fast\", або \"immediate\"\n" -#: pg_ctl.c:2077 +#: pg_ctl.c:2071 #, c-format msgid "\n" "Shutdown modes are:\n" msgstr "\n" "Режими зупинки:\n" -#: pg_ctl.c:2078 +#: pg_ctl.c:2072 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart вийти після від'єднання усіх клієнтів\n" -#: pg_ctl.c:2079 +#: pg_ctl.c:2073 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast вийти негайно з коректним вимкненням (за замовченням)\n" -#: pg_ctl.c:2080 +#: pg_ctl.c:2074 #, c-format msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" msgstr " immediate вийти негайно без повної процедури. Приведе до відновлення під час перезапуску\n" -#: pg_ctl.c:2082 +#: pg_ctl.c:2076 #, c-format msgid "\n" "Allowed signal names for kill:\n" msgstr "\n" "Дозволенні сигнали для команди kill:\n" -#: pg_ctl.c:2086 +#: pg_ctl.c:2080 #, c-format msgid "\n" "Options for register and unregister:\n" msgstr "\n" "Параметри для реєстрації і видалення: \n" -#: pg_ctl.c:2087 +#: pg_ctl.c:2081 #, c-format msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr " -N ІМ'Я-СЛУЖБИ ім'я служби під яким зареєструвати сервер PostgreSQL\n" -#: pg_ctl.c:2088 +#: pg_ctl.c:2082 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr " -P ПАРОЛЬ пароль облікового запису для реєстрації серверу PostgreSQL\n" -#: pg_ctl.c:2089 +#: pg_ctl.c:2083 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr " -U КОРИСТУВАЧ ім'я користувача під яким зареєструвати сервер PostgreSQL\n" -#: pg_ctl.c:2090 +#: pg_ctl.c:2084 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr " -S ТИП-ЗАПУСКУ тип запуску служби для реєстрації серверу PostgreSQL\n" -#: pg_ctl.c:2092 +#: pg_ctl.c:2086 #, c-format msgid "\n" "Start types are:\n" msgstr "\n" "Типи запуску:\n" -#: pg_ctl.c:2093 +#: pg_ctl.c:2087 #, c-format msgid " auto start service automatically during system startup (default)\n" msgstr " auto запускати сервер автоматично під час запуску системи (за замовчуванням)\n" -#: pg_ctl.c:2094 +#: pg_ctl.c:2088 #, c-format msgid " demand start service on demand\n" msgstr " demand запускати сервер за потреби\n" -#: pg_ctl.c:2097 +#: pg_ctl.c:2091 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "Повідомляти про помилки на <%s>.\n" -#: pg_ctl.c:2098 +#: pg_ctl.c:2092 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" -#: pg_ctl.c:2123 +#: pg_ctl.c:2117 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: невідомий режим завершення \"%s\"\n" -#: pg_ctl.c:2152 +#: pg_ctl.c:2146 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: невідомий сигнал \"%s\"\n" -#: pg_ctl.c:2169 +#: pg_ctl.c:2163 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: невідомий тип запуску \"%s\"\n" -#: pg_ctl.c:2224 +#: pg_ctl.c:2218 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: неможливо визначити каталог даних за допомогою команди \"%s\"\n" -#: pg_ctl.c:2248 +#: pg_ctl.c:2242 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: контрольний файл видається пошкодженим\n" -#: pg_ctl.c:2316 +#: pg_ctl.c:2310 #, c-format msgid "%s: cannot be run as root\n" "Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" @@ -798,40 +798,33 @@ msgstr "%s: не може бути запущеним від ім'я супер- " Будь ласка увійдіть (використовуючи наприклад, \"su\") як (непривілейований) користувач який буде мати\n" "свій серверний процес. \n" -#: pg_ctl.c:2400 +#: pg_ctl.c:2393 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: параметр -S не підтримується цією платформою\n" -#: pg_ctl.c:2437 +#: pg_ctl.c:2430 #, c-format msgid "%s: too many command-line arguments (first is \"%s\")\n" msgstr "%s: забагато аргументів у командному рядку (перший \"%s\")\n" -#: pg_ctl.c:2463 +#: pg_ctl.c:2456 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: відсутні аргументи для режиму kill\n" -#: pg_ctl.c:2481 +#: pg_ctl.c:2474 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: невідомий режим роботи \"%s\"\n" -#: pg_ctl.c:2491 +#: pg_ctl.c:2484 #, c-format msgid "%s: no operation specified\n" msgstr "%s: команда не вказана\n" -#: pg_ctl.c:2512 +#: pg_ctl.c:2505 #, c-format msgid "%s: no database directory specified and environment variable PGDATA unset\n" msgstr "%s: не вказано каталог даних і змінна середовища PGDATA не встановлена\n" -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Про помилки повідомляйте на .\n" - diff --git a/src/bin/pg_ctl/po/zh_CN.po b/src/bin/pg_ctl/po/zh_CN.po index 72be52a3ec..7c2c52fe29 100644 --- a/src/bin/pg_ctl/po/zh_CN.po +++ b/src/bin/pg_ctl/po/zh_CN.po @@ -4,65 +4,64 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_ctl (PostgreSQL) 12\n" +"Project-Id-Version: pg_ctl (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-05-30 17:46+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified)\n" +"POT-Creation-Date: 2021-08-14 05:46+0000\n" +"PO-Revision-Date: 2021-08-15 17:46+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified)\n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "X-Generator: Poedit 1.5.7\n" -#: ../../common/exec.c:138 ../../common/exec.c:255 ../../common/exec.c:301 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "无法确认当前目录: %m" -#: ../../common/exec.c:157 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "无效的二进制码 \"%s\"" -#: ../../common/exec.c:207 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "无法读取二进制码 \"%s\"" -#: ../../common/exec.c:215 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "未能找到一个 \"%s\" 来执行" -#: ../../common/exec.c:271 ../../common/exec.c:310 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "无法跳转到目录 \"%s\" 中: %m" -#: ../../common/exec.c:288 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "无法读取符号链接 \"%s\": %m" -#: ../../common/exec.c:541 -#, c-format -msgid "pclose failed: %m" -msgstr "pclose调用失败: %m" +#: ../../common/exec.c:409 +msgid "%s() failed: %m" +msgstr "%s()失败: %m" -#: ../../common/exec.c:670 ../../common/exec.c:715 ../../common/exec.c:807 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 msgid "out of memory" -msgstr "内存用尽" +msgstr "内存不足" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../port/path.c:632 ../../port/path.c:670 -#: ../../port/path.c:687 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../port/path.c:632 ../../port/path.c:670 ../../port/path.c:687 #, c-format msgid "out of memory\n" -msgstr "内存溢出\n" +msgstr "内存不足\n" -#: ../../common/fe_memutils.c:92 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "无法复制空指针 (内部错误)\n" @@ -75,7 +74,7 @@ msgstr "无法执行命令" #: ../../common/wait_error.c:49 #, c-format msgid "command not found" -msgstr "没有找到命令" +msgstr "命令没有找到" #: ../../common/wait_error.c:54 #, c-format @@ -102,125 +101,131 @@ msgstr "子进程已退出, 未知状态 %d" msgid "could not get current working directory: %s\n" msgstr "无法得到当前工作目录: %s\n" -#: pg_ctl.c:262 +#: pg_ctl.c:258 #, c-format msgid "%s: directory \"%s\" does not exist\n" msgstr "%s: 目录 \"%s\" 不存在\n" -#: pg_ctl.c:265 +#: pg_ctl.c:261 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s: 无法访问目录 \"%s\": %s\n" -#: pg_ctl.c:278 +#: pg_ctl.c:274 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" msgstr "%s: 目录 \"%s\"不是一个数据库集群目录\n" -#: pg_ctl.c:291 +#: pg_ctl.c:287 #, c-format msgid "%s: could not open PID file \"%s\": %s\n" msgstr "%s: 无法打开 PID 文件 \"%s\": %s\n" -#: pg_ctl.c:300 +#: pg_ctl.c:296 #, c-format msgid "%s: the PID file \"%s\" is empty\n" msgstr "%s: PID 文件 \"%s\" 为空\n" -#: pg_ctl.c:303 +#: pg_ctl.c:299 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" msgstr "%s: PID文件 \"%s\" 中存在无效数据\n" -#: pg_ctl.c:464 pg_ctl.c:506 +#: pg_ctl.c:458 pg_ctl.c:500 #, c-format msgid "%s: could not start server: %s\n" msgstr "%s: 无法启动服务器:%s\n" -#: pg_ctl.c:484 +#: pg_ctl.c:478 #, c-format msgid "%s: could not start server due to setsid() failure: %s\n" msgstr "%s: 由于setsid()调用失败无法启动服务器:%s\n" -#: pg_ctl.c:530 +# command.c:1148 +#: pg_ctl.c:548 +#, c-format +msgid "%s: could not open log file \"%s\": %s\n" +msgstr "%s:无法开启日志文件 \"%s\":%s\n" + +#: pg_ctl.c:565 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s:无法启动服务器:错误代码%lu\n" -#: pg_ctl.c:677 +#: pg_ctl.c:712 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" msgstr "%s: 不能设置核心文件大小的限制;磁盘限额不允许\n" -#: pg_ctl.c:703 +#: pg_ctl.c:738 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "%s: 无法读取文件 \"%s\"\n" -#: pg_ctl.c:708 +#: pg_ctl.c:743 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: 选项文件 \"%s\" 只能有一行\n" -#: pg_ctl.c:750 pg_ctl.c:941 pg_ctl.c:1037 +#: pg_ctl.c:785 pg_ctl.c:974 pg_ctl.c:1070 #, c-format msgid "%s: could not send stop signal (PID: %ld): %s\n" msgstr "%s: 无法发送停止信号 (PID: %ld): %s\n" -#: pg_ctl.c:778 +#: pg_ctl.c:813 #, c-format msgid "" "The program \"%s\" is needed by %s but was not found in the\n" "same directory as \"%s\".\n" "Check your installation.\n" msgstr "" -"%2$s需要程序\"%1$s\", 但是在同一个目录\"%3$s\"中没找到.\n" -"\n" -"请检查您的安装.\n" +"%2$s需要程序\"%1$s\"\n" +"但在与\"%3$s\"相同的目录中找不到该程序.\n" +"检查您的安装.\n" -#: pg_ctl.c:784 +#: pg_ctl.c:818 #, c-format msgid "" "The program \"%s\" was found by \"%s\"\n" "but was not the same version as %s.\n" "Check your installation.\n" msgstr "" -"\"%2$s\"找到程序 \"%1$s\", 但是和版本 \"%3$s\" 不一致.\n" -"\n" +"程序\"%s\"是由\"%s\"找到的\n" +"但与%s的版本不同.\n" "检查您的安装.\n" -#: pg_ctl.c:817 +#: pg_ctl.c:851 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s: 数据库系统初始化失败\n" -#: pg_ctl.c:832 +#: pg_ctl.c:866 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" msgstr "%s: 其他服务器进程可能正在运行; 尝试启动服务器进程\n" -#: pg_ctl.c:881 +#: pg_ctl.c:914 msgid "waiting for server to start..." msgstr "等待服务器进程启动 ..." -#: pg_ctl.c:886 pg_ctl.c:991 pg_ctl.c:1083 pg_ctl.c:1213 +#: pg_ctl.c:919 pg_ctl.c:1024 pg_ctl.c:1116 pg_ctl.c:1241 msgid " done\n" msgstr " 完成\n" -#: pg_ctl.c:887 +#: pg_ctl.c:920 msgid "server started\n" msgstr "服务器进程已经启动\n" -#: pg_ctl.c:890 pg_ctl.c:896 pg_ctl.c:1218 +#: pg_ctl.c:923 pg_ctl.c:929 pg_ctl.c:1246 msgid " stopped waiting\n" msgstr " 已停止等待\n" -#: pg_ctl.c:891 +#: pg_ctl.c:924 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: 服务没有及时启动\n" -#: pg_ctl.c:897 +#: pg_ctl.c:930 #, c-format msgid "" "%s: could not start server\n" @@ -229,29 +234,29 @@ msgstr "" "%s: 无法启动服务器进程\n" "检查日志输出.\n" -#: pg_ctl.c:905 +#: pg_ctl.c:938 msgid "server starting\n" msgstr "正在启动服务器进程\n" -#: pg_ctl.c:926 pg_ctl.c:1013 pg_ctl.c:1104 pg_ctl.c:1143 pg_ctl.c:1242 +#: pg_ctl.c:959 pg_ctl.c:1046 pg_ctl.c:1137 pg_ctl.c:1176 pg_ctl.c:1270 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: PID 文件 \"%s\" 不存在\n" -#: pg_ctl.c:927 pg_ctl.c:1015 pg_ctl.c:1105 pg_ctl.c:1144 pg_ctl.c:1243 +#: pg_ctl.c:960 pg_ctl.c:1048 pg_ctl.c:1138 pg_ctl.c:1177 pg_ctl.c:1271 msgid "Is server running?\n" msgstr "服务器进程是否正在运行?\n" -#: pg_ctl.c:933 +#: pg_ctl.c:966 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n" msgstr "%s: 无法停止服务器进程; 正在运行 单用户模式服务器进程(PID: %ld)\n" -#: pg_ctl.c:948 +#: pg_ctl.c:981 msgid "server shutting down\n" msgstr "正在关闭服务器进程\n" -#: pg_ctl.c:963 pg_ctl.c:1052 +#: pg_ctl.c:996 pg_ctl.c:1085 msgid "" "WARNING: online backup mode is active\n" "Shutdown will not complete until pg_stop_backup() is called.\n" @@ -260,20 +265,20 @@ msgstr "" "警告: 在线备份模式处于激活状态\n" "关闭命令将不会完成,直到调用了pg_stop_backup().\n" -#: pg_ctl.c:967 pg_ctl.c:1056 +#: pg_ctl.c:1000 pg_ctl.c:1089 msgid "waiting for server to shut down..." msgstr "等待服务器进程关闭 ..." -#: pg_ctl.c:983 pg_ctl.c:1074 +#: pg_ctl.c:1016 pg_ctl.c:1107 msgid " failed\n" msgstr " 失败\n" -#: pg_ctl.c:985 pg_ctl.c:1076 +#: pg_ctl.c:1018 pg_ctl.c:1109 #, c-format msgid "%s: server does not shut down\n" msgstr "%s: server进程没有关闭\n" -#: pg_ctl.c:987 pg_ctl.c:1078 +#: pg_ctl.c:1020 pg_ctl.c:1111 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -281,245 +286,245 @@ msgstr "" "提示: \"-m fast\" 选项可以立即断开会话, 而不用\n" "等待会话发起的断连.\n" -#: pg_ctl.c:993 pg_ctl.c:1084 +#: pg_ctl.c:1026 pg_ctl.c:1117 msgid "server stopped\n" msgstr "服务器进程已经关闭\n" -#: pg_ctl.c:1016 +#: pg_ctl.c:1049 msgid "trying to start server anyway\n" msgstr "尝试启动服务器进程\n" -#: pg_ctl.c:1025 +#: pg_ctl.c:1058 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n" msgstr "%s: 无法重启服务器进程; 单用户模式服务器进程正在运行 (PID: %ld)\n" -#: pg_ctl.c:1028 pg_ctl.c:1114 +#: pg_ctl.c:1061 pg_ctl.c:1147 msgid "Please terminate the single-user server and try again.\n" msgstr "请终止单用户模式服务器进程,然后再重试.\n" -#: pg_ctl.c:1088 +#: pg_ctl.c:1121 #, c-format msgid "%s: old server process (PID: %ld) seems to be gone\n" msgstr "%s: 原有的进程(PID: %ld)可能已经不存在了\n" -#: pg_ctl.c:1090 +#: pg_ctl.c:1123 msgid "starting server anyway\n" msgstr "正在启动服务器进程\n" -#: pg_ctl.c:1111 +#: pg_ctl.c:1144 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n" msgstr "%s: 无法重新加载服务器进程;正在运行单用户模式的服务器进程 (PID: %ld)\n" -#: pg_ctl.c:1120 +#: pg_ctl.c:1153 #, c-format msgid "%s: could not send reload signal (PID: %ld): %s\n" msgstr "%s: 无法发送重载信号 (PID: %ld): %s\n" -#: pg_ctl.c:1125 +#: pg_ctl.c:1158 msgid "server signaled\n" msgstr "服务器进程发出信号\n" -#: pg_ctl.c:1150 +#: pg_ctl.c:1183 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n" msgstr "%s: 无法重新加载服务器进程;正在运行单用户模式的服务器进程 (PID: %ld)\n" -#: pg_ctl.c:1158 +#: pg_ctl.c:1191 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s: 无法重新加载服务器进程;服务器没有运行在standby模式下\n" -#: pg_ctl.c:1173 +#: pg_ctl.c:1201 #, c-format msgid "%s: could not create promote signal file \"%s\": %s\n" msgstr "%s: 无法创建重新加载信号文件 \"%s\": %s\n" -#: pg_ctl.c:1179 +#: pg_ctl.c:1207 #, c-format msgid "%s: could not write promote signal file \"%s\": %s\n" msgstr "%s: 无法写入重新加载文件 \"%s\": %s\n" -#: pg_ctl.c:1187 +#: pg_ctl.c:1215 #, c-format msgid "%s: could not send promote signal (PID: %ld): %s\n" msgstr "%s: 无法发送重载信号(PID: %ld): %s\n" -#: pg_ctl.c:1190 +#: pg_ctl.c:1218 #, c-format msgid "%s: could not remove promote signal file \"%s\": %s\n" msgstr "%s: 无法移动重新加载信号文件 \"%s\": %s\n" -#: pg_ctl.c:1200 +#: pg_ctl.c:1228 msgid "waiting for server to promote..." msgstr "等待服务器进程加载 ..." -#: pg_ctl.c:1214 +#: pg_ctl.c:1242 msgid "server promoted\n" msgstr "服务器加载完毕\n" -#: pg_ctl.c:1219 +#: pg_ctl.c:1247 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s: 服务进程没有及时加载\n" -#: pg_ctl.c:1225 +#: pg_ctl.c:1253 msgid "server promoting\n" msgstr "服务器重新加载中\n" -#: pg_ctl.c:1249 +#: pg_ctl.c:1277 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n" msgstr "%s: 无法轮换日志文件;正在运行单用户模式的服务器进程 (PID: %ld)\n" -#: pg_ctl.c:1259 +#: pg_ctl.c:1287 #, c-format msgid "%s: could not create log rotation signal file \"%s\": %s\n" msgstr "%s: 无法创建日志轮换信号文件 \"%s\": %s\n" -#: pg_ctl.c:1265 +#: pg_ctl.c:1293 #, c-format msgid "%s: could not write log rotation signal file \"%s\": %s\n" msgstr "%s: 无法写入日志轮换信号文件 \"%s\": %s\n" -#: pg_ctl.c:1273 +#: pg_ctl.c:1301 #, c-format msgid "%s: could not send log rotation signal (PID: %ld): %s\n" msgstr "%s: 无法发送日志轮换信号 (PID: %ld): %s\n" -#: pg_ctl.c:1276 +#: pg_ctl.c:1304 #, c-format msgid "%s: could not remove log rotation signal file \"%s\": %s\n" msgstr "%s: 无法删除日志轮换信号文件 \"%s\": %s\n" -#: pg_ctl.c:1281 +#: pg_ctl.c:1309 msgid "server signaled to rotate log file\n" msgstr "服务器发出轮换日志文件的信号\n" -#: pg_ctl.c:1328 +#: pg_ctl.c:1356 #, c-format msgid "%s: single-user server is running (PID: %ld)\n" msgstr "%s: 正在运行单用户模式服务器进程 (PID: %ld)\n" -#: pg_ctl.c:1342 +#: pg_ctl.c:1370 #, c-format msgid "%s: server is running (PID: %ld)\n" msgstr "%s: 正在运行服务器进程(PID: %ld)\n" -#: pg_ctl.c:1358 +#: pg_ctl.c:1386 #, c-format msgid "%s: no server running\n" msgstr "%s:没有服务器进程正在运行\n" -#: pg_ctl.c:1375 +#: pg_ctl.c:1403 #, c-format msgid "%s: could not send signal %d (PID: %ld): %s\n" msgstr "%s: 无法发送信号 %d (PID: %ld): %s\n" -#: pg_ctl.c:1432 +#: pg_ctl.c:1434 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: 无法找到执行文件\n" -#: pg_ctl.c:1442 +#: pg_ctl.c:1444 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: 无法找到postgres程序的执行文件\n" -#: pg_ctl.c:1512 pg_ctl.c:1546 +#: pg_ctl.c:1514 pg_ctl.c:1548 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: 无法打开服务管理器\n" -#: pg_ctl.c:1518 +#: pg_ctl.c:1520 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: 服务 \"%s\" 已经注册了\n" -#: pg_ctl.c:1529 +#: pg_ctl.c:1531 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: 无法注册服务 \"%s\": 错误码 %lu\n" -#: pg_ctl.c:1552 +#: pg_ctl.c:1554 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: 服务 \"%s\" 没有注册\n" -#: pg_ctl.c:1559 +#: pg_ctl.c:1561 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: 无法打开服务 \"%s\": 错误码 %lu\n" -#: pg_ctl.c:1568 +#: pg_ctl.c:1570 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: 无法注销服务 \"%s\": 错误码 %lu\n" -#: pg_ctl.c:1655 +#: pg_ctl.c:1657 msgid "Waiting for server startup...\n" msgstr "等待服务器进程启动 ...\n" -#: pg_ctl.c:1658 +#: pg_ctl.c:1660 msgid "Timed out waiting for server startup\n" msgstr "在等待服务器启动时超时\n" -#: pg_ctl.c:1662 +#: pg_ctl.c:1664 msgid "Server started and accepting connections\n" msgstr "服务器进程已启动并且接受连接\n" -#: pg_ctl.c:1717 +#: pg_ctl.c:1719 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: 无法启动服务 \"%s\": 错误码 %lu\n" -#: pg_ctl.c:1787 +#: pg_ctl.c:1789 #, c-format msgid "%s: WARNING: cannot create restricted tokens on this platform\n" msgstr "%s: 警告: 该平台上无法创建受限令牌\n" -#: pg_ctl.c:1800 +#: pg_ctl.c:1802 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: 无法打开进程令牌 (token): 错误码 %lu\n" -#: pg_ctl.c:1814 +#: pg_ctl.c:1816 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: 无法分配SID: 错误码 %lu\n" -#: pg_ctl.c:1841 +#: pg_ctl.c:1843 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: 无法创建继承套接字: 错误码为 %lu\n" -#: pg_ctl.c:1872 +#: pg_ctl.c:1874 #, c-format msgid "%s: WARNING: could not locate all job object functions in system API\n" msgstr "%s: 警告: 系统API中无法定位所有工作对象函数\n" -#: pg_ctl.c:1969 +#: pg_ctl.c:1971 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: 由于权限无法获取LUID: 错误码 %lu\n" -#: pg_ctl.c:1977 pg_ctl.c:1992 +#: pg_ctl.c:1979 pg_ctl.c:1994 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: 无法获得令牌信息: 错误码 %lu\n" -#: pg_ctl.c:1986 +#: pg_ctl.c:1988 #, c-format msgid "%s: out of memory\n" -msgstr "%s: 内存溢出\n" +msgstr "%s: 内存不足\n" -#: pg_ctl.c:2016 +#: pg_ctl.c:2018 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "试用 \"%s --help\" 获取更多的信息.\n" +msgstr "请用 \"%s --help\" 获取更多的信息.\n" -#: pg_ctl.c:2024 +#: pg_ctl.c:2026 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" @@ -528,17 +533,17 @@ msgstr "" "%s 是一个用于初始化、启动、停止或控制PostgreSQL服务器的工具.\n" "\n" -#: pg_ctl.c:2025 +#: pg_ctl.c:2027 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_ctl.c:2026 +#: pg_ctl.c:2028 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D 数据目录] [-s] [-o 选项]\n" -#: pg_ctl.c:2027 +#: pg_ctl.c:2029 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" @@ -547,12 +552,12 @@ msgstr "" " %s start [-D 数据目录] [-l 文件名] [-W] [-t 秒数] [-s]\n" " [-o 选项] [-p 路径] [-c]\n" -#: pg_ctl.c:2029 +#: pg_ctl.c:2031 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr " %s stop [-D 数据目录] [-m SHUTDOWN-MODE] [-W] [-t 秒数] [-s]\n" -#: pg_ctl.c:2030 +#: pg_ctl.c:2032 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" @@ -561,32 +566,32 @@ msgstr "" " %s restart [-D 数据目录] [-m SHUTDOWN-MODE] [-W] [-t 秒数] [-s]\n" " [-o 选项] [-c]\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2034 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D 数据目录] [-s]\n" -#: pg_ctl.c:2033 +#: pg_ctl.c:2035 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D 数据目录]\n" -#: pg_ctl.c:2034 +#: pg_ctl.c:2036 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D 数据目录] [-W] [-t 秒数] [-s]\n" -#: pg_ctl.c:2035 +#: pg_ctl.c:2037 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D 数据目录] [-s]\n" -#: pg_ctl.c:2036 +#: pg_ctl.c:2038 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill 信号名称 进程号\n" -#: pg_ctl.c:2038 +#: pg_ctl.c:2040 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" @@ -595,12 +600,12 @@ msgstr "" " %s register [-D 数据目录] [-N 服务名称] [-U 用户名] [-P 口令]\n" " [-S 启动类型] [-e 源] [-W] [-t 秒数] [-s] [-o 选项]\n" -#: pg_ctl.c:2040 +#: pg_ctl.c:2042 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N 服务名称]\n" -#: pg_ctl.c:2043 +#: pg_ctl.c:2045 #, c-format msgid "" "\n" @@ -609,52 +614,52 @@ msgstr "" "\n" "普通选项:\n" -#: pg_ctl.c:2044 +#: pg_ctl.c:2046 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " -D, --pgdata=数据目录 数据库存储区域的位置\n" -#: pg_ctl.c:2046 +#: pg_ctl.c:2048 #, c-format msgid " -e SOURCE event source for logging when running as a service\n" msgstr " -e SOURCE 当作为一个服务运行时要记录的事件的来源\n" -#: pg_ctl.c:2048 +#: pg_ctl.c:2050 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr " -s, --silent 只打印错误信息, 没有其他信息\n" -#: pg_ctl.c:2049 +#: pg_ctl.c:2051 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr " -t, --timeout=SECS 当使用-w 选项时需要等待的秒数\n" -#: pg_ctl.c:2050 +#: pg_ctl.c:2052 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 输出版本信息, 然后退出\n" -#: pg_ctl.c:2051 +#: pg_ctl.c:2053 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait 等待直到操作完成(默认)\n" -#: pg_ctl.c:2052 +#: pg_ctl.c:2054 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait 不用等待操作完成\n" -#: pg_ctl.c:2053 +#: pg_ctl.c:2055 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 显示此帮助, 然后退出\n" -#: pg_ctl.c:2054 +#: pg_ctl.c:2056 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "如果省略了 -D 选项, 将使用 PGDATA 环境变量.\n" -#: pg_ctl.c:2056 +#: pg_ctl.c:2058 #, c-format msgid "" "\n" @@ -663,22 +668,22 @@ msgstr "" "\n" "启动或重启的选项:\n" -#: pg_ctl.c:2058 +#: pg_ctl.c:2060 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files 允许postgres进程产生核心文件\n" -#: pg_ctl.c:2060 +#: pg_ctl.c:2062 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files 在这种平台上不可用\n" -#: pg_ctl.c:2062 +#: pg_ctl.c:2064 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr " -l, --log=FILENAME 写入 (或追加) 服务器日志到文件FILENAME\n" -#: pg_ctl.c:2063 +#: pg_ctl.c:2065 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" @@ -687,12 +692,12 @@ msgstr "" " -o, --options=OPTIONS 传递给postgres的命令行选项\n" " (PostgreSQL 服务器执行文件)或initdb\n" -#: pg_ctl.c:2065 +#: pg_ctl.c:2067 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p PATH-TO-POSTMASTER 正常情况不必要\n" -#: pg_ctl.c:2066 +#: pg_ctl.c:2068 #, c-format msgid "" "\n" @@ -701,12 +706,12 @@ msgstr "" "\n" "停止或重启的选项:\n" -#: pg_ctl.c:2067 +#: pg_ctl.c:2069 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr " -m, --mode=MODE 可以是 \"smart\", \"fast\", 或者 \"immediate\"\n" -#: pg_ctl.c:2069 +#: pg_ctl.c:2071 #, c-format msgid "" "\n" @@ -715,22 +720,22 @@ msgstr "" "\n" "关闭模式有如下几种:\n" -#: pg_ctl.c:2070 +#: pg_ctl.c:2072 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart 所有客户端断开连接后退出\n" -#: pg_ctl.c:2071 +#: pg_ctl.c:2073 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast 直接退出, 正确的关闭(默认)\n" -#: pg_ctl.c:2072 +#: pg_ctl.c:2074 #, c-format msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" msgstr " immediate 不完全的关闭退出; 重启后恢复\n" -#: pg_ctl.c:2074 +#: pg_ctl.c:2076 #, c-format msgid "" "\n" @@ -739,7 +744,7 @@ msgstr "" "\n" "允许关闭的信号名称:\n" -#: pg_ctl.c:2078 +#: pg_ctl.c:2080 #, c-format msgid "" "\n" @@ -748,27 +753,27 @@ msgstr "" "\n" "注册或注销的选项:\n" -#: pg_ctl.c:2079 +#: pg_ctl.c:2081 #, c-format msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr " -N 服务名称 注册到 PostgreSQL 服务器的服务名称\n" -#: pg_ctl.c:2080 +#: pg_ctl.c:2082 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr " -P 口令 注册到 PostgreSQL 服务器帐户的口令\n" -#: pg_ctl.c:2081 +#: pg_ctl.c:2083 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr " -U 用户名 注册到 PostgreSQL 服务器帐户的用户名\n" -#: pg_ctl.c:2082 +#: pg_ctl.c:2084 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr " -S START-TYPE 注册到PostgreSQL服务器的服务启动类型\n" -#: pg_ctl.c:2084 +#: pg_ctl.c:2086 #, c-format msgid "" "\n" @@ -777,51 +782,56 @@ msgstr "" "\n" "启动类型有:\n" -#: pg_ctl.c:2085 +#: pg_ctl.c:2087 #, c-format msgid " auto start service automatically during system startup (default)\n" msgstr " auto 在系统启动时自动启动服务(默认选项)\n" -#: pg_ctl.c:2086 +#: pg_ctl.c:2088 #, c-format msgid " demand start service on demand\n" msgstr " demand 按需启动服务\n" -#: pg_ctl.c:2089 +#: pg_ctl.c:2091 #, c-format msgid "" "\n" -"Report bugs to .\n" +"Report bugs to <%s>.\n" msgstr "" "\n" -"臭虫报告至 .\n" +"臭虫报告至<%s>.\n" + +#: pg_ctl.c:2092 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 主页: <%s>\n" -#: pg_ctl.c:2114 +#: pg_ctl.c:2117 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: 无效的关闭模式 \"%s\"\n" -#: pg_ctl.c:2143 +#: pg_ctl.c:2146 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: 无效信号名称 \"%s\"\n" -#: pg_ctl.c:2160 +#: pg_ctl.c:2163 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: 无法识别的启动类型 \"%s\"\n" -#: pg_ctl.c:2215 +#: pg_ctl.c:2218 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: 使用命令 \"%s\"无法确定数据目录\n" -#: pg_ctl.c:2240 +#: pg_ctl.c:2242 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: 控制文件似乎已损坏\n" -#: pg_ctl.c:2308 +#: pg_ctl.c:2310 #, c-format msgid "" "%s: cannot be run as root\n" @@ -832,32 +842,33 @@ msgstr "" "请以服务器进程所属用户 (非特权用户) 登录 (或使用 \"su\")\n" "\n" -#: pg_ctl.c:2392 +#: pg_ctl.c:2393 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: -S 选项在该平台上不支持\n" -#: pg_ctl.c:2429 +#: pg_ctl.c:2430 #, c-format msgid "%s: too many command-line arguments (first is \"%s\")\n" msgstr "%s: 命令行参数太多 (第一个是 \"%s\")\n" -#: pg_ctl.c:2455 +#: pg_ctl.c:2456 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: 缺少 kill 模式参数\n" -#: pg_ctl.c:2473 +#: pg_ctl.c:2474 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: 无效的操作模式 \"%s\"\n" -#: pg_ctl.c:2483 +#: pg_ctl.c:2484 #, c-format msgid "%s: no operation specified\n" msgstr "%s: 没有指定操作\n" -#: pg_ctl.c:2504 +#: pg_ctl.c:2505 #, c-format msgid "%s: no database directory specified and environment variable PGDATA unset\n" msgstr "%s: 没有指定数据目录, 并且没有设置 PGDATA 环境变量\n" + diff --git a/src/bin/pg_dump/po/cs.po b/src/bin/pg_dump/po/cs.po index ca7d2b84f1..3319e535c3 100644 --- a/src/bin/pg_dump/po/cs.po +++ b/src/bin/pg_dump/po/cs.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pg_dump-cs (PostgreSQL 9.3)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2020-10-31 16:16+0000\n" -"PO-Revision-Date: 2020-11-01 01:00+0100\n" +"PO-Revision-Date: 2021-09-16 09:14+0200\n" "Last-Translator: Tomas Vondra \n" "Language-Team: Czech \n" "Language: cs\n" @@ -1464,9 +1464,7 @@ msgstr "" #: pg_dump.c:1014 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" -msgstr "" -" -N, --exclude-schema=PATTERN nedumpuj uvedená schéma(ta)\n" -"\n" +msgstr " -N, --exclude-schema=PATTERN nedumpuj uvedená schéma(ta)\n\n" #: pg_dump.c:1015 #, c-format @@ -1542,9 +1540,7 @@ msgstr "" #: pg_dump.c:1028 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" -msgstr "" -" --exclude-table-data=VZOR nedumpuj data pro zadané tabulky\n" -"\n" +msgstr " --exclude-table-data=VZOR nedumpuj data pro zadané tabulky\n\n" #: pg_dump.c:1029 pg_dumpall.c:642 #, c-format @@ -2317,12 +2313,12 @@ msgstr " %s [VOLBA]...\n" #: pg_dumpall.c:621 #, c-format msgid " -f, --file=FILENAME output file name\n" -msgstr " -f, --file=SOUBOR výstupní soubor\n" +msgstr " -f, --file=SOUBOR výstupní soubor\n" #: pg_dumpall.c:628 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" -msgstr " -c, --clean odstranit (drop) databázi před jejím vytvořením\n" +msgstr " -c, --clean odstranit (drop) databázi před jejím vytvořením\n" #: pg_dumpall.c:630 #, c-format @@ -2332,7 +2328,7 @@ msgstr " -g, --globals-only dump pouze globálních objektů, ne databáz #: pg_dumpall.c:631 pg_restore.c:485 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" -msgstr " -O, --no-owner nevypisuje příkazy k nastavení vlastníka objektů\n" +msgstr " -O, --no-owner nevypisuje příkazy k nastavení vlastníka objektů\n" #: pg_dumpall.c:632 #, c-format @@ -2342,7 +2338,7 @@ msgstr " -r, --roles-only dump pouze rolí, ne databází nebo table #: pg_dumpall.c:634 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" -msgstr " -S, --superuser=JMÉNO uživatelské jméno superuživatele použité při dumpu\n" +msgstr " -S, --superuser=JMÉNO uživatelské jméno superuživatele použité při dumpu\n" #: pg_dumpall.c:635 #, c-format @@ -2489,7 +2485,7 @@ msgstr " %s [PŘEPÍNAČ]... [SOUBOR]\n" #: pg_restore.c:466 #, c-format msgid " -d, --dbname=NAME connect to database name\n" -msgstr " -d, --dbname=JMÉNO jméno cílové databáze\n" +msgstr " -d, --dbname=JMÉNO jméno cílové databáze\n" #: pg_restore.c:467 #, c-format @@ -2499,7 +2495,7 @@ msgstr " -f, --file=SOUBOR výstupní soubor (- pro stdout)\n" #: pg_restore.c:468 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" -msgstr " -F, --format=c|d|t formát záložního souboru (měl by být automatický)\n" +msgstr " -F, --format=c|d|t formát záložního souboru (měl by být automatický)\n" #: pg_restore.c:469 #, c-format diff --git a/src/bin/pg_dump/po/de.po b/src/bin/pg_dump/po/de.po index a0fb38612e..0516902818 100644 --- a/src/bin/pg_dump/po/de.po +++ b/src/bin/pg_dump/po/de.po @@ -1,14 +1,14 @@ # German message translation file for pg_dump and friends -# Peter Eisentraut , 2001 - 2021. +# Peter Eisentraut , 2001 - 2022. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-14 08:48+0000\n" -"PO-Revision-Date: 2021-05-14 14:38+0200\n" +"POT-Creation-Date: 2022-05-11 15:49+0000\n" +"PO-Revision-Date: 2022-05-11 22:48+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -17,57 +17,62 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "Fatal: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "Warnung: " -#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "Tipp: " + +#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "konnte aktuelles Verzeichnis nicht ermitteln: %m" -#: ../../common/exec.c:155 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "ungültige Programmdatei »%s«" -#: ../../common/exec.c:205 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "konnte Programmdatei »%s« nicht lesen" -#: ../../common/exec.c:213 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "konnte kein »%s« zum Ausführen finden" -#: ../../common/exec.c:269 ../../common/exec.c:308 +#: ../../common/exec.c:282 ../../common/exec.c:321 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m" -#: ../../common/exec.c:286 +#: ../../common/exec.c:299 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m" -#: ../../common/exec.c:409 parallel.c:1614 +#: ../../common/exec.c:422 parallel.c:1611 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 msgid "out of memory" msgstr "Speicher aufgebraucht" @@ -112,217 +117,234 @@ msgstr "Kindprozess wurde von Signal %d beendet: %s" msgid "child process exited with unrecognized status %d" msgstr "Kindprozess hat mit unbekanntem Status %d beendet" -#: common.c:124 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ungültiger Wert »%s« für Option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s muss im Bereich %d..%d sein" + +#: common.c:134 #, c-format msgid "reading extensions" msgstr "lese Erweiterungen" -#: common.c:128 +#: common.c:137 #, c-format msgid "identifying extension members" msgstr "identifiziere Erweiterungselemente" -#: common.c:131 +#: common.c:140 #, c-format msgid "reading schemas" msgstr "lese Schemas" -#: common.c:141 +#: common.c:149 #, c-format msgid "reading user-defined tables" msgstr "lese benutzerdefinierte Tabellen" -#: common.c:148 +#: common.c:154 #, c-format msgid "reading user-defined functions" msgstr "lese benutzerdefinierte Funktionen" -#: common.c:153 +#: common.c:158 #, c-format msgid "reading user-defined types" msgstr "lese benutzerdefinierte Typen" -#: common.c:158 +#: common.c:162 #, c-format msgid "reading procedural languages" msgstr "lese prozedurale Sprachen" -#: common.c:161 +#: common.c:165 #, c-format msgid "reading user-defined aggregate functions" msgstr "lese benutzerdefinierte Aggregatfunktionen" -#: common.c:164 +#: common.c:168 #, c-format msgid "reading user-defined operators" msgstr "lese benutzerdefinierte Operatoren" -#: common.c:168 +#: common.c:171 #, c-format msgid "reading user-defined access methods" msgstr "lese benutzerdefinierte Zugriffsmethoden" -#: common.c:171 +#: common.c:174 #, c-format msgid "reading user-defined operator classes" msgstr "lese benutzerdefinierte Operatorklassen" -#: common.c:174 +#: common.c:177 #, c-format msgid "reading user-defined operator families" msgstr "lese benutzerdefinierte Operatorfamilien" -#: common.c:177 +#: common.c:180 #, c-format msgid "reading user-defined text search parsers" msgstr "lese benutzerdefinierte Textsuche-Parser" -#: common.c:180 +#: common.c:183 #, c-format msgid "reading user-defined text search templates" msgstr "lese benutzerdefinierte Textsuche-Templates" -#: common.c:183 +#: common.c:186 #, c-format msgid "reading user-defined text search dictionaries" msgstr "lese benutzerdefinierte Textsuchewörterbücher" -#: common.c:186 +#: common.c:189 #, c-format msgid "reading user-defined text search configurations" msgstr "lese benutzerdefinierte Textsuchekonfigurationen" -#: common.c:189 +#: common.c:192 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "lese benutzerdefinierte Fremddaten-Wrapper" -#: common.c:192 +#: common.c:195 #, c-format msgid "reading user-defined foreign servers" msgstr "lese benutzerdefinierte Fremdserver" -#: common.c:195 +#: common.c:198 #, c-format msgid "reading default privileges" msgstr "lese Vorgabeprivilegien" -#: common.c:198 +#: common.c:201 #, c-format msgid "reading user-defined collations" msgstr "lese benutzerdefinierte Sortierfolgen" -#: common.c:202 +#: common.c:204 #, c-format msgid "reading user-defined conversions" msgstr "lese benutzerdefinierte Konversionen" -#: common.c:205 +#: common.c:207 #, c-format msgid "reading type casts" msgstr "lese Typumwandlungen" -#: common.c:208 +#: common.c:210 #, c-format msgid "reading transforms" msgstr "lese Transformationen" -#: common.c:211 +#: common.c:213 #, c-format msgid "reading table inheritance information" msgstr "lese Tabellenvererbungsinformationen" -#: common.c:214 +#: common.c:216 #, c-format msgid "reading event triggers" msgstr "lese Ereignistrigger" -#: common.c:218 +#: common.c:220 #, c-format msgid "finding extension tables" msgstr "finde Erweiterungstabellen" -#: common.c:222 +#: common.c:224 #, c-format msgid "finding inheritance relationships" msgstr "fine Vererbungsbeziehungen" -#: common.c:225 +#: common.c:227 #, c-format msgid "reading column info for interesting tables" msgstr "lese Spalteninfo für interessante Tabellen" -#: common.c:228 +#: common.c:230 #, c-format msgid "flagging inherited columns in subtables" msgstr "markiere vererbte Spalten in abgeleiteten Tabellen" -#: common.c:231 +#: common.c:233 #, c-format msgid "reading indexes" msgstr "lese Indexe" -#: common.c:234 +#: common.c:236 #, c-format msgid "flagging indexes in partitioned tables" msgstr "markiere Indexe in partitionierten Tabellen" -#: common.c:237 +#: common.c:239 #, c-format msgid "reading extended statistics" msgstr "lese erweiterte Statistiken" -#: common.c:240 +#: common.c:242 #, c-format msgid "reading constraints" msgstr "lese Constraints" -#: common.c:243 +#: common.c:245 #, c-format msgid "reading triggers" msgstr "lese Trigger" -#: common.c:246 +#: common.c:248 #, c-format msgid "reading rewrite rules" msgstr "lese Umschreiberegeln" -#: common.c:249 +#: common.c:251 #, c-format msgid "reading policies" msgstr "lese Policies" -#: common.c:252 +#: common.c:254 #, c-format msgid "reading publications" msgstr "lese Publikationen" #: common.c:257 -#, c-format -msgid "reading publication membership" +#, fuzzy, c-format +#| msgid "reading publication membership" +msgid "reading publication membership of tables" msgstr "lese Publikationsmitgliedschaft" #: common.c:260 +#, fuzzy, c-format +#| msgid "reading publication membership" +msgid "reading publication membership of schemas" +msgstr "lese Publikationsmitgliedschaft" + +#: common.c:263 #, c-format msgid "reading subscriptions" msgstr "lese Subskriptionen" -#: common.c:338 +#: common.c:343 #, c-format msgid "invalid number of parents %d for table \"%s\"" msgstr "ungültige Anzahl Eltern %d für Tabelle »%s«" -#: common.c:1100 +#: common.c:1004 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "Sanity-Check fehlgeschlagen, Eltern-OID %u von Tabelle »%s« (OID %u) nicht gefunden" -#: common.c:1142 +#: common.c:1043 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "konnte numerisches Array »%s« nicht parsen: zu viele Zahlen" -#: common.c:1157 +#: common.c:1055 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "konnte numerisches Array »%s« nicht parsen: ungültiges Zeichen in Zahl" @@ -363,43 +385,43 @@ msgstr "konnte Daten nicht dekomprimieren: %s" msgid "could not close compression library: %s" msgstr "konnte Komprimierungsbibliothek nicht schließen: %s" -#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:551 pg_backup_tar.c:554 +#: compress_io.c:584 compress_io.c:621 #, c-format msgid "could not read from input file: %s" msgstr "konnte nicht aus Eingabedatei lesen: %s" -#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:552 -#: pg_backup_tar.c:787 pg_backup_tar.c:810 +#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553 +#: pg_backup_tar.c:726 pg_backup_tar.c:749 #, c-format msgid "could not read from input file: end of file" msgstr "konnte nicht aus Eingabedatei lesen: Dateiende" -#: parallel.c:254 +#: parallel.c:253 #, c-format msgid "%s() failed: error code %d" msgstr "%s() fehlgeschlagen: Fehlercode %d" -#: parallel.c:964 +#: parallel.c:961 #, c-format msgid "could not create communication channels: %m" msgstr "konnte Kommunikationskanäle nicht erzeugen: %m" -#: parallel.c:1021 +#: parallel.c:1018 #, c-format msgid "could not create worker process: %m" msgstr "konnte Arbeitsprozess nicht erzeugen: %m" -#: parallel.c:1151 +#: parallel.c:1148 #, c-format msgid "unrecognized command received from leader: \"%s\"" msgstr "unbekannter Befehl vom Leader-Prozess empfangen: »%s«" -#: parallel.c:1194 parallel.c:1432 +#: parallel.c:1191 parallel.c:1429 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "ungültige Nachricht vom Arbeitsprozess empfangen: »%s«" -#: parallel.c:1326 +#: parallel.c:1323 #, c-format msgid "" "could not obtain lock on relation \"%s\"\n" @@ -408,330 +430,330 @@ msgstr "" "konnte Sperre für Relation »%s« nicht setzen\n" "Das bedeutet meistens, dass jemand eine ACCESS-EXCLUSIVE-Sperre auf die Tabelle gesetzt hat, nachdem der pg-dump-Elternprozess die anfängliche ACCESS-SHARE-Sperre gesetzt hatte." -#: parallel.c:1415 +#: parallel.c:1412 #, c-format msgid "a worker process died unexpectedly" msgstr "ein Arbeitsprozess endete unerwartet" -#: parallel.c:1537 parallel.c:1655 +#: parallel.c:1534 parallel.c:1652 #, c-format msgid "could not write to the communication channel: %m" msgstr "konnte nicht in den Kommunikationskanal schreiben: %m" -#: parallel.c:1739 +#: parallel.c:1736 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: konnte Socket nicht erzeugen: Fehlercode %d" -#: parallel.c:1750 +#: parallel.c:1747 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: konnte nicht binden: Fehlercode %d" -#: parallel.c:1757 +#: parallel.c:1754 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: konnte nicht auf Socket hören: Fehlercode %d" -#: parallel.c:1764 +#: parallel.c:1761 #, c-format msgid "pgpipe: %s() failed: error code %d" msgstr "pgpipe: %s() fehlgeschlagen: Fehlercode %d" -#: parallel.c:1775 +#: parallel.c:1772 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: konnte zweites Socket nicht erzeugen: Fehlercode %d" -#: parallel.c:1784 +#: parallel.c:1781 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: konnte Socket nicht verbinden: Fehlercode %d" -#: parallel.c:1793 +#: parallel.c:1790 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: konnte Verbindung nicht annehmen: Fehlercode %d" -#: pg_backup_archiver.c:278 pg_backup_archiver.c:1577 +#: pg_backup_archiver.c:279 pg_backup_archiver.c:1576 #, c-format msgid "could not close output file: %m" msgstr "konnte Ausgabedatei nicht schließen: %m" -#: pg_backup_archiver.c:322 pg_backup_archiver.c:326 +#: pg_backup_archiver.c:323 pg_backup_archiver.c:327 #, c-format msgid "archive items not in correct section order" msgstr "Archivelemente nicht in richtiger Abschnittsreihenfolge" -#: pg_backup_archiver.c:332 +#: pg_backup_archiver.c:333 #, c-format msgid "unexpected section code %d" msgstr "unerwarteter Abschnittscode %d" -#: pg_backup_archiver.c:369 +#: pg_backup_archiver.c:370 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "parallele Wiederherstellung wird von diesem Archivdateiformat nicht unterstützt" -#: pg_backup_archiver.c:373 +#: pg_backup_archiver.c:374 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "parallele Wiederherstellung wird mit Archiven, die mit pg_dump vor 8.0 erstellt worden sind, nicht unterstützt" -#: pg_backup_archiver.c:391 +#: pg_backup_archiver.c:392 #, c-format msgid "cannot restore from compressed archive (compression not supported in this installation)" msgstr "kann komprimiertes Archiv nicht wiederherstellen (Komprimierung in dieser Installation nicht unterstützt)" -#: pg_backup_archiver.c:408 +#: pg_backup_archiver.c:409 #, c-format msgid "connecting to database for restore" msgstr "verbinde mit der Datenbank zur Wiederherstellung" -#: pg_backup_archiver.c:410 +#: pg_backup_archiver.c:411 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "direkte Datenbankverbindungen sind in Archiven vor Version 1.3 nicht unterstützt" -#: pg_backup_archiver.c:453 +#: pg_backup_archiver.c:454 #, c-format msgid "implied data-only restore" msgstr "implizit werden nur Daten wiederhergestellt" -#: pg_backup_archiver.c:519 +#: pg_backup_archiver.c:520 #, c-format msgid "dropping %s %s" msgstr "entferne %s %s" -#: pg_backup_archiver.c:614 +#: pg_backup_archiver.c:615 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "konnte nicht bestimmen, wo IF EXISTS in die Anweisung »%s« eingefügt werden soll" -#: pg_backup_archiver.c:770 pg_backup_archiver.c:772 +#: pg_backup_archiver.c:771 pg_backup_archiver.c:773 #, c-format msgid "warning from original dump file: %s" msgstr "Warnung aus der ursprünglichen Ausgabedatei: %s" -#: pg_backup_archiver.c:787 +#: pg_backup_archiver.c:788 #, c-format msgid "creating %s \"%s.%s\"" msgstr "erstelle %s »%s.%s«" -#: pg_backup_archiver.c:790 +#: pg_backup_archiver.c:791 #, c-format msgid "creating %s \"%s\"" msgstr "erstelle %s »%s«" -#: pg_backup_archiver.c:840 +#: pg_backup_archiver.c:841 #, c-format msgid "connecting to new database \"%s\"" msgstr "verbinde mit neuer Datenbank »%s«" -#: pg_backup_archiver.c:867 +#: pg_backup_archiver.c:868 #, c-format msgid "processing %s" msgstr "verarbeite %s" -#: pg_backup_archiver.c:887 +#: pg_backup_archiver.c:888 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "verarbeite Daten für Tabelle »%s.%s«" -#: pg_backup_archiver.c:949 +#: pg_backup_archiver.c:947 #, c-format msgid "executing %s %s" msgstr "führe %s %s aus" -#: pg_backup_archiver.c:988 +#: pg_backup_archiver.c:986 #, c-format msgid "disabling triggers for %s" msgstr "schalte Trigger für %s aus" -#: pg_backup_archiver.c:1014 +#: pg_backup_archiver.c:1012 #, c-format msgid "enabling triggers for %s" msgstr "schalte Trigger für %s ein" -#: pg_backup_archiver.c:1042 +#: pg_backup_archiver.c:1040 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "interner Fehler -- WriteData kann nicht außerhalb des Kontexts einer DataDumper-Routine aufgerufen werden" -#: pg_backup_archiver.c:1225 +#: pg_backup_archiver.c:1223 #, c-format msgid "large-object output not supported in chosen format" msgstr "Large-Object-Ausgabe im gewählten Format nicht unterstützt" -#: pg_backup_archiver.c:1283 +#: pg_backup_archiver.c:1281 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "%d Large Object wiederhergestellt" msgstr[1] "%d Large Objects wiederhergestellt" -#: pg_backup_archiver.c:1304 pg_backup_tar.c:730 +#: pg_backup_archiver.c:1302 pg_backup_tar.c:669 #, c-format msgid "restoring large object with OID %u" msgstr "Wiederherstellung von Large Object mit OID %u" -#: pg_backup_archiver.c:1316 +#: pg_backup_archiver.c:1314 #, c-format msgid "could not create large object %u: %s" msgstr "konnte Large Object %u nicht erstellen: %s" -#: pg_backup_archiver.c:1321 pg_dump.c:3693 +#: pg_backup_archiver.c:1319 pg_dump.c:3538 #, c-format msgid "could not open large object %u: %s" msgstr "konnte Large Object %u nicht öffnen: %s" -#: pg_backup_archiver.c:1377 +#: pg_backup_archiver.c:1375 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "konnte Inhaltsverzeichnisdatei »%s« nicht öffnen: %m" -#: pg_backup_archiver.c:1405 +#: pg_backup_archiver.c:1403 #, c-format msgid "line ignored: %s" msgstr "Zeile ignoriert: %s" -#: pg_backup_archiver.c:1412 +#: pg_backup_archiver.c:1410 #, c-format msgid "could not find entry for ID %d" msgstr "konnte Eintrag für ID %d nicht finden" -#: pg_backup_archiver.c:1435 pg_backup_directory.c:222 -#: pg_backup_directory.c:598 +#: pg_backup_archiver.c:1433 pg_backup_directory.c:222 +#: pg_backup_directory.c:599 #, c-format msgid "could not close TOC file: %m" msgstr "konnte Inhaltsverzeichnisdatei nicht schließen: %m" -#: pg_backup_archiver.c:1549 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:585 pg_backup_directory.c:648 -#: pg_backup_directory.c:667 pg_dumpall.c:485 +#: pg_backup_archiver.c:1547 pg_backup_custom.c:156 pg_backup_directory.c:332 +#: pg_backup_directory.c:586 pg_backup_directory.c:649 +#: pg_backup_directory.c:668 pg_dumpall.c:476 #, c-format msgid "could not open output file \"%s\": %m" msgstr "konnte Ausgabedatei »%s« nicht öffnen: %m" -#: pg_backup_archiver.c:1551 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1549 pg_backup_custom.c:162 #, c-format msgid "could not open output file: %m" msgstr "konnte Ausgabedatei nicht öffnen: %m" -#: pg_backup_archiver.c:1644 +#: pg_backup_archiver.c:1643 #, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" msgstr[0] "%zu Byte Large-Object-Daten geschrieben (Ergebnis = %d)" msgstr[1] "%zu Bytes Large-Object-Daten geschrieben (Ergebnis = %d)" -#: pg_backup_archiver.c:1650 +#: pg_backup_archiver.c:1649 #, c-format msgid "could not write to large object: %s" msgstr "konnte Large Object nicht schreiben: %s" -#: pg_backup_archiver.c:1740 +#: pg_backup_archiver.c:1739 #, c-format msgid "while INITIALIZING:" msgstr "in Phase INITIALIZING:" -#: pg_backup_archiver.c:1745 +#: pg_backup_archiver.c:1744 #, c-format msgid "while PROCESSING TOC:" msgstr "in Phase PROCESSING TOC:" -#: pg_backup_archiver.c:1750 +#: pg_backup_archiver.c:1749 #, c-format msgid "while FINALIZING:" msgstr "in Phase FINALIZING:" -#: pg_backup_archiver.c:1755 +#: pg_backup_archiver.c:1754 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "in Inhaltsverzeichniseintrag %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1831 +#: pg_backup_archiver.c:1830 #, c-format msgid "bad dumpId" msgstr "ungültige DumpId" -#: pg_backup_archiver.c:1852 +#: pg_backup_archiver.c:1851 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "ungültige Tabellen-DumpId für »TABLE DATA«-Eintrag" -#: pg_backup_archiver.c:1944 +#: pg_backup_archiver.c:1943 #, c-format msgid "unexpected data offset flag %d" msgstr "unerwartete Datenoffsetmarkierung %d" -#: pg_backup_archiver.c:1957 +#: pg_backup_archiver.c:1956 #, c-format msgid "file offset in dump file is too large" msgstr "Dateioffset in Dumpdatei ist zu groß" -#: pg_backup_archiver.c:2095 pg_backup_archiver.c:2105 +#: pg_backup_archiver.c:2094 pg_backup_archiver.c:2104 #, c-format msgid "directory name too long: \"%s\"" msgstr "Verzeichnisname zu lang: »%s«" -#: pg_backup_archiver.c:2113 +#: pg_backup_archiver.c:2112 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "Verzeichnis »%s« scheint kein gültiges Archiv zu sein (»toc.dat« existiert nicht)" -#: pg_backup_archiver.c:2121 pg_backup_custom.c:173 pg_backup_custom.c:807 -#: pg_backup_directory.c:207 pg_backup_directory.c:394 +#: pg_backup_archiver.c:2120 pg_backup_custom.c:173 pg_backup_custom.c:807 +#: pg_backup_directory.c:207 pg_backup_directory.c:395 #, c-format msgid "could not open input file \"%s\": %m" msgstr "konnte Eingabedatei »%s« nicht öffnen: %m" -#: pg_backup_archiver.c:2128 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2127 pg_backup_custom.c:179 #, c-format msgid "could not open input file: %m" msgstr "konnte Eingabedatei nicht öffnen: %m" -#: pg_backup_archiver.c:2134 +#: pg_backup_archiver.c:2133 #, c-format msgid "could not read input file: %m" msgstr "konnte Eingabedatei nicht lesen: %m" -#: pg_backup_archiver.c:2136 +#: pg_backup_archiver.c:2135 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "Eingabedatei ist zu kurz (gelesen: %lu, erwartet: 5)" -#: pg_backup_archiver.c:2168 +#: pg_backup_archiver.c:2167 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "Eingabedatei ist anscheinend ein Dump im Textformat. Bitte verwenden Sie psql." -#: pg_backup_archiver.c:2174 +#: pg_backup_archiver.c:2173 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "Eingabedatei scheint kein gültiges Archiv zu sein (zu kurz?)" -#: pg_backup_archiver.c:2180 +#: pg_backup_archiver.c:2179 #, c-format msgid "input file does not appear to be a valid archive" msgstr "Eingabedatei scheint kein gültiges Archiv zu sein" -#: pg_backup_archiver.c:2189 +#: pg_backup_archiver.c:2188 #, c-format msgid "could not close input file: %m" msgstr "konnte Eingabedatei nicht schließen: %m" -#: pg_backup_archiver.c:2306 +#: pg_backup_archiver.c:2305 #, c-format msgid "unrecognized file format \"%d\"" msgstr "nicht erkanntes Dateiformat »%d«" -#: pg_backup_archiver.c:2388 pg_backup_archiver.c:4422 +#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4445 #, c-format msgid "finished item %d %s %s" msgstr "Element %d %s %s abgeschlossen" -#: pg_backup_archiver.c:2392 pg_backup_archiver.c:4435 +#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4458 #, c-format msgid "worker process failed: exit code %d" msgstr "Arbeitsprozess fehlgeschlagen: Code %d" @@ -741,147 +763,142 @@ msgstr "Arbeitsprozess fehlgeschlagen: Code %d" msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "ID %d des Eintrags außerhalb des gültigen Bereichs -- vielleicht ein verfälschtes Inhaltsverzeichnis" -#: pg_backup_archiver.c:2579 +#: pg_backup_archiver.c:2592 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "Wiederherstellung von Tabellen mit WITH OIDS wird nicht mehr unterstützt" -#: pg_backup_archiver.c:2663 +#: pg_backup_archiver.c:2674 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "nicht erkannte Kodierung »%s«" -#: pg_backup_archiver.c:2668 +#: pg_backup_archiver.c:2679 #, c-format msgid "invalid ENCODING item: %s" msgstr "ungültiger ENCODING-Eintrag: %s" -#: pg_backup_archiver.c:2686 +#: pg_backup_archiver.c:2697 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "ungültiger STDSTRINGS-Eintrag: %s" -#: pg_backup_archiver.c:2717 -#, c-format -msgid "invalid TOASTCOMPRESSION item: %s" -msgstr "ungültiger TOASTCOMPRESSION-Eintrag: %s" - -#: pg_backup_archiver.c:2734 +#: pg_backup_archiver.c:2722 #, c-format msgid "schema \"%s\" not found" msgstr "Schema »%s« nicht gefunden" -#: pg_backup_archiver.c:2741 +#: pg_backup_archiver.c:2729 #, c-format msgid "table \"%s\" not found" msgstr "Tabelle »%s« nicht gefunden" -#: pg_backup_archiver.c:2748 +#: pg_backup_archiver.c:2736 #, c-format msgid "index \"%s\" not found" msgstr "Index »%s« nicht gefunden" -#: pg_backup_archiver.c:2755 +#: pg_backup_archiver.c:2743 #, c-format msgid "function \"%s\" not found" msgstr "Funktion »%s« nicht gefunden" -#: pg_backup_archiver.c:2762 +#: pg_backup_archiver.c:2750 #, c-format msgid "trigger \"%s\" not found" msgstr "Trigger »%s« nicht gefunden" -#: pg_backup_archiver.c:3160 +#: pg_backup_archiver.c:3143 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "konnte Sitzungsbenutzer nicht auf »%s« setzen: %s" -#: pg_backup_archiver.c:3292 +#: pg_backup_archiver.c:3280 #, c-format msgid "could not set search_path to \"%s\": %s" msgstr "konnte search_path nicht auf »%s« setzen: %s" -#: pg_backup_archiver.c:3354 +#: pg_backup_archiver.c:3342 #, c-format msgid "could not set default_tablespace to %s: %s" msgstr "konnte default_tablespace nicht auf »%s« setzen: %s" -#: pg_backup_archiver.c:3399 +#: pg_backup_archiver.c:3392 #, c-format msgid "could not set default_table_access_method: %s" msgstr "konnte default_table_access_method nicht setzen: %s" -#: pg_backup_archiver.c:3491 pg_backup_archiver.c:3649 +#: pg_backup_archiver.c:3486 pg_backup_archiver.c:3651 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "kann Eigentümer für Objekttyp »%s« nicht setzen" -#: pg_backup_archiver.c:3753 +#: pg_backup_archiver.c:3754 #, c-format msgid "did not find magic string in file header" msgstr "magische Zeichenkette im Dateikopf nicht gefunden" -#: pg_backup_archiver.c:3767 +#: pg_backup_archiver.c:3768 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "nicht unterstützte Version (%d.%d) im Dateikopf" -#: pg_backup_archiver.c:3772 +#: pg_backup_archiver.c:3773 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "Prüfung der Integer-Größe (%lu) fehlgeschlagen" -#: pg_backup_archiver.c:3776 +#: pg_backup_archiver.c:3777 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "Archiv wurde auf einer Maschine mit größeren Integers erstellt; einige Operationen könnten fehlschlagen" -#: pg_backup_archiver.c:3786 +#: pg_backup_archiver.c:3787 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "erwartetes Format (%d) ist nicht das gleiche wie das in der Datei gefundene (%d)" -#: pg_backup_archiver.c:3801 +#: pg_backup_archiver.c:3802 #, c-format msgid "archive is compressed, but this installation does not support compression -- no data will be available" msgstr "Archiv ist komprimiert, aber diese Installation unterstützt keine Komprimierung -- keine Daten verfügbar" -#: pg_backup_archiver.c:3819 +#: pg_backup_archiver.c:3836 #, c-format msgid "invalid creation date in header" msgstr "ungültiges Erstellungsdatum im Kopf" -#: pg_backup_archiver.c:3947 +#: pg_backup_archiver.c:3970 #, c-format msgid "processing item %d %s %s" msgstr "verarbeite Element %d %s %s" -#: pg_backup_archiver.c:4026 +#: pg_backup_archiver.c:4049 #, c-format msgid "entering main parallel loop" msgstr "Eintritt in Hauptparallelschleife" -#: pg_backup_archiver.c:4037 +#: pg_backup_archiver.c:4060 #, c-format msgid "skipping item %d %s %s" msgstr "Element %d %s %s wird übersprungen" -#: pg_backup_archiver.c:4046 +#: pg_backup_archiver.c:4069 #, c-format msgid "launching item %d %s %s" msgstr "starte Element %d %s %s" -#: pg_backup_archiver.c:4100 +#: pg_backup_archiver.c:4123 #, c-format msgid "finished main parallel loop" msgstr "Hauptparallelschleife beendet" -#: pg_backup_archiver.c:4136 +#: pg_backup_archiver.c:4159 #, c-format msgid "processing missed item %d %s %s" msgstr "verarbeite verpasstes Element %d %s %s" -#: pg_backup_archiver.c:4741 +#: pg_backup_archiver.c:4764 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "Tabelle »%s« konnte nicht erzeugt werden, ihre Daten werden nicht wiederhergestellt werden" @@ -892,7 +909,7 @@ msgid "invalid OID for large object" msgstr "ungültige OID für Large Object" #: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629 -#: pg_backup_custom.c:865 pg_backup_tar.c:1080 pg_backup_tar.c:1085 +#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021 #, c-format msgid "error during file seek: %m" msgstr "Fehler beim Suchen in Datei: %m" @@ -933,7 +950,7 @@ msgid "could not read from input file: %m" msgstr "konnte nicht aus Eingabedatei lesen: %m" #: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943 -#: pg_backup_tar.c:1083 +#: pg_backup_tar.c:1019 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "konnte Positionszeiger in Archivdatei nicht ermitteln: %m" @@ -973,91 +990,91 @@ msgstr "Kompressor ist aktiv" msgid "could not get server_version from libpq" msgstr "konnte server_version nicht von libpq ermitteln" -#: pg_backup_db.c:53 pg_dumpall.c:1821 -#, c-format -msgid "server version: %s; %s version: %s" -msgstr "Version des Servers: %s; Version von %s: %s" - -#: pg_backup_db.c:55 pg_dumpall.c:1823 +#: pg_backup_db.c:53 pg_dumpall.c:1646 #, c-format msgid "aborting because of server version mismatch" msgstr "Abbruch wegen unpassender Serverversion" -#: pg_backup_db.c:124 +#: pg_backup_db.c:54 pg_dumpall.c:1647 +#, c-format +msgid "server version: %s; %s version: %s" +msgstr "Version des Servers: %s; Version von %s: %s" + +#: pg_backup_db.c:120 #, c-format msgid "already connected to a database" msgstr "bereits mit einer Datenbank verbunden" -#: pg_backup_db.c:132 pg_backup_db.c:182 pg_dumpall.c:1650 pg_dumpall.c:1761 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595 msgid "Password: " msgstr "Passwort: " -#: pg_backup_db.c:174 +#: pg_backup_db.c:170 #, c-format msgid "could not connect to database" msgstr "konnte nicht mit der Datenbank verbinden" -#: pg_backup_db.c:191 +#: pg_backup_db.c:187 #, c-format msgid "reconnection failed: %s" msgstr "Wiederverbindung fehlgeschlagen: %s" -#: pg_backup_db.c:194 pg_backup_db.c:269 pg_dumpall.c:1681 pg_dumpall.c:1771 +#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dumpall.c:1520 pg_dumpall.c:1604 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:276 pg_dumpall.c:1884 pg_dumpall.c:1907 +#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732 #, c-format msgid "query failed: %s" msgstr "Anfrage fehlgeschlagen: %s" -#: pg_backup_db.c:278 pg_dumpall.c:1885 pg_dumpall.c:1908 +#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733 #, c-format -msgid "query was: %s" +msgid "Query was: %s" msgstr "Anfrage war: %s" -#: pg_backup_db.c:319 +#: pg_backup_db.c:316 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" msgstr[0] "Anfrage ergab %d Zeile anstatt einer: %s" msgstr[1] "Anfrage ergab %d Zeilen anstatt einer: %s" -#: pg_backup_db.c:355 +#: pg_backup_db.c:352 #, c-format msgid "%s: %sCommand was: %s" msgstr "%s: %sDie Anweisung war: %s" -#: pg_backup_db.c:411 pg_backup_db.c:485 pg_backup_db.c:492 +#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489 msgid "could not execute query" msgstr "konnte Anfrage nicht ausführen" -#: pg_backup_db.c:464 +#: pg_backup_db.c:461 #, c-format msgid "error returned by PQputCopyData: %s" msgstr "Fehler in PQputCopyData: %s" -#: pg_backup_db.c:513 +#: pg_backup_db.c:510 #, c-format msgid "error returned by PQputCopyEnd: %s" msgstr "Fehler in PQputCopyEnd: %s" -#: pg_backup_db.c:519 +#: pg_backup_db.c:516 #, c-format msgid "COPY failed for table \"%s\": %s" msgstr "COPY fehlgeschlagen für Tabelle »%s«: %s" -#: pg_backup_db.c:525 pg_dump.c:2077 +#: pg_backup_db.c:522 pg_dump.c:2105 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "unerwartete zusätzliche Ergebnisse während COPY von Tabelle »%s«" -#: pg_backup_db.c:537 +#: pg_backup_db.c:534 msgid "could not start database transaction" msgstr "konnte Datenbanktransaktion nicht starten" -#: pg_backup_db.c:545 +#: pg_backup_db.c:542 msgid "could not commit database transaction" msgstr "konnte Datenbanktransaktion nicht beenden" @@ -1081,43 +1098,58 @@ msgstr "konnte Verzeichnis »%s« nicht schließen: %m" msgid "could not create directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" -#: pg_backup_directory.c:355 pg_backup_directory.c:496 -#: pg_backup_directory.c:532 +#: pg_backup_directory.c:355 pg_backup_directory.c:497 +#: pg_backup_directory.c:533 #, c-format msgid "could not write to output file: %s" msgstr "konnte nicht in Ausgabedatei schreiben: %s" -#: pg_backup_directory.c:406 +#: pg_backup_directory.c:373 +#, c-format +msgid "could not close data file: %m" +msgstr "konnte Datendatei nicht schließen: %m" + +#: pg_backup_directory.c:407 #, c-format msgid "could not close data file \"%s\": %m" msgstr "konnte Datendatei »%s« nicht schließen: %m" -#: pg_backup_directory.c:446 +#: pg_backup_directory.c:447 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "konnte Large-Object-Inhaltsverzeichnisdatei »%s« nicht zur Eingabe öffnen: %m" -#: pg_backup_directory.c:457 +#: pg_backup_directory.c:458 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "ungültige Zeile in Large-Object-Inhaltsverzeichnisdatei »%s«: %s" -#: pg_backup_directory.c:466 +#: pg_backup_directory.c:467 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "Fehler beim Lesen von Large-Object-Inhaltsverzeichnisdatei »%s«" -#: pg_backup_directory.c:470 +#: pg_backup_directory.c:471 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "konnte Large-Object-Inhaltsverzeichnisdatei »%s« nicht schließen: %m" -#: pg_backup_directory.c:689 +#: pg_backup_directory.c:685 +#, c-format +msgid "could not close blob data file: %m" +msgstr "konnte BLOB-Datendatei nicht schließen: %m" + +#: pg_backup_directory.c:691 #, c-format msgid "could not write to blobs TOC file" msgstr "konnte nicht in Blobs-Inhaltsverzeichnisdatei schreiben" -#: pg_backup_directory.c:721 +#: pg_backup_directory.c:705 +#, c-format +msgid "could not close blobs TOC file: %m" +msgstr "konnte BLOB-Inhaltsverzeichnisdatei nicht schließen: %m" + +#: pg_backup_directory.c:724 #, c-format msgid "file name too long: \"%s\"" msgstr "Dateiname zu lang: »%s«" @@ -1127,132 +1159,108 @@ msgstr "Dateiname zu lang: »%s«" msgid "this format cannot be read" msgstr "dieses Format kann nicht gelesen werden" -#: pg_backup_tar.c:177 +#: pg_backup_tar.c:172 #, c-format msgid "could not open TOC file \"%s\" for output: %m" msgstr "konnte Inhaltsverzeichnisdatei »%s« nicht zur Ausgabe öffnen: %m" -#: pg_backup_tar.c:184 +#: pg_backup_tar.c:179 #, c-format msgid "could not open TOC file for output: %m" msgstr "konnte Inhaltsverzeichnisdatei nicht zur Ausgabe öffnen: %m" -#: pg_backup_tar.c:203 pg_backup_tar.c:352 +#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389 +#: pg_backup_tar.c:405 pg_backup_tar.c:893 #, c-format msgid "compression is not supported by tar archive format" msgstr "Komprimierung ist im Tar-Format nicht unterstützt" -#: pg_backup_tar.c:211 +#: pg_backup_tar.c:206 #, c-format msgid "could not open TOC file \"%s\" for input: %m" msgstr "konnte Inhaltsverzeichnisdatei »%s« nicht zur Eingabe öffnen: %m" -#: pg_backup_tar.c:218 +#: pg_backup_tar.c:213 #, c-format msgid "could not open TOC file for input: %m" msgstr "konnte Inhaltsverzeichnisdatei nicht zur Eingabe öffnen: %m" -#: pg_backup_tar.c:338 +#: pg_backup_tar.c:322 #, c-format msgid "could not find file \"%s\" in archive" msgstr "konnte Datei »%s« nicht im Archiv finden" -#: pg_backup_tar.c:404 +#: pg_backup_tar.c:382 #, c-format msgid "could not generate temporary file name: %m" msgstr "konnte keine temporären Dateinamen erzeugen: %m" -#: pg_backup_tar.c:415 -#, c-format -msgid "could not open temporary file" -msgstr "konnte temporäre Datei nicht öffnen" - -#: pg_backup_tar.c:442 -#, c-format -msgid "could not close tar member" -msgstr "konnte Tar-Mitglied nicht schließen" - -#: pg_backup_tar.c:685 +#: pg_backup_tar.c:624 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "unerwartete Syntax der COPY-Anweisung: »%s«" -#: pg_backup_tar.c:952 +#: pg_backup_tar.c:890 #, c-format msgid "invalid OID for large object (%u)" msgstr "Large Object hat ungültige OID (%u)" -#: pg_backup_tar.c:1099 +#: pg_backup_tar.c:1035 #, c-format msgid "could not close temporary file: %m" msgstr "konnte temporäre Datei nicht schließen: %m" -#: pg_backup_tar.c:1108 +#: pg_backup_tar.c:1038 #, c-format -msgid "actual file length (%s) does not match expected (%s)" -msgstr "tatsächliche Dateilänge (%s) stimmt nicht mit erwarteter Länge (%s) überein" +msgid "actual file length (%lld) does not match expected (%lld)" +msgstr "tatsächliche Dateilänge (%lld) stimmt nicht mit erwarteter Länge (%lld) überein" -#: pg_backup_tar.c:1165 pg_backup_tar.c:1196 +#: pg_backup_tar.c:1084 pg_backup_tar.c:1115 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "konnte Kopf für Datei »%s« im Tar-Archiv nicht finden" -#: pg_backup_tar.c:1183 +#: pg_backup_tar.c:1102 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "Ausgabe der Daten in anderer Reihenfolge wird in diesem Archivformat nicht unterstützt: »%s« wird benötigt, aber es kommt vor »%s« in der Archivdatei." -#: pg_backup_tar.c:1230 +#: pg_backup_tar.c:1149 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "unvollständiger Tar-Dateikopf gefunden (%lu Byte)" msgstr[1] "unvollständiger Tar-Dateikopf gefunden (%lu Bytes)" -#: pg_backup_tar.c:1281 +#: pg_backup_tar.c:1188 #, c-format -msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s" -msgstr "beschädigter Tar-Kopf in %s gefunden (%d erwartet, %d berechnet), Dateiposition %s" +msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" +msgstr "beschädigter Tar-Kopf in %s gefunden (%d erwartet, %d berechnet), Dateiposition %llu" #: pg_backup_utils.c:54 #, c-format msgid "unrecognized section name: \"%s\"" msgstr "unbekannter Abschnittsname: »%s«" -#: pg_backup_utils.c:55 pg_dump.c:623 pg_dump.c:640 pg_dumpall.c:339 -#: pg_dumpall.c:349 pg_dumpall.c:358 pg_dumpall.c:367 pg_dumpall.c:375 -#: pg_dumpall.c:389 pg_dumpall.c:465 pg_restore.c:284 pg_restore.c:300 -#: pg_restore.c:318 +#: pg_backup_utils.c:55 pg_dump.c:627 pg_dump.c:644 pg_dumpall.c:340 +#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373 +#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307 +#: pg_restore.c:321 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_backup_utils.c:68 +#: pg_backup_utils.c:66 #, c-format msgid "out of on_exit_nicely slots" msgstr "on_exit_nicely-Slots aufgebraucht" -#: pg_dump.c:549 -#, c-format -msgid "compression level must be in range 0..9" -msgstr "Komprimierungsniveau muss im Bereich 0..9 sein" - -#: pg_dump.c:587 -#, c-format -msgid "extra_float_digits must be in range -15..3" -msgstr "extra_float_digits muss im Bereich -15..3 sein" - -#: pg_dump.c:610 -#, c-format -msgid "rows-per-insert must be in range %d..%d" -msgstr "Zeilen-pro-Insert muss im Bereich %d..%d sein" - -#: pg_dump.c:638 pg_dumpall.c:347 pg_restore.c:298 +#: pg_dump.c:642 pg_dumpall.c:348 pg_restore.c:305 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_dump.c:659 pg_restore.c:327 +#: pg_dump.c:661 pg_restore.c:328 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "Optionen -s/--schema-only und -a/--data-only können nicht zusammen verwendet werden" @@ -1267,73 +1275,52 @@ msgstr "Optionen -s/--schema-only und --include-foreign-data können nicht zusam msgid "option --include-foreign-data is not supported with parallel backup" msgstr "Option --include-foreign-data wird nicht mit paralleler Sicherung unterstützt" -#: pg_dump.c:671 pg_restore.c:333 +#: pg_dump.c:670 pg_restore.c:331 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "Optionen -c/--clean und -a/--data-only können nicht zusammen verwendet werden" -#: pg_dump.c:676 pg_dumpall.c:382 pg_restore.c:382 +#: pg_dump.c:673 pg_dumpall.c:378 pg_restore.c:356 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "Option --if-exists benötigt Option -c/--clean" -#: pg_dump.c:683 +#: pg_dump.c:680 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "Option --on-conflict-do-nothing benötigt Option --inserts, --rows-per-insert oder --column-inserts" -#: pg_dump.c:705 +#: pg_dump.c:702 #, c-format msgid "requested compression not available in this installation -- archive will be uncompressed" msgstr "Komprimierung ist in dieser Installation nicht verfügbar -- Archiv wird nicht komprimiert" -#: pg_dump.c:726 pg_restore.c:349 -#, c-format -msgid "invalid number of parallel jobs" -msgstr "ungültige Anzahl paralleler Jobs" - -#: pg_dump.c:730 +#: pg_dump.c:715 #, c-format msgid "parallel backup only supported by the directory format" msgstr "parallele Sicherung wird nur vom Ausgabeformat »Verzeichnis« unterstützt" -#: pg_dump.c:785 -#, c-format -msgid "" -"Synchronized snapshots are not supported by this server version.\n" -"Run with --no-synchronized-snapshots instead if you do not need\n" -"synchronized snapshots." -msgstr "" -"Synchronisierte Snapshots werden von dieser Serverversion nicht unterstützt.\n" -"Verwenden Sie --no-synchronized-snapshots, wenn Sie keine synchronisierten\n" -"Snapshots benötigen." - -#: pg_dump.c:791 -#, c-format -msgid "Exported snapshots are not supported by this server version." -msgstr "Exportierte Snapshots werden in dieser Serverversion nicht unterstützt." - -#: pg_dump.c:803 +#: pg_dump.c:761 #, c-format msgid "last built-in OID is %u" msgstr "letzte eingebaute OID ist %u" -#: pg_dump.c:812 +#: pg_dump.c:770 #, c-format msgid "no matching schemas were found" msgstr "keine passenden Schemas gefunden" -#: pg_dump.c:826 +#: pg_dump.c:784 #, c-format msgid "no matching tables were found" msgstr "keine passenden Tabellen gefunden" -#: pg_dump.c:848 +#: pg_dump.c:806 #, c-format msgid "no matching extensions were found" msgstr "keine passenden Erweiterungen gefunden" -#: pg_dump.c:1020 +#: pg_dump.c:989 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1342,17 +1329,17 @@ msgstr "" "%s gibt eine Datenbank als Textdatei oder in anderen Formaten aus.\n" "\n" -#: pg_dump.c:1021 pg_dumpall.c:618 pg_restore.c:462 +#: pg_dump.c:990 pg_dumpall.c:605 pg_restore.c:433 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_dump.c:1022 +#: pg_dump.c:991 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: pg_dump.c:1024 pg_dumpall.c:621 pg_restore.c:465 +#: pg_dump.c:993 pg_dumpall.c:608 pg_restore.c:436 #, c-format msgid "" "\n" @@ -1361,12 +1348,12 @@ msgstr "" "\n" "Allgemeine Optionen:\n" -#: pg_dump.c:1025 +#: pg_dump.c:994 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=DATEINAME Name der Ausgabedatei oder des -verzeichnisses\n" -#: pg_dump.c:1026 +#: pg_dump.c:995 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1375,44 +1362,44 @@ msgstr "" " -F, --format=c|d|t|p Ausgabeformat (custom, d=Verzeichnis, tar,\n" " plain text)\n" -#: pg_dump.c:1028 +#: pg_dump.c:997 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM so viele parallele Jobs zur Sicherung verwenden\n" -#: pg_dump.c:1029 pg_dumpall.c:623 +#: pg_dump.c:998 pg_dumpall.c:610 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose »Verbose«-Modus\n" -#: pg_dump.c:1030 pg_dumpall.c:624 +#: pg_dump.c:999 pg_dumpall.c:611 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_dump.c:1031 +#: pg_dump.c:1000 #, c-format msgid " -Z, --compress=0-9 compression level for compressed formats\n" msgstr " -Z, --compress=0-9 Komprimierungsniveau für komprimierte Formate\n" -#: pg_dump.c:1032 pg_dumpall.c:625 +#: pg_dump.c:1001 pg_dumpall.c:612 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr " --lock-wait-timeout=ZEIT Abbruch nach ZEIT Warten auf Tabellensperre\n" -#: pg_dump.c:1033 pg_dumpall.c:652 +#: pg_dump.c:1002 pg_dumpall.c:639 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr "" -" --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n" -" geschrieben sind\n" +" --no-sync nicht warten, bis Änderungen sicher auf\n" +" Festplatte geschrieben sind\n" -#: pg_dump.c:1034 pg_dumpall.c:626 +#: pg_dump.c:1003 pg_dumpall.c:613 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_dump.c:1036 pg_dumpall.c:627 +#: pg_dump.c:1005 pg_dumpall.c:614 #, c-format msgid "" "\n" @@ -1421,54 +1408,54 @@ msgstr "" "\n" "Optionen die den Inhalt der Ausgabe kontrollieren:\n" -#: pg_dump.c:1037 pg_dumpall.c:628 +#: pg_dump.c:1006 pg_dumpall.c:615 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only nur Daten ausgeben, nicht das Schema\n" -#: pg_dump.c:1038 +#: pg_dump.c:1007 #, c-format msgid " -b, --blobs include large objects in dump\n" msgstr " -b, --blobs Large Objects mit ausgeben\n" -#: pg_dump.c:1039 +#: pg_dump.c:1008 #, c-format msgid " -B, --no-blobs exclude large objects in dump\n" msgstr " -B, --no-blobs Large Objects nicht mit ausgeben\n" -#: pg_dump.c:1040 pg_restore.c:476 +#: pg_dump.c:1009 pg_restore.c:447 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr " -c, --clean Datenbankobjekte vor der Wiedererstellung löschen\n" -#: pg_dump.c:1041 +#: pg_dump.c:1010 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr "" " -C, --create Anweisungen zum Erstellen der Datenbank in\n" " Ausgabe einfügen\n" -#: pg_dump.c:1042 +#: pg_dump.c:1011 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" msgstr " -e, --extension=MUSTER nur die angegebene(n) Erweiterung(en) ausgeben\n" -#: pg_dump.c:1043 pg_dumpall.c:630 +#: pg_dump.c:1012 pg_dumpall.c:617 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=KODIERUNG Daten in Kodierung KODIERUNG ausgeben\n" -#: pg_dump.c:1044 +#: pg_dump.c:1013 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=MUSTER nur das/die angegebene(n) Schema(s) ausgeben\n" -#: pg_dump.c:1045 +#: pg_dump.c:1014 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=MUSTER das/die angegebene(n) Schema(s) NICHT ausgeben\n" -#: pg_dump.c:1046 +#: pg_dump.c:1015 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1477,58 +1464,58 @@ msgstr "" " -O, --no-owner Wiederherstellung der Objekteigentümerschaft im\n" " »plain text«-Format auslassen\n" -#: pg_dump.c:1048 pg_dumpall.c:634 +#: pg_dump.c:1017 pg_dumpall.c:621 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only nur das Schema, nicht die Daten, ausgeben\n" -#: pg_dump.c:1049 +#: pg_dump.c:1018 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr " -S, --superuser=NAME Superusername für »plain text«-Format\n" -#: pg_dump.c:1050 +#: pg_dump.c:1019 #, c-format msgid " -t, --table=PATTERN dump the specified table(s) only\n" msgstr " -t, --table=MUSTER nur die angegebene(n) Tabelle(n) ausgeben\n" -#: pg_dump.c:1051 +#: pg_dump.c:1020 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=MUSTER die angegebene(n) Tabelle(n) NICHT ausgeben\n" -#: pg_dump.c:1052 pg_dumpall.c:637 +#: pg_dump.c:1021 pg_dumpall.c:624 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges Zugriffsprivilegien (grant/revoke) nicht ausgeben\n" -#: pg_dump.c:1053 pg_dumpall.c:638 +#: pg_dump.c:1022 pg_dumpall.c:625 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade wird nur von Upgrade-Programmen verwendet\n" -#: pg_dump.c:1054 pg_dumpall.c:639 +#: pg_dump.c:1023 pg_dumpall.c:626 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr "" " --column-inserts Daten als INSERT-Anweisungen mit Spaltennamen\n" " ausgeben\n" -#: pg_dump.c:1055 pg_dumpall.c:640 +#: pg_dump.c:1024 pg_dumpall.c:627 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr "" " --disable-dollar-quoting Dollar-Quoting abschalten, normales SQL-Quoting\n" " verwenden\n" -#: pg_dump.c:1056 pg_dumpall.c:641 pg_restore.c:493 +#: pg_dump.c:1025 pg_dumpall.c:628 pg_restore.c:464 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr "" " --disable-triggers Trigger während der Datenwiederherstellung\n" " abschalten\n" -#: pg_dump.c:1057 +#: pg_dump.c:1026 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" @@ -1537,22 +1524,22 @@ msgstr "" " --enable-row-security Sicherheit auf Zeilenebene einschalten (nur Daten\n" " ausgeben, auf die der Benutzer Zugriff hat)\n" -#: pg_dump.c:1059 +#: pg_dump.c:1028 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=MUSTER Daten der angegebenen Tabelle(n) NICHT ausgeben\n" -#: pg_dump.c:1060 pg_dumpall.c:643 +#: pg_dump.c:1029 pg_dumpall.c:630 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr " --extra-float-digits=ZAHL Einstellung für extra_float_digits\n" -#: pg_dump.c:1061 pg_dumpall.c:644 pg_restore.c:495 +#: pg_dump.c:1030 pg_dumpall.c:631 pg_restore.c:466 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists IF EXISTS verwenden, wenn Objekte gelöscht werden\n" -#: pg_dump.c:1062 +#: pg_dump.c:1031 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1563,93 +1550,92 @@ msgstr "" " Daten von Fremdtabellen auf Fremdservern, die\n" " mit MUSTER übereinstimmen, mit sichern\n" -#: pg_dump.c:1065 pg_dumpall.c:645 +#: pg_dump.c:1034 pg_dumpall.c:632 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr " --inserts Daten als INSERT-Anweisungen statt COPY ausgeben\n" -#: pg_dump.c:1066 pg_dumpall.c:646 +#: pg_dump.c:1035 pg_dumpall.c:633 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root Partitionen über die Wurzeltabelle laden\n" -#: pg_dump.c:1067 pg_dumpall.c:647 +#: pg_dump.c:1036 pg_dumpall.c:634 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments Kommentare nicht ausgeben\n" -#: pg_dump.c:1068 pg_dumpall.c:648 +#: pg_dump.c:1037 pg_dumpall.c:635 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications Publikationen nicht ausgeben\n" -#: pg_dump.c:1069 pg_dumpall.c:650 +#: pg_dump.c:1038 pg_dumpall.c:637 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr " --no-security-labels Security-Label-Zuweisungen nicht ausgeben\n" -#: pg_dump.c:1070 pg_dumpall.c:651 +#: pg_dump.c:1039 pg_dumpall.c:638 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions Subskriptionen nicht ausgeben\n" -#: pg_dump.c:1071 -#, c-format -msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n" -msgstr "" -" --no-synchronized-snapshots keine synchronisierten Snapshots in parallelen\n" -" Jobs verwenden\n" +#: pg_dump.c:1040 pg_dumpall.c:640 +#, fuzzy, c-format +#| msgid " --no-tablespaces do not dump tablespace assignments\n" +msgid " --no-table-access-method do not dump table access methods\n" +msgstr " --no-tablespaces Tablespace-Zuordnungen nicht ausgeben\n" -#: pg_dump.c:1072 pg_dumpall.c:653 +#: pg_dump.c:1041 pg_dumpall.c:641 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces Tablespace-Zuordnungen nicht ausgeben\n" -#: pg_dump.c:1073 +#: pg_dump.c:1042 pg_dumpall.c:642 #, c-format msgid " --no-toast-compression do not dump TOAST compression methods\n" msgstr " --no-toast-compression TOAST-Komprimierungsmethoden nicht ausgeben\n" -#: pg_dump.c:1074 pg_dumpall.c:654 +#: pg_dump.c:1043 pg_dumpall.c:643 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data Daten in ungeloggten Tabellen nicht ausgeben\n" -#: pg_dump.c:1075 pg_dumpall.c:655 +#: pg_dump.c:1044 pg_dumpall.c:644 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" msgstr " --on-conflict-do-nothing INSERT-Befehle mit ON CONFLICT DO NOTHING ausgeben\n" -#: pg_dump.c:1076 pg_dumpall.c:656 +#: pg_dump.c:1045 pg_dumpall.c:645 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr "" " --quote-all-identifiers alle Bezeichner in Anführungszeichen, selbst wenn\n" " kein Schlüsselwort\n" -#: pg_dump.c:1077 pg_dumpall.c:657 +#: pg_dump.c:1046 pg_dumpall.c:646 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=ANZAHL Anzahl Zeilen pro INSERT; impliziert --inserts\n" -#: pg_dump.c:1078 +#: pg_dump.c:1047 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr "" " --section=ABSCHNITT angegebenen Abschnitt ausgeben (pre-data, data\n" " oder post-data)\n" -#: pg_dump.c:1079 +#: pg_dump.c:1048 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr " --serializable-deferrable warten bis der Dump ohne Anomalien laufen kann\n" -#: pg_dump.c:1080 +#: pg_dump.c:1049 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT angegebenen Snapshot für den Dump verwenden\n" -#: pg_dump.c:1081 pg_restore.c:504 +#: pg_dump.c:1050 pg_restore.c:476 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" @@ -1658,7 +1644,7 @@ msgstr "" " --strict-names Tabellen- oder Schemamuster müssen auf mindestens\n" " je ein Objekt passen\n" -#: pg_dump.c:1083 pg_dumpall.c:658 pg_restore.c:506 +#: pg_dump.c:1052 pg_dumpall.c:647 pg_restore.c:478 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1670,7 +1656,7 @@ msgstr "" " OWNER Befehle verwenden, um Eigentümerschaft zu\n" " setzen\n" -#: pg_dump.c:1087 pg_dumpall.c:662 pg_restore.c:510 +#: pg_dump.c:1056 pg_dumpall.c:651 pg_restore.c:482 #, c-format msgid "" "\n" @@ -1679,42 +1665,42 @@ msgstr "" "\n" "Verbindungsoptionen:\n" -#: pg_dump.c:1088 +#: pg_dump.c:1057 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAME auszugebende Datenbank\n" -#: pg_dump.c:1089 pg_dumpall.c:664 pg_restore.c:511 +#: pg_dump.c:1058 pg_dumpall.c:653 pg_restore.c:483 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: pg_dump.c:1090 pg_dumpall.c:666 pg_restore.c:512 +#: pg_dump.c:1059 pg_dumpall.c:655 pg_restore.c:484 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT Portnummer des Datenbankservers\n" -#: pg_dump.c:1091 pg_dumpall.c:667 pg_restore.c:513 +#: pg_dump.c:1060 pg_dumpall.c:656 pg_restore.c:485 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: pg_dump.c:1092 pg_dumpall.c:668 pg_restore.c:514 +#: pg_dump.c:1061 pg_dumpall.c:657 pg_restore.c:486 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: pg_dump.c:1093 pg_dumpall.c:669 pg_restore.c:515 +#: pg_dump.c:1062 pg_dumpall.c:658 pg_restore.c:487 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password nach Passwort fragen (sollte automatisch geschehen)\n" -#: pg_dump.c:1094 pg_dumpall.c:670 +#: pg_dump.c:1063 pg_dumpall.c:659 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROLLENNAME vor der Ausgabe SET ROLE ausführen\n" -#: pg_dump.c:1096 +#: pg_dump.c:1065 #, c-format msgid "" "\n" @@ -1727,606 +1713,530 @@ msgstr "" "PGDATABASE verwendet.\n" "\n" -#: pg_dump.c:1098 pg_dumpall.c:674 pg_restore.c:522 +#: pg_dump.c:1067 pg_dumpall.c:663 pg_restore.c:494 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Berichten Sie Fehler an <%s>.\n" -#: pg_dump.c:1099 pg_dumpall.c:675 pg_restore.c:523 +#: pg_dump.c:1068 pg_dumpall.c:664 pg_restore.c:495 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_dump.c:1118 pg_dumpall.c:500 +#: pg_dump.c:1087 pg_dumpall.c:488 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "ungültige Clientkodierung »%s« angegeben" -#: pg_dump.c:1264 -#, c-format -msgid "" -"Synchronized snapshots on standby servers are not supported by this server version.\n" -"Run with --no-synchronized-snapshots instead if you do not need\n" -"synchronized snapshots." -msgstr "" -"Synchronisierte Snapshots auf Standby-Servern werden von dieser Serverversion nicht unterstützt.\n" -"Verwenden Sie --no-synchronized-snapshots, wenn Sie keine synchronisierten\n" -"Snapshots benötigen." +#: pg_dump.c:1225 +#, fuzzy, c-format +#| msgid "Exported snapshots are not supported by this server version." +msgid "parallel dumps from standby servers are not supported by this server version" +msgstr "Exportierte Snapshots werden in dieser Serverversion nicht unterstützt." -#: pg_dump.c:1333 +#: pg_dump.c:1290 #, c-format msgid "invalid output format \"%s\" specified" msgstr "ungültiges Ausgabeformat »%s« angegeben" -#: pg_dump.c:1371 +#: pg_dump.c:1331 pg_dump.c:1387 pg_dump.c:1440 pg_dumpall.c:1282 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "falscher qualifizierter Name (zu viele Namensteile): %s" + +#: pg_dump.c:1339 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "keine passenden Schemas für Muster »%s« gefunden" -#: pg_dump.c:1418 +#: pg_dump.c:1392 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "keine passenden Erweiterungen für Muster »%s« gefunden" -#: pg_dump.c:1465 +#: pg_dump.c:1445 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "keine passenden Fremdserver für Muster »%s« gefunden" -#: pg_dump.c:1528 +#: pg_dump.c:1508 +#, c-format +msgid "improper relation name (too many dotted names): %s" +msgstr "falscher Relationsname (zu viele Namensteile): %s" + +#: pg_dump.c:1519 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "keine passenden Tabellen für Muster »%s« gefunden" -#: pg_dump.c:1951 +#: pg_dump.c:1546 +#, c-format +msgid "You are currently not connected to a database." +msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden." + +#: pg_dump.c:1549 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s" + +#: pg_dump.c:1980 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "gebe Inhalt der Tabelle »%s.%s« aus" -#: pg_dump.c:2058 +#: pg_dump.c:2086 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Ausgabe des Inhalts der Tabelle »%s« fehlgeschlagen: PQgetCopyData() fehlgeschlagen." -#: pg_dump.c:2059 pg_dump.c:2069 +#: pg_dump.c:2087 pg_dump.c:2097 #, c-format msgid "Error message from server: %s" msgstr "Fehlermeldung vom Server: %s" -#: pg_dump.c:2060 pg_dump.c:2070 +#: pg_dump.c:2088 pg_dump.c:2098 #, c-format -msgid "The command was: %s" +msgid "Command was: %s" msgstr "Die Anweisung war: %s" -#: pg_dump.c:2068 +#: pg_dump.c:2096 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Ausgabe des Inhalts der Tabelle »%s« fehlgeschlagen: PQgetResult() fehlgeschlagen." -#: pg_dump.c:2828 +#: pg_dump.c:2178 +#, c-format +msgid "wrong number of fields retrieved from table \"%s\"" +msgstr "falsche Anzahl Felder von Tabelle »%s« erhalten" + +#: pg_dump.c:2836 #, c-format msgid "saving database definition" msgstr "sichere Datenbankdefinition" -#: pg_dump.c:3300 +#: pg_dump.c:2932 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "unbekannter Locale-Provider: %s" + +#: pg_dump.c:3248 #, c-format msgid "saving encoding = %s" msgstr "sichere Kodierung = %s" -#: pg_dump.c:3325 +#: pg_dump.c:3273 #, c-format msgid "saving standard_conforming_strings = %s" msgstr "sichere standard_conforming_strings = %s" -#: pg_dump.c:3364 +#: pg_dump.c:3312 #, c-format msgid "could not parse result of current_schemas()" msgstr "konnte Ergebnis von current_schemas() nicht interpretieren" -#: pg_dump.c:3383 +#: pg_dump.c:3331 #, c-format msgid "saving search_path = %s" msgstr "sichere search_path = %s" -#: pg_dump.c:3436 -#, c-format -msgid "saving default_toast_compression = %s" -msgstr "sichere default_toast_compression = %s" - -#: pg_dump.c:3475 +#: pg_dump.c:3369 #, c-format msgid "reading large objects" msgstr "lese Large Objects" -#: pg_dump.c:3657 +#: pg_dump.c:3507 #, c-format msgid "saving large objects" msgstr "sichere Large Objects" -#: pg_dump.c:3703 +#: pg_dump.c:3548 #, c-format msgid "error reading large object %u: %s" msgstr "Fehler beim Lesen von Large Object %u: %s" -#: pg_dump.c:3755 +#: pg_dump.c:3654 #, c-format -msgid "reading row security enabled for table \"%s.%s\"" -msgstr "lese Einstellung von Sicherheit auf Zeilenebene für Tabelle »%s.%s«" +msgid "reading row-level security policies" +msgstr "lese Policys für Sicherheit auf Zeilenebene" -#: pg_dump.c:3786 -#, c-format -msgid "reading policies for table \"%s.%s\"" -msgstr "lese Policys von Tabelle »%s.%s«" - -#: pg_dump.c:3938 +#: pg_dump.c:3795 #, c-format msgid "unexpected policy command type: %c" msgstr "unerwarteter Policy-Befehlstyp: %c" -#: pg_dump.c:4092 +#: pg_dump.c:4245 pg_dump.c:4562 pg_dump.c:11693 pg_dump.c:17510 +#: pg_dump.c:17512 pg_dump.c:18133 #, c-format -msgid "owner of publication \"%s\" appears to be invalid" -msgstr "Eigentümer der Publikation »%s« scheint ungültig zu sein" +msgid "could not parse %s array" +msgstr "konnte %s-Array nicht interpretieren" -#: pg_dump.c:4384 +#: pg_dump.c:4430 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "Subskriptionen werden nicht ausgegeben, weil der aktuelle Benutzer kein Superuser ist" -#: pg_dump.c:4455 -#, c-format -msgid "owner of subscription \"%s\" appears to be invalid" -msgstr "Eigentümer der Subskription »%s« scheint ungültig zu sein" - -#: pg_dump.c:4498 -#, c-format -msgid "could not parse subpublications array" -msgstr "konnte subpublications-Array nicht interpretieren" - -#: pg_dump.c:4856 +#: pg_dump.c:4944 #, c-format msgid "could not find parent extension for %s %s" msgstr "konnte Erweiterung, zu der %s %s gehört, nicht finden" -#: pg_dump.c:4988 -#, c-format -msgid "owner of schema \"%s\" appears to be invalid" -msgstr "Eigentümer des Schemas »%s« scheint ungültig zu sein" - -#: pg_dump.c:5011 +#: pg_dump.c:5089 #, c-format msgid "schema with OID %u does not exist" msgstr "Schema mit OID %u existiert nicht" -#: pg_dump.c:5340 -#, c-format -msgid "owner of data type \"%s\" appears to be invalid" -msgstr "Eigentümer des Datentypen »%s« scheint ungültig zu sein" - -#: pg_dump.c:5424 -#, c-format -msgid "owner of operator \"%s\" appears to be invalid" -msgstr "Eigentümer des Operatoren »%s« scheint ungültig zu sein" - -#: pg_dump.c:5723 -#, c-format -msgid "owner of operator class \"%s\" appears to be invalid" -msgstr "Eigentümer der Operatorklasse »%s« scheint ungültig zu sein" - -#: pg_dump.c:5806 -#, c-format -msgid "owner of operator family \"%s\" appears to be invalid" -msgstr "Eigentümer der Operatorfamilie »%s« scheint ungültig zu sein" - -#: pg_dump.c:5974 -#, c-format -msgid "owner of aggregate function \"%s\" appears to be invalid" -msgstr "Eigentümer der Aggregatfunktion »%s« scheint ungültig zu sein" - -#: pg_dump.c:6233 -#, c-format -msgid "owner of function \"%s\" appears to be invalid" -msgstr "Eigentümer der Funktion »%s« scheint ungültig zu sein" - -#: pg_dump.c:7060 -#, c-format -msgid "owner of table \"%s\" appears to be invalid" -msgstr "Eigentümer der Tabelle »%s« scheint ungültig zu sein" - -#: pg_dump.c:7102 pg_dump.c:17493 +#: pg_dump.c:6543 pg_dump.c:16774 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "Sanity-Check fehlgeschlagen, Elterntabelle mit OID %u von Sequenz mit OID %u nicht gefunden" -#: pg_dump.c:7241 +#: pg_dump.c:6847 pg_dump.c:7114 pg_dump.c:7585 pg_dump.c:8252 pg_dump.c:8373 +#: pg_dump.c:8527 #, c-format -msgid "reading indexes for table \"%s.%s\"" -msgstr "lese Indexe von Tabelle »%s.%s«" +msgid "unrecognized table OID %u" +msgstr "unbekannte Tabellen-OID %u" -#: pg_dump.c:7655 +#: pg_dump.c:6851 #, c-format -msgid "reading foreign key constraints for table \"%s.%s\"" -msgstr "lese Fremdschlüssel-Constraints von Tabelle »%s.%s«" +msgid "unexpected index data for table \"%s\"" +msgstr "unerwartete Indexdaten für Tabelle »%s«" -#: pg_dump.c:7934 +#: pg_dump.c:7346 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "Sanity-Check fehlgeschlagen, Elterntabelle mit OID %u von pg_rewrite-Eintrag mit OID %u nicht gefunden" -#: pg_dump.c:8017 -#, c-format -msgid "reading triggers for table \"%s.%s\"" -msgstr "lese Trigger von Tabelle »%s.%s«" - -#: pg_dump.c:8150 +#: pg_dump.c:7637 #, c-format msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" msgstr "Anfrage ergab NULL als Name der Tabelle auf die sich Fremdschlüssel-Trigger »%s« von Tabelle »%s« bezieht (OID der Tabelle: %u)" -#: pg_dump.c:8700 +#: pg_dump.c:8256 #, c-format -msgid "finding the columns and types of table \"%s.%s\"" -msgstr "finde Spalten und Typen von Tabelle »%s.%s«" +msgid "unexpected column data for table \"%s\"" +msgstr "unerwartete Spaltendaten für Tabelle »%s«" -#: pg_dump.c:8824 +#: pg_dump.c:8286 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "ungültige Spaltennummerierung in Tabelle »%s«" -#: pg_dump.c:8863 -#, c-format -msgid "finding default expressions of table \"%s.%s\"" -msgstr "finde DEFAULT-Ausdrücke von Tabelle »%s.%s«" +#: pg_dump.c:8335 +#, fuzzy, c-format +#| msgid "multiple default expressions" +msgid "finding table default expressions" +msgstr "mehrere Vorgabeausdrücke" -#: pg_dump.c:8885 +#: pg_dump.c:8377 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "ungültiger adnum-Wert %d für Tabelle »%s«" -#: pg_dump.c:8978 -#, c-format -msgid "finding check constraints for table \"%s.%s\"" -msgstr "finde Check-Constraints für Tabelle »%s.%s«" +#: pg_dump.c:8477 +#, fuzzy, c-format +#| msgid "and table_constraint is:" +msgid "finding table check constraints" +msgstr "und Tabellen-Constraint Folgendes ist:" -#: pg_dump.c:9027 +#: pg_dump.c:8531 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "%d Check-Constraint für Tabelle %s erwartet, aber %d gefunden" msgstr[1] "%d Check-Constraints für Tabelle %s erwartet, aber %d gefunden" -#: pg_dump.c:9031 -#, c-format -msgid "(The system catalogs might be corrupted.)" -msgstr "(Die Systemkataloge sind wahrscheinlich verfälscht.)" - -#: pg_dump.c:10616 -#, c-format -msgid "typtype of data type \"%s\" appears to be invalid" -msgstr "typtype des Datentypen »%s« scheint ungültig zu sein" - -#: pg_dump.c:11968 -#, c-format -msgid "bogus value in proargmodes array" -msgstr "unsinniger Wert in proargmodes-Array" - -#: pg_dump.c:12275 +#: pg_dump.c:8535 #, c-format -msgid "could not parse proallargtypes array" -msgstr "konnte proallargtypes-Array nicht interpretieren" +msgid "The system catalogs might be corrupted." +msgstr "Die Systemkataloge sind wahrscheinlich verfälscht." -#: pg_dump.c:12291 +#: pg_dump.c:9225 #, c-format -msgid "could not parse proargmodes array" -msgstr "konnte proargmodes-Array nicht interpretieren" +msgid "role with OID %u does not exist" +msgstr "Rolle mit OID %u existiert nicht" -#: pg_dump.c:12305 +#: pg_dump.c:9337 pg_dump.c:9366 #, c-format -msgid "could not parse proargnames array" -msgstr "konnte proargnames-Array nicht interpretieren" +msgid "unsupported pg_init_privs entry: %u %u %d" +msgstr "" -#: pg_dump.c:12315 +#: pg_dump.c:10187 #, c-format -msgid "could not parse proconfig array" -msgstr "konnte proconfig-Array nicht interpretieren" +msgid "typtype of data type \"%s\" appears to be invalid" +msgstr "typtype des Datentypen »%s« scheint ungültig zu sein" -#: pg_dump.c:12395 +#: pg_dump.c:11762 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "ungültiger provolatile-Wert für Funktion »%s«" -#: pg_dump.c:12445 pg_dump.c:14396 +#: pg_dump.c:11812 pg_dump.c:13603 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "ungültiger proparallel-Wert für Funktion »%s«" -#: pg_dump.c:12584 pg_dump.c:12693 pg_dump.c:12700 +#: pg_dump.c:11943 pg_dump.c:12049 pg_dump.c:12056 #, c-format msgid "could not find function definition for function with OID %u" msgstr "konnte Funktionsdefinition für Funktion mit OID %u nicht finden" -#: pg_dump.c:12623 +#: pg_dump.c:11982 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "unsinniger Wert in Feld pg_cast.castfunc oder pg_cast.castmethod" -#: pg_dump.c:12626 +#: pg_dump.c:11985 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "unsinniger Wert in Feld pg_cast.castmethod" -#: pg_dump.c:12719 +#: pg_dump.c:12075 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "unsinnige Transformationsdefinition, mindestens eins von trffromsql und trftosql sollte nicht null sein" -#: pg_dump.c:12736 +#: pg_dump.c:12092 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "unsinniger Wert in Feld pg_transform.trffromsql" -#: pg_dump.c:12757 +#: pg_dump.c:12113 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "unsinniger Wert in Feld pg_transform.trftosql" -#: pg_dump.c:12909 +#: pg_dump.c:12258 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "Postfix-Operatoren werden nicht mehr unterstützt (Operator »%s«)" -#: pg_dump.c:13079 +#: pg_dump.c:12428 #, c-format msgid "could not find operator with OID %s" msgstr "konnte Operator mit OID %s nicht finden" -#: pg_dump.c:13147 +#: pg_dump.c:12496 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "ungültiger Typ »%c« für Zugriffsmethode »%s«" -#: pg_dump.c:13901 +#: pg_dump.c:13115 #, c-format msgid "unrecognized collation provider: %s" msgstr "unbekannter Sortierfolgen-Provider: %s" -#: pg_dump.c:14315 +#: pg_dump.c:13522 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "unbekannter aggfinalmodify-Wert für Aggregat »%s«" -#: pg_dump.c:14371 +#: pg_dump.c:13578 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "unbekannter aggmfinalmodify-Wert für Aggregat »%s«" -#: pg_dump.c:15093 +#: pg_dump.c:14296 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "unbekannter Objekttyp in den Vorgabeprivilegien: %d" -#: pg_dump.c:15111 +#: pg_dump.c:14312 #, c-format msgid "could not parse default ACL list (%s)" msgstr "konnte Vorgabe-ACL-Liste (%s) nicht interpretieren" -#: pg_dump.c:15196 -#, c-format -msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)" +#: pg_dump.c:14394 +#, fuzzy, c-format +#| msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)" +msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "konnte initiale GRANT-ACL-Liste (%s) oder initiale REVOKE-ACL-Liste (%s) für Objekt »%s« (%s) nicht interpretieren" -#: pg_dump.c:15204 -#, c-format -msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)" +#: pg_dump.c:14419 +#, fuzzy, c-format +#| msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)" +msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "konnte GRANT-ACL-Liste (%s) oder REVOKE-ACL-Liste (%s) für Objekt »%s« (%s) nicht interpretieren" -#: pg_dump.c:15719 +#: pg_dump.c:14957 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "Anfrage um die Definition der Sicht »%s« zu ermitteln lieferte keine Daten" -#: pg_dump.c:15722 +#: pg_dump.c:14960 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "Anfrage um die Definition der Sicht »%s« zu ermitteln lieferte mehr als eine Definition" -#: pg_dump.c:15729 +#: pg_dump.c:14967 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "Definition der Sicht »%s« scheint leer zu sein (Länge null)" -#: pg_dump.c:15813 +#: pg_dump.c:15051 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS wird nicht mehr unterstützt (Tabelle »%s«)" -#: pg_dump.c:16680 +#: pg_dump.c:15980 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "ungültige Spaltennummer %d in Tabelle »%s«" -#: pg_dump.c:16757 +#: pg_dump.c:16058 #, c-format msgid "could not parse index statistic columns" msgstr "konnte Indexstatistikspalten nicht interpretieren" -#: pg_dump.c:16759 +#: pg_dump.c:16060 #, c-format msgid "could not parse index statistic values" msgstr "konnte Indexstatistikwerte nicht interpretieren" -#: pg_dump.c:16761 +#: pg_dump.c:16062 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "Anzahl Spalten und Werte für Indexstatistiken stimmt nicht überein" -#: pg_dump.c:16978 +#: pg_dump.c:16280 #, c-format msgid "missing index for constraint \"%s\"" msgstr "fehlender Index für Constraint »%s«" -#: pg_dump.c:17203 +#: pg_dump.c:16508 #, c-format msgid "unrecognized constraint type: %c" msgstr "unbekannter Constraint-Typ: %c" -#: pg_dump.c:17335 pg_dump.c:17558 +#: pg_dump.c:16609 pg_dump.c:16838 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "Anfrage nach Daten der Sequenz %s ergab %d Zeile (erwartete 1)" msgstr[1] "Anfrage nach Daten der Sequenz %s ergab %d Zeilen (erwartete 1)" -#: pg_dump.c:17369 +#: pg_dump.c:16641 #, c-format msgid "unrecognized sequence type: %s" msgstr "unbekannter Sequenztyp: %s" -#: pg_dump.c:17656 +#: pg_dump.c:16930 #, c-format msgid "unexpected tgtype value: %d" msgstr "unerwarteter tgtype-Wert: %d" -#: pg_dump.c:17730 +#: pg_dump.c:17002 #, c-format msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" msgstr "fehlerhafte Argumentzeichenkette (%s) für Trigger »%s« von Tabelle »%s«" -#: pg_dump.c:17966 +#: pg_dump.c:17271 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "Anfrage nach Regel »%s« der Tabelle »%s« fehlgeschlagen: falsche Anzahl Zeilen zurückgegeben" -#: pg_dump.c:18128 +#: pg_dump.c:17424 #, c-format msgid "could not find referenced extension %u" msgstr "konnte referenzierte Erweiterung %u nicht finden" -#: pg_dump.c:18219 -#, c-format -msgid "could not parse extension configuration array" -msgstr "konnte Erweiterungskonfigurations-Array nicht interpretieren" - -#: pg_dump.c:18221 -#, c-format -msgid "could not parse extension condition array" -msgstr "konnte Erweiterungsbedingungs-Array nicht interpretieren" - -#: pg_dump.c:18223 +#: pg_dump.c:17514 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "Anzahl Konfigurationen und Bedingungen für Erweiterung stimmt nicht überein" -#: pg_dump.c:18355 +#: pg_dump.c:17646 #, c-format msgid "reading dependency data" msgstr "lese Abhängigkeitsdaten" -#: pg_dump.c:18448 +#: pg_dump.c:17732 #, c-format msgid "no referencing object %u %u" msgstr "kein referenzierendes Objekt %u %u" -#: pg_dump.c:18459 +#: pg_dump.c:17743 #, c-format msgid "no referenced object %u %u" msgstr "kein referenziertes Objekt %u %u" -#: pg_dump.c:18833 -#, c-format -msgid "could not parse reloptions array" -msgstr "konnte reloptions-Array nicht interpretieren" - -#: pg_dump_sort.c:411 +#: pg_dump_sort.c:422 #, c-format msgid "invalid dumpId %d" msgstr "ungültige dumpId %d" -#: pg_dump_sort.c:417 +#: pg_dump_sort.c:428 #, c-format msgid "invalid dependency %d" msgstr "ungültige Abhängigkeit %d" -#: pg_dump_sort.c:650 +#: pg_dump_sort.c:661 #, c-format msgid "could not identify dependency loop" msgstr "konnte Abhängigkeitsschleife nicht bestimmen" -#: pg_dump_sort.c:1221 +#: pg_dump_sort.c:1232 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" msgstr[0] "Es gibt zirkuläre Fremdschlüssel-Constraints für diese Tabelle:" msgstr[1] "Es gibt zirkuläre Fremdschlüssel-Constraints zwischen diesen Tabellen:" -#: pg_dump_sort.c:1225 pg_dump_sort.c:1245 +#: pg_dump_sort.c:1236 pg_dump_sort.c:1256 #, c-format msgid " %s" msgstr " %s" -#: pg_dump_sort.c:1226 +#: pg_dump_sort.c:1237 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "Möglicherweise kann der Dump nur wiederhergestellt werden, wenn --disable-triggers verwendet wird oder die Constraints vorübergehend entfernt werden." -#: pg_dump_sort.c:1227 +#: pg_dump_sort.c:1238 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "Führen Sie einen vollen Dump statt eines Dumps mit --data-only durch, um dieses Problem zu vermeiden." -#: pg_dump_sort.c:1239 +#: pg_dump_sort.c:1250 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "konnte Abhängigkeitsschleife zwischen diesen Elementen nicht auflösen:" -#: pg_dumpall.c:200 +#: pg_dumpall.c:205 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"Das Programm »%s« wird von %s benötigt, aber wurde nicht im\n" -"selben Verzeichnis wie »%s« gefunden.\n" -"Prüfen Sie Ihre Installation." +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden" -#: pg_dumpall.c:205 +#: pg_dumpall.c:208 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"Das Programm »%s« wurde von %s gefunden,\n" -"aber es hatte nicht die gleiche Version wie %s.\n" -"Prüfen Sie Ihre Installation." +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s" #: pg_dumpall.c:357 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "Option --exclude-database kann nicht zusammen mit -g/--globals-only, -r/--roles-only oder -t/--tablesspaces-only verwendet werden" -#: pg_dumpall.c:366 +#: pg_dumpall.c:365 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "Optionen -g/--globals-only und -r/--roles-only können nicht zusammen verwendet werden" -#: pg_dumpall.c:374 +#: pg_dumpall.c:372 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "Optionen -g/--globals-only und -t/--tablespaces-only können nicht zusammen verwendet werden" -#: pg_dumpall.c:388 +#: pg_dumpall.c:382 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "Optionen -r/--roles-only und -t/--tablespaces-only können nicht zusammen verwendet werden" -#: pg_dumpall.c:449 pg_dumpall.c:1751 +#: pg_dumpall.c:444 pg_dumpall.c:1587 #, c-format msgid "could not connect to database \"%s\"" msgstr "konnte nicht mit der Datenbank »%s« verbinden" -#: pg_dumpall.c:463 +#: pg_dumpall.c:456 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2335,7 +2245,7 @@ msgstr "" "konnte nicht mit Datenbank »postgres« oder »template1« verbinden\n" "Bitte geben Sie eine alternative Datenbank an." -#: pg_dumpall.c:617 +#: pg_dumpall.c:604 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2344,75 +2254,75 @@ msgstr "" "%s gibt einen PostgreSQL-Datenbankcluster in eine SQL-Skriptdatei aus.\n" "\n" -#: pg_dumpall.c:619 +#: pg_dumpall.c:606 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_dumpall.c:622 +#: pg_dumpall.c:609 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=DATEINAME Name der Ausgabedatei\n" -#: pg_dumpall.c:629 +#: pg_dumpall.c:616 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean Datenbanken vor der Wiedererstellung löschen\n" -#: pg_dumpall.c:631 +#: pg_dumpall.c:618 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr " -g, --globals-only nur globale Objekte ausgeben, keine Datenbanken\n" -#: pg_dumpall.c:632 pg_restore.c:485 +#: pg_dumpall.c:619 pg_restore.c:456 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr "" " -O, --no-owner Wiederherstellung der Objekteigentümerschaft\n" " auslassen\n" -#: pg_dumpall.c:633 +#: pg_dumpall.c:620 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr "" " -r, --roles-only nur Rollen ausgeben, keine Datenbanken oder\n" " Tablespaces\n" -#: pg_dumpall.c:635 +#: pg_dumpall.c:622 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr " -S, --superuser=NAME Superusername für den Dump\n" -#: pg_dumpall.c:636 +#: pg_dumpall.c:623 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr "" " -t, --tablespaces-only nur Tablespaces ausgeben, keine Datenbanken oder\n" " Rollen\n" -#: pg_dumpall.c:642 +#: pg_dumpall.c:629 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr "" " --exclude-database=MUSTER Datenbanken deren Name mit MUSTER übereinstimmt\n" " überspringen\n" -#: pg_dumpall.c:649 +#: pg_dumpall.c:636 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords Rollenpasswörter nicht mit ausgeben\n" -#: pg_dumpall.c:663 +#: pg_dumpall.c:652 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=VERBDG mit angegebenen Verbindungsparametern verbinden\n" -#: pg_dumpall.c:665 +#: pg_dumpall.c:654 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAME alternative Standarddatenbank\n" -#: pg_dumpall.c:672 +#: pg_dumpall.c:661 #, c-format msgid "" "\n" @@ -2425,92 +2335,93 @@ msgstr "" "Standardausgabe geschrieben.\n" "\n" -#: pg_dumpall.c:878 +#: pg_dumpall.c:803 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "mit »pg_« anfangender Rollenname übersprungen (%s)" -#: pg_dumpall.c:1279 +#: pg_dumpall.c:1018 +#, fuzzy, c-format +#| msgid "could not parse ACL list (%s) for tablespace \"%s\"" +msgid "could not parse ACL list (%s) for parameter \"%s\"" +msgstr "konnte ACL-Zeichenkette (%s) für Tablespace »%s« nicht interpretieren" + +#: pg_dumpall.c:1136 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "konnte ACL-Zeichenkette (%s) für Tablespace »%s« nicht interpretieren" -#: pg_dumpall.c:1496 +#: pg_dumpall.c:1343 #, c-format msgid "excluding database \"%s\"" msgstr "Datenbank »%s« übersprungen" -#: pg_dumpall.c:1500 +#: pg_dumpall.c:1347 #, c-format msgid "dumping database \"%s\"" msgstr "Ausgabe der Datenbank »%s«" -#: pg_dumpall.c:1532 +#: pg_dumpall.c:1378 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "pg_dump für Datenbank »%s« fehlgeschlagen; beende" -#: pg_dumpall.c:1541 +#: pg_dumpall.c:1384 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "konnte die Ausgabedatei »%s« nicht neu öffnen: %m" -#: pg_dumpall.c:1585 +#: pg_dumpall.c:1425 #, c-format msgid "running \"%s\"" msgstr "führe »%s« aus" -#: pg_dumpall.c:1800 +#: pg_dumpall.c:1630 #, c-format msgid "could not get server version" msgstr "konnte Version des Servers nicht ermitteln" -#: pg_dumpall.c:1806 +#: pg_dumpall.c:1633 #, c-format msgid "could not parse server version \"%s\"" msgstr "konnte Versionszeichenkette »%s« nicht entziffern" -#: pg_dumpall.c:1878 pg_dumpall.c:1901 +#: pg_dumpall.c:1703 pg_dumpall.c:1726 #, c-format msgid "executing %s" msgstr "führe %s aus" -#: pg_restore.c:308 +#: pg_restore.c:313 #, c-format msgid "one of -d/--dbname and -f/--file must be specified" msgstr "entweder -d/--dbname oder -f/--file muss angegeben werden" -#: pg_restore.c:317 +#: pg_restore.c:320 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" msgstr "Optionen -d/--dbname und -f/--file können nicht zusammen verwendet werden" -#: pg_restore.c:343 +#: pg_restore.c:338 #, c-format msgid "options -C/--create and -1/--single-transaction cannot be used together" msgstr "Optionen -C/--create und -1/--single-transaction können nicht zusammen verwendet werden" -#: pg_restore.c:357 -#, c-format -msgid "maximum number of parallel jobs is %d" -msgstr "maximale Anzahl paralleler Jobs ist %d" - -#: pg_restore.c:366 +#: pg_restore.c:342 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "--single-transaction und mehrere Jobs können nicht zusammen verwendet werden" -#: pg_restore.c:408 +#: pg_restore.c:380 #, c-format msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "unbekanntes Archivformat »%s«; bitte »c«, »d« oder »t« angeben" -#: pg_restore.c:448 +#: pg_restore.c:419 #, c-format msgid "errors ignored on restore: %d" msgstr "bei Wiederherstellung ignorierte Fehler: %d" -#: pg_restore.c:461 +#: pg_restore.c:432 #, c-format msgid "" "%s restores a PostgreSQL database from an archive created by pg_dump.\n" @@ -2520,47 +2431,47 @@ msgstr "" "gesichert wurde.\n" "\n" -#: pg_restore.c:463 +#: pg_restore.c:434 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [OPTION]... [DATEI]\n" -#: pg_restore.c:466 +#: pg_restore.c:437 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr " -d, --dbname=NAME mit angegebener Datenbank verbinden\n" -#: pg_restore.c:467 +#: pg_restore.c:438 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" msgstr " -f, --file=DATEINAME Name der Ausgabedatei (- für stdout)\n" -#: pg_restore.c:468 +#: pg_restore.c:439 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" msgstr " -F, --format=c|d|t Format der Backup-Datei (sollte automatisch gehen)\n" -#: pg_restore.c:469 +#: pg_restore.c:440 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr " -l, --list Inhaltsverzeichnis für dieses Archiv anzeigen\n" -#: pg_restore.c:470 +#: pg_restore.c:441 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose »Verbose«-Modus\n" -#: pg_restore.c:471 +#: pg_restore.c:442 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_restore.c:472 +#: pg_restore.c:443 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_restore.c:474 +#: pg_restore.c:445 #, c-format msgid "" "\n" @@ -2569,101 +2480,100 @@ msgstr "" "\n" "Optionen die die Wiederherstellung kontrollieren:\n" -#: pg_restore.c:475 +#: pg_restore.c:446 #, c-format msgid " -a, --data-only restore only the data, no schema\n" msgstr " -a, --data-only nur Daten, nicht das Schema, wiederherstellen\n" -#: pg_restore.c:477 +#: pg_restore.c:448 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create Zieldatenbank erzeugen\n" -#: pg_restore.c:478 +#: pg_restore.c:449 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" msgstr " -e, --exit-on-error bei Fehler beenden, Voreinstellung ist fortsetzen\n" -#: pg_restore.c:479 +#: pg_restore.c:450 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=NAME benannten Index wiederherstellen\n" -#: pg_restore.c:480 +#: pg_restore.c:451 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" msgstr "" " -j, --jobs=NUM so viele parallele Jobs zur Wiederherstellung\n" " verwenden\n" -#: pg_restore.c:481 +#: pg_restore.c:452 #, c-format msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" " selecting/ordering output\n" msgstr "" -" -L, --use-list=DATEINAME\n" -" Inhaltsverzeichnis aus dieser Datei zur Auswahl oder\n" +" -L, --use-list=DATEINAME Inhaltsverzeichnis aus dieser Datei zur Auswahl oder\n" " Sortierung der Ausgabe verwenden\n" -#: pg_restore.c:483 +#: pg_restore.c:454 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" msgstr " -n, --schema=NAME nur Objekte in diesem Schema wiederherstellen\n" -#: pg_restore.c:484 +#: pg_restore.c:455 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" msgstr " -N, ---exclude-schema=NAME Objekte in diesem Schema nicht wiederherstellen\n" -#: pg_restore.c:486 +#: pg_restore.c:457 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=NAME(args) benannte Funktion wiederherstellen\n" -#: pg_restore.c:487 +#: pg_restore.c:458 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" msgstr " -s, --schema-only nur das Schema, nicht die Daten, wiederherstellen\n" -#: pg_restore.c:488 +#: pg_restore.c:459 #, c-format msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n" msgstr " -S, --superuser=NAME Name des Superusers, um Trigger auszuschalten\n" -#: pg_restore.c:489 +#: pg_restore.c:460 #, c-format msgid " -t, --table=NAME restore named relation (table, view, etc.)\n" msgstr "" " -t, --table=NAME benannte Relation (Tabelle, Sicht, usw.)\n" " wiederherstellen\n" -#: pg_restore.c:490 +#: pg_restore.c:461 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=NAME benannten Trigger wiederherstellen\n" -#: pg_restore.c:491 +#: pg_restore.c:462 #, c-format msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" msgstr " -x, --no-privileges Wiederherstellung der Zugriffsprivilegien auslassen\n" -#: pg_restore.c:492 +#: pg_restore.c:463 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr " -1, --single-transaction Wiederherstellung als eine einzige Transaktion\n" -#: pg_restore.c:494 +#: pg_restore.c:465 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security Sicherheit auf Zeilenebene einschalten\n" -#: pg_restore.c:496 +#: pg_restore.c:467 #, c-format msgid " --no-comments do not restore comments\n" msgstr " --no-comments Kommentare nicht wiederherstellen\n" -#: pg_restore.c:497 +#: pg_restore.c:468 #, c-format msgid "" " --no-data-for-failed-tables do not restore data of tables that could not be\n" @@ -2672,39 +2582,45 @@ msgstr "" " --no-data-for-failed-tables Daten für Tabellen, die nicht erzeugt werden\n" " konnten, nicht wiederherstellen\n" -#: pg_restore.c:499 +#: pg_restore.c:470 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications Publikationen nicht wiederherstellen\n" -#: pg_restore.c:500 +#: pg_restore.c:471 #, c-format msgid " --no-security-labels do not restore security labels\n" msgstr " --no-security-labels Security-Labels nicht wiederherstellen\n" -#: pg_restore.c:501 +#: pg_restore.c:472 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions Subskriptionen nicht wiederherstellen\n" -#: pg_restore.c:502 +#: pg_restore.c:473 +#, fuzzy, c-format +#| msgid " --no-tablespaces do not restore tablespace assignments\n" +msgid " --no-table-access-method do not restore table access methods\n" +msgstr " --no-tablespaces Tablespace-Zuordnungen nicht wiederherstellen\n" + +#: pg_restore.c:474 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" msgstr " --no-tablespaces Tablespace-Zuordnungen nicht wiederherstellen\n" -#: pg_restore.c:503 +#: pg_restore.c:475 #, c-format msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n" msgstr "" " --section=ABSCHNITT angegebenen Abschnitt wiederherstellen (pre-data,\n" " data oder post-data)\n" -#: pg_restore.c:516 +#: pg_restore.c:488 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" msgstr " --role=ROLLENNAME vor der Wiederherstellung SET ROLE ausführen\n" -#: pg_restore.c:518 +#: pg_restore.c:490 #, c-format msgid "" "\n" @@ -2715,7 +2631,7 @@ msgstr "" "Die Optionen -I, -n, -N, -P, -t, -T und --section können kombiniert und mehrfach\n" "angegeben werden, um mehrere Objekte auszuwählen.\n" -#: pg_restore.c:521 +#: pg_restore.c:493 #, c-format msgid "" "\n" diff --git a/src/bin/pg_dump/po/el.po b/src/bin/pg_dump/po/el.po index b4cd226dad..15b5e09738 100644 --- a/src/bin/pg_dump/po/el.po +++ b/src/bin/pg_dump/po/el.po @@ -3,12 +3,14 @@ # This file is distributed under the same license as the pg_dump (PostgreSQL) package. # Georgios Kokolatos , 2021 # +# +# msgid "" msgstr "" -"Project-Id-Version: pg_dump (PostgreSQL) 13\n" +"Project-Id-Version: pg_dump (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-25 05:48+0000\n" -"PO-Revision-Date: 2021-04-26 09:13+0200\n" +"POT-Creation-Date: 2021-11-08 10:17+0000\n" +"PO-Revision-Date: 2021-11-08 11:55+0100\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -16,22 +18,22 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 3.0\n" #: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " -msgstr "κρίσιμο:" +msgstr "κρίσιμο: " #: ../../../src/common/logging.c:266 #, c-format msgid "error: " -msgstr "σφάλμα:" +msgstr "σφάλμα: " #: ../../../src/common/logging.c:273 #, c-format msgid "warning: " -msgstr "προειδοποίηση:" +msgstr "προειδοποίηση: " #: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format @@ -41,32 +43,32 @@ msgstr "δεν ήταν δυνατή η αναγνώριση του τρέχον #: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" -msgstr "μη έγκυρο δυαδικό αρχείο “%s”" +msgstr "μη έγκυρο δυαδικό αρχείο «%s»" #: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" -msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου “%s”" +msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου «%s»" #: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" -msgstr "δεν βρέθηκε το αρχείο “%s” για να εκτελεστεί" +msgstr "δεν βρέθηκε το αρχείο «%s» για να εκτελεστεί" #: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" -msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο “%s”: %m" +msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" #: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου “%s”: %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου «%s»: %m" #: ../../common/exec.c:409 parallel.c:1614 #, c-format msgid "%s() failed: %m" -msgstr "%s () απέτυχε: %m" +msgstr "%s() απέτυχε: %m" #: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 msgid "out of memory" @@ -311,22 +313,22 @@ msgstr "ανάγνωση συνδρομών" #: common.c:338 #, c-format msgid "invalid number of parents %d for table \"%s\"" -msgstr "μη έγκυρος αριθμός γονέων %d για τον πίνακα \"%s\"" +msgstr "μη έγκυρος αριθμός γονέων %d για τον πίνακα «%s»" #: common.c:1100 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" -msgstr "απέτυχε ο έλεγχος ακεραιότητας, το γονικό OID %u του πίνακα \"%s\" (OID %u) δεν βρέθηκε" +msgstr "απέτυχε ο έλεγχος ακεραιότητας, το γονικό OID %u του πίνακα «%s» (OID %u) δεν βρέθηκε" #: common.c:1142 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" -msgstr "δεν ήταν δυνατή η ανάλυση της αριθμητικής συστυχίας \"%s\": πάρα πολλοί αριθμοί" +msgstr "δεν ήταν δυνατή η ανάλυση της αριθμητικής συστοιχίας «%s»: πάρα πολλοί αριθμοί" #: common.c:1157 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" -msgstr "δεν ήταν δυνατή η ανάλυση της αριθμητικής συστυχίας \"%s\": μη έγκυρος χαρακτήρας σε αριθμό" +msgstr "δεν ήταν δυνατή η ανάλυση της αριθμητικής συστοιχίας «%s»: μη έγκυρος χαρακτήρας σε αριθμό" #: compress_io.c:111 #, c-format @@ -376,10 +378,9 @@ msgid "could not read from input file: end of file" msgstr "δεν ήταν δυνατή η ανάγνωση από το αρχείο εισόδου: τέλος αρχείου" #: parallel.c:254 -#, fuzzy, c-format -#| msgid "pgpipe: getsockname() failed: error code %d" +#, c-format msgid "%s() failed: error code %d" -msgstr "pgpipe: getsockname() απέτυχε: κωδικός σφάλματος %d" +msgstr "%s() απέτυχε: κωδικός σφάλματος %d" #: parallel.c:964 #, c-format @@ -392,15 +393,14 @@ msgid "could not create worker process: %m" msgstr "δεν ήταν δυνατή η δημιουργία διεργασίας εργάτη: %m" #: parallel.c:1151 -#, fuzzy, c-format -#| msgid "unrecognized command received from master: \"%s\"" +#, c-format msgid "unrecognized command received from leader: \"%s\"" -msgstr "μη αναγνωρίσιμη εντολή που ελήφθη από τον μάστερ: “%s”" +msgstr "μη αναγνωρίσιμη εντολή που ελήφθη από τον αρχηγό: «%s»" #: parallel.c:1194 parallel.c:1432 #, c-format msgid "invalid message received from worker: \"%s\"" -msgstr "άκυρο μήνυμα που ελήφθη από εργάτη: “%s”" +msgstr "άκυρο μήνυμα που ελήφθη από εργάτη: «%s»" #: parallel.c:1326 #, c-format @@ -437,10 +437,9 @@ msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: δεν ήταν δυνατή η ακρόαση: κωδικός σφάλματος %d" #: parallel.c:1764 -#, fuzzy, c-format -#| msgid "pgpipe: getsockname() failed: error code %d" +#, c-format msgid "pgpipe: %s() failed: error code %d" -msgstr "pgpipe: getsockname() απέτυχε: κωδικός σφάλματος %d" +msgstr "%s() απέτυχε: κωδικός σφάλματος %d" #: parallel.c:1775 #, c-format @@ -457,442 +456,433 @@ msgstr "pgpipe: δεν ήταν δυνατή η σύνδεση της υποδο msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: δεν ήταν δυνατή η αποδοχή σύνδεσης: κωδικός σφάλματος %d" -#: pg_backup_archiver.c:278 pg_backup_archiver.c:1577 +#: pg_backup_archiver.c:277 pg_backup_archiver.c:1576 #, c-format msgid "could not close output file: %m" msgstr "δεν ήταν δυνατό το κλείσιμο αρχείου εξόδου: %m" -#: pg_backup_archiver.c:322 pg_backup_archiver.c:326 +#: pg_backup_archiver.c:321 pg_backup_archiver.c:325 #, c-format msgid "archive items not in correct section order" msgstr "αρχειοθέτηση στοιχείων που δεν βρίσκονται σε σωστή σειρά ενότητας" -#: pg_backup_archiver.c:332 +#: pg_backup_archiver.c:331 #, c-format msgid "unexpected section code %d" msgstr "μη αναμενόμενος κώδικας ενότητας %d" -#: pg_backup_archiver.c:369 +#: pg_backup_archiver.c:368 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "η παράλληλη επαναφορά δεν υποστηρίζεται από αυτήν τη μορφή αρχείου αρχειοθέτησης" -#: pg_backup_archiver.c:373 +#: pg_backup_archiver.c:372 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "η παράλληλη επαναφορά δεν υποστηρίζεται με αρχεία που έγιναν από pg_dump προ έκδοσης 8.0" -#: pg_backup_archiver.c:391 +#: pg_backup_archiver.c:390 #, c-format msgid "cannot restore from compressed archive (compression not supported in this installation)" msgstr "δεν είναι δυνατή η επαναφορά από συμπιεσμένη αρχειοθήκη (η συμπίεση δεν υποστηρίζεται σε αυτήν την εγκατάσταση)" -#: pg_backup_archiver.c:408 +#: pg_backup_archiver.c:407 #, c-format msgid "connecting to database for restore" msgstr "σύνδεση με βάση δεδομένων για επαναφορά" -#: pg_backup_archiver.c:410 +#: pg_backup_archiver.c:409 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "οι απευθείας συνδέσεις βάσεων δεδομένων δεν υποστηρίζονται σε προ-1.3 αρχεία" -#: pg_backup_archiver.c:453 +#: pg_backup_archiver.c:452 #, c-format msgid "implied data-only restore" msgstr "υποδηλούμενη επαναφορά μόνο δεδομένων" -#: pg_backup_archiver.c:519 +#: pg_backup_archiver.c:518 #, c-format msgid "dropping %s %s" msgstr "εγκαταλείπει %s: %s" -#: pg_backup_archiver.c:614 +#: pg_backup_archiver.c:613 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" -msgstr "δεν ήταν δυνατή η εύρεση του σημείου εισαγωγής IF EXISTS στη δήλωση \"%s\"" +msgstr "δεν ήταν δυνατή η εύρεση του σημείου εισαγωγής IF EXISTS στη δήλωση «%s»" -#: pg_backup_archiver.c:770 pg_backup_archiver.c:772 +#: pg_backup_archiver.c:769 pg_backup_archiver.c:771 #, c-format msgid "warning from original dump file: %s" msgstr "προειδοποίηση από το αρχικό αρχείο απόθεσης: %s" -#: pg_backup_archiver.c:787 +#: pg_backup_archiver.c:786 #, c-format msgid "creating %s \"%s.%s\"" -msgstr "δημιουργία %s “%s.%s”" +msgstr "δημιουργία %s «%s.%s»" -#: pg_backup_archiver.c:790 +#: pg_backup_archiver.c:789 #, c-format msgid "creating %s \"%s\"" -msgstr "δημιουργία %s “%s”" +msgstr "δημιουργία %s «%s»" -#: pg_backup_archiver.c:840 +#: pg_backup_archiver.c:839 #, c-format msgid "connecting to new database \"%s\"" -msgstr "σύνδεση με νέα βάση δεδομένων \"%s\"" +msgstr "σύνδεση με νέα βάση δεδομένων «%s»" -#: pg_backup_archiver.c:867 +#: pg_backup_archiver.c:866 #, c-format msgid "processing %s" msgstr "επεξεργασία %s" -#: pg_backup_archiver.c:887 +#: pg_backup_archiver.c:886 #, c-format msgid "processing data for table \"%s.%s\"" -msgstr "επεξεργασία δεδομένων για τον πίνακα “%s.%s”" +msgstr "επεξεργασία δεδομένων για τον πίνακα «%s.%s»" -#: pg_backup_archiver.c:949 +#: pg_backup_archiver.c:948 #, c-format msgid "executing %s %s" msgstr "εκτέλεση %s %s" -#: pg_backup_archiver.c:988 +#: pg_backup_archiver.c:987 #, c-format msgid "disabling triggers for %s" msgstr "απενεργοποίηση ενεργοποιήσεων για %s" -#: pg_backup_archiver.c:1014 +#: pg_backup_archiver.c:1013 #, c-format msgid "enabling triggers for %s" msgstr "ενεργοποίηση ενεργοποιήσεων για %s" -#: pg_backup_archiver.c:1042 +#: pg_backup_archiver.c:1041 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "εσωτερικό σφάλμα -- Δεν είναι δυνατή η κλήση του WriteData εκτός του περιβάλλοντος μιας ρουτίνας DataDumper" -#: pg_backup_archiver.c:1225 +#: pg_backup_archiver.c:1224 #, c-format msgid "large-object output not supported in chosen format" msgstr "η έξοδος μεγάλου αντικειμένου δεν υποστηρίζεται στην επιλεγμένη μορφή" -#: pg_backup_archiver.c:1283 +#: pg_backup_archiver.c:1282 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "επανέφερε %d μεγάλο αντικείμενο" msgstr[1] "επανέφερε %d μεγάλα αντικείμενα" -#: pg_backup_archiver.c:1304 pg_backup_tar.c:730 +#: pg_backup_archiver.c:1303 pg_backup_tar.c:730 #, c-format msgid "restoring large object with OID %u" msgstr "επαναφορά μεγάλου αντικειμένου με OID %u" -#: pg_backup_archiver.c:1316 +#: pg_backup_archiver.c:1315 #, c-format msgid "could not create large object %u: %s" msgstr "δεν ήταν δυνατή η δημιουργία μεγάλου αντικειμένου %u: %s" -#: pg_backup_archiver.c:1321 pg_dump.c:3693 +#: pg_backup_archiver.c:1320 pg_dump.c:3638 #, c-format msgid "could not open large object %u: %s" msgstr "δεν ήταν δυνατό το άνοιγμα μεγάλου αντικειμένου %u: %s" -#: pg_backup_archiver.c:1377 +#: pg_backup_archiver.c:1376 #, c-format msgid "could not open TOC file \"%s\": %m" -msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC “%s”: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC «%s»: %m" -#: pg_backup_archiver.c:1405 +#: pg_backup_archiver.c:1404 #, c-format msgid "line ignored: %s" msgstr "παραβλέπεται γραμμή: %s" -#: pg_backup_archiver.c:1412 +#: pg_backup_archiver.c:1411 #, c-format msgid "could not find entry for ID %d" msgstr "δεν ήταν δυνατή η εύρεση καταχώρησης για ID %d" -#: pg_backup_archiver.c:1435 pg_backup_directory.c:222 +#: pg_backup_archiver.c:1434 pg_backup_directory.c:222 #: pg_backup_directory.c:598 #, c-format msgid "could not close TOC file: %m" msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου TOC %m" -#: pg_backup_archiver.c:1549 pg_backup_custom.c:156 pg_backup_directory.c:332 +#: pg_backup_archiver.c:1548 pg_backup_custom.c:156 pg_backup_directory.c:332 #: pg_backup_directory.c:585 pg_backup_directory.c:648 #: pg_backup_directory.c:667 pg_dumpall.c:489 #, c-format msgid "could not open output file \"%s\": %m" -msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου εξόδου “%s”: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου εξόδου «%s»: %m" -#: pg_backup_archiver.c:1551 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1550 pg_backup_custom.c:162 #, c-format msgid "could not open output file: %m" msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου εξόδου %m" -#: pg_backup_archiver.c:1644 -#, fuzzy, c-format -#| msgid "wrote %lu byte of large object data (result = %lu)" -#| msgid_plural "wrote %lu bytes of large object data (result = %lu)" +#: pg_backup_archiver.c:1643 +#, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" -msgstr[0] "έγραψε %lu byte δεδομένων μεγάλου αντικειμένου (αποτέλεσμα = %lu)" -msgstr[1] "έγραψε %lu bytes δεδομένων μεγάλου αντικειμένου (αποτέλεσμα = %lu)" +msgstr[0] "έγραψε %zu byte δεδομένων μεγάλου αντικειμένου (αποτέλεσμα = %d)" +msgstr[1] "έγραψε %zu bytes δεδομένων μεγάλου αντικειμένου (αποτέλεσμα = %d)" -#: pg_backup_archiver.c:1650 -#, fuzzy, c-format -#| msgid "could not create large object %u: %s" +#: pg_backup_archiver.c:1649 +#, c-format msgid "could not write to large object: %s" -msgstr "δεν ήταν δυνατή η δημιουργία μεγάλου αντικειμένου %u: %s" +msgstr "δεν ήταν δυνατή η εγγραφή σε μεγάλο αντικείμενο: %s" -#: pg_backup_archiver.c:1740 +#: pg_backup_archiver.c:1739 #, c-format msgid "while INITIALIZING:" msgstr "ενόσω INITIALIZING:" -#: pg_backup_archiver.c:1745 +#: pg_backup_archiver.c:1744 #, c-format msgid "while PROCESSING TOC:" msgstr "ενόσω PROCESSING TOC:" -#: pg_backup_archiver.c:1750 +#: pg_backup_archiver.c:1749 #, c-format msgid "while FINALIZING:" msgstr "ενόσω FINALIZING:" -#: pg_backup_archiver.c:1755 +#: pg_backup_archiver.c:1754 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "από καταχώρηση TOC %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1831 +#: pg_backup_archiver.c:1830 #, c-format msgid "bad dumpId" msgstr "εσφαλμένο dumpId" -#: pg_backup_archiver.c:1852 +#: pg_backup_archiver.c:1851 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "εσφαλμένος πίνακας dumpId για στοιχείο TABLE DATA" -#: pg_backup_archiver.c:1944 +#: pg_backup_archiver.c:1943 #, c-format msgid "unexpected data offset flag %d" msgstr "μη αναμενόμενη σημαία όφσετ δεδομένων %d" -#: pg_backup_archiver.c:1957 +#: pg_backup_archiver.c:1956 #, c-format msgid "file offset in dump file is too large" msgstr "το όφσετ αρχείου στο αρχείο απόθεσης είναι πολύ μεγάλο" -#: pg_backup_archiver.c:2095 pg_backup_archiver.c:2105 +#: pg_backup_archiver.c:2094 pg_backup_archiver.c:2104 #, c-format msgid "directory name too long: \"%s\"" -msgstr "πολύ μακρύ όνομα καταλόγου: “%s”" +msgstr "πολύ μακρύ όνομα καταλόγου: «%s»" -#: pg_backup_archiver.c:2113 +#: pg_backup_archiver.c:2112 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" -msgstr "ο κατάλογος \"%s\" δεν φαίνεται να είναι έγκυρη αρχειοθήκη (το \"toc.dat\" δεν υπάρχει)" +msgstr "ο κατάλογος «%s» δεν φαίνεται να είναι έγκυρη αρχειοθήκη (το «toc.dat» δεν υπάρχει)" -#: pg_backup_archiver.c:2121 pg_backup_custom.c:173 pg_backup_custom.c:807 +#: pg_backup_archiver.c:2120 pg_backup_custom.c:173 pg_backup_custom.c:807 #: pg_backup_directory.c:207 pg_backup_directory.c:394 #, c-format msgid "could not open input file \"%s\": %m" -msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου εισόδου “%s”: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου εισόδου «%s»: %m" -#: pg_backup_archiver.c:2128 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2127 pg_backup_custom.c:179 #, c-format msgid "could not open input file: %m" msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου εισόδου %m" -#: pg_backup_archiver.c:2134 +#: pg_backup_archiver.c:2133 #, c-format msgid "could not read input file: %m" msgstr "δεν ήταν δυνατή η ανάγνωση αρχείου εισόδου: %m" -#: pg_backup_archiver.c:2136 +#: pg_backup_archiver.c:2135 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "το αρχείο εισόδου είναι πολύ σύντομο (διάβασε %lu, ανάμενε 5)" -#: pg_backup_archiver.c:2168 +#: pg_backup_archiver.c:2167 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "το αρχείο εισαγωγής φαίνεται να είναι απόθεση μορφής κειμένου. Παρακαλώ χρησιμοποιήστε το psql." -#: pg_backup_archiver.c:2174 +#: pg_backup_archiver.c:2173 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "το αρχείο εισόδου δεν φαίνεται να είναι έγκυρη αρχειοθήκη (πολύ σύντομο;)" -#: pg_backup_archiver.c:2180 +#: pg_backup_archiver.c:2179 #, c-format msgid "input file does not appear to be a valid archive" msgstr "το αρχείο εισόδου δεν φαίνεται να είναι έγκυρη αρχειοθήκη" -#: pg_backup_archiver.c:2189 +#: pg_backup_archiver.c:2188 #, c-format msgid "could not close input file: %m" msgstr "δεν ήταν δυνατό το κλείσιμο αρχείου εισόδου: %m" -#: pg_backup_archiver.c:2306 +#: pg_backup_archiver.c:2305 #, c-format msgid "unrecognized file format \"%d\"" -msgstr "μη αναγνωρίσιμη μορφή αρχείου \"%d\"" +msgstr "μη αναγνωρίσιμη μορφή αρχείου «%d»" -#: pg_backup_archiver.c:2388 pg_backup_archiver.c:4422 +#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4411 #, c-format msgid "finished item %d %s %s" msgstr "τερματισμός στοιχείου %d %s %s" -#: pg_backup_archiver.c:2392 pg_backup_archiver.c:4435 +#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4424 #, c-format msgid "worker process failed: exit code %d" msgstr "διεργασία εργάτη απέτυχε: κωδικός εξόδου %d" -#: pg_backup_archiver.c:2512 +#: pg_backup_archiver.c:2511 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" -msgstr "καταχώρηση με ID %d εκτός εύρους τιμών — ίσως αλλοιωμένο TOC" +msgstr "καταχώρηση με ID %d εκτός εύρους τιμών -- ίσως αλλοιωμένο TOC" -#: pg_backup_archiver.c:2579 +#: pg_backup_archiver.c:2578 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "η επαναφορά πινάκων WITH OIDS δεν υποστηρίζεται πλέον" -#: pg_backup_archiver.c:2663 +#: pg_backup_archiver.c:2660 #, c-format msgid "unrecognized encoding \"%s\"" -msgstr "μη αναγνωρίσιμη κωδικοποίηση “%s”" +msgstr "μη αναγνωρίσιμη κωδικοποίηση «%s»" -#: pg_backup_archiver.c:2668 +#: pg_backup_archiver.c:2665 #, c-format msgid "invalid ENCODING item: %s" msgstr "μη έγκυρο στοιχείο ENCODING: %s" -#: pg_backup_archiver.c:2686 +#: pg_backup_archiver.c:2683 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "μη έγκυρο στοιχείο STDSTRINGS: %s" -#: pg_backup_archiver.c:2717 -#, fuzzy, c-format -#| msgid "invalid STDSTRINGS item: %s" -msgid "invalid TOASTCOMPRESSION item: %s" -msgstr "μη έγκυρο στοιχείο STDSTRINGS: %s" - -#: pg_backup_archiver.c:2734 +#: pg_backup_archiver.c:2708 #, c-format msgid "schema \"%s\" not found" -msgstr "το σχήμα \"%s\" δεν βρέθηκε" +msgstr "το σχήμα «%s» δεν βρέθηκε" -#: pg_backup_archiver.c:2741 +#: pg_backup_archiver.c:2715 #, c-format msgid "table \"%s\" not found" -msgstr "ο πίνακας “%s” δεν βρέθηκε" +msgstr "ο πίνακας «%s» δεν βρέθηκε" -#: pg_backup_archiver.c:2748 +#: pg_backup_archiver.c:2722 #, c-format msgid "index \"%s\" not found" -msgstr "το ευρετήριο “%s” δεν βρέθηκε" +msgstr "το ευρετήριο «%s» δεν βρέθηκε" -#: pg_backup_archiver.c:2755 +#: pg_backup_archiver.c:2729 #, c-format msgid "function \"%s\" not found" -msgstr "η συνάρτηση “%s” δεν βρέθηκε" +msgstr "η συνάρτηση «%s» δεν βρέθηκε" -#: pg_backup_archiver.c:2762 +#: pg_backup_archiver.c:2736 #, c-format msgid "trigger \"%s\" not found" -msgstr "η ενεργοποίηση \"%s\" δεν βρέθηκε" +msgstr "η ενεργοποίηση «%s» δεν βρέθηκε" -#: pg_backup_archiver.c:3160 +#: pg_backup_archiver.c:3128 #, c-format msgid "could not set session user to \"%s\": %s" -msgstr "δεν ήταν δυνατός ο ορισμός του χρήστη συνεδρίας σε \"%s\": %s" +msgstr "δεν ήταν δυνατός ο ορισμός του χρήστη συνεδρίας σε «%s»: %s" -#: pg_backup_archiver.c:3292 +#: pg_backup_archiver.c:3260 #, c-format msgid "could not set search_path to \"%s\": %s" -msgstr "δεν ήταν δυνατός ο ορισμός του search_path σε “%s”: %s" +msgstr "δεν ήταν δυνατός ο ορισμός του search_path σε «%s»: %s" -#: pg_backup_archiver.c:3354 +#: pg_backup_archiver.c:3322 #, c-format msgid "could not set default_tablespace to %s: %s" -msgstr "δεν ήταν δυνατός ο ορισμός του default_tablespace σε “%s”: %s" +msgstr "δεν ήταν δυνατός ο ορισμός του default_tablespace σε «%s»: %s" -#: pg_backup_archiver.c:3399 +#: pg_backup_archiver.c:3367 #, c-format msgid "could not set default_table_access_method: %s" msgstr "δεν ήταν δυνατός ο ορισμός του default_table_access_method: %s" -#: pg_backup_archiver.c:3491 pg_backup_archiver.c:3649 +#: pg_backup_archiver.c:3459 pg_backup_archiver.c:3617 #, c-format msgid "don't know how to set owner for object type \"%s\"" -msgstr "δεν γνωρίζω πώς να οριστεί κάτοχος για τύπο αντικειμένου \"%s\"" +msgstr "δεν γνωρίζω πώς να οριστεί κάτοχος για τύπο αντικειμένου «%s»" -#: pg_backup_archiver.c:3753 +#: pg_backup_archiver.c:3720 #, c-format msgid "did not find magic string in file header" msgstr "δεν βρέθηκε μαγική συμβολοσειρά στην κεφαλίδα αρχείου" -#: pg_backup_archiver.c:3767 +#: pg_backup_archiver.c:3734 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "μη υποστηριζόμενη έκδοση (%d.%d) στην κεφαλίδα αρχείου" -#: pg_backup_archiver.c:3772 +#: pg_backup_archiver.c:3739 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "απέτυχε έλεγχος ακεραιότητας για μέγεθος ακεραίου (%lu)" -#: pg_backup_archiver.c:3776 +#: pg_backup_archiver.c:3743 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "το αρχείο δημιουργήθηκε σε έναν υπολογιστή με μεγαλύτερους ακέραιους, ορισμένες λειτουργίες ενδέχεται να αποτύχουν" -#: pg_backup_archiver.c:3786 +#: pg_backup_archiver.c:3753 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "η αναμενόμενη μορφή (%d) διαφέρει από τη μορφή που βρίσκεται στο αρχείο (%d)" -#: pg_backup_archiver.c:3801 +#: pg_backup_archiver.c:3768 #, c-format msgid "archive is compressed, but this installation does not support compression -- no data will be available" msgstr "το αρχείο είναι συμπιεσμένο, αλλά αυτή η εγκατάσταση δεν υποστηρίζει συμπίεση -- δεν θα υπάρχουν διαθέσιμα δεδομένα" -#: pg_backup_archiver.c:3819 +#: pg_backup_archiver.c:3802 #, c-format msgid "invalid creation date in header" msgstr "μη έγκυρη ημερομηνία δημιουργίας στην κεφαλίδα" -#: pg_backup_archiver.c:3947 +#: pg_backup_archiver.c:3936 #, c-format msgid "processing item %d %s %s" msgstr "επεξεργασία στοιχείου %d %s %s" -#: pg_backup_archiver.c:4026 +#: pg_backup_archiver.c:4015 #, c-format msgid "entering main parallel loop" msgstr "εισέρχεται στο κύριο παράλληλο βρόχο" -#: pg_backup_archiver.c:4037 +#: pg_backup_archiver.c:4026 #, c-format msgid "skipping item %d %s %s" msgstr "παράβλεψη στοιχείου %d %s %s" -#: pg_backup_archiver.c:4046 +#: pg_backup_archiver.c:4035 #, c-format msgid "launching item %d %s %s" msgstr "εκκίνηση στοιχείου %d %s %s" -#: pg_backup_archiver.c:4100 +#: pg_backup_archiver.c:4089 #, c-format msgid "finished main parallel loop" msgstr "εξέρχεται από το κύριο παράλληλο βρόχο" -#: pg_backup_archiver.c:4136 +#: pg_backup_archiver.c:4125 #, c-format msgid "processing missed item %d %s %s" msgstr "επεξεργασία παραβλεπόμενου στοιχείου %d %s %s" -#: pg_backup_archiver.c:4741 +#: pg_backup_archiver.c:4730 #, c-format msgid "table \"%s\" could not be created, will not restore its data" -msgstr "δεν ήταν δυνατή η δημιουργία του πίνακα \"%s\", δεν θα επαναφερθούν τα δεδομένα του" +msgstr "δεν ήταν δυνατή η δημιουργία του πίνακα «%s», δεν θα επαναφερθούν τα δεδομένα του" #: pg_backup_custom.c:376 pg_backup_null.c:147 #, c-format @@ -1006,10 +996,9 @@ msgid "could not connect to database" msgstr "δεν ήταν δυνατή η σύνδεση σε βάση δεδομένων" #: pg_backup_db.c:191 -#, fuzzy, c-format -#| msgid "reconnection to database \"%s\" failed: %s" +#, c-format msgid "reconnection failed: %s" -msgstr "επανασύνδεση στη βάση δεδομένων “%s” απέτυχε: %s" +msgstr "επανασύνδεση απέτυχε: %s" #: pg_backup_db.c:194 pg_backup_db.c:269 pg_dumpall.c:1686 pg_dumpall.c:1776 #, c-format @@ -1055,12 +1044,12 @@ msgstr "επιστράφηκε σφάλμα από PQputCopyEnd: %s" #: pg_backup_db.c:519 #, c-format msgid "COPY failed for table \"%s\": %s" -msgstr "COPY απέτυχε για πίνακα “%s”: %s" +msgstr "COPY απέτυχε για πίνακα «%s»: %s" -#: pg_backup_db.c:525 pg_dump.c:2077 +#: pg_backup_db.c:525 pg_dump.c:2074 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" -msgstr "μη αναμενόμενα αποτελέσματα κατά τη διάρκεια COPY του πίνακα “%s”" +msgstr "μη αναμενόμενα αποτελέσματα κατά τη διάρκεια COPY του πίνακα «%s»" #: pg_backup_db.c:537 msgid "could not start database transaction" @@ -1078,17 +1067,17 @@ msgstr "δεν ορίστηκε κατάλογος δεδομένων εξόδο #: pg_backup_directory.c:185 #, c-format msgid "could not read directory \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου “%s”: %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m" #: pg_backup_directory.c:189 #, c-format msgid "could not close directory \"%s\": %m" -msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου “%s”: %m" +msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m" #: pg_backup_directory.c:195 #, c-format msgid "could not create directory \"%s\": %m" -msgstr "δεν ήταν δυνατή η δημιουργία του καταλόγου “%s”: %m" +msgstr "δεν ήταν δυνατή η δημιουργία του καταλόγου «%s»: %m" #: pg_backup_directory.c:355 pg_backup_directory.c:496 #: pg_backup_directory.c:532 @@ -1099,27 +1088,27 @@ msgstr "δεν ήταν δυνατή η εγγραφή εξόδου στο αρ #: pg_backup_directory.c:406 #, c-format msgid "could not close data file \"%s\": %m" -msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου δεδομένων “%s”: %m" +msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου δεδομένων «%s»: %m" #: pg_backup_directory.c:446 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" -msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC μεγάλου αντικειμένου \"%s\" για είσοδο: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC μεγάλου αντικειμένου «%s» για είσοδο: %m" #: pg_backup_directory.c:457 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" -msgstr "μη έγκυρη γραμμή σε αρχείο TOC μεγάλου αντικειμένου “%s”: “%s”" +msgstr "μη έγκυρη γραμμή σε αρχείο TOC μεγάλου αντικειμένου «%s»: «%s»" #: pg_backup_directory.c:466 #, c-format msgid "error reading large object TOC file \"%s\"" -msgstr "σφάλμα κατά την ανάγνωση αρχείου TOC μεγάλου αντικειμένου “%s”" +msgstr "σφάλμα κατά την ανάγνωση αρχείου TOC μεγάλου αντικειμένου «%s»" #: pg_backup_directory.c:470 #, c-format msgid "could not close large object TOC file \"%s\": %m" -msgstr "δεν ήταν δυνατό το κλείσιμο αρχείου TOC μεγάλου αντικειμένου “%s”: %m" +msgstr "δεν ήταν δυνατό το κλείσιμο αρχείου TOC μεγάλου αντικειμένου «%s»: %m" #: pg_backup_directory.c:689 #, c-format @@ -1129,7 +1118,7 @@ msgstr "δεν ήταν δυνατή η εγγραφή σε αρχείο TOC blo #: pg_backup_directory.c:721 #, c-format msgid "file name too long: \"%s\"" -msgstr "πολύ μακρύ όνομα αρχείου: \"%s\"" +msgstr "πολύ μακρύ όνομα αρχείου: «%s»" #: pg_backup_null.c:74 #, c-format @@ -1139,7 +1128,7 @@ msgstr "δεν είναι δυνατή η ανάγνωση αυτής της μ #: pg_backup_tar.c:177 #, c-format msgid "could not open TOC file \"%s\" for output: %m" -msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC “%s” για έξοδο: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC «%s» για έξοδο: %m" #: pg_backup_tar.c:184 #, c-format @@ -1154,7 +1143,7 @@ msgstr "δεν υποστηρίζεται συμπίεση από τη μορφ #: pg_backup_tar.c:211 #, c-format msgid "could not open TOC file \"%s\" for input: %m" -msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC “%s” για είσοδο: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC «%s» για είσοδο: %m" #: pg_backup_tar.c:218 #, c-format @@ -1164,7 +1153,7 @@ msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC γι #: pg_backup_tar.c:338 #, c-format msgid "could not find file \"%s\" in archive" -msgstr "δεν ήταν δυνατή η εύρεση του αρχείου \"%s\" στην αρχειοθήκη" +msgstr "δεν ήταν δυνατή η εύρεση του αρχείου «%s» στην αρχειοθήκη" #: pg_backup_tar.c:404 #, c-format @@ -1184,7 +1173,7 @@ msgstr "δεν ήταν δυνατό το κλείσιμο μέλους tar" #: pg_backup_tar.c:685 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" -msgstr "μη αναμενόμενη σύνταξη πρότασης COPY: \"%s\"" +msgstr "μη αναμενόμενη σύνταξη πρότασης COPY: «%s»" #: pg_backup_tar.c:952 #, c-format @@ -1204,12 +1193,12 @@ msgstr "πραγματικό μήκος αρχείου (%s) δεν συμφων #: pg_backup_tar.c:1165 pg_backup_tar.c:1196 #, c-format msgid "could not find header for file \"%s\" in tar archive" -msgstr "δεν ήταν δυνατή η εύρεση κεφαλίδας για το αρχείο \"%s\" στο αρχείο tar" +msgstr "δεν ήταν δυνατή η εύρεση κεφαλίδας για το αρχείο «%s» στο αρχείο tar" #: pg_backup_tar.c:1183 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." -msgstr "η επαναφορά δεδομένων εκτός σειράς δεν υποστηρίζεται σε αυτήν τη μορφή αρχειοθέτησης: απαιτείται \"%s\", αλλά προηγείται της \"%s\" στο αρχείο αρχειοθέτησης." +msgstr "η επαναφορά δεδομένων εκτός σειράς δεν υποστηρίζεται σε αυτήν τη μορφή αρχειοθέτησης: απαιτείται «%s», αλλά προηγείται της «%s» στο αρχείο αρχειοθέτησης." #: pg_backup_tar.c:1230 #, c-format @@ -1226,87 +1215,87 @@ msgstr "αλλοιωμένη κεφαλίδα tar βρέθηκε σε %s (ανα #: pg_backup_utils.c:54 #, c-format msgid "unrecognized section name: \"%s\"" -msgstr "μη αναγνωρισμένο όνομα τμήματος: \"%s\"" +msgstr "μη αναγνωρισμένο όνομα τμήματος: «%s»" -#: pg_backup_utils.c:55 pg_dump.c:623 pg_dump.c:640 pg_dumpall.c:341 +#: pg_backup_utils.c:55 pg_dump.c:622 pg_dump.c:639 pg_dumpall.c:341 #: pg_dumpall.c:351 pg_dumpall.c:360 pg_dumpall.c:369 pg_dumpall.c:377 #: pg_dumpall.c:391 pg_dumpall.c:469 pg_restore.c:284 pg_restore.c:300 #: pg_restore.c:318 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Δοκιμάστε “%s —help” για περισσότερες πληροφορίες.\n" +msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n" #: pg_backup_utils.c:68 #, c-format msgid "out of on_exit_nicely slots" msgstr "έλλειψη υποδοχών on_exit_nicely" -#: pg_dump.c:549 +#: pg_dump.c:548 #, c-format msgid "compression level must be in range 0..9" msgstr "το επίπεδο συμπίεσης πρέπει να βρίσκεται στο εύρος 0..9" -#: pg_dump.c:587 +#: pg_dump.c:586 #, c-format msgid "extra_float_digits must be in range -15..3" msgstr "extra_float_digits πρέπει να βρίσκονται στο εύρος -15..3" -#: pg_dump.c:610 +#: pg_dump.c:609 #, c-format msgid "rows-per-insert must be in range %d..%d" msgstr "rows-per-insert πρέπει να βρίσκονται στο εύρος %d..%d" -#: pg_dump.c:638 pg_dumpall.c:349 pg_restore.c:298 +#: pg_dump.c:637 pg_dumpall.c:349 pg_restore.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" -msgstr "πάρα πολλοί παραμέτροι εισόδου από την γραμμή εντολών (η πρώτη είναι η “%s”)" +msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)" -#: pg_dump.c:659 pg_restore.c:327 +#: pg_dump.c:658 pg_restore.c:327 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" -msgstr "οι επιλογές -s/—schema-only και -a/--data-only δεν είναι δυνατό να χρησιμοποιηθούν μαζί" +msgstr "οι επιλογές -s/--schema-only και -a/--data-only δεν είναι δυνατό να χρησιμοποιηθούν μαζί" -#: pg_dump.c:664 +#: pg_dump.c:663 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" -msgstr "οι επιλογές -s/—schema-only και —include-foreign-data δεν είναι δυνατό να χρησιμοποιηθούν μαζί" +msgstr "οι επιλογές -s/--schema-only και --include-foreign-data δεν είναι δυνατό να χρησιμοποιηθούν μαζί" -#: pg_dump.c:667 +#: pg_dump.c:666 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" -msgstr "η επιλογή —include-foreign-data δεν υποστηρίζεται με παράλληλη δημιουργία αντιγράφων ασφαλείας" +msgstr "η επιλογή --include-foreign-data δεν υποστηρίζεται με παράλληλη δημιουργία αντιγράφων ασφαλείας" -#: pg_dump.c:671 pg_restore.c:333 +#: pg_dump.c:670 pg_restore.c:333 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" -msgstr "οι επιλογές -c/—clean και -a/—data-only δεν είναι δυνατό να χρησιμοποιηθούν μαζί" +msgstr "οι επιλογές -c/--clean και -a/--data-only δεν είναι δυνατό να χρησιμοποιηθούν μαζί" -#: pg_dump.c:676 pg_dumpall.c:384 pg_restore.c:382 +#: pg_dump.c:675 pg_dumpall.c:384 pg_restore.c:382 #, c-format msgid "option --if-exists requires option -c/--clean" -msgstr "η επιλογή —if-exists απαιτεί την επιλογή -c/—clean" +msgstr "η επιλογή --if-exists απαιτεί την επιλογή -c/--clean" -#: pg_dump.c:683 +#: pg_dump.c:682 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" -msgstr "η επιλογή —on-conflict-do-nothing απαιτεί την επιλογή —inserts, —rows-per-insert, ή —column-inserts" +msgstr "η επιλογή --on-conflict-do-nothing απαιτεί την επιλογή --inserts, --rows-per-insert, ή --column-inserts" -#: pg_dump.c:705 +#: pg_dump.c:704 #, c-format msgid "requested compression not available in this installation -- archive will be uncompressed" msgstr "η συμπίεση που ζητήθηκε δεν είναι διαθέσιμη σε αυτήν την εγκατάσταση -- η αρχειοθήκη θα είναι ασυμπίεστη" -#: pg_dump.c:726 pg_restore.c:349 +#: pg_dump.c:725 pg_restore.c:349 #, c-format msgid "invalid number of parallel jobs" msgstr "μη έγκυρος αριθμός παράλληλων εργασιών" -#: pg_dump.c:730 +#: pg_dump.c:729 #, c-format msgid "parallel backup only supported by the directory format" msgstr "παράλληλο αντίγραφο ασφαλείας υποστηρίζεται μόνο από μορφή καταλόγου" -#: pg_dump.c:785 +#: pg_dump.c:784 #, c-format msgid "" "Synchronized snapshots are not supported by this server version.\n" @@ -1314,36 +1303,35 @@ msgid "" "synchronized snapshots." msgstr "" "Τα συγχρονισμένα στιγμιότυπα δεν υποστηρίζονται από αυτήν την έκδοση διακομιστή.\n" -"Εκτελέστε με —no-synchronized-snapshots, εάν δεν χρειάζεστε\n" +"Εκτελέστε με --no-synchronized-snapshots, εάν δεν χρειάζεστε\n" "συγχρονισμένα στιγμιότυπα." -#: pg_dump.c:791 +#: pg_dump.c:790 #, c-format msgid "Exported snapshots are not supported by this server version." msgstr "Τα εξαγόμενα στιγμιότυπα δεν υποστηρίζονται από αυτήν την έκδοση διακομιστή." -#: pg_dump.c:803 +#: pg_dump.c:802 #, c-format msgid "last built-in OID is %u" msgstr "το τελευταίο ενσωματωμένο OID είναι %u" -#: pg_dump.c:812 +#: pg_dump.c:811 #, c-format msgid "no matching schemas were found" msgstr "δεν βρέθηκαν σχήματα που να ταιριάζουν" -#: pg_dump.c:826 +#: pg_dump.c:825 #, c-format msgid "no matching tables were found" msgstr "δεν βρέθηκαν πίνακες που να ταιριάζουν" -#: pg_dump.c:848 -#, fuzzy, c-format -#| msgid "no matching tables were found" +#: pg_dump.c:847 +#, c-format msgid "no matching extensions were found" -msgstr "δεν βρέθηκαν πίνακες που να ταιριάζουν" +msgstr "δεν βρέθηκαν επεκτάσεις που να ταιριάζουν" -#: pg_dump.c:1020 +#: pg_dump.c:1017 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1352,17 +1340,17 @@ msgstr "" "%s αποθέτει μια βάση δεδομένων ως αρχείο κειμένου ή σε άλλες μορφές.\n" "\n" -#: pg_dump.c:1021 pg_dumpall.c:622 pg_restore.c:462 +#: pg_dump.c:1018 pg_dumpall.c:622 pg_restore.c:462 #, c-format msgid "Usage:\n" msgstr "Χρήση:\n" -#: pg_dump.c:1022 +#: pg_dump.c:1019 #, c-format msgid " %s [OPTION]... [DBNAME]\n" -msgstr " %s [OPTION]… [DBNAME]\n" +msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n" -#: pg_dump.c:1024 pg_dumpall.c:625 pg_restore.c:465 +#: pg_dump.c:1021 pg_dumpall.c:625 pg_restore.c:465 #, c-format msgid "" "\n" @@ -1371,56 +1359,56 @@ msgstr "" "\n" "Γενικές επιλογές:\n" -#: pg_dump.c:1025 +#: pg_dump.c:1022 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" -msgstr " -f, —file=FILENAME αρχείο εξόδου ή όνομα καταλόγου\n" +msgstr " -f, --file=FILENAME αρχείο εξόδου ή όνομα καταλόγου\n" -#: pg_dump.c:1026 +#: pg_dump.c:1023 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" " plain text (default))\n" msgstr "" -" -F, —format=c|d|t|p μορφή αρχείου εξόδου (προσαρμοσμένη, κατάλογος, tar,\n" +" -F, --format=c|d|t|p μορφή αρχείου εξόδου (προσαρμοσμένη, κατάλογος, tar,\n" " απλό κείμενο (προεπιλογή))\n" -#: pg_dump.c:1028 +#: pg_dump.c:1025 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" -msgstr " -j, —jobs=NUM χρησιμοποιήστε τόσες πολλές παράλληλες εργασίες για απόθεση\n" +msgstr " -j, --jobs=NUM χρησιμοποιήστε τόσες πολλές παράλληλες εργασίες για απόθεση\n" -#: pg_dump.c:1029 pg_dumpall.c:627 +#: pg_dump.c:1026 pg_dumpall.c:627 #, c-format msgid " -v, --verbose verbose mode\n" -msgstr " -v, —verbose περιφραστική λειτουργία\n" +msgstr " -v, --verbose περιφραστική λειτουργία\n" -#: pg_dump.c:1030 pg_dumpall.c:628 +#: pg_dump.c:1027 pg_dumpall.c:628 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, —version εμφάνισε πληροφορίες έκδοσης και, στη συνέχεια, έξοδος\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης και, στη συνέχεια, έξοδος\n" -#: pg_dump.c:1031 +#: pg_dump.c:1028 #, c-format msgid " -Z, --compress=0-9 compression level for compressed formats\n" -msgstr " -Z, —compress=0-9 επίπεδο συμπίεσης για συμπιεσμένες μορφές\n" +msgstr " -Z, --compress=0-9 επίπεδο συμπίεσης για συμπιεσμένες μορφές\n" -#: pg_dump.c:1032 pg_dumpall.c:629 +#: pg_dump.c:1029 pg_dumpall.c:629 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" -msgstr " —lock-wait-timeout=TIMEOUT αποτυγχάνει μετά την αναμονή TIMEOUT για το κλείδωμα πίνακα\n" +msgstr " --lock-wait-timeout=TIMEOUT αποτυγχάνει μετά την αναμονή TIMEOUT για το κλείδωμα πίνακα\n" -#: pg_dump.c:1033 pg_dumpall.c:656 +#: pg_dump.c:1030 pg_dumpall.c:656 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" -msgstr " —no-sync να μην αναμένει την ασφαλή εγγραφή αλλαγών στον δίσκο\n" +msgstr " --no-sync να μην αναμένει την ασφαλή εγγραφή αλλαγών στον δίσκο\n" -#: pg_dump.c:1034 pg_dumpall.c:630 +#: pg_dump.c:1031 pg_dumpall.c:630 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, —help εμφάνισε αυτό το μήνυμα βοήθειας, και μετά έξοδος\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, και μετά έξοδος\n" -#: pg_dump.c:1036 pg_dumpall.c:631 +#: pg_dump.c:1033 pg_dumpall.c:631 #, c-format msgid "" "\n" @@ -1429,243 +1417,241 @@ msgstr "" "\n" "Επιλογές που ελέγχουν το περιεχόμενο εξόδου:\n" -#: pg_dump.c:1037 pg_dumpall.c:632 +#: pg_dump.c:1034 pg_dumpall.c:632 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" -msgstr " -a, —data-only αποθέτει μόνο τα δεδομένα, όχι το σχήμα\n" +msgstr " -a, --data-only αποθέτει μόνο τα δεδομένα, όχι το σχήμα\n" -#: pg_dump.c:1038 +#: pg_dump.c:1035 #, c-format msgid " -b, --blobs include large objects in dump\n" -msgstr " -b, —blobs περιέλαβε μεγάλα αντικείμενα στην απόθεση\n" +msgstr " -b, --blobs περιέλαβε μεγάλα αντικείμενα στην απόθεση\n" -#: pg_dump.c:1039 +#: pg_dump.c:1036 #, c-format msgid " -B, --no-blobs exclude large objects in dump\n" -msgstr " -B, —no-blobs εξαίρεσε μεγάλα αντικείμενα στην απόθεση\n" +msgstr " -B, --no-blobs εξαίρεσε μεγάλα αντικείμενα στην απόθεση\n" -#: pg_dump.c:1040 pg_restore.c:476 +#: pg_dump.c:1037 pg_restore.c:476 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" -msgstr " -c, —clean καθάρισε (εγκατάληψε) αντικείμενα βάσης δεδομένων πριν από την αναδημιουργία\n" +msgstr " -c, --clean καθάρισε (εγκατάληψε) αντικείμενα βάσης δεδομένων πριν από την αναδημιουργία\n" -#: pg_dump.c:1041 +#: pg_dump.c:1038 #, c-format msgid " -C, --create include commands to create database in dump\n" -msgstr " -C, —create συμπεριέλαβε εντολές για τη δημιουργία βάσης δεδομένων στην απόθεση\n" +msgstr " -C, --create συμπεριέλαβε εντολές για τη δημιουργία βάσης δεδομένων στην απόθεση\n" -#: pg_dump.c:1042 -#, fuzzy, c-format -#| msgid " -t, --table=PATTERN dump the specified table(s) only\n" +#: pg_dump.c:1039 +#, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" -msgstr " -t, —table=PATTERN απόθεση μόνο των καθορισμένων πινάκων\n" +msgstr " -e, --extension=PATTERN απόριψε μόνο τις καθορισμένες επεκτάσεις\n" -#: pg_dump.c:1043 pg_dumpall.c:634 +#: pg_dump.c:1040 pg_dumpall.c:634 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" -msgstr " -E, —encoding=ENCODING απόθεσε τα δεδομένα στην κωδικοποίηση ENCODING\n" +msgstr " -E, --encoding=ENCODING απόθεσε τα δεδομένα στην κωδικοποίηση ENCODING\n" -#: pg_dump.c:1044 +#: pg_dump.c:1041 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" -msgstr " -n, —schema=PATTERN απόθεση μόνο για τα καθορισμένα σχήματα\n" +msgstr " -n, --schema=PATTERN απόθεση μόνο για τα καθορισμένα σχήματα\n" -#: pg_dump.c:1045 +#: pg_dump.c:1042 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" -msgstr " -N, —exclude-schema=PATTERN να ΜΗΝ αποθέσει τα καθορισμένα σχήματα\n" +msgstr " -N, --exclude-schema=PATTERN να ΜΗΝ αποθέσει τα καθορισμένα σχήματα\n" -#: pg_dump.c:1046 +#: pg_dump.c:1043 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" " plain-text format\n" msgstr "" -" -O, —no-owner παράλειπε την αποκατάσταση της κυριότητας των αντικειμένων στη\n" +" -O, --no-owner παράλειπε την αποκατάσταση της κυριότητας των αντικειμένων στη\n" " μορφή απλού κειμένου\n" -#: pg_dump.c:1048 pg_dumpall.c:638 +#: pg_dump.c:1045 pg_dumpall.c:638 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" -msgstr " -s, —schema-only απόθεση μόνο το σχήμα, χωρίς δεδομένα\n" +msgstr " -s, --schema-only απόθεση μόνο το σχήμα, χωρίς δεδομένα\n" -#: pg_dump.c:1049 +#: pg_dump.c:1046 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" -msgstr " -S, —superuser=NAME όνομα χρήστη υπερ-χρήστη που θα χρησιμοποιηθεί σε μορφή απλού κειμένου\n" +msgstr " -S, --superuser=NAME όνομα χρήστη υπερ-χρήστη που θα χρησιμοποιηθεί σε μορφή απλού κειμένου\n" -#: pg_dump.c:1050 +#: pg_dump.c:1047 #, c-format msgid " -t, --table=PATTERN dump the specified table(s) only\n" -msgstr " -t, —table=PATTERN απόθεση μόνο των καθορισμένων πινάκων\n" +msgstr " -t, --table=PATTERN απόθεση μόνο των καθορισμένων πινάκων\n" -#: pg_dump.c:1051 +#: pg_dump.c:1048 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" -msgstr " -T, —exclude-table=PATTERN να ΜΗΝ αποθέτει τους καθορισμένους πίνακες\n" +msgstr " -T, --exclude-table=PATTERN να ΜΗΝ αποθέτει τους καθορισμένους πίνακες\n" -#: pg_dump.c:1052 pg_dumpall.c:641 +#: pg_dump.c:1049 pg_dumpall.c:641 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" -msgstr " -x, —no-privileges να ΜΗΝ αποθέτει δικαιώματα (εκχώρηση/ανάκληση)\n" +msgstr " -x, --no-privileges να ΜΗΝ αποθέτει δικαιώματα (εκχώρηση/ανάκληση)\n" -#: pg_dump.c:1053 pg_dumpall.c:642 +#: pg_dump.c:1050 pg_dumpall.c:642 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" -msgstr " —binary-upgrade μόνο για χρήση μόνο από βοηθητικά προγράμματα αναβάθμισης\n" +msgstr " --binary-upgrade μόνο για χρήση μόνο από βοηθητικά προγράμματα αναβάθμισης\n" -#: pg_dump.c:1054 pg_dumpall.c:643 +#: pg_dump.c:1051 pg_dumpall.c:643 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" -msgstr " —column-inserts αποθέτει δεδομένα ως εντολές INSERT με ονόματα στηλών\n" +msgstr " --column-inserts αποθέτει δεδομένα ως εντολές INSERT με ονόματα στηλών\n" -#: pg_dump.c:1055 pg_dumpall.c:644 +#: pg_dump.c:1052 pg_dumpall.c:644 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" -msgstr " —disable-dollar-quoting απενεργοποίησε την παράθεση δολαρίου, χρήση τυποποιημένης παράθεσης SQL\n" +msgstr " --disable-dollar-quoting απενεργοποίησε την παράθεση δολαρίου, χρήση τυποποιημένης παράθεσης SQL\n" -#: pg_dump.c:1056 pg_dumpall.c:645 pg_restore.c:493 +#: pg_dump.c:1053 pg_dumpall.c:645 pg_restore.c:493 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" -msgstr " —disable-triggers απενεργοποίησε τα εναύσματα κατά την επαναφορά δεδομένων-μόνο\n" +msgstr " --disable-triggers απενεργοποίησε τα εναύσματα κατά την επαναφορά δεδομένων-μόνο\n" -#: pg_dump.c:1057 +#: pg_dump.c:1054 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" " access to)\n" msgstr "" -" —enable-row-security ενεργοποιήστε την ασφάλεια σειρών (απόθεση μόνο του περιεχομένου που ο χρήστης έχει\n" +" --enable-row-security ενεργοποιήστε την ασφάλεια σειρών (απόθεση μόνο του περιεχομένου που ο χρήστης έχει\n" " πρόσβαση)\n" -#: pg_dump.c:1059 +#: pg_dump.c:1056 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" -msgstr " —exclude-table-data=PATTERN να ΜΗΝ αποθέσει δεδομένα για τους καθορισμένους πίνακες\n" +msgstr " --exclude-table-data=PATTERN να ΜΗΝ αποθέσει δεδομένα για τους καθορισμένους πίνακες\n" -#: pg_dump.c:1060 pg_dumpall.c:647 +#: pg_dump.c:1057 pg_dumpall.c:647 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr " --extra-float-digits=NUM παράκαμψε την προεπιλεγμένη ρύθμιση για extra_float_digits\n" -#: pg_dump.c:1061 pg_dumpall.c:648 pg_restore.c:495 +#: pg_dump.c:1058 pg_dumpall.c:648 pg_restore.c:495 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" -msgstr " —if-exists χρησιμοποίησε το IF EXISTS κατά την εγκαταλήψη αντικειμένων\n" +msgstr " --if-exists χρησιμοποίησε το IF EXISTS κατά την εγκαταλήψη αντικειμένων\n" -#: pg_dump.c:1062 +#: pg_dump.c:1059 #, c-format msgid "" " --include-foreign-data=PATTERN\n" " include data of foreign tables on foreign\n" " servers matching PATTERN\n" msgstr "" -" —include-foreign-data=PATTERN\n" +" --include-foreign-data=PATTERN\n" " περιέλαβε δεδομένα ξένων πινάκων για\n" " διακομιστές που ταιριάζουν με PATTERN\n" -#: pg_dump.c:1065 pg_dumpall.c:649 +#: pg_dump.c:1062 pg_dumpall.c:649 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" -msgstr " —inserts απόθεσε δεδομένα ως εντολές INSERT, αντί για COPY\n" +msgstr " --inserts απόθεσε δεδομένα ως εντολές INSERT, αντί για COPY\n" -#: pg_dump.c:1066 pg_dumpall.c:650 +#: pg_dump.c:1063 pg_dumpall.c:650 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" -msgstr " —load-via-partition-root φόρτωσε διαχωρίσματα μέσω του βασικού πίνακα\n" +msgstr " --load-via-partition-root φόρτωσε διαχωρίσματα μέσω του βασικού πίνακα\n" -#: pg_dump.c:1067 pg_dumpall.c:651 +#: pg_dump.c:1064 pg_dumpall.c:651 #, c-format msgid " --no-comments do not dump comments\n" -msgstr " —no-comments να μην αποθέσεις σχόλια\n" +msgstr " --no-comments να μην αποθέσεις σχόλια\n" -#: pg_dump.c:1068 pg_dumpall.c:652 +#: pg_dump.c:1065 pg_dumpall.c:652 #, c-format msgid " --no-publications do not dump publications\n" -msgstr " —no-publications να μην αποθέσεις δημοσιεύσεις\n" +msgstr " --no-publications να μην αποθέσεις δημοσιεύσεις\n" -#: pg_dump.c:1069 pg_dumpall.c:654 +#: pg_dump.c:1066 pg_dumpall.c:654 #, c-format msgid " --no-security-labels do not dump security label assignments\n" -msgstr " —no-security-labels να μην αποθέσεις αντιστοιχίσεις ετικετών ασφαλείας\n" +msgstr " --no-security-labels να μην αποθέσεις αντιστοιχίσεις ετικετών ασφαλείας\n" -#: pg_dump.c:1070 pg_dumpall.c:655 +#: pg_dump.c:1067 pg_dumpall.c:655 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" -msgstr " —no-publications να μην αποθέσεις συνδρομές\n" +msgstr " --no-publications να μην αποθέσεις συνδρομές\n" -#: pg_dump.c:1071 +#: pg_dump.c:1068 #, c-format msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n" -msgstr " —no-synchronized-snapshots να μην χρησιμοποιήσει συγχρονισμένα στιγμιότυπα σε παράλληλες εργασίες\n" +msgstr " --no-synchronized-snapshots να μην χρησιμοποιήσει συγχρονισμένα στιγμιότυπα σε παράλληλες εργασίες\n" -#: pg_dump.c:1072 pg_dumpall.c:657 +#: pg_dump.c:1069 pg_dumpall.c:657 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" -msgstr " —no-tablespaces να μην αποθέσει αναθέσεις πινακοχώρος\n" +msgstr " --no-tablespaces να μην αποθέσει αναθέσεις πινακοχώρος\n" -#: pg_dump.c:1073 pg_dumpall.c:658 -#, fuzzy, c-format -#| msgid " --no-comments do not dump comments\n" +#: pg_dump.c:1070 pg_dumpall.c:658 +#, c-format msgid " --no-toast-compression do not dump TOAST compression methods\n" -msgstr " —no-comments να μην αποθέσεις σχόλια\n" +msgstr " --no-toast-compression να μην αποθέσει τις μεθόδους συμπίεσης TOAST\n" -#: pg_dump.c:1074 pg_dumpall.c:659 +#: pg_dump.c:1071 pg_dumpall.c:659 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" -msgstr " —no-unlogged-table-data να μην αποθέσει μη δεδομένα μη-καταγραμένου πίνακα\n" +msgstr " --no-unlogged-table-data να μην αποθέσει μη δεδομένα μη-καταγραμένου πίνακα\n" -#: pg_dump.c:1075 pg_dumpall.c:660 +#: pg_dump.c:1072 pg_dumpall.c:660 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" -msgstr " —on-conflict-do-nothing προσθέστε ON CONFLICT DO NOTHING στις εντολές INSERT\n" +msgstr " --on-conflict-do-nothing προσθέστε ON CONFLICT DO NOTHING στις εντολές INSERT\n" -#: pg_dump.c:1076 pg_dumpall.c:661 +#: pg_dump.c:1073 pg_dumpall.c:661 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" -msgstr " —quote-all-identifiers παράθεσε όλα τα αναγνωριστικά, ακόμα και αν δεν είναι λέξεις κλειδιά\n" +msgstr " --quote-all-identifiers παράθεσε όλα τα αναγνωριστικά, ακόμα και αν δεν είναι λέξεις κλειδιά\n" -#: pg_dump.c:1077 pg_dumpall.c:662 +#: pg_dump.c:1074 pg_dumpall.c:662 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" -msgstr " —rows-per-insert=NROWS αριθμός γραμμών ανά INSERT; υπονοεί —inserts\n" +msgstr " --rows-per-insert=NROWS αριθμός γραμμών ανά INSERT; υπονοεί --inserts\n" -#: pg_dump.c:1078 +#: pg_dump.c:1075 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" -msgstr " —section=SECTION απόθεσε ονομασμένες ενότητες (προ-δεδομένα, δεδομένα, ή μετα-δεδομένα)\n" +msgstr " --section=SECTION απόθεσε ονομασμένες ενότητες (προ-δεδομένα, δεδομένα, ή μετα-δεδομένα)\n" -#: pg_dump.c:1079 +#: pg_dump.c:1076 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" -msgstr " —serializable-deferrable ανάμενε έως ότου η απόθεση να μπορεί να τρέξει χωρίς ανωμαλίες\n" +msgstr " --serializable-deferrable ανάμενε έως ότου η απόθεση να μπορεί να τρέξει χωρίς ανωμαλίες\n" -#: pg_dump.c:1080 +#: pg_dump.c:1077 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" -msgstr " —snapshot=SNAPSHOT χρησιμοποίησε το δοσμένο στιγμιότυπο για την απόθεση\n" +msgstr " --snapshot=SNAPSHOT χρησιμοποίησε το δοσμένο στιγμιότυπο για την απόθεση\n" -#: pg_dump.c:1081 pg_restore.c:504 +#: pg_dump.c:1078 pg_restore.c:504 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" " match at least one entity each\n" msgstr "" -" —strict-names απαίτησε τα μοτίβα περίληψης πίνακα ή/και σχήματος να\n" +" --strict-names απαίτησε τα μοτίβα περίληψης πίνακα ή/και σχήματος να\n" " αντιστοιχήσουν τουλάχιστον μία οντότητα το καθένα\n" -#: pg_dump.c:1083 pg_dumpall.c:663 pg_restore.c:506 +#: pg_dump.c:1080 pg_dumpall.c:663 pg_restore.c:506 #, c-format msgid "" " --use-set-session-authorization\n" " use SET SESSION AUTHORIZATION commands instead of\n" " ALTER OWNER commands to set ownership\n" msgstr "" -" —use-set-session-authorization\n" +" --use-set-session-authorization\n" " χρησιμοποιήσε τις εντολές SET SESSION AUTHORIZATION αντί των\n" " ALTER OWNER για τον ορισμό ιδιοκτησίας\n" -#: pg_dump.c:1087 pg_dumpall.c:667 pg_restore.c:510 +#: pg_dump.c:1084 pg_dumpall.c:667 pg_restore.c:510 #, c-format msgid "" "\n" @@ -1674,42 +1660,42 @@ msgstr "" "\n" "Επιλογές σύνδεσης:\n" -#: pg_dump.c:1088 +#: pg_dump.c:1085 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" -msgstr " -d, —dbname=DBNAME βάση δεδομένων για απόθεση\n" +msgstr " -d, --dbname=DBNAME βάση δεδομένων για απόθεση\n" -#: pg_dump.c:1089 pg_dumpall.c:669 pg_restore.c:511 +#: pg_dump.c:1086 pg_dumpall.c:669 pg_restore.c:511 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" -msgstr " -h, —host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n" +msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n" -#: pg_dump.c:1090 pg_dumpall.c:671 pg_restore.c:512 +#: pg_dump.c:1087 pg_dumpall.c:671 pg_restore.c:512 #, c-format msgid " -p, --port=PORT database server port number\n" -msgstr " -p, —port=PORT θύρα διακομιστή βάσης δεδομένων\n" +msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων\n" -#: pg_dump.c:1091 pg_dumpall.c:672 pg_restore.c:513 +#: pg_dump.c:1088 pg_dumpall.c:672 pg_restore.c:513 #, c-format msgid " -U, --username=NAME connect as specified database user\n" -msgstr " -U, —username=USERNAME σύνδεση ως ο ορισμένος χρήστης βάσης δεδομένων\n" +msgstr " -U, --username=USERNAME σύνδεση ως ο ορισμένος χρήστης βάσης δεδομένων\n" -#: pg_dump.c:1092 pg_dumpall.c:673 pg_restore.c:514 +#: pg_dump.c:1089 pg_dumpall.c:673 pg_restore.c:514 #, c-format msgid " -w, --no-password never prompt for password\n" -msgstr " -w, —no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n" +msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n" -#: pg_dump.c:1093 pg_dumpall.c:674 pg_restore.c:515 +#: pg_dump.c:1090 pg_dumpall.c:674 pg_restore.c:515 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" -msgstr " -W, —password αναγκαστική προτροπή κωδικού πρόσβασης (πρέπει να συμβεί αυτόματα)\n" +msgstr " -W, --password αναγκαστική προτροπή κωδικού πρόσβασης (πρέπει να συμβεί αυτόματα)\n" -#: pg_dump.c:1094 pg_dumpall.c:675 +#: pg_dump.c:1091 pg_dumpall.c:675 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" -msgstr " —role=ROLENAME κάνε SET ROLE πριν την απόθεση\n" +msgstr " --role=ROLENAME κάνε SET ROLE πριν την απόθεση\n" -#: pg_dump.c:1096 +#: pg_dump.c:1093 #, c-format msgid "" "\n" @@ -1719,25 +1705,25 @@ msgid "" msgstr "" "\n" "Εάν δεν παρέχεται όνομα βάσης δεδομένων, τότε χρησιμοποιείται η μεταβλητή\n" -"περιβάλλοντος PGDATABASE .\n" +"περιβάλλοντος PGDATABASE.\n" "\n" -#: pg_dump.c:1098 pg_dumpall.c:679 pg_restore.c:522 +#: pg_dump.c:1095 pg_dumpall.c:679 pg_restore.c:522 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Υποβάλετε αναφορές σφάλματων σε <%s>.\n" -#: pg_dump.c:1099 pg_dumpall.c:680 pg_restore.c:523 +#: pg_dump.c:1096 pg_dumpall.c:680 pg_restore.c:523 #, c-format msgid "%s home page: <%s>\n" msgstr "%s αρχική σελίδα: <%s>\n" -#: pg_dump.c:1118 pg_dumpall.c:504 +#: pg_dump.c:1115 pg_dumpall.c:504 #, c-format msgid "invalid client encoding \"%s\" specified" -msgstr "καθορίστηκε μη έγκυρη κωδικοποίηση προγράμματος-πελάτη \"%s\"" +msgstr "καθορίστηκε μη έγκυρη κωδικοποίηση προγράμματος-πελάτη «%s»" -#: pg_dump.c:1264 +#: pg_dump.c:1261 #, c-format msgid "" "Synchronized snapshots on standby servers are not supported by this server version.\n" @@ -1745,498 +1731,482 @@ msgid "" "synchronized snapshots." msgstr "" "Τα συγχρονισμένα στιγμιότυπα σε διακομιστές αναμονής δεν υποστηρίζονται από αυτήν την έκδοση διακομιστή.\n" -"Εκτελέστε με —no-synchronized-snapshots, εάν δεν χρειάζεστε\n" +"Εκτελέστε με --no-synchronized-snapshots, εάν δεν χρειάζεστε\n" "συγχρονισμένα στιγμιότυπα." -#: pg_dump.c:1333 +#: pg_dump.c:1330 #, c-format msgid "invalid output format \"%s\" specified" -msgstr "ορίστηκε μη έγκυρη μορφή εξόδου “%s”" +msgstr "ορίστηκε μη έγκυρη μορφή εξόδου «%s»" -#: pg_dump.c:1371 +#: pg_dump.c:1368 #, c-format msgid "no matching schemas were found for pattern \"%s\"" -msgstr "δεν βρέθηκαν σχήματα που να ταιριάζουν με το μοτίβο \"%s\"" +msgstr "δεν βρέθηκαν σχήματα που να ταιριάζουν με το μοτίβο «%s»" -#: pg_dump.c:1418 -#, fuzzy, c-format -#| msgid "no matching tables were found for pattern \"%s\"" +#: pg_dump.c:1415 +#, c-format msgid "no matching extensions were found for pattern \"%s\"" -msgstr "δεν βρέθηκαν πίνακες που να ταιριάζουν για το μοτίβο \"%s\"" +msgstr "δεν βρέθηκαν επεκτάσεις που ταιριάζουν με το μοτίβο «%s»" -#: pg_dump.c:1465 +#: pg_dump.c:1462 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" -msgstr "δεν βρέθηκαν ξένοι διακομιστές που να ταιριάζουν με το μοτίβο \"%s\"" +msgstr "δεν βρέθηκαν ξένοι διακομιστές που να ταιριάζουν με το μοτίβο «%s»" -#: pg_dump.c:1528 +#: pg_dump.c:1525 #, c-format msgid "no matching tables were found for pattern \"%s\"" -msgstr "δεν βρέθηκαν πίνακες που να ταιριάζουν για το μοτίβο \"%s\"" +msgstr "δεν βρέθηκαν πίνακες που να ταιριάζουν για το μοτίβο «%s»" -#: pg_dump.c:1951 +#: pg_dump.c:1948 #, c-format msgid "dumping contents of table \"%s.%s\"" -msgstr "αποθέτει τα δεδομένα του πίνακα “%s.%s”" +msgstr "αποθέτει τα δεδομένα του πίνακα «%s.%s»" -#: pg_dump.c:2058 +#: pg_dump.c:2055 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." -msgstr "Η απόθεση των περιεχομένων του πίνακα \"%s\" απέτυχε: PQgetCopyData() απέτυχε." +msgstr "Η απόθεση των περιεχομένων του πίνακα «%s» απέτυχε: PQgetCopyData() απέτυχε." -#: pg_dump.c:2059 pg_dump.c:2069 +#: pg_dump.c:2056 pg_dump.c:2066 #, c-format msgid "Error message from server: %s" msgstr "Μήνυμα σφάλματος από διακομιστή: %s" -#: pg_dump.c:2060 pg_dump.c:2070 +#: pg_dump.c:2057 pg_dump.c:2067 #, c-format msgid "The command was: %s" msgstr "Η εντολή ήταν: %s" -#: pg_dump.c:2068 +#: pg_dump.c:2065 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." -msgstr "Η απόθεση των περιεχομένων του πίνακα \"%s\" απέτυχε: PQgetResult() απέτυχε." +msgstr "Η απόθεση των περιεχομένων του πίνακα «%s» απέτυχε: PQgetResult() απέτυχε." -#: pg_dump.c:2828 +#: pg_dump.c:2825 #, c-format msgid "saving database definition" msgstr "αποθήκευση ορισμού βάσης δεδομένων" -#: pg_dump.c:3300 +#: pg_dump.c:3297 #, c-format msgid "saving encoding = %s" msgstr "αποθηκεύει encoding = %s" -#: pg_dump.c:3325 +#: pg_dump.c:3322 #, c-format msgid "saving standard_conforming_strings = %s" msgstr "αποθηκεύει standard_conforming_strings = %s" -#: pg_dump.c:3364 +#: pg_dump.c:3361 #, c-format msgid "could not parse result of current_schemas()" msgstr "δεν ήταν δυνατή η ανάλυση του αποτελέσματος της current_schemas()" -#: pg_dump.c:3383 +#: pg_dump.c:3380 #, c-format msgid "saving search_path = %s" msgstr "αποθηκεύει search_path = %s" -#: pg_dump.c:3436 -#, c-format -msgid "saving default_toast_compression = %s" -msgstr "" - -#: pg_dump.c:3475 +#: pg_dump.c:3420 #, c-format msgid "reading large objects" msgstr "ανάγνωση μεγάλων αντικειμένων" -#: pg_dump.c:3657 +#: pg_dump.c:3602 #, c-format msgid "saving large objects" msgstr "αποθηκεύει μεγάλων αντικειμένων" -#: pg_dump.c:3703 +#: pg_dump.c:3648 #, c-format msgid "error reading large object %u: %s" msgstr "σφάλμα κατά την ανάγνωση %u μεγάλου αντικειμένου: %s" -#: pg_dump.c:3755 +#: pg_dump.c:3732 #, c-format -msgid "reading row security enabled for table \"%s.%s\"" -msgstr "ανάγνωση ενεργοποιημένης ασφάλειας γραμμής για τον πίνακα \"%s.%s\"" +msgid "reading row-level security policies" +msgstr "διαβάζει πολιτικές ασφαλείας επιπέδου σειράς" -#: pg_dump.c:3786 -#, c-format -msgid "reading policies for table \"%s.%s\"" -msgstr "ανάγνωση πολιτικών για τον πίνακα \"%s.%s\"" - -#: pg_dump.c:3938 +#: pg_dump.c:3875 #, c-format msgid "unexpected policy command type: %c" msgstr "μη αναμενόμενος τύπος εντολής πολιτικής: %c" -#: pg_dump.c:4092 +#: pg_dump.c:4029 #, c-format msgid "owner of publication \"%s\" appears to be invalid" -msgstr "ο κάτοχος της δημοσίευσης \"%s\" φαίνεται να μην είναι έγκυρος" +msgstr "ο κάτοχος της δημοσίευσης «%s» φαίνεται να μην είναι έγκυρος" -#: pg_dump.c:4384 +#: pg_dump.c:4321 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "οι συνδρομές δεν απορρίπτονται, επειδή ο τρέχων χρήστης δεν είναι υπερχρήστης" -#: pg_dump.c:4455 +#: pg_dump.c:4392 #, c-format msgid "owner of subscription \"%s\" appears to be invalid" -msgstr "ο κάτοχος της συνδρομής \"%s\" φαίνεται να μην είναι έγκυρος" +msgstr "ο κάτοχος της συνδρομής «%s» φαίνεται να μην είναι έγκυρος" -#: pg_dump.c:4498 +#: pg_dump.c:4435 #, c-format msgid "could not parse subpublications array" -msgstr "δεν ήταν δυνατή η ανάλυση της συστυχίας υποδημοσιεύσεων" +msgstr "δεν ήταν δυνατή η ανάλυση της συστοιχίας υποδημοσιεύσεων" -#: pg_dump.c:4856 +#: pg_dump.c:4793 #, c-format msgid "could not find parent extension for %s %s" msgstr "δεν ήταν δυνατή η εύρεση γονικής επέκτασης για %s %s" -#: pg_dump.c:4988 +#: pg_dump.c:4925 #, c-format msgid "owner of schema \"%s\" appears to be invalid" -msgstr "ο κάτοχος του σχήματος \"%s\" φαίνεται να μην είναι έγκυρος" +msgstr "ο κάτοχος του σχήματος «%s» φαίνεται να μην είναι έγκυρος" -#: pg_dump.c:5011 +#: pg_dump.c:4948 #, c-format msgid "schema with OID %u does not exist" msgstr "το σχήμα με %u OID δεν υπάρχει" -#: pg_dump.c:5340 +#: pg_dump.c:5278 #, c-format msgid "owner of data type \"%s\" appears to be invalid" -msgstr "ο κάτοχος του τύπου δεδομένων \"%s\" φαίνεται να μην είναι έγκυρος" +msgstr "ο κάτοχος του τύπου δεδομένων «%s» φαίνεται να μην είναι έγκυρος" -#: pg_dump.c:5424 +#: pg_dump.c:5362 #, c-format msgid "owner of operator \"%s\" appears to be invalid" -msgstr "ο κάτοχος του χειριστή “%s” φαίνεται να μην είναι έγκυρος" +msgstr "ο κάτοχος του χειριστή «%s» φαίνεται να μην είναι έγκυρος" -#: pg_dump.c:5723 +#: pg_dump.c:5661 #, c-format msgid "owner of operator class \"%s\" appears to be invalid" -msgstr "ο κάτοχος της κλάσης χειριστή \"%s\" φαίνεται να μην είναι έγκυρος" +msgstr "ο κάτοχος της κλάσης χειριστή «%s» φαίνεται να μην είναι έγκυρος" -#: pg_dump.c:5806 +#: pg_dump.c:5744 #, c-format msgid "owner of operator family \"%s\" appears to be invalid" -msgstr "ο κάτοχος της οικογένειας χειριστών \"%s\" φαίνεται να μην είναι έγκυρος" +msgstr "ο κάτοχος της οικογένειας χειριστών «%s» φαίνεται να μην είναι έγκυρος" -#: pg_dump.c:5974 +#: pg_dump.c:5912 #, c-format msgid "owner of aggregate function \"%s\" appears to be invalid" -msgstr "ο κάτοχος της συνάρτησης συγκεντρωτικών αποτελεσμάτων \"%s\" φαίνεται να μην είναι έγκυρος" +msgstr "ο κάτοχος της συνάρτησης συγκεντρωτικών αποτελεσμάτων «%s» φαίνεται να μην είναι έγκυρος" -#: pg_dump.c:6233 +#: pg_dump.c:6171 #, c-format msgid "owner of function \"%s\" appears to be invalid" -msgstr "ο κάτοχος της συνάρτησης \"%s\" φαίνεται να μην είναι έγκυρος" +msgstr "ο κάτοχος της συνάρτησης «%s» φαίνεται να μην είναι έγκυρος" -#: pg_dump.c:7060 +#: pg_dump.c:6998 #, c-format msgid "owner of table \"%s\" appears to be invalid" -msgstr "ο κάτοχος του πίνακα \"%s\" φαίνεται να μην είναι έγκυρος" +msgstr "ο κάτοχος του πίνακα «%s» φαίνεται να μην είναι έγκυρος" -#: pg_dump.c:7102 pg_dump.c:17493 +#: pg_dump.c:7040 pg_dump.c:17473 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "απέτυχε ο έλεγχος ακεραιότητας, ο γονικός πίνακας με OID %u της ακολουθίας με OID %u δεν βρέθηκε" -#: pg_dump.c:7241 +#: pg_dump.c:7179 #, c-format msgid "reading indexes for table \"%s.%s\"" -msgstr "ανάγνωση ευρετηρίων για τον πίνακα \"%s.%s\"" +msgstr "ανάγνωση ευρετηρίων για τον πίνακα «%s.%s»" -#: pg_dump.c:7655 +#: pg_dump.c:7593 #, c-format msgid "reading foreign key constraints for table \"%s.%s\"" -msgstr "ανάγνωση περιορισμών ξένου κλειδιού για τον πίνακα \"%s.%s\"" +msgstr "ανάγνωση περιορισμών ξένου κλειδιού για τον πίνακα «%s.%s»" -#: pg_dump.c:7934 +#: pg_dump.c:7872 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "απέτυχε ο έλεγχος ακεραιότητας, ο γονικός πίνακας με OID %u της καταχώρησης pg_rewrite με OID %u δεν βρέθηκε" -#: pg_dump.c:8017 +#: pg_dump.c:7956 #, c-format msgid "reading triggers for table \"%s.%s\"" -msgstr "ανάγνωση εναυσμάτων για τον πίνακα “%s.%s”" +msgstr "ανάγνωση εναυσμάτων για τον πίνακα «%s.%s»" -#: pg_dump.c:8150 +#: pg_dump.c:8138 #, c-format msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" -msgstr "το ερώτημα παρήγαγε null πίνακα αναφοράς για το έναυσμα ξένου κλειδιού \"%s\" στον πίνακα \"%s\" (OID του πίνακα: %u)" +msgstr "το ερώτημα παρήγαγε null πίνακα αναφοράς για το έναυσμα ξένου κλειδιού «%s» στον πίνακα «%s» (OID του πίνακα: %u)" -#: pg_dump.c:8700 +#: pg_dump.c:8688 #, c-format msgid "finding the columns and types of table \"%s.%s\"" -msgstr "εύρεση των στηλών και των τύπων του πίνακα “%s.%s”" +msgstr "εύρεση των στηλών και των τύπων του πίνακα «%s.%s»" -#: pg_dump.c:8824 +#: pg_dump.c:8812 #, c-format msgid "invalid column numbering in table \"%s\"" -msgstr "μη έγκυρη αρίθμηση στηλών στον πίνακα \"%s\"" +msgstr "μη έγκυρη αρίθμηση στηλών στον πίνακα «%s»" -#: pg_dump.c:8863 +#: pg_dump.c:8851 #, c-format msgid "finding default expressions of table \"%s.%s\"" -msgstr "εύρεση προεπιλεγμένων εκφράσεων για τον πίνακα \"%s.%s\"" +msgstr "εύρεση προεπιλεγμένων εκφράσεων για τον πίνακα «%s.%s»" -#: pg_dump.c:8885 +#: pg_dump.c:8873 #, c-format msgid "invalid adnum value %d for table \"%s\"" -msgstr "μη έγκυρη τιμή adnum %d για τον πίνακα \"%s\"" +msgstr "μη έγκυρη τιμή adnum %d για τον πίνακα «%s»" -#: pg_dump.c:8978 +#: pg_dump.c:8966 #, c-format msgid "finding check constraints for table \"%s.%s\"" -msgstr "εύρεση περιορισμών ελέγχου για τον πίνακα \"%s.%s\"" +msgstr "εύρεση περιορισμών ελέγχου για τον πίνακα «%s.%s»" -#: pg_dump.c:9027 +#: pg_dump.c:9015 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" -msgstr[0] "αναμενόμενος %d περιορισμός ελέγχου στον πίνακα \"%s\", αλλά βρήκε %d" -msgstr[1] "αναμενόμενοι %d περιορισμοί ελέγχου στον πίνακα “%s”, αλλά βρήκε %d" +msgstr[0] "αναμενόμενος %d περιορισμός ελέγχου στον πίνακα «%s», αλλά βρήκε %d" +msgstr[1] "αναμενόμενοι %d περιορισμοί ελέγχου στον πίνακα «%s», αλλά βρήκε %d" -#: pg_dump.c:9031 +#: pg_dump.c:9019 #, c-format msgid "(The system catalogs might be corrupted.)" msgstr "(Οι κατάλογοι συστήματος ενδέχεται να είναι αλλοιωμένοι.)" -#: pg_dump.c:10616 +#: pg_dump.c:10621 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" -msgstr "typtype του τύπου δεδομένων \"%s\" φαίνεται να μην είναι έγκυρο" +msgstr "typtype του τύπου δεδομένων «%s» φαίνεται να μην είναι έγκυρο" -#: pg_dump.c:11968 +#: pg_dump.c:11969 #, c-format msgid "bogus value in proargmodes array" -msgstr "πλαστή τιμή στη συστυχία proargmodes" +msgstr "πλαστή τιμή στη συστοιχία proargmodes" -#: pg_dump.c:12275 +#: pg_dump.c:12271 #, c-format msgid "could not parse proallargtypes array" -msgstr "δεν ήταν δυνατή η ανάλυση συστυχίας proallargtypes" +msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας proallargtypes" -#: pg_dump.c:12291 +#: pg_dump.c:12287 #, c-format msgid "could not parse proargmodes array" -msgstr "δεν ήταν δυνατή η ανάλυση συστυχίας proargmodes" +msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας proargmodes" -#: pg_dump.c:12305 +#: pg_dump.c:12301 #, c-format msgid "could not parse proargnames array" -msgstr "δεν ήταν δυνατή η ανάλυση συστυχίας proargnames" +msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας proargnames" -#: pg_dump.c:12315 +#: pg_dump.c:12311 #, c-format msgid "could not parse proconfig array" -msgstr "δεν ήταν δυνατή η ανάλυση συστυχίας proconfig" +msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας proconfig" -#: pg_dump.c:12395 +#: pg_dump.c:12387 #, c-format msgid "unrecognized provolatile value for function \"%s\"" -msgstr "μη αναγνωρίσιμη τιμή provolatile για τη συνάρτηση \"%s\"" +msgstr "μη αναγνωρίσιμη τιμή provolatile για τη συνάρτηση «%s»" -#: pg_dump.c:12445 pg_dump.c:14396 +#: pg_dump.c:12437 pg_dump.c:14378 #, c-format msgid "unrecognized proparallel value for function \"%s\"" -msgstr "μη αναγνωρίσιμη τιμή proparallel για τη συνάρτηση “%s”" +msgstr "μη αναγνωρίσιμη τιμή proparallel για τη συνάρτηση «%s»" -#: pg_dump.c:12584 pg_dump.c:12693 pg_dump.c:12700 +#: pg_dump.c:12576 pg_dump.c:12682 pg_dump.c:12689 #, c-format msgid "could not find function definition for function with OID %u" msgstr "δεν ήταν δυνατή η εύρεση ορισμού συνάντησης για την συνάρτηση με OID %u" -#: pg_dump.c:12623 +#: pg_dump.c:12615 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "πλαστή τιμή στο πεδίο pg_cast.castfunc ή pg_cast.castmethod" -#: pg_dump.c:12626 +#: pg_dump.c:12618 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "πλαστή τιμή στο πεδίο pg_cast.castmethod" -#: pg_dump.c:12719 +#: pg_dump.c:12708 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "πλαστός ορισμός μετασχηματισμού, τουλάχιστον μία από trffromsql και trftosql θα πρέπει να είναι μη μηδενική" -#: pg_dump.c:12736 +#: pg_dump.c:12725 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "πλαστή τιμή στο πεδίο pg_transform.trffromsql" -#: pg_dump.c:12757 +#: pg_dump.c:12746 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "πλαστή τιμή στο πεδίοpg_transform.trftosql" -#: pg_dump.c:12909 -#, fuzzy, c-format -#| msgid "WITH OIDS is not supported anymore (table \"%s\")" +#: pg_dump.c:12897 +#, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" -msgstr "WITH OIDS δεν υποστηρίζεται πλέον (πίνακας \"%s\")" +msgstr "χειριστές postfix δεν υποστηρίζεται πλέον (χειριστής «%s»)" -#: pg_dump.c:13079 +#: pg_dump.c:13067 #, c-format msgid "could not find operator with OID %s" msgstr "δεν ήταν δυνατή η εύρεση χειριστή με OID %s" -#: pg_dump.c:13147 +#: pg_dump.c:13135 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" -msgstr "μη έγκυρος τύπος \"%c\" για την μεθόδο πρόσβασης \"%s\"" +msgstr "μη έγκυρος τύπος «%c» για την μεθόδο πρόσβασης «%s»" -#: pg_dump.c:13901 +#: pg_dump.c:13889 #, c-format msgid "unrecognized collation provider: %s" msgstr "μη αναγνωρίσιμος πάροχος συρραφής: %s" -#: pg_dump.c:14315 +#: pg_dump.c:14297 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" -msgstr "μη αναγνωρίσιμη τιμή aggfinalmodify για το συγκεντρωτικό \"%s\"" +msgstr "μη αναγνωρίσιμη τιμή aggfinalmodify για το συγκεντρωτικό «%s»" -#: pg_dump.c:14371 +#: pg_dump.c:14353 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" -msgstr "μη αναγνωρίσιμη τιμή aggmfinalmodify για το συγκεντρωτικό “%s”" +msgstr "μη αναγνωρίσιμη τιμή aggmfinalmodify για το συγκεντρωτικό «%s»" -#: pg_dump.c:15093 +#: pg_dump.c:15075 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "μη αναγνωρίσιμος τύπος αντικειμένου σε προεπιλεγμένα δικαιώματα: %d" -#: pg_dump.c:15111 +#: pg_dump.c:15093 #, c-format msgid "could not parse default ACL list (%s)" msgstr "δεν ήταν δυνατή η ανάλυση της προεπιλεγμένης λίστας ACL (%s)" -#: pg_dump.c:15196 +#: pg_dump.c:15178 #, c-format msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)" -msgstr "δεν ήταν δυνατή η ανάλυση της αρχικής λίστας ACL GRANT (%s) ή της αρχικής λίστας REVOKE ACL (%s) για το αντικείμενο \"%s\" (%s)" +msgstr "δεν ήταν δυνατή η ανάλυση της αρχικής λίστας ACL GRANT (%s) ή της αρχικής λίστας REVOKE ACL (%s) για το αντικείμενο «%s» (%s)" -#: pg_dump.c:15204 +#: pg_dump.c:15186 #, c-format msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)" -msgstr "δεν ήταν δυνατή η ανάλυση της λίστας GRANT ACL (%s) ή της λίστας REVOKE ACL (%s) για το αντικείμενο \"%s\" (%s)" +msgstr "δεν ήταν δυνατή η ανάλυση της λίστας GRANT ACL (%s) ή της λίστας REVOKE ACL (%s) για το αντικείμενο «%s» (%s)" -#: pg_dump.c:15719 +#: pg_dump.c:15701 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" -msgstr "το ερώτημα για τη λήψη ορισμού της όψης \"%s\" δεν επέστρεψε δεδομένα" +msgstr "το ερώτημα για τη λήψη ορισμού της όψης «%s» δεν επέστρεψε δεδομένα" -#: pg_dump.c:15722 +#: pg_dump.c:15704 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" -msgstr "το ερώτημα για τη λήψη ορισμού της όψης \"%s\" επέστρεψε περισσότερους από έναν ορισμούς" +msgstr "το ερώτημα για τη λήψη ορισμού της όψης «%s» επέστρεψε περισσότερους από έναν ορισμούς" -#: pg_dump.c:15729 +#: pg_dump.c:15711 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" -msgstr "ο ορισμός της όψης \"%s\" φαίνεται να είναι κενός (μηδενικό μήκος)" +msgstr "ο ορισμός της όψης «%s» φαίνεται να είναι κενός (μηδενικό μήκος)" -#: pg_dump.c:15813 +#: pg_dump.c:15795 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" -msgstr "WITH OIDS δεν υποστηρίζεται πλέον (πίνακας \"%s\")" +msgstr "WITH OIDS δεν υποστηρίζεται πλέον (πίνακας «%s»)" -#: pg_dump.c:16680 +#: pg_dump.c:16660 #, c-format msgid "invalid column number %d for table \"%s\"" -msgstr "μη έγκυρος αριθμός στήλης %d για τον πίνακα \"%s\"" +msgstr "μη έγκυρος αριθμός στήλης %d για τον πίνακα «%s»" -#: pg_dump.c:16757 -#, fuzzy, c-format -#| msgid "could not parse default ACL list (%s)" +#: pg_dump.c:16737 +#, c-format msgid "could not parse index statistic columns" -msgstr "δεν ήταν δυνατή η ανάλυση της προεπιλεγμένης λίστας ACL (%s)" +msgstr "δεν ήταν δυνατή η ανάλυση στηλών στατιστικής ευρετηρίου" -#: pg_dump.c:16759 -#, fuzzy, c-format -#| msgid "could not parse default ACL list (%s)" +#: pg_dump.c:16739 +#, c-format msgid "could not parse index statistic values" -msgstr "δεν ήταν δυνατή η ανάλυση της προεπιλεγμένης λίστας ACL (%s)" +msgstr "δεν ήταν δυνατή η ανάλυση ευρετηρίου στατιστικών τιμών" -#: pg_dump.c:16761 +#: pg_dump.c:16741 #, c-format msgid "mismatched number of columns and values for index statistics" -msgstr "" +msgstr "ασυμφωνία αριθμού στηλών και τιμών για στατιστικά στοιχεία ευρετηρίου" -#: pg_dump.c:16978 +#: pg_dump.c:16958 #, c-format msgid "missing index for constraint \"%s\"" -msgstr "λείπει ευρετήριο για τον περιορισμό \"%s\"" +msgstr "λείπει ευρετήριο για τον περιορισμό «%s»" -#: pg_dump.c:17203 +#: pg_dump.c:17183 #, c-format msgid "unrecognized constraint type: %c" msgstr "μη αναγνωρίσιμος τύπος περιορισμού: %c" -#: pg_dump.c:17335 pg_dump.c:17558 +#: pg_dump.c:17315 pg_dump.c:17538 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" -msgstr[0] "ερώτημα για τη λήψη δεδομένων ακολουθίας \"%s\" επέστρεψε %d γραμμή (αναμένεται 1)" -msgstr[1] "ερώτημα για τη λήψη δεδομένων ακολουθίας “%s” επέστρεψε %d γραμμές (αναμένεται 1)" +msgstr[0] "ερώτημα για τη λήψη δεδομένων ακολουθίας «%s» επέστρεψε %d γραμμή (αναμένεται 1)" +msgstr[1] "ερώτημα για τη λήψη δεδομένων ακολουθίας «%s» επέστρεψε %d γραμμές (αναμένεται 1)" -#: pg_dump.c:17369 +#: pg_dump.c:17349 #, c-format msgid "unrecognized sequence type: %s" msgstr "μη αναγνωρίσιμος τύπος ακολουθίας: %s" -#: pg_dump.c:17656 +#: pg_dump.c:17636 #, c-format msgid "unexpected tgtype value: %d" msgstr "μη αναγνωρίσιμος τύπος tgtype: %d" -#: pg_dump.c:17730 +#: pg_dump.c:17710 #, c-format msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" -msgstr "μη έγκυρη συμβολοσειρά παραμέτρου (%s) για το έναυσμα \"%s\" στον πίνακα \"%s\"" +msgstr "μη έγκυρη συμβολοσειρά παραμέτρου (%s) για το έναυσμα «%s» στον πίνακα «%s»" -#: pg_dump.c:17966 +#: pg_dump.c:17979 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" -msgstr "ερώτημα για τη λήψη κανόνα \"%s\" για τον πίνακα \"%s\" απέτυχε: επιστράφηκε εσφαλμένος αριθμός γραμμών" +msgstr "ερώτημα για τη λήψη κανόνα «%s» για τον πίνακα «%s» απέτυχε: επιστράφηκε εσφαλμένος αριθμός γραμμών" -#: pg_dump.c:18128 +#: pg_dump.c:18141 #, c-format msgid "could not find referenced extension %u" msgstr "δεν ήταν δυνατή η εύρεση της αναφερόμενης επέκτασης %u" -#: pg_dump.c:18219 -#, fuzzy, c-format -#| msgid "could not parse proconfig array" +#: pg_dump.c:18232 +#, c-format msgid "could not parse extension configuration array" -msgstr "δεν ήταν δυνατή η ανάλυση συστυχίας proconfig" +msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας ρύθμισεων επέκτασης" -#: pg_dump.c:18221 -#, fuzzy, c-format -#| msgid "could not parse reloptions array" +#: pg_dump.c:18234 +#, c-format msgid "could not parse extension condition array" -msgstr "δεν ήταν δυνατή η ανάλυση συστυχίας reloptions" +msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας προϋποθέσεων επέκτασης" -#: pg_dump.c:18223 +#: pg_dump.c:18236 #, c-format msgid "mismatched number of configurations and conditions for extension" -msgstr "" +msgstr "ασυμφωνία αριθμού διαμορφώσεων και συνθηκών για επέκταση" -#: pg_dump.c:18355 +#: pg_dump.c:18368 #, c-format msgid "reading dependency data" msgstr "ανάγνωση δεδομένων εξάρτησης" -#: pg_dump.c:18448 +#: pg_dump.c:18461 #, c-format msgid "no referencing object %u %u" msgstr "δεν αναφέρεται αντικείμενο %u %u" -#: pg_dump.c:18459 +#: pg_dump.c:18472 #, c-format msgid "no referenced object %u %u" msgstr "μη αναφερόμενο αντικείμενο %u %u" -#: pg_dump.c:18833 +#: pg_dump.c:18861 #, c-format msgid "could not parse reloptions array" -msgstr "δεν ήταν δυνατή η ανάλυση συστυχίας reloptions" +msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας reloptions" #: pg_dump_sort.c:411 #, c-format @@ -2273,7 +2243,7 @@ msgstr "Ενδέχεται να μην μπορείτε να επαναφέρε #: pg_dump_sort.c:1227 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." -msgstr "Εξετάστε το ενδεχόμενο να χρησιμοποιήσετε μια πλήρη απόθεση αντί για μια —data-only απόθεση για να αποφύγετε αυτό το πρόβλημα." +msgstr "Εξετάστε το ενδεχόμενο να χρησιμοποιήσετε μια πλήρη απόθεση αντί για μια --data-only απόθεση για να αποφύγετε αυτό το πρόβλημα." #: pg_dump_sort.c:1239 #, c-format @@ -2287,8 +2257,8 @@ msgid "" "same directory as \"%s\".\n" "Check your installation." msgstr "" -"Το πρόγραμμα \"%s\" απαιτείται από %s αλλά δεν βρέθηκε στο\n" -"ίδιος κατάλογος με το \"%s\".\n" +"Το πρόγραμμα «%s» απαιτείται από %s αλλά δεν βρέθηκε στον\n" +"ίδιο κατάλογο με το «%s».\n" "Ελέγξτε την εγκατάστασή σας." #: pg_dumpall.c:207 @@ -2298,34 +2268,34 @@ msgid "" "but was not the same version as %s.\n" "Check your installation." msgstr "" -"Το πρόγραμμα \"%s\" βρέθηκε από το \"%s\"\n" +"Το πρόγραμμα «%s» βρέθηκε από το \"%s\"\n" "αλλά δεν ήταν η ίδια εκδοχή με %s.\n" "Ελέγξτε την εγκατάστασή σας." #: pg_dumpall.c:359 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" -msgstr "επιλογή —exclude-database δεν μπορεί να χρησιμοποιηθεί μαζί με -g/—globals-only, -r/—roles-only, ή -t/—tablespaces-only" +msgstr "επιλογή --exclude-database δεν μπορεί να χρησιμοποιηθεί μαζί με -g/--globals-only, -r/--roles-only, ή -t/--tablespaces-only" #: pg_dumpall.c:368 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" -msgstr "οι επιλογές -g/—globals-only και -r/—roles-only δεν μπορούν να χρησιμοποιηθούν μαζί" +msgstr "οι επιλογές -g/--globals-only και -r/--roles-only δεν μπορούν να χρησιμοποιηθούν μαζί" #: pg_dumpall.c:376 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" -msgstr "Οι επιλογές -g/--καθολικές μόνο και -t/--επιτραπέζιοι χώροι δεν μπορούν να χρησιμοποιηθούν μαζί" +msgstr "οι επιλογές -g/--globals-only μόνο και -t/--tablespaces-only δεν είναι δυνατό να χρησιμοποιηθούν μαζί" #: pg_dumpall.c:390 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" -msgstr "οι επιλογές -r/—roles-only και -t/—tablespaces-only δεν μπορούν να χρησιμοποιηθούν μαζί" +msgstr "οι επιλογές -r/--roles-only και -t/--tablespaces-only δεν μπορούν να χρησιμοποιηθούν μαζί" #: pg_dumpall.c:453 pg_dumpall.c:1756 #, c-format msgid "could not connect to database \"%s\"" -msgstr "δεν ήταν δυνατή η σύνδεση στη βάση δεδομένων “%s”" +msgstr "δεν ήταν δυνατή η σύνδεση στη βάση δεδομένων «%s»" #: pg_dumpall.c:467 #, c-format @@ -2348,63 +2318,63 @@ msgstr "" #: pg_dumpall.c:623 #, c-format msgid " %s [OPTION]...\n" -msgstr " %s [ΕΠΙΛΟΓΗ]…\n" +msgstr " %s [ΕΠΙΛΟΓΗ]...\n" #: pg_dumpall.c:626 #, c-format msgid " -f, --file=FILENAME output file name\n" -msgstr " -f, —file=FILENAME όνομα αρχείου εξόδου\n" +msgstr " -f, --file=FILENAME όνομα αρχείου εξόδου\n" #: pg_dumpall.c:633 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" -msgstr " -c, —clean καθάρισε (εγκατάληψε) βάσεις δεδομένων πριν από την αναδημιουργία\n" +msgstr " -c, --clean καθάρισε (εγκατάληψε) βάσεις δεδομένων πριν από την αναδημιουργία\n" #: pg_dumpall.c:635 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" -msgstr " -g, —globals-only απόθεσε μόνο καθολικά αντικείμενα, όχι βάσεις δεδομένων\n" +msgstr " -g, --globals-only απόθεσε μόνο καθολικά αντικείμενα, όχι βάσεις δεδομένων\n" #: pg_dumpall.c:636 pg_restore.c:485 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" -msgstr " -O, —no-owner παράλειψε την αποκατάσταση της κυριότητας αντικειμένων\n" +msgstr " -O, --no-owner παράλειψε την αποκατάσταση της κυριότητας αντικειμένων\n" #: pg_dumpall.c:637 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" -msgstr " -r, —roles-only απόθεσε μόνο ρόλους, όχι βάσεις δεδομένων ή πινακοχώρους\n" +msgstr " -r, --roles-only απόθεσε μόνο ρόλους, όχι βάσεις δεδομένων ή πινακοχώρους\n" #: pg_dumpall.c:639 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" -msgstr " -S, —superuser=NAME όνομα υπερχρήστη για να χρησιμοποιηθεί στην απόθεση\n" +msgstr " -S, --superuser=NAME όνομα υπερχρήστη για να χρησιμοποιηθεί στην απόθεση\n" #: pg_dumpall.c:640 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" -msgstr " -t, —tablespaces-only απόθεσε μόνο πινακοχώρους, όχι βάσεις δεδομένων ή ρόλους\n" +msgstr " -t, --tablespaces-only απόθεσε μόνο πινακοχώρους, όχι βάσεις δεδομένων ή ρόλους\n" #: pg_dumpall.c:646 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" -msgstr " —exclude-database=PATTERN εξαίρεσε βάσεις δεδομένων των οποίων το όνομα ταιριάζει με PATTERN\n" +msgstr " --exclude-database=PATTERN εξαίρεσε βάσεις δεδομένων των οποίων το όνομα ταιριάζει με PATTERN\n" #: pg_dumpall.c:653 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" -msgstr " —no-role-passwords να μην αποθέσει κωδικούς πρόσβασης για ρόλους\n" +msgstr " --no-role-passwords να μην αποθέσει κωδικούς πρόσβασης για ρόλους\n" #: pg_dumpall.c:668 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" -msgstr " -d, —dbname=CONNSTR σύνδεση με χρήση συμβολοσειράς σύνδεσης\n" +msgstr " -d, --dbname=CONNSTR σύνδεση με χρήση συμβολοσειράς σύνδεσης\n" #: pg_dumpall.c:670 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr "" -" -l, —database=DBNAME εναλλακτική προεπιλεγμένη βάση δεδομένων\n" +" -l, --database=DBNAME εναλλακτική προεπιλεγμένη βάση δεδομένων\n" "\n" #: pg_dumpall.c:677 @@ -2416,44 +2386,44 @@ msgid "" "\n" msgstr "" "\n" -"Εάν δεν χρησιμοποιηθεί -f/—file , τότε η δέσμη ενεργειών SQL θα εγγραφεί στη τυπική\n" +"Εάν δεν χρησιμοποιηθεί -f/--file , τότε η δέσμη ενεργειών SQL θα εγγραφεί στη τυπική\n" "έξοδο.\n" "\n" #: pg_dumpall.c:883 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" -msgstr "όνομα ρόλου που αρχίζει \"pg_\" παραλείπεται (%s)" +msgstr "όνομα ρόλου που αρχίζει «pg_» παραλείπεται (%s)" #: pg_dumpall.c:1284 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" -msgstr "δεν ήταν δυνατή η ανάλυση της λίστας ACL (%s) για τον πινακοχώρο \"%s\"" +msgstr "δεν ήταν δυνατή η ανάλυση της λίστας ACL (%s) για τον πινακοχώρο «%s»" #: pg_dumpall.c:1501 #, c-format msgid "excluding database \"%s\"" -msgstr "εξαιρεί τη βάση δεδομένων \"%s\"" +msgstr "εξαιρεί τη βάση δεδομένων «%s»" #: pg_dumpall.c:1505 #, c-format msgid "dumping database \"%s\"" -msgstr "αποθέτει τη βάση δεδομένων “%s”" +msgstr "αποθέτει τη βάση δεδομένων «%s»" #: pg_dumpall.c:1537 #, c-format msgid "pg_dump failed on database \"%s\", exiting" -msgstr "pg_dump απέτυχε στη βάση δεδομένων \"%s\", εξέρχεται" +msgstr "pg_dump απέτυχε στη βάση δεδομένων «%s», εξέρχεται" #: pg_dumpall.c:1546 #, c-format msgid "could not re-open the output file \"%s\": %m" -msgstr "δεν ήταν δυνατό το εκ νέου άνοιγμα του αρχείου εξόδου \"%s\": %m" +msgstr "δεν ήταν δυνατό το εκ νέου άνοιγμα του αρχείου εξόδου «%s»: %m" #: pg_dumpall.c:1590 #, c-format msgid "running \"%s\"" -msgstr "εκτελείται “%s”" +msgstr "εκτελείται «%s»" #: pg_dumpall.c:1805 #, c-format @@ -2463,7 +2433,7 @@ msgstr "δεν ήταν δυνατή η απόκτηση έκδοσης διακ #: pg_dumpall.c:1811 #, c-format msgid "could not parse server version \"%s\"" -msgstr "δεν ήταν δυνατή η ανάλυση έκδοσης διακομιστή “%s”" +msgstr "δεν ήταν δυνατή η ανάλυση έκδοσης διακομιστή «%s»" #: pg_dumpall.c:1883 pg_dumpall.c:1906 #, c-format @@ -2478,7 +2448,7 @@ msgstr "ένα από τα -d/--dbname και -f/--file πρέπει να καθ #: pg_restore.c:317 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" -msgstr "οι επιλογές -d/—dbname και -f/—file δεν μπορούν να χρησιμοποιηθούν μαζί" +msgstr "οι επιλογές -d/--dbname και -f/--file δεν μπορούν να χρησιμοποιηθούν μαζί" #: pg_restore.c:343 #, c-format @@ -2493,12 +2463,12 @@ msgstr "ο μέγιστος αριθμός παράλληλων εργασιών #: pg_restore.c:366 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" -msgstr "δεν είναι δυνατό να οριστούν —single-transaction και multiple jobs και τα δύο μαζί " +msgstr "δεν είναι δυνατό να οριστούν μαζί --single-transaction και multiple jobs" #: pg_restore.c:408 #, c-format msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" -msgstr "μη αναγνωρισμένη μορφή αρχειοθέτησης “%s”· παρακαλώ καθορίστε \"c\", \"d\" ή \"t\"" +msgstr "μη αναγνωρισμένη μορφή αρχειοθέτησης «%s»· παρακαλώ καθορίστε «c», «d» ή «t»" #: pg_restore.c:448 #, c-format @@ -2517,42 +2487,42 @@ msgstr "" #: pg_restore.c:463 #, c-format msgid " %s [OPTION]... [FILE]\n" -msgstr " %s [OPTION]… [FILE]\n" +msgstr " %s [ΕΠΙΛΟΓΗ]... [ΑΡΧΕΙΟ]\n" #: pg_restore.c:466 #, c-format msgid " -d, --dbname=NAME connect to database name\n" -msgstr " -d, —dbname=NAME σύνδεση με τη βάσης δεδομένων με όνομα\n" +msgstr " -d, --dbname=NAME σύνδεση με τη βάσης δεδομένων με όνομα\n" #: pg_restore.c:467 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" -msgstr " -f, —file=FILENAME όνομα αρχείου εξόδου (- για stdout)\n" +msgstr " -f, --file=FILENAME όνομα αρχείου εξόδου (- για stdout)\n" #: pg_restore.c:468 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" -msgstr " -F, —format=c|d|t μορφή αρχείου αντιγράφου ασφαλείας (θα πρέπει να είναι αυτόματη)\n" +msgstr " -F, --format=c|d|t μορφή αρχείου αντιγράφου ασφαλείας (θα πρέπει να είναι αυτόματη)\n" #: pg_restore.c:469 #, c-format msgid " -l, --list print summarized TOC of the archive\n" -msgstr " -l, —list εκτύπωσε συνοπτικό TOC της αρχειοθήκης\n" +msgstr " -l, --list εκτύπωσε συνοπτικό TOC της αρχειοθήκης\n" #: pg_restore.c:470 #, c-format msgid " -v, --verbose verbose mode\n" -msgstr " -v, —verbose περιφραστική λειτουργία\n" +msgstr " -v, --verbose περιφραστική λειτουργία\n" #: pg_restore.c:471 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, —version εμφάνισε πληροφορίες έκδοσης και, στη συνέχεια, έξοδος\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" #: pg_restore.c:472 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, —help εμφάνισε αυτό το μήνυμα βοήθειας, και μετά έξοδος\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" #: pg_restore.c:474 #, c-format @@ -2566,27 +2536,27 @@ msgstr "" #: pg_restore.c:475 #, c-format msgid " -a, --data-only restore only the data, no schema\n" -msgstr " -a, —data-only επαναφέρε μόνο τα δεδομένα, όχι το σχήμα\n" +msgstr " -a, --data-only επαναφέρε μόνο τα δεδομένα, όχι το σχήμα\n" #: pg_restore.c:477 #, c-format msgid " -C, --create create the target database\n" -msgstr " -C, —create δημιούργησε τη βάσης δεδομένων προορισμού\n" +msgstr " -C, --create δημιούργησε τη βάσης δεδομένων προορισμού\n" #: pg_restore.c:478 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" -msgstr " -e, —exit-on-error να εξέλθει σε σφάλμα, η προεπιλογή είναι να συνεχίσει\n" +msgstr " -e, --exit-on-error να εξέλθει σε σφάλμα, η προεπιλογή είναι να συνεχίσει\n" #: pg_restore.c:479 #, c-format msgid " -I, --index=NAME restore named index\n" -msgstr " -I, —index=NAME επανάφερε το ευρετήριο με όνομα\n" +msgstr " -I, --index=NAME επανάφερε το ευρετήριο με όνομα\n" #: pg_restore.c:480 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" -msgstr " -j, —jobs=NUM χρησιμοποίησε τόσες πολλές παράλληλες εργασίες για την επαναφορά\n" +msgstr " -j, --jobs=NUM χρησιμοποίησε τόσες πολλές παράλληλες εργασίες για την επαναφορά\n" #: pg_restore.c:481 #, c-format @@ -2594,65 +2564,65 @@ msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" " selecting/ordering output\n" msgstr "" -" -L, —use-list=FILENAME χρησιμοποίησε τον πίνακα περιεχομένων από αυτό το αρχείο για\n" +" -L, --use-list=FILENAME χρησιμοποίησε τον πίνακα περιεχομένων από αυτό το αρχείο για\n" " επιλογή/ταξινόμηση εξόδου\n" #: pg_restore.c:483 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" -msgstr " -n, —schema=NAME επανάφερε μόνο αντικείμενα σε αυτό το σχήμα\n" +msgstr " -n, --schema=NAME επανάφερε μόνο αντικείμενα σε αυτό το σχήμα\n" #: pg_restore.c:484 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" -msgstr " -N, —exclude-schema=NAME να μην επαναφέρει αντικείμενα από αυτό το σχήμα\n" +msgstr " -N, --exclude-schema=NAME να μην επαναφέρει αντικείμενα από αυτό το σχήμα\n" #: pg_restore.c:486 #, c-format msgid " -P, --function=NAME(args) restore named function\n" -msgstr "P, —function=NAME(args) επανάφερε την καθορισμένη συνάρτηση\n" +msgstr " -P, --function=NAME(args) επανάφερε την καθορισμένη συνάρτηση\n" #: pg_restore.c:487 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" -msgstr " -s, —schema-only επανάφερε μόνο το σχήμα, χωρίς δεδομένα\n" +msgstr " -s, --schema-only επανάφερε μόνο το σχήμα, χωρίς δεδομένα\n" #: pg_restore.c:488 #, c-format msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n" -msgstr " -S, —superuser=NAME όνομα υπερχρήστη για χρήση κατά την απενεργοποίηση εναυσμάτων\n" +msgstr " -S, --superuser=NAME όνομα υπερχρήστη για χρήση κατά την απενεργοποίηση εναυσμάτων\n" #: pg_restore.c:489 #, c-format msgid " -t, --table=NAME restore named relation (table, view, etc.)\n" -msgstr " -t, —table=NAME επανάφερε την καθορισμένη σχέση (πίνακας, προβολή κ.λπ.)\n" +msgstr " -t, --table=NAME επανάφερε την καθορισμένη σχέση (πίνακας, προβολή κ.λπ.)\n" #: pg_restore.c:490 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr "" -" -T, —trigger=NAME επανάφερε το καθορισμένο έναυσμα\n" +" -T, --trigger=NAME επανάφερε το καθορισμένο έναυσμα\n" "\n" #: pg_restore.c:491 #, c-format msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" -msgstr " -x, —no-privileges παράλειπε την επαναφορά των δικαιωμάτων πρόσβασης (εκχώρηση/ανάκληση)\n" +msgstr " -x, --no-privileges παράλειπε την επαναφορά των δικαιωμάτων πρόσβασης (εκχώρηση/ανάκληση)\n" #: pg_restore.c:492 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" -msgstr " -1, —single-transaction επανάφερε ως μεμονωμένη συναλλαγή\n" +msgstr " -1, --single-transaction επανάφερε ως μεμονωμένη συναλλαγή\n" #: pg_restore.c:494 #, c-format msgid " --enable-row-security enable row security\n" -msgstr " —enable-row-security ενεργοποίησε ασφαλεία σειράς\n" +msgstr " --enable-row-security ενεργοποίησε ασφαλεία σειράς\n" #: pg_restore.c:496 #, c-format msgid " --no-comments do not restore comments\n" -msgstr " —no-comments να μην επαναφέρεις σχόλια\n" +msgstr " --no-comments να μην επαναφέρεις σχόλια\n" #: pg_restore.c:497 #, c-format @@ -2660,38 +2630,38 @@ msgid "" " --no-data-for-failed-tables do not restore data of tables that could not be\n" " created\n" msgstr "" -" —no-data-for-failed-tables να μην επαναφέρεις δεδομένα πινάκων που δεν ήταν\n" +" --no-data-for-failed-tables να μην επαναφέρεις δεδομένα πινάκων που δεν ήταν\n" " δυνατό να δημιουργήθουν\n" #: pg_restore.c:499 #, c-format msgid " --no-publications do not restore publications\n" -msgstr " —no-publications να μην επαναφέρεις δημοσιεύσεις\n" +msgstr " --no-publications να μην επαναφέρεις δημοσιεύσεις\n" #: pg_restore.c:500 #, c-format msgid " --no-security-labels do not restore security labels\n" -msgstr " —no-security-labels να μην επαναφέρεις ετικέτες ασφαλείας\n" +msgstr " --no-security-labels να μην επαναφέρεις ετικέτες ασφαλείας\n" #: pg_restore.c:501 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" -msgstr " —no-publications να μην επαναφέρεις συνδρομές\n" +msgstr " --no-publications να μην επαναφέρεις συνδρομές\n" #: pg_restore.c:502 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" -msgstr " —no-tablespaces να μην επαναφέρεις αναθέσεις πινακοχώρων\n" +msgstr " --no-tablespaces να μην επαναφέρεις αναθέσεις πινακοχώρων\n" #: pg_restore.c:503 #, c-format msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n" -msgstr " —section=SECTION επανάφερε ονομασμένες ενότητες (προ-δεδομένα, δεδομένα, ή μετα-δεδομένα)\n" +msgstr " --section=SECTION επανάφερε ονομασμένες ενότητες (προ-δεδομένα, δεδομένα, ή μετα-δεδομένα)\n" #: pg_restore.c:516 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" -msgstr " —role=ROLENAME κάνε SET ROLE πριν την επαναφορά\n" +msgstr " --role=ROLENAME κάνε SET ROLE πριν την επαναφορά\n" #: pg_restore.c:518 #, c-format @@ -2701,7 +2671,7 @@ msgid "" "multiple times to select multiple objects.\n" msgstr "" "\n" -"Οι επιλογές -I, -n, -N, -P, -t, -T και —section μπορούν να συνδυαστούν και να καθοριστούν\n" +"Οι επιλογές -I, -n, -N, -P, -t, -T και --section μπορούν να συνδυαστούν και να καθοριστούν\n" "πολλές φορές για την επιλογή πολλών αντικειμένων.\n" #: pg_restore.c:521 @@ -2716,13 +2686,13 @@ msgstr "" "\n" #~ msgid "could not connect to database \"%s\": %s" -#~ msgstr "δεν ήταν δυνατή η σύνδεση στη βάση δεδομένων “%s”: %s" +#~ msgstr "δεν ήταν δυνατή η σύνδεση στη βάση δεδομένων «%s»: %s" #~ msgid "aggregate function %s could not be dumped correctly for this database version; ignored" #~ msgstr "δεν ήταν δυνατή η σωστή απόθεση της συνάρτησης συγκεντρωτικών αποτελεσμάτων %s για αυτήν την έκδοση της βάσης δεδομένων· παραβλέπεται" #~ msgid "connection to database \"%s\" failed: %s" -#~ msgstr "σύνδεση στη βάση δεδομένων “%s” απέτυχε: %s" +#~ msgstr "σύνδεση στη βάση δεδομένων «%s» απέτυχε: %s" #~ msgid "could not write to large object (result: %lu, expected: %lu)" #~ msgstr "δεν ήταν δυνατή η εγγραφή σε μεγάλο αντικείμενο (αποτέλεσμα: %lu, αναμένεται: %lu)" @@ -2735,3 +2705,9 @@ msgstr "" #~ msgid "pclose failed: %m" #~ msgstr "απέτυχε η εντολή pclose: %m" + +#~ msgid "reading policies for table \"%s.%s\"" +#~ msgstr "ανάγνωση πολιτικών για τον πίνακα «%s.%s»" + +#~ msgid "reading row security enabled for table \"%s.%s\"" +#~ msgstr "ανάγνωση ενεργοποιημένης ασφάλειας γραμμής για τον πίνακα «%s.%s»" diff --git a/src/bin/pg_dump/po/es.po b/src/bin/pg_dump/po/es.po index b7d603e7aa..75535ed708 100644 --- a/src/bin/pg_dump/po/es.po +++ b/src/bin/pg_dump/po/es.po @@ -1,6 +1,6 @@ # Spanish message translation file for pg_dump # -# Copyright (c) 2003-2019, PostgreSQL Global Development Group +# Copyright (c) 2003-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Manuel Sugawara , 2003. @@ -9,10 +9,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_dump (PostgreSQL) 12\n" +"Project-Id-Version: pg_dump (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-14 19:48+0000\n" -"PO-Revision-Date: 2021-05-20 23:35-0500\n" +"POT-Creation-Date: 2022-01-12 04:18+0000\n" +"PO-Revision-Date: 2022-01-12 17:37-0500\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -20,7 +20,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: BlackCAT 1.1\n" #: ../../../src/common/logging.c:259 #, c-format @@ -368,13 +368,13 @@ msgstr "no se pudo descomprimir datos: %s" msgid "could not close compression library: %s" msgstr "no se pudo cerrar la biblioteca de compresión: %s" -#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:551 pg_backup_tar.c:554 +#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:554 pg_backup_tar.c:557 #, c-format msgid "could not read from input file: %s" msgstr "no se pudo leer el archivo de entrada: %s" -#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:552 -#: pg_backup_tar.c:787 pg_backup_tar.c:810 +#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553 +#: pg_backup_tar.c:790 pg_backup_tar.c:813 #, c-format msgid "could not read from input file: end of file" msgstr "no se pudo leer desde el archivo de entrada: fin de archivo" @@ -458,7 +458,7 @@ msgstr "pgpipe: no se pudo conectar el socket: código de error %d" msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: no se pudo aceptar la conexión: código de error %d" -#: pg_backup_archiver.c:278 pg_backup_archiver.c:1577 +#: pg_backup_archiver.c:278 pg_backup_archiver.c:1578 #, c-format msgid "could not close output file: %m" msgstr "no se pudo cerrar el archivo de salida: %m" @@ -575,7 +575,7 @@ msgid_plural "restored %d large objects" msgstr[0] "se reestableció %d objeto grande" msgstr[1] "se reestablecieron %d objetos grandes" -#: pg_backup_archiver.c:1304 pg_backup_tar.c:730 +#: pg_backup_archiver.c:1304 pg_backup_tar.c:733 #, c-format msgid "restoring large object with OID %u" msgstr "reestableciendo objeto grande con OID %u" @@ -585,7 +585,7 @@ msgstr "reestableciendo objeto grande con OID %u" msgid "could not create large object %u: %s" msgstr "no se pudo crear el objeto grande %u: %s" -#: pg_backup_archiver.c:1321 pg_dump.c:3693 +#: pg_backup_archiver.c:1321 pg_dump.c:3673 #, c-format msgid "could not open large object %u: %s" msgstr "no se pudo abrir el objeto grande %u: %s" @@ -606,14 +606,14 @@ msgid "could not find entry for ID %d" msgstr "no se pudo encontrar una entrada para el ID %d" #: pg_backup_archiver.c:1435 pg_backup_directory.c:222 -#: pg_backup_directory.c:598 +#: pg_backup_directory.c:599 #, c-format msgid "could not close TOC file: %m" msgstr "no se pudo cerrar el archivo TOC: %m" #: pg_backup_archiver.c:1549 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:585 pg_backup_directory.c:648 -#: pg_backup_directory.c:667 pg_dumpall.c:485 +#: pg_backup_directory.c:586 pg_backup_directory.c:649 +#: pg_backup_directory.c:668 pg_dumpall.c:489 #, c-format msgid "could not open output file \"%s\": %m" msgstr "no se pudo abrir el archivo de salida «%s»: %m" @@ -623,270 +623,265 @@ msgstr "no se pudo abrir el archivo de salida «%s»: %m" msgid "could not open output file: %m" msgstr "no se pudo abrir el archivo de salida: %m" -#: pg_backup_archiver.c:1644 +#: pg_backup_archiver.c:1645 #, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" msgstr[0] "se escribió %zu byte de los datos del objeto grande (resultado = %d)" msgstr[1] "se escribieron %zu bytes de los datos del objeto grande (resultado = %d)" -#: pg_backup_archiver.c:1650 +#: pg_backup_archiver.c:1651 #, c-format msgid "could not write to large object: %s" msgstr "no se pudo escribir en objeto grande: %s" -#: pg_backup_archiver.c:1740 +#: pg_backup_archiver.c:1741 #, c-format msgid "while INITIALIZING:" msgstr "durante INICIALIZACIÓN:" -#: pg_backup_archiver.c:1745 +#: pg_backup_archiver.c:1746 #, c-format msgid "while PROCESSING TOC:" msgstr "durante PROCESAMIENTO DE TABLA DE CONTENIDOS:" -#: pg_backup_archiver.c:1750 +#: pg_backup_archiver.c:1751 #, c-format msgid "while FINALIZING:" msgstr "durante FINALIZACIÓN:" -#: pg_backup_archiver.c:1755 +#: pg_backup_archiver.c:1756 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "en entrada de la tabla de contenidos %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1831 +#: pg_backup_archiver.c:1832 #, c-format msgid "bad dumpId" msgstr "dumpId incorrecto" -#: pg_backup_archiver.c:1852 +#: pg_backup_archiver.c:1853 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "dumpId de tabla incorrecto para elemento TABLE DATA" -#: pg_backup_archiver.c:1944 +#: pg_backup_archiver.c:1945 #, c-format msgid "unexpected data offset flag %d" msgstr "bandera de posición inesperada %d" -#: pg_backup_archiver.c:1957 +#: pg_backup_archiver.c:1958 #, c-format msgid "file offset in dump file is too large" msgstr "el posición en el archivo es demasiado grande" -#: pg_backup_archiver.c:2095 pg_backup_archiver.c:2105 +#: pg_backup_archiver.c:2096 pg_backup_archiver.c:2106 #, c-format msgid "directory name too long: \"%s\"" msgstr "nombre de directorio demasiado largo: «%s»" -#: pg_backup_archiver.c:2113 +#: pg_backup_archiver.c:2114 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "el directorio «%s» no parece ser un archivador válido (no existe «toc.dat»)" -#: pg_backup_archiver.c:2121 pg_backup_custom.c:173 pg_backup_custom.c:807 -#: pg_backup_directory.c:207 pg_backup_directory.c:394 +#: pg_backup_archiver.c:2122 pg_backup_custom.c:173 pg_backup_custom.c:807 +#: pg_backup_directory.c:207 pg_backup_directory.c:395 #, c-format msgid "could not open input file \"%s\": %m" msgstr "no se pudo abrir el archivo de entrada «%s»: %m" -#: pg_backup_archiver.c:2128 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2129 pg_backup_custom.c:179 #, c-format msgid "could not open input file: %m" msgstr "no se pudo abrir el archivo de entrada: %m" -#: pg_backup_archiver.c:2134 +#: pg_backup_archiver.c:2135 #, c-format msgid "could not read input file: %m" msgstr "no se pudo leer el archivo de entrada: %m" -#: pg_backup_archiver.c:2136 +#: pg_backup_archiver.c:2137 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "el archivo de entrada es demasiado corto (leidos %lu, esperados 5)" -#: pg_backup_archiver.c:2168 +#: pg_backup_archiver.c:2169 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "el archivo de entrada parece ser un volcado de texto. Por favor use psql." -#: pg_backup_archiver.c:2174 +#: pg_backup_archiver.c:2175 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "el archivo de entrada no parece ser un archivador válido (¿demasiado corto?)" -#: pg_backup_archiver.c:2180 +#: pg_backup_archiver.c:2181 #, c-format msgid "input file does not appear to be a valid archive" msgstr "el archivo de entrada no parece ser un archivador válido" -#: pg_backup_archiver.c:2189 +#: pg_backup_archiver.c:2190 #, c-format msgid "could not close input file: %m" msgstr "no se pudo cerrar el archivo de entrada: %m" -#: pg_backup_archiver.c:2306 +#: pg_backup_archiver.c:2307 #, c-format msgid "unrecognized file format \"%d\"" msgstr "formato de archivo no reconocido «%d»" -#: pg_backup_archiver.c:2388 pg_backup_archiver.c:4422 +#: pg_backup_archiver.c:2389 pg_backup_archiver.c:4413 #, c-format msgid "finished item %d %s %s" msgstr "terminó el elemento %d %s %s" -#: pg_backup_archiver.c:2392 pg_backup_archiver.c:4435 +#: pg_backup_archiver.c:2393 pg_backup_archiver.c:4426 #, c-format msgid "worker process failed: exit code %d" msgstr "el proceso hijo falló: código de salida %d" -#: pg_backup_archiver.c:2512 +#: pg_backup_archiver.c:2513 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "la entrada con ID %d está fuera de rango -- tal vez la tabla de contenido está corrupta" -#: pg_backup_archiver.c:2579 +#: pg_backup_archiver.c:2580 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "restaurar tablas WITH OIDS ya no está soportado" -#: pg_backup_archiver.c:2663 +#: pg_backup_archiver.c:2662 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "no se reconoce la codificación: «%s»" -#: pg_backup_archiver.c:2668 +#: pg_backup_archiver.c:2667 #, c-format msgid "invalid ENCODING item: %s" msgstr "elemento ENCODING no válido: %s" -#: pg_backup_archiver.c:2686 +#: pg_backup_archiver.c:2685 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "elemento STDSTRINGS no válido: %s" -#: pg_backup_archiver.c:2717 -#, c-format -msgid "invalid TOASTCOMPRESSION item: %s" -msgstr "elemento TOASTCOMPRESSION no válido: %s" - -#: pg_backup_archiver.c:2734 +#: pg_backup_archiver.c:2710 #, c-format msgid "schema \"%s\" not found" msgstr "esquema «%s» no encontrado" -#: pg_backup_archiver.c:2741 +#: pg_backup_archiver.c:2717 #, c-format msgid "table \"%s\" not found" msgstr "tabla «%s» no encontrada" -#: pg_backup_archiver.c:2748 +#: pg_backup_archiver.c:2724 #, c-format msgid "index \"%s\" not found" msgstr "índice «%s» no encontrado" -#: pg_backup_archiver.c:2755 +#: pg_backup_archiver.c:2731 #, c-format msgid "function \"%s\" not found" msgstr "función «%s» no encontrada" -#: pg_backup_archiver.c:2762 +#: pg_backup_archiver.c:2738 #, c-format msgid "trigger \"%s\" not found" msgstr "disparador «%s» no encontrado" -#: pg_backup_archiver.c:3160 +#: pg_backup_archiver.c:3130 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "no se pudo establecer el usuario de sesión a «%s»: %s" -#: pg_backup_archiver.c:3292 +#: pg_backup_archiver.c:3262 #, c-format msgid "could not set search_path to \"%s\": %s" msgstr "no se pudo definir search_path a «%s»: %s" -#: pg_backup_archiver.c:3354 +#: pg_backup_archiver.c:3324 #, c-format msgid "could not set default_tablespace to %s: %s" msgstr "no se pudo definir default_tablespace a %s: %s" -#: pg_backup_archiver.c:3399 +#: pg_backup_archiver.c:3369 #, c-format msgid "could not set default_table_access_method: %s" msgstr "no se pudo definir default_table_access_method: %s" -#: pg_backup_archiver.c:3491 pg_backup_archiver.c:3649 +#: pg_backup_archiver.c:3461 pg_backup_archiver.c:3619 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "no se sabe cómo establecer el dueño para el objeto de tipo «%s»" -#: pg_backup_archiver.c:3753 +#: pg_backup_archiver.c:3722 #, c-format msgid "did not find magic string in file header" msgstr "no se encontró la cadena mágica en el encabezado del archivo" -#: pg_backup_archiver.c:3767 +#: pg_backup_archiver.c:3736 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "versión no soportada (%d.%d) en el encabezado del archivo" -#: pg_backup_archiver.c:3772 +#: pg_backup_archiver.c:3741 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "revisión de integridad en el tamaño del entero (%lu) falló" -#: pg_backup_archiver.c:3776 +#: pg_backup_archiver.c:3745 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "el archivador fue hecho en una máquina con enteros más grandes, algunas operaciones podrían fallar" -#: pg_backup_archiver.c:3786 +#: pg_backup_archiver.c:3755 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "el formato esperado (%d) difiere del formato encontrado en el archivo (%d)" -#: pg_backup_archiver.c:3801 +#: pg_backup_archiver.c:3770 #, c-format msgid "archive is compressed, but this installation does not support compression -- no data will be available" msgstr "el archivador está comprimido, pero esta instalación no soporta compresión -- no habrá datos disponibles" -#: pg_backup_archiver.c:3819 +#: pg_backup_archiver.c:3804 #, c-format msgid "invalid creation date in header" msgstr "la fecha de creación en el encabezado no es válida" -#: pg_backup_archiver.c:3947 +#: pg_backup_archiver.c:3938 #, c-format msgid "processing item %d %s %s" msgstr "procesando el elemento %d %s %s" -#: pg_backup_archiver.c:4026 +#: pg_backup_archiver.c:4017 #, c-format msgid "entering main parallel loop" msgstr "ingresando al bucle paralelo principal" -#: pg_backup_archiver.c:4037 +#: pg_backup_archiver.c:4028 #, c-format msgid "skipping item %d %s %s" msgstr "saltando el elemento %d %s %s" -#: pg_backup_archiver.c:4046 +#: pg_backup_archiver.c:4037 #, c-format msgid "launching item %d %s %s" msgstr "lanzando el elemento %d %s %s" -#: pg_backup_archiver.c:4100 +#: pg_backup_archiver.c:4091 #, c-format msgid "finished main parallel loop" msgstr "terminó el bucle paralelo principal" -#: pg_backup_archiver.c:4136 +#: pg_backup_archiver.c:4127 #, c-format msgid "processing missed item %d %s %s" msgstr "procesando el elemento saltado %d %s %s" -#: pg_backup_archiver.c:4741 +#: pg_backup_archiver.c:4732 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "la tabla «%s» no pudo ser creada, no se recuperarán sus datos" @@ -897,7 +892,7 @@ msgid "invalid OID for large object" msgstr "OID no válido para objeto grande" #: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629 -#: pg_backup_custom.c:865 pg_backup_tar.c:1080 pg_backup_tar.c:1085 +#: pg_backup_custom.c:865 pg_backup_tar.c:1083 pg_backup_tar.c:1088 #, c-format msgid "error during file seek: %m" msgstr "error durante el posicionamiento (seek) en el archivo: %m" @@ -938,7 +933,7 @@ msgid "could not read from input file: %m" msgstr "no se pudo leer el archivo de entrada: %m" #: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943 -#: pg_backup_tar.c:1083 +#: pg_backup_tar.c:1086 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "no se pudo determinar la posición (seek) en el archivo del archivador: %m" @@ -978,12 +973,12 @@ msgstr "compresor activo" msgid "could not get server_version from libpq" msgstr "no se pudo obtener server_version desde libpq" -#: pg_backup_db.c:53 pg_dumpall.c:1821 +#: pg_backup_db.c:53 pg_dumpall.c:1826 #, c-format msgid "server version: %s; %s version: %s" msgstr "versión del servidor: %s; versión de %s: %s" -#: pg_backup_db.c:55 pg_dumpall.c:1823 +#: pg_backup_db.c:55 pg_dumpall.c:1828 #, c-format msgid "aborting because of server version mismatch" msgstr "abortando debido a que no coincide la versión del servidor" @@ -993,7 +988,7 @@ msgstr "abortando debido a que no coincide la versión del servidor" msgid "already connected to a database" msgstr "ya está conectado a una base de datos" -#: pg_backup_db.c:132 pg_backup_db.c:182 pg_dumpall.c:1650 pg_dumpall.c:1761 +#: pg_backup_db.c:132 pg_backup_db.c:182 pg_dumpall.c:1655 pg_dumpall.c:1766 msgid "Password: " msgstr "Contraseña: " @@ -1007,17 +1002,17 @@ msgstr "no se pudo hacer la conexión a la base de datos" msgid "reconnection failed: %s" msgstr "falló la reconexión: %s" -#: pg_backup_db.c:194 pg_backup_db.c:269 pg_dumpall.c:1681 pg_dumpall.c:1771 +#: pg_backup_db.c:194 pg_backup_db.c:269 pg_dumpall.c:1686 pg_dumpall.c:1776 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:276 pg_dumpall.c:1884 pg_dumpall.c:1907 +#: pg_backup_db.c:276 pg_dumpall.c:1889 pg_dumpall.c:1912 #, c-format msgid "query failed: %s" msgstr "la consulta falló: %s" -#: pg_backup_db.c:278 pg_dumpall.c:1885 pg_dumpall.c:1908 +#: pg_backup_db.c:278 pg_dumpall.c:1890 pg_dumpall.c:1913 #, c-format msgid "query was: %s" msgstr "la consulta era: %s" @@ -1053,7 +1048,7 @@ msgstr "PQputCopyEnd regresó un error: %s" msgid "COPY failed for table \"%s\": %s" msgstr "COPY falló para la tabla «%s»: %s" -#: pg_backup_db.c:525 pg_dump.c:2077 +#: pg_backup_db.c:525 pg_dump.c:2074 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "resultados extra inesperados durante el COPY de la tabla «%s»" @@ -1086,43 +1081,58 @@ msgstr "no se pudo abrir el directorio «%s»: %m" msgid "could not create directory \"%s\": %m" msgstr "no se pudo crear el directorio «%s»: %m" -#: pg_backup_directory.c:355 pg_backup_directory.c:496 -#: pg_backup_directory.c:532 +#: pg_backup_directory.c:355 pg_backup_directory.c:497 +#: pg_backup_directory.c:533 #, c-format msgid "could not write to output file: %s" msgstr "no se pudo escribir al archivo de salida: %s" -#: pg_backup_directory.c:406 +#: pg_backup_directory.c:373 +#, c-format +msgid "could not close data file: %m" +msgstr "no se pudo cerrar el archivo de datos: %m" + +#: pg_backup_directory.c:407 #, c-format msgid "could not close data file \"%s\": %m" msgstr "no se pudo cerrar el archivo de datos «%s»: %m" -#: pg_backup_directory.c:446 +#: pg_backup_directory.c:447 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "no se pudo abrir el archivo de la tabla de contenidos de objetos grandes «%s» para su lectura: %m" -#: pg_backup_directory.c:457 +#: pg_backup_directory.c:458 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "línea no válida en el archivo de la tabla de contenido de objetos grandes «%s»: «%s»" -#: pg_backup_directory.c:466 +#: pg_backup_directory.c:467 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "error al leer el archivo de la tabla de contenidos de objetos grandes «%s»" -#: pg_backup_directory.c:470 +#: pg_backup_directory.c:471 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "no se pudo cerrar el archivo de la tabla de contenido de los objetos grandes «%s»: %m" -#: pg_backup_directory.c:689 +#: pg_backup_directory.c:685 +#, c-format +msgid "could not close blob data file: %m" +msgstr "no se pudo cerrar el archivo de datos de objetos grandes: %m" + +#: pg_backup_directory.c:691 #, c-format msgid "could not write to blobs TOC file" msgstr "no se pudo escribir al archivo de la tabla de contenidos de objetos grandes" -#: pg_backup_directory.c:721 +#: pg_backup_directory.c:705 +#, c-format +msgid "could not close blobs TOC file: %m" +msgstr "no se pudo cerrar el archivo de la tabla de contenidos de objetos grandes: %m" + +#: pg_backup_directory.c:724 #, c-format msgid "file name too long: \"%s\"" msgstr "nombre de archivo demasiado largo: «%s»" @@ -1172,49 +1182,49 @@ msgstr "no se pudo generar el nombre de archivo temporal: %m" msgid "could not open temporary file" msgstr "no se pudo abrir archivo temporal" -#: pg_backup_tar.c:442 +#: pg_backup_tar.c:444 #, c-format -msgid "could not close tar member" -msgstr "no se pudo cerrar miembro del archivo tar" +msgid "could not close tar member: %m" +msgstr "no se pudo cerrar miembro del archivo tar: %m" -#: pg_backup_tar.c:685 +#: pg_backup_tar.c:688 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "sintaxis de sentencia COPY inesperada: «%s»" -#: pg_backup_tar.c:952 +#: pg_backup_tar.c:955 #, c-format msgid "invalid OID for large object (%u)" msgstr "el OID del objeto grande no es válido (%u)" -#: pg_backup_tar.c:1099 +#: pg_backup_tar.c:1102 #, c-format msgid "could not close temporary file: %m" msgstr "no se pudo abrir archivo temporal: %m" -#: pg_backup_tar.c:1108 +#: pg_backup_tar.c:1111 #, c-format msgid "actual file length (%s) does not match expected (%s)" msgstr "el tamaño real del archivo (%s) no coincide con el esperado (%s)" -#: pg_backup_tar.c:1165 pg_backup_tar.c:1196 +#: pg_backup_tar.c:1168 pg_backup_tar.c:1199 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "no se pudo encontrar el encabezado para el archivo «%s» en el archivo tar" -#: pg_backup_tar.c:1183 +#: pg_backup_tar.c:1186 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "la extracción de datos fuera de orden no está soportada en este formato: se requiere «%s», pero viene antes de «%s» en el archivador." -#: pg_backup_tar.c:1230 +#: pg_backup_tar.c:1233 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "se encontró un encabezado incompleto (%lu byte)" msgstr[1] "se encontró un encabezado incompleto (%lu bytes)" -#: pg_backup_tar.c:1281 +#: pg_backup_tar.c:1284 #, c-format msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s" msgstr "se encontró un encabezado corrupto en %s (esperado %d, calculado %d) en la posición %s" @@ -1224,9 +1234,9 @@ msgstr "se encontró un encabezado corrupto en %s (esperado %d, calculado %d) en msgid "unrecognized section name: \"%s\"" msgstr "nombre de sección «%s» no reconocido" -#: pg_backup_utils.c:55 pg_dump.c:623 pg_dump.c:640 pg_dumpall.c:339 -#: pg_dumpall.c:349 pg_dumpall.c:358 pg_dumpall.c:367 pg_dumpall.c:375 -#: pg_dumpall.c:389 pg_dumpall.c:465 pg_restore.c:284 pg_restore.c:300 +#: pg_backup_utils.c:55 pg_dump.c:622 pg_dump.c:639 pg_dumpall.c:341 +#: pg_dumpall.c:351 pg_dumpall.c:360 pg_dumpall.c:369 pg_dumpall.c:377 +#: pg_dumpall.c:391 pg_dumpall.c:469 pg_restore.c:284 pg_restore.c:300 #: pg_restore.c:318 #, c-format msgid "Try \"%s --help\" for more information.\n" @@ -1237,72 +1247,72 @@ msgstr "Prueba «%s --help» para más información.\n" msgid "out of on_exit_nicely slots" msgstr "elementos on_exit_nicely agotados" -#: pg_dump.c:549 +#: pg_dump.c:548 #, c-format msgid "compression level must be in range 0..9" msgstr "nivel de compresión debe estar en el rango 0..9" -#: pg_dump.c:587 +#: pg_dump.c:586 #, c-format msgid "extra_float_digits must be in range -15..3" msgstr "extra_floats_digits debe estar en el rango -15..3" -#: pg_dump.c:610 +#: pg_dump.c:609 #, c-format msgid "rows-per-insert must be in range %d..%d" msgstr "rows-per-insert debe estar en el rango %d..%d" -#: pg_dump.c:638 pg_dumpall.c:347 pg_restore.c:298 +#: pg_dump.c:637 pg_dumpall.c:349 pg_restore.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: pg_dump.c:659 pg_restore.c:327 +#: pg_dump.c:658 pg_restore.c:327 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "las opciones -s/--schema-only y -a/--data-only no pueden usarse juntas" -#: pg_dump.c:664 +#: pg_dump.c:663 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "las opciones -s/--schema-only y --include-foreign-data no pueden usarse juntas" -#: pg_dump.c:667 +#: pg_dump.c:666 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "la opción --include-foreign-data no está soportado con respaldo en paralelo" -#: pg_dump.c:671 pg_restore.c:333 +#: pg_dump.c:670 pg_restore.c:333 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "las opciones -c/--clean y -a/--data-only no pueden usarse juntas" -#: pg_dump.c:676 pg_dumpall.c:382 pg_restore.c:382 +#: pg_dump.c:675 pg_dumpall.c:384 pg_restore.c:382 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "la opción --if-exists requiere la opción -c/--clean" -#: pg_dump.c:683 +#: pg_dump.c:682 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "la opción --on-conflict-do-nothing requiere la opción --inserts, --rows-per-insert o --column-inserts" -#: pg_dump.c:705 +#: pg_dump.c:704 #, c-format msgid "requested compression not available in this installation -- archive will be uncompressed" msgstr "la compresión solicitada no está soportada en esta instalación -- el archivador será sin compresión" -#: pg_dump.c:726 pg_restore.c:349 +#: pg_dump.c:725 pg_restore.c:349 #, c-format msgid "invalid number of parallel jobs" msgstr "número no válido de trabajos paralelos" -#: pg_dump.c:730 +#: pg_dump.c:729 #, c-format msgid "parallel backup only supported by the directory format" msgstr "el volcado en paralelo sólo está soportado por el formato «directory»" -#: pg_dump.c:785 +#: pg_dump.c:784 #, c-format msgid "" "Synchronized snapshots are not supported by this server version.\n" @@ -1312,32 +1322,32 @@ msgstr "" "Los snapshots sincronizados no están soportados por esta versión del servidor.\n" "Ejecute con --no-synchronized-snapshots si no los necesita." -#: pg_dump.c:791 +#: pg_dump.c:790 #, c-format msgid "Exported snapshots are not supported by this server version." msgstr "Los snapshot exportados no están soportados por esta versión de servidor." -#: pg_dump.c:803 +#: pg_dump.c:802 #, c-format msgid "last built-in OID is %u" msgstr "el último OID interno es %u" -#: pg_dump.c:812 +#: pg_dump.c:811 #, c-format msgid "no matching schemas were found" msgstr "no se encontraron esquemas coincidentes" -#: pg_dump.c:826 +#: pg_dump.c:825 #, c-format msgid "no matching tables were found" msgstr "no se encontraron tablas coincidentes" -#: pg_dump.c:848 +#: pg_dump.c:847 #, c-format msgid "no matching extensions were found" msgstr "no se encontraron extensiones coincidentes" -#: pg_dump.c:1020 +#: pg_dump.c:1017 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1346,17 +1356,17 @@ msgstr "" "%s extrae una base de datos en formato de texto o en otros formatos.\n" "\n" -#: pg_dump.c:1021 pg_dumpall.c:618 pg_restore.c:462 +#: pg_dump.c:1018 pg_dumpall.c:622 pg_restore.c:462 #, c-format msgid "Usage:\n" msgstr "Empleo:\n" -#: pg_dump.c:1022 +#: pg_dump.c:1019 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPCIÓN]... [NOMBREDB]\n" -#: pg_dump.c:1024 pg_dumpall.c:621 pg_restore.c:465 +#: pg_dump.c:1021 pg_dumpall.c:625 pg_restore.c:465 #, c-format msgid "" "\n" @@ -1365,12 +1375,12 @@ msgstr "" "\n" "Opciones generales:\n" -#: pg_dump.c:1025 +#: pg_dump.c:1022 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=ARCHIVO nombre del archivo o directorio de salida\n" -#: pg_dump.c:1026 +#: pg_dump.c:1023 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1379,42 +1389,42 @@ msgstr "" " -F, --format=c|d|t|p Formato del archivo de salida (c=personalizado, \n" " d=directorio, t=tar, p=texto (por omisión))\n" -#: pg_dump.c:1028 +#: pg_dump.c:1025 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM máximo de procesos paralelos para volcar\n" -#: pg_dump.c:1029 pg_dumpall.c:623 +#: pg_dump.c:1026 pg_dumpall.c:627 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose modo verboso\n" -#: pg_dump.c:1030 pg_dumpall.c:624 +#: pg_dump.c:1027 pg_dumpall.c:628 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de version y salir\n" -#: pg_dump.c:1031 +#: pg_dump.c:1028 #, c-format msgid " -Z, --compress=0-9 compression level for compressed formats\n" msgstr " -Z, --compress=0-9 nivel de compresión para formatos comprimidos\n" -#: pg_dump.c:1032 pg_dumpall.c:625 +#: pg_dump.c:1029 pg_dumpall.c:629 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr " --lock-wait-timeout=SEGS espera a lo más SEGS segundos obtener un lock\n" -#: pg_dump.c:1033 pg_dumpall.c:652 +#: pg_dump.c:1030 pg_dumpall.c:656 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync no esperar que los cambios se sincronicen a disco\n" -#: pg_dump.c:1034 pg_dumpall.c:626 +#: pg_dump.c:1031 pg_dumpall.c:630 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: pg_dump.c:1036 pg_dumpall.c:627 +#: pg_dump.c:1033 pg_dumpall.c:631 #, c-format msgid "" "\n" @@ -1423,54 +1433,54 @@ msgstr "" "\n" "Opciones que controlan el contenido de la salida:\n" -#: pg_dump.c:1037 pg_dumpall.c:628 +#: pg_dump.c:1034 pg_dumpall.c:632 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only extrae sólo los datos, no el esquema\n" -#: pg_dump.c:1038 +#: pg_dump.c:1035 #, c-format msgid " -b, --blobs include large objects in dump\n" msgstr " -b, --blobs incluye objetos grandes en la extracción\n" -#: pg_dump.c:1039 +#: pg_dump.c:1036 #, c-format msgid " -B, --no-blobs exclude large objects in dump\n" msgstr " -B, --no-blobs excluye objetos grandes en la extracción\n" -#: pg_dump.c:1040 pg_restore.c:476 +#: pg_dump.c:1037 pg_restore.c:476 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr " -c, --clean tira (drop) la base de datos antes de crearla\n" -#: pg_dump.c:1041 +#: pg_dump.c:1038 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr "" " -C, --create incluye órdenes para crear la base de datos\n" " en la extracción\n" -#: pg_dump.c:1042 +#: pg_dump.c:1039 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" msgstr " -e, --extension=PATRÓN extrae sólo la o las extensiones nombradas\n" -#: pg_dump.c:1043 pg_dumpall.c:630 +#: pg_dump.c:1040 pg_dumpall.c:634 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=CODIF extrae los datos con la codificación CODIF\n" -#: pg_dump.c:1044 +#: pg_dump.c:1041 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=PATRÓN extrae sólo el o los esquemas nombrados\n" -#: pg_dump.c:1045 +#: pg_dump.c:1042 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=PATRÓN NO extrae el o los esquemas nombrados\n" -#: pg_dump.c:1046 +#: pg_dump.c:1043 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1479,58 +1489,58 @@ msgstr "" " -O, --no-owner en formato de sólo texto, no reestablece\n" " los dueños de los objetos\n" -#: pg_dump.c:1048 pg_dumpall.c:634 +#: pg_dump.c:1045 pg_dumpall.c:638 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only extrae sólo el esquema, no los datos\n" -#: pg_dump.c:1049 +#: pg_dump.c:1046 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr " -S, --superuser=NAME superusuario a utilizar en el volcado de texto\n" -#: pg_dump.c:1050 +#: pg_dump.c:1047 #, c-format msgid " -t, --table=PATTERN dump the specified table(s) only\n" msgstr " -t, --table=PATRÓN extrae sólo la o las tablas nombradas\n" -#: pg_dump.c:1051 +#: pg_dump.c:1048 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=PATRÓN NO extrae la o las tablas nombradas\n" -#: pg_dump.c:1052 pg_dumpall.c:637 +#: pg_dump.c:1049 pg_dumpall.c:641 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges no extrae los privilegios (grant/revoke)\n" -#: pg_dump.c:1053 pg_dumpall.c:638 +#: pg_dump.c:1050 pg_dumpall.c:642 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade sólo para uso de utilidades de upgrade\n" -#: pg_dump.c:1054 pg_dumpall.c:639 +#: pg_dump.c:1051 pg_dumpall.c:643 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr "" " --column-inserts extrae los datos usando INSERT con nombres\n" " de columnas\n" -#: pg_dump.c:1055 pg_dumpall.c:640 +#: pg_dump.c:1052 pg_dumpall.c:644 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr "" " --disable-dollar-quoting deshabilita el uso de «delimitadores de dólar»,\n" " usa delimitadores de cadena estándares\n" -#: pg_dump.c:1056 pg_dumpall.c:641 pg_restore.c:493 +#: pg_dump.c:1053 pg_dumpall.c:645 pg_restore.c:493 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr "" " --disable-triggers deshabilita los disparadores (triggers) durante el\n" " restablecimiento de la extracción de sólo-datos\n" -#: pg_dump.c:1057 +#: pg_dump.c:1054 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" @@ -1539,22 +1549,22 @@ msgstr "" " --enable-row-security activa seguridad de filas (volcar sólo el\n" " contenido al que el usuario tiene acceso)\n" -#: pg_dump.c:1059 +#: pg_dump.c:1056 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=PATRÓN NO extrae los datos de la(s) tablas nombradas\n" -#: pg_dump.c:1060 pg_dumpall.c:643 +#: pg_dump.c:1057 pg_dumpall.c:647 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr " --extra-float-digits=NUM usa este valor para extra_float_digits\n" -#: pg_dump.c:1061 pg_dumpall.c:644 pg_restore.c:495 +#: pg_dump.c:1058 pg_dumpall.c:648 pg_restore.c:495 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists usa IF EXISTS al eliminar objetos\n" -#: pg_dump.c:1062 +#: pg_dump.c:1059 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1565,95 +1575,95 @@ msgstr "" " incluye datos de tablas foráneas en servidores\n" " que coinciden con PATRÓN\n" -#: pg_dump.c:1065 pg_dumpall.c:645 +#: pg_dump.c:1062 pg_dumpall.c:649 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr " --inserts extrae los datos usando INSERT, en vez de COPY\n" -#: pg_dump.c:1066 pg_dumpall.c:646 +#: pg_dump.c:1063 pg_dumpall.c:650 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root cargar particiones a través de tabla raíz\n" -#: pg_dump.c:1067 pg_dumpall.c:647 +#: pg_dump.c:1064 pg_dumpall.c:651 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments no volcar los comentarios\n" -#: pg_dump.c:1068 pg_dumpall.c:648 +#: pg_dump.c:1065 pg_dumpall.c:652 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications no volcar las publicaciones\n" -#: pg_dump.c:1069 pg_dumpall.c:650 +#: pg_dump.c:1066 pg_dumpall.c:654 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr " --no-security-labels no volcar asignaciones de etiquetas de seguridad\n" -#: pg_dump.c:1070 pg_dumpall.c:651 +#: pg_dump.c:1067 pg_dumpall.c:655 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions no volcar las suscripciones\n" -#: pg_dump.c:1071 +#: pg_dump.c:1068 #, c-format msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n" msgstr "" " --no-synchronized-snapshots no usar snapshots sincronizados en trabajos\n" " en paralelo\n" -#: pg_dump.c:1072 pg_dumpall.c:653 +#: pg_dump.c:1069 pg_dumpall.c:657 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces no volcar asignaciones de tablespace\n" -#: pg_dump.c:1073 +#: pg_dump.c:1070 pg_dumpall.c:658 #, c-format msgid " --no-toast-compression do not dump TOAST compression methods\n" msgstr " --no-toast-compression no volcar métodos de compresión TOAST\n" -#: pg_dump.c:1074 pg_dumpall.c:654 +#: pg_dump.c:1071 pg_dumpall.c:659 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data no volcar datos de tablas unlogged\n" -#: pg_dump.c:1075 pg_dumpall.c:655 +#: pg_dump.c:1072 pg_dumpall.c:660 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" msgstr " --on-conflict-do-nothing agregar ON CONFLICT DO NOTHING a órdenes INSERT\n" -#: pg_dump.c:1076 pg_dumpall.c:656 +#: pg_dump.c:1073 pg_dumpall.c:661 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr "" " --quote-all-identifiers entrecomilla todos los identificadores, incluso\n" " si no son palabras clave\n" -#: pg_dump.c:1077 pg_dumpall.c:657 +#: pg_dump.c:1074 pg_dumpall.c:662 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=NUMFILAS número de filas por INSERT; implica --inserts\n" -#: pg_dump.c:1078 +#: pg_dump.c:1075 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr "" " --section=SECCIÓN volcar la sección nombrada (pre-data, data,\n" " post-data)\n" -#: pg_dump.c:1079 +#: pg_dump.c:1076 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr "" " --serializable-deferrable espera hasta que el respaldo pueda completarse\n" " sin anomalías\n" -#: pg_dump.c:1080 +#: pg_dump.c:1077 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT use el snapshot dado para la extracción\n" -#: pg_dump.c:1081 pg_restore.c:504 +#: pg_dump.c:1078 pg_restore.c:504 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" @@ -1662,7 +1672,7 @@ msgstr "" " --strict-names requerir al menos una coincidencia para cada patrón\n" " de nombre de tablas y esquemas\n" -#: pg_dump.c:1083 pg_dumpall.c:658 pg_restore.c:506 +#: pg_dump.c:1080 pg_dumpall.c:663 pg_restore.c:506 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1673,7 +1683,7 @@ msgstr "" " usa órdenes SESSION AUTHORIZATION en lugar de\n" " ALTER OWNER para cambiar los dueño de los objetos\n" -#: pg_dump.c:1087 pg_dumpall.c:662 pg_restore.c:510 +#: pg_dump.c:1084 pg_dumpall.c:667 pg_restore.c:510 #, c-format msgid "" "\n" @@ -1682,46 +1692,46 @@ msgstr "" "\n" "Opciones de conexión:\n" -#: pg_dump.c:1088 +#: pg_dump.c:1085 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=NOMBRE nombre de la base de datos que volcar\n" -#: pg_dump.c:1089 pg_dumpall.c:664 pg_restore.c:511 +#: pg_dump.c:1086 pg_dumpall.c:669 pg_restore.c:511 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=ANFITRIÓN anfitrión de la base de datos o\n" " directorio del enchufe (socket)\n" -#: pg_dump.c:1090 pg_dumpall.c:666 pg_restore.c:512 +#: pg_dump.c:1087 pg_dumpall.c:671 pg_restore.c:512 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PUERTO número del puerto de la base de datos\n" -#: pg_dump.c:1091 pg_dumpall.c:667 pg_restore.c:513 +#: pg_dump.c:1088 pg_dumpall.c:672 pg_restore.c:513 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=USUARIO nombre de usuario con el cual conectarse\n" -#: pg_dump.c:1092 pg_dumpall.c:668 pg_restore.c:514 +#: pg_dump.c:1089 pg_dumpall.c:673 pg_restore.c:514 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password nunca pedir una contraseña\n" -#: pg_dump.c:1093 pg_dumpall.c:669 pg_restore.c:515 +#: pg_dump.c:1090 pg_dumpall.c:674 pg_restore.c:515 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr "" " -W, --password fuerza un prompt para la contraseña\n" " (debería ser automático)\n" -#: pg_dump.c:1094 pg_dumpall.c:670 +#: pg_dump.c:1091 pg_dumpall.c:675 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROL ejecuta SET ROLE antes del volcado\n" -#: pg_dump.c:1096 +#: pg_dump.c:1093 #, c-format msgid "" "\n" @@ -1734,22 +1744,22 @@ msgstr "" "de la variable de ambiente PGDATABASE.\n" "\n" -#: pg_dump.c:1098 pg_dumpall.c:674 pg_restore.c:522 +#: pg_dump.c:1095 pg_dumpall.c:679 pg_restore.c:522 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Reporte errores a <%s>.\n" -#: pg_dump.c:1099 pg_dumpall.c:675 pg_restore.c:523 +#: pg_dump.c:1096 pg_dumpall.c:680 pg_restore.c:523 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: pg_dump.c:1118 pg_dumpall.c:500 +#: pg_dump.c:1115 pg_dumpall.c:504 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "la codificación de cliente especificada «%s» no es válida" -#: pg_dump.c:1264 +#: pg_dump.c:1261 #, c-format msgid "" "Synchronized snapshots on standby servers are not supported by this server version.\n" @@ -1759,533 +1769,528 @@ msgstr "" "Los snapshots sincronizados en servidores standby no están soportados por esta versión del servidor.\n" "Ejecute con --no-synchronized-snapshots si no los necesita." -#: pg_dump.c:1333 +#: pg_dump.c:1330 #, c-format msgid "invalid output format \"%s\" specified" msgstr "el formato de salida especificado «%s» no es válido" -#: pg_dump.c:1371 +#: pg_dump.c:1368 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "no se encontraron esquemas coincidentes para el patrón «%s»" -#: pg_dump.c:1418 +#: pg_dump.c:1415 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "no se encontraron extensiones coincidentes para el patrón «%s»" -#: pg_dump.c:1465 +#: pg_dump.c:1462 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "no se encontraron servidores foráneos coincidentes para el patrón «%s»" -#: pg_dump.c:1528 +#: pg_dump.c:1525 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "no se encontraron tablas coincidentes para el patrón «%s»" -#: pg_dump.c:1951 +#: pg_dump.c:1948 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "extrayendo el contenido de la tabla «%s.%s»" -#: pg_dump.c:2058 +#: pg_dump.c:2055 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Falló la extracción del contenido de la tabla «%s»: PQgetCopyData() falló." -#: pg_dump.c:2059 pg_dump.c:2069 +#: pg_dump.c:2056 pg_dump.c:2066 #, c-format msgid "Error message from server: %s" msgstr "Mensaje de error del servidor: %s" -#: pg_dump.c:2060 pg_dump.c:2070 +#: pg_dump.c:2057 pg_dump.c:2067 #, c-format msgid "The command was: %s" msgstr "La orden era: %s" -#: pg_dump.c:2068 +#: pg_dump.c:2065 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Falló la extracción del contenido de la tabla «%s»: PQgetResult() falló." -#: pg_dump.c:2828 +#: pg_dump.c:2147 +#, c-format +msgid "wrong number of fields retrieved from table \"%s\"" +msgstr "se obtuvo un número incorrecto de campos de la tabla «%s»" + +#: pg_dump.c:2860 #, c-format msgid "saving database definition" msgstr "salvando las definiciones de la base de datos" -#: pg_dump.c:3300 +#: pg_dump.c:3332 #, c-format msgid "saving encoding = %s" msgstr "salvando codificaciones = %s" -#: pg_dump.c:3325 +#: pg_dump.c:3357 #, c-format msgid "saving standard_conforming_strings = %s" msgstr "salvando standard_conforming_strings = %s" -#: pg_dump.c:3364 +#: pg_dump.c:3396 #, c-format msgid "could not parse result of current_schemas()" msgstr "no se pudo interpretar la salida de current_schemas()" -#: pg_dump.c:3383 +#: pg_dump.c:3415 #, c-format msgid "saving search_path = %s" msgstr "salvando search_path = %s" -#: pg_dump.c:3436 -#, c-format -msgid "saving default_toast_compression = %s" -msgstr "salvando default_toast_compression = %s" - -#: pg_dump.c:3475 +#: pg_dump.c:3455 #, c-format msgid "reading large objects" msgstr "leyendo objetos grandes" -#: pg_dump.c:3657 +#: pg_dump.c:3637 #, c-format msgid "saving large objects" msgstr "salvando objetos grandes" -#: pg_dump.c:3703 +#: pg_dump.c:3683 #, c-format msgid "error reading large object %u: %s" msgstr "error al leer el objeto grande %u: %s" -#: pg_dump.c:3755 +#: pg_dump.c:3767 #, c-format -msgid "reading row security enabled for table \"%s.%s\"" -msgstr "leyendo si seguridad de filas está activa para la tabla «%s.%s»" +msgid "reading row-level security policies" +msgstr "leyendo políticas de seguridad a nivel de registros" -#: pg_dump.c:3786 -#, c-format -msgid "reading policies for table \"%s.%s\"" -msgstr "extrayendo las políticas para la tabla «%s.%s»" - -#: pg_dump.c:3938 +#: pg_dump.c:3910 #, c-format msgid "unexpected policy command type: %c" msgstr "tipo de orden inesperada en política: %c" -#: pg_dump.c:4092 +#: pg_dump.c:4064 #, c-format msgid "owner of publication \"%s\" appears to be invalid" msgstr "el dueño de la publicación «%s» parece no ser válido" -#: pg_dump.c:4384 +#: pg_dump.c:4356 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "no se volcaron las suscripciones porque el usuario actual no es un superusuario" -#: pg_dump.c:4455 +#: pg_dump.c:4427 #, c-format msgid "owner of subscription \"%s\" appears to be invalid" msgstr "el dueño de la suscripción «%s» parece no ser válido" -#: pg_dump.c:4498 +#: pg_dump.c:4470 #, c-format msgid "could not parse subpublications array" msgstr "no se pudo interpretar el arreglo subpublications" -#: pg_dump.c:4856 +#: pg_dump.c:4828 #, c-format msgid "could not find parent extension for %s %s" msgstr "no se pudo encontrar la extensión padre para %s %s" -#: pg_dump.c:4988 +#: pg_dump.c:4960 #, c-format msgid "owner of schema \"%s\" appears to be invalid" msgstr "el dueño del esquema «%s» parece no ser válido" -#: pg_dump.c:5011 +#: pg_dump.c:4983 #, c-format msgid "schema with OID %u does not exist" msgstr "no existe el esquema con OID %u" -#: pg_dump.c:5340 +#: pg_dump.c:5313 #, c-format msgid "owner of data type \"%s\" appears to be invalid" msgstr "el dueño del tipo «%s» parece no ser válido" -#: pg_dump.c:5424 +#: pg_dump.c:5397 #, c-format msgid "owner of operator \"%s\" appears to be invalid" msgstr "el dueño del operador «%s» parece no ser válido" -#: pg_dump.c:5723 +#: pg_dump.c:5696 #, c-format msgid "owner of operator class \"%s\" appears to be invalid" msgstr "el dueño de la clase de operadores «%s» parece no ser válido" -#: pg_dump.c:5806 +#: pg_dump.c:5779 #, c-format msgid "owner of operator family \"%s\" appears to be invalid" msgstr "el dueño de la familia de operadores «%s» parece no ser válido" -#: pg_dump.c:5974 +#: pg_dump.c:5947 #, c-format msgid "owner of aggregate function \"%s\" appears to be invalid" msgstr "el dueño de la función de agregación «%s» parece no ser válido" -#: pg_dump.c:6233 +#: pg_dump.c:6206 #, c-format msgid "owner of function \"%s\" appears to be invalid" msgstr "el dueño de la función «%s» parece no ser válido" -#: pg_dump.c:7060 +#: pg_dump.c:7033 #, c-format msgid "owner of table \"%s\" appears to be invalid" msgstr "el dueño de la tabla «%s» parece no ser válido" -#: pg_dump.c:7102 pg_dump.c:17493 +#: pg_dump.c:7075 pg_dump.c:17508 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "falló la revisión de integridad, no se encontró la tabla padre con OID %u de la secuencia con OID %u" -#: pg_dump.c:7241 +#: pg_dump.c:7214 #, c-format msgid "reading indexes for table \"%s.%s\"" msgstr "extrayendo los índices para la tabla «%s.%s»" -#: pg_dump.c:7655 +#: pg_dump.c:7628 #, c-format msgid "reading foreign key constraints for table \"%s.%s\"" msgstr "extrayendo restricciones de llave foránea para la tabla «%s.%s»" -#: pg_dump.c:7934 +#: pg_dump.c:7907 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "falló la revisión de integridad, no se encontró la tabla padre con OID %u del elemento con OID %u de pg_rewrite" -#: pg_dump.c:8017 +#: pg_dump.c:7991 #, c-format msgid "reading triggers for table \"%s.%s\"" msgstr "extrayendo los disparadores (triggers) para la tabla «%s.%s»" -#: pg_dump.c:8150 +#: pg_dump.c:8173 #, c-format msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" msgstr "la consulta produjo un nombre de tabla nulo para la llave foránea del disparador \"%s\" en la tabla «%s» (OID de la tabla: %u)" -#: pg_dump.c:8700 +#: pg_dump.c:8723 #, c-format msgid "finding the columns and types of table \"%s.%s\"" msgstr "buscando las columnas y tipos de la tabla «%s.%s»" -#: pg_dump.c:8824 +#: pg_dump.c:8847 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "numeración de columnas no válida en la tabla «%s»" -#: pg_dump.c:8863 +#: pg_dump.c:8886 #, c-format msgid "finding default expressions of table \"%s.%s\"" msgstr "buscando expresiones por omisión de la tabla «%s.%s»" -#: pg_dump.c:8885 +#: pg_dump.c:8908 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "el valor de adnum %d para la tabla «%s» no es válido" -#: pg_dump.c:8978 +#: pg_dump.c:9001 #, c-format msgid "finding check constraints for table \"%s.%s\"" msgstr "buscando restricciones de revisión (check) para la tabla «%s.%s»" -#: pg_dump.c:9027 +#: pg_dump.c:9050 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "se esperaban %d restricciones CHECK en la tabla «%s» pero se encontraron %d" msgstr[1] "se esperaban %d restricciones CHECK en la tabla «%s» pero se encontraron %d" -#: pg_dump.c:9031 +#: pg_dump.c:9054 #, c-format msgid "(The system catalogs might be corrupted.)" msgstr "(Los catálogos del sistema podrían estar corruptos)" -#: pg_dump.c:10616 +#: pg_dump.c:10656 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "el typtype del tipo «%s» parece no ser válido" -#: pg_dump.c:11968 +#: pg_dump.c:12004 #, c-format msgid "bogus value in proargmodes array" msgstr "valor no válido en el arreglo proargmodes" -#: pg_dump.c:12275 +#: pg_dump.c:12306 #, c-format msgid "could not parse proallargtypes array" msgstr "no se pudo interpretar el arreglo proallargtypes" -#: pg_dump.c:12291 +#: pg_dump.c:12322 #, c-format msgid "could not parse proargmodes array" msgstr "no se pudo interpretar el arreglo proargmodes" -#: pg_dump.c:12305 +#: pg_dump.c:12336 #, c-format msgid "could not parse proargnames array" msgstr "no se pudo interpretar el arreglo proargnames" -#: pg_dump.c:12315 +#: pg_dump.c:12346 #, c-format msgid "could not parse proconfig array" msgstr "no se pudo interpretar el arreglo proconfig" -#: pg_dump.c:12395 +#: pg_dump.c:12422 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "el valor del atributo «provolatile» para la función «%s» es desconocido" -#: pg_dump.c:12445 pg_dump.c:14396 +#: pg_dump.c:12472 pg_dump.c:14413 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "el valor del atributo «proparallel» para la función «%s» es desconocido" -#: pg_dump.c:12584 pg_dump.c:12693 pg_dump.c:12700 +#: pg_dump.c:12611 pg_dump.c:12717 pg_dump.c:12724 #, c-format msgid "could not find function definition for function with OID %u" msgstr "no se encontró la definición de la función con OID %u" -#: pg_dump.c:12623 +#: pg_dump.c:12650 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "valor no válido en los campos pg_cast.castfunc o pg_cast.castmethod" -#: pg_dump.c:12626 +#: pg_dump.c:12653 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "valor no válido en el campo pg_cast.castmethod" -#: pg_dump.c:12719 +#: pg_dump.c:12743 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "definición errónea de transformación; al menos uno de trffromsql and trftosql debe ser distinto de cero" -#: pg_dump.c:12736 +#: pg_dump.c:12760 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "valor erróneo en el campo pg_transform.trffromsql" -#: pg_dump.c:12757 +#: pg_dump.c:12781 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "valor erróneo en el campo pg_transform.trftosql" -#: pg_dump.c:12909 +#: pg_dump.c:12932 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "los operadores postfix ya no están soportados (operador «%s»)" -#: pg_dump.c:13079 +#: pg_dump.c:13102 #, c-format msgid "could not find operator with OID %s" msgstr "no se pudo encontrar el operador con OID %s" -#: pg_dump.c:13147 +#: pg_dump.c:13170 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "el tipo «%c» para el método de acceso «%s» no es válido" -#: pg_dump.c:13901 +#: pg_dump.c:13924 #, c-format msgid "unrecognized collation provider: %s" msgstr "proveedor de ordenamiento no reconocido: %s" -#: pg_dump.c:14315 +#: pg_dump.c:14332 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "valor de aggfinalmodify no reconocido para la agregación «%s»" -#: pg_dump.c:14371 +#: pg_dump.c:14388 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "valor de aggmfinalmodify no reconocido para la agregación «%s»" -#: pg_dump.c:15093 +#: pg_dump.c:15110 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "tipo de objeto desconocido en privilegios por omisión: %d" -#: pg_dump.c:15111 +#: pg_dump.c:15128 #, c-format msgid "could not parse default ACL list (%s)" msgstr "no se pudo interpretar la lista de ACL (%s)" -#: pg_dump.c:15196 +#: pg_dump.c:15213 #, c-format msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)" msgstr "no se pudo interpretar la lista inicial de GRANT ACL (%s) o la lista inicial de REVOKE ACL (%s) para el objeto «%s» (%s)" -#: pg_dump.c:15204 +#: pg_dump.c:15221 #, c-format msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)" msgstr "no se pudo interpretar la lista de GRANT ACL (%s) o la lista de REVOKE ACL (%s) para el objeto «%s» (%s)" -#: pg_dump.c:15719 +#: pg_dump.c:15736 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "la consulta para obtener la definición de la vista «%s» no regresó datos" -#: pg_dump.c:15722 +#: pg_dump.c:15739 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "la consulta para obtener la definición de la vista «%s» regresó más de una definición" -#: pg_dump.c:15729 +#: pg_dump.c:15746 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "la definición de la vista «%s» parece estar vacía (tamaño cero)" -#: pg_dump.c:15813 +#: pg_dump.c:15830 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS ya no está soportado (tabla «%s»)" -#: pg_dump.c:16680 +#: pg_dump.c:16695 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "el número de columna %d no es válido para la tabla «%s»" -#: pg_dump.c:16757 +#: pg_dump.c:16772 #, c-format msgid "could not parse index statistic columns" msgstr "no se pudieron interpretar columnas de estadísticas de índices" -#: pg_dump.c:16759 +#: pg_dump.c:16774 #, c-format msgid "could not parse index statistic values" msgstr "no se pudieron interpretar valores de estadísticas de índices" -#: pg_dump.c:16761 +#: pg_dump.c:16776 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "no coincide el número de columnas con el de valores para estadísticas de índices" -#: pg_dump.c:16978 +#: pg_dump.c:16993 #, c-format msgid "missing index for constraint \"%s\"" msgstr "falta un índice para restricción «%s»" -#: pg_dump.c:17203 +#: pg_dump.c:17218 #, c-format msgid "unrecognized constraint type: %c" msgstr "tipo de restricción inesperado: %c" -#: pg_dump.c:17335 pg_dump.c:17558 +#: pg_dump.c:17350 pg_dump.c:17573 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "la consulta para obtener los datos de la secuencia «%s» regresó %d entrada, pero se esperaba 1" msgstr[1] "la consulta para obtener los datos de la secuencia «%s» regresó %d entradas, pero se esperaba 1" -#: pg_dump.c:17369 +#: pg_dump.c:17384 #, c-format msgid "unrecognized sequence type: %s" msgstr "tipo no reconocido de secuencia: %s" -#: pg_dump.c:17656 +#: pg_dump.c:17671 #, c-format msgid "unexpected tgtype value: %d" msgstr "tgtype no esperado: %d" -#: pg_dump.c:17730 +#: pg_dump.c:17745 #, c-format msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" msgstr "argumento de cadena (%s) no válido para el disparador (trigger) «%s» en la tabla «%s»" -#: pg_dump.c:17966 +#: pg_dump.c:18014 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "la consulta para obtener la regla «%s» asociada con la tabla «%s» falló: retornó un número incorrecto de renglones" -#: pg_dump.c:18128 +#: pg_dump.c:18176 #, c-format msgid "could not find referenced extension %u" msgstr "no se pudo encontrar la extensión referenciada %u" -#: pg_dump.c:18219 +#: pg_dump.c:18267 #, c-format msgid "could not parse extension configuration array" msgstr "no se pudo interpretar el arreglo de configuración de extensión" -#: pg_dump.c:18221 +#: pg_dump.c:18269 #, c-format msgid "could not parse extension condition array" msgstr "no se pudo interpretar el arreglo de condición de extensión" -#: pg_dump.c:18223 +#: pg_dump.c:18271 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "no coincide el número de configuraciones con el de condiciones para extensión" -#: pg_dump.c:18355 +#: pg_dump.c:18403 #, c-format msgid "reading dependency data" msgstr "obteniendo datos de dependencias" -#: pg_dump.c:18448 +#: pg_dump.c:18496 #, c-format msgid "no referencing object %u %u" msgstr "no existe el objeto referenciante %u %u" -#: pg_dump.c:18459 +#: pg_dump.c:18507 #, c-format msgid "no referenced object %u %u" msgstr "no existe el objeto referenciado %u %u" -#: pg_dump.c:18833 +#: pg_dump.c:18896 #, c-format msgid "could not parse reloptions array" msgstr "no se pudo interpretar el arreglo reloptions" -#: pg_dump_sort.c:411 +#: pg_dump_sort.c:420 #, c-format msgid "invalid dumpId %d" msgstr "dumpId %d no válido" -#: pg_dump_sort.c:417 +#: pg_dump_sort.c:426 #, c-format msgid "invalid dependency %d" msgstr "dependencia %d no válida" -#: pg_dump_sort.c:650 +#: pg_dump_sort.c:659 #, c-format msgid "could not identify dependency loop" msgstr "no se pudo identificar bucle de dependencia" -#: pg_dump_sort.c:1221 +#: pg_dump_sort.c:1230 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" msgstr[0] "hay restricciones de llave foránea circulares en la siguiente tabla:" msgstr[1] "hay restricciones de llave foránea circulares entre las siguientes tablas:" -#: pg_dump_sort.c:1225 pg_dump_sort.c:1245 +#: pg_dump_sort.c:1234 pg_dump_sort.c:1254 #, c-format msgid " %s" msgstr " %s" -#: pg_dump_sort.c:1226 +#: pg_dump_sort.c:1235 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "Puede no ser capaz de restaurar el respaldo sin usar --disable-triggers o temporalmente eliminar las restricciones." -#: pg_dump_sort.c:1227 +#: pg_dump_sort.c:1236 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "Considere usar un volcado completo en lugar de --data-only para evitar este problema." -#: pg_dump_sort.c:1239 +#: pg_dump_sort.c:1248 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "no se pudo resolver el bucle de dependencias entre los siguientes elementos:" -#: pg_dumpall.c:200 +#: pg_dumpall.c:202 #, c-format msgid "" "The program \"%s\" is needed by %s but was not found in the\n" @@ -2296,7 +2301,7 @@ msgstr "" "mismo directorio que «%s».\n" "Verifique su instalación." -#: pg_dumpall.c:205 +#: pg_dumpall.c:207 #, c-format msgid "" "The program \"%s\" was found by \"%s\"\n" @@ -2307,32 +2312,32 @@ msgstr "" "but no era de la misma versión que %s.\n" "Verifique su instalación." -#: pg_dumpall.c:357 +#: pg_dumpall.c:359 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "la opción --exclude-database no puede ser usada junto con -g/--globals-only, -r/--roles-only o -t/--tablespaces-only" -#: pg_dumpall.c:366 +#: pg_dumpall.c:368 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "las opciones -g/--globals-only y -r/--roles-only no pueden usarse juntas" -#: pg_dumpall.c:374 +#: pg_dumpall.c:376 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "las opciones -g/--globals-only y -t/--tablespaces-only no pueden usarse juntas" -#: pg_dumpall.c:388 +#: pg_dumpall.c:390 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "las opciones -r/--roles-only y -t/--tablespaces-only no pueden usarse juntas" -#: pg_dumpall.c:449 pg_dumpall.c:1751 +#: pg_dumpall.c:453 pg_dumpall.c:1756 #, c-format msgid "could not connect to database \"%s\"" msgstr "no se pudo establecer la conexión a la base de datos «%s»" -#: pg_dumpall.c:463 +#: pg_dumpall.c:467 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2341,7 +2346,7 @@ msgstr "" "no se pudo establecer la conexión a las bases de datos «postgres» o\n" "«template1». Por favor especifique una base de datos para conectarse." -#: pg_dumpall.c:617 +#: pg_dumpall.c:621 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2351,73 +2356,73 @@ msgstr "" "guión (script) SQL.\n" "\n" -#: pg_dumpall.c:619 +#: pg_dumpall.c:623 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPCIÓN]...\n" -#: pg_dumpall.c:622 +#: pg_dumpall.c:626 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=ARCHIVO nombre del archivo de salida\n" -#: pg_dumpall.c:629 +#: pg_dumpall.c:633 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean tira (drop) la base de datos antes de crearla\n" -#: pg_dumpall.c:631 +#: pg_dumpall.c:635 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr " -g, --globals-only extrae sólo los objetos globales, no bases de datos\n" -#: pg_dumpall.c:632 pg_restore.c:485 +#: pg_dumpall.c:636 pg_restore.c:485 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner no reestablece los dueños de los objetos\n" -#: pg_dumpall.c:633 +#: pg_dumpall.c:637 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr "" " -r, --roles-only extrae sólo los roles, no bases de datos\n" " ni tablespaces\n" -#: pg_dumpall.c:635 +#: pg_dumpall.c:639 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr "" " -S, --superuser=NAME especifica el nombre del superusuario a usar en\n" " el volcado\n" -#: pg_dumpall.c:636 +#: pg_dumpall.c:640 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr "" " -t, --tablespaces-only extrae sólo los tablespaces, no bases de datos\n" " ni roles\n" -#: pg_dumpall.c:642 +#: pg_dumpall.c:646 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr " --exclude-database=PATRÓN excluir bases de datos cuyos nombres coinciden con el patrón\n" -#: pg_dumpall.c:649 +#: pg_dumpall.c:653 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords no extraer contraseñas para roles\n" -#: pg_dumpall.c:663 +#: pg_dumpall.c:668 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=CONNSTR conectar usando la cadena de conexión\n" -#: pg_dumpall.c:665 +#: pg_dumpall.c:670 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=NOMBRE especifica la base de datos a la cual conectarse\n" -#: pg_dumpall.c:672 +#: pg_dumpall.c:677 #, c-format msgid "" "\n" @@ -2429,52 +2434,52 @@ msgstr "" "Si no se usa -f/--file, el volcado de SQL será escrito a la salida estándar.\n" "\n" -#: pg_dumpall.c:878 +#: pg_dumpall.c:883 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "omitido nombre de rol que empieza con «pg_» (%s)" -#: pg_dumpall.c:1279 +#: pg_dumpall.c:1284 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "no se pudo interpretar la lista de control de acceso (%s) del tablespace «%s»" -#: pg_dumpall.c:1496 +#: pg_dumpall.c:1501 #, c-format msgid "excluding database \"%s\"" msgstr "excluyendo base de datos «%s»" -#: pg_dumpall.c:1500 +#: pg_dumpall.c:1505 #, c-format msgid "dumping database \"%s\"" msgstr "extrayendo base de datos «%s»" -#: pg_dumpall.c:1532 +#: pg_dumpall.c:1537 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "pg_dump falló en la base de datos «%s», saliendo" -#: pg_dumpall.c:1541 +#: pg_dumpall.c:1546 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "no se pudo reabrir el archivo de salida «%s»: %m" -#: pg_dumpall.c:1585 +#: pg_dumpall.c:1590 #, c-format msgid "running \"%s\"" msgstr "ejecutando «%s»" -#: pg_dumpall.c:1800 +#: pg_dumpall.c:1805 #, c-format msgid "could not get server version" msgstr "no se pudo obtener la versión del servidor" -#: pg_dumpall.c:1806 +#: pg_dumpall.c:1811 #, c-format msgid "could not parse server version \"%s\"" msgstr "no se pudo interpretar la versión del servidor «%s»" -#: pg_dumpall.c:1878 pg_dumpall.c:1901 +#: pg_dumpall.c:1883 pg_dumpall.c:1906 #, c-format msgid "executing %s" msgstr "ejecutando %s" @@ -2731,38 +2736,50 @@ msgstr "" "Si no se especifica un archivo de entrada, se usa la entrada estándar.\n" "\n" -#~ msgid "could not connect to database \"%s\": %s" -#~ msgstr "no se pudo conectar a la base de datos «%s»: %s" +#~ msgid "WSAStartup failed: %d" +#~ msgstr "WSAStartup falló: %d" #~ msgid "aggregate function %s could not be dumped correctly for this database version; ignored" #~ msgstr "la función de agregación «%s» no se pudo extraer correctamente para esta versión de la base de datos; ignorada" -#~ msgid "reading publication membership for table \"%s.%s\"" -#~ msgstr "extrayendo la membresía en publicaciones para la tabla «%s.%s»" - -#~ msgid "connection to database \"%s\" failed: %s" -#~ msgstr "falló la conexión a la base de datos «%s»: %s" +#~ msgid "connecting to database \"%s\" as user \"%s\"" +#~ msgstr "conectandose a la base de datos \"%s\" como el usuario «%s»" #~ msgid "connection needs password" #~ msgstr "la conexión necesita contraseña" -#~ msgid "could not reconnect to database: %s" -#~ msgstr "no se pudo hacer la reconexión a la base de datos: %s" +#~ msgid "connection to database \"%s\" failed: %s" +#~ msgstr "falló la conexión a la base de datos «%s»: %s" + +#~ msgid "could not connect to database \"%s\": %s" +#~ msgstr "no se pudo conectar a la base de datos «%s»: %s" #~ msgid "could not reconnect to database" #~ msgstr "no se pudo hacer la reconexión a la base de datos" -#~ msgid "connecting to database \"%s\" as user \"%s\"" -#~ msgstr "conectandose a la base de datos \"%s\" como el usuario «%s»" +#~ msgid "could not reconnect to database: %s" +#~ msgstr "no se pudo hacer la reconexión a la base de datos: %s" #~ msgid "could not write to large object (result: %lu, expected: %lu)" #~ msgstr "no se pudo escribir al objecto grande (resultado: %lu, esperado: %lu)" -#~ msgid "select() failed: %m" -#~ msgstr "select() fallida: %m" - -#~ msgid "WSAStartup failed: %d" -#~ msgstr "WSAStartup falló: %d" +#~ msgid "invalid TOASTCOMPRESSION item: %s" +#~ msgstr "elemento TOASTCOMPRESSION no válido: %s" #~ msgid "pclose failed: %m" #~ msgstr "pclose falló: %m" + +#~ msgid "reading policies for table \"%s.%s\"" +#~ msgstr "extrayendo las políticas para la tabla «%s.%s»" + +#~ msgid "reading publication membership for table \"%s.%s\"" +#~ msgstr "extrayendo la membresía en publicaciones para la tabla «%s.%s»" + +#~ msgid "reading row security enabled for table \"%s.%s\"" +#~ msgstr "leyendo si seguridad de filas está activa para la tabla «%s.%s»" + +#~ msgid "saving default_toast_compression = %s" +#~ msgstr "salvando default_toast_compression = %s" + +#~ msgid "select() failed: %m" +#~ msgstr "select() fallida: %m" diff --git a/src/bin/pg_dump/po/fr.po b/src/bin/pg_dump/po/fr.po index cb3002ecca..bf63e5fc4d 100644 --- a/src/bin/pg_dump/po/fr.po +++ b/src/bin/pg_dump/po/fr.po @@ -1,76 +1,84 @@ -# translation of pg_dump.po to fr_fr -# french message translation file for pg_dump +# LANGUAGE message translation file for pg_dump +# Copyright (C) 2004-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_dump (PostgreSQL) package. # # Use these quotes: « %s » # # Guillaume Lelarge , 2004-2009. # Stéphane Schildknecht , 2009. +# Guillaume Lelarge , 2010-2022. +# msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-28 00:48+0000\n" -"PO-Revision-Date: 2021-05-28 15:23+0200\n" +"POT-Creation-Date: 2022-05-14 10:19+0000\n" +"PO-Revision-Date: 2022-05-14 17:16+0200\n" "Last-Translator: Guillaume Lelarge \n" -"Language-Team: PostgreSQLfr \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 2.4.3\n" - -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "fatal : " +"X-Generator: Poedit 3.0.1\n" -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "attention : " -#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "astuce : " + +#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "n'a pas pu identifier le répertoire courant : %m" -#: ../../common/exec.c:155 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "binaire « %s » invalide" -#: ../../common/exec.c:205 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "n'a pas pu lire le binaire « %s »" -#: ../../common/exec.c:213 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "n'a pas pu trouver un « %s » à exécuter" -#: ../../common/exec.c:269 ../../common/exec.c:308 +#: ../../common/exec.c:282 ../../common/exec.c:321 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "n'a pas pu modifier le répertoire par « %s » : %m" -#: ../../common/exec.c:286 +#: ../../common/exec.c:299 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "n'a pas pu lire le lien symbolique « %s » : %m" -#: ../../common/exec.c:409 parallel.c:1614 +#: ../../common/exec.c:422 parallel.c:1611 #, c-format msgid "%s() failed: %m" msgstr "échec de %s() : %m" -#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 msgid "out of memory" msgstr "mémoire épuisée" @@ -115,217 +123,232 @@ msgstr "le processus fils a été terminé par le signal %d : %s" msgid "child process exited with unrecognized status %d" msgstr "le processus fils a quitté avec un statut %d non reconnu" -#: common.c:124 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "valeur « %s » invalide pour l'option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s doit être compris entre %d et %d" + +#: common.c:134 #, c-format msgid "reading extensions" msgstr "lecture des extensions" -#: common.c:128 +#: common.c:137 #, c-format msgid "identifying extension members" msgstr "identification des membres d'extension" -#: common.c:131 +#: common.c:140 #, c-format msgid "reading schemas" msgstr "lecture des schémas" -#: common.c:141 +#: common.c:149 #, c-format msgid "reading user-defined tables" msgstr "lecture des tables utilisateur" -#: common.c:148 +#: common.c:154 #, c-format msgid "reading user-defined functions" msgstr "lecture des fonctions utilisateur" -#: common.c:153 +#: common.c:158 #, c-format msgid "reading user-defined types" msgstr "lecture des types utilisateur" -#: common.c:158 +#: common.c:162 #, c-format msgid "reading procedural languages" msgstr "lecture des langages procéduraux" -#: common.c:161 +#: common.c:165 #, c-format msgid "reading user-defined aggregate functions" msgstr "lecture des fonctions d'agrégats utilisateur" -#: common.c:164 +#: common.c:168 #, c-format msgid "reading user-defined operators" msgstr "lecture des opérateurs utilisateur" -#: common.c:168 +#: common.c:171 #, c-format msgid "reading user-defined access methods" msgstr "lecture des méthodes d'accès définis par les utilisateurs" -#: common.c:171 +#: common.c:174 #, c-format msgid "reading user-defined operator classes" msgstr "lecture des classes d'opérateurs utilisateur" -#: common.c:174 +#: common.c:177 #, c-format msgid "reading user-defined operator families" msgstr "lecture des familles d'opérateurs utilisateur" -#: common.c:177 +#: common.c:180 #, c-format msgid "reading user-defined text search parsers" msgstr "lecture des analyseurs utilisateur pour la recherche plein texte" -#: common.c:180 +#: common.c:183 #, c-format msgid "reading user-defined text search templates" msgstr "lecture des modèles utilisateur pour la recherche plein texte" -#: common.c:183 +#: common.c:186 #, c-format msgid "reading user-defined text search dictionaries" msgstr "lecture des dictionnaires utilisateur pour la recherche plein texte" -#: common.c:186 +#: common.c:189 #, c-format msgid "reading user-defined text search configurations" msgstr "lecture des configurations utilisateur pour la recherche plein texte" -#: common.c:189 +#: common.c:192 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "lecture des wrappers de données distantes utilisateur" -#: common.c:192 +#: common.c:195 #, c-format msgid "reading user-defined foreign servers" msgstr "lecture des serveurs distants utilisateur" -#: common.c:195 +#: common.c:198 #, c-format msgid "reading default privileges" msgstr "lecture des droits par défaut" -#: common.c:198 +#: common.c:201 #, c-format msgid "reading user-defined collations" msgstr "lecture des collationnements utilisateurs" -#: common.c:202 +#: common.c:204 #, c-format msgid "reading user-defined conversions" msgstr "lecture des conversions utilisateur" -#: common.c:205 +#: common.c:207 #, c-format msgid "reading type casts" msgstr "lecture des conversions de type" -#: common.c:208 +#: common.c:210 #, c-format msgid "reading transforms" msgstr "lecture des transformations" -#: common.c:211 +#: common.c:213 #, c-format msgid "reading table inheritance information" msgstr "lecture des informations d'héritage des tables" -#: common.c:214 +#: common.c:216 #, c-format msgid "reading event triggers" msgstr "lecture des triggers sur évènement" -#: common.c:218 +#: common.c:220 #, c-format msgid "finding extension tables" msgstr "recherche des tables d'extension" -#: common.c:222 +#: common.c:224 #, c-format msgid "finding inheritance relationships" msgstr "recherche des relations d'héritage" -#: common.c:225 +#: common.c:227 #, c-format msgid "reading column info for interesting tables" msgstr "lecture des informations de colonnes des tables intéressantes" -#: common.c:228 +#: common.c:230 #, c-format msgid "flagging inherited columns in subtables" msgstr "marquage des colonnes héritées dans les sous-tables" -#: common.c:231 +#: common.c:233 #, c-format msgid "reading indexes" msgstr "lecture des index" -#: common.c:234 +#: common.c:236 #, c-format msgid "flagging indexes in partitioned tables" msgstr "décrit les index des tables partitionnées" -#: common.c:237 +#: common.c:239 #, c-format msgid "reading extended statistics" msgstr "lecture des statistiques étendues" -#: common.c:240 +#: common.c:242 #, c-format msgid "reading constraints" msgstr "lecture des contraintes" -#: common.c:243 +#: common.c:245 #, c-format msgid "reading triggers" msgstr "lecture des triggers" -#: common.c:246 +#: common.c:248 #, c-format msgid "reading rewrite rules" msgstr "lecture des règles de réécriture" -#: common.c:249 +#: common.c:251 #, c-format msgid "reading policies" msgstr "lecture des politiques" -#: common.c:252 +#: common.c:254 #, c-format msgid "reading publications" msgstr "lecture des publications" #: common.c:257 #, c-format -msgid "reading publication membership" -msgstr "lecture des appartenances aux publications" +msgid "reading publication membership of tables" +msgstr "lecture des appartenances aux publications des tables" #: common.c:260 #, c-format +msgid "reading publication membership of schemas" +msgstr "lecture des appartenances aux publications des schémas" + +#: common.c:263 +#, c-format msgid "reading subscriptions" msgstr "lecture des souscriptions" -#: common.c:338 +#: common.c:343 #, c-format msgid "invalid number of parents %d for table \"%s\"" msgstr "nombre de parents invalide (%d) pour la table « %s »" -#: common.c:1100 +#: common.c:1004 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "vérification échouée, OID %u parent de la table « %s » (OID %u) introuvable" -#: common.c:1142 +#: common.c:1043 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "n'a pas pu analyser le tableau numérique « %s » : trop de nombres" -#: common.c:1157 +#: common.c:1055 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "n'a pas pu analyser le tableau numérique « %s » : caractère invalide dans le nombre" @@ -366,43 +389,43 @@ msgstr "n'a pas pu décompresser les données : %s" msgid "could not close compression library: %s" msgstr "n'a pas pu fermer la bibliothèque de compression : %s" -#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:551 pg_backup_tar.c:554 +#: compress_io.c:584 compress_io.c:621 #, c-format msgid "could not read from input file: %s" msgstr "n'a pas pu lire à partir du fichier en entrée : %s" -#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:552 -#: pg_backup_tar.c:787 pg_backup_tar.c:810 +#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553 +#: pg_backup_tar.c:726 pg_backup_tar.c:749 #, c-format msgid "could not read from input file: end of file" msgstr "n'a pas pu lire à partir du fichier en entrée : fin du fichier" -#: parallel.c:254 +#: parallel.c:253 #, c-format msgid "%s() failed: error code %d" msgstr "échec de %s() : code d'erreur %d" -#: parallel.c:964 +#: parallel.c:961 #, c-format msgid "could not create communication channels: %m" msgstr "n'a pas pu créer le canal de communication : %m" -#: parallel.c:1021 +#: parallel.c:1018 #, c-format msgid "could not create worker process: %m" msgstr "n'a pas pu créer le processus worker : %m" -#: parallel.c:1151 +#: parallel.c:1148 #, c-format msgid "unrecognized command received from leader: \"%s\"" msgstr "commande non reconnue reçue du leader : « %s »" -#: parallel.c:1194 parallel.c:1432 +#: parallel.c:1191 parallel.c:1429 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "message invalide reçu du worker: « %s »" -#: parallel.c:1326 +#: parallel.c:1323 #, c-format msgid "" "could not obtain lock on relation \"%s\"\n" @@ -411,212 +434,212 @@ msgstr "" "impossible d'obtenir un verrou sur la relation « %s »\n" "Cela signifie en général que quelqu'un a demandé un verrou ACCESS EXCLUSIVE sur la table après que pg_dump ait obtenu son verrou ACCESS SHARE initial sur la table." -#: parallel.c:1415 +#: parallel.c:1412 #, c-format msgid "a worker process died unexpectedly" msgstr "un processus worker a subi un arrêt brutal inattendu" -#: parallel.c:1537 parallel.c:1655 +#: parallel.c:1534 parallel.c:1652 #, c-format msgid "could not write to the communication channel: %m" msgstr "n'a pas pu écrire dans le canal de communication: %m" -#: parallel.c:1739 +#: parallel.c:1736 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: n'a pas pu créer le socket: code d'erreur %d" -#: parallel.c:1750 +#: parallel.c:1747 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: n'a pas pu se lier: code d'erreur %d" -#: parallel.c:1757 +#: parallel.c:1754 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe : n'a pas pu se mettre en écoute: code d'erreur %d" -#: parallel.c:1764 +#: parallel.c:1761 #, c-format msgid "pgpipe: %s() failed: error code %d" msgstr "pgpipe: échec de %s() : code d'erreur %d" -#: parallel.c:1775 +#: parallel.c:1772 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: n'a pas pu créer un deuxième socket: code d'erreur %d" -#: parallel.c:1784 +#: parallel.c:1781 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: n'a pas pu se connecter au socket: code d'erreur %d" -#: parallel.c:1793 +#: parallel.c:1790 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: n'a pas pu accepter de connexion: code d'erreur %d" -#: pg_backup_archiver.c:277 pg_backup_archiver.c:1576 +#: pg_backup_archiver.c:279 pg_backup_archiver.c:1576 #, c-format msgid "could not close output file: %m" msgstr "n'a pas pu fermer le fichier en sortie : %m" -#: pg_backup_archiver.c:321 pg_backup_archiver.c:325 +#: pg_backup_archiver.c:323 pg_backup_archiver.c:327 #, c-format msgid "archive items not in correct section order" msgstr "les éléments de l'archive ne sont pas dans l'ordre correct de la section" -#: pg_backup_archiver.c:331 +#: pg_backup_archiver.c:333 #, c-format msgid "unexpected section code %d" msgstr "code de section inattendu %d" -#: pg_backup_archiver.c:368 +#: pg_backup_archiver.c:370 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "la restauration parallélisée n'est pas supportée avec ce format de fichier d'archive" -#: pg_backup_archiver.c:372 +#: pg_backup_archiver.c:374 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "la restauration parallélisée n'est pas supportée avec les archives réalisées par un pg_dump antérieur à la 8.0" -#: pg_backup_archiver.c:390 +#: pg_backup_archiver.c:392 #, c-format msgid "cannot restore from compressed archive (compression not supported in this installation)" msgstr "ne peut pas restaurer à partir de l'archive compressée (compression indisponible dans cette installation)" -#: pg_backup_archiver.c:407 +#: pg_backup_archiver.c:409 #, c-format msgid "connecting to database for restore" msgstr "connexion à la base de données pour la restauration" -#: pg_backup_archiver.c:409 +#: pg_backup_archiver.c:411 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "les connexions directes à la base de données ne sont pas supportées dans les archives pre-1.3" -#: pg_backup_archiver.c:452 +#: pg_backup_archiver.c:454 #, c-format msgid "implied data-only restore" msgstr "a impliqué une restauration des données uniquement" -#: pg_backup_archiver.c:518 +#: pg_backup_archiver.c:520 #, c-format msgid "dropping %s %s" msgstr "suppression de %s %s" -#: pg_backup_archiver.c:613 +#: pg_backup_archiver.c:615 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "n'a pas pu trouver où insérer IF EXISTS dans l'instruction « %s »" -#: pg_backup_archiver.c:769 pg_backup_archiver.c:771 +#: pg_backup_archiver.c:771 pg_backup_archiver.c:773 #, c-format msgid "warning from original dump file: %s" msgstr "message d'avertissement du fichier de sauvegarde original : %s" -#: pg_backup_archiver.c:786 +#: pg_backup_archiver.c:788 #, c-format msgid "creating %s \"%s.%s\"" msgstr "création de %s « %s.%s »" -#: pg_backup_archiver.c:789 +#: pg_backup_archiver.c:791 #, c-format msgid "creating %s \"%s\"" msgstr "création de %s « %s »" -#: pg_backup_archiver.c:839 +#: pg_backup_archiver.c:841 #, c-format msgid "connecting to new database \"%s\"" msgstr "connexion à la nouvelle base de données « %s »" -#: pg_backup_archiver.c:866 +#: pg_backup_archiver.c:868 #, c-format msgid "processing %s" msgstr "traitement de %s" -#: pg_backup_archiver.c:886 +#: pg_backup_archiver.c:888 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "traitement des données de la table « %s.%s »" -#: pg_backup_archiver.c:948 +#: pg_backup_archiver.c:947 #, c-format msgid "executing %s %s" msgstr "exécution de %s %s" -#: pg_backup_archiver.c:987 +#: pg_backup_archiver.c:986 #, c-format msgid "disabling triggers for %s" msgstr "désactivation des triggers pour %s" -#: pg_backup_archiver.c:1013 +#: pg_backup_archiver.c:1012 #, c-format msgid "enabling triggers for %s" msgstr "activation des triggers pour %s" -#: pg_backup_archiver.c:1041 +#: pg_backup_archiver.c:1040 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "erreur interne -- WriteData ne peut pas être appelé en dehors du contexte de la routine DataDumper" -#: pg_backup_archiver.c:1224 +#: pg_backup_archiver.c:1223 #, c-format msgid "large-object output not supported in chosen format" msgstr "la sauvegarde des « Large Objects » n'est pas supportée dans le format choisi" -#: pg_backup_archiver.c:1282 +#: pg_backup_archiver.c:1281 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "restauration de %d « Large Object »" msgstr[1] "restauration de %d « Large Objects »" -#: pg_backup_archiver.c:1303 pg_backup_tar.c:730 +#: pg_backup_archiver.c:1302 pg_backup_tar.c:669 #, c-format msgid "restoring large object with OID %u" msgstr "restauration du « Large Object » d'OID %u" -#: pg_backup_archiver.c:1315 +#: pg_backup_archiver.c:1314 #, c-format msgid "could not create large object %u: %s" msgstr "n'a pas pu créer le « Large Object » %u : %s" -#: pg_backup_archiver.c:1320 pg_dump.c:3638 +#: pg_backup_archiver.c:1319 pg_dump.c:3538 #, c-format msgid "could not open large object %u: %s" msgstr "n'a pas pu ouvrir le « Large Object » %u : %s" -#: pg_backup_archiver.c:1376 +#: pg_backup_archiver.c:1375 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier TOC « %s » : %m" -#: pg_backup_archiver.c:1404 +#: pg_backup_archiver.c:1403 #, c-format msgid "line ignored: %s" msgstr "ligne ignorée : %s" -#: pg_backup_archiver.c:1411 +#: pg_backup_archiver.c:1410 #, c-format msgid "could not find entry for ID %d" msgstr "n'a pas pu trouver l'entrée pour l'ID %d" -#: pg_backup_archiver.c:1434 pg_backup_directory.c:222 -#: pg_backup_directory.c:598 +#: pg_backup_archiver.c:1433 pg_backup_directory.c:222 +#: pg_backup_directory.c:599 #, c-format msgid "could not close TOC file: %m" msgstr "n'a pas pu fermer le fichier TOC : %m" -#: pg_backup_archiver.c:1548 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:585 pg_backup_directory.c:648 -#: pg_backup_directory.c:667 pg_dumpall.c:489 +#: pg_backup_archiver.c:1547 pg_backup_custom.c:156 pg_backup_directory.c:332 +#: pg_backup_directory.c:586 pg_backup_directory.c:649 +#: pg_backup_directory.c:668 pg_dumpall.c:476 #, c-format msgid "could not open output file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier de sauvegarde « %s » : %m" -#: pg_backup_archiver.c:1550 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1549 pg_backup_custom.c:162 #, c-format msgid "could not open output file: %m" msgstr "n'a pas pu ouvrir le fichier de sauvegarde : %m" @@ -684,7 +707,7 @@ msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does msgstr "le répertoire « %s » ne semble pas être une archive valide (« toc.dat » n'existe pas)" #: pg_backup_archiver.c:2120 pg_backup_custom.c:173 pg_backup_custom.c:807 -#: pg_backup_directory.c:207 pg_backup_directory.c:394 +#: pg_backup_directory.c:207 pg_backup_directory.c:395 #, c-format msgid "could not open input file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier en entrée « %s » : %m" @@ -729,157 +752,157 @@ msgstr "n'a pas pu fermer le fichier en entrée : %m" msgid "unrecognized file format \"%d\"" msgstr "format de fichier « %d » non reconnu" -#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4390 +#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4445 #, c-format msgid "finished item %d %s %s" msgstr "élément terminé %d %s %s" -#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4403 +#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4458 #, c-format msgid "worker process failed: exit code %d" msgstr "échec du processus worker : code de sortie %d" -#: pg_backup_archiver.c:2511 +#: pg_backup_archiver.c:2512 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "ID %d de l'entrée en dehors de la plage -- peut-être un TOC corrompu" -#: pg_backup_archiver.c:2578 +#: pg_backup_archiver.c:2592 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "la restauration des tables avec WITH OIDS n'est plus supportée" -#: pg_backup_archiver.c:2660 +#: pg_backup_archiver.c:2674 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "encodage « %s » non reconnu" -#: pg_backup_archiver.c:2665 +#: pg_backup_archiver.c:2679 #, c-format msgid "invalid ENCODING item: %s" msgstr "élément ENCODING invalide : %s" -#: pg_backup_archiver.c:2683 +#: pg_backup_archiver.c:2697 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "élément STDSTRINGS invalide : %s" -#: pg_backup_archiver.c:2708 +#: pg_backup_archiver.c:2722 #, c-format msgid "schema \"%s\" not found" msgstr "schéma « %s » non trouvé" -#: pg_backup_archiver.c:2715 +#: pg_backup_archiver.c:2729 #, c-format msgid "table \"%s\" not found" msgstr "table « %s » non trouvée" -#: pg_backup_archiver.c:2722 +#: pg_backup_archiver.c:2736 #, c-format msgid "index \"%s\" not found" msgstr "index « %s » non trouvé" -#: pg_backup_archiver.c:2729 +#: pg_backup_archiver.c:2743 #, c-format msgid "function \"%s\" not found" msgstr "fonction « %s » non trouvée" -#: pg_backup_archiver.c:2736 +#: pg_backup_archiver.c:2750 #, c-format msgid "trigger \"%s\" not found" msgstr "trigger « %s » non trouvé" -#: pg_backup_archiver.c:3128 +#: pg_backup_archiver.c:3143 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "n'a pas pu initialiser la session utilisateur à « %s »: %s" -#: pg_backup_archiver.c:3260 +#: pg_backup_archiver.c:3280 #, c-format msgid "could not set search_path to \"%s\": %s" msgstr "n'a pas pu configurer search_path à « %s » : %s" -#: pg_backup_archiver.c:3322 +#: pg_backup_archiver.c:3342 #, c-format msgid "could not set default_tablespace to %s: %s" msgstr "n'a pas pu configurer default_tablespace à %s : %s" -#: pg_backup_archiver.c:3367 +#: pg_backup_archiver.c:3392 #, c-format msgid "could not set default_table_access_method: %s" msgstr "n'a pas pu configurer la méthode default_table_access_method à %s" -#: pg_backup_archiver.c:3459 pg_backup_archiver.c:3617 +#: pg_backup_archiver.c:3486 pg_backup_archiver.c:3651 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "ne sait pas comment initialiser le propriétaire du type d'objet « %s »" -#: pg_backup_archiver.c:3721 +#: pg_backup_archiver.c:3754 #, c-format msgid "did not find magic string in file header" msgstr "n'a pas trouver la chaîne magique dans le fichier d'en-tête" -#: pg_backup_archiver.c:3735 +#: pg_backup_archiver.c:3768 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "version non supportée (%d.%d) dans le fichier d'en-tête" -#: pg_backup_archiver.c:3740 +#: pg_backup_archiver.c:3773 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "échec de la vérification sur la taille de l'entier (%lu)" -#: pg_backup_archiver.c:3744 +#: pg_backup_archiver.c:3777 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "l'archive a été créée sur une machine disposant d'entiers plus larges, certaines opérations peuvent échouer" -#: pg_backup_archiver.c:3754 +#: pg_backup_archiver.c:3787 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "le format attendu (%d) diffère du format du fichier (%d)" -#: pg_backup_archiver.c:3769 +#: pg_backup_archiver.c:3802 #, c-format msgid "archive is compressed, but this installation does not support compression -- no data will be available" msgstr "l'archive est compressée mais cette installation ne supporte pas la compression -- aucune donnée ne sera disponible" -#: pg_backup_archiver.c:3787 +#: pg_backup_archiver.c:3836 #, c-format msgid "invalid creation date in header" msgstr "date de création invalide dans l'en-tête" -#: pg_backup_archiver.c:3915 +#: pg_backup_archiver.c:3970 #, c-format msgid "processing item %d %s %s" msgstr "traitement de l'élément %d %s %s" -#: pg_backup_archiver.c:3994 +#: pg_backup_archiver.c:4049 #, c-format msgid "entering main parallel loop" msgstr "entrée dans la boucle parallèle principale" -#: pg_backup_archiver.c:4005 +#: pg_backup_archiver.c:4060 #, c-format msgid "skipping item %d %s %s" msgstr "omission de l'élément %d %s %s" -#: pg_backup_archiver.c:4014 +#: pg_backup_archiver.c:4069 #, c-format msgid "launching item %d %s %s" msgstr "lancement de l'élément %d %s %s" -#: pg_backup_archiver.c:4068 +#: pg_backup_archiver.c:4123 #, c-format msgid "finished main parallel loop" msgstr "fin de la boucle parallèle principale" -#: pg_backup_archiver.c:4104 +#: pg_backup_archiver.c:4159 #, c-format msgid "processing missed item %d %s %s" msgstr "traitement de l'élément manquant %d %s %s" -#: pg_backup_archiver.c:4709 +#: pg_backup_archiver.c:4764 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "la table « %s » n'a pas pu être créée, ses données ne seront pas restaurées" @@ -890,7 +913,7 @@ msgid "invalid OID for large object" msgstr "OID invalide pour le « Large Object »" #: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629 -#: pg_backup_custom.c:865 pg_backup_tar.c:1080 pg_backup_tar.c:1085 +#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021 #, c-format msgid "error during file seek: %m" msgstr "erreur lors de la recherche dans le fichier : %m" @@ -935,7 +958,7 @@ msgid "could not read from input file: %m" msgstr "n'a pas pu lire à partir du fichier en entrée : %m" #: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943 -#: pg_backup_tar.c:1083 +#: pg_backup_tar.c:1019 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "n'a pas pu déterminer la position de recherche dans le fichier d'archive : %m" @@ -975,91 +998,91 @@ msgstr "compression activée" msgid "could not get server_version from libpq" msgstr "n'a pas pu obtenir server_version de libpq" -#: pg_backup_db.c:53 pg_dumpall.c:1826 -#, c-format -msgid "server version: %s; %s version: %s" -msgstr "version du serveur : %s ; %s version : %s" - -#: pg_backup_db.c:55 pg_dumpall.c:1828 +#: pg_backup_db.c:53 pg_dumpall.c:1646 #, c-format msgid "aborting because of server version mismatch" msgstr "annulation à cause de la différence des versions" -#: pg_backup_db.c:124 +#: pg_backup_db.c:54 pg_dumpall.c:1647 +#, c-format +msgid "server version: %s; %s version: %s" +msgstr "version du serveur : %s ; %s version : %s" + +#: pg_backup_db.c:120 #, c-format msgid "already connected to a database" msgstr "déjà connecté à une base de données" -#: pg_backup_db.c:132 pg_backup_db.c:182 pg_dumpall.c:1655 pg_dumpall.c:1766 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595 msgid "Password: " msgstr "Mot de passe : " -#: pg_backup_db.c:174 +#: pg_backup_db.c:170 #, c-format msgid "could not connect to database" msgstr "n'a pas pu se connecter à la base de données" -#: pg_backup_db.c:191 +#: pg_backup_db.c:187 #, c-format msgid "reconnection failed: %s" msgstr "échec de la reconnexion : %s" -#: pg_backup_db.c:194 pg_backup_db.c:269 pg_dumpall.c:1686 pg_dumpall.c:1776 +#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dumpall.c:1520 pg_dumpall.c:1604 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:276 pg_dumpall.c:1889 pg_dumpall.c:1912 +#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732 #, c-format msgid "query failed: %s" msgstr "échec de la requête : %s" -#: pg_backup_db.c:278 pg_dumpall.c:1890 pg_dumpall.c:1913 +#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733 #, c-format -msgid "query was: %s" -msgstr "la requête était : %s" +msgid "Query was: %s" +msgstr "La requête était : %s" -#: pg_backup_db.c:319 +#: pg_backup_db.c:316 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" msgstr[0] "la requête a renvoyé %d ligne au lieu d'une seule : %s" msgstr[1] "la requête a renvoyé %d lignes au lieu d'une seule : %s" -#: pg_backup_db.c:355 +#: pg_backup_db.c:352 #, c-format msgid "%s: %sCommand was: %s" msgstr "%s: %sLa commande était : %s" -#: pg_backup_db.c:411 pg_backup_db.c:485 pg_backup_db.c:492 +#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489 msgid "could not execute query" msgstr "n'a pas pu exécuter la requête" -#: pg_backup_db.c:464 +#: pg_backup_db.c:461 #, c-format msgid "error returned by PQputCopyData: %s" msgstr "erreur renvoyée par PQputCopyData : %s" -#: pg_backup_db.c:513 +#: pg_backup_db.c:510 #, c-format msgid "error returned by PQputCopyEnd: %s" msgstr "erreur renvoyée par PQputCopyEnd : %s" -#: pg_backup_db.c:519 +#: pg_backup_db.c:516 #, c-format msgid "COPY failed for table \"%s\": %s" msgstr "COPY échoué pour la table « %s » : %s" -#: pg_backup_db.c:525 pg_dump.c:2074 +#: pg_backup_db.c:522 pg_dump.c:2105 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "résultats supplémentaires non attendus durant l'exécution de COPY sur la table « %s »" -#: pg_backup_db.c:537 +#: pg_backup_db.c:534 msgid "could not start database transaction" msgstr "n'a pas pu démarrer la transaction de la base de données" -#: pg_backup_db.c:545 +#: pg_backup_db.c:542 msgid "could not commit database transaction" msgstr "n'a pas pu valider la transaction de la base de données" @@ -1083,43 +1106,58 @@ msgstr "n'a pas pu fermer le répertoire « %s » : %m" msgid "could not create directory \"%s\": %m" msgstr "n'a pas pu créer le répertoire « %s » : %m" -#: pg_backup_directory.c:355 pg_backup_directory.c:496 -#: pg_backup_directory.c:532 +#: pg_backup_directory.c:355 pg_backup_directory.c:497 +#: pg_backup_directory.c:533 #, c-format msgid "could not write to output file: %s" msgstr "n'a pas pu écrire dans le fichier en sortie : %s" -#: pg_backup_directory.c:406 +#: pg_backup_directory.c:373 +#, c-format +msgid "could not close data file: %m" +msgstr "n'a pas pu fermer le fichier de données : %m" + +#: pg_backup_directory.c:407 #, c-format msgid "could not close data file \"%s\": %m" msgstr "n'a pas pu fermer le fichier de données « %s » : %m" -#: pg_backup_directory.c:446 +#: pg_backup_directory.c:447 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "n'a pas pu ouvrir le fichier TOC « %s » du Large Object en entrée : %m" -#: pg_backup_directory.c:457 +#: pg_backup_directory.c:458 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "ligne invalide dans le fichier TOC du Large Object « %s » : « %s »" -#: pg_backup_directory.c:466 +#: pg_backup_directory.c:467 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "erreur lors de la lecture du TOC du fichier Large Object « %s »" -#: pg_backup_directory.c:470 +#: pg_backup_directory.c:471 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "n'a pas pu fermer le TOC du Large Object « %s » : %m" -#: pg_backup_directory.c:689 +#: pg_backup_directory.c:685 +#, c-format +msgid "could not close blob data file: %m" +msgstr "n'a pas pu fermer le fichier de données blob : %m" + +#: pg_backup_directory.c:691 #, c-format msgid "could not write to blobs TOC file" msgstr "n'a pas pu écrire dans le fichier TOC des Large Objects" -#: pg_backup_directory.c:721 +#: pg_backup_directory.c:705 +#, c-format +msgid "could not close blobs TOC file: %m" +msgstr "n'a pas pu fermer le fichier TOC des blobs : %m" + +#: pg_backup_directory.c:724 #, c-format msgid "file name too long: \"%s\"" msgstr "nom du fichier trop long : « %s »" @@ -1129,213 +1167,168 @@ msgstr "nom du fichier trop long : « %s »" msgid "this format cannot be read" msgstr "ce format ne peut pas être lu" -#: pg_backup_tar.c:177 +#: pg_backup_tar.c:172 #, c-format msgid "could not open TOC file \"%s\" for output: %m" msgstr "n'a pas pu ouvrir le fichier TOC « %s » en sortie : %m" -#: pg_backup_tar.c:184 +#: pg_backup_tar.c:179 #, c-format msgid "could not open TOC file for output: %m" msgstr "n'a pas pu ouvrir le fichier TOC en sortie : %m" -#: pg_backup_tar.c:203 pg_backup_tar.c:352 +#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389 +#: pg_backup_tar.c:405 pg_backup_tar.c:893 #, c-format msgid "compression is not supported by tar archive format" msgstr "compression non supportée par le format des archives tar" -#: pg_backup_tar.c:211 +#: pg_backup_tar.c:206 #, c-format msgid "could not open TOC file \"%s\" for input: %m" msgstr "n'a pas pu ouvrir le fichier TOC « %s » en entrée : %m" -#: pg_backup_tar.c:218 +#: pg_backup_tar.c:213 #, c-format msgid "could not open TOC file for input: %m" msgstr "n'a pas pu ouvrir le fichier TOC en entrée : %m" -#: pg_backup_tar.c:338 +#: pg_backup_tar.c:322 #, c-format msgid "could not find file \"%s\" in archive" msgstr "n'a pas pu trouver le fichier « %s » dans l'archive" -#: pg_backup_tar.c:404 +#: pg_backup_tar.c:382 #, c-format msgid "could not generate temporary file name: %m" msgstr "impossible de créer le nom du fichier temporaire : %m" -#: pg_backup_tar.c:415 -#, c-format -msgid "could not open temporary file" -msgstr "n'a pas pu ouvrir le fichier temporaire" - -#: pg_backup_tar.c:442 -#, c-format -msgid "could not close tar member" -msgstr "n'a pas pu fermer le membre de tar" - -#: pg_backup_tar.c:685 +#: pg_backup_tar.c:624 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "syntaxe inattendue de l'instruction COPY : « %s »" -#: pg_backup_tar.c:952 +#: pg_backup_tar.c:890 #, c-format msgid "invalid OID for large object (%u)" msgstr "OID invalide pour le « Large Object » (%u)" -#: pg_backup_tar.c:1099 +#: pg_backup_tar.c:1035 #, c-format msgid "could not close temporary file: %m" msgstr "n'a pas pu fermer le fichier temporaire : m" -#: pg_backup_tar.c:1108 +#: pg_backup_tar.c:1038 #, c-format -msgid "actual file length (%s) does not match expected (%s)" -msgstr "la longueur réelle du fichier (%s) ne correspond pas à ce qui était attendu (%s)" +msgid "actual file length (%lld) does not match expected (%lld)" +msgstr "la longueur réelle du fichier (%lld) ne correspond pas à ce qui était attendu (%lld)" -#: pg_backup_tar.c:1165 pg_backup_tar.c:1196 +#: pg_backup_tar.c:1084 pg_backup_tar.c:1115 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "n'a pas pu trouver l'en-tête du fichier « %s » dans l'archive tar" -#: pg_backup_tar.c:1183 +#: pg_backup_tar.c:1102 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "la restauration désordonnée de données n'est pas supportée avec ce format d'archive : « %s » est requis mais vient avant « %s » dans le fichier d'archive." -#: pg_backup_tar.c:1230 +#: pg_backup_tar.c:1149 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "en-tête incomplet du fichier tar (%lu octet)" msgstr[1] "en-tête incomplet du fichier tar (%lu octets)" -#: pg_backup_tar.c:1281 +#: pg_backup_tar.c:1188 #, c-format -msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s" -msgstr "en-tête tar corrompu trouvé dans %s (%d attendu, %d calculé ) à la position %s du fichier" +msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" +msgstr "en-tête tar corrompu trouvé dans %s (%d attendu, %d calculé ) à la position %llu du fichier" #: pg_backup_utils.c:54 #, c-format msgid "unrecognized section name: \"%s\"" msgstr "nom de section non reconnu : « %s »" -#: pg_backup_utils.c:55 pg_dump.c:622 pg_dump.c:639 pg_dumpall.c:341 -#: pg_dumpall.c:351 pg_dumpall.c:360 pg_dumpall.c:369 pg_dumpall.c:377 -#: pg_dumpall.c:391 pg_dumpall.c:469 pg_restore.c:284 pg_restore.c:300 -#: pg_restore.c:318 +#: pg_backup_utils.c:55 pg_dump.c:627 pg_dump.c:644 pg_dumpall.c:340 +#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373 +#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307 +#: pg_restore.c:321 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Essayer « %s --help » pour plus d'informations.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_backup_utils.c:68 +#: pg_backup_utils.c:66 #, c-format msgid "out of on_exit_nicely slots" msgstr "plus d'emplacements on_exit_nicely" -#: pg_dump.c:548 -#, c-format -msgid "compression level must be in range 0..9" -msgstr "le niveau de compression doit être compris entre 0 et 9" - -#: pg_dump.c:586 -#, c-format -msgid "extra_float_digits must be in range -15..3" -msgstr "extra_float_digits doit être dans l'intervalle -15 à 3" - -#: pg_dump.c:609 -#, c-format -msgid "rows-per-insert must be in range %d..%d" -msgstr "le nombre de lignes par insertion doit être compris entre %d et %d" - -#: pg_dump.c:637 pg_dumpall.c:349 pg_restore.c:298 +#: pg_dump.c:642 pg_dumpall.c:348 pg_restore.c:305 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_dump.c:658 pg_restore.c:327 +#: pg_dump.c:661 pg_restore.c:328 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "les options « -s/--schema-only » et « -a/--data-only » ne peuvent pas être utilisées ensemble" -#: pg_dump.c:663 +#: pg_dump.c:664 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "les options « -s/--schema-only » et « --include-foreign-data » ne peuvent pas être utilisées ensemble" -#: pg_dump.c:666 +#: pg_dump.c:667 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "l'option --include-foreign-data n'est pas supportée avec une sauvegarde parallélisée" -#: pg_dump.c:670 pg_restore.c:333 +#: pg_dump.c:670 pg_restore.c:331 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "les options « -c/--clean » et « -a/--data-only » ne peuvent pas être utilisées ensemble" -#: pg_dump.c:675 pg_dumpall.c:384 pg_restore.c:382 +#: pg_dump.c:673 pg_dumpall.c:378 pg_restore.c:356 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "l'option --if-exists nécessite l'option -c/--clean" -#: pg_dump.c:682 +#: pg_dump.c:680 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "l'option --on-conflict-do-nothing requiert l'option --inserts, --rows-per-insert, ou --column-inserts" -#: pg_dump.c:704 +#: pg_dump.c:702 #, c-format msgid "requested compression not available in this installation -- archive will be uncompressed" msgstr "la compression requise n'est pas disponible avec cette installation -- l'archive ne sera pas compressée" -#: pg_dump.c:725 pg_restore.c:349 -#, c-format -msgid "invalid number of parallel jobs" -msgstr "nombre de jobs parallèles invalide" - -#: pg_dump.c:729 +#: pg_dump.c:715 #, c-format msgid "parallel backup only supported by the directory format" msgstr "la sauvegarde parallélisée n'est supportée qu'avec le format directory" -#: pg_dump.c:784 -#, c-format -msgid "" -"Synchronized snapshots are not supported by this server version.\n" -"Run with --no-synchronized-snapshots instead if you do not need\n" -"synchronized snapshots." -msgstr "" -"Les snapshots synchronisés ne sont pas supportés par cette version serveur.\n" -"Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n" -"de snapshots synchronisés." - -#: pg_dump.c:790 -#, c-format -msgid "Exported snapshots are not supported by this server version." -msgstr "Les images exportées de la base ne sont pas supportées par cette version du serveur." - -#: pg_dump.c:802 +#: pg_dump.c:761 #, c-format msgid "last built-in OID is %u" msgstr "le dernier OID interne est %u" -#: pg_dump.c:811 +#: pg_dump.c:770 #, c-format msgid "no matching schemas were found" msgstr "aucun schéma correspondant n'a été trouvé" -#: pg_dump.c:825 +#: pg_dump.c:784 #, c-format msgid "no matching tables were found" msgstr "aucune table correspondante n'a été trouvée" -#: pg_dump.c:847 +#: pg_dump.c:806 #, c-format msgid "no matching extensions were found" msgstr "aucune extension correspondante n'a été trouvée" -#: pg_dump.c:1017 +#: pg_dump.c:989 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1345,17 +1338,17 @@ msgstr "" "formats.\n" "\n" -#: pg_dump.c:1018 pg_dumpall.c:622 pg_restore.c:462 +#: pg_dump.c:990 pg_dumpall.c:605 pg_restore.c:433 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: pg_dump.c:1019 +#: pg_dump.c:991 #, c-format msgid " %s [OPTION]... [DBNAME]\n" -msgstr " %s [OPTION]... [NOMBASE]\n" +msgstr " %s [OPTION]... [BASE]\n" -#: pg_dump.c:1021 pg_dumpall.c:625 pg_restore.c:465 +#: pg_dump.c:993 pg_dumpall.c:608 pg_restore.c:436 #, c-format msgid "" "\n" @@ -1364,12 +1357,12 @@ msgstr "" "\n" "Options générales :\n" -#: pg_dump.c:1022 +#: pg_dump.c:994 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" -msgstr " -f, --file=NOMFICHIER nom du fichier ou du répertoire en sortie\n" +msgstr " -f, --file=FICHIER nom du fichier ou du répertoire en sortie\n" -#: pg_dump.c:1023 +#: pg_dump.c:995 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1378,48 +1371,50 @@ msgstr "" " -F, --format=c|d|t|p format du fichier de sortie (personnalisé,\n" " répertoire, tar, texte (par défaut))\n" -#: pg_dump.c:1025 +#: pg_dump.c:997 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr "" -" -j, --jobs=NUMERO utilise ce nombre de jobs en parallèle pour\n" -" la sauvegarde\n" +" -j, --jobs=NOMBRE utilise ce nombre de jobs en parallèle pour la\n" +" sauvegarde\n" -#: pg_dump.c:1026 pg_dumpall.c:627 +#: pg_dump.c:998 pg_dumpall.c:610 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose mode verbeux\n" -#: pg_dump.c:1027 pg_dumpall.c:628 +#: pg_dump.c:999 pg_dumpall.c:611 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version puis quitte\n" +msgstr " -V, --version affiche la version puis quitte\n" -#: pg_dump.c:1028 +#: pg_dump.c:1000 #, c-format msgid " -Z, --compress=0-9 compression level for compressed formats\n" msgstr "" " -Z, --compress=0-9 niveau de compression pour les formats\n" " compressés\n" -#: pg_dump.c:1029 pg_dumpall.c:629 +#: pg_dump.c:1001 pg_dumpall.c:612 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr "" -" --lock-wait-timeout=DÉLAI échec après l'attente du DÉLAI pour un verrou\n" -" de table\n" +" --lock-wait-timeout=DÉLAI échec après l'attente du DÉLAI pour un verrou de\n" +" table\n" -#: pg_dump.c:1030 pg_dumpall.c:656 +#: pg_dump.c:1002 pg_dumpall.c:639 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" -msgstr " --no-sync n'attend pas que les modifications soient proprement écrites sur disque\n" +msgstr "" +" --no-sync n'attend pas que les modifications soient\n" +" proprement écrites sur disque\n" -#: pg_dump.c:1031 pg_dumpall.c:630 +#: pg_dump.c:1003 pg_dumpall.c:613 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide puis quitte\n" +msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_dump.c:1033 pg_dumpall.c:631 +#: pg_dump.c:1005 pg_dumpall.c:614 #, c-format msgid "" "\n" @@ -1428,270 +1423,267 @@ msgstr "" "\n" "Options contrôlant le contenu en sortie :\n" -#: pg_dump.c:1034 pg_dumpall.c:632 +#: pg_dump.c:1006 pg_dumpall.c:615 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" -msgstr "" -" -a, --data-only sauvegarde uniquement les données, pas le\n" -" schéma\n" +msgstr " -a, --data-only sauvegarde uniquement les données, pas le schéma\n" -#: pg_dump.c:1035 +#: pg_dump.c:1007 #, c-format msgid " -b, --blobs include large objects in dump\n" -msgstr "" -" -b, --blobs inclut les « Large Objects » dans la\n" -" sauvegarde\n" +msgstr " -b, --blobs inclut les « Large Objects » dans la sauvegarde\n" -#: pg_dump.c:1036 +#: pg_dump.c:1008 #, c-format msgid " -B, --no-blobs exclude large objects in dump\n" -msgstr "" -" -B, --no-blobs exclut les « Large Objects » dans la\n" -" sauvegarde\n" +msgstr " -B, --no-blobs exclut les « Large Objects » de la sauvegarde\n" -#: pg_dump.c:1037 pg_restore.c:476 +#: pg_dump.c:1009 pg_restore.c:447 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr "" -" -c, --clean nettoie/supprime les objets de la base de\n" -" données avant de les créer\n" +" -c, --clean nettoie/supprime les objets de la base de données\n" +" avant de les créer\n" -#: pg_dump.c:1038 +#: pg_dump.c:1010 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr "" " -C, --create inclut les commandes de création de la base\n" " dans la sauvegarde\n" -#: pg_dump.c:1039 +#: pg_dump.c:1011 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" -msgstr " -e, --extension=MOTIF sauvegarde uniquement les extensions indiquées\n" +msgstr " -e, --extension=MOTIF sauvegarde uniquement les extensions indiquées\n" -#: pg_dump.c:1040 pg_dumpall.c:634 +#: pg_dump.c:1012 pg_dumpall.c:617 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" -msgstr "" -" -E, --encoding=ENCODAGE sauvegarde les données dans l'encodage\n" -" ENCODAGE\n" +msgstr " -E, --encoding=ENCODAGE sauvegarde les données dans l'encodage ENCODAGE\n" -#: pg_dump.c:1041 +#: pg_dump.c:1013 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=MOTIF sauvegarde uniquement les schémas indiqués\n" -#: pg_dump.c:1042 +#: pg_dump.c:1014 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=MOTIF ne sauvegarde pas les schémas indiqués\n" -#: pg_dump.c:1043 +#: pg_dump.c:1015 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" " plain-text format\n" msgstr "" -" -O, --no-owner ne sauvegarde pas les propriétaires des\n" -" objets lors de l'utilisation du format texte\n" +" -O, --no-owner ne sauvegarde pas les propriétaires des objets\n" +" lors de l'utilisation du format texte\n" -#: pg_dump.c:1045 pg_dumpall.c:638 +#: pg_dump.c:1017 pg_dumpall.c:621 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr "" " -s, --schema-only sauvegarde uniquement la structure, pas les\n" " données\n" -#: pg_dump.c:1046 +#: pg_dump.c:1018 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr "" -" -S, --superuser=NOM indique le nom du super-utilisateur à\n" -" utiliser avec le format texte\n" +" -S, --superuser=NOM indique le nom du super-utilisateur à utiliser\n" +" avec le format texte\n" -#: pg_dump.c:1047 +#: pg_dump.c:1019 #, c-format msgid " -t, --table=PATTERN dump the specified table(s) only\n" msgstr " -t, --table=MOTIF sauvegarde uniquement les tables indiquées\n" -#: pg_dump.c:1048 +#: pg_dump.c:1020 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=MOTIF ne sauvegarde pas les tables indiquées\n" -#: pg_dump.c:1049 pg_dumpall.c:641 +#: pg_dump.c:1021 pg_dumpall.c:624 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges ne sauvegarde pas les droits sur les objets\n" -#: pg_dump.c:1050 pg_dumpall.c:642 +#: pg_dump.c:1022 pg_dumpall.c:625 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr "" -" --binary-upgrade à n'utiliser que par les outils de mise à\n" -" jour seulement\n" +" --binary-upgrade à n'utiliser que par les outils de mise à jour\n" +" seulement\n" -#: pg_dump.c:1051 pg_dumpall.c:643 +#: pg_dump.c:1023 pg_dumpall.c:626 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr "" -" --column-inserts sauvegarde les données avec des commandes\n" -" INSERT en précisant les noms des colonnes\n" +" --column-inserts sauvegarde les données avec des commandes INSERT\n" +" en précisant les noms des colonnes\n" -#: pg_dump.c:1052 pg_dumpall.c:644 +#: pg_dump.c:1024 pg_dumpall.c:627 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr "" -" --disable-dollar-quoting désactive l'utilisation des guillemets\n" -" dollar dans le but de respecter le standard\n" -" SQL en matière de guillemets\n" +" --disable-dollar-quoting désactive l'utilisation des guillemets dollars\n" +" dans le but de respecter le standard SQL en\n" +" matière de guillemets\n" -#: pg_dump.c:1053 pg_dumpall.c:645 pg_restore.c:493 +#: pg_dump.c:1025 pg_dumpall.c:628 pg_restore.c:464 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr "" " --disable-triggers désactive les triggers en mode de restauration\n" " des données seules\n" -#: pg_dump.c:1054 +#: pg_dump.c:1026 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" " access to)\n" msgstr "" -" --enable-row-security active la sécurité niveau ligne (et donc\\n\n" -" sauvegarde uniquement le contenu visible par\\n\n" -" cet utilisateur)\n" +" --enable-row-security active la sécurité niveau ligne (et donc\n" +" sauvegarde uniquement le contenu visible par cet\n" +" utilisateur)\n" -#: pg_dump.c:1056 +#: pg_dump.c:1028 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=MOTIF ne sauvegarde pas les tables indiquées\n" -#: pg_dump.c:1057 pg_dumpall.c:647 +#: pg_dump.c:1029 pg_dumpall.c:630 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" -msgstr " --extra-float-digits=NUM surcharge la configuration par défaut de extra_float_digits\n" +msgstr "" +" --extra-float-digits=NUM surcharge la configuration par défaut de\n" +" extra_float_digits\n" -#: pg_dump.c:1058 pg_dumpall.c:648 pg_restore.c:495 +#: pg_dump.c:1030 pg_dumpall.c:631 pg_restore.c:466 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" -msgstr " --if-exists utilise IF EXISTS lors de la suppression des objets\n" +msgstr "" +" --if-exists utilise IF EXISTS lors de la suppression des\n" +" objets\n" -#: pg_dump.c:1059 +#: pg_dump.c:1031 #, c-format msgid "" " --include-foreign-data=PATTERN\n" " include data of foreign tables on foreign\n" " servers matching PATTERN\n" msgstr "" -" --include-foreign-data=MOTIF\n" -" inclut les données des tables externes pour les\n" +" --include-foreign-data=MOTIF inclut les données des tables externes pour les\n" " serveurs distants correspondant au motif MOTIF\n" -#: pg_dump.c:1062 pg_dumpall.c:649 +#: pg_dump.c:1034 pg_dumpall.c:632 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr "" " --inserts sauvegarde les données avec des instructions\n" " INSERT plutôt que COPY\n" -#: pg_dump.c:1063 pg_dumpall.c:650 +#: pg_dump.c:1035 pg_dumpall.c:633 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root charger les partitions via la table racine\n" -#: pg_dump.c:1064 pg_dumpall.c:651 +#: pg_dump.c:1036 pg_dumpall.c:634 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments ne sauvegarde pas les commentaires\n" -#: pg_dump.c:1065 pg_dumpall.c:652 +#: pg_dump.c:1037 pg_dumpall.c:635 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications ne sauvegarde pas les publications\n" -#: pg_dump.c:1066 pg_dumpall.c:654 +#: pg_dump.c:1038 pg_dumpall.c:637 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr "" " --no-security-labels ne sauvegarde pas les affectations de labels de\n" " sécurité\n" -#: pg_dump.c:1067 pg_dumpall.c:655 +#: pg_dump.c:1039 pg_dumpall.c:638 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions ne sauvegarde pas les souscriptions\n" -#: pg_dump.c:1068 +#: pg_dump.c:1040 pg_dumpall.c:640 #, c-format -msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n" -msgstr " --no-synchronized-snapshots n'utilise pas de snapshots synchronisés pour les jobs en parallèle\n" +msgid " --no-table-access-method do not dump table access methods\n" +msgstr " --no-table-access-method ne sauvegarde pas les méthodes d'accès aux tables\n" -#: pg_dump.c:1069 pg_dumpall.c:657 +#: pg_dump.c:1041 pg_dumpall.c:641 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" -msgstr "" -" --no-tablespaces ne sauvegarde pas les affectations de\n" -" tablespaces\n" +msgstr " --no-tablespaces ne sauvegarde pas les affectations de tablespaces\n" -#: pg_dump.c:1070 pg_dumpall.c:658 +#: pg_dump.c:1042 pg_dumpall.c:642 #, c-format msgid " --no-toast-compression do not dump TOAST compression methods\n" -msgstr " --no-toast-compression ne sauvegarde pas les méthodes de compression de TOAST\n" +msgstr "" +" --no-toast-compression ne sauvegarde pas les méthodes de compression de\n" +" TOAST\n" -#: pg_dump.c:1071 pg_dumpall.c:659 +#: pg_dump.c:1043 pg_dumpall.c:643 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr "" " --no-unlogged-table-data ne sauvegarde pas les données des tables non\n" " journalisées\n" -#: pg_dump.c:1072 pg_dumpall.c:660 +#: pg_dump.c:1044 pg_dumpall.c:644 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" -msgstr " --on-conflict-do-nothing ajoute ON CONFLICT DO NOTHING aux commandes INSERT\n" +msgstr "" +" --on-conflict-do-nothing ajoute ON CONFLICT DO NOTHING aux commandes\n" +" INSERT\n" -#: pg_dump.c:1073 pg_dumpall.c:661 +#: pg_dump.c:1045 pg_dumpall.c:645 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr "" -" --quote-all-identifiers met entre guillemets tous les identifiants\n" -" même s'il ne s'agit pas de mots clés\n" +" --quote-all-identifiers met entre guillemets tous les identifiants même\n" +" s'il ne s'agit pas de mots clés\n" -#: pg_dump.c:1074 pg_dumpall.c:662 +#: pg_dump.c:1046 pg_dumpall.c:646 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=NROWS nombre de lignes par INSERT ; implique --inserts\n" -#: pg_dump.c:1075 +#: pg_dump.c:1047 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr "" " --section=SECTION sauvegarde la section indiquée (pre-data, data\n" " ou post-data)\n" -#: pg_dump.c:1076 +#: pg_dump.c:1048 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr "" " --serializable-deferrable attend jusqu'à ce que la sauvegarde puisse\n" " s'exécuter sans anomalies\n" -#: pg_dump.c:1077 +#: pg_dump.c:1049 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT utilise l'image donnée pour la sauvegarde\n" -#: pg_dump.c:1078 pg_restore.c:504 +#: pg_dump.c:1050 pg_restore.c:476 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" " match at least one entity each\n" msgstr "" -" --strict-names requiert que le motifs de table et/ou schéma\n" -" correspondent à au moins une entité de chaque\n" +" --strict-names requiert que les motifs des tables et/ou schémas\n" +" correspondent à au moins une entité de chaque\n" -#: pg_dump.c:1080 pg_dumpall.c:663 pg_restore.c:506 +#: pg_dump.c:1052 pg_dumpall.c:647 pg_restore.c:478 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1700,10 +1692,10 @@ msgid "" msgstr "" " --use-set-session-authorization\n" " utilise les commandes SET SESSION AUTHORIZATION\n" -" au lieu des commandes ALTER OWNER pour\n" -" modifier les propriétaires\n" +" au lieu des commandes ALTER OWNER pour modifier\n" +" les propriétaires\n" -#: pg_dump.c:1084 pg_dumpall.c:667 pg_restore.c:510 +#: pg_dump.c:1056 pg_dumpall.c:651 pg_restore.c:482 #, c-format msgid "" "\n" @@ -1712,48 +1704,46 @@ msgstr "" "\n" "Options de connexion :\n" -#: pg_dump.c:1085 +#: pg_dump.c:1057 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" -msgstr " -d, --dbname=NOMBASE base de données à sauvegarder\n" +msgstr " -d, --dbname=BASE base de données à sauvegarder\n" -#: pg_dump.c:1086 pg_dumpall.c:669 pg_restore.c:511 +#: pg_dump.c:1058 pg_dumpall.c:653 pg_restore.c:483 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" -" -h, --host=NOMHÔTE hôte du serveur de bases de données ou\n" +" -h, --host=HÔTE hôte du serveur de bases de données ou\n" " répertoire des sockets\n" -#: pg_dump.c:1087 pg_dumpall.c:671 pg_restore.c:512 +#: pg_dump.c:1059 pg_dumpall.c:655 pg_restore.c:484 #, c-format msgid " -p, --port=PORT database server port number\n" -msgstr "" -" -p, --port=PORT numéro de port du serveur de bases de\n" -" données\n" +msgstr " -p, --port=PORT numéro de port du serveur de bases de données\n" -#: pg_dump.c:1088 pg_dumpall.c:672 pg_restore.c:513 +#: pg_dump.c:1060 pg_dumpall.c:656 pg_restore.c:485 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NOM se connecter avec cet utilisateur\n" -#: pg_dump.c:1089 pg_dumpall.c:673 pg_restore.c:514 +#: pg_dump.c:1061 pg_dumpall.c:657 pg_restore.c:486 #, c-format msgid " -w, --no-password never prompt for password\n" -msgstr " -w, --no-password ne demande jamais le mot de passe\n" +msgstr " -w, --no-password ne demande jamais un mot de passe\n" -#: pg_dump.c:1090 pg_dumpall.c:674 pg_restore.c:515 +#: pg_dump.c:1062 pg_dumpall.c:658 pg_restore.c:487 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr "" -" -W, --password force la demande du mot de passe (par\n" -" défaut)\n" +" -W, --password force la demande du mot de passe (devrait\n" +" survenir automatiquement)\n" -#: pg_dump.c:1091 pg_dumpall.c:675 +#: pg_dump.c:1063 pg_dumpall.c:659 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=NOMROLE exécute SET ROLE avant la sauvegarde\n" -#: pg_dump.c:1093 +#: pg_dump.c:1065 #, c-format msgid "" "\n" @@ -1766,601 +1756,525 @@ msgstr "" "d'environnement PGDATABASE est alors utilisée.\n" "\n" -#: pg_dump.c:1095 pg_dumpall.c:679 pg_restore.c:522 +#: pg_dump.c:1067 pg_dumpall.c:663 pg_restore.c:494 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapporter les bogues à <%s>.\n" -#: pg_dump.c:1096 pg_dumpall.c:680 pg_restore.c:523 +#: pg_dump.c:1068 pg_dumpall.c:664 pg_restore.c:495 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil de %s : <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" -#: pg_dump.c:1115 pg_dumpall.c:504 +#: pg_dump.c:1087 pg_dumpall.c:488 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "encodage client indiqué (« %s ») invalide" -#: pg_dump.c:1261 +#: pg_dump.c:1225 #, c-format -msgid "" -"Synchronized snapshots on standby servers are not supported by this server version.\n" -"Run with --no-synchronized-snapshots instead if you do not need\n" -"synchronized snapshots." -msgstr "" -"Les snapshots synchronisés sur les serveurs standbys ne sont pas supportés par cette version serveur.\n" -"Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n" -"de snapshots synchronisés." +msgid "parallel dumps from standby servers are not supported by this server version" +msgstr "les sauvegardes parallélisées sur un serveur standby ne sont pas supportées par cette version du serveur" -#: pg_dump.c:1330 +#: pg_dump.c:1290 #, c-format msgid "invalid output format \"%s\" specified" msgstr "format de sortie « %s » invalide" -#: pg_dump.c:1368 +#: pg_dump.c:1331 pg_dump.c:1387 pg_dump.c:1440 pg_dumpall.c:1282 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "mauvaise qualification du nom (trop de points entre les noms) : %s" + +#: pg_dump.c:1339 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "aucun schéma correspondant n'a été trouvé avec le motif « %s »" -#: pg_dump.c:1415 +#: pg_dump.c:1392 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "aucune extension correspondante n'a été trouvée avec le motif « %s »" -#: pg_dump.c:1462 +#: pg_dump.c:1445 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "aucun serveur distant correspondant n'a été trouvé avec le motif « %s »" -#: pg_dump.c:1525 +#: pg_dump.c:1508 +#, c-format +msgid "improper relation name (too many dotted names): %s" +msgstr "nom de relation incorrecte (trop de points entre les noms) : %s" + +#: pg_dump.c:1519 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "aucune table correspondante n'a été trouvée avec le motif « %s »" -#: pg_dump.c:1948 +#: pg_dump.c:1546 +#, c-format +msgid "You are currently not connected to a database." +msgstr "Vous n'êtes pas connecté à une base de données." + +#: pg_dump.c:1549 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "les références entre bases de données ne sont pas implémentées : %s" + +#: pg_dump.c:1980 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "sauvegarde du contenu de la table « %s.%s »" -#: pg_dump.c:2055 +#: pg_dump.c:2086 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Sauvegarde du contenu de la table « %s » échouée : échec de PQgetCopyData()." -#: pg_dump.c:2056 pg_dump.c:2066 +#: pg_dump.c:2087 pg_dump.c:2097 #, c-format msgid "Error message from server: %s" msgstr "Message d'erreur du serveur : %s" -#: pg_dump.c:2057 pg_dump.c:2067 +#: pg_dump.c:2088 pg_dump.c:2098 #, c-format -msgid "The command was: %s" +msgid "Command was: %s" msgstr "La commande était : %s" -#: pg_dump.c:2065 +#: pg_dump.c:2096 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Sauvegarde du contenu de la table « %s » échouée : échec de PQgetResult()." -#: pg_dump.c:2825 +#: pg_dump.c:2178 +#, c-format +msgid "wrong number of fields retrieved from table \"%s\"" +msgstr "mauvais nombre de champs récupérés à partir de la table « %s »" + +#: pg_dump.c:2836 #, c-format msgid "saving database definition" msgstr "sauvegarde de la définition de la base de données" -#: pg_dump.c:3297 +#: pg_dump.c:2932 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "fournisseur de locale non reconnu : %s" + +#: pg_dump.c:3248 #, c-format msgid "saving encoding = %s" msgstr "encodage de la sauvegarde = %s" -#: pg_dump.c:3322 +#: pg_dump.c:3273 #, c-format msgid "saving standard_conforming_strings = %s" msgstr "sauvegarde de standard_conforming_strings = %s" -#: pg_dump.c:3361 +#: pg_dump.c:3312 #, c-format msgid "could not parse result of current_schemas()" msgstr "n'a pas pu analyser le résultat de current_schema()" -#: pg_dump.c:3380 +#: pg_dump.c:3331 #, c-format msgid "saving search_path = %s" msgstr "sauvegarde de search_path = %s" -#: pg_dump.c:3420 +#: pg_dump.c:3369 #, c-format msgid "reading large objects" msgstr "lecture des « Large Objects »" -#: pg_dump.c:3602 +#: pg_dump.c:3507 #, c-format msgid "saving large objects" msgstr "sauvegarde des « Large Objects »" -#: pg_dump.c:3648 +#: pg_dump.c:3548 #, c-format msgid "error reading large object %u: %s" msgstr "erreur lors de la lecture du « Large Object » %u : %s" -#: pg_dump.c:3700 -#, c-format -msgid "reading row security enabled for table \"%s.%s\"" -msgstr "lecture de l'activation de la sécurité niveau ligne pour la table « %s.%s »" - -#: pg_dump.c:3731 +#: pg_dump.c:3654 #, c-format -msgid "reading policies for table \"%s.%s\"" -msgstr "lecture des politiques pour la table « %s.%s »" +msgid "reading row-level security policies" +msgstr "lecture des politiques de sécurité au niveau ligne" -#: pg_dump.c:3883 +#: pg_dump.c:3795 #, c-format msgid "unexpected policy command type: %c" msgstr "type de commande inattendu pour la politique : %c" -#: pg_dump.c:4037 +#: pg_dump.c:4245 pg_dump.c:4563 pg_dump.c:11694 pg_dump.c:17511 +#: pg_dump.c:17513 pg_dump.c:18134 #, c-format -msgid "owner of publication \"%s\" appears to be invalid" -msgstr "le propriétaire de la publication « %s » semble être invalide" +msgid "could not parse %s array" +msgstr "n'a pas pu analyser le tableau %s" -#: pg_dump.c:4329 +#: pg_dump.c:4431 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "les souscriptions ne sont pas sauvegardées parce que l'utilisateur courant n'est pas un superutilisateur" -#: pg_dump.c:4400 -#, c-format -msgid "owner of subscription \"%s\" appears to be invalid" -msgstr "le propriétaire de la souscription « %s » semble être invalide" - -#: pg_dump.c:4443 -#, c-format -msgid "could not parse subpublications array" -msgstr "n'a pas pu analyser le tableau de sous-publications" - -#: pg_dump.c:4801 +#: pg_dump.c:4945 #, c-format msgid "could not find parent extension for %s %s" msgstr "n'a pas pu trouver l'extension parent pour %s %s" -#: pg_dump.c:4933 -#, c-format -msgid "owner of schema \"%s\" appears to be invalid" -msgstr "le propriétaire du schéma « %s » semble être invalide" - -#: pg_dump.c:4956 +#: pg_dump.c:5090 #, c-format msgid "schema with OID %u does not exist" msgstr "le schéma d'OID %u n'existe pas" -#: pg_dump.c:5285 -#, c-format -msgid "owner of data type \"%s\" appears to be invalid" -msgstr "le propriétaire du type de données « %s » semble être invalide" - -#: pg_dump.c:5369 -#, c-format -msgid "owner of operator \"%s\" appears to be invalid" -msgstr "le propriétaire de l'opérateur « %s » semble être invalide" - -#: pg_dump.c:5668 -#, c-format -msgid "owner of operator class \"%s\" appears to be invalid" -msgstr "le propriétaire de la classe d'opérateur « %s » semble être invalide" - -#: pg_dump.c:5751 -#, c-format -msgid "owner of operator family \"%s\" appears to be invalid" -msgstr "le propriétaire de la famille d'opérateur « %s » semble être invalide" - -#: pg_dump.c:5919 -#, c-format -msgid "owner of aggregate function \"%s\" appears to be invalid" -msgstr "le propriétaire de la fonction d'agrégat « %s » semble être invalide" - -#: pg_dump.c:6178 -#, c-format -msgid "owner of function \"%s\" appears to be invalid" -msgstr "le propriétaire de la fonction « %s » semble être invalide" - -#: pg_dump.c:7005 -#, c-format -msgid "owner of table \"%s\" appears to be invalid" -msgstr "le propriétaire de la table « %s » semble être invalide" - -#: pg_dump.c:7047 pg_dump.c:17436 +#: pg_dump.c:6544 pg_dump.c:16775 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "vérification échouée, OID %u de la table parent de l'OID %u de la séquence introuvable" -#: pg_dump.c:7186 +#: pg_dump.c:6848 pg_dump.c:7115 pg_dump.c:7586 pg_dump.c:8253 pg_dump.c:8374 +#: pg_dump.c:8528 #, c-format -msgid "reading indexes for table \"%s.%s\"" -msgstr "lecture des index de la table « %s.%s »" +msgid "unrecognized table OID %u" +msgstr "OID de table %u non reconnu" -#: pg_dump.c:7600 +#: pg_dump.c:6852 #, c-format -msgid "reading foreign key constraints for table \"%s.%s\"" -msgstr "lecture des contraintes de clés étrangères pour la table « %s.%s »" +msgid "unexpected index data for table \"%s\"" +msgstr "données d'index inattendu pour la table « %s »" -#: pg_dump.c:7879 +#: pg_dump.c:7347 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "vérification échouée, OID %u de la table parent de l'OID %u de l'entrée de pg_rewrite introuvable" -#: pg_dump.c:7962 -#, c-format -msgid "reading triggers for table \"%s.%s\"" -msgstr "lecture des triggers pour la table « %s.%s »" - -#: pg_dump.c:8095 +#: pg_dump.c:7638 #, c-format msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" msgstr "la requête a produit une réference de nom de table null pour le trigger de la clé étrangère « %s » sur la table « %s » (OID de la table : %u)" -#: pg_dump.c:8645 +#: pg_dump.c:8257 #, c-format -msgid "finding the columns and types of table \"%s.%s\"" -msgstr "recherche des colonnes et types de la table « %s.%s »" +msgid "unexpected column data for table \"%s\"" +msgstr "données de colonne inattendues pour la table « %s »" -#: pg_dump.c:8769 +#: pg_dump.c:8287 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "numérotation des colonnes invalide pour la table « %s »" -#: pg_dump.c:8808 +#: pg_dump.c:8336 #, c-format -msgid "finding default expressions of table \"%s.%s\"" -msgstr "recherche des expressions par défaut de la table « %s.%s »" +msgid "finding table default expressions" +msgstr "recherche des expressions par défaut de la table" -#: pg_dump.c:8830 +#: pg_dump.c:8378 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "valeur adnum %d invalide pour la table « %s »" -#: pg_dump.c:8923 +#: pg_dump.c:8478 #, c-format -msgid "finding check constraints for table \"%s.%s\"" -msgstr "recherche des contraintes de vérification pour la table « %s.%s »" +msgid "finding table check constraints" +msgstr "recherche des contraintes CHECK de la table" -#: pg_dump.c:8972 +#: pg_dump.c:8532 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "%d contrainte de vérification attendue pour la table « %s » mais %d trouvée" msgstr[1] "%d contraintes de vérification attendues pour la table « %s » mais %d trouvée" -#: pg_dump.c:8976 -#, c-format -msgid "(The system catalogs might be corrupted.)" -msgstr "(Les catalogues système sont peut-être corrompus.)" - -#: pg_dump.c:10561 -#, c-format -msgid "typtype of data type \"%s\" appears to be invalid" -msgstr "la colonne typtype du type de données « %s » semble être invalide" - -#: pg_dump.c:11913 -#, c-format -msgid "bogus value in proargmodes array" -msgstr "valeur erronée dans le tableau proargmodes" - -#: pg_dump.c:12220 +#: pg_dump.c:8536 #, c-format -msgid "could not parse proallargtypes array" -msgstr "n'a pas pu analyser le tableau proallargtypes" +msgid "The system catalogs might be corrupted." +msgstr "Les catalogues système pourraient être corrompus." -#: pg_dump.c:12236 +#: pg_dump.c:9226 #, c-format -msgid "could not parse proargmodes array" -msgstr "n'a pas pu analyser le tableau proargmodes" +msgid "role with OID %u does not exist" +msgstr "le rôle d'OID %u n'existe pas" -#: pg_dump.c:12250 +#: pg_dump.c:9338 pg_dump.c:9367 #, c-format -msgid "could not parse proargnames array" -msgstr "n'a pas pu analyser le tableau proargnames" +msgid "unsupported pg_init_privs entry: %u %u %d" +msgstr "entrée pg_init_privs non supportée : %u %u %d" -#: pg_dump.c:12260 +#: pg_dump.c:10188 #, c-format -msgid "could not parse proconfig array" -msgstr "n'a pas pu analyser le tableau proconfig" +msgid "typtype of data type \"%s\" appears to be invalid" +msgstr "la colonne typtype du type de données « %s » semble être invalide" -#: pg_dump.c:12340 +#: pg_dump.c:11763 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "valeur provolatile non reconnue pour la fonction « %s »" -#: pg_dump.c:12390 pg_dump.c:14341 +#: pg_dump.c:11813 pg_dump.c:13604 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "valeur proparallel non reconnue pour la fonction « %s »" -#: pg_dump.c:12529 pg_dump.c:12638 pg_dump.c:12645 +#: pg_dump.c:11944 pg_dump.c:12050 pg_dump.c:12057 #, c-format msgid "could not find function definition for function with OID %u" msgstr "n'a pas pu trouver la définition de la fonction d'OID %u" -#: pg_dump.c:12568 +#: pg_dump.c:11983 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "valeur erronée dans le champ pg_cast.castfunc ou pg_cast.castmethod" -#: pg_dump.c:12571 +#: pg_dump.c:11986 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "valeur erronée dans pg_cast.castmethod" -#: pg_dump.c:12664 +#: pg_dump.c:12076 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "définition de transformation invalide, au moins un de trffromsql et trftosql ne doit pas valoir 0" -#: pg_dump.c:12681 +#: pg_dump.c:12093 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "valeur erronée dans pg_transform.trffromsql" -#: pg_dump.c:12702 +#: pg_dump.c:12114 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "valeur erronée dans pg_transform.trftosql" -#: pg_dump.c:12854 +#: pg_dump.c:12259 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "les opérateurs postfixes ne sont plus supportés (opérateur « %s »)" -#: pg_dump.c:13024 +#: pg_dump.c:12429 #, c-format msgid "could not find operator with OID %s" msgstr "n'a pas pu trouver l'opérateur d'OID %s" -#: pg_dump.c:13092 +#: pg_dump.c:12497 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "type « %c » invalide de la méthode d'accès « %s »" -#: pg_dump.c:13846 +#: pg_dump.c:13116 #, c-format msgid "unrecognized collation provider: %s" msgstr "fournisseur de collationnement non reconnu : %s" -#: pg_dump.c:14260 +#: pg_dump.c:13523 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "valeur non reconnue de aggfinalmodify pour l'agrégat « %s »" -#: pg_dump.c:14316 +#: pg_dump.c:13579 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "valeur non reconnue de aggmfinalmodify pour l'agrégat « %s »" -#: pg_dump.c:15038 +#: pg_dump.c:14297 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "type d'objet inconnu dans les droits par défaut : %d" -#: pg_dump.c:15056 +#: pg_dump.c:14313 #, c-format msgid "could not parse default ACL list (%s)" msgstr "n'a pas pu analyser la liste ACL par défaut (%s)" -#: pg_dump.c:15141 +#: pg_dump.c:14395 #, c-format -msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)" -msgstr "n'a pas pu analyser la liste ACL GRANT initiale (%s) ou la liste ACL REVOKE initiale (%s) de l'objet « %s » (%s)" +msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" +msgstr "n'a pas pu analyser la liste ACL initiale (%s) ou par défaut (%s) pour l'objet « %s » (%s)" -#: pg_dump.c:15149 +#: pg_dump.c:14420 #, c-format -msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)" -msgstr "n'a pas pu analyser la liste ACL GRANT (%s) ou REVOKE (%s) de l'objet « %s » (%s)" +msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" +msgstr "n'a pas pu analyser la liste ACL (%s) ou par défaut (%s) pour l'objet « %s » (%s)" -#: pg_dump.c:15664 +#: pg_dump.c:14958 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "la requête permettant d'obtenir la définition de la vue « %s » n'a renvoyé aucune donnée" -#: pg_dump.c:15667 +#: pg_dump.c:14961 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "la requête permettant d'obtenir la définition de la vue « %s » a renvoyé plusieurs définitions" -#: pg_dump.c:15674 +#: pg_dump.c:14968 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "la définition de la vue « %s » semble être vide (longueur nulle)" -#: pg_dump.c:15758 +#: pg_dump.c:15052 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS n'est plus supporté (table « %s »)" -#: pg_dump.c:16623 +#: pg_dump.c:15981 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "numéro de colonne %d invalide pour la table « %s »" -#: pg_dump.c:16700 +#: pg_dump.c:16059 #, c-format msgid "could not parse index statistic columns" msgstr "n'a pas pu analyser les colonnes statistiques de l'index" -#: pg_dump.c:16702 +#: pg_dump.c:16061 #, c-format msgid "could not parse index statistic values" msgstr "n'a pas pu analyser les valeurs statistiques de l'index" -#: pg_dump.c:16704 +#: pg_dump.c:16063 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "nombre de colonnes et de valeurs différentes pour les statistiques des index" -#: pg_dump.c:16921 +#: pg_dump.c:16281 #, c-format msgid "missing index for constraint \"%s\"" msgstr "index manquant pour la contrainte « %s »" -#: pg_dump.c:17146 +#: pg_dump.c:16509 #, c-format msgid "unrecognized constraint type: %c" msgstr "type de contrainte inconnu : %c" -#: pg_dump.c:17278 pg_dump.c:17501 +#: pg_dump.c:16610 pg_dump.c:16839 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "la requête permettant d'obtenir les données de la séquence « %s » a renvoyé %d ligne (une seule attendue)" msgstr[1] "la requête permettant d'obtenir les données de la séquence « %s » a renvoyé %d ligne (une seule attendue)" -#: pg_dump.c:17312 +#: pg_dump.c:16642 #, c-format msgid "unrecognized sequence type: %s" msgstr "type de séquence non reconnu : « %s »" -#: pg_dump.c:17599 +#: pg_dump.c:16931 #, c-format msgid "unexpected tgtype value: %d" msgstr "valeur tgtype inattendue : %d" -#: pg_dump.c:17673 +#: pg_dump.c:17003 #, c-format msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" msgstr "chaîne argument invalide (%s) pour le trigger « %s » sur la table « %s »" -#: pg_dump.c:17909 +#: pg_dump.c:17272 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "la requête permettant d'obtenir la règle « %s » associée à la table « %s » a échoué : mauvais nombre de lignes renvoyées" -#: pg_dump.c:18071 +#: pg_dump.c:17425 #, c-format msgid "could not find referenced extension %u" msgstr "n'a pas pu trouver l'extension référencée %u" -#: pg_dump.c:18162 -#, c-format -msgid "could not parse extension configuration array" -msgstr "n'a pas pu analyser le tableau de configuration des extensions" - -#: pg_dump.c:18164 -#, c-format -msgid "could not parse extension condition array" -msgstr "n'a pas pu analyser le tableau de condition de l'extension" - -#: pg_dump.c:18166 +#: pg_dump.c:17515 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "nombre différent de configurations et de conditions pour l'extension" -#: pg_dump.c:18298 +#: pg_dump.c:17647 #, c-format msgid "reading dependency data" msgstr "lecture des données de dépendance" -#: pg_dump.c:18391 +#: pg_dump.c:17733 #, c-format msgid "no referencing object %u %u" msgstr "pas d'objet référant %u %u" -#: pg_dump.c:18402 +#: pg_dump.c:17744 #, c-format msgid "no referenced object %u %u" msgstr "pas d'objet référencé %u %u" -#: pg_dump.c:18776 -#, c-format -msgid "could not parse reloptions array" -msgstr "n'a pas pu analyser le tableau reloptions" - -#: pg_dump_sort.c:411 +#: pg_dump_sort.c:422 #, c-format msgid "invalid dumpId %d" msgstr "dumpId %d invalide" -#: pg_dump_sort.c:417 +#: pg_dump_sort.c:428 #, c-format msgid "invalid dependency %d" msgstr "dépendance invalide %d" -#: pg_dump_sort.c:650 +#: pg_dump_sort.c:661 #, c-format msgid "could not identify dependency loop" msgstr "n'a pas pu identifier la boucle de dépendance" -#: pg_dump_sort.c:1221 +#: pg_dump_sort.c:1232 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" msgstr[0] "NOTE : il existe des constraintes de clés étrangères circulaires sur cette table :" msgstr[1] "NOTE : il existe des constraintes de clés étrangères circulaires sur ces tables :" -#: pg_dump_sort.c:1225 pg_dump_sort.c:1245 +#: pg_dump_sort.c:1236 pg_dump_sort.c:1256 #, c-format msgid " %s" msgstr " %s" -#: pg_dump_sort.c:1226 +#: pg_dump_sort.c:1237 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "Il est possible de restaurer la sauvegarde sans utiliser --disable-triggers ou sans supprimer temporairement les constraintes." -#: pg_dump_sort.c:1227 +#: pg_dump_sort.c:1238 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "Considérez l'utilisation d'une sauvegarde complète au lieu d'une sauvegarde des données seulement pour éviter ce problème." -#: pg_dump_sort.c:1239 +#: pg_dump_sort.c:1250 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "n'a pas pu résoudre la boucle de dépendances parmi ces éléments :" -#: pg_dumpall.c:202 +#: pg_dumpall.c:205 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"Le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé\n" -"dans le même répertoire que « %s ».\n" -"Vérifiez votre installation." +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »" -#: pg_dumpall.c:207 +#: pg_dumpall.c:208 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"Le programme « %s » a été trouvé par « %s »\n" -"mais n'est pas de la même version que %s.\n" -"Vérifiez votre installation." +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s" -#: pg_dumpall.c:359 +#: pg_dumpall.c:357 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "l'option --exclude-database ne peut pas être utilisée avec -g/--globals-only, -r/--roles-only ou -t/--tablespaces-only" -#: pg_dumpall.c:368 +#: pg_dumpall.c:365 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "les options « -g/--globals-only » et « -r/--roles-only » ne peuvent pas être utilisées ensemble" -#: pg_dumpall.c:376 +#: pg_dumpall.c:372 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "les options « -g/--globals-only » et « -t/--tablespaces-only » ne peuvent pas être utilisées ensemble" -#: pg_dumpall.c:390 +#: pg_dumpall.c:382 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "les options « -r/--roles-only » et « -t/--tablespaces-only » ne peuvent pas être utilisées ensemble" -#: pg_dumpall.c:453 pg_dumpall.c:1756 +#: pg_dumpall.c:444 pg_dumpall.c:1587 #, c-format msgid "could not connect to database \"%s\"" msgstr "n'a pas pu se connecter à la base de données « %s »" -#: pg_dumpall.c:467 +#: pg_dumpall.c:456 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2369,7 +2283,7 @@ msgstr "" "n'a pas pu se connecter aux bases « postgres » et « template1 ».\n" "Merci de préciser une autre base de données." -#: pg_dumpall.c:621 +#: pg_dumpall.c:604 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2379,79 +2293,79 @@ msgstr "" "commandes SQL.\n" "\n" -#: pg_dumpall.c:623 +#: pg_dumpall.c:606 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_dumpall.c:626 +#: pg_dumpall.c:609 #, c-format msgid " -f, --file=FILENAME output file name\n" -msgstr " -f, --file=NOMFICHIER nom du fichier de sortie\n" +msgstr " -f, --file=FICHIER nom du fichier de sortie\n" -#: pg_dumpall.c:633 +#: pg_dumpall.c:616 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr "" " -c, --clean nettoie (supprime) les bases de données avant de\n" " les créer\n" -#: pg_dumpall.c:635 +#: pg_dumpall.c:618 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr "" " -g, --globals-only sauvegarde uniquement les objets système, pas\n" " le contenu des bases de données\n" -#: pg_dumpall.c:636 pg_restore.c:485 +#: pg_dumpall.c:619 pg_restore.c:456 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" -msgstr "" -" -O, --no-owner omet la restauration des propriétaires des\n" -" objets\n" +msgstr " -O, --no-owner omet la restauration des propriétaires des objets\n" -#: pg_dumpall.c:637 +#: pg_dumpall.c:620 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr "" " -r, --roles-only sauvegarde uniquement les rôles, pas les bases\n" " de données ni les tablespaces\n" -#: pg_dumpall.c:639 +#: pg_dumpall.c:622 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr "" " -S, --superuser=NOM indique le nom du super-utilisateur à utiliser\n" " avec le format texte\n" -#: pg_dumpall.c:640 +#: pg_dumpall.c:623 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr "" " -t, --tablespaces-only sauvegarde uniquement les tablespaces, pas les\n" " bases de données ni les rôles\n" -#: pg_dumpall.c:646 +#: pg_dumpall.c:629 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" -msgstr " --exclude-database=MOTIF exclut les bases de données dont le nom correspond au motif\n" +msgstr "" +" --exclude-database=MOTIF exclut les bases de données dont le nom\n" +" correspond au motif\n" -#: pg_dumpall.c:653 +#: pg_dumpall.c:636 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords ne sauvegarde pas les mots de passe des rôles\n" -#: pg_dumpall.c:668 +#: pg_dumpall.c:652 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" -msgstr " -d, --dbname=CHAINE_CONN connexion à l'aide de la chaîne de connexion\n" +msgstr " -d, --dbname=CHAINE_CONNEX connexion à l'aide de la chaîne de connexion\n" -#: pg_dumpall.c:670 +#: pg_dumpall.c:654 #, c-format msgid " -l, --database=DBNAME alternative default database\n" -msgstr " -l, --database=NOM_BASE indique une autre base par défaut\n" +msgstr " -l, --database=BASE indique une autre base par défaut\n" -#: pg_dumpall.c:677 +#: pg_dumpall.c:661 #, c-format msgid "" "\n" @@ -2464,146 +2378,146 @@ msgstr "" "standard.\n" "\n" -#: pg_dumpall.c:883 +#: pg_dumpall.c:803 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "nom de rôle commençant par « pg_ » ignoré (« %s »)" -#: pg_dumpall.c:1284 +#: pg_dumpall.c:1018 +#, c-format +msgid "could not parse ACL list (%s) for parameter \"%s\"" +msgstr "n'a pas pu analyser la liste d'ACL (%s) pour le paramètre « %s »" + +#: pg_dumpall.c:1136 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "n'a pas pu analyser la liste d'ACL (%s) pour le tablespace « %s »" -#: pg_dumpall.c:1501 +#: pg_dumpall.c:1343 #, c-format msgid "excluding database \"%s\"" msgstr "exclusion de la base de données « %s »" -#: pg_dumpall.c:1505 +#: pg_dumpall.c:1347 #, c-format msgid "dumping database \"%s\"" msgstr "sauvegarde de la base de données « %s »" -#: pg_dumpall.c:1537 +#: pg_dumpall.c:1378 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "échec de pg_dump sur la base de données « %s », quitte" -#: pg_dumpall.c:1546 +#: pg_dumpall.c:1384 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "n'a pas pu ré-ouvrir le fichier de sortie « %s » : %m" -#: pg_dumpall.c:1590 +#: pg_dumpall.c:1425 #, c-format msgid "running \"%s\"" msgstr "exécute « %s »" -#: pg_dumpall.c:1805 +#: pg_dumpall.c:1630 #, c-format msgid "could not get server version" msgstr "n'a pas pu obtenir la version du serveur" -#: pg_dumpall.c:1811 +#: pg_dumpall.c:1633 #, c-format msgid "could not parse server version \"%s\"" msgstr "n'a pas pu analyser la version du serveur « %s »" -#: pg_dumpall.c:1883 pg_dumpall.c:1906 +#: pg_dumpall.c:1703 pg_dumpall.c:1726 #, c-format msgid "executing %s" msgstr "exécution %s" -#: pg_restore.c:308 +#: pg_restore.c:313 #, c-format msgid "one of -d/--dbname and -f/--file must be specified" msgstr "une seule des options -d/--dbname and -f/--file peut être indiquée" -#: pg_restore.c:317 +#: pg_restore.c:320 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" msgstr "les options « -d/--dbname » et « -f/--file » ne peuvent pas être utilisées ensemble" -#: pg_restore.c:343 +#: pg_restore.c:338 #, c-format msgid "options -C/--create and -1/--single-transaction cannot be used together" msgstr "les options « -c/--clean » et « -a/--data-only » ne peuvent pas être utilisées ensemble" -#: pg_restore.c:357 -#, c-format -msgid "maximum number of parallel jobs is %d" -msgstr "le nombre maximum de jobs en parallèle est %d" - -#: pg_restore.c:366 +#: pg_restore.c:342 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "ne peut pas spécifier à la fois l'option --single-transaction et demander plusieurs jobs" -#: pg_restore.c:408 +#: pg_restore.c:380 #, c-format msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "format d'archive « %s » non reconnu ; merci d'indiquer « c », « d » ou « t »" -#: pg_restore.c:448 +#: pg_restore.c:419 #, c-format msgid "errors ignored on restore: %d" msgstr "erreurs ignorées lors de la restauration : %d" -#: pg_restore.c:461 +#: pg_restore.c:432 #, c-format msgid "" "%s restores a PostgreSQL database from an archive created by pg_dump.\n" "\n" msgstr "" -"%s restaure une base de données PostgreSQL à partir d'une archive créée par\n" -"pg_dump.\n" +"%s restaure une base de données PostgreSQL à partir d'une archive créée\n" +"par pg_dump.\n" "\n" -#: pg_restore.c:463 +#: pg_restore.c:434 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [OPTION]... [FICHIER]\n" -#: pg_restore.c:466 +#: pg_restore.c:437 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr "" " -d, --dbname=NOM nom de la base de données utilisée pour la\n" " connexion\n" -#: pg_restore.c:467 +#: pg_restore.c:438 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" -msgstr " -f, --file=NOMFICHIER nom du fichier de sortie (- pour stdout)\n" +msgstr " -f, --file=FICHIER nom du fichier de sortie (- pour stdout)\n" -#: pg_restore.c:468 +#: pg_restore.c:439 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" msgstr "" " -F, --format=c|d|t format du fichier de sauvegarde (devrait être\n" " automatique)\n" -#: pg_restore.c:469 +#: pg_restore.c:440 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr " -l, --list affiche la table des matières de l'archive (TOC)\n" -#: pg_restore.c:470 +#: pg_restore.c:441 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose mode verbeux\n" -#: pg_restore.c:471 +#: pg_restore.c:442 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: pg_restore.c:472 +#: pg_restore.c:443 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_restore.c:474 +#: pg_restore.c:445 #, c-format msgid "" "\n" @@ -2612,150 +2526,148 @@ msgstr "" "\n" "Options contrôlant la restauration :\n" -#: pg_restore.c:475 +#: pg_restore.c:446 #, c-format msgid " -a, --data-only restore only the data, no schema\n" -msgstr "" -" -a, --data-only restaure uniquement les données, pas la\n" -" structure\n" +msgstr " -a, --data-only restaure uniquement les données, pas la structure\n" -#: pg_restore.c:477 +#: pg_restore.c:448 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create crée la base de données cible\n" -#: pg_restore.c:478 +#: pg_restore.c:449 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" msgstr " -e, --exit-on-error quitte en cas d'erreur, continue par défaut\n" -#: pg_restore.c:479 +#: pg_restore.c:450 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=NOM restaure l'index indiqué\n" -#: pg_restore.c:480 +#: pg_restore.c:451 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" msgstr "" -" -j, --jobs=NUMERO utilise ce nombre de jobs en parallèle pour\n" -" la restauration\n" +" -j, --jobs=NOMBRE utilise ce nombre de jobs en parallèle pour la\n" +" restauration\n" -#: pg_restore.c:481 +#: pg_restore.c:452 #, c-format msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" " selecting/ordering output\n" msgstr "" -" -L, --use-list=NOMFICHIER utilise la table des matières à partir\n" -" de ce fichier pour sélectionner/trier\n" -" la sortie\n" +" -L, --use-list=FICHIER utilise la table des matières à partir de ce\n" +" fichier pour sélectionner/trier la sortie\n" -#: pg_restore.c:483 +#: pg_restore.c:454 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" msgstr " -n, --schema=NOM restaure uniquement les objets de ce schéma\n" -#: pg_restore.c:484 +#: pg_restore.c:455 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" -msgstr " -N, --exclude-schema=NOM ne restaure pas les objets de ce schéma\n" +msgstr " -N, --exclude-schema=NOM ne restaure pas les objets de ce schéma\n" -#: pg_restore.c:486 +#: pg_restore.c:457 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=NOM(args) restaure la fonction indiquée\n" -#: pg_restore.c:487 +#: pg_restore.c:458 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" -msgstr "" -" -s, --schema-only restaure uniquement la structure, pas les\n" -" données\n" +msgstr " -s, --schema-only restaure uniquement la structure, pas les données\n" -#: pg_restore.c:488 +#: pg_restore.c:459 #, c-format msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n" msgstr "" -" -S, --superuser=NOM indique le nom du super-utilisateur à\n" -" utiliser pour désactiver les triggers\n" +" -S, --superuser=NOM indique le nom du super-utilisateur à utiliser\n" +" pour désactiver les triggers\n" -#: pg_restore.c:489 +#: pg_restore.c:460 #, c-format msgid " -t, --table=NAME restore named relation (table, view, etc.)\n" msgstr " -t, --table=NOM restaure la relation indiquée (table, vue, etc)\n" -#: pg_restore.c:490 +#: pg_restore.c:461 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=NOM restaure le trigger indiqué\n" -#: pg_restore.c:491 +#: pg_restore.c:462 #, c-format msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" msgstr "" " -x, --no-privileges omet la restauration des droits sur les objets\n" " (grant/revoke)\n" -#: pg_restore.c:492 +#: pg_restore.c:463 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr " -1, --single-transaction restaure dans une seule transaction\n" -#: pg_restore.c:494 +#: pg_restore.c:465 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security active la sécurité niveau ligne\n" -#: pg_restore.c:496 +#: pg_restore.c:467 #, c-format msgid " --no-comments do not restore comments\n" msgstr " --no-comments ne restaure pas les commentaires\n" -#: pg_restore.c:497 +#: pg_restore.c:468 #, c-format msgid "" " --no-data-for-failed-tables do not restore data of tables that could not be\n" " created\n" msgstr "" -" --no-data-for-failed-tables ne restaure pas les données des tables qui\n" -" n'ont pas pu être créées\n" +" --no-data-for-failed-tables ne restaure pas les données des tables qui n'ont\n" +" pas pu être créées\n" -#: pg_restore.c:499 +#: pg_restore.c:470 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications ne restaure pas les publications\n" -#: pg_restore.c:500 +#: pg_restore.c:471 #, c-format msgid " --no-security-labels do not restore security labels\n" msgstr " --no-security-labels ne restaure pas les labels de sécurité\n" -#: pg_restore.c:501 +#: pg_restore.c:472 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions ne restaure pas les souscriptions\n" -#: pg_restore.c:502 +#: pg_restore.c:473 +#, c-format +msgid " --no-table-access-method do not restore table access methods\n" +msgstr " --no-table-access-method ne restaure pas les méthodes d'accès aux tables\n" + +#: pg_restore.c:474 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" -msgstr "" -" --no-tablespaces ne restaure pas les affectations de\n" -" tablespaces\n" +msgstr " --no-tablespaces ne restaure pas les affectations de tablespaces\n" -#: pg_restore.c:503 +#: pg_restore.c:475 #, c-format msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n" msgstr "" -" --section=SECTION restaure la section indiquée (pre-data, data\n" -" ou post-data)\n" +" --section=SECTION restaure la section indiquée (pre-data, data ou\n" +" post-data)\n" -#: pg_restore.c:516 +#: pg_restore.c:488 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" -msgstr " --role=NOMROLE exécute SET ROLE avant la restauration\n" +msgstr " --role=RÔLE exécute SET ROLE avant la restauration\n" -#: pg_restore.c:518 +#: pg_restore.c:490 #, c-format msgid "" "\n" @@ -2763,10 +2675,10 @@ msgid "" "multiple times to select multiple objects.\n" msgstr "" "\n" -"Les options -I, -n, -N, -P, -t, -T et --section peuvent être combinées et indiquées\n" -"plusieurs fois pour sélectionner plusieurs objets.\n" +"Les options -I, -n, -N, -P, -t, -T et --section peuvent être combinées et\n" +"indiquées plusieurs fois pour sélectionner plusieurs objets.\n" -#: pg_restore.c:521 +#: pg_restore.c:493 #, c-format msgid "" "\n" @@ -2778,120 +2690,182 @@ msgstr "" "utilisée.\n" "\n" -#~ msgid "pclose failed: %m" -#~ msgstr "échec de pclose : %m" +#~ msgid " --disable-triggers disable triggers during data-only restore\n" +#~ msgstr "" +#~ " --disable-triggers désactiver les déclencheurs lors de la\n" +#~ " restauration des données seules\n" -#~ msgid "WSAStartup failed: %d" -#~ msgstr "WSAStartup a échoué : %d" +#~ msgid " --help show this help, then exit\n" +#~ msgstr " --help affiche cette aide puis quitte\n" -#~ msgid "select() failed: %m" -#~ msgstr "échec de select() : %m" +#~ msgid " --help show this help, then exit\n" +#~ msgstr " --help affiche cette aide et quitte\n" -#~ msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive" +#, c-format +#~ msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n" #~ msgstr "" -#~ "n'a pas pu trouver l'identifiant de bloc %d dans l'archive --\n" -#~ "il est possible que cela soit dû à une demande de restauration dans un ordre\n" -#~ "différent, qui n'a pas pu être géré à cause d'un manque d'information de\n" -#~ "position dans l'archive" +#~ " --no-synchronized-snapshots n'utilise pas de snapshots synchronisés pour les\n" +#~ " jobs en parallèle\n" -#~ msgid "ftell mismatch with expected position -- ftell used" -#~ msgstr "ftell ne correspond pas à la position attendue -- ftell utilisé" - -#~ msgid "Report bugs to .\n" -#~ msgstr "Rapporter les bogues à .\n" +#~ msgid "" +#~ " --use-set-session-authorization\n" +#~ " use SET SESSION AUTHORIZATION commands instead of\n" +#~ " ALTER OWNER commands to set ownership\n" +#~ msgstr "" +#~ " --use-set-session-authorization\n" +#~ " utilise les commandes SET SESSION AUTHORIZATION\n" +#~ " au lieu des commandes ALTER OWNER pour les\n" +#~ " modifier les propriétaires\n" -#~ msgid "reading extended statistics for table \"%s.%s\"\n" -#~ msgstr "lecture des statistiques étendues pour la table « %s.%s »\n" +#~ msgid " --version output version information, then exit\n" +#~ msgstr " --version affiche la version puis quitte\n" -#~ msgid "worker is terminating\n" -#~ msgstr "le worker est en cours d'arrêt\n" +#~ msgid " --version output version information, then exit\n" +#~ msgstr " --version affiche la version et quitte\n" -#~ msgid "could not get relation name for OID %u: %s\n" -#~ msgstr "n'a pas pu obtenir le nom de la relation pour l'OID %u: %s\n" +#~ msgid " -O, --no-owner skip restoration of object ownership\n" +#~ msgstr "" +#~ " -O, --no-owner omettre la restauration des possessions des\n" +#~ " objets\n" -#~ msgid "unrecognized command on communication channel: %s\n" -#~ msgstr "commande inconnue sur le canal de communucation: %s\n" +#~ msgid " -c, --clean clean (drop) database objects before recreating\n" +#~ msgstr "" +#~ " -c, --clean nettoie/supprime les bases de données avant de\n" +#~ " les créer\n" -#~ msgid "terminated by user\n" -#~ msgstr "terminé par l'utilisateur\n" +#~ msgid " -o, --oids include OIDs in dump\n" +#~ msgstr " -o, --oids inclut les OID dans la sauvegarde\n" -#~ msgid "error in ListenToWorkers(): %s\n" -#~ msgstr "erreur dans ListenToWorkers(): %s\n" +#~ msgid "%s: could not connect to database \"%s\": %s" +#~ msgstr "%s : n'a pas pu se connecter à la base de données « %s » : %s" -#~ msgid "archive member too large for tar format\n" -#~ msgstr "membre de l'archive trop volumineux pour le format tar\n" +#~ msgid "%s: could not open the output file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le fichier de sauvegarde « %s » : %s\n" -#~ msgid "could not open output file \"%s\" for writing\n" -#~ msgstr "n'a pas pu ouvrir le fichier de sauvegarde « %s » en écriture\n" +#~ msgid "%s: could not parse ACL list (%s) for database \"%s\"\n" +#~ msgstr "%s : n'a pas pu analyser la liste d'ACL (%s) pour la base de données « %s »\n" -#~ msgid "could not write to custom output routine\n" -#~ msgstr "n'a pas pu écrire vers la routine de sauvegarde personnalisée\n" +#~ msgid "%s: could not parse version \"%s\"\n" +#~ msgstr "%s : n'a pas pu analyser la version « %s »\n" -#~ msgid "unexpected end of file\n" -#~ msgstr "fin de fichier inattendu\n" +#~ msgid "%s: executing %s\n" +#~ msgstr "%s : exécute %s\n" -#~ msgid "could not write byte: %s\n" -#~ msgstr "n'a pas pu écrire un octet : %s\n" +#~ msgid "%s: invalid -X option -- %s\n" +#~ msgstr "%s : option -X invalide -- %s\n" -#~ msgid "could not write byte\n" -#~ msgstr "n'a pas pu écrire l'octet\n" +#~ msgid "%s: invalid client encoding \"%s\" specified\n" +#~ msgstr "%s : encodage client indiqué (« %s ») invalide\n" -#~ msgid "could not write null block at end of tar archive\n" -#~ msgstr "n'a pas pu écrire le bloc nul à la fin de l'archive tar\n" +#~ msgid "%s: invalid number of parallel jobs\n" +#~ msgstr "%s : nombre de jobs en parallèle invalide\n" -#~ msgid "could not output padding at end of tar member\n" -#~ msgstr "n'a pas pu remplir la fin du membre de tar\n" +#~ msgid "%s: option --if-exists requires option -c/--clean\n" +#~ msgstr "%s : l'option --if-exists nécessite l'option -c/--clean\n" -#~ msgid "mismatch in actual vs. predicted file position (%s vs. %s)\n" +#~ msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n" #~ msgstr "" -#~ "pas de correspondance entre la position réelle et celle prévue du fichier\n" -#~ "(%s vs. %s)\n" +#~ "%s : les options « -c/--clean » et « -a/--data-only » ne peuvent pas être\n" +#~ "utilisées conjointement\n" -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide puis quitte\n" +#~ msgid "%s: options -s/--schema-only and -a/--data-only cannot be used together\n" +#~ msgstr "" +#~ "%s : les options « -s/--schema-only » et « -a/--data-only » ne peuvent pas être\n" +#~ "utilisées conjointement\n" -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version puis quitte\n" +#~ msgid "%s: out of memory\n" +#~ msgstr "%s : mémoire épuisée\n" -#~ msgid "*** aborted because of error\n" -#~ msgstr "*** interrompu du fait d'erreurs\n" +#~ msgid "%s: query failed: %s" +#~ msgstr "%s : échec de la requête : %s" -#~ msgid "missing pg_database entry for database \"%s\"\n" -#~ msgstr "entrée manquante dans pg_database pour la base de données « %s »\n" +#~ msgid "%s: query was: %s\n" +#~ msgstr "%s : la requête était : %s\n" -#~ msgid "query returned more than one (%d) pg_database entry for database \"%s\"\n" -#~ msgstr "" -#~ "la requête a renvoyé plusieurs (%d) entrées pg_database pour la base de\n" -#~ "données « %s »\n" +#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" +#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" -#~ msgid "dumpDatabase(): could not find pg_largeobject.relfrozenxid\n" -#~ msgstr "dumpDatabase() : n'a pas pu trouver pg_largeobject.relfrozenxid\n" +#~ msgid "(The INSERT command cannot set OIDs.)\n" +#~ msgstr "(La commande INSERT ne peut pas positionner les OID.)\n" -#~ msgid "dumpDatabase(): could not find pg_largeobject_metadata.relfrozenxid\n" -#~ msgstr "dumpDatabase() : n'a pas pu trouver pg_largeobject_metadata.relfrozenxid\n" +#~ msgid "*** aborted because of error\n" +#~ msgstr "*** interrompu du fait d'erreurs\n" -#~ msgid "query returned %d foreign server entry for foreign table \"%s\"\n" -#~ msgid_plural "query returned %d foreign server entries for foreign table \"%s\"\n" -#~ msgstr[0] "la requête a renvoyé %d entrée de serveur distant pour la table distante « %s »\n" -#~ msgstr[1] "la requête a renvoyé %d entrées de serveurs distants pour la table distante « %s »\n" +#~ msgid "-C and -1 are incompatible options\n" +#~ msgstr "-C et -1 sont des options incompatibles\n" -#~ msgid "missing pg_database entry for this database\n" -#~ msgstr "entrée pg_database manquante pour cette base de données\n" +#~ msgid "-C and -c are incompatible options\n" +#~ msgstr "-C et -c sont des options incompatibles\n" -#~ msgid "found more than one pg_database entry for this database\n" -#~ msgstr "a trouvé plusieurs entrées dans pg_database pour cette base de données\n" +#~ msgid "LOCK TABLE failed for \"%s\": %s" +#~ msgstr "LOCK TABLE échoué pour la table « %s » : %s" -#~ msgid "could not find entry for pg_indexes in pg_class\n" -#~ msgstr "n'a pas pu trouver l'entrée de pg_indexes dans pg_class\n" +#~ msgid "Report bugs to .\n" +#~ msgstr "Rapporter les bogues à .\n" -#~ msgid "found more than one entry for pg_indexes in pg_class\n" -#~ msgstr "a trouvé plusieurs entrées pour pg_indexes dans la table pg_class\n" +#~ msgid "Report bugs to .\n" +#~ msgstr "Rapporter les bogues à .\n" #~ msgid "SQL command failed\n" #~ msgstr "la commande SQL a échoué\n" -#~ msgid "file archiver" -#~ msgstr "programme d'archivage de fichiers" +#, c-format +#~ msgid "" +#~ "Synchronized snapshots are not supported by this server version.\n" +#~ "Run with --no-synchronized-snapshots instead if you do not need\n" +#~ "synchronized snapshots." +#~ msgstr "" +#~ "Les snapshots synchronisés ne sont pas supportés par cette version serveur.\n" +#~ "Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n" +#~ "de snapshots synchronisés." + +#~ msgid "" +#~ "Synchronized snapshots are not supported on standby servers.\n" +#~ "Run with --no-synchronized-snapshots instead if you do not need\n" +#~ "synchronized snapshots.\n" +#~ msgstr "" +#~ "Les snapshots synchronisés ne sont pas supportés sur les serveurs de stadby.\n" +#~ "Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n" +#~ "de snapshots synchronisés.\n" + +#, c-format +#~ msgid "" +#~ "Synchronized snapshots on standby servers are not supported by this server version.\n" +#~ "Run with --no-synchronized-snapshots instead if you do not need\n" +#~ "synchronized snapshots." +#~ msgstr "" +#~ "Les snapshots synchronisés sur les serveurs standbys ne sont pas supportés par cette version serveur.\n" +#~ "Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n" +#~ "de snapshots synchronisés." + +#~ msgid "TOC Entry %s at %s (length %s, checksum %d)\n" +#~ msgstr "entrée TOC %s à %s (longueur %s, somme de contrôle %d)\n" + +#, c-format +#~ msgid "The command was: %s" +#~ msgstr "La commande était : %s" + +#~ msgid "" +#~ "The program \"pg_dump\" is needed by %s but was not found in the\n" +#~ "same directory as \"%s\".\n" +#~ "Check your installation." +#~ msgstr "" +#~ "Le programme « pg_dump » est nécessaire à %s mais n'a pas été trouvé dans le\n" +#~ "même répertoire que « %s ».\n" +#~ "Vérifiez votre installation." + +#~ msgid "" +#~ "The program \"pg_dump\" was found by \"%s\"\n" +#~ "but was not the same version as %s.\n" +#~ "Check your installation." +#~ msgstr "" +#~ "Le programme « pg_dump » a été trouvé par « %s »\n" +#~ "mais n'a pas la même version que %s.\n" +#~ "Vérifiez votre installation." + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Essayer « %s --help » pour plus d'informations.\n" #~ msgid "" #~ "WARNING:\n" @@ -2903,410 +2877,513 @@ msgstr "" #~ " pour une utilisation normale. Les fichiers seront écrits dans le\n" #~ " répertoire actuel.\n" +#~ msgid "WARNING: could not parse reloptions array\n" +#~ msgstr "ATTENTION : n'a pas pu analyser le tableau reloptions\n" + +#~ msgid "WSAStartup failed: %d" +#~ msgstr "WSAStartup a échoué : %d" + +#~ msgid "aggregate function %s could not be dumped correctly for this database version; ignored" +#~ msgstr "la fonction d'aggrégat %s n'a pas pu être sauvegardée correctement avec cette version de la base de données ; ignorée" + +#~ msgid "allocating AH for %s, format %d\n" +#~ msgstr "allocation d'AH pour %s, format %d\n" + +#~ msgid "archive member too large for tar format\n" +#~ msgstr "membre de l'archive trop volumineux pour le format tar\n" + +#~ msgid "archiver" +#~ msgstr "archiveur" + +#~ msgid "archiver (db)" +#~ msgstr "programme d'archivage (db)" + +#~ msgid "attempting to ascertain archive format\n" +#~ msgstr "tentative d'identification du format de l'archive\n" + +#, c-format +#~ msgid "bogus value in proargmodes array" +#~ msgstr "valeur erronée dans le tableau proargmodes" + +#~ msgid "cannot duplicate null pointer\n" +#~ msgstr "ne peut pas dupliquer un pointeur nul\n" + +#~ msgid "cannot reopen non-seekable file\n" +#~ msgstr "ne peut pas rouvrir le fichier non cherchable\n" + +#~ msgid "cannot reopen stdin\n" +#~ msgstr "ne peut pas rouvrir stdin\n" + +#~ msgid "child process was terminated by signal %d" +#~ msgstr "le processus fils a été terminé par le signal %d" + +#~ msgid "child process was terminated by signal %s" +#~ msgstr "le processus fils a été terminé par le signal %s" + +#~ msgid "compress_io" +#~ msgstr "compression_io" + +#, c-format +#~ msgid "compression level must be in range 0..9" +#~ msgstr "le niveau de compression doit être compris entre 0 et 9" + +#~ msgid "compression support is disabled in this format\n" +#~ msgstr "le support de la compression est désactivé avec ce format\n" + +#~ msgid "connecting to database \"%s\" as user \"%s\"" +#~ msgstr "connexion à la base de données « %s » en tant qu'utilisateur « %s »" + +#~ msgid "connection needs password" +#~ msgstr "la connexion nécessite un mot de passe" + +#~ msgid "connection to database \"%s\" failed: %s" +#~ msgstr "la connexion à la base de données « %s » a échoué : %s" + +#~ msgid "could not change directory to \"%s\"" +#~ msgstr "n'a pas pu accéder au répertoire « %s »" + +#~ msgid "could not change directory to \"%s\": %s" +#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s" + #~ msgid "could not close data file after reading\n" #~ msgstr "n'a pas pu fermer le fichier de données après lecture\n" -#~ msgid "could not open large object TOC for input: %s\n" -#~ msgstr "n'a pas pu ouvrir la TOC du « Large Object » en entrée : %s\n" - -#~ msgid "could not open large object TOC for output: %s\n" -#~ msgstr "n'a pas pu ouvrir la TOC du « Large Object » en sortie : %s\n" +#~ msgid "could not close directory \"%s\": %s\n" +#~ msgstr "n'a pas pu fermer le répertoire « %s » : %s\n" #~ msgid "could not close large object file\n" #~ msgstr "n'a pas pu fermer le fichier du « Large Object »\n" -#~ msgid "restoring large object OID %u\n" -#~ msgstr "restauration du « Large Object » d'OID %u\n" - -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide et quitte\n" +#, c-format +#~ msgid "could not close tar member: %m" +#~ msgstr "n'a pas pu fermer le membre de tar : %m" -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version et quitte\n" +#~ msgid "could not connect to database \"%s\": %s" +#~ msgstr "n'a pas pu se connecter à la base de données « %s » : %s" -#~ msgid " -c, --clean clean (drop) database objects before recreating\n" -#~ msgstr "" -#~ " -c, --clean nettoie/supprime les bases de données avant de\n" -#~ " les créer\n" +#~ msgid "could not create directory \"%s\": %s\n" +#~ msgstr "n'a pas pu créer le répertoire « %s » : %s\n" -#~ msgid " -O, --no-owner skip restoration of object ownership\n" -#~ msgstr "" -#~ " -O, --no-owner omettre la restauration des possessions des\n" -#~ " objets\n" +#~ msgid "could not create worker thread: %s\n" +#~ msgstr "n'a pas pu créer le fil de travail: %s\n" -#~ msgid " --disable-triggers disable triggers during data-only restore\n" +#~ msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive" #~ msgstr "" -#~ " --disable-triggers désactiver les déclencheurs lors de la\n" -#~ " restauration des données seules\n" +#~ "n'a pas pu trouver l'identifiant de bloc %d dans l'archive --\n" +#~ "il est possible que cela soit dû à une demande de restauration dans un ordre\n" +#~ "différent, qui n'a pas pu être géré à cause d'un manque d'information de\n" +#~ "position dans l'archive" -#~ msgid "" -#~ " --use-set-session-authorization\n" -#~ " use SET SESSION AUTHORIZATION commands instead of\n" -#~ " ALTER OWNER commands to set ownership\n" -#~ msgstr "" -#~ " --use-set-session-authorization\n" -#~ " utilise les commandes SET SESSION AUTHORIZATION\n" -#~ " au lieu des commandes ALTER OWNER pour les\n" -#~ " modifier les propriétaires\n" +#~ msgid "could not find entry for pg_indexes in pg_class\n" +#~ msgstr "n'a pas pu trouver l'entrée de pg_indexes dans pg_class\n" -#~ msgid "%s: out of memory\n" -#~ msgstr "%s : mémoire épuisée\n" +#~ msgid "could not find slot of finished worker\n" +#~ msgstr "n'a pas pu trouver l'emplacement du worker qui vient de terminer\n" -#~ msgid "cannot reopen stdin\n" -#~ msgstr "ne peut pas rouvrir stdin\n" +#~ msgid "could not get relation name for OID %u: %s\n" +#~ msgstr "n'a pas pu obtenir le nom de la relation pour l'OID %u: %s\n" -#~ msgid "cannot reopen non-seekable file\n" -#~ msgstr "ne peut pas rouvrir le fichier non cherchable\n" +#~ msgid "could not identify current directory: %s" +#~ msgstr "n'a pas pu identifier le répertoire courant : %s" -#~ msgid "%s: invalid -X option -- %s\n" -#~ msgstr "%s : option -X invalide -- %s\n" +#~ msgid "could not open large object TOC for input: %s\n" +#~ msgstr "n'a pas pu ouvrir la TOC du « Large Object » en entrée : %s\n" -#~ msgid "query returned no rows: %s\n" -#~ msgstr "la requête n'a renvoyé aucune ligne : %s\n" +#~ msgid "could not open large object TOC for output: %s\n" +#~ msgstr "n'a pas pu ouvrir la TOC du « Large Object » en sortie : %s\n" -#~ msgid "dumping a specific TOC data block out of order is not supported without ID on this input stream (fseek required)\n" -#~ msgstr "" -#~ "la sauvegarde d'un bloc de données spécifique du TOC dans le désordre n'est\n" -#~ "pas supporté sans identifiant sur ce flux d'entrée (fseek requis)\n" +#~ msgid "could not open output file \"%s\" for writing\n" +#~ msgstr "n'a pas pu ouvrir le fichier de sauvegarde « %s » en écriture\n" -#~ msgid "dumpBlobs(): could not open large object %u: %s" -#~ msgstr "dumpBlobs() : n'a pas pu ouvrir le « Large Object » %u : %s" +#, c-format +#~ msgid "could not open temporary file" +#~ msgstr "n'a pas pu ouvrir le fichier temporaire" -#~ msgid "saving large object properties\n" -#~ msgstr "sauvegarde des propriétés des « Large Objects »\n" +#~ msgid "could not output padding at end of tar member\n" +#~ msgstr "n'a pas pu remplir la fin du membre de tar\n" #~ msgid "could not parse ACL (%s) for large object %u" #~ msgstr "n'a pas pu analyser la liste ACL (%s) du « Large Object » %u" -#~ msgid "compression support is disabled in this format\n" -#~ msgstr "le support de la compression est désactivé avec ce format\n" +#, c-format +#~ msgid "could not parse extension condition array" +#~ msgstr "n'a pas pu analyser le tableau de condition de l'extension" -#~ msgid "no label definitions found for enum ID %u\n" -#~ msgstr "aucune définition de label trouvée pour l'ID enum %u\n" +#, c-format +#~ msgid "could not parse extension configuration array" +#~ msgstr "n'a pas pu analyser le tableau de configuration des extensions" -#~ msgid "query returned %d rows instead of one: %s\n" -#~ msgstr "la requête a renvoyé %d lignes au lieu d'une seule : %s\n" +#~ msgid "could not parse index collation name array" +#~ msgstr "n'a pas pu analyser le tableau des noms de collation de l'index" -#~ msgid "read %lu byte into lookahead buffer\n" -#~ msgid_plural "read %lu bytes into lookahead buffer\n" -#~ msgstr[0] "lecture de %lu octet dans le tampon prévisionnel\n" -#~ msgstr[1] "lecture de %lu octets dans le tampon prévisionnel\n" +#~ msgid "could not parse index collation version array" +#~ msgstr "n'a pas pu analyser le tableau des versions de collation de l'index" -#~ msgid "requested %d byte, got %d from lookahead and %d from file\n" -#~ msgid_plural "requested %d bytes, got %d from lookahead and %d from file\n" -#~ msgstr[0] "%d octet requis, %d obtenu de « lookahead » et %d du fichier\n" -#~ msgstr[1] "%d octets requis, %d obtenus de « lookahead » et %d du fichier\n" +#, c-format +#~ msgid "could not parse proallargtypes array" +#~ msgstr "n'a pas pu analyser le tableau proallargtypes" -#~ msgid "invalid COPY statement -- could not find \"from stdin\" in string \"%s\" starting at position %lu\n" -#~ msgstr "" -#~ "instruction COPY invalide -- n'a pas pu trouver « from stdin » dans la\n" -#~ "chaîne « %s » à partir de la position %lu\n" +#, c-format +#~ msgid "could not parse proargmodes array" +#~ msgstr "n'a pas pu analyser le tableau proargmodes" -#~ msgid "invalid COPY statement -- could not find \"copy\" in string \"%s\"\n" -#~ msgstr "instruction COPY invalide -- n'a pas pu trouver « copy » dans la chaîne « %s »\n" +#, c-format +#~ msgid "could not parse proargnames array" +#~ msgstr "n'a pas pu analyser le tableau proargnames" -#~ msgid "-C and -c are incompatible options\n" -#~ msgstr "-C et -c sont des options incompatibles\n" +#, c-format +#~ msgid "could not parse proconfig array" +#~ msgstr "n'a pas pu analyser le tableau proconfig" -#~ msgid "%s: could not parse version \"%s\"\n" -#~ msgstr "%s : n'a pas pu analyser la version « %s »\n" +#, c-format +#~ msgid "could not parse subpublications array" +#~ msgstr "n'a pas pu analyser le tableau de sous-publications" #~ msgid "could not parse version string \"%s\"\n" #~ msgstr "n'a pas pu analyser la chaîne de version « %s »\n" -#~ msgid "could not create worker thread: %s\n" -#~ msgstr "n'a pas pu créer le fil de travail: %s\n" +#~ msgid "could not read directory \"%s\": %s\n" +#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n" -#~ msgid "parallel_restore should not return\n" -#~ msgstr "parallel_restore ne devrait pas retourner\n" +#~ msgid "could not read symbolic link \"%s\"" +#~ msgstr "n'a pas pu lire le lien symbolique « %s »" -#~ msgid "worker process crashed: status %d\n" -#~ msgstr "crash du processus worker : statut %d\n" +#~ msgid "could not reconnect to database" +#~ msgstr "n'a pas pu se reconnecter à la base de données" -#~ msgid "cannot duplicate null pointer\n" -#~ msgstr "ne peut pas dupliquer un pointeur nul\n" +#~ msgid "could not reconnect to database: %s" +#~ msgstr "n'a pas pu se reconnecter à la base de données : %s" -#~ msgid "could not change directory to \"%s\"" -#~ msgstr "n'a pas pu accéder au répertoire « %s »" +#~ msgid "could not set default_with_oids: %s" +#~ msgstr "n'a pas pu configurer default_with_oids : %s" -#~ msgid "query to get data of sequence \"%s\" returned name \"%s\"\n" -#~ msgstr "" -#~ "la requête permettant d'obtenir les données de la séquence « %s » a renvoyé\n" -#~ "le nom « %s »\n" +#~ msgid "could not write byte\n" +#~ msgstr "n'a pas pu écrire l'octet\n" -#~ msgid "server version must be at least 7.3 to use schema selection switches\n" +#~ msgid "could not write byte: %s\n" +#~ msgstr "n'a pas pu écrire un octet : %s\n" + +#~ msgid "could not write null block at end of tar archive\n" +#~ msgstr "n'a pas pu écrire le bloc nul à la fin de l'archive tar\n" + +#~ msgid "could not write to custom output routine\n" +#~ msgstr "n'a pas pu écrire vers la routine de sauvegarde personnalisée\n" + +#~ msgid "could not write to large object (result: %lu, expected: %lu)" +#~ msgstr "n'a pas pu écrire le « Large Object » (résultat : %lu, attendu : %lu)" + +#~ msgid "custom archiver" +#~ msgstr "programme d'archivage personnalisé" + +#~ msgid "directory archiver" +#~ msgstr "archiveur répertoire" + +#~ msgid "dumpBlobs(): could not open large object %u: %s" +#~ msgstr "dumpBlobs() : n'a pas pu ouvrir le « Large Object » %u : %s" + +#~ msgid "dumpDatabase(): could not find pg_largeobject.relfrozenxid\n" +#~ msgstr "dumpDatabase() : n'a pas pu trouver pg_largeobject.relfrozenxid\n" + +#~ msgid "dumpDatabase(): could not find pg_largeobject_metadata.relfrozenxid\n" +#~ msgstr "dumpDatabase() : n'a pas pu trouver pg_largeobject_metadata.relfrozenxid\n" + +#~ msgid "dumping a specific TOC data block out of order is not supported without ID on this input stream (fseek required)\n" #~ msgstr "" -#~ "le serveur doit être de version 7.3 ou supérieure pour utiliser les options\n" -#~ "de sélection du schéma\n" +#~ "la sauvegarde d'un bloc de données spécifique du TOC dans le désordre n'est\n" +#~ "pas supporté sans identifiant sur ce flux d'entrée (fseek requis)\n" + +#~ msgid "entering restore_toc_entries_parallel\n" +#~ msgstr "entrée dans restore_toc_entries_parallel\n" + +#~ msgid "entering restore_toc_entries_postfork\n" +#~ msgstr "entrée dans restore_toc_entries_prefork\n" + +#~ msgid "entering restore_toc_entries_prefork\n" +#~ msgstr "entrée dans restore_toc_entries_prefork\n" #~ msgid "error during backup\n" #~ msgstr "erreur lors de la sauvegarde\n" -#~ msgid "could not find slot of finished worker\n" -#~ msgstr "n'a pas pu trouver l'emplacement du worker qui vient de terminer\n" +#~ msgid "error in ListenToWorkers(): %s\n" +#~ msgstr "erreur dans ListenToWorkers(): %s\n" #~ msgid "error processing a parallel work item\n" #~ msgstr "erreur durant le traitement en parallèle d'un item\n" -#~ msgid "" -#~ "Synchronized snapshots are not supported on standby servers.\n" -#~ "Run with --no-synchronized-snapshots instead if you do not need\n" -#~ "synchronized snapshots.\n" -#~ msgstr "" -#~ "Les snapshots synchronisés ne sont pas supportés sur les serveurs de stadby.\n" -#~ "Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n" -#~ "de snapshots synchronisés.\n" +#, c-format +#~ msgid "extra_float_digits must be in range -15..3" +#~ msgstr "extra_float_digits doit être dans l'intervalle -15 à 3" -#~ msgid "setting owner and privileges for %s \"%s\"\n" -#~ msgstr "réglage du propriétaire et des droits pour %s « %s »\n" +#~ msgid "failed to connect to database\n" +#~ msgstr "n'a pas pu se connecter à la base de données\n" -#~ msgid "setting owner and privileges for %s \"%s.%s\"\n" -#~ msgstr "réglage du propriétaire et des droits pour %s « %s.%s»\n" +#~ msgid "failed to reconnect to database\n" +#~ msgstr "la reconnexion à la base de données a échoué\n" -#~ msgid "%s: could not parse ACL list (%s) for database \"%s\"\n" -#~ msgstr "%s : n'a pas pu analyser la liste d'ACL (%s) pour la base de données « %s »\n" +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatal : " -#~ msgid "%s: invalid number of parallel jobs\n" -#~ msgstr "%s : nombre de jobs en parallèle invalide\n" +#~ msgid "file archiver" +#~ msgstr "programme d'archivage de fichiers" -#~ msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n" -#~ msgstr "" -#~ "%s : les options « -c/--clean » et « -a/--data-only » ne peuvent pas être\n" -#~ "utilisées conjointement\n" +#, c-format +#~ msgid "finding check constraints for table \"%s.%s\"" +#~ msgstr "recherche des contraintes de vérification pour la table « %s.%s »" -#~ msgid "%s: options -s/--schema-only and -a/--data-only cannot be used together\n" -#~ msgstr "" -#~ "%s : les options « -s/--schema-only » et « -a/--data-only » ne peuvent pas être\n" -#~ "utilisées conjointement\n" +#, c-format +#~ msgid "finding default expressions of table \"%s.%s\"" +#~ msgstr "recherche des expressions par défaut de la table « %s.%s »" -#~ msgid "%s: query was: %s\n" -#~ msgstr "%s : la requête était : %s\n" +#, c-format +#~ msgid "finding the columns and types of table \"%s.%s\"" +#~ msgstr "recherche des colonnes et types de la table « %s.%s »" -#~ msgid "%s: query failed: %s" -#~ msgstr "%s : échec de la requête : %s" +#~ msgid "found more than one entry for pg_indexes in pg_class\n" +#~ msgstr "a trouvé plusieurs entrées pour pg_indexes dans la table pg_class\n" -#~ msgid "%s: executing %s\n" -#~ msgstr "%s : exécute %s\n" +#~ msgid "found more than one pg_database entry for this database\n" +#~ msgstr "a trouvé plusieurs entrées dans pg_database pour cette base de données\n" -#~ msgid "%s: could not connect to database \"%s\": %s" -#~ msgstr "%s : n'a pas pu se connecter à la base de données « %s » : %s" +#~ msgid "ftell mismatch with expected position -- ftell used" +#~ msgstr "ftell ne correspond pas à la position attendue -- ftell utilisé" -#~ msgid "%s: invalid client encoding \"%s\" specified\n" -#~ msgstr "%s : encodage client indiqué (« %s ») invalide\n" +#~ msgid "internal error -- neither th nor fh specified in _tarReadRaw()" +#~ msgstr "erreur interne -- ni th ni fh ne sont précisés dans _tarReadRaw()" -#~ msgid "%s: could not open the output file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier de sauvegarde « %s » : %s\n" +#~ msgid "invalid COPY statement -- could not find \"copy\" in string \"%s\"\n" +#~ msgstr "instruction COPY invalide -- n'a pas pu trouver « copy » dans la chaîne « %s »\n" -#~ msgid "%s: option --if-exists requires option -c/--clean\n" -#~ msgstr "%s : l'option --if-exists nécessite l'option -c/--clean\n" +#~ msgid "invalid COPY statement -- could not find \"from stdin\" in string \"%s\" starting at position %lu\n" +#~ msgstr "" +#~ "instruction COPY invalide -- n'a pas pu trouver « from stdin » dans la\n" +#~ "chaîne « %s » à partir de la position %lu\n" + +#~ msgid "invalid TOASTCOMPRESSION item: %s" +#~ msgstr "élément TOASTCOMPRESSION invalide : %s" + +#, c-format +#~ msgid "invalid number of parallel jobs" +#~ msgstr "nombre de jobs parallèles invalide" + +#, c-format +#~ msgid "maximum number of parallel jobs is %d" +#~ msgstr "le nombre maximum de jobs en parallèle est %d" + +#~ msgid "mismatch in actual vs. predicted file position (%s vs. %s)\n" +#~ msgstr "" +#~ "pas de correspondance entre la position réelle et celle prévue du fichier\n" +#~ "(%s vs. %s)\n" + +#~ msgid "mismatched number of collation names and versions for index" +#~ msgstr "nombre différent de noms et versions de collation pour l'index" -#~ msgid "sorter" -#~ msgstr "tri" +#~ msgid "missing pg_database entry for database \"%s\"\n" +#~ msgstr "entrée manquante dans pg_database pour la base de données « %s »\n" -#~ msgid "WARNING: could not parse reloptions array\n" -#~ msgstr "ATTENTION : n'a pas pu analyser le tableau reloptions\n" +#~ msgid "missing pg_database entry for this database\n" +#~ msgstr "entrée pg_database manquante pour cette base de données\n" -#~ msgid "unrecognized collation provider: %s\n" -#~ msgstr "fournisseur de collationnement non reconnu : %s\n" +#~ msgid "moving from position %s to next member at file position %s\n" +#~ msgstr "déplacement de la position %s vers le prochain membre à la position %s du fichier\n" -#~ msgid "schema with OID %u does not exist\n" -#~ msgstr "le schéma d'OID %u n'existe pas\n" +#~ msgid "no item ready\n" +#~ msgstr "aucun élément prêt\n" -#~ msgid "Report bugs to .\n" -#~ msgstr "Rapporter les bogues à .\n" +#~ msgid "no label definitions found for enum ID %u\n" +#~ msgstr "aucune définition de label trouvée pour l'ID enum %u\n" -#~ msgid " -o, --oids include OIDs in dump\n" -#~ msgstr " -o, --oids inclut les OID dans la sauvegarde\n" +#~ msgid "now at file position %s\n" +#~ msgstr "maintenant en position %s du fichier\n" -#~ msgid "(The INSERT command cannot set OIDs.)\n" -#~ msgstr "(La commande INSERT ne peut pas positionner les OID.)\n" +#~ msgid "option --index-collation-versions-unknown only works in binary upgrade mode" +#~ msgstr "l'option --index-collation-versions-unknown fonctionne seulement dans le mode de mise à jour binaire" #~ msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n" #~ msgstr "" #~ "les options « --inserts/--column-inserts » et « -o/--oids » ne\n" #~ "peuvent pas être utilisées conjointement\n" -#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" -#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" - -#~ msgid "TOC Entry %s at %s (length %s, checksum %d)\n" -#~ msgstr "entrée TOC %s à %s (longueur %s, somme de contrôle %d)\n" +#, c-format +#~ msgid "owner of aggregate function \"%s\" appears to be invalid" +#~ msgstr "le propriétaire de la fonction d'agrégat « %s » semble être invalide" -#~ msgid "skipping tar member %s\n" -#~ msgstr "omission du membre %s du tar\n" +#, c-format +#~ msgid "owner of data type \"%s\" appears to be invalid" +#~ msgstr "le propriétaire du type de données « %s » semble être invalide" -#~ msgid "now at file position %s\n" -#~ msgstr "maintenant en position %s du fichier\n" +#, c-format +#~ msgid "owner of function \"%s\" appears to be invalid" +#~ msgstr "le propriétaire de la fonction « %s » semble être invalide" -#~ msgid "moving from position %s to next member at file position %s\n" -#~ msgstr "déplacement de la position %s vers le prochain membre à la position %s du fichier\n" +#, c-format +#~ msgid "owner of operator \"%s\" appears to be invalid" +#~ msgstr "le propriétaire de l'opérateur « %s » semble être invalide" -#~ msgid "tar archiver" -#~ msgstr "archiveur tar" +#, c-format +#~ msgid "owner of operator class \"%s\" appears to be invalid" +#~ msgstr "le propriétaire de la classe d'opérateur « %s » semble être invalide" -#~ msgid "could not create directory \"%s\": %s\n" -#~ msgstr "n'a pas pu créer le répertoire « %s » : %s\n" +#, c-format +#~ msgid "owner of operator family \"%s\" appears to be invalid" +#~ msgstr "le propriétaire de la famille d'opérateur « %s » semble être invalide" -#~ msgid "could not close directory \"%s\": %s\n" -#~ msgstr "n'a pas pu fermer le répertoire « %s » : %s\n" +#, c-format +#~ msgid "owner of publication \"%s\" appears to be invalid" +#~ msgstr "le propriétaire de la publication « %s » semble être invalide" -#~ msgid "could not read directory \"%s\": %s\n" -#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n" +#, c-format +#~ msgid "owner of schema \"%s\" appears to be invalid" +#~ msgstr "le propriétaire du schéma « %s » semble être invalide" -#~ msgid "directory archiver" -#~ msgstr "archiveur répertoire" +#, c-format +#~ msgid "owner of subscription \"%s\" appears to be invalid" +#~ msgstr "le propriétaire de la souscription « %s » semble être invalide" -#~ msgid "query returned %d row instead of one: %s\n" -#~ msgid_plural "query returned %d rows instead of one: %s\n" -#~ msgstr[0] "la requête a renvoyé %d ligne au lieu d'une seule : %s\n" -#~ msgstr[1] "la requête a renvoyé %d lignes au lieu d'une seule : %s\n" +#, c-format +#~ msgid "owner of table \"%s\" appears to be invalid" +#~ msgstr "le propriétaire de la table « %s » semble être invalide" -#~ msgid "query was: %s\n" -#~ msgstr "la requête était : %s\n" +#~ msgid "parallel archiver" +#~ msgstr "archiveur en parallèle" -#~ msgid "failed to connect to database\n" -#~ msgstr "n'a pas pu se connecter à la base de données\n" +#~ msgid "parallel_restore should not return\n" +#~ msgstr "parallel_restore ne devrait pas retourner\n" -#~ msgid "failed to reconnect to database\n" -#~ msgstr "la reconnexion à la base de données a échoué\n" +#~ msgid "pclose failed: %m" +#~ msgstr "échec de pclose : %m" -#~ msgid "archiver (db)" -#~ msgstr "programme d'archivage (db)" +#~ msgid "pclose failed: %s" +#~ msgstr "échec de pclose : %s" -#~ msgid "custom archiver" -#~ msgstr "programme d'archivage personnalisé" +#~ msgid "query returned %d foreign server entry for foreign table \"%s\"\n" +#~ msgid_plural "query returned %d foreign server entries for foreign table \"%s\"\n" +#~ msgstr[0] "la requête a renvoyé %d entrée de serveur distant pour la table distante « %s »\n" +#~ msgstr[1] "la requête a renvoyé %d entrées de serveurs distants pour la table distante « %s »\n" -#~ msgid "reducing dependencies for %d\n" -#~ msgstr "réduction des dépendances pour %d\n" +#~ msgid "query returned %d row instead of one: %s\n" +#~ msgid_plural "query returned %d rows instead of one: %s\n" +#~ msgstr[0] "la requête a renvoyé %d ligne au lieu d'une seule : %s\n" +#~ msgstr[1] "la requête a renvoyé %d lignes au lieu d'une seule : %s\n" -#~ msgid "transferring dependency %d -> %d to %d\n" -#~ msgstr "transfert de la dépendance %d -> %d vers %d\n" +#~ msgid "query returned %d rows instead of one: %s\n" +#~ msgstr "la requête a renvoyé %d lignes au lieu d'une seule : %s\n" -#~ msgid "no item ready\n" -#~ msgstr "aucun élément prêt\n" +#~ msgid "query returned more than one (%d) pg_database entry for database \"%s\"\n" +#~ msgstr "" +#~ "la requête a renvoyé plusieurs (%d) entrées pg_database pour la base de\n" +#~ "données « %s »\n" -#~ msgid "entering restore_toc_entries_postfork\n" -#~ msgstr "entrée dans restore_toc_entries_prefork\n" +#~ msgid "query returned no rows: %s\n" +#~ msgstr "la requête n'a renvoyé aucune ligne : %s\n" -#~ msgid "entering restore_toc_entries_parallel\n" -#~ msgstr "entrée dans restore_toc_entries_parallel\n" +#~ msgid "query to get data of sequence \"%s\" returned name \"%s\"\n" +#~ msgstr "" +#~ "la requête permettant d'obtenir les données de la séquence « %s » a renvoyé\n" +#~ "le nom « %s »\n" -#~ msgid "entering restore_toc_entries_prefork\n" -#~ msgstr "entrée dans restore_toc_entries_prefork\n" +#~ msgid "query was: %s\n" +#~ msgstr "la requête était : %s\n" -#~ msgid "could not set default_with_oids: %s" -#~ msgstr "n'a pas pu configurer default_with_oids : %s" +#~ msgid "read %lu byte into lookahead buffer\n" +#~ msgid_plural "read %lu bytes into lookahead buffer\n" +#~ msgstr[0] "lecture de %lu octet dans le tampon prévisionnel\n" +#~ msgstr[1] "lecture de %lu octets dans le tampon prévisionnel\n" #~ msgid "read TOC entry %d (ID %d) for %s %s\n" #~ msgstr "lecture de l'entrée %d de la TOC (ID %d) pour %s %s\n" -#~ msgid "allocating AH for %s, format %d\n" -#~ msgstr "allocation d'AH pour %s, format %d\n" - -#~ msgid "attempting to ascertain archive format\n" -#~ msgstr "tentative d'identification du format de l'archive\n" - -#~ msgid "-C and -1 are incompatible options\n" -#~ msgstr "-C et -1 sont des options incompatibles\n" - -#~ msgid "archiver" -#~ msgstr "archiveur" - -#~ msgid "select() failed: %s\n" -#~ msgstr "échec de select() : %s\n" +#~ msgid "reading extended statistics for table \"%s.%s\"\n" +#~ msgstr "lecture des statistiques étendues pour la table « %s.%s »\n" -#~ msgid "parallel archiver" -#~ msgstr "archiveur en parallèle" +#, c-format +#~ msgid "reading foreign key constraints for table \"%s.%s\"" +#~ msgstr "lecture des contraintes de clés étrangères pour la table « %s.%s »" -#~ msgid "compress_io" -#~ msgstr "compression_io" +#, c-format +#~ msgid "reading indexes for table \"%s.%s\"" +#~ msgstr "lecture des index de la table « %s.%s »" -#~ msgid "child process was terminated by signal %d" -#~ msgstr "le processus fils a été terminé par le signal %d" +#~ msgid "reading policies for table \"%s.%s\"" +#~ msgstr "lecture des politiques pour la table « %s.%s »" -#~ msgid "child process was terminated by signal %s" -#~ msgstr "le processus fils a été terminé par le signal %s" +#~ msgid "reading row security enabled for table \"%s.%s\"" +#~ msgstr "lecture de l'activation de la sécurité niveau ligne pour la table « %s.%s »" -#~ msgid "pclose failed: %s" -#~ msgstr "échec de pclose : %s" +#, c-format +#~ msgid "reading triggers for table \"%s.%s\"" +#~ msgstr "lecture des triggers pour la table « %s.%s »" -#~ msgid "could not read symbolic link \"%s\"" -#~ msgstr "n'a pas pu lire le lien symbolique « %s »" +#~ msgid "reconnection to database \"%s\" failed: %s" +#~ msgstr "reconnexion à la base de données « %s » échouée : %s" -#~ msgid "could not change directory to \"%s\": %s" -#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s" +#~ msgid "reducing dependencies for %d\n" +#~ msgstr "réduction des dépendances pour %d\n" -#~ msgid "could not identify current directory: %s" -#~ msgstr "n'a pas pu identifier le répertoire courant : %s" +#~ msgid "requested %d byte, got %d from lookahead and %d from file\n" +#~ msgid_plural "requested %d bytes, got %d from lookahead and %d from file\n" +#~ msgstr[0] "%d octet requis, %d obtenu de « lookahead » et %d du fichier\n" +#~ msgstr[1] "%d octets requis, %d obtenus de « lookahead » et %d du fichier\n" -#~ msgid "" -#~ "The program \"pg_dump\" was found by \"%s\"\n" -#~ "but was not the same version as %s.\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « pg_dump » a été trouvé par « %s »\n" -#~ "mais n'a pas la même version que %s.\n" -#~ "Vérifiez votre installation." +#~ msgid "restoring large object OID %u\n" +#~ msgstr "restauration du « Large Object » d'OID %u\n" -#~ msgid "" -#~ "The program \"pg_dump\" is needed by %s but was not found in the\n" -#~ "same directory as \"%s\".\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « pg_dump » est nécessaire à %s mais n'a pas été trouvé dans le\n" -#~ "même répertoire que « %s ».\n" -#~ "Vérifiez votre installation." +#, c-format +#~ msgid "rows-per-insert must be in range %d..%d" +#~ msgstr "le nombre de lignes par insertion doit être compris entre %d et %d" -#~ msgid "internal error -- neither th nor fh specified in _tarReadRaw()" -#~ msgstr "erreur interne -- ni th ni fh ne sont précisés dans _tarReadRaw()" +#~ msgid "saving default_toast_compression = %s" +#~ msgstr "sauvegarde de default_toast_compression = %s" -#~ msgid "connection needs password" -#~ msgstr "la connexion nécessite un mot de passe" +#~ msgid "saving large object properties\n" +#~ msgstr "sauvegarde des propriétés des « Large Objects »\n" -#~ msgid "could not reconnect to database: %s" -#~ msgstr "n'a pas pu se reconnecter à la base de données : %s" +#~ msgid "schema with OID %u does not exist\n" +#~ msgstr "le schéma d'OID %u n'existe pas\n" -#~ msgid "could not reconnect to database" -#~ msgstr "n'a pas pu se reconnecter à la base de données" +#~ msgid "select() failed: %m" +#~ msgstr "échec de select() : %m" -#~ msgid "connecting to database \"%s\" as user \"%s\"" -#~ msgstr "connexion à la base de données « %s » en tant qu'utilisateur « %s »" +#~ msgid "select() failed: %s\n" +#~ msgstr "échec de select() : %s\n" -#~ msgid "could not connect to database \"%s\": %s" -#~ msgstr "n'a pas pu se connecter à la base de données « %s » : %s" +#~ msgid "server version must be at least 7.3 to use schema selection switches\n" +#~ msgstr "" +#~ "le serveur doit être de version 7.3 ou supérieure pour utiliser les options\n" +#~ "de sélection du schéma\n" -#~ msgid "aggregate function %s could not be dumped correctly for this database version; ignored" -#~ msgstr "la fonction d'aggrégat %s n'a pas pu être sauvegardée correctement avec cette version de la base de données ; ignorée" +#~ msgid "setting owner and privileges for %s \"%s\"\n" +#~ msgstr "réglage du propriétaire et des droits pour %s « %s »\n" -#~ msgid "reading publication membership for table \"%s.%s\"" -#~ msgstr "lecture des appartenances aux publications pour la table « %s.%s »" +#~ msgid "setting owner and privileges for %s \"%s.%s\"\n" +#~ msgstr "réglage du propriétaire et des droits pour %s « %s.%s»\n" -#~ msgid "LOCK TABLE failed for \"%s\": %s" -#~ msgstr "LOCK TABLE échoué pour la table « %s » : %s" +#~ msgid "skipping tar member %s\n" +#~ msgstr "omission du membre %s du tar\n" -#~ msgid "connection to database \"%s\" failed: %s" -#~ msgstr "la connexion à la base de données « %s » a échoué : %s" +#~ msgid "sorter" +#~ msgstr "tri" -#~ msgid "reconnection to database \"%s\" failed: %s" -#~ msgstr "reconnexion à la base de données « %s » échouée : %s" +#~ msgid "tar archiver" +#~ msgstr "archiveur tar" -#~ msgid "could not write to large object (result: %lu, expected: %lu)" -#~ msgstr "n'a pas pu écrire le « Large Object » (résultat : %lu, attendu : %lu)" +#~ msgid "terminated by user\n" +#~ msgstr "terminé par l'utilisateur\n" -#~ msgid "mismatched number of collation names and versions for index" -#~ msgstr "nombre différent de noms et versions de collation pour l'index" +#~ msgid "transferring dependency %d -> %d to %d\n" +#~ msgstr "transfert de la dépendance %d -> %d vers %d\n" -#~ msgid "could not parse index collation version array" -#~ msgstr "n'a pas pu analyser le tableau des versions de collation de l'index" +#~ msgid "unexpected end of file\n" +#~ msgstr "fin de fichier inattendu\n" -#~ msgid "could not parse index collation name array" -#~ msgstr "n'a pas pu analyser le tableau des noms de collation de l'index" +#~ msgid "unrecognized collation provider: %s\n" +#~ msgstr "fournisseur de collationnement non reconnu : %s\n" -#~ msgid "saving default_toast_compression = %s" -#~ msgstr "sauvegarde de default_toast_compression = %s" +#~ msgid "unrecognized command on communication channel: %s\n" +#~ msgstr "commande inconnue sur le canal de communucation: %s\n" -#~ msgid "option --index-collation-versions-unknown only works in binary upgrade mode" -#~ msgstr "l'option --index-collation-versions-unknown fonctionne seulement dans le mode de mise à jour binaire" +#~ msgid "worker is terminating\n" +#~ msgstr "le worker est en cours d'arrêt\n" -#~ msgid "invalid TOASTCOMPRESSION item: %s" -#~ msgstr "élément TOASTCOMPRESSION invalide : %s" +#~ msgid "worker process crashed: status %d\n" +#~ msgstr "crash du processus worker : statut %d\n" diff --git a/src/bin/pg_dump/po/ja.po b/src/bin/pg_dump/po/ja.po index 721a148704..6a824d4f94 100644 --- a/src/bin/pg_dump/po/ja.po +++ b/src/bin/pg_dump/po/ja.po @@ -1,74 +1,83 @@ -# Japanese message translation file for pg_dump -# Copyright (C) 2019 PostgreSQL Global Development Group -# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. -# Shigehiro Honda , 2005 +# pg_dump.po +# Japanese message translation file for pg_dump +# +# Copyright (C) 2011-2022 PostgreSQL Global Development Group +# +# Shigehiro Honda , 2005. +# +# This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: pg_dump (PostgreSQL 13)\n" +"Project-Id-Version: pg_dump (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:55+0900\n" -"PO-Revision-Date: 2020-09-13 08:56+0200\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" +"PO-Revision-Date: 2022-05-10 14:25+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" +"Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:241 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " - -#: ../../../src/common/logging.c:248 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:255 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "警告: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "ヒント: " + +#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "カレントディレクトリを識別できませんでした: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "不正なバイナリ\"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "バイナリ\"%s\"を読み取れませんでした" -#: ../../common/exec.c:214 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "実行する\"%s\"がありませんでした" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:282 ../../common/exec.c:321 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "ディレクトリ\"%s\"に移動できませんでした: %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:299 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を読めませんでした: %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:422 parallel.c:1611 #, c-format -msgid "pclose failed: %m" -msgstr "pcloseが失敗しました: %m" +msgid "%s() failed: %m" +msgstr "%s() が失敗しました: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 msgid "out of memory" msgstr "メモリ不足です" @@ -113,212 +122,232 @@ msgstr "子プロセスはシグナル%dにより終了しました: %s" msgid "child process exited with unrecognized status %d" msgstr "子プロセスが未知のステータス%dで終了しました" -#: common.c:121 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "オプション\"%2$s\"に対する不正な値\"%1$s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%sは%d..%dの範囲でなければなりません" + +#: common.c:134 #, c-format msgid "reading extensions" msgstr "機能拡張を読み込んでいます" -#: common.c:125 +#: common.c:137 #, c-format msgid "identifying extension members" msgstr "機能拡張の構成要素を特定しています" -#: common.c:128 +#: common.c:140 #, c-format msgid "reading schemas" msgstr "スキーマを読み込んでいます" -#: common.c:138 +#: common.c:149 #, c-format msgid "reading user-defined tables" msgstr "ユーザ定義テーブルを読み込んでいます" -#: common.c:145 +#: common.c:154 #, c-format msgid "reading user-defined functions" msgstr "ユーザ定義関数を読み込んでいます" -#: common.c:150 +#: common.c:158 #, c-format msgid "reading user-defined types" msgstr "ユーザ定義型を読み込んでいます" -#: common.c:155 +#: common.c:162 #, c-format msgid "reading procedural languages" msgstr "手続き言語を読み込んでいます" -#: common.c:158 +#: common.c:165 #, c-format msgid "reading user-defined aggregate functions" msgstr "ユーザ定義集約関数を読み込んでいます" -#: common.c:161 +#: common.c:168 #, c-format msgid "reading user-defined operators" msgstr "ユーザ定義演算子を読み込んでいます" -#: common.c:165 +#: common.c:171 #, c-format msgid "reading user-defined access methods" msgstr "ユーザ定義アクセスメソッドを読み込んでいます" -#: common.c:168 +#: common.c:174 #, c-format msgid "reading user-defined operator classes" msgstr "ユーザ定義演算子クラスを読み込んでいます" -#: common.c:171 +#: common.c:177 #, c-format msgid "reading user-defined operator families" msgstr "ユーザ定義演算子族を読み込んでいます" -#: common.c:174 +#: common.c:180 #, c-format msgid "reading user-defined text search parsers" msgstr "ユーザ定義のテキスト検索パーサを読み込んでいます" -#: common.c:177 +#: common.c:183 #, c-format msgid "reading user-defined text search templates" msgstr "ユーザ定義のテキスト検索テンプレートを読み込んでいます" -#: common.c:180 +#: common.c:186 #, c-format msgid "reading user-defined text search dictionaries" msgstr "ユーザ定義のテキスト検索辞書を読み込んでいます" -#: common.c:183 +#: common.c:189 #, c-format msgid "reading user-defined text search configurations" msgstr "ユーザ定義のテキスト検索設定を読み込んでいます" -#: common.c:186 +#: common.c:192 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "ユーザ定義の外部データラッパーを読み込んでいます" -#: common.c:189 +#: common.c:195 #, c-format msgid "reading user-defined foreign servers" msgstr "ユーザ定義の外部サーバーを読み込んでいます" -#: common.c:192 +#: common.c:198 #, c-format msgid "reading default privileges" msgstr "デフォルト権限設定を読み込んでいます" -#: common.c:195 +#: common.c:201 #, c-format msgid "reading user-defined collations" msgstr "ユーザ定義の照合順序を読み込んでいます" -#: common.c:199 +#: common.c:204 #, c-format msgid "reading user-defined conversions" msgstr "ユーザ定義の変換を読み込んでいます" -#: common.c:202 +#: common.c:207 #, c-format msgid "reading type casts" msgstr "型キャストを読み込んでいます" -#: common.c:205 +#: common.c:210 #, c-format msgid "reading transforms" msgstr "変換を読み込んでいます" -#: common.c:208 +#: common.c:213 #, c-format msgid "reading table inheritance information" msgstr "テーブル継承情報を読み込んでいます" -#: common.c:211 +#: common.c:216 #, c-format msgid "reading event triggers" msgstr "イベントトリガを読み込んでいます" -#: common.c:215 +#: common.c:220 #, c-format msgid "finding extension tables" msgstr "機能拡張構成テーブルを探しています" -#: common.c:219 +#: common.c:224 #, c-format msgid "finding inheritance relationships" msgstr "継承関係を検索しています" -#: common.c:222 +#: common.c:227 #, c-format msgid "reading column info for interesting tables" msgstr "対象テーブルの列情報を読み込んでいます" -#: common.c:225 +#: common.c:230 #, c-format msgid "flagging inherited columns in subtables" msgstr "子テーブルの継承列にフラグを設定しています" -#: common.c:228 +#: common.c:233 #, c-format msgid "reading indexes" msgstr "インデックスを読み込んでいます" -#: common.c:231 +#: common.c:236 #, c-format msgid "flagging indexes in partitioned tables" msgstr "パーティション親テーブルのインデックスにフラグを設定しています" -#: common.c:234 +#: common.c:239 #, c-format msgid "reading extended statistics" msgstr "拡張統計情報を読み込んでいます" -#: common.c:237 +#: common.c:242 #, c-format msgid "reading constraints" msgstr "制約を読み込んでいます" -#: common.c:240 +#: common.c:245 #, c-format msgid "reading triggers" msgstr "トリガを読み込んでいます" -#: common.c:243 +#: common.c:248 #, c-format msgid "reading rewrite rules" msgstr "書き換えルールを読み込んでいます" -#: common.c:246 +#: common.c:251 #, c-format msgid "reading policies" msgstr "ポリシを読み込んでいます" -#: common.c:249 +#: common.c:254 #, c-format msgid "reading publications" msgstr "パブリケーションを読み込んでいます" -#: common.c:252 +#: common.c:257 #, c-format -msgid "reading publication membership" -msgstr "パブリケーションの構成要素を読み込んでいます" +msgid "reading publication membership of tables" +msgstr "テーブルのパブリケーションへの所属を読み取っています" -#: common.c:255 +#: common.c:260 +#, c-format +msgid "reading publication membership of schemas" +msgstr "スキーマのパブリケーションへの所属を読み取っています" + +#: common.c:263 #, c-format msgid "reading subscriptions" msgstr "サブスクリプションを読み込んでいます" -#: common.c:1025 +#: common.c:343 +#, c-format +msgid "invalid number of parents %d for table \"%s\"" +msgstr "テーブル\"%2$s\"用の親テーブルの数%1$dが不正です" + +#: common.c:1004 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "健全性検査に失敗しました、テーブル\"%2$s\"(OID %3$u)の親のOID %1$uがありません" -#: common.c:1067 +#: common.c:1043 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "数値配列\"%s\"のパースに失敗しました: 要素が多すぎます" -#: common.c:1082 +#: common.c:1055 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "数値配列\"%s\"のパースに失敗しました: 数値に不正な文字が含まれています" @@ -359,43 +388,43 @@ msgstr "データを伸長できませんでした: %s" msgid "could not close compression library: %s" msgstr "圧縮ライブラリをクローズできませんでした: %s" -#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:557 pg_backup_tar.c:560 +#: compress_io.c:584 compress_io.c:621 #, c-format msgid "could not read from input file: %s" msgstr "入力ファイルから読み込めませんでした: %s" -#: compress_io.c:623 pg_backup_custom.c:644 pg_backup_directory.c:552 -#: pg_backup_tar.c:793 pg_backup_tar.c:816 +#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553 +#: pg_backup_tar.c:726 pg_backup_tar.c:749 #, c-format msgid "could not read from input file: end of file" msgstr "入力ファイルから読み込めませんでした: ファイルの終端" -#: parallel.c:267 +#: parallel.c:253 #, c-format -msgid "WSAStartup failed: %d" -msgstr "WSAStartupが失敗しました: %d" +msgid "%s() failed: error code %d" +msgstr "%s()が失敗しました: エラーコード %d" -#: parallel.c:978 +#: parallel.c:961 #, c-format msgid "could not create communication channels: %m" msgstr "通信チャンネルを作成できませんでした: %m" -#: parallel.c:1035 +#: parallel.c:1018 #, c-format msgid "could not create worker process: %m" msgstr "ワーカプロセスを作成できませんでした: %m" -#: parallel.c:1165 +#: parallel.c:1148 #, c-format msgid "unrecognized command received from leader: \"%s\"" msgstr "リーダーから認識不能のコマンドを受信しました: \"%s\"" -#: parallel.c:1208 parallel.c:1446 +#: parallel.c:1191 parallel.c:1429 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "ワーカから不正なメッセージを受信しました: \"%s\"" -#: parallel.c:1340 +#: parallel.c:1323 #, c-format msgid "" "could not obtain lock on relation \"%s\"\n" @@ -404,480 +433,473 @@ msgstr "" "リレーション\"%s\"のロックを獲得できませんでした。\n" "通常これは、pg_dumpの親プロセスが初期のACCESS SHAREロックを獲得した後にだれかがテーブルに対してACCESS EXCLUSIVEロックを要求したことを意味しています。" -#: parallel.c:1429 +#: parallel.c:1412 #, c-format msgid "a worker process died unexpectedly" msgstr "ワーカプロセスが突然終了しました" -#: parallel.c:1551 parallel.c:1669 +#: parallel.c:1534 parallel.c:1652 #, c-format msgid "could not write to the communication channel: %m" msgstr "通信チャンネルに書き込めませんでした: %m" -#: parallel.c:1628 -#, c-format -msgid "select() failed: %m" -msgstr "select()が失敗しました: %m" - -#: parallel.c:1753 +#: parallel.c:1736 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: ソケットを作成できませんでした: エラーコード %d" -#: parallel.c:1764 +#: parallel.c:1747 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: バインドできませんでした: エラーコード %d" -#: parallel.c:1771 +#: parallel.c:1754 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: リッスンできませんでした: エラーコード %d" -#: parallel.c:1778 +#: parallel.c:1761 #, c-format -msgid "pgpipe: getsockname() failed: error code %d" -msgstr "pgpipe: getsockname()が失敗しました: エラーコード %d" +msgid "pgpipe: %s() failed: error code %d" +msgstr "pgpipe: %s()が失敗しました: エラーコード %d" -#: parallel.c:1789 +#: parallel.c:1772 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: 第二ソケットを作成できませんでした: エラーコード %d" -#: parallel.c:1798 +#: parallel.c:1781 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: ソケットを接続できませんでした: エラーコード %d" -#: parallel.c:1807 +#: parallel.c:1790 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: 接続を受け付けられませんでした: エラーコード %d" -#: pg_backup_archiver.c:271 pg_backup_archiver.c:1591 +#: pg_backup_archiver.c:279 pg_backup_archiver.c:1576 #, c-format msgid "could not close output file: %m" msgstr "出力ファイルをクローズできませんでした: %m" -#: pg_backup_archiver.c:315 pg_backup_archiver.c:319 +#: pg_backup_archiver.c:323 pg_backup_archiver.c:327 #, c-format msgid "archive items not in correct section order" msgstr "アーカイブ項目が正しいセクション順ではありません" -#: pg_backup_archiver.c:325 +#: pg_backup_archiver.c:333 #, c-format msgid "unexpected section code %d" msgstr "想定外のセクションコード %d" -#: pg_backup_archiver.c:362 +#: pg_backup_archiver.c:370 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "このアーカイブファイル形式での並列リストアはサポートしていません" -#: pg_backup_archiver.c:366 +#: pg_backup_archiver.c:374 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "8.0 より古い pg_dump で作られたアーカイブでの並列リストアはサポートしていません" -#: pg_backup_archiver.c:384 +#: pg_backup_archiver.c:392 #, c-format msgid "cannot restore from compressed archive (compression not supported in this installation)" msgstr "圧縮アーカイブからのリストアができません(このインストールは圧縮をサポートしていません)" -#: pg_backup_archiver.c:401 +#: pg_backup_archiver.c:409 #, c-format msgid "connecting to database for restore" msgstr "リストアのためデータベースに接続しています" -#: pg_backup_archiver.c:403 +#: pg_backup_archiver.c:411 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "1.3より古いアーカイブではデータベースへの直接接続はサポートされていません" -#: pg_backup_archiver.c:448 +#: pg_backup_archiver.c:454 #, c-format msgid "implied data-only restore" msgstr "暗黙的にデータのみのリストアを行います" -#: pg_backup_archiver.c:514 +#: pg_backup_archiver.c:520 #, c-format msgid "dropping %s %s" msgstr "%s %sを削除しています" -#: pg_backup_archiver.c:609 +#: pg_backup_archiver.c:615 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "文\"%s\"中に IF EXISTS を挿入すべき場所が見つかりませでした" -#: pg_backup_archiver.c:765 pg_backup_archiver.c:767 +#: pg_backup_archiver.c:771 pg_backup_archiver.c:773 #, c-format msgid "warning from original dump file: %s" msgstr "オリジナルのダンプファイルからの警告: %s" -#: pg_backup_archiver.c:782 +#: pg_backup_archiver.c:788 #, c-format msgid "creating %s \"%s.%s\"" msgstr "%s \"%s.%s\"を作成しています" -#: pg_backup_archiver.c:785 +#: pg_backup_archiver.c:791 #, c-format msgid "creating %s \"%s\"" msgstr "%s \"%s\"を作成しています" -#: pg_backup_archiver.c:842 +#: pg_backup_archiver.c:841 #, c-format msgid "connecting to new database \"%s\"" msgstr "新しいデータベース\"%s\"に接続しています" -#: pg_backup_archiver.c:870 +#: pg_backup_archiver.c:868 #, c-format msgid "processing %s" msgstr "%sを処理しています" -#: pg_backup_archiver.c:890 +#: pg_backup_archiver.c:888 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "テーブル\"%s.%s\"のデータを処理しています" -#: pg_backup_archiver.c:952 +#: pg_backup_archiver.c:947 #, c-format msgid "executing %s %s" msgstr "%s %sを実行しています" -#: pg_backup_archiver.c:991 +#: pg_backup_archiver.c:986 #, c-format msgid "disabling triggers for %s" msgstr "%sのトリガを無効にしています" -#: pg_backup_archiver.c:1017 +#: pg_backup_archiver.c:1012 #, c-format msgid "enabling triggers for %s" msgstr "%sのトリガを有効にしています" -#: pg_backup_archiver.c:1045 +#: pg_backup_archiver.c:1040 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "内部エラー -- WriteDataはDataDumperルーチンのコンテクスト外では呼び出せません" -#: pg_backup_archiver.c:1228 +#: pg_backup_archiver.c:1223 #, c-format msgid "large-object output not supported in chosen format" msgstr "選択した形式ではラージオブジェクト出力をサポートしていません" -#: pg_backup_archiver.c:1286 +#: pg_backup_archiver.c:1281 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "%d個のラージオブジェクトをリストアしました" -msgstr[1] "%d個のラージオブジェクトをリストアしました" -#: pg_backup_archiver.c:1307 pg_backup_tar.c:736 +#: pg_backup_archiver.c:1302 pg_backup_tar.c:669 #, c-format msgid "restoring large object with OID %u" msgstr "OID %uのラージオブジェクトをリストアしています" -#: pg_backup_archiver.c:1319 +#: pg_backup_archiver.c:1314 #, c-format msgid "could not create large object %u: %s" msgstr "ラージオブジェクト %u を作成できませんでした: %s" -#: pg_backup_archiver.c:1324 pg_dump.c:3542 +#: pg_backup_archiver.c:1319 pg_dump.c:3538 #, c-format msgid "could not open large object %u: %s" msgstr "ラージオブジェクト %u をオープンできませんでした: %s" -#: pg_backup_archiver.c:1381 +#: pg_backup_archiver.c:1375 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "TOCファイル\"%s\"をオープンできませんでした: %m" -#: pg_backup_archiver.c:1421 +#: pg_backup_archiver.c:1403 #, c-format msgid "line ignored: %s" msgstr "行を無視しました: %s" -#: pg_backup_archiver.c:1428 +#: pg_backup_archiver.c:1410 #, c-format msgid "could not find entry for ID %d" msgstr "ID %dのエントリがありませんでした" -#: pg_backup_archiver.c:1449 pg_backup_directory.c:222 -#: pg_backup_directory.c:598 +#: pg_backup_archiver.c:1433 pg_backup_directory.c:222 +#: pg_backup_directory.c:599 #, c-format msgid "could not close TOC file: %m" msgstr "TOCファイルをクローズできませんでした: %m" -#: pg_backup_archiver.c:1563 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:585 pg_backup_directory.c:648 -#: pg_backup_directory.c:667 pg_dumpall.c:484 +#: pg_backup_archiver.c:1547 pg_backup_custom.c:156 pg_backup_directory.c:332 +#: pg_backup_directory.c:586 pg_backup_directory.c:649 +#: pg_backup_directory.c:668 pg_dumpall.c:476 #, c-format msgid "could not open output file \"%s\": %m" msgstr "出力ファイル\"%s\"をオープンできませんでした: %m" -#: pg_backup_archiver.c:1565 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1549 pg_backup_custom.c:162 #, c-format msgid "could not open output file: %m" msgstr "出力ファイルをオープンできませんでした: %m" -#: pg_backup_archiver.c:1658 +#: pg_backup_archiver.c:1643 #, c-format -msgid "wrote %lu byte of large object data (result = %lu)" -msgid_plural "wrote %lu bytes of large object data (result = %lu)" -msgstr[0] "ラージオブジェクトデータを%luバイト書き出しました(結果は%lu)" -msgstr[1] "ラージオブジェクトデータを%luバイト書き出しました(結果は%lu)" +msgid "wrote %zu byte of large object data (result = %d)" +msgid_plural "wrote %zu bytes of large object data (result = %d)" +msgstr[0] "ラージオブジェクトデータを%zuバイト書き出しました(結果は%d)" -#: pg_backup_archiver.c:1663 +#: pg_backup_archiver.c:1649 #, c-format -msgid "could not write to large object (result: %lu, expected: %lu)" -msgstr "ラージオブジェクトを書き出すことができませんでした(結果は%lu、想定は%lu)" +msgid "could not write to large object: %s" +msgstr "ラージオブジェクトに書き込めませんでした: %s" -#: pg_backup_archiver.c:1753 +#: pg_backup_archiver.c:1739 #, c-format msgid "while INITIALIZING:" msgstr "初期化中:" -#: pg_backup_archiver.c:1758 +#: pg_backup_archiver.c:1744 #, c-format msgid "while PROCESSING TOC:" msgstr "TOC処理中:" -#: pg_backup_archiver.c:1763 +#: pg_backup_archiver.c:1749 #, c-format msgid "while FINALIZING:" msgstr "終了処理中:" -#: pg_backup_archiver.c:1768 +#: pg_backup_archiver.c:1754 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "TOCエントリ%d; %u %u %s %s %s から" -#: pg_backup_archiver.c:1844 +#: pg_backup_archiver.c:1830 #, c-format msgid "bad dumpId" msgstr "不正なdumpId" -#: pg_backup_archiver.c:1865 +#: pg_backup_archiver.c:1851 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "TABLE DATA項目に対する不正なテーブルdumpId" -#: pg_backup_archiver.c:1957 +#: pg_backup_archiver.c:1943 #, c-format msgid "unexpected data offset flag %d" msgstr "想定外のデータオフセットフラグ %d" -#: pg_backup_archiver.c:1970 +#: pg_backup_archiver.c:1956 #, c-format msgid "file offset in dump file is too large" msgstr "ダンプファイルのファイルオフセットが大きすぎます" -#: pg_backup_archiver.c:2107 pg_backup_archiver.c:2117 +#: pg_backup_archiver.c:2094 pg_backup_archiver.c:2104 #, c-format msgid "directory name too long: \"%s\"" msgstr "ディレクトリ名が長すぎます: \"%s\"" -#: pg_backup_archiver.c:2125 +#: pg_backup_archiver.c:2112 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "ディレクトリ\"%s\"は有効なアーカイブではないようです(\"toc.dat\"がありません)" -#: pg_backup_archiver.c:2133 pg_backup_custom.c:173 pg_backup_custom.c:810 -#: pg_backup_directory.c:207 pg_backup_directory.c:394 +#: pg_backup_archiver.c:2120 pg_backup_custom.c:173 pg_backup_custom.c:807 +#: pg_backup_directory.c:207 pg_backup_directory.c:395 #, c-format msgid "could not open input file \"%s\": %m" msgstr "入力ファイル\"%s\"をオープンできませんでした: %m" -#: pg_backup_archiver.c:2140 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2127 pg_backup_custom.c:179 #, c-format msgid "could not open input file: %m" msgstr "入力ファイルをオープンできませんでした: %m" -#: pg_backup_archiver.c:2146 +#: pg_backup_archiver.c:2133 #, c-format msgid "could not read input file: %m" msgstr "入力ファイルを読み込めませんでした: %m" -#: pg_backup_archiver.c:2148 +#: pg_backup_archiver.c:2135 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "入力ファイルが小さすぎます(読み取り%lu、想定は 5)" -#: pg_backup_archiver.c:2233 +#: pg_backup_archiver.c:2167 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "入力ファイルがテキスト形式のダンプのようです。psqlを使用してください。" -#: pg_backup_archiver.c:2239 +#: pg_backup_archiver.c:2173 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "入力ファイルが有効なアーカイブではないようです(小さすぎる?)" -#: pg_backup_archiver.c:2245 +#: pg_backup_archiver.c:2179 #, c-format msgid "input file does not appear to be a valid archive" msgstr "入力ファイルが有効なアーカイブではないようです" -#: pg_backup_archiver.c:2265 +#: pg_backup_archiver.c:2188 #, c-format msgid "could not close input file: %m" msgstr "入力ファイルをクローズできませんでした: %m" -#: pg_backup_archiver.c:2379 +#: pg_backup_archiver.c:2305 #, c-format msgid "unrecognized file format \"%d\"" msgstr "認識不能のファイル形式\"%d\"" -#: pg_backup_archiver.c:2461 pg_backup_archiver.c:4473 +#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4445 #, c-format msgid "finished item %d %s %s" msgstr "項目 %d %s %s の処理が完了" -#: pg_backup_archiver.c:2465 pg_backup_archiver.c:4486 +#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4458 #, c-format msgid "worker process failed: exit code %d" msgstr "ワーカープロセスの処理失敗: 終了コード %d" -#: pg_backup_archiver.c:2585 +#: pg_backup_archiver.c:2512 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "エントリID%dは範囲外です -- おそらくTOCの破損です" -#: pg_backup_archiver.c:2652 +#: pg_backup_archiver.c:2592 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "WITH OIDSと定義されたテーブルのリストアは今後サポートされません" -#: pg_backup_archiver.c:2734 +#: pg_backup_archiver.c:2674 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "認識不能のエンコーディング\"%s\"" -#: pg_backup_archiver.c:2739 +#: pg_backup_archiver.c:2679 #, c-format msgid "invalid ENCODING item: %s" msgstr "不正なENCODING項目: %s" -#: pg_backup_archiver.c:2757 +#: pg_backup_archiver.c:2697 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "不正なSTDSTRINGS項目: %s" -#: pg_backup_archiver.c:2782 +#: pg_backup_archiver.c:2722 #, c-format msgid "schema \"%s\" not found" msgstr "スキーマ \"%s\"が見つかりません" -#: pg_backup_archiver.c:2789 +#: pg_backup_archiver.c:2729 #, c-format msgid "table \"%s\" not found" msgstr "テーブル\"%s\"が見つかりません" -#: pg_backup_archiver.c:2796 +#: pg_backup_archiver.c:2736 #, c-format msgid "index \"%s\" not found" msgstr "インデックス\"%s\"が見つかりません" -#: pg_backup_archiver.c:2803 +#: pg_backup_archiver.c:2743 #, c-format msgid "function \"%s\" not found" msgstr "関数\"%s\"が見つかりません" -#: pg_backup_archiver.c:2810 +#: pg_backup_archiver.c:2750 #, c-format msgid "trigger \"%s\" not found" msgstr "トリガ\"%s\"が見つかりません" -#: pg_backup_archiver.c:3202 +#: pg_backup_archiver.c:3143 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "セッションユーザを\"%s\"に設定できませんでした: %s" -#: pg_backup_archiver.c:3341 +#: pg_backup_archiver.c:3280 #, c-format msgid "could not set search_path to \"%s\": %s" msgstr "search_pathを\"%s\"に設定できませんでした: %s" -#: pg_backup_archiver.c:3403 +#: pg_backup_archiver.c:3342 #, c-format msgid "could not set default_tablespace to %s: %s" msgstr "default_tablespaceを\"%s\"に設定できませんでした: %s" -#: pg_backup_archiver.c:3448 +#: pg_backup_archiver.c:3392 #, c-format msgid "could not set default_table_access_method: %s" msgstr "default_table_access_methodを設定できませんでした: %s" -#: pg_backup_archiver.c:3540 pg_backup_archiver.c:3698 +#: pg_backup_archiver.c:3486 pg_backup_archiver.c:3651 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "オブジェクトタイプ%sに対する所有者の設定方法がわかりません" -#: pg_backup_archiver.c:3802 +#: pg_backup_archiver.c:3754 #, c-format msgid "did not find magic string in file header" msgstr "ファイルヘッダにマジック文字列がありませんでした" -#: pg_backup_archiver.c:3815 +#: pg_backup_archiver.c:3768 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "ファイルヘッダ内のバージョン(%d.%d)はサポートされていません" -#: pg_backup_archiver.c:3820 +#: pg_backup_archiver.c:3773 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "整数のサイズ(%lu)に関する健全性検査が失敗しました" -#: pg_backup_archiver.c:3824 +#: pg_backup_archiver.c:3777 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "アーカイブはより大きなサイズの整数を持つマシンで作成されました、一部の操作が失敗する可能性があります" -#: pg_backup_archiver.c:3834 +#: pg_backup_archiver.c:3787 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "想定した形式(%d)はファイル内にある形式(%d)と異なります" -#: pg_backup_archiver.c:3850 +#: pg_backup_archiver.c:3802 #, c-format msgid "archive is compressed, but this installation does not support compression -- no data will be available" msgstr "アーカイブは圧縮されていますが、このインストールでは圧縮をサポートしていません -- 利用できるデータはありません" -#: pg_backup_archiver.c:3868 +#: pg_backup_archiver.c:3836 #, c-format msgid "invalid creation date in header" msgstr "ヘッダ内の作成日付が不正です" -#: pg_backup_archiver.c:3996 +#: pg_backup_archiver.c:3970 #, c-format msgid "processing item %d %s %s" msgstr "項目 %d %s %s を処理しています" -#: pg_backup_archiver.c:4075 +#: pg_backup_archiver.c:4049 #, c-format msgid "entering main parallel loop" msgstr "メインの並列ループに入ります" -#: pg_backup_archiver.c:4086 +#: pg_backup_archiver.c:4060 #, c-format msgid "skipping item %d %s %s" msgstr "項目 %d %s %s をスキップしています" -#: pg_backup_archiver.c:4095 +#: pg_backup_archiver.c:4069 #, c-format msgid "launching item %d %s %s" msgstr "項目 %d %s %s に着手します" -#: pg_backup_archiver.c:4149 +#: pg_backup_archiver.c:4123 #, c-format msgid "finished main parallel loop" msgstr "メインの並列ループが終了しました" -#: pg_backup_archiver.c:4187 +#: pg_backup_archiver.c:4159 #, c-format msgid "processing missed item %d %s %s" msgstr "やり残し項目 %d %s %s を処理しています" -#: pg_backup_archiver.c:4792 +#: pg_backup_archiver.c:4764 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "テーブル\"%s\"を作成できませんでした、このテーブルのデータは復元されません" @@ -887,8 +909,8 @@ msgstr "テーブル\"%s\"を作成できませんでした、このテーブル msgid "invalid OID for large object" msgstr "ラージオブジェクトのOIDが不正です" -#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:630 -#: pg_backup_custom.c:868 pg_backup_tar.c:1086 pg_backup_tar.c:1091 +#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629 +#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021 #, c-format msgid "error during file seek: %m" msgstr "ファイルシーク中にエラーがありました: %m" @@ -923,43 +945,43 @@ msgstr "データ読み込み時に想定外のブロックID(%d)がありまし msgid "unrecognized data block type %d while restoring archive" msgstr "アーカイブのりストア中に認識不可のデータブロックタイプ%dがありました" -#: pg_backup_custom.c:646 +#: pg_backup_custom.c:645 #, c-format msgid "could not read from input file: %m" msgstr "入力ファイルから読み込めませんでした: %m" -#: pg_backup_custom.c:749 pg_backup_custom.c:801 pg_backup_custom.c:946 -#: pg_backup_tar.c:1089 +#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943 +#: pg_backup_tar.c:1019 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "アーカイブファイルのシーク位置を決定できませんでした: %m" -#: pg_backup_custom.c:765 pg_backup_custom.c:805 +#: pg_backup_custom.c:762 pg_backup_custom.c:802 #, c-format msgid "could not close archive file: %m" msgstr "アーカイブファイルをクローズできませんでした: %m" -#: pg_backup_custom.c:788 +#: pg_backup_custom.c:785 #, c-format msgid "can only reopen input archives" msgstr "入力アーカイブだけが再オープン可能です" -#: pg_backup_custom.c:795 +#: pg_backup_custom.c:792 #, c-format msgid "parallel restore from standard input is not supported" msgstr "標準入力からの並列リストアはサポートされていません" -#: pg_backup_custom.c:797 +#: pg_backup_custom.c:794 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "シーク不可のファイルからの並列リストアはサポートされていません" -#: pg_backup_custom.c:813 +#: pg_backup_custom.c:810 #, c-format msgid "could not set seek position in archive file: %m" msgstr "アーカイブファイルのシークができませんでした: %m" -#: pg_backup_custom.c:892 +#: pg_backup_custom.c:889 #, c-format msgid "compressor active" msgstr "圧縮処理が有効です" @@ -969,112 +991,90 @@ msgstr "圧縮処理が有効です" msgid "could not get server_version from libpq" msgstr "libpqからserver_versionを取得できませんでした" -#: pg_backup_db.c:53 pg_dumpall.c:1826 -#, c-format -msgid "server version: %s; %s version: %s" -msgstr "サーババージョン: %s、%s バージョン: %s" - -#: pg_backup_db.c:55 pg_dumpall.c:1828 +#: pg_backup_db.c:53 pg_dumpall.c:1646 #, c-format msgid "aborting because of server version mismatch" msgstr "サーババージョンの不一致のため処理を中断します" -#: pg_backup_db.c:138 -#, c-format -msgid "connecting to database \"%s\" as user \"%s\"" -msgstr "データベース\"%s\"にユーザ\"%s\"で接続しています" - -#: pg_backup_db.c:145 pg_backup_db.c:194 pg_backup_db.c:255 pg_backup_db.c:296 -#: pg_dumpall.c:1651 pg_dumpall.c:1764 -msgid "Password: " -msgstr "パスワード: " - -#: pg_backup_db.c:177 +#: pg_backup_db.c:54 pg_dumpall.c:1647 #, c-format -msgid "could not reconnect to database" -msgstr "データベースへの再接続ができませんでした" - -#: pg_backup_db.c:182 -#, c-format -msgid "could not reconnect to database: %s" -msgstr "データベース%sへの再接続ができませんでした" - -#: pg_backup_db.c:198 -#, c-format -msgid "connection needs password" -msgstr "接続にパスワードが必要です" +msgid "server version: %s; %s version: %s" +msgstr "サーババージョン: %s、%s バージョン: %s" -#: pg_backup_db.c:249 +#: pg_backup_db.c:120 #, c-format msgid "already connected to a database" msgstr "データベースはすでに接続済みです" -#: pg_backup_db.c:288 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595 +msgid "Password: " +msgstr "パスワード: " + +#: pg_backup_db.c:170 #, c-format msgid "could not connect to database" msgstr "データベースへの接続ができませんでした" -#: pg_backup_db.c:304 +#: pg_backup_db.c:187 #, c-format -msgid "connection to database \"%s\" failed: %s" -msgstr "データベース\"%s\"への接続が失敗しました: %s" +msgid "reconnection failed: %s" +msgstr "再接続に失敗しました: %s" -#: pg_backup_db.c:376 pg_dumpall.c:1684 +#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dumpall.c:1520 pg_dumpall.c:1604 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:383 pg_dumpall.c:1889 pg_dumpall.c:1912 +#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732 #, c-format msgid "query failed: %s" msgstr "問い合わせが失敗しました: %s" -#: pg_backup_db.c:385 pg_dumpall.c:1890 pg_dumpall.c:1913 +#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733 #, c-format -msgid "query was: %s" +msgid "Query was: %s" msgstr "問い合わせ: %s" -#: pg_backup_db.c:426 +#: pg_backup_db.c:316 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" msgstr[0] "問い合わせが1行ではなく%d行返しました: %s" -msgstr[1] "問い合わせが1行ではなく%d行返しました: %s" -#: pg_backup_db.c:462 +#: pg_backup_db.c:352 #, c-format msgid "%s: %sCommand was: %s" msgstr "%s: %sコマンド: %s" -#: pg_backup_db.c:518 pg_backup_db.c:592 pg_backup_db.c:599 +#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489 msgid "could not execute query" msgstr "問い合わせを実行できませんでした" -#: pg_backup_db.c:571 +#: pg_backup_db.c:461 #, c-format msgid "error returned by PQputCopyData: %s" msgstr "PQputCopyData からエラーが返されました: %s" -#: pg_backup_db.c:620 +#: pg_backup_db.c:510 #, c-format msgid "error returned by PQputCopyEnd: %s" msgstr "PQputCopyEnd からエラーが返されました: %s" -#: pg_backup_db.c:626 +#: pg_backup_db.c:516 #, c-format msgid "COPY failed for table \"%s\": %s" msgstr "テーブル\"%s\"へのコピーに失敗しました: %s" -#: pg_backup_db.c:632 pg_dump.c:1984 +#: pg_backup_db.c:522 pg_dump.c:2105 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "ファイル\"%s\"をCOPY中に想定していない余分な結果がありました" -#: pg_backup_db.c:644 +#: pg_backup_db.c:534 msgid "could not start database transaction" msgstr "データベーストランザクションを開始できませんでした" -#: pg_backup_db.c:652 +#: pg_backup_db.c:542 msgid "could not commit database transaction" msgstr "データベーストランザクションをコミットできませんでした" @@ -1098,43 +1098,58 @@ msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m" msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" -#: pg_backup_directory.c:355 pg_backup_directory.c:496 -#: pg_backup_directory.c:532 +#: pg_backup_directory.c:355 pg_backup_directory.c:497 +#: pg_backup_directory.c:533 #, c-format msgid "could not write to output file: %s" msgstr "出力ファイルに書き込めませんでした: %s" -#: pg_backup_directory.c:406 +#: pg_backup_directory.c:373 +#, c-format +msgid "could not close data file: %m" +msgstr "データファイルをクローズできませんでした: %m" + +#: pg_backup_directory.c:407 #, c-format msgid "could not close data file \"%s\": %m" msgstr "データファイル\"%s\"をクローズできませんでした: %m" -#: pg_backup_directory.c:446 +#: pg_backup_directory.c:447 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "ラージオブジェクトTOCファイル\"%s\"を入力用としてオープンできませんでした: %m" -#: pg_backup_directory.c:457 +#: pg_backup_directory.c:458 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "ラージオブジェクトTOCファイル\"%s\"の中に不正な行がありました: \"%s\"" -#: pg_backup_directory.c:466 +#: pg_backup_directory.c:467 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "ラージオブジェクトTOCファイル\"%s\"の読み取り中にエラーがありました" -#: pg_backup_directory.c:470 +#: pg_backup_directory.c:471 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "ラージオブジェクトTOCファイル\"%s\"をクローズできませんでした: %m" -#: pg_backup_directory.c:689 +#: pg_backup_directory.c:685 +#, c-format +msgid "could not close blob data file: %m" +msgstr "blobデータファイルをクローズできませんでした: %m" + +#: pg_backup_directory.c:691 #, c-format msgid "could not write to blobs TOC file" -msgstr "blobs TOCファイルに書き出せませんでした" +msgstr "blobのTOCファイルに書き出せませんでした" -#: pg_backup_directory.c:721 +#: pg_backup_directory.c:705 +#, c-format +msgid "could not close blobs TOC file: %m" +msgstr "blobのTOCファイルをクローズできませんでした: %m" + +#: pg_backup_directory.c:724 #, c-format msgid "file name too long: \"%s\"" msgstr "ファイル名が長すぎます: \"%s\"" @@ -1144,208 +1159,167 @@ msgstr "ファイル名が長すぎます: \"%s\"" msgid "this format cannot be read" msgstr "この形式は読み込めません" -#: pg_backup_tar.c:177 +#: pg_backup_tar.c:172 #, c-format msgid "could not open TOC file \"%s\" for output: %m" msgstr "TOCファイル\"%s\"を出力用にオープンできませんでした: %m" -#: pg_backup_tar.c:184 +#: pg_backup_tar.c:179 #, c-format msgid "could not open TOC file for output: %m" msgstr "TOCファイルを出力用にオープンできませんでした: %m" -#: pg_backup_tar.c:203 pg_backup_tar.c:358 +#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389 +#: pg_backup_tar.c:405 pg_backup_tar.c:893 #, c-format msgid "compression is not supported by tar archive format" msgstr "tar アーカイブ形式では圧縮をサポートしていません" -#: pg_backup_tar.c:211 +#: pg_backup_tar.c:206 #, c-format msgid "could not open TOC file \"%s\" for input: %m" msgstr "TOCファイル\"%s\"を入力用にオープンできませんでした: %m" -#: pg_backup_tar.c:218 +#: pg_backup_tar.c:213 #, c-format msgid "could not open TOC file for input: %m" msgstr "TOCファイルを入力用にオープンできませんでした: %m" -#: pg_backup_tar.c:344 +#: pg_backup_tar.c:322 #, c-format msgid "could not find file \"%s\" in archive" msgstr "アーカイブ内にファイル\"%s\"がありませんでした" -#: pg_backup_tar.c:410 +#: pg_backup_tar.c:382 #, c-format msgid "could not generate temporary file name: %m" msgstr "一時ファイル名を生成できませんでした: %m" -#: pg_backup_tar.c:421 -#, c-format -msgid "could not open temporary file" -msgstr "一時ファイルをオープンできませんでした" - -#: pg_backup_tar.c:448 -#, c-format -msgid "could not close tar member" -msgstr "tarメンバをクローズできませんでした" - -#: pg_backup_tar.c:691 +#: pg_backup_tar.c:624 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "想定外のCOPY文の構文: \"%s\"" -#: pg_backup_tar.c:958 +#: pg_backup_tar.c:890 #, c-format msgid "invalid OID for large object (%u)" msgstr "ラージオブジェクトの不正なOID(%u)" -#: pg_backup_tar.c:1105 +#: pg_backup_tar.c:1035 #, c-format msgid "could not close temporary file: %m" msgstr "一時ファイルを開けませんでした: %m" -#: pg_backup_tar.c:1114 +#: pg_backup_tar.c:1038 #, c-format -msgid "actual file length (%s) does not match expected (%s)" -msgstr "実際の長さ(%s)が想定(%s)と一致しません" +msgid "actual file length (%lld) does not match expected (%lld)" +msgstr "実際のファイル長(%lld)が想定(%lld)と一致しません" -#: pg_backup_tar.c:1171 pg_backup_tar.c:1202 +#: pg_backup_tar.c:1084 pg_backup_tar.c:1115 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "tar アーカイブ内でファイル\"%s\"のヘッダがありませんでした" -#: pg_backup_tar.c:1189 +#: pg_backup_tar.c:1102 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "このアーカイブ形式では、順不同でのデータのリストアはサポートされていません: \"%s\"は必要ですが、アーカイブファイル内で\"%s\"より前に来ました。" -#: pg_backup_tar.c:1236 +#: pg_backup_tar.c:1149 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "不完全なtarヘッダがありました(%luバイト)" -msgstr[1] "不完全なtarヘッダがありました(%luバイト)" -#: pg_backup_tar.c:1287 +#: pg_backup_tar.c:1188 #, c-format -msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s" -msgstr "破損したtarヘッダが%sにありました(想定 %d、算出結果 %d) ファイル位置 %s" +msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" +msgstr "破損したtarヘッダが%sにありました(想定 %d、算出結果 %d) ファイル位置 %llu" #: pg_backup_utils.c:54 #, c-format msgid "unrecognized section name: \"%s\"" msgstr "認識不可のセクション名: \"%s\"" -#: pg_backup_utils.c:55 pg_dump.c:608 pg_dump.c:625 pg_dumpall.c:338 -#: pg_dumpall.c:348 pg_dumpall.c:357 pg_dumpall.c:366 pg_dumpall.c:374 -#: pg_dumpall.c:388 pg_dumpall.c:464 pg_restore.c:284 pg_restore.c:300 -#: pg_restore.c:318 +#: pg_backup_utils.c:55 pg_dump.c:627 pg_dump.c:644 pg_dumpall.c:340 +#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373 +#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307 +#: pg_restore.c:321 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "詳細は \"%s --help\" を実行してください\n" +msgid "Try \"%s --help\" for more information." +msgstr "詳細は\"%s --help\"を実行してください。" -#: pg_backup_utils.c:68 +#: pg_backup_utils.c:66 #, c-format msgid "out of on_exit_nicely slots" msgstr "on_exit_nicelyスロットが足りません" -#: pg_dump.c:534 -#, c-format -msgid "compression level must be in range 0..9" -msgstr "圧縮レベルは 0..9 の範囲でなければなりません" - -#: pg_dump.c:572 -#, c-format -msgid "extra_float_digits must be in range -15..3" -msgstr "extra_float_digitsは -15..3 の範囲でなければなりません" - -#: pg_dump.c:595 -#, c-format -msgid "rows-per-insert must be in range %d..%d" -msgstr "rows-per-insertは%d..%dの範囲でなければなりません" - -#: pg_dump.c:623 pg_dumpall.c:346 pg_restore.c:298 +#: pg_dump.c:642 pg_dumpall.c:348 pg_restore.c:305 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数が多すぎます(先頭は\"%s\")" -#: pg_dump.c:644 pg_restore.c:327 +#: pg_dump.c:661 pg_restore.c:328 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "-s/--schema-only と -a/--data-only オプションは同時には使用できません" -#: pg_dump.c:649 +#: pg_dump.c:664 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "-s/--schema-only と --include-foreign-data オプションは同時には使用できません" -#: pg_dump.c:652 +#: pg_dump.c:667 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "オプション --include-foreign-data はパラレルバックアップではサポートされません" -#: pg_dump.c:656 pg_restore.c:333 +#: pg_dump.c:670 pg_restore.c:331 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "-c/--clean と -a/--data-only オプションは同時には使用できません" -#: pg_dump.c:661 pg_dumpall.c:381 pg_restore.c:382 +#: pg_dump.c:673 pg_dumpall.c:378 pg_restore.c:356 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "--if-existsは -c/--clean の指定が必要です" -#: pg_dump.c:668 +#: pg_dump.c:680 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "--on-conflict-do-nothingオプションは--inserts、--rows-per-insert または --column-insertsを必要とします" -#: pg_dump.c:690 +#: pg_dump.c:702 #, c-format msgid "requested compression not available in this installation -- archive will be uncompressed" msgstr "圧縮が要求されましたがこのインストールでは利用できません -- アーカイブは圧縮されません" -#: pg_dump.c:711 pg_restore.c:349 -#, c-format -msgid "invalid number of parallel jobs" -msgstr "不正な並列ジョブ数" - #: pg_dump.c:715 #, c-format msgid "parallel backup only supported by the directory format" msgstr "並列バックアップはディレクトリ形式でのみサポートされます" -#: pg_dump.c:770 -#, c-format -msgid "" -"Synchronized snapshots are not supported by this server version.\n" -"Run with --no-synchronized-snapshots instead if you do not need\n" -"synchronized snapshots." -msgstr "" -"同期スナップショットはこのサーババージョンではサポートされていません。\n" -"同期スナップショットが不要ならば--no-synchronized-snapshotsを付けて\n" -"実行してください。" - -#: pg_dump.c:776 -#, c-format -msgid "Exported snapshots are not supported by this server version." -msgstr "スナップショットのエクスポートはこのサーババージョンではサポートされません" - -#: pg_dump.c:788 +#: pg_dump.c:761 #, c-format msgid "last built-in OID is %u" msgstr "最後の組み込みOIDは%u" -#: pg_dump.c:797 +#: pg_dump.c:770 #, c-format msgid "no matching schemas were found" msgstr "マッチするスキーマが見つかりません" -#: pg_dump.c:811 +#: pg_dump.c:784 #, c-format msgid "no matching tables were found" msgstr "マッチするテーブルが見つかりません" -#: pg_dump.c:986 +#: pg_dump.c:806 +#, c-format +msgid "no matching extensions were found" +msgstr "合致する機能拡張が見つかりません" + +#: pg_dump.c:989 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1354,17 +1328,17 @@ msgstr "" "%sはデータベースをテキストファイルまたはその他の形式でダンプします。\n" "\n" -#: pg_dump.c:987 pg_dumpall.c:617 pg_restore.c:462 +#: pg_dump.c:990 pg_dumpall.c:605 pg_restore.c:433 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_dump.c:988 +#: pg_dump.c:991 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: pg_dump.c:990 pg_dumpall.c:620 pg_restore.c:465 +#: pg_dump.c:993 pg_dumpall.c:608 pg_restore.c:436 #, c-format msgid "" "\n" @@ -1373,12 +1347,12 @@ msgstr "" "\n" "一般的なオプション;\n" -#: pg_dump.c:991 +#: pg_dump.c:994 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=ファイル名 出力ファイルまたはディレクトリの名前\n" -#: pg_dump.c:992 +#: pg_dump.c:995 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1387,42 +1361,42 @@ msgstr "" " -F, --format=c|d|t|p 出力ファイルの形式(custom, directory, tar, \n" " plain text(デフォルト))\n" -#: pg_dump.c:994 +#: pg_dump.c:997 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM ダンプ時に指定した数の並列ジョブを使用\n" -#: pg_dump.c:995 pg_dumpall.c:622 +#: pg_dump.c:998 pg_dumpall.c:610 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose 冗長モード\n" -#: pg_dump.c:996 pg_dumpall.c:623 +#: pg_dump.c:999 pg_dumpall.c:611 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: pg_dump.c:997 +#: pg_dump.c:1000 #, c-format msgid " -Z, --compress=0-9 compression level for compressed formats\n" msgstr " -Z, --compress=0-9 圧縮形式における圧縮レベル\n" -#: pg_dump.c:998 pg_dumpall.c:624 +#: pg_dump.c:1001 pg_dumpall.c:612 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr " --lock-wait-timeout=TIMEOUT テーブルロックをTIMEOUT待ってから失敗\n" -#: pg_dump.c:999 pg_dumpall.c:651 +#: pg_dump.c:1002 pg_dumpall.c:639 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync 変更のディスクへの安全な書き出しを待機しない\n" -#: pg_dump.c:1000 pg_dumpall.c:625 +#: pg_dump.c:1003 pg_dumpall.c:613 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: pg_dump.c:1002 pg_dumpall.c:626 +#: pg_dump.c:1005 pg_dumpall.c:614 #, c-format msgid "" "\n" @@ -1431,47 +1405,52 @@ msgstr "" "\n" "出力内容を制御するためのオプション:\n" -#: pg_dump.c:1003 pg_dumpall.c:627 +#: pg_dump.c:1006 pg_dumpall.c:615 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only データのみをダンプし、スキーマをダンプしない\n" -#: pg_dump.c:1004 +#: pg_dump.c:1007 #, c-format msgid " -b, --blobs include large objects in dump\n" msgstr " -b, --blobs ダンプにラージオブジェクトを含める\n" -#: pg_dump.c:1005 +#: pg_dump.c:1008 #, c-format msgid " -B, --no-blobs exclude large objects in dump\n" msgstr " -B, --no-blobs ダンプにラージオブジェクトを含めない\n" -#: pg_dump.c:1006 pg_restore.c:476 +#: pg_dump.c:1009 pg_restore.c:447 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr " -c, --clean 再作成前にデータベースオブジェクトを整理(削除)\n" -#: pg_dump.c:1007 +#: pg_dump.c:1010 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr " -C, --create ダンプにデータベース生成用コマンドを含める\n" -#: pg_dump.c:1008 pg_dumpall.c:629 +#: pg_dump.c:1011 +#, c-format +msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" +msgstr " -e, --extension=PATTERN 指定した機能拡張のみをダンプ\n" + +#: pg_dump.c:1012 pg_dumpall.c:617 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=ENCODING ENCODING符号化方式でデータをダンプ\n" -#: pg_dump.c:1009 +#: pg_dump.c:1013 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=SCHEMA 指定したスキーマのみをダンプ\n" -#: pg_dump.c:1010 +#: pg_dump.c:1014 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=SCHEMA 指定したスキーマをダンプしない\n" -#: pg_dump.c:1011 +#: pg_dump.c:1015 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1480,54 +1459,54 @@ msgstr "" " -O, --no-owner プレインテキスト形式で、オブジェクト所有権の\n" " 復元を行わない\n" -#: pg_dump.c:1013 pg_dumpall.c:633 +#: pg_dump.c:1017 pg_dumpall.c:621 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only スキーマのみをダンプし、データはダンプしない\n" -#: pg_dump.c:1014 +#: pg_dump.c:1018 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr " -S, --superuser=NAME プレインテキスト形式で使用するスーパユーザの名前\n" -#: pg_dump.c:1015 +#: pg_dump.c:1019 #, c-format msgid " -t, --table=PATTERN dump the specified table(s) only\n" msgstr " -t, --table=PATTERN 指定したテーブルのみをダンプ\n" -#: pg_dump.c:1016 +#: pg_dump.c:1020 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=PATTERN 指定したテーブルをダンプしない\n" -#: pg_dump.c:1017 pg_dumpall.c:636 +#: pg_dump.c:1021 pg_dumpall.c:624 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges 権限(grant/revoke)をダンプしない\n" -#: pg_dump.c:1018 pg_dumpall.c:637 +#: pg_dump.c:1022 pg_dumpall.c:625 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade アップグレードユーティリティ専用\n" -#: pg_dump.c:1019 pg_dumpall.c:638 +#: pg_dump.c:1023 pg_dumpall.c:626 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr " --column-inserts 列名指定のINSERTコマンドでデータをダンプ\n" -#: pg_dump.c:1020 pg_dumpall.c:639 +#: pg_dump.c:1024 pg_dumpall.c:627 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr "" " --disable-dollar-quoting ドル記号による引用符付けを禁止、SQL標準の引用符\n" " 付けを使用\n" -#: pg_dump.c:1021 pg_dumpall.c:640 pg_restore.c:493 +#: pg_dump.c:1025 pg_dumpall.c:628 pg_restore.c:464 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr " --disable-triggers データのみのリストアの際にトリガを無効化\n" -#: pg_dump.c:1022 +#: pg_dump.c:1026 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" @@ -1536,22 +1515,22 @@ msgstr "" " --enable-row-security 行セキュリティを有効化(ユーザがアクセス可能な\n" " 内容のみをダンプ)\n" -#: pg_dump.c:1024 +#: pg_dump.c:1028 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=PATTERN 指定したテーブルのデータをダンプしない\n" -#: pg_dump.c:1025 pg_dumpall.c:642 +#: pg_dump.c:1029 pg_dumpall.c:630 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr " --extra-float-digits=NUM extra_float_digitsの設定を上書きする\n" -#: pg_dump.c:1026 pg_dumpall.c:643 pg_restore.c:495 +#: pg_dump.c:1030 pg_dumpall.c:631 pg_restore.c:466 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists オブジェクト削除の際に IF EXISTS を使用\n" -#: pg_dump.c:1027 +#: pg_dump.c:1031 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1562,86 +1541,91 @@ msgstr "" " PATTERNに合致する外部サーバ上の外部テーブルの\n" " データを含める\n" -#: pg_dump.c:1030 pg_dumpall.c:644 +#: pg_dump.c:1034 pg_dumpall.c:632 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr " --inserts COPYではなくINSERTコマンドでデータをダンプ\n" -#: pg_dump.c:1031 pg_dumpall.c:645 +#: pg_dump.c:1035 pg_dumpall.c:633 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root 子テーブルをルートテーブル経由でロードする\n" -#: pg_dump.c:1032 pg_dumpall.c:646 +#: pg_dump.c:1036 pg_dumpall.c:634 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments コメントをダンプしない\n" -#: pg_dump.c:1033 pg_dumpall.c:647 +#: pg_dump.c:1037 pg_dumpall.c:635 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications パブリケーションをダンプしない\n" -#: pg_dump.c:1034 pg_dumpall.c:649 +#: pg_dump.c:1038 pg_dumpall.c:637 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr " --no-security-labels セキュリティラベルの割り当てをダンプしない\n" -#: pg_dump.c:1035 pg_dumpall.c:650 +#: pg_dump.c:1039 pg_dumpall.c:638 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions サブスクリプションをダンプしない\n" -#: pg_dump.c:1036 +#: pg_dump.c:1040 pg_dumpall.c:640 #, c-format -msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n" -msgstr " --no-synchronized-snapshots 並列ジョブにおいて同期スナップショットを使用しない\n" +msgid " --no-table-access-method do not dump table access methods\n" +msgstr " --no-table-access-method テーブルアクセスメソッドをダンプしない\n" -#: pg_dump.c:1037 pg_dumpall.c:652 +#: pg_dump.c:1041 pg_dumpall.c:641 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces テーブルスペースの割り当てをダンプしない\n" -#: pg_dump.c:1038 pg_dumpall.c:653 +#: pg_dump.c:1042 pg_dumpall.c:642 +#, c-format +msgid " --no-toast-compression do not dump TOAST compression methods\n" +msgstr " --no-toast-compression TOAST圧縮方式をダンプしない\n" + +#: pg_dump.c:1043 pg_dumpall.c:643 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data 非ログテーブルのデータをダンプしない\n" -#: pg_dump.c:1039 pg_dumpall.c:654 +#: pg_dump.c:1044 pg_dumpall.c:644 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" msgstr " --on-conflict-do-nothing INSERTコマンドにON CONFLICT DO NOTHINGを付加する\n" -#: pg_dump.c:1040 pg_dumpall.c:655 +#: pg_dump.c:1045 pg_dumpall.c:645 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr "" " --quote-all-identifiers すべての識別子をキーワードでなかったとしても\n" " 引用符でくくる\n" -#: pg_dump.c:1041 pg_dumpall.c:656 +#: pg_dump.c:1046 pg_dumpall.c:646 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=NROWS INSERT毎の行数; --insertsを暗黙的に指定する\n" -#: pg_dump.c:1042 +#: pg_dump.c:1047 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr "" " --section=SECTION 指定したセクション(データ前、データ、データ後)を\n" " ダンプする\n" -#: pg_dump.c:1043 +#: pg_dump.c:1048 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr " --serializable-deferrable ダンプを異常なく実行できるようになるまで待機\n" -#: pg_dump.c:1044 +#: pg_dump.c:1049 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT ダンプに指定のスナップショットを使用する\n" -#: pg_dump.c:1045 pg_restore.c:504 +#: pg_dump.c:1050 pg_restore.c:476 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" @@ -1650,7 +1634,7 @@ msgstr "" " --strict-names テーブル/スキーマの対象パターンが最低でも\n" " 一つの実体にマッチすることを必須とする\n" -#: pg_dump.c:1047 pg_dumpall.c:657 pg_restore.c:506 +#: pg_dump.c:1052 pg_dumpall.c:647 pg_restore.c:478 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1661,7 +1645,7 @@ msgstr "" " 所有者をセットする際、ALTER OWNER コマンドの代わり\n" " に SET SESSION AUTHORIZATION コマンドを使用する\n" -#: pg_dump.c:1051 pg_dumpall.c:661 pg_restore.c:510 +#: pg_dump.c:1056 pg_dumpall.c:651 pg_restore.c:482 #, c-format msgid "" "\n" @@ -1670,44 +1654,44 @@ msgstr "" "\n" "接続オプション:\n" -#: pg_dump.c:1052 +#: pg_dump.c:1057 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAME ダンプするデータベース\n" -#: pg_dump.c:1053 pg_dumpall.c:663 pg_restore.c:511 +#: pg_dump.c:1058 pg_dumpall.c:653 pg_restore.c:483 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME データベースサーバのホストまたはソケットディレクトリ\n" -#: pg_dump.c:1054 pg_dumpall.c:665 pg_restore.c:512 +#: pg_dump.c:1059 pg_dumpall.c:655 pg_restore.c:484 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT データベースサーバのポート番号\n" -#: pg_dump.c:1055 pg_dumpall.c:666 pg_restore.c:513 +#: pg_dump.c:1060 pg_dumpall.c:656 pg_restore.c:485 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAME 指定したデータベースユーザで接続\n" -#: pg_dump.c:1056 pg_dumpall.c:667 pg_restore.c:514 +#: pg_dump.c:1061 pg_dumpall.c:657 pg_restore.c:486 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password パスワード入力を要求しない\n" -#: pg_dump.c:1057 pg_dumpall.c:668 pg_restore.c:515 +#: pg_dump.c:1062 pg_dumpall.c:658 pg_restore.c:487 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr "" " -W, --password パスワードプロンプトを強制表示します\n" " (自動的に表示されるはず)\n" -#: pg_dump.c:1058 pg_dumpall.c:669 +#: pg_dump.c:1063 pg_dumpall.c:659 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROLENAME ダンプの前に SET ROLE を行う\n" -#: pg_dump.c:1060 +#: pg_dump.c:1065 #, c-format msgid "" "\n" @@ -1719,546 +1703,497 @@ msgstr "" "データベース名が指定されなかった場合、環境変数PGDATABASEが使用されます\n" "\n" -#: pg_dump.c:1062 pg_dumpall.c:673 pg_restore.c:522 +#: pg_dump.c:1067 pg_dumpall.c:663 pg_restore.c:494 #, c-format msgid "Report bugs to <%s>.\n" msgstr "バグは<%s>に報告してください。\n" -#: pg_dump.c:1063 pg_dumpall.c:674 pg_restore.c:523 +#: pg_dump.c:1068 pg_dumpall.c:664 pg_restore.c:495 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_dump.c:1082 pg_dumpall.c:499 +#: pg_dump.c:1087 pg_dumpall.c:488 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "不正なクライアントエンコーディング\"%s\"が指定されました" -#: pg_dump.c:1228 +#: pg_dump.c:1225 #, c-format -msgid "" -"Synchronized snapshots on standby servers are not supported by this server version.\n" -"Run with --no-synchronized-snapshots instead if you do not need\n" -"synchronized snapshots." -msgstr "" -"同期スナップショットはこのサーババージョンではサポートされていません。\n" -"同期スナップショットが不要ならば--no-synchronized-snapshotsを付けて\n" -"実行してください。" +msgid "parallel dumps from standby servers are not supported by this server version" +msgstr "スタンバイサーバーからの並列ダンプはこのサーバーバージョンではサポートされません" -#: pg_dump.c:1297 +#: pg_dump.c:1290 #, c-format msgid "invalid output format \"%s\" specified" msgstr "不正な出力形式\"%s\"が指定されました" -#: pg_dump.c:1335 +#: pg_dump.c:1331 pg_dump.c:1387 pg_dump.c:1440 pg_dumpall.c:1282 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "修飾名が不適切です(ドット区切りの名前が多すぎます): %s" + +#: pg_dump.c:1339 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "パターン\"%s\"にマッチするスキーマが見つかりません" -#: pg_dump.c:1382 +#: pg_dump.c:1392 +#, c-format +msgid "no matching extensions were found for pattern \"%s\"" +msgstr "パターン\"%s\"に合致する機能拡張が見つかりません" + +#: pg_dump.c:1445 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "パターン\"%s\"にマッチする外部サーバーが見つかりません" -#: pg_dump.c:1445 +#: pg_dump.c:1508 +#, c-format +msgid "improper relation name (too many dotted names): %s" +msgstr "リレーション名が不適切です(ドット区切りの名前が多すぎます): %s" + +#: pg_dump.c:1519 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "パターン \"%s\"にマッチするテーブルが見つかりません" -#: pg_dump.c:1858 +#: pg_dump.c:1546 +#, c-format +msgid "You are currently not connected to a database." +msgstr "現在データベースに接続していません。" + +#: pg_dump.c:1549 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "データベース間の参照は実装されていません: %s" + +#: pg_dump.c:1980 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "テーブル \"%s.%s\"の内容をダンプしています" -#: pg_dump.c:1965 +#: pg_dump.c:2086 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "テーブル\"%s\"の内容のダンプに失敗: PQgetCopyData()が失敗しました。" -#: pg_dump.c:1966 pg_dump.c:1976 +#: pg_dump.c:2087 pg_dump.c:2097 #, c-format msgid "Error message from server: %s" msgstr "サーバのエラーメッセージ: %s" -#: pg_dump.c:1967 pg_dump.c:1977 +#: pg_dump.c:2088 pg_dump.c:2098 #, c-format -msgid "The command was: %s" +msgid "Command was: %s" msgstr "コマンド: %s" -#: pg_dump.c:1975 +#: pg_dump.c:2096 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "テーブル\"%s\"の内容のダンプに失敗: PQgetResult()が失敗しました。" -#: pg_dump.c:2729 +#: pg_dump.c:2178 +#, c-format +msgid "wrong number of fields retrieved from table \"%s\"" +msgstr "テーブル\"%s\"から取得したフィールドの数が間違っています" + +#: pg_dump.c:2836 #, c-format msgid "saving database definition" msgstr "データベース定義を保存しています" -#: pg_dump.c:3201 +#: pg_dump.c:2932 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "認識できない照合順序プロバイダ: %s" + +#: pg_dump.c:3248 #, c-format msgid "saving encoding = %s" msgstr "encoding = %s を保存しています" -#: pg_dump.c:3226 +#: pg_dump.c:3273 #, c-format msgid "saving standard_conforming_strings = %s" msgstr "standard_conforming_strings = %s を保存しています" -#: pg_dump.c:3265 +#: pg_dump.c:3312 #, c-format msgid "could not parse result of current_schemas()" msgstr "current_schemas()の結果をパースできませんでした" -#: pg_dump.c:3284 +#: pg_dump.c:3331 #, c-format msgid "saving search_path = %s" msgstr "search_path = %s を保存しています" -#: pg_dump.c:3324 +#: pg_dump.c:3369 #, c-format msgid "reading large objects" msgstr "ラージオブジェクトを読み込んでいます" -#: pg_dump.c:3506 +#: pg_dump.c:3507 #, c-format msgid "saving large objects" msgstr "ラージオブジェクトを保存しています" -#: pg_dump.c:3552 +#: pg_dump.c:3548 #, c-format msgid "error reading large object %u: %s" msgstr "ラージオブジェクト %u を読み取り中にエラーがありました: %s" -#: pg_dump.c:3604 -#, c-format -msgid "reading row security enabled for table \"%s.%s\"" -msgstr "テーブル\"%s.%s\"で有効な行セキュリティ設定を読み込んでいます" - -#: pg_dump.c:3635 +#: pg_dump.c:3654 #, c-format -msgid "reading policies for table \"%s.%s\"" -msgstr "テーブル\"%s.%s\"のポリシを読み込んでいます" +msgid "reading row-level security policies" +msgstr "行レベルセキュリティポリシーを読み取ります" -#: pg_dump.c:3787 +#: pg_dump.c:3795 #, c-format msgid "unexpected policy command type: %c" msgstr "想定外のポリシコマンドタイプ: \"%c\"" -#: pg_dump.c:3938 +#: pg_dump.c:4245 pg_dump.c:4562 pg_dump.c:11693 pg_dump.c:17510 +#: pg_dump.c:17512 pg_dump.c:18133 #, c-format -msgid "owner of publication \"%s\" appears to be invalid" -msgstr "パブリケーション\"%s\"の所有者が不正なようです" +msgid "could not parse %s array" +msgstr "%s配列をパースできませんでした" -#: pg_dump.c:4083 -#, c-format -msgid "reading publication membership for table \"%s.%s\"" -msgstr "パブリケーション\"%s.%s\"の構成要素を読み込んでいます" - -#: pg_dump.c:4227 +#: pg_dump.c:4430 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "現在のユーザがスーパユーザではないため、サブスクリプションはダンプされません" -#: pg_dump.c:4292 -#, c-format -msgid "owner of subscription \"%s\" appears to be invalid" -msgstr "サブスクリプション\"%s\"の所有者が無効なようです" - -#: pg_dump.c:4336 -#, c-format -msgid "could not parse subpublications array" -msgstr "subpublications配列をパースできませんでした" - -#: pg_dump.c:4649 +#: pg_dump.c:4944 #, c-format msgid "could not find parent extension for %s %s" msgstr "%s %sの親となる機能拡張がありませんでした" -#: pg_dump.c:4781 -#, c-format -msgid "owner of schema \"%s\" appears to be invalid" -msgstr "スキーマ\"%s\"の所有者が無効なようです" - -#: pg_dump.c:4804 +#: pg_dump.c:5089 #, c-format msgid "schema with OID %u does not exist" msgstr "OID %uのスキーマは存在しません" -#: pg_dump.c:5129 -#, c-format -msgid "owner of data type \"%s\" appears to be invalid" -msgstr "データ型\"%s\"の所有者が無効なようです" - -#: pg_dump.c:5214 -#, c-format -msgid "owner of operator \"%s\" appears to be invalid" -msgstr "演算子\"%s\"の所有者が無効なようです" - -#: pg_dump.c:5516 -#, c-format -msgid "owner of operator class \"%s\" appears to be invalid" -msgstr "演算子クラス\"%s\"の所有者が無効なようです" - -#: pg_dump.c:5600 -#, c-format -msgid "owner of operator family \"%s\" appears to be invalid" -msgstr "演算子族\"%s\"の所有者が無効なようです" - -#: pg_dump.c:5769 -#, c-format -msgid "owner of aggregate function \"%s\" appears to be invalid" -msgstr "集約関数\"%s\"の所有者が無効なようです" - -#: pg_dump.c:6029 -#, c-format -msgid "owner of function \"%s\" appears to be invalid" -msgstr "関数\"%s\"の所有者が無効なようです" - -#: pg_dump.c:6857 -#, c-format -msgid "owner of table \"%s\" appears to be invalid" -msgstr "テーブル\"%s\"の所有者が無効なようです" - -#: pg_dump.c:6899 pg_dump.c:17136 +#: pg_dump.c:6543 pg_dump.c:16774 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "健全性検査に失敗しました、OID %2$u であるシーケンスの OID %1$u である親テーブルがありません" -#: pg_dump.c:7041 +#: pg_dump.c:6847 pg_dump.c:7114 pg_dump.c:7585 pg_dump.c:8252 pg_dump.c:8373 +#: pg_dump.c:8527 #, c-format -msgid "reading indexes for table \"%s.%s\"" -msgstr "テーブル\"%s.%s\"のインデックスを読み込んでいます" +msgid "unrecognized table OID %u" +msgstr "認識できないテーブルOID %u" -#: pg_dump.c:7456 +#: pg_dump.c:6851 #, c-format -msgid "reading foreign key constraints for table \"%s.%s\"" -msgstr "テーブル\"%s.%s\"の外部キー制約を読み込んでいます" +msgid "unexpected index data for table \"%s\"" +msgstr "テーブル\"%s\"に対する想定外のインデックスデータ" -#: pg_dump.c:7735 +#: pg_dump.c:7346 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "健全性検査に失敗しました、OID %2$u であるpg_rewriteエントリのOID %1$u である親テーブルが見つかりません" -#: pg_dump.c:7818 -#, c-format -msgid "reading triggers for table \"%s.%s\"" -msgstr "テーブル\"%s.%s\"のトリガを読み込んでいます" - -#: pg_dump.c:7951 +#: pg_dump.c:7637 #, c-format msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" msgstr "問い合わせがテーブル\"%2$s\"上の外部キートリガ\"%1$s\"の参照テーブル名としてNULLを返しました(テーブルのOID: %3$u)" -#: pg_dump.c:8485 +#: pg_dump.c:8256 #, c-format -msgid "finding the columns and types of table \"%s.%s\"" -msgstr "テーブル\"%s.%s\"の列と型を探しています" +msgid "unexpected column data for table \"%s\"" +msgstr "テーブル\"%s\"に対する想定外の列データ" -#: pg_dump.c:8601 +#: pg_dump.c:8286 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "テーブル\"%s\"の列番号が不正です" -#: pg_dump.c:8638 +#: pg_dump.c:8335 #, c-format -msgid "finding default expressions of table \"%s.%s\"" -msgstr "テーブル\"%s.%s\"のデフォルト式を探しています" +msgid "finding table default expressions" +msgstr "テーブルのデフォルト式を探しています" -#: pg_dump.c:8660 +#: pg_dump.c:8377 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "テーブル\"%2$s\"用のadnumの値%1$dが不正です" -#: pg_dump.c:8725 +#: pg_dump.c:8477 #, c-format -msgid "finding check constraints for table \"%s.%s\"" -msgstr "テーブル\"%s.%s\"の検査制約を探しています" +msgid "finding table check constraints" +msgstr "テーブルのチェック制約を探しています" -#: pg_dump.c:8774 +#: pg_dump.c:8531 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "テーブル\"%2$s\"で想定する検査制約は%1$d個でしたが、%3$dありました" -msgstr[1] "テーブル\"%2$s\"で想定する検査制約は%1$d個でしたが、%3$dありました" - -#: pg_dump.c:8778 -#, c-format -msgid "(The system catalogs might be corrupted.)" -msgstr "(システムカタログが破損している可能性があります)" - -#: pg_dump.c:10364 -#, c-format -msgid "typtype of data type \"%s\" appears to be invalid" -msgstr "データ型\"%s\"のtyptypeが不正なようです" -#: pg_dump.c:11718 +#: pg_dump.c:8535 #, c-format -msgid "bogus value in proargmodes array" -msgstr "proargmodes配列内におかしな値があります" +msgid "The system catalogs might be corrupted." +msgstr "システムカタログが破損している可能性があります。" -#: pg_dump.c:12002 +#: pg_dump.c:9225 #, c-format -msgid "could not parse proallargtypes array" -msgstr "proallargtypes配列のパースができませんでした" +msgid "role with OID %u does not exist" +msgstr "OID が %u であるロールは存在しません" -#: pg_dump.c:12018 +#: pg_dump.c:9337 pg_dump.c:9366 #, c-format -msgid "could not parse proargmodes array" -msgstr "proargmodes配列のパースができませんでした" +msgid "unsupported pg_init_privs entry: %u %u %d" +msgstr "非サポートのpg_init_privsエントリ: %u %u %d" -#: pg_dump.c:12032 +#: pg_dump.c:10187 #, c-format -msgid "could not parse proargnames array" -msgstr "proargnames配列のパースができませんでした" - -#: pg_dump.c:12043 -#, c-format -msgid "could not parse proconfig array" -msgstr "proconfig配列のパースができませんでした" +msgid "typtype of data type \"%s\" appears to be invalid" +msgstr "データ型\"%s\"のtyptypeが不正なようです" -#: pg_dump.c:12123 +#: pg_dump.c:11762 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "関数\"%s\"のprovolatileの値が認識できません" -#: pg_dump.c:12173 pg_dump.c:14118 +#: pg_dump.c:11812 pg_dump.c:13603 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "関数\"%s\"のproparallel値が認識できません" -#: pg_dump.c:12312 pg_dump.c:12421 pg_dump.c:12428 +#: pg_dump.c:11943 pg_dump.c:12049 pg_dump.c:12056 #, c-format msgid "could not find function definition for function with OID %u" msgstr "OID %uの関数の関数定義が見つかりませんでした" -#: pg_dump.c:12351 +#: pg_dump.c:11982 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "pg_cast.castfuncまたはpg_cast.castmethodフィールドの値がおかしいです" -#: pg_dump.c:12354 +#: pg_dump.c:11985 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "pg_cast.castmethod フィールドの値がおかしいです" -#: pg_dump.c:12447 +#: pg_dump.c:12075 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "おかしな変換定義、trffromsql か trftosql の少なくとも一方は非ゼロであるはずです" -#: pg_dump.c:12464 +#: pg_dump.c:12092 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "pg_cast.castmethod フィールドの値がおかしいです" -#: pg_dump.c:12485 +#: pg_dump.c:12113 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "pg_cast.castmethod フィールドの値がおかしいです" -#: pg_dump.c:12801 +#: pg_dump.c:12258 +#, c-format +msgid "postfix operators are not supported anymore (operator \"%s\")" +msgstr "後置演算子は今後サポートされません(演算子\"%s\")" + +#: pg_dump.c:12428 #, c-format msgid "could not find operator with OID %s" msgstr "OID %sの演算子がありませんでした" -#: pg_dump.c:12869 +#: pg_dump.c:12496 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"の不正なタイプ\"%1$c\"" -#: pg_dump.c:13623 +#: pg_dump.c:13115 #, c-format msgid "unrecognized collation provider: %s" msgstr "認識できないの照合順序プロバイダ: %s" -#: pg_dump.c:14037 +#: pg_dump.c:13522 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "集約\"%s\"のaggfinalmodifyの値が識別できません" -#: pg_dump.c:14093 +#: pg_dump.c:13578 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "集約\"%s\"のaggmfinalmodifyの値が識別できません" -#: pg_dump.c:14815 +#: pg_dump.c:14296 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "デフォルト権限設定中の認識できないオブジェクト型: %d" -#: pg_dump.c:14833 +#: pg_dump.c:14312 #, c-format msgid "could not parse default ACL list (%s)" msgstr "デフォルトの ACL リスト(%s)をパースできませんでした" -#: pg_dump.c:14918 +#: pg_dump.c:14394 #, c-format -msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)" -msgstr "オブジェクト\"%3$s\"(%4$s)の初期GRANT ACLリスト(%1$s)または初期REVOKE ACLリスト(%2$s)をパースできませんでした" +msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" +msgstr "オブジェクト\"%3$s\"(%4$s)の初期ACLリスト(%1$s)またはデフォルト値(%2$s)をパースできませんでした" -#: pg_dump.c:14926 +#: pg_dump.c:14419 #, c-format -msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)" -msgstr "オブジェクト\"%3$s\"(%4$s)のGRANT ACLリスト(%1$s)またはREVOKE ACLリスト(%2$s)をパースできませんでした" +msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" +msgstr "オブジェクト\"%3$s\"(%4$s)のACLリスト(%1$s)またはデフォルト値(%2$s)をパースできませんでした" -#: pg_dump.c:15441 +#: pg_dump.c:14957 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "ビュー\"%s\"の定義を取り出すための問い合わせがデータを返却しませんでした" -#: pg_dump.c:15444 +#: pg_dump.c:14960 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "ビュー\"%s\"の定義を取り出すための問い合わせが2つ以上の定義を返却しました" -#: pg_dump.c:15451 +#: pg_dump.c:14967 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "ビュー\"%s\"の定義が空のようです(長さが0)" -#: pg_dump.c:15533 +#: pg_dump.c:15051 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDSは今後サポートされません(テーブル\"%s\")" -#: pg_dump.c:16013 -#, c-format -msgid "invalid number of parents %d for table \"%s\"" -msgstr "テーブル\"%2$s\"用の親テーブルの数%1$dが不正です" - -#: pg_dump.c:16336 +#: pg_dump.c:15980 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "テーブル\"%2$s\"の列番号%1$dは不正です" -#: pg_dump.c:16621 +#: pg_dump.c:16058 +#, c-format +msgid "could not parse index statistic columns" +msgstr "インデックス統計列をパースできませんでした" + +#: pg_dump.c:16060 +#, c-format +msgid "could not parse index statistic values" +msgstr "インデックス統計値をパースできませんでした" + +#: pg_dump.c:16062 +#, c-format +msgid "mismatched number of columns and values for index statistics" +msgstr "インデックス統計に対して列と値の数が合致しません" + +#: pg_dump.c:16280 #, c-format msgid "missing index for constraint \"%s\"" msgstr "制約\"%s\"のインデックスが見つかりません" -#: pg_dump.c:16846 +#: pg_dump.c:16508 #, c-format msgid "unrecognized constraint type: %c" msgstr "制約のタイプが識別できません: %c" -#: pg_dump.c:16978 pg_dump.c:17201 +#: pg_dump.c:16609 pg_dump.c:16838 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "シーケンス\"%s\"のデータを得るための問い合わせが%d行返却しました(想定は1)" -msgstr[1] "シーケンス\"%s\"のデータを得るための問い合わせが%d行返却しました(想定は1)" -#: pg_dump.c:17012 +#: pg_dump.c:16641 #, c-format msgid "unrecognized sequence type: %s" msgstr "認識されないシーケンスの型\"%s\"" -#: pg_dump.c:17299 +#: pg_dump.c:16930 #, c-format msgid "unexpected tgtype value: %d" msgstr "想定外のtgtype値: %d" -#: pg_dump.c:17373 +#: pg_dump.c:17002 #, c-format msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" msgstr "テーブル\"%3$s\"上のトリガ\"%2$s\"の引数文字列(%1$s)が不正です" -#: pg_dump.c:17609 +#: pg_dump.c:17271 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "テーブル\"%2$s\"のルール\"%1$s\"を得るための問い合わせが失敗しました: 間違った行数が返却されました" -#: pg_dump.c:17771 +#: pg_dump.c:17424 #, c-format msgid "could not find referenced extension %u" msgstr "親の機能拡張%uが見つかりません" -#: pg_dump.c:17983 +#: pg_dump.c:17514 +#, c-format +msgid "mismatched number of configurations and conditions for extension" +msgstr "機能拡張に対して設定と条件の数が一致しません" + +#: pg_dump.c:17646 #, c-format msgid "reading dependency data" msgstr "データの依存データを読み込んでいます" -#: pg_dump.c:18076 +#: pg_dump.c:17732 #, c-format msgid "no referencing object %u %u" msgstr "参照元オブジェクト%u %uがありません" -#: pg_dump.c:18087 +#: pg_dump.c:17743 #, c-format msgid "no referenced object %u %u" msgstr "参照先オブジェクト%u %uがありません" -#: pg_dump.c:18460 -#, c-format -msgid "could not parse reloptions array" -msgstr "reloptions 配列をパースできませんでした" - -#: pg_dump_sort.c:360 +#: pg_dump_sort.c:422 #, c-format msgid "invalid dumpId %d" msgstr "不正なdumpId %d" -#: pg_dump_sort.c:366 +#: pg_dump_sort.c:428 #, c-format msgid "invalid dependency %d" msgstr "不正な依存関係 %d" -#: pg_dump_sort.c:599 +#: pg_dump_sort.c:661 #, c-format msgid "could not identify dependency loop" msgstr "依存関係のループが見つかりませんでした" -#: pg_dump_sort.c:1170 +#: pg_dump_sort.c:1232 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" msgstr[0] "次のテーブルの中で外部キー制約の循環があります: " -msgstr[1] "次のテーブルの中で外部キー制約の循環があります: " -#: pg_dump_sort.c:1174 pg_dump_sort.c:1194 +#: pg_dump_sort.c:1236 pg_dump_sort.c:1256 #, c-format msgid " %s" msgstr " %s" -#: pg_dump_sort.c:1175 +#: pg_dump_sort.c:1237 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "--disable-triggersの使用または一時的な制約の削除を行わずにこのダンプをリストアすることはできないかもしれません。" -#: pg_dump_sort.c:1176 +#: pg_dump_sort.c:1238 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "この問題を回避するために--data-onlyダンプの代わりに完全なダンプを使用することを検討してください。" -#: pg_dump_sort.c:1188 +#: pg_dump_sort.c:1250 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "以下の項目の間の依存関係のループを解決できませんでした:" -#: pg_dumpall.c:199 +#: pg_dumpall.c:205 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"%2$sには\"%1$s\"プログラムが必要ですが、\"%3$s\"と同じディレクトリ\n" -"にありませんでした。\n" -"インストール状況を確認してください。" +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "%2$sには\"%1$s\"プログラムが必要ですが、\"%3$s\"と同じディレクトリにありませんでした。" -#: pg_dumpall.c:204 +#: pg_dumpall.c:208 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じ\n" -"バージョンではありませんでした。\n" -"インストール状況を確認してください。" +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じバージョンではありませんでした。" -#: pg_dumpall.c:356 +#: pg_dumpall.c:357 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "--exclude-database オプションは -g/--globals-only、-r/--roles-only もしくは -t/--tablespaces-only と一緒には使用できません" @@ -2268,22 +2203,22 @@ msgstr "--exclude-database オプションは -g/--globals-only、-r/--roles-onl msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "-g/--globals-onlyと-r/--roles-onlyオプションは同時に使用できません" -#: pg_dumpall.c:373 +#: pg_dumpall.c:372 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "-g/--globals-onlyと-t/--tablespaces-onlyオプションは同時に使用できません" -#: pg_dumpall.c:387 +#: pg_dumpall.c:382 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "-r/--roles-onlyと-t/--tablespaces-onlyオプションは同時に使用できません" -#: pg_dumpall.c:448 pg_dumpall.c:1754 +#: pg_dumpall.c:444 pg_dumpall.c:1587 #, c-format msgid "could not connect to database \"%s\"" msgstr "データベース\"%s\"へ接続できませんでした" -#: pg_dumpall.c:462 +#: pg_dumpall.c:456 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2292,7 +2227,7 @@ msgstr "" "\"postgres\"または\"template1\"データベースに接続できませんでした\n" "代わりのデータベースを指定してください。" -#: pg_dumpall.c:616 +#: pg_dumpall.c:604 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2301,69 +2236,69 @@ msgstr "" "%sはPostgreSQLデータベースクラスタをSQLスクリプトファイルに展開します。\n" "\n" -#: pg_dumpall.c:618 +#: pg_dumpall.c:606 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_dumpall.c:621 +#: pg_dumpall.c:609 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=ファイル名 出力ファイル名\n" -#: pg_dumpall.c:628 +#: pg_dumpall.c:616 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean 再作成前にデータベースを整理(削除)\n" -#: pg_dumpall.c:630 +#: pg_dumpall.c:618 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr " -g, --globals-only グローバルオブジェクトのみをダンプし、データベースをダンプしません\n" -#: pg_dumpall.c:631 pg_restore.c:485 +#: pg_dumpall.c:619 pg_restore.c:456 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner オブジェクトの所有権の復元を省略\n" -#: pg_dumpall.c:632 +#: pg_dumpall.c:620 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr "" " -r, --roles-only ロールのみをダンプ。\n" " データベースとテーブル空間をダンプしません\n" -#: pg_dumpall.c:634 +#: pg_dumpall.c:622 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr " -S, --superuser=NAME ダンプで使用するスーパユーザのユーザ名を指定\n" -#: pg_dumpall.c:635 +#: pg_dumpall.c:623 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr " -t, --tablespaces-only テーブル空間のみをダンプ。データベースとロールをダンプしません\n" -#: pg_dumpall.c:641 +#: pg_dumpall.c:629 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr " --exclude-database=PATTERN PATTERNに合致する名前のデータベースを除外\n" -#: pg_dumpall.c:648 +#: pg_dumpall.c:636 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords ロールのパスワードをダンプしない\n" -#: pg_dumpall.c:662 +#: pg_dumpall.c:652 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=CONSTR 接続文字列を用いた接続\n" -#: pg_dumpall.c:664 +#: pg_dumpall.c:654 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAME 代替のデフォルトデータベースを指定\n" -#: pg_dumpall.c:671 +#: pg_dumpall.c:661 #, c-format msgid "" "\n" @@ -2375,97 +2310,92 @@ msgstr "" "-f/--file が指定されない場合、SQLスクリプトは標準出力に書き出されます。\n" "\n" -#: pg_dumpall.c:877 +#: pg_dumpall.c:803 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "\"pg_\"で始まるロール名はスキップされました(%s)" -#: pg_dumpall.c:1278 +#: pg_dumpall.c:1018 +#, c-format +msgid "could not parse ACL list (%s) for parameter \"%s\"" +msgstr "パラメータ\"%2$s\"のACLリスト(%1$s)をパースできませんでした" + +#: pg_dumpall.c:1136 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "テーブル空間\"%2$s\"のACLリスト(%1$s)をパースできませんでした" -#: pg_dumpall.c:1495 +#: pg_dumpall.c:1343 #, c-format msgid "excluding database \"%s\"" msgstr "データベース\"%s\"除外します" -#: pg_dumpall.c:1499 +#: pg_dumpall.c:1347 #, c-format msgid "dumping database \"%s\"" msgstr "データベース\"%s\"をダンプしています" -#: pg_dumpall.c:1531 +#: pg_dumpall.c:1378 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "データベース\"%s\"のダンプが失敗しました、終了します" -#: pg_dumpall.c:1540 +#: pg_dumpall.c:1384 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "出力ファイル\"%s\"を再オープンできませんでした: %m" -#: pg_dumpall.c:1584 +#: pg_dumpall.c:1425 #, c-format msgid "running \"%s\"" msgstr "\"%s\"を実行しています" -#: pg_dumpall.c:1775 -#, c-format -msgid "could not connect to database \"%s\": %s" -msgstr "データベース\"%s\"へ接続できませんでした: %s" - -#: pg_dumpall.c:1805 +#: pg_dumpall.c:1630 #, c-format msgid "could not get server version" msgstr "サーババージョンを取得できませんでした" -#: pg_dumpall.c:1811 +#: pg_dumpall.c:1633 #, c-format msgid "could not parse server version \"%s\"" msgstr "サーババージョン\"%s\"をパースできませんでした" -#: pg_dumpall.c:1883 pg_dumpall.c:1906 +#: pg_dumpall.c:1703 pg_dumpall.c:1726 #, c-format msgid "executing %s" msgstr "%s を実行しています" -#: pg_restore.c:308 +#: pg_restore.c:313 #, c-format msgid "one of -d/--dbname and -f/--file must be specified" msgstr "-d/--dbnameと-f/--fileのどちらか一方が指定されていなければなりません" -#: pg_restore.c:317 +#: pg_restore.c:320 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" msgstr "オプション-d/--dbnameと-f/--fileは同時に使用できません" -#: pg_restore.c:343 +#: pg_restore.c:338 #, c-format msgid "options -C/--create and -1/--single-transaction cannot be used together" msgstr "オプション-C/--createと-1/--single-transactionとは同時には使用できません" -#: pg_restore.c:357 -#, c-format -msgid "maximum number of parallel jobs is %d" -msgstr "並列ジョブ数の最大値は%dです" - -#: pg_restore.c:366 +#: pg_restore.c:342 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "--single-transaction と複数ジョブは同時には指定できません" -#: pg_restore.c:408 +#: pg_restore.c:380 #, c-format msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "アーカイブ形式\"%s\"が認識できません; \"c\"、\"d\"または\"t\"を指定してください" -#: pg_restore.c:448 +#: pg_restore.c:419 #, c-format msgid "errors ignored on restore: %d" msgstr "リストア中に無視されたエラー数: %d" -#: pg_restore.c:461 +#: pg_restore.c:432 #, c-format msgid "" "%s restores a PostgreSQL database from an archive created by pg_dump.\n" @@ -2474,49 +2404,49 @@ msgstr "" "%sはpg_dumpで作成したアーカイブからPostgreSQLデータベースをリストアします。\n" "\n" -#: pg_restore.c:463 +#: pg_restore.c:434 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [OPTION]... [FILE]\n" -#: pg_restore.c:466 +#: pg_restore.c:437 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr " -d, --dbname=NAME 接続するデータベース名\n" -#: pg_restore.c:467 +#: pg_restore.c:438 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" msgstr " -f, --file=FILENAME 出力ファイル名(- で標準出力)\n" -#: pg_restore.c:468 +#: pg_restore.c:439 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" msgstr "" " -F, --format=c|d|t バックアップファイルの形式\n" " (自動的に設定されるはずです)\n" -#: pg_restore.c:469 +#: pg_restore.c:440 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr " -l, --list アーカイブのTOCの要約を表示\n" -#: pg_restore.c:470 +#: pg_restore.c:441 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose 冗長モードです\n" -#: pg_restore.c:471 +#: pg_restore.c:442 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示し、終了します\n" -#: pg_restore.c:472 +#: pg_restore.c:443 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示し、終了します\n" -#: pg_restore.c:474 +#: pg_restore.c:445 #, c-format msgid "" "\n" @@ -2525,32 +2455,32 @@ msgstr "" "\n" "リストア制御用のオプション:\n" -#: pg_restore.c:475 +#: pg_restore.c:446 #, c-format msgid " -a, --data-only restore only the data, no schema\n" msgstr " -a, --data-only データのみをリストア。スキーマをリストアしません\n" -#: pg_restore.c:477 +#: pg_restore.c:448 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create 対象のデータベースを作成\n" -#: pg_restore.c:478 +#: pg_restore.c:449 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" msgstr " -e, --exit-on-error エラー時に終了。デフォルトは継続\n" -#: pg_restore.c:479 +#: pg_restore.c:450 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=NAME 指名したインデックスをリストア\n" -#: pg_restore.c:480 +#: pg_restore.c:451 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" msgstr " -j, --jobs=NUM リストア時に指定した数の並列ジョブを使用\n" -#: pg_restore.c:481 +#: pg_restore.c:452 #, c-format msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" @@ -2559,62 +2489,62 @@ msgstr "" " -L, --use-list=FILENAME このファイルの内容に従って SELECT や\n" " 出力のソートを行います\n" -#: pg_restore.c:483 +#: pg_restore.c:454 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" msgstr " -n, --schema=NAME 指定したスキーマのオブジェクトのみをリストア\n" -#: pg_restore.c:484 +#: pg_restore.c:455 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" msgstr " -N, --exclude-schema=NAME 指定したスキーマのオブジェクトはリストアしない\n" -#: pg_restore.c:486 +#: pg_restore.c:457 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=NAME(args) 指名された関数をリストア\n" -#: pg_restore.c:487 +#: pg_restore.c:458 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" msgstr " -s, --schema-only スキーマのみをリストア。データをリストアしません\n" -#: pg_restore.c:488 +#: pg_restore.c:459 #, c-format msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n" msgstr " -S, --superuser=NAME トリガを無効にするためのスーパユーザの名前\n" -#: pg_restore.c:489 +#: pg_restore.c:460 #, c-format msgid " -t, --table=NAME restore named relation (table, view, etc.)\n" msgstr " -t, --table=NAME 指名したリレーション(テーブル、ビューなど)をリストア\n" -#: pg_restore.c:490 +#: pg_restore.c:461 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=NAME 指名したトリガをリストア\n" -#: pg_restore.c:491 +#: pg_restore.c:462 #, c-format msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" msgstr " -x, --no-privileges アクセス権限(grant/revoke)の復元を省略\n" -#: pg_restore.c:492 +#: pg_restore.c:463 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr " -1, --single-transaction 単一のトランザクションとしてリストア\n" -#: pg_restore.c:494 +#: pg_restore.c:465 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security 行セキュリティを有効にします\n" -#: pg_restore.c:496 +#: pg_restore.c:467 #, c-format msgid " --no-comments do not restore comments\n" msgstr " --no-comments コメントをリストアしない\n" -#: pg_restore.c:497 +#: pg_restore.c:468 #, c-format msgid "" " --no-data-for-failed-tables do not restore data of tables that could not be\n" @@ -2623,37 +2553,42 @@ msgstr "" " --no-data-for-failed-tables 作成できなかったテーッブルのデータはリストア\n" " しません\n" -#: pg_restore.c:499 +#: pg_restore.c:470 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications パブリケーションをリストアしない\n" -#: pg_restore.c:500 +#: pg_restore.c:471 #, c-format msgid " --no-security-labels do not restore security labels\n" msgstr " --no-security-labels セキュリティラベルをリストアしません\n" -#: pg_restore.c:501 +#: pg_restore.c:472 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions サブスクリプションをリストアしない\n" -#: pg_restore.c:502 +#: pg_restore.c:473 +#, c-format +msgid " --no-table-access-method do not restore table access methods\n" +msgstr " --no-table-access-method テーブルアクセスメソッドをリストアしない\n" + +#: pg_restore.c:474 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" msgstr " --no-tablespaces テーブル空間の割り当てをリストアしません\n" -#: pg_restore.c:503 +#: pg_restore.c:475 #, c-format msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n" msgstr " --section=SECTION 指定されたセクション(データ前部、データ、データ後部)をリストア\n" -#: pg_restore.c:516 +#: pg_restore.c:488 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" msgstr " --role=ROLENAME リストアに先立って SET ROLE します\n" -#: pg_restore.c:518 +#: pg_restore.c:490 #, c-format msgid "" "\n" @@ -2664,7 +2599,7 @@ msgstr "" " -I, -n, -N, -P, -t, -T および --section オプションは組み合わせて複数回\n" "指定することで複数のオブジェクトを指定できます。\n" -#: pg_restore.c:521 +#: pg_restore.c:493 #, c-format msgid "" "\n" @@ -2675,6 +2610,156 @@ msgstr "" "入力ファイル名が指定されない場合、標準入力が使用されます。\n" "\n" +#~ msgid "fatal: " +#~ msgstr "致命的エラー: " + +#~ msgid "pclose failed: %m" +#~ msgstr "pcloseが失敗しました: %m" + +#~ msgid "WSAStartup failed: %d" +#~ msgstr "WSAStartupが失敗しました: %d" + +#~ msgid "select() failed: %m" +#~ msgstr "select()が失敗しました: %m" + +#~ msgid "could not write to large object (result: %lu, expected: %lu)" +#~ msgstr "ラージオブジェクトを書き出すことができませんでした(結果は%lu、想定は%lu)" + +#~ msgid "connecting to database \"%s\" as user \"%s\"" +#~ msgstr "データベース\"%s\"にユーザ\"%s\"で接続しています" + +#~ msgid "could not reconnect to database" +#~ msgstr "データベースへの再接続ができませんでした" + +#~ msgid "could not reconnect to database: %s" +#~ msgstr "データベース%sへの再接続ができませんでした" + +#~ msgid "connection needs password" +#~ msgstr "接続にパスワードが必要です" + +#~ msgid "connection to database \"%s\" failed: %s" +#~ msgstr "データベース\"%s\"への接続が失敗しました: %s" + +#~ msgid "could not open temporary file" +#~ msgstr "一時ファイルをオープンできませんでした" + +#~ msgid "could not close tar member" +#~ msgstr "tarメンバをクローズできませんでした" + +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "詳細は \"%s --help\" を実行してください\n" + +#~ msgid "compression level must be in range 0..9" +#~ msgstr "圧縮レベルは 0..9 の範囲でなければなりません" + +#~ msgid "extra_float_digits must be in range -15..3" +#~ msgstr "extra_float_digitsは -15..3 の範囲でなければなりません" + +#~ msgid "invalid number of parallel jobs" +#~ msgstr "不正な並列ジョブ数" + +#~ msgid "" +#~ "Synchronized snapshots are not supported by this server version.\n" +#~ "Run with --no-synchronized-snapshots instead if you do not need\n" +#~ "synchronized snapshots." +#~ msgstr "" +#~ "同期スナップショットはこのサーババージョンではサポートされていません。\n" +#~ "同期スナップショットが不要ならば--no-synchronized-snapshotsを付けて\n" +#~ "実行してください。" + +#~ msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n" +#~ msgstr " --no-synchronized-snapshots 並列ジョブにおいて同期スナップショットを使用しない\n" + +#~ msgid "" +#~ "Synchronized snapshots on standby servers are not supported by this server version.\n" +#~ "Run with --no-synchronized-snapshots instead if you do not need\n" +#~ "synchronized snapshots." +#~ msgstr "" +#~ "同期スナップショットはこのサーババージョンではサポートされていません。\n" +#~ "同期スナップショットが不要ならば--no-synchronized-snapshotsを付けて\n" +#~ "実行してください。" + +#~ msgid "The command was: %s" +#~ msgstr "コマンド: %s" + +#~ msgid "reading row security enabled for table \"%s.%s\"" +#~ msgstr "テーブル\"%s.%s\"で有効な行セキュリティ設定を読み込んでいます" + +#~ msgid "reading policies for table \"%s.%s\"" +#~ msgstr "テーブル\"%s.%s\"のポリシを読み込んでいます" + +#~ msgid "owner of publication \"%s\" appears to be invalid" +#~ msgstr "パブリケーション\"%s\"の所有者が不正なようです" + +#~ msgid "owner of subscription \"%s\" appears to be invalid" +#~ msgstr "サブスクリプション\"%s\"の所有者が無効なようです" + +#~ msgid "could not parse subpublications array" +#~ msgstr "subpublications配列をパースできませんでした" + +#~ msgid "owner of schema \"%s\" appears to be invalid" +#~ msgstr "スキーマ\"%s\"の所有者が無効なようです" + +#~ msgid "owner of data type \"%s\" appears to be invalid" +#~ msgstr "データ型\"%s\"の所有者が無効なようです" + +#~ msgid "owner of operator \"%s\" appears to be invalid" +#~ msgstr "演算子\"%s\"の所有者が無効なようです" + +#~ msgid "owner of operator class \"%s\" appears to be invalid" +#~ msgstr "演算子クラス\"%s\"の所有者が無効なようです" + +#~ msgid "owner of operator family \"%s\" appears to be invalid" +#~ msgstr "演算子族\"%s\"の所有者が無効なようです" + +#~ msgid "owner of aggregate function \"%s\" appears to be invalid" +#~ msgstr "集約関数\"%s\"の所有者が無効なようです" + +#~ msgid "owner of function \"%s\" appears to be invalid" +#~ msgstr "関数\"%s\"の所有者が無効なようです" + +#~ msgid "owner of table \"%s\" appears to be invalid" +#~ msgstr "テーブル\"%s\"の所有者が無効なようです" + +#~ msgid "reading indexes for table \"%s.%s\"" +#~ msgstr "テーブル\"%s.%s\"のインデックスを読み込んでいます" + +#~ msgid "reading foreign key constraints for table \"%s.%s\"" +#~ msgstr "テーブル\"%s.%s\"の外部キー制約を読み込んでいます" + +#~ msgid "reading triggers for table \"%s.%s\"" +#~ msgstr "テーブル\"%s.%s\"のトリガを読み込んでいます" + +#~ msgid "finding the columns and types of table \"%s.%s\"" +#~ msgstr "テーブル\"%s.%s\"の列と型を探しています" + +#~ msgid "finding default expressions of table \"%s.%s\"" +#~ msgstr "テーブル\"%s.%s\"のデフォルト式を探しています" + +#~ msgid "finding check constraints for table \"%s.%s\"" +#~ msgstr "テーブル\"%s.%s\"の検査制約を探しています" + +#~ msgid "bogus value in proargmodes array" +#~ msgstr "proargmodes配列内におかしな値があります" + +#~ msgid "could not parse proallargtypes array" +#~ msgstr "proallargtypes配列のパースができませんでした" + +#~ msgid "could not parse proargmodes array" +#~ msgstr "proargmodes配列のパースができませんでした" + +#~ msgid "could not parse proargnames array" +#~ msgstr "proargnames配列のパースができませんでした" + +#~ msgid "could not parse proconfig array" +#~ msgstr "proconfig配列のパースができませんでした" + +#~ msgid "could not connect to database \"%s\": %s" +#~ msgstr "データベース\"%s\"へ接続できませんでした: %s" + +#~ msgid "maximum number of parallel jobs is %d" +#~ msgstr "並列ジョブ数の最大値は%dです" + #~ msgid "child process was terminated by signal %d" #~ msgstr "子プロセスがシグナル%dで終了しました" diff --git a/src/bin/pg_dump/po/ru.po b/src/bin/pg_dump/po/ru.po index 7235c01df1..8fb0062d9b 100644 --- a/src/bin/pg_dump/po/ru.po +++ b/src/bin/pg_dump/po/ru.po @@ -5,13 +5,13 @@ # Oleg Bartunov , 2004. # Sergey Burladyan , 2012. # Dmitriy Olshevskiy , 2014. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022. msgid "" msgstr "" "Project-Id-Version: pg_dump (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-02-08 07:28+0300\n" -"PO-Revision-Date: 2020-11-09 08:28+0300\n" +"POT-Creation-Date: 2021-12-01 11:26+0300\n" +"PO-Revision-Date: 2022-02-07 11:35+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -21,57 +21,57 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "важно: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "ошибка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "предупреждение: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "не удалось определить текущий каталог: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "неверный исполняемый файл \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "не удалось прочитать исполняемый файл \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "не удалось найти запускаемый файл \"%s\"" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не удалось перейти в каталог \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не удалось прочитать символическую ссылку \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:409 parallel.c:1614 #, c-format -msgid "pclose failed: %m" -msgstr "ошибка pclose: %m" +msgid "%s() failed: %m" +msgstr "ошибка в %s(): %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 msgid "out of memory" msgstr "нехватка памяти" @@ -311,19 +311,24 @@ msgstr "чтение участников публикаций" msgid "reading subscriptions" msgstr "чтение подписок" -#: common.c:1058 +#: common.c:338 +#, c-format +msgid "invalid number of parents %d for table \"%s\"" +msgstr "неверное число родителей (%d) для таблицы \"%s\"" + +#: common.c:1100 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "" "нарушение целостности: родительская таблица с OID %u для таблицы \"%s\" (OID " "%u) не найдена" -#: common.c:1100 +#: common.c:1142 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "не удалось разобрать числовой массив \"%s\": слишком много чисел" -#: common.c:1115 +#: common.c:1157 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "не удалось разобрать числовой массив \"%s\": неверный символ в числе" @@ -364,21 +369,21 @@ msgstr "не удалось распаковать данные: %s" msgid "could not close compression library: %s" msgstr "не удалось закрыть библиотеку сжатия: %s" -#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:557 pg_backup_tar.c:560 +#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:554 pg_backup_tar.c:557 #, c-format msgid "could not read from input file: %s" msgstr "не удалось прочитать входной файл: %s" -#: compress_io.c:623 pg_backup_custom.c:646 pg_backup_directory.c:552 -#: pg_backup_tar.c:793 pg_backup_tar.c:816 +#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553 +#: pg_backup_tar.c:790 pg_backup_tar.c:813 #, c-format msgid "could not read from input file: end of file" msgstr "не удалось прочитать входной файл: конец файла" #: parallel.c:254 #, c-format -msgid "WSAStartup failed: %d" -msgstr "ошибка WSAStartup: %d" +msgid "%s() failed: error code %d" +msgstr "ошибка в %s() (код ошибки: %d)" #: parallel.c:964 #, c-format @@ -392,8 +397,8 @@ msgstr "не удалось создать рабочий процесс: %m" #: parallel.c:1151 #, c-format -msgid "unrecognized command received from master: \"%s\"" -msgstr "от ведущего получена нераспознанная команда: \"%s\"" +msgid "unrecognized command received from leader: \"%s\"" +msgstr "от ведущего процесса получена нераспознанная команда: \"%s\"" #: parallel.c:1194 parallel.c:1432 #, c-format @@ -416,18 +421,13 @@ msgstr "" #: parallel.c:1415 #, c-format msgid "a worker process died unexpectedly" -msgstr "рабочий процесс неожиданно завершился" +msgstr "рабочий процесс неожиданно прервался" #: parallel.c:1537 parallel.c:1655 #, c-format msgid "could not write to the communication channel: %m" msgstr "не удалось записать в канал взаимодействия: %m" -#: parallel.c:1614 -#, c-format -msgid "select() failed: %m" -msgstr "ошибка в select(): %m" - #: parallel.c:1739 #, c-format msgid "pgpipe: could not create socket: error code %d" @@ -445,8 +445,8 @@ msgstr "pgpipe: не удалось начать приём (код ошибки #: parallel.c:1764 #, c-format -msgid "pgpipe: getsockname() failed: error code %d" -msgstr "pgpipe: ошибка в getsockname() (код ошибки: %d)" +msgid "pgpipe: %s() failed: error code %d" +msgstr "pgpipe: ошибка в %s() (код ошибки: %d)" #: parallel.c:1775 #, c-format @@ -463,36 +463,36 @@ msgstr "pgpipe: не удалось подключить сокет (код ош msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: не удалось принять соединение (код ошибки: %d)" -#: pg_backup_archiver.c:277 pg_backup_archiver.c:1587 +#: pg_backup_archiver.c:278 pg_backup_archiver.c:1578 #, c-format msgid "could not close output file: %m" msgstr "не удалось закрыть выходной файл: %m" -#: pg_backup_archiver.c:321 pg_backup_archiver.c:325 +#: pg_backup_archiver.c:322 pg_backup_archiver.c:326 #, c-format msgid "archive items not in correct section order" msgstr "в последовательности элементов архива нарушен порядок разделов" -#: pg_backup_archiver.c:331 +#: pg_backup_archiver.c:332 #, c-format msgid "unexpected section code %d" msgstr "неожиданный код раздела %d" -#: pg_backup_archiver.c:368 +#: pg_backup_archiver.c:369 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "" "параллельное восстановление не поддерживается с выбранным форматом архивного " "файла" -#: pg_backup_archiver.c:372 +#: pg_backup_archiver.c:373 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "" "параллельное восстановление возможно только для архивов, созданных pg_dump " "версии 8.0 и новее" -#: pg_backup_archiver.c:390 +#: pg_backup_archiver.c:391 #, c-format msgid "" "cannot restore from compressed archive (compression not supported in this " @@ -501,78 +501,78 @@ msgstr "" "восстановить данные из сжатого архива нельзя (установленная версия не " "поддерживает сжатие)" -#: pg_backup_archiver.c:407 +#: pg_backup_archiver.c:408 #, c-format msgid "connecting to database for restore" msgstr "подключение к базе данных для восстановления" -#: pg_backup_archiver.c:409 +#: pg_backup_archiver.c:410 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "" "прямые подключения к базе данных не поддерживаются в архивах до версии 1.3" -#: pg_backup_archiver.c:452 +#: pg_backup_archiver.c:453 #, c-format msgid "implied data-only restore" msgstr "подразумевается восстановление только данных" -#: pg_backup_archiver.c:518 +#: pg_backup_archiver.c:519 #, c-format msgid "dropping %s %s" msgstr "удаляется %s %s" -#: pg_backup_archiver.c:613 +#: pg_backup_archiver.c:614 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "не удалось определить, куда добавить IF EXISTS в оператор \"%s\"" -#: pg_backup_archiver.c:769 pg_backup_archiver.c:771 +#: pg_backup_archiver.c:770 pg_backup_archiver.c:772 #, c-format msgid "warning from original dump file: %s" msgstr "предупреждение из исходного файла: %s" -#: pg_backup_archiver.c:786 +#: pg_backup_archiver.c:787 #, c-format msgid "creating %s \"%s.%s\"" msgstr "создаётся %s \"%s.%s\"" -#: pg_backup_archiver.c:789 +#: pg_backup_archiver.c:790 #, c-format msgid "creating %s \"%s\"" msgstr "создаётся %s \"%s\"" -#: pg_backup_archiver.c:839 +#: pg_backup_archiver.c:840 #, c-format msgid "connecting to new database \"%s\"" msgstr "подключение к новой базе данных \"%s\"" -#: pg_backup_archiver.c:866 +#: pg_backup_archiver.c:867 #, c-format msgid "processing %s" msgstr "обрабатывается %s" -#: pg_backup_archiver.c:886 +#: pg_backup_archiver.c:887 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "обрабатываются данные таблицы \"%s.%s\"" -#: pg_backup_archiver.c:948 +#: pg_backup_archiver.c:949 #, c-format msgid "executing %s %s" msgstr "выполняется %s %s" -#: pg_backup_archiver.c:987 +#: pg_backup_archiver.c:988 #, c-format msgid "disabling triggers for %s" msgstr "отключаются триггеры таблицы %s" -#: pg_backup_archiver.c:1013 +#: pg_backup_archiver.c:1014 #, c-format msgid "enabling triggers for %s" msgstr "включаются триггеры таблицы %s" -#: pg_backup_archiver.c:1041 +#: pg_backup_archiver.c:1042 #, c-format msgid "" "internal error -- WriteData cannot be called outside the context of a " @@ -581,12 +581,12 @@ msgstr "" "внутренняя ошибка -- WriteData нельзя вызывать вне контекста процедуры " "DataDumper" -#: pg_backup_archiver.c:1224 +#: pg_backup_archiver.c:1225 #, c-format msgid "large-object output not supported in chosen format" msgstr "выбранный формат не поддерживает выгрузку больших объектов" -#: pg_backup_archiver.c:1282 +#: pg_backup_archiver.c:1283 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" @@ -594,17 +594,17 @@ msgstr[0] "восстановлен %d большой объект" msgstr[1] "восстановлено %d больших объекта" msgstr[2] "восстановлено %d больших объектов" -#: pg_backup_archiver.c:1303 pg_backup_tar.c:736 +#: pg_backup_archiver.c:1304 pg_backup_tar.c:733 #, c-format msgid "restoring large object with OID %u" msgstr "восстановление большого объекта с OID %u" -#: pg_backup_archiver.c:1315 +#: pg_backup_archiver.c:1316 #, c-format msgid "could not create large object %u: %s" msgstr "не удалось создать большой объект %u: %s" -#: pg_backup_archiver.c:1320 pg_dump.c:3552 +#: pg_backup_archiver.c:1321 pg_dump.c:3673 #, c-format msgid "could not open large object %u: %s" msgstr "не удалось открыть большой объект %u: %s" @@ -614,247 +614,247 @@ msgstr "не удалось открыть большой объект %u: %s" msgid "could not open TOC file \"%s\": %m" msgstr "не удалось открыть файл оглавления \"%s\": %m" -#: pg_backup_archiver.c:1417 +#: pg_backup_archiver.c:1405 #, c-format msgid "line ignored: %s" msgstr "строка проигнорирована: %s" -#: pg_backup_archiver.c:1424 +#: pg_backup_archiver.c:1412 #, c-format msgid "could not find entry for ID %d" msgstr "не найдена запись для ID %d" -#: pg_backup_archiver.c:1445 pg_backup_directory.c:222 -#: pg_backup_directory.c:598 +#: pg_backup_archiver.c:1435 pg_backup_directory.c:222 +#: pg_backup_directory.c:599 #, c-format msgid "could not close TOC file: %m" msgstr "не удалось закрыть файл оглавления: %m" -#: pg_backup_archiver.c:1559 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:585 pg_backup_directory.c:648 -#: pg_backup_directory.c:667 pg_dumpall.c:484 +#: pg_backup_archiver.c:1549 pg_backup_custom.c:156 pg_backup_directory.c:332 +#: pg_backup_directory.c:586 pg_backup_directory.c:649 +#: pg_backup_directory.c:668 pg_dumpall.c:489 #, c-format msgid "could not open output file \"%s\": %m" msgstr "не удалось открыть выходной файл \"%s\": %m" -#: pg_backup_archiver.c:1561 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1551 pg_backup_custom.c:162 #, c-format msgid "could not open output file: %m" msgstr "не удалось открыть выходной файл: %m" -#: pg_backup_archiver.c:1654 +#: pg_backup_archiver.c:1645 #, c-format -msgid "wrote %lu byte of large object data (result = %lu)" -msgid_plural "wrote %lu bytes of large object data (result = %lu)" -msgstr[0] "записан %lu байт данных большого объекта (результат = %lu)" -msgstr[1] "записано %lu байта данных большого объекта (результат = %lu)" -msgstr[2] "записано %lu байт данных большого объекта (результат = %lu)" +msgid "wrote %zu byte of large object data (result = %d)" +msgid_plural "wrote %zu bytes of large object data (result = %d)" +msgstr[0] "записан %zu байт данных большого объекта (результат = %d)" +msgstr[1] "записано %zu байта данных большого объекта (результат = %d)" +msgstr[2] "записано %zu байт данных большого объекта (результат = %d)" -#: pg_backup_archiver.c:1659 +#: pg_backup_archiver.c:1651 #, c-format -msgid "could not write to large object (result: %lu, expected: %lu)" -msgstr "не удалось записать большой объект (результат: %lu, ожидалось: %lu)" +msgid "could not write to large object: %s" +msgstr "не удалось записать данные в большой объект: %s" -#: pg_backup_archiver.c:1749 +#: pg_backup_archiver.c:1741 #, c-format msgid "while INITIALIZING:" msgstr "при инициализации:" -#: pg_backup_archiver.c:1754 +#: pg_backup_archiver.c:1746 #, c-format msgid "while PROCESSING TOC:" msgstr "при обработке оглавления:" -#: pg_backup_archiver.c:1759 +#: pg_backup_archiver.c:1751 #, c-format msgid "while FINALIZING:" msgstr "при завершении:" -#: pg_backup_archiver.c:1764 +#: pg_backup_archiver.c:1756 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "из записи оглавления %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1840 +#: pg_backup_archiver.c:1832 #, c-format msgid "bad dumpId" msgstr "неверный dumpId" -#: pg_backup_archiver.c:1861 +#: pg_backup_archiver.c:1853 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "неверный dumpId таблицы в элементе TABLE DATA" -#: pg_backup_archiver.c:1953 +#: pg_backup_archiver.c:1945 #, c-format msgid "unexpected data offset flag %d" msgstr "неожиданный флаг смещения данных: %d" -#: pg_backup_archiver.c:1966 +#: pg_backup_archiver.c:1958 #, c-format msgid "file offset in dump file is too large" msgstr "слишком большое смещение в файле выгрузки" -#: pg_backup_archiver.c:2103 pg_backup_archiver.c:2113 +#: pg_backup_archiver.c:2096 pg_backup_archiver.c:2106 #, c-format msgid "directory name too long: \"%s\"" msgstr "слишком длинное имя каталога: \"%s\"" -#: pg_backup_archiver.c:2121 +#: pg_backup_archiver.c:2114 #, c-format msgid "" "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not " "exist)" msgstr "каталог \"%s\" не похож на архивный (в нём отсутствует \"toc.dat\")" -#: pg_backup_archiver.c:2129 pg_backup_custom.c:173 pg_backup_custom.c:812 -#: pg_backup_directory.c:207 pg_backup_directory.c:394 +#: pg_backup_archiver.c:2122 pg_backup_custom.c:173 pg_backup_custom.c:807 +#: pg_backup_directory.c:207 pg_backup_directory.c:395 #, c-format msgid "could not open input file \"%s\": %m" msgstr "не удалось открыть входной файл \"%s\": %m" -#: pg_backup_archiver.c:2136 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2129 pg_backup_custom.c:179 #, c-format msgid "could not open input file: %m" msgstr "не удалось открыть входной файл: %m" -#: pg_backup_archiver.c:2142 +#: pg_backup_archiver.c:2135 #, c-format msgid "could not read input file: %m" msgstr "не удалось прочитать входной файл: %m" -#: pg_backup_archiver.c:2144 +#: pg_backup_archiver.c:2137 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "входной файл слишком короткий (прочитано байт: %lu, ожидалось: 5)" -#: pg_backup_archiver.c:2229 +#: pg_backup_archiver.c:2169 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "" "входной файл, видимо, имеет текстовый формат. Загрузите его с помощью psql." -#: pg_backup_archiver.c:2235 +#: pg_backup_archiver.c:2175 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "входной файл не похож на архив (возможно, слишком мал?)" -#: pg_backup_archiver.c:2241 +#: pg_backup_archiver.c:2181 #, c-format msgid "input file does not appear to be a valid archive" msgstr "входной файл не похож на архив" -#: pg_backup_archiver.c:2261 +#: pg_backup_archiver.c:2190 #, c-format msgid "could not close input file: %m" msgstr "не удалось закрыть входной файл: %m" -#: pg_backup_archiver.c:2373 +#: pg_backup_archiver.c:2307 #, c-format msgid "unrecognized file format \"%d\"" msgstr "неопознанный формат файла: \"%d\"" -#: pg_backup_archiver.c:2455 pg_backup_archiver.c:4458 +#: pg_backup_archiver.c:2389 pg_backup_archiver.c:4413 #, c-format msgid "finished item %d %s %s" msgstr "закончен объект %d %s %s" -#: pg_backup_archiver.c:2459 pg_backup_archiver.c:4471 +#: pg_backup_archiver.c:2393 pg_backup_archiver.c:4426 #, c-format msgid "worker process failed: exit code %d" msgstr "рабочий процесс завершился с кодом возврата %d" -#: pg_backup_archiver.c:2579 +#: pg_backup_archiver.c:2513 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "ID записи %d вне диапазона - возможно повреждено оглавление" -#: pg_backup_archiver.c:2646 +#: pg_backup_archiver.c:2580 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "восстановление таблиц со свойством WITH OIDS больше не поддерживается" -#: pg_backup_archiver.c:2728 +#: pg_backup_archiver.c:2662 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "нераспознанная кодировка \"%s\"" -#: pg_backup_archiver.c:2733 +#: pg_backup_archiver.c:2667 #, c-format msgid "invalid ENCODING item: %s" msgstr "неверный элемент ENCODING: %s" -#: pg_backup_archiver.c:2751 +#: pg_backup_archiver.c:2685 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "неверный элемент STDSTRINGS: %s" -#: pg_backup_archiver.c:2776 +#: pg_backup_archiver.c:2710 #, c-format msgid "schema \"%s\" not found" msgstr "схема \"%s\" не найдена" -#: pg_backup_archiver.c:2783 +#: pg_backup_archiver.c:2717 #, c-format msgid "table \"%s\" not found" msgstr "таблица \"%s\" не найдена" -#: pg_backup_archiver.c:2790 +#: pg_backup_archiver.c:2724 #, c-format msgid "index \"%s\" not found" msgstr "индекс \"%s\" не найден" -#: pg_backup_archiver.c:2797 +#: pg_backup_archiver.c:2731 #, c-format msgid "function \"%s\" not found" msgstr "функция \"%s\" не найдена" -#: pg_backup_archiver.c:2804 +#: pg_backup_archiver.c:2738 #, c-format msgid "trigger \"%s\" not found" msgstr "триггер \"%s\" не найден" -#: pg_backup_archiver.c:3196 +#: pg_backup_archiver.c:3130 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "не удалось переключить пользователя сессии на \"%s\": %s" -#: pg_backup_archiver.c:3328 +#: pg_backup_archiver.c:3262 #, c-format msgid "could not set search_path to \"%s\": %s" msgstr "не удалось присвоить search_path значение \"%s\": %s" -#: pg_backup_archiver.c:3390 +#: pg_backup_archiver.c:3324 #, c-format msgid "could not set default_tablespace to %s: %s" msgstr "не удалось задать для default_tablespace значение %s: %s" -#: pg_backup_archiver.c:3435 +#: pg_backup_archiver.c:3369 #, c-format msgid "could not set default_table_access_method: %s" msgstr "не удалось задать default_table_access_method: %s" -#: pg_backup_archiver.c:3527 pg_backup_archiver.c:3685 +#: pg_backup_archiver.c:3461 pg_backup_archiver.c:3619 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "неизвестно, как назначить владельца для объекта типа \"%s\"" -#: pg_backup_archiver.c:3789 +#: pg_backup_archiver.c:3722 #, c-format msgid "did not find magic string in file header" msgstr "в заголовке файла не найдена нужная сигнатура" -#: pg_backup_archiver.c:3802 +#: pg_backup_archiver.c:3736 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "неподдерживаемая версия (%d.%d) в заголовке файла" -#: pg_backup_archiver.c:3807 +#: pg_backup_archiver.c:3741 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "несоответствие размера integer (%lu)" -#: pg_backup_archiver.c:3811 +#: pg_backup_archiver.c:3745 #, c-format msgid "" "archive was made on a machine with larger integers, some operations might " @@ -863,12 +863,12 @@ msgstr "" "архив был сделан на компьютере большей разрядности -- возможен сбой " "некоторых операций" -#: pg_backup_archiver.c:3821 +#: pg_backup_archiver.c:3755 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "ожидаемый формат (%d) отличается от формата, указанного в файле (%d)" -#: pg_backup_archiver.c:3837 +#: pg_backup_archiver.c:3770 #, c-format msgid "" "archive is compressed, but this installation does not support compression -- " @@ -877,68 +877,68 @@ msgstr "" "архив сжат, но установленная версия не поддерживает сжатие -- данные " "недоступны" -#: pg_backup_archiver.c:3855 +#: pg_backup_archiver.c:3804 #, c-format msgid "invalid creation date in header" msgstr "неверная дата создания в заголовке" -#: pg_backup_archiver.c:3983 +#: pg_backup_archiver.c:3938 #, c-format msgid "processing item %d %s %s" msgstr "обработка объекта %d %s %s" -#: pg_backup_archiver.c:4062 +#: pg_backup_archiver.c:4017 #, c-format msgid "entering main parallel loop" msgstr "вход в основной параллельный цикл" -#: pg_backup_archiver.c:4073 +#: pg_backup_archiver.c:4028 #, c-format msgid "skipping item %d %s %s" msgstr "объект %d %s %s пропускается" -#: pg_backup_archiver.c:4082 +#: pg_backup_archiver.c:4037 #, c-format msgid "launching item %d %s %s" msgstr "объект %d %s %s запускается" -#: pg_backup_archiver.c:4136 +#: pg_backup_archiver.c:4091 #, c-format msgid "finished main parallel loop" msgstr "основной параллельный цикл закончен" -#: pg_backup_archiver.c:4172 +#: pg_backup_archiver.c:4127 #, c-format msgid "processing missed item %d %s %s" msgstr "обработка пропущенного объекта %d %s %s" -#: pg_backup_archiver.c:4777 +#: pg_backup_archiver.c:4732 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "создать таблицу \"%s\" не удалось, её данные не будут восстановлены" -#: pg_backup_custom.c:378 pg_backup_null.c:147 +#: pg_backup_custom.c:376 pg_backup_null.c:147 #, c-format msgid "invalid OID for large object" msgstr "неверный OID большого объекта" -#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:632 -#: pg_backup_custom.c:870 pg_backup_tar.c:1086 pg_backup_tar.c:1091 +#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629 +#: pg_backup_custom.c:865 pg_backup_tar.c:1083 pg_backup_tar.c:1088 #, c-format msgid "error during file seek: %m" msgstr "ошибка при перемещении в файле: %m" -#: pg_backup_custom.c:480 +#: pg_backup_custom.c:478 #, c-format msgid "data block %d has wrong seek position" msgstr "в блоке данных %d задана неверная позиция" -#: pg_backup_custom.c:497 +#: pg_backup_custom.c:495 #, c-format msgid "unrecognized data block type (%d) while searching archive" msgstr "нераспознанный тип блока данных (%d) при поиске архива" -#: pg_backup_custom.c:519 +#: pg_backup_custom.c:517 #, c-format msgid "" "could not find block ID %d in archive -- possibly due to out-of-order " @@ -948,74 +948,74 @@ msgstr "" "последовательного запроса восстановления, который нельзя обработать с " "файлом, не допускающим произвольный доступ" -#: pg_backup_custom.c:524 +#: pg_backup_custom.c:522 #, c-format msgid "could not find block ID %d in archive -- possibly corrupt archive" msgstr "не удалось найти в архиве блок с ID %d -- возможно, архив испорчен" -#: pg_backup_custom.c:531 +#: pg_backup_custom.c:529 #, c-format msgid "found unexpected block ID (%d) when reading data -- expected %d" msgstr "при чтении данных получен неожиданный ID блока (%d) -- ожидался: %d" -#: pg_backup_custom.c:545 +#: pg_backup_custom.c:543 #, c-format msgid "unrecognized data block type %d while restoring archive" msgstr "нераспознанный тип блока данных %d при восстановлении архива" -#: pg_backup_custom.c:648 +#: pg_backup_custom.c:645 #, c-format msgid "could not read from input file: %m" msgstr "не удалось прочитать входной файл: %m" -#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:948 -#: pg_backup_tar.c:1089 +#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943 +#: pg_backup_tar.c:1086 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "не удалось определить позицию в файле архива: %m" -#: pg_backup_custom.c:767 pg_backup_custom.c:807 +#: pg_backup_custom.c:762 pg_backup_custom.c:802 #, c-format msgid "could not close archive file: %m" msgstr "не удалось закрыть файл архива: %m" -#: pg_backup_custom.c:790 +#: pg_backup_custom.c:785 #, c-format msgid "can only reopen input archives" msgstr "повторно открыть можно только входные файлы" -#: pg_backup_custom.c:797 +#: pg_backup_custom.c:792 #, c-format msgid "parallel restore from standard input is not supported" msgstr "параллельное восстановление из стандартного ввода не поддерживается" -#: pg_backup_custom.c:799 +#: pg_backup_custom.c:794 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "" "параллельное восстановление возможно только с файлом произвольного доступа" -#: pg_backup_custom.c:815 +#: pg_backup_custom.c:810 #, c-format msgid "could not set seek position in archive file: %m" msgstr "не удалось задать текущую позицию в файле архива: %m" -#: pg_backup_custom.c:894 +#: pg_backup_custom.c:889 #, c-format msgid "compressor active" msgstr "сжатие активно" -#: pg_backup_db.c:41 +#: pg_backup_db.c:42 #, c-format msgid "could not get server_version from libpq" msgstr "не удалось получить версию сервера из libpq" -#: pg_backup_db.c:52 pg_dumpall.c:1826 +#: pg_backup_db.c:53 pg_dumpall.c:1826 #, c-format msgid "server version: %s; %s version: %s" msgstr "версия сервера: %s; версия %s: %s" -#: pg_backup_db.c:54 pg_dumpall.c:1828 +#: pg_backup_db.c:55 pg_dumpall.c:1828 #, c-format msgid "aborting because of server version mismatch" msgstr "продолжение работы с другой версией сервера невозможно" @@ -1025,41 +1025,36 @@ msgstr "продолжение работы с другой версией се msgid "already connected to a database" msgstr "подключение к базе данных уже установлено" -#: pg_backup_db.c:133 pg_backup_db.c:185 pg_dumpall.c:1651 pg_dumpall.c:1764 +#: pg_backup_db.c:132 pg_backup_db.c:182 pg_dumpall.c:1655 pg_dumpall.c:1766 msgid "Password: " msgstr "Пароль: " -#: pg_backup_db.c:177 +#: pg_backup_db.c:174 #, c-format msgid "could not connect to database" msgstr "не удалось переподключиться к базе" -#: pg_backup_db.c:195 -#, c-format -msgid "reconnection to database \"%s\" failed: %s" -msgstr "не удалось переподключиться к базе \"%s\": %s" - -#: pg_backup_db.c:199 +#: pg_backup_db.c:191 #, c-format -msgid "connection to database \"%s\" failed: %s" -msgstr "не удалось подключиться к базе \"%s\": %s" +msgid "reconnection failed: %s" +msgstr "переподключиться не удалось: %s" -#: pg_backup_db.c:272 pg_dumpall.c:1684 +#: pg_backup_db.c:194 pg_backup_db.c:269 pg_dumpall.c:1686 pg_dumpall.c:1776 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:279 pg_dumpall.c:1889 pg_dumpall.c:1912 +#: pg_backup_db.c:276 pg_dumpall.c:1889 pg_dumpall.c:1912 #, c-format msgid "query failed: %s" msgstr "ошибка при выполнении запроса: %s" -#: pg_backup_db.c:281 pg_dumpall.c:1890 pg_dumpall.c:1913 +#: pg_backup_db.c:278 pg_dumpall.c:1890 pg_dumpall.c:1913 #, c-format msgid "query was: %s" msgstr "запрос: %s" -#: pg_backup_db.c:322 +#: pg_backup_db.c:319 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" @@ -1068,40 +1063,40 @@ msgstr[1] "запрос вернул %d строки вместо одной: %s msgstr[2] "запрос вернул %d строк вместо одной: %s" # skip-rule: language-mix -#: pg_backup_db.c:358 +#: pg_backup_db.c:355 #, c-format msgid "%s: %sCommand was: %s" msgstr "%s: %sВыполнялась команда: %s" -#: pg_backup_db.c:414 pg_backup_db.c:488 pg_backup_db.c:495 +#: pg_backup_db.c:411 pg_backup_db.c:485 pg_backup_db.c:492 msgid "could not execute query" msgstr "не удалось выполнить запрос" -#: pg_backup_db.c:467 +#: pg_backup_db.c:464 #, c-format msgid "error returned by PQputCopyData: %s" msgstr "ошибка в PQputCopyData: %s" -#: pg_backup_db.c:516 +#: pg_backup_db.c:513 #, c-format msgid "error returned by PQputCopyEnd: %s" msgstr "ошибка в PQputCopyEnd: %s" -#: pg_backup_db.c:522 +#: pg_backup_db.c:519 #, c-format msgid "COPY failed for table \"%s\": %s" msgstr "сбой команды COPY для таблицы \"%s\": %s" -#: pg_backup_db.c:528 pg_dump.c:1988 +#: pg_backup_db.c:525 pg_dump.c:2074 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "неожиданные лишние результаты получены при COPY для таблицы \"%s\"" -#: pg_backup_db.c:540 +#: pg_backup_db.c:537 msgid "could not start database transaction" msgstr "не удаётся начать транзакцию" -#: pg_backup_db.c:548 +#: pg_backup_db.c:545 msgid "could not commit database transaction" msgstr "не удалось зафиксировать транзакцию" @@ -1123,46 +1118,61 @@ msgstr "не удалось закрыть каталог \"%s\": %m" #: pg_backup_directory.c:195 #, c-format msgid "could not create directory \"%s\": %m" -msgstr "создать каталог \"%s\" не удалось: %m" +msgstr "не удалось создать каталог \"%s\": %m" -#: pg_backup_directory.c:355 pg_backup_directory.c:496 -#: pg_backup_directory.c:532 +#: pg_backup_directory.c:355 pg_backup_directory.c:497 +#: pg_backup_directory.c:533 #, c-format msgid "could not write to output file: %s" msgstr "не удалось записать в выходной файл: %s" -#: pg_backup_directory.c:406 +#: pg_backup_directory.c:373 +#, c-format +msgid "could not close data file: %m" +msgstr "не удалось закрыть файл данных: %m" + +#: pg_backup_directory.c:407 #, c-format msgid "could not close data file \"%s\": %m" msgstr "не удалось закрыть файл данных \"%s\": %m" -#: pg_backup_directory.c:446 +#: pg_backup_directory.c:447 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "" "не удалось открыть для чтения файл оглавления больших объектов \"%s\": %m" -#: pg_backup_directory.c:457 +#: pg_backup_directory.c:458 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "неверная строка в файле оглавления больших объектов \"%s\": \"%s\"" -#: pg_backup_directory.c:466 +#: pg_backup_directory.c:467 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "ошибка чтения файла оглавления больших объектов \"%s\"" -#: pg_backup_directory.c:470 +#: pg_backup_directory.c:471 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "не удалось закрыть файл оглавления больших объектов \"%s\": %m" -#: pg_backup_directory.c:689 +#: pg_backup_directory.c:685 +#, c-format +msgid "could not close blob data file: %m" +msgstr "не удалось закрыть файл данных BLOB: %m" + +#: pg_backup_directory.c:691 #, c-format msgid "could not write to blobs TOC file" msgstr "не удалось записать в файл оглавления больших объектов" -#: pg_backup_directory.c:721 +#: pg_backup_directory.c:705 +#, c-format +msgid "could not close blobs TOC file: %m" +msgstr "не удалось закрыть файл оглавления BLOB: %m" + +#: pg_backup_directory.c:724 #, c-format msgid "file name too long: \"%s\"" msgstr "слишком длинное имя файла: \"%s\"" @@ -1182,7 +1192,7 @@ msgstr "не удалось открыть для записи файл огла msgid "could not open TOC file for output: %m" msgstr "не удалось открыть для записи файл оглавления: %m" -#: pg_backup_tar.c:203 pg_backup_tar.c:358 +#: pg_backup_tar.c:203 pg_backup_tar.c:352 #, c-format msgid "compression is not supported by tar archive format" msgstr "формат архива tar не поддерживает сжатие" @@ -1197,52 +1207,52 @@ msgstr "не удалось открыть для чтения файл огла msgid "could not open TOC file for input: %m" msgstr "не удалось открыть для чтения файл оглавления: %m" -#: pg_backup_tar.c:344 +#: pg_backup_tar.c:338 #, c-format msgid "could not find file \"%s\" in archive" msgstr "не удалось найти файл \"%s\" в архиве" -#: pg_backup_tar.c:410 +#: pg_backup_tar.c:404 #, c-format msgid "could not generate temporary file name: %m" msgstr "не удалось получить имя для временного файла: %m" -#: pg_backup_tar.c:421 +#: pg_backup_tar.c:415 #, c-format msgid "could not open temporary file" msgstr "не удалось открыть временный файл" -#: pg_backup_tar.c:448 +#: pg_backup_tar.c:444 #, c-format -msgid "could not close tar member" -msgstr "не удалось закрыть компонент tar-архива" +msgid "could not close tar member: %m" +msgstr "не удалось закрыть компонент tar-архива: %m" -#: pg_backup_tar.c:691 +#: pg_backup_tar.c:688 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "недопустимый синтаксис оператора COPY: \"%s\"" -#: pg_backup_tar.c:958 +#: pg_backup_tar.c:955 #, c-format msgid "invalid OID for large object (%u)" msgstr "неверный OID для большого объекта (%u)" -#: pg_backup_tar.c:1105 +#: pg_backup_tar.c:1102 #, c-format msgid "could not close temporary file: %m" msgstr "не удалось закрыть временный файл: %m" -#: pg_backup_tar.c:1114 +#: pg_backup_tar.c:1111 #, c-format msgid "actual file length (%s) does not match expected (%s)" msgstr "действительная длина файла (%s) не равна ожидаемой (%s)" -#: pg_backup_tar.c:1171 pg_backup_tar.c:1201 +#: pg_backup_tar.c:1168 pg_backup_tar.c:1199 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "в архиве tar не найден заголовок для файла \"%s\"" -#: pg_backup_tar.c:1189 +#: pg_backup_tar.c:1186 #, c-format msgid "" "restoring data out of order is not supported in this archive format: \"%s\" " @@ -1252,7 +1262,7 @@ msgstr "" "поддерживается: требуется компонент \"%s\", но в файле архива прежде идёт " "\"%s\"." -#: pg_backup_tar.c:1234 +#: pg_backup_tar.c:1233 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" @@ -1260,7 +1270,7 @@ msgstr[0] "найден неполный заголовок tar (размер %l msgstr[1] "найден неполный заголовок tar (размер %lu байта)" msgstr[2] "найден неполный заголовок tar (размер %lu байт)" -#: pg_backup_tar.c:1285 +#: pg_backup_tar.c:1284 #, c-format msgid "" "corrupt tar header found in %s (expected %d, computed %d) file position %s" @@ -1273,9 +1283,9 @@ msgstr "" msgid "unrecognized section name: \"%s\"" msgstr "нераспознанное имя раздела: \"%s\"" -#: pg_backup_utils.c:55 pg_dump.c:607 pg_dump.c:624 pg_dumpall.c:338 -#: pg_dumpall.c:348 pg_dumpall.c:357 pg_dumpall.c:366 pg_dumpall.c:374 -#: pg_dumpall.c:388 pg_dumpall.c:464 pg_restore.c:284 pg_restore.c:300 +#: pg_backup_utils.c:55 pg_dump.c:622 pg_dump.c:639 pg_dumpall.c:341 +#: pg_dumpall.c:351 pg_dumpall.c:360 pg_dumpall.c:369 pg_dumpall.c:377 +#: pg_dumpall.c:391 pg_dumpall.c:469 pg_restore.c:284 pg_restore.c:300 #: pg_restore.c:318 #, c-format msgid "Try \"%s --help\" for more information.\n" @@ -1286,56 +1296,56 @@ msgstr "Для дополнительной информации попробу msgid "out of on_exit_nicely slots" msgstr "превышен предел обработчиков штатного выхода" -#: pg_dump.c:533 +#: pg_dump.c:548 #, c-format msgid "compression level must be in range 0..9" msgstr "уровень сжатия должен быть в диапазоне 0..9" -#: pg_dump.c:571 +#: pg_dump.c:586 #, c-format msgid "extra_float_digits must be in range -15..3" msgstr "значение extra_float_digits должно быть в диапазоне -15..3" -#: pg_dump.c:594 +#: pg_dump.c:609 #, c-format msgid "rows-per-insert must be in range %d..%d" msgstr "значение rows-per-insert должно быть в диапазоне %d..%d" -#: pg_dump.c:622 pg_dumpall.c:346 pg_restore.c:298 +#: pg_dump.c:637 pg_dumpall.c:349 pg_restore.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "слишком много аргументов командной строки (первый: \"%s\")" -#: pg_dump.c:643 pg_restore.c:327 +#: pg_dump.c:658 pg_restore.c:327 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "параметры -s/--schema-only и -a/--data-only исключают друг друга" -#: pg_dump.c:648 +#: pg_dump.c:663 #, c-format msgid "" "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "" "параметры -s/--schema-only и --include-foreign-data исключают друг друга" -#: pg_dump.c:651 +#: pg_dump.c:666 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "" "параметр --include-foreign-data не поддерживается при копировании в " "параллельном режиме" -#: pg_dump.c:655 pg_restore.c:333 +#: pg_dump.c:670 pg_restore.c:333 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "параметры -c/--clean и -a/--data-only исключают друг друга" -#: pg_dump.c:660 pg_dumpall.c:381 pg_restore.c:382 +#: pg_dump.c:675 pg_dumpall.c:384 pg_restore.c:382 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "параметр --if-exists требует указания -c/--clean" -#: pg_dump.c:667 +#: pg_dump.c:682 #, c-format msgid "" "option --on-conflict-do-nothing requires option --inserts, --rows-per-" @@ -1344,7 +1354,7 @@ msgstr "" "параметр --on-conflict-do-nothing требует указания --inserts, --rows-per-" "insert или --column-inserts" -#: pg_dump.c:689 +#: pg_dump.c:704 #, c-format msgid "" "requested compression not available in this installation -- archive will be " @@ -1353,19 +1363,19 @@ msgstr "" "установленная версия программы не поддерживает сжатие -- архив не будет " "сжиматься" -#: pg_dump.c:710 pg_restore.c:349 +#: pg_dump.c:725 pg_restore.c:349 #, c-format msgid "invalid number of parallel jobs" msgstr "неверное число параллельных заданий" -#: pg_dump.c:714 +#: pg_dump.c:729 #, c-format msgid "parallel backup only supported by the directory format" msgstr "" "параллельное резервное копирование поддерживается только с форматом \"каталог" "\"" -#: pg_dump.c:769 +#: pg_dump.c:784 #, c-format msgid "" "Synchronized snapshots are not supported by this server version.\n" @@ -1376,27 +1386,32 @@ msgstr "" "Если они вам не нужны, укажите при запуске ключ\n" "--no-synchronized-snapshots." -#: pg_dump.c:775 +#: pg_dump.c:790 #, c-format msgid "Exported snapshots are not supported by this server version." msgstr "Экспортированные снимки не поддерживаются этой версией сервера." -#: pg_dump.c:787 +#: pg_dump.c:802 #, c-format msgid "last built-in OID is %u" msgstr "последний системный OID: %u" -#: pg_dump.c:796 +#: pg_dump.c:811 #, c-format msgid "no matching schemas were found" msgstr "соответствующие схемы не найдены" -#: pg_dump.c:810 +#: pg_dump.c:825 #, c-format msgid "no matching tables were found" msgstr "соответствующие таблицы не найдены" -#: pg_dump.c:990 +#: pg_dump.c:847 +#, c-format +msgid "no matching extensions were found" +msgstr "соответствующие расширения не найдены" + +#: pg_dump.c:1017 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1405,17 +1420,17 @@ msgstr "" "%s сохраняет резервную копию БД в текстовом файле или другом виде.\n" "\n" -#: pg_dump.c:991 pg_dumpall.c:617 pg_restore.c:462 +#: pg_dump.c:1018 pg_dumpall.c:622 pg_restore.c:462 #, c-format msgid "Usage:\n" msgstr "Использование:\n" -#: pg_dump.c:992 +#: pg_dump.c:1019 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [ПАРАМЕТР]... [ИМЯ_БД]\n" -#: pg_dump.c:994 pg_dumpall.c:620 pg_restore.c:465 +#: pg_dump.c:1021 pg_dumpall.c:625 pg_restore.c:465 #, c-format msgid "" "\n" @@ -1424,12 +1439,12 @@ msgstr "" "\n" "Общие параметры:\n" -#: pg_dump.c:995 +#: pg_dump.c:1022 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=ИМЯ имя выходного файла или каталога\n" -#: pg_dump.c:996 +#: pg_dump.c:1023 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1439,7 +1454,7 @@ msgstr "" " (пользовательский | каталог | tar |\n" " текстовый (по умолчанию))\n" -#: pg_dump.c:998 +#: pg_dump.c:1025 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr "" @@ -1447,23 +1462,23 @@ msgstr "" "число\n" " заданий\n" -#: pg_dump.c:999 pg_dumpall.c:622 +#: pg_dump.c:1026 pg_dumpall.c:627 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose режим подробных сообщений\n" -#: pg_dump.c:1000 pg_dumpall.c:623 +#: pg_dump.c:1027 pg_dumpall.c:628 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: pg_dump.c:1001 +#: pg_dump.c:1028 #, c-format msgid "" " -Z, --compress=0-9 compression level for compressed formats\n" msgstr " -Z, --compress=0-9 уровень сжатия при архивации\n" -#: pg_dump.c:1002 pg_dumpall.c:624 +#: pg_dump.c:1029 pg_dumpall.c:629 #, c-format msgid "" " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" @@ -1471,7 +1486,7 @@ msgstr "" " --lock-wait-timeout=ТАЙМ-АУТ прервать операцию при тайм-ауте блокировки " "таблицы\n" -#: pg_dump.c:1003 pg_dumpall.c:651 +#: pg_dump.c:1030 pg_dumpall.c:656 #, c-format msgid "" " --no-sync do not wait for changes to be written safely " @@ -1480,12 +1495,12 @@ msgstr "" " --no-sync не ждать надёжного сохранения изменений на " "диске\n" -#: pg_dump.c:1004 pg_dumpall.c:625 +#: pg_dump.c:1031 pg_dumpall.c:630 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: pg_dump.c:1006 pg_dumpall.c:626 +#: pg_dump.c:1033 pg_dumpall.c:631 #, c-format msgid "" "\n" @@ -1494,22 +1509,22 @@ msgstr "" "\n" "Параметры, управляющие выводом:\n" -#: pg_dump.c:1007 pg_dumpall.c:627 +#: pg_dump.c:1034 pg_dumpall.c:632 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only выгрузить только данные, без схемы\n" -#: pg_dump.c:1008 +#: pg_dump.c:1035 #, c-format msgid " -b, --blobs include large objects in dump\n" msgstr " -b, --blobs выгрузить также большие объекты\n" -#: pg_dump.c:1009 +#: pg_dump.c:1036 #, c-format msgid " -B, --no-blobs exclude large objects in dump\n" msgstr " -B, --no-blobs исключить из выгрузки большие объекты\n" -#: pg_dump.c:1010 pg_restore.c:476 +#: pg_dump.c:1037 pg_restore.c:476 #, c-format msgid "" " -c, --clean clean (drop) database objects before " @@ -1518,7 +1533,7 @@ msgstr "" " -c, --clean очистить (удалить) объекты БД при " "восстановлении\n" -#: pg_dump.c:1011 +#: pg_dump.c:1038 #, c-format msgid "" " -C, --create include commands to create database in dump\n" @@ -1526,22 +1541,28 @@ msgstr "" " -C, --create добавить в копию команды создания базы " "данных\n" -#: pg_dump.c:1012 pg_dumpall.c:629 +#: pg_dump.c:1039 +#, c-format +msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" +msgstr "" +" -e, --extension=ШАБЛОН выгрузить только указанное расширение(я)\n" + +#: pg_dump.c:1040 pg_dumpall.c:634 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=КОДИРОВКА выгружать данные в заданной кодировке\n" -#: pg_dump.c:1013 +#: pg_dump.c:1041 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=ШАБЛОН выгрузить только указанную схему(ы)\n" -#: pg_dump.c:1014 +#: pg_dump.c:1042 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=ШАБЛОН НЕ выгружать указанную схему(ы)\n" -#: pg_dump.c:1015 +#: pg_dump.c:1043 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1550,12 +1571,12 @@ msgstr "" " -O, --no-owner не восстанавливать владение объектами\n" " при использовании текстового формата\n" -#: pg_dump.c:1017 pg_dumpall.c:633 +#: pg_dump.c:1045 pg_dumpall.c:638 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only выгрузить только схему, без данных\n" -#: pg_dump.c:1018 +#: pg_dump.c:1046 #, c-format msgid "" " -S, --superuser=NAME superuser user name to use in plain-text " @@ -1564,27 +1585,27 @@ msgstr "" " -S, --superuser=ИМЯ имя пользователя, который будет задействован\n" " при восстановлении из текстового формата\n" -#: pg_dump.c:1019 +#: pg_dump.c:1047 #, c-format msgid " -t, --table=PATTERN dump the specified table(s) only\n" msgstr " -t, --table=ШАБЛОН выгрузить только указанную таблицу(ы)\n" -#: pg_dump.c:1020 +#: pg_dump.c:1048 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=ШАБЛОН НЕ выгружать указанную таблицу(ы)\n" -#: pg_dump.c:1021 pg_dumpall.c:636 +#: pg_dump.c:1049 pg_dumpall.c:641 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges не выгружать права (назначение/отзыв)\n" -#: pg_dump.c:1022 pg_dumpall.c:637 +#: pg_dump.c:1050 pg_dumpall.c:642 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade только для утилит обновления БД\n" -#: pg_dump.c:1023 pg_dumpall.c:638 +#: pg_dump.c:1051 pg_dumpall.c:643 #, c-format msgid "" " --column-inserts dump data as INSERT commands with column " @@ -1593,7 +1614,7 @@ msgstr "" " --column-inserts выгружать данные в виде INSERT с именами " "столбцов\n" -#: pg_dump.c:1024 pg_dumpall.c:639 +#: pg_dump.c:1052 pg_dumpall.c:644 #, c-format msgid "" " --disable-dollar-quoting disable dollar quoting, use SQL standard " @@ -1602,7 +1623,7 @@ msgstr "" " --disable-dollar-quoting отключить спецстроки с $, выводить строки\n" " по стандарту SQL\n" -#: pg_dump.c:1025 pg_dumpall.c:640 pg_restore.c:493 +#: pg_dump.c:1053 pg_dumpall.c:645 pg_restore.c:493 #, c-format msgid "" " --disable-triggers disable triggers during data-only restore\n" @@ -1610,7 +1631,7 @@ msgstr "" " --disable-triggers отключить триггеры при восстановлении\n" " только данных, без схемы\n" -#: pg_dump.c:1026 +#: pg_dump.c:1054 #, c-format msgid "" " --enable-row-security enable row security (dump only content user " @@ -1621,7 +1642,7 @@ msgstr "" "только\n" " те данные, которые доступны пользователю)\n" -#: pg_dump.c:1028 +#: pg_dump.c:1056 #, c-format msgid "" " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" @@ -1629,7 +1650,7 @@ msgstr "" " --exclude-table-data=ШАБЛОН НЕ выгружать данные указанной таблицы " "(таблиц)\n" -#: pg_dump.c:1029 pg_dumpall.c:642 +#: pg_dump.c:1057 pg_dumpall.c:647 #, c-format msgid "" " --extra-float-digits=NUM override default setting for " @@ -1637,13 +1658,13 @@ msgid "" msgstr "" " --extra-float-digits=ЧИСЛО переопределить значение extra_float_digits\n" -#: pg_dump.c:1030 pg_dumpall.c:643 pg_restore.c:495 +#: pg_dump.c:1058 pg_dumpall.c:648 pg_restore.c:495 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr "" " --if-exists применять IF EXISTS при удалении объектов\n" -#: pg_dump.c:1031 +#: pg_dump.c:1059 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1654,7 +1675,7 @@ msgstr "" " включать в копию данные сторонних таблиц с\n" " серверов с именами, подпадающими под ШАБЛОН\n" -#: pg_dump.c:1034 pg_dumpall.c:644 +#: pg_dump.c:1062 pg_dumpall.c:649 #, c-format msgid "" " --inserts dump data as INSERT commands, rather than " @@ -1663,34 +1684,34 @@ msgstr "" " --inserts выгрузить данные в виде команд INSERT, не " "COPY\n" -#: pg_dump.c:1035 pg_dumpall.c:645 +#: pg_dump.c:1063 pg_dumpall.c:650 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr "" " --load-via-partition-root загружать секции через главную таблицу\n" -#: pg_dump.c:1036 pg_dumpall.c:646 +#: pg_dump.c:1064 pg_dumpall.c:651 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments не выгружать комментарии\n" -#: pg_dump.c:1037 pg_dumpall.c:647 +#: pg_dump.c:1065 pg_dumpall.c:652 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications не выгружать публикации\n" -#: pg_dump.c:1038 pg_dumpall.c:649 +#: pg_dump.c:1066 pg_dumpall.c:654 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr "" " --no-security-labels не выгружать назначения меток безопасности\n" -#: pg_dump.c:1039 pg_dumpall.c:650 +#: pg_dump.c:1067 pg_dumpall.c:655 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions не выгружать подписки\n" -#: pg_dump.c:1040 +#: pg_dump.c:1068 #, c-format msgid "" " --no-synchronized-snapshots do not use synchronized snapshots in parallel " @@ -1699,20 +1720,25 @@ msgstr "" " --no-synchronized-snapshots не использовать синхронизированные снимки\n" " в параллельных заданиях\n" -#: pg_dump.c:1041 pg_dumpall.c:652 +#: pg_dump.c:1069 pg_dumpall.c:657 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr "" " --no-tablespaces не выгружать назначения табличных " "пространств\n" -#: pg_dump.c:1042 pg_dumpall.c:653 +#: pg_dump.c:1070 pg_dumpall.c:658 +#, c-format +msgid " --no-toast-compression do not dump TOAST compression methods\n" +msgstr " --no-toast-compression не выгружать методы сжатия TOAST\n" + +#: pg_dump.c:1071 pg_dumpall.c:659 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr "" " --no-unlogged-table-data не выгружать данные нежурналируемых таблиц\n" -#: pg_dump.c:1043 pg_dumpall.c:654 +#: pg_dump.c:1072 pg_dumpall.c:660 #, c-format msgid "" " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT " @@ -1721,7 +1747,7 @@ msgstr "" " --on-conflict-do-nothing добавлять ON CONFLICT DO NOTHING в команды " "INSERT\n" -#: pg_dump.c:1044 pg_dumpall.c:655 +#: pg_dump.c:1073 pg_dumpall.c:661 #, c-format msgid "" " --quote-all-identifiers quote all identifiers, even if not key words\n" @@ -1729,7 +1755,7 @@ msgstr "" " --quote-all-identifiers заключать в кавычки все идентификаторы,\n" " а не только ключевые слова\n" -#: pg_dump.c:1045 pg_dumpall.c:656 +#: pg_dump.c:1074 pg_dumpall.c:662 #, c-format msgid "" " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" @@ -1737,7 +1763,7 @@ msgstr "" " --rows-per-insert=ЧИСЛО число строк в одном INSERT; подразумевает --" "inserts\n" -#: pg_dump.c:1046 +#: pg_dump.c:1075 #, c-format msgid "" " --section=SECTION dump named section (pre-data, data, or post-" @@ -1746,7 +1772,7 @@ msgstr "" " --section=РАЗДЕЛ выгрузить заданный раздел\n" " (pre-data, data или post-data)\n" -#: pg_dump.c:1047 +#: pg_dump.c:1076 #, c-format msgid "" " --serializable-deferrable wait until the dump can run without " @@ -1755,13 +1781,13 @@ msgstr "" " --serializable-deferrable дождаться момента для выгрузки данных без " "аномалий\n" -#: pg_dump.c:1048 +#: pg_dump.c:1077 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr "" " --snapshot=СНИМОК использовать при выгрузке заданный снимок\n" -#: pg_dump.c:1049 pg_restore.c:504 +#: pg_dump.c:1078 pg_restore.c:504 #, c-format msgid "" " --strict-names require table and/or schema include patterns " @@ -1774,7 +1800,7 @@ msgstr "" "минимум\n" " один объект\n" -#: pg_dump.c:1051 pg_dumpall.c:657 pg_restore.c:506 +#: pg_dump.c:1080 pg_dumpall.c:663 pg_restore.c:506 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1786,7 +1812,7 @@ msgstr "" " устанавливать владельца, используя команды\n" " SET SESSION AUTHORIZATION вместо ALTER OWNER\n" -#: pg_dump.c:1055 pg_dumpall.c:661 pg_restore.c:510 +#: pg_dump.c:1084 pg_dumpall.c:667 pg_restore.c:510 #, c-format msgid "" "\n" @@ -1795,33 +1821,33 @@ msgstr "" "\n" "Параметры подключения:\n" -#: pg_dump.c:1056 +#: pg_dump.c:1085 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=БД имя базы данных для выгрузки\n" -#: pg_dump.c:1057 pg_dumpall.c:663 pg_restore.c:511 +#: pg_dump.c:1086 pg_dumpall.c:669 pg_restore.c:511 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=ИМЯ имя сервера баз данных или каталог сокетов\n" -#: pg_dump.c:1058 pg_dumpall.c:665 pg_restore.c:512 +#: pg_dump.c:1087 pg_dumpall.c:671 pg_restore.c:512 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=ПОРТ номер порта сервера БД\n" -#: pg_dump.c:1059 pg_dumpall.c:666 pg_restore.c:513 +#: pg_dump.c:1088 pg_dumpall.c:672 pg_restore.c:513 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=ИМЯ имя пользователя баз данных\n" -#: pg_dump.c:1060 pg_dumpall.c:667 pg_restore.c:514 +#: pg_dump.c:1089 pg_dumpall.c:673 pg_restore.c:514 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password не запрашивать пароль\n" -#: pg_dump.c:1061 pg_dumpall.c:668 pg_restore.c:515 +#: pg_dump.c:1090 pg_dumpall.c:674 pg_restore.c:515 #, c-format msgid "" " -W, --password force password prompt (should happen " @@ -1829,12 +1855,12 @@ msgid "" msgstr "" " -W, --password запрашивать пароль всегда (обычно не требуется)\n" -#: pg_dump.c:1062 pg_dumpall.c:669 +#: pg_dump.c:1091 pg_dumpall.c:675 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ИМЯ_РОЛИ выполнить SET ROLE перед выгрузкой\n" -#: pg_dump.c:1064 +#: pg_dump.c:1093 #, c-format msgid "" "\n" @@ -1847,22 +1873,22 @@ msgstr "" "PGDATABASE.\n" "\n" -#: pg_dump.c:1066 pg_dumpall.c:673 pg_restore.c:522 +#: pg_dump.c:1095 pg_dumpall.c:679 pg_restore.c:522 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Об ошибках сообщайте по адресу <%s>.\n" -#: pg_dump.c:1067 pg_dumpall.c:674 pg_restore.c:523 +#: pg_dump.c:1096 pg_dumpall.c:680 pg_restore.c:523 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" -#: pg_dump.c:1086 pg_dumpall.c:499 +#: pg_dump.c:1115 pg_dumpall.c:504 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "указана неверная клиентская кодировка \"%s\"" -#: pg_dump.c:1232 +#: pg_dump.c:1261 #, c-format msgid "" "Synchronized snapshots on standby servers are not supported by this server " @@ -1875,179 +1901,184 @@ msgstr "" "Если они вам не нужны, укажите при запуске ключ\n" "--no-synchronized-snapshots." -#: pg_dump.c:1301 +#: pg_dump.c:1330 #, c-format msgid "invalid output format \"%s\" specified" msgstr "указан неверный формат вывода: \"%s\"" -#: pg_dump.c:1339 +#: pg_dump.c:1368 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "схемы, соответствующие шаблону \"%s\", не найдены" -#: pg_dump.c:1386 +#: pg_dump.c:1415 +#, c-format +msgid "no matching extensions were found for pattern \"%s\"" +msgstr "расширения, соответствующие шаблону \"%s\", не найдены" + +#: pg_dump.c:1462 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "сторонние серверы, соответствующие шаблону \"%s\", не найдены" -#: pg_dump.c:1449 +#: pg_dump.c:1525 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "таблицы, соответствующие шаблону \"%s\", не найдены" -#: pg_dump.c:1862 +#: pg_dump.c:1948 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "выгрузка содержимого таблицы \"%s.%s\"" -#: pg_dump.c:1969 +#: pg_dump.c:2055 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Ошибка выгрузки таблицы \"%s\": сбой в PQgetCopyData()." -#: pg_dump.c:1970 pg_dump.c:1980 +#: pg_dump.c:2056 pg_dump.c:2066 #, c-format msgid "Error message from server: %s" msgstr "Сообщение об ошибке с сервера: %s" -#: pg_dump.c:1971 pg_dump.c:1981 +#: pg_dump.c:2057 pg_dump.c:2067 #, c-format msgid "The command was: %s" msgstr "Выполнялась команда: %s" -#: pg_dump.c:1979 +#: pg_dump.c:2065 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Ошибка выгрузки таблицы \"%s\": сбой в PQgetResult()." -#: pg_dump.c:2739 +#: pg_dump.c:2147 +#, c-format +msgid "wrong number of fields retrieved from table \"%s\"" +msgstr "из таблицы \"%s\" получено неверное количество полей" + +#: pg_dump.c:2860 #, c-format msgid "saving database definition" msgstr "сохранение определения базы данных" -#: pg_dump.c:3211 +#: pg_dump.c:3332 #, c-format msgid "saving encoding = %s" msgstr "сохранение кодировки (%s)" -#: pg_dump.c:3236 +#: pg_dump.c:3357 #, c-format msgid "saving standard_conforming_strings = %s" msgstr "сохранение standard_conforming_strings (%s)" -#: pg_dump.c:3275 +#: pg_dump.c:3396 #, c-format msgid "could not parse result of current_schemas()" msgstr "не удалось разобрать результат current_schemas()" -#: pg_dump.c:3294 +#: pg_dump.c:3415 #, c-format msgid "saving search_path = %s" -msgstr "сохранение search_path (%s)" +msgstr "сохранение search_path = %s" -#: pg_dump.c:3334 +#: pg_dump.c:3455 #, c-format msgid "reading large objects" msgstr "чтение больших объектов" -#: pg_dump.c:3516 +#: pg_dump.c:3637 #, c-format msgid "saving large objects" msgstr "сохранение больших объектов" -#: pg_dump.c:3562 +#: pg_dump.c:3683 #, c-format msgid "error reading large object %u: %s" msgstr "ошибка чтения большого объекта %u: %s" -#: pg_dump.c:3614 -#, c-format -msgid "reading row security enabled for table \"%s.%s\"" -msgstr "чтение информации о защите строк для таблицы \"%s.%s\"" - -#: pg_dump.c:3645 +#: pg_dump.c:3767 #, c-format -msgid "reading policies for table \"%s.%s\"" -msgstr "чтение политик таблицы \"%s.%s\"" +msgid "reading row-level security policies" +msgstr "чтение политик защиты на уровне строк" -#: pg_dump.c:3797 +#: pg_dump.c:3910 #, c-format msgid "unexpected policy command type: %c" msgstr "нераспознанный тип команды в политике: %c" -#: pg_dump.c:3951 +#: pg_dump.c:4064 #, c-format msgid "owner of publication \"%s\" appears to be invalid" msgstr "у публикации \"%s\" по-видимому неправильный владелец" -#: pg_dump.c:4241 +#: pg_dump.c:4356 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "" "подписки не выгружены, так как текущий пользователь не суперпользователь" -#: pg_dump.c:4295 +#: pg_dump.c:4427 #, c-format msgid "owner of subscription \"%s\" appears to be invalid" msgstr "у подписки \"%s\" по-видимому неправильный владелец" -#: pg_dump.c:4339 +#: pg_dump.c:4470 #, c-format msgid "could not parse subpublications array" msgstr "не удалось разобрать массив subpublications" -#: pg_dump.c:4661 +#: pg_dump.c:4828 #, c-format msgid "could not find parent extension for %s %s" msgstr "не удалось найти родительское расширение для %s %s" # TO REVIEW -#: pg_dump.c:4793 +#: pg_dump.c:4960 #, c-format msgid "owner of schema \"%s\" appears to be invalid" msgstr "у схемы \"%s\" по-видимому неправильный владелец" -#: pg_dump.c:4816 +#: pg_dump.c:4983 #, c-format msgid "schema with OID %u does not exist" msgstr "схема с OID %u не существует" -#: pg_dump.c:5141 +#: pg_dump.c:5313 #, c-format msgid "owner of data type \"%s\" appears to be invalid" msgstr "у типа данных \"%s\" по-видимому неправильный владелец" -#: pg_dump.c:5226 +#: pg_dump.c:5397 #, c-format msgid "owner of operator \"%s\" appears to be invalid" msgstr "у оператора \"%s\" по-видимому неправильный владелец" -#: pg_dump.c:5528 +#: pg_dump.c:5696 #, c-format msgid "owner of operator class \"%s\" appears to be invalid" msgstr "у класса операторов \"%s\" по-видимому неправильный владелец" -#: pg_dump.c:5612 +#: pg_dump.c:5779 #, c-format msgid "owner of operator family \"%s\" appears to be invalid" msgstr "у семейства операторов \"%s\" по-видимому неправильный владелец" -#: pg_dump.c:5781 +#: pg_dump.c:5947 #, c-format msgid "owner of aggregate function \"%s\" appears to be invalid" msgstr "у агрегатной функции \"%s\" по-видимому неправильный владелец" -#: pg_dump.c:6041 +#: pg_dump.c:6206 #, c-format msgid "owner of function \"%s\" appears to be invalid" msgstr "у функции \"%s\" по-видимому неправильный владелец" -#: pg_dump.c:6869 +#: pg_dump.c:7033 #, c-format msgid "owner of table \"%s\" appears to be invalid" msgstr "у таблицы \"%s\" по-видимому неправильный владелец" -#: pg_dump.c:6911 pg_dump.c:17426 +#: pg_dump.c:7075 pg_dump.c:17508 #, c-format msgid "" "failed sanity check, parent table with OID %u of sequence with OID %u not " @@ -2056,17 +2087,17 @@ msgstr "" "нарушение целостности: по OID %u не удалось найти родительскую таблицу " "последовательности с OID %u" -#: pg_dump.c:7053 +#: pg_dump.c:7214 #, c-format msgid "reading indexes for table \"%s.%s\"" msgstr "чтение индексов таблицы \"%s.%s\"" -#: pg_dump.c:7468 +#: pg_dump.c:7628 #, c-format msgid "reading foreign key constraints for table \"%s.%s\"" msgstr "чтение ограничений внешних ключей таблицы \"%s.%s\"" -#: pg_dump.c:7749 +#: pg_dump.c:7907 #, c-format msgid "" "failed sanity check, parent table with OID %u of pg_rewrite entry with OID " @@ -2075,46 +2106,46 @@ msgstr "" "нарушение целостности: по OID %u не удалось найти родительскую таблицу для " "записи pg_rewrite с OID %u" -#: pg_dump.c:7832 +#: pg_dump.c:7991 #, c-format msgid "reading triggers for table \"%s.%s\"" msgstr "чтение триггеров таблицы \"%s.%s\"" -#: pg_dump.c:7965 +#: pg_dump.c:8173 #, c-format msgid "" "query produced null referenced table name for foreign key trigger \"%s\" on " "table \"%s\" (OID of table: %u)" msgstr "" -"запрос вернул NULL вместо имени целевой таблицы для триггера внешнего ключа " -"\"%s\" в таблице \"%s\" (OID таблицы: %u)" +"запрос выдал NULL вместо имени целевой таблицы для триггера внешнего ключа " +"\"%s\" в таблице \"%s\" (OID целевой таблицы: %u)" -#: pg_dump.c:8520 +#: pg_dump.c:8723 #, c-format msgid "finding the columns and types of table \"%s.%s\"" msgstr "поиск столбцов и типов таблицы \"%s.%s\"" -#: pg_dump.c:8656 +#: pg_dump.c:8847 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "неверная нумерация столбцов в таблице \"%s\"" -#: pg_dump.c:8693 +#: pg_dump.c:8886 #, c-format msgid "finding default expressions of table \"%s.%s\"" msgstr "поиск выражений по умолчанию для таблицы \"%s.%s\"" -#: pg_dump.c:8715 +#: pg_dump.c:8908 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "неверное значение adnum (%d) в таблице \"%s\"" -#: pg_dump.c:8807 +#: pg_dump.c:9001 #, c-format msgid "finding check constraints for table \"%s.%s\"" msgstr "поиск ограничений-проверок для таблицы \"%s.%s\"" -#: pg_dump.c:8856 +#: pg_dump.c:9050 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" @@ -2125,69 +2156,69 @@ msgstr[1] "" msgstr[2] "" "ожидалось %d ограничений-проверок для таблицы \"%s\", но найдено: %d" -#: pg_dump.c:8860 +#: pg_dump.c:9054 #, c-format msgid "(The system catalogs might be corrupted.)" msgstr "(Возможно, повреждены системные каталоги.)" -#: pg_dump.c:10446 +#: pg_dump.c:10656 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "у типа данных \"%s\" по-видимому неправильный тип типа" -#: pg_dump.c:11800 +#: pg_dump.c:12004 #, c-format msgid "bogus value in proargmodes array" msgstr "неприемлемое значение в массиве proargmodes" -#: pg_dump.c:12172 +#: pg_dump.c:12306 #, c-format msgid "could not parse proallargtypes array" msgstr "не удалось разобрать массив proallargtypes" -#: pg_dump.c:12188 +#: pg_dump.c:12322 #, c-format msgid "could not parse proargmodes array" msgstr "не удалось разобрать массив proargmodes" -#: pg_dump.c:12202 +#: pg_dump.c:12336 #, c-format msgid "could not parse proargnames array" msgstr "не удалось разобрать массив proargnames" -#: pg_dump.c:12213 +#: pg_dump.c:12346 #, c-format msgid "could not parse proconfig array" msgstr "не удалось разобрать массив proconfig" # TO REVEIW -#: pg_dump.c:12293 +#: pg_dump.c:12422 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "недопустимое значение provolatile для функции \"%s\"" # TO REVEIW -#: pg_dump.c:12343 pg_dump.c:14401 +#: pg_dump.c:12472 pg_dump.c:14413 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "недопустимое значение proparallel для функции \"%s\"" -#: pg_dump.c:12482 pg_dump.c:12591 pg_dump.c:12598 +#: pg_dump.c:12611 pg_dump.c:12717 pg_dump.c:12724 #, c-format msgid "could not find function definition for function with OID %u" msgstr "не удалось найти определение функции для функции с OID %u" -#: pg_dump.c:12521 +#: pg_dump.c:12650 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "неприемлемое значение в поле pg_cast.castfunc или pg_cast.castmethod" -#: pg_dump.c:12524 +#: pg_dump.c:12653 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "неприемлемое значение в поле pg_cast.castmethod" -#: pg_dump.c:12617 +#: pg_dump.c:12743 #, c-format msgid "" "bogus transform definition, at least one of trffromsql and trftosql should " @@ -2196,61 +2227,57 @@ msgstr "" "неприемлемое определение преобразования (trffromsql или trftosql должно быть " "ненулевым)" -#: pg_dump.c:12634 +#: pg_dump.c:12760 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "неприемлемое значение в поле pg_transform.trffromsql" -#: pg_dump.c:12655 +#: pg_dump.c:12781 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "неприемлемое значение в поле pg_transform.trftosql" -#: pg_dump.c:12971 +#: pg_dump.c:12932 +#, c-format +msgid "postfix operators are not supported anymore (operator \"%s\")" +msgstr "постфиксные операторы больше не поддерживаются (оператор \"%s\")" + +#: pg_dump.c:13102 #, c-format msgid "could not find operator with OID %s" msgstr "оператор с OID %s не найден" -#: pg_dump.c:13039 +#: pg_dump.c:13170 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "неверный тип \"%c\" метода доступа \"%s\"" -#: pg_dump.c:13793 +#: pg_dump.c:13924 #, c-format msgid "unrecognized collation provider: %s" -msgstr "нераспознанный поставщик правил сортировки: %s" - -#: pg_dump.c:14265 -#, c-format -msgid "" -"aggregate function %s could not be dumped correctly for this database " -"version; ignored" -msgstr "" -"агрегатная функция %s не может быть правильно выгружена для этой версии базы " -"данных; функция проигнорирована" +msgstr "нераспознанный провайдер правил сортировки: %s" -#: pg_dump.c:14320 +#: pg_dump.c:14332 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "нераспознанное значение aggfinalmodify для агрегата \"%s\"" -#: pg_dump.c:14376 +#: pg_dump.c:14388 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "нераспознанное значение aggmfinalmodify для агрегата \"%s\"" -#: pg_dump.c:15098 +#: pg_dump.c:15110 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "нераспознанный тип объекта в определении прав по умолчанию: %d" -#: pg_dump.c:15116 +#: pg_dump.c:15128 #, c-format msgid "could not parse default ACL list (%s)" msgstr "не удалось разобрать список прав по умолчанию (%s)" -#: pg_dump.c:15201 +#: pg_dump.c:15213 #, c-format msgid "" "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) " @@ -2259,7 +2286,7 @@ msgstr "" "не удалось разобрать изначальный список GRANT ACL (%s) или изначальный " "список REVOKE ACL (%s) для объекта \"%s\" (%s)" -#: pg_dump.c:15209 +#: pg_dump.c:15221 #, c-format msgid "" "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s" @@ -2268,13 +2295,13 @@ msgstr "" "не удалось разобрать список GRANT ACL (%s) или список REVOKE ACL (%s) для " "объекта \"%s\" (%s)" -#: pg_dump.c:15724 +#: pg_dump.c:15736 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "" "запрос на получение определения представления \"%s\" не возвратил данные" -#: pg_dump.c:15727 +#: pg_dump.c:15739 #, c-format msgid "" "query to obtain definition of view \"%s\" returned more than one definition" @@ -2282,37 +2309,49 @@ msgstr "" "запрос на получение определения представления \"%s\" возвратил несколько " "определений" -#: pg_dump.c:15734 +#: pg_dump.c:15746 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "определение представления \"%s\" пустое (длина равна нулю)" -#: pg_dump.c:15818 +#: pg_dump.c:15830 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "свойство WITH OIDS больше не поддерживается (таблица \"%s\")" -#: pg_dump.c:16298 -#, c-format -msgid "invalid number of parents %d for table \"%s\"" -msgstr "неверное число родителей (%d) для таблицы \"%s\"" - -#: pg_dump.c:16621 +#: pg_dump.c:16695 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "неверный номер столбца %d для таблицы \"%s\"" -#: pg_dump.c:16914 +#: pg_dump.c:16772 +#, c-format +msgid "could not parse index statistic columns" +msgstr "не удалось разобрать столбцы статистики в индексе" + +#: pg_dump.c:16774 +#, c-format +msgid "could not parse index statistic values" +msgstr "не удалось разобрать значения статистики в индексе" + +#: pg_dump.c:16776 +#, c-format +msgid "mismatched number of columns and values for index statistics" +msgstr "" +"столбцы, задающие статистику индекса, не соответствуют значениям по " +"количеству" + +#: pg_dump.c:16993 #, c-format msgid "missing index for constraint \"%s\"" msgstr "отсутствует индекс для ограничения \"%s\"" -#: pg_dump.c:17139 +#: pg_dump.c:17218 #, c-format msgid "unrecognized constraint type: %c" msgstr "нераспознанный тип ограничения: %c" -#: pg_dump.c:17271 pg_dump.c:17491 +#: pg_dump.c:17350 pg_dump.c:17573 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "" @@ -2327,22 +2366,22 @@ msgstr[2] "" "запрос на получение данных последовательности \"%s\" вернул %d строк " "(ожидалась 1)" -#: pg_dump.c:17305 +#: pg_dump.c:17384 #, c-format msgid "unrecognized sequence type: %s" msgstr "нераспознанный тип последовательности: %s" -#: pg_dump.c:17589 +#: pg_dump.c:17671 #, c-format msgid "unexpected tgtype value: %d" msgstr "неожиданное значение tgtype: %d" -#: pg_dump.c:17663 +#: pg_dump.c:17745 #, c-format msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" msgstr "неверная строка аргументов (%s) для триггера \"%s\" таблицы \"%s\"" -#: pg_dump.c:17899 +#: pg_dump.c:18014 #, c-format msgid "" "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows " @@ -2351,47 +2390,62 @@ msgstr "" "запрос на получение правила \"%s\" для таблицы \"%s\" возвратил неверное " "число строк" -#: pg_dump.c:18061 +#: pg_dump.c:18176 #, c-format msgid "could not find referenced extension %u" msgstr "не удалось найти упомянутое расширение %u" -#: pg_dump.c:18273 +#: pg_dump.c:18267 +#, c-format +msgid "could not parse extension configuration array" +msgstr "не удалось разобрать массив конфигураций расширения" + +#: pg_dump.c:18269 +#, c-format +msgid "could not parse extension condition array" +msgstr "не удалось разобрать массив условий расширения" + +#: pg_dump.c:18271 +#, c-format +msgid "mismatched number of configurations and conditions for extension" +msgstr "конфигурации расширения не соответствуют условиям по количеству" + +#: pg_dump.c:18403 #, c-format msgid "reading dependency data" msgstr "чтение информации о зависимостях" -#: pg_dump.c:18366 +#: pg_dump.c:18496 #, c-format msgid "no referencing object %u %u" msgstr "нет подчинённого объекта %u %u" -#: pg_dump.c:18377 +#: pg_dump.c:18507 #, c-format msgid "no referenced object %u %u" msgstr "нет вышестоящего объекта %u %u" -#: pg_dump.c:18750 +#: pg_dump.c:18896 #, c-format msgid "could not parse reloptions array" msgstr "не удалось разобрать массив reloptions" -#: pg_dump_sort.c:360 +#: pg_dump_sort.c:420 #, c-format msgid "invalid dumpId %d" msgstr "неверный dumpId %d" -#: pg_dump_sort.c:366 +#: pg_dump_sort.c:426 #, c-format msgid "invalid dependency %d" msgstr "неверная зависимость %d" -#: pg_dump_sort.c:599 +#: pg_dump_sort.c:659 #, c-format msgid "could not identify dependency loop" msgstr "не удалось определить цикл зависимостей" -#: pg_dump_sort.c:1170 +#: pg_dump_sort.c:1230 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" @@ -2399,12 +2453,12 @@ msgstr[0] "в следующей таблице зациклены ограни msgstr[1] "в следующих таблицах зациклены ограничения внешних ключей:" msgstr[2] "в следующих таблицах зациклены ограничения внешних ключей:" -#: pg_dump_sort.c:1174 pg_dump_sort.c:1194 +#: pg_dump_sort.c:1234 pg_dump_sort.c:1254 #, c-format msgid " %s" msgstr " %s" -#: pg_dump_sort.c:1175 +#: pg_dump_sort.c:1235 #, c-format msgid "" "You might not be able to restore the dump without using --disable-triggers " @@ -2413,7 +2467,7 @@ msgstr "" "Возможно, для восстановления базы потребуется использовать --disable-" "triggers или временно удалить ограничения." -#: pg_dump_sort.c:1176 +#: pg_dump_sort.c:1236 #, c-format msgid "" "Consider using a full dump instead of a --data-only dump to avoid this " @@ -2422,12 +2476,12 @@ msgstr "" "Во избежание этой проблемы, вероятно, стоит выгружать всю базу данных, а не " "только данные (--data-only)." -#: pg_dump_sort.c:1188 +#: pg_dump_sort.c:1248 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "не удалось разрешить цикл зависимостей для следующих объектов:" -#: pg_dumpall.c:199 +#: pg_dumpall.c:202 #, c-format msgid "" "The program \"%s\" is needed by %s but was not found in the\n" @@ -2438,7 +2492,7 @@ msgstr "" "в каталоге \"%s\".\n" "Проверьте правильность установки СУБД." -#: pg_dumpall.c:204 +#: pg_dumpall.c:207 #, c-format msgid "" "The program \"%s\" was found by \"%s\"\n" @@ -2449,7 +2503,7 @@ msgstr "" "но её версия отличается от версии %s.\n" "Проверьте правильность установки СУБД." -#: pg_dumpall.c:356 +#: pg_dumpall.c:359 #, c-format msgid "" "option --exclude-database cannot be used together with -g/--globals-only, -" @@ -2458,30 +2512,30 @@ msgstr "" "параметр --exclude-database несовместим с -g/--globals-only, -r/--roles-only " "и -t/--tablespaces-only" -#: pg_dumpall.c:365 +#: pg_dumpall.c:368 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "параметры -g/--globals-only и -r/--roles-only исключают друг друга" -#: pg_dumpall.c:373 +#: pg_dumpall.c:376 #, c-format msgid "" "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "" "параметры -g/--globals-only и -t/--tablespaces-only исключают друг друга" -#: pg_dumpall.c:387 +#: pg_dumpall.c:390 #, c-format msgid "" "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "параметры -r/--roles-only и -t/--tablespaces-only исключают друг друга" -#: pg_dumpall.c:448 pg_dumpall.c:1754 +#: pg_dumpall.c:453 pg_dumpall.c:1756 #, c-format msgid "could not connect to database \"%s\"" msgstr "не удалось подключиться к базе данных: \"%s\"" -#: pg_dumpall.c:462 +#: pg_dumpall.c:467 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2490,7 +2544,7 @@ msgstr "" "не удалось подключиться к базе данных \"postgres\" или \"template1\"\n" "Укажите другую базу данных." -#: pg_dumpall.c:616 +#: pg_dumpall.c:621 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2499,17 +2553,17 @@ msgstr "" "%s экспортирует всё содержимое кластера баз данных PostgreSQL в SQL-скрипт.\n" "\n" -#: pg_dumpall.c:618 +#: pg_dumpall.c:623 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [ПАРАМЕТР]...\n" -#: pg_dumpall.c:621 +#: pg_dumpall.c:626 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=ИМЯ_ФАЙЛА имя выходного файла\n" -#: pg_dumpall.c:628 +#: pg_dumpall.c:633 #, c-format msgid "" " -c, --clean clean (drop) databases before recreating\n" @@ -2517,18 +2571,18 @@ msgstr "" " -c, --clean очистить (удалить) базы данных перед\n" " восстановлением\n" -#: pg_dumpall.c:630 +#: pg_dumpall.c:635 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr "" " -g, --globals-only выгрузить только глобальные объекты, без баз\n" -#: pg_dumpall.c:631 pg_restore.c:485 +#: pg_dumpall.c:636 pg_restore.c:485 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner не восстанавливать владение объектами\n" -#: pg_dumpall.c:632 +#: pg_dumpall.c:637 #, c-format msgid "" " -r, --roles-only dump only roles, no databases or tablespaces\n" @@ -2536,13 +2590,13 @@ msgstr "" " -r, --roles-only выгрузить только роли, без баз данных\n" " и табличных пространств\n" -#: pg_dumpall.c:634 +#: pg_dumpall.c:639 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr "" " -S, --superuser=ИМЯ имя пользователя для выполнения выгрузки\n" -#: pg_dumpall.c:635 +#: pg_dumpall.c:640 #, c-format msgid "" " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" @@ -2550,7 +2604,7 @@ msgstr "" " -t, --tablespaces-only выгружать только табличные пространства,\n" " без баз данных и ролей\n" -#: pg_dumpall.c:641 +#: pg_dumpall.c:646 #, c-format msgid "" " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" @@ -2558,22 +2612,22 @@ msgstr "" " --exclude-database=ШАБЛОН исключить базы с именами, подпадающими под " "шаблон\n" -#: pg_dumpall.c:648 +#: pg_dumpall.c:653 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords не выгружать пароли ролей\n" -#: pg_dumpall.c:662 +#: pg_dumpall.c:668 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=СТРОКА подключиться с данной строкой подключения\n" -#: pg_dumpall.c:664 +#: pg_dumpall.c:670 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=ИМЯ_БД выбор другой базы данных по умолчанию\n" -#: pg_dumpall.c:671 +#: pg_dumpall.c:677 #, c-format msgid "" "\n" @@ -2587,48 +2641,43 @@ msgstr "" "вывод.\n" "\n" -#: pg_dumpall.c:877 +#: pg_dumpall.c:883 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "имя роли, начинающееся с \"pg_\", пропущено (%s)" -#: pg_dumpall.c:1278 +#: pg_dumpall.c:1284 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "" "не удалось разобрать список управления доступом (%s) для табл. пространства " "\"%s\"" -#: pg_dumpall.c:1495 +#: pg_dumpall.c:1501 #, c-format msgid "excluding database \"%s\"" msgstr "база данных \"%s\" исключается" -#: pg_dumpall.c:1499 +#: pg_dumpall.c:1505 #, c-format msgid "dumping database \"%s\"" msgstr "выгрузка базы данных \"%s\"" -#: pg_dumpall.c:1531 +#: pg_dumpall.c:1537 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "ошибка при обработке базы \"%s\", pg_dump завершается" -#: pg_dumpall.c:1540 +#: pg_dumpall.c:1546 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "не удалось повторно открыть выходной файл \"%s\": %m" -#: pg_dumpall.c:1584 +#: pg_dumpall.c:1590 #, c-format msgid "running \"%s\"" msgstr "выполняется \"%s\"" -#: pg_dumpall.c:1775 -#, c-format -msgid "could not connect to database \"%s\": %s" -msgstr "не удалось подключиться к базе \"%s\": %s" - #: pg_dumpall.c:1805 #, c-format msgid "could not get server version" @@ -2922,6 +2971,34 @@ msgstr "" "ввода.\n" "\n" +#~ msgid "reading row security enabled for table \"%s.%s\"" +#~ msgstr "чтение информации о защите строк для таблицы \"%s.%s\"" + +#~ msgid "reading policies for table \"%s.%s\"" +#~ msgstr "чтение политик таблицы \"%s.%s\"" + +#~ msgid "pclose failed: %m" +#~ msgstr "ошибка pclose: %m" + +#~ msgid "WSAStartup failed: %d" +#~ msgstr "ошибка WSAStartup: %d" + +#~ msgid "could not write to large object (result: %lu, expected: %lu)" +#~ msgstr "не удалось записать большой объект (результат: %lu, ожидалось: %lu)" + +#~ msgid "connection to database \"%s\" failed: %s" +#~ msgstr "не удалось подключиться к базе \"%s\": %s" + +#~ msgid "" +#~ "aggregate function %s could not be dumped correctly for this database " +#~ "version; ignored" +#~ msgstr "" +#~ "агрегатная функция %s не может быть правильно выгружена для этой версии " +#~ "базы данных; функция проигнорирована" + +#~ msgid "could not connect to database \"%s\": %s" +#~ msgstr "не удалось подключиться к базе \"%s\": %s" + #~ msgid "reading publication membership for table \"%s.%s\"" #~ msgstr "чтение информации об участии в репликации таблицы \"%s.%s\"" diff --git a/src/bin/pg_dump/po/sv.po b/src/bin/pg_dump/po/sv.po index 45090f6a78..508280abb1 100644 --- a/src/bin/pg_dump/po/sv.po +++ b/src/bin/pg_dump/po/sv.po @@ -1,13 +1,13 @@ # Swedish message translation file for pg_dump # Peter Eisentraut , 2001, 2009, 2010. -# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020. +# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-20 16:46+0000\n" -"PO-Revision-Date: 2020-10-20 20:32+0200\n" +"POT-Creation-Date: 2022-05-09 18:50+0000\n" +"PO-Revision-Date: 2022-05-09 21:46+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -16,57 +16,62 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatalt: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "varning: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "tips: " + +#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "kunde inte identifiera aktuell katalog: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "ogiltig binär \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "kunde inte läsa binär \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "kunde inte hitta en \"%s\" att köra" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:282 ../../common/exec.c:321 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "kunde inte byta katalog till \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:299 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "kan inte läsa symbolisk länk \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:422 parallel.c:1611 #, c-format -msgid "pclose failed: %m" -msgstr "pclose misslyckades: %m" +msgid "%s() failed: %m" +msgstr "%s() misslyckades: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 msgid "out of memory" msgstr "slut på minne" @@ -111,212 +116,232 @@ msgstr "barnprocess terminerades av signal %d: %s" msgid "child process exited with unrecognized status %d" msgstr "barnprocess avslutade med okänd statuskod %d" -#: common.c:121 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s måste vara i intervallet %d..%d" + +#: common.c:134 #, c-format msgid "reading extensions" msgstr "läser utökningar" -#: common.c:125 +#: common.c:137 #, c-format msgid "identifying extension members" msgstr "identifierar utökningsmedlemmar" -#: common.c:128 +#: common.c:140 #, c-format msgid "reading schemas" msgstr "läser scheman" -#: common.c:138 +#: common.c:149 #, c-format msgid "reading user-defined tables" msgstr "läser användardefinierade tabeller" -#: common.c:145 +#: common.c:154 #, c-format msgid "reading user-defined functions" msgstr "läser användardefinierade funktioner" -#: common.c:150 +#: common.c:158 #, c-format msgid "reading user-defined types" msgstr "läser användardefinierade typer" -#: common.c:155 +#: common.c:162 #, c-format msgid "reading procedural languages" msgstr "läser procedurspråk" -#: common.c:158 +#: common.c:165 #, c-format msgid "reading user-defined aggregate functions" msgstr "läser användardefinierade aggregatfunktioner" -#: common.c:161 +#: common.c:168 #, c-format msgid "reading user-defined operators" msgstr "läser användardefinierade operatorer" -#: common.c:165 +#: common.c:171 #, c-format msgid "reading user-defined access methods" msgstr "läser användardefinierade accessmetoder" -#: common.c:168 +#: common.c:174 #, c-format msgid "reading user-defined operator classes" msgstr "läser användardefinierade operatorklasser" -#: common.c:171 +#: common.c:177 #, c-format msgid "reading user-defined operator families" msgstr "läser användardefinierade operator-familjer" -#: common.c:174 +#: common.c:180 #, c-format msgid "reading user-defined text search parsers" msgstr "läser användardefinierade textsöktolkare" -#: common.c:177 +#: common.c:183 #, c-format msgid "reading user-defined text search templates" msgstr "läser användardefinierade textsökmallar" -#: common.c:180 +#: common.c:186 #, c-format msgid "reading user-defined text search dictionaries" msgstr "läser användardefinierade textsökordlistor" -#: common.c:183 +#: common.c:189 #, c-format msgid "reading user-defined text search configurations" msgstr "läser användardefinierade textsökkonfigurationer" -#: common.c:186 +#: common.c:192 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "läser användardefinierade främmande data-omvandlare" -#: common.c:189 +#: common.c:195 #, c-format msgid "reading user-defined foreign servers" msgstr "läser användardefinierade främmande servrar" -#: common.c:192 +#: common.c:198 #, c-format msgid "reading default privileges" msgstr "läser standardrättigheter" -#: common.c:195 +#: common.c:201 #, c-format msgid "reading user-defined collations" msgstr "läser användardefinierade jämförelser" -#: common.c:199 +#: common.c:204 #, c-format msgid "reading user-defined conversions" msgstr "läser användardefinierade konverteringar" -#: common.c:202 +#: common.c:207 #, c-format msgid "reading type casts" msgstr "läser typomvandlingar" -#: common.c:205 +#: common.c:210 #, c-format msgid "reading transforms" msgstr "läser transformer" -#: common.c:208 +#: common.c:213 #, c-format msgid "reading table inheritance information" msgstr "läser information om arv av tabeller" -#: common.c:211 +#: common.c:216 #, c-format msgid "reading event triggers" msgstr "läser händelseutlösare" -#: common.c:215 +#: common.c:220 #, c-format msgid "finding extension tables" msgstr "hittar utökningstabeller" -#: common.c:219 +#: common.c:224 #, c-format msgid "finding inheritance relationships" msgstr "hittar arvrelationer" -#: common.c:222 +#: common.c:227 #, c-format msgid "reading column info for interesting tables" msgstr "läser kolumninfo flr intressanta tabeller" -#: common.c:225 +#: common.c:230 #, c-format msgid "flagging inherited columns in subtables" msgstr "markerar ärvda kolumner i undertabeller" -#: common.c:228 +#: common.c:233 #, c-format msgid "reading indexes" msgstr "läser index" -#: common.c:231 +#: common.c:236 #, c-format msgid "flagging indexes in partitioned tables" msgstr "flaggar index i partitionerade tabeller" -#: common.c:234 +#: common.c:239 #, c-format msgid "reading extended statistics" msgstr "läser utökad statistik" -#: common.c:237 +#: common.c:242 #, c-format msgid "reading constraints" msgstr "läser integritetsvillkor" -#: common.c:240 +#: common.c:245 #, c-format msgid "reading triggers" msgstr "läser utlösare" -#: common.c:243 +#: common.c:248 #, c-format msgid "reading rewrite rules" msgstr "läser omskrivningsregler" -#: common.c:246 +#: common.c:251 #, c-format msgid "reading policies" msgstr "läser policys" -#: common.c:249 +#: common.c:254 #, c-format msgid "reading publications" msgstr "läser publiceringar" -#: common.c:252 +#: common.c:257 +#, c-format +msgid "reading publication membership of tables" +msgstr "läser publiceringsmedlemskap för tabeller" + +#: common.c:260 #, c-format -msgid "reading publication membership" -msgstr "läser publiceringsmedlemskap" +msgid "reading publication membership of schemas" +msgstr "läser publiceringsmedlemskap för scheman" -#: common.c:255 +#: common.c:263 #, c-format msgid "reading subscriptions" msgstr "läser prenumerationer" -#: common.c:1025 +#: common.c:343 +#, c-format +msgid "invalid number of parents %d for table \"%s\"" +msgstr "ogiltigt antal (%d) föräldrar för tabell \"%s\"" + +#: common.c:1004 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "misslyckades med riktighetskontroll, hittade inte förälder-OID %u för tabell \"%s\" (OID %u)" -#: common.c:1067 +#: common.c:1043 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "kunde inte tolka numerisk array \"%s\": för många nummer" -#: common.c:1082 +#: common.c:1055 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "kunde inte tolka numerisk array \"%s\": ogiltigt tecken i nummer" @@ -357,43 +382,43 @@ msgstr "kunde inte packa upp data: %s" msgid "could not close compression library: %s" msgstr "kunde inte stänga komprimeringsbiblioteket: %s" -#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:557 pg_backup_tar.c:560 +#: compress_io.c:584 compress_io.c:621 #, c-format msgid "could not read from input file: %s" msgstr "kunde inte läsa från infilen: %s" -#: compress_io.c:623 pg_backup_custom.c:646 pg_backup_directory.c:552 -#: pg_backup_tar.c:793 pg_backup_tar.c:816 +#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553 +#: pg_backup_tar.c:726 pg_backup_tar.c:749 #, c-format msgid "could not read from input file: end of file" msgstr "kunde inte läsa från infilen: slut på filen" -#: parallel.c:254 +#: parallel.c:253 #, c-format -msgid "WSAStartup failed: %d" -msgstr "WSAStartup misslyckades: %d" +msgid "%s() failed: error code %d" +msgstr "%s() misslyckades: felkod %d" -#: parallel.c:964 +#: parallel.c:961 #, c-format msgid "could not create communication channels: %m" msgstr "kunde inte skapa kommunikationskanaler: %m" -#: parallel.c:1021 +#: parallel.c:1018 #, c-format msgid "could not create worker process: %m" msgstr "kunde inte skapa arbetsprocess: %m" -#: parallel.c:1151 +#: parallel.c:1148 #, c-format -msgid "unrecognized command received from master: \"%s\"" -msgstr "okänt kommando mottaget från master: \"%s\"" +msgid "unrecognized command received from leader: \"%s\"" +msgstr "okänt kommando mottaget från ledare: \"%s\"" -#: parallel.c:1194 parallel.c:1432 +#: parallel.c:1191 parallel.c:1429 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "ogiltigt meddelande mottaget från arbetare: \"%s\"" -#: parallel.c:1326 +#: parallel.c:1323 #, c-format msgid "" "could not obtain lock on relation \"%s\"\n" @@ -403,661 +428,651 @@ msgstr "" "Dette beror oftast på att någon tagit ett ACCESS EXCLUSIVE-lås på tabellen\n" "efter att pg_dumps föräldraprocess tagit ett ACCESS SHARE-lås på tabellen." -#: parallel.c:1415 +#: parallel.c:1412 #, c-format msgid "a worker process died unexpectedly" msgstr "en arbetsprocess dog oväntat" -#: parallel.c:1537 parallel.c:1655 +#: parallel.c:1534 parallel.c:1652 #, c-format msgid "could not write to the communication channel: %m" msgstr "kunde inte skriva till kommunikationskanal: %m" -#: parallel.c:1614 -#, c-format -msgid "select() failed: %m" -msgstr "select() misslyckades: %m" - -#: parallel.c:1739 +#: parallel.c:1736 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: kunde inte skapa uttag (socket): felkod %d" -#: parallel.c:1750 +#: parallel.c:1747 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: kunde inte göra \"bind\": felkod %d" -#: parallel.c:1757 +#: parallel.c:1754 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: kunde inte göra \"listen\": felkod %d" -#: parallel.c:1764 +#: parallel.c:1761 #, c-format -msgid "pgpipe: getsockname() failed: error code %d" -msgstr "pgpipe: getsockname() misslyckades: felkod %d" +msgid "pgpipe: %s() failed: error code %d" +msgstr "pgpipe: %s() misslyckades: felkod %d" -#: parallel.c:1775 +#: parallel.c:1772 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: kunde inte skapa ett andra uttag (socket): felkod %d" -#: parallel.c:1784 +#: parallel.c:1781 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: kunde itne ansluta till uttag (socket): felkod %d" -#: parallel.c:1793 +#: parallel.c:1790 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: kunde inte acceptera anslutning: felkod %d" -#: pg_backup_archiver.c:277 pg_backup_archiver.c:1587 +#: pg_backup_archiver.c:279 pg_backup_archiver.c:1576 #, c-format msgid "could not close output file: %m" msgstr "kunde inte stänga utdatafilen: %m" -#: pg_backup_archiver.c:321 pg_backup_archiver.c:325 +#: pg_backup_archiver.c:323 pg_backup_archiver.c:327 #, c-format msgid "archive items not in correct section order" msgstr "arkivobjekten är inte i korrekt sektionsordning" -#: pg_backup_archiver.c:331 +#: pg_backup_archiver.c:333 #, c-format msgid "unexpected section code %d" msgstr "oväntad sektionskod %d" -#: pg_backup_archiver.c:368 +#: pg_backup_archiver.c:370 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "parallell återställning stöds inte med detta arkivformat" -#: pg_backup_archiver.c:372 +#: pg_backup_archiver.c:374 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "parallell återställning stöds inte med arkiv som skapats av en pre-8.0 pg_dump" -#: pg_backup_archiver.c:390 +#: pg_backup_archiver.c:392 #, c-format msgid "cannot restore from compressed archive (compression not supported in this installation)" msgstr "kan inte återställa från komprimerat arkiv (inte konfigurerad med stöd för komprimering)" -#: pg_backup_archiver.c:407 +#: pg_backup_archiver.c:409 #, c-format msgid "connecting to database for restore" msgstr "kopplar upp mot databas för återställning" -#: pg_backup_archiver.c:409 +#: pg_backup_archiver.c:411 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "direkta databasuppkopplingar stöds inte i arkiv från före version 1.3" -#: pg_backup_archiver.c:452 +#: pg_backup_archiver.c:454 #, c-format msgid "implied data-only restore" msgstr "implicerad återställning av enbart data" -#: pg_backup_archiver.c:518 +#: pg_backup_archiver.c:520 #, c-format msgid "dropping %s %s" msgstr "tar bort %s %s" -#: pg_backup_archiver.c:613 +#: pg_backup_archiver.c:615 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "kunde inte hitta var IF EXISTS skulle stoppas in i sats \"%s\"" -#: pg_backup_archiver.c:769 pg_backup_archiver.c:771 +#: pg_backup_archiver.c:771 pg_backup_archiver.c:773 #, c-format msgid "warning from original dump file: %s" msgstr "varning från orginaldumpfilen: %s" -#: pg_backup_archiver.c:786 +#: pg_backup_archiver.c:788 #, c-format msgid "creating %s \"%s.%s\"" msgstr "skapar %s \"%s.%s\"" -#: pg_backup_archiver.c:789 +#: pg_backup_archiver.c:791 #, c-format msgid "creating %s \"%s\"" msgstr "skapar %s \"%s\"" -#: pg_backup_archiver.c:839 +#: pg_backup_archiver.c:841 #, c-format msgid "connecting to new database \"%s\"" msgstr "kopplar upp mot ny databas \"%s\"" -#: pg_backup_archiver.c:866 +#: pg_backup_archiver.c:868 #, c-format msgid "processing %s" msgstr "processar %s" -#: pg_backup_archiver.c:886 +#: pg_backup_archiver.c:888 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "processar data för tabell \"%s.%s\"" -#: pg_backup_archiver.c:948 +#: pg_backup_archiver.c:947 #, c-format msgid "executing %s %s" msgstr "kör %s %s" -#: pg_backup_archiver.c:987 +#: pg_backup_archiver.c:986 #, c-format msgid "disabling triggers for %s" msgstr "stänger av utlösare för %s" -#: pg_backup_archiver.c:1013 +#: pg_backup_archiver.c:1012 #, c-format msgid "enabling triggers for %s" msgstr "slår på utlösare för %s" -#: pg_backup_archiver.c:1041 +#: pg_backup_archiver.c:1040 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "internt fel -- WriteData kan inte anropas utanför kontexten av en DataDumper-rutin" -#: pg_backup_archiver.c:1224 +#: pg_backup_archiver.c:1223 #, c-format msgid "large-object output not supported in chosen format" msgstr "utmatning av stora objekt stöds inte i det valda formatet" -#: pg_backup_archiver.c:1282 +#: pg_backup_archiver.c:1281 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "återställde %d stor objekt" msgstr[1] "återställde %d stora objekt" -#: pg_backup_archiver.c:1303 pg_backup_tar.c:736 +#: pg_backup_archiver.c:1302 pg_backup_tar.c:669 #, c-format msgid "restoring large object with OID %u" msgstr "återställer stort objekt med OID %u" -#: pg_backup_archiver.c:1315 +#: pg_backup_archiver.c:1314 #, c-format msgid "could not create large object %u: %s" msgstr "kunde inte skapa stort objekt %u: %s" -#: pg_backup_archiver.c:1320 pg_dump.c:3552 +#: pg_backup_archiver.c:1319 pg_dump.c:3538 #, c-format msgid "could not open large object %u: %s" msgstr "kunde inte öppna stort objekt %u: %s" -#: pg_backup_archiver.c:1377 +#: pg_backup_archiver.c:1375 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "kunde inte öppna TOC-filen \"%s\": %m" -#: pg_backup_archiver.c:1417 +#: pg_backup_archiver.c:1403 #, c-format msgid "line ignored: %s" msgstr "rad ignorerad: %s" -#: pg_backup_archiver.c:1424 +#: pg_backup_archiver.c:1410 #, c-format msgid "could not find entry for ID %d" msgstr "kunde inte hitta en post för ID %d" -#: pg_backup_archiver.c:1445 pg_backup_directory.c:222 -#: pg_backup_directory.c:598 +#: pg_backup_archiver.c:1433 pg_backup_directory.c:222 +#: pg_backup_directory.c:599 #, c-format msgid "could not close TOC file: %m" msgstr "kunde inte stänga TOC-filen: %m" -#: pg_backup_archiver.c:1559 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:585 pg_backup_directory.c:648 -#: pg_backup_directory.c:667 pg_dumpall.c:484 +#: pg_backup_archiver.c:1547 pg_backup_custom.c:156 pg_backup_directory.c:332 +#: pg_backup_directory.c:586 pg_backup_directory.c:649 +#: pg_backup_directory.c:668 pg_dumpall.c:476 #, c-format msgid "could not open output file \"%s\": %m" msgstr "kunde inte öppna utdatafilen \"%s\": %m" -#: pg_backup_archiver.c:1561 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1549 pg_backup_custom.c:162 #, c-format msgid "could not open output file: %m" msgstr "kunde inte öppna utdatafilen: %m" -#: pg_backup_archiver.c:1654 +#: pg_backup_archiver.c:1643 #, c-format -msgid "wrote %lu byte of large object data (result = %lu)" -msgid_plural "wrote %lu bytes of large object data (result = %lu)" -msgstr[0] "skrev %lu byte av stort objekt-data (resultat = %lu)" -msgstr[1] "skrev %lu bytes av stort objekt-data (resultat = %lu)" +msgid "wrote %zu byte of large object data (result = %d)" +msgid_plural "wrote %zu bytes of large object data (result = %d)" +msgstr[0] "skrev %zu byte data av stort objekt (resultat = %d)" +msgstr[1] "skrev %zu bytes data av stort objekt (resultat = %d)" -#: pg_backup_archiver.c:1659 +#: pg_backup_archiver.c:1649 #, c-format -msgid "could not write to large object (result: %lu, expected: %lu)" -msgstr "kunde inte skriva till stort objekt (resultat: %lu, förväntat: %lu)" +msgid "could not write to large object: %s" +msgstr "kunde inte skriva till stort objekt: %s" -#: pg_backup_archiver.c:1749 +#: pg_backup_archiver.c:1739 #, c-format msgid "while INITIALIZING:" msgstr "vid INITIERING:" -#: pg_backup_archiver.c:1754 +#: pg_backup_archiver.c:1744 #, c-format msgid "while PROCESSING TOC:" msgstr "vid HANTERING AV TOC:" -#: pg_backup_archiver.c:1759 +#: pg_backup_archiver.c:1749 #, c-format msgid "while FINALIZING:" msgstr "vid SLUTFÖRANDE:" -#: pg_backup_archiver.c:1764 +#: pg_backup_archiver.c:1754 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "från TOC-post %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1840 +#: pg_backup_archiver.c:1830 #, c-format msgid "bad dumpId" msgstr "felaktigt dumpId" -#: pg_backup_archiver.c:1861 +#: pg_backup_archiver.c:1851 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "felaktig tabell-dumpId för TABLE DATA-objekt" -#: pg_backup_archiver.c:1953 +#: pg_backup_archiver.c:1943 #, c-format msgid "unexpected data offset flag %d" msgstr "oväntad data-offset-flagga %d" -#: pg_backup_archiver.c:1966 +#: pg_backup_archiver.c:1956 #, c-format msgid "file offset in dump file is too large" msgstr "fil-offset i dumpfilen är för stort" -#: pg_backup_archiver.c:2103 pg_backup_archiver.c:2113 +#: pg_backup_archiver.c:2094 pg_backup_archiver.c:2104 #, c-format msgid "directory name too long: \"%s\"" msgstr "katalognamn för långt: \"%s\"" -#: pg_backup_archiver.c:2121 +#: pg_backup_archiver.c:2112 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "katalogen \"%s\" verkar inte vara ett giltigt arkiv (\"toc.dat\" finns inte)" -#: pg_backup_archiver.c:2129 pg_backup_custom.c:173 pg_backup_custom.c:812 -#: pg_backup_directory.c:207 pg_backup_directory.c:394 +#: pg_backup_archiver.c:2120 pg_backup_custom.c:173 pg_backup_custom.c:807 +#: pg_backup_directory.c:207 pg_backup_directory.c:395 #, c-format msgid "could not open input file \"%s\": %m" msgstr "kunde inte öppna indatafilen \"%s\": %m" -#: pg_backup_archiver.c:2136 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2127 pg_backup_custom.c:179 #, c-format msgid "could not open input file: %m" msgstr "kan inte öppna infil: %m" -#: pg_backup_archiver.c:2142 +#: pg_backup_archiver.c:2133 #, c-format msgid "could not read input file: %m" msgstr "kan inte läsa infilen: %m" -#: pg_backup_archiver.c:2144 +#: pg_backup_archiver.c:2135 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "indatafilen är för kort (läste %lu, förväntade 5)" -#: pg_backup_archiver.c:2229 +#: pg_backup_archiver.c:2167 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "indatafilen verkar vara en dump i textformat. Använd psql." -#: pg_backup_archiver.c:2235 +#: pg_backup_archiver.c:2173 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "indatafilen verkar inte vara ett korrekt arkiv (för kort?)" -#: pg_backup_archiver.c:2241 +#: pg_backup_archiver.c:2179 #, c-format msgid "input file does not appear to be a valid archive" msgstr "indatafilen verkar inte vara ett korrekt arkiv" -#: pg_backup_archiver.c:2261 +#: pg_backup_archiver.c:2188 #, c-format msgid "could not close input file: %m" msgstr "kunde inte stänga indatafilen: %m" -#: pg_backup_archiver.c:2373 +#: pg_backup_archiver.c:2305 #, c-format msgid "unrecognized file format \"%d\"" msgstr "känner inte igen filformat \"%d\"" -#: pg_backup_archiver.c:2455 pg_backup_archiver.c:4458 +#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4445 #, c-format msgid "finished item %d %s %s" msgstr "klar med objekt %d %s %s" -#: pg_backup_archiver.c:2459 pg_backup_archiver.c:4471 +#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4458 #, c-format msgid "worker process failed: exit code %d" msgstr "arbetsprocess misslyckades: felkod %d" -#: pg_backup_archiver.c:2579 +#: pg_backup_archiver.c:2512 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "post-ID %d utanför sitt intervall -- kanske en trasig TOC" -#: pg_backup_archiver.c:2646 +#: pg_backup_archiver.c:2592 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "återeställa tabeller med WITH OIDS stöds inte längre" -#: pg_backup_archiver.c:2728 +#: pg_backup_archiver.c:2674 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "okänd teckenkodning \"%s\"" -#: pg_backup_archiver.c:2733 +#: pg_backup_archiver.c:2679 #, c-format msgid "invalid ENCODING item: %s" msgstr "ogiltigt ENCODING-val: %s" -#: pg_backup_archiver.c:2751 +#: pg_backup_archiver.c:2697 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "ogiltigt STDSTRINGS-val: %s" -#: pg_backup_archiver.c:2776 +#: pg_backup_archiver.c:2722 #, c-format msgid "schema \"%s\" not found" msgstr "schema \"%s\" hittades inte" -#: pg_backup_archiver.c:2783 +#: pg_backup_archiver.c:2729 #, c-format msgid "table \"%s\" not found" msgstr "tabell \"%s\" hittades inte" -#: pg_backup_archiver.c:2790 +#: pg_backup_archiver.c:2736 #, c-format msgid "index \"%s\" not found" msgstr "index \"%s\" hittades inte" -#: pg_backup_archiver.c:2797 +#: pg_backup_archiver.c:2743 #, c-format msgid "function \"%s\" not found" msgstr "funktion \"%s\" hittades inte" -#: pg_backup_archiver.c:2804 +#: pg_backup_archiver.c:2750 #, c-format msgid "trigger \"%s\" not found" msgstr "utlösare \"%s\" hittades inte" -#: pg_backup_archiver.c:3196 +#: pg_backup_archiver.c:3143 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "kunde inte sätta sessionsanvändare till \"%s\": %s" -#: pg_backup_archiver.c:3328 +#: pg_backup_archiver.c:3280 #, c-format msgid "could not set search_path to \"%s\": %s" msgstr "kunde inte sätta search_path till \"%s\": %s" -#: pg_backup_archiver.c:3390 +#: pg_backup_archiver.c:3342 #, c-format msgid "could not set default_tablespace to %s: %s" msgstr "kunde inte sätta default_tablespace till %s: %s" -#: pg_backup_archiver.c:3435 +#: pg_backup_archiver.c:3392 #, c-format msgid "could not set default_table_access_method: %s" msgstr "kunde inte sätta default_table_access_method: %s" -#: pg_backup_archiver.c:3527 pg_backup_archiver.c:3685 +#: pg_backup_archiver.c:3486 pg_backup_archiver.c:3651 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "vet inte hur man sätter ägare för objekttyp \"%s\"" -#: pg_backup_archiver.c:3789 +#: pg_backup_archiver.c:3754 #, c-format msgid "did not find magic string in file header" msgstr "kunde inte hitta den magiska strängen i filhuvudet" -#: pg_backup_archiver.c:3802 +#: pg_backup_archiver.c:3768 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "ej supportad version (%d.%d) i filhuvudet" -#: pg_backup_archiver.c:3807 +#: pg_backup_archiver.c:3773 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "riktighetskontroll på heltalsstorlek (%lu) misslyckades" -#: pg_backup_archiver.c:3811 +#: pg_backup_archiver.c:3777 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "arkivet skapades på en maskin med större heltal, en del operationer kan misslyckas" -#: pg_backup_archiver.c:3821 +#: pg_backup_archiver.c:3787 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "förväntat format (%d) skiljer sig från formatet som fanns i filen (%d)" -#: pg_backup_archiver.c:3837 +#: pg_backup_archiver.c:3802 #, c-format msgid "archive is compressed, but this installation does not support compression -- no data will be available" msgstr "arkivet är komprimerat, men denna installation stödjer inte komprimering -- ingen data kommer kunna läsas" -#: pg_backup_archiver.c:3855 +#: pg_backup_archiver.c:3836 #, c-format msgid "invalid creation date in header" msgstr "ogiltig skapandedatum i huvud" -#: pg_backup_archiver.c:3983 +#: pg_backup_archiver.c:3970 #, c-format msgid "processing item %d %s %s" msgstr "processar objekt %d %s %s" -#: pg_backup_archiver.c:4062 +#: pg_backup_archiver.c:4049 #, c-format msgid "entering main parallel loop" msgstr "går in i parallella huvudloopen" -#: pg_backup_archiver.c:4073 +#: pg_backup_archiver.c:4060 #, c-format msgid "skipping item %d %s %s" msgstr "hoppar över objekt %d %s %s" -#: pg_backup_archiver.c:4082 +#: pg_backup_archiver.c:4069 #, c-format msgid "launching item %d %s %s" msgstr "startar objekt %d %s %s" -#: pg_backup_archiver.c:4136 +#: pg_backup_archiver.c:4123 #, c-format msgid "finished main parallel loop" msgstr "klar med parallella huvudloopen" -#: pg_backup_archiver.c:4172 +#: pg_backup_archiver.c:4159 #, c-format msgid "processing missed item %d %s %s" msgstr "processar saknat objekt %d %s %s" -#: pg_backup_archiver.c:4777 +#: pg_backup_archiver.c:4764 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "tabell \"%s\" kunde inte skapas, dess data kommer ej återställas" -#: pg_backup_custom.c:378 pg_backup_null.c:147 +#: pg_backup_custom.c:376 pg_backup_null.c:147 #, c-format msgid "invalid OID for large object" msgstr "ogiltig OID för stort objekt" -#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:632 -#: pg_backup_custom.c:870 pg_backup_tar.c:1086 pg_backup_tar.c:1091 +#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629 +#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021 #, c-format msgid "error during file seek: %m" msgstr "fel vid sökning: %m" -#: pg_backup_custom.c:480 +#: pg_backup_custom.c:478 #, c-format msgid "data block %d has wrong seek position" msgstr "datablock %d har fel sökposition" -#: pg_backup_custom.c:497 +#: pg_backup_custom.c:495 #, c-format msgid "unrecognized data block type (%d) while searching archive" msgstr "känner inte igen datablocktyp (%d) vid genomsökning av arkiv" -#: pg_backup_custom.c:519 +#: pg_backup_custom.c:517 #, c-format msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file" msgstr "kunde inte hitta block ID %d i arkiv -- kanske på grund av en återställningbegäran i oordning vilket inte kan hanteras då inputfilen inte är sökbar" -#: pg_backup_custom.c:524 +#: pg_backup_custom.c:522 #, c-format msgid "could not find block ID %d in archive -- possibly corrupt archive" msgstr "kunde inte hitta block ID %d i arkiv -- möjligen ett trasigt arkiv" -#: pg_backup_custom.c:531 +#: pg_backup_custom.c:529 #, c-format msgid "found unexpected block ID (%d) when reading data -- expected %d" msgstr "hittade oväntat block-ID (%d) vid läsning av data -- förväntade %d" -#: pg_backup_custom.c:545 +#: pg_backup_custom.c:543 #, c-format msgid "unrecognized data block type %d while restoring archive" msgstr "ej igenkänd datablockstyp %d vid återställande av arkiv" -#: pg_backup_custom.c:648 +#: pg_backup_custom.c:645 #, c-format msgid "could not read from input file: %m" msgstr "kunde inte läsa från infilen: %m" -#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:948 -#: pg_backup_tar.c:1089 +#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943 +#: pg_backup_tar.c:1019 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "kunde inte bestämma sökposition i arkivfil: %m" -#: pg_backup_custom.c:767 pg_backup_custom.c:807 +#: pg_backup_custom.c:762 pg_backup_custom.c:802 #, c-format msgid "could not close archive file: %m" msgstr "kan inte stänga arkivfilen: %m" -#: pg_backup_custom.c:790 +#: pg_backup_custom.c:785 #, c-format msgid "can only reopen input archives" msgstr "kan inte återöppna indataarkiven" -#: pg_backup_custom.c:797 +#: pg_backup_custom.c:792 #, c-format msgid "parallel restore from standard input is not supported" msgstr "parallell återställning från standard in stöds inte" -#: pg_backup_custom.c:799 +#: pg_backup_custom.c:794 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "parallell återställning för en icke sökbar fil stöds inte" -#: pg_backup_custom.c:815 +#: pg_backup_custom.c:810 #, c-format msgid "could not set seek position in archive file: %m" msgstr "kunde inte söka till rätt position i arkivfilen: %m" -#: pg_backup_custom.c:894 +#: pg_backup_custom.c:889 #, c-format msgid "compressor active" msgstr "komprimerare aktiv" -#: pg_backup_db.c:41 +#: pg_backup_db.c:42 #, c-format msgid "could not get server_version from libpq" msgstr "kunde inte hämta serverversionen från libpq" -#: pg_backup_db.c:52 pg_dumpall.c:1826 -#, c-format -msgid "server version: %s; %s version: %s" -msgstr "server version: %s; %s version: %s" - -#: pg_backup_db.c:54 pg_dumpall.c:1828 +#: pg_backup_db.c:53 pg_dumpall.c:1646 #, c-format msgid "aborting because of server version mismatch" msgstr "avbryter då serverversionerna i matchar" -#: pg_backup_db.c:124 +#: pg_backup_db.c:54 pg_dumpall.c:1647 +#, c-format +msgid "server version: %s; %s version: %s" +msgstr "server version: %s; %s version: %s" + +#: pg_backup_db.c:120 #, c-format msgid "already connected to a database" msgstr "är redan uppkopplad mot en databas" -#: pg_backup_db.c:133 pg_backup_db.c:185 pg_dumpall.c:1651 pg_dumpall.c:1764 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595 msgid "Password: " msgstr "Lösenord: " -#: pg_backup_db.c:177 +#: pg_backup_db.c:170 #, c-format msgid "could not connect to database" msgstr "kunde inte ansluta till databasen" -#: pg_backup_db.c:195 -#, c-format -msgid "reconnection to database \"%s\" failed: %s" -msgstr "återuppkoppling mot databas \"%s\" misslyckades: %s" - -#: pg_backup_db.c:199 +#: pg_backup_db.c:187 #, c-format -msgid "connection to database \"%s\" failed: %s" -msgstr "uppkoppling mot databas \"%s\" misslyckades: %s" +msgid "reconnection failed: %s" +msgstr "återanslutning misslyckades: %s" -#: pg_backup_db.c:272 pg_dumpall.c:1684 +#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dumpall.c:1520 pg_dumpall.c:1604 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:279 pg_dumpall.c:1889 pg_dumpall.c:1912 +#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732 #, c-format msgid "query failed: %s" msgstr "fråga misslyckades: %s" -#: pg_backup_db.c:281 pg_dumpall.c:1890 pg_dumpall.c:1913 +#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733 #, c-format -msgid "query was: %s" -msgstr "frågan var: %s" +msgid "Query was: %s" +msgstr "Frågan var: %s" -#: pg_backup_db.c:322 +#: pg_backup_db.c:316 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" msgstr[0] "fråga gav %d rad istället för en: %s" msgstr[1] "fråga gav %d rader istället för en: %s" -#: pg_backup_db.c:358 +#: pg_backup_db.c:352 #, c-format msgid "%s: %sCommand was: %s" msgstr "%s: %sKommandot var: %s" -#: pg_backup_db.c:414 pg_backup_db.c:488 pg_backup_db.c:495 +#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489 msgid "could not execute query" msgstr "kunde inte utföra fråga" -#: pg_backup_db.c:467 +#: pg_backup_db.c:461 #, c-format msgid "error returned by PQputCopyData: %s" msgstr "fel returnerat av PQputCopyData: %s" -#: pg_backup_db.c:516 +#: pg_backup_db.c:510 #, c-format msgid "error returned by PQputCopyEnd: %s" msgstr "fel returnerat av PQputCopyEnd: %s" -#: pg_backup_db.c:522 +#: pg_backup_db.c:516 #, c-format msgid "COPY failed for table \"%s\": %s" msgstr "COPY misslyckades för tabell \"%s\": %s" -#: pg_backup_db.c:528 pg_dump.c:1988 +#: pg_backup_db.c:522 pg_dump.c:2105 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "oväntade extraresultat under kopiering (COPY) av tabell \"%s\"" -#: pg_backup_db.c:540 +#: pg_backup_db.c:534 msgid "could not start database transaction" msgstr "kunde inte starta databastransaktionen" -#: pg_backup_db.c:548 +#: pg_backup_db.c:542 msgid "could not commit database transaction" msgstr "kunde inte genomföra databastransaktionen" @@ -1081,43 +1096,58 @@ msgstr "kunde inte stänga katalog \"%s\": %m" msgid "could not create directory \"%s\": %m" msgstr "kunde inte skapa katalog \"%s\": %m" -#: pg_backup_directory.c:355 pg_backup_directory.c:496 -#: pg_backup_directory.c:532 +#: pg_backup_directory.c:355 pg_backup_directory.c:497 +#: pg_backup_directory.c:533 #, c-format msgid "could not write to output file: %s" msgstr "kunde inte skriva till utdatafil: %s" -#: pg_backup_directory.c:406 +#: pg_backup_directory.c:373 +#, c-format +msgid "could not close data file: %m" +msgstr "kan inte stänga datafil: %m" + +#: pg_backup_directory.c:407 #, c-format msgid "could not close data file \"%s\": %m" msgstr "kan inte stänga datafil \"%s\": %m" -#: pg_backup_directory.c:446 +#: pg_backup_directory.c:447 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "kunde inte öppna stora objekts TOC-fil \"%s\" för läsning: %m" -#: pg_backup_directory.c:457 +#: pg_backup_directory.c:458 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "ogiltig rad i stora objekts TOC-fil \"%s\": \"%s\"" -#: pg_backup_directory.c:466 +#: pg_backup_directory.c:467 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "fel vid lösning av stora objekts TOC-fil \"%s\"" -#: pg_backup_directory.c:470 +#: pg_backup_directory.c:471 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "kunde inte stänga stora objekts TOC-fil \"%s\": %m" -#: pg_backup_directory.c:689 +#: pg_backup_directory.c:685 +#, c-format +msgid "could not close blob data file: %m" +msgstr "kan inte stänga blobbars datafil: %m" + +#: pg_backup_directory.c:691 #, c-format msgid "could not write to blobs TOC file" msgstr "kunde inte skriva till blobbars TOC-fil" -#: pg_backup_directory.c:721 +#: pg_backup_directory.c:705 +#, c-format +msgid "could not close blobs TOC file: %m" +msgstr "kunde inte stänga blobbars TOC-fil: %m" + +#: pg_backup_directory.c:724 #, c-format msgid "file name too long: \"%s\"" msgstr "filnamnet är för långt: \"%s\"" @@ -1127,208 +1157,168 @@ msgstr "filnamnet är för långt: \"%s\"" msgid "this format cannot be read" msgstr "detta format kan inte läsas" -#: pg_backup_tar.c:177 +#: pg_backup_tar.c:172 #, c-format msgid "could not open TOC file \"%s\" for output: %m" msgstr "kunde inte öppna TOC-filen \"%s\" för utmatning: %m" -#: pg_backup_tar.c:184 +#: pg_backup_tar.c:179 #, c-format msgid "could not open TOC file for output: %m" msgstr "kunde inte öppna TOC-filen för utmatning: %m" -#: pg_backup_tar.c:203 pg_backup_tar.c:358 +#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389 +#: pg_backup_tar.c:405 pg_backup_tar.c:893 #, c-format msgid "compression is not supported by tar archive format" msgstr "komprimering är stödjs inte av arkivformatet tar" -#: pg_backup_tar.c:211 +#: pg_backup_tar.c:206 #, c-format msgid "could not open TOC file \"%s\" for input: %m" msgstr "kunde inte öppna TOC-fil \"%s\" för läsning: %m" -#: pg_backup_tar.c:218 +#: pg_backup_tar.c:213 #, c-format msgid "could not open TOC file for input: %m" msgstr "kunde inte öppna TOC-fil för läsning: %m" -#: pg_backup_tar.c:344 +#: pg_backup_tar.c:322 #, c-format msgid "could not find file \"%s\" in archive" msgstr "kunde inte hitta fil \"%s\" i arkiv" -#: pg_backup_tar.c:410 +#: pg_backup_tar.c:382 #, c-format msgid "could not generate temporary file name: %m" msgstr "kunde inte generera temporärt filnamn: %m" -#: pg_backup_tar.c:421 -#, c-format -msgid "could not open temporary file" -msgstr "kunde inte öppna temporär fil" - -#: pg_backup_tar.c:448 -#, c-format -msgid "could not close tar member" -msgstr "kunde inte stänga tar-medlem" - -#: pg_backup_tar.c:691 +#: pg_backup_tar.c:624 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "oväntad COPY-satssyntax: \"%s\"" -#: pg_backup_tar.c:958 +#: pg_backup_tar.c:890 #, c-format msgid "invalid OID for large object (%u)" msgstr "ogiltig OID för stort objekt (%u)" -#: pg_backup_tar.c:1105 +#: pg_backup_tar.c:1035 #, c-format msgid "could not close temporary file: %m" msgstr "kunde inte stänga temporär fil: %m" -#: pg_backup_tar.c:1114 +#: pg_backup_tar.c:1038 #, c-format -msgid "actual file length (%s) does not match expected (%s)" -msgstr "verklig fillängd (%s) matchar inte det förväntade (%s)" +msgid "actual file length (%lld) does not match expected (%lld)" +msgstr "verklig fillängd (%lld) matchar inte det förväntade (%lld)" -#: pg_backup_tar.c:1171 pg_backup_tar.c:1201 +#: pg_backup_tar.c:1084 pg_backup_tar.c:1115 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "kunde inte hitta filhuvud för fil \"%s\" i tar-arkiv" -#: pg_backup_tar.c:1189 +#: pg_backup_tar.c:1102 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "dumpa data i oordning stöds inte av detta arkivformat: \"%s\" krävs, men kommer före \"%s\" i denna arkivfil." -#: pg_backup_tar.c:1234 +#: pg_backup_tar.c:1149 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "inkomplett tar-huvud hittat (%lu byte)" msgstr[1] "inkomplett tar-huvud hittat (%lu bytes)" -#: pg_backup_tar.c:1285 +#: pg_backup_tar.c:1188 #, c-format -msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s" -msgstr "trasigt tar-huvud hittat i %s (förväntade %d, beräknad %d) filposition %s" +msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" +msgstr "trasigt tar-huvud hittat i %s (förväntade %d, beräknad %d) filposition %llu" #: pg_backup_utils.c:54 #, c-format msgid "unrecognized section name: \"%s\"" msgstr "okänt sektionsnamn: \"%s\"" -#: pg_backup_utils.c:55 pg_dump.c:607 pg_dump.c:624 pg_dumpall.c:338 -#: pg_dumpall.c:348 pg_dumpall.c:357 pg_dumpall.c:366 pg_dumpall.c:374 -#: pg_dumpall.c:388 pg_dumpall.c:464 pg_restore.c:284 pg_restore.c:300 -#: pg_restore.c:318 +#: pg_backup_utils.c:55 pg_dump.c:627 pg_dump.c:644 pg_dumpall.c:340 +#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373 +#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307 +#: pg_restore.c:321 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Försök med \"%s --help\" för mer information.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." -#: pg_backup_utils.c:68 +#: pg_backup_utils.c:66 #, c-format msgid "out of on_exit_nicely slots" msgstr "slut på on_exit_nicely-slottar" -#: pg_dump.c:533 -#, c-format -msgid "compression level must be in range 0..9" -msgstr "komprimeringsnivå måste vara i intervallet 0..9" - -#: pg_dump.c:571 -#, c-format -msgid "extra_float_digits must be in range -15..3" -msgstr "extra_float_digits måste vara i intervallet -15..3" - -#: pg_dump.c:594 -#, c-format -msgid "rows-per-insert must be in range %d..%d" -msgstr "rows-per-insert måste vara i intervallet %d..%d" - -#: pg_dump.c:622 pg_dumpall.c:346 pg_restore.c:298 +#: pg_dump.c:642 pg_dumpall.c:348 pg_restore.c:305 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för många kommandoradsargument (första är \"%s\")" -#: pg_dump.c:643 pg_restore.c:327 +#: pg_dump.c:661 pg_restore.c:328 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "flaggorna \"bara schema\" (-s) och \"bara data\" (-a) kan inte användas tillsammans" -#: pg_dump.c:648 +#: pg_dump.c:664 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "flaggorna -s/--schema-only och --include-foreign-data kan inte användas tillsammans" -#: pg_dump.c:651 +#: pg_dump.c:667 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "flaggan --include-foreign-data stöds inte med parallell backup" -#: pg_dump.c:655 pg_restore.c:333 +#: pg_dump.c:670 pg_restore.c:331 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "flaggorna \"nollställ\" (-c) och \"bara data\" (-a) kan inte användas tillsammans" -#: pg_dump.c:660 pg_dumpall.c:381 pg_restore.c:382 +#: pg_dump.c:673 pg_dumpall.c:378 pg_restore.c:356 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "flaggan --if-exists kräver flaggan -c/--clean" -#: pg_dump.c:667 +#: pg_dump.c:680 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "flagga --on-conflict-do-nothing kräver --inserts, --rows-per-insert eller --column-inserts" -#: pg_dump.c:689 +#: pg_dump.c:702 #, c-format msgid "requested compression not available in this installation -- archive will be uncompressed" msgstr "efterfrågad komprimering finns inte i denna installation -- arkivet kommer sparas okomprimerat" -#: pg_dump.c:710 pg_restore.c:349 -#, c-format -msgid "invalid number of parallel jobs" -msgstr "felaktigt antal parallella job" - -#: pg_dump.c:714 +#: pg_dump.c:715 #, c-format msgid "parallel backup only supported by the directory format" msgstr "parallell backup stöds bara med katalogformat" -#: pg_dump.c:769 -#, c-format -msgid "" -"Synchronized snapshots are not supported by this server version.\n" -"Run with --no-synchronized-snapshots instead if you do not need\n" -"synchronized snapshots." -msgstr "" -"Synkroniseringssnapshots stöds inte av denna serverversion.\n" -"Kör med --no-synchronized-snapshots istället om du inte kräver\n" -"synkroniserade snapshots." - -#: pg_dump.c:775 -#, c-format -msgid "Exported snapshots are not supported by this server version." -msgstr "Exporterade snapshots stöds inte i denna serverversion." - -#: pg_dump.c:787 +#: pg_dump.c:761 #, c-format msgid "last built-in OID is %u" msgstr "sista inbyggda OID är %u" -#: pg_dump.c:796 +#: pg_dump.c:770 #, c-format msgid "no matching schemas were found" msgstr "hittade inga matchande scheman" -#: pg_dump.c:810 +#: pg_dump.c:784 #, c-format msgid "no matching tables were found" msgstr "hittade inga matchande tabeller" -#: pg_dump.c:990 +#: pg_dump.c:806 +#, c-format +msgid "no matching extensions were found" +msgstr "hittade inga matchande utökningar" + +#: pg_dump.c:989 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1337,17 +1327,17 @@ msgstr "" "%s dumpar en databas som en textfil eller i andra format.\n" "\n" -#: pg_dump.c:991 pg_dumpall.c:617 pg_restore.c:462 +#: pg_dump.c:990 pg_dumpall.c:605 pg_restore.c:433 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: pg_dump.c:992 +#: pg_dump.c:991 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [FLAGGA]... [DBNAMN]\n" -#: pg_dump.c:994 pg_dumpall.c:620 pg_restore.c:465 +#: pg_dump.c:993 pg_dumpall.c:608 pg_restore.c:436 #, c-format msgid "" "\n" @@ -1356,12 +1346,12 @@ msgstr "" "\n" "Allmänna flaggor:\n" -#: pg_dump.c:995 +#: pg_dump.c:994 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=FILENAME fil eller katalognamn för utdata\n" -#: pg_dump.c:996 +#: pg_dump.c:995 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1370,42 +1360,42 @@ msgstr "" " -F, --format=c|d|t|p utdatans filformat (egen (c), katalog (d), tar (t),\n" " ren text (p) (standard))\n" -#: pg_dump.c:998 +#: pg_dump.c:997 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM använd så här många parellella job för att dumpa\n" -#: pg_dump.c:999 pg_dumpall.c:622 +#: pg_dump.c:998 pg_dumpall.c:610 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose visa mer information\n" -#: pg_dump.c:1000 pg_dumpall.c:623 +#: pg_dump.c:999 pg_dumpall.c:611 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_dump.c:1001 +#: pg_dump.c:1000 #, c-format msgid " -Z, --compress=0-9 compression level for compressed formats\n" msgstr " -Z, --compress=0-9 komprimeringsnivå för komprimerade format\n" -#: pg_dump.c:1002 pg_dumpall.c:624 +#: pg_dump.c:1001 pg_dumpall.c:612 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr " --lock-wait-timeout=TIMEOUT misslyckas efter att ha väntat i TIMEOUT på tabellås\n" -#: pg_dump.c:1003 pg_dumpall.c:651 +#: pg_dump.c:1002 pg_dumpall.c:639 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync vänta inte på att ändingar säkert skrivits till disk\n" -#: pg_dump.c:1004 pg_dumpall.c:625 +#: pg_dump.c:1003 pg_dumpall.c:613 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: pg_dump.c:1006 pg_dumpall.c:626 +#: pg_dump.c:1005 pg_dumpall.c:614 #, c-format msgid "" "\n" @@ -1414,32 +1404,37 @@ msgstr "" "\n" "Flaggor som styr utmatning:\n" -#: pg_dump.c:1007 pg_dumpall.c:627 +#: pg_dump.c:1006 pg_dumpall.c:615 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only dumpa bara data, inte schema\n" -#: pg_dump.c:1008 +#: pg_dump.c:1007 #, c-format msgid " -b, --blobs include large objects in dump\n" msgstr " -b, --blobs inkludera stora objekt i dumpen\n" -#: pg_dump.c:1009 +#: pg_dump.c:1008 #, c-format msgid " -B, --no-blobs exclude large objects in dump\n" msgstr " -B, --no-blobs exkludera stora objekt i dumpen\n" -#: pg_dump.c:1010 pg_restore.c:476 +#: pg_dump.c:1009 pg_restore.c:447 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr " -c, --clean nollställ (drop) databasobjekt innan återskapande\n" -#: pg_dump.c:1011 +#: pg_dump.c:1010 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr " -C, --create inkludera kommandon för att skapa databasen i dumpen\n" -#: pg_dump.c:1012 pg_dumpall.c:629 +#: pg_dump.c:1011 +#, c-format +msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" +msgstr " -e, --extension=MALL dumpa bara de angivna utökningarna\n" + +#: pg_dump.c:1012 pg_dumpall.c:617 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=KODNING dumpa data i teckenkodning KODNING\n" @@ -1463,7 +1458,7 @@ msgstr "" " -O, --no-owner hoppa över återställande av objektägare i\n" " textformatdumpar\n" -#: pg_dump.c:1017 pg_dumpall.c:633 +#: pg_dump.c:1017 pg_dumpall.c:621 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only dumpa bara scheman, inte data\n" @@ -1471,7 +1466,7 @@ msgstr " -s, --schema-only dumpa bara scheman, inte data\n" #: pg_dump.c:1018 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" -msgstr " -S, --superuser=NAME superanvändarens namn för textformatdumpar\n" +msgstr " -S, --superuser=NAME namn på superuser för textformatdumpar\n" #: pg_dump.c:1019 #, c-format @@ -1483,27 +1478,27 @@ msgstr " -t, --table=MALL dumpa bara de angivna tabellerna\n" msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=MALL dumpa INTE de angivna tabellerna\n" -#: pg_dump.c:1021 pg_dumpall.c:636 +#: pg_dump.c:1021 pg_dumpall.c:624 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges dumpa inte rättigheter (grant/revoke)\n" -#: pg_dump.c:1022 pg_dumpall.c:637 +#: pg_dump.c:1022 pg_dumpall.c:625 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade används bara av uppgraderingsverktyg\n" -#: pg_dump.c:1023 pg_dumpall.c:638 +#: pg_dump.c:1023 pg_dumpall.c:626 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr " --column-inserts dumpa data som INSERT med kolumnnamn\n" -#: pg_dump.c:1024 pg_dumpall.c:639 +#: pg_dump.c:1024 pg_dumpall.c:627 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr " --disable-dollar-quoting slå av dollar-citering, använd standard SQL-citering\n" -#: pg_dump.c:1025 pg_dumpall.c:640 pg_restore.c:493 +#: pg_dump.c:1025 pg_dumpall.c:628 pg_restore.c:464 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr " --disable-triggers slå av utlösare vid återställning av enbart data\n" @@ -1522,12 +1517,12 @@ msgstr "" msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=MALL dumpa INTE data för de angivna tabellerna\n" -#: pg_dump.c:1029 pg_dumpall.c:642 +#: pg_dump.c:1029 pg_dumpall.c:630 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr " --extra-float-digits=NUM övertrumfa standardinställningen för extra_float_digits\n" -#: pg_dump.c:1030 pg_dumpall.c:643 pg_restore.c:495 +#: pg_dump.c:1030 pg_dumpall.c:631 pg_restore.c:466 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists använd IF EXISTS när objekt droppas\n" @@ -1543,82 +1538,87 @@ msgstr "" " inkludera data i främmande tabeller från\n" " främmande servrar som matchar MALL\n" -#: pg_dump.c:1034 pg_dumpall.c:644 +#: pg_dump.c:1034 pg_dumpall.c:632 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr " --inserts dumpa data som INSERT, istället för COPY\n" -#: pg_dump.c:1035 pg_dumpall.c:645 +#: pg_dump.c:1035 pg_dumpall.c:633 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root ladda partitioner via root-tabellen\n" -#: pg_dump.c:1036 pg_dumpall.c:646 +#: pg_dump.c:1036 pg_dumpall.c:634 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments dumpa inte kommentarer\n" -#: pg_dump.c:1037 pg_dumpall.c:647 +#: pg_dump.c:1037 pg_dumpall.c:635 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications dumpa inte publiceringar\n" -#: pg_dump.c:1038 pg_dumpall.c:649 +#: pg_dump.c:1038 pg_dumpall.c:637 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr " --no-security-labels dumpa inte tilldelning av säkerhetsetiketter\n" -#: pg_dump.c:1039 pg_dumpall.c:650 +#: pg_dump.c:1039 pg_dumpall.c:638 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions dumpa inte prenumereringar\n" -#: pg_dump.c:1040 +#: pg_dump.c:1040 pg_dumpall.c:640 #, c-format -msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n" -msgstr " --no-synchronized-snapshots använd inte synkroniserade snapshots i parallella job\n" +msgid " --no-table-access-method do not dump table access methods\n" +msgstr " --no-table-access-method dumpa inte tabellaccessmetoder\n" -#: pg_dump.c:1041 pg_dumpall.c:652 +#: pg_dump.c:1041 pg_dumpall.c:641 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces dumpa inte användning av tabellutymmen\n" -#: pg_dump.c:1042 pg_dumpall.c:653 +#: pg_dump.c:1042 pg_dumpall.c:642 +#, c-format +msgid " --no-toast-compression do not dump TOAST compression methods\n" +msgstr " --no-toast-compression dumpa inte komprimeringsmetoder för TOAST\n" + +#: pg_dump.c:1043 pg_dumpall.c:643 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data dumpa inte ologgad tabelldata\n" -#: pg_dump.c:1043 pg_dumpall.c:654 +#: pg_dump.c:1044 pg_dumpall.c:644 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" msgstr " --on-conflict-do-nothing addera ON CONFLICT DO NOTHING till INSERT-kommandon\n" -#: pg_dump.c:1044 pg_dumpall.c:655 +#: pg_dump.c:1045 pg_dumpall.c:645 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr " --quote-all-identifiers citera alla identifierar, även om de inte är nyckelord\n" -#: pg_dump.c:1045 pg_dumpall.c:656 +#: pg_dump.c:1046 pg_dumpall.c:646 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=NRADER antal rader per INSERT; implicerar --inserts\n" -#: pg_dump.c:1046 +#: pg_dump.c:1047 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr " --section=SEKTION dumpa namngiven sektion (pre-data, data eller post-data)\n" -#: pg_dump.c:1047 +#: pg_dump.c:1048 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr " --serializable-deferrable wait until the dump can run without anomalies\n" -#: pg_dump.c:1048 +#: pg_dump.c:1049 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT använda namngivet snapshot för att dumpa\n" -#: pg_dump.c:1049 pg_restore.c:504 +#: pg_dump.c:1050 pg_restore.c:476 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" @@ -1627,7 +1627,7 @@ msgstr "" " --strict-names kräv att mallar för tabeller och/eller scheman matchar\n" " minst en sak var\n" -#: pg_dump.c:1051 pg_dumpall.c:657 pg_restore.c:506 +#: pg_dump.c:1052 pg_dumpall.c:647 pg_restore.c:478 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1638,7 +1638,7 @@ msgstr "" " använd kommandot SET SESSION AUTHORIZATION istället för\n" " kommandot ALTER OWNER för att sätta ägare\n" -#: pg_dump.c:1055 pg_dumpall.c:661 pg_restore.c:510 +#: pg_dump.c:1056 pg_dumpall.c:651 pg_restore.c:482 #, c-format msgid "" "\n" @@ -1647,42 +1647,42 @@ msgstr "" "\n" "Flaggor för anslutning:\n" -#: pg_dump.c:1056 +#: pg_dump.c:1057 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAMN databasens som skall dumpas\n" -#: pg_dump.c:1057 pg_dumpall.c:663 pg_restore.c:511 +#: pg_dump.c:1058 pg_dumpall.c:653 pg_restore.c:483 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n" -#: pg_dump.c:1058 pg_dumpall.c:665 pg_restore.c:512 +#: pg_dump.c:1059 pg_dumpall.c:655 pg_restore.c:484 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT databasens värdport\n" -#: pg_dump.c:1059 pg_dumpall.c:666 pg_restore.c:513 +#: pg_dump.c:1060 pg_dumpall.c:656 pg_restore.c:485 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAMN anslut med datta användarnamn mot databasen\n" -#: pg_dump.c:1060 pg_dumpall.c:667 pg_restore.c:514 +#: pg_dump.c:1061 pg_dumpall.c:657 pg_restore.c:486 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password fråga aldrig efter lösenord\n" -#: pg_dump.c:1061 pg_dumpall.c:668 pg_restore.c:515 +#: pg_dump.c:1062 pg_dumpall.c:658 pg_restore.c:487 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password fråga om lösenord (borde ske automatiskt)\n" -#: pg_dump.c:1062 pg_dumpall.c:669 +#: pg_dump.c:1063 pg_dumpall.c:659 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROLLNAMN gör SET ROLE innan dumpen\n" -#: pg_dump.c:1064 +#: pg_dump.c:1065 #, c-format msgid "" "\n" @@ -1695,551 +1695,500 @@ msgstr "" "PGDATABASE att användas.\n" "\n" -#: pg_dump.c:1066 pg_dumpall.c:673 pg_restore.c:522 +#: pg_dump.c:1067 pg_dumpall.c:663 pg_restore.c:494 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapportera fel till <%s>.\n" -#: pg_dump.c:1067 pg_dumpall.c:674 pg_restore.c:523 +#: pg_dump.c:1068 pg_dumpall.c:664 pg_restore.c:495 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_dump.c:1086 pg_dumpall.c:499 +#: pg_dump.c:1087 pg_dumpall.c:488 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "ogiltig klientteckenkodning \"%s\" angiven" -#: pg_dump.c:1232 +#: pg_dump.c:1225 #, c-format -msgid "" -"Synchronized snapshots on standby servers are not supported by this server version.\n" -"Run with --no-synchronized-snapshots instead if you do not need\n" -"synchronized snapshots." -msgstr "" -"Synkroniserade snapshots på standby-servrar stöds inte av denna serverversion.\n" -"Kör med --no-synchronized-snapshots istället om du inte behöver\n" -"synkroniserade snapshots." +msgid "parallel dumps from standby servers are not supported by this server version" +msgstr "parallella dumpar från standby-server stöds inte av denna serverversion" -#: pg_dump.c:1301 +#: pg_dump.c:1290 #, c-format msgid "invalid output format \"%s\" specified" msgstr "ogiltigt utdataformat \"%s\" angivet" +#: pg_dump.c:1331 pg_dump.c:1387 pg_dump.c:1440 pg_dumpall.c:1282 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "ej korrekt kvalificerat namn (för många namn med punkt): %s" + #: pg_dump.c:1339 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "hittade inga matchande scheman för mallen \"%s\"" -#: pg_dump.c:1386 +#: pg_dump.c:1392 +#, c-format +msgid "no matching extensions were found for pattern \"%s\"" +msgstr "hittade inga matchande utökningar för mallen \"%s\"" + +#: pg_dump.c:1445 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "hittade inga matchande främmande servrar för mallen \"%s\"" -#: pg_dump.c:1449 +#: pg_dump.c:1508 +#, c-format +msgid "improper relation name (too many dotted names): %s" +msgstr "ej korrekt relationsnamn (för många namn med punkt): %s" + +#: pg_dump.c:1519 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "hittade inga matchande tabeller för mallen \"%s\"" -#: pg_dump.c:1862 +#: pg_dump.c:1546 +#, c-format +msgid "You are currently not connected to a database." +msgstr "Du är för närvarande inte uppkopplad mot en databas." + +#: pg_dump.c:1549 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "referenser till andra databaser är inte implementerat: %s" + +#: pg_dump.c:1980 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "dumpar innehållet i tabell \"%s.%s\"" -#: pg_dump.c:1969 +#: pg_dump.c:2086 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Dumpning av innehållet i tabellen \"%s\" misslyckades: PQendcopy() misslyckades." -#: pg_dump.c:1970 pg_dump.c:1980 +#: pg_dump.c:2087 pg_dump.c:2097 #, c-format msgid "Error message from server: %s" msgstr "Felmeddelandet från servern: %s" -#: pg_dump.c:1971 pg_dump.c:1981 +#: pg_dump.c:2088 pg_dump.c:2098 #, c-format -msgid "The command was: %s" +msgid "Command was: %s" msgstr "Kommandot var: %s" -#: pg_dump.c:1979 +#: pg_dump.c:2096 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Dumpning av innehållet i tabellen \"%s\" misslyckades: PQgetResult() misslyckades." -#: pg_dump.c:2739 +#: pg_dump.c:2178 +#, c-format +msgid "wrong number of fields retrieved from table \"%s\"" +msgstr "fel antal fält hämtades för tabell \"%s\"" + +#: pg_dump.c:2836 #, c-format msgid "saving database definition" msgstr "sparar databasdefinition" -#: pg_dump.c:3211 +#: pg_dump.c:2932 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "okänd lokalleverantör: %s" + +#: pg_dump.c:3248 #, c-format msgid "saving encoding = %s" msgstr "sparar kodning = %s" -#: pg_dump.c:3236 +#: pg_dump.c:3273 #, c-format msgid "saving standard_conforming_strings = %s" msgstr "sparar standard_conforming_strings = %s" -#: pg_dump.c:3275 +#: pg_dump.c:3312 #, c-format msgid "could not parse result of current_schemas()" msgstr "kunde inte parsa resultat från current_schemas()" -#: pg_dump.c:3294 +#: pg_dump.c:3331 #, c-format msgid "saving search_path = %s" msgstr "sparar search_path = %s" -#: pg_dump.c:3334 +#: pg_dump.c:3369 #, c-format msgid "reading large objects" msgstr "läser stora objekt" -#: pg_dump.c:3516 +#: pg_dump.c:3507 #, c-format msgid "saving large objects" msgstr "sparar stora objekt" -#: pg_dump.c:3562 +#: pg_dump.c:3548 #, c-format msgid "error reading large object %u: %s" msgstr "fel vid läsning av stort objekt %u: %s" -#: pg_dump.c:3614 -#, c-format -msgid "reading row security enabled for table \"%s.%s\"" -msgstr "läser aktiverad radsäkerhet för tabell \"%s.%s\"" - -#: pg_dump.c:3645 +#: pg_dump.c:3654 #, c-format -msgid "reading policies for table \"%s.%s\"" -msgstr "läser policys för tabell \"%s.%s\"" +msgid "reading row-level security policies" +msgstr "läser säkerhetspolicy på radnivå" -#: pg_dump.c:3797 +#: pg_dump.c:3795 #, c-format msgid "unexpected policy command type: %c" msgstr "oväntad kommandotyp för policy: %c" -#: pg_dump.c:3948 +#: pg_dump.c:4245 pg_dump.c:4562 pg_dump.c:11693 pg_dump.c:17510 +#: pg_dump.c:17512 pg_dump.c:18133 #, c-format -msgid "owner of publication \"%s\" appears to be invalid" -msgstr "ägare av publicering \"%s\" verkar vara ogiltig" +msgid "could not parse %s array" +msgstr "kunde inte parsa arrayen %s" -#: pg_dump.c:4093 -#, c-format -msgid "reading publication membership for table \"%s.%s\"" -msgstr "läser publiceringsmedlemskap för tabell \"%s.%s\"" - -#: pg_dump.c:4236 +#: pg_dump.c:4430 #, c-format msgid "subscriptions not dumped because current user is not a superuser" -msgstr "prenumerationer har inte dumpats få aktuell användare inte är en superanvändare" - -#: pg_dump.c:4290 -#, c-format -msgid "owner of subscription \"%s\" appears to be invalid" -msgstr "ägare av prenumeration \"%s\" verkar vara ogiltig" +msgstr "prenumerationer har inte dumpats få aktuell användare inte är en superuser" -#: pg_dump.c:4334 -#, c-format -msgid "could not parse subpublications array" -msgstr "kunde inte parsa arrayen för subpubliceringar" - -#: pg_dump.c:4656 +#: pg_dump.c:4944 #, c-format msgid "could not find parent extension for %s %s" msgstr "kunde inte hitta föräldrautökning för %s %s" -#: pg_dump.c:4788 -#, c-format -msgid "owner of schema \"%s\" appears to be invalid" -msgstr "ägare av schema \"%s\" verkar vara ogiltig" - -#: pg_dump.c:4811 +#: pg_dump.c:5089 #, c-format msgid "schema with OID %u does not exist" msgstr "schema med OID %u existerar inte" -#: pg_dump.c:5136 -#, c-format -msgid "owner of data type \"%s\" appears to be invalid" -msgstr "ägare av datatyp \"%s\" verkar vara ogiltig" - -#: pg_dump.c:5221 -#, c-format -msgid "owner of operator \"%s\" appears to be invalid" -msgstr "ägare av operator \"%s\" verkar vara ogiltig" - -#: pg_dump.c:5523 -#, c-format -msgid "owner of operator class \"%s\" appears to be invalid" -msgstr "ägare av operatorklass \"%s\" verkar vara ogiltig" - -#: pg_dump.c:5607 -#, c-format -msgid "owner of operator family \"%s\" appears to be invalid" -msgstr "ägare av operator-familj \"%s\" verkar vara ogiltig" - -#: pg_dump.c:5776 -#, c-format -msgid "owner of aggregate function \"%s\" appears to be invalid" -msgstr "ägare av aggregatfunktion \"%s\" verkar vara ogiltig" - -#: pg_dump.c:6036 -#, c-format -msgid "owner of function \"%s\" appears to be invalid" -msgstr "ägare av funktion \"%s\" verkar vara ogiltig" - -#: pg_dump.c:6864 -#, c-format -msgid "owner of table \"%s\" appears to be invalid" -msgstr "ägare av tabell \"%s\" verkar vara ogiltig" - -#: pg_dump.c:6906 pg_dump.c:17386 +#: pg_dump.c:6543 pg_dump.c:16774 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "misslyckades med riktighetskontroll, föräldratabell med OID %u för sekvens med OID %u hittas inte" -#: pg_dump.c:7048 +#: pg_dump.c:6847 pg_dump.c:7114 pg_dump.c:7585 pg_dump.c:8252 pg_dump.c:8373 +#: pg_dump.c:8527 #, c-format -msgid "reading indexes for table \"%s.%s\"" -msgstr "läser index för tabell \"%s.%s\"" +msgid "unrecognized table OID %u" +msgstr "okänt tabell-OID %u" -#: pg_dump.c:7463 +#: pg_dump.c:6851 #, c-format -msgid "reading foreign key constraints for table \"%s.%s\"" -msgstr "läser främmande nyckel-villkor för tabell \"%s.%s\"" +msgid "unexpected index data for table \"%s\"" +msgstr "oväntat indexdata för tabell \"%s\"" -#: pg_dump.c:7744 +#: pg_dump.c:7346 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "misslyckades med riktighetskontroll, föräldratabell med OID %u för pg_rewrite-rad med OID %u hittades inte" -#: pg_dump.c:7827 -#, c-format -msgid "reading triggers for table \"%s.%s\"" -msgstr "läser utlösare för tabell \"%s.%s\"" - -#: pg_dump.c:7960 +#: pg_dump.c:7637 #, c-format msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" msgstr "fråga producerade null som refererad tabell för främmande nyckel-utlösare \"%s\" i tabell \"%s\" (OID för tabell : %u)" -#: pg_dump.c:8515 +#: pg_dump.c:8256 #, c-format -msgid "finding the columns and types of table \"%s.%s\"" -msgstr "hittar kolumner och typer för tabell \"%s.%s\"" +msgid "unexpected column data for table \"%s\"" +msgstr "oväntad kolumndata för tabell \"%s\"" -#: pg_dump.c:8651 +#: pg_dump.c:8286 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "ogiltigt kolumnnumrering i tabell \"%s\"" -#: pg_dump.c:8688 +#: pg_dump.c:8335 #, c-format -msgid "finding default expressions of table \"%s.%s\"" -msgstr "hittar default-uttryck för tabell \"%s.%s\"" +msgid "finding table default expressions" +msgstr "hittar tabellers default-uttryck" -#: pg_dump.c:8710 +#: pg_dump.c:8377 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "felaktigt adnum-värde %d för tabell \"%s\"" -#: pg_dump.c:8775 +#: pg_dump.c:8477 #, c-format -msgid "finding check constraints for table \"%s.%s\"" -msgstr "hittar check-villkor för tabell \"%s.%s\"" +msgid "finding table check constraints" +msgstr "hittar tabellers check-villkor" -#: pg_dump.c:8824 +#: pg_dump.c:8531 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "förväntade %d check-villkor för tabell \"%s\" men hittade %d" msgstr[1] "förväntade %d check-villkor för tabell \"%s\" men hittade %d" -#: pg_dump.c:8828 -#, c-format -msgid "(The system catalogs might be corrupted.)" -msgstr "(systemkatalogerna kan vara trasiga.)" - -#: pg_dump.c:10414 -#, c-format -msgid "typtype of data type \"%s\" appears to be invalid" -msgstr "typtype för datatyp \"%s\" verkar vara ogiltig" - -#: pg_dump.c:11768 -#, c-format -msgid "bogus value in proargmodes array" -msgstr "felaktigt värde i arrayen proargmodes" - -#: pg_dump.c:12140 +#: pg_dump.c:8535 #, c-format -msgid "could not parse proallargtypes array" -msgstr "kunde inte tolka arrayen proallargtypes" +msgid "The system catalogs might be corrupted." +msgstr "Systemkatalogerna kan vara trasiga." -#: pg_dump.c:12156 +#: pg_dump.c:9225 #, c-format -msgid "could not parse proargmodes array" -msgstr "kunde inte tolka arrayen proargmodes" +msgid "role with OID %u does not exist" +msgstr "roll med OID %u existerar inte" -#: pg_dump.c:12170 +#: pg_dump.c:9337 pg_dump.c:9366 #, c-format -msgid "could not parse proargnames array" -msgstr "kunde inte tolka arrayen proargnames" +msgid "unsupported pg_init_privs entry: %u %u %d" +msgstr "ogiltig pg_init_privs-post: %u %u %d" -#: pg_dump.c:12181 +#: pg_dump.c:10187 #, c-format -msgid "could not parse proconfig array" -msgstr "kunde inte tolka arrayen proconfig" +msgid "typtype of data type \"%s\" appears to be invalid" +msgstr "typtype för datatyp \"%s\" verkar vara ogiltig" -#: pg_dump.c:12261 +#: pg_dump.c:11762 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "okänt provolatile-värde för funktion \"%s\"" -#: pg_dump.c:12311 pg_dump.c:14369 +#: pg_dump.c:11812 pg_dump.c:13603 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "okänt proparallel-värde för funktion \"%s\"" -#: pg_dump.c:12450 pg_dump.c:12559 pg_dump.c:12566 +#: pg_dump.c:11943 pg_dump.c:12049 pg_dump.c:12056 #, c-format msgid "could not find function definition for function with OID %u" msgstr "kunde inte hitta funktionsdefinitionen för funktion med OID %u" -#: pg_dump.c:12489 +#: pg_dump.c:11982 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "felaktigt värde i fältet pg_cast.castfunc eller pg_cast.castmethod" -#: pg_dump.c:12492 +#: pg_dump.c:11985 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "felaktigt värde i fältet pg_cast.castmethod" -#: pg_dump.c:12585 +#: pg_dump.c:12075 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "felaktig transform-definition, minst en av trffromsql och trftosql måste vara ickenoll" -#: pg_dump.c:12602 +#: pg_dump.c:12092 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "felaktigt värde i fältet pg_transform.trffromsql" -#: pg_dump.c:12623 +#: pg_dump.c:12113 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "felaktigt värde i fältet pg_transform.trftosql" -#: pg_dump.c:12939 +#: pg_dump.c:12258 +#, c-format +msgid "postfix operators are not supported anymore (operator \"%s\")" +msgstr "postfix-operatorer stöds inte längre (operator \"%s\")" + +#: pg_dump.c:12428 #, c-format msgid "could not find operator with OID %s" msgstr "kunde inte hitta en operator med OID %s." -#: pg_dump.c:13007 +#: pg_dump.c:12496 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "ogiltig typ \"%c\" för accessmetod \"%s\"" -#: pg_dump.c:13761 +#: pg_dump.c:13115 #, c-format msgid "unrecognized collation provider: %s" msgstr "okänd jämförelseleverantör: %s" -#: pg_dump.c:14233 -#, c-format -msgid "aggregate function %s could not be dumped correctly for this database version; ignored" -msgstr "aggregatfunktion %s kunde inte dumpas korrekt för denna databasversion; ignorerad" - -#: pg_dump.c:14288 +#: pg_dump.c:13522 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "okänt aggfinalmodify-värde för aggregat \"%s\"" -#: pg_dump.c:14344 +#: pg_dump.c:13578 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "okänt aggmfinalmodify-värde för aggregat \"%s\"" -#: pg_dump.c:15066 +#: pg_dump.c:14296 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "okänd objekttyp i standardrättigheter: %d" -#: pg_dump.c:15084 +#: pg_dump.c:14312 #, c-format msgid "could not parse default ACL list (%s)" msgstr "kunde inte parsa standard-ACL-lista (%s)" -#: pg_dump.c:15169 +#: pg_dump.c:14394 #, c-format -msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)" -msgstr "kunde inte parsa initial GRANT ACL-lista (%s) eller initial REVOKE ACL-lista (%s) för objekt \"%s\" (%s)" +msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" +msgstr "kunde inte parsa initial ACL-lista (%s) eller default (%s) för objekt \"%s\" (%s)" -#: pg_dump.c:15177 +#: pg_dump.c:14419 #, c-format -msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)" -msgstr "kunde inte parsa GRANT ACL-lista (%s) eller REVOKE ACL-lista (%s) för objekt \"%s\" (%s)" +msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" +msgstr "kunde inte parsa ACL-lista (%s) eller default (%s) för objekt \"%s\" (%s)" -#: pg_dump.c:15692 +#: pg_dump.c:14957 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "fråga för att hämta definition av vy \"%s\" returnerade ingen data" -#: pg_dump.c:15695 +#: pg_dump.c:14960 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "fråga för att hämta definition av vy \"%s\" returnerade mer än en definition" -#: pg_dump.c:15702 +#: pg_dump.c:14967 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "definition av vy \"%s\" verkar vara tom (längd noll)" -#: pg_dump.c:15786 +#: pg_dump.c:15051 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS stöds inte längre (tabell \"%s\")" -#: pg_dump.c:16266 -#, c-format -msgid "invalid number of parents %d for table \"%s\"" -msgstr "ogiltigt antal (%d) föräldrar för tabell \"%s\"" - -#: pg_dump.c:16589 +#: pg_dump.c:15980 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "ogiltigt kolumnnummer %d för tabell \"%s\"" -#: pg_dump.c:16874 +#: pg_dump.c:16058 +#, c-format +msgid "could not parse index statistic columns" +msgstr "kunde inte parsa kolumn i indexstatistik" + +#: pg_dump.c:16060 +#, c-format +msgid "could not parse index statistic values" +msgstr "kunde inte parsa värden i indexstatistik" + +#: pg_dump.c:16062 +#, c-format +msgid "mismatched number of columns and values for index statistics" +msgstr "antal kolumner och värden stämmer inte i indexstatistik" + +#: pg_dump.c:16280 #, c-format msgid "missing index for constraint \"%s\"" msgstr "saknar index för integritetsvillkor \"%s\"" -#: pg_dump.c:17099 +#: pg_dump.c:16508 #, c-format msgid "unrecognized constraint type: %c" msgstr "oväntad integritetsvillkorstyp: %c" -#: pg_dump.c:17231 pg_dump.c:17451 +#: pg_dump.c:16609 pg_dump.c:16838 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "fråga för att hämta data för sekvens \"%s\" returnerade %d rad (förväntade 1)" msgstr[1] "fråga för att hämta data för sekvens \"%s\" returnerade %d rader (förväntade 1)" -#: pg_dump.c:17265 +#: pg_dump.c:16641 #, c-format msgid "unrecognized sequence type: %s" msgstr "okänd sekvenstyp: %s" -#: pg_dump.c:17549 +#: pg_dump.c:16930 #, c-format msgid "unexpected tgtype value: %d" msgstr "oväntat tgtype-värde: %d" -#: pg_dump.c:17623 +#: pg_dump.c:17002 #, c-format msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" msgstr "felaktig argumentsträng (%s) för utlösare \"%s\" i tabell \"%s\"" -#: pg_dump.c:17859 +#: pg_dump.c:17271 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "fråga för att hämta regel \"%s\" för tabell \"%s\" misslyckades: fel antal rader returnerades" -#: pg_dump.c:18021 +#: pg_dump.c:17424 #, c-format msgid "could not find referenced extension %u" msgstr "kunde inte hitta refererad utökning %u" -#: pg_dump.c:18233 +#: pg_dump.c:17514 +#, c-format +msgid "mismatched number of configurations and conditions for extension" +msgstr "antal konfigurationer och villkor stämmer inte för utökning" + +#: pg_dump.c:17646 #, c-format msgid "reading dependency data" msgstr "läser beroendedata" -#: pg_dump.c:18326 +#: pg_dump.c:17732 #, c-format msgid "no referencing object %u %u" msgstr "inget refererande objekt %u %u" -#: pg_dump.c:18337 +#: pg_dump.c:17743 #, c-format msgid "no referenced object %u %u" msgstr "inget refererat objekt %u %u" -#: pg_dump.c:18710 -#, c-format -msgid "could not parse reloptions array" -msgstr "kunde inte parsa arrayen reloptions" - -#: pg_dump_sort.c:360 +#: pg_dump_sort.c:422 #, c-format msgid "invalid dumpId %d" msgstr "ogiltigt dumpId %d" -#: pg_dump_sort.c:366 +#: pg_dump_sort.c:428 #, c-format msgid "invalid dependency %d" msgstr "ogiltigt beroende %d" -#: pg_dump_sort.c:599 +#: pg_dump_sort.c:661 #, c-format msgid "could not identify dependency loop" msgstr "kunde inte fastställa beroendeloop" -#: pg_dump_sort.c:1170 +#: pg_dump_sort.c:1232 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" msgstr[0] "det finns cirkulära främmande nyckelberoenden för denna tabell:" msgstr[1] "det finns cirkulära främmande nyckelberoenden för dessa tabeller:" -#: pg_dump_sort.c:1174 pg_dump_sort.c:1194 +#: pg_dump_sort.c:1236 pg_dump_sort.c:1256 #, c-format msgid " %s" msgstr " %s" -#: pg_dump_sort.c:1175 +#: pg_dump_sort.c:1237 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "Du kan eventiellt inte återställa dumpen utan att använda --disable-triggers eller temporärt droppa vilkoren." -#: pg_dump_sort.c:1176 +#: pg_dump_sort.c:1238 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "Överväg att göra en full dump istället för --data-only för att undvika detta problem." -#: pg_dump_sort.c:1188 +#: pg_dump_sort.c:1250 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "kunde inte räta ut beroendeloopen för dessa saker:" -#: pg_dumpall.c:199 +#: pg_dumpall.c:205 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"Programmet \"%s\" behövs av %s men hittades inte i samma\n" -"katalog som \"%s\".\n" -"Kontrollera din installation." +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\"" -#: pg_dumpall.c:204 +#: pg_dumpall.c:208 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"Programmet \"%s\" hittades av \"%s\"\n" -"men är inte av samma version som %s.\n" -"Kontrollera din installation." +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s" -#: pg_dumpall.c:356 +#: pg_dumpall.c:357 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "flaggan --exclude-database kan inte användas tillsammans med -g/--globals-only, -r/--roles-only eller -t/--tablespaces-only" @@ -2249,22 +2198,22 @@ msgstr "flaggan --exclude-database kan inte användas tillsammans med -g/--globa msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "flaggorna \"bara gobala\" (-g) och \"bara roller\" (-r) kan inte användas tillsammans" -#: pg_dumpall.c:373 +#: pg_dumpall.c:372 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "flaggorna \"bara globala\" (-g) och \"bara tabellutrymmen\" (-t) kan inte användas tillsammans" -#: pg_dumpall.c:387 +#: pg_dumpall.c:382 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "flaggorna \"bara roller\" (-r) och \"bara tabellutrymmen\" (-t) kan inte användas tillsammans" -#: pg_dumpall.c:448 pg_dumpall.c:1754 +#: pg_dumpall.c:444 pg_dumpall.c:1587 #, c-format msgid "could not connect to database \"%s\"" msgstr "kunde inte ansluta till databasen \"%s\"" -#: pg_dumpall.c:462 +#: pg_dumpall.c:456 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2273,7 +2222,7 @@ msgstr "" "kunde inte ansluta till databasen \"postgres\" eller \"template1\"\n" "Ange en annan databas." -#: pg_dumpall.c:616 +#: pg_dumpall.c:604 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2282,67 +2231,67 @@ msgstr "" "%s extraherar ett PostgreSQL databaskluster till en SQL-scriptfil.\n" "\n" -#: pg_dumpall.c:618 +#: pg_dumpall.c:606 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [FLAGGA]...\n" -#: pg_dumpall.c:621 +#: pg_dumpall.c:609 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=FILENAME utdatafilnamn\n" -#: pg_dumpall.c:628 +#: pg_dumpall.c:616 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean nollställ (drop) databaser innan återskapning\n" -#: pg_dumpall.c:630 +#: pg_dumpall.c:618 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr " -g, --globals-only dumpa bara globala objekt, inte databaser\n" -#: pg_dumpall.c:631 pg_restore.c:485 +#: pg_dumpall.c:619 pg_restore.c:456 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner återställ inte objektägare\n" -#: pg_dumpall.c:632 +#: pg_dumpall.c:620 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr " -r, --roles-only dumpa endast roller, inte databaser eller tabellutrymmen\n" -#: pg_dumpall.c:634 +#: pg_dumpall.c:622 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" -msgstr " -S, --superuser=NAMN superanvändarens namn för användning i dumpen\n" +msgstr " -S, --superuser=NAMN namn på superuser för användning i dumpen\n" -#: pg_dumpall.c:635 +#: pg_dumpall.c:623 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr " -t, --tablespaces-only dumpa endasdt tabellutrymmen, inte databaser eller roller\n" -#: pg_dumpall.c:641 +#: pg_dumpall.c:629 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr " --exclude-database=MALL uteslut databaser vars namn matchar MALL\n" -#: pg_dumpall.c:648 +#: pg_dumpall.c:636 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords dumpa inte lösenord för roller\n" -#: pg_dumpall.c:662 +#: pg_dumpall.c:652 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=ANSLSTR anslut med anslutningssträng\n" -#: pg_dumpall.c:664 +#: pg_dumpall.c:654 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAMN alternativ standarddatabas\n" -#: pg_dumpall.c:671 +#: pg_dumpall.c:661 #, c-format msgid "" "\n" @@ -2354,97 +2303,92 @@ msgstr "" "Om -f/--file inte används så kommer SQL-skriptet skriva till standard ut.\n" "\n" -#: pg_dumpall.c:877 +#: pg_dumpall.c:803 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "rollnamn som startar med \"pg_\" hoppas över (%s)" -#: pg_dumpall.c:1278 +#: pg_dumpall.c:1018 +#, c-format +msgid "could not parse ACL list (%s) for parameter \"%s\"" +msgstr "kunde inte parsa ACL-listan (%s) för parameter \"%s\"" + +#: pg_dumpall.c:1136 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "kunde inte tolka ACL-listan (%s) för tabellutrymme \"%s\"" -#: pg_dumpall.c:1495 +#: pg_dumpall.c:1343 #, c-format msgid "excluding database \"%s\"" msgstr "utesluter databas \"%s\"" -#: pg_dumpall.c:1499 +#: pg_dumpall.c:1347 #, c-format msgid "dumping database \"%s\"" msgstr "dumpar databas \"%s\"" -#: pg_dumpall.c:1531 +#: pg_dumpall.c:1378 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "pg_dump misslyckades med databas \"%s\", avslutar" -#: pg_dumpall.c:1540 +#: pg_dumpall.c:1384 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "kunde inte öppna om utdatafilen \"%s\": %m" -#: pg_dumpall.c:1584 +#: pg_dumpall.c:1425 #, c-format msgid "running \"%s\"" msgstr "kör \"%s\"" -#: pg_dumpall.c:1775 -#, c-format -msgid "could not connect to database \"%s\": %s" -msgstr "kunde inte ansluta till databasen \"%s\": %s" - -#: pg_dumpall.c:1805 +#: pg_dumpall.c:1630 #, c-format msgid "could not get server version" msgstr "kunde inte hämta serverversionen" -#: pg_dumpall.c:1811 +#: pg_dumpall.c:1633 #, c-format msgid "could not parse server version \"%s\"" msgstr "kunde inte tolka versionsträngen \"%s\"" -#: pg_dumpall.c:1883 pg_dumpall.c:1906 +#: pg_dumpall.c:1703 pg_dumpall.c:1726 #, c-format msgid "executing %s" msgstr "kör: %s" -#: pg_restore.c:308 +#: pg_restore.c:313 #, c-format msgid "one of -d/--dbname and -f/--file must be specified" msgstr "en av flaggorna -d/--dbname och -f/--file måste anges" -#: pg_restore.c:317 +#: pg_restore.c:320 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" msgstr "flaggorna -d/--dbname och -f/--file kan inte användas ihop" -#: pg_restore.c:343 +#: pg_restore.c:338 #, c-format msgid "options -C/--create and -1/--single-transaction cannot be used together" msgstr "flaggorna -C/--create och -1/--single-transaction kan inte användas tillsammans" -#: pg_restore.c:357 -#, c-format -msgid "maximum number of parallel jobs is %d" -msgstr "maximalt antal parallella job är %d" - -#: pg_restore.c:366 +#: pg_restore.c:342 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "kan inte ange både --single-transaction och multipla job" -#: pg_restore.c:408 +#: pg_restore.c:380 #, c-format msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "okänt arkivformat \"%s\"; vänligen ange \"c\", \"d\" eller \"t\"" -#: pg_restore.c:448 +#: pg_restore.c:419 #, c-format msgid "errors ignored on restore: %d" msgstr "fel ignorerade vid återställande: %d" -#: pg_restore.c:461 +#: pg_restore.c:432 #, c-format msgid "" "%s restores a PostgreSQL database from an archive created by pg_dump.\n" @@ -2453,47 +2397,47 @@ msgstr "" "%s återställer en PostgreSQL-databas från ett arkiv skapat av pg_dump.\n" "\n" -#: pg_restore.c:463 +#: pg_restore.c:434 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [FLAGGA]... [FIL]\n" -#: pg_restore.c:466 +#: pg_restore.c:437 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr " -d, --dbname=NAMN koppla upp med databasnamn\n" -#: pg_restore.c:467 +#: pg_restore.c:438 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" msgstr " -f, --file=FILNAMN utdatafilnamn (- för stdout)\n" -#: pg_restore.c:468 +#: pg_restore.c:439 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" msgstr " -F, --format=c|d|t backupens filformat (bör ske automatiskt)\n" -#: pg_restore.c:469 +#: pg_restore.c:440 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr " -l, --list skriv ut summerad TOC för arkivet\n" -#: pg_restore.c:470 +#: pg_restore.c:441 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose visa mer information\n" -#: pg_restore.c:471 +#: pg_restore.c:442 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_restore.c:472 +#: pg_restore.c:443 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: pg_restore.c:474 +#: pg_restore.c:445 #, c-format msgid "" "\n" @@ -2502,32 +2446,32 @@ msgstr "" "\n" "Flaggor som styr återställning:\n" -#: pg_restore.c:475 +#: pg_restore.c:446 #, c-format msgid " -a, --data-only restore only the data, no schema\n" msgstr " -a, --data-only återställ bara data, inte scheman\n" -#: pg_restore.c:477 +#: pg_restore.c:448 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create skapa måldatabasen\n" -#: pg_restore.c:478 +#: pg_restore.c:449 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" msgstr " -e, --exit-on-error avsluta vid fel, standard är att fortsätta\n" -#: pg_restore.c:479 +#: pg_restore.c:450 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=NAMN återställ namngivet index\n" -#: pg_restore.c:480 +#: pg_restore.c:451 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" msgstr " -j, --jobs=NUM använda så här många parallella job för återställning\n" -#: pg_restore.c:481 +#: pg_restore.c:452 #, c-format msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" @@ -2536,62 +2480,62 @@ msgstr "" " -L, --use-list=FILNAMN använd innehållsförteckning från denna fil för\n" " att välja/sortera utdata\n" -#: pg_restore.c:483 +#: pg_restore.c:454 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" msgstr " -n, --schema=NAMN återställ enbart objekt i detta schema\n" -#: pg_restore.c:484 +#: pg_restore.c:455 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" msgstr " -N, --exclude-schema=NAMN återställ inte objekt i detta schema\n" -#: pg_restore.c:486 +#: pg_restore.c:457 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=NAMN(arg) återställ namngiven funktion\n" -#: pg_restore.c:487 +#: pg_restore.c:458 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" msgstr " -s, --schema-only återställ bara scheman, inte data\n" -#: pg_restore.c:488 +#: pg_restore.c:459 #, c-format msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n" -msgstr " -S, --superuser=NAMN superanvändarens namn för att slå av utlösare\n" +msgstr " -S, --superuser=NAMN namn på superuser för att slå av utlösare\n" -#: pg_restore.c:489 +#: pg_restore.c:460 #, c-format msgid " -t, --table=NAME restore named relation (table, view, etc.)\n" msgstr " -t, --table=NAMN återställ namngiven relation (tabell, vy, osv.)\n" -#: pg_restore.c:490 +#: pg_restore.c:461 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=NAMN återställ namngiven utlösare\n" -#: pg_restore.c:491 +#: pg_restore.c:462 #, c-format msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" msgstr " -x, --no-privileges återställ inte åtkomsträttigheter (grant/revoke)\n" -#: pg_restore.c:492 +#: pg_restore.c:463 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr " -1, --single-transaction återställ i en enda transaktion\n" -#: pg_restore.c:494 +#: pg_restore.c:465 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security aktivera radsäkerhet\n" -#: pg_restore.c:496 +#: pg_restore.c:467 #, c-format msgid " --no-comments do not restore comments\n" msgstr " --no-comments återställ inte kommentarer\n" -#: pg_restore.c:497 +#: pg_restore.c:468 #, c-format msgid "" " --no-data-for-failed-tables do not restore data of tables that could not be\n" @@ -2600,37 +2544,42 @@ msgstr "" " --no-data-for-failed-tables återställ inte data för tabeller som\n" " inte kunde skapas\n" -#: pg_restore.c:499 +#: pg_restore.c:470 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications återställ inte publiceringar\n" -#: pg_restore.c:500 +#: pg_restore.c:471 #, c-format msgid " --no-security-labels do not restore security labels\n" msgstr " --no-security-labels återställ inte säkerhetsetiketter\n" -#: pg_restore.c:501 +#: pg_restore.c:472 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions återställ inte prenumerationer\n" -#: pg_restore.c:502 +#: pg_restore.c:473 +#, c-format +msgid " --no-table-access-method do not restore table access methods\n" +msgstr " --no-table-access-method återställ inte tabellaccessmetoder\n" + +#: pg_restore.c:474 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" msgstr " --no-tablespaces återställ inte användning av tabellutymmen\n" -#: pg_restore.c:503 +#: pg_restore.c:475 #, c-format msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n" msgstr " --section=SEKTION återställ namngiven sektion (pre-data, data eller post-data)\n" -#: pg_restore.c:516 +#: pg_restore.c:488 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" msgstr " --role=ROLENAME gör SET ROLE innan återställning\n" -#: pg_restore.c:518 +#: pg_restore.c:490 #, c-format msgid "" "\n" @@ -2641,7 +2590,7 @@ msgstr "" "Flaggorna -I, -n, -N, -P, -t, -T och --section kan kombineras och anges\n" "många gånger för att välja flera objekt.\n" -#: pg_restore.c:521 +#: pg_restore.c:493 #, c-format msgid "" "\n" @@ -2651,42 +2600,3 @@ msgstr "" "\n" "Om inget indatafilnamn är angivet, så kommer standard in att användas.\n" "\n" - -#~ msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive" -#~ msgstr "kunde inte hitta block ID %d i arkiv -- kanske på grund av en återställningbegäran i oordning vilket inte kan hanteras då det saknas dataoffsets i arkivet" - -#~ msgid "ftell mismatch with expected position -- ftell used" -#~ msgstr "ftell stämmer inte med förväntad position -- ftell använd" - -#~ msgid "" -#~ "The program \"pg_dump\" was found by \"%s\"\n" -#~ "but was not the same version as %s.\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Programmet \"pg_dump\" hittades av \"%s\"\n" -#~ "men hade inte samma version som \"%s\".\n" -#~ "Kontrollera din installation." - -#~ msgid "" -#~ "The program \"pg_dump\" is needed by %s but was not found in the\n" -#~ "same directory as \"%s\".\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Programmet \"pg_dump\" behövs av %s men kunde inte hittas i samma katalog\n" -#~ "som \"%s\".\n" -#~ "Kontrollera din installation." - -#~ msgid "internal error -- neither th nor fh specified in _tarReadRaw()" -#~ msgstr "internt fel -- varken th eller fh angiven i _tarReadRaw()" - -#~ msgid "connection needs password" -#~ msgstr "anslutningen kräver lösenord" - -#~ msgid "could not reconnect to database: %s" -#~ msgstr "kunde inte återuppkoppla mot databasen: %s" - -#~ msgid "could not reconnect to database" -#~ msgstr "kunde inte återuppkoppla mot databasen" - -#~ msgid "connecting to database \"%s\" as user \"%s\"" -#~ msgstr "kopplar upp mot databas \"%s\" som användare \"%s\"" diff --git a/src/bin/pg_dump/po/uk.po b/src/bin/pg_dump/po/uk.po index a774aa116c..e7de0d2fa3 100644 --- a/src/bin/pg_dump/po/uk.po +++ b/src/bin/pg_dump/po/uk.po @@ -2,11 +2,11 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:16+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" -"Last-Translator: pasha_golub\n" +"POT-Creation-Date: 2021-08-17 08:47+0000\n" +"PO-Revision-Date: 2021-08-17 13:30+0200\n" +"Last-Translator: \n" "Language-Team: Ukrainian\n" -"Language: uk\n" +"Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -14,60 +14,61 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/pg_dump.pot\n" -"X-Crowdin-File-ID: 500\n" +"X-Crowdin-File: /REL_14_DEV/pg_dump.pot\n" +"X-Crowdin-File-ID: 772\n" +"X-Generator: Poedit 3.0\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "збій: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "помилка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "попередження: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "не вдалося визначити поточний каталог: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "невірний бінарний файл \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "неможливо прочитати бінарний файл \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "неможливо знайти \"%s\" для виконання" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не вдалося змінити каталог на \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не можливо прочитати символічне послання \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:409 parallel.c:1614 #, c-format -msgid "pclose failed: %m" -msgstr "помилка pclose: %m" +msgid "%s() failed: %m" +msgstr "%s() помилка: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 msgid "out of memory" msgstr "недостатньо пам'яті" @@ -112,212 +113,217 @@ msgstr "дочірній процес перервано через сигнал msgid "child process exited with unrecognized status %d" msgstr "дочірній процес завершився з невизнаним статусом %d" -#: common.c:121 +#: common.c:124 #, c-format msgid "reading extensions" msgstr "читання розширень" -#: common.c:125 +#: common.c:128 #, c-format msgid "identifying extension members" msgstr "ідентифікація членів розширення" -#: common.c:128 +#: common.c:131 #, c-format msgid "reading schemas" msgstr "читання схемів" -#: common.c:138 +#: common.c:141 #, c-format msgid "reading user-defined tables" msgstr "читання користувацьких таблиць" -#: common.c:145 +#: common.c:148 #, c-format msgid "reading user-defined functions" msgstr "читання користувацьких функцій" -#: common.c:150 +#: common.c:153 #, c-format msgid "reading user-defined types" msgstr "читання користувацьких типів" -#: common.c:155 +#: common.c:158 #, c-format msgid "reading procedural languages" msgstr "читання процедурних мов" -#: common.c:158 +#: common.c:161 #, c-format msgid "reading user-defined aggregate functions" msgstr "читання користувацьких агрегатних функцій" -#: common.c:161 +#: common.c:164 #, c-format msgid "reading user-defined operators" msgstr "читання користувацьких операторів" -#: common.c:165 +#: common.c:168 #, c-format msgid "reading user-defined access methods" msgstr "читання користувацьких методів доступу" -#: common.c:168 +#: common.c:171 #, c-format msgid "reading user-defined operator classes" msgstr "читання користувацьких класів операторів" -#: common.c:171 +#: common.c:174 #, c-format msgid "reading user-defined operator families" msgstr "читання користувацьких сімейств операторів" -#: common.c:174 +#: common.c:177 #, c-format msgid "reading user-defined text search parsers" msgstr "читання користувацьких парсерів текстового пошуку" -#: common.c:177 +#: common.c:180 #, c-format msgid "reading user-defined text search templates" msgstr "читання користувацьких шаблонів текстового пошуку" -#: common.c:180 +#: common.c:183 #, c-format msgid "reading user-defined text search dictionaries" msgstr "читання користувацьких словників текстового пошуку" -#: common.c:183 +#: common.c:186 #, c-format msgid "reading user-defined text search configurations" msgstr "читання користувацьких конфігурацій текстового пошуку" -#: common.c:186 +#: common.c:189 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "читання користувацьких джерел сторонніх даних" -#: common.c:189 +#: common.c:192 #, c-format msgid "reading user-defined foreign servers" msgstr "читання користувацьких сторонніх серверів" -#: common.c:192 +#: common.c:195 #, c-format msgid "reading default privileges" msgstr "читання прав за замовчуванням" -#: common.c:195 +#: common.c:198 #, c-format msgid "reading user-defined collations" msgstr "читання користувацьких сортувань" -#: common.c:199 +#: common.c:202 #, c-format msgid "reading user-defined conversions" msgstr "читання користувацьких перетворень" -#: common.c:202 +#: common.c:205 #, c-format msgid "reading type casts" msgstr "читання типу приведення" -#: common.c:205 +#: common.c:208 #, c-format msgid "reading transforms" msgstr "читання перетворень" -#: common.c:208 +#: common.c:211 #, c-format msgid "reading table inheritance information" msgstr "читання інформації про успадкування таблиці" -#: common.c:211 +#: common.c:214 #, c-format msgid "reading event triggers" msgstr "читання тригерів подій" -#: common.c:215 +#: common.c:218 #, c-format msgid "finding extension tables" msgstr "пошук таблиць розширень" -#: common.c:219 +#: common.c:222 #, c-format msgid "finding inheritance relationships" msgstr "пошук відносин успадкування" -#: common.c:222 +#: common.c:225 #, c-format msgid "reading column info for interesting tables" msgstr "читання інформації про стовпці цікавлячої таблиці" -#: common.c:225 +#: common.c:228 #, c-format msgid "flagging inherited columns in subtables" msgstr "помітка успадкованих стовпців в підтаблицях" -#: common.c:228 +#: common.c:231 #, c-format msgid "reading indexes" msgstr "читання індексів" -#: common.c:231 +#: common.c:234 #, c-format msgid "flagging indexes in partitioned tables" msgstr "помітка індексів в секційних таблицях" -#: common.c:234 +#: common.c:237 #, c-format msgid "reading extended statistics" msgstr "читання розширеної статистики" -#: common.c:237 +#: common.c:240 #, c-format msgid "reading constraints" msgstr "читання обмежень" -#: common.c:240 +#: common.c:243 #, c-format msgid "reading triggers" msgstr "читання тригерів" -#: common.c:243 +#: common.c:246 #, c-format msgid "reading rewrite rules" msgstr "читання правил перезаписування" -#: common.c:246 +#: common.c:249 #, c-format msgid "reading policies" msgstr "читання політик" -#: common.c:249 +#: common.c:252 #, c-format msgid "reading publications" msgstr "читання публікацій" -#: common.c:252 +#: common.c:257 #, c-format msgid "reading publication membership" msgstr "читання публікацій учасників" -#: common.c:255 +#: common.c:260 #, c-format msgid "reading subscriptions" msgstr "читання підписок" -#: common.c:1025 +#: common.c:338 +#, c-format +msgid "invalid number of parents %d for table \"%s\"" +msgstr "неприпустиме число батьківських елементів %d для таблиці \"%s\"" + +#: common.c:1100 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "помилка перевірки, батьківський елемент ідентифікатора OID %u для таблиці \"%s\" (ідентифікатор OID %u) не знайдено" -#: common.c:1067 +#: common.c:1142 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "не вдалося проаналізувати числовий масив \"%s\": забагато чисел" -#: common.c:1082 +#: common.c:1157 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "не вдалося проаналізувати числовий масив \"%s\": неприпустимий характер числа" @@ -358,210 +364,207 @@ msgstr "не вдалося розпакувати дані: %s" msgid "could not close compression library: %s" msgstr "не вдалося закрити бібліотеку стиснення: %s" -#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:557 pg_backup_tar.c:560 +#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:551 pg_backup_tar.c:554 #, c-format msgid "could not read from input file: %s" msgstr "не вдалося прочитати з вхідного файлу: %s" -#: compress_io.c:623 pg_backup_custom.c:646 pg_backup_directory.c:552 -#: pg_backup_tar.c:793 pg_backup_tar.c:816 +#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:552 +#: pg_backup_tar.c:787 pg_backup_tar.c:810 #, c-format msgid "could not read from input file: end of file" msgstr "не вдалося прочитати з вхідного файлу: кінець файлу" -#: parallel.c:267 +#: parallel.c:254 #, c-format -msgid "WSAStartup failed: %d" -msgstr "Помилка WSAStartup: %d" +msgid "%s() failed: error code %d" +msgstr "%s() помилка: код помилки %d" -#: parallel.c:978 +#: parallel.c:964 #, c-format msgid "could not create communication channels: %m" msgstr "не вдалося створити канали зв'язку: %m" -#: parallel.c:1035 +#: parallel.c:1021 #, c-format msgid "could not create worker process: %m" msgstr "не вдалося створити робочий процес: %m" -#: parallel.c:1165 +#: parallel.c:1151 #, c-format -msgid "unrecognized command received from master: \"%s\"" -msgstr "отримана нерозпізнана команда від майстра: \"%s\"" +msgid "unrecognized command received from leader: \"%s\"" +msgstr "нерозпізнана команда отримана від лідера: \"%s\"" -#: parallel.c:1208 parallel.c:1446 +#: parallel.c:1194 parallel.c:1432 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "отримане невірне повідомлення від робочого процесу: \"%s\"" -#: parallel.c:1340 +#: parallel.c:1326 #, c-format -msgid "could not obtain lock on relation \"%s\"\n" +msgid "" +"could not obtain lock on relation \"%s\"\n" "This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table." -msgstr "не вдалося отримати блокування відношення \"%s\"\n" +msgstr "" +"не вдалося отримати блокування відношення \"%s\"\n" "Це, зазвичай, означає, що хтось зробив запит на монопольне блокування таблиці після того, як батьківський процес pg_dump отримав початкове блокування спільного доступу для таблиці." -#: parallel.c:1429 +#: parallel.c:1415 #, c-format msgid "a worker process died unexpectedly" msgstr "робочий процес завершився несподівано" -#: parallel.c:1551 parallel.c:1669 +#: parallel.c:1537 parallel.c:1655 #, c-format msgid "could not write to the communication channel: %m" msgstr "не вдалося записати до каналу зв'язку: %m" -#: parallel.c:1628 -#, c-format -msgid "select() failed: %m" -msgstr "помилка в select(): %m" - -#: parallel.c:1753 +#: parallel.c:1739 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: не вдалося створити сокет: код помилки %d" -#: parallel.c:1764 +#: parallel.c:1750 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: не вдалося прив'язати: код помилки %d" -#: parallel.c:1771 +#: parallel.c:1757 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: не вдалося прослухати: код помилки %d" -#: parallel.c:1778 +#: parallel.c:1764 #, c-format -msgid "pgpipe: getsockname() failed: error code %d" -msgstr "pgpipe: помилка в getsockname(): код помилки %d" +msgid "pgpipe: %s() failed: error code %d" +msgstr "pgpipe: %s() помилка: код помилки %d" -#: parallel.c:1789 +#: parallel.c:1775 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: не вдалося створити другий сокет: код помилки %d" -#: parallel.c:1798 +#: parallel.c:1784 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: не вдалося зв'язатися з сокетом: код помилки %d" -#: parallel.c:1807 +#: parallel.c:1793 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: не вдалося прийняти зв'язок: код помилки %d" -#: pg_backup_archiver.c:271 pg_backup_archiver.c:1591 +#: pg_backup_archiver.c:277 pg_backup_archiver.c:1576 #, c-format msgid "could not close output file: %m" msgstr "не вдалося закрити вихідний файл: %m" -#: pg_backup_archiver.c:315 pg_backup_archiver.c:319 +#: pg_backup_archiver.c:321 pg_backup_archiver.c:325 #, c-format msgid "archive items not in correct section order" msgstr "елементи архіву в неправильному порядку" -#: pg_backup_archiver.c:325 +#: pg_backup_archiver.c:331 #, c-format msgid "unexpected section code %d" msgstr "неочікуваний код розділу %d" -#: pg_backup_archiver.c:362 +#: pg_backup_archiver.c:368 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "паралельне відновлення не підтримується з цим файлом архівного формату" -#: pg_backup_archiver.c:366 +#: pg_backup_archiver.c:372 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "паралельне відновлення не підтримується з архівами, зробленими pre-8.0 pg_dump" -#: pg_backup_archiver.c:384 +#: pg_backup_archiver.c:390 #, c-format msgid "cannot restore from compressed archive (compression not supported in this installation)" msgstr "не вдалося відновити зі стиснутого архіву (встановлена версія не підтримує стискання)" -#: pg_backup_archiver.c:401 +#: pg_backup_archiver.c:407 #, c-format msgid "connecting to database for restore" msgstr "підключення до бази даних для відновлення" -#: pg_backup_archiver.c:403 +#: pg_backup_archiver.c:409 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "прямі з'днання з базою даних не підтримуються в архівах у версіях до 1.3" -#: pg_backup_archiver.c:448 +#: pg_backup_archiver.c:452 #, c-format msgid "implied data-only restore" msgstr "мається на увазі відновлення лише даних" -#: pg_backup_archiver.c:514 +#: pg_backup_archiver.c:518 #, c-format msgid "dropping %s %s" msgstr "видалення %s %s" -#: pg_backup_archiver.c:609 +#: pg_backup_archiver.c:613 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "не вдалося знайти, куди вставити IF EXISTS в інструкції \"%s\"" -#: pg_backup_archiver.c:765 pg_backup_archiver.c:767 +#: pg_backup_archiver.c:769 pg_backup_archiver.c:771 #, c-format msgid "warning from original dump file: %s" msgstr "попередження з оригінального файлу дамп: %s" -#: pg_backup_archiver.c:782 +#: pg_backup_archiver.c:786 #, c-format msgid "creating %s \"%s.%s\"" msgstr "створення %s \"%s.%s\"" -#: pg_backup_archiver.c:785 +#: pg_backup_archiver.c:789 #, c-format msgid "creating %s \"%s\"" msgstr "створення %s \" \"%s\"" -#: pg_backup_archiver.c:842 +#: pg_backup_archiver.c:839 #, c-format msgid "connecting to new database \"%s\"" msgstr "підключення до нової бази даних \"%s\"" -#: pg_backup_archiver.c:870 +#: pg_backup_archiver.c:866 #, c-format msgid "processing %s" msgstr "обробка %s" -#: pg_backup_archiver.c:890 +#: pg_backup_archiver.c:886 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "обробка даних для таблиці \"%s.%s\"" -#: pg_backup_archiver.c:952 +#: pg_backup_archiver.c:948 #, c-format msgid "executing %s %s" msgstr "виконання %s %s" -#: pg_backup_archiver.c:991 +#: pg_backup_archiver.c:987 #, c-format msgid "disabling triggers for %s" msgstr "вимкнення тригерів для %s" -#: pg_backup_archiver.c:1017 +#: pg_backup_archiver.c:1013 #, c-format msgid "enabling triggers for %s" msgstr "увімкнення тригерів для %s" -#: pg_backup_archiver.c:1045 +#: pg_backup_archiver.c:1041 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" -msgstr "внутрішня помилка - WriteData не може бути викликана поза контекстом підпрограми DataDumper " +msgstr "внутрішня помилка - WriteData не може бути викликана поза контекстом підпрограми DataDumper" -#: pg_backup_archiver.c:1228 +#: pg_backup_archiver.c:1224 #, c-format msgid "large-object output not supported in chosen format" msgstr "вивід великих об'єктів не підтримується у вибраному форматі" -#: pg_backup_archiver.c:1286 +#: pg_backup_archiver.c:1282 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" @@ -570,397 +573,397 @@ msgstr[1] "відновлено %d великих об'єкти" msgstr[2] "відновлено %d великих об'єктів" msgstr[3] "відновлено %d великих об'єктів" -#: pg_backup_archiver.c:1307 pg_backup_tar.c:736 +#: pg_backup_archiver.c:1303 pg_backup_tar.c:730 #, c-format msgid "restoring large object with OID %u" msgstr "відновлення великого об'єкту з OID %u" -#: pg_backup_archiver.c:1319 +#: pg_backup_archiver.c:1315 #, c-format msgid "could not create large object %u: %s" msgstr "не вдалося створити великий об'єкт %u: %s" -#: pg_backup_archiver.c:1324 pg_dump.c:3544 +#: pg_backup_archiver.c:1320 pg_dump.c:3638 #, c-format msgid "could not open large object %u: %s" msgstr "не вдалося відкрити великий об'єкт %u: %s" -#: pg_backup_archiver.c:1381 +#: pg_backup_archiver.c:1376 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "не вдалося відкрити файл TOC \"%s\": %m" -#: pg_backup_archiver.c:1421 +#: pg_backup_archiver.c:1404 #, c-format msgid "line ignored: %s" msgstr "рядок проігноровано: %s" -#: pg_backup_archiver.c:1428 +#: pg_backup_archiver.c:1411 #, c-format msgid "could not find entry for ID %d" msgstr "не вдалося знайти введення для ID %d" -#: pg_backup_archiver.c:1449 pg_backup_directory.c:222 +#: pg_backup_archiver.c:1434 pg_backup_directory.c:222 #: pg_backup_directory.c:598 #, c-format msgid "could not close TOC file: %m" msgstr "не вдалося закрити файл TOC: %m" -#: pg_backup_archiver.c:1563 pg_backup_custom.c:156 pg_backup_directory.c:332 +#: pg_backup_archiver.c:1548 pg_backup_custom.c:156 pg_backup_directory.c:332 #: pg_backup_directory.c:585 pg_backup_directory.c:648 -#: pg_backup_directory.c:667 pg_dumpall.c:484 +#: pg_backup_directory.c:667 pg_dumpall.c:489 #, c-format msgid "could not open output file \"%s\": %m" msgstr "не вдалося відкрити вихідний файл \"%s\": %m" -#: pg_backup_archiver.c:1565 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1550 pg_backup_custom.c:162 #, c-format msgid "could not open output file: %m" msgstr "не вдалося відкрити вихідний файл: %m" -#: pg_backup_archiver.c:1658 +#: pg_backup_archiver.c:1643 #, c-format -msgid "wrote %lu byte of large object data (result = %lu)" -msgid_plural "wrote %lu bytes of large object data (result = %lu)" -msgstr[0] "записано %lu байт даних великого об'єкта (результат = %lu)" -msgstr[1] "записано %lu байти даних великого об'єкта (результат = %lu)" -msgstr[2] "записано %lu байтів даних великого об'єкта (результат = %lu)" -msgstr[3] "записано %lu байтів даних великого об'єкта (результат = %lu)" +msgid "wrote %zu byte of large object data (result = %d)" +msgid_plural "wrote %zu bytes of large object data (result = %d)" +msgstr[0] "записано %zu байт даних великого об'єкта (результат = %d)" +msgstr[1] "записано %zu байти даних великого об'єкта (результат = %d)" +msgstr[2] "записано %zu байтів даних великого об'єкта (результат = %d)" +msgstr[3] "записано %zu байтів даних великого об'єкта (результат = %d)" -#: pg_backup_archiver.c:1663 +#: pg_backup_archiver.c:1649 #, c-format -msgid "could not write to large object (result: %lu, expected: %lu)" -msgstr "не вдалося записати великий об'єкт (результат: %lu, очікувано: %lu)" +msgid "could not write to large object: %s" +msgstr "не вдалося записати до великого об'єкту: %s" -#: pg_backup_archiver.c:1753 +#: pg_backup_archiver.c:1739 #, c-format msgid "while INITIALIZING:" msgstr "при ІНІЦІАЛІЗАЦІЇ:" -#: pg_backup_archiver.c:1758 +#: pg_backup_archiver.c:1744 #, c-format msgid "while PROCESSING TOC:" msgstr "при ОБРОБЦІ TOC:" -#: pg_backup_archiver.c:1763 +#: pg_backup_archiver.c:1749 #, c-format msgid "while FINALIZING:" msgstr "при ЗАВЕРШЕННІ:" -#: pg_backup_archiver.c:1768 +#: pg_backup_archiver.c:1754 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "зі входження до TOC %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1844 +#: pg_backup_archiver.c:1830 #, c-format msgid "bad dumpId" msgstr "невірний dumpId" -#: pg_backup_archiver.c:1865 +#: pg_backup_archiver.c:1851 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "невірна таблиця dumpId для елементу даних таблиці" -#: pg_backup_archiver.c:1957 +#: pg_backup_archiver.c:1943 #, c-format msgid "unexpected data offset flag %d" msgstr "неочікувана позначка зсуву даних %d" -#: pg_backup_archiver.c:1970 +#: pg_backup_archiver.c:1956 #, c-format msgid "file offset in dump file is too large" msgstr "зсув файлу у файлі дампу завеликий" -#: pg_backup_archiver.c:2107 pg_backup_archiver.c:2117 +#: pg_backup_archiver.c:2094 pg_backup_archiver.c:2104 #, c-format msgid "directory name too long: \"%s\"" msgstr "ім'я каталогу задовге: \"%s\"" -#: pg_backup_archiver.c:2125 +#: pg_backup_archiver.c:2112 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "каталог \"%s\" не схожий на архівний (\"toc.dat\" не існує)" -#: pg_backup_archiver.c:2133 pg_backup_custom.c:173 pg_backup_custom.c:812 +#: pg_backup_archiver.c:2120 pg_backup_custom.c:173 pg_backup_custom.c:807 #: pg_backup_directory.c:207 pg_backup_directory.c:394 #, c-format msgid "could not open input file \"%s\": %m" msgstr "не вдалося відкрити вхідний файл \"%s\": %m" -#: pg_backup_archiver.c:2140 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2127 pg_backup_custom.c:179 #, c-format msgid "could not open input file: %m" msgstr "не вдалося відкрити вхідний файл: %m" -#: pg_backup_archiver.c:2146 +#: pg_backup_archiver.c:2133 #, c-format msgid "could not read input file: %m" msgstr "не вдалося прочитати вхідний файл: %m" -#: pg_backup_archiver.c:2148 +#: pg_backup_archiver.c:2135 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "вхідний файл закороткий (прочитано %lu, очікувалось 5)" -#: pg_backup_archiver.c:2233 +#: pg_backup_archiver.c:2167 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "вхідний файл схожий на дамп текстового формату. Будь ласка, використайте psql." -#: pg_backup_archiver.c:2239 +#: pg_backup_archiver.c:2173 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "вхідний файл не схожий на архівний (закороткий?)" -#: pg_backup_archiver.c:2245 +#: pg_backup_archiver.c:2179 #, c-format msgid "input file does not appear to be a valid archive" msgstr "вхідний файл не схожий на архівний" -#: pg_backup_archiver.c:2265 +#: pg_backup_archiver.c:2188 #, c-format msgid "could not close input file: %m" msgstr "не вдалося закрити вхідний файл: %m" -#: pg_backup_archiver.c:2379 +#: pg_backup_archiver.c:2305 #, c-format msgid "unrecognized file format \"%d\"" msgstr "нерозпізнаний формат файлу \"%d\"" -#: pg_backup_archiver.c:2461 pg_backup_archiver.c:4473 +#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4411 #, c-format msgid "finished item %d %s %s" msgstr "завершений об'єкт %d %s %s" -#: pg_backup_archiver.c:2465 pg_backup_archiver.c:4486 +#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4424 #, c-format msgid "worker process failed: exit code %d" msgstr "помилка при робочому процесі: код виходу %d" -#: pg_backup_archiver.c:2585 +#: pg_backup_archiver.c:2511 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "введення ідентифікатора %d поза діапазоном -- можливо, зміст пошкоджений" -#: pg_backup_archiver.c:2652 +#: pg_backup_archiver.c:2578 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "відновлення таблиць WITH OIDS більше не підтримується" -#: pg_backup_archiver.c:2734 +#: pg_backup_archiver.c:2660 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "нерозпізнане кодування \"%s\"" -#: pg_backup_archiver.c:2739 +#: pg_backup_archiver.c:2665 #, c-format msgid "invalid ENCODING item: %s" msgstr "невірний об'єкт КОДУВАННЯ: %s" -#: pg_backup_archiver.c:2757 +#: pg_backup_archiver.c:2683 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "невірний об'єкт STDSTRINGS: %s" -#: pg_backup_archiver.c:2782 +#: pg_backup_archiver.c:2708 #, c-format msgid "schema \"%s\" not found" msgstr "схему \"%s\" не знайдено" -#: pg_backup_archiver.c:2789 +#: pg_backup_archiver.c:2715 #, c-format msgid "table \"%s\" not found" msgstr "таблицю \"%s\" не знайдено" -#: pg_backup_archiver.c:2796 +#: pg_backup_archiver.c:2722 #, c-format msgid "index \"%s\" not found" msgstr "індекс \"%s\" не знайдено" -#: pg_backup_archiver.c:2803 +#: pg_backup_archiver.c:2729 #, c-format msgid "function \"%s\" not found" msgstr "функцію \"%s\" не знайдено" -#: pg_backup_archiver.c:2810 +#: pg_backup_archiver.c:2736 #, c-format msgid "trigger \"%s\" not found" msgstr "тригер \"%s\" не знайдено" -#: pg_backup_archiver.c:3202 +#: pg_backup_archiver.c:3128 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "не вдалося встановити користувача сеансу для \"%s\": %s" -#: pg_backup_archiver.c:3341 +#: pg_backup_archiver.c:3260 #, c-format msgid "could not set search_path to \"%s\": %s" msgstr "не вдалося встановити search_path для \"%s\": %s" -#: pg_backup_archiver.c:3403 +#: pg_backup_archiver.c:3322 #, c-format msgid "could not set default_tablespace to %s: %s" msgstr "не вдалося встановити default_tablespace для %s: %s" -#: pg_backup_archiver.c:3448 +#: pg_backup_archiver.c:3367 #, c-format msgid "could not set default_table_access_method: %s" msgstr "не вдалося встановити default_table_access_method для : %s" -#: pg_backup_archiver.c:3540 pg_backup_archiver.c:3698 +#: pg_backup_archiver.c:3459 pg_backup_archiver.c:3617 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "невідомо, як встановити власника об'єкту типу \"%s\"" -#: pg_backup_archiver.c:3802 +#: pg_backup_archiver.c:3720 #, c-format msgid "did not find magic string in file header" msgstr "в заголовку файлу не знайдено магічного рядка" -#: pg_backup_archiver.c:3815 +#: pg_backup_archiver.c:3734 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "в заголовку непідтримувана версія (%d.%d)" -#: pg_backup_archiver.c:3820 +#: pg_backup_archiver.c:3739 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "перевірка на розмір цілого числа (%lu) не вдалася" -#: pg_backup_archiver.c:3824 +#: pg_backup_archiver.c:3743 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "архів зроблено на архітектурі з більшими цілими числами, деякі операції можуть не виконуватися" -#: pg_backup_archiver.c:3834 +#: pg_backup_archiver.c:3753 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "очікуваний формат (%d) відрізняється від знайденого формату у файлі (%d)" -#: pg_backup_archiver.c:3850 +#: pg_backup_archiver.c:3768 #, c-format msgid "archive is compressed, but this installation does not support compression -- no data will be available" -msgstr "архів стиснено, але ця інсталяція не підтримує стискання -- дані не будуть доступними " +msgstr "архів стиснено, але ця інсталяція не підтримує стискання -- дані не будуть доступними" -#: pg_backup_archiver.c:3868 +#: pg_backup_archiver.c:3802 #, c-format msgid "invalid creation date in header" msgstr "неприпустима дата створення у заголовку" -#: pg_backup_archiver.c:3996 +#: pg_backup_archiver.c:3936 #, c-format msgid "processing item %d %s %s" msgstr "обробка елементу %d %s %s" -#: pg_backup_archiver.c:4075 +#: pg_backup_archiver.c:4015 #, c-format msgid "entering main parallel loop" msgstr "введення головного паралельного циклу" -#: pg_backup_archiver.c:4086 +#: pg_backup_archiver.c:4026 #, c-format msgid "skipping item %d %s %s" -msgstr "пропускається елемент %d %s %s " +msgstr "пропускається елемент %d %s %s" -#: pg_backup_archiver.c:4095 +#: pg_backup_archiver.c:4035 #, c-format msgid "launching item %d %s %s" -msgstr "запуск елементу %d %s %s " +msgstr "запуск елементу %d %s %s" -#: pg_backup_archiver.c:4149 +#: pg_backup_archiver.c:4089 #, c-format msgid "finished main parallel loop" msgstr "головний паралельний цикл завершився" -#: pg_backup_archiver.c:4187 +#: pg_backup_archiver.c:4125 #, c-format msgid "processing missed item %d %s %s" msgstr "обробка втраченого елементу %d %s %s" -#: pg_backup_archiver.c:4792 +#: pg_backup_archiver.c:4730 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "не вдалося створити таблицю \"%s\", дані не будуть відновлені" -#: pg_backup_custom.c:378 pg_backup_null.c:147 +#: pg_backup_custom.c:376 pg_backup_null.c:147 #, c-format msgid "invalid OID for large object" msgstr "неприпустимий ідентифікатор OID для великого об’єкту" -#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:632 -#: pg_backup_custom.c:870 pg_backup_tar.c:1086 pg_backup_tar.c:1091 +#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629 +#: pg_backup_custom.c:865 pg_backup_tar.c:1080 pg_backup_tar.c:1085 #, c-format msgid "error during file seek: %m" msgstr "помилка під час пошуку файлу oobe. xml: %m" -#: pg_backup_custom.c:480 +#: pg_backup_custom.c:478 #, c-format msgid "data block %d has wrong seek position" msgstr "блок даних %d має неправильну позицію пошуку" -#: pg_backup_custom.c:497 +#: pg_backup_custom.c:495 #, c-format msgid "unrecognized data block type (%d) while searching archive" msgstr "нерозпізнаний тип блоку даних (%d) під час пошуку архіву" -#: pg_backup_custom.c:519 +#: pg_backup_custom.c:517 #, c-format msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file" msgstr "не вдалося зайти в архіві блок з ідентифікатором %d -- можливо, через непослідовність запиту відновлення, який не можна обробити через файл, що не допускає довільний вхід" -#: pg_backup_custom.c:524 +#: pg_backup_custom.c:522 #, c-format msgid "could not find block ID %d in archive -- possibly corrupt archive" msgstr "не вдалося знайти в архіві блок з ідентифікатором %d -- можливо, архів пошкоджений" -#: pg_backup_custom.c:531 +#: pg_backup_custom.c:529 #, c-format msgid "found unexpected block ID (%d) when reading data -- expected %d" msgstr "знайдено неочікуваний блок з ідентифікатором (%d) під час читання даних -- очікувалося %d" -#: pg_backup_custom.c:545 +#: pg_backup_custom.c:543 #, c-format msgid "unrecognized data block type %d while restoring archive" msgstr "нерозпізнаний тип блоку даних %d при відновленні архіву" -#: pg_backup_custom.c:648 +#: pg_backup_custom.c:645 #, c-format msgid "could not read from input file: %m" msgstr "не вдалося прочитати з вхідного файлу: %m" -#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:948 -#: pg_backup_tar.c:1089 +#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943 +#: pg_backup_tar.c:1083 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "не вдалося визначити позицію пошуку у файлі архіву: %m" -#: pg_backup_custom.c:767 pg_backup_custom.c:807 +#: pg_backup_custom.c:762 pg_backup_custom.c:802 #, c-format msgid "could not close archive file: %m" msgstr "не вдалося закрити архівний файл: %m" -#: pg_backup_custom.c:790 +#: pg_backup_custom.c:785 #, c-format msgid "can only reopen input archives" msgstr "можливо повторно відкрити лише вхідні архіви" -#: pg_backup_custom.c:797 +#: pg_backup_custom.c:792 #, c-format msgid "parallel restore from standard input is not supported" msgstr "паралельне відновлення зі стандартного вводу не підтримується" -#: pg_backup_custom.c:799 +#: pg_backup_custom.c:794 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "паралельне відновлення з файлу без вільного доступу не підтримується" -#: pg_backup_custom.c:815 +#: pg_backup_custom.c:810 #, c-format msgid "could not set seek position in archive file: %m" msgstr "не вдалося набрати позицію пошуку у файлі архіву: %m" -#: pg_backup_custom.c:894 +#: pg_backup_custom.c:889 #, c-format msgid "compressor active" msgstr "ущільнювач активний" @@ -980,62 +983,41 @@ msgstr "версія серверу: %s; версія %s: %s" msgid "aborting because of server version mismatch" msgstr "переривання через невідповідність версії серверу" -#: pg_backup_db.c:138 +#: pg_backup_db.c:124 #, c-format -msgid "connecting to database \"%s\" as user \"%s\"" -msgstr "підключення до бази даних \"%s\" як користувача \"%s\"" +msgid "already connected to a database" +msgstr "вже під'єднано до бази даних" -#: pg_backup_db.c:145 pg_backup_db.c:194 pg_backup_db.c:255 pg_backup_db.c:296 -#: pg_dumpall.c:1651 pg_dumpall.c:1764 +#: pg_backup_db.c:132 pg_backup_db.c:182 pg_dumpall.c:1655 pg_dumpall.c:1766 msgid "Password: " msgstr "Пароль: " -#: pg_backup_db.c:177 -#, c-format -msgid "could not reconnect to database" -msgstr "неможливо заново під'єднатися до бази даних" - -#: pg_backup_db.c:182 -#, c-format -msgid "could not reconnect to database: %s" -msgstr "неможливо заново під'єднатися до бази даних: %s" - -#: pg_backup_db.c:198 -#, c-format -msgid "connection needs password" -msgstr "для з'єднання потрібен пароль" - -#: pg_backup_db.c:249 -#, c-format -msgid "already connected to a database" -msgstr "вже під'єднано до бази даних" - -#: pg_backup_db.c:288 +#: pg_backup_db.c:174 #, c-format msgid "could not connect to database" msgstr "не вдалося зв'язатися з базою даних" -#: pg_backup_db.c:304 +#: pg_backup_db.c:191 #, c-format -msgid "connection to database \"%s\" failed: %s" -msgstr "підключення до бази даних \"%s\" не вдалося: %s" +msgid "reconnection failed: %s" +msgstr "помилка повторного підключення: %s" -#: pg_backup_db.c:376 pg_dumpall.c:1684 +#: pg_backup_db.c:194 pg_backup_db.c:269 pg_dumpall.c:1686 pg_dumpall.c:1776 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:383 pg_dumpall.c:1889 pg_dumpall.c:1912 +#: pg_backup_db.c:276 pg_dumpall.c:1889 pg_dumpall.c:1912 #, c-format msgid "query failed: %s" msgstr "запит не вдався: %s" -#: pg_backup_db.c:385 pg_dumpall.c:1890 pg_dumpall.c:1913 +#: pg_backup_db.c:278 pg_dumpall.c:1890 pg_dumpall.c:1913 #, c-format msgid "query was: %s" msgstr "запит був: %s" -#: pg_backup_db.c:426 +#: pg_backup_db.c:319 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" @@ -1044,40 +1026,40 @@ msgstr[1] "запит повернув %d рядки замість одного msgstr[2] "запит повернув %d рядків замість одного: %s" msgstr[3] "запит повернув %d рядків замість одного: %s" -#: pg_backup_db.c:462 +#: pg_backup_db.c:355 #, c-format msgid "%s: %sCommand was: %s" msgstr "%s:%sКоманда була: %s" -#: pg_backup_db.c:518 pg_backup_db.c:592 pg_backup_db.c:599 +#: pg_backup_db.c:411 pg_backup_db.c:485 pg_backup_db.c:492 msgid "could not execute query" msgstr "не вдалося виконати запит" -#: pg_backup_db.c:571 +#: pg_backup_db.c:464 #, c-format msgid "error returned by PQputCopyData: %s" msgstr "помилка повернулася від PQputCopyData: %s" -#: pg_backup_db.c:620 +#: pg_backup_db.c:513 #, c-format msgid "error returned by PQputCopyEnd: %s" msgstr "помилка повернулася від PQputCopyEnd: %s" -#: pg_backup_db.c:626 +#: pg_backup_db.c:519 #, c-format msgid "COPY failed for table \"%s\": %s" msgstr "КОПІЮВАННЯ для таблиці \"%s\" не вдалося: %s" -#: pg_backup_db.c:632 pg_dump.c:1984 +#: pg_backup_db.c:525 pg_dump.c:2074 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "неочікувані зайві результати під час копіювання таблиці \"%s\"" -#: pg_backup_db.c:644 +#: pg_backup_db.c:537 msgid "could not start database transaction" msgstr "не вдалося почати транзакцію бази даних" -#: pg_backup_db.c:652 +#: pg_backup_db.c:545 msgid "could not commit database transaction" msgstr "не вдалося затвердити транзакцію бази даних" @@ -1157,7 +1139,7 @@ msgstr "не вдалося відкрити файл TOC \"%s\" для виво msgid "could not open TOC file for output: %m" msgstr "не вдалося відкрити файл TOC для виводу: %m" -#: pg_backup_tar.c:203 pg_backup_tar.c:358 +#: pg_backup_tar.c:203 pg_backup_tar.c:352 #, c-format msgid "compression is not supported by tar archive format" msgstr "стиснення не підтримується форматом архіватора tar" @@ -1172,57 +1154,57 @@ msgstr "не вдалося відкрити файл TOC \"%s\" для ввод msgid "could not open TOC file for input: %m" msgstr "не вдалося відкрити файл TOC для вводу: %m" -#: pg_backup_tar.c:344 +#: pg_backup_tar.c:338 #, c-format msgid "could not find file \"%s\" in archive" msgstr "не вдалося знайти файл \"%s\" в архіві" -#: pg_backup_tar.c:410 +#: pg_backup_tar.c:404 #, c-format msgid "could not generate temporary file name: %m" msgstr "не вдалося згенерувати тимчасове ім'я файлу: %m" -#: pg_backup_tar.c:421 +#: pg_backup_tar.c:415 #, c-format msgid "could not open temporary file" msgstr "неможливо відкрити тимчасовий файл" -#: pg_backup_tar.c:448 +#: pg_backup_tar.c:442 #, c-format msgid "could not close tar member" msgstr "не вдалося закрити tar-елемент" -#: pg_backup_tar.c:691 +#: pg_backup_tar.c:685 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "неочікуваний синтаксис інструкції копіювання: \"%s\"" -#: pg_backup_tar.c:958 +#: pg_backup_tar.c:952 #, c-format msgid "invalid OID for large object (%u)" msgstr "неприпустимий ідентифікатор OID для великих об’єктів (%u)" -#: pg_backup_tar.c:1105 +#: pg_backup_tar.c:1099 #, c-format msgid "could not close temporary file: %m" msgstr "не вдалося закрити тимчасовий файл oobe. xml: %m" -#: pg_backup_tar.c:1114 +#: pg_backup_tar.c:1108 #, c-format msgid "actual file length (%s) does not match expected (%s)" msgstr "фактична довжина файлу (%s) не відповідає очікуваному (%s)" -#: pg_backup_tar.c:1171 pg_backup_tar.c:1201 +#: pg_backup_tar.c:1165 pg_backup_tar.c:1196 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "не вдалося знайти верхній колонтитул для файлу oobe. xml \"%s\" в архіві tar" -#: pg_backup_tar.c:1189 +#: pg_backup_tar.c:1183 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "відновлення даних поза замовленням не підтримується у цьому форматі архіву: вимагаєтсья \"%s\", але перед цим іде \"%s\" у файлі архіву." -#: pg_backup_tar.c:1234 +#: pg_backup_tar.c:1230 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" @@ -1231,7 +1213,7 @@ msgstr[1] "знайдено незавершений tar-заголовок (%lu msgstr[2] "знайдено незавершений tar-заголовок (%lu байт)" msgstr[3] "знайдено незавершений tar-заголовок (%lu байт)" -#: pg_backup_tar.c:1285 +#: pg_backup_tar.c:1281 #, c-format msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s" msgstr "знайдено пошкоджений tar-верхній колонтитул у %s(очікувалося %d, обчислюється %d) позиція файлу oobe. xml %s" @@ -1241,706 +1223,750 @@ msgstr "знайдено пошкоджений tar-верхній колонт msgid "unrecognized section name: \"%s\"" msgstr "нерозпізнане ім’я розділу: \"%s\"" -#: pg_backup_utils.c:55 pg_dump.c:608 pg_dump.c:625 pg_dumpall.c:338 -#: pg_dumpall.c:348 pg_dumpall.c:357 pg_dumpall.c:366 pg_dumpall.c:374 -#: pg_dumpall.c:388 pg_dumpall.c:464 pg_restore.c:284 pg_restore.c:300 +#: pg_backup_utils.c:55 pg_dump.c:622 pg_dump.c:639 pg_dumpall.c:341 +#: pg_dumpall.c:351 pg_dumpall.c:360 pg_dumpall.c:369 pg_dumpall.c:377 +#: pg_dumpall.c:391 pg_dumpall.c:469 pg_restore.c:284 pg_restore.c:300 #: pg_restore.c:318 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" для отримання додаткової інформації.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" #: pg_backup_utils.c:68 #, c-format msgid "out of on_exit_nicely slots" msgstr "перевищено межу on_exit_nicely слотів" -#: pg_dump.c:534 +#: pg_dump.c:548 #, c-format msgid "compression level must be in range 0..9" msgstr "рівень стискання має бути у діапазоні 0..9" -#: pg_dump.c:572 +#: pg_dump.c:586 #, c-format msgid "extra_float_digits must be in range -15..3" msgstr "extra_float_digits повинні бути у діапазоні -15..3" -#: pg_dump.c:595 +#: pg_dump.c:609 #, c-format msgid "rows-per-insert must be in range %d..%d" msgstr "рядків-на-вставку має бути у діапазоні %d..%d" -#: pg_dump.c:623 pg_dumpall.c:346 pg_restore.c:298 +#: pg_dump.c:637 pg_dumpall.c:349 pg_restore.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному рядку (перший \"%s\")" -#: pg_dump.c:644 pg_restore.c:327 +#: pg_dump.c:658 pg_restore.c:327 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "параметри -s/--schema-only і -a/--data-only не можуть використовуватись разом" -#: pg_dump.c:649 +#: pg_dump.c:663 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "параметри -s/--schema-only і --include-foreign-data не можуть використовуватись разом" -#: pg_dump.c:652 +#: pg_dump.c:666 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "параметр --include-foreign-data не підтримується з паралельним резервним копіюванням" -#: pg_dump.c:656 pg_restore.c:333 +#: pg_dump.c:670 pg_restore.c:333 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "параметри -c/--clean і -a/--data-only не можна використовувати разом" -#: pg_dump.c:661 pg_dumpall.c:381 pg_restore.c:382 +#: pg_dump.c:675 pg_dumpall.c:384 pg_restore.c:382 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "параметр --if-exists потребує параметр -c/--clean" -#: pg_dump.c:668 +#: pg_dump.c:682 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "параметр --on-conflict-do-nothing вимагає опції --inserts, --rows-per-insert або --column-inserts" -#: pg_dump.c:690 +#: pg_dump.c:704 #, c-format msgid "requested compression not available in this installation -- archive will be uncompressed" msgstr "затребуване стискання недоступне на цій системі -- архів не буде стискатися" -#: pg_dump.c:711 pg_restore.c:349 +#: pg_dump.c:725 pg_restore.c:349 #, c-format msgid "invalid number of parallel jobs" msgstr "неприпустима кількість паралельних завдань" -#: pg_dump.c:715 +#: pg_dump.c:729 #, c-format msgid "parallel backup only supported by the directory format" msgstr "паралельне резервне копіювання підтримується лише з форматом \"каталог\"" -#: pg_dump.c:770 +#: pg_dump.c:784 #, c-format -msgid "Synchronized snapshots are not supported by this server version.\n" +msgid "" +"Synchronized snapshots are not supported by this server version.\n" "Run with --no-synchronized-snapshots instead if you do not need\n" "synchronized snapshots." -msgstr "У цій версії серверу синхронізовані знімки не підтримуються.\n" +msgstr "" +"У цій версії серверу синхронізовані знімки не підтримуються.\n" "Якщо вам не потрібні синхронізовані знімки, виконайте \n" " --no-synchronized-snapshots." -#: pg_dump.c:776 +#: pg_dump.c:790 #, c-format msgid "Exported snapshots are not supported by this server version." msgstr "Експортовані знімки не підтримуються цією версією серверу." -#: pg_dump.c:788 +#: pg_dump.c:802 #, c-format msgid "last built-in OID is %u" msgstr "останній вбудований OID %u" -#: pg_dump.c:797 +#: pg_dump.c:811 #, c-format msgid "no matching schemas were found" msgstr "відповідних схем не знайдено" -#: pg_dump.c:811 +#: pg_dump.c:825 #, c-format msgid "no matching tables were found" msgstr "відповідних таблиць не знайдено" -#: pg_dump.c:986 +#: pg_dump.c:847 +#, c-format +msgid "no matching extensions were found" +msgstr "не знайдено відповідних розширень" + +#: pg_dump.c:1017 #, c-format -msgid "%s dumps a database as a text file or to other formats.\n\n" -msgstr "%s зберігає резервну копію бази даних в текстовому файлі або в інших форматах.\n\n" +msgid "" +"%s dumps a database as a text file or to other formats.\n" +"\n" +msgstr "" +"%s зберігає резервну копію бази даних в текстовому файлі або в інших форматах.\n" +"\n" -#: pg_dump.c:987 pg_dumpall.c:617 pg_restore.c:462 +#: pg_dump.c:1018 pg_dumpall.c:622 pg_restore.c:462 #, c-format msgid "Usage:\n" msgstr "Використання:\n" -#: pg_dump.c:988 +#: pg_dump.c:1019 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: pg_dump.c:990 pg_dumpall.c:620 pg_restore.c:465 +#: pg_dump.c:1021 pg_dumpall.c:625 pg_restore.c:465 #, c-format -msgid "\n" +msgid "" +"\n" "General options:\n" -msgstr "\n" +msgstr "" +"\n" "Основні налаштування:\n" -#: pg_dump.c:991 +#: pg_dump.c:1022 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=FILENAME ім'я файлу виводу або каталогу\n" -#: pg_dump.c:992 +#: pg_dump.c:1023 #, c-format -msgid " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" +msgid "" +" -F, --format=c|d|t|p output file format (custom, directory, tar,\n" " plain text (default))\n" -msgstr " -F, --format=c|d|t|p формат файлу виводу (спеціальний, каталог, tar,\n" +msgstr "" +" -F, --format=c|d|t|p формат файлу виводу (спеціальний, каталог, tar,\n" " звичайний текст (за замовчуванням))\n" -#: pg_dump.c:994 +#: pg_dump.c:1025 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM використовувати ці паралельні завдання для вивантаження\n" -#: pg_dump.c:995 pg_dumpall.c:622 +#: pg_dump.c:1026 pg_dumpall.c:627 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose детальний режим\n" -#: pg_dump.c:996 pg_dumpall.c:623 +#: pg_dump.c:1027 pg_dumpall.c:628 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію, потім вийти\n" -#: pg_dump.c:997 +#: pg_dump.c:1028 #, c-format msgid " -Z, --compress=0-9 compression level for compressed formats\n" msgstr " -Z, --compress=0-9 рівень стискання для стиснутих форматів\n" -#: pg_dump.c:998 pg_dumpall.c:624 +#: pg_dump.c:1029 pg_dumpall.c:629 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr " --lock-wait-timeout=TIMEOUT помилка після очікування TIMEOUT для блокування таблиці\n" -#: pg_dump.c:999 pg_dumpall.c:651 +#: pg_dump.c:1030 pg_dumpall.c:656 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync не чекати безпечного збереження змін на диск\n" -#: pg_dump.c:1000 pg_dumpall.c:625 +#: pg_dump.c:1031 pg_dumpall.c:630 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: pg_dump.c:1002 pg_dumpall.c:626 +#: pg_dump.c:1033 pg_dumpall.c:631 #, c-format -msgid "\n" +msgid "" +"\n" "Options controlling the output content:\n" -msgstr "\n" +msgstr "" +"\n" "Параметри, що керують вихідним вмістом:\n" -#: pg_dump.c:1003 pg_dumpall.c:627 +#: pg_dump.c:1034 pg_dumpall.c:632 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only вивантажити лише дані, без схеми\n" -#: pg_dump.c:1004 +#: pg_dump.c:1035 #, c-format msgid " -b, --blobs include large objects in dump\n" msgstr " -b, --blobs включити у вивантаження великі об'єкти\n" -#: pg_dump.c:1005 +#: pg_dump.c:1036 #, c-format msgid " -B, --no-blobs exclude large objects in dump\n" msgstr " -B, --no-blobs виключити з вивантаження великі об'єкти\n" -#: pg_dump.c:1006 pg_restore.c:476 +#: pg_dump.c:1037 pg_restore.c:476 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr " -c, --clean видалити об'єкти бази даних перед перед повторним створенням\n" -#: pg_dump.c:1007 +#: pg_dump.c:1038 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr " -C, --create включити у вивантаження команди для створення бази даних\n" -#: pg_dump.c:1008 pg_dumpall.c:629 +#: pg_dump.c:1039 +#, c-format +msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" +msgstr " -e, --extension=PATTERN вивантажити лише вказане(і) розширення\n" + +#: pg_dump.c:1040 pg_dumpall.c:634 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=ENCODING вивантажити дані в кодуванні ENCODING\n" -#: pg_dump.c:1009 +#: pg_dump.c:1041 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=PATTERN вивантажити лише вказану схему(и)\n" -#: pg_dump.c:1010 +#: pg_dump.c:1042 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=PATTERN НЕ вивантажувати вказану схему(и)\n" -#: pg_dump.c:1011 +#: pg_dump.c:1043 #, c-format -msgid " -O, --no-owner skip restoration of object ownership in\n" +msgid "" +" -O, --no-owner skip restoration of object ownership in\n" " plain-text format\n" -msgstr " -O, --no-owner пропускати відновлення володіння об'єктами\n" +msgstr "" +" -O, --no-owner пропускати відновлення володіння об'єктами\n" " при використанні текстового формату\n" -#: pg_dump.c:1013 pg_dumpall.c:633 +#: pg_dump.c:1045 pg_dumpall.c:638 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only вивантажити лише схему, без даних\n" -#: pg_dump.c:1014 +#: pg_dump.c:1046 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr " -S, --superuser=NAME ім'я користувача, яке буде використовуватись у звичайних текстових форматах\n" -#: pg_dump.c:1015 +#: pg_dump.c:1047 #, c-format msgid " -t, --table=PATTERN dump the specified table(s) only\n" msgstr " -t, --table=PATTERN вивантажити лише вказані таблиці\n" -#: pg_dump.c:1016 +#: pg_dump.c:1048 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=PATTERN НЕ вивантажувати вказані таблиці\n" -#: pg_dump.c:1017 pg_dumpall.c:636 +#: pg_dump.c:1049 pg_dumpall.c:641 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges не вивантажувати права (надання/відкликання)\n" -#: pg_dump.c:1018 pg_dumpall.c:637 +#: pg_dump.c:1050 pg_dumpall.c:642 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade для використання лише утилітами оновлення\n" -#: pg_dump.c:1019 pg_dumpall.c:638 +#: pg_dump.c:1051 pg_dumpall.c:643 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr " --column-inserts вивантажити дані у вигляді команд INSERT з іменами стовпців\n" -#: pg_dump.c:1020 pg_dumpall.c:639 +#: pg_dump.c:1052 pg_dumpall.c:644 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr " --disable-dollar-quoting вимкнути цінову пропозицію $, використовувати SQL стандартну цінову пропозицію\n" -#: pg_dump.c:1021 pg_dumpall.c:640 pg_restore.c:493 +#: pg_dump.c:1053 pg_dumpall.c:645 pg_restore.c:493 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr " --disable-triggers вимкнути тригери лише під час відновлення даних\n" -#: pg_dump.c:1022 +#: pg_dump.c:1054 #, c-format -msgid " --enable-row-security enable row security (dump only content user has\n" +msgid "" +" --enable-row-security enable row security (dump only content user has\n" " access to)\n" -msgstr " --enable-row-security активувати захист на рівні рядків (вивантажити лише той вміст, до якого\n" +msgstr "" +" --enable-row-security активувати захист на рівні рядків (вивантажити лише той вміст, до якого\n" " користувач має доступ)\n" -#: pg_dump.c:1024 +#: pg_dump.c:1056 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=PATTERN НЕ вивантажувати дані вказаних таблиць\n" -#: pg_dump.c:1025 pg_dumpall.c:642 +#: pg_dump.c:1057 pg_dumpall.c:647 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr " --extra-float-digits=NUM змінити параметр за замовчуванням для extra_float_digits\n" -#: pg_dump.c:1026 pg_dumpall.c:643 pg_restore.c:495 +#: pg_dump.c:1058 pg_dumpall.c:648 pg_restore.c:495 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists використовувати IF EXISTS під час видалення об'єктів\n" -#: pg_dump.c:1027 +#: pg_dump.c:1059 #, c-format -msgid " --include-foreign-data=PATTERN\n" +msgid "" +" --include-foreign-data=PATTERN\n" " include data of foreign tables on foreign\n" " servers matching PATTERN\n" -msgstr " --include-foreign-data=ШАБЛОН\n" +msgstr "" +" --include-foreign-data=ШАБЛОН\n" " включають дані підлеглих таблиць на підлеглих\n" " сервери, що відповідають ШАБЛОНУ\n" -#: pg_dump.c:1030 pg_dumpall.c:644 +#: pg_dump.c:1062 pg_dumpall.c:649 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr " --inserts вивантажити дані у вигляді команд INSERT, не COPY\n" -#: pg_dump.c:1031 pg_dumpall.c:645 +#: pg_dump.c:1063 pg_dumpall.c:650 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root завантажувати секції через головну таблицю\n" -#: pg_dump.c:1032 pg_dumpall.c:646 +#: pg_dump.c:1064 pg_dumpall.c:651 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments не вивантажувати коментарі\n" -#: pg_dump.c:1033 pg_dumpall.c:647 +#: pg_dump.c:1065 pg_dumpall.c:652 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications не вивантажувати публікації\n" -#: pg_dump.c:1034 pg_dumpall.c:649 +#: pg_dump.c:1066 pg_dumpall.c:654 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr " --no-security-labels не вивантажувати завдання міток безпеки\n" -#: pg_dump.c:1035 pg_dumpall.c:650 +#: pg_dump.c:1067 pg_dumpall.c:655 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions не вивантажувати підписки\n" -#: pg_dump.c:1036 +#: pg_dump.c:1068 #, c-format msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n" msgstr " --no-synchronized-snapshots не використовувати синхронізовані знімки в паралельних завданнях\n" -#: pg_dump.c:1037 pg_dumpall.c:652 +#: pg_dump.c:1069 pg_dumpall.c:657 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces не вивантажувати призначення табличних просторів\n" -#: pg_dump.c:1038 pg_dumpall.c:653 +#: pg_dump.c:1070 pg_dumpall.c:658 +#, c-format +msgid " --no-toast-compression do not dump TOAST compression methods\n" +msgstr " --no-toast-compression не вивантажувати методи стиснення TOAST\n" + +#: pg_dump.c:1071 pg_dumpall.c:659 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data не вивантажувати дані таблиць, які не журналюються\n" -#: pg_dump.c:1039 pg_dumpall.c:654 +#: pg_dump.c:1072 pg_dumpall.c:660 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" msgstr " --on-conflict-do-nothing додавати ON CONFLICT DO NOTHING до команди INSERT\n" -#: pg_dump.c:1040 pg_dumpall.c:655 +#: pg_dump.c:1073 pg_dumpall.c:661 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr " --quote-all-identifiers укладати в лапки всі ідентифікатори, а не тільки ключові слова\n" -#: pg_dump.c:1041 pg_dumpall.c:656 +#: pg_dump.c:1074 pg_dumpall.c:662 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=NROWS кількість рядків для INSERT; вимагає параметру --inserts\n" -#: pg_dump.c:1042 +#: pg_dump.c:1075 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr " --section=SECTION вивантажити вказану секцію (pre-data, data або post-data)\n" -#: pg_dump.c:1043 +#: pg_dump.c:1076 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr " --serializable-deferrable чекати коли вивантаження можна буде виконати без аномалій\n" -#: pg_dump.c:1044 +#: pg_dump.c:1077 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT використовувати під час вивантаження вказаний знімок\n" -#: pg_dump.c:1045 pg_restore.c:504 +#: pg_dump.c:1078 pg_restore.c:504 #, c-format -msgid " --strict-names require table and/or schema include patterns to\n" +msgid "" +" --strict-names require table and/or schema include patterns to\n" " match at least one entity each\n" -msgstr " --strict-names потребувати, щоб при вказівці шаблону включення\n" +msgstr "" +" --strict-names потребувати, щоб при вказівці шаблону включення\n" " таблиці і/або схеми йому відповідав мінімум один об'єкт\n" -#: pg_dump.c:1047 pg_dumpall.c:657 pg_restore.c:506 +#: pg_dump.c:1080 pg_dumpall.c:663 pg_restore.c:506 #, c-format -msgid " --use-set-session-authorization\n" +msgid "" +" --use-set-session-authorization\n" " use SET SESSION AUTHORIZATION commands instead of\n" " ALTER OWNER commands to set ownership\n" -msgstr " --use-set-session-authorization\n" +msgstr "" +" --use-set-session-authorization\n" " щоб встановити власника, використати команди SET SESSION AUTHORIZATION,\n" " замість команд ALTER OWNER\n" -#: pg_dump.c:1051 pg_dumpall.c:661 pg_restore.c:510 +#: pg_dump.c:1084 pg_dumpall.c:667 pg_restore.c:510 #, c-format -msgid "\n" +msgid "" +"\n" "Connection options:\n" -msgstr "\n" +msgstr "" +"\n" "Налаштування з'єднання:\n" -#: pg_dump.c:1052 +#: pg_dump.c:1085 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAME ім'я бази даних для вивантаження\n" -#: pg_dump.c:1053 pg_dumpall.c:663 pg_restore.c:511 +#: pg_dump.c:1086 pg_dumpall.c:669 pg_restore.c:511 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME хост серверу баз даних або каталог сокетів\n" -#: pg_dump.c:1054 pg_dumpall.c:665 pg_restore.c:512 +#: pg_dump.c:1087 pg_dumpall.c:671 pg_restore.c:512 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT номер порту сервера бази даних\n" -#: pg_dump.c:1055 pg_dumpall.c:666 pg_restore.c:513 +#: pg_dump.c:1088 pg_dumpall.c:672 pg_restore.c:513 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAME підключатись як вказаний користувач бази даних\n" -#: pg_dump.c:1056 pg_dumpall.c:667 pg_restore.c:514 +#: pg_dump.c:1089 pg_dumpall.c:673 pg_restore.c:514 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ніколи не запитувати пароль\n" -#: pg_dump.c:1057 pg_dumpall.c:668 pg_restore.c:515 +#: pg_dump.c:1090 pg_dumpall.c:674 pg_restore.c:515 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password запитувати пароль завжди (повинно траплятись автоматично)\n" -#: pg_dump.c:1058 pg_dumpall.c:669 +#: pg_dump.c:1091 pg_dumpall.c:675 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROLENAME виконати SET ROLE до вивантаження\n" -#: pg_dump.c:1060 +#: pg_dump.c:1093 #, c-format -msgid "\n" +msgid "" +"\n" "If no database name is supplied, then the PGDATABASE environment\n" -"variable value is used.\n\n" -msgstr "\n" -"Якщо ім'я бази даних не вказано, тоді використовується значення змінної середовища PGDATABASE.\n\n" +"variable value is used.\n" +"\n" +msgstr "" +"\n" +"Якщо ім'я бази даних не вказано, тоді використовується значення змінної середовища PGDATABASE.\n" +"\n" -#: pg_dump.c:1062 pg_dumpall.c:673 pg_restore.c:522 +#: pg_dump.c:1095 pg_dumpall.c:679 pg_restore.c:522 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Повідомляти про помилки на <%s>.\n" -#: pg_dump.c:1063 pg_dumpall.c:674 pg_restore.c:523 +#: pg_dump.c:1096 pg_dumpall.c:680 pg_restore.c:523 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" -#: pg_dump.c:1082 pg_dumpall.c:499 +#: pg_dump.c:1115 pg_dumpall.c:504 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "вказано неприпустиме клієнтське кодування \"%s\"" -#: pg_dump.c:1228 +#: pg_dump.c:1261 #, c-format -msgid "Synchronized snapshots on standby servers are not supported by this server version.\n" +msgid "" +"Synchronized snapshots on standby servers are not supported by this server version.\n" "Run with --no-synchronized-snapshots instead if you do not need\n" "synchronized snapshots." msgstr "Синхронізовані знімки на резервному сервері не підтримуються цією версією сервера. Запустіть із параметром --no-synchronized-snapshots, якщо вам не потрібні синхронізовані знімки." -#: pg_dump.c:1297 +#: pg_dump.c:1330 #, c-format msgid "invalid output format \"%s\" specified" msgstr "вказано неприпустимий формат виводу \"%s\"" -#: pg_dump.c:1335 +#: pg_dump.c:1368 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "не знайдено відповідних схем для візерунку \"%s\"" -#: pg_dump.c:1382 +#: pg_dump.c:1415 +#, c-format +msgid "no matching extensions were found for pattern \"%s\"" +msgstr "не знайдено відповідних розширень для шаблону \"%s\"" + +#: pg_dump.c:1462 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "не знайдено відповідних підлеглих серверів для шаблону \"%s\"" -#: pg_dump.c:1445 +#: pg_dump.c:1525 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "не знайдено відповідних таблиць для візерунку\"%s\"" -#: pg_dump.c:1858 +#: pg_dump.c:1948 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "вивантажування змісту таблиці \"%s.%s\"" -#: pg_dump.c:1965 +#: pg_dump.c:2055 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Помилка вивантажування змісту таблиці \"%s\": помилка в PQgetCopyData()." -#: pg_dump.c:1966 pg_dump.c:1976 +#: pg_dump.c:2056 pg_dump.c:2066 #, c-format msgid "Error message from server: %s" msgstr "Повідомлення про помилку від сервера: %s" -#: pg_dump.c:1967 pg_dump.c:1977 +#: pg_dump.c:2057 pg_dump.c:2067 #, c-format msgid "The command was: %s" msgstr "Команда була: %s" -#: pg_dump.c:1975 +#: pg_dump.c:2065 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." -msgstr "Помилка вивантажування змісту таблиці \"%s\": помилка в PQgetResult(). " +msgstr "Помилка вивантажування змісту таблиці \"%s\": помилка в PQgetResult()." -#: pg_dump.c:2731 +#: pg_dump.c:2825 #, c-format msgid "saving database definition" msgstr "збереження визначення бази даних" -#: pg_dump.c:3203 +#: pg_dump.c:3297 #, c-format msgid "saving encoding = %s" msgstr "збереження кодування = %s" -#: pg_dump.c:3228 +#: pg_dump.c:3322 #, c-format msgid "saving standard_conforming_strings = %s" msgstr "збереження standard_conforming_strings = %s" -#: pg_dump.c:3267 +#: pg_dump.c:3361 #, c-format msgid "could not parse result of current_schemas()" msgstr "не вдалося проаналізувати результат current_schemas()" -#: pg_dump.c:3286 +#: pg_dump.c:3380 #, c-format msgid "saving search_path = %s" msgstr "збереження search_path = %s" -#: pg_dump.c:3326 +#: pg_dump.c:3420 #, c-format msgid "reading large objects" msgstr "читання великих об’єктів" -#: pg_dump.c:3508 +#: pg_dump.c:3602 #, c-format msgid "saving large objects" msgstr "збереження великих об’єктів" -#: pg_dump.c:3554 +#: pg_dump.c:3648 #, c-format msgid "error reading large object %u: %s" msgstr "помилка читання великих об’єктів %u: %s" -#: pg_dump.c:3606 +#: pg_dump.c:3700 #, c-format msgid "reading row security enabled for table \"%s.%s\"" msgstr "читання рядка безпеки активовано для таблиці \"%s.%s\"" -#: pg_dump.c:3637 +#: pg_dump.c:3731 #, c-format msgid "reading policies for table \"%s.%s\"" msgstr "читання політики для таблиці \"%s.%s\"" -#: pg_dump.c:3789 +#: pg_dump.c:3883 #, c-format msgid "unexpected policy command type: %c" msgstr "неочікуваний тип команди в політиці: %c" -#: pg_dump.c:3940 +#: pg_dump.c:4037 #, c-format msgid "owner of publication \"%s\" appears to be invalid" msgstr "власник публікації \"%s\" здається недійсним" -#: pg_dump.c:4085 -#, c-format -msgid "reading publication membership for table \"%s.%s\"" -msgstr "читання членства публікації для таблиці \"%s.%s\"" - -#: pg_dump.c:4228 +#: pg_dump.c:4329 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "підписки не вивантажені через те, що чинний користувач не є суперкористувачем" -#: pg_dump.c:4282 +#: pg_dump.c:4400 #, c-format msgid "owner of subscription \"%s\" appears to be invalid" msgstr "власник підписки \"%s\" є недійсним" -#: pg_dump.c:4326 +#: pg_dump.c:4443 #, c-format msgid "could not parse subpublications array" msgstr "не вдалося аналізувати масив підпублікацій" -#: pg_dump.c:4648 +#: pg_dump.c:4801 #, c-format msgid "could not find parent extension for %s %s" msgstr "не вдалося знайти батьківський елемент для %s %s" -#: pg_dump.c:4780 +#: pg_dump.c:4933 #, c-format msgid "owner of schema \"%s\" appears to be invalid" msgstr "власник схеми \"%s\" виглядає недійсним" -#: pg_dump.c:4803 +#: pg_dump.c:4956 #, c-format msgid "schema with OID %u does not exist" msgstr "схема з OID %u не існує" -#: pg_dump.c:5128 +#: pg_dump.c:5285 #, c-format msgid "owner of data type \"%s\" appears to be invalid" msgstr "власник типу даних \"%s\" здається недійсним" -#: pg_dump.c:5213 +#: pg_dump.c:5369 #, c-format msgid "owner of operator \"%s\" appears to be invalid" msgstr "власник оператора \"%s\" здається недійсним" -#: pg_dump.c:5515 +#: pg_dump.c:5668 #, c-format msgid "owner of operator class \"%s\" appears to be invalid" msgstr "власник класу операторів \"%s\" здається недійсним" -#: pg_dump.c:5599 +#: pg_dump.c:5751 #, c-format msgid "owner of operator family \"%s\" appears to be invalid" msgstr "власник сімейства операторів \"%s\" здається недійсним" -#: pg_dump.c:5768 +#: pg_dump.c:5919 #, c-format msgid "owner of aggregate function \"%s\" appears to be invalid" msgstr "власник агрегатної функції \"%s\" є недійсним" -#: pg_dump.c:6028 +#: pg_dump.c:6178 #, c-format msgid "owner of function \"%s\" appears to be invalid" msgstr "власник функції \"%s\" здається недійсним" -#: pg_dump.c:6856 +#: pg_dump.c:7005 #, c-format msgid "owner of table \"%s\" appears to be invalid" msgstr "власник таблиці \"%s\" здається недійсним" -#: pg_dump.c:6898 pg_dump.c:17376 +#: pg_dump.c:7047 pg_dump.c:17485 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "помилка цілісності, за OID %u не вдалося знайти батьківську таблицю послідовності з OID %u" -#: pg_dump.c:7040 +#: pg_dump.c:7186 #, c-format msgid "reading indexes for table \"%s.%s\"" msgstr "читання індексів таблиці \"%s.%s\"" -#: pg_dump.c:7455 +#: pg_dump.c:7600 #, c-format msgid "reading foreign key constraints for table \"%s.%s\"" msgstr "читання обмежень зовнішніх ключів таблиці \"%s.%s\"" -#: pg_dump.c:7736 +#: pg_dump.c:7879 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "помилка цілісності, за OID %u не вдалося знайти батьківську таблицю для запису pg_rewrite з OID %u" -#: pg_dump.c:7819 +#: pg_dump.c:7963 #, c-format msgid "reading triggers for table \"%s.%s\"" msgstr "читання тригерів таблиці \"%s.%s\"" -#: pg_dump.c:7952 +#: pg_dump.c:8144 #, c-format msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" msgstr "запит не повернув ім'я цільової таблиці для тригера зовнішнього ключа \"%s\" в таблиці \"%s\" (OID цільової таблиці: %u)" -#: pg_dump.c:8507 +#: pg_dump.c:8694 #, c-format msgid "finding the columns and types of table \"%s.%s\"" msgstr "пошук стовпців і типів таблиці \"%s.%s\"" -#: pg_dump.c:8643 +#: pg_dump.c:8818 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "неприпустима нумерація стовпців у таблиці \"%s\"" -#: pg_dump.c:8680 +#: pg_dump.c:8857 #, c-format msgid "finding default expressions of table \"%s.%s\"" msgstr "пошук виразів за замовчуванням для таблиці \"%s.%s\"" -#: pg_dump.c:8702 +#: pg_dump.c:8879 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "неприпустиме значення adnum %d для таблиці \"%s\"" -#: pg_dump.c:8767 +#: pg_dump.c:8972 #, c-format msgid "finding check constraints for table \"%s.%s\"" msgstr "пошук обмежень-перевірок для таблиці \"%s.%s\"" -#: pg_dump.c:8816 +#: pg_dump.c:9021 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" @@ -1949,172 +1975,182 @@ msgstr[1] "очікувалось %d обмеження-перевірки дл msgstr[2] "очікувалось %d обмежень-перевірок для таблиці \"%s\", але знайдено %d" msgstr[3] "очікувалось %d обмежень-перевірок для таблиці \"%s\", але знайдено %d" -#: pg_dump.c:8820 +#: pg_dump.c:9025 #, c-format msgid "(The system catalogs might be corrupted.)" msgstr "(Можливо, системні каталоги пошкоджені.)" -#: pg_dump.c:10406 +#: pg_dump.c:10610 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "typtype типу даних \"%s\" має неприпустимий вигляд" -#: pg_dump.c:11760 +#: pg_dump.c:11962 #, c-format msgid "bogus value in proargmodes array" msgstr "неприпустиме значення в масиві proargmodes" -#: pg_dump.c:12132 +#: pg_dump.c:12269 #, c-format msgid "could not parse proallargtypes array" msgstr "не вдалося аналізувати масив proallargtypes" -#: pg_dump.c:12148 +#: pg_dump.c:12285 #, c-format msgid "could not parse proargmodes array" msgstr "не вдалося аналізувати масив proargmodes" -#: pg_dump.c:12162 +#: pg_dump.c:12299 #, c-format msgid "could not parse proargnames array" msgstr "не вдалося аналізувати масив proargnames" -#: pg_dump.c:12173 +#: pg_dump.c:12309 #, c-format msgid "could not parse proconfig array" msgstr "не вдалося аналізувати масив proconfig" -#: pg_dump.c:12253 +#: pg_dump.c:12389 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "нерозпізнане значення provolatile для функції \"%s\"" -#: pg_dump.c:12303 pg_dump.c:14361 +#: pg_dump.c:12439 pg_dump.c:14390 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "нерозпізнане значення proparallel для функції \"%s\"" -#: pg_dump.c:12442 pg_dump.c:12551 pg_dump.c:12558 +#: pg_dump.c:12578 pg_dump.c:12687 pg_dump.c:12694 #, c-format msgid "could not find function definition for function with OID %u" msgstr "не вдалося знайти визначення функції для функції з OID %u" -#: pg_dump.c:12481 +#: pg_dump.c:12617 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "неприпустиме значення в полі pg_cast.castfunc або pg_cast.castmethod" -#: pg_dump.c:12484 +#: pg_dump.c:12620 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "неприпустиме значення в полі pg_cast.castmethod" -#: pg_dump.c:12577 +#: pg_dump.c:12713 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "неприпустиме визначення перетворення, як мінімум одне з trffromsql і trftosql повинно бути ненульовим" -#: pg_dump.c:12594 +#: pg_dump.c:12730 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "неприпустиме значення в полі pg_transform.trffromsql" -#: pg_dump.c:12615 +#: pg_dump.c:12751 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "неприпустиме значення в полі pg_transform.trftosql" -#: pg_dump.c:12931 +#: pg_dump.c:12903 +#, c-format +msgid "postfix operators are not supported anymore (operator \"%s\")" +msgstr "постфіксні оператори більше не підтримуються (оператор \"%s\")" + +#: pg_dump.c:13073 #, c-format msgid "could not find operator with OID %s" msgstr "не вдалося знайти оператора з OID %s" -#: pg_dump.c:12999 +#: pg_dump.c:13141 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "неприпустимий тип \"%c\" методу доступу \"%s\"" -#: pg_dump.c:13753 +#: pg_dump.c:13895 #, c-format msgid "unrecognized collation provider: %s" msgstr "нерозпізнаний постачальник правил сортування: %s" -#: pg_dump.c:14225 -#, c-format -msgid "aggregate function %s could not be dumped correctly for this database version; ignored" -msgstr "агрегатна функція %s не може бути вивантажена правильно для цієї версії бази даних; пропускається" - -#: pg_dump.c:14280 +#: pg_dump.c:14309 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "нерозпізнане значення aggfinalmodify для агрегату \"%s\"" -#: pg_dump.c:14336 +#: pg_dump.c:14365 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "нерозпізнане значення aggmfinalmodify для агрегату \"%s\"" -#: pg_dump.c:15058 +#: pg_dump.c:15087 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "нерозпізнаний тип об’єкта у стандартному праві: %d" -#: pg_dump.c:15076 +#: pg_dump.c:15105 #, c-format msgid "could not parse default ACL list (%s)" msgstr "не вдалося проаналізувати стандартний ACL список (%s)" -#: pg_dump.c:15161 +#: pg_dump.c:15190 #, c-format msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)" msgstr "не вдалося аналізувати початковий список GRANT ACL (%s) або початковий список REVOKE ACL (%s) для об'єкта \"%s\" (%s)" -#: pg_dump.c:15169 +#: pg_dump.c:15198 #, c-format msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)" msgstr "не вдалося аналізувати список GRANT ACL (%s) або список REVOKE ACL (%s) для об'єкта \"%s\" (%s)" -#: pg_dump.c:15684 +#: pg_dump.c:15713 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "запит на отримання визначення перегляду \"%s\" не повернув дані" -#: pg_dump.c:15687 +#: pg_dump.c:15716 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "запит на отримання визначення перегляду \"%s\" повернув більше, ніж одне визначення" -#: pg_dump.c:15694 +#: pg_dump.c:15723 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "визначення перегляду \"%s\" пусте (довжина нуль)" -#: pg_dump.c:15776 +#: pg_dump.c:15807 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS більше не підтримується (таблиця\"%s\")" -#: pg_dump.c:16256 -#, c-format -msgid "invalid number of parents %d for table \"%s\"" -msgstr "неприпустиме число батьківських елементів %d для таблиці \"%s\"" - -#: pg_dump.c:16579 +#: pg_dump.c:16672 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "неприпустиме число стовпців %d для таблиці \"%s\"" -#: pg_dump.c:16864 +#: pg_dump.c:16749 +#, c-format +msgid "could not parse index statistic columns" +msgstr "не вдалося проаналізувати стовпці статистики індексів" + +#: pg_dump.c:16751 +#, c-format +msgid "could not parse index statistic values" +msgstr "не вдалося проаналізувати значення статистики індексів" + +#: pg_dump.c:16753 +#, c-format +msgid "mismatched number of columns and values for index statistics" +msgstr "невідповідна кількість стовпців і значень для статистики індексів" + +#: pg_dump.c:16970 #, c-format msgid "missing index for constraint \"%s\"" msgstr "пропущено індекс для обмеження \"%s\"" -#: pg_dump.c:17089 +#: pg_dump.c:17195 #, c-format msgid "unrecognized constraint type: %c" msgstr "нерозпізнаний тип обмеження: %c" -#: pg_dump.c:17221 pg_dump.c:17441 +#: pg_dump.c:17327 pg_dump.c:17550 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" @@ -2123,67 +2159,82 @@ msgstr[1] "запит на отримання даних послідовнос msgstr[2] "запит на отримання даних послідовності \"%s\" повернув %d рядків (очікувалося 1)" msgstr[3] "запит на отримання даних послідовності \"%s\" повернув %d рядків (очікувалося 1)" -#: pg_dump.c:17255 +#: pg_dump.c:17361 #, c-format msgid "unrecognized sequence type: %s" msgstr "нерозпізнаний тип послідовності: %s" -#: pg_dump.c:17539 +#: pg_dump.c:17648 #, c-format msgid "unexpected tgtype value: %d" msgstr "неочікуване значення tgtype: %d" -#: pg_dump.c:17613 +#: pg_dump.c:17722 #, c-format msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" msgstr "неприпустимий рядок аргументу (%s) для тригера \"%s\" у таблиці \"%s\"" -#: pg_dump.c:17849 +#: pg_dump.c:17991 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" -msgstr "помилка запиту на отримання правила \"%s\" для таблиці \"%s\": повернено неправильне число рядків " +msgstr "помилка запиту на отримання правила \"%s\" для таблиці \"%s\": повернено неправильне число рядків" -#: pg_dump.c:18011 +#: pg_dump.c:18153 #, c-format msgid "could not find referenced extension %u" msgstr "не вдалося знайти згадане розширення %u" -#: pg_dump.c:18225 +#: pg_dump.c:18244 +#, c-format +msgid "could not parse extension configuration array" +msgstr "не вдалося проаналізувати масив конфігурації розширення" + +#: pg_dump.c:18246 +#, c-format +msgid "could not parse extension condition array" +msgstr "не вдалося проаналізувати масив умов розширення" + +#: pg_dump.c:18248 +#, c-format +msgid "mismatched number of configurations and conditions for extension" +msgstr "невідповідна кількість конфігурацій і умов для розширення" + +#: pg_dump.c:18380 #, c-format msgid "reading dependency data" msgstr "читання даних залежності" -#: pg_dump.c:18318 +#: pg_dump.c:18473 #, c-format msgid "no referencing object %u %u" msgstr "немає об’єкту посилання %u %u" -#: pg_dump.c:18329 +#: pg_dump.c:18484 #, c-format msgid "no referenced object %u %u" msgstr "немає посилання на об'єкт %u %u" -#: pg_dump.c:18702 +#: pg_dump.c:18858 #, c-format msgid "could not parse reloptions array" msgstr "неможливо розібрати масив reloptions" -#: pg_dump_sort.c:360 +#: pg_dump_sort.c:411 #, c-format msgid "invalid dumpId %d" msgstr "неприпустимий dumpId %d" -#: pg_dump_sort.c:366 +#: pg_dump_sort.c:417 #, c-format msgid "invalid dependency %d" msgstr "неприпустима залежність %d" -#: pg_dump_sort.c:599 +#: pg_dump_sort.c:650 #, c-format msgid "could not identify dependency loop" msgstr "не вдалося ідентифікувати цикл залежності" -#: pg_dump_sort.c:1170 +#: pg_dump_sort.c:1221 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" @@ -2192,187 +2243,196 @@ msgstr[1] "у наступних таблицях зациклені зовні msgstr[2] "у наступних таблицях зациклені зовнішні ключі:" msgstr[3] "у наступних таблицях зациклені зовнішні ключі:" -#: pg_dump_sort.c:1174 pg_dump_sort.c:1194 +#: pg_dump_sort.c:1225 pg_dump_sort.c:1245 #, c-format msgid " %s" msgstr " %s" -#: pg_dump_sort.c:1175 +#: pg_dump_sort.c:1226 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "Ви не зможете відновити дамп без використання --disable-triggers або тимчасово розірвати обмеження." -#: pg_dump_sort.c:1176 +#: pg_dump_sort.c:1227 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "Можливо, використання повного вивантажування замість --data-only вивантажування допоможе уникнути цієї проблеми." -#: pg_dump_sort.c:1188 +#: pg_dump_sort.c:1239 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "не вдалося вирішити цикл залежності серед цих елементів:" -#: pg_dumpall.c:199 +#: pg_dumpall.c:202 #, c-format -msgid "The program \"%s\" is needed by %s but was not found in the\n" +msgid "" +"The program \"%s\" is needed by %s but was not found in the\n" "same directory as \"%s\".\n" "Check your installation." -msgstr "Програма \"%s\" потрібна для %s, але не знайдена в тому ж каталозі, що й \"%s\".\n" +msgstr "" +"Програма \"%s\" потрібна для %s, але не знайдена в тому ж каталозі, що й \"%s\".\n" "Перевірте вашу установку." -#: pg_dumpall.c:204 +#: pg_dumpall.c:207 #, c-format -msgid "The program \"%s\" was found by \"%s\"\n" +msgid "" +"The program \"%s\" was found by \"%s\"\n" "but was not the same version as %s.\n" "Check your installation." -msgstr "Програма \"%s\" була знайдена \"%s\", але не була тієї ж версії, що %s.\n" +msgstr "" +"Програма \"%s\" була знайдена \"%s\", але не була тієї ж версії, що %s.\n" "Перевірте вашу установку." -#: pg_dumpall.c:356 +#: pg_dumpall.c:359 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "параметр --exclude-database не можна використовувати разом з -g/--globals-only, -r/--roles-only або -t/--tablespaces-only" -#: pg_dumpall.c:365 +#: pg_dumpall.c:368 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "параметри -g/--globals-only і -r/--roles-only не можна використовувати разом" -#: pg_dumpall.c:373 +#: pg_dumpall.c:376 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "параметри -g/--globals-only і -t/--tablespaces-only не можна використовувати разом" -#: pg_dumpall.c:387 +#: pg_dumpall.c:390 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "параметри -r/--roles-only і -t/--tablespaces-only не можна використовувати разом" -#: pg_dumpall.c:448 pg_dumpall.c:1754 +#: pg_dumpall.c:453 pg_dumpall.c:1756 #, c-format msgid "could not connect to database \"%s\"" msgstr "не вдалося зв'язатися з базою даних \"%s\"" -#: pg_dumpall.c:462 +#: pg_dumpall.c:467 #, c-format -msgid "could not connect to databases \"postgres\" or \"template1\"\n" +msgid "" +"could not connect to databases \"postgres\" or \"template1\"\n" "Please specify an alternative database." -msgstr "не вдалося зв'язатися з базами даних \"postgres\" або \"template1\"\n" +msgstr "" +"не вдалося зв'язатися з базами даних \"postgres\" або \"template1\"\n" "Будь ласка, вкажіть альтернативну базу даних." -#: pg_dumpall.c:616 +#: pg_dumpall.c:621 #, c-format -msgid "%s extracts a PostgreSQL database cluster into an SQL script file.\n\n" -msgstr "%s експортує кластер баз даних PostgreSQL до SQL-скрипту.\n\n" +msgid "" +"%s extracts a PostgreSQL database cluster into an SQL script file.\n" +"\n" +msgstr "" +"%s експортує кластер баз даних PostgreSQL до SQL-скрипту.\n" +"\n" -#: pg_dumpall.c:618 +#: pg_dumpall.c:623 #, c-format msgid " %s [OPTION]...\n" msgstr " %s: [OPTION]...\n" -#: pg_dumpall.c:621 +#: pg_dumpall.c:626 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=FILENAME ім'я вихідного файлу\n" -#: pg_dumpall.c:628 +#: pg_dumpall.c:633 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean очистити (видалити) бази даних перед відтворенням\n" -#: pg_dumpall.c:630 +#: pg_dumpall.c:635 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr " -g, --globals-only вивантажувати лише глобальні об’єкти, не бази даних\n" -#: pg_dumpall.c:631 pg_restore.c:485 +#: pg_dumpall.c:636 pg_restore.c:485 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner пропускається відновлення форми власності об’єктом\n" -#: pg_dumpall.c:632 +#: pg_dumpall.c:637 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr " -r, --roles-only вивантажувати лише ролі, не бази даних або табличні простори\n" -#: pg_dumpall.c:634 +#: pg_dumpall.c:639 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr " -S, --superuser=NAME ім'я суперкористувача для використання при вивантажуванні\n" -#: pg_dumpall.c:635 +#: pg_dumpall.c:640 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr " -t, --tablespaces-only вивантажувати лише табличні простори, не бази даних або ролі\n" -#: pg_dumpall.c:641 +#: pg_dumpall.c:646 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr " --exclude-database=PATTERN виключити бази даних, ім'я яких відповідає PATTERN\n" -#: pg_dumpall.c:648 +#: pg_dumpall.c:653 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords не вивантажувати паролі для ролей\n" -#: pg_dumpall.c:662 +#: pg_dumpall.c:668 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=CONNSTR підключення з використанням рядку підключення \n" -#: pg_dumpall.c:664 +#: pg_dumpall.c:670 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAME альтернативна база даних за замовчуванням\n" -#: pg_dumpall.c:671 +#: pg_dumpall.c:677 #, c-format -msgid "\n" +msgid "" +"\n" "If -f/--file is not used, then the SQL script will be written to the standard\n" -"output.\n\n" -msgstr "\n" -"Якщо -f/--file не використовується, тоді SQL- сценарій буде записаний до стандартного виводу.\n\n" +"output.\n" +"\n" +msgstr "" +"\n" +"Якщо -f/--file не використовується, тоді SQL- сценарій буде записаний до стандартного виводу.\n" +"\n" -#: pg_dumpall.c:877 +#: pg_dumpall.c:883 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "пропущено ім’я ролі, що починається з \"pg_\" (%s)" -#: pg_dumpall.c:1278 +#: pg_dumpall.c:1284 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "не вдалося аналізувати список ACL (%s) для табличного простору \"%s\"" -#: pg_dumpall.c:1495 +#: pg_dumpall.c:1501 #, c-format msgid "excluding database \"%s\"" msgstr "виключаємо базу даних \"%s\"" -#: pg_dumpall.c:1499 +#: pg_dumpall.c:1505 #, c-format msgid "dumping database \"%s\"" msgstr "вивантажуємо базу даних \"%s\"" -#: pg_dumpall.c:1531 +#: pg_dumpall.c:1537 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "помилка pg_dump для бази даних \"%s\", завершення роботи" -#: pg_dumpall.c:1540 +#: pg_dumpall.c:1546 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "не вдалося повторно відкрити файл виводу \"%s\": %m" -#: pg_dumpall.c:1584 +#: pg_dumpall.c:1590 #, c-format msgid "running \"%s\"" msgstr "виконується \"%s\"" -#: pg_dumpall.c:1775 -#, c-format -msgid "could not connect to database \"%s\": %s" -msgstr "не вдалося підключитись до бази даних \"%s\": %s" - #: pg_dumpall.c:1805 #, c-format msgid "could not get server version" @@ -2425,8 +2485,12 @@ msgstr "при відновленні проігноровано помилок: #: pg_restore.c:461 #, c-format -msgid "%s restores a PostgreSQL database from an archive created by pg_dump.\n\n" -msgstr "%s відновлює базу даних PostgreSQL з архіву, створеного командою pg_dump.\n\n" +msgid "" +"%s restores a PostgreSQL database from an archive created by pg_dump.\n" +"\n" +msgstr "" +"%s відновлює базу даних PostgreSQL з архіву, створеного командою pg_dump.\n" +"\n" #: pg_restore.c:463 #, c-format @@ -2470,9 +2534,11 @@ msgstr " -?, --help показати цю довідку, пот #: pg_restore.c:474 #, c-format -msgid "\n" +msgid "" +"\n" "Options controlling the restore:\n" -msgstr "\n" +msgstr "" +"\n" "Параметри, що керують відновленням:\n" #: pg_restore.c:475 @@ -2502,9 +2568,11 @@ msgstr " -j, --jobs=NUM щоб виконати відновле #: pg_restore.c:481 #, c-format -msgid " -L, --use-list=FILENAME use table of contents from this file for\n" +msgid "" +" -L, --use-list=FILENAME use table of contents from this file for\n" " selecting/ordering output\n" -msgstr " -L, --use-list=FILENAME використовувати зміст з цього файлу для \n" +msgstr "" +" -L, --use-list=FILENAME використовувати зміст з цього файлу для \n" " вибору/упорядкування даних\n" #: pg_restore.c:483 @@ -2564,7 +2632,8 @@ msgstr " --no-comments не відновлювати комен #: pg_restore.c:497 #, c-format -msgid " --no-data-for-failed-tables do not restore data of tables that could not be\n" +msgid "" +" --no-data-for-failed-tables do not restore data of tables that could not be\n" " created\n" msgstr " --no-data-for-failed-tables не відновлювати дані таблиць, які не вдалося створити\n" @@ -2600,23 +2669,22 @@ msgstr " --role=ROLENAME виконати SET ROLE перед від #: pg_restore.c:518 #, c-format -msgid "\n" +msgid "" +"\n" "The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n" "multiple times to select multiple objects.\n" -msgstr "\n" +msgstr "" +"\n" "Параметри -I, -n, -N, -P, -t, -T, і --section можна групувати і вказувати\n" "декілька разів для вибору декількох об'єктів.\n" #: pg_restore.c:521 #, c-format -msgid "\n" -"If no input file name is supplied, then standard input is used.\n\n" -msgstr "\n" -"Якщо ім'я файлу введеня не вказано, тоді використовується стандартне введення.\n\n" - -#~ msgid "ftell mismatch with expected position -- ftell used" -#~ msgstr "невідповідність позиції ftell з очікуваною -- використовується ftell" - -#~ msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive" -#~ msgstr "не вдалося знайти в архіві блок з ідентифікатором %d -- можливо, через непослідовність запиту відновлення, який не можна обробити через нестачу зсувів даних в архіві" - +msgid "" +"\n" +"If no input file name is supplied, then standard input is used.\n" +"\n" +msgstr "" +"\n" +"Якщо ім'я файлу введеня не вказано, тоді використовується стандартне введення.\n" +"\n" diff --git a/src/bin/pg_dump/po/zh_CN.po b/src/bin/pg_dump/po/zh_CN.po index 14d0e5412e..a580c50aae 100644 --- a/src/bin/pg_dump/po/zh_CN.po +++ b/src/bin/pg_dump/po/zh_CN.po @@ -3,80 +3,79 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_dump (PostgreSQL) 11\n" +"Project-Id-Version: pg_dump (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-05-30 18:00+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:48+0000\n" +"PO-Revision-Date: 2021-08-15 18:00+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.5.7\n" -#: ../../../src/common/logging.c:188 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "致命的: " -#: ../../../src/common/logging.c:195 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "错误: " -#: ../../../src/common/logging.c:202 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "警告: " -#: ../../common/exec.c:138 ../../common/exec.c:255 ../../common/exec.c:301 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "无法确认当前目录: %m" -#: ../../common/exec.c:157 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "无效的二进制码 \"%s\"" -#: ../../common/exec.c:207 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "无法读取二进制码 \"%s\"" -#: ../../common/exec.c:215 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "未能找到一个 \"%s\" 来执行" -#: ../../common/exec.c:271 ../../common/exec.c:310 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "无法跳转到目录 \"%s\" 中: %m" -#: ../../common/exec.c:288 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "无法读取符号链接 \"%s\": %m" -#: ../../common/exec.c:541 -#, c-format -msgid "pclose failed: %m" -msgstr "pclose调用失败: %m" +#: ../../common/exec.c:409 parallel.c:1614 +msgid "%s() failed: %m" +msgstr "%s()失败: %m" -#: ../../common/exec.c:670 ../../common/exec.c:715 ../../common/exec.c:807 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 msgid "out of memory" -msgstr "内存用尽" +msgstr "内存不足" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format msgid "out of memory\n" -msgstr "内存用尽\n" +msgstr "内存不足\n" -#: ../../common/fe_memutils.c:92 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "无法复制空指针 (内部错误)\n" @@ -111,212 +110,217 @@ msgstr "子进程被信号 %d 终止: %s" msgid "child process exited with unrecognized status %d" msgstr "子进程已退出, 未知状态 %d" -#: common.c:123 +#: common.c:124 #, c-format msgid "reading extensions" msgstr "读扩展" -#: common.c:127 +#: common.c:128 #, c-format msgid "identifying extension members" msgstr "识别扩展成员" -#: common.c:130 +#: common.c:131 #, c-format msgid "reading schemas" msgstr "读取模式" -#: common.c:140 +#: common.c:141 #, c-format msgid "reading user-defined tables" msgstr "读取用户定义表" -#: common.c:147 +#: common.c:148 #, c-format msgid "reading user-defined functions" msgstr "读取用户定义函数" -#: common.c:152 +#: common.c:153 #, c-format msgid "reading user-defined types" msgstr "读取用户定义类型" -#: common.c:157 +#: common.c:158 #, c-format msgid "reading procedural languages" msgstr "读取过程语言" -#: common.c:160 +#: common.c:161 #, c-format msgid "reading user-defined aggregate functions" msgstr "读取用户定义聚集函数" -#: common.c:163 +#: common.c:164 #, c-format msgid "reading user-defined operators" msgstr "读取用户定义操作符" -#: common.c:167 +#: common.c:168 #, c-format msgid "reading user-defined access methods" msgstr "读取用户定义的访问方法" -#: common.c:170 +#: common.c:171 #, c-format msgid "reading user-defined operator classes" msgstr "读取用户定义操作符集" -#: common.c:173 +#: common.c:174 #, c-format msgid "reading user-defined operator families" msgstr "读取用户定义操作符" -#: common.c:176 +#: common.c:177 #, c-format msgid "reading user-defined text search parsers" msgstr "读取用户定义的文本搜索解析器" -#: common.c:179 +#: common.c:180 #, c-format msgid "reading user-defined text search templates" msgstr "读取用户定义的文本搜索模板" -#: common.c:182 +#: common.c:183 #, c-format msgid "reading user-defined text search dictionaries" msgstr "读取用户定义的文本搜索字典" -#: common.c:185 +#: common.c:186 #, c-format msgid "reading user-defined text search configurations" msgstr "读取用户定义的文本搜索配置" -#: common.c:188 +#: common.c:189 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "读取用户定义外部数据封装器" -#: common.c:191 +#: common.c:192 #, c-format msgid "reading user-defined foreign servers" msgstr "读取用户定义的外部服务器" -#: common.c:194 +#: common.c:195 #, c-format msgid "reading default privileges" msgstr "正在读取缺省权限" -#: common.c:197 +#: common.c:198 #, c-format msgid "reading user-defined collations" msgstr "读取用户定义的校对函数" -#: common.c:201 +#: common.c:202 #, c-format msgid "reading user-defined conversions" msgstr "读取用户定义的字符集转换" -#: common.c:204 +#: common.c:205 #, c-format msgid "reading type casts" msgstr "读取类型转换" -#: common.c:207 +#: common.c:208 #, c-format msgid "reading transforms" msgstr "读取转换" -#: common.c:210 +#: common.c:211 #, c-format msgid "reading table inheritance information" msgstr "读取表继承信息" -#: common.c:213 +#: common.c:214 #, c-format msgid "reading event triggers" msgstr "读取事件触发器" -#: common.c:217 +#: common.c:218 #, c-format msgid "finding extension tables" msgstr "查找扩展表" -#: common.c:221 +#: common.c:222 #, c-format msgid "finding inheritance relationships" msgstr "正在查找关系继承" -#: common.c:224 +#: common.c:225 #, c-format msgid "reading column info for interesting tables" msgstr "正在读取感兴趣表的列信息" -#: common.c:227 +#: common.c:228 #, c-format msgid "flagging inherited columns in subtables" msgstr "在子表里标记继承字段" -#: common.c:230 +#: common.c:231 #, c-format msgid "reading indexes" msgstr "读取索引" -#: common.c:233 +#: common.c:234 #, c-format msgid "flagging indexes in partitioned tables" msgstr "在分区表中标记索引" -#: common.c:236 +#: common.c:237 #, c-format msgid "reading extended statistics" msgstr "读取扩展统计信息" -#: common.c:239 +#: common.c:240 #, c-format msgid "reading constraints" msgstr "读取约束" -#: common.c:242 +#: common.c:243 #, c-format msgid "reading triggers" msgstr "读取触发器" -#: common.c:245 +#: common.c:246 #, c-format msgid "reading rewrite rules" msgstr "读取重写规则" -#: common.c:248 +#: common.c:249 #, c-format msgid "reading policies" msgstr "读取策略" -#: common.c:251 +#: common.c:252 #, c-format msgid "reading publications" msgstr "读取发布" -#: common.c:254 +#: common.c:257 #, c-format msgid "reading publication membership" msgstr "读取发布成员资格" -#: common.c:257 +#: common.c:260 #, c-format msgid "reading subscriptions" msgstr "读取订阅" -#: common.c:1023 +#: common.c:338 +#, c-format +msgid "invalid number of parents %d for table \"%s\"" +msgstr "表 \"%2$s\" 的无效parents值 %1$d" + +#: common.c:1100 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "健全检查失败, 未找到表 \"%2$s\" (OID %3$u) 的 OID 为 %1$u 的父辈" -#: common.c:1065 +#: common.c:1142 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "无法分析数值数组\"%s\": 数字太多" -#: common.c:1080 +#: common.c:1157 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "无法分析数值数组\"%s\": 出现无效字符" @@ -326,74 +330,72 @@ msgstr "无法分析数值数组\"%s\": 出现无效字符" msgid "invalid compression code: %d" msgstr "无效的压缩码: %d" -#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:508 -#: compress_io.c:551 +#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504 +#: compress_io.c:547 #, c-format msgid "not built with zlib support" msgstr "没有编译成带有zlib库支持的版本" -#: compress_io.c:237 compress_io.c:336 +#: compress_io.c:236 compress_io.c:333 #, c-format msgid "could not initialize compression library: %s" msgstr "无法初始化压缩库: %s" -#: compress_io.c:257 +#: compress_io.c:256 #, c-format msgid "could not close compression stream: %s" msgstr "无法关闭压缩流: %s" -#: compress_io.c:274 +#: compress_io.c:273 #, c-format msgid "could not compress data: %s" msgstr "无法压缩数据: %s" -#: compress_io.c:352 compress_io.c:367 +#: compress_io.c:349 compress_io.c:364 #, c-format msgid "could not uncompress data: %s" msgstr "无法解压缩数据: %s" -#: compress_io.c:374 +#: compress_io.c:371 #, c-format msgid "could not close compression library: %s" msgstr "无法关闭压缩库: %s" -#: compress_io.c:588 compress_io.c:625 pg_backup_tar.c:555 pg_backup_tar.c:558 +#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:551 pg_backup_tar.c:554 #, c-format msgid "could not read from input file: %s" msgstr "无法从输入档案读取:%s" -#: compress_io.c:627 pg_backup_custom.c:578 pg_backup_directory.c:539 -#: pg_backup_tar.c:795 pg_backup_tar.c:818 +#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:552 +#: pg_backup_tar.c:787 pg_backup_tar.c:810 #, c-format msgid "could not read from input file: end of file" msgstr "无法从输入文件中读取:文件的结尾" -#: parallel.c:263 -#, c-format -msgid "WSAStartup failed: %d" -msgstr "WSAStartup 失败: %d" +#: parallel.c:254 +msgid "%s() failed: error code %d" +msgstr "%s()失败: 错误码为 %d" -#: parallel.c:968 +#: parallel.c:964 #, c-format msgid "could not create communication channels: %m" msgstr "无法创建通信通道: %m" -#: parallel.c:1031 +#: parallel.c:1021 #, c-format msgid "could not create worker process: %m" msgstr "无法创建工作进程: %m" -#: parallel.c:1160 -#, c-format -msgid "unrecognized command received from master: \"%s\"" -msgstr "从主机接收到无法识别的命令 \"%s\"" +#: parallel.c:1151 +msgid "unrecognized command received from leader: \"%s\"" +msgstr "从主机接收到无法识别的命令: \"%s\"" -#: parallel.c:1203 parallel.c:1441 +#: parallel.c:1194 parallel.c:1432 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "接收到来自工作者进程的无效消息: \"%s\"" -#: parallel.c:1335 +#: parallel.c:1326 #, c-format msgid "" "could not obtain lock on relation \"%s\"\n" @@ -402,656 +404,641 @@ msgstr "" "无法获取关系 \"%s\"上的锁\n" "这通常意味着在父进程pg_dump已经得到表的共享访问锁之后,仍有人请求该表的排它访问锁." -#: parallel.c:1424 +#: parallel.c:1415 #, c-format msgid "a worker process died unexpectedly" msgstr "一工作者进程意外退出" -#: parallel.c:1546 parallel.c:1662 +#: parallel.c:1537 parallel.c:1655 #, c-format msgid "could not write to the communication channel: %m" msgstr "无法写入通信通道: %m" -#: parallel.c:1623 -#, c-format -msgid "select() failed: %m" -msgstr "select() 失败: %m" - -#: parallel.c:1746 +#: parallel.c:1739 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: 无法创建套接字: 错误码为 %d" -#: parallel.c:1757 +#: parallel.c:1750 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: 无法绑定: 错误码为%d" -#: parallel.c:1764 +#: parallel.c:1757 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: 无法监听: 错误码为 %d" -#: parallel.c:1771 -#, c-format -msgid "pgpipe: getsockname() failed: error code %d" -msgstr "pgpipe: getsockname()调用失败: 错误码为 %d" +#: parallel.c:1764 +msgid "pgpipe: %s() failed: error code %d" +msgstr "pgpipe: %s()失败: 错误码为 %d" -#: parallel.c:1782 +#: parallel.c:1775 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: 无法创建继承套接字: 错误码为 %d" -#: parallel.c:1791 +#: parallel.c:1784 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: 无法连接套接字: 错误码为 %d" -#: parallel.c:1800 +#: parallel.c:1793 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: 无法接受连接: 错误码为 %d" -#: pg_backup_archiver.c:272 pg_backup_archiver.c:1595 +#: pg_backup_archiver.c:277 pg_backup_archiver.c:1576 #, c-format msgid "could not close output file: %m" msgstr "无法关闭输出文件: %m" -#: pg_backup_archiver.c:316 pg_backup_archiver.c:320 +#: pg_backup_archiver.c:321 pg_backup_archiver.c:325 #, c-format msgid "archive items not in correct section order" msgstr "归档项的序号不正确" -#: pg_backup_archiver.c:326 +#: pg_backup_archiver.c:331 #, c-format msgid "unexpected section code %d" msgstr "意外的节码 %d" -#: pg_backup_archiver.c:363 +#: pg_backup_archiver.c:368 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "不支持以这种归档文件格式进行并行恢复" -#: pg_backup_archiver.c:367 +#: pg_backup_archiver.c:372 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "不支持使用8.0版本以前的pg_dump命令产生的存档文件进行并行恢复" -#: pg_backup_archiver.c:385 +#: pg_backup_archiver.c:390 #, c-format msgid "cannot restore from compressed archive (compression not supported in this installation)" msgstr "无法从压缩的归档中恢复 (未配置压缩支持)" -#: pg_backup_archiver.c:402 +#: pg_backup_archiver.c:407 #, c-format msgid "connecting to database for restore" msgstr "为恢复数据库与数据库联接" -#: pg_backup_archiver.c:404 +#: pg_backup_archiver.c:409 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "1.3 以前的归档里不支持直接数据库联接" -#: pg_backup_archiver.c:449 +#: pg_backup_archiver.c:452 #, c-format msgid "implied data-only restore" msgstr "隐含的只恢复数据" -#: pg_backup_archiver.c:515 +#: pg_backup_archiver.c:518 #, c-format msgid "dropping %s %s" msgstr "删除 %s %s" -#: pg_backup_archiver.c:610 +#: pg_backup_archiver.c:613 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "找不到要插入的位置,由于IF EXISTS在 \"%s\"状态" -#: pg_backup_archiver.c:766 pg_backup_archiver.c:768 +#: pg_backup_archiver.c:769 pg_backup_archiver.c:771 #, c-format msgid "warning from original dump file: %s" msgstr "来自原始转储文件的警告: %s" -#: pg_backup_archiver.c:783 +#: pg_backup_archiver.c:786 #, c-format msgid "creating %s \"%s.%s\"" msgstr "创建%s \"%s.%s\"" -#: pg_backup_archiver.c:786 +#: pg_backup_archiver.c:789 #, c-format msgid "creating %s \"%s\"" msgstr "创建%s \"%s\"" -#: pg_backup_archiver.c:843 +#: pg_backup_archiver.c:839 #, c-format msgid "connecting to new database \"%s\"" msgstr "联接到新数据库 \"%s\"" -#: pg_backup_archiver.c:871 +#: pg_backup_archiver.c:866 #, c-format msgid "processing %s" msgstr "正在处理 %s" -#: pg_backup_archiver.c:891 +#: pg_backup_archiver.c:886 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "为表\"%s.%s\"处理数据" -#: pg_backup_archiver.c:953 +#: pg_backup_archiver.c:948 #, c-format msgid "executing %s %s" msgstr "执行 %s %s" -#: pg_backup_archiver.c:992 +#: pg_backup_archiver.c:987 #, c-format msgid "disabling triggers for %s" msgstr "为%s禁用触发器" -#: pg_backup_archiver.c:1018 +#: pg_backup_archiver.c:1013 #, c-format msgid "enabling triggers for %s" msgstr "为%s启用触发器" -#: pg_backup_archiver.c:1046 +#: pg_backup_archiver.c:1041 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "内部错误 -- WriteData 不能在 DataDumper 过程的环境之外调用" -#: pg_backup_archiver.c:1231 +#: pg_backup_archiver.c:1224 #, c-format msgid "large-object output not supported in chosen format" msgstr "选定的格式不支持大对象输出" -#: pg_backup_archiver.c:1289 +#: pg_backup_archiver.c:1282 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "恢复%d个大对象" msgstr[1] "恢复%d个大对象" -#: pg_backup_archiver.c:1310 pg_backup_tar.c:738 +#: pg_backup_archiver.c:1303 pg_backup_tar.c:730 #, c-format msgid "restoring large object with OID %u" msgstr "恢复带有OID %u 的大对象" -#: pg_backup_archiver.c:1322 +#: pg_backup_archiver.c:1315 #, c-format msgid "could not create large object %u: %s" msgstr "无法创建大对象%u: %s" -#: pg_backup_archiver.c:1327 pg_dump.c:3470 +#: pg_backup_archiver.c:1320 pg_dump.c:3638 #, c-format msgid "could not open large object %u: %s" msgstr "无法打开大对象%u: %s" -#: pg_backup_archiver.c:1384 +#: pg_backup_archiver.c:1376 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "无法打开TOC文件 \"%s\": %m" -#: pg_backup_archiver.c:1424 +#: pg_backup_archiver.c:1404 #, c-format msgid "line ignored: %s" msgstr "忽略的行: %s" -#: pg_backup_archiver.c:1431 +#: pg_backup_archiver.c:1411 #, c-format msgid "could not find entry for ID %d" msgstr "无法为 ID %d 找到记录" -#: pg_backup_archiver.c:1452 pg_backup_directory.c:222 -#: pg_backup_directory.c:587 +#: pg_backup_archiver.c:1434 pg_backup_directory.c:222 +#: pg_backup_directory.c:598 #, c-format msgid "could not close TOC file: %m" msgstr "无法关闭 TOC 文件: %m" -#: pg_backup_archiver.c:1567 pg_backup_custom.c:159 pg_backup_directory.c:332 -#: pg_backup_directory.c:574 pg_backup_directory.c:637 -#: pg_backup_directory.c:656 +#: pg_backup_archiver.c:1548 pg_backup_custom.c:156 pg_backup_directory.c:332 +#: pg_backup_directory.c:585 pg_backup_directory.c:648 +#: pg_backup_directory.c:667 pg_dumpall.c:489 #, c-format msgid "could not open output file \"%s\": %m" msgstr "无法打开输出文件\"%s\": %m" -#: pg_backup_archiver.c:1569 pg_backup_custom.c:165 +#: pg_backup_archiver.c:1550 pg_backup_custom.c:162 #, c-format msgid "could not open output file: %m" msgstr "无法打开输出文件: %m" -#: pg_backup_archiver.c:1662 -#, c-format -msgid "wrote %lu byte of large object data (result = %lu)" -msgid_plural "wrote %lu bytes of large object data (result = %lu)" -msgstr[0] "已经写入了大对象的%lu字节(结果 = %lu)" -msgstr[1] "已经写入了大对象的%lu字节(结果 = %lu)" +#: pg_backup_archiver.c:1643 +msgid "wrote %zu byte of large object data (result = %d)" +msgid_plural "wrote %zu bytes of large object data (result = %d)" +msgstr[0] "已经写入了大对象的%zu字节(结果 = %d)" +msgstr[1] "已经写入了大对象的%zu字节(结果 = %d)" -#: pg_backup_archiver.c:1667 -#, c-format -msgid "could not write to large object (result: %lu, expected: %lu)" -msgstr "无法写入大对象 (结果: %lu, 预期: %lu)" +#: pg_backup_archiver.c:1649 +msgid "could not write to large object: %s" +msgstr "无法写入大型对象: %s" -#: pg_backup_archiver.c:1759 +#: pg_backup_archiver.c:1739 #, c-format msgid "while INITIALIZING:" msgstr "INITIALIZING 时:" -#: pg_backup_archiver.c:1764 +#: pg_backup_archiver.c:1744 #, c-format msgid "while PROCESSING TOC:" msgstr "PROCESSING TOC 时:" -#: pg_backup_archiver.c:1769 +#: pg_backup_archiver.c:1749 #, c-format msgid "while FINALIZING:" msgstr "FINALIZING 时:" -#: pg_backup_archiver.c:1774 +#: pg_backup_archiver.c:1754 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "来自 TOC 记录 %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1850 +#: pg_backup_archiver.c:1830 #, c-format msgid "bad dumpId" msgstr "错误的dumpId号" -#: pg_backup_archiver.c:1871 +#: pg_backup_archiver.c:1851 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "TABLE DATA 项的表dumpId错误" -#: pg_backup_archiver.c:1963 +#: pg_backup_archiver.c:1943 #, c-format msgid "unexpected data offset flag %d" msgstr "意外的数据偏移标志 %d" -#: pg_backup_archiver.c:1976 +#: pg_backup_archiver.c:1956 #, c-format msgid "file offset in dump file is too large" msgstr "在转储文件中的文件偏移量太大" -#: pg_backup_archiver.c:2113 pg_backup_archiver.c:2123 +#: pg_backup_archiver.c:2094 pg_backup_archiver.c:2104 #, c-format msgid "directory name too long: \"%s\"" msgstr "字典名字太长: \"%s\"" -#: pg_backup_archiver.c:2131 +#: pg_backup_archiver.c:2112 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "目录 \"%s\" 看上去不像一个有效的归档 (\"toc.dat\" 不存在)" -#: pg_backup_archiver.c:2139 pg_backup_custom.c:176 pg_backup_custom.c:760 -#: pg_backup_directory.c:207 pg_backup_directory.c:391 +#: pg_backup_archiver.c:2120 pg_backup_custom.c:173 pg_backup_custom.c:807 +#: pg_backup_directory.c:207 pg_backup_directory.c:394 #, c-format msgid "could not open input file \"%s\": %m" msgstr "无法打开输入文件 \"%s\": %m" -#: pg_backup_archiver.c:2146 pg_backup_custom.c:182 +#: pg_backup_archiver.c:2127 pg_backup_custom.c:179 #, c-format msgid "could not open input file: %m" msgstr "无法打开输入文件: %m" -#: pg_backup_archiver.c:2152 +#: pg_backup_archiver.c:2133 #, c-format msgid "could not read input file: %m" msgstr "无法读取输入文件: %m" -#: pg_backup_archiver.c:2154 +#: pg_backup_archiver.c:2135 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "输入文件太短 (读了 %lu, 预期 5)" -#: pg_backup_archiver.c:2239 +#: pg_backup_archiver.c:2167 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "输入文件看起来像是文本格式的dump. 请使用psql." -#: pg_backup_archiver.c:2245 +#: pg_backup_archiver.c:2173 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "输入文件看上去不象有效的归档 (太短?)" -#: pg_backup_archiver.c:2251 +#: pg_backup_archiver.c:2179 #, c-format msgid "input file does not appear to be a valid archive" msgstr "输入文件看上去不象有效的归档" -#: pg_backup_archiver.c:2271 +#: pg_backup_archiver.c:2188 #, c-format msgid "could not close input file: %m" msgstr "无法关闭输入文件: %m" -#: pg_backup_archiver.c:2385 +#: pg_backup_archiver.c:2305 #, c-format msgid "unrecognized file format \"%d\"" msgstr "不可识别的文件格式 \"%d\"" -#: pg_backup_archiver.c:2467 pg_backup_archiver.c:4474 +#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4411 #, c-format msgid "finished item %d %s %s" msgstr "已完成的成员%d %s %s" -#: pg_backup_archiver.c:2471 pg_backup_archiver.c:4487 +#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4424 #, c-format msgid "worker process failed: exit code %d" msgstr "子进程已退出, 退出码为 %d" -#: pg_backup_archiver.c:2591 +#: pg_backup_archiver.c:2511 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "记录 ID %d 超出范围 - 可能是损坏了的 TOC" -#: pg_backup_archiver.c:2658 +#: pg_backup_archiver.c:2578 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "不再支持使用OID还原表" -#: pg_backup_archiver.c:2740 +#: pg_backup_archiver.c:2660 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "未知编码: \"%s\"" -#: pg_backup_archiver.c:2745 +#: pg_backup_archiver.c:2665 #, c-format msgid "invalid ENCODING item: %s" msgstr "无效的ENCODING成员:%s" -#: pg_backup_archiver.c:2763 +#: pg_backup_archiver.c:2683 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "无效的STDSTRINGS成员:%s" -#: pg_backup_archiver.c:2788 +#: pg_backup_archiver.c:2708 #, c-format msgid "schema \"%s\" not found" msgstr "模式\"%s\"没有找到" -#: pg_backup_archiver.c:2795 +#: pg_backup_archiver.c:2715 #, c-format msgid "table \"%s\" not found" msgstr "表\"%s\"没有找到" -#: pg_backup_archiver.c:2802 +#: pg_backup_archiver.c:2722 #, c-format msgid "index \"%s\" not found" msgstr "索引\"%s\"没有找到" -#: pg_backup_archiver.c:2809 +#: pg_backup_archiver.c:2729 #, c-format msgid "function \"%s\" not found" msgstr "函数\"%s\"没有找到" -#: pg_backup_archiver.c:2816 +#: pg_backup_archiver.c:2736 #, c-format msgid "trigger \"%s\" not found" msgstr "触发器\"%s\"没有找到" -#: pg_backup_archiver.c:3195 +#: pg_backup_archiver.c:3128 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "无法设置会话用户为 \"%s\": %s" -#: pg_backup_archiver.c:3532 pg_backup_archiver.c:3690 +#: pg_backup_archiver.c:3260 +msgid "could not set search_path to \"%s\": %s" +msgstr "无法将search_path设置为\"%s\": %s" + +#: pg_backup_archiver.c:3322 +msgid "could not set default_tablespace to %s: %s" +msgstr "无法将default_tablespace设置为%s: %s" + +#: pg_backup_archiver.c:3367 +msgid "could not set default_table_access_method: %s" +msgstr "无法统设置default_table_access_method: %s" + +#: pg_backup_archiver.c:3459 pg_backup_archiver.c:3617 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "不知道如何为对象类型\"%s\"设置属主" -#: pg_backup_archiver.c:3794 +#: pg_backup_archiver.c:3720 #, c-format msgid "did not find magic string in file header" msgstr "在文件头中没有找到魔术字串" -#: pg_backup_archiver.c:3807 +#: pg_backup_archiver.c:3734 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "在文件头中有不支持的版本 (%d.%d)" -#: pg_backup_archiver.c:3812 +#: pg_backup_archiver.c:3739 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "整数尺寸 (%lu) 的健全检查失败" -#: pg_backup_archiver.c:3816 +#: pg_backup_archiver.c:3743 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "归档不是在支持更大范围整数的主机上产生的, 有些操作可能失败" -#: pg_backup_archiver.c:3826 +#: pg_backup_archiver.c:3753 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "预期的格式 (%d) 和在文件里找到的格式 (%d) 不同" -#: pg_backup_archiver.c:3842 +#: pg_backup_archiver.c:3768 #, c-format msgid "archive is compressed, but this installation does not support compression -- no data will be available" msgstr "归档是压缩过的, 但是当前安装不支持压缩 -- 数据将不可使用" -#: pg_backup_archiver.c:3860 +#: pg_backup_archiver.c:3802 #, c-format msgid "invalid creation date in header" msgstr "在头中的创建日期无效" -#: pg_backup_archiver.c:3997 +#: pg_backup_archiver.c:3936 #, c-format msgid "processing item %d %s %s" msgstr "正在处理成员%d %s %s" -#: pg_backup_archiver.c:4076 +#: pg_backup_archiver.c:4015 #, c-format msgid "entering main parallel loop" msgstr "正在进入主并行循环" -#: pg_backup_archiver.c:4087 +#: pg_backup_archiver.c:4026 #, c-format msgid "skipping item %d %s %s" msgstr "忽略成员%d %s %s" -#: pg_backup_archiver.c:4096 +#: pg_backup_archiver.c:4035 #, c-format msgid "launching item %d %s %s" msgstr "正在启动成员%d %s %s" -#: pg_backup_archiver.c:4150 +#: pg_backup_archiver.c:4089 #, c-format msgid "finished main parallel loop" msgstr "已完成主并行循环" -#: pg_backup_archiver.c:4188 +#: pg_backup_archiver.c:4125 #, c-format msgid "processing missed item %d %s %s" msgstr "正在处理丢失的成员%d %s %s" -#: pg_backup_archiver.c:4793 +#: pg_backup_archiver.c:4730 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "无法创建表\"%s\" , 这样无法恢复它的数据" -#: pg_backup_custom.c:377 pg_backup_null.c:150 +#: pg_backup_custom.c:376 pg_backup_null.c:147 #, c-format msgid "invalid OID for large object" msgstr "大对象的无效 OID" -#: pg_backup_custom.c:447 -#, c-format -msgid "unrecognized data block type (%d) while searching archive" -msgstr "搜索归档是碰到不识别的数据块类型 (%d)" - -#: pg_backup_custom.c:458 pg_backup_custom.c:818 +#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629 +#: pg_backup_custom.c:865 pg_backup_tar.c:1080 pg_backup_tar.c:1085 #, c-format msgid "error during file seek: %m" msgstr "在文件内定位时出错: %m" -#: pg_backup_custom.c:467 +#: pg_backup_custom.c:478 #, c-format -msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive" -msgstr "在归档中无法找到数据块ID %d -- 这可能是由于不正常的恢复引起的,这种不正常的恢复通常因为在归档中缺少数据偏移量而无法处理" +msgid "data block %d has wrong seek position" +msgstr "数据块%d的寻道位置错误" -#: pg_backup_custom.c:472 +#: pg_backup_custom.c:495 +#, c-format +msgid "unrecognized data block type (%d) while searching archive" +msgstr "搜索归档是碰到不识别的数据块类型 (%d)" + +#: pg_backup_custom.c:517 #, c-format msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file" msgstr "在归档中无法找到数据块ID %d -- 这可能是由于不正常的恢复引起的,这种不正常的恢复通常因为缺少的输入文件而无法处理" -#: pg_backup_custom.c:477 +#: pg_backup_custom.c:522 #, c-format msgid "could not find block ID %d in archive -- possibly corrupt archive" msgstr "无法在归档中找到ID为%d的数据块--这可能是因为归档文件损坏" -#: pg_backup_custom.c:484 +#: pg_backup_custom.c:529 #, c-format msgid "found unexpected block ID (%d) when reading data -- expected %d" msgstr "读取数据时发现意外块 ID (%d) - 预期是 %d" -#: pg_backup_custom.c:498 +#: pg_backup_custom.c:543 #, c-format msgid "unrecognized data block type %d while restoring archive" msgstr "恢复归档时碰到不识别的数据块类型 %d" -#: pg_backup_custom.c:580 +#: pg_backup_custom.c:645 #, c-format msgid "could not read from input file: %m" msgstr "无法从输入档案读取:%m" -#: pg_backup_custom.c:698 pg_backup_custom.c:751 pg_backup_custom.c:891 -#: pg_backup_tar.c:1091 +#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943 +#: pg_backup_tar.c:1083 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "无法在归档文件中确定查找位置: %m" -#: pg_backup_custom.c:715 pg_backup_custom.c:755 +#: pg_backup_custom.c:762 pg_backup_custom.c:802 #, c-format msgid "could not close archive file: %m" msgstr "无法关闭归档文件: %m" -#: pg_backup_custom.c:738 +#: pg_backup_custom.c:785 #, c-format msgid "can only reopen input archives" msgstr "只能重新打开输入归档" -#: pg_backup_custom.c:745 +#: pg_backup_custom.c:792 #, c-format msgid "parallel restore from standard input is not supported" msgstr "不支持从标准输入进行并行恢复" -#: pg_backup_custom.c:747 +#: pg_backup_custom.c:794 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "不支持从不可随机寻址的文件里并行恢复" -#: pg_backup_custom.c:763 +#: pg_backup_custom.c:810 #, c-format msgid "could not set seek position in archive file: %m" msgstr "无法在归档文件中设置查找位置: %m" -#: pg_backup_custom.c:839 +#: pg_backup_custom.c:889 #, c-format msgid "compressor active" msgstr "压缩程序已激活" -#: pg_backup_custom.c:894 -#, c-format -msgid "ftell mismatch with expected position -- ftell used" -msgstr "ftell 和预期位置不匹配 -- 使用 ftell" - -#: pg_backup_db.c:44 +#: pg_backup_db.c:42 #, c-format msgid "could not get server_version from libpq" msgstr "无法从 libpq 获取服务器版本" -#: pg_backup_db.c:55 pg_dumpall.c:1806 +#: pg_backup_db.c:53 pg_dumpall.c:1826 #, c-format msgid "server version: %s; %s version: %s" msgstr "服务器版本: %s; %s 版本: %s" -#: pg_backup_db.c:57 pg_dumpall.c:1808 +#: pg_backup_db.c:55 pg_dumpall.c:1828 #, c-format msgid "aborting because of server version mismatch" msgstr "因为服务器版本不匹配而终止" -#: pg_backup_db.c:140 +#: pg_backup_db.c:124 #, c-format -msgid "connecting to database \"%s\" as user \"%s\"" -msgstr "以用户 \"%2$s\" 的身份联接到数据库 \"%1$s\"" +msgid "already connected to a database" +msgstr "已经与一个数据库联接" -#: pg_backup_db.c:147 pg_backup_db.c:196 pg_backup_db.c:257 pg_backup_db.c:298 -#: pg_dumpall.c:1631 pg_dumpall.c:1744 +#: pg_backup_db.c:132 pg_backup_db.c:182 pg_dumpall.c:1655 pg_dumpall.c:1766 msgid "Password: " msgstr "口令: " -#: pg_backup_db.c:179 -#, c-format -msgid "failed to reconnect to database" -msgstr "与数据库重新联接失败" +#: pg_backup_db.c:174 +msgid "could not connect to database" +msgstr "无法与数据库联接" -#: pg_backup_db.c:184 -#, c-format -msgid "could not reconnect to database: %s" -msgstr "无法与数据库重新联接: %s" +#: pg_backup_db.c:191 +msgid "reconnection failed: %s" +msgstr "重新连接失败: %s" -#: pg_backup_db.c:200 -#, c-format -msgid "connection needs password" -msgstr "在连接时需要输入口令" - -#: pg_backup_db.c:251 -#, c-format -msgid "already connected to a database" -msgstr "已经与一个数据库联接" - -#: pg_backup_db.c:290 -#, c-format -msgid "failed to connect to database" -msgstr "与数据库联接失败" - -#: pg_backup_db.c:306 -#, c-format -msgid "connection to database \"%s\" failed: %s" -msgstr "与数据库 \"%s\" 联接失败: %s" - -#: pg_backup_db.c:378 pg_dumpall.c:1664 +#: pg_backup_db.c:194 pg_backup_db.c:269 pg_dumpall.c:1686 pg_dumpall.c:1776 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:385 pg_dumpall.c:1869 pg_dumpall.c:1892 +#: pg_backup_db.c:276 pg_dumpall.c:1889 pg_dumpall.c:1912 #, c-format msgid "query failed: %s" msgstr "查询失败: %s" -#: pg_backup_db.c:387 pg_dumpall.c:1870 pg_dumpall.c:1893 +#: pg_backup_db.c:278 pg_dumpall.c:1890 pg_dumpall.c:1913 #, c-format msgid "query was: %s" msgstr "查询是: %s" -#: pg_backup_db.c:428 +#: pg_backup_db.c:319 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" msgstr[0] "查询返回了%d条记录,而不是一条记录: %s" msgstr[1] "查询返回了%d条记录,而不是一条记录: %s" -#: pg_backup_db.c:520 pg_backup_db.c:594 pg_backup_db.c:601 +#: pg_backup_db.c:355 +msgid "%s: %sCommand was: %s" +msgstr "%s: %s命令是: %s" + +#: pg_backup_db.c:411 pg_backup_db.c:485 pg_backup_db.c:492 msgid "could not execute query" msgstr "无法执行查询" -#: pg_backup_db.c:573 +#: pg_backup_db.c:464 #, c-format msgid "error returned by PQputCopyData: %s" msgstr "PQputCopyData返回错误: %s" -#: pg_backup_db.c:622 +#: pg_backup_db.c:513 #, c-format msgid "error returned by PQputCopyEnd: %s" msgstr "PQputCopyEnd返回错误: %s" -#: pg_backup_db.c:634 pg_dump.c:1923 +#: pg_backup_db.c:519 +msgid "COPY failed for table \"%s\": %s" +msgstr "复制表\"%s\"失败: %s" + +#: pg_backup_db.c:525 pg_dump.c:2074 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "复制表\"%s\"时出现意外的额外结果" -#: pg_backup_db.c:646 +#: pg_backup_db.c:537 msgid "could not start database transaction" msgstr "无法开始数据库事务" -#: pg_backup_db.c:654 +#: pg_backup_db.c:545 msgid "could not commit database transaction" msgstr "无法提交数据库事务" @@ -1075,48 +1062,47 @@ msgstr "无法关闭目录 \"%s\": %m" msgid "could not create directory \"%s\": %m" msgstr "无法创建目录 \"%s\": %m" -#: pg_backup_directory.c:350 pg_backup_directory.c:488 -#: pg_backup_directory.c:518 +#: pg_backup_directory.c:355 pg_backup_directory.c:496 +#: pg_backup_directory.c:532 #, c-format msgid "could not write to output file: %s" msgstr "无法写到输出文件: %s" -#: pg_backup_directory.c:403 -#, c-format -msgid "could not close data file: %m" -msgstr "无法关闭数据文件: %m" +#: pg_backup_directory.c:406 +msgid "could not close data file \"%s\": %m" +msgstr "无法关闭数据文件\"%s\": %m" -#: pg_backup_directory.c:443 +#: pg_backup_directory.c:446 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "无法为输入: %2$m打开大对象文件\"%1$s\"" -#: pg_backup_directory.c:454 +#: pg_backup_directory.c:457 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "无效行存在于大对象文件\"%s\": \"%s\"" -#: pg_backup_directory.c:463 +#: pg_backup_directory.c:466 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "在读取大对象文件\"%s\"时发生错误" -#: pg_backup_directory.c:467 +#: pg_backup_directory.c:470 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "无法关闭大对象 TOC 文件\"%s\": %m" -#: pg_backup_directory.c:678 +#: pg_backup_directory.c:689 #, c-format msgid "could not write to blobs TOC file" msgstr "无法写入BLOB到大对象TOC文件" -#: pg_backup_directory.c:710 +#: pg_backup_directory.c:721 #, c-format msgid "file name too long: \"%s\"" msgstr "文件名超长: \"%s\"" -#: pg_backup_null.c:75 +#: pg_backup_null.c:74 #, c-format msgid "this format cannot be read" msgstr "无法读取这个格式" @@ -1131,7 +1117,7 @@ msgstr "无法为输出打开TOC文件\"%s\": %m" msgid "could not open TOC file for output: %m" msgstr "无法为输出打开 TOC 文件: %m" -#: pg_backup_tar.c:203 pg_backup_tar.c:358 +#: pg_backup_tar.c:203 pg_backup_tar.c:352 #, c-format msgid "compression is not supported by tar archive format" msgstr "不支持tar归档格式的压缩" @@ -1146,69 +1132,64 @@ msgstr "无法为输入打开TOC文件\"%s\": %m" msgid "could not open TOC file for input: %m" msgstr "无法为输入打开 TOC 文件: %m" -#: pg_backup_tar.c:344 +#: pg_backup_tar.c:338 #, c-format msgid "could not find file \"%s\" in archive" msgstr "无法在归档中找到文件\"%s\"" -#: pg_backup_tar.c:410 +#: pg_backup_tar.c:404 #, c-format msgid "could not generate temporary file name: %m" msgstr "无法生成临时文件名: %m" -#: pg_backup_tar.c:421 +#: pg_backup_tar.c:415 #, c-format msgid "could not open temporary file" msgstr "无法打开临时文件" -#: pg_backup_tar.c:448 +#: pg_backup_tar.c:442 #, c-format msgid "could not close tar member" msgstr "无法关闭 tar 成员" -#: pg_backup_tar.c:571 -#, c-format -msgid "internal error -- neither th nor fh specified in tarReadRaw()\n" -msgstr "内部错误 -- 在 tarReadRaw() 里既未声明 th 也未声明 fh\n" - -#: pg_backup_tar.c:693 +#: pg_backup_tar.c:685 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "意外的COPY语句语法: \"%s\"" -#: pg_backup_tar.c:961 +#: pg_backup_tar.c:952 #, c-format msgid "invalid OID for large object (%u)" msgstr "用于大对象的非法 OID (%u)" -#: pg_backup_tar.c:1106 +#: pg_backup_tar.c:1099 #, c-format msgid "could not close temporary file: %m" msgstr "无法关闭临时文件: %m" -#: pg_backup_tar.c:1115 +#: pg_backup_tar.c:1108 #, c-format msgid "actual file length (%s) does not match expected (%s)" msgstr "实际文件长度 (%s) 不匹配预期的长度 (%s)" -#: pg_backup_tar.c:1172 pg_backup_tar.c:1202 +#: pg_backup_tar.c:1165 pg_backup_tar.c:1196 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "无法在tar归档中为文件\"%s\"找到标题头" -#: pg_backup_tar.c:1190 +#: pg_backup_tar.c:1183 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "这个归档格式里不支持不按照顺序转储数据: 要求\"%s\" ,但它在归档文件里位于\"%s\"前面." -#: pg_backup_tar.c:1235 +#: pg_backup_tar.c:1230 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "找到未完成的tar文件头(%lu个字节)" msgstr[1] "找到未完成的tar文件头(%lu个字节)" -#: pg_backup_tar.c:1286 +#: pg_backup_tar.c:1281 #, c-format msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s" msgstr "在文件 %1$s 的位置 %4$s 发现崩溃的 tar 头(预计在 %2$d, 计算出来在 %3$d)" @@ -1218,75 +1199,83 @@ msgstr "在文件 %1$s 的位置 %4$s 发现崩溃的 tar 头(预计在 %2$d, msgid "unrecognized section name: \"%s\"" msgstr "无法识别的节名称: \"%s\"" -#: pg_backup_utils.c:55 pg_dump.c:611 pg_dump.c:628 pg_dumpall.c:338 -#: pg_dumpall.c:348 pg_dumpall.c:357 pg_dumpall.c:366 pg_dumpall.c:374 -#: pg_dumpall.c:388 pg_dumpall.c:464 pg_restore.c:288 pg_restore.c:304 -#: pg_restore.c:322 +#: pg_backup_utils.c:55 pg_dump.c:622 pg_dump.c:639 pg_dumpall.c:341 +#: pg_dumpall.c:351 pg_dumpall.c:360 pg_dumpall.c:369 pg_dumpall.c:377 +#: pg_dumpall.c:391 pg_dumpall.c:469 pg_restore.c:284 pg_restore.c:300 +#: pg_restore.c:318 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "输入 \"%s --help\" 获取更多的信息.\n" +msgstr "请用 \"%s --help\" 获取更多的信息.\n" #: pg_backup_utils.c:68 #, c-format msgid "out of on_exit_nicely slots" msgstr "超出on_exit_nicely槽" -#: pg_dump.c:542 +#: pg_dump.c:548 #, c-format msgid "compression level must be in range 0..9" msgstr "压缩级别必须位于0..9的范围内" -#: pg_dump.c:580 +#: pg_dump.c:586 #, c-format msgid "extra_float_digits must be in range -15..3" msgstr "extra_float_digits必须在-15到3之间" -#: pg_dump.c:603 +#: pg_dump.c:609 #, c-format msgid "rows-per-insert must be in range %d..%d" msgstr "rows-per-insert必须位于%d..%d的范围内" -#: pg_dump.c:626 pg_dumpall.c:346 pg_restore.c:302 +#: pg_dump.c:637 pg_dumpall.c:349 pg_restore.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "命令行参数太多 (第一个是 \"%s\")" -#: pg_dump.c:647 pg_restore.c:331 +#: pg_dump.c:658 pg_restore.c:327 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "选项 -s/--schema-only和-a/--data-only 不能同时使用" -#: pg_dump.c:653 pg_restore.c:337 +#: pg_dump.c:663 +msgid "options -s/--schema-only and --include-foreign-data cannot be used together" +msgstr "选项 -s/--schema-only和--include-foreign-data不能同时使用" + +#: pg_dump.c:666 +#, c-format +msgid "option --include-foreign-data is not supported with parallel backup" +msgstr "并行备份不支持选项--include-foreign-data" + +#: pg_dump.c:670 pg_restore.c:333 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "选项 -c/--clean和 -a/--data-only不能同时使用" -#: pg_dump.c:658 pg_dumpall.c:381 pg_restore.c:386 +#: pg_dump.c:675 pg_dumpall.c:384 pg_restore.c:382 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "选项 --if-exists 需要选项 -c/ --clean" -#: pg_dump.c:665 -#, c-format -msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert or --column-inserts" -msgstr "选项--on-conflict-do-nothing需要选项--inserts, --rows-per-insert 或者 --column-inserts" +#: pg_dump.c:682 +msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" +msgstr "选项---on-conflict-do-nothing需要选项--inserts, --rows-per-insert 或者 --column-inserts" -#: pg_dump.c:687 +#: pg_dump.c:704 #, c-format msgid "requested compression not available in this installation -- archive will be uncompressed" msgstr "所要求的压缩无法在本次安装中获取 -- 归档将不被压缩" -#: pg_dump.c:708 pg_restore.c:353 +#: pg_dump.c:725 pg_restore.c:349 #, c-format msgid "invalid number of parallel jobs" msgstr "无效的并行工作数" -#: pg_dump.c:712 +#: pg_dump.c:729 #, c-format msgid "parallel backup only supported by the directory format" msgstr "并行备份只被目录格式支持" -#: pg_dump.c:767 +#: pg_dump.c:784 #, c-format msgid "" "Synchronized snapshots are not supported by this server version.\n" @@ -1297,27 +1286,31 @@ msgstr "" "如果不需要同步快照功能,\n" "可以带参数 --no-synchronized-snapshots运行" -#: pg_dump.c:773 +#: pg_dump.c:790 #, c-format msgid "Exported snapshots are not supported by this server version." msgstr "在这个版本的服务器中不支持导出的快照." -#: pg_dump.c:785 +#: pg_dump.c:802 #, c-format msgid "last built-in OID is %u" msgstr "最后的内置 OID 是 %u" -#: pg_dump.c:794 +#: pg_dump.c:811 #, c-format msgid "no matching schemas were found" msgstr "没有找到符合的模式" -#: pg_dump.c:808 +#: pg_dump.c:825 #, c-format msgid "no matching tables were found" msgstr "没有找到符合的表" -#: pg_dump.c:980 +#: pg_dump.c:847 +msgid "no matching extensions were found" +msgstr "没有找到符合的扩展名" + +#: pg_dump.c:1017 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1326,17 +1319,17 @@ msgstr "" "%s 把一个数据库转储为纯文本文件或者是其它格式.\n" "\n" -#: pg_dump.c:981 pg_dumpall.c:617 pg_restore.c:466 +#: pg_dump.c:1018 pg_dumpall.c:622 pg_restore.c:462 #, c-format msgid "Usage:\n" -msgstr "用法:\n" +msgstr "使用方法:\n" -#: pg_dump.c:982 +#: pg_dump.c:1019 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [选项]... [数据库名字]\n" -#: pg_dump.c:984 pg_dumpall.c:620 pg_restore.c:469 +#: pg_dump.c:1021 pg_dumpall.c:625 pg_restore.c:465 #, c-format msgid "" "\n" @@ -1345,12 +1338,12 @@ msgstr "" "\n" "一般选项:\n" -#: pg_dump.c:985 +#: pg_dump.c:1022 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=FILENAME 输出文件或目录名\n" -#: pg_dump.c:986 +#: pg_dump.c:1023 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1359,42 +1352,42 @@ msgstr "" " -F, --format=c|d|t|p 输出文件格式 (定制, 目录, tar\n" " 明文 (默认值))\n" -#: pg_dump.c:988 +#: pg_dump.c:1025 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM 执行多个并行任务进行备份转储工作\n" -#: pg_dump.c:989 pg_dumpall.c:622 +#: pg_dump.c:1026 pg_dumpall.c:627 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose 详细模式\n" -#: pg_dump.c:990 pg_dumpall.c:623 +#: pg_dump.c:1027 pg_dumpall.c:628 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version 输出版本信息,然后退出\n" +msgstr " -V, --version 输出版本信息, 然后退出\n" -#: pg_dump.c:991 +#: pg_dump.c:1028 #, c-format msgid " -Z, --compress=0-9 compression level for compressed formats\n" msgstr " -Z, --compress=0-9 被压缩格式的压缩级别\n" -#: pg_dump.c:992 pg_dumpall.c:624 +#: pg_dump.c:1029 pg_dumpall.c:629 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr " --lock-wait-timeout=TIMEOUT 在等待表锁超时后操作失败\n" -#: pg_dump.c:993 pg_dumpall.c:652 +#: pg_dump.c:1030 pg_dumpall.c:656 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync 不用等待变化安全写入磁盘\n" -#: pg_dump.c:994 pg_dumpall.c:625 +#: pg_dump.c:1031 pg_dumpall.c:630 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 显示此帮助, 然后退出\n" -#: pg_dump.c:996 pg_dumpall.c:626 +#: pg_dump.c:1033 pg_dumpall.c:631 #, c-format msgid "" "\n" @@ -1403,203 +1396,217 @@ msgstr "" "\n" "控制输出内容选项:\n" -#: pg_dump.c:997 pg_dumpall.c:627 +#: pg_dump.c:1034 pg_dumpall.c:632 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only 只转储数据,不包括模式\n" -#: pg_dump.c:998 +#: pg_dump.c:1035 #, c-format msgid " -b, --blobs include large objects in dump\n" msgstr " -b, --blobs 在转储中包括大对象\n" -#: pg_dump.c:999 +#: pg_dump.c:1036 #, c-format msgid " -B, --no-blobs exclude large objects in dump\n" msgstr " -B, --no-blobs 排除转储中的大型对象\n" -#: pg_dump.c:1000 pg_restore.c:480 +#: pg_dump.c:1037 pg_restore.c:476 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr " -c, --clean 在重新创建之前,先清除(删除)数据库对象\n" -#: pg_dump.c:1001 +#: pg_dump.c:1038 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr " -C, --create 在转储中包括命令,以便创建数据库\n" -#: pg_dump.c:1002 pg_dumpall.c:629 +#: pg_dump.c:1039 +msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" +msgstr " -e, --extension=PATTERN 仅转储指定的扩展名\n" + +#: pg_dump.c:1040 pg_dumpall.c:634 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=ENCODING 转储以ENCODING形式编码的数据\n" -#: pg_dump.c:1003 -#, c-format -msgid " -n, --schema=SCHEMA dump the named schema(s) only\n" -msgstr " -n, --schema=SCHEMA 只转储指定名称的模式\n" +#: pg_dump.c:1041 +msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" +msgstr " -n, --schema=PATTERN 只转储指定的模式\n" -#: pg_dump.c:1004 -#, c-format -msgid " -N, --exclude-schema=SCHEMA do NOT dump the named schema(s)\n" -msgstr " -N, --exclude-schema=SCHEMA 不转储已命名的模式\n" +#: pg_dump.c:1042 +msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" +msgstr " -N, --exclude-schema=PATTERN 不转储指定的模式\n" -#: pg_dump.c:1005 +#: pg_dump.c:1043 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" " plain-text format\n" msgstr " -O, --no-owner 在明文格式中, 忽略恢复对象所属者\n" -#: pg_dump.c:1007 pg_dumpall.c:634 +#: pg_dump.c:1045 pg_dumpall.c:638 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only 只转储模式, 不包括数据\n" -#: pg_dump.c:1008 +#: pg_dump.c:1046 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr " -S, --superuser=NAME 在明文格式中使用指定的超级用户名\n" -#: pg_dump.c:1009 -#, c-format -msgid " -t, --table=TABLE dump the named table(s) only\n" -msgstr " -t, --table=TABLE 只转储指定名称的表\n" +#: pg_dump.c:1047 +msgid " -t, --table=PATTERN dump the specified table(s) only\n" +msgstr " -t, --table=PATTERN 只转储指定的表\n" -#: pg_dump.c:1010 -#, c-format -msgid " -T, --exclude-table=TABLE do NOT dump the named table(s)\n" -msgstr " -T, --exclude-table=TABLE 不转储指定名称的表\n" +#: pg_dump.c:1048 +msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" +msgstr " -T, --exclude-table=PATTERN 不转储指定的表\n" -#: pg_dump.c:1011 pg_dumpall.c:637 +#: pg_dump.c:1049 pg_dumpall.c:641 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges 不要转储权限 (grant/revoke)\n" -#: pg_dump.c:1012 pg_dumpall.c:638 +#: pg_dump.c:1050 pg_dumpall.c:642 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade 只能由升级工具使用\n" -#: pg_dump.c:1013 pg_dumpall.c:639 +#: pg_dump.c:1051 pg_dumpall.c:643 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr " --column-inserts 以带有列名的INSERT命令形式转储数据\n" -#: pg_dump.c:1014 pg_dumpall.c:640 +#: pg_dump.c:1052 pg_dumpall.c:644 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr " --disable-dollar-quoting 取消美元 (符号) 引号, 使用 SQL 标准引号\n" -#: pg_dump.c:1015 pg_dumpall.c:641 pg_restore.c:497 +#: pg_dump.c:1053 pg_dumpall.c:645 pg_restore.c:493 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr " --disable-triggers 在只恢复数据的过程中禁用触发器\n" -#: pg_dump.c:1016 +#: pg_dump.c:1054 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" " access to)\n" msgstr " --enable-row-security 启用行安全性(只转储用户能够访问的内容)\n" -#: pg_dump.c:1018 -#, c-format -msgid " --exclude-table-data=TABLE do NOT dump data for the named table(s)\n" -msgstr " --exclude-table-data=TABLE 不转储指定名称的表中的数据\n" +#: pg_dump.c:1056 +msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" +msgstr " --exclude-table-data=PATTERN 不转储指定的表中的数据\n" -#: pg_dump.c:1019 pg_dumpall.c:643 +#: pg_dump.c:1057 pg_dumpall.c:647 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr " --extra-float-digits=NUM 覆盖extra_float_digits的默认设置\n" -#: pg_dump.c:1020 pg_dumpall.c:644 pg_restore.c:499 +#: pg_dump.c:1058 pg_dumpall.c:648 pg_restore.c:495 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists 当删除对象时使用IF EXISTS\n" -#: pg_dump.c:1021 pg_dumpall.c:645 +#: pg_dump.c:1059 +#, c-format +msgid "" +" --include-foreign-data=PATTERN\n" +" include data of foreign tables on foreign\n" +" servers matching PATTERN\n" +msgstr "" +" --include-foreign-data=PATTERN\n" +" 包含外部服务器上与模式匹配的\n" +" 外部表的数据\n" + +#: pg_dump.c:1062 pg_dumpall.c:649 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr " --inserts 以INSERT命令,而不是COPY命令的形式转储数据\n" -#: pg_dump.c:1022 pg_dumpall.c:646 +#: pg_dump.c:1063 pg_dumpall.c:650 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root 通过根表加载分区\n" -#: pg_dump.c:1023 pg_dumpall.c:647 +#: pg_dump.c:1064 pg_dumpall.c:651 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments 不转储注释\n" -#: pg_dump.c:1024 pg_dumpall.c:648 +#: pg_dump.c:1065 pg_dumpall.c:652 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications 不转储发布\n" -#: pg_dump.c:1025 pg_dumpall.c:650 +#: pg_dump.c:1066 pg_dumpall.c:654 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr " --no-security-labels 不转储安全标签的分配\n" -#: pg_dump.c:1026 pg_dumpall.c:651 +#: pg_dump.c:1067 pg_dumpall.c:655 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions 不转储订阅\n" -#: pg_dump.c:1027 +#: pg_dump.c:1068 #, c-format msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n" msgstr " --no-synchronized-snapshots 在并行工作集中不使用同步快照\n" -#: pg_dump.c:1028 pg_dumpall.c:653 +#: pg_dump.c:1069 pg_dumpall.c:657 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces 不转储表空间分配信息\n" -#: pg_dump.c:1029 pg_dumpall.c:654 +#: pg_dump.c:1070 pg_dumpall.c:658 +msgid " --no-toast-compression do not dump TOAST compression methods\n" +msgstr " --no-toast-compression 不转储TOAST压缩方法\n" + +#: pg_dump.c:1071 pg_dumpall.c:659 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data 不转储没有日志的表数据\n" -#: pg_dump.c:1030 pg_dumpall.c:655 +#: pg_dump.c:1072 pg_dumpall.c:660 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" msgstr " --on-conflict-do-nothing 将ON CONFLICT DO NOTHING添加到INSERT命令\n" -#: pg_dump.c:1031 pg_dumpall.c:656 +#: pg_dump.c:1073 pg_dumpall.c:661 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr " --quote-all-identifiers 所有标识符加引号,即使不是关键字\n" -#: pg_dump.c:1032 +#: pg_dump.c:1074 pg_dumpall.c:662 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=NROWS 每个插入的行数;意味着--inserts\n" -#: pg_dump.c:1033 +#: pg_dump.c:1075 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr " --section=SECTION 备份命名的节 (数据前, 数据, 及 数据后)\n" -#: pg_dump.c:1034 +#: pg_dump.c:1076 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr " --serializable-deferrable 等到备份可以无异常运行\n" -#: pg_dump.c:1035 +#: pg_dump.c:1077 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT 为转储使用给定的快照\n" -#: pg_dump.c:1036 pg_restore.c:508 +#: pg_dump.c:1078 pg_restore.c:504 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" " match at least one entity each\n" msgstr " --strict-names 要求每个表和(或)schema包括模式以匹配至少一个实体\n" -#: pg_dump.c:1038 pg_dumpall.c:657 pg_restore.c:510 +#: pg_dump.c:1080 pg_dumpall.c:663 pg_restore.c:506 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1610,7 +1617,7 @@ msgstr "" " 使用 SESSION AUTHORIZATION 命令代替\n" " ALTER OWNER 命令来设置所有权\n" -#: pg_dump.c:1042 pg_dumpall.c:661 pg_restore.c:514 +#: pg_dump.c:1084 pg_dumpall.c:667 pg_restore.c:510 #, c-format msgid "" "\n" @@ -1619,42 +1626,42 @@ msgstr "" "\n" "联接选项:\n" -#: pg_dump.c:1043 +#: pg_dump.c:1085 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAME 对数据库 DBNAME备份\n" -#: pg_dump.c:1044 pg_dumpall.c:663 pg_restore.c:515 +#: pg_dump.c:1086 pg_dumpall.c:669 pg_restore.c:511 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=主机名 数据库服务器的主机名或套接字目录\n" -#: pg_dump.c:1045 pg_dumpall.c:665 pg_restore.c:516 +#: pg_dump.c:1087 pg_dumpall.c:671 pg_restore.c:512 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=端口号 数据库服务器的端口号\n" -#: pg_dump.c:1046 pg_dumpall.c:666 pg_restore.c:517 +#: pg_dump.c:1088 pg_dumpall.c:672 pg_restore.c:513 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=名字 以指定的数据库用户联接\n" -#: pg_dump.c:1047 pg_dumpall.c:667 pg_restore.c:518 +#: pg_dump.c:1089 pg_dumpall.c:673 pg_restore.c:514 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password 永远不提示输入口令\n" -#: pg_dump.c:1048 pg_dumpall.c:668 pg_restore.c:519 +#: pg_dump.c:1090 pg_dumpall.c:674 pg_restore.c:515 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password 强制口令提示 (自动)\n" -#: pg_dump.c:1049 pg_dumpall.c:669 +#: pg_dump.c:1091 pg_dumpall.c:675 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROLENAME 在转储前运行SET ROLE\n" -#: pg_dump.c:1051 +#: pg_dump.c:1093 #, c-format msgid "" "\n" @@ -1667,17 +1674,22 @@ msgstr "" "的数值.\n" "\n" -#: pg_dump.c:1053 pg_dumpall.c:673 pg_restore.c:526 +#: pg_dump.c:1095 pg_dumpall.c:679 pg_restore.c:522 +#, c-format +msgid "Report bugs to <%s>.\n" +msgstr "臭虫报告至<%s>.\n" + +#: pg_dump.c:1096 pg_dumpall.c:680 pg_restore.c:523 #, c-format -msgid "Report bugs to .\n" -msgstr "报告错误至 .\n" +msgid "%s home page: <%s>\n" +msgstr "%s 主页: <%s>\n" -#: pg_dump.c:1072 pg_dumpall.c:499 +#: pg_dump.c:1115 pg_dumpall.c:504 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "声明了无效的输出格式 \"%s\"" -#: pg_dump.c:1217 +#: pg_dump.c:1261 #, c-format msgid "" "Synchronized snapshots on standby servers are not supported by this server version.\n" @@ -1688,543 +1700,567 @@ msgstr "" "如果不需要同步快照功能,\n" "可以带参数 --no-synchronized-snapshots运行." -#: pg_dump.c:1286 +#: pg_dump.c:1330 #, c-format msgid "invalid output format \"%s\" specified" msgstr "声明了非法的输出格式 \"%s\"" -#: pg_dump.c:1324 +#: pg_dump.c:1368 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "没有为\"%s\"模式找到匹配的schemas" -#: pg_dump.c:1389 +#: pg_dump.c:1415 +msgid "no matching extensions were found for pattern \"%s\"" +msgstr "没有为\"%s\"模式找到匹配的扩展" + +#: pg_dump.c:1462 +msgid "no matching foreign servers were found for pattern \"%s\"" +msgstr "没有为\"%s\"模式找到匹配的外部服务器" + +#: pg_dump.c:1525 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "没有为\"%s\"模式找到匹配的表" -#: pg_dump.c:1803 +#: pg_dump.c:1948 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "正在转储表\"%s.%s\"的内容" -#: pg_dump.c:1904 +#: pg_dump.c:2055 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "转储表 \"%s\" 的内容的 SQL 命令失败: PQendcopy() 失败." -#: pg_dump.c:1905 pg_dump.c:1915 +#: pg_dump.c:2056 pg_dump.c:2066 #, c-format msgid "Error message from server: %s" msgstr "来自服务器的错误信息: %s" -#: pg_dump.c:1906 pg_dump.c:1916 +#: pg_dump.c:2057 pg_dump.c:2067 #, c-format msgid "The command was: %s" msgstr "命令是: %s" -#: pg_dump.c:1914 +#: pg_dump.c:2065 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "转储表 \"%s\" 的内容失败: PQgetResult() 失败." -#: pg_dump.c:2665 +#: pg_dump.c:2825 #, c-format msgid "saving database definition" msgstr "保存数据库定义" -#: pg_dump.c:3129 +#: pg_dump.c:3297 #, c-format msgid "saving encoding = %s" msgstr "正在保存encoding = %s" -#: pg_dump.c:3154 +#: pg_dump.c:3322 #, c-format msgid "saving standard_conforming_strings = %s" msgstr "正在保存standard_conforming_strings = %s" -#: pg_dump.c:3193 +#: pg_dump.c:3361 #, c-format msgid "could not parse result of current_schemas()" msgstr "无法解析current_schemas()的结果" -#: pg_dump.c:3212 +#: pg_dump.c:3380 #, c-format msgid "saving search_path = %s" msgstr "正在保存search_path = %s" -#: pg_dump.c:3252 +#: pg_dump.c:3420 #, c-format msgid "reading large objects" msgstr "正在读取大对象" -#: pg_dump.c:3434 +#: pg_dump.c:3602 #, c-format msgid "saving large objects" msgstr "保存大对象" -#: pg_dump.c:3480 +#: pg_dump.c:3648 #, c-format msgid "error reading large object %u: %s" msgstr "在读取大对象时发生错误%u: %s" -#: pg_dump.c:3532 +#: pg_dump.c:3700 #, c-format msgid "reading row security enabled for table \"%s.%s\"" msgstr "为表\"%s.%s\"读取行安全性启用状态" -#: pg_dump.c:3563 +#: pg_dump.c:3731 #, c-format msgid "reading policies for table \"%s.%s\"" msgstr "为表\"%s.%s\"读取策略" -#: pg_dump.c:3713 +#: pg_dump.c:3883 #, c-format msgid "unexpected policy command type: %c" msgstr "意外的策略命令类型:%c" -#: pg_dump.c:3840 +#: pg_dump.c:4037 #, c-format msgid "owner of publication \"%s\" appears to be invalid" msgstr "发行 \"%s\" 的所有者非法" -#: pg_dump.c:3977 -#, c-format -msgid "reading publication membership for table \"%s.%s\"" -msgstr "为表\"%s.%s\"读取发行会员资格" - -#: pg_dump.c:4120 +#: pg_dump.c:4329 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "订阅未转储,因为当前用户不是超级用户" -#: pg_dump.c:4174 +#: pg_dump.c:4400 #, c-format msgid "owner of subscription \"%s\" appears to be invalid" msgstr "函数订阅\"%s\" 的所有者非法" -#: pg_dump.c:4218 +#: pg_dump.c:4443 #, c-format msgid "could not parse subpublications array" msgstr "无法解析子发行数组" -#: pg_dump.c:4490 +#: pg_dump.c:4801 #, c-format msgid "could not find parent extension for %s %s" msgstr "无法找到父扩展%s %s" -#: pg_dump.c:4622 +#: pg_dump.c:4933 #, c-format msgid "owner of schema \"%s\" appears to be invalid" msgstr "模式 \"%s\" 的所有者非法" -#: pg_dump.c:4645 +#: pg_dump.c:4956 #, c-format msgid "schema with OID %u does not exist" msgstr "OID 为 %u 的模式不存在" -#: pg_dump.c:4970 +#: pg_dump.c:5285 #, c-format msgid "owner of data type \"%s\" appears to be invalid" msgstr "数据类型 \"%s\" 的所有者非法" -#: pg_dump.c:5055 +#: pg_dump.c:5369 #, c-format msgid "owner of operator \"%s\" appears to be invalid" msgstr "操作符 \"%s\" 的所有者非法" -#: pg_dump.c:5357 +#: pg_dump.c:5668 #, c-format msgid "owner of operator class \"%s\" appears to be invalid" msgstr "操作符表 \"%s\" 无效" -#: pg_dump.c:5441 +#: pg_dump.c:5751 #, c-format msgid "owner of operator family \"%s\" appears to be invalid" msgstr "操作符 \"%s\" 的所有者无效" -#: pg_dump.c:5610 +#: pg_dump.c:5919 #, c-format msgid "owner of aggregate function \"%s\" appears to be invalid" msgstr "聚集函数 \"%s\" 的所有者非法" -#: pg_dump.c:5870 +#: pg_dump.c:6178 #, c-format msgid "owner of function \"%s\" appears to be invalid" msgstr "函数 \"%s\" 的所有者非法" -#: pg_dump.c:6666 +#: pg_dump.c:7005 #, c-format msgid "owner of table \"%s\" appears to be invalid" msgstr "数据表 \"%s\" 的所有者非法" -#: pg_dump.c:6708 pg_dump.c:17058 +#: pg_dump.c:7047 pg_dump.c:17485 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "健全检查失败,序列OID %2$u 的源表 OID%1$u 未找到" -#: pg_dump.c:6852 +#: pg_dump.c:7186 #, c-format msgid "reading indexes for table \"%s.%s\"" msgstr "为表\"%s.%s\"读取索引" -#: pg_dump.c:7253 +#: pg_dump.c:7600 #, c-format msgid "reading foreign key constraints for table \"%s.%s\"" msgstr "为表\"%s.%s\"读取外键约束" -#: pg_dump.c:7472 +#: pg_dump.c:7879 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "健全检查失败,pg_rewrite项OID %2$u 的源表 OID%1$u 未找到" -#: pg_dump.c:7555 +#: pg_dump.c:7963 #, c-format msgid "reading triggers for table \"%s.%s\"" msgstr "为表\"%s.%s\"读取触发器" -#: pg_dump.c:7688 +#: pg_dump.c:8144 #, c-format msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" msgstr "对在表 \"%2$s\" 上的外键触发器 \"%1$s\" 上的查询生成了 NULL 个引用表(表的 OID 是: %3$u)" -#: pg_dump.c:8243 +#: pg_dump.c:8694 #, c-format msgid "finding the columns and types of table \"%s.%s\"" msgstr "正在查找表\"%s.%s\"的列和类型" -#: pg_dump.c:8379 +#: pg_dump.c:8818 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "在表 \"%s\" 中的字段个数是无效的" -#: pg_dump.c:8416 +#: pg_dump.c:8857 #, c-format msgid "finding default expressions of table \"%s.%s\"" msgstr "正在查找表\"%s.%s\"的默认表达式" -#: pg_dump.c:8438 +#: pg_dump.c:8879 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "表 \"%2$s\" 的无效 adnum 值 %1$d" -#: pg_dump.c:8503 +#: pg_dump.c:8972 #, c-format msgid "finding check constraints for table \"%s.%s\"" msgstr "正在查找表\"%s.%s\"的检查约束" -#: pg_dump.c:8552 +#: pg_dump.c:9021 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "在表\"%2$s\"上期望有%1$d个检查约束,但是找到了%3$d个" msgstr[1] "在表\"%2$s\"上期望有%1$d个检查约束,但是找到了%3$d个" -#: pg_dump.c:8556 +#: pg_dump.c:9025 #, c-format msgid "(The system catalogs might be corrupted.)" msgstr "(系统表可能损坏了.)" -#: pg_dump.c:10132 +#: pg_dump.c:10610 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "数据类型 \"%s\" 的所有者看起来无效" -#: pg_dump.c:11486 +#: pg_dump.c:11962 #, c-format msgid "bogus value in proargmodes array" msgstr "无法分析 proargmodes 数组" -#: pg_dump.c:11858 +#: pg_dump.c:12269 #, c-format msgid "could not parse proallargtypes array" msgstr "无法分析 proallargtypes 数组" -#: pg_dump.c:11874 +#: pg_dump.c:12285 #, c-format msgid "could not parse proargmodes array" msgstr "无法分析 proargmodes 数组" -#: pg_dump.c:11888 +#: pg_dump.c:12299 #, c-format msgid "could not parse proargnames array" msgstr "无法分析 proargnames 数组" -#: pg_dump.c:11899 +#: pg_dump.c:12309 #, c-format msgid "could not parse proconfig array" msgstr "无法解析 proconfig 数组" -#: pg_dump.c:11979 +#: pg_dump.c:12389 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "函数 \"%s\" 的意外正向易失值" -#: pg_dump.c:12029 pg_dump.c:14081 +#: pg_dump.c:12439 pg_dump.c:14390 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "函数\"%s\"的proparallel值无法识别" -#: pg_dump.c:12162 pg_dump.c:12271 pg_dump.c:12278 +#: pg_dump.c:12578 pg_dump.c:12687 pg_dump.c:12694 #, c-format msgid "could not find function definition for function with OID %u" msgstr "找不到带有OID %u的函数的函数定义" -#: pg_dump.c:12201 +#: pg_dump.c:12617 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "在pg_cast.castfunc或者pg_cast.castmethod字段中的是假值" -#: pg_dump.c:12204 +#: pg_dump.c:12620 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "在pg_cast.castmethod字段中的是假值" -#: pg_dump.c:12297 +#: pg_dump.c:12713 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "臆造的转换定义,至少trffromsql和trftosql之一应该为非零" -#: pg_dump.c:12314 +#: pg_dump.c:12730 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "在pg_transform.trffromsql域中的是臆造值" -#: pg_dump.c:12335 +#: pg_dump.c:12751 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "在pg_transform.trftosql域中的是臆造值" -#: pg_dump.c:12651 +#: pg_dump.c:12903 +msgid "postfix operators are not supported anymore (operator \"%s\")" +msgstr "运不再支持后缀运算符(运算符\"%s\")" + +#: pg_dump.c:13073 #, c-format msgid "could not find operator with OID %s" msgstr "未找到 OID 为 %s 的操作符" -#: pg_dump.c:12719 +#: pg_dump.c:13141 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "访问方法\"%2$s\"的类型\"%1$c\"无效" -#: pg_dump.c:13473 -#, c-format -msgid "unrecognized collation provider: %s\n" -msgstr "无法识别的排序规则提供程序:%s\n" - -#: pg_dump.c:13945 +#: pg_dump.c:13895 #, c-format -msgid "aggregate function %s could not be dumped correctly for this database version; ignored" -msgstr "无法为此版本的数据库正确转储聚集函数 \"%s\"; 忽略" +msgid "unrecognized collation provider: %s" +msgstr "无法识别的排序规则提供程序: %s" -#: pg_dump.c:14000 +#: pg_dump.c:14309 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "无法识别的aggfinalmodify聚合值 \"%s\"" -#: pg_dump.c:14056 +#: pg_dump.c:14365 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "无法识别的aggmfinalmodify聚合值 \"%s\"" -#: pg_dump.c:14778 +#: pg_dump.c:15087 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "缺省权限中存在未知对象类型: %d" -#: pg_dump.c:14796 +#: pg_dump.c:15105 #, c-format msgid "could not parse default ACL list (%s)" msgstr "无法解析缺省ACL列表(%s)" -#: pg_dump.c:14876 +#: pg_dump.c:15190 #, c-format msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)" msgstr "无法为对象\"%3$s\" (%4$s)解析初始GRANT ACL列表 (%1$s) 或者初始REVOKE ACL列表 (%2$s) " -#: pg_dump.c:14884 +#: pg_dump.c:15198 #, c-format msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)" msgstr "无法为对象\"%3$s\" (%4$s)解析GRANT ACL列表 (%1$s) 或者REVOKE ACL列表 (%2$s)" -#: pg_dump.c:15383 +#: pg_dump.c:15713 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "获取视图 \"%s\" 定义的查询没有返回数据" -#: pg_dump.c:15386 +#: pg_dump.c:15716 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "获取视图 \"%s\" 定义的查询返回超过一个定义" -#: pg_dump.c:15393 +#: pg_dump.c:15723 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "视图 \"%s\" 的定义是空的(零长)" -#: pg_dump.c:15475 +#: pg_dump.c:15807 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "不再支持 WITH OIDS (表\"%s\")" -#: pg_dump.c:15602 -#, c-format -msgid "invalid number of parents %d for table \"%s\"" -msgstr "表 \"%2$s\" 的无效parents值 %1$d" - -#: pg_dump.c:16289 +#: pg_dump.c:16672 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "对于表 \"%2$s\" 字段个数 %1$d 是无效的" -#: pg_dump.c:16551 +#: pg_dump.c:16749 +msgid "could not parse index statistic columns" +msgstr "无法解析索引统计列" + +#: pg_dump.c:16751 +msgid "could not parse index statistic values" +msgstr "无法解析索引统计值" + +#: pg_dump.c:16753 +#, c-format +msgid "mismatched number of columns and values for index statistics" +msgstr "" + +#: pg_dump.c:16970 #, c-format msgid "missing index for constraint \"%s\"" msgstr "对于约束 \"%s\" 缺少索引" -#: pg_dump.c:16771 +#: pg_dump.c:17195 #, c-format msgid "unrecognized constraint type: %c" msgstr "未知的约束类型: %c" -#: pg_dump.c:16903 pg_dump.c:17123 +#: pg_dump.c:17327 pg_dump.c:17550 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "查询得到了序列\"%s\"的数据,返回了%d条记录(期望一条)" msgstr[1] "查询得到了序列\"%s\"的数据,返回了%d条记录(期望一条)" -#: pg_dump.c:16937 +#: pg_dump.c:17361 #, c-format msgid "unrecognized sequence type: %s" msgstr "无法识别的序列类型: %s" -#: pg_dump.c:17219 +#: pg_dump.c:17648 #, c-format msgid "unexpected tgtype value: %d" msgstr "意外的tgtype值: %d" -#: pg_dump.c:17293 +#: pg_dump.c:17722 #, c-format msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" msgstr "给表 \"%3$s\" 上的触发器 \"%2$s\" 的错误参数 (%1$s)" -#: pg_dump.c:17522 +#: pg_dump.c:17991 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "获取表 \"%2$s\" 的规则 \"%1$s\" 查询失败: 返回了错误的行数" -#: pg_dump.c:17684 +#: pg_dump.c:18153 #, c-format msgid "could not find referenced extension %u" msgstr "找不到引用的扩展名%u" -#: pg_dump.c:17896 +#: pg_dump.c:18244 +msgid "could not parse extension configuration array" +msgstr "无法解析扩展配置数组" + +#: pg_dump.c:18246 +msgid "could not parse extension condition array" +msgstr "无法解析扩展条件数组" + +#: pg_dump.c:18248 +#, c-format +msgid "mismatched number of configurations and conditions for extension" +msgstr "扩展的配置和条件数量不匹配" + +#: pg_dump.c:18380 #, c-format msgid "reading dependency data" msgstr "读取从属数据" -#: pg_dump.c:17951 +#: pg_dump.c:18473 #, c-format msgid "no referencing object %u %u" msgstr "没有引用对象%u %u" -#: pg_dump.c:17962 +#: pg_dump.c:18484 #, c-format msgid "no referenced object %u %u" msgstr "没有引用的对象 %u %u" -#: pg_dump.c:18330 +#: pg_dump.c:18858 #, c-format msgid "could not parse reloptions array" msgstr "无法解析 reloptions 数组" -#: pg_dump_sort.c:327 +#: pg_dump_sort.c:411 #, c-format msgid "invalid dumpId %d" msgstr "无效的dumpId %d" -#: pg_dump_sort.c:333 +#: pg_dump_sort.c:417 #, c-format msgid "invalid dependency %d" msgstr "无效的依赖 %d" -#: pg_dump_sort.c:566 +#: pg_dump_sort.c:650 #, c-format msgid "could not identify dependency loop" msgstr "无法标识循环依赖" -#: pg_dump_sort.c:1129 +#: pg_dump_sort.c:1221 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" msgstr[0] "表上存在循环外键约束:" msgstr[1] "表上存在循环外键约束:" -#: pg_dump_sort.c:1133 pg_dump_sort.c:1153 +#: pg_dump_sort.c:1225 pg_dump_sort.c:1245 #, c-format msgid " %s" msgstr " %s" -#: pg_dump_sort.c:1134 +#: pg_dump_sort.c:1226 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "不使用 --disable-triggers 选项或者临时删除约束,你将不能对备份进行恢复." -#: pg_dump_sort.c:1135 +#: pg_dump_sort.c:1227 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "考虑使用完全备份代替 --data-only选项进行备份以避免此问题." -#: pg_dump_sort.c:1147 +#: pg_dump_sort.c:1239 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "无法解析这些项的循环依赖:" -#: pg_dumpall.c:200 +#: pg_dumpall.c:202 #, c-format msgid "" -"The program \"pg_dump\" is needed by %s but was not found in the\n" +"The program \"%s\" is needed by %s but was not found in the\n" "same directory as \"%s\".\n" "Check your installation." msgstr "" -"%s 需要程序 \"pg_dump\", 但是在同一个目录 \"%s\" 没有找到.\n" +"%2$s需要程序\"%1$s\"\n" +"但在与\"%3$s\"相同的目录中找不到该程序.\n" "检查您的安装." -#: pg_dumpall.c:205 +#: pg_dumpall.c:207 #, c-format msgid "" -"The program \"pg_dump\" was found by \"%s\"\n" +"The program \"%s\" was found by \"%s\"\n" "but was not the same version as %s.\n" "Check your installation." msgstr "" -"%s 找到程序 \"pg_dump\", 但是和版本 \"%s\" 不一致.\n" +"程序\"%s\"是由\"%s\"找到的\n" +"但与%s的版本不同.\n" "检查您的安装." -#: pg_dumpall.c:356 -#, c-format -msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only or -t/--tablespaces-only" +#: pg_dumpall.c:359 +msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "选项--exclude-database不能与-g/--globals-only、-r/--roles-only或-t/--tablespaces-only一起使用" -#: pg_dumpall.c:365 +#: pg_dumpall.c:368 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "选项-g/--globals-only和-r/--roles-only不能同时使用" -#: pg_dumpall.c:373 +#: pg_dumpall.c:376 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "选项 -g/--globals-only和-t/--tablespaces-only不能同时使用" -#: pg_dumpall.c:387 +#: pg_dumpall.c:390 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "选项 -r/--roles-only和 -t/--tablespaces-only不能同时使用" -#: pg_dumpall.c:448 pg_dumpall.c:1734 +#: pg_dumpall.c:453 pg_dumpall.c:1756 #, c-format msgid "could not connect to database \"%s\"" msgstr "无法与数据库 \"%s\" 联接" -#: pg_dumpall.c:462 +#: pg_dumpall.c:467 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2233,12 +2269,7 @@ msgstr "" "无法连接到数据库 \"postgres\"或\"template1\"\n" "请指定另外一个数据库." -#: pg_dumpall.c:484 -#, c-format -msgid "could not open the output file \"%s\": %m" -msgstr "无法打开输出文件 \"%s\":%m" - -#: pg_dumpall.c:616 +#: pg_dumpall.c:621 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2247,72 +2278,67 @@ msgstr "" "%s 抽取一个 PostgreSQL 数据库簇进一个 SQL 脚本文件.\n" "\n" -#: pg_dumpall.c:618 +#: pg_dumpall.c:623 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [选项]...\n" -#: pg_dumpall.c:621 +#: pg_dumpall.c:626 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=FILENAME 输出文件名\n" -#: pg_dumpall.c:628 +#: pg_dumpall.c:633 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean 在重新创建数据库前先清除(删除)数据库\n" -#: pg_dumpall.c:630 +#: pg_dumpall.c:635 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr " -g, --globals-only 只转储全局对象, 不包括数据库\n" -#: pg_dumpall.c:631 -#, c-format -msgid " -o, --oids include OIDs in dump\n" -msgstr " -o, --oids 在转储中包括 OID\n" - -#: pg_dumpall.c:632 pg_restore.c:489 +#: pg_dumpall.c:636 pg_restore.c:485 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner 不恢复对象所属者\n" -#: pg_dumpall.c:633 +#: pg_dumpall.c:637 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr " -r, --roles-only 只转储角色,不包括数据库或表空间\n" -#: pg_dumpall.c:635 +#: pg_dumpall.c:639 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr " -S, --superuser=NAME 在转储中, 指定的超级用户名\n" -#: pg_dumpall.c:636 +#: pg_dumpall.c:640 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr " -t, --tablespaces-only 只转储表空间,而不转储数据库或角色\n" -#: pg_dumpall.c:642 +#: pg_dumpall.c:646 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr " --exclude-database=PATTERN 排除名称与PATTERN匹配的数据库\n" -#: pg_dumpall.c:649 +#: pg_dumpall.c:653 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords 不转储角色的密码\n" -#: pg_dumpall.c:662 +#: pg_dumpall.c:668 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=CONNSTR 连接数据库使用的连接串\n" -#: pg_dumpall.c:664 +#: pg_dumpall.c:670 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAME 另一个缺省数据库\n" -#: pg_dumpall.c:671 +#: pg_dumpall.c:677 #, c-format msgid "" "\n" @@ -2324,97 +2350,90 @@ msgstr "" "如果没有使用 -f/--file,那么将把SQL脚本写到标准输出.\n" "\n" -#: pg_dumpall.c:876 +#: pg_dumpall.c:883 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "以\"pg_\"开始的角色名称已被跳过 (%s)" -#: pg_dumpall.c:1258 +#: pg_dumpall.c:1284 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "无法为表空间 \"%2$s\" 分析 ACL 列表 (%1$s)" -#: pg_dumpall.c:1475 -#, c-format -msgid "excluding database \"%s\"..." -msgstr "正在排除数据库 \"%s\"..." +#: pg_dumpall.c:1501 +msgid "excluding database \"%s\"" +msgstr "正在排除数据库 \"%s\"" -#: pg_dumpall.c:1479 -#, c-format -msgid "dumping database \"%s\"..." -msgstr "正在转储数据库 \"%s\"..." +#: pg_dumpall.c:1505 +msgid "dumping database \"%s\"" +msgstr "正在转储数据库 \"%s\"" -#: pg_dumpall.c:1511 +#: pg_dumpall.c:1537 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "pg_dump 失败在数据库 \"%s\", 正在退出" -#: pg_dumpall.c:1520 +#: pg_dumpall.c:1546 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "无法重新打开输出文件 \"%s\":%m" -#: pg_dumpall.c:1564 +#: pg_dumpall.c:1590 #, c-format msgid "running \"%s\"" msgstr "正在运行 \"%s\"" -#: pg_dumpall.c:1755 -#, c-format -msgid "could not connect to database \"%s\": %s" -msgstr "无法与数据库 \"%s\" 联接: %s" - -#: pg_dumpall.c:1785 +#: pg_dumpall.c:1805 #, c-format msgid "could not get server version" msgstr "无法从服务器获取版本" -#: pg_dumpall.c:1791 +#: pg_dumpall.c:1811 #, c-format msgid "could not parse server version \"%s\"" msgstr "无法分析版本字串 \"%s\"" -#: pg_dumpall.c:1863 pg_dumpall.c:1886 +#: pg_dumpall.c:1883 pg_dumpall.c:1906 #, c-format msgid "executing %s" msgstr "正在执行: %s" -#: pg_restore.c:312 +#: pg_restore.c:308 #, c-format msgid "one of -d/--dbname and -f/--file must be specified" msgstr "必须指定-d/--dbname和-f/--file之一" -#: pg_restore.c:321 +#: pg_restore.c:317 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" msgstr "选项 -d/--dbname和-f/--file不能同时使用" -#: pg_restore.c:347 +#: pg_restore.c:343 #, c-format msgid "options -C/--create and -1/--single-transaction cannot be used together" msgstr "选项 -C/--create和 -1/--single-transaction不能同时使用" -#: pg_restore.c:361 +#: pg_restore.c:357 #, c-format msgid "maximum number of parallel jobs is %d" msgstr "已经达到并行工作集的最大数 %d" -#: pg_restore.c:370 +#: pg_restore.c:366 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "不能同时指定选项--single-transaction和多个任务" -#: pg_restore.c:412 +#: pg_restore.c:408 #, c-format msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "不可识别的归档格式\"%s\"; 请指定 \"c\", \"d\", 或 \"t\"" -#: pg_restore.c:452 +#: pg_restore.c:448 #, c-format msgid "errors ignored on restore: %d" msgstr "恢复中忽略错误: %d" -#: pg_restore.c:465 +#: pg_restore.c:461 #, c-format msgid "" "%s restores a PostgreSQL database from an archive created by pg_dump.\n" @@ -2423,47 +2442,47 @@ msgstr "" "%s 从一个归档中恢复一个由 pg_dump 创建的 PostgreSQL 数据库.\n" "\n" -#: pg_restore.c:467 +#: pg_restore.c:463 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [选项]... [文件名]\n" -#: pg_restore.c:470 +#: pg_restore.c:466 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr " -d, --dbname=名字 连接数据库名字\n" -#: pg_restore.c:471 +#: pg_restore.c:467 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" msgstr " -f, --file=文件名 输出文件名(- 对于stdout)\n" -#: pg_restore.c:472 +#: pg_restore.c:468 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" msgstr " -F, --format=c|d|t 备份文件格式(应该自动进行)\n" -#: pg_restore.c:473 +#: pg_restore.c:469 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr " -l, --list 打印归档文件的 TOC 概述\n" -#: pg_restore.c:474 +#: pg_restore.c:470 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose 详细模式\n" -#: pg_restore.c:475 +#: pg_restore.c:471 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 输出版本信息, 然后退出\n" -#: pg_restore.c:476 +#: pg_restore.c:472 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 显示此帮助, 然后退出\n" -#: pg_restore.c:478 +#: pg_restore.c:474 #, c-format msgid "" "\n" @@ -2472,32 +2491,32 @@ msgstr "" "\n" "恢复控制选项:\n" -#: pg_restore.c:479 +#: pg_restore.c:475 #, c-format msgid " -a, --data-only restore only the data, no schema\n" msgstr " -a, --data-only 只恢复数据, 不包括模式\n" -#: pg_restore.c:481 +#: pg_restore.c:477 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create 创建目标数据库\n" -#: pg_restore.c:482 +#: pg_restore.c:478 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" msgstr " -e, --exit-on-error 发生错误退出, 默认为继续\n" -#: pg_restore.c:483 +#: pg_restore.c:479 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=NAME 恢复指定名称的索引\n" -#: pg_restore.c:484 +#: pg_restore.c:480 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" msgstr " -j, --jobs=NUM 执行多个并行任务进行恢复工作\n" -#: pg_restore.c:485 +#: pg_restore.c:481 #, c-format msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" @@ -2506,62 +2525,62 @@ msgstr "" " -L, --use-list=FILENAME 从这个文件中使用指定的内容表排序\n" " 输出\n" -#: pg_restore.c:487 +#: pg_restore.c:483 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" msgstr " -n, --schema=NAME 在这个模式中只恢复对象\n" -#: pg_restore.c:488 +#: pg_restore.c:484 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" msgstr " -N, --exclude-schema=NAME 不恢复此模式中的对象\n" -#: pg_restore.c:490 +#: pg_restore.c:486 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=NAME(args) 恢复指定名字的函数\n" -#: pg_restore.c:491 +#: pg_restore.c:487 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" msgstr " -s, --schema-only 只恢复模式, 不包括数据\n" -#: pg_restore.c:492 +#: pg_restore.c:488 #, c-format msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n" msgstr " -S, --superuser=NAME 使用指定的超级用户来禁用触发器\n" -#: pg_restore.c:493 +#: pg_restore.c:489 #, c-format msgid " -t, --table=NAME restore named relation (table, view, etc.)\n" msgstr " -t, --table=NAME 恢复命名关系(表、视图等)\n" -#: pg_restore.c:494 +#: pg_restore.c:490 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=NAME 恢复指定名字的触发器\n" -#: pg_restore.c:495 +#: pg_restore.c:491 #, c-format msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" msgstr " -x, --no-privileges 跳过处理权限的恢复 (grant/revoke)\n" -#: pg_restore.c:496 +#: pg_restore.c:492 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr " -1, --single-transaction 作为单个事务恢复\n" -#: pg_restore.c:498 +#: pg_restore.c:494 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security 启用行安全性\n" -#: pg_restore.c:500 +#: pg_restore.c:496 #, c-format msgid " --no-comments do not restore comments\n" msgstr " --no-comments 不恢复注释\n" -#: pg_restore.c:501 +#: pg_restore.c:497 #, c-format msgid "" " --no-data-for-failed-tables do not restore data of tables that could not be\n" @@ -2570,37 +2589,37 @@ msgstr "" " --no-data-for-failed-tables 对那些无法创建的表不进行\n" " 数据恢复\n" -#: pg_restore.c:503 +#: pg_restore.c:499 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications 不恢复发行\n" -#: pg_restore.c:504 +#: pg_restore.c:500 #, c-format msgid " --no-security-labels do not restore security labels\n" msgstr " --no-security-labels 不恢复安全标签信息\n" -#: pg_restore.c:505 +#: pg_restore.c:501 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions 不恢复订阅\n" -#: pg_restore.c:506 +#: pg_restore.c:502 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" msgstr " --no-tablespaces 不恢复表空间的分配信息\n" -#: pg_restore.c:507 +#: pg_restore.c:503 #, c-format msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n" msgstr " --section=SECTION 恢复命名节 (数据前、数据及数据后)\n" -#: pg_restore.c:520 +#: pg_restore.c:516 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" msgstr " --role=ROLENAME 在恢复前执行SET ROLE操作\n" -#: pg_restore.c:522 +#: pg_restore.c:518 #, c-format msgid "" "\n" @@ -2611,7 +2630,7 @@ msgstr "" "选项 -I, -n, -N, -P, -t, -T, 以及 --section 可以组合使用和指定\n" "多次用于选择多个对象.\n" -#: pg_restore.c:525 +#: pg_restore.c:521 #, c-format msgid "" "\n" @@ -2621,3 +2640,4 @@ msgstr "" "\n" "如果没有提供输入文件名, 则使用标准输入.\n" "\n" + diff --git a/src/bin/pg_resetwal/nls.mk b/src/bin/pg_resetwal/nls.mk index 5b54c18a3c..6b85a78828 100644 --- a/src/bin/pg_resetwal/nls.mk +++ b/src/bin/pg_resetwal/nls.mk @@ -1,6 +1,6 @@ # src/bin/pg_resetwal/nls.mk CATALOG_NAME = pg_resetwal -AVAIL_LANGUAGES = cs de es fr it ja ko pl pt_BR ru sv tr uk zh_CN +AVAIL_LANGUAGES = cs de el es fr it ja ko pl pt_BR ru sv tr uk zh_CN GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_resetwal.c ../../common/restricted_token.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/pg_resetwal/po/de.po b/src/bin/pg_resetwal/po/de.po index 433f4008fa..6a7cf3a776 100644 --- a/src/bin/pg_resetwal/po/de.po +++ b/src/bin/pg_resetwal/po/de.po @@ -1,14 +1,14 @@ # German message translation file for pg_resetwal -# Peter Eisentraut , 2002 - 2020. +# Peter Eisentraut , 2002 - 2022. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-14 06:16+0000\n" -"PO-Revision-Date: 2020-04-14 14:25+0200\n" +"POT-Creation-Date: 2022-05-08 07:49+0000\n" +"PO-Revision-Date: 2022-05-08 14:16+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -17,21 +17,26 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "Fatal: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "Warnung: " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "Tipp: " + #: ../../common/restricted_token.c:64 #, c-format msgid "could not load library \"%s\": error code %lu" @@ -67,117 +72,123 @@ msgstr "konnte Prozess für Befehl »%s« nicht starten: Fehlercode %lu" msgid "could not re-execute with restricted token: error code %lu" msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu" #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:160 pg_resetwal.c:175 pg_resetwal.c:190 pg_resetwal.c:197 -#: pg_resetwal.c:221 pg_resetwal.c:236 pg_resetwal.c:244 pg_resetwal.c:269 -#: pg_resetwal.c:283 +#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202 +#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249 +#: pg_resetwal.c:269 pg_resetwal.c:280 #, c-format msgid "invalid argument for option %s" msgstr "ungültiges Argument für Option %s" -#: pg_resetwal.c:161 pg_resetwal.c:176 pg_resetwal.c:191 pg_resetwal.c:198 -#: pg_resetwal.c:222 pg_resetwal.c:237 pg_resetwal.c:245 pg_resetwal.c:270 -#: pg_resetwal.c:284 pg_resetwal.c:310 pg_resetwal.c:323 pg_resetwal.c:331 +#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 +#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 +#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316 +#: pg_resetwal.c:323 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_resetwal.c:166 +#: pg_resetwal.c:168 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "Transaktions-ID-Epoche (-e) darf nicht -1 sein" #: pg_resetwal.c:181 #, c-format -msgid "transaction ID (-x) must not be 0" -msgstr "Transaktions-ID (-x) darf nicht 0 sein" +msgid "oldest transaction ID (-u) must be greater than or equal to %u" +msgstr "älteste Transaktions-ID (-u) muss größer oder gleich %u sein" + +#: pg_resetwal.c:194 +#, c-format +msgid "transaction ID (-x) must be greater than or equal to %u" +msgstr "Transaktions-ID (-x) muss größer oder gleich %u sein" -#: pg_resetwal.c:205 pg_resetwal.c:212 +#: pg_resetwal.c:216 pg_resetwal.c:220 #, c-format msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" msgstr "Transaktions-ID (-c) muss entweder 0 oder größer oder gleich 2 sein" -#: pg_resetwal.c:227 +#: pg_resetwal.c:233 #, c-format msgid "OID (-o) must not be 0" msgstr "OID (-o) darf nicht 0 sein" -#: pg_resetwal.c:250 +#: pg_resetwal.c:254 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "Multitransaktions-ID (-m) darf nicht 0 sein" -#: pg_resetwal.c:260 +#: pg_resetwal.c:261 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "älteste Multitransaktions-ID (-m) darf nicht 0 sein" -#: pg_resetwal.c:275 +#: pg_resetwal.c:274 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "Multitransaktions-Offset (-O) darf nicht -1 sein" -#: pg_resetwal.c:299 +#: pg_resetwal.c:296 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "Argument von --wal-segsize muss eine Zahl sein" -#: pg_resetwal.c:304 +#: pg_resetwal.c:298 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "Argument von --wal-segsize muss eine Zweierpotenz zwischen 1 und 1024 sein" -#: pg_resetwal.c:321 +#: pg_resetwal.c:314 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_resetwal.c:330 +#: pg_resetwal.c:322 #, c-format msgid "no data directory specified" msgstr "kein Datenverzeichnis angegeben" -#: pg_resetwal.c:344 +#: pg_resetwal.c:336 #, c-format msgid "cannot be executed by \"root\"" msgstr "kann nicht von »root« ausgeführt werden" -#: pg_resetwal.c:345 +#: pg_resetwal.c:337 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Sie müssen %s als PostgreSQL-Superuser ausführen." -#: pg_resetwal.c:356 +#: pg_resetwal.c:347 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %m" -#: pg_resetwal.c:365 +#: pg_resetwal.c:353 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m" -#: pg_resetwal.c:381 pg_resetwal.c:544 pg_resetwal.c:595 +#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" -#: pg_resetwal.c:388 +#: pg_resetwal.c:371 #, c-format msgid "lock file \"%s\" exists" msgstr "Sperrdatei »%s« existiert" -#: pg_resetwal.c:389 +#: pg_resetwal.c:372 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "Läuft der Server? Wenn nicht, dann Sperrdatei löschen und nochmal versuchen." -#: pg_resetwal.c:492 +#: pg_resetwal.c:467 #, c-format msgid "" "\n" @@ -187,7 +198,7 @@ msgstr "" "Wenn diese Werte akzeptabel scheinen, dann benutzen Sie -f um das\n" "Zurücksetzen zu erzwingen.\n" -#: pg_resetwal.c:504 +#: pg_resetwal.c:479 #, c-format msgid "" "The database server was not shut down cleanly.\n" @@ -199,32 +210,32 @@ msgstr "" "Wenn Sie trotzdem weiter machen wollen, benutzen Sie -f, um das\n" "Zurücksetzen zu erzwingen.\n" -#: pg_resetwal.c:518 +#: pg_resetwal.c:493 #, c-format msgid "Write-ahead log reset\n" msgstr "Write-Ahead-Log wurde zurückgesetzt\n" -#: pg_resetwal.c:553 +#: pg_resetwal.c:525 #, c-format msgid "unexpected empty file \"%s\"" msgstr "unerwartete leere Datei »%s«" -#: pg_resetwal.c:555 pg_resetwal.c:611 +#: pg_resetwal.c:527 pg_resetwal.c:581 #, c-format msgid "could not read file \"%s\": %m" msgstr "konnte Datei »%s« nicht lesen: %m" -#: pg_resetwal.c:564 +#: pg_resetwal.c:535 #, c-format msgid "data directory is of wrong version" msgstr "Datenverzeichnis hat falsche Version" -#: pg_resetwal.c:565 +#: pg_resetwal.c:536 #, c-format msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." msgstr "Datei »%s« enthält »%s«, was nicht mit der Version dieses Programms »%s« kompatibel ist." -#: pg_resetwal.c:598 +#: pg_resetwal.c:569 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" @@ -235,24 +246,24 @@ msgstr "" " touch %s\n" "aus und versuchen Sie es erneut." -#: pg_resetwal.c:629 +#: pg_resetwal.c:597 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "pg_control existiert, aber mit ungültiger CRC; mit Vorsicht fortfahren" -#: pg_resetwal.c:638 +#: pg_resetwal.c:606 #, c-format msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" msgstr[0] "pg_control gibt ungültige WAL-Segmentgröße an (%d Byte); mit Vorsicht fortfahren" msgstr[1] "pg_control gibt ungültige WAL-Segmentgröße an (%d Bytes); mit Vorsicht fortfahren" -#: pg_resetwal.c:649 +#: pg_resetwal.c:617 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "pg_control existiert, aber ist kaputt oder hat falsche Version; wird ignoriert" -#: pg_resetwal.c:744 +#: pg_resetwal.c:712 #, c-format msgid "" "Guessed pg_control values:\n" @@ -261,7 +272,7 @@ msgstr "" "Geschätzte pg_control-Werte:\n" "\n" -#: pg_resetwal.c:746 +#: pg_resetwal.c:714 #, c-format msgid "" "Current pg_control values:\n" @@ -270,167 +281,167 @@ msgstr "" "Aktuelle pg_control-Werte:\n" "\n" -#: pg_resetwal.c:748 +#: pg_resetwal.c:716 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_control-Versionsnummer: %u\n" -#: pg_resetwal.c:750 +#: pg_resetwal.c:718 #, c-format msgid "Catalog version number: %u\n" msgstr "Katalogversionsnummer: %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:720 #, c-format msgid "Database system identifier: %llu\n" msgstr "Datenbanksystemidentifikation: %llu\n" -#: pg_resetwal.c:754 +#: pg_resetwal.c:722 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "TimeLineID des letzten Checkpoints: %u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:724 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "full_page_writes des letzten Checkpoints: %s\n" -#: pg_resetwal.c:757 +#: pg_resetwal.c:725 msgid "off" msgstr "aus" -#: pg_resetwal.c:757 +#: pg_resetwal.c:725 msgid "on" msgstr "an" -#: pg_resetwal.c:758 +#: pg_resetwal.c:726 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID des letzten Checkpoints: %u:%u\n" -#: pg_resetwal.c:761 +#: pg_resetwal.c:729 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID des letzten Checkpoints: %u\n" -#: pg_resetwal.c:763 +#: pg_resetwal.c:731 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId des letzten Checkpoints: %u\n" -#: pg_resetwal.c:765 +#: pg_resetwal.c:733 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset des letzten Checkpoints: %u\n" -#: pg_resetwal.c:767 +#: pg_resetwal.c:735 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID des letzten Checkpoints: %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:737 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "DB der oldestXID des letzten Checkpoints: %u\n" -#: pg_resetwal.c:771 +#: pg_resetwal.c:739 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID des letzten Checkpoints: %u\n" -#: pg_resetwal.c:773 +#: pg_resetwal.c:741 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid des letzten Checkpoints: %u\n" -#: pg_resetwal.c:775 +#: pg_resetwal.c:743 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "DB des oldestMulti des letzten Checkpoints: %u\n" -#: pg_resetwal.c:777 +#: pg_resetwal.c:745 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid des letzten Checkpoints: %u\n" -#: pg_resetwal.c:779 +#: pg_resetwal.c:747 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid des letzten Checkpoints: %u\n" -#: pg_resetwal.c:781 +#: pg_resetwal.c:749 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Maximale Datenausrichtung (Alignment): %u\n" -#: pg_resetwal.c:784 +#: pg_resetwal.c:752 #, c-format msgid "Database block size: %u\n" msgstr "Datenbankblockgröße: %u\n" -#: pg_resetwal.c:786 +#: pg_resetwal.c:754 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Blöcke pro Segment: %u\n" -#: pg_resetwal.c:788 +#: pg_resetwal.c:756 #, c-format msgid "WAL block size: %u\n" msgstr "WAL-Blockgröße: %u\n" -#: pg_resetwal.c:790 pg_resetwal.c:876 +#: pg_resetwal.c:758 pg_resetwal.c:844 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Bytes pro WAL-Segment: %u\n" -#: pg_resetwal.c:792 +#: pg_resetwal.c:760 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Maximale Bezeichnerlänge: %u\n" -#: pg_resetwal.c:794 +#: pg_resetwal.c:762 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Maximale Spalten in einem Index: %u\n" -#: pg_resetwal.c:796 +#: pg_resetwal.c:764 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Maximale Größe eines Stücks TOAST: %u\n" -#: pg_resetwal.c:798 +#: pg_resetwal.c:766 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Größe eines Large-Object-Chunks: %u\n" -#: pg_resetwal.c:801 +#: pg_resetwal.c:769 #, c-format msgid "Date/time type storage: %s\n" msgstr "Speicherung von Datum/Zeit-Typen: %s\n" -#: pg_resetwal.c:802 +#: pg_resetwal.c:770 msgid "64-bit integers" msgstr "64-Bit-Ganzzahlen" -#: pg_resetwal.c:803 +#: pg_resetwal.c:771 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Übergabe von Float8-Argumenten: %s\n" -#: pg_resetwal.c:804 +#: pg_resetwal.c:772 msgid "by reference" msgstr "Referenz" -#: pg_resetwal.c:804 +#: pg_resetwal.c:772 msgid "by value" msgstr "Wert" -#: pg_resetwal.c:805 +#: pg_resetwal.c:773 #, c-format msgid "Data page checksum version: %u\n" msgstr "Datenseitenprüfsummenversion: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:787 #, c-format msgid "" "\n" @@ -443,102 +454,102 @@ msgstr "" "Zu ändernde Werte:\n" "\n" -#: pg_resetwal.c:823 +#: pg_resetwal.c:791 #, c-format msgid "First log segment after reset: %s\n" msgstr "Erstes Logdateisegment nach Zurücksetzen: %s\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:795 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:829 +#: pg_resetwal.c:797 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:831 +#: pg_resetwal.c:799 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "OldestMulti's DB: %u\n" -#: pg_resetwal.c:837 +#: pg_resetwal.c:805 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:843 +#: pg_resetwal.c:811 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:849 +#: pg_resetwal.c:817 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:851 +#: pg_resetwal.c:819 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:853 +#: pg_resetwal.c:821 #, c-format msgid "OldestXID's DB: %u\n" msgstr "OldestXID's DB: %u\n" -#: pg_resetwal.c:859 +#: pg_resetwal.c:827 #, c-format msgid "NextXID epoch: %u\n" msgstr "NextXID-Epoche: %u\n" -#: pg_resetwal.c:865 +#: pg_resetwal.c:833 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:870 +#: pg_resetwal.c:838 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:956 pg_resetwal.c:1024 pg_resetwal.c:1071 +#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: pg_resetwal.c:991 pg_resetwal.c:1044 pg_resetwal.c:1094 +#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 #, c-format msgid "could not read directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht lesen: %m" -#: pg_resetwal.c:997 pg_resetwal.c:1050 pg_resetwal.c:1100 +#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 #, c-format msgid "could not close directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht schließen: %m" -#: pg_resetwal.c:1036 pg_resetwal.c:1086 +#: pg_resetwal.c:990 pg_resetwal.c:1028 #, c-format msgid "could not delete file \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %m" -#: pg_resetwal.c:1167 +#: pg_resetwal.c:1100 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" -#: pg_resetwal.c:1177 pg_resetwal.c:1190 +#: pg_resetwal.c:1108 pg_resetwal.c:1120 #, c-format msgid "could not write file \"%s\": %m" msgstr "konnte Datei »%s« nicht schreiben: %m" -#: pg_resetwal.c:1197 +#: pg_resetwal.c:1125 #, c-format msgid "fsync error: %m" msgstr "fsync-Fehler: %m" -#: pg_resetwal.c:1208 +#: pg_resetwal.c:1134 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" @@ -547,7 +558,7 @@ msgstr "" "%s setzt den PostgreSQL-Write-Ahead-Log zurück.\n" "\n" -#: pg_resetwal.c:1209 +#: pg_resetwal.c:1135 #, c-format msgid "" "Usage:\n" @@ -558,85 +569,90 @@ msgstr "" " %s [OPTION]... DATENVERZEICHNIS\n" "\n" -#: pg_resetwal.c:1210 +#: pg_resetwal.c:1136 #, c-format msgid "Options:\n" msgstr "Optionen:\n" -#: pg_resetwal.c:1211 +#: pg_resetwal.c:1137 #, c-format msgid "" " -c, --commit-timestamp-ids=XID,XID\n" -" set oldest and newest transactions bearing\n" -" commit timestamp (zero means no change)\n" +" set oldest and newest transactions bearing\n" +" commit timestamp (zero means no change)\n" msgstr "" " -c, --commit-timestamp-ids=XID,XID\n" -" älteste und neuste Transaktion mit Commit-\n" -" Timestamp setzen (Null bedeutet keine Änderung)\n" +" älteste und neuste Transaktion mit Commit-\n" +" Timestamp setzen (Null bedeutet keine Änderung)\n" -#: pg_resetwal.c:1214 +#: pg_resetwal.c:1140 #, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]VERZ Datenbankverzeichnis\n" +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]VERZ Datenbankverzeichnis\n" -#: pg_resetwal.c:1215 +#: pg_resetwal.c:1141 #, c-format -msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" -msgstr " -e, --epoch=XIDEPOCHE nächste Transaktions-ID-Epoche setzen\n" +msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" +msgstr " -e, --epoch=XIDEPOCHE nächste Transaktions-ID-Epoche setzen\n" -#: pg_resetwal.c:1216 +#: pg_resetwal.c:1142 #, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force Änderung erzwingen\n" +msgid " -f, --force force update to be done\n" +msgstr " -f, --force Änderung erzwingen\n" -#: pg_resetwal.c:1217 +#: pg_resetwal.c:1143 #, c-format -msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" -msgstr " -l, --next-wal-file=WALDATEI minimale Startposition für neuen WAL setzen\n" +msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" +msgstr " -l, --next-wal-file=WALDATEI minimale Startposition für neuen WAL setzen\n" -#: pg_resetwal.c:1218 +#: pg_resetwal.c:1144 #, c-format -msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" -msgstr " -m, --multixact-ids=MXID,MXID nächste und älteste Multitransaktions-ID setzen\n" +msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" +msgstr " -m, --multixact-ids=MXID,MXID nächste und älteste Multitransaktions-ID setzen\n" -#: pg_resetwal.c:1219 +#: pg_resetwal.c:1145 #, c-format -msgid " -n, --dry-run no update, just show what would be done\n" +msgid " -n, --dry-run no update, just show what would be done\n" msgstr "" -" -n, --dry-run keine Änderungen; nur zeigen, was gemacht\n" -" werden würde\n" +" -n, --dry-run keine Änderungen; nur zeigen, was gemacht\n" +" werden würde\n" + +#: pg_resetwal.c:1146 +#, c-format +msgid " -o, --next-oid=OID set next OID\n" +msgstr " -o, --next-oid=OID nächste OID setzen\n" -#: pg_resetwal.c:1220 +#: pg_resetwal.c:1147 #, c-format -msgid " -o, --next-oid=OID set next OID\n" -msgstr " -o, --next-oid=OID nächste OID setzen\n" +msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" +msgstr " -O, --multixact-offset=OFFSET nächsten Multitransaktions-Offset setzen\n" -#: pg_resetwal.c:1221 +#: pg_resetwal.c:1148 #, c-format -msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" -msgstr " -O, --multixact-offset=OFFSET nächsten Multitransaktions-Offset setzen\n" +msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" +msgstr " -u, --oldest-transaction-id=XID älteste Transaktions-ID setzen\n" -#: pg_resetwal.c:1222 +#: pg_resetwal.c:1149 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_resetwal.c:1223 +#: pg_resetwal.c:1150 #, c-format -msgid " -x, --next-transaction-id=XID set next transaction ID\n" -msgstr " -x, --next-transaction-id=XID nächste Transaktions-ID setzen\n" +msgid " -x, --next-transaction-id=XID set next transaction ID\n" +msgstr " -x, --next-transaction-id=XID nächste Transaktions-ID setzen\n" -#: pg_resetwal.c:1224 +#: pg_resetwal.c:1151 #, c-format -msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" -msgstr " --wal-segsize=ZAHL Größe eines WAL-Segments, in Megabytes\n" +msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" +msgstr " --wal-segsize=ZAHL Größe eines WAL-Segments, in Megabytes\n" -#: pg_resetwal.c:1225 +#: pg_resetwal.c:1152 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_resetwal.c:1226 +#: pg_resetwal.c:1153 #, c-format msgid "" "\n" @@ -645,7 +661,7 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_resetwal.c:1227 +#: pg_resetwal.c:1154 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" diff --git a/src/bin/pg_resetwal/po/el.po b/src/bin/pg_resetwal/po/el.po new file mode 100644 index 0000000000..e539ac9daa --- /dev/null +++ b/src/bin/pg_resetwal/po/el.po @@ -0,0 +1,671 @@ +# Greek message translation file for pg_resetwal +# Copyright (C) 2021 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_resetwal (PostgreSQL) package. +# Georgios Kokolatos , 2021. +# +# +# +msgid "" +msgstr "" +"Project-Id-Version: pg_resetwal (PostgreSQL) 14\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2021-11-08 10:16+0000\n" +"PO-Revision-Date: 2021-11-08 12:02+0100\n" +"Last-Translator: Georgios Kokolatos \n" +"Language-Team: \n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.0\n" + +#: ../../../src/common/logging.c:259 +#, c-format +msgid "fatal: " +msgstr "κρίσιμο: " + +#: ../../../src/common/logging.c:266 +#, c-format +msgid "error: " +msgstr "σφάλμα: " + +#: ../../../src/common/logging.c:273 +#, c-format +msgid "warning: " +msgstr "προειδοποίηση: " + +#: ../../common/restricted_token.c:64 +#, c-format +msgid "could not load library \"%s\": error code %lu" +msgstr "δεν ήταν δυνατή η φόρτωση της βιβλιοθήκης «%s»: κωδικός σφάλματος %lu" + +#: ../../common/restricted_token.c:73 +#, c-format +msgid "cannot create restricted tokens on this platform: error code %lu" +msgstr "δεν ήταν δυνατή η δημιουργία διακριτικών περιορισμού στην παρούσα πλατφόρμα: κωδικός σφάλματος %lu" + +#: ../../common/restricted_token.c:82 +#, c-format +msgid "could not open process token: error code %lu" +msgstr "δεν ήταν δυνατό το άνοιγμα διακριτικού διεργασίας: κωδικός σφάλματος %lu" + +#: ../../common/restricted_token.c:97 +#, c-format +msgid "could not allocate SIDs: error code %lu" +msgstr "δεν ήταν δυνατή η εκχώρηση SID: κωδικός σφάλματος %lu" + +#: ../../common/restricted_token.c:119 +#, c-format +msgid "could not create restricted token: error code %lu" +msgstr "δεν ήταν δυνατή η δημιουργία διακριτικού διεργασίας: κωδικός σφάλματος %lu" + +#: ../../common/restricted_token.c:140 +#, c-format +msgid "could not start process for command \"%s\": error code %lu" +msgstr "δεν ήταν δυνατή η εκκίνηση διεργασίας για την εντολή «%s»: κωδικός σφάλματος %lu" + +#: ../../common/restricted_token.c:178 +#, c-format +msgid "could not re-execute with restricted token: error code %lu" +msgstr "δεν ήταν δυνατή η επανεκκίνηση με διακριτικό περιορισμού: κωδικός σφάλματος %lu" + +#: ../../common/restricted_token.c:194 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "δεν ήταν δυνατή η απόκτηση κωδικού εξόδου από την υποδιεργασία: κωδικός σφάλματος %lu" + +#. translator: the second %s is a command line argument (-e, etc) +#: pg_resetwal.c:162 pg_resetwal.c:177 pg_resetwal.c:192 pg_resetwal.c:207 +#: pg_resetwal.c:214 pg_resetwal.c:238 pg_resetwal.c:253 pg_resetwal.c:261 +#: pg_resetwal.c:286 pg_resetwal.c:300 +#, c-format +msgid "invalid argument for option %s" +msgstr "μη έγκυρη παράμετρος για την επιλογή %s" + +#: pg_resetwal.c:163 pg_resetwal.c:178 pg_resetwal.c:193 pg_resetwal.c:208 +#: pg_resetwal.c:215 pg_resetwal.c:239 pg_resetwal.c:254 pg_resetwal.c:262 +#: pg_resetwal.c:287 pg_resetwal.c:301 pg_resetwal.c:327 pg_resetwal.c:340 +#: pg_resetwal.c:348 +#, c-format +msgid "Try \"%s --help\" for more information.\n" +msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n" + +#: pg_resetwal.c:168 +#, c-format +msgid "transaction ID epoch (-e) must not be -1" +msgstr "η εποχή αναγνωριστικού συναλλαγής (-e) δεν πρέπει να είναι -1" + +#: pg_resetwal.c:183 +#, c-format +msgid "oldest transaction ID (-u) must be greater than or equal to %u" +msgstr "το παλαιότερο αναγνωριστικό συναλλαγής (-u) πρέπει να είναι μεγαλύτερο ή ίσο με %u" + +#: pg_resetwal.c:198 +#, c-format +msgid "transaction ID (-x) must be greater than or equal to %u" +msgstr "το αναγνωριστικό συναλλαγής (-x) πρέπει να είναι μεγαλύτερο ή ίσο με %u" + +#: pg_resetwal.c:222 pg_resetwal.c:229 +#, c-format +msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" +msgstr "το αναγνωριστικό συναλλαγής (-c) πρέπει να είναι είτε 0 είτε μεγαλύτερο ή ίσο με 2" + +#: pg_resetwal.c:244 +#, c-format +msgid "OID (-o) must not be 0" +msgstr "OID (-o) δεν πρέπει να είναι 0" + +#: pg_resetwal.c:267 +#, c-format +msgid "multitransaction ID (-m) must not be 0" +msgstr "το αναγνωριστικό πολλαπλής συναλλαγής (-m) δεν πρέπει να είναι 0" + +#: pg_resetwal.c:277 +#, c-format +msgid "oldest multitransaction ID (-m) must not be 0" +msgstr "το παλαιότερο αναγνωριστικό πολλαπλής συναλλαγής (-m) δεν πρέπει να είναι 0" + +#: pg_resetwal.c:292 +#, c-format +msgid "multitransaction offset (-O) must not be -1" +msgstr "η μετατόπιση πολλαπλής συναλλαγής (-O) δεν πρέπει να είναι -1" + +#: pg_resetwal.c:316 +#, c-format +msgid "argument of --wal-segsize must be a number" +msgstr "η παράμετρος --wal-segsize πρέπει να είναι αριθμός" + +#: pg_resetwal.c:321 +#, c-format +msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" +msgstr "η παράμετρος --wal-segsize πρέπει να έχει τιμή δύναμης 2 μεταξύ 1 και 1024" + +#: pg_resetwal.c:338 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)" + +#: pg_resetwal.c:347 +#, c-format +msgid "no data directory specified" +msgstr "δεν ορίστηκε κατάλογος δεδομένων" + +#: pg_resetwal.c:361 +#, c-format +msgid "cannot be executed by \"root\"" +msgstr "δεν είναι δυνατή η εκτέλεση από \"root\"" + +#: pg_resetwal.c:362 +#, c-format +msgid "You must run %s as the PostgreSQL superuser." +msgstr "Πρέπει να εκτελέσετε %s ως υπερχρήστης PostgreSQL." + +#: pg_resetwal.c:373 +#, c-format +msgid "could not read permissions of directory \"%s\": %m" +msgstr "δεν ήταν δυνατή η ανάγνωση δικαιωμάτων του καταλόγου «%s»: %m" + +#: pg_resetwal.c:382 +#, c-format +msgid "could not change directory to \"%s\": %m" +msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" + +#: pg_resetwal.c:398 pg_resetwal.c:553 pg_resetwal.c:604 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου «%s» για ανάγνωση: %m" + +#: pg_resetwal.c:405 +#, c-format +msgid "lock file \"%s\" exists" +msgstr "το αρχείο κλειδώματος \"%s\" υπάρχει" + +#: pg_resetwal.c:406 +#, c-format +msgid "Is a server running? If not, delete the lock file and try again." +msgstr "Εκτελείται ο διακομιστής; Εάν όχι, διαγράψτε το αρχείο κλειδώματος και προσπαθήστε ξανά." + +#: pg_resetwal.c:501 +#, c-format +msgid "" +"\n" +"If these values seem acceptable, use -f to force reset.\n" +msgstr "" +"\n" +"Εάν αυτές οι τιμές φαίνονται αποδεκτές, χρησιμοποιήστε το -f για να αναγκάσετε την επαναφορά.\n" + +#: pg_resetwal.c:513 +#, c-format +msgid "" +"The database server was not shut down cleanly.\n" +"Resetting the write-ahead log might cause data to be lost.\n" +"If you want to proceed anyway, use -f to force reset.\n" +msgstr "" +"Ο διακομιστής βάσης δεδομένων δεν τερματίστηκε με καθαρά.\n" +"Η επαναφορά του write-ahead log ενδέχεται να προκαλέσει απώλεια δεδομένων.\n" +"Εάν θέλετε να προχωρήσετε ούτως ή άλλως, χρησιμοποιήστε -f για να αναγκάσετε την επαναφορά.\n" + +#: pg_resetwal.c:527 +#, c-format +msgid "Write-ahead log reset\n" +msgstr "Επαναφορά write-ahead log\n" + +#: pg_resetwal.c:562 +#, c-format +msgid "unexpected empty file \"%s\"" +msgstr "μη αναμενόμενο κενό αρχείο «%s»" + +#: pg_resetwal.c:564 pg_resetwal.c:620 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: %m" + +#: pg_resetwal.c:573 +#, c-format +msgid "data directory is of wrong version" +msgstr "ο κατάλογος δεδομένων είναι εσφαλμένης έκδοσης" + +#: pg_resetwal.c:574 +#, c-format +msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." +msgstr "Το αρχείο «%s» περιέχει «%s», το οποίο δεν είναι συμβατό με την έκδοση «%s» αυτού του προγράμματος." + +#: pg_resetwal.c:607 +#, c-format +msgid "" +"If you are sure the data directory path is correct, execute\n" +" touch %s\n" +"and try again." +msgstr "" +"Εάν είστε βέβαιοι ότι η διαδρομή καταλόγου δεδομένων είναι σωστή, εκτελέστε\n" +" touch %s\n" +"και προσπάθησε ξανά." + +#: pg_resetwal.c:638 +#, c-format +msgid "pg_control exists but has invalid CRC; proceed with caution" +msgstr "pg_control υπάρχει αλλά δεν έχει έγκυρο CRC· προχωρήστε με προσοχή" + +#: pg_resetwal.c:647 +#, c-format +msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" +msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" +msgstr[0] "pg_control καθορίζει το μη έγκυρο μέγεθος τμήματος WAL (%d byte)· προχωρήστε με προσοχή" +msgstr[1] "pg_control καθορίζει το μη έγκυρο μέγεθος τμήματος WAL (%d bytes)· προχωρήστε με προσοχή" + +#: pg_resetwal.c:658 +#, c-format +msgid "pg_control exists but is broken or wrong version; ignoring it" +msgstr "pg_control υπάρχει, αλλά είναι κατεστραμμένη ή λάθος έκδοση· παραβλέπεται" + +#: pg_resetwal.c:753 +#, c-format +msgid "" +"Guessed pg_control values:\n" +"\n" +msgstr "" +"Μάντεψε τιμές pg_control:\n" +"\n" + +#: pg_resetwal.c:755 +#, c-format +msgid "" +"Current pg_control values:\n" +"\n" +msgstr "" +"Τρέχουσες τιμές pg_control:\n" +"\n" + +#: pg_resetwal.c:757 +#, c-format +msgid "pg_control version number: %u\n" +msgstr "" +"pg_control αριθμός έκδοσης: %u\n" +"\n" + +#: pg_resetwal.c:759 +#, c-format +msgid "Catalog version number: %u\n" +msgstr "Αριθμός έκδοσης καταλόγου: %u\n" + +#: pg_resetwal.c:761 +#, c-format +msgid "Database system identifier: %llu\n" +msgstr "Αναγνωριστικό συστήματος βάσης δεδομένων: %llu\n" + +#: pg_resetwal.c:763 +#, c-format +msgid "Latest checkpoint's TimeLineID: %u\n" +msgstr "Πιο πρόσφατο TimeLineID του σημείου ελέγχου: %u\n" + +#: pg_resetwal.c:765 +#, c-format +msgid "Latest checkpoint's full_page_writes: %s\n" +msgstr "Πιο πρόσφατο full_page_writes του σημείου ελέγχου: %s\n" + +#: pg_resetwal.c:766 +msgid "off" +msgstr "κλειστό" + +#: pg_resetwal.c:766 +msgid "on" +msgstr "ανοικτό" + +#: pg_resetwal.c:767 +#, c-format +msgid "Latest checkpoint's NextXID: %u:%u\n" +msgstr "Πιο πρόσφατο NextXID του σημείου ελέγχου: %u:%u\n" + +#: pg_resetwal.c:770 +#, c-format +msgid "Latest checkpoint's NextOID: %u\n" +msgstr "Πιο πρόσφατο NextOID του σημείου ελέγχου: %u\n" + +#: pg_resetwal.c:772 +#, c-format +msgid "Latest checkpoint's NextMultiXactId: %u\n" +msgstr "Πιο πρόσφατο NextMultiXactId του σημείου ελέγχου: %u\n" + +#: pg_resetwal.c:774 +#, c-format +msgid "Latest checkpoint's NextMultiOffset: %u\n" +msgstr "Πιο πρόσφατο NextMultiOffset του σημείου ελέγχου: %u\n" + +#: pg_resetwal.c:776 +#, c-format +msgid "Latest checkpoint's oldestXID: %u\n" +msgstr "Πιο πρόσφατο oldestXID του σημείου ελέγχου: %u\n" + +#: pg_resetwal.c:778 +#, c-format +msgid "Latest checkpoint's oldestXID's DB: %u\n" +msgstr "Πιο πρόσφατο oldestXID’s DB του σημείου ελέγχου: %u\n" + +#: pg_resetwal.c:780 +#, c-format +msgid "Latest checkpoint's oldestActiveXID: %u\n" +msgstr "Πιο πρόσφατο oldestActiveXID του σημείου ελέγχου: %u\n" + +#: pg_resetwal.c:782 +#, c-format +msgid "Latest checkpoint's oldestMultiXid: %u\n" +msgstr "Πιο πρόσφατο oldestMultiXid του σημείου ελέγχου: %u\n" + +#: pg_resetwal.c:784 +#, c-format +msgid "Latest checkpoint's oldestMulti's DB: %u\n" +msgstr "Πιο πρόσφατο oldestMulti’s DB του σημείου ελέγχου: %u\n" + +#: pg_resetwal.c:786 +#, c-format +msgid "Latest checkpoint's oldestCommitTsXid:%u\n" +msgstr "Πιο πρόσφατο oldestCommitTsXid του σημείου ελέγχου: %u\n" + +#: pg_resetwal.c:788 +#, c-format +msgid "Latest checkpoint's newestCommitTsXid:%u\n" +msgstr "Πιο πρόσφατο newestCommitTsXid του σημείου ελέγχου: %u\n" + +#: pg_resetwal.c:790 +#, c-format +msgid "Maximum data alignment: %u\n" +msgstr "Μέγιστη στοίχιση δεδομένων: %u\n" + +#: pg_resetwal.c:793 +#, c-format +msgid "Database block size: %u\n" +msgstr "Μέγεθος μπλοκ βάσης δεδομένων: %u\n" + +#: pg_resetwal.c:795 +#, c-format +msgid "Blocks per segment of large relation: %u\n" +msgstr "Μπλοκ ανά τμήμα μεγάλης σχέσης: %u\n" + +#: pg_resetwal.c:797 +#, c-format +msgid "WAL block size: %u\n" +msgstr "Μέγεθος μπλοκ WAL: %u\n" + +#: pg_resetwal.c:799 pg_resetwal.c:885 +#, c-format +msgid "Bytes per WAL segment: %u\n" +msgstr "Bytes ανά τμήμα WAL: %u\n" + +#: pg_resetwal.c:801 +#, c-format +msgid "Maximum length of identifiers: %u\n" +msgstr "Μέγιστο μήκος αναγνωριστικών: %u\n" + +#: pg_resetwal.c:803 +#, c-format +msgid "Maximum columns in an index: %u\n" +msgstr "Μέγιστες στήλες σε ένα ευρετήριο: %u\n" + +#: pg_resetwal.c:805 +#, c-format +msgid "Maximum size of a TOAST chunk: %u\n" +msgstr "Μέγιστο μέγεθος ενός τμήματος TOAST: %u\n" + +#: pg_resetwal.c:807 +#, c-format +msgid "Size of a large-object chunk: %u\n" +msgstr "Μέγεθος τμήματος μεγάλου αντικειμένου: %u\n" + +#: pg_resetwal.c:810 +#, c-format +msgid "Date/time type storage: %s\n" +msgstr "Τύπος αποθήκευσης ημερομηνίας/ώρας: %s\n" + +#: pg_resetwal.c:811 +msgid "64-bit integers" +msgstr "Ακέραιοι 64-bit" + +#: pg_resetwal.c:812 +#, c-format +msgid "Float8 argument passing: %s\n" +msgstr "Μεταβλητή Float8 τέθηκε: %s\n" + +#: pg_resetwal.c:813 +msgid "by reference" +msgstr "με αναφορά" + +#: pg_resetwal.c:813 +msgid "by value" +msgstr "με τιμή" + +#: pg_resetwal.c:814 +#, c-format +msgid "Data page checksum version: %u\n" +msgstr "Έκδοση αθροίσματος ελέγχου σελίδας δεδομένων: %u\n" + +#: pg_resetwal.c:828 +#, c-format +msgid "" +"\n" +"\n" +"Values to be changed:\n" +"\n" +msgstr "" +"\n" +"Τιμές προς αλλαγή:\n" +"\n" + +#: pg_resetwal.c:832 +#, c-format +msgid "First log segment after reset: %s\n" +msgstr "Πρώτο τμήμα καταγραφής μετά την επαναφορά: %s\n" + +#: pg_resetwal.c:836 +#, c-format +msgid "NextMultiXactId: %u\n" +msgstr "NextMultiXactId: %u\n" + +#: pg_resetwal.c:838 +#, c-format +msgid "OldestMultiXid: %u\n" +msgstr "OldestMultiXid: %u\n" + +#: pg_resetwal.c:840 +#, c-format +msgid "OldestMulti's DB: %u\n" +msgstr "OldestMulti’s DB: %u\n" + +#: pg_resetwal.c:846 +#, c-format +msgid "NextMultiOffset: %u\n" +msgstr "NextMultiOffset: %u\n" + +#: pg_resetwal.c:852 +#, c-format +msgid "NextOID: %u\n" +msgstr "NextOID: %u\n" + +#: pg_resetwal.c:858 +#, c-format +msgid "NextXID: %u\n" +msgstr "NextXID: %u\n" + +#: pg_resetwal.c:860 +#, c-format +msgid "OldestXID: %u\n" +msgstr "OldestXID: %u\n" + +#: pg_resetwal.c:862 +#, c-format +msgid "OldestXID's DB: %u\n" +msgstr "OldestXID’s DB: %u\n" + +#: pg_resetwal.c:868 +#, c-format +msgid "NextXID epoch: %u\n" +msgstr "NextXID epoch: %u\n" + +#: pg_resetwal.c:874 +#, c-format +msgid "oldestCommitTsXid: %u\n" +msgstr "oldestCommitTsXid: %u\n" + +#: pg_resetwal.c:879 +#, c-format +msgid "newestCommitTsXid: %u\n" +msgstr "newestCommitTsXid: %u\n" + +#: pg_resetwal.c:965 pg_resetwal.c:1033 pg_resetwal.c:1080 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m" + +#: pg_resetwal.c:1000 pg_resetwal.c:1053 pg_resetwal.c:1103 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m" + +#: pg_resetwal.c:1006 pg_resetwal.c:1059 pg_resetwal.c:1109 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m" + +#: pg_resetwal.c:1045 pg_resetwal.c:1095 +#, c-format +msgid "could not delete file \"%s\": %m" +msgstr "δεν ήταν δυνατή η αφαίρεση του αρχείου \"%s\": %m" + +#: pg_resetwal.c:1176 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %m" + +#: pg_resetwal.c:1186 pg_resetwal.c:1199 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "δεν ήταν δυνατή η εγγραφή αρχείου «%s»: %m" + +#: pg_resetwal.c:1206 +#, c-format +msgid "fsync error: %m" +msgstr "σφάλμα fsync: %m" + +#: pg_resetwal.c:1217 +#, c-format +msgid "" +"%s resets the PostgreSQL write-ahead log.\n" +"\n" +msgstr "" +"%s επαναφέρει το write-ahead log της PostgreSQL.\n" +"\n" + +#: pg_resetwal.c:1218 +#, c-format +msgid "" +"Usage:\n" +" %s [OPTION]... DATADIR\n" +"\n" +msgstr "" +"Χρήση:\n" +" %s [ΕΠΙΛΟΓΗ]… DATADIR\n" +"\n" + +#: pg_resetwal.c:1219 +#, c-format +msgid "Options:\n" +msgstr "Επιλογές:\n" + +#: pg_resetwal.c:1220 +#, c-format +msgid "" +" -c, --commit-timestamp-ids=XID,XID\n" +" set oldest and newest transactions bearing\n" +" commit timestamp (zero means no change)\n" +msgstr "" +" -c, --commit-timestamp-ids=XID,XID\n" +" ορισμός παλαιότερων και νεότερων συναλλαγών που φέρουν\n" +" χρονική σήμανση ολοκλήρωσης (μηδέν σημαίνει καμία αλλαγή)\n" + +#: pg_resetwal.c:1223 +#, c-format +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]DATADIR κατάλογος δεδομένων\n" + +#: pg_resetwal.c:1224 +#, c-format +msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" +msgstr " -e, --epoch=XIDEPOCH όρισε την εποχή του επόμενου αναγνωριστικού συναλλαγής\n" + +#: pg_resetwal.c:1225 +#, c-format +msgid " -f, --force force update to be done\n" +msgstr " -f, --force επέβαλλε την ενημέρωση\n" + +#: pg_resetwal.c:1226 +#, c-format +msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" +msgstr " -l, --next-wal-file=WALFILE όρισε την ελάχιστη θέση εκκίνησης του νέου WAL\n" + +#: pg_resetwal.c:1227 +#, c-format +msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" +msgstr " -m, --multixact-ids=MXID,MXID όρισε το επόμενο και παλαιότερο αναγνωριστικό πολλαπλής συναλλαγής\n" + +#: pg_resetwal.c:1228 +#, c-format +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr " -n, --dry-run καμία ενημέρωση, απλά εμφάνισε τι θα συνέβαινε\n" + +#: pg_resetwal.c:1229 +#, c-format +msgid " -o, --next-oid=OID set next OID\n" +msgstr " -o, --next-oid=OID όρισε το επόμενο OID\n" + +#: pg_resetwal.c:1230 +#, c-format +msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" +msgstr " -O, --multixact-offset=OFFSET όρισε την επόμενη μετατόπιση πολλαπλής συναλλαγής\n" + +#: pg_resetwal.c:1231 +#, c-format +msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" +msgstr " -x, --next-transaction-id=XID όρισε το επόμενο αναγνωριστικό συναλλαγής\n" + +#: pg_resetwal.c:1232 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" + +#: pg_resetwal.c:1233 +#, c-format +msgid " -x, --next-transaction-id=XID set next transaction ID\n" +msgstr " -x, --next-transaction-id=XID όρισε το επόμενο αναγνωριστικό συναλλαγής\n" + +#: pg_resetwal.c:1234 +#, c-format +msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" +msgstr " --wal-segsize=SIZE μέγεθος των τμημάτων WAL, σε megabytes\n" + +#: pg_resetwal.c:1235 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" + +#: pg_resetwal.c:1236 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Υποβάλετε αναφορές σφάλματων σε <%s>.\n" + +#: pg_resetwal.c:1237 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s αρχική σελίδα: <%s>\n" + +#~ msgid " -?, --help show this help, then exit\n" +#~ msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" + +#~ msgid " -V, --version output version information, then exit\n" +#~ msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" + +#~ msgid "transaction ID (-x) must not be 0" +#~ msgstr "το αναγνωριστικό συναλλαγής (-x) δεν πρέπει να είναι 0" diff --git a/src/bin/pg_resetwal/po/es.po b/src/bin/pg_resetwal/po/es.po index 4403bc0908..5857eea54a 100644 --- a/src/bin/pg_resetwal/po/es.po +++ b/src/bin/pg_resetwal/po/es.po @@ -1,6 +1,6 @@ # Spanish message translation file for pg_resetwal # -# Copyright (c) 2003-2019, PostgreSQL Global Development Group +# Copyright (c) 2003-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Ivan Hernandez , 2003. @@ -10,30 +10,30 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_resetwal (PostgreSQL) 12\n" +"Project-Id-Version: pg_resetwal (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-13 10:46+0000\n" -"PO-Revision-Date: 2019-06-06 17:24-0400\n" +"POT-Creation-Date: 2021-10-13 22:16+0000\n" +"PO-Revision-Date: 2021-10-14 10:01-0500\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: BlackCAT 1.1\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "fatal: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "error: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "precaución: " @@ -79,111 +79,117 @@ msgid "could not get exit code from subprocess: error code %lu" msgstr "no se pudo obtener el código de salida del subproceso»: código de error %lu" #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:160 pg_resetwal.c:175 pg_resetwal.c:190 pg_resetwal.c:197 -#: pg_resetwal.c:221 pg_resetwal.c:236 pg_resetwal.c:244 pg_resetwal.c:269 -#: pg_resetwal.c:283 +#: pg_resetwal.c:162 pg_resetwal.c:177 pg_resetwal.c:192 pg_resetwal.c:207 +#: pg_resetwal.c:214 pg_resetwal.c:238 pg_resetwal.c:253 pg_resetwal.c:261 +#: pg_resetwal.c:286 pg_resetwal.c:300 #, c-format msgid "invalid argument for option %s" msgstr "argumento no válido para la opción %s" -#: pg_resetwal.c:161 pg_resetwal.c:176 pg_resetwal.c:191 pg_resetwal.c:198 -#: pg_resetwal.c:222 pg_resetwal.c:237 pg_resetwal.c:245 pg_resetwal.c:270 -#: pg_resetwal.c:284 pg_resetwal.c:310 pg_resetwal.c:323 pg_resetwal.c:331 +#: pg_resetwal.c:163 pg_resetwal.c:178 pg_resetwal.c:193 pg_resetwal.c:208 +#: pg_resetwal.c:215 pg_resetwal.c:239 pg_resetwal.c:254 pg_resetwal.c:262 +#: pg_resetwal.c:287 pg_resetwal.c:301 pg_resetwal.c:327 pg_resetwal.c:340 +#: pg_resetwal.c:348 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Prueba con «%s --help» para más información\n" -#: pg_resetwal.c:166 +#: pg_resetwal.c:168 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "el «epoch» de ID de transacción (-e) no debe ser -1" -#: pg_resetwal.c:181 +#: pg_resetwal.c:183 #, c-format -msgid "transaction ID (-x) must not be 0" -msgstr "el ID de transacción (-x) no debe ser 0" +msgid "oldest transaction ID (-u) must be greater than or equal to %u" +msgstr "el ID de transacción más antiguo (-u) debe ser mayor o igual a %u" -#: pg_resetwal.c:205 pg_resetwal.c:212 +#: pg_resetwal.c:198 +#, c-format +msgid "transaction ID (-x) must be greater than or equal to %u" +msgstr "el ID de transacción (-x) debe ser mayor o igual a %u" + +#: pg_resetwal.c:222 pg_resetwal.c:229 #, c-format msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" msgstr "el ID de transacción (-c) debe ser 0 o bien mayor o igual a 2" -#: pg_resetwal.c:227 +#: pg_resetwal.c:244 #, c-format msgid "OID (-o) must not be 0" msgstr "OID (-o) no debe ser cero" -#: pg_resetwal.c:250 +#: pg_resetwal.c:267 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "el ID de multitransacción (-m) no debe ser 0" -#: pg_resetwal.c:260 +#: pg_resetwal.c:277 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "el ID de multitransacción más antiguo (-m) no debe ser 0" -#: pg_resetwal.c:275 +#: pg_resetwal.c:292 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "la posición de multitransacción (-O) no debe ser -1" -#: pg_resetwal.c:299 +#: pg_resetwal.c:316 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "el argumento de --wal-segsize debe ser un número" -#: pg_resetwal.c:304 +#: pg_resetwal.c:321 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "el argumento de --wal-segsize debe ser una potencia de 2 entre 1 y 1024" -#: pg_resetwal.c:321 +#: pg_resetwal.c:338 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: pg_resetwal.c:330 +#: pg_resetwal.c:347 #, c-format msgid "no data directory specified" msgstr "directorio de datos no especificado" -#: pg_resetwal.c:344 +#: pg_resetwal.c:361 #, c-format msgid "cannot be executed by \"root\"" msgstr "no puede ser ejecutado con el usuario «root»" -#: pg_resetwal.c:345 +#: pg_resetwal.c:362 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Debe ejecutar %s con el superusuario de PostgreSQL." -#: pg_resetwal.c:356 +#: pg_resetwal.c:373 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "no se pudo obtener los permisos del directorio «%s»: %m" -#: pg_resetwal.c:365 +#: pg_resetwal.c:382 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "no se pudo cambiar al directorio «%s»: %m" -#: pg_resetwal.c:381 pg_resetwal.c:544 pg_resetwal.c:595 +#: pg_resetwal.c:398 pg_resetwal.c:553 pg_resetwal.c:604 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "no se pudo abrir archivo «%s» para lectura: %m" -#: pg_resetwal.c:388 +#: pg_resetwal.c:405 #, c-format msgid "lock file \"%s\" exists" msgstr "el archivo candado «%s» existe" -#: pg_resetwal.c:389 +#: pg_resetwal.c:406 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "¿Hay un servidor corriendo? Si no, borre el archivo candado e inténtelo de nuevo." -#: pg_resetwal.c:492 +#: pg_resetwal.c:501 #, c-format msgid "" "\n" @@ -192,7 +198,7 @@ msgstr "" "\n" "Si estos valores parecen aceptables, use -f para forzar reinicio.\n" -#: pg_resetwal.c:504 +#: pg_resetwal.c:513 #, c-format msgid "" "The database server was not shut down cleanly.\n" @@ -203,32 +209,32 @@ msgstr "" "Restablecer el WAL puede causar pérdida de datos.\n" "Si quiere continuar de todas formas, use -f para forzar el restablecimiento.\n" -#: pg_resetwal.c:518 +#: pg_resetwal.c:527 #, c-format msgid "Write-ahead log reset\n" msgstr "«Write-ahead log» restablecido\n" -#: pg_resetwal.c:553 +#: pg_resetwal.c:562 #, c-format msgid "unexpected empty file \"%s\"" msgstr "archivo vacío inesperado «%s»" -#: pg_resetwal.c:555 pg_resetwal.c:611 +#: pg_resetwal.c:564 pg_resetwal.c:620 #, c-format msgid "could not read file \"%s\": %m" msgstr "no se pudo leer el archivo «%s»: %m" -#: pg_resetwal.c:564 +#: pg_resetwal.c:573 #, c-format msgid "data directory is of wrong version" msgstr "el directorio de datos tiene la versión equivocada" -#: pg_resetwal.c:565 +#: pg_resetwal.c:574 #, c-format msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." msgstr "El archivo «%s» contiene «%s», que no es compatible con la versión «%s» de este programa." -#: pg_resetwal.c:598 +#: pg_resetwal.c:607 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" @@ -239,24 +245,24 @@ msgstr "" " touch %s\n" "y pruebe de nuevo." -#: pg_resetwal.c:629 +#: pg_resetwal.c:638 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "existe pg_control pero tiene un CRC no válido, proceda con precaución" -#: pg_resetwal.c:638 +#: pg_resetwal.c:647 #, c-format msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" msgstr[0] "pg_control especifica un tamaño de segmento de WAL no válido (%d byte), proceda con precaución" msgstr[1] "pg_control especifica un tamaño de segmento de WAL no válido (%d bytes), proceda con precaución" -#: pg_resetwal.c:649 +#: pg_resetwal.c:658 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "existe pg_control pero está roto o tiene la versión equivocada; ignorándolo" -#: pg_resetwal.c:744 +#: pg_resetwal.c:753 #, c-format msgid "" "Guessed pg_control values:\n" @@ -265,7 +271,7 @@ msgstr "" "Valores de pg_control asumidos:\n" "\n" -#: pg_resetwal.c:746 +#: pg_resetwal.c:755 #, c-format msgid "" "Current pg_control values:\n" @@ -274,167 +280,167 @@ msgstr "" "Valores actuales de pg_control:\n" "\n" -#: pg_resetwal.c:748 +#: pg_resetwal.c:757 #, c-format msgid "pg_control version number: %u\n" msgstr "Número de versión de pg_control: %u\n" -#: pg_resetwal.c:750 +#: pg_resetwal.c:759 #, c-format msgid "Catalog version number: %u\n" msgstr "Número de versión de catálogo: %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:761 #, c-format msgid "Database system identifier: %llu\n" msgstr "Identificador de sistema: %llu\n" -#: pg_resetwal.c:754 +#: pg_resetwal.c:763 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "TimeLineID del checkpoint más reciente: %u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:765 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "full_page_writes del checkpoint más reciente: %s\n" -#: pg_resetwal.c:757 +#: pg_resetwal.c:766 msgid "off" msgstr "desactivado" -#: pg_resetwal.c:757 +#: pg_resetwal.c:766 msgid "on" msgstr "activado" -#: pg_resetwal.c:758 +#: pg_resetwal.c:767 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID del checkpoint más reciente: %u:%u\n" -#: pg_resetwal.c:761 +#: pg_resetwal.c:770 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID del checkpoint más reciente: %u\n" -#: pg_resetwal.c:763 +#: pg_resetwal.c:772 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId del checkpoint más reciente: %u\n" -#: pg_resetwal.c:765 +#: pg_resetwal.c:774 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset del checkpoint más reciente: %u\n" -#: pg_resetwal.c:767 +#: pg_resetwal.c:776 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID del checkpoint más reciente: %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:778 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "BD del oldestXID del checkpoint más reciente: %u\n" -#: pg_resetwal.c:771 +#: pg_resetwal.c:780 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID del checkpoint más reciente: %u\n" -#: pg_resetwal.c:773 +#: pg_resetwal.c:782 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid del checkpoint más reciente: %u\n" -#: pg_resetwal.c:775 +#: pg_resetwal.c:784 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "BD del oldestMultiXid del checkpt. más reciente: %u\n" -#: pg_resetwal.c:777 +#: pg_resetwal.c:786 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid del último checkpoint: %u\n" -#: pg_resetwal.c:779 +#: pg_resetwal.c:788 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid del último checkpoint: %u\n" -#: pg_resetwal.c:781 +#: pg_resetwal.c:790 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Máximo alineamiento de datos: %u\n" -#: pg_resetwal.c:784 +#: pg_resetwal.c:793 #, c-format msgid "Database block size: %u\n" msgstr "Tamaño del bloque de la base de datos: %u\n" -#: pg_resetwal.c:786 +#: pg_resetwal.c:795 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Bloques por segmento de relación grande: %u\n" -#: pg_resetwal.c:788 +#: pg_resetwal.c:797 #, c-format msgid "WAL block size: %u\n" msgstr "Tamaño del bloque de WAL: %u\n" -#: pg_resetwal.c:790 pg_resetwal.c:876 +#: pg_resetwal.c:799 pg_resetwal.c:885 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Bytes por segmento WAL: %u\n" -#: pg_resetwal.c:792 +#: pg_resetwal.c:801 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Longitud máxima de identificadores: %u\n" -#: pg_resetwal.c:794 +#: pg_resetwal.c:803 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Máximo número de columnas en un índice: %u\n" -#: pg_resetwal.c:796 +#: pg_resetwal.c:805 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Longitud máxima de un trozo TOAST: %u\n" -#: pg_resetwal.c:798 +#: pg_resetwal.c:807 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Longitud máxima de un trozo de objeto grande: %u\n" -#: pg_resetwal.c:801 +#: pg_resetwal.c:810 #, c-format msgid "Date/time type storage: %s\n" msgstr "Tipo de almacenamiento hora/fecha: %s\n" -#: pg_resetwal.c:802 +#: pg_resetwal.c:811 msgid "64-bit integers" msgstr "enteros de 64 bits" -#: pg_resetwal.c:803 +#: pg_resetwal.c:812 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Paso de parámetros float8: %s\n" -#: pg_resetwal.c:804 +#: pg_resetwal.c:813 msgid "by reference" msgstr "por referencia" -#: pg_resetwal.c:804 +#: pg_resetwal.c:813 msgid "by value" msgstr "por valor" -#: pg_resetwal.c:805 +#: pg_resetwal.c:814 #, c-format msgid "Data page checksum version: %u\n" msgstr "Versión de suma de verificación de datos: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:828 #, c-format msgid "" "\n" @@ -447,102 +453,102 @@ msgstr "" "Valores a cambiar:\n" "\n" -#: pg_resetwal.c:823 +#: pg_resetwal.c:832 #, c-format msgid "First log segment after reset: %s\n" msgstr "Primer segmento de log después de reiniciar: %s\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:836 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:829 +#: pg_resetwal.c:838 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:831 +#: pg_resetwal.c:840 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "Base de datos del OldestMulti: %u\n" -#: pg_resetwal.c:837 +#: pg_resetwal.c:846 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:843 +#: pg_resetwal.c:852 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:849 +#: pg_resetwal.c:858 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:851 +#: pg_resetwal.c:860 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:853 +#: pg_resetwal.c:862 #, c-format msgid "OldestXID's DB: %u\n" msgstr "Base de datos del OldestXID: %u\n" -#: pg_resetwal.c:859 +#: pg_resetwal.c:868 #, c-format msgid "NextXID epoch: %u\n" msgstr "Epoch del NextXID: %u\n" -#: pg_resetwal.c:865 +#: pg_resetwal.c:874 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:870 +#: pg_resetwal.c:879 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:956 pg_resetwal.c:1024 pg_resetwal.c:1071 +#: pg_resetwal.c:965 pg_resetwal.c:1033 pg_resetwal.c:1080 #, c-format msgid "could not open directory \"%s\": %m" msgstr "no se pudo abrir el directorio «%s»: %m" -#: pg_resetwal.c:991 pg_resetwal.c:1044 pg_resetwal.c:1094 +#: pg_resetwal.c:1000 pg_resetwal.c:1053 pg_resetwal.c:1103 #, c-format msgid "could not read directory \"%s\": %m" msgstr "no se pudo leer el directorio «%s»: %m" -#: pg_resetwal.c:997 pg_resetwal.c:1050 pg_resetwal.c:1100 +#: pg_resetwal.c:1006 pg_resetwal.c:1059 pg_resetwal.c:1109 #, c-format msgid "could not close directory \"%s\": %m" msgstr "no se pudo abrir el directorio «%s»: %m" -#: pg_resetwal.c:1036 pg_resetwal.c:1086 +#: pg_resetwal.c:1045 pg_resetwal.c:1095 #, c-format msgid "could not delete file \"%s\": %m" msgstr "no se pudo borrar el archivo «%s»: %m" -#: pg_resetwal.c:1167 +#: pg_resetwal.c:1176 #, c-format msgid "could not open file \"%s\": %m" msgstr "no se pudo abrir el archivo «%s»: %m" -#: pg_resetwal.c:1177 pg_resetwal.c:1190 +#: pg_resetwal.c:1186 pg_resetwal.c:1199 #, c-format msgid "could not write file \"%s\": %m" msgstr "no se pudo escribir el archivo «%s»: %m" -#: pg_resetwal.c:1197 +#: pg_resetwal.c:1206 #, c-format msgid "fsync error: %m" msgstr "error de fsync: %m" -#: pg_resetwal.c:1208 +#: pg_resetwal.c:1217 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" @@ -551,7 +557,7 @@ msgstr "" "%s restablece el WAL («write-ahead log») de PostgreSQL.\n" "\n" -#: pg_resetwal.c:1209 +#: pg_resetwal.c:1218 #, c-format msgid "" "Usage:\n" @@ -562,93 +568,100 @@ msgstr "" " %s [OPCIÓN]... DATADIR\n" "\n" -#: pg_resetwal.c:1210 +#: pg_resetwal.c:1219 #, c-format msgid "Options:\n" msgstr "Opciones:\n" -#: pg_resetwal.c:1211 +#: pg_resetwal.c:1220 #, c-format msgid "" " -c, --commit-timestamp-ids=XID,XID\n" -" set oldest and newest transactions bearing\n" -" commit timestamp (zero means no change)\n" +" set oldest and newest transactions bearing\n" +" commit timestamp (zero means no change)\n" msgstr "" " -c, --commit-timestamp-ids=XID,XID\n" " definir la más antigua y la más nueva transacciones\n" " que llevan timestamp de commit (cero significa no\n" " cambiar)\n" -#: pg_resetwal.c:1214 +#: pg_resetwal.c:1223 #, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" +msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]DATADIR directorio de datos\n" -#: pg_resetwal.c:1215 +#: pg_resetwal.c:1224 #, c-format -msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" +msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" msgstr " -e, --epoch=XIDEPOCH asigna el siguiente «epoch» de ID de transacción\n" -#: pg_resetwal.c:1216 +#: pg_resetwal.c:1225 #, c-format -msgid " -f, --force force update to be done\n" +msgid " -f, --force force update to be done\n" msgstr " -f, --force fuerza que la actualización sea hecha\n" -#: pg_resetwal.c:1217 +#: pg_resetwal.c:1226 #, c-format -msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" +msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" msgstr "" " -l, --next-wal-file=ARCHIVOWAL\n" " fuerza una ubicación inicial mínima para nuevo WAL\n" -#: pg_resetwal.c:1218 +#: pg_resetwal.c:1227 #, c-format -msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" +msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" msgstr "" " -m, --multixact-ids=MXID,MXID\n" " asigna el siguiente ID de multitransacción y\n" " el más antiguo\n" -#: pg_resetwal.c:1219 +#: pg_resetwal.c:1228 #, c-format -msgid " -n, --dry-run no update, just show what would be done\n" +msgid " -n, --dry-run no update, just show what would be done\n" msgstr " -n, --dry-run no actualiza, sólo muestra lo que se haría\n" -#: pg_resetwal.c:1220 +#: pg_resetwal.c:1229 #, c-format -msgid " -o, --next-oid=OID set next OID\n" +msgid " -o, --next-oid=OID set next OID\n" msgstr " -o, --next-oid=OID asigna el siguiente OID\n" -#: pg_resetwal.c:1221 +#: pg_resetwal.c:1230 #, c-format -msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" +msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" msgstr "" " -O, --multixact-offset=OFFSET\n" " asigna la siguiente posición de multitransacción\n" -#: pg_resetwal.c:1222 +#: pg_resetwal.c:1231 #, c-format -msgid " -V, --version output version information, then exit\n" +msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" +msgstr "" +" -u, --oldest-transaction-id=XID\n" +" asigna el ID de transacción más antiguo\n" + +#: pg_resetwal.c:1232 +#, c-format +msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión y salir\n" -#: pg_resetwal.c:1223 +#: pg_resetwal.c:1233 #, c-format -msgid " -x, --next-transaction-id=XID set next transaction ID\n" +msgid " -x, --next-transaction-id=XID set next transaction ID\n" msgstr "" " -x, --next-transaction-id=XID\n" " asigna el siguiente ID de transacción\n" -#: pg_resetwal.c:1224 +#: pg_resetwal.c:1234 #, c-format -msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" +msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=TAMAÑO tamaño de segmentos de WAL, en megabytes\n" -#: pg_resetwal.c:1225 +#: pg_resetwal.c:1235 #, c-format -msgid " -?, --help show this help, then exit\n" +msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: pg_resetwal.c:1226 +#: pg_resetwal.c:1236 #, c-format msgid "" "\n" @@ -657,7 +670,16 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: pg_resetwal.c:1227 +#: pg_resetwal.c:1237 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" + +#~ msgid "transaction ID (-x) must not be 0" +#~ msgstr "el ID de transacción (-x) no debe ser 0" + +#~ msgid " -V, --version output version information, then exit\n" +#~ msgstr " -V, --version mostrar información de versión y salir\n" + +#~ msgid " -?, --help show this help, then exit\n" +#~ msgstr " -?, --help mostrar esta ayuda y salir\n" diff --git a/src/bin/pg_resetwal/po/fr.po b/src/bin/pg_resetwal/po/fr.po index 4ebf78caa8..1010616c30 100644 --- a/src/bin/pg_resetwal/po/fr.po +++ b/src/bin/pg_resetwal/po/fr.po @@ -1,40 +1,48 @@ -# translation of pg_resetxlog.po to fr_fr -# french message translation file for pg_resetxlog +# LANGUAGE message translation file for pg_resetwal +# Copyright (C) 2003-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_resetwal (PostgreSQL) package. # # Use these quotes: « %s » # # Guillaume Lelarge , 2003-2009. # Stéphane Schildknecht , 2009. +# Guillaume Lelarge , 2010-2022. +# msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-16 06:16+0000\n" -"PO-Revision-Date: 2020-04-16 14:06+0200\n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" "Last-Translator: Guillaume Lelarge \n" -"Language-Team: PostgreSQLfr \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.3\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatal : " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:273 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:280 #, c-format msgid "warning: " msgstr "attention : " +#: ../../../src/common/logging.c:291 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:298 +#, c-format +msgid "hint: " +msgstr "astuce : " + #: ../../common/restricted_token.c:64 #, c-format msgid "could not load library \"%s\": error code %lu" @@ -70,117 +78,123 @@ msgstr "n'a pas pu démarrer le processus pour la commande « %s » : code d'err msgid "could not re-execute with restricted token: error code %lu" msgstr "n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu" #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:160 pg_resetwal.c:175 pg_resetwal.c:190 pg_resetwal.c:197 -#: pg_resetwal.c:221 pg_resetwal.c:236 pg_resetwal.c:244 pg_resetwal.c:269 -#: pg_resetwal.c:283 +#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202 +#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249 +#: pg_resetwal.c:269 pg_resetwal.c:280 #, c-format msgid "invalid argument for option %s" msgstr "argument invalide pour l'option %s" -#: pg_resetwal.c:161 pg_resetwal.c:176 pg_resetwal.c:191 pg_resetwal.c:198 -#: pg_resetwal.c:222 pg_resetwal.c:237 pg_resetwal.c:245 pg_resetwal.c:270 -#: pg_resetwal.c:284 pg_resetwal.c:310 pg_resetwal.c:323 pg_resetwal.c:331 +#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 +#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 +#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316 +#: pg_resetwal.c:323 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Essayer « %s --help » pour plus d'informations.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_resetwal.c:166 +#: pg_resetwal.c:168 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "la valeur epoch de l'identifiant de transaction (-e) ne doit pas être -1" #: pg_resetwal.c:181 #, c-format -msgid "transaction ID (-x) must not be 0" -msgstr "l'identifiant de la transaction (-x) ne doit pas être 0" +msgid "oldest transaction ID (-u) must be greater than or equal to %u" +msgstr "l'identifiant de transaction le plus ancien (-u) doit être supérieur ou égal à %u" -#: pg_resetwal.c:205 pg_resetwal.c:212 +#: pg_resetwal.c:194 +#, c-format +msgid "transaction ID (-x) must be greater than or equal to %u" +msgstr "l'identifiant de transaction (-x) doit être supérieur ou égal à %u" + +#: pg_resetwal.c:216 pg_resetwal.c:220 #, c-format msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" msgstr "l'identifiant de transaction (-c) doit être 0 ou supérieur ou égal à 2" -#: pg_resetwal.c:227 +#: pg_resetwal.c:233 #, c-format msgid "OID (-o) must not be 0" msgstr "l'OID (-o) ne doit pas être 0" -#: pg_resetwal.c:250 +#: pg_resetwal.c:254 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "l'identifiant de multi-transaction (-m) ne doit pas être 0" -#: pg_resetwal.c:260 +#: pg_resetwal.c:261 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "l'identifiant de multi-transaction le plus ancien (-m) ne doit pas être 0" -#: pg_resetwal.c:275 +#: pg_resetwal.c:274 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "le décalage de multi-transaction (-O) ne doit pas être -1" -#: pg_resetwal.c:299 +#: pg_resetwal.c:296 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "l'argument de --wal-segsize doit être un nombre" -#: pg_resetwal.c:304 +#: pg_resetwal.c:298 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "l'argument de --wal-segsize doit être une puissance de 2 comprise entre 1 et 1024" -#: pg_resetwal.c:321 +#: pg_resetwal.c:314 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_resetwal.c:330 +#: pg_resetwal.c:322 #, c-format msgid "no data directory specified" msgstr "aucun répertoire de données indiqué" -#: pg_resetwal.c:344 +#: pg_resetwal.c:336 #, c-format msgid "cannot be executed by \"root\"" msgstr "ne peut pas être exécuté par « root »" -#: pg_resetwal.c:345 +#: pg_resetwal.c:337 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Vous devez exécuter %s en tant que super-utilisateur PostgreSQL." -#: pg_resetwal.c:356 +#: pg_resetwal.c:347 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "n'a pas pu lire les droits du répertoire « %s » : %m" -#: pg_resetwal.c:365 +#: pg_resetwal.c:353 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "n'a pas pu modifier le répertoire par « %s » : %m" -#: pg_resetwal.c:381 pg_resetwal.c:544 pg_resetwal.c:595 +#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" -#: pg_resetwal.c:388 +#: pg_resetwal.c:371 #, c-format msgid "lock file \"%s\" exists" msgstr "le fichier verrou « %s » existe" -#: pg_resetwal.c:389 +#: pg_resetwal.c:372 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "Le serveur est-il démarré ? Sinon, supprimer le fichier verrou et réessayer." -#: pg_resetwal.c:492 +#: pg_resetwal.c:467 #, c-format msgid "" "\n" @@ -190,7 +204,7 @@ msgstr "" "Si ces valeurs semblent acceptables, utiliser -f pour forcer la\n" "réinitialisation.\n" -#: pg_resetwal.c:504 +#: pg_resetwal.c:479 #, c-format msgid "" "The database server was not shut down cleanly.\n" @@ -203,32 +217,32 @@ msgstr "" "Pour continuer malgré tout, utiliser -f pour forcer la\n" "réinitialisation.\n" -#: pg_resetwal.c:518 +#: pg_resetwal.c:493 #, c-format msgid "Write-ahead log reset\n" msgstr "Réinitialisation des journaux de transactions\n" -#: pg_resetwal.c:553 +#: pg_resetwal.c:525 #, c-format msgid "unexpected empty file \"%s\"" msgstr "fichier vide inattendu « %s »" -#: pg_resetwal.c:555 pg_resetwal.c:611 +#: pg_resetwal.c:527 pg_resetwal.c:581 #, c-format msgid "could not read file \"%s\": %m" msgstr "n'a pas pu lire le fichier « %s » : %m" -#: pg_resetwal.c:564 +#: pg_resetwal.c:535 #, c-format msgid "data directory is of wrong version" msgstr "le répertoire des données a une mauvaise version" -#: pg_resetwal.c:565 +#: pg_resetwal.c:536 #, c-format msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." msgstr "Le fichier « %s » contient « %s », qui n'est pas compatible avec la version « %s » de ce programme." -#: pg_resetwal.c:598 +#: pg_resetwal.c:569 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" @@ -239,24 +253,24 @@ msgstr "" " touch %s\n" "et réessayer." -#: pg_resetwal.c:629 +#: pg_resetwal.c:597 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "pg_control existe mais son CRC est invalide ; agir avec précaution" -#: pg_resetwal.c:638 +#: pg_resetwal.c:606 #, c-format msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" msgstr[0] "pg_control spécifie une taille invalide de segment WAL (%d octet) ; agir avec précaution" msgstr[1] "pg_control spécifie une taille invalide de segment WAL (%d octets) ; agir avec précaution" -#: pg_resetwal.c:649 +#: pg_resetwal.c:617 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "pg_control existe mais est corrompu ou de mauvaise version ; ignoré" -#: pg_resetwal.c:744 +#: pg_resetwal.c:712 #, c-format msgid "" "Guessed pg_control values:\n" @@ -265,7 +279,7 @@ msgstr "" "Valeurs de pg_control devinées :\n" "\n" -#: pg_resetwal.c:746 +#: pg_resetwal.c:714 #, c-format msgid "" "Current pg_control values:\n" @@ -274,167 +288,167 @@ msgstr "" "Valeurs actuelles de pg_control :\n" "\n" -#: pg_resetwal.c:748 +#: pg_resetwal.c:716 #, c-format msgid "pg_control version number: %u\n" msgstr "Numéro de version de pg_control : %u\n" -#: pg_resetwal.c:750 +#: pg_resetwal.c:718 #, c-format msgid "Catalog version number: %u\n" msgstr "Numéro de version du catalogue : %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:720 #, c-format msgid "Database system identifier: %llu\n" msgstr "Identifiant du système de base de données : %llu\n" -#: pg_resetwal.c:754 +#: pg_resetwal.c:722 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "Dernier TimeLineID du point de contrôle : %u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:724 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "Dernier full_page_writes du point de contrôle : %s\n" -#: pg_resetwal.c:757 +#: pg_resetwal.c:725 msgid "off" msgstr "désactivé" -#: pg_resetwal.c:757 +#: pg_resetwal.c:725 msgid "on" msgstr "activé" -#: pg_resetwal.c:758 +#: pg_resetwal.c:726 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "Dernier NextXID du point de contrôle : %u:%u\n" -#: pg_resetwal.c:761 +#: pg_resetwal.c:729 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "Dernier NextOID du point de contrôle : %u\n" -#: pg_resetwal.c:763 +#: pg_resetwal.c:731 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "Dernier NextMultiXactId du point de contrôle : %u\n" -#: pg_resetwal.c:765 +#: pg_resetwal.c:733 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "Dernier NextMultiOffset du point de contrôle : %u\n" -#: pg_resetwal.c:767 +#: pg_resetwal.c:735 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "Dernier oldestXID du point de contrôle : %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:737 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "Dernier oldestXID du point de contrôle de la base : %u\n" -#: pg_resetwal.c:771 +#: pg_resetwal.c:739 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "Dernier oldestActiveXID du point de contrôle : %u\n" -#: pg_resetwal.c:773 +#: pg_resetwal.c:741 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "Dernier oldestMultiXID du point de contrôle : %u\n" -#: pg_resetwal.c:775 +#: pg_resetwal.c:743 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "Dernier oldestMulti du point de contrôle de la base : %u\n" -#: pg_resetwal.c:777 +#: pg_resetwal.c:745 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "Dernier oldestCommitTsXid du point de contrôle : %u\n" -#: pg_resetwal.c:779 +#: pg_resetwal.c:747 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "Dernier newestCommitTsXid du point de contrôle : %u\n" -#: pg_resetwal.c:781 +#: pg_resetwal.c:749 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Alignement maximal des données : %u\n" -#: pg_resetwal.c:784 +#: pg_resetwal.c:752 #, c-format msgid "Database block size: %u\n" msgstr "Taille du bloc de la base de données : %u\n" -#: pg_resetwal.c:786 +#: pg_resetwal.c:754 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Blocs par segment des relations volumineuses : %u\n" -#: pg_resetwal.c:788 +#: pg_resetwal.c:756 #, c-format msgid "WAL block size: %u\n" msgstr "Taille de bloc du journal de transaction : %u\n" -#: pg_resetwal.c:790 pg_resetwal.c:876 +#: pg_resetwal.c:758 pg_resetwal.c:844 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Octets par segment du journal de transaction : %u\n" -#: pg_resetwal.c:792 +#: pg_resetwal.c:760 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Longueur maximale des identifiants : %u\n" -#: pg_resetwal.c:794 +#: pg_resetwal.c:762 #, c-format msgid "Maximum columns in an index: %u\n" -msgstr "Nombre maximal de colonnes d'un index: %u\n" +msgstr "Nombre maximum de colonnes d'un index: %u\n" -#: pg_resetwal.c:796 +#: pg_resetwal.c:764 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Longueur maximale d'un morceau TOAST : %u\n" -#: pg_resetwal.c:798 +#: pg_resetwal.c:766 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Taille d'un morceau de Large Object : %u\n" -#: pg_resetwal.c:801 +#: pg_resetwal.c:769 #, c-format msgid "Date/time type storage: %s\n" msgstr "Stockage du type date/heure : %s\n" -#: pg_resetwal.c:802 +#: pg_resetwal.c:770 msgid "64-bit integers" msgstr "entiers 64-bits" -#: pg_resetwal.c:803 +#: pg_resetwal.c:771 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Passage d'argument float8 : %s\n" -#: pg_resetwal.c:804 +#: pg_resetwal.c:772 msgid "by reference" msgstr "par référence" -#: pg_resetwal.c:804 +#: pg_resetwal.c:772 msgid "by value" msgstr "par valeur" -#: pg_resetwal.c:805 +#: pg_resetwal.c:773 #, c-format msgid "Data page checksum version: %u\n" msgstr "Version des sommes de contrôle des pages de données : %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:787 #, c-format msgid "" "\n" @@ -447,102 +461,102 @@ msgstr "" "Valeurs à changer :\n" "\n" -#: pg_resetwal.c:823 +#: pg_resetwal.c:791 #, c-format msgid "First log segment after reset: %s\n" msgstr "Premier segment du journal après réinitialisation : %s\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:795 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:829 +#: pg_resetwal.c:797 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:831 +#: pg_resetwal.c:799 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "OldestMulti's DB: %u\n" -#: pg_resetwal.c:837 +#: pg_resetwal.c:805 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:843 +#: pg_resetwal.c:811 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:849 +#: pg_resetwal.c:817 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:851 +#: pg_resetwal.c:819 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:853 +#: pg_resetwal.c:821 #, c-format msgid "OldestXID's DB: %u\n" msgstr "OldestXID's DB: %u\n" -#: pg_resetwal.c:859 +#: pg_resetwal.c:827 #, c-format msgid "NextXID epoch: %u\n" msgstr "NextXID Epoch: %u\n" -#: pg_resetwal.c:865 +#: pg_resetwal.c:833 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:870 +#: pg_resetwal.c:838 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:956 pg_resetwal.c:1024 pg_resetwal.c:1071 +#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016 #, c-format msgid "could not open directory \"%s\": %m" msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" -#: pg_resetwal.c:991 pg_resetwal.c:1044 pg_resetwal.c:1094 +#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 #, c-format msgid "could not read directory \"%s\": %m" msgstr "n'a pas pu lire le répertoire « %s » : %m" -#: pg_resetwal.c:997 pg_resetwal.c:1050 pg_resetwal.c:1100 +#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 #, c-format msgid "could not close directory \"%s\": %m" msgstr "n'a pas pu fermer le répertoire « %s » : %m" -#: pg_resetwal.c:1036 pg_resetwal.c:1086 +#: pg_resetwal.c:990 pg_resetwal.c:1028 #, c-format msgid "could not delete file \"%s\": %m" msgstr "n'a pas pu supprimer le fichier « %s » : %m" -#: pg_resetwal.c:1167 +#: pg_resetwal.c:1100 #, c-format msgid "could not open file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier « %s » : %m" -#: pg_resetwal.c:1177 pg_resetwal.c:1190 +#: pg_resetwal.c:1108 pg_resetwal.c:1120 #, c-format msgid "could not write file \"%s\": %m" msgstr "impossible d'écrire le fichier « %s » : %m" -#: pg_resetwal.c:1197 +#: pg_resetwal.c:1125 #, c-format msgid "fsync error: %m" msgstr "erreur fsync : %m" -#: pg_resetwal.c:1208 +#: pg_resetwal.c:1134 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" @@ -551,7 +565,7 @@ msgstr "" "%s réinitialise le journal des transactions PostgreSQL.\n" "\n" -#: pg_resetwal.c:1209 +#: pg_resetwal.c:1135 #, c-format msgid "" "Usage:\n" @@ -562,88 +576,103 @@ msgstr "" " %s [OPTION]... RÉP_DONNÉES\n" "\n" -#: pg_resetwal.c:1210 +#: pg_resetwal.c:1136 #, c-format msgid "Options:\n" msgstr "Options :\n" -#: pg_resetwal.c:1211 +#: pg_resetwal.c:1137 #, c-format msgid "" " -c, --commit-timestamp-ids=XID,XID\n" -" set oldest and newest transactions bearing\n" -" commit timestamp (zero means no change)\n" +" set oldest and newest transactions bearing\n" +" commit timestamp (zero means no change)\n" msgstr "" " -c, --commit-timestamp-ids=XID,XID\n" -" configure les transactions la plus ancienne et la plus récent\n" -" contenant les dates/heures de validation (zéro signifie aucun\n" -" changement)\n" +" configure les transactions la plus ancienne\n" +" et la plus récente contenant les dates/heures\n" +" de validation (zéro signifie aucun changement)\n" -#: pg_resetwal.c:1214 +#: pg_resetwal.c:1140 #, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=] RÉPDONNEES répertoire de la base de données\n" +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]RÉP_DONNEES répertoire de la base de données\n" -#: pg_resetwal.c:1215 +#: pg_resetwal.c:1141 #, c-format -msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" +msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" msgstr "" -" -e, --epoch XIDEPOCH fixe la valeur epoch du prochain identifiant de\n" -" transaction\n" +" -e, --epoch=XIDEPOCH configure la valeur epoch du prochain\n" +" identifiant de transaction\n" -#: pg_resetwal.c:1216 +#: pg_resetwal.c:1142 #, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force force la mise à jour\n" +msgid " -f, --force force update to be done\n" +msgstr " -f, --force force la mise à jour\n" -#: pg_resetwal.c:1217 +#: pg_resetwal.c:1143 #, c-format -msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" +msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" msgstr "" -" -l, --next-wal-file=FICHIERWAL force l'emplacement minimal de début des WAL du nouveau\n" -" journal de transactions\n" +" -l, --next-wal-file=FICHIERWAL configure l'emplacement minimal de début\n" +" des WAL du nouveau journal de transactions\n" -#: pg_resetwal.c:1218 +#: pg_resetwal.c:1144 #, c-format -msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" -msgstr " -m, --multixact-ids=MXID,MXID fixe le prochain et le plus ancien identifiants multi-transaction\n" +msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" +msgstr "" +" -m, --multixact-ids=MXID,MXID configure le prochain et le plus ancien\n" +" identifiants multi-transactions\n" -#: pg_resetwal.c:1219 +#: pg_resetwal.c:1145 #, c-format -msgid " -n, --dry-run no update, just show what would be done\n" -msgstr " -n pas de mise à jour, affiche simplement ce qui sera fait\n" +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr "" +" -n, --dry-run pas de mise à jour, affiche\n" +" simplement ce qui sera fait\n" -#: pg_resetwal.c:1220 +#: pg_resetwal.c:1146 #, c-format -msgid " -o, --next-oid=OID set next OID\n" -msgstr " -o, --next-oid=OID fixe le prochain OID\n" +msgid " -o, --next-oid=OID set next OID\n" +msgstr " -o, --next-oid=OID configure le prochain OID\n" -#: pg_resetwal.c:1221 +#: pg_resetwal.c:1147 #, c-format -msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" -msgstr " -O, --multixact-offset=DÉCALAGE configure le prochain décalage multitransaction\n" +msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" +msgstr "" +" -O, --multixact-offset=DÉCALAGE configure le prochain décalage\n" +" multitransaction\n" -#: pg_resetwal.c:1222 +#: pg_resetwal.c:1148 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version, puis quitte\n" +msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" +msgstr "" +" -u, --oldest-transaction-id=XID configure l'identifiant de transaction le\n" +" plus ancien\n" -#: pg_resetwal.c:1223 +#: pg_resetwal.c:1149 #, c-format -msgid " -x, --next-transaction-id=XID set next transaction ID\n" -msgstr " -x, --next-transaction-id=XID configure le prochain identifiant de transaction\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version affiche la version puis quitte\n" -#: pg_resetwal.c:1224 +#: pg_resetwal.c:1150 #, c-format -msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" -msgstr " --wal-segsize=TAILLE taille des segments WAL, en megaoctets\n" +msgid " -x, --next-transaction-id=XID set next transaction ID\n" +msgstr "" +" -x, --next-transaction-id=XID configure le prochain identifiant de\n" +" transaction\n" -#: pg_resetwal.c:1225 +#: pg_resetwal.c:1151 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide, puis quitte\n" +msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" +msgstr " --wal-segsize=TAILLE configure la taille des segments WAL, en Mo\n" -#: pg_resetwal.c:1226 +#: pg_resetwal.c:1152 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help affiche cette aide puis quitte\n" + +#: pg_resetwal.c:1153 #, c-format msgid "" "\n" @@ -652,31 +681,47 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_resetwal.c:1227 +#: pg_resetwal.c:1154 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil %s : %s\n" +msgstr "Page d'accueil de %s : <%s>\n" -#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n" -#~ msgstr "%s : ATTENTION : ne peut pas créer les jetons restreints sur cette plateforme\n" +#~ msgid "" +#~ "\n" +#~ "Report bugs to .\n" +#~ msgstr "" +#~ "\n" +#~ "Rapporter les bogues à .\n" -#~ msgid "%s: could not open process token: error code %lu\n" -#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n" +#~ msgid " (zero in either value means no change)\n" +#~ msgstr " (zéro dans l'une des deux valeurs signifie aucun changement)\n" -#~ msgid "%s: could not allocate SIDs: error code %lu\n" -#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n" +#~ msgid " --help show this help, then exit\n" +#~ msgstr " --help affiche cette aide et quitte\n" -#~ msgid "%s: could not create restricted token: error code %lu\n" -#~ msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n" +#~ msgid " --version output version information, then exit\n" +#~ msgstr " --version afficherla version et quitte\n" -#~ msgid "%s: could not start process for command \"%s\": error code %lu\n" -#~ msgstr "%s : n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu\n" +#~ msgid " -?, --help show this help, then exit\n" +#~ msgstr " -?, --help affiche cette aide, puis quitte\n" -#~ msgid "%s: could not re-execute with restricted token: error code %lu\n" -#~ msgstr "%s : n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu\n" +#~ msgid " -?, --help show this help, then exit\n" +#~ msgstr " -?, --help affiche cette aide et quitte\n" -#~ msgid "%s: could not get exit code from subprocess: error code %lu\n" -#~ msgstr "%s : n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu\n" +#~ msgid " -V, --version output version information, then exit\n" +#~ msgstr " -V, --version affiche la version, puis quitte\n" + +#~ msgid " -V, --version output version information, then exit\n" +#~ msgstr " -V, --version affiche la version et quitte\n" + +#~ msgid " -c XID,XID set oldest and newest transactions bearing commit timestamp\n" +#~ msgstr " -c XID,XID configure la plus ancienne et la plus récente transaction\n" + +#~ msgid " -x XID set next transaction ID\n" +#~ msgstr " -x XID fixe le prochain identifiant de transaction\n" + +#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n" +#~ msgstr "%s : ATTENTION : ne peut pas créer les jetons restreints sur cette plateforme\n" #~ msgid "%s: argument of --wal-segsize must be a number\n" #~ msgstr "%s : l'argument de --wal-segsize doit être un nombre\n" @@ -684,65 +729,70 @@ msgstr "page d'accueil %s : %s\n" #~ msgid "%s: argument of --wal-segsize must be a power of 2 between 1 and 1024\n" #~ msgstr "%s : l'argument de --wal-segsize doit être une puissance de 2 entre 1 et 1024\n" -#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" -#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" - -#~ msgid "%s: no data directory specified\n" -#~ msgstr "%s : aucun répertoire de données indiqué\n" - #~ msgid "%s: cannot be executed by \"root\"\n" #~ msgstr "%s : ne peut pas être exécuté par « root »\n" -#~ msgid "%s: could not read permissions of directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire les droits sur le répertoire « %s » : %s\n" +#~ msgid "%s: could not allocate SIDs: error code %lu\n" +#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n" #~ msgid "%s: could not change directory to \"%s\": %s\n" #~ msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n" -#~ msgid "%s: could not open file \"%s\" for reading: %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n" - -#~ msgid "%s: could not read file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire le fichier « %s » : %s\n" +#~ msgid "%s: could not close directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n" #~ msgid "%s: could not create pg_control file: %s\n" #~ msgstr "%s : n'a pas pu créer le fichier pg_control : %s\n" -#~ msgid "%s: could not write pg_control file: %s\n" -#~ msgstr "%s : n'a pas pu écrire le fichier pg_control : %s\n" +#~ msgid "%s: could not create restricted token: error code %lu\n" +#~ msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n" + +#~ msgid "%s: could not delete file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu supprimer le fichier « %s » : %s\n" + +#~ msgid "%s: could not get exit code from subprocess: error code %lu\n" +#~ msgstr "%s : n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu\n" #~ msgid "%s: could not open directory \"%s\": %s\n" #~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n" +#~ msgid "%s: could not open file \"%s\" for reading: %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n" + +#~ msgid "%s: could not open file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" + +#~ msgid "%s: could not open process token: error code %lu\n" +#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n" + +#~ msgid "%s: could not re-execute with restricted token: error code %lu\n" +#~ msgstr "%s : n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu\n" + #~ msgid "%s: could not read directory \"%s\": %s\n" #~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n" -#~ msgid "%s: could not close directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n" +#~ msgid "%s: could not read file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu lire le fichier « %s » : %s\n" -#~ msgid "%s: could not delete file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu supprimer le fichier « %s » : %s\n" +#~ msgid "%s: could not read from directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n" -#~ msgid "%s: could not open file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" +#~ msgid "%s: could not read permissions of directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu lire les droits sur le répertoire « %s » : %s\n" + +#~ msgid "%s: could not start process for command \"%s\": error code %lu\n" +#~ msgstr "%s : n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu\n" #~ msgid "%s: could not write file \"%s\": %s\n" #~ msgstr "%s : n'a pas pu écrire le fichier « %s » : %s\n" -#~ msgid "Transaction log reset\n" -#~ msgstr "Réinitialisation du journal des transactions\n" - -#~ msgid "floating-point numbers" -#~ msgstr "nombres à virgule flottante" - -#~ msgid "%s: invalid argument for option -x\n" -#~ msgstr "%s : argument invalide pour l'option -x\n" - -#~ msgid "%s: invalid argument for option -o\n" -#~ msgstr "%s : argument invalide pour l'option -o\n" +#~ msgid "%s: could not write pg_control file: %s\n" +#~ msgstr "%s : n'a pas pu écrire le fichier pg_control : %s\n" -#~ msgid "%s: invalid argument for option -m\n" -#~ msgstr "%s : argument invalide pour l'option -m\n" +#~ msgid "%s: internal error -- sizeof(ControlFileData) is too large ... fix PG_CONTROL_SIZE\n" +#~ msgstr "" +#~ "%s : erreur interne -- sizeof(ControlFileData) est trop important...\n" +#~ "corrigez PG_CONTROL_SIZE\n" #~ msgid "%s: invalid argument for option -O\n" #~ msgstr "%s : argument invalide pour l'option -O\n" @@ -750,44 +800,40 @@ msgstr "page d'accueil %s : %s\n" #~ msgid "%s: invalid argument for option -l\n" #~ msgstr "%s : argument invalide pour l'option -l\n" -#~ msgid "%s: could not read from directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n" +#~ msgid "%s: invalid argument for option -m\n" +#~ msgstr "%s : argument invalide pour l'option -m\n" -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide et quitte\n" +#~ msgid "%s: invalid argument for option -o\n" +#~ msgstr "%s : argument invalide pour l'option -o\n" -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version afficherla version et quitte\n" +#~ msgid "%s: invalid argument for option -x\n" +#~ msgstr "%s : argument invalide pour l'option -x\n" -#~ msgid "First log file ID after reset: %u\n" -#~ msgstr "Premier identifiant du journal après réinitialisation : %u\n" +#~ msgid "%s: no data directory specified\n" +#~ msgstr "%s : aucun répertoire de données indiqué\n" -#~ msgid " -?, --help show this help, then exit\n" -#~ msgstr " -?, --help affiche cette aide et quitte\n" +#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" +#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" -#~ msgid " -x XID set next transaction ID\n" -#~ msgstr " -x XID fixe le prochain identifiant de transaction\n" +#~ msgid "First log file ID after reset: %u\n" +#~ msgstr "Premier identifiant du journal après réinitialisation : %u\n" -#~ msgid " -V, --version output version information, then exit\n" -#~ msgstr " -V, --version affiche la version et quitte\n" +#~ msgid "Float4 argument passing: %s\n" +#~ msgstr "Passage d'argument float4 : %s\n" -#~ msgid " (zero in either value means no change)\n" -#~ msgstr " (zéro dans l'une des deux valeurs signifie aucun changement)\n" +#~ msgid "Transaction log reset\n" +#~ msgstr "Réinitialisation du journal des transactions\n" -#~ msgid " -c XID,XID set oldest and newest transactions bearing commit timestamp\n" -#~ msgstr " -c XID,XID configure la plus ancienne et la plus récente transaction\n" +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Essayer « %s --help » pour plus d'informations.\n" -#~ msgid "%s: internal error -- sizeof(ControlFileData) is too large ... fix PG_CONTROL_SIZE\n" -#~ msgstr "" -#~ "%s : erreur interne -- sizeof(ControlFileData) est trop important...\n" -#~ "corrigez PG_CONTROL_SIZE\n" +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatal : " -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" +#~ msgid "floating-point numbers" +#~ msgstr "nombres à virgule flottante" -#~ msgid "Float4 argument passing: %s\n" -#~ msgstr "Passage d'argument float4 : %s\n" +#~ msgid "transaction ID (-x) must not be 0" +#~ msgstr "l'identifiant de la transaction (-x) ne doit pas être 0" diff --git a/src/bin/pg_resetwal/po/ja.po b/src/bin/pg_resetwal/po/ja.po index b14af6e21d..ee4df4d1ae 100644 --- a/src/bin/pg_resetwal/po/ja.po +++ b/src/bin/pg_resetwal/po/ja.po @@ -1,14 +1,18 @@ -# Japanese message translation file for pg_resetwal -# Copyright (C) 2019 PostgreSQL Global Development Group -# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. -# Shigehiro Honda , 2005 +# pg_resetwal.po +# Japanese message translation file for pg_resetwal +# +# Copyright (C) 2005-2022 PostgreSQL Global Development Group +# +# Shigehiro Honda , 2005. +# +# This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: pg_resetwal (PostgreSQL 13)\n" +"Project-Id-Version: pg_resetwal (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:55+0900\n" -"PO-Revision-Date: 2020-09-13 08:56+0200\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" +"PO-Revision-Date: 2022-05-10 14:36+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -18,21 +22,26 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:241 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " - -#: ../../../src/common/logging.c:248 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:255 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "警告: " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "ヒント: " + #: ../../common/restricted_token.c:64 #, c-format msgid "could not load library \"%s\": error code %lu" @@ -68,117 +77,123 @@ msgstr "\"%s\"コマンドのプロセスを起動できませんでした: エ msgid "could not re-execute with restricted token: error code %lu" msgstr "制限付きトークンで再実行できませんでした: %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "サブプロセスの終了コードを入手できませんでした。: エラーコード %lu" #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:160 pg_resetwal.c:175 pg_resetwal.c:190 pg_resetwal.c:197 -#: pg_resetwal.c:221 pg_resetwal.c:236 pg_resetwal.c:244 pg_resetwal.c:269 -#: pg_resetwal.c:283 +#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202 +#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249 +#: pg_resetwal.c:269 pg_resetwal.c:280 #, c-format msgid "invalid argument for option %s" msgstr "オプション%sの引数が不正です" -#: pg_resetwal.c:161 pg_resetwal.c:176 pg_resetwal.c:191 pg_resetwal.c:198 -#: pg_resetwal.c:222 pg_resetwal.c:237 pg_resetwal.c:245 pg_resetwal.c:270 -#: pg_resetwal.c:284 pg_resetwal.c:310 pg_resetwal.c:323 pg_resetwal.c:331 +#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 +#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 +#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316 +#: pg_resetwal.c:323 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "詳細は\"%s --help\"を実行してください。\n" +msgid "Try \"%s --help\" for more information." +msgstr "詳細は\"%s --help\"を実行してください。" -#: pg_resetwal.c:166 +#: pg_resetwal.c:168 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "トランザクションIDの基点(-e)は-1にはできません" #: pg_resetwal.c:181 #, c-format -msgid "transaction ID (-x) must not be 0" -msgstr "トランザクションID(-x)は0にはできません" +msgid "oldest transaction ID (-u) must be greater than or equal to %u" +msgstr "最古のトランザクションID(-u)は%uもしくはそれ以上でなければなりません" -#: pg_resetwal.c:205 pg_resetwal.c:212 +#: pg_resetwal.c:194 +#, c-format +msgid "transaction ID (-x) must be greater than or equal to %u" +msgstr "トランザクションID(-x)は%uもしくはそれ以上でなければなりません" + +#: pg_resetwal.c:216 pg_resetwal.c:220 #, c-format msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" msgstr "トランザクションID(-c)は0もしくは2以上でなければなりません" -#: pg_resetwal.c:227 +#: pg_resetwal.c:233 #, c-format msgid "OID (-o) must not be 0" msgstr "OID(-o)は0にはできません" -#: pg_resetwal.c:250 +#: pg_resetwal.c:254 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "マルチトランザクションID(-m)は0にはできません" -#: pg_resetwal.c:260 +#: pg_resetwal.c:261 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "最古のマルチトランザクションID(-m)は0にはできません" -#: pg_resetwal.c:275 +#: pg_resetwal.c:274 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "マルチトランザクションオフセット(-O)は-1にはできません" -#: pg_resetwal.c:299 +#: pg_resetwal.c:296 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "--wal-segsizの引数は数値でなければなりません" -#: pg_resetwal.c:304 +#: pg_resetwal.c:298 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "--wal-segsizeの引数は1から1024の間の2のべき乗でなければなりません" -#: pg_resetwal.c:321 +#: pg_resetwal.c:314 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")" -#: pg_resetwal.c:330 +#: pg_resetwal.c:322 #, c-format msgid "no data directory specified" msgstr "データディレクトリが指定されていません" -#: pg_resetwal.c:344 +#: pg_resetwal.c:336 #, c-format msgid "cannot be executed by \"root\"" msgstr "\"root\"では実行できません" -#: pg_resetwal.c:345 +#: pg_resetwal.c:337 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "PostgreSQLのスーパユーザで%sを実行しなければなりません" -#: pg_resetwal.c:356 +#: pg_resetwal.c:347 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "ディレクトリ\"%s\"の権限を読み取れませんでした: %m" -#: pg_resetwal.c:365 +#: pg_resetwal.c:353 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "ディレクトリ\"%s\"に移動できませんでした: %m" -#: pg_resetwal.c:381 pg_resetwal.c:544 pg_resetwal.c:595 +#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読み取り用にオープンできませんでした: %m" -#: pg_resetwal.c:388 +#: pg_resetwal.c:371 #, c-format msgid "lock file \"%s\" exists" msgstr "ロックファイル\"%s\"が存在します" -#: pg_resetwal.c:389 +#: pg_resetwal.c:372 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "サーバが稼動していませんか? そうでなければロックファイルを削除し再実行してください。" -#: pg_resetwal.c:492 +#: pg_resetwal.c:467 #, c-format msgid "" "\n" @@ -187,7 +202,7 @@ msgstr "" "\n" "この値が適切だと思われるのであれば、-fを使用して強制リセットしてください。\n" -#: pg_resetwal.c:504 +#: pg_resetwal.c:479 #, c-format msgid "" "The database server was not shut down cleanly.\n" @@ -198,32 +213,32 @@ msgstr "" "先行書き込みログのリセットにはデータ損失の恐れがあります。\n" "とにかく処理したいのであれば、-fでリセットを強制してください。\n" -#: pg_resetwal.c:518 +#: pg_resetwal.c:493 #, c-format msgid "Write-ahead log reset\n" msgstr "先行書き込みログがリセットされました\n" -#: pg_resetwal.c:553 +#: pg_resetwal.c:525 #, c-format msgid "unexpected empty file \"%s\"" msgstr "想定外の空のファイル\"%s\"" -#: pg_resetwal.c:555 pg_resetwal.c:611 +#: pg_resetwal.c:527 pg_resetwal.c:581 #, c-format msgid "could not read file \"%s\": %m" msgstr "ファイル\"%s\"の読み取りに失敗しました: %m" -#: pg_resetwal.c:564 +#: pg_resetwal.c:535 #, c-format msgid "data directory is of wrong version" msgstr "データディレクトリのバージョンが違います" -#: pg_resetwal.c:565 +#: pg_resetwal.c:536 #, c-format msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." msgstr "ファイル\"%s\"では\"%s\"となっています、これはこのプログラムのバージョン\"%s\"と互換性がありません" -#: pg_resetwal.c:598 +#: pg_resetwal.c:569 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" @@ -234,23 +249,23 @@ msgstr "" " touch %s\n" "の後に再実行してください。" -#: pg_resetwal.c:629 +#: pg_resetwal.c:597 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "pg_controlがありましたが、CRCが不正でした; 注意して進めてください" -#: pg_resetwal.c:638 +#: pg_resetwal.c:606 #, c-format msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" msgstr[0] "pg_controlにあるWALセグメントサイズ(%dバイト)は不正です; 注意して進めてください" -#: pg_resetwal.c:649 +#: pg_resetwal.c:617 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "pg_controlがありましたが、破損あるいは間違ったバージョンです; 無視します" -#: pg_resetwal.c:744 +#: pg_resetwal.c:712 #, c-format msgid "" "Guessed pg_control values:\n" @@ -259,7 +274,7 @@ msgstr "" "pg_controlの推測値:\n" "\n" -#: pg_resetwal.c:746 +#: pg_resetwal.c:714 #, c-format msgid "" "Current pg_control values:\n" @@ -268,167 +283,167 @@ msgstr "" "現在のpg_controlの値:\n" "\n" -#: pg_resetwal.c:748 +#: pg_resetwal.c:716 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_controlバージョン番号: %u\n" -#: pg_resetwal.c:750 +#: pg_resetwal.c:718 #, c-format msgid "Catalog version number: %u\n" msgstr "カタログバージョン番号: %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:720 #, c-format msgid "Database system identifier: %llu\n" msgstr "データベースシステム識別子: %llu\n" -#: pg_resetwal.c:754 +#: pg_resetwal.c:722 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "最終チェックポイントの時系列ID: %u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:724 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "最終チェックポイントのfull_page_writes: %s\n" -#: pg_resetwal.c:757 +#: pg_resetwal.c:725 msgid "off" msgstr "オフ" -#: pg_resetwal.c:757 +#: pg_resetwal.c:725 msgid "on" msgstr "オン" -#: pg_resetwal.c:758 +#: pg_resetwal.c:726 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "最終チェックポイントのNextXID: %u:%u\n" -#: pg_resetwal.c:761 +#: pg_resetwal.c:729 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "最終チェックポイントのNextOID: %u\n" -#: pg_resetwal.c:763 +#: pg_resetwal.c:731 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "最終チェックポイントのNextMultiXactId: %u\n" -#: pg_resetwal.c:765 +#: pg_resetwal.c:733 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "最終チェックポイントのNextMultiOffset: %u\n" -#: pg_resetwal.c:767 +#: pg_resetwal.c:735 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "最終チェックポイントのoldestXID: %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:737 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "最終チェックポイントのoldestXIDのDB: %u\n" -#: pg_resetwal.c:771 +#: pg_resetwal.c:739 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "最終チェックポイントのoldestActiveXID: %u\n" -#: pg_resetwal.c:773 +#: pg_resetwal.c:741 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "最終チェックポイントのoldestMultiXid: %u\n" -#: pg_resetwal.c:775 +#: pg_resetwal.c:743 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "最終チェックポイントのoldestMultiのDB: %u\n" -#: pg_resetwal.c:777 +#: pg_resetwal.c:745 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "最終チェックポイントのoldestCommitTsXid: %u\n" -#: pg_resetwal.c:779 +#: pg_resetwal.c:747 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "最終チェックポイントのnewestCommitTsXid: %u\n" -#: pg_resetwal.c:781 +#: pg_resetwal.c:749 #, c-format msgid "Maximum data alignment: %u\n" msgstr "最大データアラインメント: %u\n" -#: pg_resetwal.c:784 +#: pg_resetwal.c:752 #, c-format msgid "Database block size: %u\n" msgstr "データベースのブロックサイズ: %u\n" -#: pg_resetwal.c:786 +#: pg_resetwal.c:754 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "大きなリレーションのセグメント毎のブロック数:%u\n" -#: pg_resetwal.c:788 +#: pg_resetwal.c:756 #, c-format msgid "WAL block size: %u\n" msgstr "WALのブロックサイズ: %u\n" -#: pg_resetwal.c:790 pg_resetwal.c:876 +#: pg_resetwal.c:758 pg_resetwal.c:844 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "WALセグメント当たりのバイト数: %u\n" -#: pg_resetwal.c:792 +#: pg_resetwal.c:760 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "識別子の最大長: %u\n" -#: pg_resetwal.c:794 +#: pg_resetwal.c:762 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "インデックス内の最大列数: %u\n" -#: pg_resetwal.c:796 +#: pg_resetwal.c:764 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "TOASTチャンクの最大サイズ: %u\n" -#: pg_resetwal.c:798 +#: pg_resetwal.c:766 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "ラージオブジェクトチャンクのサイズ: %u\n" -#: pg_resetwal.c:801 +#: pg_resetwal.c:769 #, c-format msgid "Date/time type storage: %s\n" msgstr "日付/時刻型の格納方式: %s\n" -#: pg_resetwal.c:802 +#: pg_resetwal.c:770 msgid "64-bit integers" msgstr "64ビット整数" -#: pg_resetwal.c:803 +#: pg_resetwal.c:771 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Float8引数の渡し方: %s\n" -#: pg_resetwal.c:804 +#: pg_resetwal.c:772 msgid "by reference" msgstr "参照渡し" -#: pg_resetwal.c:804 +#: pg_resetwal.c:772 msgid "by value" msgstr "値渡し" -#: pg_resetwal.c:805 +#: pg_resetwal.c:773 #, c-format msgid "Data page checksum version: %u\n" msgstr "データベージチェックサムのバージョン: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:787 #, c-format msgid "" "\n" @@ -441,102 +456,102 @@ msgstr "" "変更される値:\n" "\n" -#: pg_resetwal.c:823 +#: pg_resetwal.c:791 #, c-format msgid "First log segment after reset: %s\n" msgstr "リセット後最初のログセグメント: %s\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:795 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:829 +#: pg_resetwal.c:797 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:831 +#: pg_resetwal.c:799 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "OldestMultiのDB: %u\n" -#: pg_resetwal.c:837 +#: pg_resetwal.c:805 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:843 +#: pg_resetwal.c:811 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:849 +#: pg_resetwal.c:817 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:851 +#: pg_resetwal.c:819 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:853 +#: pg_resetwal.c:821 #, c-format msgid "OldestXID's DB: %u\n" msgstr "OldestXIDのDB: %u\n" -#: pg_resetwal.c:859 +#: pg_resetwal.c:827 #, c-format msgid "NextXID epoch: %u\n" msgstr "NextXID基点: %u\n" -#: pg_resetwal.c:865 +#: pg_resetwal.c:833 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:870 +#: pg_resetwal.c:838 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:956 pg_resetwal.c:1024 pg_resetwal.c:1071 +#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" -#: pg_resetwal.c:991 pg_resetwal.c:1044 pg_resetwal.c:1094 +#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 #, c-format msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m" -#: pg_resetwal.c:997 pg_resetwal.c:1050 pg_resetwal.c:1100 +#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 #, c-format msgid "could not close directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m" -#: pg_resetwal.c:1036 pg_resetwal.c:1086 +#: pg_resetwal.c:990 pg_resetwal.c:1028 #, c-format msgid "could not delete file \"%s\": %m" msgstr "ファイル\"%s\"を削除できませんでした: %m" -#: pg_resetwal.c:1167 +#: pg_resetwal.c:1100 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンできませんでした: %m" -#: pg_resetwal.c:1177 pg_resetwal.c:1190 +#: pg_resetwal.c:1108 pg_resetwal.c:1120 #, c-format msgid "could not write file \"%s\": %m" msgstr "ファイル\"%s\"を書き出せませんでした: %m" -#: pg_resetwal.c:1197 +#: pg_resetwal.c:1125 #, c-format msgid "fsync error: %m" msgstr "fsyncエラー: %m" -#: pg_resetwal.c:1208 +#: pg_resetwal.c:1134 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" @@ -545,7 +560,7 @@ msgstr "" "%sはPostgreSQLの先行書き込みログをリセットします。\n" "\n" -#: pg_resetwal.c:1209 +#: pg_resetwal.c:1135 #, c-format msgid "" "Usage:\n" @@ -556,83 +571,88 @@ msgstr "" " %s [OPTION]... DATADIR\n" "\n" -#: pg_resetwal.c:1210 +#: pg_resetwal.c:1136 #, c-format msgid "Options:\n" msgstr "オプション:\n" -#: pg_resetwal.c:1211 +#: pg_resetwal.c:1137 #, c-format msgid "" " -c, --commit-timestamp-ids=XID,XID\n" -" set oldest and newest transactions bearing\n" -" commit timestamp (zero means no change)\n" +" set oldest and newest transactions bearing\n" +" commit timestamp (zero means no change)\n" msgstr "" " -c, --commit-timestamp-ids=XID,XID\n" -" コミットタイムスタンプを持つ最古と最新の\n" -" トランザクション(0は変更しないことを意味する)\n" +" コミットタイムスタンプを持つ最古と最新の\n" +" トランザクション(0は変更しないことを意味する)\n" -#: pg_resetwal.c:1214 +#: pg_resetwal.c:1140 #, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]DATADIR データディレクトリ\n" +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]DATADIR データディレクトリ\n" -#: pg_resetwal.c:1215 +#: pg_resetwal.c:1141 #, c-format -msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" -msgstr " -e, --epoch=XIDEPOCH 次のトランザクションIDの基点を設定\n" +msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" +msgstr " -e, --epoch=XIDEPOCH 次のトランザクションIDの基点を設定\n" -#: pg_resetwal.c:1216 +#: pg_resetwal.c:1142 #, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force 強制的に更新を実施\n" +msgid " -f, --force force update to be done\n" +msgstr " -f, --force 強制的に更新を実施\n" -#: pg_resetwal.c:1217 +#: pg_resetwal.c:1143 #, c-format -msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" -msgstr " -l, --next-wal-file=WALFILE 新しいWALの最小開始ポイントを設定\n" +msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" +msgstr " -l, --next-wal-file=WALFILE 新しいWALの最小開始ポイントを設定\n" -#: pg_resetwal.c:1218 +#: pg_resetwal.c:1144 #, c-format -msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" -msgstr " -m, --multixact-ids=MXID,MXID 次および最古のマルチトランザクションIDを設定\n" +msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" +msgstr " -m, --multixact-ids=MXID,MXID 次および最古のマルチトランザクションIDを設定\n" -#: pg_resetwal.c:1219 +#: pg_resetwal.c:1145 #, c-format -msgid " -n, --dry-run no update, just show what would be done\n" -msgstr " -n, --dry-run 更新をせず、単に何が行なわれるかを表示\n" +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr " -n, --dry-run 更新をせず、単に何が行なわれるかを表示\n" -#: pg_resetwal.c:1220 +#: pg_resetwal.c:1146 #, c-format -msgid " -o, --next-oid=OID set next OID\n" -msgstr " -o, --next-oid=OID 次のOIDを設定\n" +msgid " -o, --next-oid=OID set next OID\n" +msgstr " -o, --next-oid=OID 次のOIDを設定\n" -#: pg_resetwal.c:1221 +#: pg_resetwal.c:1147 #, c-format -msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" -msgstr " -O, --multixact-offset=OFFSET 次のマルチトランザクションオフセットを設定\n" +msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" +msgstr " -O, --multixact-offset=OFFSET 次のマルチトランザクションオフセットを設定\n" -#: pg_resetwal.c:1222 +#: pg_resetwal.c:1148 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version バージョン情報を表示して終了\n" +msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" +msgstr " -u, --oldest-transaction-id=XID 最古のトランザクションIDを設定\n" -#: pg_resetwal.c:1223 +#: pg_resetwal.c:1149 #, c-format -msgid " -x, --next-transaction-id=XID set next transaction ID\n" -msgstr " -x, --next-transaction-id=XID 次のトランザクションIDを設定\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version バージョン情報を表示して終了\n" -#: pg_resetwal.c:1224 +#: pg_resetwal.c:1150 #, c-format -msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" -msgstr " --wal-segsize=SIZE WALセグメントのサイズ、単位はメガバイト\n" +msgid " -x, --next-transaction-id=XID set next transaction ID\n" +msgstr " -x, --next-transaction-id=XID 次のトランザクションIDを設定\n" -#: pg_resetwal.c:1225 +#: pg_resetwal.c:1151 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help このヘルプを表示して終了\n" +msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" +msgstr " --wal-segsize=SIZE WALセグメントのサイズ、単位はメガバイト\n" -#: pg_resetwal.c:1226 +#: pg_resetwal.c:1152 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help このヘルプを表示して終了\n" + +#: pg_resetwal.c:1153 #, c-format msgid "" "\n" @@ -641,11 +661,26 @@ msgstr "" "\n" "バグは<%s>に報告してください。\n" -#: pg_resetwal.c:1227 +#: pg_resetwal.c:1154 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" +#~ msgid "fatal: " +#~ msgstr "致命的エラー: " + +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "詳細は\"%s --help\"を実行してください。\n" + +#~ msgid "transaction ID (-x) must not be 0" +#~ msgstr "トランザクションID(-x)は0にはできません" + +#~ msgid " -V, --version output version information, then exit\n" +#~ msgstr " -V, --version バージョン情報を表示して終了\n" + +#~ msgid " -?, --help show this help, then exit\n" +#~ msgstr " -?, --help このヘルプを表示して終了\n" + #~ msgid "%s: cannot be executed by \"root\"\n" #~ msgstr "%s: \"root\"では実行できません\n" diff --git a/src/bin/pg_resetwal/po/ru.po b/src/bin/pg_resetwal/po/ru.po index d0f196d807..657595a64e 100644 --- a/src/bin/pg_resetwal/po/ru.po +++ b/src/bin/pg_resetwal/po/ru.po @@ -5,13 +5,13 @@ # Oleg Bartunov , 2004. # Sergey Burladyan , 2009. # Dmitriy Olshevskiy , 2014. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021. msgid "" msgstr "" "Project-Id-Version: pg_resetxlog (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-03 11:22+0300\n" -"PO-Revision-Date: 2020-09-03 13:37+0300\n" +"POT-Creation-Date: 2021-08-14 06:29+0300\n" +"PO-Revision-Date: 2021-09-04 12:13+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -21,17 +21,17 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "важно: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "ошибка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "предупреждение: " @@ -77,112 +77,118 @@ msgid "could not get exit code from subprocess: error code %lu" msgstr "не удалось получить код выхода от подпроцесса (код ошибки: %lu)" #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:160 pg_resetwal.c:175 pg_resetwal.c:190 pg_resetwal.c:197 -#: pg_resetwal.c:221 pg_resetwal.c:236 pg_resetwal.c:244 pg_resetwal.c:269 -#: pg_resetwal.c:283 +#: pg_resetwal.c:162 pg_resetwal.c:177 pg_resetwal.c:192 pg_resetwal.c:207 +#: pg_resetwal.c:214 pg_resetwal.c:238 pg_resetwal.c:253 pg_resetwal.c:261 +#: pg_resetwal.c:286 pg_resetwal.c:300 #, c-format msgid "invalid argument for option %s" msgstr "недопустимый аргумент параметра %s" -#: pg_resetwal.c:161 pg_resetwal.c:176 pg_resetwal.c:191 pg_resetwal.c:198 -#: pg_resetwal.c:222 pg_resetwal.c:237 pg_resetwal.c:245 pg_resetwal.c:270 -#: pg_resetwal.c:284 pg_resetwal.c:310 pg_resetwal.c:323 pg_resetwal.c:331 +#: pg_resetwal.c:163 pg_resetwal.c:178 pg_resetwal.c:193 pg_resetwal.c:208 +#: pg_resetwal.c:215 pg_resetwal.c:239 pg_resetwal.c:254 pg_resetwal.c:262 +#: pg_resetwal.c:287 pg_resetwal.c:301 pg_resetwal.c:327 pg_resetwal.c:340 +#: pg_resetwal.c:348 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Для дополнительной информации попробуйте \"%s --help\".\n" -#: pg_resetwal.c:166 +#: pg_resetwal.c:168 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "эпоха ID транзакции (-e) не должна быть равна -1" -#: pg_resetwal.c:181 +#: pg_resetwal.c:183 #, c-format -msgid "transaction ID (-x) must not be 0" -msgstr "ID транзакции (-x) не должен быть равен 0" +msgid "oldest transaction ID (-u) must be greater than or equal to %u" +msgstr "ID старейшей транзакции (-u) должен быть больше или равен %u" -#: pg_resetwal.c:205 pg_resetwal.c:212 +#: pg_resetwal.c:198 +#, c-format +msgid "transaction ID (-x) must be greater than or equal to %u" +msgstr "ID транзакции (-x) должен быть больше или равен %u" + +#: pg_resetwal.c:222 pg_resetwal.c:229 #, c-format msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" msgstr "ID транзакции (-c) должен быть равен 0, либо больше или равен 2" -#: pg_resetwal.c:227 +#: pg_resetwal.c:244 #, c-format msgid "OID (-o) must not be 0" msgstr "OID (-o) не должен быть равен 0" -#: pg_resetwal.c:250 +#: pg_resetwal.c:267 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "ID мультитранзакции (-m) не должен быть равен 0" -#: pg_resetwal.c:260 +#: pg_resetwal.c:277 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "ID старейшей мультитранзакции (-m) не должен быть равен 0" -#: pg_resetwal.c:275 +#: pg_resetwal.c:292 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "смещение мультитранзакции (-O) не должно быть равно -1" -#: pg_resetwal.c:299 +#: pg_resetwal.c:316 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "аргументом --wal-segsize должно быть число" -#: pg_resetwal.c:304 +#: pg_resetwal.c:321 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "аргументом --wal-segsize должна быть степень 2 от 1 до 1024" -#: pg_resetwal.c:321 +#: pg_resetwal.c:338 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "слишком много аргументов командной строки (первый: \"%s\")" -#: pg_resetwal.c:330 +#: pg_resetwal.c:347 #, c-format msgid "no data directory specified" msgstr "каталог данных не указан" -#: pg_resetwal.c:344 +#: pg_resetwal.c:361 #, c-format msgid "cannot be executed by \"root\"" msgstr "программу не должен запускать root" -#: pg_resetwal.c:345 +#: pg_resetwal.c:362 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Запускать %s нужно от имени суперпользователя PostgreSQL." -#: pg_resetwal.c:356 +#: pg_resetwal.c:373 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "не удалось считать права на каталог \"%s\": %m" -#: pg_resetwal.c:365 +#: pg_resetwal.c:382 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не удалось перейти в каталог \"%s\": %m" -#: pg_resetwal.c:381 pg_resetwal.c:544 pg_resetwal.c:595 +#: pg_resetwal.c:398 pg_resetwal.c:553 pg_resetwal.c:604 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не удалось открыть файл \"%s\" для чтения: %m" -#: pg_resetwal.c:388 +#: pg_resetwal.c:405 #, c-format msgid "lock file \"%s\" exists" msgstr "файл блокировки \"%s\" существует" -#: pg_resetwal.c:389 +#: pg_resetwal.c:406 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "" "Возможно, сервер запущен? Если нет, удалите этот файл и попробуйте снова." -#: pg_resetwal.c:492 +#: pg_resetwal.c:501 #, c-format msgid "" "\n" @@ -192,7 +198,7 @@ msgstr "" "Если эти значения приемлемы, выполните сброс принудительно, добавив ключ -" "f.\n" -#: pg_resetwal.c:504 +#: pg_resetwal.c:513 #, c-format msgid "" "The database server was not shut down cleanly.\n" @@ -203,27 +209,27 @@ msgstr "" "Сброс журнала предзаписи может привести к потере данных.\n" "Если вы хотите сбросить его, несмотря на это, добавьте ключ -f.\n" -#: pg_resetwal.c:518 +#: pg_resetwal.c:527 #, c-format msgid "Write-ahead log reset\n" msgstr "Журнал предзаписи сброшен\n" -#: pg_resetwal.c:553 +#: pg_resetwal.c:562 #, c-format msgid "unexpected empty file \"%s\"" msgstr "файл \"%s\" оказался пустым" -#: pg_resetwal.c:555 pg_resetwal.c:611 +#: pg_resetwal.c:564 pg_resetwal.c:620 #, c-format msgid "could not read file \"%s\": %m" msgstr "не удалось прочитать файл \"%s\": %m" -#: pg_resetwal.c:564 +#: pg_resetwal.c:573 #, c-format msgid "data directory is of wrong version" msgstr "каталог данных имеет неверную версию" -#: pg_resetwal.c:565 +#: pg_resetwal.c:574 #, c-format msgid "" "File \"%s\" contains \"%s\", which is not compatible with this program's " @@ -231,7 +237,7 @@ msgid "" msgstr "" "Файл \"%s\" содержит строку \"%s\", а ожидается версия программы \"%s\"." -#: pg_resetwal.c:598 +#: pg_resetwal.c:607 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" @@ -242,14 +248,14 @@ msgstr "" " touch %s\n" "и повторите попытку." -#: pg_resetwal.c:629 +#: pg_resetwal.c:638 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "" "pg_control существует, но его контрольная сумма неверна; продолжайте с " "осторожностью" -#: pg_resetwal.c:638 +#: pg_resetwal.c:647 #, c-format msgid "" "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" @@ -266,14 +272,14 @@ msgstr[2] "" "в pg_control указан некорректный размер сегмента WAL (%d Б); продолжайте с " "осторожностью" -#: pg_resetwal.c:649 +#: pg_resetwal.c:658 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "" "pg_control испорчен или имеет неизвестную либо недопустимую версию; " "игнорируется..." -#: pg_resetwal.c:744 +#: pg_resetwal.c:753 #, c-format msgid "" "Guessed pg_control values:\n" @@ -282,7 +288,7 @@ msgstr "" "Предполагаемые значения pg_control:\n" "\n" -#: pg_resetwal.c:746 +#: pg_resetwal.c:755 #, c-format msgid "" "Current pg_control values:\n" @@ -291,181 +297,181 @@ msgstr "" "Текущие значения pg_control:\n" "\n" -#: pg_resetwal.c:748 +#: pg_resetwal.c:757 #, c-format msgid "pg_control version number: %u\n" msgstr "Номер версии pg_control: %u\n" -#: pg_resetwal.c:750 +#: pg_resetwal.c:759 #, c-format msgid "Catalog version number: %u\n" msgstr "Номер версии каталога: %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:761 #, c-format msgid "Database system identifier: %llu\n" msgstr "Идентификатор системы баз данных: %llu\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:754 +#: pg_resetwal.c:763 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "Линия времени последней конт. точки: %u\n" # skip-rule: no-space-after-period -#: pg_resetwal.c:756 +#: pg_resetwal.c:765 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "Режим full_page_writes последней к.т: %s\n" -#: pg_resetwal.c:757 +#: pg_resetwal.c:766 msgid "off" msgstr "выкл." -#: pg_resetwal.c:757 +#: pg_resetwal.c:766 msgid "on" msgstr "вкл." # skip-rule: capital-letter-first -#: pg_resetwal.c:758 +#: pg_resetwal.c:767 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID последней конт. точки: %u:%u\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:761 +#: pg_resetwal.c:770 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID последней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:763 +#: pg_resetwal.c:772 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId послед. конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:765 +#: pg_resetwal.c:774 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset послед. конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:767 +#: pg_resetwal.c:776 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID последней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:769 +#: pg_resetwal.c:778 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "БД с oldestXID последней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:771 +#: pg_resetwal.c:780 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID последней к. т.: %u\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:773 +#: pg_resetwal.c:782 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid последней конт. точки: %u\n" # skip-rule: capital-letter-first, double-space -#: pg_resetwal.c:775 +#: pg_resetwal.c:784 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "БД с oldestMulti последней к. т.: %u\n" # skip-rule: capital-letter-first, double-space -#: pg_resetwal.c:777 +#: pg_resetwal.c:786 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid последней к. т.: %u\n" # skip-rule: capital-letter-first, double-space -#: pg_resetwal.c:779 +#: pg_resetwal.c:788 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid последней к. т.: %u\n" -#: pg_resetwal.c:781 +#: pg_resetwal.c:790 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Макс. предел выравнивания данных: %u\n" -#: pg_resetwal.c:784 +#: pg_resetwal.c:793 #, c-format msgid "Database block size: %u\n" msgstr "Размер блока БД: %u\n" # skip-rule: double-space -#: pg_resetwal.c:786 +#: pg_resetwal.c:795 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Блоков в макс. сегменте отношений: %u\n" -#: pg_resetwal.c:788 +#: pg_resetwal.c:797 #, c-format msgid "WAL block size: %u\n" msgstr "Размер блока WAL: %u\n" -#: pg_resetwal.c:790 pg_resetwal.c:876 +#: pg_resetwal.c:799 pg_resetwal.c:885 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Байт в сегменте WAL: %u\n" -#: pg_resetwal.c:792 +#: pg_resetwal.c:801 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Максимальная длина идентификаторов: %u\n" -#: pg_resetwal.c:794 +#: pg_resetwal.c:803 #, c-format msgid "Maximum columns in an index: %u\n" -msgstr "Максимальное число столбцов в индексе: %u\n" +msgstr "Макс. число столбцов в индексе: %u\n" -#: pg_resetwal.c:796 +#: pg_resetwal.c:805 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Максимальный размер порции TOAST: %u\n" -#: pg_resetwal.c:798 +#: pg_resetwal.c:807 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Размер порции большого объекта: %u\n" -#: pg_resetwal.c:801 +#: pg_resetwal.c:810 #, c-format msgid "Date/time type storage: %s\n" msgstr "Формат хранения даты/времени: %s\n" -#: pg_resetwal.c:802 +#: pg_resetwal.c:811 msgid "64-bit integers" msgstr "64-битные целые" -#: pg_resetwal.c:803 +#: pg_resetwal.c:812 #, c-format msgid "Float8 argument passing: %s\n" -msgstr "Передача аргумента Float8: %s\n" +msgstr "Передача аргумента float8: %s\n" -#: pg_resetwal.c:804 +#: pg_resetwal.c:813 msgid "by reference" msgstr "по ссылке" -#: pg_resetwal.c:804 +#: pg_resetwal.c:813 msgid "by value" msgstr "по значению" -#: pg_resetwal.c:805 +#: pg_resetwal.c:814 #, c-format msgid "Data page checksum version: %u\n" msgstr "Версия контрольных сумм страниц: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:828 #, c-format msgid "" "\n" @@ -478,102 +484,102 @@ msgstr "" "Значения, которые будут изменены:\n" "\n" -#: pg_resetwal.c:823 +#: pg_resetwal.c:832 #, c-format msgid "First log segment after reset: %s\n" msgstr "Первый сегмент журнала после сброса: %s\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:836 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:829 +#: pg_resetwal.c:838 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:831 +#: pg_resetwal.c:840 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "БД с oldestMultiXid: %u\n" -#: pg_resetwal.c:837 +#: pg_resetwal.c:846 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:843 +#: pg_resetwal.c:852 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:849 +#: pg_resetwal.c:858 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:851 +#: pg_resetwal.c:860 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:853 +#: pg_resetwal.c:862 #, c-format msgid "OldestXID's DB: %u\n" msgstr "БД с oldestXID: %u\n" -#: pg_resetwal.c:859 +#: pg_resetwal.c:868 #, c-format msgid "NextXID epoch: %u\n" msgstr "Эпоха NextXID: %u\n" -#: pg_resetwal.c:865 +#: pg_resetwal.c:874 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:870 +#: pg_resetwal.c:879 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:956 pg_resetwal.c:1024 pg_resetwal.c:1071 +#: pg_resetwal.c:965 pg_resetwal.c:1033 pg_resetwal.c:1080 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не удалось открыть каталог \"%s\": %m" -#: pg_resetwal.c:991 pg_resetwal.c:1044 pg_resetwal.c:1094 +#: pg_resetwal.c:1000 pg_resetwal.c:1053 pg_resetwal.c:1103 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не удалось прочитать каталог \"%s\": %m" -#: pg_resetwal.c:997 pg_resetwal.c:1050 pg_resetwal.c:1100 +#: pg_resetwal.c:1006 pg_resetwal.c:1059 pg_resetwal.c:1109 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не удалось закрыть каталог \"%s\": %m" -#: pg_resetwal.c:1036 pg_resetwal.c:1086 +#: pg_resetwal.c:1045 pg_resetwal.c:1095 #, c-format msgid "could not delete file \"%s\": %m" -msgstr "ошибка при удалении файла \"%s\": %m" +msgstr "ошибка удаления файла \"%s\": %m" -#: pg_resetwal.c:1167 +#: pg_resetwal.c:1176 #, c-format msgid "could not open file \"%s\": %m" msgstr "не удалось открыть файл \"%s\": %m" -#: pg_resetwal.c:1177 pg_resetwal.c:1190 +#: pg_resetwal.c:1186 pg_resetwal.c:1199 #, c-format msgid "could not write file \"%s\": %m" msgstr "не удалось записать файл \"%s\": %m" -#: pg_resetwal.c:1197 +#: pg_resetwal.c:1206 #, c-format msgid "fsync error: %m" msgstr "ошибка синхронизации с ФС: %m" -#: pg_resetwal.c:1208 +#: pg_resetwal.c:1217 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" @@ -582,7 +588,7 @@ msgstr "" "%s сбрасывает журнал предзаписи PostgreSQL.\n" "\n" -#: pg_resetwal.c:1209 +#: pg_resetwal.c:1218 #, c-format msgid "" "Usage:\n" @@ -593,96 +599,106 @@ msgstr "" " %s [ПАРАМЕТР]... КАТ_ДАННЫХ\n" "\n" -#: pg_resetwal.c:1210 +#: pg_resetwal.c:1219 #, c-format msgid "Options:\n" msgstr "Параметры:\n" -#: pg_resetwal.c:1211 +#: pg_resetwal.c:1220 #, c-format msgid "" " -c, --commit-timestamp-ids=XID,XID\n" -" set oldest and newest transactions bearing\n" -" commit timestamp (zero means no change)\n" +" set oldest and newest transactions " +"bearing\n" +" commit timestamp (zero means no change)\n" msgstr "" " -c, --commit-timestamp-ids=XID,XID\n" -" задать старейшую и новейшую транзакции,\n" -" несущие метки времени (0 — не менять)\n" +" задать старейшую и новейшую транзакции,\n" +" несущие метки времени (0 — не менять)\n" -#: pg_resetwal.c:1214 +#: pg_resetwal.c:1223 #, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]КАТ_ДАННЫХ каталог данных\n" +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]КАТ_ДАННЫХ каталог данных\n" -#: pg_resetwal.c:1215 +#: pg_resetwal.c:1224 #, c-format -msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" +msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" msgstr "" -" -e, --epoch=XIDEPOCH задать эпоху для ID следующей транзакции\n" +" -e, --epoch=XIDEPOCH задать эпоху для ID следующей транзакции\n" -#: pg_resetwal.c:1216 +#: pg_resetwal.c:1225 #, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force принудительное выполнение операции\n" +msgid " -f, --force force update to be done\n" +msgstr "" +" -f, --force принудительное выполнение операции\n" -#: pg_resetwal.c:1217 +#: pg_resetwal.c:1226 #, c-format msgid "" -" -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" +" -l, --next-wal-file=WALFILE set minimum starting location for new " +"WAL\n" msgstr "" -" -l, --next-wal-file=ФАЙЛ_WAL задать минимальное начальное положение\n" -" для нового WAL\n" +" -l, --next-wal-file=ФАЙЛ_WAL задать минимальное начальное положение\n" +" для нового WAL\n" -#: pg_resetwal.c:1218 +#: pg_resetwal.c:1227 #, c-format msgid "" -" -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" +" -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" msgstr "" -" -m, --multixact-ids=MXID,MXID задать ID следующей и старейшей " -"мультитранзакции\n" +" -m, --multixact-ids=MXID,MXID задать ID следующей и старейшей\n" +" мультитранзакции\n" -#: pg_resetwal.c:1219 +#: pg_resetwal.c:1228 #, c-format msgid "" -" -n, --dry-run no update, just show what would be done\n" +" -n, --dry-run no update, just show what would be done\n" msgstr "" -" -n, --dry-run показать, какие действия будут выполнены,\n" -" но не выполнять их\n" +" -n, --dry-run показать, какие действия будут " +"выполнены,\n" +" но не выполнять их\n" -#: pg_resetwal.c:1220 +#: pg_resetwal.c:1229 #, c-format -msgid " -o, --next-oid=OID set next OID\n" -msgstr " -o, --next-oid=OID задать следующий OID\n" +msgid " -o, --next-oid=OID set next OID\n" +msgstr " -o, --next-oid=OID задать следующий OID\n" -#: pg_resetwal.c:1221 +#: pg_resetwal.c:1230 #, c-format -msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" +msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" msgstr "" -" -O, --multixact-offset=СМЕЩЕНИЕ задать смещение следующей " +" -O, --multixact-offset=СМЕЩЕНИЕ задать смещение следующей " "мультитранзакции\n" -#: pg_resetwal.c:1222 +#: pg_resetwal.c:1231 +#, c-format +msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" +msgstr " -u, --oldest-transaction-id=XID задать ID старейшей ID\n" + +#: pg_resetwal.c:1232 #, c-format msgid "" -" -V, --version output version information, then exit\n" -msgstr " -V, --version показать версию и выйти\n" +" -V, --version output version information, then exit\n" +msgstr " -V, --version показать версию и выйти\n" -#: pg_resetwal.c:1223 +#: pg_resetwal.c:1233 #, c-format -msgid " -x, --next-transaction-id=XID set next transaction ID\n" -msgstr " -x, --next-transaction-id=XID задать ID следующей транзакции\n" +msgid " -x, --next-transaction-id=XID set next transaction ID\n" +msgstr " -x, --next-transaction-id=XID задать ID следующей транзакции\n" -#: pg_resetwal.c:1224 +#: pg_resetwal.c:1234 #, c-format -msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" -msgstr " --wal-segsize=РАЗМЕР размер сегментов WAL (в мегабайтах)\n" +msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" +msgstr "" +" --wal-segsize=РАЗМЕР размер сегментов WAL (в мегабайтах)\n" -#: pg_resetwal.c:1225 +#: pg_resetwal.c:1235 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help показать эту справку и выйти\n" +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help показать эту справку и выйти\n" -#: pg_resetwal.c:1226 +#: pg_resetwal.c:1236 #, c-format msgid "" "\n" @@ -691,11 +707,14 @@ msgstr "" "\n" "Об ошибках сообщайте по адресу <%s>.\n" -#: pg_resetwal.c:1227 +#: pg_resetwal.c:1237 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" +#~ msgid "transaction ID (-x) must not be 0" +#~ msgstr "ID транзакции (-x) не должен быть равен 0" + #~ msgid "Float4 argument passing: %s\n" #~ msgstr "Передача аргумента Float4: %s\n" diff --git a/src/bin/pg_resetwal/po/sv.po b/src/bin/pg_resetwal/po/sv.po index 74d07a3638..0cdd2f2c44 100644 --- a/src/bin/pg_resetwal/po/sv.po +++ b/src/bin/pg_resetwal/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for resetxlog. -# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020. +# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. # Peter Eisentraut , 2010. # Mats Erik Andersson , 2014. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-13 16:46+0000\n" -"PO-Revision-Date: 2020-04-13 23:40+0200\n" +"POT-Creation-Date: 2022-04-11 19:48+0000\n" +"PO-Revision-Date: 2022-04-11 22:01+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,21 +17,26 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatalt: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:273 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:280 #, c-format msgid "warning: " msgstr "varning: " +#: ../../../src/common/logging.c:291 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:298 +#, c-format +msgid "hint: " +msgstr "tips: " + #: ../../common/restricted_token.c:64 #, c-format msgid "could not load library \"%s\": error code %lu" @@ -67,117 +72,123 @@ msgstr "kunde inte starta process för kommando \"%s\": felkod %lu" msgid "could not re-execute with restricted token: error code %lu" msgstr "kunde inte köra igen med token för begränsad åtkomst: felkod %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "kunde inte hämta statuskod för underprocess: felkod %lu" #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:160 pg_resetwal.c:175 pg_resetwal.c:190 pg_resetwal.c:197 -#: pg_resetwal.c:221 pg_resetwal.c:236 pg_resetwal.c:244 pg_resetwal.c:269 -#: pg_resetwal.c:283 +#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202 +#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249 +#: pg_resetwal.c:269 pg_resetwal.c:280 #, c-format msgid "invalid argument for option %s" msgstr "ogiltigt argument för flaggan %s" -#: pg_resetwal.c:161 pg_resetwal.c:176 pg_resetwal.c:191 pg_resetwal.c:198 -#: pg_resetwal.c:222 pg_resetwal.c:237 pg_resetwal.c:245 pg_resetwal.c:270 -#: pg_resetwal.c:284 pg_resetwal.c:310 pg_resetwal.c:323 pg_resetwal.c:331 +#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 +#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 +#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316 +#: pg_resetwal.c:323 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Försök med \"%s --help\" för mer information.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." -#: pg_resetwal.c:166 +#: pg_resetwal.c:168 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "Epoch (-e) för transaktions-ID får inte vara -1." #: pg_resetwal.c:181 #, c-format -msgid "transaction ID (-x) must not be 0" -msgstr "Transaktions-ID (-x) får inte vara 0." +msgid "oldest transaction ID (-u) must be greater than or equal to %u" +msgstr "äldsta transaktions-ID (-u) måste vara större än eller lika med %u" + +#: pg_resetwal.c:194 +#, c-format +msgid "transaction ID (-x) must be greater than or equal to %u" +msgstr "transaktions-ID (-x) måste vara större än eller lika med %u" -#: pg_resetwal.c:205 pg_resetwal.c:212 +#: pg_resetwal.c:216 pg_resetwal.c:220 #, c-format msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" msgstr "transaktions-ID (-c) måste antingen vara 0 eller större än eller lika med 2" -#: pg_resetwal.c:227 +#: pg_resetwal.c:233 #, c-format msgid "OID (-o) must not be 0" msgstr "OID (-o) får inte vara 0." -#: pg_resetwal.c:250 +#: pg_resetwal.c:254 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "Multitransaktions-ID (-m) får inte vara 0." -#: pg_resetwal.c:260 +#: pg_resetwal.c:261 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "Äldsta multitransaktions-ID (-m) får inte vara 0." -#: pg_resetwal.c:275 +#: pg_resetwal.c:274 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "Multitransaktionsoffset (-O) får inte vara -1." -#: pg_resetwal.c:299 +#: pg_resetwal.c:296 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "argumentet till --wal-segsize måste vara ett tal" -#: pg_resetwal.c:304 +#: pg_resetwal.c:298 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "argumentet till --wal-segsize måste vara en tvåpotens mellan 1 och 1024" -#: pg_resetwal.c:321 +#: pg_resetwal.c:314 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för många kommandoradsargument (första är \"%s\")" -#: pg_resetwal.c:330 +#: pg_resetwal.c:322 #, c-format msgid "no data directory specified" msgstr "ingen datakatalog angiven" -#: pg_resetwal.c:344 +#: pg_resetwal.c:336 #, c-format msgid "cannot be executed by \"root\"" msgstr "kan inte köras av \"root\"" -#: pg_resetwal.c:345 +#: pg_resetwal.c:337 #, c-format msgid "You must run %s as the PostgreSQL superuser." -msgstr "Du måste köra %s som PostgreSQL:s superanvändare." +msgstr "Du måste köra %s som PostgreSQL:s superuser." -#: pg_resetwal.c:356 +#: pg_resetwal.c:347 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "kunde inte läsa rättigheter på katalog \"%s\": %m" -#: pg_resetwal.c:365 +#: pg_resetwal.c:353 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "kunde inte byta katalog till \"%s\": %m" -#: pg_resetwal.c:381 pg_resetwal.c:544 pg_resetwal.c:595 +#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "kunde inte öppna filen \"%s\" för läsning: %m" -#: pg_resetwal.c:388 +#: pg_resetwal.c:371 #, c-format msgid "lock file \"%s\" exists" msgstr "låsfil med namn \"%s\" finns redan" -#: pg_resetwal.c:389 +#: pg_resetwal.c:372 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "Kör servern redan? Om inte, radera låsfilen och försök igen." -#: pg_resetwal.c:492 +#: pg_resetwal.c:467 #, c-format msgid "" "\n" @@ -187,7 +198,7 @@ msgstr "" "Om dessa värden verkar godtagbara, använd då -f för att\n" "framtvinga återställning.\n" -#: pg_resetwal.c:504 +#: pg_resetwal.c:479 #, c-format msgid "" "The database server was not shut down cleanly.\n" @@ -198,32 +209,32 @@ msgstr "" "write-ahead-loggen kan medföra att data förloras. Om du ändå\n" "vill fortsätta, använd -f för att framtvinga återställning.\n" -#: pg_resetwal.c:518 +#: pg_resetwal.c:493 #, c-format msgid "Write-ahead log reset\n" msgstr "Återställning av write-ahead-log\n" -#: pg_resetwal.c:553 +#: pg_resetwal.c:525 #, c-format msgid "unexpected empty file \"%s\"" msgstr "oväntad tom fil \"%s\"" -#: pg_resetwal.c:555 pg_resetwal.c:611 +#: pg_resetwal.c:527 pg_resetwal.c:581 #, c-format msgid "could not read file \"%s\": %m" msgstr "kunde inte läsa fil \"%s\": %m" -#: pg_resetwal.c:564 +#: pg_resetwal.c:535 #, c-format msgid "data directory is of wrong version" msgstr "datakatalogen har fel version" -#: pg_resetwal.c:565 +#: pg_resetwal.c:536 #, c-format msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." msgstr "Filen \"%s\" innehåller \"%s\", vilket inte är kompatibelt med detta programmets version \"%s\"." -#: pg_resetwal.c:598 +#: pg_resetwal.c:569 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" @@ -233,24 +244,24 @@ msgstr "" "Om du är säker på att sökvägen till datakatalogen är riktig,\n" "utför då \"touch %s\" och försök sedan igen." -#: pg_resetwal.c:629 +#: pg_resetwal.c:597 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "pg_control existerar men har ogiltig CRC. Fortsätt med varsamhet." -#: pg_resetwal.c:638 +#: pg_resetwal.c:606 #, c-format msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" msgstr[0] "pg_control anger ogiltig WAL-segmentstorlek (%d byte); fortsätt med varsamhet." msgstr[1] "pg_control anger ogiltig WAL-segmentstorlek (%d byte); fortsätt med varsamhet." -#: pg_resetwal.c:649 +#: pg_resetwal.c:617 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "pg_control existerar men är trasig eller har fel version. Den ignoreras." -#: pg_resetwal.c:744 +#: pg_resetwal.c:712 #, c-format msgid "" "Guessed pg_control values:\n" @@ -259,7 +270,7 @@ msgstr "" "Gissade värden för pg_control:\n" "\n" -#: pg_resetwal.c:746 +#: pg_resetwal.c:714 #, c-format msgid "" "Current pg_control values:\n" @@ -271,168 +282,168 @@ msgstr "" # November 26th, 2014: Insert six additional space characters # for best alignment with Swedish translation. # Translations should be checked against those of pg_controldata. -#: pg_resetwal.c:748 +#: pg_resetwal.c:716 #, c-format msgid "pg_control version number: %u\n" msgstr "Versionsnummer för pg_control: %u\n" -#: pg_resetwal.c:750 +#: pg_resetwal.c:718 #, c-format msgid "Catalog version number: %u\n" msgstr "Katalogversion: %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:720 #, c-format msgid "Database system identifier: %llu\n" msgstr "Databasens systemidentifierare: %llu\n" -#: pg_resetwal.c:754 +#: pg_resetwal.c:722 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "TimeLineID vid senaste kontrollpunkt: %u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:724 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "Senaste kontrollpunktens full_page_writes: %s\n" -#: pg_resetwal.c:757 +#: pg_resetwal.c:725 msgid "off" msgstr "av" -#: pg_resetwal.c:757 +#: pg_resetwal.c:725 msgid "on" msgstr "på" -#: pg_resetwal.c:758 +#: pg_resetwal.c:726 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID vid senaste kontrollpunkt: %u:%u\n" -#: pg_resetwal.c:761 +#: pg_resetwal.c:729 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID vid senaste kontrollpunkt: %u\n" -#: pg_resetwal.c:763 +#: pg_resetwal.c:731 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId vid senaste kontrollpunkt: %u\n" -#: pg_resetwal.c:765 +#: pg_resetwal.c:733 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset vid senaste kontrollpunkt: %u\n" -#: pg_resetwal.c:767 +#: pg_resetwal.c:735 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID vid senaste kontrollpunkt: %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:737 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "DB för oldestXID vid senaste kontrollpunkt: %u\n" # FIXME: too wide -#: pg_resetwal.c:771 +#: pg_resetwal.c:739 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID vid senaste kontrollpunkt: %u\n" -#: pg_resetwal.c:773 +#: pg_resetwal.c:741 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid vid senaste kontrollpunkt: %u\n" -#: pg_resetwal.c:775 +#: pg_resetwal.c:743 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "DB för oldestMulti vid senaste kontrollpkt: %u\n" -#: pg_resetwal.c:777 +#: pg_resetwal.c:745 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid vid senaste kontrollpunkt:%u\n" -#: pg_resetwal.c:779 +#: pg_resetwal.c:747 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid vid senaste kontrollpunkt:%u\n" -#: pg_resetwal.c:781 +#: pg_resetwal.c:749 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Maximal jämkning av data (alignment): %u\n" -#: pg_resetwal.c:784 +#: pg_resetwal.c:752 #, c-format msgid "Database block size: %u\n" msgstr "Databasens blockstorlek: %u\n" -#: pg_resetwal.c:786 +#: pg_resetwal.c:754 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Block per segment i en stor relation: %u\n" -#: pg_resetwal.c:788 +#: pg_resetwal.c:756 #, c-format msgid "WAL block size: %u\n" msgstr "Blockstorlek i transaktionsloggen: %u\n" -#: pg_resetwal.c:790 pg_resetwal.c:876 +#: pg_resetwal.c:758 pg_resetwal.c:844 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Segmentstorlek i transaktionsloggen: %u\n" -#: pg_resetwal.c:792 +#: pg_resetwal.c:760 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Maximal längd för identifierare: %u\n" -#: pg_resetwal.c:794 +#: pg_resetwal.c:762 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Maximalt antal kolonner i ett index: %u\n" -#: pg_resetwal.c:796 +#: pg_resetwal.c:764 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Maximal storlek för en TOAST-enhet: %u\n" -#: pg_resetwal.c:798 +#: pg_resetwal.c:766 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Storlek för large-object-enheter: %u\n" -#: pg_resetwal.c:801 +#: pg_resetwal.c:769 #, c-format msgid "Date/time type storage: %s\n" msgstr "Representation av dag och tid: %s\n" -#: pg_resetwal.c:802 +#: pg_resetwal.c:770 msgid "64-bit integers" msgstr "64-bitars heltal" -#: pg_resetwal.c:803 +#: pg_resetwal.c:771 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Åtkomst till float8-argument: %s\n" -#: pg_resetwal.c:804 +#: pg_resetwal.c:772 msgid "by reference" msgstr "referens" -#: pg_resetwal.c:804 +#: pg_resetwal.c:772 msgid "by value" msgstr "värdeåtkomst" -#: pg_resetwal.c:805 +#: pg_resetwal.c:773 #, c-format msgid "Data page checksum version: %u\n" msgstr "Checksummaversion för datasidor: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:787 #, c-format msgid "" "\n" @@ -447,102 +458,102 @@ msgstr "" # November 26th, 2014: Insert additional spacing to fit # with the first translated text, which uses most characters. -#: pg_resetwal.c:823 +#: pg_resetwal.c:791 #, c-format msgid "First log segment after reset: %s\n" msgstr "Första loggsegment efter återställning: %s\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:795 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:829 +#: pg_resetwal.c:797 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:831 +#: pg_resetwal.c:799 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "DB för OldestMulti: %u\n" -#: pg_resetwal.c:837 +#: pg_resetwal.c:805 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:843 +#: pg_resetwal.c:811 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:849 +#: pg_resetwal.c:817 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:851 +#: pg_resetwal.c:819 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:853 +#: pg_resetwal.c:821 #, c-format msgid "OldestXID's DB: %u\n" msgstr "DB för OldestXID: %u\n" -#: pg_resetwal.c:859 +#: pg_resetwal.c:827 #, c-format msgid "NextXID epoch: %u\n" msgstr "Epoch för NextXID: %u\n" -#: pg_resetwal.c:865 +#: pg_resetwal.c:833 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:870 +#: pg_resetwal.c:838 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:956 pg_resetwal.c:1024 pg_resetwal.c:1071 +#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016 #, c-format msgid "could not open directory \"%s\": %m" msgstr "kunde inte öppna katalog \"%s\": %m" -#: pg_resetwal.c:991 pg_resetwal.c:1044 pg_resetwal.c:1094 +#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 #, c-format msgid "could not read directory \"%s\": %m" msgstr "kunde inte läsa katalog \"%s\": %m" -#: pg_resetwal.c:997 pg_resetwal.c:1050 pg_resetwal.c:1100 +#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 #, c-format msgid "could not close directory \"%s\": %m" msgstr "kunde inte stänga katalog \"%s\": %m" -#: pg_resetwal.c:1036 pg_resetwal.c:1086 +#: pg_resetwal.c:990 pg_resetwal.c:1028 #, c-format msgid "could not delete file \"%s\": %m" msgstr "kunde inte radera fil \"%s\": %m" -#: pg_resetwal.c:1167 +#: pg_resetwal.c:1100 #, c-format msgid "could not open file \"%s\": %m" msgstr "kunde inte öppna fil \"%s\": %m" -#: pg_resetwal.c:1177 pg_resetwal.c:1190 +#: pg_resetwal.c:1108 pg_resetwal.c:1120 #, c-format msgid "could not write file \"%s\": %m" msgstr "kunde inte skriva fil \"%s\": %m" -#: pg_resetwal.c:1197 +#: pg_resetwal.c:1125 #, c-format msgid "fsync error: %m" msgstr "misslyckad fsync: %m" -#: pg_resetwal.c:1208 +#: pg_resetwal.c:1134 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" @@ -551,7 +562,7 @@ msgstr "" "%s återställer write-ahead-log för PostgreSQL.\n" "\n" -#: pg_resetwal.c:1209 +#: pg_resetwal.c:1135 #, c-format msgid "" "Usage:\n" @@ -562,84 +573,89 @@ msgstr "" " %s [FLAGGA]... DATAKATALOG\n" "\n" -#: pg_resetwal.c:1210 +#: pg_resetwal.c:1136 #, c-format msgid "Options:\n" msgstr "Flaggor:\n" -#: pg_resetwal.c:1211 +#: pg_resetwal.c:1137 #, c-format msgid "" " -c, --commit-timestamp-ids=XID,XID\n" -" set oldest and newest transactions bearing\n" -" commit timestamp (zero means no change)\n" +" set oldest and newest transactions bearing\n" +" commit timestamp (zero means no change)\n" msgstr "" " -c, --commit-timestamp-ids=XID,XID\n" -" sätt äldsta och nyaste transaktionerna som\n" -" kan ha commit-tidstämpel (noll betyder\n" -" ingen ändring)\n" +" sätt äldsta och nyaste transaktionerna som\n" +" kan ha commit-tidstämpel (noll betyder\n" +" ingen ändring)\n" -#: pg_resetwal.c:1214 +#: pg_resetwal.c:1140 #, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]DATADIR datakatalog\n" +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]DATADIR datakatalog\n" -#: pg_resetwal.c:1215 +#: pg_resetwal.c:1141 #, c-format -msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" -msgstr " -e, --epoch=XIDEPOCH sätter epoch för nästa transaktions-ID\n" +msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" +msgstr " -e, --epoch=XIDEPOCH sätter epoch för nästa transaktions-ID\n" -#: pg_resetwal.c:1216 +#: pg_resetwal.c:1142 #, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force framtvinga uppdatering\n" +msgid " -f, --force force update to be done\n" +msgstr " -f, --force framtvinga uppdatering\n" -#: pg_resetwal.c:1217 +#: pg_resetwal.c:1143 #, c-format -msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" -msgstr " -l, --next-wal-file=WALFIL sätt minsta startposition för ny WAL\n" +msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" +msgstr " -l, --next-wal-file=WALFIL sätt minsta startposition för ny WAL\n" -#: pg_resetwal.c:1218 +#: pg_resetwal.c:1144 #, c-format -msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" -msgstr " -m, --multixact-ids=MXID,MXID sätt nästa och äldsta multitransaktions-ID\n" +msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" +msgstr " -m, --multixact-ids=MXID,MXID sätt nästa och äldsta multitransaktions-ID\n" -#: pg_resetwal.c:1219 +#: pg_resetwal.c:1145 #, c-format -msgid " -n, --dry-run no update, just show what would be done\n" -msgstr " -n, --dry-run ingen updatering; visa bara planerade åtgärder\n" +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr " -n, --dry-run ingen updatering; visa bara planerade åtgärder\n" -#: pg_resetwal.c:1220 +#: pg_resetwal.c:1146 #, c-format -msgid " -o, --next-oid=OID set next OID\n" -msgstr " -o, --next-oid=OID sätt nästa OID\n" +msgid " -o, --next-oid=OID set next OID\n" +msgstr " -o, --next-oid=OID sätt nästa OID\n" -#: pg_resetwal.c:1221 +#: pg_resetwal.c:1147 #, c-format -msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" -msgstr " -O, --multixact-offset=OFFSET sätt nästa multitransaktionsoffset\n" +msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" +msgstr " -O, --multixact-offset=OFFSET sätt nästa multitransaktionsoffset\n" -#: pg_resetwal.c:1222 +#: pg_resetwal.c:1148 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version skriv ut versioninformation och avsluta sedan\n" +msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" +msgstr " -u, --oldest-transaction-id=XID sätt äldsta transaktions-ID\n" -#: pg_resetwal.c:1223 +#: pg_resetwal.c:1149 #, c-format -msgid " -x, --next-transaction-id=XID set next transaction ID\n" -msgstr " -x, --next-transaction-id=XID sätt nästa transaktions-ID\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_resetwal.c:1224 +#: pg_resetwal.c:1150 #, c-format -msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" -msgstr " --wal-segsize=STORLEK storlek på WAL-segment i megabyte\n" +msgid " -x, --next-transaction-id=XID set next transaction ID\n" +msgstr " -x, --next-transaction-id=XID sätt nästa transaktions-ID\n" -#: pg_resetwal.c:1225 +#: pg_resetwal.c:1151 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help visa denna hjälp och avsluta sedan\n" +msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" +msgstr " --wal-segsize=STORLEK storlek på WAL-segment i megabyte\n" -#: pg_resetwal.c:1226 +#: pg_resetwal.c:1152 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help visa denna hjälp, avsluta sedan\n" + +#: pg_resetwal.c:1153 #, c-format msgid "" "\n" @@ -648,10 +664,7 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_resetwal.c:1227 +#: pg_resetwal.c:1154 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" - -#~ msgid "could not load advapi32.dll: error code %lu" -#~ msgstr "kunde inte ladda advapi32.dll: felkod %lu" diff --git a/src/bin/pg_resetwal/po/uk.po b/src/bin/pg_resetwal/po/uk.po index b6c024e7aa..11b1ad239f 100644 --- a/src/bin/pg_resetwal/po/uk.po +++ b/src/bin/pg_resetwal/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:16+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" +"POT-Creation-Date: 2021-08-17 08:47+0000\n" +"PO-Revision-Date: 2021-08-17 10:54\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,20 +14,20 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/pg_resetwal.pot\n" -"X-Crowdin-File-ID: 502\n" +"X-Crowdin-File: /REL_14_DEV/pg_resetwal.pot\n" +"X-Crowdin-File-ID: 762\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "збій: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "помилка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "попередження: " @@ -73,118 +73,124 @@ msgid "could not get exit code from subprocess: error code %lu" msgstr "не вдалося отримати код завершення підпроцесу: код помилки %lu" #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:160 pg_resetwal.c:175 pg_resetwal.c:190 pg_resetwal.c:197 -#: pg_resetwal.c:221 pg_resetwal.c:236 pg_resetwal.c:244 pg_resetwal.c:269 -#: pg_resetwal.c:283 +#: pg_resetwal.c:162 pg_resetwal.c:177 pg_resetwal.c:192 pg_resetwal.c:207 +#: pg_resetwal.c:214 pg_resetwal.c:238 pg_resetwal.c:253 pg_resetwal.c:261 +#: pg_resetwal.c:286 pg_resetwal.c:300 #, c-format msgid "invalid argument for option %s" msgstr "неприпустимий аргумент для параметру %s" -#: pg_resetwal.c:161 pg_resetwal.c:176 pg_resetwal.c:191 pg_resetwal.c:198 -#: pg_resetwal.c:222 pg_resetwal.c:237 pg_resetwal.c:245 pg_resetwal.c:270 -#: pg_resetwal.c:284 pg_resetwal.c:310 pg_resetwal.c:323 pg_resetwal.c:331 +#: pg_resetwal.c:163 pg_resetwal.c:178 pg_resetwal.c:193 pg_resetwal.c:208 +#: pg_resetwal.c:215 pg_resetwal.c:239 pg_resetwal.c:254 pg_resetwal.c:262 +#: pg_resetwal.c:287 pg_resetwal.c:301 pg_resetwal.c:327 pg_resetwal.c:340 +#: pg_resetwal.c:348 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" для отримання додаткової інформації.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" -#: pg_resetwal.c:166 +#: pg_resetwal.c:168 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "епоха ID транзакції (-e) не повинна бути -1" -#: pg_resetwal.c:181 +#: pg_resetwal.c:183 #, c-format -msgid "transaction ID (-x) must not be 0" -msgstr "ID транзакції (-x) не повинна бути 0" +msgid "oldest transaction ID (-u) must be greater than or equal to %u" +msgstr "" -#: pg_resetwal.c:205 pg_resetwal.c:212 +#: pg_resetwal.c:198 +#, c-format +msgid "transaction ID (-x) must be greater than or equal to %u" +msgstr "" + +#: pg_resetwal.c:222 pg_resetwal.c:229 #, c-format msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" msgstr "ID транзакції (-c) повинен дорівнювати 0, бути більшим за або дорівнювати 2" -#: pg_resetwal.c:227 +#: pg_resetwal.c:244 #, c-format msgid "OID (-o) must not be 0" msgstr "OID (-o) не може бути 0" -#: pg_resetwal.c:250 +#: pg_resetwal.c:267 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "ID мультитранзакції (-m) не повинен бути 0" -#: pg_resetwal.c:260 +#: pg_resetwal.c:277 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "найстарший ID мультитранзакції (-m) не повинен бути 0" -#: pg_resetwal.c:275 +#: pg_resetwal.c:292 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "зсув мультитранзакції (-O) не повинен бути -1" -#: pg_resetwal.c:299 +#: pg_resetwal.c:316 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "аргумент --wal-segsize повинен бути числом" -#: pg_resetwal.c:304 +#: pg_resetwal.c:321 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "аргумент --wal-segsize повинен бути ступенем 2 між 1 і 1024" -#: pg_resetwal.c:321 +#: pg_resetwal.c:338 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному рядку (перший \"%s\")" -#: pg_resetwal.c:330 +#: pg_resetwal.c:347 #, c-format msgid "no data directory specified" msgstr "каталог даних не вказано" -#: pg_resetwal.c:344 +#: pg_resetwal.c:361 #, c-format msgid "cannot be executed by \"root\"" msgstr "\"root\" не може це виконувати" -#: pg_resetwal.c:345 +#: pg_resetwal.c:362 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Запускати %s треба від суперкористувача PostgreSQL." -#: pg_resetwal.c:356 +#: pg_resetwal.c:373 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "не вдалося прочитати дозволи на каталог \"%s\": %m" -#: pg_resetwal.c:365 +#: pg_resetwal.c:382 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не вдалося змінити каталог на \"%s\": %m" -#: pg_resetwal.c:381 pg_resetwal.c:544 pg_resetwal.c:595 +#: pg_resetwal.c:398 pg_resetwal.c:553 pg_resetwal.c:604 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не вдалося відкрити файл \"%s\" для читання: %m" -#: pg_resetwal.c:388 +#: pg_resetwal.c:405 #, c-format msgid "lock file \"%s\" exists" msgstr "файл блокування \"%s\" вже існує" -#: pg_resetwal.c:389 +#: pg_resetwal.c:406 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "Чи запущений сервер? Якщо ні, видаліть файл блокування і спробуйте знову." -#: pg_resetwal.c:492 +#: pg_resetwal.c:501 #, c-format msgid "\n" "If these values seem acceptable, use -f to force reset.\n" msgstr "\n" "Якщо ці значення виглядають допустимими, використайте -f, щоб провести перевстановлення.\n" -#: pg_resetwal.c:504 +#: pg_resetwal.c:513 #, c-format msgid "The database server was not shut down cleanly.\n" "Resetting the write-ahead log might cause data to be lost.\n" @@ -193,32 +199,32 @@ msgstr "Сервер баз даних був зупинений некорек "Очищення журналу передзапису може привести до втрати даних.\n" "Якщо ви все одно хочете продовжити, використайте параметр -f.\n" -#: pg_resetwal.c:518 +#: pg_resetwal.c:527 #, c-format msgid "Write-ahead log reset\n" msgstr "Журнал передзапису скинуто\n" -#: pg_resetwal.c:553 +#: pg_resetwal.c:562 #, c-format msgid "unexpected empty file \"%s\"" msgstr "неочікуваний порожній файл \"%s\"" -#: pg_resetwal.c:555 pg_resetwal.c:611 +#: pg_resetwal.c:564 pg_resetwal.c:620 #, c-format msgid "could not read file \"%s\": %m" msgstr "не вдалося прочитати файл \"%s\": %m" -#: pg_resetwal.c:564 +#: pg_resetwal.c:573 #, c-format msgid "data directory is of wrong version" msgstr "каталог даних неправильної версії" -#: pg_resetwal.c:565 +#: pg_resetwal.c:574 #, c-format msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." msgstr "Файл \"%s\" містить \"%s\", який не сумісний з версією цієї програми \"%s\"." -#: pg_resetwal.c:598 +#: pg_resetwal.c:607 #, c-format msgid "If you are sure the data directory path is correct, execute\n" " touch %s\n" @@ -227,12 +233,12 @@ msgstr "Якщо Ви впевнені, що шлях каталогу дани " touch %s\n" "і спробуйте знову." -#: pg_resetwal.c:629 +#: pg_resetwal.c:638 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "pg_control існує, але має недопустимий CRC; продовжуйте з обережністю" -#: pg_resetwal.c:638 +#: pg_resetwal.c:647 #, c-format msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" @@ -241,377 +247,380 @@ msgstr[1] "pg_control вказує неприпустимий розмір се msgstr[2] "pg_control вказує неприпустимий розмір сегмента WAL (%d байтів); продовжуйте з обережністю" msgstr[3] "pg_control вказує неприпустимий розмір сегмента WAL (%d байтів); продовжуйте з обережністю" -#: pg_resetwal.c:649 +#: pg_resetwal.c:658 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "pg_control існує, але зламаний або неправильної версії; ігнорується" -#: pg_resetwal.c:744 +#: pg_resetwal.c:753 #, c-format msgid "Guessed pg_control values:\n\n" msgstr "Припустимі значення pg_control:\n\n" -#: pg_resetwal.c:746 +#: pg_resetwal.c:755 #, c-format msgid "Current pg_control values:\n\n" msgstr "Поточні значення pg_control:\n\n" -#: pg_resetwal.c:748 +#: pg_resetwal.c:757 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_control номер версії: %u\n" -#: pg_resetwal.c:750 +#: pg_resetwal.c:759 #, c-format msgid "Catalog version number: %u\n" msgstr "Номер версії каталогу: %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:761 #, c-format msgid "Database system identifier: %llu\n" msgstr "Системний ідентифікатор бази даних: %llu\n" -#: pg_resetwal.c:754 +#: pg_resetwal.c:763 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "Останній TimeLineID контрольної точки: %u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:765 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "Останній full_page_writes контрольної точки: %s\n" -#: pg_resetwal.c:757 +#: pg_resetwal.c:766 msgid "off" msgstr "вимк" -#: pg_resetwal.c:757 +#: pg_resetwal.c:766 msgid "on" msgstr "увімк" -#: pg_resetwal.c:758 +#: pg_resetwal.c:767 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "Останній NextXID контрольної точки: %u%u\n" -#: pg_resetwal.c:761 +#: pg_resetwal.c:770 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "Останній NextOID контрольної точки: %u\n" -#: pg_resetwal.c:763 +#: pg_resetwal.c:772 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "Останній NextMultiXactId контрольної точки: %u\n" -#: pg_resetwal.c:765 +#: pg_resetwal.c:774 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "Останній NextMultiOffset контрольної точки: %u\n" -#: pg_resetwal.c:767 +#: pg_resetwal.c:776 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "Останній oldestXID контрольної точки: %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:778 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "Остання DB останнього oldestXID контрольної точки: %u\n" -#: pg_resetwal.c:771 +#: pg_resetwal.c:780 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "Останній oldestActiveXID контрольної точки: %u\n" -#: pg_resetwal.c:773 +#: pg_resetwal.c:782 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "Останній oldestMultiXid контрольної точки: %u \n" -#: pg_resetwal.c:775 +#: pg_resetwal.c:784 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "Остання DB останньої oldestMulti контрольної точки: %u\n" -#: pg_resetwal.c:777 +#: pg_resetwal.c:786 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "Останній oldestCommitTsXid контрольної точки:%u\n" -#: pg_resetwal.c:779 +#: pg_resetwal.c:788 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "Останній newestCommitTsXid контрольної точки: %u\n" -#: pg_resetwal.c:781 +#: pg_resetwal.c:790 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Максимальне вирівнювання даних: %u\n" -#: pg_resetwal.c:784 +#: pg_resetwal.c:793 #, c-format msgid "Database block size: %u\n" msgstr "Розмір блоку бази даних: %u\n" -#: pg_resetwal.c:786 +#: pg_resetwal.c:795 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Блоків на сегмент великого відношення: %u\n" -#: pg_resetwal.c:788 +#: pg_resetwal.c:797 #, c-format msgid "WAL block size: %u\n" msgstr "Pозмір блоку WAL: %u\n" -#: pg_resetwal.c:790 pg_resetwal.c:876 +#: pg_resetwal.c:799 pg_resetwal.c:885 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Байтів на сегмент WAL: %u\n" -#: pg_resetwal.c:792 +#: pg_resetwal.c:801 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Максимальна довжина ідентифікаторів: %u\n" -#: pg_resetwal.c:794 +#: pg_resetwal.c:803 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Максимальна кількість стовпців в індексі: %u\n" -#: pg_resetwal.c:796 +#: pg_resetwal.c:805 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Максимальний розмір сегменту TOAST: %u\n" -#: pg_resetwal.c:798 +#: pg_resetwal.c:807 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Розмір сегменту великих обїєктів: %u\n" -#: pg_resetwal.c:801 +#: pg_resetwal.c:810 #, c-format msgid "Date/time type storage: %s\n" msgstr "Дата/час типу сховища: %s\n" -#: pg_resetwal.c:802 +#: pg_resetwal.c:811 msgid "64-bit integers" msgstr "64-бітні цілі" -#: pg_resetwal.c:803 +#: pg_resetwal.c:812 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Передача аргументу Float8: %s\n" -#: pg_resetwal.c:804 +#: pg_resetwal.c:813 msgid "by reference" msgstr "за посиланням" -#: pg_resetwal.c:804 +#: pg_resetwal.c:813 msgid "by value" msgstr "за значенням" -#: pg_resetwal.c:805 +#: pg_resetwal.c:814 #, c-format msgid "Data page checksum version: %u\n" msgstr "Версія контрольних сум сторінок даних: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:828 #, c-format msgid "\n\n" "Values to be changed:\n\n" msgstr "\n\n" "Значення, що потребують зміни:\n\n" -#: pg_resetwal.c:823 +#: pg_resetwal.c:832 #, c-format msgid "First log segment after reset: %s\n" msgstr "Перший сегмент журналу після скидання: %s\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:836 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:829 +#: pg_resetwal.c:838 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:831 +#: pg_resetwal.c:840 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "OldestMulti's DB: %u\n" -#: pg_resetwal.c:837 +#: pg_resetwal.c:846 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:843 +#: pg_resetwal.c:852 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:849 +#: pg_resetwal.c:858 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:851 +#: pg_resetwal.c:860 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:853 +#: pg_resetwal.c:862 #, c-format msgid "OldestXID's DB: %u\n" msgstr "OldestXID's DB: %u\n" -#: pg_resetwal.c:859 +#: pg_resetwal.c:868 #, c-format msgid "NextXID epoch: %u\n" msgstr "Епоха NextXID: %u\n" -#: pg_resetwal.c:865 +#: pg_resetwal.c:874 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:870 +#: pg_resetwal.c:879 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:956 pg_resetwal.c:1024 pg_resetwal.c:1071 +#: pg_resetwal.c:965 pg_resetwal.c:1033 pg_resetwal.c:1080 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не вдалося відкрити каталог \"%s\": %m" -#: pg_resetwal.c:991 pg_resetwal.c:1044 pg_resetwal.c:1094 +#: pg_resetwal.c:1000 pg_resetwal.c:1053 pg_resetwal.c:1103 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не вдалося прочитати каталог \"%s\": %m" -#: pg_resetwal.c:997 pg_resetwal.c:1050 pg_resetwal.c:1100 +#: pg_resetwal.c:1006 pg_resetwal.c:1059 pg_resetwal.c:1109 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не вдалося закрити каталог \"%s\": %m" -#: pg_resetwal.c:1036 pg_resetwal.c:1086 +#: pg_resetwal.c:1045 pg_resetwal.c:1095 #, c-format msgid "could not delete file \"%s\": %m" msgstr "не вдалося видалити файл \"%s\": %m" -#: pg_resetwal.c:1167 +#: pg_resetwal.c:1176 #, c-format msgid "could not open file \"%s\": %m" msgstr "не можливо відкрити файл \"%s\": %m" -#: pg_resetwal.c:1177 pg_resetwal.c:1190 +#: pg_resetwal.c:1186 pg_resetwal.c:1199 #, c-format msgid "could not write file \"%s\": %m" msgstr "не вдалося записати файл \"%s\": %m" -#: pg_resetwal.c:1197 +#: pg_resetwal.c:1206 #, c-format msgid "fsync error: %m" msgstr "помилка fsync: %m" -#: pg_resetwal.c:1208 +#: pg_resetwal.c:1217 #, c-format msgid "%s resets the PostgreSQL write-ahead log.\n\n" msgstr "%s скидає журнал передзапису PostgreSQL.\n\n" -#: pg_resetwal.c:1209 +#: pg_resetwal.c:1218 #, c-format msgid "Usage:\n" " %s [OPTION]... DATADIR\n\n" msgstr "Використання:\n" " %s [OPTION]... КАТАЛОГ_ДАНИХ\n\n" -#: pg_resetwal.c:1210 +#: pg_resetwal.c:1219 #, c-format msgid "Options:\n" msgstr "Параметри:\n" -#: pg_resetwal.c:1211 +#: pg_resetwal.c:1220 #, c-format msgid " -c, --commit-timestamp-ids=XID,XID\n" -" set oldest and newest transactions bearing\n" -" commit timestamp (zero means no change)\n" -msgstr " -c, --commit-timestamp-ids=XID,XID \n" -" встановити найстарішу та найновішу транзакції\n" -" затвердити позначку часу (0 -- не змінювати)\n" +" set oldest and newest transactions bearing\n" +" commit timestamp (zero means no change)\n" +msgstr "" -#: pg_resetwal.c:1214 +#: pg_resetwal.c:1223 #, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]DATADIR каталог даних\n" +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr "" -#: pg_resetwal.c:1215 +#: pg_resetwal.c:1224 #, c-format -msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" -msgstr " -e, --epoch=XIDEPOCH встановити наступну епоху ID транзакцій\n" +msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" +msgstr "" -#: pg_resetwal.c:1216 +#: pg_resetwal.c:1225 #, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force потрібно виконати оновлення\n" +msgid " -f, --force force update to be done\n" +msgstr "" -#: pg_resetwal.c:1217 +#: pg_resetwal.c:1226 #, c-format -msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" -msgstr " -l, --next-wal-file=WALFILE задати мінімальне початкове розташування для нового WAL\n" +msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" +msgstr "" -#: pg_resetwal.c:1218 +#: pg_resetwal.c:1227 #, c-format -msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" -msgstr " -m, --multixact-ids=MXID,MXID задати ідентифікатор наступної і найстарішої мультитранзакції\n" +msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" +msgstr "" -#: pg_resetwal.c:1219 +#: pg_resetwal.c:1228 #, c-format -msgid " -n, --dry-run no update, just show what would be done\n" -msgstr " -n, --dry-run не оновлювати, лише показати, що буде зроблено\n" +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr "" -#: pg_resetwal.c:1220 +#: pg_resetwal.c:1229 #, c-format -msgid " -o, --next-oid=OID set next OID\n" -msgstr " -o, --next-oid=OID задати наступний OID\n" +msgid " -o, --next-oid=OID set next OID\n" +msgstr "" -#: pg_resetwal.c:1221 +#: pg_resetwal.c:1230 #, c-format -msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" -msgstr " -O, --multixact-offset=OFFSET задати зсув наступної мультітранзакції\n" +msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" +msgstr "" -#: pg_resetwal.c:1222 +#: pg_resetwal.c:1231 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version вивести інформацію про версію і вийти\n" +msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" +msgstr "" -#: pg_resetwal.c:1223 +#: pg_resetwal.c:1232 #, c-format -msgid " -x, --next-transaction-id=XID set next transaction ID\n" -msgstr " -x, --next-transaction-id=XID задати ідентифікатор наступної транзакції\n" +msgid " -V, --version output version information, then exit\n" +msgstr "" -#: pg_resetwal.c:1224 +#: pg_resetwal.c:1233 #, c-format -msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" -msgstr " --wal-segsize=SIZE розміри сегментів WAL у мегабайтах\n" +msgid " -x, --next-transaction-id=XID set next transaction ID\n" +msgstr "" -#: pg_resetwal.c:1225 +#: pg_resetwal.c:1234 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help показати довідку, потім вийти\n" +msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" +msgstr "" -#: pg_resetwal.c:1226 +#: pg_resetwal.c:1235 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr "" + +#: pg_resetwal.c:1236 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "Повідомляти про помилки на <%s>.\n" -#: pg_resetwal.c:1227 +#: pg_resetwal.c:1237 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" diff --git a/src/bin/pg_resetwal/po/zh_CN.po b/src/bin/pg_resetwal/po/zh_CN.po index f5cec00c61..5a401d1384 100644 --- a/src/bin/pg_resetwal/po/zh_CN.po +++ b/src/bin/pg_resetwal/po/zh_CN.po @@ -5,174 +5,183 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_resetwal (PostgreSQL) 12\n" +"Project-Id-Version: pg_resetwal (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-05-31 17:30+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:47+0000\n" +"PO-Revision-Date: 2021-08-15 17:30+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/common/logging.c:188 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "致命的: " -#: ../../../src/common/logging.c:195 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "错误: " -#: ../../../src/common/logging.c:202 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "警告: " -#: ../../common/restricted_token.c:69 +#: ../../common/restricted_token.c:64 +#, c-format +msgid "could not load library \"%s\": error code %lu" +msgstr "无法加载库 \"%s\": 错误码 %lu" + +#: ../../common/restricted_token.c:73 #, c-format -msgid "cannot create restricted tokens on this platform" -msgstr "无法为该平台创建受限制的令牌" +msgid "cannot create restricted tokens on this platform: error code %lu" +msgstr "无法为该平台创建受限制的令牌:错误码 %lu" -#: ../../common/restricted_token.c:78 +#: ../../common/restricted_token.c:82 #, c-format msgid "could not open process token: error code %lu" msgstr "无法打开进程令牌 (token): 错误码 %lu" -#: ../../common/restricted_token.c:91 +#: ../../common/restricted_token.c:97 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "无法分配SID: 错误码 %lu" -#: ../../common/restricted_token.c:110 +#: ../../common/restricted_token.c:119 #, c-format msgid "could not create restricted token: error code %lu" msgstr "无法创建受限令牌: 错误码为 %lu" -#: ../../common/restricted_token.c:131 +#: ../../common/restricted_token.c:140 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "无法为命令 \"%s\"创建进程: 错误码 %lu" -#: ../../common/restricted_token.c:169 +#: ../../common/restricted_token.c:178 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "无法使用受限令牌再次执行: 错误码 %lu" -#: ../../common/restricted_token.c:185 +#: ../../common/restricted_token.c:194 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "无法从子进程得到退出码: 错误码 %lu" #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:160 pg_resetwal.c:175 pg_resetwal.c:190 pg_resetwal.c:197 -#: pg_resetwal.c:221 pg_resetwal.c:236 pg_resetwal.c:244 pg_resetwal.c:269 -#: pg_resetwal.c:283 +#: pg_resetwal.c:162 pg_resetwal.c:177 pg_resetwal.c:192 pg_resetwal.c:207 +#: pg_resetwal.c:214 pg_resetwal.c:238 pg_resetwal.c:253 pg_resetwal.c:261 +#: pg_resetwal.c:286 pg_resetwal.c:300 #, c-format msgid "invalid argument for option %s" msgstr "选项%s的参数无效" -#: pg_resetwal.c:161 pg_resetwal.c:176 pg_resetwal.c:191 pg_resetwal.c:198 -#: pg_resetwal.c:222 pg_resetwal.c:237 pg_resetwal.c:245 pg_resetwal.c:270 -#: pg_resetwal.c:284 pg_resetwal.c:310 pg_resetwal.c:323 pg_resetwal.c:331 +#: pg_resetwal.c:163 pg_resetwal.c:178 pg_resetwal.c:193 pg_resetwal.c:208 +#: pg_resetwal.c:215 pg_resetwal.c:239 pg_resetwal.c:254 pg_resetwal.c:262 +#: pg_resetwal.c:287 pg_resetwal.c:301 pg_resetwal.c:327 pg_resetwal.c:340 +#: pg_resetwal.c:348 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "请用 \"%s --help\" 获取更多的信息.\n" -#: pg_resetwal.c:166 +#: pg_resetwal.c:168 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "事务ID epoch(-e)不能为-1" -#: pg_resetwal.c:181 -#, c-format -msgid "transaction ID (-x) must not be 0" -msgstr "事务ID(-x)不能为0" +#: pg_resetwal.c:183 +msgid "oldest transaction ID (-u) must be greater than or equal to %u" +msgstr "最旧的事务ID(-c)必须大于或等于%u" + +#: pg_resetwal.c:198 +msgid "transaction ID (-x) must be greater than or equal to %u" +msgstr "事务ID(-x)必须大于或等于%u" -#: pg_resetwal.c:205 pg_resetwal.c:212 +#: pg_resetwal.c:222 pg_resetwal.c:229 #, c-format msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" msgstr "事务ID(-c)必须为0或大于或等于2" -#: pg_resetwal.c:227 +#: pg_resetwal.c:244 #, c-format msgid "OID (-o) must not be 0" msgstr "OID (-o)不能为0" -#: pg_resetwal.c:250 +#: pg_resetwal.c:267 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "多事务ID(-m)不能为0" -#: pg_resetwal.c:260 +#: pg_resetwal.c:277 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "最早的多事务ID(-m)不能为0" -#: pg_resetwal.c:275 +#: pg_resetwal.c:292 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "多事务偏移量(-O)不能为-1" -#: pg_resetwal.c:299 +#: pg_resetwal.c:316 #, c-format msgid "argument of --wal-segsize must be a number" -msgstr "--wal-segsize的参数必须是数字" +msgstr "--wal-segsize的参数必须是一个数字" -#: pg_resetwal.c:304 +#: pg_resetwal.c:321 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "--wal-segsize的参数必须是2的幂次方(在1和1024之间)" -#: pg_resetwal.c:321 +#: pg_resetwal.c:338 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "命令行参数太多 (第一个是 \"%s\")" -#: pg_resetwal.c:330 +#: pg_resetwal.c:347 #, c-format msgid "no data directory specified" msgstr "没有指定数据目录" -#: pg_resetwal.c:344 -#, fc-format +#: pg_resetwal.c:361 +#, c-format msgid "cannot be executed by \"root\"" msgstr "不能由\"root\"执行" -#: pg_resetwal.c:345 +#: pg_resetwal.c:362 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "您现在作为PostgreSQL超级用户运行%s." -#: pg_resetwal.c:356 +#: pg_resetwal.c:373 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "没有读取目录 \"%s\" 的权限: %m" -#: pg_resetwal.c:365 +#: pg_resetwal.c:382 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "无法跳转到目录 \"%s\" 中: %m" -#: pg_resetwal.c:381 pg_resetwal.c:545 pg_resetwal.c:602 +#: pg_resetwal.c:398 pg_resetwal.c:553 pg_resetwal.c:604 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "为了读取, 无法打开文件 \"%s\": %m" -#: pg_resetwal.c:388 +#: pg_resetwal.c:405 #, c-format msgid "lock file \"%s\" exists" msgstr "锁文件 \"%s\" 存在" -#: pg_resetwal.c:389 +#: pg_resetwal.c:406 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "服务器是否正在运行?如果没有,请删除锁文件并重试." -#: pg_resetwal.c:492 +#: pg_resetwal.c:501 #, c-format msgid "" "\n" @@ -181,7 +190,7 @@ msgstr "" "\n" "如果这些值似乎可以接受,则使用-f强制重置.\n" -#: pg_resetwal.c:504 +#: pg_resetwal.c:513 #, c-format msgid "" "The database server was not shut down cleanly.\n" @@ -192,32 +201,32 @@ msgstr "" "重置预写日志可能会导致数据丢失.\n" "如果仍要继续,请使用-f强制重置.\n" -#: pg_resetwal.c:518 +#: pg_resetwal.c:527 #, c-format msgid "Write-ahead log reset\n" msgstr "重置预写日志\n" -#: pg_resetwal.c:554 +#: pg_resetwal.c:562 #, c-format msgid "unexpected empty file \"%s\"" msgstr "意外的空文件\"%s\"" -#: pg_resetwal.c:556 pg_resetwal.c:618 +#: pg_resetwal.c:564 pg_resetwal.c:620 #, c-format msgid "could not read file \"%s\": %m" msgstr "无法读取文件 \"%s\": %m" -#: pg_resetwal.c:571 +#: pg_resetwal.c:573 #, c-format msgid "data directory is of wrong version" msgstr "数据目录版本错误" -#: pg_resetwal.c:572 +#: pg_resetwal.c:574 #, c-format msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." msgstr "文件\"%s\"包含\"%s\",与此程序的版本\"%s\"不兼容." -#: pg_resetwal.c:605 +#: pg_resetwal.c:607 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" @@ -228,24 +237,24 @@ msgstr "" " touch %s\n" "请再试一次" -#: pg_resetwal.c:636 +#: pg_resetwal.c:638 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "pg_control存在,但具有无效的CRC;请小心继续" -#: pg_resetwal.c:645 +#: pg_resetwal.c:647 #, c-format msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" msgstr[0] "pg_control指定的WAL段大小(%d 字节)无效; 请小心继续" msgstr[1] "pg_control指定的WAL段大小(%d 字节)无效; 请小心继续" -#: pg_resetwal.c:656 +#: pg_resetwal.c:658 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "pg_control存在,但已损坏或版本错误;忽略它" -#: pg_resetwal.c:754 +#: pg_resetwal.c:753 #, c-format msgid "" "Guessed pg_control values:\n" @@ -254,7 +263,7 @@ msgstr "" "猜测的pg_control的值:\n" "\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:755 #, c-format msgid "" "Current pg_control values:\n" @@ -263,172 +272,166 @@ msgstr "" "当前的pg_control的值:\n" "\n" -#: pg_resetwal.c:765 +#: pg_resetwal.c:757 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_control 版本: %u\n" -#: pg_resetwal.c:767 +#: pg_resetwal.c:759 #, c-format msgid "Catalog version number: %u\n" msgstr "Catalog 版本: %u\n" -#: pg_resetwal.c:769 -#, c-format -msgid "Database system identifier: %s\n" -msgstr "数据库系统标识符: %s\n" +#: pg_resetwal.c:761 +msgid "Database system identifier: %llu\n" +msgstr "数据库系统标识符: %llu\n" -#: pg_resetwal.c:771 +#: pg_resetwal.c:763 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "最新检查点的 TimeLineID: %u\n" -#: pg_resetwal.c:773 +#: pg_resetwal.c:765 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "最新检查点的full_page_writes: %s\n" -#: pg_resetwal.c:774 +#: pg_resetwal.c:766 msgid "off" msgstr "关闭" -#: pg_resetwal.c:774 +#: pg_resetwal.c:766 msgid "on" msgstr "开启" -#: pg_resetwal.c:775 +#: pg_resetwal.c:767 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "最新检查点的NextXID: %u:%u\n" -#: pg_resetwal.c:778 +#: pg_resetwal.c:770 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "最新检查点的 NextOID: %u\n" -#: pg_resetwal.c:780 +#: pg_resetwal.c:772 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "最新检查点的NextMultiXactId: %u\n" -#: pg_resetwal.c:782 +#: pg_resetwal.c:774 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "最新检查点的NextMultiOffsetD: %u\n" -#: pg_resetwal.c:784 +#: pg_resetwal.c:776 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "最新检查点的oldestXID: %u\n" -#: pg_resetwal.c:786 +#: pg_resetwal.c:778 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "最新检查点的oldestXID所在的数据库:%u\n" -#: pg_resetwal.c:788 +#: pg_resetwal.c:780 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "最新检查点的oldestActiveXID: %u\n" -#: pg_resetwal.c:790 +#: pg_resetwal.c:782 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "最新检查点的oldestMultiXid: %u\n" -#: pg_resetwal.c:792 +#: pg_resetwal.c:784 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "最新检查点的oldestMulti所在的数据库:%u\n" -#: pg_resetwal.c:794 +#: pg_resetwal.c:786 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "最新检查点的oldestCommitTsXid:%u\n" -#: pg_resetwal.c:796 +#: pg_resetwal.c:788 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "最新检查点的newestCommitTsXid:%u\n" -#: pg_resetwal.c:798 +#: pg_resetwal.c:790 #, c-format msgid "Maximum data alignment: %u\n" msgstr "最大数据校准: %u\n" -#: pg_resetwal.c:801 +#: pg_resetwal.c:793 #, c-format msgid "Database block size: %u\n" msgstr "数据库块大小: %u\n" -#: pg_resetwal.c:803 +#: pg_resetwal.c:795 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "大关系的每段块数: %u\n" -#: pg_resetwal.c:805 +#: pg_resetwal.c:797 #, c-format msgid "WAL block size: %u\n" msgstr "WAL的块大小: %u\n" -#: pg_resetwal.c:807 pg_resetwal.c:895 +#: pg_resetwal.c:799 pg_resetwal.c:885 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "每一个 WAL 段字节数: %u\n" -#: pg_resetwal.c:809 +#: pg_resetwal.c:801 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "标识符的最大长度: %u\n" -#: pg_resetwal.c:811 +#: pg_resetwal.c:803 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "在索引中可允许使用最大的列数: %u\n" -#: pg_resetwal.c:813 +#: pg_resetwal.c:805 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "TOAST区块的最大长度: %u\n" -#: pg_resetwal.c:815 +#: pg_resetwal.c:807 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "大对象区块的大小: %u\n" -#: pg_resetwal.c:818 +#: pg_resetwal.c:810 #, c-format msgid "Date/time type storage: %s\n" msgstr "日期/时间 类型存储: %s\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:811 msgid "64-bit integers" msgstr "64位整数" -#: pg_resetwal.c:820 +#: pg_resetwal.c:812 #, c-format -msgid "Float4 argument passing: %s\n" -msgstr "正在传递Flloat4类型的参数: %s\n" +msgid "Float8 argument passing: %s\n" +msgstr "正在传递Flloat8类型的参数: %s\n" -#: pg_resetwal.c:821 pg_resetwal.c:823 +#: pg_resetwal.c:813 msgid "by reference" msgstr "由引用" -#: pg_resetwal.c:821 pg_resetwal.c:823 +#: pg_resetwal.c:813 msgid "by value" msgstr "由值" -#: pg_resetwal.c:822 -#, c-format -msgid "Float8 argument passing: %s\n" -msgstr "正在传递Flloat8类型的参数: %s\n" - -#: pg_resetwal.c:824 +#: pg_resetwal.c:814 #, c-format msgid "Data page checksum version: %u\n" msgstr "数据页校验和版本: %u\n" -#: pg_resetwal.c:838 +#: pg_resetwal.c:828 #, c-format msgid "" "\n" @@ -440,109 +443,109 @@ msgstr "" "\n" "要更改的值:\n" -#: pg_resetwal.c:842 +#: pg_resetwal.c:832 #, c-format msgid "First log segment after reset: %s\n" msgstr "First log segment after reset: %s\n" -#: pg_resetwal.c:846 +#: pg_resetwal.c:836 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:848 +#: pg_resetwal.c:838 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:850 +#: pg_resetwal.c:840 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "OldestMulti's DB: %u\n" -#: pg_resetwal.c:856 +#: pg_resetwal.c:846 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:862 +#: pg_resetwal.c:852 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:868 +#: pg_resetwal.c:858 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:870 +#: pg_resetwal.c:860 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:872 +#: pg_resetwal.c:862 #, c-format msgid "OldestXID's DB: %u\n" msgstr "OldestXID's DB: %u\n" -#: pg_resetwal.c:878 +#: pg_resetwal.c:868 #, c-format msgid "NextXID epoch: %u\n" msgstr "NextXID epoch: %u\n" -#: pg_resetwal.c:884 +#: pg_resetwal.c:874 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:889 +#: pg_resetwal.c:879 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:975 pg_resetwal.c:1043 pg_resetwal.c:1090 +#: pg_resetwal.c:965 pg_resetwal.c:1033 pg_resetwal.c:1080 #, c-format msgid "could not open directory \"%s\": %m" msgstr "无法打开目录 \"%s\": %m" -#: pg_resetwal.c:1010 pg_resetwal.c:1063 pg_resetwal.c:1113 +#: pg_resetwal.c:1000 pg_resetwal.c:1053 pg_resetwal.c:1103 #, c-format msgid "could not read directory \"%s\": %m" msgstr "无法读取目录 \"%s\": %m" -#: pg_resetwal.c:1016 pg_resetwal.c:1069 pg_resetwal.c:1119 +#: pg_resetwal.c:1006 pg_resetwal.c:1059 pg_resetwal.c:1109 #, c-format msgid "could not close directory \"%s\": %m" msgstr "无法关闭目录 \"%s\": %m" -#: pg_resetwal.c:1055 pg_resetwal.c:1105 +#: pg_resetwal.c:1045 pg_resetwal.c:1095 #, c-format msgid "could not delete file \"%s\": %m" msgstr "无法删除文件 \"%s\": %m" -#: pg_resetwal.c:1186 +#: pg_resetwal.c:1176 #, c-format msgid "could not open file \"%s\": %m" msgstr "无法打开文件 \"%s\": %m" -#: pg_resetwal.c:1196 pg_resetwal.c:1209 +#: pg_resetwal.c:1186 pg_resetwal.c:1199 #, c-format msgid "could not write file \"%s\": %m" msgstr "无法写入文件 \"%s\": %m" -#: pg_resetwal.c:1216 +#: pg_resetwal.c:1206 #, c-format msgid "fsync error: %m" msgstr "fsync 错误: %m" -#: pg_resetwal.c:1227 +#: pg_resetwal.c:1217 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" "\n" msgstr "%s 重置一个PostgreSQL数据库集簇的预写式日志.\n" -#: pg_resetwal.c:1228 +#: pg_resetwal.c:1218 #, c-format msgid "" "Usage:\n" @@ -552,88 +555,84 @@ msgstr "" "用法:\n" " %s [选项]... 数据目录\n" -#: pg_resetwal.c:1229 +#: pg_resetwal.c:1219 #, c-format msgid "Options:\n" msgstr "选项:\n" -#: pg_resetwal.c:1230 -#, c-format +#: pg_resetwal.c:1220 msgid "" " -c, --commit-timestamp-ids=XID,XID\n" -" set oldest and newest transactions bearing\n" -" commit timestamp (zero means no change)\n" +" set oldest and newest transactions bearing\n" +" commit timestamp (zero means no change)\n" msgstr "" " -c, --commit-timestamp-ids=XID,XID\n" " 设置提交时间可以检索到的最老的和最新的事务ID\n" " (0意味着没有变化)\n" -#: pg_resetwal.c:1233 -#, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]DATADIR 数据目录\n" +#: pg_resetwal.c:1223 +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]DATADIR 数据目录\n" -#: pg_resetwal.c:1234 -#, c-format -msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" -msgstr " -e, --epoch=XIDEPOCH 设置下一个事务ID的epoch\n" +#: pg_resetwal.c:1224 +msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" +msgstr " -e, --epoch=XIDEPOCH 设置下一个事务ID的epoch\n" -#: pg_resetwal.c:1235 -#, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force 强制更新完成\n" +#: pg_resetwal.c:1225 +msgid " -f, --force force update to be done\n" +msgstr " -f, --force 强制更新完成\n" -#: pg_resetwal.c:1236 -#, c-format -msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" -msgstr " -l, --next-wal-file=WALFILE 设置新的WAL最小起始位置\n" +#: pg_resetwal.c:1226 +msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" +msgstr " -l, --next-wal-file=WALFILE 设置新的WAL最小起始位置\n" -#: pg_resetwal.c:1237 -#, c-format -msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" -msgstr " -m, --multixact-ids=MXID,MXID 设置下一个和最旧的多事务ID\n" +#: pg_resetwal.c:1227 +msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" +msgstr " -m, --multixact-ids=MXID,MXID 设置下一个和最旧的多事务ID\n" -#: pg_resetwal.c:1238 -#, c-format -msgid " -n, --dry-run no update, just show what would be done\n" -msgstr " -n, --dry-run 不更新,只显示将要执行的操作\n" +#: pg_resetwal.c:1228 +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr " -n, --dry-run 不更新,只显示将要执行的操作\n" -#: pg_resetwal.c:1239 -#, c-format -msgid " -o, --next-oid=OID set next OID\n" -msgstr " -o, --next-oid=OID 设置下一个OID\n" +#: pg_resetwal.c:1229 +msgid " -o, --next-oid=OID set next OID\n" +msgstr " -o, --next-oid=OID 设置下一个OID\n" -#: pg_resetwal.c:1240 -#, c-format -msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" -msgstr " -O, --multixact-offset=OFFSET 设置下一个多事务偏移量\n" +#: pg_resetwal.c:1230 +msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" +msgstr " -O, --multixact-offset=OFFSET 设置下一个多事务偏移量\n" -#: pg_resetwal.c:1241 -#, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version 输出版本信息,然后退出\n" +#: pg_resetwal.c:1231 +msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" +msgstr " -u, --oldest-transaction-id=XID 设置最旧的事务ID\n" -#: pg_resetwal.c:1242 -#, c-format -msgid " -x, --next-transaction-id=XID set next transaction ID\n" -msgstr " -x, --next-transaction-id=XID 设置下一个事务ID\n" +#: pg_resetwal.c:1232 +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version 输出版本信息, 然后退出\n" -#: pg_resetwal.c:1243 -#, c-format -msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" -msgstr " --wal-segsize=SIZE WAL段的大小(兆字节)\n" +#: pg_resetwal.c:1233 +msgid " -x, --next-transaction-id=XID set next transaction ID\n" +msgstr " -x, --next-transaction-id=XID 设置下一个事务ID\n" -#: pg_resetwal.c:1244 -#, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help 显示本帮助,然后退出\n" +#: pg_resetwal.c:1234 +msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" +msgstr " --wal-segsize=SIZE WAL段的大小(兆字节)\n" -#: pg_resetwal.c:1245 +#: pg_resetwal.c:1235 +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help 显示此帮助信息, 然后退出\n" + +#: pg_resetwal.c:1236 #, c-format msgid "" "\n" -"Report bugs to .\n" +"Report bugs to <%s>.\n" msgstr "" "\n" -"报告错误至 .\n" +"臭虫报告至<%s>.\n" + +#: pg_resetwal.c:1237 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 主页: <%s>\n" diff --git a/src/bin/pg_rewind/nls.mk b/src/bin/pg_rewind/nls.mk index a50f9139df..e9d91a39cb 100644 --- a/src/bin/pg_rewind/nls.mk +++ b/src/bin/pg_rewind/nls.mk @@ -1,6 +1,6 @@ # src/bin/pg_rewind/nls.mk CATALOG_NAME = pg_rewind -AVAIL_LANGUAGES = cs de es fr it ja ko pl pt_BR ru sv tr uk zh_CN +AVAIL_LANGUAGES = cs de el es fr it ja ko pl pt_BR ru sv tr uk zh_CN GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) datapagemap.c file_ops.c filemap.c libpq_source.c local_source.c parsexlog.c pg_rewind.c timeline.c xlogreader.c ../../common/fe_memutils.c ../../common/restricted_token.c ../../fe_utils/archive.c ../../fe_utils/recovery_gen.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) report_invalid_record:2 GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \ diff --git a/src/bin/pg_rewind/po/de.po b/src/bin/pg_rewind/po/de.po index e3b922f2d9..ffa4729589 100644 --- a/src/bin/pg_rewind/po/de.po +++ b/src/bin/pg_rewind/po/de.po @@ -1,13 +1,13 @@ # German message translation file for pg_rewind -# Copyright (C) 2015-2021 PostgreSQL Global Development Group +# Copyright (C) 2015-2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: pg_rewind (PostgreSQL) 14\n" +"Project-Id-Version: pg_rewind (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-14 08:49+0000\n" -"PO-Revision-Date: 2021-05-14 14:40+0200\n" +"POT-Creation-Date: 2022-05-10 15:50+0000\n" +"PO-Revision-Date: 2022-05-10 20:00+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -16,21 +16,26 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "Fatal: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "Warnung: " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "Tipp: " + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -77,60 +82,59 @@ msgstr "konnte Prozess für Befehl »%s« nicht starten: Fehlercode %lu" msgid "could not re-execute with restricted token: error code %lu" msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu" -#: ../../fe_utils/archive.c:53 +#: ../../fe_utils/archive.c:52 #, c-format msgid "cannot use restore_command with %%r placeholder" msgstr "kann restore_command mit Platzhalter %%r nicht verwenden" -#: ../../fe_utils/archive.c:74 +#: ../../fe_utils/archive.c:70 #, c-format msgid "unexpected file size for \"%s\": %lld instead of %lld" msgstr "unerwartete Dateigröße für »%s«: %lld statt %lld" -#: ../../fe_utils/archive.c:85 +#: ../../fe_utils/archive.c:78 #, c-format msgid "could not open file \"%s\" restored from archive: %m" msgstr "konnte aus dem Archiv wiederhergestellte Datei »%s« nicht öffnen: %m" -#: ../../fe_utils/archive.c:97 file_ops.c:417 +#: ../../fe_utils/archive.c:87 file_ops.c:417 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" -#: ../../fe_utils/archive.c:112 +#: ../../fe_utils/archive.c:99 #, c-format msgid "restore_command failed: %s" msgstr "restore_command fehlgeschlagen: %s" -#: ../../fe_utils/archive.c:121 +#: ../../fe_utils/archive.c:106 #, c-format msgid "could not restore file \"%s\" from archive" msgstr "konnte Datei »%s« nicht aus Archiv wiederherstellen" -#: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49 -#: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100 -#: ../../fe_utils/recovery_gen.c:171 parsexlog.c:77 parsexlog.c:135 -#: parsexlog.c:195 +#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 +#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 +#: ../../fe_utils/recovery_gen.c:149 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" -#: ../../fe_utils/recovery_gen.c:134 parsexlog.c:308 +#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" -#: ../../fe_utils/recovery_gen.c:140 +#: ../../fe_utils/recovery_gen.c:124 #, c-format msgid "could not write to file \"%s\": %m" msgstr "konnte nicht in Datei »%s« schreiben: %m" -#: ../../fe_utils/recovery_gen.c:152 +#: ../../fe_utils/recovery_gen.c:133 #, c-format msgid "could not create file \"%s\": %m" msgstr "konnte Datei »%s« nicht erstellen: %m" @@ -205,12 +209,12 @@ msgstr "konnte symbolische Verknüpfung »%s« nicht löschen: %m" msgid "could not open file \"%s\" for reading: %m" msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" -#: file_ops.c:341 local_source.c:107 parsexlog.c:346 +#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350 #, c-format msgid "could not read file \"%s\": %m" msgstr "konnte Datei »%s« nicht lesen: %m" -#: file_ops.c:344 parsexlog.c:348 +#: file_ops.c:344 parsexlog.c:352 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" @@ -245,207 +249,222 @@ msgstr "konnte Verzeichnis »%s« nicht lesen: %m" msgid "could not close directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht schließen: %m" -#: filemap.c:237 +#: filemap.c:236 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "Datendatei »%s« in der Quelle ist keine normale Datei" -#: filemap.c:242 filemap.c:275 +#: filemap.c:241 filemap.c:274 #, c-format msgid "duplicate source file \"%s\"" msgstr "doppelte Quelldatei »%s«" -#: filemap.c:330 +#: filemap.c:329 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "unerwartete Seitenänderung für nicht normale Datei »%s«" -#: filemap.c:680 filemap.c:774 +#: filemap.c:679 filemap.c:773 #, c-format msgid "unknown file type for \"%s\"" msgstr "unbekannter Dateityp für »%s«" -#: filemap.c:707 +#: filemap.c:706 #, c-format msgid "file \"%s\" is of different type in source and target" msgstr "Datei »%s« hat unterschiedlichen Typ in Quelle und Ziel" -#: filemap.c:779 +#: filemap.c:778 #, c-format msgid "could not decide what to do with file \"%s\"" msgstr "konnte nicht entscheiden, was mit Datei »%s« zu tun ist" -#: libpq_source.c:128 +#: libpq_source.c:130 #, c-format msgid "could not clear search_path: %s" msgstr "konnte search_path nicht auf leer setzen: %s" -#: libpq_source.c:139 +#: libpq_source.c:141 #, c-format msgid "full_page_writes must be enabled in the source server" msgstr "full_page_writes muss im Quell-Server eingeschaltet sein" -#: libpq_source.c:150 +#: libpq_source.c:152 #, c-format msgid "could not prepare statement to fetch file contents: %s" msgstr "konnte Anfrage zum Holen des Dateiinhalts nicht vorbereiten: %s" -#: libpq_source.c:169 +#: libpq_source.c:171 #, c-format msgid "error running query (%s) on source server: %s" msgstr "Fehler beim Ausführen einer Anfrage (%s) auf dem Quellserver: %s" -#: libpq_source.c:174 +#: libpq_source.c:176 #, c-format msgid "unexpected result set from query" msgstr "Anfrage ergab unerwartete Ergebnismenge" -#: libpq_source.c:196 +#: libpq_source.c:198 #, c-format msgid "error running query (%s) in source server: %s" msgstr "Fehler beim Ausführen einer Anfrage (%s) im Quellserver: %s" -#: libpq_source.c:217 +#: libpq_source.c:219 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "unbekanntes Ergebnis »%s« für aktuelle WAL-Einfügeposition" -#: libpq_source.c:268 +#: libpq_source.c:270 #, c-format msgid "could not fetch file list: %s" msgstr "konnte Dateiliste nicht holen: %s" -#: libpq_source.c:273 +#: libpq_source.c:275 #, c-format msgid "unexpected result set while fetching file list" msgstr "unerwartete Ergebnismenge beim Holen der Dateiliste" -#: libpq_source.c:435 +#: libpq_source.c:467 #, c-format msgid "could not send query: %s" msgstr "konnte Anfrage nicht senden: %s" -#: libpq_source.c:438 +#: libpq_source.c:470 #, c-format msgid "could not set libpq connection to single row mode" msgstr "konnte libpq-Verbindung nicht in den Einzelzeilenmodus setzen" -#: libpq_source.c:468 +#: libpq_source.c:500 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "unerwartetes Ergebnis beim Holen von fernen Dateien: %s" -#: libpq_source.c:473 +#: libpq_source.c:505 #, c-format msgid "received more data chunks than requested" msgstr "mehr Daten-Chunks erhalten als verlangt" -#: libpq_source.c:477 +#: libpq_source.c:509 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "unerwartete Ergebnismengengröße beim Holen von fernen Dateien" -#: libpq_source.c:483 +#: libpq_source.c:515 #, c-format msgid "unexpected data types in result set while fetching remote files: %u %u %u" msgstr "unerwartete Datentypen in Ergebnismenge beim Holen von fernen Dateien: %u %u %u" -#: libpq_source.c:491 +#: libpq_source.c:523 #, c-format msgid "unexpected result format while fetching remote files" msgstr "unerwartetes Ergebnisformat beim Holen von fernen Dateien" -#: libpq_source.c:497 +#: libpq_source.c:529 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "unerwartete NULL-Werte im Ergebnis beim Holen von fernen Dateien" -#: libpq_source.c:501 +#: libpq_source.c:533 #, c-format msgid "unexpected result length while fetching remote files" msgstr "unerwartete Ergebnislänge beim Holen von fernen Dateien" -#: libpq_source.c:534 +#: libpq_source.c:566 #, c-format msgid "received data for file \"%s\", when requested for \"%s\"" msgstr "Daten für Datei »%s« erhalten, aber »%s« wurde verlangt" -#: libpq_source.c:538 +#: libpq_source.c:570 #, c-format msgid "received data at offset %lld of file \"%s\", when requested for offset %lld" msgstr "Daten für Offset %lld von Datei »%s« erhalten, aber Offset %lld wurde verlangt" -#: libpq_source.c:550 +#: libpq_source.c:582 #, c-format msgid "received more than requested for file \"%s\"" msgstr "mehr als verlangt erhalten für Datei »%s«" -#: libpq_source.c:563 +#: libpq_source.c:595 #, c-format msgid "unexpected number of data chunks received" msgstr "unerwartete Anzahl Daten-Chunks erhalten" -#: libpq_source.c:606 +#: libpq_source.c:638 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "konnte ferne Datei »%s« nicht holen: %s" -#: libpq_source.c:611 +#: libpq_source.c:643 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "unerwartete Ergebnismenge beim Holen der fernen Datei »%s«" -#: local_source.c:86 +#: local_source.c:90 local_source.c:142 #, c-format msgid "could not open source file \"%s\": %m" msgstr "konnte Quelldatei »%s« nicht öffnen: %m" -#: local_source.c:90 +#: local_source.c:117 +#, c-format +msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied" +msgstr "Größe der Quelldatei »%s« nebenläufig verändert: %d Bytes erwartet, %d kopiert" + +#: local_source.c:121 local_source.c:172 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schließen: %m" + +#: local_source.c:146 #, c-format msgid "could not seek in source file: %m" msgstr "konnte Positionszeiger in Quelldatei nicht setzen: %m" -#: local_source.c:109 +#: local_source.c:165 #, c-format msgid "unexpected EOF while reading file \"%s\"" msgstr "unerwartetes EOF beim Lesen der Datei »%s«" -#: local_source.c:116 +#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "konnte Datei »%s« nicht schließen: %m" +msgid "out of memory while allocating a WAL reading processor" +msgstr "Speicher aufgebraucht beim Anlegen eines WAL-Leseprozessors" -#: parsexlog.c:89 parsexlog.c:142 +#: parsexlog.c:92 parsexlog.c:146 #, c-format msgid "could not read WAL record at %X/%X: %s" msgstr "konnte WAL-Eintrag bei %X/%X nicht lesen: %s" -#: parsexlog.c:93 parsexlog.c:145 +#: parsexlog.c:96 parsexlog.c:149 #, c-format msgid "could not read WAL record at %X/%X" msgstr "konnte WAL-Eintrag bei %X/%X nicht lesen" -#: parsexlog.c:208 +#: parsexlog.c:108 +#, c-format +msgid "end pointer %X/%X is not a valid end point; expected %X/%X" +msgstr "Endpunkt %X/%X ist kein gültiger Endpunkt; %X/%X erwartet" + +#: parsexlog.c:212 #, c-format msgid "could not find previous WAL record at %X/%X: %s" msgstr "konnte vorangegangenen WAL-Eintrag bei %X/%X nicht finden: %s" -#: parsexlog.c:212 +#: parsexlog.c:216 #, c-format msgid "could not find previous WAL record at %X/%X" msgstr "konnte vorangegangenen WAL-Eintrag bei %X/%X nicht finden" -#: parsexlog.c:337 +#: parsexlog.c:341 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "konnte Positionszeiger in Datei »%s« nicht setzen: %m" -#: parsexlog.c:429 +#: parsexlog.c:440 #, c-format -msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmgr: %s, info: %02X" -msgstr "WAL-Eintrag modifiziert eine Relation, aber Typ des Eintrags wurde nicht erkannt: lsn: %X/%X, rmgr: %s, info: %02X" +msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" +msgstr "WAL-Eintrag modifiziert eine Relation, aber Typ des Eintrags wurde nicht erkannt: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" -#: pg_rewind.c:84 +#: pg_rewind.c:86 #, c-format msgid "" "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" @@ -454,7 +473,7 @@ msgstr "" "%s resynchronisiert einen PostgreSQL-Cluster mit einer Kopie des Clusters.\n" "\n" -#: pg_rewind.c:85 +#: pg_rewind.c:87 #, c-format msgid "" "Usage:\n" @@ -465,12 +484,12 @@ msgstr "" " %s [OPTION]...\n" "\n" -#: pg_rewind.c:86 +#: pg_rewind.c:88 #, c-format msgid "Options:\n" msgstr "Optionen:\n" -#: pg_rewind.c:87 +#: pg_rewind.c:89 #, c-format msgid "" " -c, --restore-target-wal use restore_command in target configuration to\n" @@ -479,43 +498,43 @@ msgstr "" " -c, --restore-target-wal restore_command in der Zielkonfiguration zum\n" " Laden von WAL-Dateien aus Archiv verwenden\n" -#: pg_rewind.c:89 +#: pg_rewind.c:91 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr " -D, --target-pgdata=VERZ bestehendes zu modifizierendes Datenverzeichnis\n" -#: pg_rewind.c:90 +#: pg_rewind.c:92 #, c-format msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" msgstr "" " --source-pgdata=VERZ Quelldatenverzeichnis, mit dem synchronisiert\n" " werden soll\n" -#: pg_rewind.c:91 +#: pg_rewind.c:93 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr " --source-server=VERB Quellserver, mit dem synchronisiert werden soll\n" -#: pg_rewind.c:92 +#: pg_rewind.c:94 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr " -n, --dry-run anhalten, bevor etwas geändert wird\n" -#: pg_rewind.c:93 +#: pg_rewind.c:95 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written\n" " safely to disk\n" msgstr "" -" -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n" -" geschrieben sind\n" +" -N, --no-sync nicht warten, bis Änderungen sicher auf\n" +" Festplatte geschrieben sind\n" -#: pg_rewind.c:95 +#: pg_rewind.c:97 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress Fortschrittsmeldungen ausgeben\n" -#: pg_rewind.c:96 +#: pg_rewind.c:98 #, c-format msgid "" " -R, --write-recovery-conf write configuration for replication\n" @@ -524,27 +543,36 @@ msgstr "" " -R, --write-recovery-conf Konfiguration für Replikation schreiben\n" " (benötigt --source-server)\n" -#: pg_rewind.c:98 +#: pg_rewind.c:100 +#, c-format +msgid "" +" --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" +msgstr "" +" --config-file=DATEINAME angegebene Serverkonfigurationsdatei zum\n" +" Starten des Ziel-Clusters verwenden\n" + +#: pg_rewind.c:102 #, c-format msgid " --debug write a lot of debug messages\n" msgstr " --debug viele Debug-Meldungen ausgeben\n" -#: pg_rewind.c:99 +#: pg_rewind.c:103 #, c-format msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" msgstr " --no-ensure-shutdown unsauberen Shutdown nicht automatisch reparieren\n" -#: pg_rewind.c:100 +#: pg_rewind.c:104 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_rewind.c:101 +#: pg_rewind.c:105 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_rewind.c:102 +#: pg_rewind.c:106 #, c-format msgid "" "\n" @@ -553,237 +581,225 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_rewind.c:103 +#: pg_rewind.c:107 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_rewind.c:164 pg_rewind.c:213 pg_rewind.c:220 pg_rewind.c:227 -#: pg_rewind.c:234 pg_rewind.c:242 +#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237 +#: pg_rewind.c:244 pg_rewind.c:252 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_rewind.c:212 +#: pg_rewind.c:222 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "keine Quelle angegeben (--source-pgdata oder --source-server)" -#: pg_rewind.c:219 +#: pg_rewind.c:229 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "--source-pgdata und --source-server können nicht zusammen angegeben werden" -#: pg_rewind.c:226 +#: pg_rewind.c:236 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "kein Zielverzeichnis angegeben (--target-pgdata)" -#: pg_rewind.c:233 +#: pg_rewind.c:243 #, c-format msgid "no source server information (--source-server) specified for --write-recovery-conf" msgstr "kein Quellserver (--source-server) angegeben für --write-recovery-conf" -#: pg_rewind.c:240 +#: pg_rewind.c:250 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_rewind.c:255 +#: pg_rewind.c:265 #, c-format msgid "cannot be executed by \"root\"" msgstr "kann nicht von »root« ausgeführt werden" -#: pg_rewind.c:256 +#: pg_rewind.c:266 #, c-format -msgid "You must run %s as the PostgreSQL superuser.\n" -msgstr "Sie müssen %s als PostgreSQL-Superuser ausführen.\n" +msgid "You must run %s as the PostgreSQL superuser." +msgstr "Sie müssen %s als PostgreSQL-Superuser ausführen." -#: pg_rewind.c:267 +#: pg_rewind.c:276 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %m" -#: pg_rewind.c:287 +#: pg_rewind.c:294 #, c-format msgid "%s" msgstr "%s" -#: pg_rewind.c:290 +#: pg_rewind.c:297 #, c-format msgid "connected to server" msgstr "mit Server verbunden" -#: pg_rewind.c:337 +#: pg_rewind.c:344 #, c-format msgid "source and target cluster are on the same timeline" msgstr "Quell- und Ziel-Cluster sind auf der gleichen Zeitleiste" -#: pg_rewind.c:346 +#: pg_rewind.c:353 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "Server divergierten bei WAL-Position %X/%X auf Zeitleiste %u" -#: pg_rewind.c:394 +#: pg_rewind.c:401 #, c-format msgid "no rewind required" msgstr "kein Rückspulen nötig" -#: pg_rewind.c:403 +#: pg_rewind.c:410 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "Rückspulen ab letztem gemeinsamen Checkpoint bei %X/%X auf Zeitleiste %u" -#: pg_rewind.c:413 +#: pg_rewind.c:420 #, c-format msgid "reading source file list" msgstr "lese Quelldateiliste" -#: pg_rewind.c:417 +#: pg_rewind.c:424 #, c-format msgid "reading target file list" msgstr "lese Zieldateiliste" -#: pg_rewind.c:426 +#: pg_rewind.c:433 #, c-format msgid "reading WAL in target" msgstr "lese WAL im Ziel-Cluster" -#: pg_rewind.c:447 +#: pg_rewind.c:454 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "%lu MB müssen kopiert werden (Gesamtgröße des Quellverzeichnisses ist %lu MB)" -#: pg_rewind.c:465 +#: pg_rewind.c:472 #, c-format msgid "syncing target data directory" msgstr "synchronisiere Zieldatenverzeichnis" -#: pg_rewind.c:481 +#: pg_rewind.c:488 #, c-format msgid "Done!" msgstr "Fertig!" -#: pg_rewind.c:564 +#: pg_rewind.c:568 #, c-format msgid "no action decided for file \"%s\"" msgstr "keine Aktion bestimmt für Datei »%s«" -#: pg_rewind.c:596 +#: pg_rewind.c:600 #, c-format msgid "source system was modified while pg_rewind was running" msgstr "Quellsystem wurde verändert, während pg_rewind lief" -#: pg_rewind.c:600 +#: pg_rewind.c:604 #, c-format msgid "creating backup label and updating control file" msgstr "erzeuge Backup-Label und aktualisiere Kontrolldatei" -#: pg_rewind.c:650 +#: pg_rewind.c:654 #, c-format msgid "source system was in unexpected state at end of rewind" msgstr "Quellsystem war in einem unerwarteten Zustand am Ende des Rückspulens" -#: pg_rewind.c:681 +#: pg_rewind.c:685 #, c-format msgid "source and target clusters are from different systems" msgstr "Quell- und Ziel-Cluster sind von verschiedenen Systemen" -#: pg_rewind.c:689 +#: pg_rewind.c:693 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "die Cluster sind nicht mit dieser Version von pg_rewind kompatibel" -#: pg_rewind.c:699 +#: pg_rewind.c:703 #, c-format msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" msgstr "Zielserver muss entweder Datenprüfsummen oder »wal_log_hints = on« verwenden" -#: pg_rewind.c:710 +#: pg_rewind.c:714 #, c-format msgid "target server must be shut down cleanly" msgstr "Zielserver muss sauber heruntergefahren worden sein" -#: pg_rewind.c:720 +#: pg_rewind.c:724 #, c-format msgid "source data directory must be shut down cleanly" msgstr "Quelldatenverzeichnis muss sauber heruntergefahren worden sein" -#: pg_rewind.c:772 +#: pg_rewind.c:771 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s kB (%d%%) kopiert" -#: pg_rewind.c:835 +#: pg_rewind.c:834 #, c-format msgid "invalid control file" msgstr "ungültige Kontrolldatei" -#: pg_rewind.c:919 +#: pg_rewind.c:918 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "konnte keinen gemeinsamen Anfangspunkt in den Zeitleisten von Quell- und Ziel-Cluster finden" -#: pg_rewind.c:960 +#: pg_rewind.c:959 #, c-format msgid "backup label buffer too small" msgstr "Puffer für Backup-Label ist zu klein" -#: pg_rewind.c:983 +#: pg_rewind.c:982 #, c-format msgid "unexpected control file CRC" msgstr "unerwartete CRC in Kontrolldatei" -#: pg_rewind.c:995 +#: pg_rewind.c:994 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "unerwartete Kontrolldateigröße %d, erwartet wurde %d" -#: pg_rewind.c:1004 +#: pg_rewind.c:1003 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber die Kontrolldatei gibt %d Byte an" msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber die Kontrolldatei gibt %d Bytes an" -#: pg_rewind.c:1043 pg_rewind.c:1101 +#: pg_rewind.c:1042 pg_rewind.c:1112 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"Das Programm »%s« wird von %s benötigt, aber wurde nicht im\n" -"selben Verzeichnis wie »%s« gefunden.\n" -"Prüfen Sie Ihre Installation." +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden" -#: pg_rewind.c:1048 pg_rewind.c:1106 +#: pg_rewind.c:1045 pg_rewind.c:1115 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"Das Programm »%s« wurde von %s gefunden,\n" -"aber es hatte nicht die gleiche Version wie %s.\n" -"Prüfen Sie Ihre Installation." +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s" -#: pg_rewind.c:1069 +#: pg_rewind.c:1078 #, c-format msgid "restore_command is not set in the target cluster" msgstr "restore_command ist im Ziel-Cluster nicht gesetzt" -#: pg_rewind.c:1112 +#: pg_rewind.c:1119 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "führe »%s« für Zielserver aus, um Wiederherstellung abzuschließen" -#: pg_rewind.c:1132 +#: pg_rewind.c:1156 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "postgres im Einzelbenutzermodus im Ziel-Cluster fehlgeschlagen" -#: pg_rewind.c:1133 +#: pg_rewind.c:1157 #, c-format msgid "Command was: %s" msgstr "Die Anweisung war: %s" @@ -823,137 +839,157 @@ msgstr "ungültige Daten in History-Datei" msgid "Timeline IDs must be less than child timeline's ID." msgstr "Zeitleisten-IDs müssen kleiner als die Zeitleisten-ID des Kindes sein." -#: xlogreader.c:349 +#: xlogreader.c:621 #, c-format msgid "invalid record offset at %X/%X" msgstr "ungültiger Datensatz-Offset bei %X/%X" -#: xlogreader.c:357 +#: xlogreader.c:629 #, c-format msgid "contrecord is requested by %X/%X" msgstr "Contrecord angefordert von %X/%X" -#: xlogreader.c:398 xlogreader.c:695 +#: xlogreader.c:670 xlogreader.c:1102 #, c-format msgid "invalid record length at %X/%X: wanted %u, got %u" msgstr "ungültige Datensatzlänge bei %X/%X: %u erwartet, %u erhalten" -#: xlogreader.c:422 +#: xlogreader.c:699 +#, c-format +msgid "out of memory while trying to decode a record of length %u" +msgstr "Speicher aufgebraucht beim Versuch einen Datensatz mit Länge %u zu dekodieren" + +#: xlogreader.c:721 #, c-format msgid "record length %u at %X/%X too long" msgstr "Datensatzlänge %u bei %X/%X ist zu lang" -#: xlogreader.c:453 +#: xlogreader.c:770 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "keine Contrecord-Flag bei %X/%X" -#: xlogreader.c:466 +#: xlogreader.c:783 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "ungültige Contrecord-Länge %u (erwartet %lld) bei %X/%X" -#: xlogreader.c:703 +#: xlogreader.c:1110 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ungültige Resource-Manager-ID %u bei %X/%X" -#: xlogreader.c:716 xlogreader.c:732 +#: xlogreader.c:1123 xlogreader.c:1139 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "Datensatz mit falschem Prev-Link %X/%X bei %X/%X" -#: xlogreader.c:768 +#: xlogreader.c:1175 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "ungültige Resource-Manager-Datenprüfsumme in Datensatz bei %X/%X" -#: xlogreader.c:805 +#: xlogreader.c:1212 #, c-format msgid "invalid magic number %04X in log segment %s, offset %u" msgstr "ungültige magische Zahl %04X in Logsegment %s, Offset %u" -#: xlogreader.c:819 xlogreader.c:860 +#: xlogreader.c:1226 xlogreader.c:1267 #, c-format msgid "invalid info bits %04X in log segment %s, offset %u" msgstr "ungültige Info-Bits %04X in Logsegment %s, Offset %u" -#: xlogreader.c:834 +#: xlogreader.c:1241 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: Datenbanksystemidentifikator in WAL-Datei ist %llu, Datenbanksystemidentifikator in pg_control ist %llu" -#: xlogreader.c:842 +#: xlogreader.c:1249 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche Segmentgröße im Seitenkopf" -#: xlogreader.c:848 +#: xlogreader.c:1255 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche XLOG_BLCKSZ im Seitenkopf" -#: xlogreader.c:879 +#: xlogreader.c:1286 #, c-format msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" msgstr "unerwartete Pageaddr %X/%X in Logsegment %s, Offset %u" -#: xlogreader.c:904 +#: xlogreader.c:1311 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" msgstr "Zeitleisten-ID %u außer der Reihe (nach %u) in Logsegment %s, Offset %u" -#: xlogreader.c:1249 +#: xlogreader.c:1706 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u außer der Reihe bei %X/%X" -#: xlogreader.c:1271 +#: xlogreader.c:1730 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA gesetzt, aber keine Daten enthalten bei %X/%X" -#: xlogreader.c:1278 +#: xlogreader.c:1737 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA nicht gesetzt, aber Datenlänge ist %u bei %X/%X" -#: xlogreader.c:1314 +#: xlogreader.c:1773 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE gesetzt, aber Loch Offset %u Länge %u Block-Abbild-Länge %u bei %X/%X" -#: xlogreader.c:1330 +#: xlogreader.c:1789 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE nicht gesetzt, aber Loch Offset %u Länge %u bei %X/%X" -#: xlogreader.c:1345 +#: xlogreader.c:1803 #, c-format -msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" -msgstr "BKPIMAGE_IS_COMPRESSED gesetzt, aber Block-Abbild-Länge %u bei %X/%X" +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge %u bei %X/%X" -#: xlogreader.c:1360 +#: xlogreader.c:1818 #, c-format -msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" -msgstr "weder BKPIMAGE_HAS_HOLE noch BKPIMAGE_IS_COMPRESSED gesetzt, aber Block-Abbild-Länge ist %u bei %X/%X" +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "weder BKPIMAGE_HAS_HOLE noch BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge ist %u bei %X/%X" -#: xlogreader.c:1376 +#: xlogreader.c:1834 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL gesetzt, aber keine vorangehende Relation bei %X/%X" -#: xlogreader.c:1388 +#: xlogreader.c:1846 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ungültige block_id %u bei %X/%X" -#: xlogreader.c:1475 +#: xlogreader.c:1913 #, c-format msgid "record with invalid length at %X/%X" msgstr "Datensatz mit ungültiger Länge bei %X/%X" -#: xlogreader.c:1564 +#: xlogreader.c:1938 +#, c-format +msgid "failed to locate backup block with ID %d in WAL record" +msgstr "konnte Backup-Block mit ID %d nicht im WAL-Eintrag finden" + +#: xlogreader.c:2044 xlogreader.c:2061 +#, c-format +msgid "image at %X/%X compressed with %s not supported by build, block %d" +msgstr "Abbild bei %X/%X komprimiert mit %s nicht unterstützt von dieser Installation, Block %d" + +#: xlogreader.c:2070 +#, c-format +msgid "image at %X/%X compressed with unknown method, block %d" +msgstr "Abbild bei %X/%X, komprimiert mit unbekannter Methode, Block %d" + +#: xlogreader.c:2078 #, c-format msgid "invalid compressed image at %X/%X, block %d" msgstr "ungültiges komprimiertes Abbild bei %X/%X, Block %d" diff --git a/src/bin/pg_rewind/po/el.po b/src/bin/pg_rewind/po/el.po new file mode 100644 index 0000000000..7fbe5eeb7b --- /dev/null +++ b/src/bin/pg_rewind/po/el.po @@ -0,0 +1,959 @@ +# Greek message translation file for pg_rewind +# Copyright (C) 2021 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_rewind (PostgreSQL) package. +# Georgios Kokolatos , 2021. +# +# +# +msgid "" +msgstr "" +"Project-Id-Version: pg_rewind (PostgreSQL) 14\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2021-06-09 21:19+0000\n" +"PO-Revision-Date: 2021-07-05 15:33+0200\n" +"Last-Translator: Georgios Kokolatos \n" +"Language-Team: \n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.0\n" + +#: ../../../src/common/logging.c:259 +#, c-format +msgid "fatal: " +msgstr "κρίσιμο: " + +#: ../../../src/common/logging.c:266 +#, c-format +msgid "error: " +msgstr "σφάλμα: " + +#: ../../../src/common/logging.c:273 +#, c-format +msgid "warning: " +msgstr "προειδοποίηση: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#, c-format +msgid "out of memory\n" +msgstr "έλλειψη μνήμης\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "δεν ήταν δυνατή η αντιγραφή δείκτη null (εσωτερικό σφάλμα)\n" + +#: ../../common/restricted_token.c:64 +#, c-format +msgid "could not load library \"%s\": error code %lu" +msgstr "δεν ήταν δυνατή η φόρτωση της βιβλιοθήκης «%s»: κωδικός σφάλματος %lu" + +#: ../../common/restricted_token.c:73 +#, c-format +msgid "cannot create restricted tokens on this platform: error code %lu" +msgstr "δεν ήταν δυνατή η δημιουργία διακριτικών περιορισμού στην παρούσα πλατφόρμα: κωδικός σφάλματος %lu" + +#: ../../common/restricted_token.c:82 +#, c-format +msgid "could not open process token: error code %lu" +msgstr "δεν ήταν δυνατό το άνοιγμα διακριτικού διεργασίας: κωδικός σφάλματος %lu" + +#: ../../common/restricted_token.c:97 +#, c-format +msgid "could not allocate SIDs: error code %lu" +msgstr "δεν ήταν δυνατή η εκχώρηση SID: κωδικός σφάλματος %lu" + +#: ../../common/restricted_token.c:119 +#, c-format +msgid "could not create restricted token: error code %lu" +msgstr "δεν ήταν δυνατή η δημιουργία διακριτικού διεργασίας: κωδικός σφάλματος %lu" + +#: ../../common/restricted_token.c:140 +#, c-format +msgid "could not start process for command \"%s\": error code %lu" +msgstr "δεν ήταν δυνατή η εκκίνηση διεργασίας για την εντολή «%s»: κωδικός σφάλματος %lu" + +#: ../../common/restricted_token.c:178 +#, c-format +msgid "could not re-execute with restricted token: error code %lu" +msgstr "δεν ήταν δυνατή η επανεκκίνηση με διακριτικό περιορισμού: κωδικός σφάλματος %lu" + +#: ../../common/restricted_token.c:194 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "δεν ήταν δυνατή η απόκτηση κωδικού εξόδου από την υποδιεργασία: κωδικός σφάλματος %lu" + +#: ../../fe_utils/archive.c:53 +#, c-format +msgid "cannot use restore_command with %%r placeholder" +msgstr "δεν είναι δυνατή η χρήση restore_command μαζί με %%r placeholder" + +#: ../../fe_utils/archive.c:74 +#, c-format +msgid "unexpected file size for \"%s\": %lld instead of %lld" +msgstr "μη αναμενόμενο μέγεθος αρχείου για «%s»: %lld αντί για %lld" + +#: ../../fe_utils/archive.c:85 +#, c-format +msgid "could not open file \"%s\" restored from archive: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s» που έχει επαναφερθεί από την αρχειοθήκη: %m" + +#: ../../fe_utils/archive.c:97 file_ops.c:417 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο «%s»: %m" + +#: ../../fe_utils/archive.c:112 +#, c-format +msgid "restore_command failed: %s" +msgstr "restore_command απέτυχε: %s" + +#: ../../fe_utils/archive.c:121 +#, c-format +msgid "could not restore file \"%s\" from archive" +msgstr "δεν ήταν δυνατή η επαναφορά του αρχείου «%s» από την αρχειοθήκη" + +#: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49 +#: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100 +#: ../../fe_utils/recovery_gen.c:171 parsexlog.c:77 parsexlog.c:135 +#: parsexlog.c:195 +#, c-format +msgid "out of memory" +msgstr "έλλειψη μνήμης" + +#: ../../fe_utils/recovery_gen.c:134 parsexlog.c:308 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %m" + +#: ../../fe_utils/recovery_gen.c:140 +#, c-format +msgid "could not write to file \"%s\": %m" +msgstr "δεν ήταν δυνατή η εγγραφή στο αρχείο «%s»: %m" + +#: ../../fe_utils/recovery_gen.c:152 +#, c-format +msgid "could not create file \"%s\": %m" +msgstr "δεν ήταν δυνατή η δημιουργία αρχείου «%s»: %m" + +#: file_ops.c:67 +#, c-format +msgid "could not open target file \"%s\": %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου προορισμού «%s»: %m" + +#: file_ops.c:81 +#, c-format +msgid "could not close target file \"%s\": %m" +msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου προορισμού «%s»: %m" + +#: file_ops.c:101 +#, c-format +msgid "could not seek in target file \"%s\": %m" +msgstr "δεν ήταν δυνατή η αναζήτηση στο αρχείο προορισμού «%s»: %m" + +#: file_ops.c:117 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "δεν ήταν δυνατή η εγγραφή αρχείου «%s»: %m" + +#: file_ops.c:150 file_ops.c:177 +#, c-format +msgid "undefined file type for \"%s\"" +msgstr "απροσδιόριστος τύπος αρχείου για το «%s»" + +#: file_ops.c:173 +#, c-format +msgid "invalid action (CREATE) for regular file" +msgstr "μη έγκυρη ενέργεια (CREATE) για κανονικό αρχείο" + +#: file_ops.c:200 +#, c-format +msgid "could not remove file \"%s\": %m" +msgstr "δεν ήταν δυνατή η αφαίρεση του αρχείου «%s»: %m" + +#: file_ops.c:218 +#, c-format +msgid "could not open file \"%s\" for truncation: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s» για περικοπή: %m" + +#: file_ops.c:222 +#, c-format +msgid "could not truncate file \"%s\" to %u: %m" +msgstr "δεν ήταν δυνατή η περικοπή του αρχείου «%s» σε %u: %m" + +#: file_ops.c:238 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "δεν ήταν δυνατή η δημιουργία του καταλόγου «%s»: %m" + +#: file_ops.c:252 +#, c-format +msgid "could not remove directory \"%s\": %m" +msgstr "δεν ήταν δυνατή η αφαίρεση του καταλόγου «%s»: %m" + +#: file_ops.c:266 +#, c-format +msgid "could not create symbolic link at \"%s\": %m" +msgstr "δεν ήταν δυνατή η δημιουργία του συμβολικού συνδέσμου «%s»: %m" + +#: file_ops.c:280 +#, c-format +msgid "could not remove symbolic link \"%s\": %m" +msgstr "δεν ήταν δυνατή η αφαίρεση της συμβολικής σύνδεσης «%s»: %m" + +#: file_ops.c:326 file_ops.c:330 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου «%s» για ανάγνωση: %m" + +#: file_ops.c:341 local_source.c:107 parsexlog.c:346 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: %m" + +#: file_ops.c:344 parsexlog.c:348 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: ανέγνωσε %d από %zu" + +#: file_ops.c:388 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m" + +#: file_ops.c:446 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου «%s»: %m" + +#: file_ops.c:449 +#, c-format +msgid "symbolic link \"%s\" target is too long" +msgstr "ο συμβολικός σύνδεσμος «%s» είναι πολύ μακρύς" + +#: file_ops.c:464 +#, c-format +msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform" +msgstr "«%s» είναι ένας συμβολικός σύνδεσμος, αλλά οι συμβολικοί σύνδεσμοι δεν υποστηρίζονται σε αυτήν την πλατφόρμα" + +#: file_ops.c:471 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m" + +#: file_ops.c:475 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m" + +#: filemap.c:237 +#, c-format +msgid "data file \"%s\" in source is not a regular file" +msgstr "το αρχείο «%s» δεν είναι ένα κανονικό αρχείο" + +#: filemap.c:242 filemap.c:275 +#, c-format +msgid "duplicate source file \"%s\"" +msgstr "διπλότυπο αρχείο προέλευσης «%s»" + +#: filemap.c:330 +#, c-format +msgid "unexpected page modification for non-regular file \"%s\"" +msgstr "μη αναμενόμενη τροποποίηση σελίδας για μη κανονικό αρχείο «%s»" + +#: filemap.c:680 filemap.c:774 +#, c-format +msgid "unknown file type for \"%s\"" +msgstr "άγνωστος τύπος αρχείου για το «%s»" + +#: filemap.c:707 +#, c-format +msgid "file \"%s\" is of different type in source and target" +msgstr "το αρχείο «%s» είναι διαφορετικού τύπου στην προέλευση και τον προορισμό" + +#: filemap.c:779 +#, c-format +msgid "could not decide what to do with file \"%s\"" +msgstr "δεν ήταν δυνατή η λήψη του αρχείου «%s»" + +#: libpq_source.c:128 +#, c-format +msgid "could not clear search_path: %s" +msgstr "δεν ήταν δυνατή η εκκαθάριση του search_path: %s" + +#: libpq_source.c:139 +#, c-format +msgid "full_page_writes must be enabled in the source server" +msgstr "full_page_writes πρέπει να είναι ενεργοποιημένο στο διακομιστή προέλευσης" + +#: libpq_source.c:150 +#, c-format +msgid "could not prepare statement to fetch file contents: %s" +msgstr "δεν ήταν δυνατή η προετοιμασία της δήλωσης για τη λήψη περιεχομένων αρχείου: %s" + +#: libpq_source.c:169 +#, c-format +msgid "error running query (%s) on source server: %s" +msgstr "σφάλμα κατά την εκτέλεση ερωτήματος (%s) στο διακομιστή προέλευσης: %s" + +#: libpq_source.c:174 +#, c-format +msgid "unexpected result set from query" +msgstr "μη αναμενόμενο σύνολο αποτελεσμάτων από ερώτημα" + +#: libpq_source.c:196 +#, c-format +msgid "error running query (%s) in source server: %s" +msgstr "σφάλμα κατά την εκτέλεση ερωτήματος (%s) στο διακομιστή προέλευσης: %s" + +#: libpq_source.c:217 +#, c-format +msgid "unrecognized result \"%s\" for current WAL insert location" +msgstr "μη αναγνωρίσιμο αποτέλεσμα «%s» για την τρέχουσα θέση εισαγωγής WAL" + +#: libpq_source.c:268 +#, c-format +msgid "could not fetch file list: %s" +msgstr "δεν ήταν δυνατή η λήψη λίστας αρχείων: %s" + +#: libpq_source.c:273 +#, c-format +msgid "unexpected result set while fetching file list" +msgstr "μη αναμενόμενο σύνολο αποτελεσμάτων κατά τη λήψη λίστας αρχείων" + +#: libpq_source.c:435 +#, c-format +msgid "could not send query: %s" +msgstr "δεν ήταν δυνατή η αποστολή ερωτήματος: %s" + +#: libpq_source.c:438 +#, c-format +msgid "could not set libpq connection to single row mode" +msgstr "δεν ήταν δυνατή η ρύθμιση της σύνδεσης libpq σε λειτουργία μονής σειράς" + +#: libpq_source.c:468 +#, c-format +msgid "unexpected result while fetching remote files: %s" +msgstr "μη αναμενόμενο αποτέλεσμα κατά τη λήψη απομακρυσμένων αρχείων: %s" + +#: libpq_source.c:473 +#, c-format +msgid "received more data chunks than requested" +msgstr "έλαβε περισσότερα τμήματα δεδομένων από όσα ζητήθηκαν" + +#: libpq_source.c:477 +#, c-format +msgid "unexpected result set size while fetching remote files" +msgstr "μη αναμενόμενο μέγεθος συνόλου αποτελεσμάτων κατά τη λήψη απομακρυσμένων αρχείων" + +#: libpq_source.c:483 +#, c-format +msgid "unexpected data types in result set while fetching remote files: %u %u %u" +msgstr "μη αναμενόμενοι τύποι δεδομένων στο σύνολο αποτελεσμάτων κατά τη λήψη απομακρυσμένων αρχείων: %u %u %u" + +#: libpq_source.c:491 +#, c-format +msgid "unexpected result format while fetching remote files" +msgstr "μη αναμενόμενη μορφή αποτελέσματος κατά τη λήψη απομακρυσμένων αρχείων" + +#: libpq_source.c:497 +#, c-format +msgid "unexpected null values in result while fetching remote files" +msgstr "μη αναμενόμενες τιμές null κατά τη λήψη απομακρυσμένων αρχείων" + +#: libpq_source.c:501 +#, c-format +msgid "unexpected result length while fetching remote files" +msgstr "μη αναμενόμενο μήκος αποτελέσματος κατά τη λήψη απομακρυσμένων αρχείων" + +#: libpq_source.c:534 +#, c-format +msgid "received data for file \"%s\", when requested for \"%s\"" +msgstr "έλαβε δεδομένα για το αρχείο «%s», όταν ζητήθηκε το «%s»" + +#: libpq_source.c:538 +#, c-format +msgid "received data at offset %lld of file \"%s\", when requested for offset %lld" +msgstr "έλαβε δεδομένα σε μετατόπιση %lld του αρχείου «%s», όταν ζητήθηκε μετατόπιση %lld" + +#: libpq_source.c:550 +#, c-format +msgid "received more than requested for file \"%s\"" +msgstr "έλαβε περισσότερα από όσα ζήτησε για το αρχείο «%s»" + +#: libpq_source.c:563 +#, c-format +msgid "unexpected number of data chunks received" +msgstr "έλαβε μη αναμενόμενο αριθμό τμημάτων δεδομένων" + +#: libpq_source.c:606 +#, c-format +msgid "could not fetch remote file \"%s\": %s" +msgstr "δεν ήταν δυνατή η λήψη απομακρυσμένου αρχείου «%s»: %s" + +#: libpq_source.c:611 +#, c-format +msgid "unexpected result set while fetching remote file \"%s\"" +msgstr "μη αναμενόμενο σύνολο αποτελεσμάτων κατά τη λήψη απομακρυσμένου αρχείου «%s»" + +#: local_source.c:86 +#, c-format +msgid "could not open source file \"%s\": %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου προέλευσης «%s»: %m" + +#: local_source.c:90 +#, c-format +msgid "could not seek in source file: %m" +msgstr "δεν ήταν δυνατή η αναζήτηση στο αρχείο προέλευσης: %m" + +#: local_source.c:109 +#, c-format +msgid "unexpected EOF while reading file \"%s\"" +msgstr "μη αναμενόμενο EOF κατά την ανάγνωση αρχείου «%s»" + +#: local_source.c:116 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου «%s»: %m" + +#: parsexlog.c:89 parsexlog.c:142 +#, c-format +msgid "could not read WAL record at %X/%X: %s" +msgstr "δεν ήταν δυνατή η ανάγνωση WAL εγγραφής στο %X/%X: %s" + +#: parsexlog.c:93 parsexlog.c:145 +#, c-format +msgid "could not read WAL record at %X/%X" +msgstr "δεν ήταν δυνατή η ανάγνωση WAL εγγραφής στο %X/%X" + +#: parsexlog.c:208 +#, c-format +msgid "could not find previous WAL record at %X/%X: %s" +msgstr "δεν ήταν δυνατή η εύρεση προηγούμενης WAL εγγραφής σε %X/%X: %s" + +#: parsexlog.c:212 +#, c-format +msgid "could not find previous WAL record at %X/%X" +msgstr "δεν ήταν δυνατή η εύρεση προηγούμενης WAL εγγραφής σε %X/%X" + +#: parsexlog.c:337 +#, c-format +msgid "could not seek in file \"%s\": %m" +msgstr "δεν ήταν δυνατή η αναζήτηση στο αρχείο «%s»: %m" + +#: parsexlog.c:429 +#, c-format +msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmgr: %s, info: %02X" +msgstr "Η εγγραφή WAL τροποποιεί μια σχέση, αλλά ο τύπος εγγραφής δεν αναγνωρίζεται: lsn: %X/%X, rmgr: %s, info: %02X" + +#: pg_rewind.c:84 +#, c-format +msgid "" +"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" +"\n" +msgstr "" +"%s επανασυγχρονίζει μία συστάδα PostgreSQL με ένα άλλο αντίγραφο της συστάδας.\n" +"\n" + +#: pg_rewind.c:85 +#, c-format +msgid "" +"Usage:\n" +" %s [OPTION]...\n" +"\n" +msgstr "" +"Χρήση:\n" +" %s [ΕΠΙΛΟΓΗ]...\n" +"\n" + +#: pg_rewind.c:86 +#, c-format +msgid "Options:\n" +msgstr "Επιλογές:\n" + +#: pg_rewind.c:87 +#, c-format +msgid "" +" -c, --restore-target-wal use restore_command in target configuration to\n" +" retrieve WAL files from archives\n" +msgstr "" +" -c, --restore-target-wal χρησιμοποίησε restore_command στη ρύθμιση προορισμού για την\n" +" ανάκτηση αρχείων WAL από αρχειοθήκες\n" + +#: pg_rewind.c:89 +#, c-format +msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" +msgstr " -D, --target-pgdata=DIRECTORY υπάρχον κατάλογος δεδομένων προς τροποποιήση\n" + +#: pg_rewind.c:90 +#, c-format +msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" +msgstr " --source-pgdata=DIRECTORY κατάλογος δεδομένων προέλευσης για συγχρονισμό\n" + +#: pg_rewind.c:91 +#, c-format +msgid " --source-server=CONNSTR source server to synchronize with\n" +msgstr " --source-server=CONNSTR διακομιστής προέλευσης για συγχρονισμό\n" + +#: pg_rewind.c:92 +#, c-format +msgid " -n, --dry-run stop before modifying anything\n" +msgstr " -n, --dry-run τερματισμός πριν να τροποποιηθεί οτιδήποτε\n" + +#: pg_rewind.c:93 +#, c-format +msgid "" +" -N, --no-sync do not wait for changes to be written\n" +" safely to disk\n" +msgstr " -N, --no-sync να μην αναμένει την ασφαλή εγγραφή αλλαγών στον δίσκο\n" + +#: pg_rewind.c:95 +#, c-format +msgid " -P, --progress write progress messages\n" +msgstr " -P, --progress εμφάνισε πληροφορίες προόδου\n" + +#: pg_rewind.c:96 +#, c-format +msgid "" +" -R, --write-recovery-conf write configuration for replication\n" +" (requires --source-server)\n" +msgstr "" +" -R, --write-recovery-conf εγγραφή των ρυθμίσεων αναπαραγωγής\n" +" (απαιτεί --source-server)\n" + +#: pg_rewind.c:98 +#, c-format +msgid " --debug write a lot of debug messages\n" +msgstr " --debug εγγραφή πολλών μηνύματων εντοπισμού σφαλμάτων\n" + +#: pg_rewind.c:99 +#, c-format +msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" +msgstr " --no-ensure-shutdown να μην διορθώνει αυτόματα ακάθαρτο τερματισμό\n" + +#: pg_rewind.c:100 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" + +#: pg_rewind.c:101 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" + +#: pg_rewind.c:102 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Υποβάλετε αναφορές σφάλματων σε <%s>.\n" + +#: pg_rewind.c:103 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s αρχική σελίδα: <%s>\n" + +#: pg_rewind.c:164 pg_rewind.c:213 pg_rewind.c:220 pg_rewind.c:227 +#: pg_rewind.c:234 pg_rewind.c:242 +#, c-format +msgid "Try \"%s --help\" for more information.\n" +msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n" + +#: pg_rewind.c:212 +#, c-format +msgid "no source specified (--source-pgdata or --source-server)" +msgstr "δεν καθορίστηκε προέλευση (--source-pgdata ή --source-server)" + +#: pg_rewind.c:219 +#, c-format +msgid "only one of --source-pgdata or --source-server can be specified" +msgstr "μόνο ένα από τα --source-pgdata ή --source-server μπορεί να καθοριστεί" + +#: pg_rewind.c:226 +#, c-format +msgid "no target data directory specified (--target-pgdata)" +msgstr "δεν καθορίστηκε κατάλογος δεδομένων προορισμού (--target-pgdata)" + +#: pg_rewind.c:233 +#, c-format +msgid "no source server information (--source-server) specified for --write-recovery-conf" +msgstr "δεν καθορίστηκαν πληροφορίες διακομιστή προέλευσης (--source-server) για --write-recovery-conf" + +#: pg_rewind.c:240 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)" + +#: pg_rewind.c:255 +#, c-format +msgid "cannot be executed by \"root\"" +msgstr "δεν είναι δυνατή η εκτέλεση από «root»" + +#: pg_rewind.c:256 +#, c-format +msgid "You must run %s as the PostgreSQL superuser.\n" +msgstr "Πρέπει να εκτελέσετε %s ως υπερχρήστης PostgreSQL.\n" + +#: pg_rewind.c:267 +#, c-format +msgid "could not read permissions of directory \"%s\": %m" +msgstr "δεν ήταν δυνατή η ανάγνωση δικαιωμάτων του καταλόγου «%s»: %m" + +#: pg_rewind.c:287 +#, c-format +msgid "%s" +msgstr "%s" + +#: pg_rewind.c:290 +#, c-format +msgid "connected to server" +msgstr "συνδεδεμένος στον διακομιστή" + +#: pg_rewind.c:337 +#, c-format +msgid "source and target cluster are on the same timeline" +msgstr "συστάδες προορισμού και προέλευσης βρίσκονται στην ίδια χρονογραμμή" + +#: pg_rewind.c:346 +#, c-format +msgid "servers diverged at WAL location %X/%X on timeline %u" +msgstr "οι διακομιστές αποκλίνουν στην τοποθεσία WAL %X/%X στη χρονογραμμή %u" + +#: pg_rewind.c:394 +#, c-format +msgid "no rewind required" +msgstr "δεν απαιτείται επαναφορά" + +#: pg_rewind.c:403 +#, c-format +msgid "rewinding from last common checkpoint at %X/%X on timeline %u" +msgstr "επαναφορά από το τελευταίο κοινό σημείο ελέγχου στο %X/%X στη χρονογραμμή %u" + +#: pg_rewind.c:413 +#, c-format +msgid "reading source file list" +msgstr "ανάγνωση λίστας αρχείων προέλευσης" + +#: pg_rewind.c:417 +#, c-format +msgid "reading target file list" +msgstr "ανάγνωση λίστας αρχείων προορισμού" + +#: pg_rewind.c:426 +#, c-format +msgid "reading WAL in target" +msgstr "ανάγνωση WAL στον προορισμό" + +#: pg_rewind.c:447 +#, c-format +msgid "need to copy %lu MB (total source directory size is %lu MB)" +msgstr "πρέπει να αντιγραφούν %lu MB (το συνολικό μέγεθος καταλόγου προέλευσης είναι %lu MB)" + +#: pg_rewind.c:465 +#, c-format +msgid "syncing target data directory" +msgstr "συγχρονισμός καταλόγου δεδομένων προορισμού" + +#: pg_rewind.c:481 +#, c-format +msgid "Done!" +msgstr "Ολοκληρώθηκε!" + +#: pg_rewind.c:564 +#, c-format +msgid "no action decided for file \"%s\"" +msgstr "καμία ενέργεια δεν αποφασίστηκε για το αρχείο «%s»" + +#: pg_rewind.c:596 +#, c-format +msgid "source system was modified while pg_rewind was running" +msgstr "το σύστημα προέλευσης τροποποιήθηκε κατά την εκτέλεση του pg_rewind" + +#: pg_rewind.c:600 +#, c-format +msgid "creating backup label and updating control file" +msgstr "δημιουργία ετικέτας αντιγράφων ασφαλείας και ενημέρωση αρχείου ελέγχου" + +#: pg_rewind.c:650 +#, c-format +msgid "source system was in unexpected state at end of rewind" +msgstr "το σύστημα προέλευσης βρισκόταν σε μη αναμενόμενη κατάσταση στο τέλος της επαναφοράς" + +#: pg_rewind.c:681 +#, c-format +msgid "source and target clusters are from different systems" +msgstr "οι συστάδες προέλευσης και προορισμού προέρχονται από διαφορετικά συστήματα" + +#: pg_rewind.c:689 +#, c-format +msgid "clusters are not compatible with this version of pg_rewind" +msgstr "η συστάδα δεν είναι συμβατή με αυτήν την έκδοση pg_rewind" + +#: pg_rewind.c:699 +#, c-format +msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" +msgstr "ο διακομιστής προορισμού πρέπει να χρησιμοποιεί είτε άθροισμα ελέγχου δεδομένων είτε «wal_log_hints = on»" + +#: pg_rewind.c:710 +#, c-format +msgid "target server must be shut down cleanly" +msgstr "ο διακομιστής προορισμού πρέπει να τερματιστεί καθαρά" + +#: pg_rewind.c:720 +#, c-format +msgid "source data directory must be shut down cleanly" +msgstr "ο κατάλογος δεδομένων προέλευσης πρέπει να τερματιστεί καθαρά" + +#: pg_rewind.c:772 +#, c-format +msgid "%*s/%s kB (%d%%) copied" +msgstr "%*s/%s kB (%d%%) αντιγράφηκαν" + +#: pg_rewind.c:835 +#, c-format +msgid "invalid control file" +msgstr "μη έγκυρο αρχείο ελέγχου" + +#: pg_rewind.c:919 +#, c-format +msgid "could not find common ancestor of the source and target cluster's timelines" +msgstr "δεν ήταν δυνατή η εύρεση κοινού προγόνου των χρονογραμμών των συστάδων προέλευσης και προορισμού" + +#: pg_rewind.c:960 +#, c-format +msgid "backup label buffer too small" +msgstr "ενδιάμεση μνήμη ετικέτας αντιγράφων ασφαλείας πολύ μικρή" + +#: pg_rewind.c:983 +#, c-format +msgid "unexpected control file CRC" +msgstr "μη αναμενόμενο αρχείο ελέγχου CRC" + +#: pg_rewind.c:995 +#, c-format +msgid "unexpected control file size %d, expected %d" +msgstr "μη αναμενόμενο μέγεθος αρχείου ελέγχου %d, αναμένεται %d" + +#: pg_rewind.c:1004 +#, c-format +msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" +msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" +msgstr[0] "η τιμή του μεγέθους τμήματος WAL πρέπει να ανήκει σε δύναμη του δύο μεταξύ 1 MB και 1 GB, αλλά το αρχείο ελέγχου καθορίζει %d byte" +msgstr[1] "η τιμή του μεγέθους τμήματος WAL πρέπει να ανήκει σε δύναμη του δύο μεταξύ 1 MB και 1 GB, αλλά το αρχείο ελέγχου καθορίζει %d bytes" + +#: pg_rewind.c:1043 pg_rewind.c:1101 +#, c-format +msgid "" +"The program \"%s\" is needed by %s but was not found in the\n" +"same directory as \"%s\".\n" +"Check your installation." +msgstr "" +"Το πρόγραμμα «%s» απαιτείται από %s αλλά δεν βρέθηκε στον\n" +"ίδιο κατάλογο με το «%s».\n" +"Ελέγξτε την εγκατάστασή σας." + +#: pg_rewind.c:1048 pg_rewind.c:1106 +#, c-format +msgid "" +"The program \"%s\" was found by \"%s\"\n" +"but was not the same version as %s.\n" +"Check your installation." +msgstr "" +"Το πρόγραμμα «%s» βρέθηκε από το \"%s\"\n" +"αλλά δεν ήταν η ίδια εκδοχή με %s.\n" +"Ελέγξτε την εγκατάστασή σας." + +#: pg_rewind.c:1069 +#, c-format +msgid "restore_command is not set in the target cluster" +msgstr "η εντολή restore_command δεν έχει οριστεί στη συστάδα προορισμού" + +#: pg_rewind.c:1112 +#, c-format +msgid "executing \"%s\" for target server to complete crash recovery" +msgstr "εκτέλεση «%s» για την ολοκλήρωση της αποκατάστασης σφαλμάτων του διακομιστή προορισμού" + +#: pg_rewind.c:1132 +#, c-format +msgid "postgres single-user mode in target cluster failed" +msgstr "λειτουργία μοναδικού-χρήστη postgres στο σύμπλεγμα προορισμού απέτυχε" + +#: pg_rewind.c:1133 +#, c-format +msgid "Command was: %s" +msgstr "Η εντολή ήταν: %s" + +#: timeline.c:75 timeline.c:81 +#, c-format +msgid "syntax error in history file: %s" +msgstr "συντακτικό σφάλμα στο αρχείο ιστορικού: %s" + +#: timeline.c:76 +#, c-format +msgid "Expected a numeric timeline ID." +msgstr "Αναμένεται αριθμητικό ID χρονογραμμής." + +#: timeline.c:82 +#, c-format +msgid "Expected a write-ahead log switchpoint location." +msgstr "Αναμένεται μια θέση write-ahead log switchpoint." + +#: timeline.c:87 +#, c-format +msgid "invalid data in history file: %s" +msgstr "μη έγκυρα δεδομένα στο αρχείο ιστορικού: %s" + +#: timeline.c:88 +#, c-format +msgid "Timeline IDs must be in increasing sequence." +msgstr "Τα IDs χρονογραμμής πρέπει να βρίσκονται σε αυξάνουσα σειρά." + +#: timeline.c:108 +#, c-format +msgid "invalid data in history file" +msgstr "μη έγκυρα δεδομένα στο αρχείο ιστορικού" + +#: timeline.c:109 +#, c-format +msgid "Timeline IDs must be less than child timeline's ID." +msgstr "Τα ID χρονογραμμής πρέπει να είναι λιγότερα από τα ID της χρονογραμμής απογόνου." + +#: xlogreader.c:349 +#, c-format +msgid "invalid record offset at %X/%X" +msgstr "μη έγκυρη μετατόπιση εγγραφών σε %X/%X" + +#: xlogreader.c:357 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "contrecord ζητείται από %X/%X" + +#: xlogreader.c:398 xlogreader.c:695 +#, c-format +msgid "invalid record length at %X/%X: wanted %u, got %u" +msgstr "μη έγκυρο μήκος εγγραφής σε %X/%X: χρειαζόταν %u, έλαβε %u" + +#: xlogreader.c:422 +#, c-format +msgid "record length %u at %X/%X too long" +msgstr "μήκος εγγραφής %u σε %X/%X πολύ μακρύ" + +#: xlogreader.c:453 +#, c-format +msgid "there is no contrecord flag at %X/%X" +msgstr "δεν υπάρχει σημαία contrecord στο %X/%X" + +#: xlogreader.c:466 +#, c-format +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "μη έγκυρο μήκος contrecord %u (αναμένεται %lld) σε %X/%X" + +#: xlogreader.c:703 +#, c-format +msgid "invalid resource manager ID %u at %X/%X" +msgstr "μη έγκυρο ID %u διαχειριστή πόρων στο %X/%X" + +#: xlogreader.c:716 xlogreader.c:732 +#, c-format +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "εγγραφή με εσφαλμένο prev-link %X/%X σε %X/%X" + +#: xlogreader.c:768 +#, c-format +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "εσφαλμένο άθροισμα ελέγχου δεδομένων διαχειριστή πόρων σε εγγραφή στο %X/%X" + +#: xlogreader.c:805 +#, c-format +msgid "invalid magic number %04X in log segment %s, offset %u" +msgstr "μη έγκυρος μαγικός αριθμός %04X στο τμήμα καταγραφής %s, μετατόπιση %u" + +#: xlogreader.c:819 xlogreader.c:860 +#, c-format +msgid "invalid info bits %04X in log segment %s, offset %u" +msgstr "μη έγκυρα info bits %04X στο τμήμα καταγραφής %s, μετατόπιση %u" + +#: xlogreader.c:834 +#, c-format +msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" +msgstr "WAL αρχείο προέρχεται από διαφορετικό σύστημα βάσης δεδομένων: το WAL αναγνωριστικό συστήματος βάσης δεδομένων αρχείων είναι %llu, το pg_control αναγνωριστικό συστήματος βάσης δεδομένων είναι %llu" + +#: xlogreader.c:842 +#, c-format +msgid "WAL file is from different database system: incorrect segment size in page header" +msgstr "WAL αρχείο προέρχεται από διαφορετικό σύστημα βάσης δεδομένων: εσφαλμένο μέγεθος τμήματος στην κεφαλίδα σελίδας" + +#: xlogreader.c:848 +#, c-format +msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" +msgstr "WAL αρχείο προέρχεται από διαφορετικό σύστημα βάσης δεδομένων: εσφαλμένο XLOG_BLCKSZ στην κεφαλίδα σελίδας" + +#: xlogreader.c:879 +#, c-format +msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" +msgstr "μη αναμενόμενο pageaddr %X/%X στο τμήμα καταγραφής %s, μετατόπιση %u" + +#: xlogreader.c:904 +#, c-format +msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" +msgstr "εκτός ακολουθίας ID χρονογραμμής %u (μετά %u) στο τμήμα καταγραφής %s, μετατόπιση %u" + +#: xlogreader.c:1249 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "εκτός ακολουθίας block_id %u στο %X/%X" + +#: xlogreader.c:1271 +#, c-format +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATA έχει οριστεί, αλλά δεν περιλαμβάνονται δεδομένα σε %X/%X" + +#: xlogreader.c:1278 +#, c-format +msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" +msgstr "BKPBLOCK_HAS_DATA δεν έχει οριστεί, αλλά το μήκος των δεδομένων είναι %u σε %X/%X" + +#: xlogreader.c:1314 +#, c-format +msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLE έχει οριστεί, αλλά οπή με μετατόπιση %u μήκος %u μήκος μπλοκ εικόνας %u σε %X/%X" + +#: xlogreader.c:1330 +#, c-format +msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLE δεν έχει οριστεί, αλλά οπή με μετατόπιση %u μήκος %u σε %X/%X" + +#: xlogreader.c:1345 +#, c-format +msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_IS_COMPRESSED έχει οριστεί, αλλά μέγεθοσ μπλοκ εικόνας %u σε %X/%X" + +#: xlogreader.c:1360 +#, c-format +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "ούτε BKPIMAGE_HAS_HOLE ούτε BKPIMAGE_IS_COMPRESSED είναι ορισμένα, αλλά το μήκος της εικόνας μπλοκ είναι %u στο %X/%X" + +#: xlogreader.c:1376 +#, c-format +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "BKPBLOCK_SAME_REL είναι ορισμένο, αλλά καμία προηγούμενη rel στο %X/%X" + +#: xlogreader.c:1388 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "μη έγκυρο block_id %u στο %X/%X" + +#: xlogreader.c:1475 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "εγγραφή με μη έγκυρο μήκος στο %X/%X" + +#: xlogreader.c:1564 +#, c-format +msgid "invalid compressed image at %X/%X, block %d" +msgstr "μη έγκυρη συμπιεσμένη εικόνα στο %X/%X, μπλοκ %d" diff --git a/src/bin/pg_rewind/po/es.po b/src/bin/pg_rewind/po/es.po index fe5a6d5296..4d129e6c8c 100644 --- a/src/bin/pg_rewind/po/es.po +++ b/src/bin/pg_rewind/po/es.po @@ -1,6 +1,6 @@ # Spanish message translation file for pg_rewind # -# Copyright (c) 2015-2019, PostgreSQL Global Development Group +# Copyright (c) 2015-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Álvaro Herrera , 2015. @@ -8,7 +8,7 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_rewind (PostgreSQL) 12\n" +"Project-Id-Version: pg_rewind (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2021-05-14 19:49+0000\n" "PO-Revision-Date: 2021-05-21 23:23-0500\n" diff --git a/src/bin/pg_rewind/po/fr.po b/src/bin/pg_rewind/po/fr.po index 492eacca9c..3308af3fe2 100644 --- a/src/bin/pg_rewind/po/fr.po +++ b/src/bin/pg_rewind/po/fr.po @@ -1,38 +1,46 @@ # LANGUAGE message translation file for pg_rewind -# Copyright (C) 2016 PostgreSQL Global Development Group -# This file is distributed under the same license as the PostgreSQL package. -# FIRST AUTHOR , 2016. +# Copyright (C) 2016-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_rewind (PostgreSQL) package. +# +# Use these quotes: « %s » +# +# Guillaume Lelarge , 2016-2022. # msgid "" msgstr "" -"Project-Id-Version: pg_rewind (PostgreSQL) 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-28 00:49+0000\n" -"PO-Revision-Date: 2021-05-28 15:23+0200\n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" "Last-Translator: Guillaume Lelarge \n" -"Language-Team: \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.3\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "fatal : " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:273 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:280 #, c-format msgid "warning: " msgstr "attention : " +#: ../../../src/common/logging.c:291 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:298 +#, c-format +msgid "hint: " +msgstr "astuce : " + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -79,60 +87,59 @@ msgstr "n'a pas pu démarrer le processus pour la commande « %s » : code d'err msgid "could not re-execute with restricted token: error code %lu" msgstr "n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu" -#: ../../fe_utils/archive.c:53 +#: ../../fe_utils/archive.c:52 #, c-format msgid "cannot use restore_command with %%r placeholder" msgstr "ne peut pas utiliser restore_command avec le joker %%r" -#: ../../fe_utils/archive.c:74 +#: ../../fe_utils/archive.c:70 #, c-format msgid "unexpected file size for \"%s\": %lld instead of %lld" msgstr "taille de fichier inattendu pour « %s » : %lld au lieu de %lld" -#: ../../fe_utils/archive.c:85 +#: ../../fe_utils/archive.c:78 #, c-format msgid "could not open file \"%s\" restored from archive: %m" msgstr "n'a pas pu ouvrir le fichier « %s » à partir de l'archive : %m" -#: ../../fe_utils/archive.c:97 file_ops.c:417 +#: ../../fe_utils/archive.c:87 file_ops.c:417 #, c-format msgid "could not stat file \"%s\": %m" msgstr "n'a pas pu tester le fichier « %s » : %m" -#: ../../fe_utils/archive.c:112 +#: ../../fe_utils/archive.c:99 #, c-format msgid "restore_command failed: %s" msgstr "échec de la restore_command : %s" -#: ../../fe_utils/archive.c:121 +#: ../../fe_utils/archive.c:106 #, c-format msgid "could not restore file \"%s\" from archive" msgstr "n'a pas pu restaurer le fichier « %s » à partir de l'archive" -#: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49 -#: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100 -#: ../../fe_utils/recovery_gen.c:171 parsexlog.c:77 parsexlog.c:135 -#: parsexlog.c:195 +#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 +#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 +#: ../../fe_utils/recovery_gen.c:149 #, c-format msgid "out of memory" msgstr "mémoire épuisée" -#: ../../fe_utils/recovery_gen.c:134 parsexlog.c:308 +#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:313 #, c-format msgid "could not open file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier « %s » : %m" -#: ../../fe_utils/recovery_gen.c:140 +#: ../../fe_utils/recovery_gen.c:124 #, c-format msgid "could not write to file \"%s\": %m" msgstr "n'a pas pu écrire dans le fichier « %s » : %m" -#: ../../fe_utils/recovery_gen.c:152 +#: ../../fe_utils/recovery_gen.c:133 #, c-format msgid "could not create file \"%s\": %m" msgstr "n'a pas pu créer le fichier « %s » : %m" @@ -207,12 +214,12 @@ msgstr "n'a pas pu supprimer le lien symbolique « %s » : %m" msgid "could not open file \"%s\" for reading: %m" msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" -#: file_ops.c:341 local_source.c:107 parsexlog.c:346 +#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:351 #, c-format msgid "could not read file \"%s\": %m" msgstr "n'a pas pu lire le fichier « %s » : %m" -#: file_ops.c:344 parsexlog.c:348 +#: file_ops.c:344 parsexlog.c:353 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" @@ -230,7 +237,7 @@ msgstr "n'a pas pu lire le lien symbolique « %s » : %m" #: file_ops.c:449 #, c-format msgid "symbolic link \"%s\" target is too long" -msgstr "la cible du lien symbolique « %s » est trop long" +msgstr "la cible du lien symbolique « %s » est trop longue" #: file_ops.c:464 #, c-format @@ -247,216 +254,232 @@ msgstr "n'a pas pu lire le répertoire « %s » : %m" msgid "could not close directory \"%s\": %m" msgstr "n'a pas pu fermer le répertoire « %s » : %m" -#: filemap.c:237 +#: filemap.c:236 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "le fichier de données « %s » en source n'est pas un fichier standard" -#: filemap.c:242 filemap.c:275 +#: filemap.c:241 filemap.c:274 #, c-format msgid "duplicate source file \"%s\"" msgstr "fichier source « %s » dupliqué" -#: filemap.c:330 +#: filemap.c:329 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "modification inattendue de page pour le fichier non standard « %s »" -#: filemap.c:680 filemap.c:774 +#: filemap.c:679 filemap.c:773 #, c-format msgid "unknown file type for \"%s\"" msgstr "type de fichier inconnu pour « %s »" -#: filemap.c:707 +#: filemap.c:706 #, c-format msgid "file \"%s\" is of different type in source and target" msgstr "le fichier « %s » a un type différent pour la source et la cible" -#: filemap.c:779 +#: filemap.c:778 #, c-format msgid "could not decide what to do with file \"%s\"" msgstr "n'a pas pu décider que faire avec le fichier « %s » : %m" -#: libpq_source.c:128 +#: libpq_source.c:130 #, c-format msgid "could not clear search_path: %s" msgstr "n'a pas pu effacer search_path : %s" -#: libpq_source.c:139 +#: libpq_source.c:141 #, c-format msgid "full_page_writes must be enabled in the source server" msgstr "full_page_writes doit être activé sur le serveur source" -#: libpq_source.c:150 +#: libpq_source.c:152 #, c-format msgid "could not prepare statement to fetch file contents: %s" msgstr "n'a pas pu préparer l'instruction pour récupérer le contenu du fichier : %s" -#: libpq_source.c:169 +#: libpq_source.c:171 #, c-format msgid "error running query (%s) on source server: %s" msgstr "erreur lors de l'exécution de la requête (%s) sur le serveur source : %s" -#: libpq_source.c:174 +#: libpq_source.c:176 #, c-format msgid "unexpected result set from query" msgstr "ensemble de résultats inattendu provenant de la requête" -#: libpq_source.c:196 +#: libpq_source.c:198 #, c-format msgid "error running query (%s) in source server: %s" msgstr "erreur lors de l'exécution de la requête (%s) dans le serveur source : %s" -#: libpq_source.c:217 +#: libpq_source.c:219 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "résultat non reconnu « %s » pour l'emplacement d'insertion actuel dans les WAL" -#: libpq_source.c:268 +#: libpq_source.c:270 #, c-format msgid "could not fetch file list: %s" msgstr "n'a pas pu récupérer la liste des fichiers : %s" -#: libpq_source.c:273 +#: libpq_source.c:275 #, c-format msgid "unexpected result set while fetching file list" msgstr "ensemble de résultats inattendu lors de la récupération de la liste des fichiers" -#: libpq_source.c:435 +#: libpq_source.c:467 #, c-format msgid "could not send query: %s" msgstr "n'a pas pu envoyer la requête : %s" -#: libpq_source.c:438 +#: libpq_source.c:470 #, c-format msgid "could not set libpq connection to single row mode" msgstr "n'a pas pu configurer la connexion libpq en mode ligne seule" -#: libpq_source.c:468 +#: libpq_source.c:500 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "résultat inattendu lors de la récupération des fichiers cibles : %s" -#: libpq_source.c:473 +#: libpq_source.c:505 #, c-format msgid "received more data chunks than requested" msgstr "a reçu plus de morceaux de données que demandé" -#: libpq_source.c:477 +#: libpq_source.c:509 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "taille inattendue de l'ensemble de résultats lors de la récupération des fichiers distants" -#: libpq_source.c:483 +#: libpq_source.c:515 #, c-format msgid "unexpected data types in result set while fetching remote files: %u %u %u" msgstr "types de données inattendus dans l'ensemble de résultats lors de la récupération des fichiers distants : %u %u %u" -#: libpq_source.c:491 +#: libpq_source.c:523 #, c-format msgid "unexpected result format while fetching remote files" msgstr "format de résultat inattendu lors de la récupération des fichiers distants" -#: libpq_source.c:497 +#: libpq_source.c:529 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "valeurs NULL inattendues dans le résultat lors de la récupération des fichiers distants" -#: libpq_source.c:501 +#: libpq_source.c:533 #, c-format msgid "unexpected result length while fetching remote files" msgstr "longueur de résultats inattendu lors de la récupération des fichiers distants" -#: libpq_source.c:534 +#: libpq_source.c:566 #, c-format msgid "received data for file \"%s\", when requested for \"%s\"" msgstr "a reçu des données du fichier « %s » alors que « %s » était demandé" -#: libpq_source.c:538 +#: libpq_source.c:570 #, c-format msgid "received data at offset %lld of file \"%s\", when requested for offset %lld" msgstr "a reçu des données au décalage %lld du fichier « %s » alors que le décalage %lld était demandé" -#: libpq_source.c:550 +#: libpq_source.c:582 #, c-format msgid "received more than requested for file \"%s\"" msgstr "a reçu plus que demandé pour le fichier « %s »" -#: libpq_source.c:563 +#: libpq_source.c:595 #, c-format msgid "unexpected number of data chunks received" msgstr "nombre de morceaux de données reçus inattendu" -#: libpq_source.c:606 +#: libpq_source.c:638 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "n'a pas pu récupérer le fichier distant « %s » : %s" -#: libpq_source.c:611 +#: libpq_source.c:643 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "ensemble de résultats inattendu lors de la récupération du fichier distant « %s »" -#: local_source.c:86 +#: local_source.c:90 local_source.c:142 #, c-format msgid "could not open source file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier source « %s » : %m" -#: local_source.c:90 +#: local_source.c:117 +#, c-format +msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied" +msgstr "la taille du fichier source « %s » a changé : %d octets attendus, %d copiés" + +#: local_source.c:121 local_source.c:172 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "n'a pas pu fermer le fichier « %s » : %m" + +#: local_source.c:146 #, c-format msgid "could not seek in source file: %m" msgstr "n'a pas pu chercher dans le fichier source : %m" -#: local_source.c:109 +#: local_source.c:165 #, c-format msgid "unexpected EOF while reading file \"%s\"" msgstr "EOF inattendu lors de la lecture du fichier « %s »" -#: local_source.c:116 +#: parsexlog.c:80 parsexlog.c:140 parsexlog.c:200 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "n'a pas pu fermer le fichier « %s » : %m" +msgid "out of memory while allocating a WAL reading processor" +msgstr "manque mémoire lors de l'allocation d'un processeur de lecture de journaux de transactions" -#: parsexlog.c:89 parsexlog.c:142 +#: parsexlog.c:92 parsexlog.c:147 #, c-format msgid "could not read WAL record at %X/%X: %s" msgstr "n'a pas pu lire l'enregistrement WAL précédent à %X/%X : %s" -#: parsexlog.c:93 parsexlog.c:145 +#: parsexlog.c:96 parsexlog.c:150 #, c-format msgid "could not read WAL record at %X/%X" msgstr "n'a pas pu lire l'enregistrement WAL précédent à %X/%X" -#: parsexlog.c:208 +#: parsexlog.c:109 +#, c-format +msgid "end pointer %X/%X is not a valid end point; expected %X/%X" +msgstr "le pointeur de fin %X/%X n'est pas un pointeur de fin valide ; %X/%X attendu" + +#: parsexlog.c:213 #, c-format msgid "could not find previous WAL record at %X/%X: %s" msgstr "n'a pas pu trouver l'enregistrement WAL précédent à %X/%X : %s" -#: parsexlog.c:212 +#: parsexlog.c:217 #, c-format msgid "could not find previous WAL record at %X/%X" msgstr "n'a pas pu trouver l'enregistrement WAL précédent à %X/%X" -#: parsexlog.c:337 +#: parsexlog.c:342 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "n'a pas pu parcourir le fichier « %s » : %m" -#: parsexlog.c:429 +#: parsexlog.c:441 #, c-format -msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmgr: %s, info: %02X" -msgstr "l'enregistrement WAL modifie une relation mais le type d'enregistrement n'est pas reconnu: lsn : %X/%X, rmgr : %s, info : %02X" +msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" +msgstr "l'enregistrement WAL modifie une relation mais le type d'enregistrement n'est pas reconnu : lsn : %X/%X, rmid : %d, rmgr : %s, info : %02X" -#: pg_rewind.c:84 +#: pg_rewind.c:86 #, c-format msgid "" "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" "\n" msgstr "" -"%s resynchronise une instance PostgreSQL avec une autre copie de l'instance.\n" +"%s resynchronise une instance PostgreSQL avec une autre copie de\n" +"l'instance.\n" "\n" -#: pg_rewind.c:85 +#: pg_rewind.c:87 #, c-format msgid "" "Usage:\n" @@ -467,83 +490,98 @@ msgstr "" " %s [OPTION]...\n" "\n" -#: pg_rewind.c:86 +#: pg_rewind.c:88 #, c-format msgid "Options:\n" msgstr "Options :\n" -#: pg_rewind.c:87 +#: pg_rewind.c:89 #, c-format msgid "" " -c, --restore-target-wal use restore_command in target configuration to\n" " retrieve WAL files from archives\n" msgstr "" -" -c, --restore-target-wal utilise restore_command pour la configuration cible\n" -" de récupération des fichiers WAL des archives\n" +" -c, --restore-target-wal utilise restore_command pour la configuration\n" +" cible de récupération des fichiers WAL des\n" +" archives\n" -#: pg_rewind.c:89 +#: pg_rewind.c:91 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr " -D, --target-pgdata=RÉPERTOIRE répertoire de données existant à modifier\n" -#: pg_rewind.c:90 +#: pg_rewind.c:92 #, c-format msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" -msgstr " --source-pgdata=RÉPERTOIRE répertoire des données source pour la synchronisation\n" +msgstr " --source-pgdata=RÉPERTOIRE répertoire des données source\n" -#: pg_rewind.c:91 +#: pg_rewind.c:93 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" -msgstr " --source-server=CONNSTR serveur source pour la synchronisation\n" +msgstr " --source-server=CHAÎNE serveur source pour la synchronisation\n" -#: pg_rewind.c:92 +#: pg_rewind.c:94 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr " -n, --dry-run arrête avant de modifier quoi que ce soit\n" -#: pg_rewind.c:93 +#: pg_rewind.c:95 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written\n" " safely to disk\n" -msgstr " -N, --nosync n'attend pas que les modifications soient proprement écrites sur disque\n" +msgstr "" +" -N, --nosync n'attend pas que les modifications soient\n" +" proprement écrites sur disque\n" -#: pg_rewind.c:95 +#: pg_rewind.c:97 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress écrit les messages de progression\n" -#: pg_rewind.c:96 +#: pg_rewind.c:98 #, c-format msgid "" " -R, --write-recovery-conf write configuration for replication\n" " (requires --source-server)\n" msgstr "" -" -R, --write-recovery-conf écrit la configuration pour la réplication\n" +" -R, --write-recovery-conf écrit la configuration pour la réplication\n" " (requiert --source-server)\n" "\n" -#: pg_rewind.c:98 +#: pg_rewind.c:100 +#, c-format +msgid "" +" --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" +msgstr "" +" --config-file=NOMFICHIER utilise le fichier de configuration indiqué\n" +" du serveur principal lors de l'exécution de\n" +" l'instance cible\n" + +#: pg_rewind.c:102 #, c-format msgid " --debug write a lot of debug messages\n" msgstr " --debug écrit beaucoup de messages de débogage\n" -#: pg_rewind.c:99 +#: pg_rewind.c:103 #, c-format msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" -msgstr " --no-ensure-shutdown ne corrige pas automatiquement l'arrêt non propre\n" +msgstr "" +" --no-ensure-shutdown ne corrige pas automatiquement l'arrêt non\n" +" propre\n" -#: pg_rewind.c:100 +#: pg_rewind.c:104 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version, puis quitte\n" -#: pg_rewind.c:101 +#: pg_rewind.c:105 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide, puis quitte\n" -#: pg_rewind.c:102 +#: pg_rewind.c:106 #, c-format msgid "" "\n" @@ -552,237 +590,225 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_rewind.c:103 +#: pg_rewind.c:107 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil %s : <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" -#: pg_rewind.c:164 pg_rewind.c:213 pg_rewind.c:220 pg_rewind.c:227 -#: pg_rewind.c:234 pg_rewind.c:242 +#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237 +#: pg_rewind.c:244 pg_rewind.c:252 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Essayez « %s --help » pour plus d'informations.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_rewind.c:212 +#: pg_rewind.c:222 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "aucune source indiquée (--source-pgdata ou --source-server)" -#: pg_rewind.c:219 +#: pg_rewind.c:229 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "une seule des options --source-pgdata et --source-server peut être indiquée" -#: pg_rewind.c:226 +#: pg_rewind.c:236 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "aucun répertoire de données cible indiqué (--target-pgdata)" -#: pg_rewind.c:233 +#: pg_rewind.c:243 #, c-format msgid "no source server information (--source-server) specified for --write-recovery-conf" msgstr "aucune information sur le serveur source (--source-server) indiquée pour --write-recovery-conf" -#: pg_rewind.c:240 +#: pg_rewind.c:250 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_rewind.c:255 +#: pg_rewind.c:265 #, c-format msgid "cannot be executed by \"root\"" msgstr "ne peut pas être exécuté par « root »" -#: pg_rewind.c:256 +#: pg_rewind.c:266 #, c-format -msgid "You must run %s as the PostgreSQL superuser.\n" -msgstr "Vous devez exécuter %s en tant que super-utilisateur PostgreSQL.\n" +msgid "You must run %s as the PostgreSQL superuser." +msgstr "Vous devez exécuter %s en tant que super-utilisateur PostgreSQL." -#: pg_rewind.c:267 +#: pg_rewind.c:276 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "n'a pas pu lire les droits du répertoire « %s » : %m" -#: pg_rewind.c:287 +#: pg_rewind.c:294 #, c-format msgid "%s" msgstr "%s" -#: pg_rewind.c:290 +#: pg_rewind.c:297 #, c-format msgid "connected to server" msgstr "connecté au serveur" -#: pg_rewind.c:337 +#: pg_rewind.c:344 #, c-format msgid "source and target cluster are on the same timeline" msgstr "les instances source et cible sont sur la même ligne de temps" -#: pg_rewind.c:346 +#: pg_rewind.c:353 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "les serveurs ont divergé à la position %X/%X des WAL sur la timeline %u" -#: pg_rewind.c:394 +#: pg_rewind.c:401 #, c-format msgid "no rewind required" msgstr "pas de retour en arrière requis" -#: pg_rewind.c:403 +#: pg_rewind.c:410 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "retour en arrière depuis le dernier checkpoint commun à %X/%X sur la ligne de temps %u" -#: pg_rewind.c:413 +#: pg_rewind.c:420 #, c-format msgid "reading source file list" msgstr "lecture de la liste des fichiers sources" -#: pg_rewind.c:417 +#: pg_rewind.c:424 #, c-format msgid "reading target file list" msgstr "lecture de la liste des fichiers cibles" -#: pg_rewind.c:426 +#: pg_rewind.c:433 #, c-format msgid "reading WAL in target" msgstr "lecture du WAL dans la cible" -#: pg_rewind.c:447 +#: pg_rewind.c:454 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "a besoin de copier %lu Mo (la taille totale du répertoire source est %lu Mo)" -#: pg_rewind.c:465 +#: pg_rewind.c:472 #, c-format msgid "syncing target data directory" msgstr "synchronisation du répertoire des données cible" -#: pg_rewind.c:481 +#: pg_rewind.c:488 #, c-format msgid "Done!" msgstr "Terminé !" -#: pg_rewind.c:564 +#: pg_rewind.c:568 #, c-format msgid "no action decided for file \"%s\"" msgstr "aucune action décidée pour le fichier « %s »" -#: pg_rewind.c:596 +#: pg_rewind.c:600 #, c-format msgid "source system was modified while pg_rewind was running" msgstr "le système source a été modifié alors que pg_rewind était en cours d'exécution" -#: pg_rewind.c:600 +#: pg_rewind.c:604 #, c-format msgid "creating backup label and updating control file" msgstr "création du fichier backup_label et mise à jour du fichier contrôle" -#: pg_rewind.c:650 +#: pg_rewind.c:654 #, c-format msgid "source system was in unexpected state at end of rewind" msgstr "le système source était dans un état inattendu en fin de rewind" -#: pg_rewind.c:681 +#: pg_rewind.c:685 #, c-format msgid "source and target clusters are from different systems" msgstr "les instances source et cible proviennent de systèmes différents" -#: pg_rewind.c:689 +#: pg_rewind.c:693 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "les instances ne sont pas compatibles avec cette version de pg_rewind" -#: pg_rewind.c:699 +#: pg_rewind.c:703 #, c-format msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" msgstr "le serveur cible doit soit utiliser les sommes de contrôle sur les données soit avoir wal_log_hints configuré à on" -#: pg_rewind.c:710 +#: pg_rewind.c:714 #, c-format msgid "target server must be shut down cleanly" msgstr "le serveur cible doit être arrêté proprement" -#: pg_rewind.c:720 +#: pg_rewind.c:724 #, c-format msgid "source data directory must be shut down cleanly" msgstr "le répertoire de données source doit être arrêté proprement" -#: pg_rewind.c:772 +#: pg_rewind.c:771 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s Ko (%d%%) copiés" -#: pg_rewind.c:835 +#: pg_rewind.c:834 #, c-format msgid "invalid control file" msgstr "fichier de contrôle invalide" -#: pg_rewind.c:919 +#: pg_rewind.c:918 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "n'a pas pu trouver l'ancêtre commun des lignes de temps des instances source et cible" -#: pg_rewind.c:960 +#: pg_rewind.c:959 #, c-format msgid "backup label buffer too small" msgstr "tampon du label de sauvegarde trop petit" -#: pg_rewind.c:983 +#: pg_rewind.c:982 #, c-format msgid "unexpected control file CRC" msgstr "CRC inattendu pour le fichier de contrôle" -#: pg_rewind.c:995 +#: pg_rewind.c:994 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "taille %d inattendue du fichier de contrôle, %d attendu" -#: pg_rewind.c:1004 +#: pg_rewind.c:1003 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" msgstr[0] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octet" msgstr[1] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octets" -#: pg_rewind.c:1043 pg_rewind.c:1101 +#: pg_rewind.c:1042 pg_rewind.c:1112 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"Le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé\n" -"dans le même répertoire que « %s ».\n" -"Vérifiez votre installation." +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »" -#: pg_rewind.c:1048 pg_rewind.c:1106 +#: pg_rewind.c:1045 pg_rewind.c:1115 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"Le programme « %s » a été trouvé par « %s »\n" -"mais n'est pas de la même version que %s.\n" -"Vérifiez votre installation." +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s" -#: pg_rewind.c:1069 +#: pg_rewind.c:1078 #, c-format msgid "restore_command is not set in the target cluster" msgstr "restore_command n'est pas configuré sur l'instance cible" -#: pg_rewind.c:1112 +#: pg_rewind.c:1119 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "exécution de « %s » pour terminer la restauration après crash du serveur cible" -#: pg_rewind.c:1132 +#: pg_rewind.c:1156 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "le mot simple-utilisateur de postgres a échoué pour l'instance cible" -#: pg_rewind.c:1133 +#: pg_rewind.c:1157 #, c-format msgid "Command was: %s" msgstr "La commande était : %s" @@ -824,388 +850,420 @@ msgstr "" "Les identifiants timeline doivent être plus petits que les enfants des\n" "identifiants timeline." -#: xlogreader.c:349 +#: xlogreader.c:621 #, c-format msgid "invalid record offset at %X/%X" msgstr "décalage invalide de l'enregistrement %X/%X" -#: xlogreader.c:357 +#: xlogreader.c:629 #, c-format msgid "contrecord is requested by %X/%X" msgstr "« contrecord » est requis par %X/%X" -#: xlogreader.c:398 xlogreader.c:695 +#: xlogreader.c:670 xlogreader.c:1102 #, c-format msgid "invalid record length at %X/%X: wanted %u, got %u" msgstr "longueur invalide de l'enregistrement à %X/%X : voulait %u, a eu %u" -#: xlogreader.c:422 +#: xlogreader.c:699 +#, c-format +msgid "out of memory while trying to decode a record of length %u" +msgstr "manque mémoire lors de la tentative de décodage d'un enregistrement de longueur %u" + +#: xlogreader.c:721 #, c-format msgid "record length %u at %X/%X too long" msgstr "longueur trop importante de l'enregistrement %u à %X/%X" -#: xlogreader.c:453 +#: xlogreader.c:770 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "il n'existe pas de drapeau contrecord à %X/%X" -#: xlogreader.c:466 +#: xlogreader.c:783 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "longueur %u invalide du contrecord (%lld attendu) à %X/%X" -#: xlogreader.c:703 +#: xlogreader.c:1110 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "identifiant du gestionnaire de ressources invalide %u à %X/%X" -#: xlogreader.c:716 xlogreader.c:732 +#: xlogreader.c:1123 xlogreader.c:1139 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "enregistrement avec prev-link %X/%X incorrect à %X/%X" -#: xlogreader.c:768 +#: xlogreader.c:1175 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" "somme de contrôle des données du gestionnaire de ressources incorrecte à\n" "l'enregistrement %X/%X" -#: xlogreader.c:805 +#: xlogreader.c:1212 #, c-format msgid "invalid magic number %04X in log segment %s, offset %u" msgstr "numéro magique invalide %04X dans le segment %s, décalage %u" -#: xlogreader.c:819 xlogreader.c:860 +#: xlogreader.c:1226 xlogreader.c:1267 #, c-format msgid "invalid info bits %04X in log segment %s, offset %u" msgstr "bits d'information %04X invalides dans le segment %s, décalage %u" -#: xlogreader.c:834 +#: xlogreader.c:1241 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" -msgstr "le fichier WAL provient d'un système différent : l'identifiant système de la base dans le fichier WAL est %llu, alors que l'identifiant système de la base dans pg_control est %llu" +msgstr "Le fichier WAL provient d'une instance différente : l'identifiant système de la base dans le fichier WAL est %llu, alors que l'identifiant système de la base dans pg_control est %llu" -#: xlogreader.c:842 +#: xlogreader.c:1249 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" -msgstr "Le fichier WAL provient d'un système différent : taille invalide du segment dans l'en-tête de page" +msgstr "Le fichier WAL provient d'une instance différente : taille invalide du segment dans l'en-tête de page" -#: xlogreader.c:848 +#: xlogreader.c:1255 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" -msgstr "Le fichier WAL provient d'un système différent : XLOG_BLCKSZ invalide dans l'en-tête de page" +msgstr "Le fichier WAL provient d'une instance différente : XLOG_BLCKSZ incorrect dans l'en-tête de page" -#: xlogreader.c:879 +#: xlogreader.c:1286 #, c-format msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" msgstr "pageaddr %X/%X inattendue dans le journal de transactions %s, segment %u" -#: xlogreader.c:904 +#: xlogreader.c:1311 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" msgstr "identifiant timeline %u hors de la séquence (après %u) dans le segment %s, décalage %u" -#: xlogreader.c:1249 +#: xlogreader.c:1706 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u désordonné à %X/%X" -#: xlogreader.c:1271 +#: xlogreader.c:1730 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA configuré, mais aucune donnée inclus à %X/%X" -#: xlogreader.c:1278 +#: xlogreader.c:1737 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA non configuré, mais la longueur des données est %u à %X/%X" -#: xlogreader.c:1314 +#: xlogreader.c:1773 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE activé, mais décalage trou %u longueur %u longueur image bloc %u à %X/%X" -#: xlogreader.c:1330 +#: xlogreader.c:1789 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE désactivé, mais décalage trou %u longueur %u à %X/%X" -#: xlogreader.c:1345 +#: xlogreader.c:1803 #, c-format -msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" -msgstr "BKPIMAGE_IS_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X" +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X" -#: xlogreader.c:1360 +#: xlogreader.c:1818 #, c-format -msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" -msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_IS_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X" +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X" -#: xlogreader.c:1376 +#: xlogreader.c:1834 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL configuré, mais pas de relation précédente à %X/%X" -#: xlogreader.c:1388 +#: xlogreader.c:1846 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "block_id %u invalide à %X/%X" -#: xlogreader.c:1475 +#: xlogreader.c:1913 #, c-format msgid "record with invalid length at %X/%X" msgstr "enregistrement de longueur invalide à %X/%X" -#: xlogreader.c:1564 +#: xlogreader.c:1938 +#, c-format +msgid "failed to locate backup block with ID %d in WAL record" +msgstr "échec de localisation du bloc de sauvegarde d'ID %d dans l'enregistrement WAL" + +#: xlogreader.c:2044 xlogreader.c:2061 +#, c-format +msgid "image at %X/%X compressed with %s not supported by build, block %d" +msgstr "image à %X/%X compressé avec %s, non supporté, bloc %d" + +#: xlogreader.c:2070 +#, c-format +msgid "image at %X/%X compressed with unknown method, block %d" +msgstr "image à %X/%X compressé avec une méthode inconnue, bloc %d" + +#: xlogreader.c:2078 #, c-format msgid "invalid compressed image at %X/%X, block %d" msgstr "image compressée invalide à %X/%X, bloc %d" -#~ msgid "there is no contrecord flag at %X/%X reading %X/%X" -#~ msgstr "il n'existe pas de drapeau contrecord à %X/%X en lisant %X/%X" +#~ msgid "" +#~ "\n" +#~ "Report bugs to .\n" +#~ msgstr "" +#~ "\n" +#~ "Rapporter les bogues à .\n" -#~ msgid "invalid contrecord length %u at %X/%X reading %X/%X, expected %u" -#~ msgstr "longueur %u invalide du contrecord à %X/%X en lisant %X/%X, attendait %u" +#~ msgid " block %u\n" +#~ msgstr " bloc %u\n" #~ msgid "\"%s\" is not a directory" #~ msgstr "« %s » n'est pas un répertoire" -#~ msgid "\"%s\" is not a symbolic link" -#~ msgstr "« %s » n'est pas un lien symbolique" - #~ msgid "\"%s\" is not a regular file" #~ msgstr "« %s » n'est pas un fichier standard" -#~ msgid "source file list is empty" -#~ msgstr "la liste de fichiers sources est vide" - -#~ msgid "source server must not be in recovery mode" -#~ msgstr "le serveur source ne doit pas être en mode restauration" - -#~ msgid "could not send COPY data: %s" -#~ msgstr "n'a pas pu envoyer les données COPY : %s" - -#~ msgid "could not send file list: %s" -#~ msgstr "n'a pas pu envoyer la liste de fichiers : %s" +#~ msgid "\"%s\" is not a symbolic link" +#~ msgstr "« %s » n'est pas un lien symbolique" -#~ msgid "could not send end-of-COPY: %s" -#~ msgstr "n'a pas pu envoyer end-of-COPY : %s" +#~ msgid "%d: %X/%X - %X/%X\n" +#~ msgstr "%d : %X/%X - %X/%X\n" -#~ msgid "unexpected result while sending file list: %s" -#~ msgstr "résultat inattendu lors de l'envoi de la liste de fichiers : %s" +#~ msgid "%s (%s)\n" +#~ msgstr "%s (%s)\n" #~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n" #~ msgstr "%s : ATTENTION : ne peut pas créer les jetons restreints sur cette plateforme\n" -#~ msgid "%s: could not open process token: error code %lu\n" -#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n" - #~ msgid "%s: could not allocate SIDs: error code %lu\n" #~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n" #~ msgid "%s: could not create restricted token: error code %lu\n" #~ msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n" -#~ msgid "%s: could not start process for command \"%s\": error code %lu\n" -#~ msgstr "%s : n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu\n" +#~ msgid "%s: could not get exit code from subprocess: error code %lu\n" +#~ msgstr "%s : n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu\n" + +#~ msgid "%s: could not open process token: error code %lu\n" +#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n" #~ msgid "%s: could not re-execute with restricted token: error code %lu\n" #~ msgstr "%s : n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu\n" -#~ msgid "%s: could not get exit code from subprocess: error code %lu\n" -#~ msgstr "%s : n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu\n" +#~ msgid "%s: could not read permissions of directory \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu lire les droits sur le répertoire « %s » : %s\n" -#~ msgid "could not open directory \"%s\": %s\n" -#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s\n" +#~ msgid "%s: could not start process for command \"%s\": error code %lu\n" +#~ msgstr "%s : n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu\n" -#~ msgid "could not stat file \"%s\": %s\n" -#~ msgstr "n'a pas pu tester le fichier « %s » : %s\n" +#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" +#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" -#~ msgid "could not read symbolic link \"%s\": %s\n" -#~ msgstr "n'a pas pu lire le lien symbolique « %s » : %s\n" +#~ msgid "Expected a numeric timeline ID.\n" +#~ msgstr "Attendait un identifiant numérique de ligne de temps.\n" -#~ msgid "symbolic link \"%s\" target is too long\n" -#~ msgstr "la cible du lien symbolique « %s » est trop long\n" +#~ msgid "Expected a write-ahead log switchpoint location.\n" +#~ msgstr "Attendait un emplacement de bascule de journal de transactions.\n" -#~ msgid "could not read directory \"%s\": %s\n" -#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n" +#~ msgid "Failure, exiting\n" +#~ msgstr "Échec, sortie\n" -#~ msgid "could not close directory \"%s\": %s\n" -#~ msgstr "n'a pas pu fermer le répertoire « %s » : %s\n" +#~ msgid "Source timeline history:\n" +#~ msgstr "Historique de la ligne de temps source :\n" -#~ msgid "could not read file \"%s\": %s\n" -#~ msgstr "n'a pas pu lire le fichier « %s » : %s\n" +#~ msgid "Target timeline history:\n" +#~ msgstr "Historique de la ligne de temps cible :\n" -#~ msgid "could not close file \"%s\": %s\n" -#~ msgstr "n'a pas pu fermer le fichier « %s » : %s\n" +#~ msgid "" +#~ "The program \"%s\" is needed by %s but was\n" +#~ "not found in the same directory as \"%s\".\n" +#~ "Check your installation." +#~ msgstr "" +#~ "Le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé\n" +#~ "dans le même répertoire que « %s ».\n" +#~ "Vérifiez votre installation." -#~ msgid " block %u\n" -#~ msgstr " bloc %u\n" +#~ msgid "" +#~ "The program \"%s\" was found by \"%s\" but was\n" +#~ "not the same version as %s.\n" +#~ "Check your installation." +#~ msgstr "" +#~ "Le programme « %s » a été trouvé par « %s » mais n'était pas de la même version\n" +#~ "que %s.\n" +#~ "Vérifiez votre installation." -#~ msgid "could not write file \"%s\": %s\n" -#~ msgstr "n'a pas pu écrire le fichier « %s » : %s\n" +#~ msgid "" +#~ "The program \"initdb\" is needed by %s but was\n" +#~ "not found in the same directory as \"%s\".\n" +#~ "Check your installation.\n" +#~ msgstr "" +#~ "Le programme « initdb » est nécessaire pour %s, mais n'a pas été trouvé\n" +#~ "dans le même répertoire que « %s ».\n" +#~ "Vérifiez votre installation.\n" -#~ msgid "could not remove file \"%s\": %s\n" -#~ msgstr "n'a pas pu supprimer le fichier « %s » : %s\n" +#~ msgid "" +#~ "The program \"initdb\" was found by \"%s\"\n" +#~ "but was not the same version as %s.\n" +#~ "Check your installation.\n" +#~ msgstr "" +#~ "Le programme « initdb » a été trouvé par « %s », mais n'est pas de la même version\n" +#~ "que %s.\n" +#~ "Vérifiez votre installation.\n" -#~ msgid "could not truncate file \"%s\" to %u: %s\n" -#~ msgstr "n'a pas pu tronquer le fichier « %s » à %u : %s\n" +#~ msgid "" +#~ "The program \"postgres\" is needed by %s but was not found in the\n" +#~ "same directory as \"%s\".\n" +#~ "Check your installation." +#~ msgstr "" +#~ "Le programme « postgres » est nécessaire à %s mais n'a pas été trouvé dans\n" +#~ "le même répertoire que « %s ».\n" +#~ "Vérifiez votre installation." -#~ msgid "could not create directory \"%s\": %s\n" -#~ msgstr "n'a pas pu créer le répertoire « %s » : %s\n" +#~ msgid "" +#~ "The program \"postgres\" was found by \"%s\"\n" +#~ "but was not the same version as %s.\n" +#~ "Check your installation." +#~ msgstr "" +#~ "Le programme « postgres » a été trouvé par « %s » mais n'est pas de la même\n" +#~ "version que « %s ».\n" +#~ "Vérifiez votre installation." -#~ msgid "could not remove directory \"%s\": %s\n" -#~ msgstr "n'a pas pu supprimer le répertoire « %s » : %s\n" +#~ msgid "Timeline IDs must be in increasing sequence.\n" +#~ msgstr "Les identifiants de ligne de temps doivent être dans une séquence croissante.\n" -#~ msgid "could not remove symbolic link \"%s\": %s\n" -#~ msgstr "n'a pas pu supprimer le lien symbolique « %s » : %s\n" +#~ msgid "Timeline IDs must be less than child timeline's ID.\n" +#~ msgstr "Les identifiants de ligne de temps doivent être inférieurs à l'identifiant de la ligne de temps enfant.\n" -#~ msgid "could not open file \"%s\" for reading: %s\n" -#~ msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %s\n" +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" -#~ msgid "entry \"%s\" excluded from source file list\n" -#~ msgstr "enregistrement « %s » exclus de la liste des fichiers sources\n" +#~ msgid "WAL file is from different database system: incorrect XLOG_SEG_SIZE in page header" +#~ msgstr "le fichier WAL provient d'un système différent : XLOG_SEG_SIZE invalide dans l'en-tête de page" -#~ msgid "entry \"%s\" excluded from target file list\n" -#~ msgstr "enregistrement « %s » exclus de la liste des fichiers cibles\n" +#~ msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte\n" +#~ msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes\n" +#~ msgstr[0] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octet\n" +#~ msgstr[1] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octets\n" -#~ msgid "%s (%s)\n" -#~ msgstr "%s (%s)\n" +#, c-format +#~ msgid "You must run %s as the PostgreSQL superuser.\n" +#~ msgstr "Vous devez exécuter %s en tant que super-utilisateur PostgreSQL.\n" -#~ msgid "could not set up connection context: %s" -#~ msgstr "n'a pas pu initialiser le contexte de connexion : « %s »" +#~ msgid "could not close directory \"%s\": %s\n" +#~ msgstr "n'a pas pu fermer le répertoire « %s » : %s\n" -#~ msgid "getting file chunks\n" -#~ msgstr "récupération des parties de fichier\n" +#~ msgid "could not close file \"%s\": %s\n" +#~ msgstr "n'a pas pu fermer le fichier « %s » : %s\n" -#~ msgid "received null value for chunk for file \"%s\", file has been deleted\n" -#~ msgstr "a reçu une valeur NULL pour une partie du fichier « %s », le fichier a été supprimé\n" +#~ msgid "could not connect to server: %s" +#~ msgstr "n'a pas pu se connecter au serveur : %s" -#~ msgid "fetched file \"%s\", length %d\n" -#~ msgstr "fichier récupéré « %s », longueur %d\n" +#~ msgid "could not create directory \"%s\": %s\n" +#~ msgstr "n'a pas pu créer le répertoire « %s » : %s\n" #~ msgid "could not create temporary table: %s" #~ msgstr "n'a pas pu créer la table temporaire : %s" -#~ msgid "Failure, exiting\n" -#~ msgstr "Échec, sortie\n" +#~ msgid "could not open directory \"%s\": %s\n" +#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s\n" + +#~ msgid "could not open file \"%s\" for reading: %s\n" +#~ msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %s\n" #~ msgid "could not open file \"%s\": %s\n" #~ msgstr "n'a pas pu ouvrir le fichier « %s » : %s\n" -#~ msgid "could not seek in file \"%s\": %s\n" -#~ msgstr "n'a pas pu chercher dans le fichier « %s » : %s\n" +#~ msgid "could not read directory \"%s\": %s\n" +#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n" + +#~ msgid "could not read file \"%s\": %s\n" +#~ msgstr "n'a pas pu lire le fichier « %s » : %s\n" #~ msgid "could not read from file \"%s\": %s\n" #~ msgstr "n'a pas pu lire le fichier « %s » : %s\n" -#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" -#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" +#~ msgid "could not read symbolic link \"%s\": %s\n" +#~ msgstr "n'a pas pu lire le lien symbolique « %s » : %s\n" -#~ msgid "%s: could not read permissions of directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire les droits sur le répertoire « %s » : %s\n" +#~ msgid "could not remove directory \"%s\": %s\n" +#~ msgstr "n'a pas pu supprimer le répertoire « %s » : %s\n" -#~ msgid "Source timeline history:\n" -#~ msgstr "Historique de la ligne de temps source :\n" +#~ msgid "could not remove file \"%s\": %s\n" +#~ msgstr "n'a pas pu supprimer le fichier « %s » : %s\n" -#~ msgid "Target timeline history:\n" -#~ msgstr "Historique de la ligne de temps cible :\n" +#~ msgid "could not remove symbolic link \"%s\": %s\n" +#~ msgstr "n'a pas pu supprimer le lien symbolique « %s » : %s\n" -#~ msgid "%d: %X/%X - %X/%X\n" -#~ msgstr "%d : %X/%X - %X/%X\n" +#~ msgid "could not seek in file \"%s\": %s\n" +#~ msgstr "n'a pas pu chercher dans le fichier « %s » : %s\n" -#~ msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte\n" -#~ msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes\n" -#~ msgstr[0] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octet\n" -#~ msgstr[1] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octets\n" +#~ msgid "could not send COPY data: %s" +#~ msgstr "n'a pas pu envoyer les données COPY : %s" -#~ msgid "" -#~ "The program \"initdb\" is needed by %s but was\n" -#~ "not found in the same directory as \"%s\".\n" -#~ "Check your installation.\n" -#~ msgstr "" -#~ "Le programme « initdb » est nécessaire pour %s, mais n'a pas été trouvé\n" -#~ "dans le même répertoire que « %s ».\n" -#~ "Vérifiez votre installation.\n" +#~ msgid "could not send end-of-COPY: %s" +#~ msgstr "n'a pas pu envoyer end-of-COPY : %s" -#~ msgid "" -#~ "The program \"initdb\" was found by \"%s\"\n" -#~ "but was not the same version as %s.\n" -#~ "Check your installation.\n" -#~ msgstr "" -#~ "Le programme « initdb » a été trouvé par « %s », mais n'est pas de la même version\n" -#~ "que %s.\n" -#~ "Vérifiez votre installation.\n" +#~ msgid "could not send file list: %s" +#~ msgstr "n'a pas pu envoyer la liste de fichiers : %s" -#~ msgid "sync of target directory failed\n" -#~ msgstr "échec de la synchronisation du répertoire cible\n" +#~ msgid "could not set up connection context: %s" +#~ msgstr "n'a pas pu initialiser le contexte de connexion : « %s »" -#~ msgid "syntax error in history file: %s\n" -#~ msgstr "erreur de syntaxe dans le fichier historique : %s\n" +#~ msgid "could not stat file \"%s\": %s\n" +#~ msgstr "n'a pas pu tester le fichier « %s » : %s\n" -#~ msgid "Expected a numeric timeline ID.\n" -#~ msgstr "Attendait un identifiant numérique de ligne de temps.\n" +#~ msgid "could not truncate file \"%s\" to %u: %s\n" +#~ msgstr "n'a pas pu tronquer le fichier « %s » à %u : %s\n" -#~ msgid "Expected a write-ahead log switchpoint location.\n" -#~ msgstr "Attendait un emplacement de bascule de journal de transactions.\n" +#~ msgid "could not write file \"%s\": %s\n" +#~ msgstr "n'a pas pu écrire le fichier « %s » : %s\n" + +#~ msgid "entry \"%s\" excluded from source file list\n" +#~ msgstr "enregistrement « %s » exclus de la liste des fichiers sources\n" + +#~ msgid "entry \"%s\" excluded from target file list\n" +#~ msgstr "enregistrement « %s » exclus de la liste des fichiers cibles\n" + +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatal : " + +#~ msgid "fetched file \"%s\", length %d\n" +#~ msgstr "fichier récupéré « %s », longueur %d\n" + +#~ msgid "getting file chunks\n" +#~ msgstr "récupération des parties de fichier\n" + +#~ msgid "invalid contrecord length %u at %X/%X reading %X/%X, expected %u" +#~ msgstr "longueur %u invalide du contrecord à %X/%X en lisant %X/%X, attendait %u" #~ msgid "invalid data in history file: %s\n" #~ msgstr "données invalides dans le fichier historique : %s\n" -#~ msgid "Timeline IDs must be in increasing sequence.\n" -#~ msgstr "Les identifiants de ligne de temps doivent être dans une séquence croissante.\n" - -#~ msgid "Timeline IDs must be less than child timeline's ID.\n" -#~ msgstr "Les identifiants de ligne de temps doivent être inférieurs à l'identifiant de la ligne de temps enfant.\n" +#~ msgid "received data at offset " +#~ msgstr "a reçu des données au décalage " -#~ msgid "WAL file is from different database system: incorrect XLOG_SEG_SIZE in page header" -#~ msgstr "le fichier WAL provient d'un système différent : XLOG_SEG_SIZE invalide dans l'en-tête de page" +#~ msgid "received null value for chunk for file \"%s\", file has been deleted\n" +#~ msgstr "a reçu une valeur NULL pour une partie du fichier « %s », le fichier a été supprimé\n" -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" +#~ msgid "source file list is empty" +#~ msgstr "la liste de fichiers sources est vide" -#~ msgid "" -#~ "The program \"%s\" was found by \"%s\" but was\n" -#~ "not the same version as %s.\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « %s » a été trouvé par « %s » mais n'était pas de la même version\n" -#~ "que %s.\n" -#~ "Vérifiez votre installation." +#~ msgid "source server must not be in recovery mode" +#~ msgstr "le serveur source ne doit pas être en mode restauration" -#~ msgid "" -#~ "The program \"%s\" is needed by %s but was\n" -#~ "not found in the same directory as \"%s\".\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé\n" -#~ "dans le même répertoire que « %s ».\n" -#~ "Vérifiez votre installation." +#~ msgid "symbolic link \"%s\" target is too long\n" +#~ msgstr "la cible du lien symbolique « %s » est trop long\n" -#~ msgid "" -#~ "The program \"postgres\" was found by \"%s\"\n" -#~ "but was not the same version as %s.\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « postgres » a été trouvé par « %s » mais n'est pas de la même\n" -#~ "version que « %s ».\n" -#~ "Vérifiez votre installation." +#~ msgid "sync of target directory failed\n" +#~ msgstr "échec de la synchronisation du répertoire cible\n" -#~ msgid "" -#~ "The program \"postgres\" is needed by %s but was not found in the\n" -#~ "same directory as \"%s\".\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « postgres » est nécessaire à %s mais n'a pas été trouvé dans\n" -#~ "le même répertoire que « %s ».\n" -#~ "Vérifiez votre installation." +#~ msgid "syntax error in history file: %s\n" +#~ msgstr "erreur de syntaxe dans le fichier historique : %s\n" -#~ msgid "could not connect to server: %s" -#~ msgstr "n'a pas pu se connecter au serveur : %s" +#~ msgid "there is no contrecord flag at %X/%X reading %X/%X" +#~ msgstr "il n'existe pas de drapeau contrecord à %X/%X en lisant %X/%X" -#~ msgid "received data at offset " -#~ msgstr "a reçu des données au décalage " +#~ msgid "unexpected result while sending file list: %s" +#~ msgstr "résultat inattendu lors de l'envoi de la liste de fichiers : %s" diff --git a/src/bin/pg_rewind/po/ja.po b/src/bin/pg_rewind/po/ja.po index bfaea375ec..f604f87958 100644 --- a/src/bin/pg_rewind/po/ja.po +++ b/src/bin/pg_rewind/po/ja.po @@ -1,13 +1,16 @@ -# Japanese message translation file for pg_rewind -# Copyright (C) 2019 PostgreSQL Global Development Group -# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. +# pg_rewind.po +# Japanese message translation file for pg_rewind +# +# Copyright (C) 2016-2022 PostgreSQL Global Development Group +# +# This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: pg_rewind (PostgreSQL 13)\n" +"Project-Id-Version: pg_rewind (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:55+0900\n" -"PO-Revision-Date: 2020-08-21 23:25+0900\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" +"PO-Revision-Date: 2022-05-11 14:42+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -15,23 +18,28 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.13\n" -"Plural-Forms: nplurals=2; plural=n!=1;\n" - -#: ../../../src/common/logging.c:241 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " +"Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:248 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:255 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "警告: " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "ヒント: " + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -78,375 +86,389 @@ msgstr "\"%s\"コマンドのプロセスを起動できませんでした: エ msgid "could not re-execute with restricted token: error code %lu" msgstr "制限付きトークンで再実行できませんでした: %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "サブプロセスの終了コードを取得できませんでした。: エラーコード %lu" -#: ../../fe_utils/archive.c:53 +#: ../../fe_utils/archive.c:52 #, c-format -msgid "could not use restore_command with %%r alias" -msgstr "%%rエイリアスを含むrestore_commandは使用できません" +msgid "cannot use restore_command with %%r placeholder" +msgstr "%%r置換を含むrestore_commandは使用できません" -#: ../../fe_utils/archive.c:74 +#: ../../fe_utils/archive.c:70 #, c-format -msgid "unexpected file size for \"%s\": %lu instead of %lu" -msgstr "予期しない\"%1$s\"のサイズ: %3$lu ではなく %2$lu" +msgid "unexpected file size for \"%s\": %lld instead of %lld" +msgstr "想定外の\"%1$s\"のファイルサイズ: %3$lld ではなく %2$lld" -#: ../../fe_utils/archive.c:85 +#: ../../fe_utils/archive.c:78 #, c-format msgid "could not open file \"%s\" restored from archive: %m" msgstr "アーカイブからリストアされたファイル\"%s\"のオープンに失敗しました: %m" -#: ../../fe_utils/archive.c:97 copy_fetch.c:88 filemap.c:208 filemap.c:369 +#: ../../fe_utils/archive.c:87 file_ops.c:417 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"のstatに失敗しました: %m" -#: ../../fe_utils/archive.c:112 +#: ../../fe_utils/archive.c:99 #, c-format -msgid "restore_command failed due to the signal: %s" -msgstr "restore_commandがシグナルにより失敗しました: %s" +msgid "restore_command failed: %s" +msgstr "restore_commandが失敗しました: %s" -#: ../../fe_utils/archive.c:121 +#: ../../fe_utils/archive.c:106 #, c-format msgid "could not restore file \"%s\" from archive" msgstr "ファイル\"%s\"をアーカイブからリストアできませんでした" -#: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49 -#: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100 -#: ../../fe_utils/recovery_gen.c:171 parsexlog.c:74 parsexlog.c:126 -#: parsexlog.c:186 +#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 +#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 +#: ../../fe_utils/recovery_gen.c:149 #, c-format msgid "out of memory" msgstr "メモリ不足です" -#: ../../fe_utils/recovery_gen.c:134 parsexlog.c:299 +#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンできませんでした: %m" -#: ../../fe_utils/recovery_gen.c:140 +#: ../../fe_utils/recovery_gen.c:124 #, c-format msgid "could not write to file \"%s\": %m" msgstr "ファイル\"%s\"を書き出せませんでした: %m" -#: ../../fe_utils/recovery_gen.c:152 +#: ../../fe_utils/recovery_gen.c:133 #, c-format msgid "could not create file \"%s\": %m" msgstr "ファイル\"%s\"を作成できませんでした: %m" -#: copy_fetch.c:59 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" - -#: copy_fetch.c:117 -#, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "シンボリックリンク\"%s\"を読めませんでした: %m" - -#: copy_fetch.c:120 -#, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "シンボリックリンク\"%s\"の参照先が長すぎます" - -#: copy_fetch.c:135 -#, c-format -msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform" -msgstr "\"%s\"はシンボリックリンクですが、このプラットフォームではシンボリックリンクをサポートしていません" - -#: copy_fetch.c:142 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m" - -#: copy_fetch.c:146 -#, c-format -msgid "could not close directory \"%s\": %m" -msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m" - -#: copy_fetch.c:166 -#, c-format -msgid "could not open source file \"%s\": %m" -msgstr "ソースファイル\"%s\"をオープンすることができませんでした: %m" - -#: copy_fetch.c:170 -#, c-format -msgid "could not seek in source file: %m" -msgstr "ソースファイルをシークすることができませんでした: %m" - -#: copy_fetch.c:187 file_ops.c:311 parsexlog.c:337 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "ファイル\"%s\"の読み取りに失敗しました: %m" - -#: copy_fetch.c:190 -#, c-format -msgid "unexpected EOF while reading file \"%s\"" -msgstr "ファイル\"%s\"を読み込み中に想定外のEOF" - -#: copy_fetch.c:197 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "ファイル\"%s\"をクローズできませんでした: %m" - -#: file_ops.c:62 +#: file_ops.c:67 #, c-format msgid "could not open target file \"%s\": %m" msgstr "ターゲットファイル\"%s\"をオープンできませんでした: %m" -#: file_ops.c:76 +#: file_ops.c:81 #, c-format msgid "could not close target file \"%s\": %m" msgstr "ターゲットファイル\"%s\"をクローズできませんでした: %m" -#: file_ops.c:96 +#: file_ops.c:101 #, c-format msgid "could not seek in target file \"%s\": %m" msgstr "ターゲットファイル\"%s\"をシークできませんでした: %m" -#: file_ops.c:112 +#: file_ops.c:117 #, c-format msgid "could not write file \"%s\": %m" msgstr "ファイル\"%s\"を書き出せませんでした: %m" -#: file_ops.c:162 +#: file_ops.c:150 file_ops.c:177 +#, c-format +msgid "undefined file type for \"%s\"" +msgstr "\"%s\"に対する未定義のファイルタイプ" + +#: file_ops.c:173 #, c-format msgid "invalid action (CREATE) for regular file" msgstr "通常のファイルに対する不正なアクション(CREATE)です" -#: file_ops.c:185 +#: file_ops.c:200 #, c-format msgid "could not remove file \"%s\": %m" msgstr "ファイル\"%s\"を削除できませんでした: %m" -#: file_ops.c:203 +#: file_ops.c:218 #, c-format msgid "could not open file \"%s\" for truncation: %m" msgstr "ファイル\"%s\"を切り詰めのためにオープンできませんでした: %m" -#: file_ops.c:207 +#: file_ops.c:222 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "ファイル\"%s\"を%uバイトに切り詰められませんでした: %m" -#: file_ops.c:223 +#: file_ops.c:238 #, c-format msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" -#: file_ops.c:237 +#: file_ops.c:252 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を削除できませんでした: %m" -#: file_ops.c:251 +#: file_ops.c:266 #, c-format msgid "could not create symbolic link at \"%s\": %m" msgstr "\"%s\"にシンボリックリンクを作成できませんでした: %m" -#: file_ops.c:265 +#: file_ops.c:280 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を削除できませんでした: %m" -#: file_ops.c:296 file_ops.c:300 +#: file_ops.c:326 file_ops.c:330 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読み取り用にオープンできませんでした: %m" -#: file_ops.c:314 parsexlog.c:339 +#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ファイル\"%s\"の読み取りに失敗しました: %m" + +#: file_ops.c:344 parsexlog.c:352 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました" -#: filemap.c:200 +#: file_ops.c:388 #, c-format -msgid "data file \"%s\" in source is not a regular file" -msgstr "ソースのデータファイル\"%s\"は通常のファイルではありません" +msgid "could not open directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" + +#: file_ops.c:446 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "シンボリックリンク\"%s\"を読めませんでした: %m" + +#: file_ops.c:449 +#, c-format +msgid "symbolic link \"%s\" target is too long" +msgstr "シンボリックリンク\"%s\"の参照先が長すぎます" -#: filemap.c:222 +#: file_ops.c:464 #, c-format -msgid "\"%s\" is not a directory" -msgstr "\"%s\"はディレクトリではありません" +msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform" +msgstr "\"%s\"はシンボリックリンクですが、このプラットフォームではシンボリックリンクをサポートしていません" -#: filemap.c:245 +#: file_ops.c:471 #, c-format -msgid "\"%s\" is not a symbolic link" -msgstr "\"%s\"はシンボリックリンクではありません" +msgid "could not read directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m" -#: filemap.c:257 +#: file_ops.c:475 #, c-format -msgid "\"%s\" is not a regular file" -msgstr "\"%s\" は通常のファイルではありません" +msgid "could not close directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m" -#: filemap.c:381 +#: filemap.c:236 #, c-format -msgid "source file list is empty" -msgstr "ソースファイルリストが空です" +msgid "data file \"%s\" in source is not a regular file" +msgstr "ソースのデータファイル\"%s\"は通常のファイルではありません" -#: filemap.c:496 +#: filemap.c:241 filemap.c:274 #, c-format -msgid "unexpected page modification for directory or symbolic link \"%s\"" -msgstr "ディレクトリまたはシンボリックリンク\"%s\"に対する想定外のページの書き換えです" +msgid "duplicate source file \"%s\"" +msgstr "ソースファイル\"%s\"が重複しています" -#: libpq_fetch.c:50 +#: filemap.c:329 #, c-format -msgid "could not connect to server: %s" -msgstr "サーバに接続できませんでした: %s" +msgid "unexpected page modification for non-regular file \"%s\"" +msgstr "非通常ファイル\"%s\"に対する想定外のページの書き換えです" -#: libpq_fetch.c:54 +#: filemap.c:679 filemap.c:773 #, c-format -msgid "connected to server" -msgstr "サーバへ接続しました" +msgid "unknown file type for \"%s\"" +msgstr "\"%s\"に対する未知のファイルタイプ" -#: libpq_fetch.c:63 +#: filemap.c:706 #, c-format -msgid "could not clear search_path: %s" -msgstr "search_pathを消去できませんでした: %s" +msgid "file \"%s\" is of different type in source and target" +msgstr "ファイル\"%s\"はソースとターゲットとで異なるタイプです" -#: libpq_fetch.c:75 +#: filemap.c:778 #, c-format -msgid "source server must not be in recovery mode" -msgstr "ソースサーバはリカバリモードであってはなりません" +msgid "could not decide what to do with file \"%s\"" +msgstr "ファイル\"%s\"の処理を決定できませんでした" -#: libpq_fetch.c:85 +#: libpq_source.c:130 +#, c-format +msgid "could not clear search_path: %s" +msgstr "search_pathを消去できませんでした: %s" + +#: libpq_source.c:141 #, c-format msgid "full_page_writes must be enabled in the source server" msgstr "ソースサーバではfull_pate_writesは有効でなければなりません" -#: libpq_fetch.c:111 +#: libpq_source.c:152 +#, c-format +msgid "could not prepare statement to fetch file contents: %s" +msgstr "ファイル内容を取得するための文を準備できませんでした: %s" + +#: libpq_source.c:171 #, c-format msgid "error running query (%s) on source server: %s" msgstr "ソースサーバで実行中のクエリ(%s)でエラー: %s" -#: libpq_fetch.c:116 +#: libpq_source.c:176 #, c-format msgid "unexpected result set from query" msgstr "クエリから想定外の結果セット" -#: libpq_fetch.c:137 +#: libpq_source.c:198 #, c-format msgid "error running query (%s) in source server: %s" msgstr "ソースサーバの実行中のクエリ(%s)でエラー: %s" -#: libpq_fetch.c:157 +#: libpq_source.c:219 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "現在のWAL挿入位置として認識不可の結果\"%s\"" -#: libpq_fetch.c:207 +#: libpq_source.c:270 #, c-format msgid "could not fetch file list: %s" msgstr "ファイルリストをフェッチできませんでした: %s" -#: libpq_fetch.c:212 +#: libpq_source.c:275 #, c-format msgid "unexpected result set while fetching file list" msgstr "ファイルリストのフェッチ中に想定外の結果セット" -#: libpq_fetch.c:265 +#: libpq_source.c:467 #, c-format msgid "could not send query: %s" msgstr "クエリを送信できませんでした: %s" -#: libpq_fetch.c:270 +#: libpq_source.c:470 #, c-format msgid "could not set libpq connection to single row mode" msgstr "libpq接続を単一行モードに設定できませんでした" -#: libpq_fetch.c:290 +#: libpq_source.c:500 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "リモートファイルをフェッチ中に想定外の結果: %s" -#: libpq_fetch.c:296 +#: libpq_source.c:505 +#, c-format +msgid "received more data chunks than requested" +msgstr "要求よりも多くのデータチャンクが到着しました" + +#: libpq_source.c:509 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "リモートファイルのフェッチ中に想定外の結果セットサイズ" -#: libpq_fetch.c:302 +#: libpq_source.c:515 #, c-format msgid "unexpected data types in result set while fetching remote files: %u %u %u" msgstr "リモートファイルのフェッチ中の結果セットに想定外のデータ型: %u %u %u" -#: libpq_fetch.c:310 +#: libpq_source.c:523 #, c-format msgid "unexpected result format while fetching remote files" msgstr "リモートファイルのフェッチ中に想定外の結果形式" -#: libpq_fetch.c:316 +#: libpq_source.c:529 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "リモートファイルのフェッチ中の結果に想定外のNULL値" -#: libpq_fetch.c:320 +#: libpq_source.c:533 #, c-format msgid "unexpected result length while fetching remote files" msgstr "リモートファイルのフェッチ中に想定外の結果の長さ" -#: libpq_fetch.c:381 +#: libpq_source.c:566 +#, c-format +msgid "received data for file \"%s\", when requested for \"%s\"" +msgstr "ファイル\"%s\"への要求に対してファイル\"%s\"のデータを受信しました" + +#: libpq_source.c:570 +#, c-format +msgid "received data at offset %lld of file \"%s\", when requested for offset %lld" +msgstr "ファイル\"%2$s\"のオフセット%3$lldへの要求に対してオフセット%1$lldのデータを受信しました" + +#: libpq_source.c:582 +#, c-format +msgid "received more than requested for file \"%s\"" +msgstr "ファイル”%s\"に対して要求よりも多量のデータを受信しました" + +#: libpq_source.c:595 +#, c-format +msgid "unexpected number of data chunks received" +msgstr "想定外の数のデータチャンクを受信しました" + +#: libpq_source.c:638 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "リモートファイル\"%s\"をフェッチできませんでした: %s" -#: libpq_fetch.c:386 +#: libpq_source.c:643 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "リモートファイル\"%s\"のフェッチ中に想定外の結果セット" -#: libpq_fetch.c:430 +#: local_source.c:90 local_source.c:142 #, c-format -msgid "could not send COPY data: %s" -msgstr "COPY 対象データを送信できませんでした: %s" +msgid "could not open source file \"%s\": %m" +msgstr "ソースファイル\"%s\"をオープンすることができませんでした: %m" -#: libpq_fetch.c:459 +#: local_source.c:117 #, c-format -msgid "could not send file list: %s" -msgstr "ファイルリストを送信できませんでした: %s" +msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied" +msgstr "ファイル\"%s\"のサイズが同時に変更されました。%dバイトを期待していましたが、%dバイトコピーされました" -#: libpq_fetch.c:501 +#: local_source.c:121 local_source.c:172 #, c-format -msgid "could not send end-of-COPY: %s" -msgstr "コピー終端を送信できませんでした: %s" +msgid "could not close file \"%s\": %m" +msgstr "ファイル\"%s\"をクローズできませんでした: %m" -#: libpq_fetch.c:507 +#: local_source.c:146 #, c-format -msgid "unexpected result while sending file list: %s" -msgstr "ファイルリストを送信中に想定外の結果: %s" +msgid "could not seek in source file: %m" +msgstr "ソースファイルをシークすることができませんでした: %m" -#: parsexlog.c:86 parsexlog.c:133 +#: local_source.c:165 +#, c-format +msgid "unexpected EOF while reading file \"%s\"" +msgstr "ファイル\"%s\"を読み込み中に想定外のEOF" + +#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199 +#, c-format +msgid "out of memory while allocating a WAL reading processor" +msgstr "WAL読み取り機構のメモリ割り当て中にメモリ不足" + +#: parsexlog.c:92 parsexlog.c:146 #, c-format msgid "could not read WAL record at %X/%X: %s" msgstr "%X/%XのWALレコードを読み取れませんでした: %s" -#: parsexlog.c:90 parsexlog.c:136 +#: parsexlog.c:96 parsexlog.c:149 #, c-format msgid "could not read WAL record at %X/%X" msgstr "%X/%XのWALレコードを読み取れませんでした" -#: parsexlog.c:199 +#: parsexlog.c:108 +#, c-format +msgid "end pointer %X/%X is not a valid end point; expected %X/%X" +msgstr "終了点%X/%Xは妥当な終了点ではありません; %X/%Xを期待していました" + +#: parsexlog.c:212 #, c-format msgid "could not find previous WAL record at %X/%X: %s" msgstr "%X/%Xの前のWALレコードが見つかりませんでした: %s" -#: parsexlog.c:203 +#: parsexlog.c:216 #, c-format msgid "could not find previous WAL record at %X/%X" msgstr "%X/%Xの前のWALレコードが見つかりませんでした" -#: parsexlog.c:328 +#: parsexlog.c:341 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "ファイル\"%s\"をシークできませんでした: %m" -#: parsexlog.c:420 +#: parsexlog.c:440 #, c-format -msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmgr: %s, info: %02X" -msgstr "WALレコードはリレーションを修正しますが、レコードの型を認識できません: lsn: %X/%X、rmgr: %s、info: %02X" +msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" +msgstr "WALレコードはリレーションを更新しますが、レコードの型を認識できません: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" -#: pg_rewind.c:78 +#: pg_rewind.c:86 #, c-format msgid "" "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" @@ -455,7 +477,7 @@ msgstr "" "%s はPostgreSQLクラスタをそのクラスタのコピーで再同期します。\n" "\n" -#: pg_rewind.c:79 +#: pg_rewind.c:87 #, c-format msgid "" "Usage:\n" @@ -466,12 +488,12 @@ msgstr "" " %s [オプション]...\n" "\n" -#: pg_rewind.c:80 +#: pg_rewind.c:88 #, c-format msgid "Options:\n" msgstr "オプション:\n" -#: pg_rewind.c:81 +#: pg_rewind.c:89 #, c-format msgid "" " -c, --restore-target-wal use restore_command in target configuration to\n" @@ -480,39 +502,39 @@ msgstr "" " -c, --restore-target-wal ターゲットの設定の中のrestore_commandを使用して\n" " アーカイブからWALファイルを取得する\n" -#: pg_rewind.c:83 +#: pg_rewind.c:91 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr " -D, --target-pgdata=DIRECTORY 修正を行う既存データディレクトリ\n" -#: pg_rewind.c:84 +#: pg_rewind.c:92 #, c-format msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" msgstr " --source-pgdata=DIRECTORY 同期元とするデータディレクトリ\n" -#: pg_rewind.c:85 +#: pg_rewind.c:93 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr " --source-server=CONNSTR 同期元とするサーバ\n" -#: pg_rewind.c:86 +#: pg_rewind.c:94 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr " -n, --dry-run 修正を始める前に停止する\n" -#: pg_rewind.c:87 +#: pg_rewind.c:95 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written\n" " safely to disk\n" msgstr " -N, --no-sync 変更のディスクへの安全な書き出しを待機しない\n" -#: pg_rewind.c:89 +#: pg_rewind.c:97 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress 進捗メッセージを出力\n" -#: pg_rewind.c:90 +#: pg_rewind.c:98 #, c-format msgid "" " -R, --write-recovery-conf write configuration for replication\n" @@ -521,27 +543,36 @@ msgstr "" " -R, --write-recovery-conf レプリケーションのための設定を書き込む\n" " (--source-server が必要となります)\n" -#: pg_rewind.c:92 +#: pg_rewind.c:100 +#, c-format +msgid "" +" --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" +msgstr "" +" --config-file=FILENAME ターゲットのクラスタの実行時に指定した\n" +" 主サーバー設定ファイルを使用する\n" + +#: pg_rewind.c:102 #, c-format msgid " --debug write a lot of debug messages\n" msgstr " --debug 多量のデバッグメッセージを出力\n" -#: pg_rewind.c:93 +#: pg_rewind.c:103 #, c-format msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" msgstr " --no-ensure-shutdown 非クリーンシャットダウン後の修正を自動で行わない\n" -#: pg_rewind.c:94 +#: pg_rewind.c:104 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: pg_rewind.c:95 +#: pg_rewind.c:105 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: pg_rewind.c:96 +#: pg_rewind.c:106 #, c-format msgid "" "\n" @@ -550,212 +581,224 @@ msgstr "" "\n" "バグは<%s>に報告してください。\n" -#: pg_rewind.c:97 +#: pg_rewind.c:107 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_rewind.c:159 pg_rewind.c:208 pg_rewind.c:215 pg_rewind.c:222 -#: pg_rewind.c:229 pg_rewind.c:237 +#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237 +#: pg_rewind.c:244 pg_rewind.c:252 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "詳細は\"%s --help\"を実行してください。\n" +msgid "Try \"%s --help\" for more information." +msgstr "詳細は\"%s --help\"を実行してください。" -#: pg_rewind.c:207 +#: pg_rewind.c:222 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "ソースが指定されていません(--source-pgdata または --source-server)" -#: pg_rewind.c:214 +#: pg_rewind.c:229 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "--source-pgdataか--source-server はいずれか一方のみ指定可能です" -#: pg_rewind.c:221 +#: pg_rewind.c:236 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "ターゲットデータディレクトリが指定されていません(--target-pgdata)" -#: pg_rewind.c:228 +#: pg_rewind.c:243 #, c-format msgid "no source server information (--source-server) specified for --write-recovery-conf" msgstr "--write-recovery-confにソースサーバ情報(--source-server)が指定されていません" -#: pg_rewind.c:235 +#: pg_rewind.c:250 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr " コマンドライン引数が多すぎます(先頭は\"%s\")" -#: pg_rewind.c:250 +#: pg_rewind.c:265 #, c-format msgid "cannot be executed by \"root\"" msgstr "\"root\"では実行できません" -#: pg_rewind.c:251 +#: pg_rewind.c:266 #, c-format -msgid "You must run %s as the PostgreSQL superuser.\n" -msgstr "PostgreSQLのスーパユーザで%sを実行しなければなりません\n" +msgid "You must run %s as the PostgreSQL superuser." +msgstr "PostgreSQLのスーパユーザで%sを実行しなければなりません" -#: pg_rewind.c:262 +#: pg_rewind.c:276 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "ディレクトリ\"%s\"の権限を読み取れませんでした: %m" -#: pg_rewind.c:316 +#: pg_rewind.c:294 +#, c-format +msgid "%s" +msgstr "%s" + +#: pg_rewind.c:297 +#, c-format +msgid "connected to server" +msgstr "サーバへ接続しました" + +#: pg_rewind.c:344 #, c-format msgid "source and target cluster are on the same timeline" msgstr "ソースとターゲットのクラスタが同一タイムライン上にあります" -#: pg_rewind.c:322 +#: pg_rewind.c:353 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "タイムライン%3$uのWAL位置%1$X/%2$Xで両サーバが分岐しています" -#: pg_rewind.c:360 +#: pg_rewind.c:401 #, c-format msgid "no rewind required" msgstr "巻き戻しは必要ありません" -#: pg_rewind.c:369 +#: pg_rewind.c:410 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "タイムライン%3$uの%1$X/%2$Xにある最新の共通チェックポイントから巻き戻しています" -#: pg_rewind.c:378 +#: pg_rewind.c:420 #, c-format msgid "reading source file list" msgstr "ソースファイルリストを読み込んでいます" -#: pg_rewind.c:381 +#: pg_rewind.c:424 #, c-format msgid "reading target file list" msgstr "ターゲットファイルリストを読み込んでいます" -#: pg_rewind.c:392 +#: pg_rewind.c:433 #, c-format msgid "reading WAL in target" msgstr "ターゲットでWALを読み込んでいます" -#: pg_rewind.c:409 +#: pg_rewind.c:454 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "%lu MBコピーする必要があります(ソースディレクトリの合計サイズは%lu MBです)" -#: pg_rewind.c:427 -#, c-format -msgid "creating backup label and updating control file" -msgstr "backup labelを作成して制御ファイルを更新しています" - -#: pg_rewind.c:457 +#: pg_rewind.c:472 #, c-format msgid "syncing target data directory" msgstr "ターゲットデータディレクトリを同期しています" -#: pg_rewind.c:464 +#: pg_rewind.c:488 #, c-format msgid "Done!" msgstr "完了!" -#: pg_rewind.c:476 +#: pg_rewind.c:568 +#, c-format +msgid "no action decided for file \"%s\"" +msgstr "ファイル\"%s\"に対するアクションが決定されていません" + +#: pg_rewind.c:600 +#, c-format +msgid "source system was modified while pg_rewind was running" +msgstr "pg_rewindの実行中にソースシス7テムが更新されました" + +#: pg_rewind.c:604 +#, c-format +msgid "creating backup label and updating control file" +msgstr "backup labelを作成して制御ファイルを更新しています" + +#: pg_rewind.c:654 +#, c-format +msgid "source system was in unexpected state at end of rewind" +msgstr "巻き戻し完了時点のソースシステムが想定外の状態でした" + +#: pg_rewind.c:685 #, c-format msgid "source and target clusters are from different systems" msgstr "ソースクラスタとターゲットクラスタは異なるシステムのものです" -#: pg_rewind.c:484 +#: pg_rewind.c:693 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "クラスタは、このバージョンのpg_rewindとの互換性がありません" -#: pg_rewind.c:494 +#: pg_rewind.c:703 #, c-format msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" msgstr "ターゲットサーバはデータチェックサムを利用している、または\"wal_log_hints = on\"である必要があります" -#: pg_rewind.c:505 +#: pg_rewind.c:714 #, c-format msgid "target server must be shut down cleanly" msgstr "ターゲットサーバはきれいにシャットダウンされていなければなりません" -#: pg_rewind.c:515 +#: pg_rewind.c:724 #, c-format msgid "source data directory must be shut down cleanly" msgstr "ソースデータディレクトリはきれいにシャットダウンされていなければなりません" -#: pg_rewind.c:567 +#: pg_rewind.c:771 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s kB (%d%%) コピーしました" -#: pg_rewind.c:630 +#: pg_rewind.c:834 #, c-format msgid "invalid control file" msgstr "不正な制御ファイル" -#: pg_rewind.c:714 +#: pg_rewind.c:918 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "ソースクラスタとターゲットクラスタのタイムラインの共通の祖先を見つけられません" -#: pg_rewind.c:755 +#: pg_rewind.c:959 #, c-format msgid "backup label buffer too small" msgstr "バックアップラベルのバッファが小さすぎます" -#: pg_rewind.c:778 +#: pg_rewind.c:982 #, c-format msgid "unexpected control file CRC" msgstr "想定外の制御ファイルCRCです" -#: pg_rewind.c:788 +#: pg_rewind.c:994 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "想定外の制御ファイルのサイズ%d、想定は%d" -#: pg_rewind.c:797 +#: pg_rewind.c:1003 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" msgstr[0] "WALセグメントのサイズ指定は1MBと1GBの間の2の累乗でなければなりません、しかしコントロールファイルでは%dバイトとなっています" -msgstr[1] "WALセグメントのサイズ指定は1MBと1GBの間の2の累乗でなければなりません、しかしコントロールファイルでは%dバイトとなっています" -#: pg_rewind.c:854 pg_rewind.c:912 +#: pg_rewind.c:1042 pg_rewind.c:1112 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"%2$sには\"%1$s\"プログラムが必要ですが、\"%3$s\"と同じディレクトリ\n" -"にありませんでした。\n" -"インストール状況を確認してください。" +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "%2$sには\"%1$s\"プログラムが必要ですが、\"%3$s\"と同じディレクトリにありませんでした。" -#: pg_rewind.c:859 pg_rewind.c:917 +#: pg_rewind.c:1045 pg_rewind.c:1115 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じ\n" -"バージョンではありませんでした。\n" -"インストール状況を確認してください。" +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じバージョンではありませんでした。" -#: pg_rewind.c:880 +#: pg_rewind.c:1078 #, c-format msgid "restore_command is not set in the target cluster" msgstr "ターゲットクラスタでrestore_commandが設定されていません" -#: pg_rewind.c:923 +#: pg_rewind.c:1119 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "ターゲットサーバに対して\"%s\"を実行してクラッシュリカバリを完了させます" -#: pg_rewind.c:943 +#: pg_rewind.c:1156 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "ターゲットクラスタでのpostgresコマンドのシングルユーザモード実行に失敗しました" -#: pg_rewind.c:944 +#: pg_rewind.c:1157 #, c-format msgid "Command was: %s" msgstr "コマンド: %s" @@ -795,141 +838,209 @@ msgstr "履歴ファイル内の無効なデータ" msgid "Timeline IDs must be less than child timeline's ID." msgstr "タイムラインIDは子のタイムラインIDより小さくなければなりません。" -#: xlogreader.c:349 +#: xlogreader.c:621 #, c-format msgid "invalid record offset at %X/%X" msgstr "%X/%Xのレコードオフセットが無効です" -#: xlogreader.c:357 +#: xlogreader.c:629 #, c-format msgid "contrecord is requested by %X/%X" msgstr "%X/%Xではcontrecordが必要です" -#: xlogreader.c:398 xlogreader.c:695 +#: xlogreader.c:670 xlogreader.c:1102 #, c-format msgid "invalid record length at %X/%X: wanted %u, got %u" msgstr "%X/%Xのレコード長が無効です:長さは%uである必要がありますが、長さは%uでした" -#: xlogreader.c:422 +#: xlogreader.c:699 +#, c-format +msgid "out of memory while trying to decode a record of length %u" +msgstr "長さ%uのレコードのデコード中のメモリ不足" + +#: xlogreader.c:721 #, c-format msgid "record length %u at %X/%X too long" msgstr "%2$X/%3$Xのレコード長%1$uが大きすぎます" -#: xlogreader.c:454 +#: xlogreader.c:770 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "%X/%Xで contrecord フラグがありません" -#: xlogreader.c:467 +#: xlogreader.c:783 #, c-format -msgid "invalid contrecord length %u at %X/%X" -msgstr "%2$X/%3$Xのcontrecordの長さ %1$u が無効です" +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "%3$X/%4$Xの継続レコードの長さ%1$u(正しくは%2$lld)は不正です" -#: xlogreader.c:703 +#: xlogreader.c:1110 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "%2$X/%3$XのリソースマネージャID %1$uが無効です" -#: xlogreader.c:717 xlogreader.c:734 +#: xlogreader.c:1123 xlogreader.c:1139 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "直前のリンク%1$X/%2$Xが不正なレコードが%3$X/%4$Xにあります" -#: xlogreader.c:771 +#: xlogreader.c:1175 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "%X/%Xのレコード内のリソースマネージャデータのチェックサムが不正です" -#: xlogreader.c:808 +#: xlogreader.c:1212 #, c-format msgid "invalid magic number %04X in log segment %s, offset %u" msgstr "ログセグメント%2$s、オフセット%3$uのマジックナンバー%1$04Xは無効です" -#: xlogreader.c:822 xlogreader.c:863 +#: xlogreader.c:1226 xlogreader.c:1267 #, c-format msgid "invalid info bits %04X in log segment %s, offset %u" msgstr "ログセグメント %2$s、オフセット %3$u の情報ビット %1$04X は無効です" -#: xlogreader.c:837 +#: xlogreader.c:1241 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WALファイルは異なるデータベースシステム由来のものです: WALファイルのデータベースシステム識別子は %lluで、pg_control におけるデータベースシステム識別子は %lluです" -#: xlogreader.c:845 +#: xlogreader.c:1249 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのセグメントサイズが正しくありません" -#: xlogreader.c:851 +#: xlogreader.c:1255 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのXLOG_BLCKSZが正しくありません" -#: xlogreader.c:882 +#: xlogreader.c:1286 #, c-format msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" msgstr "ログセグメント%3$s、オフセット%4$uのページアドレス%1$X/%2$Xは想定外です" -#: xlogreader.c:907 +#: xlogreader.c:1311 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" msgstr "ログセグメント%3$s、オフセット%4$uの時系列ID %1$u(%2$uの後)は順序に従っていません" -#: xlogreader.c:1252 +#: xlogreader.c:1706 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %uが%X/%Xで無効です" -#: xlogreader.c:1275 +#: xlogreader.c:1730 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATAが設定されていますが、%X/%Xにデータがありません" -#: xlogreader.c:1282 +#: xlogreader.c:1737 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATAが設定されていませんが、%2$X/%3$Xのデータ長は%1$u" -#: xlogreader.c:1318 +#: xlogreader.c:1773 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEが設定されていますが、%4$X/%5$Xでホールオフセット%1$u、長さ%2$u、ブロックイメージ長%3$u" -#: xlogreader.c:1334 +#: xlogreader.c:1789 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEが設定されていませんが、%3$X/%4$Xにホールオフセット%1$u、長さ%2$u" -#: xlogreader.c:1349 +#: xlogreader.c:1803 #, c-format -msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" -msgstr "BKPIMAGE_IS_COMPRESSEDが設定されていますが、%2$X/%3$Xにおいてブロックイメージ長が%1$u" +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSEDが設定されていますが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです" -#: xlogreader.c:1364 +#: xlogreader.c:1818 #, c-format -msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLEもBKPIMAGE_IS_COMPRESSEDも設定されていませんが、%2$X/%3$Xにおいてブロックイメージ長が%1$u" +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLEもBKPIMAGE_COMPRESSEDも設定されていませんが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです" -#: xlogreader.c:1380 +#: xlogreader.c:1834 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_RELが設定されていますが、%X/%Xにおいて以前のリレーションがありません" -#: xlogreader.c:1392 +#: xlogreader.c:1846 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "%2$X/%3$Xにおけるblock_id %1$uが無効です" -#: xlogreader.c:1481 +#: xlogreader.c:1913 #, c-format msgid "record with invalid length at %X/%X" msgstr "%X/%Xのレコードのサイズが無効です" -#: xlogreader.c:1570 +#: xlogreader.c:1938 +#, c-format +msgid "failed to locate backup block with ID %d in WAL record" +msgstr "WALレコード中ID %dのバックアップブロックを特定できません" + +#: xlogreader.c:2044 xlogreader.c:2061 +#, c-format +msgid "image at %X/%X compressed with %s not supported by build, block %d" +msgstr "%X/%Xのイメージはこのビルドではサポートされていない%sで圧縮されています、ブロック%d" + +#: xlogreader.c:2070 +#, c-format +msgid "image at %X/%X compressed with unknown method, block %d" +msgstr "%X%Xのイメージは不明な方式で圧縮されています、ブロック%d" + +#: xlogreader.c:2078 #, c-format msgid "invalid compressed image at %X/%X, block %d" msgstr "%X/%X、ブロック %d での圧縮イメージが無効です" +#~ msgid "fatal: " +#~ msgstr "致命的エラー: " + +#~ msgid "\"%s\" is not a directory" +#~ msgstr "\"%s\"はディレクトリではありません" + +#~ msgid "\"%s\" is not a symbolic link" +#~ msgstr "\"%s\"はシンボリックリンクではありません" + +#~ msgid "\"%s\" is not a regular file" +#~ msgstr "\"%s\" は通常のファイルではありません" + +#~ msgid "source file list is empty" +#~ msgstr "ソースファイルリストが空です" + +#~ msgid "could not connect to server: %s" +#~ msgstr "サーバに接続できませんでした: %s" + +#~ msgid "source server must not be in recovery mode" +#~ msgstr "ソースサーバはリカバリモードであってはなりません" + +#~ msgid "could not send COPY data: %s" +#~ msgstr "COPY 対象データを送信できませんでした: %s" + +#~ msgid "could not send file list: %s" +#~ msgstr "ファイルリストを送信できませんでした: %s" + +#~ msgid "could not send end-of-COPY: %s" +#~ msgstr "コピー終端を送信できませんでした: %s" + +#~ msgid "unexpected result while sending file list: %s" +#~ msgstr "ファイルリストを送信中に想定外の結果: %s" + +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "詳細は\"%s --help\"を実行してください。\n" + +#~ msgid "You must run %s as the PostgreSQL superuser.\n" +#~ msgstr "PostgreSQLのスーパユーザで%sを実行しなければなりません\n" + +#~ msgid "invalid contrecord length %u at %X/%X" +#~ msgstr "%2$X/%3$Xのcontrecordの長さ %1$u が無効です" + +#~ msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" +#~ msgstr "BKPIMAGE_IS_COMPRESSEDが設定されていますが、%2$X/%3$Xにおいてブロックイメージ長が%1$u" + +#~ msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" +#~ msgstr "BKPIMAGE_HAS_HOLEもBKPIMAGE_IS_COMPRESSEDも設定されていませんが、%2$X/%3$Xにおいてブロックイメージ長が%1$u" + #~ msgid "could not create temporary table: %s" #~ msgstr "一時テーブルを作成できませんでした: %s" @@ -999,9 +1110,6 @@ msgstr "%X/%X、ブロック %d での圧縮イメージが無効です" #~ msgid "fetched file \"%s\", length %d\n" #~ msgstr "フェッチしたファイル \"%s\",長さ %d\n" -#~ msgid "received chunk for file \"%s\", offset %d, size %d\n" -#~ msgstr "ファイル \"%s\",オフセット %d, サイズ %dのチャンクを受け取りました\n" - #~ msgid "received null value for chunk for file \"%s\", file has been deleted\n" #~ msgstr "ファイル\"%s\"のNULL値のチャンクを受け取りました。ファイルは削除されました。\n" diff --git a/src/bin/pg_rewind/po/ru.po b/src/bin/pg_rewind/po/ru.po index 88f1f4cc9c..3583904433 100644 --- a/src/bin/pg_rewind/po/ru.po +++ b/src/bin/pg_rewind/po/ru.po @@ -1,13 +1,13 @@ # Russian message translation file for pg_rewind # Copyright (C) 2015-2016 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2015-2017, 2018, 2019, 2020. +# Alexander Lakhin , 2015-2017, 2018, 2019, 2020, 2021. msgid "" msgstr "" "Project-Id-Version: pg_rewind (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-12-11 07:48+0300\n" -"PO-Revision-Date: 2020-11-09 08:33+0300\n" +"POT-Creation-Date: 2021-11-08 05:22+0300\n" +"PO-Revision-Date: 2021-09-06 07:33+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -17,17 +17,17 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "важно: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "ошибка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "предупреждение: " @@ -90,15 +90,15 @@ msgstr "нельзя использовать restore_command со знаком #: ../../fe_utils/archive.c:74 #, c-format -msgid "unexpected file size for \"%s\": %lu instead of %lu" -msgstr "неподходящий размер файла \"%s\": %lu вместо %lu байт" +msgid "unexpected file size for \"%s\": %lld instead of %lld" +msgstr "неподходящий размер файла \"%s\": %lld вместо %lld байт" #: ../../fe_utils/archive.c:85 #, c-format msgid "could not open file \"%s\" restored from archive: %m" msgstr "не удалось открыть файл \"%s\", восстановленный из архива: %m" -#: ../../fe_utils/archive.c:97 copy_fetch.c:88 filemap.c:208 +#: ../../fe_utils/archive.c:97 file_ops.c:417 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не удалось получить информацию о файле \"%s\": %m" @@ -115,13 +115,13 @@ msgstr "восстановить файл \"%s\" из архива не удал #: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49 #: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100 -#: ../../fe_utils/recovery_gen.c:171 parsexlog.c:76 parsexlog.c:134 -#: parsexlog.c:194 +#: ../../fe_utils/recovery_gen.c:171 parsexlog.c:77 parsexlog.c:135 +#: parsexlog.c:195 #, c-format msgid "out of memory" msgstr "нехватка памяти" -#: ../../fe_utils/recovery_gen.c:134 parsexlog.c:307 +#: ../../fe_utils/recovery_gen.c:134 parsexlog.c:308 #, c-format msgid "could not open file \"%s\": %m" msgstr "не удалось открыть файл \"%s\": %m" @@ -136,243 +136,222 @@ msgstr "не удалось записать в файл \"%s\": %m" msgid "could not create file \"%s\": %m" msgstr "не удалось создать файл \"%s\": %m" -#: copy_fetch.c:59 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "не удалось открыть каталог \"%s\": %m" - -#: copy_fetch.c:117 -#, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "не удалось прочитать символическую ссылку \"%s\": %m" - -#: copy_fetch.c:120 -#, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "целевой путь символической ссылки \"%s\" слишком длинный" - -#: copy_fetch.c:135 -#, c-format -msgid "" -"\"%s\" is a symbolic link, but symbolic links are not supported on this " -"platform" -msgstr "" -"\"%s\" — символическая ссылка, но в этой ОС символические ссылки не " -"поддерживаются" - -#: copy_fetch.c:142 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "не удалось прочитать каталог \"%s\": %m" - -#: copy_fetch.c:146 -#, c-format -msgid "could not close directory \"%s\": %m" -msgstr "не удалось закрыть каталог \"%s\": %m" - -#: copy_fetch.c:166 -#, c-format -msgid "could not open source file \"%s\": %m" -msgstr "не удалось открыть исходный файл \"%s\": %m" - -#: copy_fetch.c:170 -#, c-format -msgid "could not seek in source file: %m" -msgstr "не удалось переместиться в исходном файле: %m" - -#: copy_fetch.c:187 file_ops.c:311 parsexlog.c:345 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "не удалось прочитать файл \"%s\": %m" - -#: copy_fetch.c:190 -#, c-format -msgid "unexpected EOF while reading file \"%s\"" -msgstr "неожиданный конец файла при чтении \"%s\"" - -#: copy_fetch.c:197 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "не удалось закрыть файл \"%s\": %m" - -#: file_ops.c:62 +#: file_ops.c:67 #, c-format msgid "could not open target file \"%s\": %m" msgstr "не удалось открыть целевой файл \"%s\": %m" -#: file_ops.c:76 +#: file_ops.c:81 #, c-format msgid "could not close target file \"%s\": %m" msgstr "не удалось закрыть целевой файл \"%s\": %m" -#: file_ops.c:96 +#: file_ops.c:101 #, c-format msgid "could not seek in target file \"%s\": %m" msgstr "не удалось переместиться в целевом файле \"%s\": %m" -#: file_ops.c:112 +#: file_ops.c:117 #, c-format msgid "could not write file \"%s\": %m" msgstr "не удалось записать файл \"%s\": %m" -#: file_ops.c:162 +#: file_ops.c:150 file_ops.c:177 +#, c-format +msgid "undefined file type for \"%s\"" +msgstr "неопределённый тип файла \"%s\"" + +#: file_ops.c:173 #, c-format msgid "invalid action (CREATE) for regular file" msgstr "неверное действие (CREATE) для обычного файла" -#: file_ops.c:185 +#: file_ops.c:200 #, c-format msgid "could not remove file \"%s\": %m" msgstr "не удалось стереть файл \"%s\": %m" -#: file_ops.c:203 +#: file_ops.c:218 #, c-format msgid "could not open file \"%s\" for truncation: %m" msgstr "не удалось открыть файл \"%s\" для усечения: %m" -#: file_ops.c:207 +#: file_ops.c:222 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "не удалось обрезать файл \"%s\" до нужного размера (%u): %m" -#: file_ops.c:223 +#: file_ops.c:238 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не удалось создать каталог \"%s\": %m" -#: file_ops.c:237 +#: file_ops.c:252 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "ошибка при удалении каталога \"%s\": %m" -#: file_ops.c:251 +#: file_ops.c:266 #, c-format msgid "could not create symbolic link at \"%s\": %m" msgstr "не удалось создать символическую ссылку \"%s\": %m" -#: file_ops.c:265 +#: file_ops.c:280 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "ошибка при удалении символической ссылки \"%s\": %m" -#: file_ops.c:296 file_ops.c:300 +#: file_ops.c:326 file_ops.c:330 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не удалось открыть файл \"%s\" для чтения: %m" -#: file_ops.c:314 parsexlog.c:347 +#: file_ops.c:341 local_source.c:107 parsexlog.c:346 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не удалось прочитать файл \"%s\": %m" + +#: file_ops.c:344 parsexlog.c:348 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %zu)" -#: filemap.c:200 +#: file_ops.c:388 #, c-format -msgid "data file \"%s\" in source is not a regular file" -msgstr "файл данных \"%s\" в источнике не является обычным файлом" +msgid "could not open directory \"%s\": %m" +msgstr "не удалось открыть каталог \"%s\": %m" -#: filemap.c:222 +#: file_ops.c:446 #, c-format -msgid "\"%s\" is not a directory" -msgstr "\"%s\" не является каталогом" +msgid "could not read symbolic link \"%s\": %m" +msgstr "не удалось прочитать символическую ссылку \"%s\": %m" -#: filemap.c:245 +#: file_ops.c:449 #, c-format -msgid "\"%s\" is not a symbolic link" -msgstr "\"%s\" не является символической ссылкой" +msgid "symbolic link \"%s\" target is too long" +msgstr "целевой путь символической ссылки \"%s\" слишком длинный" -#: filemap.c:257 +#: file_ops.c:464 #, c-format -msgid "\"%s\" is not a regular file" -msgstr "\"%s\" не является обычным файлом" +msgid "" +"\"%s\" is a symbolic link, but symbolic links are not supported on this " +"platform" +msgstr "" +"\"%s\" — символическая ссылка, но в этой ОС символические ссылки не " +"поддерживаются" -#: filemap.c:369 +#: file_ops.c:471 #, c-format -msgid "source file list is empty" -msgstr "список файлов в источнике пуст" +msgid "could not read directory \"%s\": %m" +msgstr "не удалось прочитать каталог \"%s\": %m" -#: filemap.c:484 +#: file_ops.c:475 #, c-format -msgid "unexpected page modification for directory or symbolic link \"%s\"" -msgstr "" -"неожиданная модификация страницы для каталога или символической ссылки \"%s\"" +msgid "could not close directory \"%s\": %m" +msgstr "не удалось закрыть каталог \"%s\": %m" -#: libpq_fetch.c:50 +#: filemap.c:237 #, c-format -msgid "%s" -msgstr "%s" +msgid "data file \"%s\" in source is not a regular file" +msgstr "файл данных \"%s\" в источнике не является обычным файлом" -#: libpq_fetch.c:53 +#: filemap.c:242 filemap.c:275 #, c-format -msgid "connected to server" -msgstr "подключение к серверу установлено" +msgid "duplicate source file \"%s\"" +msgstr "повторный исходный файл \"%s\"" -#: libpq_fetch.c:62 +#: filemap.c:330 #, c-format -msgid "could not clear search_path: %s" -msgstr "не удалось очистить search_path: %s" +msgid "unexpected page modification for non-regular file \"%s\"" +msgstr "неожиданная модификация страницы для файла особого вида \"%s\"" -#: libpq_fetch.c:74 +#: filemap.c:680 filemap.c:774 #, c-format -msgid "source server must not be in recovery mode" -msgstr "исходный сервер должен выйти из режима восстановления" +msgid "unknown file type for \"%s\"" +msgstr "неизвестный тип файла \"%s\"" -#: libpq_fetch.c:84 +#: filemap.c:707 +#, c-format +msgid "file \"%s\" is of different type in source and target" +msgstr "файл \"%s\" имеет разный тип в исходном и целевом кластере" + +#: filemap.c:779 +#, c-format +msgid "could not decide what to do with file \"%s\"" +msgstr "не удалось определить, что делать с файлом \"%s\"" + +#: libpq_source.c:128 +#, c-format +msgid "could not clear search_path: %s" +msgstr "не удалось очистить search_path: %s" + +#: libpq_source.c:139 #, c-format msgid "full_page_writes must be enabled in the source server" msgstr "на исходном сервере должен быть включён режим full_page_writes" -#: libpq_fetch.c:110 +#: libpq_source.c:150 +#, c-format +msgid "could not prepare statement to fetch file contents: %s" +msgstr "не удалось подготовить оператор для извлечения содержимого файла: %s" + +#: libpq_source.c:169 #, c-format msgid "error running query (%s) on source server: %s" msgstr "ошибка выполнения запроса (%s) на исходном сервере: %s" -#: libpq_fetch.c:115 +#: libpq_source.c:174 #, c-format msgid "unexpected result set from query" msgstr "неожиданный результат запроса" -#: libpq_fetch.c:136 +#: libpq_source.c:196 #, c-format msgid "error running query (%s) in source server: %s" msgstr "ошибка выполнения запроса (%s) на исходном сервере: %s" -#: libpq_fetch.c:156 +#: libpq_source.c:217 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "" "нераспознанный результат \"%s\" вместо текущей позиции добавления в WAL" -#: libpq_fetch.c:206 +#: libpq_source.c:268 #, c-format msgid "could not fetch file list: %s" msgstr "не удалось получить список файлов: %s" -#: libpq_fetch.c:211 +#: libpq_source.c:273 #, c-format msgid "unexpected result set while fetching file list" msgstr "неожиданный результат при получении списка файлов" -#: libpq_fetch.c:264 +#: libpq_source.c:435 #, c-format msgid "could not send query: %s" msgstr "не удалось отправить запрос: %s" -#: libpq_fetch.c:269 +#: libpq_source.c:438 #, c-format msgid "could not set libpq connection to single row mode" msgstr "не удалось перевести подключение libpq в однострочный режим" -#: libpq_fetch.c:289 +#: libpq_source.c:468 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "неожиданный результат при получении файлов с сервера: %s" -#: libpq_fetch.c:295 +#: libpq_source.c:473 +#, c-format +msgid "received more data chunks than requested" +msgstr "получено больше сегментов данных, чем запрошено" + +#: libpq_source.c:477 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "неожиданный размер набора результатов при получении файлов с сервера" -#: libpq_fetch.c:301 +#: libpq_source.c:483 #, c-format msgid "" "unexpected data types in result set while fetching remote files: %u %u %u" @@ -380,77 +359,100 @@ msgstr "" "неожиданные типы данных в наборе результатов при получении файлов с сервера: " "%u %u %u" -#: libpq_fetch.c:309 +#: libpq_source.c:491 #, c-format msgid "unexpected result format while fetching remote files" msgstr "неожиданный формат результата при получении файлов с сервера" -#: libpq_fetch.c:315 +#: libpq_source.c:497 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "неожиданные значения NULL в результате при получении файлов с сервера" -#: libpq_fetch.c:319 +#: libpq_source.c:501 #, c-format msgid "unexpected result length while fetching remote files" msgstr "неожиданная длина результата при получении файлов с сервера" -#: libpq_fetch.c:380 +#: libpq_source.c:534 +#, c-format +msgid "received data for file \"%s\", when requested for \"%s\"" +msgstr "получены данные для файла \"%s\", а запрашивались данные для \"%s\"" + +#: libpq_source.c:538 +#, c-format +msgid "" +"received data at offset %lld of file \"%s\", when requested for offset %lld" +msgstr "" +"получены данные по смещению %lld в файле \"%s\", а запрашивались по смещению " +"%lld" + +#: libpq_source.c:550 +#, c-format +msgid "received more than requested for file \"%s\"" +msgstr "получено больше данных, чем запрошено для файла \"%s\"" + +#: libpq_source.c:563 +#, c-format +msgid "unexpected number of data chunks received" +msgstr "получено неожиданное количество сегментов данных" + +#: libpq_source.c:606 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "не удалось получить с сервера файл \"%s\": %s" -#: libpq_fetch.c:385 +#: libpq_source.c:611 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "неожиданный набор результатов при получении файла \"%s\" с сервера" -#: libpq_fetch.c:429 +#: local_source.c:86 #, c-format -msgid "could not send COPY data: %s" -msgstr "не удалось отправить данные COPY: %s" +msgid "could not open source file \"%s\": %m" +msgstr "не удалось открыть исходный файл \"%s\": %m" -#: libpq_fetch.c:458 +#: local_source.c:90 #, c-format -msgid "could not send file list: %s" -msgstr "не удалось отправить список файлов: %s" +msgid "could not seek in source file: %m" +msgstr "не удалось переместиться в исходном файле: %m" -#: libpq_fetch.c:500 +#: local_source.c:109 #, c-format -msgid "could not send end-of-COPY: %s" -msgstr "не удалось отправить сообщение о завершении копирования: %s" +msgid "unexpected EOF while reading file \"%s\"" +msgstr "неожиданный конец файла при чтении \"%s\"" -#: libpq_fetch.c:506 +#: local_source.c:116 #, c-format -msgid "unexpected result while sending file list: %s" -msgstr "неожиданный результат при передаче списка: %s" +msgid "could not close file \"%s\": %m" +msgstr "не удалось закрыть файл \"%s\": %m" -#: parsexlog.c:88 parsexlog.c:141 +#: parsexlog.c:89 parsexlog.c:142 #, c-format msgid "could not read WAL record at %X/%X: %s" msgstr "не удалось прочитать запись WAL в позиции %X/%X: %s" -#: parsexlog.c:92 parsexlog.c:144 +#: parsexlog.c:93 parsexlog.c:145 #, c-format msgid "could not read WAL record at %X/%X" msgstr "не удалось прочитать запись WAL в позиции %X/%X" -#: parsexlog.c:207 +#: parsexlog.c:208 #, c-format msgid "could not find previous WAL record at %X/%X: %s" msgstr "не удалось найти предыдущую запись WAL в позиции %X/%X: %s" -#: parsexlog.c:211 +#: parsexlog.c:212 #, c-format msgid "could not find previous WAL record at %X/%X" msgstr "не удалось найти предыдущую запись WAL в позиции %X/%X" -#: parsexlog.c:336 +#: parsexlog.c:337 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "не удалось переместиться в файле \"%s\": %m" -#: parsexlog.c:416 +#: parsexlog.c:429 #, c-format msgid "" "WAL record modifies a relation, but record type is not recognized: lsn: %X/" @@ -459,7 +461,7 @@ msgstr "" "Запись WAL модифицирует отношение, но тип записи не распознан: lsn: %X/%X, " "rmgr: %s, info: %02X" -#: pg_rewind.c:78 +#: pg_rewind.c:84 #, c-format msgid "" "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" @@ -468,7 +470,7 @@ msgstr "" "%s синхронизирует кластер PostgreSQL с другой копией кластера.\n" "\n" -#: pg_rewind.c:79 +#: pg_rewind.c:85 #, c-format msgid "" "Usage:\n" @@ -479,12 +481,12 @@ msgstr "" " %s [ПАРАМЕТР]...\n" "\n" -#: pg_rewind.c:80 +#: pg_rewind.c:86 #, c-format msgid "Options:\n" msgstr "Параметры:\n" -#: pg_rewind.c:81 +#: pg_rewind.c:87 #, c-format msgid "" " -c, --restore-target-wal use restore_command in target configuration " @@ -495,14 +497,14 @@ msgstr "" " архива команду restore_command из целевой\n" " конфигурации\n" -#: pg_rewind.c:83 +#: pg_rewind.c:89 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr "" " -D, --target-pgdata=КАТАЛОГ существующий каталог, куда будут записаны " "данные\n" -#: pg_rewind.c:84 +#: pg_rewind.c:90 #, c-format msgid "" " --source-pgdata=DIRECTORY source data directory to synchronize with\n" @@ -511,21 +513,21 @@ msgstr "" "синхронизация\n" # well-spelled: ПОДКЛ -#: pg_rewind.c:85 +#: pg_rewind.c:91 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr "" " --source-server=СТР_ПОДКЛ сервер, с которым будет проведена " "синхронизация\n" -#: pg_rewind.c:86 +#: pg_rewind.c:92 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr "" " -n, --dry-run остановиться до внесения каких-либо " "изменений\n" -#: pg_rewind.c:87 +#: pg_rewind.c:93 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written\n" @@ -534,12 +536,12 @@ msgstr "" " -N, --no-sync не ждать завершения сохранения данных на " "диске\n" -#: pg_rewind.c:89 +#: pg_rewind.c:95 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress выводить сообщения о ходе процесса\n" -#: pg_rewind.c:90 +#: pg_rewind.c:96 #, c-format msgid "" " -R, --write-recovery-conf write configuration for replication\n" @@ -548,13 +550,13 @@ msgstr "" " -R, --write-recovery-conf записать конфигурацию для репликации\n" " (требуется указание --source-server)\n" -#: pg_rewind.c:92 +#: pg_rewind.c:98 #, c-format msgid " --debug write a lot of debug messages\n" msgstr "" " --debug выдавать множество отладочных сообщений\n" -#: pg_rewind.c:93 +#: pg_rewind.c:99 #, c-format msgid "" " --no-ensure-shutdown do not automatically fix unclean shutdown\n" @@ -562,18 +564,18 @@ msgstr "" " --no-ensure-shutdown не исправлять автоматически состояние,\n" " возникающее при нештатном отключении\n" -#: pg_rewind.c:94 +#: pg_rewind.c:100 #, c-format msgid "" " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: pg_rewind.c:95 +#: pg_rewind.c:101 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: pg_rewind.c:96 +#: pg_rewind.c:102 #, c-format msgid "" "\n" @@ -582,33 +584,33 @@ msgstr "" "\n" "Об ошибках сообщайте по адресу <%s>.\n" -#: pg_rewind.c:97 +#: pg_rewind.c:103 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" -#: pg_rewind.c:160 pg_rewind.c:209 pg_rewind.c:216 pg_rewind.c:223 -#: pg_rewind.c:230 pg_rewind.c:238 +#: pg_rewind.c:164 pg_rewind.c:213 pg_rewind.c:220 pg_rewind.c:227 +#: pg_rewind.c:234 pg_rewind.c:242 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Для дополнительной информации попробуйте \"%s --help\".\n" -#: pg_rewind.c:208 +#: pg_rewind.c:212 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "источник не указан (требуется --source-pgdata или --source-server)" -#: pg_rewind.c:215 +#: pg_rewind.c:219 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "указать можно только --source-pgdata либо --source-server" -#: pg_rewind.c:222 +#: pg_rewind.c:226 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "целевой каталог данных не указан (--target-pgdata)" -#: pg_rewind.c:229 +#: pg_rewind.c:233 #, c-format msgid "" "no source server information (--source-server) specified for --write-" @@ -617,94 +619,119 @@ msgstr "" "отсутствует информация об исходном сервере (--source-server) для --write-" "recovery-conf" -#: pg_rewind.c:236 +#: pg_rewind.c:240 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "слишком много аргументов командной строки (первый: \"%s\")" -#: pg_rewind.c:251 +#: pg_rewind.c:255 #, c-format msgid "cannot be executed by \"root\"" msgstr "программу не должен запускать root" -#: pg_rewind.c:252 +#: pg_rewind.c:256 #, c-format msgid "You must run %s as the PostgreSQL superuser.\n" msgstr "Запускать %s нужно от имени суперпользователя PostgreSQL.\n" -#: pg_rewind.c:263 +#: pg_rewind.c:267 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "не удалось считать права на каталог \"%s\": %m" -#: pg_rewind.c:317 +#: pg_rewind.c:287 +#, c-format +msgid "%s" +msgstr "%s" + +#: pg_rewind.c:290 +#, c-format +msgid "connected to server" +msgstr "подключение к серверу установлено" + +#: pg_rewind.c:337 #, c-format msgid "source and target cluster are on the same timeline" msgstr "исходный и целевой кластер уже на одной линии времени" -#: pg_rewind.c:326 +#: pg_rewind.c:346 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "серверы разошлись в позиции WAL %X/%X на линии времени %u" -#: pg_rewind.c:374 +#: pg_rewind.c:394 #, c-format msgid "no rewind required" msgstr "перемотка не требуется" -#: pg_rewind.c:383 +#: pg_rewind.c:403 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "" "перемотка от последней общей контрольной точки в позиции %X/%X на линии " "времени %u" -#: pg_rewind.c:392 +#: pg_rewind.c:413 #, c-format msgid "reading source file list" msgstr "чтение списка исходных файлов" -#: pg_rewind.c:395 +#: pg_rewind.c:417 #, c-format msgid "reading target file list" msgstr "чтение списка целевых файлов" -#: pg_rewind.c:404 +#: pg_rewind.c:426 #, c-format msgid "reading WAL in target" msgstr "чтение WAL в целевом кластере" -#: pg_rewind.c:421 +#: pg_rewind.c:447 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "требуется скопировать %lu МБ (общий размер исходного каталога: %lu МБ)" -#: pg_rewind.c:439 -#, c-format -msgid "creating backup label and updating control file" -msgstr "создание метки копии и модификация управляющего файла" - -#: pg_rewind.c:469 +#: pg_rewind.c:465 #, c-format msgid "syncing target data directory" msgstr "синхронизация целевого каталога данных" -#: pg_rewind.c:476 +#: pg_rewind.c:481 #, c-format msgid "Done!" msgstr "Готово!" -#: pg_rewind.c:488 +#: pg_rewind.c:564 +#, c-format +msgid "no action decided for file \"%s\"" +msgstr "действие не определено для файла \"%s\"" + +#: pg_rewind.c:596 +#, c-format +msgid "source system was modified while pg_rewind was running" +msgstr "в исходной системе произошли изменения в процессе работы pg_rewind" + +#: pg_rewind.c:600 +#, c-format +msgid "creating backup label and updating control file" +msgstr "создание метки копии и модификация управляющего файла" + +#: pg_rewind.c:650 +#, c-format +msgid "source system was in unexpected state at end of rewind" +msgstr "исходная система оказалась в неожиданном состоянии после перемотки" + +#: pg_rewind.c:681 #, c-format msgid "source and target clusters are from different systems" msgstr "исходный и целевой кластеры относятся к разным системам" -#: pg_rewind.c:496 +#: pg_rewind.c:689 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "кластеры несовместимы с этой версией pg_rewind" -#: pg_rewind.c:506 +#: pg_rewind.c:699 #, c-format msgid "" "target server needs to use either data checksums or \"wal_log_hints = on\"" @@ -712,49 +739,49 @@ msgstr "" "на целевом сервере должны быть контрольные суммы данных или \"wal_log_hints " "= on\"" -#: pg_rewind.c:517 +#: pg_rewind.c:710 #, c-format msgid "target server must be shut down cleanly" msgstr "целевой сервер должен быть выключен штатно" -#: pg_rewind.c:527 +#: pg_rewind.c:720 #, c-format msgid "source data directory must be shut down cleanly" msgstr "работа с исходным каталогом данных должна быть завершена штатно" -#: pg_rewind.c:579 +#: pg_rewind.c:772 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s КБ (%d%%) скопировано" -#: pg_rewind.c:642 +#: pg_rewind.c:835 #, c-format msgid "invalid control file" msgstr "неверный управляющий файл" -#: pg_rewind.c:726 +#: pg_rewind.c:919 #, c-format msgid "" "could not find common ancestor of the source and target cluster's timelines" msgstr "" "не удалось найти общего предка линий времени исходного и целевого кластеров" -#: pg_rewind.c:767 +#: pg_rewind.c:960 #, c-format msgid "backup label buffer too small" msgstr "буфер для метки копии слишком мал" -#: pg_rewind.c:790 +#: pg_rewind.c:983 #, c-format msgid "unexpected control file CRC" msgstr "неверная контрольная сумма управляющего файла" -#: pg_rewind.c:800 +#: pg_rewind.c:995 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "неверный размер управляющего файла (%d), ожидалось: %d" -#: pg_rewind.c:809 +#: pg_rewind.c:1004 #, c-format msgid "" "WAL segment size must be a power of two between 1 MB and 1 GB, but the " @@ -772,7 +799,7 @@ msgstr[2] "" "Размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 " "ГБ, но в управляющем файле указано значение: %d" -#: pg_rewind.c:866 pg_rewind.c:924 +#: pg_rewind.c:1043 pg_rewind.c:1101 #, c-format msgid "" "The program \"%s\" is needed by %s but was not found in the\n" @@ -783,7 +810,7 @@ msgstr "" "в каталоге \"%s\".\n" "Проверьте правильность установки СУБД." -#: pg_rewind.c:871 pg_rewind.c:929 +#: pg_rewind.c:1048 pg_rewind.c:1106 #, c-format msgid "" "The program \"%s\" was found by \"%s\"\n" @@ -794,25 +821,25 @@ msgstr "" "но её версия отличается от версии %s.\n" "Проверьте правильность установки СУБД." -#: pg_rewind.c:892 +#: pg_rewind.c:1069 #, c-format msgid "restore_command is not set in the target cluster" msgstr "команда restore_command в целевом кластере не определена" -#: pg_rewind.c:935 +#: pg_rewind.c:1112 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "" "выполнение \"%s\" для восстановления согласованности на целевом сервере" -#: pg_rewind.c:955 +#: pg_rewind.c:1132 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "" "не удалось запустить postgres в целевом кластере в однопользовательском " "режиме" -#: pg_rewind.c:956 +#: pg_rewind.c:1133 #, c-format msgid "Command was: %s" msgstr "Выполнялась команда: %s" @@ -853,64 +880,64 @@ msgid "Timeline IDs must be less than child timeline's ID." msgstr "" "Идентификаторы линий времени должны быть меньше идентификатора линии-потомка." -#: xlogreader.c:349 +#: xlogreader.c:354 #, c-format msgid "invalid record offset at %X/%X" msgstr "неверное смещение записи: %X/%X" -#: xlogreader.c:357 +#: xlogreader.c:362 #, c-format msgid "contrecord is requested by %X/%X" msgstr "по смещению %X/%X запрошено продолжение записи" -#: xlogreader.c:398 xlogreader.c:695 +#: xlogreader.c:403 xlogreader.c:733 #, c-format msgid "invalid record length at %X/%X: wanted %u, got %u" msgstr "неверная длина записи по смещению %X/%X: ожидалось %u, получено %u" -#: xlogreader.c:422 +#: xlogreader.c:429 #, c-format msgid "record length %u at %X/%X too long" msgstr "длина записи %u по смещению %X/%X слишком велика" -#: xlogreader.c:454 +#: xlogreader.c:477 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "нет флага contrecord в позиции %X/%X" -#: xlogreader.c:467 +#: xlogreader.c:490 #, c-format -msgid "invalid contrecord length %u at %X/%X" -msgstr "неверная длина contrecord (%u) в позиции %X/%X" +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "неверная длина contrecord: %u (ожидалось %lld) в позиции %X/%X" -#: xlogreader.c:703 +#: xlogreader.c:741 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "неверный ID менеджера ресурсов %u по смещению %X/%X" -#: xlogreader.c:717 xlogreader.c:734 +#: xlogreader.c:754 xlogreader.c:770 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "запись с неверной ссылкой назад %X/%X по смещению %X/%X" -#: xlogreader.c:771 +#: xlogreader.c:806 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" "некорректная контрольная сумма данных менеджера ресурсов в записи по " "смещению %X/%X" -#: xlogreader.c:808 +#: xlogreader.c:843 #, c-format msgid "invalid magic number %04X in log segment %s, offset %u" msgstr "неверное магическое число %04X в сегменте журнала %s, смещение %u" -#: xlogreader.c:822 xlogreader.c:863 +#: xlogreader.c:857 xlogreader.c:898 #, c-format msgid "invalid info bits %04X in log segment %s, offset %u" msgstr "неверные информационные биты %04X в сегменте журнала %s, смещение %u" -#: xlogreader.c:837 +#: xlogreader.c:872 #, c-format msgid "" "WAL file is from different database system: WAL file database system " @@ -919,7 +946,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: в нём указан идентификатор системы БД " "%llu, а идентификатор системы pg_control: %llu" -#: xlogreader.c:845 +#: xlogreader.c:880 #, c-format msgid "" "WAL file is from different database system: incorrect segment size in page " @@ -928,7 +955,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный размер сегмента в заголовке " "страницы" -#: xlogreader.c:851 +#: xlogreader.c:886 #, c-format msgid "" "WAL file is from different database system: incorrect XLOG_BLCKSZ in page " @@ -937,35 +964,35 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке " "страницы" -#: xlogreader.c:882 +#: xlogreader.c:917 #, c-format msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" msgstr "неожиданный pageaddr %X/%X в сегменте журнала %s, смещение %u" -#: xlogreader.c:907 +#: xlogreader.c:942 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" msgstr "" "нарушение последовательности ID линии времени %u (после %u) в сегменте " "журнала %s, смещение %u" -#: xlogreader.c:1247 +#: xlogreader.c:1287 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X" -#: xlogreader.c:1270 +#: xlogreader.c:1309 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA установлен, но данных в позиции %X/%X нет" -#: xlogreader.c:1277 +#: xlogreader.c:1316 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "" "BKPBLOCK_HAS_DATA не установлен, но длина данных равна %u в позиции %X/%X" -#: xlogreader.c:1313 +#: xlogreader.c:1352 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -974,21 +1001,21 @@ msgstr "" "BKPIMAGE_HAS_HOLE установлен, но для пропуска заданы смещение %u и длина %u " "при длине образа блока %u в позиции %X/%X" -#: xlogreader.c:1329 +#: xlogreader.c:1368 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "" "BKPIMAGE_HAS_HOLE не установлен, но для пропуска заданы смещение %u и длина " "%u в позиции %X/%X" -#: xlogreader.c:1344 +#: xlogreader.c:1383 #, c-format msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" msgstr "" "BKPIMAGE_IS_COMPRESSED установлен, но длина образа блока равна %u в позиции " "%X/%X" -#: xlogreader.c:1359 +#: xlogreader.c:1398 #, c-format msgid "" "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image " @@ -997,28 +1024,55 @@ msgstr "" "ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_IS_COMPRESSED не установлены, но длина " "образа блока равна %u в позиции %X/%X" -#: xlogreader.c:1375 +#: xlogreader.c:1414 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "" "BKPBLOCK_SAME_REL установлен, но предыдущее значение не задано в позиции %X/" "%X" -#: xlogreader.c:1387 +#: xlogreader.c:1426 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: xlogreader.c:1476 +#: xlogreader.c:1513 #, c-format msgid "record with invalid length at %X/%X" msgstr "запись с неверной длиной в позиции %X/%X" -#: xlogreader.c:1565 +#: xlogreader.c:1602 #, c-format msgid "invalid compressed image at %X/%X, block %d" msgstr "неверный сжатый образ в позиции %X/%X, блок %d" +#~ msgid "\"%s\" is not a directory" +#~ msgstr "\"%s\" не является каталогом" + +#~ msgid "\"%s\" is not a symbolic link" +#~ msgstr "\"%s\" не является символической ссылкой" + +#~ msgid "\"%s\" is not a regular file" +#~ msgstr "\"%s\" не является обычным файлом" + +#~ msgid "source file list is empty" +#~ msgstr "список файлов в источнике пуст" + +#~ msgid "source server must not be in recovery mode" +#~ msgstr "исходный сервер должен выйти из режима восстановления" + +#~ msgid "could not send COPY data: %s" +#~ msgstr "не удалось отправить данные COPY: %s" + +#~ msgid "could not send file list: %s" +#~ msgstr "не удалось отправить список файлов: %s" + +#~ msgid "could not send end-of-COPY: %s" +#~ msgstr "не удалось отправить сообщение о завершении копирования: %s" + +#~ msgid "unexpected result while sending file list: %s" +#~ msgstr "неожиданный результат при передаче списка: %s" + #~ msgid "could not connect to server: %s" #~ msgstr "не удалось подключиться к серверу: %s" @@ -1053,9 +1107,6 @@ msgstr "неверный сжатый образ в позиции %X/%X, бло #~ msgstr "" #~ "для файла \"%s\" вместо сегмента получено NULL-значение, файл удалён\n" -#~ msgid "received chunk for file \"%s\", offset %s, size %d\n" -#~ msgstr "получен сегмент файла \"%s\": смещение %s, размер %d\n" - #~ msgid "fetched file \"%s\", length %d\n" #~ msgstr "получен файл \"%s\", длина %d\n" diff --git a/src/bin/pg_rewind/po/sv.po b/src/bin/pg_rewind/po/sv.po index 0df9e35b86..0ce3b5cf60 100644 --- a/src/bin/pg_rewind/po/sv.po +++ b/src/bin/pg_rewind/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_rewind # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-16 05:17+0000\n" -"PO-Revision-Date: 2020-09-16 07:53+0200\n" +"POT-Creation-Date: 2022-04-12 13:50+0000\n" +"PO-Revision-Date: 2022-04-12 16:29+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,21 +17,26 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatalt: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:273 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:280 #, c-format msgid "warning: " msgstr "varning: " +#: ../../../src/common/logging.c:291 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:298 +#, c-format +msgid "hint: " +msgstr "tips: " + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -78,375 +83,389 @@ msgstr "kunde inte starta process för kommando \"%s\": felkod %lu" msgid "could not re-execute with restricted token: error code %lu" msgstr "kunde inte köra igen med token för begränsad åtkomst: felkod %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:193 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "kunde inte hämta statuskod för underprocess: felkod %lu" -#: ../../fe_utils/archive.c:53 +#: ../../fe_utils/archive.c:52 #, c-format msgid "cannot use restore_command with %%r placeholder" msgstr "kan inte använda restore_command med %%r-platshållare" -#: ../../fe_utils/archive.c:74 +#: ../../fe_utils/archive.c:70 #, c-format -msgid "unexpected file size for \"%s\": %lu instead of %lu" -msgstr "oväntad filstorlek på \"%s\": %lu istället för %lu" +msgid "unexpected file size for \"%s\": %lld instead of %lld" +msgstr "oväntad filstorlek på \"%s\": %lld istället för %lld" -#: ../../fe_utils/archive.c:85 +#: ../../fe_utils/archive.c:78 #, c-format msgid "could not open file \"%s\" restored from archive: %m" msgstr "kunde inte öppna fil \"%s\" återställd från arkiv: %m" -#: ../../fe_utils/archive.c:97 copy_fetch.c:88 filemap.c:208 +#: ../../fe_utils/archive.c:87 file_ops.c:417 #, c-format msgid "could not stat file \"%s\": %m" msgstr "kunde inte göra stat() på fil \"%s\": %m" -#: ../../fe_utils/archive.c:112 +#: ../../fe_utils/archive.c:99 #, c-format msgid "restore_command failed: %s" msgstr "restore_command misslyckades: %s" -#: ../../fe_utils/archive.c:121 +#: ../../fe_utils/archive.c:106 #, c-format msgid "could not restore file \"%s\" from archive" msgstr "kunde inte återställa fil \"%s\" från arkiv" -#: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49 -#: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100 -#: ../../fe_utils/recovery_gen.c:171 parsexlog.c:73 parsexlog.c:125 -#: parsexlog.c:185 +#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 +#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 +#: ../../fe_utils/recovery_gen.c:149 #, c-format msgid "out of memory" msgstr "slut på minne" -#: ../../fe_utils/recovery_gen.c:134 parsexlog.c:298 +#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:313 #, c-format msgid "could not open file \"%s\": %m" msgstr "kunde inte öppna fil \"%s\": %m" -#: ../../fe_utils/recovery_gen.c:140 +#: ../../fe_utils/recovery_gen.c:124 #, c-format msgid "could not write to file \"%s\": %m" msgstr "kunde inte skriva till fil \"%s\": %m" -#: ../../fe_utils/recovery_gen.c:152 +#: ../../fe_utils/recovery_gen.c:133 #, c-format msgid "could not create file \"%s\": %m" msgstr "kan inte skapa fil \"%s\": %m" -#: copy_fetch.c:59 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "kunde inte öppna katalog \"%s\": %m" - -#: copy_fetch.c:117 -#, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "kan inte läsa symbolisk länk \"%s\": %m" - -#: copy_fetch.c:120 -#, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "mål för symbolisk länk \"%s\" är för lång" - -#: copy_fetch.c:135 -#, c-format -msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform" -msgstr "\"%s\" är en symbolisk länk men symboliska länkar stöds inte på denna plattform" - -#: copy_fetch.c:142 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "kunde inte läsa katalog \"%s\": %m" - -#: copy_fetch.c:146 -#, c-format -msgid "could not close directory \"%s\": %m" -msgstr "kunde inte stänga katalog \"%s\": %m" - -#: copy_fetch.c:166 -#, c-format -msgid "could not open source file \"%s\": %m" -msgstr "kunde inte öppna källfil \"%s\": %m" - -#: copy_fetch.c:170 -#, c-format -msgid "could not seek in source file: %m" -msgstr "kunde inte söka i källfil: %m" - -#: copy_fetch.c:187 file_ops.c:311 parsexlog.c:336 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "kunde inte läsa fil \"%s\": %m" - -#: copy_fetch.c:190 -#, c-format -msgid "unexpected EOF while reading file \"%s\"" -msgstr "oväntad EOF under läsning av fil \"%s\"" - -#: copy_fetch.c:197 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "kunde inte stänga fil \"%s\": %m" - -#: file_ops.c:62 +#: file_ops.c:67 #, c-format msgid "could not open target file \"%s\": %m" msgstr "kunde inte öppna målfil \"%s\": %m" -#: file_ops.c:76 +#: file_ops.c:81 #, c-format msgid "could not close target file \"%s\": %m" msgstr "kunde inte stänga målfil \"%s\": %m" -#: file_ops.c:96 +#: file_ops.c:101 #, c-format msgid "could not seek in target file \"%s\": %m" msgstr "kunde inte söka i målfil \"%s\": %m" -#: file_ops.c:112 +#: file_ops.c:117 #, c-format msgid "could not write file \"%s\": %m" msgstr "kunde inte skriva fil \"%s\": %m" -#: file_ops.c:162 +#: file_ops.c:150 file_ops.c:177 +#, c-format +msgid "undefined file type for \"%s\"" +msgstr "odefinierad filtyp på \"%s\"" + +#: file_ops.c:173 #, c-format msgid "invalid action (CREATE) for regular file" msgstr "ogiltig aktion (CREATE) för vanlig fil" -#: file_ops.c:185 +#: file_ops.c:200 #, c-format msgid "could not remove file \"%s\": %m" msgstr "kunde inte ta bort fil \"%s\": %m" -#: file_ops.c:203 +#: file_ops.c:218 #, c-format msgid "could not open file \"%s\" for truncation: %m" msgstr "kunde inte öppna fil \"%s\" för trunkering: %m" -#: file_ops.c:207 +#: file_ops.c:222 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "kunde inte trunkera fil \"%s\" till %u: %m" -#: file_ops.c:223 +#: file_ops.c:238 #, c-format msgid "could not create directory \"%s\": %m" msgstr "kunde inte skapa katalog \"%s\": %m" -#: file_ops.c:237 +#: file_ops.c:252 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "kunde inte ta bort katalog \"%s\": %m" -#: file_ops.c:251 +#: file_ops.c:266 #, c-format msgid "could not create symbolic link at \"%s\": %m" msgstr "kunde inte skapa en symnbolisk länk vid \"%s\": %m" -#: file_ops.c:265 +#: file_ops.c:280 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "kan inte ta bort symbolisk länk \"%s\": %m" -#: file_ops.c:296 file_ops.c:300 +#: file_ops.c:326 file_ops.c:330 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "kunde inte öppna filen \"%s\" för läsning: %m" -#: file_ops.c:314 parsexlog.c:338 +#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:351 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "kunde inte läsa fil \"%s\": %m" + +#: file_ops.c:344 parsexlog.c:353 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" -#: filemap.c:200 +#: file_ops.c:388 #, c-format -msgid "data file \"%s\" in source is not a regular file" -msgstr "datafil \"%s\" i källan är inte en vanlig fil" +msgid "could not open directory \"%s\": %m" +msgstr "kunde inte öppna katalog \"%s\": %m" -#: filemap.c:222 +#: file_ops.c:446 #, c-format -msgid "\"%s\" is not a directory" -msgstr "\"%s\" är inte en katalog" +msgid "could not read symbolic link \"%s\": %m" +msgstr "kan inte läsa symbolisk länk \"%s\": %m" -#: filemap.c:245 +#: file_ops.c:449 #, c-format -msgid "\"%s\" is not a symbolic link" -msgstr "\"%s\" är inte en symbolisk länk" +msgid "symbolic link \"%s\" target is too long" +msgstr "mål för symbolisk länk \"%s\" är för lång" -#: filemap.c:257 +#: file_ops.c:464 #, c-format -msgid "\"%s\" is not a regular file" -msgstr "\"%s\" är inte en vanlig fil" +msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform" +msgstr "\"%s\" är en symbolisk länk men symboliska länkar stöds inte på denna plattform" -#: filemap.c:369 +#: file_ops.c:471 #, c-format -msgid "source file list is empty" -msgstr "källfillistan är tom" +msgid "could not read directory \"%s\": %m" +msgstr "kunde inte läsa katalog \"%s\": %m" -#: filemap.c:484 +#: file_ops.c:475 #, c-format -msgid "unexpected page modification for directory or symbolic link \"%s\"" -msgstr "oväntad sidmodifiering för katalog eller symbolisk länk \"%s\"" +msgid "could not close directory \"%s\": %m" +msgstr "kunde inte stänga katalog \"%s\": %m" -#: libpq_fetch.c:50 +#: filemap.c:236 #, c-format -msgid "could not connect to server: %s" -msgstr "kunde inte ansluta till server: %s" +msgid "data file \"%s\" in source is not a regular file" +msgstr "datafil \"%s\" i källan är inte en vanlig fil" -#: libpq_fetch.c:54 +#: filemap.c:241 filemap.c:274 #, c-format -msgid "connected to server" -msgstr "ansluten till server" +msgid "duplicate source file \"%s\"" +msgstr "duplicerad källflagga \"%s\"" -#: libpq_fetch.c:63 +#: filemap.c:329 #, c-format -msgid "could not clear search_path: %s" -msgstr "kunde inte nollställa search_path: %s" +msgid "unexpected page modification for non-regular file \"%s\"" +msgstr "oväntad sidmodifiering för icke-regulär fil \"%s\"" -#: libpq_fetch.c:75 +#: filemap.c:679 filemap.c:773 #, c-format -msgid "source server must not be in recovery mode" -msgstr "källserver får inte vara i återställningsläge" +msgid "unknown file type for \"%s\"" +msgstr "okänd filtyp på \"%s\"" -#: libpq_fetch.c:85 +#: filemap.c:706 +#, c-format +msgid "file \"%s\" is of different type in source and target" +msgstr "filen \"%s\" har olika typ i källa och mål" + +#: filemap.c:778 +#, c-format +msgid "could not decide what to do with file \"%s\"" +msgstr "kunde inte bestämma vad som skulle göras med filen \"%s\"" + +#: libpq_source.c:130 +#, c-format +msgid "could not clear search_path: %s" +msgstr "kunde inte nollställa search_path: %s" + +#: libpq_source.c:141 #, c-format msgid "full_page_writes must be enabled in the source server" msgstr "full_page_writes måste vara påslagen i källservern" -#: libpq_fetch.c:111 +#: libpq_source.c:152 +#, c-format +msgid "could not prepare statement to fetch file contents: %s" +msgstr "kunde inte förbereda satsen för att hämta filinnehåll: %s" + +#: libpq_source.c:171 #, c-format msgid "error running query (%s) on source server: %s" msgstr "fel vid körande av fråga (%s) på källserver: %s" -#: libpq_fetch.c:116 +#: libpq_source.c:176 #, c-format msgid "unexpected result set from query" msgstr "oväntad resultatmängd från fråga" -#: libpq_fetch.c:137 +#: libpq_source.c:198 #, c-format msgid "error running query (%s) in source server: %s" msgstr "fel vid körande av fråga (%s) i källserver: %s" -#: libpq_fetch.c:157 +#: libpq_source.c:219 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "oväntat resultat \"%s\" för nuvarande WAL-insättningsposition" -#: libpq_fetch.c:207 +#: libpq_source.c:270 #, c-format msgid "could not fetch file list: %s" msgstr "kunde inte hämta fillista: %s" -#: libpq_fetch.c:212 +#: libpq_source.c:275 #, c-format msgid "unexpected result set while fetching file list" msgstr "oväntad resultatmängd vid hämtning av fillista" -#: libpq_fetch.c:265 +#: libpq_source.c:467 #, c-format msgid "could not send query: %s" msgstr "kunde inte skicka fråga: %s" -#: libpq_fetch.c:270 +#: libpq_source.c:470 #, c-format msgid "could not set libpq connection to single row mode" msgstr "kunde inte sätta libpq-anslutning till enradsläge" -#: libpq_fetch.c:290 +#: libpq_source.c:500 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "oväntat resultat vid hämtning av extern fil: %s" -#: libpq_fetch.c:296 +#: libpq_source.c:505 +#, c-format +msgid "received more data chunks than requested" +msgstr "tog emot fler datastycken än efterfrågat" + +#: libpq_source.c:509 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "oväntad resultatmängdstorlek vid hämtning av externa filer" -#: libpq_fetch.c:302 +#: libpq_source.c:515 #, c-format msgid "unexpected data types in result set while fetching remote files: %u %u %u" msgstr "oväntade datayper i resultatmängd vid hämtning av externa filer: %u %u %u" -#: libpq_fetch.c:310 +#: libpq_source.c:523 #, c-format msgid "unexpected result format while fetching remote files" msgstr "oväntat resultatformat vid hämtning av externa filer" -#: libpq_fetch.c:316 +#: libpq_source.c:529 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "oväntade null-värden i resultat vid hämtning av externa filer" -#: libpq_fetch.c:320 +#: libpq_source.c:533 #, c-format msgid "unexpected result length while fetching remote files" msgstr "oväntad resultatlängd vid hämtning av externa filer" -#: libpq_fetch.c:381 +#: libpq_source.c:566 +#, c-format +msgid "received data for file \"%s\", when requested for \"%s\"" +msgstr "fick data för filen \"%s\", men efterfrågade för \"%s\"" + +#: libpq_source.c:570 +#, c-format +msgid "received data at offset %lld of file \"%s\", when requested for offset %lld" +msgstr "fick data från offset %lld i fil \"%s\", men efterfrågade offset %lld" + +#: libpq_source.c:582 +#, c-format +msgid "received more than requested for file \"%s\"" +msgstr "tog emot mer än efterfrågat för filen \"%s\"" + +#: libpq_source.c:595 +#, c-format +msgid "unexpected number of data chunks received" +msgstr "oväntat antal datastycken togs emot" + +#: libpq_source.c:638 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "kunde inte hämta extern fil \"%s\": %s" -#: libpq_fetch.c:386 +#: libpq_source.c:643 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "oväntat resultatmängd vid hämtning av extern fil \"%s\"" -#: libpq_fetch.c:430 +#: local_source.c:90 local_source.c:142 +#, c-format +msgid "could not open source file \"%s\": %m" +msgstr "kunde inte öppna källfil \"%s\": %m" + +#: local_source.c:117 #, c-format -msgid "could not send COPY data: %s" -msgstr "kunde inte skicka COPY-data: %s" +msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied" +msgstr "storleken på källfilen \"%s\" ändrades under körning: %d byte förväntades, %d kopierades" -#: libpq_fetch.c:459 +#: local_source.c:121 local_source.c:172 #, c-format -msgid "could not send file list: %s" -msgstr "kunde inte skicka fillista: %s" +msgid "could not close file \"%s\": %m" +msgstr "kunde inte stänga fil \"%s\": %m" -#: libpq_fetch.c:501 +#: local_source.c:146 #, c-format -msgid "could not send end-of-COPY: %s" -msgstr "kunde inte skicka slut-på-COPY: %s" +msgid "could not seek in source file: %m" +msgstr "kunde inte söka i källfil: %m" + +#: local_source.c:165 +#, c-format +msgid "unexpected EOF while reading file \"%s\"" +msgstr "oväntad EOF under läsning av fil \"%s\"" -#: libpq_fetch.c:507 +#: parsexlog.c:80 parsexlog.c:140 parsexlog.c:200 #, c-format -msgid "unexpected result while sending file list: %s" -msgstr "oväntat resultat vid skickande av fillista: %s" +msgid "out of memory while allocating a WAL reading processor" +msgstr "slut på minne vid allokering av en WAL-läs-processor" -#: parsexlog.c:85 parsexlog.c:132 +#: parsexlog.c:92 parsexlog.c:147 #, c-format msgid "could not read WAL record at %X/%X: %s" msgstr "kunde inte läsa WAL-post vid %X/%X: %s" -#: parsexlog.c:89 parsexlog.c:135 +#: parsexlog.c:96 parsexlog.c:150 #, c-format msgid "could not read WAL record at %X/%X" msgstr "kunde inte läsa WAL-post vid %X/%X" -#: parsexlog.c:198 +#: parsexlog.c:109 +#, c-format +msgid "end pointer %X/%X is not a valid end point; expected %X/%X" +msgstr "slutpekare %X/%X är inte en giltig slutposition; förväntade %X/%X" + +#: parsexlog.c:213 #, c-format msgid "could not find previous WAL record at %X/%X: %s" msgstr "kunde inte hitta föregående WAL-post vid %X/%X: %s" -#: parsexlog.c:202 +#: parsexlog.c:217 #, c-format msgid "could not find previous WAL record at %X/%X" msgstr "kunde inte hitta förgående WAL-post vid %X/%X" -#: parsexlog.c:327 +#: parsexlog.c:342 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "kunde inte söka (seek) i fil \"%s\": %m" -#: parsexlog.c:407 +#: parsexlog.c:441 #, c-format -msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmgr: %s, info: %02X" -msgstr "WAL-post modifierar en relation, men posttypen känns inte igen: lsn: %X/%X, rmgr: %s, info: %02X" +msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" +msgstr "WAL-post modifierar en relation, men posttypen känns inte igen: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" -#: pg_rewind.c:78 +#: pg_rewind.c:86 #, c-format msgid "" "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" @@ -455,7 +474,7 @@ msgstr "" "%s resynkroniserar ett PostgreSQL-kluster med en annan kopia av klustret.\n" "\n" -#: pg_rewind.c:79 +#: pg_rewind.c:87 #, c-format msgid "" "Usage:\n" @@ -466,12 +485,12 @@ msgstr "" " %s [FLAGGA]...\n" "\n" -#: pg_rewind.c:80 +#: pg_rewind.c:88 #, c-format msgid "Options:\n" msgstr "Flaggor:\n" -#: pg_rewind.c:81 +#: pg_rewind.c:89 #, c-format msgid "" " -c, --restore-target-wal use restore_command in target configuration to\n" @@ -480,27 +499,27 @@ msgstr "" " -c, --restore-target-wal använd restore_command i målkonfigurationen\n" " för att hämta WAL-filer från arkiv\n" -#: pg_rewind.c:83 +#: pg_rewind.c:91 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr " -D, --target-pgdata=KATALOG existerande datakatalog att modifiera\n" -#: pg_rewind.c:84 +#: pg_rewind.c:92 #, c-format msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" msgstr " --source-pgdata=KATALOG källdatakatalog att synkronisera med\n" -#: pg_rewind.c:85 +#: pg_rewind.c:93 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr " --source-server=ANSLSTR källserver att synkronisera med\n" -#: pg_rewind.c:86 +#: pg_rewind.c:94 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr " -n, --dry-run stoppa innan något modifieras\n" -#: pg_rewind.c:87 +#: pg_rewind.c:95 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written\n" @@ -509,12 +528,12 @@ msgstr "" " -N, --no-sync vänta inte på att ändingar säkert\n" " skrivits till disk\n" -#: pg_rewind.c:89 +#: pg_rewind.c:97 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress skriv ut förloppmeddelanden\n" -#: pg_rewind.c:90 +#: pg_rewind.c:98 #, c-format msgid "" " -R, --write-recovery-conf write configuration for replication\n" @@ -524,27 +543,36 @@ msgstr "" " skriv konfiguration för replikering\n" " (kräver --source-server)\n" -#: pg_rewind.c:92 +#: pg_rewind.c:100 +#, c-format +msgid "" +" --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" +msgstr "" +" --config-file=FILNAMN använd angiven serverkonfiguration när\n" +" målklustret körs\n" + +#: pg_rewind.c:102 #, c-format msgid " --debug write a lot of debug messages\n" msgstr " --debug skriv ut en massa debugmeddelanden\n" -#: pg_rewind.c:93 +#: pg_rewind.c:103 #, c-format msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" msgstr " --no-ensure-shutdown ingen automatisk hantering av trasig nedstängning\n" -#: pg_rewind.c:94 +#: pg_rewind.c:104 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version skriv ut versioninformation och avsluta sedan\n" -#: pg_rewind.c:95 +#: pg_rewind.c:105 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp och avsluta sedan\n" -#: pg_rewind.c:96 +#: pg_rewind.c:106 #, c-format msgid "" "\n" @@ -553,212 +581,225 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_rewind.c:97 +#: pg_rewind.c:107 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_rewind.c:159 pg_rewind.c:208 pg_rewind.c:215 pg_rewind.c:222 -#: pg_rewind.c:229 pg_rewind.c:237 +#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237 +#: pg_rewind.c:244 pg_rewind.c:252 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Försök med \"%s --help\" för mer information.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." -#: pg_rewind.c:207 +#: pg_rewind.c:222 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "ingen källa angavs (--source-pgdata eller --source-server)" -#: pg_rewind.c:214 +#: pg_rewind.c:229 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "bara en av --source-pgdata och --source-server får anges" -#: pg_rewind.c:221 +#: pg_rewind.c:236 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "ingen måldatakatalog angiven (--target-pgdata)" -#: pg_rewind.c:228 +#: pg_rewind.c:243 #, c-format msgid "no source server information (--source-server) specified for --write-recovery-conf" msgstr "ingen källserverinformation (--source-server) angiven för --write-recovery-conf" -#: pg_rewind.c:235 +#: pg_rewind.c:250 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för många kommandoradsargument (första är \"%s\")" -#: pg_rewind.c:250 +#: pg_rewind.c:265 #, c-format msgid "cannot be executed by \"root\"" msgstr "kan inte köras av \"root\"" -#: pg_rewind.c:251 +#: pg_rewind.c:266 #, c-format -msgid "You must run %s as the PostgreSQL superuser.\n" -msgstr "Du måste köra %s som PostgreSQL:s superanvändare.\n" +msgid "You must run %s as the PostgreSQL superuser." +msgstr "Du måste köra %s som PostgreSQL:s superuser." -#: pg_rewind.c:262 +#: pg_rewind.c:276 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "kunde inte läsa rättigheter på katalog \"%s\": %m" -#: pg_rewind.c:316 +#: pg_rewind.c:294 +#, c-format +msgid "%s" +msgstr "%s" + +#: pg_rewind.c:297 +#, c-format +msgid "connected to server" +msgstr "ansluten till server" + +#: pg_rewind.c:344 #, c-format msgid "source and target cluster are on the same timeline" msgstr "källa och målkluster är på samma tidslinje" -#: pg_rewind.c:322 +#: pg_rewind.c:353 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "servrarna divergerade vid WAL-position %X/%X på tidslinje %u" -#: pg_rewind.c:360 +#: pg_rewind.c:401 #, c-format msgid "no rewind required" msgstr "ingen rewind krävs" -#: pg_rewind.c:369 +#: pg_rewind.c:410 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "rewind från senaste gemensamma checkpoint vid %X/%X på tidslinje %u" -#: pg_rewind.c:378 +#: pg_rewind.c:420 #, c-format msgid "reading source file list" msgstr "läser källfillista" -#: pg_rewind.c:381 +#: pg_rewind.c:424 #, c-format msgid "reading target file list" msgstr "läser målfillista" -#: pg_rewind.c:392 +#: pg_rewind.c:433 #, c-format msgid "reading WAL in target" msgstr "läser WAL i målet" -#: pg_rewind.c:409 +#: pg_rewind.c:454 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "behöver kopiera %lu MB (total källkatalogstorlek är %lu MB)" -#: pg_rewind.c:427 -#, c-format -msgid "creating backup label and updating control file" -msgstr "skapar backupetikett och uppdaterar kontrollfil" - -#: pg_rewind.c:457 +#: pg_rewind.c:472 #, c-format msgid "syncing target data directory" msgstr "synkar måldatakatalog" -#: pg_rewind.c:464 +#: pg_rewind.c:488 #, c-format msgid "Done!" msgstr "Klar!" -#: pg_rewind.c:476 +#: pg_rewind.c:568 +#, c-format +msgid "no action decided for file \"%s\"" +msgstr "ingen åtgärd beslutades för filen \"%s\"" + +#: pg_rewind.c:600 +#, c-format +msgid "source system was modified while pg_rewind was running" +msgstr "källsystemet ändrades samtidigt som pg_rewind kördes" + +#: pg_rewind.c:604 +#, c-format +msgid "creating backup label and updating control file" +msgstr "skapar backupetikett och uppdaterar kontrollfil" + +#: pg_rewind.c:654 +#, c-format +msgid "source system was in unexpected state at end of rewind" +msgstr "källsystemet var i ett oväntat tillstånd vid slutet av återspolningen" + +#: pg_rewind.c:685 #, c-format msgid "source and target clusters are from different systems" msgstr "källa och målkluster är från olika system" -#: pg_rewind.c:484 +#: pg_rewind.c:693 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "klustren är inte kompatibla med denna version av pg_rewind" -#: pg_rewind.c:494 +#: pg_rewind.c:703 #, c-format msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" msgstr "målservern behöver använda antingen datachecksums eller \"wal_log_hints = on\"" -#: pg_rewind.c:505 +#: pg_rewind.c:714 #, c-format msgid "target server must be shut down cleanly" msgstr "målserver måste stängas ner utan fel" -#: pg_rewind.c:515 +#: pg_rewind.c:724 #, c-format msgid "source data directory must be shut down cleanly" msgstr "måldatakatalog måste stängas ner utan fel" -#: pg_rewind.c:567 +#: pg_rewind.c:771 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s kB (%d%%) kopierad" -#: pg_rewind.c:630 +#: pg_rewind.c:834 #, c-format msgid "invalid control file" msgstr "ogiltig kontrollfil" -#: pg_rewind.c:714 +#: pg_rewind.c:918 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "kunde inte finna en gemensam anfader av källa och målklusterets tidslinjer" -#: pg_rewind.c:755 +#: pg_rewind.c:959 #, c-format msgid "backup label buffer too small" msgstr "backupetikett-buffer för liten" -#: pg_rewind.c:778 +#: pg_rewind.c:982 #, c-format msgid "unexpected control file CRC" msgstr "oväntad kontrollfil-CRC" -#: pg_rewind.c:788 +#: pg_rewind.c:994 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "oväntad kontrollfilstorlek %d, förväntade %d" -#: pg_rewind.c:797 +#: pg_rewind.c:1003 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" msgstr[0] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men kontrollfilen anger %d byte" msgstr[1] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men kontrollfilen anger %d byte" -#: pg_rewind.c:854 pg_rewind.c:912 +#: pg_rewind.c:1042 pg_rewind.c:1112 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"Programmet \"%s\" behövs av %s men hittades inte i samma\n" -"katalog som \"%s\".\n" -"Kontrollera din installation." +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\"" -#: pg_rewind.c:859 pg_rewind.c:917 +#: pg_rewind.c:1045 pg_rewind.c:1115 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"Programmet \"%s\" hittades av \"%s\"\n" -"men är inte av samma version som %s.\n" -"Kontrollera din installation." +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s" -#: pg_rewind.c:880 +#: pg_rewind.c:1078 #, c-format msgid "restore_command is not set in the target cluster" msgstr "restore_command är inte satt i målklustret" -#: pg_rewind.c:923 +#: pg_rewind.c:1119 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "kör \"%s\" för målservern för att slutföra krashåterställning" -#: pg_rewind.c:943 +#: pg_rewind.c:1156 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "postgres enanvändarläge misslyckades i målklustret" -#: pg_rewind.c:944 +#: pg_rewind.c:1157 #, c-format msgid "Command was: %s" msgstr "Kommandot var: %s" @@ -798,176 +839,169 @@ msgstr "ogiltig data i historikfil" msgid "Timeline IDs must be less than child timeline's ID." msgstr "Tidslinje-ID:er måste vara mindre än barnens tidslinje-ID:er." -#: xlogreader.c:349 +#: xlogreader.c:621 #, c-format msgid "invalid record offset at %X/%X" msgstr "ogiltig postoffset vid %X/%X" -#: xlogreader.c:357 +#: xlogreader.c:629 #, c-format msgid "contrecord is requested by %X/%X" msgstr "contrecord är begärd vid %X/%X" -#: xlogreader.c:398 xlogreader.c:695 +#: xlogreader.c:670 xlogreader.c:1102 #, c-format msgid "invalid record length at %X/%X: wanted %u, got %u" msgstr "ogiltig postlängd vid %X/%X: förväntade %u, fick %u" -#: xlogreader.c:422 +#: xlogreader.c:699 +#, c-format +msgid "out of memory while trying to decode a record of length %u" +msgstr "slut på minne vid avkodning av post med längden %u" + +#: xlogreader.c:721 #, c-format msgid "record length %u at %X/%X too long" msgstr "postlängd %u vid %X/%X är för lång" -#: xlogreader.c:454 +#: xlogreader.c:770 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "det finns ingen contrecord-flagga vid %X/%X" -#: xlogreader.c:467 +#: xlogreader.c:783 #, c-format -msgid "invalid contrecord length %u at %X/%X" -msgstr "ogiltig contrecord-längd %u vid %X/%X" +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "ogiltig contrecord-längd %u (förväntade %lld) vid %X/%X" -#: xlogreader.c:703 +#: xlogreader.c:1110 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ogiltigt resurshanterar-ID %u vid %X/%X" -#: xlogreader.c:717 xlogreader.c:734 +#: xlogreader.c:1123 xlogreader.c:1139 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "post med inkorrekt prev-link %X/%X vid %X/%X" -#: xlogreader.c:771 +#: xlogreader.c:1175 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "felaktig resurshanterardatakontrollsumma i post vid %X/%X" -#: xlogreader.c:808 +#: xlogreader.c:1212 #, c-format msgid "invalid magic number %04X in log segment %s, offset %u" msgstr "felaktigt magiskt nummer %04X i loggsegment %s, offset %u" -#: xlogreader.c:822 xlogreader.c:863 +#: xlogreader.c:1226 xlogreader.c:1267 #, c-format msgid "invalid info bits %04X in log segment %s, offset %u" msgstr "ogiltiga infobitar %04X i loggsegment %s, offset %u" -#: xlogreader.c:837 +#: xlogreader.c:1241 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL-fil är från ett annat databassystem: WAL-filens databassystemidentifierare är %llu, pg_control databassystemidentifierare är %llu" -#: xlogreader.c:845 +#: xlogreader.c:1249 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL-fil är från ett annat databassystem: inkorrekt segmentstorlek i sidhuvud" -#: xlogreader.c:851 +#: xlogreader.c:1255 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL-fil är från ett annat databassystem: inkorrekt XLOG_BLCKSZ i sidhuvud" -#: xlogreader.c:882 +#: xlogreader.c:1286 #, c-format msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" msgstr "oväntad sidadress %X/%X i loggsegment %s, offset %u" -#: xlogreader.c:907 +#: xlogreader.c:1311 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" msgstr "ej-i-sekvens för tidslinje-ID %u (efter %u) i loggsegment %s, offset %u" -#: xlogreader.c:1247 +#: xlogreader.c:1706 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "ej-i-sekvens block_id %u vid %X/%X" -#: xlogreader.c:1270 +#: xlogreader.c:1730 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA satt, men ingen data inkluderad vid %X/%X" -#: xlogreader.c:1277 +#: xlogreader.c:1737 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA ej satt, men datalängd är %u vid %X/%X" -#: xlogreader.c:1313 +#: xlogreader.c:1773 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE satt, men håloffset %u längd %u block-image-längd %u vid %X/%X" -#: xlogreader.c:1329 +#: xlogreader.c:1789 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE ej satt, men håloffset %u längd %u vid %X/%X" -#: xlogreader.c:1344 +#: xlogreader.c:1803 #, c-format -msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" -msgstr "BKPIMAGE_IS_COMPRESSED satt, men block-image-längd %u vid %X/%X" +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSED satt, men blockavbildlängd %u vid %X/%X" -#: xlogreader.c:1359 +#: xlogreader.c:1818 #, c-format -msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" -msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_IS_COMPRESSED satt, men block-image-längd är %u vid %X/%X" +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_COMPRESSED satt, men blockavbildlängd är %u vid %X/%X" -#: xlogreader.c:1375 +#: xlogreader.c:1834 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL satt men ingen tidigare rel vid %X/%X" -#: xlogreader.c:1387 +#: xlogreader.c:1846 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ogiltig block_id %u vid %X/%X" -#: xlogreader.c:1476 +#: xlogreader.c:1913 #, c-format msgid "record with invalid length at %X/%X" msgstr "post med ogiltig längd vid %X/%X" -#: xlogreader.c:1565 +#: xlogreader.c:1938 +#, c-format +msgid "failed to locate backup block with ID %d in WAL record" +msgstr "misslyckades med att hitta backupblock med ID %d i WAL-post" + +#: xlogreader.c:2044 xlogreader.c:2061 +#, c-format +msgid "image at %X/%X compressed with %s not supported by build, block %d" +msgstr "avbild vid %X/%X komprimerade med %s stöds inte av bygget, block %d" + +#: xlogreader.c:2070 +#, c-format +msgid "image at %X/%X compressed with unknown method, block %d" +msgstr "avbild vid %X/%X komprimerad med okänd metod, block %d" + +#: xlogreader.c:2078 #, c-format msgid "invalid compressed image at %X/%X, block %d" -msgstr "ogiltig komprimerad image vid %X/%X, block %d" - -#~ msgid "could not load advapi32.dll: error code %lu" -#~ msgstr "kunde inte ladda advapi32.dll: felkod %lu" - -#~ msgid "" -#~ "The program \"%s\" was found by \"%s\" but was\n" -#~ "not the same version as %s.\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Programmet \"%s\" hittades av \"%s\"\n" -#~ "men är inte av samma version som %s.\n" -#~ "Kontrollera din installation." - -#~ msgid "" -#~ "The program \"%s\" is needed by %s but was\n" -#~ "not found in the same directory as \"%s\".\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Programmet \"%s\" behövs av %s men hittades inte i samma\n" -#~ "katalog som \"%s\".\n" -#~ "Kontrollera din installation." - -#~ msgid "" -#~ "The program \"postgres\" was found by \"%s\"\n" -#~ "but was not the same version as %s.\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Programmet \"postgres\" hittades av \"%s\",\n" -#~ "men det är inte byggt i samma version som %s.\n" -#~ "Kontrollera din installation." - -#~ msgid "" -#~ "The program \"postgres\" is needed by %s but was not found in the\n" -#~ "same directory as \"%s\".\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Programmet \"postgres\" behövs av %s men kunde inte hittas\n" -#~ "i samma katalog som \"%s\".\n" -#~ "Kontrollera din installation." +msgstr "ogiltig komprimerad avbild vid %X/%X, block %d" + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Försök med \"%s --help\" för mer information.\n" + +#, c-format +#~ msgid "You must run %s as the PostgreSQL superuser.\n" +#~ msgstr "Du måste köra %s som PostgreSQL:s superuser.\n" + +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatalt: " diff --git a/src/bin/pg_rewind/po/uk.po b/src/bin/pg_rewind/po/uk.po index 841576cec1..1b98dfc5da 100644 --- a/src/bin/pg_rewind/po/uk.po +++ b/src/bin/pg_rewind/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:17+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" +"POT-Creation-Date: 2021-06-10 08:49+0000\n" +"PO-Revision-Date: 2021-08-17 13:31+0200\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,20 +14,21 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/pg_rewind.pot\n" -"X-Crowdin-File-ID: 504\n" +"X-Crowdin-File: /REL_14_DEV/pg_rewind.pot\n" +"X-Crowdin-File-ID: 738\n" +"X-Generator: Poedit 3.0\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "збій: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "помилка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "попередження: " @@ -90,15 +91,15 @@ msgstr "не вдалося використати restore_command із запо #: ../../fe_utils/archive.c:74 #, c-format -msgid "unexpected file size for \"%s\": %lu instead of %lu" -msgstr "неочікуваний розмір файлу для \"%s\": %lu замість %lu" +msgid "unexpected file size for \"%s\": %lld instead of %lld" +msgstr "неочікуваний розмір файлу для \"%s\": %lld замість %lld" #: ../../fe_utils/archive.c:85 #, c-format msgid "could not open file \"%s\" restored from archive: %m" msgstr "не вдалося відкрити файл \"%s\" відновлений з архіву: %m" -#: ../../fe_utils/archive.c:97 copy_fetch.c:88 filemap.c:208 +#: ../../fe_utils/archive.c:97 file_ops.c:417 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не вдалося отримати інформацію від файлу \"%s\": %m" @@ -115,13 +116,13 @@ msgstr "не вдалося відновити файл \"%s\" з архіву" #: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49 #: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100 -#: ../../fe_utils/recovery_gen.c:171 parsexlog.c:73 parsexlog.c:125 -#: parsexlog.c:185 +#: ../../fe_utils/recovery_gen.c:171 parsexlog.c:77 parsexlog.c:135 +#: parsexlog.c:195 #, c-format msgid "out of memory" msgstr "недостатньо пам'яті" -#: ../../fe_utils/recovery_gen.c:134 parsexlog.c:298 +#: ../../fe_utils/recovery_gen.c:134 parsexlog.c:308 #, c-format msgid "could not open file \"%s\": %m" msgstr "не можливо відкрити файл \"%s\": %m" @@ -136,567 +137,607 @@ msgstr "неможливо записати до файлу \"%s\": %m" msgid "could not create file \"%s\": %m" msgstr "неможливо створити файл \"%s\": %m" -#: copy_fetch.c:59 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "не вдалося відкрити каталог \"%s\": %m" - -#: copy_fetch.c:117 -#, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "не можливо прочитати символічне послання \"%s\": %m" - -#: copy_fetch.c:120 -#, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "таргет символічного посилання \"%s\" задовгий" - -#: copy_fetch.c:135 -#, c-format -msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform" -msgstr "\"%s\"є символічним посиланням, але символічні посилання не підтримуються на даній платформі" - -#: copy_fetch.c:142 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "не вдалося прочитати каталог \"%s\": %m" - -#: copy_fetch.c:146 -#, c-format -msgid "could not close directory \"%s\": %m" -msgstr "не вдалося закрити каталог \"%s\": %m" - -#: copy_fetch.c:166 -#, c-format -msgid "could not open source file \"%s\": %m" -msgstr "не вдалося відкрити вихідний файл \"%s\": %m" - -#: copy_fetch.c:170 -#, c-format -msgid "could not seek in source file: %m" -msgstr "не вдалося знайти у вихідному файлі: %m" - -#: copy_fetch.c:187 file_ops.c:311 parsexlog.c:336 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "не вдалося прочитати файл \"%s\": %m" - -#: copy_fetch.c:190 -#, c-format -msgid "unexpected EOF while reading file \"%s\"" -msgstr "неочікуваний кінець при читанні файлу \"%s\"" - -#: copy_fetch.c:197 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "неможливо закрити файл \"%s\": %m" - -#: file_ops.c:62 +#: file_ops.c:67 #, c-format msgid "could not open target file \"%s\": %m" msgstr "не вдалося відкрити цільовий файл \"%s\": %m" -#: file_ops.c:76 +#: file_ops.c:81 #, c-format msgid "could not close target file \"%s\": %m" msgstr "не вдалося закрити цільовий файл \"%s\": %m" -#: file_ops.c:96 +#: file_ops.c:101 #, c-format msgid "could not seek in target file \"%s\": %m" msgstr "не вдалося знайти в цільовому файлі \"%s\": %m" -#: file_ops.c:112 +#: file_ops.c:117 #, c-format msgid "could not write file \"%s\": %m" msgstr "не вдалося записати файл \"%s\": %m" -#: file_ops.c:162 +#: file_ops.c:150 file_ops.c:177 +#, c-format +msgid "undefined file type for \"%s\"" +msgstr "невизначений тип файлу для \"%s\"" + +#: file_ops.c:173 #, c-format msgid "invalid action (CREATE) for regular file" msgstr "неприпустима дія (CREATE) для звичайного файлу" -#: file_ops.c:185 +#: file_ops.c:200 #, c-format msgid "could not remove file \"%s\": %m" msgstr "не можливо видалити файл \"%s\": %m" -#: file_ops.c:203 +#: file_ops.c:218 #, c-format msgid "could not open file \"%s\" for truncation: %m" msgstr "не вдалося відкрити файл \"%s\" для скорочення: %m" -#: file_ops.c:207 +#: file_ops.c:222 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "не вдалося скоротити файл \"%s\" до потрібного розміру %u: %m" -#: file_ops.c:223 +#: file_ops.c:238 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не вдалося створити каталог \"%s\": %m" -#: file_ops.c:237 +#: file_ops.c:252 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "не вдалося видалити каталог \"%s\": %m" -#: file_ops.c:251 +#: file_ops.c:266 #, c-format msgid "could not create symbolic link at \"%s\": %m" msgstr "неможливо створити символічне послання на \"%s\": %m" -#: file_ops.c:265 +#: file_ops.c:280 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "не вдалося видалити символьне посилання \"%s\": %m" -#: file_ops.c:296 file_ops.c:300 +#: file_ops.c:326 file_ops.c:330 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не вдалося відкрити файл \"%s\" для читання: %m" -#: file_ops.c:314 parsexlog.c:338 +#: file_ops.c:341 local_source.c:107 parsexlog.c:346 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не вдалося прочитати файл \"%s\": %m" + +#: file_ops.c:344 parsexlog.c:348 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "не вдалося прочитати файл \"%s\": прочитано %d з %zu" -#: filemap.c:200 +#: file_ops.c:388 #, c-format -msgid "data file \"%s\" in source is not a regular file" -msgstr "файл даних \"%s\" в джерелі не є регулярним файлом" +msgid "could not open directory \"%s\": %m" +msgstr "не вдалося відкрити каталог \"%s\": %m" + +#: file_ops.c:446 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "не можливо прочитати символічне послання \"%s\": %m" -#: filemap.c:222 +#: file_ops.c:449 #, c-format -msgid "\"%s\" is not a directory" -msgstr "\"%s\" не є каталогом" +msgid "symbolic link \"%s\" target is too long" +msgstr "таргет символічного посилання \"%s\" задовгий" -#: filemap.c:245 +#: file_ops.c:464 #, c-format -msgid "\"%s\" is not a symbolic link" -msgstr "\"%s\" не є символічним посиланням" +msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform" +msgstr "\"%s\"є символічним посиланням, але символічні посилання не підтримуються на даній платформі" -#: filemap.c:257 +#: file_ops.c:471 #, c-format -msgid "\"%s\" is not a regular file" -msgstr "\"%s\" не є регулярним файлом" +msgid "could not read directory \"%s\": %m" +msgstr "не вдалося прочитати каталог \"%s\": %m" -#: filemap.c:369 +#: file_ops.c:475 #, c-format -msgid "source file list is empty" -msgstr "список файлів в джерелі порожній" +msgid "could not close directory \"%s\": %m" +msgstr "не вдалося закрити каталог \"%s\": %m" -#: filemap.c:484 +#: filemap.c:237 #, c-format -msgid "unexpected page modification for directory or symbolic link \"%s\"" -msgstr "неочікувана модифікація сторінки для каталогу або символічного посилання \"%s\"" +msgid "data file \"%s\" in source is not a regular file" +msgstr "файл даних \"%s\" в джерелі не є регулярним файлом" -#: libpq_fetch.c:50 +#: filemap.c:242 filemap.c:275 #, c-format -msgid "could not connect to server: %s" -msgstr "не вдалося підключитися до сервера: %s" +msgid "duplicate source file \"%s\"" +msgstr "дублікат вихідного файлу \"%s\"" -#: libpq_fetch.c:54 +#: filemap.c:330 #, c-format -msgid "connected to server" -msgstr "під'єднано до серверу" +msgid "unexpected page modification for non-regular file \"%s\"" +msgstr "неочікувана модифікація сторінки для нерегулярного файлу \"%s\"" -#: libpq_fetch.c:63 +#: filemap.c:680 filemap.c:774 #, c-format -msgid "could not clear search_path: %s" -msgstr "не вдалося очистити search_path: %s" +msgid "unknown file type for \"%s\"" +msgstr "невідомий тип файлу для \"%s\"" -#: libpq_fetch.c:75 +#: filemap.c:707 #, c-format -msgid "source server must not be in recovery mode" -msgstr "початковий сервер не повинен бути у стані відновлення" +msgid "file \"%s\" is of different type in source and target" +msgstr "файл \"%s\" має різні типи у джерелі та цілі" + +#: filemap.c:779 +#, c-format +msgid "could not decide what to do with file \"%s\"" +msgstr "не вдалося вирішити, що робити з файлом \"%s\"" + +#: libpq_source.c:128 +#, c-format +msgid "could not clear search_path: %s" +msgstr "не вдалося очистити search_path: %s" -#: libpq_fetch.c:85 +#: libpq_source.c:139 #, c-format msgid "full_page_writes must be enabled in the source server" msgstr "на початковому сервері повинно бути увімкнено full_page_writes" -#: libpq_fetch.c:111 +#: libpq_source.c:150 +#, c-format +msgid "could not prepare statement to fetch file contents: %s" +msgstr "не вдалося підготувати інструкцію щоб отримати вміст файлу: %s" + +#: libpq_source.c:169 #, c-format msgid "error running query (%s) on source server: %s" msgstr "помилка при виконанні запиту (%s) на вихідному сервері: %s" -#: libpq_fetch.c:116 +#: libpq_source.c:174 #, c-format msgid "unexpected result set from query" msgstr "неочікуваний результат запиту" -#: libpq_fetch.c:137 +#: libpq_source.c:196 #, c-format msgid "error running query (%s) in source server: %s" msgstr "помилка при виконанні запиту (%s) на початковому сервері: %s" -#: libpq_fetch.c:157 +#: libpq_source.c:217 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "нерозпізнаний результат \"%s\" замість поточної добавленої позиції WAL" -#: libpq_fetch.c:207 +#: libpq_source.c:268 #, c-format msgid "could not fetch file list: %s" msgstr "не вдалося отримати список файлів: %s" -#: libpq_fetch.c:212 +#: libpq_source.c:273 #, c-format msgid "unexpected result set while fetching file list" msgstr "неочікуваний результат при отриманні списку файлів" -#: libpq_fetch.c:265 +#: libpq_source.c:435 #, c-format msgid "could not send query: %s" msgstr "не вдалося надіслати запит: %s" -#: libpq_fetch.c:270 +#: libpq_source.c:438 #, c-format msgid "could not set libpq connection to single row mode" msgstr "не вдалося встановити libpq з'єднання для однорядкового режиму" -#: libpq_fetch.c:290 +#: libpq_source.c:468 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "неочікуваний результат при отриманні віддалених файлів: %s" -#: libpq_fetch.c:296 +#: libpq_source.c:473 +#, c-format +msgid "received more data chunks than requested" +msgstr "отримано більше фрагментів даних, ніж запитувалось" + +#: libpq_source.c:477 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "неочікуваний розмір набору результатів при отриманні віддалених файлів" -#: libpq_fetch.c:302 +#: libpq_source.c:483 #, c-format msgid "unexpected data types in result set while fetching remote files: %u %u %u" msgstr "неочікувані типи даних в результаті при отриманні віддалених файлів: %u %u %u" -#: libpq_fetch.c:310 +#: libpq_source.c:491 #, c-format msgid "unexpected result format while fetching remote files" msgstr "неочікуваний формат результату при отриманні віддалених файлів" -#: libpq_fetch.c:316 +#: libpq_source.c:497 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "неочікувані нульові значення в результаті при отриманні віддалених файлів" -#: libpq_fetch.c:320 +#: libpq_source.c:501 #, c-format msgid "unexpected result length while fetching remote files" msgstr "неочікувана довжина результату при отриманні віддалених файлів" -#: libpq_fetch.c:381 +#: libpq_source.c:534 +#, c-format +msgid "received data for file \"%s\", when requested for \"%s\"" +msgstr "отримані дані для файлу \"%s\", коли запитувалось для \"%s\"" + +#: libpq_source.c:538 +#, c-format +msgid "received data at offset %lld of file \"%s\", when requested for offset %lld" +msgstr "отримано дані по зсуву %lld файлу \"%s\", коли запитувалось про зсув %lld" + +#: libpq_source.c:550 +#, c-format +msgid "received more than requested for file \"%s\"" +msgstr "отримано більше, ніж запитувалось для файлу \"%s\"" + +#: libpq_source.c:563 +#, c-format +msgid "unexpected number of data chunks received" +msgstr "отримано неочікувану кількість фрагментів даних" + +#: libpq_source.c:606 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "не вдалося отримати віддалений файл \"%s\": %s" -#: libpq_fetch.c:386 +#: libpq_source.c:611 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "неочікуваний набір результатів при отриманні віддаленого файлу \"%s\"" -#: libpq_fetch.c:430 +#: local_source.c:86 #, c-format -msgid "could not send COPY data: %s" -msgstr "не вдалося надіслати дані COPY: %s" +msgid "could not open source file \"%s\": %m" +msgstr "не вдалося відкрити вихідний файл \"%s\": %m" -#: libpq_fetch.c:459 +#: local_source.c:90 #, c-format -msgid "could not send file list: %s" -msgstr "не вдалося надіслати список файлів: %s" +msgid "could not seek in source file: %m" +msgstr "не вдалося знайти у вихідному файлі: %m" -#: libpq_fetch.c:501 +#: local_source.c:109 #, c-format -msgid "could not send end-of-COPY: %s" -msgstr "не вдалося надіслати сповіщення про закінчення копіювання: %s" +msgid "unexpected EOF while reading file \"%s\"" +msgstr "неочікуваний кінець при читанні файлу \"%s\"" -#: libpq_fetch.c:507 +#: local_source.c:116 #, c-format -msgid "unexpected result while sending file list: %s" -msgstr "неочікуваний результат при надсиланні списку файлів: %s" +msgid "could not close file \"%s\": %m" +msgstr "неможливо закрити файл \"%s\": %m" -#: parsexlog.c:85 parsexlog.c:132 +#: parsexlog.c:89 parsexlog.c:142 #, c-format msgid "could not read WAL record at %X/%X: %s" msgstr "не вдалося прочитати запис WAL на %X/%X: %s" -#: parsexlog.c:89 parsexlog.c:135 +#: parsexlog.c:93 parsexlog.c:145 #, c-format msgid "could not read WAL record at %X/%X" msgstr "не вдалося прочитати запис WAL на %X/%X" -#: parsexlog.c:198 +#: parsexlog.c:208 #, c-format msgid "could not find previous WAL record at %X/%X: %s" msgstr "не вдалося знайти попередній запис WAL на %X/%X: %s" -#: parsexlog.c:202 +#: parsexlog.c:212 #, c-format msgid "could not find previous WAL record at %X/%X" msgstr "не вдалося знайти попередній запис WAL на %X/%X" -#: parsexlog.c:327 +#: parsexlog.c:337 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "не вдалося знайти в файлі \"%s\": %m" -#: parsexlog.c:407 +#: parsexlog.c:429 #, c-format msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmgr: %s, info: %02X" msgstr "WAL модифікує відношення, але тип запису не розпізнано: lsn: %X/%X, rmgr: %s, info: %02X" -#: pg_rewind.c:78 +#: pg_rewind.c:84 #, c-format -msgid "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n\n" -msgstr "%s синхронізує кластер PostgreSQL з іншою копією кластеру.\n\n" +msgid "" +"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" +"\n" +msgstr "" +"%s синхронізує кластер PostgreSQL з іншою копією кластеру.\n" +"\n" -#: pg_rewind.c:79 +#: pg_rewind.c:85 #, c-format -msgid "Usage:\n" -" %s [OPTION]...\n\n" -msgstr "Використання:\n" -" %s [OPTION]...\n\n" +msgid "" +"Usage:\n" +" %s [OPTION]...\n" +"\n" +msgstr "" +"Використання:\n" +" %s [OPTION]...\n" +"\n" -#: pg_rewind.c:80 +#: pg_rewind.c:86 #, c-format msgid "Options:\n" msgstr "Параметри:\n" -#: pg_rewind.c:81 +#: pg_rewind.c:87 #, c-format -msgid " -c, --restore-target-wal use restore_command in target configuration to\n" +msgid "" +" -c, --restore-target-wal use restore_command in target configuration to\n" " retrieve WAL files from archives\n" -msgstr " -c, --restore-target-wal використовує restore_command в цільовій конфігурації, щоб\n" +msgstr "" +" -c, --restore-target-wal використовує restore_command в цільовій конфігурації, щоб\n" " отримати файли WAL з архівів\n" -#: pg_rewind.c:83 +#: pg_rewind.c:89 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr " -D, --target-pgdata=DIRECTORY існуючий каталог для змін\n" -#: pg_rewind.c:84 +#: pg_rewind.c:90 #, c-format msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" msgstr " --source-pgdata=DIRECTORY початковий каталог даних для синхронізації\n" -#: pg_rewind.c:85 +#: pg_rewind.c:91 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr " --source-server=CONNSTR початковий сервер для синхронізації\n" -#: pg_rewind.c:86 +#: pg_rewind.c:92 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr " -n, --dry-run зупинитися до внесення будь-яких змін\n" -#: pg_rewind.c:87 +#: pg_rewind.c:93 #, c-format -msgid " -N, --no-sync do not wait for changes to be written\n" +msgid "" +" -N, --no-sync do not wait for changes to be written\n" " safely to disk\n" msgstr " -N, --no-sync не чекати поки зміни будуть записані на диск\n" -#: pg_rewind.c:89 +#: pg_rewind.c:95 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress повідомляти про хід процесу\n" -#: pg_rewind.c:90 +#: pg_rewind.c:96 #, c-format -msgid " -R, --write-recovery-conf write configuration for replication\n" +msgid "" +" -R, --write-recovery-conf write configuration for replication\n" " (requires --source-server)\n" -msgstr " -R, --write-recovery-conf записує конфігурацію для реплікації \n" +msgstr "" +" -R, --write-recovery-conf записує конфігурацію для реплікації \n" " (потребує --source-server)\n" -#: pg_rewind.c:92 +#: pg_rewind.c:98 #, c-format msgid " --debug write a lot of debug messages\n" msgstr " --debug виводити багато налагоджувальних повідомлень\n" -#: pg_rewind.c:93 +#: pg_rewind.c:99 #, c-format msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" msgstr " --no-ensure-shutdown не виправляти автоматично неочищене завершення роботи\n" -#: pg_rewind.c:94 +#: pg_rewind.c:100 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію і вийти\n" -#: pg_rewind.c:95 +#: pg_rewind.c:101 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати довідку, потім вийти\n" -#: pg_rewind.c:96 +#: pg_rewind.c:102 #, c-format -msgid "\n" +msgid "" +"\n" "Report bugs to <%s>.\n" -msgstr "\n" +msgstr "" +"\n" "Повідомляти про помилки на <%s>.\n" -#: pg_rewind.c:97 +#: pg_rewind.c:103 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" -#: pg_rewind.c:159 pg_rewind.c:208 pg_rewind.c:215 pg_rewind.c:222 -#: pg_rewind.c:229 pg_rewind.c:237 +#: pg_rewind.c:164 pg_rewind.c:213 pg_rewind.c:220 pg_rewind.c:227 +#: pg_rewind.c:234 pg_rewind.c:242 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" для отримання додаткової інформації.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" -#: pg_rewind.c:207 +#: pg_rewind.c:212 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "джерело не вказано (--source-pgdata чи --source-server)" -#: pg_rewind.c:214 +#: pg_rewind.c:219 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "може бути вказано лише --source-pgdata чи --source-server" -#: pg_rewind.c:221 +#: pg_rewind.c:226 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "не вказано жодного каталогу цільових даних (--target-pgdata)" -#: pg_rewind.c:228 +#: pg_rewind.c:233 #, c-format msgid "no source server information (--source-server) specified for --write-recovery-conf" msgstr "немає інформації про вихідний сервер (--source-server) вказаної для --write-recovery-conf" -#: pg_rewind.c:235 +#: pg_rewind.c:240 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному рядку (перший \"%s\")" -#: pg_rewind.c:250 +#: pg_rewind.c:255 #, c-format msgid "cannot be executed by \"root\"" msgstr "\"root\" не може це виконувати" -#: pg_rewind.c:251 +#: pg_rewind.c:256 #, c-format msgid "You must run %s as the PostgreSQL superuser.\n" msgstr "Запускати %s треба від суперкористувача PostgreSQL.\n" -#: pg_rewind.c:262 +#: pg_rewind.c:267 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "не вдалося прочитати дозволи на каталог \"%s\": %m" -#: pg_rewind.c:316 +#: pg_rewind.c:287 +#, c-format +msgid "%s" +msgstr "%s" + +#: pg_rewind.c:290 +#, c-format +msgid "connected to server" +msgstr "під'єднано до серверу" + +#: pg_rewind.c:337 #, c-format msgid "source and target cluster are on the same timeline" msgstr "початковий і цільовий кластери знаходяться на одній лінії часу" -#: pg_rewind.c:322 +#: pg_rewind.c:346 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "сервери розійшлись в позиції WAL %X/%X на лінії часу %u" -#: pg_rewind.c:360 +#: pg_rewind.c:394 #, c-format msgid "no rewind required" msgstr "перемотування не потрібне" -#: pg_rewind.c:369 +#: pg_rewind.c:403 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "перемотування від останньої спільної контрольної точки на %X/%X на лінії часу %u" -#: pg_rewind.c:378 +#: pg_rewind.c:413 #, c-format msgid "reading source file list" msgstr "читання списку файлів із джерела" -#: pg_rewind.c:381 +#: pg_rewind.c:417 #, c-format msgid "reading target file list" msgstr "читання списку цільових файлів" -#: pg_rewind.c:392 +#: pg_rewind.c:426 #, c-format msgid "reading WAL in target" msgstr "читання WAL у цілі" -#: pg_rewind.c:409 +#: pg_rewind.c:447 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "треба скопіювати %lu МБ (загальний розмір каталогу джерела становить %lu МБ)" -#: pg_rewind.c:427 -#, c-format -msgid "creating backup label and updating control file" -msgstr "створення мітки резервного копіювання і оновлення контрольного файлу" - -#: pg_rewind.c:457 +#: pg_rewind.c:465 #, c-format msgid "syncing target data directory" msgstr "синхронізація цільового каталогу даних" -#: pg_rewind.c:464 +#: pg_rewind.c:481 #, c-format msgid "Done!" msgstr "Готово!" -#: pg_rewind.c:476 +#: pg_rewind.c:564 +#, c-format +msgid "no action decided for file \"%s\"" +msgstr "жодних дій щодо файлу \"%s\" не прийнято" + +#: pg_rewind.c:596 +#, c-format +msgid "source system was modified while pg_rewind was running" +msgstr "вихідну систему було змінено під час роботи pg_rewind" + +#: pg_rewind.c:600 +#, c-format +msgid "creating backup label and updating control file" +msgstr "створення мітки резервного копіювання і оновлення контрольного файлу" + +#: pg_rewind.c:650 +#, c-format +msgid "source system was in unexpected state at end of rewind" +msgstr "вихідна система була в неочікуваному стані наприкінці перемотування" + +#: pg_rewind.c:681 #, c-format msgid "source and target clusters are from different systems" msgstr "початковий і цільовий кластер належать до різних систем" -#: pg_rewind.c:484 +#: pg_rewind.c:689 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "кластери не сумісні з даною версією pg_rewind" -#: pg_rewind.c:494 +#: pg_rewind.c:699 #, c-format msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" msgstr "цільовий сервер потребує використання контрольної суми даних або \"wal_log_hints = on\"" -#: pg_rewind.c:505 +#: pg_rewind.c:710 #, c-format msgid "target server must be shut down cleanly" msgstr "цільовий сервер повинен бути вимкненим штатно" -#: pg_rewind.c:515 +#: pg_rewind.c:720 #, c-format msgid "source data directory must be shut down cleanly" msgstr "робота з початковим каталогом даних повинна бути завершена штатно" -#: pg_rewind.c:567 +#: pg_rewind.c:772 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "скопійовано %*s/%s кБ (%d%%)" -#: pg_rewind.c:630 +#: pg_rewind.c:835 #, c-format msgid "invalid control file" msgstr "неприпустимий контрольний файл" -#: pg_rewind.c:714 +#: pg_rewind.c:919 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "не вдалося знайти спільного предка ліній часу початкового та цільового кластерів" -#: pg_rewind.c:755 +#: pg_rewind.c:960 #, c-format msgid "backup label buffer too small" msgstr "буфер для мітки резервного копіювання замалий" -#: pg_rewind.c:778 +#: pg_rewind.c:983 #, c-format msgid "unexpected control file CRC" msgstr "неочікуваний контрольний файл CRC" -#: pg_rewind.c:788 +#: pg_rewind.c:995 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "неочікуваний розмір контрольного файлу %d, очікувалося %d" -#: pg_rewind.c:797 +#: pg_rewind.c:1004 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" @@ -705,38 +746,42 @@ msgstr[1] "Розмір сегменту WAL повинен задаватись msgstr[2] "Розмір сегменту WAL повинен задаватись ступенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано значення %d" msgstr[3] "Розмір сегменту WAL повинен задаватись ступенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано значення %d" -#: pg_rewind.c:854 pg_rewind.c:912 +#: pg_rewind.c:1043 pg_rewind.c:1101 #, c-format -msgid "The program \"%s\" is needed by %s but was not found in the\n" +msgid "" +"The program \"%s\" is needed by %s but was not found in the\n" "same directory as \"%s\".\n" "Check your installation." -msgstr "Програма \"%s\" потрібна для %s, але не знайдена в тому ж каталозі, що й \"%s\".\n" +msgstr "" +"Програма \"%s\" потрібна для %s, але не знайдена в тому ж каталозі, що й \"%s\".\n" "Перевірте вашу установку." -#: pg_rewind.c:859 pg_rewind.c:917 +#: pg_rewind.c:1048 pg_rewind.c:1106 #, c-format -msgid "The program \"%s\" was found by \"%s\"\n" +msgid "" +"The program \"%s\" was found by \"%s\"\n" "but was not the same version as %s.\n" "Check your installation." -msgstr "Програма \"%s\" була знайдена \"%s\", але не була тієї ж версії, що %s.\n" +msgstr "" +"Програма \"%s\" була знайдена \"%s\", але не була тієї ж версії, що %s.\n" "Перевірте вашу установку." -#: pg_rewind.c:880 +#: pg_rewind.c:1069 #, c-format msgid "restore_command is not set in the target cluster" msgstr "команда restore_command не встановлена в цільовому кластері" -#: pg_rewind.c:923 +#: pg_rewind.c:1112 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "виконання \"%s\" для цільового серверу, щоб завершити відновлення після аварійного завершення роботи" -#: pg_rewind.c:943 +#: pg_rewind.c:1132 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "не вдалося ввімкнути однокористувацький режим postgres в цільовому кластері" -#: pg_rewind.c:944 +#: pg_rewind.c:1133 #, c-format msgid "Command was: %s" msgstr "Команда була: %s" @@ -796,118 +841,117 @@ msgstr "невірна довжина запису по зсуву %X/%X: очі msgid "record length %u at %X/%X too long" msgstr "довжина запису %u на %X/%X є задовгою" -#: xlogreader.c:454 +#: xlogreader.c:453 #, c-format msgid "there is no contrecord flag at %X/%X" -msgstr "немає флага contrecord в позиції %X/%X" +msgstr "немає прапора contrecord на %X/%X" -#: xlogreader.c:467 +#: xlogreader.c:466 #, c-format -msgid "invalid contrecord length %u at %X/%X" -msgstr "невірна довижна contrecord (%u) в позиції %X/%X" +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "неприпустима довжина contrecord %u (очікувалось %lld) на %X/%X" #: xlogreader.c:703 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "невірний ID менеджера ресурсів %u в %X/%X" -#: xlogreader.c:717 xlogreader.c:734 +#: xlogreader.c:716 xlogreader.c:732 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "запис з неправильним попереднім посиланням %X/%X на %X/%X" -#: xlogreader.c:771 +#: xlogreader.c:768 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "некоректна контрольна сума даних менеджера ресурсів у запису по зсуву %X/%X" -#: xlogreader.c:808 +#: xlogreader.c:805 #, c-format msgid "invalid magic number %04X in log segment %s, offset %u" msgstr "невірне магічне число %04X в сегменті журналу %s, зсув %u" -#: xlogreader.c:822 xlogreader.c:863 +#: xlogreader.c:819 xlogreader.c:860 #, c-format msgid "invalid info bits %04X in log segment %s, offset %u" msgstr "невірні інформаційні біти %04X в сегменті журналу %s, зсув %u" -#: xlogreader.c:837 +#: xlogreader.c:834 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL файл належить іншій системі баз даних: ідентифікатор системи баз даних де міститься WAL файл - %llu, а ідентифікатор системи баз даних pg_control - %llu" -#: xlogreader.c:845 +#: xlogreader.c:842 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "Файл WAL належить іншій системі баз даних: некоректний розмір сегменту в заголовку сторінки" -#: xlogreader.c:851 +#: xlogreader.c:848 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "Файл WAL належить іншій системі баз даних: некоректний XLOG_BLCKSZ в заголовку сторінки" -#: xlogreader.c:882 +#: xlogreader.c:879 #, c-format msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" msgstr "неочікуваний pageaddr %X/%X в сегменті журналу %s, зсув %u" -#: xlogreader.c:907 +#: xlogreader.c:904 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" msgstr "порушення послідовності ID лінії часу %u (після %u) в сегменті журналу %s, зсув %u" -#: xlogreader.c:1247 +#: xlogreader.c:1249 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "ідентифікатор блока %u out-of-order в позиції %X/%X" -#: xlogreader.c:1270 +#: xlogreader.c:1271 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA встановлений, але немає даних в позиції %X/%X" -#: xlogreader.c:1277 +#: xlogreader.c:1278 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA встановлений, але довжина даних дорівнює %u в позиції %X/%X" -#: xlogreader.c:1313 +#: xlogreader.c:1314 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE встановлений, але для пропуску задані: зсув %u, довжина %u, при довжині образу блока %u в позиції %X/%X" -#: xlogreader.c:1329 +#: xlogreader.c:1330 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE не встановлений, але для пропуску задані: зсув %u, довжина %u в позиції %X/%X" -#: xlogreader.c:1344 +#: xlogreader.c:1345 #, c-format msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_IS_COMPRESSED встановлений, але довжина образу блока дорівнює %u в позиції %X/%X" -#: xlogreader.c:1359 +#: xlogreader.c:1360 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" msgstr "ні BKPIMAGE_HAS_HOLE, ні BKPIMAGE_IS_COMPRESSED не встановлені, але довжина образу блока дорвінює %u в позиції %X/%X" -#: xlogreader.c:1375 +#: xlogreader.c:1376 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL встановлений, але попереднє значення не задано в позиції %X/%X" -#: xlogreader.c:1387 +#: xlogreader.c:1388 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "невірний ідентифікатор блоку %u в позиції %X/%X" -#: xlogreader.c:1476 +#: xlogreader.c:1475 #, c-format msgid "record with invalid length at %X/%X" msgstr "запис з невірною довжиною на %X/%X" -#: xlogreader.c:1565 +#: xlogreader.c:1564 #, c-format msgid "invalid compressed image at %X/%X, block %d" msgstr "невірно стиснутий образ в позиції %X/%X, блок %d" - diff --git a/src/bin/pg_rewind/po/zh_CN.po b/src/bin/pg_rewind/po/zh_CN.po index 65db1ffb03..28d76c30b1 100644 --- a/src/bin/pg_rewind/po/zh_CN.po +++ b/src/bin/pg_rewind/po/zh_CN.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_rewind (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-06-09 21:19+0000\n" -"PO-Revision-Date: 2021-06-09 10:00+0800\n" +"POT-Creation-Date: 2021-08-14 05:48+0000\n" +"PO-Revision-Date: 2021-08-15 10:00+0800\n" "Last-Translator: Jie Zhang \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" @@ -37,7 +37,7 @@ msgstr "警告: " #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format msgid "out of memory\n" -msgstr "内存溢出\n" +msgstr "内存不足\n" #: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 #, c-format @@ -45,10 +45,12 @@ msgid "cannot duplicate null pointer (internal error)\n" msgstr "无法复制空指针 (内部错误)\n" #: ../../common/restricted_token.c:64 +#, c-format msgid "could not load library \"%s\": error code %lu" msgstr "无法加载库 \"%s\": 错误码 %lu" #: ../../common/restricted_token.c:73 +#, c-format msgid "cannot create restricted tokens on this platform: error code %lu" msgstr "无法为该平台创建受限制的令牌:错误码 %lu" @@ -88,10 +90,12 @@ msgid "cannot use restore_command with %%r placeholder" msgstr "无法对%%r占位符使用restore_command" #: ../../fe_utils/archive.c:74 +#, c-format msgid "unexpected file size for \"%s\": %lld instead of %lld" msgstr "\"%s\"的意外文件大小:%lld而不是%lld" #: ../../fe_utils/archive.c:85 +#, c-format msgid "could not open file \"%s\" restored from archive: %m" msgstr "无法打开从存档还原的文件\"%s\": %m" @@ -101,10 +105,12 @@ msgid "could not stat file \"%s\": %m" msgstr "无法取文件 \"%s\" 的状态: %m" #: ../../fe_utils/archive.c:112 +#, c-format msgid "restore_command failed: %s" msgstr "restore_command失败: %s" #: ../../fe_utils/archive.c:121 +#, c-format msgid "could not restore file \"%s\" from archive" msgstr "无法从存档还原文件\"%s\"" @@ -114,7 +120,7 @@ msgstr "无法从存档还原文件\"%s\"" #: parsexlog.c:195 #, c-format msgid "out of memory" -msgstr "内存用尽" +msgstr "内存不足" #: ../../fe_utils/recovery_gen.c:134 parsexlog.c:308 #, c-format @@ -152,6 +158,7 @@ msgid "could not write file \"%s\": %m" msgstr "无法写入文件 \"%s\": %m" #: file_ops.c:150 file_ops.c:177 +#, c-format msgid "undefined file type for \"%s\"" msgstr "不可识别的文件格式 \"%s\"" @@ -246,22 +253,27 @@ msgid "data file \"%s\" in source is not a regular file" msgstr "源头的数据文件\"%s\"不是一个常规文件" #: filemap.c:242 filemap.c:275 +#, c-format msgid "duplicate source file \"%s\"" msgstr "复制源文件\"%s\"" #: filemap.c:330 +#, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "非常规文件\"%s\"的意外页面修改" #: filemap.c:680 filemap.c:774 +#, c-format msgid "unknown file type for \"%s\"" msgstr "\"%s\"的未知文件类型" #: filemap.c:707 +#, c-format msgid "file \"%s\" is of different type in source and target" msgstr "文件 \"%s\"在源和目标中的类型不同" #: filemap.c:779 +#, c-format msgid "could not decide what to do with file \"%s\"" msgstr "无法决定如何处理文件\"%s\"" @@ -276,10 +288,12 @@ msgid "full_page_writes must be enabled in the source server" msgstr "源服务器中的full_page_writes必须被启用" #: libpq_source.c:150 +#, c-format msgid "could not prepare statement to fetch file contents: %s" msgstr "无法准备语句以获取文件内容: %s" #: libpq_source.c:169 +#, c-format msgid "error running query (%s) on source server: %s" msgstr "源服务器中有错误运行的查询(%s):%s" @@ -324,6 +338,7 @@ msgid "unexpected result while fetching remote files: %s" msgstr "在取得远程文件时得到意料之外的结果:%s" #: libpq_source.c:473 +#, c-format msgid "received more data chunks than requested" msgstr "收到的数据块比请求的多" @@ -363,10 +378,12 @@ msgid "received data at offset %lld of file \"%s\", when requested for offset %l msgstr "当请求偏移量%3$lld时,在文件\"%2$s\"的偏移量%1$lld处接收到数据" #: libpq_source.c:550 +#, c-format msgid "received more than requested for file \"%s\"" msgstr "收到的文件\"%s\"比要求的多" #: libpq_source.c:563 +#, c-format msgid "unexpected number of data chunks received" msgstr "接收到意外的数据块数" @@ -499,6 +516,7 @@ msgid " -P, --progress write progress messages\n" msgstr " -P, --progress 写出进度消息\n" #: pg_rewind.c:96 +#, c-format msgid "" " -R, --write-recovery-conf write configuration for replication\n" " (requires --source-server)\n" @@ -647,6 +665,7 @@ msgid "Done!" msgstr "完成!" #: pg_rewind.c:564 +#, c-format msgid "no action decided for file \"%s\"" msgstr "未决定对文件\"%s\"执行任何操作" @@ -696,6 +715,7 @@ msgid "%*s/%s kB (%d%%) copied" msgstr "已复制%*s/%s kB (%d%%)" #: pg_rewind.c:835 +#, c-format msgid "invalid control file" msgstr "无效的控制文件" @@ -749,6 +769,7 @@ msgstr "" "检查您的安装." #: pg_rewind.c:1069 +#, c-format msgid "restore_command is not set in the target cluster" msgstr "目标群集中未设置restore_command" @@ -763,6 +784,7 @@ msgid "postgres single-user mode in target cluster failed" msgstr "目标群集中的postgres单用户模式失败" #: pg_rewind.c:1133 +#, c-format msgid "Command was: %s" msgstr "命令是: %s" @@ -809,7 +831,7 @@ msgstr "%X/%X处有无效的记录偏移量" #: xlogreader.c:357 #, c-format msgid "contrecord is requested by %X/%X" -msgstr "%X/%X请求继续记录(contrecord)" +msgstr "%X/%X位置处要求继续记录" #: xlogreader.c:398 xlogreader.c:695 #, c-format @@ -819,14 +841,15 @@ msgstr "%X/%X处有无效记录长度: 应该是%u, 但实际是%u" #: xlogreader.c:422 #, c-format msgid "record length %u at %X/%X too long" -msgstr "%2$X/%3$X处有的记录长度%1$u过长" +msgstr "%2$X/%3$X处的记录长度%1$u太长" #: xlogreader.c:453 #, c-format msgid "there is no contrecord flag at %X/%X" -msgstr "%X/%X处没有继续记录标志" +msgstr "在%X/%X处没有继续记录标志" #: xlogreader.c:466 +#, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "%3$X/%4$X处有无效的继续记录长度%1$u(应为 %2$lld)" @@ -838,12 +861,12 @@ msgstr "%2$X/%3$X处有无效的资源管理器 ID %1$u" #: xlogreader.c:716 xlogreader.c:732 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "%3$X/%4$X处的记录有不正确的prev-link %1$X/%2$X" +msgstr "具有不正确向前链接%X/%X的记录出现在%X/%X" #: xlogreader.c:768 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" -msgstr "%X/%X处的记录中有不正确的资源管理器数据校验和" +msgstr "在%X/%X处的记录中的资源管理器数据校验和不正确" #: xlogreader.c:805 #, c-format @@ -856,6 +879,7 @@ msgid "invalid info bits %04X in log segment %s, offset %u" msgstr "在日志段%2$s的偏移量%3$u处有无效的info位%1$04X" #: xlogreader.c:834 +#, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL文件来自于不同的数据库系统:WAL文件数据库系统标识符是%llu,pg_control数据库系统标识符是%llu" @@ -917,17 +941,17 @@ msgstr "BKPIMAGE_HAS_HOLE和BKPIMAGE_IS_COMPRESSED都没有被设置,但是%2$ #: xlogreader.c:1376 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" -msgstr "BKPBLOCK_SAME_REL已被设置,但是在%X/%X没有前一个关系" +msgstr "设置了BKPBLOCK_SAME_REL,但是在%X/%X位置没有记录先前的关系" #: xlogreader.c:1388 #, c-format msgid "invalid block_id %u at %X/%X" -msgstr "%2$X/%3$X处有无效block_id %1$u" +msgstr "%2$X/%3$X处的block_id %1$u无效" #: xlogreader.c:1475 #, c-format msgid "record with invalid length at %X/%X" -msgstr "%X/%X处的记录的长度无效" +msgstr "在%X/%X处的记录的长度无效" #: xlogreader.c:1564 #, c-format diff --git a/src/bin/pg_test_fsync/po/de.po b/src/bin/pg_test_fsync/po/de.po index 290551e16e..906080ea09 100644 --- a/src/bin/pg_test_fsync/po/de.po +++ b/src/bin/pg_test_fsync/po/de.po @@ -1,13 +1,13 @@ # German message translation file for pg_test_fsync -# Copyright (C) 2017-2021 PostgreSQL Global Development Group +# Copyright (C) 2017-2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: pg_test_fsync (PostgreSQL) 14\n" +"Project-Id-Version: pg_test_fsync (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-13 21:19+0000\n" -"PO-Revision-Date: 2021-04-14 00:04+0200\n" +"POT-Creation-Date: 2022-05-11 15:51+0000\n" +"PO-Revision-Date: 2022-05-11 22:41+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -16,58 +16,108 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +#: ../../../src/common/logging.c:277 +#, c-format +msgid "error: " +msgstr "Fehler: " + +#: ../../../src/common/logging.c:284 +#, c-format +msgid "warning: " +msgstr "Warnung: " + +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "Tipp: " + #. translator: maintain alignment with NA_FORMAT -#: pg_test_fsync.c:31 +#: pg_test_fsync.c:32 #, c-format msgid "%13.3f ops/sec %6.0f usecs/op\n" msgstr " %13.3f Op./s %6.0f µs/Op.\n" +#: pg_test_fsync.c:50 +#, c-format +msgid "could not create thread for alarm" +msgstr "konnte Thread für Alarm nicht erzeugen" + +#: pg_test_fsync.c:95 +#, c-format +msgid "%s: %m" +msgstr "%s: %m" + #: pg_test_fsync.c:159 #, c-format msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" msgstr "Aufruf: %s [-f DATEINAME] [-s SEK-PRO-TEST]\n" -#: pg_test_fsync.c:186 pg_test_fsync.c:200 pg_test_fsync.c:211 +#: pg_test_fsync.c:185 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" +msgid "invalid argument for option %s" +msgstr "ungültiges Argument für Option %s" -#: pg_test_fsync.c:216 +#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." + +#: pg_test_fsync.c:192 +#, c-format +msgid "%s must be in range %u..%u" +msgstr "%s muss im Bereich %u..%u sein" + +#: pg_test_fsync.c:205 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" + +#: pg_test_fsync.c:211 #, c-format msgid "%u second per test\n" msgid_plural "%u seconds per test\n" msgstr[0] "%u Sekunde pro Test\n" msgstr[1] "%u Sekunden pro Test\n" -#: pg_test_fsync.c:221 +#: pg_test_fsync.c:216 #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "O_DIRECT wird auf dieser Plattform für open_datasync und open_sync unterstützt.\n" -#: pg_test_fsync.c:223 +#: pg_test_fsync.c:218 +#, c-format +msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" +msgstr "F_NOCACHE wird auf dieser Plattform für open_datasync und open_sync unterstützt.\n" + +#: pg_test_fsync.c:220 #, c-format msgid "Direct I/O is not supported on this platform.\n" msgstr "Direct-I/O wird auf dieser Plattform nicht unterstützt.\n" -#: pg_test_fsync.c:248 pg_test_fsync.c:314 pg_test_fsync.c:339 -#: pg_test_fsync.c:363 pg_test_fsync.c:506 pg_test_fsync.c:518 -#: pg_test_fsync.c:534 pg_test_fsync.c:540 pg_test_fsync.c:562 +#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361 +#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541 +#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585 msgid "could not open output file" msgstr "konnte Ausgabedatei nicht öffnen" -#: pg_test_fsync.c:252 pg_test_fsync.c:297 pg_test_fsync.c:323 -#: pg_test_fsync.c:348 pg_test_fsync.c:372 pg_test_fsync.c:410 -#: pg_test_fsync.c:469 pg_test_fsync.c:508 pg_test_fsync.c:536 -#: pg_test_fsync.c:567 +#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345 +#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433 +#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559 +#: pg_test_fsync.c:590 msgid "write failed" msgstr "Schreiben fehlgeschlagen" -#: pg_test_fsync.c:256 pg_test_fsync.c:350 pg_test_fsync.c:374 -#: pg_test_fsync.c:510 pg_test_fsync.c:542 +#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396 +#: pg_test_fsync.c:533 pg_test_fsync.c:565 msgid "fsync failed" msgstr "fsync fehlgeschlagen" -#: pg_test_fsync.c:270 +#: pg_test_fsync.c:292 #, c-format msgid "" "\n" @@ -76,7 +126,7 @@ msgstr "" "\n" "Vergleich von Datei-Sync-Methoden bei einem Schreibvorgang aus %dkB:\n" -#: pg_test_fsync.c:272 +#: pg_test_fsync.c:294 #, c-format msgid "" "\n" @@ -85,21 +135,21 @@ msgstr "" "\n" "Vergleich von Datei-Sync-Methoden bei zwei Schreibvorgängen aus je %dkB:\n" -#: pg_test_fsync.c:273 +#: pg_test_fsync.c:295 #, c-format msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n" msgstr "(in Rangordnung von wal_sync_method, außer dass fdatasync auf Linux Standard ist)\n" -#: pg_test_fsync.c:284 pg_test_fsync.c:391 pg_test_fsync.c:457 +#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480 msgid "n/a*" msgstr "entf.*" -#: pg_test_fsync.c:303 pg_test_fsync.c:329 pg_test_fsync.c:379 -#: pg_test_fsync.c:416 pg_test_fsync.c:475 +#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401 +#: pg_test_fsync.c:439 pg_test_fsync.c:498 msgid "n/a" msgstr "entf." -#: pg_test_fsync.c:421 +#: pg_test_fsync.c:444 #, c-format msgid "" "* This file system and its mount options do not support direct\n" @@ -108,7 +158,7 @@ msgstr "" "* Dieses Dateisystem und die Mount-Optionen unterstützen kein Direct-I/O,\n" " z.B. ext4 im Journaled-Modus.\n" -#: pg_test_fsync.c:429 +#: pg_test_fsync.c:452 #, c-format msgid "" "\n" @@ -117,7 +167,7 @@ msgstr "" "\n" "Vergleich von open_sync mit verschiedenen Schreibgrößen:\n" -#: pg_test_fsync.c:430 +#: pg_test_fsync.c:453 #, c-format msgid "" "(This is designed to compare the cost of writing 16kB in different write\n" @@ -126,27 +176,27 @@ msgstr "" "(Damit werden die Kosten für das Schreiben von 16kB in verschieden Größen mit\n" "open_sync verglichen.)\n" -#: pg_test_fsync.c:433 +#: pg_test_fsync.c:456 msgid " 1 * 16kB open_sync write" msgstr " 1 * 16kB open_sync schreiben" -#: pg_test_fsync.c:434 +#: pg_test_fsync.c:457 msgid " 2 * 8kB open_sync writes" msgstr " 2 * 8kB open_sync schreiben" -#: pg_test_fsync.c:435 +#: pg_test_fsync.c:458 msgid " 4 * 4kB open_sync writes" msgstr " 4 * 4kB open_sync schreiben" -#: pg_test_fsync.c:436 +#: pg_test_fsync.c:459 msgid " 8 * 2kB open_sync writes" msgstr " 8 * 2kB open_sync schreiben" -#: pg_test_fsync.c:437 +#: pg_test_fsync.c:460 msgid "16 * 1kB open_sync writes" msgstr "16 * 1kB open_sync schreiben" -#: pg_test_fsync.c:491 +#: pg_test_fsync.c:514 #, c-format msgid "" "\n" @@ -155,7 +205,7 @@ msgstr "" "\n" "Probe ob fsync auf einem anderen Dateideskriptor funktioniert:\n" -#: pg_test_fsync.c:492 +#: pg_test_fsync.c:515 #, c-format msgid "" "(If the times are similar, fsync() can sync data written on a different\n" @@ -164,7 +214,7 @@ msgstr "" "(Wenn die Zeiten ähnlich sind, dann kann fsync() auf einem anderen Deskriptor\n" "geschriebene Daten syncen.)\n" -#: pg_test_fsync.c:557 +#: pg_test_fsync.c:580 #, c-format msgid "" "\n" diff --git a/src/bin/pg_test_fsync/po/fr.po b/src/bin/pg_test_fsync/po/fr.po index cc9800aa24..dfedfe84e7 100644 --- a/src/bin/pg_test_fsync/po/fr.po +++ b/src/bin/pg_test_fsync/po/fr.po @@ -1,75 +1,128 @@ # LANGUAGE message translation file for pg_test_fsync -# Copyright (C) 2017 PostgreSQL Global Development Group -# This file is distributed under the same license as the PostgreSQL package. -# FIRST AUTHOR , 2017. +# Copyright (C) 2017-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package. +# +# Use these quotes: « %s » +# +# Guillaume Lelarge , 2017-2022. # msgid "" msgstr "" -"Project-Id-Version: pg_test_fsync (PostgreSQL) 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-15 01:49+0000\n" -"PO-Revision-Date: 2021-04-15 08:43+0200\n" -"Last-Translator: \n" -"Language-Team: \n" +"POT-Creation-Date: 2022-05-14 10:20+0000\n" +"PO-Revision-Date: 2022-05-14 17:17+0200\n" +"Last-Translator: Guillaume Lelarge \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" + +#: ../../../src/common/logging.c:277 +#, c-format +msgid "error: " +msgstr "erreur : " + +#: ../../../src/common/logging.c:284 +#, c-format +msgid "warning: " +msgstr "attention : " + +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "astuce : " #. translator: maintain alignment with NA_FORMAT -#: pg_test_fsync.c:31 +#: pg_test_fsync.c:32 #, c-format msgid "%13.3f ops/sec %6.0f usecs/op\n" msgstr "%13.3f ops/sec %6.0f usecs/op\n" +#: pg_test_fsync.c:50 +#, c-format +msgid "could not create thread for alarm" +msgstr "n'a pas pu créer un thread pour l'alarme" + +#: pg_test_fsync.c:95 +#, c-format +msgid "%s: %m" +msgstr "%s : %m" + #: pg_test_fsync.c:159 #, c-format msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" msgstr "Usage: %s [-f NOMFICHIER] [-s SECS-PAR-TEST]\n" -#: pg_test_fsync.c:186 pg_test_fsync.c:200 pg_test_fsync.c:211 +#: pg_test_fsync.c:185 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Essayez « %s --help » pour plus d'informations.\n" +msgid "invalid argument for option %s" +msgstr "argument invalide pour l'option %s" -#: pg_test_fsync.c:216 +#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." + +#: pg_test_fsync.c:192 +#, c-format +msgid "%s must be in range %u..%u" +msgstr "%s doit être compris entre %u et %u" + +#: pg_test_fsync.c:205 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" + +#: pg_test_fsync.c:211 #, c-format msgid "%u second per test\n" msgid_plural "%u seconds per test\n" msgstr[0] "%u seconde par test\n" msgstr[1] "%u secondes par test\n" -#: pg_test_fsync.c:221 +#: pg_test_fsync.c:216 #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "O_DIRECT supporté sur cette plateforme pour open_datasync et open_sync.\n" -#: pg_test_fsync.c:223 +#: pg_test_fsync.c:218 +#, c-format +msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" +msgstr "F_NOCACHE supporté sur cette plateforme pour open_datasync et open_sync.\n" + +#: pg_test_fsync.c:220 #, c-format msgid "Direct I/O is not supported on this platform.\n" msgstr "Direct I/O n'est pas supporté sur cette plateforme.\n" -#: pg_test_fsync.c:248 pg_test_fsync.c:314 pg_test_fsync.c:339 -#: pg_test_fsync.c:363 pg_test_fsync.c:506 pg_test_fsync.c:518 -#: pg_test_fsync.c:534 pg_test_fsync.c:540 pg_test_fsync.c:562 +#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361 +#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541 +#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585 msgid "could not open output file" msgstr "n'a pas pu ouvrir le fichier en sortie" -#: pg_test_fsync.c:252 pg_test_fsync.c:297 pg_test_fsync.c:323 -#: pg_test_fsync.c:348 pg_test_fsync.c:372 pg_test_fsync.c:410 -#: pg_test_fsync.c:469 pg_test_fsync.c:508 pg_test_fsync.c:536 -#: pg_test_fsync.c:567 +#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345 +#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433 +#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559 +#: pg_test_fsync.c:590 msgid "write failed" msgstr "échec en écriture" -#: pg_test_fsync.c:256 pg_test_fsync.c:350 pg_test_fsync.c:374 -#: pg_test_fsync.c:510 pg_test_fsync.c:542 +#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396 +#: pg_test_fsync.c:533 pg_test_fsync.c:565 msgid "fsync failed" msgstr "échec de la synchronisation (fsync)" -#: pg_test_fsync.c:270 +#: pg_test_fsync.c:292 #, c-format msgid "" "\n" @@ -78,7 +131,7 @@ msgstr "" "\n" "Comparer les méthodes de synchronisation de fichier en utilisant une écriture de %d Ko :\n" -#: pg_test_fsync.c:272 +#: pg_test_fsync.c:294 #, c-format msgid "" "\n" @@ -87,21 +140,21 @@ msgstr "" "\n" "Comparer les méthodes de synchronisation de fichier sur disque en utilisant deux écritures de %d Ko :\n" -#: pg_test_fsync.c:273 +#: pg_test_fsync.c:295 #, c-format msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n" msgstr "(dans l'ordre de préférence de wal_sync_method, sauf fdatasync qui est la valeur par défaut sous Linux)\n" -#: pg_test_fsync.c:284 pg_test_fsync.c:391 pg_test_fsync.c:457 +#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480 msgid "n/a*" msgstr "n/a*" -#: pg_test_fsync.c:303 pg_test_fsync.c:329 pg_test_fsync.c:379 -#: pg_test_fsync.c:416 pg_test_fsync.c:475 +#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401 +#: pg_test_fsync.c:439 pg_test_fsync.c:498 msgid "n/a" msgstr "n/a" -#: pg_test_fsync.c:421 +#: pg_test_fsync.c:444 #, c-format msgid "" "* This file system and its mount options do not support direct\n" @@ -110,7 +163,7 @@ msgstr "" "* Ce système de fichiers et ses options de montage ne supportent pas les\n" " I/O directes, par exemple ext4 en journalisé.\n" -#: pg_test_fsync.c:429 +#: pg_test_fsync.c:452 #, c-format msgid "" "\n" @@ -119,7 +172,7 @@ msgstr "" "\n" "Comparer open_sync avec différentes tailles d'écriture :\n" -#: pg_test_fsync.c:430 +#: pg_test_fsync.c:453 #, c-format msgid "" "(This is designed to compare the cost of writing 16kB in different write\n" @@ -128,27 +181,27 @@ msgstr "" "(Ceci est conçu pour comparer le coût d'écriture de 16 Ko dans différentes tailles\n" "d'écritures open_sync.)\n" -#: pg_test_fsync.c:433 +#: pg_test_fsync.c:456 msgid " 1 * 16kB open_sync write" msgstr " 1 * 16 Ko, écriture avec open_sync" -#: pg_test_fsync.c:434 +#: pg_test_fsync.c:457 msgid " 2 * 8kB open_sync writes" msgstr " 2 * 8 Ko, écriture avec open_sync" -#: pg_test_fsync.c:435 +#: pg_test_fsync.c:458 msgid " 4 * 4kB open_sync writes" msgstr " 4 * 4 Ko, écriture avec open_sync" -#: pg_test_fsync.c:436 +#: pg_test_fsync.c:459 msgid " 8 * 2kB open_sync writes" msgstr " 8 * 2 Ko, écriture avec open_sync" -#: pg_test_fsync.c:437 +#: pg_test_fsync.c:460 msgid "16 * 1kB open_sync writes" msgstr " 16 * 1 Ko, écriture avec open_sync" -#: pg_test_fsync.c:491 +#: pg_test_fsync.c:514 #, c-format msgid "" "\n" @@ -157,7 +210,7 @@ msgstr "" "\n" "Teste si fsync est honoré sur un descripteur de fichiers sans écriture :\n" -#: pg_test_fsync.c:492 +#: pg_test_fsync.c:515 #, c-format msgid "" "(If the times are similar, fsync() can sync data written on a different\n" @@ -166,7 +219,7 @@ msgstr "" "(Si les temps sont similaires, fsync() peut synchroniser sur disque les données écrites sur\n" "un descripteur différent.)\n" -#: pg_test_fsync.c:557 +#: pg_test_fsync.c:580 #, c-format msgid "" "\n" @@ -178,11 +231,12 @@ msgstr "" #~ msgid "%s: %s\n" #~ msgstr "%s : %s\n" -#~ msgid "seek failed" -#~ msgstr "seek échoué" - #~ msgid "%s: too many command-line arguments (first is \"%s\")\n" #~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" -#~ msgid "Could not create thread for alarm\n" -#~ msgstr "N'a pas pu créer un thread pour l'alarme\n" +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" + +#~ msgid "seek failed" +#~ msgstr "seek échoué" diff --git a/src/bin/pg_test_fsync/po/ja.po b/src/bin/pg_test_fsync/po/ja.po index 4547a2cbf1..327d7e1742 100644 --- a/src/bin/pg_test_fsync/po/ja.po +++ b/src/bin/pg_test_fsync/po/ja.po @@ -1,84 +1,124 @@ # LANGUAGE message translation file for pg_test_fsync -# Copyright (C) 2018 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package. # FIRST AUTHOR , 2018. # msgid "" msgstr "" -"Project-Id-Version: pg_test_fsync (PostgreSQL) 10\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2018-01-30 16:17+0900\n" -"PO-Revision-Date: 2018-01-30 17:07+0900\n" +"Project-Id-Version: pg_test_fsync (PostgreSQL 15)\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" +"PO-Revision-Date: 2022-05-10 15:25+0900\n" +"Last-Translator: Michihide Hotta \n" +"Language-Team: \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"Last-Translator: Michihide Hotta \n" -"Language-Team: \n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 1.8.13\n" + +#: ../../../src/common/logging.c:277 +#, c-format +msgid "error: " +msgstr "エラー: " + +#: ../../../src/common/logging.c:284 +#, c-format +msgid "warning: " +msgstr "警告: " + +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "ヒント: " #. translator: maintain alignment with NA_FORMAT -#: pg_test_fsync.c:30 +#: pg_test_fsync.c:32 #, c-format msgid "%13.3f ops/sec %6.0f usecs/op\n" msgstr "%13.3f 操作/秒 %6.0f マイクロ秒/操作\n" -#: pg_test_fsync.c:49 +#: pg_test_fsync.c:50 #, c-format -msgid "Could not create thread for alarm\n" -msgstr "アラーム用のスレッドを生成できませんでした\n" +msgid "could not create thread for alarm" +msgstr "アラーム用のスレッドを生成できませんでした" -#: pg_test_fsync.c:154 +#: pg_test_fsync.c:95 +#, c-format +msgid "%s: %m" +msgstr "%s: %m" + +#: pg_test_fsync.c:159 #, c-format msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" msgstr "使用法: %s [-f ファイル名] [-s テストあたりの秒数]\n" -#: pg_test_fsync.c:178 pg_test_fsync.c:190 +#: pg_test_fsync.c:185 +#, c-format +msgid "invalid argument for option %s" +msgstr "オプション%sの引数が不正です" + +#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "\"%s --help\" で詳細を確認してください。\n" +msgid "Try \"%s --help\" for more information." +msgstr "詳細は\"%s --help\"を実行してください。" -#: pg_test_fsync.c:188 +#: pg_test_fsync.c:192 #, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: コマンドライン引数が多すぎます(先頭は \"%s\")\n" +msgid "%s must be in range %u..%u" +msgstr "%sは%u..%uの範囲でなければなりません" -#: pg_test_fsync.c:195 +#: pg_test_fsync.c:205 #, c-format -msgid "%d second per test\n" -msgid_plural "%d seconds per test\n" -msgstr[0] "テスト1件あたり %d 秒\n" +msgid "too many command-line arguments (first is \"%s\")" +msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")" -#: pg_test_fsync.c:200 +#: pg_test_fsync.c:211 +#, c-format +msgid "%u second per test\n" +msgid_plural "%u seconds per test\n" +msgstr[0] "テスト1件あたり %u秒\n" + +#: pg_test_fsync.c:216 #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "このプラットフォームでは open_datasync と open_sync について O_DIRECT がサポートされています。\n" -#: pg_test_fsync.c:202 +#: pg_test_fsync.c:218 +#, c-format +msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" +msgstr "このプラットフォームでは open_datasync と open_sync について F_NOCACHE がサポートされています。\n" + +#: pg_test_fsync.c:220 #, c-format msgid "Direct I/O is not supported on this platform.\n" msgstr "このプラットフォームではダイレクト I/O がサポートされていません。\n" -#: pg_test_fsync.c:227 pg_test_fsync.c:291 pg_test_fsync.c:315 -#: pg_test_fsync.c:338 pg_test_fsync.c:479 pg_test_fsync.c:491 -#: pg_test_fsync.c:507 pg_test_fsync.c:513 pg_test_fsync.c:538 +#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361 +#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541 +#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585 msgid "could not open output file" msgstr "出力ファイルをオープンできませんでした" -#: pg_test_fsync.c:230 pg_test_fsync.c:272 pg_test_fsync.c:297 -#: pg_test_fsync.c:321 pg_test_fsync.c:344 pg_test_fsync.c:382 -#: pg_test_fsync.c:440 pg_test_fsync.c:481 pg_test_fsync.c:509 -#: pg_test_fsync.c:540 +#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345 +#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433 +#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559 +#: pg_test_fsync.c:590 msgid "write failed" msgstr "書き込みに失敗" -#: pg_test_fsync.c:234 pg_test_fsync.c:323 pg_test_fsync.c:346 -#: pg_test_fsync.c:483 pg_test_fsync.c:515 +#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396 +#: pg_test_fsync.c:533 pg_test_fsync.c:565 msgid "fsync failed" msgstr "fsync に失敗" -#: pg_test_fsync.c:248 +#: pg_test_fsync.c:292 #, c-format msgid "" "\n" @@ -87,7 +127,7 @@ msgstr "" "\n" "1個の %dkB write を使ってファイル同期メソッドを比較します:\n" -#: pg_test_fsync.c:250 +#: pg_test_fsync.c:294 #, c-format msgid "" "\n" @@ -96,26 +136,21 @@ msgstr "" "\n" "2個の %dkB write を使ってファイル同期メソッドを比較します:\n" -#: pg_test_fsync.c:251 +#: pg_test_fsync.c:295 #, c-format msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n" msgstr "(wal_sync_method の指定順の中で、Linux のデフォルトである fdatasync は除きます)\n" -#: pg_test_fsync.c:262 pg_test_fsync.c:365 pg_test_fsync.c:431 +#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480 msgid "n/a*" msgstr "利用不可*" -#: pg_test_fsync.c:274 pg_test_fsync.c:300 pg_test_fsync.c:325 -#: pg_test_fsync.c:348 pg_test_fsync.c:384 pg_test_fsync.c:442 -msgid "seek failed" -msgstr "seek 失敗" - -#: pg_test_fsync.c:280 pg_test_fsync.c:305 pg_test_fsync.c:353 -#: pg_test_fsync.c:390 pg_test_fsync.c:448 +#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401 +#: pg_test_fsync.c:439 pg_test_fsync.c:498 msgid "n/a" msgstr "利用不可" -#: pg_test_fsync.c:395 +#: pg_test_fsync.c:444 #, c-format msgid "" "* This file system and its mount options do not support direct\n" @@ -124,7 +159,7 @@ msgstr "" "* このファイルシステムとそのマウントオプションではダイレクト I/O をサポート\n" " していません。例)ジャーナルモードの ext4。\n" -#: pg_test_fsync.c:403 +#: pg_test_fsync.c:452 #, c-format msgid "" "\n" @@ -133,7 +168,7 @@ msgstr "" "\n" "open_sync を異なった write サイズで比較します:\n" -#: pg_test_fsync.c:404 +#: pg_test_fsync.c:453 #, c-format msgid "" "(This is designed to compare the cost of writing 16kB in different write\n" @@ -142,27 +177,27 @@ msgstr "" "(これは open_sync の write サイズを変えながら、16kB write のコストを\n" "比較するよう指定されています。)\n" -#: pg_test_fsync.c:407 +#: pg_test_fsync.c:456 msgid " 1 * 16kB open_sync write" msgstr " 1 * 16kB open_sync write" -#: pg_test_fsync.c:408 +#: pg_test_fsync.c:457 msgid " 2 * 8kB open_sync writes" msgstr " 2 * 8kB open_sync writes" -#: pg_test_fsync.c:409 +#: pg_test_fsync.c:458 msgid " 4 * 4kB open_sync writes" msgstr " 4 * 4kB open_sync writes" -#: pg_test_fsync.c:410 +#: pg_test_fsync.c:459 msgid " 8 * 2kB open_sync writes" msgstr " 8 * 2kB open_sync writes" -#: pg_test_fsync.c:411 +#: pg_test_fsync.c:460 msgid "16 * 1kB open_sync writes" msgstr "16 * 1kB open_sync writes" -#: pg_test_fsync.c:464 +#: pg_test_fsync.c:514 #, c-format msgid "" "\n" @@ -171,7 +206,7 @@ msgstr "" "\n" "書き込みなしのファイルディスクリプタ上の fsync の方が優れているかをテストします:\n" -#: pg_test_fsync.c:465 +#: pg_test_fsync.c:515 #, c-format msgid "" "(If the times are similar, fsync() can sync data written on a different\n" @@ -180,7 +215,7 @@ msgstr "" "(もし実行時間が同等であれば、fsync() は異なったファイルディスクリプタ上で\n" "データを sync できることになります。)\n" -#: pg_test_fsync.c:530 +#: pg_test_fsync.c:580 #, c-format msgid "" "\n" @@ -189,7 +224,14 @@ msgstr "" "\n" "%dkB の sync なし write:\n" -#: pg_test_fsync.c:607 -#, c-format -msgid "%s: %s\n" -msgstr "%s: %s\n" +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "\"%s --help\" で詳細を確認してください。\n" + +#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" +#~ msgstr "%s: コマンドライン引数が多すぎます(先頭は \"%s\")\n" + +#~ msgid "seek failed" +#~ msgstr "seek 失敗" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" diff --git a/src/bin/pg_test_fsync/po/sv.po b/src/bin/pg_test_fsync/po/sv.po index 30d3240b8d..45f059e9db 100644 --- a/src/bin/pg_test_fsync/po/sv.po +++ b/src/bin/pg_test_fsync/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_test_fsync # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-11 01:17+0000\n" -"PO-Revision-Date: 2020-04-11 08:15+0200\n" +"POT-Creation-Date: 2022-05-09 18:51+0000\n" +"PO-Revision-Date: 2022-05-09 21:44+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,58 +17,108 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ../../../src/common/logging.c:277 +#, c-format +msgid "error: " +msgstr "fel: " + +#: ../../../src/common/logging.c:284 +#, c-format +msgid "warning: " +msgstr "varning: " + +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "tips: " + #. translator: maintain alignment with NA_FORMAT -#: pg_test_fsync.c:30 +#: pg_test_fsync.c:32 #, c-format msgid "%13.3f ops/sec %6.0f usecs/op\n" msgstr "%13.3f ops/sek %6.0f useks/op\n" -#: pg_test_fsync.c:156 +#: pg_test_fsync.c:50 +#, c-format +msgid "could not create thread for alarm" +msgstr "kunde inte skapa alarmtråd" + +#: pg_test_fsync.c:95 +#, c-format +msgid "%s: %m" +msgstr "%s: %m" + +#: pg_test_fsync.c:159 #, c-format msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" msgstr "Användning: %s [-f FILENAMN] [-s SEK-PER-TEST]\n" -#: pg_test_fsync.c:180 pg_test_fsync.c:191 +#: pg_test_fsync.c:185 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Försök med \"%s --help\" för mer information.\n" +msgid "invalid argument for option %s" +msgstr "ogiltigt argument för flaggan %s" -#: pg_test_fsync.c:196 +#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207 #, c-format -msgid "%d second per test\n" -msgid_plural "%d seconds per test\n" -msgstr[0] "%d sekund per test\n" -msgstr[1] "%d sekunder per test\n" +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." -#: pg_test_fsync.c:201 +#: pg_test_fsync.c:192 +#, c-format +msgid "%s must be in range %u..%u" +msgstr "%s måste vara i intervallet %u..%u" + +#: pg_test_fsync.c:205 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "för många kommandoradsargument (första är \"%s\")" + +#: pg_test_fsync.c:211 +#, c-format +msgid "%u second per test\n" +msgid_plural "%u seconds per test\n" +msgstr[0] "%u sekund per test\n" +msgstr[1] "%u sekunder per test\n" + +#: pg_test_fsync.c:216 #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "O_DIRECT stöds på denna plattform för open_datasync och open_sync.\n" -#: pg_test_fsync.c:203 +#: pg_test_fsync.c:218 +#, c-format +msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" +msgstr "F_NOCACHE stöds på denna plattform för open_datasync och open_sync.\n" + +#: pg_test_fsync.c:220 #, c-format msgid "Direct I/O is not supported on this platform.\n" msgstr "Direkt I/O stöds inte på denna plattform.\n" -#: pg_test_fsync.c:228 pg_test_fsync.c:293 pg_test_fsync.c:317 -#: pg_test_fsync.c:340 pg_test_fsync.c:481 pg_test_fsync.c:493 -#: pg_test_fsync.c:509 pg_test_fsync.c:515 pg_test_fsync.c:540 +#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361 +#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541 +#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585 msgid "could not open output file" msgstr "kunde inte öppna utdatafil" -#: pg_test_fsync.c:232 pg_test_fsync.c:274 pg_test_fsync.c:299 -#: pg_test_fsync.c:323 pg_test_fsync.c:346 pg_test_fsync.c:384 -#: pg_test_fsync.c:442 pg_test_fsync.c:483 pg_test_fsync.c:511 -#: pg_test_fsync.c:542 +#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345 +#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433 +#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559 +#: pg_test_fsync.c:590 msgid "write failed" msgstr "skrivning misslyckades" -#: pg_test_fsync.c:236 pg_test_fsync.c:325 pg_test_fsync.c:348 -#: pg_test_fsync.c:485 pg_test_fsync.c:517 +#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396 +#: pg_test_fsync.c:533 pg_test_fsync.c:565 msgid "fsync failed" msgstr "fsync misslyckades" -#: pg_test_fsync.c:250 +#: pg_test_fsync.c:292 #, c-format msgid "" "\n" @@ -77,7 +127,7 @@ msgstr "" "\n" "Jämför filsynkningsmetoder genom att använda en %dkB-skrivning:\n" -#: pg_test_fsync.c:252 +#: pg_test_fsync.c:294 #, c-format msgid "" "\n" @@ -86,26 +136,21 @@ msgstr "" "\n" "Jämför filsynkningsmetoder genom att använda två %dkB-skrivningar:\n" -#: pg_test_fsync.c:253 +#: pg_test_fsync.c:295 #, c-format msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n" msgstr "(i wal_sync_method inställningsordning, förutom att fdatasync är standard i Linux)\n" -#: pg_test_fsync.c:264 pg_test_fsync.c:367 pg_test_fsync.c:433 +#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480 msgid "n/a*" msgstr "ej tillämpbar*" -#: pg_test_fsync.c:276 pg_test_fsync.c:302 pg_test_fsync.c:327 -#: pg_test_fsync.c:350 pg_test_fsync.c:386 pg_test_fsync.c:444 -msgid "seek failed" -msgstr "seek misslyckades" - -#: pg_test_fsync.c:282 pg_test_fsync.c:307 pg_test_fsync.c:355 -#: pg_test_fsync.c:392 pg_test_fsync.c:450 +#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401 +#: pg_test_fsync.c:439 pg_test_fsync.c:498 msgid "n/a" msgstr "ej tillämpbar" -#: pg_test_fsync.c:397 +#: pg_test_fsync.c:444 #, c-format msgid "" "* This file system and its mount options do not support direct\n" @@ -114,7 +159,7 @@ msgstr "" "* Detta filsystem och dess monteringsflaffor stöder inte\n" " direkt I/O, t.ex. ext4 i journalläge.\n" -#: pg_test_fsync.c:405 +#: pg_test_fsync.c:452 #, c-format msgid "" "\n" @@ -123,7 +168,7 @@ msgstr "" "\n" "Jämför open_sync med olika skrivstorlekar:\n" -#: pg_test_fsync.c:406 +#: pg_test_fsync.c:453 #, c-format msgid "" "(This is designed to compare the cost of writing 16kB in different write\n" @@ -132,27 +177,27 @@ msgstr "" "(Detta är gjort för att jämföra kostnaden att skriva 16kB med olika\n" "open_sync skrivstorlekar.)\n" -#: pg_test_fsync.c:409 +#: pg_test_fsync.c:456 msgid " 1 * 16kB open_sync write" msgstr " 1 * 16kB open_sync skrivning" -#: pg_test_fsync.c:410 +#: pg_test_fsync.c:457 msgid " 2 * 8kB open_sync writes" msgstr " 2 * 8kB open_sync skrivningar" -#: pg_test_fsync.c:411 +#: pg_test_fsync.c:458 msgid " 4 * 4kB open_sync writes" msgstr " 4 * 4kB open_sync skrivningar" -#: pg_test_fsync.c:412 +#: pg_test_fsync.c:459 msgid " 8 * 2kB open_sync writes" msgstr " 8 * 2kB open_sync skrivningar" -#: pg_test_fsync.c:413 +#: pg_test_fsync.c:460 msgid "16 * 1kB open_sync writes" msgstr "16 * 1kB open_sync skrivningar" -#: pg_test_fsync.c:466 +#: pg_test_fsync.c:514 #, c-format msgid "" "\n" @@ -161,7 +206,7 @@ msgstr "" "\n" "Testa om fsync på en icke skrivbar fildeskriptor respekteras:\n" -#: pg_test_fsync.c:467 +#: pg_test_fsync.c:515 #, c-format msgid "" "(If the times are similar, fsync() can sync data written on a different\n" @@ -170,7 +215,7 @@ msgstr "" "(Om tiderna är liknande, så kan fsync() synka data skriven på\n" "olika deskriptorer.)\n" -#: pg_test_fsync.c:532 +#: pg_test_fsync.c:580 #, c-format msgid "" "\n" @@ -178,3 +223,7 @@ msgid "" msgstr "" "\n" "Icke-synkade %dkB-skrivningar:\n" + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Försök med \"%s --help\" för mer information.\n" diff --git a/src/bin/pg_test_timing/po/el.po b/src/bin/pg_test_timing/po/el.po index 5375540b1e..3d1ba0b276 100644 --- a/src/bin/pg_test_timing/po/el.po +++ b/src/bin/pg_test_timing/po/el.po @@ -3,12 +3,14 @@ # This file is distributed under the same license as the pg_test_timing (PostgreSQL) package. # Georgios Kokolatos , 2021 # +# +# msgid "" msgstr "" "Project-Id-Version: pg_test_timing (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-25 05:47+0000\n" -"PO-Revision-Date: 2021-04-28 10:43+0200\n" +"POT-Creation-Date: 2021-07-20 03:46+0000\n" +"PO-Revision-Date: 2021-07-20 10:42+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -16,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 3.0\n" #: pg_test_timing.c:59 #, c-format @@ -31,7 +33,7 @@ msgstr "%s: μη έγκυρη παράμετρος για την επιλογή #: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Δοκιμάστε “%s —help” για περισσότερες πληροφορίες.\n" +msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n" #: pg_test_timing.c:90 #, c-format @@ -41,7 +43,7 @@ msgstr "%s: %s πρέπει να βρίσκεται εντός εύρους %u.. #: pg_test_timing.c:107 #, c-format msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: πάρα πολλοί παραμέτροι εισόδου από την γραμμή εντολών (πρώτη είναι η “%s”)\n" +msgstr "%s: πάρα πολλοί παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)\n" #: pg_test_timing.c:115 #, c-format @@ -72,13 +74,13 @@ msgstr "< us" #: pg_test_timing.c:187 #, no-c-format msgid "% of total" -msgstr "% of συνολικά" +msgstr "% του συνόλου" #: pg_test_timing.c:188 msgid "count" -msgstr "count" +msgstr "μετρητής" #: pg_test_timing.c:197 #, c-format msgid "Histogram of timing durations:\n" -msgstr "Ιστόγραμμα διαρκειών χρονισμού\n" +msgstr "Ιστόγραμμα διαρκειών χρονισμού:\n" diff --git a/src/bin/pg_test_timing/po/fr.po b/src/bin/pg_test_timing/po/fr.po index 17d321c60d..f97ebee84b 100644 --- a/src/bin/pg_test_timing/po/fr.po +++ b/src/bin/pg_test_timing/po/fr.po @@ -1,22 +1,25 @@ # LANGUAGE message translation file for pg_test_timing -# Copyright (C) 2017 PostgreSQL Global Development Group -# This file is distributed under the same license as the PostgreSQL package. -# FIRST AUTHOR , 2017. +# Copyright (C) 2017-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package. +# +# Use these quotes: « %s » +# +# Guillaume Lelarge , 2017-2022. # msgid "" msgstr "" -"Project-Id-Version: pg_test_timing (PostgreSQL) 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-22 04:17+0000\n" -"PO-Revision-Date: 2021-04-22 10:10+0200\n" -"Last-Translator: \n" -"Language-Team: \n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"Last-Translator: Guillaume Lelarge \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n>1;\n" -"X-Generator: Poedit 2.4.2\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" #: pg_test_timing.c:59 #, c-format diff --git a/src/bin/pg_test_timing/po/ja.po b/src/bin/pg_test_timing/po/ja.po index 33efc7664e..9d7957a0c5 100644 --- a/src/bin/pg_test_timing/po/ja.po +++ b/src/bin/pg_test_timing/po/ja.po @@ -1,78 +1,86 @@ # LANGUAGE message translation file for pg_test_timing -# Copyright (C) 2018 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_test_timing (PostgreSQL) package. # FIRST AUTHOR , 2018. # msgid "" msgstr "" -"Project-Id-Version: pg_test_timing (PostgreSQL) 10\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2018-01-31 13:31+0900\n" -"PO-Revision-Date: 2018-01-31 14:03+0900\n" +"Project-Id-Version: pg_test_timing (PostgreSQL 15)\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" +"PO-Revision-Date: 2022-05-10 15:27+0900\n" +"Last-Translator: Michihide Hotta \n" +"Language-Team: \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"Last-Translator: Michihide Hotta \n" -"Language-Team: \n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 1.8.13\n" -#: pg_test_timing.c:55 +#: pg_test_timing.c:59 #, c-format msgid "Usage: %s [-d DURATION]\n" msgstr "使用方法: %s [-d 期間]\n" -#: pg_test_timing.c:75 pg_test_timing.c:87 pg_test_timing.c:104 +#: pg_test_timing.c:81 +#, c-format +msgid "%s: invalid argument for option %s\n" +msgstr "%s: オプション%sの引数が無効です\n" + +#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "\"%s --help\" で詳細を確認してください。\n" -#: pg_test_timing.c:85 +#: pg_test_timing.c:90 #, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: コマンドライン引数が多すぎます(先頭は \"%s\")\n" +msgid "%s: %s must be in range %u..%u\n" +msgstr "%s: %sは%u..%uの範囲でなければなりません\n" -#: pg_test_timing.c:94 +#: pg_test_timing.c:107 #, c-format -msgid "Testing timing overhead for %d second.\n" -msgid_plural "Testing timing overhead for %d seconds.\n" -msgstr[0] "%d 秒のタイミングのオーバーヘッドをテストしています。\n" +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: コマンドライン引数が多すぎます(先頭は \"%s\")\n" -#: pg_test_timing.c:102 +#: pg_test_timing.c:115 #, c-format -msgid "%s: duration must be a positive integer (duration is \"%d\")\n" -msgstr "%s: 持続時間は正の整数にする必要があります (持続時間は\"%d\")\n" +msgid "Testing timing overhead for %u second.\n" +msgid_plural "Testing timing overhead for %u seconds.\n" +msgstr[0] "%u秒に対するタイミングのオーバーヘッドをテストしています。\n" -#: pg_test_timing.c:140 +#: pg_test_timing.c:151 #, c-format msgid "Detected clock going backwards in time.\n" msgstr "クロックの時刻が逆行していることを検出しました。\n" -#: pg_test_timing.c:141 +#: pg_test_timing.c:152 #, c-format msgid "Time warp: %d ms\n" msgstr "逆行した時間: %d ms\n" -#: pg_test_timing.c:164 +#: pg_test_timing.c:175 #, c-format msgid "Per loop time including overhead: %0.2f ns\n" msgstr "オーバーヘッド込みのループ時間毎: %0.2f ns\n" -#: pg_test_timing.c:175 +#: pg_test_timing.c:186 msgid "< us" msgstr "< us" -#: pg_test_timing.c:176 +#: pg_test_timing.c:187 #, no-c-format msgid "% of total" msgstr "全体の%" -#: pg_test_timing.c:177 +#: pg_test_timing.c:188 msgid "count" msgstr "個数" -#: pg_test_timing.c:186 +#: pg_test_timing.c:197 #, c-format msgid "Histogram of timing durations:\n" msgstr "タイミング持続時間のヒストグラム:\n" + +#~ msgid "%s: duration must be a positive integer (duration is \"%d\")\n" +#~ msgstr "%s: 持続時間は正の整数にする必要があります (持続時間は\"%d\")\n" diff --git a/src/bin/pg_test_timing/po/ru.po b/src/bin/pg_test_timing/po/ru.po index fe033f2834..2bc6ad3914 100644 --- a/src/bin/pg_test_timing/po/ru.po +++ b/src/bin/pg_test_timing/po/ru.po @@ -1,13 +1,13 @@ # Russian message translation file for pg_test_timing # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2017. +# Alexander Lakhin , 2017, 2021. msgid "" msgstr "" "Project-Id-Version: pg_test_timing (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-09-09 12:21+0300\n" -"PO-Revision-Date: 2017-08-23 19:20+0300\n" +"POT-Creation-Date: 2021-08-14 06:29+0300\n" +"PO-Revision-Date: 2021-09-04 12:18+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -17,64 +17,72 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: pg_test_timing.c:55 +#: pg_test_timing.c:59 #, c-format msgid "Usage: %s [-d DURATION]\n" msgstr "Использование: %s [-d ДЛИТЕЛЬНОСТЬ]\n" -#: pg_test_timing.c:75 pg_test_timing.c:87 pg_test_timing.c:104 +#: pg_test_timing.c:81 +#, c-format +msgid "%s: invalid argument for option %s\n" +msgstr "%s: недопустимый аргумент параметра %s\n" + +#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Для дополнительной информации попробуйте \"%s --help\".\n" -#: pg_test_timing.c:85 +#: pg_test_timing.c:90 #, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: слишком много аргументов командной строки (первый: \"%s\")\n" +msgid "%s: %s must be in range %u..%u\n" +msgstr "%s: параметр %s должен быть в диапазоне %u..%u\n" -#: pg_test_timing.c:94 +#: pg_test_timing.c:107 #, c-format -msgid "Testing timing overhead for %d second.\n" -msgid_plural "Testing timing overhead for %d seconds.\n" -msgstr[0] "Оценка издержек замеров времени в течение %d сек.\n" -msgstr[1] "Оценка издержек замеров времени в течение %d сек.\n" -msgstr[2] "Оценка издержек замеров времени в течение %d сек.\n" +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: слишком много аргументов командной строки (первый: \"%s\")\n" -#: pg_test_timing.c:102 +#: pg_test_timing.c:115 #, c-format -msgid "%s: duration must be a positive integer (duration is \"%d\")\n" -msgstr "" -"%s: длительность должна задаваться положительным целым (указано: \"%d\")\n" +msgid "Testing timing overhead for %u second.\n" +msgid_plural "Testing timing overhead for %u seconds.\n" +msgstr[0] "Оценка издержек замеров времени в течение %u сек.\n" +msgstr[1] "Оценка издержек замеров времени в течение %u сек.\n" +msgstr[2] "Оценка издержек замеров времени в течение %u сек.\n" -#: pg_test_timing.c:140 +#: pg_test_timing.c:151 #, c-format msgid "Detected clock going backwards in time.\n" msgstr "Обнаружен обратный ход часов.\n" -#: pg_test_timing.c:141 +#: pg_test_timing.c:152 #, c-format msgid "Time warp: %d ms\n" msgstr "Сдвиг времени: %d мс\n" -#: pg_test_timing.c:164 +#: pg_test_timing.c:175 #, c-format msgid "Per loop time including overhead: %0.2f ns\n" msgstr "Время одного цикла, включая издержки: %0.2f нс\n" -#: pg_test_timing.c:175 +#: pg_test_timing.c:186 msgid "< us" msgstr "< мкс" -#: pg_test_timing.c:176 +#: pg_test_timing.c:187 #, no-c-format msgid "% of total" msgstr "% от общего" -#: pg_test_timing.c:177 +#: pg_test_timing.c:188 msgid "count" msgstr "число" -#: pg_test_timing.c:186 +#: pg_test_timing.c:197 #, c-format msgid "Histogram of timing durations:\n" msgstr "Гистограмма длительности замеров времени:\n" + +#~ msgid "%s: duration must be a positive integer (duration is \"%d\")\n" +#~ msgstr "" +#~ "%s: длительность должна задаваться положительным целым (указано: \"%d\")\n" diff --git a/src/bin/pg_test_timing/po/sv.po b/src/bin/pg_test_timing/po/sv.po index 1d1aba7db1..92c130dced 100644 --- a/src/bin/pg_test_timing/po/sv.po +++ b/src/bin/pg_test_timing/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_test_timing # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-11 01:15+0000\n" -"PO-Revision-Date: 2020-04-11 08:17+0200\n" +"POT-Creation-Date: 2021-11-06 17:16+0000\n" +"PO-Revision-Date: 2021-11-06 21:59+0100\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,62 +17,67 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: pg_test_timing.c:55 +#: pg_test_timing.c:59 #, c-format msgid "Usage: %s [-d DURATION]\n" msgstr "Användning: %s [-d TID]\n" -#: pg_test_timing.c:75 pg_test_timing.c:87 pg_test_timing.c:104 +#: pg_test_timing.c:81 +#, c-format +msgid "%s: invalid argument for option %s\n" +msgstr "%s: ogiltigt argument för flaggan %s\n" + +#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Försök med \"%s --help\" för mer information.\n" -#: pg_test_timing.c:85 +#: pg_test_timing.c:90 #, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: för många kommandoradsargument (första är \"%s\")\n" +msgid "%s: %s must be in range %u..%u\n" +msgstr "%s: %s måste vara i intervallet %u..%u\n" -#: pg_test_timing.c:94 +#: pg_test_timing.c:107 #, c-format -msgid "Testing timing overhead for %d second.\n" -msgid_plural "Testing timing overhead for %d seconds.\n" -msgstr[0] "Testar timingoverhead för %d sekund.\n" -msgstr[1] "Testar timingoverhead för %d sekunder.\n" +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: för många kommandoradsargument (första är \"%s\")\n" -#: pg_test_timing.c:102 +#: pg_test_timing.c:115 #, c-format -msgid "%s: duration must be a positive integer (duration is \"%d\")\n" -msgstr "%s: tiden måste vara ett positivt heltal (tiden är \"%d\")\n" +msgid "Testing timing overhead for %u second.\n" +msgid_plural "Testing timing overhead for %u seconds.\n" +msgstr[0] "Testar timingoverhead under %u sekund.\n" +msgstr[1] "Testar timingoverhead under %u sekunder.\n" -#: pg_test_timing.c:140 +#: pg_test_timing.c:151 #, c-format msgid "Detected clock going backwards in time.\n" msgstr "Upptäckte att klockan gått bakåt i tiden.\n" -#: pg_test_timing.c:141 +#: pg_test_timing.c:152 #, c-format msgid "Time warp: %d ms\n" msgstr "Tidsförskjutning: %d ms\n" -#: pg_test_timing.c:164 +#: pg_test_timing.c:175 #, c-format msgid "Per loop time including overhead: %0.2f ns\n" msgstr "Tid per varv inklusive overhead: %0.2f ns\n" -#: pg_test_timing.c:175 +#: pg_test_timing.c:186 msgid "< us" msgstr "< us" -#: pg_test_timing.c:176 +#: pg_test_timing.c:187 #, no-c-format msgid "% of total" msgstr "% av totalt" -#: pg_test_timing.c:177 +#: pg_test_timing.c:188 msgid "count" msgstr "antal" -#: pg_test_timing.c:186 +#: pg_test_timing.c:197 #, c-format msgid "Histogram of timing durations:\n" msgstr "Histogram över tider:\n" diff --git a/src/bin/pg_test_timing/po/uk.po b/src/bin/pg_test_timing/po/uk.po index c2b1aec65a..64395a3cfa 100644 --- a/src/bin/pg_test_timing/po/uk.po +++ b/src/bin/pg_test_timing/po/uk.po @@ -1,79 +1,85 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2018-12-04 20:35+0100\n" -"PO-Revision-Date: 2019-03-01 16:32\n" -"Last-Translator: pasha_golub \n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2021-06-10 08:47+0000\n" +"PO-Revision-Date: 2021-08-17 10:54\n" +"Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" -"X-Generator: crowdin.com\n" "X-Crowdin-Project: postgresql\n" +"X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_11_STABLE/src/bin/pg_test_timing/po/pg_test_timing.pot\n" +"X-Crowdin-File: /REL_14_DEV/pg_test_timing.pot\n" +"X-Crowdin-File-ID: 748\n" -#: pg_test_timing.c:55 +#: pg_test_timing.c:59 #, c-format msgid "Usage: %s [-d DURATION]\n" msgstr "Використання: %s [-d ТРИВАЛІСТЬ]\n" -#: pg_test_timing.c:75 pg_test_timing.c:87 pg_test_timing.c:104 +#: pg_test_timing.c:81 +#, c-format +msgid "%s: invalid argument for option %s\n" +msgstr "%s: неприпустимий аргумент для параметру %s\n" + +#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" -#: pg_test_timing.c:85 +#: pg_test_timing.c:90 #, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "" +msgid "%s: %s must be in range %u..%u\n" +msgstr "%s: %s має бути в діапазоні %u..%u\n" -#: pg_test_timing.c:94 +#: pg_test_timing.c:107 #, c-format -msgid "Testing timing overhead for %d second.\n" -msgid_plural "Testing timing overhead for %d seconds.\n" -msgstr[0] "Оцінка часових накладних витрат протягом %d секунди.\n" -msgstr[1] "Оцінка часових накладних витрат протягом %d секунд.\n" -msgstr[2] "Оцінка часових накладних витрат протягом %d секунд.\n" -msgstr[3] "Оцінка часових накладних витрат протягом %d секунд.\n" +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: забагато аргументів у командному рядку (перший \"%s\")\n" -#: pg_test_timing.c:102 +#: pg_test_timing.c:115 #, c-format -msgid "%s: duration must be a positive integer (duration is \"%d\")\n" -msgstr "%s: тривалість має бути додатним цілим числом (тривалість \"%d\")\n" +msgid "Testing timing overhead for %u second.\n" +msgid_plural "Testing timing overhead for %u seconds.\n" +msgstr[0] "Тестування накладних витрат часу на %u секунду.\n" +msgstr[1] "Тестування накладних витрат часу на %u секунди.\n" +msgstr[2] "Тестування накладних витрат часу на %u секунд.\n" +msgstr[3] "Тестування накладних витрат часу на %u секунд.\n" -#: pg_test_timing.c:140 +#: pg_test_timing.c:151 #, c-format msgid "Detected clock going backwards in time.\n" msgstr "Годинник іде в зворотньому напряму у минуле.\n" -#: pg_test_timing.c:141 +#: pg_test_timing.c:152 #, c-format msgid "Time warp: %d ms\n" msgstr "Зсув часу: %d мс\n" -#: pg_test_timing.c:164 +#: pg_test_timing.c:175 #, c-format msgid "Per loop time including overhead: %0.2f ns\n" msgstr "Час одного цикла, у тому числі накладні витрати: %0.2f нс\n" -#: pg_test_timing.c:175 +#: pg_test_timing.c:186 msgid "< us" msgstr "< мкс" -#: pg_test_timing.c:176 +#: pg_test_timing.c:187 #, no-c-format msgid "% of total" msgstr "% від загалу" -#: pg_test_timing.c:177 +#: pg_test_timing.c:188 msgid "count" msgstr "кількість" -#: pg_test_timing.c:186 +#: pg_test_timing.c:197 #, c-format msgid "Histogram of timing durations:\n" msgstr "Гістограмма тривалості замірів часу:\n" diff --git a/src/bin/pg_test_timing/po/zh_CN.po b/src/bin/pg_test_timing/po/zh_CN.po index 9259fcd7d7..10b5efc777 100644 --- a/src/bin/pg_test_timing/po/zh_CN.po +++ b/src/bin/pg_test_timing/po/zh_CN.po @@ -1,13 +1,13 @@ # LANGUAGE message translation file for pg_test_timing # Copyright (C) 2019 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_test_timing (PostgreSQL) package. -# FIRST AUTHOR , 2019. +# FIRST AUTHOR , 2019. # msgid "" msgstr "" "Project-Id-Version: pg_test_timing (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-06-09 21:17+0000\n" +"POT-Creation-Date: 2021-08-14 05:47+0000\n" "PO-Revision-Date: 2021-06-10 10:50+0800\n" "Last-Translator: Jie Zhang \n" "Language-Team: Chinese (Simplified) \n" @@ -23,6 +23,7 @@ msgid "Usage: %s [-d DURATION]\n" msgstr "用法: %s [-d 持续时间]\n" #: pg_test_timing.c:81 +#, c-format msgid "%s: invalid argument for option %s\n" msgstr "%s: 选项%s的参数无效\n" @@ -32,6 +33,7 @@ msgid "Try \"%s --help\" for more information.\n" msgstr "请用 \"%s --help\" 获取更多的信息.\n" #: pg_test_timing.c:90 +#, c-format msgid "%s: %s must be in range %u..%u\n" msgstr "%s: %s必须位于%u..%u的范围内\n" @@ -41,6 +43,7 @@ msgid "%s: too many command-line arguments (first is \"%s\")\n" msgstr "%s: 命令行参数太多 (第一个是 \"%s\")\n" #: pg_test_timing.c:115 +#, c-format msgid "Testing timing overhead for %u second.\n" msgid_plural "Testing timing overhead for %u seconds.\n" msgstr[0] "测试%u秒的计时开销.\n" diff --git a/src/bin/pg_upgrade/po/cs.po b/src/bin/pg_upgrade/po/cs.po index 9ffcaca49f..06698c5683 100644 --- a/src/bin/pg_upgrade/po/cs.po +++ b/src/bin/pg_upgrade/po/cs.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pg_upgrade (PostgreSQL) 11\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2020-10-31 16:15+0000\n" -"PO-Revision-Date: 2020-10-31 21:14+0100\n" +"PO-Revision-Date: 2021-09-16 09:14+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: cs\n" @@ -1117,7 +1117,7 @@ msgstr " -D, --new-datadir=DATADIR datový adresář nového clusteru\n" #: option.c:298 #, c-format msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n" -msgstr " -j, --jobs=NUM počet paralelních procesů nebo threadů\n" +msgstr " -j, --jobs=NUM počet paralelních procesů nebo threadů\n" #: option.c:299 #, c-format diff --git a/src/bin/pg_upgrade/po/de.po b/src/bin/pg_upgrade/po/de.po index dda800b88c..5cfbeb9de6 100644 --- a/src/bin/pg_upgrade/po/de.po +++ b/src/bin/pg_upgrade/po/de.po @@ -1,13 +1,13 @@ # German message translation file for pg_upgrade -# Copyright (C) 2021 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: pg_upgrade (PostgreSQL) 14\n" +"Project-Id-Version: pg_upgrade (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-12 17:47+0000\n" -"PO-Revision-Date: 2021-05-13 00:10+0200\n" +"POT-Creation-Date: 2022-05-16 04:48+0000\n" +"PO-Revision-Date: 2022-05-16 08:51+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: check.c:70 +#: check.c:71 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -24,7 +24,7 @@ msgstr "" "Führe Konsistenzprüfungen am alten laufenden Server durch\n" "---------------------------------------------------------\n" -#: check.c:76 +#: check.c:77 #, c-format msgid "" "Performing Consistency Checks\n" @@ -33,7 +33,7 @@ msgstr "" "Führe Konsistenzprüfungen durch\n" "-------------------------------\n" -#: check.c:213 +#: check.c:210 #, c-format msgid "" "\n" @@ -42,7 +42,7 @@ msgstr "" "\n" "*Cluster sind kompatibel*\n" -#: check.c:219 +#: check.c:216 #, c-format msgid "" "\n" @@ -54,7 +54,7 @@ msgstr "" "neuen Cluster neu mit initdb initialisieren, bevor fortgesetzt\n" "werden kann.\n" -#: check.c:262 +#: check.c:257 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -67,7 +67,7 @@ msgstr "" " %s/vacuumdb %s--all --analyze-in-stages\n" "\n" -#: check.c:268 +#: check.c:263 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -76,7 +76,7 @@ msgstr "" "Mit diesem Skript können die Dateien des alten Clusters gelöscht werden:\n" " %s\n" -#: check.c:273 +#: check.c:268 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -89,77 +89,83 @@ msgstr "" "Datenverzeichnis des neuen Clusters im alten Cluster-Verzeichnis\n" "liegen. Der Inhalt des alten Clusters muss von Hand gelöscht werden.\n" -#: check.c:285 +#: check.c:280 #, c-format msgid "Checking cluster versions" msgstr "Prüfe Cluster-Versionen" -#: check.c:297 -#, c-format -msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n" +#: check.c:292 +#, fuzzy, c-format +#| msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n" +msgid "This utility can only upgrade from PostgreSQL version 9.2 and later.\n" msgstr "Dieses Programm kann nur Upgrades von PostgreSQL Version 8.4 oder später durchführen.\n" -#: check.c:301 +#: check.c:296 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s.\n" msgstr "Dieses Programm kann nur Upgrades auf PostgreSQL Version %s durchführen.\n" -#: check.c:310 +#: check.c:305 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n" msgstr "Dieses Programm kann keine Downgrades auf ältere Hauptversionen von PostgreSQL durchführen.\n" -#: check.c:315 +#: check.c:310 #, c-format msgid "Old cluster data and binary directories are from different major versions.\n" msgstr "Die Daten- und Programmverzeichnisse des alten Clusters stammen von verschiedenen Hauptversionen.\n" -#: check.c:318 +#: check.c:313 #, c-format msgid "New cluster data and binary directories are from different major versions.\n" msgstr "Die Daten- und Programmverzeichnisse des neuen Clusters stammen von verschiedenen Hauptversionen.\n" -#: check.c:335 -#, c-format -msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n" -msgstr "Wenn ein laufender alter Server vor Version 9.1 geprüft wird, muss die Portnummer des alten Servers angegeben werden.\n" - -#: check.c:339 +#: check.c:328 #, c-format msgid "When checking a live server, the old and new port numbers must be different.\n" msgstr "Wenn ein laufender Server geprüft wird, müssen die alte und die neue Portnummer verschieden sein.\n" -#: check.c:354 +#: check.c:343 #, c-format msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "Kodierungen für Datenbank »%s« stimmen nicht überein: alt »%s«, neu »%s«\n" -#: check.c:359 +#: check.c:348 #, c-format msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "lc_collate-Werte für Datenbank »%s« stimmen nicht überein: alt »%s«, neu »%s«\n" -#: check.c:362 +#: check.c:351 #, c-format msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "lc_ctype-Werte für Datenbank »%s« stimmen nicht überein: alt »%s«, neu »%s«\n" -#: check.c:435 +#: check.c:354 +#, c-format +msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n" +msgstr "Locale-Provider für Datenbank »%s« stimmen nicht überein: alt »%s«, neu »%s«\n" + +#: check.c:361 +#, c-format +msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" +msgstr "ICU-Locale-Werte für Datenbank »%s« stimmen nicht überein: alt »%s«, neu »%s«\n" + +#: check.c:436 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" msgstr "Datenbank »%s« im neuen Cluster ist nicht leer: Relation »%s.%s« gefunden\n" -#: check.c:492 +#: check.c:488 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Prüfe Tablespace-Verzeichnisse des neuen Clusters" -#: check.c:503 +#: check.c:499 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"\n" msgstr "Tablespace-Verzeichnis für neuen Cluster existiert bereits: »%s«\n" -#: check.c:536 +#: check.c:532 #, c-format msgid "" "\n" @@ -168,7 +174,7 @@ msgstr "" "\n" "WARNUNG: das neue Datenverzeichnis sollte nicht im alten Datenverzeichnis liegen, z.B. %s\n" -#: check.c:560 +#: check.c:556 #, c-format msgid "" "\n" @@ -177,84 +183,94 @@ msgstr "" "\n" "WARNUNG: benutzerdefinierte Tablespace-Pfade sollten nicht im Datenverzeichnis liegen, z.B. %s\n" -#: check.c:570 +#: check.c:566 #, c-format msgid "Creating script to delete old cluster" msgstr "Erzeuge Skript zum Löschen des alten Clusters" -#: check.c:573 check.c:837 check.c:935 check.c:1014 check.c:1276 file.c:336 -#: function.c:240 option.c:497 version.c:54 version.c:204 version.c:376 +#: check.c:569 check.c:744 check.c:864 check.c:963 check.c:1043 check.c:1306 +#: file.c:336 function.c:165 option.c:465 version.c:116 version.c:288 +#: version.c:423 #, c-format msgid "could not open file \"%s\": %s\n" msgstr "konnte Datei »%s« nicht öffnen: %s\n" -#: check.c:629 +#: check.c:620 #, c-format msgid "could not add execute permission to file \"%s\": %s\n" msgstr "konnte Datei »%s« nicht ausführbar machen: %s\n" -#: check.c:649 +#: check.c:640 #, c-format msgid "Checking database user is the install user" msgstr "Prüfe ob der Datenbankbenutzer der Installationsbenutzer ist" -#: check.c:665 +#: check.c:656 #, c-format msgid "database user \"%s\" is not the install user\n" msgstr "Datenbankbenutzer »%s« ist nicht der Installationsbenutzer\n" -#: check.c:676 +#: check.c:667 #, c-format msgid "could not determine the number of users\n" msgstr "konnte die Anzahl der Benutzer nicht ermitteln\n" -#: check.c:684 +#: check.c:675 #, c-format msgid "Only the install user can be defined in the new cluster.\n" msgstr "Nur der Installationsbenutzer darf im neuen Cluster definiert sein.\n" -#: check.c:704 +#: check.c:705 #, c-format msgid "Checking database connection settings" msgstr "Prüfe Verbindungseinstellungen der Datenbank" -#: check.c:726 +#: check.c:731 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n" msgstr "template0 darf keine Verbindungen erlauben, d.h. ihr pg_database.datallowconn muss falsch sein\n" -#: check.c:736 +#: check.c:761 check.c:886 check.c:988 check.c:1065 check.c:1122 check.c:1181 +#: check.c:1210 check.c:1329 function.c:187 version.c:190 version.c:228 +#: version.c:372 #, c-format -msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n" -msgstr "Alle Datenbanken außer template0 müssen Verbindungen erlauben, d.h. ihr pg_database.datallowconn muss wahr sein\n" +msgid "fatal\n" +msgstr "fatal\n" + +#: check.c:762 +#, c-format +msgid "" +"All non-template0 databases must allow connections, i.e. their\n" +"pg_database.datallowconn must be true. Your installation contains\n" +"non-template0 databases with their pg_database.datallowconn set to\n" +"false. Consider allowing connection for all non-template0 databases\n" +"or drop the databases which do not allow connections. A list of\n" +"databases with the problem is in the file:\n" +" %s\n" +"\n" +msgstr "" -#: check.c:761 +#: check.c:787 #, c-format msgid "Checking for prepared transactions" msgstr "Prüfe auf vorbereitete Transaktionen" -#: check.c:770 +#: check.c:796 #, c-format msgid "The source cluster contains prepared transactions\n" msgstr "Der alte Cluster enthält vorbereitete Transaktionen\n" -#: check.c:772 +#: check.c:798 #, c-format msgid "The target cluster contains prepared transactions\n" msgstr "Der neue Cluster enthält vorbereitete Transaktionen\n" -#: check.c:798 +#: check.c:824 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Prüfe auf contrib/isn mit unpassender bigint-Übergabe" -#: check.c:859 check.c:960 check.c:1036 check.c:1093 check.c:1152 check.c:1181 -#: check.c:1299 function.c:262 version.c:278 version.c:316 version.c:460 -#, c-format -msgid "fatal\n" -msgstr "fatal\n" - -#: check.c:860 +#: check.c:887 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -276,12 +292,12 @@ msgstr "" " %s\n" "\n" -#: check.c:883 +#: check.c:910 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Prüfe auf benutzerdefinierte Postfix-Operatoren" -#: check.c:961 +#: check.c:989 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -298,12 +314,12 @@ msgstr "" " %s\n" "\n" -#: check.c:982 +#: check.c:1010 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Prüfe auf Tabellen mit WITH OIDS" -#: check.c:1037 +#: check.c:1066 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -320,12 +336,12 @@ msgstr "" " %s\n" "\n" -#: check.c:1065 +#: check.c:1094 #, c-format msgid "Checking for system-defined composite types in user tables" msgstr "Prüfe auf systemdefinierte zusammengesetzte Typen in Benutzertabellen" -#: check.c:1094 +#: check.c:1123 #, c-format msgid "" "Your installation contains system-defined composite type(s) in user tables.\n" @@ -345,12 +361,12 @@ msgstr "" " %s\n" "\n" -#: check.c:1122 +#: check.c:1151 #, c-format msgid "Checking for reg* data types in user tables" msgstr "Prüfe auf reg*-Datentypen in Benutzertabellen" -#: check.c:1153 +#: check.c:1182 #, c-format msgid "" "Your installation contains one of the reg* data types in user tables.\n" @@ -370,12 +386,12 @@ msgstr "" " %s\n" "\n" -#: check.c:1175 +#: check.c:1204 #, c-format msgid "Checking for incompatible \"jsonb\" data type" msgstr "Prüfe auf inkompatiblen Datentyp »jsonb«" -#: check.c:1182 +#: check.c:1211 #, c-format msgid "" "Your installation contains the \"jsonb\" data type in user tables.\n" @@ -394,27 +410,27 @@ msgstr "" " %s\n" "\n" -#: check.c:1204 +#: check.c:1233 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Prüfe auf Rollen, die mit »pg_« anfangen" -#: check.c:1214 +#: check.c:1243 #, c-format msgid "The source cluster contains roles starting with \"pg_\"\n" msgstr "Der alte Cluster enthält Rollen, die mit »pg_« anfangen\n" -#: check.c:1216 +#: check.c:1245 #, c-format msgid "The target cluster contains roles starting with \"pg_\"\n" msgstr "Der neue Cluster enthält Rollen, die mit »pg_« anfangen\n" -#: check.c:1237 +#: check.c:1266 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "Prüfe auf benutzerdefinierte Kodierungsumwandlungen" -#: check.c:1300 +#: check.c:1330 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -435,189 +451,194 @@ msgstr "" " %s\n" "\n" -#: check.c:1327 +#: check.c:1357 #, c-format msgid "failed to get the current locale\n" msgstr "konnte aktuelle Locale nicht ermitteln\n" -#: check.c:1336 +#: check.c:1366 #, c-format msgid "failed to get system locale name for \"%s\"\n" msgstr "konnte System-Locale-Namen für »%s« nicht ermitteln\n" -#: check.c:1342 +#: check.c:1372 #, c-format msgid "failed to restore old locale \"%s\"\n" msgstr "konnte alte Locale »%s« nicht wiederherstellen\n" -#: controldata.c:127 controldata.c:195 +#: controldata.c:128 controldata.c:196 #, c-format msgid "could not get control data using %s: %s\n" msgstr "konnte Kontrolldaten mit %s nicht ermitteln: %s\n" -#: controldata.c:138 +#: controldata.c:139 #, c-format msgid "%d: database cluster state problem\n" msgstr "%d: Problem mit dem Zustand des Clusters\n" -#: controldata.c:156 +#: controldata.c:157 #, c-format msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" msgstr "Der alte Cluster wurde im Wiederherstellungsmodus heruntergefahren. Um ihn zu aktualisieren, verwenden Sie »rsync« wie in der Dokumentation beschrieben oder fahren Sie ihn im Primärmodus herunter.\n" -#: controldata.c:158 +#: controldata.c:159 #, c-format msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" msgstr "Der neue Cluster wurde im Wiederherstellungsmodus heruntergefahren. Um ihn zu aktualisieren, verwenden Sie »rsync« wie in der Dokumentation beschrieben oder fahren Sie ihn im Primärmodus herunter.\n" -#: controldata.c:163 +#: controldata.c:164 #, c-format msgid "The source cluster was not shut down cleanly.\n" msgstr "Der alte Cluster wurde nicht sauber heruntergefahren.\n" -#: controldata.c:165 +#: controldata.c:166 #, c-format msgid "The target cluster was not shut down cleanly.\n" msgstr "Der neue Cluster wurde nicht sauber heruntergefahren.\n" -#: controldata.c:176 +#: controldata.c:177 #, c-format msgid "The source cluster lacks cluster state information:\n" msgstr "Im alten Cluster fehlen Cluster-Zustandsinformationen:\n" -#: controldata.c:178 +#: controldata.c:179 #, c-format msgid "The target cluster lacks cluster state information:\n" msgstr "Im neuen Cluster fehlen Cluster-Zustandsinformationen:\n" -#: controldata.c:208 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371 -#: relfilenode.c:243 server.c:33 util.c:79 +#: controldata.c:209 dump.c:50 pg_upgrade.c:402 pg_upgrade.c:439 +#: relfilenode.c:231 server.c:34 #, c-format msgid "%s" msgstr "%s" -#: controldata.c:215 +#: controldata.c:216 #, c-format msgid "%d: pg_resetwal problem\n" msgstr "%d: Problem mit pg_resetwal\n" -#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257 -#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309 -#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345 -#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382 -#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426 -#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470 -#: controldata.c:481 +#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258 +#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310 +#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354 +#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383 +#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427 +#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471 +#: controldata.c:482 controldata.c:493 #, c-format msgid "%d: controldata retrieval problem\n" msgstr "%d: Problem beim Ermitteln der Kontrolldaten\n" -#: controldata.c:560 +#: controldata.c:572 #, c-format msgid "The source cluster lacks some required control information:\n" msgstr "Im alten Cluster fehlen einige notwendige Kontrollinformationen:\n" -#: controldata.c:563 +#: controldata.c:575 #, c-format msgid "The target cluster lacks some required control information:\n" msgstr "Im neuen Cluster fehlen einige notwendige Kontrollinformationen:\n" -#: controldata.c:566 +#: controldata.c:578 #, c-format msgid " checkpoint next XID\n" msgstr " Checkpoint nächste XID\n" -#: controldata.c:569 +#: controldata.c:581 #, c-format msgid " latest checkpoint next OID\n" msgstr " NextOID des letzten Checkpoints\n" -#: controldata.c:572 +#: controldata.c:584 #, c-format msgid " latest checkpoint next MultiXactId\n" msgstr " NextMultiXactId des letzten Checkpoints\n" -#: controldata.c:576 +#: controldata.c:588 #, c-format msgid " latest checkpoint oldest MultiXactId\n" msgstr " oldestMultiXid des letzten Checkpoints\n" -#: controldata.c:579 +#: controldata.c:591 +#, c-format +msgid " latest checkpoint oldestXID\n" +msgstr " oldestXID des letzten Checkpoints\n" + +#: controldata.c:594 #, c-format msgid " latest checkpoint next MultiXactOffset\n" msgstr " NextMultiOffset des letzten Checkpoints\n" -#: controldata.c:582 +#: controldata.c:597 #, c-format msgid " first WAL segment after reset\n" msgstr " erstes WAL-Segment nach dem Reset\n" -#: controldata.c:585 +#: controldata.c:600 #, c-format msgid " float8 argument passing method\n" msgstr " Übergabe von Float8-Argumenten\n" -#: controldata.c:588 +#: controldata.c:603 #, c-format msgid " maximum alignment\n" msgstr " maximale Ausrichtung (Alignment)\n" -#: controldata.c:591 +#: controldata.c:606 #, c-format msgid " block size\n" msgstr " Blockgröße\n" -#: controldata.c:594 +#: controldata.c:609 #, c-format msgid " large relation segment size\n" msgstr " Segmentgröße für große Relationen\n" -#: controldata.c:597 +#: controldata.c:612 #, c-format msgid " WAL block size\n" msgstr " WAL-Blockgröße\n" -#: controldata.c:600 +#: controldata.c:615 #, c-format msgid " WAL segment size\n" msgstr " WAL-Segmentgröße\n" -#: controldata.c:603 +#: controldata.c:618 #, c-format msgid " maximum identifier length\n" msgstr " maximale Bezeichnerlänge\n" -#: controldata.c:606 +#: controldata.c:621 #, c-format msgid " maximum number of indexed columns\n" msgstr " maximale Anzahl indizierter Spalten\n" -#: controldata.c:609 +#: controldata.c:624 #, c-format msgid " maximum TOAST chunk size\n" msgstr " maximale TOAST-Chunk-Größe\n" -#: controldata.c:613 +#: controldata.c:628 #, c-format msgid " large-object chunk size\n" msgstr " Large-Object-Chunk-Größe\n" -#: controldata.c:616 +#: controldata.c:631 #, c-format msgid " dates/times are integers?\n" msgstr " Datum/Zeit sind Ganzzahlen?\n" -#: controldata.c:620 +#: controldata.c:635 #, c-format msgid " data checksum version\n" msgstr " Datenprüfsummenversion\n" -#: controldata.c:622 +#: controldata.c:637 #, c-format msgid "Cannot continue without required control information, terminating\n" msgstr "Kann ohne die benötigten Kontrollinformationen nicht fortsetzen, Programm wird beendet\n" -#: controldata.c:637 +#: controldata.c:652 #, c-format msgid "" "old and new pg_controldata alignments are invalid or do not match\n" @@ -626,77 +647,77 @@ msgstr "" "altes und neues Alignment in pg_controldata ist ungültig oder stimmt nicht überein\n" "Wahrscheinlich ist ein Cluster eine 32-Bit-Installation und der andere 64-Bit\n" -#: controldata.c:641 +#: controldata.c:656 #, c-format msgid "old and new pg_controldata block sizes are invalid or do not match\n" msgstr "alte und neue Blockgrößen von pg_controldata sind ungültig oder stimmen nicht überein\n" -#: controldata.c:644 +#: controldata.c:659 #, c-format msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n" msgstr "alte und neue maximale Relationssegmentgrößen von pg_controldata sind ungültig oder stimmen nicht überein\n" -#: controldata.c:647 +#: controldata.c:662 #, c-format msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n" msgstr "alte und neue WAL-Blockgrößen von pg_controldata sind ungültig oder stimmen nicht überein\n" -#: controldata.c:650 +#: controldata.c:665 #, c-format msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n" msgstr "alte und neue WAL-Segmentgrößen von pg_controldata sind ungültig oder stimmen nicht überein\n" -#: controldata.c:653 +#: controldata.c:668 #, c-format msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n" msgstr "alte und neue maximale Bezeichnerlängen von pg_controldata sind ungültig oder stimmen nicht überein\n" -#: controldata.c:656 +#: controldata.c:671 #, c-format msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n" msgstr "alte und neue Maximalzahlen indizierter Spalten von pg_controldata sind ungültig oder stimmen nicht überein\n" -#: controldata.c:659 +#: controldata.c:674 #, c-format msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n" msgstr "alte und neue maximale TOAST-Chunk-Größen von pg_controldata sind ungültig oder stimmen nicht überein\n" -#: controldata.c:664 +#: controldata.c:679 #, c-format msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n" msgstr "alte und neue Large-Object-Chunk-Größen von pg_controldata sind ungültig oder stimmen nicht überein\n" -#: controldata.c:667 +#: controldata.c:682 #, c-format msgid "old and new pg_controldata date/time storage types do not match\n" msgstr "alte und neue Speicherung von Datums- und Zeittypen von pg_controldata ist ungültig oder stimmt nicht überein\n" -#: controldata.c:680 +#: controldata.c:695 #, c-format msgid "old cluster does not use data checksums but the new one does\n" msgstr "der alte Cluster verwendet keine Datenprüfsummen, aber der neue verwendet sie\n" -#: controldata.c:683 +#: controldata.c:698 #, c-format msgid "old cluster uses data checksums but the new one does not\n" msgstr "die alte Cluster verwendet Datenprüfsummen, aber der neue nicht\n" -#: controldata.c:685 +#: controldata.c:700 #, c-format msgid "old and new cluster pg_controldata checksum versions do not match\n" msgstr "Prüfsummenversionen im alten und neuen Cluster stimmen nicht überein\n" -#: controldata.c:696 +#: controldata.c:711 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "Füge Endung ».old« an altes global/pg_control an" -#: controldata.c:701 +#: controldata.c:716 #, c-format msgid "Unable to rename %s to %s.\n" msgstr "Konnte %s nicht in %s umbenennen.\n" -#: controldata.c:704 +#: controldata.c:719 #, c-format msgid "" "\n" @@ -718,11 +739,6 @@ msgstr "" msgid "Creating dump of global objects" msgstr "Erzeuge Dump der globalen Objekte" -#: dump.c:31 -#, c-format -msgid "Creating dump of database schemas\n" -msgstr "Erzeuge Dump der Datenbankschemas\n" - #: exec.c:45 #, c-format msgid "could not get pg_ctl version data using %s: %s\n" @@ -733,22 +749,22 @@ msgstr "konnte pg_ctl-Versionsdaten mit %s nicht ermitteln: %s\n" msgid "could not get pg_ctl version output from %s\n" msgstr "konnte pg_ctl-Version nicht ermitteln von %s\n" -#: exec.c:105 exec.c:109 +#: exec.c:108 exec.c:112 #, c-format msgid "command too long\n" msgstr "Befehl zu lang\n" -#: exec.c:111 util.c:37 util.c:225 +#: exec.c:114 util.c:37 util.c:265 #, c-format msgid "%s\n" msgstr "%s\n" -#: exec.c:150 option.c:217 +#: exec.c:153 pg_upgrade.c:242 #, c-format msgid "could not open log file \"%s\": %m\n" msgstr "konnte Logdatei »%s« nicht öffnen: %m\n" -#: exec.c:179 +#: exec.c:182 #, c-format msgid "" "\n" @@ -757,12 +773,12 @@ msgstr "" "\n" "*fehlgeschlagen*" -#: exec.c:182 +#: exec.c:185 #, c-format msgid "There were problems executing \"%s\"\n" msgstr "Probleme beim Ausführen von »%s«\n" -#: exec.c:185 +#: exec.c:188 #, c-format msgid "" "Consult the last few lines of \"%s\" or \"%s\" for\n" @@ -771,7 +787,7 @@ msgstr "" "Prüfen Sie die letzten Zeilen von »%s« oder »%s« für den\n" "wahrscheinlichen Grund für das Scheitern.\n" -#: exec.c:190 +#: exec.c:193 #, c-format msgid "" "Consult the last few lines of \"%s\" for\n" @@ -780,47 +796,47 @@ msgstr "" "Prüfen Sie die letzten Zeilen von »%s« für den\n" "wahrscheinlichen Grund für das Scheitern.\n" -#: exec.c:205 option.c:226 +#: exec.c:208 pg_upgrade.c:250 #, c-format msgid "could not write to log file \"%s\": %m\n" msgstr "konnte nicht in Logdatei »%s «schreiben: %m\n" -#: exec.c:231 +#: exec.c:234 #, c-format msgid "could not open file \"%s\" for reading: %s\n" msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %s\n" -#: exec.c:258 +#: exec.c:261 #, c-format msgid "You must have read and write access in the current directory.\n" msgstr "Sie müssen Lese- und Schreibzugriff im aktuellen Verzeichnis haben.\n" -#: exec.c:311 exec.c:377 +#: exec.c:314 exec.c:380 #, c-format msgid "check for \"%s\" failed: %s\n" msgstr "Prüfen von »%s« fehlgeschlagen: %s\n" -#: exec.c:314 exec.c:380 +#: exec.c:317 exec.c:383 #, c-format msgid "\"%s\" is not a directory\n" msgstr "»%s« ist kein Verzeichnis\n" -#: exec.c:430 +#: exec.c:433 #, c-format msgid "check for \"%s\" failed: not a regular file\n" msgstr "Prüfen von »%s« fehlgeschlagen: keine reguläre Datei\n" -#: exec.c:433 +#: exec.c:436 #, c-format msgid "check for \"%s\" failed: cannot execute (permission denied)\n" msgstr "Prüfen von »%s« fehlgeschlagen: kann nicht ausgeführt werden (keine Berechtigung)\n" -#: exec.c:439 +#: exec.c:442 #, c-format msgid "check for \"%s\" failed: cannot execute\n" msgstr "Prüfen von »%s« fehlgeschlagen: kann nicht ausgeführt werden\n" -#: exec.c:449 +#: exec.c:452 #, c-format msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n" msgstr "Prüfen von »%s« fehlgeschlagen: falsche Version: gefunden »%s«, erwartet »%s«\n" @@ -904,73 +920,22 @@ msgstr "" "konnte Hard-Link-Verknüpfung zwischen altem und neuen Datenverzeichnis nicht erzeugen: %s\n" "Im Link-Modus müssen das alte und das neue Datenverzeichnis im selben Dateisystem liegen.\n" -#: function.c:114 -#, c-format -msgid "" -"\n" -"The old cluster has a \"plpython_call_handler\" function defined\n" -"in the \"public\" schema which is a duplicate of the one defined\n" -"in the \"pg_catalog\" schema. You can confirm this by executing\n" -"in psql:\n" -"\n" -" \\df *.plpython_call_handler\n" -"\n" -"The \"public\" schema version of this function was created by a\n" -"pre-8.1 install of plpython, and must be removed for pg_upgrade\n" -"to complete because it references a now-obsolete \"plpython\"\n" -"shared object file. You can remove the \"public\" schema version\n" -"of this function by running the following command:\n" -"\n" -" DROP FUNCTION public.plpython_call_handler()\n" -"\n" -"in each affected database:\n" -"\n" -msgstr "" -"\n" -"Der alte Cluster hat eine Funktion »plpython_call_handler« definiert\n" -"im Schema »public«, die eine Duplikat der im Schema »pg_catalog«\n" -"definierten ist. Sie können das bestätigen, indem Sie dies in psql\n" -"ausführen:\n" -"\n" -" \\df *.plpython_call_handler\n" -"\n" -"Die Version im Schema »public« wurde von einer Installation von\n" -"plpython vor Version 8.1 erzeugt und muss entfernt werden, damit\n" -"pg_upgrade fortsetzen kann, weil sie auf die mittlerweile obsolete\n" -"Shared-Object-Datei »plpython« verweist. Sie können die Version dieser\n" -"Funktion im Schema »public« entfernen, indem Sie den Befehl\n" -"\n" -" DROP FUNCTION public.plpython_call_handler()\n" -"\n" -"in jeder betroffenen Datenbank ausführen:\n" -"\n" - -#: function.c:132 -#, c-format -msgid " %s\n" -msgstr " %s\n" - -#: function.c:142 -#, c-format -msgid "Remove the problem functions from the old cluster to continue.\n" -msgstr "Entfernen Sie die problematischen Funktionen aus dem alten Cluster um fortzufahren.\n" - -#: function.c:189 +#: function.c:129 #, c-format msgid "Checking for presence of required libraries" msgstr "Prüfe das Vorhandensein benötigter Bibliotheken" -#: function.c:242 +#: function.c:167 #, c-format msgid "could not load library \"%s\": %s" msgstr "konnte Bibliothek »%s« nicht laden: %s" -#: function.c:253 +#: function.c:178 #, c-format msgid "In database: %s\n" msgstr "In Datenbank: %s\n" -#: function.c:263 +#: function.c:188 #, c-format msgid "" "Your installation references loadable libraries that are missing from the\n" @@ -988,66 +953,47 @@ msgstr "" " %s\n" "\n" -#: info.c:131 +#: info.c:125 #, c-format msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n" msgstr "Relationsnamen für OID %u in Datenbank »%s« stimmen nicht überein: alten Name »%s.%s«, neuer Name »%s.%s«\n" -#: info.c:151 +#: info.c:145 #, c-format msgid "Failed to match up old and new tables in database \"%s\"\n" msgstr "Alte und neue Tabellen in Datenbank »%s« konnten nicht gepaart werden\n" -#: info.c:240 +#: info.c:226 #, c-format msgid " which is an index on \"%s.%s\"" msgstr ", ein Index für »%s.%s«" -#: info.c:250 +#: info.c:236 #, c-format msgid " which is an index on OID %u" msgstr ", ein Index für OID %u" -#: info.c:262 +#: info.c:248 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr ", eine TOAST-Tabelle für »%s.%s«" -#: info.c:270 +#: info.c:256 #, c-format msgid " which is the TOAST table for OID %u" msgstr ", eine TOAST-Tabelle für OID %u" -#: info.c:274 +#: info.c:260 #, c-format msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n" msgstr "Keine Übereinstimmung gefunden im alten Cluster für neue Relation mit OID %u in Datenbank »%s«: %s\n" -#: info.c:277 +#: info.c:263 #, c-format msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n" msgstr "Keine Übereinstimmung gefunden im neuen Cluster für alte Relation mit OID %u in Datenbank »%s«: %s\n" -#: info.c:289 -#, c-format -msgid "mappings for database \"%s\":\n" -msgstr "Paarungen für Datenbank »%s«:\n" - -#: info.c:292 -#, c-format -msgid "%s.%s: %u to %u\n" -msgstr "%s.%s: %u nach %u\n" - -#: info.c:297 info.c:633 -#, c-format -msgid "" -"\n" -"\n" -msgstr "" -"\n" -"\n" - -#: info.c:322 +#: info.c:287 #, c-format msgid "" "\n" @@ -1056,7 +1002,7 @@ msgstr "" "\n" "Quelldatenbanken:\n" -#: info.c:324 +#: info.c:289 #, c-format msgid "" "\n" @@ -1065,77 +1011,86 @@ msgstr "" "\n" "Zieldatenbanken:\n" -#: info.c:631 +#: info.c:605 #, c-format msgid "Database: %s\n" msgstr "Datenbank: %s\n" -#: info.c:644 +#: info.c:607 +#, c-format +msgid "" +"\n" +"\n" +msgstr "" +"\n" +"\n" + +#: info.c:618 #, c-format msgid "relname: %s.%s: reloid: %u reltblspace: %s\n" msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n" -#: option.c:102 +#: option.c:100 #, c-format msgid "%s: cannot be run as root\n" msgstr "%s: kann nicht als root ausgeführt werden\n" -#: option.c:170 +#: option.c:167 #, c-format msgid "invalid old port number\n" msgstr "ungültige alte Portnummer\n" -#: option.c:175 +#: option.c:172 #, c-format msgid "invalid new port number\n" msgstr "ungültige neue Portnummer\n" -#: option.c:207 +#: option.c:198 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" -#: option.c:214 +#: option.c:205 #, c-format msgid "too many command-line arguments (first is \"%s\")\n" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)\n" -#: option.c:220 +#: option.c:208 #, c-format msgid "Running in verbose mode\n" msgstr "Ausführung im Verbose-Modus\n" -#: option.c:251 +#: option.c:226 msgid "old cluster binaries reside" msgstr "die Programmdateien des alten Clusters liegen" -#: option.c:253 +#: option.c:228 msgid "new cluster binaries reside" msgstr "die Programmdateien des neuen Clusters liegen" -#: option.c:255 +#: option.c:230 msgid "old cluster data resides" msgstr "die Daten das alten Clusters liegen" -#: option.c:257 +#: option.c:232 msgid "new cluster data resides" msgstr "die Daten des neuen Clusters liegen" -#: option.c:259 +#: option.c:234 msgid "sockets will be created" msgstr "die Sockets erzeugt werden sollen" -#: option.c:276 option.c:374 +#: option.c:251 option.c:350 #, c-format msgid "could not determine current directory\n" msgstr "konnte aktuelles Verzeichnis nicht ermitteln\n" -#: option.c:279 +#: option.c:254 #, c-format msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n" msgstr "auf Windows kann pg_upgrade nicht von innerhalb des Cluster-Datenverzeichnisses ausgeführt werden\n" -#: option.c:288 +#: option.c:263 #, c-format msgid "" "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n" @@ -1144,12 +1099,12 @@ msgstr "" "pg_upgrade aktualisiert einen PostgreSQL-Cluster auf eine neue Hauptversion.\n" "\n" -#: option.c:289 +#: option.c:264 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: option.c:290 +#: option.c:265 #, c-format msgid "" " pg_upgrade [OPTION]...\n" @@ -1158,17 +1113,17 @@ msgstr "" " pg_upgrade [OPTION]...\n" "\n" -#: option.c:291 +#: option.c:266 #, c-format msgid "Options:\n" msgstr "Optionen:\n" -#: option.c:292 +#: option.c:267 #, c-format msgid " -b, --old-bindir=BINDIR old cluster executable directory\n" msgstr " -b, --old-bindir=BINVERZ Programmverzeichnis des alten Clusters\n" -#: option.c:293 +#: option.c:268 #, c-format msgid "" " -B, --new-bindir=BINDIR new cluster executable directory (default\n" @@ -1177,87 +1132,94 @@ msgstr "" " -B, --new-bindir=BINVERZ Programmverzeichnis des neuen Clusters\n" " (Standard: gleiches Verzeichnis wie pg_upgrade)\n" -#: option.c:295 +#: option.c:270 #, c-format msgid " -c, --check check clusters only, don't change any data\n" msgstr " -c, --check nur Cluster prüfen, keine Daten ändern\n" -#: option.c:296 +#: option.c:271 #, c-format msgid " -d, --old-datadir=DATADIR old cluster data directory\n" msgstr " -d, --old-datadir=DATENVERZ Datenverzeichnis des alten Clusters\n" -#: option.c:297 +#: option.c:272 #, c-format msgid " -D, --new-datadir=DATADIR new cluster data directory\n" msgstr " -D, --new-datadir=DATENVERZ Datenverzeichnis des neuen Clusters\n" -#: option.c:298 +#: option.c:273 #, c-format msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n" msgstr " -j, --jobs=NUM Anzahl paralleler Prozesse oder Threads\n" -#: option.c:299 +#: option.c:274 #, c-format msgid " -k, --link link instead of copying files to new cluster\n" msgstr " -k, --link Dateien in den neuen Cluster verknüpfen statt kopieren\n" -#: option.c:300 +#: option.c:275 +#, c-format +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr "" +" -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n" +" geschrieben sind\n" + +#: option.c:276 #, c-format msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n" msgstr " -o, --old-options=OPTIONEN Serveroptionen für den alten Cluster\n" -#: option.c:301 +#: option.c:277 #, c-format msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n" msgstr " -O, --new-options=OPTIONEN Serveroptionen für den neuen Cluster\n" -#: option.c:302 +#: option.c:278 #, c-format msgid " -p, --old-port=PORT old cluster port number (default %d)\n" msgstr " -p, --old-port=PORT Portnummer für den alten Cluster (Standard: %d)\n" -#: option.c:303 +#: option.c:279 #, c-format msgid " -P, --new-port=PORT new cluster port number (default %d)\n" msgstr " -P, --new-port=PORT Portnummer für den neuen Cluster (Standard: %d)\n" -#: option.c:304 +#: option.c:280 #, c-format msgid " -r, --retain retain SQL and log files after success\n" msgstr " -r, --retain SQL- und Logdateien bei Erfolg aufheben\n" -#: option.c:305 +#: option.c:281 #, c-format msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" msgstr " -s, --socketdir=VERZ Verzeichnis für Socket (Standard: aktuelles Verz.)\n" -#: option.c:306 +#: option.c:282 #, c-format msgid " -U, --username=NAME cluster superuser (default \"%s\")\n" msgstr " -U, --username=NAME Cluster-Superuser (Standard: »%s«)\n" -#: option.c:307 +#: option.c:283 #, c-format msgid " -v, --verbose enable verbose internal logging\n" msgstr " -v, --verbose »Verbose«-Modus einschalten\n" -#: option.c:308 +#: option.c:284 #, c-format msgid " -V, --version display version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: option.c:309 +#: option.c:285 #, c-format msgid " --clone clone instead of copying files to new cluster\n" msgstr " --clone Dateien in den neuen Cluster klonen statt kopieren\n" -#: option.c:310 +#: option.c:286 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: option.c:311 +#: option.c:287 #, c-format msgid "" "\n" @@ -1272,7 +1234,7 @@ msgstr "" " den Postmaster für den alten Cluster anhalten\n" " den Postmaster für den neuen Cluster anhalten\n" -#: option.c:316 +#: option.c:292 #, c-format msgid "" "\n" @@ -1289,7 +1251,7 @@ msgstr "" " das »bin«-Verzeichnis der alten Version (-b BINVERZ)\n" " das »bin«-Verzeichnis der neuen Version (-B BINVERZ)\n" -#: option.c:322 +#: option.c:298 #, c-format msgid "" "\n" @@ -1302,7 +1264,7 @@ msgstr "" " pg_upgrade -d alterCluster/data -D neuerCluster/data -b alterCluster/bin -B neuerCluster/bin\n" "oder\n" -#: option.c:327 +#: option.c:303 #, c-format msgid "" " $ export PGDATAOLD=oldCluster/data\n" @@ -1317,7 +1279,7 @@ msgstr "" " $ export PGBINNEW=neuerCluster/bin\n" " $ pg_upgrade\n" -#: option.c:333 +#: option.c:309 #, c-format msgid "" " C:\\> set PGDATAOLD=oldCluster/data\n" @@ -1332,7 +1294,7 @@ msgstr "" " C:\\> set PGBINNEW=neuerCluster/bin\n" " C:\\> pg_upgrade\n" -#: option.c:339 +#: option.c:315 #, c-format msgid "" "\n" @@ -1341,12 +1303,12 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: option.c:340 +#: option.c:316 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: option.c:380 +#: option.c:356 #, c-format msgid "" "You must identify the directory where the %s.\n" @@ -1355,27 +1317,27 @@ msgstr "" "Sie müssen das Verzeichnis angeben, wo %s.\n" "Bitte verwenden Sie die Kommandzeilenoption %s oder die Umgebungsvariable %s.\n" -#: option.c:432 +#: option.c:408 #, c-format msgid "Finding the real data directory for the source cluster" msgstr "Suche das tatsächliche Datenverzeichnis des alten Clusters" -#: option.c:434 +#: option.c:410 #, c-format msgid "Finding the real data directory for the target cluster" msgstr "Suche das tatsächliche Datenverzeichnis des neuen Clusters" -#: option.c:446 +#: option.c:422 #, c-format msgid "could not get data directory using %s: %s\n" msgstr "konnte Datenverzeichnis mit %s nicht ermitteln: %s\n" -#: option.c:505 +#: option.c:473 #, c-format msgid "could not read line %d from file \"%s\": %s\n" msgstr "konnte Zeile %d aus Datei »%s« nicht lesen: %s\n" -#: option.c:522 +#: option.c:490 #, c-format msgid "user-supplied old port number %hu corrected to %hu\n" msgstr "vom Benutzer angegebene Portnummer %hu wurde auf %hu korrigiert\n" @@ -1405,12 +1367,12 @@ msgstr "Kindprozess wurde abnormal beendet: Status %d\n" msgid "child worker exited abnormally: %s\n" msgstr "Kindprozess wurde abnormal beendet: %s\n" -#: pg_upgrade.c:107 +#: pg_upgrade.c:103 #, c-format msgid "could not read permissions of directory \"%s\": %s\n" msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %s\n" -#: pg_upgrade.c:122 +#: pg_upgrade.c:135 #, c-format msgid "" "\n" @@ -1421,17 +1383,17 @@ msgstr "" "Führe Upgrade durch\n" "-------------------\n" -#: pg_upgrade.c:165 +#: pg_upgrade.c:178 #, c-format msgid "Setting next OID for new cluster" msgstr "Setze nächste OID im neuen Cluster" -#: pg_upgrade.c:172 +#: pg_upgrade.c:187 #, c-format msgid "Sync data directory to disk" msgstr "Synchronisiere Datenverzeichnis auf Festplatte" -#: pg_upgrade.c:183 +#: pg_upgrade.c:199 #, c-format msgid "" "\n" @@ -1442,12 +1404,17 @@ msgstr "" "Upgrade abgeschlossen\n" "---------------------\n" -#: pg_upgrade.c:216 +#: pg_upgrade.c:233 pg_upgrade.c:235 pg_upgrade.c:237 +#, c-format +msgid "could not create directory \"%s\": %m\n" +msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m\n" + +#: pg_upgrade.c:282 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: konnte eigene Programmdatei nicht finden\n" -#: pg_upgrade.c:242 +#: pg_upgrade.c:308 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" @@ -1456,7 +1423,7 @@ msgstr "" "Es läuft scheinbar ein Postmaster für den alten Cluster.\n" "Bitte beenden Sie diesen Postmaster und versuchen Sie es erneut.\n" -#: pg_upgrade.c:255 +#: pg_upgrade.c:321 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" @@ -1465,127 +1432,112 @@ msgstr "" "Es läuft scheinbar ein Postmaster für den neuen Cluster.\n" "Bitte beenden Sie diesen Postmaster und versuchen Sie es erneut.\n" -#: pg_upgrade.c:269 +#: pg_upgrade.c:335 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Analysiere alle Zeilen im neuen Cluster" -#: pg_upgrade.c:282 +#: pg_upgrade.c:348 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Friere alle Zeilen im neuen Cluster ein" -#: pg_upgrade.c:302 +#: pg_upgrade.c:368 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Stelle globale Objekte im neuen Cluster wieder her" -#: pg_upgrade.c:317 -#, c-format -msgid "Restoring database schemas in the new cluster\n" -msgstr "Stelle Datenbankschemas im neuen Cluster wieder her\n" - -#: pg_upgrade.c:421 +#: pg_upgrade.c:490 #, c-format msgid "Deleting files from new %s" msgstr "Lösche Dateien aus neuem %s" -#: pg_upgrade.c:425 +#: pg_upgrade.c:494 #, c-format msgid "could not delete directory \"%s\"\n" msgstr "konnte Verzeichnis »%s« nicht löschen\n" -#: pg_upgrade.c:444 +#: pg_upgrade.c:513 #, c-format msgid "Copying old %s to new server" msgstr "Kopiere altes %s zum neuen Server" -#: pg_upgrade.c:471 +#: pg_upgrade.c:539 +#, c-format +msgid "Setting oldest XID for new cluster" +msgstr "Setze älteste XID im neuen Cluster" + +#: pg_upgrade.c:547 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "Setze nächste Transaktions-ID und -epoche im neuen Cluster" -#: pg_upgrade.c:501 +#: pg_upgrade.c:577 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "Setze nächste Multixact-ID und nächstes Offset im neuen Cluster" -#: pg_upgrade.c:525 +#: pg_upgrade.c:601 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Setze älteste Multixact-ID im neuen Cluster" -#: pg_upgrade.c:545 +#: pg_upgrade.c:621 #, c-format msgid "Resetting WAL archives" msgstr "Setze WAL-Archive zurück" -#: pg_upgrade.c:588 +#: pg_upgrade.c:664 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Setze frozenxid und minmxid im neuen Cluster" -#: pg_upgrade.c:590 +#: pg_upgrade.c:666 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Setze minmxid im neuen Cluster" -#: relfilenode.c:35 -#, c-format -msgid "Cloning user relation files\n" -msgstr "Klonen Benutzertabellendateien\n" - -#: relfilenode.c:38 -#, c-format -msgid "Copying user relation files\n" -msgstr "Kopiere Benutzertabellendateien\n" - -#: relfilenode.c:41 -#, c-format -msgid "Linking user relation files\n" -msgstr "Verknüpfe Benutzertabellendateien\n" - #: relfilenode.c:115 #, c-format msgid "old database \"%s\" not found in the new cluster\n" msgstr "alte Datenbank »%s« nicht im neuen Cluster gefunden\n" -#: relfilenode.c:230 +#: relfilenode.c:218 #, c-format msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n" msgstr "Fehler beim Prüfen auf Existenz der Datei für »%s.%s« (»%s« nach »%s«): %s\n" -#: relfilenode.c:248 +#: relfilenode.c:236 #, c-format msgid "rewriting \"%s\" to \"%s\"\n" msgstr "konvertiere »%s« nach »%s«\n" -#: relfilenode.c:256 +#: relfilenode.c:244 #, c-format msgid "cloning \"%s\" to \"%s\"\n" msgstr "klone »%s« nach »%s«\n" -#: relfilenode.c:261 +#: relfilenode.c:249 #, c-format msgid "copying \"%s\" to \"%s\"\n" msgstr "kopiere »%s« nach »%s«\n" -#: relfilenode.c:266 +#: relfilenode.c:254 #, c-format msgid "linking \"%s\" to \"%s\"\n" msgstr "verknüpfe »%s« nach »%s«\n" -#: server.c:38 server.c:142 util.c:135 util.c:165 +#: server.c:39 server.c:143 util.c:175 util.c:205 #, c-format msgid "Failure, exiting\n" msgstr "Fehlgeschlagen, Programm wird beendet\n" -#: server.c:132 +#: server.c:133 #, c-format msgid "executing: %s\n" msgstr "führe aus: %s\n" -#: server.c:138 +#: server.c:139 #, c-format msgid "" "SQL command failed\n" @@ -1596,17 +1548,17 @@ msgstr "" "%s\n" "%s" -#: server.c:168 +#: server.c:169 #, c-format msgid "could not open version file \"%s\": %m\n" msgstr "konnte Versionsdatei »%s« nicht öffnen: %m\n" -#: server.c:172 +#: server.c:173 #, c-format msgid "could not parse version file \"%s\"\n" msgstr "konnte Versionsdatei »%s« nicht interpretieren\n" -#: server.c:298 +#: server.c:291 #, c-format msgid "" "\n" @@ -1615,7 +1567,7 @@ msgstr "" "\n" "%s" -#: server.c:302 +#: server.c:295 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -1624,7 +1576,7 @@ msgstr "" "konnte nicht mit dem Postmaster für den alten Cluster verbinden, gestartet mit dem Befehl:\n" "%s\n" -#: server.c:306 +#: server.c:299 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -1633,22 +1585,22 @@ msgstr "" "konnte nicht mit dem Postmaster für den neuen Cluster verbinden, gestartet mit dem Befehl:\n" "%s\n" -#: server.c:320 +#: server.c:313 #, c-format msgid "pg_ctl failed to start the source server, or connection failed\n" msgstr "pg_ctl konnte den Quellserver nicht starten, oder Verbindung fehlgeschlagen\n" -#: server.c:322 +#: server.c:315 #, c-format msgid "pg_ctl failed to start the target server, or connection failed\n" msgstr "pg_ctl konnte den Zielserver nicht starten, oder Verbindung fehlgeschlagen\n" -#: server.c:367 +#: server.c:360 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: server.c:380 +#: server.c:373 #, c-format msgid "libpq environment variable %s has a non-local server value: %s\n" msgstr "libpq-Umgebungsvariable %s hat einen nicht lokalen Serverwert: %s\n" @@ -1662,90 +1614,43 @@ msgstr "" "Kann nicht auf gleiche Systemkatalogversion aktualisieren, wenn\n" "Tablespaces verwendet werden.\n" -#: tablespace.c:86 +#: tablespace.c:83 #, c-format msgid "tablespace directory \"%s\" does not exist\n" msgstr "Tablespace-Verzeichnis »%s« existiert nicht\n" -#: tablespace.c:90 +#: tablespace.c:87 #, c-format msgid "could not stat tablespace directory \"%s\": %s\n" msgstr "konnte »stat« für Tablespace-Verzeichnis »%s« nicht ausführen: %s\n" -#: tablespace.c:95 +#: tablespace.c:92 #, c-format msgid "tablespace path \"%s\" is not a directory\n" msgstr "Tablespace-Pfad »%s« ist kein Verzeichnis\n" -#: util.c:49 -#, c-format -msgid " " -msgstr " " - -#: util.c:82 +#: util.c:52 util.c:82 util.c:115 #, c-format msgid "%-*s" msgstr "%-*s" -#: util.c:174 +#: util.c:113 +#, fuzzy, c-format +#| msgid "%-*s" +msgid "%-*s\n" +msgstr "%-*s" + +#: util.c:214 #, c-format msgid "ok" msgstr "ok" -#: version.c:29 -#, c-format -msgid "Checking for large objects" -msgstr "Prüfe auf Large Objects" - -#: version.c:77 version.c:419 -#, c-format -msgid "warning" -msgstr "Warnung" - -#: version.c:79 -#, c-format -msgid "" -"\n" -"Your installation contains large objects. The new database has an\n" -"additional large object permission table. After upgrading, you will be\n" -"given a command to populate the pg_largeobject_metadata table with\n" -"default permissions.\n" -"\n" -msgstr "" -"\n" -"Ihre Installation enthält Large Objects. Die neue Datenbank hat eine\n" -"zusätzliche Tabelle mit den Zugriffsrechten für Large Objects. Nach\n" -"dem Upgrade wird Ihnen ein Befehl gegeben werden, mit dem die Tabelle\n" -"pg_largeobject_metadata mit den Standardrechten gefüllt wird.\n" -"\n" - -#: version.c:85 -#, c-format -msgid "" -"\n" -"Your installation contains large objects. The new database has an\n" -"additional large object permission table, so default permissions must be\n" -"defined for all large objects. The file\n" -" %s\n" -"when executed by psql by the database superuser will set the default\n" -"permissions.\n" -"\n" -msgstr "" -"\n" -"Ihre Installation enthält Large Objects. Die neue Datenbank hat eine\n" -"zusätzliche Tabelle mit den Zugriffsrechten für Large Objects, sodass\n" -"Standardrechte für alle Large Objects gesetzt werden müssen. Die Datei\n" -" %s\n" -"kann mit psql als Datenbank-Superuser ausgeführt werden, um die\n" -"Standardrechte zu setzen.\n" -"\n" - -#: version.c:272 +#: version.c:184 #, c-format msgid "Checking for incompatible \"line\" data type" msgstr "Prüfe auf inkompatiblen Datentyp »line«" -#: version.c:279 +#: version.c:191 #, c-format msgid "" "Your installation contains the \"line\" data type in user tables.\n" @@ -1766,12 +1671,12 @@ msgstr "" " %s\n" "\n" -#: version.c:310 +#: version.c:222 #, c-format msgid "Checking for invalid \"unknown\" user columns" msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »unknown«" -#: version.c:317 +#: version.c:229 #, c-format msgid "" "Your installation contains the \"unknown\" data type in user tables.\n" @@ -1790,12 +1695,17 @@ msgstr "" " %s\n" "\n" -#: version.c:341 +#: version.c:253 #, c-format msgid "Checking for hash indexes" msgstr "Prüfe auf Hash-Indexe" -#: version.c:421 +#: version.c:331 +#, c-format +msgid "warning" +msgstr "Warnung" + +#: version.c:333 #, c-format msgid "" "\n" @@ -1812,7 +1722,7 @@ msgstr "" "werden Sie Anweisungen zum REINDEX erhalten.\n" "\n" -#: version.c:427 +#: version.c:339 #, c-format msgid "" "\n" @@ -1834,12 +1744,12 @@ msgstr "" "verwendet werden.\n" "\n" -#: version.c:453 +#: version.c:365 #, c-format msgid "Checking for invalid \"sql_identifier\" user columns" msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »sql_identifier«" -#: version.c:461 +#: version.c:373 #, c-format msgid "" "Your installation contains the \"sql_identifier\" data type in user tables.\n" @@ -1856,3 +1766,56 @@ msgstr "" "werden. Sie können die Problemspalten löschen und das Upgrade neu\n" "starten. Eine Liste der Problemspalten ist in der Datei: %s\n" "\n" + +#: version.c:397 +#, c-format +msgid "Checking for extension updates" +msgstr "Prüfe auf Aktualisierungen von Erweiterungen" + +#: version.c:449 +#, c-format +msgid "notice" +msgstr "Hinweis" + +#: version.c:450 +#, c-format +msgid "" +"\n" +"Your installation contains extensions that should be updated\n" +"with the ALTER EXTENSION command. The file\n" +" %s\n" +"when executed by psql by the database superuser will update\n" +"these extensions.\n" +"\n" +msgstr "" +"\n" +"Ihre Installation enthält Erweiterungen, die mit dem Befehl ALTER\n" +"EXTENSION aktualisiert werden sollten. Die Datei\n" +" %s\n" +"kann mit psql als Datenbank-Superuser ausgeführt werden, um die\n" +"Erweiterungen zu aktualisieren.\n" +"\n" + +#, c-format +#~ msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n" +#~ msgstr "Alle Datenbanken außer template0 müssen Verbindungen erlauben, d.h. ihr pg_database.datallowconn muss wahr sein\n" + +#, c-format +#~ msgid "Cloning user relation files\n" +#~ msgstr "Klonen Benutzertabellendateien\n" + +#, c-format +#~ msgid "Copying user relation files\n" +#~ msgstr "Kopiere Benutzertabellendateien\n" + +#, c-format +#~ msgid "Creating dump of database schemas\n" +#~ msgstr "Erzeuge Dump der Datenbankschemas\n" + +#, c-format +#~ msgid "Linking user relation files\n" +#~ msgstr "Verknüpfe Benutzertabellendateien\n" + +#, c-format +#~ msgid "Restoring database schemas in the new cluster\n" +#~ msgstr "Stelle Datenbankschemas im neuen Cluster wieder her\n" diff --git a/src/bin/pg_upgrade/po/es.po b/src/bin/pg_upgrade/po/es.po index 8525e77810..1d5e55b611 100644 --- a/src/bin/pg_upgrade/po/es.po +++ b/src/bin/pg_upgrade/po/es.po @@ -1,6 +1,6 @@ # spanish message translation file for pg_upgrade # -# Copyright (c) 2017-2019, PostgreSQL Global Development Group +# Copyright (c) 2017-2021, PostgreSQL Global Development Group # # This file is distributed under the same license as the PostgreSQL package. # Álvaro Herrera , 2017. @@ -8,17 +8,17 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_upgrade (PostgreSQL) 12\n" +"Project-Id-Version: pg_upgrade (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-14 19:47+0000\n" -"PO-Revision-Date: 2021-05-24 16:35-0500\n" +"POT-Creation-Date: 2021-10-13 22:16+0000\n" +"PO-Revision-Date: 2021-10-14 10:14-0500\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.3\n" +"X-Generator: BlackCAT 1.1\n" #: check.c:70 #, c-format @@ -58,7 +58,7 @@ msgstr "" "Si pg_upgrade falla a partir de este punto, deberá re-ejecutar initdb\n" "en el clúster nuevo antes de continuar.\n" -#: check.c:262 +#: check.c:264 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -71,7 +71,7 @@ msgstr "" " %s/vacuumdb %s--all --analyze-in-stages\n" "\n" -#: check.c:268 +#: check.c:270 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -80,7 +80,7 @@ msgstr "" "Ejecutando este script se borrarán los archivos de datos del servidor antiguo:\n" " %s\n" -#: check.c:273 +#: check.c:275 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -93,81 +93,81 @@ msgstr "" "o el directorio de datos del servidor nuevo. El contenido del servidor\n" "antiguo debe ser borrado manualmente.\n" -#: check.c:285 +#: check.c:287 #, c-format msgid "Checking cluster versions" msgstr "Verificando las versiones de los clústers" -#: check.c:297 +#: check.c:299 #, c-format msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n" msgstr "Este programa sólo puede actualizar desde PostgreSQL versión 8.4 y posterior.\n" -#: check.c:301 +#: check.c:303 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s.\n" msgstr "Este programa sólo puede actualizar a PostgreSQL versión %s.\n" -#: check.c:310 +#: check.c:312 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n" msgstr "Este programa no puede usarse para volver a versiones anteriores de PostgreSQL.\n" -#: check.c:315 +#: check.c:317 #, c-format msgid "Old cluster data and binary directories are from different major versions.\n" msgstr "" "El directorio de datos antiguo y el directorio de binarios antiguo son de\n" "versiones diferentes.\n" -#: check.c:318 +#: check.c:320 #, c-format msgid "New cluster data and binary directories are from different major versions.\n" msgstr "" "El directorio de datos nuevo y el directorio de binarios nuevo son de\n" "versiones diferentes.\n" -#: check.c:335 +#: check.c:337 #, c-format msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n" msgstr "Al verificar un servidor antiguo anterior a 9.1, debe especificar el port de éste.\n" -#: check.c:339 +#: check.c:341 #, c-format msgid "When checking a live server, the old and new port numbers must be different.\n" msgstr "Al verificar servidores en caliente, los números de port antiguo y nuevo deben ser diferentes.\n" -#: check.c:354 +#: check.c:356 #, c-format msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "las codificaciones de la base de datos «%s» no coinciden: antigua «%s», nueva «%s»\n" -#: check.c:359 +#: check.c:361 #, c-format msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "valores lc_collate de la base de datos «%s» no coinciden: antigua «%s», nueva «%s»\n" -#: check.c:362 +#: check.c:364 #, c-format msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "valores lc_ctype de la base de datos «%s» no coinciden: antigua «%s», nueva «%s»\n" -#: check.c:435 +#: check.c:437 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" msgstr "La base de datos «%s» del clúster nuevo no está vacía: se encontró la relación «%s.%s»\n" -#: check.c:492 +#: check.c:494 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Verificando los directorios de tablespaces para el nuevo clúster" -#: check.c:503 +#: check.c:505 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"\n" msgstr "directorio de tablespace para el nuevo clúster ya existe: «%s»\n" -#: check.c:536 +#: check.c:538 #, c-format msgid "" "\n" @@ -177,7 +177,7 @@ msgstr "" "ADVERTENCIA: el directorio de datos nuevo no debería estar dentro del directorio antiguo,\n" "por ej. %s\n" -#: check.c:560 +#: check.c:562 #, c-format msgid "" "\n" @@ -188,84 +188,85 @@ msgstr "" "no deberían estar dentro del directorio de datos,\n" "por ej. %s\n" -#: check.c:570 +#: check.c:572 #, c-format msgid "Creating script to delete old cluster" msgstr "Creando un script para borrar el clúster antiguo" -#: check.c:573 check.c:837 check.c:935 check.c:1014 check.c:1276 file.c:336 +#: check.c:575 check.c:839 check.c:937 check.c:1016 check.c:1278 file.c:336 #: function.c:240 option.c:497 version.c:54 version.c:204 version.c:376 +#: version.c:511 #, c-format msgid "could not open file \"%s\": %s\n" msgstr "no se pudo abrir el archivo «%s»: %s\n" -#: check.c:629 +#: check.c:631 #, c-format msgid "could not add execute permission to file \"%s\": %s\n" msgstr "no se pudo agregar permisos de ejecución al archivo «%s»: %s\n" -#: check.c:649 +#: check.c:651 #, c-format msgid "Checking database user is the install user" msgstr "Verificando que el usuario de base de datos es el usuario de instalación" -#: check.c:665 +#: check.c:667 #, c-format msgid "database user \"%s\" is not the install user\n" msgstr "el usuario de base de datos «%s» no es el usuario de instalación\n" -#: check.c:676 +#: check.c:678 #, c-format msgid "could not determine the number of users\n" msgstr "no se pudo determinar el número de usuarios\n" -#: check.c:684 +#: check.c:686 #, c-format msgid "Only the install user can be defined in the new cluster.\n" msgstr "Sólo el usuario de instalación puede estar definido en el nuevo clúster.\n" -#: check.c:704 +#: check.c:706 #, c-format msgid "Checking database connection settings" msgstr "Verificando los parámetros de conexión de bases de datos" -#: check.c:726 +#: check.c:728 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n" msgstr "template0 no debe permitir conexiones, es decir su pg_database.datallowconn debe ser «false»\n" -#: check.c:736 +#: check.c:738 #, c-format msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n" msgstr "Todas las bases de datos no-template0 deben permitir conexiones, es decir su pg_database.datallowconn debe ser «true»\n" -#: check.c:761 +#: check.c:763 #, c-format msgid "Checking for prepared transactions" msgstr "Verificando transacciones preparadas" -#: check.c:770 +#: check.c:772 #, c-format msgid "The source cluster contains prepared transactions\n" msgstr "El clúster de origen contiene transacciones preparadas\n" -#: check.c:772 +#: check.c:774 #, c-format msgid "The target cluster contains prepared transactions\n" msgstr "El clúster de destino contiene transacciones preparadas\n" -#: check.c:798 +#: check.c:800 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Verificando contrib/isn con discordancia en mecanismo de paso de bigint" -#: check.c:859 check.c:960 check.c:1036 check.c:1093 check.c:1152 check.c:1181 -#: check.c:1299 function.c:262 version.c:278 version.c:316 version.c:460 +#: check.c:861 check.c:962 check.c:1038 check.c:1095 check.c:1154 check.c:1183 +#: check.c:1301 function.c:262 version.c:278 version.c:316 version.c:460 #, c-format msgid "fatal\n" msgstr "fatal\n" -#: check.c:860 +#: check.c:862 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -286,12 +287,12 @@ msgstr "" " %s\n" "\n" -#: check.c:883 +#: check.c:885 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Verificando operadores postfix definidos por el usuario" -#: check.c:961 +#: check.c:963 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -308,12 +309,12 @@ msgstr "" " %s\n" "\n" -#: check.c:982 +#: check.c:984 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Verificando tablas WITH OIDS" -#: check.c:1037 +#: check.c:1039 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -330,12 +331,12 @@ msgstr "" " %s\n" "\n" -#: check.c:1065 +#: check.c:1067 #, c-format msgid "Checking for system-defined composite types in user tables" msgstr "Verificando tipos compuestos definidos por el sistema en tablas de usuario" -#: check.c:1094 +#: check.c:1096 #, c-format msgid "" "Your installation contains system-defined composite type(s) in user tables.\n" @@ -354,12 +355,12 @@ msgstr "" " %s\n" "\n" -#: check.c:1122 +#: check.c:1124 #, c-format msgid "Checking for reg* data types in user tables" msgstr "Verificando tipos de datos reg* en datos de usuario" -#: check.c:1153 +#: check.c:1155 #, c-format msgid "" "Your installation contains one of the reg* data types in user tables.\n" @@ -378,12 +379,12 @@ msgstr "" " %s\n" "\n" -#: check.c:1175 +#: check.c:1177 #, c-format msgid "Checking for incompatible \"jsonb\" data type" msgstr "Verificando datos de usuario en tipo «jsonb» incompatible" -#: check.c:1182 +#: check.c:1184 #, c-format msgid "" "Your installation contains the \"jsonb\" data type in user tables.\n" @@ -402,27 +403,27 @@ msgstr "" " %s\n" "\n" -#: check.c:1204 +#: check.c:1206 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Verificando roles que empiecen con «pg_»" -#: check.c:1214 +#: check.c:1216 #, c-format msgid "The source cluster contains roles starting with \"pg_\"\n" msgstr "El clúster de origen contiene roles que empiezan con «pg_»\n" -#: check.c:1216 +#: check.c:1218 #, c-format msgid "The target cluster contains roles starting with \"pg_\"\n" msgstr "El clúster de destino contiene roles que empiezan con «pg_»\n" -#: check.c:1237 +#: check.c:1239 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "Verificando conversiones de codificación definidas por el usuario" -#: check.c:1300 +#: check.c:1302 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -441,189 +442,194 @@ msgstr "" " %s\n" "\n" -#: check.c:1327 +#: check.c:1329 #, c-format msgid "failed to get the current locale\n" msgstr "no se pudo obtener el «locale» actual\n" -#: check.c:1336 +#: check.c:1338 #, c-format msgid "failed to get system locale name for \"%s\"\n" msgstr "no se pudo obtener el nombre del «locale» para «%s»\n" -#: check.c:1342 +#: check.c:1344 #, c-format msgid "failed to restore old locale \"%s\"\n" msgstr "no se pudo restaurar el locale antiguo «%s»\n" -#: controldata.c:127 controldata.c:195 +#: controldata.c:128 controldata.c:196 #, c-format msgid "could not get control data using %s: %s\n" msgstr "no se pudo obtener datos de control usando %s: %s\n" -#: controldata.c:138 +#: controldata.c:139 #, c-format msgid "%d: database cluster state problem\n" msgstr "%d: problema de estado del clúster\n" -#: controldata.c:156 +#: controldata.c:157 #, c-format msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" msgstr "El clúster de origen fue apagado mientras estaba en modo de recuperación. Para actualizarlo, use «rsync» como está documentado, o apáguelo siendo primario.\n" -#: controldata.c:158 +#: controldata.c:159 #, c-format msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" msgstr "El clúster de destino fue apagado mientras estaba en modo de recuperación. Para actualizarlo, use «rsync» como está documentado, o apáguelo siendo primario.\n" -#: controldata.c:163 +#: controldata.c:164 #, c-format msgid "The source cluster was not shut down cleanly.\n" msgstr "El clúster de origen no fue apagado limpiamente.\n" -#: controldata.c:165 +#: controldata.c:166 #, c-format msgid "The target cluster was not shut down cleanly.\n" msgstr "El clúster de destino no fue apagado limpiamente.\n" -#: controldata.c:176 +#: controldata.c:177 #, c-format msgid "The source cluster lacks cluster state information:\n" msgstr "Al clúster de origen le falta información de estado:\n" -#: controldata.c:178 +#: controldata.c:179 #, c-format msgid "The target cluster lacks cluster state information:\n" msgstr "Al cluster de destino le falta información de estado:\n" -#: controldata.c:208 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371 +#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371 #: relfilenode.c:243 server.c:33 util.c:79 #, c-format msgid "%s" msgstr "%s" -#: controldata.c:215 +#: controldata.c:216 #, c-format msgid "%d: pg_resetwal problem\n" msgstr "%d: problema en pg_resetwal\n" -#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257 -#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309 -#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345 -#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382 -#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426 -#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470 -#: controldata.c:481 +#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258 +#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310 +#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354 +#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383 +#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427 +#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471 +#: controldata.c:482 controldata.c:493 #, c-format msgid "%d: controldata retrieval problem\n" msgstr "%d: problema de extracción de controldata\n" -#: controldata.c:560 +#: controldata.c:572 #, c-format msgid "The source cluster lacks some required control information:\n" msgstr "Al clúster de origen le falta información de control requerida:\n" -#: controldata.c:563 +#: controldata.c:575 #, c-format msgid "The target cluster lacks some required control information:\n" msgstr "Al clúster de destino le falta información de control requerida:\n" -#: controldata.c:566 +#: controldata.c:578 #, c-format msgid " checkpoint next XID\n" msgstr " siguiente XID del último checkpoint\n" -#: controldata.c:569 +#: controldata.c:581 #, c-format msgid " latest checkpoint next OID\n" msgstr " siguiente OID del último checkpoint\n" -#: controldata.c:572 +#: controldata.c:584 #, c-format msgid " latest checkpoint next MultiXactId\n" msgstr " siguiente MultiXactId del último checkpoint\n" -#: controldata.c:576 +#: controldata.c:588 #, c-format msgid " latest checkpoint oldest MultiXactId\n" msgstr " MultiXactId más antiguo del último checkpoint\n" -#: controldata.c:579 +#: controldata.c:591 +#, c-format +msgid " latest checkpoint oldestXID\n" +msgstr " XID más antiguo del último checkpoint\n" + +#: controldata.c:594 #, c-format msgid " latest checkpoint next MultiXactOffset\n" msgstr " siguiente MultiXactOffset del siguiente checkpoint\n" -#: controldata.c:582 +#: controldata.c:597 #, c-format msgid " first WAL segment after reset\n" msgstr " primer segmento de WAL después del reinicio\n" -#: controldata.c:585 +#: controldata.c:600 #, c-format msgid " float8 argument passing method\n" msgstr " método de paso de argumentos float8\n" -#: controldata.c:588 +#: controldata.c:603 #, c-format msgid " maximum alignment\n" msgstr " alineamiento máximo\n" -#: controldata.c:591 +#: controldata.c:606 #, c-format msgid " block size\n" msgstr " tamaño de bloques\n" -#: controldata.c:594 +#: controldata.c:609 #, c-format msgid " large relation segment size\n" msgstr " tamaño de segmento de relación grande\n" -#: controldata.c:597 +#: controldata.c:612 #, c-format msgid " WAL block size\n" msgstr " tamaño de bloque de WAL\n" -#: controldata.c:600 +#: controldata.c:615 #, c-format msgid " WAL segment size\n" msgstr " tamaño de segmento de WAL\n" -#: controldata.c:603 +#: controldata.c:618 #, c-format msgid " maximum identifier length\n" msgstr " máximo largo de identificadores\n" -#: controldata.c:606 +#: controldata.c:621 #, c-format msgid " maximum number of indexed columns\n" msgstr " máximo número de columnas indexadas\n" -#: controldata.c:609 +#: controldata.c:624 #, c-format msgid " maximum TOAST chunk size\n" msgstr " tamaño máximo de trozos TOAST\n" -#: controldata.c:613 +#: controldata.c:628 #, c-format msgid " large-object chunk size\n" msgstr " tamaño de trozos de objetos grandes\n" -#: controldata.c:616 +#: controldata.c:631 #, c-format msgid " dates/times are integers?\n" msgstr " fechas/horas son enteros?\n" -#: controldata.c:620 +#: controldata.c:635 #, c-format msgid " data checksum version\n" msgstr " versión del checksum de datos\n" -#: controldata.c:622 +#: controldata.c:637 #, c-format msgid "Cannot continue without required control information, terminating\n" msgstr "No se puede continuar sin la información de control requerida. Terminando\n" -#: controldata.c:637 +#: controldata.c:652 #, c-format msgid "" "old and new pg_controldata alignments are invalid or do not match\n" @@ -632,77 +638,77 @@ msgstr "" "Alineamientos de pg_controldata antiguo y nuevo no son válidos o no coinciden\n" "Seguramente un clúster es 32-bit y el otro es 64-bit\n" -#: controldata.c:641 +#: controldata.c:656 #, c-format msgid "old and new pg_controldata block sizes are invalid or do not match\n" msgstr "Los tamaños de bloque antiguo y nuevo no son válidos o no coinciden\n" -#: controldata.c:644 +#: controldata.c:659 #, c-format msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n" msgstr "El tamaño máximo de segmento de relación antiguo y nuevo no son válidos o no coinciden\n" -#: controldata.c:647 +#: controldata.c:662 #, c-format msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n" msgstr "El tamaño de bloques de WAL antiguo y nuevo no son válidos o no coinciden\n" -#: controldata.c:650 +#: controldata.c:665 #, c-format msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n" msgstr "El tamaño de segmentos de WAL antiguo y nuevo no son válidos o no coinciden\n" -#: controldata.c:653 +#: controldata.c:668 #, c-format msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n" msgstr "Los máximos largos de identificador antiguo y nuevo no son válidos o no coinciden\n" -#: controldata.c:656 +#: controldata.c:671 #, c-format msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n" msgstr "La cantidad máxima de columnas indexadas antigua y nueva no son válidos o no coinciden\n" -#: controldata.c:659 +#: controldata.c:674 #, c-format msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n" msgstr "Los máximos de trozos TOAST antiguo y nuevo no son válidos o no coinciden\n" -#: controldata.c:664 +#: controldata.c:679 #, c-format msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n" msgstr "Los tamaños de trozos de objetos grandes antiguo y nuevo no son válidos o no coinciden\n" -#: controldata.c:667 +#: controldata.c:682 #, c-format msgid "old and new pg_controldata date/time storage types do not match\n" msgstr "Los tipos de almacenamiento de fecha/hora antiguo y nuevo no coinciden\n" -#: controldata.c:680 +#: controldata.c:695 #, c-format msgid "old cluster does not use data checksums but the new one does\n" msgstr "El clúster antiguo no usa checksums de datos pero el nuevo sí\n" -#: controldata.c:683 +#: controldata.c:698 #, c-format msgid "old cluster uses data checksums but the new one does not\n" msgstr "El clúster antiguo usa checksums de datos pero el nuevo no\n" -#: controldata.c:685 +#: controldata.c:700 #, c-format msgid "old and new cluster pg_controldata checksum versions do not match\n" msgstr "Las versiones de checksum de datos antigua y nueva no coinciden\n" -#: controldata.c:696 +#: controldata.c:711 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "Agregando el sufijo «.old» a global/pg_control" -#: controldata.c:701 +#: controldata.c:716 #, c-format msgid "Unable to rename %s to %s.\n" msgstr "No se pudo renombrar %s a %s.\n" -#: controldata.c:704 +#: controldata.c:719 #, c-format msgid "" "\n" @@ -1152,7 +1158,7 @@ msgstr "" msgid "" "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n" "\n" -msgstr "pg_upgrado actualiza un clúster PostgreSQL a una versión «mayor» diferente.\n" +msgstr "pg_upgrade actualiza un clúster PostgreSQL a una versión «mayor» diferente.\n" #: option.c:289 #, c-format @@ -1184,8 +1190,8 @@ msgid "" " -B, --new-bindir=BINDIR new cluster executable directory (default\n" " same directory as pg_upgrade)\n" msgstr "" -" -B, --new-bindir=BINDIR directorio de ejecutables del clúster nuevo\n" -" (por omisión el mismo directorio que pg_upgrade)\n" +" -B, --new-bindir=BINDIR directorio de ejecutables del clúster nuevo\n" +" (por omisión el mismo directorio que pg_upgrade)\n" #: option.c:295 #, c-format @@ -1205,7 +1211,7 @@ msgstr " -D, --new-datadir=DATADIR directorio de datos del clúster nuevo\n #: option.c:298 #, c-format msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n" -msgstr " -j, --jobs=NUM máximo de procesos paralelos para restaurar\n" +msgstr " -j, --jobs=NUM máximo de procesos paralelos para restaurar\n" #: option.c:299 #, c-format @@ -1510,32 +1516,37 @@ msgstr "no se pudo eliminar directorio «%s»\n" msgid "Copying old %s to new server" msgstr "Copiando el %s antiguo al nuevo servidor" -#: pg_upgrade.c:471 +#: pg_upgrade.c:470 +#, c-format +msgid "Setting oldest XID for new cluster" +msgstr "Estableciendo XID más antiguo para el nuevo clúster" + +#: pg_upgrade.c:478 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "Seteando el ID de transacción y «época» siguientes en el nuevo clúster" -#: pg_upgrade.c:501 +#: pg_upgrade.c:508 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "Seteando el multixact ID y offset siguientes en el nuevo clúster" -#: pg_upgrade.c:525 +#: pg_upgrade.c:532 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Seteando el multixact ID más antiguo en el nuevo clúster" -#: pg_upgrade.c:545 +#: pg_upgrade.c:552 #, c-format msgid "Resetting WAL archives" msgstr "Reseteando los archivos de WAL" -#: pg_upgrade.c:588 +#: pg_upgrade.c:595 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Seteando contadores frozenxid y minmxid en el clúster nuevo" -#: pg_upgrade.c:590 +#: pg_upgrade.c:597 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Seteando contador minmxid en el clúster nuevo" @@ -1865,6 +1876,35 @@ msgstr "" " %s\n" "\n" +#: version.c:485 +#, c-format +msgid "Checking for extension updates" +msgstr "Verificando actualizaciones para extensiones" + +#: version.c:537 +#, c-format +msgid "notice" +msgstr "aviso" + +#: version.c:538 +#, c-format +msgid "" +"\n" +"Your installation contains extensions that should be updated\n" +"with the ALTER EXTENSION command. The file\n" +" %s\n" +"when executed by psql by the database superuser will update\n" +"these extensions.\n" +"\n" +msgstr "" +"\n" +"Su instalación tiene extensiones que deben ser actualizadas\n" +"con la sentencia ALTER EXTENSION. El archivo\n" +" %s\n" +"cuando se ejecute en psql con el superusuario de la base de datos\n" +"actualizará estas extensiones.\n" +"\n" + #~ msgid "" #~ "\n" #~ "connection to database failed: %s" diff --git a/src/bin/pg_upgrade/po/fr.po b/src/bin/pg_upgrade/po/fr.po index 54d8b76333..3155bf06c5 100644 --- a/src/bin/pg_upgrade/po/fr.po +++ b/src/bin/pg_upgrade/po/fr.po @@ -1,23 +1,27 @@ # LANGUAGE message translation file for pg_upgrade -# Copyright (C) 2017 PostgreSQL Global Development Group -# This file is distributed under the same license as the PostgreSQL package. -# FIRST AUTHOR , 2017. +# Copyright (C) 2017-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package. +# +# Use these quotes: « %s » +# +# Guillaume Lelarge , 2017-2022. # msgid "" msgstr "" -"Project-Id-Version: pg_upgrade (PostgreSQL) 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-11 07:47+0000\n" -"PO-Revision-Date: 2021-05-11 10:39+0200\n" -"Last-Translator: \n" -"Language-Team: \n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"Last-Translator: Guillaume Lelarge \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.3\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" -#: check.c:70 +#: check.c:71 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -26,7 +30,7 @@ msgstr "" "Exécution de tests de cohérence sur l'ancien serveur\n" "----------------------------------------------------\n" -#: check.c:76 +#: check.c:77 #, c-format msgid "" "Performing Consistency Checks\n" @@ -35,7 +39,7 @@ msgstr "" "Exécution de tests de cohérence\n" "-------------------------------\n" -#: check.c:213 +#: check.c:210 #, c-format msgid "" "\n" @@ -44,7 +48,7 @@ msgstr "" "\n" "*Les instances sont compatibles*\n" -#: check.c:219 +#: check.c:216 #, c-format msgid "" "\n" @@ -55,7 +59,7 @@ msgstr "" "Si pg_upgrade échoue après cela, vous devez ré-exécuter initdb\n" "sur la nouvelle instance avant de continuer.\n" -#: check.c:262 +#: check.c:257 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -68,7 +72,7 @@ msgstr "" " %s/vacuumdb %s--all --analyze-in-stages\n" "\n" -#: check.c:268 +#: check.c:263 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -78,7 +82,7 @@ msgstr "" "instance :\n" " %s\n" -#: check.c:273 +#: check.c:268 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -92,77 +96,82 @@ msgstr "" "de l'ancienne instance. Le contenu de l'ancienne instance doit être supprimé\n" "manuellement.\n" -#: check.c:285 +#: check.c:280 #, c-format msgid "Checking cluster versions" msgstr "Vérification des versions des instances" -#: check.c:297 +#: check.c:292 #, c-format -msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n" -msgstr "Cet outil peut seulement mettre à jour les versions 8.4 et ultérieures de PostgreSQL.\n" +msgid "This utility can only upgrade from PostgreSQL version 9.2 and later.\n" +msgstr "Cet outil peut seulement mettre à jour les versions 9.2 et ultérieures de PostgreSQL.\n" -#: check.c:301 +#: check.c:296 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s.\n" msgstr "Cet outil peut seulement mettre à jour vers la version %s de PostgreSQL.\n" -#: check.c:310 +#: check.c:305 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n" msgstr "Cet outil ne peut pas être utilisé pour mettre à jour vers des versions majeures plus anciennes de PostgreSQL.\n" -#: check.c:315 +#: check.c:310 #, c-format msgid "Old cluster data and binary directories are from different major versions.\n" msgstr "Les répertoires des données de l'ancienne instance et des binaires sont de versions majeures différentes.\n" -#: check.c:318 +#: check.c:313 #, c-format msgid "New cluster data and binary directories are from different major versions.\n" msgstr "Les répertoires des données de la nouvelle instance et des binaires sont de versions majeures différentes.\n" -#: check.c:335 -#, c-format -msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n" -msgstr "Lors de la vérification d'un serveur antérieur à la 9.1, vous devez spécifier le numéro de port de l'ancien serveur.\n" - -#: check.c:339 +#: check.c:328 #, c-format msgid "When checking a live server, the old and new port numbers must be different.\n" msgstr "Lors de la vérification d'un serveur en production, l'ancien numéro de port doit être différent du nouveau.\n" -#: check.c:354 +#: check.c:343 #, c-format msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "les encodages de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n" -#: check.c:359 +#: check.c:348 #, c-format msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "les valeurs de lc_collate de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n" -#: check.c:362 +#: check.c:351 #, c-format msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "les valeurs de lc_ctype de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n" -#: check.c:435 +#: check.c:354 +#, c-format +msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n" +msgstr "les fournisseurs de locale pour la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n" + +#: check.c:361 +#, c-format +msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" +msgstr "les valeurs de la locale ICU de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n" + +#: check.c:436 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" msgstr "La nouvelle instance « %s » n'est pas vide : relation « %s.%s » trouvée\n" -#: check.c:492 +#: check.c:488 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Vérification des répertoires de tablespace de la nouvelle instance" -#: check.c:503 +#: check.c:499 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"\n" msgstr "le répertoire du tablespace de la nouvelle instance existe déjà : « %s »\n" -#: check.c:536 +#: check.c:532 #, c-format msgid "" "\n" @@ -171,7 +180,7 @@ msgstr "" "\n" "AVERTISSEMENT : le nouveau répertoire de données ne doit pas être à l'intérieur de l'ancien répertoire de données, %s\n" -#: check.c:560 +#: check.c:556 #, c-format msgid "" "\n" @@ -180,84 +189,102 @@ msgstr "" "\n" "AVERTISSEMENT : les emplacements de tablespaces utilisateurs ne doivent pas être à l'intérieur du répertoire de données, %s\n" -#: check.c:570 +#: check.c:566 #, c-format msgid "Creating script to delete old cluster" msgstr "Création du script pour supprimer l'ancienne instance" -#: check.c:573 check.c:837 check.c:935 check.c:1014 check.c:1276 file.c:336 -#: function.c:240 option.c:497 version.c:54 version.c:204 version.c:376 +#: check.c:569 check.c:744 check.c:864 check.c:963 check.c:1043 check.c:1306 +#: file.c:336 function.c:165 option.c:465 version.c:116 version.c:288 +#: version.c:423 #, c-format msgid "could not open file \"%s\": %s\n" msgstr "n'a pas pu ouvrir le fichier « %s » : %s\n" -#: check.c:629 +#: check.c:620 #, c-format msgid "could not add execute permission to file \"%s\": %s\n" msgstr "n'a pas pu ajouter les droits d'exécution pour le fichier « %s » : %s\n" -#: check.c:649 +#: check.c:640 #, c-format msgid "Checking database user is the install user" msgstr "Vérification que l'utilisateur de la base de données est l'utilisateur d'installation" -#: check.c:665 +#: check.c:656 #, c-format msgid "database user \"%s\" is not the install user\n" msgstr "l'utilisateur de la base de données « %s » n'est pas l'utilisateur d'installation\n" -#: check.c:676 +#: check.c:667 #, c-format msgid "could not determine the number of users\n" msgstr "n'a pas pu déterminer le nombre d'utilisateurs\n" -#: check.c:684 +#: check.c:675 #, c-format msgid "Only the install user can be defined in the new cluster.\n" msgstr "Seul l'utilisateur d'installation peut être défini dans la nouvelle instance.\n" -#: check.c:704 +#: check.c:705 #, c-format msgid "Checking database connection settings" msgstr "Vérification des paramètres de connexion de la base de données" -#: check.c:726 +#: check.c:731 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n" msgstr "template0 ne doit pas autoriser les connexions, ie pg_database.datallowconn doit valoir false\n" -#: check.c:736 +#: check.c:761 check.c:886 check.c:988 check.c:1065 check.c:1122 check.c:1181 +#: check.c:1210 check.c:1329 function.c:187 version.c:190 version.c:228 +#: version.c:372 #, c-format -msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n" -msgstr "Toutes les bases de données, autre que template0, doivent autoriser les connexions, ie pg_database.datallowconn doit valoir true\n" +msgid "fatal\n" +msgstr "fatal\n" -#: check.c:761 +#: check.c:762 +#, c-format +msgid "" +"All non-template0 databases must allow connections, i.e. their\n" +"pg_database.datallowconn must be true. Your installation contains\n" +"non-template0 databases with their pg_database.datallowconn set to\n" +"false. Consider allowing connection for all non-template0 databases\n" +"or drop the databases which do not allow connections. A list of\n" +"databases with the problem is in the file:\n" +" %s\n" +"\n" +msgstr "" +"Tous les bases de données, en dehors de template0, doivent autoriser les connexions,\n" +"autrement dit leur pg_database.datallowconn doit être à true. Votre installation contient\n" +"des bases, hors template0, dont le pg_database.datallowconn est configuré à false.\n" +"Autorisez les connections aux bases, hors template0, ou supprimez les bases qui\n" +"n'autorisent pas les connexions. Une liste des bases problématiques se trouve dans\n" +"le fichier :\n" +" %s\n" +"\n" + +#: check.c:787 #, c-format msgid "Checking for prepared transactions" msgstr "Vérification des transactions préparées" -#: check.c:770 +#: check.c:796 #, c-format msgid "The source cluster contains prepared transactions\n" msgstr "L'instance source contient des transactions préparées\n" -#: check.c:772 +#: check.c:798 #, c-format msgid "The target cluster contains prepared transactions\n" msgstr "L'instance cible contient des transactions préparées\n" -#: check.c:798 +#: check.c:824 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Vérification de contrib/isn avec une différence sur le passage des bigint" -#: check.c:859 check.c:960 check.c:1036 check.c:1093 check.c:1152 check.c:1181 -#: check.c:1299 function.c:262 version.c:278 version.c:316 version.c:460 -#, c-format -msgid "fatal\n" -msgstr "fatal\n" - -#: check.c:860 +#: check.c:887 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -280,12 +307,12 @@ msgstr "" " %s\n" "\n" -#: check.c:883 +#: check.c:910 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Vérification des opérateurs postfixes définis par les utilisateurs" -#: check.c:961 +#: check.c:989 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -301,12 +328,12 @@ msgstr "" "Une liste des opérateurs postfixes définis par les utilisateurs se trouve dans le fichier :\n" " %s\n" -#: check.c:982 +#: check.c:1010 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Vérification des tables WITH OIDS" -#: check.c:1037 +#: check.c:1066 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -322,12 +349,12 @@ msgstr "" "Une liste des tables ayant ce problème se trouve dans le fichier :\n" " %s\n" -#: check.c:1065 +#: check.c:1094 #, c-format msgid "Checking for system-defined composite types in user tables" msgstr "Vérification des types composites définis par le système dans les tables utilisateurs" -#: check.c:1094 +#: check.c:1123 #, c-format msgid "" "Your installation contains system-defined composite type(s) in user tables.\n" @@ -346,12 +373,12 @@ msgstr "" " %s\n" "\n" -#: check.c:1122 +#: check.c:1151 #, c-format msgid "Checking for reg* data types in user tables" msgstr "Vérification des types de données reg* dans les tables utilisateurs" -#: check.c:1153 +#: check.c:1182 #, c-format msgid "" "Your installation contains one of the reg* data types in user tables.\n" @@ -371,12 +398,12 @@ msgstr "" " %s\n" "\n" -#: check.c:1175 +#: check.c:1204 #, c-format msgid "Checking for incompatible \"jsonb\" data type" msgstr "Vérification des types de données « jsonb » incompatibles" -#: check.c:1182 +#: check.c:1211 #, c-format msgid "" "Your installation contains the \"jsonb\" data type in user tables.\n" @@ -395,27 +422,27 @@ msgstr "" " %s\n" "\n" -#: check.c:1204 +#: check.c:1233 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Vérification des rôles commençant avec « pg_ »" -#: check.c:1214 +#: check.c:1243 #, c-format msgid "The source cluster contains roles starting with \"pg_\"\n" msgstr "L'instance source contient des rôles commençant avec « pg_ »\n" -#: check.c:1216 +#: check.c:1245 #, c-format msgid "The target cluster contains roles starting with \"pg_\"\n" msgstr "L'instance cible contient des rôles commençant avec « pg_ »\n" -#: check.c:1237 +#: check.c:1266 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "Vérification des conversions d'encodage définies par les utilisateurs" -#: check.c:1300 +#: check.c:1330 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -434,191 +461,196 @@ msgstr "" " %s\n" "\n" -#: check.c:1327 +#: check.c:1357 #, c-format msgid "failed to get the current locale\n" msgstr "a échoué pour obtenir la locale courante\n" -#: check.c:1336 +#: check.c:1366 #, c-format msgid "failed to get system locale name for \"%s\"\n" msgstr "a échoué pour obtenir le nom de la locale système « %s »\n" -#: check.c:1342 +#: check.c:1372 #, c-format msgid "failed to restore old locale \"%s\"\n" msgstr "a échoué pour restaurer l'ancienne locale « %s »\n" -#: controldata.c:127 controldata.c:195 +#: controldata.c:128 controldata.c:196 #, c-format msgid "could not get control data using %s: %s\n" msgstr "" "n'a pas pu obtenir les données de contrôle en utilisant %s : %s\n" "\n" -#: controldata.c:138 +#: controldata.c:139 #, c-format msgid "%d: database cluster state problem\n" msgstr "%d : problème sur l'état de l'instance de la base de données\n" -#: controldata.c:156 +#: controldata.c:157 #, c-format msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" msgstr "L'instance source a été arrêté alors qu'elle était en mode restauration. Pour mettre à jour, utilisez « rsync » comme documenté ou arrêtez-la en tant que serveur primaire.\n" -#: controldata.c:158 +#: controldata.c:159 #, c-format msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" msgstr "L'instance cible a été arrêté alors qu'elle était en mode restauration. Pour mettre à jour, utilisez « rsync » comme documenté ou arrêtez-la en tant que serveur primaire.\n" -#: controldata.c:163 +#: controldata.c:164 #, c-format msgid "The source cluster was not shut down cleanly.\n" msgstr "L'instance source n'a pas été arrêtée proprement.\n" -#: controldata.c:165 +#: controldata.c:166 #, c-format msgid "The target cluster was not shut down cleanly.\n" msgstr "L'instance cible n'a pas été arrêtée proprement.\n" -#: controldata.c:176 +#: controldata.c:177 #, c-format msgid "The source cluster lacks cluster state information:\n" msgstr "Il manque certaines informations d'état requises sur l'instance source :\n" -#: controldata.c:178 +#: controldata.c:179 #, c-format msgid "The target cluster lacks cluster state information:\n" msgstr "Il manque certaines informations d'état requises sur l'instance cible :\n" -#: controldata.c:208 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371 -#: relfilenode.c:243 server.c:33 util.c:79 +#: controldata.c:209 dump.c:50 pg_upgrade.c:402 pg_upgrade.c:439 +#: relfilenode.c:231 server.c:34 #, c-format msgid "%s" msgstr "%s" -#: controldata.c:215 +#: controldata.c:216 #, c-format msgid "%d: pg_resetwal problem\n" msgstr "%d : problème avec pg_resetwal\n" -#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257 -#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309 -#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345 -#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382 -#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426 -#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470 -#: controldata.c:481 +#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258 +#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310 +#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354 +#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383 +#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427 +#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471 +#: controldata.c:482 controldata.c:493 #, c-format msgid "%d: controldata retrieval problem\n" msgstr "%d : problème de récupération des controldata\n" -#: controldata.c:560 +#: controldata.c:572 #, c-format msgid "The source cluster lacks some required control information:\n" msgstr "Il manque certaines informations de contrôle requises sur l'instance source :\n" -#: controldata.c:563 +#: controldata.c:575 #, c-format msgid "The target cluster lacks some required control information:\n" msgstr "Il manque certaines informations de contrôle requises sur l'instance cible :\n" -#: controldata.c:566 +#: controldata.c:578 #, c-format msgid " checkpoint next XID\n" msgstr " XID du prochain checkpoint\n" -#: controldata.c:569 +#: controldata.c:581 #, c-format msgid " latest checkpoint next OID\n" msgstr " prochain OID du dernier checkpoint\n" -#: controldata.c:572 +#: controldata.c:584 #, c-format msgid " latest checkpoint next MultiXactId\n" msgstr " prochain MultiXactId du dernier checkpoint\n" -#: controldata.c:576 +#: controldata.c:588 #, c-format msgid " latest checkpoint oldest MultiXactId\n" msgstr " plus ancien MultiXactId du dernier checkpoint\n" -#: controldata.c:579 +#: controldata.c:591 +#, c-format +msgid " latest checkpoint oldestXID\n" +msgstr " oldestXID du dernier checkpoint\n" + +#: controldata.c:594 #, c-format msgid " latest checkpoint next MultiXactOffset\n" msgstr " prochain MultiXactOffset du dernier checkpoint\n" -#: controldata.c:582 +#: controldata.c:597 #, c-format msgid " first WAL segment after reset\n" msgstr " premier segment WAL après réinitialisation\n" -#: controldata.c:585 +#: controldata.c:600 #, c-format msgid " float8 argument passing method\n" msgstr " méthode de passage de arguments float8\n" -#: controldata.c:588 +#: controldata.c:603 #, c-format msgid " maximum alignment\n" msgstr " alignement maximale\n" -#: controldata.c:591 +#: controldata.c:606 #, c-format msgid " block size\n" msgstr " taille de bloc\n" -#: controldata.c:594 +#: controldata.c:609 #, c-format msgid " large relation segment size\n" msgstr " taille de segment des relations\n" -#: controldata.c:597 +#: controldata.c:612 #, c-format msgid " WAL block size\n" msgstr " taille de bloc d'un WAL\n" -#: controldata.c:600 +#: controldata.c:615 #, c-format msgid " WAL segment size\n" msgstr " taille d'un segment WAL\n" -#: controldata.c:603 +#: controldata.c:618 #, c-format msgid " maximum identifier length\n" msgstr " longueur maximum d'un identifiant\n" -#: controldata.c:606 +#: controldata.c:621 #, c-format msgid " maximum number of indexed columns\n" msgstr " nombre maximum de colonnes indexées\n" -#: controldata.c:609 +#: controldata.c:624 #, c-format msgid " maximum TOAST chunk size\n" msgstr " taille maximale d'un morceau de TOAST\n" -#: controldata.c:613 +#: controldata.c:628 #, c-format msgid " large-object chunk size\n" msgstr " taille d'un morceau Large-Object\n" -#: controldata.c:616 +#: controldata.c:631 #, c-format msgid " dates/times are integers?\n" msgstr " les dates/heures sont-ils des integers?\n" -#: controldata.c:620 +#: controldata.c:635 #, c-format msgid " data checksum version\n" msgstr " version des sommes de contrôle des données\n" -#: controldata.c:622 +#: controldata.c:637 #, c-format msgid "Cannot continue without required control information, terminating\n" msgstr "Ne peut pas continuer sans les informations de contrôle requises, en arrêt\n" -#: controldata.c:637 +#: controldata.c:652 #, c-format msgid "" "old and new pg_controldata alignments are invalid or do not match\n" @@ -627,77 +659,77 @@ msgstr "" "les alignements sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" "Il est probable qu'une installation soit en 32 bits et l'autre en 64 bits.\n" -#: controldata.c:641 +#: controldata.c:656 #, c-format msgid "old and new pg_controldata block sizes are invalid or do not match\n" msgstr "les tailles de bloc sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" -#: controldata.c:644 +#: controldata.c:659 #, c-format msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n" msgstr "les tailles maximales de segment de relation sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" -#: controldata.c:647 +#: controldata.c:662 #, c-format msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n" msgstr "les tailles de bloc des WAL sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" -#: controldata.c:650 +#: controldata.c:665 #, c-format msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n" msgstr "les tailles de segment de WAL sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" -#: controldata.c:653 +#: controldata.c:668 #, c-format msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n" msgstr "les longueurs maximales des identifiants sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" -#: controldata.c:656 +#: controldata.c:671 #, c-format msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n" msgstr "les nombres maximums de colonnes indexées sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" -#: controldata.c:659 +#: controldata.c:674 #, c-format msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n" msgstr "les tailles maximales de morceaux des TOAST sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" -#: controldata.c:664 +#: controldata.c:679 #, c-format msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n" msgstr "les tailles des morceaux de Large Objects sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" -#: controldata.c:667 +#: controldata.c:682 #, c-format msgid "old and new pg_controldata date/time storage types do not match\n" msgstr "les types de stockage date/heure ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" -#: controldata.c:680 +#: controldata.c:695 #, c-format msgid "old cluster does not use data checksums but the new one does\n" msgstr "l'ancienne instance n'utilise pas les sommes de contrôle alors que la nouvelle les utilise\n" -#: controldata.c:683 +#: controldata.c:698 #, c-format msgid "old cluster uses data checksums but the new one does not\n" msgstr "l'ancienne instance utilise les sommes de contrôle alors que la nouvelle ne les utilise pas\n" -#: controldata.c:685 +#: controldata.c:700 #, c-format msgid "old and new cluster pg_controldata checksum versions do not match\n" msgstr "les versions des sommes de contrôle ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" -#: controldata.c:696 +#: controldata.c:711 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "Ajout du suffixe « .old » à l'ancien global/pg_control" -#: controldata.c:701 +#: controldata.c:716 #, c-format msgid "Unable to rename %s to %s.\n" msgstr "Incapable de renommer %s à %s.\n" -#: controldata.c:704 +#: controldata.c:719 #, c-format msgid "" "\n" @@ -718,11 +750,6 @@ msgstr "" msgid "Creating dump of global objects" msgstr "Création de la sauvegarde des objets globaux" -#: dump.c:31 -#, c-format -msgid "Creating dump of database schemas\n" -msgstr "Création de la sauvegarde des schémas des bases\n" - #: exec.c:45 #, c-format msgid "could not get pg_ctl version data using %s: %s\n" @@ -733,22 +760,22 @@ msgstr "n'a pas pu obtenir la version de pg_ctl en utilisant %s : %s\n" msgid "could not get pg_ctl version output from %s\n" msgstr "n'a pas pu obtenir la version de pg_ctl à partir de %s\n" -#: exec.c:105 exec.c:109 +#: exec.c:108 exec.c:112 #, c-format msgid "command too long\n" msgstr "commande trop longue\n" -#: exec.c:111 util.c:37 util.c:225 +#: exec.c:114 util.c:37 util.c:264 #, c-format msgid "%s\n" msgstr "%s\n" -#: exec.c:150 option.c:217 +#: exec.c:153 pg_upgrade.c:242 #, c-format msgid "could not open log file \"%s\": %m\n" -msgstr "n'a pas pu ouvrir le fichier de traces « %s » : %m\n" +msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m\n" -#: exec.c:179 +#: exec.c:182 #, c-format msgid "" "\n" @@ -757,66 +784,66 @@ msgstr "" "\n" "*échec*" -#: exec.c:182 +#: exec.c:185 #, c-format msgid "There were problems executing \"%s\"\n" msgstr "Il y a eu des problèmes lors de l'exécution de « %s »\n" -#: exec.c:185 +#: exec.c:188 #, c-format msgid "" "Consult the last few lines of \"%s\" or \"%s\" for\n" "the probable cause of the failure.\n" msgstr "Consultez les dernières lignes de « %s » ou « %s » pour trouver la cause probable de l'échec.\n" -#: exec.c:190 +#: exec.c:193 #, c-format msgid "" "Consult the last few lines of \"%s\" for\n" "the probable cause of the failure.\n" msgstr "Consultez les dernières lignes de « %s » pour trouver la cause probable de l'échec.\n" -#: exec.c:205 option.c:226 +#: exec.c:208 pg_upgrade.c:250 #, c-format msgid "could not write to log file \"%s\": %m\n" msgstr "n'a pas pu écrire dans le fichier de traces « %s »\n" -#: exec.c:231 +#: exec.c:234 #, c-format msgid "could not open file \"%s\" for reading: %s\n" msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %s\n" -#: exec.c:258 +#: exec.c:261 #, c-format msgid "You must have read and write access in the current directory.\n" msgstr "Vous devez avoir les droits de lecture et d'écriture dans le répertoire actuel.\n" -#: exec.c:311 exec.c:377 +#: exec.c:314 exec.c:380 #, c-format msgid "check for \"%s\" failed: %s\n" msgstr "échec de la vérification de « %s » : %s\n" -#: exec.c:314 exec.c:380 +#: exec.c:317 exec.c:383 #, c-format msgid "\"%s\" is not a directory\n" msgstr "« %s » n'est pas un répertoire\n" -#: exec.c:430 +#: exec.c:433 #, c-format msgid "check for \"%s\" failed: not a regular file\n" msgstr "échec de la vérification de « %s » : pas un fichier régulier\n" -#: exec.c:433 +#: exec.c:436 #, c-format msgid "check for \"%s\" failed: cannot execute (permission denied)\n" msgstr "échec de la vérification de « %s » : ne peut pas exécuter (droit refusé)\n" -#: exec.c:439 +#: exec.c:442 #, c-format msgid "check for \"%s\" failed: cannot execute\n" msgstr "échec de la vérification de « %s » : ne peut pas exécuter\n" -#: exec.c:449 +#: exec.c:452 #, c-format msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n" msgstr "" @@ -902,74 +929,22 @@ msgstr "" "n'a pas pu créer le lien physique entre l'ancien et le nouveau répertoires de données : %s\n" "Dans le mode lien, les ancien et nouveau répertoires de données doivent être sur le même système de fichiers.\n" -#: function.c:114 -#, c-format -msgid "" -"\n" -"The old cluster has a \"plpython_call_handler\" function defined\n" -"in the \"public\" schema which is a duplicate of the one defined\n" -"in the \"pg_catalog\" schema. You can confirm this by executing\n" -"in psql:\n" -"\n" -" \\df *.plpython_call_handler\n" -"\n" -"The \"public\" schema version of this function was created by a\n" -"pre-8.1 install of plpython, and must be removed for pg_upgrade\n" -"to complete because it references a now-obsolete \"plpython\"\n" -"shared object file. You can remove the \"public\" schema version\n" -"of this function by running the following command:\n" -"\n" -" DROP FUNCTION public.plpython_call_handler()\n" -"\n" -"in each affected database:\n" -"\n" -msgstr "" -"\n" -"L'ancienne instance comprend une fonction « plpython_call_handler »\n" -"définie dans le schéma « public » qui est un duplicat de celle définie\n" -"dans le schéma « pg_catalog ». Vous pouvez confirmer cela en\n" -"exécutant dans psql :\n" -"\n" -" \\df *.plpython_call_handler\n" -"\n" -"La version de cette fonction dans le schéma « public » a été créée\n" -"par une installation de plpython antérieure à la version 8.1 et doit\n" -"être supprimée pour que pg_upgrade puisse termine parce qu'elle\n" -"référence un fichier objet partagé « plpython » maintenant obsolète.\n" -"Vous pouvez supprimer la version de cette fonction dans le schéma\n" -"« public » en exécutant la commande suivante :\n" -"\n" -" DROP FUNCTION public.plpython_call_handler()\n" -"\n" -"dans chaque base de données affectée :\n" -"\n" - -#: function.c:132 -#, c-format -msgid " %s\n" -msgstr " %s\n" - -#: function.c:142 -#, c-format -msgid "Remove the problem functions from the old cluster to continue.\n" -msgstr "Supprimez les fonctions problématiques de l'ancienne instance pour continuer.\n" - -#: function.c:189 +#: function.c:129 #, c-format msgid "Checking for presence of required libraries" msgstr "Vérification de la présence des bibliothèques requises" -#: function.c:242 +#: function.c:167 #, c-format msgid "could not load library \"%s\": %s" msgstr "n'a pas pu charger la bibliothèque « %s » : %s" -#: function.c:253 +#: function.c:178 #, c-format msgid "In database: %s\n" msgstr "Dans la base de données : %s\n" -#: function.c:263 +#: function.c:188 #, c-format msgid "" "Your installation references loadable libraries that are missing from the\n" @@ -986,66 +961,47 @@ msgstr "" " %s\n" "\n" -#: info.c:131 +#: info.c:125 #, c-format msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n" msgstr "Les noms de relation pour l'OID %u dans la base de données « %s » ne correspondent pas : ancien nom « %s.%s », nouveau nom « %s.%s »\n" -#: info.c:151 +#: info.c:145 #, c-format msgid "Failed to match up old and new tables in database \"%s\"\n" msgstr "Échec de correspondance des anciennes et nouvelles tables dans la base de données « %s »\n" -#: info.c:240 +#: info.c:226 #, c-format msgid " which is an index on \"%s.%s\"" msgstr " qui est un index sur \"%s.%s\"" -#: info.c:250 +#: info.c:236 #, c-format msgid " which is an index on OID %u" msgstr " qui est un index sur l'OID %u" -#: info.c:262 +#: info.c:248 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr " qui est la table TOAST pour « %s.%s »" -#: info.c:270 +#: info.c:256 #, c-format msgid " which is the TOAST table for OID %u" msgstr " qui est la table TOAST pour l'OID %u" -#: info.c:274 +#: info.c:260 #, c-format msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n" msgstr "Aucune correspondance trouvée dans l'ancienne instance pour la nouvelle relation d'OID %u dans la base de données « %s » : %s\n" -#: info.c:277 +#: info.c:263 #, c-format msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n" msgstr "Aucune correspondance trouvée dans la nouvelle instance pour la nouvelle relation d'OID %u dans la base de données « %s » : %s\n" -#: info.c:289 -#, c-format -msgid "mappings for database \"%s\":\n" -msgstr "correspondances pour la base de données « %s » :\n" - -#: info.c:292 -#, c-format -msgid "%s.%s: %u to %u\n" -msgstr "%s.%s : %u vers %u\n" - -#: info.c:297 info.c:633 -#, c-format -msgid "" -"\n" -"\n" -msgstr "" -"\n" -"\n" - -#: info.c:322 +#: info.c:287 #, c-format msgid "" "\n" @@ -1054,7 +1010,7 @@ msgstr "" "\n" "bases de données sources :\n" -#: info.c:324 +#: info.c:289 #, c-format msgid "" "\n" @@ -1063,89 +1019,100 @@ msgstr "" "\n" "bases de données cibles :\n" -#: info.c:631 +#: info.c:605 #, c-format msgid "Database: %s\n" msgstr "Base de données : %s\n" -#: info.c:644 +#: info.c:607 +#, c-format +msgid "" +"\n" +"\n" +msgstr "" +"\n" +"\n" + +#: info.c:618 #, c-format msgid "relname: %s.%s: reloid: %u reltblspace: %s\n" msgstr "relname : %s.%s : reloid : %u reltblspace : %s\n" -#: option.c:102 +#: option.c:100 #, c-format msgid "%s: cannot be run as root\n" msgstr "%s : ne peut pas être exécuté en tant que root\n" -#: option.c:170 +#: option.c:167 #, c-format msgid "invalid old port number\n" msgstr "ancien numéro de port invalide\n" -#: option.c:175 +#: option.c:172 #, c-format msgid "invalid new port number\n" msgstr "nouveau numéro de port invalide\n" -#: option.c:207 +#: option.c:198 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Essayez « %s --help » pour plus d'informations.\n" -#: option.c:214 +#: option.c:205 #, c-format msgid "too many command-line arguments (first is \"%s\")\n" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)\n" -#: option.c:220 +#: option.c:208 #, c-format msgid "Running in verbose mode\n" msgstr "Exécution en mode verbeux\n" -#: option.c:251 +#: option.c:226 msgid "old cluster binaries reside" msgstr "les binaires de l'ancienne instance résident" -#: option.c:253 +#: option.c:228 msgid "new cluster binaries reside" msgstr "les binaires de la nouvelle instance résident" -#: option.c:255 +#: option.c:230 msgid "old cluster data resides" msgstr "les données de l'ancienne instance résident" -#: option.c:257 +#: option.c:232 msgid "new cluster data resides" msgstr "les données de la nouvelle instance résident" -#: option.c:259 +#: option.c:234 msgid "sockets will be created" msgstr "les sockets seront créés" -#: option.c:276 option.c:374 +#: option.c:251 option.c:350 #, c-format msgid "could not determine current directory\n" msgstr "n'a pas pu déterminer le répertoire courant\n" -#: option.c:279 +#: option.c:254 #, c-format msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n" msgstr "ne peut pas exécuter pg_upgrade depuis le répertoire de données de la nouvelle instance sur Windows\n" -#: option.c:288 +#: option.c:263 #, c-format msgid "" "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n" "\n" -msgstr "pg_upgrade met à jour une instance PostgreSQL vers une version majeure différente.\n" +msgstr "" +"pg_upgrade met à jour une instance PostgreSQL vers une version majeure\n" +"différente.\n" -#: option.c:289 +#: option.c:264 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: option.c:290 +#: option.c:265 #, c-format msgid "" " pg_upgrade [OPTION]...\n" @@ -1154,107 +1121,138 @@ msgstr "" " pg_upgrade [OPTION]...\n" "\n" -#: option.c:291 +#: option.c:266 #, c-format msgid "Options:\n" msgstr "Options :\n" -#: option.c:292 +#: option.c:267 #, c-format msgid " -b, --old-bindir=BINDIR old cluster executable directory\n" -msgstr " -b, --old-bindir=DIRBIN répertoire des exécutables de l'ancienne instance\n" +msgstr "" +" -b, --old-bindir=RÉP_BIN répertoire des exécutables de l'ancienne\n" +" instance\n" -#: option.c:293 +#: option.c:268 #, c-format msgid "" " -B, --new-bindir=BINDIR new cluster executable directory (default\n" " same directory as pg_upgrade)\n" msgstr "" -" -B, --new-bindir=DIRBIN répertoire des exécutables de la nouvelle instance (par défaut,\n" -" le même répertoire que pg_upgrade)\n" -"\n" +" -B, --new-bindir=RÉP_BIN répertoire des exécutables de la nouvelle\n" +" instance (par défaut, le même répertoire que\n" +" pg_upgrade)\n" -#: option.c:295 +#: option.c:270 #, c-format msgid " -c, --check check clusters only, don't change any data\n" -msgstr " -c, --check vérifie seulement les instances, pas de modifications\n" +msgstr "" +" -c, --check vérifie seulement les instances, pas de\n" +" modifications\n" -#: option.c:296 +#: option.c:271 #, c-format msgid " -d, --old-datadir=DATADIR old cluster data directory\n" -msgstr " -d, --old-datadir=DIRDONNEES répertoire des données de l'ancienne instance\n" +msgstr " -d, --old-datadir=RÉP_DONNÉES répertoire des données de l'ancienne instance\n" -#: option.c:297 +#: option.c:272 #, c-format msgid " -D, --new-datadir=DATADIR new cluster data directory\n" -msgstr " -D, --new-datadir=DIRDONNEES répertoire des données de la nouvelle instance\n" +msgstr " -D, --new-datadir=RÉP_DONNÉES répertoire des données de la nouvelle instance\n" -#: option.c:298 +#: option.c:273 #, c-format msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n" -msgstr " -j, --jobs=NUM nombre de processus ou threads simultanés à utiliser\n" +msgstr "" +" -j, --jobs=NUM nombre de processus ou threads simultanés à\n" +" utiliser\n" -#: option.c:299 +#: option.c:274 #, c-format msgid " -k, --link link instead of copying files to new cluster\n" -msgstr " -k, --link lie les fichiers au lieu de les copier vers la nouvelle instance\n" +msgstr "" +" -k, --link lie les fichiers au lieu de les copier vers la\n" +" nouvelle instance\n" + +#: option.c:275 +#, c-format +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr "" +" -N, --nosync n'attend pas que les modifications soient proprement\n" +" écrites sur disque\n" -#: option.c:300 +#: option.c:276 #, c-format msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n" -msgstr " -o, --old-options=OPTIONS options à passer au serveur de l'ancienne instance\n" +msgstr "" +" -o, --old-options=OPTIONS options à passer au serveur de l'ancienne\n" +" instance\n" -#: option.c:301 +#: option.c:277 #, c-format msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n" -msgstr " -O, --new-options=OPTIONS options à passer au serveur de la nouvelle instance\n" +msgstr "" +" -O, --new-options=OPTIONS options à passer au serveur de la nouvelle\n" +" instance\n" -#: option.c:302 +#: option.c:278 #, c-format msgid " -p, --old-port=PORT old cluster port number (default %d)\n" -msgstr " -p, --old-port=PORT numéro de port de l'ancienne instance (par défaut %d)\n" +msgstr "" +" -p, --old-port=PORT numéro de port de l'ancienne instance (par\n" +" défaut %d)\n" -#: option.c:303 +#: option.c:279 #, c-format msgid " -P, --new-port=PORT new cluster port number (default %d)\n" -msgstr " -P, --new-port=PORT numéro de port de la nouvelle instance (par défaut %d)\n" +msgstr "" +" -P, --new-port=PORT numéro de port de la nouvelle instance (par\n" +" défaut %d)\n" -#: option.c:304 +#: option.c:280 #, c-format msgid " -r, --retain retain SQL and log files after success\n" -msgstr " -r, --retain conserve les fichiers SQL et de traces en cas de succès\n" +msgstr "" +" -r, --retain conserve les fichiers SQL et de traces en cas\n" +" de succès\n" -#: option.c:305 +#: option.c:281 #, c-format msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" -msgstr " -s, --socketdir=DIR répertoire de la socket à utiliser (par défaut le répertoire courant)\n" +msgstr "" +" -s, --socketdir=RÉP_SOCKET répertoire de la socket à utiliser (par défaut\n" +" le répertoire courant)\n" -#: option.c:306 +#: option.c:282 #, c-format msgid " -U, --username=NAME cluster superuser (default \"%s\")\n" -msgstr " -U, --username=NOM superutilisateur de l'instance (par défaut « %s »)\n" +msgstr "" +" -U, --username=NOM super-utilisateur de l'instance (par défaut\n" +" « %s »)\n" -#: option.c:307 +#: option.c:283 #, c-format msgid " -v, --verbose enable verbose internal logging\n" -msgstr " -v, --verbose active des traces internes verbeuses\n" +msgstr " -v, --verbose active des traces internes verbeuses\n" -#: option.c:308 +#: option.c:284 #, c-format msgid " -V, --version display version information, then exit\n" -msgstr " -V, --version affiche la version, puis quitte\n" +msgstr " -V, --version affiche la version, puis quitte\n" -#: option.c:309 +#: option.c:285 #, c-format msgid " --clone clone instead of copying files to new cluster\n" -msgstr " --clone clone au lieu de copier les fichiers vers la nouvelle instance\n" +msgstr "" +" --clone clone au lieu de copier les fichiers vers la\n" +" nouvelle instance\n" -#: option.c:310 +#: option.c:286 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide, puis quitte\n" +msgstr " -?, --help affiche cette aide, puis quitte\n" -#: option.c:311 +#: option.c:287 #, c-format msgid "" "\n" @@ -1270,7 +1268,7 @@ msgstr "" " arrêter le postmaster de la nouvelle instance\n" "\n" -#: option.c:316 +#: option.c:292 #, c-format msgid "" "\n" @@ -1282,12 +1280,12 @@ msgid "" msgstr "" "\n" "Quand vous exécutez pg_upgrade, vous devez fournir les informations suivantes :\n" -" le répertoire de données pour l'ancienne instance (-d DIRDONNÉES)\n" -" le répertoire de données pour la nouvelle instance (-D DIRDONNÉES)\n" -" le répertoire « bin » pour l'ancienne version (-b DIRBIN)\n" -" le répertoire « bin » pour la nouvelle version (-B DIRBIN)\n" +" le répertoire de données pour l'ancienne instance (-d RÉP_DONNÉES)\n" +" le répertoire de données pour la nouvelle instance (-D RÉP_DONNÉES)\n" +" le répertoire « bin » pour l'ancienne version (-b RÉP_BIN)\n" +" le répertoire « bin » pour la nouvelle version (-B RÉP_BIN)\n" -#: option.c:322 +#: option.c:298 #, c-format msgid "" "\n" @@ -1300,7 +1298,7 @@ msgstr "" " pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n" "ou\n" -#: option.c:327 +#: option.c:303 #, c-format msgid "" " $ export PGDATAOLD=oldCluster/data\n" @@ -1315,7 +1313,7 @@ msgstr "" " $ export PGBINNEW=newCluster/bin\n" " $ pg_upgrade\n" -#: option.c:333 +#: option.c:309 #, c-format msgid "" " C:\\> set PGDATAOLD=oldCluster/data\n" @@ -1330,7 +1328,7 @@ msgstr "" " C:\\> set PGBINNEW=newCluster/bin\n" " C:\\> pg_upgrade\n" -#: option.c:339 +#: option.c:315 #, c-format msgid "" "\n" @@ -1339,12 +1337,12 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: option.c:340 +#: option.c:316 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil %s : <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" -#: option.c:380 +#: option.c:356 #, c-format msgid "" "You must identify the directory where the %s.\n" @@ -1353,27 +1351,27 @@ msgstr "" "Vous devez identifier le répertoire où le %s.\n" "Merci d'utiliser l'option en ligne de commande %s ou la variable d'environnement %s.\n" -#: option.c:432 +#: option.c:408 #, c-format msgid "Finding the real data directory for the source cluster" msgstr "Recherche du vrai répertoire des données pour l'instance source" -#: option.c:434 +#: option.c:410 #, c-format msgid "Finding the real data directory for the target cluster" msgstr "Recherche du vrai répertoire des données pour l'instance cible" -#: option.c:446 +#: option.c:422 #, c-format msgid "could not get data directory using %s: %s\n" msgstr "n'a pas pu obtenir le répertoire des données en utilisant %s : %s\n" -#: option.c:505 +#: option.c:473 #, c-format msgid "could not read line %d from file \"%s\": %s\n" msgstr "n'a pas pu lire la ligne %d du fichier « %s » : %s\n" -#: option.c:522 +#: option.c:490 #, c-format msgid "user-supplied old port number %hu corrected to %hu\n" msgstr "ancien numéro de port %hu fourni par l'utilisateur corrigé en %hu\n" @@ -1403,12 +1401,12 @@ msgstr "le processus fils a quitté anormalement : statut %d\n" msgid "child worker exited abnormally: %s\n" msgstr "le processus fils a quitté anormalement : %s\n" -#: pg_upgrade.c:107 +#: pg_upgrade.c:103 #, c-format msgid "could not read permissions of directory \"%s\": %s\n" msgstr "n'a pas pu lire les droits du répertoire « %s » : %s\n" -#: pg_upgrade.c:122 +#: pg_upgrade.c:135 #, c-format msgid "" "\n" @@ -1419,17 +1417,17 @@ msgstr "" "Réalisation de la mise à jour\n" "-----------------------------\n" -#: pg_upgrade.c:165 +#: pg_upgrade.c:178 #, c-format msgid "Setting next OID for new cluster" msgstr "Configuration du prochain OID sur la nouvelle instance" -#: pg_upgrade.c:172 +#: pg_upgrade.c:187 #, c-format msgid "Sync data directory to disk" msgstr "Synchronisation du répertoire des données sur disque" -#: pg_upgrade.c:183 +#: pg_upgrade.c:199 #, c-format msgid "" "\n" @@ -1440,12 +1438,17 @@ msgstr "" "Mise à jour terminée\n" "--------------------\n" -#: pg_upgrade.c:216 +#: pg_upgrade.c:233 pg_upgrade.c:235 pg_upgrade.c:237 +#, c-format +msgid "could not create directory \"%s\": %m\n" +msgstr "n'a pas pu créer le répertoire « %s » : %m\n" + +#: pg_upgrade.c:282 #, c-format msgid "%s: could not find own program executable\n" -msgstr "%s : n'a pas pu trouver son propre exécutable\n" +msgstr "%s : n'a pas pu trouver l'exécutable du programme\n" -#: pg_upgrade.c:242 +#: pg_upgrade.c:308 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" @@ -1454,7 +1457,7 @@ msgstr "" "Il semble qu'un postmaster est démarré sur l'ancienne instance.\n" "Merci d'arrêter ce postmaster et d'essayer de nouveau.\n" -#: pg_upgrade.c:255 +#: pg_upgrade.c:321 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" @@ -1463,127 +1466,112 @@ msgstr "" "Il semble qu'un postmaster est démarré sur la nouvelle instance.\n" "Merci d'arrêter ce postmaster et d'essayer de nouveau.\n" -#: pg_upgrade.c:269 +#: pg_upgrade.c:335 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Analyse de toutes les lignes dans la nouvelle instance" -#: pg_upgrade.c:282 +#: pg_upgrade.c:348 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Gel de toutes les lignes dans la nouvelle instance" -#: pg_upgrade.c:302 +#: pg_upgrade.c:368 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Restauration des objets globaux dans la nouvelle instance" -#: pg_upgrade.c:317 -#, c-format -msgid "Restoring database schemas in the new cluster\n" -msgstr "Restauration des schémas des bases de données dans la nouvelle instance\n" - -#: pg_upgrade.c:421 +#: pg_upgrade.c:490 #, c-format msgid "Deleting files from new %s" msgstr "Suppression des fichiers à partir du nouveau %s" -#: pg_upgrade.c:425 +#: pg_upgrade.c:494 #, c-format msgid "could not delete directory \"%s\"\n" msgstr "n'a pas pu supprimer le répertoire « %s »\n" -#: pg_upgrade.c:444 +#: pg_upgrade.c:513 #, c-format msgid "Copying old %s to new server" msgstr "Copie de l'ancien %s vers le nouveau serveur" -#: pg_upgrade.c:471 +#: pg_upgrade.c:539 +#, c-format +msgid "Setting oldest XID for new cluster" +msgstr "Configuration du plus ancien XID sur la nouvelle instance" + +#: pg_upgrade.c:547 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "Configuration du prochain identifiant de transaction et de l'epoch pour la nouvelle instance" -#: pg_upgrade.c:501 +#: pg_upgrade.c:577 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "Configuration du prochain MultiXactId et décalage pour la nouvelle instance" -#: pg_upgrade.c:525 +#: pg_upgrade.c:601 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Configuration du plus ancien identifiant multixact sur la nouvelle instance" -#: pg_upgrade.c:545 +#: pg_upgrade.c:621 #, c-format msgid "Resetting WAL archives" msgstr "Réinitialisation des archives WAL" -#: pg_upgrade.c:588 +#: pg_upgrade.c:664 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Configuration des compteurs frozenxid et minmxid dans la nouvelle instance" -#: pg_upgrade.c:590 +#: pg_upgrade.c:666 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Configuration du compteur minmxid dans la nouvelle instance" -#: relfilenode.c:35 -#, c-format -msgid "Cloning user relation files\n" -msgstr "Clonage des fichiers des relations utilisateurs\n" - -#: relfilenode.c:38 -#, c-format -msgid "Copying user relation files\n" -msgstr "Copie des fichiers des relations utilisateurs\n" - -#: relfilenode.c:41 -#, c-format -msgid "Linking user relation files\n" -msgstr "Création des liens pour les fichiers des relations utilisateurs\n" - #: relfilenode.c:115 #, c-format msgid "old database \"%s\" not found in the new cluster\n" msgstr "ancienne base de données « %s » introuvable dans la nouvelle instance\n" -#: relfilenode.c:230 +#: relfilenode.c:218 #, c-format msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n" msgstr "erreur lors de la vérification de l'existence du fichier « %s.%s » (« %s » vers « %s ») : %s\n" -#: relfilenode.c:248 +#: relfilenode.c:236 #, c-format msgid "rewriting \"%s\" to \"%s\"\n" msgstr "réécriture de « %s » en « %s »\n" -#: relfilenode.c:256 +#: relfilenode.c:244 #, c-format msgid "cloning \"%s\" to \"%s\"\n" msgstr "clonage de « %s » en « %s »\n" -#: relfilenode.c:261 +#: relfilenode.c:249 #, c-format msgid "copying \"%s\" to \"%s\"\n" msgstr "copie de « %s » en « %s »\n" -#: relfilenode.c:266 +#: relfilenode.c:254 #, c-format msgid "linking \"%s\" to \"%s\"\n" msgstr "lien de « %s » vers « %s »\n" -#: server.c:38 server.c:142 util.c:135 util.c:165 +#: server.c:39 server.c:143 util.c:174 util.c:204 #, c-format msgid "Failure, exiting\n" msgstr "Échec, sortie\n" -#: server.c:132 +#: server.c:133 #, c-format msgid "executing: %s\n" msgstr "exécution : %s\n" -#: server.c:138 +#: server.c:139 #, c-format msgid "" "SQL command failed\n" @@ -1594,17 +1582,17 @@ msgstr "" "%s\n" "%s" -#: server.c:168 +#: server.c:169 #, c-format msgid "could not open version file \"%s\": %m\n" msgstr "n'a pas pu ouvrir le fichier de version « %s » : %m\n" -#: server.c:172 +#: server.c:173 #, c-format msgid "could not parse version file \"%s\"\n" msgstr "n'a pas pu analyser le fichier de version « %s »\n" -#: server.c:298 +#: server.c:291 #, c-format msgid "" "\n" @@ -1613,7 +1601,7 @@ msgstr "" "\n" "%s" -#: server.c:302 +#: server.c:295 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -1622,7 +1610,7 @@ msgstr "" "n'a pas pu se connecter au postmaster source lancé avec la commande :\n" "%s\n" -#: server.c:306 +#: server.c:299 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -1631,22 +1619,22 @@ msgstr "" "n'a pas pu se connecter au postmaster cible lancé avec la commande :\n" "%s\n" -#: server.c:320 +#: server.c:313 #, c-format msgid "pg_ctl failed to start the source server, or connection failed\n" msgstr "pg_ctl a échoué à démarrer le serveur source ou connexion échouée\n" -#: server.c:322 +#: server.c:315 #, c-format msgid "pg_ctl failed to start the target server, or connection failed\n" msgstr "pg_ctl a échoué à démarrer le serveur cible ou connexion échouée\n" -#: server.c:367 +#: server.c:360 #, c-format msgid "out of memory\n" msgstr "mémoire épuisée\n" -#: server.c:380 +#: server.c:373 #, c-format msgid "libpq environment variable %s has a non-local server value: %s\n" msgstr "la variable d'environnement libpq %s a une valeur serveur non locale : %s\n" @@ -1658,88 +1646,42 @@ msgid "" "using tablespaces.\n" msgstr "Ne peut pas mettre à jour vers ou à partir de la même version de catalogue système quand des tablespaces sont utilisés.\n" -#: tablespace.c:86 +#: tablespace.c:83 #, c-format msgid "tablespace directory \"%s\" does not exist\n" msgstr "le répertoire « %s » du tablespace n'existe pas\n" -#: tablespace.c:90 +#: tablespace.c:87 #, c-format msgid "could not stat tablespace directory \"%s\": %s\n" msgstr "n'a pas pu tester le répertoire « %s » du tablespace : %s\n" -#: tablespace.c:95 +#: tablespace.c:92 #, c-format msgid "tablespace path \"%s\" is not a directory\n" msgstr "le chemin « %s » du tablespace n'est pas un répertoire\n" -#: util.c:49 -#, c-format -msgid " " -msgstr " " - -#: util.c:82 +#: util.c:52 util.c:82 util.c:115 #, c-format msgid "%-*s" msgstr "%-*s" -#: util.c:174 -#, c-format -msgid "ok" -msgstr "ok" - -#: version.c:29 -#, c-format -msgid "Checking for large objects" -msgstr "Vérification des Large Objects" - -#: version.c:77 version.c:419 -#, c-format -msgid "warning" -msgstr "attention" - -#: version.c:79 +#: util.c:113 #, c-format -msgid "" -"\n" -"Your installation contains large objects. The new database has an\n" -"additional large object permission table. After upgrading, you will be\n" -"given a command to populate the pg_largeobject_metadata table with\n" -"default permissions.\n" -"\n" -msgstr "" -"\n" -"Votre installation contient des Large Objects. La nouvelle base de données a une table de droit supplémentaire sur les Large Objects.\n" -"Après la mise à jour, vous disposerez d'une commande pour peupler la table pg_largeobject_metadata avec les droits par défaut.\n" -"\n" +msgid "%-*s\n" +msgstr "%-*s\n" -#: version.c:85 +#: util.c:213 #, c-format -msgid "" -"\n" -"Your installation contains large objects. The new database has an\n" -"additional large object permission table, so default permissions must be\n" -"defined for all large objects. The file\n" -" %s\n" -"when executed by psql by the database superuser will set the default\n" -"permissions.\n" -"\n" -msgstr "" -"\n" -"Votre installation contient des Large Objects. La nouvelle base de données\n" -"a une table de droit supplémentaire pour les Large Objects, donc les droits\n" -"par défaut doivent être définies pour tous les Large Objects. Le fichier\n" -" %s\n" -"une fois exécuté par psql avec un superutilisateur définira les droits par\n" -"défaut.\n" -"\n" +msgid "ok" +msgstr "ok" -#: version.c:272 +#: version.c:184 #, c-format msgid "Checking for incompatible \"line\" data type" msgstr "Vérification des types de données line incompatibles" -#: version.c:279 +#: version.c:191 #, c-format msgid "" "Your installation contains the \"line\" data type in user tables.\n" @@ -1759,12 +1701,12 @@ msgstr "" " %s\n" "\n" -#: version.c:310 +#: version.c:222 #, c-format msgid "Checking for invalid \"unknown\" user columns" msgstr "Vérification des colonnes utilisateurs « unknown » invalides" -#: version.c:317 +#: version.c:229 #, c-format msgid "" "Your installation contains the \"unknown\" data type in user tables.\n" @@ -1783,12 +1725,17 @@ msgstr "" " %s\n" "\n" -#: version.c:341 +#: version.c:253 #, c-format msgid "Checking for hash indexes" msgstr "Vérification des index hash" -#: version.c:421 +#: version.c:331 +#, c-format +msgid "warning" +msgstr "attention" + +#: version.c:333 #, c-format msgid "" "\n" @@ -1805,7 +1752,7 @@ msgstr "" "REINDEX vous seront données.\n" "\n" -#: version.c:427 +#: version.c:339 #, c-format msgid "" "\n" @@ -1826,12 +1773,12 @@ msgstr "" "index invalides. Avant cela, aucun de ces index ne sera utilisé.\n" "\n" -#: version.c:453 +#: version.c:365 #, c-format msgid "Checking for invalid \"sql_identifier\" user columns" msgstr "Vérification des colonnes utilisateurs « sql_identifier » invalides" -#: version.c:461 +#: version.c:373 #, c-format msgid "" "Your installation contains the \"sql_identifier\" data type in user tables.\n" @@ -1851,55 +1798,151 @@ msgstr "" " %s\n" "\n" -#~ msgid "waitpid() failed: %s\n" -#~ msgstr "échec de waitpid() : %s\n" +#: version.c:397 +#, c-format +msgid "Checking for extension updates" +msgstr "Vérification des mises à jour d'extension" + +#: version.c:449 +#, c-format +msgid "notice" +msgstr "notice" + +#: version.c:450 +#, c-format +msgid "" +"\n" +"Your installation contains extensions that should be updated\n" +"with the ALTER EXTENSION command. The file\n" +" %s\n" +"when executed by psql by the database superuser will update\n" +"these extensions.\n" +"\n" +msgstr "" +"\n" +"Your installation contains extensions that should be updated\n" +"with the ALTER EXTENSION command. The file\n" +" %s\n" +"when executed by psql by the database superuser will update\n" +"these extensions.\n" +"\n" #~ msgid "" -#~ "Optimizer statistics and free space information are not transferred\n" -#~ "by pg_upgrade so, once you start the new server, consider running:\n" -#~ " %s\n" #~ "\n" +#~ "Report bugs to .\n" #~ msgstr "" -#~ "Les statistiques de l'optimiseur et les informations sur l'espace libre\n" -#~ "ne sont pas transférées par pg_upgrade, donc une fois le nouveau\n" -#~ "serveur démarré, pensez à exécuter :\n" -#~ " %s\n" #~ "\n" +#~ "Rapporter les bogues à .\n" -#~ msgid "cannot write to log file %s\n" -#~ msgstr "ne peut pas écrire dans le fichier de traces %s\n" +#, c-format +#~ msgid "" +#~ "\n" +#~ "The old cluster has a \"plpython_call_handler\" function defined\n" +#~ "in the \"public\" schema which is a duplicate of the one defined\n" +#~ "in the \"pg_catalog\" schema. You can confirm this by executing\n" +#~ "in psql:\n" +#~ "\n" +#~ " \\df *.plpython_call_handler\n" +#~ "\n" +#~ "The \"public\" schema version of this function was created by a\n" +#~ "pre-8.1 install of plpython, and must be removed for pg_upgrade\n" +#~ "to complete because it references a now-obsolete \"plpython\"\n" +#~ "shared object file. You can remove the \"public\" schema version\n" +#~ "of this function by running the following command:\n" +#~ "\n" +#~ " DROP FUNCTION public.plpython_call_handler()\n" +#~ "\n" +#~ "in each affected database:\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "L'ancienne instance comprend une fonction « plpython_call_handler »\n" +#~ "définie dans le schéma « public » qui est un duplicat de celle définie\n" +#~ "dans le schéma « pg_catalog ». Vous pouvez confirmer cela en\n" +#~ "exécutant dans psql :\n" +#~ "\n" +#~ " \\df *.plpython_call_handler\n" +#~ "\n" +#~ "La version de cette fonction dans le schéma « public » a été créée\n" +#~ "par une installation de plpython antérieure à la version 8.1 et doit\n" +#~ "être supprimée pour que pg_upgrade puisse termine parce qu'elle\n" +#~ "référence un fichier objet partagé « plpython » maintenant obsolète.\n" +#~ "Vous pouvez supprimer la version de cette fonction dans le schéma\n" +#~ "« public » en exécutant la commande suivante :\n" +#~ "\n" +#~ " DROP FUNCTION public.plpython_call_handler()\n" +#~ "\n" +#~ "dans chaque base de données affectée :\n" +#~ "\n" -#~ msgid "cannot find current directory\n" -#~ msgstr "ne peut pas trouver le répertoire courant\n" +#, c-format +#~ msgid "" +#~ "\n" +#~ "Your installation contains large objects. The new database has an\n" +#~ "additional large object permission table, so default permissions must be\n" +#~ "defined for all large objects. The file\n" +#~ " %s\n" +#~ "when executed by psql by the database superuser will set the default\n" +#~ "permissions.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Votre installation contient des Large Objects. La nouvelle base de données\n" +#~ "a une table de droit supplémentaire pour les Large Objects, donc les droits\n" +#~ "par défaut doivent être définies pour tous les Large Objects. Le fichier\n" +#~ " %s\n" +#~ "une fois exécuté par psql avec un superutilisateur définira les droits par\n" +#~ "défaut.\n" +#~ "\n" -#~ msgid "Cannot open file %s: %m\n" -#~ msgstr "Ne peut pas ouvrir le fichier %s : %m\n" +#, c-format +#~ msgid "" +#~ "\n" +#~ "Your installation contains large objects. The new database has an\n" +#~ "additional large object permission table. After upgrading, you will be\n" +#~ "given a command to populate the pg_largeobject_metadata table with\n" +#~ "default permissions.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Votre installation contient des Large Objects. La nouvelle base de données a une table de droit supplémentaire sur les Large Objects.\n" +#~ "Après la mise à jour, vous disposerez d'une commande pour peupler la table pg_largeobject_metadata avec les droits par défaut.\n" +#~ "\n" -#~ msgid "Cannot read line %d from %s: %m\n" -#~ msgstr "Ne peut pas lire la ligne %d à partir de %s : %m\n" +#~ msgid "" +#~ "\n" +#~ "connection to database failed: %s" +#~ msgstr "" +#~ "\n" +#~ "échec de la connexion à la base de données : %s" -#~ msgid "----------------\n" -#~ msgstr "----------------\n" +#, c-format +#~ msgid " " +#~ msgstr " " -#~ msgid "------------------\n" -#~ msgstr "------------------\n" +#, c-format +#~ msgid " %s\n" +#~ msgstr " %s\n" #~ msgid "" -#~ "could not load library \"%s\":\n" -#~ "%s\n" +#~ " --index-collation-versions-unknown\n" +#~ " mark text indexes as needing to be rebuilt\n" #~ msgstr "" -#~ "n'a pas pu charger la biblothèque « %s »:\n" -#~ "%s\n" +#~ " --index-collation-versions-unknown\n" +#~ " marque les index de colonnes de type text comme nécessitant une reconstruction\n" #~ msgid "%s is not a directory\n" #~ msgstr "%s n'est pas un répertoire\n" -#~ msgid "" -#~ "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n" -#~ "because of backend API changes made during development.\n" -#~ msgstr "" -#~ "Cet outil peut seulement mettre à jour à partir de la version 9.0 de PostgreSQL (après le 11 janvier 2010)\n" -#~ "à cause de changements dans l'API du moteur fait lors du développement.\n" +#, c-format +#~ msgid "%s.%s: %u to %u\n" +#~ msgstr "%s.%s : %u vers %u\n" + +#~ msgid "----------------\n" +#~ msgstr "----------------\n" + +#~ msgid "------------------\n" +#~ msgstr "------------------\n" #~ msgid "-----------------------------\n" #~ msgstr "-----------------------------\n" @@ -1907,35 +1950,95 @@ msgstr "" #~ msgid "------------------------------------------------\n" #~ msgstr "------------------------------------------------\n" -#~ msgid "could not parse PG_VERSION file from %s\n" -#~ msgstr "n'a pas pu analyser le fichier PG_VERSION à partir de %s\n" +#, c-format +#~ msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n" +#~ msgstr "Toutes les bases de données, autre que template0, doivent autoriser les connexions, ie pg_database.datallowconn doit valoir true\n" + +#~ msgid "Cannot open file %s: %m\n" +#~ msgstr "Ne peut pas ouvrir le fichier %s : %m\n" + +#~ msgid "Cannot read line %d from %s: %m\n" +#~ msgstr "Ne peut pas lire la ligne %d à partir de %s : %m\n" + +#, c-format +#~ msgid "Checking for large objects" +#~ msgstr "Vérification des Large Objects" + +#, c-format +#~ msgid "Cloning user relation files\n" +#~ msgstr "Clonage des fichiers des relations utilisateurs\n" + +#, c-format +#~ msgid "Copying user relation files\n" +#~ msgstr "Copie des fichiers des relations utilisateurs\n" + +#, c-format +#~ msgid "Creating dump of database schemas\n" +#~ msgstr "Création de la sauvegarde des schémas des bases\n" + +#~ msgid "Creating script to analyze new cluster" +#~ msgstr "Création d'un script pour analyser la nouvelle instance" + +#, c-format +#~ msgid "Linking user relation files\n" +#~ msgstr "Création des liens pour les fichiers des relations utilisateurs\n" #~ msgid "" +#~ "Optimizer statistics and free space information are not transferred\n" +#~ "by pg_upgrade so, once you start the new server, consider running:\n" +#~ " %s\n" #~ "\n" -#~ "Report bugs to .\n" #~ msgstr "" +#~ "Les statistiques de l'optimiseur et les informations sur l'espace libre\n" +#~ "ne sont pas transférées par pg_upgrade, donc une fois le nouveau\n" +#~ "serveur démarré, pensez à exécuter :\n" +#~ " %s\n" #~ "\n" -#~ "Rapporter les bogues à .\n" + +#, c-format +#~ msgid "Remove the problem functions from the old cluster to continue.\n" +#~ msgstr "Supprimez les fonctions problématiques de l'ancienne instance pour continuer.\n" + +#, c-format +#~ msgid "Restoring database schemas in the new cluster\n" +#~ msgstr "Restauration des schémas des bases de données dans la nouvelle instance\n" #~ msgid "" -#~ "\n" -#~ "connection to database failed: %s" +#~ "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n" +#~ "because of backend API changes made during development.\n" #~ msgstr "" -#~ "\n" -#~ "échec de la connexion à la base de données : %s" +#~ "Cet outil peut seulement mettre à jour à partir de la version 9.0 de PostgreSQL (après le 11 janvier 2010)\n" +#~ "à cause de changements dans l'API du moteur fait lors du développement.\n" -#~ msgid "connection to database failed: %s" -#~ msgstr "échec de la connexion à la base de données : %s" +#, c-format +#~ msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n" +#~ msgstr "Lors de la vérification d'un serveur antérieur à la 9.1, vous devez spécifier le numéro de port de l'ancien serveur.\n" + +#~ msgid "cannot find current directory\n" +#~ msgstr "ne peut pas trouver le répertoire courant\n" + +#~ msgid "cannot write to log file %s\n" +#~ msgstr "ne peut pas écrire dans le fichier de traces %s\n" #~ msgid "check for \"%s\" failed: cannot read file (permission denied)\n" #~ msgstr "échec de la vérification de « %s » : ne peut pas lire le fichier (droit refusé)\n" -#~ msgid "Creating script to analyze new cluster" -#~ msgstr "Création d'un script pour analyser la nouvelle instance" +#~ msgid "connection to database failed: %s" +#~ msgstr "échec de la connexion à la base de données : %s" #~ msgid "" -#~ " --index-collation-versions-unknown\n" -#~ " mark text indexes as needing to be rebuilt\n" +#~ "could not load library \"%s\":\n" +#~ "%s\n" #~ msgstr "" -#~ " --index-collation-versions-unknown\n" -#~ " marque les index de colonnes de type text comme nécessitant une reconstruction\n" +#~ "n'a pas pu charger la biblothèque « %s »:\n" +#~ "%s\n" + +#~ msgid "could not parse PG_VERSION file from %s\n" +#~ msgstr "n'a pas pu analyser le fichier PG_VERSION à partir de %s\n" + +#, c-format +#~ msgid "mappings for database \"%s\":\n" +#~ msgstr "correspondances pour la base de données « %s » :\n" + +#~ msgid "waitpid() failed: %s\n" +#~ msgstr "échec de waitpid() : %s\n" diff --git a/src/bin/pg_upgrade/po/ja.po b/src/bin/pg_upgrade/po/ja.po index 17aae06271..7f9d64297a 100644 --- a/src/bin/pg_upgrade/po/ja.po +++ b/src/bin/pg_upgrade/po/ja.po @@ -1,13 +1,16 @@ -# Japanese message translation file for pg_upgrade -# Copyright (C) 2019 PostgreSQL Global Development Group -# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. +# pg_upgrade.po +# Japanese message translation file for pg_upgrade +# +# Copyright (C) 2011-2022 PostgreSQL Global Development Group +# +# This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: pg_upgrade (PostgreSQL 13)\n" +"Project-Id-Version: pg_upgrade (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:55+0900\n" -"PO-Revision-Date: 2020-08-21 18:53+0900\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" +"PO-Revision-Date: 2022-05-10 16:16+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -17,7 +20,7 @@ msgstr "" "X-Generator: Poedit 1.8.13\n" "Plural-Forms: nplural=1; plural=0;\n" -#: check.c:66 +#: check.c:71 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -26,7 +29,7 @@ msgstr "" "元の実行中サーバーの一貫性チェックを実行しています。\n" "--------------------------------------------------\n" -#: check.c:72 +#: check.c:77 #, c-format msgid "" "Performing Consistency Checks\n" @@ -35,7 +38,7 @@ msgstr "" "整合性チェックを実行しています。\n" "-----------------------------\n" -#: check.c:190 +#: check.c:210 #, c-format msgid "" "\n" @@ -44,7 +47,7 @@ msgstr "" "\n" "* クラスタは互換性があります *\n" -#: check.c:196 +#: check.c:216 #, c-format msgid "" "\n" @@ -55,33 +58,20 @@ msgstr "" "この後pg_upgradeが失敗した場合は、続ける前に新しいクラスタを\n" "initdbで再作成する必要があります。\n" -#: check.c:232 +#: check.c:257 #, c-format msgid "" -"Optimizer statistics are not transferred by pg_upgrade so,\n" -"once you start the new server, consider running:\n" -" %s\n" +"Optimizer statistics are not transferred by pg_upgrade.\n" +"Once you start the new server, consider running:\n" +" %s/vacuumdb %s--all --analyze-in-stages\n" "\n" msgstr "" "オプティマイザーの統計は、pg_upgrade では転送されません。そのため\n" -"新サーバーを起動した後、%s を動かすことを検討してください。\n" -"\n" -"\n" - -#: check.c:237 -#, c-format -msgid "" -"Optimizer statistics and free space information are not transferred\n" -"by pg_upgrade so, once you start the new server, consider running:\n" -" %s\n" -"\n" -msgstr "" -"オプティマイザーの統計情報と空き容量の情報は pg_upgrade では転送されません。\n" -"そのため新サーバーを起動した後、%s の実行を検討してください。\n" -"\n" +"新サーバーを起動した後、以下を行うことを検討してください。\n" +" %s/vacuumdb %s--all --analyze-in-stages\n" "\n" -#: check.c:244 +#: check.c:263 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -90,7 +80,7 @@ msgstr "" "このスクリプトを実行すると、旧クラスタのデータファイル %sが削除されます:\n" "\n" -#: check.c:249 +#: check.c:268 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -103,84 +93,82 @@ msgstr "" "ファイルを削除するためのスクリプトを作成できませんでした。 古い\n" "クラスタの内容は手動で削除する必要があります。\n" -#: check.c:259 +#: check.c:280 #, c-format msgid "Checking cluster versions" msgstr "クラスタのバージョンを確認しています" -#: check.c:271 +#: check.c:292 #, c-format -msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n" -msgstr "このユーティリティでは PostgreSQL 8.4 以降のバージョンからのみアップグレードできます。\n" +msgid "This utility can only upgrade from PostgreSQL version 9.2 and later.\n" +msgstr "このユーティリティでは PostgreSQL 9.2 以降のバージョンからのみアップグレードできます。\n" -#: check.c:275 +#: check.c:296 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s.\n" msgstr "このユーティリティは、PostgreSQL バージョン %s にのみアップグレードできます。\n" -#: check.c:284 +#: check.c:305 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n" msgstr "このユーティリティは PostgreSQL の過去のメジャーバージョンにダウングレードする用途では使用できません。\n" -#: check.c:289 +#: check.c:310 #, c-format msgid "Old cluster data and binary directories are from different major versions.\n" msgstr "旧クラスタのデータとバイナリのディレクトリは異なるメジャーバージョンのものです。\n" -#: check.c:292 +#: check.c:313 #, c-format msgid "New cluster data and binary directories are from different major versions.\n" msgstr "新クラスタのデータとバイナリのディレクトリは異なるメジャーバージョンのものです。\n" -#: check.c:309 -#, c-format -msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n" -msgstr "現在動作中の PG 9.1 以前の旧サーバをチェックする場合、旧サーバのポート番号を指定する必要があります。\n" - -#: check.c:313 +#: check.c:328 #, c-format msgid "When checking a live server, the old and new port numbers must be different.\n" msgstr "稼働中のサーバをチェックする場合、新旧のポート番号が異なっている必要があります。\n" -#: check.c:328 +#: check.c:343 #, c-format msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "データベース\"%s\"のエンコーディングが一致しません: 旧 \"%s\"、新 \"%s\"\n" -#: check.c:333 +#: check.c:348 #, c-format msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "データベース\"%s\"の lc_collate 値が一致しません:旧 \"%s\"、新 \"%s\"\n" -#: check.c:336 +#: check.c:351 #, c-format msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "データベース\"%s\"の lc_ctype 値が一致しません:旧 \"%s\"、新 \"%s\"\n" -#: check.c:409 +#: check.c:354 #, c-format -msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" -msgstr "新クラスタのデータベース\"%s\"が空ではありません: リレーション\"%s.%s\"が見つかりました\n" +msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n" +msgstr "データベース\"%s\"のロケールプロバイダが一致しません:旧 \"%s\"、新 \"%s\"\n" -#: check.c:458 +#: check.c:361 #, c-format -msgid "Creating script to analyze new cluster" -msgstr "新クラスタをANALYZEするためのスクリプトを作成しています" +msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" +msgstr "データベース\"%s\"のICUロケールが一致しません:旧 \"%s\"、新 \"%s\"\n" -#: check.c:472 check.c:600 check.c:864 check.c:943 check.c:1053 check.c:1144 -#: file.c:336 function.c:240 option.c:497 version.c:54 version.c:199 -#: version.c:341 +#: check.c:436 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "ファイル \"%s\" をオープンできませんでした: %s\n" +msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" +msgstr "新クラスタのデータベース\"%s\"が空ではありません: リレーション\"%s.%s\"が見つかりました\n" -#: check.c:527 check.c:656 +#: check.c:488 #, c-format -msgid "could not add execute permission to file \"%s\": %s\n" -msgstr "ファイル\"%s\"に実行権限を追加できませんでした: %s\n" +msgid "Checking for new cluster tablespace directories" +msgstr "新しいクラスタのテーブル空間ディレクトリを確認しています" + +#: check.c:499 +#, c-format +msgid "new cluster tablespace directory already exists: \"%s\"\n" +msgstr "新しいクラスタのテーブル空間ディレクトリはすでに存在します: \"%s\"\n" -#: check.c:563 +#: check.c:532 #, c-format msgid "" "\n" @@ -189,7 +177,7 @@ msgstr "" "\n" "警告: 新データディレクトリが旧データディレクトリの中にあってはなりません、例えば%s\n" -#: check.c:587 +#: check.c:556 #, c-format msgid "" "\n" @@ -198,72 +186,101 @@ msgstr "" "\n" "警告: ユーザー定義テーブル空間の場所がデータディレクトリ、例えば %s の中にあってはなりません。\n" -#: check.c:597 +#: check.c:566 #, c-format msgid "Creating script to delete old cluster" msgstr "旧クラスタを削除するスクリプトを作成しています" -#: check.c:676 +#: check.c:569 check.c:744 check.c:864 check.c:963 check.c:1043 check.c:1306 +#: file.c:336 function.c:165 option.c:465 version.c:116 version.c:288 +#: version.c:423 +#, c-format +msgid "could not open file \"%s\": %s\n" +msgstr "ファイル \"%s\" をオープンできませんでした: %s\n" + +#: check.c:620 +#, c-format +msgid "could not add execute permission to file \"%s\": %s\n" +msgstr "ファイル\"%s\"に実行権限を追加できませんでした: %s\n" + +#: check.c:640 #, c-format msgid "Checking database user is the install user" msgstr "データベースユーザーがインストールユーザーかどうかをチェックしています" -#: check.c:692 +#: check.c:656 #, c-format msgid "database user \"%s\" is not the install user\n" msgstr "データベースユーザー\"%s\"がインストールユーザーではありません\n" -#: check.c:703 +#: check.c:667 #, c-format msgid "could not determine the number of users\n" msgstr "ユーザー数を特定できませんでした\n" -#: check.c:711 +#: check.c:675 #, c-format msgid "Only the install user can be defined in the new cluster.\n" msgstr "新クラスタ内で定義できるのはインストールユーザーのみです。\n" -#: check.c:731 +#: check.c:705 #, c-format msgid "Checking database connection settings" msgstr "データベース接続の設定を確認しています" -#: check.c:753 +#: check.c:731 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n" msgstr "template0 には接続を許可してはなりません。すなわち、pg_database.datallowconn は false である必要があります。\n" -#: check.c:763 +#: check.c:761 check.c:886 check.c:988 check.c:1065 check.c:1122 check.c:1181 +#: check.c:1210 check.c:1329 function.c:187 version.c:190 version.c:228 +#: version.c:372 #, c-format -msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n" -msgstr "template0 以外のすべてのデータベースは接続を許可する必要があります。すなわち pg_database.datallowconn が true でなければなりません。\n" +msgid "fatal\n" +msgstr "致命的\n" + +#: check.c:762 +#, c-format +msgid "" +"All non-template0 databases must allow connections, i.e. their\n" +"pg_database.datallowconn must be true. Your installation contains\n" +"non-template0 databases with their pg_database.datallowconn set to\n" +"false. Consider allowing connection for all non-template0 databases\n" +"or drop the databases which do not allow connections. A list of\n" +"databases with the problem is in the file:\n" +" %s\n" +"\n" +msgstr "" +"template0ではないすべてのデータベースは接続を許可しなければなりません、つまり\n" +"pg_database.datallowconnがtrueでなければなりません。このクラスタには\n" +"pg_database.datallowconnがfalseとなっているtemplate0以外のデータベースが\n" +"存在しています。template0以外のすべてのデータベースへの接続を許可するか、接続が\n" +"許可されないデータベースをすべて削除することを検討してください。問題のあるデータベースの\n" +"一覧が以下のファイルにあります:\n" +" %s\n" +"\n" -#: check.c:788 +#: check.c:787 #, c-format msgid "Checking for prepared transactions" msgstr "準備済みトランザクションをチェックしています" -#: check.c:797 +#: check.c:796 #, c-format msgid "The source cluster contains prepared transactions\n" msgstr "移行元クラスタに準備済みトランザクションがあります\n" -#: check.c:799 +#: check.c:798 #, c-format msgid "The target cluster contains prepared transactions\n" msgstr "移行先クラスタに準備済みトランザクションがあります\n" -#: check.c:825 +#: check.c:824 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "bigint を渡す際にミスマッチが発生する contrib/isn をチェックしています" -#: check.c:886 check.c:965 check.c:1076 check.c:1167 function.c:262 -#: version.c:245 version.c:282 version.c:425 -#, c-format -msgid "fatal\n" -msgstr "致命的\n" - #: check.c:887 #, c-format msgid "" @@ -276,7 +293,7 @@ msgid "" " %s\n" "\n" msgstr "" -"移行元インストールに、bigint データ型に依存する「contrib/isn」の関数が\n" +"このクラスタには、bigint データ型に依存する「contrib/isn」の関数が\n" "含まれています。新旧のクラスタ間でのbigint値の受け渡し方法が異なるため、\n" "現時点ではこのクラスタをアップグレードすることはできません。\n" "旧クラスタ中の「contrib/isn」の関数等を使うデータベースを手動でダンプして、\n" @@ -286,12 +303,34 @@ msgstr "" " %s\n" "\n" -#: check.c:911 +#: check.c:910 +#, c-format +msgid "Checking for user-defined postfix operators" +msgstr "ユーザ定義の後置演算子を確認しています" + +#: check.c:989 +#, c-format +msgid "" +"Your installation contains user-defined postfix operators, which are not\n" +"supported anymore. Consider dropping the postfix operators and replacing\n" +"them with prefix operators or function calls.\n" +"A list of user-defined postfix operators is in the file:\n" +" %s\n" +"\n" +msgstr "" +"このクラスタにはユーザー定義の後置演算子が存在しますが、これは今後\n" +"サポートされません。後置演算子を削除するか、前置演算子あるいは関数\n" +"呼び出しで置き換えることを検討してください:\n" +"以下のファイルにユーザー定義後置演算子の一覧があります:\n" +" %s\n" +"\n" + +#: check.c:1010 #, c-format msgid "Checking for tables WITH OIDS" msgstr "WITH OIDS宣言されたテーブルをチェックしています" -#: check.c:966 +#: check.c:1066 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -301,259 +340,313 @@ msgid "" " %s\n" "\n" msgstr "" -"このインストールではWITH OIDS宣言されたテーブルが存在しますが、これは今後\n" +"このクラスタにはWITH OIDS宣言されたテーブルが存在しますが、これは今後\n" "サポートされません。以下のコマンドでoidカラムを削除することを検討してください:\n" " ALTER TABLE ... SET WITHOUT OIDS;\n" "以下のファイルにこの問題を抱えるテーブルの一覧があります:\n" " %s\n" "\n" -#: check.c:996 +#: check.c:1094 +#, c-format +msgid "Checking for system-defined composite types in user tables" +msgstr "ユーザーテーブル内のシステム定義複合型を確認しています" + +#: check.c:1123 +#, c-format +msgid "" +"Your installation contains system-defined composite type(s) in user tables.\n" +"These type OIDs are not stable across PostgreSQL versions,\n" +"so this cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" +" %s\n" +"\n" +msgstr "" +"このクラスタ内のユーザーテーブルには、システム定義の複合データ型が含まれています。\n" +"これらのデータ型のOIDはPostgreSQLのバージョン間にわたって不変ではないため、\n" +"このクラスタは現時点ではアップグレードできません。問題の列を削除したのちに\n" +"アップグレードを再実行することができます。\n" +"問題のある列の一覧は、以下のファイルにあります: \n" +" %s\n" +"\n" + +#: check.c:1151 #, c-format msgid "Checking for reg* data types in user tables" msgstr "ユーザーテーブル内の reg * データ型をチェックしています" -#: check.c:1077 +#: check.c:1182 #, c-format msgid "" "Your installation contains one of the reg* data types in user tables.\n" "These data types reference system OIDs that are not preserved by\n" "pg_upgrade, so this cluster cannot currently be upgraded. You can\n" -"remove the problem tables and restart the upgrade. A list of the\n" -"problem columns is in the file:\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" -"あなたのインストールではユーザテーブルにreg*データ型のひとつが含まれています。\n" +"このクラスタではユーザーテーブルにreg*データ型のひとつが含まれています。\n" "これらのデータ型はシステムOIDを参照しますが、これは pg_upgradeでは\n" "保存されないため、現時点ではこのクラスタをアップグレードすることはできません。\n" -"問題のテーブルを削除したのち、アップグレードを再実行できます。\n" -"問題になる列の一覧は以下のファイルにあります:\n" +"問題の列を削除したのち、アップグレードを再実行できます。\n" +"問題のある列の一覧は以下のファイルにあります:\n" " %s\n" "\n" -#: check.c:1102 +#: check.c:1204 #, c-format msgid "Checking for incompatible \"jsonb\" data type" msgstr "互換性のない\"jsonb\"データ型をチェックしています" -#: check.c:1168 +#: check.c:1211 #, c-format msgid "" "Your installation contains the \"jsonb\" data type in user tables.\n" "The internal format of \"jsonb\" changed during 9.4 beta so this\n" -"cluster cannot currently be upgraded. You can remove the problem\n" -"tables and restart the upgrade. A list of the problem columns is\n" -"in the file:\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" -"あなたのインストールではユーザテーブルに\"jsonb\"データ型が含まれています。\n" +"このクラスタではユーザーテーブルに\"jsonb\"データ型が含まれています。\n" "この型の内部フォーマットは9.4ベータの間に変更されているため、現時点ではこの\n" "クラスタをアップグレードすることはできません。\n" -"問題のテーブルを削除したのち、アップグレードを再実行できます。\n" -"問題になる列の一覧は以下のファイルにあります:\n" +"問題の列を削除したのち、アップグレードを再実行できます。\n" +"問題のある列の一覧は以下のファイルにあります:\n" " %s\n" "\n" -#: check.c:1190 +#: check.c:1233 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "'pg_' で始まるロールをチェックしています" -#: check.c:1200 +#: check.c:1243 #, c-format msgid "The source cluster contains roles starting with \"pg_\"\n" msgstr "移行元クラスタに 'pg_' で始まるロールが含まれています\n" -#: check.c:1202 +#: check.c:1245 #, c-format msgid "The target cluster contains roles starting with \"pg_\"\n" msgstr "移行先クラスタに \"pg_\" で始まるロールが含まれています\n" -#: check.c:1228 +#: check.c:1266 +#, c-format +msgid "Checking for user-defined encoding conversions" +msgstr "ユーザ定義のエンコーディング変換を確認しています" + +#: check.c:1330 +#, c-format +msgid "" +"Your installation contains user-defined encoding conversions.\n" +"The conversion function parameters changed in PostgreSQL version 14\n" +"so this cluster cannot currently be upgraded. You can remove the\n" +"encoding conversions in the old cluster and restart the upgrade.\n" +"A list of user-defined encoding conversions is in the file:\n" +" %s\n" +"\n" +msgstr "" +"このクラスタにはユーザー定義のエンコーディング変換が含まれています。\n" +"変換関数のパラメータがPostgreSQLバージョン14で変更されているため、\n" +"現時点ではこのクラスタをアップグレードすることはできません。\n" +"旧クラスタ内のそれらのエンコーディング変換を削除したのち、アップグレードを\n" +"再実行できます。\n" +"問題のある列の一覧は以下のファイルにあります:\n" +" %s\n" +"\n" + +#: check.c:1357 #, c-format msgid "failed to get the current locale\n" msgstr "現在のロケールを取得できませんでした。\n" -#: check.c:1237 +#: check.c:1366 #, c-format msgid "failed to get system locale name for \"%s\"\n" msgstr "\"%s\"のシステムロケール名を取得できませんでした。\n" -#: check.c:1243 +#: check.c:1372 #, c-format msgid "failed to restore old locale \"%s\"\n" msgstr "古いロケール\"%s\"を復元できませんでした。\n" -#: controldata.c:127 controldata.c:195 +#: controldata.c:128 controldata.c:196 #, c-format msgid "could not get control data using %s: %s\n" msgstr "%s を使った制御情報が取得できませんでした。: %s\n" -#: controldata.c:138 +#: controldata.c:139 #, c-format msgid "%d: database cluster state problem\n" msgstr "%d: データベースクラスタの状態異常\n" -#: controldata.c:156 +#: controldata.c:157 #, c-format msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" msgstr "ソースクラスタはリカバリモード中にシャットダウンされています。アップグレードをするにはドキュメントの通りに \"rsync\" を実行するか、プライマリとしてシャットダウンしてください。\n" -#: controldata.c:158 +#: controldata.c:159 #, c-format msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" msgstr "ターゲットクラスタはリカバリモード中にシャットダウンされています。アップグレードをするにはドキュメントの通りに \"rsync\" を実行するか、プライマリとしてシャットダウンしてください。\n" -#: controldata.c:163 +#: controldata.c:164 #, c-format msgid "The source cluster was not shut down cleanly.\n" msgstr "移行元クラスタはクリーンにシャットダウンされていません。\n" -#: controldata.c:165 +#: controldata.c:166 #, c-format msgid "The target cluster was not shut down cleanly.\n" msgstr "移行先クラスタはクリーンにシャットダウンされていません。\n" -#: controldata.c:176 +#: controldata.c:177 #, c-format msgid "The source cluster lacks cluster state information:\n" msgstr "移行元クラスタにクラスタ状態情報がありません:\n" -#: controldata.c:178 +#: controldata.c:179 #, c-format msgid "The target cluster lacks cluster state information:\n" msgstr "移行先クラスタにクラスタ状態情報がありません:\n" -#: controldata.c:208 dump.c:49 pg_upgrade.c:339 pg_upgrade.c:375 -#: relfilenode.c:247 util.c:79 +#: controldata.c:209 dump.c:50 pg_upgrade.c:402 pg_upgrade.c:439 +#: relfilenode.c:231 server.c:34 #, c-format msgid "%s" msgstr "%s" -#: controldata.c:215 +#: controldata.c:216 #, c-format msgid "%d: pg_resetwal problem\n" msgstr "%d: pg_resetwal で問題発生\n" -#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257 -#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309 -#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345 -#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382 -#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426 -#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470 -#: controldata.c:481 +#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258 +#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310 +#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354 +#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383 +#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427 +#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471 +#: controldata.c:482 controldata.c:493 #, c-format msgid "%d: controldata retrieval problem\n" msgstr "%d: 制御情報の取得で問題発生\n" -#: controldata.c:546 +#: controldata.c:572 #, c-format msgid "The source cluster lacks some required control information:\n" msgstr "移行元クラスタに必要な制御情報の一部がありません:\n" -#: controldata.c:549 +#: controldata.c:575 #, c-format msgid "The target cluster lacks some required control information:\n" msgstr "移行先クラスタに必要な制御情報の一部がありません:\n" -#: controldata.c:552 +#: controldata.c:578 #, c-format msgid " checkpoint next XID\n" msgstr " チェックポイントにおける次の XID\n" -#: controldata.c:555 +#: controldata.c:581 #, c-format msgid " latest checkpoint next OID\n" msgstr " 最新のチェックポイントにおける次の OID\n" -#: controldata.c:558 +#: controldata.c:584 #, c-format msgid " latest checkpoint next MultiXactId\n" msgstr " 最新のチェックポイントにおける次の MultiXactId\n" -#: controldata.c:562 +#: controldata.c:588 #, c-format msgid " latest checkpoint oldest MultiXactId\n" msgstr " 最新のチェックポイントにおける最古の MultiXactId\n" -#: controldata.c:565 +#: controldata.c:591 +#, c-format +msgid " latest checkpoint oldestXID\n" +msgstr " 最新のチェックポイントにおける最古のXID\n" + +#: controldata.c:594 #, c-format msgid " latest checkpoint next MultiXactOffset\n" msgstr " 最新のチェックポイントにおける次の MultiXactOffset\n" -#: controldata.c:568 +#: controldata.c:597 #, c-format msgid " first WAL segment after reset\n" msgstr " リセット後の最初の WAL セグメント\n" -#: controldata.c:571 +#: controldata.c:600 #, c-format msgid " float8 argument passing method\n" msgstr " float8 引数がメソッドを渡しています\n" -#: controldata.c:574 +#: controldata.c:603 #, c-format msgid " maximum alignment\n" msgstr " 最大アラインメント\n" -#: controldata.c:577 +#: controldata.c:606 #, c-format msgid " block size\n" msgstr " ブロックサイズ\n" -#: controldata.c:580 +#: controldata.c:609 #, c-format msgid " large relation segment size\n" msgstr " リレーションセグメントのサイズ\n" -#: controldata.c:583 +#: controldata.c:612 #, c-format msgid " WAL block size\n" msgstr " WAL のブロックサイズ\n" -#: controldata.c:586 +#: controldata.c:615 #, c-format msgid " WAL segment size\n" msgstr " WAL のセグメント サイズ\n" -#: controldata.c:589 +#: controldata.c:618 #, c-format msgid " maximum identifier length\n" msgstr " 識別子の最大長\n" -#: controldata.c:592 +#: controldata.c:621 #, c-format msgid " maximum number of indexed columns\n" msgstr " インデックス対象カラムの最大数\n" -#: controldata.c:595 +#: controldata.c:624 #, c-format msgid " maximum TOAST chunk size\n" msgstr " 最大の TOAST チャンクサイズ\n" -#: controldata.c:599 +#: controldata.c:628 #, c-format msgid " large-object chunk size\n" msgstr " ラージオブジェクトのチャンクサイズ\n" -#: controldata.c:602 +#: controldata.c:631 #, c-format msgid " dates/times are integers?\n" msgstr " 日付/時間が整数?\n" -#: controldata.c:606 +#: controldata.c:635 #, c-format msgid " data checksum version\n" msgstr " データチェックサムのバージョン\n" -#: controldata.c:608 +#: controldata.c:637 #, c-format msgid "Cannot continue without required control information, terminating\n" msgstr "必要な制御情報がないので続行できません。終了しています\n" -#: controldata.c:623 +#: controldata.c:652 #, c-format msgid "" "old and new pg_controldata alignments are invalid or do not match\n" @@ -562,77 +655,77 @@ msgstr "" "新旧のpg_controldataのアラインメントが不正であるかかまたは一致しません\n" "一方のクラスタが32ビットで、他方が64ビットである可能性が高いです\n" -#: controldata.c:627 +#: controldata.c:656 #, c-format msgid "old and new pg_controldata block sizes are invalid or do not match\n" msgstr "新旧の pg_controldata におけるブロックサイズが有効でないかまたは一致しません。\n" -#: controldata.c:630 +#: controldata.c:659 #, c-format msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n" msgstr "新旧の pg_controldata におけるリレーションの最大セグメントサイズが有効でないか一致しません。\n" -#: controldata.c:633 +#: controldata.c:662 #, c-format msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n" msgstr "新旧の pg_controldata における WAL ブロックサイズが有効でないか一致しません。\n" -#: controldata.c:636 +#: controldata.c:665 #, c-format msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n" msgstr "新旧の pg_controldata における WAL セグメントサイズが有効でないか一致しません。\n" -#: controldata.c:639 +#: controldata.c:668 #, c-format msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n" msgstr "新旧の pg_controldata における識別子の最大長が有効でないか一致しません。\n" -#: controldata.c:642 +#: controldata.c:671 #, c-format msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n" msgstr "新旧の pg_controldata におけるインデックス付き列の最大数が有効でないか一致しません。\n" -#: controldata.c:645 +#: controldata.c:674 #, c-format msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n" msgstr "新旧の pg_controldata における TOAST チャンクサイズの最大値が有効でないか一致しません。\n" -#: controldata.c:650 +#: controldata.c:679 #, c-format msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n" msgstr "新旧の pg_controldata におけるラージオブジェクトのチャンクサイズが有効でないかまたは一致しません。\n" -#: controldata.c:653 +#: controldata.c:682 #, c-format msgid "old and new pg_controldata date/time storage types do not match\n" msgstr "新旧の pg_controldata における日付/時刻型データの保存バイト数が一致しません\n" -#: controldata.c:666 +#: controldata.c:695 #, c-format msgid "old cluster does not use data checksums but the new one does\n" msgstr "旧クラスタではデータチェックサムを使用していませんが、新クラスタでは使用しています\n" -#: controldata.c:669 +#: controldata.c:698 #, c-format msgid "old cluster uses data checksums but the new one does not\n" msgstr "旧クラスタではデータチェックサムを使用していますが、新クラスタでは使用していません\n" -#: controldata.c:671 +#: controldata.c:700 #, c-format msgid "old and new cluster pg_controldata checksum versions do not match\n" msgstr "新旧の pg_controldata 間でチェックサムのバージョンが一致しません。\n" -#: controldata.c:682 +#: controldata.c:711 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "旧の global/pg_control に \".old\" サフィックスを追加しています" -#: controldata.c:687 +#: controldata.c:716 #, c-format msgid "Unable to rename %s to %s.\n" msgstr "%s の名前を %s に変更できません。\n" -#: controldata.c:690 +#: controldata.c:719 #, c-format msgid "" "\n" @@ -654,37 +747,32 @@ msgstr "" msgid "Creating dump of global objects" msgstr "グローバルオブジェクトのダンプを作成しています" -#: dump.c:31 -#, c-format -msgid "Creating dump of database schemas\n" -msgstr "データベーススキーマのダンプを作成しています。\n" - -#: exec.c:44 +#: exec.c:45 #, c-format msgid "could not get pg_ctl version data using %s: %s\n" msgstr "%s を使って pg_ctl のバージョンデータを取得できませんでした。: %s\n" -#: exec.c:50 +#: exec.c:51 #, c-format msgid "could not get pg_ctl version output from %s\n" msgstr "pg_ctl のバージョン出力を %s から取得できませんでした。\n" -#: exec.c:104 exec.c:108 +#: exec.c:108 exec.c:112 #, c-format msgid "command too long\n" msgstr "コマンドが長すぎます\n" -#: exec.c:110 util.c:37 util.c:225 +#: exec.c:114 util.c:37 util.c:264 #, c-format msgid "%s\n" msgstr "%s\n" -#: exec.c:149 option.c:217 +#: exec.c:153 pg_upgrade.c:242 #, c-format msgid "could not open log file \"%s\": %m\n" msgstr "ログファイル\"%s\"をオープンできませんでした: %m\n" -#: exec.c:178 +#: exec.c:182 #, c-format msgid "" "\n" @@ -693,12 +781,12 @@ msgstr "" "\n" "*失敗*" -#: exec.c:181 +#: exec.c:185 #, c-format msgid "There were problems executing \"%s\"\n" msgstr "\"%s\"を実行していて問題が発生しました\n" -#: exec.c:184 +#: exec.c:188 #, c-format msgid "" "Consult the last few lines of \"%s\" or \"%s\" for\n" @@ -707,7 +795,7 @@ msgstr "" "失敗の原因については\"%s\"または\"%s\"の最後の数行を参照してください。\n" "\n" -#: exec.c:189 +#: exec.c:193 #, c-format msgid "" "Consult the last few lines of \"%s\" for\n" @@ -716,46 +804,53 @@ msgstr "" "失敗の原因については、\"%s\"の最後の数行を参照してください。\n" "\n" -#: exec.c:204 option.c:226 +#: exec.c:208 pg_upgrade.c:250 #, c-format msgid "could not write to log file \"%s\": %m\n" -msgstr "ログファイル\"%s\"に書き込めませんでした。\n" +msgstr "ログファイル\"%s\"に書き込めませんでした: %m\n" -#: exec.c:230 +#: exec.c:234 #, c-format msgid "could not open file \"%s\" for reading: %s\n" msgstr "ファイル\"%s\"を読み取り用としてオープンできませんでした:%s\n" -#: exec.c:257 +#: exec.c:261 #, c-format msgid "You must have read and write access in the current directory.\n" msgstr "カレントディレクトリに対して読み書き可能なアクセス権が必要です。\n" -#: exec.c:310 exec.c:372 exec.c:436 +#: exec.c:314 exec.c:380 #, c-format msgid "check for \"%s\" failed: %s\n" msgstr "\"%s\"のチェックに失敗しました: %s\n" -#: exec.c:313 exec.c:375 +#: exec.c:317 exec.c:383 #, c-format msgid "\"%s\" is not a directory\n" msgstr "\"%s\"はディレクトリではありません\n" -#: exec.c:439 +#: exec.c:433 #, c-format msgid "check for \"%s\" failed: not a regular file\n" msgstr "\"%s\"のチェックに失敗しました:通常ファイルではありません\n" -#: exec.c:451 -#, c-format -msgid "check for \"%s\" failed: cannot read file (permission denied)\n" -msgstr "\"%s\"のチェックに失敗しました:ファイルが読めません(権限が拒否されました)\n" - -#: exec.c:459 +#: exec.c:436 #, c-format msgid "check for \"%s\" failed: cannot execute (permission denied)\n" msgstr "\"%s\"のチェックに失敗しました:実行できません(権限が拒否されました)\n" +#: exec.c:442 +#, c-format +msgid "check for \"%s\" failed: cannot execute\n" +msgstr "\"%s\"の確認に失敗しました:実行できません\n" + +#: exec.c:452 +#, c-format +msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n" +msgstr "" +"\"%s\"の確認に失敗しました: 間違ったバージョン: 検出\"%s\"、想定\"%s\"\n" +"\n" + #: file.c:43 file.c:61 #, c-format msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" @@ -835,71 +930,22 @@ msgstr "" "新旧のデータディレクトリ間でハードリンクを作成できませんでした: %s\n" "リンクモードでは、新旧のデータディレクトリが同じファイルシステム上に存在しなければなりません。\n" -#: function.c:114 -#, c-format -msgid "" -"\n" -"The old cluster has a \"plpython_call_handler\" function defined\n" -"in the \"public\" schema which is a duplicate of the one defined\n" -"in the \"pg_catalog\" schema. You can confirm this by executing\n" -"in psql:\n" -"\n" -" \\df *.plpython_call_handler\n" -"\n" -"The \"public\" schema version of this function was created by a\n" -"pre-8.1 install of plpython, and must be removed for pg_upgrade\n" -"to complete because it references a now-obsolete \"plpython\"\n" -"shared object file. You can remove the \"public\" schema version\n" -"of this function by running the following command:\n" -"\n" -" DROP FUNCTION public.plpython_call_handler()\n" -"\n" -"in each affected database:\n" -"\n" -msgstr "" -"\n" -"旧クラスタで\"plpython_call_handler\"関数が\"public\"スキーマ内に\n" -"定義されていますが、これは\"pg_catalog\"スキーマで定義されている\n" -"ものと重複しています。このことは以下のコマンドをpsqlで実行して確認\n" -"できます:\n" -"\n" -" \\\\df *.plpython_call_handler\n" -"\n" -"\"public\"スキーマの方の関数は8.1以前の環境のplpythonが作成したもので、\n" -"すでに廃止済みの \"plpython\" 共有オブジェクトファイルを参照している\n" -"ため、pg_upgrade を完了させるには削除する必要があります。以下のコマンドを\n" -"影響のあるデータベースで個別に実行することにより\"public\"スキーマの方の\n" -"関数の削除ができます: \n" -"\n" -" DROP FUNCTION public.plpython_call_handler()\n" -"\n" - -#: function.c:132 -#, c-format -msgid " %s\n" -msgstr " %s\n" - -#: function.c:142 -#, c-format -msgid "Remove the problem functions from the old cluster to continue.\n" -msgstr "継続するには、旧クラスタから問題となっている関数を削除してください。\n" - -#: function.c:189 +#: function.c:129 #, c-format msgid "Checking for presence of required libraries" msgstr "必要なライブラリの有無を確認しています" -#: function.c:242 +#: function.c:167 #, c-format msgid "could not load library \"%s\": %s" msgstr "ライブラリ\"%s\"をロードできませんでした: %s" -#: function.c:253 +#: function.c:178 #, c-format msgid "In database: %s\n" msgstr "データベース: %s\n" -#: function.c:263 +#: function.c:188 #, c-format msgid "" "Your installation references loadable libraries that are missing from the\n" @@ -909,73 +955,54 @@ msgid "" " %s\n" "\n" msgstr "" -"旧の環境で、新の環境にはないローダブルライブラリを参照しています。\n" -"これらのライブラリを新の環境に追加するか、もしくは旧の環境から\n" +"このクラスタでは、移行先の環境にはないロード可能ライブラリを参照しています。\n" +"これらのライブラリを移行先の環境に追加するか、もしくは移行元の環境から\n" "それらを使っている関数を削除してください。 問題のライブラリの一覧は、\n" "以下のファイルに入っています:\n" " %s\n" "\n" -#: info.c:131 +#: info.c:125 #, c-format msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n" msgstr "データベース\"%2$s\"で OID %1$u のリレーション名が一致しません: 元の名前 \"%3$s.%4$s\"、新しい名前 \"%5$s.%6$s\"\n" -#: info.c:151 +#: info.c:145 #, c-format msgid "Failed to match up old and new tables in database \"%s\"\n" msgstr "データベース\"%s\"で新旧のテーブルの照合に失敗しました。\n" -#: info.c:240 +#: info.c:226 #, c-format msgid " which is an index on \"%s.%s\"" msgstr " これは \"%s.%s\" 上のインデックスです" -#: info.c:250 +#: info.c:236 #, c-format msgid " which is an index on OID %u" msgstr " これは OID %u 上のインデックスです" -#: info.c:262 +#: info.c:248 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr " これは \"%s.%s\" の TOAST テーブルです" -#: info.c:270 +#: info.c:256 #, c-format msgid " which is the TOAST table for OID %u" msgstr " これは OID %u の TOAST テーブルです" -#: info.c:274 +#: info.c:260 #, c-format msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n" msgstr "データベース\"%2$s\"でOID%1$uを持つ新リレーションに対応するものが旧クラスタ内にありません: %3$s\n" -#: info.c:277 +#: info.c:263 #, c-format msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n" msgstr "データベース\"%2$s\"でOID %1$uを持つ旧リレーションに対応するものが新クラスタ内にありません: %3$s\n" -#: info.c:289 -#, c-format -msgid "mappings for database \"%s\":\n" -msgstr "データベース\"%s\"のマッピング:\n" - -#: info.c:292 -#, c-format -msgid "%s.%s: %u to %u\n" -msgstr "%s.%s: %u -> %u\n" - -#: info.c:297 info.c:633 -#, c-format -msgid "" -"\n" -"\n" -msgstr "" -"\n" -"\n" - -#: info.c:322 +#: info.c:287 #, c-format msgid "" "\n" @@ -984,7 +1011,7 @@ msgstr "" "\n" "移行元データベース:\n" -#: info.c:324 +#: info.c:289 #, c-format msgid "" "\n" @@ -993,77 +1020,86 @@ msgstr "" "\n" "移行先データベース:\n" -#: info.c:631 +#: info.c:605 #, c-format msgid "Database: %s\n" msgstr "データベース: %s\n" -#: info.c:644 +#: info.c:607 +#, c-format +msgid "" +"\n" +"\n" +msgstr "" +"\n" +"\n" + +#: info.c:618 #, c-format msgid "relname: %s.%s: reloid: %u reltblspace: %s\n" msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n" -#: option.c:102 +#: option.c:100 #, c-format msgid "%s: cannot be run as root\n" msgstr "%s: root では実行できません\n" -#: option.c:170 +#: option.c:167 #, c-format msgid "invalid old port number\n" msgstr "旧ポート番号が無効です\n" -#: option.c:175 +#: option.c:172 #, c-format msgid "invalid new port number\n" msgstr "新ポート番号が無効です\n" -#: option.c:207 +#: option.c:198 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "詳細は\"%s --help\"を参照してください。\n" -#: option.c:214 +#: option.c:205 #, c-format msgid "too many command-line arguments (first is \"%s\")\n" msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")\n" -#: option.c:220 +#: option.c:208 #, c-format msgid "Running in verbose mode\n" msgstr "冗長モードで実行しています\n" -#: option.c:251 +#: option.c:226 msgid "old cluster binaries reside" msgstr "旧クラスタのバイナリが置かれている" -#: option.c:253 +#: option.c:228 msgid "new cluster binaries reside" msgstr "新クラスタのバイナリが置かれている" -#: option.c:255 +#: option.c:230 msgid "old cluster data resides" msgstr "旧クラスタのデータが置かれている" -#: option.c:257 +#: option.c:232 msgid "new cluster data resides" msgstr "新クラスタのデータが置かれている" -#: option.c:259 +#: option.c:234 msgid "sockets will be created" msgstr "ソケットが作成される" -#: option.c:276 option.c:374 +#: option.c:251 option.c:350 #, c-format msgid "could not determine current directory\n" msgstr "カレントディレクトリを特定できませんでした。\n" -#: option.c:279 +#: option.c:254 #, c-format msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n" msgstr "Windowsでは、新クラスタのデータディレクトリの中でpg_upgradeを実行することはできません\n" -#: option.c:288 +#: option.c:263 #, c-format msgid "" "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n" @@ -1072,12 +1108,12 @@ msgstr "" "pg_upgradeは、PostgreSQLのクラスタを別のメジャーバージョンにアップグレードします。\n" "\n" -#: option.c:289 +#: option.c:264 #, c-format msgid "Usage:\n" msgstr "使い方:\n" -#: option.c:290 +#: option.c:265 #, c-format msgid "" " pg_upgrade [OPTION]...\n" @@ -1086,17 +1122,17 @@ msgstr "" " pg_upgrade [オプション]...\n" "\n" -#: option.c:291 +#: option.c:266 #, c-format msgid "Options:\n" msgstr "オプション:\n" -#: option.c:292 +#: option.c:267 #, c-format msgid " -b, --old-bindir=BINDIR old cluster executable directory\n" msgstr " -b, --old-bindir=BINDIR 旧クラスタの実行ファイルディレクトリ\n" -#: option.c:293 +#: option.c:268 #, c-format msgid "" " -B, --new-bindir=BINDIR new cluster executable directory (default\n" @@ -1105,93 +1141,98 @@ msgstr "" " -B, --new-bindir=BINDIR 新クラスタの実行ファイルディレクトリ(デフォルト\n" " はpg_upgradeと同じディレクトリ)\n" -#: option.c:295 +#: option.c:270 #, c-format msgid " -c, --check check clusters only, don't change any data\n" msgstr " -c, --check クラスタのチェックのみ、データを一切変更しない\n" -#: option.c:296 +#: option.c:271 #, c-format msgid " -d, --old-datadir=DATADIR old cluster data directory\n" msgstr " -d, --old-datadir=DATADIR 旧クラスタのデータディレクトリ\n" -#: option.c:297 +#: option.c:272 #, c-format msgid " -D, --new-datadir=DATADIR new cluster data directory\n" msgstr " -D, --new-datadir=DATADIR 新クラスタのデータディレクトリ\n" -#: option.c:298 +#: option.c:273 #, c-format msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n" msgstr " -j, --jobs 使用する同時実行プロセスまたはスレッドの数\n" -#: option.c:299 +#: option.c:274 #, c-format msgid " -k, --link link instead of copying files to new cluster\n" msgstr "" " -k, --link 新クラスタにファイルをコピーする代わりに\n" " リンクする\n" -#: option.c:300 +#: option.c:275 +#, c-format +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr " -N, --no-sync 変更のディスクへの確実な書き出しを待機しない\n" + +#: option.c:276 #, c-format msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n" msgstr " -o, --old-options=OPTIONS サーバに渡す旧クラスタのオプション\n" -#: option.c:301 +#: option.c:277 #, c-format msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n" msgstr " -O, --new-options=OPTIONS サーバに渡す新クラスタのオプション\n" -#: option.c:302 +#: option.c:278 #, c-format msgid " -p, --old-port=PORT old cluster port number (default %d)\n" msgstr " -p, --old-port=PORT 旧クラスタのポート番号(デフォルト %d)\n" -#: option.c:303 +#: option.c:279 #, c-format msgid " -P, --new-port=PORT new cluster port number (default %d)\n" msgstr " -P, --new-port=PORT 新クラスタのポート番号(デフォルト %d)\n" -#: option.c:304 +#: option.c:280 #, c-format msgid " -r, --retain retain SQL and log files after success\n" msgstr " -r, --retain SQLとログファイルを、成功後も消さずに残す\n" -#: option.c:305 +#: option.c:281 #, c-format msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" msgstr "" " -s, --socketdir=DIR 使用するソケットディレクトリ(デフォルトは\n" " カレントディレクトリ)\n" -#: option.c:306 +#: option.c:282 #, c-format msgid " -U, --username=NAME cluster superuser (default \"%s\")\n" -msgstr " -U, --username=NAME クラスタのスーパユーザ(デフォルト\"%s\")\n" +msgstr " -U, --username=NAME クラスタのスーパーユーザー(デフォルト\"%s\")\n" -#: option.c:307 +#: option.c:283 #, c-format msgid " -v, --verbose enable verbose internal logging\n" msgstr " -v, --verbose 詳細な内部ログを有効化\n" -#: option.c:308 +#: option.c:284 #, c-format msgid " -V, --version display version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: option.c:309 +#: option.c:285 #, c-format msgid " --clone clone instead of copying files to new cluster\n" msgstr "" " --clone 新クラスタにファイルをコピーする代わりに\n" " クローンする\n" -#: option.c:310 +#: option.c:286 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: option.c:311 +#: option.c:287 #, c-format msgid "" "\n" @@ -1206,7 +1247,7 @@ msgstr "" " 旧クラスタのpostmasterをシャットダウンする\n" " 新クラスタのpostmasterをシャットダウンする\n" -#: option.c:316 +#: option.c:292 #, c-format msgid "" "\n" @@ -1223,7 +1264,7 @@ msgstr "" " 旧バージョンの\"bin\"ディレクトリ (-b BINDIR)\n" " 新バージョンの\"bin\"ディレクトリ(-B BINDIR)\n" -#: option.c:322 +#: option.c:298 #, c-format msgid "" "\n" @@ -1236,7 +1277,7 @@ msgstr "" " pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n" "または\n" -#: option.c:327 +#: option.c:303 #, c-format msgid "" " $ export PGDATAOLD=oldCluster/data\n" @@ -1251,7 +1292,7 @@ msgstr "" " $ export PGBINNEW=newCluster/bin\n" " $ pg_upgrade\n" -#: option.c:333 +#: option.c:309 #, c-format msgid "" " C:\\> set PGDATAOLD=oldCluster/data\n" @@ -1266,7 +1307,7 @@ msgstr "" " C:\\> set PGBINNEW=newCluster/bin\n" " C:\\> pg_upgrade\n" -#: option.c:339 +#: option.c:315 #, c-format msgid "" "\n" @@ -1275,12 +1316,12 @@ msgstr "" "\n" "バグは<%s>に報告してください。\n" -#: option.c:340 +#: option.c:316 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: option.c:380 +#: option.c:356 #, c-format msgid "" "You must identify the directory where the %s.\n" @@ -1289,27 +1330,27 @@ msgstr "" "%sディレクトリを指定する必要があります。\n" "コマンドラインオプション %s または環境変数 %s を使用してください。\n" -#: option.c:432 +#: option.c:408 #, c-format msgid "Finding the real data directory for the source cluster" msgstr "移行元クラスタの実際のデータディレクトリを探しています" -#: option.c:434 +#: option.c:410 #, c-format msgid "Finding the real data directory for the target cluster" msgstr "移行先クラスタの実際のデータディレクトリを探しています" -#: option.c:446 +#: option.c:422 #, c-format msgid "could not get data directory using %s: %s\n" msgstr "%s を使ってデータディレクトリを取得できませんでした。: %s\n" -#: option.c:505 +#: option.c:473 #, c-format msgid "could not read line %d from file \"%s\": %s\n" msgstr "ファイル\"%2$s\"の%1$d行目を読み取れませんでした: %3$s\n" -#: option.c:522 +#: option.c:490 #, c-format msgid "user-supplied old port number %hu corrected to %hu\n" msgstr "ユーザー指定の旧ポート番号 %hu は %hu に訂正されました\n" @@ -1326,8 +1367,8 @@ msgstr "ワーカースレッドを作成できませんでした: %s\n" #: parallel.c:300 #, c-format -msgid "waitpid() failed: %s\n" -msgstr "waitpid()が失敗しました: %s\n" +msgid "%s() failed: %s\n" +msgstr "%s() が失敗しました: %s\n" #: parallel.c:304 #, c-format @@ -1339,12 +1380,12 @@ msgstr "子プロセスが異常終了しました: ステータス %d\n" msgid "child worker exited abnormally: %s\n" msgstr "子ワーカーが異常終了しました: %s\n" -#: pg_upgrade.c:108 +#: pg_upgrade.c:103 #, c-format msgid "could not read permissions of directory \"%s\": %s\n" msgstr "ディレクトリ\"%s\"の権限を読み取れませんでした: %s\n" -#: pg_upgrade.c:123 +#: pg_upgrade.c:135 #, c-format msgid "" "\n" @@ -1355,17 +1396,17 @@ msgstr "" "アップグレードを実行しています。\n" "------------------\n" -#: pg_upgrade.c:166 +#: pg_upgrade.c:178 #, c-format msgid "Setting next OID for new cluster" msgstr "新クラスタの、次の OID を設定しています" -#: pg_upgrade.c:173 +#: pg_upgrade.c:187 #, c-format msgid "Sync data directory to disk" msgstr "データディレクトリをディスクに同期します" -#: pg_upgrade.c:185 +#: pg_upgrade.c:199 #, c-format msgid "" "\n" @@ -1376,12 +1417,17 @@ msgstr "" "アップグレードが完了しました\n" "----------------\n" -#: pg_upgrade.c:220 +#: pg_upgrade.c:233 pg_upgrade.c:235 pg_upgrade.c:237 +#, c-format +msgid "could not create directory \"%s\": %m\n" +msgstr "ディレクトリ\"%s\"を作成できませんでした: %m\n" + +#: pg_upgrade.c:282 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: 自身のための実行ファイルが見つかりませんでした\n" -#: pg_upgrade.c:246 +#: pg_upgrade.c:308 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" @@ -1390,7 +1436,7 @@ msgstr "" "旧クラスタで稼働中のpostmasterがあるようです。\n" "そのpostmasterをシャットダウンしたのちにやり直してください。\n" -#: pg_upgrade.c:259 +#: pg_upgrade.c:321 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" @@ -1399,132 +1445,112 @@ msgstr "" "新クラスタで稼働中のpostmasterがあるようです。\n" "そのpostmasterをシャットダウンしたのちやり直してください。\n" -#: pg_upgrade.c:273 +#: pg_upgrade.c:335 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "新クラスタ内のすべての行を分析しています" -#: pg_upgrade.c:286 +#: pg_upgrade.c:348 #, c-format msgid "Freezing all rows in the new cluster" msgstr "新クラスタ内のすべての行を凍結しています" -#: pg_upgrade.c:306 +#: pg_upgrade.c:368 #, c-format msgid "Restoring global objects in the new cluster" msgstr "新クラスタ内のグローバルオブジェクトを復元しています" -#: pg_upgrade.c:321 -#, c-format -msgid "Restoring database schemas in the new cluster\n" -msgstr "新クラスタ内のデータベーススキーマを復元しています\n" - -#: pg_upgrade.c:425 +#: pg_upgrade.c:490 #, c-format msgid "Deleting files from new %s" msgstr "新しい %s からファイルを削除しています" -#: pg_upgrade.c:429 +#: pg_upgrade.c:494 #, c-format msgid "could not delete directory \"%s\"\n" msgstr "ディレクトリ\"%s\"を削除できませんでした。\n" -#: pg_upgrade.c:448 +#: pg_upgrade.c:513 #, c-format msgid "Copying old %s to new server" msgstr "旧の %s を新サーバーにコピーしています" -#: pg_upgrade.c:475 +#: pg_upgrade.c:539 +#, c-format +msgid "Setting oldest XID for new cluster" +msgstr "新クラスタの、最古のXIDを設定しています" + +#: pg_upgrade.c:547 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "新クラスタの、次のトランザクションIDと基点を設定しています" -#: pg_upgrade.c:505 +#: pg_upgrade.c:577 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "新クラスタの、次のmultixact IDとオフセットを設定しています" -#: pg_upgrade.c:529 +#: pg_upgrade.c:601 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "新クラスタの最古のmultixact IDを設定しています" -#: pg_upgrade.c:549 +#: pg_upgrade.c:621 #, c-format msgid "Resetting WAL archives" msgstr "WAL アーカイブをリセットしています" -#: pg_upgrade.c:592 +#: pg_upgrade.c:664 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "新クラスタのfrozenxidとminmxidカウンタを設定しています" -#: pg_upgrade.c:594 +#: pg_upgrade.c:666 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "新クラスタのminmxidカウンタを設定しています" -#: relfilenode.c:35 -#, c-format -msgid "Cloning user relation files\n" -msgstr "ユーザリレーションをクローニングしています\n" - -#: relfilenode.c:38 -#, c-format -msgid "Copying user relation files\n" -msgstr "ユーザリレーションのファイルをコピーしています\n" - -#: relfilenode.c:41 -#, c-format -msgid "Linking user relation files\n" -msgstr "ユーザリレーションのファイルをリンクしています\n" - #: relfilenode.c:115 #, c-format msgid "old database \"%s\" not found in the new cluster\n" msgstr "新クラスタ内に旧データベース\"%s\"が見つかりません\n" -#: relfilenode.c:234 +#: relfilenode.c:218 #, c-format msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n" msgstr "\"%s.%s\"ファイル (\"%s\" -> \"%s\")の存在を確認中にエラー: %s\n" -#: relfilenode.c:252 +#: relfilenode.c:236 #, c-format msgid "rewriting \"%s\" to \"%s\"\n" msgstr "\"%s\"を\"%s\"に書き換えています\n" -#: relfilenode.c:260 +#: relfilenode.c:244 #, c-format msgid "cloning \"%s\" to \"%s\"\n" msgstr "\"%s\"から\"%s\"へクローニングしています\n" -#: relfilenode.c:265 +#: relfilenode.c:249 #, c-format msgid "copying \"%s\" to \"%s\"\n" msgstr "\"%s\"を\"%s\"にコピーしています\n" -#: relfilenode.c:270 +#: relfilenode.c:254 #, c-format msgid "linking \"%s\" to \"%s\"\n" msgstr "\"%s\"から\"%s\"へリンクを作成しています\n" -#: server.c:33 -#, c-format -msgid "connection to database failed: %s" -msgstr "データベースへの接続に失敗しました: %s" - -#: server.c:39 server.c:141 util.c:135 util.c:165 +#: server.c:39 server.c:143 util.c:174 util.c:204 #, c-format msgid "Failure, exiting\n" msgstr "失敗しました、終了しています\n" -#: server.c:131 +#: server.c:133 #, c-format msgid "executing: %s\n" msgstr "実行中: %s\n" -#: server.c:137 +#: server.c:139 #, c-format msgid "" "SQL command failed\n" @@ -1535,26 +1561,26 @@ msgstr "" "%s\n" "%s" -#: server.c:167 +#: server.c:169 #, c-format msgid "could not open version file \"%s\": %m\n" msgstr "バージョンファイル\"%s\"をオープンできませんでした: %m\n" -#: server.c:171 +#: server.c:173 #, c-format msgid "could not parse version file \"%s\"\n" msgstr "バージョンファイル\"%s\"をパースできませんでした\n" -#: server.c:297 +#: server.c:291 #, c-format msgid "" "\n" -"connection to database failed: %s" +"%s" msgstr "" "\n" -"データベースへの接続に失敗しました: %s" +"%s" -#: server.c:302 +#: server.c:295 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -1563,7 +1589,7 @@ msgstr "" "以下のコマンドで起動した移行元postmasterに接続できませんでした:\n" "%s\n" -#: server.c:306 +#: server.c:299 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -1572,22 +1598,22 @@ msgstr "" "以下のコマンドで起動した移行先postmasterに接続できませんでした:\n" "%s\n" -#: server.c:320 +#: server.c:313 #, c-format msgid "pg_ctl failed to start the source server, or connection failed\n" msgstr "pg_ctl が移行元サーバの起動に失敗した、あるいは接続に失敗しました\n" -#: server.c:322 +#: server.c:315 #, c-format msgid "pg_ctl failed to start the target server, or connection failed\n" msgstr "pg_ctl が移行先サーバの起動に失敗した、あるいは接続に失敗しました\n" -#: server.c:367 +#: server.c:360 #, c-format msgid "out of memory\n" msgstr "メモリ不足です\n" -#: server.c:380 +#: server.c:373 #, c-format msgid "libpq environment variable %s has a non-local server value: %s\n" msgstr "libpq の環境変数 %s で、ローカルでないサーバ値が設定されています: %s\n" @@ -1601,137 +1627,96 @@ msgstr "" "テーブル空間を使用する場合、\n" "同一のバージョンのシステムカタログ同士でアップグレードすることができません。\n" -#: tablespace.c:86 +#: tablespace.c:83 #, c-format msgid "tablespace directory \"%s\" does not exist\n" msgstr "テーブル空間のディレクトリ\"%s\"が存在しません\n" -#: tablespace.c:90 +#: tablespace.c:87 #, c-format msgid "could not stat tablespace directory \"%s\": %s\n" msgstr "テーブル空間のディレクトリ\"%s\"を stat できませんでした: %s\n" -#: tablespace.c:95 +#: tablespace.c:92 #, c-format msgid "tablespace path \"%s\" is not a directory\n" msgstr "テーブル空間のパス\"%s\"がディレクトリではありません。\n" -#: util.c:49 -#, c-format -msgid " " -msgstr " " - -#: util.c:82 +#: util.c:52 util.c:82 util.c:115 #, c-format msgid "%-*s" msgstr "%-*s" -#: util.c:174 -#, c-format -msgid "ok" -msgstr "ok" - -#: version.c:29 -#, c-format -msgid "Checking for large objects" -msgstr "ラージオブジェクトをチェックしています" - -#: version.c:77 version.c:384 +#: util.c:113 #, c-format -msgid "warning" -msgstr "警告" +msgid "%-*s\n" +msgstr "%-*s\n" -#: version.c:79 +#: util.c:213 #, c-format -msgid "" -"\n" -"Your installation contains large objects. The new database has an\n" -"additional large object permission table. After upgrading, you will be\n" -"given a command to populate the pg_largeobject_metadata table with\n" -"default permissions.\n" -"\n" -msgstr "" -"\n" -"環境にラージオブジェクトが含まれています。新しいデータベースでは\n" -"ラージオブジェクトのパーミッションテーブルが追加されています。\n" -"アップグレードが終わったら、 pg_largeobject_metadata テーブルに\n" -"デフォルトのパーミッションを投入するためのコマンドが案内されます。\n" -"\n" - -#: version.c:85 -#, c-format -msgid "" -"\n" -"Your installation contains large objects. The new database has an\n" -"additional large object permission table, so default permissions must be\n" -"defined for all large objects. The file\n" -" %s\n" -"when executed by psql by the database superuser will set the default\n" -"permissions.\n" -"\n" -msgstr "" -"\n" -"環境にラージオブジェクトが含まれています。新しいデータベースでは\n" -"ラージオブジェクトのパーミッションテーブルが追加されており、すべてのラージ\n" -"オブジェクトについて、デフォルトのパーミッションを定義する必要があります。\n" -"以下のファイルをpsqlでデータベースのスーパユーザとして実行することで\n" -"デフォルトパーミッションを設定します。\n" -" %s\n" -"\n" +msgid "ok" +msgstr "ok" -#: version.c:239 +#: version.c:184 #, c-format msgid "Checking for incompatible \"line\" data type" msgstr "非互換の \"line\" データ型を確認しています" -#: version.c:246 +#: version.c:191 #, c-format msgid "" -"Your installation contains the \"line\" data type in user tables. This\n" -"data type changed its internal and input/output format between your old\n" -"and new clusters so this cluster cannot currently be upgraded. You can\n" -"remove the problem tables and restart the upgrade. A list of the problem\n" -"columns is in the file:\n" +"Your installation contains the \"line\" data type in user tables.\n" +"This data type changed its internal and input/output format\n" +"between your old and new versions so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" -"移行元の環境のユーザテーブルに\"line\"データ型が含まれています。\n" -"このデータ型は新旧のクラスタ間で内部形式や入出力フォーマットが\n" +"このクラスタではユーザーテーブルに\"line\"データ型が含まれています。\n" +"このデータ型は新旧のクラスタ間で内部形式および入出力フォーマットが\n" "変更されているため、このクラスタは現時点ではアップグレードできません。\n" -"問題のテーブルを削除してから、再度アップグレードを実行してください。\n" +"問題の列を削除したのちにアップグレードを再実行できます。\n" "問題のある列の一覧は、以下のファイルにあります: \n" " %s\n" "\n" -#: version.c:276 +#: version.c:222 #, c-format msgid "Checking for invalid \"unknown\" user columns" msgstr "無効な \"unknown\" ユーザ列をチェックしています" -#: version.c:283 +#: version.c:229 #, c-format msgid "" -"Your installation contains the \"unknown\" data type in user tables. This\n" -"data type is no longer allowed in tables, so this cluster cannot currently\n" -"be upgraded. You can remove the problem tables and restart the upgrade.\n" +"Your installation contains the \"unknown\" data type in user tables.\n" +"This data type is no longer allowed in tables, so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" "A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" -"環境のユーザテーブルに \"unknown\" データ型が含まれています。\n" +"このクラスタではユーザーテーブルに \"unknown\" データ型が含まれています。\n" "このデータ型はもはやテーブル内では利用できないため、このクラスタは現時点\n" -"ではアップグレードできません。問題のテーブルを削除したのち、アップグレードを\n" +"ではアップグレードできません。問題の列を削除したのち、アップグレードを\n" "再実行できます。\n" "問題のある列の一覧は、以下のファイルにあります: \n" " %s\n" "\n" -#: version.c:306 +#: version.c:253 #, c-format msgid "Checking for hash indexes" msgstr "ハッシュインデックスをチェックしています" -#: version.c:386 +#: version.c:331 +#, c-format +msgid "warning" +msgstr "警告" + +#: version.c:333 #, c-format msgid "" "\n" @@ -1742,12 +1727,12 @@ msgid "" "\n" msgstr "" "\n" -"環境にハッシュインデックスがあります。このインデックスは新旧のクラスタ間で\n" +"このクラスタにはハッシュインデックスがあります。このインデックスは新旧のクラスタ間で\n" "フォーマットが異なるため、REINDEX コマンドを使って再構築する必要があります。\n" -"アップグレードが終わったら、REINDEX を使った操作方法が表示されます。\n" +"アップグレードが終わったら、REINDEX を使った操作方法が指示されます。\n" "\n" -#: version.c:392 +#: version.c:339 #, c-format msgid "" "\n" @@ -1760,38 +1745,207 @@ msgid "" "\n" msgstr "" "\n" -"環境にハッシュインデックスがあります。このインデックスは新旧のクラスタ間でフォーマットが\n" -"異なるため、REINDEX コマンドを使って再構築する必要があります。以下のファイル\n" +"このクラスタにはハッシュインデックスがあります。このインデックスは新旧のクラスタ間で\n" +"内部フォーマットが異なるため、REINDEX コマンドを使って再構築する必要があります。\n" +"以下のファイル\n" " %s\n" "を、psqlを使用してデータベースのスーパユーザとして実行することで、無効になった\n" "インデックスを再構築できます。\n" "それまでは、これらのインデックスは使用されません。\n" "\n" -#: version.c:418 +#: version.c:365 #, c-format msgid "Checking for invalid \"sql_identifier\" user columns" msgstr "無効な \"sql_identifier\" ユーザ列を確認しています" -#: version.c:426 +#: version.c:373 #, c-format msgid "" -"Your installation contains the \"sql_identifier\" data type in user tables\n" -"and/or indexes. The on-disk format for this data type has changed, so this\n" -"cluster cannot currently be upgraded. You can remove the problem tables or\n" -"change the data type to \"name\" and restart the upgrade.\n" +"Your installation contains the \"sql_identifier\" data type in user tables.\n" +"The on-disk format for this data type has changed, so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" "A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" -"あなたのインストールでは”sql_identifier”データ型がユーザテーブルまたは/および\n" -"インデックスに含まれています。このデータ型のディスク上での形式は変更されてい\n" -"ます。問題のあるテーブルを削除するか、データ型を\"name\"に変更してからアップ\n" -"グレードを再実行することができます。\n" +"このクラスタではでは”sql_identifier”データ型がユーザテーブルに含まれています。\n" +"このデータ型のディスク上での形式は変更されているため、このクラスタは現時点では\n" +"アップグレードできません。問題のある列を削除した後にアップグレードを再実行する\n" +"ことができます。\n" "問題のある列の一覧は、以下のファイルにあります: \n" " %s\n" "\n" +#: version.c:397 +#, c-format +msgid "Checking for extension updates" +msgstr "機能拡張のアップデートを確認しています" + +#: version.c:449 +#, c-format +msgid "notice" +msgstr "注意" + +#: version.c:450 +#, c-format +msgid "" +"\n" +"Your installation contains extensions that should be updated\n" +"with the ALTER EXTENSION command. The file\n" +" %s\n" +"when executed by psql by the database superuser will update\n" +"these extensions.\n" +"\n" +msgstr "" +"\n" +"このクラスタにはALTER EXTENSIONコマンドによるアップデートが必要な機能拡張が\n" +"あります。以下のファイルをpsqlを使ってデータベースのスーパーユーザーとして実行することで\n" +"これらの機能拡張をアップデートできます。\n" +" %s\n" +"\n" + +#~ msgid "" +#~ "Optimizer statistics and free space information are not transferred\n" +#~ "by pg_upgrade so, once you start the new server, consider running:\n" +#~ " %s\n" +#~ "\n" +#~ msgstr "" +#~ "オプティマイザーの統計情報と空き容量の情報は pg_upgrade では転送されません。\n" +#~ "そのため新サーバーを起動した後、%s の実行を検討してください。\n" +#~ "\n" +#~ "\n" + +#~ msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n" +#~ msgstr "現在動作中の PG 9.1 以前の旧サーバをチェックする場合、旧サーバのポート番号を指定する必要があります。\n" + +#~ msgid "Creating script to analyze new cluster" +#~ msgstr "新クラスタをANALYZEするためのスクリプトを作成しています" + +#~ msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n" +#~ msgstr "template0 以外のすべてのデータベースは接続を許可する必要があります。すなわち pg_database.datallowconn が true でなければなりません。\n" + +#~ msgid "Creating dump of database schemas\n" +#~ msgstr "データベーススキーマのダンプを作成しています。\n" + +#~ msgid "check for \"%s\" failed: cannot read file (permission denied)\n" +#~ msgstr "\"%s\"のチェックに失敗しました:ファイルが読めません(権限が拒否されました)\n" + +#~ msgid "" +#~ "\n" +#~ "The old cluster has a \"plpython_call_handler\" function defined\n" +#~ "in the \"public\" schema which is a duplicate of the one defined\n" +#~ "in the \"pg_catalog\" schema. You can confirm this by executing\n" +#~ "in psql:\n" +#~ "\n" +#~ " \\df *.plpython_call_handler\n" +#~ "\n" +#~ "The \"public\" schema version of this function was created by a\n" +#~ "pre-8.1 install of plpython, and must be removed for pg_upgrade\n" +#~ "to complete because it references a now-obsolete \"plpython\"\n" +#~ "shared object file. You can remove the \"public\" schema version\n" +#~ "of this function by running the following command:\n" +#~ "\n" +#~ " DROP FUNCTION public.plpython_call_handler()\n" +#~ "\n" +#~ "in each affected database:\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "旧クラスタで\"plpython_call_handler\"関数が\"public\"スキーマ内に\n" +#~ "定義されていますが、これは\"pg_catalog\"スキーマで定義されている\n" +#~ "ものと重複しています。このことは以下のコマンドをpsqlで実行して確認\n" +#~ "できます:\n" +#~ "\n" +#~ " \\\\df *.plpython_call_handler\n" +#~ "\n" +#~ "\"public\"スキーマの方の関数は8.1以前の環境のplpythonが作成したもので、\n" +#~ "すでに廃止済みの \"plpython\" 共有オブジェクトファイルを参照している\n" +#~ "ため、pg_upgrade を完了させるには削除する必要があります。以下のコマンドを\n" +#~ "影響のあるデータベースで個別に実行することにより\"public\"スキーマの方の\n" +#~ "関数の削除ができます: \n" +#~ "\n" +#~ " DROP FUNCTION public.plpython_call_handler()\n" +#~ "\n" + +#~ msgid " %s\n" +#~ msgstr " %s\n" + +#~ msgid "Remove the problem functions from the old cluster to continue.\n" +#~ msgstr "継続するには、旧クラスタから問題となっている関数を削除してください。\n" + +#~ msgid "mappings for database \"%s\":\n" +#~ msgstr "データベース\"%s\"のマッピング:\n" + +#~ msgid "%s.%s: %u to %u\n" +#~ msgstr "%s.%s: %u -> %u\n" + +#~ msgid "waitpid() failed: %s\n" +#~ msgstr "waitpid()が失敗しました: %s\n" + +#~ msgid "Restoring database schemas in the new cluster\n" +#~ msgstr "新クラスタ内のデータベーススキーマを復元しています\n" + +#~ msgid "Cloning user relation files\n" +#~ msgstr "ユーザリレーションをクローニングしています\n" + +#~ msgid "Copying user relation files\n" +#~ msgstr "ユーザリレーションのファイルをコピーしています\n" + +#~ msgid "Linking user relation files\n" +#~ msgstr "ユーザリレーションのファイルをリンクしています\n" + +#~ msgid "connection to database failed: %s" +#~ msgstr "データベースへの接続に失敗しました: %s" + +#~ msgid "" +#~ "\n" +#~ "connection to database failed: %s" +#~ msgstr "" +#~ "\n" +#~ "データベースへの接続に失敗しました: %s" + +#~ msgid " " +#~ msgstr " " + +#~ msgid "Checking for large objects" +#~ msgstr "ラージオブジェクトをチェックしています" + +#~ msgid "" +#~ "\n" +#~ "Your installation contains large objects. The new database has an\n" +#~ "additional large object permission table. After upgrading, you will be\n" +#~ "given a command to populate the pg_largeobject_metadata table with\n" +#~ "default permissions.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "環境にラージオブジェクトが含まれています。新しいデータベースでは\n" +#~ "ラージオブジェクトのパーミッションテーブルが追加されています。\n" +#~ "アップグレードが終わったら、 pg_largeobject_metadata テーブルに\n" +#~ "デフォルトのパーミッションを投入するためのコマンドが案内されます。\n" +#~ "\n" + +#~ msgid "" +#~ "\n" +#~ "Your installation contains large objects. The new database has an\n" +#~ "additional large object permission table, so default permissions must be\n" +#~ "defined for all large objects. The file\n" +#~ " %s\n" +#~ "when executed by psql by the database superuser will set the default\n" +#~ "permissions.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "環境にラージオブジェクトが含まれています。新しいデータベースでは\n" +#~ "ラージオブジェクトのパーミッションテーブルが追加されており、すべてのラージ\n" +#~ "オブジェクトについて、デフォルトのパーミッションを定義する必要があります。\n" +#~ "以下のファイルをpsqlでデータベースのスーパユーザとして実行することで\n" +#~ "デフォルトパーミッションを設定します。\n" +#~ " %s\n" +#~ "\n" + #~ msgid "could not parse PG_VERSION file from %s\n" #~ msgstr "%s から PG_VERSION ファイルを読み取れませんでした。\n" diff --git a/src/bin/pg_upgrade/po/ru.po b/src/bin/pg_upgrade/po/ru.po index fbb84a3b37..e26ade17a1 100644 --- a/src/bin/pg_upgrade/po/ru.po +++ b/src/bin/pg_upgrade/po/ru.po @@ -1,13 +1,14 @@ # Russian message translation file for pg_upgrade # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2017, 2018, 2019, 2020. +# Alexander Lakhin , 2017, 2018, 2019, 2020, 2021, 2022. +# Maxim Yablokov , 2021. msgid "" msgstr "" "Project-Id-Version: pg_upgrade (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-11-09 07:34+0300\n" -"PO-Revision-Date: 2020-11-09 08:34+0300\n" +"POT-Creation-Date: 2021-08-14 06:29+0300\n" +"PO-Revision-Date: 2022-01-19 16:26+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -17,7 +18,7 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: check.c:67 +#: check.c:70 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -26,7 +27,7 @@ msgstr "" "Проверка целостности на старом работающем сервере\n" "-------------------------------------------------\n" -#: check.c:73 +#: check.c:76 #, c-format msgid "" "Performing Consistency Checks\n" @@ -35,7 +36,7 @@ msgstr "" "Проведение проверок целостности\n" "-------------------------------\n" -#: check.c:193 +#: check.c:213 #, c-format msgid "" "\n" @@ -44,7 +45,7 @@ msgstr "" "\n" "*Кластеры совместимы*\n" -#: check.c:199 +#: check.c:219 #, c-format msgid "" "\n" @@ -56,20 +57,20 @@ msgstr "" "initdb\n" "для нового кластера, чтобы продолжить.\n" -#: check.c:233 +#: check.c:264 #, c-format msgid "" -"Optimizer statistics are not transferred by pg_upgrade so,\n" -"once you start the new server, consider running:\n" -" %s\n" +"Optimizer statistics are not transferred by pg_upgrade.\n" +"Once you start the new server, consider running:\n" +" %s/vacuumdb %s--all --analyze-in-stages\n" "\n" msgstr "" -"Статистика оптимизатора утилитой pg_upgrade не переносится, поэтому\n" -"запустив новый сервер, имеет смысл выполнить:\n" -" %s\n" +"Статистика оптимизатора утилитой pg_upgrade не переносится.\n" +"Запустив новый сервер, имеет смысл выполнить:\n" +" %s/vacuumdb %s--all --analyze-in-stages\n" "\n" -#: check.c:239 +#: check.c:270 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -78,7 +79,7 @@ msgstr "" "При запуске этого скрипта будут удалены файлы данных старого кластера:\n" " %s\n" -#: check.c:244 +#: check.c:275 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -91,24 +92,24 @@ msgstr "" "пространства или каталог данных нового кластера.\n" "Содержимое старого кластера нужно будет удалить вручную.\n" -#: check.c:254 +#: check.c:287 #, c-format msgid "Checking cluster versions" msgstr "Проверка версий кластеров" -#: check.c:266 +#: check.c:299 #, c-format msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n" msgstr "" "Эта утилита может производить обновление только с версии PostgreSQL 8.4 и " "новее.\n" -#: check.c:270 +#: check.c:303 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s.\n" msgstr "Эта утилита может только повышать версию PostgreSQL до %s.\n" -#: check.c:279 +#: check.c:312 #, c-format msgid "" "This utility cannot be used to downgrade to older major PostgreSQL " @@ -117,7 +118,7 @@ msgstr "" "Эта утилита не может понижать версию до более старой основной версии " "PostgreSQL.\n" -#: check.c:284 +#: check.c:317 #, c-format msgid "" "Old cluster data and binary directories are from different major versions.\n" @@ -125,7 +126,7 @@ msgstr "" "Каталоги данных и исполняемых файлов старого кластера относятся к разным " "основным версиям.\n" -#: check.c:287 +#: check.c:320 #, c-format msgid "" "New cluster data and binary directories are from different major versions.\n" @@ -133,7 +134,7 @@ msgstr "" "Каталоги данных и исполняемых файлов нового кластера относятся к разным " "основным версиям.\n" -#: check.c:304 +#: check.c:337 #, c-format msgid "" "When checking a pre-PG 9.1 live old server, you must specify the old " @@ -142,7 +143,7 @@ msgstr "" "Для проверки старого работающего сервера версии до 9.1 необходимо указать " "номер порта этого сервера.\n" -#: check.c:308 +#: check.c:341 #, c-format msgid "" "When checking a live server, the old and new port numbers must be " @@ -151,14 +152,14 @@ msgstr "" "Для проверки работающего сервера новый номер порта должен отличаться от " "старого.\n" -#: check.c:323 +#: check.c:356 #, c-format msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "" "кодировки в базе данных \"%s\" различаются: старая - \"%s\", новая - \"%s" "\"\n" -#: check.c:328 +#: check.c:361 #, c-format msgid "" "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" @@ -166,7 +167,7 @@ msgstr "" "значения lc_collate в базе данных \"%s\" различаются: старое - \"%s\", " "новое - \"%s\"\n" -#: check.c:331 +#: check.c:364 #, c-format msgid "" "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" @@ -174,41 +175,24 @@ msgstr "" "значения lc_ctype в базе данных \"%s\" различаются: старое - \"%s\", новое " "- \"%s\"\n" -#: check.c:404 +#: check.c:437 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" msgstr "" "Новая база данных кластера \"%s\" не пустая: найдено отношение \"%s.%s\"\n" -#: check.c:453 -#, c-format -msgid "Creating script to analyze new cluster" -msgstr "Создание скрипта для анализа нового кластера" - -#: check.c:467 check.c:626 check.c:890 check.c:969 check.c:1079 check.c:1170 -#: file.c:336 function.c:240 option.c:497 version.c:54 version.c:199 -#: version.c:341 -#, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "не удалось открыть файл \"%s\": %s\n" - -#: check.c:515 check.c:682 -#, c-format -msgid "could not add execute permission to file \"%s\": %s\n" -msgstr "не удалось добавить право выполнения для файла \"%s\": %s\n" - -#: check.c:545 +#: check.c:494 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Проверка каталогов табличных пространств в новом кластере" -#: check.c:556 +#: check.c:505 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"\n" msgstr "" "каталог табличного пространства в новом кластере уже существует: \"%s\"\n" -#: check.c:589 +#: check.c:538 #, c-format msgid "" "\n" @@ -219,7 +203,7 @@ msgstr "" "ПРЕДУПРЕЖДЕНИЕ: новый каталог данных не должен располагаться внутри старого " "каталога данных, то есть, в %s\n" -#: check.c:613 +#: check.c:562 #, c-format msgid "" "\n" @@ -230,37 +214,49 @@ msgstr "" "ПРЕДУПРЕЖДЕНИЕ: пользовательские табличные пространства не должны " "располагаться внутри каталога данных, то есть, в %s\n" -#: check.c:623 +#: check.c:572 #, c-format msgid "Creating script to delete old cluster" msgstr "Создание скрипта для удаления старого кластера" -#: check.c:702 +#: check.c:575 check.c:839 check.c:937 check.c:1016 check.c:1278 file.c:336 +#: function.c:240 option.c:497 version.c:54 version.c:204 version.c:376 +#: version.c:511 +#, c-format +msgid "could not open file \"%s\": %s\n" +msgstr "не удалось открыть файл \"%s\": %s\n" + +#: check.c:631 +#, c-format +msgid "could not add execute permission to file \"%s\": %s\n" +msgstr "не удалось добавить право выполнения для файла \"%s\": %s\n" + +#: check.c:651 #, c-format msgid "Checking database user is the install user" msgstr "Проверка, является ли пользователь БД стартовым пользователем" -#: check.c:718 +#: check.c:667 #, c-format msgid "database user \"%s\" is not the install user\n" msgstr "пользователь БД \"%s\" не является стартовым пользователем\n" -#: check.c:729 +#: check.c:678 #, c-format msgid "could not determine the number of users\n" msgstr "не удалось определить количество пользователей\n" -#: check.c:737 +#: check.c:686 #, c-format msgid "Only the install user can be defined in the new cluster.\n" msgstr "В новом кластере может быть определён только стартовый пользователь.\n" -#: check.c:757 +#: check.c:706 #, c-format msgid "Checking database connection settings" msgstr "Проверка параметров подключения к базе данных" -#: check.c:779 +#: check.c:728 #, c-format msgid "" "template0 must not allow connections, i.e. its pg_database.datallowconn must " @@ -269,7 +265,7 @@ msgstr "" "База template0 не должна допускать подключения, то есть её свойство " "pg_database.datallowconn должно быть false\n" -#: check.c:789 +#: check.c:738 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their pg_database." @@ -278,33 +274,33 @@ msgstr "" "Все базы, кроме template0, должны допускать подключения, то есть их свойство " "pg_database.datallowconn должно быть true\n" -#: check.c:814 +#: check.c:763 #, c-format msgid "Checking for prepared transactions" msgstr "Проверка наличия подготовленных транзакций" -#: check.c:823 +#: check.c:772 #, c-format msgid "The source cluster contains prepared transactions\n" msgstr "Исходный кластер содержит подготовленные транзакции\n" -#: check.c:825 +#: check.c:774 #, c-format msgid "The target cluster contains prepared transactions\n" msgstr "Целевой кластер содержит подготовленные транзакции\n" -#: check.c:851 +#: check.c:800 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Проверка несоответствия при передаче bigint в contrib/isn" -#: check.c:912 check.c:991 check.c:1102 check.c:1193 function.c:262 -#: version.c:245 version.c:282 version.c:425 +#: check.c:861 check.c:962 check.c:1038 check.c:1095 check.c:1154 check.c:1183 +#: check.c:1301 function.c:262 version.c:278 version.c:316 version.c:460 #, c-format msgid "fatal\n" msgstr "сбой\n" -#: check.c:913 +#: check.c:862 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -328,12 +324,35 @@ msgstr "" " %s\n" "\n" -#: check.c:937 +#: check.c:885 +#, c-format +msgid "Checking for user-defined postfix operators" +msgstr "Проверка пользовательских постфиксных операторов" + +#: check.c:963 +#, c-format +msgid "" +"Your installation contains user-defined postfix operators, which are not\n" +"supported anymore. Consider dropping the postfix operators and replacing\n" +"them with prefix operators or function calls.\n" +"A list of user-defined postfix operators is in the file:\n" +" %s\n" +"\n" +msgstr "" +"В вашей инсталляции содержатся пользовательские постфиксные операторы, " +"которые\n" +"теперь не поддерживаются. Их следует удалить и использовать вместо них\n" +"префиксные операторы или функции.\n" +"Список пользовательских постфиксных операторов приведён в файле:\n" +" %s\n" +"\n" + +#: check.c:984 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Проверка таблиц со свойством WITH OIDS" -#: check.c:992 +#: check.c:1039 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -351,96 +370,144 @@ msgstr "" " %s\n" "\n" -#: check.c:1022 +#: check.c:1067 +#, c-format +msgid "Checking for system-defined composite types in user tables" +msgstr "Проверка системных составных типов в пользовательских таблицах" + +#: check.c:1096 +#, c-format +msgid "" +"Your installation contains system-defined composite type(s) in user tables.\n" +"These type OIDs are not stable across PostgreSQL versions,\n" +"so this cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" +" %s\n" +"\n" +msgstr "" +"В вашей инсталляции пользовательские таблицы используют системные составные " +"типы.\n" +"OID таких типов могут различаться в разных версиях PostgreSQL, в настоящем\n" +"состоянии обновить кластер невозможно. Вы можете удалить проблемные столбцы\n" +"и перезапустить обновление. Список проблемных столбцов приведён в файле:\n" +" %s\n" +"\n" + +#: check.c:1124 #, c-format msgid "Checking for reg* data types in user tables" msgstr "Проверка типов данных reg* в пользовательских таблицах" -#: check.c:1103 +#: check.c:1155 #, c-format msgid "" "Your installation contains one of the reg* data types in user tables.\n" "These data types reference system OIDs that are not preserved by\n" "pg_upgrade, so this cluster cannot currently be upgraded. You can\n" -"remove the problem tables and restart the upgrade. A list of the\n" -"problem columns is in the file:\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" "В вашей инсталляции пользовательские таблицы содержат один из типов reg*.\n" "Эти типы данных ссылаются на системные OID, которые не сохраняются утилитой\n" "pg_upgrade, так что обновление кластера в текущем состоянии невозможно. Вы\n" -"можете удалить проблемные таблицы и перезапустить обновление. Список " +"можете удалить проблемные столбцы и перезапустить обновление. Список " "проблемных\n" "столбцов приведён в файле:\n" " %s\n" "\n" -#: check.c:1128 +#: check.c:1177 #, c-format msgid "Checking for incompatible \"jsonb\" data type" msgstr "Проверка несовместимого типа данных \"jsonb\"" -#: check.c:1194 +#: check.c:1184 #, c-format msgid "" "Your installation contains the \"jsonb\" data type in user tables.\n" "The internal format of \"jsonb\" changed during 9.4 beta so this\n" -"cluster cannot currently be upgraded. You can remove the problem\n" -"tables and restart the upgrade. A list of the problem columns is\n" -"in the file:\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" "В вашей инсталляции таблицы используют тип данных jsonb.\n" "Внутренний формат \"jsonb\" изменился в версии 9.4 beta, поэтому обновить " "кластер\n" -"в текущем состоянии невозможно. Вы можете удалить проблемные таблицы и\n" +"в текущем состоянии невозможно. Вы можете удалить проблемные столбцы и\n" "перезапустить обновление. Список проблемных столбцов приведён в файле:\n" " %s\n" "\n" -#: check.c:1216 +#: check.c:1206 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Проверка ролей с именами, начинающимися с \"pg_\"" -#: check.c:1226 +#: check.c:1216 #, c-format msgid "The source cluster contains roles starting with \"pg_\"\n" msgstr "В исходном кластере есть роли, имена которых начинаются с \"pg_\"\n" -#: check.c:1228 +#: check.c:1218 #, c-format msgid "The target cluster contains roles starting with \"pg_\"\n" msgstr "В целевом кластере есть роли, имена которых начинаются с \"pg_\"\n" -#: check.c:1254 +#: check.c:1239 +#, c-format +msgid "Checking for user-defined encoding conversions" +msgstr "Проверка пользовательских перекодировок" + +#: check.c:1302 +#, c-format +msgid "" +"Your installation contains user-defined encoding conversions.\n" +"The conversion function parameters changed in PostgreSQL version 14\n" +"so this cluster cannot currently be upgraded. You can remove the\n" +"encoding conversions in the old cluster and restart the upgrade.\n" +"A list of user-defined encoding conversions is in the file:\n" +" %s\n" +"\n" +msgstr "" +"В вашей инсталляции имеются пользовательские перекодировки.\n" +"У функций перекодировок в PostgreSQL 14 поменялись параметры, поэтому\n" +"в настоящем состоянии обновить кластер невозможно. Вы можете удалить\n" +"перекодировки в старом кластере и перезапустить обновление.\n" +"Список пользовательских перекодировок приведён в файле:\n" +" %s\n" +"\n" + +#: check.c:1329 #, c-format msgid "failed to get the current locale\n" msgstr "не удалось получить текущую локаль\n" -#: check.c:1263 +#: check.c:1338 #, c-format msgid "failed to get system locale name for \"%s\"\n" msgstr "не удалось получить системное имя локали для \"%s\"\n" -#: check.c:1269 +#: check.c:1344 #, c-format msgid "failed to restore old locale \"%s\"\n" msgstr "не удалось восстановить старую локаль \"%s\"\n" -#: controldata.c:127 controldata.c:195 +#: controldata.c:128 controldata.c:196 #, c-format msgid "could not get control data using %s: %s\n" msgstr "не удалось получить управляющие данные, выполнив %s: %s\n" -#: controldata.c:138 +#: controldata.c:139 #, c-format msgid "%d: database cluster state problem\n" msgstr "%d: недопустимое состояние кластера баз данных\n" -#: controldata.c:156 +#: controldata.c:157 #, c-format msgid "" "The source cluster was shut down while in recovery mode. To upgrade, use " @@ -450,7 +517,7 @@ msgstr "" "обновление, используйте документированный способ с rsync или отключите его в " "режиме главного сервера.\n" -#: controldata.c:158 +#: controldata.c:159 #, c-format msgid "" "The target cluster was shut down while in recovery mode. To upgrade, use " @@ -460,160 +527,166 @@ msgstr "" "обновление, используйте документированный способ с rsync или отключите его в " "режиме главного сервера.\n" -#: controldata.c:163 +#: controldata.c:164 #, c-format msgid "The source cluster was not shut down cleanly.\n" msgstr "Исходный кластер не был отключён штатным образом.\n" -#: controldata.c:165 +#: controldata.c:166 #, c-format msgid "The target cluster was not shut down cleanly.\n" msgstr "Целевой кластер не был отключён штатным образом.\n" -#: controldata.c:176 +#: controldata.c:177 #, c-format msgid "The source cluster lacks cluster state information:\n" msgstr "В исходном кластере не хватает информации о состоянии кластера:\n" -#: controldata.c:178 +#: controldata.c:179 #, c-format msgid "The target cluster lacks cluster state information:\n" msgstr "В целевом кластере не хватает информации о состоянии кластера:\n" -#: controldata.c:208 dump.c:49 pg_upgrade.c:339 pg_upgrade.c:375 -#: relfilenode.c:243 util.c:79 +#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371 +#: relfilenode.c:243 server.c:33 util.c:79 #, c-format msgid "%s" msgstr "%s" -#: controldata.c:215 +#: controldata.c:216 #, c-format msgid "%d: pg_resetwal problem\n" msgstr "%d: проблема с выводом pg_resetwal\n" -#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257 -#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309 -#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345 -#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382 -#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426 -#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470 -#: controldata.c:481 +#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258 +#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310 +#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354 +#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383 +#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427 +#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471 +#: controldata.c:482 controldata.c:493 #, c-format msgid "%d: controldata retrieval problem\n" msgstr "%d: проблема с получением управляющих данных\n" -#: controldata.c:546 +#: controldata.c:572 #, c-format msgid "The source cluster lacks some required control information:\n" msgstr "В исходном кластере не хватает необходимой управляющей информации:\n" -#: controldata.c:549 +#: controldata.c:575 #, c-format msgid "The target cluster lacks some required control information:\n" msgstr "В целевом кластере не хватает необходимой управляющей информации:\n" # skip-rule: capital-letter-first -#: controldata.c:552 +#: controldata.c:578 #, c-format msgid " checkpoint next XID\n" msgstr " следующий XID последней конт. точки\n" # skip-rule: capital-letter-first -#: controldata.c:555 +#: controldata.c:581 #, c-format msgid " latest checkpoint next OID\n" msgstr " следующий OID последней конт. точки\n" # skip-rule: capital-letter-first -#: controldata.c:558 +#: controldata.c:584 #, c-format msgid " latest checkpoint next MultiXactId\n" msgstr " следующий MultiXactId последней конт. точки\n" # skip-rule: capital-letter-first -#: controldata.c:562 +#: controldata.c:588 #, c-format msgid " latest checkpoint oldest MultiXactId\n" msgstr " старейший MultiXactId последней конт. точки\n" # skip-rule: capital-letter-first -#: controldata.c:565 +#: controldata.c:591 +#, c-format +msgid " latest checkpoint oldestXID\n" +msgstr " oldestXID последней конт. точки\n" + +# skip-rule: capital-letter-first +#: controldata.c:594 #, c-format msgid " latest checkpoint next MultiXactOffset\n" msgstr " следующий MultiXactOffset последней конт. точки\n" -#: controldata.c:568 +#: controldata.c:597 #, c-format msgid " first WAL segment after reset\n" msgstr " первый сегмент WAL после сброса\n" -#: controldata.c:571 +#: controldata.c:600 #, c-format msgid " float8 argument passing method\n" msgstr " метод передачи аргумента float8\n" -#: controldata.c:574 +#: controldata.c:603 #, c-format msgid " maximum alignment\n" msgstr " максимальное выравнивание\n" -#: controldata.c:577 +#: controldata.c:606 #, c-format msgid " block size\n" msgstr " размер блока\n" -#: controldata.c:580 +#: controldata.c:609 #, c-format msgid " large relation segment size\n" msgstr " размер сегмента большого отношения\n" -#: controldata.c:583 +#: controldata.c:612 #, c-format msgid " WAL block size\n" msgstr " размер блока WAL\n" -#: controldata.c:586 +#: controldata.c:615 #, c-format msgid " WAL segment size\n" msgstr " размер сегмента WAL\n" -#: controldata.c:589 +#: controldata.c:618 #, c-format msgid " maximum identifier length\n" msgstr " максимальная длина идентификатора\n" -#: controldata.c:592 +#: controldata.c:621 #, c-format msgid " maximum number of indexed columns\n" msgstr " максимальное число столбцов в индексе\n" -#: controldata.c:595 +#: controldata.c:624 #, c-format msgid " maximum TOAST chunk size\n" msgstr " максимальный размер порции TOAST\n" -#: controldata.c:599 +#: controldata.c:628 #, c-format msgid " large-object chunk size\n" msgstr " размер порции большого объекта\n" -#: controldata.c:602 +#: controldata.c:631 #, c-format msgid " dates/times are integers?\n" msgstr " дата/время представлены целыми числами?\n" -#: controldata.c:606 +#: controldata.c:635 #, c-format msgid " data checksum version\n" msgstr " версия контрольных сумм данных\n" -#: controldata.c:608 +#: controldata.c:637 #, c-format msgid "Cannot continue without required control information, terminating\n" msgstr "" "Нет необходимой управляющей информации для продолжения, работа прерывается\n" -#: controldata.c:623 +#: controldata.c:652 #, c-format msgid "" "old and new pg_controldata alignments are invalid or do not match\n" @@ -623,13 +696,13 @@ msgstr "" "Вероятно, один кластер установлен в 32-битной системе, а другой ~ в 64-" "битной\n" -#: controldata.c:627 +#: controldata.c:656 #, c-format msgid "old and new pg_controldata block sizes are invalid or do not match\n" msgstr "" "старый и новый размер блоков в pg_controldata различаются или некорректны\n" -#: controldata.c:630 +#: controldata.c:659 #, c-format msgid "" "old and new pg_controldata maximum relation segment sizes are invalid or do " @@ -638,7 +711,7 @@ msgstr "" "старый и новый максимальный размер сегментов отношений в pg_controldata " "различаются или некорректны\n" -#: controldata.c:633 +#: controldata.c:662 #, c-format msgid "" "old and new pg_controldata WAL block sizes are invalid or do not match\n" @@ -646,7 +719,7 @@ msgstr "" "старый и новый размер блоков WAL в pg_controldata различаются или " "некорректны\n" -#: controldata.c:636 +#: controldata.c:665 #, c-format msgid "" "old and new pg_controldata WAL segment sizes are invalid or do not match\n" @@ -654,7 +727,7 @@ msgstr "" "старый и новый размер сегментов WAL в pg_controldata различаются или " "некорректны\n" -#: controldata.c:639 +#: controldata.c:668 #, c-format msgid "" "old and new pg_controldata maximum identifier lengths are invalid or do not " @@ -663,7 +736,7 @@ msgstr "" "старая и новая максимальная длина идентификаторов в pg_controldata " "различаются или некорректны\n" -#: controldata.c:642 +#: controldata.c:671 #, c-format msgid "" "old and new pg_controldata maximum indexed columns are invalid or do not " @@ -672,7 +745,7 @@ msgstr "" "старый и новый максимум числа столбцов, составляющих индексы, в " "pg_controldata различаются или некорректны\n" -#: controldata.c:645 +#: controldata.c:674 #, c-format msgid "" "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not " @@ -681,7 +754,7 @@ msgstr "" "старый и новый максимальный размер порции TOAST в pg_controldata различаются " "или некорректны\n" -#: controldata.c:650 +#: controldata.c:679 #, c-format msgid "" "old and new pg_controldata large-object chunk sizes are invalid or do not " @@ -689,44 +762,44 @@ msgid "" msgstr "" "старый и новый размер порции большого объекта различаются или некорректны\n" -#: controldata.c:653 +#: controldata.c:682 #, c-format msgid "old and new pg_controldata date/time storage types do not match\n" msgstr "" "старый и новый тип хранения даты/времени в pg_controldata различаются или " "некорректны\n" -#: controldata.c:666 +#: controldata.c:695 #, c-format msgid "old cluster does not use data checksums but the new one does\n" msgstr "" "в старом кластере не применялись контрольные суммы данных, но в новом они " "есть\n" -#: controldata.c:669 +#: controldata.c:698 #, c-format msgid "old cluster uses data checksums but the new one does not\n" msgstr "" "в старом кластере применялись контрольные суммы данных, но в новом их нет\n" -#: controldata.c:671 +#: controldata.c:700 #, c-format msgid "old and new cluster pg_controldata checksum versions do not match\n" msgstr "" "старая и новая версия контрольных сумм кластера в pg_controldata " "различаются\n" -#: controldata.c:682 +#: controldata.c:711 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "Добавление расширения \".old\" к старому файлу global/pg_control" -#: controldata.c:687 +#: controldata.c:716 #, c-format msgid "Unable to rename %s to %s.\n" msgstr "Не удалось переименовать %s в %s.\n" -#: controldata.c:690 +#: controldata.c:719 #, c-format msgid "" "\n" @@ -753,32 +826,32 @@ msgstr "Формирование выгрузки глобальных объе msgid "Creating dump of database schemas\n" msgstr "Формирование выгрузки схем базы данных\n" -#: exec.c:44 +#: exec.c:45 #, c-format msgid "could not get pg_ctl version data using %s: %s\n" msgstr "не удалось получить данные версии pg_ctl, выполнив %s: %s\n" -#: exec.c:50 +#: exec.c:51 #, c-format msgid "could not get pg_ctl version output from %s\n" msgstr "не удалось получить версию pg_ctl из результата %s\n" -#: exec.c:104 exec.c:108 +#: exec.c:105 exec.c:109 #, c-format msgid "command too long\n" msgstr "команда слишком длинная\n" -#: exec.c:110 util.c:37 util.c:225 +#: exec.c:111 util.c:37 util.c:225 #, c-format msgid "%s\n" msgstr "%s\n" -#: exec.c:149 option.c:217 +#: exec.c:150 option.c:217 #, c-format msgid "could not open log file \"%s\": %m\n" msgstr "не удалось открыть файл протокола \"%s\": %m\n" -#: exec.c:178 +#: exec.c:179 #, c-format msgid "" "\n" @@ -787,12 +860,12 @@ msgstr "" "\n" "*ошибка*" -#: exec.c:181 +#: exec.c:182 #, c-format msgid "There were problems executing \"%s\"\n" msgstr "При выполнении \"%s\" возникли проблемы\n" -#: exec.c:184 +#: exec.c:185 #, c-format msgid "" "Consult the last few lines of \"%s\" or \"%s\" for\n" @@ -801,7 +874,7 @@ msgstr "" "Чтобы понять причину ошибки, просмотрите последние несколько строк\n" "файла \"%s\" или \"%s\".\n" -#: exec.c:189 +#: exec.c:190 #, c-format msgid "" "Consult the last few lines of \"%s\" for\n" @@ -810,47 +883,53 @@ msgstr "" "Чтобы понять причину ошибки, просмотрите последние несколько строк\n" "файла \"%s\".\n" -#: exec.c:204 option.c:226 +#: exec.c:205 option.c:226 #, c-format msgid "could not write to log file \"%s\": %m\n" msgstr "не удалось записать в файл протокола \"%s\": %m\n" -#: exec.c:230 +#: exec.c:231 #, c-format msgid "could not open file \"%s\" for reading: %s\n" msgstr "не удалось открыть файл \"%s\" для чтения: %s\n" -#: exec.c:257 +#: exec.c:258 #, c-format msgid "You must have read and write access in the current directory.\n" msgstr "У вас должны быть права на чтение и запись в текущем каталоге.\n" -#: exec.c:310 exec.c:372 exec.c:436 +#: exec.c:311 exec.c:377 #, c-format msgid "check for \"%s\" failed: %s\n" msgstr "проверка существования \"%s\" не пройдена: %s\n" -#: exec.c:313 exec.c:375 +#: exec.c:314 exec.c:380 #, c-format msgid "\"%s\" is not a directory\n" msgstr "\"%s\" не является каталогом\n" -#: exec.c:439 +#: exec.c:430 #, c-format msgid "check for \"%s\" failed: not a regular file\n" -msgstr "проверка файла \"%s\" не пройдена: это не обычный файл\n" +msgstr "программа \"%s\" не прошла проверку: это не обычный файл\n" -#: exec.c:451 +#: exec.c:433 #, c-format -msgid "check for \"%s\" failed: cannot read file (permission denied)\n" -msgstr "" -"проверка файла \"%s\" не пройдена: не удаётся прочитать файл (нет доступа)\n" +msgid "check for \"%s\" failed: cannot execute (permission denied)\n" +msgstr "программа \"%s\" не прошла проверку: ошибка выполнения (нет доступа)\n" -#: exec.c:459 +#: exec.c:439 #, c-format -msgid "check for \"%s\" failed: cannot execute (permission denied)\n" +msgid "check for \"%s\" failed: cannot execute\n" +msgstr "программа \"%s\" не прошла проверку: ошибка выполнения\n" + +#: exec.c:449 +#, c-format +msgid "" +"check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n" msgstr "" -"проверка файла \"%s\" не пройдена: выполнение невозможно (нет доступа)\n" +"программа \"%s\" не прошла проверку: получена некорректная версия \"%s\", " +"ожидалась \"%s\"\n" #: file.c:43 file.c:61 #, c-format @@ -1505,8 +1584,8 @@ msgstr "не удалось создать рабочий поток: %s\n" #: parallel.c:300 #, c-format -msgid "waitpid() failed: %s\n" -msgstr "сбой waitpid(): %s\n" +msgid "%s() failed: %s\n" +msgstr "ошибка в %s(): %s\n" #: parallel.c:304 #, c-format @@ -1518,12 +1597,12 @@ msgstr "дочерний процесс завершился нештатно с msgid "child worker exited abnormally: %s\n" msgstr "дочерний процесс завершился аварийно: %s\n" -#: pg_upgrade.c:108 +#: pg_upgrade.c:107 #, c-format msgid "could not read permissions of directory \"%s\": %s\n" msgstr "не удалось считать права на каталог \"%s\": %s\n" -#: pg_upgrade.c:123 +#: pg_upgrade.c:122 #, c-format msgid "" "\n" @@ -1534,17 +1613,17 @@ msgstr "" "Выполнение обновления\n" "---------------------\n" -#: pg_upgrade.c:166 +#: pg_upgrade.c:165 #, c-format msgid "Setting next OID for new cluster" msgstr "Установка следующего OID для нового кластера" -#: pg_upgrade.c:173 +#: pg_upgrade.c:172 #, c-format msgid "Sync data directory to disk" msgstr "Синхронизация каталога данных с ФС" -#: pg_upgrade.c:185 +#: pg_upgrade.c:183 #, c-format msgid "" "\n" @@ -1555,12 +1634,12 @@ msgstr "" "Обновление завершено\n" "--------------------\n" -#: pg_upgrade.c:220 +#: pg_upgrade.c:216 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: не удалось найти свой исполняемый файл\n" -#: pg_upgrade.c:246 +#: pg_upgrade.c:242 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" @@ -1569,7 +1648,7 @@ msgstr "" "Видимо, запущен процесс postmaster, обслуживающий старый кластер.\n" "Остановите его и попробуйте ещё раз.\n" -#: pg_upgrade.c:259 +#: pg_upgrade.c:255 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" @@ -1578,70 +1657,75 @@ msgstr "" "Видимо, запущен процесс postmaster, обслуживающий новый кластер.\n" "Остановите его и попробуйте ещё раз.\n" -#: pg_upgrade.c:273 +#: pg_upgrade.c:269 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Анализ всех строк в новом кластере" -#: pg_upgrade.c:286 +#: pg_upgrade.c:282 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Замораживание всех строк в новом кластере" -#: pg_upgrade.c:306 +#: pg_upgrade.c:302 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Восстановление глобальных объектов в новом кластере" -#: pg_upgrade.c:321 +#: pg_upgrade.c:317 #, c-format msgid "Restoring database schemas in the new cluster\n" msgstr "Восстановление схем баз данных в новом кластере\n" -#: pg_upgrade.c:425 +#: pg_upgrade.c:421 #, c-format msgid "Deleting files from new %s" msgstr "Удаление файлов из нового каталога %s" -#: pg_upgrade.c:429 +#: pg_upgrade.c:425 #, c-format msgid "could not delete directory \"%s\"\n" msgstr "ошибка при удалении каталога \"%s\"\n" -#: pg_upgrade.c:448 +#: pg_upgrade.c:444 #, c-format msgid "Copying old %s to new server" msgstr "Копирование старого каталога %s на новый сервер" -#: pg_upgrade.c:475 +#: pg_upgrade.c:470 +#, c-format +msgid "Setting oldest XID for new cluster" +msgstr "Установка старейшего OID для нового кластера" + +#: pg_upgrade.c:478 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "" "Установка следующего идентификатора транзакции и эпохи для нового кластера" -#: pg_upgrade.c:505 +#: pg_upgrade.c:508 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "" "Установка следующего идентификатора и смещения мультитранзакции для нового " "кластера" -#: pg_upgrade.c:529 +#: pg_upgrade.c:532 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Установка старейшего идентификатора мультитранзакции в новом кластере" -#: pg_upgrade.c:549 +#: pg_upgrade.c:552 #, c-format msgid "Resetting WAL archives" msgstr "Сброс архивов WAL" -#: pg_upgrade.c:592 +#: pg_upgrade.c:595 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Установка счётчиков frozenxid и minmxid в новом кластере" -#: pg_upgrade.c:594 +#: pg_upgrade.c:597 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Установка счётчика minmxid в новом кластере" @@ -1694,22 +1778,17 @@ msgstr "копирование \"%s\" в \"%s\"\n" msgid "linking \"%s\" to \"%s\"\n" msgstr "создание ссылки на \"%s\" в \"%s\"\n" -#: server.c:33 -#, c-format -msgid "connection to database failed: %s" -msgstr "не удалось подключиться к базе: %s" - -#: server.c:39 server.c:141 util.c:135 util.c:165 +#: server.c:38 server.c:142 util.c:135 util.c:165 #, c-format msgid "Failure, exiting\n" msgstr "Ошибка, выполняется выход\n" -#: server.c:131 +#: server.c:132 #, c-format msgid "executing: %s\n" msgstr "выполняется: %s\n" -#: server.c:137 +#: server.c:138 #, c-format msgid "" "SQL command failed\n" @@ -1720,24 +1799,24 @@ msgstr "" "%s\n" "%s" -#: server.c:167 +#: server.c:168 #, c-format msgid "could not open version file \"%s\": %m\n" msgstr "не удалось открыть файл с версией \"%s\": %m\n" -#: server.c:171 +#: server.c:172 #, c-format msgid "could not parse version file \"%s\"\n" msgstr "не удалось разобрать файл с версией \"%s\"\n" -#: server.c:297 +#: server.c:298 #, c-format msgid "" "\n" -"connection to database failed: %s" +"%s" msgstr "" "\n" -"не удалось подключиться к базе: %s" +"%s" #: server.c:302 #, c-format @@ -1822,14 +1901,14 @@ msgstr "%-*s" #: util.c:174 #, c-format msgid "ok" -msgstr "ok" +msgstr "ок" #: version.c:29 #, c-format msgid "Checking for large objects" msgstr "Проверка больших объектов" -#: version.c:77 version.c:384 +#: version.c:77 version.c:419 #, c-format msgid "warning" msgstr "предупреждение" @@ -1869,23 +1948,24 @@ msgstr "" "имеется дополнительная таблица с правами для больших объектов, поэтому\n" "для всех больших объектов должны определяться права по умолчанию. Скрипт\n" " %s\n" -"позволяет установить такие права (он предназначен для выполнения в psql\n" -"суперпользователем базы данных).\n" +"будучи выполненным администратором БД в psql, установит нужные права\n" +"по умолчанию.\n" "\n" -#: version.c:239 +#: version.c:272 #, c-format msgid "Checking for incompatible \"line\" data type" msgstr "Проверка несовместимого типа данных \"line\"" -#: version.c:246 +#: version.c:279 #, c-format msgid "" -"Your installation contains the \"line\" data type in user tables. This\n" -"data type changed its internal and input/output format between your old\n" -"and new clusters so this cluster cannot currently be upgraded. You can\n" -"remove the problem tables and restart the upgrade. A list of the problem\n" -"columns is in the file:\n" +"Your installation contains the \"line\" data type in user tables.\n" +"This data type changed its internal and input/output format\n" +"between your old and new versions so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" @@ -1895,40 +1975,43 @@ msgstr "" "отличается\n" "от нового, поэтому в настоящем состоянии обновить кластер невозможно. Вы " "можете\n" -"удалить проблемные таблицы и перезапустить обновление. Список проблемных\n" +"удалить проблемные столбцы и перезапустить обновление. Список проблемных\n" "столбцов приведён в файле:\n" " %s\n" "\n" -#: version.c:276 +#: version.c:310 #, c-format msgid "Checking for invalid \"unknown\" user columns" msgstr "Проверка неправильных пользовательских столбцов типа \"unknown\"" -#: version.c:283 +#: version.c:317 #, c-format msgid "" -"Your installation contains the \"unknown\" data type in user tables. This\n" -"data type is no longer allowed in tables, so this cluster cannot currently\n" -"be upgraded. You can remove the problem tables and restart the upgrade.\n" +"Your installation contains the \"unknown\" data type in user tables.\n" +"This data type is no longer allowed in tables, so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" "A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" "В вашей инсталляции пользовательские таблицы используют тип данных \"unknown" "\".\n" -"Теперь использование этого типа данных не допускается, поэтому в настоящем\n" -"состоянии обновить кластер невозможно. Вы можете удалить проблемные таблицы\n" -"и перезапустить обновления. Список проблемных столбцов приведён в файле:\n" +"Теперь использование этого типа данных в таблицах не допускается, поэтому\n" +"в настоящем состоянии обновить кластер невозможно. Вы можете удалить " +"проблемные\n" +"столбцы и перезапустить обновление. Список проблемных столбцов приведён в " +"файле:\n" " %s\n" "\n" -#: version.c:306 +#: version.c:341 #, c-format msgid "Checking for hash indexes" msgstr "Проверка хеш-индексов" -#: version.c:386 +#: version.c:421 #, c-format msgid "" "\n" @@ -1945,7 +2028,7 @@ msgstr "" "инструкции по выполнению REINDEX.\n" "\n" -#: version.c:392 +#: version.c:427 #, c-format msgid "" "\n" @@ -1960,38 +2043,84 @@ msgstr "" "\n" "В вашей инсталляции используются хеш-индексы. Эти индексы имеют разные\n" "внутренние форматы в старом и новом кластерах, поэтому их необходимо\n" -"перестроить с помощью команды REINDEX. Скрипт\n" +"перестроить с помощью команды REINDEX. Скрипт\n" " %s\n" "будучи выполненным администратором БД в psql, пересоздаст все неправильные\n" "индексы; до этого никакие хеш-индексы не будут использоваться.\n" "\n" -#: version.c:418 +#: version.c:453 #, c-format msgid "Checking for invalid \"sql_identifier\" user columns" msgstr "" "Проверка неправильных пользовательских столбцов типа \"sql_identifier\"" -#: version.c:426 +#: version.c:461 #, c-format msgid "" -"Your installation contains the \"sql_identifier\" data type in user tables\n" -"and/or indexes. The on-disk format for this data type has changed, so this\n" -"cluster cannot currently be upgraded. You can remove the problem tables or\n" -"change the data type to \"name\" and restart the upgrade.\n" +"Your installation contains the \"sql_identifier\" data type in user tables.\n" +"The on-disk format for this data type has changed, so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" "A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" -"В вашей инсталляции пользовательские таблицы и/или индексы используют тип\n" -"данных \"sql_identifier\". Формат хранения таких данных на диске поменялся,\n" -"поэтому обновить данный кластер невозможно. Вы можете удалить проблемные " -"таблицы\n" -"или поменять тип данных на \"name\" и перезапустить обновления.\n" +"В вашей инсталляции пользовательские таблицы используют тип данных\n" +"\"sql_identifier\". Формат хранения таких данных на диске поменялся,\n" +"поэтому обновить данный кластер невозможно. Вы можете удалить проблемные\n" +"столбцы и перезапустить обновление.\n" "Список проблемных столбцов приведён в файле:\n" " %s\n" "\n" +#: version.c:485 +#, c-format +msgid "Checking for extension updates" +msgstr "Проверка обновлённых расширений" + +#: version.c:537 +#, c-format +msgid "notice" +msgstr "замечание" + +#: version.c:538 +#, c-format +msgid "" +"\n" +"Your installation contains extensions that should be updated\n" +"with the ALTER EXTENSION command. The file\n" +" %s\n" +"when executed by psql by the database superuser will update\n" +"these extensions.\n" +"\n" +msgstr "" +"\n" +"В вашей инсталляции есть расширения, которые надо обновить\n" +"командой ALTER EXTENSION. Скрипт\n" +" %s\n" +"будучи выполненным администратором БД в psql, обновит все\n" +"эти расширения.\n" +"\n" + +#~ msgid "Creating script to analyze new cluster" +#~ msgstr "Создание скрипта для анализа нового кластера" + +#~ msgid "check for \"%s\" failed: cannot read file (permission denied)\n" +#~ msgstr "" +#~ "проверка файла \"%s\" не пройдена: не удаётся прочитать файл (нет " +#~ "доступа)\n" + +#~ msgid "connection to database failed: %s" +#~ msgstr "не удалось подключиться к базе: %s" + +#~ msgid "" +#~ "\n" +#~ "connection to database failed: %s" +#~ msgstr "" +#~ "\n" +#~ "не удалось подключиться к базе: %s" + #~ msgid "" #~ "Optimizer statistics and free space information are not transferred\n" #~ "by pg_upgrade so, once you start the new server, consider running:\n" diff --git a/src/bin/pg_upgrade/po/sv.po b/src/bin/pg_upgrade/po/sv.po index 92678bbe1b..de4f6dfb25 100644 --- a/src/bin/pg_upgrade/po/sv.po +++ b/src/bin/pg_upgrade/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_upgrade # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-20 16:45+0000\n" -"PO-Revision-Date: 2020-10-20 20:29+0200\n" +"POT-Creation-Date: 2022-04-11 19:48+0000\n" +"PO-Revision-Date: 2022-04-11 22:24+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: check.c:67 +#: check.c:71 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -26,7 +26,7 @@ msgstr "" "Utför konsistenskontroller på gamla live-servern\n" "------------------------------------------------\n" -#: check.c:73 +#: check.c:77 #, c-format msgid "" "Performing Consistency Checks\n" @@ -35,7 +35,7 @@ msgstr "" "Utför konsistenskontroller\n" "--------------------------\n" -#: check.c:193 +#: check.c:210 #, c-format msgid "" "\n" @@ -44,7 +44,7 @@ msgstr "" "\n" "*Klustren är kompatibla*\n" -#: check.c:199 +#: check.c:216 #, c-format msgid "" "\n" @@ -55,20 +55,20 @@ msgstr "" "Om pg_upgrade misslyckas efter denna punkt så måste du\n" "köra om initdb på nya klustret innan du fortsätter.\n" -#: check.c:233 +#: check.c:257 #, c-format msgid "" -"Optimizer statistics are not transferred by pg_upgrade so,\n" -"once you start the new server, consider running:\n" -" %s\n" +"Optimizer statistics are not transferred by pg_upgrade.\n" +"Once you start the new server, consider running:\n" +" %s/vacuumdb %s--all --analyze-in-stages\n" "\n" msgstr "" -"Optimeringsstatistik överförs inte av pg_upgrade så\n" -"när du startar nya servern så vill du nog köra:\n" -" %s\n" +"Optimeringsstatistik överförs inte av pg_upgrade.\n" +"När du startar nya servern så vill du nog köra:\n" +" %s/vacuumdb %s--all --analyze-in-stages\n" "\n" -#: check.c:239 +#: check.c:263 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -77,7 +77,7 @@ msgstr "" "När detta skript körs så raderas gamla klustrets datafiler:\n" " %s\n" -#: check.c:244 +#: check.c:268 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -90,94 +90,82 @@ msgstr "" "ligger i gamla klusterkatalogen. Det gamla klustrets innehåll\n" "måste raderas för hand.\n" -#: check.c:254 +#: check.c:280 #, c-format msgid "Checking cluster versions" msgstr "Kontrollerar klustrets versioner" -#: check.c:266 +#: check.c:292 #, c-format -msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n" -msgstr "Detta verktyg kan bara uppgradera från PostgreSQL version 8.4 eller nyare.\n" +msgid "This utility can only upgrade from PostgreSQL version 9.2 and later.\n" +msgstr "Detta verktyg kan bara uppgradera från PostgreSQL version 9.2 eller nyare.\n" -#: check.c:270 +#: check.c:296 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s.\n" msgstr "Detta verktyg kan bara uppgradera till PostgreSQL version %s.\n" -#: check.c:279 +#: check.c:305 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n" msgstr "Detta verktyg kan inte användas för att nergradera till äldre major-versioner av PostgreSQL.\n" -#: check.c:284 +#: check.c:310 #, c-format msgid "Old cluster data and binary directories are from different major versions.\n" msgstr "Gammal klusterdata och binära kataloger är från olika major-versioner.\n" -#: check.c:287 +#: check.c:313 #, c-format msgid "New cluster data and binary directories are from different major versions.\n" msgstr "Nya klusterdata och binära kataloger är från olika major-versioner.\n" -#: check.c:304 -#, c-format -msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n" -msgstr "Vid kontroll av en gammal live-server före PG 9.1 så måste den gamla serverns portnummer anges.\n" - -#: check.c:308 +#: check.c:328 #, c-format msgid "When checking a live server, the old and new port numbers must be different.\n" msgstr "Vid kontroll av en live-server så måste gamla och nya portnumren vara olika.\n" -#: check.c:323 +#: check.c:343 #, c-format msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "kodning för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n" -#: check.c:328 +#: check.c:348 #, c-format msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "lc_collate-värden för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n" -#: check.c:331 +#: check.c:351 #, c-format msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "lc_ctype-värden för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n" -#: check.c:404 -#, c-format -msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" -msgstr "Nya databasklustret \"%s\" är inte tomt: hittade relation \"%s.%s\"\n" - -#: check.c:453 +#: check.c:354 #, c-format -msgid "Creating script to analyze new cluster" -msgstr "Skapar skript för att analysera nya klustret" +msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n" +msgstr "localleverantörer för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n" -#: check.c:467 check.c:626 check.c:890 check.c:969 check.c:1079 check.c:1170 -#: file.c:336 function.c:240 option.c:497 version.c:54 version.c:199 -#: version.c:341 +#: check.c:361 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "kan inte öppna fil \"%s\": %s\n" +msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" +msgstr "inställning av ICU-lokal för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n" -#: check.c:515 check.c:682 +#: check.c:436 #, c-format -msgid "could not add execute permission to file \"%s\": %s\n" -msgstr "kan inte sätta rättigheten \"körbar\" på filen \"%s\": %s\n" +msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" +msgstr "Nya databasklustret \"%s\" är inte tomt: hittade relation \"%s.%s\"\n" -#: check.c:545 +#: check.c:488 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Letar efter nya tablespace-kataloger i klustret" -#: check.c:556 +#: check.c:499 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"\n" msgstr "i klustret finns redan ny tablespace-katalog: \"%s\"\n" -#: check.c:589 +#: check.c:532 #, c-format msgid "" "\n" @@ -186,7 +174,7 @@ msgstr "" "\n" "VARNING: nya datakatalogen skall inte ligga inuti den gamla datakatalogen, dvs. %s\n" -#: check.c:613 +#: check.c:556 #, c-format msgid "" "\n" @@ -195,73 +183,102 @@ msgstr "" "\n" "VARNING: användardefinierade tabellutrymmens position skall inte vara i datakatalogen, dvs. %s\n" -#: check.c:623 +#: check.c:566 #, c-format msgid "Creating script to delete old cluster" msgstr "Skapar skript för att radera gamla klustret" -#: check.c:702 +#: check.c:569 check.c:744 check.c:864 check.c:963 check.c:1043 check.c:1306 +#: file.c:336 function.c:165 option.c:465 version.c:116 version.c:288 +#: version.c:423 +#, c-format +msgid "could not open file \"%s\": %s\n" +msgstr "kan inte öppna fil \"%s\": %s\n" + +#: check.c:620 +#, c-format +msgid "could not add execute permission to file \"%s\": %s\n" +msgstr "kan inte sätta rättigheten \"körbar\" på filen \"%s\": %s\n" + +#: check.c:640 #, c-format msgid "Checking database user is the install user" msgstr "Kontrollerar att databasanvändaren är installationsanvändaren" -#: check.c:718 +#: check.c:656 #, c-format msgid "database user \"%s\" is not the install user\n" msgstr "databasanvändare \"%s\" är inte installationsanvändaren\n" -#: check.c:729 +#: check.c:667 #, c-format msgid "could not determine the number of users\n" msgstr "kunde inte bestämma antalet användare\n" -#: check.c:737 +#: check.c:675 #, c-format msgid "Only the install user can be defined in the new cluster.\n" msgstr "Bara installationsanvändaren får finnas i nya klustret.\n" -#: check.c:757 +#: check.c:705 #, c-format msgid "Checking database connection settings" msgstr "Kontrollerar databasens anslutningsinställningar" -#: check.c:779 +#: check.c:731 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n" msgstr "template0 får inte tillåta anslutningar, dvs dess pg_database.datallowconn måste vara false\n" -#: check.c:789 +#: check.c:761 check.c:886 check.c:988 check.c:1065 check.c:1122 check.c:1181 +#: check.c:1210 check.c:1329 function.c:187 version.c:190 version.c:228 +#: version.c:372 #, c-format -msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n" -msgstr "Alla icke-template0-databaser måste tillåta anslutningar, dvs. deras pg_database.datallowconn måste vara true\n" +msgid "fatal\n" +msgstr "fatalt\n" -#: check.c:814 +#: check.c:762 +#, c-format +msgid "" +"All non-template0 databases must allow connections, i.e. their\n" +"pg_database.datallowconn must be true. Your installation contains\n" +"non-template0 databases with their pg_database.datallowconn set to\n" +"false. Consider allowing connection for all non-template0 databases\n" +"or drop the databases which do not allow connections. A list of\n" +"databases with the problem is in the file:\n" +" %s\n" +"\n" +msgstr "" +"Alla databaser förutom template0 måste tillåta anslutningar, dvs deras\n" +"pg_database.datallowconn måste vara true. Din installation har andra\n" +"databaser än template0 som har pg_database.datallowconn sat till false\n" +"Överväg att tillåta anslutningar för alla databaser förutom template0\n" +"eller släng de databaser som inte tillåter anslutningar. En lista med\n" +"problemdatabaser finns i filen:\n" +" %s\n" +"\n" + +#: check.c:787 #, c-format msgid "Checking for prepared transactions" msgstr "Letar efter förberedda transaktioner" -#: check.c:823 +#: check.c:796 #, c-format msgid "The source cluster contains prepared transactions\n" msgstr "Källklustret innehåller förberedda transaktioner\n" -#: check.c:825 +#: check.c:798 #, c-format msgid "The target cluster contains prepared transactions\n" msgstr "Målklustret innehåller förberedda transaktioner\n" -#: check.c:851 +#: check.c:824 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Letar efter contrib/isn med bigint-anropsfel" -#: check.c:912 check.c:991 check.c:1102 check.c:1193 function.c:262 -#: version.c:245 version.c:282 version.c:425 -#, c-format -msgid "fatal\n" -msgstr "fatalt\n" - -#: check.c:913 +#: check.c:887 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -282,12 +299,34 @@ msgstr "" " %s\n" "\n" -#: check.c:937 +#: check.c:910 +#, c-format +msgid "Checking for user-defined postfix operators" +msgstr "Letar efter användardefinierade postfix-operatorer" + +#: check.c:989 +#, c-format +msgid "" +"Your installation contains user-defined postfix operators, which are not\n" +"supported anymore. Consider dropping the postfix operators and replacing\n" +"them with prefix operators or function calls.\n" +"A list of user-defined postfix operators is in the file:\n" +" %s\n" +"\n" +msgstr "" +"Din installation innehåller användardefinierade postfix-operatorer, vilket\n" +"inte stöds längre. Överväg att ta bort postfix-operatorer och ersätt dem\n" +"med prefix-operatorer eller funktionsanrrop.\n" +"En lista med användardefinierade postfix-operatorer finns i filen:\n" +" %s\n" +"\n" + +#: check.c:1010 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Letar efter tabeller med WITH OIDS" -#: check.c:992 +#: check.c:1066 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -305,252 +344,307 @@ msgstr "" "\n" # FIXME: is this msgid correct? -#: check.c:1022 +#: check.c:1094 +#, c-format +msgid "Checking for system-defined composite types in user tables" +msgstr "Letar i användartabeller efter systemdefinierade typer av sorten \"composite\"" + +#: check.c:1123 +#, c-format +msgid "" +"Your installation contains system-defined composite type(s) in user tables.\n" +"These type OIDs are not stable across PostgreSQL versions,\n" +"so this cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" +" %s\n" +"\n" +msgstr "" +"Din installation innehåller användartabeller med systemdefinierade typer\n" +"av sorten \"composite\". OID:er för dessa typer är inte stabila över\n" +"PostgreSQL-versioner så detta kluster kan inte uppgraderas för tillfället.\n" +"Du kan slänga problemkolumnerna och återstarta uppgraderingen.\n" +"En lista med problemkolumner finns i filen:\n" +" %s\n" +"\n" + +# FIXME: is this msgid correct? +#: check.c:1151 #, c-format msgid "Checking for reg* data types in user tables" msgstr "Letar efter reg*-datatyper i användartabeller" -#: check.c:1103 +#: check.c:1182 #, c-format msgid "" "Your installation contains one of the reg* data types in user tables.\n" "These data types reference system OIDs that are not preserved by\n" "pg_upgrade, so this cluster cannot currently be upgraded. You can\n" -"remove the problem tables and restart the upgrade. A list of the\n" -"problem columns is in the file:\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" "Din installation använder en av reg*-datatyperna i en användartabell.\n" "Dessa datatyper refererar system-OID:er som inte bevaras av pg_upgrade\n" "så detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n" -"problemtabellerna och starta om uppgraderingen. En lista med\n" -"problemkolumnerna finns i filen:\n" +"problemkolumnerna och starta om uppgraderingen.\n" +"En lista med problemkolumner finns i filen:\n" " %s\n" "\n" # FIXME: is this msgid correct? -#: check.c:1128 +#: check.c:1204 #, c-format msgid "Checking for incompatible \"jsonb\" data type" msgstr "Letar efter inkompatibel \"jsonb\"-datatyp" -#: check.c:1194 +#: check.c:1211 #, c-format msgid "" "Your installation contains the \"jsonb\" data type in user tables.\n" "The internal format of \"jsonb\" changed during 9.4 beta so this\n" -"cluster cannot currently be upgraded. You can remove the problem\n" -"tables and restart the upgrade. A list of the problem columns is\n" -"in the file:\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" "Din installation innehåller \"jsonb\"-datatypen i användartabeller.\n" "Interna formatet för \"jsonb\" ändrades under 9.4-betan så detta kluster kan\n" -"för närvarande inte uppgraderas. Du kan ta bort problemtabellerna och\n" -"starta om uppgraderingen. En lista med problemkolumnerna finns i filen:\n" +"för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna och\n" +"starta om uppgraderingen.\n" +"En lista med problemkolumner finns i filen:\n" " %s\n" "\n" -#: check.c:1216 +#: check.c:1233 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Letar efter roller som startar med \"pg_\"" -#: check.c:1226 +#: check.c:1243 #, c-format msgid "The source cluster contains roles starting with \"pg_\"\n" msgstr "Källklustret innehåller roller som startar med \"pg_\"\n" -#: check.c:1228 +#: check.c:1245 #, c-format msgid "The target cluster contains roles starting with \"pg_\"\n" msgstr "Målklustret innehåller roller som startar med \"pg_\"\n" -#: check.c:1254 +#: check.c:1266 +#, c-format +msgid "Checking for user-defined encoding conversions" +msgstr "Letar efter användardefinierade teckenkodkonverteringar" + +#: check.c:1330 +#, c-format +msgid "" +"Your installation contains user-defined encoding conversions.\n" +"The conversion function parameters changed in PostgreSQL version 14\n" +"so this cluster cannot currently be upgraded. You can remove the\n" +"encoding conversions in the old cluster and restart the upgrade.\n" +"A list of user-defined encoding conversions is in the file:\n" +" %s\n" +"\n" +msgstr "" +"Din installation innehåller användardefinierade teckenkodkonverteringar.\n" +"Parametrar till konverteringsfunktioner ändrades i PostgreSQL 14 så\n" +"detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n" +"teckenkodkonverteringarna i gamla klustret och starta om uppgraderingen.\n" +"En lista med användardefinierade teckenkodkonverteringar finns i filen:\n" +" %s\n" +"\n" + +#: check.c:1357 #, c-format msgid "failed to get the current locale\n" msgstr "misslyckades med att hämta aktuell lokal\n" -#: check.c:1263 +#: check.c:1366 #, c-format msgid "failed to get system locale name for \"%s\"\n" msgstr "misslyckades med att hämta systemlokalnamn för \"%s\"\n" -#: check.c:1269 +#: check.c:1372 #, c-format msgid "failed to restore old locale \"%s\"\n" msgstr "misslyckades med att återställa gamla lokalen \"%s\"\n" -#: controldata.c:127 controldata.c:195 +#: controldata.c:128 controldata.c:196 #, c-format msgid "could not get control data using %s: %s\n" msgstr "kunde inte hämta kontrolldata med %s: %s\n" -#: controldata.c:138 +#: controldata.c:139 #, c-format msgid "%d: database cluster state problem\n" msgstr "%d: state-problem för databaskluster\n" -#: controldata.c:156 +#: controldata.c:157 #, c-format msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" msgstr "Källklustret stängdes ner när det var i återställningsläge. För att uppgradera så använd \"rsync\" enligt dokumentation eller stäng ner den som en primär.\n" -#: controldata.c:158 +#: controldata.c:159 #, c-format msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" msgstr "Målklustret stängdes ner när det var i återställningsläge. För att uppgradera så använd \"rsync\" enligt dokumentation eller stäng ner den som en primär.\n" -#: controldata.c:163 +#: controldata.c:164 #, c-format msgid "The source cluster was not shut down cleanly.\n" msgstr "Källklustret har inte stängts ner på ett korrekt sätt.\n" -#: controldata.c:165 +#: controldata.c:166 #, c-format msgid "The target cluster was not shut down cleanly.\n" msgstr "Målklustret har inte stängts ner på ett korrekt sätt.\n" -#: controldata.c:176 +#: controldata.c:177 #, c-format msgid "The source cluster lacks cluster state information:\n" msgstr "Källklustret saknar information om kluster-state:\n" -#: controldata.c:178 +#: controldata.c:179 #, c-format msgid "The target cluster lacks cluster state information:\n" msgstr "Målklustret saknar information om kluster-state:\n" -#: controldata.c:208 dump.c:49 pg_upgrade.c:339 pg_upgrade.c:375 -#: relfilenode.c:243 util.c:79 +#: controldata.c:209 dump.c:50 pg_upgrade.c:402 pg_upgrade.c:439 +#: relfilenode.c:231 server.c:34 #, c-format msgid "%s" msgstr "%s" -#: controldata.c:215 +#: controldata.c:216 #, c-format msgid "%d: pg_resetwal problem\n" msgstr "%d: pg_resetwal-problem\n" -#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257 -#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309 -#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345 -#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382 -#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426 -#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470 -#: controldata.c:481 +#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258 +#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310 +#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354 +#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383 +#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427 +#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471 +#: controldata.c:482 controldata.c:493 #, c-format msgid "%d: controldata retrieval problem\n" msgstr "%d: problem vid hämtning av kontrolldata\n" -#: controldata.c:546 +#: controldata.c:572 #, c-format msgid "The source cluster lacks some required control information:\n" msgstr "Källklustret saknar lite kontrolldata som krävs:\n" -#: controldata.c:549 +#: controldata.c:575 #, c-format msgid "The target cluster lacks some required control information:\n" msgstr "Målklustret saknar lite kontrolldata som krävs:\n" -#: controldata.c:552 +#: controldata.c:578 #, c-format msgid " checkpoint next XID\n" msgstr " checkpoint nästa-XID\n" -#: controldata.c:555 +#: controldata.c:581 #, c-format msgid " latest checkpoint next OID\n" msgstr " senaste checkpoint nästa-OID\n" -#: controldata.c:558 +#: controldata.c:584 #, c-format msgid " latest checkpoint next MultiXactId\n" msgstr " senaster checkpoint nästa-MultiXactId\n" -#: controldata.c:562 +#: controldata.c:588 #, c-format msgid " latest checkpoint oldest MultiXactId\n" msgstr " senaste checkpoint äldsta-MultiXactId\n" -#: controldata.c:565 +#: controldata.c:591 +#, c-format +msgid " latest checkpoint oldestXID\n" +msgstr " senaste checkpoint äldsta-XID\n" + +#: controldata.c:594 #, c-format msgid " latest checkpoint next MultiXactOffset\n" msgstr " senaste checkpoint nästa-MultiXactOffset\n" -#: controldata.c:568 +#: controldata.c:597 #, c-format msgid " first WAL segment after reset\n" msgstr " första WAL-segmentet efter reset\n" -#: controldata.c:571 +#: controldata.c:600 #, c-format msgid " float8 argument passing method\n" msgstr " float8 argumentöverföringsmetod\n" -#: controldata.c:574 +#: controldata.c:603 #, c-format msgid " maximum alignment\n" msgstr " maximal alignment\n" -#: controldata.c:577 +#: controldata.c:606 #, c-format msgid " block size\n" msgstr " blockstorlek\n" -#: controldata.c:580 +#: controldata.c:609 #, c-format msgid " large relation segment size\n" msgstr " stora relationers segmentstorlek\n" -#: controldata.c:583 +#: controldata.c:612 #, c-format msgid " WAL block size\n" msgstr " WAL-blockstorlek\n" -#: controldata.c:586 +#: controldata.c:615 #, c-format msgid " WAL segment size\n" msgstr " WAL-segmentstorlek\n" -#: controldata.c:589 +#: controldata.c:618 #, c-format msgid " maximum identifier length\n" msgstr " maximal identifierarlängd\n" -#: controldata.c:592 +#: controldata.c:621 #, c-format msgid " maximum number of indexed columns\n" msgstr " maximalt antal indexerade kolumner\n" -#: controldata.c:595 +#: controldata.c:624 #, c-format msgid " maximum TOAST chunk size\n" msgstr " maximal TOAST-chunkstorlek\n" -#: controldata.c:599 +#: controldata.c:628 #, c-format msgid " large-object chunk size\n" msgstr " stora-objekt chunkstorlek\n" -#: controldata.c:602 +#: controldata.c:631 #, c-format msgid " dates/times are integers?\n" msgstr " datum/tid är heltal?\n" -#: controldata.c:606 +#: controldata.c:635 #, c-format msgid " data checksum version\n" msgstr " datachecksumversion\n" -#: controldata.c:608 +#: controldata.c:637 #, c-format msgid "Cannot continue without required control information, terminating\n" msgstr "Kan inte fortsätta utan kontrollinformation som krävs, avslutar\n" -#: controldata.c:623 +#: controldata.c:652 #, c-format msgid "" "old and new pg_controldata alignments are invalid or do not match\n" @@ -559,77 +653,77 @@ msgstr "" "gamla och nya pg_controldata-alignments är ogiltiga eller matchar inte.\n" "Troligen är ett kluster en 32-bitars-installation och den andra 64-bitars\n" -#: controldata.c:627 +#: controldata.c:656 #, c-format msgid "old and new pg_controldata block sizes are invalid or do not match\n" msgstr "gamla och nya pg_controldata-blockstorlekar är ogiltiga eller matchar inte\n" -#: controldata.c:630 +#: controldata.c:659 #, c-format msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n" msgstr "gamla och nya pg_controldata maximala relationssegmentstorlekar är ogiltiga eller matchar inte\n" -#: controldata.c:633 +#: controldata.c:662 #, c-format msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n" msgstr "gamla och nya pg_controldata WAL-blockstorlekar är ogiltiga eller matchar inte\n" -#: controldata.c:636 +#: controldata.c:665 #, c-format msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n" msgstr "gamla och nya pg_controldata WAL-segmentstorlekar är ogiltiga eller matchar inte\n" -#: controldata.c:639 +#: controldata.c:668 #, c-format msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n" msgstr "gamla och nya pg_controldata maximal identifierarlängder är ogiltiga eller matchar inte\n" -#: controldata.c:642 +#: controldata.c:671 #, c-format msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n" msgstr "gamla och nya pg_controldata maxilmalt indexerade kolumner ogiltiga eller matchar inte\n" -#: controldata.c:645 +#: controldata.c:674 #, c-format msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n" msgstr "gamla och nya pg_controldata maximal TOAST-chunkstorlek ogiltiga eller matchar inte\n" -#: controldata.c:650 +#: controldata.c:679 #, c-format msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n" msgstr "gamla och nya pg_controldata stora-objekt-chunkstorlekar är ogiltiga eller matchar inte\n" -#: controldata.c:653 +#: controldata.c:682 #, c-format msgid "old and new pg_controldata date/time storage types do not match\n" msgstr "gamla och nya pg_controldata datum/tid-lagringstyper matchar inte\n" -#: controldata.c:666 +#: controldata.c:695 #, c-format msgid "old cluster does not use data checksums but the new one does\n" msgstr "gamla klustret använder inte datachecksummor men nya gör det\n" -#: controldata.c:669 +#: controldata.c:698 #, c-format msgid "old cluster uses data checksums but the new one does not\n" msgstr "gamla klustret använder datachecksummor men nya gör inte det\n" -#: controldata.c:671 +#: controldata.c:700 #, c-format msgid "old and new cluster pg_controldata checksum versions do not match\n" msgstr "gamla och nya klustrets pg_controldata checksumversioner matchar inte\n" -#: controldata.c:682 +#: controldata.c:711 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "Lägger till \".old\"-suffix till gamla global/pg_control" -#: controldata.c:687 +#: controldata.c:716 #, c-format msgid "Unable to rename %s to %s.\n" msgstr "Kan inte byta namn på %s till %s.\n" -#: controldata.c:690 +#: controldata.c:719 #, c-format msgid "" "\n" @@ -651,37 +745,32 @@ msgstr "" msgid "Creating dump of global objects" msgstr "Skapar dump med globala objekt" -#: dump.c:31 -#, c-format -msgid "Creating dump of database schemas\n" -msgstr "Skapar dump med databasscheman\n" - -#: exec.c:44 +#: exec.c:45 #, c-format msgid "could not get pg_ctl version data using %s: %s\n" msgstr "kunde inte hämta pg_ctl versionsdata med %s: %s\n" -#: exec.c:50 +#: exec.c:51 #, c-format msgid "could not get pg_ctl version output from %s\n" msgstr "kunde inte läsa versionutdata för pg_ctl från %s\n" -#: exec.c:104 exec.c:108 +#: exec.c:108 exec.c:112 #, c-format msgid "command too long\n" msgstr "kommandot för långt\n" -#: exec.c:110 util.c:37 util.c:225 +#: exec.c:114 util.c:37 util.c:264 #, c-format msgid "%s\n" msgstr "%s\n" -#: exec.c:149 option.c:217 +#: exec.c:153 pg_upgrade.c:242 #, c-format msgid "could not open log file \"%s\": %m\n" msgstr "kunde inte öppna loggfil \"%s\": %m\n" -#: exec.c:178 +#: exec.c:182 #, c-format msgid "" "\n" @@ -690,12 +779,12 @@ msgstr "" "\n" "*misslyckande*" -#: exec.c:181 +#: exec.c:185 #, c-format msgid "There were problems executing \"%s\"\n" msgstr "Det var problem med att köra \"%s\"\n" -#: exec.c:184 +#: exec.c:188 #, c-format msgid "" "Consult the last few lines of \"%s\" or \"%s\" for\n" @@ -704,7 +793,7 @@ msgstr "" "Se de sista raderna i \"%s\" eller \"%s\" för\n" "en trolig orsak till misslyckandet.\n" -#: exec.c:189 +#: exec.c:193 #, c-format msgid "" "Consult the last few lines of \"%s\" for\n" @@ -713,46 +802,51 @@ msgstr "" "Se de sista raderna i \"%s\" för\n" "en trolig orsak till misslyckandet.\n" -#: exec.c:204 option.c:226 +#: exec.c:208 pg_upgrade.c:250 #, c-format msgid "could not write to log file \"%s\": %m\n" msgstr "kunde inte skriva till loggfil \"%s\": %m\n" -#: exec.c:230 +#: exec.c:234 #, c-format msgid "could not open file \"%s\" for reading: %s\n" msgstr "kunde inte öppna fil \"%s\" för läsning: %s\n" -#: exec.c:257 +#: exec.c:261 #, c-format msgid "You must have read and write access in the current directory.\n" msgstr "Du måste ha läs och skrivrättigheter till den aktuella katalogen.\n" -#: exec.c:310 exec.c:372 exec.c:436 +#: exec.c:314 exec.c:380 #, c-format msgid "check for \"%s\" failed: %s\n" msgstr "kontroll av \"%s\" misslyckades: %s\n" -#: exec.c:313 exec.c:375 +#: exec.c:317 exec.c:383 #, c-format msgid "\"%s\" is not a directory\n" msgstr "\"%s\" är inte en katalog\n" -#: exec.c:439 +#: exec.c:433 #, c-format msgid "check for \"%s\" failed: not a regular file\n" msgstr "kontroll av \"%s\" misslyckades: inte en vanlig fil\n" -#: exec.c:451 -#, c-format -msgid "check for \"%s\" failed: cannot read file (permission denied)\n" -msgstr "kontroll av \"%s\" misslyckades: kan inte läsa filen (rättighet saknas)\n" - -#: exec.c:459 +#: exec.c:436 #, c-format msgid "check for \"%s\" failed: cannot execute (permission denied)\n" msgstr "kontroll av \"%s\" misslyckades: kan inte exekvera (rättighet saknas)\n" +#: exec.c:442 +#, c-format +msgid "check for \"%s\" failed: cannot execute\n" +msgstr "kontroll av \"%s\" misslyckades: kan inte exekvera\n" + +#: exec.c:452 +#, c-format +msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n" +msgstr "kontroll av \"%s\" misslyckades: hittade felaktig version \"%s\", förväntade \"%s\"\n" + #: file.c:43 file.c:61 #, c-format msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" @@ -832,73 +926,22 @@ msgstr "" "kunde inte skapa hård länk mellan gamla och nya datakatalogerna: %s\n" "I länk-läge måste gamla och nya datakatalogerna vara i samma filsystem.\n" -#: function.c:114 -#, c-format -msgid "" -"\n" -"The old cluster has a \"plpython_call_handler\" function defined\n" -"in the \"public\" schema which is a duplicate of the one defined\n" -"in the \"pg_catalog\" schema. You can confirm this by executing\n" -"in psql:\n" -"\n" -" \\df *.plpython_call_handler\n" -"\n" -"The \"public\" schema version of this function was created by a\n" -"pre-8.1 install of plpython, and must be removed for pg_upgrade\n" -"to complete because it references a now-obsolete \"plpython\"\n" -"shared object file. You can remove the \"public\" schema version\n" -"of this function by running the following command:\n" -"\n" -" DROP FUNCTION public.plpython_call_handler()\n" -"\n" -"in each affected database:\n" -"\n" -msgstr "" -"\n" -"Det gamla klustret har en \"plpython_call_handler\"-funktion definierad\n" -"i \"public\"-schemat vilket är en kopia på den som definierats\n" -"i \"pg_catalog\"-schemat. Du kan verifiera detta genom att i\n" -"psql köra:\n" -"\n" -" \\df *.plpython_call_handler\n" -"\n" -"\"public\"-schema-versionen av denna funktion har skapats av en\n" -"pre-8.1-installation av plpython och måste raderas för att pg_upgrade\n" -"skall kunna gå klart då den referar till en nu föråldrad\n" -"\"plpython\" delad objektfil. Du kan ta bort \"public\"-schemaversionen\n" -"av denna funktion genom att köra följande kommando:\n" -"\n" -" DROP FUNCTION public.plpython_call_handler()\n" -"\n" -"i varje inblandad databas:\n" -"\n" - -#: function.c:132 -#, c-format -msgid " %s\n" -msgstr " %s\n" - -#: function.c:142 -#, c-format -msgid "Remove the problem functions from the old cluster to continue.\n" -msgstr "Ta bort problemfunktionerna från gamla klustret för att fortsätta.\n" - -#: function.c:189 +#: function.c:129 #, c-format msgid "Checking for presence of required libraries" msgstr "Kontrollerar att krävda länkbibliotek finns" -#: function.c:242 +#: function.c:167 #, c-format msgid "could not load library \"%s\": %s" msgstr "kunde inte ladda länkbibliotek \"%s\": %s" -#: function.c:253 +#: function.c:178 #, c-format msgid "In database: %s\n" msgstr "I databas: %s\n" -#: function.c:263 +#: function.c:188 #, c-format msgid "" "Your installation references loadable libraries that are missing from the\n" @@ -915,66 +958,47 @@ msgstr "" " %s\n" "\n" -#: info.c:131 +#: info.c:125 #, c-format msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n" msgstr "Relationsname för OID %u i databas \"%s\" matchar inte: gammalt namn \"%s.%s\", nytt namn \"%s.%s\"\n" -#: info.c:151 +#: info.c:145 #, c-format msgid "Failed to match up old and new tables in database \"%s\"\n" msgstr "Misslyckades med att matcha ihop gamla och nya tabeller i databas \"%s\"\n" -#: info.c:240 +#: info.c:226 #, c-format msgid " which is an index on \"%s.%s\"" msgstr " vilket är ett index för \"%s.%s\"" -#: info.c:250 +#: info.c:236 #, c-format msgid " which is an index on OID %u" msgstr " vilket är ett index för OID %u" -#: info.c:262 +#: info.c:248 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr " vilket är TOAST-tabellen för \"%s.%s\"" -#: info.c:270 +#: info.c:256 #, c-format msgid " which is the TOAST table for OID %u" msgstr " vilket är TOAST-tabellen för OID %u" -#: info.c:274 +#: info.c:260 #, c-format msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n" msgstr "Ingen träff hittad i gamla klustret för ny relation med OID %u i databas \"%s\": %s\n" -#: info.c:277 +#: info.c:263 #, c-format msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n" msgstr "Ingen träff hittad i nya klustret för gammal relation med OID %u i databas \"%s\": %s\n" -#: info.c:289 -#, c-format -msgid "mappings for database \"%s\":\n" -msgstr "avbildningar för databasen \"%s\":\n" - -#: info.c:292 -#, c-format -msgid "%s.%s: %u to %u\n" -msgstr "%s.%s: %u till %u\n" - -#: info.c:297 info.c:633 -#, c-format -msgid "" -"\n" -"\n" -msgstr "" -"\n" -"\n" - -#: info.c:322 +#: info.c:287 #, c-format msgid "" "\n" @@ -983,7 +1007,7 @@ msgstr "" "\n" "källdatabaser:\n" -#: info.c:324 +#: info.c:289 #, c-format msgid "" "\n" @@ -992,78 +1016,87 @@ msgstr "" "\n" "måldatabaser:\n" -#: info.c:631 +#: info.c:605 #, c-format msgid "Database: %s\n" msgstr "Databas: %s\n" -#: info.c:644 +#: info.c:607 +#, c-format +msgid "" +"\n" +"\n" +msgstr "" +"\n" +"\n" + +#: info.c:618 #, c-format msgid "relname: %s.%s: reloid: %u reltblspace: %s\n" msgstr "relnamn: %s.%s: reloid: %u reltblutrymme: %s\n" -#: option.c:102 +#: option.c:100 #, c-format msgid "%s: cannot be run as root\n" msgstr "%s: kan inte köras som root\n" -#: option.c:170 +#: option.c:167 #, c-format msgid "invalid old port number\n" msgstr "ogiltigt gammalt portnummer\n" -#: option.c:175 +#: option.c:172 #, c-format msgid "invalid new port number\n" msgstr "ogiltigt nytt portnummer\n" -#: option.c:207 +#: option.c:198 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Försök med \"%s --help\" för mer information.\n" -#: option.c:214 +#: option.c:205 #, c-format msgid "too many command-line arguments (first is \"%s\")\n" msgstr "för många kommandoradsargument (första är \"%s\")\n" -#: option.c:220 +#: option.c:208 #, c-format msgid "Running in verbose mode\n" msgstr "Kör i utförligt läge\n" # FIXME: the source code need to be fixed here. it paste words together -#: option.c:251 +#: option.c:226 msgid "old cluster binaries reside" msgstr "gamla klusterbinärer är i" -#: option.c:253 +#: option.c:228 msgid "new cluster binaries reside" msgstr "nya klusterbinärer är i" -#: option.c:255 +#: option.c:230 msgid "old cluster data resides" msgstr "gamla klusterdatan är i" -#: option.c:257 +#: option.c:232 msgid "new cluster data resides" msgstr "nya klusterdatan är i" -#: option.c:259 +#: option.c:234 msgid "sockets will be created" msgstr "uttag kommer skapas" -#: option.c:276 option.c:374 +#: option.c:251 option.c:350 #, c-format msgid "could not determine current directory\n" msgstr "kunde inte bestämma aktuell katalog\n" -#: option.c:279 +#: option.c:254 #, c-format msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n" msgstr "kan inte köra pg_upgrade inifrån nya klusterdatakatalogen i Windows\n" -#: option.c:288 +#: option.c:263 #, c-format msgid "" "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n" @@ -1072,12 +1105,12 @@ msgstr "" "pg_upgrade uppgraderar ett PostgreSQL-kluster till en annan major-version.\n" "\n" -#: option.c:289 +#: option.c:264 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: option.c:290 +#: option.c:265 #, c-format msgid "" " pg_upgrade [OPTION]...\n" @@ -1086,17 +1119,17 @@ msgstr "" " pg_upgrade [FLAGGA]...\n" "\n" -#: option.c:291 +#: option.c:266 #, c-format msgid "Options:\n" msgstr "Flaggor:\n" -#: option.c:292 +#: option.c:267 #, c-format msgid " -b, --old-bindir=BINDIR old cluster executable directory\n" msgstr " -b, --old-bindir=BINKAT gamla klustrets katalog för körbara filer\n" -#: option.c:293 +#: option.c:268 #, c-format msgid "" " -B, --new-bindir=BINDIR new cluster executable directory (default\n" @@ -1105,87 +1138,92 @@ msgstr "" " -B, --new-bindir=BINKAT nya klustrets katalog för körbara filer\n" " (standard är samma som för pg_upgrade)\n" -#: option.c:295 +#: option.c:270 #, c-format msgid " -c, --check check clusters only, don't change any data\n" msgstr " -c, --check testa klustren bara, ändra ingen data\n" -#: option.c:296 +#: option.c:271 #, c-format msgid " -d, --old-datadir=DATADIR old cluster data directory\n" msgstr " -d, --old-datadir=DATAKAT gamla klustrets datakatalog\n" -#: option.c:297 +#: option.c:272 #, c-format msgid " -D, --new-datadir=DATADIR new cluster data directory\n" msgstr " -D, --new-datadir=DATAKAT nya klustrets datakatalog\n" -#: option.c:298 +#: option.c:273 #, c-format msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n" msgstr " -j, --jobs=NUM antal samtidiga processer eller trådar att använda\n" -#: option.c:299 +#: option.c:274 #, c-format msgid " -k, --link link instead of copying files to new cluster\n" msgstr " -k, --link länka istället för att kopiera filer till nya klustret\n" -#: option.c:300 +#: option.c:275 +#, c-format +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr " -N, --no-sync vänta inte på att ändingar säkert skrivits till disk\n" + +#: option.c:276 #, c-format msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n" msgstr " -o, --old-options=FLAGGOR serverflaggor för gamla klustret\n" -#: option.c:301 +#: option.c:277 #, c-format msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n" msgstr " -O, --new-options=FLAGGOR serverflaggor för nya klustret\n" -#: option.c:302 +#: option.c:278 #, c-format msgid " -p, --old-port=PORT old cluster port number (default %d)\n" msgstr " -p, --old-port=PORT gamla klustrets portnummer (standard %d)\n" -#: option.c:303 +#: option.c:279 #, c-format msgid " -P, --new-port=PORT new cluster port number (default %d)\n" msgstr " -P, --new-port=PORT nya klustrets portnummer (standard %d)\n" -#: option.c:304 +#: option.c:280 #, c-format msgid " -r, --retain retain SQL and log files after success\n" msgstr " -r, --retain behåll SQL och loggfiler efter lyckad uppgradering\n" -#: option.c:305 +#: option.c:281 #, c-format msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" msgstr " -s, --socketdir=KAT uttagskatalog (standard är aktuell katalog.)\n" -#: option.c:306 +#: option.c:282 #, c-format msgid " -U, --username=NAME cluster superuser (default \"%s\")\n" -msgstr " -U, --username=NAMN klustrets superanvändare (standard \"%s\")\n" +msgstr " -U, --username=NAMN klustrets superuser (standard \"%s\")\n" -#: option.c:307 +#: option.c:283 #, c-format msgid " -v, --verbose enable verbose internal logging\n" msgstr " -v, --verbose slå på utförligt intern loggning\n" -#: option.c:308 +#: option.c:284 #, c-format msgid " -V, --version display version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: option.c:309 +#: option.c:285 #, c-format msgid " --clone clone instead of copying files to new cluster\n" msgstr " -clone klona istället för att kopiera filer till nya klustret\n" -#: option.c:310 +#: option.c:286 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denns hjälp, avsluta sedan\n" -#: option.c:311 +#: option.c:287 #, c-format msgid "" "\n" @@ -1200,7 +1238,7 @@ msgstr "" " stänga ner den postmaster som hanterar gamla klustret\n" " stänga ner den postmaster som hanterar nya klustret\n" -#: option.c:316 +#: option.c:292 #, c-format msgid "" "\n" @@ -1217,7 +1255,7 @@ msgstr "" " \"bin\"-katalogen för gamla versionen (-b BINKAT)\n" " \"bin\"-katalogen för nya versionen (-B BINKAT)\n" -#: option.c:322 +#: option.c:298 #, c-format msgid "" "\n" @@ -1230,7 +1268,7 @@ msgstr "" " pg_upgrade -d gammaltKluster/data -D nyttKluster/data -b gammaltKluster/bin -B nyttKluster/bin\n" "eller\n" -#: option.c:327 +#: option.c:303 #, c-format msgid "" " $ export PGDATAOLD=oldCluster/data\n" @@ -1245,7 +1283,7 @@ msgstr "" " $ export PGBINNEW=nyttKluster/bin\n" " $ pg_upgrade\n" -#: option.c:333 +#: option.c:309 #, c-format msgid "" " C:\\> set PGDATAOLD=oldCluster/data\n" @@ -1260,7 +1298,7 @@ msgstr "" " C:\\> set PGBINNEW=nyttKluster/bin\n" " C:\\> pg_upgrade\n" -#: option.c:339 +#: option.c:315 #, c-format msgid "" "\n" @@ -1269,12 +1307,12 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: option.c:340 +#: option.c:316 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: option.c:380 +#: option.c:356 #, c-format msgid "" "You must identify the directory where the %s.\n" @@ -1283,27 +1321,27 @@ msgstr "" "Du måste identifiera katalogen där %s.\n" "Använd kommandoradsflaggan %s eller omgivningsvariabeln %s.\n" -#: option.c:432 +#: option.c:408 #, c-format msgid "Finding the real data directory for the source cluster" msgstr "Letar efter den riktiga datakatalogen i källklustret" -#: option.c:434 +#: option.c:410 #, c-format msgid "Finding the real data directory for the target cluster" msgstr "Letar efter den riktiga datakatalogen för målklustret" -#: option.c:446 +#: option.c:422 #, c-format msgid "could not get data directory using %s: %s\n" msgstr "kunde inte hämta datakatalogen med %s: %s\n" -#: option.c:505 +#: option.c:473 #, c-format msgid "could not read line %d from file \"%s\": %s\n" msgstr "kunde inte läsa rad %d från fil \"%s\": %s\n" -#: option.c:522 +#: option.c:490 #, c-format msgid "user-supplied old port number %hu corrected to %hu\n" msgstr "användarangivet gammalt portnummer %hu korrigerat till %hu\n" @@ -1320,8 +1358,8 @@ msgstr "kunde inte skapa arbetstråd: %s\n" #: parallel.c:300 #, c-format -msgid "waitpid() failed: %s\n" -msgstr "waitpid() misslyckades: %s\n" +msgid "%s() failed: %s\n" +msgstr "%s() misslyckades: %s\n" #: parallel.c:304 #, c-format @@ -1333,12 +1371,12 @@ msgstr "barnprocess avslutade felaktigt: status %d\n" msgid "child worker exited abnormally: %s\n" msgstr "barnprocess avslutade felaktigt: %s\n" -#: pg_upgrade.c:108 +#: pg_upgrade.c:103 #, c-format msgid "could not read permissions of directory \"%s\": %s\n" msgstr "kunde inte läsa rättigheter på katalog \"%s\": %s\n" -#: pg_upgrade.c:123 +#: pg_upgrade.c:135 #, c-format msgid "" "\n" @@ -1349,17 +1387,17 @@ msgstr "" "Utför uppgradering\n" "------------------\n" -#: pg_upgrade.c:166 +#: pg_upgrade.c:178 #, c-format msgid "Setting next OID for new cluster" msgstr "Sätter nästa OID för nya klustret" -#: pg_upgrade.c:173 +#: pg_upgrade.c:187 #, c-format msgid "Sync data directory to disk" msgstr "Synkar datakatalog till disk" -#: pg_upgrade.c:185 +#: pg_upgrade.c:199 #, c-format msgid "" "\n" @@ -1370,12 +1408,17 @@ msgstr "" "Uppgradering klar\n" "-----------------\n" -#: pg_upgrade.c:220 +#: pg_upgrade.c:233 pg_upgrade.c:235 pg_upgrade.c:237 +#, c-format +msgid "could not create directory \"%s\": %m\n" +msgstr "kunde inte skapa katalog \"%s\": %m\n" + +#: pg_upgrade.c:282 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: kunde inte hitta det egna programmets körbara fil\n" -#: pg_upgrade.c:246 +#: pg_upgrade.c:308 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" @@ -1384,7 +1427,7 @@ msgstr "" "Det verkar vara en postmaster igång som hanterar gamla klustret.\n" "Stänga ner den postmastern och försök igen.\n" -#: pg_upgrade.c:259 +#: pg_upgrade.c:321 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" @@ -1393,132 +1436,112 @@ msgstr "" "Det verkar vara en postmaster igång som hanterar nya klustret.\n" "Stänga ner den postmastern och försök igen.\n" -#: pg_upgrade.c:273 +#: pg_upgrade.c:335 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Analyserar alla rader i nya klustret" -#: pg_upgrade.c:286 +#: pg_upgrade.c:348 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Fryser alla rader i nya klustret" -#: pg_upgrade.c:306 +#: pg_upgrade.c:368 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Återställer globala objekt i nya klustret" -#: pg_upgrade.c:321 -#, c-format -msgid "Restoring database schemas in the new cluster\n" -msgstr "Återställer databasscheman i nya klustret\n" - -#: pg_upgrade.c:425 +#: pg_upgrade.c:490 #, c-format msgid "Deleting files from new %s" msgstr "Raderar filer från ny %s" -#: pg_upgrade.c:429 +#: pg_upgrade.c:494 #, c-format msgid "could not delete directory \"%s\"\n" msgstr "kunde inte ta bort katalog \"%s\"\n" -#: pg_upgrade.c:448 +#: pg_upgrade.c:513 #, c-format msgid "Copying old %s to new server" msgstr "Kopierar gammal %s till ny server" -#: pg_upgrade.c:475 +#: pg_upgrade.c:539 +#, c-format +msgid "Setting oldest XID for new cluster" +msgstr "Sätter äldsta XID för nya klustret" + +#: pg_upgrade.c:547 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "Sätter nästa transaktions-ID och epoch för nytt kluster" -#: pg_upgrade.c:505 +#: pg_upgrade.c:577 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "Sätter nästa multixact-ID och offset för nytt kluster" -#: pg_upgrade.c:529 +#: pg_upgrade.c:601 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Sätter äldsta multixact-ID i nytt kluster" -#: pg_upgrade.c:549 +#: pg_upgrade.c:621 #, c-format msgid "Resetting WAL archives" msgstr "Resettar WAL-arkiv" -#: pg_upgrade.c:592 +#: pg_upgrade.c:664 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Sätter räknarna frozenxid och minmxid för nytt kluster" -#: pg_upgrade.c:594 +#: pg_upgrade.c:666 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Sätter räknarenm minmxid för nytt kluster" -#: relfilenode.c:35 -#, c-format -msgid "Cloning user relation files\n" -msgstr "Klonar användares relationsfiler\n" - -#: relfilenode.c:38 -#, c-format -msgid "Copying user relation files\n" -msgstr "Kopierar användares relationsfiler\n" - -#: relfilenode.c:41 -#, c-format -msgid "Linking user relation files\n" -msgstr "Länkar användares relationsfiler\n" - #: relfilenode.c:115 #, c-format msgid "old database \"%s\" not found in the new cluster\n" msgstr "gamla databasen \"%s\" kan inte hittas i nya klustret\n" -#: relfilenode.c:230 +#: relfilenode.c:218 #, c-format msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n" msgstr "fel vid kontroll av filexistens \"%s.%s\" (\"%s\" till \"%s\"): %s\n" -#: relfilenode.c:248 +#: relfilenode.c:236 #, c-format msgid "rewriting \"%s\" to \"%s\"\n" msgstr "skriver om \"%s\" till \"%s\"\n" -#: relfilenode.c:256 +#: relfilenode.c:244 #, c-format msgid "cloning \"%s\" to \"%s\"\n" msgstr "klonar \"%s\" till \"%s\"\n" -#: relfilenode.c:261 +#: relfilenode.c:249 #, c-format msgid "copying \"%s\" to \"%s\"\n" msgstr "kopierar \"%s\" till \"%s\"\n" -#: relfilenode.c:266 +#: relfilenode.c:254 #, c-format msgid "linking \"%s\" to \"%s\"\n" msgstr "länkar \"%s\" till \"%s\"\n" -#: server.c:33 -#, c-format -msgid "connection to database failed: %s" -msgstr "anslutning till databas misslyckades: %s" - -#: server.c:39 server.c:141 util.c:135 util.c:165 +#: server.c:39 server.c:143 util.c:174 util.c:204 #, c-format msgid "Failure, exiting\n" msgstr "Misslyckades, avslutar\n" -#: server.c:131 +#: server.c:133 #, c-format msgid "executing: %s\n" msgstr "kör: %s\n" -#: server.c:137 +#: server.c:139 #, c-format msgid "" "SQL command failed\n" @@ -1529,26 +1552,26 @@ msgstr "" "%s\n" "%s" -#: server.c:167 +#: server.c:169 #, c-format msgid "could not open version file \"%s\": %m\n" msgstr "kunde inte öppna versionsfil \"%s\": %m\n" -#: server.c:171 +#: server.c:173 #, c-format msgid "could not parse version file \"%s\"\n" msgstr "kunde inte tolka versionsfil \"%s\"\n" -#: server.c:297 +#: server.c:291 #, c-format msgid "" "\n" -"connection to database failed: %s" +"%s" msgstr "" "\n" -"anslutning till databas misslyckades: %s" +"%s" -#: server.c:302 +#: server.c:295 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -1557,7 +1580,7 @@ msgstr "" "kunde inte ansluta till käll-postmaster som startats med kommandot:\n" "%s\n" -#: server.c:306 +#: server.c:299 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -1566,22 +1589,22 @@ msgstr "" "kunde inte ansluta till mål-postmaster som startats med kommandot:\n" "%s\n" -#: server.c:320 +#: server.c:313 #, c-format msgid "pg_ctl failed to start the source server, or connection failed\n" msgstr "pg_ctl misslyckades att start källservern eller så misslyckades anslutningen\n" -#: server.c:322 +#: server.c:315 #, c-format msgid "pg_ctl failed to start the target server, or connection failed\n" msgstr "pg_ctl misslyckades att start målservern eller så misslyckades anslutningen\n" -#: server.c:367 +#: server.c:360 #, c-format msgid "out of memory\n" msgstr "slut på minne\n" -#: server.c:380 +#: server.c:373 #, c-format msgid "libpq environment variable %s has a non-local server value: %s\n" msgstr "libpq:s omgivningsvariabel %s har ett icke-lokalt servervärde: %s\n" @@ -1595,137 +1618,97 @@ msgstr "" "Kan inte uppgradera till/från samma systemkatalogversion när\n" "man använder tablespace.\n" -#: tablespace.c:86 +#: tablespace.c:83 #, c-format msgid "tablespace directory \"%s\" does not exist\n" msgstr "tablespace-katalogen \"%s\" finns inte\n" -#: tablespace.c:90 +#: tablespace.c:87 #, c-format msgid "could not stat tablespace directory \"%s\": %s\n" msgstr "kunde inte göra stat på tablespace-katalog \"%s\": %s\n" -#: tablespace.c:95 +#: tablespace.c:92 #, c-format msgid "tablespace path \"%s\" is not a directory\n" msgstr "tablespace-sökväg \"%s\" är inte en katalog\n" -#: util.c:49 -#, c-format -msgid " " -msgstr " " - -#: util.c:82 +#: util.c:52 util.c:82 util.c:115 #, c-format msgid "%-*s" msgstr "%-*s" -#: util.c:174 -#, c-format -msgid "ok" -msgstr "ok" - -#: version.c:29 -#, c-format -msgid "Checking for large objects" -msgstr "Letar efter stora objekt" - -#: version.c:77 version.c:384 +#: util.c:113 #, c-format -msgid "warning" -msgstr "varning" +msgid "%-*s\n" +msgstr "%-*s\n" -#: version.c:79 +#: util.c:213 #, c-format -msgid "" -"\n" -"Your installation contains large objects. The new database has an\n" -"additional large object permission table. After upgrading, you will be\n" -"given a command to populate the pg_largeobject_metadata table with\n" -"default permissions.\n" -"\n" -msgstr "" -"\n" -"Din installation innehåller stora objekt. Den nya databasen\n" -"har en extra rättighetstabell för stora objekt. Efter uppgradering\n" -"kommer du ges ett kommando för att populera rättighetstabellen\n" -"pg_largeobject_metadata med standardrättigheter.\n" -"\n" - -#: version.c:85 -#, c-format -msgid "" -"\n" -"Your installation contains large objects. The new database has an\n" -"additional large object permission table, so default permissions must be\n" -"defined for all large objects. The file\n" -" %s\n" -"when executed by psql by the database superuser will set the default\n" -"permissions.\n" -"\n" -msgstr "" -"\n" -"Din installation innehåller stora objekt. Den nya databasen har en extra\n" -"rättighetstabell för stora onbjekt så standardrättigheter måste ges för\n" -"alla stora objekt. Filen\n" -" %s\n" -"kan köras med psql av databasens superanvändare för att sätta\n" -"standardrättigheter.\n" -"\n" +msgid "ok" +msgstr "ok" # FIXME: is this msgid correct? -#: version.c:239 +#: version.c:184 #, c-format msgid "Checking for incompatible \"line\" data type" msgstr "Letar efter inkompatibel \"line\"-datatyp" -#: version.c:246 +#: version.c:191 #, c-format msgid "" -"Your installation contains the \"line\" data type in user tables. This\n" -"data type changed its internal and input/output format between your old\n" -"and new clusters so this cluster cannot currently be upgraded. You can\n" -"remove the problem tables and restart the upgrade. A list of the problem\n" -"columns is in the file:\n" +"Your installation contains the \"line\" data type in user tables.\n" +"This data type changed its internal and input/output format\n" +"between your old and new versions so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" "Din installation innehåller datatypen \"line\" i användartabeller. Denna\n" -"datatype har ändrat sitt interna format samt sitt in/ut-format mellan ditt\n" -"gamla och nya kluster så detta kluster kan för närvarande inte uppgraderas.\n" -"Du kan radera problemtabellerna och återstarta uppgraderingen. En lista\n" -"med problemkolumner finns i filen:\n" +"datatype har ändrat sitt interna format samt sitt in/ut-format mellan din\n" +"gamla och nya version så detta kluster kan för närvarande inte uppgraderas.\n" +"Du kan radera problemkolumnerna och återstarta uppgraderingen.\n" +"En lista med problemkolumner finns i filen:\n" " %s\n" "\n" -#: version.c:276 +#: version.c:222 #, c-format msgid "Checking for invalid \"unknown\" user columns" msgstr "Letar efter ogiltiga användarkolumner av typen \"unknown\"" -#: version.c:283 +#: version.c:229 #, c-format msgid "" -"Your installation contains the \"unknown\" data type in user tables. This\n" -"data type is no longer allowed in tables, so this cluster cannot currently\n" -"be upgraded. You can remove the problem tables and restart the upgrade.\n" +"Your installation contains the \"unknown\" data type in user tables.\n" +"This data type is no longer allowed in tables, so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" "A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" -"Din installation innehåller användartabeller med datatypen \"unknown\".\n" -"Denna typ tillåts inte längre i tabeller så detta kluster kan\n" -"för närvarande inte uppgraderas. Du kan radera problemtabellerna och\n" -"återstarta uppgraderingen. En lista med problemkolumnerna finns i filen:\n" +"Din installation innehåller datatypen \"unknown\" i användartabeller.\n" +"Denna datatyp tillåts inte längre i tabeller så detta kluster kan\n" +"för närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n" +"återstarta uppgraderingen.\n" +"En lista med problemkolumner finns i filen:\n" " %s\n" "\n" -#: version.c:306 +#: version.c:253 #, c-format msgid "Checking for hash indexes" msgstr "Letar efter hash-index" -#: version.c:386 +#: version.c:331 +#, c-format +msgid "warning" +msgstr "varning" + +#: version.c:333 #, c-format msgid "" "\n" @@ -1742,7 +1725,7 @@ msgstr "" "REINDEX-instruktioner.\n" "\n" -#: version.c:392 +#: version.c:339 #, c-format msgid "" "\n" @@ -1759,41 +1742,59 @@ msgstr "" "format i ditt gamla och nya kluster så de måste omindexeras med\n" "kommandot REINDEX. Filen\n" " %s\n" -"kan köras med psql av databasens superanvändare och kommer återskapa\n" -"alla ogiltiga index; innan dess så kommer inget av dess index användas.\n" +"kan köras med psql av databasens superuser och kommer återskapa alla\n" +"ogiltiga index; innan dess så kommer inget av dess index användas.\n" "\n" -#: version.c:418 +#: version.c:365 #, c-format msgid "Checking for invalid \"sql_identifier\" user columns" msgstr "Letar efter ogiltiga användarkolumner av typen \"sql_identifier\"" -#: version.c:426 +#: version.c:373 #, c-format msgid "" -"Your installation contains the \"sql_identifier\" data type in user tables\n" -"and/or indexes. The on-disk format for this data type has changed, so this\n" -"cluster cannot currently be upgraded. You can remove the problem tables or\n" -"change the data type to \"name\" and restart the upgrade.\n" +"Your installation contains the \"sql_identifier\" data type in user tables.\n" +"The on-disk format for this data type has changed, so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" "A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" -"Din installation innehåller användartabeller och/eller index med\n" -"med datatypen \"sql_identifier\". Formatet på disk för denna datatyp\n" -"har ändrats så detta kluster kan för närvarande inte uppgraderas.\n" -"Du kan radera problemtabellerna eller ändra datatypen till \"name\"\n" -"och återstarta uppgraderingen. En lista med problemkolumnerna finns\n" -"i filen:\n" +"Din installation innehåller datatypen \"sql_identifier\" i användartabeller.\n" +"Formatet på disk för denna datatyp har ändrats så detta kluster kan för\n" +"närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n" +"återstarta uppgraderingen.\n" +"En lista med problemkolumner finns i filen:\n" " %s\n" "\n" -#~ msgid "" -#~ "Optimizer statistics and free space information are not transferred\n" -#~ "by pg_upgrade so, once you start the new server, consider running:\n" -#~ " %s\n" -#~ "\n" -#~ msgstr "" -#~ "Optimeringsstatistik och information om ledigt utrymme överförs\n" -#~ "inte av pg_upgrade så när du startar nya servern så vill du nog köra:\n" -#~ " %s\n" +#: version.c:397 +#, c-format +msgid "Checking for extension updates" +msgstr "Letar efter uppdatering av utökningar" + +#: version.c:449 +#, c-format +msgid "notice" +msgstr "notis" + +#: version.c:450 +#, c-format +msgid "" +"\n" +"Your installation contains extensions that should be updated\n" +"with the ALTER EXTENSION command. The file\n" +" %s\n" +"when executed by psql by the database superuser will update\n" +"these extensions.\n" +"\n" +msgstr "" +"\n" +"Din installation innehåller utökningar som skall updateras med kommandot\n" +"ALTER EXTENSION. Filen\n" +" %s\n" +"kan köras med psql av databasens superuser och kommer uppdatera\n" +"dessa utökningar.\n" + diff --git a/src/bin/pg_upgrade/po/uk.po b/src/bin/pg_upgrade/po/uk.po index 75d7600ccf..dc300e50bc 100644 --- a/src/bin/pg_upgrade/po/uk.po +++ b/src/bin/pg_upgrade/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:15+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" +"POT-Creation-Date: 2021-08-17 08:46+0000\n" +"PO-Revision-Date: 2021-08-17 11:18\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,31 +14,31 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/pg_upgrade.pot\n" -"X-Crowdin-File-ID: 510\n" +"X-Crowdin-File: /REL_14_DEV/pg_upgrade.pot\n" +"X-Crowdin-File-ID: 778\n" -#: check.c:66 +#: check.c:70 #, c-format msgid "Performing Consistency Checks on Old Live Server\n" "------------------------------------------------\n" msgstr "Перевірка цілістності на старому працюючому сервері\n" "------------------------------------------------\n" -#: check.c:72 +#: check.c:76 #, c-format msgid "Performing Consistency Checks\n" "-----------------------------\n" msgstr "Проведення перевірок цілістності\n" "-----------------------------\n" -#: check.c:190 +#: check.c:213 #, c-format msgid "\n" "*Clusters are compatible*\n" msgstr "\n" "*Кластери сумісні*\n" -#: check.c:196 +#: check.c:219 #, c-format msgid "\n" "If pg_upgrade fails after this point, you must re-initdb the\n" @@ -47,32 +47,23 @@ msgstr "\n" "Якщо робота pg_upgrade після цієї точки перерветься, вам потрібно буде заново виконати initdb \n" "для нового кластера, перед продовженням.\n" -#: check.c:232 +#: check.c:264 #, c-format -msgid "Optimizer statistics are not transferred by pg_upgrade so,\n" -"once you start the new server, consider running:\n" -" %s\n\n" -msgstr "Статистика оптимізатора не переноситься за допомогою pg_upgrade, тож\n" -"запустивши новий сервер, має сенс виконати:\n" -" %s\n\n" - -#: check.c:237 -#, c-format -msgid "Optimizer statistics and free space information are not transferred\n" -"by pg_upgrade so, once you start the new server, consider running:\n" -" %s\n\n" -msgstr "Статистика оптимізатора і інформація про вільне місце не переноситься за допомогою pg_upgrade, тож\n" -"запустивши новий сервер, має сенс виконати:\n" -" %s\n\n" +msgid "Optimizer statistics are not transferred by pg_upgrade.\n" +"Once you start the new server, consider running:\n" +" %s/vacuumdb %s--all --analyze-in-stages\n\n" +msgstr "Статистика оптимізатора не передається за допомогою pg_upgrade.\n" +"Після запуску нового серверу, розгляньте можливість запуску:\n" +" %s/vacuumdb %s--all --analyze-in-stages\n\n" -#: check.c:244 +#: check.c:270 #, c-format msgid "Running this script will delete the old cluster's data files:\n" " %s\n" msgstr "При запуску цього скрипту файли даних старого кластера будуть видалені:\n" " %s\n" -#: check.c:249 +#: check.c:275 #, c-format msgid "Could not create a script to delete the old cluster's data files\n" "because user-defined tablespaces or the new cluster's data directory\n" @@ -83,164 +74,169 @@ msgstr "Не вдалося створити скрипт для видален "простори або каталог даних нового кластера. Вміст старого кластера\n" "треба буде видалити вручну.\n" -#: check.c:259 +#: check.c:287 #, c-format msgid "Checking cluster versions" msgstr "Перевірка версій кластерів" -#: check.c:271 +#: check.c:299 #, c-format msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n" msgstr "Ця утиліта може виконувати оновлення тільки з версії PostgreSQL 8.4 і новіше.\n" -#: check.c:275 +#: check.c:303 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s.\n" msgstr "Ця утиліта може тільки підвищувати версію PostgreSQL до %s.\n" -#: check.c:284 +#: check.c:312 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n" msgstr "Ця утиліта не може не може використовуватись щоб понижувати версію до більш старих основних версій PostgreSQL.\n" -#: check.c:289 +#: check.c:317 #, c-format msgid "Old cluster data and binary directories are from different major versions.\n" msgstr "Каталог даних і двійковий каталог старого кластера з різних основних версій.\n" -#: check.c:292 +#: check.c:320 #, c-format msgid "New cluster data and binary directories are from different major versions.\n" msgstr "Каталог даних і двійковий каталог нового кластера з різних основних версій.\n" -#: check.c:309 +#: check.c:337 #, c-format msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n" msgstr "Для перевірки старого працюючого сервера до версії 9.1, вам необхідно вказати номер порта цього сервера.\n" -#: check.c:313 +#: check.c:341 #, c-format msgid "When checking a live server, the old and new port numbers must be different.\n" msgstr "Для перевірки працюючого сервера, старий і новий номер порта повинні бути різними.\n" -#: check.c:328 +#: check.c:356 #, c-format msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "кодування для бази даних \"%s\" не збігаються: старе \"%s\", нове \"%s\"\n" -#: check.c:333 +#: check.c:361 #, c-format msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "значення lc_collate для бази даних \"%s\" не збігаються: старе \"%s\", нове \"%s\"\n" -#: check.c:336 +#: check.c:364 #, c-format msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "значення lc_ctype для бази даних \"%s\" не збігаються: старе \"%s\", нове \"%s\"\n" -#: check.c:409 +#: check.c:437 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" msgstr "Новий кластер бази даних \"%s\" не порожній: знайдено відношення \"%s.%s\"\n" -#: check.c:458 +#: check.c:494 #, c-format -msgid "Creating script to analyze new cluster" -msgstr "Створення скрипту для аналізу нового кластеру" +msgid "Checking for new cluster tablespace directories" +msgstr "Перевірка каталогів табличних просторів кластера" -#: check.c:472 check.c:600 check.c:864 check.c:943 check.c:1053 check.c:1144 -#: file.c:336 function.c:240 option.c:497 version.c:54 version.c:199 -#: version.c:341 +#: check.c:505 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "не вдалося відкрити файл \"%s\": %s\n" +msgid "new cluster tablespace directory already exists: \"%s\"\n" +msgstr "каталог нового кластерного табличного простору вже існує: \"%s\"\n" -#: check.c:527 check.c:656 -#, c-format -msgid "could not add execute permission to file \"%s\": %s\n" -msgstr "не вдалося додати право виконання для файлу \"%s\": %s\n" - -#: check.c:563 +#: check.c:538 #, c-format msgid "\n" "WARNING: new data directory should not be inside the old data directory, e.g. %s\n" msgstr "\n" "ПОПЕРЕДЖЕННЯ: новий каталог даних не повинен бути всередині старого каталогу даних, наприклад %s\n" -#: check.c:587 +#: check.c:562 #, c-format msgid "\n" "WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n" msgstr "\n" "ПОПЕРЕДЖЕННЯ: користувацькі розташування табличних просторів не повинні бути всередині каталогу даних, наприклад %s\n" -#: check.c:597 +#: check.c:572 #, c-format msgid "Creating script to delete old cluster" msgstr "Створення скрипту для видалення старого кластеру" -#: check.c:676 +#: check.c:575 check.c:839 check.c:937 check.c:1016 check.c:1278 file.c:336 +#: function.c:240 option.c:497 version.c:54 version.c:204 version.c:376 +#: version.c:511 +#, c-format +msgid "could not open file \"%s\": %s\n" +msgstr "не вдалося відкрити файл \"%s\": %s\n" + +#: check.c:631 +#, c-format +msgid "could not add execute permission to file \"%s\": %s\n" +msgstr "не вдалося додати право виконання для файлу \"%s\": %s\n" + +#: check.c:651 #, c-format msgid "Checking database user is the install user" msgstr "Перевірка, чи є користувач бази даних стартовим користувачем" -#: check.c:692 +#: check.c:667 #, c-format msgid "database user \"%s\" is not the install user\n" msgstr "користувач бази даних \"%s\" не є стартовим користувачем\n" -#: check.c:703 +#: check.c:678 #, c-format msgid "could not determine the number of users\n" msgstr "не вдалося визначити кількість користувачів\n" -#: check.c:711 +#: check.c:686 #, c-format msgid "Only the install user can be defined in the new cluster.\n" msgstr "В новому кластері може бути визначеним тільки стартовий користувач.\n" -#: check.c:731 +#: check.c:706 #, c-format msgid "Checking database connection settings" msgstr "Перевірка параметрів підключення до бази даних" -#: check.c:753 +#: check.c:728 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n" msgstr "template0 не повинна дозволяти підключення, тобто pg_database.datallowconn повинно бути false\n" -#: check.c:763 +#: check.c:738 #, c-format msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n" msgstr "Всі бази даних, окрім template0, повинні дозволяти підключення, тобто pg_database.datallowconn повинно бути true\n" -#: check.c:788 +#: check.c:763 #, c-format msgid "Checking for prepared transactions" msgstr "Перевірка підготовлених транзакцій" -#: check.c:797 +#: check.c:772 #, c-format msgid "The source cluster contains prepared transactions\n" msgstr "Початковий кластер містить підготовлені транзакції\n" -#: check.c:799 +#: check.c:774 #, c-format msgid "The target cluster contains prepared transactions\n" msgstr "Цільовий кластер містить підготовлені транзакції\n" -#: check.c:825 +#: check.c:800 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Перевірка невідповідності при передаванні bigint в contrib/isn" -#: check.c:886 check.c:965 check.c:1076 check.c:1167 function.c:262 -#: version.c:245 version.c:282 version.c:425 +#: check.c:861 check.c:962 check.c:1038 check.c:1095 check.c:1154 check.c:1183 +#: check.c:1301 function.c:262 version.c:278 version.c:316 version.c:460 #, c-format msgid "fatal\n" msgstr "збій\n" -#: check.c:887 +#: check.c:862 #, c-format msgid "Your installation contains \"contrib/isn\" functions which rely on the\n" "bigint data type. Your old and new clusters pass bigint values\n" @@ -252,12 +248,29 @@ msgid "Your installation contains \"contrib/isn\" functions which rely on the\n" msgstr "Ваша інсталяція містить функції \"contrib/isn\", що використовують тип даних bigint. Старі та нові кластери передають значення bigint по-різному, тому цей кластер наразі неможливо оновити. Ви можете вручну вивантажити бази даних зі старого кластеру, що використовує засоби \"contrib/isn\", видалити їх, виконати оновлення, а потім відновити їх. Список проблемних функцій подано у файлі:\n" " %s\n\n" -#: check.c:911 +#: check.c:885 +#, c-format +msgid "Checking for user-defined postfix operators" +msgstr "Перевірка постфіксних операторів визначених користувачем" + +#: check.c:963 +#, c-format +msgid "Your installation contains user-defined postfix operators, which are not\n" +"supported anymore. Consider dropping the postfix operators and replacing\n" +"them with prefix operators or function calls.\n" +"A list of user-defined postfix operators is in the file:\n" +" %s\n\n" +msgstr "Ваша інсталяція містить користувацькі постфіксні оператори, що більше не підтримуються.\n" +"Розгляньте можливість видалення постфіксних операторів та заміни їх на префіксні оператори або виклики функцій.\n" +"Список користувацьких постфіксних операторів знаходиться у файлі:\n" +" %s\n\n" + +#: check.c:984 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Перевірка таблиць WITH OIDS" -#: check.c:966 +#: check.c:1039 #, c-format msgid "Your installation contains tables declared WITH OIDS, which is not\n" "supported anymore. Consider removing the oid column using\n" @@ -269,313 +282,364 @@ msgstr "Ваша інсталяція містить таблиці, створ "Список проблемних таблиць подано у файлі:\n" " %s\n\n" -#: check.c:996 +#: check.c:1067 +#, c-format +msgid "Checking for system-defined composite types in user tables" +msgstr "Перевірка складених типів визначених системою у таблицях користувача" + +#: check.c:1096 +#, c-format +msgid "Your installation contains system-defined composite type(s) in user tables.\n" +"These type OIDs are not stable across PostgreSQL versions,\n" +"so this cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" +" %s\n\n" +msgstr "Ваша інсталяція містить складені типи визначені системою у таблицях користувача.\n" +"Ці типи OID не стабільні між версіями PostgreSQL, тому цей кластер наразі не може бути оновлений.\n" +"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n" +"Список проблемних стовпців знаходиться у файлі:\n" +" %s\n\n" + +#: check.c:1124 #, c-format msgid "Checking for reg* data types in user tables" msgstr "Перевірка типів даних reg* в користувацьких таблицях" -#: check.c:1077 +#: check.c:1155 #, c-format msgid "Your installation contains one of the reg* data types in user tables.\n" "These data types reference system OIDs that are not preserved by\n" "pg_upgrade, so this cluster cannot currently be upgraded. You can\n" -"remove the problem tables and restart the upgrade. A list of the\n" -"problem columns is in the file:\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n\n" -msgstr "Користувацькі таблиці у вашій інсталяції містять один з типів даних reg*. Ці типи даних посилаються на системні OIDs, що не зберігаються за допомогою pg_upgrade, тому цей кластер наразі неможливо оновити. Ви можете видалити проблемні таблиці і перезавантажити оновлення. Список проблемних стовпців подано у файлі:\n" +msgstr "Ваша інсталяція містить один з типів даних reg* у таблицях користувача.\n" +"Ці типи даних посилаються на OID системи, які не зберігаються за допомогою pg_upgrade, тому цей кластер наразі не може бути оновлений.\n" +"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n" +"Список проблемних стовпців знаходиться у файлі:\n" " %s\n\n" -#: check.c:1102 +#: check.c:1177 #, c-format msgid "Checking for incompatible \"jsonb\" data type" msgstr "Перевірка несумісного типу даних \"jsonb\"" -#: check.c:1168 +#: check.c:1184 #, c-format msgid "Your installation contains the \"jsonb\" data type in user tables.\n" "The internal format of \"jsonb\" changed during 9.4 beta so this\n" -"cluster cannot currently be upgraded. You can remove the problem\n" -"tables and restart the upgrade. A list of the problem columns is\n" -"in the file:\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n\n" -msgstr "Користувацькі таблиці у вашій інсталяції містять тип даних \"jsonb\". Внутрішній формат \"jsonb\" змінено під час версії 9.4 beta, тому цей кластер наразі неможливо оновити. Ви можете видалити проблемні таблиці та перезавантажити оновлення. Список проблемних таблиць подано у файлі:\n" +msgstr "Ваша інсталяція містить тип даних \"jsonb\" у таблицях користувача.\n" +"Внутрішній формат \"jsonb\" змінено під час версії 9.4 beta,\n" +"тому цей кластер наразі не може бути оновлений.\n" +"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n" +"Список проблемних стовпців знаходиться у файлі:\n" " %s\n\n" -#: check.c:1190 +#: check.c:1206 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Перевірка ролей, які починаються з \"pg_\"" -#: check.c:1200 +#: check.c:1216 #, c-format msgid "The source cluster contains roles starting with \"pg_\"\n" msgstr "Початковий кластер містить ролі, які починаються з \"pg_\"\n" -#: check.c:1202 +#: check.c:1218 #, c-format msgid "The target cluster contains roles starting with \"pg_\"\n" msgstr "Цільовий кластер містить ролі, які починаються з \"pg_\"\n" -#: check.c:1228 +#: check.c:1239 +#, c-format +msgid "Checking for user-defined encoding conversions" +msgstr "Перевірка користувацьких перетворення кодувань" + +#: check.c:1302 +#, c-format +msgid "Your installation contains user-defined encoding conversions.\n" +"The conversion function parameters changed in PostgreSQL version 14\n" +"so this cluster cannot currently be upgraded. You can remove the\n" +"encoding conversions in the old cluster and restart the upgrade.\n" +"A list of user-defined encoding conversions is in the file:\n" +" %s\n\n" +msgstr "Ваша інсталяція містить користувацькі перетворення кодувань.\n" +"Параметри функції перетворення змінено у версії PostgreSQL 14,\n" +"тому цей кластер наразі не може бути оновлений.\n" +"Ви можете видалити перетворення кодувань в старому кластері та перезапустити оновлення.\n" +"Список перетворень кодувань знаходиться у файлі:\n" +" %s\n\n" + +#: check.c:1329 #, c-format msgid "failed to get the current locale\n" msgstr "не вдалося отримати поточну локаль\n" -#: check.c:1237 +#: check.c:1338 #, c-format msgid "failed to get system locale name for \"%s\"\n" msgstr "не вдалося отримати системне ім'я локалі для \"%s\"\n" -#: check.c:1243 +#: check.c:1344 #, c-format msgid "failed to restore old locale \"%s\"\n" msgstr "не вдалося відновити стару локаль \"%s\"\n" -#: controldata.c:127 controldata.c:195 +#: controldata.c:128 controldata.c:196 #, c-format msgid "could not get control data using %s: %s\n" msgstr "не вдалося отримати контрольні дані за допомогою %s: %s\n" -#: controldata.c:138 +#: controldata.c:139 #, c-format msgid "%d: database cluster state problem\n" msgstr "%d: неприпустимий стан кластера баз даних\n" -#: controldata.c:156 +#: controldata.c:157 #, c-format msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" msgstr "Початковий кластер завершив роботу в режимі відновлення. Щоб виконати оновлення, використайте документований спосіб з \"rsync\" або вимкніть його в режимі головного сервера.\n" -#: controldata.c:158 +#: controldata.c:159 #, c-format msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" msgstr "Цільовий кластер завершив роботу в режимі відновлення. Щоб виконати оновлення, використайте документований спосіб з \"rsync\" або вимкніть його в режимі головного сервера.\n" -#: controldata.c:163 +#: controldata.c:164 #, c-format msgid "The source cluster was not shut down cleanly.\n" msgstr "Початковий кластер завершив роботу некоректно.\n" -#: controldata.c:165 +#: controldata.c:166 #, c-format msgid "The target cluster was not shut down cleanly.\n" msgstr "Цільовий кластер завершив роботу некоректно.\n" -#: controldata.c:176 +#: controldata.c:177 #, c-format msgid "The source cluster lacks cluster state information:\n" msgstr "В початковому кластері відсутня інформація про стан кластеру:\n" -#: controldata.c:178 +#: controldata.c:179 #, c-format msgid "The target cluster lacks cluster state information:\n" msgstr "В цільовому кластері відсутня інформація про стан кластеру:\n" -#: controldata.c:208 dump.c:49 pg_upgrade.c:339 pg_upgrade.c:375 -#: relfilenode.c:247 util.c:79 +#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371 +#: relfilenode.c:243 server.c:33 util.c:79 #, c-format msgid "%s" msgstr "%s" -#: controldata.c:215 +#: controldata.c:216 #, c-format msgid "%d: pg_resetwal problem\n" msgstr "%d: проблема pg_resetwal\n" -#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257 -#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309 -#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345 -#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382 -#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426 -#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470 -#: controldata.c:481 +#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258 +#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310 +#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354 +#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383 +#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427 +#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471 +#: controldata.c:482 controldata.c:493 #, c-format msgid "%d: controldata retrieval problem\n" msgstr "%d: проблема з отриманням контрольних даних\n" -#: controldata.c:546 +#: controldata.c:572 #, c-format msgid "The source cluster lacks some required control information:\n" msgstr "У початковому кластері відсутня необхідна контрольна інформація:\n" -#: controldata.c:549 +#: controldata.c:575 #, c-format msgid "The target cluster lacks some required control information:\n" msgstr "У цільовому кластері відсутня необхідна контрольна інформація:\n" -#: controldata.c:552 +#: controldata.c:578 #, c-format msgid " checkpoint next XID\n" msgstr " наступний XID контрольної точки\n" -#: controldata.c:555 +#: controldata.c:581 #, c-format msgid " latest checkpoint next OID\n" msgstr " наступний OID останньої контрольної точки\n" -#: controldata.c:558 +#: controldata.c:584 #, c-format msgid " latest checkpoint next MultiXactId\n" msgstr " наступний MultiXactId останньої контрольної точки\n" -#: controldata.c:562 +#: controldata.c:588 #, c-format msgid " latest checkpoint oldest MultiXactId\n" msgstr " найстарший MultiXactId останньої контрольної точки\n" -#: controldata.c:565 +#: controldata.c:591 +#, c-format +msgid " latest checkpoint oldestXID\n" +msgstr " найстарший oldestXID останньої контрольної точки\n" + +#: controldata.c:594 #, c-format msgid " latest checkpoint next MultiXactOffset\n" msgstr " наступний MultiXactOffset останньої контрольної точки\n" -#: controldata.c:568 +#: controldata.c:597 #, c-format msgid " first WAL segment after reset\n" msgstr " перший сегмет WAL після скидання\n" -#: controldata.c:571 +#: controldata.c:600 #, c-format msgid " float8 argument passing method\n" msgstr " метод передачі аргументу float8\n" -#: controldata.c:574 +#: controldata.c:603 #, c-format msgid " maximum alignment\n" msgstr " максимальне вирівнювання\n" -#: controldata.c:577 +#: controldata.c:606 #, c-format msgid " block size\n" msgstr " розмір блоку\n" -#: controldata.c:580 +#: controldata.c:609 #, c-format msgid " large relation segment size\n" msgstr " розмір сегменту великого відношення\n" -#: controldata.c:583 +#: controldata.c:612 #, c-format msgid " WAL block size\n" msgstr " розмір блоку WAL\n" -#: controldata.c:586 +#: controldata.c:615 #, c-format msgid " WAL segment size\n" msgstr " розмір сегменту WAL\n" -#: controldata.c:589 +#: controldata.c:618 #, c-format msgid " maximum identifier length\n" msgstr " максимальна довжина ідентифікатора\n" -#: controldata.c:592 +#: controldata.c:621 #, c-format msgid " maximum number of indexed columns\n" msgstr " максимальна кількість індексованих стовпців\n" -#: controldata.c:595 +#: controldata.c:624 #, c-format msgid " maximum TOAST chunk size\n" msgstr " максимальний розмір порції TOAST\n" -#: controldata.c:599 +#: controldata.c:628 #, c-format msgid " large-object chunk size\n" msgstr " розмір порції великого об'єкту\n" -#: controldata.c:602 +#: controldata.c:631 #, c-format msgid " dates/times are integers?\n" msgstr " дата/час представлені цілими числами?\n" -#: controldata.c:606 +#: controldata.c:635 #, c-format msgid " data checksum version\n" msgstr " версія контрольних сум даних\n" -#: controldata.c:608 +#: controldata.c:637 #, c-format msgid "Cannot continue without required control information, terminating\n" msgstr "Не можна продовжити без необхідної контрольної інформації, завершення\n" -#: controldata.c:623 +#: controldata.c:652 #, c-format msgid "old and new pg_controldata alignments are invalid or do not match\n" "Likely one cluster is a 32-bit install, the other 64-bit\n" msgstr "старе і нове вирівнювання в pg_controldata неприпустимі або не збігаються\n" "Ймовірно, один кластер встановлений у 32-бітній системі, а інший - у 64-бітній\n" -#: controldata.c:627 +#: controldata.c:656 #, c-format msgid "old and new pg_controldata block sizes are invalid or do not match\n" msgstr "старий і новий розмір блоків в pg_controldata неприпустимі або не збігаються\n" -#: controldata.c:630 +#: controldata.c:659 #, c-format msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n" msgstr "старий і новий максимальний розмір сегментів відношень в pg_controldata неприпустимі або не збігаються\n" -#: controldata.c:633 +#: controldata.c:662 #, c-format msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n" msgstr "старий і новий розмір блоків WAL в pg_controldata неприпустимі або не збігаються\n" -#: controldata.c:636 +#: controldata.c:665 #, c-format msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n" msgstr "старий і новий розмір сегментів WAL в pg_controldata неприпустимі або не збігаються\n" -#: controldata.c:639 +#: controldata.c:668 #, c-format msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n" msgstr "стара і нова максимальна довжина ідентифікаторів в pg_controldata неприпустимі або не збігаються\n" -#: controldata.c:642 +#: controldata.c:671 #, c-format msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n" msgstr "стара і нова максимальна кількість індексованих стовпців в pg_controldata неприпустимі або не збігаються\n" -#: controldata.c:645 +#: controldata.c:674 #, c-format msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n" msgstr "старий і новий максимальний розмір порції TOAST в pg_controldata неприпустимі або не збігаються\n" -#: controldata.c:650 +#: controldata.c:679 #, c-format msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n" msgstr "старий і новий розмір порції великого об'єкту в pg_controldata неприпустимі або не збігаються\n" -#: controldata.c:653 +#: controldata.c:682 #, c-format msgid "old and new pg_controldata date/time storage types do not match\n" msgstr "старий і новий тип сховища дати/часу в pg_controldata неприпустимі або не збігаються\n" -#: controldata.c:666 +#: controldata.c:695 #, c-format msgid "old cluster does not use data checksums but the new one does\n" msgstr "старий кластер не використовує контрольні суми даних, але новий використовує\n" -#: controldata.c:669 +#: controldata.c:698 #, c-format msgid "old cluster uses data checksums but the new one does not\n" msgstr "старий кластер використовує контрольні суми даних, але новий не використовує\n" -#: controldata.c:671 +#: controldata.c:700 #, c-format msgid "old and new cluster pg_controldata checksum versions do not match\n" msgstr "стара і нова версія контрольних сум кластера в pg_controldata не збігаються\n" -#: controldata.c:682 +#: controldata.c:711 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "Додавання суфікса \".old\" до старого файла global/pg_control" -#: controldata.c:687 +#: controldata.c:716 #, c-format msgid "Unable to rename %s to %s.\n" msgstr "Не вдалося перейменувати %s на %s.\n" -#: controldata.c:690 +#: controldata.c:719 #, c-format msgid "\n" "If you want to start the old cluster, you will need to remove\n" @@ -598,97 +662,102 @@ msgstr "Створення вивантаження глобальних об'є msgid "Creating dump of database schemas\n" msgstr "Створення вивантаження схем бази даних\n" -#: exec.c:44 +#: exec.c:45 #, c-format msgid "could not get pg_ctl version data using %s: %s\n" msgstr "не вдалося отримати дані версії pg_ctl, виконавши %s: %s\n" -#: exec.c:50 +#: exec.c:51 #, c-format msgid "could not get pg_ctl version output from %s\n" msgstr "не вдалося отримати версію pg_ctl з результату %s\n" -#: exec.c:104 exec.c:108 +#: exec.c:105 exec.c:109 #, c-format msgid "command too long\n" msgstr "команда занадто довга\n" -#: exec.c:110 util.c:37 util.c:225 +#: exec.c:111 util.c:37 util.c:225 #, c-format msgid "%s\n" msgstr "%s\n" -#: exec.c:149 option.c:217 +#: exec.c:150 option.c:217 #, c-format msgid "could not open log file \"%s\": %m\n" msgstr "не вдалося відкрити файл журналу \"%s\": %m\n" -#: exec.c:178 +#: exec.c:179 #, c-format msgid "\n" "*failure*" msgstr "\n" "*неполадка*" -#: exec.c:181 +#: exec.c:182 #, c-format msgid "There were problems executing \"%s\"\n" msgstr "Під час виконання \"%s\" виникли проблеми\n" -#: exec.c:184 +#: exec.c:185 #, c-format msgid "Consult the last few lines of \"%s\" or \"%s\" for\n" "the probable cause of the failure.\n" msgstr "Щоб зрозуміти причину неполадки, зверніться до декількох останніх рядків\n" "файлу \"%s\" або \"%s\".\n" -#: exec.c:189 +#: exec.c:190 #, c-format msgid "Consult the last few lines of \"%s\" for\n" "the probable cause of the failure.\n" msgstr "Щоб зрозуміти причину неполадки, зверніться до декількох останніх рядків\n" "файлу \"%s\".\n" -#: exec.c:204 option.c:226 +#: exec.c:205 option.c:226 #, c-format msgid "could not write to log file \"%s\": %m\n" msgstr "не вдалося записати до файлу журналу \"%s\": %m\n" -#: exec.c:230 +#: exec.c:231 #, c-format msgid "could not open file \"%s\" for reading: %s\n" msgstr "не вдалося відкрити файл \"%s\" для читання: %s\n" -#: exec.c:257 +#: exec.c:258 #, c-format msgid "You must have read and write access in the current directory.\n" msgstr "Ви повинні мати права на читання і запис в поточному каталозі.\n" -#: exec.c:310 exec.c:372 exec.c:436 +#: exec.c:311 exec.c:377 #, c-format msgid "check for \"%s\" failed: %s\n" msgstr "перевірка \"%s\" провалена: %s\n" -#: exec.c:313 exec.c:375 +#: exec.c:314 exec.c:380 #, c-format msgid "\"%s\" is not a directory\n" msgstr "\"%s\" не є каталогом\n" -#: exec.c:439 +#: exec.c:430 #, c-format msgid "check for \"%s\" failed: not a regular file\n" msgstr "перевірка \"%s\" провалена: це не звичайний файл\n" -#: exec.c:451 -#, c-format -msgid "check for \"%s\" failed: cannot read file (permission denied)\n" -msgstr "перевірка \"%s\" провалена: не можна прочитати файл (немає доступу)\n" - -#: exec.c:459 +#: exec.c:433 #, c-format msgid "check for \"%s\" failed: cannot execute (permission denied)\n" msgstr "перевірка \"%s\" провалена: виконання неможливе (немає доступу)\n" +#: exec.c:439 +#, c-format +msgid "check for \"%s\" failed: cannot execute\n" +msgstr "помилка перевірки \"%s\": не можна виконати\n" + +#: exec.c:449 +#, c-format +msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n" +msgstr "помилка перевірки \"%s\": неправильна версія: знайдено \"%s\", очікувалось \"%s\"\n" + #: file.c:43 file.c:61 #, c-format msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" @@ -929,7 +998,7 @@ msgstr "неприпустимий новий номер порту\n" #: option.c:207 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" для отримання додаткової інформації.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" #: option.c:214 #, c-format @@ -1204,8 +1273,8 @@ msgstr "не вдалося створити робочий потік: %s\n" #: parallel.c:300 #, c-format -msgid "waitpid() failed: %s\n" -msgstr "помилка waitpid(): %s\n" +msgid "%s() failed: %s\n" +msgstr "%s() помилка: %s\n" #: parallel.c:304 #, c-format @@ -1217,12 +1286,12 @@ msgstr "дочірній процес завершився ненормальн msgid "child worker exited abnormally: %s\n" msgstr "дочірній процес завершився аварійно: %s\n" -#: pg_upgrade.c:108 +#: pg_upgrade.c:107 #, c-format msgid "could not read permissions of directory \"%s\": %s\n" msgstr "не вдалося прочитати права на каталог \"%s\": %s\n" -#: pg_upgrade.c:123 +#: pg_upgrade.c:122 #, c-format msgid "\n" "Performing Upgrade\n" @@ -1231,17 +1300,17 @@ msgstr "\n" "Виконання оновлення\n" "------------------\n" -#: pg_upgrade.c:166 +#: pg_upgrade.c:165 #, c-format msgid "Setting next OID for new cluster" msgstr "Встановлення наступного OID для нового кластера" -#: pg_upgrade.c:173 +#: pg_upgrade.c:172 #, c-format msgid "Sync data directory to disk" msgstr "Синхронізація каталогу даних на диск" -#: pg_upgrade.c:185 +#: pg_upgrade.c:183 #, c-format msgid "\n" "Upgrade Complete\n" @@ -1250,86 +1319,91 @@ msgstr "\n" "Оновлення завершено\n" "----------------\n" -#: pg_upgrade.c:220 +#: pg_upgrade.c:216 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: не вдалося знайти ехе файл власної програми\n" -#: pg_upgrade.c:246 +#: pg_upgrade.c:242 #, c-format msgid "There seems to be a postmaster servicing the old cluster.\n" "Please shutdown that postmaster and try again.\n" msgstr "Мабуть, запущений процес postmaster, який обслуговує старий кластер.\n" "Будь ласка, завершіть роботу процесу і спробуйте знову.\n" -#: pg_upgrade.c:259 +#: pg_upgrade.c:255 #, c-format msgid "There seems to be a postmaster servicing the new cluster.\n" "Please shutdown that postmaster and try again.\n" msgstr "Мабуть, запущений процес postmaster, який обслуговує новий кластер.\n" "Будь ласка, завершіть роботу процесу і спробуйте знову.\n" -#: pg_upgrade.c:273 +#: pg_upgrade.c:269 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Аналіз всіх рядків у новому кластері" -#: pg_upgrade.c:286 +#: pg_upgrade.c:282 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Закріплення всіх рядків у новому кластері" -#: pg_upgrade.c:306 +#: pg_upgrade.c:302 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Відновлення глобальних об'єктів у новому кластері" -#: pg_upgrade.c:321 +#: pg_upgrade.c:317 #, c-format msgid "Restoring database schemas in the new cluster\n" msgstr "Відновлення схем баз даних у новому кластері\n" -#: pg_upgrade.c:425 +#: pg_upgrade.c:421 #, c-format msgid "Deleting files from new %s" msgstr "Видалення файлів з нового %s" -#: pg_upgrade.c:429 +#: pg_upgrade.c:425 #, c-format msgid "could not delete directory \"%s\"\n" msgstr "не вдалося видалити каталог \"%s\"\n" -#: pg_upgrade.c:448 +#: pg_upgrade.c:444 #, c-format msgid "Copying old %s to new server" msgstr "Копіювання старого %s до нового серверу" -#: pg_upgrade.c:475 +#: pg_upgrade.c:470 +#, c-format +msgid "Setting oldest XID for new cluster" +msgstr "Встановлення найстарішого XID для нового кластеру" + +#: pg_upgrade.c:478 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "Установка наступного ID транзакції й епохи для нового кластера" -#: pg_upgrade.c:505 +#: pg_upgrade.c:508 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "Установка наступного ID і зсуву мультитранзакції для нового кластера" -#: pg_upgrade.c:529 +#: pg_upgrade.c:532 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Установка найстаршого ID мультитранзакції в новому кластері" -#: pg_upgrade.c:549 +#: pg_upgrade.c:552 #, c-format msgid "Resetting WAL archives" msgstr "Скидання архівів WAL" -#: pg_upgrade.c:592 +#: pg_upgrade.c:595 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Установка лічильників frozenxid і minmxid у новому кластері" -#: pg_upgrade.c:594 +#: pg_upgrade.c:597 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Установка лічильника minmxid у новому кластері" @@ -1354,47 +1428,42 @@ msgstr "Підключення файлів користувацьких від msgid "old database \"%s\" not found in the new cluster\n" msgstr "стара база даних \"%s\" не знайдена в новому кластері\n" -#: relfilenode.c:234 +#: relfilenode.c:230 #, c-format msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n" msgstr "помилка під час перевірки існування файлу \"%s.%s\" (з \"%s\" в \"%s\"): %s\n" -#: relfilenode.c:252 +#: relfilenode.c:248 #, c-format msgid "rewriting \"%s\" to \"%s\"\n" msgstr "перезаписування \"%s\" в \"%s\"\n" -#: relfilenode.c:260 +#: relfilenode.c:256 #, c-format msgid "cloning \"%s\" to \"%s\"\n" msgstr "клонування \"%s\" до \"%s\"\n" -#: relfilenode.c:265 +#: relfilenode.c:261 #, c-format msgid "copying \"%s\" to \"%s\"\n" msgstr "копіювання \"%s\" в \"%s\"\n" -#: relfilenode.c:270 +#: relfilenode.c:266 #, c-format msgid "linking \"%s\" to \"%s\"\n" msgstr "створення посилання на \"%s\" в \"%s\"\n" -#: server.c:33 -#, c-format -msgid "connection to database failed: %s" -msgstr "помилка підключення до бази даних: %s" - -#: server.c:39 server.c:141 util.c:135 util.c:165 +#: server.c:38 server.c:142 util.c:135 util.c:165 #, c-format msgid "Failure, exiting\n" msgstr "Помилка, вихід\n" -#: server.c:131 +#: server.c:132 #, c-format msgid "executing: %s\n" msgstr "виконується: %s\n" -#: server.c:137 +#: server.c:138 #, c-format msgid "SQL command failed\n" "%s\n" @@ -1403,22 +1472,22 @@ msgstr "Помилка SQL-команди\n" "%s\n" "%s" -#: server.c:167 +#: server.c:168 #, c-format msgid "could not open version file \"%s\": %m\n" msgstr "не вдалося відкрити файл версії \"%s\": %m\n" -#: server.c:171 +#: server.c:172 #, c-format msgid "could not parse version file \"%s\"\n" msgstr "не вдалося проаналізувати файл версії \"%s\"\n" -#: server.c:297 +#: server.c:298 #, c-format msgid "\n" -"connection to database failed: %s" +"%s" msgstr "\n" -"помилка підключення до бази даних: %s" +"%s" #: server.c:302 #, c-format @@ -1496,7 +1565,7 @@ msgstr "ok" msgid "Checking for large objects" msgstr "Перевірка великих об'єктів" -#: version.c:77 version.c:384 +#: version.c:77 version.c:419 #, c-format msgid "warning" msgstr "попередження" @@ -1530,50 +1599,53 @@ msgstr "\n" "дозволяє встановити такі права (він призначений для виконання в psql\n" "суперкористувачем бази даних).\n\n" -#: version.c:239 +#: version.c:272 #, c-format msgid "Checking for incompatible \"line\" data type" msgstr "Перевірка несумісного типу даних \"line\"" -#: version.c:246 +#: version.c:279 #, c-format -msgid "Your installation contains the \"line\" data type in user tables. This\n" -"data type changed its internal and input/output format between your old\n" -"and new clusters so this cluster cannot currently be upgraded. You can\n" -"remove the problem tables and restart the upgrade. A list of the problem\n" -"columns is in the file:\n" +msgid "Your installation contains the \"line\" data type in user tables.\n" +"This data type changed its internal and input/output format\n" +"between your old and new versions so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n\n" -msgstr "Користувацькі таблиці у вашій інсталяції містять тип даних \"line\". У\n" -"старому кластері внутрішній формат введення/виведення цього типу\n" -"відрізняється від нового, тож в поточному стані оновити кластер неможливо. Ви\n" -"можете видалити проблемні таблиці і перезавантажити оновлення. Список\n" -"проблемних стовпців подано у файлі:\n" +msgstr "Ваша інсталяція містить тип даних \"line\" в таблицях користувача.\n" +"Внутрішній формат та формат вводу/виводу цього типу даних змінено між вашою старою та новими версіями,\n" +"тому цей кластер наразі не може бути оновлений.\n" +"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n" +"Список проблемних стовпців знаходиться у файлі:\n" " %s\n\n" -#: version.c:276 +#: version.c:310 #, c-format msgid "Checking for invalid \"unknown\" user columns" msgstr "Перевірка неприпустимих користувацьких стовпців \"unknown\"" -#: version.c:283 +#: version.c:317 #, c-format -msgid "Your installation contains the \"unknown\" data type in user tables. This\n" -"data type is no longer allowed in tables, so this cluster cannot currently\n" -"be upgraded. You can remove the problem tables and restart the upgrade.\n" +msgid "Your installation contains the \"unknown\" data type in user tables.\n" +"This data type is no longer allowed in tables, so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" "A list of the problem columns is in the file:\n" " %s\n\n" -msgstr "Користувацькі таблиці у вашій інсталяції містять тип даних \"unknown\". Цей тип даних\n" -"більше не допускається в таблицях, тож в поточному стані оновити кластер неможливо. Ви\n" -"можете видалити проблемні таблиці і перезавантажити оновлення. Список проблемних стовпців\n" -"подано у файлі:\n" +msgstr "Ваша інсталяція містить \"unknown\" тип даних у таблицях користувача.\n" +"Цей тип даних більше не допускається в таблицях,\n" +"тому цей кластер наразі не може бути оновлений.\n" +"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n" +"Список проблемних стовпців знаходиться у файлі:\n" " %s\n\n" -#: version.c:306 +#: version.c:341 #, c-format msgid "Checking for hash indexes" msgstr "Перевірка геш-індексів" -#: version.c:386 +#: version.c:421 #, c-format msgid "\n" "Your installation contains hash indexes. These indexes have different\n" @@ -1585,7 +1657,7 @@ msgstr "\n" "формати в старому і новому кластерах, тож їх потрібно повторно індексувати\n" "за допомогою команди REINDEX. Після оновлення вам буде надано інструкції REINDEX.\n\n" -#: version.c:392 +#: version.c:427 #, c-format msgid "\n" "Your installation contains hash indexes. These indexes have different\n" @@ -1602,22 +1674,48 @@ msgstr "\n" "після виконання суперкористувачем бази даних в psql, повторно створить\n" "всі неприпустимі індекси; до цього ніякі геш-індекси не будуть використовуватись.\n\n" -#: version.c:418 +#: version.c:453 #, c-format msgid "Checking for invalid \"sql_identifier\" user columns" msgstr "Перевірка неприпустимих користувацьких стовпців \"sql_identifier\"" -#: version.c:426 +#: version.c:461 #, c-format -msgid "Your installation contains the \"sql_identifier\" data type in user tables\n" -"and/or indexes. The on-disk format for this data type has changed, so this\n" -"cluster cannot currently be upgraded. You can remove the problem tables or\n" -"change the data type to \"name\" and restart the upgrade.\n" +msgid "Your installation contains the \"sql_identifier\" data type in user tables.\n" +"The on-disk format for this data type has changed, so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" "A list of the problem columns is in the file:\n" " %s\n\n" -msgstr "Користувацькі таблиці або індекси у вашій інсталяції містять тип даних \"sql_identifier\". \n" -"Формат зберігання цього типу на диску змінився, тож в поточному стані оновити \n" -"кластер неможливо. Ви можете видалити проблемні таблиці або змінити тип даних \n" -"на \"name\" і спробувати знову. Список проблемних стовпців подано у файлі:\n" +msgstr "Ваша інсталяція містить \"sql_identifier\" тип даних у таблицях користувача.\n" +"Формат зберігання для цього типу даних змінено,\n" +"тому цей кластер наразі не може бути оновлений.\n" +"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n" +"Список проблемних стовпців знаходиться у файлі:\n" " %s\n\n" +#: version.c:485 +#, c-format +msgid "Checking for extension updates" +msgstr "Перевірка оновлень розширення" + +#: version.c:537 +#, c-format +msgid "notice" +msgstr "повідомлення" + +#: version.c:538 +#, c-format +msgid "\n" +"Your installation contains extensions that should be updated\n" +"with the ALTER EXTENSION command. The file\n" +" %s\n" +"when executed by psql by the database superuser will update\n" +"these extensions.\n\n" +msgstr "\n" +"Ваша інсталяція містить розширення, які потрібно оновити\n" +"командою ALTER EXTENSION . Файл\n" +" %s,\n" +"коли виконується суперкористувачем бази даних за допомогою\n" +"psql, оновить ці розширення.\n\n" + diff --git a/src/bin/pg_upgrade/po/zh_CN.po b/src/bin/pg_upgrade/po/zh_CN.po index 8da7da4446..4ab61a5cbd 100644 --- a/src/bin/pg_upgrade/po/zh_CN.po +++ b/src/bin/pg_upgrade/po/zh_CN.po @@ -1,22 +1,22 @@ # LANGUAGE message translation file for pg_upgrade # Copyright (C) 2019 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_upgrade (PostgreSQL) package. -# FIRST AUTHOR , 2019. +# FIRST AUTHOR , 2019. # msgid "" msgstr "" -"Project-Id-Version: pg_upgrade (PostgreSQL) 12\n" +"Project-Id-Version: pg_upgrade (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56-0700\n" -"PO-Revision-Date: 2019-06-03 18:40+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:46+0000\n" +"PO-Revision-Date: 2021-08-15 18:40+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -#: check.c:67 +#: check.c:70 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -25,7 +25,7 @@ msgstr "" "在旧的活动的服务器上执行一致性检查\n" "------------------------------------------------\n" -#: check.c:73 +#: check.c:76 #, c-format msgid "" "Performing Consistency Checks\n" @@ -34,7 +34,7 @@ msgstr "" "正在执行一致性检查\n" "-----------------------------\n" -#: check.c:183 +#: check.c:213 #, c-format msgid "" "\n" @@ -43,7 +43,7 @@ msgstr "" "\n" "*群集是兼容的*\n" -#: check.c:189 +#: check.c:219 #, c-format msgid "" "\n" @@ -53,33 +53,19 @@ msgstr "" "\n" "如果pg_upgrade在这一点之后失败,在继续之前必须重新初始化新集群.\n" -#: check.c:225 -#, c-format -msgid "" -"Optimizer statistics are not transferred by pg_upgrade so,\n" -"once you start the new server, consider running:\n" -" %s\n" -"\n" -msgstr "" -"优化器统计数据不会通过pg_upgrade传输,因此,\n" -"启动新服务器后,考虑运行:\n" -" %s\n" -"\n" - -#: check.c:230 -#, c-format +#: check.c:264 msgid "" -"Optimizer statistics and free space information are not transferred\n" -"by pg_upgrade so, once you start the new server, consider running:\n" -" %s\n" +"Optimizer statistics are not transferred by pg_upgrade.\n" +"Once you start the new server, consider running:\n" +" %s/vacuumdb %s--all --analyze-in-stages\n" "\n" msgstr "" -"优化器统计信息和可用空间信息不通过pg_upgrade进行传输,因此,\n" +"优化器统计数据不会通过pg_upgrade传输。\n" "启动新服务器后,考虑运行:\n" -" %s\n" +" %s/vacuumdb %s--all --analyze-in-stages\n" "\n" -#: check.c:237 +#: check.c:270 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -88,7 +74,7 @@ msgstr "" "运行此脚本将删除旧群集的数据文件:\n" " %s\n" -#: check.c:242 +#: check.c:275 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -100,84 +86,75 @@ msgstr "" "因为用户定义的表空间或新集群的数据目录存在于旧集群目录中.\n" "必须手动删除旧群集的内容.\n" -#: check.c:252 +#: check.c:287 #, c-format msgid "Checking cluster versions" msgstr "正在检查群集版本" -#: check.c:264 +#: check.c:299 #, c-format msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n" msgstr "此实用程序只能从PostgreSQL 8.4及更高版本升级.\n" -#: check.c:268 +#: check.c:303 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s.\n" msgstr "此实用程序只能升级到PostgreSQL版本%s.\n" -#: check.c:277 +#: check.c:312 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n" msgstr "此实用程序不能用于降级到旧的主PostgreSQL版本.\n" -#: check.c:282 +#: check.c:317 #, c-format msgid "Old cluster data and binary directories are from different major versions.\n" msgstr "旧的集群数据和二进制目录来自不同的主版本.\n" -#: check.c:285 +#: check.c:320 #, c-format msgid "New cluster data and binary directories are from different major versions.\n" msgstr "新的集群数据和二进制目录来自不同的主版本.\n" -#: check.c:302 +#: check.c:337 #, c-format msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n" msgstr "在检查pre-PG 9.1之前的活动旧服务器时,必须指定旧服务器的端口号.\n" -#: check.c:306 +#: check.c:341 #, c-format msgid "When checking a live server, the old and new port numbers must be different.\n" msgstr "检查活动服务器时,新端口号和旧端口号必须不同.\n" -#: check.c:321 +#: check.c:356 #, c-format msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "数据库\"%s\"的编码不匹配: 旧的 \"%s\", 新的 \"%s\"\n" -#: check.c:326 +#: check.c:361 #, c-format msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "数据库\"%s\"的lc_collate不匹配: 旧的 \"%s\", 新的 \"%s\"\n" -#: check.c:329 +#: check.c:364 #, c-format msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" msgstr "数据库\"%s\"的lc_ctype不匹配: 旧的 \"%s\", 新的 \"%s\"\n" -#: check.c:402 +#: check.c:437 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" msgstr "新群集数据库\"%s\"不是空的:找到关系\"%s.%s\"\n" -#: check.c:451 -#, c-format -msgid "Creating script to analyze new cluster" -msgstr "正在创建用于分析新群集的脚本" - -#: check.c:465 check.c:593 check.c:857 check.c:936 check.c:1045 check.c:1136 -#: file.c:341 function.c:246 option.c:493 version.c:57 version.c:156 -#: version.c:257 version.c:339 -#, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "无法打开文件 \"%s\": %s\n" +#: check.c:494 +msgid "Checking for new cluster tablespace directories" +msgstr "正在检查新的群集表空间目录" -#: check.c:520 check.c:649 -#, c-format -msgid "could not add execute permission to file \"%s\": %s\n" -msgstr "无法向文件\"%s\"添加执行权限: %s\n" +#: check.c:505 +msgid "new cluster tablespace directory already exists: \"%s\"\n" +msgstr "新的群集表空间目录已存在: \"%s\"\n" -#: check.c:556 +#: check.c:538 #, c-format msgid "" "\n" @@ -186,7 +163,7 @@ msgstr "" "\n" "警告:新数据目录不应位于旧数据目录中,例如 %s\n" -#: check.c:580 +#: check.c:562 #, c-format msgid "" "\n" @@ -195,121 +172,181 @@ msgstr "" "\n" "警告:用户定义的表空间位置不应在数据目录中,例如 %s\n" -#: check.c:590 +#: check.c:572 #, c-format msgid "Creating script to delete old cluster" msgstr "正在创建删除旧群集的脚本" -#: check.c:669 +#: check.c:575 check.c:839 check.c:937 check.c:1016 check.c:1278 file.c:336 +#: function.c:240 option.c:497 version.c:54 version.c:204 version.c:376 +#: version.c:511 +#, c-format +msgid "could not open file \"%s\": %s\n" +msgstr "无法打开文件 \"%s\": %s\n" + +#: check.c:631 +#, c-format +msgid "could not add execute permission to file \"%s\": %s\n" +msgstr "无法向文件\"%s\"添加执行权限: %s\n" + +#: check.c:651 #, c-format msgid "Checking database user is the install user" msgstr "正在检查数据库用户是否为安装用户" -#: check.c:685 +#: check.c:667 #, c-format msgid "database user \"%s\" is not the install user\n" msgstr "数据库用户\"%s\"不是安装用户\n" -#: check.c:696 +#: check.c:678 #, c-format msgid "could not determine the number of users\n" msgstr "无法确定用户数\n" -#: check.c:704 +#: check.c:686 #, c-format msgid "Only the install user can be defined in the new cluster.\n" msgstr "只能在新群集中定义安装用户.\n" -#: check.c:724 +#: check.c:706 #, c-format msgid "Checking database connection settings" msgstr "正在检查数据库连接设置" -#: check.c:746 +#: check.c:728 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n" msgstr "template0不能允许连接,即,其pg_database.datallowconn必须为false\n" -#: check.c:756 +#: check.c:738 #, c-format msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n" msgstr "所有非template0数据库必须允许连接,即,它们的pg_database.dataallowconn必须为true\n" -#: check.c:781 +#: check.c:763 #, c-format msgid "Checking for prepared transactions" msgstr "正在检查准备的交易记录" -#: check.c:790 +#: check.c:772 #, c-format msgid "The source cluster contains prepared transactions\n" msgstr "源群集包含准备好的事务\n" -#: check.c:792 +#: check.c:774 #, c-format msgid "The target cluster contains prepared transactions\n" msgstr "目标集群包含准备好的事务\n" -#: check.c:818 +#: check.c:800 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "正在检查contrib/isn和bigint-passing是否不匹配" -#: check.c:879 check.c:958 check.c:1068 check.c:1159 function.c:268 -#: version.c:179 version.c:280 +#: check.c:861 check.c:962 check.c:1038 check.c:1095 check.c:1154 check.c:1183 +#: check.c:1301 function.c:262 version.c:278 version.c:316 version.c:460 #, c-format msgid "fatal\n" msgstr "致命的\n" -#: check.c:880 -#, c-format +#: check.c:862 msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" "bigint data type. Your old and new clusters pass bigint values\n" "differently so this cluster cannot currently be upgraded. You can\n" -"manually upgrade databases that use \"contrib/isn\" facilities and remove\n" -"\"contrib/isn\" from the old cluster and restart the upgrade. A list of\n" -"the problem functions is in the file:\n" +"manually dump databases in the old cluster that use \"contrib/isn\"\n" +"facilities, drop them, perform the upgrade, and then restore them. A\n" +"list of the problem functions is in the file:\n" " %s\n" "\n" msgstr "" "您的安装包含\"contrib/isn\"函数,这些函数依赖于bigint数据类型\n" "旧群集和新群集传递的bigint值不同,因此当前无法升级此群集\n" -"您可以手动升级使用\"contrib/isn\"设施的数据库,并从旧集群中\n" -"删除\"contrib/isn\",然后重新启动升级。\n" +"您可以手动的在旧集群中转储数据库,\n" +"使用 \"contrib/isn\"\n" +"删除它们,执行升级,然后恢复它们。\n" "文件中有问题函数的列表:\n" " %s\n" "\n" -#: check.c:904 +#: check.c:885 +msgid "Checking for user-defined postfix operators" +msgstr "正在检查用户定义的后缀运算符" + +#: check.c:963 +#, c-format +msgid "" +"Your installation contains user-defined postfix operators, which are not\n" +"supported anymore. Consider dropping the postfix operators and replacing\n" +"them with prefix operators or function calls.\n" +"A list of user-defined postfix operators is in the file:\n" +" %s\n" +"\n" +msgstr "" +"您的安装包含用户定义的后缀运算符,它们\n" +"不再支持了。考虑删除后缀运算符并用前缀运算符或函数调用替换它们\n" +"函数调用替换它们.\n" +"以下的文件中有用户定义的后缀运算符列表:\n" +" %s\n" +"\n" + +#: check.c:984 #, c-format msgid "Checking for tables WITH OIDS" msgstr "正在检查带有OIDS的表" -#: check.c:959 +#: check.c:1039 #, c-format msgid "" -"Your installation contains tables declared WITH OIDS, which is not supported\n" -"anymore. Consider removing the oid column using\n" +"Your installation contains tables declared WITH OIDS, which is not\n" +"supported anymore. Consider removing the oid column using\n" " ALTER TABLE ... SET WITHOUT OIDS;\n" "A list of tables with the problem is in the file:\n" " %s\n" "\n" msgstr "" +"您的安装包含用OID声明的表,这不再受支持\n" +"考虑使用以下的SQL移除OID列\n" +" ALTER TABLE ... SET WITHOUT OIDS;\n" +"有问题的表在以下的文件中:\n" +" %s\n" +"\n" -#: check.c:989 +#: check.c:1067 +msgid "Checking for system-defined composite types in user tables" +msgstr "在用户表中检查系统定义的复合类型" + +#: check.c:1096 +msgid "" +"Your installation contains system-defined composite type(s) in user tables.\n" +"These type OIDs are not stable across PostgreSQL versions,\n" +"so this cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" +" %s\n" +"\n" +msgstr "" +"您的安装包含用户表中的系统定义的复合类型。\n" +"这些类型OID在PostgreSQL版本中不稳定。\n" +"因此,当前无法升级此群集。\n" +"你可以删除有问题的列并重新启动升级。\n" +"以下的文件中有问题列的列表\n" +" %s\n" +"\n" + +#: check.c:1124 #, c-format msgid "Checking for reg* data types in user tables" msgstr "正在检查用户表中的reg*数据类型" -#: check.c:1069 -#, c-format +#: check.c:1155 msgid "" "Your installation contains one of the reg* data types in user tables.\n" "These data types reference system OIDs that are not preserved by\n" "pg_upgrade, so this cluster cannot currently be upgraded. You can\n" -"remove the problem tables and restart the upgrade. A list of the problem\n" -"columns is in the file:\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" @@ -321,226 +358,253 @@ msgstr "" " %s\n" "\n" -#: check.c:1094 +#: check.c:1177 #, c-format msgid "Checking for incompatible \"jsonb\" data type" msgstr "正在检查不兼容的\"jsonb\"数据类型" -#: check.c:1160 -#, c-format +#: check.c:1184 msgid "" "Your installation contains the \"jsonb\" data type in user tables.\n" -"The internal format of \"jsonb\" changed during 9.4 beta so this cluster cannot currently\n" -"be upgraded. You can remove the problem tables and restart the upgrade. A list\n" -"of the problem columns is in the file:\n" +"The internal format of \"jsonb\" changed during 9.4 beta so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" "您的安装包含用户表中的\"jsonb\"数据类型.\n" -"\"jsonb\"的内部格式在9.4测试版期间发生了更改,因此当前无法升级该集群。\n" +"\"jsonb\"的内部格式在9.4测试版期间发生了更改,\n" +"因此当前无法升级该集群。\n" "您可以删除问题表并重新启动升级. \n" "文件中有问题列的列表:\n" " %s\n" "\n" -#: check.c:1181 +#: check.c:1206 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "正在检查以\"pg_\"开头的角色" -#: check.c:1191 +#: check.c:1216 #, c-format msgid "The source cluster contains roles starting with \"pg_\"\n" msgstr "源集群包含以\"pg_\"开头的角色\n" -#: check.c:1193 +#: check.c:1218 #, c-format msgid "The target cluster contains roles starting with \"pg_\"\n" msgstr "目标集群包含以\"pg_\"开头的角色\n" -#: check.c:1219 +#: check.c:1239 +msgid "Checking for user-defined encoding conversions" +msgstr "正在检查用户定义的编码转换" + +#: check.c:1302 +msgid "" +"Your installation contains user-defined encoding conversions.\n" +"The conversion function parameters changed in PostgreSQL version 14\n" +"so this cluster cannot currently be upgraded. You can remove the\n" +"encoding conversions in the old cluster and restart the upgrade.\n" +"A list of user-defined encoding conversions is in the file:\n" +" %s\n" +"\n" +msgstr "" +"您的安装包含用户定义的编码转换。\n" +"转换函数参数在PostgreSQL版本14中已更改。\n" +"因此当前无法升级此群集。\n" +"您可以删除问题表并重新启动升级. \n" +"文件中有问题列的列表:\n" +" %s\n" +"\n" + +#: check.c:1329 #, c-format msgid "failed to get the current locale\n" msgstr "无法获取当前区域设置\n" -#: check.c:1228 +#: check.c:1338 #, c-format msgid "failed to get system locale name for \"%s\"\n" msgstr "无法获取\"%s\"的系统区域设置名称\n" -#: check.c:1234 +#: check.c:1344 #, c-format msgid "failed to restore old locale \"%s\"\n" msgstr "还原旧区域\"%s\"失败\n" -#: controldata.c:127 controldata.c:194 +#: controldata.c:128 controldata.c:196 #, c-format msgid "could not get control data using %s: %s\n" msgstr "无法使用%s获取控制数据:%s\n" -#: controldata.c:138 +#: controldata.c:139 #, c-format msgid "%d: database cluster state problem\n" msgstr "%d: 数据库集群状态问题\n" -#: controldata.c:155 +#: controldata.c:157 #, c-format msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" msgstr "在恢复模式下,源群集已关闭。要升级,请使用文档中的\"rsync\",或将其作为主服务器关闭。\n" -#: controldata.c:157 +#: controldata.c:159 #, c-format msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" msgstr "目标群集在恢复模式下关闭。要升级,请使用文档中的\"rsync\",或将其作为主服务器关闭。\n" -#: controldata.c:162 +#: controldata.c:164 #, c-format msgid "The source cluster was not shut down cleanly.\n" msgstr "源群集未完全关闭。\n" -#: controldata.c:164 +#: controldata.c:166 #, c-format msgid "The target cluster was not shut down cleanly.\n" msgstr "目标群集未完全关闭。\n" -#: controldata.c:175 +#: controldata.c:177 #, c-format msgid "The source cluster lacks cluster state information:\n" msgstr "源集群缺少集群状态信息:\n" -#: controldata.c:177 +#: controldata.c:179 #, c-format msgid "The target cluster lacks cluster state information:\n" msgstr "目标集群缺少集群状态信息:\n" -#: controldata.c:207 dump.c:51 pg_upgrade.c:336 pg_upgrade.c:373 -#: relfilenode.c:252 util.c:80 +#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371 +#: relfilenode.c:243 server.c:33 util.c:79 #, c-format msgid "%s" msgstr "%s" -#: controldata.c:214 +#: controldata.c:216 #, c-format msgid "%d: pg_resetwal problem\n" msgstr "%d: pg_resetwal问题\n" -#: controldata.c:224 controldata.c:234 controldata.c:245 controldata.c:256 -#: controldata.c:267 controldata.c:286 controldata.c:297 controldata.c:308 -#: controldata.c:319 controldata.c:330 controldata.c:341 controldata.c:344 -#: controldata.c:348 controldata.c:358 controldata.c:370 controldata.c:381 -#: controldata.c:392 controldata.c:403 controldata.c:414 controldata.c:425 -#: controldata.c:436 controldata.c:447 controldata.c:458 controldata.c:469 -#: controldata.c:480 +#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258 +#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310 +#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354 +#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383 +#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427 +#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471 +#: controldata.c:482 controldata.c:493 #, c-format msgid "%d: controldata retrieval problem\n" msgstr "%d: 控制数据检索问题\n" -#: controldata.c:545 +#: controldata.c:572 #, c-format msgid "The source cluster lacks some required control information:\n" msgstr "源集群缺少一些必需的控制信息:\n" -#: controldata.c:548 +#: controldata.c:575 #, c-format msgid "The target cluster lacks some required control information:\n" msgstr "目标集群缺少一些必需的控制信息:\n" -#: controldata.c:551 +#: controldata.c:578 #, c-format msgid " checkpoint next XID\n" msgstr " 下一个XID检查点\n" -#: controldata.c:554 +#: controldata.c:581 #, c-format msgid " latest checkpoint next OID\n" msgstr " 最新检查点下一个OID\n" -#: controldata.c:557 +#: controldata.c:584 #, c-format msgid " latest checkpoint next MultiXactId\n" msgstr " 最新检查点下一个MultiXactId\n" -#: controldata.c:561 +#: controldata.c:588 #, c-format msgid " latest checkpoint oldest MultiXactId\n" msgstr " 最新检查点最旧的MultiXactId\n" -#: controldata.c:564 +#: controldata.c:591 +msgid " latest checkpoint oldestXID\n" +msgstr " 最新检查点的最旧XID\n" + +#: controldata.c:594 #, c-format msgid " latest checkpoint next MultiXactOffset\n" msgstr " 最新检查点下一个MultiXactOffset\n" -#: controldata.c:567 +#: controldata.c:597 #, c-format msgid " first WAL segment after reset\n" msgstr " 重置后的第一个WAL段\n" -#: controldata.c:570 +#: controldata.c:600 #, c-format msgid " float8 argument passing method\n" msgstr " float8参数传递方法\n" -#: controldata.c:573 +#: controldata.c:603 #, c-format msgid " maximum alignment\n" msgstr " 最大对齐方式\n" -#: controldata.c:576 +#: controldata.c:606 #, c-format msgid " block size\n" msgstr " 块大小\n" -#: controldata.c:579 +#: controldata.c:609 #, c-format msgid " large relation segment size\n" msgstr " 大关系段大小\n" -#: controldata.c:582 +#: controldata.c:612 #, c-format msgid " WAL block size\n" msgstr " WAL块大小\n" -#: controldata.c:585 +#: controldata.c:615 #, c-format msgid " WAL segment size\n" msgstr " WAL段大小\n" -#: controldata.c:588 +#: controldata.c:618 #, c-format msgid " maximum identifier length\n" msgstr " 最大标识符长度\n" -#: controldata.c:591 +#: controldata.c:621 #, c-format msgid " maximum number of indexed columns\n" msgstr " 最大索引列数\n" -#: controldata.c:594 +#: controldata.c:624 #, c-format msgid " maximum TOAST chunk size\n" msgstr " 最大TOAST块大小\n" -#: controldata.c:598 +#: controldata.c:628 #, c-format msgid " large-object chunk size\n" msgstr " 大对象块大小\n" -#: controldata.c:601 +#: controldata.c:631 #, c-format msgid " dates/times are integers?\n" msgstr " 日期/时间是整数?\n" -#: controldata.c:605 +#: controldata.c:635 #, c-format msgid " data checksum version\n" msgstr " 数据校验和版本\n" -#: controldata.c:607 +#: controldata.c:637 #, c-format msgid "Cannot continue without required control information, terminating\n" msgstr "没有所需的控制信息,无法继续,正在终止\n" -#: controldata.c:622 +#: controldata.c:652 #, c-format msgid "" "old and new pg_controldata alignments are invalid or do not match\n" @@ -549,77 +613,77 @@ msgstr "" "新旧pg_controldata对齐无效或不匹配\n" "可能一个集群是32位安装,另一个是64位安装\n" -#: controldata.c:626 +#: controldata.c:656 #, c-format msgid "old and new pg_controldata block sizes are invalid or do not match\n" msgstr "新旧pg_controldata块大小无效或不匹配\n" -#: controldata.c:629 +#: controldata.c:659 #, c-format msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n" msgstr "新旧pg controldata最大关系段大小无效或不匹配\n" -#: controldata.c:632 +#: controldata.c:662 #, c-format msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n" msgstr "新旧pg_controldata WAL块大小无效或不匹配\n" -#: controldata.c:635 +#: controldata.c:665 #, c-format msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n" msgstr "新旧pg_controldata WAL段大小无效或不匹配\n" -#: controldata.c:638 +#: controldata.c:668 #, c-format msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n" msgstr "新旧pg_controldata最大标识符长度无效或不匹配\n" -#: controldata.c:641 +#: controldata.c:671 #, c-format msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n" msgstr "新旧pg_controldata最大索引列无效或不匹配\n" -#: controldata.c:644 +#: controldata.c:674 #, c-format msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n" msgstr "新旧pg_controldata最大TOAST块大小无效或不匹配\n" -#: controldata.c:649 +#: controldata.c:679 #, c-format msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n" msgstr "旧的和新的pg_controldata大对象块大小无效或不匹配\n" -#: controldata.c:652 +#: controldata.c:682 #, c-format msgid "old and new pg_controldata date/time storage types do not match\n" msgstr "新的和旧的pg_controldata日期/时间存储类型不匹配\n" -#: controldata.c:665 +#: controldata.c:695 #, c-format msgid "old cluster does not use data checksums but the new one does\n" msgstr "旧群集不使用数据校验和,但新群集使用数据校验和\n" -#: controldata.c:668 +#: controldata.c:698 #, c-format msgid "old cluster uses data checksums but the new one does not\n" msgstr "旧群集使用数据校验和,但新群集不使用\n" -#: controldata.c:670 +#: controldata.c:700 #, c-format msgid "old and new cluster pg_controldata checksum versions do not match\n" msgstr "旧群集和新群集pg_controldata校验和版本不匹配\n" -#: controldata.c:681 +#: controldata.c:711 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "向旧的global/pg_control添加\".old\"后缀" -#: controldata.c:686 +#: controldata.c:716 #, c-format msgid "Unable to rename %s to %s.\n" msgstr "无法将%s重命名为%s。\n" -#: controldata.c:689 +#: controldata.c:719 #, c-format msgid "" "\n" @@ -636,42 +700,41 @@ msgstr "" "旧群集就无法安全启动。\n" "\n" -#: dump.c:22 +#: dump.c:20 #, c-format msgid "Creating dump of global objects" msgstr "正在创建全局对象的转储" -#: dump.c:33 +#: dump.c:31 #, c-format msgid "Creating dump of database schemas\n" msgstr "正在创建数据库schemas的转储\n" -#: exec.c:44 +#: exec.c:45 #, c-format msgid "could not get pg_ctl version data using %s: %s\n" msgstr "无法使用using %s获取pg_ctl的版本数据: %s\n" -#: exec.c:50 +#: exec.c:51 #, c-format msgid "could not get pg_ctl version output from %s\n" msgstr "无法从%s获取pg_ctl版本输出\n" -#: exec.c:104 exec.c:108 +#: exec.c:105 exec.c:109 #, c-format msgid "command too long\n" msgstr "命令太长了\n" -#: exec.c:110 util.c:38 util.c:226 +#: exec.c:111 util.c:37 util.c:225 #, c-format msgid "%s\n" msgstr "%s\n" -#: exec.c:149 exec.c:204 option.c:105 option.c:227 -#, c-format -msgid "could not write to log file \"%s\"\n" -msgstr "不能写到日志文件\"%s\"中\n" +#: exec.c:150 option.c:217 +msgid "could not open log file \"%s\": %m\n" +msgstr "无法打开日志文件\"%s\": %m\n" -#: exec.c:178 +#: exec.c:179 #, c-format msgid "" "\n" @@ -680,41 +743,45 @@ msgstr "" "\n" "*失败*" -#: exec.c:181 +#: exec.c:182 #, c-format msgid "There were problems executing \"%s\"\n" msgstr "执行\"%s\"时出现问题\n" -#: exec.c:184 +#: exec.c:185 #, c-format msgid "" "Consult the last few lines of \"%s\" or \"%s\" for\n" "the probable cause of the failure.\n" msgstr "有关故障的可能原因,请查阅\"%s\"或 \"%s\"的最后几行。\n" -#: exec.c:189 +#: exec.c:190 #, c-format msgid "" "Consult the last few lines of \"%s\" for\n" "the probable cause of the failure.\n" msgstr "有关故障的可能原因,请查阅\"%s\"的最后几行。\n" -#: exec.c:230 +#: exec.c:205 option.c:226 +msgid "could not write to log file \"%s\": %m\n" +msgstr "不能写到日志文件\"%s\": %m\n" + +#: exec.c:231 #, c-format msgid "could not open file \"%s\" for reading: %s\n" msgstr "无法打开文件\"%s\"用于读取: %s\n" -#: exec.c:257 +#: exec.c:258 #, c-format msgid "You must have read and write access in the current directory.\n" msgstr "您必须具有当前目录中的读写权限。\n" -#: exec.c:310 exec.c:372 exec.c:427 +#: exec.c:311 exec.c:377 #, c-format msgid "check for \"%s\" failed: %s\n" msgstr "检查\"%s\"失败: %s\n" -#: exec.c:313 exec.c:375 +#: exec.c:314 exec.c:380 #, c-format msgid "\"%s\" is not a directory\n" msgstr "\"%s\"不是一个目录\n" @@ -724,87 +791,90 @@ msgstr "\"%s\"不是一个目录\n" msgid "check for \"%s\" failed: not a regular file\n" msgstr "检查\"%s\"失败:不是常规文件\n" -#: exec.c:442 -#, c-format -msgid "check for \"%s\" failed: cannot read file (permission denied)\n" -msgstr "检查\"%s\"失败:无法读取文件(权限被拒绝)\n" - -#: exec.c:450 +#: exec.c:433 #, c-format msgid "check for \"%s\" failed: cannot execute (permission denied)\n" msgstr "检查\"%s\"失败:无法执行(权限被拒绝)\n" -#: file.c:48 file.c:66 +#: exec.c:439 +msgid "check for \"%s\" failed: cannot execute\n" +msgstr "检查\"%s\"失败:无法执行\n" + +#: exec.c:449 +msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n" +msgstr "检查\"%s\"失败:版本不正确:找到\"%s\",应为\"%s\"\n" + +#: file.c:43 file.c:61 #, c-format msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" msgstr "克隆关系\"%s.%s\"时出错(从\"%s\"到\"%s\"): %s\n" -#: file.c:55 +#: file.c:50 #, c-format msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n" msgstr "克隆关系\"%s.%s\"时出错:无法打开文件\"%s\": %s\n" -#: file.c:60 +#: file.c:55 #, c-format msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n" msgstr "克隆关系\"%s.%s\"时出错:无法创建文件\"%s\": %s\n" -#: file.c:92 file.c:195 +#: file.c:87 file.c:190 #, c-format msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n" msgstr "复制关系\"%s.%s\"时出错:无法打开文件\"%s\": %s\n" -#: file.c:97 file.c:204 +#: file.c:92 file.c:199 #, c-format msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n" msgstr "复制关系\"%s.%s\"时出错:无法创建文件\"%s\": %s\n" -#: file.c:111 file.c:228 +#: file.c:106 file.c:223 #, c-format msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n" msgstr "复制关系\"%s.%s\"时出错:无法读取文件\"%s\": %s\n" -#: file.c:123 file.c:306 +#: file.c:118 file.c:301 #, c-format msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n" msgstr "复制关系\"%s.%s\"时出错:无法写入文件 \"%s\": %s\n" -#: file.c:137 +#: file.c:132 #, c-format msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" msgstr "将关系\"%s.%s\"(\"%s\"复制到\"%s\")时出错: %s\n" -#: file.c:156 +#: file.c:151 #, c-format msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" msgstr "为关系\"%s.%s\"创建链接时出错(从\"%s\"到\"%s\"): %s\n" -#: file.c:199 +#: file.c:194 #, c-format msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n" msgstr "复制关系\"%s.%s\"时出错:无法统计文件\"%s\": %s\n" -#: file.c:231 +#: file.c:226 #, c-format msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n" msgstr "复制关系\"%s.%s\"时出错:在文件\"%s\"中找到部分页\n" -#: file.c:333 file.c:350 +#: file.c:328 file.c:345 #, c-format msgid "could not clone file between old and new data directories: %s\n" msgstr "无法在新旧数据目录之间克隆文件: %s\n" -#: file.c:346 +#: file.c:341 #, c-format msgid "could not create file \"%s\": %s\n" msgstr "无法创建文件 \"%s\": %s\n" -#: file.c:357 +#: file.c:352 #, c-format msgid "file cloning not supported on this platform\n" msgstr "此平台不支持文件克隆\n" -#: file.c:374 +#: file.c:369 #, c-format msgid "" "could not create hard link between old and new data directories: %s\n" @@ -813,7 +883,7 @@ msgstr "" "无法在新旧数据目录之间创建硬链接: %s\n" "在链接模式下,旧的和新的数据目录必须在同一文件系统上。\n" -#: function.c:116 +#: function.c:114 #, c-format msgid "" "\n" @@ -853,32 +923,31 @@ msgstr "" "在每个受影响的数据库中:\n" "\n" -#: function.c:134 +#: function.c:132 #, c-format msgid " %s\n" msgstr " %s\n" -#: function.c:144 +#: function.c:142 #, c-format msgid "Remove the problem functions from the old cluster to continue.\n" msgstr "从旧群集中删除问题函数以继续。\n" -#: function.c:191 +#: function.c:189 #, c-format msgid "Checking for presence of required libraries" msgstr "正在检查是否存在所需的库" -#: function.c:248 +#: function.c:242 #, c-format msgid "could not load library \"%s\": %s" msgstr "无法加载库 \"%s\": %s" -#: function.c:259 info.c:633 -#, c-format -msgid "Database: %s\n" -msgstr "数据库: %s\n" +#: function.c:253 +msgid "In database: %s\n" +msgstr "在数据库: %s\n" -#: function.c:269 +#: function.c:263 #, c-format msgid "" "Your installation references loadable libraries that are missing from the\n" @@ -894,57 +963,57 @@ msgstr "" " %s\n" "\n" -#: info.c:133 +#: info.c:131 #, c-format msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n" msgstr "数据库\"%2$s\"中OID %1$u的关系名称不匹配:旧名称 \"%3$s.%4$s\",新名称\"%5$s.%6$s\"\n" -#: info.c:153 +#: info.c:151 #, c-format msgid "Failed to match up old and new tables in database \"%s\"\n" msgstr "未能匹配数据库\"%s\"中的新旧表\n" -#: info.c:242 +#: info.c:240 #, c-format msgid " which is an index on \"%s.%s\"" msgstr " 这是\"%s.%s\"上的索引" -#: info.c:252 +#: info.c:250 #, c-format msgid " which is an index on OID %u" msgstr " 哪一个OID %u上的索引" -#: info.c:264 +#: info.c:262 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr " 哪一个是\"%s.%s\"的TOAST表" -#: info.c:272 +#: info.c:270 #, c-format msgid " which is the TOAST table for OID %u" msgstr " 哪一个是OID %u的TOAST表" -#: info.c:276 +#: info.c:274 #, c-format msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n" msgstr "在旧群集中找不到与数据库\"%2$s\"中OID %1$u的新关系的匹配项: %3$s\n" -#: info.c:279 +#: info.c:277 #, c-format msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n" msgstr "在新群集中找不到与数据库\"%2$s\"中OID %1$u的旧关系的匹配项:%3$s\n" -#: info.c:291 +#: info.c:289 #, c-format msgid "mappings for database \"%s\":\n" msgstr "映射为数据库\"%s\":\n" -#: info.c:294 +#: info.c:292 #, c-format msgid "%s.%s: %u to %u\n" msgstr "%s.%s: %u到%u\n" -#: info.c:299 info.c:635 +#: info.c:297 info.c:633 #, c-format msgid "" "\n" @@ -953,7 +1022,7 @@ msgstr "" "\n" "\n" -#: info.c:324 +#: info.c:322 #, c-format msgid "" "\n" @@ -962,7 +1031,7 @@ msgstr "" "\n" "源数据库:\n" -#: info.c:326 +#: info.c:324 #, c-format msgid "" "\n" @@ -971,7 +1040,12 @@ msgstr "" "\n" "目标数据库:\n" -#: info.c:646 +#: info.c:631 +#, c-format +msgid "Database: %s\n" +msgstr "数据库: %s\n" + +#: info.c:644 #, c-format msgid "relname: %s.%s: reloid: %u reltblspace: %s\n" msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n" @@ -981,57 +1055,61 @@ msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n" msgid "%s: cannot be run as root\n" msgstr "%s: 不能使用root用户运行\n" -#: option.c:174 +#: option.c:170 #, c-format msgid "invalid old port number\n" msgstr "旧端口号无效\n" -#: option.c:182 +#: option.c:175 #, c-format msgid "invalid new port number\n" msgstr "新端口号无效\n" -#: option.c:208 -#, c-format -msgid "Running in verbose mode\n" -msgstr "以详细模式运行\n" - -#: option.c:217 +#: option.c:207 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "请用 \"%s --help\" 获取更多的信息.\n" -#: option.c:252 +#: option.c:214 +msgid "too many command-line arguments (first is \"%s\")\n" +msgstr "命令行参数太多 (第一个是 \"%s\")\n" + +#: option.c:220 +#, c-format +msgid "Running in verbose mode\n" +msgstr "以详细模式运行\n" + +#: option.c:251 msgid "old cluster binaries reside" msgstr "旧群集二进制文件驻留" -#: option.c:254 +#: option.c:253 msgid "new cluster binaries reside" msgstr "新群集二进制文件驻留" -#: option.c:256 +#: option.c:255 msgid "old cluster data resides" msgstr "旧群集数据驻留" -#: option.c:258 +#: option.c:257 msgid "new cluster data resides" msgstr "新群集数据驻留" -#: option.c:260 +#: option.c:259 msgid "sockets will be created" -msgstr "" +msgstr "将创建套接字" -#: option.c:277 option.c:371 +#: option.c:276 option.c:374 #, c-format msgid "could not determine current directory\n" msgstr "无法确定当前目录\n" -#: option.c:280 +#: option.c:279 #, c-format msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n" msgstr "无法从Windows上的新群集数据目录内运行pg_upgrade\n" -#: option.c:289 +#: option.c:288 #, c-format msgid "" "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n" @@ -1040,12 +1118,12 @@ msgstr "" "pg_upgrade将PostgreSQL集群升级到其他主版本。\n" "\n" -#: option.c:290 +#: option.c:289 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: option.c:291 +#: option.c:290 #, c-format msgid "" " pg_upgrade [OPTION]...\n" @@ -1054,20 +1132,23 @@ msgstr "" " pg_upgrade [选项]...\n" "\n" -#: option.c:292 +#: option.c:291 #, c-format msgid "Options:\n" msgstr "选项:\n" -#: option.c:293 +#: option.c:292 #, c-format msgid " -b, --old-bindir=BINDIR old cluster executable directory\n" msgstr " -b, --old-bindir=BINDIR 旧群集可执行目录\n" -#: option.c:294 -#, c-format -msgid " -B, --new-bindir=BINDIR new cluster executable directory\n" -msgstr " -B, --new-bindir=BINDIR 新群集可执行目录\n" +#: option.c:293 +msgid "" +" -B, --new-bindir=BINDIR new cluster executable directory (default\n" +" same directory as pg_upgrade)\n" +msgstr "" +" -B, --new-bindir=BINDIR 新群集可执行目录\n" +" (默认目录与pg_upgrade相同)\n" #: option.c:295 #, c-format @@ -1085,9 +1166,8 @@ msgid " -D, --new-datadir=DATADIR new cluster data directory\n" msgstr " -D, --new-datadir=DATADIR 新群集数据目录\n" #: option.c:298 -#, c-format -msgid " -j, --jobs number of simultaneous processes or threads to use\n" -msgstr " -j, --jobs 要同时使用的进程或线程数\n" +msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n" +msgstr " -j, --jobs=NUM 要同时使用的进程或线程数\n" #: option.c:299 #, c-format @@ -1120,9 +1200,8 @@ msgid " -r, --retain retain SQL and log files after success\n" msgstr " -r, --retain 成功后保留SQL和日志文件\n" #: option.c:305 -#, c-format -msgid " -s, --socketdir=DIR socket directory to use (default CWD)\n" -msgstr " -s, --socketdir=DIR 要使用的套接字目录(默认值为CWD)\n" +msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" +msgstr " -s, --socketdir=DIR 要使用的套接字目录(默认值为当前路径)\n" #: option.c:306 #, c-format @@ -1228,12 +1307,17 @@ msgstr "" #, c-format msgid "" "\n" -"Report bugs to .\n" +"Report bugs to <%s>.\n" msgstr "" "\n" -"报告错误至 .\n" +"臭虫报告至<%s>.\n" + +#: option.c:340 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 主页: <%s>\n" -#: option.c:375 +#: option.c:380 #, c-format msgid "" "You must identify the directory where the %s.\n" @@ -1242,62 +1326,61 @@ msgstr "" "必须标识%s所在的目录。\n" "请使用%s命令行选项或%s环境变量。\n" -#: option.c:427 +#: option.c:432 #, c-format msgid "Finding the real data directory for the source cluster" msgstr "正在查找源群集的实际数据目录" -#: option.c:429 +#: option.c:434 #, c-format msgid "Finding the real data directory for the target cluster" msgstr "正在查找目标群集的实际数据目录" -#: option.c:441 +#: option.c:446 #, c-format msgid "could not get data directory using %s: %s\n" msgstr "无法使用%s获取数据目录: %s\n" -#: option.c:501 +#: option.c:505 #, c-format msgid "could not read line %d from file \"%s\": %s\n" msgstr "无法从文件\"%2$s\"读取第%1$d行: %3$s\n" -#: option.c:519 +#: option.c:522 #, c-format msgid "user-supplied old port number %hu corrected to %hu\n" msgstr "用户提供的旧端口号%hu已更正为%hu\n" -#: parallel.c:128 parallel.c:241 +#: parallel.c:127 parallel.c:238 #, c-format msgid "could not create worker process: %s\n" msgstr "无法创建工作进程: %s\n" -#: parallel.c:147 parallel.c:262 +#: parallel.c:146 parallel.c:259 #, c-format msgid "could not create worker thread: %s\n" msgstr "无法创建工作线程: %s\n" -#: parallel.c:305 -#, c-format -msgid "waitpid() failed: %s\n" -msgstr "waitpid()失败: %s\n" +#: parallel.c:300 +msgid "%s() failed: %s\n" +msgstr "%s()失败: %s\n" -#: parallel.c:309 +#: parallel.c:304 #, c-format msgid "child process exited abnormally: status %d\n" msgstr "子进程异常退出:状态 %d\n" -#: parallel.c:324 +#: parallel.c:319 #, c-format msgid "child worker exited abnormally: %s\n" msgstr "子工作线程异常退出: %s\n" -#: pg_upgrade.c:109 +#: pg_upgrade.c:107 #, c-format msgid "could not read permissions of directory \"%s\": %s\n" msgstr "无法读取目录\"%s\"的权限: %s\n" -#: pg_upgrade.c:126 +#: pg_upgrade.c:122 #, c-format msgid "" "\n" @@ -1306,19 +1389,19 @@ msgid "" msgstr "" "\n" "正在执行升级\n" -"------------\n" +"------------------\n" -#: pg_upgrade.c:169 +#: pg_upgrade.c:165 #, c-format msgid "Setting next OID for new cluster" msgstr "为新群集设置下一个OID" -#: pg_upgrade.c:176 +#: pg_upgrade.c:172 #, c-format msgid "Sync data directory to disk" msgstr "将数据目录同步到磁盘" -#: pg_upgrade.c:188 +#: pg_upgrade.c:183 #, c-format msgid "" "\n" @@ -1327,9 +1410,14 @@ msgid "" msgstr "" "\n" "升级完成\n" -"--------\n" +"----------------\n" + +#: pg_upgrade.c:216 +#, c-format +msgid "%s: could not find own program executable\n" +msgstr "%s: 无法找到执行文件\n" -#: pg_upgrade.c:234 +#: pg_upgrade.c:242 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" @@ -1338,7 +1426,7 @@ msgstr "" "好像有一个postmaster正在为旧群集服务。\n" "请关闭那个postmaster,然后再试一次。\n" -#: pg_upgrade.c:247 +#: pg_upgrade.c:255 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" @@ -1347,127 +1435,121 @@ msgstr "" "好像有一个postmaster正在为新群集服务。\n" "请关闭那个postmaster,然后再试一次。\n" -#: pg_upgrade.c:253 -#, c-format -msgid "%s: could not find own program executable\n" -msgstr "%s: 无法找到执行文件\n" - -#: pg_upgrade.c:270 +#: pg_upgrade.c:269 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "正在分析新群集中的所有行" -#: pg_upgrade.c:283 +#: pg_upgrade.c:282 #, c-format msgid "Freezing all rows in the new cluster" msgstr "正在冻结新群集中的所有行" -#: pg_upgrade.c:303 +#: pg_upgrade.c:302 #, c-format msgid "Restoring global objects in the new cluster" msgstr "正在在新群集中还原全局对象" -#: pg_upgrade.c:318 +#: pg_upgrade.c:317 #, c-format msgid "Restoring database schemas in the new cluster\n" msgstr "在新群集中还原数据库schemas\n" -#: pg_upgrade.c:424 +#: pg_upgrade.c:421 #, c-format msgid "Deleting files from new %s" msgstr "正在从新%s中删除文件" -#: pg_upgrade.c:428 +#: pg_upgrade.c:425 #, c-format msgid "could not delete directory \"%s\"\n" msgstr "无法删除目录\"%s\"\n" -#: pg_upgrade.c:447 +#: pg_upgrade.c:444 #, c-format msgid "Copying old %s to new server" msgstr "正在将旧的 %s复制到新服务中" -#: pg_upgrade.c:474 +#: pg_upgrade.c:470 +msgid "Setting oldest XID for new cluster" +msgstr "为新群集设置最旧的XID" + +#: pg_upgrade.c:478 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "正在为新集群设置下一个事务ID和epoch" -#: pg_upgrade.c:504 +#: pg_upgrade.c:508 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "正在为新集群设置下一个多事务ID和偏移量" -#: pg_upgrade.c:528 +#: pg_upgrade.c:532 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "在新集群中设置最旧的多事务ID" -#: pg_upgrade.c:548 +#: pg_upgrade.c:552 #, c-format msgid "Resetting WAL archives" msgstr "正在重置WAL归档" -#: pg_upgrade.c:591 +#: pg_upgrade.c:595 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "正在在新集群中设置frozenxid和minmxid计数器" -#: pg_upgrade.c:593 +#: pg_upgrade.c:597 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "正在在新群集中设置minmxid计数器" -#: relfilenode.c:36 +#: relfilenode.c:35 #, c-format msgid "Cloning user relation files\n" msgstr "正在克隆用户关系文件\n" -#: relfilenode.c:39 +#: relfilenode.c:38 #, c-format msgid "Copying user relation files\n" msgstr "正在复制用户关系文件\n" -#: relfilenode.c:42 +#: relfilenode.c:41 #, c-format msgid "Linking user relation files\n" msgstr "正在链接用户关系文件\n" -#: relfilenode.c:118 +#: relfilenode.c:115 #, c-format msgid "old database \"%s\" not found in the new cluster\n" msgstr "在新群集中找不到旧数据库\"%s\"\n" -#: relfilenode.c:239 +#: relfilenode.c:230 #, c-format msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n" msgstr "检查文件是否存在\"%s.%s\"时出错 (\"%s\" 到 \"%s\"): %s\n" -#: relfilenode.c:257 +#: relfilenode.c:248 #, c-format msgid "rewriting \"%s\" to \"%s\"\n" msgstr "正在将 \"%s\"重写为\"%s\"\n" -#: relfilenode.c:265 +#: relfilenode.c:256 #, c-format msgid "cloning \"%s\" to \"%s\"\n" msgstr "正在将 \"%s\"克隆到\"%s\"\n" -#: relfilenode.c:270 +#: relfilenode.c:261 #, c-format msgid "copying \"%s\" to \"%s\"\n" msgstr "正在将 \"%s\"复制到\"%s\"\n" -#: relfilenode.c:275 +#: relfilenode.c:266 #, c-format msgid "linking \"%s\" to \"%s\"\n" msgstr "正在将\"%s\"链接到\"%s\"\n" -#: server.c:34 -#, c-format -msgid "connection to database failed: %s" -msgstr "连接到数据库失败: %s" - -#: server.c:40 server.c:142 util.c:136 util.c:166 +#: server.c:38 server.c:142 util.c:135 util.c:165 #, c-format msgid "Failure, exiting\n" msgstr "故障,退出\n" @@ -1489,25 +1571,22 @@ msgstr "" "%s" #: server.c:168 -#, c-format -msgid "could not open version file: %s\n" -msgstr "无法打开版本文件: %s\n" +msgid "could not open version file \"%s\": %m\n" +msgstr "无法打开版本文件\"%s\": %m\n" #: server.c:172 -#, c-format -msgid "could not parse PG_VERSION file from %s\n" -msgstr "无法从%s解析PG_VERSION文件\n" +msgid "could not parse version file \"%s\"\n" +msgstr "无法解析版本文件\"%s\"\n" -#: server.c:295 -#, c-format +#: server.c:298 msgid "" "\n" -"connection to database failed: %s" -msgstr "" +"%s" +msgstr "" "\n" -"连接到数据库失败: %s" +"%s" -#: server.c:300 +#: server.c:302 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -1516,7 +1595,7 @@ msgstr "" "无法连接到用命令启动的源postmaster :\n" "%s\n" -#: server.c:304 +#: server.c:306 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -1525,22 +1604,22 @@ msgstr "" "无法连接到用命令启动的目标postmaster :\n" "%s\n" -#: server.c:318 +#: server.c:320 #, c-format msgid "pg_ctl failed to start the source server, or connection failed\n" msgstr "pg_ctl无法启动源服务器,或者连接失败\n" -#: server.c:320 +#: server.c:322 #, c-format msgid "pg_ctl failed to start the target server, or connection failed\n" msgstr "pg_ctl无法启动目标服务器,或连接失败\n" -#: server.c:365 +#: server.c:367 #, c-format msgid "out of memory\n" -msgstr "内存溢出\n" +msgstr "内存不足\n" -#: server.c:378 +#: server.c:380 #, c-format msgid "libpq environment variable %s has a non-local server value: %s\n" msgstr "libpq环境变量%s具有非本地服务器值: %s\n" @@ -1554,47 +1633,47 @@ msgstr "" "使用表空间时无法升级到相同的系统目录版本。\n" "或者,使用表空间时无法从同一系统目录版本升级。\n" -#: tablespace.c:87 +#: tablespace.c:86 #, c-format msgid "tablespace directory \"%s\" does not exist\n" msgstr "表空间目录\"%s\"不存在\n" -#: tablespace.c:91 +#: tablespace.c:90 #, c-format msgid "could not stat tablespace directory \"%s\": %s\n" msgstr "无法统计表空间目录\"%s\": %s\n" -#: tablespace.c:96 +#: tablespace.c:95 #, c-format msgid "tablespace path \"%s\" is not a directory\n" msgstr "表空间路径\"%s\"不是目录\n" -#: util.c:50 +#: util.c:49 #, c-format msgid " " msgstr " " -#: util.c:83 +#: util.c:82 #, c-format msgid "%-*s" msgstr "%-*s" -#: util.c:175 +#: util.c:174 #, c-format msgid "ok" -msgstr "OK" +msgstr "成功" -#: version.c:32 +#: version.c:29 #, c-format msgid "Checking for large objects" msgstr "正在检查大对象" -#: version.c:80 version.c:382 +#: version.c:77 version.c:419 #, c-format msgid "warning" msgstr "警告" -#: version.c:82 +#: version.c:79 #, c-format msgid "" "\n" @@ -1610,7 +1689,7 @@ msgstr "" "pg_largeobject_metadata表。\n" "\n" -#: version.c:88 +#: version.c:85 #, c-format msgid "" "\n" @@ -1629,58 +1708,60 @@ msgstr "" "当数据库由psql执行时,超级用户将设置默认权限。\n" "\n" -#: version.c:118 +#: version.c:272 #, c-format msgid "Checking for incompatible \"line\" data type" msgstr "正在检查不兼容的\"line\"数据类型" -#: version.c:180 -#, c-format +#: version.c:279 msgid "" -"Your installation contains the \"line\" data type in user tables. This\n" -"data type changed its internal and input/output format between your old\n" -"and new clusters so this cluster cannot currently be upgraded. You can\n" -"remove the problem tables and restart the upgrade. A list of the problem\n" -"columns is in the file:\n" +"Your installation contains the \"line\" data type in user tables.\n" +"This data type changed its internal and input/output format\n" +"between your old and new versions so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" "您的安装包含用户表中的\"line\"数据类型。\n" -"此数据类型更改了旧群集和新群集之间的内部格式和输入/输出格式,\n" +"此数据类型更改了旧群集和新群集之间的\n" +"内部格式和输入/输出格式,\n" "因此当前无法升级此群集。\n" "您可以删除问题表并重新启动升级。\n" "文件中有问题列的列表:\n" " %s\n" "\n" -#: version.c:215 +#: version.c:310 #, c-format msgid "Checking for invalid \"unknown\" user columns" msgstr "正在检查无效的\"unknown\"用户列" -#: version.c:281 -#, c-format +#: version.c:317 msgid "" -"Your installation contains the \"unknown\" data type in user tables. This\n" -"data type is no longer allowed in tables, so this cluster cannot currently\n" -"be upgraded. You can remove the problem tables and restart the upgrade.\n" +"Your installation contains the \"unknown\" data type in user tables.\n" +"This data type is no longer allowed in tables, so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" "A list of the problem columns is in the file:\n" " %s\n" "\n" msgstr "" "您的安装包含用户表中的\"unknown\"数据类型。\n" -"表中不再允许此数据类型,因此当前无法升级此群集。\n" +"表中不再允许此数据类型,\n" +"因此当前无法升级此群集。\n" "您可以删除问题表并重新启动升级。\n" "文件中有问题列的列表 :\n" " %s\n" "\n" -#: version.c:304 +#: version.c:341 #, c-format msgid "Checking for hash indexes" msgstr "正在检查哈希索引" -#: version.c:384 +#: version.c:421 #, c-format msgid "" "\n" @@ -1697,7 +1778,7 @@ msgstr "" "升级后,您将得到REINDEX指令。\n" "\n" -#: version.c:390 +#: version.c:427 #, c-format msgid "" "\n" @@ -1717,3 +1798,53 @@ msgstr "" "当数据库超级用户通过psql执行时,将重新创建所有无效的索引;\n" "在此之前,不会使用这些索引。\n" "\n" + +#: version.c:453 +msgid "Checking for invalid \"sql_identifier\" user columns" +msgstr "正在检查无效的\"sql_identifier\"用户列" + +#: version.c:461 +msgid "" +"Your installation contains the \"sql_identifier\" data type in user tables.\n" +"The on-disk format for this data type has changed, so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +"A list of the problem columns is in the file:\n" +" %s\n" +"\n" +msgstr "" +"您的安装包含用户表中的\"sql_identifier\"数据类型。\n" +"此数据类型的磁盘格式已更改。\n" +"因此当前无法升级此群集。\n" +"您可以删除问题表并重新启动升级。\n" +"文件中有问题列的列表 :\n" +" %s\n" +"\n" + +#: version.c:485 +msgid "Checking for extension updates" +msgstr "正在检查扩展更新" + +#: version.c:537 +#, c-format +msgid "notice" +msgstr "通知" + +#: version.c:538 +msgid "" +"\n" +"Your installation contains extensions that should be updated\n" +"with the ALTER EXTENSION command. The file\n" +" %s\n" +"when executed by psql by the database superuser will update\n" +"these extensions.\n" +"\n" +msgstr "" +"\n" +"您的安装包含应使用\n" +"ALTER EXTENSION命令更新的扩展。 文件\n" +" %s\n" +"当数据库超级用户通过psql执行时,\n" +"将更新这些扩展。\n" +"\n" + diff --git a/src/bin/pg_verifybackup/po/de.po b/src/bin/pg_verifybackup/po/de.po index 6cf9d8fee1..cde30cc51f 100644 --- a/src/bin/pg_verifybackup/po/de.po +++ b/src/bin/pg_verifybackup/po/de.po @@ -1,13 +1,13 @@ # German message translation file for pg_verifybackup -# Copyright (C) 2020-2021 PostgreSQL Global Development Group +# Copyright (C) 2020-2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: pg_verifybackup (PostgreSQL) 14\n" +"Project-Id-Version: pg_verifybackup (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-17 02:45+0000\n" -"PO-Revision-Date: 2021-04-17 09:54+0200\n" +"POT-Creation-Date: 2022-05-10 15:46+0000\n" +"PO-Revision-Date: 2022-05-10 18:16+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -15,21 +15,26 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "Fatal: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "Warnung: " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "Tipp: " + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -41,85 +46,89 @@ msgstr "Speicher aufgebraucht\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" -#: ../../common/jsonapi.c:1066 +#: ../../common/jsonapi.c:1075 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Escape-Sequenz »\\%s« ist nicht gültig." -#: ../../common/jsonapi.c:1069 +#: ../../common/jsonapi.c:1078 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Zeichen mit Wert 0x%02x muss escapt werden." -#: ../../common/jsonapi.c:1072 +#: ../../common/jsonapi.c:1081 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Ende der Eingabe erwartet, aber »%s« gefunden." -#: ../../common/jsonapi.c:1075 +#: ../../common/jsonapi.c:1084 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Array-Element oder »]« erwartet, aber »%s« gefunden." -#: ../../common/jsonapi.c:1078 +#: ../../common/jsonapi.c:1087 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "»,« oder »]« erwartet, aber »%s« gefunden." -#: ../../common/jsonapi.c:1081 +#: ../../common/jsonapi.c:1090 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "»:« erwartet, aber »%s« gefunden." -#: ../../common/jsonapi.c:1084 +#: ../../common/jsonapi.c:1093 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "JSON-Wert erwartet, aber »%s« gefunden." -#: ../../common/jsonapi.c:1087 +#: ../../common/jsonapi.c:1096 msgid "The input string ended unexpectedly." msgstr "Die Eingabezeichenkette endete unerwartet." -#: ../../common/jsonapi.c:1089 +#: ../../common/jsonapi.c:1098 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Zeichenkette oder »}« erwartet, aber »%s« gefunden." -#: ../../common/jsonapi.c:1092 +#: ../../common/jsonapi.c:1101 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "»,« oder »}« erwartet, aber »%s« gefunden." -#: ../../common/jsonapi.c:1095 +#: ../../common/jsonapi.c:1104 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Zeichenkette erwartet, aber »%s« gefunden." -#: ../../common/jsonapi.c:1098 +#: ../../common/jsonapi.c:1107 #, c-format msgid "Token \"%s\" is invalid." msgstr "Token »%s« ist ungültig." -#: ../../common/jsonapi.c:1101 +#: ../../common/jsonapi.c:1110 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kann nicht in »text« umgewandelt werden." -#: ../../common/jsonapi.c:1103 +#: ../../common/jsonapi.c:1112 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "Nach »\\u« müssen vier Hexadezimalziffern folgen." -#: ../../common/jsonapi.c:1106 +#: ../../common/jsonapi.c:1115 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Unicode-Escape-Werte können nicht für Code-Punkt-Werte über 007F verwendet werden, wenn die Kodierung nicht UTF8 ist." -#: ../../common/jsonapi.c:1108 +#: ../../common/jsonapi.c:1117 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicode-High-Surrogate darf nicht auf ein High-Surrogate folgen." -#: ../../common/jsonapi.c:1110 +#: ../../common/jsonapi.c:1119 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicode-Low-Surrogate muss auf ein High-Surrogate folgen." +#: parse_manifest.c:150 +msgid "parsing failed" +msgstr "Parsen fehlgeschlagen" + #: parse_manifest.c:152 msgid "manifest ended unexpectedly" msgstr "Manifest endete unerwartet" @@ -274,149 +283,137 @@ msgstr "Manifestprüfsumme stimmt nicht überein" msgid "could not parse backup manifest: %s" msgstr "konnte Backup-Manifest nicht parsen: %s" -#: pg_verifybackup.c:255 pg_verifybackup.c:265 pg_verifybackup.c:277 +#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." #: pg_verifybackup.c:264 #, c-format msgid "no backup directory specified" msgstr "kein Backup-Verzeichnis angegeben" -#: pg_verifybackup.c:275 +#: pg_verifybackup.c:274 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_verifybackup.c:298 +#: pg_verifybackup.c:297 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"Das Programm »%s« wird von %s benötigt, aber wurde nicht im\n" -"selben Verzeichnis wie »%s« gefunden.\n" -"Prüfen Sie Ihre Installation." +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden" -#: pg_verifybackup.c:303 +#: pg_verifybackup.c:300 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"Das Programm »%s« wurde von %s gefunden,\n" -"aber es hatte nicht die gleiche Version wie %s.\n" -"Prüfen Sie Ihre Installation." +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s" -#: pg_verifybackup.c:361 +#: pg_verifybackup.c:356 #, c-format msgid "backup successfully verified\n" msgstr "Backup erfolgreich überprüft\n" -#: pg_verifybackup.c:387 pg_verifybackup.c:723 +#: pg_verifybackup.c:382 pg_verifybackup.c:718 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" -#: pg_verifybackup.c:391 +#: pg_verifybackup.c:386 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" -#: pg_verifybackup.c:411 pg_verifybackup.c:752 +#: pg_verifybackup.c:406 pg_verifybackup.c:745 #, c-format msgid "could not read file \"%s\": %m" msgstr "konnte Datei »%s« nicht lesen: %m" -#: pg_verifybackup.c:414 +#: pg_verifybackup.c:409 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "konnte Datei »%s« nicht lesen: %d von %lld gelesen" -#: pg_verifybackup.c:474 +#: pg_verifybackup.c:469 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "doppelter Pfadname im Backup-Manifest: »%s«" -#: pg_verifybackup.c:537 pg_verifybackup.c:544 +#: pg_verifybackup.c:532 pg_verifybackup.c:539 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: pg_verifybackup.c:576 +#: pg_verifybackup.c:571 #, c-format msgid "could not close directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht schließen: %m" -#: pg_verifybackup.c:596 +#: pg_verifybackup.c:591 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "konnte »stat« für Datei oder Verzeichnis »%s« nicht ausführen: %m" -#: pg_verifybackup.c:619 +#: pg_verifybackup.c:614 #, c-format msgid "\"%s\" is not a file or directory" msgstr "»%s« ist keine Datei und kein Verzeichnis" -#: pg_verifybackup.c:629 +#: pg_verifybackup.c:624 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "»%s« ist auf der Festplatte vorhanden, aber nicht im Manifest" -#: pg_verifybackup.c:641 +#: pg_verifybackup.c:636 #, c-format msgid "\"%s\" has size %lld on disk but size %zu in the manifest" msgstr "»%s« hat Größe %lld auf Festplatte aber Größe %zu im Manifest" -#: pg_verifybackup.c:668 +#: pg_verifybackup.c:663 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "»%s« steht im Manifest, ist aber nicht auf der Festplatte vorhanden" -#: pg_verifybackup.c:731 +#: pg_verifybackup.c:726 #, c-format msgid "could not initialize checksum of file \"%s\"" msgstr "konnte Prüfsumme der Datei »%s« nicht initialisieren" -#: pg_verifybackup.c:743 +#: pg_verifybackup.c:738 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "konnte Prüfsumme der Datei »%s« nicht aktualisieren" -#: pg_verifybackup.c:758 +#: pg_verifybackup.c:751 #, c-format msgid "could not close file \"%s\": %m" msgstr "konnte Datei »%s« nicht schließen: %m" -#: pg_verifybackup.c:777 +#: pg_verifybackup.c:770 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "Datei »%s« sollte %zu Bytes enthalten, aber %zu Bytes wurden gelesen" -#: pg_verifybackup.c:787 +#: pg_verifybackup.c:780 #, c-format msgid "could not finalize checksum of file \"%s\"" msgstr "konnte Prüfsumme der Datei »%s« nicht abschließen" -#: pg_verifybackup.c:795 +#: pg_verifybackup.c:788 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "Datei »%s« hat Prüfsumme mit Länge %d, aber %d wurde erwartet" -#: pg_verifybackup.c:799 +#: pg_verifybackup.c:792 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "Prüfsumme stimmt nicht überein für Datei »%s«" -#: pg_verifybackup.c:823 +#: pg_verifybackup.c:816 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "Parsen des WAL fehlgeschlagen für Zeitleiste %u" -#: pg_verifybackup.c:909 +#: pg_verifybackup.c:902 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" @@ -425,7 +422,7 @@ msgstr "" "%s überprüft ein Backup anhand eines Backup-Manifests.\n" "\n" -#: pg_verifybackup.c:910 +#: pg_verifybackup.c:903 #, c-format msgid "" "Usage:\n" @@ -436,57 +433,57 @@ msgstr "" " %s [OPTION]... BACKUPVERZ\n" "\n" -#: pg_verifybackup.c:911 +#: pg_verifybackup.c:904 #, c-format msgid "Options:\n" msgstr "Optionen:\n" -#: pg_verifybackup.c:912 +#: pg_verifybackup.c:905 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error bei Fehler sofort beenden\n" -#: pg_verifybackup.c:913 +#: pg_verifybackup.c:906 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=REL-PFAD angegebenen Pfad ignorieren\n" -#: pg_verifybackup.c:914 +#: pg_verifybackup.c:907 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=PFAD angegebenen Pfad für Manifest verwenden\n" -#: pg_verifybackup.c:915 +#: pg_verifybackup.c:908 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal nicht versuchen WAL-Dateien zu parsen\n" -#: pg_verifybackup.c:916 +#: pg_verifybackup.c:909 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet keine Ausgabe, außer Fehler\n" -#: pg_verifybackup.c:917 +#: pg_verifybackup.c:910 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums Überprüfung der Prüfsummen überspringen\n" -#: pg_verifybackup.c:918 +#: pg_verifybackup.c:911 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr " -w, --wal-directory=PFAD angegebenen Pfad für WAL-Dateien verwenden\n" -#: pg_verifybackup.c:919 +#: pg_verifybackup.c:912 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_verifybackup.c:920 +#: pg_verifybackup.c:913 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_verifybackup.c:921 +#: pg_verifybackup.c:914 #, c-format msgid "" "\n" @@ -495,7 +492,7 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_verifybackup.c:922 +#: pg_verifybackup.c:915 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" diff --git a/src/bin/pg_verifybackup/po/el.po b/src/bin/pg_verifybackup/po/el.po index ce869d591d..1869623ae5 100644 --- a/src/bin/pg_verifybackup/po/el.po +++ b/src/bin/pg_verifybackup/po/el.po @@ -3,18 +3,20 @@ # This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package. # Georgios Kokolatos , 2021. # +# +# msgid "" msgstr "" "Project-Id-Version: pg_verifybackup (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-31 23:45+0000\n" +"POT-Creation-Date: 2021-07-14 08:14+0000\n" "PO-Revision-Date: 2021-06-04 09:16+0200\n" +"Last-Translator: Georgios Kokolatos \n" +"Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Last-Translator: Georgios Kokolatos \n" -"Language-Team: \n" "X-Generator: Poedit 2.4.3\n" #: ../../../src/common/logging.c:259 @@ -46,7 +48,7 @@ msgstr "δεν ήταν δυνατή η αντιγραφή δείκτη null (ε #: ../../common/jsonapi.c:1066 #, c-format msgid "Escape sequence \"\\%s\" is invalid." -msgstr "Η ακολουθία διαφυγής \"\\%s\" δεν είναι έγκυρη." +msgstr "Η ακολουθία διαφυγής «\\%s» δεν είναι έγκυρη." #: ../../common/jsonapi.c:1069 #, c-format @@ -56,27 +58,27 @@ msgstr "Ο χαρακτήρας με τιμή 0x%02x πρέπει να διαφ #: ../../common/jsonapi.c:1072 #, c-format msgid "Expected end of input, but found \"%s\"." -msgstr "Ανέμενε τέλος εισόδου, αλλά βρήκε “%s”." +msgstr "Ανέμενε τέλος εισόδου, αλλά βρήκε «%s»." #: ../../common/jsonapi.c:1075 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "Ανέμενε στοιχείο συστυχίας ή \"]\", αλλά βρέθηκε \"%s\"." +msgstr "Ανέμενε στοιχείο συστυχίας ή «]», αλλά βρέθηκε «%s»." #: ../../common/jsonapi.c:1078 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "Ανέμενε “,” ή “]”, αλλά βρήκε “%s”." +msgstr "Ανέμενε «,» ή «]», αλλά βρήκε «%s»." #: ../../common/jsonapi.c:1081 #, c-format msgid "Expected \":\", but found \"%s\"." -msgstr "Ανέμενε \":\", αλλά βρήκε \"%s\"." +msgstr "Ανέμενε «:», αλλά βρήκε «%s»." #: ../../common/jsonapi.c:1084 #, c-format msgid "Expected JSON value, but found \"%s\"." -msgstr "Ανέμενε τιμή JSON, αλλά βρήκε \"%s\"." +msgstr "Ανέμενε τιμή JSON, αλλά βρήκε «%s»." #: ../../common/jsonapi.c:1087 msgid "The input string ended unexpectedly." @@ -85,22 +87,22 @@ msgstr "Η συμβολοσειρά εισόδου τερματίστηκε αν #: ../../common/jsonapi.c:1089 #, c-format msgid "Expected string or \"}\", but found \"%s\"." -msgstr "Ανέμενε συμβολοσειρά ή “}”, αλλά βρήκε “%s”." +msgstr "Ανέμενε συμβολοσειρά ή «}», αλλά βρήκε «%s»." #: ../../common/jsonapi.c:1092 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "Ανέμενε “,” ή “}”, αλλά βρήκε “%s”." +msgstr "Ανέμενε «,» ή «}», αλλά βρήκε «%s»." #: ../../common/jsonapi.c:1095 #, c-format msgid "Expected string, but found \"%s\"." -msgstr "Ανέμενε συμβολοσειρά, αλλά βρήκε “%s”." +msgstr "Ανέμενε συμβολοσειρά, αλλά βρήκε «%s»." #: ../../common/jsonapi.c:1098 #, c-format msgid "Token \"%s\" is invalid." -msgstr "Το διακριτικό \"%s\" δεν είναι έγκυρο." +msgstr "Το διακριτικό «%s» δεν είναι έγκυρο." #: ../../common/jsonapi.c:1101 msgid "\\u0000 cannot be converted to text." @@ -108,7 +110,7 @@ msgstr "Δεν είναι δυνατή η μετατροπή του \\u0000 σε #: ../../common/jsonapi.c:1103 msgid "\"\\u\" must be followed by four hexadecimal digits." -msgstr "Το \"\\u\" πρέπει να ακολουθείται από τέσσερα δεκαεξαδικά ψηφία." +msgstr "Το «\\u» πρέπει να ακολουθείται από τέσσερα δεκαεξαδικά ψηφία." #: ../../common/jsonapi.c:1106 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." @@ -197,12 +199,12 @@ msgstr "το μέγεθος αρχείου δεν είναι ακέραιος" #: parse_manifest.c:510 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "μη αναγνωρίσιμος αλγόριθμος αθροίσματος ελέγχου: \"%s\"" +msgstr "μη αναγνωρίσιμος αλγόριθμος αθροίσματος ελέγχου: «%s»" #: parse_manifest.c:529 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" -msgstr "μη έγκυρο άθροισμα ελέγχου για το αρχείο \"%s\": \"%s\"" +msgstr "μη έγκυρο άθροισμα ελέγχου για το αρχείο «%s»: «%s»" #: parse_manifest.c:572 msgid "missing timeline" @@ -264,7 +266,7 @@ msgstr "η διακήρυξη δεν έχει άθροισμα ελέγχου" #: parse_manifest.c:672 #, c-format msgid "invalid manifest checksum: \"%s\"" -msgstr "μη έγκυρο άθροισμα ελέγχου διακήρυξης: \"%s\"" +msgstr "μη έγκυρο άθροισμα ελέγχου διακήρυξης: «%s»" #: parse_manifest.c:676 #, c-format @@ -279,7 +281,7 @@ msgstr "δεν ήταν δυνατή η ανάλυση του αντιγράφο #: pg_verifybackup.c:255 pg_verifybackup.c:265 pg_verifybackup.c:277 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Δοκιμάστε “%s —help” για περισσότερες πληροφορίες.\n" +msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n" #: pg_verifybackup.c:264 #, c-format @@ -289,7 +291,7 @@ msgstr "δεν ορίστηκε κατάλογος αντιγράφου ασφα #: pg_verifybackup.c:275 #, c-format msgid "too many command-line arguments (first is \"%s\")" -msgstr "πάρα πολλοί παραμέτροι εισόδου από την γραμμή εντολών (ο πρώτη είναι η “%s”)" +msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)" #: pg_verifybackup.c:298 #, c-format @@ -298,8 +300,8 @@ msgid "" "same directory as \"%s\".\n" "Check your installation." msgstr "" -"Το πρόγραμμα \"%s\" απαιτείται από %s αλλά δεν βρέθηκε στο\n" -"ίδιος κατάλογος με το \"%s\".\n" +"Το πρόγραμμα «%s» απαιτείται από %s αλλά δεν βρέθηκε στον\n" +"ίδιο κατάλογο με το «%s».\n" "Ελέγξτε την εγκατάστασή σας." #: pg_verifybackup.c:303 @@ -309,7 +311,7 @@ msgid "" "but was not the same version as %s.\n" "Check your installation." msgstr "" -"Το πρόγραμμα \"%s\" βρέθηκε από το \"%s\"\n" +"Το πρόγραμμα «%s» βρέθηκε από το \"%s\"\n" "αλλά δεν ήταν η ίδια εκδοχή με %s.\n" "Ελέγξτε την εγκατάστασή σας." @@ -321,97 +323,97 @@ msgstr "το αντίγραφο ασφαλείας επαληθεύτηκε με #: pg_verifybackup.c:387 pg_verifybackup.c:723 #, c-format msgid "could not open file \"%s\": %m" -msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου “%s”: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %m" #: pg_verifybackup.c:391 #, c-format msgid "could not stat file \"%s\": %m" -msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο “%s”: %m" +msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο «%s»: %m" #: pg_verifybackup.c:411 pg_verifybackup.c:752 #, c-format msgid "could not read file \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου \"%s\": %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: %m" #: pg_verifybackup.c:414 #, c-format msgid "could not read file \"%s\": read %d of %lld" -msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου \"%s\": ανέγνωσε %d από %lld" +msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: ανέγνωσε %d από %lld" #: pg_verifybackup.c:474 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" -msgstr "διπλότυπο όνομα διαδρομής στη διακήρυξη αντιγράφου ασφαλείας: \"%s\"" +msgstr "διπλότυπο όνομα διαδρομής στη διακήρυξη αντιγράφου ασφαλείας: «%s»" #: pg_verifybackup.c:537 pg_verifybackup.c:544 #, c-format msgid "could not open directory \"%s\": %m" -msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου “%s”: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m" #: pg_verifybackup.c:576 #, c-format msgid "could not close directory \"%s\": %m" -msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου “%s”: %m" +msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m" #: pg_verifybackup.c:596 #, c-format msgid "could not stat file or directory \"%s\": %m" -msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο ή κατάλογο “%s”: %m" +msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο ή κατάλογο «%s»: %m" #: pg_verifybackup.c:619 #, c-format msgid "\"%s\" is not a file or directory" -msgstr "“%s” δεν είναι αρχείο ή κατάλογος" +msgstr "«%s» δεν είναι αρχείο ή κατάλογος" #: pg_verifybackup.c:629 #, c-format msgid "\"%s\" is present on disk but not in the manifest" -msgstr "\"%s\" βρίσκεται στο δίσκο, αλλά όχι στη διακήρυξη" +msgstr "«%s» βρίσκεται στο δίσκο, αλλά όχι στη διακήρυξη" #: pg_verifybackup.c:641 #, c-format msgid "\"%s\" has size %lld on disk but size %zu in the manifest" -msgstr "\"%s\" έχει μέγεθος %lld στο δίσκο, αλλά μέγεθος %zu στη διακήρυξη" +msgstr "«%s» έχει μέγεθος %lld στο δίσκο, αλλά μέγεθος %zu στη διακήρυξη" #: pg_verifybackup.c:668 #, c-format msgid "\"%s\" is present in the manifest but not on disk" -msgstr "\"%s\" βρίσκεται στη διακήρυξη αλλά όχι στο δίσκο" +msgstr "«%s» βρίσκεται στη διακήρυξη αλλά όχι στο δίσκο" #: pg_verifybackup.c:731 #, c-format msgid "could not initialize checksum of file \"%s\"" -msgstr "δεν ήταν δυνατή η αρχικοποίηση του αθροίσματος ελέγχου του αρχείου \"%s\"" +msgstr "δεν ήταν δυνατή η αρχικοποίηση του αθροίσματος ελέγχου του αρχείου «%s»" #: pg_verifybackup.c:743 #, c-format msgid "could not update checksum of file \"%s\"" -msgstr "δεν ήταν δυνατή η ενημέρωση αθροίσματος ελέγχου του αρχείου “%s”" +msgstr "δεν ήταν δυνατή η ενημέρωση αθροίσματος ελέγχου του αρχείου «%s»" #: pg_verifybackup.c:758 #, c-format msgid "could not close file \"%s\": %m" -msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου “%s”: %m" +msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου «%s»: %m" #: pg_verifybackup.c:777 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" -msgstr "το αρχείο \"%s\" έπρεπε να περιέχει %zu bytes, αλλά να αναγνώστηκαν %zu bytes" +msgstr "το αρχείο «%s» έπρεπε να περιέχει %zu bytes, αλλά να αναγνώστηκαν %zu bytes" #: pg_verifybackup.c:787 #, c-format msgid "could not finalize checksum of file \"%s\"" -msgstr "δεν ήταν δυνατή η ολοκλήρωση του αθροίσματος ελέγχου του αρχείου \"%s\"" +msgstr "δεν ήταν δυνατή η ολοκλήρωση του αθροίσματος ελέγχου του αρχείου «%s»" #: pg_verifybackup.c:795 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" -msgstr "το αρχείο \"%s\" έχει άθροισμα ελέγχου μήκους %d, αλλά αναμένεται %d" +msgstr "το αρχείο «%s» έχει άθροισμα ελέγχου μήκους %d, αλλά αναμένεται %d" #: pg_verifybackup.c:799 #, c-format msgid "checksum mismatch for file \"%s\"" -msgstr "αναντιστοιχία αθροίσματος ελέγχου για το αρχείο \"%s\"" +msgstr "αναντιστοιχία αθροίσματος ελέγχου για το αρχείο «%s»" #: pg_verifybackup.c:823 #, c-format @@ -435,7 +437,7 @@ msgid "" "\n" msgstr "" "Χρήση:\n" -" %s [ΕΠΙΛΟΓΗ]… BACKUPDIR\n" +" %s [ΕΠΙΛΟΓΗ]... BACKUPDIR\n" "\n" #: pg_verifybackup.c:911 @@ -446,47 +448,47 @@ msgstr "Επιλογές:\n" #: pg_verifybackup.c:912 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" -msgstr " -e, —exit-on-error να εξέλθει άμεσα σε σφάλμα\n" +msgstr " -e, --exit-on-error να εξέλθει άμεσα σε σφάλμα\n" #: pg_verifybackup.c:913 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" -msgstr " -i, —ignore=RELATIVE_PATH αγνόησε την υποδεικνυόμενη διαδρομή\n" +msgstr " -i, --ignore=RELATIVE_PATH αγνόησε την υποδεικνυόμενη διαδρομή\n" #: pg_verifybackup.c:914 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" -msgstr " -m, —manifest-path=PATH χρησιμοποίησε την καθορισμένη διαδρομή για την διακήρυξη\n" +msgstr " -m, --manifest-path=PATH χρησιμοποίησε την καθορισμένη διαδρομή για την διακήρυξη\n" #: pg_verifybackup.c:915 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" -msgstr " -n, —no-parse-wal μην δοκιμάσεις να αναλύσεις αρχεία WAL\n" +msgstr " -n, --no-parse-wal μην δοκιμάσεις να αναλύσεις αρχεία WAL\n" #: pg_verifybackup.c:916 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" -msgstr " -q, —quiet να μην εκτυπώσεις καμία έξοδο, εκτός από σφάλματα\n" +msgstr " -q, --quiet να μην εκτυπώσεις καμία έξοδο, εκτός από σφάλματα\n" #: pg_verifybackup.c:917 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" -msgstr " -s, —skip-checksums παράκαμψε την επαλήθευση αθροισμάτων ελέγχου\n" +msgstr " -s, --skip-checksums παράκαμψε την επαλήθευση αθροισμάτων ελέγχου\n" #: pg_verifybackup.c:918 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" -msgstr " -w, —wal-directory=PATH χρησιμοποίησε την καθορισμένη διαδρομή για αρχεία WAL\n" +msgstr " -w, --wal-directory=PATH χρησιμοποίησε την καθορισμένη διαδρομή για αρχεία WAL\n" #: pg_verifybackup.c:919 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, —version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" #: pg_verifybackup.c:920 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, —help εμφάνισε αυτό το μήνυμα βοήθειας, μετά έξοδος\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" #: pg_verifybackup.c:921 #, c-format diff --git a/src/bin/pg_verifybackup/po/es.po b/src/bin/pg_verifybackup/po/es.po index c2c79108a2..0c0fc54696 100644 --- a/src/bin/pg_verifybackup/po/es.po +++ b/src/bin/pg_verifybackup/po/es.po @@ -1,12 +1,12 @@ # Spanish message translation file for pg_verifybackup -# Copyright (C) 2020 PostgreSQL Global Development Group +# Copyright (C) 2020-2021 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package. # Álvaro Herrera , 2020. # Carlos Chapi , 2021. # msgid "" msgstr "" -"Project-Id-Version: pg_verifybackup (PostgreSQL) 13\n" +"Project-Id-Version: pg_verifybackup (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2021-05-14 19:45+0000\n" "PO-Revision-Date: 2021-05-24 16:53-0500\n" diff --git a/src/bin/pg_verifybackup/po/fr.po b/src/bin/pg_verifybackup/po/fr.po index 9ad27058e3..68784c9652 100644 --- a/src/bin/pg_verifybackup/po/fr.po +++ b/src/bin/pg_verifybackup/po/fr.po @@ -1,37 +1,46 @@ # LANGUAGE message translation file for pg_verifybackup -# Copyright (C) 2020 PostgreSQL Global Development Group +# Copyright (C) 2020-2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package. -# FIRST AUTHOR , 2020. +# +# Use these quotes: « %s » +# +# Guillaume Lelarge , 2020-2022. # msgid "" msgstr "" -"Project-Id-Version: pg_verifybackup (PostgreSQL) 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-15 01:45+0000\n" -"PO-Revision-Date: 2021-04-15 08:45+0200\n" -"Last-Translator: \n" -"Language-Team: \n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"Last-Translator: Guillaume Lelarge \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" - -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "fatal : " +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:273 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:280 #, c-format msgid "warning: " msgstr "attention : " +#: ../../../src/common/logging.c:291 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:298 +#, c-format +msgid "hint: " +msgstr "astuce : " + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -43,85 +52,89 @@ msgstr "mémoire épuisée\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" -#: ../../common/jsonapi.c:1066 +#: ../../common/jsonapi.c:1078 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "La séquence d'échappement « \\%s » est invalide." -#: ../../common/jsonapi.c:1069 +#: ../../common/jsonapi.c:1081 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Le caractère de valeur 0x%02x doit être échappé." -#: ../../common/jsonapi.c:1072 +#: ../../common/jsonapi.c:1084 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Attendait une fin de l'entrée, mais a trouvé « %s »." -#: ../../common/jsonapi.c:1075 +#: ../../common/jsonapi.c:1087 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Élément de tableau ou « ] » attendu, mais trouvé « %s »." -#: ../../common/jsonapi.c:1078 +#: ../../common/jsonapi.c:1090 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "« , » ou « ] » attendu, mais trouvé « %s »." -#: ../../common/jsonapi.c:1081 +#: ../../common/jsonapi.c:1093 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "« : » attendu, mais trouvé « %s »." -#: ../../common/jsonapi.c:1084 +#: ../../common/jsonapi.c:1096 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Valeur JSON attendue, mais « %s » trouvé." -#: ../../common/jsonapi.c:1087 +#: ../../common/jsonapi.c:1099 msgid "The input string ended unexpectedly." msgstr "La chaîne en entrée se ferme de manière inattendue." -#: ../../common/jsonapi.c:1089 +#: ../../common/jsonapi.c:1101 #, c-format msgid "Expected string or \"}\", but found \"%s\"." -msgstr "Chaîne ou « } » attendu, mais « %s » trouvé" +msgstr "Chaîne ou « } » attendu, mais « %s » trouvé." -#: ../../common/jsonapi.c:1092 +#: ../../common/jsonapi.c:1104 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "« , » ou « } » attendu, mais trouvé « %s »." -#: ../../common/jsonapi.c:1095 +#: ../../common/jsonapi.c:1107 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Chaîne attendue, mais « %s » trouvé." -#: ../../common/jsonapi.c:1098 +#: ../../common/jsonapi.c:1110 #, c-format msgid "Token \"%s\" is invalid." msgstr "Le jeton « %s » n'est pas valide." -#: ../../common/jsonapi.c:1101 +#: ../../common/jsonapi.c:1113 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 ne peut pas être converti en texte." -#: ../../common/jsonapi.c:1103 +#: ../../common/jsonapi.c:1115 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "« \\u » doit être suivi par quatre chiffres hexadécimaux." -#: ../../common/jsonapi.c:1106 +#: ../../common/jsonapi.c:1118 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." -msgstr "les valeurs d'échappement Unicode ne peuvent pas être utilisées pour des valeurs de point code au-dessus de 007F quand l'encodage n'est pas UTF8." +msgstr "Les valeurs d'échappement Unicode ne peuvent pas être utilisées pour des valeurs de point code au-dessus de 007F quand l'encodage n'est pas UTF8." -#: ../../common/jsonapi.c:1108 +#: ../../common/jsonapi.c:1120 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Une substitution unicode haute ne doit pas suivre une substitution haute." -#: ../../common/jsonapi.c:1110 +#: ../../common/jsonapi.c:1122 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Une substitution unicode basse ne doit pas suivre une substitution haute." +#: parse_manifest.c:150 +msgid "parsing failed" +msgstr "échec de l'analyse" + #: parse_manifest.c:152 msgid "manifest ended unexpectedly" msgstr "le manifeste se termine de façon inattendue" @@ -276,151 +289,139 @@ msgstr "différence de somme de contrôle pour le manifeste" msgid "could not parse backup manifest: %s" msgstr "n'a pas pu analyser le manifeste de sauvegarde : %s" -#: pg_verifybackup.c:255 pg_verifybackup.c:265 pg_verifybackup.c:277 +#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Essayez « %s --help » pour plus d'informations.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." #: pg_verifybackup.c:264 #, c-format msgid "no backup directory specified" msgstr "pas de répertoire de sauvegarde spécifié" -#: pg_verifybackup.c:275 +#: pg_verifybackup.c:274 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_verifybackup.c:298 +#: pg_verifybackup.c:297 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"Le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé\n" -"dans le même répertoire que « %s ».\n" -"Vérifiez votre installation." +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »" -#: pg_verifybackup.c:303 +#: pg_verifybackup.c:300 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"Le programme « %s » a été trouvé par « %s »,\n" -"mais n'est pas de la même version que %s.\n" -"Vérifiez votre installation." +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s" -#: pg_verifybackup.c:361 +#: pg_verifybackup.c:356 #, c-format msgid "backup successfully verified\n" msgstr "sauvegarde vérifiée avec succès\n" -#: pg_verifybackup.c:387 pg_verifybackup.c:723 +#: pg_verifybackup.c:382 pg_verifybackup.c:718 #, c-format msgid "could not open file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier « %s » : %m" -#: pg_verifybackup.c:391 +#: pg_verifybackup.c:386 #, c-format msgid "could not stat file \"%s\": %m" msgstr "n'a pas pu tester le fichier « %s » : %m" -#: pg_verifybackup.c:411 pg_verifybackup.c:752 +#: pg_verifybackup.c:406 pg_verifybackup.c:747 #, c-format msgid "could not read file \"%s\": %m" msgstr "n'a pas pu lire le fichier « %s » : %m" -#: pg_verifybackup.c:414 +#: pg_verifybackup.c:409 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %lld" -#: pg_verifybackup.c:474 +#: pg_verifybackup.c:469 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "nom de chemin dupliqué dans le manifeste de sauvegarde : « %s »" -#: pg_verifybackup.c:537 pg_verifybackup.c:544 +#: pg_verifybackup.c:532 pg_verifybackup.c:539 #, c-format msgid "could not open directory \"%s\": %m" msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" -#: pg_verifybackup.c:576 +#: pg_verifybackup.c:571 #, c-format msgid "could not close directory \"%s\": %m" msgstr "n'a pas pu fermer le répertoire « %s » : %m" -#: pg_verifybackup.c:596 +#: pg_verifybackup.c:591 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "" "n'a pas pu récupérer les informations sur le fichier ou répertoire\n" "« %s » : %m" -#: pg_verifybackup.c:619 +#: pg_verifybackup.c:614 #, c-format msgid "\"%s\" is not a file or directory" msgstr "« %s » n'est ni un fichier ni un répertoire" -#: pg_verifybackup.c:629 +#: pg_verifybackup.c:624 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "« %s » est présent sur disque mais pas dans le manifeste" -#: pg_verifybackup.c:641 +#: pg_verifybackup.c:636 #, c-format msgid "\"%s\" has size %lld on disk but size %zu in the manifest" msgstr "« %s » a une taille de %lld sur disque mais de %zu dans le manifeste" -#: pg_verifybackup.c:668 +#: pg_verifybackup.c:663 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "« %s » est présent dans le manifeste mais pas sur disque" -#: pg_verifybackup.c:731 +#: pg_verifybackup.c:726 #, c-format msgid "could not initialize checksum of file \"%s\"" msgstr "n'a pas pu initialiser la somme de contrôle du fichier « %s »" -#: pg_verifybackup.c:743 +#: pg_verifybackup.c:738 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "n'a pas pu mettre à jour la somme de contrôle du fichier « %s »" -#: pg_verifybackup.c:758 +#: pg_verifybackup.c:753 #, c-format msgid "could not close file \"%s\": %m" msgstr "n'a pas pu fermer le fichier « %s » : %m" -#: pg_verifybackup.c:777 +#: pg_verifybackup.c:772 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "le fichier « %s » devrait contenir %zu octets, mais la lecture produit %zu octets" -#: pg_verifybackup.c:787 +#: pg_verifybackup.c:782 #, c-format msgid "could not finalize checksum of file \"%s\"" msgstr "n'a pas pu finaliser la somme de contrôle du fichier « %s »" -#: pg_verifybackup.c:795 +#: pg_verifybackup.c:790 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "le fichier « %s » a une somme de contrôle de taille %d, alors que %d était attendu" -#: pg_verifybackup.c:799 +#: pg_verifybackup.c:794 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "différence de somme de contrôle pour le fichier « %s »" -#: pg_verifybackup.c:823 +#: pg_verifybackup.c:818 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "analyse du WAL échouée pour la timeline %u" -#: pg_verifybackup.c:909 +#: pg_verifybackup.c:904 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" @@ -429,7 +430,7 @@ msgstr "" "%s vérifie une sauvegarde à partir du manifeste de sauvegarde.\n" "\n" -#: pg_verifybackup.c:910 +#: pg_verifybackup.c:905 #, c-format msgid "" "Usage:\n" @@ -437,60 +438,60 @@ msgid "" "\n" msgstr "" "Usage:\n" -" %s [OPTION]... REPSAUVEGARDE\n" +" %s [OPTION]... REP_SAUVEGARDE\n" "\n" -#: pg_verifybackup.c:911 +#: pg_verifybackup.c:906 #, c-format msgid "Options:\n" msgstr "Options :\n" -#: pg_verifybackup.c:912 +#: pg_verifybackup.c:907 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error quitte immédiatement en cas d'erreur\n" -#: pg_verifybackup.c:913 +#: pg_verifybackup.c:908 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=CHEMIN_RELATIF ignore le chemin indiqué\n" -#: pg_verifybackup.c:914 +#: pg_verifybackup.c:909 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=CHEMIN utilise le chemin spécifié pour le manifeste\n" -#: pg_verifybackup.c:915 +#: pg_verifybackup.c:910 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal n'essaie pas d'analyse les fichiers WAL\n" -#: pg_verifybackup.c:916 +#: pg_verifybackup.c:911 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet n'affiche aucun message sauf pour les erreurs\n" -#: pg_verifybackup.c:917 +#: pg_verifybackup.c:912 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums ignore la vérification des sommes de contrôle\n" -#: pg_verifybackup.c:918 +#: pg_verifybackup.c:913 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr " -w, --wal-directory=CHEMIN utilise le chemin spécifié pour les fichiers WAL\n" -#: pg_verifybackup.c:919 +#: pg_verifybackup.c:914 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version, puis quitte\n" -#: pg_verifybackup.c:920 +#: pg_verifybackup.c:915 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide, puis quitte\n" -#: pg_verifybackup.c:921 +#: pg_verifybackup.c:916 #, c-format msgid "" "\n" @@ -499,10 +500,18 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_verifybackup.c:922 +#: pg_verifybackup.c:917 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil de %s : <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" #~ msgid "could not read file \"%s\": read %d of %zu" #~ msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" + +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatal : " diff --git a/src/bin/pg_verifybackup/po/ja.po b/src/bin/pg_verifybackup/po/ja.po index 402694dbda..77676bd0aa 100644 --- a/src/bin/pg_verifybackup/po/ja.po +++ b/src/bin/pg_verifybackup/po/ja.po @@ -1,36 +1,42 @@ # Japanese message translation file for pg_verifybackup -# Copyright (C) 2021 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package. # Haiying Tang , 2021. # msgid "" msgstr "" -"Project-Id-Version: pg_verifybackup (PostgreSQL) 13\n" +"Project-Id-Version: pg_verifybackup (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-01-06 20:06+0900\n" -"PO-Revision-Date: 2021-02-05 08:11+0100\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" +"PO-Revision-Date: 2022-05-10 16:25+0900\n" "Last-Translator: Haiying Tang \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "警告: " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "ヒント: " + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -42,88 +48,92 @@ msgstr "メモリ不足です\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ポインタを複製できません (内部エラー)\n" -#: ../../common/jsonapi.c:1064 +#: ../../common/jsonapi.c:1075 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "エスケープシーケンス\"\\%s\"は不正です。" -#: ../../common/jsonapi.c:1067 +#: ../../common/jsonapi.c:1078 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x値を持つ文字はエスケープしなければなりません" -#: ../../common/jsonapi.c:1070 +#: ../../common/jsonapi.c:1081 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "入力の終端を想定していましたが、\"%s\"でした。" -#: ../../common/jsonapi.c:1073 +#: ../../common/jsonapi.c:1084 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "配列要素または\"]\"を想定していましたが、\"%s\"でした。" -#: ../../common/jsonapi.c:1076 +#: ../../common/jsonapi.c:1087 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "\",\"または\"]\"を想定していましたが、\"%s\"でした。" -#: ../../common/jsonapi.c:1079 +#: ../../common/jsonapi.c:1090 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "\":\"を想定していましたが、\"%s\"でした。" -#: ../../common/jsonapi.c:1082 +#: ../../common/jsonapi.c:1093 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "JSON値を想定していましたが、\"%s\"でした。" -#: ../../common/jsonapi.c:1085 +#: ../../common/jsonapi.c:1096 msgid "The input string ended unexpectedly." msgstr "入力文字列が予期せず終了しました。" -#: ../../common/jsonapi.c:1087 +#: ../../common/jsonapi.c:1098 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "文字列または\"}\"を想定していましたが、\"%s\"でした。" -#: ../../common/jsonapi.c:1090 +#: ../../common/jsonapi.c:1101 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "\",\"または\"}\"を想定していましたが、\"%s\"でした。" -#: ../../common/jsonapi.c:1093 +#: ../../common/jsonapi.c:1104 #, c-format msgid "Expected string, but found \"%s\"." msgstr "文字列を想定していましたが、\"%s\"でした。" -#: ../../common/jsonapi.c:1096 +#: ../../common/jsonapi.c:1107 #, c-format msgid "Token \"%s\" is invalid." msgstr "トークン\"%s\"は不正です。" -#: ../../common/jsonapi.c:1099 +#: ../../common/jsonapi.c:1110 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 はテキストに変換できません。" -#: ../../common/jsonapi.c:1101 +#: ../../common/jsonapi.c:1112 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\"の後には16進数の4桁が続かなければなりません。" -#: ../../common/jsonapi.c:1104 +#: ../../common/jsonapi.c:1115 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "エンコーディングがUTF-8ではない場合、コードポイントの値が 007F 以上についてはUnicodeエスケープの値は使用できません。" -#: ../../common/jsonapi.c:1106 +#: ../../common/jsonapi.c:1117 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodeのハイサロゲートはハイサロゲートに続いてはいけません。" -#: ../../common/jsonapi.c:1108 +#: ../../common/jsonapi.c:1119 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicodeのローサロゲートはハイサロゲートに続かなければなりません。" +#: parse_manifest.c:150 +msgid "parsing failed" +msgstr "パースに失敗しました" + #: parse_manifest.c:152 msgid "manifest ended unexpectedly" -msgstr "マニフェストが予期せず終了しました。" +msgstr "目録が予期せず終了しました。" #: parse_manifest.c:191 msgid "unexpected object start" @@ -163,7 +173,7 @@ msgstr "予期しないオブジェクトフィールド" #: parse_manifest.c:397 msgid "unexpected manifest version" -msgstr "予期しないマニフェストバージョン" +msgstr "予期しない目録バージョン" #: parse_manifest.c:448 msgid "unexpected scalar" @@ -221,11 +231,11 @@ msgstr "タイムラインが整数ではありません" #: parse_manifest.c:585 msgid "could not parse start LSN" -msgstr "開始LSNを解析できませんでした" +msgstr "開始LSNをパースできませんでした" #: parse_manifest.c:588 msgid "could not parse end LSN" -msgstr "終了LSNを解析できませんでした" +msgstr "終了LSNをパースできませんでした" #: parse_manifest.c:649 msgid "expected at least 2 lines" @@ -235,165 +245,186 @@ msgstr "少なくとも2行が必要です" msgid "last line not newline-terminated" msgstr "最後の行が改行で終わっていません" +#: parse_manifest.c:657 +#, c-format +msgid "out of memory" +msgstr "メモリ不足です" + +#: parse_manifest.c:659 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "目録のチェックサムの初期化ができませんでした" + #: parse_manifest.c:661 #, c-format +msgid "could not update checksum of manifest" +msgstr "目録のチェックサムの更新ができませんでした" + +#: parse_manifest.c:664 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "目録のチェックサムの完了ができませんでした" + +#: parse_manifest.c:668 +#, c-format msgid "manifest has no checksum" -msgstr "マニフェストにチェックサムがありません" +msgstr "目録にチェックサムがありません" -#: parse_manifest.c:665 +#: parse_manifest.c:672 #, c-format msgid "invalid manifest checksum: \"%s\"" -msgstr "無効なマニフェストチェックサム: \"%s\"" +msgstr "無効な目録チェックサム: \"%s\"" -#: parse_manifest.c:669 +#: parse_manifest.c:676 #, c-format msgid "manifest checksum mismatch" -msgstr "マニフェストチェックサムが合っていません" +msgstr "目録チェックサムの不一致" -#: parse_manifest.c:683 +#: parse_manifest.c:691 #, c-format msgid "could not parse backup manifest: %s" -msgstr "バックアップマニフェストを解析できませんでした: %s" +msgstr "バックアップ目録をパースできませんでした: %s" -#: pg_verifybackup.c:255 pg_verifybackup.c:265 pg_verifybackup.c:277 +#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "詳細は\"%s --help\"で確認してください。\n" +msgid "Try \"%s --help\" for more information." +msgstr "詳細は\"%s --help\"を実行してください。" #: pg_verifybackup.c:264 #, c-format msgid "no backup directory specified" msgstr "バックアップディレクトリが指定されていません" -#: pg_verifybackup.c:275 +#: pg_verifybackup.c:274 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")" -#: pg_verifybackup.c:298 +#: pg_verifybackup.c:297 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"%2$sにはプログラム\"%1$s\"が必要ですが、\"%3$s\"と同じディレクトリ\n" -"にありませんでした。\n" -"インストール状況を確認してください。" +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "%2$sにはプログラム\"%1$s\"が必要ですが、\"%3$s\"と同じディレクトリにありませんでした" -#: pg_verifybackup.c:303 +#: pg_verifybackup.c:300 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じ\n" -"バージョンではありませんでした。\n" -"インストール状況を確認してください。" +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じバージョンではありませんでした" -#: pg_verifybackup.c:361 +#: pg_verifybackup.c:356 #, c-format msgid "backup successfully verified\n" msgstr "バックアップが正常に検証されました\n" -#: pg_verifybackup.c:387 pg_verifybackup.c:723 +#: pg_verifybackup.c:382 pg_verifybackup.c:718 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンできませんでした: %m" -#: pg_verifybackup.c:391 +#: pg_verifybackup.c:386 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"のstatに失敗しました: %m" -#: pg_verifybackup.c:411 pg_verifybackup.c:738 +#: pg_verifybackup.c:406 pg_verifybackup.c:745 #, c-format msgid "could not read file \"%s\": %m" msgstr "ファイル\"%s\"の読み取りに失敗しました: %m" -#: pg_verifybackup.c:414 +#: pg_verifybackup.c:409 #, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "" -"ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込" -"みました" +msgid "could not read file \"%s\": read %d of %lld" +msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$lldバイトのうち%2$dバイトを読み込みました" -#: pg_verifybackup.c:474 +#: pg_verifybackup.c:469 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" -msgstr "バックアップマニフェスト内の重複パス名: \"%s\"" +msgstr "バックアップ目録内の重複パス名: \"%s\"" -#: pg_verifybackup.c:537 pg_verifybackup.c:544 +#: pg_verifybackup.c:532 pg_verifybackup.c:539 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" -#: pg_verifybackup.c:576 +#: pg_verifybackup.c:571 #, c-format msgid "could not close directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m" -#: pg_verifybackup.c:596 +#: pg_verifybackup.c:591 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "\"%s\"というファイルまたはディレクトリの情報を取得できませんでした: %m" -#: pg_verifybackup.c:619 +#: pg_verifybackup.c:614 #, c-format msgid "\"%s\" is not a file or directory" msgstr "\"%s\"はファイルまたはディレクトリではありません" -#: pg_verifybackup.c:629 +#: pg_verifybackup.c:624 #, c-format msgid "\"%s\" is present on disk but not in the manifest" -msgstr "\"%s\"はディスクに存在しますが、マニフェストには存在しません" +msgstr "\"%s\"はディスクに存在しますが、目録には存在しません" -#: pg_verifybackup.c:641 +#: pg_verifybackup.c:636 #, c-format -msgid "\"%s\" has size %zu on disk but size %zu in the manifest" -msgstr "\"%s\"はディスクに%zuがありますが、マニフェストに%zuがあります" +msgid "\"%s\" has size %lld on disk but size %zu in the manifest" +msgstr "\"%s\"はディスク上でのサイズは%lldですが、目録上は%zuとなっています" -#: pg_verifybackup.c:668 +#: pg_verifybackup.c:663 #, c-format msgid "\"%s\" is present in the manifest but not on disk" -msgstr "\"%s\"マニフェストには存在しますが、ディスクには存在しません" +msgstr "\"%s\"は目録には存在しますが、ディスクには存在しません" + +#: pg_verifybackup.c:726 +#, c-format +msgid "could not initialize checksum of file \"%s\"" +msgstr "ファイル\"%s\"のチェックサムの初期化ができませんでした" -#: pg_verifybackup.c:744 +#: pg_verifybackup.c:738 +#, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "ファイル\"%s\"のチェックサムの更新ができませんでした" + +#: pg_verifybackup.c:751 #, c-format msgid "could not close file \"%s\": %m" msgstr "ファイル\"%s\"をクローズできませんでした: %m" -#: pg_verifybackup.c:763 +#: pg_verifybackup.c:770 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "file\"%s\"は%zuバイトを含む必要がありますが、%zuバイトが読み込まれました" -#: pg_verifybackup.c:774 +#: pg_verifybackup.c:780 +#, c-format +msgid "could not finalize checksum of file \"%s\"" +msgstr "ファイル\"%s\"のチェックサムの完了ができませんでした" + +#: pg_verifybackup.c:788 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "ファイル\"%s\"のチェックサムの長さは%dですが、予期されるのは%dです" -#: pg_verifybackup.c:778 +#: pg_verifybackup.c:792 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "ファイル\"%s\"のチェックサムが一致しません" -#: pg_verifybackup.c:804 +#: pg_verifybackup.c:816 #, c-format msgid "WAL parsing failed for timeline %u" -msgstr "タイムライン%uのWAL解析に失敗しました" +msgstr "タイムライン%uのWALのパースに失敗しました" -#: pg_verifybackup.c:890 +#: pg_verifybackup.c:902 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" "\n" msgstr "" -"%sはバックアップマニフェストに対してバックアップを検証します。\n" +"%sはバックアップ目録に対してバックアップを検証します。\n" "\n" -#: pg_verifybackup.c:891 +#: pg_verifybackup.c:903 #, c-format msgid "" "Usage:\n" @@ -404,57 +435,57 @@ msgstr "" " %s [オプション]... BACKUPDIR\n" "\n" -#: pg_verifybackup.c:892 +#: pg_verifybackup.c:904 #, c-format msgid "Options:\n" msgstr "オプション:\n" -#: pg_verifybackup.c:893 +#: pg_verifybackup.c:905 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error エラー時に直ちに終了する\n" -#: pg_verifybackup.c:894 +#: pg_verifybackup.c:906 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=RELATIVE_PATH 指示されたパスを無視\n" -#: pg_verifybackup.c:895 +#: pg_verifybackup.c:907 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" -msgstr " -m, --manifest-path=PATH マニフェストの指定されたパスを使用する\n" +msgstr " -m, --manifest-path=PATH 目録として指定したパスを使用する\n" -#: pg_verifybackup.c:896 +#: pg_verifybackup.c:908 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal WALファイルをパースしようとしない\n" -#: pg_verifybackup.c:897 +#: pg_verifybackup.c:909 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet エラー以外何も出力しない\n" -#: pg_verifybackup.c:898 +#: pg_verifybackup.c:910 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" -msgstr " -s, --skip-checksums スキップチェックサム検証\n" +msgstr " -s, --skip-checksums チェックサム検証をスキップ\n" -#: pg_verifybackup.c:899 +#: pg_verifybackup.c:911 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" -msgstr " -w, --wal-directory=PATH 指定したWALファイルのパスを使用する\n" +msgstr " -w, --wal-directory=PATH WALファイルに指定したパスを使用する\n" -#: pg_verifybackup.c:900 +#: pg_verifybackup.c:912 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: pg_verifybackup.c:901 +#: pg_verifybackup.c:913 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: pg_verifybackup.c:902 +#: pg_verifybackup.c:914 #, c-format msgid "" "\n" @@ -463,7 +494,16 @@ msgstr "" "\n" "バグは<%s>に報告してください。\n" -#: pg_verifybackup.c:903 +#: pg_verifybackup.c:915 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" + +#~ msgid "fatal: " +#~ msgstr "致命的エラー: " + +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "詳細は\"%s --help\"で確認してください。\n" + +#~ msgid "could not read file \"%s\": read %d of %zu" +#~ msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました" diff --git a/src/bin/pg_verifybackup/po/ru.po b/src/bin/pg_verifybackup/po/ru.po index 35ed42ce00..ea2e96d807 100644 --- a/src/bin/pg_verifybackup/po/ru.po +++ b/src/bin/pg_verifybackup/po/ru.po @@ -1,10 +1,10 @@ -# Alexander Lakhin , 2020. +# Alexander Lakhin , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: pg_verifybackup (PostgreSQL) 13\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-15 18:25+0300\n" -"PO-Revision-Date: 2020-10-29 15:03+0300\n" +"POT-Creation-Date: 2021-08-14 06:29+0300\n" +"PO-Revision-Date: 2021-09-17 07:33+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -15,17 +15,17 @@ msgstr "" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Lokalize 19.12.3\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "важно: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "ошибка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "предупреждение: " @@ -41,74 +41,74 @@ msgstr "нехватка памяти\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" -#: ../../common/jsonapi.c:1064 +#: ../../common/jsonapi.c:1066 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Неверная спецпоследовательность: \"\\%s\"." -#: ../../common/jsonapi.c:1067 +#: ../../common/jsonapi.c:1069 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ с кодом 0x%02x необходимо экранировать." -#: ../../common/jsonapi.c:1070 +#: ../../common/jsonapi.c:1072 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Ожидался конец текста, но обнаружено продолжение \"%s\"." -#: ../../common/jsonapi.c:1073 +#: ../../common/jsonapi.c:1075 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Ожидался элемент массива или \"]\", но обнаружено \"%s\"." -#: ../../common/jsonapi.c:1076 +#: ../../common/jsonapi.c:1078 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "Ожидалась \",\" или \"]\", но обнаружено \"%s\"." -#: ../../common/jsonapi.c:1079 +#: ../../common/jsonapi.c:1081 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "Ожидалось \":\", но обнаружено \"%s\"." -#: ../../common/jsonapi.c:1082 +#: ../../common/jsonapi.c:1084 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Ожидалось значение JSON, но обнаружено \"%s\"." -#: ../../common/jsonapi.c:1085 +#: ../../common/jsonapi.c:1087 msgid "The input string ended unexpectedly." msgstr "Неожиданный конец входной строки." -#: ../../common/jsonapi.c:1087 +#: ../../common/jsonapi.c:1089 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Ожидалась строка или \"}\", но обнаружено \"%s\"." -#: ../../common/jsonapi.c:1090 +#: ../../common/jsonapi.c:1092 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "Ожидалась \",\" или \"}\", но обнаружено \"%s\"." -#: ../../common/jsonapi.c:1093 +#: ../../common/jsonapi.c:1095 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Ожидалась строка, но обнаружено \"%s\"." -#: ../../common/jsonapi.c:1096 +#: ../../common/jsonapi.c:1098 #, c-format msgid "Token \"%s\" is invalid." msgstr "Ошибочный элемент текста \"%s\"." -#: ../../common/jsonapi.c:1099 +#: ../../common/jsonapi.c:1101 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 нельзя преобразовать в текст." -#: ../../common/jsonapi.c:1101 +#: ../../common/jsonapi.c:1103 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" должны следовать четыре шестнадцатеричные цифры." -#: ../../common/jsonapi.c:1104 +#: ../../common/jsonapi.c:1106 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -116,12 +116,12 @@ msgstr "" "Спецкоды Unicode для значений выше 007F можно использовать только с " "кодировкой UTF8." -#: ../../common/jsonapi.c:1106 +#: ../../common/jsonapi.c:1108 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "" "Старшее слово суррогата Unicode не может следовать за другим старшим словом." -#: ../../common/jsonapi.c:1108 +#: ../../common/jsonapi.c:1110 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Младшее слово суррогата Unicode должно следовать за старшим словом." @@ -239,22 +239,42 @@ msgstr "ожидалось как минимум 2 строки" msgid "last line not newline-terminated" msgstr "последняя строка не оканчивается символом новой строки" +#: parse_manifest.c:657 +#, c-format +msgid "out of memory" +msgstr "нехватка памяти" + +#: parse_manifest.c:659 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "не удалось подготовить контекст контрольной суммы манифеста" + #: parse_manifest.c:661 #, c-format +msgid "could not update checksum of manifest" +msgstr "не удалось изменить контекст контрольной суммы манифеста" + +#: parse_manifest.c:664 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "не удалось завершить расчёт контрольной суммы манифеста" + +#: parse_manifest.c:668 +#, c-format msgid "manifest has no checksum" msgstr "в манифесте нет контрольной суммы" -#: parse_manifest.c:665 +#: parse_manifest.c:672 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "неверная контрольная сумма в манифесте: \"%s\"" -#: parse_manifest.c:669 +#: parse_manifest.c:676 #, c-format msgid "manifest checksum mismatch" msgstr "ошибка контрольной суммы манифеста" -#: parse_manifest.c:683 +#: parse_manifest.c:691 #, c-format msgid "could not parse backup manifest: %s" msgstr "не удалось разобрать манифест копии: %s" @@ -296,100 +316,115 @@ msgstr "" "но её версия отличается от версии %s.\n" "Проверьте правильность установки СУБД." -#: pg_verifybackup.c:361 +#: pg_verifybackup.c:362 #, c-format msgid "backup successfully verified\n" msgstr "копия проверена успешно\n" -#: pg_verifybackup.c:387 pg_verifybackup.c:723 +#: pg_verifybackup.c:388 pg_verifybackup.c:724 #, c-format msgid "could not open file \"%s\": %m" msgstr "не удалось открыть файл \"%s\": %m" -#: pg_verifybackup.c:391 +#: pg_verifybackup.c:392 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не удалось получить информацию о файле \"%s\": %m" -#: pg_verifybackup.c:411 pg_verifybackup.c:738 +#: pg_verifybackup.c:412 pg_verifybackup.c:753 #, c-format msgid "could not read file \"%s\": %m" msgstr "не удалось прочитать файл \"%s\": %m" -#: pg_verifybackup.c:414 +#: pg_verifybackup.c:415 #, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %zu)" +msgid "could not read file \"%s\": read %d of %lld" +msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %lld)" -#: pg_verifybackup.c:474 +#: pg_verifybackup.c:475 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "дублирующийся путь в манифесте копии: \"%s\"" -#: pg_verifybackup.c:537 pg_verifybackup.c:544 +#: pg_verifybackup.c:538 pg_verifybackup.c:545 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не удалось открыть каталог \"%s\": %m" -#: pg_verifybackup.c:576 +#: pg_verifybackup.c:577 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не удалось закрыть каталог \"%s\": %m" -#: pg_verifybackup.c:596 +#: pg_verifybackup.c:597 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "не удалось получить информацию о файле или каталоге \"%s\": %m" -#: pg_verifybackup.c:619 +#: pg_verifybackup.c:620 #, c-format msgid "\"%s\" is not a file or directory" msgstr "\"%s\" не указывает на файл или каталог" -#: pg_verifybackup.c:629 +#: pg_verifybackup.c:630 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "файл \"%s\" присутствует на диске, но отсутствует в манифесте" -#: pg_verifybackup.c:641 +#: pg_verifybackup.c:642 #, c-format -msgid "\"%s\" has size %zu on disk but size %zu in the manifest" +msgid "\"%s\" has size %lld on disk but size %zu in the manifest" msgstr "" -"файл \"%s\" имеет размер на диске: %zu, тогда как размер в манифесте: %zu" +"файл \"%s\" имеет размер на диске: %lld, тогда как размер в манифесте: %zu" -#: pg_verifybackup.c:668 +#: pg_verifybackup.c:669 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "файл \"%s\" присутствует в манифесте, но отсутствует на диске" +#: pg_verifybackup.c:732 +#, c-format +msgid "could not initialize checksum of file \"%s\"" +msgstr "не удалось подготовить контекст контрольной суммы файла \"%s\"" + #: pg_verifybackup.c:744 #, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "не удалось изменить контекст контрольной суммы файла \"%s\"" + +#: pg_verifybackup.c:759 +#, c-format msgid "could not close file \"%s\": %m" msgstr "не удалось закрыть файл \"%s\": %m" -#: pg_verifybackup.c:763 +#: pg_verifybackup.c:778 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "файл \"%s\" должен содержать байт: %zu, но фактически прочитано: %zu" -#: pg_verifybackup.c:774 +#: pg_verifybackup.c:788 +#, c-format +msgid "could not finalize checksum of file \"%s\"" +msgstr "не удалось завершить расчёт контрольной суммы файла \"%s\"" + +#: pg_verifybackup.c:796 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "" "для файла \"%s\" задана контрольная сумма размером %d, но ожидаемый размер: " "%d" -#: pg_verifybackup.c:778 +#: pg_verifybackup.c:800 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "ошибка контрольной суммы для файла \"%s\"" -#: pg_verifybackup.c:804 +#: pg_verifybackup.c:824 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "не удалось разобрать WAL для линии времени %u" -#: pg_verifybackup.c:890 +#: pg_verifybackup.c:910 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" @@ -398,7 +433,7 @@ msgstr "" "%s проверяет резервную копию, используя манифест копии.\n" "\n" -#: pg_verifybackup.c:891 +#: pg_verifybackup.c:911 #, c-format msgid "" "Usage:\n" @@ -409,62 +444,62 @@ msgstr "" " %s [ПАРАМЕТР]... КАТАЛОГ_КОПИИ\n" "\n" -#: pg_verifybackup.c:892 +#: pg_verifybackup.c:912 #, c-format msgid "Options:\n" msgstr "Параметры:\n" -#: pg_verifybackup.c:893 +#: pg_verifybackup.c:913 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error немедленный выход при ошибке\n" -#: pg_verifybackup.c:894 +#: pg_verifybackup.c:914 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr "" " -i, --ignore=ОТНОСИТЕЛЬНЫЙ_ПУТЬ\n" " игнорировать заданный путь\n" -#: pg_verifybackup.c:895 +#: pg_verifybackup.c:915 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=ПУТЬ использовать заданный файл манифеста\n" -#: pg_verifybackup.c:896 +#: pg_verifybackup.c:916 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal не пытаться разбирать файлы WAL\n" -#: pg_verifybackup.c:897 +#: pg_verifybackup.c:917 #, c-format msgid "" " -q, --quiet do not print any output, except for errors\n" msgstr "" " -q, --quiet не выводить никаких сообщений, кроме ошибок\n" -#: pg_verifybackup.c:898 +#: pg_verifybackup.c:918 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums пропустить проверку контрольных сумм\n" -#: pg_verifybackup.c:899 +#: pg_verifybackup.c:919 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr "" " -w, --wal-directory=ПУТЬ использовать заданный путь к файлам WAL\n" -#: pg_verifybackup.c:900 +#: pg_verifybackup.c:920 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: pg_verifybackup.c:901 +#: pg_verifybackup.c:921 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help показать эту справку и выйти\n" +msgstr " -?, --help показать эту справку и выйти\n" -#: pg_verifybackup.c:902 +#: pg_verifybackup.c:922 #, c-format msgid "" "\n" @@ -473,7 +508,7 @@ msgstr "" "\n" "Об ошибках сообщайте по адресу <%s>.\n" -#: pg_verifybackup.c:903 +#: pg_verifybackup.c:923 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" diff --git a/src/bin/pg_verifybackup/po/sv.po b/src/bin/pg_verifybackup/po/sv.po index 8a984d3cc2..c2512f7b88 100644 --- a/src/bin/pg_verifybackup/po/sv.po +++ b/src/bin/pg_verifybackup/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_verifybackup # Copyright (C) 2020 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package. -# Dennis Björklund , 2020. +# Dennis Björklund , 2020, 2021, 2022 # msgid "" msgstr "" -"Project-Id-Version: pg_verifybackup (PostgreSQL) 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-16 05:14+0000\n" -"PO-Revision-Date: 2020-09-16 07:55+0200\n" +"POT-Creation-Date: 2022-04-11 13:46+0000\n" +"PO-Revision-Date: 2022-04-11 16:11+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,21 +17,26 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatalt: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:268 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:275 #, c-format msgid "warning: " msgstr "varning: " +#: ../../../src/common/logging.c:284 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:287 +#, c-format +msgid "hint: " +msgstr "tips: " + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -43,85 +48,89 @@ msgstr "slut på minne\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" -#: ../../common/jsonapi.c:1064 +#: ../../common/jsonapi.c:1078 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Escape-sekvens \"\\%s\" är ogiltig." -#: ../../common/jsonapi.c:1067 +#: ../../common/jsonapi.c:1081 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Tecken med värde 0x%02x måste escape:as." -#: ../../common/jsonapi.c:1070 +#: ../../common/jsonapi.c:1084 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Förväntade slut på indata, men hittade \"%s\"." -#: ../../common/jsonapi.c:1073 +#: ../../common/jsonapi.c:1087 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Färväntade array-element eller \"]\", men hittade \"%s\"." -#: ../../common/jsonapi.c:1076 +#: ../../common/jsonapi.c:1090 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "Förväntade \",\" eller \"]\", men hittade \"%s\"." -#: ../../common/jsonapi.c:1079 +#: ../../common/jsonapi.c:1093 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "Förväntade sig \":\" men hittade \"%s\"." -#: ../../common/jsonapi.c:1082 +#: ../../common/jsonapi.c:1096 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Förväntade JSON-värde, men hittade \"%s\"." -#: ../../common/jsonapi.c:1085 +#: ../../common/jsonapi.c:1099 msgid "The input string ended unexpectedly." msgstr "Indatasträngen avslutades oväntat." -#: ../../common/jsonapi.c:1087 +#: ../../common/jsonapi.c:1101 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Färväntade sträng eller \"}\", men hittade \"%s\"." -#: ../../common/jsonapi.c:1090 +#: ../../common/jsonapi.c:1104 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "Förväntade sig \",\" eller \"}\" men hittade \"%s\"." -#: ../../common/jsonapi.c:1093 +#: ../../common/jsonapi.c:1107 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Förväntade sträng, men hittade \"%s\"." -#: ../../common/jsonapi.c:1096 +#: ../../common/jsonapi.c:1110 #, c-format msgid "Token \"%s\" is invalid." msgstr "Token \"%s\" är ogiltig." -#: ../../common/jsonapi.c:1099 +#: ../../common/jsonapi.c:1113 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kan inte konverteras till text." -#: ../../common/jsonapi.c:1101 +#: ../../common/jsonapi.c:1115 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\" måste följas av fyra hexdecimala siffror." -#: ../../common/jsonapi.c:1104 +#: ../../common/jsonapi.c:1118 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Escape-värden för unicode kan inte användas för kodpunkter med värde över 007F när kodningen inte är UTF8." -#: ../../common/jsonapi.c:1106 +#: ../../common/jsonapi.c:1120 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodes övre surrogathalva får inte komma efter en övre surrogathalva." -#: ../../common/jsonapi.c:1108 +#: ../../common/jsonapi.c:1122 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicodes lägre surrogathalva måste följa en övre surrogathalva." +#: parse_manifest.c:150 +msgid "parsing failed" +msgstr "parsning misslyckades" + #: parse_manifest.c:152 msgid "manifest ended unexpectedly" msgstr "manifestet avslutades oväntat" @@ -184,7 +193,7 @@ msgstr "saknar storlek" #: parse_manifest.c:480 msgid "checksum without algorithm" -msgstr "checksumma utan algoritm" +msgstr "kontrollsumma utan algoritm" #: parse_manifest.c:494 msgid "could not decode file name" @@ -197,12 +206,12 @@ msgstr "filstorlek är inte ett haltal" #: parse_manifest.c:510 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "okänd checksum-algoritm: \"%s\"" +msgstr "okänd algoritm för kontrollsumma: \"%s\"" #: parse_manifest.c:529 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" -msgstr "ogiltig checksumma för fil \"%s\": \"%s\"" +msgstr "ogiltig kontrollsumma för fil \"%s\": \"%s\"" #: parse_manifest.c:572 msgid "missing timeline" @@ -236,154 +245,177 @@ msgstr "förväntade minst två rader" msgid "last line not newline-terminated" msgstr "sista raden är inte nyradsterminerad" +#: parse_manifest.c:657 +#, c-format +msgid "out of memory" +msgstr "slut på minne" + +#: parse_manifest.c:659 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "kunde inte initiera kontrollsumma för backup-manifest" + #: parse_manifest.c:661 #, c-format +msgid "could not update checksum of manifest" +msgstr "kunde inte uppdatera kontrollsumma för backup-manifest" + +#: parse_manifest.c:664 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "kunde inte göra klart kontrollsumma för backup-manifest" + +#: parse_manifest.c:668 +#, c-format msgid "manifest has no checksum" -msgstr "manifestet har ingen checksumma" +msgstr "manifestet har ingen kontrollsumma" -#: parse_manifest.c:665 +#: parse_manifest.c:672 #, c-format msgid "invalid manifest checksum: \"%s\"" -msgstr "ogiltig manifestchecksumma: \"%s\"" +msgstr "ogiltig kontrollsumma för manifest: \"%s\"" -#: parse_manifest.c:669 +#: parse_manifest.c:676 #, c-format msgid "manifest checksum mismatch" -msgstr "manifestchecksumman matchar inte" +msgstr "kontrollsumma för manifest matchar inte" -#: parse_manifest.c:683 +#: parse_manifest.c:691 #, c-format msgid "could not parse backup manifest: %s" msgstr "kunde inte parsa backup-manifest: %s" -#: pg_verifybackup.c:255 pg_verifybackup.c:265 pg_verifybackup.c:277 +#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Försök med \"%s --help\" för mer information.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." #: pg_verifybackup.c:264 #, c-format msgid "no backup directory specified" msgstr "ingen backup-katalog angiven" -#: pg_verifybackup.c:275 +#: pg_verifybackup.c:274 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för många kommandoradsargument (första är \"%s\")" -#: pg_verifybackup.c:298 +#: pg_verifybackup.c:297 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"Programmet \"%s\" behövs av %s men hittades inte i samma\n" -"katalog som \"%s\".\n" -"Kontrollera din installation." +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\"" -#: pg_verifybackup.c:303 +#: pg_verifybackup.c:300 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"Programmet \"%s\" hittades av \"%s\"\n" -"men är inte av samma version som %s.\n" -"Kontrollera din installation." +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s" -#: pg_verifybackup.c:361 +#: pg_verifybackup.c:356 #, c-format msgid "backup successfully verified\n" msgstr "korrekt verifierad backup\n" -#: pg_verifybackup.c:387 pg_verifybackup.c:723 +#: pg_verifybackup.c:382 pg_verifybackup.c:718 #, c-format msgid "could not open file \"%s\": %m" msgstr "kunde inte öppna fil \"%s\": %m" -#: pg_verifybackup.c:391 +#: pg_verifybackup.c:386 #, c-format msgid "could not stat file \"%s\": %m" msgstr "kunde inte göra stat() på fil \"%s\": %m" -#: pg_verifybackup.c:411 pg_verifybackup.c:738 +#: pg_verifybackup.c:406 pg_verifybackup.c:747 #, c-format msgid "could not read file \"%s\": %m" msgstr "kunde inte läsa fil \"%s\": %m" -#: pg_verifybackup.c:414 +#: pg_verifybackup.c:409 #, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" +msgid "could not read file \"%s\": read %d of %lld" +msgstr "kunde inte läsa fil \"%s\": läste %d av %lld" -#: pg_verifybackup.c:474 +#: pg_verifybackup.c:469 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "duplicerad sökväg i backup-manifest: \"%s\"" -#: pg_verifybackup.c:537 pg_verifybackup.c:544 +#: pg_verifybackup.c:532 pg_verifybackup.c:539 #, c-format msgid "could not open directory \"%s\": %m" msgstr "kunde inte öppna katalog \"%s\": %m" -#: pg_verifybackup.c:576 +#: pg_verifybackup.c:571 #, c-format msgid "could not close directory \"%s\": %m" msgstr "kunde inte stänga katalog \"%s\": %m" -#: pg_verifybackup.c:596 +#: pg_verifybackup.c:591 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "kunde inte ta status på fil eller katalog \"%s\": %m" -#: pg_verifybackup.c:619 +#: pg_verifybackup.c:614 #, c-format msgid "\"%s\" is not a file or directory" msgstr "\"%s\" är inte en fil eller katalog" -#: pg_verifybackup.c:629 +#: pg_verifybackup.c:624 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "\"%s\" finns på disk men är inte i manifestet" -#: pg_verifybackup.c:641 +#: pg_verifybackup.c:636 #, c-format -msgid "\"%s\" has size %zu on disk but size %zu in the manifest" -msgstr "\"%s\" har storlek %zu på disk men storlek %zu i manifestet" +msgid "\"%s\" has size %lld on disk but size %zu in the manifest" +msgstr "\"%s\" har storlek %lld på disk men storlek %zu i manifestet" -#: pg_verifybackup.c:668 +#: pg_verifybackup.c:663 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "\"%s\" finns i manifestet men inte på disk" -#: pg_verifybackup.c:744 +#: pg_verifybackup.c:726 +#, c-format +msgid "could not initialize checksum of file \"%s\"" +msgstr "kunde inte initiera kontrollsumma för filen \"%s\"" + +#: pg_verifybackup.c:738 +#, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "kunde inte uppdatera kontrollsumma för filen \"%s\"" + +#: pg_verifybackup.c:753 #, c-format msgid "could not close file \"%s\": %m" msgstr "kunde inte stänga fil \"%s\": %m" -#: pg_verifybackup.c:763 +#: pg_verifybackup.c:772 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "filen \"%s\" skall innehålla %zu byte men vi läste %zu byte" -#: pg_verifybackup.c:774 +#: pg_verifybackup.c:782 +#, c-format +msgid "could not finalize checksum of file \"%s\"" +msgstr "kunde inte göra klart kontrollsumma för filen \"%s\"" + +#: pg_verifybackup.c:790 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" -msgstr "filen \"%s\" har checksumma med längd %d men förväntade %d" +msgstr "filen \"%s\" har kontrollsumma med längd %d men förväntade %d" -#: pg_verifybackup.c:778 +#: pg_verifybackup.c:794 #, c-format msgid "checksum mismatch for file \"%s\"" -msgstr "checksumman matchar inte för fil \"%s\"" +msgstr "kontrollsumman matchar inte för fil \"%s\"" -#: pg_verifybackup.c:804 +#: pg_verifybackup.c:818 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "WAL-parsning misslyckades för tidslinje %u" -#: pg_verifybackup.c:890 +#: pg_verifybackup.c:904 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" @@ -392,7 +424,7 @@ msgstr "" "%s verifierar en backup gentemot backup-manifestet.\n" "\n" -#: pg_verifybackup.c:891 +#: pg_verifybackup.c:905 #, c-format msgid "" "Usage:\n" @@ -403,57 +435,57 @@ msgstr "" " %s [FLAGGOR]... BACKUPKAT\n" "\n" -#: pg_verifybackup.c:892 +#: pg_verifybackup.c:906 #, c-format msgid "Options:\n" msgstr "Flaggor:\n" -#: pg_verifybackup.c:893 +#: pg_verifybackup.c:907 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error avsluta direkt vid fel\n" -#: pg_verifybackup.c:894 +#: pg_verifybackup.c:908 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=RELATIV_SÖKVÄG hoppa över angiven sökväg\n" -#: pg_verifybackup.c:895 +#: pg_verifybackup.c:909 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=SÖKVÄG använd denna sökväg till manifestet\n" -#: pg_verifybackup.c:896 +#: pg_verifybackup.c:910 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal försök inte parsa WAL-filer\n" -#: pg_verifybackup.c:897 +#: pg_verifybackup.c:911 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet skriv inte ut några meddelanden förutom fel\n" -#: pg_verifybackup.c:898 +#: pg_verifybackup.c:912 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" -msgstr " -s, --skip-checksums hoppa över verifiering av checksummor\n" +msgstr " -s, --skip-checksums hoppa över verifiering av kontrollsummor\n" -#: pg_verifybackup.c:899 +#: pg_verifybackup.c:913 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr " -w, --wal-directory=SÖKVÄG använd denna sökväg till WAL-filer\n" -#: pg_verifybackup.c:900 +#: pg_verifybackup.c:914 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_verifybackup.c:901 +#: pg_verifybackup.c:915 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: pg_verifybackup.c:902 +#: pg_verifybackup.c:916 #, c-format msgid "" "\n" @@ -462,25 +494,35 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_verifybackup.c:903 +#: pg_verifybackup.c:917 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" +#, c-format #~ msgid "" -#~ "The program \"%s\" is needed by %s but was\n" -#~ "not found in the same directory as \"%s\".\n" +#~ "The program \"%s\" is needed by %s but was not found in the\n" +#~ "same directory as \"%s\".\n" #~ "Check your installation." #~ msgstr "" #~ "Programmet \"%s\" behövs av %s men hittades inte i samma\n" #~ "katalog som \"%s\".\n" #~ "Kontrollera din installation." +#, c-format #~ msgid "" -#~ "The program \"%s\" was found by \"%s\" but was\n" -#~ "not the same version as %s.\n" +#~ "The program \"%s\" was found by \"%s\"\n" +#~ "but was not the same version as %s.\n" #~ "Check your installation." #~ msgstr "" #~ "Programmet \"%s\" hittades av \"%s\"\n" #~ "men är inte av samma version som %s.\n" #~ "Kontrollera din installation." + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Försök med \"%s --help\" för mer information.\n" + +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatalt: " diff --git a/src/bin/pg_verifybackup/po/uk.po b/src/bin/pg_verifybackup/po/uk.po index f8bb42a2d4..5fdcc77e51 100644 --- a/src/bin/pg_verifybackup/po/uk.po +++ b/src/bin/pg_verifybackup/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:14+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" +"POT-Creation-Date: 2021-08-17 08:45+0000\n" +"PO-Revision-Date: 2021-08-17 10:54\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,20 +14,20 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/pg_verifybackup.pot\n" -"X-Crowdin-File-ID: 528\n" +"X-Crowdin-File: /REL_14_DEV/pg_verifybackup.pot\n" +"X-Crowdin-File-ID: 756\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "збій: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "помилка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "попередження: " @@ -43,82 +43,82 @@ msgstr "недостатньо пам'яті\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "неможливо дублювати нульовий покажчик (внутрішня помилка)\n" -#: ../../common/jsonapi.c:1064 +#: ../../common/jsonapi.c:1066 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Неприпустима спеціальна послідовність \"\\%s\"." -#: ../../common/jsonapi.c:1067 +#: ../../common/jsonapi.c:1069 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ зі значенням 0x%02x повинен бути пропущений." -#: ../../common/jsonapi.c:1070 +#: ../../common/jsonapi.c:1072 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Очікувався кінець введення, але знайдено \"%s\"." -#: ../../common/jsonapi.c:1073 +#: ../../common/jsonapi.c:1075 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Очікувався елемент масиву або \"]\", але знайдено \"%s\"." -#: ../../common/jsonapi.c:1076 +#: ../../common/jsonapi.c:1078 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "Очікувалось \",\" або \"]\", але знайдено \"%s\"." -#: ../../common/jsonapi.c:1079 +#: ../../common/jsonapi.c:1081 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "Очікувалось \":\", але знайдено \"%s\"." -#: ../../common/jsonapi.c:1082 +#: ../../common/jsonapi.c:1084 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Очікувалось значення JSON, але знайдено \"%s\"." -#: ../../common/jsonapi.c:1085 +#: ../../common/jsonapi.c:1087 msgid "The input string ended unexpectedly." msgstr "Несподіваний кінець вхідного рядка." -#: ../../common/jsonapi.c:1087 +#: ../../common/jsonapi.c:1089 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Очікувався рядок або \"}\", але знайдено \"%s\"." -#: ../../common/jsonapi.c:1090 +#: ../../common/jsonapi.c:1092 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "Очікувалось \",\" або \"}\", але знайдено \"%s\"." -#: ../../common/jsonapi.c:1093 +#: ../../common/jsonapi.c:1095 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Очікувався рядок, але знайдено \"%s\"." -#: ../../common/jsonapi.c:1096 +#: ../../common/jsonapi.c:1098 #, c-format msgid "Token \"%s\" is invalid." msgstr "Неприпустимий маркер \"%s\"." -#: ../../common/jsonapi.c:1099 +#: ../../common/jsonapi.c:1101 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 не можна перетворити в текст." -#: ../../common/jsonapi.c:1101 +#: ../../common/jsonapi.c:1103 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" повинні прямувати чотири шістнадцяткових числа." -#: ../../common/jsonapi.c:1104 +#: ../../common/jsonapi.c:1106 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Значення виходу Unicode не можна використовувати для значень кодових точок більше 007F, якщо кодування не UTF8." -#: ../../common/jsonapi.c:1106 +#: ../../common/jsonapi.c:1108 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Старший сурогат Unicode не повинен прямувати за іншим старшим сурогатом." -#: ../../common/jsonapi.c:1108 +#: ../../common/jsonapi.c:1110 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Молодший сурогат Unicode не повинен прямувати за іншим молодшим сурогатом." @@ -236,22 +236,42 @@ msgstr "очікувалося принаймні 2 рядки" msgid "last line not newline-terminated" msgstr "останній рядок не завершений новим рядком" +#: parse_manifest.c:657 +#, c-format +msgid "out of memory" +msgstr "недостатньо пам'яті" + +#: parse_manifest.c:659 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "не вдалося ініціалізувати контрольну суму маніфесту" + #: parse_manifest.c:661 #, c-format +msgid "could not update checksum of manifest" +msgstr "не вдалося оновити контрольну суму маніфесту" + +#: parse_manifest.c:664 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "не вдалося остаточно завершити контрольну суму маніфесту" + +#: parse_manifest.c:668 +#, c-format msgid "manifest has no checksum" msgstr "у маніфесті немає контрольної суми" -#: parse_manifest.c:665 +#: parse_manifest.c:672 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "неприпустима контрольна сума маніфесту: \"%s\"" -#: parse_manifest.c:669 +#: parse_manifest.c:676 #, c-format msgid "manifest checksum mismatch" msgstr "невідповідність контрольної суми маніфесту" -#: parse_manifest.c:683 +#: parse_manifest.c:691 #, c-format msgid "could not parse backup manifest: %s" msgstr "не вдалося проаналізувати маніфест резервної копії: %s" @@ -259,7 +279,7 @@ msgstr "не вдалося проаналізувати маніфест рез #: pg_verifybackup.c:255 pg_verifybackup.c:265 pg_verifybackup.c:277 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" для отримання додаткової інформації.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" #: pg_verifybackup.c:264 #, c-format @@ -287,166 +307,181 @@ msgid "The program \"%s\" was found by \"%s\"\n" msgstr "Програма \"%s\" була знайдена \"%s\", але не була тієї ж версії, що %s.\n" "Перевірте вашу установку." -#: pg_verifybackup.c:361 +#: pg_verifybackup.c:362 #, c-format msgid "backup successfully verified\n" msgstr "резервну копію успішно перевірено\n" -#: pg_verifybackup.c:387 pg_verifybackup.c:723 +#: pg_verifybackup.c:388 pg_verifybackup.c:724 #, c-format msgid "could not open file \"%s\": %m" msgstr "не можливо відкрити файл \"%s\": %m" -#: pg_verifybackup.c:391 +#: pg_verifybackup.c:392 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не вдалося отримати інформацію від файлу \"%s\": %m" -#: pg_verifybackup.c:411 pg_verifybackup.c:738 +#: pg_verifybackup.c:412 pg_verifybackup.c:753 #, c-format msgid "could not read file \"%s\": %m" msgstr "не вдалося прочитати файл \"%s\": %m" -#: pg_verifybackup.c:414 +#: pg_verifybackup.c:415 #, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "не вдалося прочитати файл \"%s\": прочитано %d з %zu" +msgid "could not read file \"%s\": read %d of %lld" +msgstr "не вдалося прочитати файл \"%s\": прочитано %d з %lld" -#: pg_verifybackup.c:474 +#: pg_verifybackup.c:475 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "дубльований шлях у маніфесті резервного копіювання: \"%s\"" -#: pg_verifybackup.c:537 pg_verifybackup.c:544 +#: pg_verifybackup.c:538 pg_verifybackup.c:545 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не вдалося відкрити каталог \"%s\": %m" -#: pg_verifybackup.c:576 +#: pg_verifybackup.c:577 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не вдалося закрити каталог \"%s\": %m" -#: pg_verifybackup.c:596 +#: pg_verifybackup.c:597 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "не вдалося отримати інформацію про файл або каталог \"%s\": %m" -#: pg_verifybackup.c:619 +#: pg_verifybackup.c:620 #, c-format msgid "\"%s\" is not a file or directory" msgstr "\"%s\" не є файлом або каталогом" -#: pg_verifybackup.c:629 +#: pg_verifybackup.c:630 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "\"%s\" присутній на диску, але не у маніфесті" -#: pg_verifybackup.c:641 +#: pg_verifybackup.c:642 #, c-format -msgid "\"%s\" has size %zu on disk but size %zu in the manifest" -msgstr "\"%s\" має розмір %zu на диску, але розмір %zu у маніфесті" +msgid "\"%s\" has size %lld on disk but size %zu in the manifest" +msgstr "\"%s\" має розмір %lld на диску, але розмір %zu у маніфесті" -#: pg_verifybackup.c:668 +#: pg_verifybackup.c:669 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "\"%s\" присутній у маніфесті, але не на диску" +#: pg_verifybackup.c:732 +#, c-format +msgid "could not initialize checksum of file \"%s\"" +msgstr "не вдалося ініціалізувати контрольну суму файлу \"%s\"" + #: pg_verifybackup.c:744 #, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "не вдалося оновити контрольну суму файлу \"%s\"" + +#: pg_verifybackup.c:759 +#, c-format msgid "could not close file \"%s\": %m" msgstr "неможливо закрити файл \"%s\": %m" -#: pg_verifybackup.c:763 +#: pg_verifybackup.c:778 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "файл \"%s\" мусить містити %zu байтів, але прочитано %zu байтів" -#: pg_verifybackup.c:774 +#: pg_verifybackup.c:788 +#, c-format +msgid "could not finalize checksum of file \"%s\"" +msgstr "не вдалося остаточно завершити контрольну суму файлу \"%s\"" + +#: pg_verifybackup.c:796 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "файл \"%s\" має контрольну суму довжини %d, але очікувалось %d" -#: pg_verifybackup.c:778 +#: pg_verifybackup.c:800 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "невідповідність контрольної суми для файлу \"%s\"" -#: pg_verifybackup.c:804 +#: pg_verifybackup.c:824 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "не вдалося проаналізувати WAL для часової шкали %u" -#: pg_verifybackup.c:890 +#: pg_verifybackup.c:910 #, c-format msgid "%s verifies a backup against the backup manifest.\n\n" msgstr "%s перевіряє резервну копію відповідно до маніфесту резервного копіювання.\n\n" -#: pg_verifybackup.c:891 +#: pg_verifybackup.c:911 #, c-format msgid "Usage:\n" " %s [OPTION]... BACKUPDIR\n\n" msgstr "Використання:\n" " %s [OPTION]... КАТАЛОГ_КОПІЮВАННЯ\n\n" -#: pg_verifybackup.c:892 +#: pg_verifybackup.c:912 #, c-format msgid "Options:\n" msgstr "Параметри:\n" -#: pg_verifybackup.c:893 +#: pg_verifybackup.c:913 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error вийти при помилці\n" -#: pg_verifybackup.c:894 +#: pg_verifybackup.c:914 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=RELATIVE_PATH ігнорувати вказаний шлях\n" -#: pg_verifybackup.c:895 +#: pg_verifybackup.c:915 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=PATH використовувати вказаний шлях для маніфесту\n" -#: pg_verifybackup.c:896 +#: pg_verifybackup.c:916 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal не намагатися аналізувати файли WAL\n" -#: pg_verifybackup.c:897 +#: pg_verifybackup.c:917 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet не друкувати жодного виводу, окрім помилок\n" -#: pg_verifybackup.c:898 +#: pg_verifybackup.c:918 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums не перевіряти контрольні суми\n" -#: pg_verifybackup.c:899 +#: pg_verifybackup.c:919 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr " -w, --wal-directory=PATH використовувати вказаний шлях для файлів WAL\n" -#: pg_verifybackup.c:900 +#: pg_verifybackup.c:920 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію, потім вийти\n" -#: pg_verifybackup.c:901 +#: pg_verifybackup.c:921 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: pg_verifybackup.c:902 +#: pg_verifybackup.c:922 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "Повідомляти про помилки на <%s>.\n" -#: pg_verifybackup.c:903 +#: pg_verifybackup.c:923 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" diff --git a/src/bin/pg_verifybackup/po/zh_CN.po b/src/bin/pg_verifybackup/po/zh_CN.po index 9dd2291ee4..b7d97c8976 100644 --- a/src/bin/pg_verifybackup/po/zh_CN.po +++ b/src/bin/pg_verifybackup/po/zh_CN.po @@ -1,32 +1,32 @@ # LANGUAGE message translation file for pg_verifybackup # Copyright (C) 2020 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package. -# FIRST AUTHOR , 2020. +# FIRST AUTHOR , 2020. # msgid "" msgstr "" -"Project-Id-Version: pg_verifybackup (PostgreSQL) 13\n" +"Project-Id-Version: pg_verifybackup (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-05-17 02:44+0000\n" -"PO-Revision-Date: 2020-06-22 16:00+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:45+0000\n" +"PO-Revision-Date: 2021-08-15 16:00+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "致命的:" -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "错误: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "警告: " @@ -35,89 +35,89 @@ msgstr "警告: " #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format msgid "out of memory\n" -msgstr "内存溢出\n" +msgstr "内存不足\n" #: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "无法复制空指针 (内部错误)\n" -#: ../../common/jsonapi.c:1064 +#: ../../common/jsonapi.c:1066 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "转义序列 \"\\%s\" 无效." -#: ../../common/jsonapi.c:1067 +#: ../../common/jsonapi.c:1069 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "值为 0x%02x 的字符必须进行转义处理." -#: ../../common/jsonapi.c:1070 +#: ../../common/jsonapi.c:1072 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "期望输入结束,结果发现是\"%s\"." -#: ../../common/jsonapi.c:1073 +#: ../../common/jsonapi.c:1075 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "期望为数组元素或者\"]\",但发现结果是\"%s\"." -#: ../../common/jsonapi.c:1076 +#: ../../common/jsonapi.c:1078 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "期望是\",\" 或 \"]\",但发现结果是\"%s\"." -#: ../../common/jsonapi.c:1079 +#: ../../common/jsonapi.c:1081 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "期望得到 \":\",但发现结果是\"%s\"." -#: ../../common/jsonapi.c:1082 +#: ../../common/jsonapi.c:1084 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "期望是JSON值, 但结果发现是\"%s\"." -#: ../../common/jsonapi.c:1085 +#: ../../common/jsonapi.c:1087 msgid "The input string ended unexpectedly." msgstr "输入字符串意外终止." -#: ../../common/jsonapi.c:1087 +#: ../../common/jsonapi.c:1089 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "期望是字符串或\"}\",但发现结果是\"%s\"." -#: ../../common/jsonapi.c:1090 +#: ../../common/jsonapi.c:1092 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "期望是 \",\" 或 \"}\",但发现结果是\"%s\"." -#: ../../common/jsonapi.c:1093 +#: ../../common/jsonapi.c:1095 #, c-format msgid "Expected string, but found \"%s\"." msgstr "期望是字符串, 但发现结果是\"%s\"." -#: ../../common/jsonapi.c:1096 +#: ../../common/jsonapi.c:1098 #, c-format msgid "Token \"%s\" is invalid." msgstr "令牌 \"%s\" 无效." -#: ../../common/jsonapi.c:1099 +#: ../../common/jsonapi.c:1101 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000不能被转换为文本。" -#: ../../common/jsonapi.c:1101 +#: ../../common/jsonapi.c:1103 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\" 后必须紧跟有效的十六进制数数字" -#: ../../common/jsonapi.c:1104 +#: ../../common/jsonapi.c:1106 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "当编码不是UTF8时,大于007F的码位值不能使用Unicode转义值." -#: ../../common/jsonapi.c:1106 +#: ../../common/jsonapi.c:1108 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicode 的高位代理项不能紧随另一个高位代理项." -#: ../../common/jsonapi.c:1108 +#: ../../common/jsonapi.c:1110 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicode 代位代理项必须紧随一个高位代理项." @@ -146,16 +146,16 @@ msgid "expected version indicator" msgstr "预期的版本指示器" #: parse_manifest.c:328 -msgid "unknown toplevel field" -msgstr "未知的顶层字段" +msgid "unrecognized top-level field" +msgstr "无法识别的顶层字段" #: parse_manifest.c:347 msgid "unexpected file field" msgstr "意外的文件字段" #: parse_manifest.c:361 -msgid "unexpected wal range field" -msgstr "意外的wal范围字段" +msgid "unexpected WAL range field" +msgstr "意外的WAL范围字段" #: parse_manifest.c:367 msgid "unexpected object field" @@ -170,11 +170,11 @@ msgid "unexpected scalar" msgstr "意外的标量" #: parse_manifest.c:472 -msgid "missing pathname" +msgid "missing path name" msgstr "缺少路径名" #: parse_manifest.c:475 -msgid "both pathname and encoded pathname" +msgid "both path name and encoded path name" msgstr "路径名和编码路径名" #: parse_manifest.c:477 @@ -186,7 +186,7 @@ msgid "checksum without algorithm" msgstr "校验和没有算法" #: parse_manifest.c:494 -msgid "unable to decode filename" +msgid "could not decode file name" msgstr "无法解码文件名" #: parse_manifest.c:504 @@ -220,11 +220,11 @@ msgid "timeline is not an integer" msgstr "时间线不是整数" #: parse_manifest.c:585 -msgid "unable to parse start LSN" +msgid "could not parse start LSN" msgstr "无法解析起始LSN" #: parse_manifest.c:588 -msgid "unable to parse end LSN" +msgid "could not parse end LSN" msgstr "无法解析结束LSN" #: parse_manifest.c:649 @@ -235,22 +235,39 @@ msgstr "至少需要2行" msgid "last line not newline-terminated" msgstr "最后一行未以换行符结尾" +#: parse_manifest.c:657 +#, c-format +msgid "out of memory" +msgstr "内存不足" + +#: parse_manifest.c:659 +msgid "could not initialize checksum of manifest" +msgstr "无法初始化清单的校验和" + #: parse_manifest.c:661 +msgid "could not update checksum of manifest" +msgstr "无法更新清单的校验和" + +#: parse_manifest.c:664 +msgid "could not finalize checksum of manifest" +msgstr "无法完成清单的校验和" + +#: parse_manifest.c:668 #, c-format msgid "manifest has no checksum" msgstr "清单没有校验和" -#: parse_manifest.c:665 +#: parse_manifest.c:672 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "清单校验和无效: \"%s\"" -#: parse_manifest.c:669 +#: parse_manifest.c:676 #, c-format msgid "manifest checksum mismatch" msgstr "清单校验和不匹配" -#: parse_manifest.c:683 +#: parse_manifest.c:691 #, c-format msgid "could not parse backup manifest: %s" msgstr "清单校验和不匹配: %s" @@ -292,97 +309,106 @@ msgstr "" "但与%s的版本不同.\n" "检查您的安装." -#: pg_verifybackup.c:361 +#: pg_verifybackup.c:362 #, c-format msgid "backup successfully verified\n" msgstr "备份已成功验证\n" -#: pg_verifybackup.c:387 pg_verifybackup.c:723 +#: pg_verifybackup.c:388 pg_verifybackup.c:724 #, c-format msgid "could not open file \"%s\": %m" msgstr "无法打开文件 \"%s\": %m" -#: pg_verifybackup.c:391 +#: pg_verifybackup.c:392 #, c-format msgid "could not stat file \"%s\": %m" msgstr "无法取文件 \"%s\" 的状态: %m" -#: pg_verifybackup.c:411 pg_verifybackup.c:738 +#: pg_verifybackup.c:412 pg_verifybackup.c:753 #, c-format msgid "could not read file \"%s\": %m" msgstr "无法读取文件 \"%s\": %m" -#: pg_verifybackup.c:414 -#, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "无法读取文件\"%1$s\":读取了%3$zu中的%2$d" +#: pg_verifybackup.c:415 +msgid "could not read file \"%s\": read %d of %lld" +msgstr "无法读取文件\"%1$s\":读取了%3$lld中的%2$d" -#: pg_verifybackup.c:474 -#, c-format -msgid "duplicate pathname in backup manifest: \"%s\"" +#: pg_verifybackup.c:475 +msgid "duplicate path name in backup manifest: \"%s\"" msgstr "备份清单中的路径名重复: \"%s\"" -#: pg_verifybackup.c:537 pg_verifybackup.c:544 +#: pg_verifybackup.c:538 pg_verifybackup.c:545 #, c-format msgid "could not open directory \"%s\": %m" msgstr "无法打开目录 \"%s\": %m" -#: pg_verifybackup.c:576 +#: pg_verifybackup.c:577 #, c-format msgid "could not close directory \"%s\": %m" msgstr "无法关闭目录 \"%s\": %m" -#: pg_verifybackup.c:596 +#: pg_verifybackup.c:597 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "无法统计文件或目录\"%s\": %m" -#: pg_verifybackup.c:619 +#: pg_verifybackup.c:620 #, c-format msgid "\"%s\" is not a file or directory" msgstr "\"%s\"不是文件或目录" -#: pg_verifybackup.c:629 +#: pg_verifybackup.c:630 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "磁盘上有\"%s\",但清单中没有" -#: pg_verifybackup.c:641 -#, c-format -msgid "\"%s\" has size %zu on disk but size %zu in the manifest" -msgstr "\"%s\"在磁盘上有大小%zu,但在清单中有大小%zu" +#: pg_verifybackup.c:642 +msgid "\"%s\" has size %lld on disk but size %zu in the manifest" +msgstr "\"%s\"在磁盘上有大小%lld,但在清单中有大小%zu" -#: pg_verifybackup.c:668 +#: pg_verifybackup.c:669 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "清单中有\"%s\",但磁盘上没有" +#: pg_verifybackup.c:732 +msgid "could not initialize checksum of file \"%s\"" +msgstr "无法初始化文件\"%s\"的校验和" + #: pg_verifybackup.c:744 +msgid "could not update checksum of file \"%s\"" +msgstr "无法更新文件\"%s\"的校验和" + +#: pg_verifybackup.c:759 #, c-format msgid "could not close file \"%s\": %m" msgstr "无法关闭文件 \"%s\": %m" -#: pg_verifybackup.c:763 +#: pg_verifybackup.c:778 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "文件\"%s\"应包含%zu到字节,但读取到%zu字节" -#: pg_verifybackup.c:774 +#: pg_verifybackup.c:788 +msgid "could not finalize checksum of file \"%s\"" +msgstr "无法完成文件\"%s\"的校验和" + +#: pg_verifybackup.c:796 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "文件\"%s\"的校验和长度为%d,但应为%d" -#: pg_verifybackup.c:778 +#: pg_verifybackup.c:800 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "文件\"%s\"的校验和不匹配" -#: pg_verifybackup.c:804 +#: pg_verifybackup.c:824 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "时间线%u的WAL解析失败" -#: pg_verifybackup.c:890 +#: pg_verifybackup.c:910 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" @@ -391,7 +417,7 @@ msgstr "" "%s 根据备份清单验证备份.\n" "\n" -#: pg_verifybackup.c:891 +#: pg_verifybackup.c:911 #, c-format msgid "" "Usage:\n" @@ -402,57 +428,57 @@ msgstr "" " %s [选项]... BACKUPDIR\n" "\n" -#: pg_verifybackup.c:892 +#: pg_verifybackup.c:912 #, c-format msgid "Options:\n" msgstr "选项:\n" -#: pg_verifybackup.c:893 +#: pg_verifybackup.c:913 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error 出错时立即退出\n" -#: pg_verifybackup.c:894 +#: pg_verifybackup.c:914 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=RELATIVE_PATH 忽略指定的路径\n" -#: pg_verifybackup.c:895 +#: pg_verifybackup.c:915 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=PATH 使用清单的指定路径\n" -#: pg_verifybackup.c:896 +#: pg_verifybackup.c:916 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal 不试图解析WAL文件\n" -#: pg_verifybackup.c:897 +#: pg_verifybackup.c:917 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet 不打印任何输出,错误除外\n" -#: pg_verifybackup.c:898 +#: pg_verifybackup.c:918 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums 跳过校验和验证\n" -#: pg_verifybackup.c:899 +#: pg_verifybackup.c:919 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr " -w, --wal-directory=PATH 对WAL文件使用指定路径\n" -#: pg_verifybackup.c:900 +#: pg_verifybackup.c:920 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 输出版本信息,然后退出\n" -#: pg_verifybackup.c:901 +#: pg_verifybackup.c:921 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 显示此帮助,然后退出\n" -#: pg_verifybackup.c:902 +#: pg_verifybackup.c:922 #, c-format msgid "" "\n" @@ -461,7 +487,8 @@ msgstr "" "\n" "臭虫报告至<%s>.\n" -#: pg_verifybackup.c:903 +#: pg_verifybackup.c:923 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 主页: <%s>\n" + diff --git a/src/bin/pg_waldump/po/de.po b/src/bin/pg_waldump/po/de.po index 99f2fd1ff4..3c13063675 100644 --- a/src/bin/pg_waldump/po/de.po +++ b/src/bin/pg_waldump/po/de.po @@ -1,14 +1,14 @@ # German message translation file for pg_waldump -# Copyright (C) 2020 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Peter Eisentraut , 2020. +# Peter Eisentraut , 2022. # msgid "" msgstr "" -"Project-Id-Version: pg_waldump (PostgreSQL) 13\n" +"Project-Id-Version: pg_waldump (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-21 05:14+0000\n" -"PO-Revision-Date: 2020-04-21 19:02+0200\n" +"POT-Creation-Date: 2022-05-11 15:47+0000\n" +"PO-Revision-Date: 2022-05-11 22:35+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -17,69 +17,74 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "Fatal: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "Warnung: " -#: pg_waldump.c:146 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "Tipp: " + +#: pg_waldump.c:160 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" -#: pg_waldump.c:202 +#: pg_waldump.c:216 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes" msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Kopf der WAL-Datei »%s« gibt %d Byte an" msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Kopf der WAL-Datei »%s« gibt %d Bytes an" -#: pg_waldump.c:210 +#: pg_waldump.c:222 #, c-format msgid "could not read file \"%s\": %m" msgstr "konnte Datei »%s« nicht lesen: %m" -#: pg_waldump.c:213 +#: pg_waldump.c:225 #, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" +msgid "could not read file \"%s\": read %d of %d" +msgstr "konnte Datei »%s« nicht lesen: %d von %d gelesen" -#: pg_waldump.c:275 +#: pg_waldump.c:286 #, c-format msgid "could not locate WAL file \"%s\"" msgstr "konnte WAL-Datei »%s« nicht finden" -#: pg_waldump.c:277 +#: pg_waldump.c:288 #, c-format msgid "could not find any WAL file" msgstr "konnte keine WAL-Datei finden" -#: pg_waldump.c:319 +#: pg_waldump.c:329 #, c-format msgid "could not find file \"%s\": %m" msgstr "konnte Datei »%s« nicht finden: %m" -#: pg_waldump.c:359 +#: pg_waldump.c:378 #, c-format -msgid "could not read from file %s, offset %u: %m" -msgstr "konnte nicht aus Datei %s, Position %u lesen: %m" +msgid "could not read from file %s, offset %d: %m" +msgstr "konnte nicht aus Datei %s, Position %d lesen: %m" -#: pg_waldump.c:363 +#: pg_waldump.c:382 #, c-format -msgid "could not read from file %s, offset %u: read %d of %zu" -msgstr "konnte nicht aus Datei %s, Position %u lesen: %d von %zu gelesen" +msgid "could not read from file %s, offset %d: read %d of %d" +msgstr "konnte nicht aus Datei %s, Position %d lesen: %d von %d gelesen" -#: pg_waldump.c:712 +#: pg_waldump.c:658 #, c-format msgid "" "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n" @@ -88,17 +93,17 @@ msgstr "" "%s dekodiert und zeigt PostgreSQL-Write-Ahead-Logs zum Debuggen.\n" "\n" -#: pg_waldump.c:714 +#: pg_waldump.c:660 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_waldump.c:715 +#: pg_waldump.c:661 #, c-format msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" msgstr " %s [OPTION]... [STARTSEG [ENDSEG]]\n" -#: pg_waldump.c:716 +#: pg_waldump.c:662 #, c-format msgid "" "\n" @@ -107,27 +112,43 @@ msgstr "" "\n" "Optionen:\n" -#: pg_waldump.c:717 +#: pg_waldump.c:663 #, c-format msgid " -b, --bkp-details output detailed information about backup blocks\n" msgstr " -b, --bkp-details detaillierte Informationen über Backup-Blöcke ausgeben\n" -#: pg_waldump.c:718 +#: pg_waldump.c:664 +#, c-format +msgid " -B, --block=N with --relation, only show records that modify block N\n" +msgstr "" +" -B, --block=N mit --relation, nur Datensätze zeigen, die Block N\n" +" modifizieren\n" + +#: pg_waldump.c:665 #, c-format msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" msgstr " -e, --end=RECPTR bei WAL-Position RECPTR zu lesen aufhören\n" -#: pg_waldump.c:719 +#: pg_waldump.c:666 #, c-format msgid " -f, --follow keep retrying after reaching end of WAL\n" msgstr " -f, --follow am Ende des WAL weiter versuchen\n" -#: pg_waldump.c:720 +#: pg_waldump.c:667 +#, c-format +msgid "" +" -F, --fork=FORK only show records that modify blocks in fork FORK;\n" +" valid names are main, fsm, vm, init\n" +msgstr "" +" -F, --fork=FORK nur Datensätze zeigen, die Blöcke in Fork FORK\n" +" modifizieren; gültige Werte sind main, fsm, vm, init\n" + +#: pg_waldump.c:669 #, c-format msgid " -n, --limit=N number of records to display\n" msgstr " -n, --limit=N Anzahl der anzuzeigenden Datensätze\n" -#: pg_waldump.c:721 +#: pg_waldump.c:670 #, c-format msgid "" " -p, --path=PATH directory in which to find log segment files or a\n" @@ -138,12 +159,12 @@ msgstr "" " mit ./pg_wal mit solchen Dateien (Vorgabe: aktuelles\n" " Verzeichnis, ./pg_wal, $PGDATA/pg_wal)\n" -#: pg_waldump.c:724 +#: pg_waldump.c:673 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet keine Ausgabe, außer Fehler\n" -#: pg_waldump.c:725 +#: pg_waldump.c:674 #, c-format msgid "" " -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" @@ -152,12 +173,19 @@ msgstr "" " -r, --rmgr=RMGR nur Datensätze erzeugt von Resource-Manager RMGR zeigen;\n" " --rmgr=list zeigt gültige Resource-Manager-Namen\n" -#: pg_waldump.c:727 +#: pg_waldump.c:676 +#, c-format +msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n" +msgstr "" +" -R, --relation=T/D/R nur Datensätze zeigen, die Blöcke in Relation T/D/R\n" +" modifizieren\n" + +#: pg_waldump.c:677 #, c-format msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" msgstr " -s, --start=RECPTR bei WAL-Position RECPTR zu lesen anfangen\n" -#: pg_waldump.c:728 +#: pg_waldump.c:678 #, c-format msgid "" " -t, --timeline=TLI timeline from which to read log records\n" @@ -166,17 +194,22 @@ msgstr "" " -t, --timeline=ZAHL Zeitleiste aus der Datensätze gelesen werden sollen\n" " (Vorgabe: 1 oder der in STARTSEG verwendete Wert)\n" -#: pg_waldump.c:730 +#: pg_waldump.c:680 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_waldump.c:731 +#: pg_waldump.c:681 +#, c-format +msgid " -w, --fullpage only show records with a full page write\n" +msgstr " -w, --fullpage nur Datensätze mit einem Full-Page-Write zeigen\n" + +#: pg_waldump.c:682 #, c-format msgid " -x, --xid=XID only show records with transaction ID XID\n" msgstr " -x, --xid=XID nur Datensätze mit Transaktions-ID XID zeigen\n" -#: pg_waldump.c:732 +#: pg_waldump.c:683 #, c-format msgid "" " -z, --stats[=record] show statistics instead of records\n" @@ -185,12 +218,12 @@ msgstr "" " -z, --stats[=record] Statistiken statt Datensätzen anzeigen\n" " (optional Statistiken pro Datensatz zeigen)\n" -#: pg_waldump.c:734 +#: pg_waldump.c:685 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_waldump.c:735 +#: pg_waldump.c:686 #, c-format msgid "" "\n" @@ -199,109 +232,136 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_waldump.c:736 +#: pg_waldump.c:687 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_waldump.c:813 +#: pg_waldump.c:781 #, c-format msgid "no arguments specified" msgstr "keine Argumente angegeben" -#: pg_waldump.c:828 +#: pg_waldump.c:797 +#, fuzzy, c-format +#| msgid "could not parse file name \"%s\"" +msgid "could not parse valid block number \"%s\"" +msgstr "konnte Dateinamen »%s« nicht parsen" + +#: pg_waldump.c:806 #, c-format msgid "could not parse end WAL location \"%s\"" msgstr "konnte WAL-Endposition »%s« nicht parsen" -#: pg_waldump.c:840 +#: pg_waldump.c:819 +#, fuzzy, c-format +#| msgid "could not parse limit \"%s\"" +msgid "could not parse fork \"%s\"" +msgstr "konnte Limit »%s« nicht parsen" + +#: pg_waldump.c:827 #, c-format msgid "could not parse limit \"%s\"" msgstr "konnte Limit »%s« nicht parsen" -#: pg_waldump.c:871 +#: pg_waldump.c:858 +#, c-format +msgid "custom resource manager \"%s\" does not exist" +msgstr "Custom-Resouce-Manager »%s« existiert nicht" + +#: pg_waldump.c:879 #, c-format msgid "resource manager \"%s\" does not exist" msgstr "Resouce-Manager »%s« existiert nicht" -#: pg_waldump.c:880 +#: pg_waldump.c:894 +#, c-format +msgid "could not parse valid relation from \"%s\" (expecting \"tablespace OID/database OID/relation filenode\")" +msgstr "" + +#: pg_waldump.c:905 #, c-format msgid "could not parse start WAL location \"%s\"" msgstr "konnte WAL-Startposition »%s« nicht parsen" -#: pg_waldump.c:890 +#: pg_waldump.c:915 #, c-format msgid "could not parse timeline \"%s\"" msgstr "konnte Zeitleiste »%s« nicht parsen" -#: pg_waldump.c:897 +#: pg_waldump.c:925 #, c-format msgid "could not parse \"%s\" as a transaction ID" msgstr "konnte »%s« nicht als gültige Transaktions-ID parsen" -#: pg_waldump.c:912 +#: pg_waldump.c:940 #, c-format msgid "unrecognized argument to --stats: %s" msgstr "unbekanntes Argument für --stats: %s" -#: pg_waldump.c:925 +#: pg_waldump.c:954 +#, c-format +msgid "--block option requires --relation option to be specified" +msgstr "" + +#: pg_waldump.c:960 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_waldump.c:935 pg_waldump.c:955 +#: pg_waldump.c:970 pg_waldump.c:990 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: pg_waldump.c:961 pg_waldump.c:992 +#: pg_waldump.c:996 pg_waldump.c:1026 #, c-format msgid "could not open file \"%s\"" msgstr "konnte Datei »%s« nicht öffnen" -#: pg_waldump.c:971 +#: pg_waldump.c:1006 #, c-format msgid "start WAL location %X/%X is not inside file \"%s\"" msgstr "WAL-Startposition %X/%X ist nicht innerhalb der Datei »%s«" -#: pg_waldump.c:999 +#: pg_waldump.c:1033 #, c-format msgid "ENDSEG %s is before STARTSEG %s" msgstr "ENDSEG %s kommt vor STARTSEG %s" -#: pg_waldump.c:1014 +#: pg_waldump.c:1048 #, c-format msgid "end WAL location %X/%X is not inside file \"%s\"" msgstr "WAL-Endposition %X/%X ist nicht innerhalb der Datei »%s«" -#: pg_waldump.c:1027 +#: pg_waldump.c:1060 #, c-format msgid "no start WAL location given" msgstr "keine WAL-Startposition angegeben" -#: pg_waldump.c:1037 +#: pg_waldump.c:1074 #, c-format -msgid "out of memory" -msgstr "Speicher aufgebraucht" +msgid "out of memory while allocating a WAL reading processor" +msgstr "Speicher aufgebraucht beim Anlegen eines WAL-Leseprozessors" -#: pg_waldump.c:1043 +#: pg_waldump.c:1080 #, c-format msgid "could not find a valid record after %X/%X" msgstr "konnte keinen gültigen Datensatz nach %X/%X finden" -#: pg_waldump.c:1054 +#: pg_waldump.c:1090 #, c-format msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" msgstr[0] "erster Datensatz kommt nach %X/%X, bei %X/%X, %u Byte wurde übersprungen\n" msgstr[1] "erster Datensatz kommt nach %X/%X, bei %X/%X, %u Bytes wurden übersprungen\n" -#: pg_waldump.c:1105 +#: pg_waldump.c:1171 #, c-format msgid "error in WAL record at %X/%X: %s" msgstr "Fehler in WAL-Eintrag bei %X/%X: %s" -#: pg_waldump.c:1115 +#: pg_waldump.c:1180 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." diff --git a/src/bin/pg_waldump/po/fr.po b/src/bin/pg_waldump/po/fr.po index b0c5a60ee3..ce8b1c8a87 100644 --- a/src/bin/pg_waldump/po/fr.po +++ b/src/bin/pg_waldump/po/fr.po @@ -1,105 +1,114 @@ # LANGUAGE message translation file for pg_waldump -# Copyright (C) 2017 PostgreSQL Global Development Group -# This file is distributed under the same license as the PostgreSQL package. -# FIRST AUTHOR , 2017. +# Copyright (C) 2017-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_waldump (PostgreSQL) package. +# +# Use these quotes: « %s » +# +# Guillaume Lelarge , 2017-2022. # msgid "" msgstr "" -"Project-Id-Version: pg_waldump (PostgreSQL) 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-16 06:15+0000\n" -"PO-Revision-Date: 2020-04-16 14:09+0200\n" -"Last-Translator: \n" -"Language-Team: \n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"Last-Translator: Guillaume Lelarge \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.3\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatal : " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:273 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:280 #, c-format msgid "warning: " msgstr "attention : " -#: pg_waldump.c:146 +#: ../../../src/common/logging.c:291 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:298 +#, c-format +msgid "hint: " +msgstr "astuce : " + +#: pg_waldump.c:160 #, c-format msgid "could not open file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier « %s » : %m" -#: pg_waldump.c:202 +#: pg_waldump.c:216 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes" msgstr[0] "La taille du segment WAL doit être une puissance de deux entre 1 Mo et 1 Go, mais l'en-tête du fichier WAL « %s » indique %d octet" msgstr[1] "La taille du segment WAL doit être une puissance de deux entre 1 Mo et 1 Go, mais l'en-tête du fichier WAL « %s » indique %d octets" -#: pg_waldump.c:210 +#: pg_waldump.c:222 #, c-format msgid "could not read file \"%s\": %m" msgstr "n'a pas pu lire le fichier « %s » : %m" -#: pg_waldump.c:213 +#: pg_waldump.c:225 #, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" +msgid "could not read file \"%s\": read %d of %d" +msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %d" -#: pg_waldump.c:275 +#: pg_waldump.c:286 #, c-format msgid "could not locate WAL file \"%s\"" msgstr "n'a pas pu trouver le fichier WAL « %s »" -#: pg_waldump.c:277 +#: pg_waldump.c:288 #, c-format msgid "could not find any WAL file" msgstr "n'a pas pu trouver un seul fichier WAL" -#: pg_waldump.c:319 +#: pg_waldump.c:329 #, c-format msgid "could not find file \"%s\": %m" msgstr "n'a pas pu trouver le fichier « %s » : %m" -#: pg_waldump.c:359 +#: pg_waldump.c:378 #, c-format -msgid "could not read from file %s, offset %u: %m" -msgstr "n'a pas pu lire à partir du fichier « %s », décalage %u : %m" +msgid "could not read from file %s, offset %d: %m" +msgstr "n'a pas pu lire à partir du fichier %s, décalage %d : %m" -#: pg_waldump.c:363 +#: pg_waldump.c:382 #, c-format -msgid "could not read from file %s, offset %u: read %d of %zu" -msgstr "n'a pas pu lire à partir du fichier %s, décalage %u : %d lu sur %zu" +msgid "could not read from file %s, offset %d: read %d of %d" +msgstr "n'a pas pu lire à partir du fichier %s, décalage %d : %d lu sur %d" -#: pg_waldump.c:712 +#: pg_waldump.c:658 #, c-format msgid "" "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n" "\n" msgstr "" -"%s décode et affiche les journaux de transactions PostgreSQL pour du débogage.\n" +"%s décode et affiche les journaux de transactions PostgreSQL pour du\n" +"débogage.\n" "\n" -#: pg_waldump.c:714 +#: pg_waldump.c:660 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: pg_waldump.c:715 +#: pg_waldump.c:661 #, c-format msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" msgstr " %s [OPTION]... [SEG_DEBUT [SEG_FIN]]\n" -#: pg_waldump.c:716 +#: pg_waldump.c:662 #, c-format msgid "" "\n" @@ -108,92 +117,137 @@ msgstr "" "\n" "Options :\n" -#: pg_waldump.c:717 +#: pg_waldump.c:663 #, c-format msgid " -b, --bkp-details output detailed information about backup blocks\n" -msgstr " -b, --bkp-details affiche des informations détaillées sur les blocs de sauvegarde\n" +msgstr "" +" -b, --bkp-details affiche des informations détaillées sur les\n" +" blocs de sauvegarde\n" + +#: pg_waldump.c:664 +#, c-format +msgid " -B, --block=N with --relation, only show records that modify block N\n" +msgstr "" +" -B, --block=N avec --relation, affiche seulement les enregistrements\n" +" qui modifient le bloc N\n" -#: pg_waldump.c:718 +#: pg_waldump.c:665 #, c-format msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" -msgstr " -e, --end=RECPTR arrête la lecture des journaux de transactions à l'emplacement RECPTR\n" +msgstr "" +" -e, --end=RECPTR arrête la lecture des journaux de transactions à\n" +" l'emplacement RECPTR\n" -#: pg_waldump.c:719 +#: pg_waldump.c:666 #, c-format msgid " -f, --follow keep retrying after reaching end of WAL\n" -msgstr " -f, --follow continue après avoir atteint la fin des journaux de transactions\n" +msgstr "" +" -f, --follow continue après avoir atteint la fin des journaux\n" +" de transactions\n" -#: pg_waldump.c:720 +#: pg_waldump.c:667 +#, c-format +msgid "" +" -F, --fork=FORK only show records that modify blocks in fork FORK;\n" +" valid names are main, fsm, vm, init\n" +msgstr "" +" -F, --fork=FORK affiche seulement les enregistrements qui modifient\n" +" des blocs dans le fork FORK ;\n" +" les noms valides sont main, fsm, vm, init\n" + +#: pg_waldump.c:669 #, c-format msgid " -n, --limit=N number of records to display\n" -msgstr " -n, --limit=N nombre d'enregistrements à afficher\n" +msgstr " -n, --limit=N nombre d'enregistrements à afficher\n" -#: pg_waldump.c:721 +#: pg_waldump.c:670 #, c-format msgid "" " -p, --path=PATH directory in which to find log segment files or a\n" " directory with a ./pg_wal that contains such files\n" " (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n" msgstr "" -" -p, --path=CHEMIN répertoire où trouver les fichiers des segments de journaux de transactions\n" -" ou un répertoire avec ./pg_wal qui contient ces fichiers\n" -" (par défaut: répertoire courant, ./pg_wal, $PGDATA/pg_wal)\n" +" -p, --path=CHEMIN répertoire où trouver les fichiers des segments\n" +" de journaux de transactions ou un répertoire\n" +" avec ./pg_wal qui contient ces fichiers (par\n" +" défaut : répertoire courant, ./pg_wal,\n" +" $PGDATA/pg_wal)\n" -#: pg_waldump.c:724 +#: pg_waldump.c:673 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" -msgstr " -q, --quiet n'écrit aucun message, sauf en cas d'erreur\n" +msgstr " -q, --quiet n'écrit aucun message, sauf en cas d'erreur\n" -#: pg_waldump.c:725 +#: pg_waldump.c:674 #, c-format msgid "" " -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" " use --rmgr=list to list valid resource manager names\n" msgstr "" -" -r, --rmgr=RMGR affiche seulement les enregistrements générés par le gestionnaire\n" -" de ressources RMGR, utilisez --rmgr=list pour avoir une liste des noms valides\n" -" de gestionnaires de ressources\n" -"\n" +" -r, --rmgr=RMGR affiche seulement les enregistrements générés\n" +" par le gestionnaire de ressources RMGR, utilisez\n" +" --rmgr=list pour avoir une liste des noms valides\n" +" de gestionnaires de ressources\n" + +#: pg_waldump.c:676 +#, c-format +msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n" +msgstr "" +" -R, --relation=T/D/R affiche seulement les enregistrements qui modifient\n" +" les blocs de la relation T/D/R\n" -#: pg_waldump.c:727 +#: pg_waldump.c:677 #, c-format msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" -msgstr " -s, --start=RECPTR commence à lire à l'emplacement RECPTR des journaux de transactions\n" +msgstr "" +" -s, --start=RECPTR commence à lire à l'emplacement RECPTR des\n" +" journaux de transactions\n" -#: pg_waldump.c:728 +#: pg_waldump.c:678 #, c-format msgid "" " -t, --timeline=TLI timeline from which to read log records\n" " (default: 1 or the value used in STARTSEG)\n" msgstr "" -" -t, --timeline=TLI timeline à partir de laquelle lire les enregistrements\n" -" des journaux (par défaut: 1 ou la valeur utilisée dans SEG_DÉBUT)\n" +" -t, --timeline=TLI timeline à partir de laquelle lire les\n" +" enregistrements des journaux (par défaut: 1 ou\n" +" la valeur utilisée dans SEG_DÉBUT)\n" -#: pg_waldump.c:730 +#: pg_waldump.c:680 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version puis quitte\n" +msgstr " -V, --version affiche la version puis quitte\n" + +#: pg_waldump.c:681 +#, c-format +msgid " -w, --fullpage only show records with a full page write\n" +msgstr "" +" -w, --fullpage affiche seulement les enregistrements avec\n" +" un bloc complet (FPW)\n" -#: pg_waldump.c:731 +#: pg_waldump.c:682 #, c-format msgid " -x, --xid=XID only show records with transaction ID XID\n" -msgstr " -x, --xid=XID affiche seulement des enregistrements avec l'identifiant de transaction XID\n" +msgstr "" +" -x, --xid=XID affiche seulement des enregistrements avec\n" +" l'identifiant de transaction XID\n" -#: pg_waldump.c:732 +#: pg_waldump.c:683 #, c-format msgid "" " -z, --stats[=record] show statistics instead of records\n" " (optionally, show per-record statistics)\n" msgstr "" -" -z, --stats[=enregistrement] affiche des statistiques à la place d'enregistrements\n" -" (en option, affiche des statistiques par enregistrement)\n" +" -z, --stats[=enregistrement] affiche des statistiques à la place\n" +" d'enregistrements (en option, affiche des\n" +" statistiques par enregistrement)\n" -#: pg_waldump.c:734 +#: pg_waldump.c:685 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide puis quitte\n" +msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_waldump.c:735 +#: pg_waldump.c:686 #, c-format msgid "" "\n" @@ -202,137 +256,167 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_waldump.c:736 +#: pg_waldump.c:687 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil %s : <%s>\n" +msgstr "Page d'accueil %s : <%s>\n" -#: pg_waldump.c:813 +#: pg_waldump.c:781 #, c-format msgid "no arguments specified" msgstr "aucun argument spécifié" -#: pg_waldump.c:828 +#: pg_waldump.c:797 +#, c-format +msgid "could not parse valid block number \"%s\"" +msgstr "n'a pas pu analyser le numéro de bloc valide « %s »" + +#: pg_waldump.c:806 #, c-format msgid "could not parse end WAL location \"%s\"" msgstr "n'a pas pu analyser l'emplacement de fin du journal de transactions « %s »" -#: pg_waldump.c:840 +#: pg_waldump.c:819 +#, c-format +msgid "could not parse fork \"%s\"" +msgstr "n'a pas pu analyser le fork « %s »" + +#: pg_waldump.c:827 #, c-format msgid "could not parse limit \"%s\"" msgstr "n'a pas pu analyser la limite « %s »" -#: pg_waldump.c:871 +#: pg_waldump.c:858 +#, c-format +msgid "custom resource manager \"%s\" does not exist" +msgstr "le gestionnaire de ressources personnalisé « %s » n'existe pas" + +#: pg_waldump.c:879 #, c-format msgid "resource manager \"%s\" does not exist" msgstr "le gestionnaire de ressources « %s » n'existe pas" -#: pg_waldump.c:880 +#: pg_waldump.c:894 +#, c-format +msgid "could not parse valid relation from \"%s\" (expecting \"tablespace OID/database OID/relation filenode\")" +msgstr "n'a pas pu analyser une relation valide à partir de « %s » (s'attendait à \"OID tablespace/OID base/filenode relation\")" + +#: pg_waldump.c:905 #, c-format msgid "could not parse start WAL location \"%s\"" msgstr "n'a pas pu analyser l'emplacement de début du journal de transactions « %s »" -#: pg_waldump.c:890 +#: pg_waldump.c:915 #, c-format msgid "could not parse timeline \"%s\"" msgstr "n'a pas pu analyser la timeline « %s »" -#: pg_waldump.c:897 +#: pg_waldump.c:925 #, c-format msgid "could not parse \"%s\" as a transaction ID" msgstr "n'a pas pu analyser « %s » comme un identifiant de transaction" -#: pg_waldump.c:912 +#: pg_waldump.c:940 #, c-format msgid "unrecognized argument to --stats: %s" msgstr "argument non reconnu pour --stats : %s" -#: pg_waldump.c:925 +#: pg_waldump.c:954 +#, c-format +msgid "--block option requires --relation option to be specified" +msgstr "l'option --block requiert l'utilisation de l'option --relation" + +#: pg_waldump.c:960 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_waldump.c:935 pg_waldump.c:955 +#: pg_waldump.c:970 pg_waldump.c:990 #, c-format msgid "could not open directory \"%s\": %m" msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" -#: pg_waldump.c:961 pg_waldump.c:992 +#: pg_waldump.c:996 pg_waldump.c:1026 #, c-format msgid "could not open file \"%s\"" msgstr "n'a pas pu ouvrir le fichier « %s »" -#: pg_waldump.c:971 +#: pg_waldump.c:1006 #, c-format msgid "start WAL location %X/%X is not inside file \"%s\"" msgstr "l'emplacement de début des journaux de transactions %X/%X n'est pas à l'intérieur du fichier « %s »" -#: pg_waldump.c:999 +#: pg_waldump.c:1033 #, c-format msgid "ENDSEG %s is before STARTSEG %s" msgstr "SEG_FIN %s est avant SEG_DÉBUT %s" -#: pg_waldump.c:1014 +#: pg_waldump.c:1048 #, c-format msgid "end WAL location %X/%X is not inside file \"%s\"" msgstr "l'emplacement de fin des journaux de transactions %X/%X n'est pas à l'intérieur du fichier « %s »" -#: pg_waldump.c:1027 +#: pg_waldump.c:1060 #, c-format msgid "no start WAL location given" msgstr "pas d'emplacement donné de début du journal de transactions" -#: pg_waldump.c:1037 +#: pg_waldump.c:1074 #, c-format -msgid "out of memory" -msgstr "mémoire épuisée" +msgid "out of memory while allocating a WAL reading processor" +msgstr "plus de mémoire lors de l'allocation d'un processeur de lecture de journaux de transactions" -#: pg_waldump.c:1043 +#: pg_waldump.c:1080 #, c-format msgid "could not find a valid record after %X/%X" msgstr "n'a pas pu trouver un enregistrement valide après %X/%X" -#: pg_waldump.c:1054 +#: pg_waldump.c:1090 #, c-format msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" msgstr[0] "le premier enregistrement se trouve après %X/%X, à %X/%X, ignore %u octet\n" msgstr[1] "le premier enregistrement se trouve après %X/%X, à %X/%X, ignore %u octets\n" -#: pg_waldump.c:1105 +#: pg_waldump.c:1171 #, c-format msgid "error in WAL record at %X/%X: %s" msgstr "erreur dans l'enregistrement des journaux de transactions à %X/%X : %s" -#: pg_waldump.c:1115 +#: pg_waldump.c:1180 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Essayez « %s --help » pour plus d'informations.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." -#~ msgid "cannot open directory \"%s\": %s" -#~ msgstr "ne peut pas ouvrir le répertoire « %s » : %s" - -#~ msgid "could not seek in log segment %s to offset %u: %s" -#~ msgstr "n'a pas pu rechercher dans le segment %s du journal de transactions au décalage %u : %s" - -#~ msgid "not enough data in file \"%s\"" -#~ msgstr "données insuffisantes dans le fichier « %s »" +#~ msgid "" +#~ "\n" +#~ "Report bugs to .\n" +#~ msgstr "" +#~ "\n" +#~ "Rapporter les bogues à .\n" #~ msgid "%s: FATAL: " #~ msgstr "%s : FATAL : " +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" + +#~ msgid "cannot open directory \"%s\": %s" +#~ msgstr "ne peut pas ouvrir le répertoire « %s » : %s" + #~ msgid "could not open directory \"%s\": %s" #~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s" -#~ msgid "path \"%s\" could not be opened: %s" -#~ msgstr "le chemin « %s » n'a pas pu être ouvert : %s" +#~ msgid "could not open file \"%s\": %s" +#~ msgstr "n'a pas pu ouvrir le fichier « %s » : %s" -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" +#~ msgid "could not read file \"%s\": %s" +#~ msgstr "n'a pas pu lire le fichier « %s » : %s" + +#, c-format +#~ msgid "could not read file \"%s\": read %d of %zu" +#~ msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" #~ msgid "could not read from log file %s, offset %u, length %d: %s" #~ msgstr "n'a pas pu lire à partir du segment %s du journal de transactions, décalage %u, longueur %d : %s" @@ -340,8 +424,19 @@ msgstr "Essayez « %s --help » pour plus d'informations.\n" #~ msgid "could not seek in log file %s to offset %u: %s" #~ msgstr "n'a pas pu se déplacer dans le fichier de transactions %s au décalage %u : %s" -#~ msgid "could not read file \"%s\": %s" -#~ msgstr "n'a pas pu lire le fichier « %s » : %s" +#~ msgid "could not seek in log segment %s to offset %u: %s" +#~ msgstr "n'a pas pu rechercher dans le segment %s du journal de transactions au décalage %u : %s" -#~ msgid "could not open file \"%s\": %s" -#~ msgstr "n'a pas pu ouvrir le fichier « %s » : %s" +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatal : " + +#~ msgid "not enough data in file \"%s\"" +#~ msgstr "données insuffisantes dans le fichier « %s »" + +#, c-format +#~ msgid "out of memory" +#~ msgstr "mémoire épuisée" + +#~ msgid "path \"%s\" could not be opened: %s" +#~ msgstr "le chemin « %s » n'a pas pu être ouvert : %s" diff --git a/src/bin/pg_waldump/po/ja.po b/src/bin/pg_waldump/po/ja.po index 5e5a631d5c..ff24ba661b 100644 --- a/src/bin/pg_waldump/po/ja.po +++ b/src/bin/pg_waldump/po/ja.po @@ -1,85 +1,89 @@ # Japanese message translation file for pg_waldump -# Copyright (C) 2019 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: pg_waldump (PostgreSQL 13)\n" +"Project-Id-Version: pg_waldump (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:55+0900\n" -"PO-Revision-Date: 2020-09-13 08:57+0200\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" +"PO-Revision-Date: 2022-05-10 16:43+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n!=1;\n" +"Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:241 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " - -#: ../../../src/common/logging.c:248 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:255 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "警告: " -#: pg_waldump.c:146 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "ヒント: " + +#: pg_waldump.c:160 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンできませんでした: %m" -#: pg_waldump.c:202 +#: pg_waldump.c:216 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes" msgstr[0] "WALセグメントのサイズは1MBと1GBの間の2の累乗でなければなりません、しかしWALファイル\"%s\"のヘッダでは%dバイトとなっています" -msgstr[1] "WALセグメントのサイズは1MBと1GBの間の2の累乗でなければなりません、しかしWALファイル\"%s\"のヘッダでは%dバイトとなっています" -#: pg_waldump.c:210 +#: pg_waldump.c:222 #, c-format msgid "could not read file \"%s\": %m" msgstr "ファイル\"%s\"の読み取りに失敗しました: %m" -#: pg_waldump.c:213 +#: pg_waldump.c:225 #, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました" +msgid "could not read file \"%s\": read %d of %d" +msgstr "ファイル\"%1$s\"を読み取れませんでした: %3$d中%2$d" -#: pg_waldump.c:275 +#: pg_waldump.c:286 #, c-format msgid "could not locate WAL file \"%s\"" msgstr "WALファイル\"%s\"がありませんでした" -#: pg_waldump.c:277 +#: pg_waldump.c:288 #, c-format msgid "could not find any WAL file" msgstr "WALファイルが全くありません" -#: pg_waldump.c:318 +#: pg_waldump.c:329 #, c-format msgid "could not find file \"%s\": %m" msgstr "ファイル\"%s\"が見つかりませんでした: %m" -#: pg_waldump.c:367 +#: pg_waldump.c:378 #, c-format -msgid "could not read from file %s, offset %u: %m" -msgstr "ファイル\"%s\"のオフセット%uを読み取れませんでした: %m" +msgid "could not read from file %s, offset %d: %m" +msgstr "ファイル %s、オフセット%dから読み取れませんでした: %m" -#: pg_waldump.c:371 +#: pg_waldump.c:382 #, c-format -msgid "could not read from file %s, offset %u: read %d of %zu" -msgstr "ファイル%1$s、オフセット%2$uから読み取れませんでした: %4$zu中%3$d" +msgid "could not read from file %s, offset %d: read %d of %d" +msgstr "ファイル%1$s、オフセット%2$dから読み取れませんでした: %4$d中%3$d" -#: pg_waldump.c:715 +#: pg_waldump.c:658 #, c-format msgid "" "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n" @@ -88,17 +92,17 @@ msgstr "" "%sはデバッグのためにPostgreSQLの先行書き込みログをデコードして表示します。\n" "\n" -#: pg_waldump.c:717 +#: pg_waldump.c:660 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_waldump.c:718 +#: pg_waldump.c:661 #, c-format msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" msgstr " %s [オプション] ... [開始セグメント [終了セグメント]]\n" -#: pg_waldump.c:719 +#: pg_waldump.c:662 #, c-format msgid "" "\n" @@ -107,27 +111,42 @@ msgstr "" "\n" "オプション:\n" -#: pg_waldump.c:720 +#: pg_waldump.c:663 #, c-format msgid " -b, --bkp-details output detailed information about backup blocks\n" msgstr " -b, --bkp-details バックアップブロックに関する詳細情報を出力\n" -#: pg_waldump.c:721 +#: pg_waldump.c:664 +#, c-format +msgid " -B, --block=N with --relation, only show records that modify block N\n" +msgstr " -B, --block=N --relationと共に指定することでこのブロックNを更新する\n" +" レコードのみを表示\n" + +#: pg_waldump.c:665 #, c-format msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" msgstr " -e, --end=RECPTR WAL位置RECPTRで読み込みを停止\n" -#: pg_waldump.c:722 +#: pg_waldump.c:666 #, c-format msgid " -f, --follow keep retrying after reaching end of WAL\n" msgstr " -f, --follow WALの終端に達してからもリトライを続ける\n" -#: pg_waldump.c:723 +#: pg_waldump.c:667 +#, c-format +msgid "" +" -F, --fork=FORK only show records that modify blocks in fork FORK;\n" +" valid names are main, fsm, vm, init\n" +msgstr "" +" -F, --fork=FORK 指定フォークのブロックを更新するレコードのみ表示;\n" +" 指定可能な名前はmain, fsm, vm, init\n" + +#: pg_waldump.c:669 #, c-format msgid " -n, --limit=N number of records to display\n" msgstr " -n, --limit=N 表示するレコード数\n" -#: pg_waldump.c:724 +#: pg_waldump.c:670 #, c-format msgid "" " -p, --path=PATH directory in which to find log segment files or a\n" @@ -135,30 +154,35 @@ msgid "" " (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n" msgstr "" " -p, --path=PATH ログセグメントファイルを探すディレクトリ、または\n" -" そのようなファイルを格納している ./pg_walディレクトリ\n" +" 同様のファイルのある ./pg_walを含むディレクトリ\n" " (デフォルト: カレントディレクトリ, ./pg_wal,\n" " $PGDATA/pg_wal)\n" -#: pg_waldump.c:727 +#: pg_waldump.c:673 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet エラー以外何も出力しない\n" -#: pg_waldump.c:728 +#: pg_waldump.c:674 #, c-format msgid "" " -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" " use --rmgr=list to list valid resource manager names\n" msgstr "" -" -r, --rmgr=RMGR リソースマネージャーRMGRで生成されたレコードのみを表示\n" +" -r, --rmgr=RMGR 指定のリソースマネージャーで生成されたレコードのみ表示\n" " --rmgr=list で有効なリソースマネージャーの一覧を表示\n" -#: pg_waldump.c:730 +#: pg_waldump.c:676 +#, c-format +msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n" +msgstr " -R, --relation=T/D/R リレーションT/D/Rのブロックを更新するレコードのみ表示\n" + +#: pg_waldump.c:677 #, c-format msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" msgstr " -s, --start=RECPTR WAL位置RECPTRから読み込みを開始\n" -#: pg_waldump.c:731 +#: pg_waldump.c:678 #, c-format msgid "" " -t, --timeline=TLI timeline from which to read log records\n" @@ -167,17 +191,22 @@ msgstr "" " -t, --timeline=TLI ログレコードを読むべきタイムライン\n" " (デフォルト: 1 またはSTARTSEGで使われた値)\n" -#: pg_waldump.c:733 +#: pg_waldump.c:680 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: pg_waldump.c:734 +#: pg_waldump.c:681 +#, c-format +msgid " -w, --fullpage only show records with a full page write\n" +msgstr " -w, --fullpage 全ページ書き込みを含むレコードのみを表示\n" + +#: pg_waldump.c:682 #, c-format msgid " -x, --xid=XID only show records with transaction ID XID\n" msgstr " -x, --xid=XID トランザクションIDがXIDのレコードのみを表示する\n" -#: pg_waldump.c:735 +#: pg_waldump.c:683 #, c-format msgid "" " -z, --stats[=record] show statistics instead of records\n" @@ -186,12 +215,12 @@ msgstr "" " -z, --stats[=レコード] レコードの代わりに統計情報を表示する\n" " (オプションで、レコードごとの統計を表示する)\n" -#: pg_waldump.c:737 +#: pg_waldump.c:685 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: pg_waldump.c:738 +#: pg_waldump.c:686 #, c-format msgid "" "\n" @@ -200,112 +229,148 @@ msgstr "" "\n" "バグは<%s>に報告してください。\n" -#: pg_waldump.c:739 +#: pg_waldump.c:687 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_waldump.c:816 +#: pg_waldump.c:781 #, c-format msgid "no arguments specified" msgstr "引数が指定されていません" -#: pg_waldump.c:831 +#: pg_waldump.c:797 +#, c-format +msgid "could not parse valid block number \"%s\"" +msgstr "\"%s\"から妥当なブロック番号を読み取れませんでした" + +#: pg_waldump.c:806 #, c-format msgid "could not parse end WAL location \"%s\"" -msgstr "WALの終了位置\"%s\"をパースできませんでした" +msgstr "WALの終了位置\"%s\"を読み取れませんでした" + +#: pg_waldump.c:819 +#, c-format +msgid "could not parse fork \"%s\"" +msgstr "フォーク\"%s\"を読み取れませんでした" -#: pg_waldump.c:843 +#: pg_waldump.c:827 #, c-format msgid "could not parse limit \"%s\"" -msgstr "表示レコード数の制限値\"%s\"をパースできませんでした" +msgstr "表示レコード数の制限値\"%s\"を読み取れませんでした" -#: pg_waldump.c:874 +#: pg_waldump.c:858 +#, c-format +msgid "custom resource manager \"%s\" does not exist" +msgstr "独自リソースマネージャー\"%s\"は存在しません" + +#: pg_waldump.c:879 #, c-format msgid "resource manager \"%s\" does not exist" msgstr "リソースマネージャー\"%s\"は存在しません" -#: pg_waldump.c:883 +#: pg_waldump.c:894 +#, c-format +msgid "could not parse valid relation from \"%s\" (expecting \"tablespace OID/database OID/relation filenode\")" +msgstr "\"%s\"から妥当なリレーションを読み取れませんでした (\"テーブル空間OID/データベースOID/リレーション・ファイルノード”を期待しています)" + +#: pg_waldump.c:905 #, c-format msgid "could not parse start WAL location \"%s\"" -msgstr "WALの開始位置\"%s\"をパースできませんでした" +msgstr "WALの開始位置\"%s\"を読み取れませんでした" -#: pg_waldump.c:893 +#: pg_waldump.c:915 #, c-format msgid "could not parse timeline \"%s\"" -msgstr "タイムライン\"%s\"をパースできませんでした" +msgstr "タイムライン\"%s\"を読み取れませんでした" -#: pg_waldump.c:900 +#: pg_waldump.c:925 #, c-format msgid "could not parse \"%s\" as a transaction ID" -msgstr "\"%s\"をトランザクションIDとしてパースできませんでした" +msgstr "\"%s\"をトランザクションIDとして読み取れませんでした" -#: pg_waldump.c:915 +#: pg_waldump.c:940 #, c-format msgid "unrecognized argument to --stats: %s" msgstr "--statsの引数が認識できません: %s" -#: pg_waldump.c:928 +#: pg_waldump.c:954 +#, c-format +msgid "--block option requires --relation option to be specified" +msgstr "--blockオプション指定時は--relationオプションも必要です" + +#: pg_waldump.c:960 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数が多すぎます(先頭は\"%s\")" -#: pg_waldump.c:938 pg_waldump.c:958 +#: pg_waldump.c:970 pg_waldump.c:990 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" -#: pg_waldump.c:964 pg_waldump.c:995 +#: pg_waldump.c:996 pg_waldump.c:1026 #, c-format msgid "could not open file \"%s\"" msgstr "ファイル\"%s\"を開くことができませんでした" -#: pg_waldump.c:974 +#: pg_waldump.c:1006 #, c-format msgid "start WAL location %X/%X is not inside file \"%s\"" msgstr "WALの開始位置%X/%Xはファイル\"%s\"の中ではありません" -#: pg_waldump.c:1002 +#: pg_waldump.c:1033 #, c-format msgid "ENDSEG %s is before STARTSEG %s" msgstr "ENDSEG%sがSTARTSEG %sより前に現れました" -#: pg_waldump.c:1017 +#: pg_waldump.c:1048 #, c-format msgid "end WAL location %X/%X is not inside file \"%s\"" msgstr "WALの終了位置%X/%Xはファイル\"%s\"の中ではありません" -#: pg_waldump.c:1030 +#: pg_waldump.c:1060 #, c-format msgid "no start WAL location given" msgstr "WALの開始位置が指定されていません" -#: pg_waldump.c:1044 +#: pg_waldump.c:1074 #, c-format -msgid "out of memory" -msgstr "メモリ不足です" +msgid "out of memory while allocating a WAL reading processor" +msgstr "WAL読み取り機構でのメモリ割り当てに中にメモリ不足" -#: pg_waldump.c:1050 +#: pg_waldump.c:1080 #, c-format msgid "could not find a valid record after %X/%X" msgstr "%X/%Xの後に有効なレコードが見つかりませんでした" -#: pg_waldump.c:1061 +#: pg_waldump.c:1090 #, c-format msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" msgstr[0] "先頭レコードが%X/%Xの後の%X/%Xの位置にありました。%uバイト分をスキップしています\n" -msgstr[1] "先頭レコードが%X/%Xの後の%X/%Xの位置にありました。%uバイト分をスキップしています\n" -#: pg_waldump.c:1112 +#: pg_waldump.c:1171 #, c-format msgid "error in WAL record at %X/%X: %s" msgstr "WALレコードの%X/%Xでエラー: %s" -#: pg_waldump.c:1122 +#: pg_waldump.c:1180 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "\"%s --help\"で詳細を確認してください。\n" +msgid "Try \"%s --help\" for more information." +msgstr "詳細は\"%s --help\"を実行してください。" + +#~ msgid "fatal: " +#~ msgstr "致命的エラー: " + +#~ msgid "could not read file \"%s\": read %d of %zu" +#~ msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました" + +#~ msgid "out of memory" +#~ msgstr "メモリ不足です" + +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "\"%s --help\"で詳細を確認してください。\n" #~ msgid "%s: FATAL: " #~ msgstr "%s: 致命的なエラー: " diff --git a/src/bin/pg_waldump/po/sv.po b/src/bin/pg_waldump/po/sv.po index fa02865b2c..f23f6c50c6 100644 --- a/src/bin/pg_waldump/po/sv.po +++ b/src/bin/pg_waldump/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_waldump # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-11 01:15+0000\n" -"PO-Revision-Date: 2020-04-11 08:33+0200\n" +"POT-Creation-Date: 2022-04-11 17:47+0000\n" +"PO-Revision-Date: 2022-04-11 22:00+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,86 +17,91 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatalt: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:273 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:280 #, c-format msgid "warning: " msgstr "varning: " -#: pg_waldump.c:146 +#: ../../../src/common/logging.c:291 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:298 +#, c-format +msgid "hint: " +msgstr "tips: " + +#: pg_waldump.c:160 #, c-format msgid "could not open file \"%s\": %m" msgstr "kunde inte öppna fil \"%s\": %m" -#: pg_waldump.c:202 +#: pg_waldump.c:216 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes" msgstr[0] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men headern i WAL-filen \"%s\" anger %d byte" msgstr[1] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men headern i WAL-filen \"%s\" anger %d byte" -#: pg_waldump.c:210 +#: pg_waldump.c:222 #, c-format msgid "could not read file \"%s\": %m" msgstr "kunde inte läsa fil \"%s\": %m" -#: pg_waldump.c:213 +#: pg_waldump.c:225 #, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" +msgid "could not read file \"%s\": read %d of %d" +msgstr "kunde inte läsa fil \"%s\": läste %d av %d" -#: pg_waldump.c:275 +#: pg_waldump.c:286 #, c-format msgid "could not locate WAL file \"%s\"" msgstr "kunde inte lokalisera WAL-fil \"%s\"" -#: pg_waldump.c:277 +#: pg_waldump.c:288 #, c-format msgid "could not find any WAL file" msgstr "kunde inte hitta några WAL-filer" -#: pg_waldump.c:319 +#: pg_waldump.c:329 #, c-format msgid "could not find file \"%s\": %m" msgstr "kunde inte hitta filen \"%s\": %m" -#: pg_waldump.c:359 +#: pg_waldump.c:378 #, c-format -msgid "could not read from file %s, offset %u: %m" -msgstr "Kunde inte läsa från fil %s på offset %u: %m" +msgid "could not read from file %s, offset %d: %m" +msgstr "Kunde inte läsa från fil %s på offset %d: %m" -#: pg_waldump.c:363 +#: pg_waldump.c:382 #, c-format -msgid "could not read from file %s, offset %u: read %d of %zu" -msgstr "kunde inte läsa från fil %s, offset %u, läste %d av %zu" +msgid "could not read from file %s, offset %d: read %d of %d" +msgstr "kunde inte läsa från fil %s, offset %d, läste %d av %d" -#: pg_waldump.c:712 +#: pg_waldump.c:659 #, c-format msgid "" "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n" "\n" msgstr "%s avkodar och visar PostgreSQLs write-ahead-logg för debuggning.\n" -#: pg_waldump.c:714 +#: pg_waldump.c:661 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: pg_waldump.c:715 +#: pg_waldump.c:662 #, c-format msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" msgstr " %s [FLAGGA]... [STARTSEG [SLUTSEG]]\n" -#: pg_waldump.c:716 +#: pg_waldump.c:663 #, c-format msgid "" "\n" @@ -105,27 +110,43 @@ msgstr "" "\n" "Flaggor:\n" -#: pg_waldump.c:717 +#: pg_waldump.c:664 #, c-format msgid " -b, --bkp-details output detailed information about backup blocks\n" msgstr " -b, --bkp-details skriv detaljerad information om backupblock\n" -#: pg_waldump.c:718 +#: pg_waldump.c:665 +#, c-format +msgid " -B, --block=N with --relation, only show records that modify block N\n" +msgstr "" +" -B, --block=N tillsammans med --relation, visa bara poster som\n" +" modifierar block N\n" + +#: pg_waldump.c:666 #, c-format msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" msgstr " -e, --end=RECPTR stoppa läsning vid WAL-position RECPTR\n" -#: pg_waldump.c:719 +#: pg_waldump.c:667 #, c-format msgid " -f, --follow keep retrying after reaching end of WAL\n" msgstr " -f, --follow fortsätt försök efter att ha nått slutet av WAL\n" -#: pg_waldump.c:720 +#: pg_waldump.c:668 +#, c-format +msgid "" +" -F, --fork=FORK only show records that modify blocks in fork FORK;\n" +" valid names are main, fsm, vm, init\n" +msgstr "" +" -F, --fork=GREN visa bara poster som modifierar block i grenen GREN\n" +" gilriga namn är main, fsm, vm och init\n" + +#: pg_waldump.c:670 #, c-format msgid " -n, --limit=N number of records to display\n" msgstr " -n, --limit=N antal poster att visa\n" -#: pg_waldump.c:721 +#: pg_waldump.c:671 #, c-format msgid "" " -p, --path=PATH directory in which to find log segment files or a\n" @@ -136,12 +157,12 @@ msgstr "" " katalog med en ./pg_wal som innehåller sådana filer\n" " (standard: aktuell katalog, ./pg_wal, $PGDATA/pg_wal)\n" -#: pg_waldump.c:724 +#: pg_waldump.c:674 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet skriv inte ut några meddelanden förutom fel\n" -#: pg_waldump.c:725 +#: pg_waldump.c:675 #, c-format msgid "" " -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" @@ -150,12 +171,19 @@ msgstr "" " -r, --rmgr=RMGR visa bara poster skapade av resurshanteraren RMGR;\n" " använd --rmgr=list för att lista giltiga resurshanterarnamn\n" -#: pg_waldump.c:727 +#: pg_waldump.c:677 +#, c-format +msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n" +msgstr "" +" -R, --relation=T/D/R visa bara poster som modifierar block i\n" +" relationen T/D/R\n" + +#: pg_waldump.c:678 #, c-format msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" msgstr " -s, --start=RECPTR börja läsning vid WAL-position RECPTR\n" -#: pg_waldump.c:728 +#: pg_waldump.c:679 #, c-format msgid "" " -t, --timeline=TLI timeline from which to read log records\n" @@ -164,17 +192,22 @@ msgstr "" " -t, --timeline=TLI tidslinje från vilken vi läser loggposter\n" " (standard: 1 eller värdet som används i STARTSEG)\n" -#: pg_waldump.c:730 +#: pg_waldump.c:681 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_waldump.c:731 +#: pg_waldump.c:682 +#, c-format +msgid " -w, --fullpage only show records with a full page write\n" +msgstr " -w, --fullpage visa bara poster som skrivit hela sidor\n" + +#: pg_waldump.c:683 #, c-format msgid " -x, --xid=XID only show records with transaction ID XID\n" msgstr " -x, --xid=XID visa baras poster med transaktions-ID XID\n" -#: pg_waldump.c:732 +#: pg_waldump.c:684 #, c-format msgid "" " -z, --stats[=record] show statistics instead of records\n" @@ -183,12 +216,12 @@ msgstr "" " -z, --stats[=post] visa statistik istället för poster\n" " (alternativt, visa statistik per post)\n" -#: pg_waldump.c:734 +#: pg_waldump.c:686 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa den här hjälpen, avsluta sedan\n" -#: pg_waldump.c:735 +#: pg_waldump.c:687 #, c-format msgid "" "\n" @@ -197,109 +230,134 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_waldump.c:736 +#: pg_waldump.c:688 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_waldump.c:813 +#: pg_waldump.c:782 #, c-format msgid "no arguments specified" msgstr "inga argument angivna" -#: pg_waldump.c:828 +#: pg_waldump.c:798 +#, c-format +msgid "could not parse valid block number \"%s\"" +msgstr "kunde inte parsa giltigt blocknummer \"%s\"" + +#: pg_waldump.c:807 #, c-format msgid "could not parse end WAL location \"%s\"" msgstr "kunde inte parsa slut-WAL-position \"%s\"" -#: pg_waldump.c:840 +#: pg_waldump.c:820 +#, c-format +msgid "could not parse fork \"%s\"" +msgstr "kunde inte parsa grenen \"%s\"" + +#: pg_waldump.c:828 #, c-format msgid "could not parse limit \"%s\"" msgstr "kunde inte parsa gränsen \"%s\"" -#: pg_waldump.c:871 +#: pg_waldump.c:859 +#, c-format +msgid "custom resource manager \"%s\" does not exist" +msgstr "egendefinierad resurshanterare \"%s\" finns inte" + +#: pg_waldump.c:880 #, c-format msgid "resource manager \"%s\" does not exist" msgstr "resurshanterare \"%s\" finns inte" -#: pg_waldump.c:880 +#: pg_waldump.c:895 +#, c-format +msgid "could not parse valid relation from \"%s\" (expecting \"tablespace OID/database OID/relation filenode\")" +msgstr "kunde inte parsa giltig relation från \"%s\" (förväntade \"tablespace-OID/databas-OID/relations filenod\")" + +#: pg_waldump.c:906 #, c-format msgid "could not parse start WAL location \"%s\"" msgstr "kunde inte parsa start-WAL-position \"%s\"" -#: pg_waldump.c:890 +#: pg_waldump.c:916 #, c-format msgid "could not parse timeline \"%s\"" msgstr "kunde inte parsa tidlinjen \"%s\"" -#: pg_waldump.c:897 +#: pg_waldump.c:926 #, c-format msgid "could not parse \"%s\" as a transaction ID" msgstr "kunde inte parsa \"%s\" som ett transaktions-ID" -#: pg_waldump.c:912 +#: pg_waldump.c:941 #, c-format msgid "unrecognized argument to --stats: %s" msgstr "okänt argument till --stats: %s" -#: pg_waldump.c:925 +#: pg_waldump.c:955 +#, c-format +msgid "--block option requires --relation option to be specified" +msgstr "flaggan --block kräver att flaggan --relation också anges" + +#: pg_waldump.c:961 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för många kommandoradsargument (första är \"%s\")" -#: pg_waldump.c:935 pg_waldump.c:955 +#: pg_waldump.c:971 pg_waldump.c:991 #, c-format msgid "could not open directory \"%s\": %m" msgstr "kunde inte öppna katalog \"%s\": %m" -#: pg_waldump.c:961 pg_waldump.c:992 +#: pg_waldump.c:997 pg_waldump.c:1027 #, c-format msgid "could not open file \"%s\"" msgstr "kunde inte öppna filen \"%s\"" -#: pg_waldump.c:971 +#: pg_waldump.c:1007 #, c-format msgid "start WAL location %X/%X is not inside file \"%s\"" msgstr "start-WAL-position %X/%X är inte i filen \"%s\"" -#: pg_waldump.c:999 +#: pg_waldump.c:1034 #, c-format msgid "ENDSEG %s is before STARTSEG %s" msgstr "SLUTSEG %s är före STARTSEG %s" -#: pg_waldump.c:1014 +#: pg_waldump.c:1049 #, c-format msgid "end WAL location %X/%X is not inside file \"%s\"" msgstr "slut-WAL-position %X/%X är inte i filen \"%s\"" -#: pg_waldump.c:1027 +#: pg_waldump.c:1061 #, c-format msgid "no start WAL location given" msgstr "ingen start-WAL-position angiven" -#: pg_waldump.c:1037 +#: pg_waldump.c:1075 #, c-format -msgid "out of memory" -msgstr "slut på minne" +msgid "out of memory while allocating a WAL reading processor" +msgstr "slut på minne vid allokering av en WAL-läs-processor" -#: pg_waldump.c:1043 +#: pg_waldump.c:1081 #, c-format msgid "could not find a valid record after %X/%X" msgstr "kunde inte hitta en giltig post efter %X/%X" -#: pg_waldump.c:1054 +#: pg_waldump.c:1091 #, c-format msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" msgstr[0] "första posten efter %X/%X, vid %X/%X, hoppar över %u byte\n" msgstr[1] "första posten efter %X/%X, vid %X/%X, hoppar över %u byte\n" -#: pg_waldump.c:1105 +#: pg_waldump.c:1172 #, c-format msgid "error in WAL record at %X/%X: %s" msgstr "fel i WAL-post vid %X/%X: %s" -#: pg_waldump.c:1115 +#: pg_waldump.c:1181 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Försök med \"%s --help\" för mer information.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." diff --git a/src/bin/psql/po/de.po b/src/bin/psql/po/de.po index dd6f7b3ddd..cb1e4e13ee 100644 --- a/src/bin/psql/po/de.po +++ b/src/bin/psql/po/de.po @@ -1,14 +1,14 @@ # German message translation file for psql -# Peter Eisentraut , 2001 - 2021. +# Peter Eisentraut , 2001 - 2022. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-06 22:45+0000\n" -"PO-Revision-Date: 2021-05-07 08:12+0200\n" +"POT-Creation-Date: 2022-05-11 15:46+0000\n" +"PO-Revision-Date: 2022-05-11 22:52+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -17,59 +17,64 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "Fatal: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "Warnung: " -#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "Tipp: " + +#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "konnte aktuelles Verzeichnis nicht ermitteln: %m" -#: ../../common/exec.c:155 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "ungültige Programmdatei »%s«" -#: ../../common/exec.c:205 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "konnte Programmdatei »%s« nicht lesen" -#: ../../common/exec.c:213 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "konnte kein »%s« zum Ausführen finden" -#: ../../common/exec.c:269 ../../common/exec.c:308 +#: ../../common/exec.c:282 ../../common/exec.c:321 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m" -#: ../../common/exec.c:286 +#: ../../common/exec.c:299 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m" -#: ../../common/exec.c:409 +#: ../../common/exec.c:422 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 -#: command.c:1315 command.c:3246 command.c:3295 command.c:3412 input.c:227 -#: mainloop.c:81 mainloop.c:402 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: command.c:1320 command.c:3316 command.c:3365 command.c:3489 input.c:227 +#: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" @@ -90,7 +95,7 @@ msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" msgid "could not look up effective user ID %ld: %s" msgstr "konnte effektive Benutzer-ID %ld nicht nachschlagen: %s" -#: ../../common/username.c:45 command.c:565 +#: ../../common/username.c:45 command.c:576 msgid "user does not exist" msgstr "Benutzer existiert nicht" @@ -129,310 +134,302 @@ msgstr "Kindprozess wurde von Signal %d beendet: %s" msgid "child process exited with unrecognized status %d" msgstr "Kindprozess hat mit unbekanntem Status %d beendet" -#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 msgid "Cancel request sent\n" msgstr "Abbruchsanforderung gesendet\n" -#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 msgid "Could not send cancel request: " msgstr "Konnte Abbruchsanforderung nicht senden: " -#: ../../fe_utils/print.c:336 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu Zeile)" msgstr[1] "(%lu Zeilen)" -#: ../../fe_utils/print.c:3039 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Unterbrochen\n" -#: ../../fe_utils/print.c:3103 +#: ../../fe_utils/print.c:3173 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Kann keinen weiteren Spaltenkopf zur Tabelle hinzufügen: Spaltenzahl %d überschritten.\n" -#: ../../fe_utils/print.c:3143 +#: ../../fe_utils/print.c:3213 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "Cann keine weitere Zelle zur Tabelle hinzufügen: Zellengesamtzahl %d überschritten.\n" -#: ../../fe_utils/print.c:3401 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "ungültiges Ausgabeformat (interner Fehler): %d" -#: ../../fe_utils/psqlscan.l:697 +#: ../../fe_utils/psqlscan.l:702 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "rekursive Auswertung der Variable »%s« wird ausgelassen" -#: command.c:230 +#: ../../port/thread.c:100 ../../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "konnte lokale Benutzer-ID %d nicht nachschlagen: %s" + +#: ../../port/thread.c:105 ../../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "lokaler Benutzer mit ID %d existiert nicht" + +#: command.c:233 #, c-format msgid "invalid command \\%s" msgstr "ungültige Anweisung \\%s" -#: command.c:232 +#: command.c:235 #, c-format msgid "Try \\? for help." msgstr "Versuchen Sie \\? für Hilfe." -#: command.c:250 +#: command.c:253 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: überflüssiges Argument »%s« ignoriert" -#: command.c:302 +#: command.c:305 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "Befehl \\%s ignoriert; verwenden Sie \\endif oder Strg-C um den aktuellen \\if-Block zu beenden" -#: command.c:563 +#: command.c:574 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "konnte Home-Verzeichnis für Benutzer-ID %ld nicht ermitteln: %s" -#: command.c:581 +#: command.c:593 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: konnte nicht in das Verzeichnis »%s« wechseln: %m" -#: command.c:606 +#: command.c:618 #, c-format msgid "You are currently not connected to a database.\n" msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden.\n" -#: command.c:616 +#: command.c:628 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« auf Adresse »%s« auf Port »%s«.\n" -#: command.c:619 +#: command.c:631 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« via Socket in »%s« auf Port »%s«.\n" -#: command.c:625 +#: command.c:637 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« (Adresse »%s«) auf Port »%s«.\n" -#: command.c:628 +#: command.c:640 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« auf Port »%s«.\n" -#: command.c:1012 command.c:1121 command.c:2602 +#: command.c:1031 command.c:1126 command.c:2660 #, c-format msgid "no query buffer" msgstr "kein Anfragepuffer" -#: command.c:1045 command.c:5304 +#: command.c:1064 command.c:5485 #, c-format msgid "invalid line number: %s" msgstr "ungültige Zeilennummer: %s" -#: command.c:1112 -#, c-format -msgid "The server (version %s) does not support editing function source." -msgstr "Der Server (Version %s) unterstützt das Bearbeiten des Funktionsquelltextes nicht." - -#: command.c:1115 -#, c-format -msgid "The server (version %s) does not support editing view definitions." -msgstr "Der Server (Version %s) unterstützt das Bearbeiten von Sichtdefinitionen nicht." - -#: command.c:1197 +#: command.c:1202 msgid "No changes" msgstr "keine Änderungen" -#: command.c:1276 +#: command.c:1281 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: ungültiger Kodierungsname oder Umwandlungsprozedur nicht gefunden" -#: command.c:1311 command.c:2052 command.c:3242 command.c:3434 command.c:5406 -#: common.c:174 common.c:223 common.c:392 common.c:1248 common.c:1276 -#: common.c:1385 common.c:1492 common.c:1530 copy.c:488 copy.c:709 help.c:62 -#: large_obj.c:157 large_obj.c:192 large_obj.c:254 startup.c:298 +#: command.c:1316 command.c:2119 command.c:3312 command.c:3511 command.c:5587 +#: common.c:177 common.c:226 common.c:395 common.c:1094 common.c:1172 +#: common.c:1190 common.c:1263 common.c:1370 common.c:1408 common.c:1494 +#: common.c:1537 copy.c:488 copy.c:722 help.c:61 large_obj.c:157 +#: large_obj.c:192 large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1318 +#: command.c:1323 msgid "There is no previous error." msgstr "Es gibt keinen vorangegangenen Fehler." -#: command.c:1431 +#: command.c:1436 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: rechte Klammer fehlt" -#: command.c:1608 command.c:1913 command.c:1927 command.c:1944 command.c:2106 -#: command.c:2342 command.c:2569 command.c:2609 +#: command.c:1520 command.c:1650 command.c:1955 command.c:1969 command.c:1988 +#: command.c:2172 command.c:2414 command.c:2627 command.c:2667 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: notwendiges Argument fehlt" -#: command.c:1739 +#: command.c:1781 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: kann nicht nach \\else kommen" -#: command.c:1744 +#: command.c:1786 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: kein passendes \\if" -#: command.c:1808 +#: command.c:1850 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: kann nicht nach \\else kommen" -#: command.c:1813 +#: command.c:1855 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: kein passendes \\if" -#: command.c:1853 +#: command.c:1895 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: kein passendes \\if" -#: command.c:2008 +#: command.c:2052 msgid "Query buffer is empty." msgstr "Anfragepuffer ist leer." -#: command.c:2030 -msgid "Enter new password: " -msgstr "Neues Passwort eingeben: " +#: command.c:2095 +#, c-format +msgid "Enter new password for user \"%s\": " +msgstr "Neues Passwort für Benutzer »%s« eingeben: " -#: command.c:2031 +#: command.c:2099 msgid "Enter it again: " msgstr "Geben Sie es noch einmal ein: " -#: command.c:2035 +#: command.c:2108 #, c-format msgid "Passwords didn't match." msgstr "Passwörter stimmten nicht überein." -#: command.c:2135 +#: command.c:2207 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: konnte Wert für Variable nicht lesen" -#: command.c:2238 +#: command.c:2310 msgid "Query buffer reset (cleared)." msgstr "Anfragepuffer wurde gelöscht." -#: command.c:2260 +#: command.c:2332 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Befehlsgeschichte in Datei »%s« geschrieben.\n" -#: command.c:2347 +#: command.c:2419 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: Name der Umgebungsvariable darf kein »=« enthalten" -#: command.c:2399 -#, c-format -msgid "The server (version %s) does not support showing function source." -msgstr "Der Server (Version %s) unterstützt das Anzeigen des Funktionsquelltextes nicht." - -#: command.c:2402 -#, c-format -msgid "The server (version %s) does not support showing view definitions." -msgstr "Der Server (Version %s) unterstützt das Anzeigen von Sichtdefinitionen nicht." - -#: command.c:2409 +#: command.c:2467 #, c-format msgid "function name is required" msgstr "Funktionsname wird benötigt" -#: command.c:2411 +#: command.c:2469 #, c-format msgid "view name is required" msgstr "Sichtname wird benötigt" -#: command.c:2541 +#: command.c:2599 msgid "Timing is on." msgstr "Zeitmessung ist an." -#: command.c:2543 +#: command.c:2601 msgid "Timing is off." msgstr "Zeitmessung ist aus." -#: command.c:2628 command.c:2656 command.c:3873 command.c:3876 command.c:3879 -#: command.c:3885 command.c:3887 command.c:3913 command.c:3923 command.c:3935 -#: command.c:3949 command.c:3976 command.c:4034 common.c:70 copy.c:331 +#: command.c:2686 command.c:2714 command.c:3952 command.c:3955 command.c:3958 +#: command.c:3964 command.c:3966 command.c:3992 command.c:4002 command.c:4014 +#: command.c:4028 command.c:4055 command.c:4113 common.c:73 copy.c:331 #: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:3047 startup.c:237 startup.c:287 +#: command.c:3113 startup.c:243 startup.c:293 msgid "Password: " msgstr "Passwort: " -#: command.c:3052 startup.c:284 +#: command.c:3118 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Passwort für Benutzer %s: " -#: command.c:3104 +#: command.c:3174 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "Geben Sie Benutzer, Host oder Port nicht separat an, wenn eine Verbindungsangabe verwendet wird" -#: command.c:3139 +#: command.c:3209 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "Es gibt keine Verbindung, von der die Parameter verwendet werden können" -#: command.c:3440 +#: command.c:3517 #, c-format msgid "Previous connection kept" msgstr "Vorherige Verbindung wurde behalten" -#: command.c:3446 +#: command.c:3523 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3502 +#: command.c:3579 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« auf Adresse »%s« auf Port »%s«.\n" -#: command.c:3505 +#: command.c:3582 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« via Socket in »%s« auf Port »%s«.\n" -#: command.c:3511 +#: command.c:3588 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« (Adresse »%s«) auf Port »%s«.\n" -#: command.c:3514 +#: command.c:3591 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« auf Port »%s«.\n" -#: command.c:3519 +#: command.c:3596 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s«.\n" -#: command.c:3559 +#: command.c:3636 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, Server %s)\n" -#: command.c:3567 +#: command.c:3649 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -441,29 +438,29 @@ msgstr "" "WARNUNG: %s-Hauptversion %s, Server-Hauptversion %s.\n" " Einige Features von psql werden eventuell nicht funktionieren.\n" -#: command.c:3606 +#: command.c:3686 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" -msgstr "SSL-Verbindung (Protokoll: %s, Verschlüsselungsmethode: %s, Bits: %s, Komprimierung: %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" +msgstr "SSL-Verbindung (Protokoll: %s, Verschlüsselungsmethode: %s, Komprimierung: %s)\n" -#: command.c:3607 command.c:3608 command.c:3609 +#: command.c:3687 command.c:3688 msgid "unknown" msgstr "unbekannt" -#: command.c:3610 help.c:45 +#: command.c:3689 help.c:45 msgid "off" msgstr "aus" -#: command.c:3610 help.c:45 +#: command.c:3689 help.c:45 msgid "on" msgstr "an" -#: command.c:3624 +#: command.c:3703 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "GSSAPI-verschlüsselte Verbindung\n" -#: command.c:3644 +#: command.c:3723 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -475,259 +472,271 @@ msgstr "" " richtig. Einzelheiten finden Sie auf der psql-Handbuchseite unter\n" " »Notes for Windows users«.\n" -#: command.c:3749 +#: command.c:3828 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "Umgebungsvariable PSQL_EDITOR_LINENUMBER_ARG muss gesetzt werden, um eine Zeilennummer angeben zu können" -#: command.c:3778 +#: command.c:3857 #, c-format msgid "could not start editor \"%s\"" msgstr "konnte Editor »%s« nicht starten" -#: command.c:3780 +#: command.c:3859 #, c-format msgid "could not start /bin/sh" msgstr "konnte /bin/sh nicht starten" -#: command.c:3830 +#: command.c:3909 #, c-format msgid "could not locate temporary directory: %s" msgstr "konnte temporäres Verzeichnis nicht finden: %s" -#: command.c:3857 +#: command.c:3936 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht öffnen: %m" -#: command.c:4193 +#: command.c:4272 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: Abkürzung »%s« ist nicht eindeutig, passt auf »%s« und »%s«" -#: command.c:4213 +#: command.c:4292 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset: zulässige Formate sind aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:4232 +#: command.c:4311 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: zulässige Linienstile sind ascii, old-ascii, unicode" -#: command.c:4247 +#: command.c:4326 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: zulässige Unicode-Rahmnenlinienstile sind single, double" -#: command.c:4262 +#: command.c:4341 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: zulässige Unicode-Spaltenlinienstile sind single, double" -#: command.c:4277 +#: command.c:4356 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: zulässige Unicode-Kopflinienstile sind single, double" -#: command.c:4320 +#: command.c:4399 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep muss ein einzelnes Ein-Byte-Zeichen sein" -#: command.c:4325 +#: command.c:4404 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldsep kann nicht doppeltes Anführungszeichen, Newline oder Carriage Return sein" -#: command.c:4462 command.c:4650 +#: command.c:4541 command.c:4729 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: unbekannte Option: %s" -#: command.c:4482 +#: command.c:4561 #, c-format msgid "Border style is %d.\n" msgstr "Rahmenstil ist %d.\n" -#: command.c:4488 +#: command.c:4567 #, c-format msgid "Target width is unset.\n" msgstr "Zielbreite ist nicht gesetzt.\n" -#: command.c:4490 +#: command.c:4569 #, c-format msgid "Target width is %d.\n" msgstr "Zielbreite ist %d.\n" -#: command.c:4497 +#: command.c:4576 #, c-format msgid "Expanded display is on.\n" msgstr "Erweiterte Anzeige ist an.\n" -#: command.c:4499 +#: command.c:4578 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Erweiterte Anzeige wird automatisch verwendet.\n" -#: command.c:4501 +#: command.c:4580 #, c-format msgid "Expanded display is off.\n" msgstr "Erweiterte Anzeige ist aus.\n" -#: command.c:4507 +#: command.c:4586 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Feldtrennzeichen für CSV ist »%s«.\n" -#: command.c:4515 command.c:4523 +#: command.c:4594 command.c:4602 #, c-format msgid "Field separator is zero byte.\n" msgstr "Feldtrennzeichen ist ein Null-Byte.\n" -#: command.c:4517 +#: command.c:4596 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Feldtrennzeichen ist »%s«.\n" -#: command.c:4530 +#: command.c:4609 #, c-format msgid "Default footer is on.\n" msgstr "Standardfußzeile ist an.\n" -#: command.c:4532 +#: command.c:4611 #, c-format msgid "Default footer is off.\n" msgstr "Standardfußzeile ist aus.\n" -#: command.c:4538 +#: command.c:4617 #, c-format msgid "Output format is %s.\n" msgstr "Ausgabeformat ist »%s«.\n" -#: command.c:4544 +#: command.c:4623 #, c-format msgid "Line style is %s.\n" msgstr "Linienstil ist %s.\n" -#: command.c:4551 +#: command.c:4630 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null-Anzeige ist »%s«.\n" -#: command.c:4559 +#: command.c:4638 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Lokalisiertes Format für numerische Daten ist an.\n" -#: command.c:4561 +#: command.c:4640 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Lokalisiertes Format für numerische Daten ist aus.\n" -#: command.c:4568 +#: command.c:4647 #, c-format msgid "Pager is used for long output.\n" msgstr "Pager wird für lange Ausgaben verwendet.\n" -#: command.c:4570 +#: command.c:4649 #, c-format msgid "Pager is always used.\n" msgstr "Pager wird immer verwendet.\n" -#: command.c:4572 +#: command.c:4651 #, c-format msgid "Pager usage is off.\n" msgstr "Pager-Verwendung ist aus.\n" -#: command.c:4578 +#: command.c:4657 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" msgstr[0] "Pager wird nicht für weniger als %d Zeile verwendet werden.\n" msgstr[1] "Pager wird nicht für weniger als %d Zeilen verwendet werden.\n" -#: command.c:4588 command.c:4598 +#: command.c:4667 command.c:4677 #, c-format msgid "Record separator is zero byte.\n" msgstr "Satztrennzeichen ist ein Null-Byte.\n" -#: command.c:4590 +#: command.c:4669 #, c-format msgid "Record separator is .\n" msgstr "Satztrennzeichen ist .\n" -#: command.c:4592 +#: command.c:4671 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Satztrennzeichen ist »%s«.\n" -#: command.c:4605 +#: command.c:4684 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Tabellenattribute sind »%s«.\n" -#: command.c:4608 +#: command.c:4687 #, c-format msgid "Table attributes unset.\n" msgstr "Tabellenattribute sind nicht gesetzt.\n" -#: command.c:4615 +#: command.c:4694 #, c-format msgid "Title is \"%s\".\n" msgstr "Titel ist »%s«.\n" -#: command.c:4617 +#: command.c:4696 #, c-format msgid "Title is unset.\n" msgstr "Titel ist nicht gesetzt.\n" -#: command.c:4624 +#: command.c:4703 #, c-format msgid "Tuples only is on.\n" msgstr "Nur Datenzeilen ist an.\n" -#: command.c:4626 +#: command.c:4705 #, c-format msgid "Tuples only is off.\n" msgstr "Nur Datenzeilen ist aus.\n" -#: command.c:4632 +#: command.c:4711 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Unicode-Rahmenlinienstil ist »%s«.\n" -#: command.c:4638 +#: command.c:4717 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Unicode-Spaltenlinienstil ist »%s«.\n" -#: command.c:4644 +#: command.c:4723 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Unicode-Kopflinienstil ist »%s«.\n" -#: command.c:4877 +#: command.c:4956 #, c-format msgid "\\!: failed" msgstr "\\!: fehlgeschlagen" -#: command.c:4902 common.c:652 +#: command.c:4990 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch kann nicht mit einer leeren Anfrage verwendet werden" -#: command.c:4943 +#: command.c:5022 +#, fuzzy, c-format +#| msgid "could not set environment: %m" +msgid "could not set timer: %m" +msgstr "konnte Umgebung nicht setzen: %m" + +#: command.c:5084 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (alle %gs)\n" -#: command.c:4946 +#: command.c:5087 #, c-format msgid "%s (every %gs)\n" msgstr "%s (alle %gs)\n" -#: command.c:5000 command.c:5007 common.c:552 common.c:559 common.c:1231 +#: command.c:5148 +#, fuzzy, c-format +#| msgid "could not wait for child process: %m" +msgid "could not wait for signals: %m" +msgstr "konnte nicht auf Kindprozess warten: %m" + +#: command.c:5194 command.c:5201 common.c:568 common.c:575 common.c:1153 #, c-format msgid "" "********* QUERY **********\n" @@ -740,117 +749,107 @@ msgstr "" "**************************\n" "\n" -#: command.c:5199 +#: command.c:5380 #, c-format msgid "\"%s.%s\" is not a view" msgstr "»%s.%s« ist keine Sicht" -#: command.c:5215 +#: command.c:5396 #, c-format msgid "could not parse reloptions array" msgstr "konnte reloptions-Array nicht interpretieren" -#: common.c:159 +#: common.c:162 #, c-format msgid "cannot escape without active connection" msgstr "Escape kann nicht ohne aktive Verbindung ausgeführt werden" -#: common.c:200 +#: common.c:203 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "Argument des Shell-Befehls enthält Newline oder Carriage Return: »%s«" -#: common.c:304 +#: common.c:307 #, c-format msgid "connection to server was lost" msgstr "Verbindung zum Server wurde verloren" -#: common.c:308 +#: common.c:311 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "Die Verbindung zum Server wurde verloren. Versuche Reset: " -#: common.c:313 +#: common.c:316 #, c-format msgid "Failed.\n" msgstr "Fehlgeschlagen.\n" -#: common.c:330 +#: common.c:333 #, c-format msgid "Succeeded.\n" msgstr "Erfolgreich.\n" -#: common.c:382 common.c:949 common.c:1166 +#: common.c:385 common.c:1053 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "unerwarteter PQresultStatus: %d" -#: common.c:491 +#: common.c:507 #, c-format msgid "Time: %.3f ms\n" msgstr "Zeit: %.3f ms\n" -#: common.c:506 +#: common.c:522 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Zeit: %.3f ms (%02d:%06.3f)\n" -#: common.c:515 +#: common.c:531 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Zeit: %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:522 +#: common.c:538 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Zeit: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:546 common.c:604 common.c:1202 +#: common.c:562 common.c:619 common.c:1124 describe.c:6028 #, c-format msgid "You are currently not connected to a database." msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden." -#: common.c:659 -#, c-format -msgid "\\watch cannot be used with COPY" -msgstr "\\watch kann nicht mit COPY verwendet werden" - -#: common.c:664 -#, c-format -msgid "unexpected result status for \\watch" -msgstr "unerwarteter Ergebnisstatus für \\watch" - -#: common.c:694 +#: common.c:650 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "Asynchrone Benachrichtigung »%s« mit Daten »%s« vom Serverprozess mit PID %d empfangen.\n" -#: common.c:697 +#: common.c:653 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "Asynchrone Benachrichtigung »%s« vom Serverprozess mit PID %d empfangen.\n" -#: common.c:730 common.c:747 +#: common.c:686 common.c:704 #, c-format msgid "could not print result table: %m" msgstr "konnte Ergebnistabelle nicht ausgeben: %m" -#: common.c:768 +#: common.c:725 #, c-format msgid "no rows returned for \\gset" msgstr "keine Zeilen für \\gset zurückgegeben" -#: common.c:773 +#: common.c:730 #, c-format msgid "more than one row returned for \\gset" msgstr "mehr als eine Zeile für \\gset zurückgegeben" -#: common.c:791 +#: common.c:748 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "Versuch von \\gset in besonders behandelte Variable »%s« ignoriert" -#: common.c:1211 +#: common.c:1133 #, c-format msgid "" "***(Single step mode: verify command)*******************************************\n" @@ -861,37 +860,37 @@ msgstr "" "%s\n" "***(Drücken Sie die Eingabetaste um fortzufahren oder »x« um abzubrechen)*******\n" -#: common.c:1266 -#, c-format -msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." -msgstr "Der Server (Version %s) unterstützt keine Sicherungspunkte für ON_ERROR_ROLLBACK." - -#: common.c:1329 +#: common.c:1216 #, c-format msgid "STATEMENT: %s" msgstr "ANWEISUNG: %s" -#: common.c:1373 +#: common.c:1251 #, c-format msgid "unexpected transaction status (%d)" msgstr "unerwarteter Transaktionsstatus (%d)" -#: common.c:1514 describe.c:2179 +#: common.c:1392 describe.c:1986 msgid "Column" msgstr "Spalte" -#: common.c:1515 describe.c:178 describe.c:396 describe.c:414 describe.c:459 -#: describe.c:476 describe.c:1128 describe.c:1292 describe.c:1878 -#: describe.c:1902 describe.c:2180 describe.c:4048 describe.c:4271 -#: describe.c:4496 describe.c:5794 +#: common.c:1393 describe.c:167 describe.c:349 describe.c:367 describe.c:1012 +#: describe.c:1167 describe.c:1691 describe.c:1715 describe.c:1987 +#: describe.c:3850 describe.c:4059 describe.c:4290 describe.c:4446 +#: describe.c:5674 msgid "Type" msgstr "Typ" -#: common.c:1564 +#: common.c:1442 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "Der Befehl hat kein Ergebnis oder das Ergebnis hat keine Spalten.\n" +#: common.c:1592 +#, c-format +msgid "\\watch cannot be used with COPY" +msgstr "\\watch kann nicht mit COPY verwendet werden" + #: copy.c:98 #, c-format msgid "\\copy: arguments required" @@ -954,11 +953,11 @@ msgstr "" "Geben Sie die zu kopierenden Daten ein, gefolgt von einem Zeilenende.\n" "Beenden Sie mit einem Backslash und einem Punkt alleine auf einer Zeile, oder einem EOF-Signal." -#: copy.c:671 +#: copy.c:684 msgid "aborted because of read failure" msgstr "abgebrochen wegen Lesenfehlers" -#: copy.c:705 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "versuche, den COPY-Modus zu verlassen" @@ -1007,1147 +1006,1161 @@ msgstr "\\crosstabview: zweideutiger Spaltenname: »%s«" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: Spaltenname nicht gefunden: »%s«" -#: describe.c:76 describe.c:376 describe.c:728 describe.c:924 describe.c:1120 -#: describe.c:1281 describe.c:1353 describe.c:4036 describe.c:4258 -#: describe.c:4494 describe.c:4585 describe.c:4731 describe.c:4944 -#: describe.c:5104 describe.c:5345 describe.c:5420 describe.c:5431 -#: describe.c:5493 describe.c:5918 describe.c:6001 +#: describe.c:87 describe.c:329 describe.c:622 describe.c:796 describe.c:1004 +#: describe.c:1156 describe.c:1230 describe.c:3839 describe.c:4046 +#: describe.c:4288 describe.c:4367 describe.c:4596 describe.c:4798 +#: describe.c:5026 describe.c:5261 describe.c:5328 describe.c:5339 +#: describe.c:5393 describe.c:5782 describe.c:5857 msgid "Schema" msgstr "Schema" -#: describe.c:77 describe.c:175 describe.c:243 describe.c:251 describe.c:377 -#: describe.c:729 describe.c:925 describe.c:1038 describe.c:1121 -#: describe.c:1354 describe.c:4037 describe.c:4259 describe.c:4417 -#: describe.c:4495 describe.c:4586 describe.c:4665 describe.c:4732 -#: describe.c:4945 describe.c:5029 describe.c:5105 describe.c:5346 -#: describe.c:5421 describe.c:5432 describe.c:5494 describe.c:5691 -#: describe.c:5775 describe.c:5999 describe.c:6171 describe.c:6411 +#: describe.c:88 describe.c:164 describe.c:223 describe.c:330 describe.c:623 +#: describe.c:797 describe.c:916 describe.c:1005 describe.c:1231 +#: describe.c:3840 describe.c:4047 describe.c:4209 describe.c:4289 +#: describe.c:4368 describe.c:4528 describe.c:4597 describe.c:4799 +#: describe.c:4896 describe.c:5027 describe.c:5262 describe.c:5329 +#: describe.c:5340 describe.c:5394 describe.c:5587 describe.c:5655 +#: describe.c:5855 describe.c:6074 describe.c:6376 msgid "Name" msgstr "Name" -#: describe.c:78 describe.c:389 describe.c:407 describe.c:453 describe.c:470 +#: describe.c:89 describe.c:342 describe.c:360 msgid "Result data type" msgstr "Ergebnisdatentyp" -#: describe.c:86 describe.c:99 describe.c:103 describe.c:390 describe.c:408 -#: describe.c:454 describe.c:471 +#: describe.c:90 describe.c:343 describe.c:361 msgid "Argument data types" msgstr "Argumentdatentypen" -#: describe.c:111 describe.c:118 describe.c:186 describe.c:274 describe.c:523 -#: describe.c:777 describe.c:940 describe.c:1063 describe.c:1356 -#: describe.c:2200 describe.c:3823 describe.c:4108 describe.c:4305 -#: describe.c:4448 describe.c:4522 describe.c:4595 describe.c:4678 -#: describe.c:4853 describe.c:4972 describe.c:5038 describe.c:5106 -#: describe.c:5247 describe.c:5289 describe.c:5362 describe.c:5424 -#: describe.c:5433 describe.c:5495 describe.c:5717 describe.c:5797 -#: describe.c:5932 describe.c:6002 large_obj.c:290 large_obj.c:300 +#: describe.c:98 describe.c:105 describe.c:175 describe.c:237 describe.c:414 +#: describe.c:654 describe.c:812 describe.c:945 describe.c:1233 describe.c:2007 +#: describe.c:3639 describe.c:3894 describe.c:4093 describe.c:4233 +#: describe.c:4302 describe.c:4377 describe.c:4541 describe.c:4713 +#: describe.c:4835 describe.c:4905 describe.c:5028 describe.c:5173 +#: describe.c:5215 describe.c:5278 describe.c:5332 describe.c:5341 +#: describe.c:5395 describe.c:5605 describe.c:5677 describe.c:5796 +#: describe.c:5858 describe.c:6847 msgid "Description" msgstr "Beschreibung" -#: describe.c:136 +#: describe.c:125 msgid "List of aggregate functions" msgstr "Liste der Aggregatfunktionen" -#: describe.c:161 +#: describe.c:150 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Der Server (Version %s) unterstützt keine Zugriffsmethoden." -#: describe.c:176 +#: describe.c:165 msgid "Index" msgstr "Index" -#: describe.c:177 describe.c:4056 describe.c:4284 describe.c:5919 +#: describe.c:166 describe.c:3858 describe.c:4072 describe.c:5783 msgid "Table" msgstr "Tabelle" -#: describe.c:185 describe.c:5696 +#: describe.c:174 describe.c:5589 msgid "Handler" msgstr "Handler" -#: describe.c:204 +#: describe.c:195 msgid "List of access methods" msgstr "Liste der Zugriffsmethoden" -#: describe.c:230 -#, c-format -msgid "The server (version %s) does not support tablespaces." -msgstr "Der Server (Version %s) unterstützt keine Tablespaces." - -#: describe.c:244 describe.c:252 describe.c:504 describe.c:767 describe.c:1039 -#: describe.c:1280 describe.c:4049 describe.c:4260 describe.c:4421 -#: describe.c:4667 describe.c:5030 describe.c:5692 describe.c:5776 -#: describe.c:6172 describe.c:6309 describe.c:6412 describe.c:6535 -#: describe.c:6613 large_obj.c:289 +#: describe.c:224 describe.c:395 describe.c:647 describe.c:917 describe.c:1155 +#: describe.c:3851 describe.c:4048 describe.c:4210 describe.c:4530 +#: describe.c:4897 describe.c:5588 describe.c:5656 describe.c:6075 +#: describe.c:6257 describe.c:6377 describe.c:6511 describe.c:6593 +#: describe.c:6835 msgid "Owner" msgstr "Eigentümer" -#: describe.c:245 describe.c:253 +#: describe.c:225 msgid "Location" msgstr "Pfad" -#: describe.c:264 describe.c:3639 +#: describe.c:235 describe.c:3475 msgid "Options" msgstr "Optionen" -#: describe.c:269 describe.c:740 describe.c:1055 describe.c:4100 -#: describe.c:4104 +#: describe.c:236 describe.c:645 describe.c:943 describe.c:3893 msgid "Size" msgstr "Größe" -#: describe.c:291 +#: describe.c:257 msgid "List of tablespaces" msgstr "Liste der Tablespaces" -#: describe.c:336 +#: describe.c:302 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df akzeptiert nur [anptwS+] als Optionen" -#: describe.c:344 describe.c:355 +#: describe.c:310 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df akzeptiert die Option »%c« nicht mit Serverversion %s" #. translator: "agg" is short for "aggregate" -#: describe.c:392 describe.c:410 describe.c:456 describe.c:473 +#: describe.c:345 describe.c:363 msgid "agg" msgstr "Agg" -#: describe.c:393 describe.c:411 +#: describe.c:346 describe.c:364 msgid "window" msgstr "Fenster" -#: describe.c:394 +#: describe.c:347 msgid "proc" msgstr "Proz" -#: describe.c:395 describe.c:413 describe.c:458 describe.c:475 +#: describe.c:348 describe.c:366 msgid "func" msgstr "Funk" -#: describe.c:412 describe.c:457 describe.c:474 describe.c:1490 +#: describe.c:365 describe.c:1363 msgid "trigger" msgstr "Trigger" -#: describe.c:486 +#: describe.c:377 msgid "immutable" msgstr "unveränderlich" -#: describe.c:487 +#: describe.c:378 msgid "stable" msgstr "stabil" -#: describe.c:488 +#: describe.c:379 msgid "volatile" msgstr "volatil" -#: describe.c:489 +#: describe.c:380 msgid "Volatility" msgstr "Volatilität" -#: describe.c:497 +#: describe.c:388 msgid "restricted" msgstr "beschränkt" -#: describe.c:498 +#: describe.c:389 msgid "safe" msgstr "sicher" -#: describe.c:499 +#: describe.c:390 msgid "unsafe" msgstr "unsicher" -#: describe.c:500 +#: describe.c:391 msgid "Parallel" msgstr "Parallel" -#: describe.c:505 +#: describe.c:396 msgid "definer" msgstr "definer" -#: describe.c:506 +#: describe.c:397 msgid "invoker" msgstr "invoker" -#: describe.c:507 +#: describe.c:398 msgid "Security" msgstr "Sicherheit" -#: describe.c:512 +#: describe.c:403 msgid "Language" msgstr "Sprache" -#: describe.c:516 describe.c:520 +#: describe.c:407 describe.c:411 msgid "Source code" msgstr "Quelltext" -#: describe.c:691 +#: describe.c:585 msgid "List of functions" msgstr "Liste der Funktionen" -#: describe.c:739 +#: describe.c:644 msgid "Internal name" msgstr "Interner Name" -#: describe.c:761 +#: describe.c:646 msgid "Elements" msgstr "Elemente" -#: describe.c:822 +#: describe.c:695 msgid "List of data types" msgstr "Liste der Datentypen" -#: describe.c:926 +#: describe.c:798 msgid "Left arg type" msgstr "Linker Typ" -#: describe.c:927 +#: describe.c:799 msgid "Right arg type" msgstr "Rechter Typ" -#: describe.c:928 +#: describe.c:800 msgid "Result type" msgstr "Ergebnistyp" -#: describe.c:933 describe.c:4673 describe.c:4830 describe.c:4836 -#: describe.c:5246 describe.c:6784 describe.c:6788 +#: describe.c:805 describe.c:4536 describe.c:4696 describe.c:5172 +#: describe.c:6772 describe.c:6776 msgid "Function" msgstr "Funktion" -#: describe.c:1010 +#: describe.c:886 msgid "List of operators" msgstr "Liste der Operatoren" -#: describe.c:1040 +#: describe.c:918 msgid "Encoding" msgstr "Kodierung" -#: describe.c:1045 describe.c:4946 +#: describe.c:919 describe.c:4800 msgid "Collate" msgstr "Sortierfolge" -#: describe.c:1046 describe.c:4947 +#: describe.c:920 describe.c:4801 msgid "Ctype" msgstr "Zeichentyp" -#: describe.c:1059 +#: describe.c:925 describe.c:931 describe.c:4806 describe.c:4810 +msgid "ICU Locale" +msgstr "ICU-Locale" + +#: describe.c:926 describe.c:932 +msgid "Locale Provider" +msgstr "Locale-Provider" + +#: describe.c:944 msgid "Tablespace" msgstr "Tablespace" -#: describe.c:1081 +#: describe.c:965 msgid "List of databases" msgstr "Liste der Datenbanken" -#: describe.c:1122 describe.c:1283 describe.c:4038 +#: describe.c:1006 describe.c:1158 describe.c:3841 msgid "table" msgstr "Tabelle" -#: describe.c:1123 describe.c:4039 +#: describe.c:1007 describe.c:3842 msgid "view" msgstr "Sicht" -#: describe.c:1124 describe.c:4040 +#: describe.c:1008 describe.c:3843 msgid "materialized view" msgstr "materialisierte Sicht" -#: describe.c:1125 describe.c:1285 describe.c:4042 +#: describe.c:1009 describe.c:1160 describe.c:3845 msgid "sequence" msgstr "Sequenz" -#: describe.c:1126 describe.c:4045 +#: describe.c:1010 describe.c:3847 msgid "foreign table" msgstr "Fremdtabelle" -#: describe.c:1127 describe.c:4046 describe.c:4269 +#: describe.c:1011 describe.c:3848 describe.c:4057 msgid "partitioned table" msgstr "partitionierte Tabelle" -#: describe.c:1139 +#: describe.c:1022 msgid "Column privileges" msgstr "Spaltenprivilegien" -#: describe.c:1170 describe.c:1204 +#: describe.c:1053 describe.c:1087 msgid "Policies" msgstr "Policys" -#: describe.c:1236 describe.c:6476 describe.c:6480 +#: describe.c:1121 describe.c:4452 describe.c:6456 msgid "Access privileges" msgstr "Zugriffsprivilegien" -#: describe.c:1267 -#, c-format -msgid "The server (version %s) does not support altering default privileges." -msgstr "Der Server (Version %s) unterstützt kein Ändern der Vorgabeprivilegien." - -#: describe.c:1287 +#: describe.c:1162 msgid "function" msgstr "Funktion" -#: describe.c:1289 +#: describe.c:1164 msgid "type" msgstr "Typ" -#: describe.c:1291 +#: describe.c:1166 msgid "schema" msgstr "Schema" -#: describe.c:1315 +#: describe.c:1192 msgid "Default access privileges" msgstr "Vorgegebene Zugriffsprivilegien" -#: describe.c:1355 +#: describe.c:1232 msgid "Object" msgstr "Objekt" -#: describe.c:1369 +#: describe.c:1246 msgid "table constraint" msgstr "Tabellen-Constraint" -#: describe.c:1391 +#: describe.c:1270 msgid "domain constraint" msgstr "Domänen-Constraint" -#: describe.c:1419 +#: describe.c:1294 msgid "operator class" msgstr "Operatorklasse" -#: describe.c:1448 +#: describe.c:1318 msgid "operator family" msgstr "Operatorfamilie" -#: describe.c:1470 +#: describe.c:1341 msgid "rule" msgstr "Rule" -#: describe.c:1512 +#: describe.c:1387 msgid "Object descriptions" msgstr "Objektbeschreibungen" -#: describe.c:1568 describe.c:4175 +#: describe.c:1445 describe.c:3963 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Keine Relation namens »%s« gefunden" -#: describe.c:1571 describe.c:4178 +#: describe.c:1448 describe.c:3966 #, c-format msgid "Did not find any relations." msgstr "Keine Relationen gefunden" -#: describe.c:1827 +#: describe.c:1644 #, c-format msgid "Did not find any relation with OID %s." msgstr "Keine Relation mit OID %s gefunden" -#: describe.c:1879 describe.c:1903 +#: describe.c:1692 describe.c:1716 msgid "Start" msgstr "Start" -#: describe.c:1880 describe.c:1904 +#: describe.c:1693 describe.c:1717 msgid "Minimum" msgstr "Minimum" -#: describe.c:1881 describe.c:1905 +#: describe.c:1694 describe.c:1718 msgid "Maximum" msgstr "Maximum" -#: describe.c:1882 describe.c:1906 +#: describe.c:1695 describe.c:1719 msgid "Increment" msgstr "Inkrement" -#: describe.c:1883 describe.c:1907 describe.c:2038 describe.c:4589 -#: describe.c:4847 describe.c:4961 describe.c:4966 describe.c:6523 +#: describe.c:1696 describe.c:1720 describe.c:1850 describe.c:4371 +#: describe.c:4707 describe.c:4824 describe.c:4829 describe.c:6499 msgid "yes" msgstr "ja" -#: describe.c:1884 describe.c:1908 describe.c:2039 describe.c:4589 -#: describe.c:4844 describe.c:4961 describe.c:6524 +#: describe.c:1697 describe.c:1721 describe.c:1851 describe.c:4371 +#: describe.c:4704 describe.c:4824 describe.c:6500 msgid "no" msgstr "nein" -#: describe.c:1885 describe.c:1909 +#: describe.c:1698 describe.c:1722 msgid "Cycles?" msgstr "Zyklisch?" -#: describe.c:1886 describe.c:1910 +#: describe.c:1699 describe.c:1723 msgid "Cache" msgstr "Cache" -#: describe.c:1953 +#: describe.c:1764 #, c-format msgid "Owned by: %s" msgstr "Eigentümer: %s" -#: describe.c:1957 +#: describe.c:1768 #, c-format msgid "Sequence for identity column: %s" msgstr "Sequenz für Identitätsspalte: %s" -#: describe.c:1964 +#: describe.c:1776 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "Ungeloggte Sequenz »%s.%s«" + +#: describe.c:1779 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Sequenz »%s.%s«" -#: describe.c:2111 +#: describe.c:1923 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Ungeloggte Tabelle »%s.%s«" -#: describe.c:2114 +#: describe.c:1926 #, c-format msgid "Table \"%s.%s\"" msgstr "Tabelle »%s.%s«" -#: describe.c:2118 +#: describe.c:1930 #, c-format msgid "View \"%s.%s\"" msgstr "Sicht »%s.%s«" -#: describe.c:2123 +#: describe.c:1935 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Ungeloggte materialisierte Sicht »%s.%s«" -#: describe.c:2126 +#: describe.c:1938 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Materialisierte Sicht »%s.%s«" -#: describe.c:2131 +#: describe.c:1943 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Ungeloggter Index »%s.%s«" -#: describe.c:2134 +#: describe.c:1946 #, c-format msgid "Index \"%s.%s\"" msgstr "Index »%s.%s«" -#: describe.c:2139 +#: describe.c:1951 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Ungeloggter partitionierter Index »%s.%s«" -#: describe.c:2142 +#: describe.c:1954 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Partitionierter Index »%s.%s«" -#: describe.c:2147 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "Spezielle Relation »%s.%s«" - -#: describe.c:2151 +#: describe.c:1958 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST-Tabelle »%s.%s«" -#: describe.c:2155 +#: describe.c:1962 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Zusammengesetzter Typ »%s.%s«" -#: describe.c:2159 +#: describe.c:1966 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Fremdtabelle »%s.%s«" -#: describe.c:2164 +#: describe.c:1971 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Ungeloggte partitionierte Tabelle »%s.%s«" -#: describe.c:2167 +#: describe.c:1974 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Partitionierte Tabelle »%s.%s«" -#: describe.c:2183 describe.c:4502 +#: describe.c:1990 describe.c:4291 msgid "Collation" msgstr "Sortierfolge" -#: describe.c:2184 describe.c:4509 +#: describe.c:1991 describe.c:4292 msgid "Nullable" msgstr "NULL erlaubt?" -#: describe.c:2185 describe.c:4510 +#: describe.c:1992 describe.c:4293 msgid "Default" msgstr "Vorgabewert" -#: describe.c:2188 +#: describe.c:1995 msgid "Key?" msgstr "Schlüssel?" -#: describe.c:2190 describe.c:4739 describe.c:4750 +#: describe.c:1997 describe.c:4604 describe.c:4615 msgid "Definition" msgstr "Definition" -#: describe.c:2192 describe.c:5712 describe.c:5796 describe.c:5867 -#: describe.c:5931 +#: describe.c:1999 describe.c:5604 describe.c:5676 describe.c:5739 +#: describe.c:5795 msgid "FDW options" msgstr "FDW-Optionen" -#: describe.c:2194 +#: describe.c:2001 msgid "Storage" msgstr "Speicherung" -#: describe.c:2196 +#: describe.c:2003 msgid "Compression" msgstr "Kompression" -#: describe.c:2198 +#: describe.c:2005 msgid "Stats target" msgstr "Statistikziel" -#: describe.c:2334 +#: describe.c:2141 #, c-format msgid "Partition of: %s %s%s" msgstr "Partition von: %s %s%s" -#: describe.c:2347 +#: describe.c:2154 msgid "No partition constraint" msgstr "Kein Partitions-Constraint" -#: describe.c:2349 +#: describe.c:2156 #, c-format msgid "Partition constraint: %s" msgstr "Partitions-Constraint: %s" -#: describe.c:2373 +#: describe.c:2180 #, c-format msgid "Partition key: %s" msgstr "Partitionsschlüssel: %s" -#: describe.c:2399 +#: describe.c:2206 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Gehört zu Tabelle: »%s.%s«" -#: describe.c:2470 +#: describe.c:2275 msgid "primary key, " msgstr "Primärschlüssel, " -#: describe.c:2472 -msgid "unique, " +#: describe.c:2278 +#, fuzzy +#| msgid "unique, " +msgid "unique" msgstr "eindeutig, " -#: describe.c:2478 +#: describe.c:2280 +msgid " nulls not distinct" +msgstr "" + +#: describe.c:2281 +#, fuzzy +#| msgid " " +msgid ", " +msgstr " " + +#: describe.c:2288 #, c-format msgid "for table \"%s.%s\"" msgstr "für Tabelle »%s.%s«" -#: describe.c:2482 +#: describe.c:2292 #, c-format msgid ", predicate (%s)" msgstr ", Prädikat (%s)" -#: describe.c:2485 +#: describe.c:2295 msgid ", clustered" msgstr ", geclustert" -#: describe.c:2488 +#: describe.c:2298 msgid ", invalid" msgstr ", ungültig" -#: describe.c:2491 +#: describe.c:2301 msgid ", deferrable" msgstr ", DEFERRABLE" -#: describe.c:2494 +#: describe.c:2304 msgid ", initially deferred" msgstr ", INITIALLY DEFERRED" -#: describe.c:2497 +#: describe.c:2307 msgid ", replica identity" msgstr ", Replika-Identität" -#: describe.c:2564 +#: describe.c:2361 msgid "Indexes:" msgstr "Indexe:" -#: describe.c:2648 +#: describe.c:2444 msgid "Check constraints:" msgstr "Check-Constraints:" -#: describe.c:2716 +#: describe.c:2512 msgid "Foreign-key constraints:" msgstr "Fremdschlüssel-Constraints:" -#: describe.c:2779 +#: describe.c:2575 msgid "Referenced by:" msgstr "Fremdschlüsselverweise von:" -#: describe.c:2829 +#: describe.c:2625 msgid "Policies:" msgstr "Policys:" -#: describe.c:2832 +#: describe.c:2628 msgid "Policies (forced row security enabled):" msgstr "Policys (Sicherheit auf Zeilenebene erzwungen):" -#: describe.c:2835 +#: describe.c:2631 msgid "Policies (row security enabled): (none)" msgstr "Policys (Sicherheit auf Zeilenebene eingeschaltet): (keine)" -#: describe.c:2838 +#: describe.c:2634 msgid "Policies (forced row security enabled): (none)" msgstr "Policys (Sicherheit auf Zeilenebene erzwungen): (keine)" -#: describe.c:2841 +#: describe.c:2637 msgid "Policies (row security disabled):" msgstr "Policys (Sicherheit auf Zeilenebene ausgeschaltet):" -#: describe.c:2902 describe.c:3006 +#: describe.c:2697 describe.c:2801 msgid "Statistics objects:" msgstr "Statistikobjekte:" -#: describe.c:3120 describe.c:3224 +#: describe.c:2903 describe.c:3056 msgid "Rules:" msgstr "Regeln:" -#: describe.c:3123 +#: describe.c:2906 msgid "Disabled rules:" msgstr "Abgeschaltete Regeln:" -#: describe.c:3126 +#: describe.c:2909 msgid "Rules firing always:" msgstr "Regeln, die immer aktiv werden:" -#: describe.c:3129 +#: describe.c:2912 msgid "Rules firing on replica only:" msgstr "Regeln, die nur im Replikat aktiv werden:" -#: describe.c:3169 +#: describe.c:2991 describe.c:4965 msgid "Publications:" msgstr "Publikationen:" -#: describe.c:3207 +#: describe.c:3039 msgid "View definition:" msgstr "Sichtdefinition:" -#: describe.c:3354 +#: describe.c:3202 msgid "Triggers:" msgstr "Trigger:" -#: describe.c:3358 +#: describe.c:3205 msgid "Disabled user triggers:" msgstr "Abgeschaltete Benutzer-Trigger:" -#: describe.c:3360 -msgid "Disabled triggers:" -msgstr "Abgeschaltete Trigger:" - -#: describe.c:3363 +#: describe.c:3208 msgid "Disabled internal triggers:" msgstr "Abgeschaltete interne Trigger:" -#: describe.c:3366 +#: describe.c:3211 msgid "Triggers firing always:" msgstr "Trigger, die immer aktiv werden:" -#: describe.c:3369 +#: describe.c:3214 msgid "Triggers firing on replica only:" msgstr "Trigger, die nur im Replikat aktiv werden:" -#: describe.c:3441 +#: describe.c:3285 #, c-format msgid "Server: %s" msgstr "Server: %s" -#: describe.c:3449 +#: describe.c:3293 #, c-format msgid "FDW options: (%s)" msgstr "FDW-Optionen: (%s)" -#: describe.c:3470 +#: describe.c:3314 msgid "Inherits" msgstr "Erbt von" -#: describe.c:3543 +#: describe.c:3379 #, c-format msgid "Number of partitions: %d" msgstr "Anzahl Partitionen: %d" -#: describe.c:3552 +#: describe.c:3388 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Anzahl Partitionen: %d (Mit \\d+ alle anzeigen.)" -#: describe.c:3554 +#: describe.c:3390 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Anzahl Kindtabellen: %d (Mit \\d+ alle anzeigen.)" -#: describe.c:3561 +#: describe.c:3397 msgid "Child tables" msgstr "Kindtabellen" -#: describe.c:3561 +#: describe.c:3397 msgid "Partitions" msgstr "Partitionen" -#: describe.c:3592 +#: describe.c:3428 #, c-format msgid "Typed table of type: %s" msgstr "Getypte Tabelle vom Typ: %s" -#: describe.c:3608 +#: describe.c:3444 msgid "Replica Identity" msgstr "Replika-Identität" -#: describe.c:3621 +#: describe.c:3457 msgid "Has OIDs: yes" msgstr "Hat OIDs: ja" -#: describe.c:3630 +#: describe.c:3466 #, c-format msgid "Access method: %s" msgstr "Zugriffsmethode: %s" -#: describe.c:3710 +#: describe.c:3545 #, c-format msgid "Tablespace: \"%s\"" msgstr "Tablespace: »%s«" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3722 +#: describe.c:3557 #, c-format msgid ", tablespace \"%s\"" msgstr ", Tablespace »%s«" -#: describe.c:3815 +#: describe.c:3631 msgid "List of roles" msgstr "Liste der Rollen" -#: describe.c:3817 +#: describe.c:3633 msgid "Role name" msgstr "Rollenname" -#: describe.c:3818 +#: describe.c:3634 msgid "Attributes" msgstr "Attribute" -#: describe.c:3820 +#: describe.c:3636 msgid "Member of" msgstr "Mitglied von" -#: describe.c:3831 +#: describe.c:3647 msgid "Superuser" msgstr "Superuser" -#: describe.c:3834 +#: describe.c:3650 msgid "No inheritance" msgstr "keine Vererbung" -#: describe.c:3837 +#: describe.c:3653 msgid "Create role" msgstr "Rolle erzeugen" -#: describe.c:3840 +#: describe.c:3656 msgid "Create DB" msgstr "DB erzeugen" -#: describe.c:3843 +#: describe.c:3659 msgid "Cannot login" msgstr "kann nicht einloggen" -#: describe.c:3847 +#: describe.c:3662 msgid "Replication" msgstr "Replikation" -#: describe.c:3851 +#: describe.c:3666 msgid "Bypass RLS" msgstr "Bypass RLS" -#: describe.c:3860 +#: describe.c:3675 msgid "No connections" msgstr "keine Verbindungen" -#: describe.c:3862 +#: describe.c:3677 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d Verbindung" msgstr[1] "%d Verbindungen" -#: describe.c:3872 +#: describe.c:3687 msgid "Password valid until " msgstr "Passwort gültig bis " -#: describe.c:3922 -#, c-format -msgid "The server (version %s) does not support per-database role settings." -msgstr "Der Server (Version %s) unterstützt keine Rolleneinstellungen pro Datenbank." - -#: describe.c:3935 +#: describe.c:3740 msgid "Role" msgstr "Rolle" -#: describe.c:3936 +#: describe.c:3741 msgid "Database" msgstr "Datenbank" -#: describe.c:3937 +#: describe.c:3742 msgid "Settings" msgstr "Einstellung" -#: describe.c:3958 +#: describe.c:3766 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Keine Einstellungen für Rolle »%s« und Datenbank »%s« gefunden" -#: describe.c:3961 +#: describe.c:3769 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Keine Einstellungen für Rolle »%s« gefunden" -#: describe.c:3964 +#: describe.c:3772 #, c-format msgid "Did not find any settings." msgstr "Keine Einstellungen gefunden" -#: describe.c:3969 +#: describe.c:3777 msgid "List of settings" msgstr "Liste der Einstellungen" -#: describe.c:4041 +#: describe.c:3844 msgid "index" msgstr "Index" -#: describe.c:4043 -msgid "special" -msgstr "speziell" - -#: describe.c:4044 +#: describe.c:3846 msgid "TOAST table" msgstr "TOAST-Tabelle" -#: describe.c:4047 describe.c:4270 +#: describe.c:3849 describe.c:4058 msgid "partitioned index" msgstr "partitionierter Index" -#: describe.c:4071 +#: describe.c:3869 msgid "permanent" msgstr "permanent" -#: describe.c:4072 +#: describe.c:3870 msgid "temporary" msgstr "temporär" -#: describe.c:4073 +#: describe.c:3871 msgid "unlogged" msgstr "ungeloggt" -#: describe.c:4074 +#: describe.c:3872 msgid "Persistence" msgstr "Persistenz" -#: describe.c:4091 +#: describe.c:3888 msgid "Access method" msgstr "Zugriffsmethode" -#: describe.c:4183 +#: describe.c:3971 msgid "List of relations" msgstr "Liste der Relationen" -#: describe.c:4231 +#: describe.c:4019 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "Der Server (Version %s) unterstützt keine deklarative Tabellenpartitionierung." -#: describe.c:4242 +#: describe.c:4030 msgid "List of partitioned indexes" msgstr "Liste partitionierter Indexe" -#: describe.c:4244 +#: describe.c:4032 msgid "List of partitioned tables" msgstr "Liste partitionierte Tabellen" -#: describe.c:4248 +#: describe.c:4036 msgid "List of partitioned relations" msgstr "Liste partitionierter Relationen" -#: describe.c:4279 +#: describe.c:4067 msgid "Parent name" msgstr "Elternname" -#: describe.c:4292 +#: describe.c:4080 msgid "Leaf partition size" msgstr "Größe Leaf-Partition" -#: describe.c:4295 describe.c:4301 +#: describe.c:4083 describe.c:4089 msgid "Total size" msgstr "Gesamtgröße" -#: describe.c:4425 +#: describe.c:4211 msgid "Trusted" msgstr "Vertraut" -#: describe.c:4433 +#: describe.c:4220 msgid "Internal language" msgstr "Interne Sprache" -#: describe.c:4434 +#: describe.c:4221 msgid "Call handler" msgstr "Call-Handler" -#: describe.c:4435 describe.c:5699 +#: describe.c:4222 describe.c:5590 msgid "Validator" msgstr "Validator" -#: describe.c:4438 +#: describe.c:4223 msgid "Inline handler" msgstr "Inline-Handler" -#: describe.c:4466 +#: describe.c:4253 msgid "List of languages" msgstr "Liste der Sprachen" -#: describe.c:4511 +#: describe.c:4294 msgid "Check" msgstr "Check" -#: describe.c:4553 +#: describe.c:4335 msgid "List of domains" msgstr "Liste der Domänen" -#: describe.c:4587 +#: describe.c:4369 msgid "Source" msgstr "Quelle" -#: describe.c:4588 +#: describe.c:4370 msgid "Destination" msgstr "Ziel" -#: describe.c:4590 describe.c:6525 +#: describe.c:4372 describe.c:6501 msgid "Default?" msgstr "Standard?" -#: describe.c:4627 +#: describe.c:4411 msgid "List of conversions" msgstr "Liste der Konversionen" -#: describe.c:4666 +#: describe.c:4439 +msgid "Parameter" +msgstr "Parameter" + +#: describe.c:4440 +msgid "Value" +msgstr "Wert" + +#: describe.c:4447 +msgid "Context" +msgstr "Kontext" + +#: describe.c:4480 +#, fuzzy +#| msgid "configuration_parameter" +msgid "List of configuration parameters" +msgstr "Konfigurationsparameter" + +#: describe.c:4482 +#, fuzzy +#| msgid "configuration_parameter" +msgid "List of non-default configuration parameters" +msgstr "Konfigurationsparameter" + +#: describe.c:4509 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "Der Server (Version %s) unterstützt keine Ereignistrigger." + +#: describe.c:4529 msgid "Event" msgstr "Ereignis" -#: describe.c:4668 +#: describe.c:4531 msgid "enabled" msgstr "eingeschaltet" -#: describe.c:4669 +#: describe.c:4532 msgid "replica" msgstr "Replika" -#: describe.c:4670 +#: describe.c:4533 msgid "always" msgstr "immer" -#: describe.c:4671 +#: describe.c:4534 msgid "disabled" msgstr "ausgeschaltet" -#: describe.c:4672 describe.c:6413 +#: describe.c:4535 describe.c:6378 msgid "Enabled" msgstr "Eingeschaltet" -#: describe.c:4674 +#: describe.c:4537 msgid "Tags" msgstr "Tags" -#: describe.c:4693 +#: describe.c:4558 msgid "List of event triggers" msgstr "Liste der Ereignistrigger" -#: describe.c:4720 +#: describe.c:4585 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Der Server (Version %s) unterstützt keine erweiterten Statistiken." -#: describe.c:4757 +#: describe.c:4622 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4758 +#: describe.c:4623 msgid "Dependencies" msgstr "Abhängigkeiten" -#: describe.c:4768 +#: describe.c:4633 msgid "MCV" msgstr "MCV" -#: describe.c:4787 +#: describe.c:4654 msgid "List of extended statistics" msgstr "Liste der erweiterten Statistiken" -#: describe.c:4814 +#: describe.c:4681 msgid "Source type" msgstr "Quelltyp" -#: describe.c:4815 +#: describe.c:4682 msgid "Target type" msgstr "Zieltyp" -#: describe.c:4846 +#: describe.c:4706 msgid "in assignment" msgstr "in Zuweisung" -#: describe.c:4848 +#: describe.c:4708 msgid "Implicit?" msgstr "Implizit?" -#: describe.c:4903 +#: describe.c:4767 msgid "List of casts" msgstr "Liste der Typumwandlungen" -#: describe.c:4931 -#, c-format -msgid "The server (version %s) does not support collations." -msgstr "Der Server (Version %s) unterstützt keine Sortierfolgen." - -#: describe.c:4952 describe.c:4956 +#: describe.c:4815 describe.c:4819 msgid "Provider" msgstr "Provider" -#: describe.c:4962 describe.c:4967 +#: describe.c:4825 describe.c:4830 msgid "Deterministic?" msgstr "Deterministisch?" -#: describe.c:5002 +#: describe.c:4867 msgid "List of collations" msgstr "Liste der Sortierfolgen" -#: describe.c:5061 +#: describe.c:4932 msgid "List of schemas" msgstr "Liste der Schemas" -#: describe.c:5086 describe.c:5333 describe.c:5404 describe.c:5475 -#, c-format -msgid "The server (version %s) does not support full text search." -msgstr "Der Server (Version %s) unterstützt keine Volltextsuche." - -#: describe.c:5121 +#: describe.c:5045 msgid "List of text search parsers" msgstr "Liste der Textsucheparser" -#: describe.c:5166 +#: describe.c:5092 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Kein Textsucheparser namens »%s« gefunden" -#: describe.c:5169 +#: describe.c:5095 #, c-format msgid "Did not find any text search parsers." msgstr "Keine Textsucheparser gefunden" -#: describe.c:5244 +#: describe.c:5170 msgid "Start parse" msgstr "Parsen starten" -#: describe.c:5245 +#: describe.c:5171 msgid "Method" msgstr "Methode" -#: describe.c:5249 +#: describe.c:5175 msgid "Get next token" msgstr "Nächstes Token lesen" -#: describe.c:5251 +#: describe.c:5177 msgid "End parse" msgstr "Parsen beenden" -#: describe.c:5253 +#: describe.c:5179 msgid "Get headline" msgstr "Überschrift ermitteln" -#: describe.c:5255 +#: describe.c:5181 msgid "Get token types" msgstr "Tokentypen ermitteln" -#: describe.c:5266 +#: describe.c:5192 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Textsucheparser »%s.%s«" -#: describe.c:5269 +#: describe.c:5195 #, c-format msgid "Text search parser \"%s\"" msgstr "Textsucheparser »%s«" -#: describe.c:5288 +#: describe.c:5214 msgid "Token name" msgstr "Tokenname" -#: describe.c:5299 +#: describe.c:5225 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Tokentypen für Parser »%s.%s«" -#: describe.c:5302 +#: describe.c:5228 #, c-format msgid "Token types for parser \"%s\"" msgstr "Tokentypen für Parser »%s«" -#: describe.c:5356 +#: describe.c:5272 msgid "Template" msgstr "Vorlage" -#: describe.c:5357 +#: describe.c:5273 msgid "Init options" msgstr "Initialisierungsoptionen" -#: describe.c:5379 +#: describe.c:5297 msgid "List of text search dictionaries" msgstr "Liste der Textsuchewörterbücher" -#: describe.c:5422 +#: describe.c:5330 msgid "Init" msgstr "Init" -#: describe.c:5423 +#: describe.c:5331 msgid "Lexize" msgstr "Lexize" -#: describe.c:5450 +#: describe.c:5360 msgid "List of text search templates" msgstr "Liste der Textsuchevorlagen" -#: describe.c:5510 +#: describe.c:5412 msgid "List of text search configurations" msgstr "Liste der Textsuchekonfigurationen" -#: describe.c:5556 +#: describe.c:5460 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Keine Textsuchekonfiguration namens »%s« gefunden" -#: describe.c:5559 +#: describe.c:5463 #, c-format msgid "Did not find any text search configurations." msgstr "Keine Textsuchekonfigurationen gefunden" -#: describe.c:5625 +#: describe.c:5529 msgid "Token" msgstr "Token" -#: describe.c:5626 +#: describe.c:5530 msgid "Dictionaries" msgstr "Wörterbücher" -#: describe.c:5637 +#: describe.c:5541 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Textsuchekonfiguration »%s.%s«" -#: describe.c:5640 +#: describe.c:5544 #, c-format msgid "Text search configuration \"%s\"" msgstr "Textsuchekonfiguration »%s«" -#: describe.c:5644 +#: describe.c:5548 #, c-format msgid "" "\n" @@ -2156,7 +2169,7 @@ msgstr "" "\n" "Parser: »%s.%s«" -#: describe.c:5647 +#: describe.c:5551 #, c-format msgid "" "\n" @@ -2165,244 +2178,257 @@ msgstr "" "\n" "Parser: »%s«" -#: describe.c:5681 -#, c-format -msgid "The server (version %s) does not support foreign-data wrappers." -msgstr "Der Server (Version %s) unterstützt keine Fremddaten-Wrapper." - -#: describe.c:5739 +#: describe.c:5629 msgid "List of foreign-data wrappers" msgstr "Liste der Fremddaten-Wrapper" -#: describe.c:5764 -#, c-format -msgid "The server (version %s) does not support foreign servers." -msgstr "Der Server (Version %s) unterstützt keine Fremdserver." - -#: describe.c:5777 +#: describe.c:5657 msgid "Foreign-data wrapper" msgstr "Fremddaten-Wrapper" -#: describe.c:5795 describe.c:6000 +#: describe.c:5675 describe.c:5856 msgid "Version" msgstr "Version" -#: describe.c:5821 +#: describe.c:5703 msgid "List of foreign servers" msgstr "Liste der Fremdserver" -#: describe.c:5846 -#, c-format -msgid "The server (version %s) does not support user mappings." -msgstr "Der Server (Version %s) unterstützt keine Benutzerabbildungen." - -#: describe.c:5856 describe.c:5920 +#: describe.c:5728 describe.c:5784 msgid "Server" msgstr "Server" -#: describe.c:5857 +#: describe.c:5729 msgid "User name" msgstr "Benutzername" -#: describe.c:5882 +#: describe.c:5756 msgid "List of user mappings" msgstr "Liste der Benutzerabbildungen" -#: describe.c:5907 -#, c-format -msgid "The server (version %s) does not support foreign tables." -msgstr "Der Server (Version %s) unterstützt keine Fremdtabellen." - -#: describe.c:5960 +#: describe.c:5826 msgid "List of foreign tables" msgstr "Liste der Fremdtabellen" -#: describe.c:5985 describe.c:6042 -#, c-format -msgid "The server (version %s) does not support extensions." -msgstr "Der Server (Version %s) unterstützt keine Erweiterungen." - -#: describe.c:6017 +#: describe.c:5875 msgid "List of installed extensions" msgstr "Liste der installierten Erweiterungen" -#: describe.c:6070 +#: describe.c:5920 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Keine Erweiterung namens »%s« gefunden" -#: describe.c:6073 +#: describe.c:5923 #, c-format msgid "Did not find any extensions." msgstr "Keine Erweiterungen gefunden" -#: describe.c:6117 +#: describe.c:5967 msgid "Object description" msgstr "Objektbeschreibung" -#: describe.c:6127 +#: describe.c:5977 #, c-format msgid "Objects in extension \"%s\"" msgstr "Objekte in Erweiterung »%s«" -#: describe.c:6156 describe.c:6232 +#: describe.c:6018 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "falscher qualifizierter Name (zu viele Namensteile): %s" + +#: describe.c:6033 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s" + +#: describe.c:6059 describe.c:6183 #, c-format msgid "The server (version %s) does not support publications." msgstr "Der Server (Version %s) unterstützt keine Publikationen." -#: describe.c:6173 describe.c:6310 +#: describe.c:6076 describe.c:6258 msgid "All tables" msgstr "Alle Tabellen" -#: describe.c:6174 describe.c:6311 +#: describe.c:6077 describe.c:6259 msgid "Inserts" msgstr "Inserts" -#: describe.c:6175 describe.c:6312 +#: describe.c:6078 describe.c:6260 msgid "Updates" msgstr "Updates" -#: describe.c:6176 describe.c:6313 +#: describe.c:6079 describe.c:6261 msgid "Deletes" msgstr "Deletes" -#: describe.c:6180 describe.c:6315 +#: describe.c:6083 describe.c:6263 msgid "Truncates" msgstr "Truncates" -#: describe.c:6184 describe.c:6317 +#: describe.c:6087 describe.c:6265 msgid "Via root" msgstr "Über Wurzel" -#: describe.c:6201 +#: describe.c:6106 msgid "List of publications" msgstr "Liste der Publikationen" -#: describe.c:6274 +#: describe.c:6227 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Keine Publikation namens »%s« gefunden" -#: describe.c:6277 +#: describe.c:6230 #, c-format msgid "Did not find any publications." msgstr "Keine Publikationen gefunden" -#: describe.c:6306 +#: describe.c:6254 #, c-format msgid "Publication %s" msgstr "Publikation %s" -#: describe.c:6354 +#: describe.c:6307 msgid "Tables:" msgstr "Tabellen:" -#: describe.c:6398 +#: describe.c:6319 +#, fuzzy +#| msgid "List of schemas" +msgid "Tables from schemas:" +msgstr "Liste der Schemas" + +#: describe.c:6363 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Der Server (Version %s) unterstützt keine Subskriptionen." -#: describe.c:6414 +#: describe.c:6379 msgid "Publication" msgstr "Publikation" -#: describe.c:6423 +#: describe.c:6388 msgid "Binary" msgstr "Binär" -#: describe.c:6424 +#: describe.c:6389 msgid "Streaming" msgstr "Streaming" -#: describe.c:6429 +#: describe.c:6396 +msgid "Two phase commit" +msgstr "" + +#: describe.c:6397 +#, fuzzy +#| msgid "Disabled user triggers:" +msgid "Disable on error" +msgstr "Abgeschaltete Benutzer-Trigger:" + +#: describe.c:6402 msgid "Synchronous commit" msgstr "Synchroner Commit" -#: describe.c:6430 +#: describe.c:6403 msgid "Conninfo" msgstr "Verbindungsinfo" -#: describe.c:6452 +#: describe.c:6409 +msgid "Skip LSN" +msgstr "" + +#: describe.c:6433 msgid "List of subscriptions" msgstr "Liste der Subskriptionen" -#: describe.c:6519 describe.c:6607 describe.c:6692 describe.c:6775 +#: describe.c:6495 describe.c:6587 describe.c:6676 describe.c:6763 msgid "AM" msgstr "AM" -#: describe.c:6520 +#: describe.c:6496 msgid "Input type" msgstr "Eingabetyp" -#: describe.c:6521 +#: describe.c:6497 msgid "Storage type" msgstr "Storage-Typ" -#: describe.c:6522 +#: describe.c:6498 msgid "Operator class" msgstr "Operatorklasse" -#: describe.c:6534 describe.c:6608 describe.c:6693 describe.c:6776 +#: describe.c:6510 describe.c:6588 describe.c:6677 describe.c:6764 msgid "Operator family" msgstr "Operatorfamilie" -#: describe.c:6566 +#: describe.c:6546 msgid "List of operator classes" msgstr "Liste der Operatorklassen" -#: describe.c:6609 +#: describe.c:6589 msgid "Applicable types" msgstr "Passende Typen" -#: describe.c:6647 +#: describe.c:6631 msgid "List of operator families" msgstr "Liste der Operatorfamilien" -#: describe.c:6694 +#: describe.c:6678 msgid "Operator" msgstr "Operator" -#: describe.c:6695 +#: describe.c:6679 msgid "Strategy" msgstr "Strategie" -#: describe.c:6696 +#: describe.c:6680 msgid "ordering" msgstr "Sortieren" -#: describe.c:6697 +#: describe.c:6681 msgid "search" msgstr "Suchen" -#: describe.c:6698 +#: describe.c:6682 msgid "Purpose" msgstr "Zweck" -#: describe.c:6703 +#: describe.c:6687 msgid "Sort opfamily" msgstr "Sortier-Opfamilie" -#: describe.c:6734 +#: describe.c:6722 msgid "List of operators of operator families" msgstr "Liste der Operatoren in Operatorfamilien" -#: describe.c:6777 +#: describe.c:6765 msgid "Registered left type" msgstr "Registrierter linker Typ" -#: describe.c:6778 +#: describe.c:6766 msgid "Registered right type" msgstr "Registrierter rechter Typ" -#: describe.c:6779 +#: describe.c:6767 msgid "Number" msgstr "Nummer" -#: describe.c:6815 +#: describe.c:6807 msgid "List of support functions of operator families" msgstr "Liste der Unterstützungsfunktionen in Operatorfamilien" -#: help.c:73 +#: describe.c:6834 +msgid "ID" +msgstr "ID" + +#: describe.c:6855 +msgid "Large objects" +msgstr "Large Objects" + +#: help.c:70 #, c-format msgid "" "psql is the PostgreSQL interactive terminal.\n" @@ -2411,12 +2437,12 @@ msgstr "" "psql ist das interaktive PostgreSQL-Terminal.\n" "\n" -#: help.c:74 help.c:355 help.c:433 help.c:476 +#: help.c:71 help.c:354 help.c:434 help.c:477 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: help.c:75 +#: help.c:72 #, c-format msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" @@ -2425,34 +2451,34 @@ msgstr "" " psql [OPTION]... [DBNAME [BENUTZERNAME]]\n" "\n" -#: help.c:77 +#: help.c:74 #, c-format msgid "General options:\n" msgstr "Allgemeine Optionen:\n" -#: help.c:82 +#: help.c:79 #, c-format msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=ANWEISUNG einzelne Anweisung ausführen und beenden\n" -#: help.c:83 +#: help.c:80 #, c-format msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" msgstr "" " -d, --dbname=DBNAME Datenbank, zu der verbunden werden soll\n" " (Standard: »%s«)\n" -#: help.c:84 +#: help.c:81 #, c-format msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=DATEINAME Anweisungen aus Datei ausführen und danach beenden\n" -#: help.c:85 +#: help.c:82 #, c-format msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list verfügbare Datenbanken auflisten und beenden\n" -#: help.c:86 +#: help.c:83 #, c-format msgid "" " -v, --set=, --variable=NAME=VALUE\n" @@ -2463,17 +2489,17 @@ msgstr "" " psql-Variable NAME auf WERT setzen\n" " (z.B. -v ON_ERROR_STOP=1)\n" -#: help.c:89 +#: help.c:86 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: help.c:90 +#: help.c:87 #, c-format msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc Startdatei (~/.psqlrc) nicht lesen\n" -#: help.c:91 +#: help.c:88 #, c-format msgid "" " -1 (\"one\"), --single-transaction\n" @@ -2483,22 +2509,22 @@ msgstr "" " als eine einzige Transaktion ausführen (wenn nicht\n" " interaktiv)\n" -#: help.c:93 +#: help.c:90 #, c-format msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] diese Hilfe anzeigen, dann beenden\n" -#: help.c:94 +#: help.c:91 #, c-format msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands Backslash-Befehle auflisten, dann beenden\n" -#: help.c:95 +#: help.c:92 #, c-format msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables besondere Variablen auflisten, dann beenden\n" -#: help.c:97 +#: help.c:94 #, c-format msgid "" "\n" @@ -2507,61 +2533,61 @@ msgstr "" "\n" "Eingabe- und Ausgabeoptionen:\n" -#: help.c:98 +#: help.c:95 #, c-format msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all Skript-Inhalt wiedergeben\n" -#: help.c:99 +#: help.c:96 #, c-format msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors fehlgeschlagene Anweisungen wiedergeben\n" -#: help.c:100 +#: help.c:97 #, c-format msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries an den Server geschickte Anweisungen zeigen\n" -#: help.c:101 +#: help.c:98 #, c-format msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden von internen Anweisungen erzeugte Anfragen zeigen\n" -#: help.c:102 +#: help.c:99 #, c-format msgid " -L, --log-file=FILENAME send session log to file\n" msgstr "" " -L, --log-file=DATEINAME\n" " Sitzungslog in Datei senden\n" -#: help.c:103 +#: help.c:100 #, c-format msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline erweiterte Zeilenbearbeitung (Readline) ausschalten\n" -#: help.c:104 +#: help.c:101 #, c-format msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=DATEINAME Anfrageergebnisse in Datei (oder |Pipe) senden\n" -#: help.c:105 +#: help.c:102 #, c-format msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr "" " -q, --quiet stille Ausführung (keine Mitteilungen, nur\n" " Anfrageergebnisse)\n" -#: help.c:106 +#: help.c:103 #, c-format msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step Einzelschrittmodus (jede Anfrage bestätigen)\n" -#: help.c:107 +#: help.c:104 #, c-format msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr " -S, --single-line Einzelzeilenmodus (Zeilenende beendet SQL-Anweisung)\n" -#: help.c:109 +#: help.c:106 #, c-format msgid "" "\n" @@ -2570,17 +2596,17 @@ msgstr "" "\n" "Ausgabeformatoptionen:\n" -#: help.c:110 +#: help.c:107 #, c-format msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align unausgerichteter Tabellenausgabemodus\n" -#: help.c:111 +#: help.c:108 #, c-format msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv Tabellenausgabemodus CSV (Comma-Separated Values)\n" -#: help.c:112 +#: help.c:109 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2590,19 +2616,19 @@ msgstr "" " Feldtrennzeichen für unausgerichteten Ausgabemodus\n" " (Standard: »%s«)\n" -#: help.c:115 +#: help.c:112 #, c-format msgid " -H, --html HTML table output mode\n" msgstr " -H, --html HTML-Tabellenausgabemodus\n" -#: help.c:116 +#: help.c:113 #, c-format msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr "" " -P, --pset=VAR[=ARG] Ausgabeoption VAR auf ARG setzen (siehe\n" " \\pset-Anweisung)\n" -#: help.c:117 +#: help.c:114 #, c-format msgid "" " -R, --record-separator=STRING\n" @@ -2612,22 +2638,22 @@ msgstr "" " Satztrennzeichen für unausgerichteten Ausgabemodus\n" " (Standard: Newline)\n" -#: help.c:119 +#: help.c:116 #, c-format msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only nur Datenzeilen ausgeben\n" -#: help.c:120 +#: help.c:117 #, c-format msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr " -T, --table-attr=TEXT HTML »table«-Tag-Attribute setzen (z.B. width, border)\n" -#: help.c:121 +#: help.c:118 #, c-format msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded erweiterte Tabellenausgabe einschalten\n" -#: help.c:122 +#: help.c:119 #, c-format msgid "" " -z, --field-separator-zero\n" @@ -2637,7 +2663,7 @@ msgstr "" " Feldtrennzeichen für unausgerichteten Ausgabemodus auf\n" " Null-Byte setzen\n" -#: help.c:124 +#: help.c:121 #, c-format msgid "" " -0, --record-separator-zero\n" @@ -2647,7 +2673,7 @@ msgstr "" " Satztrennzeichen für unausgerichteten Ausgabemodus auf\n" " Null-Byte setzen\n" -#: help.c:127 +#: help.c:124 #, c-format msgid "" "\n" @@ -2656,38 +2682,38 @@ msgstr "" "\n" "Verbindungsoptionen:\n" -#: help.c:130 +#: help.c:127 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" msgstr "" " -h, --host=HOSTNAME Hostname des Datenbankservers oder\n" " Socket-Verzeichnis (Standard: »%s«)\n" -#: help.c:131 +#: help.c:128 msgid "local socket" msgstr "lokales Socket" -#: help.c:134 +#: help.c:131 #, c-format msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr " -p, --port=PORT Port des Datenbankservers (Standard: »%s«)\n" -#: help.c:137 +#: help.c:134 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr " -U, --username=NAME Datenbank-Benutzername (Standard: »%s«)\n" -#: help.c:138 +#: help.c:135 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: help.c:139 +#: help.c:136 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password nach Passwort fragen (sollte automatisch geschehen)\n" -#: help.c:141 +#: help.c:138 #, c-format msgid "" "\n" @@ -2702,323 +2728,329 @@ msgstr "" "Abschnitt der PostgreSQL-Dokumentation.\n" "\n" -#: help.c:144 +#: help.c:141 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Berichten Sie Fehler an <%s>.\n" -#: help.c:145 +#: help.c:142 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: help.c:171 +#: help.c:168 #, c-format msgid "General\n" msgstr "Allgemein\n" -#: help.c:172 +#: help.c:169 #, c-format msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright PostgreSQL-Urheberrechtsinformationen zeigen\n" -#: help.c:173 +#: help.c:170 #, c-format -msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" +msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr "" -" \\crosstabview [SPALTEN] Anfrage ausführen und Ergebnisse als Kreuztabelle\n" +" \\crosstabview [SPALTEN] Anfrage ausführen und Ergebnis als Kreuztabelle\n" " anzeigen\n" -#: help.c:174 +#: help.c:171 #, c-format msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose letzte Fehlermeldung mit vollen Details anzeigen\n" -#: help.c:175 +#: help.c:172 #, c-format msgid "" -" \\g [(OPTIONS)] [FILE] execute query (and send results to file or |pipe);\n" +" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" msgstr "" " \\g [(OPT)] [DATEI] SQL-Anweisung ausführen (und Ergebnis in Datei oder\n" " |Pipe schreiben); \\g ohne Argumente entspricht Semikolon\n" -#: help.c:177 +#: help.c:174 #, c-format msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc Ergebnis der Anfrage beschreiben ohne sie auszuführen\n" -#: help.c:178 +#: help.c:175 #, c-format msgid " \\gexec execute query, then execute each value in its result\n" msgstr "" " \\gexec Anfrage ausführen, dann jeden Ergebniswert als\n" " Anweisung ausführen\n" -#: help.c:179 +#: help.c:176 #, c-format -msgid " \\gset [PREFIX] execute query and store results in psql variables\n" +msgid " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr "" " \\gset [PREFIX] SQL-Anweisung ausführen und Ergebnis in psql-Variablen\n" " ablegen\n" -#: help.c:180 +#: help.c:177 #, c-format msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [(OPT)] [DATEI] wie \\g, aber mit erweitertem Ausgabemodus\n" -#: help.c:181 +#: help.c:178 #, c-format msgid " \\q quit psql\n" msgstr " \\q psql beenden\n" -#: help.c:182 +#: help.c:179 #, c-format msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr " \\watch [SEK] Anfrage alle SEK Sekunden ausführen\n" -#: help.c:185 +#: help.c:182 #, c-format msgid "Help\n" msgstr "Hilfe\n" -#: help.c:187 +#: help.c:184 #, c-format msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] Hilfe über Backslash-Befehle anzeigen\n" -#: help.c:188 +#: help.c:185 #, c-format msgid " \\? options show help on psql command-line options\n" msgstr " \\? options Hilfe über psql-Kommandozeilenoptionen anzeigen\n" -#: help.c:189 +#: help.c:186 #, c-format msgid " \\? variables show help on special variables\n" msgstr " \\? variables Hilfe über besondere Variablen anzeigen\n" -#: help.c:190 +#: help.c:187 #, c-format msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [NAME] Syntaxhilfe über SQL-Anweisung, * für alle Anweisungen\n" -#: help.c:193 +#: help.c:190 #, c-format msgid "Query Buffer\n" msgstr "Anfragepuffer\n" -#: help.c:194 +#: help.c:191 #, c-format msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr " \\e [DATEI] [ZEILE] Anfragepuffer (oder Datei) mit externem Editor bearbeiten\n" -#: help.c:195 +#: help.c:192 #, c-format msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [FUNKNAME [ZEILE]] Funktionsdefinition mit externem Editor bearbeiten\n" -#: help.c:196 +#: help.c:193 #, c-format msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [SICHTNAME [ZEILE]] Sichtdefinition mit externem Editor bearbeiten\n" -#: help.c:197 +#: help.c:194 #, c-format msgid " \\p show the contents of the query buffer\n" msgstr " \\p aktuellen Inhalt der Anfragepuffers zeigen\n" -#: help.c:198 +#: help.c:195 #, c-format msgid " \\r reset (clear) the query buffer\n" msgstr " \\r Anfragepuffer löschen\n" -#: help.c:200 +#: help.c:197 #, c-format msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [DATEI] Befehlsgeschichte ausgeben oder in Datei schreiben\n" -#: help.c:202 +#: help.c:199 #, c-format msgid " \\w FILE write query buffer to file\n" msgstr " \\w DATEI Anfragepuffer in Datei schreiben\n" -#: help.c:205 +#: help.c:202 #, c-format msgid "Input/Output\n" msgstr "Eingabe/Ausgabe\n" -#: help.c:206 +#: help.c:203 #, c-format msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr " \\copy ... SQL COPY mit Datenstrom auf Client-Host ausführen\n" -#: help.c:207 +#: help.c:204 #, c-format msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [TEXT] Text auf Standardausgabe schreiben (-n für ohne Newline)\n" -#: help.c:208 +#: help.c:205 #, c-format msgid " \\i FILE execute commands from file\n" msgstr " \\i DATEI Befehle aus Datei ausführen\n" -#: help.c:209 +#: help.c:206 #, c-format msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr " \\ir DATEI wie \\i, aber relativ zum Ort des aktuellen Skripts\n" -#: help.c:210 +#: help.c:207 #, c-format msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [DATEI] alle Anfrageergebnisse in Datei oder |Pipe schreiben\n" -#: help.c:211 +#: help.c:208 #, c-format msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr "" " \\qecho [-n] [TEXT] Text auf Ausgabestrom für \\o schreiben (-n für ohne\n" " Newline)\n" -#: help.c:212 +#: help.c:209 #, c-format msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr "" " \\warn [-n] [TEXT] Text auf Standardfehlerausgabe schreiben (-n für ohne\n" " Newline)\n" -#: help.c:215 +#: help.c:212 #, c-format msgid "Conditional\n" msgstr "Bedingte Anweisungen\n" -#: help.c:216 +#: help.c:213 #, c-format msgid " \\if EXPR begin conditional block\n" msgstr " \\if AUSDRUCK Beginn einer bedingten Anweisung\n" -#: help.c:217 +#: help.c:214 #, c-format msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif AUSDRUCK Alternative in aktueller bedingter Anweisung\n" -#: help.c:218 +#: help.c:215 #, c-format msgid " \\else final alternative within current conditional block\n" msgstr " \\else letzte Alternative in aktueller bedingter Anweisung\n" -#: help.c:219 +#: help.c:216 #, c-format msgid " \\endif end conditional block\n" msgstr " \\endif Ende einer bedingten Anweisung\n" -#: help.c:222 +#: help.c:219 #, c-format msgid "Informational\n" msgstr "Informationen\n" -#: help.c:223 +#: help.c:220 #, c-format msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (Optionen: S = Systemobjekte zeigen, + = zusätzliche Details zeigen)\n" -#: help.c:224 +#: help.c:221 #, c-format msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] Tabellen, Sichten und Sequenzen auflisten\n" -#: help.c:225 +#: help.c:222 #, c-format msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NAME Tabelle, Sicht, Sequenz oder Index beschreiben\n" -#: help.c:226 +#: help.c:223 #, c-format msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [MUSTER] Aggregatfunktionen auflisten\n" -#: help.c:227 +#: help.c:224 #, c-format msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [MUSTER] Zugriffsmethoden auflisten\n" -#: help.c:228 +#: help.c:225 #, c-format msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMMUST [TYPMUST]] Operatorklassen auflisten\n" -#: help.c:229 +#: help.c:226 #, c-format msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMMUST [TYPMUST]] Operatorfamilien auflisten\n" -#: help.c:230 +#: help.c:227 #, c-format msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMMUST [OPFMUST]] Operatoren in Operatorfamilien auflisten\n" -#: help.c:231 +#: help.c:228 #, c-format -msgid " \\dAp [AMPTRN [OPFPTRN]] list support functions of operator families\n" -msgstr " \\dAp [AMMUST [OPFMUST]] Unterst.funktionen in Operatorfamilien auflisten\n" +msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" +msgstr " \\dAp[+] [AMMUST [OPFMUST]] Unterst.funktionen in Operatorfamilien auflisten\n" -#: help.c:232 +#: help.c:229 #, c-format msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [MUSTER] Tablespaces auflisten\n" -#: help.c:233 +#: help.c:230 #, c-format msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [MUSTER] Konversionen auflisten\n" -#: help.c:234 +#: help.c:231 +#, fuzzy, c-format +#| msgid " \\dc[S+] [PATTERN] list conversions\n" +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dc[S+] [MUSTER] Konversionen auflisten\n" + +#: help.c:232 #, c-format msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [MUSTER] Typumwandlungen (Casts) auflisten\n" -#: help.c:235 +#: help.c:233 #, c-format msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr "" " \\dd[S] [MUSTER] Objektbeschreibungen zeigen, die nirgendwo anders\n" " erscheinen\n" -#: help.c:236 +#: help.c:234 #, c-format msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [MUSTER] Domänen auflisten\n" -#: help.c:237 +#: help.c:235 #, c-format msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [MUSTER] Vorgabeprivilegien auflisten\n" -#: help.c:238 +#: help.c:236 #, c-format msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [MUSTER] Fremdtabellen auflisten\n" -#: help.c:239 -#, c-format -msgid " \\det[+] [PATTERN] list foreign tables\n" -msgstr " \\det[+] [MUSTER] Fremdtabellen auflisten\n" - -#: help.c:240 +#: help.c:237 #, c-format msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [MUSTER] Fremdserver auflisten\n" -#: help.c:241 +#: help.c:238 +#, c-format +msgid " \\det[+] [PATTERN] list foreign tables\n" +msgstr " \\det[+] [MUSTER] Fremdtabellen auflisten\n" + +#: help.c:239 #, c-format msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [MUSTER] Benutzerabbildungen auflisten\n" -#: help.c:242 +#: help.c:240 #, c-format msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [MUSTER] Fremddaten-Wrapper auflisten\n" -#: help.c:243 +#: help.c:241 #, c-format msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" @@ -3027,187 +3059,187 @@ msgstr "" " \\df[anptw][S+] [FUNKMUSTR [TYPMUSTR ...]]\n" " Funktionen [nur Agg/normale/Proz/Trigger/Fenster] auflisten\n" -#: help.c:245 +#: help.c:243 #, c-format msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [MUSTER] Textsuchekonfigurationen auflisten\n" -#: help.c:246 +#: help.c:244 #, c-format msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [MUSTER] Textsuchewörterbücher auflisten\n" -#: help.c:247 +#: help.c:245 #, c-format msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [MUSTER] Textsucheparser auflisten\n" -#: help.c:248 +#: help.c:246 #, c-format msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [MUSTER] Textsuchevorlagen auflisten\n" -#: help.c:249 +#: help.c:247 #, c-format msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [MUSTER] Rollen auflisten\n" -#: help.c:250 +#: help.c:248 #, c-format msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [MUSTER] Indexe auflisten\n" -#: help.c:251 +#: help.c:249 #, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl Large Objects auflisten, wie \\lo_list\n" +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] Large Objects auflisten, wie \\lo_list\n" -#: help.c:252 +#: help.c:250 #, c-format msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [MUSTER] prozedurale Sprachen auflisten\n" -#: help.c:253 +#: help.c:251 #, c-format msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [MUSTER] materialisierte Sichten auflisten\n" -#: help.c:254 +#: help.c:252 #, c-format msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [MUSTER] Schemas auflisten\n" -#: help.c:255 +#: help.c:253 #, c-format msgid "" -" \\do[S] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" msgstr "" -" \\do[S] [OPMUST [TYPMUST [TYPMUST]]]\n" +" \\do[S+] [OPMUST [TYPMUST [TYPMUST]]]\n" " Operatoren auflisten\n" -#: help.c:257 +#: help.c:255 #, c-format msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [MUSTER] Sortierfolgen auflisten\n" -#: help.c:258 +#: help.c:256 #, c-format msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" msgstr "" " \\dp [MUSTER] Zugriffsprivilegien für Tabellen, Sichten und\n" " Sequenzen auflisten\n" -#: help.c:259 +#: help.c:257 #, c-format msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr "" " \\dP[itn+] [MUSTER] partitionierte Relationen [nur Indexe/Tabellen]\n" " auflisten [n=geschachtelt]\n" -#: help.c:260 +#: help.c:258 #, c-format -msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" -msgstr " \\drds [MUSTER1 [MUSTER2]] datenbankspezifische Rolleneinstellungen auflisten\n" +msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" +msgstr " \\drds [ROLLMUST [DBMUST]] datenbankspezifische Rolleneinstellungen auflisten\n" -#: help.c:261 +#: help.c:259 #, c-format msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [MUSTER] Replikationspublikationen auflisten\n" -#: help.c:262 +#: help.c:260 #, c-format msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [MUSTER] Replikationssubskriptionen auflisten\n" -#: help.c:263 +#: help.c:261 #, c-format msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [MUSTER] Sequenzen auflisten\n" -#: help.c:264 +#: help.c:262 #, c-format msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [MUSTER] Tabellen auflisten\n" -#: help.c:265 +#: help.c:263 #, c-format msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [MUSTER] Datentypen auflisten\n" -#: help.c:266 +#: help.c:264 #, c-format msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [MUSTER] Rollen auflisten\n" -#: help.c:267 +#: help.c:265 #, c-format msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [MUSTER] Sichten auflisten\n" -#: help.c:268 +#: help.c:266 #, c-format msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [MUSTER] Erweiterungen auflisten\n" -#: help.c:269 +#: help.c:267 #, c-format msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [MUSTER] erweiterte Statistiken auflisten\n" -#: help.c:270 +#: help.c:268 #, c-format -msgid " \\dy [PATTERN] list event triggers\n" -msgstr " \\dy [MUSTER] Ereignistrigger auflisten\n" +msgid " \\dy[+] [PATTERN] list event triggers\n" +msgstr " \\dy[+] [MUSTER] Ereignistrigger auflisten\n" -#: help.c:271 +#: help.c:269 #, c-format msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [MUSTER] Datenbanken auflisten\n" -#: help.c:272 +#: help.c:270 #, c-format msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNKNAME Funktionsdefinition zeigen\n" -#: help.c:273 +#: help.c:271 #, c-format msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] SICHTNAME Sichtdefinition zeigen\n" -#: help.c:274 +#: help.c:272 #, c-format msgid " \\z [PATTERN] same as \\dp\n" msgstr " \\z [MUSTER] äquivalent zu \\dp\n" -#: help.c:277 +#: help.c:275 #, c-format msgid "Formatting\n" msgstr "Formatierung\n" -#: help.c:278 +#: help.c:276 #, c-format msgid " \\a toggle between unaligned and aligned output mode\n" msgstr "" " \\a zwischen unausgerichtetem und ausgerichtetem Ausgabemodus\n" " umschalten\n" -#: help.c:279 +#: help.c:277 #, c-format msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [TEXT] Tabellentitel setzen oder löschen\n" -#: help.c:280 +#: help.c:278 #, c-format msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr " \\f [ZEICHEN] Feldtrennzeichen zeigen oder setzen\n" -#: help.c:281 +#: help.c:279 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H HTML-Ausgabemodus umschalten (gegenwärtig %s)\n" -#: help.c:283 +#: help.c:281 #, c-format msgid "" " \\pset [NAME [VALUE]] set table output option\n" @@ -3226,27 +3258,27 @@ msgstr "" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle)\n" -#: help.c:290 +#: help.c:288 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] nur Datenzeilen zeigen (gegenwärtig %s)\n" -#: help.c:292 +#: help.c:290 #, c-format msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr " \\T [TEXT] HTML
-Tag-Attribute setzen oder löschen\n" -#: help.c:293 +#: help.c:291 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] erweiterte Ausgabe umschalten (gegenwärtig %s)\n" -#: help.c:297 +#: help.c:295 #, c-format msgid "Connection\n" msgstr "Verbindung\n" -#: help.c:299 +#: help.c:297 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3255,7 +3287,7 @@ msgstr "" " \\c[onnect] {[DBNAME|- BENUTZER|- HOST|- PORT|-] | conninfo}\n" " mit neuer Datenbank verbinden (aktuell »%s«)\n" -#: help.c:303 +#: help.c:301 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3264,87 +3296,93 @@ msgstr "" " \\c[onnect] {[DBNAME|- BENUTZER|- HOST|- PORT|-] | conninfo}\n" " mit neuer Datenbank verbinden (aktuell keine Verbindung)\n" -#: help.c:305 +#: help.c:303 #, c-format msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo Informationen über aktuelle Verbindung anzeigen\n" -#: help.c:306 +#: help.c:304 #, c-format msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [KODIERUNG] Client-Kodierung zeigen oder setzen\n" -#: help.c:307 +#: help.c:305 #, c-format msgid " \\password [USERNAME] securely change the password for a user\n" msgstr "" " \\password [BENUTZERNAME]\n" " sicheres Ändern eines Benutzerpasswortes\n" -#: help.c:310 +#: help.c:308 #, c-format msgid "Operating System\n" msgstr "Betriebssystem\n" -#: help.c:311 +#: help.c:309 #, c-format msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [VERZ] Arbeitsverzeichnis wechseln\n" -#: help.c:312 +#: help.c:310 +#, fuzzy, c-format +#| msgid " \\setenv NAME [VALUE] set or unset environment variable\n" +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\setenv NAME [WERT] Umgebungsvariable setzen oder löschen\n" + +#: help.c:311 #, c-format msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv NAME [WERT] Umgebungsvariable setzen oder löschen\n" -#: help.c:313 +#: help.c:312 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] Zeitmessung umschalten (gegenwärtig %s)\n" -#: help.c:315 +#: help.c:314 #, c-format msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr " \\! [BEFEHL] Befehl in Shell ausführen oder interaktive Shell starten\n" -#: help.c:318 +#: help.c:317 #, c-format msgid "Variables\n" msgstr "Variablen\n" -#: help.c:319 +#: help.c:318 #, c-format msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [TEXT] NAME interne Variable vom Benutzer abfragen\n" -#: help.c:320 +#: help.c:319 #, c-format msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr " \\set [NAME [WERT]] interne Variable setzen, oder alle anzeigen\n" -#: help.c:321 +#: help.c:320 #, c-format msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NAME interne Variable löschen\n" -#: help.c:324 +#: help.c:323 #, c-format msgid "Large Objects\n" msgstr "Large Objects\n" -#: help.c:325 +#: help.c:324 #, c-format msgid "" " \\lo_export LOBOID FILE\n" " \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" +" \\lo_list[+]\n" " \\lo_unlink LOBOID large object operations\n" msgstr "" " \\lo_export LOBOID DATEI\n" " \\lo_import DATEI [KOMMENTAR]\n" -" \\lo_list\n" +" \\lo_list[+]\n" " \\lo_unlink LOBOID Large-Object-Operationen\n" -#: help.c:352 +#: help.c:351 #, c-format msgid "" "List of specially treated variables\n" @@ -3353,12 +3391,12 @@ msgstr "" "Liste besonderer Variablen\n" "\n" -#: help.c:354 +#: help.c:353 #, c-format msgid "psql variables:\n" msgstr "psql-Variablen:\n" -#: help.c:356 +#: help.c:355 #, c-format msgid "" " psql --set=NAME=VALUE\n" @@ -3369,7 +3407,7 @@ msgstr "" " oder \\set NAME WERT innerhalb von psql\n" "\n" -#: help.c:358 +#: help.c:357 #, c-format msgid "" " AUTOCOMMIT\n" @@ -3378,7 +3416,7 @@ msgstr "" " AUTOCOMMIT\n" " wenn gesetzt werden alle erfolgreichen SQL-Befehle automatisch committet\n" -#: help.c:360 +#: help.c:359 #, c-format msgid "" " COMP_KEYWORD_CASE\n" @@ -3389,7 +3427,7 @@ msgstr "" " bestimmt, ob SQL-Schlüsselwörter in Groß- oder Kleinschreibung\n" " vervollständigt werden [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:363 +#: help.c:362 #, c-format msgid "" " DBNAME\n" @@ -3398,7 +3436,7 @@ msgstr "" " DBNAME\n" " Name der aktuellen Datenbank\n" -#: help.c:365 +#: help.c:364 #, c-format msgid "" " ECHO\n" @@ -3409,7 +3447,7 @@ msgstr "" " kontrolliert, welche Eingaben auf die Standardausgabe geschrieben werden\n" " [all, errors, none, queries]\n" -#: help.c:368 +#: help.c:367 #, c-format msgid "" " ECHO_HIDDEN\n" @@ -3420,7 +3458,7 @@ msgstr "" " wenn gesetzt, interne Anfragen, die von Backslash-Befehlen ausgeführt werden,\n" " anzeigen; wenn auf »noexec« gesetzt, nur anzeigen, nicht ausführen\n" -#: help.c:371 +#: help.c:370 #, c-format msgid "" " ENCODING\n" @@ -3429,7 +3467,7 @@ msgstr "" " ENCODING\n" " aktuelle Zeichensatzkodierung des Clients\n" -#: help.c:373 +#: help.c:372 #, c-format msgid "" " ERROR\n" @@ -3438,7 +3476,7 @@ msgstr "" " ERROR\n" " »true« wenn die letzte Anfrage fehlgeschlagen ist, sonst »false«\n" -#: help.c:375 +#: help.c:374 #, c-format msgid "" " FETCH_COUNT\n" @@ -3447,16 +3485,7 @@ msgstr "" " FETCH_COUNT\n" " Anzahl auf einmal zu holender und anzuzeigender Zeilen (0 = unbegrenzt)\n" -#: help.c:377 -#, c-format -msgid "" -" HIDE_TOAST_COMPRESSION\n" -" if set, compression methods are not displayed\n" -msgstr "" -" HIDE_TOAST_COMPRESSION\n" -" wenn gesetzt werden Kompressionsmethoden nicht angezeigt\n" - -#: help.c:379 +#: help.c:376 #, c-format msgid "" " HIDE_TABLEAM\n" @@ -3465,7 +3494,16 @@ msgstr "" " HIDE_TABLEAM\n" " wenn gesetzt werden Tabellenzugriffsmethoden nicht angezeigt\n" -#: help.c:381 +#: help.c:378 +#, c-format +msgid "" +" HIDE_TOAST_COMPRESSION\n" +" if set, compression methods are not displayed\n" +msgstr "" +" HIDE_TOAST_COMPRESSION\n" +" wenn gesetzt werden Kompressionsmethoden nicht angezeigt\n" + +#: help.c:380 #, c-format msgid "" " HISTCONTROL\n" @@ -3474,7 +3512,7 @@ msgstr "" " HISTCONTROL\n" " kontrolliert Befehlsgeschichte [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:383 +#: help.c:382 #, c-format msgid "" " HISTFILE\n" @@ -3483,7 +3521,7 @@ msgstr "" " HISTFILE\n" " Dateiname für die Befehlsgeschichte\n" -#: help.c:385 +#: help.c:384 #, c-format msgid "" " HISTSIZE\n" @@ -3492,7 +3530,7 @@ msgstr "" " HISTSIZE\n" " maximale Anzahl der in der Befehlsgeschichte zu speichernden Befehle\n" -#: help.c:387 +#: help.c:386 #, c-format msgid "" " HOST\n" @@ -3501,7 +3539,7 @@ msgstr "" " HOST\n" " der aktuell verbundene Datenbankserverhost\n" -#: help.c:389 +#: help.c:388 #, c-format msgid "" " IGNOREEOF\n" @@ -3510,7 +3548,7 @@ msgstr "" " IGNOREEOF\n" " Anzahl benötigter EOFs um eine interaktive Sitzung zu beenden\n" -#: help.c:391 +#: help.c:390 #, c-format msgid "" " LASTOID\n" @@ -3519,7 +3557,7 @@ msgstr "" " LASTOID\n" " Wert der zuletzt beinträchtigten OID\n" -#: help.c:393 +#: help.c:392 #, c-format msgid "" " LAST_ERROR_MESSAGE\n" @@ -3531,7 +3569,7 @@ msgstr "" " Fehlermeldung und SQLSTATE des letzten Fehlers, oder leer und »000000« wenn\n" " kein Fehler\n" -#: help.c:396 +#: help.c:395 #, c-format msgid "" " ON_ERROR_ROLLBACK\n" @@ -3541,7 +3579,7 @@ msgstr "" " wenn gesetzt beendet ein Fehler die Transaktion nicht (verwendet implizite\n" " Sicherungspunkte)\n" -#: help.c:398 +#: help.c:397 #, c-format msgid "" " ON_ERROR_STOP\n" @@ -3550,7 +3588,7 @@ msgstr "" " ON_ERROR_STOP\n" " Skriptausführung bei Fehler beenden\n" -#: help.c:400 +#: help.c:399 #, c-format msgid "" " PORT\n" @@ -3559,7 +3597,7 @@ msgstr "" " PORT\n" " Serverport der aktuellen Verbindung\n" -#: help.c:402 +#: help.c:401 #, c-format msgid "" " PROMPT1\n" @@ -3568,7 +3606,7 @@ msgstr "" " PROMPT1\n" " der normale psql-Prompt\n" -#: help.c:404 +#: help.c:403 #, c-format msgid "" " PROMPT2\n" @@ -3577,7 +3615,7 @@ msgstr "" " PROMPT2\n" " der Prompt, wenn eine Anweisung von der vorherigen Zeile fortgesetzt wird\n" -#: help.c:406 +#: help.c:405 #, c-format msgid "" " PROMPT3\n" @@ -3586,7 +3624,7 @@ msgstr "" " PROMPT3\n" " der Prompt während COPY ... FROM STDIN\n" -#: help.c:408 +#: help.c:407 #, c-format msgid "" " QUIET\n" @@ -3595,7 +3633,7 @@ msgstr "" " QUIET\n" " stille Ausführung (wie Option -q)\n" -#: help.c:410 +#: help.c:409 #, c-format msgid "" " ROW_COUNT\n" @@ -3604,7 +3642,7 @@ msgstr "" " ROW_COUNT\n" " Anzahl der von der letzten Anfrage beeinträchtigten Zeilen, oder 0\n" -#: help.c:412 +#: help.c:411 #, c-format msgid "" " SERVER_VERSION_NAME\n" @@ -3615,7 +3653,14 @@ msgstr "" " SERVER_VERSION_NUM\n" " Serverversion (kurze Zeichenkette oder numerisches Format)\n" -#: help.c:415 +#: help.c:414 +#, c-format +msgid "" +" SHOW_ALL_RESULTS\n" +" show all results of a combined query (\\;) instead of only the last\n" +msgstr "" + +#: help.c:416 #, c-format msgid "" " SHOW_CONTEXT\n" @@ -3625,7 +3670,7 @@ msgstr "" " kontrolliert die Anzeige von Kontextinformationen in Meldungen\n" " [never, errors, always]\n" -#: help.c:417 +#: help.c:418 #, c-format msgid "" " SINGLELINE\n" @@ -3634,7 +3679,7 @@ msgstr "" " SINGLELINE\n" " wenn gesetzt beendet Zeilenende die SQL-Anweisung (wie Option -S)\n" -#: help.c:419 +#: help.c:420 #, c-format msgid "" " SINGLESTEP\n" @@ -3643,7 +3688,7 @@ msgstr "" " SINGLESTEP\n" " Einzelschrittmodus (wie Option -s)\n" -#: help.c:421 +#: help.c:422 #, c-format msgid "" " SQLSTATE\n" @@ -3652,7 +3697,7 @@ msgstr "" " SQLSTATE\n" " SQLSTATE der letzten Anfrage, oder »00000« wenn kein Fehler\n" -#: help.c:423 +#: help.c:424 #, c-format msgid "" " USER\n" @@ -3661,7 +3706,7 @@ msgstr "" " USER\n" " der aktuell verbundene Datenbankbenutzer\n" -#: help.c:425 +#: help.c:426 #, c-format msgid "" " VERBOSITY\n" @@ -3671,7 +3716,7 @@ msgstr "" " kontrolliert wieviele Details in Fehlermeldungen enthalten sind\n" " [default, verbose, terse, sqlstate]\n" -#: help.c:427 +#: help.c:428 #, c-format msgid "" " VERSION\n" @@ -3684,7 +3729,7 @@ msgstr "" " VERSION_NUM\n" " Version von psql (lange Zeichenkette, kurze Zeichenkette oder numerisch)\n" -#: help.c:432 +#: help.c:433 #, c-format msgid "" "\n" @@ -3693,7 +3738,7 @@ msgstr "" "\n" "Anzeigeeinstellungen:\n" -#: help.c:434 +#: help.c:435 #, c-format msgid "" " psql --pset=NAME[=VALUE]\n" @@ -3704,7 +3749,7 @@ msgstr "" " oder \\pset NAME [WERT] innerhalb von psql\n" "\n" -#: help.c:436 +#: help.c:437 #, c-format msgid "" " border\n" @@ -3713,7 +3758,7 @@ msgstr "" " border\n" " Rahmenstil (Zahl)\n" -#: help.c:438 +#: help.c:439 #, c-format msgid "" " columns\n" @@ -3722,7 +3767,7 @@ msgstr "" " columns\n" " Zielbreite für das Format »wrapped«\n" -#: help.c:440 +#: help.c:441 #, c-format msgid "" " expanded (or x)\n" @@ -3731,7 +3776,7 @@ msgstr "" " expanded (oder x)\n" " erweiterte Ausgabe [on, off, auto]\n" -#: help.c:442 +#: help.c:443 #, c-format msgid "" " fieldsep\n" @@ -3740,7 +3785,7 @@ msgstr "" " fieldsep\n" " Feldtrennzeichen für unausgerichteten Ausgabemodus (Standard »%s«)\n" -#: help.c:445 +#: help.c:446 #, c-format msgid "" " fieldsep_zero\n" @@ -3749,7 +3794,7 @@ msgstr "" " fieldsep_zero\n" " Feldtrennzeichen für unausgerichteten Ausgabemodus auf Null-Byte setzen\n" -#: help.c:447 +#: help.c:448 #, c-format msgid "" " footer\n" @@ -3758,7 +3803,7 @@ msgstr "" " footer\n" " Tabellenfußzeile ein- oder auschalten [on, off]\n" -#: help.c:449 +#: help.c:450 #, c-format msgid "" " format\n" @@ -3767,7 +3812,7 @@ msgstr "" " format\n" " Ausgabeformat setzen [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:451 +#: help.c:452 #, c-format msgid "" " linestyle\n" @@ -3776,7 +3821,7 @@ msgstr "" " linestyle\n" " Rahmenlinienstil setzen [ascii, old-ascii, unicode]\n" -#: help.c:453 +#: help.c:454 #, c-format msgid "" " null\n" @@ -3785,7 +3830,7 @@ msgstr "" " null\n" " setzt die Zeichenkette, die anstelle eines NULL-Wertes ausgegeben wird\n" -#: help.c:455 +#: help.c:456 #, c-format msgid "" " numericlocale\n" @@ -3795,7 +3840,7 @@ msgstr "" " Verwendung eines Locale-spezifischen Zeichens zur Trennung von Zifferngruppen\n" " einschalten [on, off]\n" -#: help.c:457 +#: help.c:458 #, c-format msgid "" " pager\n" @@ -3804,7 +3849,7 @@ msgstr "" " pager\n" " kontrolliert Verwendung eines externen Pager-Programms [yes, no, always]\n" -#: help.c:459 +#: help.c:460 #, c-format msgid "" " recordsep\n" @@ -3813,7 +3858,7 @@ msgstr "" " recordsep\n" " Satztrennzeichen für unausgerichteten Ausgabemodus\n" -#: help.c:461 +#: help.c:462 #, c-format msgid "" " recordsep_zero\n" @@ -3822,7 +3867,7 @@ msgstr "" " recordsep_zero\n" " Satztrennzeichen für unausgerichteten Ausgabemodus auf Null-Byte setzen\n" -#: help.c:463 +#: help.c:464 #, c-format msgid "" " tableattr (or T)\n" @@ -3833,7 +3878,7 @@ msgstr "" " Attribute für das »table«-Tag im Format »html« oder proportionale\n" " Spaltenbreite für links ausgerichtete Datentypen im Format »latex-longtable«\n" -#: help.c:466 +#: help.c:467 #, c-format msgid "" " title\n" @@ -3842,7 +3887,7 @@ msgstr "" " title\n" " setzt den Titel darauffolgend ausgegebener Tabellen\n" -#: help.c:468 +#: help.c:469 #, c-format msgid "" " tuples_only\n" @@ -3851,7 +3896,7 @@ msgstr "" " tuples_only\n" " wenn gesetzt werden nur die eigentlichen Tabellendaten gezeigt\n" -#: help.c:470 +#: help.c:471 #, c-format msgid "" " unicode_border_linestyle\n" @@ -3864,7 +3909,7 @@ msgstr "" " unicode_header_linestyle\n" " setzt den Stil für Unicode-Linien [single, double]\n" -#: help.c:475 +#: help.c:476 #, c-format msgid "" "\n" @@ -3873,7 +3918,7 @@ msgstr "" "\n" "Umgebungsvariablen:\n" -#: help.c:479 +#: help.c:480 #, c-format msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" @@ -3884,7 +3929,7 @@ msgstr "" " oder \\setenv NAME [WERT] innerhalb von psql\n" "\n" -#: help.c:481 +#: help.c:482 #, c-format msgid "" " set NAME=VALUE\n" @@ -3897,7 +3942,7 @@ msgstr "" " oder \\setenv NAME [WERT] innerhalb von psql\n" "\n" -#: help.c:484 +#: help.c:485 #, c-format msgid "" " COLUMNS\n" @@ -3906,7 +3951,7 @@ msgstr "" " COLUMNS\n" " Anzahl Spalten im Format »wrapped«\n" -#: help.c:486 +#: help.c:487 #, c-format msgid "" " PGAPPNAME\n" @@ -3915,7 +3960,7 @@ msgstr "" " PGAPPNAME\n" " wie Verbindungsparameter »application_name«\n" -#: help.c:488 +#: help.c:489 #, c-format msgid "" " PGDATABASE\n" @@ -3924,7 +3969,7 @@ msgstr "" " PGDATABASE\n" " wie Verbindungsparameter »dbname«\n" -#: help.c:490 +#: help.c:491 #, c-format msgid "" " PGHOST\n" @@ -3933,16 +3978,7 @@ msgstr "" " PGHOST\n" " wie Verbindungsparameter »host«\n" -#: help.c:492 -#, c-format -msgid "" -" PGPASSWORD\n" -" connection password (not recommended)\n" -msgstr "" -" PGPASSWORD\n" -" Verbindungspasswort (nicht empfohlen)\n" - -#: help.c:494 +#: help.c:493 #, c-format msgid "" " PGPASSFILE\n" @@ -3951,7 +3987,16 @@ msgstr "" " PGPASSFILE\n" " Name der Passwortdatei\n" -#: help.c:496 +#: help.c:495 +#, c-format +msgid "" +" PGPASSWORD\n" +" connection password (not recommended)\n" +msgstr "" +" PGPASSWORD\n" +" Verbindungspasswort (nicht empfohlen)\n" + +#: help.c:497 #, c-format msgid "" " PGPORT\n" @@ -3960,7 +4005,7 @@ msgstr "" " PGPORT\n" " wie Verbindungsparameter »port«\n" -#: help.c:498 +#: help.c:499 #, c-format msgid "" " PGUSER\n" @@ -3969,7 +4014,7 @@ msgstr "" " PGUSER\n" " wie Verbindungsparameter »user«\n" -#: help.c:500 +#: help.c:501 #, c-format msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" @@ -3978,7 +4023,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " Editor für Befehle \\e, \\ef und \\ev\n" -#: help.c:502 +#: help.c:503 #, c-format msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" @@ -3987,7 +4032,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " wie die Zeilennummer beim Aufruf des Editors angegeben wird\n" -#: help.c:504 +#: help.c:505 #, c-format msgid "" " PSQL_HISTORY\n" @@ -3996,7 +4041,7 @@ msgstr "" " PSQL_HISTORY\n" " alternativer Pfad für History-Datei\n" -#: help.c:506 +#: help.c:507 #, c-format msgid "" " PSQL_PAGER, PAGER\n" @@ -4005,7 +4050,19 @@ msgstr "" " PSQL_PAGER, PAGER\n" " Name des externen Pager-Programms\n" -#: help.c:508 +#: help.c:510 +#, fuzzy, c-format +#| msgid "" +#| " PSQL_PAGER, PAGER\n" +#| " name of external pager program\n" +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_PAGER, PAGER\n" +" Name des externen Pager-Programms\n" + +#: help.c:513 #, c-format msgid "" " PSQLRC\n" @@ -4014,7 +4071,7 @@ msgstr "" " PSQLRC\n" " alternativer Pfad für .psqlrc-Datei des Benutzers\n" -#: help.c:510 +#: help.c:515 #, c-format msgid "" " SHELL\n" @@ -4023,7 +4080,7 @@ msgstr "" " SHELL\n" " Shell für den Befehl \\!\n" -#: help.c:512 +#: help.c:517 #, c-format msgid "" " TMPDIR\n" @@ -4032,11 +4089,11 @@ msgstr "" " TMPDIR\n" " Verzeichnis für temporäre Dateien\n" -#: help.c:557 +#: help.c:562 msgid "Available help:\n" msgstr "Verfügbare Hilfe:\n" -#: help.c:652 +#: help.c:657 #, c-format msgid "" "Command: %s\n" @@ -4055,7 +4112,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:675 +#: help.c:680 #, c-format msgid "" "No help available for \"%s\".\n" @@ -4069,12 +4126,12 @@ msgstr "" msgid "could not read from input file: %m" msgstr "konnte nicht aus Eingabedatei lesen: %m" -#: input.c:471 input.c:509 +#: input.c:478 input.c:516 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "konnte Befehlsgeschichte nicht in Datei »%s« speichern: %m" -#: input.c:528 +#: input.c:535 #, c-format msgid "history is not supported by this installation" msgstr "Befehlsgeschichte wird von dieser Installation nicht unterstützt" @@ -4094,25 +4151,17 @@ msgstr "%s: aktuelle Transaktion ist abgebrochen" msgid "%s: unknown transaction status" msgstr "%s: unbekannter Transaktionsstatus" -#: large_obj.c:288 large_obj.c:299 -msgid "ID" -msgstr "ID" - -#: large_obj.c:309 -msgid "Large objects" -msgstr "Large Objects" - -#: mainloop.c:136 +#: mainloop.c:133 #, c-format msgid "\\if: escaped" msgstr "\\if: abgebrochen" -#: mainloop.c:195 +#: mainloop.c:192 #, c-format msgid "Use \"\\q\" to leave %s.\n" msgstr "Verwenden Sie »\\q«, um %s zu verlassen.\n" -#: mainloop.c:217 +#: mainloop.c:214 msgid "" "The input is a PostgreSQL custom-format dump.\n" "Use the pg_restore command-line client to restore this dump to a database.\n" @@ -4121,19 +4170,19 @@ msgstr "" "Verwenden Sie den Kommandozeilen-Client pg_restore, um diesen Dump in die\n" "Datenbank zurückzuspielen.\n" -#: mainloop.c:298 +#: mainloop.c:295 msgid "Use \\? for help or press control-C to clear the input buffer." msgstr "Verwenden Sie \\? für Hilfe oder drücken Sie Strg-C um den Eingabepuffer zu löschen." -#: mainloop.c:300 +#: mainloop.c:297 msgid "Use \\? for help." msgstr "Verwenden Sie \\? für Hilfe." -#: mainloop.c:304 +#: mainloop.c:301 msgid "You are using psql, the command-line interface to PostgreSQL." msgstr "Dies ist psql, die Kommandozeilenschnittstelle für PostgreSQL." -#: mainloop.c:305 +#: mainloop.c:302 #, c-format msgid "" "Type: \\copyright for distribution terms\n" @@ -4148,24 +4197,24 @@ msgstr "" " \\g oder Semikolon, um eine Anfrage auszuführen\n" " \\q um zu beenden\n" -#: mainloop.c:329 +#: mainloop.c:326 msgid "Use \\q to quit." msgstr "Verwenden Sie \\q zum beenden." -#: mainloop.c:332 mainloop.c:356 +#: mainloop.c:329 mainloop.c:353 msgid "Use control-D to quit." msgstr "Verwenden Sie Strg-D zum beenden." -#: mainloop.c:334 mainloop.c:358 +#: mainloop.c:331 mainloop.c:355 msgid "Use control-C to quit." msgstr "Verwenden Sie Strg-C zum beenden." -#: mainloop.c:465 mainloop.c:613 +#: mainloop.c:459 mainloop.c:618 #, c-format msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "Anfrage ignoriert; verwenden Sie \\endif oder Strg-C um den aktuellen \\if-Block zu beenden" -#: mainloop.c:631 +#: mainloop.c:636 #, c-format msgid "reached EOF without finding closing \\endif(s)" msgstr "Dateiende erreicht, aber schließendes \\endif fehlt" @@ -4180,2314 +4229,2473 @@ msgstr "Zeichenkette in Anführungszeichen nicht abgeschlossen" msgid "%s: out of memory" msgstr "%s: Speicher aufgebraucht" -#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:63 sql_help.c:65 -#: sql_help.c:67 sql_help.c:78 sql_help.c:80 sql_help.c:82 sql_help.c:108 -#: sql_help.c:114 sql_help.c:116 sql_help.c:118 sql_help.c:120 sql_help.c:123 -#: sql_help.c:125 sql_help.c:127 sql_help.c:232 sql_help.c:234 sql_help.c:235 -#: sql_help.c:237 sql_help.c:239 sql_help.c:242 sql_help.c:244 sql_help.c:246 -#: sql_help.c:248 sql_help.c:260 sql_help.c:261 sql_help.c:262 sql_help.c:264 -#: sql_help.c:313 sql_help.c:315 sql_help.c:317 sql_help.c:319 sql_help.c:388 -#: sql_help.c:393 sql_help.c:395 sql_help.c:437 sql_help.c:439 sql_help.c:442 -#: sql_help.c:444 sql_help.c:512 sql_help.c:517 sql_help.c:522 sql_help.c:527 -#: sql_help.c:532 sql_help.c:587 sql_help.c:589 sql_help.c:591 sql_help.c:593 -#: sql_help.c:595 sql_help.c:597 sql_help.c:600 sql_help.c:602 sql_help.c:605 -#: sql_help.c:616 sql_help.c:618 sql_help.c:660 sql_help.c:662 sql_help.c:664 -#: sql_help.c:667 sql_help.c:669 sql_help.c:671 sql_help.c:706 sql_help.c:710 -#: sql_help.c:714 sql_help.c:733 sql_help.c:736 sql_help.c:739 sql_help.c:768 -#: sql_help.c:780 sql_help.c:788 sql_help.c:791 sql_help.c:794 sql_help.c:809 -#: sql_help.c:812 sql_help.c:841 sql_help.c:846 sql_help.c:851 sql_help.c:856 -#: sql_help.c:861 sql_help.c:883 sql_help.c:885 sql_help.c:887 sql_help.c:889 -#: sql_help.c:892 sql_help.c:894 sql_help.c:936 sql_help.c:980 sql_help.c:985 -#: sql_help.c:990 sql_help.c:995 sql_help.c:1000 sql_help.c:1019 -#: sql_help.c:1030 sql_help.c:1032 sql_help.c:1051 sql_help.c:1061 -#: sql_help.c:1063 sql_help.c:1065 sql_help.c:1077 sql_help.c:1081 -#: sql_help.c:1083 sql_help.c:1095 sql_help.c:1097 sql_help.c:1099 -#: sql_help.c:1101 sql_help.c:1119 sql_help.c:1121 sql_help.c:1125 -#: sql_help.c:1129 sql_help.c:1133 sql_help.c:1136 sql_help.c:1137 -#: sql_help.c:1138 sql_help.c:1141 sql_help.c:1143 sql_help.c:1279 -#: sql_help.c:1281 sql_help.c:1284 sql_help.c:1287 sql_help.c:1289 -#: sql_help.c:1291 sql_help.c:1294 sql_help.c:1297 sql_help.c:1411 -#: sql_help.c:1413 sql_help.c:1415 sql_help.c:1418 sql_help.c:1439 -#: sql_help.c:1442 sql_help.c:1445 sql_help.c:1448 sql_help.c:1452 -#: sql_help.c:1454 sql_help.c:1456 sql_help.c:1458 sql_help.c:1472 -#: sql_help.c:1475 sql_help.c:1477 sql_help.c:1479 sql_help.c:1489 -#: sql_help.c:1491 sql_help.c:1501 sql_help.c:1503 sql_help.c:1513 -#: sql_help.c:1516 sql_help.c:1539 sql_help.c:1541 sql_help.c:1543 -#: sql_help.c:1545 sql_help.c:1548 sql_help.c:1550 sql_help.c:1553 -#: sql_help.c:1556 sql_help.c:1607 sql_help.c:1650 sql_help.c:1653 -#: sql_help.c:1655 sql_help.c:1657 sql_help.c:1660 sql_help.c:1662 -#: sql_help.c:1664 sql_help.c:1667 sql_help.c:1717 sql_help.c:1733 -#: sql_help.c:1964 sql_help.c:2033 sql_help.c:2052 sql_help.c:2065 -#: sql_help.c:2121 sql_help.c:2127 sql_help.c:2137 sql_help.c:2158 -#: sql_help.c:2184 sql_help.c:2202 sql_help.c:2229 sql_help.c:2325 -#: sql_help.c:2371 sql_help.c:2395 sql_help.c:2418 sql_help.c:2422 -#: sql_help.c:2456 sql_help.c:2476 sql_help.c:2498 sql_help.c:2512 -#: sql_help.c:2533 sql_help.c:2557 sql_help.c:2587 sql_help.c:2612 -#: sql_help.c:2659 sql_help.c:2947 sql_help.c:2960 sql_help.c:2977 -#: sql_help.c:2993 sql_help.c:3033 sql_help.c:3087 sql_help.c:3091 -#: sql_help.c:3093 sql_help.c:3100 sql_help.c:3119 sql_help.c:3146 -#: sql_help.c:3181 sql_help.c:3193 sql_help.c:3202 sql_help.c:3246 -#: sql_help.c:3260 sql_help.c:3288 sql_help.c:3296 sql_help.c:3308 -#: sql_help.c:3318 sql_help.c:3326 sql_help.c:3334 sql_help.c:3342 -#: sql_help.c:3350 sql_help.c:3359 sql_help.c:3370 sql_help.c:3378 -#: sql_help.c:3386 sql_help.c:3394 sql_help.c:3402 sql_help.c:3412 -#: sql_help.c:3421 sql_help.c:3430 sql_help.c:3438 sql_help.c:3448 -#: sql_help.c:3459 sql_help.c:3467 sql_help.c:3476 sql_help.c:3487 -#: sql_help.c:3496 sql_help.c:3504 sql_help.c:3512 sql_help.c:3520 -#: sql_help.c:3528 sql_help.c:3536 sql_help.c:3544 sql_help.c:3552 -#: sql_help.c:3560 sql_help.c:3568 sql_help.c:3576 sql_help.c:3593 -#: sql_help.c:3602 sql_help.c:3610 sql_help.c:3627 sql_help.c:3642 -#: sql_help.c:3944 sql_help.c:3995 sql_help.c:4024 sql_help.c:4039 -#: sql_help.c:4524 sql_help.c:4572 sql_help.c:4723 +#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 +#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 +#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238 +#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248 +#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267 +#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323 +#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443 +#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524 +#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595 +#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606 +#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668 +#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714 +#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747 +#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802 +#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859 +#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900 +#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999 +#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019 +#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071 +#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086 +#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116 +#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141 +#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155 +#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163 +#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310 +#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320 +#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445 +#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474 +#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486 +#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507 +#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523 +#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548 +#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577 +#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588 +#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687 +#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696 +#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1997 +#: sql_help.c:2066 sql_help.c:2085 sql_help.c:2098 sql_help.c:2155 +#: sql_help.c:2162 sql_help.c:2172 sql_help.c:2198 sql_help.c:2229 +#: sql_help.c:2247 sql_help.c:2275 sql_help.c:2372 sql_help.c:2418 +#: sql_help.c:2443 sql_help.c:2466 sql_help.c:2470 sql_help.c:2504 +#: sql_help.c:2524 sql_help.c:2546 sql_help.c:2560 sql_help.c:2581 +#: sql_help.c:2610 sql_help.c:2645 sql_help.c:2670 sql_help.c:2717 +#: sql_help.c:3012 sql_help.c:3025 sql_help.c:3042 sql_help.c:3058 +#: sql_help.c:3098 sql_help.c:3152 sql_help.c:3156 sql_help.c:3158 +#: sql_help.c:3165 sql_help.c:3184 sql_help.c:3211 sql_help.c:3246 +#: sql_help.c:3258 sql_help.c:3267 sql_help.c:3311 sql_help.c:3325 +#: sql_help.c:3353 sql_help.c:3361 sql_help.c:3373 sql_help.c:3383 +#: sql_help.c:3391 sql_help.c:3399 sql_help.c:3407 sql_help.c:3415 +#: sql_help.c:3424 sql_help.c:3435 sql_help.c:3443 sql_help.c:3451 +#: sql_help.c:3459 sql_help.c:3467 sql_help.c:3477 sql_help.c:3486 +#: sql_help.c:3495 sql_help.c:3503 sql_help.c:3513 sql_help.c:3524 +#: sql_help.c:3532 sql_help.c:3541 sql_help.c:3552 sql_help.c:3561 +#: sql_help.c:3569 sql_help.c:3577 sql_help.c:3585 sql_help.c:3593 +#: sql_help.c:3601 sql_help.c:3609 sql_help.c:3617 sql_help.c:3625 +#: sql_help.c:3633 sql_help.c:3641 sql_help.c:3658 sql_help.c:3667 +#: sql_help.c:3675 sql_help.c:3692 sql_help.c:3707 sql_help.c:4017 +#: sql_help.c:4127 sql_help.c:4156 sql_help.c:4171 sql_help.c:4666 +#: sql_help.c:4714 sql_help.c:4865 msgid "name" msgstr "Name" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:324 sql_help.c:1814 -#: sql_help.c:3261 sql_help.c:4300 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 +#: sql_help.c:3326 sql_help.c:4442 msgid "aggregate_signature" msgstr "Aggregatsignatur" -#: sql_help.c:37 sql_help.c:64 sql_help.c:79 sql_help.c:115 sql_help.c:247 -#: sql_help.c:265 sql_help.c:396 sql_help.c:443 sql_help.c:521 sql_help.c:569 -#: sql_help.c:588 sql_help.c:617 sql_help.c:668 sql_help.c:735 sql_help.c:790 -#: sql_help.c:811 sql_help.c:850 sql_help.c:895 sql_help.c:937 sql_help.c:989 -#: sql_help.c:1021 sql_help.c:1031 sql_help.c:1064 sql_help.c:1084 -#: sql_help.c:1098 sql_help.c:1144 sql_help.c:1288 sql_help.c:1412 -#: sql_help.c:1455 sql_help.c:1476 sql_help.c:1490 sql_help.c:1502 -#: sql_help.c:1515 sql_help.c:1542 sql_help.c:1608 sql_help.c:1661 +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253 +#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576 +#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798 +#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008 +#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105 +#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444 +#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534 +#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693 msgid "new_name" msgstr "neuer_Name" -#: sql_help.c:40 sql_help.c:66 sql_help.c:81 sql_help.c:117 sql_help.c:245 -#: sql_help.c:263 sql_help.c:394 sql_help.c:479 sql_help.c:526 sql_help.c:619 -#: sql_help.c:628 sql_help.c:689 sql_help.c:709 sql_help.c:738 sql_help.c:793 -#: sql_help.c:855 sql_help.c:893 sql_help.c:994 sql_help.c:1033 sql_help.c:1062 -#: sql_help.c:1082 sql_help.c:1096 sql_help.c:1142 sql_help.c:1351 -#: sql_help.c:1414 sql_help.c:1457 sql_help.c:1478 sql_help.c:1540 -#: sql_help.c:1656 sql_help.c:2933 +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251 +#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623 +#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801 +#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052 +#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167 +#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510 +#: sql_help.c:1572 sql_help.c:1688 sql_help.c:2998 msgid "new_owner" msgstr "neuer_Eigentümer" -#: sql_help.c:43 sql_help.c:68 sql_help.c:83 sql_help.c:249 sql_help.c:316 -#: sql_help.c:445 sql_help.c:531 sql_help.c:670 sql_help.c:713 sql_help.c:741 -#: sql_help.c:796 sql_help.c:860 sql_help.c:999 sql_help.c:1066 sql_help.c:1100 -#: sql_help.c:1290 sql_help.c:1459 sql_help.c:1480 sql_help.c:1492 -#: sql_help.c:1504 sql_help.c:1544 sql_help.c:1663 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322 +#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749 +#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087 +#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512 +#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695 msgid "new_schema" msgstr "neues_Schema" -#: sql_help.c:44 sql_help.c:1878 sql_help.c:3262 sql_help.c:4329 +#: sql_help.c:44 sql_help.c:1910 sql_help.c:3327 sql_help.c:4471 msgid "where aggregate_signature is:" msgstr "wobei Aggregatsignatur Folgendes ist:" -#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:334 sql_help.c:347 -#: sql_help.c:351 sql_help.c:367 sql_help.c:370 sql_help.c:373 sql_help.c:513 -#: sql_help.c:518 sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:842 -#: sql_help.c:847 sql_help.c:852 sql_help.c:857 sql_help.c:862 sql_help.c:981 -#: sql_help.c:986 sql_help.c:991 sql_help.c:996 sql_help.c:1001 sql_help.c:1832 -#: sql_help.c:1849 sql_help.c:1855 sql_help.c:1879 sql_help.c:1882 -#: sql_help.c:1885 sql_help.c:2034 sql_help.c:2053 sql_help.c:2056 -#: sql_help.c:2326 sql_help.c:2534 sql_help.c:3263 sql_help.c:3266 -#: sql_help.c:3269 sql_help.c:3360 sql_help.c:3449 sql_help.c:3477 -#: sql_help.c:3822 sql_help.c:4202 sql_help.c:4306 sql_help.c:4313 -#: sql_help.c:4319 sql_help.c:4330 sql_help.c:4333 sql_help.c:4336 +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353 +#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520 +#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850 +#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000 +#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020 +#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911 +#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2067 sql_help.c:2086 +#: sql_help.c:2089 sql_help.c:2373 sql_help.c:2582 sql_help.c:3328 +#: sql_help.c:3331 sql_help.c:3334 sql_help.c:3425 sql_help.c:3514 +#: sql_help.c:3542 sql_help.c:3892 sql_help.c:4341 sql_help.c:4448 +#: sql_help.c:4455 sql_help.c:4461 sql_help.c:4472 sql_help.c:4475 +#: sql_help.c:4478 msgid "argmode" msgstr "Argmodus" -#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:335 sql_help.c:348 -#: sql_help.c:352 sql_help.c:368 sql_help.c:371 sql_help.c:374 sql_help.c:514 -#: sql_help.c:519 sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:843 -#: sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:863 sql_help.c:982 -#: sql_help.c:987 sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1833 -#: sql_help.c:1850 sql_help.c:1856 sql_help.c:1880 sql_help.c:1883 -#: sql_help.c:1886 sql_help.c:2035 sql_help.c:2054 sql_help.c:2057 -#: sql_help.c:2327 sql_help.c:2535 sql_help.c:3264 sql_help.c:3267 -#: sql_help.c:3270 sql_help.c:3361 sql_help.c:3450 sql_help.c:3478 -#: sql_help.c:4307 sql_help.c:4314 sql_help.c:4320 sql_help.c:4331 -#: sql_help.c:4334 sql_help.c:4337 +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354 +#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521 +#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 +#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001 +#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 +#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912 +#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2068 sql_help.c:2087 +#: sql_help.c:2090 sql_help.c:2374 sql_help.c:2583 sql_help.c:3329 +#: sql_help.c:3332 sql_help.c:3335 sql_help.c:3426 sql_help.c:3515 +#: sql_help.c:3543 sql_help.c:4449 sql_help.c:4456 sql_help.c:4462 +#: sql_help.c:4473 sql_help.c:4476 sql_help.c:4479 msgid "argname" msgstr "Argname" -#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:336 sql_help.c:349 -#: sql_help.c:353 sql_help.c:369 sql_help.c:372 sql_help.c:375 sql_help.c:515 -#: sql_help.c:520 sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:844 -#: sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:864 sql_help.c:983 -#: sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1003 sql_help.c:1834 -#: sql_help.c:1851 sql_help.c:1857 sql_help.c:1881 sql_help.c:1884 -#: sql_help.c:1887 sql_help.c:2328 sql_help.c:2536 sql_help.c:3265 -#: sql_help.c:3268 sql_help.c:3271 sql_help.c:3362 sql_help.c:3451 -#: sql_help.c:3479 sql_help.c:4308 sql_help.c:4315 sql_help.c:4321 -#: sql_help.c:4332 sql_help.c:4335 sql_help.c:4338 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355 +#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522 +#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 +#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002 +#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 +#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 +#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2375 sql_help.c:2584 +#: sql_help.c:3330 sql_help.c:3333 sql_help.c:3336 sql_help.c:3427 +#: sql_help.c:3516 sql_help.c:3544 sql_help.c:4450 sql_help.c:4457 +#: sql_help.c:4463 sql_help.c:4474 sql_help.c:4477 sql_help.c:4480 msgid "argtype" msgstr "Argtyp" -#: sql_help.c:109 sql_help.c:391 sql_help.c:468 sql_help.c:480 sql_help.c:931 -#: sql_help.c:1079 sql_help.c:1473 sql_help.c:1602 sql_help.c:1634 -#: sql_help.c:1686 sql_help.c:1749 sql_help.c:1935 sql_help.c:1942 -#: sql_help.c:2232 sql_help.c:2274 sql_help.c:2281 sql_help.c:2290 -#: sql_help.c:2372 sql_help.c:2588 sql_help.c:2681 sql_help.c:2962 -#: sql_help.c:3147 sql_help.c:3169 sql_help.c:3309 sql_help.c:3664 -#: sql_help.c:3863 sql_help.c:4038 sql_help.c:4786 +#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949 +#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666 +#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974 +#: sql_help.c:2278 sql_help.c:2320 sql_help.c:2327 sql_help.c:2336 +#: sql_help.c:2419 sql_help.c:2646 sql_help.c:2739 sql_help.c:3027 +#: sql_help.c:3212 sql_help.c:3234 sql_help.c:3374 sql_help.c:3729 +#: sql_help.c:3936 sql_help.c:4170 sql_help.c:4928 msgid "option" msgstr "Option" -#: sql_help.c:110 sql_help.c:932 sql_help.c:1603 sql_help.c:2373 -#: sql_help.c:2589 sql_help.c:3148 sql_help.c:3310 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2420 +#: sql_help.c:2647 sql_help.c:3213 sql_help.c:3375 msgid "where option can be:" msgstr "wobei Option Folgendes sein kann:" -#: sql_help.c:111 sql_help.c:2166 +#: sql_help.c:116 sql_help.c:2210 msgid "allowconn" msgstr "allowconn" -#: sql_help.c:112 sql_help.c:933 sql_help.c:1604 sql_help.c:2167 -#: sql_help.c:2374 sql_help.c:2590 sql_help.c:3149 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2211 +#: sql_help.c:2421 sql_help.c:2648 sql_help.c:3214 msgid "connlimit" msgstr "Verbindungslimit" -#: sql_help.c:113 sql_help.c:2168 +#: sql_help.c:118 sql_help.c:2212 msgid "istemplate" msgstr "istemplate" -#: sql_help.c:119 sql_help.c:607 sql_help.c:673 sql_help.c:1293 sql_help.c:1344 -#: sql_help.c:4042 +#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322 +#: sql_help.c:1374 sql_help.c:4174 msgid "new_tablespace" msgstr "neuer_Tablespace" -#: sql_help.c:121 sql_help.c:124 sql_help.c:126 sql_help.c:541 sql_help.c:543 -#: sql_help.c:544 sql_help.c:867 sql_help.c:869 sql_help.c:870 sql_help.c:940 -#: sql_help.c:944 sql_help.c:947 sql_help.c:1008 sql_help.c:1010 -#: sql_help.c:1011 sql_help.c:1155 sql_help.c:1158 sql_help.c:1611 -#: sql_help.c:1615 sql_help.c:1618 sql_help.c:2338 sql_help.c:2540 -#: sql_help.c:4060 sql_help.c:4513 +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550 +#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958 +#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029 +#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643 +#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2385 sql_help.c:2588 +#: sql_help.c:3904 sql_help.c:4192 sql_help.c:4353 sql_help.c:4655 msgid "configuration_parameter" msgstr "Konfigurationsparameter" -#: sql_help.c:122 sql_help.c:392 sql_help.c:463 sql_help.c:469 sql_help.c:481 -#: sql_help.c:542 sql_help.c:599 sql_help.c:679 sql_help.c:687 sql_help.c:868 -#: sql_help.c:891 sql_help.c:941 sql_help.c:1009 sql_help.c:1080 -#: sql_help.c:1124 sql_help.c:1128 sql_help.c:1132 sql_help.c:1135 -#: sql_help.c:1140 sql_help.c:1156 sql_help.c:1157 sql_help.c:1324 -#: sql_help.c:1346 sql_help.c:1395 sql_help.c:1417 sql_help.c:1474 -#: sql_help.c:1558 sql_help.c:1612 sql_help.c:1635 sql_help.c:2233 -#: sql_help.c:2275 sql_help.c:2282 sql_help.c:2291 sql_help.c:2339 -#: sql_help.c:2340 sql_help.c:2403 sql_help.c:2406 sql_help.c:2440 -#: sql_help.c:2541 sql_help.c:2542 sql_help.c:2560 sql_help.c:2682 -#: sql_help.c:2721 sql_help.c:2827 sql_help.c:2840 sql_help.c:2854 -#: sql_help.c:2895 sql_help.c:2919 sql_help.c:2936 sql_help.c:2963 -#: sql_help.c:3170 sql_help.c:3864 sql_help.c:4514 sql_help.c:4515 +#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487 +#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876 +#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101 +#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157 +#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182 +#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449 +#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667 +#: sql_help.c:2279 sql_help.c:2321 sql_help.c:2328 sql_help.c:2337 +#: sql_help.c:2386 sql_help.c:2387 sql_help.c:2451 sql_help.c:2454 +#: sql_help.c:2488 sql_help.c:2589 sql_help.c:2590 sql_help.c:2613 +#: sql_help.c:2740 sql_help.c:2779 sql_help.c:2889 sql_help.c:2902 +#: sql_help.c:2916 sql_help.c:2957 sql_help.c:2984 sql_help.c:3001 +#: sql_help.c:3028 sql_help.c:3235 sql_help.c:3937 sql_help.c:4656 +#: sql_help.c:4657 msgid "value" msgstr "Wert" -#: sql_help.c:194 +#: sql_help.c:200 msgid "target_role" msgstr "Zielrolle" -#: sql_help.c:195 sql_help.c:2217 sql_help.c:2637 sql_help.c:2642 -#: sql_help.c:3797 sql_help.c:3806 sql_help.c:3825 sql_help.c:3834 -#: sql_help.c:4177 sql_help.c:4186 sql_help.c:4205 sql_help.c:4214 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2263 sql_help.c:2618 +#: sql_help.c:2695 sql_help.c:2700 sql_help.c:3867 sql_help.c:3876 +#: sql_help.c:3895 sql_help.c:3907 sql_help.c:4316 sql_help.c:4325 +#: sql_help.c:4344 sql_help.c:4356 msgid "schema_name" msgstr "Schemaname" -#: sql_help.c:196 +#: sql_help.c:202 msgid "abbreviated_grant_or_revoke" msgstr "abgekürztes_Grant_oder_Revoke" -#: sql_help.c:197 +#: sql_help.c:203 msgid "where abbreviated_grant_or_revoke is one of:" msgstr "wobei abgekürztes_Grant_oder_Revoke Folgendes sein kann:" -#: sql_help.c:198 sql_help.c:199 sql_help.c:200 sql_help.c:201 sql_help.c:202 -#: sql_help.c:203 sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 -#: sql_help.c:567 sql_help.c:606 sql_help.c:672 sql_help.c:814 sql_help.c:951 -#: sql_help.c:1292 sql_help.c:1622 sql_help.c:2377 sql_help.c:2378 -#: sql_help.c:2379 sql_help.c:2380 sql_help.c:2381 sql_help.c:2514 -#: sql_help.c:2593 sql_help.c:2594 sql_help.c:2595 sql_help.c:2596 -#: sql_help.c:2597 sql_help.c:3152 sql_help.c:3153 sql_help.c:3154 -#: sql_help.c:3155 sql_help.c:3156 sql_help.c:3843 sql_help.c:3847 -#: sql_help.c:4223 sql_help.c:4227 sql_help.c:4534 +#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 +#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 +#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969 +#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2424 sql_help.c:2425 +#: sql_help.c:2426 sql_help.c:2427 sql_help.c:2428 sql_help.c:2562 +#: sql_help.c:2651 sql_help.c:2652 sql_help.c:2653 sql_help.c:2654 +#: sql_help.c:2655 sql_help.c:3217 sql_help.c:3218 sql_help.c:3219 +#: sql_help.c:3220 sql_help.c:3221 sql_help.c:3916 sql_help.c:3920 +#: sql_help.c:4365 sql_help.c:4369 sql_help.c:4676 msgid "role_name" msgstr "Rollenname" -#: sql_help.c:233 sql_help.c:456 sql_help.c:1308 sql_help.c:1310 -#: sql_help.c:1361 sql_help.c:1374 sql_help.c:1399 sql_help.c:1652 -#: sql_help.c:2187 sql_help.c:2191 sql_help.c:2294 sql_help.c:2299 -#: sql_help.c:2399 sql_help.c:2698 sql_help.c:2703 sql_help.c:2705 -#: sql_help.c:2822 sql_help.c:2835 sql_help.c:2849 sql_help.c:2858 -#: sql_help.c:2870 sql_help.c:2899 sql_help.c:3895 sql_help.c:3910 -#: sql_help.c:3912 sql_help.c:4391 sql_help.c:4392 sql_help.c:4401 -#: sql_help.c:4443 sql_help.c:4444 sql_help.c:4445 sql_help.c:4446 -#: sql_help.c:4447 sql_help.c:4448 sql_help.c:4488 sql_help.c:4489 -#: sql_help.c:4494 sql_help.c:4499 sql_help.c:4640 sql_help.c:4641 -#: sql_help.c:4650 sql_help.c:4692 sql_help.c:4693 sql_help.c:4694 -#: sql_help.c:4695 sql_help.c:4696 sql_help.c:4697 sql_help.c:4751 -#: sql_help.c:4753 sql_help.c:4814 sql_help.c:4872 sql_help.c:4873 -#: sql_help.c:4882 sql_help.c:4924 sql_help.c:4925 sql_help.c:4926 -#: sql_help.c:4927 sql_help.c:4928 sql_help.c:4929 +#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339 +#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684 +#: sql_help.c:2232 sql_help.c:2236 sql_help.c:2340 sql_help.c:2345 +#: sql_help.c:2447 sql_help.c:2617 sql_help.c:2756 sql_help.c:2761 +#: sql_help.c:2763 sql_help.c:2884 sql_help.c:2897 sql_help.c:2911 +#: sql_help.c:2920 sql_help.c:2932 sql_help.c:2961 sql_help.c:3968 +#: sql_help.c:3983 sql_help.c:3985 sql_help.c:4072 sql_help.c:4075 +#: sql_help.c:4077 sql_help.c:4533 sql_help.c:4534 sql_help.c:4543 +#: sql_help.c:4585 sql_help.c:4586 sql_help.c:4587 sql_help.c:4588 +#: sql_help.c:4589 sql_help.c:4590 sql_help.c:4630 sql_help.c:4631 +#: sql_help.c:4636 sql_help.c:4641 sql_help.c:4782 sql_help.c:4783 +#: sql_help.c:4792 sql_help.c:4834 sql_help.c:4835 sql_help.c:4836 +#: sql_help.c:4837 sql_help.c:4838 sql_help.c:4839 sql_help.c:4893 +#: sql_help.c:4895 sql_help.c:4955 sql_help.c:5013 sql_help.c:5014 +#: sql_help.c:5023 sql_help.c:5065 sql_help.c:5066 sql_help.c:5067 +#: sql_help.c:5068 sql_help.c:5069 sql_help.c:5070 msgid "expression" msgstr "Ausdruck" -#: sql_help.c:236 +#: sql_help.c:242 msgid "domain_constraint" msgstr "Domänen-Constraint" -#: sql_help.c:238 sql_help.c:240 sql_help.c:243 sql_help.c:471 sql_help.c:472 -#: sql_help.c:1285 sql_help.c:1332 sql_help.c:1333 sql_help.c:1334 -#: sql_help.c:1360 sql_help.c:1373 sql_help.c:1390 sql_help.c:1820 -#: sql_help.c:1822 sql_help.c:2190 sql_help.c:2293 sql_help.c:2298 -#: sql_help.c:2857 sql_help.c:2869 sql_help.c:3907 +#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 +#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363 +#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852 +#: sql_help.c:1854 sql_help.c:2235 sql_help.c:2339 sql_help.c:2344 +#: sql_help.c:2919 sql_help.c:2931 sql_help.c:3980 msgid "constraint_name" msgstr "Constraint-Name" -#: sql_help.c:241 sql_help.c:1286 +#: sql_help.c:247 sql_help.c:1315 msgid "new_constraint_name" msgstr "neuer_Constraint-Name" -#: sql_help.c:314 sql_help.c:1078 +#: sql_help.c:320 sql_help.c:1099 msgid "new_version" msgstr "neue_Version" -#: sql_help.c:318 sql_help.c:320 +#: sql_help.c:324 sql_help.c:326 msgid "member_object" msgstr "Elementobjekt" -#: sql_help.c:321 +#: sql_help.c:327 msgid "where member_object is:" msgstr "wobei Elementobjekt Folgendes ist:" -#: sql_help.c:322 sql_help.c:327 sql_help.c:328 sql_help.c:329 sql_help.c:330 -#: sql_help.c:331 sql_help.c:332 sql_help.c:337 sql_help.c:341 sql_help.c:343 -#: sql_help.c:345 sql_help.c:354 sql_help.c:355 sql_help.c:356 sql_help.c:357 -#: sql_help.c:358 sql_help.c:359 sql_help.c:360 sql_help.c:361 sql_help.c:364 -#: sql_help.c:365 sql_help.c:1812 sql_help.c:1817 sql_help.c:1824 -#: sql_help.c:1825 sql_help.c:1826 sql_help.c:1827 sql_help.c:1828 -#: sql_help.c:1829 sql_help.c:1830 sql_help.c:1835 sql_help.c:1837 -#: sql_help.c:1841 sql_help.c:1843 sql_help.c:1847 sql_help.c:1852 -#: sql_help.c:1853 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862 -#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1865 sql_help.c:1866 -#: sql_help.c:1867 sql_help.c:1868 sql_help.c:1869 sql_help.c:1870 -#: sql_help.c:1875 sql_help.c:1876 sql_help.c:4296 sql_help.c:4301 -#: sql_help.c:4302 sql_help.c:4303 sql_help.c:4304 sql_help.c:4310 -#: sql_help.c:4311 sql_help.c:4316 sql_help.c:4317 sql_help.c:4322 -#: sql_help.c:4323 sql_help.c:4324 sql_help.c:4325 sql_help.c:4326 -#: sql_help.c:4327 +#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336 +#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349 +#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363 +#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370 +#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856 +#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 +#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869 +#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884 +#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894 +#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898 +#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902 +#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4438 sql_help.c:4443 +#: sql_help.c:4444 sql_help.c:4445 sql_help.c:4446 sql_help.c:4452 +#: sql_help.c:4453 sql_help.c:4458 sql_help.c:4459 sql_help.c:4464 +#: sql_help.c:4465 sql_help.c:4466 sql_help.c:4467 sql_help.c:4468 +#: sql_help.c:4469 msgid "object_name" msgstr "Objektname" -#: sql_help.c:323 sql_help.c:1813 sql_help.c:4299 +#: sql_help.c:329 sql_help.c:1845 sql_help.c:4441 msgid "aggregate_name" msgstr "Aggregatname" -#: sql_help.c:325 sql_help.c:1815 sql_help.c:2099 sql_help.c:2103 -#: sql_help.c:2105 sql_help.c:3279 +#: sql_help.c:331 sql_help.c:1847 sql_help.c:2132 sql_help.c:2136 +#: sql_help.c:2138 sql_help.c:3344 msgid "source_type" msgstr "Quelltyp" -#: sql_help.c:326 sql_help.c:1816 sql_help.c:2100 sql_help.c:2104 -#: sql_help.c:2106 sql_help.c:3280 +#: sql_help.c:332 sql_help.c:1848 sql_help.c:2133 sql_help.c:2137 +#: sql_help.c:2139 sql_help.c:3345 msgid "target_type" msgstr "Zieltyp" -#: sql_help.c:333 sql_help.c:778 sql_help.c:1831 sql_help.c:2101 -#: sql_help.c:2140 sql_help.c:2205 sql_help.c:2457 sql_help.c:2488 -#: sql_help.c:3039 sql_help.c:4201 sql_help.c:4305 sql_help.c:4420 -#: sql_help.c:4424 sql_help.c:4428 sql_help.c:4431 sql_help.c:4669 -#: sql_help.c:4673 sql_help.c:4677 sql_help.c:4680 sql_help.c:4901 -#: sql_help.c:4905 sql_help.c:4909 sql_help.c:4912 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2134 +#: sql_help.c:2175 sql_help.c:2251 sql_help.c:2505 sql_help.c:2536 +#: sql_help.c:3104 sql_help.c:4340 sql_help.c:4447 sql_help.c:4562 +#: sql_help.c:4566 sql_help.c:4570 sql_help.c:4573 sql_help.c:4811 +#: sql_help.c:4815 sql_help.c:4819 sql_help.c:4822 sql_help.c:5042 +#: sql_help.c:5046 sql_help.c:5050 sql_help.c:5053 msgid "function_name" msgstr "Funktionsname" -#: sql_help.c:338 sql_help.c:771 sql_help.c:1838 sql_help.c:2481 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2529 msgid "operator_name" msgstr "Operatorname" -#: sql_help.c:339 sql_help.c:707 sql_help.c:711 sql_help.c:715 sql_help.c:1839 -#: sql_help.c:2458 sql_help.c:3403 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 +#: sql_help.c:2506 sql_help.c:3468 msgid "left_type" msgstr "linker_Typ" -#: sql_help.c:340 sql_help.c:708 sql_help.c:712 sql_help.c:716 sql_help.c:1840 -#: sql_help.c:2459 sql_help.c:3404 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 +#: sql_help.c:2507 sql_help.c:3469 msgid "right_type" msgstr "rechter_Typ" -#: sql_help.c:342 sql_help.c:344 sql_help.c:734 sql_help.c:737 sql_help.c:740 -#: sql_help.c:769 sql_help.c:781 sql_help.c:789 sql_help.c:792 sql_help.c:795 -#: sql_help.c:1379 sql_help.c:1842 sql_help.c:1844 sql_help.c:2478 -#: sql_help.c:2499 sql_help.c:2875 sql_help.c:3413 sql_help.c:3422 +#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748 +#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 +#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2526 +#: sql_help.c:2547 sql_help.c:2937 sql_help.c:3478 sql_help.c:3487 msgid "index_method" msgstr "Indexmethode" -#: sql_help.c:346 sql_help.c:1848 sql_help.c:4312 +#: sql_help.c:352 sql_help.c:1880 sql_help.c:4454 msgid "procedure_name" msgstr "Prozedurname" -#: sql_help.c:350 sql_help.c:1854 sql_help.c:3821 sql_help.c:4318 +#: sql_help.c:356 sql_help.c:1886 sql_help.c:3891 sql_help.c:4460 msgid "routine_name" msgstr "Routinenname" -#: sql_help.c:362 sql_help.c:1350 sql_help.c:1871 sql_help.c:2334 -#: sql_help.c:2539 sql_help.c:2830 sql_help.c:3006 sql_help.c:3584 -#: sql_help.c:3840 sql_help.c:4220 +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2381 +#: sql_help.c:2587 sql_help.c:2892 sql_help.c:3071 sql_help.c:3649 +#: sql_help.c:3913 sql_help.c:4362 msgid "type_name" msgstr "Typname" -#: sql_help.c:363 sql_help.c:1872 sql_help.c:2333 sql_help.c:2538 -#: sql_help.c:3007 sql_help.c:3237 sql_help.c:3585 sql_help.c:3828 -#: sql_help.c:4208 +#: sql_help.c:369 sql_help.c:1904 sql_help.c:2380 sql_help.c:2586 +#: sql_help.c:3072 sql_help.c:3302 sql_help.c:3650 sql_help.c:3898 +#: sql_help.c:4347 msgid "lang_name" msgstr "Sprachname" -#: sql_help.c:366 +#: sql_help.c:372 msgid "and aggregate_signature is:" msgstr "und Aggregatsignatur Folgendes ist:" -#: sql_help.c:389 sql_help.c:1966 sql_help.c:2230 +#: sql_help.c:395 sql_help.c:1999 sql_help.c:2276 msgid "handler_function" msgstr "Handler-Funktion" -#: sql_help.c:390 sql_help.c:2231 +#: sql_help.c:396 sql_help.c:2277 msgid "validator_function" msgstr "Validator-Funktion" -#: sql_help.c:438 sql_help.c:516 sql_help.c:661 sql_help.c:845 sql_help.c:984 -#: sql_help.c:1280 sql_help.c:1549 +#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003 +#: sql_help.c:1309 sql_help.c:1581 msgid "action" msgstr "Aktion" -#: sql_help.c:440 sql_help.c:447 sql_help.c:451 sql_help.c:452 sql_help.c:455 -#: sql_help.c:457 sql_help.c:458 sql_help.c:459 sql_help.c:461 sql_help.c:464 -#: sql_help.c:466 sql_help.c:467 sql_help.c:665 sql_help.c:675 sql_help.c:677 -#: sql_help.c:680 sql_help.c:682 sql_help.c:683 sql_help.c:1060 sql_help.c:1282 -#: sql_help.c:1300 sql_help.c:1304 sql_help.c:1305 sql_help.c:1309 -#: sql_help.c:1311 sql_help.c:1312 sql_help.c:1313 sql_help.c:1314 -#: sql_help.c:1316 sql_help.c:1319 sql_help.c:1320 sql_help.c:1322 -#: sql_help.c:1325 sql_help.c:1327 sql_help.c:1328 sql_help.c:1375 -#: sql_help.c:1377 sql_help.c:1384 sql_help.c:1393 sql_help.c:1398 -#: sql_help.c:1651 sql_help.c:1654 sql_help.c:1658 sql_help.c:1694 -#: sql_help.c:1819 sql_help.c:1932 sql_help.c:1938 sql_help.c:1951 -#: sql_help.c:1952 sql_help.c:1953 sql_help.c:2272 sql_help.c:2285 -#: sql_help.c:2331 sql_help.c:2398 sql_help.c:2404 sql_help.c:2437 -#: sql_help.c:2667 sql_help.c:2702 sql_help.c:2704 sql_help.c:2812 -#: sql_help.c:2821 sql_help.c:2831 sql_help.c:2834 sql_help.c:2844 -#: sql_help.c:2848 sql_help.c:2871 sql_help.c:2873 sql_help.c:2880 -#: sql_help.c:2893 sql_help.c:2898 sql_help.c:2916 sql_help.c:3042 -#: sql_help.c:3182 sql_help.c:3800 sql_help.c:3801 sql_help.c:3894 -#: sql_help.c:3909 sql_help.c:3911 sql_help.c:3913 sql_help.c:4180 -#: sql_help.c:4181 sql_help.c:4298 sql_help.c:4452 sql_help.c:4458 -#: sql_help.c:4460 sql_help.c:4701 sql_help.c:4707 sql_help.c:4709 -#: sql_help.c:4750 sql_help.c:4752 sql_help.c:4754 sql_help.c:4802 -#: sql_help.c:4933 sql_help.c:4939 sql_help.c:4941 +#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461 +#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470 +#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683 +#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080 +#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334 +#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 +#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349 +#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 +#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422 +#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683 +#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851 +#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1984 sql_help.c:1985 +#: sql_help.c:1986 sql_help.c:2318 sql_help.c:2331 sql_help.c:2378 +#: sql_help.c:2446 sql_help.c:2452 sql_help.c:2485 sql_help.c:2616 +#: sql_help.c:2725 sql_help.c:2760 sql_help.c:2762 sql_help.c:2874 +#: sql_help.c:2883 sql_help.c:2893 sql_help.c:2896 sql_help.c:2906 +#: sql_help.c:2910 sql_help.c:2933 sql_help.c:2935 sql_help.c:2942 +#: sql_help.c:2955 sql_help.c:2960 sql_help.c:2964 sql_help.c:2965 +#: sql_help.c:2981 sql_help.c:3107 sql_help.c:3247 sql_help.c:3870 +#: sql_help.c:3871 sql_help.c:3967 sql_help.c:3982 sql_help.c:3984 +#: sql_help.c:3986 sql_help.c:4071 sql_help.c:4074 sql_help.c:4076 +#: sql_help.c:4319 sql_help.c:4320 sql_help.c:4440 sql_help.c:4594 +#: sql_help.c:4600 sql_help.c:4602 sql_help.c:4843 sql_help.c:4849 +#: sql_help.c:4851 sql_help.c:4892 sql_help.c:4894 sql_help.c:4896 +#: sql_help.c:4943 sql_help.c:5074 sql_help.c:5080 sql_help.c:5082 msgid "column_name" msgstr "Spaltenname" -#: sql_help.c:441 sql_help.c:666 sql_help.c:1283 sql_help.c:1659 +#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 msgid "new_column_name" msgstr "neuer_Spaltenname" -#: sql_help.c:446 sql_help.c:537 sql_help.c:674 sql_help.c:866 sql_help.c:1005 -#: sql_help.c:1299 sql_help.c:1559 +#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024 +#: sql_help.c:1328 sql_help.c:1591 msgid "where action is one of:" msgstr "wobei Aktion Folgendes sein kann:" -#: sql_help.c:448 sql_help.c:453 sql_help.c:1052 sql_help.c:1301 -#: sql_help.c:1306 sql_help.c:1561 sql_help.c:1565 sql_help.c:2185 -#: sql_help.c:2273 sql_help.c:2477 sql_help.c:2660 sql_help.c:2813 -#: sql_help.c:3089 sql_help.c:3996 +#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330 +#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2230 +#: sql_help.c:2319 sql_help.c:2525 sql_help.c:2718 sql_help.c:2875 +#: sql_help.c:3154 sql_help.c:4128 msgid "data_type" msgstr "Datentyp" -#: sql_help.c:449 sql_help.c:454 sql_help.c:1302 sql_help.c:1307 -#: sql_help.c:1562 sql_help.c:1566 sql_help.c:2186 sql_help.c:2276 -#: sql_help.c:2400 sql_help.c:2814 sql_help.c:2823 sql_help.c:2836 -#: sql_help.c:2850 sql_help.c:3090 sql_help.c:3096 sql_help.c:3904 +#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336 +#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2231 sql_help.c:2322 +#: sql_help.c:2448 sql_help.c:2877 sql_help.c:2885 sql_help.c:2898 +#: sql_help.c:2912 sql_help.c:3155 sql_help.c:3161 sql_help.c:3977 msgid "collation" msgstr "Sortierfolge" -#: sql_help.c:450 sql_help.c:1303 sql_help.c:2277 sql_help.c:2286 -#: sql_help.c:2816 sql_help.c:2832 sql_help.c:2845 +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2323 sql_help.c:2332 +#: sql_help.c:2878 sql_help.c:2894 sql_help.c:2907 msgid "column_constraint" msgstr "Spalten-Constraint" -#: sql_help.c:460 sql_help.c:604 sql_help.c:676 sql_help.c:1321 sql_help.c:4799 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4940 msgid "integer" msgstr "ganze_Zahl" -#: sql_help.c:462 sql_help.c:465 sql_help.c:678 sql_help.c:681 sql_help.c:1323 -#: sql_help.c:1326 +#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352 +#: sql_help.c:1355 msgid "attribute_option" msgstr "Attributoption" -#: sql_help.c:470 sql_help.c:1330 sql_help.c:2278 sql_help.c:2287 -#: sql_help.c:2817 sql_help.c:2833 sql_help.c:2846 +#: sql_help.c:476 sql_help.c:1359 sql_help.c:2324 sql_help.c:2333 +#: sql_help.c:2879 sql_help.c:2895 sql_help.c:2908 msgid "table_constraint" msgstr "Tabellen-Constraint" -#: sql_help.c:473 sql_help.c:474 sql_help.c:475 sql_help.c:476 sql_help.c:1335 -#: sql_help.c:1336 sql_help.c:1337 sql_help.c:1338 sql_help.c:1873 +#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364 +#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905 msgid "trigger_name" msgstr "Triggername" -#: sql_help.c:477 sql_help.c:478 sql_help.c:1348 sql_help.c:1349 -#: sql_help.c:2279 sql_help.c:2284 sql_help.c:2820 sql_help.c:2843 +#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 +#: sql_help.c:2325 sql_help.c:2330 sql_help.c:2882 sql_help.c:2905 msgid "parent_table" msgstr "Elterntabelle" -#: sql_help.c:536 sql_help.c:594 sql_help.c:663 sql_help.c:865 sql_help.c:1004 -#: sql_help.c:1518 sql_help.c:2216 +#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 +#: sql_help.c:1550 sql_help.c:2262 msgid "extension_name" msgstr "Erweiterungsname" -#: sql_help.c:538 sql_help.c:1006 sql_help.c:2335 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2382 msgid "execution_cost" msgstr "Ausführungskosten" -#: sql_help.c:539 sql_help.c:1007 sql_help.c:2336 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2383 msgid "result_rows" msgstr "Ergebniszeilen" -#: sql_help.c:540 sql_help.c:2337 +#: sql_help.c:547 sql_help.c:2384 msgid "support_function" msgstr "Support-Funktion" -#: sql_help.c:562 sql_help.c:564 sql_help.c:930 sql_help.c:938 sql_help.c:942 -#: sql_help.c:945 sql_help.c:948 sql_help.c:1601 sql_help.c:1609 -#: sql_help.c:1613 sql_help.c:1616 sql_help.c:1619 sql_help.c:2638 -#: sql_help.c:2640 sql_help.c:2643 sql_help.c:2644 sql_help.c:3798 -#: sql_help.c:3799 sql_help.c:3803 sql_help.c:3804 sql_help.c:3807 -#: sql_help.c:3808 sql_help.c:3810 sql_help.c:3811 sql_help.c:3813 -#: sql_help.c:3814 sql_help.c:3816 sql_help.c:3817 sql_help.c:3819 -#: sql_help.c:3820 sql_help.c:3826 sql_help.c:3827 sql_help.c:3829 -#: sql_help.c:3830 sql_help.c:3832 sql_help.c:3833 sql_help.c:3835 -#: sql_help.c:3836 sql_help.c:3838 sql_help.c:3839 sql_help.c:3841 -#: sql_help.c:3842 sql_help.c:3844 sql_help.c:3845 sql_help.c:4178 -#: sql_help.c:4179 sql_help.c:4183 sql_help.c:4184 sql_help.c:4187 -#: sql_help.c:4188 sql_help.c:4190 sql_help.c:4191 sql_help.c:4193 -#: sql_help.c:4194 sql_help.c:4196 sql_help.c:4197 sql_help.c:4199 -#: sql_help.c:4200 sql_help.c:4206 sql_help.c:4207 sql_help.c:4209 -#: sql_help.c:4210 sql_help.c:4212 sql_help.c:4213 sql_help.c:4215 -#: sql_help.c:4216 sql_help.c:4218 sql_help.c:4219 sql_help.c:4221 -#: sql_help.c:4222 sql_help.c:4224 sql_help.c:4225 +#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960 +#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641 +#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2696 +#: sql_help.c:2698 sql_help.c:2701 sql_help.c:2702 sql_help.c:3868 +#: sql_help.c:3869 sql_help.c:3873 sql_help.c:3874 sql_help.c:3877 +#: sql_help.c:3878 sql_help.c:3880 sql_help.c:3881 sql_help.c:3883 +#: sql_help.c:3884 sql_help.c:3886 sql_help.c:3887 sql_help.c:3889 +#: sql_help.c:3890 sql_help.c:3896 sql_help.c:3897 sql_help.c:3899 +#: sql_help.c:3900 sql_help.c:3902 sql_help.c:3903 sql_help.c:3905 +#: sql_help.c:3906 sql_help.c:3908 sql_help.c:3909 sql_help.c:3911 +#: sql_help.c:3912 sql_help.c:3914 sql_help.c:3915 sql_help.c:3917 +#: sql_help.c:3918 sql_help.c:4317 sql_help.c:4318 sql_help.c:4322 +#: sql_help.c:4323 sql_help.c:4326 sql_help.c:4327 sql_help.c:4329 +#: sql_help.c:4330 sql_help.c:4332 sql_help.c:4333 sql_help.c:4335 +#: sql_help.c:4336 sql_help.c:4338 sql_help.c:4339 sql_help.c:4345 +#: sql_help.c:4346 sql_help.c:4348 sql_help.c:4349 sql_help.c:4351 +#: sql_help.c:4352 sql_help.c:4354 sql_help.c:4355 sql_help.c:4357 +#: sql_help.c:4358 sql_help.c:4360 sql_help.c:4361 sql_help.c:4363 +#: sql_help.c:4364 sql_help.c:4366 sql_help.c:4367 msgid "role_specification" msgstr "Rollenangabe" -#: sql_help.c:563 sql_help.c:565 sql_help.c:1632 sql_help.c:2159 -#: sql_help.c:2646 sql_help.c:3167 sql_help.c:3618 sql_help.c:4544 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2199 +#: sql_help.c:2704 sql_help.c:3232 sql_help.c:3683 sql_help.c:4686 msgid "user_name" msgstr "Benutzername" -#: sql_help.c:566 sql_help.c:950 sql_help.c:1621 sql_help.c:2645 -#: sql_help.c:3846 sql_help.c:4226 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2703 +#: sql_help.c:3919 sql_help.c:4368 msgid "where role_specification can be:" msgstr "wobei Rollenangabe Folgendes sein kann:" -#: sql_help.c:568 +#: sql_help.c:575 msgid "group_name" msgstr "Gruppenname" -#: sql_help.c:590 sql_help.c:1396 sql_help.c:2165 sql_help.c:2407 -#: sql_help.c:2441 sql_help.c:2828 sql_help.c:2841 sql_help.c:2855 -#: sql_help.c:2896 sql_help.c:2920 sql_help.c:2932 sql_help.c:3837 -#: sql_help.c:4217 +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2209 sql_help.c:2455 +#: sql_help.c:2489 sql_help.c:2890 sql_help.c:2903 sql_help.c:2917 +#: sql_help.c:2958 sql_help.c:2985 sql_help.c:2997 sql_help.c:3910 +#: sql_help.c:4359 msgid "tablespace_name" msgstr "Tablespace-Name" -#: sql_help.c:592 sql_help.c:685 sql_help.c:1343 sql_help.c:1352 -#: sql_help.c:1391 sql_help.c:1748 sql_help.c:1751 +#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382 +#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783 msgid "index_name" msgstr "Indexname" -#: sql_help.c:596 -msgid "collation_name" -msgstr "Sortierfolgenname" - -#: sql_help.c:598 sql_help.c:601 sql_help.c:686 sql_help.c:688 sql_help.c:1345 -#: sql_help.c:1347 sql_help.c:1394 sql_help.c:2405 sql_help.c:2439 -#: sql_help.c:2826 sql_help.c:2839 sql_help.c:2853 sql_help.c:2894 -#: sql_help.c:2918 +#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375 +#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2453 sql_help.c:2487 +#: sql_help.c:2888 sql_help.c:2901 sql_help.c:2915 sql_help.c:2956 +#: sql_help.c:2983 msgid "storage_parameter" msgstr "Storage-Parameter" -#: sql_help.c:603 +#: sql_help.c:607 msgid "column_number" msgstr "Spaltennummer" -#: sql_help.c:627 sql_help.c:1836 sql_help.c:4309 +#: sql_help.c:631 sql_help.c:1868 sql_help.c:4451 msgid "large_object_oid" msgstr "Large-Object-OID" -#: sql_help.c:684 sql_help.c:1329 sql_help.c:1367 sql_help.c:2815 +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2876 msgid "compression_method" msgstr "Kompressionsmethode" -#: sql_help.c:717 sql_help.c:2462 +#: sql_help.c:692 sql_help.c:1373 +#, fuzzy +#| msgid "access_method_type" +msgid "new_access_method" +msgstr "Zugriffsmethodentyp" + +#: sql_help.c:725 sql_help.c:2510 msgid "res_proc" msgstr "Res-Funktion" -#: sql_help.c:718 sql_help.c:2463 +#: sql_help.c:726 sql_help.c:2511 msgid "join_proc" msgstr "Join-Funktion" -#: sql_help.c:770 sql_help.c:782 sql_help.c:2480 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2528 msgid "strategy_number" msgstr "Strategienummer" -#: sql_help.c:772 sql_help.c:773 sql_help.c:776 sql_help.c:777 sql_help.c:783 -#: sql_help.c:784 sql_help.c:786 sql_help.c:787 sql_help.c:2482 sql_help.c:2483 -#: sql_help.c:2486 sql_help.c:2487 +#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791 +#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2530 sql_help.c:2531 +#: sql_help.c:2534 sql_help.c:2535 msgid "op_type" msgstr "Optyp" -#: sql_help.c:774 sql_help.c:2484 +#: sql_help.c:782 sql_help.c:2532 msgid "sort_family_name" msgstr "Sortierfamilienname" -#: sql_help.c:775 sql_help.c:785 sql_help.c:2485 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2533 msgid "support_number" msgstr "Unterst-Nummer" -#: sql_help.c:779 sql_help.c:2102 sql_help.c:2489 sql_help.c:3009 -#: sql_help.c:3011 +#: sql_help.c:787 sql_help.c:2135 sql_help.c:2537 sql_help.c:3074 +#: sql_help.c:3076 msgid "argument_type" msgstr "Argumenttyp" -#: sql_help.c:810 sql_help.c:813 sql_help.c:884 sql_help.c:886 sql_help.c:888 -#: sql_help.c:1020 sql_help.c:1059 sql_help.c:1514 sql_help.c:1517 -#: sql_help.c:1693 sql_help.c:1747 sql_help.c:1750 sql_help.c:1821 -#: sql_help.c:1846 sql_help.c:1859 sql_help.c:1874 sql_help.c:1931 -#: sql_help.c:1937 sql_help.c:2271 sql_help.c:2283 sql_help.c:2396 -#: sql_help.c:2436 sql_help.c:2513 sql_help.c:2558 sql_help.c:2614 -#: sql_help.c:2666 sql_help.c:2699 sql_help.c:2706 sql_help.c:2811 -#: sql_help.c:2829 sql_help.c:2842 sql_help.c:2915 sql_help.c:3035 -#: sql_help.c:3216 sql_help.c:3439 sql_help.c:3488 sql_help.c:3594 -#: sql_help.c:3796 sql_help.c:3802 sql_help.c:3860 sql_help.c:3892 -#: sql_help.c:4176 sql_help.c:4182 sql_help.c:4297 sql_help.c:4406 -#: sql_help.c:4408 sql_help.c:4465 sql_help.c:4504 sql_help.c:4655 -#: sql_help.c:4657 sql_help.c:4714 sql_help.c:4748 sql_help.c:4801 -#: sql_help.c:4887 sql_help.c:4889 sql_help.c:4946 +#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079 +#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779 +#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891 +#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2317 +#: sql_help.c:2329 sql_help.c:2444 sql_help.c:2484 sql_help.c:2561 +#: sql_help.c:2615 sql_help.c:2672 sql_help.c:2724 sql_help.c:2757 +#: sql_help.c:2764 sql_help.c:2873 sql_help.c:2891 sql_help.c:2904 +#: sql_help.c:2980 sql_help.c:3100 sql_help.c:3281 sql_help.c:3504 +#: sql_help.c:3553 sql_help.c:3659 sql_help.c:3866 sql_help.c:3872 +#: sql_help.c:3933 sql_help.c:3965 sql_help.c:4315 sql_help.c:4321 +#: sql_help.c:4439 sql_help.c:4548 sql_help.c:4550 sql_help.c:4607 +#: sql_help.c:4646 sql_help.c:4797 sql_help.c:4799 sql_help.c:4856 +#: sql_help.c:4890 sql_help.c:4942 sql_help.c:5028 sql_help.c:5030 +#: sql_help.c:5087 msgid "table_name" msgstr "Tabellenname" -#: sql_help.c:815 sql_help.c:2515 +#: sql_help.c:823 sql_help.c:2563 msgid "using_expression" msgstr "Using-Ausdruck" -#: sql_help.c:816 sql_help.c:2516 +#: sql_help.c:824 sql_help.c:2564 msgid "check_expression" msgstr "Check-Ausdruck" -#: sql_help.c:890 sql_help.c:2559 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2611 +#, fuzzy +#| msgid "publication_option" +msgid "publication_object" +msgstr "Publikationsoption" + +#: sql_help.c:903 sql_help.c:2612 msgid "publication_parameter" msgstr "Publikationsparameter" -#: sql_help.c:934 sql_help.c:1605 sql_help.c:2375 sql_help.c:2591 -#: sql_help.c:3150 +#: sql_help.c:909 sql_help.c:2614 +#, fuzzy +#| msgid "where action is one of:" +msgid "where publication_object is one of:" +msgstr "wobei Aktion Folgendes sein kann:" + +#: sql_help.c:952 sql_help.c:1637 sql_help.c:2422 sql_help.c:2649 +#: sql_help.c:3215 msgid "password" msgstr "Passwort" -#: sql_help.c:935 sql_help.c:1606 sql_help.c:2376 sql_help.c:2592 -#: sql_help.c:3151 +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2423 sql_help.c:2650 +#: sql_help.c:3216 msgid "timestamp" msgstr "Zeit" -#: sql_help.c:939 sql_help.c:943 sql_help.c:946 sql_help.c:949 sql_help.c:1610 -#: sql_help.c:1614 sql_help.c:1617 sql_help.c:1620 sql_help.c:3809 -#: sql_help.c:4189 +#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642 +#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3879 +#: sql_help.c:4328 msgid "database_name" msgstr "Datenbankname" -#: sql_help.c:1053 sql_help.c:2661 +#: sql_help.c:1073 sql_help.c:2719 msgid "increment" msgstr "Inkrement" -#: sql_help.c:1054 sql_help.c:2662 +#: sql_help.c:1074 sql_help.c:2720 msgid "minvalue" msgstr "Minwert" -#: sql_help.c:1055 sql_help.c:2663 +#: sql_help.c:1075 sql_help.c:2721 msgid "maxvalue" msgstr "Maxwert" -#: sql_help.c:1056 sql_help.c:2664 sql_help.c:4404 sql_help.c:4502 -#: sql_help.c:4653 sql_help.c:4818 sql_help.c:4885 +#: sql_help.c:1076 sql_help.c:2722 sql_help.c:4546 sql_help.c:4644 +#: sql_help.c:4795 sql_help.c:4959 sql_help.c:5026 msgid "start" msgstr "Start" -#: sql_help.c:1057 sql_help.c:1318 +#: sql_help.c:1077 sql_help.c:1347 msgid "restart" msgstr "Restart" -#: sql_help.c:1058 sql_help.c:2665 +#: sql_help.c:1078 sql_help.c:2723 msgid "cache" msgstr "Cache" -#: sql_help.c:1102 +#: sql_help.c:1123 msgid "new_target" msgstr "neues_Ziel" -#: sql_help.c:1120 sql_help.c:2718 +#: sql_help.c:1142 sql_help.c:2776 msgid "conninfo" msgstr "Verbindungsinfo" -#: sql_help.c:1122 sql_help.c:1126 sql_help.c:1130 sql_help.c:2719 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2777 msgid "publication_name" msgstr "Publikationsname" -#: sql_help.c:1123 sql_help.c:1127 sql_help.c:1131 -msgid "set_publication_option" -msgstr "SET-Publikationsoption" +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +msgid "publication_option" +msgstr "Publikationsoption" -#: sql_help.c:1134 +#: sql_help.c:1156 msgid "refresh_option" msgstr "Refresh-Option" -#: sql_help.c:1139 sql_help.c:2720 +#: sql_help.c:1161 sql_help.c:2778 msgid "subscription_parameter" msgstr "Subskriptionsparameter" -#: sql_help.c:1295 sql_help.c:1298 +#: sql_help.c:1164 +#, fuzzy +#| msgid "like_option" +msgid "skip_option" +msgstr "Like-Option" + +#: sql_help.c:1324 sql_help.c:1327 msgid "partition_name" msgstr "Partitionsname" -#: sql_help.c:1296 sql_help.c:2288 sql_help.c:2847 +#: sql_help.c:1325 sql_help.c:2334 sql_help.c:2909 msgid "partition_bound_spec" msgstr "Partitionsbegrenzungsangabe" -#: sql_help.c:1315 sql_help.c:1364 sql_help.c:2861 +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2923 msgid "sequence_options" msgstr "Sequenzoptionen" -#: sql_help.c:1317 +#: sql_help.c:1346 msgid "sequence_option" msgstr "Sequenzoption" -#: sql_help.c:1331 +#: sql_help.c:1360 msgid "table_constraint_using_index" msgstr "Tabellen-Constraint-für-Index" -#: sql_help.c:1339 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 +#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 msgid "rewrite_rule_name" msgstr "Regelname" -#: sql_help.c:1353 sql_help.c:2886 +#: sql_help.c:1383 sql_help.c:2948 msgid "and partition_bound_spec is:" msgstr "und Partitionsbegrenzungsangabe Folgendes ist:" -#: sql_help.c:1354 sql_help.c:1355 sql_help.c:1356 sql_help.c:2887 -#: sql_help.c:2888 sql_help.c:2889 +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2949 +#: sql_help.c:2950 sql_help.c:2951 msgid "partition_bound_expr" msgstr "Partitionsbegrenzungsausdruck" -#: sql_help.c:1357 sql_help.c:1358 sql_help.c:2890 sql_help.c:2891 +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2952 sql_help.c:2953 msgid "numeric_literal" msgstr "numerische_Konstante" -#: sql_help.c:1359 +#: sql_help.c:1389 msgid "and column_constraint is:" msgstr "und Spalten-Constraint Folgendes ist:" -#: sql_help.c:1362 sql_help.c:2295 sql_help.c:2329 sql_help.c:2537 -#: sql_help.c:2859 +#: sql_help.c:1392 sql_help.c:2341 sql_help.c:2376 sql_help.c:2585 +#: sql_help.c:2921 msgid "default_expr" msgstr "Vorgabeausdruck" -#: sql_help.c:1363 sql_help.c:2296 sql_help.c:2860 +#: sql_help.c:1393 sql_help.c:2342 sql_help.c:2922 msgid "generation_expr" msgstr "Generierungsausdruck" -#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1376 sql_help.c:1378 -#: sql_help.c:1382 sql_help.c:2862 sql_help.c:2863 sql_help.c:2872 -#: sql_help.c:2874 sql_help.c:2878 +#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 +#: sql_help.c:1411 sql_help.c:2924 sql_help.c:2925 sql_help.c:2934 +#: sql_help.c:2936 sql_help.c:2940 msgid "index_parameters" msgstr "Indexparameter" -#: sql_help.c:1368 sql_help.c:1385 sql_help.c:2864 sql_help.c:2881 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2926 sql_help.c:2943 msgid "reftable" msgstr "Reftabelle" -#: sql_help.c:1369 sql_help.c:1386 sql_help.c:2865 sql_help.c:2882 +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2927 sql_help.c:2944 msgid "refcolumn" msgstr "Refspalte" -#: sql_help.c:1370 sql_help.c:1371 sql_help.c:1387 sql_help.c:1388 -#: sql_help.c:2866 sql_help.c:2867 sql_help.c:2883 sql_help.c:2884 +#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 +#: sql_help.c:2928 sql_help.c:2929 sql_help.c:2945 sql_help.c:2946 msgid "referential_action" msgstr "Fremdschlüsselaktion" -#: sql_help.c:1372 sql_help.c:2297 sql_help.c:2868 +#: sql_help.c:1401 sql_help.c:2343 sql_help.c:2930 msgid "and table_constraint is:" msgstr "und Tabellen-Constraint Folgendes ist:" -#: sql_help.c:1380 sql_help.c:2876 +#: sql_help.c:1409 sql_help.c:2938 msgid "exclude_element" msgstr "Exclude-Element" -#: sql_help.c:1381 sql_help.c:2877 sql_help.c:4402 sql_help.c:4500 -#: sql_help.c:4651 sql_help.c:4816 sql_help.c:4883 +#: sql_help.c:1410 sql_help.c:2939 sql_help.c:4544 sql_help.c:4642 +#: sql_help.c:4793 sql_help.c:4957 sql_help.c:5024 msgid "operator" msgstr "Operator" -#: sql_help.c:1383 sql_help.c:2408 sql_help.c:2879 +#: sql_help.c:1412 sql_help.c:2456 sql_help.c:2941 msgid "predicate" msgstr "Prädikat" -#: sql_help.c:1389 +#: sql_help.c:1418 msgid "and table_constraint_using_index is:" msgstr "und Tabellen-Constraint-für-Index Folgendes ist:" -#: sql_help.c:1392 sql_help.c:2892 +#: sql_help.c:1421 sql_help.c:2954 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "Indexparameter bei UNIQUE-, PRIMARY KEY- und EXCLUDE-Constraints sind:" -#: sql_help.c:1397 sql_help.c:2897 +#: sql_help.c:1426 sql_help.c:2959 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "Exclude-Element in einem EXCLUDE-Constraint ist:" -#: sql_help.c:1400 sql_help.c:2401 sql_help.c:2824 sql_help.c:2837 -#: sql_help.c:2851 sql_help.c:2900 sql_help.c:3905 +#: sql_help.c:1429 sql_help.c:2449 sql_help.c:2886 sql_help.c:2899 +#: sql_help.c:2913 sql_help.c:2962 sql_help.c:3978 msgid "opclass" msgstr "Opklasse" -#: sql_help.c:1416 sql_help.c:1419 sql_help.c:2935 +#: sql_help.c:1430 sql_help.c:2963 +msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" +msgstr "" + +#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3000 msgid "tablespace_option" msgstr "Tablespace-Option" -#: sql_help.c:1440 sql_help.c:1443 sql_help.c:1449 sql_help.c:1453 +#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 msgid "token_type" msgstr "Tokentyp" -#: sql_help.c:1441 sql_help.c:1444 +#: sql_help.c:1473 sql_help.c:1476 msgid "dictionary_name" msgstr "Wörterbuchname" -#: sql_help.c:1446 sql_help.c:1450 +#: sql_help.c:1478 sql_help.c:1482 msgid "old_dictionary" msgstr "altes_Wörterbuch" -#: sql_help.c:1447 sql_help.c:1451 +#: sql_help.c:1479 sql_help.c:1483 msgid "new_dictionary" msgstr "neues_Wörterbuch" -#: sql_help.c:1546 sql_help.c:1560 sql_help.c:1563 sql_help.c:1564 -#: sql_help.c:3088 +#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 +#: sql_help.c:3153 msgid "attribute_name" msgstr "Attributname" -#: sql_help.c:1547 +#: sql_help.c:1579 msgid "new_attribute_name" msgstr "neuer_Attributname" -#: sql_help.c:1551 sql_help.c:1555 +#: sql_help.c:1583 sql_help.c:1587 msgid "new_enum_value" msgstr "neuer_Enum-Wert" -#: sql_help.c:1552 +#: sql_help.c:1584 msgid "neighbor_enum_value" msgstr "Nachbar-Enum-Wert" -#: sql_help.c:1554 +#: sql_help.c:1586 msgid "existing_enum_value" msgstr "existierender_Enum-Wert" -#: sql_help.c:1557 +#: sql_help.c:1589 msgid "property" msgstr "Eigenschaft" -#: sql_help.c:1633 sql_help.c:2280 sql_help.c:2289 sql_help.c:2677 -#: sql_help.c:3168 sql_help.c:3619 sql_help.c:3818 sql_help.c:3861 -#: sql_help.c:4198 +#: sql_help.c:1665 sql_help.c:2326 sql_help.c:2335 sql_help.c:2735 +#: sql_help.c:3233 sql_help.c:3684 sql_help.c:3888 sql_help.c:3934 +#: sql_help.c:4337 msgid "server_name" msgstr "Servername" -#: sql_help.c:1665 sql_help.c:1668 sql_help.c:3183 +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3248 msgid "view_option_name" msgstr "Sichtoptionsname" -#: sql_help.c:1666 sql_help.c:3184 +#: sql_help.c:1698 sql_help.c:3249 msgid "view_option_value" msgstr "Sichtoptionswert" -#: sql_help.c:1687 sql_help.c:1688 sql_help.c:4787 sql_help.c:4788 +#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4929 sql_help.c:4930 msgid "table_and_columns" msgstr "Tabelle-und-Spalten" -#: sql_help.c:1689 sql_help.c:1752 sql_help.c:1943 sql_help.c:3667 -#: sql_help.c:4040 sql_help.c:4789 +#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3732 +#: sql_help.c:4172 sql_help.c:4931 msgid "where option can be one of:" msgstr "wobei Option eine der folgenden sein kann:" -#: sql_help.c:1690 sql_help.c:1691 sql_help.c:1753 sql_help.c:1945 -#: sql_help.c:1948 sql_help.c:2126 sql_help.c:3668 sql_help.c:3669 -#: sql_help.c:3670 sql_help.c:3671 sql_help.c:3672 sql_help.c:3673 -#: sql_help.c:3674 sql_help.c:3675 sql_help.c:4041 sql_help.c:4043 -#: sql_help.c:4790 sql_help.c:4791 sql_help.c:4792 sql_help.c:4793 -#: sql_help.c:4794 sql_help.c:4795 sql_help.c:4796 sql_help.c:4797 -#: sql_help.c:4798 +#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 +#: sql_help.c:1980 sql_help.c:2160 sql_help.c:3733 sql_help.c:3734 +#: sql_help.c:3735 sql_help.c:3736 sql_help.c:3737 sql_help.c:3738 +#: sql_help.c:3739 sql_help.c:3740 sql_help.c:4173 sql_help.c:4175 +#: sql_help.c:4932 sql_help.c:4933 sql_help.c:4934 sql_help.c:4935 +#: sql_help.c:4936 sql_help.c:4937 sql_help.c:4938 sql_help.c:4939 msgid "boolean" msgstr "boolean" -#: sql_help.c:1692 sql_help.c:4800 +#: sql_help.c:1724 sql_help.c:4941 msgid "and table_and_columns is:" msgstr "und Tabelle-und-Spalten Folgendes ist:" -#: sql_help.c:1708 sql_help.c:4560 sql_help.c:4562 sql_help.c:4586 +#: sql_help.c:1740 sql_help.c:4702 sql_help.c:4704 sql_help.c:4728 msgid "transaction_mode" msgstr "Transaktionsmodus" -#: sql_help.c:1709 sql_help.c:4563 sql_help.c:4587 +#: sql_help.c:1741 sql_help.c:4705 sql_help.c:4729 msgid "where transaction_mode is one of:" msgstr "wobei Transaktionsmodus Folgendes sein kann:" -#: sql_help.c:1718 sql_help.c:4412 sql_help.c:4421 sql_help.c:4425 -#: sql_help.c:4429 sql_help.c:4432 sql_help.c:4661 sql_help.c:4670 -#: sql_help.c:4674 sql_help.c:4678 sql_help.c:4681 sql_help.c:4893 -#: sql_help.c:4902 sql_help.c:4906 sql_help.c:4910 sql_help.c:4913 +#: sql_help.c:1750 sql_help.c:4554 sql_help.c:4563 sql_help.c:4567 +#: sql_help.c:4571 sql_help.c:4574 sql_help.c:4803 sql_help.c:4812 +#: sql_help.c:4816 sql_help.c:4820 sql_help.c:4823 sql_help.c:5034 +#: sql_help.c:5043 sql_help.c:5047 sql_help.c:5051 sql_help.c:5054 msgid "argument" msgstr "Argument" -#: sql_help.c:1818 +#: sql_help.c:1850 msgid "relation_name" msgstr "Relationsname" -#: sql_help.c:1823 sql_help.c:3812 sql_help.c:4192 +#: sql_help.c:1855 sql_help.c:3882 sql_help.c:4331 msgid "domain_name" msgstr "Domänenname" -#: sql_help.c:1845 +#: sql_help.c:1877 msgid "policy_name" msgstr "Policy-Name" -#: sql_help.c:1858 +#: sql_help.c:1890 msgid "rule_name" msgstr "Regelname" -#: sql_help.c:1877 +#: sql_help.c:1909 msgid "text" msgstr "Text" -#: sql_help.c:1902 sql_help.c:4005 sql_help.c:4242 +#: sql_help.c:1934 sql_help.c:4137 sql_help.c:4384 msgid "transaction_id" msgstr "Transaktions-ID" -#: sql_help.c:1933 sql_help.c:1940 sql_help.c:3931 +#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4004 msgid "filename" msgstr "Dateiname" -#: sql_help.c:1934 sql_help.c:1941 sql_help.c:2616 sql_help.c:2617 -#: sql_help.c:2618 +#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2674 sql_help.c:2675 +#: sql_help.c:2676 msgid "command" msgstr "Befehl" -#: sql_help.c:1936 sql_help.c:2615 sql_help.c:3038 sql_help.c:3219 -#: sql_help.c:3915 sql_help.c:4395 sql_help.c:4397 sql_help.c:4493 -#: sql_help.c:4495 sql_help.c:4644 sql_help.c:4646 sql_help.c:4757 -#: sql_help.c:4876 sql_help.c:4878 +#: sql_help.c:1968 sql_help.c:2673 sql_help.c:3103 sql_help.c:3284 +#: sql_help.c:3988 sql_help.c:4065 sql_help.c:4068 sql_help.c:4537 +#: sql_help.c:4539 sql_help.c:4635 sql_help.c:4637 sql_help.c:4786 +#: sql_help.c:4788 sql_help.c:4899 sql_help.c:5017 sql_help.c:5019 msgid "condition" msgstr "Bedingung" -#: sql_help.c:1939 sql_help.c:2442 sql_help.c:2921 sql_help.c:3185 -#: sql_help.c:3203 sql_help.c:3896 +#: sql_help.c:1971 sql_help.c:2490 sql_help.c:2986 sql_help.c:3250 +#: sql_help.c:3268 sql_help.c:3969 msgid "query" msgstr "Anfrage" -#: sql_help.c:1944 +#: sql_help.c:1976 msgid "format_name" msgstr "Formatname" -#: sql_help.c:1946 +#: sql_help.c:1978 msgid "delimiter_character" msgstr "Trennzeichen" -#: sql_help.c:1947 +#: sql_help.c:1979 msgid "null_string" msgstr "Null-Zeichenkette" -#: sql_help.c:1949 +#: sql_help.c:1981 +msgid "match" +msgstr "" + +#: sql_help.c:1982 msgid "quote_character" msgstr "Quote-Zeichen" -#: sql_help.c:1950 +#: sql_help.c:1983 msgid "escape_character" msgstr "Escape-Zeichen" -#: sql_help.c:1954 +#: sql_help.c:1987 msgid "encoding_name" msgstr "Kodierungsname" -#: sql_help.c:1965 +#: sql_help.c:1998 msgid "access_method_type" msgstr "Zugriffsmethodentyp" -#: sql_help.c:2036 sql_help.c:2055 sql_help.c:2058 +#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2091 msgid "arg_data_type" msgstr "Arg-Datentyp" -#: sql_help.c:2037 sql_help.c:2059 sql_help.c:2067 +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 msgid "sfunc" msgstr "Übergangsfunktion" -#: sql_help.c:2038 sql_help.c:2060 sql_help.c:2068 +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 msgid "state_data_type" msgstr "Zustandsdatentyp" -#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069 +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 msgid "state_data_size" msgstr "Zustandsdatengröße" -#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070 +#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103 msgid "ffunc" msgstr "Abschlussfunktion" -#: sql_help.c:2041 sql_help.c:2071 +#: sql_help.c:2074 sql_help.c:2104 msgid "combinefunc" msgstr "Combine-Funktion" -#: sql_help.c:2042 sql_help.c:2072 +#: sql_help.c:2075 sql_help.c:2105 msgid "serialfunc" msgstr "Serialisierungsfunktion" -#: sql_help.c:2043 sql_help.c:2073 +#: sql_help.c:2076 sql_help.c:2106 msgid "deserialfunc" msgstr "Deserialisierungsfunktion" -#: sql_help.c:2044 sql_help.c:2063 sql_help.c:2074 +#: sql_help.c:2077 sql_help.c:2096 sql_help.c:2107 msgid "initial_condition" msgstr "Anfangswert" -#: sql_help.c:2045 sql_help.c:2075 +#: sql_help.c:2078 sql_help.c:2108 msgid "msfunc" msgstr "Moving-Übergangsfunktion" -#: sql_help.c:2046 sql_help.c:2076 +#: sql_help.c:2079 sql_help.c:2109 msgid "minvfunc" msgstr "Moving-Inversfunktion" -#: sql_help.c:2047 sql_help.c:2077 +#: sql_help.c:2080 sql_help.c:2110 msgid "mstate_data_type" msgstr "Moving-Zustandsdatentyp" -#: sql_help.c:2048 sql_help.c:2078 +#: sql_help.c:2081 sql_help.c:2111 msgid "mstate_data_size" msgstr "Moving-Zustandsdatengröße" -#: sql_help.c:2049 sql_help.c:2079 +#: sql_help.c:2082 sql_help.c:2112 msgid "mffunc" msgstr "Moving-Abschlussfunktion" -#: sql_help.c:2050 sql_help.c:2080 +#: sql_help.c:2083 sql_help.c:2113 msgid "minitial_condition" msgstr "Moving-Anfangswert" -#: sql_help.c:2051 sql_help.c:2081 +#: sql_help.c:2084 sql_help.c:2114 msgid "sort_operator" msgstr "Sortieroperator" -#: sql_help.c:2064 +#: sql_help.c:2097 msgid "or the old syntax" msgstr "oder die alte Syntax" -#: sql_help.c:2066 +#: sql_help.c:2099 msgid "base_type" msgstr "Basistyp" -#: sql_help.c:2122 sql_help.c:2162 +#: sql_help.c:2156 sql_help.c:2203 msgid "locale" msgstr "Locale" -#: sql_help.c:2123 sql_help.c:2163 +#: sql_help.c:2157 sql_help.c:2204 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2124 sql_help.c:2164 +#: sql_help.c:2158 sql_help.c:2205 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2125 sql_help.c:4295 +#: sql_help.c:2159 sql_help.c:4437 msgid "provider" msgstr "Provider" -#: sql_help.c:2128 +#: sql_help.c:2161 sql_help.c:2264 +msgid "version" +msgstr "Version" + +#: sql_help.c:2163 msgid "existing_collation" msgstr "existierende_Sortierfolge" -#: sql_help.c:2138 +#: sql_help.c:2173 msgid "source_encoding" msgstr "Quellkodierung" -#: sql_help.c:2139 +#: sql_help.c:2174 msgid "dest_encoding" msgstr "Zielkodierung" -#: sql_help.c:2160 sql_help.c:2961 +#: sql_help.c:2200 sql_help.c:3026 msgid "template" msgstr "Vorlage" -#: sql_help.c:2161 +#: sql_help.c:2201 msgid "encoding" msgstr "Kodierung" -#: sql_help.c:2188 +#: sql_help.c:2202 +msgid "strategy" +msgstr "Strategie" + +#: sql_help.c:2206 +#, fuzzy +#| msgid "locale" +msgid "icu_locale" +msgstr "Locale" + +#: sql_help.c:2207 +#, fuzzy +#| msgid "provider" +msgid "locale_provider" +msgstr "Provider" + +#: sql_help.c:2208 +#, fuzzy +#| msgid "collation" +msgid "collation_version" +msgstr "Sortierfolge" + +#: sql_help.c:2213 +#, fuzzy +#| msgid "loid" +msgid "oid" +msgstr "Large-Object-OID" + +#: sql_help.c:2233 msgid "constraint" msgstr "Constraint" -#: sql_help.c:2189 +#: sql_help.c:2234 msgid "where constraint is:" msgstr "wobei Constraint Folgendes ist:" -#: sql_help.c:2203 sql_help.c:2613 sql_help.c:3034 +#: sql_help.c:2248 sql_help.c:2671 sql_help.c:3099 msgid "event" msgstr "Ereignis" -#: sql_help.c:2204 +#: sql_help.c:2249 msgid "filter_variable" msgstr "Filtervariable" -#: sql_help.c:2218 -msgid "version" -msgstr "Version" +#: sql_help.c:2250 +msgid "filter_value" +msgstr "Filterwert" -#: sql_help.c:2292 sql_help.c:2856 +#: sql_help.c:2338 sql_help.c:2918 msgid "where column_constraint is:" msgstr "wobei Spalten-Constraint Folgendes ist:" -#: sql_help.c:2330 +#: sql_help.c:2377 msgid "rettype" msgstr "Rückgabetyp" -#: sql_help.c:2332 +#: sql_help.c:2379 msgid "column_type" msgstr "Spaltentyp" -#: sql_help.c:2341 sql_help.c:2543 +#: sql_help.c:2388 sql_help.c:2591 msgid "definition" msgstr "Definition" -#: sql_help.c:2342 sql_help.c:2544 +#: sql_help.c:2389 sql_help.c:2592 msgid "obj_file" msgstr "Objektdatei" -#: sql_help.c:2343 sql_help.c:2545 +#: sql_help.c:2390 sql_help.c:2593 msgid "link_symbol" msgstr "Linksymbol" -#: sql_help.c:2344 sql_help.c:2546 +#: sql_help.c:2391 sql_help.c:2594 msgid "sql_body" msgstr "SQL-Rumpf" -#: sql_help.c:2382 sql_help.c:2598 sql_help.c:3157 +#: sql_help.c:2429 sql_help.c:2656 sql_help.c:3222 msgid "uid" msgstr "Uid" -#: sql_help.c:2397 sql_help.c:2438 sql_help.c:2825 sql_help.c:2838 -#: sql_help.c:2852 sql_help.c:2917 +#: sql_help.c:2445 sql_help.c:2486 sql_help.c:2887 sql_help.c:2900 +#: sql_help.c:2914 sql_help.c:2982 msgid "method" msgstr "Methode" -#: sql_help.c:2402 +#: sql_help.c:2450 msgid "opclass_parameter" msgstr "Opklassen-Parameter" -#: sql_help.c:2419 +#: sql_help.c:2467 msgid "call_handler" msgstr "Handler" -#: sql_help.c:2420 +#: sql_help.c:2468 msgid "inline_handler" msgstr "Inline-Handler" -#: sql_help.c:2421 +#: sql_help.c:2469 msgid "valfunction" msgstr "Valfunktion" -#: sql_help.c:2460 +#: sql_help.c:2508 msgid "com_op" msgstr "Kommutator-Op" -#: sql_help.c:2461 +#: sql_help.c:2509 msgid "neg_op" msgstr "Umkehrungs-Op" -#: sql_help.c:2479 +#: sql_help.c:2527 msgid "family_name" msgstr "Familienname" -#: sql_help.c:2490 +#: sql_help.c:2538 msgid "storage_type" msgstr "Storage-Typ" -#: sql_help.c:2619 sql_help.c:3041 +#: sql_help.c:2677 sql_help.c:3106 msgid "where event can be one of:" msgstr "wobei Ereignis eins der folgenden sein kann:" -#: sql_help.c:2639 sql_help.c:2641 +#: sql_help.c:2697 sql_help.c:2699 msgid "schema_element" msgstr "Schemaelement" -#: sql_help.c:2678 +#: sql_help.c:2736 msgid "server_type" msgstr "Servertyp" -#: sql_help.c:2679 +#: sql_help.c:2737 msgid "server_version" msgstr "Serverversion" -#: sql_help.c:2680 sql_help.c:3815 sql_help.c:4195 +#: sql_help.c:2738 sql_help.c:3885 sql_help.c:4334 msgid "fdw_name" msgstr "FDW-Name" -#: sql_help.c:2697 sql_help.c:2700 +#: sql_help.c:2755 sql_help.c:2758 msgid "statistics_name" msgstr "Statistikname" -#: sql_help.c:2701 +#: sql_help.c:2759 msgid "statistics_kind" msgstr "Statistikart" -#: sql_help.c:2717 +#: sql_help.c:2775 msgid "subscription_name" msgstr "Subskriptionsname" -#: sql_help.c:2818 +#: sql_help.c:2880 msgid "source_table" msgstr "Quelltabelle" -#: sql_help.c:2819 +#: sql_help.c:2881 msgid "like_option" msgstr "Like-Option" -#: sql_help.c:2885 +#: sql_help.c:2947 msgid "and like_option is:" msgstr "und Like-Option Folgendes ist:" -#: sql_help.c:2934 +#: sql_help.c:2999 msgid "directory" msgstr "Verzeichnis" -#: sql_help.c:2948 +#: sql_help.c:3013 msgid "parser_name" msgstr "Parser-Name" -#: sql_help.c:2949 +#: sql_help.c:3014 msgid "source_config" msgstr "Quellkonfig" -#: sql_help.c:2978 +#: sql_help.c:3043 msgid "start_function" msgstr "Startfunktion" -#: sql_help.c:2979 +#: sql_help.c:3044 msgid "gettoken_function" msgstr "Gettext-Funktion" -#: sql_help.c:2980 +#: sql_help.c:3045 msgid "end_function" msgstr "Endfunktion" -#: sql_help.c:2981 +#: sql_help.c:3046 msgid "lextypes_function" msgstr "Lextypenfunktion" -#: sql_help.c:2982 +#: sql_help.c:3047 msgid "headline_function" msgstr "Headline-Funktion" -#: sql_help.c:2994 +#: sql_help.c:3059 msgid "init_function" msgstr "Init-Funktion" -#: sql_help.c:2995 +#: sql_help.c:3060 msgid "lexize_function" msgstr "Lexize-Funktion" -#: sql_help.c:3008 +#: sql_help.c:3073 msgid "from_sql_function_name" msgstr "From-SQL-Funktionsname" -#: sql_help.c:3010 +#: sql_help.c:3075 msgid "to_sql_function_name" msgstr "To-SQL-Funktionsname" -#: sql_help.c:3036 +#: sql_help.c:3101 msgid "referenced_table_name" msgstr "verwiesener_Tabellenname" -#: sql_help.c:3037 +#: sql_help.c:3102 msgid "transition_relation_name" msgstr "Übergangsrelationsname" -#: sql_help.c:3040 +#: sql_help.c:3105 msgid "arguments" msgstr "Argumente" -#: sql_help.c:3092 sql_help.c:4328 +#: sql_help.c:3157 sql_help.c:4470 msgid "label" msgstr "Label" -#: sql_help.c:3094 +#: sql_help.c:3159 msgid "subtype" msgstr "Untertyp" -#: sql_help.c:3095 +#: sql_help.c:3160 msgid "subtype_operator_class" msgstr "Untertyp-Operatorklasse" -#: sql_help.c:3097 +#: sql_help.c:3162 msgid "canonical_function" msgstr "Canonical-Funktion" -#: sql_help.c:3098 +#: sql_help.c:3163 msgid "subtype_diff_function" msgstr "Untertyp-Diff-Funktion" -#: sql_help.c:3099 +#: sql_help.c:3164 msgid "multirange_type_name" msgstr "Multirange-Typname" -#: sql_help.c:3101 +#: sql_help.c:3166 msgid "input_function" msgstr "Eingabefunktion" -#: sql_help.c:3102 +#: sql_help.c:3167 msgid "output_function" msgstr "Ausgabefunktion" -#: sql_help.c:3103 +#: sql_help.c:3168 msgid "receive_function" msgstr "Empfangsfunktion" -#: sql_help.c:3104 +#: sql_help.c:3169 msgid "send_function" msgstr "Sendefunktion" -#: sql_help.c:3105 +#: sql_help.c:3170 msgid "type_modifier_input_function" msgstr "Typmod-Eingabefunktion" -#: sql_help.c:3106 +#: sql_help.c:3171 msgid "type_modifier_output_function" msgstr "Typmod-Ausgabefunktion" -#: sql_help.c:3107 +#: sql_help.c:3172 msgid "analyze_function" msgstr "Analyze-Funktion" -#: sql_help.c:3108 +#: sql_help.c:3173 msgid "subscript_function" msgstr "Subscript-Funktion" -#: sql_help.c:3109 +#: sql_help.c:3174 msgid "internallength" msgstr "interne_Länge" -#: sql_help.c:3110 +#: sql_help.c:3175 msgid "alignment" msgstr "Ausrichtung" -#: sql_help.c:3111 +#: sql_help.c:3176 msgid "storage" msgstr "Speicherung" -#: sql_help.c:3112 +#: sql_help.c:3177 msgid "like_type" msgstr "wie_Typ" -#: sql_help.c:3113 +#: sql_help.c:3178 msgid "category" msgstr "Kategorie" -#: sql_help.c:3114 +#: sql_help.c:3179 msgid "preferred" msgstr "bevorzugt" -#: sql_help.c:3115 +#: sql_help.c:3180 msgid "default" msgstr "Vorgabewert" -#: sql_help.c:3116 +#: sql_help.c:3181 msgid "element" msgstr "Element" -#: sql_help.c:3117 +#: sql_help.c:3182 msgid "delimiter" msgstr "Trennzeichen" -#: sql_help.c:3118 +#: sql_help.c:3183 msgid "collatable" msgstr "sortierbar" -#: sql_help.c:3215 sql_help.c:3891 sql_help.c:4390 sql_help.c:4487 -#: sql_help.c:4639 sql_help.c:4747 sql_help.c:4871 +#: sql_help.c:3280 sql_help.c:3964 sql_help.c:4054 sql_help.c:4532 +#: sql_help.c:4629 sql_help.c:4781 sql_help.c:4889 sql_help.c:5012 msgid "with_query" msgstr "With-Anfrage" -#: sql_help.c:3217 sql_help.c:3893 sql_help.c:4409 sql_help.c:4415 -#: sql_help.c:4418 sql_help.c:4422 sql_help.c:4426 sql_help.c:4434 -#: sql_help.c:4658 sql_help.c:4664 sql_help.c:4667 sql_help.c:4671 -#: sql_help.c:4675 sql_help.c:4683 sql_help.c:4749 sql_help.c:4890 -#: sql_help.c:4896 sql_help.c:4899 sql_help.c:4903 sql_help.c:4907 -#: sql_help.c:4915 +#: sql_help.c:3282 sql_help.c:3966 sql_help.c:4551 sql_help.c:4557 +#: sql_help.c:4560 sql_help.c:4564 sql_help.c:4568 sql_help.c:4576 +#: sql_help.c:4800 sql_help.c:4806 sql_help.c:4809 sql_help.c:4813 +#: sql_help.c:4817 sql_help.c:4825 sql_help.c:4891 sql_help.c:5031 +#: sql_help.c:5037 sql_help.c:5040 sql_help.c:5044 sql_help.c:5048 +#: sql_help.c:5056 msgid "alias" msgstr "Alias" -#: sql_help.c:3218 sql_help.c:4394 sql_help.c:4436 sql_help.c:4438 -#: sql_help.c:4492 sql_help.c:4643 sql_help.c:4685 sql_help.c:4687 -#: sql_help.c:4756 sql_help.c:4875 sql_help.c:4917 sql_help.c:4919 +#: sql_help.c:3283 sql_help.c:4536 sql_help.c:4578 sql_help.c:4580 +#: sql_help.c:4634 sql_help.c:4785 sql_help.c:4827 sql_help.c:4829 +#: sql_help.c:4898 sql_help.c:5016 sql_help.c:5058 sql_help.c:5060 msgid "from_item" msgstr "From-Element" -#: sql_help.c:3220 sql_help.c:3701 sql_help.c:3972 sql_help.c:4758 +#: sql_help.c:3285 sql_help.c:3766 sql_help.c:4104 sql_help.c:4900 msgid "cursor_name" msgstr "Cursor-Name" -#: sql_help.c:3221 sql_help.c:3899 sql_help.c:4759 +#: sql_help.c:3286 sql_help.c:3972 sql_help.c:4901 msgid "output_expression" msgstr "Ausgabeausdruck" -#: sql_help.c:3222 sql_help.c:3900 sql_help.c:4393 sql_help.c:4490 -#: sql_help.c:4642 sql_help.c:4760 sql_help.c:4874 +#: sql_help.c:3287 sql_help.c:3973 sql_help.c:4535 sql_help.c:4632 +#: sql_help.c:4784 sql_help.c:4902 sql_help.c:5015 msgid "output_name" msgstr "Ausgabename" -#: sql_help.c:3238 +#: sql_help.c:3303 msgid "code" msgstr "Code" -#: sql_help.c:3643 +#: sql_help.c:3708 msgid "parameter" msgstr "Parameter" -#: sql_help.c:3665 sql_help.c:3666 sql_help.c:3997 +#: sql_help.c:3730 sql_help.c:3731 sql_help.c:4129 msgid "statement" msgstr "Anweisung" -#: sql_help.c:3700 sql_help.c:3971 +#: sql_help.c:3765 sql_help.c:4103 msgid "direction" msgstr "Richtung" -#: sql_help.c:3702 sql_help.c:3973 +#: sql_help.c:3767 sql_help.c:4105 msgid "where direction can be empty or one of:" msgstr "wobei Richtung leer sein kann oder Folgendes:" -#: sql_help.c:3703 sql_help.c:3704 sql_help.c:3705 sql_help.c:3706 -#: sql_help.c:3707 sql_help.c:3974 sql_help.c:3975 sql_help.c:3976 -#: sql_help.c:3977 sql_help.c:3978 sql_help.c:4403 sql_help.c:4405 -#: sql_help.c:4501 sql_help.c:4503 sql_help.c:4652 sql_help.c:4654 -#: sql_help.c:4817 sql_help.c:4819 sql_help.c:4884 sql_help.c:4886 +#: sql_help.c:3768 sql_help.c:3769 sql_help.c:3770 sql_help.c:3771 +#: sql_help.c:3772 sql_help.c:4106 sql_help.c:4107 sql_help.c:4108 +#: sql_help.c:4109 sql_help.c:4110 sql_help.c:4545 sql_help.c:4547 +#: sql_help.c:4643 sql_help.c:4645 sql_help.c:4794 sql_help.c:4796 +#: sql_help.c:4958 sql_help.c:4960 sql_help.c:5025 sql_help.c:5027 msgid "count" msgstr "Anzahl" -#: sql_help.c:3805 sql_help.c:4185 +#: sql_help.c:3875 sql_help.c:4324 msgid "sequence_name" msgstr "Sequenzname" -#: sql_help.c:3823 sql_help.c:4203 +#: sql_help.c:3893 sql_help.c:4342 msgid "arg_name" msgstr "Argname" -#: sql_help.c:3824 sql_help.c:4204 +#: sql_help.c:3894 sql_help.c:4343 msgid "arg_type" msgstr "Argtyp" -#: sql_help.c:3831 sql_help.c:4211 +#: sql_help.c:3901 sql_help.c:4350 msgid "loid" msgstr "Large-Object-OID" -#: sql_help.c:3859 +#: sql_help.c:3932 msgid "remote_schema" msgstr "fernes_Schema" -#: sql_help.c:3862 +#: sql_help.c:3935 msgid "local_schema" msgstr "lokales_Schema" -#: sql_help.c:3897 +#: sql_help.c:3970 msgid "conflict_target" msgstr "Konfliktziel" -#: sql_help.c:3898 +#: sql_help.c:3971 msgid "conflict_action" msgstr "Konfliktaktion" -#: sql_help.c:3901 +#: sql_help.c:3974 msgid "where conflict_target can be one of:" msgstr "wobei Konfliktziel Folgendes sein kann:" -#: sql_help.c:3902 +#: sql_help.c:3975 msgid "index_column_name" msgstr "Indexspaltenname" -#: sql_help.c:3903 +#: sql_help.c:3976 msgid "index_expression" msgstr "Indexausdruck" -#: sql_help.c:3906 +#: sql_help.c:3979 msgid "index_predicate" msgstr "Indexprädikat" -#: sql_help.c:3908 +#: sql_help.c:3981 msgid "and conflict_action is one of:" msgstr "und Konfliktaktion Folgendes sein kann:" -#: sql_help.c:3914 sql_help.c:4755 +#: sql_help.c:3987 sql_help.c:4897 msgid "sub-SELECT" msgstr "Sub-SELECT" -#: sql_help.c:3923 sql_help.c:3986 sql_help.c:4731 +#: sql_help.c:3996 sql_help.c:4118 sql_help.c:4873 msgid "channel" msgstr "Kanal" -#: sql_help.c:3945 +#: sql_help.c:4018 msgid "lockmode" msgstr "Sperrmodus" -#: sql_help.c:3946 +#: sql_help.c:4019 msgid "where lockmode is one of:" msgstr "wobei Sperrmodus Folgendes sein kann:" -#: sql_help.c:3987 +#: sql_help.c:4055 +#, fuzzy +#| msgid "table_name" +msgid "target_table_name" +msgstr "Tabellenname" + +#: sql_help.c:4056 +#, fuzzy +#| msgid "target_role" +msgid "target_alias" +msgstr "Zielrolle" + +#: sql_help.c:4057 +#, fuzzy +#| msgid "data_type" +msgid "data_source" +msgstr "Datentyp" + +#: sql_help.c:4058 sql_help.c:4581 sql_help.c:4830 sql_help.c:5061 +msgid "join_condition" +msgstr "Verbundbedingung" + +#: sql_help.c:4059 +msgid "when_clause" +msgstr "" + +#: sql_help.c:4060 +#, fuzzy +#| msgid "where aggregate_signature is:" +msgid "where data_source is" +msgstr "wobei Aggregatsignatur Folgendes ist:" + +#: sql_help.c:4061 +#, fuzzy +#| msgid "source_table" +msgid "source_table_name" +msgstr "Quelltabelle" + +#: sql_help.c:4062 +#, fuzzy +#| msgid "source_type" +msgid "source_query" +msgstr "Quelltyp" + +#: sql_help.c:4063 +#, fuzzy +#| msgid "source_table" +msgid "source_alias" +msgstr "Quelltabelle" + +#: sql_help.c:4064 +#, fuzzy +#| msgid "and with_query is:" +msgid "and when_clause is" +msgstr "und With-Anfrage ist:" + +#: sql_help.c:4066 +#, fuzzy +#| msgid "update" +msgid "merge_update" +msgstr "update" + +#: sql_help.c:4067 +#, fuzzy +#| msgid "delete" +msgid "merge_delete" +msgstr "delete" + +#: sql_help.c:4069 +#, fuzzy +#| msgid "insert" +msgid "merge_insert" +msgstr "insert" + +#: sql_help.c:4070 +#, fuzzy +#| msgid "and aggregate_signature is:" +msgid "and merge_insert is" +msgstr "und Aggregatsignatur Folgendes ist:" + +#: sql_help.c:4073 +#, fuzzy +#| msgid "and aggregate_signature is:" +msgid "and merge_update is" +msgstr "und Aggregatsignatur Folgendes ist:" + +#: sql_help.c:4078 +msgid "and merge_delete is" +msgstr "" + +#: sql_help.c:4119 msgid "payload" msgstr "Payload" -#: sql_help.c:4014 +#: sql_help.c:4146 msgid "old_role" msgstr "alte_Rolle" -#: sql_help.c:4015 +#: sql_help.c:4147 msgid "new_role" msgstr "neue_Rolle" -#: sql_help.c:4051 sql_help.c:4250 sql_help.c:4258 +#: sql_help.c:4183 sql_help.c:4392 sql_help.c:4400 msgid "savepoint_name" msgstr "Sicherungspunktsname" -#: sql_help.c:4396 sql_help.c:4449 sql_help.c:4645 sql_help.c:4698 -#: sql_help.c:4877 sql_help.c:4930 +#: sql_help.c:4538 sql_help.c:4591 sql_help.c:4787 sql_help.c:4840 +#: sql_help.c:5018 sql_help.c:5071 msgid "grouping_element" msgstr "Gruppierelement" -#: sql_help.c:4398 sql_help.c:4496 sql_help.c:4647 sql_help.c:4879 +#: sql_help.c:4540 sql_help.c:4638 sql_help.c:4789 sql_help.c:5020 msgid "window_name" msgstr "Fenstername" -#: sql_help.c:4399 sql_help.c:4497 sql_help.c:4648 sql_help.c:4880 +#: sql_help.c:4541 sql_help.c:4639 sql_help.c:4790 sql_help.c:5021 msgid "window_definition" msgstr "Fensterdefinition" -#: sql_help.c:4400 sql_help.c:4414 sql_help.c:4453 sql_help.c:4498 -#: sql_help.c:4649 sql_help.c:4663 sql_help.c:4702 sql_help.c:4881 -#: sql_help.c:4895 sql_help.c:4934 +#: sql_help.c:4542 sql_help.c:4556 sql_help.c:4595 sql_help.c:4640 +#: sql_help.c:4791 sql_help.c:4805 sql_help.c:4844 sql_help.c:5022 +#: sql_help.c:5036 sql_help.c:5075 msgid "select" msgstr "Select" -#: sql_help.c:4407 sql_help.c:4656 sql_help.c:4888 +#: sql_help.c:4549 sql_help.c:4798 sql_help.c:5029 msgid "where from_item can be one of:" msgstr "wobei From-Element Folgendes sein kann:" -#: sql_help.c:4410 sql_help.c:4416 sql_help.c:4419 sql_help.c:4423 -#: sql_help.c:4435 sql_help.c:4659 sql_help.c:4665 sql_help.c:4668 -#: sql_help.c:4672 sql_help.c:4684 sql_help.c:4891 sql_help.c:4897 -#: sql_help.c:4900 sql_help.c:4904 sql_help.c:4916 +#: sql_help.c:4552 sql_help.c:4558 sql_help.c:4561 sql_help.c:4565 +#: sql_help.c:4577 sql_help.c:4801 sql_help.c:4807 sql_help.c:4810 +#: sql_help.c:4814 sql_help.c:4826 sql_help.c:5032 sql_help.c:5038 +#: sql_help.c:5041 sql_help.c:5045 sql_help.c:5057 msgid "column_alias" msgstr "Spaltenalias" -#: sql_help.c:4411 sql_help.c:4660 sql_help.c:4892 +#: sql_help.c:4553 sql_help.c:4802 sql_help.c:5033 msgid "sampling_method" msgstr "Stichprobenmethode" -#: sql_help.c:4413 sql_help.c:4662 sql_help.c:4894 +#: sql_help.c:4555 sql_help.c:4804 sql_help.c:5035 msgid "seed" msgstr "Startwert" -#: sql_help.c:4417 sql_help.c:4451 sql_help.c:4666 sql_help.c:4700 -#: sql_help.c:4898 sql_help.c:4932 +#: sql_help.c:4559 sql_help.c:4593 sql_help.c:4808 sql_help.c:4842 +#: sql_help.c:5039 sql_help.c:5073 msgid "with_query_name" msgstr "With-Anfragename" -#: sql_help.c:4427 sql_help.c:4430 sql_help.c:4433 sql_help.c:4676 -#: sql_help.c:4679 sql_help.c:4682 sql_help.c:4908 sql_help.c:4911 -#: sql_help.c:4914 +#: sql_help.c:4569 sql_help.c:4572 sql_help.c:4575 sql_help.c:4818 +#: sql_help.c:4821 sql_help.c:4824 sql_help.c:5049 sql_help.c:5052 +#: sql_help.c:5055 msgid "column_definition" msgstr "Spaltendefinition" -#: sql_help.c:4437 sql_help.c:4686 sql_help.c:4918 +#: sql_help.c:4579 sql_help.c:4828 sql_help.c:5059 msgid "join_type" msgstr "Verbundtyp" -#: sql_help.c:4439 sql_help.c:4688 sql_help.c:4920 -msgid "join_condition" -msgstr "Verbundbedingung" - -#: sql_help.c:4440 sql_help.c:4689 sql_help.c:4921 +#: sql_help.c:4582 sql_help.c:4831 sql_help.c:5062 msgid "join_column" msgstr "Verbundspalte" -#: sql_help.c:4441 sql_help.c:4690 sql_help.c:4922 +#: sql_help.c:4583 sql_help.c:4832 sql_help.c:5063 msgid "join_using_alias" msgstr "Join-Using-Alias" -#: sql_help.c:4442 sql_help.c:4691 sql_help.c:4923 +#: sql_help.c:4584 sql_help.c:4833 sql_help.c:5064 msgid "and grouping_element can be one of:" msgstr "und Gruppierelement eins der folgenden sein kann:" -#: sql_help.c:4450 sql_help.c:4699 sql_help.c:4931 +#: sql_help.c:4592 sql_help.c:4841 sql_help.c:5072 msgid "and with_query is:" msgstr "und With-Anfrage ist:" -#: sql_help.c:4454 sql_help.c:4703 sql_help.c:4935 +#: sql_help.c:4596 sql_help.c:4845 sql_help.c:5076 msgid "values" msgstr "values" -#: sql_help.c:4455 sql_help.c:4704 sql_help.c:4936 +#: sql_help.c:4597 sql_help.c:4846 sql_help.c:5077 msgid "insert" msgstr "insert" -#: sql_help.c:4456 sql_help.c:4705 sql_help.c:4937 +#: sql_help.c:4598 sql_help.c:4847 sql_help.c:5078 msgid "update" msgstr "update" -#: sql_help.c:4457 sql_help.c:4706 sql_help.c:4938 +#: sql_help.c:4599 sql_help.c:4848 sql_help.c:5079 msgid "delete" msgstr "delete" -#: sql_help.c:4459 sql_help.c:4708 sql_help.c:4940 +#: sql_help.c:4601 sql_help.c:4850 sql_help.c:5081 msgid "search_seq_col_name" msgstr "Search-Seq-Spaltenname" -#: sql_help.c:4461 sql_help.c:4710 sql_help.c:4942 +#: sql_help.c:4603 sql_help.c:4852 sql_help.c:5083 msgid "cycle_mark_col_name" msgstr "Cycle-Mark-Spaltenname" -#: sql_help.c:4462 sql_help.c:4711 sql_help.c:4943 +#: sql_help.c:4604 sql_help.c:4853 sql_help.c:5084 msgid "cycle_mark_value" msgstr "Cycle-Mark-Wert" -#: sql_help.c:4463 sql_help.c:4712 sql_help.c:4944 +#: sql_help.c:4605 sql_help.c:4854 sql_help.c:5085 msgid "cycle_mark_default" msgstr "Cycle-Mark-Standard" -#: sql_help.c:4464 sql_help.c:4713 sql_help.c:4945 +#: sql_help.c:4606 sql_help.c:4855 sql_help.c:5086 msgid "cycle_path_col_name" msgstr "Cycle-Pfad-Spaltenname" -#: sql_help.c:4491 +#: sql_help.c:4633 msgid "new_table" msgstr "neue_Tabelle" -#: sql_help.c:4516 +#: sql_help.c:4658 msgid "timezone" msgstr "Zeitzone" -#: sql_help.c:4561 +#: sql_help.c:4703 msgid "snapshot_id" msgstr "Snapshot-ID" -#: sql_help.c:4815 +#: sql_help.c:4956 msgid "sort_expression" msgstr "Sortierausdruck" -#: sql_help.c:4952 sql_help.c:5930 +#: sql_help.c:5093 sql_help.c:6077 msgid "abort the current transaction" msgstr "bricht die aktuelle Transaktion ab" -#: sql_help.c:4958 +#: sql_help.c:5099 msgid "change the definition of an aggregate function" msgstr "ändert die Definition einer Aggregatfunktion" -#: sql_help.c:4964 +#: sql_help.c:5105 msgid "change the definition of a collation" msgstr "ändert die Definition einer Sortierfolge" -#: sql_help.c:4970 +#: sql_help.c:5111 msgid "change the definition of a conversion" msgstr "ändert die Definition einer Zeichensatzkonversion" -#: sql_help.c:4976 +#: sql_help.c:5117 msgid "change a database" msgstr "ändert eine Datenbank" -#: sql_help.c:4982 +#: sql_help.c:5123 msgid "define default access privileges" msgstr "definiert vorgegebene Zugriffsprivilegien" -#: sql_help.c:4988 +#: sql_help.c:5129 msgid "change the definition of a domain" msgstr "ändert die Definition einer Domäne" -#: sql_help.c:4994 +#: sql_help.c:5135 msgid "change the definition of an event trigger" msgstr "ändert die Definition eines Ereignistriggers" -#: sql_help.c:5000 +#: sql_help.c:5141 msgid "change the definition of an extension" msgstr "ändert die Definition einer Erweiterung" -#: sql_help.c:5006 +#: sql_help.c:5147 msgid "change the definition of a foreign-data wrapper" msgstr "ändert die Definition eines Fremddaten-Wrappers" -#: sql_help.c:5012 +#: sql_help.c:5153 msgid "change the definition of a foreign table" msgstr "ändert die Definition einer Fremdtabelle" -#: sql_help.c:5018 +#: sql_help.c:5159 msgid "change the definition of a function" msgstr "ändert die Definition einer Funktion" -#: sql_help.c:5024 +#: sql_help.c:5165 msgid "change role name or membership" msgstr "ändert Rollenname oder -mitglieder" -#: sql_help.c:5030 +#: sql_help.c:5171 msgid "change the definition of an index" msgstr "ändert die Definition eines Index" -#: sql_help.c:5036 +#: sql_help.c:5177 msgid "change the definition of a procedural language" msgstr "ändert die Definition einer prozeduralen Sprache" -#: sql_help.c:5042 +#: sql_help.c:5183 msgid "change the definition of a large object" msgstr "ändert die Definition eines Large Object" -#: sql_help.c:5048 +#: sql_help.c:5189 msgid "change the definition of a materialized view" msgstr "ändert die Definition einer materialisierten Sicht" -#: sql_help.c:5054 +#: sql_help.c:5195 msgid "change the definition of an operator" msgstr "ändert die Definition eines Operators" -#: sql_help.c:5060 +#: sql_help.c:5201 msgid "change the definition of an operator class" msgstr "ändert die Definition einer Operatorklasse" -#: sql_help.c:5066 +#: sql_help.c:5207 msgid "change the definition of an operator family" msgstr "ändert die Definition einer Operatorfamilie" -#: sql_help.c:5072 +#: sql_help.c:5213 msgid "change the definition of a row-level security policy" msgstr "ändert die Definition einer Policy für Sicherheit auf Zeilenebene" -#: sql_help.c:5078 +#: sql_help.c:5219 msgid "change the definition of a procedure" msgstr "ändert die Definition einer Prozedur" -#: sql_help.c:5084 +#: sql_help.c:5225 msgid "change the definition of a publication" msgstr "ändert die Definition einer Publikation" -#: sql_help.c:5090 sql_help.c:5192 +#: sql_help.c:5231 sql_help.c:5333 msgid "change a database role" msgstr "ändert eine Datenbankrolle" -#: sql_help.c:5096 +#: sql_help.c:5237 msgid "change the definition of a routine" msgstr "ändert die Definition einer Routine" -#: sql_help.c:5102 +#: sql_help.c:5243 msgid "change the definition of a rule" msgstr "ändert die Definition einer Regel" -#: sql_help.c:5108 +#: sql_help.c:5249 msgid "change the definition of a schema" msgstr "ändert die Definition eines Schemas" -#: sql_help.c:5114 +#: sql_help.c:5255 msgid "change the definition of a sequence generator" msgstr "ändert die Definition eines Sequenzgenerators" -#: sql_help.c:5120 +#: sql_help.c:5261 msgid "change the definition of a foreign server" msgstr "ändert die Definition eines Fremdservers" -#: sql_help.c:5126 +#: sql_help.c:5267 msgid "change the definition of an extended statistics object" msgstr "ändert die Definition eines erweiterten Statistikobjekts" -#: sql_help.c:5132 +#: sql_help.c:5273 msgid "change the definition of a subscription" msgstr "ändert die Definition einer Subskription" -#: sql_help.c:5138 +#: sql_help.c:5279 msgid "change a server configuration parameter" msgstr "ändert einen Server-Konfigurationsparameter" -#: sql_help.c:5144 +#: sql_help.c:5285 msgid "change the definition of a table" msgstr "ändert die Definition einer Tabelle" -#: sql_help.c:5150 +#: sql_help.c:5291 msgid "change the definition of a tablespace" msgstr "ändert die Definition eines Tablespace" -#: sql_help.c:5156 +#: sql_help.c:5297 msgid "change the definition of a text search configuration" msgstr "ändert die Definition einer Textsuchekonfiguration" -#: sql_help.c:5162 +#: sql_help.c:5303 msgid "change the definition of a text search dictionary" msgstr "ändert die Definition eines Textsuchewörterbuchs" -#: sql_help.c:5168 +#: sql_help.c:5309 msgid "change the definition of a text search parser" msgstr "ändert die Definition eines Textsucheparsers" -#: sql_help.c:5174 +#: sql_help.c:5315 msgid "change the definition of a text search template" msgstr "ändert die Definition einer Textsuchevorlage" -#: sql_help.c:5180 +#: sql_help.c:5321 msgid "change the definition of a trigger" msgstr "ändert die Definition eines Triggers" -#: sql_help.c:5186 +#: sql_help.c:5327 msgid "change the definition of a type" msgstr "ändert die Definition eines Typs" -#: sql_help.c:5198 +#: sql_help.c:5339 msgid "change the definition of a user mapping" msgstr "ändert die Definition einer Benutzerabbildung" -#: sql_help.c:5204 +#: sql_help.c:5345 msgid "change the definition of a view" msgstr "ändert die Definition einer Sicht" -#: sql_help.c:5210 +#: sql_help.c:5351 msgid "collect statistics about a database" msgstr "sammelt Statistiken über eine Datenbank" -#: sql_help.c:5216 sql_help.c:6008 +#: sql_help.c:5357 sql_help.c:6155 msgid "start a transaction block" msgstr "startet einen Transaktionsblock" -#: sql_help.c:5222 +#: sql_help.c:5363 msgid "invoke a procedure" msgstr "ruft eine Prozedur auf" -#: sql_help.c:5228 +#: sql_help.c:5369 msgid "force a write-ahead log checkpoint" msgstr "erzwingt einen Checkpoint im Write-Ahead-Log" -#: sql_help.c:5234 +#: sql_help.c:5375 msgid "close a cursor" msgstr "schließt einen Cursor" -#: sql_help.c:5240 +#: sql_help.c:5381 msgid "cluster a table according to an index" msgstr "clustert eine Tabelle nach einem Index" -#: sql_help.c:5246 +#: sql_help.c:5387 msgid "define or change the comment of an object" msgstr "definiert oder ändert den Kommentar eines Objektes" -#: sql_help.c:5252 sql_help.c:5810 +#: sql_help.c:5393 sql_help.c:5951 msgid "commit the current transaction" msgstr "schließt die aktuelle Transaktion ab" -#: sql_help.c:5258 +#: sql_help.c:5399 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "schließt eine Transaktion ab, die vorher für Two-Phase-Commit vorbereitet worden war" -#: sql_help.c:5264 +#: sql_help.c:5405 msgid "copy data between a file and a table" msgstr "kopiert Daten zwischen einer Datei und einer Tabelle" -#: sql_help.c:5270 +#: sql_help.c:5411 msgid "define a new access method" msgstr "definiert eine neue Zugriffsmethode" -#: sql_help.c:5276 +#: sql_help.c:5417 msgid "define a new aggregate function" msgstr "definiert eine neue Aggregatfunktion" -#: sql_help.c:5282 +#: sql_help.c:5423 msgid "define a new cast" msgstr "definiert eine neue Typumwandlung" -#: sql_help.c:5288 +#: sql_help.c:5429 msgid "define a new collation" msgstr "definiert eine neue Sortierfolge" -#: sql_help.c:5294 +#: sql_help.c:5435 msgid "define a new encoding conversion" msgstr "definiert eine neue Kodierungskonversion" -#: sql_help.c:5300 +#: sql_help.c:5441 msgid "create a new database" msgstr "erzeugt eine neue Datenbank" -#: sql_help.c:5306 +#: sql_help.c:5447 msgid "define a new domain" msgstr "definiert eine neue Domäne" -#: sql_help.c:5312 +#: sql_help.c:5453 msgid "define a new event trigger" msgstr "definiert einen neuen Ereignistrigger" -#: sql_help.c:5318 +#: sql_help.c:5459 msgid "install an extension" msgstr "installiert eine Erweiterung" -#: sql_help.c:5324 +#: sql_help.c:5465 msgid "define a new foreign-data wrapper" msgstr "definiert einen neuen Fremddaten-Wrapper" -#: sql_help.c:5330 +#: sql_help.c:5471 msgid "define a new foreign table" msgstr "definiert eine neue Fremdtabelle" -#: sql_help.c:5336 +#: sql_help.c:5477 msgid "define a new function" msgstr "definiert eine neue Funktion" -#: sql_help.c:5342 sql_help.c:5402 sql_help.c:5504 +#: sql_help.c:5483 sql_help.c:5543 sql_help.c:5645 msgid "define a new database role" msgstr "definiert eine neue Datenbankrolle" -#: sql_help.c:5348 +#: sql_help.c:5489 msgid "define a new index" msgstr "definiert einen neuen Index" -#: sql_help.c:5354 +#: sql_help.c:5495 msgid "define a new procedural language" msgstr "definiert eine neue prozedurale Sprache" -#: sql_help.c:5360 +#: sql_help.c:5501 msgid "define a new materialized view" msgstr "definiert eine neue materialisierte Sicht" -#: sql_help.c:5366 +#: sql_help.c:5507 msgid "define a new operator" msgstr "definiert einen neuen Operator" -#: sql_help.c:5372 +#: sql_help.c:5513 msgid "define a new operator class" msgstr "definiert eine neue Operatorklasse" -#: sql_help.c:5378 +#: sql_help.c:5519 msgid "define a new operator family" msgstr "definiert eine neue Operatorfamilie" -#: sql_help.c:5384 +#: sql_help.c:5525 msgid "define a new row-level security policy for a table" msgstr "definiert eine neue Policy für Sicherheit auf Zeilenebene für eine Tabelle" -#: sql_help.c:5390 +#: sql_help.c:5531 msgid "define a new procedure" msgstr "definiert eine neue Prozedur" -#: sql_help.c:5396 +#: sql_help.c:5537 msgid "define a new publication" msgstr "definiert eine neue Publikation" -#: sql_help.c:5408 +#: sql_help.c:5549 msgid "define a new rewrite rule" msgstr "definiert eine neue Umschreiberegel" -#: sql_help.c:5414 +#: sql_help.c:5555 msgid "define a new schema" msgstr "definiert ein neues Schema" -#: sql_help.c:5420 +#: sql_help.c:5561 msgid "define a new sequence generator" msgstr "definiert einen neuen Sequenzgenerator" -#: sql_help.c:5426 +#: sql_help.c:5567 msgid "define a new foreign server" msgstr "definiert einen neuen Fremdserver" -#: sql_help.c:5432 +#: sql_help.c:5573 msgid "define extended statistics" msgstr "definiert erweiterte Statistiken" -#: sql_help.c:5438 +#: sql_help.c:5579 msgid "define a new subscription" msgstr "definiert eine neue Subskription" -#: sql_help.c:5444 +#: sql_help.c:5585 msgid "define a new table" msgstr "definiert eine neue Tabelle" -#: sql_help.c:5450 sql_help.c:5966 +#: sql_help.c:5591 sql_help.c:6113 msgid "define a new table from the results of a query" msgstr "definiert eine neue Tabelle aus den Ergebnissen einer Anfrage" -#: sql_help.c:5456 +#: sql_help.c:5597 msgid "define a new tablespace" msgstr "definiert einen neuen Tablespace" -#: sql_help.c:5462 +#: sql_help.c:5603 msgid "define a new text search configuration" msgstr "definiert eine neue Textsuchekonfiguration" -#: sql_help.c:5468 +#: sql_help.c:5609 msgid "define a new text search dictionary" msgstr "definiert ein neues Textsuchewörterbuch" -#: sql_help.c:5474 +#: sql_help.c:5615 msgid "define a new text search parser" msgstr "definiert einen neuen Textsucheparser" -#: sql_help.c:5480 +#: sql_help.c:5621 msgid "define a new text search template" msgstr "definiert eine neue Textsuchevorlage" -#: sql_help.c:5486 +#: sql_help.c:5627 msgid "define a new transform" msgstr "definiert eine neue Transformation" -#: sql_help.c:5492 +#: sql_help.c:5633 msgid "define a new trigger" msgstr "definiert einen neuen Trigger" -#: sql_help.c:5498 +#: sql_help.c:5639 msgid "define a new data type" msgstr "definiert einen neuen Datentyp" -#: sql_help.c:5510 +#: sql_help.c:5651 msgid "define a new mapping of a user to a foreign server" msgstr "definiert eine neue Abbildung eines Benutzers auf einen Fremdserver" -#: sql_help.c:5516 +#: sql_help.c:5657 msgid "define a new view" msgstr "definiert eine neue Sicht" -#: sql_help.c:5522 +#: sql_help.c:5663 msgid "deallocate a prepared statement" msgstr "gibt einen vorbereiteten Befehl frei" -#: sql_help.c:5528 +#: sql_help.c:5669 msgid "define a cursor" msgstr "definiert einen Cursor" -#: sql_help.c:5534 +#: sql_help.c:5675 msgid "delete rows of a table" msgstr "löscht Zeilen einer Tabelle" -#: sql_help.c:5540 +#: sql_help.c:5681 msgid "discard session state" msgstr "verwirft den Sitzungszustand" -#: sql_help.c:5546 +#: sql_help.c:5687 msgid "execute an anonymous code block" msgstr "führt einen anonymen Codeblock aus" -#: sql_help.c:5552 +#: sql_help.c:5693 msgid "remove an access method" msgstr "entfernt eine Zugriffsmethode" -#: sql_help.c:5558 +#: sql_help.c:5699 msgid "remove an aggregate function" msgstr "entfernt eine Aggregatfunktion" -#: sql_help.c:5564 +#: sql_help.c:5705 msgid "remove a cast" msgstr "entfernt eine Typumwandlung" -#: sql_help.c:5570 +#: sql_help.c:5711 msgid "remove a collation" msgstr "entfernt eine Sortierfolge" -#: sql_help.c:5576 +#: sql_help.c:5717 msgid "remove a conversion" msgstr "entfernt eine Zeichensatzkonversion" -#: sql_help.c:5582 +#: sql_help.c:5723 msgid "remove a database" msgstr "entfernt eine Datenbank" -#: sql_help.c:5588 +#: sql_help.c:5729 msgid "remove a domain" msgstr "entfernt eine Domäne" -#: sql_help.c:5594 +#: sql_help.c:5735 msgid "remove an event trigger" msgstr "entfernt einen Ereignistrigger" -#: sql_help.c:5600 +#: sql_help.c:5741 msgid "remove an extension" msgstr "entfernt eine Erweiterung" -#: sql_help.c:5606 +#: sql_help.c:5747 msgid "remove a foreign-data wrapper" msgstr "entfernt einen Fremddaten-Wrapper" -#: sql_help.c:5612 +#: sql_help.c:5753 msgid "remove a foreign table" msgstr "entfernt eine Fremdtabelle" -#: sql_help.c:5618 +#: sql_help.c:5759 msgid "remove a function" msgstr "entfernt eine Funktion" -#: sql_help.c:5624 sql_help.c:5690 sql_help.c:5792 +#: sql_help.c:5765 sql_help.c:5831 sql_help.c:5933 msgid "remove a database role" msgstr "entfernt eine Datenbankrolle" -#: sql_help.c:5630 +#: sql_help.c:5771 msgid "remove an index" msgstr "entfernt einen Index" -#: sql_help.c:5636 +#: sql_help.c:5777 msgid "remove a procedural language" msgstr "entfernt eine prozedurale Sprache" -#: sql_help.c:5642 +#: sql_help.c:5783 msgid "remove a materialized view" msgstr "entfernt eine materialisierte Sicht" -#: sql_help.c:5648 +#: sql_help.c:5789 msgid "remove an operator" msgstr "entfernt einen Operator" -#: sql_help.c:5654 +#: sql_help.c:5795 msgid "remove an operator class" msgstr "entfernt eine Operatorklasse" -#: sql_help.c:5660 +#: sql_help.c:5801 msgid "remove an operator family" msgstr "entfernt eine Operatorfamilie" -#: sql_help.c:5666 +#: sql_help.c:5807 msgid "remove database objects owned by a database role" msgstr "entfernt die einer Datenbankrolle gehörenden Datenbankobjekte" -#: sql_help.c:5672 +#: sql_help.c:5813 msgid "remove a row-level security policy from a table" msgstr "entfernt eine Policy für Sicherheit auf Zeilenebene von einer Tabelle" -#: sql_help.c:5678 +#: sql_help.c:5819 msgid "remove a procedure" msgstr "entfernt eine Prozedur" -#: sql_help.c:5684 +#: sql_help.c:5825 msgid "remove a publication" msgstr "entfernt eine Publikation" -#: sql_help.c:5696 +#: sql_help.c:5837 msgid "remove a routine" msgstr "entfernt eine Routine" -#: sql_help.c:5702 +#: sql_help.c:5843 msgid "remove a rewrite rule" msgstr "entfernt eine Umschreiberegel" -#: sql_help.c:5708 +#: sql_help.c:5849 msgid "remove a schema" msgstr "entfernt ein Schema" -#: sql_help.c:5714 +#: sql_help.c:5855 msgid "remove a sequence" msgstr "entfernt eine Sequenz" -#: sql_help.c:5720 +#: sql_help.c:5861 msgid "remove a foreign server descriptor" msgstr "entfernt einen Fremdserverdeskriptor" -#: sql_help.c:5726 +#: sql_help.c:5867 msgid "remove extended statistics" msgstr "entfernt erweiterte Statistiken" -#: sql_help.c:5732 +#: sql_help.c:5873 msgid "remove a subscription" msgstr "entfernt eine Subskription" -#: sql_help.c:5738 +#: sql_help.c:5879 msgid "remove a table" msgstr "entfernt eine Tabelle" -#: sql_help.c:5744 +#: sql_help.c:5885 msgid "remove a tablespace" msgstr "entfernt einen Tablespace" -#: sql_help.c:5750 +#: sql_help.c:5891 msgid "remove a text search configuration" msgstr "entfernt eine Textsuchekonfiguration" -#: sql_help.c:5756 +#: sql_help.c:5897 msgid "remove a text search dictionary" msgstr "entfernt ein Textsuchewörterbuch" -#: sql_help.c:5762 +#: sql_help.c:5903 msgid "remove a text search parser" msgstr "entfernt einen Textsucheparser" -#: sql_help.c:5768 +#: sql_help.c:5909 msgid "remove a text search template" msgstr "entfernt eine Textsuchevorlage" -#: sql_help.c:5774 +#: sql_help.c:5915 msgid "remove a transform" msgstr "entfernt eine Transformation" -#: sql_help.c:5780 +#: sql_help.c:5921 msgid "remove a trigger" msgstr "entfernt einen Trigger" -#: sql_help.c:5786 +#: sql_help.c:5927 msgid "remove a data type" msgstr "entfernt einen Datentyp" -#: sql_help.c:5798 +#: sql_help.c:5939 msgid "remove a user mapping for a foreign server" msgstr "entfernt eine Benutzerabbildung für einen Fremdserver" -#: sql_help.c:5804 +#: sql_help.c:5945 msgid "remove a view" msgstr "entfernt eine Sicht" -#: sql_help.c:5816 +#: sql_help.c:5957 msgid "execute a prepared statement" msgstr "führt einen vorbereiteten Befehl aus" -#: sql_help.c:5822 +#: sql_help.c:5963 msgid "show the execution plan of a statement" msgstr "zeigt den Ausführungsplan eines Befehls" -#: sql_help.c:5828 +#: sql_help.c:5969 msgid "retrieve rows from a query using a cursor" msgstr "liest Zeilen aus einer Anfrage mit einem Cursor" -#: sql_help.c:5834 +#: sql_help.c:5975 msgid "define access privileges" msgstr "definiert Zugriffsprivilegien" -#: sql_help.c:5840 +#: sql_help.c:5981 msgid "import table definitions from a foreign server" msgstr "importiert Tabellendefinitionen von einem Fremdserver" -#: sql_help.c:5846 +#: sql_help.c:5987 msgid "create new rows in a table" msgstr "erzeugt neue Zeilen in einer Tabelle" -#: sql_help.c:5852 +#: sql_help.c:5993 msgid "listen for a notification" msgstr "hört auf eine Benachrichtigung" -#: sql_help.c:5858 +#: sql_help.c:5999 msgid "load a shared library file" msgstr "lädt eine dynamische Bibliotheksdatei" -#: sql_help.c:5864 +#: sql_help.c:6005 msgid "lock a table" msgstr "sperrt eine Tabelle" -#: sql_help.c:5870 +#: sql_help.c:6011 +#, fuzzy +#| msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." +msgid "conditionally insert, update, or delete rows of a table" +msgstr "Mindestanzahl an Einfüge-, Änderungs- oder Löschoperationen vor einem Analyze." + +#: sql_help.c:6017 msgid "position a cursor" msgstr "positioniert einen Cursor" -#: sql_help.c:5876 +#: sql_help.c:6023 msgid "generate a notification" msgstr "erzeugt eine Benachrichtigung" -#: sql_help.c:5882 +#: sql_help.c:6029 msgid "prepare a statement for execution" msgstr "bereitet einen Befehl zur Ausführung vor" -#: sql_help.c:5888 +#: sql_help.c:6035 msgid "prepare the current transaction for two-phase commit" msgstr "bereitet die aktuelle Transaktion für Two-Phase-Commit vor" -#: sql_help.c:5894 +#: sql_help.c:6041 msgid "change the ownership of database objects owned by a database role" msgstr "ändert den Eigentümer der der Rolle gehörenden Datenbankobjekte" -#: sql_help.c:5900 +#: sql_help.c:6047 msgid "replace the contents of a materialized view" msgstr "ersetzt den Inhalt einer materialisierten Sicht" -#: sql_help.c:5906 +#: sql_help.c:6053 msgid "rebuild indexes" msgstr "baut Indexe neu" -#: sql_help.c:5912 +#: sql_help.c:6059 msgid "destroy a previously defined savepoint" msgstr "gibt einen zuvor definierten Sicherungspunkt frei" -#: sql_help.c:5918 +#: sql_help.c:6065 msgid "restore the value of a run-time parameter to the default value" msgstr "setzt einen Konfigurationsparameter auf die Voreinstellung zurück" -#: sql_help.c:5924 +#: sql_help.c:6071 msgid "remove access privileges" msgstr "entfernt Zugriffsprivilegien" -#: sql_help.c:5936 +#: sql_help.c:6083 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "storniert eine Transaktion, die vorher für Two-Phase-Commit vorbereitet worden war" -#: sql_help.c:5942 +#: sql_help.c:6089 msgid "roll back to a savepoint" msgstr "rollt eine Transaktion bis zu einem Sicherungspunkt zurück" -#: sql_help.c:5948 +#: sql_help.c:6095 msgid "define a new savepoint within the current transaction" msgstr "definiert einen neuen Sicherungspunkt in der aktuellen Transaktion" -#: sql_help.c:5954 +#: sql_help.c:6101 msgid "define or change a security label applied to an object" msgstr "definiert oder ändert ein Security-Label eines Objektes" -#: sql_help.c:5960 sql_help.c:6014 sql_help.c:6050 +#: sql_help.c:6107 sql_help.c:6161 sql_help.c:6197 msgid "retrieve rows from a table or view" msgstr "liest Zeilen aus einer Tabelle oder Sicht" -#: sql_help.c:5972 +#: sql_help.c:6119 msgid "change a run-time parameter" msgstr "ändert einen Konfigurationsparameter" -#: sql_help.c:5978 +#: sql_help.c:6125 msgid "set constraint check timing for the current transaction" msgstr "setzt die Zeitsteuerung für Check-Constraints in der aktuellen Transaktion" -#: sql_help.c:5984 +#: sql_help.c:6131 msgid "set the current user identifier of the current session" msgstr "setzt den aktuellen Benutzernamen der aktuellen Sitzung" -#: sql_help.c:5990 +#: sql_help.c:6137 msgid "set the session user identifier and the current user identifier of the current session" msgstr "setzt den Sitzungsbenutzernamen und den aktuellen Benutzernamen der aktuellen Sitzung" -#: sql_help.c:5996 +#: sql_help.c:6143 msgid "set the characteristics of the current transaction" msgstr "setzt die Charakteristika der aktuellen Transaktion" -#: sql_help.c:6002 +#: sql_help.c:6149 msgid "show the value of a run-time parameter" msgstr "zeigt den Wert eines Konfigurationsparameters" -#: sql_help.c:6020 +#: sql_help.c:6167 msgid "empty a table or set of tables" msgstr "leert eine oder mehrere Tabellen" -#: sql_help.c:6026 +#: sql_help.c:6173 msgid "stop listening for a notification" msgstr "beendet das Hören auf eine Benachrichtigung" -#: sql_help.c:6032 +#: sql_help.c:6179 msgid "update rows of a table" msgstr "aktualisiert Zeilen einer Tabelle" -#: sql_help.c:6038 +#: sql_help.c:6185 msgid "garbage-collect and optionally analyze a database" msgstr "säubert und analysiert eine Datenbank" -#: sql_help.c:6044 +#: sql_help.c:6191 msgid "compute a set of rows" msgstr "berechnet eine Zeilenmenge" -#: startup.c:213 +#: startup.c:220 #, c-format msgid "-1 can only be used in non-interactive mode" msgstr "-1 kann nur im nicht interaktiven Modus verwendet werden" -#: startup.c:326 +#: startup.c:343 #, c-format msgid "could not open log file \"%s\": %m" msgstr "konnte Logdatei »%s« nicht öffnen: %m" -#: startup.c:438 +#: startup.c:453 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6496,27 +6704,27 @@ msgstr "" "Geben Sie »help« für Hilfe ein.\n" "\n" -#: startup.c:591 +#: startup.c:605 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "konnte Ausgabeparameter »%s« nicht setzen" -#: startup.c:699 +#: startup.c:712 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: startup.c:716 +#: startup.c:728 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "überflüssiges Kommandozeilenargument »%s« ignoriert" -#: startup.c:765 +#: startup.c:776 #, c-format msgid "could not find own program executable" msgstr "konnte eigene Programmdatei nicht finden" -#: tab-complete.c:4917 +#: tab-complete.c:5920 #, c-format msgid "" "tab completion query failed: %s\n" diff --git a/src/bin/psql/po/el.po b/src/bin/psql/po/el.po index b2cac84aed..12e800392d 100644 --- a/src/bin/psql/po/el.po +++ b/src/bin/psql/po/el.po @@ -1,13 +1,16 @@ # Greek message translation file for psql # Copyright (C) 2021 PostgreSQL Global Development Group # This file is distributed under the same license as the psql (PostgreSQL) package. +# Georgios Kokolatos , 2021. +# +# # msgid "" msgstr "" -"Project-Id-Version: psql (PostgreSQL) 13\n" +"Project-Id-Version: psql (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-25 05:45+0000\n" -"PO-Revision-Date: 2021-03-11 10:07+0100\n" +"POT-Creation-Date: 2021-11-08 10:14+0000\n" +"PO-Revision-Date: 2021-11-08 12:23+0100\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -15,22 +18,22 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 3.0\n" #: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " -msgstr "κρίσιμο:" +msgstr "κρίσιμο: " #: ../../../src/common/logging.c:266 #, c-format msgid "error: " -msgstr "σφάλμα:" +msgstr "σφάλμα: " #: ../../../src/common/logging.c:273 #, c-format msgid "warning: " -msgstr "προειδοποίηση:" +msgstr "προειδοποίηση: " #: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format @@ -40,32 +43,32 @@ msgstr "δεν ήταν δυνατή η αναγνώριση του τρέχον #: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" -msgstr "μη έγκυρο δυαδικό αρχείο “%s”" +msgstr "μη έγκυρο δυαδικό αρχείο «%s»" #: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" -msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου “%s”" +msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου «%s»" #: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" -msgstr "δεν βρέθηκε το αρχείο “%s” για να εκτελεστεί" +msgstr "δεν βρέθηκε το αρχείο «%s» για να εκτελεστεί" #: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" -msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο “%s”: %m" +msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" #: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου “%s”: %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου «%s»: %m" #: ../../common/exec.c:409 #, c-format msgid "%s() failed: %m" -msgstr "%s () απέτυχε: %m" +msgstr "%s() απέτυχε: %m" #: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 #: command.c:1315 command.c:3246 command.c:3295 command.c:3412 input.c:227 @@ -135,7 +138,7 @@ msgstr "Αίτηση ακύρωσης εστάλη\n" #: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 msgid "Could not send cancel request: " -msgstr "Δεν ήταν δυνατή η αποστολή αίτησης ακύρωσης" +msgstr "Δεν ήταν δυνατή η αποστολή αίτησης ακύρωσης: " #: ../../fe_utils/print.c:336 #, c-format @@ -167,12 +170,12 @@ msgstr "μη έγκυρη μορφή εξόδου (εσωτερικό σφάλμ #: ../../fe_utils/psqlscan.l:697 #, c-format msgid "skipping recursive expansion of variable \"%s\"" -msgstr "Παραλείπεται η αναδρομική επέκταση της μεταβλητής “%s”" +msgstr "παραλείπεται η αναδρομική επέκταση της μεταβλητής «%s»" #: command.c:230 #, c-format msgid "invalid command \\%s" -msgstr "μη έγκυρη εντολή “%s”" +msgstr "μη έγκυρη εντολή «%s»" #: command.c:232 #, c-format @@ -182,7 +185,7 @@ msgstr "Δοκιμάστε \\? για βοήθεια." #: command.c:250 #, c-format msgid "\\%s: extra argument \"%s\" ignored" -msgstr "\\%s: επιπλέον παράμετρος “%s” αγνοείται" +msgstr "\\%s: επιπλέον παράμετρος «%s» αγνοείται" #: command.c:302 #, c-format @@ -197,7 +200,7 @@ msgstr "δεν ήταν δυνατή η ανάλληψη προσωπικού κ #: command.c:581 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" -msgstr "\\%s: δεν ήταν δυνατή η μετάβαση στον κατάλογο “%s”: %m" +msgstr "\\%s: δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" #: command.c:606 #, c-format @@ -207,22 +210,22 @@ msgstr "Αυτή τη στιγμή δεν είστε συνδεδεμένοι σ #: command.c:616 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" -msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων “%s” ως χρήστης “%s” στην διεύθυνση “%s” στη θύρα “%s”.\n" +msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» στην διεύθυνση «%s» στη θύρα «%s».\n" #: command.c:619 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" -msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων “%s” ως χρήστης “%s” μέσω του υποδεχέα “%s” στη θύρα “%s”.\n" +msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» μέσω του υποδεχέα «%s» στη θύρα «%s».\n" #: command.c:625 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" -msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων \"%s\" ως χρήστης \"%s\" στον κεντρικό υπολογιστή \"%s\" (διεύθυνση \"%s\") στη θύρα \"%s\".\n" +msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» στον κεντρικό υπολογιστή «%s» (διεύθυνση «%s») στη θύρα «%s».\n" #: command.c:628 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" -msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων “%s” ως χρήστης “%s” στον κεντρικό υπολογιστή “%s” στη θύρα “%s”.\n" +msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» στον κεντρικό υπολογιστή «%s» στη θύρα «%s».\n" #: command.c:1012 command.c:1121 command.c:2602 #, c-format @@ -232,7 +235,7 @@ msgstr "μη ενδιάμεση μνήμη ερώτησης" #: command.c:1045 command.c:5304 #, c-format msgid "invalid line number: %s" -msgstr "μη έγκυρος αριθμός γραμμής “%s”" +msgstr "μη έγκυρος αριθμός γραμμής «%s»" #: command.c:1112 #, c-format @@ -330,12 +333,12 @@ msgstr "Μηδενισμός ενδιάμεσης μνήμη ερώτησης ( #: command.c:2260 #, c-format msgid "Wrote history to file \"%s\".\n" -msgstr "‘Εγραψε την ιστορία στο αρχείο “%s”.\n" +msgstr "‘Εγραψε την ιστορία στο αρχείο «%s».\n" #: command.c:2347 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" -msgstr "\\%s: η ονομασία μεταβλητή περιβάλλοντος environment δεν δύναται να εμπεριέχει “=“" +msgstr "\\%s: η ονομασία μεταβλητή περιβάλλοντος environment δεν δύναται να εμπεριέχει «=«" #: command.c:2399 #, c-format @@ -385,12 +388,12 @@ msgstr "Κωδικός πρόσβασης για τον χρήστη %s: " #: command.c:3104 #, c-format msgid "Do not give user, host, or port separately when using a connection string" -msgstr "" +msgstr "Να μην οριστεί ξεχωριστά ο χρήστης, ο κεντρικός υπολογιστής, ή η θύρα όταν χρησιμοποιείται μια συμβολοσειρά σύνδεσης" #: command.c:3139 #, c-format msgid "No database connection exists to re-use parameters from" -msgstr "" +msgstr "Δεν υπάρχει σύνδεση βάσης δεδομένων για την επαναχρησιμοποίηση παραμέτρων" #: command.c:3440 #, c-format @@ -406,28 +409,28 @@ msgstr "\\connect: %s" #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "" -"Τώρα είστε συνδεδεμένοι στη βάση δεδομένων “%s” ως χρήστης “%s” στη διεύθυνση “%s” στη θύρα “%s”.\n" +"Τώρα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» στη διεύθυνση «%s» στη θύρα «%s».\n" "=\n" #: command.c:3505 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" -msgstr "Τώρα είστε συνδεδεμένοι στη βάση δεδομένων “%s” ως χρήστης “%s” μέσω του υποδεχέα “%s” στη θύρα “%s”.\n" +msgstr "Τώρα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» μέσω του υποδεχέα «%s» στη θύρα «%s».\n" #: command.c:3511 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" -msgstr "Τώρα είστε συνδεδεμένοι στη βάση δεδομένων \"%s\" ως χρήστης \"%s\" στον κεντρικό υπολογιστή \"%s\" (διεύθυνση \"%s\") στη θύρα \"%s\".\n" +msgstr "Τώρα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» στον κεντρικό υπολογιστή «%s» (διεύθυνση «%s») στη θύρα «%s».\n" #: command.c:3514 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" -msgstr "Τώρα είστε συνδεδεμένοι στη βάση δεδομένων “%s” ως χρήστης “%s” στον κεντρικό υπολογιστή “%s” στη θύρα “%s”.\n" +msgstr "Τώρα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» στον κεντρικό υπολογιστή «%s» στη θύρα «%s».\n" #: command.c:3519 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" -msgstr "Τώρα είστε συνδεδεμένοι στη βάση δεδομένων “%s” ως χρήστης “%s”.\n" +msgstr "Τώρα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s».\n" #: command.c:3559 #, c-format @@ -474,7 +477,7 @@ msgid "" msgstr "" "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Ο πηγαίος κώδικας της κονσόλας (%u) διαφέρει από τον πηγαίο κώδικα των Windows(%u)\n" " Χαρακτήρες 8-bit δύναται να μην λειτουργούν ορθά. Δείτε την αναφορά στη σελίδα\n" -" psql με τίτλο “Σημειώσεις για χρήστες Windows” για πληροφορίες.\n" +" psql με τίτλο «Σημειώσεις για χρήστες Windows» για πληροφορίες.\n" #: command.c:3749 #, c-format @@ -484,7 +487,7 @@ msgstr "η μεταβλητή περιβάλλοντος PSQL_EDITOR_LINENUMBER_ #: command.c:3778 #, c-format msgid "could not start editor \"%s\"" -msgstr "δεν μπόρεσε να εκκινήσει τον editor “%s”" +msgstr "δεν μπόρεσε να εκκινήσει τον editor «%s»" #: command.c:3780 #, c-format @@ -499,12 +502,12 @@ msgstr "δεν ήταν δυνατός ο εντοπισμός του προσω #: command.c:3857 #, c-format msgid "could not open temporary file \"%s\": %m" -msgstr "δεν ήταν δυνατό το άνοιγμα του προσωρινού αρχείου “%s”: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του προσωρινού αρχείου «%s»: %m" #: command.c:4193 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" -msgstr "\\pset: διφορούμενης συντόμευση “%s” ταιριάζει τόσο “%s” όσο “%s”" +msgstr "\\pset: διφορούμενης συντόμευση «%s» ταιριάζει τόσο «%s» όσο «%s»" #: command.c:4213 #, c-format @@ -579,7 +582,7 @@ msgstr "Εκτεταμένη οθόνη είναι ανενεργή.\n" #: command.c:4507 #, c-format msgid "Field separator for CSV is \"%s\".\n" -msgstr "Διαχωριστής πεδίων CSV είναι ο “%s”.\n" +msgstr "Διαχωριστής πεδίων CSV είναι ο «%s».\n" #: command.c:4515 command.c:4523 #, c-format @@ -589,7 +592,7 @@ msgstr "Διαχωριστής πεδίων είναι το μηδενικό byt #: command.c:4517 #, c-format msgid "Field separator is \"%s\".\n" -msgstr "Διαχωριστής πεδίων είναι ο “%s”.\n" +msgstr "Διαχωριστής πεδίων είναι ο «%s».\n" #: command.c:4530 #, c-format @@ -614,7 +617,7 @@ msgstr "Η μορφή γραμμής είναι %s.\n" #: command.c:4551 #, c-format msgid "Null display is \"%s\".\n" -msgstr "Εμφάνιση Null είναι “%s”.\n" +msgstr "Εμφάνιση Null είναι «%s».\n" #: command.c:4559 #, c-format @@ -661,12 +664,12 @@ msgstr "Διαχωριστής εγγραφών είναι ο .\n" #: command.c:4592 #, c-format msgid "Record separator is \"%s\".\n" -msgstr "Διαχωριστής εγγραφών είναι ο/η “%s”.\n" +msgstr "Διαχωριστής εγγραφών είναι ο/η «%s».\n" #: command.c:4605 #, c-format msgid "Table attributes are \"%s\".\n" -msgstr "Τα χαρακτηριστικά του πίνακα είναι “%s”.\n" +msgstr "Τα χαρακτηριστικά του πίνακα είναι «%s».\n" #: command.c:4608 #, c-format @@ -676,7 +679,7 @@ msgstr "Χαρακτηριστικά πίνακα μη ορισμένα.\n" #: command.c:4615 #, c-format msgid "Title is \"%s\".\n" -msgstr "Ο τίτλος είναι “%s”.\n" +msgstr "Ο τίτλος είναι «%s».\n" #: command.c:4617 #, c-format @@ -696,17 +699,17 @@ msgstr "Ανενεργή όψη μόνο πλειάδων.\n" #: command.c:4632 #, c-format msgid "Unicode border line style is \"%s\".\n" -msgstr "Το στυλ περιγράμματος γραμμής Unicode είναι \"%s\".\n" +msgstr "Το στυλ περιγράμματος γραμμής Unicode είναι «%s».\n" #: command.c:4638 #, c-format msgid "Unicode column line style is \"%s\".\n" -msgstr "Το στυλ περιγράμματος στήλης Unicode είναι “%s”.\n" +msgstr "Το στυλ περιγράμματος στήλης Unicode είναι «%s».\n" #: command.c:4644 #, c-format msgid "Unicode header line style is \"%s\".\n" -msgstr "Το στυλ περιγράμματος γραμμής κεφαλίδας Unicode είναι “%s”.\n" +msgstr "Το στυλ περιγράμματος γραμμής κεφαλίδας Unicode είναι «%s».\n" #: command.c:4877 #, c-format @@ -746,7 +749,7 @@ msgstr "" #: command.c:5199 #, c-format msgid "\"%s.%s\" is not a view" -msgstr "“%s.%s” δεν είναι μία όψη" +msgstr "«%s.%s» δεν είναι μία όψη" #: command.c:5215 #, c-format @@ -761,7 +764,7 @@ msgstr "δεν είναι δυνατή η διαφυγή χωρίς ενεργή #: common.c:200 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" -msgstr "παράμετρος της εντολής κελύφους περιέχει μια νέα γραμμή ή μια επιστροφή μεταφοράς: \"%s\"" +msgstr "παράμετρος της εντολής κελύφους περιέχει μια νέα γραμμή ή μια επιστροφή μεταφοράς: «%s»" #: common.c:304 #, c-format @@ -826,12 +829,12 @@ msgstr "μη αναμενόμενη κατάσταση αποτελέσματο #: common.c:694 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" -msgstr "Ελήφθει ασύγχρονη ειδοποίηση \"%s\" με ωφέλιμο φορτίο \"%s\" από τη διαδικασία διακομιστή με %d PID.\n" +msgstr "Ελήφθει ασύγχρονη ειδοποίηση «%s» με ωφέλιμο φορτίο «%s» από τη διαδικασία διακομιστή με %d PID.\n" #: common.c:697 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" -msgstr "Ελήφθει ασύγχρονη ειδοποίηση “%s” από τη διαδικασία διακομιστή με %d PID.\n" +msgstr "Ελήφθει ασύγχρονη ειδοποίηση «%s» από τη διαδικασία διακομιστή με %d PID.\n" #: common.c:730 common.c:747 #, c-format @@ -851,7 +854,7 @@ msgstr "περισσότερες από μία γραμμές επιστράφη #: common.c:791 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" -msgstr "αγνοείται η προσπάθεια να τεθεί \\gset στην ειδικά διαμορφωμένη μεταβλητή “%s”" +msgstr "αγνοείται η προσπάθεια να τεθεί \\gset στην ειδικά διαμορφωμένη μεταβλητή «%s»" #: common.c:1211 #, c-format @@ -903,7 +906,7 @@ msgstr "\\copy: παράμετροι επιβάλλονται" #: copy.c:253 #, c-format msgid "\\copy: parse error at \"%s\"" -msgstr "\\copy: σφάλμα ανάλυσης σε “%s”" +msgstr "\\copy: σφάλμα ανάλυσης σε «%s»" #: copy.c:255 #, c-format @@ -913,12 +916,12 @@ msgstr "\\copy: σφάλμα ανάλυσης στο τέλος γραμμής" #: copy.c:328 #, c-format msgid "could not execute command \"%s\": %m" -msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής “%s”: %m" +msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής «%s»: %m" #: copy.c:344 #, c-format msgid "could not stat file \"%s\": %m" -msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο “%s”: %m" +msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο «%s»: %m" #: copy.c:348 #, c-format @@ -993,7 +996,7 @@ msgstr "\\crosstabview: υπερβλήθηκε ο μέγιστος αριθμό #: crosstabview.c:397 #, c-format msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"" -msgstr "\\crosstabview: το αποτέλεσμα της ερώτησης περιλαμβάνει πολλαπλές τιμές δεδομένων για την σειρά “%s”, στήλη “%s”" +msgstr "\\crosstabview: το αποτέλεσμα της ερώτησης περιλαμβάνει πολλαπλές τιμές δεδομένων για την σειρά «%s», στήλη «%s»" #: crosstabview.c:645 #, c-format @@ -1003,12 +1006,12 @@ msgstr "\\crosstabview: αριθμός στήλης %d βρίσκεται εκτ #: crosstabview.c:670 #, c-format msgid "\\crosstabview: ambiguous column name: \"%s\"" -msgstr "\\crosstabview: αμφίσημο όνομα στήλης: “%s”" +msgstr "\\crosstabview: αμφίσημο όνομα στήλης: «%s»" #: crosstabview.c:678 #, c-format msgid "\\crosstabview: column name not found: \"%s\"" -msgstr "\\crosstabview: όνομα στήλης δεν βρέθηκε: “%s”" +msgstr "\\crosstabview: όνομα στήλης δεν βρέθηκε: «%s»" #: describe.c:76 describe.c:376 describe.c:728 describe.c:924 describe.c:1120 #: describe.c:1281 describe.c:1353 describe.c:4036 describe.c:4258 @@ -1111,7 +1114,7 @@ msgstr "\\df λαμβάνει μόνο [anptwS+] ως επιλογές" #: describe.c:344 describe.c:355 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" -msgstr "\\df δεν λαμβάνει την επιλογή “%c” στην έκδοση διακομιστή %s" +msgstr "\\df δεν λαμβάνει την επιλογή «%c» στην έκδοση διακομιστή %s" #. translator: "agg" is short for "aggregate" #: describe.c:392 describe.c:410 describe.c:456 describe.c:473 @@ -1331,7 +1334,7 @@ msgstr "Περιγραφές αντικειμένου" #: describe.c:1568 describe.c:4175 #, c-format msgid "Did not find any relation named \"%s\"." -msgstr "Δεν βρέθηκε καμία σχέση με όνομα “%s”." +msgstr "Δεν βρέθηκε καμία σχέση με όνομα «%s»." #: describe.c:1571 describe.c:4178 #, c-format @@ -1390,82 +1393,82 @@ msgstr "Ακολουθία για τη στήλη ταυτότητας: %s" #: describe.c:1964 #, c-format msgid "Sequence \"%s.%s\"" -msgstr "Ακολουθία “%s.%s”" +msgstr "Ακολουθία «%s.%s»" #: describe.c:2111 #, c-format msgid "Unlogged table \"%s.%s\"" -msgstr "Ακαταχώρητος πίνακας “%s.%s”" +msgstr "Ακαταχώρητος πίνακας «%s.%s»" #: describe.c:2114 #, c-format msgid "Table \"%s.%s\"" -msgstr "Πίνακας “%s.%s”" +msgstr "Πίνακας «%s.%s»" #: describe.c:2118 #, c-format msgid "View \"%s.%s\"" -msgstr "Όψη “%s.%s”" +msgstr "Όψη «%s.%s»" #: describe.c:2123 #, c-format msgid "Unlogged materialized view \"%s.%s\"" -msgstr "Ακαταχώρητη υλοποιημένη όψη “%s.%s”" +msgstr "Ακαταχώρητη υλοποιημένη όψη «%s.%s»" #: describe.c:2126 #, c-format msgid "Materialized view \"%s.%s\"" -msgstr "Υλοποιημένη όψη “%s.%s”" +msgstr "Υλοποιημένη όψη «%s.%s»" #: describe.c:2131 #, c-format msgid "Unlogged index \"%s.%s\"" -msgstr "Ακαταχώρητο ευρετήριο “%s.%s”" +msgstr "Ακαταχώρητο ευρετήριο «%s.%s»" #: describe.c:2134 #, c-format msgid "Index \"%s.%s\"" -msgstr "Ευρετήριο “%s.%s”" +msgstr "Ευρετήριο «%s.%s»" #: describe.c:2139 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" -msgstr "Ακαταχώρητο κατατετμημένο ευρετήριο “%s.%s”" +msgstr "Ακαταχώρητο κατατετμημένο ευρετήριο «%s.%s»" #: describe.c:2142 #, c-format msgid "Partitioned index \"%s.%s\"" -msgstr "Κατατετμημένο ευρετήριο “%s.%s”" +msgstr "Κατατετμημένο ευρετήριο «%s.%s»" #: describe.c:2147 #, c-format msgid "Special relation \"%s.%s\"" -msgstr "Ειδική σχέση “%s.%s”" +msgstr "Ειδική σχέση «%s.%s»" #: describe.c:2151 #, c-format msgid "TOAST table \"%s.%s\"" -msgstr "TOAST πίνακας “%s.%s”" +msgstr "TOAST πίνακας «%s.%s»" #: describe.c:2155 #, c-format msgid "Composite type \"%s.%s\"" -msgstr "Συνθετικός τύπος “%s.%s”" +msgstr "Συνθετικός τύπος «%s.%s»" #: describe.c:2159 #, c-format msgid "Foreign table \"%s.%s\"" -msgstr "Ξενικός πίνακας “%s.%s”" +msgstr "Ξενικός πίνακας «%s.%s»" #: describe.c:2164 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" -msgstr "Ακαταχώρητος κατατετμημένος πίνακας “%s.%s”" +msgstr "Ακαταχώρητος κατατετμημένος πίνακας «%s.%s»" #: describe.c:2167 #, c-format msgid "Partitioned table \"%s.%s\"" -msgstr "Κατατετμημένος πίνακας “%s.%s”" +msgstr "Κατατετμημένος πίνακας «%s.%s»" #: describe.c:2183 describe.c:4502 msgid "Collation" @@ -1497,20 +1500,17 @@ msgid "Storage" msgstr "Αποθήκευση" #: describe.c:2196 -#, fuzzy -#| msgid "expression" msgid "Compression" -msgstr "expression" +msgstr "Συμπίεση" #: describe.c:2198 msgid "Stats target" msgstr "Στόχος στατιστικών" #: describe.c:2334 -#, fuzzy, c-format -#| msgid "Partition of: %s %s" +#, c-format msgid "Partition of: %s %s%s" -msgstr "Κατάτμηση του: %s %s" +msgstr "Κατάτμηση του: %s %s%s" #: describe.c:2347 msgid "No partition constraint" @@ -1529,11 +1529,11 @@ msgstr "Κλειδί κατάτμησης: %s" #: describe.c:2399 #, c-format msgid "Owning table: \"%s.%s\"" -msgstr "Ιδιοκτήτης πίνακα “%s.%s”" +msgstr "Ιδιοκτήτης πίνακα «%s.%s»" #: describe.c:2470 msgid "primary key, " -msgstr "Κύριο κλειδί, " +msgstr "κύριο κλειδί, " #: describe.c:2472 msgid "unique, " @@ -1542,7 +1542,7 @@ msgstr "μοναδικό, " #: describe.c:2478 #, c-format msgid "for table \"%s.%s\"" -msgstr "για πίνακα “%s.%s”" +msgstr "για πίνακα «%s.%s»" #: describe.c:2482 #, c-format @@ -1611,7 +1611,7 @@ msgstr "Αντικείμενα στατιστικών:" #: describe.c:3120 describe.c:3224 msgid "Rules:" -msgstr "Κανόνες" +msgstr "Κανόνες:" #: describe.c:3123 msgid "Disabled rules:" @@ -1715,14 +1715,14 @@ msgstr "Μέθοδος πρόσβασης: %s" #: describe.c:3710 #, c-format msgid "Tablespace: \"%s\"" -msgstr "Χώρος πινάκα: “%s”" +msgstr "Χώρος πινάκα: «%s»" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' #: describe.c:3722 #, c-format msgid ", tablespace \"%s\"" -msgstr ", χώρος πίνακα “%s”" +msgstr ", χώρος πίνακα «%s»" #: describe.c:3815 msgid "List of roles" @@ -1803,12 +1803,12 @@ msgstr "Ρυθμίσεις" #: describe.c:3958 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." -msgstr "Δεν βρέθηκαν ρυθμίσεις για το ρόλο \"%s\" και τη βάση δεδομένων \"%s\"." +msgstr "Δεν βρέθηκαν ρυθμίσεις για το ρόλο «%s» και τη βάση δεδομένων «%s»." #: describe.c:3961 #, c-format msgid "Did not find any settings for role \"%s\"." -msgstr "Δεν βρέθηκαν ρυθμίσεις για το ρόλο “%s”." +msgstr "Δεν βρέθηκαν ρυθμίσεις για το ρόλο «%s»." #: describe.c:3964 #, c-format @@ -1828,10 +1828,8 @@ msgid "special" msgstr "ειδικό" #: describe.c:4044 -#, fuzzy -#| msgid "TOAST table \"%s.%s\"" msgid "TOAST table" -msgstr "TOAST πίνακας “%s.%s”" +msgstr "TOAST πίνακας" #: describe.c:4047 describe.c:4270 msgid "partitioned index" @@ -1854,10 +1852,8 @@ msgid "Persistence" msgstr "Διάρκεια" #: describe.c:4091 -#, fuzzy -#| msgid "Access method: %s" msgid "Access method" -msgstr "Μέθοδος πρόσβασης: %s" +msgstr "Μέθοδος πρόσβασης" #: describe.c:4183 msgid "List of relations" @@ -1973,28 +1969,25 @@ msgid "List of event triggers" msgstr "Λίστα ενεργοποιήσεων συμβάντων" #: describe.c:4720 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support extensions." +#, c-format msgid "The server (version %s) does not support extended statistics." -msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει επεκτάσεις." +msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει εκτεταμένες στατιστικές." #: describe.c:4757 msgid "Ndistinct" -msgstr "" +msgstr "Ndistinct" #: describe.c:4758 msgid "Dependencies" -msgstr "" +msgstr "Dependencies" #: describe.c:4768 msgid "MCV" -msgstr "" +msgstr "MCV" #: describe.c:4787 -#, fuzzy -#| msgid "define extended statistics" msgid "List of extended statistics" -msgstr "ορίστε εκτεταμένα στατιστικά στοιχεία" +msgstr "Λίστα εκτεταμένων στατιστικών" #: describe.c:4814 msgid "Source type" @@ -2049,7 +2042,7 @@ msgstr "Λίστα αναλυτών αναζήτησης κειμένου" #: describe.c:5166 #, c-format msgid "Did not find any text search parser named \"%s\"." -msgstr "Δεν βρήκε ανάλυση αναζήτησης κειμένου με το όνομα \"%s\"." +msgstr "Δεν βρήκε ανάλυση αναζήτησης κειμένου με το όνομα «%s»." #: describe.c:5169 #, c-format @@ -2083,12 +2076,12 @@ msgstr "Λήψη τύπων ενδεικτικών" #: describe.c:5266 #, c-format msgid "Text search parser \"%s.%s\"" -msgstr "Αναλυτής αναζήτης κειμένου “%s.%s”" +msgstr "Αναλυτής αναζήτης κειμένου «%s.%s»" #: describe.c:5269 #, c-format msgid "Text search parser \"%s\"" -msgstr "Αναλυτής αναζήτης κειμένου “%s”" +msgstr "Αναλυτής αναζήτης κειμένου «%s»" #: describe.c:5288 msgid "Token name" @@ -2097,12 +2090,12 @@ msgstr "Ονομασία ενδεικτικού" #: describe.c:5299 #, c-format msgid "Token types for parser \"%s.%s\"" -msgstr "Τύποι ενδεικτικών αναλυτή “%s.%s”" +msgstr "Τύποι ενδεικτικών αναλυτή «%s.%s»" #: describe.c:5302 #, c-format msgid "Token types for parser \"%s\"" -msgstr "Τύποι ενδεικτικών αναλυτή “%s”" +msgstr "Τύποι ενδεικτικών αναλυτή «%s»" #: describe.c:5356 msgid "Template" @@ -2135,7 +2128,7 @@ msgstr "Λίστα ρυθμίσεων αναζήτησης κειμένου" #: describe.c:5556 #, c-format msgid "Did not find any text search configuration named \"%s\"." -msgstr "Δεν βρέθηκαν ρυθμίσεις αναζήτησης κειμένου με όνομα “%s”." +msgstr "Δεν βρέθηκαν ρυθμίσεις αναζήτησης κειμένου με όνομα «%s»." #: describe.c:5559 #, c-format @@ -2153,12 +2146,12 @@ msgstr "Λεξικά" #: describe.c:5637 #, c-format msgid "Text search configuration \"%s.%s\"" -msgstr "Ρύθμιση αναζήτησης κειμένου “%s.%s”" +msgstr "Ρύθμιση αναζήτησης κειμένου «%s.%s»" #: describe.c:5640 #, c-format msgid "Text search configuration \"%s\"" -msgstr "Ρύθμιση αναζήτησης κειμένου “%s”" +msgstr "Ρύθμιση αναζήτησης κειμένου «%s»" #: describe.c:5644 #, c-format @@ -2167,7 +2160,7 @@ msgid "" "Parser: \"%s.%s\"" msgstr "" "\n" -"Αναλυτής: “%s.%s”" +"Αναλυτής: «%s.%s»" #: describe.c:5647 #, c-format @@ -2176,7 +2169,7 @@ msgid "" "Parser: \"%s\"" msgstr "" "\n" -"Αναλυτής: “%s”" +"Αναλυτής: «%s»" #: describe.c:5681 #, c-format @@ -2242,7 +2235,7 @@ msgstr "Λίστα εγκατεστημένων επεκτάσεων" #: describe.c:6070 #, c-format msgid "Did not find any extension named \"%s\"." -msgstr "Δεν βρέθηκε καμία επέκταση με το όνομα \"%s\"." +msgstr "Δεν βρέθηκε καμία επέκταση με το όνομα «%s»." #: describe.c:6073 #, c-format @@ -2256,7 +2249,7 @@ msgstr "Περιγραφή αντικειμένου" #: describe.c:6127 #, c-format msgid "Objects in extension \"%s\"" -msgstr "Αντικείμενα στην επέκταση \"%s\"" +msgstr "Αντικείμενα στην επέκταση «%s»" #: describe.c:6156 describe.c:6232 #, c-format @@ -2294,7 +2287,7 @@ msgstr "Λίστα δημοσιεύσεων" #: describe.c:6274 #, c-format msgid "Did not find any publication named \"%s\"." -msgstr "Δεν βρέθηκε καμία δημοσίευση με όνομα \"%s\"." +msgstr "Δεν βρέθηκε καμία δημοσίευση με όνομα «%s»." #: describe.c:6277 #, c-format @@ -2321,11 +2314,11 @@ msgstr "Δημοσίευση" #: describe.c:6423 msgid "Binary" -msgstr "" +msgstr "Δυαδικό" #: describe.c:6424 msgid "Streaming" -msgstr "" +msgstr "Ροής" #: describe.c:6429 msgid "Synchronous commit" @@ -2381,7 +2374,7 @@ msgstr "Στρατηγική" #: describe.c:6696 msgid "ordering" -msgstr "Διάταξη" +msgstr "διάταξη" #: describe.c:6697 msgid "search" @@ -2435,7 +2428,7 @@ msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" msgstr "" -" psql [OPTION]… [DBNAME [USERNAME]]\n" +" psql [ΕΠΙΛΟΓΗ]... [DBNAME [USERNAME]]\n" "\n" #: help.c:77 @@ -2446,22 +2439,22 @@ msgstr "Γενικές επιλογές:\n" #: help.c:82 #, c-format msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" -msgstr " -c, —command=COMMAND εκτέλεσε μόνο μία μονή εντολή (SQL ή εσωτερική) και, στη συνέχεια, εξέλθετε\n" +msgstr " -c, --command=COMMAND εκτέλεσε μόνο μία μονή εντολή (SQL ή εσωτερική) και έξελθε\n" #: help.c:83 #, c-format msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" -msgstr " -d, —dbname=DBNAME ονομασία βάσης δεδομένων στην οποία θα συνδεθείτε (προεπιλογή: “%s”)\n" +msgstr " -d, --dbname=DBNAME ονομασία βάσης δεδομένων στην οποία θα συνδεθείτε (προεπιλογή: «%s»)\n" #: help.c:84 #, c-format msgid " -f, --file=FILENAME execute commands from file, then exit\n" -msgstr " -f, —file=FILENAME εκτέλεσε εντολές από αρχείο και, στη συνέχεια, έξοδος\n" +msgstr " -f, --file=FILENAME εκτέλεσε εντολές από αρχείο, στη συνέχεια έξοδος\n" #: help.c:85 #, c-format msgid " -l, --list list available databases, then exit\n" -msgstr " -l, —list απαρίθμησε τις διαθέσιμες βάσεις δεδομένων και, στη συνέχεια, έξοδος\n" +msgstr " -l, --list απαρίθμησε τις διαθέσιμες βάσεις δεδομένων, στη συνέχεια έξοδος\n" #: help.c:86 #, c-format @@ -2470,14 +2463,14 @@ msgid "" " set psql variable NAME to VALUE\n" " (e.g., -v ON_ERROR_STOP=1)\n" msgstr "" -" -v, —set=, —variable=NAME=VALUE\n" +" -v, --set=, --variable=NAME=VALUE\n" " όρισε την μεταβλητή της psql NAME στην τιμή VALUE\n" " (π.χ., -v ON_ERROR_STOP=1)\n" #: help.c:89 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, —version εμφάνισε πληροφορίες έκδοσης και, στη συνέχεια, έξοδος\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" #: help.c:90 #, c-format @@ -2490,23 +2483,23 @@ msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" msgstr "" -" -1 (“one”), —single-transaction\n" +" -1 («one»), --single-transaction\n" " εκτέλεσε ως μεμονωμένη συναλλαγή (εάν δεν είναι διαδραστική)\n" #: help.c:93 #, c-format msgid " -?, --help[=options] show this help, then exit\n" -msgstr " -?, —help[=options] εμφάνισε αυτής της βοήθειας και, στη συνέχεια, έξοδος\n" +msgstr " -?, --help[=options] εμφάνισε αυτής της βοήθειας και, στη συνέχεια, έξοδος\n" #: help.c:94 #, c-format msgid " --help=commands list backslash commands, then exit\n" -msgstr " —help=commands απαρίθμησε τις εντολές ανάποδης καθέτου και, στη συνέχεια, έξοδος\n" +msgstr " --help=commands απαρίθμησε τις εντολές ανάποδης καθέτου και, στη συνέχεια, έξοδος\n" #: help.c:95 #, c-format msgid " --help=variables list special variables, then exit\n" -msgstr " —help=variables απαρίθμησε τις ειδικές μεταβλητές και, στη συνέχεια, έξοδος\n" +msgstr " --help=variables απαρίθμησε τις ειδικές μεταβλητές και, στη συνέχεια, έξοδος\n" #: help.c:97 #, c-format @@ -2520,52 +2513,52 @@ msgstr "" #: help.c:98 #, c-format msgid " -a, --echo-all echo all input from script\n" -msgstr " -a, —echo-all echo όλη την είσοδο από σενάριο\n" +msgstr " -a, --echo-all echo όλη την είσοδο από σενάριο\n" #: help.c:99 #, c-format msgid " -b, --echo-errors echo failed commands\n" -msgstr " -b, —echo-errors echo όλες τις αποτυχημένες εντολές\n" +msgstr " -b, --echo-errors echo όλες τις αποτυχημένες εντολές\n" #: help.c:100 #, c-format msgid " -e, --echo-queries echo commands sent to server\n" -msgstr " -e, —echo-queries echo τις εντολές που αποστέλλονται στο διακομιστή\n" +msgstr " -e, --echo-queries echo τις εντολές που αποστέλλονται στο διακομιστή\n" #: help.c:101 #, c-format msgid " -E, --echo-hidden display queries that internal commands generate\n" -msgstr " -E, —echo-hidden εμφάνισε ερωτήματα που δημιουργούνται από εσωτερικές εντολές\n" +msgstr " -E, --echo-hidden εμφάνισε ερωτήματα που δημιουργούνται από εσωτερικές εντολές\n" #: help.c:102 #, c-format msgid " -L, --log-file=FILENAME send session log to file\n" -msgstr " -L, —log-file=FILENAME στείλε την καταγραφή της συνεδρίας στο αρχείο\n" +msgstr " -L, --log-file=FILENAME στείλε την καταγραφή της συνεδρίας στο αρχείο\n" #: help.c:103 #, c-format msgid " -n, --no-readline disable enhanced command line editing (readline)\n" -msgstr " -n, —no-readline απενεργοποιήσε την βελτιωμένη επεξεργασία γραμμής εντολών (readline)\n" +msgstr " -n, --no-readline απενεργοποιήσε την βελτιωμένη επεξεργασία γραμμής εντολών (readline)\n" #: help.c:104 #, c-format msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" -msgstr " -o, —output=FILENAME στείλε τα αποτελέσματα ερωτημάτων σε αρχείο (ή |pipe)\n" +msgstr " -o, --output=FILENAME στείλε τα αποτελέσματα ερωτημάτων σε αρχείο (ή |pipe)\n" #: help.c:105 #, c-format msgid " -q, --quiet run quietly (no messages, only query output)\n" -msgstr " -q, —quiet εκτέλεσε σιωπηλά (καθόλου μηνύματα, μόνο έξοδος ερωτημάτων)\n" +msgstr " -q, --quiet εκτέλεσε σιωπηλά (καθόλου μηνύματα, μόνο έξοδος ερωτημάτων)\n" #: help.c:106 #, c-format msgid " -s, --single-step single-step mode (confirm each query)\n" -msgstr " -s, —single-step λειτουργία μονού βήματος (επιβεβαίωσε κάθε ερώτημα)\n" +msgstr " -s, --single-step λειτουργία μονού βήματος (επιβεβαίωσε κάθε ερώτημα)\n" #: help.c:107 #, c-format msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" -msgstr " -S, —single-line λειτουργία μονής γραμμής (το τέλος της γραμμής τερματίζει την εντολή SQL)\n" +msgstr " -S, --single-line λειτουργία μονής γραμμής (το τέλος της γραμμής τερματίζει την εντολή SQL)\n" #: help.c:109 #, c-format @@ -2579,12 +2572,12 @@ msgstr "" #: help.c:110 #, c-format msgid " -A, --no-align unaligned table output mode\n" -msgstr " -A, —no-align λειτουργία εξόδου πίνακα μη ευθυγραμμισμένη λειτουργία εξόδου πίνακα\n" +msgstr " -A, --no-align λειτουργία εξόδου πίνακα μη ευθυγραμμισμένη λειτουργία εξόδου πίνακα\n" #: help.c:111 #, c-format msgid " --csv CSV (Comma-Separated Values) table output mode\n" -msgstr " —csv λειτουργία εξόδου πίνακα CSV (τιμές διαχωρισμένες με κόμματα)\n" +msgstr " --csv λειτουργία εξόδου πίνακα CSV (τιμές διαχωρισμένες με κόμματα)\n" #: help.c:112 #, c-format @@ -2592,13 +2585,13 @@ msgid "" " -F, --field-separator=STRING\n" " field separator for unaligned output (default: \"%s\")\n" msgstr "" -" -F, —field-separator=STRING\n" +" -F, --field-separator=STRING\n" " διαχωριστικό πεδίου για μη ευθυγραμμισμένη έξοδο (προεπιλογή: \"%s\")\n" #: help.c:115 #, c-format msgid " -H, --html HTML table output mode\n" -msgstr " -H, —html λειτουργία εξόδου πίνακα HTML\n" +msgstr " -H, --html λειτουργία εξόδου πίνακα HTML\n" #: help.c:116 #, c-format @@ -2611,23 +2604,23 @@ msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" msgstr "" -" -R, —record-separator=STRING\n" +" -R, --record-separator=STRING\n" " διαχωριστικό εγγραφών για μη ευθυγραμμισμένη έξοδο (προεπιλογή: νέα γραμμή)\n" #: help.c:119 #, c-format msgid " -t, --tuples-only print rows only\n" -msgstr " -t, —tuples-only εκτύπωσε μόνο γραμμές\n" +msgstr " -t, --tuples-only εκτύπωσε μόνο γραμμές\n" #: help.c:120 #, c-format msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" -msgstr " -T, —table-attr=TEXT όρισε τα χαρακτηριστικά ετικετών πίνακα HTML (π.χ. πλάτος, περίγραμμα)\n" +msgstr " -T, --table-attr=TEXT όρισε τα χαρακτηριστικά ετικετών πίνακα HTML (π.χ. πλάτος, περίγραμμα)\n" #: help.c:121 #, c-format msgid " -x, --expanded turn on expanded table output\n" -msgstr " -x, —expanded ενεργοποίησε λειτουργία εκτεταμένης εξόδου πίνακα\n" +msgstr " -x, --expanded ενεργοποίησε λειτουργία εκτεταμένης εξόδου πίνακα\n" #: help.c:122 #, c-format @@ -2635,7 +2628,7 @@ msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" msgstr "" -" -z, —field-separator-zero\n" +" -z, --field-separator-zero\n" " όρισε το διαχωριστικό πεδίου για μη ευθυγραμμισμένη έξοδο στο μηδενικό byte\n" #: help.c:124 @@ -2644,7 +2637,7 @@ msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" msgstr "" -" -0, —record-separator-zero\n" +" -0, --record-separator-zero\n" " όρισε το διαχωριστικό εγγραφών για μη ευθυγραμμισμένη έξοδο στο μηδενικό byte\n" #: help.c:127 @@ -2659,7 +2652,7 @@ msgstr "" #: help.c:130 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" -msgstr " -h, —host=HOSTNAME κεντρικός υπολογιστής διακομιστή βάσης δεδομένων ή κατάλογος υποδοχών (προεπιλογή: \"%s\")\n" +msgstr " -h, --host=HOSTNAME κεντρικός υπολογιστής διακομιστή βάσης δεδομένων ή κατάλογος υποδοχών (προεπιλογή: «%s»)\n" #: help.c:131 msgid "local socket" @@ -2668,22 +2661,22 @@ msgstr "τοπική υποδοχή" #: help.c:134 #, c-format msgid " -p, --port=PORT database server port (default: \"%s\")\n" -msgstr " -p, —port=PORT θύρα διακομιστή βάσης δεδομένων (προεπιλογή: \"%s\")\n" +msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων (προεπιλογή: «%s»)\n" #: help.c:137 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" -msgstr " -U, —username=USERNAME όνομα χρήστη βάσης δεδομένων (προεπιλογή: \"%s\")\n" +msgstr " -U, --username=USERNAME όνομα χρήστη βάσης δεδομένων (προεπιλογή: «%s»)\n" #: help.c:138 #, c-format msgid " -w, --no-password never prompt for password\n" -msgstr " -w, —no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n" +msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n" #: help.c:139 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" -msgstr " -W, —password αναγκαστική προτροπή κωδικού πρόσβασης (πρέπει να συμβεί αυτόματα)\n" +msgstr " -W, --password αναγκαστική προτροπή κωδικού πρόσβασης (πρέπει να συμβεί αυτόματα)\n" #: help.c:141 #, c-format @@ -2695,7 +2688,7 @@ msgid "" "\n" msgstr "" "\n" -"Για περισσότερες πληροφορίες, πληκτρολογήστε \"\\?\" (για εσωτερικές εντολές) ή “\\help” (για SQL\n" +"Για περισσότερες πληροφορίες, πληκτρολογήστε \"\\?\" (για εσωτερικές εντολές) ή «\\help» (για SQL\n" "εντολές) μέσα από το psql, ή συμβουλευτείτε την ενότητα psql στην τεκμηρίωση της PostgreSQL\n" "\n" @@ -2841,7 +2834,7 @@ msgstr "Είσοδος/Έξοδος\n" #: help.c:206 #, c-format msgid " \\copy ... perform SQL COPY with data stream to the client host\n" -msgstr " \\copy … εκτέλεσε SQL COPY με ροή δεδομένων σε διακομιστή πελάτη\n" +msgstr " \\copy ... εκτέλεσε SQL COPY με ροή δεδομένων σε διακομιστή πελάτη\n" #: help.c:207 #, c-format @@ -2945,8 +2938,8 @@ msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] απαρίθμησε χειριστές #: help.c:231 #, c-format -msgid " \\dAp [AMPTRN [OPFPTRN]] list support functions of operator families\n" -msgstr " \\dAp [AMPTRN [OPFPTRN]] απαρίθμησε συναρτήσεις των οικογενειών χειριστών\n" +msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" +msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] απαρίθμησε συναρτήσεις των οικογενειών χειριστών\n" #: help.c:232 #, c-format @@ -2985,13 +2978,13 @@ msgstr " \\dE[S+] [PATTERN] απαρίθμησε ξενικούς πίνα #: help.c:239 #, c-format -msgid " \\det[+] [PATTERN] list foreign tables\n" -msgstr " \\det[+] [PATTERN] απαρίθμησε ξενικούς πίνακες\n" +msgid " \\des[+] [PATTERN] list foreign servers\n" +msgstr " \\des[+] [PATTERN] απαρίθμησε ξενικούς διακομιστές\n" #: help.c:240 #, c-format -msgid " \\des[+] [PATTERN] list foreign servers\n" -msgstr " \\des[+] [PATTERN] απαρίθμησε ξενικούς διακομιστές\n" +msgid " \\det[+] [PATTERN] list foreign tables\n" +msgstr " \\det[+] [PATTERN] απαρίθμησε ξενικούς πίνακες\n" #: help.c:241 #, c-format @@ -3004,12 +2997,13 @@ msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [PATTERN] απαρίθμησε περιτυλίξεις ξένων δεδομένων\n" #: help.c:243 -#, fuzzy, c-format -#| msgid " \\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions\n" +#, c-format msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" -msgstr " \\df[anptw][S+] [PATRN] απαρίθμησε συναρτήσεις [μόνο agg/normal/procedures/trigger/window]\n" +msgstr "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN …]]\n" +" απαρίθμησε συναρτήσεις [μόνο agg/normal/procedures/trigger/window]\n" #: help.c:245 #, c-format @@ -3062,12 +3056,13 @@ msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [PATTERN] απαρίθμησε σχήματα\n" #: help.c:255 -#, fuzzy, c-format -#| msgid " \\do[S] [PATTERN] list operators\n" +#, c-format msgid "" -" \\do[S] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" -msgstr " \\do[S] [PATTERN] απαρίθμησε χειριστές\n" +msgstr "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" απαρίθμησε χειριστές\n" #: help.c:257 #, c-format @@ -3086,8 +3081,8 @@ msgstr " \\dP[itn+] [PATTERN] απαρίθμησε διαχωρισμένε #: help.c:260 #, c-format -msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" -msgstr " \\drds [PATRN1 [PATRN2]] απαρίθμησε ρυθμίσεις ρόλου ανά βάση δεδομένων\n" +msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" +msgstr " \\drds [ROLEPTRN [DBPTRN]] απαρίθμησε ρυθμίσεις ρόλου ανά βάση δεδομένων\n" #: help.c:261 #, c-format @@ -3130,15 +3125,14 @@ msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [PATTERN] απαρίθμησε προεκτάσεις\n" #: help.c:269 -#, fuzzy, c-format -#| msgid " \\dy [PATTERN] list event triggers\n" +#, c-format msgid " \\dX [PATTERN] list extended statistics\n" -msgstr " \\dy [PATTERN] απαρίθμησε εναύσματα συμβάντων\n" +msgstr " \\dX [PATTERN] απαρίθμησε εναύσματα συμβάντων\n" #: help.c:270 #, c-format -msgid " \\dy [PATTERN] list event triggers\n" -msgstr " \\dy [PATTERN] απαρίθμησε εναύσματα συμβάντων\n" +msgid " \\dy[+] [PATTERN] list event triggers\n" +msgstr " \\dy[+] [PATTERN] απαρίθμησε εναύσματα συμβάντων\n" #: help.c:271 #, c-format @@ -3212,7 +3206,7 @@ msgstr " \\t [on|off] εμφάνισε μόνο γραμμές (επ #: help.c:292 #, c-format msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" -msgstr "\\T [STRING] ορίστε χαρακτηριστικά ετικέτας πίνακα HTML, ή αναίρεσε εάν δεν υπάρχουν\n" +msgstr " \\T [STRING] ορίστε χαρακτηριστικά ετικέτας
HTML, ή αναιρέστε εάν δεν υπάρχουν\n" #: help.c:293 #, c-format @@ -3231,7 +3225,7 @@ msgid "" " connect to new database (currently \"%s\")\n" msgstr "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" -" σύνδεση σε νέα βάση δεδομένων (επί του παρόντος “%s”)\n" +" σύνδεση σε νέα βάση δεδομένων (επί του παρόντος «%s»)\n" #: help.c:303 #, c-format @@ -3250,7 +3244,7 @@ msgstr " \\conninfo εμφάνιση πληροφοριών σχε #: help.c:306 #, c-format msgid " \\encoding [ENCODING] show or set client encoding\n" -msgstr " -E, —encoding=ENCODING εμφάνισε ή όρισε την κωδικοποίηση του πελάτη\n" +msgstr " \\encoding [ENCODING] εμφάνισε ή όρισε την κωδικοποίηση του πελάτη\n" #: help.c:307 #, c-format @@ -3341,7 +3335,7 @@ msgid "" " or \\set NAME VALUE inside psql\n" "\n" msgstr "" -" psql —set=NAME=VALUE\n" +" psql --set=NAME=VALUE\n" " ή \\set NAME VALUE μέσα σε psql\n" "\n" @@ -3434,16 +3428,13 @@ msgstr "" " εάν έχει οριστεί, δεν εμφανίζονται μέθοδοι πρόσβασης πίνακα\n" #: help.c:379 -#, fuzzy, c-format -#| msgid "" -#| " HIDE_TABLEAM\n" -#| " if set, table access methods are not displayed\n" +#, c-format msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" msgstr "" -" HIDE_TABLEAM\n" -" εάν έχει οριστεί, δεν εμφανίζονται μέθοδοι πρόσβασης πίνακα\n" +" HIDE_TOAST_COMPRESSION\n" +" εάν έχει οριστεί, δεν εμφανίζονται μέθοδοι συμπίεσης\n" #: help.c:381 #, c-format @@ -3627,7 +3618,7 @@ msgid "" " SQLSTATE of last query, or \"00000\" if no error\n" msgstr "" " SQLSTATE\n" -" SQLSTATE του τελευταίου ερωτήματος, ή “00000” εάν δεν υπήρξαν σφάλματα\n" +" SQLSTATE του τελευταίου ερωτήματος, ή «00000» εάν δεν υπήρξαν σφάλματα\n" #: help.c:423 #, c-format @@ -3676,7 +3667,7 @@ msgid "" " or \\pset NAME [VALUE] inside psql\n" "\n" msgstr "" -" psql —set=NAME=VALUE\n" +" psql --set=NAME=VALUE\n" " ή \\set NAME VALUE μέσα σε συνεδρία psql\n" "\n" @@ -3714,7 +3705,7 @@ msgid "" " field separator for unaligned output (default \"%s\")\n" msgstr "" " fieldsep\n" -" διαχωριστικό πεδίου σε μορφή μή ευθυγραμισμένης εξόδου (προκαθοριμένο “%s”)\n" +" διαχωριστικό πεδίου σε μορφή μή ευθυγραμισμένης εξόδου (προκαθοριμένο «%s»)\n" #: help.c:445 #, c-format @@ -3767,7 +3758,7 @@ msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" msgstr "" -"numericlocale\n" +" numericlocale\n" " ενεργοποίηση εμφάνισης ενός χαρακτήρα εντοπιότητας για το διαχωρισμό ομάδων ψηφίων\n" #: help.c:457 @@ -4047,7 +4038,7 @@ msgstr "δεν ήταν δυνατή η ανάγνωση από αρχείο: %m #: input.c:471 input.c:509 #, c-format msgid "could not save history to file \"%s\": %m" -msgstr "δεν ήταν δυνατή η αποθήκευση του ιστορικού στο αρχείο “%s”: %m" +msgstr "δεν ήταν δυνατή η αποθήκευση του ιστορικού στο αρχείο «%s»: %m" #: input.c:528 #, c-format @@ -4085,7 +4076,7 @@ msgstr "\\if: με διαφυγή" #: mainloop.c:195 #, c-format msgid "Use \"\\q\" to leave %s.\n" -msgstr "Χρησιμοποιείστε “\\q” για να εξέλθετε %s.\n" +msgstr "Χρησιμοποιείστε «\\q» για να εξέλθετε %s.\n" #: mainloop.c:217 msgid "" @@ -4124,7 +4115,7 @@ msgstr "" #: mainloop.c:329 msgid "Use \\q to quit." -msgstr "Χρησιμοποιείστε “\\q” για να εξέλθετε." +msgstr "Χρησιμοποιείστε «\\q» για να εξέλθετε." #: mainloop.c:332 mainloop.c:356 msgid "Use control-D to quit." @@ -4162,25 +4153,25 @@ msgstr "%s: έλλειψη μνήμης" #: sql_help.c:249 sql_help.c:251 sql_help.c:263 sql_help.c:264 sql_help.c:265 #: sql_help.c:267 sql_help.c:316 sql_help.c:318 sql_help.c:320 sql_help.c:322 #: sql_help.c:391 sql_help.c:396 sql_help.c:398 sql_help.c:440 sql_help.c:442 -#: sql_help.c:445 sql_help.c:447 sql_help.c:515 sql_help.c:520 sql_help.c:525 -#: sql_help.c:530 sql_help.c:535 sql_help.c:589 sql_help.c:591 sql_help.c:593 -#: sql_help.c:595 sql_help.c:597 sql_help.c:600 sql_help.c:602 sql_help.c:605 -#: sql_help.c:616 sql_help.c:618 sql_help.c:660 sql_help.c:662 sql_help.c:664 -#: sql_help.c:667 sql_help.c:669 sql_help.c:671 sql_help.c:706 sql_help.c:710 -#: sql_help.c:714 sql_help.c:733 sql_help.c:736 sql_help.c:739 sql_help.c:768 -#: sql_help.c:780 sql_help.c:788 sql_help.c:791 sql_help.c:794 sql_help.c:809 -#: sql_help.c:812 sql_help.c:841 sql_help.c:846 sql_help.c:851 sql_help.c:856 -#: sql_help.c:861 sql_help.c:883 sql_help.c:885 sql_help.c:887 sql_help.c:889 -#: sql_help.c:892 sql_help.c:894 sql_help.c:936 sql_help.c:980 sql_help.c:985 -#: sql_help.c:990 sql_help.c:995 sql_help.c:1000 sql_help.c:1019 -#: sql_help.c:1030 sql_help.c:1032 sql_help.c:1051 sql_help.c:1061 -#: sql_help.c:1063 sql_help.c:1065 sql_help.c:1077 sql_help.c:1081 -#: sql_help.c:1083 sql_help.c:1095 sql_help.c:1097 sql_help.c:1099 -#: sql_help.c:1101 sql_help.c:1119 sql_help.c:1121 sql_help.c:1125 -#: sql_help.c:1129 sql_help.c:1133 sql_help.c:1136 sql_help.c:1137 -#: sql_help.c:1138 sql_help.c:1141 sql_help.c:1143 sql_help.c:1279 -#: sql_help.c:1281 sql_help.c:1284 sql_help.c:1287 sql_help.c:1289 -#: sql_help.c:1291 sql_help.c:1294 sql_help.c:1297 sql_help.c:1411 +#: sql_help.c:445 sql_help.c:447 sql_help.c:516 sql_help.c:521 sql_help.c:526 +#: sql_help.c:531 sql_help.c:536 sql_help.c:590 sql_help.c:592 sql_help.c:594 +#: sql_help.c:596 sql_help.c:598 sql_help.c:601 sql_help.c:603 sql_help.c:606 +#: sql_help.c:617 sql_help.c:619 sql_help.c:661 sql_help.c:663 sql_help.c:665 +#: sql_help.c:668 sql_help.c:670 sql_help.c:672 sql_help.c:707 sql_help.c:711 +#: sql_help.c:715 sql_help.c:734 sql_help.c:737 sql_help.c:740 sql_help.c:769 +#: sql_help.c:781 sql_help.c:789 sql_help.c:792 sql_help.c:795 sql_help.c:810 +#: sql_help.c:813 sql_help.c:842 sql_help.c:847 sql_help.c:852 sql_help.c:857 +#: sql_help.c:862 sql_help.c:884 sql_help.c:886 sql_help.c:888 sql_help.c:890 +#: sql_help.c:893 sql_help.c:895 sql_help.c:937 sql_help.c:982 sql_help.c:987 +#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1021 +#: sql_help.c:1032 sql_help.c:1034 sql_help.c:1053 sql_help.c:1063 +#: sql_help.c:1065 sql_help.c:1067 sql_help.c:1079 sql_help.c:1083 +#: sql_help.c:1085 sql_help.c:1097 sql_help.c:1099 sql_help.c:1101 +#: sql_help.c:1103 sql_help.c:1121 sql_help.c:1123 sql_help.c:1127 +#: sql_help.c:1131 sql_help.c:1135 sql_help.c:1138 sql_help.c:1139 +#: sql_help.c:1140 sql_help.c:1143 sql_help.c:1145 sql_help.c:1280 +#: sql_help.c:1282 sql_help.c:1285 sql_help.c:1288 sql_help.c:1290 +#: sql_help.c:1292 sql_help.c:1295 sql_help.c:1298 sql_help.c:1411 #: sql_help.c:1413 sql_help.c:1415 sql_help.c:1418 sql_help.c:1439 #: sql_help.c:1442 sql_help.c:1445 sql_help.c:1448 sql_help.c:1452 #: sql_help.c:1454 sql_help.c:1456 sql_help.c:1458 sql_help.c:1472 @@ -4193,120 +4184,120 @@ msgstr "%s: έλλειψη μνήμης" #: sql_help.c:1664 sql_help.c:1667 sql_help.c:1717 sql_help.c:1733 #: sql_help.c:1964 sql_help.c:2033 sql_help.c:2052 sql_help.c:2065 #: sql_help.c:2122 sql_help.c:2129 sql_help.c:2139 sql_help.c:2160 -#: sql_help.c:2186 sql_help.c:2204 sql_help.c:2231 sql_help.c:2327 -#: sql_help.c:2373 sql_help.c:2397 sql_help.c:2420 sql_help.c:2424 -#: sql_help.c:2458 sql_help.c:2478 sql_help.c:2500 sql_help.c:2514 -#: sql_help.c:2535 sql_help.c:2559 sql_help.c:2589 sql_help.c:2614 -#: sql_help.c:2661 sql_help.c:2949 sql_help.c:2962 sql_help.c:2979 -#: sql_help.c:2995 sql_help.c:3035 sql_help.c:3089 sql_help.c:3093 -#: sql_help.c:3095 sql_help.c:3102 sql_help.c:3121 sql_help.c:3148 -#: sql_help.c:3183 sql_help.c:3195 sql_help.c:3204 sql_help.c:3248 -#: sql_help.c:3262 sql_help.c:3290 sql_help.c:3298 sql_help.c:3310 -#: sql_help.c:3320 sql_help.c:3328 sql_help.c:3336 sql_help.c:3344 -#: sql_help.c:3352 sql_help.c:3361 sql_help.c:3372 sql_help.c:3380 -#: sql_help.c:3388 sql_help.c:3396 sql_help.c:3404 sql_help.c:3414 -#: sql_help.c:3423 sql_help.c:3432 sql_help.c:3440 sql_help.c:3450 -#: sql_help.c:3461 sql_help.c:3469 sql_help.c:3478 sql_help.c:3489 -#: sql_help.c:3498 sql_help.c:3506 sql_help.c:3514 sql_help.c:3522 -#: sql_help.c:3530 sql_help.c:3538 sql_help.c:3546 sql_help.c:3554 -#: sql_help.c:3562 sql_help.c:3570 sql_help.c:3578 sql_help.c:3595 -#: sql_help.c:3604 sql_help.c:3612 sql_help.c:3629 sql_help.c:3644 -#: sql_help.c:3946 sql_help.c:3997 sql_help.c:4026 sql_help.c:4041 -#: sql_help.c:4526 sql_help.c:4574 sql_help.c:4725 +#: sql_help.c:2186 sql_help.c:2204 sql_help.c:2232 sql_help.c:2329 +#: sql_help.c:2375 sql_help.c:2399 sql_help.c:2422 sql_help.c:2426 +#: sql_help.c:2460 sql_help.c:2480 sql_help.c:2502 sql_help.c:2516 +#: sql_help.c:2537 sql_help.c:2561 sql_help.c:2591 sql_help.c:2616 +#: sql_help.c:2663 sql_help.c:2951 sql_help.c:2964 sql_help.c:2981 +#: sql_help.c:2997 sql_help.c:3037 sql_help.c:3091 sql_help.c:3095 +#: sql_help.c:3097 sql_help.c:3104 sql_help.c:3123 sql_help.c:3150 +#: sql_help.c:3185 sql_help.c:3197 sql_help.c:3206 sql_help.c:3250 +#: sql_help.c:3264 sql_help.c:3292 sql_help.c:3300 sql_help.c:3312 +#: sql_help.c:3322 sql_help.c:3330 sql_help.c:3338 sql_help.c:3346 +#: sql_help.c:3354 sql_help.c:3363 sql_help.c:3374 sql_help.c:3382 +#: sql_help.c:3390 sql_help.c:3398 sql_help.c:3406 sql_help.c:3416 +#: sql_help.c:3425 sql_help.c:3434 sql_help.c:3442 sql_help.c:3452 +#: sql_help.c:3463 sql_help.c:3471 sql_help.c:3480 sql_help.c:3491 +#: sql_help.c:3500 sql_help.c:3508 sql_help.c:3516 sql_help.c:3524 +#: sql_help.c:3532 sql_help.c:3540 sql_help.c:3548 sql_help.c:3556 +#: sql_help.c:3564 sql_help.c:3572 sql_help.c:3580 sql_help.c:3597 +#: sql_help.c:3606 sql_help.c:3614 sql_help.c:3631 sql_help.c:3646 +#: sql_help.c:3948 sql_help.c:3999 sql_help.c:4028 sql_help.c:4043 +#: sql_help.c:4528 sql_help.c:4576 sql_help.c:4727 msgid "name" msgstr "ονομασία" #: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1814 -#: sql_help.c:3263 sql_help.c:4302 +#: sql_help.c:3265 sql_help.c:4304 msgid "aggregate_signature" msgstr "aggregate_signature" #: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:250 -#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:524 sql_help.c:572 -#: sql_help.c:590 sql_help.c:617 sql_help.c:668 sql_help.c:735 sql_help.c:790 -#: sql_help.c:811 sql_help.c:850 sql_help.c:895 sql_help.c:937 sql_help.c:989 -#: sql_help.c:1021 sql_help.c:1031 sql_help.c:1064 sql_help.c:1084 -#: sql_help.c:1098 sql_help.c:1144 sql_help.c:1288 sql_help.c:1412 +#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:525 sql_help.c:573 +#: sql_help.c:591 sql_help.c:618 sql_help.c:669 sql_help.c:736 sql_help.c:791 +#: sql_help.c:812 sql_help.c:851 sql_help.c:896 sql_help.c:938 sql_help.c:991 +#: sql_help.c:1023 sql_help.c:1033 sql_help.c:1066 sql_help.c:1086 +#: sql_help.c:1100 sql_help.c:1146 sql_help.c:1289 sql_help.c:1412 #: sql_help.c:1455 sql_help.c:1476 sql_help.c:1490 sql_help.c:1502 #: sql_help.c:1515 sql_help.c:1542 sql_help.c:1608 sql_help.c:1661 msgid "new_name" msgstr "new_name" #: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:120 sql_help.c:248 -#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:529 sql_help.c:619 -#: sql_help.c:628 sql_help.c:689 sql_help.c:709 sql_help.c:738 sql_help.c:793 -#: sql_help.c:855 sql_help.c:893 sql_help.c:994 sql_help.c:1033 sql_help.c:1062 -#: sql_help.c:1082 sql_help.c:1096 sql_help.c:1142 sql_help.c:1351 +#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:530 sql_help.c:620 +#: sql_help.c:629 sql_help.c:690 sql_help.c:710 sql_help.c:739 sql_help.c:794 +#: sql_help.c:856 sql_help.c:894 sql_help.c:996 sql_help.c:1035 sql_help.c:1064 +#: sql_help.c:1084 sql_help.c:1098 sql_help.c:1144 sql_help.c:1352 #: sql_help.c:1414 sql_help.c:1457 sql_help.c:1478 sql_help.c:1540 -#: sql_help.c:1656 sql_help.c:2935 +#: sql_help.c:1656 sql_help.c:2937 msgid "new_owner" msgstr "new_owner" #: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319 -#: sql_help.c:448 sql_help.c:534 sql_help.c:670 sql_help.c:713 sql_help.c:741 -#: sql_help.c:796 sql_help.c:860 sql_help.c:999 sql_help.c:1066 sql_help.c:1100 -#: sql_help.c:1290 sql_help.c:1459 sql_help.c:1480 sql_help.c:1492 -#: sql_help.c:1504 sql_help.c:1544 sql_help.c:1663 +#: sql_help.c:448 sql_help.c:535 sql_help.c:671 sql_help.c:714 sql_help.c:742 +#: sql_help.c:797 sql_help.c:861 sql_help.c:1001 sql_help.c:1068 +#: sql_help.c:1102 sql_help.c:1291 sql_help.c:1459 sql_help.c:1480 +#: sql_help.c:1492 sql_help.c:1504 sql_help.c:1544 sql_help.c:1663 msgid "new_schema" msgstr "new_schema" -#: sql_help.c:44 sql_help.c:1878 sql_help.c:3264 sql_help.c:4331 +#: sql_help.c:44 sql_help.c:1878 sql_help.c:3266 sql_help.c:4333 msgid "where aggregate_signature is:" msgstr "όπου aggregate_signature είναι:" #: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:337 sql_help.c:350 -#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:516 -#: sql_help.c:521 sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:842 -#: sql_help.c:847 sql_help.c:852 sql_help.c:857 sql_help.c:862 sql_help.c:981 -#: sql_help.c:986 sql_help.c:991 sql_help.c:996 sql_help.c:1001 sql_help.c:1832 +#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:517 +#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:843 +#: sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:863 sql_help.c:983 +#: sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1003 sql_help.c:1832 #: sql_help.c:1849 sql_help.c:1855 sql_help.c:1879 sql_help.c:1882 #: sql_help.c:1885 sql_help.c:2034 sql_help.c:2053 sql_help.c:2056 -#: sql_help.c:2328 sql_help.c:2536 sql_help.c:3265 sql_help.c:3268 -#: sql_help.c:3271 sql_help.c:3362 sql_help.c:3451 sql_help.c:3479 -#: sql_help.c:3824 sql_help.c:4204 sql_help.c:4308 sql_help.c:4315 -#: sql_help.c:4321 sql_help.c:4332 sql_help.c:4335 sql_help.c:4338 +#: sql_help.c:2330 sql_help.c:2538 sql_help.c:3267 sql_help.c:3270 +#: sql_help.c:3273 sql_help.c:3364 sql_help.c:3453 sql_help.c:3481 +#: sql_help.c:3826 sql_help.c:4206 sql_help.c:4310 sql_help.c:4317 +#: sql_help.c:4323 sql_help.c:4334 sql_help.c:4337 sql_help.c:4340 msgid "argmode" msgstr "argmode" #: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:338 sql_help.c:351 -#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:843 -#: sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:863 sql_help.c:982 -#: sql_help.c:987 sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1833 +#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:518 +#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:844 +#: sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:864 sql_help.c:984 +#: sql_help.c:989 sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1833 #: sql_help.c:1850 sql_help.c:1856 sql_help.c:1880 sql_help.c:1883 #: sql_help.c:1886 sql_help.c:2035 sql_help.c:2054 sql_help.c:2057 -#: sql_help.c:2329 sql_help.c:2537 sql_help.c:3266 sql_help.c:3269 -#: sql_help.c:3272 sql_help.c:3363 sql_help.c:3452 sql_help.c:3480 -#: sql_help.c:4309 sql_help.c:4316 sql_help.c:4322 sql_help.c:4333 -#: sql_help.c:4336 sql_help.c:4339 +#: sql_help.c:2331 sql_help.c:2539 sql_help.c:3268 sql_help.c:3271 +#: sql_help.c:3274 sql_help.c:3365 sql_help.c:3454 sql_help.c:3482 +#: sql_help.c:4311 sql_help.c:4318 sql_help.c:4324 sql_help.c:4335 +#: sql_help.c:4338 sql_help.c:4341 msgid "argname" msgstr "argname" #: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:339 sql_help.c:352 -#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:844 -#: sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:864 sql_help.c:983 -#: sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1003 sql_help.c:1834 -#: sql_help.c:1851 sql_help.c:1857 sql_help.c:1881 sql_help.c:1884 -#: sql_help.c:1887 sql_help.c:2330 sql_help.c:2538 sql_help.c:3267 -#: sql_help.c:3270 sql_help.c:3273 sql_help.c:3364 sql_help.c:3453 -#: sql_help.c:3481 sql_help.c:4310 sql_help.c:4317 sql_help.c:4323 -#: sql_help.c:4334 sql_help.c:4337 sql_help.c:4340 +#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:519 +#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:845 +#: sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:985 +#: sql_help.c:990 sql_help.c:995 sql_help.c:1000 sql_help.c:1005 +#: sql_help.c:1834 sql_help.c:1851 sql_help.c:1857 sql_help.c:1881 +#: sql_help.c:1884 sql_help.c:1887 sql_help.c:2332 sql_help.c:2540 +#: sql_help.c:3269 sql_help.c:3272 sql_help.c:3275 sql_help.c:3366 +#: sql_help.c:3455 sql_help.c:3483 sql_help.c:4312 sql_help.c:4319 +#: sql_help.c:4325 sql_help.c:4336 sql_help.c:4339 sql_help.c:4342 msgid "argtype" msgstr "argtype" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:931 -#: sql_help.c:1079 sql_help.c:1473 sql_help.c:1602 sql_help.c:1634 +#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:932 +#: sql_help.c:1081 sql_help.c:1473 sql_help.c:1602 sql_help.c:1634 #: sql_help.c:1686 sql_help.c:1749 sql_help.c:1935 sql_help.c:1942 -#: sql_help.c:2234 sql_help.c:2276 sql_help.c:2283 sql_help.c:2292 -#: sql_help.c:2374 sql_help.c:2590 sql_help.c:2683 sql_help.c:2964 -#: sql_help.c:3149 sql_help.c:3171 sql_help.c:3311 sql_help.c:3666 -#: sql_help.c:3865 sql_help.c:4040 sql_help.c:4788 +#: sql_help.c:2235 sql_help.c:2277 sql_help.c:2284 sql_help.c:2293 +#: sql_help.c:2376 sql_help.c:2592 sql_help.c:2685 sql_help.c:2966 +#: sql_help.c:3151 sql_help.c:3173 sql_help.c:3313 sql_help.c:3668 +#: sql_help.c:3867 sql_help.c:4042 sql_help.c:4790 msgid "option" msgstr "επιλογή" -#: sql_help.c:113 sql_help.c:932 sql_help.c:1603 sql_help.c:2375 -#: sql_help.c:2591 sql_help.c:3150 sql_help.c:3312 +#: sql_help.c:113 sql_help.c:933 sql_help.c:1603 sql_help.c:2377 +#: sql_help.c:2593 sql_help.c:3152 sql_help.c:3314 msgid "where option can be:" msgstr "όπου option μπορεί να είναι:" @@ -4314,8 +4305,8 @@ msgstr "όπου option μπορεί να είναι:" msgid "allowconn" msgstr "allowconn" -#: sql_help.c:115 sql_help.c:933 sql_help.c:1604 sql_help.c:2169 -#: sql_help.c:2376 sql_help.c:2592 sql_help.c:3151 +#: sql_help.c:115 sql_help.c:934 sql_help.c:1604 sql_help.c:2169 +#: sql_help.c:2378 sql_help.c:2594 sql_help.c:3153 msgid "connlimit" msgstr "connlimit" @@ -4323,33 +4314,33 @@ msgstr "connlimit" msgid "istemplate" msgstr "istemplate" -#: sql_help.c:122 sql_help.c:607 sql_help.c:673 sql_help.c:1293 sql_help.c:1344 -#: sql_help.c:4044 +#: sql_help.c:122 sql_help.c:608 sql_help.c:674 sql_help.c:1294 sql_help.c:1345 +#: sql_help.c:4046 msgid "new_tablespace" msgstr "new_tablespace" -#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:544 sql_help.c:546 -#: sql_help.c:547 sql_help.c:867 sql_help.c:869 sql_help.c:870 sql_help.c:940 -#: sql_help.c:944 sql_help.c:947 sql_help.c:1008 sql_help.c:1010 -#: sql_help.c:1011 sql_help.c:1155 sql_help.c:1158 sql_help.c:1611 -#: sql_help.c:1615 sql_help.c:1618 sql_help.c:2340 sql_help.c:2542 -#: sql_help.c:4062 sql_help.c:4515 +#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:545 sql_help.c:547 +#: sql_help.c:548 sql_help.c:868 sql_help.c:870 sql_help.c:871 sql_help.c:941 +#: sql_help.c:945 sql_help.c:948 sql_help.c:1010 sql_help.c:1012 +#: sql_help.c:1013 sql_help.c:1157 sql_help.c:1160 sql_help.c:1611 +#: sql_help.c:1615 sql_help.c:1618 sql_help.c:2342 sql_help.c:2544 +#: sql_help.c:4064 sql_help.c:4517 msgid "configuration_parameter" msgstr "configuration_parameter" #: sql_help.c:125 sql_help.c:395 sql_help.c:466 sql_help.c:472 sql_help.c:484 -#: sql_help.c:545 sql_help.c:599 sql_help.c:679 sql_help.c:687 sql_help.c:868 -#: sql_help.c:891 sql_help.c:941 sql_help.c:1009 sql_help.c:1080 -#: sql_help.c:1124 sql_help.c:1128 sql_help.c:1132 sql_help.c:1135 -#: sql_help.c:1140 sql_help.c:1156 sql_help.c:1157 sql_help.c:1324 -#: sql_help.c:1346 sql_help.c:1395 sql_help.c:1417 sql_help.c:1474 -#: sql_help.c:1558 sql_help.c:1612 sql_help.c:1635 sql_help.c:2235 -#: sql_help.c:2277 sql_help.c:2284 sql_help.c:2293 sql_help.c:2341 -#: sql_help.c:2342 sql_help.c:2405 sql_help.c:2408 sql_help.c:2442 -#: sql_help.c:2543 sql_help.c:2544 sql_help.c:2562 sql_help.c:2684 -#: sql_help.c:2723 sql_help.c:2829 sql_help.c:2842 sql_help.c:2856 -#: sql_help.c:2897 sql_help.c:2921 sql_help.c:2938 sql_help.c:2965 -#: sql_help.c:3172 sql_help.c:3866 sql_help.c:4516 sql_help.c:4517 +#: sql_help.c:546 sql_help.c:600 sql_help.c:680 sql_help.c:688 sql_help.c:869 +#: sql_help.c:892 sql_help.c:942 sql_help.c:1011 sql_help.c:1082 +#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:1137 +#: sql_help.c:1142 sql_help.c:1158 sql_help.c:1159 sql_help.c:1325 +#: sql_help.c:1347 sql_help.c:1395 sql_help.c:1417 sql_help.c:1474 +#: sql_help.c:1558 sql_help.c:1612 sql_help.c:1635 sql_help.c:2236 +#: sql_help.c:2278 sql_help.c:2285 sql_help.c:2294 sql_help.c:2343 +#: sql_help.c:2344 sql_help.c:2407 sql_help.c:2410 sql_help.c:2444 +#: sql_help.c:2545 sql_help.c:2546 sql_help.c:2564 sql_help.c:2686 +#: sql_help.c:2725 sql_help.c:2831 sql_help.c:2844 sql_help.c:2858 +#: sql_help.c:2899 sql_help.c:2923 sql_help.c:2940 sql_help.c:2967 +#: sql_help.c:3174 sql_help.c:3868 sql_help.c:4518 sql_help.c:4519 msgid "value" msgstr "value" @@ -4357,9 +4348,9 @@ msgstr "value" msgid "target_role" msgstr "target_role" -#: sql_help.c:198 sql_help.c:2219 sql_help.c:2639 sql_help.c:2644 -#: sql_help.c:3799 sql_help.c:3808 sql_help.c:3827 sql_help.c:3836 -#: sql_help.c:4179 sql_help.c:4188 sql_help.c:4207 sql_help.c:4216 +#: sql_help.c:198 sql_help.c:2220 sql_help.c:2641 sql_help.c:2646 +#: sql_help.c:3801 sql_help.c:3810 sql_help.c:3829 sql_help.c:3838 +#: sql_help.c:4181 sql_help.c:4190 sql_help.c:4209 sql_help.c:4218 msgid "schema_name" msgstr "schema_name" @@ -4373,31 +4364,31 @@ msgstr "όπου abbreviated_grant_or_revoke είναι ένα από:" #: sql_help.c:201 sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205 #: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 -#: sql_help.c:570 sql_help.c:606 sql_help.c:672 sql_help.c:814 sql_help.c:951 -#: sql_help.c:1292 sql_help.c:1622 sql_help.c:2379 sql_help.c:2380 -#: sql_help.c:2381 sql_help.c:2382 sql_help.c:2383 sql_help.c:2516 -#: sql_help.c:2595 sql_help.c:2596 sql_help.c:2597 sql_help.c:2598 -#: sql_help.c:2599 sql_help.c:3154 sql_help.c:3155 sql_help.c:3156 -#: sql_help.c:3157 sql_help.c:3158 sql_help.c:3845 sql_help.c:3849 -#: sql_help.c:4225 sql_help.c:4229 sql_help.c:4536 +#: sql_help.c:571 sql_help.c:607 sql_help.c:673 sql_help.c:815 sql_help.c:952 +#: sql_help.c:1293 sql_help.c:1622 sql_help.c:2381 sql_help.c:2382 +#: sql_help.c:2383 sql_help.c:2384 sql_help.c:2385 sql_help.c:2518 +#: sql_help.c:2597 sql_help.c:2598 sql_help.c:2599 sql_help.c:2600 +#: sql_help.c:2601 sql_help.c:3156 sql_help.c:3157 sql_help.c:3158 +#: sql_help.c:3159 sql_help.c:3160 sql_help.c:3847 sql_help.c:3851 +#: sql_help.c:4227 sql_help.c:4231 sql_help.c:4538 msgid "role_name" msgstr "role_name" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1308 sql_help.c:1310 -#: sql_help.c:1361 sql_help.c:1374 sql_help.c:1399 sql_help.c:1652 -#: sql_help.c:2189 sql_help.c:2193 sql_help.c:2296 sql_help.c:2301 -#: sql_help.c:2401 sql_help.c:2700 sql_help.c:2705 sql_help.c:2707 -#: sql_help.c:2824 sql_help.c:2837 sql_help.c:2851 sql_help.c:2860 -#: sql_help.c:2872 sql_help.c:2901 sql_help.c:3897 sql_help.c:3912 -#: sql_help.c:3914 sql_help.c:4393 sql_help.c:4394 sql_help.c:4403 -#: sql_help.c:4445 sql_help.c:4446 sql_help.c:4447 sql_help.c:4448 -#: sql_help.c:4449 sql_help.c:4450 sql_help.c:4490 sql_help.c:4491 -#: sql_help.c:4496 sql_help.c:4501 sql_help.c:4642 sql_help.c:4643 -#: sql_help.c:4652 sql_help.c:4694 sql_help.c:4695 sql_help.c:4696 -#: sql_help.c:4697 sql_help.c:4698 sql_help.c:4699 sql_help.c:4753 -#: sql_help.c:4755 sql_help.c:4816 sql_help.c:4874 sql_help.c:4875 -#: sql_help.c:4884 sql_help.c:4926 sql_help.c:4927 sql_help.c:4928 -#: sql_help.c:4929 sql_help.c:4930 sql_help.c:4931 +#: sql_help.c:236 sql_help.c:459 sql_help.c:1309 sql_help.c:1311 +#: sql_help.c:1362 sql_help.c:1374 sql_help.c:1399 sql_help.c:1652 +#: sql_help.c:2189 sql_help.c:2193 sql_help.c:2297 sql_help.c:2302 +#: sql_help.c:2403 sql_help.c:2702 sql_help.c:2707 sql_help.c:2709 +#: sql_help.c:2826 sql_help.c:2839 sql_help.c:2853 sql_help.c:2862 +#: sql_help.c:2874 sql_help.c:2903 sql_help.c:3899 sql_help.c:3914 +#: sql_help.c:3916 sql_help.c:4395 sql_help.c:4396 sql_help.c:4405 +#: sql_help.c:4447 sql_help.c:4448 sql_help.c:4449 sql_help.c:4450 +#: sql_help.c:4451 sql_help.c:4452 sql_help.c:4492 sql_help.c:4493 +#: sql_help.c:4498 sql_help.c:4503 sql_help.c:4644 sql_help.c:4645 +#: sql_help.c:4654 sql_help.c:4696 sql_help.c:4697 sql_help.c:4698 +#: sql_help.c:4699 sql_help.c:4700 sql_help.c:4701 sql_help.c:4755 +#: sql_help.c:4757 sql_help.c:4817 sql_help.c:4875 sql_help.c:4876 +#: sql_help.c:4885 sql_help.c:4927 sql_help.c:4928 sql_help.c:4929 +#: sql_help.c:4930 sql_help.c:4931 sql_help.c:4932 msgid "expression" msgstr "expression" @@ -4406,18 +4397,18 @@ msgid "domain_constraint" msgstr "domain_constraint" #: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475 -#: sql_help.c:1285 sql_help.c:1332 sql_help.c:1333 sql_help.c:1334 -#: sql_help.c:1360 sql_help.c:1373 sql_help.c:1390 sql_help.c:1820 -#: sql_help.c:1822 sql_help.c:2192 sql_help.c:2295 sql_help.c:2300 -#: sql_help.c:2859 sql_help.c:2871 sql_help.c:3909 +#: sql_help.c:1286 sql_help.c:1333 sql_help.c:1334 sql_help.c:1335 +#: sql_help.c:1361 sql_help.c:1373 sql_help.c:1390 sql_help.c:1820 +#: sql_help.c:1822 sql_help.c:2192 sql_help.c:2296 sql_help.c:2301 +#: sql_help.c:2861 sql_help.c:2873 sql_help.c:3911 msgid "constraint_name" msgstr "constraint_name" -#: sql_help.c:244 sql_help.c:1286 +#: sql_help.c:244 sql_help.c:1287 msgid "new_constraint_name" msgstr "new_constraint_name" -#: sql_help.c:317 sql_help.c:1078 +#: sql_help.c:317 sql_help.c:1080 msgid "new_version" msgstr "new_version" @@ -4440,75 +4431,75 @@ msgstr "όπου member_object είναι:" #: sql_help.c:1853 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862 #: sql_help.c:1863 sql_help.c:1864 sql_help.c:1865 sql_help.c:1866 #: sql_help.c:1867 sql_help.c:1868 sql_help.c:1869 sql_help.c:1870 -#: sql_help.c:1875 sql_help.c:1876 sql_help.c:4298 sql_help.c:4303 -#: sql_help.c:4304 sql_help.c:4305 sql_help.c:4306 sql_help.c:4312 -#: sql_help.c:4313 sql_help.c:4318 sql_help.c:4319 sql_help.c:4324 -#: sql_help.c:4325 sql_help.c:4326 sql_help.c:4327 sql_help.c:4328 -#: sql_help.c:4329 +#: sql_help.c:1875 sql_help.c:1876 sql_help.c:4300 sql_help.c:4305 +#: sql_help.c:4306 sql_help.c:4307 sql_help.c:4308 sql_help.c:4314 +#: sql_help.c:4315 sql_help.c:4320 sql_help.c:4321 sql_help.c:4326 +#: sql_help.c:4327 sql_help.c:4328 sql_help.c:4329 sql_help.c:4330 +#: sql_help.c:4331 msgid "object_name" msgstr "object_name" -#: sql_help.c:326 sql_help.c:1813 sql_help.c:4301 +#: sql_help.c:326 sql_help.c:1813 sql_help.c:4303 msgid "aggregate_name" msgstr "aggregate_name" #: sql_help.c:328 sql_help.c:1815 sql_help.c:2099 sql_help.c:2103 -#: sql_help.c:2105 sql_help.c:3281 +#: sql_help.c:2105 sql_help.c:3283 msgid "source_type" msgstr "source_type" #: sql_help.c:329 sql_help.c:1816 sql_help.c:2100 sql_help.c:2104 -#: sql_help.c:2106 sql_help.c:3282 +#: sql_help.c:2106 sql_help.c:3284 msgid "target_type" msgstr "source_type" -#: sql_help.c:336 sql_help.c:778 sql_help.c:1831 sql_help.c:2101 -#: sql_help.c:2142 sql_help.c:2207 sql_help.c:2459 sql_help.c:2490 -#: sql_help.c:3041 sql_help.c:4203 sql_help.c:4307 sql_help.c:4422 -#: sql_help.c:4426 sql_help.c:4430 sql_help.c:4433 sql_help.c:4671 -#: sql_help.c:4675 sql_help.c:4679 sql_help.c:4682 sql_help.c:4903 -#: sql_help.c:4907 sql_help.c:4911 sql_help.c:4914 +#: sql_help.c:336 sql_help.c:779 sql_help.c:1831 sql_help.c:2101 +#: sql_help.c:2142 sql_help.c:2208 sql_help.c:2461 sql_help.c:2492 +#: sql_help.c:3043 sql_help.c:4205 sql_help.c:4309 sql_help.c:4424 +#: sql_help.c:4428 sql_help.c:4432 sql_help.c:4435 sql_help.c:4673 +#: sql_help.c:4677 sql_help.c:4681 sql_help.c:4684 sql_help.c:4904 +#: sql_help.c:4908 sql_help.c:4912 sql_help.c:4915 msgid "function_name" msgstr "function_name" -#: sql_help.c:341 sql_help.c:771 sql_help.c:1838 sql_help.c:2483 +#: sql_help.c:341 sql_help.c:772 sql_help.c:1838 sql_help.c:2485 msgid "operator_name" msgstr "operator_name" -#: sql_help.c:342 sql_help.c:707 sql_help.c:711 sql_help.c:715 sql_help.c:1839 -#: sql_help.c:2460 sql_help.c:3405 +#: sql_help.c:342 sql_help.c:708 sql_help.c:712 sql_help.c:716 sql_help.c:1839 +#: sql_help.c:2462 sql_help.c:3407 msgid "left_type" msgstr "source_type" -#: sql_help.c:343 sql_help.c:708 sql_help.c:712 sql_help.c:716 sql_help.c:1840 -#: sql_help.c:2461 sql_help.c:3406 +#: sql_help.c:343 sql_help.c:709 sql_help.c:713 sql_help.c:717 sql_help.c:1840 +#: sql_help.c:2463 sql_help.c:3408 msgid "right_type" msgstr "source_type" -#: sql_help.c:345 sql_help.c:347 sql_help.c:734 sql_help.c:737 sql_help.c:740 -#: sql_help.c:769 sql_help.c:781 sql_help.c:789 sql_help.c:792 sql_help.c:795 -#: sql_help.c:1379 sql_help.c:1842 sql_help.c:1844 sql_help.c:2480 -#: sql_help.c:2501 sql_help.c:2877 sql_help.c:3415 sql_help.c:3424 +#: sql_help.c:345 sql_help.c:347 sql_help.c:735 sql_help.c:738 sql_help.c:741 +#: sql_help.c:770 sql_help.c:782 sql_help.c:790 sql_help.c:793 sql_help.c:796 +#: sql_help.c:1379 sql_help.c:1842 sql_help.c:1844 sql_help.c:2482 +#: sql_help.c:2503 sql_help.c:2879 sql_help.c:3417 sql_help.c:3426 msgid "index_method" msgstr "source_type" -#: sql_help.c:349 sql_help.c:1848 sql_help.c:4314 +#: sql_help.c:349 sql_help.c:1848 sql_help.c:4316 msgid "procedure_name" msgstr "procedure_name" -#: sql_help.c:353 sql_help.c:1854 sql_help.c:3823 sql_help.c:4320 +#: sql_help.c:353 sql_help.c:1854 sql_help.c:3825 sql_help.c:4322 msgid "routine_name" msgstr "routine_name" -#: sql_help.c:365 sql_help.c:1350 sql_help.c:1871 sql_help.c:2336 -#: sql_help.c:2541 sql_help.c:2832 sql_help.c:3008 sql_help.c:3586 -#: sql_help.c:3842 sql_help.c:4222 +#: sql_help.c:365 sql_help.c:1351 sql_help.c:1871 sql_help.c:2338 +#: sql_help.c:2543 sql_help.c:2834 sql_help.c:3010 sql_help.c:3588 +#: sql_help.c:3844 sql_help.c:4224 msgid "type_name" msgstr "type_name" -#: sql_help.c:366 sql_help.c:1872 sql_help.c:2335 sql_help.c:2540 -#: sql_help.c:3009 sql_help.c:3239 sql_help.c:3587 sql_help.c:3830 -#: sql_help.c:4210 +#: sql_help.c:366 sql_help.c:1872 sql_help.c:2337 sql_help.c:2542 +#: sql_help.c:3011 sql_help.c:3241 sql_help.c:3589 sql_help.c:3832 +#: sql_help.c:4212 msgid "lang_name" msgstr "lang_name" @@ -4516,390 +4507,388 @@ msgstr "lang_name" msgid "and aggregate_signature is:" msgstr "και aggregate_signature είναι:" -#: sql_help.c:392 sql_help.c:1966 sql_help.c:2232 +#: sql_help.c:392 sql_help.c:1966 sql_help.c:2233 msgid "handler_function" msgstr "handler_function" -#: sql_help.c:393 sql_help.c:2233 +#: sql_help.c:393 sql_help.c:2234 msgid "validator_function" msgstr "validator_function" -#: sql_help.c:441 sql_help.c:519 sql_help.c:661 sql_help.c:845 sql_help.c:984 -#: sql_help.c:1280 sql_help.c:1549 +#: sql_help.c:441 sql_help.c:520 sql_help.c:662 sql_help.c:846 sql_help.c:986 +#: sql_help.c:1281 sql_help.c:1549 msgid "action" msgstr "action" #: sql_help.c:443 sql_help.c:450 sql_help.c:454 sql_help.c:455 sql_help.c:458 #: sql_help.c:460 sql_help.c:461 sql_help.c:462 sql_help.c:464 sql_help.c:467 -#: sql_help.c:469 sql_help.c:470 sql_help.c:665 sql_help.c:675 sql_help.c:677 -#: sql_help.c:680 sql_help.c:682 sql_help.c:683 sql_help.c:1060 sql_help.c:1282 -#: sql_help.c:1300 sql_help.c:1304 sql_help.c:1305 sql_help.c:1309 -#: sql_help.c:1311 sql_help.c:1312 sql_help.c:1313 sql_help.c:1314 -#: sql_help.c:1316 sql_help.c:1319 sql_help.c:1320 sql_help.c:1322 -#: sql_help.c:1325 sql_help.c:1327 sql_help.c:1328 sql_help.c:1375 +#: sql_help.c:469 sql_help.c:470 sql_help.c:666 sql_help.c:676 sql_help.c:678 +#: sql_help.c:681 sql_help.c:683 sql_help.c:684 sql_help.c:1062 sql_help.c:1283 +#: sql_help.c:1301 sql_help.c:1305 sql_help.c:1306 sql_help.c:1310 +#: sql_help.c:1312 sql_help.c:1313 sql_help.c:1314 sql_help.c:1315 +#: sql_help.c:1317 sql_help.c:1320 sql_help.c:1321 sql_help.c:1323 +#: sql_help.c:1326 sql_help.c:1328 sql_help.c:1329 sql_help.c:1375 #: sql_help.c:1377 sql_help.c:1384 sql_help.c:1393 sql_help.c:1398 #: sql_help.c:1651 sql_help.c:1654 sql_help.c:1658 sql_help.c:1694 #: sql_help.c:1819 sql_help.c:1932 sql_help.c:1938 sql_help.c:1951 -#: sql_help.c:1952 sql_help.c:1953 sql_help.c:2274 sql_help.c:2287 -#: sql_help.c:2333 sql_help.c:2400 sql_help.c:2406 sql_help.c:2439 -#: sql_help.c:2669 sql_help.c:2704 sql_help.c:2706 sql_help.c:2814 -#: sql_help.c:2823 sql_help.c:2833 sql_help.c:2836 sql_help.c:2846 -#: sql_help.c:2850 sql_help.c:2873 sql_help.c:2875 sql_help.c:2882 -#: sql_help.c:2895 sql_help.c:2900 sql_help.c:2918 sql_help.c:3044 -#: sql_help.c:3184 sql_help.c:3802 sql_help.c:3803 sql_help.c:3896 -#: sql_help.c:3911 sql_help.c:3913 sql_help.c:3915 sql_help.c:4182 -#: sql_help.c:4183 sql_help.c:4300 sql_help.c:4454 sql_help.c:4460 -#: sql_help.c:4462 sql_help.c:4703 sql_help.c:4709 sql_help.c:4711 -#: sql_help.c:4752 sql_help.c:4754 sql_help.c:4756 sql_help.c:4804 -#: sql_help.c:4935 sql_help.c:4941 sql_help.c:4943 +#: sql_help.c:1952 sql_help.c:1953 sql_help.c:2275 sql_help.c:2288 +#: sql_help.c:2335 sql_help.c:2402 sql_help.c:2408 sql_help.c:2441 +#: sql_help.c:2671 sql_help.c:2706 sql_help.c:2708 sql_help.c:2816 +#: sql_help.c:2825 sql_help.c:2835 sql_help.c:2838 sql_help.c:2848 +#: sql_help.c:2852 sql_help.c:2875 sql_help.c:2877 sql_help.c:2884 +#: sql_help.c:2897 sql_help.c:2902 sql_help.c:2920 sql_help.c:3046 +#: sql_help.c:3186 sql_help.c:3804 sql_help.c:3805 sql_help.c:3898 +#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3917 sql_help.c:4184 +#: sql_help.c:4185 sql_help.c:4302 sql_help.c:4456 sql_help.c:4462 +#: sql_help.c:4464 sql_help.c:4705 sql_help.c:4711 sql_help.c:4713 +#: sql_help.c:4754 sql_help.c:4756 sql_help.c:4758 sql_help.c:4805 +#: sql_help.c:4936 sql_help.c:4942 sql_help.c:4944 msgid "column_name" msgstr "column_name" -#: sql_help.c:444 sql_help.c:666 sql_help.c:1283 sql_help.c:1659 +#: sql_help.c:444 sql_help.c:667 sql_help.c:1284 sql_help.c:1659 msgid "new_column_name" msgstr "new_column_name" -#: sql_help.c:449 sql_help.c:540 sql_help.c:674 sql_help.c:866 sql_help.c:1005 -#: sql_help.c:1299 sql_help.c:1559 +#: sql_help.c:449 sql_help.c:541 sql_help.c:675 sql_help.c:867 sql_help.c:1007 +#: sql_help.c:1300 sql_help.c:1559 msgid "where action is one of:" msgstr "όπου action είναι ένα από:" -#: sql_help.c:451 sql_help.c:456 sql_help.c:1052 sql_help.c:1301 -#: sql_help.c:1306 sql_help.c:1561 sql_help.c:1565 sql_help.c:2187 -#: sql_help.c:2275 sql_help.c:2479 sql_help.c:2662 sql_help.c:2815 -#: sql_help.c:3091 sql_help.c:3998 +#: sql_help.c:451 sql_help.c:456 sql_help.c:1054 sql_help.c:1302 +#: sql_help.c:1307 sql_help.c:1561 sql_help.c:1565 sql_help.c:2187 +#: sql_help.c:2276 sql_help.c:2481 sql_help.c:2664 sql_help.c:2817 +#: sql_help.c:3093 sql_help.c:4000 msgid "data_type" msgstr "data_type" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1302 sql_help.c:1307 -#: sql_help.c:1562 sql_help.c:1566 sql_help.c:2188 sql_help.c:2278 -#: sql_help.c:2402 sql_help.c:2816 sql_help.c:2825 sql_help.c:2838 -#: sql_help.c:2852 sql_help.c:3092 sql_help.c:3098 sql_help.c:3906 +#: sql_help.c:452 sql_help.c:457 sql_help.c:1303 sql_help.c:1308 +#: sql_help.c:1562 sql_help.c:1566 sql_help.c:2188 sql_help.c:2279 +#: sql_help.c:2404 sql_help.c:2819 sql_help.c:2827 sql_help.c:2840 +#: sql_help.c:2854 sql_help.c:3094 sql_help.c:3100 sql_help.c:3908 msgid "collation" msgstr "collation" -#: sql_help.c:453 sql_help.c:1303 sql_help.c:2279 sql_help.c:2288 -#: sql_help.c:2818 sql_help.c:2834 sql_help.c:2847 +#: sql_help.c:453 sql_help.c:1304 sql_help.c:2280 sql_help.c:2289 +#: sql_help.c:2820 sql_help.c:2836 sql_help.c:2849 msgid "column_constraint" msgstr "column_constraint" -#: sql_help.c:463 sql_help.c:604 sql_help.c:676 sql_help.c:1321 sql_help.c:4801 +#: sql_help.c:463 sql_help.c:605 sql_help.c:677 sql_help.c:1322 sql_help.c:4802 msgid "integer" msgstr "integer" -#: sql_help.c:465 sql_help.c:468 sql_help.c:678 sql_help.c:681 sql_help.c:1323 -#: sql_help.c:1326 +#: sql_help.c:465 sql_help.c:468 sql_help.c:679 sql_help.c:682 sql_help.c:1324 +#: sql_help.c:1327 msgid "attribute_option" msgstr "attribute_option" -#: sql_help.c:473 sql_help.c:1330 sql_help.c:2280 sql_help.c:2289 -#: sql_help.c:2819 sql_help.c:2835 sql_help.c:2848 +#: sql_help.c:473 sql_help.c:1331 sql_help.c:2281 sql_help.c:2290 +#: sql_help.c:2821 sql_help.c:2837 sql_help.c:2850 msgid "table_constraint" msgstr "table_constraint" -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1335 -#: sql_help.c:1336 sql_help.c:1337 sql_help.c:1338 sql_help.c:1873 +#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1336 +#: sql_help.c:1337 sql_help.c:1338 sql_help.c:1339 sql_help.c:1873 msgid "trigger_name" msgstr "trigger_name" -#: sql_help.c:480 sql_help.c:481 sql_help.c:1348 sql_help.c:1349 -#: sql_help.c:2281 sql_help.c:2286 sql_help.c:2822 sql_help.c:2845 +#: sql_help.c:480 sql_help.c:481 sql_help.c:1349 sql_help.c:1350 +#: sql_help.c:2282 sql_help.c:2287 sql_help.c:2824 sql_help.c:2847 msgid "parent_table" msgstr "parent_table" -#: sql_help.c:539 sql_help.c:596 sql_help.c:663 sql_help.c:865 sql_help.c:1004 -#: sql_help.c:1518 sql_help.c:2218 +#: sql_help.c:540 sql_help.c:597 sql_help.c:664 sql_help.c:866 sql_help.c:1006 +#: sql_help.c:1518 sql_help.c:2219 msgid "extension_name" msgstr "extension_name" -#: sql_help.c:541 sql_help.c:1006 sql_help.c:2337 +#: sql_help.c:542 sql_help.c:1008 sql_help.c:2339 msgid "execution_cost" msgstr "execution_cost" -#: sql_help.c:542 sql_help.c:1007 sql_help.c:2338 +#: sql_help.c:543 sql_help.c:1009 sql_help.c:2340 msgid "result_rows" msgstr "result_rows" -#: sql_help.c:543 sql_help.c:2339 +#: sql_help.c:544 sql_help.c:2341 msgid "support_function" msgstr "support_function" -#: sql_help.c:565 sql_help.c:567 sql_help.c:930 sql_help.c:938 sql_help.c:942 -#: sql_help.c:945 sql_help.c:948 sql_help.c:1601 sql_help.c:1609 -#: sql_help.c:1613 sql_help.c:1616 sql_help.c:1619 sql_help.c:2640 -#: sql_help.c:2642 sql_help.c:2645 sql_help.c:2646 sql_help.c:3800 -#: sql_help.c:3801 sql_help.c:3805 sql_help.c:3806 sql_help.c:3809 -#: sql_help.c:3810 sql_help.c:3812 sql_help.c:3813 sql_help.c:3815 -#: sql_help.c:3816 sql_help.c:3818 sql_help.c:3819 sql_help.c:3821 -#: sql_help.c:3822 sql_help.c:3828 sql_help.c:3829 sql_help.c:3831 -#: sql_help.c:3832 sql_help.c:3834 sql_help.c:3835 sql_help.c:3837 -#: sql_help.c:3838 sql_help.c:3840 sql_help.c:3841 sql_help.c:3843 -#: sql_help.c:3844 sql_help.c:3846 sql_help.c:3847 sql_help.c:4180 -#: sql_help.c:4181 sql_help.c:4185 sql_help.c:4186 sql_help.c:4189 -#: sql_help.c:4190 sql_help.c:4192 sql_help.c:4193 sql_help.c:4195 -#: sql_help.c:4196 sql_help.c:4198 sql_help.c:4199 sql_help.c:4201 -#: sql_help.c:4202 sql_help.c:4208 sql_help.c:4209 sql_help.c:4211 -#: sql_help.c:4212 sql_help.c:4214 sql_help.c:4215 sql_help.c:4217 -#: sql_help.c:4218 sql_help.c:4220 sql_help.c:4221 sql_help.c:4223 -#: sql_help.c:4224 sql_help.c:4226 sql_help.c:4227 +#: sql_help.c:566 sql_help.c:568 sql_help.c:931 sql_help.c:939 sql_help.c:943 +#: sql_help.c:946 sql_help.c:949 sql_help.c:1601 sql_help.c:1609 +#: sql_help.c:1613 sql_help.c:1616 sql_help.c:1619 sql_help.c:2642 +#: sql_help.c:2644 sql_help.c:2647 sql_help.c:2648 sql_help.c:3802 +#: sql_help.c:3803 sql_help.c:3807 sql_help.c:3808 sql_help.c:3811 +#: sql_help.c:3812 sql_help.c:3814 sql_help.c:3815 sql_help.c:3817 +#: sql_help.c:3818 sql_help.c:3820 sql_help.c:3821 sql_help.c:3823 +#: sql_help.c:3824 sql_help.c:3830 sql_help.c:3831 sql_help.c:3833 +#: sql_help.c:3834 sql_help.c:3836 sql_help.c:3837 sql_help.c:3839 +#: sql_help.c:3840 sql_help.c:3842 sql_help.c:3843 sql_help.c:3845 +#: sql_help.c:3846 sql_help.c:3848 sql_help.c:3849 sql_help.c:4182 +#: sql_help.c:4183 sql_help.c:4187 sql_help.c:4188 sql_help.c:4191 +#: sql_help.c:4192 sql_help.c:4194 sql_help.c:4195 sql_help.c:4197 +#: sql_help.c:4198 sql_help.c:4200 sql_help.c:4201 sql_help.c:4203 +#: sql_help.c:4204 sql_help.c:4210 sql_help.c:4211 sql_help.c:4213 +#: sql_help.c:4214 sql_help.c:4216 sql_help.c:4217 sql_help.c:4219 +#: sql_help.c:4220 sql_help.c:4222 sql_help.c:4223 sql_help.c:4225 +#: sql_help.c:4226 sql_help.c:4228 sql_help.c:4229 msgid "role_specification" msgstr "role_specification" -#: sql_help.c:566 sql_help.c:568 sql_help.c:1632 sql_help.c:2161 -#: sql_help.c:2648 sql_help.c:3169 sql_help.c:3620 sql_help.c:4546 +#: sql_help.c:567 sql_help.c:569 sql_help.c:1632 sql_help.c:2161 +#: sql_help.c:2650 sql_help.c:3171 sql_help.c:3622 sql_help.c:4548 msgid "user_name" msgstr "user_name" -#: sql_help.c:569 sql_help.c:950 sql_help.c:1621 sql_help.c:2647 -#: sql_help.c:3848 sql_help.c:4228 +#: sql_help.c:570 sql_help.c:951 sql_help.c:1621 sql_help.c:2649 +#: sql_help.c:3850 sql_help.c:4230 msgid "where role_specification can be:" msgstr "όπου role_specification μπορεί να είναι:" -#: sql_help.c:571 +#: sql_help.c:572 msgid "group_name" msgstr "group_name" -#: sql_help.c:592 sql_help.c:1396 sql_help.c:2167 sql_help.c:2409 -#: sql_help.c:2443 sql_help.c:2830 sql_help.c:2843 sql_help.c:2857 -#: sql_help.c:2898 sql_help.c:2922 sql_help.c:2934 sql_help.c:3839 -#: sql_help.c:4219 +#: sql_help.c:593 sql_help.c:1396 sql_help.c:2167 sql_help.c:2411 +#: sql_help.c:2445 sql_help.c:2832 sql_help.c:2845 sql_help.c:2859 +#: sql_help.c:2900 sql_help.c:2924 sql_help.c:2936 sql_help.c:3841 +#: sql_help.c:4221 msgid "tablespace_name" msgstr "group_name" -#: sql_help.c:594 sql_help.c:685 sql_help.c:1343 sql_help.c:1352 +#: sql_help.c:595 sql_help.c:686 sql_help.c:1344 sql_help.c:1353 #: sql_help.c:1391 sql_help.c:1748 sql_help.c:1751 msgid "index_name" msgstr "index_name" -#: sql_help.c:598 sql_help.c:601 sql_help.c:686 sql_help.c:688 sql_help.c:1345 -#: sql_help.c:1347 sql_help.c:1394 sql_help.c:2407 sql_help.c:2441 -#: sql_help.c:2828 sql_help.c:2841 sql_help.c:2855 sql_help.c:2896 -#: sql_help.c:2920 +#: sql_help.c:599 sql_help.c:602 sql_help.c:687 sql_help.c:689 sql_help.c:1346 +#: sql_help.c:1348 sql_help.c:1394 sql_help.c:2409 sql_help.c:2443 +#: sql_help.c:2830 sql_help.c:2843 sql_help.c:2857 sql_help.c:2898 +#: sql_help.c:2922 msgid "storage_parameter" msgstr "storage_parameter" -#: sql_help.c:603 +#: sql_help.c:604 msgid "column_number" msgstr "column_number" -#: sql_help.c:627 sql_help.c:1836 sql_help.c:4311 +#: sql_help.c:628 sql_help.c:1836 sql_help.c:4313 msgid "large_object_oid" msgstr "large_object_oid" -#: sql_help.c:684 sql_help.c:1329 sql_help.c:1367 sql_help.c:2817 -#, fuzzy -#| msgid "sampling_method" +#: sql_help.c:685 sql_help.c:1330 sql_help.c:2818 msgid "compression_method" -msgstr "sampling_method" +msgstr "compression_method" -#: sql_help.c:717 sql_help.c:2464 +#: sql_help.c:718 sql_help.c:2466 msgid "res_proc" msgstr "res_proc" -#: sql_help.c:718 sql_help.c:2465 +#: sql_help.c:719 sql_help.c:2467 msgid "join_proc" msgstr "join_proc" -#: sql_help.c:770 sql_help.c:782 sql_help.c:2482 +#: sql_help.c:771 sql_help.c:783 sql_help.c:2484 msgid "strategy_number" msgstr "strategy_number" -#: sql_help.c:772 sql_help.c:773 sql_help.c:776 sql_help.c:777 sql_help.c:783 -#: sql_help.c:784 sql_help.c:786 sql_help.c:787 sql_help.c:2484 sql_help.c:2485 -#: sql_help.c:2488 sql_help.c:2489 +#: sql_help.c:773 sql_help.c:774 sql_help.c:777 sql_help.c:778 sql_help.c:784 +#: sql_help.c:785 sql_help.c:787 sql_help.c:788 sql_help.c:2486 sql_help.c:2487 +#: sql_help.c:2490 sql_help.c:2491 msgid "op_type" msgstr "op_type" -#: sql_help.c:774 sql_help.c:2486 +#: sql_help.c:775 sql_help.c:2488 msgid "sort_family_name" msgstr "index_name" -#: sql_help.c:775 sql_help.c:785 sql_help.c:2487 +#: sql_help.c:776 sql_help.c:786 sql_help.c:2489 msgid "support_number" msgstr "support_number" -#: sql_help.c:779 sql_help.c:2102 sql_help.c:2491 sql_help.c:3011 -#: sql_help.c:3013 +#: sql_help.c:780 sql_help.c:2102 sql_help.c:2493 sql_help.c:3013 +#: sql_help.c:3015 msgid "argument_type" msgstr "argument_type" -#: sql_help.c:810 sql_help.c:813 sql_help.c:884 sql_help.c:886 sql_help.c:888 -#: sql_help.c:1020 sql_help.c:1059 sql_help.c:1514 sql_help.c:1517 +#: sql_help.c:811 sql_help.c:814 sql_help.c:885 sql_help.c:887 sql_help.c:889 +#: sql_help.c:1022 sql_help.c:1061 sql_help.c:1514 sql_help.c:1517 #: sql_help.c:1693 sql_help.c:1747 sql_help.c:1750 sql_help.c:1821 #: sql_help.c:1846 sql_help.c:1859 sql_help.c:1874 sql_help.c:1931 -#: sql_help.c:1937 sql_help.c:2273 sql_help.c:2285 sql_help.c:2398 -#: sql_help.c:2438 sql_help.c:2515 sql_help.c:2560 sql_help.c:2616 -#: sql_help.c:2668 sql_help.c:2701 sql_help.c:2708 sql_help.c:2813 -#: sql_help.c:2831 sql_help.c:2844 sql_help.c:2917 sql_help.c:3037 -#: sql_help.c:3218 sql_help.c:3441 sql_help.c:3490 sql_help.c:3596 -#: sql_help.c:3798 sql_help.c:3804 sql_help.c:3862 sql_help.c:3894 -#: sql_help.c:4178 sql_help.c:4184 sql_help.c:4299 sql_help.c:4408 -#: sql_help.c:4410 sql_help.c:4467 sql_help.c:4506 sql_help.c:4657 -#: sql_help.c:4659 sql_help.c:4716 sql_help.c:4750 sql_help.c:4803 -#: sql_help.c:4889 sql_help.c:4891 sql_help.c:4948 +#: sql_help.c:1937 sql_help.c:2274 sql_help.c:2286 sql_help.c:2400 +#: sql_help.c:2440 sql_help.c:2517 sql_help.c:2562 sql_help.c:2618 +#: sql_help.c:2670 sql_help.c:2703 sql_help.c:2710 sql_help.c:2815 +#: sql_help.c:2833 sql_help.c:2846 sql_help.c:2919 sql_help.c:3039 +#: sql_help.c:3220 sql_help.c:3443 sql_help.c:3492 sql_help.c:3598 +#: sql_help.c:3800 sql_help.c:3806 sql_help.c:3864 sql_help.c:3896 +#: sql_help.c:4180 sql_help.c:4186 sql_help.c:4301 sql_help.c:4410 +#: sql_help.c:4412 sql_help.c:4469 sql_help.c:4508 sql_help.c:4659 +#: sql_help.c:4661 sql_help.c:4718 sql_help.c:4752 sql_help.c:4804 +#: sql_help.c:4890 sql_help.c:4892 sql_help.c:4949 msgid "table_name" msgstr "table_name" -#: sql_help.c:815 sql_help.c:2517 +#: sql_help.c:816 sql_help.c:2519 msgid "using_expression" msgstr "using_expression" -#: sql_help.c:816 sql_help.c:2518 +#: sql_help.c:817 sql_help.c:2520 msgid "check_expression" msgstr "check_expression" -#: sql_help.c:890 sql_help.c:2561 +#: sql_help.c:891 sql_help.c:2563 msgid "publication_parameter" msgstr "publication_parameter" -#: sql_help.c:934 sql_help.c:1605 sql_help.c:2377 sql_help.c:2593 -#: sql_help.c:3152 +#: sql_help.c:935 sql_help.c:1605 sql_help.c:2379 sql_help.c:2595 +#: sql_help.c:3154 msgid "password" msgstr "password" -#: sql_help.c:935 sql_help.c:1606 sql_help.c:2378 sql_help.c:2594 -#: sql_help.c:3153 +#: sql_help.c:936 sql_help.c:1606 sql_help.c:2380 sql_help.c:2596 +#: sql_help.c:3155 msgid "timestamp" msgstr "timestamp" -#: sql_help.c:939 sql_help.c:943 sql_help.c:946 sql_help.c:949 sql_help.c:1610 -#: sql_help.c:1614 sql_help.c:1617 sql_help.c:1620 sql_help.c:3811 -#: sql_help.c:4191 +#: sql_help.c:940 sql_help.c:944 sql_help.c:947 sql_help.c:950 sql_help.c:1610 +#: sql_help.c:1614 sql_help.c:1617 sql_help.c:1620 sql_help.c:3813 +#: sql_help.c:4193 msgid "database_name" msgstr "database_name" -#: sql_help.c:1053 sql_help.c:2663 +#: sql_help.c:1055 sql_help.c:2665 msgid "increment" msgstr "increment" -#: sql_help.c:1054 sql_help.c:2664 +#: sql_help.c:1056 sql_help.c:2666 msgid "minvalue" msgstr "minvalue" -#: sql_help.c:1055 sql_help.c:2665 +#: sql_help.c:1057 sql_help.c:2667 msgid "maxvalue" msgstr "maxvalue" -#: sql_help.c:1056 sql_help.c:2666 sql_help.c:4406 sql_help.c:4504 -#: sql_help.c:4655 sql_help.c:4820 sql_help.c:4887 +#: sql_help.c:1058 sql_help.c:2668 sql_help.c:4408 sql_help.c:4506 +#: sql_help.c:4657 sql_help.c:4821 sql_help.c:4888 msgid "start" msgstr "start" -#: sql_help.c:1057 sql_help.c:1318 +#: sql_help.c:1059 sql_help.c:1319 msgid "restart" msgstr "restart" -#: sql_help.c:1058 sql_help.c:2667 +#: sql_help.c:1060 sql_help.c:2669 msgid "cache" msgstr "cache" -#: sql_help.c:1102 +#: sql_help.c:1104 msgid "new_target" msgstr "new_target" -#: sql_help.c:1120 sql_help.c:2720 +#: sql_help.c:1122 sql_help.c:2722 msgid "conninfo" msgstr "conninfo" -#: sql_help.c:1122 sql_help.c:1126 sql_help.c:1130 sql_help.c:2721 +#: sql_help.c:1124 sql_help.c:1128 sql_help.c:1132 sql_help.c:2723 msgid "publication_name" msgstr "publication_name" -#: sql_help.c:1123 sql_help.c:1127 sql_help.c:1131 -msgid "set_publication_option" -msgstr "set_publication_option" +#: sql_help.c:1125 sql_help.c:1129 sql_help.c:1133 +msgid "publication_option" +msgstr "publication_option" -#: sql_help.c:1134 +#: sql_help.c:1136 msgid "refresh_option" msgstr "refresh_option" -#: sql_help.c:1139 sql_help.c:2722 +#: sql_help.c:1141 sql_help.c:2724 msgid "subscription_parameter" msgstr "subscription_parameter" -#: sql_help.c:1295 sql_help.c:1298 +#: sql_help.c:1296 sql_help.c:1299 msgid "partition_name" msgstr "partition_name" -#: sql_help.c:1296 sql_help.c:2290 sql_help.c:2849 +#: sql_help.c:1297 sql_help.c:2291 sql_help.c:2851 msgid "partition_bound_spec" msgstr "partition_bound_spec" -#: sql_help.c:1315 sql_help.c:1364 sql_help.c:2863 +#: sql_help.c:1316 sql_help.c:1365 sql_help.c:2865 msgid "sequence_options" msgstr "sequence_options" -#: sql_help.c:1317 +#: sql_help.c:1318 msgid "sequence_option" msgstr "sequence_option" -#: sql_help.c:1331 +#: sql_help.c:1332 msgid "table_constraint_using_index" msgstr "table_constraint_using_index" -#: sql_help.c:1339 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 +#: sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 sql_help.c:1343 msgid "rewrite_rule_name" msgstr "rewrite_rule_name" -#: sql_help.c:1353 sql_help.c:2888 +#: sql_help.c:1354 sql_help.c:2890 msgid "and partition_bound_spec is:" msgstr "και partition_bound_spec είναι:" -#: sql_help.c:1354 sql_help.c:1355 sql_help.c:1356 sql_help.c:2889 -#: sql_help.c:2890 sql_help.c:2891 +#: sql_help.c:1355 sql_help.c:1356 sql_help.c:1357 sql_help.c:2891 +#: sql_help.c:2892 sql_help.c:2893 msgid "partition_bound_expr" msgstr "partition_bound_expr" -#: sql_help.c:1357 sql_help.c:1358 sql_help.c:2892 sql_help.c:2893 +#: sql_help.c:1358 sql_help.c:1359 sql_help.c:2894 sql_help.c:2895 msgid "numeric_literal" msgstr "numeric_literal" -#: sql_help.c:1359 +#: sql_help.c:1360 msgid "and column_constraint is:" msgstr "και column_constraint είναι:" -#: sql_help.c:1362 sql_help.c:2297 sql_help.c:2331 sql_help.c:2539 -#: sql_help.c:2861 +#: sql_help.c:1363 sql_help.c:2298 sql_help.c:2333 sql_help.c:2541 +#: sql_help.c:2863 msgid "default_expr" msgstr "default_expr" -#: sql_help.c:1363 sql_help.c:2298 sql_help.c:2862 +#: sql_help.c:1364 sql_help.c:2299 sql_help.c:2864 msgid "generation_expr" msgstr "generation_expr" -#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1376 sql_help.c:1378 -#: sql_help.c:1382 sql_help.c:2864 sql_help.c:2865 sql_help.c:2874 -#: sql_help.c:2876 sql_help.c:2880 +#: sql_help.c:1366 sql_help.c:1367 sql_help.c:1376 sql_help.c:1378 +#: sql_help.c:1382 sql_help.c:2866 sql_help.c:2867 sql_help.c:2876 +#: sql_help.c:2878 sql_help.c:2882 msgid "index_parameters" msgstr "index_parameters" -#: sql_help.c:1368 sql_help.c:1385 sql_help.c:2866 sql_help.c:2883 +#: sql_help.c:1368 sql_help.c:1385 sql_help.c:2868 sql_help.c:2885 msgid "reftable" msgstr "reftable" -#: sql_help.c:1369 sql_help.c:1386 sql_help.c:2867 sql_help.c:2884 +#: sql_help.c:1369 sql_help.c:1386 sql_help.c:2869 sql_help.c:2886 msgid "refcolumn" msgstr "refcolumn" #: sql_help.c:1370 sql_help.c:1371 sql_help.c:1387 sql_help.c:1388 -#: sql_help.c:2868 sql_help.c:2869 sql_help.c:2885 sql_help.c:2886 +#: sql_help.c:2870 sql_help.c:2871 sql_help.c:2887 sql_help.c:2888 msgid "referential_action" msgstr "referential_action" -#: sql_help.c:1372 sql_help.c:2299 sql_help.c:2870 +#: sql_help.c:1372 sql_help.c:2300 sql_help.c:2872 msgid "and table_constraint is:" msgstr "και table_constraint είναι:" -#: sql_help.c:1380 sql_help.c:2878 +#: sql_help.c:1380 sql_help.c:2880 msgid "exclude_element" msgstr "exclude_element" -#: sql_help.c:1381 sql_help.c:2879 sql_help.c:4404 sql_help.c:4502 -#: sql_help.c:4653 sql_help.c:4818 sql_help.c:4885 +#: sql_help.c:1381 sql_help.c:2881 sql_help.c:4406 sql_help.c:4504 +#: sql_help.c:4655 sql_help.c:4819 sql_help.c:4886 msgid "operator" msgstr "operator" -#: sql_help.c:1383 sql_help.c:2410 sql_help.c:2881 +#: sql_help.c:1383 sql_help.c:2412 sql_help.c:2883 msgid "predicate" msgstr "predicate" @@ -4907,20 +4896,20 @@ msgstr "predicate" msgid "and table_constraint_using_index is:" msgstr "και table_constraint_using_index είναι:" -#: sql_help.c:1392 sql_help.c:2894 +#: sql_help.c:1392 sql_help.c:2896 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "index_parameters για περιορισμούς UNIQUE, PRIMARY KEY και EXCLUDE είναι:" -#: sql_help.c:1397 sql_help.c:2899 +#: sql_help.c:1397 sql_help.c:2901 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "exclude_element σε έναν περιορισμό τύπου EXCLUDE είναι:" -#: sql_help.c:1400 sql_help.c:2403 sql_help.c:2826 sql_help.c:2839 -#: sql_help.c:2853 sql_help.c:2902 sql_help.c:3907 +#: sql_help.c:1400 sql_help.c:2405 sql_help.c:2828 sql_help.c:2841 +#: sql_help.c:2855 sql_help.c:2904 sql_help.c:3909 msgid "opclass" msgstr "opclass" -#: sql_help.c:1416 sql_help.c:1419 sql_help.c:2937 +#: sql_help.c:1416 sql_help.c:1419 sql_help.c:2939 msgid "tablespace_option" msgstr "tablespace_option" @@ -4941,7 +4930,7 @@ msgid "new_dictionary" msgstr "new_dictionary" #: sql_help.c:1546 sql_help.c:1560 sql_help.c:1563 sql_help.c:1564 -#: sql_help.c:3090 +#: sql_help.c:3092 msgid "attribute_name" msgstr "attribute_name" @@ -4965,55 +4954,54 @@ msgstr "existing_enum_value" msgid "property" msgstr "property" -#: sql_help.c:1633 sql_help.c:2282 sql_help.c:2291 sql_help.c:2679 -#: sql_help.c:3170 sql_help.c:3621 sql_help.c:3820 sql_help.c:3863 -#: sql_help.c:4200 +#: sql_help.c:1633 sql_help.c:2283 sql_help.c:2292 sql_help.c:2681 +#: sql_help.c:3172 sql_help.c:3623 sql_help.c:3822 sql_help.c:3865 +#: sql_help.c:4202 msgid "server_name" msgstr "server_name" -#: sql_help.c:1665 sql_help.c:1668 sql_help.c:3185 +#: sql_help.c:1665 sql_help.c:1668 sql_help.c:3187 msgid "view_option_name" msgstr "view_option_name" -#: sql_help.c:1666 sql_help.c:3186 +#: sql_help.c:1666 sql_help.c:3188 msgid "view_option_value" msgstr "view_option_value" -#: sql_help.c:1687 sql_help.c:1688 sql_help.c:4789 sql_help.c:4790 +#: sql_help.c:1687 sql_help.c:1688 sql_help.c:4791 sql_help.c:4792 msgid "table_and_columns" msgstr "table_and_columns" -#: sql_help.c:1689 sql_help.c:1752 sql_help.c:1943 sql_help.c:3669 -#: sql_help.c:4042 sql_help.c:4791 +#: sql_help.c:1689 sql_help.c:1752 sql_help.c:1943 sql_help.c:3671 +#: sql_help.c:4044 sql_help.c:4793 msgid "where option can be one of:" msgstr "όπου option μπορεί να είναι ένα από:" #: sql_help.c:1690 sql_help.c:1691 sql_help.c:1753 sql_help.c:1945 -#: sql_help.c:1948 sql_help.c:2127 sql_help.c:3670 sql_help.c:3671 -#: sql_help.c:3672 sql_help.c:3673 sql_help.c:3674 sql_help.c:3675 -#: sql_help.c:3676 sql_help.c:3677 sql_help.c:4043 sql_help.c:4045 -#: sql_help.c:4792 sql_help.c:4793 sql_help.c:4794 sql_help.c:4795 -#: sql_help.c:4796 sql_help.c:4797 sql_help.c:4798 sql_help.c:4799 -#: sql_help.c:4800 +#: sql_help.c:1948 sql_help.c:2127 sql_help.c:3672 sql_help.c:3673 +#: sql_help.c:3674 sql_help.c:3675 sql_help.c:3676 sql_help.c:3677 +#: sql_help.c:3678 sql_help.c:3679 sql_help.c:4045 sql_help.c:4047 +#: sql_help.c:4794 sql_help.c:4795 sql_help.c:4796 sql_help.c:4797 +#: sql_help.c:4798 sql_help.c:4799 sql_help.c:4800 sql_help.c:4801 msgid "boolean" msgstr "boolean" -#: sql_help.c:1692 sql_help.c:4802 +#: sql_help.c:1692 sql_help.c:4803 msgid "and table_and_columns is:" msgstr "και table_and_columns είναι:" -#: sql_help.c:1708 sql_help.c:4562 sql_help.c:4564 sql_help.c:4588 +#: sql_help.c:1708 sql_help.c:4564 sql_help.c:4566 sql_help.c:4590 msgid "transaction_mode" msgstr "transaction_mode" -#: sql_help.c:1709 sql_help.c:4565 sql_help.c:4589 +#: sql_help.c:1709 sql_help.c:4567 sql_help.c:4591 msgid "where transaction_mode is one of:" msgstr "όπου transaction_mode είναι ένα από:" -#: sql_help.c:1718 sql_help.c:4414 sql_help.c:4423 sql_help.c:4427 -#: sql_help.c:4431 sql_help.c:4434 sql_help.c:4663 sql_help.c:4672 -#: sql_help.c:4676 sql_help.c:4680 sql_help.c:4683 sql_help.c:4895 -#: sql_help.c:4904 sql_help.c:4908 sql_help.c:4912 sql_help.c:4915 +#: sql_help.c:1718 sql_help.c:4416 sql_help.c:4425 sql_help.c:4429 +#: sql_help.c:4433 sql_help.c:4436 sql_help.c:4665 sql_help.c:4674 +#: sql_help.c:4678 sql_help.c:4682 sql_help.c:4685 sql_help.c:4896 +#: sql_help.c:4905 sql_help.c:4909 sql_help.c:4913 sql_help.c:4916 msgid "argument" msgstr "argument" @@ -5021,7 +5009,7 @@ msgstr "argument" msgid "relation_name" msgstr "relation_name" -#: sql_help.c:1823 sql_help.c:3814 sql_help.c:4194 +#: sql_help.c:1823 sql_help.c:3816 sql_help.c:4196 msgid "domain_name" msgstr "domain_name" @@ -5037,28 +5025,28 @@ msgstr "rule_name" msgid "text" msgstr "text" -#: sql_help.c:1902 sql_help.c:4007 sql_help.c:4244 +#: sql_help.c:1902 sql_help.c:4009 sql_help.c:4246 msgid "transaction_id" msgstr "transaction_id" -#: sql_help.c:1933 sql_help.c:1940 sql_help.c:3933 +#: sql_help.c:1933 sql_help.c:1940 sql_help.c:3935 msgid "filename" msgstr "filename" -#: sql_help.c:1934 sql_help.c:1941 sql_help.c:2618 sql_help.c:2619 -#: sql_help.c:2620 +#: sql_help.c:1934 sql_help.c:1941 sql_help.c:2620 sql_help.c:2621 +#: sql_help.c:2622 msgid "command" msgstr "command" -#: sql_help.c:1936 sql_help.c:2617 sql_help.c:3040 sql_help.c:3221 -#: sql_help.c:3917 sql_help.c:4397 sql_help.c:4399 sql_help.c:4495 -#: sql_help.c:4497 sql_help.c:4646 sql_help.c:4648 sql_help.c:4759 -#: sql_help.c:4878 sql_help.c:4880 +#: sql_help.c:1936 sql_help.c:2619 sql_help.c:3042 sql_help.c:3223 +#: sql_help.c:3919 sql_help.c:4399 sql_help.c:4401 sql_help.c:4497 +#: sql_help.c:4499 sql_help.c:4648 sql_help.c:4650 sql_help.c:4761 +#: sql_help.c:4879 sql_help.c:4881 msgid "condition" msgstr "condition" -#: sql_help.c:1939 sql_help.c:2444 sql_help.c:2923 sql_help.c:3187 -#: sql_help.c:3205 sql_help.c:3898 +#: sql_help.c:1939 sql_help.c:2446 sql_help.c:2925 sql_help.c:3189 +#: sql_help.c:3207 sql_help.c:3900 msgid "query" msgstr "query" @@ -5174,11 +5162,11 @@ msgstr "lc_collate" msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2126 sql_help.c:4297 +#: sql_help.c:2126 sql_help.c:4299 msgid "provider" msgstr "provider" -#: sql_help.c:2128 sql_help.c:2220 +#: sql_help.c:2128 sql_help.c:2221 msgid "version" msgstr "version" @@ -5194,7 +5182,7 @@ msgstr "source_encoding" msgid "dest_encoding" msgstr "dest_encoding" -#: sql_help.c:2162 sql_help.c:2963 +#: sql_help.c:2162 sql_help.c:2965 msgid "template" msgstr "template" @@ -5210,7 +5198,7 @@ msgstr "constraint" msgid "where constraint is:" msgstr "όπου constraint είναι:" -#: sql_help.c:2205 sql_help.c:2615 sql_help.c:3036 +#: sql_help.c:2205 sql_help.c:2617 sql_help.c:3038 msgid "event" msgstr "event" @@ -5218,1252 +5206,1240 @@ msgstr "event" msgid "filter_variable" msgstr "filter_variable" -#: sql_help.c:2294 sql_help.c:2858 +#: sql_help.c:2207 +#, fuzzy +#| msgid "filter_variable" +msgid "filter_value" +msgstr "filter_variable" + +#: sql_help.c:2295 sql_help.c:2860 msgid "where column_constraint is:" msgstr "όπου column_constraint είναι:" -#: sql_help.c:2332 +#: sql_help.c:2334 msgid "rettype" msgstr "rettype" -#: sql_help.c:2334 +#: sql_help.c:2336 msgid "column_type" msgstr "column_type" -#: sql_help.c:2343 sql_help.c:2545 +#: sql_help.c:2345 sql_help.c:2547 msgid "definition" msgstr "definition" -#: sql_help.c:2344 sql_help.c:2546 +#: sql_help.c:2346 sql_help.c:2548 msgid "obj_file" msgstr "obj_file" -#: sql_help.c:2345 sql_help.c:2547 +#: sql_help.c:2347 sql_help.c:2549 msgid "link_symbol" msgstr "link_symbol" -#: sql_help.c:2346 sql_help.c:2548 +#: sql_help.c:2348 sql_help.c:2550 msgid "sql_body" -msgstr "" +msgstr "sql_body" -#: sql_help.c:2384 sql_help.c:2600 sql_help.c:3159 +#: sql_help.c:2386 sql_help.c:2602 sql_help.c:3161 msgid "uid" msgstr "uid" -#: sql_help.c:2399 sql_help.c:2440 sql_help.c:2827 sql_help.c:2840 -#: sql_help.c:2854 sql_help.c:2919 +#: sql_help.c:2401 sql_help.c:2442 sql_help.c:2829 sql_help.c:2842 +#: sql_help.c:2856 sql_help.c:2921 msgid "method" msgstr "method" -#: sql_help.c:2404 +#: sql_help.c:2406 msgid "opclass_parameter" msgstr "opclass_parameter" -#: sql_help.c:2421 +#: sql_help.c:2423 msgid "call_handler" msgstr "call_handler" -#: sql_help.c:2422 +#: sql_help.c:2424 msgid "inline_handler" msgstr "inline_handler" -#: sql_help.c:2423 +#: sql_help.c:2425 msgid "valfunction" msgstr "valfunction" -#: sql_help.c:2462 +#: sql_help.c:2464 msgid "com_op" msgstr "com_op" -#: sql_help.c:2463 +#: sql_help.c:2465 msgid "neg_op" msgstr "neg_op" -#: sql_help.c:2481 +#: sql_help.c:2483 msgid "family_name" msgstr "family_name" -#: sql_help.c:2492 +#: sql_help.c:2494 msgid "storage_type" msgstr "storage_type" -#: sql_help.c:2621 sql_help.c:3043 +#: sql_help.c:2623 sql_help.c:3045 msgid "where event can be one of:" msgstr "όπου event μπορεί να είναι ένα από:" -#: sql_help.c:2641 sql_help.c:2643 +#: sql_help.c:2643 sql_help.c:2645 msgid "schema_element" msgstr "schema_element" -#: sql_help.c:2680 +#: sql_help.c:2682 msgid "server_type" msgstr "server_type" -#: sql_help.c:2681 +#: sql_help.c:2683 msgid "server_version" msgstr "server_version" -#: sql_help.c:2682 sql_help.c:3817 sql_help.c:4197 +#: sql_help.c:2684 sql_help.c:3819 sql_help.c:4199 msgid "fdw_name" msgstr "fdw_name" -#: sql_help.c:2699 sql_help.c:2702 +#: sql_help.c:2701 sql_help.c:2704 msgid "statistics_name" msgstr "statistics_name" -#: sql_help.c:2703 +#: sql_help.c:2705 msgid "statistics_kind" msgstr "statistics_kind" -#: sql_help.c:2719 +#: sql_help.c:2721 msgid "subscription_name" msgstr "subscription_name" -#: sql_help.c:2820 +#: sql_help.c:2822 msgid "source_table" msgstr "source_table" -#: sql_help.c:2821 +#: sql_help.c:2823 msgid "like_option" msgstr "like_option" -#: sql_help.c:2887 +#: sql_help.c:2889 msgid "and like_option is:" msgstr "και like_option είναι:" -#: sql_help.c:2936 +#: sql_help.c:2938 msgid "directory" msgstr "directory" -#: sql_help.c:2950 +#: sql_help.c:2952 msgid "parser_name" msgstr "parser_name" -#: sql_help.c:2951 +#: sql_help.c:2953 msgid "source_config" msgstr "source_config" -#: sql_help.c:2980 +#: sql_help.c:2982 msgid "start_function" msgstr "start_function" -#: sql_help.c:2981 +#: sql_help.c:2983 msgid "gettoken_function" msgstr "gettoken_function" -#: sql_help.c:2982 +#: sql_help.c:2984 msgid "end_function" msgstr "end_function" -#: sql_help.c:2983 +#: sql_help.c:2985 msgid "lextypes_function" msgstr "lextypes_function" -#: sql_help.c:2984 +#: sql_help.c:2986 msgid "headline_function" msgstr "headline_function" -#: sql_help.c:2996 +#: sql_help.c:2998 msgid "init_function" msgstr "init_function" -#: sql_help.c:2997 +#: sql_help.c:2999 msgid "lexize_function" msgstr "lexize_function" -#: sql_help.c:3010 +#: sql_help.c:3012 msgid "from_sql_function_name" msgstr "from_sql_function_name" -#: sql_help.c:3012 +#: sql_help.c:3014 msgid "to_sql_function_name" msgstr "to_sql_function_name" -#: sql_help.c:3038 +#: sql_help.c:3040 msgid "referenced_table_name" msgstr "referenced_table_name" -#: sql_help.c:3039 +#: sql_help.c:3041 msgid "transition_relation_name" msgstr "transition_relation_name" -#: sql_help.c:3042 +#: sql_help.c:3044 msgid "arguments" msgstr "arguments" -#: sql_help.c:3094 sql_help.c:4330 +#: sql_help.c:3096 sql_help.c:4332 msgid "label" msgstr "label" -#: sql_help.c:3096 +#: sql_help.c:3098 msgid "subtype" msgstr "subtype" -#: sql_help.c:3097 +#: sql_help.c:3099 msgid "subtype_operator_class" msgstr "subtype_operator_class" -#: sql_help.c:3099 +#: sql_help.c:3101 msgid "canonical_function" msgstr "canonical_function" -#: sql_help.c:3100 +#: sql_help.c:3102 msgid "subtype_diff_function" msgstr "subtype_diff_function" -#: sql_help.c:3101 -#, fuzzy -#| msgid "storage_type" +#: sql_help.c:3103 msgid "multirange_type_name" -msgstr "storage_type" +msgstr "multirange_type_name" -#: sql_help.c:3103 +#: sql_help.c:3105 msgid "input_function" msgstr "input_function" -#: sql_help.c:3104 +#: sql_help.c:3106 msgid "output_function" msgstr "output_function" -#: sql_help.c:3105 +#: sql_help.c:3107 msgid "receive_function" msgstr "receive_function" -#: sql_help.c:3106 +#: sql_help.c:3108 msgid "send_function" msgstr "send_function" -#: sql_help.c:3107 +#: sql_help.c:3109 msgid "type_modifier_input_function" msgstr "type_modifier_input_function" -#: sql_help.c:3108 +#: sql_help.c:3110 msgid "type_modifier_output_function" msgstr "type_modifier_output_function" -#: sql_help.c:3109 +#: sql_help.c:3111 msgid "analyze_function" msgstr "analyze_function" -#: sql_help.c:3110 -#, fuzzy -#| msgid "support_function" +#: sql_help.c:3112 msgid "subscript_function" -msgstr "support_function" +msgstr "subscript_function" -#: sql_help.c:3111 +#: sql_help.c:3113 msgid "internallength" msgstr "internallength" -#: sql_help.c:3112 +#: sql_help.c:3114 msgid "alignment" msgstr "alignment" -#: sql_help.c:3113 +#: sql_help.c:3115 msgid "storage" msgstr "storage" -#: sql_help.c:3114 +#: sql_help.c:3116 msgid "like_type" msgstr "like_type" -#: sql_help.c:3115 +#: sql_help.c:3117 msgid "category" msgstr "category" -#: sql_help.c:3116 +#: sql_help.c:3118 msgid "preferred" msgstr "preferred" -#: sql_help.c:3117 +#: sql_help.c:3119 msgid "default" msgstr "default" -#: sql_help.c:3118 +#: sql_help.c:3120 msgid "element" msgstr "element" -#: sql_help.c:3119 +#: sql_help.c:3121 msgid "delimiter" msgstr "delimiter" -#: sql_help.c:3120 +#: sql_help.c:3122 msgid "collatable" msgstr "collatable" -#: sql_help.c:3217 sql_help.c:3893 sql_help.c:4392 sql_help.c:4489 -#: sql_help.c:4641 sql_help.c:4749 sql_help.c:4873 +#: sql_help.c:3219 sql_help.c:3895 sql_help.c:4394 sql_help.c:4491 +#: sql_help.c:4643 sql_help.c:4751 sql_help.c:4874 msgid "with_query" msgstr "with_query" -#: sql_help.c:3219 sql_help.c:3895 sql_help.c:4411 sql_help.c:4417 -#: sql_help.c:4420 sql_help.c:4424 sql_help.c:4428 sql_help.c:4436 -#: sql_help.c:4660 sql_help.c:4666 sql_help.c:4669 sql_help.c:4673 -#: sql_help.c:4677 sql_help.c:4685 sql_help.c:4751 sql_help.c:4892 -#: sql_help.c:4898 sql_help.c:4901 sql_help.c:4905 sql_help.c:4909 -#: sql_help.c:4917 +#: sql_help.c:3221 sql_help.c:3897 sql_help.c:4413 sql_help.c:4419 +#: sql_help.c:4422 sql_help.c:4426 sql_help.c:4430 sql_help.c:4438 +#: sql_help.c:4662 sql_help.c:4668 sql_help.c:4671 sql_help.c:4675 +#: sql_help.c:4679 sql_help.c:4687 sql_help.c:4753 sql_help.c:4893 +#: sql_help.c:4899 sql_help.c:4902 sql_help.c:4906 sql_help.c:4910 +#: sql_help.c:4918 msgid "alias" msgstr "alias" -#: sql_help.c:3220 sql_help.c:4396 sql_help.c:4438 sql_help.c:4440 -#: sql_help.c:4494 sql_help.c:4645 sql_help.c:4687 sql_help.c:4689 -#: sql_help.c:4758 sql_help.c:4877 sql_help.c:4919 sql_help.c:4921 +#: sql_help.c:3222 sql_help.c:4398 sql_help.c:4440 sql_help.c:4442 +#: sql_help.c:4496 sql_help.c:4647 sql_help.c:4689 sql_help.c:4691 +#: sql_help.c:4760 sql_help.c:4878 sql_help.c:4920 sql_help.c:4922 msgid "from_item" msgstr "from_item" -#: sql_help.c:3222 sql_help.c:3703 sql_help.c:3974 sql_help.c:4760 +#: sql_help.c:3224 sql_help.c:3705 sql_help.c:3976 sql_help.c:4762 msgid "cursor_name" msgstr "cursor_name" -#: sql_help.c:3223 sql_help.c:3901 sql_help.c:4761 +#: sql_help.c:3225 sql_help.c:3903 sql_help.c:4763 msgid "output_expression" msgstr "output_expression" -#: sql_help.c:3224 sql_help.c:3902 sql_help.c:4395 sql_help.c:4492 -#: sql_help.c:4644 sql_help.c:4762 sql_help.c:4876 +#: sql_help.c:3226 sql_help.c:3904 sql_help.c:4397 sql_help.c:4494 +#: sql_help.c:4646 sql_help.c:4764 sql_help.c:4877 msgid "output_name" msgstr "output_name" -#: sql_help.c:3240 +#: sql_help.c:3242 msgid "code" msgstr "code" -#: sql_help.c:3645 +#: sql_help.c:3647 msgid "parameter" msgstr "parameter" -#: sql_help.c:3667 sql_help.c:3668 sql_help.c:3999 +#: sql_help.c:3669 sql_help.c:3670 sql_help.c:4001 msgid "statement" msgstr "statement" -#: sql_help.c:3702 sql_help.c:3973 +#: sql_help.c:3704 sql_help.c:3975 msgid "direction" msgstr "direction" -#: sql_help.c:3704 sql_help.c:3975 +#: sql_help.c:3706 sql_help.c:3977 msgid "where direction can be empty or one of:" msgstr "όπου direction μπορεί να είναι άδειο ή ένα από:" -#: sql_help.c:3705 sql_help.c:3706 sql_help.c:3707 sql_help.c:3708 -#: sql_help.c:3709 sql_help.c:3976 sql_help.c:3977 sql_help.c:3978 -#: sql_help.c:3979 sql_help.c:3980 sql_help.c:4405 sql_help.c:4407 -#: sql_help.c:4503 sql_help.c:4505 sql_help.c:4654 sql_help.c:4656 -#: sql_help.c:4819 sql_help.c:4821 sql_help.c:4886 sql_help.c:4888 +#: sql_help.c:3707 sql_help.c:3708 sql_help.c:3709 sql_help.c:3710 +#: sql_help.c:3711 sql_help.c:3978 sql_help.c:3979 sql_help.c:3980 +#: sql_help.c:3981 sql_help.c:3982 sql_help.c:4407 sql_help.c:4409 +#: sql_help.c:4505 sql_help.c:4507 sql_help.c:4656 sql_help.c:4658 +#: sql_help.c:4820 sql_help.c:4822 sql_help.c:4887 sql_help.c:4889 msgid "count" msgstr "count" -#: sql_help.c:3807 sql_help.c:4187 +#: sql_help.c:3809 sql_help.c:4189 msgid "sequence_name" msgstr "sequence_name" -#: sql_help.c:3825 sql_help.c:4205 +#: sql_help.c:3827 sql_help.c:4207 msgid "arg_name" msgstr "arg_name" -#: sql_help.c:3826 sql_help.c:4206 +#: sql_help.c:3828 sql_help.c:4208 msgid "arg_type" msgstr "arg_type" -#: sql_help.c:3833 sql_help.c:4213 +#: sql_help.c:3835 sql_help.c:4215 msgid "loid" msgstr "loid" -#: sql_help.c:3861 +#: sql_help.c:3863 msgid "remote_schema" msgstr "remote_schema" -#: sql_help.c:3864 +#: sql_help.c:3866 msgid "local_schema" msgstr "local_schema" -#: sql_help.c:3899 +#: sql_help.c:3901 msgid "conflict_target" msgstr "conflict_target" -#: sql_help.c:3900 +#: sql_help.c:3902 msgid "conflict_action" msgstr "conflict_action" -#: sql_help.c:3903 +#: sql_help.c:3905 msgid "where conflict_target can be one of:" msgstr "όπου conflict_target μπορεί να είναι ένα από:" -#: sql_help.c:3904 +#: sql_help.c:3906 msgid "index_column_name" msgstr "index_column_name" -#: sql_help.c:3905 +#: sql_help.c:3907 msgid "index_expression" msgstr "index_expression" -#: sql_help.c:3908 +#: sql_help.c:3910 msgid "index_predicate" msgstr "index_predicate" -#: sql_help.c:3910 +#: sql_help.c:3912 msgid "and conflict_action is one of:" msgstr "και conflict_action είναι ένα από:" -#: sql_help.c:3916 sql_help.c:4757 +#: sql_help.c:3918 sql_help.c:4759 msgid "sub-SELECT" msgstr "sub-SELECT" -#: sql_help.c:3925 sql_help.c:3988 sql_help.c:4733 +#: sql_help.c:3927 sql_help.c:3990 sql_help.c:4735 msgid "channel" msgstr "channel" -#: sql_help.c:3947 +#: sql_help.c:3949 msgid "lockmode" msgstr "lockmode" -#: sql_help.c:3948 +#: sql_help.c:3950 msgid "where lockmode is one of:" msgstr "όπου lockmode είναι ένα από:" -#: sql_help.c:3989 +#: sql_help.c:3991 msgid "payload" msgstr "payload" -#: sql_help.c:4016 +#: sql_help.c:4018 msgid "old_role" msgstr "old_role" -#: sql_help.c:4017 +#: sql_help.c:4019 msgid "new_role" msgstr "new_role" -#: sql_help.c:4053 sql_help.c:4252 sql_help.c:4260 +#: sql_help.c:4055 sql_help.c:4254 sql_help.c:4262 msgid "savepoint_name" msgstr "savepoint_name" -#: sql_help.c:4398 sql_help.c:4451 sql_help.c:4647 sql_help.c:4700 -#: sql_help.c:4879 sql_help.c:4932 +#: sql_help.c:4400 sql_help.c:4453 sql_help.c:4649 sql_help.c:4702 +#: sql_help.c:4880 sql_help.c:4933 msgid "grouping_element" msgstr "grouping_element" -#: sql_help.c:4400 sql_help.c:4498 sql_help.c:4649 sql_help.c:4881 +#: sql_help.c:4402 sql_help.c:4500 sql_help.c:4651 sql_help.c:4882 msgid "window_name" msgstr "window_name" -#: sql_help.c:4401 sql_help.c:4499 sql_help.c:4650 sql_help.c:4882 +#: sql_help.c:4403 sql_help.c:4501 sql_help.c:4652 sql_help.c:4883 msgid "window_definition" msgstr "window_definition" -#: sql_help.c:4402 sql_help.c:4416 sql_help.c:4455 sql_help.c:4500 -#: sql_help.c:4651 sql_help.c:4665 sql_help.c:4704 sql_help.c:4883 -#: sql_help.c:4897 sql_help.c:4936 +#: sql_help.c:4404 sql_help.c:4418 sql_help.c:4457 sql_help.c:4502 +#: sql_help.c:4653 sql_help.c:4667 sql_help.c:4706 sql_help.c:4884 +#: sql_help.c:4898 sql_help.c:4937 msgid "select" msgstr "select" -#: sql_help.c:4409 sql_help.c:4658 sql_help.c:4890 +#: sql_help.c:4411 sql_help.c:4660 sql_help.c:4891 msgid "where from_item can be one of:" msgstr "όπου from_item μπορεί να είναι ένα από:" -#: sql_help.c:4412 sql_help.c:4418 sql_help.c:4421 sql_help.c:4425 -#: sql_help.c:4437 sql_help.c:4661 sql_help.c:4667 sql_help.c:4670 -#: sql_help.c:4674 sql_help.c:4686 sql_help.c:4893 sql_help.c:4899 -#: sql_help.c:4902 sql_help.c:4906 sql_help.c:4918 +#: sql_help.c:4414 sql_help.c:4420 sql_help.c:4423 sql_help.c:4427 +#: sql_help.c:4439 sql_help.c:4663 sql_help.c:4669 sql_help.c:4672 +#: sql_help.c:4676 sql_help.c:4688 sql_help.c:4894 sql_help.c:4900 +#: sql_help.c:4903 sql_help.c:4907 sql_help.c:4919 msgid "column_alias" msgstr "column_alias" -#: sql_help.c:4413 sql_help.c:4662 sql_help.c:4894 +#: sql_help.c:4415 sql_help.c:4664 sql_help.c:4895 msgid "sampling_method" msgstr "sampling_method" -#: sql_help.c:4415 sql_help.c:4664 sql_help.c:4896 +#: sql_help.c:4417 sql_help.c:4666 sql_help.c:4897 msgid "seed" msgstr "seed" -#: sql_help.c:4419 sql_help.c:4453 sql_help.c:4668 sql_help.c:4702 -#: sql_help.c:4900 sql_help.c:4934 +#: sql_help.c:4421 sql_help.c:4455 sql_help.c:4670 sql_help.c:4704 +#: sql_help.c:4901 sql_help.c:4935 msgid "with_query_name" msgstr "with_query_name" -#: sql_help.c:4429 sql_help.c:4432 sql_help.c:4435 sql_help.c:4678 -#: sql_help.c:4681 sql_help.c:4684 sql_help.c:4910 sql_help.c:4913 -#: sql_help.c:4916 +#: sql_help.c:4431 sql_help.c:4434 sql_help.c:4437 sql_help.c:4680 +#: sql_help.c:4683 sql_help.c:4686 sql_help.c:4911 sql_help.c:4914 +#: sql_help.c:4917 msgid "column_definition" msgstr "column_definition" -#: sql_help.c:4439 sql_help.c:4688 sql_help.c:4920 +#: sql_help.c:4441 sql_help.c:4690 sql_help.c:4921 msgid "join_type" msgstr "join_type" -#: sql_help.c:4441 sql_help.c:4690 sql_help.c:4922 +#: sql_help.c:4443 sql_help.c:4692 sql_help.c:4923 msgid "join_condition" msgstr "join_condition" -#: sql_help.c:4442 sql_help.c:4691 sql_help.c:4923 +#: sql_help.c:4444 sql_help.c:4693 sql_help.c:4924 msgid "join_column" msgstr "join_column" -#: sql_help.c:4443 sql_help.c:4692 sql_help.c:4924 -#, fuzzy -#| msgid "column_alias" +#: sql_help.c:4445 sql_help.c:4694 sql_help.c:4925 msgid "join_using_alias" -msgstr "column_alias" +msgstr "join_using_alias" -#: sql_help.c:4444 sql_help.c:4693 sql_help.c:4925 +#: sql_help.c:4446 sql_help.c:4695 sql_help.c:4926 msgid "and grouping_element can be one of:" msgstr "και grouping_element μπορεί να είναι ένα από:" -#: sql_help.c:4452 sql_help.c:4701 sql_help.c:4933 +#: sql_help.c:4454 sql_help.c:4703 sql_help.c:4934 msgid "and with_query is:" msgstr "και with_query είναι:" -#: sql_help.c:4456 sql_help.c:4705 sql_help.c:4937 +#: sql_help.c:4458 sql_help.c:4707 sql_help.c:4938 msgid "values" msgstr "values" -#: sql_help.c:4457 sql_help.c:4706 sql_help.c:4938 +#: sql_help.c:4459 sql_help.c:4708 sql_help.c:4939 msgid "insert" msgstr "insert" -#: sql_help.c:4458 sql_help.c:4707 sql_help.c:4939 +#: sql_help.c:4460 sql_help.c:4709 sql_help.c:4940 msgid "update" msgstr "update" -#: sql_help.c:4459 sql_help.c:4708 sql_help.c:4940 +#: sql_help.c:4461 sql_help.c:4710 sql_help.c:4941 msgid "delete" msgstr "delete" -#: sql_help.c:4461 sql_help.c:4710 sql_help.c:4942 -#, fuzzy -#| msgid "schema_name" +#: sql_help.c:4463 sql_help.c:4712 sql_help.c:4943 msgid "search_seq_col_name" -msgstr "schema_name" +msgstr "search_seq_col_name" -#: sql_help.c:4463 sql_help.c:4712 sql_help.c:4944 -#, fuzzy -#| msgid "schema_name" +#: sql_help.c:4465 sql_help.c:4714 sql_help.c:4945 msgid "cycle_mark_col_name" -msgstr "schema_name" +msgstr "cycle_mark_col_name" -#: sql_help.c:4464 sql_help.c:4713 sql_help.c:4945 -#, fuzzy -#| msgid "new_enum_value" +#: sql_help.c:4466 sql_help.c:4715 sql_help.c:4946 msgid "cycle_mark_value" -msgstr "new_enum_value" +msgstr "cycle_mark_value" -#: sql_help.c:4465 sql_help.c:4714 sql_help.c:4946 +#: sql_help.c:4467 sql_help.c:4716 sql_help.c:4947 msgid "cycle_mark_default" -msgstr "" +msgstr "cycle_mark_default" -#: sql_help.c:4466 sql_help.c:4715 sql_help.c:4947 +#: sql_help.c:4468 sql_help.c:4717 sql_help.c:4948 msgid "cycle_path_col_name" -msgstr "" +msgstr "cycle_path_col_name" -#: sql_help.c:4493 +#: sql_help.c:4495 msgid "new_table" msgstr "new_table" -#: sql_help.c:4518 +#: sql_help.c:4520 msgid "timezone" msgstr "timezone" -#: sql_help.c:4563 +#: sql_help.c:4565 msgid "snapshot_id" msgstr "snapshot_id" -#: sql_help.c:4817 +#: sql_help.c:4818 msgid "sort_expression" msgstr "sort_expression" -#: sql_help.c:4954 sql_help.c:5932 +#: sql_help.c:4955 sql_help.c:5933 msgid "abort the current transaction" msgstr "ματαιώστε την τρέχουσα συναλλαγή" -#: sql_help.c:4960 +#: sql_help.c:4961 msgid "change the definition of an aggregate function" msgstr "αλλάξτε τον ορισμό μιας συνάρτησης συγκεντρωτικών αποτελεσμάτων" -#: sql_help.c:4966 +#: sql_help.c:4967 msgid "change the definition of a collation" msgstr "αλλάξτε τον ορισμό συρραφής" -#: sql_help.c:4972 +#: sql_help.c:4973 msgid "change the definition of a conversion" msgstr "αλλάξτε τον ορισμό μίας μετατροπής" -#: sql_help.c:4978 +#: sql_help.c:4979 msgid "change a database" msgstr "αλλάξτε μία βάση δεδομένων" -#: sql_help.c:4984 +#: sql_help.c:4985 msgid "define default access privileges" msgstr "ορίσθε τα προεπιλεγμένα δικαιώματα πρόσβασης" -#: sql_help.c:4990 +#: sql_help.c:4991 msgid "change the definition of a domain" msgstr "αλλάξτε τον ορισμό ενός τομέα" -#: sql_help.c:4996 +#: sql_help.c:4997 msgid "change the definition of an event trigger" msgstr "αλλάξτε τον ορισμό μιας ενεργοποίησης συμβάντος" -#: sql_help.c:5002 +#: sql_help.c:5003 msgid "change the definition of an extension" msgstr "αλλάξτε τον ορισμό μίας προέκτασης" -#: sql_help.c:5008 +#: sql_help.c:5009 msgid "change the definition of a foreign-data wrapper" msgstr "αλλάξτε τον ορισιμό μιας περιτύλιξης ξένων δεδομένων" -#: sql_help.c:5014 +#: sql_help.c:5015 msgid "change the definition of a foreign table" msgstr "αλλάξτε τον ορισιμό ενός ξενικού πίνακα" -#: sql_help.c:5020 +#: sql_help.c:5021 msgid "change the definition of a function" msgstr "αλλάξτε τον ορισμό μιας συνάρτησης" -#: sql_help.c:5026 +#: sql_help.c:5027 msgid "change role name or membership" msgstr "αλλάξτε το όνομα ρόλου ή ιδιότητας μέλους" -#: sql_help.c:5032 +#: sql_help.c:5033 msgid "change the definition of an index" msgstr "αλλάξτε τον ορισμό ενός ευρετηρίου" -#: sql_help.c:5038 +#: sql_help.c:5039 msgid "change the definition of a procedural language" msgstr "αλλάξτε τον ορισμό μιας διαδικαστικής γλώσσας" -#: sql_help.c:5044 +#: sql_help.c:5045 msgid "change the definition of a large object" msgstr "αλλάξτε τον ορισιμό ενός μεγάλου αντικειμένου" -#: sql_help.c:5050 +#: sql_help.c:5051 msgid "change the definition of a materialized view" msgstr "αλλάξτε τον ορισμό μίας υλοποιημένης όψης" -#: sql_help.c:5056 +#: sql_help.c:5057 msgid "change the definition of an operator" msgstr "αλλάξτε τον ορισμό ενός χειριστή" -#: sql_help.c:5062 +#: sql_help.c:5063 msgid "change the definition of an operator class" msgstr "αλλάξτε τον ορισμό μίας κλάσης χειριστή" -#: sql_help.c:5068 +#: sql_help.c:5069 msgid "change the definition of an operator family" msgstr "αλλάξτε τον ορισμό μίας οικογένειας χειριστή" -#: sql_help.c:5074 -#, fuzzy -#| msgid "change the definition of a row level security policy" +#: sql_help.c:5075 msgid "change the definition of a row-level security policy" -msgstr "αλλάξτε τον ορισιμό μιας πολιτική ασφάλειας επιπέδου σειράς" +msgstr "αλλάξτε τον ορισμό μιας πολιτικής ασφάλειας επιπέδου σειράς" -#: sql_help.c:5080 +#: sql_help.c:5081 msgid "change the definition of a procedure" msgstr "αλλάξτε τον ορισμό μίας διαδικασίας" -#: sql_help.c:5086 +#: sql_help.c:5087 msgid "change the definition of a publication" msgstr "αλλάξτε τον ορισμό μίας δημοσίευσης" -#: sql_help.c:5092 sql_help.c:5194 +#: sql_help.c:5093 sql_help.c:5195 msgid "change a database role" msgstr "αλλάξτε τον ρόλο μίας βάσης δεδομένων" -#: sql_help.c:5098 +#: sql_help.c:5099 msgid "change the definition of a routine" msgstr "αλλάξτε τον ορισμό μιας ρουτίνας" -#: sql_help.c:5104 +#: sql_help.c:5105 msgid "change the definition of a rule" msgstr "αλλάξτε τον ορισμό ενός κανόνα" -#: sql_help.c:5110 +#: sql_help.c:5111 msgid "change the definition of a schema" msgstr "αλλάξτε τον ορισμό ενός σχήματος" -#: sql_help.c:5116 +#: sql_help.c:5117 msgid "change the definition of a sequence generator" msgstr "αλλάξτε τον ορισμό μίας γεννήτριας ακολουθίας" -#: sql_help.c:5122 +#: sql_help.c:5123 msgid "change the definition of a foreign server" msgstr "αλλάξτε τον ορισμό ενός ξενικού διακομιστή" -#: sql_help.c:5128 +#: sql_help.c:5129 msgid "change the definition of an extended statistics object" msgstr "αλλάξτε τον ορισμό ενός εκτεταμένου αντικειμένου στατιστικών" -#: sql_help.c:5134 +#: sql_help.c:5135 msgid "change the definition of a subscription" msgstr "αλλάξτε τον ορισμό μιας συνδρομής" -#: sql_help.c:5140 +#: sql_help.c:5141 msgid "change a server configuration parameter" msgstr "αλλάξτε μία παράμετρο διαμόρφωσης διακομιστή" -#: sql_help.c:5146 +#: sql_help.c:5147 msgid "change the definition of a table" msgstr "αλλάξτε τον ορισμό ενός πίνακα" -#: sql_help.c:5152 +#: sql_help.c:5153 msgid "change the definition of a tablespace" msgstr "αλλάξτε τον ορισμό ενός πινακοχώρου" -#: sql_help.c:5158 +#: sql_help.c:5159 msgid "change the definition of a text search configuration" msgstr "αλλάξτε τον ορισμό μίας διαμόρφωσης αναζήτησης κειμένου" -#: sql_help.c:5164 +#: sql_help.c:5165 msgid "change the definition of a text search dictionary" msgstr "αλλάξτε τον ορισμό ενός λεξικού αναζήτησης κειμένου" -#: sql_help.c:5170 +#: sql_help.c:5171 msgid "change the definition of a text search parser" msgstr "αλλάξτε τον ορισμό ενός αναλυτή αναζήτησης κειμένου" -#: sql_help.c:5176 +#: sql_help.c:5177 msgid "change the definition of a text search template" msgstr "αλλάξτε τον ορισμό ενός προτύπου αναζήτησης κειμένου" -#: sql_help.c:5182 +#: sql_help.c:5183 msgid "change the definition of a trigger" msgstr "αλλάξτε τον ορισμό μιας ενεργοποίησης" -#: sql_help.c:5188 +#: sql_help.c:5189 msgid "change the definition of a type" msgstr "αλλάξτε τον ορισμό ενός τύπου" -#: sql_help.c:5200 +#: sql_help.c:5201 msgid "change the definition of a user mapping" msgstr "αλλάξτε τον ορισμό μίας αντιστοίχισης χρήστη" -#: sql_help.c:5206 +#: sql_help.c:5207 msgid "change the definition of a view" msgstr "αλλάξτε τον ορισμό μίας όψης" -#: sql_help.c:5212 +#: sql_help.c:5213 msgid "collect statistics about a database" msgstr "συλλέξτε στατιστικά σχετικά με μία βάση δεδομένων" -#: sql_help.c:5218 sql_help.c:6010 +#: sql_help.c:5219 sql_help.c:6011 msgid "start a transaction block" msgstr "εκκινήστε ένα μπλοκ συναλλαγής" -#: sql_help.c:5224 +#: sql_help.c:5225 msgid "invoke a procedure" msgstr "κλήση διαδικασίας" -#: sql_help.c:5230 +#: sql_help.c:5231 msgid "force a write-ahead log checkpoint" msgstr "επιβάλλετε εισαγωγή ενός σημείου ελέγχου (checkpoint) του write-ahead log" -#: sql_help.c:5236 +#: sql_help.c:5237 msgid "close a cursor" msgstr "κλείστε έναν δρομέα" -#: sql_help.c:5242 +#: sql_help.c:5243 msgid "cluster a table according to an index" msgstr "δημιουργείστε συστάδα ενός πίνακα σύμφωνα με ένα ευρετήριο" -#: sql_help.c:5248 +#: sql_help.c:5249 msgid "define or change the comment of an object" msgstr "ορίσετε ή αλλάξτε το σχόλιο ενός αντικειμένου" -#: sql_help.c:5254 sql_help.c:5812 +#: sql_help.c:5255 sql_help.c:5813 msgid "commit the current transaction" msgstr "ολοκληρώστε την τρέχουσας συναλλαγής" -#: sql_help.c:5260 +#: sql_help.c:5261 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "ολοκληρώστε μία συναλλαγή που είχε προετοιμαστεί νωρίτερα για ολοκλήρωση σε δύο φάσεις" -#: sql_help.c:5266 +#: sql_help.c:5267 msgid "copy data between a file and a table" msgstr "αντιγράψτε δεδομένα μεταξύ ενός αρχείου και ενός πίνακα" -#: sql_help.c:5272 +#: sql_help.c:5273 msgid "define a new access method" msgstr "ορίσετε μία νέα μέθοδο πρόσβασης" -#: sql_help.c:5278 +#: sql_help.c:5279 msgid "define a new aggregate function" msgstr "ορίσετε μία νέα συνάρτηση συγκεντρωτικών αποτελεσμάτων" -#: sql_help.c:5284 +#: sql_help.c:5285 msgid "define a new cast" msgstr "ορίσετε ένα νέο καστ" -#: sql_help.c:5290 +#: sql_help.c:5291 msgid "define a new collation" msgstr "ορίσετε μία νέα συρραφή" -#: sql_help.c:5296 +#: sql_help.c:5297 msgid "define a new encoding conversion" msgstr "ορίσετε μία νέα μετατροπή κωδικοποίησης" -#: sql_help.c:5302 +#: sql_help.c:5303 msgid "create a new database" msgstr "δημιουργήστε μία νέα βάση δεδομένων" -#: sql_help.c:5308 +#: sql_help.c:5309 msgid "define a new domain" msgstr "ορίσετε ένα νέο πεδίο" -#: sql_help.c:5314 +#: sql_help.c:5315 msgid "define a new event trigger" msgstr "ορίσετε μία νέα ενεργοποίησης συμβάντος" -#: sql_help.c:5320 +#: sql_help.c:5321 msgid "install an extension" msgstr "εγκαταστήστε μία νέα προέκταση" -#: sql_help.c:5326 +#: sql_help.c:5327 msgid "define a new foreign-data wrapper" msgstr "ορίσετε μία νέα περιτύλιξη ξένων δεδομένων" -#: sql_help.c:5332 +#: sql_help.c:5333 msgid "define a new foreign table" msgstr "ορίσετε ένα νέο ξενικό πίνακα" -#: sql_help.c:5338 +#: sql_help.c:5339 msgid "define a new function" msgstr "ορίσετε μία νέα συνάρτηση" -#: sql_help.c:5344 sql_help.c:5404 sql_help.c:5506 +#: sql_help.c:5345 sql_help.c:5405 sql_help.c:5507 msgid "define a new database role" msgstr "ορίστε έναν νέο ρόλο βάσης δεδομένων" -#: sql_help.c:5350 +#: sql_help.c:5351 msgid "define a new index" msgstr "ορίστε ένα νέο ευρετήριο" -#: sql_help.c:5356 +#: sql_help.c:5357 msgid "define a new procedural language" msgstr "ορίστε μία νέα διαδικαστική γλώσσα" -#: sql_help.c:5362 +#: sql_help.c:5363 msgid "define a new materialized view" -msgstr "Ορίστε μία νέα υλοποιημένη όψη" +msgstr "ορίστε μία νέα υλοποιημένη όψη" -#: sql_help.c:5368 +#: sql_help.c:5369 msgid "define a new operator" msgstr "ορίστε έναν νέο χειριστή" -#: sql_help.c:5374 +#: sql_help.c:5375 msgid "define a new operator class" msgstr "ορίστε μία νέα κλάση χειριστή" -#: sql_help.c:5380 +#: sql_help.c:5381 msgid "define a new operator family" msgstr "ορίστε μία νέα οικογένεια χειριστή" -#: sql_help.c:5386 -#, fuzzy -#| msgid "define a new row level security policy for a table" +#: sql_help.c:5387 msgid "define a new row-level security policy for a table" msgstr "ορίστε μία νέα πολιτική προστασίας σειράς για έναν πίνακα" -#: sql_help.c:5392 +#: sql_help.c:5393 msgid "define a new procedure" msgstr "ορίστε μία νέα διαδικασία" -#: sql_help.c:5398 +#: sql_help.c:5399 msgid "define a new publication" msgstr "ορίστε μία νέα κοινοποιήση" -#: sql_help.c:5410 +#: sql_help.c:5411 msgid "define a new rewrite rule" msgstr "ορίστε ένα νέο κανόνα επανεγγραφής" -#: sql_help.c:5416 +#: sql_help.c:5417 msgid "define a new schema" msgstr "ορίστε ένα νέο σχήμα" -#: sql_help.c:5422 +#: sql_help.c:5423 msgid "define a new sequence generator" msgstr "ορίστε ένα νέο παραγωγό ακολουθίων" -#: sql_help.c:5428 +#: sql_help.c:5429 msgid "define a new foreign server" msgstr "ορίστε ένα νέο ξενικό διακομιστή" -#: sql_help.c:5434 +#: sql_help.c:5435 msgid "define extended statistics" msgstr "ορίστε εκτεταμένα στατιστικά στοιχεία" -#: sql_help.c:5440 +#: sql_help.c:5441 msgid "define a new subscription" msgstr "ορίστε μία νέα συνδρομή" -#: sql_help.c:5446 +#: sql_help.c:5447 msgid "define a new table" msgstr "ορίσετε ένα νέο πίνακα" -#: sql_help.c:5452 sql_help.c:5968 +#: sql_help.c:5453 sql_help.c:5969 msgid "define a new table from the results of a query" msgstr "ορίστε ένα νέο πίνακα από τα αποτελέσματα ενός ερωτήματος" -#: sql_help.c:5458 +#: sql_help.c:5459 msgid "define a new tablespace" msgstr "ορίστε ένα νέο πινακοχώρο" -#: sql_help.c:5464 +#: sql_help.c:5465 msgid "define a new text search configuration" msgstr "ορίστε μία νέα διαμόρφωση αναζήτησης κειμένου" -#: sql_help.c:5470 +#: sql_help.c:5471 msgid "define a new text search dictionary" msgstr "ορίστε ένα νέο λεξικό αναζήτησης κειμένου" -#: sql_help.c:5476 +#: sql_help.c:5477 msgid "define a new text search parser" msgstr "ορίστε ένα νέο αναλυτή αναζήτησης κειμένου" -#: sql_help.c:5482 +#: sql_help.c:5483 msgid "define a new text search template" msgstr "ορίστε ένα νέο πρότυπο αναζήτησης κειμένου" -#: sql_help.c:5488 +#: sql_help.c:5489 msgid "define a new transform" msgstr "ορίστε μία νέα μετατροπή" -#: sql_help.c:5494 +#: sql_help.c:5495 msgid "define a new trigger" msgstr "ορίσετε μία νέα ενεργοποίηση" -#: sql_help.c:5500 +#: sql_help.c:5501 msgid "define a new data type" msgstr "ορίσετε ένα νέο τύπο δεδομένων" -#: sql_help.c:5512 +#: sql_help.c:5513 msgid "define a new mapping of a user to a foreign server" msgstr "ορίστε μία νέα αντιστοίχιση ενός χρήστη σε έναν ξένο διακομιστή" -#: sql_help.c:5518 +#: sql_help.c:5519 msgid "define a new view" msgstr "ορίστε μία νέα όψη" -#: sql_help.c:5524 +#: sql_help.c:5525 msgid "deallocate a prepared statement" msgstr "καταργήστε μία προετοιμασμένη δήλωση" -#: sql_help.c:5530 +#: sql_help.c:5531 msgid "define a cursor" msgstr "ορίστε έναν δρομέα" -#: sql_help.c:5536 +#: sql_help.c:5537 msgid "delete rows of a table" msgstr "διαγράψτε σειρές ενός πίνακα" -#: sql_help.c:5542 +#: sql_help.c:5543 msgid "discard session state" msgstr "καταργήστε την κατάσταση συνεδρίας" -#: sql_help.c:5548 +#: sql_help.c:5549 msgid "execute an anonymous code block" msgstr "εκτελέστε ανώνυμο μπλοκ κώδικα" -#: sql_help.c:5554 +#: sql_help.c:5555 msgid "remove an access method" msgstr "αφαιρέστε μία μέθοδο πρόσβασης" -#: sql_help.c:5560 +#: sql_help.c:5561 msgid "remove an aggregate function" msgstr "αφαιρέστε μία συνάρτηση συγκεντρωτικών αποτελεσμάτων" -#: sql_help.c:5566 +#: sql_help.c:5567 msgid "remove a cast" msgstr "αφαιρέστε ένα καστ" -#: sql_help.c:5572 +#: sql_help.c:5573 msgid "remove a collation" msgstr "αφαιρέστε μία συρραφή" -#: sql_help.c:5578 +#: sql_help.c:5579 msgid "remove a conversion" msgstr "αφαιρέστε μία μετατροπή" -#: sql_help.c:5584 +#: sql_help.c:5585 msgid "remove a database" msgstr "αφαιρέστε μία βάση δεδομένων" -#: sql_help.c:5590 +#: sql_help.c:5591 msgid "remove a domain" msgstr "αφαιρέστε ένα πεδίο" -#: sql_help.c:5596 +#: sql_help.c:5597 msgid "remove an event trigger" msgstr "αφαιρέστε μία ενεργοποίηση συμβάντος" -#: sql_help.c:5602 +#: sql_help.c:5603 msgid "remove an extension" msgstr "αφαιρέστε μία προέκταση" -#: sql_help.c:5608 +#: sql_help.c:5609 msgid "remove a foreign-data wrapper" msgstr "αφαιρέστε μία περιτύλιξη ξένων δεδομένων" -#: sql_help.c:5614 +#: sql_help.c:5615 msgid "remove a foreign table" msgstr "αφαιρέστε έναν ξενικό πίνακα" -#: sql_help.c:5620 +#: sql_help.c:5621 msgid "remove a function" msgstr "αφαιρέστε μία συνάρτηση" -#: sql_help.c:5626 sql_help.c:5692 sql_help.c:5794 +#: sql_help.c:5627 sql_help.c:5693 sql_help.c:5795 msgid "remove a database role" msgstr "αφαιρέστε έναν ρόλο μίας βάσης δεδομένων" -#: sql_help.c:5632 +#: sql_help.c:5633 msgid "remove an index" msgstr "αφαιρέστε ένα ευρετήριο" -#: sql_help.c:5638 +#: sql_help.c:5639 msgid "remove a procedural language" msgstr "αφαιρέστε μία διαδικαστική γλώσσα" -#: sql_help.c:5644 +#: sql_help.c:5645 msgid "remove a materialized view" msgstr "αφαιρέστε μία υλοποιημένη όψη" -#: sql_help.c:5650 +#: sql_help.c:5651 msgid "remove an operator" msgstr "αφαιρέστε έναν χειριστή" -#: sql_help.c:5656 +#: sql_help.c:5657 msgid "remove an operator class" msgstr "αφαιρέστε μία κλάση χειριστή" -#: sql_help.c:5662 +#: sql_help.c:5663 msgid "remove an operator family" msgstr "αφαιρέστε μία οικογένεια χειριστή" -#: sql_help.c:5668 +#: sql_help.c:5669 msgid "remove database objects owned by a database role" msgstr "αφαιρέστε αντικειμένα βάσης δεδομένων που ανήκουν σε ρόλο βάσης δεδομένων" -#: sql_help.c:5674 -#, fuzzy -#| msgid "remove a row level security policy from a table" +#: sql_help.c:5675 msgid "remove a row-level security policy from a table" -msgstr "αφαιρέστε μία πολιτική ασφαλείας επιπέδου γραμμής από έναν πίνακα" +msgstr "αφαιρέστε μία πολιτική ασφαλείας επιπέδου σειράς από έναν πίνακα" -#: sql_help.c:5680 +#: sql_help.c:5681 msgid "remove a procedure" msgstr "αφαιρέστε μία διαδικασία" -#: sql_help.c:5686 +#: sql_help.c:5687 msgid "remove a publication" msgstr "αφαιρέστε μία δημοσίευση" -#: sql_help.c:5698 +#: sql_help.c:5699 msgid "remove a routine" msgstr "αφαιρέστε μία ρουτίνα" -#: sql_help.c:5704 +#: sql_help.c:5705 msgid "remove a rewrite rule" msgstr "αφαιρέστε έναν κανόνα επανεγγραφής" -#: sql_help.c:5710 +#: sql_help.c:5711 msgid "remove a schema" msgstr "αφαιρέστε ένα σχήμα" -#: sql_help.c:5716 +#: sql_help.c:5717 msgid "remove a sequence" msgstr "αφαιρέστε μία ακολουθία" -#: sql_help.c:5722 +#: sql_help.c:5723 msgid "remove a foreign server descriptor" msgstr "αφαιρέστε έναν περιγραφέα ξενικού διακομιστή" -#: sql_help.c:5728 +#: sql_help.c:5729 msgid "remove extended statistics" msgstr "αφαιρέστε εκτεταμένα στατιστικά στοιχεία" -#: sql_help.c:5734 +#: sql_help.c:5735 msgid "remove a subscription" msgstr "αφαιρέστε μία συνδρομή" -#: sql_help.c:5740 +#: sql_help.c:5741 msgid "remove a table" msgstr "αφαιρέστε έναν πίνακα" -#: sql_help.c:5746 +#: sql_help.c:5747 msgid "remove a tablespace" msgstr "αφαιρέστε έναν πινακοχώρο" -#: sql_help.c:5752 +#: sql_help.c:5753 msgid "remove a text search configuration" msgstr "αφαιρέστε μία διαμόρφωση αναζήτησης κειμένου" -#: sql_help.c:5758 +#: sql_help.c:5759 msgid "remove a text search dictionary" msgstr "αφαιρέστε ένα λεξικό αναζήτησης κειμένου" -#: sql_help.c:5764 +#: sql_help.c:5765 msgid "remove a text search parser" msgstr "αφαιρέστε έναν αναλυτή αναζήτησης κειμένου" -#: sql_help.c:5770 +#: sql_help.c:5771 msgid "remove a text search template" msgstr "αφαιρέστε ένα πρότυπο αναζήτησης κειμένου" -#: sql_help.c:5776 +#: sql_help.c:5777 msgid "remove a transform" msgstr "αφαιρέστε μία μετατροπή" -#: sql_help.c:5782 +#: sql_help.c:5783 msgid "remove a trigger" msgstr "αφαιρέστε μία ενεργοποίηση" -#: sql_help.c:5788 +#: sql_help.c:5789 msgid "remove a data type" msgstr "αφαιρέστε έναν τύπο δεδομένων" -#: sql_help.c:5800 +#: sql_help.c:5801 msgid "remove a user mapping for a foreign server" msgstr "αφαιρέστε μία αντιστοίχιση χρήστη για ξένο διακομιστή" -#: sql_help.c:5806 +#: sql_help.c:5807 msgid "remove a view" msgstr "αφαιρέστε μία όψη" -#: sql_help.c:5818 +#: sql_help.c:5819 msgid "execute a prepared statement" msgstr "εκτελέστε μία προεπιλεγμένη δήλωση" -#: sql_help.c:5824 +#: sql_help.c:5825 msgid "show the execution plan of a statement" msgstr "εμφανίστε το πλάνο εκτέλεσης μίας δήλωσης" -#: sql_help.c:5830 +#: sql_help.c:5831 msgid "retrieve rows from a query using a cursor" msgstr "ανακτήστε σειρές από ερώτημα μέσω δρομέα" -#: sql_help.c:5836 +#: sql_help.c:5837 msgid "define access privileges" msgstr "ορίσθε δικαιώματα πρόσβασης" -#: sql_help.c:5842 +#: sql_help.c:5843 msgid "import table definitions from a foreign server" msgstr "εισαγωγή ορισμών πίνακα από ξένο διακομιστή" -#: sql_help.c:5848 +#: sql_help.c:5849 msgid "create new rows in a table" msgstr "δημιουργήστε καινούργιες σειρές σε έναν πίνακα" -#: sql_help.c:5854 +#: sql_help.c:5855 msgid "listen for a notification" msgstr "ακούστε για μία κοινοποίηση" -#: sql_help.c:5860 +#: sql_help.c:5861 msgid "load a shared library file" msgstr "φορτώστε ένα αρχείο κοινόχρηστης βιβλιοθήκης" -#: sql_help.c:5866 +#: sql_help.c:5867 msgid "lock a table" msgstr "κλειδώστε έναν πίνακα" -#: sql_help.c:5872 +#: sql_help.c:5873 msgid "position a cursor" msgstr "τοποθετήστε έναν δρομέα" -#: sql_help.c:5878 +#: sql_help.c:5879 msgid "generate a notification" msgstr "δημιουργήστε μία κοινοποίηση" -#: sql_help.c:5884 +#: sql_help.c:5885 msgid "prepare a statement for execution" msgstr "προετοιμάστε μία δήλωση για εκτέλεση" -#: sql_help.c:5890 +#: sql_help.c:5891 msgid "prepare the current transaction for two-phase commit" msgstr "προετοιμάστε την τρέχουσας συναλλαγής για ολοκλήρωση σε δύο φάσεις" -#: sql_help.c:5896 +#: sql_help.c:5897 msgid "change the ownership of database objects owned by a database role" msgstr "αλλάξτε την κυριότητα αντικειμένων βάσης δεδομένων που ανήκουν σε ρόλο βάσης δεδομένων" -#: sql_help.c:5902 +#: sql_help.c:5903 msgid "replace the contents of a materialized view" msgstr "αντικαθαστήστε τα περιεχόμενα μίας υλοποιημένης όψης" -#: sql_help.c:5908 +#: sql_help.c:5909 msgid "rebuild indexes" msgstr "επανακατασκευάστε ευρετήρια" -#: sql_help.c:5914 +#: sql_help.c:5915 msgid "destroy a previously defined savepoint" msgstr "καταστρέψτε ένα προηγούμενα ορισμένο σημείο αποθήκευσης" -#: sql_help.c:5920 +#: sql_help.c:5921 msgid "restore the value of a run-time parameter to the default value" msgstr "επαναφορά της τιμής μιας παραμέτρου χρόνου εκτέλεσης στην προεπιλεγμένη τιμή" -#: sql_help.c:5926 +#: sql_help.c:5927 msgid "remove access privileges" msgstr "αφαιρέστε δικαιώματα πρόσβασης" -#: sql_help.c:5938 +#: sql_help.c:5939 msgid "cancel a transaction that was earlier prepared for two-phase commit" -msgstr "Ακύρωση συναλλαγής που είχε προετοιμαστεί προηγουμένως για ολοκλήρωση σε δύο φάσεις" +msgstr "ακύρωση συναλλαγής που είχε προετοιμαστεί προηγουμένως για ολοκλήρωση σε δύο φάσεις" -#: sql_help.c:5944 +#: sql_help.c:5945 msgid "roll back to a savepoint" msgstr "επαναφορά σε σημείο αποθήκευσης" -#: sql_help.c:5950 +#: sql_help.c:5951 msgid "define a new savepoint within the current transaction" msgstr "ορίστε ένα νέο σημείο αποθήκευσης (savepoint) μέσα στην τρέχουσα συναλλαγή" -#: sql_help.c:5956 +#: sql_help.c:5957 msgid "define or change a security label applied to an object" msgstr "ορίστε ή αλλάξτε μία ετικέτα ασφαλείας που εφαρμόζεται σε ένα αντικείμενο" -#: sql_help.c:5962 sql_help.c:6016 sql_help.c:6052 +#: sql_help.c:5963 sql_help.c:6017 sql_help.c:6053 msgid "retrieve rows from a table or view" msgstr "ανακτήστε σειρές από πίνακα ή όψη" -#: sql_help.c:5974 +#: sql_help.c:5975 msgid "change a run-time parameter" msgstr "αλλάξτε μία παράμετρο χρόνου εκτέλεσης" -#: sql_help.c:5980 +#: sql_help.c:5981 msgid "set constraint check timing for the current transaction" msgstr "ορίστε τον χρονισμό ελέγχου περιορισμού για την τρέχουσα συναλλαγή" -#: sql_help.c:5986 +#: sql_help.c:5987 msgid "set the current user identifier of the current session" msgstr "ορίστε το αναγνωριστικό τρέχοντος χρήστη της τρέχουσας συνεδρίας" -#: sql_help.c:5992 +#: sql_help.c:5993 msgid "set the session user identifier and the current user identifier of the current session" msgstr "ορίστε το αναγνωριστικό χρήστη συνεδρίας και το αναγνωριστικό τρέχοντος χρήστη της τρέχουσας συνεδρίας" -#: sql_help.c:5998 +#: sql_help.c:5999 msgid "set the characteristics of the current transaction" msgstr "ορίστε τα χαρακτηριστικά της τρέχουσας συναλλαγής" -#: sql_help.c:6004 +#: sql_help.c:6005 msgid "show the value of a run-time parameter" msgstr "εμφάνιση της τιμής μιας παραμέτρου χρόνου εκτέλεσης" -#: sql_help.c:6022 +#: sql_help.c:6023 msgid "empty a table or set of tables" msgstr "αδειάστε έναν πίνακα ή ένα σύνολο πινάκων" -#: sql_help.c:6028 +#: sql_help.c:6029 msgid "stop listening for a notification" msgstr "σταματήστε να ακούτε μια κοινοποίηση" -#: sql_help.c:6034 +#: sql_help.c:6035 msgid "update rows of a table" msgstr "ενημέρωση σειρών πίνακα" -#: sql_help.c:6040 +#: sql_help.c:6041 msgid "garbage-collect and optionally analyze a database" msgstr "συλλογή απορριμμάτων και προαιρετική ανάλυση βάσης δεδομένων" -#: sql_help.c:6046 +#: sql_help.c:6047 msgid "compute a set of rows" msgstr "υπολογίστε ένα σύνολο σειρών" @@ -6475,7 +6451,7 @@ msgstr "-1 μπορεί να χρησιμοποιηθεί μόνο σε μη δ #: startup.c:326 #, c-format msgid "could not open log file \"%s\": %m" -msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου καταγραφής “%s”: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου καταγραφής «%s»: %m" #: startup.c:438 #, c-format @@ -6483,30 +6459,30 @@ msgid "" "Type \"help\" for help.\n" "\n" msgstr "" -"Γράψτε “help” για βοήθεια.\n" +"Γράψτε «help» για βοήθεια.\n" "\n" #: startup.c:591 #, c-format msgid "could not set printing parameter \"%s\"" -msgstr "δεν ήταν δυνατός ο ορισμός παραμέτρου εκτύπωσης “%s”" +msgstr "δεν ήταν δυνατός ο ορισμός παραμέτρου εκτύπωσης «%s»" #: startup.c:699 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Δοκιμάστε “%s —help” για περισσότερες πληροφορίες.\n" +msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n" #: startup.c:716 #, c-format msgid "extra command-line argument \"%s\" ignored" -msgstr "παραβλέπεται η πρόσθετη παράμετρος γραμμής εντολών \"%s\"" +msgstr "παραβλέπεται η πρόσθετη παράμετρος γραμμής εντολών «%s»" #: startup.c:765 #, c-format msgid "could not find own program executable" msgstr "δεν ήταν δυνατή η εύρεση του ιδίου εκτελέσιμου προγράμματος" -#: tab-complete.c:4896 +#: tab-complete.c:4900 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6520,17 +6496,17 @@ msgstr "" #: variables.c:139 #, c-format msgid "unrecognized value \"%s\" for \"%s\": Boolean expected" -msgstr "μη αναγνωρίσιμη τιμή \"%s\" για \"%s\": αναμένεται Boolean" +msgstr "μη αναγνωρίσιμη τιμή «%s» για «%s»: αναμένεται Boolean" #: variables.c:176 #, c-format msgid "invalid value \"%s\" for \"%s\": integer expected" -msgstr "άκυρη τιμή \"%s\" για \"%s\": αναμένεται ακέραιος" +msgstr "άκυρη τιμή «%s» για «%s»: αναμένεται ακέραιος" #: variables.c:224 #, c-format msgid "invalid variable name: \"%s\"" -msgstr "άκυρη ονομασία παραμέτρου “%s”" +msgstr "άκυρη ονομασία παραμέτρου «%s»" #: variables.c:419 #, c-format @@ -6538,7 +6514,7 @@ msgid "" "unrecognized value \"%s\" for \"%s\"\n" "Available values are: %s." msgstr "" -"Μη αναγνωρίσιμη τιμή \"%s\" για \"%s\"\n" +"μη αναγνωρίσιμη τιμή \"%s\" για \"%s\"\n" "Οι διαθέσιμες τιμές είναι: %s." #~ msgid "All connection parameters must be supplied because no database connection exists" diff --git a/src/bin/psql/po/es.po b/src/bin/psql/po/es.po index 80f5c974d4..f6f156b38d 100644 --- a/src/bin/psql/po/es.po +++ b/src/bin/psql/po/es.po @@ -1,6 +1,6 @@ # spanish translation of psql. # -# Copyright (c) 2003-2019, PostgreSQL Global Development Group +# Copyright (c) 2003-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Alvaro Herrera, , 2003-2015 @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: psql (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-06-11 16:45+0000\n" -"PO-Revision-Date: 2021-06-14 20:11-0500\n" +"POT-Creation-Date: 2022-01-12 04:15+0000\n" +"PO-Revision-Date: 2022-01-12 17:40-0500\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -74,7 +74,7 @@ msgid "%s() failed: %m" msgstr "%s() falló: %m" #: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 -#: command.c:1315 command.c:3246 command.c:3295 command.c:3412 input.c:227 +#: command.c:1315 command.c:3254 command.c:3303 command.c:3420 input.c:227 #: mainloop.c:81 mainloop.c:402 #, c-format msgid "out of memory" @@ -230,12 +230,12 @@ msgstr "Está conectado a la base de datos «%s» como el usuario «%s» en el s msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» port «%s».\n" -#: command.c:1012 command.c:1121 command.c:2602 +#: command.c:1012 command.c:1121 command.c:2610 #, c-format msgid "no query buffer" msgstr "no hay búfer de consulta" -#: command.c:1045 command.c:5304 +#: command.c:1045 command.c:5312 #, c-format msgid "invalid line number: %s" msgstr "número de línea no válido: %s" @@ -259,7 +259,7 @@ msgstr "Sin cambios" msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: nombre de codificación no válido o procedimiento de conversión no encontrado" -#: command.c:1311 command.c:2052 command.c:3242 command.c:3434 command.c:5406 +#: command.c:1311 command.c:2063 command.c:3250 command.c:3442 command.c:5414 #: common.c:174 common.c:223 common.c:392 common.c:1248 common.c:1276 #: common.c:1385 common.c:1492 common.c:1530 copy.c:488 copy.c:709 help.c:62 #: large_obj.c:157 large_obj.c:192 large_obj.c:254 startup.c:298 @@ -276,8 +276,8 @@ msgstr "No hay error anterior." msgid "\\%s: missing right parenthesis" msgstr "\\%s: falta el paréntesis derecho" -#: command.c:1608 command.c:1913 command.c:1927 command.c:1944 command.c:2106 -#: command.c:2342 command.c:2569 command.c:2609 +#: command.c:1608 command.c:1913 command.c:1927 command.c:1944 command.c:2114 +#: command.c:2350 command.c:2577 command.c:2617 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: falta argumento requerido" @@ -311,134 +311,135 @@ msgstr "\\endif: no hay un \\if coincidente" msgid "Query buffer is empty." msgstr "El búfer de consulta está vacío." -#: command.c:2030 -msgid "Enter new password: " -msgstr "Ingrese la nueva contraseña: " +#: command.c:2045 +#, c-format +msgid "Enter new password for user \"%s\": " +msgstr "Ingrese nueva contraseña para usuario «%s»: " -#: command.c:2031 +#: command.c:2048 msgid "Enter it again: " msgstr "Ingrésela nuevamente: " -#: command.c:2035 +#: command.c:2052 #, c-format msgid "Passwords didn't match." msgstr "Las constraseñas no coinciden." -#: command.c:2135 +#: command.c:2143 #, c-format msgid "\\%s: could not read value for variable" msgstr "%s: no se pudo leer el valor para la variable" -#: command.c:2238 +#: command.c:2246 msgid "Query buffer reset (cleared)." msgstr "El búfer de consulta ha sido reiniciado (limpiado)." -#: command.c:2260 +#: command.c:2268 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Se escribió la historia en el archivo «%s».\n" -#: command.c:2347 +#: command.c:2355 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: el nombre de variable de ambiente no debe contener «=»" -#: command.c:2399 +#: command.c:2407 #, c-format msgid "The server (version %s) does not support showing function source." msgstr "El servidor (versión %s) no soporta el despliegue del código fuente de funciones." -#: command.c:2402 +#: command.c:2410 #, c-format msgid "The server (version %s) does not support showing view definitions." msgstr "El servidor (versión %s) no soporta el despliegue de definiciones de vistas." -#: command.c:2409 +#: command.c:2417 #, c-format msgid "function name is required" msgstr "el nombre de la función es requerido" -#: command.c:2411 +#: command.c:2419 #, c-format msgid "view name is required" msgstr "el nombre de la vista es requerido" -#: command.c:2541 +#: command.c:2549 msgid "Timing is on." msgstr "El despliegue de duración está activado." -#: command.c:2543 +#: command.c:2551 msgid "Timing is off." msgstr "El despliegue de duración está desactivado." -#: command.c:2628 command.c:2656 command.c:3873 command.c:3876 command.c:3879 -#: command.c:3885 command.c:3887 command.c:3913 command.c:3923 command.c:3935 -#: command.c:3949 command.c:3976 command.c:4034 common.c:70 copy.c:331 +#: command.c:2636 command.c:2664 command.c:3881 command.c:3884 command.c:3887 +#: command.c:3893 command.c:3895 command.c:3921 command.c:3931 command.c:3943 +#: command.c:3957 command.c:3984 command.c:4042 common.c:70 copy.c:331 #: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:3047 startup.c:237 startup.c:287 +#: command.c:3055 startup.c:237 startup.c:287 msgid "Password: " msgstr "Contraseña: " -#: command.c:3052 startup.c:284 +#: command.c:3060 startup.c:284 #, c-format msgid "Password for user %s: " msgstr "Contraseña para usuario %s: " -#: command.c:3104 +#: command.c:3112 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "No proporcione usuario, host o puerto de forma separada al usar una cadena de conexión" -#: command.c:3139 +#: command.c:3147 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "No existe una conexión de base de datos para poder reusar sus parámetros" -#: command.c:3440 +#: command.c:3448 #, c-format msgid "Previous connection kept" msgstr "Se ha mantenido la conexión anterior" -#: command.c:3446 +#: command.c:3454 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3502 +#: command.c:3510 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» en la dirección «%s» port «%s».\n" -#: command.c:3505 +#: command.c:3513 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» a través del socket en «%s» port «%s».\n" -#: command.c:3511 +#: command.c:3519 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» (dirección «%s») port «%s».\n" -#: command.c:3514 +#: command.c:3522 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» port «%s».\n" -#: command.c:3519 +#: command.c:3527 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Ahora está conectado a la base de datos «%s» con el usuario «%s».\n" -#: command.c:3559 +#: command.c:3567 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, servidor %s)\n" -#: command.c:3567 +#: command.c:3575 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -447,29 +448,29 @@ msgstr "" "ADVERTENCIA: %s versión mayor %s, servidor versión mayor %s.\n" " Algunas características de psql podrían no funcionar.\n" -#: command.c:3606 +#: command.c:3614 #, c-format msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" msgstr "Conexión SSL (protocolo: %s, cifrado: %s, bits: %s, compresión: %s)\n" -#: command.c:3607 command.c:3608 command.c:3609 +#: command.c:3615 command.c:3616 command.c:3617 msgid "unknown" msgstr "desconocido" -#: command.c:3610 help.c:45 +#: command.c:3618 help.c:45 msgid "off" msgstr "desactivado" -#: command.c:3610 help.c:45 +#: command.c:3618 help.c:45 msgid "on" msgstr "activado" -#: command.c:3624 +#: command.c:3632 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "Conexión Cifrada GSSAPI\n" -#: command.c:3644 +#: command.c:3652 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -482,259 +483,259 @@ msgstr "" " Vea la página de referencia de psql «Notes for Windows users»\n" " para obtener más detalles.\n" -#: command.c:3749 +#: command.c:3757 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "la variable de ambiente PSQL_EDITOR_LINENUMBER_SWITCH debe estar definida para poder especificar un número de línea" -#: command.c:3778 +#: command.c:3786 #, c-format msgid "could not start editor \"%s\"" msgstr "no se pudo iniciar el editor «%s»" -#: command.c:3780 +#: command.c:3788 #, c-format msgid "could not start /bin/sh" msgstr "no se pudo iniciar /bin/sh" -#: command.c:3830 +#: command.c:3838 #, c-format msgid "could not locate temporary directory: %s" msgstr "no se pudo ubicar el directorio temporal: %s" -#: command.c:3857 +#: command.c:3865 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "no se pudo abrir archivo temporal «%s»: %m" -#: command.c:4193 +#: command.c:4201 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: abreviación ambigua «%s» coincide tanto con «%s» como con «%s»" -#: command.c:4213 +#: command.c:4221 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset: formatos permitidos son aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:4232 +#: command.c:4240 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: estilos de línea permitidos son ascii, old-ascii, unicode" -#: command.c:4247 +#: command.c:4255 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: estilos de línea Unicode de borde permitidos son single, double" -#: command.c:4262 +#: command.c:4270 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: estilos de línea Unicode de columna permitidos son single, double" -#: command.c:4277 +#: command.c:4285 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: estilos de línea Unicode de encabezado permitidos son single, double" -#: command.c:4320 +#: command.c:4328 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep debe ser un carácter de un solo byte" -#: command.c:4325 +#: command.c:4333 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldset ni puede ser una comilla doble, un salto de línea, o un retorno de carro" -#: command.c:4462 command.c:4650 +#: command.c:4470 command.c:4658 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: opción desconocida: %s" -#: command.c:4482 +#: command.c:4490 #, c-format msgid "Border style is %d.\n" msgstr "El estilo de borde es %d.\n" -#: command.c:4488 +#: command.c:4496 #, c-format msgid "Target width is unset.\n" msgstr "El ancho no está definido.\n" -#: command.c:4490 +#: command.c:4498 #, c-format msgid "Target width is %d.\n" msgstr "El ancho es %d.\n" -#: command.c:4497 +#: command.c:4505 #, c-format msgid "Expanded display is on.\n" msgstr "Se ha activado el despliegue expandido.\n" -#: command.c:4499 +#: command.c:4507 #, c-format msgid "Expanded display is used automatically.\n" msgstr "El despliegue expandido se usa automáticamente.\n" -#: command.c:4501 +#: command.c:4509 #, c-format msgid "Expanded display is off.\n" msgstr "Se ha desactivado el despliegue expandido.\n" -#: command.c:4507 +#: command.c:4515 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "El separador de campos para CSV es «%s».\n" -#: command.c:4515 command.c:4523 +#: command.c:4523 command.c:4531 #, c-format msgid "Field separator is zero byte.\n" msgstr "El separador de campos es el byte cero.\n" -#: command.c:4517 +#: command.c:4525 #, c-format msgid "Field separator is \"%s\".\n" msgstr "El separador de campos es «%s».\n" -#: command.c:4530 +#: command.c:4538 #, c-format msgid "Default footer is on.\n" msgstr "El pie por omisión está activo.\n" -#: command.c:4532 +#: command.c:4540 #, c-format msgid "Default footer is off.\n" msgstr "El pie de página por omisión está desactivado.\n" -#: command.c:4538 +#: command.c:4546 #, c-format msgid "Output format is %s.\n" msgstr "El formato de salida es %s.\n" -#: command.c:4544 +#: command.c:4552 #, c-format msgid "Line style is %s.\n" msgstr "El estilo de línea es %s.\n" -#: command.c:4551 +#: command.c:4559 #, c-format msgid "Null display is \"%s\".\n" msgstr "Despliegue de nulos es «%s».\n" -#: command.c:4559 +#: command.c:4567 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "La salida numérica ajustada localmente está habilitada.\n" -#: command.c:4561 +#: command.c:4569 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "La salida numérica ajustada localmente está deshabilitada.\n" -#: command.c:4568 +#: command.c:4576 #, c-format msgid "Pager is used for long output.\n" msgstr "El paginador se usará para salida larga.\n" -#: command.c:4570 +#: command.c:4578 #, c-format msgid "Pager is always used.\n" msgstr "El paginador se usará siempre.\n" -#: command.c:4572 +#: command.c:4580 #, c-format msgid "Pager usage is off.\n" msgstr "El paginador no se usará.\n" -#: command.c:4578 +#: command.c:4586 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" msgstr[0] "El paginador no se usará para menos de %d línea.\n" msgstr[1] "El paginador no se usará para menos de %d líneas.\n" -#: command.c:4588 command.c:4598 +#: command.c:4596 command.c:4606 #, c-format msgid "Record separator is zero byte.\n" msgstr "El separador de filas es el byte cero.\n" -#: command.c:4590 +#: command.c:4598 #, c-format msgid "Record separator is .\n" msgstr "El separador de filas es .\n" -#: command.c:4592 +#: command.c:4600 #, c-format msgid "Record separator is \"%s\".\n" msgstr "El separador de filas es «%s».\n" -#: command.c:4605 +#: command.c:4613 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Los atributos de tabla son «%s».\n" -#: command.c:4608 +#: command.c:4616 #, c-format msgid "Table attributes unset.\n" msgstr "Los atributos de tabla han sido indefinidos.\n" -#: command.c:4615 +#: command.c:4623 #, c-format msgid "Title is \"%s\".\n" msgstr "El título es «%s».\n" -#: command.c:4617 +#: command.c:4625 #, c-format msgid "Title is unset.\n" msgstr "El título ha sido indefinido.\n" -#: command.c:4624 +#: command.c:4632 #, c-format msgid "Tuples only is on.\n" msgstr "Mostrar sólo filas está activado.\n" -#: command.c:4626 +#: command.c:4634 #, c-format msgid "Tuples only is off.\n" msgstr "Mostrar sólo filas está desactivado.\n" -#: command.c:4632 +#: command.c:4640 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "El estilo Unicode de borde es «%s».\n" -#: command.c:4638 +#: command.c:4646 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "El estilo de línea Unicode de columna es «%s».\n" -#: command.c:4644 +#: command.c:4652 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "El estilo de línea Unicode de encabezado es «%s».\n" -#: command.c:4877 +#: command.c:4885 #, c-format msgid "\\!: failed" msgstr "\\!: falló" -#: command.c:4902 common.c:652 +#: command.c:4910 common.c:652 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch no puede ser usado con una consulta vacía" -#: command.c:4943 +#: command.c:4951 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (cada %gs)\n" -#: command.c:4946 +#: command.c:4954 #, c-format msgid "%s (every %gs)\n" msgstr "%s (cada %gs)\n" -#: command.c:5000 command.c:5007 common.c:552 common.c:559 common.c:1231 +#: command.c:5008 command.c:5015 common.c:552 common.c:559 common.c:1231 #, c-format msgid "" "********* QUERY **********\n" @@ -747,12 +748,12 @@ msgstr "" "**************************\n" "\n" -#: command.c:5199 +#: command.c:5207 #, c-format msgid "\"%s.%s\" is not a view" msgstr "«%s.%s» no es una vista" -#: command.c:5215 +#: command.c:5223 #, c-format msgid "could not parse reloptions array" msgstr "no se pudo interpretar el array reloptions" @@ -3000,13 +3001,13 @@ msgstr " \\dE[S+] [PATRÓN] listar tablas foráneas\n" #: help.c:239 #, c-format -msgid " \\det[+] [PATTERN] list foreign tables\n" -msgstr " \\det[+] [PATRÓN] listar tablas foráneas\n" +msgid " \\des[+] [PATTERN] list foreign servers\n" +msgstr " \\des[+] [PATRÓN] listar servidores foráneos\n" #: help.c:240 #, c-format -msgid " \\des[+] [PATTERN] list foreign servers\n" -msgstr " \\des[+] [PATRÓN] listar servidores foráneos\n" +msgid " \\det[+] [PATTERN] list foreign tables\n" +msgstr " \\det[+] [PATRÓN] listar tablas foráneas\n" #: help.c:241 #, c-format @@ -3103,8 +3104,8 @@ msgstr " \\dP[tin+] [PATRÓN] listar relaciones particionadas (sólo tablas/ín #: help.c:260 #, c-format -msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" -msgstr " \\drds [PAT1 [PAT2]] listar parámetros de rol por base de datos\n" +msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" +msgstr " \\drds [PATROL [PATBASE]] listar parámetros de rol por base de datos\n" #: help.c:261 #, c-format @@ -4099,194 +4100,194 @@ msgstr "%s: memoria agotada" #: sql_help.c:249 sql_help.c:251 sql_help.c:263 sql_help.c:264 sql_help.c:265 #: sql_help.c:267 sql_help.c:316 sql_help.c:318 sql_help.c:320 sql_help.c:322 #: sql_help.c:391 sql_help.c:396 sql_help.c:398 sql_help.c:440 sql_help.c:442 -#: sql_help.c:445 sql_help.c:447 sql_help.c:515 sql_help.c:520 sql_help.c:525 -#: sql_help.c:530 sql_help.c:535 sql_help.c:589 sql_help.c:591 sql_help.c:593 -#: sql_help.c:595 sql_help.c:597 sql_help.c:600 sql_help.c:602 sql_help.c:605 -#: sql_help.c:616 sql_help.c:618 sql_help.c:660 sql_help.c:662 sql_help.c:664 -#: sql_help.c:667 sql_help.c:669 sql_help.c:671 sql_help.c:706 sql_help.c:710 -#: sql_help.c:714 sql_help.c:733 sql_help.c:736 sql_help.c:739 sql_help.c:768 -#: sql_help.c:780 sql_help.c:788 sql_help.c:791 sql_help.c:794 sql_help.c:809 -#: sql_help.c:812 sql_help.c:841 sql_help.c:846 sql_help.c:851 sql_help.c:856 -#: sql_help.c:861 sql_help.c:883 sql_help.c:885 sql_help.c:887 sql_help.c:889 -#: sql_help.c:892 sql_help.c:894 sql_help.c:936 sql_help.c:980 sql_help.c:985 -#: sql_help.c:990 sql_help.c:995 sql_help.c:1000 sql_help.c:1019 -#: sql_help.c:1030 sql_help.c:1032 sql_help.c:1051 sql_help.c:1061 -#: sql_help.c:1063 sql_help.c:1065 sql_help.c:1077 sql_help.c:1081 -#: sql_help.c:1083 sql_help.c:1095 sql_help.c:1097 sql_help.c:1099 -#: sql_help.c:1101 sql_help.c:1119 sql_help.c:1121 sql_help.c:1125 -#: sql_help.c:1129 sql_help.c:1133 sql_help.c:1136 sql_help.c:1137 -#: sql_help.c:1138 sql_help.c:1141 sql_help.c:1143 sql_help.c:1278 -#: sql_help.c:1280 sql_help.c:1283 sql_help.c:1286 sql_help.c:1288 -#: sql_help.c:1290 sql_help.c:1293 sql_help.c:1296 sql_help.c:1409 -#: sql_help.c:1411 sql_help.c:1413 sql_help.c:1416 sql_help.c:1437 -#: sql_help.c:1440 sql_help.c:1443 sql_help.c:1446 sql_help.c:1450 -#: sql_help.c:1452 sql_help.c:1454 sql_help.c:1456 sql_help.c:1470 -#: sql_help.c:1473 sql_help.c:1475 sql_help.c:1477 sql_help.c:1487 -#: sql_help.c:1489 sql_help.c:1499 sql_help.c:1501 sql_help.c:1511 -#: sql_help.c:1514 sql_help.c:1537 sql_help.c:1539 sql_help.c:1541 -#: sql_help.c:1543 sql_help.c:1546 sql_help.c:1548 sql_help.c:1551 -#: sql_help.c:1554 sql_help.c:1605 sql_help.c:1648 sql_help.c:1651 -#: sql_help.c:1653 sql_help.c:1655 sql_help.c:1658 sql_help.c:1660 -#: sql_help.c:1662 sql_help.c:1665 sql_help.c:1715 sql_help.c:1731 -#: sql_help.c:1962 sql_help.c:2031 sql_help.c:2050 sql_help.c:2063 -#: sql_help.c:2120 sql_help.c:2127 sql_help.c:2137 sql_help.c:2158 -#: sql_help.c:2184 sql_help.c:2202 sql_help.c:2229 sql_help.c:2325 -#: sql_help.c:2371 sql_help.c:2395 sql_help.c:2418 sql_help.c:2422 -#: sql_help.c:2456 sql_help.c:2476 sql_help.c:2498 sql_help.c:2512 -#: sql_help.c:2533 sql_help.c:2557 sql_help.c:2587 sql_help.c:2612 -#: sql_help.c:2659 sql_help.c:2947 sql_help.c:2960 sql_help.c:2977 -#: sql_help.c:2993 sql_help.c:3033 sql_help.c:3087 sql_help.c:3091 -#: sql_help.c:3093 sql_help.c:3100 sql_help.c:3119 sql_help.c:3146 -#: sql_help.c:3181 sql_help.c:3193 sql_help.c:3202 sql_help.c:3246 -#: sql_help.c:3260 sql_help.c:3288 sql_help.c:3296 sql_help.c:3308 -#: sql_help.c:3318 sql_help.c:3326 sql_help.c:3334 sql_help.c:3342 -#: sql_help.c:3350 sql_help.c:3359 sql_help.c:3370 sql_help.c:3378 -#: sql_help.c:3386 sql_help.c:3394 sql_help.c:3402 sql_help.c:3412 -#: sql_help.c:3421 sql_help.c:3430 sql_help.c:3438 sql_help.c:3448 -#: sql_help.c:3459 sql_help.c:3467 sql_help.c:3476 sql_help.c:3487 -#: sql_help.c:3496 sql_help.c:3504 sql_help.c:3512 sql_help.c:3520 -#: sql_help.c:3528 sql_help.c:3536 sql_help.c:3544 sql_help.c:3552 -#: sql_help.c:3560 sql_help.c:3568 sql_help.c:3576 sql_help.c:3593 -#: sql_help.c:3602 sql_help.c:3610 sql_help.c:3627 sql_help.c:3642 -#: sql_help.c:3944 sql_help.c:3995 sql_help.c:4024 sql_help.c:4039 -#: sql_help.c:4524 sql_help.c:4572 sql_help.c:4723 +#: sql_help.c:445 sql_help.c:447 sql_help.c:516 sql_help.c:521 sql_help.c:526 +#: sql_help.c:531 sql_help.c:536 sql_help.c:590 sql_help.c:592 sql_help.c:594 +#: sql_help.c:596 sql_help.c:598 sql_help.c:601 sql_help.c:603 sql_help.c:606 +#: sql_help.c:617 sql_help.c:619 sql_help.c:661 sql_help.c:663 sql_help.c:665 +#: sql_help.c:668 sql_help.c:670 sql_help.c:672 sql_help.c:707 sql_help.c:711 +#: sql_help.c:715 sql_help.c:734 sql_help.c:737 sql_help.c:740 sql_help.c:769 +#: sql_help.c:781 sql_help.c:789 sql_help.c:792 sql_help.c:795 sql_help.c:810 +#: sql_help.c:813 sql_help.c:842 sql_help.c:847 sql_help.c:852 sql_help.c:857 +#: sql_help.c:862 sql_help.c:884 sql_help.c:886 sql_help.c:888 sql_help.c:890 +#: sql_help.c:893 sql_help.c:895 sql_help.c:937 sql_help.c:982 sql_help.c:987 +#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1021 +#: sql_help.c:1032 sql_help.c:1034 sql_help.c:1053 sql_help.c:1063 +#: sql_help.c:1065 sql_help.c:1067 sql_help.c:1079 sql_help.c:1083 +#: sql_help.c:1085 sql_help.c:1097 sql_help.c:1099 sql_help.c:1101 +#: sql_help.c:1103 sql_help.c:1121 sql_help.c:1123 sql_help.c:1127 +#: sql_help.c:1131 sql_help.c:1135 sql_help.c:1138 sql_help.c:1139 +#: sql_help.c:1140 sql_help.c:1143 sql_help.c:1145 sql_help.c:1280 +#: sql_help.c:1282 sql_help.c:1285 sql_help.c:1288 sql_help.c:1290 +#: sql_help.c:1292 sql_help.c:1295 sql_help.c:1298 sql_help.c:1411 +#: sql_help.c:1413 sql_help.c:1415 sql_help.c:1418 sql_help.c:1439 +#: sql_help.c:1442 sql_help.c:1445 sql_help.c:1448 sql_help.c:1452 +#: sql_help.c:1454 sql_help.c:1456 sql_help.c:1458 sql_help.c:1472 +#: sql_help.c:1475 sql_help.c:1477 sql_help.c:1479 sql_help.c:1489 +#: sql_help.c:1491 sql_help.c:1501 sql_help.c:1503 sql_help.c:1513 +#: sql_help.c:1516 sql_help.c:1539 sql_help.c:1541 sql_help.c:1543 +#: sql_help.c:1545 sql_help.c:1548 sql_help.c:1550 sql_help.c:1553 +#: sql_help.c:1556 sql_help.c:1607 sql_help.c:1650 sql_help.c:1653 +#: sql_help.c:1655 sql_help.c:1657 sql_help.c:1660 sql_help.c:1662 +#: sql_help.c:1664 sql_help.c:1667 sql_help.c:1717 sql_help.c:1733 +#: sql_help.c:1964 sql_help.c:2033 sql_help.c:2052 sql_help.c:2065 +#: sql_help.c:2122 sql_help.c:2129 sql_help.c:2139 sql_help.c:2160 +#: sql_help.c:2186 sql_help.c:2204 sql_help.c:2232 sql_help.c:2329 +#: sql_help.c:2375 sql_help.c:2399 sql_help.c:2422 sql_help.c:2426 +#: sql_help.c:2460 sql_help.c:2480 sql_help.c:2502 sql_help.c:2516 +#: sql_help.c:2537 sql_help.c:2561 sql_help.c:2591 sql_help.c:2616 +#: sql_help.c:2663 sql_help.c:2951 sql_help.c:2964 sql_help.c:2981 +#: sql_help.c:2997 sql_help.c:3037 sql_help.c:3091 sql_help.c:3095 +#: sql_help.c:3097 sql_help.c:3104 sql_help.c:3123 sql_help.c:3150 +#: sql_help.c:3185 sql_help.c:3197 sql_help.c:3206 sql_help.c:3250 +#: sql_help.c:3264 sql_help.c:3292 sql_help.c:3300 sql_help.c:3312 +#: sql_help.c:3322 sql_help.c:3330 sql_help.c:3338 sql_help.c:3346 +#: sql_help.c:3354 sql_help.c:3363 sql_help.c:3374 sql_help.c:3382 +#: sql_help.c:3390 sql_help.c:3398 sql_help.c:3406 sql_help.c:3416 +#: sql_help.c:3425 sql_help.c:3434 sql_help.c:3442 sql_help.c:3452 +#: sql_help.c:3463 sql_help.c:3471 sql_help.c:3480 sql_help.c:3491 +#: sql_help.c:3500 sql_help.c:3508 sql_help.c:3516 sql_help.c:3524 +#: sql_help.c:3532 sql_help.c:3540 sql_help.c:3548 sql_help.c:3556 +#: sql_help.c:3564 sql_help.c:3572 sql_help.c:3580 sql_help.c:3597 +#: sql_help.c:3606 sql_help.c:3614 sql_help.c:3631 sql_help.c:3646 +#: sql_help.c:3948 sql_help.c:3999 sql_help.c:4028 sql_help.c:4043 +#: sql_help.c:4528 sql_help.c:4576 sql_help.c:4727 msgid "name" msgstr "nombre" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1812 -#: sql_help.c:3261 sql_help.c:4300 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1814 +#: sql_help.c:3265 sql_help.c:4304 msgid "aggregate_signature" msgstr "signatura_func_agregación" #: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:250 -#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:524 sql_help.c:572 -#: sql_help.c:590 sql_help.c:617 sql_help.c:668 sql_help.c:735 sql_help.c:790 -#: sql_help.c:811 sql_help.c:850 sql_help.c:895 sql_help.c:937 sql_help.c:989 -#: sql_help.c:1021 sql_help.c:1031 sql_help.c:1064 sql_help.c:1084 -#: sql_help.c:1098 sql_help.c:1144 sql_help.c:1287 sql_help.c:1410 -#: sql_help.c:1453 sql_help.c:1474 sql_help.c:1488 sql_help.c:1500 -#: sql_help.c:1513 sql_help.c:1540 sql_help.c:1606 sql_help.c:1659 +#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:525 sql_help.c:573 +#: sql_help.c:591 sql_help.c:618 sql_help.c:669 sql_help.c:736 sql_help.c:791 +#: sql_help.c:812 sql_help.c:851 sql_help.c:896 sql_help.c:938 sql_help.c:991 +#: sql_help.c:1023 sql_help.c:1033 sql_help.c:1066 sql_help.c:1086 +#: sql_help.c:1100 sql_help.c:1146 sql_help.c:1289 sql_help.c:1412 +#: sql_help.c:1455 sql_help.c:1476 sql_help.c:1490 sql_help.c:1502 +#: sql_help.c:1515 sql_help.c:1542 sql_help.c:1608 sql_help.c:1661 msgid "new_name" msgstr "nuevo_nombre" #: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:120 sql_help.c:248 -#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:529 sql_help.c:619 -#: sql_help.c:628 sql_help.c:689 sql_help.c:709 sql_help.c:738 sql_help.c:793 -#: sql_help.c:855 sql_help.c:893 sql_help.c:994 sql_help.c:1033 sql_help.c:1062 -#: sql_help.c:1082 sql_help.c:1096 sql_help.c:1142 sql_help.c:1350 -#: sql_help.c:1412 sql_help.c:1455 sql_help.c:1476 sql_help.c:1538 -#: sql_help.c:1654 sql_help.c:2933 +#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:530 sql_help.c:620 +#: sql_help.c:629 sql_help.c:690 sql_help.c:710 sql_help.c:739 sql_help.c:794 +#: sql_help.c:856 sql_help.c:894 sql_help.c:996 sql_help.c:1035 sql_help.c:1064 +#: sql_help.c:1084 sql_help.c:1098 sql_help.c:1144 sql_help.c:1352 +#: sql_help.c:1414 sql_help.c:1457 sql_help.c:1478 sql_help.c:1540 +#: sql_help.c:1656 sql_help.c:2937 msgid "new_owner" msgstr "nuevo_dueño" #: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319 -#: sql_help.c:448 sql_help.c:534 sql_help.c:670 sql_help.c:713 sql_help.c:741 -#: sql_help.c:796 sql_help.c:860 sql_help.c:999 sql_help.c:1066 sql_help.c:1100 -#: sql_help.c:1289 sql_help.c:1457 sql_help.c:1478 sql_help.c:1490 -#: sql_help.c:1502 sql_help.c:1542 sql_help.c:1661 +#: sql_help.c:448 sql_help.c:535 sql_help.c:671 sql_help.c:714 sql_help.c:742 +#: sql_help.c:797 sql_help.c:861 sql_help.c:1001 sql_help.c:1068 +#: sql_help.c:1102 sql_help.c:1291 sql_help.c:1459 sql_help.c:1480 +#: sql_help.c:1492 sql_help.c:1504 sql_help.c:1544 sql_help.c:1663 msgid "new_schema" msgstr "nuevo_esquema" -#: sql_help.c:44 sql_help.c:1876 sql_help.c:3262 sql_help.c:4329 +#: sql_help.c:44 sql_help.c:1878 sql_help.c:3266 sql_help.c:4333 msgid "where aggregate_signature is:" msgstr "donde signatura_func_agregación es:" #: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:337 sql_help.c:350 -#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:516 -#: sql_help.c:521 sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:842 -#: sql_help.c:847 sql_help.c:852 sql_help.c:857 sql_help.c:862 sql_help.c:981 -#: sql_help.c:986 sql_help.c:991 sql_help.c:996 sql_help.c:1001 sql_help.c:1830 -#: sql_help.c:1847 sql_help.c:1853 sql_help.c:1877 sql_help.c:1880 -#: sql_help.c:1883 sql_help.c:2032 sql_help.c:2051 sql_help.c:2054 -#: sql_help.c:2326 sql_help.c:2534 sql_help.c:3263 sql_help.c:3266 -#: sql_help.c:3269 sql_help.c:3360 sql_help.c:3449 sql_help.c:3477 -#: sql_help.c:3822 sql_help.c:4202 sql_help.c:4306 sql_help.c:4313 -#: sql_help.c:4319 sql_help.c:4330 sql_help.c:4333 sql_help.c:4336 +#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:517 +#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:843 +#: sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:863 sql_help.c:983 +#: sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1003 sql_help.c:1832 +#: sql_help.c:1849 sql_help.c:1855 sql_help.c:1879 sql_help.c:1882 +#: sql_help.c:1885 sql_help.c:2034 sql_help.c:2053 sql_help.c:2056 +#: sql_help.c:2330 sql_help.c:2538 sql_help.c:3267 sql_help.c:3270 +#: sql_help.c:3273 sql_help.c:3364 sql_help.c:3453 sql_help.c:3481 +#: sql_help.c:3826 sql_help.c:4206 sql_help.c:4310 sql_help.c:4317 +#: sql_help.c:4323 sql_help.c:4334 sql_help.c:4337 sql_help.c:4340 msgid "argmode" msgstr "modo_arg" #: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:338 sql_help.c:351 -#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:843 -#: sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:863 sql_help.c:982 -#: sql_help.c:987 sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1831 -#: sql_help.c:1848 sql_help.c:1854 sql_help.c:1878 sql_help.c:1881 -#: sql_help.c:1884 sql_help.c:2033 sql_help.c:2052 sql_help.c:2055 -#: sql_help.c:2327 sql_help.c:2535 sql_help.c:3264 sql_help.c:3267 -#: sql_help.c:3270 sql_help.c:3361 sql_help.c:3450 sql_help.c:3478 -#: sql_help.c:4307 sql_help.c:4314 sql_help.c:4320 sql_help.c:4331 -#: sql_help.c:4334 sql_help.c:4337 +#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:518 +#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:844 +#: sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:864 sql_help.c:984 +#: sql_help.c:989 sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1833 +#: sql_help.c:1850 sql_help.c:1856 sql_help.c:1880 sql_help.c:1883 +#: sql_help.c:1886 sql_help.c:2035 sql_help.c:2054 sql_help.c:2057 +#: sql_help.c:2331 sql_help.c:2539 sql_help.c:3268 sql_help.c:3271 +#: sql_help.c:3274 sql_help.c:3365 sql_help.c:3454 sql_help.c:3482 +#: sql_help.c:4311 sql_help.c:4318 sql_help.c:4324 sql_help.c:4335 +#: sql_help.c:4338 sql_help.c:4341 msgid "argname" msgstr "nombre_arg" #: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:339 sql_help.c:352 -#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:844 -#: sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:864 sql_help.c:983 -#: sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1003 sql_help.c:1832 -#: sql_help.c:1849 sql_help.c:1855 sql_help.c:1879 sql_help.c:1882 -#: sql_help.c:1885 sql_help.c:2328 sql_help.c:2536 sql_help.c:3265 -#: sql_help.c:3268 sql_help.c:3271 sql_help.c:3362 sql_help.c:3451 -#: sql_help.c:3479 sql_help.c:4308 sql_help.c:4315 sql_help.c:4321 -#: sql_help.c:4332 sql_help.c:4335 sql_help.c:4338 +#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:519 +#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:845 +#: sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:985 +#: sql_help.c:990 sql_help.c:995 sql_help.c:1000 sql_help.c:1005 +#: sql_help.c:1834 sql_help.c:1851 sql_help.c:1857 sql_help.c:1881 +#: sql_help.c:1884 sql_help.c:1887 sql_help.c:2332 sql_help.c:2540 +#: sql_help.c:3269 sql_help.c:3272 sql_help.c:3275 sql_help.c:3366 +#: sql_help.c:3455 sql_help.c:3483 sql_help.c:4312 sql_help.c:4319 +#: sql_help.c:4325 sql_help.c:4336 sql_help.c:4339 sql_help.c:4342 msgid "argtype" msgstr "tipo_arg" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:931 -#: sql_help.c:1079 sql_help.c:1471 sql_help.c:1600 sql_help.c:1632 -#: sql_help.c:1684 sql_help.c:1747 sql_help.c:1933 sql_help.c:1940 -#: sql_help.c:2232 sql_help.c:2274 sql_help.c:2281 sql_help.c:2290 -#: sql_help.c:2372 sql_help.c:2588 sql_help.c:2681 sql_help.c:2962 -#: sql_help.c:3147 sql_help.c:3169 sql_help.c:3309 sql_help.c:3664 -#: sql_help.c:3863 sql_help.c:4038 sql_help.c:4786 +#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:932 +#: sql_help.c:1081 sql_help.c:1473 sql_help.c:1602 sql_help.c:1634 +#: sql_help.c:1686 sql_help.c:1749 sql_help.c:1935 sql_help.c:1942 +#: sql_help.c:2235 sql_help.c:2277 sql_help.c:2284 sql_help.c:2293 +#: sql_help.c:2376 sql_help.c:2592 sql_help.c:2685 sql_help.c:2966 +#: sql_help.c:3151 sql_help.c:3173 sql_help.c:3313 sql_help.c:3668 +#: sql_help.c:3867 sql_help.c:4042 sql_help.c:4790 msgid "option" msgstr "opción" -#: sql_help.c:113 sql_help.c:932 sql_help.c:1601 sql_help.c:2373 -#: sql_help.c:2589 sql_help.c:3148 sql_help.c:3310 +#: sql_help.c:113 sql_help.c:933 sql_help.c:1603 sql_help.c:2377 +#: sql_help.c:2593 sql_help.c:3152 sql_help.c:3314 msgid "where option can be:" msgstr "donde opción puede ser:" -#: sql_help.c:114 sql_help.c:2166 +#: sql_help.c:114 sql_help.c:2168 msgid "allowconn" msgstr "allowconn" -#: sql_help.c:115 sql_help.c:933 sql_help.c:1602 sql_help.c:2167 -#: sql_help.c:2374 sql_help.c:2590 sql_help.c:3149 +#: sql_help.c:115 sql_help.c:934 sql_help.c:1604 sql_help.c:2169 +#: sql_help.c:2378 sql_help.c:2594 sql_help.c:3153 msgid "connlimit" msgstr "límite_conexiones" -#: sql_help.c:116 sql_help.c:2168 +#: sql_help.c:116 sql_help.c:2170 msgid "istemplate" msgstr "esplantilla" -#: sql_help.c:122 sql_help.c:607 sql_help.c:673 sql_help.c:1292 sql_help.c:1343 -#: sql_help.c:4042 +#: sql_help.c:122 sql_help.c:608 sql_help.c:674 sql_help.c:1294 sql_help.c:1345 +#: sql_help.c:4046 msgid "new_tablespace" msgstr "nuevo_tablespace" -#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:544 sql_help.c:546 -#: sql_help.c:547 sql_help.c:867 sql_help.c:869 sql_help.c:870 sql_help.c:940 -#: sql_help.c:944 sql_help.c:947 sql_help.c:1008 sql_help.c:1010 -#: sql_help.c:1011 sql_help.c:1155 sql_help.c:1158 sql_help.c:1609 -#: sql_help.c:1613 sql_help.c:1616 sql_help.c:2338 sql_help.c:2540 -#: sql_help.c:4060 sql_help.c:4513 +#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:545 sql_help.c:547 +#: sql_help.c:548 sql_help.c:868 sql_help.c:870 sql_help.c:871 sql_help.c:941 +#: sql_help.c:945 sql_help.c:948 sql_help.c:1010 sql_help.c:1012 +#: sql_help.c:1013 sql_help.c:1157 sql_help.c:1160 sql_help.c:1611 +#: sql_help.c:1615 sql_help.c:1618 sql_help.c:2342 sql_help.c:2544 +#: sql_help.c:4064 sql_help.c:4517 msgid "configuration_parameter" msgstr "parámetro_de_configuración" #: sql_help.c:125 sql_help.c:395 sql_help.c:466 sql_help.c:472 sql_help.c:484 -#: sql_help.c:545 sql_help.c:599 sql_help.c:679 sql_help.c:687 sql_help.c:868 -#: sql_help.c:891 sql_help.c:941 sql_help.c:1009 sql_help.c:1080 -#: sql_help.c:1124 sql_help.c:1128 sql_help.c:1132 sql_help.c:1135 -#: sql_help.c:1140 sql_help.c:1156 sql_help.c:1157 sql_help.c:1323 -#: sql_help.c:1345 sql_help.c:1393 sql_help.c:1415 sql_help.c:1472 -#: sql_help.c:1556 sql_help.c:1610 sql_help.c:1633 sql_help.c:2233 -#: sql_help.c:2275 sql_help.c:2282 sql_help.c:2291 sql_help.c:2339 -#: sql_help.c:2340 sql_help.c:2403 sql_help.c:2406 sql_help.c:2440 -#: sql_help.c:2541 sql_help.c:2542 sql_help.c:2560 sql_help.c:2682 -#: sql_help.c:2721 sql_help.c:2827 sql_help.c:2840 sql_help.c:2854 -#: sql_help.c:2895 sql_help.c:2919 sql_help.c:2936 sql_help.c:2963 -#: sql_help.c:3170 sql_help.c:3864 sql_help.c:4514 sql_help.c:4515 +#: sql_help.c:546 sql_help.c:600 sql_help.c:680 sql_help.c:688 sql_help.c:869 +#: sql_help.c:892 sql_help.c:942 sql_help.c:1011 sql_help.c:1082 +#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:1137 +#: sql_help.c:1142 sql_help.c:1158 sql_help.c:1159 sql_help.c:1325 +#: sql_help.c:1347 sql_help.c:1395 sql_help.c:1417 sql_help.c:1474 +#: sql_help.c:1558 sql_help.c:1612 sql_help.c:1635 sql_help.c:2236 +#: sql_help.c:2278 sql_help.c:2285 sql_help.c:2294 sql_help.c:2343 +#: sql_help.c:2344 sql_help.c:2407 sql_help.c:2410 sql_help.c:2444 +#: sql_help.c:2545 sql_help.c:2546 sql_help.c:2564 sql_help.c:2686 +#: sql_help.c:2725 sql_help.c:2831 sql_help.c:2844 sql_help.c:2858 +#: sql_help.c:2899 sql_help.c:2923 sql_help.c:2940 sql_help.c:2967 +#: sql_help.c:3174 sql_help.c:3868 sql_help.c:4518 sql_help.c:4519 msgid "value" msgstr "valor" @@ -4294,9 +4295,9 @@ msgstr "valor" msgid "target_role" msgstr "rol_destino" -#: sql_help.c:198 sql_help.c:2217 sql_help.c:2637 sql_help.c:2642 -#: sql_help.c:3797 sql_help.c:3806 sql_help.c:3825 sql_help.c:3834 -#: sql_help.c:4177 sql_help.c:4186 sql_help.c:4205 sql_help.c:4214 +#: sql_help.c:198 sql_help.c:2220 sql_help.c:2641 sql_help.c:2646 +#: sql_help.c:3801 sql_help.c:3810 sql_help.c:3829 sql_help.c:3838 +#: sql_help.c:4181 sql_help.c:4190 sql_help.c:4209 sql_help.c:4218 msgid "schema_name" msgstr "nombre_de_esquema" @@ -4310,31 +4311,31 @@ msgstr "donde grant_o_revoke_abreviado es uno de:" #: sql_help.c:201 sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205 #: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 -#: sql_help.c:570 sql_help.c:606 sql_help.c:672 sql_help.c:814 sql_help.c:951 -#: sql_help.c:1291 sql_help.c:1620 sql_help.c:2377 sql_help.c:2378 -#: sql_help.c:2379 sql_help.c:2380 sql_help.c:2381 sql_help.c:2514 -#: sql_help.c:2593 sql_help.c:2594 sql_help.c:2595 sql_help.c:2596 -#: sql_help.c:2597 sql_help.c:3152 sql_help.c:3153 sql_help.c:3154 -#: sql_help.c:3155 sql_help.c:3156 sql_help.c:3843 sql_help.c:3847 -#: sql_help.c:4223 sql_help.c:4227 sql_help.c:4534 +#: sql_help.c:571 sql_help.c:607 sql_help.c:673 sql_help.c:815 sql_help.c:952 +#: sql_help.c:1293 sql_help.c:1622 sql_help.c:2381 sql_help.c:2382 +#: sql_help.c:2383 sql_help.c:2384 sql_help.c:2385 sql_help.c:2518 +#: sql_help.c:2597 sql_help.c:2598 sql_help.c:2599 sql_help.c:2600 +#: sql_help.c:2601 sql_help.c:3156 sql_help.c:3157 sql_help.c:3158 +#: sql_help.c:3159 sql_help.c:3160 sql_help.c:3847 sql_help.c:3851 +#: sql_help.c:4227 sql_help.c:4231 sql_help.c:4538 msgid "role_name" msgstr "nombre_de_rol" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1307 sql_help.c:1309 -#: sql_help.c:1360 sql_help.c:1372 sql_help.c:1397 sql_help.c:1650 -#: sql_help.c:2187 sql_help.c:2191 sql_help.c:2294 sql_help.c:2299 -#: sql_help.c:2399 sql_help.c:2698 sql_help.c:2703 sql_help.c:2705 -#: sql_help.c:2822 sql_help.c:2835 sql_help.c:2849 sql_help.c:2858 -#: sql_help.c:2870 sql_help.c:2899 sql_help.c:3895 sql_help.c:3910 -#: sql_help.c:3912 sql_help.c:4391 sql_help.c:4392 sql_help.c:4401 -#: sql_help.c:4443 sql_help.c:4444 sql_help.c:4445 sql_help.c:4446 -#: sql_help.c:4447 sql_help.c:4448 sql_help.c:4488 sql_help.c:4489 -#: sql_help.c:4494 sql_help.c:4499 sql_help.c:4640 sql_help.c:4641 -#: sql_help.c:4650 sql_help.c:4692 sql_help.c:4693 sql_help.c:4694 -#: sql_help.c:4695 sql_help.c:4696 sql_help.c:4697 sql_help.c:4751 -#: sql_help.c:4753 sql_help.c:4814 sql_help.c:4872 sql_help.c:4873 -#: sql_help.c:4882 sql_help.c:4924 sql_help.c:4925 sql_help.c:4926 -#: sql_help.c:4927 sql_help.c:4928 sql_help.c:4929 +#: sql_help.c:236 sql_help.c:459 sql_help.c:1309 sql_help.c:1311 +#: sql_help.c:1362 sql_help.c:1374 sql_help.c:1399 sql_help.c:1652 +#: sql_help.c:2189 sql_help.c:2193 sql_help.c:2297 sql_help.c:2302 +#: sql_help.c:2403 sql_help.c:2702 sql_help.c:2707 sql_help.c:2709 +#: sql_help.c:2826 sql_help.c:2839 sql_help.c:2853 sql_help.c:2862 +#: sql_help.c:2874 sql_help.c:2903 sql_help.c:3899 sql_help.c:3914 +#: sql_help.c:3916 sql_help.c:4395 sql_help.c:4396 sql_help.c:4405 +#: sql_help.c:4447 sql_help.c:4448 sql_help.c:4449 sql_help.c:4450 +#: sql_help.c:4451 sql_help.c:4452 sql_help.c:4492 sql_help.c:4493 +#: sql_help.c:4498 sql_help.c:4503 sql_help.c:4644 sql_help.c:4645 +#: sql_help.c:4654 sql_help.c:4696 sql_help.c:4697 sql_help.c:4698 +#: sql_help.c:4699 sql_help.c:4700 sql_help.c:4701 sql_help.c:4755 +#: sql_help.c:4757 sql_help.c:4817 sql_help.c:4875 sql_help.c:4876 +#: sql_help.c:4885 sql_help.c:4927 sql_help.c:4928 sql_help.c:4929 +#: sql_help.c:4930 sql_help.c:4931 sql_help.c:4932 msgid "expression" msgstr "expresión" @@ -4343,18 +4344,18 @@ msgid "domain_constraint" msgstr "restricción_de_dominio" #: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475 -#: sql_help.c:1284 sql_help.c:1331 sql_help.c:1332 sql_help.c:1333 -#: sql_help.c:1359 sql_help.c:1371 sql_help.c:1388 sql_help.c:1818 -#: sql_help.c:1820 sql_help.c:2190 sql_help.c:2293 sql_help.c:2298 -#: sql_help.c:2857 sql_help.c:2869 sql_help.c:3907 +#: sql_help.c:1286 sql_help.c:1333 sql_help.c:1334 sql_help.c:1335 +#: sql_help.c:1361 sql_help.c:1373 sql_help.c:1390 sql_help.c:1820 +#: sql_help.c:1822 sql_help.c:2192 sql_help.c:2296 sql_help.c:2301 +#: sql_help.c:2861 sql_help.c:2873 sql_help.c:3911 msgid "constraint_name" msgstr "nombre_restricción" -#: sql_help.c:244 sql_help.c:1285 +#: sql_help.c:244 sql_help.c:1287 msgid "new_constraint_name" msgstr "nuevo_nombre_restricción" -#: sql_help.c:317 sql_help.c:1078 +#: sql_help.c:317 sql_help.c:1080 msgid "new_version" msgstr "nueva_versión" @@ -4370,82 +4371,82 @@ msgstr "dondo objeto_miembro es:" #: sql_help.c:334 sql_help.c:335 sql_help.c:340 sql_help.c:344 sql_help.c:346 #: sql_help.c:348 sql_help.c:357 sql_help.c:358 sql_help.c:359 sql_help.c:360 #: sql_help.c:361 sql_help.c:362 sql_help.c:363 sql_help.c:364 sql_help.c:367 -#: sql_help.c:368 sql_help.c:1810 sql_help.c:1815 sql_help.c:1822 -#: sql_help.c:1823 sql_help.c:1824 sql_help.c:1825 sql_help.c:1826 -#: sql_help.c:1827 sql_help.c:1828 sql_help.c:1833 sql_help.c:1835 -#: sql_help.c:1839 sql_help.c:1841 sql_help.c:1845 sql_help.c:1850 -#: sql_help.c:1851 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 -#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1863 sql_help.c:1864 -#: sql_help.c:1865 sql_help.c:1866 sql_help.c:1867 sql_help.c:1868 -#: sql_help.c:1873 sql_help.c:1874 sql_help.c:4296 sql_help.c:4301 -#: sql_help.c:4302 sql_help.c:4303 sql_help.c:4304 sql_help.c:4310 -#: sql_help.c:4311 sql_help.c:4316 sql_help.c:4317 sql_help.c:4322 -#: sql_help.c:4323 sql_help.c:4324 sql_help.c:4325 sql_help.c:4326 -#: sql_help.c:4327 +#: sql_help.c:368 sql_help.c:1812 sql_help.c:1817 sql_help.c:1824 +#: sql_help.c:1825 sql_help.c:1826 sql_help.c:1827 sql_help.c:1828 +#: sql_help.c:1829 sql_help.c:1830 sql_help.c:1835 sql_help.c:1837 +#: sql_help.c:1841 sql_help.c:1843 sql_help.c:1847 sql_help.c:1852 +#: sql_help.c:1853 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862 +#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1865 sql_help.c:1866 +#: sql_help.c:1867 sql_help.c:1868 sql_help.c:1869 sql_help.c:1870 +#: sql_help.c:1875 sql_help.c:1876 sql_help.c:4300 sql_help.c:4305 +#: sql_help.c:4306 sql_help.c:4307 sql_help.c:4308 sql_help.c:4314 +#: sql_help.c:4315 sql_help.c:4320 sql_help.c:4321 sql_help.c:4326 +#: sql_help.c:4327 sql_help.c:4328 sql_help.c:4329 sql_help.c:4330 +#: sql_help.c:4331 msgid "object_name" msgstr "nombre_de_objeto" -#: sql_help.c:326 sql_help.c:1811 sql_help.c:4299 +#: sql_help.c:326 sql_help.c:1813 sql_help.c:4303 msgid "aggregate_name" msgstr "nombre_función_agregación" -#: sql_help.c:328 sql_help.c:1813 sql_help.c:2097 sql_help.c:2101 -#: sql_help.c:2103 sql_help.c:3279 +#: sql_help.c:328 sql_help.c:1815 sql_help.c:2099 sql_help.c:2103 +#: sql_help.c:2105 sql_help.c:3283 msgid "source_type" msgstr "tipo_fuente" -#: sql_help.c:329 sql_help.c:1814 sql_help.c:2098 sql_help.c:2102 -#: sql_help.c:2104 sql_help.c:3280 +#: sql_help.c:329 sql_help.c:1816 sql_help.c:2100 sql_help.c:2104 +#: sql_help.c:2106 sql_help.c:3284 msgid "target_type" msgstr "tipo_destino" -#: sql_help.c:336 sql_help.c:778 sql_help.c:1829 sql_help.c:2099 -#: sql_help.c:2140 sql_help.c:2205 sql_help.c:2457 sql_help.c:2488 -#: sql_help.c:3039 sql_help.c:4201 sql_help.c:4305 sql_help.c:4420 -#: sql_help.c:4424 sql_help.c:4428 sql_help.c:4431 sql_help.c:4669 -#: sql_help.c:4673 sql_help.c:4677 sql_help.c:4680 sql_help.c:4901 -#: sql_help.c:4905 sql_help.c:4909 sql_help.c:4912 +#: sql_help.c:336 sql_help.c:779 sql_help.c:1831 sql_help.c:2101 +#: sql_help.c:2142 sql_help.c:2208 sql_help.c:2461 sql_help.c:2492 +#: sql_help.c:3043 sql_help.c:4205 sql_help.c:4309 sql_help.c:4424 +#: sql_help.c:4428 sql_help.c:4432 sql_help.c:4435 sql_help.c:4673 +#: sql_help.c:4677 sql_help.c:4681 sql_help.c:4684 sql_help.c:4904 +#: sql_help.c:4908 sql_help.c:4912 sql_help.c:4915 msgid "function_name" msgstr "nombre_de_función" -#: sql_help.c:341 sql_help.c:771 sql_help.c:1836 sql_help.c:2481 +#: sql_help.c:341 sql_help.c:772 sql_help.c:1838 sql_help.c:2485 msgid "operator_name" msgstr "nombre_operador" -#: sql_help.c:342 sql_help.c:707 sql_help.c:711 sql_help.c:715 sql_help.c:1837 -#: sql_help.c:2458 sql_help.c:3403 +#: sql_help.c:342 sql_help.c:708 sql_help.c:712 sql_help.c:716 sql_help.c:1839 +#: sql_help.c:2462 sql_help.c:3407 msgid "left_type" msgstr "tipo_izq" -#: sql_help.c:343 sql_help.c:708 sql_help.c:712 sql_help.c:716 sql_help.c:1838 -#: sql_help.c:2459 sql_help.c:3404 +#: sql_help.c:343 sql_help.c:709 sql_help.c:713 sql_help.c:717 sql_help.c:1840 +#: sql_help.c:2463 sql_help.c:3408 msgid "right_type" msgstr "tipo_der" -#: sql_help.c:345 sql_help.c:347 sql_help.c:734 sql_help.c:737 sql_help.c:740 -#: sql_help.c:769 sql_help.c:781 sql_help.c:789 sql_help.c:792 sql_help.c:795 -#: sql_help.c:1377 sql_help.c:1840 sql_help.c:1842 sql_help.c:2478 -#: sql_help.c:2499 sql_help.c:2875 sql_help.c:3413 sql_help.c:3422 +#: sql_help.c:345 sql_help.c:347 sql_help.c:735 sql_help.c:738 sql_help.c:741 +#: sql_help.c:770 sql_help.c:782 sql_help.c:790 sql_help.c:793 sql_help.c:796 +#: sql_help.c:1379 sql_help.c:1842 sql_help.c:1844 sql_help.c:2482 +#: sql_help.c:2503 sql_help.c:2879 sql_help.c:3417 sql_help.c:3426 msgid "index_method" msgstr "método_de_índice" -#: sql_help.c:349 sql_help.c:1846 sql_help.c:4312 +#: sql_help.c:349 sql_help.c:1848 sql_help.c:4316 msgid "procedure_name" msgstr "nombre_de_procedimiento" -#: sql_help.c:353 sql_help.c:1852 sql_help.c:3821 sql_help.c:4318 +#: sql_help.c:353 sql_help.c:1854 sql_help.c:3825 sql_help.c:4322 msgid "routine_name" msgstr "nombre_de_rutina" -#: sql_help.c:365 sql_help.c:1349 sql_help.c:1869 sql_help.c:2334 -#: sql_help.c:2539 sql_help.c:2830 sql_help.c:3006 sql_help.c:3584 -#: sql_help.c:3840 sql_help.c:4220 +#: sql_help.c:365 sql_help.c:1351 sql_help.c:1871 sql_help.c:2338 +#: sql_help.c:2543 sql_help.c:2834 sql_help.c:3010 sql_help.c:3588 +#: sql_help.c:3844 sql_help.c:4224 msgid "type_name" msgstr "nombre_de_tipo" -#: sql_help.c:366 sql_help.c:1870 sql_help.c:2333 sql_help.c:2538 -#: sql_help.c:3007 sql_help.c:3237 sql_help.c:3585 sql_help.c:3828 -#: sql_help.c:4208 +#: sql_help.c:366 sql_help.c:1872 sql_help.c:2337 sql_help.c:2542 +#: sql_help.c:3011 sql_help.c:3241 sql_help.c:3589 sql_help.c:3832 +#: sql_help.c:4212 msgid "lang_name" msgstr "nombre_lenguaje" @@ -4453,1936 +4454,1939 @@ msgstr "nombre_lenguaje" msgid "and aggregate_signature is:" msgstr "y signatura_func_agregación es:" -#: sql_help.c:392 sql_help.c:1964 sql_help.c:2230 +#: sql_help.c:392 sql_help.c:1966 sql_help.c:2233 msgid "handler_function" msgstr "función_manejadora" -#: sql_help.c:393 sql_help.c:2231 +#: sql_help.c:393 sql_help.c:2234 msgid "validator_function" msgstr "función_validadora" -#: sql_help.c:441 sql_help.c:519 sql_help.c:661 sql_help.c:845 sql_help.c:984 -#: sql_help.c:1279 sql_help.c:1547 +#: sql_help.c:441 sql_help.c:520 sql_help.c:662 sql_help.c:846 sql_help.c:986 +#: sql_help.c:1281 sql_help.c:1549 msgid "action" msgstr "acción" #: sql_help.c:443 sql_help.c:450 sql_help.c:454 sql_help.c:455 sql_help.c:458 #: sql_help.c:460 sql_help.c:461 sql_help.c:462 sql_help.c:464 sql_help.c:467 -#: sql_help.c:469 sql_help.c:470 sql_help.c:665 sql_help.c:675 sql_help.c:677 -#: sql_help.c:680 sql_help.c:682 sql_help.c:683 sql_help.c:1060 sql_help.c:1281 -#: sql_help.c:1299 sql_help.c:1303 sql_help.c:1304 sql_help.c:1308 -#: sql_help.c:1310 sql_help.c:1311 sql_help.c:1312 sql_help.c:1313 -#: sql_help.c:1315 sql_help.c:1318 sql_help.c:1319 sql_help.c:1321 -#: sql_help.c:1324 sql_help.c:1326 sql_help.c:1327 sql_help.c:1373 -#: sql_help.c:1375 sql_help.c:1382 sql_help.c:1391 sql_help.c:1396 -#: sql_help.c:1649 sql_help.c:1652 sql_help.c:1656 sql_help.c:1692 -#: sql_help.c:1817 sql_help.c:1930 sql_help.c:1936 sql_help.c:1949 -#: sql_help.c:1950 sql_help.c:1951 sql_help.c:2272 sql_help.c:2285 -#: sql_help.c:2331 sql_help.c:2398 sql_help.c:2404 sql_help.c:2437 -#: sql_help.c:2667 sql_help.c:2702 sql_help.c:2704 sql_help.c:2812 -#: sql_help.c:2821 sql_help.c:2831 sql_help.c:2834 sql_help.c:2844 -#: sql_help.c:2848 sql_help.c:2871 sql_help.c:2873 sql_help.c:2880 -#: sql_help.c:2893 sql_help.c:2898 sql_help.c:2916 sql_help.c:3042 -#: sql_help.c:3182 sql_help.c:3800 sql_help.c:3801 sql_help.c:3894 -#: sql_help.c:3909 sql_help.c:3911 sql_help.c:3913 sql_help.c:4180 -#: sql_help.c:4181 sql_help.c:4298 sql_help.c:4452 sql_help.c:4458 -#: sql_help.c:4460 sql_help.c:4701 sql_help.c:4707 sql_help.c:4709 -#: sql_help.c:4750 sql_help.c:4752 sql_help.c:4754 sql_help.c:4802 -#: sql_help.c:4933 sql_help.c:4939 sql_help.c:4941 +#: sql_help.c:469 sql_help.c:470 sql_help.c:666 sql_help.c:676 sql_help.c:678 +#: sql_help.c:681 sql_help.c:683 sql_help.c:684 sql_help.c:1062 sql_help.c:1283 +#: sql_help.c:1301 sql_help.c:1305 sql_help.c:1306 sql_help.c:1310 +#: sql_help.c:1312 sql_help.c:1313 sql_help.c:1314 sql_help.c:1315 +#: sql_help.c:1317 sql_help.c:1320 sql_help.c:1321 sql_help.c:1323 +#: sql_help.c:1326 sql_help.c:1328 sql_help.c:1329 sql_help.c:1375 +#: sql_help.c:1377 sql_help.c:1384 sql_help.c:1393 sql_help.c:1398 +#: sql_help.c:1651 sql_help.c:1654 sql_help.c:1658 sql_help.c:1694 +#: sql_help.c:1819 sql_help.c:1932 sql_help.c:1938 sql_help.c:1951 +#: sql_help.c:1952 sql_help.c:1953 sql_help.c:2275 sql_help.c:2288 +#: sql_help.c:2335 sql_help.c:2402 sql_help.c:2408 sql_help.c:2441 +#: sql_help.c:2671 sql_help.c:2706 sql_help.c:2708 sql_help.c:2816 +#: sql_help.c:2825 sql_help.c:2835 sql_help.c:2838 sql_help.c:2848 +#: sql_help.c:2852 sql_help.c:2875 sql_help.c:2877 sql_help.c:2884 +#: sql_help.c:2897 sql_help.c:2902 sql_help.c:2920 sql_help.c:3046 +#: sql_help.c:3186 sql_help.c:3804 sql_help.c:3805 sql_help.c:3898 +#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3917 sql_help.c:4184 +#: sql_help.c:4185 sql_help.c:4302 sql_help.c:4456 sql_help.c:4462 +#: sql_help.c:4464 sql_help.c:4705 sql_help.c:4711 sql_help.c:4713 +#: sql_help.c:4754 sql_help.c:4756 sql_help.c:4758 sql_help.c:4805 +#: sql_help.c:4936 sql_help.c:4942 sql_help.c:4944 msgid "column_name" msgstr "nombre_de_columna" -#: sql_help.c:444 sql_help.c:666 sql_help.c:1282 sql_help.c:1657 +#: sql_help.c:444 sql_help.c:667 sql_help.c:1284 sql_help.c:1659 msgid "new_column_name" msgstr "nuevo_nombre_de_columna" -#: sql_help.c:449 sql_help.c:540 sql_help.c:674 sql_help.c:866 sql_help.c:1005 -#: sql_help.c:1298 sql_help.c:1557 +#: sql_help.c:449 sql_help.c:541 sql_help.c:675 sql_help.c:867 sql_help.c:1007 +#: sql_help.c:1300 sql_help.c:1559 msgid "where action is one of:" msgstr "donde acción es una de:" -#: sql_help.c:451 sql_help.c:456 sql_help.c:1052 sql_help.c:1300 -#: sql_help.c:1305 sql_help.c:1559 sql_help.c:1563 sql_help.c:2185 -#: sql_help.c:2273 sql_help.c:2477 sql_help.c:2660 sql_help.c:2813 -#: sql_help.c:3089 sql_help.c:3996 +#: sql_help.c:451 sql_help.c:456 sql_help.c:1054 sql_help.c:1302 +#: sql_help.c:1307 sql_help.c:1561 sql_help.c:1565 sql_help.c:2187 +#: sql_help.c:2276 sql_help.c:2481 sql_help.c:2664 sql_help.c:2817 +#: sql_help.c:3093 sql_help.c:4000 msgid "data_type" msgstr "tipo_de_dato" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1301 sql_help.c:1306 -#: sql_help.c:1560 sql_help.c:1564 sql_help.c:2186 sql_help.c:2276 -#: sql_help.c:2400 sql_help.c:2815 sql_help.c:2823 sql_help.c:2836 -#: sql_help.c:2850 sql_help.c:3090 sql_help.c:3096 sql_help.c:3904 +#: sql_help.c:452 sql_help.c:457 sql_help.c:1303 sql_help.c:1308 +#: sql_help.c:1562 sql_help.c:1566 sql_help.c:2188 sql_help.c:2279 +#: sql_help.c:2404 sql_help.c:2819 sql_help.c:2827 sql_help.c:2840 +#: sql_help.c:2854 sql_help.c:3094 sql_help.c:3100 sql_help.c:3908 msgid "collation" msgstr "ordenamiento" -#: sql_help.c:453 sql_help.c:1302 sql_help.c:2277 sql_help.c:2286 -#: sql_help.c:2816 sql_help.c:2832 sql_help.c:2845 +#: sql_help.c:453 sql_help.c:1304 sql_help.c:2280 sql_help.c:2289 +#: sql_help.c:2820 sql_help.c:2836 sql_help.c:2849 msgid "column_constraint" msgstr "restricción_de_columna" -#: sql_help.c:463 sql_help.c:604 sql_help.c:676 sql_help.c:1320 sql_help.c:4799 +#: sql_help.c:463 sql_help.c:605 sql_help.c:677 sql_help.c:1322 sql_help.c:4802 msgid "integer" msgstr "entero" -#: sql_help.c:465 sql_help.c:468 sql_help.c:678 sql_help.c:681 sql_help.c:1322 -#: sql_help.c:1325 +#: sql_help.c:465 sql_help.c:468 sql_help.c:679 sql_help.c:682 sql_help.c:1324 +#: sql_help.c:1327 msgid "attribute_option" msgstr "opción_de_atributo" -#: sql_help.c:473 sql_help.c:1329 sql_help.c:2278 sql_help.c:2287 -#: sql_help.c:2817 sql_help.c:2833 sql_help.c:2846 +#: sql_help.c:473 sql_help.c:1331 sql_help.c:2281 sql_help.c:2290 +#: sql_help.c:2821 sql_help.c:2837 sql_help.c:2850 msgid "table_constraint" msgstr "restricción_de_tabla" -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1334 -#: sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 sql_help.c:1871 +#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1336 +#: sql_help.c:1337 sql_help.c:1338 sql_help.c:1339 sql_help.c:1873 msgid "trigger_name" msgstr "nombre_disparador" -#: sql_help.c:480 sql_help.c:481 sql_help.c:1347 sql_help.c:1348 -#: sql_help.c:2279 sql_help.c:2284 sql_help.c:2820 sql_help.c:2843 +#: sql_help.c:480 sql_help.c:481 sql_help.c:1349 sql_help.c:1350 +#: sql_help.c:2282 sql_help.c:2287 sql_help.c:2824 sql_help.c:2847 msgid "parent_table" msgstr "tabla_padre" -#: sql_help.c:539 sql_help.c:596 sql_help.c:663 sql_help.c:865 sql_help.c:1004 -#: sql_help.c:1516 sql_help.c:2216 +#: sql_help.c:540 sql_help.c:597 sql_help.c:664 sql_help.c:866 sql_help.c:1006 +#: sql_help.c:1518 sql_help.c:2219 msgid "extension_name" msgstr "nombre_de_extensión" -#: sql_help.c:541 sql_help.c:1006 sql_help.c:2335 +#: sql_help.c:542 sql_help.c:1008 sql_help.c:2339 msgid "execution_cost" msgstr "costo_de_ejecución" -#: sql_help.c:542 sql_help.c:1007 sql_help.c:2336 +#: sql_help.c:543 sql_help.c:1009 sql_help.c:2340 msgid "result_rows" msgstr "núm_de_filas" -#: sql_help.c:543 sql_help.c:2337 +#: sql_help.c:544 sql_help.c:2341 msgid "support_function" msgstr "función_de_soporte" -#: sql_help.c:565 sql_help.c:567 sql_help.c:930 sql_help.c:938 sql_help.c:942 -#: sql_help.c:945 sql_help.c:948 sql_help.c:1599 sql_help.c:1607 -#: sql_help.c:1611 sql_help.c:1614 sql_help.c:1617 sql_help.c:2638 -#: sql_help.c:2640 sql_help.c:2643 sql_help.c:2644 sql_help.c:3798 -#: sql_help.c:3799 sql_help.c:3803 sql_help.c:3804 sql_help.c:3807 -#: sql_help.c:3808 sql_help.c:3810 sql_help.c:3811 sql_help.c:3813 -#: sql_help.c:3814 sql_help.c:3816 sql_help.c:3817 sql_help.c:3819 -#: sql_help.c:3820 sql_help.c:3826 sql_help.c:3827 sql_help.c:3829 -#: sql_help.c:3830 sql_help.c:3832 sql_help.c:3833 sql_help.c:3835 -#: sql_help.c:3836 sql_help.c:3838 sql_help.c:3839 sql_help.c:3841 -#: sql_help.c:3842 sql_help.c:3844 sql_help.c:3845 sql_help.c:4178 -#: sql_help.c:4179 sql_help.c:4183 sql_help.c:4184 sql_help.c:4187 -#: sql_help.c:4188 sql_help.c:4190 sql_help.c:4191 sql_help.c:4193 -#: sql_help.c:4194 sql_help.c:4196 sql_help.c:4197 sql_help.c:4199 -#: sql_help.c:4200 sql_help.c:4206 sql_help.c:4207 sql_help.c:4209 -#: sql_help.c:4210 sql_help.c:4212 sql_help.c:4213 sql_help.c:4215 -#: sql_help.c:4216 sql_help.c:4218 sql_help.c:4219 sql_help.c:4221 -#: sql_help.c:4222 sql_help.c:4224 sql_help.c:4225 +#: sql_help.c:566 sql_help.c:568 sql_help.c:931 sql_help.c:939 sql_help.c:943 +#: sql_help.c:946 sql_help.c:949 sql_help.c:1601 sql_help.c:1609 +#: sql_help.c:1613 sql_help.c:1616 sql_help.c:1619 sql_help.c:2642 +#: sql_help.c:2644 sql_help.c:2647 sql_help.c:2648 sql_help.c:3802 +#: sql_help.c:3803 sql_help.c:3807 sql_help.c:3808 sql_help.c:3811 +#: sql_help.c:3812 sql_help.c:3814 sql_help.c:3815 sql_help.c:3817 +#: sql_help.c:3818 sql_help.c:3820 sql_help.c:3821 sql_help.c:3823 +#: sql_help.c:3824 sql_help.c:3830 sql_help.c:3831 sql_help.c:3833 +#: sql_help.c:3834 sql_help.c:3836 sql_help.c:3837 sql_help.c:3839 +#: sql_help.c:3840 sql_help.c:3842 sql_help.c:3843 sql_help.c:3845 +#: sql_help.c:3846 sql_help.c:3848 sql_help.c:3849 sql_help.c:4182 +#: sql_help.c:4183 sql_help.c:4187 sql_help.c:4188 sql_help.c:4191 +#: sql_help.c:4192 sql_help.c:4194 sql_help.c:4195 sql_help.c:4197 +#: sql_help.c:4198 sql_help.c:4200 sql_help.c:4201 sql_help.c:4203 +#: sql_help.c:4204 sql_help.c:4210 sql_help.c:4211 sql_help.c:4213 +#: sql_help.c:4214 sql_help.c:4216 sql_help.c:4217 sql_help.c:4219 +#: sql_help.c:4220 sql_help.c:4222 sql_help.c:4223 sql_help.c:4225 +#: sql_help.c:4226 sql_help.c:4228 sql_help.c:4229 msgid "role_specification" msgstr "especificación_de_rol" -#: sql_help.c:566 sql_help.c:568 sql_help.c:1630 sql_help.c:2159 -#: sql_help.c:2646 sql_help.c:3167 sql_help.c:3618 sql_help.c:4544 +#: sql_help.c:567 sql_help.c:569 sql_help.c:1632 sql_help.c:2161 +#: sql_help.c:2650 sql_help.c:3171 sql_help.c:3622 sql_help.c:4548 msgid "user_name" msgstr "nombre_de_usuario" -#: sql_help.c:569 sql_help.c:950 sql_help.c:1619 sql_help.c:2645 -#: sql_help.c:3846 sql_help.c:4226 +#: sql_help.c:570 sql_help.c:951 sql_help.c:1621 sql_help.c:2649 +#: sql_help.c:3850 sql_help.c:4230 msgid "where role_specification can be:" msgstr "donde especificación_de_rol puede ser:" -#: sql_help.c:571 +#: sql_help.c:572 msgid "group_name" msgstr "nombre_de_grupo" -#: sql_help.c:592 sql_help.c:1394 sql_help.c:2165 sql_help.c:2407 -#: sql_help.c:2441 sql_help.c:2828 sql_help.c:2841 sql_help.c:2855 -#: sql_help.c:2896 sql_help.c:2920 sql_help.c:2932 sql_help.c:3837 -#: sql_help.c:4217 +#: sql_help.c:593 sql_help.c:1396 sql_help.c:2167 sql_help.c:2411 +#: sql_help.c:2445 sql_help.c:2832 sql_help.c:2845 sql_help.c:2859 +#: sql_help.c:2900 sql_help.c:2924 sql_help.c:2936 sql_help.c:3841 +#: sql_help.c:4221 msgid "tablespace_name" msgstr "nombre_de_tablespace" -#: sql_help.c:594 sql_help.c:685 sql_help.c:1342 sql_help.c:1351 -#: sql_help.c:1389 sql_help.c:1746 sql_help.c:1749 +#: sql_help.c:595 sql_help.c:686 sql_help.c:1344 sql_help.c:1353 +#: sql_help.c:1391 sql_help.c:1748 sql_help.c:1751 msgid "index_name" msgstr "nombre_índice" -#: sql_help.c:598 sql_help.c:601 sql_help.c:686 sql_help.c:688 sql_help.c:1344 -#: sql_help.c:1346 sql_help.c:1392 sql_help.c:2405 sql_help.c:2439 -#: sql_help.c:2826 sql_help.c:2839 sql_help.c:2853 sql_help.c:2894 -#: sql_help.c:2918 +#: sql_help.c:599 sql_help.c:602 sql_help.c:687 sql_help.c:689 sql_help.c:1346 +#: sql_help.c:1348 sql_help.c:1394 sql_help.c:2409 sql_help.c:2443 +#: sql_help.c:2830 sql_help.c:2843 sql_help.c:2857 sql_help.c:2898 +#: sql_help.c:2922 msgid "storage_parameter" msgstr "parámetro_de_almacenamiento" -#: sql_help.c:603 +#: sql_help.c:604 msgid "column_number" msgstr "número_de_columna" -#: sql_help.c:627 sql_help.c:1834 sql_help.c:4309 +#: sql_help.c:628 sql_help.c:1836 sql_help.c:4313 msgid "large_object_oid" msgstr "oid_de_objeto_grande" -#: sql_help.c:684 sql_help.c:1328 sql_help.c:2814 +#: sql_help.c:685 sql_help.c:1330 sql_help.c:2818 msgid "compression_method" msgstr "método_de_compresión" -#: sql_help.c:717 sql_help.c:2462 +#: sql_help.c:718 sql_help.c:2466 msgid "res_proc" msgstr "proc_res" -#: sql_help.c:718 sql_help.c:2463 +#: sql_help.c:719 sql_help.c:2467 msgid "join_proc" msgstr "proc_join" -#: sql_help.c:770 sql_help.c:782 sql_help.c:2480 +#: sql_help.c:771 sql_help.c:783 sql_help.c:2484 msgid "strategy_number" msgstr "número_de_estrategia" -#: sql_help.c:772 sql_help.c:773 sql_help.c:776 sql_help.c:777 sql_help.c:783 -#: sql_help.c:784 sql_help.c:786 sql_help.c:787 sql_help.c:2482 sql_help.c:2483 -#: sql_help.c:2486 sql_help.c:2487 +#: sql_help.c:773 sql_help.c:774 sql_help.c:777 sql_help.c:778 sql_help.c:784 +#: sql_help.c:785 sql_help.c:787 sql_help.c:788 sql_help.c:2486 sql_help.c:2487 +#: sql_help.c:2490 sql_help.c:2491 msgid "op_type" msgstr "tipo_op" -#: sql_help.c:774 sql_help.c:2484 +#: sql_help.c:775 sql_help.c:2488 msgid "sort_family_name" msgstr "nombre_familia_ordenamiento" -#: sql_help.c:775 sql_help.c:785 sql_help.c:2485 +#: sql_help.c:776 sql_help.c:786 sql_help.c:2489 msgid "support_number" msgstr "número_de_soporte" -#: sql_help.c:779 sql_help.c:2100 sql_help.c:2489 sql_help.c:3009 -#: sql_help.c:3011 +#: sql_help.c:780 sql_help.c:2102 sql_help.c:2493 sql_help.c:3013 +#: sql_help.c:3015 msgid "argument_type" msgstr "tipo_argumento" -#: sql_help.c:810 sql_help.c:813 sql_help.c:884 sql_help.c:886 sql_help.c:888 -#: sql_help.c:1020 sql_help.c:1059 sql_help.c:1512 sql_help.c:1515 -#: sql_help.c:1691 sql_help.c:1745 sql_help.c:1748 sql_help.c:1819 -#: sql_help.c:1844 sql_help.c:1857 sql_help.c:1872 sql_help.c:1929 -#: sql_help.c:1935 sql_help.c:2271 sql_help.c:2283 sql_help.c:2396 -#: sql_help.c:2436 sql_help.c:2513 sql_help.c:2558 sql_help.c:2614 -#: sql_help.c:2666 sql_help.c:2699 sql_help.c:2706 sql_help.c:2811 -#: sql_help.c:2829 sql_help.c:2842 sql_help.c:2915 sql_help.c:3035 -#: sql_help.c:3216 sql_help.c:3439 sql_help.c:3488 sql_help.c:3594 -#: sql_help.c:3796 sql_help.c:3802 sql_help.c:3860 sql_help.c:3892 -#: sql_help.c:4176 sql_help.c:4182 sql_help.c:4297 sql_help.c:4406 -#: sql_help.c:4408 sql_help.c:4465 sql_help.c:4504 sql_help.c:4655 -#: sql_help.c:4657 sql_help.c:4714 sql_help.c:4748 sql_help.c:4801 -#: sql_help.c:4887 sql_help.c:4889 sql_help.c:4946 +#: sql_help.c:811 sql_help.c:814 sql_help.c:885 sql_help.c:887 sql_help.c:889 +#: sql_help.c:1022 sql_help.c:1061 sql_help.c:1514 sql_help.c:1517 +#: sql_help.c:1693 sql_help.c:1747 sql_help.c:1750 sql_help.c:1821 +#: sql_help.c:1846 sql_help.c:1859 sql_help.c:1874 sql_help.c:1931 +#: sql_help.c:1937 sql_help.c:2274 sql_help.c:2286 sql_help.c:2400 +#: sql_help.c:2440 sql_help.c:2517 sql_help.c:2562 sql_help.c:2618 +#: sql_help.c:2670 sql_help.c:2703 sql_help.c:2710 sql_help.c:2815 +#: sql_help.c:2833 sql_help.c:2846 sql_help.c:2919 sql_help.c:3039 +#: sql_help.c:3220 sql_help.c:3443 sql_help.c:3492 sql_help.c:3598 +#: sql_help.c:3800 sql_help.c:3806 sql_help.c:3864 sql_help.c:3896 +#: sql_help.c:4180 sql_help.c:4186 sql_help.c:4301 sql_help.c:4410 +#: sql_help.c:4412 sql_help.c:4469 sql_help.c:4508 sql_help.c:4659 +#: sql_help.c:4661 sql_help.c:4718 sql_help.c:4752 sql_help.c:4804 +#: sql_help.c:4890 sql_help.c:4892 sql_help.c:4949 msgid "table_name" msgstr "nombre_de_tabla" -#: sql_help.c:815 sql_help.c:2515 +#: sql_help.c:816 sql_help.c:2519 msgid "using_expression" msgstr "expresión_using" -#: sql_help.c:816 sql_help.c:2516 +#: sql_help.c:817 sql_help.c:2520 msgid "check_expression" msgstr "expresión_check" -#: sql_help.c:890 sql_help.c:2559 +#: sql_help.c:891 sql_help.c:2563 msgid "publication_parameter" msgstr "parámetro_de_publicación" -#: sql_help.c:934 sql_help.c:1603 sql_help.c:2375 sql_help.c:2591 -#: sql_help.c:3150 +#: sql_help.c:935 sql_help.c:1605 sql_help.c:2379 sql_help.c:2595 +#: sql_help.c:3154 msgid "password" msgstr "contraseña" -#: sql_help.c:935 sql_help.c:1604 sql_help.c:2376 sql_help.c:2592 -#: sql_help.c:3151 +#: sql_help.c:936 sql_help.c:1606 sql_help.c:2380 sql_help.c:2596 +#: sql_help.c:3155 msgid "timestamp" msgstr "fecha_hora" -#: sql_help.c:939 sql_help.c:943 sql_help.c:946 sql_help.c:949 sql_help.c:1608 -#: sql_help.c:1612 sql_help.c:1615 sql_help.c:1618 sql_help.c:3809 -#: sql_help.c:4189 +#: sql_help.c:940 sql_help.c:944 sql_help.c:947 sql_help.c:950 sql_help.c:1610 +#: sql_help.c:1614 sql_help.c:1617 sql_help.c:1620 sql_help.c:3813 +#: sql_help.c:4193 msgid "database_name" msgstr "nombre_de_base_de_datos" -#: sql_help.c:1053 sql_help.c:2661 +#: sql_help.c:1055 sql_help.c:2665 msgid "increment" msgstr "incremento" -#: sql_help.c:1054 sql_help.c:2662 +#: sql_help.c:1056 sql_help.c:2666 msgid "minvalue" msgstr "valormin" -#: sql_help.c:1055 sql_help.c:2663 +#: sql_help.c:1057 sql_help.c:2667 msgid "maxvalue" msgstr "valormax" -#: sql_help.c:1056 sql_help.c:2664 sql_help.c:4404 sql_help.c:4502 -#: sql_help.c:4653 sql_help.c:4818 sql_help.c:4885 +#: sql_help.c:1058 sql_help.c:2668 sql_help.c:4408 sql_help.c:4506 +#: sql_help.c:4657 sql_help.c:4821 sql_help.c:4888 msgid "start" msgstr "inicio" -#: sql_help.c:1057 sql_help.c:1317 +#: sql_help.c:1059 sql_help.c:1319 msgid "restart" msgstr "reinicio" -#: sql_help.c:1058 sql_help.c:2665 +#: sql_help.c:1060 sql_help.c:2669 msgid "cache" msgstr "cache" -#: sql_help.c:1102 +#: sql_help.c:1104 msgid "new_target" msgstr "nuevo_valor" -#: sql_help.c:1120 sql_help.c:2718 +#: sql_help.c:1122 sql_help.c:2722 msgid "conninfo" msgstr "conninfo" -#: sql_help.c:1122 sql_help.c:1126 sql_help.c:1130 sql_help.c:2719 +#: sql_help.c:1124 sql_help.c:1128 sql_help.c:1132 sql_help.c:2723 msgid "publication_name" msgstr "nombre_de_publicación" -#: sql_help.c:1123 sql_help.c:1127 sql_help.c:1131 -msgid "set_publication_option" -msgstr "opción_de_conjunto_de_publicación" +#: sql_help.c:1125 sql_help.c:1129 sql_help.c:1133 +msgid "publication_option" +msgstr "opción_de_publicación" -#: sql_help.c:1134 +#: sql_help.c:1136 msgid "refresh_option" msgstr "opción_refresh" -#: sql_help.c:1139 sql_help.c:2720 +#: sql_help.c:1141 sql_help.c:2724 msgid "subscription_parameter" msgstr "parámetro_de_suscripción" -#: sql_help.c:1294 sql_help.c:1297 +#: sql_help.c:1296 sql_help.c:1299 msgid "partition_name" msgstr "nombre_de_partición" -#: sql_help.c:1295 sql_help.c:2288 sql_help.c:2847 +#: sql_help.c:1297 sql_help.c:2291 sql_help.c:2851 msgid "partition_bound_spec" msgstr "borde_de_partición" -#: sql_help.c:1314 sql_help.c:1363 sql_help.c:2861 +#: sql_help.c:1316 sql_help.c:1365 sql_help.c:2865 msgid "sequence_options" msgstr "opciones_de_secuencia" -#: sql_help.c:1316 +#: sql_help.c:1318 msgid "sequence_option" msgstr "opción_de_secuencia" -#: sql_help.c:1330 +#: sql_help.c:1332 msgid "table_constraint_using_index" msgstr "restricción_de_tabla_con_índice" -#: sql_help.c:1338 sql_help.c:1339 sql_help.c:1340 sql_help.c:1341 +#: sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 sql_help.c:1343 msgid "rewrite_rule_name" msgstr "nombre_regla_de_reescritura" -#: sql_help.c:1352 sql_help.c:2886 +#: sql_help.c:1354 sql_help.c:2890 msgid "and partition_bound_spec is:" msgstr "y borde_de_partición es:" -#: sql_help.c:1353 sql_help.c:1354 sql_help.c:1355 sql_help.c:2887 -#: sql_help.c:2888 sql_help.c:2889 +#: sql_help.c:1355 sql_help.c:1356 sql_help.c:1357 sql_help.c:2891 +#: sql_help.c:2892 sql_help.c:2893 msgid "partition_bound_expr" msgstr "expresión_de_borde_de_partición" -#: sql_help.c:1356 sql_help.c:1357 sql_help.c:2890 sql_help.c:2891 +#: sql_help.c:1358 sql_help.c:1359 sql_help.c:2894 sql_help.c:2895 msgid "numeric_literal" msgstr "literal_numérico" -#: sql_help.c:1358 +#: sql_help.c:1360 msgid "and column_constraint is:" msgstr "donde restricción_de_columna es:" -#: sql_help.c:1361 sql_help.c:2295 sql_help.c:2329 sql_help.c:2537 -#: sql_help.c:2859 +#: sql_help.c:1363 sql_help.c:2298 sql_help.c:2333 sql_help.c:2541 +#: sql_help.c:2863 msgid "default_expr" msgstr "expr_por_omisión" -#: sql_help.c:1362 sql_help.c:2296 sql_help.c:2860 +#: sql_help.c:1364 sql_help.c:2299 sql_help.c:2864 msgid "generation_expr" msgstr "expr_de_generación" -#: sql_help.c:1364 sql_help.c:1365 sql_help.c:1374 sql_help.c:1376 -#: sql_help.c:1380 sql_help.c:2862 sql_help.c:2863 sql_help.c:2872 -#: sql_help.c:2874 sql_help.c:2878 +#: sql_help.c:1366 sql_help.c:1367 sql_help.c:1376 sql_help.c:1378 +#: sql_help.c:1382 sql_help.c:2866 sql_help.c:2867 sql_help.c:2876 +#: sql_help.c:2878 sql_help.c:2882 msgid "index_parameters" msgstr "parámetros_de_índice" -#: sql_help.c:1366 sql_help.c:1383 sql_help.c:2864 sql_help.c:2881 +#: sql_help.c:1368 sql_help.c:1385 sql_help.c:2868 sql_help.c:2885 msgid "reftable" msgstr "tabla_ref" -#: sql_help.c:1367 sql_help.c:1384 sql_help.c:2865 sql_help.c:2882 +#: sql_help.c:1369 sql_help.c:1386 sql_help.c:2869 sql_help.c:2886 msgid "refcolumn" msgstr "columna_ref" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1385 sql_help.c:1386 -#: sql_help.c:2866 sql_help.c:2867 sql_help.c:2883 sql_help.c:2884 +#: sql_help.c:1370 sql_help.c:1371 sql_help.c:1387 sql_help.c:1388 +#: sql_help.c:2870 sql_help.c:2871 sql_help.c:2887 sql_help.c:2888 msgid "referential_action" msgstr "acción_referencial" -#: sql_help.c:1370 sql_help.c:2297 sql_help.c:2868 +#: sql_help.c:1372 sql_help.c:2300 sql_help.c:2872 msgid "and table_constraint is:" msgstr "y restricción_de_tabla es:" -#: sql_help.c:1378 sql_help.c:2876 +#: sql_help.c:1380 sql_help.c:2880 msgid "exclude_element" msgstr "elemento_de_exclusión" -#: sql_help.c:1379 sql_help.c:2877 sql_help.c:4402 sql_help.c:4500 -#: sql_help.c:4651 sql_help.c:4816 sql_help.c:4883 +#: sql_help.c:1381 sql_help.c:2881 sql_help.c:4406 sql_help.c:4504 +#: sql_help.c:4655 sql_help.c:4819 sql_help.c:4886 msgid "operator" msgstr "operador" -#: sql_help.c:1381 sql_help.c:2408 sql_help.c:2879 +#: sql_help.c:1383 sql_help.c:2412 sql_help.c:2883 msgid "predicate" msgstr "predicado" -#: sql_help.c:1387 +#: sql_help.c:1389 msgid "and table_constraint_using_index is:" msgstr "y restricción_de_tabla_con_índice es:" -#: sql_help.c:1390 sql_help.c:2892 +#: sql_help.c:1392 sql_help.c:2896 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "parámetros_de_índice en UNIQUE, PRIMARY KEY y EXCLUDE son:" -#: sql_help.c:1395 sql_help.c:2897 +#: sql_help.c:1397 sql_help.c:2901 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "elemento_de_exclusión en una restricción EXCLUDE es:" -#: sql_help.c:1398 sql_help.c:2401 sql_help.c:2824 sql_help.c:2837 -#: sql_help.c:2851 sql_help.c:2900 sql_help.c:3905 +#: sql_help.c:1400 sql_help.c:2405 sql_help.c:2828 sql_help.c:2841 +#: sql_help.c:2855 sql_help.c:2904 sql_help.c:3909 msgid "opclass" msgstr "clase_de_ops" -#: sql_help.c:1414 sql_help.c:1417 sql_help.c:2935 +#: sql_help.c:1416 sql_help.c:1419 sql_help.c:2939 msgid "tablespace_option" msgstr "opción_de_tablespace" -#: sql_help.c:1438 sql_help.c:1441 sql_help.c:1447 sql_help.c:1451 +#: sql_help.c:1440 sql_help.c:1443 sql_help.c:1449 sql_help.c:1453 msgid "token_type" msgstr "tipo_de_token" -#: sql_help.c:1439 sql_help.c:1442 +#: sql_help.c:1441 sql_help.c:1444 msgid "dictionary_name" msgstr "nombre_diccionario" -#: sql_help.c:1444 sql_help.c:1448 +#: sql_help.c:1446 sql_help.c:1450 msgid "old_dictionary" msgstr "diccionario_antiguo" -#: sql_help.c:1445 sql_help.c:1449 +#: sql_help.c:1447 sql_help.c:1451 msgid "new_dictionary" msgstr "diccionario_nuevo" -#: sql_help.c:1544 sql_help.c:1558 sql_help.c:1561 sql_help.c:1562 -#: sql_help.c:3088 +#: sql_help.c:1546 sql_help.c:1560 sql_help.c:1563 sql_help.c:1564 +#: sql_help.c:3092 msgid "attribute_name" msgstr "nombre_atributo" -#: sql_help.c:1545 +#: sql_help.c:1547 msgid "new_attribute_name" msgstr "nuevo_nombre_atributo" -#: sql_help.c:1549 sql_help.c:1553 +#: sql_help.c:1551 sql_help.c:1555 msgid "new_enum_value" msgstr "nuevo_valor_enum" -#: sql_help.c:1550 +#: sql_help.c:1552 msgid "neighbor_enum_value" msgstr "valor_enum_vecino" -#: sql_help.c:1552 +#: sql_help.c:1554 msgid "existing_enum_value" msgstr "valor_enum_existente" -#: sql_help.c:1555 +#: sql_help.c:1557 msgid "property" msgstr "propiedad" -#: sql_help.c:1631 sql_help.c:2280 sql_help.c:2289 sql_help.c:2677 -#: sql_help.c:3168 sql_help.c:3619 sql_help.c:3818 sql_help.c:3861 -#: sql_help.c:4198 +#: sql_help.c:1633 sql_help.c:2283 sql_help.c:2292 sql_help.c:2681 +#: sql_help.c:3172 sql_help.c:3623 sql_help.c:3822 sql_help.c:3865 +#: sql_help.c:4202 msgid "server_name" msgstr "nombre_de_servidor" -#: sql_help.c:1663 sql_help.c:1666 sql_help.c:3183 +#: sql_help.c:1665 sql_help.c:1668 sql_help.c:3187 msgid "view_option_name" msgstr "nombre_opción_de_vista" -#: sql_help.c:1664 sql_help.c:3184 +#: sql_help.c:1666 sql_help.c:3188 msgid "view_option_value" msgstr "valor_opción_de_vista" -#: sql_help.c:1685 sql_help.c:1686 sql_help.c:4787 sql_help.c:4788 +#: sql_help.c:1687 sql_help.c:1688 sql_help.c:4791 sql_help.c:4792 msgid "table_and_columns" msgstr "tabla_y_columnas" -#: sql_help.c:1687 sql_help.c:1750 sql_help.c:1941 sql_help.c:3667 -#: sql_help.c:4040 sql_help.c:4789 +#: sql_help.c:1689 sql_help.c:1752 sql_help.c:1943 sql_help.c:3671 +#: sql_help.c:4044 sql_help.c:4793 msgid "where option can be one of:" msgstr "donde opción puede ser una de:" -#: sql_help.c:1688 sql_help.c:1689 sql_help.c:1751 sql_help.c:1943 -#: sql_help.c:1946 sql_help.c:2125 sql_help.c:3668 sql_help.c:3669 -#: sql_help.c:3670 sql_help.c:3671 sql_help.c:3672 sql_help.c:3673 -#: sql_help.c:3674 sql_help.c:3675 sql_help.c:4041 sql_help.c:4043 -#: sql_help.c:4790 sql_help.c:4791 sql_help.c:4792 sql_help.c:4793 +#: sql_help.c:1690 sql_help.c:1691 sql_help.c:1753 sql_help.c:1945 +#: sql_help.c:1948 sql_help.c:2127 sql_help.c:3672 sql_help.c:3673 +#: sql_help.c:3674 sql_help.c:3675 sql_help.c:3676 sql_help.c:3677 +#: sql_help.c:3678 sql_help.c:3679 sql_help.c:4045 sql_help.c:4047 #: sql_help.c:4794 sql_help.c:4795 sql_help.c:4796 sql_help.c:4797 -#: sql_help.c:4798 +#: sql_help.c:4798 sql_help.c:4799 sql_help.c:4800 sql_help.c:4801 msgid "boolean" msgstr "booleano" -#: sql_help.c:1690 sql_help.c:4800 +#: sql_help.c:1692 sql_help.c:4803 msgid "and table_and_columns is:" msgstr "y tabla_y_columnas es:" -#: sql_help.c:1706 sql_help.c:4560 sql_help.c:4562 sql_help.c:4586 +#: sql_help.c:1708 sql_help.c:4564 sql_help.c:4566 sql_help.c:4590 msgid "transaction_mode" msgstr "modo_de_transacción" -#: sql_help.c:1707 sql_help.c:4563 sql_help.c:4587 +#: sql_help.c:1709 sql_help.c:4567 sql_help.c:4591 msgid "where transaction_mode is one of:" msgstr "donde modo_de_transacción es uno de:" -#: sql_help.c:1716 sql_help.c:4412 sql_help.c:4421 sql_help.c:4425 -#: sql_help.c:4429 sql_help.c:4432 sql_help.c:4661 sql_help.c:4670 -#: sql_help.c:4674 sql_help.c:4678 sql_help.c:4681 sql_help.c:4893 -#: sql_help.c:4902 sql_help.c:4906 sql_help.c:4910 sql_help.c:4913 +#: sql_help.c:1718 sql_help.c:4416 sql_help.c:4425 sql_help.c:4429 +#: sql_help.c:4433 sql_help.c:4436 sql_help.c:4665 sql_help.c:4674 +#: sql_help.c:4678 sql_help.c:4682 sql_help.c:4685 sql_help.c:4896 +#: sql_help.c:4905 sql_help.c:4909 sql_help.c:4913 sql_help.c:4916 msgid "argument" msgstr "argumento" -#: sql_help.c:1816 +#: sql_help.c:1818 msgid "relation_name" msgstr "nombre_relación" -#: sql_help.c:1821 sql_help.c:3812 sql_help.c:4192 +#: sql_help.c:1823 sql_help.c:3816 sql_help.c:4196 msgid "domain_name" msgstr "nombre_de_dominio" -#: sql_help.c:1843 +#: sql_help.c:1845 msgid "policy_name" msgstr "nombre_de_política" -#: sql_help.c:1856 +#: sql_help.c:1858 msgid "rule_name" msgstr "nombre_regla" -#: sql_help.c:1875 +#: sql_help.c:1877 msgid "text" msgstr "texto" -#: sql_help.c:1900 sql_help.c:4005 sql_help.c:4242 +#: sql_help.c:1902 sql_help.c:4009 sql_help.c:4246 msgid "transaction_id" msgstr "id_de_transacción" -#: sql_help.c:1931 sql_help.c:1938 sql_help.c:3931 +#: sql_help.c:1933 sql_help.c:1940 sql_help.c:3935 msgid "filename" msgstr "nombre_de_archivo" -#: sql_help.c:1932 sql_help.c:1939 sql_help.c:2616 sql_help.c:2617 -#: sql_help.c:2618 +#: sql_help.c:1934 sql_help.c:1941 sql_help.c:2620 sql_help.c:2621 +#: sql_help.c:2622 msgid "command" msgstr "orden" -#: sql_help.c:1934 sql_help.c:2615 sql_help.c:3038 sql_help.c:3219 -#: sql_help.c:3915 sql_help.c:4395 sql_help.c:4397 sql_help.c:4493 -#: sql_help.c:4495 sql_help.c:4644 sql_help.c:4646 sql_help.c:4757 -#: sql_help.c:4876 sql_help.c:4878 +#: sql_help.c:1936 sql_help.c:2619 sql_help.c:3042 sql_help.c:3223 +#: sql_help.c:3919 sql_help.c:4399 sql_help.c:4401 sql_help.c:4497 +#: sql_help.c:4499 sql_help.c:4648 sql_help.c:4650 sql_help.c:4761 +#: sql_help.c:4879 sql_help.c:4881 msgid "condition" msgstr "condición" -#: sql_help.c:1937 sql_help.c:2442 sql_help.c:2921 sql_help.c:3185 -#: sql_help.c:3203 sql_help.c:3896 +#: sql_help.c:1939 sql_help.c:2446 sql_help.c:2925 sql_help.c:3189 +#: sql_help.c:3207 sql_help.c:3900 msgid "query" msgstr "consulta" -#: sql_help.c:1942 +#: sql_help.c:1944 msgid "format_name" msgstr "nombre_de_formato" -#: sql_help.c:1944 +#: sql_help.c:1946 msgid "delimiter_character" msgstr "carácter_delimitador" -#: sql_help.c:1945 +#: sql_help.c:1947 msgid "null_string" msgstr "cadena_null" -#: sql_help.c:1947 +#: sql_help.c:1949 msgid "quote_character" msgstr "carácter_de_comilla" -#: sql_help.c:1948 +#: sql_help.c:1950 msgid "escape_character" msgstr "carácter_de_escape" -#: sql_help.c:1952 +#: sql_help.c:1954 msgid "encoding_name" msgstr "nombre_codificación" -#: sql_help.c:1963 +#: sql_help.c:1965 msgid "access_method_type" msgstr "tipo_de_método_de_acceso" -#: sql_help.c:2034 sql_help.c:2053 sql_help.c:2056 +#: sql_help.c:2036 sql_help.c:2055 sql_help.c:2058 msgid "arg_data_type" msgstr "tipo_de_dato_arg" -#: sql_help.c:2035 sql_help.c:2057 sql_help.c:2065 +#: sql_help.c:2037 sql_help.c:2059 sql_help.c:2067 msgid "sfunc" msgstr "func_transición" -#: sql_help.c:2036 sql_help.c:2058 sql_help.c:2066 +#: sql_help.c:2038 sql_help.c:2060 sql_help.c:2068 msgid "state_data_type" msgstr "tipo_de_dato_de_estado" -#: sql_help.c:2037 sql_help.c:2059 sql_help.c:2067 +#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069 msgid "state_data_size" msgstr "tamaño_de_dato_de_estado" -#: sql_help.c:2038 sql_help.c:2060 sql_help.c:2068 +#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070 msgid "ffunc" msgstr "func_final" -#: sql_help.c:2039 sql_help.c:2069 +#: sql_help.c:2041 sql_help.c:2071 msgid "combinefunc" msgstr "func_combinación" -#: sql_help.c:2040 sql_help.c:2070 +#: sql_help.c:2042 sql_help.c:2072 msgid "serialfunc" msgstr "func_serial" -#: sql_help.c:2041 sql_help.c:2071 +#: sql_help.c:2043 sql_help.c:2073 msgid "deserialfunc" msgstr "func_deserial" -#: sql_help.c:2042 sql_help.c:2061 sql_help.c:2072 +#: sql_help.c:2044 sql_help.c:2063 sql_help.c:2074 msgid "initial_condition" msgstr "condición_inicial" -#: sql_help.c:2043 sql_help.c:2073 +#: sql_help.c:2045 sql_help.c:2075 msgid "msfunc" msgstr "func_transición_m" -#: sql_help.c:2044 sql_help.c:2074 +#: sql_help.c:2046 sql_help.c:2076 msgid "minvfunc" msgstr "func_inv_m" -#: sql_help.c:2045 sql_help.c:2075 +#: sql_help.c:2047 sql_help.c:2077 msgid "mstate_data_type" msgstr "tipo_de_dato_de_estado_m" -#: sql_help.c:2046 sql_help.c:2076 +#: sql_help.c:2048 sql_help.c:2078 msgid "mstate_data_size" msgstr "tamaño_de_dato_de_estado_m" -#: sql_help.c:2047 sql_help.c:2077 +#: sql_help.c:2049 sql_help.c:2079 msgid "mffunc" msgstr "func_final_m" -#: sql_help.c:2048 sql_help.c:2078 +#: sql_help.c:2050 sql_help.c:2080 msgid "minitial_condition" msgstr "condición_inicial_m" -#: sql_help.c:2049 sql_help.c:2079 +#: sql_help.c:2051 sql_help.c:2081 msgid "sort_operator" msgstr "operador_de_ordenamiento" -#: sql_help.c:2062 +#: sql_help.c:2064 msgid "or the old syntax" msgstr "o la sintaxis antigua" -#: sql_help.c:2064 +#: sql_help.c:2066 msgid "base_type" msgstr "tipo_base" -#: sql_help.c:2121 sql_help.c:2162 +#: sql_help.c:2123 sql_help.c:2164 msgid "locale" msgstr "configuración regional" -#: sql_help.c:2122 sql_help.c:2163 +#: sql_help.c:2124 sql_help.c:2165 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2123 sql_help.c:2164 +#: sql_help.c:2125 sql_help.c:2166 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2124 sql_help.c:4295 +#: sql_help.c:2126 sql_help.c:4299 msgid "provider" msgstr "proveedor" -#: sql_help.c:2126 sql_help.c:2218 +#: sql_help.c:2128 sql_help.c:2221 msgid "version" msgstr "versión" -#: sql_help.c:2128 +#: sql_help.c:2130 msgid "existing_collation" msgstr "ordenamiento_existente" -#: sql_help.c:2138 +#: sql_help.c:2140 msgid "source_encoding" msgstr "codificación_origen" -#: sql_help.c:2139 +#: sql_help.c:2141 msgid "dest_encoding" msgstr "codificación_destino" -#: sql_help.c:2160 sql_help.c:2961 +#: sql_help.c:2162 sql_help.c:2965 msgid "template" msgstr "plantilla" -#: sql_help.c:2161 +#: sql_help.c:2163 msgid "encoding" msgstr "codificación" -#: sql_help.c:2188 +#: sql_help.c:2190 msgid "constraint" msgstr "restricción" -#: sql_help.c:2189 +#: sql_help.c:2191 msgid "where constraint is:" msgstr "donde restricción es:" -#: sql_help.c:2203 sql_help.c:2613 sql_help.c:3034 +#: sql_help.c:2205 sql_help.c:2617 sql_help.c:3038 msgid "event" msgstr "evento" -#: sql_help.c:2204 +#: sql_help.c:2206 msgid "filter_variable" msgstr "variable_de_filtrado" -#: sql_help.c:2292 sql_help.c:2856 +#: sql_help.c:2207 +msgid "filter_value" +msgstr "valor_de_filtrado" + +#: sql_help.c:2295 sql_help.c:2860 msgid "where column_constraint is:" msgstr "donde restricción_de_columna es:" -#: sql_help.c:2330 +#: sql_help.c:2334 msgid "rettype" msgstr "tipo_ret" -#: sql_help.c:2332 +#: sql_help.c:2336 msgid "column_type" msgstr "tipo_columna" -#: sql_help.c:2341 sql_help.c:2543 +#: sql_help.c:2345 sql_help.c:2547 msgid "definition" msgstr "definición" -#: sql_help.c:2342 sql_help.c:2544 +#: sql_help.c:2346 sql_help.c:2548 msgid "obj_file" msgstr "archivo_obj" -#: sql_help.c:2343 sql_help.c:2545 +#: sql_help.c:2347 sql_help.c:2549 msgid "link_symbol" msgstr "símbolo_enlace" -#: sql_help.c:2344 sql_help.c:2546 +#: sql_help.c:2348 sql_help.c:2550 msgid "sql_body" msgstr "contenido_sql" -#: sql_help.c:2382 sql_help.c:2598 sql_help.c:3157 +#: sql_help.c:2386 sql_help.c:2602 sql_help.c:3161 msgid "uid" msgstr "uid" -#: sql_help.c:2397 sql_help.c:2438 sql_help.c:2825 sql_help.c:2838 -#: sql_help.c:2852 sql_help.c:2917 +#: sql_help.c:2401 sql_help.c:2442 sql_help.c:2829 sql_help.c:2842 +#: sql_help.c:2856 sql_help.c:2921 msgid "method" msgstr "método" -#: sql_help.c:2402 +#: sql_help.c:2406 msgid "opclass_parameter" msgstr "parámetro_opclass" -#: sql_help.c:2419 +#: sql_help.c:2423 msgid "call_handler" msgstr "manejador_de_llamada" -#: sql_help.c:2420 +#: sql_help.c:2424 msgid "inline_handler" msgstr "manejador_en_línea" -#: sql_help.c:2421 +#: sql_help.c:2425 msgid "valfunction" msgstr "función_val" -#: sql_help.c:2460 +#: sql_help.c:2464 msgid "com_op" msgstr "op_conm" -#: sql_help.c:2461 +#: sql_help.c:2465 msgid "neg_op" msgstr "op_neg" -#: sql_help.c:2479 +#: sql_help.c:2483 msgid "family_name" msgstr "nombre_familia" -#: sql_help.c:2490 +#: sql_help.c:2494 msgid "storage_type" msgstr "tipo_almacenamiento" -#: sql_help.c:2619 sql_help.c:3041 +#: sql_help.c:2623 sql_help.c:3045 msgid "where event can be one of:" msgstr "donde evento puede ser una de:" -#: sql_help.c:2639 sql_help.c:2641 +#: sql_help.c:2643 sql_help.c:2645 msgid "schema_element" msgstr "elemento_de_esquema" -#: sql_help.c:2678 +#: sql_help.c:2682 msgid "server_type" msgstr "tipo_de_servidor" -#: sql_help.c:2679 +#: sql_help.c:2683 msgid "server_version" msgstr "versión_de_servidor" -#: sql_help.c:2680 sql_help.c:3815 sql_help.c:4195 +#: sql_help.c:2684 sql_help.c:3819 sql_help.c:4199 msgid "fdw_name" msgstr "nombre_fdw" -#: sql_help.c:2697 sql_help.c:2700 +#: sql_help.c:2701 sql_help.c:2704 msgid "statistics_name" msgstr "nombre_de_estadística" -#: sql_help.c:2701 +#: sql_help.c:2705 msgid "statistics_kind" msgstr "tipo_de_estadística" -#: sql_help.c:2717 +#: sql_help.c:2721 msgid "subscription_name" msgstr "nombre_de_suscripción" -#: sql_help.c:2818 +#: sql_help.c:2822 msgid "source_table" msgstr "tabla_origen" -#: sql_help.c:2819 +#: sql_help.c:2823 msgid "like_option" msgstr "opción_de_like" -#: sql_help.c:2885 +#: sql_help.c:2889 msgid "and like_option is:" msgstr "y opción_de_like es:" -#: sql_help.c:2934 +#: sql_help.c:2938 msgid "directory" msgstr "directorio" -#: sql_help.c:2948 +#: sql_help.c:2952 msgid "parser_name" msgstr "nombre_de_parser" -#: sql_help.c:2949 +#: sql_help.c:2953 msgid "source_config" msgstr "config_origen" -#: sql_help.c:2978 +#: sql_help.c:2982 msgid "start_function" msgstr "función_inicio" -#: sql_help.c:2979 +#: sql_help.c:2983 msgid "gettoken_function" msgstr "función_gettoken" -#: sql_help.c:2980 +#: sql_help.c:2984 msgid "end_function" msgstr "función_fin" -#: sql_help.c:2981 +#: sql_help.c:2985 msgid "lextypes_function" msgstr "función_lextypes" -#: sql_help.c:2982 +#: sql_help.c:2986 msgid "headline_function" msgstr "función_headline" -#: sql_help.c:2994 +#: sql_help.c:2998 msgid "init_function" msgstr "función_init" -#: sql_help.c:2995 +#: sql_help.c:2999 msgid "lexize_function" msgstr "función_lexize" -#: sql_help.c:3008 +#: sql_help.c:3012 msgid "from_sql_function_name" msgstr "nombre_de_función_from" -#: sql_help.c:3010 +#: sql_help.c:3014 msgid "to_sql_function_name" msgstr "nombre_de_función_to" -#: sql_help.c:3036 +#: sql_help.c:3040 msgid "referenced_table_name" msgstr "nombre_tabla_referenciada" -#: sql_help.c:3037 +#: sql_help.c:3041 msgid "transition_relation_name" msgstr "nombre_de_relación_de_transición" -#: sql_help.c:3040 +#: sql_help.c:3044 msgid "arguments" msgstr "argumentos" -#: sql_help.c:3092 sql_help.c:4328 +#: sql_help.c:3096 sql_help.c:4332 msgid "label" msgstr "etiqueta" -#: sql_help.c:3094 +#: sql_help.c:3098 msgid "subtype" msgstr "subtipo" -#: sql_help.c:3095 +#: sql_help.c:3099 msgid "subtype_operator_class" msgstr "clase_de_operador_del_subtipo" -#: sql_help.c:3097 +#: sql_help.c:3101 msgid "canonical_function" msgstr "función_canónica" -#: sql_help.c:3098 +#: sql_help.c:3102 msgid "subtype_diff_function" msgstr "función_diff_del_subtipo" -#: sql_help.c:3099 +#: sql_help.c:3103 msgid "multirange_type_name" -msgstr "nombre_de_tipo_de_rango_múltiple" +msgstr "nombre_de_tipo_de_multirango" -#: sql_help.c:3101 +#: sql_help.c:3105 msgid "input_function" msgstr "función_entrada" -#: sql_help.c:3102 +#: sql_help.c:3106 msgid "output_function" msgstr "función_salida" -#: sql_help.c:3103 +#: sql_help.c:3107 msgid "receive_function" msgstr "función_receive" -#: sql_help.c:3104 +#: sql_help.c:3108 msgid "send_function" msgstr "función_send" -#: sql_help.c:3105 +#: sql_help.c:3109 msgid "type_modifier_input_function" msgstr "función_entrada_del_modificador_de_tipo" -#: sql_help.c:3106 +#: sql_help.c:3110 msgid "type_modifier_output_function" msgstr "función_salida_del_modificador_de_tipo" -#: sql_help.c:3107 +#: sql_help.c:3111 msgid "analyze_function" msgstr "función_analyze" -#: sql_help.c:3108 +#: sql_help.c:3112 msgid "subscript_function" msgstr "función_de_subíndice" -#: sql_help.c:3109 +#: sql_help.c:3113 msgid "internallength" msgstr "largo_interno" -#: sql_help.c:3110 +#: sql_help.c:3114 msgid "alignment" msgstr "alineamiento" -#: sql_help.c:3111 +#: sql_help.c:3115 msgid "storage" msgstr "almacenamiento" -#: sql_help.c:3112 +#: sql_help.c:3116 msgid "like_type" msgstr "como_tipo" -#: sql_help.c:3113 +#: sql_help.c:3117 msgid "category" msgstr "categoría" -#: sql_help.c:3114 +#: sql_help.c:3118 msgid "preferred" msgstr "preferido" -#: sql_help.c:3115 +#: sql_help.c:3119 msgid "default" msgstr "valor_por_omisión" -#: sql_help.c:3116 +#: sql_help.c:3120 msgid "element" msgstr "elemento" -#: sql_help.c:3117 +#: sql_help.c:3121 msgid "delimiter" msgstr "delimitador" -#: sql_help.c:3118 +#: sql_help.c:3122 msgid "collatable" msgstr "ordenable" -#: sql_help.c:3215 sql_help.c:3891 sql_help.c:4390 sql_help.c:4487 -#: sql_help.c:4639 sql_help.c:4747 sql_help.c:4871 +#: sql_help.c:3219 sql_help.c:3895 sql_help.c:4394 sql_help.c:4491 +#: sql_help.c:4643 sql_help.c:4751 sql_help.c:4874 msgid "with_query" msgstr "consulta_with" -#: sql_help.c:3217 sql_help.c:3893 sql_help.c:4409 sql_help.c:4415 -#: sql_help.c:4418 sql_help.c:4422 sql_help.c:4426 sql_help.c:4434 -#: sql_help.c:4658 sql_help.c:4664 sql_help.c:4667 sql_help.c:4671 -#: sql_help.c:4675 sql_help.c:4683 sql_help.c:4749 sql_help.c:4890 -#: sql_help.c:4896 sql_help.c:4899 sql_help.c:4903 sql_help.c:4907 -#: sql_help.c:4915 +#: sql_help.c:3221 sql_help.c:3897 sql_help.c:4413 sql_help.c:4419 +#: sql_help.c:4422 sql_help.c:4426 sql_help.c:4430 sql_help.c:4438 +#: sql_help.c:4662 sql_help.c:4668 sql_help.c:4671 sql_help.c:4675 +#: sql_help.c:4679 sql_help.c:4687 sql_help.c:4753 sql_help.c:4893 +#: sql_help.c:4899 sql_help.c:4902 sql_help.c:4906 sql_help.c:4910 +#: sql_help.c:4918 msgid "alias" msgstr "alias" -#: sql_help.c:3218 sql_help.c:4394 sql_help.c:4436 sql_help.c:4438 -#: sql_help.c:4492 sql_help.c:4643 sql_help.c:4685 sql_help.c:4687 -#: sql_help.c:4756 sql_help.c:4875 sql_help.c:4917 sql_help.c:4919 +#: sql_help.c:3222 sql_help.c:4398 sql_help.c:4440 sql_help.c:4442 +#: sql_help.c:4496 sql_help.c:4647 sql_help.c:4689 sql_help.c:4691 +#: sql_help.c:4760 sql_help.c:4878 sql_help.c:4920 sql_help.c:4922 msgid "from_item" msgstr "item_de_from" -#: sql_help.c:3220 sql_help.c:3701 sql_help.c:3972 sql_help.c:4758 +#: sql_help.c:3224 sql_help.c:3705 sql_help.c:3976 sql_help.c:4762 msgid "cursor_name" msgstr "nombre_de_cursor" -#: sql_help.c:3221 sql_help.c:3899 sql_help.c:4759 +#: sql_help.c:3225 sql_help.c:3903 sql_help.c:4763 msgid "output_expression" msgstr "expresión_de_salida" -#: sql_help.c:3222 sql_help.c:3900 sql_help.c:4393 sql_help.c:4490 -#: sql_help.c:4642 sql_help.c:4760 sql_help.c:4874 +#: sql_help.c:3226 sql_help.c:3904 sql_help.c:4397 sql_help.c:4494 +#: sql_help.c:4646 sql_help.c:4764 sql_help.c:4877 msgid "output_name" msgstr "nombre_de_salida" -#: sql_help.c:3238 +#: sql_help.c:3242 msgid "code" msgstr "código" -#: sql_help.c:3643 +#: sql_help.c:3647 msgid "parameter" msgstr "parámetro" -#: sql_help.c:3665 sql_help.c:3666 sql_help.c:3997 +#: sql_help.c:3669 sql_help.c:3670 sql_help.c:4001 msgid "statement" msgstr "sentencia" -#: sql_help.c:3700 sql_help.c:3971 +#: sql_help.c:3704 sql_help.c:3975 msgid "direction" msgstr "dirección" -#: sql_help.c:3702 sql_help.c:3973 +#: sql_help.c:3706 sql_help.c:3977 msgid "where direction can be empty or one of:" msgstr "donde dirección puede ser vacío o uno de:" -#: sql_help.c:3703 sql_help.c:3704 sql_help.c:3705 sql_help.c:3706 -#: sql_help.c:3707 sql_help.c:3974 sql_help.c:3975 sql_help.c:3976 -#: sql_help.c:3977 sql_help.c:3978 sql_help.c:4403 sql_help.c:4405 -#: sql_help.c:4501 sql_help.c:4503 sql_help.c:4652 sql_help.c:4654 -#: sql_help.c:4817 sql_help.c:4819 sql_help.c:4884 sql_help.c:4886 +#: sql_help.c:3707 sql_help.c:3708 sql_help.c:3709 sql_help.c:3710 +#: sql_help.c:3711 sql_help.c:3978 sql_help.c:3979 sql_help.c:3980 +#: sql_help.c:3981 sql_help.c:3982 sql_help.c:4407 sql_help.c:4409 +#: sql_help.c:4505 sql_help.c:4507 sql_help.c:4656 sql_help.c:4658 +#: sql_help.c:4820 sql_help.c:4822 sql_help.c:4887 sql_help.c:4889 msgid "count" msgstr "cantidad" -#: sql_help.c:3805 sql_help.c:4185 +#: sql_help.c:3809 sql_help.c:4189 msgid "sequence_name" msgstr "nombre_secuencia" -#: sql_help.c:3823 sql_help.c:4203 +#: sql_help.c:3827 sql_help.c:4207 msgid "arg_name" msgstr "nombre_arg" -#: sql_help.c:3824 sql_help.c:4204 +#: sql_help.c:3828 sql_help.c:4208 msgid "arg_type" msgstr "tipo_arg" -#: sql_help.c:3831 sql_help.c:4211 +#: sql_help.c:3835 sql_help.c:4215 msgid "loid" msgstr "loid" -#: sql_help.c:3859 +#: sql_help.c:3863 msgid "remote_schema" msgstr "schema_remoto" -#: sql_help.c:3862 +#: sql_help.c:3866 msgid "local_schema" msgstr "schema_local" -#: sql_help.c:3897 +#: sql_help.c:3901 msgid "conflict_target" msgstr "destino_de_conflict" -#: sql_help.c:3898 +#: sql_help.c:3902 msgid "conflict_action" msgstr "acción_de_conflict" -#: sql_help.c:3901 +#: sql_help.c:3905 msgid "where conflict_target can be one of:" msgstr "donde destino_de_conflict puede ser uno de:" -#: sql_help.c:3902 +#: sql_help.c:3906 msgid "index_column_name" msgstr "nombre_de_columna_de_índice" -#: sql_help.c:3903 +#: sql_help.c:3907 msgid "index_expression" msgstr "expresión_de_índice" -#: sql_help.c:3906 +#: sql_help.c:3910 msgid "index_predicate" msgstr "predicado_de_índice" -#: sql_help.c:3908 +#: sql_help.c:3912 msgid "and conflict_action is one of:" msgstr "donde acción_de_conflict es una de:" -#: sql_help.c:3914 sql_help.c:4755 +#: sql_help.c:3918 sql_help.c:4759 msgid "sub-SELECT" msgstr "sub-SELECT" -#: sql_help.c:3923 sql_help.c:3986 sql_help.c:4731 +#: sql_help.c:3927 sql_help.c:3990 sql_help.c:4735 msgid "channel" msgstr "canal" -#: sql_help.c:3945 +#: sql_help.c:3949 msgid "lockmode" msgstr "modo_bloqueo" -#: sql_help.c:3946 +#: sql_help.c:3950 msgid "where lockmode is one of:" msgstr "donde modo_bloqueo es uno de:" -#: sql_help.c:3987 +#: sql_help.c:3991 msgid "payload" msgstr "carga" -#: sql_help.c:4014 +#: sql_help.c:4018 msgid "old_role" msgstr "rol_antiguo" -#: sql_help.c:4015 +#: sql_help.c:4019 msgid "new_role" msgstr "rol_nuevo" -#: sql_help.c:4051 sql_help.c:4250 sql_help.c:4258 +#: sql_help.c:4055 sql_help.c:4254 sql_help.c:4262 msgid "savepoint_name" msgstr "nombre_de_savepoint" -#: sql_help.c:4396 sql_help.c:4449 sql_help.c:4645 sql_help.c:4698 -#: sql_help.c:4877 sql_help.c:4930 +#: sql_help.c:4400 sql_help.c:4453 sql_help.c:4649 sql_help.c:4702 +#: sql_help.c:4880 sql_help.c:4933 msgid "grouping_element" msgstr "elemento_agrupante" -#: sql_help.c:4398 sql_help.c:4496 sql_help.c:4647 sql_help.c:4879 +#: sql_help.c:4402 sql_help.c:4500 sql_help.c:4651 sql_help.c:4882 msgid "window_name" msgstr "nombre_de_ventana" -#: sql_help.c:4399 sql_help.c:4497 sql_help.c:4648 sql_help.c:4880 +#: sql_help.c:4403 sql_help.c:4501 sql_help.c:4652 sql_help.c:4883 msgid "window_definition" msgstr "definición_de_ventana" -#: sql_help.c:4400 sql_help.c:4414 sql_help.c:4453 sql_help.c:4498 -#: sql_help.c:4649 sql_help.c:4663 sql_help.c:4702 sql_help.c:4881 -#: sql_help.c:4895 sql_help.c:4934 +#: sql_help.c:4404 sql_help.c:4418 sql_help.c:4457 sql_help.c:4502 +#: sql_help.c:4653 sql_help.c:4667 sql_help.c:4706 sql_help.c:4884 +#: sql_help.c:4898 sql_help.c:4937 msgid "select" msgstr "select" -#: sql_help.c:4407 sql_help.c:4656 sql_help.c:4888 +#: sql_help.c:4411 sql_help.c:4660 sql_help.c:4891 msgid "where from_item can be one of:" msgstr "donde item_de_from puede ser uno de:" -#: sql_help.c:4410 sql_help.c:4416 sql_help.c:4419 sql_help.c:4423 -#: sql_help.c:4435 sql_help.c:4659 sql_help.c:4665 sql_help.c:4668 -#: sql_help.c:4672 sql_help.c:4684 sql_help.c:4891 sql_help.c:4897 -#: sql_help.c:4900 sql_help.c:4904 sql_help.c:4916 +#: sql_help.c:4414 sql_help.c:4420 sql_help.c:4423 sql_help.c:4427 +#: sql_help.c:4439 sql_help.c:4663 sql_help.c:4669 sql_help.c:4672 +#: sql_help.c:4676 sql_help.c:4688 sql_help.c:4894 sql_help.c:4900 +#: sql_help.c:4903 sql_help.c:4907 sql_help.c:4919 msgid "column_alias" msgstr "alias_de_columna" -#: sql_help.c:4411 sql_help.c:4660 sql_help.c:4892 +#: sql_help.c:4415 sql_help.c:4664 sql_help.c:4895 msgid "sampling_method" msgstr "método_de_sampleo" -#: sql_help.c:4413 sql_help.c:4662 sql_help.c:4894 +#: sql_help.c:4417 sql_help.c:4666 sql_help.c:4897 msgid "seed" msgstr "semilla" -#: sql_help.c:4417 sql_help.c:4451 sql_help.c:4666 sql_help.c:4700 -#: sql_help.c:4898 sql_help.c:4932 +#: sql_help.c:4421 sql_help.c:4455 sql_help.c:4670 sql_help.c:4704 +#: sql_help.c:4901 sql_help.c:4935 msgid "with_query_name" msgstr "nombre_consulta_with" -#: sql_help.c:4427 sql_help.c:4430 sql_help.c:4433 sql_help.c:4676 -#: sql_help.c:4679 sql_help.c:4682 sql_help.c:4908 sql_help.c:4911 -#: sql_help.c:4914 +#: sql_help.c:4431 sql_help.c:4434 sql_help.c:4437 sql_help.c:4680 +#: sql_help.c:4683 sql_help.c:4686 sql_help.c:4911 sql_help.c:4914 +#: sql_help.c:4917 msgid "column_definition" msgstr "definición_de_columna" -#: sql_help.c:4437 sql_help.c:4686 sql_help.c:4918 +#: sql_help.c:4441 sql_help.c:4690 sql_help.c:4921 msgid "join_type" msgstr "tipo_de_join" -#: sql_help.c:4439 sql_help.c:4688 sql_help.c:4920 +#: sql_help.c:4443 sql_help.c:4692 sql_help.c:4923 msgid "join_condition" msgstr "condición_de_join" -#: sql_help.c:4440 sql_help.c:4689 sql_help.c:4921 +#: sql_help.c:4444 sql_help.c:4693 sql_help.c:4924 msgid "join_column" msgstr "columna_de_join" -#: sql_help.c:4441 sql_help.c:4690 sql_help.c:4922 +#: sql_help.c:4445 sql_help.c:4694 sql_help.c:4925 msgid "join_using_alias" msgstr "join_con_alias" -#: sql_help.c:4442 sql_help.c:4691 sql_help.c:4923 +#: sql_help.c:4446 sql_help.c:4695 sql_help.c:4926 msgid "and grouping_element can be one of:" msgstr "donde elemento_agrupante puede ser una de:" -#: sql_help.c:4450 sql_help.c:4699 sql_help.c:4931 +#: sql_help.c:4454 sql_help.c:4703 sql_help.c:4934 msgid "and with_query is:" msgstr "y consulta_with es:" -#: sql_help.c:4454 sql_help.c:4703 sql_help.c:4935 +#: sql_help.c:4458 sql_help.c:4707 sql_help.c:4938 msgid "values" msgstr "valores" -#: sql_help.c:4455 sql_help.c:4704 sql_help.c:4936 +#: sql_help.c:4459 sql_help.c:4708 sql_help.c:4939 msgid "insert" msgstr "insert" -#: sql_help.c:4456 sql_help.c:4705 sql_help.c:4937 +#: sql_help.c:4460 sql_help.c:4709 sql_help.c:4940 msgid "update" msgstr "update" -#: sql_help.c:4457 sql_help.c:4706 sql_help.c:4938 +#: sql_help.c:4461 sql_help.c:4710 sql_help.c:4941 msgid "delete" msgstr "delete" -#: sql_help.c:4459 sql_help.c:4708 sql_help.c:4940 +#: sql_help.c:4463 sql_help.c:4712 sql_help.c:4943 msgid "search_seq_col_name" msgstr "nombre_col_para_sec_de_búsqueda" -#: sql_help.c:4461 sql_help.c:4710 sql_help.c:4942 +#: sql_help.c:4465 sql_help.c:4714 sql_help.c:4945 msgid "cycle_mark_col_name" msgstr "nombre_col_para_marca_de_ciclo" -#: sql_help.c:4462 sql_help.c:4711 sql_help.c:4943 +#: sql_help.c:4466 sql_help.c:4715 sql_help.c:4946 msgid "cycle_mark_value" msgstr "valor_marca_de_ciclo" -#: sql_help.c:4463 sql_help.c:4712 sql_help.c:4944 +#: sql_help.c:4467 sql_help.c:4716 sql_help.c:4947 msgid "cycle_mark_default" msgstr "valor_predet_marca_de_ciclo" -#: sql_help.c:4464 sql_help.c:4713 sql_help.c:4945 +#: sql_help.c:4468 sql_help.c:4717 sql_help.c:4948 msgid "cycle_path_col_name" msgstr "nombre_col_para_ruta_de_ciclo" -#: sql_help.c:4491 +#: sql_help.c:4495 msgid "new_table" msgstr "nueva_tabla" -#: sql_help.c:4516 +#: sql_help.c:4520 msgid "timezone" msgstr "huso_horario" -#: sql_help.c:4561 +#: sql_help.c:4565 msgid "snapshot_id" msgstr "id_de_snapshot" -#: sql_help.c:4815 +#: sql_help.c:4818 msgid "sort_expression" msgstr "expresión_orden" -#: sql_help.c:4952 sql_help.c:5930 +#: sql_help.c:4955 sql_help.c:5933 msgid "abort the current transaction" msgstr "aborta la transacción en curso" -#: sql_help.c:4958 +#: sql_help.c:4961 msgid "change the definition of an aggregate function" msgstr "cambia la definición de una función de agregación" -#: sql_help.c:4964 +#: sql_help.c:4967 msgid "change the definition of a collation" msgstr "cambia la definición de un ordenamiento" -#: sql_help.c:4970 +#: sql_help.c:4973 msgid "change the definition of a conversion" msgstr "cambia la definición de una conversión" -#: sql_help.c:4976 +#: sql_help.c:4979 msgid "change a database" msgstr "cambia una base de datos" -#: sql_help.c:4982 +#: sql_help.c:4985 msgid "define default access privileges" msgstr "define privilegios de acceso por omisión" -#: sql_help.c:4988 +#: sql_help.c:4991 msgid "change the definition of a domain" msgstr "cambia la definición de un dominio" -#: sql_help.c:4994 +#: sql_help.c:4997 msgid "change the definition of an event trigger" msgstr "cambia la definición de un disparador por evento" -#: sql_help.c:5000 +#: sql_help.c:5003 msgid "change the definition of an extension" msgstr "cambia la definición de una extensión" -#: sql_help.c:5006 +#: sql_help.c:5009 msgid "change the definition of a foreign-data wrapper" msgstr "cambia la definición de un conector de datos externos" -#: sql_help.c:5012 +#: sql_help.c:5015 msgid "change the definition of a foreign table" msgstr "cambia la definición de una tabla foránea" -#: sql_help.c:5018 +#: sql_help.c:5021 msgid "change the definition of a function" msgstr "cambia la definición de una función" -#: sql_help.c:5024 +#: sql_help.c:5027 msgid "change role name or membership" msgstr "cambiar nombre del rol o membresía" -#: sql_help.c:5030 +#: sql_help.c:5033 msgid "change the definition of an index" msgstr "cambia la definición de un índice" -#: sql_help.c:5036 +#: sql_help.c:5039 msgid "change the definition of a procedural language" msgstr "cambia la definición de un lenguaje procedural" -#: sql_help.c:5042 +#: sql_help.c:5045 msgid "change the definition of a large object" msgstr "cambia la definición de un objeto grande" -#: sql_help.c:5048 +#: sql_help.c:5051 msgid "change the definition of a materialized view" msgstr "cambia la definición de una vista materializada" -#: sql_help.c:5054 +#: sql_help.c:5057 msgid "change the definition of an operator" msgstr "cambia la definición de un operador" -#: sql_help.c:5060 +#: sql_help.c:5063 msgid "change the definition of an operator class" msgstr "cambia la definición de una clase de operadores" -#: sql_help.c:5066 +#: sql_help.c:5069 msgid "change the definition of an operator family" msgstr "cambia la definición de una familia de operadores" -#: sql_help.c:5072 +#: sql_help.c:5075 msgid "change the definition of a row-level security policy" msgstr "cambia la definición de una política de seguridad a nivel de registros" -#: sql_help.c:5078 +#: sql_help.c:5081 msgid "change the definition of a procedure" msgstr "cambia la definición de un procedimiento" -#: sql_help.c:5084 +#: sql_help.c:5087 msgid "change the definition of a publication" msgstr "cambia la definición de una publicación" -#: sql_help.c:5090 sql_help.c:5192 +#: sql_help.c:5093 sql_help.c:5195 msgid "change a database role" msgstr "cambia un rol de la base de datos" -#: sql_help.c:5096 +#: sql_help.c:5099 msgid "change the definition of a routine" msgstr "cambia la definición de una rutina" -#: sql_help.c:5102 +#: sql_help.c:5105 msgid "change the definition of a rule" msgstr "cambia la definición de una regla" -#: sql_help.c:5108 +#: sql_help.c:5111 msgid "change the definition of a schema" msgstr "cambia la definición de un esquema" -#: sql_help.c:5114 +#: sql_help.c:5117 msgid "change the definition of a sequence generator" msgstr "cambia la definición de un generador secuencial" -#: sql_help.c:5120 +#: sql_help.c:5123 msgid "change the definition of a foreign server" msgstr "cambia la definición de un servidor foráneo" -#: sql_help.c:5126 +#: sql_help.c:5129 msgid "change the definition of an extended statistics object" msgstr "cambia la definición de un objeto de estadísticas extendidas" -#: sql_help.c:5132 +#: sql_help.c:5135 msgid "change the definition of a subscription" msgstr "cambia la definición de una suscripción" -#: sql_help.c:5138 +#: sql_help.c:5141 msgid "change a server configuration parameter" msgstr "cambia un parámetro de configuración del servidor" -#: sql_help.c:5144 +#: sql_help.c:5147 msgid "change the definition of a table" msgstr "cambia la definición de una tabla" -#: sql_help.c:5150 +#: sql_help.c:5153 msgid "change the definition of a tablespace" msgstr "cambia la definición de un tablespace" -#: sql_help.c:5156 +#: sql_help.c:5159 msgid "change the definition of a text search configuration" msgstr "cambia la definición de una configuración de búsqueda en texto" -#: sql_help.c:5162 +#: sql_help.c:5165 msgid "change the definition of a text search dictionary" msgstr "cambia la definición de un diccionario de búsqueda en texto" -#: sql_help.c:5168 +#: sql_help.c:5171 msgid "change the definition of a text search parser" msgstr "cambia la definición de un analizador de búsqueda en texto" -#: sql_help.c:5174 +#: sql_help.c:5177 msgid "change the definition of a text search template" msgstr "cambia la definición de una plantilla de búsqueda en texto" -#: sql_help.c:5180 +#: sql_help.c:5183 msgid "change the definition of a trigger" msgstr "cambia la definición de un disparador" -#: sql_help.c:5186 +#: sql_help.c:5189 msgid "change the definition of a type" msgstr "cambia la definición de un tipo" -#: sql_help.c:5198 +#: sql_help.c:5201 msgid "change the definition of a user mapping" msgstr "cambia la definición de un mapeo de usuario" -#: sql_help.c:5204 +#: sql_help.c:5207 msgid "change the definition of a view" msgstr "cambia la definición de una vista" -#: sql_help.c:5210 +#: sql_help.c:5213 msgid "collect statistics about a database" msgstr "recolecta estadísticas sobre una base de datos" -#: sql_help.c:5216 sql_help.c:6008 +#: sql_help.c:5219 sql_help.c:6011 msgid "start a transaction block" msgstr "inicia un bloque de transacción" -#: sql_help.c:5222 +#: sql_help.c:5225 msgid "invoke a procedure" msgstr "invocar un procedimiento" -#: sql_help.c:5228 +#: sql_help.c:5231 msgid "force a write-ahead log checkpoint" msgstr "fuerza un checkpoint de wal" -#: sql_help.c:5234 +#: sql_help.c:5237 msgid "close a cursor" msgstr "cierra un cursor" -#: sql_help.c:5240 +#: sql_help.c:5243 msgid "cluster a table according to an index" msgstr "reordena una tabla siguiendo un índice" -#: sql_help.c:5246 +#: sql_help.c:5249 msgid "define or change the comment of an object" msgstr "define o cambia un comentario sobre un objeto" -#: sql_help.c:5252 sql_help.c:5810 +#: sql_help.c:5255 sql_help.c:5813 msgid "commit the current transaction" msgstr "compromete la transacción en curso" -#: sql_help.c:5258 +#: sql_help.c:5261 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "confirma una transacción que fue preparada para two-phase commit" -#: sql_help.c:5264 +#: sql_help.c:5267 msgid "copy data between a file and a table" msgstr "copia datos entre un archivo y una tabla" -#: sql_help.c:5270 +#: sql_help.c:5273 msgid "define a new access method" msgstr "define un nuevo método de acceso" -#: sql_help.c:5276 +#: sql_help.c:5279 msgid "define a new aggregate function" msgstr "define una nueva función de agregación" -#: sql_help.c:5282 +#: sql_help.c:5285 msgid "define a new cast" msgstr "define una nueva conversión de tipo" -#: sql_help.c:5288 +#: sql_help.c:5291 msgid "define a new collation" msgstr "define un nuevo ordenamiento" -#: sql_help.c:5294 +#: sql_help.c:5297 msgid "define a new encoding conversion" msgstr "define una nueva conversión de codificación" -#: sql_help.c:5300 +#: sql_help.c:5303 msgid "create a new database" msgstr "crea una nueva base de datos" -#: sql_help.c:5306 +#: sql_help.c:5309 msgid "define a new domain" msgstr "define un nuevo dominio" -#: sql_help.c:5312 +#: sql_help.c:5315 msgid "define a new event trigger" msgstr "define un nuevo disparador por evento" -#: sql_help.c:5318 +#: sql_help.c:5321 msgid "install an extension" msgstr "instala una extensión" -#: sql_help.c:5324 +#: sql_help.c:5327 msgid "define a new foreign-data wrapper" msgstr "define un nuevo conector de datos externos" -#: sql_help.c:5330 +#: sql_help.c:5333 msgid "define a new foreign table" msgstr "define una nueva tabla foránea" -#: sql_help.c:5336 +#: sql_help.c:5339 msgid "define a new function" msgstr "define una nueva función" -#: sql_help.c:5342 sql_help.c:5402 sql_help.c:5504 +#: sql_help.c:5345 sql_help.c:5405 sql_help.c:5507 msgid "define a new database role" msgstr "define un nuevo rol de la base de datos" -#: sql_help.c:5348 +#: sql_help.c:5351 msgid "define a new index" msgstr "define un nuevo índice" -#: sql_help.c:5354 +#: sql_help.c:5357 msgid "define a new procedural language" msgstr "define un nuevo lenguaje procedural" -#: sql_help.c:5360 +#: sql_help.c:5363 msgid "define a new materialized view" msgstr "define una nueva vista materializada" -#: sql_help.c:5366 +#: sql_help.c:5369 msgid "define a new operator" msgstr "define un nuevo operador" -#: sql_help.c:5372 +#: sql_help.c:5375 msgid "define a new operator class" msgstr "define una nueva clase de operadores" -#: sql_help.c:5378 +#: sql_help.c:5381 msgid "define a new operator family" msgstr "define una nueva familia de operadores" -#: sql_help.c:5384 +#: sql_help.c:5387 msgid "define a new row-level security policy for a table" msgstr "define una nueva política de seguridad a nivel de registros para una tabla" -#: sql_help.c:5390 +#: sql_help.c:5393 msgid "define a new procedure" msgstr "define un nuevo procedimiento" -#: sql_help.c:5396 +#: sql_help.c:5399 msgid "define a new publication" msgstr "define una nueva publicación" -#: sql_help.c:5408 +#: sql_help.c:5411 msgid "define a new rewrite rule" msgstr "define una nueva regla de reescritura" -#: sql_help.c:5414 +#: sql_help.c:5417 msgid "define a new schema" msgstr "define un nuevo schema" -#: sql_help.c:5420 +#: sql_help.c:5423 msgid "define a new sequence generator" msgstr "define un nuevo generador secuencial" -#: sql_help.c:5426 +#: sql_help.c:5429 msgid "define a new foreign server" msgstr "define un nuevo servidor foráneo" -#: sql_help.c:5432 +#: sql_help.c:5435 msgid "define extended statistics" msgstr "define estadísticas extendidas" -#: sql_help.c:5438 +#: sql_help.c:5441 msgid "define a new subscription" msgstr "define una nueva suscripción" -#: sql_help.c:5444 +#: sql_help.c:5447 msgid "define a new table" msgstr "define una nueva tabla" -#: sql_help.c:5450 sql_help.c:5966 +#: sql_help.c:5453 sql_help.c:5969 msgid "define a new table from the results of a query" msgstr "crea una nueva tabla usando los resultados de una consulta" -#: sql_help.c:5456 +#: sql_help.c:5459 msgid "define a new tablespace" msgstr "define un nuevo tablespace" -#: sql_help.c:5462 +#: sql_help.c:5465 msgid "define a new text search configuration" msgstr "define una nueva configuración de búsqueda en texto" -#: sql_help.c:5468 +#: sql_help.c:5471 msgid "define a new text search dictionary" msgstr "define un nuevo diccionario de búsqueda en texto" -#: sql_help.c:5474 +#: sql_help.c:5477 msgid "define a new text search parser" msgstr "define un nuevo analizador de búsqueda en texto" -#: sql_help.c:5480 +#: sql_help.c:5483 msgid "define a new text search template" msgstr "define una nueva plantilla de búsqueda en texto" -#: sql_help.c:5486 +#: sql_help.c:5489 msgid "define a new transform" msgstr "define una nueva transformación" -#: sql_help.c:5492 +#: sql_help.c:5495 msgid "define a new trigger" msgstr "define un nuevo disparador" -#: sql_help.c:5498 +#: sql_help.c:5501 msgid "define a new data type" msgstr "define un nuevo tipo de datos" -#: sql_help.c:5510 +#: sql_help.c:5513 msgid "define a new mapping of a user to a foreign server" msgstr "define un nuevo mapa de usuario a servidor foráneo" -#: sql_help.c:5516 +#: sql_help.c:5519 msgid "define a new view" msgstr "define una nueva vista" -#: sql_help.c:5522 +#: sql_help.c:5525 msgid "deallocate a prepared statement" msgstr "elimina una sentencia preparada" -#: sql_help.c:5528 +#: sql_help.c:5531 msgid "define a cursor" msgstr "define un nuevo cursor" -#: sql_help.c:5534 +#: sql_help.c:5537 msgid "delete rows of a table" msgstr "elimina filas de una tabla" -#: sql_help.c:5540 +#: sql_help.c:5543 msgid "discard session state" msgstr "descartar datos de la sesión" -#: sql_help.c:5546 +#: sql_help.c:5549 msgid "execute an anonymous code block" msgstr "ejecutar un bloque anónimo de código" -#: sql_help.c:5552 +#: sql_help.c:5555 msgid "remove an access method" msgstr "elimina un método de acceso" -#: sql_help.c:5558 +#: sql_help.c:5561 msgid "remove an aggregate function" msgstr "elimina una función de agregación" -#: sql_help.c:5564 +#: sql_help.c:5567 msgid "remove a cast" msgstr "elimina una conversión de tipo" -#: sql_help.c:5570 +#: sql_help.c:5573 msgid "remove a collation" msgstr "elimina un ordenamiento" -#: sql_help.c:5576 +#: sql_help.c:5579 msgid "remove a conversion" msgstr "elimina una conversión de codificación" -#: sql_help.c:5582 +#: sql_help.c:5585 msgid "remove a database" msgstr "elimina una base de datos" -#: sql_help.c:5588 +#: sql_help.c:5591 msgid "remove a domain" msgstr "elimina un dominio" -#: sql_help.c:5594 +#: sql_help.c:5597 msgid "remove an event trigger" msgstr "elimina un disparador por evento" -#: sql_help.c:5600 +#: sql_help.c:5603 msgid "remove an extension" msgstr "elimina una extensión" -#: sql_help.c:5606 +#: sql_help.c:5609 msgid "remove a foreign-data wrapper" msgstr "elimina un conector de datos externos" -#: sql_help.c:5612 +#: sql_help.c:5615 msgid "remove a foreign table" msgstr "elimina una tabla foránea" -#: sql_help.c:5618 +#: sql_help.c:5621 msgid "remove a function" msgstr "elimina una función" -#: sql_help.c:5624 sql_help.c:5690 sql_help.c:5792 +#: sql_help.c:5627 sql_help.c:5693 sql_help.c:5795 msgid "remove a database role" msgstr "elimina un rol de base de datos" -#: sql_help.c:5630 +#: sql_help.c:5633 msgid "remove an index" msgstr "elimina un índice" -#: sql_help.c:5636 +#: sql_help.c:5639 msgid "remove a procedural language" msgstr "elimina un lenguaje procedural" -#: sql_help.c:5642 +#: sql_help.c:5645 msgid "remove a materialized view" msgstr "elimina una vista materializada" -#: sql_help.c:5648 +#: sql_help.c:5651 msgid "remove an operator" msgstr "elimina un operador" -#: sql_help.c:5654 +#: sql_help.c:5657 msgid "remove an operator class" msgstr "elimina una clase de operadores" -#: sql_help.c:5660 +#: sql_help.c:5663 msgid "remove an operator family" msgstr "elimina una familia de operadores" -#: sql_help.c:5666 +#: sql_help.c:5669 msgid "remove database objects owned by a database role" msgstr "elimina objetos de propiedad de un rol de la base de datos" -#: sql_help.c:5672 +#: sql_help.c:5675 msgid "remove a row-level security policy from a table" msgstr "elimina una política de seguridad a nivel de registros de una tabla" -#: sql_help.c:5678 +#: sql_help.c:5681 msgid "remove a procedure" msgstr "elimina un procedimiento" -#: sql_help.c:5684 +#: sql_help.c:5687 msgid "remove a publication" msgstr "elimina una publicación" -#: sql_help.c:5696 +#: sql_help.c:5699 msgid "remove a routine" msgstr "elimina una rutina" -#: sql_help.c:5702 +#: sql_help.c:5705 msgid "remove a rewrite rule" msgstr "elimina una regla de reescritura" -#: sql_help.c:5708 +#: sql_help.c:5711 msgid "remove a schema" msgstr "elimina un schema" -#: sql_help.c:5714 +#: sql_help.c:5717 msgid "remove a sequence" msgstr "elimina un generador secuencial" -#: sql_help.c:5720 +#: sql_help.c:5723 msgid "remove a foreign server descriptor" msgstr "elimina un descriptor de servidor foráneo" -#: sql_help.c:5726 +#: sql_help.c:5729 msgid "remove extended statistics" msgstr "elimina estadísticas extendidas" -#: sql_help.c:5732 +#: sql_help.c:5735 msgid "remove a subscription" msgstr "elimina una suscripción" -#: sql_help.c:5738 +#: sql_help.c:5741 msgid "remove a table" msgstr "elimina una tabla" -#: sql_help.c:5744 +#: sql_help.c:5747 msgid "remove a tablespace" msgstr "elimina un tablespace" -#: sql_help.c:5750 +#: sql_help.c:5753 msgid "remove a text search configuration" msgstr "elimina una configuración de búsqueda en texto" -#: sql_help.c:5756 +#: sql_help.c:5759 msgid "remove a text search dictionary" msgstr "elimina un diccionario de búsqueda en texto" -#: sql_help.c:5762 +#: sql_help.c:5765 msgid "remove a text search parser" msgstr "elimina un analizador de búsqueda en texto" -#: sql_help.c:5768 +#: sql_help.c:5771 msgid "remove a text search template" msgstr "elimina una plantilla de búsqueda en texto" -#: sql_help.c:5774 +#: sql_help.c:5777 msgid "remove a transform" msgstr "elimina una transformación" -#: sql_help.c:5780 +#: sql_help.c:5783 msgid "remove a trigger" msgstr "elimina un disparador" -#: sql_help.c:5786 +#: sql_help.c:5789 msgid "remove a data type" msgstr "elimina un tipo de datos" -#: sql_help.c:5798 +#: sql_help.c:5801 msgid "remove a user mapping for a foreign server" msgstr "elimina un mapeo de usuario para un servidor remoto" -#: sql_help.c:5804 +#: sql_help.c:5807 msgid "remove a view" msgstr "elimina una vista" -#: sql_help.c:5816 +#: sql_help.c:5819 msgid "execute a prepared statement" msgstr "ejecuta una sentencia preparada" -#: sql_help.c:5822 +#: sql_help.c:5825 msgid "show the execution plan of a statement" msgstr "muestra el plan de ejecución de una sentencia" -#: sql_help.c:5828 +#: sql_help.c:5831 msgid "retrieve rows from a query using a cursor" msgstr "recupera filas de una consulta usando un cursor" -#: sql_help.c:5834 +#: sql_help.c:5837 msgid "define access privileges" msgstr "define privilegios de acceso" -#: sql_help.c:5840 +#: sql_help.c:5843 msgid "import table definitions from a foreign server" msgstr "importa definiciones de tablas desde un servidor foráneo" -#: sql_help.c:5846 +#: sql_help.c:5849 msgid "create new rows in a table" msgstr "crea nuevas filas en una tabla" -#: sql_help.c:5852 +#: sql_help.c:5855 msgid "listen for a notification" msgstr "escucha notificaciones" -#: sql_help.c:5858 +#: sql_help.c:5861 msgid "load a shared library file" msgstr "carga un archivo de biblioteca compartida" -#: sql_help.c:5864 +#: sql_help.c:5867 msgid "lock a table" msgstr "bloquea una tabla" -#: sql_help.c:5870 +#: sql_help.c:5873 msgid "position a cursor" msgstr "reposiciona un cursor" -#: sql_help.c:5876 +#: sql_help.c:5879 msgid "generate a notification" msgstr "genera una notificación" -#: sql_help.c:5882 +#: sql_help.c:5885 msgid "prepare a statement for execution" msgstr "prepara una sentencia para ejecución" -#: sql_help.c:5888 +#: sql_help.c:5891 msgid "prepare the current transaction for two-phase commit" msgstr "prepara la transacción actual para two-phase commit" -#: sql_help.c:5894 +#: sql_help.c:5897 msgid "change the ownership of database objects owned by a database role" msgstr "cambia de dueño a los objetos de propiedad de un rol de la base de datos" -#: sql_help.c:5900 +#: sql_help.c:5903 msgid "replace the contents of a materialized view" msgstr "reemplaza los contenidos de una vista materializada" -#: sql_help.c:5906 +#: sql_help.c:5909 msgid "rebuild indexes" msgstr "reconstruye índices" -#: sql_help.c:5912 +#: sql_help.c:5915 msgid "destroy a previously defined savepoint" msgstr "destruye un savepoint previamente definido" -#: sql_help.c:5918 +#: sql_help.c:5921 msgid "restore the value of a run-time parameter to the default value" msgstr "restaura el valor de un parámetro de configuración al valor inicial" -#: sql_help.c:5924 +#: sql_help.c:5927 msgid "remove access privileges" msgstr "revoca privilegios de acceso" -#: sql_help.c:5936 +#: sql_help.c:5939 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "cancela una transacción que fue previamente preparada para two-phase commit" -#: sql_help.c:5942 +#: sql_help.c:5945 msgid "roll back to a savepoint" msgstr "descartar hacia un savepoint" -#: sql_help.c:5948 +#: sql_help.c:5951 msgid "define a new savepoint within the current transaction" msgstr "define un nuevo savepoint en la transacción en curso" -#: sql_help.c:5954 +#: sql_help.c:5957 msgid "define or change a security label applied to an object" msgstr "define o cambia una etiqueta de seguridad sobre un objeto" -#: sql_help.c:5960 sql_help.c:6014 sql_help.c:6050 +#: sql_help.c:5963 sql_help.c:6017 sql_help.c:6053 msgid "retrieve rows from a table or view" msgstr "recupera filas desde una tabla o vista" -#: sql_help.c:5972 +#: sql_help.c:5975 msgid "change a run-time parameter" msgstr "cambia un parámetro de configuración" -#: sql_help.c:5978 +#: sql_help.c:5981 msgid "set constraint check timing for the current transaction" msgstr "define el modo de verificación de las restricciones de la transacción en curso" -#: sql_help.c:5984 +#: sql_help.c:5987 msgid "set the current user identifier of the current session" msgstr "define el identificador de usuario actual de la sesión actual" -#: sql_help.c:5990 +#: sql_help.c:5993 msgid "set the session user identifier and the current user identifier of the current session" msgstr "" "define el identificador del usuario de sesión y el identificador\n" "del usuario actual de la sesión en curso" -#: sql_help.c:5996 +#: sql_help.c:5999 msgid "set the characteristics of the current transaction" msgstr "define las características de la transacción en curso" -#: sql_help.c:6002 +#: sql_help.c:6005 msgid "show the value of a run-time parameter" msgstr "muestra el valor de un parámetro de configuración" -#: sql_help.c:6020 +#: sql_help.c:6023 msgid "empty a table or set of tables" msgstr "vacía una tabla o conjunto de tablas" -#: sql_help.c:6026 +#: sql_help.c:6029 msgid "stop listening for a notification" msgstr "deja de escuchar una notificación" -#: sql_help.c:6032 +#: sql_help.c:6035 msgid "update rows of a table" msgstr "actualiza filas de una tabla" -#: sql_help.c:6038 +#: sql_help.c:6041 msgid "garbage-collect and optionally analyze a database" msgstr "recolecta basura y opcionalmente estadísticas sobre una base de datos" -#: sql_help.c:6044 +#: sql_help.c:6047 msgid "compute a set of rows" msgstr "calcula un conjunto de registros" @@ -6425,7 +6429,7 @@ msgstr "se ignoró argumento extra «%s» en línea de órdenes" msgid "could not find own program executable" msgstr "no se pudo encontrar el ejecutable propio" -#: tab-complete.c:4898 +#: tab-complete.c:4900 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6460,14 +6464,17 @@ msgstr "" "valor «%s» no reconocido para «%s»\n" "Los valores disponibles son: %s." -#~ msgid "pclose failed: %m" -#~ msgstr "pclose falló: %m" +#~ msgid "All connection parameters must be supplied because no database connection exists" +#~ msgstr "Debe proveer todos los parámetros de conexión porque no existe conexión a una base de datos" #~ msgid "Could not send cancel request: %s" #~ msgstr "No se pudo enviar el paquete de cancelación: %s" -#~ msgid "All connection parameters must be supplied because no database connection exists" -#~ msgstr "Debe proveer todos los parámetros de conexión porque no existe conexión a una base de datos" +#~ msgid "Enter new password: " +#~ msgstr "Ingrese la nueva contraseña: " #~ msgid "could not connect to server: %s" #~ msgstr "no se pudo conectar al servidor: %s" + +#~ msgid "pclose failed: %m" +#~ msgstr "pclose falló: %m" diff --git a/src/bin/psql/po/fr.po b/src/bin/psql/po/fr.po index c6260d70ea..e0d5afc15d 100644 --- a/src/bin/psql/po/fr.po +++ b/src/bin/psql/po/fr.po @@ -1,16 +1,18 @@ -# translation of psql.po to fr_fr -# french message translation file for psql +# LANGUAGE message translation file for psql +# Copyright (C) 2001-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the psql (PostgreSQL) package. # # Use these quotes: « %s » +# # Peter Eisentraut , 2001. -# Guillaume Lelarge , 2003-2009. +# Guillaume Lelarge , 2003-2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-06-14 06:15+0000\n" -"PO-Revision-Date: 2021-06-14 16:09+0200\n" +"POT-Creation-Date: 2022-05-14 10:16+0000\n" +"PO-Revision-Date: 2022-05-14 17:16+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -18,61 +20,66 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 2.4.3\n" - -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "fatal : " +"X-Generator: Poedit 3.0.1\n" -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "attention : " -#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "astuce : " + +#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "n'a pas pu identifier le répertoire courant : %m" -#: ../../common/exec.c:155 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "binaire « %s » invalide" -#: ../../common/exec.c:205 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "n'a pas pu lire le binaire « %s »" -#: ../../common/exec.c:213 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "n'a pas pu trouver un « %s » à exécuter" -#: ../../common/exec.c:269 ../../common/exec.c:308 +#: ../../common/exec.c:282 ../../common/exec.c:321 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "n'a pas pu modifier le répertoire par « %s » : %m" -#: ../../common/exec.c:286 +#: ../../common/exec.c:299 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "n'a pas pu lire le lien symbolique « %s » : %m" -#: ../../common/exec.c:409 +#: ../../common/exec.c:422 #, c-format msgid "%s() failed: %m" msgstr "échec de %s() : %m" -#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 -#: command.c:1315 command.c:3246 command.c:3295 command.c:3412 input.c:227 -#: mainloop.c:81 mainloop.c:402 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: command.c:1320 command.c:3316 command.c:3365 command.c:3489 input.c:227 +#: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "mémoire épuisée" @@ -93,14 +100,14 @@ msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" msgid "could not look up effective user ID %ld: %s" msgstr "n'a pas pu trouver l'identifiant réel %ld de l'utilisateur : %s" -#: ../../common/username.c:45 command.c:565 +#: ../../common/username.c:45 command.c:576 msgid "user does not exist" msgstr "l'utilisateur n'existe pas" #: ../../common/username.c:60 #, c-format msgid "user name lookup failure: error code %lu" -msgstr "échec de la recherche du nom d'utilisateur : code erreur %lu" +msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu" #: ../../common/wait_error.c:45 #, c-format @@ -132,314 +139,306 @@ msgstr "le processus fils a été terminé par le signal %d : %s" msgid "child process exited with unrecognized status %d" msgstr "le processus fils a quitté avec un statut %d non reconnu" -#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 msgid "Cancel request sent\n" msgstr "Requête d'annulation envoyée\n" -#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 msgid "Could not send cancel request: " msgstr "N'a pas pu envoyer la requête d'annulation : " -#: ../../fe_utils/print.c:336 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu ligne)" msgstr[1] "(%lu lignes)" -#: ../../fe_utils/print.c:3039 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Interrompu\n" -#: ../../fe_utils/print.c:3103 +#: ../../fe_utils/print.c:3173 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "" "Ne peut pas ajouter l'en-tête au contenu de la table : le nombre de colonnes\n" "%d est dépassé.\n" -#: ../../fe_utils/print.c:3143 +#: ../../fe_utils/print.c:3213 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "" "Ne peut pas ajouter une cellule au contenu de la table : le nombre total des\n" "cellules %d est dépassé.\n" -#: ../../fe_utils/print.c:3401 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "format de sortie invalide (erreur interne) : %d" -#: ../../fe_utils/psqlscan.l:697 +#: ../../fe_utils/psqlscan.l:702 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "ignore l'expansion récursive de la variable « %s »" -#: command.c:230 +#: ../../port/thread.c:100 ../../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "n'a pas pu rechercher l'identifiant de l'utilisateur local %d : %s" + +#: ../../port/thread.c:105 ../../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "l'utilisateur local dont l'identifiant est %d n'existe pas" + +#: command.c:233 #, c-format msgid "invalid command \\%s" msgstr "commande \\%s invalide" -#: command.c:232 +#: command.c:235 #, c-format msgid "Try \\? for help." msgstr "Essayez \\? pour l'aide." -#: command.c:250 +#: command.c:253 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s : argument « %s » supplémentaire ignoré" -#: command.c:302 +#: command.c:305 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "commande \\%s ignorée ; utilisez \\endif ou Ctrl-C pour quitter le bloc \\if courant" -#: command.c:563 +#: command.c:574 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "n'a pas pu obtenir le répertoire principal pour l'identifiant d'utilisateur %ld : %s" -#: command.c:581 +#: command.c:593 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s : n'a pas pu accéder au répertoire « %s » : %m" -#: command.c:606 +#: command.c:618 #, c-format msgid "You are currently not connected to a database.\n" msgstr "Vous n'êtes pas connecté à une base de données.\n" -#: command.c:616 +#: command.c:628 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » à l'adresse « %s » via le port « %s ».\n" -#: command.c:619 +#: command.c:631 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » via le socket dans « %s » via le port « %s ».\n" -#: command.c:625 +#: command.c:637 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » (adresse « %s ») via le port « %s ».\n" -#: command.c:628 +#: command.c:640 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » via le port « %s ».\n" -#: command.c:1012 command.c:1121 command.c:2602 +#: command.c:1031 command.c:1126 command.c:2660 #, c-format msgid "no query buffer" msgstr "aucun tampon de requête" -#: command.c:1045 command.c:5304 +#: command.c:1064 command.c:5485 #, c-format msgid "invalid line number: %s" msgstr "numéro de ligne invalide : %s" -#: command.c:1112 -#, c-format -msgid "The server (version %s) does not support editing function source." -msgstr "Le serveur (version %s) ne supporte pas l'édition du code de la fonction." - -#: command.c:1115 -#, c-format -msgid "The server (version %s) does not support editing view definitions." -msgstr "Le serveur (version %s) ne supporte pas l'édition des définitions de vue." - -#: command.c:1197 +#: command.c:1202 msgid "No changes" msgstr "Aucun changement" -#: command.c:1276 +#: command.c:1281 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s : nom d'encodage invalide ou procédure de conversion introuvable" -#: command.c:1311 command.c:2052 command.c:3242 command.c:3434 command.c:5406 -#: common.c:174 common.c:223 common.c:392 common.c:1248 common.c:1276 -#: common.c:1385 common.c:1492 common.c:1530 copy.c:488 copy.c:709 help.c:62 -#: large_obj.c:157 large_obj.c:192 large_obj.c:254 startup.c:298 +#: command.c:1316 command.c:2119 command.c:3312 command.c:3511 command.c:5587 +#: common.c:177 common.c:226 common.c:395 common.c:1097 common.c:1175 +#: common.c:1193 common.c:1267 common.c:1374 common.c:1412 common.c:1498 +#: common.c:1541 copy.c:488 copy.c:722 help.c:61 large_obj.c:157 +#: large_obj.c:192 large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1318 +#: command.c:1323 msgid "There is no previous error." msgstr "Il n'y a pas d'erreur précédente." -#: command.c:1431 +#: command.c:1436 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: parenthèse droite manquante" -#: command.c:1608 command.c:1913 command.c:1927 command.c:1944 command.c:2106 -#: command.c:2342 command.c:2569 command.c:2609 +#: command.c:1520 command.c:1650 command.c:1955 command.c:1969 command.c:1988 +#: command.c:2172 command.c:2414 command.c:2627 command.c:2667 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s : argument requis manquant" -#: command.c:1739 +#: command.c:1781 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif : ne peut pas survenir après \\else" -#: command.c:1744 +#: command.c:1786 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif : pas de \\if correspondant" -#: command.c:1808 +#: command.c:1850 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else : ne peut pas survenir après \\else" -#: command.c:1813 +#: command.c:1855 #, c-format msgid "\\else: no matching \\if" msgstr "\\else : pas de \\if correspondant" -#: command.c:1853 +#: command.c:1895 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif : pas de \\if correspondant" -#: command.c:2008 +#: command.c:2052 msgid "Query buffer is empty." msgstr "Le tampon de requête est vide." -#: command.c:2030 -msgid "Enter new password: " -msgstr "Saisissez le nouveau mot de passe : " +#: command.c:2095 +#, c-format +msgid "Enter new password for user \"%s\": " +msgstr "Saisir le nouveau mot de passe de l'utilisateur « %s » : " -#: command.c:2031 +#: command.c:2099 msgid "Enter it again: " -msgstr "Saisissez-le à nouveau : " +msgstr "Saisir le mot de passe à nouveau : " -#: command.c:2035 +#: command.c:2108 #, c-format msgid "Passwords didn't match." msgstr "Les mots de passe ne sont pas identiques." -#: command.c:2135 +#: command.c:2207 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s : n'a pas pu lire la valeur pour la variable" -#: command.c:2238 +#: command.c:2310 msgid "Query buffer reset (cleared)." msgstr "Le tampon de requête a été effacé." -#: command.c:2260 +#: command.c:2332 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Historique sauvegardé dans le fichier « %s ».\n" -#: command.c:2347 +#: command.c:2419 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s : le nom de la variable d'environnement ne doit pas contenir « = »" -#: command.c:2399 -#, c-format -msgid "The server (version %s) does not support showing function source." -msgstr "Le serveur (version %s) ne supporte pas l'affichage du code de la fonction." - -#: command.c:2402 -#, c-format -msgid "The server (version %s) does not support showing view definitions." -msgstr "Le serveur (version %s) ne supporte pas l'affichage des définitions de vues." - -#: command.c:2409 +#: command.c:2467 #, c-format msgid "function name is required" msgstr "le nom de la fonction est requis" -#: command.c:2411 +#: command.c:2469 #, c-format msgid "view name is required" msgstr "le nom de la vue est requis" -#: command.c:2541 +#: command.c:2599 msgid "Timing is on." msgstr "Chronométrage activé." -#: command.c:2543 +#: command.c:2601 msgid "Timing is off." msgstr "Chronométrage désactivé." -#: command.c:2628 command.c:2656 command.c:3873 command.c:3876 command.c:3879 -#: command.c:3885 command.c:3887 command.c:3913 command.c:3923 command.c:3935 -#: command.c:3949 command.c:3976 command.c:4034 common.c:70 copy.c:331 +#: command.c:2686 command.c:2714 command.c:3952 command.c:3955 command.c:3958 +#: command.c:3964 command.c:3966 command.c:3992 command.c:4002 command.c:4014 +#: command.c:4028 command.c:4055 command.c:4113 common.c:73 copy.c:331 #: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 #, c-format msgid "%s: %m" msgstr "%s : %m" -#: command.c:3047 startup.c:237 startup.c:287 +#: command.c:3113 startup.c:243 startup.c:293 msgid "Password: " msgstr "Mot de passe : " -#: command.c:3052 startup.c:284 +#: command.c:3118 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Mot de passe pour l'utilisateur %s : " -#: command.c:3104 +#: command.c:3174 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "Ne pas donner utilisateur, hôte ou port lors de l'utilisation d'une chaîne de connexion" -#: command.c:3139 +#: command.c:3209 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "Aucune connexion de base existante pour réutiliser ses paramètres" -#: command.c:3440 +#: command.c:3517 #, c-format msgid "Previous connection kept" msgstr "Connexion précédente conservée" -#: command.c:3446 +#: command.c:3523 #, c-format msgid "\\connect: %s" msgstr "\\connect : %s" -#: command.c:3502 +#: command.c:3579 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » à l'adresse « %s » via le port « %s ».\n" -#: command.c:3505 +#: command.c:3582 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » via le socket dans « %s » via le port « %s ».\n" -#: command.c:3511 +#: command.c:3588 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » (adresse « %s » ) via le port « %s ».\n" -#: command.c:3514 +#: command.c:3591 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » via le port « %s ».\n" -#: command.c:3519 +#: command.c:3596 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s ».\n" -#: command.c:3559 +#: command.c:3636 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, serveur %s)\n" -#: command.c:3567 +#: command.c:3649 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -448,29 +447,29 @@ msgstr "" "ATTENTION : %s version majeure %s, version majeure du serveur %s.\n" " Certaines fonctionnalités de psql pourraient ne pas fonctionner.\n" -#: command.c:3606 +#: command.c:3686 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" -msgstr "Connexion SSL (protocole : %s, chiffrement : %s, bits : %s, compression : %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" +msgstr "Connexion SSL (protocole : %s, chiffrement : %s, compression : %s)\n" -#: command.c:3607 command.c:3608 command.c:3609 +#: command.c:3687 command.c:3688 msgid "unknown" msgstr "inconnu" -#: command.c:3610 help.c:45 +#: command.c:3689 help.c:45 msgid "off" msgstr "désactivé" -#: command.c:3610 help.c:45 +#: command.c:3689 help.c:45 msgid "on" msgstr "activé" -#: command.c:3624 +#: command.c:3703 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "connexion chiffrée avec GSSAPI\n" -#: command.c:3644 +#: command.c:3723 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -482,259 +481,269 @@ msgstr "" " Voir la section « Notes aux utilisateurs de Windows » de la page\n" " référence de psql pour les détails.\n" -#: command.c:3749 +#: command.c:3828 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "la variable d'environnement PSQL_EDITOR_LINENUMBER_ARG doit être définie avec un numéro de ligne" -#: command.c:3778 +#: command.c:3857 #, c-format msgid "could not start editor \"%s\"" msgstr "n'a pas pu exécuter l'éditeur « %s »" -#: command.c:3780 +#: command.c:3859 #, c-format msgid "could not start /bin/sh" msgstr "n'a pas pu exécuter /bin/sh" -#: command.c:3830 +#: command.c:3909 #, c-format msgid "could not locate temporary directory: %s" msgstr "n'a pas pu localiser le répertoire temporaire : %s" -#: command.c:3857 +#: command.c:3936 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier temporaire « %s » : %m" -#: command.c:4193 +#: command.c:4272 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: abréviation ambigüe : « %s » correspond à « %s » comme à « %s »" -#: command.c:4213 +#: command.c:4292 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset : les formats autorisés sont aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:4232 +#: command.c:4311 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: les styles de lignes autorisés sont ascii, old-ascii, unicode" -#: command.c:4247 +#: command.c:4326 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset : les styles autorisés de ligne de bordure Unicode sont single, double" -#: command.c:4262 +#: command.c:4341 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset : les styles autorisés pour la ligne de colonne Unicode sont single, double" -#: command.c:4277 +#: command.c:4356 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset : les styles autorisés pour la ligne d'en-tête Unicode sont single, double" -#: command.c:4320 +#: command.c:4399 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep doit être un unique caractère d'un octet" -#: command.c:4325 +#: command.c:4404 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldsep ne peut pas être un guillemet, un retour à la ligne ou un retour chariot" -#: command.c:4462 command.c:4650 +#: command.c:4541 command.c:4729 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset : option inconnue : %s" -#: command.c:4482 +#: command.c:4561 #, c-format msgid "Border style is %d.\n" msgstr "Le style de bordure est %d.\n" -#: command.c:4488 +#: command.c:4567 #, c-format msgid "Target width is unset.\n" msgstr "La largeur cible n'est pas configuré.\n" -#: command.c:4490 +#: command.c:4569 #, c-format msgid "Target width is %d.\n" msgstr "La largeur cible est %d.\n" -#: command.c:4497 +#: command.c:4576 #, c-format msgid "Expanded display is on.\n" msgstr "Affichage étendu activé.\n" -#: command.c:4499 +#: command.c:4578 #, c-format msgid "Expanded display is used automatically.\n" msgstr "L'affichage étendu est utilisé automatiquement.\n" -#: command.c:4501 +#: command.c:4580 #, c-format msgid "Expanded display is off.\n" msgstr "Affichage étendu désactivé.\n" -#: command.c:4507 +#: command.c:4586 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Le séparateur de champs pour un CSV est « %s ».\n" -#: command.c:4515 command.c:4523 +#: command.c:4594 command.c:4602 #, c-format msgid "Field separator is zero byte.\n" msgstr "Le séparateur de champs est l'octet zéro.\n" -#: command.c:4517 +#: command.c:4596 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Le séparateur de champs est « %s ».\n" -#: command.c:4530 +#: command.c:4609 #, c-format msgid "Default footer is on.\n" msgstr "Le bas de page pas défaut est activé.\n" -#: command.c:4532 +#: command.c:4611 #, c-format msgid "Default footer is off.\n" msgstr "Le bas de page par défaut est désactivé.\n" -#: command.c:4538 +#: command.c:4617 #, c-format msgid "Output format is %s.\n" msgstr "Le format de sortie est %s.\n" -#: command.c:4544 +#: command.c:4623 #, c-format msgid "Line style is %s.\n" msgstr "Le style de ligne est %s.\n" -#: command.c:4551 +#: command.c:4630 #, c-format msgid "Null display is \"%s\".\n" msgstr "L'affichage de null est « %s ».\n" -#: command.c:4559 +#: command.c:4638 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "L'affichage de la sortie numérique adaptée à la locale est activé.\n" -#: command.c:4561 +#: command.c:4640 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "L'affichage de la sortie numérique adaptée à la locale est désactivé.\n" -#: command.c:4568 +#: command.c:4647 #, c-format msgid "Pager is used for long output.\n" msgstr "Le paginateur est utilisé pour les affichages longs.\n" -#: command.c:4570 +#: command.c:4649 #, c-format msgid "Pager is always used.\n" msgstr "Le paginateur est toujours utilisé.\n" -#: command.c:4572 +#: command.c:4651 #, c-format msgid "Pager usage is off.\n" msgstr "L'utilisation du paginateur est désactivé.\n" -#: command.c:4578 +#: command.c:4657 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" msgstr[0] "Le paginateur ne sera pas utilisé pour moins que %d ligne.\n" msgstr[1] "Le paginateur ne sera pas utilisé pour moins que %d lignes.\n" -#: command.c:4588 command.c:4598 +#: command.c:4667 command.c:4677 #, c-format msgid "Record separator is zero byte.\n" msgstr "Le séparateur d'enregistrements est l'octet zéro.\n" -#: command.c:4590 +#: command.c:4669 #, c-format msgid "Record separator is .\n" msgstr "Le séparateur d'enregistrement est .\n" -#: command.c:4592 +#: command.c:4671 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Le séparateur d'enregistrements est « %s ».\n" -#: command.c:4605 +#: command.c:4684 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Les attributs de la table sont « %s ».\n" -#: command.c:4608 +#: command.c:4687 #, c-format msgid "Table attributes unset.\n" msgstr "Les attributs de la table ne sont pas définis.\n" -#: command.c:4615 +#: command.c:4694 #, c-format msgid "Title is \"%s\".\n" msgstr "Le titre est « %s ».\n" -#: command.c:4617 +#: command.c:4696 #, c-format msgid "Title is unset.\n" msgstr "Le titre n'est pas défini.\n" -#: command.c:4624 +#: command.c:4703 #, c-format msgid "Tuples only is on.\n" msgstr "L'affichage des tuples seuls est activé.\n" -#: command.c:4626 +#: command.c:4705 #, c-format msgid "Tuples only is off.\n" msgstr "L'affichage des tuples seuls est désactivé.\n" -#: command.c:4632 +#: command.c:4711 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Le style de bordure Unicode est « %s ».\n" -#: command.c:4638 +#: command.c:4717 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Le style de ligne Unicode est « %s ».\n" -#: command.c:4644 +#: command.c:4723 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Le style d'en-tête Unicode est « %s ».\n" -#: command.c:4877 +#: command.c:4956 #, c-format msgid "\\!: failed" msgstr "\\! : échec" -#: command.c:4902 common.c:652 +#: command.c:4990 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch ne peut pas être utilisé avec une requête vide" -#: command.c:4943 +#: command.c:5022 +#, c-format +msgid "could not set timer: %m" +msgstr "n'a pas pu configurer le chronomètre : %m" + +#: command.c:5084 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (chaque %gs)\n" -#: command.c:4946 +#: command.c:5087 #, c-format msgid "%s (every %gs)\n" msgstr "%s (chaque %gs)\n" -#: command.c:5000 command.c:5007 common.c:552 common.c:559 common.c:1231 +#: command.c:5148 +#, c-format +msgid "could not wait for signals: %m" +msgstr "n'a pas pu attendre le signal : %m" + +#: command.c:5194 command.c:5201 common.c:568 common.c:575 common.c:1156 #, c-format msgid "" "********* QUERY **********\n" @@ -747,121 +756,111 @@ msgstr "" "**************************\n" "\n" -#: command.c:5199 +#: command.c:5380 #, c-format msgid "\"%s.%s\" is not a view" msgstr "« %s.%s » n'est pas une vue" -#: command.c:5215 +#: command.c:5396 #, c-format msgid "could not parse reloptions array" msgstr "n'a pas pu analyser le tableau reloptions" -#: common.c:159 +#: common.c:162 #, c-format msgid "cannot escape without active connection" msgstr "ne peut mettre entre guillemets sans connexion active" -#: common.c:200 +#: common.c:203 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "l'argument de la commande shell contient un retour à la ligne ou un retour chariot : « %s »" -#: common.c:304 +#: common.c:307 #, c-format msgid "connection to server was lost" msgstr "la connexion au serveur a été perdue" -#: common.c:308 +#: common.c:311 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "La connexion au serveur a été perdue. Tentative de réinitialisation : " -#: common.c:313 +#: common.c:316 #, c-format msgid "Failed.\n" msgstr "Échec.\n" -#: common.c:330 +#: common.c:333 #, c-format msgid "Succeeded.\n" msgstr "Succès.\n" -#: common.c:382 common.c:949 common.c:1166 +#: common.c:385 common.c:1054 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "PQresultStatus inattendu : %d" -#: common.c:491 +#: common.c:507 #, c-format msgid "Time: %.3f ms\n" msgstr "Temps : %.3f ms\n" -#: common.c:506 +#: common.c:522 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Durée : %.3f ms (%02d:%06.3f)\n" -#: common.c:515 +#: common.c:531 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Durée : %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:522 +#: common.c:538 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Durée : %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:546 common.c:604 common.c:1202 +#: common.c:562 common.c:619 common.c:1127 describe.c:6028 #, c-format msgid "You are currently not connected to a database." msgstr "Vous n'êtes pas connecté à une base de données." -#: common.c:659 -#, c-format -msgid "\\watch cannot be used with COPY" -msgstr "\\watch ne peut pas être utilisé avec COPY" - -#: common.c:664 -#, c-format -msgid "unexpected result status for \\watch" -msgstr "statut résultat inattendu pour \\watch" - -#: common.c:694 +#: common.c:650 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "" "Notification asynchrone « %s » reçue avec le contenu « %s » en provenance du\n" "processus serveur de PID %d.\n" -#: common.c:697 +#: common.c:653 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "" "Notification asynchrone « %s » reçue en provenance du processus serveur de\n" "PID %d.\n" -#: common.c:730 common.c:747 +#: common.c:686 common.c:705 #, c-format msgid "could not print result table: %m" msgstr "n'a pas pu imprimer la table résultante : %m" -#: common.c:768 +#: common.c:726 #, c-format msgid "no rows returned for \\gset" msgstr "aucune ligne retournée pour \\gset" -#: common.c:773 +#: common.c:731 #, c-format msgid "more than one row returned for \\gset" msgstr "plus d'une ligne retournée pour \\gset" -#: common.c:791 +#: common.c:749 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "tentative ignorée d'utilisation de \\gset dans une variable traitée spécialement « %s »" -#: common.c:1211 +#: common.c:1136 #, c-format msgid "" "***(Single step mode: verify command)*******************************************\n" @@ -872,37 +871,37 @@ msgstr "" "%s\n" "***(appuyez sur entrée pour l'exécuter ou tapez x puis entrée pour annuler)***\n" -#: common.c:1266 -#, c-format -msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." -msgstr "Le serveur (version %s) ne supporte pas les points de sauvegarde pour ON_ERROR_ROLLBACK." - -#: common.c:1329 +#: common.c:1219 #, c-format msgid "STATEMENT: %s" msgstr "INSTRUCTION : %s" -#: common.c:1373 +#: common.c:1255 #, c-format msgid "unexpected transaction status (%d)" msgstr "état de la transaction inattendu (%d)" -#: common.c:1514 describe.c:2179 +#: common.c:1396 describe.c:1986 msgid "Column" msgstr "Colonne" -#: common.c:1515 describe.c:178 describe.c:396 describe.c:414 describe.c:459 -#: describe.c:476 describe.c:1128 describe.c:1292 describe.c:1878 -#: describe.c:1902 describe.c:2180 describe.c:4048 describe.c:4271 -#: describe.c:4496 describe.c:5794 +#: common.c:1397 describe.c:167 describe.c:349 describe.c:367 describe.c:1012 +#: describe.c:1167 describe.c:1691 describe.c:1715 describe.c:1987 +#: describe.c:3850 describe.c:4059 describe.c:4290 describe.c:4446 +#: describe.c:5674 msgid "Type" msgstr "Type" -#: common.c:1564 +#: common.c:1446 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "La commande n'a pas de résultats ou le résultat n'a pas de colonnes.\n" +#: common.c:1599 +#, c-format +msgid "\\watch cannot be used with COPY" +msgstr "\\watch ne peut pas être utilisé avec COPY" + #: copy.c:98 #, c-format msgid "\\copy: arguments required" @@ -965,11 +964,11 @@ msgstr "" "Saisissez les données à copier suivies d'un saut de ligne.\n" "Terminez avec un antislash et un point seuls sur une ligne ou un signal EOF." -#: copy.c:671 +#: copy.c:684 msgid "aborted because of read failure" msgstr "annulé du fait d'une erreur de lecture" -#: copy.c:705 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "tente de sortir du mode copy" @@ -1018,1147 +1017,1153 @@ msgstr "\\crosstabview : nom de colonne ambigu : « %s »" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview : nom de colonne non trouvé : « %s »" -#: describe.c:76 describe.c:376 describe.c:728 describe.c:924 describe.c:1120 -#: describe.c:1281 describe.c:1353 describe.c:4036 describe.c:4258 -#: describe.c:4494 describe.c:4585 describe.c:4731 describe.c:4944 -#: describe.c:5104 describe.c:5345 describe.c:5420 describe.c:5431 -#: describe.c:5493 describe.c:5918 describe.c:6001 +#: describe.c:87 describe.c:329 describe.c:622 describe.c:796 describe.c:1004 +#: describe.c:1156 describe.c:1230 describe.c:3839 describe.c:4046 +#: describe.c:4288 describe.c:4367 describe.c:4596 describe.c:4798 +#: describe.c:5026 describe.c:5261 describe.c:5328 describe.c:5339 +#: describe.c:5393 describe.c:5782 describe.c:5857 msgid "Schema" msgstr "Schéma" -#: describe.c:77 describe.c:175 describe.c:243 describe.c:251 describe.c:377 -#: describe.c:729 describe.c:925 describe.c:1038 describe.c:1121 -#: describe.c:1354 describe.c:4037 describe.c:4259 describe.c:4417 -#: describe.c:4495 describe.c:4586 describe.c:4665 describe.c:4732 -#: describe.c:4945 describe.c:5029 describe.c:5105 describe.c:5346 -#: describe.c:5421 describe.c:5432 describe.c:5494 describe.c:5691 -#: describe.c:5775 describe.c:5999 describe.c:6171 describe.c:6411 +#: describe.c:88 describe.c:164 describe.c:223 describe.c:330 describe.c:623 +#: describe.c:797 describe.c:916 describe.c:1005 describe.c:1231 +#: describe.c:3840 describe.c:4047 describe.c:4209 describe.c:4289 +#: describe.c:4368 describe.c:4528 describe.c:4597 describe.c:4799 +#: describe.c:4896 describe.c:5027 describe.c:5262 describe.c:5329 +#: describe.c:5340 describe.c:5394 describe.c:5587 describe.c:5655 +#: describe.c:5855 describe.c:6074 describe.c:6376 msgid "Name" msgstr "Nom" -#: describe.c:78 describe.c:389 describe.c:407 describe.c:453 describe.c:470 +#: describe.c:89 describe.c:342 describe.c:360 msgid "Result data type" msgstr "Type de données du résultat" -#: describe.c:86 describe.c:99 describe.c:103 describe.c:390 describe.c:408 -#: describe.c:454 describe.c:471 +#: describe.c:90 describe.c:343 describe.c:361 msgid "Argument data types" msgstr "Type de données des paramètres" -#: describe.c:111 describe.c:118 describe.c:186 describe.c:274 describe.c:523 -#: describe.c:777 describe.c:940 describe.c:1063 describe.c:1356 -#: describe.c:2200 describe.c:3823 describe.c:4108 describe.c:4305 -#: describe.c:4448 describe.c:4522 describe.c:4595 describe.c:4678 -#: describe.c:4853 describe.c:4972 describe.c:5038 describe.c:5106 -#: describe.c:5247 describe.c:5289 describe.c:5362 describe.c:5424 -#: describe.c:5433 describe.c:5495 describe.c:5717 describe.c:5797 -#: describe.c:5932 describe.c:6002 large_obj.c:290 large_obj.c:300 +#: describe.c:98 describe.c:105 describe.c:175 describe.c:237 describe.c:414 +#: describe.c:654 describe.c:812 describe.c:945 describe.c:1233 describe.c:2007 +#: describe.c:3639 describe.c:3894 describe.c:4093 describe.c:4233 +#: describe.c:4302 describe.c:4377 describe.c:4541 describe.c:4713 +#: describe.c:4835 describe.c:4905 describe.c:5028 describe.c:5173 +#: describe.c:5215 describe.c:5278 describe.c:5332 describe.c:5341 +#: describe.c:5395 describe.c:5605 describe.c:5677 describe.c:5796 +#: describe.c:5858 describe.c:6847 msgid "Description" msgstr "Description" -#: describe.c:136 +#: describe.c:125 msgid "List of aggregate functions" msgstr "Liste des fonctions d'agrégation" -#: describe.c:161 +#: describe.c:150 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Le serveur (version %s) ne supporte pas les méthodes d'accès." -#: describe.c:176 +#: describe.c:165 msgid "Index" msgstr "Index" -#: describe.c:177 describe.c:4056 describe.c:4284 describe.c:5919 +#: describe.c:166 describe.c:3858 describe.c:4072 describe.c:5783 msgid "Table" msgstr "Table" -#: describe.c:185 describe.c:5696 +#: describe.c:174 describe.c:5589 msgid "Handler" msgstr "Gestionnaire" -#: describe.c:204 +#: describe.c:195 msgid "List of access methods" msgstr "Liste des méthodes d'accès" -#: describe.c:230 -#, c-format -msgid "The server (version %s) does not support tablespaces." -msgstr "Le serveur (version %s) ne supporte pas les tablespaces." - -#: describe.c:244 describe.c:252 describe.c:504 describe.c:767 describe.c:1039 -#: describe.c:1280 describe.c:4049 describe.c:4260 describe.c:4421 -#: describe.c:4667 describe.c:5030 describe.c:5692 describe.c:5776 -#: describe.c:6172 describe.c:6309 describe.c:6412 describe.c:6535 -#: describe.c:6613 large_obj.c:289 +#: describe.c:224 describe.c:395 describe.c:647 describe.c:917 describe.c:1155 +#: describe.c:3851 describe.c:4048 describe.c:4210 describe.c:4530 +#: describe.c:4897 describe.c:5588 describe.c:5656 describe.c:6075 +#: describe.c:6257 describe.c:6377 describe.c:6511 describe.c:6593 +#: describe.c:6835 msgid "Owner" msgstr "Propriétaire" -#: describe.c:245 describe.c:253 +#: describe.c:225 msgid "Location" msgstr "Emplacement" -#: describe.c:264 describe.c:3639 +#: describe.c:235 describe.c:3475 msgid "Options" msgstr "Options" -#: describe.c:269 describe.c:740 describe.c:1055 describe.c:4100 -#: describe.c:4104 +#: describe.c:236 describe.c:645 describe.c:943 describe.c:3893 msgid "Size" msgstr "Taille" -#: describe.c:291 +#: describe.c:257 msgid "List of tablespaces" msgstr "Liste des tablespaces" -#: describe.c:336 +#: describe.c:302 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df ne prend que [anptwS+] comme options" -#: describe.c:344 describe.c:355 +#: describe.c:310 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df ne prend pas d'option « %c » pour un serveur en version %s" #. translator: "agg" is short for "aggregate" -#: describe.c:392 describe.c:410 describe.c:456 describe.c:473 +#: describe.c:345 describe.c:363 msgid "agg" msgstr "agg" -#: describe.c:393 describe.c:411 +#: describe.c:346 describe.c:364 msgid "window" msgstr "window" -#: describe.c:394 +#: describe.c:347 msgid "proc" msgstr "proc" -#: describe.c:395 describe.c:413 describe.c:458 describe.c:475 +#: describe.c:348 describe.c:366 msgid "func" msgstr "func" -#: describe.c:412 describe.c:457 describe.c:474 describe.c:1490 +#: describe.c:365 describe.c:1363 msgid "trigger" msgstr "trigger" -#: describe.c:486 +#: describe.c:377 msgid "immutable" msgstr "immutable" -#: describe.c:487 +#: describe.c:378 msgid "stable" msgstr "stable" -#: describe.c:488 +#: describe.c:379 msgid "volatile" msgstr "volatile" -#: describe.c:489 +#: describe.c:380 msgid "Volatility" msgstr "Volatibilité" -#: describe.c:497 +#: describe.c:388 msgid "restricted" msgstr "restricted" -#: describe.c:498 +#: describe.c:389 msgid "safe" msgstr "safe" -#: describe.c:499 +#: describe.c:390 msgid "unsafe" msgstr "unsafe" -#: describe.c:500 +#: describe.c:391 msgid "Parallel" msgstr "Parallèle" -#: describe.c:505 +#: describe.c:396 msgid "definer" msgstr "definer" -#: describe.c:506 +#: describe.c:397 msgid "invoker" msgstr "invoker" -#: describe.c:507 +#: describe.c:398 msgid "Security" msgstr "Sécurité" -#: describe.c:512 +#: describe.c:403 msgid "Language" msgstr "Langage" -#: describe.c:516 describe.c:520 +#: describe.c:407 describe.c:411 msgid "Source code" msgstr "Code source" -#: describe.c:691 +#: describe.c:585 msgid "List of functions" msgstr "Liste des fonctions" -#: describe.c:739 +#: describe.c:644 msgid "Internal name" msgstr "Nom interne" -#: describe.c:761 +#: describe.c:646 msgid "Elements" msgstr "Éléments" -#: describe.c:822 +#: describe.c:695 msgid "List of data types" msgstr "Liste des types de données" -#: describe.c:926 +#: describe.c:798 msgid "Left arg type" msgstr "Type de l'arg. gauche" -#: describe.c:927 +#: describe.c:799 msgid "Right arg type" msgstr "Type de l'arg. droit" -#: describe.c:928 +#: describe.c:800 msgid "Result type" msgstr "Type du résultat" -#: describe.c:933 describe.c:4673 describe.c:4830 describe.c:4836 -#: describe.c:5246 describe.c:6784 describe.c:6788 +#: describe.c:805 describe.c:4536 describe.c:4696 describe.c:5172 +#: describe.c:6772 describe.c:6776 msgid "Function" msgstr "Fonction" -#: describe.c:1010 +#: describe.c:886 msgid "List of operators" msgstr "Liste des opérateurs" -#: describe.c:1040 +#: describe.c:918 msgid "Encoding" msgstr "Encodage" -#: describe.c:1045 describe.c:4946 +#: describe.c:919 describe.c:4800 msgid "Collate" msgstr "Collationnement" -#: describe.c:1046 describe.c:4947 +#: describe.c:920 describe.c:4801 msgid "Ctype" msgstr "Type caract." -#: describe.c:1059 +#: describe.c:925 describe.c:931 describe.c:4806 describe.c:4810 +msgid "ICU Locale" +msgstr "Locale ICU" + +#: describe.c:926 describe.c:932 +msgid "Locale Provider" +msgstr "Fournisseur de locale" + +#: describe.c:944 msgid "Tablespace" msgstr "Tablespace" -#: describe.c:1081 +#: describe.c:965 msgid "List of databases" msgstr "Liste des bases de données" -#: describe.c:1122 describe.c:1283 describe.c:4038 +#: describe.c:1006 describe.c:1158 describe.c:3841 msgid "table" msgstr "table" -#: describe.c:1123 describe.c:4039 +#: describe.c:1007 describe.c:3842 msgid "view" msgstr "vue" -#: describe.c:1124 describe.c:4040 +#: describe.c:1008 describe.c:3843 msgid "materialized view" msgstr "vue matérialisée" -#: describe.c:1125 describe.c:1285 describe.c:4042 +#: describe.c:1009 describe.c:1160 describe.c:3845 msgid "sequence" msgstr "séquence" -#: describe.c:1126 describe.c:4045 +#: describe.c:1010 describe.c:3847 msgid "foreign table" msgstr "table distante" -#: describe.c:1127 describe.c:4046 describe.c:4269 +#: describe.c:1011 describe.c:3848 describe.c:4057 msgid "partitioned table" msgstr "table partitionnée" -#: describe.c:1139 +#: describe.c:1022 msgid "Column privileges" msgstr "Droits d'accès à la colonne" -#: describe.c:1170 describe.c:1204 +#: describe.c:1053 describe.c:1087 msgid "Policies" msgstr "Politiques" -#: describe.c:1236 describe.c:6476 describe.c:6480 +#: describe.c:1121 describe.c:4452 describe.c:6456 msgid "Access privileges" msgstr "Droits d'accès" -#: describe.c:1267 -#, c-format -msgid "The server (version %s) does not support altering default privileges." -msgstr "Le serveur (version %s) ne supporte pas la modification des droits par défaut." - -#: describe.c:1287 +#: describe.c:1162 msgid "function" msgstr "fonction" -#: describe.c:1289 +#: describe.c:1164 msgid "type" msgstr "type" -#: describe.c:1291 +#: describe.c:1166 msgid "schema" msgstr "schéma" -#: describe.c:1315 +#: describe.c:1192 msgid "Default access privileges" msgstr "Droits d'accès par défaut" -#: describe.c:1355 +#: describe.c:1232 msgid "Object" msgstr "Objet" -#: describe.c:1369 +#: describe.c:1246 msgid "table constraint" msgstr "contrainte de table" -#: describe.c:1391 +#: describe.c:1270 msgid "domain constraint" msgstr "contrainte de domaine" -#: describe.c:1419 +#: describe.c:1294 msgid "operator class" msgstr "classe d'opérateur" -#: describe.c:1448 +#: describe.c:1318 msgid "operator family" msgstr "famille d'opérateur" -#: describe.c:1470 +#: describe.c:1341 msgid "rule" msgstr "règle" -#: describe.c:1512 +#: describe.c:1387 msgid "Object descriptions" msgstr "Descriptions des objets" -#: describe.c:1568 describe.c:4175 +#: describe.c:1445 describe.c:3963 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Aucune relation nommée « %s » n'a été trouvée." -#: describe.c:1571 describe.c:4178 +#: describe.c:1448 describe.c:3966 #, c-format msgid "Did not find any relations." msgstr "Aucune relation n'a été trouvée." -#: describe.c:1827 +#: describe.c:1644 #, c-format msgid "Did not find any relation with OID %s." msgstr "Aucune relation avec l'OID « %s » n'a été trouvée." -#: describe.c:1879 describe.c:1903 +#: describe.c:1692 describe.c:1716 msgid "Start" msgstr "Début" -#: describe.c:1880 describe.c:1904 +#: describe.c:1693 describe.c:1717 msgid "Minimum" msgstr "Minimum" -#: describe.c:1881 describe.c:1905 +#: describe.c:1694 describe.c:1718 msgid "Maximum" msgstr "Maximum" -#: describe.c:1882 describe.c:1906 +#: describe.c:1695 describe.c:1719 msgid "Increment" msgstr "Incrément" -#: describe.c:1883 describe.c:1907 describe.c:2038 describe.c:4589 -#: describe.c:4847 describe.c:4961 describe.c:4966 describe.c:6523 +#: describe.c:1696 describe.c:1720 describe.c:1850 describe.c:4371 +#: describe.c:4707 describe.c:4824 describe.c:4829 describe.c:6499 msgid "yes" msgstr "oui" -#: describe.c:1884 describe.c:1908 describe.c:2039 describe.c:4589 -#: describe.c:4844 describe.c:4961 describe.c:6524 +#: describe.c:1697 describe.c:1721 describe.c:1851 describe.c:4371 +#: describe.c:4704 describe.c:4824 describe.c:6500 msgid "no" msgstr "non" -#: describe.c:1885 describe.c:1909 +#: describe.c:1698 describe.c:1722 msgid "Cycles?" msgstr "Cycles ?" -#: describe.c:1886 describe.c:1910 +#: describe.c:1699 describe.c:1723 msgid "Cache" msgstr "Cache" -#: describe.c:1953 +#: describe.c:1764 #, c-format msgid "Owned by: %s" msgstr "Propriétaire : %s" -#: describe.c:1957 +#: describe.c:1768 #, c-format msgid "Sequence for identity column: %s" msgstr "Séquence pour la colonne d'identité : %s" -#: describe.c:1964 +#: describe.c:1776 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "Séquence non journalisée « %s.%s »" + +#: describe.c:1779 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Séquence « %s.%s »" -#: describe.c:2111 +#: describe.c:1923 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Table non tracée « %s.%s »" -#: describe.c:2114 +#: describe.c:1926 #, c-format msgid "Table \"%s.%s\"" msgstr "Table « %s.%s »" -#: describe.c:2118 +#: describe.c:1930 #, c-format msgid "View \"%s.%s\"" msgstr "Vue « %s.%s »" -#: describe.c:2123 +#: describe.c:1935 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Vue matérialisée non journalisée « %s.%s »" -#: describe.c:2126 +#: describe.c:1938 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Vue matérialisée « %s.%s »" -#: describe.c:2131 +#: describe.c:1943 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Index non tracé « %s.%s »" -#: describe.c:2134 +#: describe.c:1946 #, c-format msgid "Index \"%s.%s\"" msgstr "Index « %s.%s »" -#: describe.c:2139 +#: describe.c:1951 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Index partitionné non journalisé « %s.%s »" -#: describe.c:2142 +#: describe.c:1954 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Index partitionné « %s.%s »" -#: describe.c:2147 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "Relation spéciale « %s.%s »" - -#: describe.c:2151 +#: describe.c:1958 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "Table TOAST « %s.%s »" -#: describe.c:2155 +#: describe.c:1962 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Type composé « %s.%s »" -#: describe.c:2159 +#: describe.c:1966 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Table distante « %s.%s »" -#: describe.c:2164 +#: describe.c:1971 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Table non journalisée « %s.%s »" -#: describe.c:2167 +#: describe.c:1974 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Table partitionnée « %s.%s »" -#: describe.c:2183 describe.c:4502 +#: describe.c:1990 describe.c:4291 msgid "Collation" msgstr "Collationnement" -#: describe.c:2184 describe.c:4509 +#: describe.c:1991 describe.c:4292 msgid "Nullable" msgstr "NULL-able" -#: describe.c:2185 describe.c:4510 +#: describe.c:1992 describe.c:4293 msgid "Default" msgstr "Par défaut" -#: describe.c:2188 +#: describe.c:1995 msgid "Key?" msgstr "Clé ?" -#: describe.c:2190 describe.c:4739 describe.c:4750 +#: describe.c:1997 describe.c:4604 describe.c:4615 msgid "Definition" msgstr "Définition" -#: describe.c:2192 describe.c:5712 describe.c:5796 describe.c:5867 -#: describe.c:5931 +#: describe.c:1999 describe.c:5604 describe.c:5676 describe.c:5739 +#: describe.c:5795 msgid "FDW options" msgstr "Options FDW" -#: describe.c:2194 +#: describe.c:2001 msgid "Storage" msgstr "Stockage" -#: describe.c:2196 +#: describe.c:2003 msgid "Compression" msgstr "Compression" -#: describe.c:2198 +#: describe.c:2005 msgid "Stats target" msgstr "Cible de statistiques" -#: describe.c:2334 +#: describe.c:2141 #, c-format msgid "Partition of: %s %s%s" msgstr "Partition de : %s %s%s" -#: describe.c:2347 +#: describe.c:2154 msgid "No partition constraint" msgstr "Aucune contrainte de partition" -#: describe.c:2349 +#: describe.c:2156 #, c-format msgid "Partition constraint: %s" msgstr "Contrainte de partition : %s" -#: describe.c:2373 +#: describe.c:2180 #, c-format msgid "Partition key: %s" msgstr "Clé de partition : %s" -#: describe.c:2399 +#: describe.c:2206 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Table propriétaire : « %s.%s »" -#: describe.c:2470 +#: describe.c:2275 msgid "primary key, " msgstr "clé primaire, " -#: describe.c:2472 -msgid "unique, " -msgstr "unique, " +#: describe.c:2278 +msgid "unique" +msgstr "unique" -#: describe.c:2478 +#: describe.c:2280 +msgid " nulls not distinct" +msgstr " nulls non distincts" + +#: describe.c:2281 +msgid ", " +msgstr " , " + +#: describe.c:2288 #, c-format msgid "for table \"%s.%s\"" msgstr "pour la table « %s.%s »" -#: describe.c:2482 +#: describe.c:2292 #, c-format msgid ", predicate (%s)" msgstr ", prédicat (%s)" -#: describe.c:2485 +#: describe.c:2295 msgid ", clustered" msgstr ", en cluster" -#: describe.c:2488 +#: describe.c:2298 msgid ", invalid" msgstr ", invalide" -#: describe.c:2491 +#: describe.c:2301 msgid ", deferrable" msgstr ", déferrable" -#: describe.c:2494 +#: describe.c:2304 msgid ", initially deferred" msgstr ", initialement déferré" -#: describe.c:2497 +#: describe.c:2307 msgid ", replica identity" msgstr ", identité réplica" -#: describe.c:2564 +#: describe.c:2361 msgid "Indexes:" msgstr "Index :" -#: describe.c:2648 +#: describe.c:2444 msgid "Check constraints:" msgstr "Contraintes de vérification :" -#: describe.c:2716 +#: describe.c:2512 msgid "Foreign-key constraints:" msgstr "Contraintes de clés étrangères :" -#: describe.c:2779 +#: describe.c:2575 msgid "Referenced by:" msgstr "Référencé par :" -#: describe.c:2829 +#: describe.c:2625 msgid "Policies:" msgstr "Politiques :" -#: describe.c:2832 +#: describe.c:2628 msgid "Policies (forced row security enabled):" msgstr "Politiques (mode sécurité de ligne activé en forcé) :" -#: describe.c:2835 +#: describe.c:2631 msgid "Policies (row security enabled): (none)" msgstr "Politiques (mode sécurité de ligne activé) : (aucune)" -#: describe.c:2838 +#: describe.c:2634 msgid "Policies (forced row security enabled): (none)" msgstr "Politiques (mode sécurité de ligne activé en forcé) : (aucune)" -#: describe.c:2841 +#: describe.c:2637 msgid "Policies (row security disabled):" msgstr "Politiques (mode sécurité de ligne désactivé) :" -#: describe.c:2902 describe.c:3006 +#: describe.c:2697 describe.c:2801 msgid "Statistics objects:" msgstr "Objets statistiques :" -#: describe.c:3120 describe.c:3224 +#: describe.c:2903 describe.c:3056 msgid "Rules:" msgstr "Règles :" -#: describe.c:3123 +#: describe.c:2906 msgid "Disabled rules:" msgstr "Règles désactivées :" -#: describe.c:3126 +#: describe.c:2909 msgid "Rules firing always:" msgstr "Règles toujous activées :" -#: describe.c:3129 +#: describe.c:2912 msgid "Rules firing on replica only:" msgstr "Règles activées uniquement sur le réplica :" -#: describe.c:3169 +#: describe.c:2991 describe.c:4965 msgid "Publications:" msgstr "Publications :" -#: describe.c:3207 +#: describe.c:3039 msgid "View definition:" msgstr "Définition de la vue :" -#: describe.c:3354 +#: describe.c:3202 msgid "Triggers:" msgstr "Triggers :" -#: describe.c:3358 +#: describe.c:3205 msgid "Disabled user triggers:" msgstr "Triggers utilisateurs désactivés :" -#: describe.c:3360 -msgid "Disabled triggers:" -msgstr "Triggers désactivés :" - -#: describe.c:3363 +#: describe.c:3208 msgid "Disabled internal triggers:" msgstr "Triggers internes désactivés :" -#: describe.c:3366 +#: describe.c:3211 msgid "Triggers firing always:" msgstr "Triggers toujours activés :" -#: describe.c:3369 +#: describe.c:3214 msgid "Triggers firing on replica only:" msgstr "Triggers activés uniquement sur le réplica :" -#: describe.c:3441 +#: describe.c:3285 #, c-format msgid "Server: %s" msgstr "Serveur : %s" -#: describe.c:3449 +#: describe.c:3293 #, c-format msgid "FDW options: (%s)" msgstr "Options FDW : (%s)" -#: describe.c:3470 +#: describe.c:3314 msgid "Inherits" msgstr "Hérite de" -#: describe.c:3543 +#: describe.c:3379 #, c-format msgid "Number of partitions: %d" msgstr "Nombre de partitions : %d" -#: describe.c:3552 +#: describe.c:3388 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Nombre de partitions : %d (utilisez \\d+ pour les lister)" -#: describe.c:3554 +#: describe.c:3390 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Nombre de tables enfants : %d (utilisez \\d+ pour les lister)" -#: describe.c:3561 +#: describe.c:3397 msgid "Child tables" msgstr "Tables enfant" -#: describe.c:3561 +#: describe.c:3397 msgid "Partitions" msgstr "Partitions" -#: describe.c:3592 +#: describe.c:3428 #, c-format msgid "Typed table of type: %s" msgstr "Table de type : %s" -#: describe.c:3608 +#: describe.c:3444 msgid "Replica Identity" msgstr "Identité de réplicat" -#: describe.c:3621 +#: describe.c:3457 msgid "Has OIDs: yes" msgstr "Contient des OID : oui" -#: describe.c:3630 +#: describe.c:3466 #, c-format msgid "Access method: %s" msgstr "Méthode d'accès : %s" -#: describe.c:3710 +#: describe.c:3545 #, c-format msgid "Tablespace: \"%s\"" msgstr "Tablespace : « %s »" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3722 +#: describe.c:3557 #, c-format msgid ", tablespace \"%s\"" msgstr ", tablespace « %s »" -#: describe.c:3815 +#: describe.c:3631 msgid "List of roles" msgstr "Liste des rôles" -#: describe.c:3817 +#: describe.c:3633 msgid "Role name" msgstr "Nom du rôle" -#: describe.c:3818 +#: describe.c:3634 msgid "Attributes" msgstr "Attributs" -#: describe.c:3820 +#: describe.c:3636 msgid "Member of" msgstr "Membre de" -#: describe.c:3831 +#: describe.c:3647 msgid "Superuser" msgstr "Superutilisateur" -#: describe.c:3834 +#: describe.c:3650 msgid "No inheritance" msgstr "Pas d'héritage" -#: describe.c:3837 +#: describe.c:3653 msgid "Create role" msgstr "Créer un rôle" -#: describe.c:3840 +#: describe.c:3656 msgid "Create DB" msgstr "Créer une base" -#: describe.c:3843 +#: describe.c:3659 msgid "Cannot login" msgstr "Ne peut pas se connecter" -#: describe.c:3847 +#: describe.c:3662 msgid "Replication" msgstr "Réplication" -#: describe.c:3851 +#: describe.c:3666 msgid "Bypass RLS" msgstr "Contournement RLS" -#: describe.c:3860 +#: describe.c:3675 msgid "No connections" msgstr "Sans connexions" -#: describe.c:3862 +#: describe.c:3677 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d connexion" msgstr[1] "%d connexions" -#: describe.c:3872 +#: describe.c:3687 msgid "Password valid until " msgstr "Mot de passe valide jusqu'à " -#: describe.c:3922 -#, c-format -msgid "The server (version %s) does not support per-database role settings." -msgstr "Le serveur (version %s) ne supporte pas les paramètres de rôles par bases de données." - -#: describe.c:3935 +#: describe.c:3740 msgid "Role" msgstr "Rôle" -#: describe.c:3936 +#: describe.c:3741 msgid "Database" msgstr "Base de données" -#: describe.c:3937 +#: describe.c:3742 msgid "Settings" msgstr "Réglages" -#: describe.c:3958 +#: describe.c:3766 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Aucune configuration pour le rôle « %s » et la base de données « %s » n'a été trouvée." -#: describe.c:3961 +#: describe.c:3769 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Aucune configuration pour le rôle « %s » n'a été trouvée." -#: describe.c:3964 +#: describe.c:3772 #, c-format msgid "Did not find any settings." msgstr "Aucune configuration n'a été trouvée." -#: describe.c:3969 +#: describe.c:3777 msgid "List of settings" msgstr "Liste des paramètres" -#: describe.c:4041 +#: describe.c:3844 msgid "index" msgstr "index" -#: describe.c:4043 -msgid "special" -msgstr "spécial" - -#: describe.c:4044 +#: describe.c:3846 msgid "TOAST table" msgstr "Table TOAST" -#: describe.c:4047 describe.c:4270 +#: describe.c:3849 describe.c:4058 msgid "partitioned index" msgstr "index partitionné" -#: describe.c:4071 +#: describe.c:3869 msgid "permanent" msgstr "permanent" -#: describe.c:4072 +#: describe.c:3870 msgid "temporary" msgstr "temporaire" -#: describe.c:4073 +#: describe.c:3871 msgid "unlogged" msgstr "non journalisé" -#: describe.c:4074 +#: describe.c:3872 msgid "Persistence" msgstr "Persistence" -#: describe.c:4091 +#: describe.c:3888 msgid "Access method" msgstr "Méthode d'accès" -#: describe.c:4183 +#: describe.c:3971 msgid "List of relations" msgstr "Liste des relations" -#: describe.c:4231 +#: describe.c:4019 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "Le serveur (version %s) ne supporte pas le partitionnement déclaratif des tables." -#: describe.c:4242 +#: describe.c:4030 msgid "List of partitioned indexes" msgstr "Liste des index partitionnés" -#: describe.c:4244 +#: describe.c:4032 msgid "List of partitioned tables" msgstr "Liste des tables partitionnées" -#: describe.c:4248 +#: describe.c:4036 msgid "List of partitioned relations" msgstr "Liste des relations partitionnées" -#: describe.c:4279 +#: describe.c:4067 msgid "Parent name" msgstr "Nom du parent" -#: describe.c:4292 +#: describe.c:4080 msgid "Leaf partition size" msgstr "Taille de la partition de dernier niveau" -#: describe.c:4295 describe.c:4301 +#: describe.c:4083 describe.c:4089 msgid "Total size" msgstr "Taille totale" -#: describe.c:4425 +#: describe.c:4211 msgid "Trusted" msgstr "De confiance" -#: describe.c:4433 +#: describe.c:4220 msgid "Internal language" msgstr "Langage interne" -#: describe.c:4434 +#: describe.c:4221 msgid "Call handler" msgstr "Gestionnaire d'appel" -#: describe.c:4435 describe.c:5699 +#: describe.c:4222 describe.c:5590 msgid "Validator" msgstr "Validateur" -#: describe.c:4438 +#: describe.c:4223 msgid "Inline handler" msgstr "Gestionnaire en ligne" -#: describe.c:4466 +#: describe.c:4253 msgid "List of languages" msgstr "Liste des langages" -#: describe.c:4511 +#: describe.c:4294 msgid "Check" msgstr "Vérification" -#: describe.c:4553 +#: describe.c:4335 msgid "List of domains" msgstr "Liste des domaines" -#: describe.c:4587 +#: describe.c:4369 msgid "Source" msgstr "Source" -#: describe.c:4588 +#: describe.c:4370 msgid "Destination" msgstr "Destination" -#: describe.c:4590 describe.c:6525 +#: describe.c:4372 describe.c:6501 msgid "Default?" msgstr "Par défaut ?" -#: describe.c:4627 +#: describe.c:4411 msgid "List of conversions" msgstr "Liste des conversions" -#: describe.c:4666 +#: describe.c:4439 +msgid "Parameter" +msgstr "Paramètre" + +#: describe.c:4440 +msgid "Value" +msgstr "Valeur" + +#: describe.c:4447 +msgid "Context" +msgstr "Contexte" + +#: describe.c:4480 +msgid "List of configuration parameters" +msgstr "Liste des paramètres de configuration" + +#: describe.c:4482 +msgid "List of non-default configuration parameters" +msgstr "Liste des paramètres de configuration à valeur personnalisée" + +#: describe.c:4509 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "Le serveur (version %s) ne supporte pas les triggers d'événement." + +#: describe.c:4529 msgid "Event" msgstr "Événement" -#: describe.c:4668 +#: describe.c:4531 msgid "enabled" msgstr "activé" -#: describe.c:4669 +#: describe.c:4532 msgid "replica" msgstr "réplicat" -#: describe.c:4670 +#: describe.c:4533 msgid "always" msgstr "toujours" -#: describe.c:4671 +#: describe.c:4534 msgid "disabled" msgstr "désactivé" -#: describe.c:4672 describe.c:6413 +#: describe.c:4535 describe.c:6378 msgid "Enabled" msgstr "Activé" -#: describe.c:4674 +#: describe.c:4537 msgid "Tags" msgstr "Tags" -#: describe.c:4693 +#: describe.c:4558 msgid "List of event triggers" msgstr "Liste des triggers sur évènement" -#: describe.c:4720 +#: describe.c:4585 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Le serveur (version %s) ne supporte pas les statistiques étendues." -#: describe.c:4757 +#: describe.c:4622 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4758 +#: describe.c:4623 msgid "Dependencies" msgstr "Dépendances" -#: describe.c:4768 +#: describe.c:4633 msgid "MCV" msgstr "MCV" -#: describe.c:4787 +#: describe.c:4654 msgid "List of extended statistics" msgstr "Liste des statistiques étendues" -#: describe.c:4814 +#: describe.c:4681 msgid "Source type" msgstr "Type source" -#: describe.c:4815 +#: describe.c:4682 msgid "Target type" msgstr "Type cible" -#: describe.c:4846 +#: describe.c:4706 msgid "in assignment" msgstr "assigné" -#: describe.c:4848 +#: describe.c:4708 msgid "Implicit?" msgstr "Implicite ?" -#: describe.c:4903 +#: describe.c:4767 msgid "List of casts" msgstr "Liste des conversions explicites" -#: describe.c:4931 -#, c-format -msgid "The server (version %s) does not support collations." -msgstr "Le serveur (version %s) ne supporte pas les collationnements." - -#: describe.c:4952 describe.c:4956 +#: describe.c:4815 describe.c:4819 msgid "Provider" msgstr "Fournisseur" -#: describe.c:4962 describe.c:4967 +#: describe.c:4825 describe.c:4830 msgid "Deterministic?" msgstr "Déterministe ?" -#: describe.c:5002 +#: describe.c:4867 msgid "List of collations" msgstr "Liste des collationnements" -#: describe.c:5061 +#: describe.c:4932 msgid "List of schemas" msgstr "Liste des schémas" -#: describe.c:5086 describe.c:5333 describe.c:5404 describe.c:5475 -#, c-format -msgid "The server (version %s) does not support full text search." -msgstr "Le serveur (version %s) ne supporte pas la recherche plein texte." - -#: describe.c:5121 +#: describe.c:5045 msgid "List of text search parsers" msgstr "Liste des analyseurs de la recherche de texte" -#: describe.c:5166 +#: describe.c:5092 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Aucun analyseur de la recherche de texte nommé « %s » n'a été trouvé." -#: describe.c:5169 +#: describe.c:5095 #, c-format msgid "Did not find any text search parsers." msgstr "Aucun analyseur de recherche de texte n'a été trouvé." -#: describe.c:5244 +#: describe.c:5170 msgid "Start parse" msgstr "Début de l'analyse" -#: describe.c:5245 +#: describe.c:5171 msgid "Method" msgstr "Méthode" -#: describe.c:5249 +#: describe.c:5175 msgid "Get next token" msgstr "Obtenir le prochain jeton" -#: describe.c:5251 +#: describe.c:5177 msgid "End parse" msgstr "Fin de l'analyse" -#: describe.c:5253 +#: describe.c:5179 msgid "Get headline" msgstr "Obtenir l'en-tête" -#: describe.c:5255 +#: describe.c:5181 msgid "Get token types" msgstr "Obtenir les types de jeton" -#: describe.c:5266 +#: describe.c:5192 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Analyseur « %s.%s » de la recherche de texte" -#: describe.c:5269 +#: describe.c:5195 #, c-format msgid "Text search parser \"%s\"" msgstr "Analyseur « %s » de la recherche de texte" -#: describe.c:5288 +#: describe.c:5214 msgid "Token name" msgstr "Nom du jeton" -#: describe.c:5299 +#: describe.c:5225 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Types de jeton pour l'analyseur « %s.%s »" -#: describe.c:5302 +#: describe.c:5228 #, c-format msgid "Token types for parser \"%s\"" msgstr "Types de jeton pour l'analyseur « %s »" -#: describe.c:5356 +#: describe.c:5272 msgid "Template" msgstr "Modèle" -#: describe.c:5357 +#: describe.c:5273 msgid "Init options" msgstr "Options d'initialisation" -#: describe.c:5379 +#: describe.c:5297 msgid "List of text search dictionaries" msgstr "Liste des dictionnaires de la recherche de texte" -#: describe.c:5422 +#: describe.c:5330 msgid "Init" msgstr "Initialisation" -#: describe.c:5423 +#: describe.c:5331 msgid "Lexize" msgstr "Lexize" -#: describe.c:5450 +#: describe.c:5360 msgid "List of text search templates" msgstr "Liste des modèles de la recherche de texte" -#: describe.c:5510 +#: describe.c:5412 msgid "List of text search configurations" msgstr "Liste des configurations de la recherche de texte" -#: describe.c:5556 +#: describe.c:5460 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Aucune configuration de la recherche de texte nommée « %s » n'a été trouvée." -#: describe.c:5559 +#: describe.c:5463 #, c-format msgid "Did not find any text search configurations." msgstr "Aucune configuration de recherche de texte n'a été trouvée." -#: describe.c:5625 +#: describe.c:5529 msgid "Token" msgstr "Jeton" -#: describe.c:5626 +#: describe.c:5530 msgid "Dictionaries" msgstr "Dictionnaires" -#: describe.c:5637 +#: describe.c:5541 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Configuration « %s.%s » de la recherche de texte" -#: describe.c:5640 +#: describe.c:5544 #, c-format msgid "Text search configuration \"%s\"" msgstr "Configuration « %s » de la recherche de texte" -#: describe.c:5644 +#: describe.c:5548 #, c-format msgid "" "\n" @@ -2167,7 +2172,7 @@ msgstr "" "\n" "Analyseur : « %s.%s »" -#: describe.c:5647 +#: describe.c:5551 #, c-format msgid "" "\n" @@ -2176,244 +2181,253 @@ msgstr "" "\n" "Analyseur : « %s »" -#: describe.c:5681 -#, c-format -msgid "The server (version %s) does not support foreign-data wrappers." -msgstr "Le serveur (version %s) ne supporte pas les wrappers de données distantes." - -#: describe.c:5739 +#: describe.c:5629 msgid "List of foreign-data wrappers" msgstr "Liste des wrappers de données distantes" -#: describe.c:5764 -#, c-format -msgid "The server (version %s) does not support foreign servers." -msgstr "Le serveur (version %s) ne supporte pas les serveurs distants." - -#: describe.c:5777 +#: describe.c:5657 msgid "Foreign-data wrapper" msgstr "Wrapper des données distantes" -#: describe.c:5795 describe.c:6000 +#: describe.c:5675 describe.c:5856 msgid "Version" msgstr "Version" -#: describe.c:5821 +#: describe.c:5703 msgid "List of foreign servers" msgstr "Liste des serveurs distants" -#: describe.c:5846 -#, c-format -msgid "The server (version %s) does not support user mappings." -msgstr "Le serveur (version %s) ne supporte pas les correspondances d'utilisateurs." - -#: describe.c:5856 describe.c:5920 +#: describe.c:5728 describe.c:5784 msgid "Server" msgstr "Serveur" -#: describe.c:5857 +#: describe.c:5729 msgid "User name" msgstr "Nom de l'utilisateur" -#: describe.c:5882 +#: describe.c:5756 msgid "List of user mappings" msgstr "Liste des correspondances utilisateurs" -#: describe.c:5907 -#, c-format -msgid "The server (version %s) does not support foreign tables." -msgstr "Le serveur (version %s) ne supporte pas les tables distantes." - -#: describe.c:5960 +#: describe.c:5826 msgid "List of foreign tables" msgstr "Liste des tables distantes" -#: describe.c:5985 describe.c:6042 -#, c-format -msgid "The server (version %s) does not support extensions." -msgstr "Le serveur (version %s) ne supporte pas les extensions." - -#: describe.c:6017 +#: describe.c:5875 msgid "List of installed extensions" msgstr "Liste des extensions installées" -#: describe.c:6070 +#: describe.c:5920 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Aucune extension nommée « %s » n'a été trouvée." -#: describe.c:6073 +#: describe.c:5923 #, c-format msgid "Did not find any extensions." msgstr "Aucune extension n'a été trouvée." -#: describe.c:6117 +#: describe.c:5967 msgid "Object description" msgstr "Description d'objet" -#: describe.c:6127 +#: describe.c:5977 #, c-format msgid "Objects in extension \"%s\"" msgstr "Objets dans l'extension « %s »" -#: describe.c:6156 describe.c:6232 +#: describe.c:6018 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "mauvaise qualification du nom (trop de points entre les noms) : %s" + +#: describe.c:6033 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "les références entre bases de données ne sont pas implémentées : %s" + +#: describe.c:6059 describe.c:6183 #, c-format msgid "The server (version %s) does not support publications." msgstr "Le serveur (version %s) ne supporte pas les publications." -#: describe.c:6173 describe.c:6310 +#: describe.c:6076 describe.c:6258 msgid "All tables" msgstr "Toutes les tables" -#: describe.c:6174 describe.c:6311 +#: describe.c:6077 describe.c:6259 msgid "Inserts" msgstr "Insertions" -#: describe.c:6175 describe.c:6312 +#: describe.c:6078 describe.c:6260 msgid "Updates" msgstr "Mises à jour" -#: describe.c:6176 describe.c:6313 +#: describe.c:6079 describe.c:6261 msgid "Deletes" msgstr "Suppressions" -#: describe.c:6180 describe.c:6315 +#: describe.c:6083 describe.c:6263 msgid "Truncates" msgstr "Tronque" -#: describe.c:6184 describe.c:6317 +#: describe.c:6087 describe.c:6265 msgid "Via root" msgstr "Via la racine" -#: describe.c:6201 +#: describe.c:6106 msgid "List of publications" msgstr "Liste des publications" -#: describe.c:6274 +#: describe.c:6227 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Aucune publication nommée « %s » n'a été trouvée." -#: describe.c:6277 +#: describe.c:6230 #, c-format msgid "Did not find any publications." msgstr "Aucune publication n'a été trouvée." -#: describe.c:6306 +#: describe.c:6254 #, c-format msgid "Publication %s" msgstr "Publication %s" -#: describe.c:6354 +#: describe.c:6307 msgid "Tables:" msgstr "Tables :" -#: describe.c:6398 +#: describe.c:6319 +msgid "Tables from schemas:" +msgstr "Tables des schémas :" + +#: describe.c:6363 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Le serveur (version %s) ne supporte pas les souscriptions." -#: describe.c:6414 +#: describe.c:6379 msgid "Publication" msgstr "Publication" -#: describe.c:6423 +#: describe.c:6388 msgid "Binary" msgstr "Binaire" -#: describe.c:6424 +#: describe.c:6389 msgid "Streaming" msgstr "Flux" -#: describe.c:6429 +#: describe.c:6396 +msgid "Two phase commit" +msgstr "Commit en deux phases" + +#: describe.c:6397 +msgid "Disable on error" +msgstr "Désactiver en cas d'erreur" + +#: describe.c:6402 msgid "Synchronous commit" msgstr "Validation synchrone" -#: describe.c:6430 +#: describe.c:6403 msgid "Conninfo" msgstr "Informations de connexion" -#: describe.c:6452 +#: describe.c:6409 +msgid "Skip LSN" +msgstr "Ignore LSN" + +#: describe.c:6433 msgid "List of subscriptions" msgstr "Liste des souscriptions" -#: describe.c:6519 describe.c:6607 describe.c:6692 describe.c:6775 +#: describe.c:6495 describe.c:6587 describe.c:6676 describe.c:6763 msgid "AM" msgstr "AM" -#: describe.c:6520 +#: describe.c:6496 msgid "Input type" msgstr "Type en entrée" -#: describe.c:6521 +#: describe.c:6497 msgid "Storage type" msgstr "Type de stockage" -#: describe.c:6522 +#: describe.c:6498 msgid "Operator class" msgstr "Classe d'opérateur" -#: describe.c:6534 describe.c:6608 describe.c:6693 describe.c:6776 +#: describe.c:6510 describe.c:6588 describe.c:6677 describe.c:6764 msgid "Operator family" msgstr "Famille d'opérateur" -#: describe.c:6566 +#: describe.c:6546 msgid "List of operator classes" msgstr "Liste des classes d'opérateurs" -#: describe.c:6609 +#: describe.c:6589 msgid "Applicable types" msgstr "Types applicables" -#: describe.c:6647 +#: describe.c:6631 msgid "List of operator families" msgstr "Liste des familles d'opérateurs" -#: describe.c:6694 +#: describe.c:6678 msgid "Operator" msgstr "Opérateur" -#: describe.c:6695 +#: describe.c:6679 msgid "Strategy" msgstr "Stratégie" -#: describe.c:6696 +#: describe.c:6680 msgid "ordering" msgstr "ordre" -#: describe.c:6697 +#: describe.c:6681 msgid "search" msgstr "recherche" -#: describe.c:6698 +#: describe.c:6682 msgid "Purpose" msgstr "But" -#: describe.c:6703 +#: describe.c:6687 msgid "Sort opfamily" msgstr "Tri famille d'opérateur" -#: describe.c:6734 +#: describe.c:6722 msgid "List of operators of operator families" msgstr "Liste d'opérateurs des familles d'opérateurs" -#: describe.c:6777 +#: describe.c:6765 msgid "Registered left type" msgstr "Type de l'arg. gauche enregistré" -#: describe.c:6778 +#: describe.c:6766 msgid "Registered right type" msgstr "Type de l'arg. droit enregistré" -#: describe.c:6779 +#: describe.c:6767 msgid "Number" msgstr "Numéro" -#: describe.c:6815 +#: describe.c:6807 msgid "List of support functions of operator families" msgstr "Liste des fonctions de support des familles d'opérateurs" -#: help.c:73 +#: describe.c:6834 +msgid "ID" +msgstr "ID" + +#: describe.c:6855 +msgid "Large objects" +msgstr "« Large objects »" + +#: help.c:70 #, c-format msgid "" "psql is the PostgreSQL interactive terminal.\n" @@ -2422,53 +2436,50 @@ msgstr "" "psql est l'interface interactive de PostgreSQL.\n" "\n" -#: help.c:74 help.c:355 help.c:433 help.c:476 +#: help.c:71 help.c:354 help.c:434 help.c:477 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: help.c:75 +#: help.c:72 #, c-format msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" msgstr "" -" psql [OPTIONS]... [NOM_BASE [NOM_UTILISATEUR]]\n" +" psql [OPTIONS]... [BASE [UTILISATEUR]]\n" "\n" -#: help.c:77 +#: help.c:74 #, c-format msgid "General options:\n" msgstr "Options générales :\n" -#: help.c:82 +#: help.c:79 #, c-format msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr "" -" -c, --command=COMMANDE\n" -" exécute une commande unique (SQL ou interne), puis quitte\n" +" -c, --command=COMMANDE exécute une commande unique (SQL ou interne), puis\n" +" quitte\n" -#: help.c:83 +#: help.c:80 #, c-format msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" msgstr "" -" -d, --dbname=NOM_BASE\n" -" indique le nom de la base de données à laquelle se\n" -" connecter (par défaut : « %s »)\n" +" -d, --dbname=BASE indique le nom de la base de données à laquelle se\n" +" connecter (par défaut : « %s »)\n" -#: help.c:84 +#: help.c:81 #, c-format msgid " -f, --file=FILENAME execute commands from file, then exit\n" -msgstr "" -" -f, --file=FICHIER\n" -" exécute les commandes du fichier, puis quitte\n" +msgstr " -f, --file=FICHIER exécute les commandes du fichier, puis quitte\n" -#: help.c:85 +#: help.c:82 #, c-format msgid " -l, --list list available databases, then exit\n" -msgstr " -l, --list affiche les bases de données disponibles, puis quitte\n" +msgstr " -l, --list affiche les bases de données disponibles, puis quitte\n" -#: help.c:86 +#: help.c:83 #, c-format msgid "" " -v, --set=, --variable=NAME=VALUE\n" @@ -2476,44 +2487,45 @@ msgid "" " (e.g., -v ON_ERROR_STOP=1)\n" msgstr "" " -v, --set=, --variable=NOM=VALEUR\n" -" configure la variable psql NOM en VALEUR\n" -" (e.g., -v ON_ERROR_STOP=1)\n" +" configure la variable psql NOM en VALEUR\n" +" (par exemple : -v ON_ERROR_STOP=1)\n" -#: help.c:89 +#: help.c:86 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version puis quitte\n" +msgstr " -V, --version affiche la version puis quitte\n" -#: help.c:90 +#: help.c:87 #, c-format msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" -msgstr " -X, --no-psqlrc ne lit pas le fichier de démarrage (~/.psqlrc)\n" +msgstr " -X, --no-psqlrc ne lit pas le fichier de démarrage (~/.psqlrc)\n" -#: help.c:91 +#: help.c:88 #, c-format msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" msgstr "" " -1 (« un »), --single-transaction\n" -" exécute dans une transaction unique (si non intéractif)\n" +" exécute dans une transaction unique (si non\n" +" interactif)\n" -#: help.c:93 +#: help.c:90 #, c-format msgid " -?, --help[=options] show this help, then exit\n" -msgstr " -?, --help[=options] affiche cette aide et quitte\n" +msgstr " -?, --help[=options] affiche cette aide et quitte\n" -#: help.c:94 +#: help.c:91 #, c-format msgid " --help=commands list backslash commands, then exit\n" -msgstr " --help=commandes liste les méta-commandes, puis quitte\n" +msgstr " --help=commandes liste les méta-commandes, puis quitte\n" -#: help.c:95 +#: help.c:92 #, c-format msgid " --help=variables list special variables, then exit\n" -msgstr " --help=variables liste les variables spéciales, puis quitte\n" +msgstr " --help=variables liste les variables spéciales, puis quitte\n" -#: help.c:97 +#: help.c:94 #, c-format msgid "" "\n" @@ -2522,77 +2534,69 @@ msgstr "" "\n" "Options d'entrée/sortie :\n" -#: help.c:98 +#: help.c:95 #, c-format msgid " -a, --echo-all echo all input from script\n" -msgstr " -a, --echo-all affiche les lignes du script\n" +msgstr " -a, --echo-all affiche les lignes du script\n" -#: help.c:99 +#: help.c:96 #, c-format msgid " -b, --echo-errors echo failed commands\n" -msgstr " -b, --echo-errors affiche les commandes échouées\n" +msgstr " -b, --echo-errors affiche les commandes échouées\n" -#: help.c:100 +#: help.c:97 #, c-format msgid " -e, --echo-queries echo commands sent to server\n" -msgstr "" -" -e, --echo-queries\n" -" affiche les commandes envoyées au serveur\n" +msgstr " -e, --echo-queries affiche les commandes envoyées au serveur\n" -#: help.c:101 +#: help.c:98 #, c-format msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr "" -" -E, --echo-hidden\n" -" affiche les requêtes engendrées par les commandes internes\n" +" -E, --echo-hidden affiche les requêtes engendrées par les commandes\n" +" internes\n" -#: help.c:102 +#: help.c:99 #, c-format msgid " -L, --log-file=FILENAME send session log to file\n" -msgstr "" -" -L, --log-file=FICHIER\n" -" envoie les traces dans le fichier\n" +msgstr " -L, --log-file=FICHIER envoie les traces dans le fichier\n" -#: help.c:103 +#: help.c:100 #, c-format msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr "" -" -n, --no-readline\n" -" désactive l'édition avancée de la ligne de commande\n" -" (readline)\n" +" -n, --no-readline désactive l'édition avancée de la ligne de commande\n" +" (readline)\n" -#: help.c:104 +#: help.c:101 #, c-format msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr "" -" -o, --output=FICHIER\n" -" écrit les résultats des requêtes dans un fichier (ou\n" -" |tube)\n" +" -o, --output=FICHIER écrit les résultats des requêtes dans un fichier (ou\n" +" |tube)\n" -#: help.c:105 +#: help.c:102 #, c-format msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr "" -" -q, --quiet s'exécute silencieusement (pas de messages, uniquement le\n" -" résultat des requêtes)\n" +" -q, --quiet s'exécute silencieusement (pas de messages, uniquement\n" +" le résultat des requêtes)\n" -#: help.c:106 +#: help.c:103 #, c-format msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr "" -" -s, --single-step\n" -" active le mode étape par étape (confirmation pour chaque\n" -" requête)\n" +" -s, --single-step active le mode étape par étape (confirmation pour\n" +" chaque requête)\n" -#: help.c:107 +#: help.c:104 #, c-format msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr "" -" -S, --single-line\n" -" active le mode ligne par ligne (EOL termine la commande\n" -" SQL)\n" +" -S, --single-line active le mode ligne par ligne (EOL termine la\n" +" commande SQL)\n" -#: help.c:109 +#: help.c:106 #, c-format msgid "" "\n" @@ -2601,94 +2605,92 @@ msgstr "" "\n" "Options de formattage de la sortie :\n" -#: help.c:110 +#: help.c:107 #, c-format msgid " -A, --no-align unaligned table output mode\n" msgstr "" -" -A, --no-align active le mode d'affichage non aligné des tables (-P\n" -" format=unaligned)\n" +" -A, --no-align active le mode d'affichage non aligné des tables\n" +" (-P format=unaligned)\n" -#: help.c:111 +#: help.c:108 #, c-format msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr "" -" --csv mode d'affichage CSV (valeurs séparées par des virgules)\n" -"\n" +" --csv mode d'affichage CSV (valeurs séparées par des\n" +" virgules)\n" -#: help.c:112 +#: help.c:109 #, c-format msgid "" " -F, --field-separator=STRING\n" " field separator for unaligned output (default: \"%s\")\n" msgstr "" " -F, --field-separator=CHAINE\n" -" séparateur de champs pour un affichage non aligné\n" -" (par défaut : « %s »)\n" +" séparateur de champs pour un affichage non aligné\n" +" (par défaut : « %s »)\n" -#: help.c:115 +#: help.c:112 #, c-format msgid " -H, --html HTML table output mode\n" -msgstr " -H, --html active le mode d'affichage HTML des tables (-P format=html)\n" +msgstr "" +" -H, --html active le mode d'affichage HTML des tables\n" +" (-P format=html)\n" -#: help.c:116 +#: help.c:113 #, c-format msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr "" -" -P, --pset=VAR[=ARG]\n" -" initialise l'option d'impression VAR à ARG (voir la\n" -" commande \\pset)\n" +" -P, --pset=VAR[=ARG] initialise l'option d'impression VAR à ARG (voir la\n" +" commande \\pset)\n" -#: help.c:117 +#: help.c:114 #, c-format msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" msgstr "" " -R, --record-separator=CHAINE\n" -" séparateur d'enregistrements pour un affichage non aligné\n" -" (par défaut : saut de ligne)\n" +" séparateur d'enregistrements pour un affichage non\n" +" aligné (par défaut : saut de ligne)\n" -#: help.c:119 +#: help.c:116 #, c-format msgid " -t, --tuples-only print rows only\n" -msgstr "" -" -t, --tuples-only\n" -" affiche seulement les lignes (-P tuples_only)\n" +msgstr " -t, --tuples-only affiche seulement les lignes (-P tuples_only)\n" -#: help.c:120 +#: help.c:117 #, c-format msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr "" -" -T, --table-attr=TEXTE\n" -" initialise les attributs des balises HTML de tableau\n" -" (largeur, bordure) (-P tableattr=)\n" +" -T, --table-attr=TEXTE initialise les attributs des balises HTML de tableau\n" +" (largeur, bordure)\n" -#: help.c:121 +#: help.c:118 #, c-format msgid " -x, --expanded turn on expanded table output\n" -msgstr " -x, --expanded active l'affichage étendu des tables (-P expanded)\n" +msgstr " -x, --expanded active l'affichage étendu des tables (-P expanded)\n" -#: help.c:122 +#: help.c:119 #, c-format msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" msgstr "" " -z, --field-separator-zero\n" -" initialise le séparateur de champs pour un affichage non\n" -" aligné à l'octet zéro\n" +" initialise le séparateur de champs pour un affichage\n" +" non aligné à l'octet zéro\n" -#: help.c:124 +#: help.c:121 #, c-format msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" msgstr "" " -0, --record-separator-zero\n" -" initialise le séparateur d'enregistrements pour un affichage\n" -" non aligné à l'octet zéro\n" +" initialise le séparateur d'enregistrements pour un\n" +" affichage non aligné à l'octet zéro\n" -#: help.c:127 +#: help.c:124 #, c-format msgid "" "\n" @@ -2697,47 +2699,45 @@ msgstr "" "\n" "Options de connexion :\n" -#: help.c:130 +#: help.c:127 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" msgstr "" -" -h, --host=HOTE nom d'hôte du serveur de la base de données ou répertoire\n" -" de la socket (par défaut : %s)\n" +" -h, --host=HÔTE nom d'hôte du serveur de la base de données ou\n" +" répertoire de la socket (par défaut : %s)\n" -#: help.c:131 +#: help.c:128 msgid "local socket" msgstr "socket locale" -#: help.c:134 +#: help.c:131 #, c-format msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr "" -" -p, --port=PORT port du serveur de la base de données (par défaut :\n" -" « %s »)\n" +" -p, --port=PORT port du serveur de la base de données (par défaut :\n" +" « %s »)\n" -#: help.c:137 +#: help.c:134 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr "" -" -U, --username=NOM\n" -" nom d'utilisateur de la base de données (par défaut :\n" -" « %s »)\n" +" -U, --username=UTILISATEUR\n" +" nom d'utilisateur de la base de données (par\n" +" défaut : « %s »)\n" -#: help.c:138 +#: help.c:135 #, c-format msgid " -w, --no-password never prompt for password\n" -msgstr "" -" -w, --no-password\n" -" ne demande jamais un mot de passe\n" +msgstr " -w, --no-password ne demande jamais un mot de passe\n" -#: help.c:139 +#: help.c:136 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr "" -" -W, --password force la demande du mot de passe (devrait survenir\n" -" automatiquement)\n" +" -W, --password force la demande du mot de passe (devrait survenir\n" +" automatiquement)\n" -#: help.c:141 +#: help.c:138 #, c-format msgid "" "\n" @@ -2748,341 +2748,346 @@ msgid "" msgstr "" "\n" "Pour en savoir davantage, saisissez « \\? » (pour les commandes internes) ou\n" -"« \\help » (pour les commandes SQL) dans psql, ou consultez la section psql\n" -"de la documentation de PostgreSQL.\n" +"« \\help » (pour les commandes SQL) dans psql, ou consultez la section psql de\n" +"la documentation de PostgreSQL.\n" "\n" -#: help.c:144 +#: help.c:141 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapporter les bogues à <%s>.\n" -#: help.c:145 +#: help.c:142 #, c-format msgid "%s home page: <%s>\n" msgstr "page d'accueil de %s : <%s>\n" -#: help.c:171 +#: help.c:168 #, c-format msgid "General\n" msgstr "Général\n" -#: help.c:172 +#: help.c:169 #, c-format msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr "" " \\copyright affiche les conditions d'utilisation et de\n" " distribution de PostgreSQL\n" -#: help.c:173 +#: help.c:170 #, c-format -msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" -msgstr " \\crosstabview [COLUMNS] exécute la requête et affiche le résultat dans un tableau croisé\n" +msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" +msgstr " \\crosstabview [COLONNES] exécute la requête et affiche le résultat dans un tableau croisé\n" -#: help.c:174 +#: help.c:171 #, c-format msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose affiche le message d'erreur le plus récent avec une verbosité maximale\n" -#: help.c:175 +#: help.c:172 #, c-format msgid "" -" \\g [(OPTIONS)] [FILE] execute query (and send results to file or |pipe);\n" +" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" msgstr "" " \\g [(OPTIONS)] [FICHIER] exécute la requête (et envoie les résultats à un fichier ou à |pipe);\n" " \\g sans arguments est équivalent à un point-virgule\n" -#: help.c:177 +#: help.c:174 #, c-format msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc décrit le résultat de la requête sans l'exécuter\n" -#: help.c:178 +#: help.c:175 #, c-format msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec exécute la requête et exécute chaque valeur du résultat\n" -#: help.c:179 +#: help.c:176 #, c-format -msgid " \\gset [PREFIX] execute query and store results in psql variables\n" -msgstr " \\gset [PRÉFIXE] exécute la requête et stocke les résultats dans des variables psql\n" +msgid " \\gset [PREFIX] execute query and store result in psql variables\n" +msgstr " \\gset [PRÉFIXE] exécute la requête et enregistre le résultat dans des variables psql\n" -#: help.c:180 +#: help.c:177 #, c-format msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [(OPTIONS)] [FICHIER] comme \\g, mais force le mode de sortie étendu\n" -#: help.c:181 +#: help.c:178 #, c-format msgid " \\q quit psql\n" msgstr " \\q quitte psql\n" -#: help.c:182 +#: help.c:179 #, c-format msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr " \\watch [SEC] exécute la requête toutes les SEC secondes\n" -#: help.c:185 +#: help.c:182 #, c-format msgid "Help\n" msgstr "Aide\n" -#: help.c:187 +#: help.c:184 #, c-format msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commandes] affiche l'aide sur les métacommandes\n" -#: help.c:188 +#: help.c:185 #, c-format msgid " \\? options show help on psql command-line options\n" msgstr " \\? options affiche l'aide sur les options en ligne de commande de psql\n" -#: help.c:189 +#: help.c:186 #, c-format msgid " \\? variables show help on special variables\n" msgstr " \\? variables affiche l'aide sur les variables spéciales\n" -#: help.c:190 +#: help.c:187 #, c-format msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr "" " \\h [NOM] aide-mémoire pour les commandes SQL, * pour toutes\n" " les commandes\n" -#: help.c:193 +#: help.c:190 #, c-format msgid "Query Buffer\n" msgstr "Tampon de requête\n" -#: help.c:194 +#: help.c:191 #, c-format msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr "" " \\e [FICHIER] [LIGNE] édite le tampon de requête ou le fichier avec un\n" " éditeur externe\n" -#: help.c:195 +#: help.c:192 #, c-format msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr "" " \\ef [FONCTION [LIGNE]] édite la définition de fonction avec un éditeur\n" " externe\n" -#: help.c:196 +#: help.c:193 #, c-format msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr "" " \\ev [VUE [LIGNE]] édite la définition de vue avec un éditeur\n" " externe\n" -#: help.c:197 +#: help.c:194 #, c-format msgid " \\p show the contents of the query buffer\n" msgstr " \\p affiche le contenu du tampon de requête\n" -#: help.c:198 +#: help.c:195 #, c-format msgid " \\r reset (clear) the query buffer\n" msgstr " \\r efface le tampon de requêtes\n" -#: help.c:200 +#: help.c:197 #, c-format msgid " \\s [FILE] display history or save it to file\n" msgstr "" " \\s [FICHIER] affiche l'historique ou le sauvegarde dans un\n" " fichier\n" -#: help.c:202 +#: help.c:199 #, c-format msgid " \\w FILE write query buffer to file\n" msgstr "" " \\w [FICHIER] écrit le contenu du tampon de requêtes dans un\n" " fichier\n" -#: help.c:205 +#: help.c:202 #, c-format msgid "Input/Output\n" msgstr "Entrée/Sortie\n" -#: help.c:206 +#: help.c:203 #, c-format msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr "" " \\copy ... exécute SQL COPY avec le flux de données dirigé vers\n" " l'hôte client\n" -#: help.c:207 +#: help.c:204 #, c-format msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [TEXTE] écrit le texte sur la sortie standard (-n pour supprimer le retour à la ligne)\n" -#: help.c:208 +#: help.c:205 #, c-format msgid " \\i FILE execute commands from file\n" msgstr " \\i FICHIER exécute les commandes du fichier\n" -#: help.c:209 +#: help.c:206 #, c-format msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr "" " \\ir FICHIER identique à \\i, mais relatif à l'emplacement du script\n" " ou un |tube\n" -#: help.c:210 +#: help.c:207 #, c-format msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr "" " \\o [FICHIER] envoie les résultats de la requête vers un fichier\n" " ou un |tube\n" -#: help.c:211 +#: help.c:208 #, c-format msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr "" " \\qecho [-n] [TEXTE] écrit un texte sur la sortie des résultats des\n" " requêtes (\\o) (-n pour supprimer le retour à la ligne)\n" -#: help.c:212 +#: help.c:209 #, c-format msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr " \\warn [-n] [TEXTE] écrit le texte sur la sortie des erreurs (-n pour supprimer le retour à la ligne)\n" -#: help.c:215 +#: help.c:212 #, c-format msgid "Conditional\n" msgstr "Conditionnel\n" -#: help.c:216 +#: help.c:213 #, c-format msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR début du bloc conditionnel\n" -#: help.c:217 +#: help.c:214 #, c-format msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif alternative à l'intérieur du bloc conditionnel courant\n" -#: help.c:218 +#: help.c:215 #, c-format msgid " \\else final alternative within current conditional block\n" msgstr " \\else alternative finale à l'intérieur du bloc conditionnel courant\n" -#: help.c:219 +#: help.c:216 #, c-format msgid " \\endif end conditional block\n" msgstr " \\endif bloc conditionnel de fin\n" -#: help.c:222 +#: help.c:219 #, c-format msgid "Informational\n" msgstr "Informations\n" -#: help.c:223 +#: help.c:220 #, c-format msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (options : S = affiche les objets systèmes, + = informations supplémentaires)\n" -#: help.c:224 +#: help.c:221 #, c-format msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] affiche la liste des tables, vues et séquences\n" -#: help.c:225 +#: help.c:222 #, c-format msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr "" " \\d[S+] NOM affiche la description de la table, de la vue,\n" " de la séquence ou de l'index\n" -#: help.c:226 +#: help.c:223 #, c-format msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [MODÈLE] affiche les aggrégats\n" -#: help.c:227 +#: help.c:224 #, c-format msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [MODÈLE] affiche la liste des méthodes d'accès\n" -#: help.c:228 +#: help.c:225 #, c-format msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] affiche les classes d'opérateurs\n" -#: help.c:229 +#: help.c:226 #, c-format msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] affiche les familles d'opérateur\n" -#: help.c:230 +#: help.c:227 #, c-format msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] affiche les opérateurs des familles d'opérateur\n" -#: help.c:231 +#: help.c:228 #, c-format msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] liste les fonctions de support des familles d'opérateur\n" -#: help.c:232 +#: help.c:229 #, c-format msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [MODÈLE] affiche la liste des tablespaces\n" -#: help.c:233 +#: help.c:230 #, c-format msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [MODÈLE] affiche la liste des conversions\n" -#: help.c:234 +#: help.c:231 +#, c-format +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [MODÈLE] affiche les paramètres de configuration\n" + +#: help.c:232 #, c-format msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [MODÈLE] affiche la liste des transtypages\n" -#: help.c:235 +#: help.c:233 #, c-format msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr "" " \\dd[S] [MODÈLE] affiche les commentaires des objets dont le commentaire\n" " n'est affiché nul part ailleurs\n" -#: help.c:236 +#: help.c:234 #, c-format msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [MODÈLE] affiche la liste des domaines\n" -#: help.c:237 +#: help.c:235 #, c-format msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [MODÈLE] affiche les droits par défaut\n" -#: help.c:238 +#: help.c:236 #, c-format msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [MODÈLE] affiche la liste des tables distantes\n" -#: help.c:239 -#, c-format -msgid " \\det[+] [PATTERN] list foreign tables\n" -msgstr " \\det[+] [MODÈLE] affiche la liste des tables distantes\n" - -#: help.c:240 +#: help.c:237 #, c-format msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [MODÈLE] affiche la liste des serveurs distants\n" -#: help.c:241 +#: help.c:238 +#, c-format +msgid " \\det[+] [PATTERN] list foreign tables\n" +msgstr " \\det[+] [MODÈLE] affiche la liste des tables distantes\n" + +#: help.c:239 #, c-format msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [MODÈLE] affiche la liste des correspondances utilisateurs\n" -#: help.c:242 +#: help.c:240 #, c-format msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [MODÈLE] affiche la liste des wrappers de données distantes\n" -#: help.c:243 +#: help.c:241 #, c-format msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" @@ -3091,67 +3096,65 @@ msgstr "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " affiche la liste des fonctions [seulement agrégat/normal/procédure/trigger/window]\n" -#: help.c:245 +#: help.c:243 #, c-format msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr "" " \\dF[+] [MODÈLE] affiche la liste des configurations de la recherche\n" " plein texte\n" -#: help.c:246 +#: help.c:244 #, c-format msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr "" " \\dFd[+] [MODÈLE] affiche la liste des dictionnaires de la recherche de\n" " texte\n" -#: help.c:247 +#: help.c:245 #, c-format msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr "" " \\dFp[+] [MODÈLE] affiche la liste des analyseurs de la recherche de\n" " texte\n" -#: help.c:248 +#: help.c:246 #, c-format msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr "" " \\dFt[+] [MODÈLE] affiche la liste des modèles de la recherche de\n" " texte\n" -#: help.c:249 +#: help.c:247 #, c-format msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [MODÈLE] affiche la liste des rôles (utilisateurs)\n" -#: help.c:250 +#: help.c:248 #, c-format msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [MODÈLE] affiche la liste des index\n" -#: help.c:251 +#: help.c:249 #, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr "" -" \\dl affiche la liste des « Large Objects », identique à\n" -" \\lo_list\n" +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] liste des « Large Objects », identique à \\lo_list\n" -#: help.c:252 +#: help.c:250 #, c-format msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [MODÈLE] affiche la liste des langages procéduraux\n" -#: help.c:253 +#: help.c:251 #, c-format msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [MODÈLE] affiche la liste des vues matérialisées\n" -#: help.c:254 +#: help.c:252 #, c-format msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [MODÈLE] affiche la liste des schémas\n" -#: help.c:255 +#: help.c:253 #, c-format msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" @@ -3160,130 +3163,132 @@ msgstr "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " affiche la liste des opérateurs\n" -#: help.c:257 +#: help.c:255 #, c-format msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [MODÈLE] affiche la liste des collationnements\n" -#: help.c:258 +#: help.c:256 #, c-format msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" msgstr "" " \\dp [MODÈLE] affiche la liste des droits d'accès aux tables,\n" " vues, séquences\n" -#: help.c:259 +#: help.c:257 #, c-format msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr " \\dP[itn+] [PATTERN] affiche les relations partitionnées [seulement index/table] [n=imbriquées]\n" -#: help.c:260 +#: help.c:258 #, c-format -msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" -msgstr " \\drds [MODEL1 [MODEL2]] liste la configuration utilisateur par base de données\n" +msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" +msgstr "" +" \\drds [ROLEPTRN [DBPTRN]] liste la configuration utilisateur par base de données\n" +"\n" -#: help.c:261 +#: help.c:259 #, c-format msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[S+] [MODÈLE] affiche la liste des publications de réplication\n" -#: help.c:262 +#: help.c:260 #, c-format msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [MODÈLE] affiche la liste des souscriptions de réplication\n" -#: help.c:263 +#: help.c:261 #, c-format msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [MODÈLE] affiche la liste des séquences\n" -#: help.c:264 +#: help.c:262 #, c-format msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [MODÈLE] affiche la liste des tables\n" -#: help.c:265 +#: help.c:263 #, c-format msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [MODÈLE] affiche la liste des types de données\n" -#: help.c:266 +#: help.c:264 #, c-format msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [MODÈLE] affiche la liste des rôles (utilisateurs)\n" -#: help.c:267 +#: help.c:265 #, c-format msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [MODÈLE] affiche la liste des vues\n" -#: help.c:268 +#: help.c:266 #, c-format msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [MODÈLE] affiche la liste des extensions\n" -#: help.c:269 +#: help.c:267 #, c-format msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [MODÈLE] affiche les statistiques étendues\n" -#: help.c:270 +#: help.c:268 #, c-format msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [MODÈLE] affiche les triggers sur évènement\n" -#: help.c:271 +#: help.c:269 #, c-format msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [MODÈLE] affiche la liste des bases de données\n" -#: help.c:272 +#: help.c:270 #, c-format msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] [FONCTION] édite la définition d'une fonction\n" -#: help.c:273 +#: help.c:271 #, c-format msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv [FONCTION] édite la définition d'une vue\n" -#: help.c:274 +#: help.c:272 #, c-format msgid " \\z [PATTERN] same as \\dp\n" msgstr " \\z [MODÈLE] identique à \\dp\n" -#: help.c:277 +#: help.c:275 #, c-format msgid "Formatting\n" msgstr "Formatage\n" -#: help.c:278 +#: help.c:276 #, c-format msgid " \\a toggle between unaligned and aligned output mode\n" msgstr "" " \\a bascule entre les modes de sortie alignée et non\n" " alignée\n" -#: help.c:279 +#: help.c:277 #, c-format msgid " \\C [STRING] set table title, or unset if none\n" msgstr "" " \\C [CHAÎNE] initialise le titre d'une table, ou le désactive en\n" " l'absence d'argument\n" -#: help.c:280 +#: help.c:278 #, c-format msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr "" " \\f [CHAÎNE] affiche ou initialise le séparateur de champ pour\n" " une sortie non alignée des requêtes\n" -#: help.c:281 +#: help.c:279 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H bascule le mode de sortie HTML (actuellement %s)\n" -#: help.c:283 +#: help.c:281 #, c-format msgid "" " \\pset [NAME [VALUE]] set table output option\n" @@ -3302,59 +3307,59 @@ msgstr "" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle)\n" -#: help.c:290 +#: help.c:288 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t affiche uniquement les lignes (actuellement %s)\n" -#: help.c:292 +#: help.c:290 #, c-format msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr "" " \\T [CHAÎNE] initialise les attributs HTML de la balise
,\n" " ou l'annule en l'absence d'argument\n" -#: help.c:293 +#: help.c:291 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] bascule l'affichage étendu (actuellement %s)\n" -#: help.c:297 +#: help.c:295 #, c-format msgid "Connection\n" msgstr "Connexions\n" -#: help.c:299 +#: help.c:297 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently \"%s\")\n" msgstr "" -" \\c[onnect] {[NOM_BASE|- UTILISATEUR|- HOTE|- PORT|-] | conninfo}\n" +" \\c[onnect] {[BASE|- UTILISATEUR|- HÔTE|- PORT|-] | conninfo}\n" " se connecte à une autre base de données\n" " (actuellement « %s »)\n" -#: help.c:303 +#: help.c:301 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" msgstr "" -" \\c[onnect] {[NOM_BASE|- UTILISATEUR|- HOTE|- PORT|-] | conninfo}\n" +" \\c[onnect] {[BASE|- UTILISATEUR|- HÔTE|- PORT|-] | conninfo}\n" " se connecte à une nouvelle base de données\n" " (aucune connexion actuellement)\n" -#: help.c:305 +#: help.c:303 #, c-format msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo affiche des informations sur la connexion en cours\n" -#: help.c:306 +#: help.c:304 #, c-format msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [ENCODAGE] affiche ou initialise l'encodage du client\n" -#: help.c:307 +#: help.c:305 #, c-format msgid " \\password [USERNAME] securely change the password for a user\n" msgstr "" @@ -3362,79 +3367,83 @@ msgstr "" " modifie de façon sécurisé le mot de passe d'un\n" " utilisateur\n" -#: help.c:310 +#: help.c:308 #, c-format msgid "Operating System\n" msgstr "Système d'exploitation\n" -#: help.c:311 +#: help.c:309 #, c-format msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [RÉPERTOIRE] change de répertoire de travail\n" -#: help.c:312 +#: help.c:310 +#, c-format +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\getenv PSQLVAR ENVVAR récupère une variable d'environnement\n" + +#: help.c:311 #, c-format msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv NOM [VALEUR] (dés)initialise une variable d'environnement\n" -#: help.c:313 +#: help.c:312 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr "" " \\timing [on|off] bascule l'activation du chronométrage des commandes\n" " (actuellement %s)\n" -#: help.c:315 +#: help.c:314 #, c-format msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr "" " \\! [COMMANDE] exécute la commande dans un shell ou exécute un\n" " shell interactif\n" -#: help.c:318 +#: help.c:317 #, c-format msgid "Variables\n" msgstr "Variables\n" -#: help.c:319 +#: help.c:318 #, c-format msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr "" " \\prompt [TEXTE] NOM demande à l'utilisateur de configurer la variable\n" " interne\n" -#: help.c:320 +#: help.c:319 #, c-format msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr "" " \\set [NOM [VALEUR]] initialise une variable interne ou les affiche\n" " toutes en l'absence de paramètre\n" -#: help.c:321 +#: help.c:320 #, c-format msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NOM désactive (supprime) la variable interne\n" -#: help.c:324 +#: help.c:323 #, c-format msgid "Large Objects\n" msgstr "« Large objects »\n" -#: help.c:325 +#: help.c:324 #, c-format msgid "" " \\lo_export LOBOID FILE\n" " \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" +" \\lo_list[+]\n" " \\lo_unlink LOBOID large object operations\n" msgstr "" " \\lo_export OIDLOB FICHIER\n" " \\lo_import FICHIER [COMMENTAIRE]\n" -" \\lo_list\n" -" \\lo_unlink OIDLOB\n" -" opérations sur les « Large Objects »\n" +" \\lo_list[+]\n" +" \\lo_unlink OIDLOB opérations sur les « Large Objects »\n" -#: help.c:352 +#: help.c:351 #, c-format msgid "" "List of specially treated variables\n" @@ -3443,12 +3452,12 @@ msgstr "" "Liste des variables traitées spécialement\n" "\n" -#: help.c:354 +#: help.c:353 #, c-format msgid "psql variables:\n" msgstr "variables psql :\n" -#: help.c:356 +#: help.c:355 #, c-format msgid "" " psql --set=NAME=VALUE\n" @@ -3459,7 +3468,7 @@ msgstr "" " ou \\set NOM VALEUR dans psql\n" "\n" -#: help.c:358 +#: help.c:357 #, c-format msgid "" " AUTOCOMMIT\n" @@ -3468,7 +3477,7 @@ msgstr "" " AUTOCOMMIT\n" " si activé, les commandes SQL réussies sont automatiquement validées\n" -#: help.c:360 +#: help.c:359 #, c-format msgid "" " COMP_KEYWORD_CASE\n" @@ -3479,7 +3488,7 @@ msgstr "" " détermine la casse utilisée pour compléter les mots clés SQL\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:363 +#: help.c:362 #, c-format msgid "" " DBNAME\n" @@ -3488,7 +3497,7 @@ msgstr "" " DBNAME\n" " le nom de base de données actuel\n" -#: help.c:365 +#: help.c:364 #, c-format msgid "" " ECHO\n" @@ -3499,7 +3508,7 @@ msgstr "" " contrôle ce qui est envoyé sur la sortie standard\n" " [all, errors, none, queries]\n" -#: help.c:368 +#: help.c:367 #, c-format msgid "" " ECHO_HIDDEN\n" @@ -3510,7 +3519,7 @@ msgstr "" " si activé, affiche les requêtes internes exécutées par les méta-commandes ;\n" " si configuré à « noexec », affiche les requêtes sans les exécuter\n" -#: help.c:371 +#: help.c:370 #, c-format msgid "" " ENCODING\n" @@ -3519,7 +3528,7 @@ msgstr "" " ENCODING\n" " encodage du jeu de caractères client\n" -#: help.c:373 +#: help.c:372 #, c-format msgid "" " ERROR\n" @@ -3528,7 +3537,7 @@ msgstr "" " ERROR\n" " true si la dernière requête a échoué, sinon false\n" -#: help.c:375 +#: help.c:374 #, c-format msgid "" " FETCH_COUNT\n" @@ -3538,7 +3547,7 @@ msgstr "" " le nombre de lignes résultats à récupérer et à afficher à la fois\n" " (0 pour illimité)\n" -#: help.c:377 +#: help.c:376 #, c-format msgid "" " HIDE_TABLEAM\n" @@ -3547,7 +3556,7 @@ msgstr "" " HIDE_TABLEAM\n" " si activé, les méthodes d'accès ne sont pas affichées\n" -#: help.c:379 +#: help.c:378 #, c-format msgid "" " HIDE_TOAST_COMPRESSION\n" @@ -3557,7 +3566,7 @@ msgstr "" " si activé, les méthodes de compression methods ne sont pas affichées\n" "\n" -#: help.c:381 +#: help.c:380 #, c-format msgid "" " HISTCONTROL\n" @@ -3566,7 +3575,7 @@ msgstr "" " HISTCONTROL\n" " contrôle l'historique des commandes [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:383 +#: help.c:382 #, c-format msgid "" " HISTFILE\n" @@ -3575,7 +3584,7 @@ msgstr "" " HISTFILE\n" " nom du fichier utilisé pour stocker l'historique des commandes\n" -#: help.c:385 +#: help.c:384 #, c-format msgid "" " HISTSIZE\n" @@ -3584,7 +3593,7 @@ msgstr "" " HISTSIZE\n" " nombre maximum de commandes à stocker dans l'historique de commandes\n" -#: help.c:387 +#: help.c:386 #, c-format msgid "" " HOST\n" @@ -3593,7 +3602,7 @@ msgstr "" " HOST\n" " l'hôte de la base de données\n" -#: help.c:389 +#: help.c:388 #, c-format msgid "" " IGNOREEOF\n" @@ -3602,7 +3611,7 @@ msgstr "" " IGNOREEOF\n" " nombre d'EOF nécessaire pour terminer une session interactive\n" -#: help.c:391 +#: help.c:390 #, c-format msgid "" " LASTOID\n" @@ -3611,7 +3620,7 @@ msgstr "" " LASTOID\n" " valeur du dernier OID affecté\n" -#: help.c:393 +#: help.c:392 #, c-format msgid "" " LAST_ERROR_MESSAGE\n" @@ -3622,7 +3631,7 @@ msgstr "" " LAST_ERROR_SQLSTATE\n" " message et SQLSTATE de la dernière erreur ou une chaîne vide et \"00000\" if si aucune erreur\n" -#: help.c:396 +#: help.c:395 #, c-format msgid "" " ON_ERROR_ROLLBACK\n" @@ -3631,7 +3640,7 @@ msgstr "" " ON_ERROR_ROLLBACK\n" " si activé, une erreur n'arrête pas une transaction (utilise des savepoints implicites)\n" -#: help.c:398 +#: help.c:397 #, c-format msgid "" " ON_ERROR_STOP\n" @@ -3640,7 +3649,7 @@ msgstr "" " ON_ERROR_STOP\n" " arrête l'exécution d'un batch après une erreur\n" -#: help.c:400 +#: help.c:399 #, c-format msgid "" " PORT\n" @@ -3649,7 +3658,7 @@ msgstr "" " PORT\n" " port du serveur pour la connexion actuelle\n" -#: help.c:402 +#: help.c:401 #, c-format msgid "" " PROMPT1\n" @@ -3658,7 +3667,7 @@ msgstr "" " PROMPT1\n" " spécifie l'invite standard de psql\n" -#: help.c:404 +#: help.c:403 #, c-format msgid "" " PROMPT2\n" @@ -3667,7 +3676,7 @@ msgstr "" " PROMPT2\n" " spécifie l'invite utilisé quand une requête continue après la ligne courante\n" -#: help.c:406 +#: help.c:405 #, c-format msgid "" " PROMPT3\n" @@ -3676,7 +3685,7 @@ msgstr "" " PROMPT3\n" " spécifie l'invite utilisée lors d'un COPY ... FROM STDIN\n" -#: help.c:408 +#: help.c:407 #, c-format msgid "" " QUIET\n" @@ -3685,7 +3694,7 @@ msgstr "" " QUIET\n" " s'exécute en silence (identique à l'option -q)\n" -#: help.c:410 +#: help.c:409 #, c-format msgid "" " ROW_COUNT\n" @@ -3694,7 +3703,7 @@ msgstr "" " ROW_COUNT\n" " nombre de lignes renvoyées ou affectées par la dernière requête, ou 0\n" -#: help.c:412 +#: help.c:411 #, c-format msgid "" " SERVER_VERSION_NAME\n" @@ -3705,7 +3714,16 @@ msgstr "" " SERVER_VERSION_NUM\n" " version du serveur (chaîne courte ou format numérique)\n" -#: help.c:415 +#: help.c:414 +#, c-format +msgid "" +" SHOW_ALL_RESULTS\n" +" show all results of a combined query (\\;) instead of only the last\n" +msgstr "" +" SHOW_ALL_RESULTS\n" +" affiche tous les résultats d'une requête combinée (\\;) au lieu du dernier uniquement\n" + +#: help.c:416 #, c-format msgid "" " SHOW_CONTEXT\n" @@ -3714,7 +3732,7 @@ msgstr "" " SHOW_CONTEXT\n" " contrôle l'affichage des champs de contexte du message [never, errors, always]\n" -#: help.c:417 +#: help.c:418 #, c-format msgid "" " SINGLELINE\n" @@ -3723,7 +3741,7 @@ msgstr "" " SINGLELINE\n" " une fin de ligne termine le mode de commande SQL (identique à l'option -S)\n" -#: help.c:419 +#: help.c:420 #, c-format msgid "" " SINGLESTEP\n" @@ -3732,7 +3750,7 @@ msgstr "" " SINGLESTEP\n" " mode pas à pas (identique à l'option -s)\n" -#: help.c:421 +#: help.c:422 #, c-format msgid "" " SQLSTATE\n" @@ -3741,7 +3759,7 @@ msgstr "" " SQLSTATE\n" " SQLSTATE de la dernière requête, ou \"00000\" si aucune erreur\n" -#: help.c:423 +#: help.c:424 #, c-format msgid "" " USER\n" @@ -3750,7 +3768,7 @@ msgstr "" " USER\n" " l'utilisateur actuellement connecté\n" -#: help.c:425 +#: help.c:426 #, c-format msgid "" " VERBOSITY\n" @@ -3759,7 +3777,7 @@ msgstr "" " VERBOSITY\n" " contrôle la verbosité des rapports d'erreurs [default, verbose, terse, sqlstate]\n" -#: help.c:427 +#: help.c:428 #, c-format msgid "" " VERSION\n" @@ -3772,7 +3790,7 @@ msgstr "" " VERSION_NUM\n" " version de psql (chaîne longue, chaîne courte, ou format numérique)\n" -#: help.c:432 +#: help.c:433 #, c-format msgid "" "\n" @@ -3781,7 +3799,7 @@ msgstr "" "\n" "Paramètres d'affichage :\n" -#: help.c:434 +#: help.c:435 #, c-format msgid "" " psql --pset=NAME[=VALUE]\n" @@ -3792,7 +3810,7 @@ msgstr "" " ou \\pset NOM [VALEUR] dans psql\n" "\n" -#: help.c:436 +#: help.c:437 #, c-format msgid "" " border\n" @@ -3801,7 +3819,7 @@ msgstr "" " border\n" " style de bordure (nombre)\n" -#: help.c:438 +#: help.c:439 #, c-format msgid "" " columns\n" @@ -3810,7 +3828,7 @@ msgstr "" " columns\n" " largeur cible pour le format encadré\n" -#: help.c:440 +#: help.c:441 #, c-format msgid "" " expanded (or x)\n" @@ -3819,7 +3837,7 @@ msgstr "" " expanded (ou x)\n" " sortie étendue [on, off, auto]\n" -#: help.c:442 +#: help.c:443 #, c-format msgid "" " fieldsep\n" @@ -3828,7 +3846,7 @@ msgstr "" " fieldsep\n" " champ séparateur pour l'affichage non aligné (par défaut « %s »)\n" -#: help.c:445 +#: help.c:446 #, c-format msgid "" " fieldsep_zero\n" @@ -3837,7 +3855,7 @@ msgstr "" " fieldsep_zero\n" " configure le séparateur de champ pour l'affichage non alignée à l'octet zéro\n" -#: help.c:447 +#: help.c:448 #, c-format msgid "" " footer\n" @@ -3846,7 +3864,7 @@ msgstr "" " footer\n" " active ou désactive l'affiche du bas de tableau [on, off]\n" -#: help.c:449 +#: help.c:450 #, c-format msgid "" " format\n" @@ -3855,7 +3873,7 @@ msgstr "" " format\n" " active le format de sortie [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:451 +#: help.c:452 #, c-format msgid "" " linestyle\n" @@ -3864,7 +3882,7 @@ msgstr "" " linestyle\n" " configure l'affichage des lignes de bordure [ascii, old-ascii, unicode]\n" -#: help.c:453 +#: help.c:454 #, c-format msgid "" " null\n" @@ -3873,7 +3891,7 @@ msgstr "" " null\n" " configure la chaîne à afficher à la place d'une valeur NULL\n" -#: help.c:455 +#: help.c:456 #, c-format msgid "" " numericlocale\n" @@ -3883,7 +3901,7 @@ msgstr "" " active ou désactive l'affichage d'un caractère spécifique à la locale pour séparer\n" " des groupes de chiffres [on, off]\n" -#: help.c:457 +#: help.c:458 #, c-format msgid "" " pager\n" @@ -3892,7 +3910,7 @@ msgstr "" " pager\n" " contrôle quand un paginateur externe est utilisé [yes, no, always]\n" -#: help.c:459 +#: help.c:460 #, c-format msgid "" " recordsep\n" @@ -3901,7 +3919,7 @@ msgstr "" " recordsep\n" " enregistre le séparateur de ligne pour les affichages non alignés\n" -#: help.c:461 +#: help.c:462 #, c-format msgid "" " recordsep_zero\n" @@ -3911,7 +3929,7 @@ msgstr "" " initialise le séparateur d'enregistrements pour un affichage\n" " non aligné à l'octet zéro\n" -#: help.c:463 +#: help.c:464 #, c-format msgid "" " tableattr (or T)\n" @@ -3923,7 +3941,7 @@ msgstr "" " proportionnelles de colonnes pour les types de données alignés à gauche dans le\n" " format latex-longtable\n" -#: help.c:466 +#: help.c:467 #, c-format msgid "" " title\n" @@ -3932,7 +3950,7 @@ msgstr "" " title\n" " configure le titre de la table pour toute table affichée\n" -#: help.c:468 +#: help.c:469 #, c-format msgid "" " tuples_only\n" @@ -3941,7 +3959,7 @@ msgstr "" " tuples_only\n" " si activé, seules les données de la table sont affichées\n" -#: help.c:470 +#: help.c:471 #, c-format msgid "" " unicode_border_linestyle\n" @@ -3954,7 +3972,7 @@ msgstr "" " unicode_header_linestyle\n" " configure le style d'affichage de ligne Unicode [single, double]\n" -#: help.c:475 +#: help.c:476 #, c-format msgid "" "\n" @@ -3963,7 +3981,7 @@ msgstr "" "\n" "Variables d'environnement :\n" -#: help.c:479 +#: help.c:480 #, c-format msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" @@ -3974,7 +3992,7 @@ msgstr "" " ou \\setenv NOM [VALEUR] dans psql\n" "\n" -#: help.c:481 +#: help.c:482 #, c-format msgid "" " set NAME=VALUE\n" @@ -3987,7 +4005,7 @@ msgstr "" " ou \\setenv NOM [VALEUR] dans psql\n" "\n" -#: help.c:484 +#: help.c:485 #, c-format msgid "" " COLUMNS\n" @@ -3996,7 +4014,7 @@ msgstr "" " COLUMNS\n" " nombre de colonnes pour le format encadré\n" -#: help.c:486 +#: help.c:487 #, c-format msgid "" " PGAPPNAME\n" @@ -4005,7 +4023,7 @@ msgstr "" " PGAPPNAME\n" " identique au paramètre de connexion application_name\n" -#: help.c:488 +#: help.c:489 #, c-format msgid "" " PGDATABASE\n" @@ -4014,7 +4032,7 @@ msgstr "" " PGDATABASE\n" " identique au paramètre de connexion dbname\n" -#: help.c:490 +#: help.c:491 #, c-format msgid "" " PGHOST\n" @@ -4023,7 +4041,7 @@ msgstr "" " PGHOST\n" " identique au paramètre de connexion host\n" -#: help.c:492 +#: help.c:493 #, c-format msgid "" " PGPASSFILE\n" @@ -4032,7 +4050,7 @@ msgstr "" " PGPASSFILE\n" " nom du fichier de mot de passe\n" -#: help.c:494 +#: help.c:495 #, c-format msgid "" " PGPASSWORD\n" @@ -4041,7 +4059,7 @@ msgstr "" " PGPASSWORD\n" " mot de passe de connexion (non recommendé)\n" -#: help.c:496 +#: help.c:497 #, c-format msgid "" " PGPORT\n" @@ -4050,7 +4068,7 @@ msgstr "" " PGPORT\n" " identique au paramètre de connexion port\n" -#: help.c:498 +#: help.c:499 #, c-format msgid "" " PGUSER\n" @@ -4059,7 +4077,7 @@ msgstr "" " PGUSER\n" " identique au paramètre de connexion user\n" -#: help.c:500 +#: help.c:501 #, c-format msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" @@ -4068,7 +4086,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " éditeur utilisé par les commandes \\e, \\ef et \\ev\n" -#: help.c:502 +#: help.c:503 #, c-format msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" @@ -4077,7 +4095,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " comment spécifier un numéro de ligne lors de l'appel de l'éditeur\n" -#: help.c:504 +#: help.c:505 #, c-format msgid "" " PSQL_HISTORY\n" @@ -4086,7 +4104,7 @@ msgstr "" " PSQL_HISTORY\n" " autre emplacement pour le fichier d'historique des commandes\n" -#: help.c:506 +#: help.c:507 #, c-format msgid "" " PSQL_PAGER, PAGER\n" @@ -4095,7 +4113,16 @@ msgstr "" " PSQL_PAGER, PAGER\n" " nom du paginateur externe\n" -#: help.c:508 +#: help.c:510 +#, c-format +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_WATCH_PAGER\n" +" nom du paginateur externe utilisé pour \\watch\n" + +#: help.c:513 #, c-format msgid "" " PSQLRC\n" @@ -4104,7 +4131,7 @@ msgstr "" " PSQLRC\n" " autre emplacement pour le fichier .psqlrc de l'utilisateur\n" -#: help.c:510 +#: help.c:515 #, c-format msgid "" " SHELL\n" @@ -4113,7 +4140,7 @@ msgstr "" " SHELL\n" " shell utilisé par la commande \\!\n" -#: help.c:512 +#: help.c:517 #, c-format msgid "" " TMPDIR\n" @@ -4122,11 +4149,11 @@ msgstr "" " TMPDIR\n" " répertoire pour les fichiers temporaires\n" -#: help.c:557 +#: help.c:562 msgid "Available help:\n" msgstr "Aide-mémoire disponible :\n" -#: help.c:652 +#: help.c:657 #, c-format msgid "" "Command: %s\n" @@ -4145,7 +4172,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:675 +#: help.c:680 #, c-format msgid "" "No help available for \"%s\".\n" @@ -4159,12 +4186,12 @@ msgstr "" msgid "could not read from input file: %m" msgstr "n'a pas pu lire à partir du fichier en entrée : %m" -#: input.c:471 input.c:509 +#: input.c:478 input.c:516 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "n'a pas pu sauvegarder l'historique dans le fichier « %s » : %m" -#: input.c:528 +#: input.c:535 #, c-format msgid "history is not supported by this installation" msgstr "l'historique n'est pas supportée par cette installation" @@ -4184,25 +4211,17 @@ msgstr "%s : la transaction en cours est abandonnée" msgid "%s: unknown transaction status" msgstr "%s : état de la transaction inconnu" -#: large_obj.c:288 large_obj.c:299 -msgid "ID" -msgstr "ID" - -#: large_obj.c:309 -msgid "Large objects" -msgstr "« Large objects »" - -#: mainloop.c:136 +#: mainloop.c:133 #, c-format msgid "\\if: escaped" msgstr "\\if : échappé" -#: mainloop.c:195 +#: mainloop.c:192 #, c-format msgid "Use \"\\q\" to leave %s.\n" msgstr "Saisissez « \\q » pour quitter %s.\n" -#: mainloop.c:217 +#: mainloop.c:214 msgid "" "The input is a PostgreSQL custom-format dump.\n" "Use the pg_restore command-line client to restore this dump to a database.\n" @@ -4210,19 +4229,19 @@ msgstr "" "Les données en entrée proviennent d'une sauvegarde PostgreSQL au format custom.\n" "Utilisez l'outil en ligne de commande pg_restore pour restaurer cette sauvegarde dans une base de données.\n" -#: mainloop.c:298 +#: mainloop.c:295 msgid "Use \\? for help or press control-C to clear the input buffer." msgstr "Utilisez \\? pour l'aide ou appuyez sur control-C pour vider le tampon de saisie." -#: mainloop.c:300 +#: mainloop.c:297 msgid "Use \\? for help." msgstr "Utilisez \\? pour l'aide." -#: mainloop.c:304 +#: mainloop.c:301 msgid "You are using psql, the command-line interface to PostgreSQL." msgstr "Vous utilisez psql, l'interface en ligne de commande de PostgreSQL." -#: mainloop.c:305 +#: mainloop.c:302 #, c-format msgid "" "Type: \\copyright for distribution terms\n" @@ -4238,24 +4257,24 @@ msgstr "" " \\g ou point-virgule en fin d'instruction pour exécuter la requête\n" " \\q pour quitter\n" -#: mainloop.c:329 +#: mainloop.c:326 msgid "Use \\q to quit." msgstr "Utilisez \\q pour quitter." -#: mainloop.c:332 mainloop.c:356 +#: mainloop.c:329 mainloop.c:353 msgid "Use control-D to quit." msgstr "Utilisez control-D pour quitter." -#: mainloop.c:334 mainloop.c:358 +#: mainloop.c:331 mainloop.c:355 msgid "Use control-C to quit." msgstr "Utilisez control-C pour quitter." -#: mainloop.c:465 mainloop.c:613 +#: mainloop.c:459 mainloop.c:618 #, c-format msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "requête ignorée ; utilisez \\endif ou Ctrl-C pour quitter le bloc \\if courant" -#: mainloop.c:631 +#: mainloop.c:636 #, c-format msgid "reached EOF without finding closing \\endif(s)" msgstr "a atteint EOF sans trouver le(s) \\endif fermant" @@ -4272,2314 +4291,2433 @@ msgstr "%s : mémoire épuisée" #: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 #: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 -#: sql_help.c:111 sql_help.c:117 sql_help.c:119 sql_help.c:121 sql_help.c:123 -#: sql_help.c:126 sql_help.c:128 sql_help.c:130 sql_help.c:235 sql_help.c:237 -#: sql_help.c:238 sql_help.c:240 sql_help.c:242 sql_help.c:245 sql_help.c:247 -#: sql_help.c:249 sql_help.c:251 sql_help.c:263 sql_help.c:264 sql_help.c:265 -#: sql_help.c:267 sql_help.c:316 sql_help.c:318 sql_help.c:320 sql_help.c:322 -#: sql_help.c:391 sql_help.c:396 sql_help.c:398 sql_help.c:440 sql_help.c:442 -#: sql_help.c:445 sql_help.c:447 sql_help.c:515 sql_help.c:520 sql_help.c:525 -#: sql_help.c:530 sql_help.c:535 sql_help.c:589 sql_help.c:591 sql_help.c:593 -#: sql_help.c:595 sql_help.c:597 sql_help.c:600 sql_help.c:602 sql_help.c:605 -#: sql_help.c:616 sql_help.c:618 sql_help.c:660 sql_help.c:662 sql_help.c:664 -#: sql_help.c:667 sql_help.c:669 sql_help.c:671 sql_help.c:706 sql_help.c:710 -#: sql_help.c:714 sql_help.c:733 sql_help.c:736 sql_help.c:739 sql_help.c:768 -#: sql_help.c:780 sql_help.c:788 sql_help.c:791 sql_help.c:794 sql_help.c:809 -#: sql_help.c:812 sql_help.c:841 sql_help.c:846 sql_help.c:851 sql_help.c:856 -#: sql_help.c:861 sql_help.c:883 sql_help.c:885 sql_help.c:887 sql_help.c:889 -#: sql_help.c:892 sql_help.c:894 sql_help.c:936 sql_help.c:980 sql_help.c:985 -#: sql_help.c:990 sql_help.c:995 sql_help.c:1000 sql_help.c:1019 -#: sql_help.c:1030 sql_help.c:1032 sql_help.c:1051 sql_help.c:1061 -#: sql_help.c:1063 sql_help.c:1065 sql_help.c:1077 sql_help.c:1081 -#: sql_help.c:1083 sql_help.c:1095 sql_help.c:1097 sql_help.c:1099 -#: sql_help.c:1101 sql_help.c:1119 sql_help.c:1121 sql_help.c:1125 -#: sql_help.c:1129 sql_help.c:1133 sql_help.c:1136 sql_help.c:1137 -#: sql_help.c:1138 sql_help.c:1141 sql_help.c:1143 sql_help.c:1278 -#: sql_help.c:1280 sql_help.c:1283 sql_help.c:1286 sql_help.c:1288 -#: sql_help.c:1290 sql_help.c:1293 sql_help.c:1296 sql_help.c:1409 -#: sql_help.c:1411 sql_help.c:1413 sql_help.c:1416 sql_help.c:1437 -#: sql_help.c:1440 sql_help.c:1443 sql_help.c:1446 sql_help.c:1450 -#: sql_help.c:1452 sql_help.c:1454 sql_help.c:1456 sql_help.c:1470 -#: sql_help.c:1473 sql_help.c:1475 sql_help.c:1477 sql_help.c:1487 -#: sql_help.c:1489 sql_help.c:1499 sql_help.c:1501 sql_help.c:1511 -#: sql_help.c:1514 sql_help.c:1537 sql_help.c:1539 sql_help.c:1541 -#: sql_help.c:1543 sql_help.c:1546 sql_help.c:1548 sql_help.c:1551 -#: sql_help.c:1554 sql_help.c:1605 sql_help.c:1648 sql_help.c:1651 -#: sql_help.c:1653 sql_help.c:1655 sql_help.c:1658 sql_help.c:1660 -#: sql_help.c:1662 sql_help.c:1665 sql_help.c:1715 sql_help.c:1731 -#: sql_help.c:1962 sql_help.c:2031 sql_help.c:2050 sql_help.c:2063 -#: sql_help.c:2120 sql_help.c:2127 sql_help.c:2137 sql_help.c:2158 -#: sql_help.c:2184 sql_help.c:2202 sql_help.c:2229 sql_help.c:2325 -#: sql_help.c:2371 sql_help.c:2395 sql_help.c:2418 sql_help.c:2422 -#: sql_help.c:2456 sql_help.c:2476 sql_help.c:2498 sql_help.c:2512 -#: sql_help.c:2533 sql_help.c:2557 sql_help.c:2587 sql_help.c:2612 -#: sql_help.c:2659 sql_help.c:2947 sql_help.c:2960 sql_help.c:2977 -#: sql_help.c:2993 sql_help.c:3033 sql_help.c:3087 sql_help.c:3091 -#: sql_help.c:3093 sql_help.c:3100 sql_help.c:3119 sql_help.c:3146 -#: sql_help.c:3181 sql_help.c:3193 sql_help.c:3202 sql_help.c:3246 -#: sql_help.c:3260 sql_help.c:3288 sql_help.c:3296 sql_help.c:3308 -#: sql_help.c:3318 sql_help.c:3326 sql_help.c:3334 sql_help.c:3342 -#: sql_help.c:3350 sql_help.c:3359 sql_help.c:3370 sql_help.c:3378 -#: sql_help.c:3386 sql_help.c:3394 sql_help.c:3402 sql_help.c:3412 -#: sql_help.c:3421 sql_help.c:3430 sql_help.c:3438 sql_help.c:3448 -#: sql_help.c:3459 sql_help.c:3467 sql_help.c:3476 sql_help.c:3487 -#: sql_help.c:3496 sql_help.c:3504 sql_help.c:3512 sql_help.c:3520 -#: sql_help.c:3528 sql_help.c:3536 sql_help.c:3544 sql_help.c:3552 -#: sql_help.c:3560 sql_help.c:3568 sql_help.c:3576 sql_help.c:3593 -#: sql_help.c:3602 sql_help.c:3610 sql_help.c:3627 sql_help.c:3642 -#: sql_help.c:3944 sql_help.c:3995 sql_help.c:4024 sql_help.c:4039 -#: sql_help.c:4524 sql_help.c:4572 sql_help.c:4723 +#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238 +#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248 +#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267 +#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323 +#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443 +#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524 +#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595 +#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606 +#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668 +#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714 +#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747 +#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802 +#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859 +#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900 +#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999 +#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019 +#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071 +#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086 +#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116 +#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141 +#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155 +#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163 +#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310 +#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320 +#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445 +#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474 +#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486 +#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507 +#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523 +#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548 +#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577 +#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588 +#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687 +#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696 +#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1997 +#: sql_help.c:2066 sql_help.c:2085 sql_help.c:2098 sql_help.c:2155 +#: sql_help.c:2162 sql_help.c:2172 sql_help.c:2198 sql_help.c:2229 +#: sql_help.c:2247 sql_help.c:2275 sql_help.c:2372 sql_help.c:2418 +#: sql_help.c:2443 sql_help.c:2466 sql_help.c:2470 sql_help.c:2504 +#: sql_help.c:2524 sql_help.c:2546 sql_help.c:2560 sql_help.c:2581 +#: sql_help.c:2610 sql_help.c:2645 sql_help.c:2670 sql_help.c:2717 +#: sql_help.c:3012 sql_help.c:3025 sql_help.c:3042 sql_help.c:3058 +#: sql_help.c:3098 sql_help.c:3152 sql_help.c:3156 sql_help.c:3158 +#: sql_help.c:3165 sql_help.c:3184 sql_help.c:3211 sql_help.c:3246 +#: sql_help.c:3258 sql_help.c:3267 sql_help.c:3311 sql_help.c:3325 +#: sql_help.c:3353 sql_help.c:3361 sql_help.c:3373 sql_help.c:3383 +#: sql_help.c:3391 sql_help.c:3399 sql_help.c:3407 sql_help.c:3415 +#: sql_help.c:3424 sql_help.c:3435 sql_help.c:3443 sql_help.c:3451 +#: sql_help.c:3459 sql_help.c:3467 sql_help.c:3477 sql_help.c:3486 +#: sql_help.c:3495 sql_help.c:3503 sql_help.c:3513 sql_help.c:3524 +#: sql_help.c:3532 sql_help.c:3541 sql_help.c:3552 sql_help.c:3561 +#: sql_help.c:3569 sql_help.c:3577 sql_help.c:3585 sql_help.c:3593 +#: sql_help.c:3601 sql_help.c:3609 sql_help.c:3617 sql_help.c:3625 +#: sql_help.c:3633 sql_help.c:3641 sql_help.c:3658 sql_help.c:3667 +#: sql_help.c:3675 sql_help.c:3692 sql_help.c:3707 sql_help.c:4017 +#: sql_help.c:4127 sql_help.c:4156 sql_help.c:4171 sql_help.c:4666 +#: sql_help.c:4714 sql_help.c:4865 msgid "name" msgstr "nom" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1812 -#: sql_help.c:3261 sql_help.c:4300 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 +#: sql_help.c:3326 sql_help.c:4442 msgid "aggregate_signature" msgstr "signature_agrégat" -#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:250 -#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:524 sql_help.c:572 -#: sql_help.c:590 sql_help.c:617 sql_help.c:668 sql_help.c:735 sql_help.c:790 -#: sql_help.c:811 sql_help.c:850 sql_help.c:895 sql_help.c:937 sql_help.c:989 -#: sql_help.c:1021 sql_help.c:1031 sql_help.c:1064 sql_help.c:1084 -#: sql_help.c:1098 sql_help.c:1144 sql_help.c:1287 sql_help.c:1410 -#: sql_help.c:1453 sql_help.c:1474 sql_help.c:1488 sql_help.c:1500 -#: sql_help.c:1513 sql_help.c:1540 sql_help.c:1606 sql_help.c:1659 +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253 +#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576 +#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798 +#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008 +#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105 +#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444 +#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534 +#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693 msgid "new_name" msgstr "nouveau_nom" -#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:120 sql_help.c:248 -#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:529 sql_help.c:619 -#: sql_help.c:628 sql_help.c:689 sql_help.c:709 sql_help.c:738 sql_help.c:793 -#: sql_help.c:855 sql_help.c:893 sql_help.c:994 sql_help.c:1033 sql_help.c:1062 -#: sql_help.c:1082 sql_help.c:1096 sql_help.c:1142 sql_help.c:1350 -#: sql_help.c:1412 sql_help.c:1455 sql_help.c:1476 sql_help.c:1538 -#: sql_help.c:1654 sql_help.c:2933 +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251 +#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623 +#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801 +#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052 +#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167 +#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510 +#: sql_help.c:1572 sql_help.c:1688 sql_help.c:2998 msgid "new_owner" msgstr "nouveau_propriétaire" -#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319 -#: sql_help.c:448 sql_help.c:534 sql_help.c:670 sql_help.c:713 sql_help.c:741 -#: sql_help.c:796 sql_help.c:860 sql_help.c:999 sql_help.c:1066 sql_help.c:1100 -#: sql_help.c:1289 sql_help.c:1457 sql_help.c:1478 sql_help.c:1490 -#: sql_help.c:1502 sql_help.c:1542 sql_help.c:1661 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322 +#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749 +#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087 +#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512 +#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695 msgid "new_schema" msgstr "nouveau_schéma" -#: sql_help.c:44 sql_help.c:1876 sql_help.c:3262 sql_help.c:4329 +#: sql_help.c:44 sql_help.c:1910 sql_help.c:3327 sql_help.c:4471 msgid "where aggregate_signature is:" msgstr "où signature_agrégat est :" -#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:337 sql_help.c:350 -#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:516 -#: sql_help.c:521 sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:842 -#: sql_help.c:847 sql_help.c:852 sql_help.c:857 sql_help.c:862 sql_help.c:981 -#: sql_help.c:986 sql_help.c:991 sql_help.c:996 sql_help.c:1001 sql_help.c:1830 -#: sql_help.c:1847 sql_help.c:1853 sql_help.c:1877 sql_help.c:1880 -#: sql_help.c:1883 sql_help.c:2032 sql_help.c:2051 sql_help.c:2054 -#: sql_help.c:2326 sql_help.c:2534 sql_help.c:3263 sql_help.c:3266 -#: sql_help.c:3269 sql_help.c:3360 sql_help.c:3449 sql_help.c:3477 -#: sql_help.c:3822 sql_help.c:4202 sql_help.c:4306 sql_help.c:4313 -#: sql_help.c:4319 sql_help.c:4330 sql_help.c:4333 sql_help.c:4336 +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353 +#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520 +#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850 +#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000 +#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020 +#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911 +#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2067 sql_help.c:2086 +#: sql_help.c:2089 sql_help.c:2373 sql_help.c:2582 sql_help.c:3328 +#: sql_help.c:3331 sql_help.c:3334 sql_help.c:3425 sql_help.c:3514 +#: sql_help.c:3542 sql_help.c:3892 sql_help.c:4341 sql_help.c:4448 +#: sql_help.c:4455 sql_help.c:4461 sql_help.c:4472 sql_help.c:4475 +#: sql_help.c:4478 msgid "argmode" msgstr "mode_argument" -#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:338 sql_help.c:351 -#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:843 -#: sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:863 sql_help.c:982 -#: sql_help.c:987 sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1831 -#: sql_help.c:1848 sql_help.c:1854 sql_help.c:1878 sql_help.c:1881 -#: sql_help.c:1884 sql_help.c:2033 sql_help.c:2052 sql_help.c:2055 -#: sql_help.c:2327 sql_help.c:2535 sql_help.c:3264 sql_help.c:3267 -#: sql_help.c:3270 sql_help.c:3361 sql_help.c:3450 sql_help.c:3478 -#: sql_help.c:4307 sql_help.c:4314 sql_help.c:4320 sql_help.c:4331 -#: sql_help.c:4334 sql_help.c:4337 +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354 +#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521 +#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 +#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001 +#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 +#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912 +#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2068 sql_help.c:2087 +#: sql_help.c:2090 sql_help.c:2374 sql_help.c:2583 sql_help.c:3329 +#: sql_help.c:3332 sql_help.c:3335 sql_help.c:3426 sql_help.c:3515 +#: sql_help.c:3543 sql_help.c:4449 sql_help.c:4456 sql_help.c:4462 +#: sql_help.c:4473 sql_help.c:4476 sql_help.c:4479 msgid "argname" msgstr "nom_agrégat" -#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:339 sql_help.c:352 -#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:844 -#: sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:864 sql_help.c:983 -#: sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1003 sql_help.c:1832 -#: sql_help.c:1849 sql_help.c:1855 sql_help.c:1879 sql_help.c:1882 -#: sql_help.c:1885 sql_help.c:2328 sql_help.c:2536 sql_help.c:3265 -#: sql_help.c:3268 sql_help.c:3271 sql_help.c:3362 sql_help.c:3451 -#: sql_help.c:3479 sql_help.c:4308 sql_help.c:4315 sql_help.c:4321 -#: sql_help.c:4332 sql_help.c:4335 sql_help.c:4338 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355 +#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522 +#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 +#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002 +#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 +#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 +#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2375 sql_help.c:2584 +#: sql_help.c:3330 sql_help.c:3333 sql_help.c:3336 sql_help.c:3427 +#: sql_help.c:3516 sql_help.c:3544 sql_help.c:4450 sql_help.c:4457 +#: sql_help.c:4463 sql_help.c:4474 sql_help.c:4477 sql_help.c:4480 msgid "argtype" msgstr "type_argument" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:931 -#: sql_help.c:1079 sql_help.c:1471 sql_help.c:1600 sql_help.c:1632 -#: sql_help.c:1684 sql_help.c:1747 sql_help.c:1933 sql_help.c:1940 -#: sql_help.c:2232 sql_help.c:2274 sql_help.c:2281 sql_help.c:2290 -#: sql_help.c:2372 sql_help.c:2588 sql_help.c:2681 sql_help.c:2962 -#: sql_help.c:3147 sql_help.c:3169 sql_help.c:3309 sql_help.c:3664 -#: sql_help.c:3863 sql_help.c:4038 sql_help.c:4786 +#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949 +#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666 +#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974 +#: sql_help.c:2278 sql_help.c:2320 sql_help.c:2327 sql_help.c:2336 +#: sql_help.c:2419 sql_help.c:2646 sql_help.c:2739 sql_help.c:3027 +#: sql_help.c:3212 sql_help.c:3234 sql_help.c:3374 sql_help.c:3729 +#: sql_help.c:3936 sql_help.c:4170 sql_help.c:4928 msgid "option" msgstr "option" -#: sql_help.c:113 sql_help.c:932 sql_help.c:1601 sql_help.c:2373 -#: sql_help.c:2589 sql_help.c:3148 sql_help.c:3310 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2420 +#: sql_help.c:2647 sql_help.c:3213 sql_help.c:3375 msgid "where option can be:" msgstr "où option peut être :" -#: sql_help.c:114 sql_help.c:2166 +#: sql_help.c:116 sql_help.c:2210 msgid "allowconn" msgstr "allowconn" -#: sql_help.c:115 sql_help.c:933 sql_help.c:1602 sql_help.c:2167 -#: sql_help.c:2374 sql_help.c:2590 sql_help.c:3149 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2211 +#: sql_help.c:2421 sql_help.c:2648 sql_help.c:3214 msgid "connlimit" msgstr "limite_de_connexion" -#: sql_help.c:116 sql_help.c:2168 +#: sql_help.c:118 sql_help.c:2212 msgid "istemplate" msgstr "istemplate" -#: sql_help.c:122 sql_help.c:607 sql_help.c:673 sql_help.c:1292 sql_help.c:1343 -#: sql_help.c:4042 +#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322 +#: sql_help.c:1374 sql_help.c:4174 msgid "new_tablespace" msgstr "nouveau_tablespace" -#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:544 sql_help.c:546 -#: sql_help.c:547 sql_help.c:867 sql_help.c:869 sql_help.c:870 sql_help.c:940 -#: sql_help.c:944 sql_help.c:947 sql_help.c:1008 sql_help.c:1010 -#: sql_help.c:1011 sql_help.c:1155 sql_help.c:1158 sql_help.c:1609 -#: sql_help.c:1613 sql_help.c:1616 sql_help.c:2338 sql_help.c:2540 -#: sql_help.c:4060 sql_help.c:4513 +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550 +#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958 +#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029 +#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643 +#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2385 sql_help.c:2588 +#: sql_help.c:3904 sql_help.c:4192 sql_help.c:4353 sql_help.c:4655 msgid "configuration_parameter" msgstr "paramètre_configuration" -#: sql_help.c:125 sql_help.c:395 sql_help.c:466 sql_help.c:472 sql_help.c:484 -#: sql_help.c:545 sql_help.c:599 sql_help.c:679 sql_help.c:687 sql_help.c:868 -#: sql_help.c:891 sql_help.c:941 sql_help.c:1009 sql_help.c:1080 -#: sql_help.c:1124 sql_help.c:1128 sql_help.c:1132 sql_help.c:1135 -#: sql_help.c:1140 sql_help.c:1156 sql_help.c:1157 sql_help.c:1323 -#: sql_help.c:1345 sql_help.c:1393 sql_help.c:1415 sql_help.c:1472 -#: sql_help.c:1556 sql_help.c:1610 sql_help.c:1633 sql_help.c:2233 -#: sql_help.c:2275 sql_help.c:2282 sql_help.c:2291 sql_help.c:2339 -#: sql_help.c:2340 sql_help.c:2403 sql_help.c:2406 sql_help.c:2440 -#: sql_help.c:2541 sql_help.c:2542 sql_help.c:2560 sql_help.c:2682 -#: sql_help.c:2721 sql_help.c:2827 sql_help.c:2840 sql_help.c:2854 -#: sql_help.c:2895 sql_help.c:2919 sql_help.c:2936 sql_help.c:2963 -#: sql_help.c:3170 sql_help.c:3864 sql_help.c:4514 sql_help.c:4515 +#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487 +#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876 +#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101 +#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157 +#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182 +#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449 +#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667 +#: sql_help.c:2279 sql_help.c:2321 sql_help.c:2328 sql_help.c:2337 +#: sql_help.c:2386 sql_help.c:2387 sql_help.c:2451 sql_help.c:2454 +#: sql_help.c:2488 sql_help.c:2589 sql_help.c:2590 sql_help.c:2613 +#: sql_help.c:2740 sql_help.c:2779 sql_help.c:2889 sql_help.c:2902 +#: sql_help.c:2916 sql_help.c:2957 sql_help.c:2984 sql_help.c:3001 +#: sql_help.c:3028 sql_help.c:3235 sql_help.c:3937 sql_help.c:4656 +#: sql_help.c:4657 msgid "value" msgstr "valeur" -#: sql_help.c:197 +#: sql_help.c:200 msgid "target_role" msgstr "rôle_cible" -#: sql_help.c:198 sql_help.c:2217 sql_help.c:2637 sql_help.c:2642 -#: sql_help.c:3797 sql_help.c:3806 sql_help.c:3825 sql_help.c:3834 -#: sql_help.c:4177 sql_help.c:4186 sql_help.c:4205 sql_help.c:4214 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2263 sql_help.c:2618 +#: sql_help.c:2695 sql_help.c:2700 sql_help.c:3867 sql_help.c:3876 +#: sql_help.c:3895 sql_help.c:3907 sql_help.c:4316 sql_help.c:4325 +#: sql_help.c:4344 sql_help.c:4356 msgid "schema_name" msgstr "nom_schéma" -#: sql_help.c:199 +#: sql_help.c:202 msgid "abbreviated_grant_or_revoke" msgstr "grant_ou_revoke_raccourci" -#: sql_help.c:200 +#: sql_help.c:203 msgid "where abbreviated_grant_or_revoke is one of:" msgstr "où abbreviated_grant_or_revoke fait partie de :" -#: sql_help.c:201 sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205 -#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 -#: sql_help.c:570 sql_help.c:606 sql_help.c:672 sql_help.c:814 sql_help.c:951 -#: sql_help.c:1291 sql_help.c:1620 sql_help.c:2377 sql_help.c:2378 -#: sql_help.c:2379 sql_help.c:2380 sql_help.c:2381 sql_help.c:2514 -#: sql_help.c:2593 sql_help.c:2594 sql_help.c:2595 sql_help.c:2596 -#: sql_help.c:2597 sql_help.c:3152 sql_help.c:3153 sql_help.c:3154 -#: sql_help.c:3155 sql_help.c:3156 sql_help.c:3843 sql_help.c:3847 -#: sql_help.c:4223 sql_help.c:4227 sql_help.c:4534 +#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 +#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 +#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969 +#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2424 sql_help.c:2425 +#: sql_help.c:2426 sql_help.c:2427 sql_help.c:2428 sql_help.c:2562 +#: sql_help.c:2651 sql_help.c:2652 sql_help.c:2653 sql_help.c:2654 +#: sql_help.c:2655 sql_help.c:3217 sql_help.c:3218 sql_help.c:3219 +#: sql_help.c:3220 sql_help.c:3221 sql_help.c:3916 sql_help.c:3920 +#: sql_help.c:4365 sql_help.c:4369 sql_help.c:4676 msgid "role_name" msgstr "nom_rôle" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1307 sql_help.c:1309 -#: sql_help.c:1360 sql_help.c:1372 sql_help.c:1397 sql_help.c:1650 -#: sql_help.c:2187 sql_help.c:2191 sql_help.c:2294 sql_help.c:2299 -#: sql_help.c:2399 sql_help.c:2698 sql_help.c:2703 sql_help.c:2705 -#: sql_help.c:2822 sql_help.c:2835 sql_help.c:2849 sql_help.c:2858 -#: sql_help.c:2870 sql_help.c:2899 sql_help.c:3895 sql_help.c:3910 -#: sql_help.c:3912 sql_help.c:4391 sql_help.c:4392 sql_help.c:4401 -#: sql_help.c:4443 sql_help.c:4444 sql_help.c:4445 sql_help.c:4446 -#: sql_help.c:4447 sql_help.c:4448 sql_help.c:4488 sql_help.c:4489 -#: sql_help.c:4494 sql_help.c:4499 sql_help.c:4640 sql_help.c:4641 -#: sql_help.c:4650 sql_help.c:4692 sql_help.c:4693 sql_help.c:4694 -#: sql_help.c:4695 sql_help.c:4696 sql_help.c:4697 sql_help.c:4751 -#: sql_help.c:4753 sql_help.c:4814 sql_help.c:4872 sql_help.c:4873 -#: sql_help.c:4882 sql_help.c:4924 sql_help.c:4925 sql_help.c:4926 -#: sql_help.c:4927 sql_help.c:4928 sql_help.c:4929 +#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339 +#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684 +#: sql_help.c:2232 sql_help.c:2236 sql_help.c:2340 sql_help.c:2345 +#: sql_help.c:2447 sql_help.c:2617 sql_help.c:2756 sql_help.c:2761 +#: sql_help.c:2763 sql_help.c:2884 sql_help.c:2897 sql_help.c:2911 +#: sql_help.c:2920 sql_help.c:2932 sql_help.c:2961 sql_help.c:3968 +#: sql_help.c:3983 sql_help.c:3985 sql_help.c:4072 sql_help.c:4075 +#: sql_help.c:4077 sql_help.c:4533 sql_help.c:4534 sql_help.c:4543 +#: sql_help.c:4585 sql_help.c:4586 sql_help.c:4587 sql_help.c:4588 +#: sql_help.c:4589 sql_help.c:4590 sql_help.c:4630 sql_help.c:4631 +#: sql_help.c:4636 sql_help.c:4641 sql_help.c:4782 sql_help.c:4783 +#: sql_help.c:4792 sql_help.c:4834 sql_help.c:4835 sql_help.c:4836 +#: sql_help.c:4837 sql_help.c:4838 sql_help.c:4839 sql_help.c:4893 +#: sql_help.c:4895 sql_help.c:4955 sql_help.c:5013 sql_help.c:5014 +#: sql_help.c:5023 sql_help.c:5065 sql_help.c:5066 sql_help.c:5067 +#: sql_help.c:5068 sql_help.c:5069 sql_help.c:5070 msgid "expression" msgstr "expression" -#: sql_help.c:239 +#: sql_help.c:242 msgid "domain_constraint" msgstr "contrainte_domaine" -#: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475 -#: sql_help.c:1284 sql_help.c:1331 sql_help.c:1332 sql_help.c:1333 -#: sql_help.c:1359 sql_help.c:1371 sql_help.c:1388 sql_help.c:1818 -#: sql_help.c:1820 sql_help.c:2190 sql_help.c:2293 sql_help.c:2298 -#: sql_help.c:2857 sql_help.c:2869 sql_help.c:3907 +#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 +#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363 +#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852 +#: sql_help.c:1854 sql_help.c:2235 sql_help.c:2339 sql_help.c:2344 +#: sql_help.c:2919 sql_help.c:2931 sql_help.c:3980 msgid "constraint_name" msgstr "nom_contrainte" -#: sql_help.c:244 sql_help.c:1285 +#: sql_help.c:247 sql_help.c:1315 msgid "new_constraint_name" msgstr "nouvelle_nom_contrainte" -#: sql_help.c:317 sql_help.c:1078 +#: sql_help.c:320 sql_help.c:1099 msgid "new_version" msgstr "nouvelle_version" -#: sql_help.c:321 sql_help.c:323 +#: sql_help.c:324 sql_help.c:326 msgid "member_object" msgstr "objet_membre" -#: sql_help.c:324 +#: sql_help.c:327 msgid "where member_object is:" msgstr "où objet_membre fait partie de :" -#: sql_help.c:325 sql_help.c:330 sql_help.c:331 sql_help.c:332 sql_help.c:333 -#: sql_help.c:334 sql_help.c:335 sql_help.c:340 sql_help.c:344 sql_help.c:346 -#: sql_help.c:348 sql_help.c:357 sql_help.c:358 sql_help.c:359 sql_help.c:360 -#: sql_help.c:361 sql_help.c:362 sql_help.c:363 sql_help.c:364 sql_help.c:367 -#: sql_help.c:368 sql_help.c:1810 sql_help.c:1815 sql_help.c:1822 -#: sql_help.c:1823 sql_help.c:1824 sql_help.c:1825 sql_help.c:1826 -#: sql_help.c:1827 sql_help.c:1828 sql_help.c:1833 sql_help.c:1835 -#: sql_help.c:1839 sql_help.c:1841 sql_help.c:1845 sql_help.c:1850 -#: sql_help.c:1851 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 -#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1863 sql_help.c:1864 -#: sql_help.c:1865 sql_help.c:1866 sql_help.c:1867 sql_help.c:1868 -#: sql_help.c:1873 sql_help.c:1874 sql_help.c:4296 sql_help.c:4301 -#: sql_help.c:4302 sql_help.c:4303 sql_help.c:4304 sql_help.c:4310 -#: sql_help.c:4311 sql_help.c:4316 sql_help.c:4317 sql_help.c:4322 -#: sql_help.c:4323 sql_help.c:4324 sql_help.c:4325 sql_help.c:4326 -#: sql_help.c:4327 +#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336 +#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349 +#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363 +#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370 +#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856 +#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 +#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869 +#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884 +#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894 +#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898 +#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902 +#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4438 sql_help.c:4443 +#: sql_help.c:4444 sql_help.c:4445 sql_help.c:4446 sql_help.c:4452 +#: sql_help.c:4453 sql_help.c:4458 sql_help.c:4459 sql_help.c:4464 +#: sql_help.c:4465 sql_help.c:4466 sql_help.c:4467 sql_help.c:4468 +#: sql_help.c:4469 msgid "object_name" msgstr "nom_objet" -#: sql_help.c:326 sql_help.c:1811 sql_help.c:4299 +#: sql_help.c:329 sql_help.c:1845 sql_help.c:4441 msgid "aggregate_name" msgstr "nom_agrégat" -#: sql_help.c:328 sql_help.c:1813 sql_help.c:2097 sql_help.c:2101 -#: sql_help.c:2103 sql_help.c:3279 +#: sql_help.c:331 sql_help.c:1847 sql_help.c:2132 sql_help.c:2136 +#: sql_help.c:2138 sql_help.c:3344 msgid "source_type" msgstr "type_source" -#: sql_help.c:329 sql_help.c:1814 sql_help.c:2098 sql_help.c:2102 -#: sql_help.c:2104 sql_help.c:3280 +#: sql_help.c:332 sql_help.c:1848 sql_help.c:2133 sql_help.c:2137 +#: sql_help.c:2139 sql_help.c:3345 msgid "target_type" msgstr "type_cible" -#: sql_help.c:336 sql_help.c:778 sql_help.c:1829 sql_help.c:2099 -#: sql_help.c:2140 sql_help.c:2205 sql_help.c:2457 sql_help.c:2488 -#: sql_help.c:3039 sql_help.c:4201 sql_help.c:4305 sql_help.c:4420 -#: sql_help.c:4424 sql_help.c:4428 sql_help.c:4431 sql_help.c:4669 -#: sql_help.c:4673 sql_help.c:4677 sql_help.c:4680 sql_help.c:4901 -#: sql_help.c:4905 sql_help.c:4909 sql_help.c:4912 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2134 +#: sql_help.c:2175 sql_help.c:2251 sql_help.c:2505 sql_help.c:2536 +#: sql_help.c:3104 sql_help.c:4340 sql_help.c:4447 sql_help.c:4562 +#: sql_help.c:4566 sql_help.c:4570 sql_help.c:4573 sql_help.c:4811 +#: sql_help.c:4815 sql_help.c:4819 sql_help.c:4822 sql_help.c:5042 +#: sql_help.c:5046 sql_help.c:5050 sql_help.c:5053 msgid "function_name" msgstr "nom_fonction" -#: sql_help.c:341 sql_help.c:771 sql_help.c:1836 sql_help.c:2481 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2529 msgid "operator_name" msgstr "nom_opérateur" -#: sql_help.c:342 sql_help.c:707 sql_help.c:711 sql_help.c:715 sql_help.c:1837 -#: sql_help.c:2458 sql_help.c:3403 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 +#: sql_help.c:2506 sql_help.c:3468 msgid "left_type" msgstr "type_argument_gauche" -#: sql_help.c:343 sql_help.c:708 sql_help.c:712 sql_help.c:716 sql_help.c:1838 -#: sql_help.c:2459 sql_help.c:3404 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 +#: sql_help.c:2507 sql_help.c:3469 msgid "right_type" msgstr "type_argument_droit" -#: sql_help.c:345 sql_help.c:347 sql_help.c:734 sql_help.c:737 sql_help.c:740 -#: sql_help.c:769 sql_help.c:781 sql_help.c:789 sql_help.c:792 sql_help.c:795 -#: sql_help.c:1377 sql_help.c:1840 sql_help.c:1842 sql_help.c:2478 -#: sql_help.c:2499 sql_help.c:2875 sql_help.c:3413 sql_help.c:3422 +#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748 +#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 +#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2526 +#: sql_help.c:2547 sql_help.c:2937 sql_help.c:3478 sql_help.c:3487 msgid "index_method" msgstr "méthode_indexage" -#: sql_help.c:349 sql_help.c:1846 sql_help.c:4312 +#: sql_help.c:352 sql_help.c:1880 sql_help.c:4454 msgid "procedure_name" msgstr "nom_procédure" -#: sql_help.c:353 sql_help.c:1852 sql_help.c:3821 sql_help.c:4318 +#: sql_help.c:356 sql_help.c:1886 sql_help.c:3891 sql_help.c:4460 msgid "routine_name" msgstr "nom_routine" -#: sql_help.c:365 sql_help.c:1349 sql_help.c:1869 sql_help.c:2334 -#: sql_help.c:2539 sql_help.c:2830 sql_help.c:3006 sql_help.c:3584 -#: sql_help.c:3840 sql_help.c:4220 +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2381 +#: sql_help.c:2587 sql_help.c:2892 sql_help.c:3071 sql_help.c:3649 +#: sql_help.c:3913 sql_help.c:4362 msgid "type_name" msgstr "nom_type" -#: sql_help.c:366 sql_help.c:1870 sql_help.c:2333 sql_help.c:2538 -#: sql_help.c:3007 sql_help.c:3237 sql_help.c:3585 sql_help.c:3828 -#: sql_help.c:4208 +#: sql_help.c:369 sql_help.c:1904 sql_help.c:2380 sql_help.c:2586 +#: sql_help.c:3072 sql_help.c:3302 sql_help.c:3650 sql_help.c:3898 +#: sql_help.c:4347 msgid "lang_name" msgstr "nom_langage" -#: sql_help.c:369 +#: sql_help.c:372 msgid "and aggregate_signature is:" msgstr "et signature_agrégat est :" -#: sql_help.c:392 sql_help.c:1964 sql_help.c:2230 +#: sql_help.c:395 sql_help.c:1999 sql_help.c:2276 msgid "handler_function" msgstr "fonction_gestionnaire" -#: sql_help.c:393 sql_help.c:2231 +#: sql_help.c:396 sql_help.c:2277 msgid "validator_function" msgstr "fonction_validateur" -#: sql_help.c:441 sql_help.c:519 sql_help.c:661 sql_help.c:845 sql_help.c:984 -#: sql_help.c:1279 sql_help.c:1547 +#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003 +#: sql_help.c:1309 sql_help.c:1581 msgid "action" msgstr "action" -#: sql_help.c:443 sql_help.c:450 sql_help.c:454 sql_help.c:455 sql_help.c:458 -#: sql_help.c:460 sql_help.c:461 sql_help.c:462 sql_help.c:464 sql_help.c:467 -#: sql_help.c:469 sql_help.c:470 sql_help.c:665 sql_help.c:675 sql_help.c:677 -#: sql_help.c:680 sql_help.c:682 sql_help.c:683 sql_help.c:1060 sql_help.c:1281 -#: sql_help.c:1299 sql_help.c:1303 sql_help.c:1304 sql_help.c:1308 -#: sql_help.c:1310 sql_help.c:1311 sql_help.c:1312 sql_help.c:1313 -#: sql_help.c:1315 sql_help.c:1318 sql_help.c:1319 sql_help.c:1321 -#: sql_help.c:1324 sql_help.c:1326 sql_help.c:1327 sql_help.c:1373 -#: sql_help.c:1375 sql_help.c:1382 sql_help.c:1391 sql_help.c:1396 -#: sql_help.c:1649 sql_help.c:1652 sql_help.c:1656 sql_help.c:1692 -#: sql_help.c:1817 sql_help.c:1930 sql_help.c:1936 sql_help.c:1949 -#: sql_help.c:1950 sql_help.c:1951 sql_help.c:2272 sql_help.c:2285 -#: sql_help.c:2331 sql_help.c:2398 sql_help.c:2404 sql_help.c:2437 -#: sql_help.c:2667 sql_help.c:2702 sql_help.c:2704 sql_help.c:2812 -#: sql_help.c:2821 sql_help.c:2831 sql_help.c:2834 sql_help.c:2844 -#: sql_help.c:2848 sql_help.c:2871 sql_help.c:2873 sql_help.c:2880 -#: sql_help.c:2893 sql_help.c:2898 sql_help.c:2916 sql_help.c:3042 -#: sql_help.c:3182 sql_help.c:3800 sql_help.c:3801 sql_help.c:3894 -#: sql_help.c:3909 sql_help.c:3911 sql_help.c:3913 sql_help.c:4180 -#: sql_help.c:4181 sql_help.c:4298 sql_help.c:4452 sql_help.c:4458 -#: sql_help.c:4460 sql_help.c:4701 sql_help.c:4707 sql_help.c:4709 -#: sql_help.c:4750 sql_help.c:4752 sql_help.c:4754 sql_help.c:4802 -#: sql_help.c:4933 sql_help.c:4939 sql_help.c:4941 +#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461 +#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470 +#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683 +#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080 +#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334 +#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 +#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349 +#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 +#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422 +#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683 +#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851 +#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1984 sql_help.c:1985 +#: sql_help.c:1986 sql_help.c:2318 sql_help.c:2331 sql_help.c:2378 +#: sql_help.c:2446 sql_help.c:2452 sql_help.c:2485 sql_help.c:2616 +#: sql_help.c:2725 sql_help.c:2760 sql_help.c:2762 sql_help.c:2874 +#: sql_help.c:2883 sql_help.c:2893 sql_help.c:2896 sql_help.c:2906 +#: sql_help.c:2910 sql_help.c:2933 sql_help.c:2935 sql_help.c:2942 +#: sql_help.c:2955 sql_help.c:2960 sql_help.c:2964 sql_help.c:2965 +#: sql_help.c:2981 sql_help.c:3107 sql_help.c:3247 sql_help.c:3870 +#: sql_help.c:3871 sql_help.c:3967 sql_help.c:3982 sql_help.c:3984 +#: sql_help.c:3986 sql_help.c:4071 sql_help.c:4074 sql_help.c:4076 +#: sql_help.c:4319 sql_help.c:4320 sql_help.c:4440 sql_help.c:4594 +#: sql_help.c:4600 sql_help.c:4602 sql_help.c:4843 sql_help.c:4849 +#: sql_help.c:4851 sql_help.c:4892 sql_help.c:4894 sql_help.c:4896 +#: sql_help.c:4943 sql_help.c:5074 sql_help.c:5080 sql_help.c:5082 msgid "column_name" msgstr "nom_colonne" -#: sql_help.c:444 sql_help.c:666 sql_help.c:1282 sql_help.c:1657 +#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 msgid "new_column_name" msgstr "nouvelle_nom_colonne" -#: sql_help.c:449 sql_help.c:540 sql_help.c:674 sql_help.c:866 sql_help.c:1005 -#: sql_help.c:1298 sql_help.c:1557 +#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024 +#: sql_help.c:1328 sql_help.c:1591 msgid "where action is one of:" msgstr "où action fait partie de :" -#: sql_help.c:451 sql_help.c:456 sql_help.c:1052 sql_help.c:1300 -#: sql_help.c:1305 sql_help.c:1559 sql_help.c:1563 sql_help.c:2185 -#: sql_help.c:2273 sql_help.c:2477 sql_help.c:2660 sql_help.c:2813 -#: sql_help.c:3089 sql_help.c:3996 +#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330 +#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2230 +#: sql_help.c:2319 sql_help.c:2525 sql_help.c:2718 sql_help.c:2875 +#: sql_help.c:3154 sql_help.c:4128 msgid "data_type" msgstr "type_données" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1301 sql_help.c:1306 -#: sql_help.c:1560 sql_help.c:1564 sql_help.c:2186 sql_help.c:2276 -#: sql_help.c:2400 sql_help.c:2815 sql_help.c:2823 sql_help.c:2836 -#: sql_help.c:2850 sql_help.c:3090 sql_help.c:3096 sql_help.c:3904 +#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336 +#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2231 sql_help.c:2322 +#: sql_help.c:2448 sql_help.c:2877 sql_help.c:2885 sql_help.c:2898 +#: sql_help.c:2912 sql_help.c:3155 sql_help.c:3161 sql_help.c:3977 msgid "collation" msgstr "collationnement" -#: sql_help.c:453 sql_help.c:1302 sql_help.c:2277 sql_help.c:2286 -#: sql_help.c:2816 sql_help.c:2832 sql_help.c:2845 +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2323 sql_help.c:2332 +#: sql_help.c:2878 sql_help.c:2894 sql_help.c:2907 msgid "column_constraint" msgstr "contrainte_colonne" -#: sql_help.c:463 sql_help.c:604 sql_help.c:676 sql_help.c:1320 sql_help.c:4799 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4940 msgid "integer" msgstr "entier" -#: sql_help.c:465 sql_help.c:468 sql_help.c:678 sql_help.c:681 sql_help.c:1322 -#: sql_help.c:1325 +#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352 +#: sql_help.c:1355 msgid "attribute_option" msgstr "option_attribut" -#: sql_help.c:473 sql_help.c:1329 sql_help.c:2278 sql_help.c:2287 -#: sql_help.c:2817 sql_help.c:2833 sql_help.c:2846 +#: sql_help.c:476 sql_help.c:1359 sql_help.c:2324 sql_help.c:2333 +#: sql_help.c:2879 sql_help.c:2895 sql_help.c:2908 msgid "table_constraint" msgstr "contrainte_table" -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1334 -#: sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 sql_help.c:1871 +#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364 +#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905 msgid "trigger_name" msgstr "nom_trigger" -#: sql_help.c:480 sql_help.c:481 sql_help.c:1347 sql_help.c:1348 -#: sql_help.c:2279 sql_help.c:2284 sql_help.c:2820 sql_help.c:2843 +#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 +#: sql_help.c:2325 sql_help.c:2330 sql_help.c:2882 sql_help.c:2905 msgid "parent_table" msgstr "table_parent" -#: sql_help.c:539 sql_help.c:596 sql_help.c:663 sql_help.c:865 sql_help.c:1004 -#: sql_help.c:1516 sql_help.c:2216 +#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 +#: sql_help.c:1550 sql_help.c:2262 msgid "extension_name" msgstr "nom_extension" -#: sql_help.c:541 sql_help.c:1006 sql_help.c:2335 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2382 msgid "execution_cost" msgstr "coût_exécution" -#: sql_help.c:542 sql_help.c:1007 sql_help.c:2336 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2383 msgid "result_rows" msgstr "lignes_de_résultat" -#: sql_help.c:543 sql_help.c:2337 +#: sql_help.c:547 sql_help.c:2384 msgid "support_function" msgstr "fonction_support" -#: sql_help.c:565 sql_help.c:567 sql_help.c:930 sql_help.c:938 sql_help.c:942 -#: sql_help.c:945 sql_help.c:948 sql_help.c:1599 sql_help.c:1607 -#: sql_help.c:1611 sql_help.c:1614 sql_help.c:1617 sql_help.c:2638 -#: sql_help.c:2640 sql_help.c:2643 sql_help.c:2644 sql_help.c:3798 -#: sql_help.c:3799 sql_help.c:3803 sql_help.c:3804 sql_help.c:3807 -#: sql_help.c:3808 sql_help.c:3810 sql_help.c:3811 sql_help.c:3813 -#: sql_help.c:3814 sql_help.c:3816 sql_help.c:3817 sql_help.c:3819 -#: sql_help.c:3820 sql_help.c:3826 sql_help.c:3827 sql_help.c:3829 -#: sql_help.c:3830 sql_help.c:3832 sql_help.c:3833 sql_help.c:3835 -#: sql_help.c:3836 sql_help.c:3838 sql_help.c:3839 sql_help.c:3841 -#: sql_help.c:3842 sql_help.c:3844 sql_help.c:3845 sql_help.c:4178 -#: sql_help.c:4179 sql_help.c:4183 sql_help.c:4184 sql_help.c:4187 -#: sql_help.c:4188 sql_help.c:4190 sql_help.c:4191 sql_help.c:4193 -#: sql_help.c:4194 sql_help.c:4196 sql_help.c:4197 sql_help.c:4199 -#: sql_help.c:4200 sql_help.c:4206 sql_help.c:4207 sql_help.c:4209 -#: sql_help.c:4210 sql_help.c:4212 sql_help.c:4213 sql_help.c:4215 -#: sql_help.c:4216 sql_help.c:4218 sql_help.c:4219 sql_help.c:4221 -#: sql_help.c:4222 sql_help.c:4224 sql_help.c:4225 +#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960 +#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641 +#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2696 +#: sql_help.c:2698 sql_help.c:2701 sql_help.c:2702 sql_help.c:3868 +#: sql_help.c:3869 sql_help.c:3873 sql_help.c:3874 sql_help.c:3877 +#: sql_help.c:3878 sql_help.c:3880 sql_help.c:3881 sql_help.c:3883 +#: sql_help.c:3884 sql_help.c:3886 sql_help.c:3887 sql_help.c:3889 +#: sql_help.c:3890 sql_help.c:3896 sql_help.c:3897 sql_help.c:3899 +#: sql_help.c:3900 sql_help.c:3902 sql_help.c:3903 sql_help.c:3905 +#: sql_help.c:3906 sql_help.c:3908 sql_help.c:3909 sql_help.c:3911 +#: sql_help.c:3912 sql_help.c:3914 sql_help.c:3915 sql_help.c:3917 +#: sql_help.c:3918 sql_help.c:4317 sql_help.c:4318 sql_help.c:4322 +#: sql_help.c:4323 sql_help.c:4326 sql_help.c:4327 sql_help.c:4329 +#: sql_help.c:4330 sql_help.c:4332 sql_help.c:4333 sql_help.c:4335 +#: sql_help.c:4336 sql_help.c:4338 sql_help.c:4339 sql_help.c:4345 +#: sql_help.c:4346 sql_help.c:4348 sql_help.c:4349 sql_help.c:4351 +#: sql_help.c:4352 sql_help.c:4354 sql_help.c:4355 sql_help.c:4357 +#: sql_help.c:4358 sql_help.c:4360 sql_help.c:4361 sql_help.c:4363 +#: sql_help.c:4364 sql_help.c:4366 sql_help.c:4367 msgid "role_specification" msgstr "specification_role" -#: sql_help.c:566 sql_help.c:568 sql_help.c:1630 sql_help.c:2159 -#: sql_help.c:2646 sql_help.c:3167 sql_help.c:3618 sql_help.c:4544 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2199 +#: sql_help.c:2704 sql_help.c:3232 sql_help.c:3683 sql_help.c:4686 msgid "user_name" msgstr "nom_utilisateur" -#: sql_help.c:569 sql_help.c:950 sql_help.c:1619 sql_help.c:2645 -#: sql_help.c:3846 sql_help.c:4226 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2703 +#: sql_help.c:3919 sql_help.c:4368 msgid "where role_specification can be:" msgstr "où specification_role peut être :" -#: sql_help.c:571 +#: sql_help.c:575 msgid "group_name" msgstr "nom_groupe" -#: sql_help.c:592 sql_help.c:1394 sql_help.c:2165 sql_help.c:2407 -#: sql_help.c:2441 sql_help.c:2828 sql_help.c:2841 sql_help.c:2855 -#: sql_help.c:2896 sql_help.c:2920 sql_help.c:2932 sql_help.c:3837 -#: sql_help.c:4217 +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2209 sql_help.c:2455 +#: sql_help.c:2489 sql_help.c:2890 sql_help.c:2903 sql_help.c:2917 +#: sql_help.c:2958 sql_help.c:2985 sql_help.c:2997 sql_help.c:3910 +#: sql_help.c:4359 msgid "tablespace_name" msgstr "nom_tablespace" -#: sql_help.c:594 sql_help.c:685 sql_help.c:1342 sql_help.c:1351 -#: sql_help.c:1389 sql_help.c:1746 sql_help.c:1749 +#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382 +#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783 msgid "index_name" msgstr "nom_index" -#: sql_help.c:598 sql_help.c:601 sql_help.c:686 sql_help.c:688 sql_help.c:1344 -#: sql_help.c:1346 sql_help.c:1392 sql_help.c:2405 sql_help.c:2439 -#: sql_help.c:2826 sql_help.c:2839 sql_help.c:2853 sql_help.c:2894 -#: sql_help.c:2918 +#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375 +#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2453 sql_help.c:2487 +#: sql_help.c:2888 sql_help.c:2901 sql_help.c:2915 sql_help.c:2956 +#: sql_help.c:2983 msgid "storage_parameter" msgstr "paramètre_stockage" -#: sql_help.c:603 +#: sql_help.c:607 msgid "column_number" msgstr "numéro_colonne" -#: sql_help.c:627 sql_help.c:1834 sql_help.c:4309 +#: sql_help.c:631 sql_help.c:1868 sql_help.c:4451 msgid "large_object_oid" msgstr "oid_large_object" -#: sql_help.c:684 sql_help.c:1328 sql_help.c:2814 +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2876 msgid "compression_method" msgstr "méthode_compression" -#: sql_help.c:717 sql_help.c:2462 +#: sql_help.c:692 sql_help.c:1373 +msgid "new_access_method" +msgstr "new_access_method" + +#: sql_help.c:725 sql_help.c:2510 msgid "res_proc" msgstr "res_proc" -#: sql_help.c:718 sql_help.c:2463 +#: sql_help.c:726 sql_help.c:2511 msgid "join_proc" msgstr "join_proc" -#: sql_help.c:770 sql_help.c:782 sql_help.c:2480 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2528 msgid "strategy_number" msgstr "numéro_de_stratégie" -#: sql_help.c:772 sql_help.c:773 sql_help.c:776 sql_help.c:777 sql_help.c:783 -#: sql_help.c:784 sql_help.c:786 sql_help.c:787 sql_help.c:2482 sql_help.c:2483 -#: sql_help.c:2486 sql_help.c:2487 +#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791 +#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2530 sql_help.c:2531 +#: sql_help.c:2534 sql_help.c:2535 msgid "op_type" msgstr "type_op" -#: sql_help.c:774 sql_help.c:2484 +#: sql_help.c:782 sql_help.c:2532 msgid "sort_family_name" msgstr "nom_famille_tri" -#: sql_help.c:775 sql_help.c:785 sql_help.c:2485 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2533 msgid "support_number" msgstr "numéro_de_support" -#: sql_help.c:779 sql_help.c:2100 sql_help.c:2489 sql_help.c:3009 -#: sql_help.c:3011 +#: sql_help.c:787 sql_help.c:2135 sql_help.c:2537 sql_help.c:3074 +#: sql_help.c:3076 msgid "argument_type" msgstr "type_argument" -#: sql_help.c:810 sql_help.c:813 sql_help.c:884 sql_help.c:886 sql_help.c:888 -#: sql_help.c:1020 sql_help.c:1059 sql_help.c:1512 sql_help.c:1515 -#: sql_help.c:1691 sql_help.c:1745 sql_help.c:1748 sql_help.c:1819 -#: sql_help.c:1844 sql_help.c:1857 sql_help.c:1872 sql_help.c:1929 -#: sql_help.c:1935 sql_help.c:2271 sql_help.c:2283 sql_help.c:2396 -#: sql_help.c:2436 sql_help.c:2513 sql_help.c:2558 sql_help.c:2614 -#: sql_help.c:2666 sql_help.c:2699 sql_help.c:2706 sql_help.c:2811 -#: sql_help.c:2829 sql_help.c:2842 sql_help.c:2915 sql_help.c:3035 -#: sql_help.c:3216 sql_help.c:3439 sql_help.c:3488 sql_help.c:3594 -#: sql_help.c:3796 sql_help.c:3802 sql_help.c:3860 sql_help.c:3892 -#: sql_help.c:4176 sql_help.c:4182 sql_help.c:4297 sql_help.c:4406 -#: sql_help.c:4408 sql_help.c:4465 sql_help.c:4504 sql_help.c:4655 -#: sql_help.c:4657 sql_help.c:4714 sql_help.c:4748 sql_help.c:4801 -#: sql_help.c:4887 sql_help.c:4889 sql_help.c:4946 +#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079 +#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779 +#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891 +#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2317 +#: sql_help.c:2329 sql_help.c:2444 sql_help.c:2484 sql_help.c:2561 +#: sql_help.c:2615 sql_help.c:2672 sql_help.c:2724 sql_help.c:2757 +#: sql_help.c:2764 sql_help.c:2873 sql_help.c:2891 sql_help.c:2904 +#: sql_help.c:2980 sql_help.c:3100 sql_help.c:3281 sql_help.c:3504 +#: sql_help.c:3553 sql_help.c:3659 sql_help.c:3866 sql_help.c:3872 +#: sql_help.c:3933 sql_help.c:3965 sql_help.c:4315 sql_help.c:4321 +#: sql_help.c:4439 sql_help.c:4548 sql_help.c:4550 sql_help.c:4607 +#: sql_help.c:4646 sql_help.c:4797 sql_help.c:4799 sql_help.c:4856 +#: sql_help.c:4890 sql_help.c:4942 sql_help.c:5028 sql_help.c:5030 +#: sql_help.c:5087 msgid "table_name" msgstr "nom_table" -#: sql_help.c:815 sql_help.c:2515 +#: sql_help.c:823 sql_help.c:2563 msgid "using_expression" msgstr "expression_using" -#: sql_help.c:816 sql_help.c:2516 +#: sql_help.c:824 sql_help.c:2564 msgid "check_expression" msgstr "expression_check" -#: sql_help.c:890 sql_help.c:2559 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2611 +msgid "publication_object" +msgstr "objet_publication" + +#: sql_help.c:903 sql_help.c:2612 msgid "publication_parameter" msgstr "paramètre_publication" -#: sql_help.c:934 sql_help.c:1603 sql_help.c:2375 sql_help.c:2591 -#: sql_help.c:3150 +#: sql_help.c:909 sql_help.c:2614 +msgid "where publication_object is one of:" +msgstr "où publication_object fait partie de :" + +#: sql_help.c:952 sql_help.c:1637 sql_help.c:2422 sql_help.c:2649 +#: sql_help.c:3215 msgid "password" msgstr "mot_de_passe" -#: sql_help.c:935 sql_help.c:1604 sql_help.c:2376 sql_help.c:2592 -#: sql_help.c:3151 +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2423 sql_help.c:2650 +#: sql_help.c:3216 msgid "timestamp" msgstr "horodatage" -#: sql_help.c:939 sql_help.c:943 sql_help.c:946 sql_help.c:949 sql_help.c:1608 -#: sql_help.c:1612 sql_help.c:1615 sql_help.c:1618 sql_help.c:3809 -#: sql_help.c:4189 +#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642 +#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3879 +#: sql_help.c:4328 msgid "database_name" msgstr "nom_base_de_donnée" -#: sql_help.c:1053 sql_help.c:2661 +#: sql_help.c:1073 sql_help.c:2719 msgid "increment" msgstr "incrément" -#: sql_help.c:1054 sql_help.c:2662 +#: sql_help.c:1074 sql_help.c:2720 msgid "minvalue" msgstr "valeur_min" -#: sql_help.c:1055 sql_help.c:2663 +#: sql_help.c:1075 sql_help.c:2721 msgid "maxvalue" msgstr "valeur_max" -#: sql_help.c:1056 sql_help.c:2664 sql_help.c:4404 sql_help.c:4502 -#: sql_help.c:4653 sql_help.c:4818 sql_help.c:4885 +#: sql_help.c:1076 sql_help.c:2722 sql_help.c:4546 sql_help.c:4644 +#: sql_help.c:4795 sql_help.c:4959 sql_help.c:5026 msgid "start" msgstr "début" -#: sql_help.c:1057 sql_help.c:1317 +#: sql_help.c:1077 sql_help.c:1347 msgid "restart" msgstr "nouveau_début" -#: sql_help.c:1058 sql_help.c:2665 +#: sql_help.c:1078 sql_help.c:2723 msgid "cache" msgstr "cache" -#: sql_help.c:1102 +#: sql_help.c:1123 msgid "new_target" msgstr "nouvelle_cible" -#: sql_help.c:1120 sql_help.c:2718 +#: sql_help.c:1142 sql_help.c:2776 msgid "conninfo" msgstr "conninfo" -#: sql_help.c:1122 sql_help.c:1126 sql_help.c:1130 sql_help.c:2719 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2777 msgid "publication_name" msgstr "nom_publication" -#: sql_help.c:1123 sql_help.c:1127 sql_help.c:1131 -msgid "set_publication_option" -msgstr "option_ensemble_publication" +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +msgid "publication_option" +msgstr "option_publication" -#: sql_help.c:1134 +#: sql_help.c:1156 msgid "refresh_option" msgstr "option_rafraichissement" -#: sql_help.c:1139 sql_help.c:2720 +#: sql_help.c:1161 sql_help.c:2778 msgid "subscription_parameter" msgstr "paramètre_souscription" -#: sql_help.c:1294 sql_help.c:1297 +#: sql_help.c:1164 +msgid "skip_option" +msgstr "option_skip" + +#: sql_help.c:1324 sql_help.c:1327 msgid "partition_name" msgstr "nom_partition" -#: sql_help.c:1295 sql_help.c:2288 sql_help.c:2847 +#: sql_help.c:1325 sql_help.c:2334 sql_help.c:2909 msgid "partition_bound_spec" msgstr "spec_limite_partition" -#: sql_help.c:1314 sql_help.c:1363 sql_help.c:2861 +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2923 msgid "sequence_options" msgstr "options_séquence" -#: sql_help.c:1316 +#: sql_help.c:1346 msgid "sequence_option" msgstr "option_séquence" -#: sql_help.c:1330 +#: sql_help.c:1360 msgid "table_constraint_using_index" msgstr "contrainte_table_utilisant_index" -#: sql_help.c:1338 sql_help.c:1339 sql_help.c:1340 sql_help.c:1341 +#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 msgid "rewrite_rule_name" msgstr "nom_règle_réécriture" -#: sql_help.c:1352 sql_help.c:2886 +#: sql_help.c:1383 sql_help.c:2948 msgid "and partition_bound_spec is:" msgstr "et partition_bound_spec est :" -#: sql_help.c:1353 sql_help.c:1354 sql_help.c:1355 sql_help.c:2887 -#: sql_help.c:2888 sql_help.c:2889 +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2949 +#: sql_help.c:2950 sql_help.c:2951 msgid "partition_bound_expr" msgstr "expr_limite_partition" -#: sql_help.c:1356 sql_help.c:1357 sql_help.c:2890 sql_help.c:2891 +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2952 sql_help.c:2953 msgid "numeric_literal" msgstr "numeric_literal" -#: sql_help.c:1358 +#: sql_help.c:1389 msgid "and column_constraint is:" msgstr "et contrainte_colonne est :" -#: sql_help.c:1361 sql_help.c:2295 sql_help.c:2329 sql_help.c:2537 -#: sql_help.c:2859 +#: sql_help.c:1392 sql_help.c:2341 sql_help.c:2376 sql_help.c:2585 +#: sql_help.c:2921 msgid "default_expr" msgstr "expression_par_défaut" -#: sql_help.c:1362 sql_help.c:2296 sql_help.c:2860 +#: sql_help.c:1393 sql_help.c:2342 sql_help.c:2922 msgid "generation_expr" msgstr "expression_génération" -#: sql_help.c:1364 sql_help.c:1365 sql_help.c:1374 sql_help.c:1376 -#: sql_help.c:1380 sql_help.c:2862 sql_help.c:2863 sql_help.c:2872 -#: sql_help.c:2874 sql_help.c:2878 +#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 +#: sql_help.c:1411 sql_help.c:2924 sql_help.c:2925 sql_help.c:2934 +#: sql_help.c:2936 sql_help.c:2940 msgid "index_parameters" msgstr "paramètres_index" -#: sql_help.c:1366 sql_help.c:1383 sql_help.c:2864 sql_help.c:2881 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2926 sql_help.c:2943 msgid "reftable" msgstr "table_référence" -#: sql_help.c:1367 sql_help.c:1384 sql_help.c:2865 sql_help.c:2882 +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2927 sql_help.c:2944 msgid "refcolumn" msgstr "colonne_référence" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1385 sql_help.c:1386 -#: sql_help.c:2866 sql_help.c:2867 sql_help.c:2883 sql_help.c:2884 +#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 +#: sql_help.c:2928 sql_help.c:2929 sql_help.c:2945 sql_help.c:2946 msgid "referential_action" msgstr "action" -#: sql_help.c:1370 sql_help.c:2297 sql_help.c:2868 +#: sql_help.c:1401 sql_help.c:2343 sql_help.c:2930 msgid "and table_constraint is:" msgstr "et contrainte_table est :" -#: sql_help.c:1378 sql_help.c:2876 +#: sql_help.c:1409 sql_help.c:2938 msgid "exclude_element" msgstr "élément_exclusion" -#: sql_help.c:1379 sql_help.c:2877 sql_help.c:4402 sql_help.c:4500 -#: sql_help.c:4651 sql_help.c:4816 sql_help.c:4883 +#: sql_help.c:1410 sql_help.c:2939 sql_help.c:4544 sql_help.c:4642 +#: sql_help.c:4793 sql_help.c:4957 sql_help.c:5024 msgid "operator" msgstr "opérateur" -#: sql_help.c:1381 sql_help.c:2408 sql_help.c:2879 +#: sql_help.c:1412 sql_help.c:2456 sql_help.c:2941 msgid "predicate" msgstr "prédicat" -#: sql_help.c:1387 +#: sql_help.c:1418 msgid "and table_constraint_using_index is:" msgstr "et contrainte_table_utilisant_index est :" -#: sql_help.c:1390 sql_help.c:2892 +#: sql_help.c:1421 sql_help.c:2954 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "dans les contraintes UNIQUE, PRIMARY KEY et EXCLUDE, les paramètres_index sont :" -#: sql_help.c:1395 sql_help.c:2897 +#: sql_help.c:1426 sql_help.c:2959 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "élément_exclusion dans une contrainte EXCLUDE est :" -#: sql_help.c:1398 sql_help.c:2401 sql_help.c:2824 sql_help.c:2837 -#: sql_help.c:2851 sql_help.c:2900 sql_help.c:3905 +#: sql_help.c:1429 sql_help.c:2449 sql_help.c:2886 sql_help.c:2899 +#: sql_help.c:2913 sql_help.c:2962 sql_help.c:3978 msgid "opclass" msgstr "classe_d_opérateur" -#: sql_help.c:1414 sql_help.c:1417 sql_help.c:2935 +#: sql_help.c:1430 sql_help.c:2963 +msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" +msgstr "referential_action dans une contrainte FOREIGN KEY/REFERENCES est :" + +#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3000 msgid "tablespace_option" msgstr "option_tablespace" -#: sql_help.c:1438 sql_help.c:1441 sql_help.c:1447 sql_help.c:1451 +#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 msgid "token_type" msgstr "type_jeton" -#: sql_help.c:1439 sql_help.c:1442 +#: sql_help.c:1473 sql_help.c:1476 msgid "dictionary_name" msgstr "nom_dictionnaire" -#: sql_help.c:1444 sql_help.c:1448 +#: sql_help.c:1478 sql_help.c:1482 msgid "old_dictionary" msgstr "ancien_dictionnaire" -#: sql_help.c:1445 sql_help.c:1449 +#: sql_help.c:1479 sql_help.c:1483 msgid "new_dictionary" msgstr "nouveau_dictionnaire" -#: sql_help.c:1544 sql_help.c:1558 sql_help.c:1561 sql_help.c:1562 -#: sql_help.c:3088 +#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 +#: sql_help.c:3153 msgid "attribute_name" msgstr "nom_attribut" -#: sql_help.c:1545 +#: sql_help.c:1579 msgid "new_attribute_name" msgstr "nouveau_nom_attribut" -#: sql_help.c:1549 sql_help.c:1553 +#: sql_help.c:1583 sql_help.c:1587 msgid "new_enum_value" msgstr "nouvelle_valeur_enum" -#: sql_help.c:1550 +#: sql_help.c:1584 msgid "neighbor_enum_value" msgstr "valeur_enum_voisine" -#: sql_help.c:1552 +#: sql_help.c:1586 msgid "existing_enum_value" msgstr "valeur_enum_existante" -#: sql_help.c:1555 +#: sql_help.c:1589 msgid "property" msgstr "propriété" -#: sql_help.c:1631 sql_help.c:2280 sql_help.c:2289 sql_help.c:2677 -#: sql_help.c:3168 sql_help.c:3619 sql_help.c:3818 sql_help.c:3861 -#: sql_help.c:4198 +#: sql_help.c:1665 sql_help.c:2326 sql_help.c:2335 sql_help.c:2735 +#: sql_help.c:3233 sql_help.c:3684 sql_help.c:3888 sql_help.c:3934 +#: sql_help.c:4337 msgid "server_name" msgstr "nom_serveur" -#: sql_help.c:1663 sql_help.c:1666 sql_help.c:3183 +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3248 msgid "view_option_name" msgstr "nom_option_vue" -#: sql_help.c:1664 sql_help.c:3184 +#: sql_help.c:1698 sql_help.c:3249 msgid "view_option_value" msgstr "valeur_option_vue" -#: sql_help.c:1685 sql_help.c:1686 sql_help.c:4787 sql_help.c:4788 +#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4929 sql_help.c:4930 msgid "table_and_columns" msgstr "table_et_colonnes" -#: sql_help.c:1687 sql_help.c:1750 sql_help.c:1941 sql_help.c:3667 -#: sql_help.c:4040 sql_help.c:4789 +#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3732 +#: sql_help.c:4172 sql_help.c:4931 msgid "where option can be one of:" msgstr "où option fait partie de :" -#: sql_help.c:1688 sql_help.c:1689 sql_help.c:1751 sql_help.c:1943 -#: sql_help.c:1946 sql_help.c:2125 sql_help.c:3668 sql_help.c:3669 -#: sql_help.c:3670 sql_help.c:3671 sql_help.c:3672 sql_help.c:3673 -#: sql_help.c:3674 sql_help.c:3675 sql_help.c:4041 sql_help.c:4043 -#: sql_help.c:4790 sql_help.c:4791 sql_help.c:4792 sql_help.c:4793 -#: sql_help.c:4794 sql_help.c:4795 sql_help.c:4796 sql_help.c:4797 -#: sql_help.c:4798 +#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 +#: sql_help.c:1980 sql_help.c:2160 sql_help.c:3733 sql_help.c:3734 +#: sql_help.c:3735 sql_help.c:3736 sql_help.c:3737 sql_help.c:3738 +#: sql_help.c:3739 sql_help.c:3740 sql_help.c:4173 sql_help.c:4175 +#: sql_help.c:4932 sql_help.c:4933 sql_help.c:4934 sql_help.c:4935 +#: sql_help.c:4936 sql_help.c:4937 sql_help.c:4938 sql_help.c:4939 msgid "boolean" msgstr "boolean" -#: sql_help.c:1690 sql_help.c:4800 +#: sql_help.c:1724 sql_help.c:4941 msgid "and table_and_columns is:" msgstr "et table_et_colonnes est :" -#: sql_help.c:1706 sql_help.c:4560 sql_help.c:4562 sql_help.c:4586 +#: sql_help.c:1740 sql_help.c:4702 sql_help.c:4704 sql_help.c:4728 msgid "transaction_mode" msgstr "mode_transaction" -#: sql_help.c:1707 sql_help.c:4563 sql_help.c:4587 +#: sql_help.c:1741 sql_help.c:4705 sql_help.c:4729 msgid "where transaction_mode is one of:" msgstr "où mode_transaction fait partie de :" -#: sql_help.c:1716 sql_help.c:4412 sql_help.c:4421 sql_help.c:4425 -#: sql_help.c:4429 sql_help.c:4432 sql_help.c:4661 sql_help.c:4670 -#: sql_help.c:4674 sql_help.c:4678 sql_help.c:4681 sql_help.c:4893 -#: sql_help.c:4902 sql_help.c:4906 sql_help.c:4910 sql_help.c:4913 +#: sql_help.c:1750 sql_help.c:4554 sql_help.c:4563 sql_help.c:4567 +#: sql_help.c:4571 sql_help.c:4574 sql_help.c:4803 sql_help.c:4812 +#: sql_help.c:4816 sql_help.c:4820 sql_help.c:4823 sql_help.c:5034 +#: sql_help.c:5043 sql_help.c:5047 sql_help.c:5051 sql_help.c:5054 msgid "argument" msgstr "argument" -#: sql_help.c:1816 +#: sql_help.c:1850 msgid "relation_name" msgstr "nom_relation" -#: sql_help.c:1821 sql_help.c:3812 sql_help.c:4192 +#: sql_help.c:1855 sql_help.c:3882 sql_help.c:4331 msgid "domain_name" msgstr "nom_domaine" -#: sql_help.c:1843 +#: sql_help.c:1877 msgid "policy_name" msgstr "nom_politique" -#: sql_help.c:1856 +#: sql_help.c:1890 msgid "rule_name" msgstr "nom_règle" -#: sql_help.c:1875 +#: sql_help.c:1909 msgid "text" msgstr "texte" -#: sql_help.c:1900 sql_help.c:4005 sql_help.c:4242 +#: sql_help.c:1934 sql_help.c:4137 sql_help.c:4384 msgid "transaction_id" msgstr "id_transaction" -#: sql_help.c:1931 sql_help.c:1938 sql_help.c:3931 +#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4004 msgid "filename" msgstr "nom_fichier" -#: sql_help.c:1932 sql_help.c:1939 sql_help.c:2616 sql_help.c:2617 -#: sql_help.c:2618 +#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2674 sql_help.c:2675 +#: sql_help.c:2676 msgid "command" msgstr "commande" -#: sql_help.c:1934 sql_help.c:2615 sql_help.c:3038 sql_help.c:3219 -#: sql_help.c:3915 sql_help.c:4395 sql_help.c:4397 sql_help.c:4493 -#: sql_help.c:4495 sql_help.c:4644 sql_help.c:4646 sql_help.c:4757 -#: sql_help.c:4876 sql_help.c:4878 +#: sql_help.c:1968 sql_help.c:2673 sql_help.c:3103 sql_help.c:3284 +#: sql_help.c:3988 sql_help.c:4065 sql_help.c:4068 sql_help.c:4537 +#: sql_help.c:4539 sql_help.c:4635 sql_help.c:4637 sql_help.c:4786 +#: sql_help.c:4788 sql_help.c:4899 sql_help.c:5017 sql_help.c:5019 msgid "condition" msgstr "condition" -#: sql_help.c:1937 sql_help.c:2442 sql_help.c:2921 sql_help.c:3185 -#: sql_help.c:3203 sql_help.c:3896 +#: sql_help.c:1971 sql_help.c:2490 sql_help.c:2986 sql_help.c:3250 +#: sql_help.c:3268 sql_help.c:3969 msgid "query" msgstr "requête" -#: sql_help.c:1942 +#: sql_help.c:1976 msgid "format_name" msgstr "nom_format" -#: sql_help.c:1944 +#: sql_help.c:1978 msgid "delimiter_character" msgstr "caractère_délimiteur" -#: sql_help.c:1945 +#: sql_help.c:1979 msgid "null_string" msgstr "chaîne_null" -#: sql_help.c:1947 +#: sql_help.c:1981 +msgid "match" +msgstr "match" + +#: sql_help.c:1982 msgid "quote_character" msgstr "caractère_guillemet" -#: sql_help.c:1948 +#: sql_help.c:1983 msgid "escape_character" msgstr "chaîne_d_échappement" -#: sql_help.c:1952 +#: sql_help.c:1987 msgid "encoding_name" msgstr "nom_encodage" -#: sql_help.c:1963 +#: sql_help.c:1998 msgid "access_method_type" msgstr "access_method_type" -#: sql_help.c:2034 sql_help.c:2053 sql_help.c:2056 +#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2091 msgid "arg_data_type" msgstr "type_données_arg" -#: sql_help.c:2035 sql_help.c:2057 sql_help.c:2065 +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 msgid "sfunc" msgstr "sfunc" -#: sql_help.c:2036 sql_help.c:2058 sql_help.c:2066 +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 msgid "state_data_type" msgstr "type_de_données_statut" -#: sql_help.c:2037 sql_help.c:2059 sql_help.c:2067 +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 msgid "state_data_size" msgstr "taille_de_données_statut" -#: sql_help.c:2038 sql_help.c:2060 sql_help.c:2068 +#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103 msgid "ffunc" msgstr "ffunc" -#: sql_help.c:2039 sql_help.c:2069 +#: sql_help.c:2074 sql_help.c:2104 msgid "combinefunc" msgstr "combinefunc" -#: sql_help.c:2040 sql_help.c:2070 +#: sql_help.c:2075 sql_help.c:2105 msgid "serialfunc" msgstr "serialfunc" -#: sql_help.c:2041 sql_help.c:2071 +#: sql_help.c:2076 sql_help.c:2106 msgid "deserialfunc" msgstr "deserialfunc" -#: sql_help.c:2042 sql_help.c:2061 sql_help.c:2072 +#: sql_help.c:2077 sql_help.c:2096 sql_help.c:2107 msgid "initial_condition" msgstr "condition_initiale" -#: sql_help.c:2043 sql_help.c:2073 +#: sql_help.c:2078 sql_help.c:2108 msgid "msfunc" msgstr "msfunc" -#: sql_help.c:2044 sql_help.c:2074 +#: sql_help.c:2079 sql_help.c:2109 msgid "minvfunc" msgstr "minvfunc" -#: sql_help.c:2045 sql_help.c:2075 +#: sql_help.c:2080 sql_help.c:2110 msgid "mstate_data_type" msgstr "m_type_de_données_statut" -#: sql_help.c:2046 sql_help.c:2076 +#: sql_help.c:2081 sql_help.c:2111 msgid "mstate_data_size" msgstr "m_taille_de_données_statut" -#: sql_help.c:2047 sql_help.c:2077 +#: sql_help.c:2082 sql_help.c:2112 msgid "mffunc" msgstr "mffunc" -#: sql_help.c:2048 sql_help.c:2078 +#: sql_help.c:2083 sql_help.c:2113 msgid "minitial_condition" msgstr "m_condition_initiale" -#: sql_help.c:2049 sql_help.c:2079 +#: sql_help.c:2084 sql_help.c:2114 msgid "sort_operator" msgstr "opérateur_de_tri" -#: sql_help.c:2062 +#: sql_help.c:2097 msgid "or the old syntax" msgstr "ou l'ancienne syntaxe" -#: sql_help.c:2064 +#: sql_help.c:2099 msgid "base_type" msgstr "type_base" -#: sql_help.c:2121 sql_help.c:2162 +#: sql_help.c:2156 sql_help.c:2203 msgid "locale" msgstr "locale" -#: sql_help.c:2122 sql_help.c:2163 +#: sql_help.c:2157 sql_help.c:2204 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2123 sql_help.c:2164 +#: sql_help.c:2158 sql_help.c:2205 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2124 sql_help.c:4295 +#: sql_help.c:2159 sql_help.c:4437 msgid "provider" msgstr "fournisseur" -#: sql_help.c:2126 sql_help.c:2218 +#: sql_help.c:2161 sql_help.c:2264 msgid "version" msgstr "version" -#: sql_help.c:2128 +#: sql_help.c:2163 msgid "existing_collation" msgstr "collationnement_existant" -#: sql_help.c:2138 +#: sql_help.c:2173 msgid "source_encoding" msgstr "encodage_source" -#: sql_help.c:2139 +#: sql_help.c:2174 msgid "dest_encoding" msgstr "encodage_destination" -#: sql_help.c:2160 sql_help.c:2961 +#: sql_help.c:2200 sql_help.c:3026 msgid "template" msgstr "modèle" -#: sql_help.c:2161 +#: sql_help.c:2201 msgid "encoding" msgstr "encodage" -#: sql_help.c:2188 +#: sql_help.c:2202 +msgid "strategy" +msgstr "stratégie" + +#: sql_help.c:2206 +msgid "icu_locale" +msgstr "icu_locale" + +#: sql_help.c:2207 +msgid "locale_provider" +msgstr "locale_provider" + +#: sql_help.c:2208 +msgid "collation_version" +msgstr "collation_version" + +#: sql_help.c:2213 +msgid "oid" +msgstr "oid" + +#: sql_help.c:2233 msgid "constraint" msgstr "contrainte" -#: sql_help.c:2189 +#: sql_help.c:2234 msgid "where constraint is:" msgstr "où la contrainte est :" -#: sql_help.c:2203 sql_help.c:2613 sql_help.c:3034 +#: sql_help.c:2248 sql_help.c:2671 sql_help.c:3099 msgid "event" msgstr "événement" -#: sql_help.c:2204 +#: sql_help.c:2249 msgid "filter_variable" msgstr "filter_variable" -#: sql_help.c:2292 sql_help.c:2856 +#: sql_help.c:2250 +msgid "filter_value" +msgstr "filtre_valeur" + +#: sql_help.c:2338 sql_help.c:2918 msgid "where column_constraint is:" msgstr "où contrainte_colonne est :" -#: sql_help.c:2330 +#: sql_help.c:2377 msgid "rettype" msgstr "type_en_retour" -#: sql_help.c:2332 +#: sql_help.c:2379 msgid "column_type" msgstr "type_colonne" -#: sql_help.c:2341 sql_help.c:2543 +#: sql_help.c:2388 sql_help.c:2591 msgid "definition" msgstr "définition" -#: sql_help.c:2342 sql_help.c:2544 +#: sql_help.c:2389 sql_help.c:2592 msgid "obj_file" msgstr "fichier_objet" -#: sql_help.c:2343 sql_help.c:2545 +#: sql_help.c:2390 sql_help.c:2593 msgid "link_symbol" msgstr "symbole_link" -#: sql_help.c:2344 sql_help.c:2546 +#: sql_help.c:2391 sql_help.c:2594 msgid "sql_body" msgstr "corps_sql" -#: sql_help.c:2382 sql_help.c:2598 sql_help.c:3157 +#: sql_help.c:2429 sql_help.c:2656 sql_help.c:3222 msgid "uid" msgstr "uid" -#: sql_help.c:2397 sql_help.c:2438 sql_help.c:2825 sql_help.c:2838 -#: sql_help.c:2852 sql_help.c:2917 +#: sql_help.c:2445 sql_help.c:2486 sql_help.c:2887 sql_help.c:2900 +#: sql_help.c:2914 sql_help.c:2982 msgid "method" msgstr "méthode" -#: sql_help.c:2402 +#: sql_help.c:2450 msgid "opclass_parameter" msgstr "paramètre_opclass" -#: sql_help.c:2419 +#: sql_help.c:2467 msgid "call_handler" msgstr "gestionnaire_d_appel" -#: sql_help.c:2420 +#: sql_help.c:2468 msgid "inline_handler" msgstr "gestionnaire_en_ligne" -#: sql_help.c:2421 +#: sql_help.c:2469 msgid "valfunction" msgstr "fonction_val" -#: sql_help.c:2460 +#: sql_help.c:2508 msgid "com_op" msgstr "com_op" -#: sql_help.c:2461 +#: sql_help.c:2509 msgid "neg_op" msgstr "neg_op" -#: sql_help.c:2479 +#: sql_help.c:2527 msgid "family_name" msgstr "nom_famille" -#: sql_help.c:2490 +#: sql_help.c:2538 msgid "storage_type" msgstr "type_stockage" -#: sql_help.c:2619 sql_help.c:3041 +#: sql_help.c:2677 sql_help.c:3106 msgid "where event can be one of:" msgstr "où événement fait partie de :" -#: sql_help.c:2639 sql_help.c:2641 +#: sql_help.c:2697 sql_help.c:2699 msgid "schema_element" msgstr "élément_schéma" -#: sql_help.c:2678 +#: sql_help.c:2736 msgid "server_type" msgstr "type_serveur" -#: sql_help.c:2679 +#: sql_help.c:2737 msgid "server_version" msgstr "version_serveur" -#: sql_help.c:2680 sql_help.c:3815 sql_help.c:4195 +#: sql_help.c:2738 sql_help.c:3885 sql_help.c:4334 msgid "fdw_name" msgstr "nom_fdw" -#: sql_help.c:2697 sql_help.c:2700 +#: sql_help.c:2755 sql_help.c:2758 msgid "statistics_name" msgstr "nom_statistique" -#: sql_help.c:2701 +#: sql_help.c:2759 msgid "statistics_kind" msgstr "statistics_kind" -#: sql_help.c:2717 +#: sql_help.c:2775 msgid "subscription_name" msgstr "nom_souscription" -#: sql_help.c:2818 +#: sql_help.c:2880 msgid "source_table" msgstr "table_source" -#: sql_help.c:2819 +#: sql_help.c:2881 msgid "like_option" msgstr "option_like" -#: sql_help.c:2885 +#: sql_help.c:2947 msgid "and like_option is:" msgstr "et option_like est :" -#: sql_help.c:2934 +#: sql_help.c:2999 msgid "directory" msgstr "répertoire" -#: sql_help.c:2948 +#: sql_help.c:3013 msgid "parser_name" msgstr "nom_analyseur" -#: sql_help.c:2949 +#: sql_help.c:3014 msgid "source_config" msgstr "configuration_source" -#: sql_help.c:2978 +#: sql_help.c:3043 msgid "start_function" msgstr "fonction_start" -#: sql_help.c:2979 +#: sql_help.c:3044 msgid "gettoken_function" msgstr "fonction_gettoken" -#: sql_help.c:2980 +#: sql_help.c:3045 msgid "end_function" msgstr "fonction_end" -#: sql_help.c:2981 +#: sql_help.c:3046 msgid "lextypes_function" msgstr "fonction_lextypes" -#: sql_help.c:2982 +#: sql_help.c:3047 msgid "headline_function" msgstr "fonction_headline" -#: sql_help.c:2994 +#: sql_help.c:3059 msgid "init_function" msgstr "fonction_init" -#: sql_help.c:2995 +#: sql_help.c:3060 msgid "lexize_function" msgstr "fonction_lexize" -#: sql_help.c:3008 +#: sql_help.c:3073 msgid "from_sql_function_name" msgstr "nom_fonction_from_sql" -#: sql_help.c:3010 +#: sql_help.c:3075 msgid "to_sql_function_name" msgstr "nom_fonction_to_sql" -#: sql_help.c:3036 +#: sql_help.c:3101 msgid "referenced_table_name" msgstr "nom_table_référencée" -#: sql_help.c:3037 +#: sql_help.c:3102 msgid "transition_relation_name" msgstr "nom_relation_transition" -#: sql_help.c:3040 +#: sql_help.c:3105 msgid "arguments" msgstr "arguments" -#: sql_help.c:3092 sql_help.c:4328 +#: sql_help.c:3157 sql_help.c:4470 msgid "label" msgstr "label" -#: sql_help.c:3094 +#: sql_help.c:3159 msgid "subtype" msgstr "sous_type" -#: sql_help.c:3095 +#: sql_help.c:3160 msgid "subtype_operator_class" msgstr "classe_opérateur_sous_type" -#: sql_help.c:3097 +#: sql_help.c:3162 msgid "canonical_function" msgstr "fonction_canonique" -#: sql_help.c:3098 +#: sql_help.c:3163 msgid "subtype_diff_function" msgstr "fonction_diff_sous_type" -#: sql_help.c:3099 +#: sql_help.c:3164 msgid "multirange_type_name" msgstr "nom_type_multirange" -#: sql_help.c:3101 +#: sql_help.c:3166 msgid "input_function" msgstr "fonction_en_sortie" -#: sql_help.c:3102 +#: sql_help.c:3167 msgid "output_function" msgstr "fonction_en_sortie" -#: sql_help.c:3103 +#: sql_help.c:3168 msgid "receive_function" msgstr "fonction_receive" -#: sql_help.c:3104 +#: sql_help.c:3169 msgid "send_function" msgstr "fonction_send" -#: sql_help.c:3105 +#: sql_help.c:3170 msgid "type_modifier_input_function" msgstr "fonction_en_entrée_modificateur_type" -#: sql_help.c:3106 +#: sql_help.c:3171 msgid "type_modifier_output_function" msgstr "fonction_en_sortie_modificateur_type" -#: sql_help.c:3107 +#: sql_help.c:3172 msgid "analyze_function" msgstr "fonction_analyze" -#: sql_help.c:3108 +#: sql_help.c:3173 msgid "subscript_function" msgstr "fonction_indice" -#: sql_help.c:3109 +#: sql_help.c:3174 msgid "internallength" msgstr "longueur_interne" -#: sql_help.c:3110 +#: sql_help.c:3175 msgid "alignment" msgstr "alignement" -#: sql_help.c:3111 +#: sql_help.c:3176 msgid "storage" msgstr "stockage" -#: sql_help.c:3112 +#: sql_help.c:3177 msgid "like_type" msgstr "type_like" -#: sql_help.c:3113 +#: sql_help.c:3178 msgid "category" msgstr "catégorie" -#: sql_help.c:3114 +#: sql_help.c:3179 msgid "preferred" msgstr "préféré" -#: sql_help.c:3115 +#: sql_help.c:3180 msgid "default" msgstr "par défaut" -#: sql_help.c:3116 +#: sql_help.c:3181 msgid "element" msgstr "élément" -#: sql_help.c:3117 +#: sql_help.c:3182 msgid "delimiter" msgstr "délimiteur" -#: sql_help.c:3118 +#: sql_help.c:3183 msgid "collatable" msgstr "collationnable" -#: sql_help.c:3215 sql_help.c:3891 sql_help.c:4390 sql_help.c:4487 -#: sql_help.c:4639 sql_help.c:4747 sql_help.c:4871 +#: sql_help.c:3280 sql_help.c:3964 sql_help.c:4054 sql_help.c:4532 +#: sql_help.c:4629 sql_help.c:4781 sql_help.c:4889 sql_help.c:5012 msgid "with_query" msgstr "requête_with" -#: sql_help.c:3217 sql_help.c:3893 sql_help.c:4409 sql_help.c:4415 -#: sql_help.c:4418 sql_help.c:4422 sql_help.c:4426 sql_help.c:4434 -#: sql_help.c:4658 sql_help.c:4664 sql_help.c:4667 sql_help.c:4671 -#: sql_help.c:4675 sql_help.c:4683 sql_help.c:4749 sql_help.c:4890 -#: sql_help.c:4896 sql_help.c:4899 sql_help.c:4903 sql_help.c:4907 -#: sql_help.c:4915 +#: sql_help.c:3282 sql_help.c:3966 sql_help.c:4551 sql_help.c:4557 +#: sql_help.c:4560 sql_help.c:4564 sql_help.c:4568 sql_help.c:4576 +#: sql_help.c:4800 sql_help.c:4806 sql_help.c:4809 sql_help.c:4813 +#: sql_help.c:4817 sql_help.c:4825 sql_help.c:4891 sql_help.c:5031 +#: sql_help.c:5037 sql_help.c:5040 sql_help.c:5044 sql_help.c:5048 +#: sql_help.c:5056 msgid "alias" msgstr "alias" -#: sql_help.c:3218 sql_help.c:4394 sql_help.c:4436 sql_help.c:4438 -#: sql_help.c:4492 sql_help.c:4643 sql_help.c:4685 sql_help.c:4687 -#: sql_help.c:4756 sql_help.c:4875 sql_help.c:4917 sql_help.c:4919 +#: sql_help.c:3283 sql_help.c:4536 sql_help.c:4578 sql_help.c:4580 +#: sql_help.c:4634 sql_help.c:4785 sql_help.c:4827 sql_help.c:4829 +#: sql_help.c:4898 sql_help.c:5016 sql_help.c:5058 sql_help.c:5060 msgid "from_item" msgstr "élément_from" -#: sql_help.c:3220 sql_help.c:3701 sql_help.c:3972 sql_help.c:4758 +#: sql_help.c:3285 sql_help.c:3766 sql_help.c:4104 sql_help.c:4900 msgid "cursor_name" msgstr "nom_curseur" -#: sql_help.c:3221 sql_help.c:3899 sql_help.c:4759 +#: sql_help.c:3286 sql_help.c:3972 sql_help.c:4901 msgid "output_expression" msgstr "expression_en_sortie" -#: sql_help.c:3222 sql_help.c:3900 sql_help.c:4393 sql_help.c:4490 -#: sql_help.c:4642 sql_help.c:4760 sql_help.c:4874 +#: sql_help.c:3287 sql_help.c:3973 sql_help.c:4535 sql_help.c:4632 +#: sql_help.c:4784 sql_help.c:4902 sql_help.c:5015 msgid "output_name" msgstr "nom_en_sortie" -#: sql_help.c:3238 +#: sql_help.c:3303 msgid "code" msgstr "code" -#: sql_help.c:3643 +#: sql_help.c:3708 msgid "parameter" msgstr "paramètre" -#: sql_help.c:3665 sql_help.c:3666 sql_help.c:3997 +#: sql_help.c:3730 sql_help.c:3731 sql_help.c:4129 msgid "statement" msgstr "instruction" -#: sql_help.c:3700 sql_help.c:3971 +#: sql_help.c:3765 sql_help.c:4103 msgid "direction" msgstr "direction" -#: sql_help.c:3702 sql_help.c:3973 +#: sql_help.c:3767 sql_help.c:4105 msgid "where direction can be empty or one of:" msgstr "où direction peut être vide ou faire partie de :" -#: sql_help.c:3703 sql_help.c:3704 sql_help.c:3705 sql_help.c:3706 -#: sql_help.c:3707 sql_help.c:3974 sql_help.c:3975 sql_help.c:3976 -#: sql_help.c:3977 sql_help.c:3978 sql_help.c:4403 sql_help.c:4405 -#: sql_help.c:4501 sql_help.c:4503 sql_help.c:4652 sql_help.c:4654 -#: sql_help.c:4817 sql_help.c:4819 sql_help.c:4884 sql_help.c:4886 +#: sql_help.c:3768 sql_help.c:3769 sql_help.c:3770 sql_help.c:3771 +#: sql_help.c:3772 sql_help.c:4106 sql_help.c:4107 sql_help.c:4108 +#: sql_help.c:4109 sql_help.c:4110 sql_help.c:4545 sql_help.c:4547 +#: sql_help.c:4643 sql_help.c:4645 sql_help.c:4794 sql_help.c:4796 +#: sql_help.c:4958 sql_help.c:4960 sql_help.c:5025 sql_help.c:5027 msgid "count" msgstr "nombre" -#: sql_help.c:3805 sql_help.c:4185 +#: sql_help.c:3875 sql_help.c:4324 msgid "sequence_name" msgstr "nom_séquence" -#: sql_help.c:3823 sql_help.c:4203 +#: sql_help.c:3893 sql_help.c:4342 msgid "arg_name" msgstr "nom_argument" -#: sql_help.c:3824 sql_help.c:4204 +#: sql_help.c:3894 sql_help.c:4343 msgid "arg_type" msgstr "type_arg" -#: sql_help.c:3831 sql_help.c:4211 +#: sql_help.c:3901 sql_help.c:4350 msgid "loid" msgstr "loid" -#: sql_help.c:3859 +#: sql_help.c:3932 msgid "remote_schema" msgstr "schema_distant" -#: sql_help.c:3862 +#: sql_help.c:3935 msgid "local_schema" msgstr "schéma_local" -#: sql_help.c:3897 +#: sql_help.c:3970 msgid "conflict_target" msgstr "cible_conflit" -#: sql_help.c:3898 +#: sql_help.c:3971 msgid "conflict_action" msgstr "action_conflit" -#: sql_help.c:3901 +#: sql_help.c:3974 msgid "where conflict_target can be one of:" msgstr "où cible_conflit fait partie de :" -#: sql_help.c:3902 +#: sql_help.c:3975 msgid "index_column_name" msgstr "index_nom_colonne" -#: sql_help.c:3903 +#: sql_help.c:3976 msgid "index_expression" msgstr "index_expression" -#: sql_help.c:3906 +#: sql_help.c:3979 msgid "index_predicate" msgstr "index_prédicat" -#: sql_help.c:3908 +#: sql_help.c:3981 msgid "and conflict_action is one of:" msgstr "où action_conflit fait partie de :" -#: sql_help.c:3914 sql_help.c:4755 +#: sql_help.c:3987 sql_help.c:4897 msgid "sub-SELECT" msgstr "sous-SELECT" -#: sql_help.c:3923 sql_help.c:3986 sql_help.c:4731 +#: sql_help.c:3996 sql_help.c:4118 sql_help.c:4873 msgid "channel" msgstr "canal" -#: sql_help.c:3945 +#: sql_help.c:4018 msgid "lockmode" msgstr "mode_de_verrou" -#: sql_help.c:3946 +#: sql_help.c:4019 msgid "where lockmode is one of:" msgstr "où mode_de_verrou fait partie de :" -#: sql_help.c:3987 +#: sql_help.c:4055 +msgid "target_table_name" +msgstr "target_table_name" + +#: sql_help.c:4056 +msgid "target_alias" +msgstr "target_alias" + +#: sql_help.c:4057 +msgid "data_source" +msgstr "data_source" + +#: sql_help.c:4058 sql_help.c:4581 sql_help.c:4830 sql_help.c:5061 +msgid "join_condition" +msgstr "condition_de_jointure" + +#: sql_help.c:4059 +msgid "when_clause" +msgstr "when_clause" + +#: sql_help.c:4060 +msgid "where data_source is" +msgstr "où data_source est :" + +#: sql_help.c:4061 +msgid "source_table_name" +msgstr "source_table_name" + +#: sql_help.c:4062 +msgid "source_query" +msgstr "source_query" + +#: sql_help.c:4063 +msgid "source_alias" +msgstr "source_alias" + +#: sql_help.c:4064 +msgid "and when_clause is" +msgstr "et when_clause est :" + +#: sql_help.c:4066 +msgid "merge_update" +msgstr "merge_delete" + +#: sql_help.c:4067 +msgid "merge_delete" +msgstr "merge_delete" + +#: sql_help.c:4069 +msgid "merge_insert" +msgstr "merge_insert" + +#: sql_help.c:4070 +msgid "and merge_insert is" +msgstr "et merge_insert est :" + +#: sql_help.c:4073 +msgid "and merge_update is" +msgstr "et merge_update est :" + +#: sql_help.c:4078 +msgid "and merge_delete is" +msgstr "et merge_delete est :" + +#: sql_help.c:4119 msgid "payload" msgstr "contenu" -#: sql_help.c:4014 +#: sql_help.c:4146 msgid "old_role" msgstr "ancien_rôle" -#: sql_help.c:4015 +#: sql_help.c:4147 msgid "new_role" msgstr "nouveau_rôle" -#: sql_help.c:4051 sql_help.c:4250 sql_help.c:4258 +#: sql_help.c:4183 sql_help.c:4392 sql_help.c:4400 msgid "savepoint_name" msgstr "nom_savepoint" -#: sql_help.c:4396 sql_help.c:4449 sql_help.c:4645 sql_help.c:4698 -#: sql_help.c:4877 sql_help.c:4930 +#: sql_help.c:4538 sql_help.c:4591 sql_help.c:4787 sql_help.c:4840 +#: sql_help.c:5018 sql_help.c:5071 msgid "grouping_element" msgstr "element_regroupement" -#: sql_help.c:4398 sql_help.c:4496 sql_help.c:4647 sql_help.c:4879 +#: sql_help.c:4540 sql_help.c:4638 sql_help.c:4789 sql_help.c:5020 msgid "window_name" msgstr "nom_window" -#: sql_help.c:4399 sql_help.c:4497 sql_help.c:4648 sql_help.c:4880 +#: sql_help.c:4541 sql_help.c:4639 sql_help.c:4790 sql_help.c:5021 msgid "window_definition" msgstr "définition_window" -#: sql_help.c:4400 sql_help.c:4414 sql_help.c:4453 sql_help.c:4498 -#: sql_help.c:4649 sql_help.c:4663 sql_help.c:4702 sql_help.c:4881 -#: sql_help.c:4895 sql_help.c:4934 +#: sql_help.c:4542 sql_help.c:4556 sql_help.c:4595 sql_help.c:4640 +#: sql_help.c:4791 sql_help.c:4805 sql_help.c:4844 sql_help.c:5022 +#: sql_help.c:5036 sql_help.c:5075 msgid "select" msgstr "sélection" -#: sql_help.c:4407 sql_help.c:4656 sql_help.c:4888 +#: sql_help.c:4549 sql_help.c:4798 sql_help.c:5029 msgid "where from_item can be one of:" msgstr "où élément_from fait partie de :" -#: sql_help.c:4410 sql_help.c:4416 sql_help.c:4419 sql_help.c:4423 -#: sql_help.c:4435 sql_help.c:4659 sql_help.c:4665 sql_help.c:4668 -#: sql_help.c:4672 sql_help.c:4684 sql_help.c:4891 sql_help.c:4897 -#: sql_help.c:4900 sql_help.c:4904 sql_help.c:4916 +#: sql_help.c:4552 sql_help.c:4558 sql_help.c:4561 sql_help.c:4565 +#: sql_help.c:4577 sql_help.c:4801 sql_help.c:4807 sql_help.c:4810 +#: sql_help.c:4814 sql_help.c:4826 sql_help.c:5032 sql_help.c:5038 +#: sql_help.c:5041 sql_help.c:5045 sql_help.c:5057 msgid "column_alias" msgstr "alias_colonne" -#: sql_help.c:4411 sql_help.c:4660 sql_help.c:4892 +#: sql_help.c:4553 sql_help.c:4802 sql_help.c:5033 msgid "sampling_method" msgstr "méthode_echantillonnage" -#: sql_help.c:4413 sql_help.c:4662 sql_help.c:4894 +#: sql_help.c:4555 sql_help.c:4804 sql_help.c:5035 msgid "seed" msgstr "graine" -#: sql_help.c:4417 sql_help.c:4451 sql_help.c:4666 sql_help.c:4700 -#: sql_help.c:4898 sql_help.c:4932 +#: sql_help.c:4559 sql_help.c:4593 sql_help.c:4808 sql_help.c:4842 +#: sql_help.c:5039 sql_help.c:5073 msgid "with_query_name" msgstr "nom_requête_with" -#: sql_help.c:4427 sql_help.c:4430 sql_help.c:4433 sql_help.c:4676 -#: sql_help.c:4679 sql_help.c:4682 sql_help.c:4908 sql_help.c:4911 -#: sql_help.c:4914 +#: sql_help.c:4569 sql_help.c:4572 sql_help.c:4575 sql_help.c:4818 +#: sql_help.c:4821 sql_help.c:4824 sql_help.c:5049 sql_help.c:5052 +#: sql_help.c:5055 msgid "column_definition" msgstr "définition_colonne" -#: sql_help.c:4437 sql_help.c:4686 sql_help.c:4918 +#: sql_help.c:4579 sql_help.c:4828 sql_help.c:5059 msgid "join_type" msgstr "type_de_jointure" -#: sql_help.c:4439 sql_help.c:4688 sql_help.c:4920 -msgid "join_condition" -msgstr "condition_de_jointure" - -#: sql_help.c:4440 sql_help.c:4689 sql_help.c:4921 +#: sql_help.c:4582 sql_help.c:4831 sql_help.c:5062 msgid "join_column" msgstr "colonne_de_jointure" -#: sql_help.c:4441 sql_help.c:4690 sql_help.c:4922 +#: sql_help.c:4583 sql_help.c:4832 sql_help.c:5063 msgid "join_using_alias" msgstr "join_utilisant_alias" -#: sql_help.c:4442 sql_help.c:4691 sql_help.c:4923 +#: sql_help.c:4584 sql_help.c:4833 sql_help.c:5064 msgid "and grouping_element can be one of:" msgstr "où element_regroupement fait partie de :" -#: sql_help.c:4450 sql_help.c:4699 sql_help.c:4931 +#: sql_help.c:4592 sql_help.c:4841 sql_help.c:5072 msgid "and with_query is:" msgstr "et requête_with est :" -#: sql_help.c:4454 sql_help.c:4703 sql_help.c:4935 +#: sql_help.c:4596 sql_help.c:4845 sql_help.c:5076 msgid "values" msgstr "valeurs" -#: sql_help.c:4455 sql_help.c:4704 sql_help.c:4936 +#: sql_help.c:4597 sql_help.c:4846 sql_help.c:5077 msgid "insert" msgstr "insert" -#: sql_help.c:4456 sql_help.c:4705 sql_help.c:4937 +#: sql_help.c:4598 sql_help.c:4847 sql_help.c:5078 msgid "update" msgstr "update" -#: sql_help.c:4457 sql_help.c:4706 sql_help.c:4938 +#: sql_help.c:4599 sql_help.c:4848 sql_help.c:5079 msgid "delete" msgstr "delete" -#: sql_help.c:4459 sql_help.c:4708 sql_help.c:4940 +#: sql_help.c:4601 sql_help.c:4850 sql_help.c:5081 msgid "search_seq_col_name" msgstr "nom_colonne_seq_recherche" -#: sql_help.c:4461 sql_help.c:4710 sql_help.c:4942 +#: sql_help.c:4603 sql_help.c:4852 sql_help.c:5083 msgid "cycle_mark_col_name" msgstr "nom_colonne_marque_cycle" -#: sql_help.c:4462 sql_help.c:4711 sql_help.c:4943 +#: sql_help.c:4604 sql_help.c:4853 sql_help.c:5084 msgid "cycle_mark_value" msgstr "valeur_marque_cycle" -#: sql_help.c:4463 sql_help.c:4712 sql_help.c:4944 +#: sql_help.c:4605 sql_help.c:4854 sql_help.c:5085 msgid "cycle_mark_default" msgstr "défaut_marque_cyle" -#: sql_help.c:4464 sql_help.c:4713 sql_help.c:4945 +#: sql_help.c:4606 sql_help.c:4855 sql_help.c:5086 msgid "cycle_path_col_name" msgstr "nom_colonne_chemin_cycle" -#: sql_help.c:4491 +#: sql_help.c:4633 msgid "new_table" msgstr "nouvelle_table" -#: sql_help.c:4516 +#: sql_help.c:4658 msgid "timezone" msgstr "fuseau_horaire" -#: sql_help.c:4561 +#: sql_help.c:4703 msgid "snapshot_id" msgstr "id_snapshot" -#: sql_help.c:4815 +#: sql_help.c:4956 msgid "sort_expression" msgstr "expression_de_tri" -#: sql_help.c:4952 sql_help.c:5930 +#: sql_help.c:5093 sql_help.c:6077 msgid "abort the current transaction" msgstr "abandonner la transaction en cours" -#: sql_help.c:4958 +#: sql_help.c:5099 msgid "change the definition of an aggregate function" msgstr "modifier la définition d'une fonction d'agrégation" -#: sql_help.c:4964 +#: sql_help.c:5105 msgid "change the definition of a collation" msgstr "modifier la définition d'un collationnement" -#: sql_help.c:4970 +#: sql_help.c:5111 msgid "change the definition of a conversion" msgstr "modifier la définition d'une conversion" -#: sql_help.c:4976 +#: sql_help.c:5117 msgid "change a database" msgstr "modifier une base de données" -#: sql_help.c:4982 +#: sql_help.c:5123 msgid "define default access privileges" msgstr "définir les droits d'accès par défaut" -#: sql_help.c:4988 +#: sql_help.c:5129 msgid "change the definition of a domain" msgstr "modifier la définition d'un domaine" -#: sql_help.c:4994 +#: sql_help.c:5135 msgid "change the definition of an event trigger" msgstr "modifier la définition d'un trigger sur évènement" -#: sql_help.c:5000 +#: sql_help.c:5141 msgid "change the definition of an extension" msgstr "modifier la définition d'une extension" -#: sql_help.c:5006 +#: sql_help.c:5147 msgid "change the definition of a foreign-data wrapper" msgstr "modifier la définition d'un wrapper de données distantes" -#: sql_help.c:5012 +#: sql_help.c:5153 msgid "change the definition of a foreign table" msgstr "modifier la définition d'une table distante" -#: sql_help.c:5018 +#: sql_help.c:5159 msgid "change the definition of a function" msgstr "modifier la définition d'une fonction" -#: sql_help.c:5024 +#: sql_help.c:5165 msgid "change role name or membership" msgstr "modifier le nom d'un groupe ou la liste des ses membres" -#: sql_help.c:5030 +#: sql_help.c:5171 msgid "change the definition of an index" msgstr "modifier la définition d'un index" -#: sql_help.c:5036 +#: sql_help.c:5177 msgid "change the definition of a procedural language" msgstr "modifier la définition d'un langage procédural" -#: sql_help.c:5042 +#: sql_help.c:5183 msgid "change the definition of a large object" msgstr "modifier la définition d'un « Large Object »" -#: sql_help.c:5048 +#: sql_help.c:5189 msgid "change the definition of a materialized view" msgstr "modifier la définition d'une vue matérialisée" -#: sql_help.c:5054 +#: sql_help.c:5195 msgid "change the definition of an operator" msgstr "modifier la définition d'un opérateur" -#: sql_help.c:5060 +#: sql_help.c:5201 msgid "change the definition of an operator class" msgstr "modifier la définition d'une classe d'opérateurs" -#: sql_help.c:5066 +#: sql_help.c:5207 msgid "change the definition of an operator family" msgstr "modifier la définition d'une famille d'opérateur" -#: sql_help.c:5072 +#: sql_help.c:5213 msgid "change the definition of a row-level security policy" msgstr "modifier la définition d'une politique de sécurité au niveau ligne" -#: sql_help.c:5078 +#: sql_help.c:5219 msgid "change the definition of a procedure" msgstr "modifier la définition d'une procédure" -#: sql_help.c:5084 +#: sql_help.c:5225 msgid "change the definition of a publication" msgstr "modifier la définition d'une publication" -#: sql_help.c:5090 sql_help.c:5192 +#: sql_help.c:5231 sql_help.c:5333 msgid "change a database role" msgstr "modifier un rôle" -#: sql_help.c:5096 +#: sql_help.c:5237 msgid "change the definition of a routine" msgstr "modifier la définition d'une routine" -#: sql_help.c:5102 +#: sql_help.c:5243 msgid "change the definition of a rule" msgstr "modifier la définition d'une règle" -#: sql_help.c:5108 +#: sql_help.c:5249 msgid "change the definition of a schema" msgstr "modifier la définition d'un schéma" -#: sql_help.c:5114 +#: sql_help.c:5255 msgid "change the definition of a sequence generator" msgstr "modifier la définition d'un générateur de séquence" -#: sql_help.c:5120 +#: sql_help.c:5261 msgid "change the definition of a foreign server" msgstr "modifier la définition d'un serveur distant" -#: sql_help.c:5126 +#: sql_help.c:5267 msgid "change the definition of an extended statistics object" msgstr "modifier la définition d'un objet de statistiques étendues" -#: sql_help.c:5132 +#: sql_help.c:5273 msgid "change the definition of a subscription" msgstr "modifier la définition d'une souscription" -#: sql_help.c:5138 +#: sql_help.c:5279 msgid "change a server configuration parameter" msgstr "modifie un paramètre de configuration du serveur" -#: sql_help.c:5144 +#: sql_help.c:5285 msgid "change the definition of a table" msgstr "modifier la définition d'une table" -#: sql_help.c:5150 +#: sql_help.c:5291 msgid "change the definition of a tablespace" msgstr "modifier la définition d'un tablespace" -#: sql_help.c:5156 +#: sql_help.c:5297 msgid "change the definition of a text search configuration" msgstr "modifier la définition d'une configuration de la recherche de texte" -#: sql_help.c:5162 +#: sql_help.c:5303 msgid "change the definition of a text search dictionary" msgstr "modifier la définition d'un dictionnaire de la recherche de texte" -#: sql_help.c:5168 +#: sql_help.c:5309 msgid "change the definition of a text search parser" msgstr "modifier la définition d'un analyseur de la recherche de texte" -#: sql_help.c:5174 +#: sql_help.c:5315 msgid "change the definition of a text search template" msgstr "modifier la définition d'un modèle de la recherche de texte" -#: sql_help.c:5180 +#: sql_help.c:5321 msgid "change the definition of a trigger" msgstr "modifier la définition d'un trigger" -#: sql_help.c:5186 +#: sql_help.c:5327 msgid "change the definition of a type" msgstr "modifier la définition d'un type" -#: sql_help.c:5198 +#: sql_help.c:5339 msgid "change the definition of a user mapping" msgstr "modifier la définition d'une correspondance d'utilisateur" -#: sql_help.c:5204 +#: sql_help.c:5345 msgid "change the definition of a view" msgstr "modifier la définition d'une vue" -#: sql_help.c:5210 +#: sql_help.c:5351 msgid "collect statistics about a database" msgstr "acquérir des statistiques concernant la base de données" -#: sql_help.c:5216 sql_help.c:6008 +#: sql_help.c:5357 sql_help.c:6155 msgid "start a transaction block" msgstr "débuter un bloc de transaction" -#: sql_help.c:5222 +#: sql_help.c:5363 msgid "invoke a procedure" msgstr "appeler une procédure" -#: sql_help.c:5228 +#: sql_help.c:5369 msgid "force a write-ahead log checkpoint" msgstr "forcer un point de vérification des journaux de transactions" -#: sql_help.c:5234 +#: sql_help.c:5375 msgid "close a cursor" msgstr "fermer un curseur" -#: sql_help.c:5240 +#: sql_help.c:5381 msgid "cluster a table according to an index" msgstr "réorganiser (cluster) une table en fonction d'un index" -#: sql_help.c:5246 +#: sql_help.c:5387 msgid "define or change the comment of an object" msgstr "définir ou modifier les commentaires d'un objet" -#: sql_help.c:5252 sql_help.c:5810 +#: sql_help.c:5393 sql_help.c:5951 msgid "commit the current transaction" msgstr "valider la transaction en cours" -#: sql_help.c:5258 +#: sql_help.c:5399 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "" "valider une transaction précédemment préparée pour une validation en deux\n" "phases" -#: sql_help.c:5264 +#: sql_help.c:5405 msgid "copy data between a file and a table" msgstr "copier des données entre un fichier et une table" -#: sql_help.c:5270 +#: sql_help.c:5411 msgid "define a new access method" msgstr "définir une nouvelle méthode d'accès" -#: sql_help.c:5276 +#: sql_help.c:5417 msgid "define a new aggregate function" msgstr "définir une nouvelle fonction d'agrégation" -#: sql_help.c:5282 +#: sql_help.c:5423 msgid "define a new cast" msgstr "définir un nouveau transtypage" -#: sql_help.c:5288 +#: sql_help.c:5429 msgid "define a new collation" msgstr "définir un nouveau collationnement" -#: sql_help.c:5294 +#: sql_help.c:5435 msgid "define a new encoding conversion" msgstr "définir une nouvelle conversion d'encodage" -#: sql_help.c:5300 +#: sql_help.c:5441 msgid "create a new database" msgstr "créer une nouvelle base de données" -#: sql_help.c:5306 +#: sql_help.c:5447 msgid "define a new domain" msgstr "définir un nouveau domaine" -#: sql_help.c:5312 +#: sql_help.c:5453 msgid "define a new event trigger" msgstr "définir un nouveau trigger sur évènement" -#: sql_help.c:5318 +#: sql_help.c:5459 msgid "install an extension" msgstr "installer une extension" -#: sql_help.c:5324 +#: sql_help.c:5465 msgid "define a new foreign-data wrapper" msgstr "définir un nouveau wrapper de données distantes" -#: sql_help.c:5330 +#: sql_help.c:5471 msgid "define a new foreign table" msgstr "définir une nouvelle table distante" -#: sql_help.c:5336 +#: sql_help.c:5477 msgid "define a new function" msgstr "définir une nouvelle fonction" -#: sql_help.c:5342 sql_help.c:5402 sql_help.c:5504 +#: sql_help.c:5483 sql_help.c:5543 sql_help.c:5645 msgid "define a new database role" msgstr "définir un nouveau rôle" -#: sql_help.c:5348 +#: sql_help.c:5489 msgid "define a new index" msgstr "définir un nouvel index" -#: sql_help.c:5354 +#: sql_help.c:5495 msgid "define a new procedural language" msgstr "définir un nouveau langage de procédures" -#: sql_help.c:5360 +#: sql_help.c:5501 msgid "define a new materialized view" msgstr "définir une nouvelle vue matérialisée" -#: sql_help.c:5366 +#: sql_help.c:5507 msgid "define a new operator" msgstr "définir un nouvel opérateur" -#: sql_help.c:5372 +#: sql_help.c:5513 msgid "define a new operator class" msgstr "définir une nouvelle classe d'opérateur" -#: sql_help.c:5378 +#: sql_help.c:5519 msgid "define a new operator family" msgstr "définir une nouvelle famille d'opérateur" -#: sql_help.c:5384 +#: sql_help.c:5525 msgid "define a new row-level security policy for a table" msgstr "définir une nouvelle politique de sécurité au niveau ligne pour une table" -#: sql_help.c:5390 +#: sql_help.c:5531 msgid "define a new procedure" msgstr "définir une nouvelle procédure" -#: sql_help.c:5396 +#: sql_help.c:5537 msgid "define a new publication" msgstr "définir une nouvelle publication" -#: sql_help.c:5408 +#: sql_help.c:5549 msgid "define a new rewrite rule" msgstr "définir une nouvelle règle de réécriture" -#: sql_help.c:5414 +#: sql_help.c:5555 msgid "define a new schema" msgstr "définir un nouveau schéma" -#: sql_help.c:5420 +#: sql_help.c:5561 msgid "define a new sequence generator" msgstr "définir un nouveau générateur de séquence" -#: sql_help.c:5426 +#: sql_help.c:5567 msgid "define a new foreign server" msgstr "définir un nouveau serveur distant" -#: sql_help.c:5432 +#: sql_help.c:5573 msgid "define extended statistics" msgstr "définir des statistiques étendues" -#: sql_help.c:5438 +#: sql_help.c:5579 msgid "define a new subscription" msgstr "définir une nouvelle souscription" -#: sql_help.c:5444 +#: sql_help.c:5585 msgid "define a new table" msgstr "définir une nouvelle table" -#: sql_help.c:5450 sql_help.c:5966 +#: sql_help.c:5591 sql_help.c:6113 msgid "define a new table from the results of a query" msgstr "définir une nouvelle table à partir des résultats d'une requête" -#: sql_help.c:5456 +#: sql_help.c:5597 msgid "define a new tablespace" msgstr "définir un nouveau tablespace" -#: sql_help.c:5462 +#: sql_help.c:5603 msgid "define a new text search configuration" msgstr "définir une nouvelle configuration de la recherche de texte" -#: sql_help.c:5468 +#: sql_help.c:5609 msgid "define a new text search dictionary" msgstr "définir un nouveau dictionnaire de la recherche de texte" -#: sql_help.c:5474 +#: sql_help.c:5615 msgid "define a new text search parser" msgstr "définir un nouvel analyseur de la recherche de texte" -#: sql_help.c:5480 +#: sql_help.c:5621 msgid "define a new text search template" msgstr "définir un nouveau modèle de la recherche de texte" -#: sql_help.c:5486 +#: sql_help.c:5627 msgid "define a new transform" msgstr "définir une nouvelle transformation" -#: sql_help.c:5492 +#: sql_help.c:5633 msgid "define a new trigger" msgstr "définir un nouveau trigger" -#: sql_help.c:5498 +#: sql_help.c:5639 msgid "define a new data type" msgstr "définir un nouveau type de données" -#: sql_help.c:5510 +#: sql_help.c:5651 msgid "define a new mapping of a user to a foreign server" msgstr "définit une nouvelle correspondance d'un utilisateur vers un serveur distant" -#: sql_help.c:5516 +#: sql_help.c:5657 msgid "define a new view" msgstr "définir une nouvelle vue" -#: sql_help.c:5522 +#: sql_help.c:5663 msgid "deallocate a prepared statement" msgstr "désallouer une instruction préparée" -#: sql_help.c:5528 +#: sql_help.c:5669 msgid "define a cursor" msgstr "définir un curseur" -#: sql_help.c:5534 +#: sql_help.c:5675 msgid "delete rows of a table" msgstr "supprimer des lignes d'une table" -#: sql_help.c:5540 +#: sql_help.c:5681 msgid "discard session state" msgstr "annuler l'état de la session" -#: sql_help.c:5546 +#: sql_help.c:5687 msgid "execute an anonymous code block" msgstr "exécute un bloc de code anonyme" -#: sql_help.c:5552 +#: sql_help.c:5693 msgid "remove an access method" msgstr "supprimer une méthode d'accès" -#: sql_help.c:5558 +#: sql_help.c:5699 msgid "remove an aggregate function" msgstr "supprimer une fonction d'agrégation" -#: sql_help.c:5564 +#: sql_help.c:5705 msgid "remove a cast" msgstr "supprimer un transtypage" -#: sql_help.c:5570 +#: sql_help.c:5711 msgid "remove a collation" msgstr "supprimer un collationnement" -#: sql_help.c:5576 +#: sql_help.c:5717 msgid "remove a conversion" msgstr "supprimer une conversion" -#: sql_help.c:5582 +#: sql_help.c:5723 msgid "remove a database" msgstr "supprimer une base de données" -#: sql_help.c:5588 +#: sql_help.c:5729 msgid "remove a domain" msgstr "supprimer un domaine" -#: sql_help.c:5594 +#: sql_help.c:5735 msgid "remove an event trigger" msgstr "supprimer un trigger sur évènement" -#: sql_help.c:5600 +#: sql_help.c:5741 msgid "remove an extension" msgstr "supprimer une extension" -#: sql_help.c:5606 +#: sql_help.c:5747 msgid "remove a foreign-data wrapper" msgstr "supprimer un wrapper de données distantes" -#: sql_help.c:5612 +#: sql_help.c:5753 msgid "remove a foreign table" msgstr "supprimer une table distante" -#: sql_help.c:5618 +#: sql_help.c:5759 msgid "remove a function" msgstr "supprimer une fonction" -#: sql_help.c:5624 sql_help.c:5690 sql_help.c:5792 +#: sql_help.c:5765 sql_help.c:5831 sql_help.c:5933 msgid "remove a database role" msgstr "supprimer un rôle de la base de données" -#: sql_help.c:5630 +#: sql_help.c:5771 msgid "remove an index" msgstr "supprimer un index" -#: sql_help.c:5636 +#: sql_help.c:5777 msgid "remove a procedural language" msgstr "supprimer un langage procédural" -#: sql_help.c:5642 +#: sql_help.c:5783 msgid "remove a materialized view" msgstr "supprimer une vue matérialisée" -#: sql_help.c:5648 +#: sql_help.c:5789 msgid "remove an operator" msgstr "supprimer un opérateur" -#: sql_help.c:5654 +#: sql_help.c:5795 msgid "remove an operator class" msgstr "supprimer une classe d'opérateur" -#: sql_help.c:5660 +#: sql_help.c:5801 msgid "remove an operator family" msgstr "supprimer une famille d'opérateur" -#: sql_help.c:5666 +#: sql_help.c:5807 msgid "remove database objects owned by a database role" msgstr "supprimer les objets appartenant à un rôle" -#: sql_help.c:5672 +#: sql_help.c:5813 msgid "remove a row-level security policy from a table" msgstr "supprimer une politique de sécurité au niveau ligne pour une table" -#: sql_help.c:5678 +#: sql_help.c:5819 msgid "remove a procedure" msgstr "supprimer une procédure" -#: sql_help.c:5684 +#: sql_help.c:5825 msgid "remove a publication" msgstr "supprimer une publication" -#: sql_help.c:5696 +#: sql_help.c:5837 msgid "remove a routine" msgstr "supprimer une routine" -#: sql_help.c:5702 +#: sql_help.c:5843 msgid "remove a rewrite rule" msgstr "supprimer une règle de réécriture" -#: sql_help.c:5708 +#: sql_help.c:5849 msgid "remove a schema" msgstr "supprimer un schéma" -#: sql_help.c:5714 +#: sql_help.c:5855 msgid "remove a sequence" msgstr "supprimer une séquence" -#: sql_help.c:5720 +#: sql_help.c:5861 msgid "remove a foreign server descriptor" msgstr "supprimer un descripteur de serveur distant" -#: sql_help.c:5726 +#: sql_help.c:5867 msgid "remove extended statistics" msgstr "supprimer des statistiques étendues" -#: sql_help.c:5732 +#: sql_help.c:5873 msgid "remove a subscription" msgstr "supprimer une souscription" -#: sql_help.c:5738 +#: sql_help.c:5879 msgid "remove a table" msgstr "supprimer une table" -#: sql_help.c:5744 +#: sql_help.c:5885 msgid "remove a tablespace" msgstr "supprimer un tablespace" -#: sql_help.c:5750 +#: sql_help.c:5891 msgid "remove a text search configuration" msgstr "supprimer une configuration de la recherche de texte" -#: sql_help.c:5756 +#: sql_help.c:5897 msgid "remove a text search dictionary" msgstr "supprimer un dictionnaire de la recherche de texte" -#: sql_help.c:5762 +#: sql_help.c:5903 msgid "remove a text search parser" msgstr "supprimer un analyseur de la recherche de texte" -#: sql_help.c:5768 +#: sql_help.c:5909 msgid "remove a text search template" msgstr "supprimer un modèle de la recherche de texte" -#: sql_help.c:5774 +#: sql_help.c:5915 msgid "remove a transform" msgstr "supprimer une transformation" -#: sql_help.c:5780 +#: sql_help.c:5921 msgid "remove a trigger" msgstr "supprimer un trigger" -#: sql_help.c:5786 +#: sql_help.c:5927 msgid "remove a data type" msgstr "supprimer un type de données" -#: sql_help.c:5798 +#: sql_help.c:5939 msgid "remove a user mapping for a foreign server" msgstr "supprime une correspondance utilisateur pour un serveur distant" -#: sql_help.c:5804 +#: sql_help.c:5945 msgid "remove a view" msgstr "supprimer une vue" -#: sql_help.c:5816 +#: sql_help.c:5957 msgid "execute a prepared statement" msgstr "exécuter une instruction préparée" -#: sql_help.c:5822 +#: sql_help.c:5963 msgid "show the execution plan of a statement" msgstr "afficher le plan d'exécution d'une instruction" -#: sql_help.c:5828 +#: sql_help.c:5969 msgid "retrieve rows from a query using a cursor" msgstr "extraire certaines lignes d'une requête à l'aide d'un curseur" -#: sql_help.c:5834 +#: sql_help.c:5975 msgid "define access privileges" msgstr "définir des privilèges d'accès" -#: sql_help.c:5840 +#: sql_help.c:5981 msgid "import table definitions from a foreign server" msgstr "importer la définition d'une table à partir d'un serveur distant" -#: sql_help.c:5846 +#: sql_help.c:5987 msgid "create new rows in a table" msgstr "créer de nouvelles lignes dans une table" -#: sql_help.c:5852 +#: sql_help.c:5993 msgid "listen for a notification" msgstr "se mettre à l'écoute d'une notification" -#: sql_help.c:5858 +#: sql_help.c:5999 msgid "load a shared library file" msgstr "charger un fichier de bibliothèque partagée" -#: sql_help.c:5864 +#: sql_help.c:6005 msgid "lock a table" msgstr "verrouiller une table" -#: sql_help.c:5870 +#: sql_help.c:6011 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "insère, modifie ou supprime des lignes d'une table de façon conditionnelle" + +#: sql_help.c:6017 msgid "position a cursor" msgstr "positionner un curseur" -#: sql_help.c:5876 +#: sql_help.c:6023 msgid "generate a notification" msgstr "engendrer une notification" -#: sql_help.c:5882 +#: sql_help.c:6029 msgid "prepare a statement for execution" msgstr "préparer une instruction pour exécution" -#: sql_help.c:5888 +#: sql_help.c:6035 msgid "prepare the current transaction for two-phase commit" msgstr "préparer la transaction en cours pour une validation en deux phases" -#: sql_help.c:5894 +#: sql_help.c:6041 msgid "change the ownership of database objects owned by a database role" msgstr "changer le propriétaire des objets d'un rôle" -#: sql_help.c:5900 +#: sql_help.c:6047 msgid "replace the contents of a materialized view" msgstr "remplacer le contenu d'une vue matérialisée" -#: sql_help.c:5906 +#: sql_help.c:6053 msgid "rebuild indexes" msgstr "reconstruire des index" -#: sql_help.c:5912 +#: sql_help.c:6059 msgid "destroy a previously defined savepoint" msgstr "détruire un point de retournement précédemment défini" -#: sql_help.c:5918 +#: sql_help.c:6065 msgid "restore the value of a run-time parameter to the default value" msgstr "réinitialiser un paramètre d'exécution à sa valeur par défaut" -#: sql_help.c:5924 +#: sql_help.c:6071 msgid "remove access privileges" msgstr "supprimer des privilèges d'accès" -#: sql_help.c:5936 +#: sql_help.c:6083 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "" "annuler une transaction précédemment préparée pour une validation en deux\n" "phases" -#: sql_help.c:5942 +#: sql_help.c:6089 msgid "roll back to a savepoint" msgstr "annuler jusqu'au point de retournement" -#: sql_help.c:5948 +#: sql_help.c:6095 msgid "define a new savepoint within the current transaction" msgstr "définir un nouveau point de retournement pour la transaction en cours" -#: sql_help.c:5954 +#: sql_help.c:6101 msgid "define or change a security label applied to an object" msgstr "définir ou modifier un label de sécurité à un objet" -#: sql_help.c:5960 sql_help.c:6014 sql_help.c:6050 +#: sql_help.c:6107 sql_help.c:6161 sql_help.c:6197 msgid "retrieve rows from a table or view" msgstr "extraire des lignes d'une table ou d'une vue" -#: sql_help.c:5972 +#: sql_help.c:6119 msgid "change a run-time parameter" msgstr "modifier un paramètre d'exécution" -#: sql_help.c:5978 +#: sql_help.c:6125 msgid "set constraint check timing for the current transaction" msgstr "définir le moment de la vérification des contraintes pour la transaction en cours" -#: sql_help.c:5984 +#: sql_help.c:6131 msgid "set the current user identifier of the current session" msgstr "définir l'identifiant actuel de l'utilisateur de la session courante" -#: sql_help.c:5990 +#: sql_help.c:6137 msgid "set the session user identifier and the current user identifier of the current session" msgstr "" "définir l'identifiant de l'utilisateur de session et l'identifiant actuel de\n" "l'utilisateur de la session courante" -#: sql_help.c:5996 +#: sql_help.c:6143 msgid "set the characteristics of the current transaction" msgstr "définir les caractéristiques de la transaction en cours" -#: sql_help.c:6002 +#: sql_help.c:6149 msgid "show the value of a run-time parameter" msgstr "afficher la valeur d'un paramètre d'exécution" -#: sql_help.c:6020 +#: sql_help.c:6167 msgid "empty a table or set of tables" msgstr "vider une table ou un ensemble de tables" -#: sql_help.c:6026 +#: sql_help.c:6173 msgid "stop listening for a notification" msgstr "arrêter l'écoute d'une notification" -#: sql_help.c:6032 +#: sql_help.c:6179 msgid "update rows of a table" msgstr "actualiser les lignes d'une table" -#: sql_help.c:6038 +#: sql_help.c:6185 msgid "garbage-collect and optionally analyze a database" msgstr "compacter et optionnellement analyser une base de données" -#: sql_help.c:6044 +#: sql_help.c:6191 msgid "compute a set of rows" msgstr "calculer un ensemble de lignes" -#: startup.c:213 +#: startup.c:220 #, c-format msgid "-1 can only be used in non-interactive mode" msgstr "-1 peut seulement être utilisé dans un mode non interactif" -#: startup.c:326 +#: startup.c:343 #, c-format msgid "could not open log file \"%s\": %m" -msgstr "n'a pas pu ouvrir le fichier applicatif « %s » : %m" +msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m" -#: startup.c:438 +#: startup.c:453 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6588,27 +6726,27 @@ msgstr "" "Saisissez « help » pour l'aide.\n" "\n" -#: startup.c:591 +#: startup.c:605 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "n'a pas pu configurer le paramètre d'impression « %s »" -#: startup.c:699 +#: startup.c:712 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Essayez « %s --help » pour plus d'informations.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." -#: startup.c:716 +#: startup.c:728 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "option supplémentaire « %s » ignorée" -#: startup.c:765 +#: startup.c:776 #, c-format msgid "could not find own program executable" msgstr "n'a pas pu trouver son propre exécutable" -#: tab-complete.c:4898 +#: tab-complete.c:5921 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6643,37 +6781,20 @@ msgstr "" "valeur « %s » non reconnue pour « %s »\n" "Les valeurs disponibles sont : %s." -#~ msgid "pclose failed: %m" -#~ msgstr "échec de pclose : %m" - -#~ msgid "Could not send cancel request: %s" -#~ msgstr "N'a pas pu envoyer la requête d'annulation : %s" - -#~ msgid "lock a named relation (table, etc)" -#~ msgstr "verrouille une relation nommée (table, etc)" - -#~ msgid "could not connect to server: %s" -#~ msgstr "n'a pas pu se connecter au serveur : %s" - -#~ msgid "Report bugs to .\n" -#~ msgstr "Rapporter les bogues à .\n" - -#~ msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n" -#~ msgstr "" -#~ " \\g [FICHIER] ou ; envoie le tampon de requêtes au serveur (et les\n" -#~ " résultats au fichier ou |tube)\n" +#~ msgid " \"%s\"" +#~ msgstr " « %s »" -#~ msgid "old_version" -#~ msgstr "ancienne_version" +#~ msgid " \"%s\" IN %s %s" +#~ msgstr " \"%s\" DANS %s %s" -#~ msgid "from_list" -#~ msgstr "liste_from" +#~ msgid " --help show this help, then exit\n" +#~ msgstr " --help affiche cette aide, puis quitte\n" -#~ msgid "normal" -#~ msgstr "normal" +#~ msgid " --version output version information, then exit\n" +#~ msgstr " --version affiche la version, puis quitte\n" -#~ msgid "Procedure" -#~ msgstr "Procédure" +#~ msgid " -?, --help show this help, then exit\n" +#~ msgstr " -?, --help affiche cette aide puis quitte\n" #~ msgid " SERVER_VERSION_NAME server's version (short string)\n" #~ msgstr " SERVER_VERSION_NAME version du serveur (chaîne courte)\n" @@ -6687,193 +6808,247 @@ msgstr "" #~ msgid " VERSION_NUM psql's version (numeric format)\n" #~ msgstr " VERSION_NUM version de psql (format numérique)\n" -#~ msgid "attribute" -#~ msgstr "attribut" +#~ msgid " \\dFd [PATTERN] list text search dictionaries (add \"+\" for more detail)\n" +#~ msgstr "" +#~ " \\dFd [MODÈLE] affiche la liste des dictionnaires de la recherche\n" +#~ " de texte (ajouter « + » pour plus de détails)\n" -#~ msgid "No per-database role settings support in this server version.\n" -#~ msgstr "Pas de supprot des paramètres rôle par base de données pour la version de ce serveur.\n" +#~ msgid " \\dFp [PATTERN] list text search parsers (add \"+\" for more detail)\n" +#~ msgstr "" +#~ " \\dFp [MODÈLE] affiche la liste des analyseurs de la recherche de\n" +#~ " texte (ajouter « + » pour plus de détails)\n" -#~ msgid "No matching settings found.\n" -#~ msgstr "Aucun paramètre correspondant trouvé.\n" +#~ msgid " \\dT [PATTERN] list data types (add \"+\" for more detail)\n" +#~ msgstr "" +#~ " \\dT [MODÈLE] affiche la liste des types de données (ajouter « + »\n" +#~ " pour plus de détails)\n" -#~ msgid "No settings found.\n" -#~ msgstr "Aucun paramètre trouvé.\n" +#~ msgid " \\db [PATTERN] list tablespaces (add \"+\" for more detail)\n" +#~ msgstr "" +#~ " \\db [MODÈLE] affiche la liste des tablespaces (ajouter « + » pour\n" +#~ " plus de détails)\n" -#~ msgid "No matching relations found.\n" -#~ msgstr "Aucune relation correspondante trouvée.\n" +#~ msgid " \\df [PATTERN] list functions (add \"+\" for more detail)\n" +#~ msgstr "" +#~ " \\df [MODÈLE] affiche la liste des fonctions (ajouter « + » pour\n" +#~ " plus de détails)\n" -#~ msgid "No relations found.\n" -#~ msgstr "Aucune relation trouvée.\n" +#~ msgid " \\dn [PATTERN] list schemas (add \"+\" for more detail)\n" +#~ msgstr "" +#~ " \\dn [MODÈLE] affiche la liste des schémas (ajouter « + » pour\n" +#~ " plus de détails)\n" -#~ msgid "Password encryption failed.\n" -#~ msgstr "Échec du chiffrement du mot de passe.\n" +#~ msgid "" +#~ " \\d{t|i|s|v|S} [PATTERN] (add \"+\" for more detail)\n" +#~ " list tables/indexes/sequences/views/system tables\n" +#~ msgstr "" +#~ " \\d{t|i|s|v|S} [MODÈLE] (ajouter « + » pour plus de détails)\n" +#~ " affiche la liste des\n" +#~ " tables/index/séquences/vues/tables système\n" -#~ msgid "\\%s: error while setting variable\n" -#~ msgstr "\\%s : erreur lors de l'initialisation de la variable\n" +#~ msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n" +#~ msgstr "" +#~ " \\g [FICHIER] ou ; envoie le tampon de requêtes au serveur (et les\n" +#~ " résultats au fichier ou |tube)\n" -#~ msgid "+ opt(%d) = |%s|\n" -#~ msgstr "+ opt(%d) = |%s|\n" +#~ msgid " \\l list all databases (add \"+\" for more detail)\n" +#~ msgstr "" +#~ " \\l affiche la liste des bases de données (ajouter « + »\n" +#~ " pour plus de détails)\n" -#~ msgid "could not set variable \"%s\"\n" -#~ msgstr "n'a pas pu initialiser la variable « %s »\n" +#~ msgid " \\l[+] list all databases\n" +#~ msgstr " \\l[+] affiche la liste des bases de données\n" -#~ msgid "Modifiers" -#~ msgstr "Modificateurs" +#~ msgid " \\z [PATTERN] list table, view, and sequence access privileges (same as \\dp)\n" +#~ msgstr "" +#~ " \\z [MODÈLE] affiche la liste des privilèges d'accès aux tables,\n" +#~ " vues et séquences (identique à \\dp)\n" -#~ msgid "collate %s" -#~ msgstr "collationnement %s" +#~ msgid " as user \"%s\"" +#~ msgstr " comme utilisateur « %s »" -#~ msgid "not null" -#~ msgstr "non NULL" +#~ msgid " at port \"%s\"" +#~ msgstr " sur le port « %s »" -#~ msgid "default %s" -#~ msgstr "Par défaut, %s" +#~ msgid " on host \"%s\"" +#~ msgstr " sur l'hôte « %s »" -#~ msgid "Modifier" -#~ msgstr "Modificateur" +#~ msgid "%s\n" +#~ msgstr "%s\n" -#~ msgid "Object Description" -#~ msgstr "Description d'un objet" +#~ msgid "%s: %s\n" +#~ msgstr "%s : %s\n" + +#~ msgid "%s: could not open log file \"%s\": %s\n" +#~ msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %s\n" #~ msgid "%s: could not set variable \"%s\"\n" #~ msgstr "%s : n'a pas pu initialiser la variable « %s »\n" -#~ msgid "Watch every %lds\t%s" -#~ msgstr "Vérifier chaque %lds\t%s" +#~ msgid "%s: pg_strdup: cannot duplicate null pointer (internal error)\n" +#~ msgstr "%s : pg_strdup : ne peut pas dupliquer le pointeur null (erreur interne)\n" -#~ msgid "Showing locale-adjusted numeric output." -#~ msgstr "Affichage de la sortie numérique adaptée à la locale." +#~ msgid "(1 row)" +#~ msgid_plural "(%lu rows)" +#~ msgstr[0] "(1 ligne)" +#~ msgstr[1] "(%lu lignes)" -#~ msgid "Showing only tuples." -#~ msgstr "Affichage des tuples seuls." +#~ msgid "(No rows)\n" +#~ msgstr "(Aucune ligne)\n" -#~ msgid "could not get current user name: %s\n" -#~ msgstr "n'a pas pu obtenir le nom d'utilisateur courant : %s\n" +#~ msgid "+ opt(%d) = |%s|\n" +#~ msgstr "+ opt(%d) = |%s|\n" -#~ msgid "agg_name" -#~ msgstr "nom_d_agrégat" +#~ msgid "?%c? \"%s.%s\"" +#~ msgstr "?%c? « %s.%s »" -#~ msgid "agg_type" -#~ msgstr "type_aggrégat" +#~ msgid "Access privileges for database \"%s\"" +#~ msgstr "Droits d'accès pour la base de données « %s »" -#~ msgid "input_data_type" -#~ msgstr "type_de_données_en_entrée" +#~ msgid "All connection parameters must be supplied because no database connection exists" +#~ msgstr "Tous les paramètres de connexion doivent être fournis car il n'existe pas de connexion à une base de données" -#~ msgid "could not change directory to \"%s\"" -#~ msgstr "n'a pas pu accéder au répertoire « %s »" +#~ msgid "Copy, Large Object\n" +#~ msgstr "Copie, « Large Object »\n" -#~ msgid "%s: pg_strdup: cannot duplicate null pointer (internal error)\n" -#~ msgstr "%s : pg_strdup : ne peut pas dupliquer le pointeur null (erreur interne)\n" +#~ msgid "Could not send cancel request: %s" +#~ msgstr "N'a pas pu envoyer la requête d'annulation : %s" -#~ msgid " \\l[+] list all databases\n" -#~ msgstr " \\l[+] affiche la liste des bases de données\n" +#~ msgid "Disabled triggers:" +#~ msgstr "Triggers désactivés :" -#~ msgid "\\%s: error\n" -#~ msgstr "\\%s : erreur\n" +#~ msgid "Enter new password: " +#~ msgstr "Saisir le nouveau mot de passe : " -#~ msgid "\\copy: %s" -#~ msgstr "\\copy : %s" +#~ msgid "Exclusion constraints:" +#~ msgstr "Contraintes d'exclusion :" -#~ msgid "\\copy: unexpected response (%d)\n" -#~ msgstr "\\copy : réponse inattendue (%d)\n" +#~ msgid "Invalid command \\%s. Try \\? for help.\n" +#~ msgstr "Commande \\%s invalide. Essayez \\? pour l'aide-mémoire.\n" -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide, puis quitte\n" +#~ msgid "Modifier" +#~ msgstr "Modificateur" -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version, puis quitte\n" +#~ msgid "Modifiers" +#~ msgstr "Modificateurs" -#~ msgid "contains support for command-line editing" -#~ msgstr "contient une gestion avancée de la ligne de commande" +#~ msgid "No matching relations found.\n" +#~ msgstr "Aucune relation correspondante trouvée.\n" -#~ msgid "data type" -#~ msgstr "type de données" +#~ msgid "No matching settings found.\n" +#~ msgstr "Aucun paramètre correspondant trouvé.\n" -#~ msgid "column" -#~ msgstr "colonne" +#~ msgid "No per-database role settings support in this server version.\n" +#~ msgstr "Pas de supprot des paramètres rôle par base de données pour la version de ce serveur.\n" -#~ msgid "new_column" -#~ msgstr "nouvelle_colonne" +#~ msgid "No relations found.\n" +#~ msgstr "Aucune relation trouvée.\n" -#~ msgid "tablespace" -#~ msgstr "tablespace" +#~ msgid "No settings found.\n" +#~ msgstr "Aucun paramètre trouvé.\n" -#~ msgid " on host \"%s\"" -#~ msgstr " sur l'hôte « %s »" +#~ msgid "Object Description" +#~ msgstr "Description d'un objet" -#~ msgid " at port \"%s\"" -#~ msgstr " sur le port « %s »" +#~ msgid "Password encryption failed.\n" +#~ msgstr "Échec du chiffrement du mot de passe.\n" -#~ msgid " as user \"%s\"" -#~ msgstr " comme utilisateur « %s »" +#~ msgid "Procedure" +#~ msgstr "Procédure" -#~ msgid "define a new constraint trigger" -#~ msgstr "définir une nouvelle contrainte de déclenchement" +#~ msgid "Report bugs to .\n" +#~ msgstr "Rapporter les bogues à .\n" -#~ msgid "Exclusion constraints:" -#~ msgstr "Contraintes d'exclusion :" +#~ msgid "Report bugs to .\n" +#~ msgstr "Rapportez les bogues à .\n" -#~ msgid "rolename" -#~ msgstr "nom_rôle" +#~ msgid "SSL connection (unknown cipher)\n" +#~ msgstr "Connexion SSL (chiffrement inconnu)\n" -#~ msgid " \"%s\" IN %s %s" -#~ msgstr " \"%s\" DANS %s %s" +#~ msgid "Showing locale-adjusted numeric output." +#~ msgstr "Affichage de la sortie numérique adaptée à la locale." -#~ msgid "(1 row)" -#~ msgid_plural "(%lu rows)" -#~ msgstr[0] "(1 ligne)" -#~ msgstr[1] "(%lu lignes)" +#~ msgid "Showing only tuples." +#~ msgstr "Affichage des tuples seuls." -#~ msgid "" -#~ " \\d{t|i|s|v|S} [PATTERN] (add \"+\" for more detail)\n" -#~ " list tables/indexes/sequences/views/system tables\n" -#~ msgstr "" -#~ " \\d{t|i|s|v|S} [MODÈLE] (ajouter « + » pour plus de détails)\n" -#~ " affiche la liste des\n" -#~ " tables/index/séquences/vues/tables système\n" +#, c-format +#~ msgid "Special relation \"%s.%s\"" +#~ msgstr "Relation spéciale « %s.%s »" -#~ msgid " \\db [PATTERN] list tablespaces (add \"+\" for more detail)\n" -#~ msgstr "" -#~ " \\db [MODÈLE] affiche la liste des tablespaces (ajouter « + » pour\n" -#~ " plus de détails)\n" +#, c-format +#~ msgid "The server (version %s) does not support altering default privileges." +#~ msgstr "Le serveur (version %s) ne supporte pas la modification des droits par défaut." -#~ msgid " \\df [PATTERN] list functions (add \"+\" for more detail)\n" -#~ msgstr "" -#~ " \\df [MODÈLE] affiche la liste des fonctions (ajouter « + » pour\n" -#~ " plus de détails)\n" +#, c-format +#~ msgid "The server (version %s) does not support collations." +#~ msgstr "Le serveur (version %s) ne supporte pas les collationnements." -#~ msgid " \\dFd [PATTERN] list text search dictionaries (add \"+\" for more detail)\n" -#~ msgstr "" -#~ " \\dFd [MODÈLE] affiche la liste des dictionnaires de la recherche\n" -#~ " de texte (ajouter « + » pour plus de détails)\n" +#, c-format +#~ msgid "The server (version %s) does not support editing function source." +#~ msgstr "Le serveur (version %s) ne supporte pas l'édition du code de la fonction." -#~ msgid " \\dFp [PATTERN] list text search parsers (add \"+\" for more detail)\n" -#~ msgstr "" -#~ " \\dFp [MODÈLE] affiche la liste des analyseurs de la recherche de\n" -#~ " texte (ajouter « + » pour plus de détails)\n" +#, c-format +#~ msgid "The server (version %s) does not support editing view definitions." +#~ msgstr "Le serveur (version %s) ne supporte pas l'édition des définitions de vue." -#~ msgid " \\dn [PATTERN] list schemas (add \"+\" for more detail)\n" -#~ msgstr "" -#~ " \\dn [MODÈLE] affiche la liste des schémas (ajouter « + » pour\n" -#~ " plus de détails)\n" +#, c-format +#~ msgid "The server (version %s) does not support foreign servers." +#~ msgstr "Le serveur (version %s) ne supporte pas les serveurs distants." -#~ msgid " \\dT [PATTERN] list data types (add \"+\" for more detail)\n" -#~ msgstr "" -#~ " \\dT [MODÈLE] affiche la liste des types de données (ajouter « + »\n" -#~ " pour plus de détails)\n" +#, c-format +#~ msgid "The server (version %s) does not support foreign tables." +#~ msgstr "Le serveur (version %s) ne supporte pas les tables distantes." -#~ msgid " \\l list all databases (add \"+\" for more detail)\n" -#~ msgstr "" -#~ " \\l affiche la liste des bases de données (ajouter « + »\n" -#~ " pour plus de détails)\n" +#, c-format +#~ msgid "The server (version %s) does not support foreign-data wrappers." +#~ msgstr "Le serveur (version %s) ne supporte pas les wrappers de données distantes." -#~ msgid " \\z [PATTERN] list table, view, and sequence access privileges (same as \\dp)\n" +#, c-format +#~ msgid "The server (version %s) does not support full text search." +#~ msgstr "Le serveur (version %s) ne supporte pas la recherche plein texte." + +#, c-format +#~ msgid "The server (version %s) does not support per-database role settings." +#~ msgstr "Le serveur (version %s) ne supporte pas les paramètres de rôles par bases de données." + +#, c-format +#~ msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." +#~ msgstr "Le serveur (version %s) ne supporte pas les points de sauvegarde pour ON_ERROR_ROLLBACK." + +#, c-format +#~ msgid "The server (version %s) does not support showing function source." +#~ msgstr "Le serveur (version %s) ne supporte pas l'affichage du code de la fonction." + +#, c-format +#~ msgid "The server (version %s) does not support showing view definitions." +#~ msgstr "Le serveur (version %s) ne supporte pas l'affichage des définitions de vues." + +#, c-format +#~ msgid "The server (version %s) does not support tablespaces." +#~ msgstr "Le serveur (version %s) ne supporte pas les tablespaces." + +#, c-format +#~ msgid "The server (version %s) does not support user mappings." +#~ msgstr "Le serveur (version %s) ne supporte pas les correspondances d'utilisateurs." + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" + +#~ msgid "" +#~ "WARNING: You are connected to a server with major version %d.%d,\n" +#~ "but your %s client is major version %d.%d. Some backslash commands,\n" +#~ "such as \\d, might not work properly.\n" +#~ "\n" #~ msgstr "" -#~ " \\z [MODÈLE] affiche la liste des privilèges d'accès aux tables,\n" -#~ " vues et séquences (identique à \\dp)\n" +#~ "ATTENTION : vous êtes connecté sur un serveur dont la version majeure est\n" +#~ "%d.%d alors que votre client %s est en version majeure %d.%d. Certaines\n" +#~ "commandes avec antislashs, comme \\d, peuvent ne pas fonctionner\n" +#~ "correctement.\n" +#~ "\n" -#~ msgid "Copy, Large Object\n" -#~ msgstr "Copie, « Large Object »\n" +#~ msgid "Watch every %lds\t%s" +#~ msgstr "Vérifier chaque %lds\t%s" #~ msgid "" #~ "Welcome to %s %s (server %s), the PostgreSQL interactive terminal.\n" @@ -6889,98 +7064,136 @@ msgstr "" #~ "Bienvenue dans %s %s, l'interface interactive de PostgreSQL.\n" #~ "\n" -#~ msgid "" -#~ "WARNING: You are connected to a server with major version %d.%d,\n" -#~ "but your %s client is major version %d.%d. Some backslash commands,\n" -#~ "such as \\d, might not work properly.\n" -#~ "\n" -#~ msgstr "" -#~ "ATTENTION : vous êtes connecté sur un serveur dont la version majeure est\n" -#~ "%d.%d alors que votre client %s est en version majeure %d.%d. Certaines\n" -#~ "commandes avec antislashs, comme \\d, peuvent ne pas fonctionner\n" -#~ "correctement.\n" -#~ "\n" +#~ msgid "\\%s: error\n" +#~ msgstr "\\%s : erreur\n" -#~ msgid "Access privileges for database \"%s\"" -#~ msgstr "Droits d'accès pour la base de données « %s »" +#~ msgid "\\%s: error while setting variable\n" +#~ msgstr "\\%s : erreur lors de l'initialisation de la variable\n" -#~ msgid "?%c? \"%s.%s\"" -#~ msgstr "?%c? « %s.%s »" +#~ msgid "\\copy: %s" +#~ msgstr "\\copy : %s" -#~ msgid " \"%s\"" -#~ msgstr " « %s »" +#~ msgid "\\copy: unexpected response (%d)\n" +#~ msgstr "\\copy : réponse inattendue (%d)\n" -#~ msgid "(No rows)\n" -#~ msgstr "(Aucune ligne)\n" +#~ msgid "agg_name" +#~ msgstr "nom_d_agrégat" -#~ msgid " -?, --help show this help, then exit\n" -#~ msgstr " -?, --help affiche cette aide puis quitte\n" +#~ msgid "agg_type" +#~ msgstr "type_aggrégat" -#~ msgid "SSL connection (unknown cipher)\n" -#~ msgstr "Connexion SSL (chiffrement inconnu)\n" +#~ msgid "attribute" +#~ msgstr "attribut" -#~ msgid "serialtype" -#~ msgstr "serialtype" +#~ msgid "child process was terminated by signal %d" +#~ msgstr "le processus fils a été terminé par le signal %d" -#~ msgid "statistic_type" -#~ msgstr "type_statistique" +#~ msgid "child process was terminated by signal %s" +#~ msgstr "le processus fils a été terminé par le signal %s" -#~ msgid "Value" -#~ msgstr "Valeur" +#~ msgid "collate %s" +#~ msgstr "collationnement %s" -#~ msgid "%s: could not open log file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %s\n" +#~ msgid "collation_name" +#~ msgstr "nom_collation" -#~ msgid "string_literal" -#~ msgstr "littéral_chaîne" +#~ msgid "column" +#~ msgstr "colonne" -#~ msgid "unterminated quoted string\n" -#~ msgstr "chaîne entre guillemets non terminée\n" +#~ msgid "contains support for command-line editing" +#~ msgstr "contient une gestion avancée de la ligne de commande" -#~ msgid "Report bugs to .\n" -#~ msgstr "Rapportez les bogues à .\n" +#~ msgid "could not change directory to \"%s\"" +#~ msgstr "n'a pas pu accéder au répertoire « %s »" -#~ msgid "%s\n" -#~ msgstr "%s\n" +#~ msgid "could not change directory to \"%s\": %s" +#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s" #~ msgid "could not close pipe to external command: %s\n" #~ msgstr "n'a pas pu fermer le fichier pipe vers la commande externe : %s\n" -#~ msgid "could not stat file \"%s\": %s\n" -#~ msgstr "n'a pas pu tester le fichier « %s » : %s\n" +#~ msgid "could not connect to server: %s" +#~ msgstr "n'a pas pu se connecter au serveur : %s" #~ msgid "could not execute command \"%s\": %s\n" #~ msgstr "n'a pas pu exécuter la commande « %s » : %s\n" +#~ msgid "could not get current user name: %s\n" +#~ msgstr "n'a pas pu obtenir le nom d'utilisateur courant : %s\n" + +#~ msgid "could not identify current directory: %s" +#~ msgstr "n'a pas pu identifier le répertoire courant : %s" + #~ msgid "could not open temporary file \"%s\": %s\n" #~ msgstr "n'a pas pu ouvrir le fichier temporaire « %s » : %s\n" -#~ msgid "%s: %s\n" -#~ msgstr "%s : %s\n" +#~ msgid "could not read symbolic link \"%s\"" +#~ msgstr "n'a pas pu lire le lien symbolique « %s »" -#~ msgid "Invalid command \\%s. Try \\? for help.\n" -#~ msgstr "Commande \\%s invalide. Essayez \\? pour l'aide-mémoire.\n" +#~ msgid "could not set variable \"%s\"\n" +#~ msgstr "n'a pas pu initialiser la variable « %s »\n" -#~ msgid "child process was terminated by signal %d" -#~ msgstr "le processus fils a été terminé par le signal %d" +#~ msgid "could not stat file \"%s\": %s\n" +#~ msgstr "n'a pas pu tester le fichier « %s » : %s\n" -#~ msgid "child process was terminated by signal %s" -#~ msgstr "le processus fils a été terminé par le signal %s" +#~ msgid "data type" +#~ msgstr "type de données" + +#~ msgid "default %s" +#~ msgstr "Par défaut, %s" + +#~ msgid "define a new constraint trigger" +#~ msgstr "définir une nouvelle contrainte de déclenchement" + +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatal : " + +#~ msgid "from_list" +#~ msgstr "liste_from" + +#~ msgid "input_data_type" +#~ msgstr "type_de_données_en_entrée" + +#~ msgid "lock a named relation (table, etc)" +#~ msgstr "verrouille une relation nommée (table, etc)" + +#~ msgid "new_column" +#~ msgstr "nouvelle_colonne" + +#~ msgid "normal" +#~ msgstr "normal" + +#~ msgid "not null" +#~ msgstr "non NULL" + +#~ msgid "pclose failed: %m" +#~ msgstr "échec de pclose : %m" #~ msgid "pclose failed: %s" #~ msgstr "échec de pclose : %s" -#~ msgid "could not read symbolic link \"%s\"" -#~ msgstr "n'a pas pu lire le lien symbolique « %s »" +#~ msgid "rolename" +#~ msgstr "nom_rôle" -#~ msgid "could not change directory to \"%s\": %s" -#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s" +#~ msgid "serialtype" +#~ msgstr "serialtype" -#~ msgid "could not identify current directory: %s" -#~ msgstr "n'a pas pu identifier le répertoire courant : %s" +#~ msgid "special" +#~ msgstr "spécial" -#~ msgid "All connection parameters must be supplied because no database connection exists" -#~ msgstr "Tous les paramètres de connexion doivent être fournis car il n'existe pas de connexion à une base de données" +#~ msgid "statistic_type" +#~ msgstr "type_statistique" -#~ msgid "collation_name" -#~ msgstr "nom_collation" +#~ msgid "string_literal" +#~ msgstr "littéral_chaîne" + +#~ msgid "tablespace" +#~ msgstr "tablespace" + +#, c-format +#~ msgid "unexpected result status for \\watch" +#~ msgstr "statut résultat inattendu pour \\watch" + +#~ msgid "unterminated quoted string\n" +#~ msgstr "chaîne entre guillemets non terminée\n" diff --git a/src/bin/psql/po/ja.po b/src/bin/psql/po/ja.po index f33e5e97f4..f60d6403ec 100644 --- a/src/bin/psql/po/ja.po +++ b/src/bin/psql/po/ja.po @@ -1,14 +1,18 @@ -# Japanese message translation file for psql -# Copyright (C) 2019 PostgreSQL Global Development Group -# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. +# psql.po +# Japanese message translation file for psql +# +# Copyright (C) 2010-2022 PostgreSQL Global Development Group +# # Michihide Hotta , 2010. # +# This file is distributed under the same license as the PostgreSQL package. +# msgid "" msgstr "" -"Project-Id-Version: psql (PostgreSQL 13)\n" +"Project-Id-Version: psql (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:55+0900\n" -"PO-Revision-Date: 2020-09-13 09:00+0200\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" +"PO-Revision-Date: 2022-05-10 21:08+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -18,58 +22,64 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:241 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " - -#: ../../../src/common/logging.c:248 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:255 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "警告: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "ヒント: " + +#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "カレントディレクトリを識別できませんでした: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "無効なバイナリ\"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "バイナリ\"%s\"を読み取ることができませんでした" -#: ../../common/exec.c:214 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "実行対象の\"%s\"が見つかりませんでした" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:282 ../../common/exec.c:321 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "ディレクトリ\"%s\"に移動できませんでした: %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:299 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を読めませんでした: %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:422 #, c-format -msgid "pclose failed: %m" -msgstr "pcloseが失敗しました: %m" +msgid "%s() failed: %m" +msgstr "%s() が失敗しました: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 -#: command.c:1255 input.c:227 mainloop.c:81 mainloop.c:402 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: command.c:1320 command.c:3316 command.c:3365 command.c:3489 input.c:227 +#: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "メモリ不足です" @@ -90,7 +100,7 @@ msgstr "null ポインターを複製することはできません(内部エラ msgid "could not look up effective user ID %ld: %s" msgstr "実効ユーザID %ld が見つかりませんでした: %s" -#: ../../common/username.c:45 command.c:559 +#: ../../common/username.c:45 command.c:576 msgid "user does not exist" msgstr "ユーザが存在しません" @@ -129,304 +139,301 @@ msgstr "子プロセスはシグナル%dにより終了しました: %s" msgid "child process exited with unrecognized status %d" msgstr "子プロセスは認識できないステータス %d で終了しました" -#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 msgid "Cancel request sent\n" msgstr "キャンセル要求を送信しました\n" -#: ../../fe_utils/cancel.c:165 +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 msgid "Could not send cancel request: " msgstr "キャンセル要求を送信できませんでした: " -#: ../../fe_utils/cancel.c:210 -#, c-format -msgid "Could not send cancel request: %s" -msgstr "キャンセル要求を送信できませんでした: %s" - -#: ../../fe_utils/print.c:336 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu 行)" -#: ../../fe_utils/print.c:3039 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "割り込み\n" -#: ../../fe_utils/print.c:3103 +#: ../../fe_utils/print.c:3173 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "テーブルの内容にヘッダーを追加できません: 列数 %d が制限値を超えています。\n" -#: ../../fe_utils/print.c:3143 +#: ../../fe_utils/print.c:3213 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "テーブルの内容にセルを追加できません: セルの合計数 %d が制限値を超えています。\n" -#: ../../fe_utils/print.c:3398 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "出力フォーマットが無効(内部エラー):%d" -#: command.c:224 +#: ../../fe_utils/psqlscan.l:701 +#, c-format +msgid "skipping recursive expansion of variable \"%s\"" +msgstr "変数\"%s\"の再帰展開をスキップしています" + +#: ../../port/thread.c:100 ../../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "ローカルユーザID %dの参照に失敗しました: %s" + +#: ../../port/thread.c:105 ../../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "ID %d を持つローカルユーザは存在しません" + +#: command.c:233 #, c-format msgid "invalid command \\%s" msgstr "不正なコマンド \\%s " -#: command.c:226 +#: command.c:235 #, c-format msgid "Try \\? for help." msgstr " \\? でヘルプを表示します。" -#: command.c:244 +#: command.c:253 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: 余分な引数\"%s\"は無視されました" -#: command.c:296 +#: command.c:305 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "\\%s コマンドは無視されます; 現在の\\ifブロックを抜けるには\\endifまたはCtrl-Cを使用します" -#: command.c:557 +#: command.c:574 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "ユーザID %ldのホームディレクトリを取得できませんでした : %s" -#: command.c:575 +#: command.c:593 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: ディレクトリを\"%s\"に変更できませんでした: %m" -#: command.c:600 +#: command.c:618 #, c-format msgid "You are currently not connected to a database.\n" msgstr "現在データベースに接続していません。\n" -#: command.c:613 +#: command.c:628 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "データベース\"%s\"にユーザ\"%s\"として、ホスト\"%s\"上のポート\"%s\"で接続しています。\n" -#: command.c:616 +#: command.c:631 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "データベース\"%s\"にユーザ\"%s\"として、\"%s\"のソケットを介してポート\"%s\"で接続しています。\n" -#: command.c:622 +#: command.c:637 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "データベース\"%s\"にユーザ\"%s\"として、ホスト\"%s\"(アドレス\"%s\")上のポート\"%s\"で接続しています。\n" -#: command.c:625 +#: command.c:640 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "データベース\"%s\"にユーザ\"%s\"として、ホスト\"%s\"上のポート\"%s\"で接続しています。\n" -#: command.c:965 command.c:1061 command.c:2550 +#: command.c:1031 command.c:1126 command.c:2660 #, c-format msgid "no query buffer" msgstr "問い合わせバッファがありません" -#: command.c:998 command.c:5061 +#: command.c:1064 command.c:5485 #, c-format msgid "invalid line number: %s" msgstr "不正な行番号です: %s" -#: command.c:1052 -#, c-format -msgid "The server (version %s) does not support editing function source." -msgstr "このサーバ(バージョン%s)は関数ソースコードの編集をサポートしていません。" - -#: command.c:1055 -#, c-format -msgid "The server (version %s) does not support editing view definitions." -msgstr "このサーバ(バージョン%s)はビュー定義の編集をサポートしていません。" - -#: command.c:1137 +#: command.c:1202 msgid "No changes" msgstr "変更されていません" -#: command.c:1216 +#: command.c:1281 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: エンコーディング名が不正であるか、または変換プロシージャが見つかりません。" -#: command.c:1251 command.c:1992 command.c:3253 command.c:5163 common.c:174 -#: common.c:223 common.c:388 common.c:1237 common.c:1265 common.c:1373 -#: common.c:1480 common.c:1518 copy.c:488 copy.c:707 help.c:62 large_obj.c:157 -#: large_obj.c:192 large_obj.c:254 +#: command.c:1316 command.c:2119 command.c:3312 command.c:3511 command.c:5587 +#: common.c:177 common.c:226 common.c:395 common.c:1094 common.c:1172 +#: common.c:1190 common.c:1263 common.c:1370 common.c:1408 common.c:1494 +#: common.c:1537 copy.c:488 copy.c:722 help.c:61 large_obj.c:157 +#: large_obj.c:192 large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1258 +#: command.c:1323 msgid "There is no previous error." msgstr "直前のエラーはありません。" -#: command.c:1371 +#: command.c:1436 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: 右括弧がありません" -#: command.c:1548 command.c:1853 command.c:1867 command.c:1884 command.c:2044 -#: command.c:2281 command.c:2517 command.c:2557 +#: command.c:1520 command.c:1650 command.c:1955 command.c:1969 command.c:1988 +#: command.c:2172 command.c:2414 command.c:2627 command.c:2667 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: 必要な引数がありません" -#: command.c:1679 +#: command.c:1781 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: \\else の後には置けません" -#: command.c:1684 +#: command.c:1786 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: 対応する \\if がありません" -#: command.c:1748 +#: command.c:1850 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: \\else の後には置けません" -#: command.c:1753 +#: command.c:1855 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: 対応する \\if がありません" -#: command.c:1793 +#: command.c:1895 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: 対応する \\if がありません" -#: command.c:1948 +#: command.c:2052 msgid "Query buffer is empty." msgstr "問い合わせバッファは空です。" -#: command.c:1970 -msgid "Enter new password: " -msgstr "新しいパスワードを入力してください: " +#: command.c:2095 +#, c-format +msgid "Enter new password for user \"%s\": " +msgstr "ユーザー\"%s\"の新しいパスワードを入力してください: " -#: command.c:1971 +#: command.c:2099 msgid "Enter it again: " msgstr "もう一度入力してください: " -#: command.c:1975 +#: command.c:2108 #, c-format msgid "Passwords didn't match." msgstr "パスワードが一致しませんでした。" -#: command.c:2074 +#: command.c:2207 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: 変数の値を読み取ることができませんでした" -#: command.c:2177 +#: command.c:2310 msgid "Query buffer reset (cleared)." msgstr "問い合わせバッファがリセット(クリア)されました。" -#: command.c:2199 +#: command.c:2332 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "ファイル\"%s\"にヒストリーを出力しました。\n" -#: command.c:2286 +#: command.c:2419 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: 環境変数名に\"=\"を含めることはできません" -#: command.c:2347 -#, c-format -msgid "The server (version %s) does not support showing function source." -msgstr "このサーバ(バージョン%s)は関数ソースの表示をサポートしていません。" - -#: command.c:2350 -#, c-format -msgid "The server (version %s) does not support showing view definitions." -msgstr "このサーバ(バージョン%s)はビュー定義の表示をサポートしていません。" - -#: command.c:2357 +#: command.c:2467 #, c-format msgid "function name is required" msgstr "関数名が必要です" -#: command.c:2359 +#: command.c:2469 #, c-format msgid "view name is required" msgstr "ビュー名が必要です" -#: command.c:2489 +#: command.c:2599 msgid "Timing is on." msgstr "タイミングは on です。" -#: command.c:2491 +#: command.c:2601 msgid "Timing is off." msgstr "タイミングは off です。" -#: command.c:2576 command.c:2604 command.c:3661 command.c:3664 command.c:3667 -#: command.c:3673 command.c:3675 command.c:3683 command.c:3693 command.c:3702 -#: command.c:3716 command.c:3733 command.c:3791 common.c:70 copy.c:331 +#: command.c:2686 command.c:2714 command.c:3952 command.c:3955 command.c:3958 +#: command.c:3964 command.c:3966 command.c:3992 command.c:4002 command.c:4014 +#: command.c:4028 command.c:4055 command.c:4113 common.c:73 copy.c:331 #: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:2988 startup.c:236 startup.c:287 +#: command.c:3113 startup.c:243 startup.c:293 msgid "Password: " msgstr "パスワード: " -#: command.c:2993 startup.c:284 +#: command.c:3118 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "ユーザ %s のパスワード: " -#: command.c:3064 +#: command.c:3174 +#, c-format +msgid "Do not give user, host, or port separately when using a connection string" +msgstr "接続文字列使用時はユーザー、ホストおよびポートは個別に指定しないでください" + +#: command.c:3209 #, c-format -msgid "All connection parameters must be supplied because no database connection exists" -msgstr "既存のデータベース接続がないため、すべての接続パラメータを指定しなければなりません" +msgid "No database connection exists to re-use parameters from" +msgstr "パラメータ再利用に使用可能なデータベース接続がありません" -#: command.c:3257 +#: command.c:3517 #, c-format msgid "Previous connection kept" msgstr "以前の接続は保持されています" -#: command.c:3261 +#: command.c:3523 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3310 +#: command.c:3579 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "データベース\"%s\"にユーザ\"%s\"として、ホスト\"%s\"のポート\"%s\"で接続しました。\n" -#: command.c:3313 +#: command.c:3582 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "データベース\"%s\"にユーザ\"%s\"として、ソケット\"%s\"のポート\"%s\"を介して接続しました。\n" -#: command.c:3319 +#: command.c:3588 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "データベース\"%s\"にユーザ\"%s\"として、ホスト\"%s\"(アドレス\"%s\")のポート\"%s\"で接続しました。\n" -#: command.c:3322 +#: command.c:3591 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "データベース\"%s\"にユーザ\"%s\"として、ホスト\"%s\"のポート\"%s\"を介して接続しました。\n" -#: command.c:3327 +#: command.c:3596 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "データベース\"%s\"にユーザ\"%s\"として接続しました。\n" -#: command.c:3360 +#: command.c:3636 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s、サーバ %s)\n" -#: command.c:3368 +#: command.c:3649 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -435,29 +442,29 @@ msgstr "" "警告: %s のメジャーバージョンは %s ですが、サーバのメジャーバージョンは %s です。\n" " psql の機能の中で、動作しないものがあるかもしれません。\n" -#: command.c:3407 +#: command.c:3686 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" -msgstr "SSL 接続 (プロトコル: %s、暗号化方式: %s、ビット長: %s、圧縮: %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" +msgstr "SSL接続(プロトコル: %s、暗号化方式: %s、圧縮: %s)\n" -#: command.c:3408 command.c:3409 command.c:3410 +#: command.c:3687 command.c:3688 msgid "unknown" msgstr "不明" -#: command.c:3411 help.c:45 +#: command.c:3689 help.c:45 msgid "off" msgstr "オフ" -#: command.c:3411 help.c:45 +#: command.c:3689 help.c:45 msgid "on" msgstr "オン" -#: command.c:3425 +#: command.c:3703 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "GSSAPI暗号化接続\n" -#: command.c:3445 +#: command.c:3723 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -468,258 +475,268 @@ msgstr "" " 8ビット文字が正しく表示されない可能性があります。詳細はpsqlリファレンスマニュアルの\n" " \"Windowsユーザ向けの注意\" (Notes for Windows users)を参照してください。\n" -#: command.c:3549 +#: command.c:3828 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "環境変数PSQL_EDITOR_LINENUMBER_ARGで行番号を指定する必要があります" -#: command.c:3578 +#: command.c:3857 #, c-format msgid "could not start editor \"%s\"" msgstr "エディタ\"%s\"を起動できませんでした" -#: command.c:3580 +#: command.c:3859 #, c-format msgid "could not start /bin/sh" msgstr "/bin/shを起動できませんでした" -#: command.c:3618 +#: command.c:3909 #, c-format msgid "could not locate temporary directory: %s" msgstr "一時ディレクトリが見つかりませんでした: %s" -#: command.c:3645 +#: command.c:3936 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"をオープンできませんでした: %m" -#: command.c:3950 +#: command.c:4272 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: 曖昧な短縮形\"%s\"が\"%s\"と\"%s\"のどちらにも合致します" -#: command.c:3970 +#: command.c:4292 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset: 有効なフォーマットはaligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:3989 +#: command.c:4311 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: 有効な線のスタイルは ascii, old-ascii, unicode" -#: command.c:4004 +#: command.c:4326 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: 有効な Unicode 罫線のスタイルは single, double" -#: command.c:4019 +#: command.c:4341 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: 有効な Unicode 列罫線のスタイルは single, double" -#: command.c:4034 +#: command.c:4356 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: 有効な Unicode ヘッダー罫線のスタイルは single, double" -#: command.c:4077 +#: command.c:4399 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsepは単一の1バイト文字でなければなりません" -#: command.c:4082 +#: command.c:4404 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldsepはダブルクォート、改行(LF)または復帰(CR)にはできません" -#: command.c:4219 command.c:4407 +#: command.c:4541 command.c:4729 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: 未定義のオプション:%s" -#: command.c:4239 +#: command.c:4561 #, c-format msgid "Border style is %d.\n" msgstr "罫線スタイルは %d です。\n" -#: command.c:4245 +#: command.c:4567 #, c-format msgid "Target width is unset.\n" msgstr "ターゲットの幅が設定されていません。\n" -#: command.c:4247 +#: command.c:4569 #, c-format msgid "Target width is %d.\n" msgstr "ターゲットの幅は %d です。\n" -#: command.c:4254 +#: command.c:4576 #, c-format msgid "Expanded display is on.\n" msgstr "拡張表示は on です。\n" -#: command.c:4256 +#: command.c:4578 #, c-format msgid "Expanded display is used automatically.\n" msgstr "拡張表示が自動的に使われます。\n" -#: command.c:4258 +#: command.c:4580 #, c-format msgid "Expanded display is off.\n" msgstr "拡張表示は off です。\n" -#: command.c:4264 +#: command.c:4586 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "CSVのフィールド区切り文字は\"%s\"です。\n" -#: command.c:4272 command.c:4280 +#: command.c:4594 command.c:4602 #, c-format msgid "Field separator is zero byte.\n" msgstr "フィールド区切り文字はゼロバイトです。\n" -#: command.c:4274 +#: command.c:4596 #, c-format msgid "Field separator is \"%s\".\n" msgstr "フィールド区切り文字は\"%s\"です。\n" -#: command.c:4287 +#: command.c:4609 #, c-format msgid "Default footer is on.\n" msgstr "デフォルトフッター(行数の表示)は on です。\n" -#: command.c:4289 +#: command.c:4611 #, c-format msgid "Default footer is off.\n" msgstr "デフォルトフッター(行数の表示)は off です。\n" -#: command.c:4295 +#: command.c:4617 #, c-format msgid "Output format is %s.\n" msgstr "出力形式は %s です。\n" -#: command.c:4301 +#: command.c:4623 #, c-format msgid "Line style is %s.\n" msgstr "線のスタイルは %s です。\n" -#: command.c:4308 +#: command.c:4630 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null表示は\"%s\"です。\n" -#: command.c:4316 +#: command.c:4638 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "『数値出力時のロケール調整』は on です。\n" -#: command.c:4318 +#: command.c:4640 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "『数値出力時のロケール調整』は off です。\n" -#: command.c:4325 +#: command.c:4647 #, c-format msgid "Pager is used for long output.\n" msgstr "表示が縦に長くなる場合はページャーを使います。\n" -#: command.c:4327 +#: command.c:4649 #, c-format msgid "Pager is always used.\n" msgstr "常にページャーを使います。\n" -#: command.c:4329 +#: command.c:4651 #, c-format msgid "Pager usage is off.\n" msgstr "「ページャーを使う」は off です。\n" -#: command.c:4335 +#: command.c:4657 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" msgstr[0] "%d 行未満の場合、ページャーは使われません。\n" -#: command.c:4345 command.c:4355 +#: command.c:4667 command.c:4677 #, c-format msgid "Record separator is zero byte.\n" msgstr "レコードの区切り文字はゼロバイトです\n" -#: command.c:4347 +#: command.c:4669 #, c-format msgid "Record separator is .\n" msgstr "レコード区切り文字はです。\n" -#: command.c:4349 +#: command.c:4671 #, c-format msgid "Record separator is \"%s\".\n" msgstr "レコード区切り記号は\"%s\"です。\n" -#: command.c:4362 +#: command.c:4684 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "テーブル属性は\"%s\"です。\n" -#: command.c:4365 +#: command.c:4687 #, c-format msgid "Table attributes unset.\n" msgstr "テーブル属性は設定されていません。\n" -#: command.c:4372 +#: command.c:4694 #, c-format msgid "Title is \"%s\".\n" msgstr "タイトルは\"%s\"です。\n" -#: command.c:4374 +#: command.c:4696 #, c-format msgid "Title is unset.\n" msgstr "タイトルは設定されていません。\n" -#: command.c:4381 +#: command.c:4703 #, c-format msgid "Tuples only is on.\n" msgstr "「タプルのみ表示」は on です。\n" -#: command.c:4383 +#: command.c:4705 #, c-format msgid "Tuples only is off.\n" msgstr "「タプルのみ表示」は off です。\n" -#: command.c:4389 +#: command.c:4711 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Unicode の罫線スタイルは\"%s\"です。\n" -#: command.c:4395 +#: command.c:4717 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Unicode 行罫線のスタイルは\"%s\"です。\n" -#: command.c:4401 +#: command.c:4723 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Unicodeヘッダー行のスタイルは\"%s\"です。\n" -#: command.c:4634 +#: command.c:4956 #, c-format msgid "\\!: failed" msgstr "\\!: 失敗" -#: command.c:4659 common.c:648 +#: command.c:4990 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watchは空の問い合わせでは使えません" -#: command.c:4700 +#: command.c:5022 +#, c-format +msgid "could not set timer: %m" +msgstr "タイマーを設定できません: %m" + +#: command.c:5084 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (%g 秒毎)\n" -#: command.c:4703 +#: command.c:5087 #, c-format msgid "%s (every %gs)\n" msgstr "%s (%g 秒毎)\n" -#: command.c:4757 command.c:4764 common.c:548 common.c:555 common.c:1220 +#: command.c:5148 +#, c-format +msgid "could not wait for signals: %m" +msgstr "シグナルを待機できませんでした: %m" + +#: command.c:5194 command.c:5201 common.c:568 common.c:575 common.c:1153 #, c-format msgid "" "********* QUERY **********\n" @@ -732,112 +749,107 @@ msgstr "" "**************************\n" "\n" -#: command.c:4956 +#: command.c:5380 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\"はビューではありません" -#: command.c:4972 +#: command.c:5396 #, c-format msgid "could not parse reloptions array" msgstr "reloptions配列をパースできませんでした" -#: common.c:159 +#: common.c:162 #, c-format msgid "cannot escape without active connection" msgstr "有効な接続がないのでエスケープできません" -#: common.c:200 +#: common.c:203 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "シェルコマンドの引数に改行(LF)または復帰(CR)が含まれています: \"%s\"" -#: common.c:304 +#: common.c:307 #, c-format msgid "connection to server was lost" msgstr "サーバへの接続が失われました" -#: common.c:308 +#: common.c:311 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "サーバへの接続が失われました。リセットしています: " -#: common.c:313 +#: common.c:316 #, c-format msgid "Failed.\n" msgstr "失敗。\n" -#: common.c:326 +#: common.c:333 #, c-format msgid "Succeeded.\n" msgstr "成功。\n" -#: common.c:378 common.c:938 common.c:1155 +#: common.c:385 common.c:1053 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "想定外のPQresultStatus: %d" -#: common.c:487 +#: common.c:507 #, c-format msgid "Time: %.3f ms\n" msgstr "時間: %.3f ミリ秒\n" -#: common.c:502 +#: common.c:522 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "時間: %.3f ミリ秒(%02d:%06.3f)\n" -#: common.c:511 +#: common.c:531 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "時間: %.3f ミリ秒 (%02d:%02d:%06.3f)\n" -#: common.c:518 +#: common.c:538 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "時間: %.3f ミリ秒 (%.0f 日 %02d:%02d:%06.3f)\n" -#: common.c:542 common.c:600 common.c:1191 +#: common.c:562 common.c:619 common.c:1124 describe.c:6028 #, c-format msgid "You are currently not connected to a database." msgstr "現在データベースに接続していません。" -#: common.c:655 -#, c-format -msgid "\\watch cannot be used with COPY" -msgstr "\\watchはCOPYと一緒には使えません" - -#: common.c:660 -#, c-format -msgid "unexpected result status for \\watch" -msgstr "\\watchで想定外の結果ステータス" - -#: common.c:690 +#: common.c:650 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "PID %3$dのサーバプロセスから、ペイロード\"%2$s\"を持つ非同期通知\"%1$s\"を受信しました。\n" -#: common.c:693 +#: common.c:653 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "PID %2$dのサーバプロセスから非同期通知\"%1$s\"を受信しました。\n" -#: common.c:726 common.c:743 +#: common.c:686 common.c:704 #, c-format msgid "could not print result table: %m" msgstr "結果テーブルを表示できませんでした: %m" -#: common.c:764 +#: common.c:725 #, c-format msgid "no rows returned for \\gset" msgstr "\\gset に対して返すべき行がありません" -#: common.c:769 +#: common.c:730 #, c-format msgid "more than one row returned for \\gset" msgstr "\\gset に対して複数の行が返されました" -#: common.c:1200 +#: common.c:748 +#, c-format +msgid "attempt to \\gset into specially treated variable \"%s\" ignored" +msgstr "特殊変数\"%s\"への\\gsetは無視されました" + +#: common.c:1133 #, c-format msgid "" "***(Single step mode: verify command)*******************************************\n" @@ -848,37 +860,37 @@ msgstr "" "%s\n" "***([Enter] を押して進むか、x [Enter] でキャンセル)**************\n" -#: common.c:1255 -#, c-format -msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." -msgstr "このサーバ(バージョン%s)はON_ERROR_ROLLBACKのためのセーブポイントをサポートしていません。" - -#: common.c:1318 +#: common.c:1216 #, c-format msgid "STATEMENT: %s" -msgstr "ステートメント: %s" +msgstr "文: %s" -#: common.c:1361 +#: common.c:1251 #, c-format msgid "unexpected transaction status (%d)" msgstr "想定外のトランザクション状態(%d)" -#: common.c:1502 describe.c:2001 +#: common.c:1392 describe.c:1986 msgid "Column" msgstr "列" -#: common.c:1503 describe.c:177 describe.c:393 describe.c:411 describe.c:456 -#: describe.c:473 describe.c:962 describe.c:1126 describe.c:1711 -#: describe.c:1735 describe.c:2002 describe.c:3719 describe.c:3929 -#: describe.c:4162 describe.c:5368 +#: common.c:1393 describe.c:167 describe.c:349 describe.c:367 describe.c:1012 +#: describe.c:1167 describe.c:1691 describe.c:1715 describe.c:1987 +#: describe.c:3850 describe.c:4059 describe.c:4290 describe.c:4446 +#: describe.c:5674 msgid "Type" msgstr "タイプ" -#: common.c:1552 +#: common.c:1442 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "このコマンドは結果を返却しないか、結果にカラムが含まれません。\n" +#: common.c:1592 +#, c-format +msgid "\\watch cannot be used with COPY" +msgstr "\\watchはCOPYと一緒には使えません" + #: copy.c:98 #, c-format msgid "\\copy: arguments required" @@ -941,18 +953,18 @@ msgstr "" "コピーするデータに続いて改行を入力してください。\n" "バックスラッシュとピリオドだけの行、もしくは EOF シグナルで終了します。" -#: copy.c:669 +#: copy.c:684 msgid "aborted because of read failure" msgstr "読み取りエラーのため中止" -#: copy.c:703 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "コピーモードを終了しようとしています。" #: crosstabview.c:123 #, c-format msgid "\\crosstabview: statement did not return a result set" -msgstr "\\crosstabview: ステートメントは結果セットを返しませんでした" +msgstr "\\crosstabview: 文は結果セットを返しませんでした" #: crosstabview.c:129 #, c-format @@ -994,558 +1006,567 @@ msgstr "\\crosstabview: 列名があいまいです: \"%s\"" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: 列名が見つかりませんでした: \"%s\"" -#: describe.c:75 describe.c:373 describe.c:678 describe.c:810 describe.c:954 -#: describe.c:1115 describe.c:1187 describe.c:3708 describe.c:3916 -#: describe.c:4160 describe.c:4251 describe.c:4518 describe.c:4678 -#: describe.c:4919 describe.c:4994 describe.c:5005 describe.c:5067 -#: describe.c:5492 describe.c:5575 +#: describe.c:87 describe.c:329 describe.c:622 describe.c:796 describe.c:1004 +#: describe.c:1156 describe.c:1230 describe.c:3839 describe.c:4046 +#: describe.c:4288 describe.c:4367 describe.c:4596 describe.c:4798 +#: describe.c:5026 describe.c:5261 describe.c:5328 describe.c:5339 +#: describe.c:5393 describe.c:5782 describe.c:5857 msgid "Schema" msgstr "スキーマ" -#: describe.c:76 describe.c:174 describe.c:242 describe.c:250 describe.c:374 -#: describe.c:679 describe.c:811 describe.c:872 describe.c:955 describe.c:1188 -#: describe.c:3709 describe.c:3917 describe.c:4083 describe.c:4161 -#: describe.c:4252 describe.c:4331 describe.c:4519 describe.c:4603 -#: describe.c:4679 describe.c:4920 describe.c:4995 describe.c:5006 -#: describe.c:5068 describe.c:5265 describe.c:5349 describe.c:5573 -#: describe.c:5745 describe.c:5985 +#: describe.c:88 describe.c:164 describe.c:223 describe.c:330 describe.c:623 +#: describe.c:797 describe.c:916 describe.c:1005 describe.c:1231 +#: describe.c:3840 describe.c:4047 describe.c:4209 describe.c:4289 +#: describe.c:4368 describe.c:4528 describe.c:4597 describe.c:4799 +#: describe.c:4896 describe.c:5027 describe.c:5262 describe.c:5329 +#: describe.c:5340 describe.c:5394 describe.c:5587 describe.c:5655 +#: describe.c:5855 describe.c:6074 describe.c:6376 msgid "Name" msgstr "名前" -#: describe.c:77 describe.c:386 describe.c:404 describe.c:450 describe.c:467 +#: describe.c:89 describe.c:342 describe.c:360 msgid "Result data type" msgstr "結果のデータ型" -#: describe.c:85 describe.c:98 describe.c:102 describe.c:387 describe.c:405 -#: describe.c:451 describe.c:468 +#: describe.c:90 describe.c:343 describe.c:361 msgid "Argument data types" msgstr "引数のデータ型" -#: describe.c:110 describe.c:117 describe.c:185 describe.c:273 describe.c:513 -#: describe.c:727 describe.c:826 describe.c:897 describe.c:1190 describe.c:2020 -#: describe.c:3496 describe.c:3769 describe.c:3963 describe.c:4114 -#: describe.c:4188 describe.c:4261 describe.c:4344 describe.c:4427 -#: describe.c:4546 describe.c:4612 describe.c:4680 describe.c:4821 -#: describe.c:4863 describe.c:4936 describe.c:4998 describe.c:5007 -#: describe.c:5069 describe.c:5291 describe.c:5371 describe.c:5506 -#: describe.c:5576 large_obj.c:290 large_obj.c:300 +#: describe.c:98 describe.c:105 describe.c:175 describe.c:237 describe.c:414 +#: describe.c:654 describe.c:812 describe.c:945 describe.c:1233 describe.c:2007 +#: describe.c:3639 describe.c:3894 describe.c:4093 describe.c:4233 +#: describe.c:4302 describe.c:4377 describe.c:4541 describe.c:4713 +#: describe.c:4835 describe.c:4905 describe.c:5028 describe.c:5173 +#: describe.c:5215 describe.c:5278 describe.c:5332 describe.c:5341 +#: describe.c:5395 describe.c:5605 describe.c:5677 describe.c:5796 +#: describe.c:5858 describe.c:6847 msgid "Description" msgstr "説明" -#: describe.c:135 +#: describe.c:125 msgid "List of aggregate functions" msgstr "集約関数一覧" -#: describe.c:160 +#: describe.c:150 #, c-format msgid "The server (version %s) does not support access methods." msgstr "このサーバ(バージョン%s)はアクセスメソッドをサポートしていません。" -#: describe.c:175 +#: describe.c:165 msgid "Index" msgstr "インデックス" -#: describe.c:176 describe.c:3727 describe.c:3942 describe.c:5493 +#: describe.c:166 describe.c:3858 describe.c:4072 describe.c:5783 msgid "Table" msgstr "テーブル" -#: describe.c:184 describe.c:5270 +#: describe.c:174 describe.c:5589 msgid "Handler" msgstr "ハンドラ" -#: describe.c:203 +#: describe.c:195 msgid "List of access methods" msgstr "アクセスメソッド一覧" -#: describe.c:229 -#, c-format -msgid "The server (version %s) does not support tablespaces." -msgstr "このサーバ(バージョン%s) はテーブル空間をサポートしていません。" - -#: describe.c:243 describe.c:251 describe.c:501 describe.c:717 describe.c:873 -#: describe.c:1114 describe.c:3720 describe.c:3918 describe.c:4087 -#: describe.c:4333 describe.c:4604 describe.c:5266 describe.c:5350 -#: describe.c:5746 describe.c:5883 describe.c:5986 describe.c:6107 -#: describe.c:6186 large_obj.c:289 +#: describe.c:224 describe.c:395 describe.c:647 describe.c:917 describe.c:1155 +#: describe.c:3851 describe.c:4048 describe.c:4210 describe.c:4530 +#: describe.c:4897 describe.c:5588 describe.c:5656 describe.c:6075 +#: describe.c:6257 describe.c:6377 describe.c:6511 describe.c:6593 +#: describe.c:6835 msgid "Owner" msgstr "所有者" -#: describe.c:244 describe.c:252 +#: describe.c:225 msgid "Location" msgstr "場所" -#: describe.c:263 describe.c:3313 +#: describe.c:235 describe.c:3475 msgid "Options" msgstr "オプション" -#: describe.c:268 describe.c:690 describe.c:889 describe.c:3761 describe.c:3765 +#: describe.c:236 describe.c:645 describe.c:943 describe.c:3893 msgid "Size" msgstr "サイズ" -#: describe.c:290 +#: describe.c:257 msgid "List of tablespaces" msgstr "テーブル空間一覧" -#: describe.c:333 +#: describe.c:302 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\dfで指定できるオプションは [anptwS+] のみです" -#: describe.c:341 describe.c:352 +#: describe.c:310 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\dfはこのサーババージョン%2$sでは\"%1$c\"オプションは指定できません" #. translator: "agg" is short for "aggregate" -#: describe.c:389 describe.c:407 describe.c:453 describe.c:470 +#: describe.c:345 describe.c:363 msgid "agg" msgstr "集約" -#: describe.c:390 describe.c:408 +#: describe.c:346 describe.c:364 msgid "window" msgstr "ウィンドウ" -#: describe.c:391 +#: describe.c:347 msgid "proc" msgstr "プロシージャ" -#: describe.c:392 describe.c:410 describe.c:455 describe.c:472 +#: describe.c:348 describe.c:366 msgid "func" msgstr "関数" -#: describe.c:409 describe.c:454 describe.c:471 describe.c:1324 +#: describe.c:365 describe.c:1363 msgid "trigger" msgstr "トリガー" -#: describe.c:483 +#: describe.c:377 msgid "immutable" msgstr "IMMUTABLE" -#: describe.c:484 +#: describe.c:378 msgid "stable" msgstr "STABLE" -#: describe.c:485 +#: describe.c:379 msgid "volatile" msgstr "VOLATILE" -#: describe.c:486 +#: describe.c:380 msgid "Volatility" msgstr "関数の変動性分類" -#: describe.c:494 +#: describe.c:388 msgid "restricted" msgstr "制限付き" -#: describe.c:495 +#: describe.c:389 msgid "safe" msgstr "安全" -#: describe.c:496 +#: describe.c:390 msgid "unsafe" msgstr "危険" -#: describe.c:497 +#: describe.c:391 msgid "Parallel" msgstr "並列実行" -#: describe.c:502 +#: describe.c:396 msgid "definer" msgstr "定義ロール" -#: describe.c:503 +#: describe.c:397 msgid "invoker" msgstr "起動ロール" -#: describe.c:504 +#: describe.c:398 msgid "Security" msgstr "セキュリティ" -#: describe.c:511 +#: describe.c:403 msgid "Language" msgstr "手続き言語" -#: describe.c:512 +#: describe.c:407 describe.c:411 msgid "Source code" msgstr "ソースコード" -#: describe.c:641 +#: describe.c:585 msgid "List of functions" msgstr "関数一覧" -#: describe.c:689 +#: describe.c:644 msgid "Internal name" msgstr "内部名" -#: describe.c:711 +#: describe.c:646 msgid "Elements" msgstr "構成要素" -#: describe.c:768 +#: describe.c:695 msgid "List of data types" msgstr "データ型一覧" -#: describe.c:812 +#: describe.c:798 msgid "Left arg type" msgstr "左辺の型" -#: describe.c:813 +#: describe.c:799 msgid "Right arg type" msgstr "右辺の型" -#: describe.c:814 +#: describe.c:800 msgid "Result type" msgstr "結果の型" -#: describe.c:819 describe.c:4339 describe.c:4404 describe.c:4410 -#: describe.c:4820 describe.c:6358 describe.c:6362 +#: describe.c:805 describe.c:4536 describe.c:4696 describe.c:5172 +#: describe.c:6772 describe.c:6776 msgid "Function" msgstr "関数" -#: describe.c:844 +#: describe.c:886 msgid "List of operators" msgstr "演算子一覧" -#: describe.c:874 +#: describe.c:918 msgid "Encoding" msgstr "エンコーディング" -#: describe.c:879 describe.c:4520 +#: describe.c:919 describe.c:4800 msgid "Collate" msgstr "照合順序" -#: describe.c:880 describe.c:4521 +#: describe.c:920 describe.c:4801 msgid "Ctype" msgstr "Ctype(変換演算子)" -#: describe.c:893 +#: describe.c:925 describe.c:931 describe.c:4806 describe.c:4810 +msgid "ICU Locale" +msgstr "ICUロケール" + +#: describe.c:926 describe.c:932 +msgid "Locale Provider" +msgstr "ロケールプロバイダー" + +#: describe.c:944 msgid "Tablespace" msgstr "テーブル空間" -#: describe.c:915 +#: describe.c:965 msgid "List of databases" msgstr "データベース一覧" -#: describe.c:956 describe.c:1117 describe.c:3710 +#: describe.c:1006 describe.c:1158 describe.c:3841 msgid "table" msgstr "テーブル" -#: describe.c:957 describe.c:3711 +#: describe.c:1007 describe.c:3842 msgid "view" msgstr "ビュー" -#: describe.c:958 describe.c:3712 +#: describe.c:1008 describe.c:3843 msgid "materialized view" -msgstr "マテリアライズドビュー" +msgstr "実体化ビュー" -#: describe.c:959 describe.c:1119 describe.c:3714 +#: describe.c:1009 describe.c:1160 describe.c:3845 msgid "sequence" msgstr "シーケンス" -#: describe.c:960 describe.c:3716 +#: describe.c:1010 describe.c:3847 msgid "foreign table" msgstr "外部テーブル" -#: describe.c:961 describe.c:3717 describe.c:3927 +#: describe.c:1011 describe.c:3848 describe.c:4057 msgid "partitioned table" msgstr "パーティションテーブル" -#: describe.c:973 +#: describe.c:1022 msgid "Column privileges" msgstr "列の権限" -#: describe.c:1004 describe.c:1038 +#: describe.c:1053 describe.c:1087 msgid "Policies" msgstr "ポリシー" -#: describe.c:1070 describe.c:6048 describe.c:6052 +#: describe.c:1121 describe.c:4452 describe.c:6456 msgid "Access privileges" msgstr "アクセス権限" -#: describe.c:1101 -#, c-format -msgid "The server (version %s) does not support altering default privileges." -msgstr "このサーバ(バージョン%s)はデフォルト権限の変更をサポートしていません。" - -#: describe.c:1121 +#: describe.c:1162 msgid "function" msgstr "関数" -#: describe.c:1123 +#: describe.c:1164 msgid "type" msgstr "型" -#: describe.c:1125 +#: describe.c:1166 msgid "schema" msgstr "スキーマ" -#: describe.c:1149 +#: describe.c:1192 msgid "Default access privileges" msgstr "デフォルトのアクセス権限" -#: describe.c:1189 +#: describe.c:1232 msgid "Object" msgstr "オブジェクト" -#: describe.c:1203 +#: describe.c:1246 msgid "table constraint" msgstr "テーブル制約" -#: describe.c:1225 +#: describe.c:1270 msgid "domain constraint" msgstr "ドメイン制約" -#: describe.c:1253 +#: describe.c:1294 msgid "operator class" msgstr "演算子クラス" -#: describe.c:1282 +#: describe.c:1318 msgid "operator family" msgstr "演算子族" -#: describe.c:1304 +#: describe.c:1341 msgid "rule" msgstr "ルール" -#: describe.c:1346 +#: describe.c:1387 msgid "Object descriptions" msgstr "オブジェクトの説明" -#: describe.c:1402 describe.c:3833 +#: describe.c:1445 describe.c:3963 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "\"%s\"という名前のリレーションは見つかりませんでした。" -#: describe.c:1405 describe.c:3836 +#: describe.c:1448 describe.c:3966 #, c-format msgid "Did not find any relations." msgstr "リレーションが見つかりませんでした。" -#: describe.c:1660 +#: describe.c:1644 #, c-format msgid "Did not find any relation with OID %s." msgstr "OID %sを持つリレーションが見つかりませんでした。" -#: describe.c:1712 describe.c:1736 +#: describe.c:1692 describe.c:1716 msgid "Start" msgstr "開始" -#: describe.c:1713 describe.c:1737 +#: describe.c:1693 describe.c:1717 msgid "Minimum" msgstr "最小" -#: describe.c:1714 describe.c:1738 +#: describe.c:1694 describe.c:1718 msgid "Maximum" msgstr "最大" -#: describe.c:1715 describe.c:1739 +#: describe.c:1695 describe.c:1719 msgid "Increment" msgstr "増分" -#: describe.c:1716 describe.c:1740 describe.c:1871 describe.c:4255 -#: describe.c:4421 describe.c:4535 describe.c:4540 describe.c:6095 +#: describe.c:1696 describe.c:1720 describe.c:1850 describe.c:4371 +#: describe.c:4707 describe.c:4824 describe.c:4829 describe.c:6499 msgid "yes" msgstr "はい" -#: describe.c:1717 describe.c:1741 describe.c:1872 describe.c:4255 -#: describe.c:4418 describe.c:4535 describe.c:6096 +#: describe.c:1697 describe.c:1721 describe.c:1851 describe.c:4371 +#: describe.c:4704 describe.c:4824 describe.c:6500 msgid "no" msgstr "いいえ" -#: describe.c:1718 describe.c:1742 +#: describe.c:1698 describe.c:1722 msgid "Cycles?" msgstr "循環?" -#: describe.c:1719 describe.c:1743 +#: describe.c:1699 describe.c:1723 msgid "Cache" msgstr "キャッシュ" -#: describe.c:1786 +#: describe.c:1764 #, c-format msgid "Owned by: %s" msgstr "所有者: %s" -#: describe.c:1790 +#: describe.c:1768 #, c-format msgid "Sequence for identity column: %s" msgstr "識別列のシーケンス: %s" -#: describe.c:1797 +#: describe.c:1776 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "ログ出力なしのシーケンス\"%s.%s\"" + +#: describe.c:1779 #, c-format msgid "Sequence \"%s.%s\"" msgstr "シーケンス \"%s.%s\"" -#: describe.c:1933 +#: describe.c:1923 #, c-format msgid "Unlogged table \"%s.%s\"" -msgstr "ログを取らないテーブル\"%s.%s\"" +msgstr "ログ出力なしのテーブル\"%s.%s\"" -#: describe.c:1936 +#: describe.c:1926 #, c-format msgid "Table \"%s.%s\"" msgstr "テーブル\"%s.%s\"" -#: describe.c:1940 +#: describe.c:1930 #, c-format msgid "View \"%s.%s\"" msgstr "ビュー\"%s.%s\"" -#: describe.c:1945 +#: describe.c:1935 #, c-format msgid "Unlogged materialized view \"%s.%s\"" -msgstr "ログを取らないマテリアライズドビュー\"%s.%s\"" +msgstr "ログ出力なしの実体化ビュー\"%s.%s\"" -#: describe.c:1948 +#: describe.c:1938 #, c-format msgid "Materialized view \"%s.%s\"" -msgstr "マテリアライズドビュー\"%s.%s\"" +msgstr "実体化ビュー\"%s.%s\"" -#: describe.c:1953 +#: describe.c:1943 #, c-format msgid "Unlogged index \"%s.%s\"" -msgstr "ログを取らないインデックス\"%s.%s\"" +msgstr "ログ出力なしのインデックス\"%s.%s\"" -#: describe.c:1956 +#: describe.c:1946 #, c-format msgid "Index \"%s.%s\"" msgstr "インデックス\"%s.%s\"" -#: describe.c:1961 +#: describe.c:1951 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" -msgstr "ログを取らないパーティションインデックス\"%s.%s\"" +msgstr "ログ出力なしのパーティション親インデックス\"%s.%s\"" -#: describe.c:1964 +#: describe.c:1954 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "パーティションインデックス\"%s.%s\"" -#: describe.c:1969 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "特殊なリレーション\"%s.%s\"" - -#: describe.c:1973 +#: describe.c:1958 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST テーブル\"%s.%s\"" -#: describe.c:1977 +#: describe.c:1962 #, c-format msgid "Composite type \"%s.%s\"" msgstr "複合型\"%s.%s\"" -#: describe.c:1981 +#: describe.c:1966 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "外部テーブル\"%s.%s\"" -#: describe.c:1986 +#: describe.c:1971 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" -msgstr "ログを取らないパーティションテーブル\"%s.%s\"" +msgstr "ログ出力なしのパーティション親テーブル\"%s.%s\"" -#: describe.c:1989 +#: describe.c:1974 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "パーティションテーブル\"%s.%s\"" -#: describe.c:2005 describe.c:4168 +#: describe.c:1990 describe.c:4291 msgid "Collation" msgstr "照合順序" -#: describe.c:2006 describe.c:4175 +#: describe.c:1991 describe.c:4292 msgid "Nullable" msgstr "Null 値を許容" -#: describe.c:2007 describe.c:4176 +#: describe.c:1992 describe.c:4293 msgid "Default" msgstr "デフォルト" -#: describe.c:2010 +#: describe.c:1995 msgid "Key?" msgstr "キー?" -#: describe.c:2012 +#: describe.c:1997 describe.c:4604 describe.c:4615 msgid "Definition" msgstr "定義" -#: describe.c:2014 describe.c:5286 describe.c:5370 describe.c:5441 -#: describe.c:5505 +#: describe.c:1999 describe.c:5604 describe.c:5676 describe.c:5739 +#: describe.c:5795 msgid "FDW options" msgstr "FDW オプション" -#: describe.c:2016 +#: describe.c:2001 msgid "Storage" msgstr "ストレージ" -#: describe.c:2018 +#: describe.c:2003 +msgid "Compression" +msgstr "圧縮" + +#: describe.c:2005 msgid "Stats target" msgstr "統計目標" -#: describe.c:2131 +#: describe.c:2141 #, c-format -msgid "Partition of: %s %s" -msgstr "パーティション: %s %s" +msgid "Partition of: %s %s%s" +msgstr "親パーティション: %s %s%s" -#: describe.c:2143 +#: describe.c:2154 msgid "No partition constraint" msgstr "パーティション制約なし" -#: describe.c:2145 +#: describe.c:2156 #, c-format msgid "Partition constraint: %s" msgstr "パーティションの制約: %s" -#: describe.c:2169 +#: describe.c:2180 #, c-format msgid "Partition key: %s" msgstr "パーティションキー: %s" -#: describe.c:2195 +#: describe.c:2206 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "所属先テーブル\"%s.%s\"" -#: describe.c:2266 +#: describe.c:2275 msgid "primary key, " msgstr "プライマリキー, " -#: describe.c:2268 -msgid "unique, " -msgstr "ユニーク," +#: describe.c:2278 +msgid "unique" +msgstr "ユニーク" + +#: describe.c:2280 +msgid " nulls not distinct" +msgstr " nulls not distinct" -#: describe.c:2274 +#: describe.c:2281 +msgid ", " +msgstr ", " + +#: describe.c:2288 #, c-format msgid "for table \"%s.%s\"" msgstr "テーブル\"%s.%s\"用" -#: describe.c:2278 +#: describe.c:2292 #, c-format msgid ", predicate (%s)" msgstr "、述語 (%s)" -#: describe.c:2281 +#: describe.c:2295 msgid ", clustered" msgstr "、クラスター化" -#: describe.c:2284 +#: describe.c:2298 msgid ", invalid" msgstr "無効" -#: describe.c:2287 +#: describe.c:2301 msgid ", deferrable" msgstr "、遅延可能" -#: describe.c:2290 +#: describe.c:2304 msgid ", initially deferred" msgstr "、最初から遅延中" -#: describe.c:2293 +#: describe.c:2307 msgid ", replica identity" msgstr "、レプリカの id" -#: describe.c:2360 +#: describe.c:2361 msgid "Indexes:" msgstr "インデックス:" @@ -1581,525 +1602,556 @@ msgstr "ポリシー(行セキュリティを強制的に有効化): (なし)" msgid "Policies (row security disabled):" msgstr "ポリシー(行セキュリティを無効化):" -#: describe.c:2700 +#: describe.c:2697 describe.c:2801 msgid "Statistics objects:" msgstr "統計オブジェクト:" -#: describe.c:2809 describe.c:2913 +#: describe.c:2903 describe.c:3056 msgid "Rules:" msgstr "ルール:" -#: describe.c:2812 +#: describe.c:2906 msgid "Disabled rules:" msgstr "無効化されたルール:" -#: describe.c:2815 +#: describe.c:2909 msgid "Rules firing always:" msgstr "常に適用するルール:" -#: describe.c:2818 +#: describe.c:2912 msgid "Rules firing on replica only:" msgstr "レプリカ上でのみ適用するルール:" -#: describe.c:2858 +#: describe.c:2991 describe.c:4965 msgid "Publications:" msgstr "パブリケーション:" -#: describe.c:2896 +#: describe.c:3039 msgid "View definition:" msgstr "ビューの定義:" -#: describe.c:3043 +#: describe.c:3202 msgid "Triggers:" msgstr "トリガー:" -#: describe.c:3047 +#: describe.c:3205 msgid "Disabled user triggers:" msgstr "無効化されたユーザトリガ:" -#: describe.c:3049 -msgid "Disabled triggers:" -msgstr "無効化されたトリガー:" - -#: describe.c:3052 +#: describe.c:3208 msgid "Disabled internal triggers:" msgstr "無効化された内部トリガー:" -#: describe.c:3055 +#: describe.c:3211 msgid "Triggers firing always:" msgstr "常に適用するするトリガー:" -#: describe.c:3058 +#: describe.c:3214 msgid "Triggers firing on replica only:" msgstr "レプリカ上でのみ適用するトリガー:" -#: describe.c:3130 +#: describe.c:3285 #, c-format msgid "Server: %s" msgstr "サーバ: %s" -#: describe.c:3138 +#: describe.c:3293 #, c-format msgid "FDW options: (%s)" msgstr "FDW オプション: (%s)" -#: describe.c:3159 +#: describe.c:3314 msgid "Inherits" msgstr "継承元" -#: describe.c:3219 +#: describe.c:3379 #, c-format msgid "Number of partitions: %d" msgstr "パーティション数: %d" -#: describe.c:3228 +#: describe.c:3388 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "パーティション数: %d (\\d+ で一覧を表示)。" -#: describe.c:3230 +#: describe.c:3390 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "子テーブル数: %d (\\d+ で一覧を表示)" -#: describe.c:3237 +#: describe.c:3397 msgid "Child tables" msgstr "子テーブル" -#: describe.c:3237 +#: describe.c:3397 msgid "Partitions" msgstr "パーティション" -#: describe.c:3266 +#: describe.c:3428 #, c-format msgid "Typed table of type: %s" msgstr "%s 型の型付きテーブル" -#: describe.c:3282 +#: describe.c:3444 msgid "Replica Identity" msgstr "レプリカ識別" -#: describe.c:3295 +#: describe.c:3457 msgid "Has OIDs: yes" msgstr "OID あり: はい" -#: describe.c:3304 +#: describe.c:3466 #, c-format msgid "Access method: %s" msgstr "アクセスメソッド: %s" -#: describe.c:3384 +#: describe.c:3545 #, c-format msgid "Tablespace: \"%s\"" msgstr "テーブル空間: \"%s\"" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3396 +#: describe.c:3557 #, c-format msgid ", tablespace \"%s\"" msgstr "、テーブル空間\"%s\"" -#: describe.c:3489 +#: describe.c:3631 msgid "List of roles" msgstr "ロール一覧" -#: describe.c:3491 +#: describe.c:3633 msgid "Role name" msgstr "ロール名" -#: describe.c:3492 +#: describe.c:3634 msgid "Attributes" msgstr "属性" -#: describe.c:3493 +#: describe.c:3636 msgid "Member of" msgstr "所属グループ" -#: describe.c:3504 +#: describe.c:3647 msgid "Superuser" msgstr "スーパユーザ" -#: describe.c:3507 +#: describe.c:3650 msgid "No inheritance" msgstr "継承なし" -#: describe.c:3510 +#: describe.c:3653 msgid "Create role" msgstr "ロール作成可" -#: describe.c:3513 +#: describe.c:3656 msgid "Create DB" msgstr "DB作成可" -#: describe.c:3516 +#: describe.c:3659 msgid "Cannot login" msgstr "ログインできません" -#: describe.c:3520 +#: describe.c:3662 msgid "Replication" msgstr "レプリケーション可" -#: describe.c:3524 +#: describe.c:3666 msgid "Bypass RLS" msgstr "RLS のバイパス" -#: describe.c:3533 +#: describe.c:3675 msgid "No connections" msgstr "接続なし" -#: describe.c:3535 +#: describe.c:3677 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d 個の接続" -#: describe.c:3545 +#: describe.c:3687 msgid "Password valid until " msgstr "パスワードの有効期限 " -#: describe.c:3595 -#, c-format -msgid "The server (version %s) does not support per-database role settings." -msgstr "このサーバ(バージョン%s)はデータベースごとのロール設定をサポートしていません。" - -#: describe.c:3608 +#: describe.c:3740 msgid "Role" msgstr "ロール" -#: describe.c:3609 +#: describe.c:3741 msgid "Database" msgstr "データベース" -#: describe.c:3610 +#: describe.c:3742 msgid "Settings" msgstr "設定" -#: describe.c:3631 +#: describe.c:3766 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "ロール\"%s\"とデータベース\"%s\"の設定が見つかりませんでした。" -#: describe.c:3634 +#: describe.c:3769 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "ロール\"%s\"の設定が見つかりませんでした。" -#: describe.c:3637 +#: describe.c:3772 #, c-format msgid "Did not find any settings." msgstr "設定が見つかりませんでした。" -#: describe.c:3642 +#: describe.c:3777 msgid "List of settings" msgstr "設定一覧" -#: describe.c:3713 +#: describe.c:3844 msgid "index" msgstr "インデックス" -#: describe.c:3715 -msgid "special" -msgstr "特殊" +#: describe.c:3846 +msgid "TOAST table" +msgstr "TOAST テーブル" -#: describe.c:3718 describe.c:3928 +#: describe.c:3849 describe.c:4058 msgid "partitioned index" msgstr "パーティションインデックス" -#: describe.c:3742 +#: describe.c:3869 msgid "permanent" msgstr "永続" -#: describe.c:3743 +#: describe.c:3870 msgid "temporary" msgstr "一時" -#: describe.c:3744 +#: describe.c:3871 msgid "unlogged" msgstr "ログなし" -#: describe.c:3745 +#: describe.c:3872 msgid "Persistence" msgstr "永続性" -#: describe.c:3841 +#: describe.c:3888 +msgid "Access method" +msgstr "アクセスメソッド" + +#: describe.c:3971 msgid "List of relations" msgstr "リレーション一覧" -#: describe.c:3889 +#: describe.c:4019 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "このサーバ(バージョン%s)は宣言的テーブルパーティショニングをサポートしていません。" -#: describe.c:3900 +#: describe.c:4030 msgid "List of partitioned indexes" msgstr "パーティションインデックスの一覧" -#: describe.c:3902 +#: describe.c:4032 msgid "List of partitioned tables" msgstr "パーティションテーブルの一覧" -#: describe.c:3906 +#: describe.c:4036 msgid "List of partitioned relations" msgstr "パーティションリレーションの一覧" -#: describe.c:3937 +#: describe.c:4067 msgid "Parent name" msgstr "親の名前" -#: describe.c:3950 +#: describe.c:4080 msgid "Leaf partition size" msgstr "末端パーティションのサイズ" -#: describe.c:3953 describe.c:3959 +#: describe.c:4083 describe.c:4089 msgid "Total size" msgstr "トータルサイズ" -#: describe.c:4091 +#: describe.c:4211 msgid "Trusted" msgstr "信頼済み" -#: describe.c:4099 +#: describe.c:4220 msgid "Internal language" msgstr "内部言語" -#: describe.c:4100 +#: describe.c:4221 msgid "Call handler" msgstr "呼び出しハンドラー" -#: describe.c:4101 describe.c:5273 +#: describe.c:4222 describe.c:5590 msgid "Validator" msgstr "バリデーター" -#: describe.c:4104 +#: describe.c:4223 msgid "Inline handler" msgstr "インラインハンドラー" -#: describe.c:4132 +#: describe.c:4253 msgid "List of languages" msgstr "手続き言語一覧" -#: describe.c:4177 +#: describe.c:4294 msgid "Check" msgstr "CHECK制約" -#: describe.c:4219 +#: describe.c:4335 msgid "List of domains" msgstr "ドメイン一覧" -#: describe.c:4253 +#: describe.c:4369 msgid "Source" msgstr "変換元" -#: describe.c:4254 +#: describe.c:4370 msgid "Destination" msgstr "変換先" -#: describe.c:4256 describe.c:6097 +#: describe.c:4372 describe.c:6501 msgid "Default?" msgstr "デフォルト?" -#: describe.c:4293 +#: describe.c:4411 msgid "List of conversions" msgstr "符号化方式一覧" -#: describe.c:4332 +#: describe.c:4439 +msgid "Parameter" +msgstr "パラメータ" + +#: describe.c:4440 +msgid "Value" +msgstr "値" + +#: describe.c:4447 +msgid "Context" +msgstr "コンテクスト" + +#: describe.c:4480 +msgid "List of configuration parameters" +msgstr "設定パラメータの一覧" + +#: describe.c:4482 +msgid "List of non-default configuration parameters" +msgstr "非デフォルトの設定パラメータの一覧" + +#: describe.c:4509 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "このサーバ(バージョン%s)はイベントトリガーをサポートしていません。" + +#: describe.c:4529 msgid "Event" msgstr "イベント" -#: describe.c:4334 +#: describe.c:4531 msgid "enabled" msgstr "有効" -#: describe.c:4335 +#: describe.c:4532 msgid "replica" msgstr "レプリカ" -#: describe.c:4336 +#: describe.c:4533 msgid "always" msgstr "常時" -#: describe.c:4337 +#: describe.c:4534 msgid "disabled" msgstr "無効" -#: describe.c:4338 describe.c:5987 +#: describe.c:4535 describe.c:6378 msgid "Enabled" msgstr "有効状態" -#: describe.c:4340 +#: describe.c:4537 msgid "Tags" msgstr "タグ" -#: describe.c:4359 +#: describe.c:4558 msgid "List of event triggers" msgstr "イベントトリガー一覧" -#: describe.c:4388 +#: describe.c:4585 +#, c-format +msgid "The server (version %s) does not support extended statistics." +msgstr "このサーバ(バージョン%s)は拡張統計情報をサポートしていません。" + +#: describe.c:4622 +msgid "Ndistinct" +msgstr "Ndistinct" + +#: describe.c:4623 +msgid "Dependencies" +msgstr "Dependencies" + +#: describe.c:4633 +msgid "MCV" +msgstr "MCV" + +#: describe.c:4654 +msgid "List of extended statistics" +msgstr "拡張統計情報の一覧" + +#: describe.c:4681 msgid "Source type" msgstr "変換元の型" -#: describe.c:4389 +#: describe.c:4682 msgid "Target type" msgstr "変換先の型" -#: describe.c:4420 +#: describe.c:4706 msgid "in assignment" msgstr "代入時のみ" -#: describe.c:4422 +#: describe.c:4708 msgid "Implicit?" msgstr "暗黙的に適用 ?" -#: describe.c:4477 +#: describe.c:4767 msgid "List of casts" msgstr "キャスト一覧" -#: describe.c:4505 -#, c-format -msgid "The server (version %s) does not support collations." -msgstr "このサーバ(バージョン%s)は照合順序をサポートしていません。" - -#: describe.c:4526 describe.c:4530 +#: describe.c:4815 describe.c:4819 msgid "Provider" msgstr "プロバイダー" -#: describe.c:4536 describe.c:4541 +#: describe.c:4825 describe.c:4830 msgid "Deterministic?" msgstr "確定的?" -#: describe.c:4576 +#: describe.c:4867 msgid "List of collations" msgstr "照合順序一覧" -#: describe.c:4635 +#: describe.c:4932 msgid "List of schemas" msgstr "スキーマ一覧" -#: describe.c:4660 describe.c:4907 describe.c:4978 describe.c:5049 -#, c-format -msgid "The server (version %s) does not support full text search." -msgstr "このサーバ(バージョン%s)は全文検索をサポートしていません。" - -#: describe.c:4695 +#: describe.c:5045 msgid "List of text search parsers" msgstr "テキスト検索用パーサ一覧" -#: describe.c:4740 +#: describe.c:5092 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "テキスト検索用パーサ\"%s\"が見つかりませんでした。" -#: describe.c:4743 +#: describe.c:5095 #, c-format msgid "Did not find any text search parsers." msgstr "テキスト検索パーサが見つかりませんでした。" -#: describe.c:4818 +#: describe.c:5170 msgid "Start parse" msgstr "パース開始" -#: describe.c:4819 +#: describe.c:5171 msgid "Method" msgstr "メソッド" -#: describe.c:4823 +#: describe.c:5175 msgid "Get next token" msgstr "次のトークンを取得" -#: describe.c:4825 +#: describe.c:5177 msgid "End parse" msgstr "パース終了" -#: describe.c:4827 +#: describe.c:5179 msgid "Get headline" msgstr "見出しを取得" -#: describe.c:4829 +#: describe.c:5181 msgid "Get token types" msgstr "トークンタイプを取得" -#: describe.c:4840 +#: describe.c:5192 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "テキスト検索パーサ\"%s.%s\"" -#: describe.c:4843 +#: describe.c:5195 #, c-format msgid "Text search parser \"%s\"" msgstr "テキスト検索パーサ\"%s\"" -#: describe.c:4862 +#: describe.c:5214 msgid "Token name" msgstr "トークン名" -#: describe.c:4873 +#: describe.c:5225 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "パーサ\"%s.%s\"のトークンタイプ" -#: describe.c:4876 +#: describe.c:5228 #, c-format msgid "Token types for parser \"%s\"" msgstr "パーサ\"%s\"のトークンタイプ" -#: describe.c:4930 +#: describe.c:5272 msgid "Template" msgstr "テンプレート" -#: describe.c:4931 +#: describe.c:5273 msgid "Init options" msgstr "初期化オプション" -#: describe.c:4953 +#: describe.c:5297 msgid "List of text search dictionaries" msgstr "テキスト検索用辞書一覧" -#: describe.c:4996 +#: describe.c:5330 msgid "Init" msgstr "初期化" -#: describe.c:4997 +#: describe.c:5331 msgid "Lexize" msgstr "Lex 処理" -#: describe.c:5024 +#: describe.c:5360 msgid "List of text search templates" msgstr "テキスト検索テンプレート一覧" -#: describe.c:5084 +#: describe.c:5412 msgid "List of text search configurations" msgstr "テキスト検索設定一覧" -#: describe.c:5130 +#: describe.c:5460 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "テキスト検索用設定\"%s\"が見つかりませんでした。" -#: describe.c:5133 +#: describe.c:5463 #, c-format msgid "Did not find any text search configurations." msgstr "テキスト検索設定が見つかりませんでした。" -#: describe.c:5199 +#: describe.c:5529 msgid "Token" msgstr "トークン" -#: describe.c:5200 +#: describe.c:5530 msgid "Dictionaries" msgstr "辞書" -#: describe.c:5211 +#: describe.c:5541 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "テキスト検索設定\"%s.%s\"" -#: describe.c:5214 +#: describe.c:5544 #, c-format msgid "Text search configuration \"%s\"" msgstr "テキスト検索設定\"%s\"" -#: describe.c:5218 +#: describe.c:5548 #, c-format msgid "" "\n" @@ -2108,7 +2160,7 @@ msgstr "" "\n" "パーサ: \"%s.%s\"" -#: describe.c:5221 +#: describe.c:5551 #, c-format msgid "" "\n" @@ -2117,240 +2169,253 @@ msgstr "" "\n" "パーサ: \"%s\"" -#: describe.c:5255 -#, c-format -msgid "The server (version %s) does not support foreign-data wrappers." -msgstr "このサーバ(バージョン%s)は外部データラッパをサポートしていません。" - -#: describe.c:5313 +#: describe.c:5629 msgid "List of foreign-data wrappers" msgstr "外部データラッパ一覧" -#: describe.c:5338 -#, c-format -msgid "The server (version %s) does not support foreign servers." -msgstr "このサーバ(バージョン%s)は外部サーバをサポートしていません。" - -#: describe.c:5351 +#: describe.c:5657 msgid "Foreign-data wrapper" msgstr "外部データラッパ" -#: describe.c:5369 describe.c:5574 +#: describe.c:5675 describe.c:5856 msgid "Version" msgstr "バージョン" -#: describe.c:5395 +#: describe.c:5703 msgid "List of foreign servers" msgstr "外部サーバ一覧" -#: describe.c:5420 -#, c-format -msgid "The server (version %s) does not support user mappings." -msgstr "このサーバ(バージョン%s)はユーザマッピングをサポートしていません。" - -#: describe.c:5430 describe.c:5494 +#: describe.c:5728 describe.c:5784 msgid "Server" msgstr "サーバ" -#: describe.c:5431 +#: describe.c:5729 msgid "User name" msgstr "ユーザ名" -#: describe.c:5456 +#: describe.c:5756 msgid "List of user mappings" msgstr "ユーザマッピング一覧" -#: describe.c:5481 -#, c-format -msgid "The server (version %s) does not support foreign tables." -msgstr "このサーバ(バージョン%s)は外部テーブルをサポートしていません。" - -#: describe.c:5534 +#: describe.c:5826 msgid "List of foreign tables" msgstr "外部テーブル一覧" -#: describe.c:5559 describe.c:5616 -#, c-format -msgid "The server (version %s) does not support extensions." -msgstr "このサーバ(バージョン%s)は機能拡張をサポートしていません。" - -#: describe.c:5591 +#: describe.c:5875 msgid "List of installed extensions" msgstr "インストール済みの拡張一覧" -#: describe.c:5644 +#: describe.c:5920 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "\"%s\"という名前の機能拡張が見つかりませんでした。" -#: describe.c:5647 +#: describe.c:5923 #, c-format msgid "Did not find any extensions." msgstr "機能拡張が見つかりませんでした。" -#: describe.c:5691 +#: describe.c:5967 msgid "Object description" msgstr "オブジェクトの説明" -#: describe.c:5701 +#: describe.c:5977 #, c-format msgid "Objects in extension \"%s\"" msgstr "機能拡張\"%s\"内のオブジェクト" -#: describe.c:5730 describe.c:5806 +#: describe.c:6018 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "修飾名が不適切です(ドット区切りの名前が多すぎます): %s" + +#: describe.c:6033 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "データベース間の参照は実装されていません: %s" + +#: describe.c:6059 describe.c:6183 #, c-format msgid "The server (version %s) does not support publications." msgstr "このサーバ(バージョン%s)はパブリケーションをサポートしていません。" -#: describe.c:5747 describe.c:5884 +#: describe.c:6076 describe.c:6258 msgid "All tables" msgstr "全テーブル" -#: describe.c:5748 describe.c:5885 +#: describe.c:6077 describe.c:6259 msgid "Inserts" msgstr "Insert文" -#: describe.c:5749 describe.c:5886 +#: describe.c:6078 describe.c:6260 msgid "Updates" msgstr "Update文" -#: describe.c:5750 describe.c:5887 +#: describe.c:6079 describe.c:6261 msgid "Deletes" msgstr "Delete文" -#: describe.c:5754 describe.c:5889 +#: describe.c:6083 describe.c:6263 msgid "Truncates" msgstr "Truncate文" -#: describe.c:5758 describe.c:5891 +#: describe.c:6087 describe.c:6265 msgid "Via root" msgstr "最上位パーティションテーブル経由" -#: describe.c:5775 +#: describe.c:6106 msgid "List of publications" msgstr "パブリケーション一覧" -#: describe.c:5848 +#: describe.c:6227 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "\"%s\"という名前のパブリケーションが見つかりませんでした。" -#: describe.c:5851 +#: describe.c:6230 #, c-format msgid "Did not find any publications." msgstr "パブリケーションが見つかりませんでした。" -#: describe.c:5880 +#: describe.c:6254 #, c-format msgid "Publication %s" msgstr "パブリケーション %s" -#: describe.c:5928 +#: describe.c:6307 msgid "Tables:" msgstr "テーブル:" -#: describe.c:5972 +#: describe.c:6319 +msgid "Tables from schemas:" +msgstr "以下のスキーマ内のテーブル:" + +#: describe.c:6363 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "このサーバ(バージョン%s)はサブスクリプションをサポートしていません。" -#: describe.c:5988 +#: describe.c:6379 msgid "Publication" msgstr "パブリケーション" -#: describe.c:5996 +#: describe.c:6388 msgid "Binary" msgstr "バイナリ" -#: describe.c:6001 +#: describe.c:6389 +msgid "Streaming" +msgstr "ストリーミング" + +#: describe.c:6396 +msgid "Two phase commit" +msgstr "2相コミット" + +#: describe.c:6397 +msgid "Disable on error" +msgstr "エラー時無効化" + +#: describe.c:6402 msgid "Synchronous commit" msgstr "同期コミット" -#: describe.c:6002 +#: describe.c:6403 msgid "Conninfo" msgstr "接続情報" -#: describe.c:6024 +#: describe.c:6409 +msgid "Skip LSN" +msgstr "スキップLSN" + +#: describe.c:6433 msgid "List of subscriptions" msgstr "サブスクリプション一覧" -#: describe.c:6091 describe.c:6180 describe.c:6266 describe.c:6349 +#: describe.c:6495 describe.c:6587 describe.c:6676 describe.c:6763 msgid "AM" msgstr "AM" -#: describe.c:6092 +#: describe.c:6496 msgid "Input type" msgstr "入力の型" -#: describe.c:6093 +#: describe.c:6497 msgid "Storage type" msgstr "ストレージタイプ" -#: describe.c:6094 +#: describe.c:6498 msgid "Operator class" msgstr "演算子クラス" -#: describe.c:6106 describe.c:6181 describe.c:6267 describe.c:6350 +#: describe.c:6510 describe.c:6588 describe.c:6677 describe.c:6764 msgid "Operator family" msgstr "演算子族" -#: describe.c:6139 +#: describe.c:6546 msgid "List of operator classes" msgstr "演算子クラス一覧" -#: describe.c:6182 +#: describe.c:6589 msgid "Applicable types" msgstr "適用可能型" -#: describe.c:6221 +#: describe.c:6631 msgid "List of operator families" msgstr "演算子族一覧" -#: describe.c:6268 +#: describe.c:6678 msgid "Operator" msgstr "演算子" -#: describe.c:6269 +#: describe.c:6679 msgid "Strategy" msgstr "ストラテジ" -#: describe.c:6270 +#: describe.c:6680 msgid "ordering" msgstr "順序付け" -#: describe.c:6271 +#: describe.c:6681 msgid "search" msgstr "検索" -#: describe.c:6272 +#: describe.c:6682 msgid "Purpose" msgstr "目的" -#: describe.c:6277 +#: describe.c:6687 msgid "Sort opfamily" msgstr "ソート演算子族" -#: describe.c:6308 +#: describe.c:6722 msgid "List of operators of operator families" msgstr "演算子族の演算子一覧" -#: describe.c:6351 +#: describe.c:6765 msgid "Registered left type" msgstr "登録左辺型" -#: describe.c:6352 +#: describe.c:6766 msgid "Registered right type" msgstr "登録右辺型" -#: describe.c:6353 +#: describe.c:6767 msgid "Number" msgstr "番号" -#: describe.c:6389 +#: describe.c:6807 msgid "List of support functions of operator families" msgstr "演算子族のサポート関数一覧" -#: help.c:73 +#: describe.c:6834 +msgid "ID" +msgstr "ID" + +#: describe.c:6855 +msgid "Large objects" +msgstr "ラージ オブジェクト" + +#: help.c:70 #, c-format msgid "" "psql is the PostgreSQL interactive terminal.\n" @@ -2359,12 +2424,12 @@ msgstr "" "psql は PostgreSQL の対話型ターミナルです。\n" "\n" -#: help.c:74 help.c:355 help.c:431 help.c:474 +#: help.c:71 help.c:354 help.c:434 help.c:477 #, c-format msgid "Usage:\n" msgstr "使い方:\n" -#: help.c:75 +#: help.c:72 #, c-format msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" @@ -2373,32 +2438,32 @@ msgstr "" " psql [オプション]... [データベース名 [ユーザ名]]\n" "\n" -#: help.c:77 +#: help.c:74 #, c-format msgid "General options:\n" msgstr "一般的なオプション:\n" -#: help.c:82 +#: help.c:79 #, c-format msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=コマンド 単一の(SQLまたは内部)コマンドを一つだけ実行して終了\n" -#: help.c:83 +#: help.c:80 #, c-format msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" msgstr " -d, --dbname=DB名 接続するデータベース名(デフォルト: \"%s\")\n" -#: help.c:84 +#: help.c:81 #, c-format msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=FILENAME ファイルからコマンドを読み込んで実行後、終了\n" -#: help.c:85 +#: help.c:82 #, c-format msgid " -l, --list list available databases, then exit\n" msgstr " -l(エル), --list 使用可能なデータベース一覧を表示して終了\n" -#: help.c:86 +#: help.c:83 #, c-format msgid "" " -v, --set=, --variable=NAME=VALUE\n" @@ -2409,17 +2474,17 @@ msgstr "" " psql 変数 '名前' に '値' をセット\n" " (例: -v ON_ERROR_STOP=1)\n" -#: help.c:89 +#: help.c:86 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: help.c:90 +#: help.c:87 #, c-format msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc 初期化ファイル (~/.psqlrc) を読み込まない\n" -#: help.c:91 +#: help.c:88 #, c-format msgid "" " -1 (\"one\"), --single-transaction\n" @@ -2428,22 +2493,22 @@ msgstr "" " -1 (数字の1), --single-transaction\n" " (対話形式でない場合)単一のトランザクションとして実行\n" -#: help.c:93 +#: help.c:90 #, c-format msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] このヘルプを表示して終了\n" -#: help.c:94 +#: help.c:91 #, c-format msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands バックスラッシュコマンドの一覧を表示して終了\n" -#: help.c:95 +#: help.c:92 #, c-format msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables 特殊変数の一覧を表示して終了\n" -#: help.c:97 +#: help.c:94 #, c-format msgid "" "\n" @@ -2452,57 +2517,57 @@ msgstr "" "\n" "入出力オプション:\n" -#: help.c:98 +#: help.c:95 #, c-format msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all スクリプトから読み込んだ入力をすべて表示\n" -#: help.c:99 +#: help.c:96 #, c-format msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors 失敗したコマンドを表示\n" -#: help.c:100 +#: help.c:97 #, c-format msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries サーバへ送信したコマンドを表示\n" -#: help.c:101 +#: help.c:98 #, c-format msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden 内部コマンドが生成した問い合わせを表示\n" -#: help.c:102 +#: help.c:99 #, c-format msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=FILENAME セッションログをファイルに書き込む\n" -#: help.c:103 +#: help.c:100 #, c-format msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline 拡張コマンドライン編集機能(readline)を無効にする\n" -#: help.c:104 +#: help.c:101 #, c-format msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=FILENAME 問い合わせの結果をファイル (または |パイプ)に送る\n" -#: help.c:105 +#: help.c:102 #, c-format msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet 静かに実行 (メッセージなしで、問い合わせの出力のみ)\n" -#: help.c:106 +#: help.c:103 #, c-format msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step シングルステップモード (各問い合わせごとに確認)\n" -#: help.c:107 +#: help.c:104 #, c-format msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr " -S, --single-line 単一行モード (行末でSQLコマンドを終端)\n" -#: help.c:109 +#: help.c:106 #, c-format msgid "" "\n" @@ -2511,17 +2576,17 @@ msgstr "" "\n" "出力フォーマットのオプション\n" -#: help.c:110 +#: help.c:107 #, c-format msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align 桁揃えなしのテーブル出力モード\n" -#: help.c:111 +#: help.c:108 #, c-format msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv CSV(カンマ区切り)テーブル出力モード\n" -#: help.c:112 +#: help.c:109 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2531,19 +2596,19 @@ msgstr "" " 桁揃えなし出力時のフィールド区切り文字\n" " (デフォルト: \"%s\")\n" -#: help.c:115 +#: help.c:112 #, c-format msgid " -H, --html HTML table output mode\n" msgstr " -H, --html HTML テーブル出力モード\n" -#: help.c:116 +#: help.c:113 #, c-format msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr "" " -P, --pset=変数[=値] 表示オプション '変数' を '値' にセット\n" " (\\pset コマンドを参照)\n" -#: help.c:117 +#: help.c:114 #, c-format msgid "" " -R, --record-separator=STRING\n" @@ -2553,22 +2618,22 @@ msgstr "" " 桁揃えなし出力におけるレコード区切り文字\n" " (デフォルト: 改行)\n" -#: help.c:119 +#: help.c:116 #, c-format msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only 行のみを表示\n" -#: help.c:120 +#: help.c:117 #, c-format msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr " -T, --table-attr=TEXT HTMLテーブルのタグ属性をセット (width, border等)\n" -#: help.c:121 +#: help.c:118 #, c-format msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded 拡張テーブル出力に切り替える\n" -#: help.c:122 +#: help.c:119 #, c-format msgid "" " -z, --field-separator-zero\n" @@ -2577,7 +2642,7 @@ msgstr "" " -z, --field-separator-zero\n" " 桁揃えなし出力のフィールド区切りをバイト値の0に設定\n" -#: help.c:124 +#: help.c:121 #, c-format msgid "" " -0, --record-separator-zero\n" @@ -2586,7 +2651,7 @@ msgstr "" " -0, --record-separator-zero\n" " 桁揃えなし出力のレコード区切りをバイト値の0に設定\n" -#: help.c:127 +#: help.c:124 #, c-format msgid "" "\n" @@ -2595,38 +2660,38 @@ msgstr "" "\n" "接続オプション:\n" -#: help.c:130 +#: help.c:127 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" msgstr "" " -h, --host=HOSTNAME データベースサーバのホストまたはソケットの\n" " ディレクトリ(デフォルト: \"%s\")\n" -#: help.c:131 +#: help.c:128 msgid "local socket" msgstr "ローカルソケット" -#: help.c:134 +#: help.c:131 #, c-format msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr " -p, --port=PORT データベースサーバのポート番号(デフォルト: \"%s\")\n" -#: help.c:140 +#: help.c:134 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr " -U, --username=USERNAME データベースのユーザ名 (デフォルト: \"%s\")\n" -#: help.c:141 +#: help.c:135 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password パスワード入力を要求しない\n" -#: help.c:142 +#: help.c:136 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password パスワードプロンプトの強制表示(本来は自動的に表示)\n" -#: help.c:144 +#: help.c:138 #, c-format msgid "" "\n" @@ -2640,496 +2705,515 @@ msgstr "" "をタイプするか、またはPostgreSQLドキュメント中のpsqlのセクションを参照のこと。\n" "\n" -#: help.c:147 +#: help.c:141 #, c-format msgid "Report bugs to <%s>.\n" msgstr "バグは<%s>に報告してください。\n" -#: help.c:148 +#: help.c:142 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: help.c:174 +#: help.c:168 #, c-format msgid "General\n" msgstr "一般\n" -#: help.c:175 +#: help.c:169 #, c-format msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright PostgreSQL の使い方と配布条件を表示\n" -#: help.c:176 +#: help.c:170 #, c-format -msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" -msgstr " \\crosstabview [列] 問い合わせを実行し、結果をクロス表形式で出力\n" +msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" +msgstr " \\crosstabview [列リスト] 問い合わせを実行し、結果をクロス表形式で出力\n" -#: help.c:177 +#: help.c:171 #, c-format msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose 最後のエラーメッセージを最大の冗長性で表示\n" -#: help.c:178 +#: help.c:172 #, c-format msgid "" -" \\g [(OPTIONS)] [FILE] execute query (and send results to file or |pipe);\n" +" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" msgstr "" -" \\g [(OPTIONS)] [FILE] 問い合わせ実行 (と結果のファイルまたは |パイプ への\n" -" 送出);\n" -" \\g に引数を付加しない場合はセミコロンと同義\n" +" \\g [(OPTIONS)] [FILE] 問い合わせ実行 (結果はファイルまたは |パイプへ出力);\n" +" 引数なしの\\gはセミコロンと同義\n" -#: help.c:180 +#: help.c:174 #, c-format msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc 問い合わせを実行せずに結果の説明を行う\n" -#: help.c:181 +#: help.c:175 #, c-format msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec 問い合わせを実行し、結果の中の個々の値を実行\n" -#: help.c:182 +#: help.c:176 #, c-format -msgid " \\gset [PREFIX] execute query and store results in psql variables\n" +msgid " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr " \\gset [PREFIX] 問い合わせを実行して結果を psql 変数に格納\n" -#: help.c:183 +#: help.c:177 #, c-format msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [ファイル名] \\g と同じ、ただし拡張出力モードを強制\n" -#: help.c:184 +#: help.c:178 #, c-format msgid " \\q quit psql\n" msgstr " \\q psql を終了する\n" -#: help.c:185 +#: help.c:179 #, c-format msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr " \\watch [秒数] 指定した秒数ごとに問い合わせを実行\n" -#: help.c:188 +#: help.c:182 #, c-format msgid "Help\n" msgstr "ヘルプ\n" -#: help.c:190 +#: help.c:184 #, c-format msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [コマンド] バックスラッシュコマンドのヘルプを表示\n" -#: help.c:191 +#: help.c:185 #, c-format msgid " \\? options show help on psql command-line options\n" msgstr " \\? オプション psql のコマンドライン・オプションのヘルプを表示\n" -#: help.c:192 +#: help.c:186 #, c-format msgid " \\? variables show help on special variables\n" msgstr " \\? 変数名 特殊変数のヘルプを表示\n" -#: help.c:193 +#: help.c:187 #, c-format msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [名前] SQLコマンドの文法ヘルプの表示。* で全コマンドを表示\n" -#: help.c:196 +#: help.c:190 #, c-format msgid "Query Buffer\n" msgstr "問い合わせバッファ\n" -#: help.c:197 +#: help.c:191 #, c-format msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr "" " \\e [ファイル] [行番号] 現在の問い合わせバッファ(やファイル)を外部エディタで\n" " 編集\n" -#: help.c:198 +#: help.c:192 #, c-format msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [関数名 [行番号]] 関数定義を外部エディタで編集\n" -#: help.c:199 +#: help.c:193 #, c-format msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [ビュー名 [行番号]] ビュー定義を外部エディタで編集\n" -#: help.c:200 +#: help.c:194 #, c-format msgid " \\p show the contents of the query buffer\n" msgstr " \\p 問い合わせバッファの内容を表示\n" -#: help.c:201 +#: help.c:195 #, c-format msgid " \\r reset (clear) the query buffer\n" msgstr " \\r 問い合わせバッファをリセット(クリア)\n" -#: help.c:203 +#: help.c:197 #, c-format msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [ファイル] ヒストリを表示またはファイルに保存\n" -#: help.c:205 +#: help.c:199 #, c-format msgid " \\w FILE write query buffer to file\n" msgstr " \\w ファイル 問い合わせバッファの内容をファイルに保存\n" -#: help.c:208 +#: help.c:202 #, c-format msgid "Input/Output\n" msgstr "入出力\n" -#: help.c:209 +#: help.c:203 #, c-format msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr "" " \\copy ... クライアントホストに対し、データストリームを使って\n" " SQL COPYを実行\n" -#: help.c:210 +#: help.c:204 #, c-format msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [文字列] 文字列を標準出力に書き込む (-n で改行しない)\n" -#: help.c:211 +#: help.c:205 #, c-format msgid " \\i FILE execute commands from file\n" msgstr " \\i ファイル ファイルからコマンドを読み込んで実行\n" -#: help.c:212 +#: help.c:206 #, c-format msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr "" " \\ir ファイル \\i と同じ。ただし現在のスクリプトの場所からの相対パス\n" " で指定\n" -#: help.c:213 +#: help.c:207 #, c-format msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [ファイル] 問い合わせ結果をすべてファイルまたは |パイプ へ送出\n" -#: help.c:214 +#: help.c:208 #, c-format msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr "" " \\qecho [-n] [文字列] 文字列を\\oで指定した出力ストリームに書き込む(-n で改行\n" " しない)\n" -#: help.c:215 +#: help.c:209 #, c-format msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr " \\warn [-n] [文字列] 文字列を標準エラー出力に書き込む (-n で改行しない)\n" -#: help.c:218 +#: help.c:212 #, c-format msgid "Conditional\n" msgstr "条件分岐\n" -#: help.c:219 +#: help.c:213 #, c-format msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR 条件分岐ブロックの開始\n" -#: help.c:220 +#: help.c:214 #, c-format msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR 現在の条件分岐ブロック内の選択肢\n" -#: help.c:221 +#: help.c:215 #, c-format msgid " \\else final alternative within current conditional block\n" msgstr " \\else 現在の条件分岐ブロックにおける最後の選択肢\n" -#: help.c:222 +#: help.c:216 #, c-format msgid " \\endif end conditional block\n" msgstr " \\endif 条件分岐ブロックの終了\n" -#: help.c:225 +#: help.c:219 #, c-format msgid "Informational\n" msgstr "情報表示\n" -#: help.c:226 +#: help.c:220 #, c-format msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (オプション:S = システムオブジェクトを表示, + = 詳細表示)\n" -#: help.c:227 +#: help.c:221 #, c-format msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] テーブル、ビュー、およびシーケンスの一覧を表示\n" -#: help.c:228 +#: help.c:222 #, c-format msgid " \\d[S+] NAME describe table, view, sequence, or index\n" -msgstr " \\d[S+] 名前 テーブル、ビュー、シーケンス、またはインデックスの説明を表示\n" +msgstr " \\d[S+] 名前 テーブル、ビュー、シーケンス、またはインデックスの\n" +" 説明を表示\n" -#: help.c:229 +#: help.c:223 #, c-format msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [パターン] 集約関数の一覧を表示\n" -#: help.c:230 +#: help.c:224 #, c-format msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [パターン] アクセスメソッドの一覧を表示\n" -#: help.c:231 +#: help.c:225 #, c-format msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] 演算子クラスの一覧を表示\n" -#: help.c:232 +#: help.c:226 #, c-format msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] 演算子族の一覧を表示\n" -#: help.c:233 +#: help.c:227 #, c-format msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] 演算子族の演算子の一覧を表示\n" -#: help.c:234 +#: help.c:228 #, c-format -msgid " \\dAp [AMPTRN [OPFPTRN]] list support functions of operator families\n" -msgstr " \\dAp [AMPTRN [OPFPTRN]] 演算子族のサポート関数の一覧を表示\n" +msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" +msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] 演算子族のサポート関数の一覧を表示\n" -#: help.c:235 +#: help.c:229 #, c-format msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [パターン] テーブル空間の一覧を表示\n" -#: help.c:236 +#: help.c:230 +#, c-format +msgid " \\dc[S+] [PATTERN] list conversions\n" +msgstr " \\dc[S+] [パターン] 符号化方式間の変換の一覧を表示\n" + +#: help.c:231 #, c-format -msgid " \\dc[S+] [PATTERN] list conversions\n" -msgstr " \\dc[S+] [パターン] 符号化方式間の変換の一覧を表示\n" +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [PATTERN] 設定パラメータの一覧を表示\n" -#: help.c:237 +#: help.c:232 #, c-format msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [パターン] キャストの一覧を表示します。\n" -#: help.c:238 +#: help.c:233 #, c-format msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [パターン] 他では表示されないオブジェクトの説明を表示\n" -#: help.c:239 +#: help.c:234 #, c-format msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [パターン] ドメインの一覧を表示\n" -#: help.c:240 +#: help.c:235 #, c-format msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [パターン] デフォルト権限の一覧を表示\n" -#: help.c:241 +#: help.c:236 #, c-format msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [パターン] 外部テーブルの一覧を表示\n" -#: help.c:242 -#, c-format -msgid " \\det[+] [PATTERN] list foreign tables\n" -msgstr " \\det[+] [パターン] 外部テーブルの一覧を表示\n" - -#: help.c:243 +#: help.c:237 #, c-format msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [パターン] 外部サーバの一覧を表示\n" -#: help.c:244 +#: help.c:238 +#, c-format +msgid " \\det[+] [PATTERN] list foreign tables\n" +msgstr " \\det[+] [パターン] 外部テーブルの一覧を表示\n" + +#: help.c:239 #, c-format msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [パターン] ユーザマッピングの一覧を表示\n" -#: help.c:245 +#: help.c:240 #, c-format msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [パターン] 外部データラッパの一覧を表示\n" -#: help.c:246 +#: help.c:241 #, c-format -msgid " \\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions\n" +msgid "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" list [only agg/normal/procedure/trigger/window] functions\n" msgstr "" -" \\df[antw][S+] [パターン] 関数(集約/通常/プロシージャ/トリガー/ウィンドウ\n" -" 関数のみ)の一覧を表示\n" +" \\df[anptw][S+] [関数パターン [型パターン ...]]\n" +" [集約/通常/プロシージャ/トリガー/ウィンドウ]\n" +" 関数のみの一覧を表示\n" -#: help.c:247 +#: help.c:243 #, c-format msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [パターン] テキスト検索設定の一覧を表示\n" -#: help.c:248 +#: help.c:244 #, c-format msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [パターン] テキスト検索辞書の一覧を表示\n" -#: help.c:249 +#: help.c:245 #, c-format msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [パターン] テキスト検索パーサの一覧を表示\n" -#: help.c:250 +#: help.c:246 #, c-format msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [パターン] テキスト検索テンプレートの一覧を表示\n" -#: help.c:251 +#: help.c:247 #, c-format msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [パターン] ロールの一覧を表示\n" -#: help.c:252 +#: help.c:248 #, c-format msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [パターン] インデックスの一覧を表示\n" -#: help.c:253 +#: help.c:249 #, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl ラージオブジェクトの一覧を表示、\\lo_list と同じ\n" +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] ラージオブジェクトの一覧を表示、\\lo_list と同じ\n" -#: help.c:254 +#: help.c:250 #, c-format msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [パターン] 手続き言語の一覧を表示\n" -#: help.c:255 +#: help.c:251 #, c-format msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [パターン] 実体化ビューの一覧を表示\n" -#: help.c:256 +#: help.c:252 #, c-format msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [パターン] スキーマの一覧を表示\n" -#: help.c:257 +#: help.c:253 #, c-format -msgid " \\do[S] [PATTERN] list operators\n" -msgstr " \\do[S] [名前] 演算子の一覧を表示\n" +msgid "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" list operators\n" +msgstr "" +" \\do[S+] [演算子パターン [型パターン [型パターン]]]\n" +" 演算子の一覧を表示\n" -#: help.c:258 +#: help.c:255 #, c-format msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [パターン] 照合順序の一覧を表示\n" -#: help.c:259 +#: help.c:256 #, c-format msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" msgstr " \\dp [パターン] テーブル、ビュー、シーケンスのアクセス権の一覧を表示\n" -#: help.c:260 +#: help.c:257 #, c-format msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr "" " \\dP[itn+] [パターン] パーティションリレーション[テーブル/インデックスのみ]\n" " の一覧を表示 [n=入れ子]\n" -#: help.c:261 +#: help.c:258 #, c-format -msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" -msgstr " \\drds [パターン1 [パターン2]] データベース毎のロール設定の一覧を表示\n" +msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" +msgstr "" +" \\drds [ロールパターン [DBパターン]]\n" +" データベース毎のロール設定の一覧を表示\n" -#: help.c:262 +#: help.c:259 #, c-format msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [パターン] レプリケーションのパブリケーションの一覧を表示\n" -#: help.c:263 +#: help.c:260 #, c-format msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [パターン] レプリケーションのサブスクリプションの一覧を表示\n" -#: help.c:264 +#: help.c:261 #, c-format msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [パターン] シーケンスの一覧を表示\n" -#: help.c:265 +#: help.c:262 #, c-format msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [パターン] テーブルの一覧を表示\n" -#: help.c:266 +#: help.c:263 #, c-format msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [パターン] データ型の一覧を表示\n" -#: help.c:267 +#: help.c:264 #, c-format msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [パターン] ロールの一覧を表示\n" -#: help.c:268 +#: help.c:265 #, c-format msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [パターン] ビューの一覧を表示\n" -#: help.c:269 +#: help.c:266 #, c-format msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [パターン] 機能拡張の一覧を表示\n" -#: help.c:270 +#: help.c:267 #, c-format -msgid " \\dy [PATTERN] list event triggers\n" -msgstr " \\dy [パターン] イベントトリガーの一覧を表示\n" +msgid " \\dX [PATTERN] list extended statistics\n" +msgstr " \\dX [パターン] 拡張統計情報の一覧を表示\n" -#: help.c:271 +#: help.c:268 +#, c-format +msgid " \\dy[+] [PATTERN] list event triggers\n" +msgstr " \\dy[+] [パターン] イベントトリガーの一覧を表示\n" + +#: help.c:269 #, c-format msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [パターン] データベースの一覧を表示\n" -#: help.c:272 +#: help.c:270 #, c-format msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] 関数名 関数の定義を表示\n" -#: help.c:273 +#: help.c:271 #, c-format msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] ビュー名 ビューの定義を表示\n" -#: help.c:274 +#: help.c:272 #, c-format msgid " \\z [PATTERN] same as \\dp\n" msgstr " \\z [パターン] \\dp と同じ\n" -#: help.c:277 +#: help.c:275 #, c-format msgid "Formatting\n" msgstr "書式設定\n" -#: help.c:278 +#: help.c:276 #, c-format msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a 非整列と整列間の出力モードの切り替え\n" -#: help.c:279 +#: help.c:277 #, c-format msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [文字列] テーブルのタイトルを設定、値がなければ削除\n" -#: help.c:280 +#: help.c:278 #, c-format msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr "" " \\f [文字列] 問い合わせ結果の非整列出力時のフィールド区切り文字を\n" " 表示または設定\n" -#: help.c:281 +#: help.c:279 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H HTML出力モードの切り替え (現在値: %s)\n" -#: help.c:283 +#: help.c:281 #, c-format msgid "" " \\pset [NAME [VALUE]] set table output option\n" @@ -3148,27 +3232,27 @@ msgstr "" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle)\n" -#: help.c:290 +#: help.c:288 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] 結果行のみ表示 (現在値: %s)\n" -#: help.c:292 +#: help.c:290 #, c-format msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr " \\T [文字列] HTMLの
タグ属性の設定、値がなければ解除\n" -#: help.c:293 +#: help.c:291 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] 拡張出力の切り替え (現在値: %s)\n" -#: help.c:297 +#: help.c:295 #, c-format msgid "Connection\n" msgstr "接続\n" -#: help.c:299 +#: help.c:297 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3177,7 +3261,7 @@ msgstr "" " \\c[onnect] {[DB名|- ユーザ名|- ホスト名|- ポート番号|-] | 接続文字列}\n" " 新しいデータベースに接続 (現在: \"%s\")\n" -#: help.c:303 +#: help.c:301 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3186,87 +3270,94 @@ msgstr "" " \\c[onnect] {[DB名|- ユーザ名|- ホスト名|- ポート番号|-] | 接続文字列}\n" " 新しいデータベースに接続 (現在: 未接続)\n" -#: help.c:305 +#: help.c:303 #, c-format msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo 現在の接続に関する情報を表示\n" -#: help.c:306 +#: help.c:304 #, c-format msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [エンコーディング] クライアントのエンコーディングを表示または設定\n" -#: help.c:307 +#: help.c:305 #, c-format msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [ユーザ名] ユーザのパスワードを安全に変更\n" -#: help.c:310 +#: help.c:308 #, c-format msgid "Operating System\n" msgstr "オペレーティングシステム\n" -#: help.c:311 +#: help.c:309 #, c-format msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [DIR] カレントディレクトリを変更\n" -#: help.c:312 +#: help.c:310 +#, c-format +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr "" +" \\getenv psql変数 環境変数\n" +" 環境変数を取得\n" + +#: help.c:311 #, c-format msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv 名前 [値] 環境変数を設定または解除\n" -#: help.c:313 +#: help.c:312 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] コマンドの実行時間表示の切り替え (現在値: %s)\n" -#: help.c:315 +#: help.c:314 #, c-format msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr "" " \\! [コマンド] シェルでコマンドを実行するか、もしくは対話型シェルを\n" " 起動します。\n" -#: help.c:318 +#: help.c:317 #, c-format msgid "Variables\n" msgstr "変数\n" -#: help.c:319 +#: help.c:318 #, c-format msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [テキスト] 変数名 ユーザに対して内部変数の設定を要求します\n" -#: help.c:320 +#: help.c:319 #, c-format msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr " \\set [変数名 [値]] 内部変数の値を設定、パラメータがなければ一覧を表示\n" -#: help.c:321 +#: help.c:320 #, c-format msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset 変数名 内部変数を削除\n" -#: help.c:324 +#: help.c:323 #, c-format msgid "Large Objects\n" msgstr "ラージ・オブジェクト\n" -#: help.c:325 +#: help.c:324 #, c-format msgid "" " \\lo_export LOBOID FILE\n" " \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" +" \\lo_list[+]\n" " \\lo_unlink LOBOID large object operations\n" msgstr "" " \\lo_export LOBOID ファイル名\n" " \\lo_import ファイル名 [コメント]\n" -" \\lo_list\n" +" \\lo_list[+]\n" " \\lo_unlink LOBOID ラージオブジェクトの操作\n" -#: help.c:352 +#: help.c:351 #, c-format msgid "" "List of specially treated variables\n" @@ -3275,12 +3366,12 @@ msgstr "" "特別に扱われる変数の一覧\n" "\n" -#: help.c:354 +#: help.c:353 #, c-format msgid "psql variables:\n" msgstr "psql変数:\n" -#: help.c:356 +#: help.c:355 #, c-format msgid "" " psql --set=NAME=VALUE\n" @@ -3291,7 +3382,7 @@ msgstr "" " またはpsql内で \\set 名前 値\n" "\n" -#: help.c:358 +#: help.c:357 #, c-format msgid "" " AUTOCOMMIT\n" @@ -3300,7 +3391,7 @@ msgstr "" " AUTOCOMMIT\n" " セットされている場合、SQLコマンドが成功した際に自動的にコミット\n" -#: help.c:360 +#: help.c:359 #, c-format msgid "" " COMP_KEYWORD_CASE\n" @@ -3311,7 +3402,7 @@ msgstr "" " SQLキーワードの補完に使う文字ケースを指定\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:363 +#: help.c:362 #, c-format msgid "" " DBNAME\n" @@ -3320,7 +3411,7 @@ msgstr "" " DBNAME\n" " 現在接続中のデータベース名\n" -#: help.c:365 +#: help.c:364 #, c-format msgid "" " ECHO\n" @@ -3331,7 +3422,7 @@ msgstr "" " どの入力を標準出力への出力対象とするかを設定\n" " [all, errors, none, queries]\n" -#: help.c:368 +#: help.c:367 #, c-format msgid "" " ECHO_HIDDEN\n" @@ -3342,7 +3433,7 @@ msgstr "" " セットされていれば、バックスラッシュコマンドで実行される内部問い合わせを\n" " 表示; \"noexec\"を設定した場合は実行せずに表示のみ\n" -#: help.c:371 +#: help.c:370 #, c-format msgid "" " ENCODING\n" @@ -3351,7 +3442,7 @@ msgstr "" " ENCODING\n" " 現在のクライアント側の文字セットのエンコーディング\n" -#: help.c:373 +#: help.c:372 #, c-format msgid "" " ERROR\n" @@ -3360,7 +3451,7 @@ msgstr "" " ERROR\n" " 最後の問い合わせが失敗であれば真、そうでなければ偽\n" -#: help.c:375 +#: help.c:374 #, c-format msgid "" " FETCH_COUNT\n" @@ -3369,7 +3460,7 @@ msgstr "" " FETCH_COUNT\n" " 一度に取得および表示する結果の行数 (0 = 無制限)\n" -#: help.c:377 +#: help.c:376 #, c-format msgid "" " HIDE_TABLEAM\n" @@ -3379,7 +3470,17 @@ msgstr "" " 設定すると、テーブルアクセスメソッドは表示されない\n" "\n" -#: help.c:379 +#: help.c:378 +#, c-format +msgid "" +" HIDE_TOAST_COMPRESSION\n" +" if set, compression methods are not displayed\n" +msgstr "" +" HIDE_TOAST_COMPRESSION\n" +" 設定すると、圧縮方式は表示されない\n" +"\n" + +#: help.c:380 #, c-format msgid "" " HISTCONTROL\n" @@ -3388,7 +3489,7 @@ msgstr "" " HISTCONTROL\n" " コマンド履歴の制御 [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:381 +#: help.c:382 #, c-format msgid "" " HISTFILE\n" @@ -3397,7 +3498,7 @@ msgstr "" " HISTFILE\n" " コマンド履歴を保存するファイルの名前\n" -#: help.c:383 +#: help.c:384 #, c-format msgid "" " HISTSIZE\n" @@ -3406,7 +3507,7 @@ msgstr "" " HISTSIZE\n" " コマンド履歴で保存するコマンド数の上限\n" -#: help.c:385 +#: help.c:386 #, c-format msgid "" " HOST\n" @@ -3415,7 +3516,7 @@ msgstr "" " HOST\n" " 現在接続中のデータベースサーバホスト\n" -#: help.c:387 +#: help.c:388 #, c-format msgid "" " IGNOREEOF\n" @@ -3424,7 +3525,7 @@ msgstr "" " IGNOREEOF\n" " 対話形セッションを終わらせるのに必要なEOFの数\n" -#: help.c:389 +#: help.c:390 #, c-format msgid "" " LASTOID\n" @@ -3433,7 +3534,7 @@ msgstr "" " LASTOID\n" " 最後の変更の影響を受けたOID\n" -#: help.c:391 +#: help.c:392 #, c-format msgid "" " LAST_ERROR_MESSAGE\n" @@ -3445,7 +3546,7 @@ msgstr "" " 最後のエラーのメッセージおよび SQLSTATE、\n" " なにもなければ空の文字列および\"00000\"\n" -#: help.c:394 +#: help.c:395 #, c-format msgid "" " ON_ERROR_ROLLBACK\n" @@ -3455,7 +3556,7 @@ msgstr "" " セットされている場合、エラーでトランザクションを停止しない (暗黙のセーブ\n" " ポイントを使用)\n" -#: help.c:396 +#: help.c:397 #, c-format msgid "" " ON_ERROR_STOP\n" @@ -3464,7 +3565,7 @@ msgstr "" " ON_ERROR_STOP\n" " エラー発生後にバッチ実行を停止\n" -#: help.c:398 +#: help.c:399 #, c-format msgid "" " PORT\n" @@ -3473,7 +3574,7 @@ msgstr "" " PORT\n" " 現在の接続のサーバポート\n" -#: help.c:400 +#: help.c:401 #, c-format msgid "" " PROMPT1\n" @@ -3482,16 +3583,16 @@ msgstr "" " PROMPT1\n" " psql の標準のプロンプトを指定\n" -#: help.c:402 +#: help.c:403 #, c-format msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" msgstr "" " PROMPT2\n" -" ステートメントが前行から継続する場合のプロンプトを指定\n" +" 文が前行から継続する場合のプロンプトを指定\n" -#: help.c:404 +#: help.c:405 #, c-format msgid "" " PROMPT3\n" @@ -3500,7 +3601,7 @@ msgstr "" " PROMPT3\n" " COPY ... FROM STDIN の最中に使われるプロンプトを指定\n" -#: help.c:406 +#: help.c:407 #, c-format msgid "" " QUIET\n" @@ -3509,7 +3610,7 @@ msgstr "" " QUIET\n" " メッセージを表示しない (-q オプションと同じ)\n" -#: help.c:408 +#: help.c:409 #, c-format msgid "" " ROW_COUNT\n" @@ -3518,7 +3619,7 @@ msgstr "" " ROW_COUNT\n" " 最後の問い合わせで返却した、または影響を与えた行の数、または0\n" -#: help.c:410 +#: help.c:411 #, c-format msgid "" " SERVER_VERSION_NAME\n" @@ -3529,7 +3630,16 @@ msgstr "" " SERVER_VERSION_NUM\n" " サーバのバージョン(短い文字列または数値)\n" -#: help.c:413 +#: help.c:414 +#, c-format +msgid "" +" SHOW_ALL_RESULTS\n" +" show all results of a combined query (\\;) instead of only the last\n" +msgstr "" +" SHOW_ALL_RESULTS\n" +" 複合問い合わせ(\\;)の最後の結果のみではなくすべてを表示する\n" + +#: help.c:416 #, c-format msgid "" " SHOW_CONTEXT\n" @@ -3538,7 +3648,7 @@ msgstr "" " SHOW_CONTEXT\n" " メッセージコンテキストフィールドの表示を制御 [never, errors, always]\n" -#: help.c:415 +#: help.c:418 #, c-format msgid "" " SINGLELINE\n" @@ -3547,7 +3657,7 @@ msgstr "" " SINGLELINE\n" " セットした場合、改行はSQLコマンドを終端する (-S オプションと同じ)\n" -#: help.c:417 +#: help.c:420 #, c-format msgid "" " SINGLESTEP\n" @@ -3556,7 +3666,7 @@ msgstr "" " SINGLESTEP\n" " シングルステップモード (-s オプションと同じ)\n" -#: help.c:419 +#: help.c:422 #, c-format msgid "" " SQLSTATE\n" @@ -3565,7 +3675,7 @@ msgstr "" " SQLSTATE\n" " 最後の問い合わせの SQLSTATE、またはエラーでなければ\"00000\"\n" -#: help.c:421 +#: help.c:424 #, c-format msgid "" " USER\n" @@ -3574,7 +3684,7 @@ msgstr "" " USER\n" " 現在接続中のデータベースユーザ\n" -#: help.c:423 +#: help.c:426 #, c-format msgid "" " VERBOSITY\n" @@ -3583,7 +3693,7 @@ msgstr "" " VERBOSITY\n" " エラー報告の詳細度を制御 [default, verbose, terse, sqlstate]\n" -#: help.c:425 +#: help.c:428 #, c-format msgid "" " VERSION\n" @@ -3596,7 +3706,7 @@ msgstr "" " VERSION_NUM\n" " psql のバージョン(長い文字列、短い文字列または数値)\n" -#: help.c:430 +#: help.c:433 #, c-format msgid "" "\n" @@ -3605,7 +3715,7 @@ msgstr "" "\n" "表示設定:\n" -#: help.c:432 +#: help.c:435 #, c-format msgid "" " psql --pset=NAME[=VALUE]\n" @@ -3616,7 +3726,7 @@ msgstr "" " またはpsql内で \\pset 名前 [値]\n" "\n" -#: help.c:434 +#: help.c:437 #, c-format msgid "" " border\n" @@ -3625,7 +3735,7 @@ msgstr "" " border\n" " 境界線のスタイル (番号)\n" -#: help.c:436 +#: help.c:439 #, c-format msgid "" " columns\n" @@ -3634,7 +3744,7 @@ msgstr "" " columns\n" " 折り返し形式で目標とする横幅\n" -#: help.c:438 +#: help.c:441 #, c-format msgid "" " expanded (or x)\n" @@ -3643,7 +3753,7 @@ msgstr "" " expanded (or x)\n" " 拡張出力 [on, off, auto]\n" -#: help.c:440 +#: help.c:443 #, c-format msgid "" " fieldsep\n" @@ -3652,7 +3762,7 @@ msgstr "" " fieldsep\n" " 非整列出力でのフィールド区切り文字(デフォルトは \"%s\")\n" -#: help.c:443 +#: help.c:446 #, c-format msgid "" " fieldsep_zero\n" @@ -3661,7 +3771,7 @@ msgstr "" " fieldsep_zero\n" " 非整列出力でのフィールド区切り文字をバイト値の0に設定\n" -#: help.c:445 +#: help.c:448 #, c-format msgid "" " footer\n" @@ -3670,7 +3780,7 @@ msgstr "" " footer\n" " テーブルフッター出力の要否を設定 [on, off]\n" -#: help.c:447 +#: help.c:450 #, c-format msgid "" " format\n" @@ -3679,7 +3789,7 @@ msgstr "" " format\n" " 出力フォーマットを設定 [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:449 +#: help.c:452 #, c-format msgid "" " linestyle\n" @@ -3688,7 +3798,7 @@ msgstr "" " linestyle\n" " 境界線の描画スタイルを設定 [ascii, old-ascii, unicode]\n" -#: help.c:451 +#: help.c:454 #, c-format msgid "" " null\n" @@ -3697,7 +3807,7 @@ msgstr "" " null\n" " null 値の代わりに表示する文字列を設定\n" -#: help.c:453 +#: help.c:456 #, c-format msgid "" " numericlocale\n" @@ -3706,7 +3816,7 @@ msgstr "" " numericlocale\n" " ロケール固有文字での桁区切りを表示するかどうかを指定\n" -#: help.c:455 +#: help.c:458 #, c-format msgid "" " pager\n" @@ -3715,7 +3825,7 @@ msgstr "" " pager\n" " いつ外部ページャーを使うかを制御 [yes, no, always]\n" -#: help.c:457 +#: help.c:460 #, c-format msgid "" " recordsep\n" @@ -3724,7 +3834,7 @@ msgstr "" " recordsep\n" " 非整列出力でのレコード(行)区切り\n" -#: help.c:459 +#: help.c:462 #, c-format msgid "" " recordsep_zero\n" @@ -3733,7 +3843,7 @@ msgstr "" " recordsep_zero\n" " 非整列出力でレコード区切りにバイト値の0に設定\n" -#: help.c:461 +#: help.c:464 #, c-format msgid "" " tableattr (or T)\n" @@ -3744,7 +3854,7 @@ msgstr "" " HTMLフォーマット時のtableタグの属性、もしくは latex-longtable\n" " フォーマット時に左寄せするデータ型の相対カラム幅を指定\n" -#: help.c:464 +#: help.c:467 #, c-format msgid "" " title\n" @@ -3753,7 +3863,7 @@ msgstr "" " title\n" " 以降に表示される表のタイトルを設定\n" -#: help.c:466 +#: help.c:469 #, c-format msgid "" " tuples_only\n" @@ -3762,7 +3872,7 @@ msgstr "" " tuples_only\n" " セットされた場合、実際のテーブルデータのみを表示\n" -#: help.c:468 +#: help.c:471 #, c-format msgid "" " unicode_border_linestyle\n" @@ -3775,7 +3885,7 @@ msgstr "" " unicode_header_linestyle\n" " Unicode による線描画時のスタイルを設定 [single, double]\n" -#: help.c:473 +#: help.c:476 #, c-format msgid "" "\n" @@ -3784,7 +3894,7 @@ msgstr "" "\n" "環境変数:\n" -#: help.c:477 +#: help.c:480 #, c-format msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" @@ -3795,7 +3905,7 @@ msgstr "" " またはpsql内で \\setenv 名前 [値]\n" "\n" -#: help.c:479 +#: help.c:482 #, c-format msgid "" " set NAME=VALUE\n" @@ -3808,7 +3918,7 @@ msgstr "" " またはpsq内で \\setenv 名前 [値]\n" "\n" -#: help.c:482 +#: help.c:485 #, c-format msgid "" " COLUMNS\n" @@ -3817,7 +3927,7 @@ msgstr "" " COLUMNS\n" " 折り返し書式におけるカラム数\n" -#: help.c:484 +#: help.c:487 #, c-format msgid "" " PGAPPNAME\n" @@ -3826,7 +3936,7 @@ msgstr "" " PGAPPNAME\n" " application_name 接続パラメータと同じ\n" -#: help.c:486 +#: help.c:489 #, c-format msgid "" " PGDATABASE\n" @@ -3835,7 +3945,7 @@ msgstr "" " PGDATABASE\n" " dbname 接続パラメータと同じ\n" -#: help.c:488 +#: help.c:491 #, c-format msgid "" " PGHOST\n" @@ -3844,16 +3954,7 @@ msgstr "" " PGHOST\n" " host 接続パラメータと同じ\n" -#: help.c:490 -#, c-format -msgid "" -" PGPASSWORD\n" -" connection password (not recommended)\n" -msgstr "" -" PGPASSWORD\n" -" 接続用パスワード (推奨されません)\n" - -#: help.c:492 +#: help.c:493 #, c-format msgid "" " PGPASSFILE\n" @@ -3862,7 +3963,16 @@ msgstr "" " PGPASSFILE\n" " パスワードファイル名\n" -#: help.c:494 +#: help.c:495 +#, c-format +msgid "" +" PGPASSWORD\n" +" connection password (not recommended)\n" +msgstr "" +" PGPASSWORD\n" +" 接続用パスワード (推奨されません)\n" + +#: help.c:497 #, c-format msgid "" " PGPORT\n" @@ -3871,7 +3981,7 @@ msgstr "" " PGPORT\n" " port 接続パラメータと同じ\n" -#: help.c:496 +#: help.c:499 #, c-format msgid "" " PGUSER\n" @@ -3880,7 +3990,7 @@ msgstr "" " PGUSER\n" " user 接続パラメータと同じ\n" -#: help.c:498 +#: help.c:501 #, c-format msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" @@ -3889,7 +3999,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " \\e, \\ef, \\ev コマンドで使われるエディタ\n" -#: help.c:500 +#: help.c:503 #, c-format msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" @@ -3898,7 +4008,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " エディタの起動時に行番号を指定する方法\n" -#: help.c:502 +#: help.c:505 #, c-format msgid "" " PSQL_HISTORY\n" @@ -3907,7 +4017,7 @@ msgstr "" " PSQL_HISTORY\n" " コマンドライン履歴ファイルの代替の場所\n" -#: help.c:504 +#: help.c:507 #, c-format msgid "" " PSQL_PAGER, PAGER\n" @@ -3916,7 +4026,16 @@ msgstr "" " PSQL_PAGER, PAGER\n" " 外部ページャープログラムの名前\n" -#: help.c:506 +#: help.c:510 +#, c-format +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_PAGER, PAGER\n" +" \\watchで使用する外部ページャープログラムの名前\n" + +#: help.c:513 #, c-format msgid "" " PSQLRC\n" @@ -3925,7 +4044,7 @@ msgstr "" " PSQLRC\n" " ユーザの .psqlrc ファイルの代替の場所\n" -#: help.c:508 +#: help.c:515 #, c-format msgid "" " SHELL\n" @@ -3934,7 +4053,7 @@ msgstr "" " SHELL\n" " \\! コマンドで使われるシェル\n" -#: help.c:510 +#: help.c:517 #, c-format msgid "" " TMPDIR\n" @@ -3943,11 +4062,11 @@ msgstr "" " TMPDIR\n" " テンポラリファイル用ディレクトリ\n" -#: help.c:554 +#: help.c:562 msgid "Available help:\n" msgstr "利用可能なヘルプ:\n" -#: help.c:642 +#: help.c:657 #, c-format msgid "" "Command: %s\n" @@ -3966,7 +4085,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:661 +#: help.c:680 #, c-format msgid "" "No help available for \"%s\".\n" @@ -3980,12 +4099,12 @@ msgstr "" msgid "could not read from input file: %m" msgstr "入力ファイルから読み込めませんでした: %m" -#: input.c:471 input.c:509 +#: input.c:478 input.c:516 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "ファイル\"%s\"にヒストリーを保存できませんでした: %m" -#: input.c:528 +#: input.c:535 #, c-format msgid "history is not supported by this installation" msgstr "この環境ではヒストリー機能がサポートされていません" @@ -4005,25 +4124,17 @@ msgstr "%s: 現在のトランザクションは中断されました" msgid "%s: unknown transaction status" msgstr "%s: 未知のトランザクション状態" -#: large_obj.c:288 large_obj.c:299 -msgid "ID" -msgstr "ID" - -#: large_obj.c:309 -msgid "Large objects" -msgstr "ラージ オブジェクト" - -#: mainloop.c:136 +#: mainloop.c:133 #, c-format msgid "\\if: escaped" msgstr "\\if: 脱出しました" -#: mainloop.c:195 +#: mainloop.c:192 #, c-format msgid "Use \"\\q\" to leave %s.\n" msgstr "\"\\q\"で%sを抜けます。\n" -#: mainloop.c:217 +#: mainloop.c:214 msgid "" "The input is a PostgreSQL custom-format dump.\n" "Use the pg_restore command-line client to restore this dump to a database.\n" @@ -4031,19 +4142,19 @@ msgstr "" "この入力データは PostgreSQL のカスタムフォーマットのダンプです。\n" "このダンプをデータベースにリストアするには pg_restore コマンドを使ってください。\n" -#: mainloop.c:298 +#: mainloop.c:295 msgid "Use \\? for help or press control-C to clear the input buffer." msgstr "\\? でヘルプの表示、control-C で入力バッファをクリアします。" -#: mainloop.c:300 +#: mainloop.c:297 msgid "Use \\? for help." msgstr " \\? でヘルプを表示します。" -#: mainloop.c:304 +#: mainloop.c:301 msgid "You are using psql, the command-line interface to PostgreSQL." msgstr "PostgreSQL へのコマンド ライン インターフェイス、psql を使用しています。" -#: mainloop.c:305 +#: mainloop.c:302 #, c-format msgid "" "Type: \\copyright for distribution terms\n" @@ -4058,33 +4169,28 @@ msgstr "" " \\g と打つかセミコロンで閉じると、問い合わせを実行します。\n" " \\q で終了します。\n" -#: mainloop.c:329 +#: mainloop.c:326 msgid "Use \\q to quit." msgstr "\\q で終了します。" -#: mainloop.c:332 mainloop.c:356 +#: mainloop.c:329 mainloop.c:353 msgid "Use control-D to quit." msgstr "control-D で終了します。" -#: mainloop.c:334 mainloop.c:358 +#: mainloop.c:331 mainloop.c:355 msgid "Use control-C to quit." msgstr "control-C で終了します。" -#: mainloop.c:465 mainloop.c:613 +#: mainloop.c:459 mainloop.c:618 #, c-format msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "問い合わせは無視されました; \\endifかCtrl-Cで現在の\\ifブロックを抜けてください" -#: mainloop.c:631 +#: mainloop.c:636 #, c-format msgid "reached EOF without finding closing \\endif(s)" msgstr "ブロックを閉じる\\endifを検出中に、ファイルの終端(EOF)に達しました" -#: psqlscan.l:693 -#, c-format -msgid "skipping recursive expansion of variable \"%s\"" -msgstr "変数\"%s\"の再帰展開をスキップしています" - #: psqlscanslash.l:638 #, c-format msgid "unterminated quoted string" @@ -4097,2261 +4203,2427 @@ msgstr "%s: メモリ不足です" #: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 #: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 -#: sql_help.c:111 sql_help.c:117 sql_help.c:119 sql_help.c:121 sql_help.c:123 -#: sql_help.c:126 sql_help.c:128 sql_help.c:130 sql_help.c:235 sql_help.c:237 -#: sql_help.c:238 sql_help.c:240 sql_help.c:242 sql_help.c:245 sql_help.c:247 -#: sql_help.c:249 sql_help.c:251 sql_help.c:263 sql_help.c:264 sql_help.c:265 -#: sql_help.c:267 sql_help.c:316 sql_help.c:318 sql_help.c:320 sql_help.c:322 -#: sql_help.c:391 sql_help.c:396 sql_help.c:398 sql_help.c:440 sql_help.c:442 -#: sql_help.c:445 sql_help.c:447 sql_help.c:515 sql_help.c:520 sql_help.c:525 -#: sql_help.c:530 sql_help.c:535 sql_help.c:588 sql_help.c:590 sql_help.c:592 -#: sql_help.c:594 sql_help.c:596 sql_help.c:599 sql_help.c:601 sql_help.c:604 -#: sql_help.c:615 sql_help.c:617 sql_help.c:658 sql_help.c:660 sql_help.c:662 -#: sql_help.c:665 sql_help.c:667 sql_help.c:669 sql_help.c:702 sql_help.c:706 -#: sql_help.c:710 sql_help.c:729 sql_help.c:732 sql_help.c:735 sql_help.c:764 -#: sql_help.c:776 sql_help.c:784 sql_help.c:787 sql_help.c:790 sql_help.c:805 -#: sql_help.c:808 sql_help.c:837 sql_help.c:842 sql_help.c:847 sql_help.c:852 -#: sql_help.c:857 sql_help.c:879 sql_help.c:881 sql_help.c:883 sql_help.c:885 -#: sql_help.c:888 sql_help.c:890 sql_help.c:931 sql_help.c:975 sql_help.c:980 -#: sql_help.c:985 sql_help.c:990 sql_help.c:995 sql_help.c:1014 sql_help.c:1025 -#: sql_help.c:1027 sql_help.c:1046 sql_help.c:1056 sql_help.c:1058 -#: sql_help.c:1060 sql_help.c:1072 sql_help.c:1076 sql_help.c:1078 -#: sql_help.c:1090 sql_help.c:1092 sql_help.c:1094 sql_help.c:1096 -#: sql_help.c:1112 sql_help.c:1114 sql_help.c:1118 sql_help.c:1121 -#: sql_help.c:1122 sql_help.c:1123 sql_help.c:1126 sql_help.c:1128 -#: sql_help.c:1262 sql_help.c:1264 sql_help.c:1267 sql_help.c:1270 -#: sql_help.c:1272 sql_help.c:1274 sql_help.c:1277 sql_help.c:1280 -#: sql_help.c:1391 sql_help.c:1393 sql_help.c:1395 sql_help.c:1398 -#: sql_help.c:1419 sql_help.c:1422 sql_help.c:1425 sql_help.c:1428 -#: sql_help.c:1432 sql_help.c:1434 sql_help.c:1436 sql_help.c:1438 -#: sql_help.c:1452 sql_help.c:1455 sql_help.c:1457 sql_help.c:1459 -#: sql_help.c:1469 sql_help.c:1471 sql_help.c:1481 sql_help.c:1483 -#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1519 sql_help.c:1521 -#: sql_help.c:1523 sql_help.c:1525 sql_help.c:1528 sql_help.c:1530 -#: sql_help.c:1533 sql_help.c:1536 sql_help.c:1586 sql_help.c:1629 -#: sql_help.c:1632 sql_help.c:1634 sql_help.c:1636 sql_help.c:1639 -#: sql_help.c:1641 sql_help.c:1643 sql_help.c:1646 sql_help.c:1696 -#: sql_help.c:1712 sql_help.c:1933 sql_help.c:2002 sql_help.c:2021 -#: sql_help.c:2034 sql_help.c:2091 sql_help.c:2098 sql_help.c:2108 -#: sql_help.c:2129 sql_help.c:2155 sql_help.c:2173 sql_help.c:2200 -#: sql_help.c:2295 sql_help.c:2340 sql_help.c:2364 sql_help.c:2387 -#: sql_help.c:2391 sql_help.c:2425 sql_help.c:2445 sql_help.c:2467 -#: sql_help.c:2481 sql_help.c:2501 sql_help.c:2524 sql_help.c:2554 -#: sql_help.c:2579 sql_help.c:2625 sql_help.c:2903 sql_help.c:2916 -#: sql_help.c:2933 sql_help.c:2949 sql_help.c:2989 sql_help.c:3041 -#: sql_help.c:3045 sql_help.c:3047 sql_help.c:3053 sql_help.c:3071 -#: sql_help.c:3098 sql_help.c:3133 sql_help.c:3145 sql_help.c:3154 -#: sql_help.c:3198 sql_help.c:3212 sql_help.c:3240 sql_help.c:3248 -#: sql_help.c:3260 sql_help.c:3270 sql_help.c:3278 sql_help.c:3286 -#: sql_help.c:3294 sql_help.c:3302 sql_help.c:3311 sql_help.c:3322 -#: sql_help.c:3330 sql_help.c:3338 sql_help.c:3346 sql_help.c:3354 -#: sql_help.c:3364 sql_help.c:3373 sql_help.c:3382 sql_help.c:3390 -#: sql_help.c:3400 sql_help.c:3411 sql_help.c:3419 sql_help.c:3428 -#: sql_help.c:3439 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 -#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3488 sql_help.c:3496 -#: sql_help.c:3504 sql_help.c:3512 sql_help.c:3520 sql_help.c:3528 -#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3562 sql_help.c:3579 -#: sql_help.c:3594 sql_help.c:3869 sql_help.c:3920 sql_help.c:3949 -#: sql_help.c:3962 sql_help.c:4407 sql_help.c:4455 sql_help.c:4596 +#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238 +#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248 +#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267 +#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323 +#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443 +#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524 +#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595 +#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606 +#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668 +#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714 +#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747 +#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802 +#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859 +#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900 +#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999 +#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019 +#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071 +#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086 +#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116 +#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141 +#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155 +#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163 +#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310 +#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320 +#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445 +#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474 +#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486 +#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507 +#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523 +#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548 +#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577 +#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588 +#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687 +#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696 +#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1997 +#: sql_help.c:2066 sql_help.c:2085 sql_help.c:2098 sql_help.c:2155 +#: sql_help.c:2162 sql_help.c:2172 sql_help.c:2198 sql_help.c:2229 +#: sql_help.c:2247 sql_help.c:2275 sql_help.c:2372 sql_help.c:2418 +#: sql_help.c:2443 sql_help.c:2466 sql_help.c:2470 sql_help.c:2504 +#: sql_help.c:2524 sql_help.c:2546 sql_help.c:2560 sql_help.c:2581 +#: sql_help.c:2610 sql_help.c:2645 sql_help.c:2670 sql_help.c:2717 +#: sql_help.c:3012 sql_help.c:3025 sql_help.c:3042 sql_help.c:3058 +#: sql_help.c:3098 sql_help.c:3152 sql_help.c:3156 sql_help.c:3158 +#: sql_help.c:3165 sql_help.c:3184 sql_help.c:3211 sql_help.c:3246 +#: sql_help.c:3258 sql_help.c:3267 sql_help.c:3311 sql_help.c:3325 +#: sql_help.c:3353 sql_help.c:3361 sql_help.c:3373 sql_help.c:3383 +#: sql_help.c:3391 sql_help.c:3399 sql_help.c:3407 sql_help.c:3415 +#: sql_help.c:3424 sql_help.c:3435 sql_help.c:3443 sql_help.c:3451 +#: sql_help.c:3459 sql_help.c:3467 sql_help.c:3477 sql_help.c:3486 +#: sql_help.c:3495 sql_help.c:3503 sql_help.c:3513 sql_help.c:3524 +#: sql_help.c:3532 sql_help.c:3541 sql_help.c:3552 sql_help.c:3561 +#: sql_help.c:3569 sql_help.c:3577 sql_help.c:3585 sql_help.c:3593 +#: sql_help.c:3601 sql_help.c:3609 sql_help.c:3617 sql_help.c:3625 +#: sql_help.c:3633 sql_help.c:3641 sql_help.c:3658 sql_help.c:3667 +#: sql_help.c:3675 sql_help.c:3692 sql_help.c:3707 sql_help.c:4017 +#: sql_help.c:4127 sql_help.c:4156 sql_help.c:4171 sql_help.c:4666 +#: sql_help.c:4714 sql_help.c:4865 msgid "name" msgstr "名前" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1783 -#: sql_help.c:3213 sql_help.c:4193 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 +#: sql_help.c:3326 sql_help.c:4442 msgid "aggregate_signature" msgstr "集約関数のシグニチャー" -#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:250 -#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:524 sql_help.c:571 -#: sql_help.c:589 sql_help.c:616 sql_help.c:666 sql_help.c:731 sql_help.c:786 -#: sql_help.c:807 sql_help.c:846 sql_help.c:891 sql_help.c:932 sql_help.c:984 -#: sql_help.c:1016 sql_help.c:1026 sql_help.c:1059 sql_help.c:1079 -#: sql_help.c:1093 sql_help.c:1129 sql_help.c:1271 sql_help.c:1392 -#: sql_help.c:1435 sql_help.c:1456 sql_help.c:1470 sql_help.c:1482 -#: sql_help.c:1495 sql_help.c:1522 sql_help.c:1587 sql_help.c:1640 +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253 +#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576 +#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798 +#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008 +#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105 +#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444 +#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534 +#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693 msgid "new_name" msgstr "新しい名前" -#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:120 sql_help.c:248 -#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:529 sql_help.c:618 -#: sql_help.c:627 sql_help.c:685 sql_help.c:705 sql_help.c:734 sql_help.c:789 -#: sql_help.c:851 sql_help.c:889 sql_help.c:989 sql_help.c:1028 sql_help.c:1057 -#: sql_help.c:1077 sql_help.c:1091 sql_help.c:1127 sql_help.c:1332 -#: sql_help.c:1394 sql_help.c:1437 sql_help.c:1458 sql_help.c:1520 -#: sql_help.c:1635 sql_help.c:2889 +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251 +#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623 +#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801 +#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052 +#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167 +#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510 +#: sql_help.c:1572 sql_help.c:1688 sql_help.c:2998 msgid "new_owner" msgstr "新しい所有者" -#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319 -#: sql_help.c:448 sql_help.c:534 sql_help.c:668 sql_help.c:709 sql_help.c:737 -#: sql_help.c:792 sql_help.c:856 sql_help.c:994 sql_help.c:1061 sql_help.c:1095 -#: sql_help.c:1273 sql_help.c:1439 sql_help.c:1460 sql_help.c:1472 -#: sql_help.c:1484 sql_help.c:1524 sql_help.c:1642 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322 +#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749 +#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087 +#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512 +#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695 msgid "new_schema" msgstr "新しいスキーマ" -#: sql_help.c:44 sql_help.c:1847 sql_help.c:3214 sql_help.c:4222 +#: sql_help.c:44 sql_help.c:1910 sql_help.c:3327 sql_help.c:4471 msgid "where aggregate_signature is:" msgstr "集約関数のシグニチャーには以下のものがあります:" -#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:337 sql_help.c:350 -#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:516 -#: sql_help.c:521 sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:838 -#: sql_help.c:843 sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:976 -#: sql_help.c:981 sql_help.c:986 sql_help.c:991 sql_help.c:996 sql_help.c:1801 -#: sql_help.c:1818 sql_help.c:1824 sql_help.c:1848 sql_help.c:1851 -#: sql_help.c:1854 sql_help.c:2003 sql_help.c:2022 sql_help.c:2025 -#: sql_help.c:2296 sql_help.c:2502 sql_help.c:3215 sql_help.c:3218 -#: sql_help.c:3221 sql_help.c:3312 sql_help.c:3401 sql_help.c:3429 -#: sql_help.c:3753 sql_help.c:4101 sql_help.c:4199 sql_help.c:4206 -#: sql_help.c:4212 sql_help.c:4223 sql_help.c:4226 sql_help.c:4229 +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353 +#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520 +#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850 +#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000 +#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020 +#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911 +#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2067 sql_help.c:2086 +#: sql_help.c:2089 sql_help.c:2373 sql_help.c:2582 sql_help.c:3328 +#: sql_help.c:3331 sql_help.c:3334 sql_help.c:3425 sql_help.c:3514 +#: sql_help.c:3542 sql_help.c:3892 sql_help.c:4341 sql_help.c:4448 +#: sql_help.c:4455 sql_help.c:4461 sql_help.c:4472 sql_help.c:4475 +#: sql_help.c:4478 msgid "argmode" msgstr "引数のモード" -#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:338 sql_help.c:351 -#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:839 -#: sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:977 -#: sql_help.c:982 sql_help.c:987 sql_help.c:992 sql_help.c:997 sql_help.c:1802 -#: sql_help.c:1819 sql_help.c:1825 sql_help.c:1849 sql_help.c:1852 -#: sql_help.c:1855 sql_help.c:2004 sql_help.c:2023 sql_help.c:2026 -#: sql_help.c:2297 sql_help.c:2503 sql_help.c:3216 sql_help.c:3219 -#: sql_help.c:3222 sql_help.c:3313 sql_help.c:3402 sql_help.c:3430 -#: sql_help.c:4200 sql_help.c:4207 sql_help.c:4213 sql_help.c:4224 -#: sql_help.c:4227 sql_help.c:4230 +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354 +#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521 +#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 +#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001 +#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 +#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912 +#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2068 sql_help.c:2087 +#: sql_help.c:2090 sql_help.c:2374 sql_help.c:2583 sql_help.c:3329 +#: sql_help.c:3332 sql_help.c:3335 sql_help.c:3426 sql_help.c:3515 +#: sql_help.c:3543 sql_help.c:4449 sql_help.c:4456 sql_help.c:4462 +#: sql_help.c:4473 sql_help.c:4476 sql_help.c:4479 msgid "argname" msgstr "引数の名前" -#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:339 sql_help.c:352 -#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:840 -#: sql_help.c:845 sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:978 -#: sql_help.c:983 sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1803 -#: sql_help.c:1820 sql_help.c:1826 sql_help.c:1850 sql_help.c:1853 -#: sql_help.c:1856 sql_help.c:2298 sql_help.c:2504 sql_help.c:3217 -#: sql_help.c:3220 sql_help.c:3223 sql_help.c:3314 sql_help.c:3403 -#: sql_help.c:3431 sql_help.c:4201 sql_help.c:4208 sql_help.c:4214 -#: sql_help.c:4225 sql_help.c:4228 sql_help.c:4231 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355 +#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522 +#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 +#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002 +#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 +#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 +#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2375 sql_help.c:2584 +#: sql_help.c:3330 sql_help.c:3333 sql_help.c:3336 sql_help.c:3427 +#: sql_help.c:3516 sql_help.c:3544 sql_help.c:4450 sql_help.c:4457 +#: sql_help.c:4463 sql_help.c:4474 sql_help.c:4477 sql_help.c:4480 msgid "argtype" msgstr "引数の型" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:926 -#: sql_help.c:1074 sql_help.c:1453 sql_help.c:1581 sql_help.c:1613 -#: sql_help.c:1665 sql_help.c:1904 sql_help.c:1911 sql_help.c:2203 -#: sql_help.c:2245 sql_help.c:2252 sql_help.c:2261 sql_help.c:2341 -#: sql_help.c:2555 sql_help.c:2647 sql_help.c:2918 sql_help.c:3099 -#: sql_help.c:3121 sql_help.c:3261 sql_help.c:3616 sql_help.c:3788 -#: sql_help.c:3961 sql_help.c:4658 +#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949 +#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666 +#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974 +#: sql_help.c:2278 sql_help.c:2320 sql_help.c:2327 sql_help.c:2336 +#: sql_help.c:2419 sql_help.c:2646 sql_help.c:2739 sql_help.c:3027 +#: sql_help.c:3212 sql_help.c:3234 sql_help.c:3374 sql_help.c:3729 +#: sql_help.c:3936 sql_help.c:4170 sql_help.c:4928 msgid "option" msgstr "オプション" -#: sql_help.c:113 sql_help.c:927 sql_help.c:1582 sql_help.c:2342 -#: sql_help.c:2556 sql_help.c:3100 sql_help.c:3262 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2420 +#: sql_help.c:2647 sql_help.c:3213 sql_help.c:3375 msgid "where option can be:" msgstr "オプションには以下のものがあります:" -#: sql_help.c:114 sql_help.c:2137 +#: sql_help.c:116 sql_help.c:2210 msgid "allowconn" msgstr "接続の可否(真偽値)" -#: sql_help.c:115 sql_help.c:928 sql_help.c:1583 sql_help.c:2138 -#: sql_help.c:2343 sql_help.c:2557 sql_help.c:3101 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2211 +#: sql_help.c:2421 sql_help.c:2648 sql_help.c:3214 msgid "connlimit" msgstr "最大同時接続数" -#: sql_help.c:116 sql_help.c:2139 +#: sql_help.c:118 sql_help.c:2212 msgid "istemplate" msgstr "テンプレートかどうか(真偽値)" -#: sql_help.c:122 sql_help.c:606 sql_help.c:671 sql_help.c:1276 sql_help.c:1325 +#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322 +#: sql_help.c:1374 sql_help.c:4174 msgid "new_tablespace" msgstr "新しいテーブル空間名" -#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:544 sql_help.c:546 -#: sql_help.c:547 sql_help.c:863 sql_help.c:865 sql_help.c:866 sql_help.c:935 -#: sql_help.c:939 sql_help.c:942 sql_help.c:1003 sql_help.c:1005 -#: sql_help.c:1006 sql_help.c:1140 sql_help.c:1143 sql_help.c:1590 -#: sql_help.c:1594 sql_help.c:1597 sql_help.c:2308 sql_help.c:2508 -#: sql_help.c:3980 sql_help.c:4396 +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550 +#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958 +#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029 +#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643 +#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2385 sql_help.c:2588 +#: sql_help.c:3904 sql_help.c:4192 sql_help.c:4353 sql_help.c:4655 msgid "configuration_parameter" msgstr "設定パラメータ" -#: sql_help.c:125 sql_help.c:395 sql_help.c:466 sql_help.c:472 sql_help.c:484 -#: sql_help.c:545 sql_help.c:598 sql_help.c:677 sql_help.c:683 sql_help.c:864 -#: sql_help.c:887 sql_help.c:936 sql_help.c:1004 sql_help.c:1075 -#: sql_help.c:1117 sql_help.c:1120 sql_help.c:1125 sql_help.c:1141 -#: sql_help.c:1142 sql_help.c:1307 sql_help.c:1327 sql_help.c:1375 -#: sql_help.c:1397 sql_help.c:1454 sql_help.c:1538 sql_help.c:1591 -#: sql_help.c:1614 sql_help.c:2204 sql_help.c:2246 sql_help.c:2253 -#: sql_help.c:2262 sql_help.c:2309 sql_help.c:2310 sql_help.c:2372 -#: sql_help.c:2375 sql_help.c:2409 sql_help.c:2509 sql_help.c:2510 -#: sql_help.c:2527 sql_help.c:2648 sql_help.c:2678 sql_help.c:2783 -#: sql_help.c:2796 sql_help.c:2810 sql_help.c:2851 sql_help.c:2875 -#: sql_help.c:2892 sql_help.c:2919 sql_help.c:3122 sql_help.c:3789 -#: sql_help.c:4397 sql_help.c:4398 +#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487 +#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876 +#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101 +#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157 +#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182 +#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449 +#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667 +#: sql_help.c:2279 sql_help.c:2321 sql_help.c:2328 sql_help.c:2337 +#: sql_help.c:2386 sql_help.c:2387 sql_help.c:2451 sql_help.c:2454 +#: sql_help.c:2488 sql_help.c:2589 sql_help.c:2590 sql_help.c:2613 +#: sql_help.c:2740 sql_help.c:2779 sql_help.c:2889 sql_help.c:2902 +#: sql_help.c:2916 sql_help.c:2957 sql_help.c:2984 sql_help.c:3001 +#: sql_help.c:3028 sql_help.c:3235 sql_help.c:3937 sql_help.c:4656 +#: sql_help.c:4657 msgid "value" msgstr "値" -#: sql_help.c:197 +#: sql_help.c:200 msgid "target_role" msgstr "対象のロール" -#: sql_help.c:198 sql_help.c:2188 sql_help.c:2603 sql_help.c:2608 -#: sql_help.c:3735 sql_help.c:3742 sql_help.c:3756 sql_help.c:3762 -#: sql_help.c:4083 sql_help.c:4090 sql_help.c:4104 sql_help.c:4110 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2263 sql_help.c:2618 +#: sql_help.c:2695 sql_help.c:2700 sql_help.c:3867 sql_help.c:3876 +#: sql_help.c:3895 sql_help.c:3907 sql_help.c:4316 sql_help.c:4325 +#: sql_help.c:4344 sql_help.c:4356 msgid "schema_name" msgstr "スキーマ名" -#: sql_help.c:199 +#: sql_help.c:202 msgid "abbreviated_grant_or_revoke" msgstr "GRANT/REVOKEの省略形" -#: sql_help.c:200 +#: sql_help.c:203 msgid "where abbreviated_grant_or_revoke is one of:" msgstr "GRANT/REVOKEの省略形は以下のいずれかです:" -#: sql_help.c:201 sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205 -#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 -#: sql_help.c:569 sql_help.c:605 sql_help.c:670 sql_help.c:810 sql_help.c:946 -#: sql_help.c:1275 sql_help.c:1601 sql_help.c:2346 sql_help.c:2347 -#: sql_help.c:2348 sql_help.c:2349 sql_help.c:2350 sql_help.c:2483 -#: sql_help.c:2560 sql_help.c:2561 sql_help.c:2562 sql_help.c:2563 -#: sql_help.c:2564 sql_help.c:3104 sql_help.c:3105 sql_help.c:3106 -#: sql_help.c:3107 sql_help.c:3108 sql_help.c:3768 sql_help.c:3772 -#: sql_help.c:4116 sql_help.c:4120 sql_help.c:4417 +#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 +#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 +#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969 +#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2424 sql_help.c:2425 +#: sql_help.c:2426 sql_help.c:2427 sql_help.c:2428 sql_help.c:2562 +#: sql_help.c:2651 sql_help.c:2652 sql_help.c:2653 sql_help.c:2654 +#: sql_help.c:2655 sql_help.c:3217 sql_help.c:3218 sql_help.c:3219 +#: sql_help.c:3220 sql_help.c:3221 sql_help.c:3916 sql_help.c:3920 +#: sql_help.c:4365 sql_help.c:4369 sql_help.c:4676 msgid "role_name" msgstr "ロール名" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1291 sql_help.c:1293 -#: sql_help.c:1342 sql_help.c:1354 sql_help.c:1379 sql_help.c:1631 -#: sql_help.c:2158 sql_help.c:2162 sql_help.c:2265 sql_help.c:2270 -#: sql_help.c:2368 sql_help.c:2778 sql_help.c:2791 sql_help.c:2805 -#: sql_help.c:2814 sql_help.c:2826 sql_help.c:2855 sql_help.c:3820 -#: sql_help.c:3835 sql_help.c:3837 sql_help.c:4282 sql_help.c:4283 -#: sql_help.c:4292 sql_help.c:4333 sql_help.c:4334 sql_help.c:4335 -#: sql_help.c:4336 sql_help.c:4337 sql_help.c:4338 sql_help.c:4371 -#: sql_help.c:4372 sql_help.c:4377 sql_help.c:4382 sql_help.c:4521 -#: sql_help.c:4522 sql_help.c:4531 sql_help.c:4572 sql_help.c:4573 -#: sql_help.c:4574 sql_help.c:4575 sql_help.c:4576 sql_help.c:4577 -#: sql_help.c:4624 sql_help.c:4626 sql_help.c:4685 sql_help.c:4741 -#: sql_help.c:4742 sql_help.c:4751 sql_help.c:4792 sql_help.c:4793 -#: sql_help.c:4794 sql_help.c:4795 sql_help.c:4796 sql_help.c:4797 +#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339 +#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684 +#: sql_help.c:2232 sql_help.c:2236 sql_help.c:2340 sql_help.c:2345 +#: sql_help.c:2447 sql_help.c:2617 sql_help.c:2756 sql_help.c:2761 +#: sql_help.c:2763 sql_help.c:2884 sql_help.c:2897 sql_help.c:2911 +#: sql_help.c:2920 sql_help.c:2932 sql_help.c:2961 sql_help.c:3968 +#: sql_help.c:3983 sql_help.c:3985 sql_help.c:4072 sql_help.c:4075 +#: sql_help.c:4077 sql_help.c:4533 sql_help.c:4534 sql_help.c:4543 +#: sql_help.c:4585 sql_help.c:4586 sql_help.c:4587 sql_help.c:4588 +#: sql_help.c:4589 sql_help.c:4590 sql_help.c:4630 sql_help.c:4631 +#: sql_help.c:4636 sql_help.c:4641 sql_help.c:4782 sql_help.c:4783 +#: sql_help.c:4792 sql_help.c:4834 sql_help.c:4835 sql_help.c:4836 +#: sql_help.c:4837 sql_help.c:4838 sql_help.c:4839 sql_help.c:4893 +#: sql_help.c:4895 sql_help.c:4955 sql_help.c:5013 sql_help.c:5014 +#: sql_help.c:5023 sql_help.c:5065 sql_help.c:5066 sql_help.c:5067 +#: sql_help.c:5068 sql_help.c:5069 sql_help.c:5070 msgid "expression" msgstr "評価式" -#: sql_help.c:239 +#: sql_help.c:242 msgid "domain_constraint" msgstr "ドメイン制約" -#: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475 -#: sql_help.c:1268 sql_help.c:1313 sql_help.c:1314 sql_help.c:1315 -#: sql_help.c:1341 sql_help.c:1353 sql_help.c:1370 sql_help.c:1789 -#: sql_help.c:1791 sql_help.c:2161 sql_help.c:2264 sql_help.c:2269 -#: sql_help.c:2813 sql_help.c:2825 sql_help.c:3832 +#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 +#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363 +#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852 +#: sql_help.c:1854 sql_help.c:2235 sql_help.c:2339 sql_help.c:2344 +#: sql_help.c:2919 sql_help.c:2931 sql_help.c:3980 msgid "constraint_name" msgstr "制約名" -#: sql_help.c:244 sql_help.c:1269 +#: sql_help.c:247 sql_help.c:1315 msgid "new_constraint_name" msgstr "新しい制約名" -#: sql_help.c:317 sql_help.c:1073 +#: sql_help.c:320 sql_help.c:1099 msgid "new_version" msgstr "新しいバージョン" -#: sql_help.c:321 sql_help.c:323 +#: sql_help.c:324 sql_help.c:326 msgid "member_object" msgstr "メンバーオブジェクト" -#: sql_help.c:324 +#: sql_help.c:327 msgid "where member_object is:" msgstr "メンバーオブジェクトは以下の通りです:" -#: sql_help.c:325 sql_help.c:330 sql_help.c:331 sql_help.c:332 sql_help.c:333 -#: sql_help.c:334 sql_help.c:335 sql_help.c:340 sql_help.c:344 sql_help.c:346 -#: sql_help.c:348 sql_help.c:357 sql_help.c:358 sql_help.c:359 sql_help.c:360 -#: sql_help.c:361 sql_help.c:362 sql_help.c:363 sql_help.c:364 sql_help.c:367 -#: sql_help.c:368 sql_help.c:1781 sql_help.c:1786 sql_help.c:1793 -#: sql_help.c:1794 sql_help.c:1795 sql_help.c:1796 sql_help.c:1797 -#: sql_help.c:1798 sql_help.c:1799 sql_help.c:1804 sql_help.c:1806 -#: sql_help.c:1810 sql_help.c:1812 sql_help.c:1816 sql_help.c:1821 -#: sql_help.c:1822 sql_help.c:1829 sql_help.c:1830 sql_help.c:1831 -#: sql_help.c:1832 sql_help.c:1833 sql_help.c:1834 sql_help.c:1835 -#: sql_help.c:1836 sql_help.c:1837 sql_help.c:1838 sql_help.c:1839 -#: sql_help.c:1844 sql_help.c:1845 sql_help.c:4189 sql_help.c:4194 -#: sql_help.c:4195 sql_help.c:4196 sql_help.c:4197 sql_help.c:4203 -#: sql_help.c:4204 sql_help.c:4209 sql_help.c:4210 sql_help.c:4215 -#: sql_help.c:4216 sql_help.c:4217 sql_help.c:4218 sql_help.c:4219 -#: sql_help.c:4220 +#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336 +#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349 +#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363 +#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370 +#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856 +#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 +#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869 +#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884 +#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894 +#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898 +#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902 +#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4438 sql_help.c:4443 +#: sql_help.c:4444 sql_help.c:4445 sql_help.c:4446 sql_help.c:4452 +#: sql_help.c:4453 sql_help.c:4458 sql_help.c:4459 sql_help.c:4464 +#: sql_help.c:4465 sql_help.c:4466 sql_help.c:4467 sql_help.c:4468 +#: sql_help.c:4469 msgid "object_name" msgstr "オブジェクト名" -#: sql_help.c:326 sql_help.c:1782 sql_help.c:4192 +#: sql_help.c:329 sql_help.c:1845 sql_help.c:4441 msgid "aggregate_name" msgstr "集約関数名" -#: sql_help.c:328 sql_help.c:1784 sql_help.c:2068 sql_help.c:2072 -#: sql_help.c:2074 sql_help.c:3231 +#: sql_help.c:331 sql_help.c:1847 sql_help.c:2132 sql_help.c:2136 +#: sql_help.c:2138 sql_help.c:3344 msgid "source_type" msgstr "変換前の型" -#: sql_help.c:329 sql_help.c:1785 sql_help.c:2069 sql_help.c:2073 -#: sql_help.c:2075 sql_help.c:3232 +#: sql_help.c:332 sql_help.c:1848 sql_help.c:2133 sql_help.c:2137 +#: sql_help.c:2139 sql_help.c:3345 msgid "target_type" msgstr "変換後の型" -#: sql_help.c:336 sql_help.c:774 sql_help.c:1800 sql_help.c:2070 -#: sql_help.c:2111 sql_help.c:2176 sql_help.c:2426 sql_help.c:2457 -#: sql_help.c:2995 sql_help.c:4100 sql_help.c:4198 sql_help.c:4311 -#: sql_help.c:4315 sql_help.c:4319 sql_help.c:4322 sql_help.c:4550 -#: sql_help.c:4554 sql_help.c:4558 sql_help.c:4561 sql_help.c:4770 -#: sql_help.c:4774 sql_help.c:4778 sql_help.c:4781 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2134 +#: sql_help.c:2175 sql_help.c:2251 sql_help.c:2505 sql_help.c:2536 +#: sql_help.c:3104 sql_help.c:4340 sql_help.c:4447 sql_help.c:4562 +#: sql_help.c:4566 sql_help.c:4570 sql_help.c:4573 sql_help.c:4811 +#: sql_help.c:4815 sql_help.c:4819 sql_help.c:4822 sql_help.c:5042 +#: sql_help.c:5046 sql_help.c:5050 sql_help.c:5053 msgid "function_name" msgstr "関数名" -#: sql_help.c:341 sql_help.c:767 sql_help.c:1807 sql_help.c:2450 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2529 msgid "operator_name" msgstr "演算子名" -#: sql_help.c:342 sql_help.c:703 sql_help.c:707 sql_help.c:711 sql_help.c:1808 -#: sql_help.c:2427 sql_help.c:3355 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 +#: sql_help.c:2506 sql_help.c:3468 msgid "left_type" msgstr "左辺の型" -#: sql_help.c:343 sql_help.c:704 sql_help.c:708 sql_help.c:712 sql_help.c:1809 -#: sql_help.c:2428 sql_help.c:3356 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 +#: sql_help.c:2507 sql_help.c:3469 msgid "right_type" msgstr "右辺の型" -#: sql_help.c:345 sql_help.c:347 sql_help.c:730 sql_help.c:733 sql_help.c:736 -#: sql_help.c:765 sql_help.c:777 sql_help.c:785 sql_help.c:788 sql_help.c:791 -#: sql_help.c:1359 sql_help.c:1811 sql_help.c:1813 sql_help.c:2447 -#: sql_help.c:2468 sql_help.c:2831 sql_help.c:3365 sql_help.c:3374 +#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748 +#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 +#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2526 +#: sql_help.c:2547 sql_help.c:2937 sql_help.c:3478 sql_help.c:3487 msgid "index_method" msgstr "インデックスメソッド" -#: sql_help.c:349 sql_help.c:1817 sql_help.c:4205 +#: sql_help.c:352 sql_help.c:1880 sql_help.c:4454 msgid "procedure_name" msgstr "プロシージャ名" -#: sql_help.c:353 sql_help.c:1823 sql_help.c:3752 sql_help.c:4211 +#: sql_help.c:356 sql_help.c:1886 sql_help.c:3891 sql_help.c:4460 msgid "routine_name" msgstr "ルーチン名" -#: sql_help.c:365 sql_help.c:1331 sql_help.c:1840 sql_help.c:2304 -#: sql_help.c:2507 sql_help.c:2786 sql_help.c:2962 sql_help.c:3536 -#: sql_help.c:3766 sql_help.c:4114 +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2381 +#: sql_help.c:2587 sql_help.c:2892 sql_help.c:3071 sql_help.c:3649 +#: sql_help.c:3913 sql_help.c:4362 msgid "type_name" msgstr "型名" -#: sql_help.c:366 sql_help.c:1841 sql_help.c:2303 sql_help.c:2506 -#: sql_help.c:2963 sql_help.c:3189 sql_help.c:3537 sql_help.c:3758 -#: sql_help.c:4106 +#: sql_help.c:369 sql_help.c:1904 sql_help.c:2380 sql_help.c:2586 +#: sql_help.c:3072 sql_help.c:3302 sql_help.c:3650 sql_help.c:3898 +#: sql_help.c:4347 msgid "lang_name" msgstr "言語名" -#: sql_help.c:369 +#: sql_help.c:372 msgid "and aggregate_signature is:" msgstr "集約関数のシグニチャーは以下の通りです:" -#: sql_help.c:392 sql_help.c:1935 sql_help.c:2201 +#: sql_help.c:395 sql_help.c:1999 sql_help.c:2276 msgid "handler_function" msgstr "ハンドラー関数" -#: sql_help.c:393 sql_help.c:2202 +#: sql_help.c:396 sql_help.c:2277 msgid "validator_function" msgstr "バリデーター関数" -#: sql_help.c:441 sql_help.c:519 sql_help.c:659 sql_help.c:841 sql_help.c:979 -#: sql_help.c:1263 sql_help.c:1529 +#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003 +#: sql_help.c:1309 sql_help.c:1581 msgid "action" msgstr "アクション" -#: sql_help.c:443 sql_help.c:450 sql_help.c:454 sql_help.c:455 sql_help.c:458 -#: sql_help.c:460 sql_help.c:461 sql_help.c:462 sql_help.c:464 sql_help.c:467 -#: sql_help.c:469 sql_help.c:470 sql_help.c:663 sql_help.c:673 sql_help.c:675 -#: sql_help.c:678 sql_help.c:680 sql_help.c:1055 sql_help.c:1265 -#: sql_help.c:1283 sql_help.c:1287 sql_help.c:1288 sql_help.c:1292 -#: sql_help.c:1294 sql_help.c:1295 sql_help.c:1296 sql_help.c:1297 -#: sql_help.c:1299 sql_help.c:1302 sql_help.c:1303 sql_help.c:1305 -#: sql_help.c:1308 sql_help.c:1310 sql_help.c:1355 sql_help.c:1357 -#: sql_help.c:1364 sql_help.c:1373 sql_help.c:1378 sql_help.c:1630 -#: sql_help.c:1633 sql_help.c:1637 sql_help.c:1673 sql_help.c:1788 -#: sql_help.c:1901 sql_help.c:1907 sql_help.c:1920 sql_help.c:1921 -#: sql_help.c:1922 sql_help.c:2243 sql_help.c:2256 sql_help.c:2301 -#: sql_help.c:2367 sql_help.c:2373 sql_help.c:2406 sql_help.c:2633 -#: sql_help.c:2661 sql_help.c:2662 sql_help.c:2769 sql_help.c:2777 -#: sql_help.c:2787 sql_help.c:2790 sql_help.c:2800 sql_help.c:2804 -#: sql_help.c:2827 sql_help.c:2829 sql_help.c:2836 sql_help.c:2849 -#: sql_help.c:2854 sql_help.c:2872 sql_help.c:2998 sql_help.c:3134 -#: sql_help.c:3737 sql_help.c:3738 sql_help.c:3819 sql_help.c:3834 -#: sql_help.c:3836 sql_help.c:3838 sql_help.c:4085 sql_help.c:4086 -#: sql_help.c:4191 sql_help.c:4342 sql_help.c:4581 sql_help.c:4623 -#: sql_help.c:4625 sql_help.c:4627 sql_help.c:4673 sql_help.c:4801 +#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461 +#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470 +#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683 +#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080 +#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334 +#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 +#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349 +#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 +#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422 +#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683 +#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851 +#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1984 sql_help.c:1985 +#: sql_help.c:1986 sql_help.c:2318 sql_help.c:2331 sql_help.c:2378 +#: sql_help.c:2446 sql_help.c:2452 sql_help.c:2485 sql_help.c:2616 +#: sql_help.c:2725 sql_help.c:2760 sql_help.c:2762 sql_help.c:2874 +#: sql_help.c:2883 sql_help.c:2893 sql_help.c:2896 sql_help.c:2906 +#: sql_help.c:2910 sql_help.c:2933 sql_help.c:2935 sql_help.c:2942 +#: sql_help.c:2955 sql_help.c:2960 sql_help.c:2964 sql_help.c:2965 +#: sql_help.c:2981 sql_help.c:3107 sql_help.c:3247 sql_help.c:3870 +#: sql_help.c:3871 sql_help.c:3967 sql_help.c:3982 sql_help.c:3984 +#: sql_help.c:3986 sql_help.c:4071 sql_help.c:4074 sql_help.c:4076 +#: sql_help.c:4319 sql_help.c:4320 sql_help.c:4440 sql_help.c:4594 +#: sql_help.c:4600 sql_help.c:4602 sql_help.c:4843 sql_help.c:4849 +#: sql_help.c:4851 sql_help.c:4892 sql_help.c:4894 sql_help.c:4896 +#: sql_help.c:4943 sql_help.c:5074 sql_help.c:5080 sql_help.c:5082 msgid "column_name" msgstr "列名" -#: sql_help.c:444 sql_help.c:664 sql_help.c:1266 sql_help.c:1638 +#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 msgid "new_column_name" msgstr "新しい列名" -#: sql_help.c:449 sql_help.c:540 sql_help.c:672 sql_help.c:862 sql_help.c:1000 -#: sql_help.c:1282 sql_help.c:1539 +#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024 +#: sql_help.c:1328 sql_help.c:1591 msgid "where action is one of:" msgstr "アクションは以下のいずれかです:" -#: sql_help.c:451 sql_help.c:456 sql_help.c:1047 sql_help.c:1284 -#: sql_help.c:1289 sql_help.c:1541 sql_help.c:1545 sql_help.c:2156 -#: sql_help.c:2244 sql_help.c:2446 sql_help.c:2626 sql_help.c:2770 -#: sql_help.c:3043 sql_help.c:3921 +#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330 +#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2230 +#: sql_help.c:2319 sql_help.c:2525 sql_help.c:2718 sql_help.c:2875 +#: sql_help.c:3154 sql_help.c:4128 msgid "data_type" msgstr "データ型" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1285 sql_help.c:1290 -#: sql_help.c:1542 sql_help.c:1546 sql_help.c:2157 sql_help.c:2247 -#: sql_help.c:2369 sql_help.c:2771 sql_help.c:2779 sql_help.c:2792 -#: sql_help.c:2806 sql_help.c:3044 sql_help.c:3050 sql_help.c:3829 +#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336 +#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2231 sql_help.c:2322 +#: sql_help.c:2448 sql_help.c:2877 sql_help.c:2885 sql_help.c:2898 +#: sql_help.c:2912 sql_help.c:3155 sql_help.c:3161 sql_help.c:3977 msgid "collation" msgstr "照合順序" -#: sql_help.c:453 sql_help.c:1286 sql_help.c:2248 sql_help.c:2257 -#: sql_help.c:2772 sql_help.c:2788 sql_help.c:2801 +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2323 sql_help.c:2332 +#: sql_help.c:2878 sql_help.c:2894 sql_help.c:2907 msgid "column_constraint" msgstr "カラム制約" -#: sql_help.c:463 sql_help.c:603 sql_help.c:674 sql_help.c:1304 sql_help.c:4670 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4940 msgid "integer" msgstr "整数" -#: sql_help.c:465 sql_help.c:468 sql_help.c:676 sql_help.c:679 sql_help.c:1306 -#: sql_help.c:1309 +#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352 +#: sql_help.c:1355 msgid "attribute_option" msgstr "属性オプション" -#: sql_help.c:473 sql_help.c:1311 sql_help.c:2249 sql_help.c:2258 -#: sql_help.c:2773 sql_help.c:2789 sql_help.c:2802 +#: sql_help.c:476 sql_help.c:1359 sql_help.c:2324 sql_help.c:2333 +#: sql_help.c:2879 sql_help.c:2895 sql_help.c:2908 msgid "table_constraint" msgstr "テーブル制約" -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1316 -#: sql_help.c:1317 sql_help.c:1318 sql_help.c:1319 sql_help.c:1842 +#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364 +#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905 msgid "trigger_name" msgstr "トリガー名" -#: sql_help.c:480 sql_help.c:481 sql_help.c:1329 sql_help.c:1330 -#: sql_help.c:2250 sql_help.c:2255 sql_help.c:2776 sql_help.c:2799 +#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 +#: sql_help.c:2325 sql_help.c:2330 sql_help.c:2882 sql_help.c:2905 msgid "parent_table" msgstr "親テーブル" -#: sql_help.c:539 sql_help.c:595 sql_help.c:661 sql_help.c:861 sql_help.c:999 -#: sql_help.c:1498 sql_help.c:2187 +#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 +#: sql_help.c:1550 sql_help.c:2262 msgid "extension_name" msgstr "拡張名" -#: sql_help.c:541 sql_help.c:1001 sql_help.c:2305 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2382 msgid "execution_cost" msgstr "実行コスト" -#: sql_help.c:542 sql_help.c:1002 sql_help.c:2306 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2383 msgid "result_rows" msgstr "結果の行数" -#: sql_help.c:543 sql_help.c:2307 +#: sql_help.c:547 sql_help.c:2384 msgid "support_function" msgstr "サポート関数" -#: sql_help.c:564 sql_help.c:566 sql_help.c:925 sql_help.c:933 sql_help.c:937 -#: sql_help.c:940 sql_help.c:943 sql_help.c:1580 sql_help.c:1588 -#: sql_help.c:1592 sql_help.c:1595 sql_help.c:1598 sql_help.c:2604 -#: sql_help.c:2606 sql_help.c:2609 sql_help.c:2610 sql_help.c:3736 -#: sql_help.c:3740 sql_help.c:3743 sql_help.c:3745 sql_help.c:3747 -#: sql_help.c:3749 sql_help.c:3751 sql_help.c:3757 sql_help.c:3759 -#: sql_help.c:3761 sql_help.c:3763 sql_help.c:3765 sql_help.c:3767 -#: sql_help.c:3769 sql_help.c:3770 sql_help.c:4084 sql_help.c:4088 -#: sql_help.c:4091 sql_help.c:4093 sql_help.c:4095 sql_help.c:4097 -#: sql_help.c:4099 sql_help.c:4105 sql_help.c:4107 sql_help.c:4109 -#: sql_help.c:4111 sql_help.c:4113 sql_help.c:4115 sql_help.c:4117 -#: sql_help.c:4118 +#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960 +#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641 +#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2696 +#: sql_help.c:2698 sql_help.c:2701 sql_help.c:2702 sql_help.c:3868 +#: sql_help.c:3869 sql_help.c:3873 sql_help.c:3874 sql_help.c:3877 +#: sql_help.c:3878 sql_help.c:3880 sql_help.c:3881 sql_help.c:3883 +#: sql_help.c:3884 sql_help.c:3886 sql_help.c:3887 sql_help.c:3889 +#: sql_help.c:3890 sql_help.c:3896 sql_help.c:3897 sql_help.c:3899 +#: sql_help.c:3900 sql_help.c:3902 sql_help.c:3903 sql_help.c:3905 +#: sql_help.c:3906 sql_help.c:3908 sql_help.c:3909 sql_help.c:3911 +#: sql_help.c:3912 sql_help.c:3914 sql_help.c:3915 sql_help.c:3917 +#: sql_help.c:3918 sql_help.c:4317 sql_help.c:4318 sql_help.c:4322 +#: sql_help.c:4323 sql_help.c:4326 sql_help.c:4327 sql_help.c:4329 +#: sql_help.c:4330 sql_help.c:4332 sql_help.c:4333 sql_help.c:4335 +#: sql_help.c:4336 sql_help.c:4338 sql_help.c:4339 sql_help.c:4345 +#: sql_help.c:4346 sql_help.c:4348 sql_help.c:4349 sql_help.c:4351 +#: sql_help.c:4352 sql_help.c:4354 sql_help.c:4355 sql_help.c:4357 +#: sql_help.c:4358 sql_help.c:4360 sql_help.c:4361 sql_help.c:4363 +#: sql_help.c:4364 sql_help.c:4366 sql_help.c:4367 msgid "role_specification" msgstr "ロールの指定" -#: sql_help.c:565 sql_help.c:567 sql_help.c:1611 sql_help.c:2130 -#: sql_help.c:2612 sql_help.c:3119 sql_help.c:3570 sql_help.c:4427 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2199 +#: sql_help.c:2704 sql_help.c:3232 sql_help.c:3683 sql_help.c:4686 msgid "user_name" msgstr "ユーザ名" -#: sql_help.c:568 sql_help.c:945 sql_help.c:1600 sql_help.c:2611 -#: sql_help.c:3771 sql_help.c:4119 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2703 +#: sql_help.c:3919 sql_help.c:4368 msgid "where role_specification can be:" msgstr "ロール指定は以下の通りです:" -#: sql_help.c:570 +#: sql_help.c:575 msgid "group_name" msgstr "グループ名" -#: sql_help.c:591 sql_help.c:1376 sql_help.c:2136 sql_help.c:2376 -#: sql_help.c:2410 sql_help.c:2784 sql_help.c:2797 sql_help.c:2811 -#: sql_help.c:2852 sql_help.c:2876 sql_help.c:2888 sql_help.c:3764 -#: sql_help.c:4112 +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2209 sql_help.c:2455 +#: sql_help.c:2489 sql_help.c:2890 sql_help.c:2903 sql_help.c:2917 +#: sql_help.c:2958 sql_help.c:2985 sql_help.c:2997 sql_help.c:3910 +#: sql_help.c:4359 msgid "tablespace_name" msgstr "テーブル空間名" -#: sql_help.c:593 sql_help.c:681 sql_help.c:1324 sql_help.c:1333 -#: sql_help.c:1371 sql_help.c:1722 +#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382 +#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783 msgid "index_name" msgstr "インデックス名" -#: sql_help.c:597 sql_help.c:600 sql_help.c:682 sql_help.c:684 sql_help.c:1326 -#: sql_help.c:1328 sql_help.c:1374 sql_help.c:2374 sql_help.c:2408 -#: sql_help.c:2782 sql_help.c:2795 sql_help.c:2809 sql_help.c:2850 -#: sql_help.c:2874 +#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375 +#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2453 sql_help.c:2487 +#: sql_help.c:2888 sql_help.c:2901 sql_help.c:2915 sql_help.c:2956 +#: sql_help.c:2983 msgid "storage_parameter" msgstr "ストレージパラメータ" -#: sql_help.c:602 +#: sql_help.c:607 msgid "column_number" msgstr "列番号" -#: sql_help.c:626 sql_help.c:1805 sql_help.c:4202 +#: sql_help.c:631 sql_help.c:1868 sql_help.c:4451 msgid "large_object_oid" msgstr "ラージオブジェクトのOID" -#: sql_help.c:713 sql_help.c:2431 +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2876 +msgid "compression_method" +msgstr "圧縮方式" + +#: sql_help.c:692 sql_help.c:1373 +msgid "new_access_method" +msgstr "新しいアクセスメソッド" + +#: sql_help.c:725 sql_help.c:2510 msgid "res_proc" msgstr "制約選択評価関数" -#: sql_help.c:714 sql_help.c:2432 +#: sql_help.c:726 sql_help.c:2511 msgid "join_proc" msgstr "結合選択評価関数" -#: sql_help.c:766 sql_help.c:778 sql_help.c:2449 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2528 msgid "strategy_number" msgstr "戦略番号" -#: sql_help.c:768 sql_help.c:769 sql_help.c:772 sql_help.c:773 sql_help.c:779 -#: sql_help.c:780 sql_help.c:782 sql_help.c:783 sql_help.c:2451 sql_help.c:2452 -#: sql_help.c:2455 sql_help.c:2456 +#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791 +#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2530 sql_help.c:2531 +#: sql_help.c:2534 sql_help.c:2535 msgid "op_type" msgstr "演算子の型" -#: sql_help.c:770 sql_help.c:2453 +#: sql_help.c:782 sql_help.c:2532 msgid "sort_family_name" msgstr "ソートファミリー名" -#: sql_help.c:771 sql_help.c:781 sql_help.c:2454 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2533 msgid "support_number" msgstr "サポート番号" -#: sql_help.c:775 sql_help.c:2071 sql_help.c:2458 sql_help.c:2965 -#: sql_help.c:2967 +#: sql_help.c:787 sql_help.c:2135 sql_help.c:2537 sql_help.c:3074 +#: sql_help.c:3076 msgid "argument_type" msgstr "引数の型" -#: sql_help.c:806 sql_help.c:809 sql_help.c:880 sql_help.c:882 sql_help.c:884 -#: sql_help.c:1015 sql_help.c:1054 sql_help.c:1494 sql_help.c:1497 -#: sql_help.c:1672 sql_help.c:1721 sql_help.c:1790 sql_help.c:1815 -#: sql_help.c:1828 sql_help.c:1843 sql_help.c:1900 sql_help.c:1906 -#: sql_help.c:2242 sql_help.c:2254 sql_help.c:2365 sql_help.c:2405 -#: sql_help.c:2482 sql_help.c:2525 sql_help.c:2581 sql_help.c:2632 -#: sql_help.c:2663 sql_help.c:2768 sql_help.c:2785 sql_help.c:2798 -#: sql_help.c:2871 sql_help.c:2991 sql_help.c:3168 sql_help.c:3391 -#: sql_help.c:3440 sql_help.c:3546 sql_help.c:3734 sql_help.c:3739 -#: sql_help.c:3785 sql_help.c:3817 sql_help.c:4082 sql_help.c:4087 -#: sql_help.c:4190 sql_help.c:4297 sql_help.c:4299 sql_help.c:4348 -#: sql_help.c:4387 sql_help.c:4536 sql_help.c:4538 sql_help.c:4587 -#: sql_help.c:4621 sql_help.c:4672 sql_help.c:4756 sql_help.c:4758 -#: sql_help.c:4807 +#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079 +#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779 +#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891 +#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2317 +#: sql_help.c:2329 sql_help.c:2444 sql_help.c:2484 sql_help.c:2561 +#: sql_help.c:2615 sql_help.c:2672 sql_help.c:2724 sql_help.c:2757 +#: sql_help.c:2764 sql_help.c:2873 sql_help.c:2891 sql_help.c:2904 +#: sql_help.c:2980 sql_help.c:3100 sql_help.c:3281 sql_help.c:3504 +#: sql_help.c:3553 sql_help.c:3659 sql_help.c:3866 sql_help.c:3872 +#: sql_help.c:3933 sql_help.c:3965 sql_help.c:4315 sql_help.c:4321 +#: sql_help.c:4439 sql_help.c:4548 sql_help.c:4550 sql_help.c:4607 +#: sql_help.c:4646 sql_help.c:4797 sql_help.c:4799 sql_help.c:4856 +#: sql_help.c:4890 sql_help.c:4942 sql_help.c:5028 sql_help.c:5030 +#: sql_help.c:5087 msgid "table_name" msgstr "テーブル名" -#: sql_help.c:811 sql_help.c:2484 +#: sql_help.c:823 sql_help.c:2563 msgid "using_expression" -msgstr "USING表現" +msgstr "USING式" -#: sql_help.c:812 sql_help.c:2485 +#: sql_help.c:824 sql_help.c:2564 msgid "check_expression" -msgstr "CHECK表現" +msgstr "CHECK式" -#: sql_help.c:886 sql_help.c:2526 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2611 +msgid "publication_object" +msgstr "発行オブジェクト" + +#: sql_help.c:903 sql_help.c:2612 msgid "publication_parameter" msgstr "パブリケーションパラメータ" -#: sql_help.c:929 sql_help.c:1584 sql_help.c:2344 sql_help.c:2558 -#: sql_help.c:3102 +#: sql_help.c:909 sql_help.c:2614 +msgid "where publication_object is one of:" +msgstr "発行オブジェクトは以下のいずれかです:" + +#: sql_help.c:952 sql_help.c:1637 sql_help.c:2422 sql_help.c:2649 +#: sql_help.c:3215 msgid "password" msgstr "パスワード" -#: sql_help.c:930 sql_help.c:1585 sql_help.c:2345 sql_help.c:2559 -#: sql_help.c:3103 +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2423 sql_help.c:2650 +#: sql_help.c:3216 msgid "timestamp" msgstr "タイムスタンプ" -#: sql_help.c:934 sql_help.c:938 sql_help.c:941 sql_help.c:944 sql_help.c:1589 -#: sql_help.c:1593 sql_help.c:1596 sql_help.c:1599 sql_help.c:3744 -#: sql_help.c:4092 +#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642 +#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3879 +#: sql_help.c:4328 msgid "database_name" msgstr "データベース名" -#: sql_help.c:1048 sql_help.c:2627 +#: sql_help.c:1073 sql_help.c:2719 msgid "increment" msgstr "増分値" -#: sql_help.c:1049 sql_help.c:2628 +#: sql_help.c:1074 sql_help.c:2720 msgid "minvalue" msgstr "最小値" -#: sql_help.c:1050 sql_help.c:2629 +#: sql_help.c:1075 sql_help.c:2721 msgid "maxvalue" msgstr "最大値" -#: sql_help.c:1051 sql_help.c:2630 sql_help.c:4295 sql_help.c:4385 -#: sql_help.c:4534 sql_help.c:4689 sql_help.c:4754 +#: sql_help.c:1076 sql_help.c:2722 sql_help.c:4546 sql_help.c:4644 +#: sql_help.c:4795 sql_help.c:4959 sql_help.c:5026 msgid "start" msgstr "開始番号" -#: sql_help.c:1052 sql_help.c:1301 +#: sql_help.c:1077 sql_help.c:1347 msgid "restart" msgstr "再開始番号" -#: sql_help.c:1053 sql_help.c:2631 +#: sql_help.c:1078 sql_help.c:2723 msgid "cache" msgstr "キャッシュ割り当て数" -#: sql_help.c:1097 +#: sql_help.c:1123 msgid "new_target" msgstr "新しいターゲット" -#: sql_help.c:1113 sql_help.c:2675 +#: sql_help.c:1142 sql_help.c:2776 msgid "conninfo" msgstr "接続文字列" -#: sql_help.c:1115 sql_help.c:2676 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2777 msgid "publication_name" msgstr "パブリケーション名" -#: sql_help.c:1116 -msgid "set_publication_option" -msgstr "{SET PUBLICATION の追加オプション}" +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +msgid "publication_option" +msgstr "パブリケーション・オプション" -#: sql_help.c:1119 +#: sql_help.c:1156 msgid "refresh_option" msgstr "{REFRESH PUBLICATION の追加オプション}" -#: sql_help.c:1124 sql_help.c:2677 +#: sql_help.c:1161 sql_help.c:2778 msgid "subscription_parameter" msgstr "{SUBSCRIPTION パラメータ名}" -#: sql_help.c:1278 sql_help.c:1281 +#: sql_help.c:1164 +msgid "skip_option" +msgstr "スキップオプション" + +#: sql_help.c:1324 sql_help.c:1327 msgid "partition_name" msgstr "パーティション名" -#: sql_help.c:1279 sql_help.c:2259 sql_help.c:2803 +#: sql_help.c:1325 sql_help.c:2334 sql_help.c:2909 msgid "partition_bound_spec" msgstr "パーティション境界の仕様" -#: sql_help.c:1298 sql_help.c:1345 sql_help.c:2817 +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2923 msgid "sequence_options" msgstr "シーケンスオプション" -#: sql_help.c:1300 +#: sql_help.c:1346 msgid "sequence_option" msgstr "シーケンスオプション" -#: sql_help.c:1312 +#: sql_help.c:1360 msgid "table_constraint_using_index" msgstr "インデックスを使うテーブルの制約" -#: sql_help.c:1320 sql_help.c:1321 sql_help.c:1322 sql_help.c:1323 +#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 msgid "rewrite_rule_name" msgstr "書き換えルール名" -#: sql_help.c:1334 sql_help.c:2842 +#: sql_help.c:1383 sql_help.c:2948 msgid "and partition_bound_spec is:" msgstr "パーティション境界の仕様は以下の通りです:" -#: sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 sql_help.c:2843 -#: sql_help.c:2844 sql_help.c:2845 +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2949 +#: sql_help.c:2950 sql_help.c:2951 msgid "partition_bound_expr" msgstr "パーティション境界式" -#: sql_help.c:1338 sql_help.c:1339 sql_help.c:2846 sql_help.c:2847 +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2952 sql_help.c:2953 msgid "numeric_literal" msgstr "数値定数" -#: sql_help.c:1340 +#: sql_help.c:1389 msgid "and column_constraint is:" msgstr "そしてカラム制約は以下の通りです:" -#: sql_help.c:1343 sql_help.c:2266 sql_help.c:2299 sql_help.c:2505 -#: sql_help.c:2815 +#: sql_help.c:1392 sql_help.c:2341 sql_help.c:2376 sql_help.c:2585 +#: sql_help.c:2921 msgid "default_expr" msgstr "デフォルト表現" -#: sql_help.c:1344 sql_help.c:2267 sql_help.c:2816 +#: sql_help.c:1393 sql_help.c:2342 sql_help.c:2922 msgid "generation_expr" msgstr "生成式" -#: sql_help.c:1346 sql_help.c:1347 sql_help.c:1356 sql_help.c:1358 -#: sql_help.c:1362 sql_help.c:2818 sql_help.c:2819 sql_help.c:2828 -#: sql_help.c:2830 sql_help.c:2834 +#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 +#: sql_help.c:1411 sql_help.c:2924 sql_help.c:2925 sql_help.c:2934 +#: sql_help.c:2936 sql_help.c:2940 msgid "index_parameters" msgstr "インデックスパラメータ" -#: sql_help.c:1348 sql_help.c:1365 sql_help.c:2820 sql_help.c:2837 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2926 sql_help.c:2943 msgid "reftable" msgstr "参照テーブル" -#: sql_help.c:1349 sql_help.c:1366 sql_help.c:2821 sql_help.c:2838 +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2927 sql_help.c:2944 msgid "refcolumn" msgstr "参照列" -#: sql_help.c:1350 sql_help.c:1351 sql_help.c:1367 sql_help.c:1368 -#: sql_help.c:2822 sql_help.c:2823 sql_help.c:2839 sql_help.c:2840 +#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 +#: sql_help.c:2928 sql_help.c:2929 sql_help.c:2945 sql_help.c:2946 msgid "referential_action" msgstr "参照動作" -#: sql_help.c:1352 sql_help.c:2268 sql_help.c:2824 +#: sql_help.c:1401 sql_help.c:2343 sql_help.c:2930 msgid "and table_constraint is:" msgstr "テーブル制約は以下の通りです:" -#: sql_help.c:1360 sql_help.c:2832 +#: sql_help.c:1409 sql_help.c:2938 msgid "exclude_element" msgstr "除外対象要素" -#: sql_help.c:1361 sql_help.c:2833 sql_help.c:4293 sql_help.c:4383 -#: sql_help.c:4532 sql_help.c:4687 sql_help.c:4752 +#: sql_help.c:1410 sql_help.c:2939 sql_help.c:4544 sql_help.c:4642 +#: sql_help.c:4793 sql_help.c:4957 sql_help.c:5024 msgid "operator" msgstr "演算子" -#: sql_help.c:1363 sql_help.c:2377 sql_help.c:2835 +#: sql_help.c:1412 sql_help.c:2456 sql_help.c:2941 msgid "predicate" msgstr "インデックスの述語" -#: sql_help.c:1369 +#: sql_help.c:1418 msgid "and table_constraint_using_index is:" msgstr "テーブル制約は以下の通りです:" -#: sql_help.c:1372 sql_help.c:2848 +#: sql_help.c:1421 sql_help.c:2954 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "UNIQUE, PRIMARY KEY, EXCLUDE 制約のインデックスパラメータは以下の通りです:" -#: sql_help.c:1377 sql_help.c:2853 +#: sql_help.c:1426 sql_help.c:2959 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "EXCLUDE 制約の除外対象要素は以下の通りです:" -#: sql_help.c:1380 sql_help.c:2370 sql_help.c:2780 sql_help.c:2793 -#: sql_help.c:2807 sql_help.c:2856 sql_help.c:3830 +#: sql_help.c:1429 sql_help.c:2449 sql_help.c:2886 sql_help.c:2899 +#: sql_help.c:2913 sql_help.c:2962 sql_help.c:3978 msgid "opclass" msgstr "演算子クラス" -#: sql_help.c:1396 sql_help.c:1399 sql_help.c:2891 +#: sql_help.c:1430 sql_help.c:2963 +msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" +msgstr "FOREIGN KEY/REFERENCES制約の参照動作は以下の通り:" + +#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3000 msgid "tablespace_option" msgstr "テーブル空間のオプション" -#: sql_help.c:1420 sql_help.c:1423 sql_help.c:1429 sql_help.c:1433 +#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 msgid "token_type" msgstr "トークンの型" -#: sql_help.c:1421 sql_help.c:1424 +#: sql_help.c:1473 sql_help.c:1476 msgid "dictionary_name" msgstr "辞書名" -#: sql_help.c:1426 sql_help.c:1430 +#: sql_help.c:1478 sql_help.c:1482 msgid "old_dictionary" msgstr "元の辞書" -#: sql_help.c:1427 sql_help.c:1431 +#: sql_help.c:1479 sql_help.c:1483 msgid "new_dictionary" msgstr "新しい辞書" -#: sql_help.c:1526 sql_help.c:1540 sql_help.c:1543 sql_help.c:1544 -#: sql_help.c:3042 +#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 +#: sql_help.c:3153 msgid "attribute_name" msgstr "属性名" -#: sql_help.c:1527 +#: sql_help.c:1579 msgid "new_attribute_name" msgstr "新しい属性名" -#: sql_help.c:1531 sql_help.c:1535 +#: sql_help.c:1583 sql_help.c:1587 msgid "new_enum_value" msgstr "新しい列挙値" -#: sql_help.c:1532 +#: sql_help.c:1584 msgid "neighbor_enum_value" msgstr "隣接した列挙値" -#: sql_help.c:1534 +#: sql_help.c:1586 msgid "existing_enum_value" msgstr "既存の列挙値" -#: sql_help.c:1537 +#: sql_help.c:1589 msgid "property" msgstr "プロパティ" -#: sql_help.c:1612 sql_help.c:2251 sql_help.c:2260 sql_help.c:2643 -#: sql_help.c:3120 sql_help.c:3571 sql_help.c:3750 sql_help.c:3786 -#: sql_help.c:4098 +#: sql_help.c:1665 sql_help.c:2326 sql_help.c:2335 sql_help.c:2735 +#: sql_help.c:3233 sql_help.c:3684 sql_help.c:3888 sql_help.c:3934 +#: sql_help.c:4337 msgid "server_name" msgstr "サーバ名" -#: sql_help.c:1644 sql_help.c:1647 sql_help.c:3135 +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3248 msgid "view_option_name" msgstr "ビューのオプション名" -#: sql_help.c:1645 sql_help.c:3136 +#: sql_help.c:1698 sql_help.c:3249 msgid "view_option_value" msgstr "ビューオプションの値" -#: sql_help.c:1666 sql_help.c:1667 sql_help.c:4659 sql_help.c:4660 +#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4929 sql_help.c:4930 msgid "table_and_columns" msgstr "テーブルおよび列" -#: sql_help.c:1668 sql_help.c:1912 sql_help.c:3619 sql_help.c:3963 -#: sql_help.c:4661 +#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3732 +#: sql_help.c:4172 sql_help.c:4931 msgid "where option can be one of:" msgstr "オプションには以下のうちのいずれかを指定します:" -#: sql_help.c:1669 sql_help.c:1670 sql_help.c:1914 sql_help.c:1917 -#: sql_help.c:2096 sql_help.c:3620 sql_help.c:3621 sql_help.c:3622 -#: sql_help.c:3623 sql_help.c:3624 sql_help.c:3625 sql_help.c:3626 -#: sql_help.c:3627 sql_help.c:4662 sql_help.c:4663 sql_help.c:4664 -#: sql_help.c:4665 sql_help.c:4666 sql_help.c:4667 sql_help.c:4668 -#: sql_help.c:4669 +#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 +#: sql_help.c:1980 sql_help.c:2160 sql_help.c:3733 sql_help.c:3734 +#: sql_help.c:3735 sql_help.c:3736 sql_help.c:3737 sql_help.c:3738 +#: sql_help.c:3739 sql_help.c:3740 sql_help.c:4173 sql_help.c:4175 +#: sql_help.c:4932 sql_help.c:4933 sql_help.c:4934 sql_help.c:4935 +#: sql_help.c:4936 sql_help.c:4937 sql_help.c:4938 sql_help.c:4939 msgid "boolean" msgstr "真偽値" -#: sql_help.c:1671 sql_help.c:4671 +#: sql_help.c:1724 sql_help.c:4941 msgid "and table_and_columns is:" msgstr "そしてテーブルと列の指定は以下の通りです:" -#: sql_help.c:1687 sql_help.c:4443 sql_help.c:4445 sql_help.c:4469 +#: sql_help.c:1740 sql_help.c:4702 sql_help.c:4704 sql_help.c:4728 msgid "transaction_mode" msgstr "トランザクションのモード" -#: sql_help.c:1688 sql_help.c:4446 sql_help.c:4470 +#: sql_help.c:1741 sql_help.c:4705 sql_help.c:4729 msgid "where transaction_mode is one of:" msgstr "トランザクションのモードは以下の通りです:" -#: sql_help.c:1697 sql_help.c:4303 sql_help.c:4312 sql_help.c:4316 -#: sql_help.c:4320 sql_help.c:4323 sql_help.c:4542 sql_help.c:4551 -#: sql_help.c:4555 sql_help.c:4559 sql_help.c:4562 sql_help.c:4762 -#: sql_help.c:4771 sql_help.c:4775 sql_help.c:4779 sql_help.c:4782 +#: sql_help.c:1750 sql_help.c:4554 sql_help.c:4563 sql_help.c:4567 +#: sql_help.c:4571 sql_help.c:4574 sql_help.c:4803 sql_help.c:4812 +#: sql_help.c:4816 sql_help.c:4820 sql_help.c:4823 sql_help.c:5034 +#: sql_help.c:5043 sql_help.c:5047 sql_help.c:5051 sql_help.c:5054 msgid "argument" msgstr "引数" -#: sql_help.c:1787 +#: sql_help.c:1850 msgid "relation_name" msgstr "リレーション名" -#: sql_help.c:1792 sql_help.c:3746 sql_help.c:4094 +#: sql_help.c:1855 sql_help.c:3882 sql_help.c:4331 msgid "domain_name" msgstr "ドメイン名" -#: sql_help.c:1814 +#: sql_help.c:1877 msgid "policy_name" msgstr "ポリシー名" -#: sql_help.c:1827 +#: sql_help.c:1890 msgid "rule_name" msgstr "ルール名" -#: sql_help.c:1846 +#: sql_help.c:1909 msgid "text" msgstr "コメント文字列" -#: sql_help.c:1871 sql_help.c:3930 sql_help.c:4135 +#: sql_help.c:1934 sql_help.c:4137 sql_help.c:4384 msgid "transaction_id" msgstr "トランザクションID" -#: sql_help.c:1902 sql_help.c:1909 sql_help.c:3856 +#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4004 msgid "filename" msgstr "ファイル名" -#: sql_help.c:1903 sql_help.c:1910 sql_help.c:2583 sql_help.c:2584 -#: sql_help.c:2585 +#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2674 sql_help.c:2675 +#: sql_help.c:2676 msgid "command" msgstr "コマンド" -#: sql_help.c:1905 sql_help.c:2582 sql_help.c:2994 sql_help.c:3171 -#: sql_help.c:3840 sql_help.c:4286 sql_help.c:4288 sql_help.c:4376 -#: sql_help.c:4378 sql_help.c:4525 sql_help.c:4527 sql_help.c:4630 -#: sql_help.c:4745 sql_help.c:4747 +#: sql_help.c:1968 sql_help.c:2673 sql_help.c:3103 sql_help.c:3284 +#: sql_help.c:3988 sql_help.c:4065 sql_help.c:4068 sql_help.c:4537 +#: sql_help.c:4539 sql_help.c:4635 sql_help.c:4637 sql_help.c:4786 +#: sql_help.c:4788 sql_help.c:4899 sql_help.c:5017 sql_help.c:5019 msgid "condition" msgstr "条件" -#: sql_help.c:1908 sql_help.c:2411 sql_help.c:2877 sql_help.c:3137 -#: sql_help.c:3155 sql_help.c:3821 +#: sql_help.c:1971 sql_help.c:2490 sql_help.c:2986 sql_help.c:3250 +#: sql_help.c:3268 sql_help.c:3969 msgid "query" msgstr "問い合わせ" -#: sql_help.c:1913 +#: sql_help.c:1976 msgid "format_name" msgstr "フォーマット名" -#: sql_help.c:1915 +#: sql_help.c:1978 msgid "delimiter_character" msgstr "区切り文字" -#: sql_help.c:1916 +#: sql_help.c:1979 msgid "null_string" msgstr "NULL文字列" -#: sql_help.c:1918 +#: sql_help.c:1981 +msgid "match" +msgstr "match" + +#: sql_help.c:1982 msgid "quote_character" msgstr "引用符文字" -#: sql_help.c:1919 +#: sql_help.c:1983 msgid "escape_character" msgstr "エスケープ文字" -#: sql_help.c:1923 +#: sql_help.c:1987 msgid "encoding_name" msgstr "エンコーディング名" -#: sql_help.c:1934 +#: sql_help.c:1998 msgid "access_method_type" msgstr "アクセスメソッドの型" -#: sql_help.c:2005 sql_help.c:2024 sql_help.c:2027 +#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2091 msgid "arg_data_type" msgstr "入力データ型" -#: sql_help.c:2006 sql_help.c:2028 sql_help.c:2036 +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 msgid "sfunc" msgstr "状態遷移関数" -#: sql_help.c:2007 sql_help.c:2029 sql_help.c:2037 +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 msgid "state_data_type" msgstr "状態データの型" -#: sql_help.c:2008 sql_help.c:2030 sql_help.c:2038 +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 msgid "state_data_size" msgstr "状態データのサイズ" -#: sql_help.c:2009 sql_help.c:2031 sql_help.c:2039 +#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103 msgid "ffunc" msgstr "終了関数" -#: sql_help.c:2010 sql_help.c:2040 +#: sql_help.c:2074 sql_help.c:2104 msgid "combinefunc" msgstr "結合関数" -#: sql_help.c:2011 sql_help.c:2041 +#: sql_help.c:2075 sql_help.c:2105 msgid "serialfunc" msgstr "シリアライズ関数" -#: sql_help.c:2012 sql_help.c:2042 +#: sql_help.c:2076 sql_help.c:2106 msgid "deserialfunc" msgstr "デシリアライズ関数" -#: sql_help.c:2013 sql_help.c:2032 sql_help.c:2043 +#: sql_help.c:2077 sql_help.c:2096 sql_help.c:2107 msgid "initial_condition" msgstr "初期条件" -#: sql_help.c:2014 sql_help.c:2044 +#: sql_help.c:2078 sql_help.c:2108 msgid "msfunc" msgstr "前方状態遷移関数" -#: sql_help.c:2015 sql_help.c:2045 +#: sql_help.c:2079 sql_help.c:2109 msgid "minvfunc" msgstr "逆状態遷移関数" -#: sql_help.c:2016 sql_help.c:2046 +#: sql_help.c:2080 sql_help.c:2110 msgid "mstate_data_type" msgstr "移動集約モード時の状態値のデータ型" -#: sql_help.c:2017 sql_help.c:2047 +#: sql_help.c:2081 sql_help.c:2111 msgid "mstate_data_size" msgstr "移動集約モード時の状態値のデータサイズ" -#: sql_help.c:2018 sql_help.c:2048 +#: sql_help.c:2082 sql_help.c:2112 msgid "mffunc" msgstr "移動集約モード時の終了関数" -#: sql_help.c:2019 sql_help.c:2049 +#: sql_help.c:2083 sql_help.c:2113 msgid "minitial_condition" msgstr "移動集約モード時の初期条件" -#: sql_help.c:2020 sql_help.c:2050 +#: sql_help.c:2084 sql_help.c:2114 msgid "sort_operator" msgstr "ソート演算子" -#: sql_help.c:2033 +#: sql_help.c:2097 msgid "or the old syntax" msgstr "または古い構文" -#: sql_help.c:2035 +#: sql_help.c:2099 msgid "base_type" msgstr "基本の型" -#: sql_help.c:2092 sql_help.c:2133 +#: sql_help.c:2156 sql_help.c:2203 msgid "locale" msgstr "ロケール" -#: sql_help.c:2093 sql_help.c:2134 +#: sql_help.c:2157 sql_help.c:2204 msgid "lc_collate" msgstr "照合順序" -#: sql_help.c:2094 sql_help.c:2135 +#: sql_help.c:2158 sql_help.c:2205 msgid "lc_ctype" msgstr "Ctype(変換演算子)" -#: sql_help.c:2095 sql_help.c:4188 +#: sql_help.c:2159 sql_help.c:4437 msgid "provider" msgstr "プロバイダ" -#: sql_help.c:2097 sql_help.c:2189 +#: sql_help.c:2161 sql_help.c:2264 msgid "version" msgstr "バージョン" -#: sql_help.c:2099 +#: sql_help.c:2163 msgid "existing_collation" msgstr "既存の照合順序" -#: sql_help.c:2109 +#: sql_help.c:2173 msgid "source_encoding" msgstr "変換元のエンコーディング" -#: sql_help.c:2110 +#: sql_help.c:2174 msgid "dest_encoding" msgstr "変換先のエンコーディング" -#: sql_help.c:2131 sql_help.c:2917 +#: sql_help.c:2200 sql_help.c:3026 msgid "template" msgstr "テンプレート" -#: sql_help.c:2132 +#: sql_help.c:2201 msgid "encoding" msgstr "エンコード" -#: sql_help.c:2159 +#: sql_help.c:2202 +msgid "strategy" +msgstr "ストラテジ" + +#: sql_help.c:2206 +msgid "icu_locale" +msgstr "ICUロケール" + +#: sql_help.c:2207 +msgid "locale_provider" +msgstr "ロケールプロバイダ" + +#: sql_help.c:2208 +msgid "collation_version" +msgstr "照合順序バージョン" + +#: sql_help.c:2213 +msgid "oid" +msgstr "オブジェクトID" + +#: sql_help.c:2233 msgid "constraint" msgstr "制約条件" -#: sql_help.c:2160 +#: sql_help.c:2234 msgid "where constraint is:" msgstr "制約条件は以下の通りです:" -#: sql_help.c:2174 sql_help.c:2580 sql_help.c:2990 +#: sql_help.c:2248 sql_help.c:2671 sql_help.c:3099 msgid "event" msgstr "イベント" -#: sql_help.c:2175 +#: sql_help.c:2249 msgid "filter_variable" msgstr "フィルター変数" -#: sql_help.c:2263 sql_help.c:2812 +#: sql_help.c:2250 +msgid "filter_value" +msgstr "フィルター値" + +#: sql_help.c:2338 sql_help.c:2918 msgid "where column_constraint is:" msgstr "カラム制約は以下の通りです:" -#: sql_help.c:2300 +#: sql_help.c:2377 msgid "rettype" msgstr "戻り値の型" -#: sql_help.c:2302 +#: sql_help.c:2379 msgid "column_type" msgstr "列の型" -#: sql_help.c:2311 sql_help.c:2511 +#: sql_help.c:2388 sql_help.c:2591 msgid "definition" msgstr "定義" -#: sql_help.c:2312 sql_help.c:2512 +#: sql_help.c:2389 sql_help.c:2592 msgid "obj_file" msgstr "オブジェクトファイル名" -#: sql_help.c:2313 sql_help.c:2513 +#: sql_help.c:2390 sql_help.c:2593 msgid "link_symbol" msgstr "リンクシンボル" -#: sql_help.c:2351 sql_help.c:2565 sql_help.c:3109 +#: sql_help.c:2391 sql_help.c:2594 +msgid "sql_body" +msgstr "SQL本体" + +#: sql_help.c:2429 sql_help.c:2656 sql_help.c:3222 msgid "uid" msgstr "UID" -#: sql_help.c:2366 sql_help.c:2407 sql_help.c:2781 sql_help.c:2794 -#: sql_help.c:2808 sql_help.c:2873 +#: sql_help.c:2445 sql_help.c:2486 sql_help.c:2887 sql_help.c:2900 +#: sql_help.c:2914 sql_help.c:2982 msgid "method" msgstr "インデックスメソッド" -#: sql_help.c:2371 +#: sql_help.c:2450 msgid "opclass_parameter" msgstr "演算子クラスパラメータ" -#: sql_help.c:2388 +#: sql_help.c:2467 msgid "call_handler" msgstr "呼び出しハンドラー" -#: sql_help.c:2389 +#: sql_help.c:2468 msgid "inline_handler" msgstr "インラインハンドラー" -#: sql_help.c:2390 +#: sql_help.c:2469 msgid "valfunction" msgstr "バリデーション関数" -#: sql_help.c:2429 +#: sql_help.c:2508 msgid "com_op" msgstr "交代演算子" -#: sql_help.c:2430 +#: sql_help.c:2509 msgid "neg_op" msgstr "否定演算子" -#: sql_help.c:2448 +#: sql_help.c:2527 msgid "family_name" msgstr "演算子族の名前" -#: sql_help.c:2459 +#: sql_help.c:2538 msgid "storage_type" msgstr "ストレージタイプ" -#: sql_help.c:2586 sql_help.c:2997 +#: sql_help.c:2677 sql_help.c:3106 msgid "where event can be one of:" msgstr "イベントは以下のいずれかです:" -#: sql_help.c:2605 sql_help.c:2607 +#: sql_help.c:2697 sql_help.c:2699 msgid "schema_element" msgstr "スキーマ要素" -#: sql_help.c:2644 +#: sql_help.c:2736 msgid "server_type" -msgstr "サーバのタイプ" +msgstr "サーバーのタイプ" -#: sql_help.c:2645 +#: sql_help.c:2737 msgid "server_version" msgstr "サーバのバージョン" -#: sql_help.c:2646 sql_help.c:3748 sql_help.c:4096 +#: sql_help.c:2738 sql_help.c:3885 sql_help.c:4334 msgid "fdw_name" msgstr "外部データラッパ名" -#: sql_help.c:2659 +#: sql_help.c:2755 sql_help.c:2758 msgid "statistics_name" msgstr "統計オブジェクト名" -#: sql_help.c:2660 +#: sql_help.c:2759 msgid "statistics_kind" msgstr "統計種別" -#: sql_help.c:2674 +#: sql_help.c:2775 msgid "subscription_name" msgstr "サブスクリプション名" -#: sql_help.c:2774 +#: sql_help.c:2880 msgid "source_table" msgstr "コピー元のテーブル" -#: sql_help.c:2775 +#: sql_help.c:2881 msgid "like_option" msgstr "LIKEオプション" -#: sql_help.c:2841 +#: sql_help.c:2947 msgid "and like_option is:" msgstr "LIKE オプションは以下の通りです:" -#: sql_help.c:2890 +#: sql_help.c:2999 msgid "directory" msgstr "ディレクトリ" -#: sql_help.c:2904 +#: sql_help.c:3013 msgid "parser_name" msgstr "パーサ名" -#: sql_help.c:2905 +#: sql_help.c:3014 msgid "source_config" msgstr "複製元の設定" -#: sql_help.c:2934 +#: sql_help.c:3043 msgid "start_function" msgstr "開始関数" -#: sql_help.c:2935 +#: sql_help.c:3044 msgid "gettoken_function" msgstr "トークン取得関数" -#: sql_help.c:2936 +#: sql_help.c:3045 msgid "end_function" msgstr "終了関数" -#: sql_help.c:2937 +#: sql_help.c:3046 msgid "lextypes_function" msgstr "LEXTYPE関数" -#: sql_help.c:2938 +#: sql_help.c:3047 msgid "headline_function" msgstr "見出し関数" -#: sql_help.c:2950 +#: sql_help.c:3059 msgid "init_function" msgstr "初期処理関数" -#: sql_help.c:2951 +#: sql_help.c:3060 msgid "lexize_function" msgstr "LEXIZE関数" -#: sql_help.c:2964 +#: sql_help.c:3073 msgid "from_sql_function_name" msgstr "{FROM SQL 関数名}" -#: sql_help.c:2966 +#: sql_help.c:3075 msgid "to_sql_function_name" msgstr "{TO SQL 関数名}" -#: sql_help.c:2992 +#: sql_help.c:3101 msgid "referenced_table_name" msgstr "被参照テーブル名" -#: sql_help.c:2993 +#: sql_help.c:3102 msgid "transition_relation_name" msgstr "移行用リレーション名" -#: sql_help.c:2996 +#: sql_help.c:3105 msgid "arguments" msgstr "引数" -#: sql_help.c:3046 sql_help.c:4221 +#: sql_help.c:3157 sql_help.c:4470 msgid "label" msgstr "ラベル" -#: sql_help.c:3048 +#: sql_help.c:3159 msgid "subtype" msgstr "当該範囲のデータ型" -#: sql_help.c:3049 +#: sql_help.c:3160 msgid "subtype_operator_class" msgstr "当該範囲のデータ型の演算子クラス" -#: sql_help.c:3051 +#: sql_help.c:3162 msgid "canonical_function" msgstr "正規化関数" -#: sql_help.c:3052 +#: sql_help.c:3163 msgid "subtype_diff_function" msgstr "当該範囲のデータ型の差分抽出関数" -#: sql_help.c:3054 +#: sql_help.c:3164 +msgid "multirange_type_name" +msgstr "複範囲型名" + +#: sql_help.c:3166 msgid "input_function" msgstr "入力関数" -#: sql_help.c:3055 +#: sql_help.c:3167 msgid "output_function" msgstr "出力関数" -#: sql_help.c:3056 +#: sql_help.c:3168 msgid "receive_function" msgstr "受信関数" -#: sql_help.c:3057 +#: sql_help.c:3169 msgid "send_function" msgstr "送信関数" -#: sql_help.c:3058 +#: sql_help.c:3170 msgid "type_modifier_input_function" msgstr "型修飾子の入力関数" -#: sql_help.c:3059 +#: sql_help.c:3171 msgid "type_modifier_output_function" msgstr "型修飾子の出力関数" -#: sql_help.c:3060 +#: sql_help.c:3172 msgid "analyze_function" msgstr "分析関数" -#: sql_help.c:3061 +#: sql_help.c:3173 +msgid "subscript_function" +msgstr "添字関数" + +#: sql_help.c:3174 msgid "internallength" msgstr "内部長" -#: sql_help.c:3062 +#: sql_help.c:3175 msgid "alignment" msgstr "バイト境界" -#: sql_help.c:3063 +#: sql_help.c:3176 msgid "storage" msgstr "ストレージ" -#: sql_help.c:3064 +#: sql_help.c:3177 msgid "like_type" msgstr "LIKEの型" -#: sql_help.c:3065 +#: sql_help.c:3178 msgid "category" msgstr "カテゴリー" -#: sql_help.c:3066 +#: sql_help.c:3179 msgid "preferred" msgstr "優先データ型かどうか(真偽値)" -#: sql_help.c:3067 +#: sql_help.c:3180 msgid "default" msgstr "デフォルト" -#: sql_help.c:3068 +#: sql_help.c:3181 msgid "element" msgstr "要素のデータ型" -#: sql_help.c:3069 +#: sql_help.c:3182 msgid "delimiter" msgstr "区切り記号" -#: sql_help.c:3070 +#: sql_help.c:3183 msgid "collatable" msgstr "照合可能" -#: sql_help.c:3167 sql_help.c:3816 sql_help.c:4281 sql_help.c:4370 -#: sql_help.c:4520 sql_help.c:4620 sql_help.c:4740 +#: sql_help.c:3280 sql_help.c:3964 sql_help.c:4054 sql_help.c:4532 +#: sql_help.c:4629 sql_help.c:4781 sql_help.c:4889 sql_help.c:5012 msgid "with_query" msgstr "WITH問い合わせ" -#: sql_help.c:3169 sql_help.c:3818 sql_help.c:4300 sql_help.c:4306 -#: sql_help.c:4309 sql_help.c:4313 sql_help.c:4317 sql_help.c:4325 -#: sql_help.c:4539 sql_help.c:4545 sql_help.c:4548 sql_help.c:4552 -#: sql_help.c:4556 sql_help.c:4564 sql_help.c:4622 sql_help.c:4759 -#: sql_help.c:4765 sql_help.c:4768 sql_help.c:4772 sql_help.c:4776 -#: sql_help.c:4784 +#: sql_help.c:3282 sql_help.c:3966 sql_help.c:4551 sql_help.c:4557 +#: sql_help.c:4560 sql_help.c:4564 sql_help.c:4568 sql_help.c:4576 +#: sql_help.c:4800 sql_help.c:4806 sql_help.c:4809 sql_help.c:4813 +#: sql_help.c:4817 sql_help.c:4825 sql_help.c:4891 sql_help.c:5031 +#: sql_help.c:5037 sql_help.c:5040 sql_help.c:5044 sql_help.c:5048 +#: sql_help.c:5056 msgid "alias" -msgstr "エイリアス" +msgstr "別名" -#: sql_help.c:3170 sql_help.c:4285 sql_help.c:4327 sql_help.c:4329 -#: sql_help.c:4375 sql_help.c:4524 sql_help.c:4566 sql_help.c:4568 -#: sql_help.c:4629 sql_help.c:4744 sql_help.c:4786 sql_help.c:4788 +#: sql_help.c:3283 sql_help.c:4536 sql_help.c:4578 sql_help.c:4580 +#: sql_help.c:4634 sql_help.c:4785 sql_help.c:4827 sql_help.c:4829 +#: sql_help.c:4898 sql_help.c:5016 sql_help.c:5058 sql_help.c:5060 msgid "from_item" msgstr "FROM項目" -#: sql_help.c:3172 sql_help.c:3653 sql_help.c:3897 sql_help.c:4631 +#: sql_help.c:3285 sql_help.c:3766 sql_help.c:4104 sql_help.c:4900 msgid "cursor_name" msgstr "カーソル名" -#: sql_help.c:3173 sql_help.c:3824 sql_help.c:4632 +#: sql_help.c:3286 sql_help.c:3972 sql_help.c:4901 msgid "output_expression" msgstr "出力表現" -#: sql_help.c:3174 sql_help.c:3825 sql_help.c:4284 sql_help.c:4373 -#: sql_help.c:4523 sql_help.c:4633 sql_help.c:4743 +#: sql_help.c:3287 sql_help.c:3973 sql_help.c:4535 sql_help.c:4632 +#: sql_help.c:4784 sql_help.c:4902 sql_help.c:5015 msgid "output_name" msgstr "出力名" -#: sql_help.c:3190 +#: sql_help.c:3303 msgid "code" msgstr "コードブロック" -#: sql_help.c:3595 +#: sql_help.c:3708 msgid "parameter" msgstr "パラメータ" -#: sql_help.c:3617 sql_help.c:3618 sql_help.c:3922 +#: sql_help.c:3730 sql_help.c:3731 sql_help.c:4129 msgid "statement" -msgstr "ステートメント" +msgstr "文" -#: sql_help.c:3652 sql_help.c:3896 +#: sql_help.c:3765 sql_help.c:4103 msgid "direction" msgstr "取り出す方向と行数" -#: sql_help.c:3654 sql_help.c:3898 +#: sql_help.c:3767 sql_help.c:4105 msgid "where direction can be empty or one of:" msgstr "取り出す方向と行数は無指定もしくは以下のいずれかです:" -#: sql_help.c:3655 sql_help.c:3656 sql_help.c:3657 sql_help.c:3658 -#: sql_help.c:3659 sql_help.c:3899 sql_help.c:3900 sql_help.c:3901 -#: sql_help.c:3902 sql_help.c:3903 sql_help.c:4294 sql_help.c:4296 -#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4533 sql_help.c:4535 -#: sql_help.c:4688 sql_help.c:4690 sql_help.c:4753 sql_help.c:4755 +#: sql_help.c:3768 sql_help.c:3769 sql_help.c:3770 sql_help.c:3771 +#: sql_help.c:3772 sql_help.c:4106 sql_help.c:4107 sql_help.c:4108 +#: sql_help.c:4109 sql_help.c:4110 sql_help.c:4545 sql_help.c:4547 +#: sql_help.c:4643 sql_help.c:4645 sql_help.c:4794 sql_help.c:4796 +#: sql_help.c:4958 sql_help.c:4960 sql_help.c:5025 sql_help.c:5027 msgid "count" msgstr "取り出す位置や行数" -#: sql_help.c:3741 sql_help.c:4089 +#: sql_help.c:3875 sql_help.c:4324 msgid "sequence_name" msgstr "シーケンス名" -#: sql_help.c:3754 sql_help.c:4102 +#: sql_help.c:3893 sql_help.c:4342 msgid "arg_name" msgstr "引数名" -#: sql_help.c:3755 sql_help.c:4103 +#: sql_help.c:3894 sql_help.c:4343 msgid "arg_type" msgstr "引数の型" -#: sql_help.c:3760 sql_help.c:4108 +#: sql_help.c:3901 sql_help.c:4350 msgid "loid" msgstr "ラージオブジェクトid" -#: sql_help.c:3784 +#: sql_help.c:3932 msgid "remote_schema" msgstr "リモートスキーマ" -#: sql_help.c:3787 +#: sql_help.c:3935 msgid "local_schema" msgstr "ローカルスキーマ" -#: sql_help.c:3822 +#: sql_help.c:3970 msgid "conflict_target" msgstr "競合ターゲット" -#: sql_help.c:3823 +#: sql_help.c:3971 msgid "conflict_action" msgstr "競合時アクション" -#: sql_help.c:3826 +#: sql_help.c:3974 msgid "where conflict_target can be one of:" msgstr "競合ターゲットは以下のいずれかです:" -#: sql_help.c:3827 +#: sql_help.c:3975 msgid "index_column_name" msgstr "インデックスのカラム名" -#: sql_help.c:3828 +#: sql_help.c:3976 msgid "index_expression" msgstr "インデックス表現" -#: sql_help.c:3831 +#: sql_help.c:3979 msgid "index_predicate" msgstr "インデックスの述語" -#: sql_help.c:3833 +#: sql_help.c:3981 msgid "and conflict_action is one of:" msgstr "競合時アクションは以下のいずれかです:" -#: sql_help.c:3839 sql_help.c:4628 +#: sql_help.c:3987 sql_help.c:4897 msgid "sub-SELECT" msgstr "副問い合わせ句" -#: sql_help.c:3848 sql_help.c:3911 sql_help.c:4604 +#: sql_help.c:3996 sql_help.c:4118 sql_help.c:4873 msgid "channel" msgstr "チャネル" -#: sql_help.c:3870 +#: sql_help.c:4018 msgid "lockmode" msgstr "ロックモード" -#: sql_help.c:3871 +#: sql_help.c:4019 msgid "where lockmode is one of:" msgstr "ロックモードは以下のいずれかです:" -#: sql_help.c:3912 +#: sql_help.c:4055 +msgid "target_table_name" +msgstr "ターゲットテーブル名" + +#: sql_help.c:4056 +msgid "target_alias" +msgstr "ターゲット別名" + +#: sql_help.c:4057 +msgid "data_source" +msgstr "データ源" + +#: sql_help.c:4058 sql_help.c:4581 sql_help.c:4830 sql_help.c:5061 +msgid "join_condition" +msgstr "JOIN条件" + +#: sql_help.c:4059 +msgid "when_clause" +msgstr "WHEN句" + +#: sql_help.c:4060 +msgid "where data_source is" +msgstr "ここでデータ源は以下の通り" + +#: sql_help.c:4061 +msgid "source_table_name" +msgstr "データ源テーブル名" + +#: sql_help.c:4062 +msgid "source_query" +msgstr "データ源問い合わせ" + +#: sql_help.c:4063 +msgid "source_alias" +msgstr "データ源別名" + +#: sql_help.c:4064 +msgid "and when_clause is" +msgstr "WHEN句は以下の通り" + +#: sql_help.c:4066 +msgid "merge_update" +msgstr "マージ更新" + +#: sql_help.c:4067 +msgid "merge_delete" +msgstr "マージ削除" + +#: sql_help.c:4069 +msgid "merge_insert" +msgstr "マージ挿入" + +#: sql_help.c:4070 +msgid "and merge_insert is" +msgstr "そしてマージ挿入は以下の通り" + +#: sql_help.c:4073 +msgid "and merge_update is" +msgstr "そしてマージ更新は以下の通り" + +#: sql_help.c:4078 +msgid "and merge_delete is" +msgstr "そしてマージ削除は以下の通り" + +#: sql_help.c:4119 msgid "payload" msgstr "ペイロード" -#: sql_help.c:3939 +#: sql_help.c:4146 msgid "old_role" msgstr "元のロール" -#: sql_help.c:3940 +#: sql_help.c:4147 msgid "new_role" msgstr "新しいロール" -#: sql_help.c:3971 sql_help.c:4143 sql_help.c:4151 +#: sql_help.c:4183 sql_help.c:4392 sql_help.c:4400 msgid "savepoint_name" msgstr "セーブポイント名" -#: sql_help.c:4287 sql_help.c:4339 sql_help.c:4526 sql_help.c:4578 -#: sql_help.c:4746 sql_help.c:4798 +#: sql_help.c:4538 sql_help.c:4591 sql_help.c:4787 sql_help.c:4840 +#: sql_help.c:5018 sql_help.c:5071 msgid "grouping_element" msgstr "グルーピング要素" -#: sql_help.c:4289 sql_help.c:4379 sql_help.c:4528 sql_help.c:4748 +#: sql_help.c:4540 sql_help.c:4638 sql_help.c:4789 sql_help.c:5020 msgid "window_name" msgstr "ウィンドウ名" -#: sql_help.c:4290 sql_help.c:4380 sql_help.c:4529 sql_help.c:4749 +#: sql_help.c:4541 sql_help.c:4639 sql_help.c:4790 sql_help.c:5021 msgid "window_definition" msgstr "ウィンドウ定義" -#: sql_help.c:4291 sql_help.c:4305 sql_help.c:4343 sql_help.c:4381 -#: sql_help.c:4530 sql_help.c:4544 sql_help.c:4582 sql_help.c:4750 -#: sql_help.c:4764 sql_help.c:4802 +#: sql_help.c:4542 sql_help.c:4556 sql_help.c:4595 sql_help.c:4640 +#: sql_help.c:4791 sql_help.c:4805 sql_help.c:4844 sql_help.c:5022 +#: sql_help.c:5036 sql_help.c:5075 msgid "select" msgstr "SELECT句" -#: sql_help.c:4298 sql_help.c:4537 sql_help.c:4757 +#: sql_help.c:4549 sql_help.c:4798 sql_help.c:5029 msgid "where from_item can be one of:" msgstr "FROM項目は以下のいずれかです:" -#: sql_help.c:4301 sql_help.c:4307 sql_help.c:4310 sql_help.c:4314 -#: sql_help.c:4326 sql_help.c:4540 sql_help.c:4546 sql_help.c:4549 -#: sql_help.c:4553 sql_help.c:4565 sql_help.c:4760 sql_help.c:4766 -#: sql_help.c:4769 sql_help.c:4773 sql_help.c:4785 +#: sql_help.c:4552 sql_help.c:4558 sql_help.c:4561 sql_help.c:4565 +#: sql_help.c:4577 sql_help.c:4801 sql_help.c:4807 sql_help.c:4810 +#: sql_help.c:4814 sql_help.c:4826 sql_help.c:5032 sql_help.c:5038 +#: sql_help.c:5041 sql_help.c:5045 sql_help.c:5057 msgid "column_alias" -msgstr "行エイリアス" +msgstr "列別名" -#: sql_help.c:4302 sql_help.c:4541 sql_help.c:4761 +#: sql_help.c:4553 sql_help.c:4802 sql_help.c:5033 msgid "sampling_method" msgstr "サンプリングメソッド" -#: sql_help.c:4304 sql_help.c:4543 sql_help.c:4763 +#: sql_help.c:4555 sql_help.c:4804 sql_help.c:5035 msgid "seed" msgstr "乱数シード" -#: sql_help.c:4308 sql_help.c:4341 sql_help.c:4547 sql_help.c:4580 -#: sql_help.c:4767 sql_help.c:4800 +#: sql_help.c:4559 sql_help.c:4593 sql_help.c:4808 sql_help.c:4842 +#: sql_help.c:5039 sql_help.c:5073 msgid "with_query_name" msgstr "WITH問い合わせ名" -#: sql_help.c:4318 sql_help.c:4321 sql_help.c:4324 sql_help.c:4557 -#: sql_help.c:4560 sql_help.c:4563 sql_help.c:4777 sql_help.c:4780 -#: sql_help.c:4783 +#: sql_help.c:4569 sql_help.c:4572 sql_help.c:4575 sql_help.c:4818 +#: sql_help.c:4821 sql_help.c:4824 sql_help.c:5049 sql_help.c:5052 +#: sql_help.c:5055 msgid "column_definition" msgstr "カラム定義" -#: sql_help.c:4328 sql_help.c:4567 sql_help.c:4787 +#: sql_help.c:4579 sql_help.c:4828 sql_help.c:5059 msgid "join_type" msgstr "JOINタイプ" -#: sql_help.c:4330 sql_help.c:4569 sql_help.c:4789 -msgid "join_condition" -msgstr "JOIN条件" - -#: sql_help.c:4331 sql_help.c:4570 sql_help.c:4790 +#: sql_help.c:4582 sql_help.c:4831 sql_help.c:5062 msgid "join_column" msgstr "JOINカラム" -#: sql_help.c:4332 sql_help.c:4571 sql_help.c:4791 +#: sql_help.c:4583 sql_help.c:4832 sql_help.c:5063 +msgid "join_using_alias" +msgstr "JOIN用別名" + +#: sql_help.c:4584 sql_help.c:4833 sql_help.c:5064 msgid "and grouping_element can be one of:" msgstr "グルーピング要素は以下のいずれかです:" -#: sql_help.c:4340 sql_help.c:4579 sql_help.c:4799 +#: sql_help.c:4592 sql_help.c:4841 sql_help.c:5072 msgid "and with_query is:" msgstr "WITH問い合わせは以下のいずれかです:" -#: sql_help.c:4344 sql_help.c:4583 sql_help.c:4803 +#: sql_help.c:4596 sql_help.c:4845 sql_help.c:5076 msgid "values" msgstr "VALUES句" -#: sql_help.c:4345 sql_help.c:4584 sql_help.c:4804 +#: sql_help.c:4597 sql_help.c:4846 sql_help.c:5077 msgid "insert" msgstr "INSERT句" -#: sql_help.c:4346 sql_help.c:4585 sql_help.c:4805 +#: sql_help.c:4598 sql_help.c:4847 sql_help.c:5078 msgid "update" msgstr "UPDATE句" -#: sql_help.c:4347 sql_help.c:4586 sql_help.c:4806 +#: sql_help.c:4599 sql_help.c:4848 sql_help.c:5079 msgid "delete" msgstr "DELETE句" -#: sql_help.c:4374 +#: sql_help.c:4601 sql_help.c:4850 sql_help.c:5081 +msgid "search_seq_col_name" +msgstr "SEARCH順序列名" + +#: sql_help.c:4603 sql_help.c:4852 sql_help.c:5083 +msgid "cycle_mark_col_name" +msgstr "循環識別列名" + +#: sql_help.c:4604 sql_help.c:4853 sql_help.c:5084 +msgid "cycle_mark_value" +msgstr "循環識別値" + +#: sql_help.c:4605 sql_help.c:4854 sql_help.c:5085 +msgid "cycle_mark_default" +msgstr "循環識別デフォルト" + +#: sql_help.c:4606 sql_help.c:4855 sql_help.c:5086 +msgid "cycle_path_col_name" +msgstr "循環パス列名" + +#: sql_help.c:4633 msgid "new_table" msgstr "新しいテーブル" -#: sql_help.c:4399 +#: sql_help.c:4658 msgid "timezone" msgstr "タイムゾーン" -#: sql_help.c:4444 +#: sql_help.c:4703 msgid "snapshot_id" msgstr "スナップショットID" -#: sql_help.c:4686 +#: sql_help.c:4956 msgid "sort_expression" msgstr "ソート表現" -#: sql_help.c:4813 sql_help.c:5791 +#: sql_help.c:5093 sql_help.c:6077 msgid "abort the current transaction" msgstr "現在のトランザクションを中止します" -#: sql_help.c:4819 +#: sql_help.c:5099 msgid "change the definition of an aggregate function" -msgstr "集約関数の定義を変更します。" +msgstr "集約関数の定義を変更します" -#: sql_help.c:4825 +#: sql_help.c:5105 msgid "change the definition of a collation" -msgstr "照合順序の定義を変更します。" +msgstr "照合順序の定義を変更します" -#: sql_help.c:4831 +#: sql_help.c:5111 msgid "change the definition of a conversion" -msgstr "エンコーディング変換ルールの定義を変更します。" +msgstr "エンコーディング変換ルールの定義を変更します" -#: sql_help.c:4837 +#: sql_help.c:5117 msgid "change a database" -msgstr "データベースを変更します。" +msgstr "データベースを変更します" -#: sql_help.c:4843 +#: sql_help.c:5123 msgid "define default access privileges" -msgstr "デフォルトのアクセス権限を定義します。" +msgstr "デフォルトのアクセス権限を定義します" -#: sql_help.c:4849 +#: sql_help.c:5129 msgid "change the definition of a domain" -msgstr "ドメインの定義を変更します。" +msgstr "ドメインの定義を変更します" -#: sql_help.c:4855 +#: sql_help.c:5135 msgid "change the definition of an event trigger" -msgstr "イベントトリガーの定義を変更します。" +msgstr "イベントトリガーの定義を変更します" -#: sql_help.c:4861 +#: sql_help.c:5141 msgid "change the definition of an extension" -msgstr "拡張の定義を変更します。" +msgstr "機能拡張の定義を変更します" -#: sql_help.c:4867 +#: sql_help.c:5147 msgid "change the definition of a foreign-data wrapper" -msgstr "外部データラッパの定義を変更します。" +msgstr "外部データラッパの定義を変更します" -#: sql_help.c:4873 +#: sql_help.c:5153 msgid "change the definition of a foreign table" -msgstr "外部テーブルの定義を変更します。" +msgstr "外部テーブルの定義を変更します" -#: sql_help.c:4879 +#: sql_help.c:5159 msgid "change the definition of a function" -msgstr "関数の定義を変更します。" +msgstr "関数の定義を変更します" -#: sql_help.c:4885 +#: sql_help.c:5165 msgid "change role name or membership" -msgstr "ロール名またはメンバーシップを変更します。" +msgstr "ロール名またはメンバーシップを変更します" -#: sql_help.c:4891 +#: sql_help.c:5171 msgid "change the definition of an index" -msgstr "インデックスの定義を変更します。" +msgstr "インデックスの定義を変更します" -#: sql_help.c:4897 +#: sql_help.c:5177 msgid "change the definition of a procedural language" -msgstr "手続き言語の定義を変更します。" +msgstr "手続き言語の定義を変更します" -#: sql_help.c:4903 +#: sql_help.c:5183 msgid "change the definition of a large object" -msgstr "ラージオブジェクトの定義を変更します。" +msgstr "ラージオブジェクトの定義を変更します" -#: sql_help.c:4909 +#: sql_help.c:5189 msgid "change the definition of a materialized view" -msgstr "マテリアライズドビューの定義を変更します。" +msgstr "実体化ビューの定義を変更します" -#: sql_help.c:4915 +#: sql_help.c:5195 msgid "change the definition of an operator" -msgstr "演算子の定義を変更します。" +msgstr "演算子の定義を変更します" -#: sql_help.c:4921 +#: sql_help.c:5201 msgid "change the definition of an operator class" -msgstr "演算子クラスの定義を変更します。" +msgstr "演算子クラスの定義を変更します" -#: sql_help.c:4927 +#: sql_help.c:5207 msgid "change the definition of an operator family" -msgstr "演算子族の定義を変更します。" +msgstr "演算子族の定義を変更します" -#: sql_help.c:4933 -msgid "change the definition of a row level security policy" -msgstr "行レベルのセキュリティ ポリシーの定義を変更します。" +#: sql_help.c:5213 +msgid "change the definition of a row-level security policy" +msgstr "行レベルのセキュリティ ポリシーの定義を変更します" -#: sql_help.c:4939 +#: sql_help.c:5219 msgid "change the definition of a procedure" msgstr "プロシージャの定義を変更します" -#: sql_help.c:4945 +#: sql_help.c:5225 msgid "change the definition of a publication" -msgstr "パブリケーションの定義を変更します。" +msgstr "パブリケーションの定義を変更します" -#: sql_help.c:4951 sql_help.c:5053 +#: sql_help.c:5231 sql_help.c:5333 msgid "change a database role" -msgstr "データベースロールを変更します。" +msgstr "データベースロールを変更します" -#: sql_help.c:4957 +#: sql_help.c:5237 msgid "change the definition of a routine" -msgstr "ルーチンの定義を変更します。" +msgstr "ルーチンの定義を変更します" -#: sql_help.c:4963 +#: sql_help.c:5243 msgid "change the definition of a rule" -msgstr "ルールの定義を変更します。" +msgstr "ルールの定義を変更します" -#: sql_help.c:4969 +#: sql_help.c:5249 msgid "change the definition of a schema" -msgstr "スキーマの定義を変更します。" +msgstr "スキーマの定義を変更します" -#: sql_help.c:4975 +#: sql_help.c:5255 msgid "change the definition of a sequence generator" -msgstr "シーケンスジェネレーターの定義を変更します。" +msgstr "シーケンス生成器の定義を変更します" -#: sql_help.c:4981 +#: sql_help.c:5261 msgid "change the definition of a foreign server" -msgstr "外部サーバの定義を変更します。" +msgstr "外部サーバの定義を変更します" -#: sql_help.c:4987 +#: sql_help.c:5267 msgid "change the definition of an extended statistics object" -msgstr "拡張統計情報オブジェクトの定義を変更します。" +msgstr "拡張統計情報オブジェクトの定義を変更します" -#: sql_help.c:4993 +#: sql_help.c:5273 msgid "change the definition of a subscription" -msgstr "サブスクリプションの定義を変更します。" +msgstr "サブスクリプションの定義を変更します" -#: sql_help.c:4999 +#: sql_help.c:5279 msgid "change a server configuration parameter" -msgstr "サーバの構成パラメータを変更します。" +msgstr "サーバの設定パラメータを変更します" -#: sql_help.c:5005 +#: sql_help.c:5285 msgid "change the definition of a table" msgstr "テーブルの定義を変更します。" -#: sql_help.c:5011 +#: sql_help.c:5291 msgid "change the definition of a tablespace" -msgstr "テーブル空間の定義を変更します。" +msgstr "テーブル空間の定義を変更します" -#: sql_help.c:5017 +#: sql_help.c:5297 msgid "change the definition of a text search configuration" -msgstr "テキスト検索設定の定義を変更します。" +msgstr "テキスト検索設定の定義を変更します" -#: sql_help.c:5023 +#: sql_help.c:5303 msgid "change the definition of a text search dictionary" -msgstr "テキスト検索辞書の定義を変更します。" +msgstr "テキスト検索辞書の定義を変更します" -#: sql_help.c:5029 +#: sql_help.c:5309 msgid "change the definition of a text search parser" -msgstr "テキスト検索パーサの定義を変更します。" +msgstr "テキスト検索パーサーの定義を変更します" -#: sql_help.c:5035 +#: sql_help.c:5315 msgid "change the definition of a text search template" -msgstr "テキスト検索テンプレートの定義を変更します。" +msgstr "テキスト検索テンプレートの定義を変更します" -#: sql_help.c:5041 +#: sql_help.c:5321 msgid "change the definition of a trigger" -msgstr "トリガーの定義を変更します。" +msgstr "トリガーの定義を変更します" -#: sql_help.c:5047 +#: sql_help.c:5327 msgid "change the definition of a type" -msgstr "型の定義を変更します。" +msgstr "型の定義を変更します" -#: sql_help.c:5059 +#: sql_help.c:5339 msgid "change the definition of a user mapping" -msgstr "ユーザマッピングの定義を変更します。" +msgstr "ユーザーマッピングの定義を変更します" -#: sql_help.c:5065 +#: sql_help.c:5345 msgid "change the definition of a view" -msgstr "ビューの定義を変更します。" +msgstr "ビューの定義を変更します" -#: sql_help.c:5071 +#: sql_help.c:5351 msgid "collect statistics about a database" -msgstr "データベースの統計情報を収集します。" +msgstr "データベースの統計情報を収集します" -#: sql_help.c:5077 sql_help.c:5869 +#: sql_help.c:5357 sql_help.c:6155 msgid "start a transaction block" -msgstr "トランザクションブロックを開始します。" +msgstr "トランザクション区間を開始します" -#: sql_help.c:5083 +#: sql_help.c:5363 msgid "invoke a procedure" msgstr "プロシージャを実行します" -#: sql_help.c:5089 +#: sql_help.c:5369 msgid "force a write-ahead log checkpoint" -msgstr "先行書き込みログのチェックポイントを強制的に実行します。" +msgstr "先行書き込みログのチェックポイントを強制的に実行します" -#: sql_help.c:5095 +#: sql_help.c:5375 msgid "close a cursor" -msgstr "カーソルを閉じます。" +msgstr "カーソルを閉じます" -#: sql_help.c:5101 +#: sql_help.c:5381 msgid "cluster a table according to an index" -msgstr "インデックスに従ってテーブルをクラスタ化します。" +msgstr "インデックスに従ってテーブルをクラスタ化します" -#: sql_help.c:5107 +#: sql_help.c:5387 msgid "define or change the comment of an object" -msgstr "オブジェクトのコメントを定義または変更します。" +msgstr "オブジェクトのコメントを定義または変更します" -#: sql_help.c:5113 sql_help.c:5671 +#: sql_help.c:5393 sql_help.c:5951 msgid "commit the current transaction" -msgstr "現在のトランザクションをコミットします。" +msgstr "現在のトランザクションをコミットします" -#: sql_help.c:5119 +#: sql_help.c:5399 msgid "commit a transaction that was earlier prepared for two-phase commit" -msgstr "二相コミットのために事前に準備されたトランザクションをコミットします。" +msgstr "二相コミットのために事前に準備されたトランザクションをコミットします" -#: sql_help.c:5125 +#: sql_help.c:5405 msgid "copy data between a file and a table" -msgstr "ファイルとテーブル間でデータをコピーします。" +msgstr "ファイルとテーブルとの間でデータをコピーします" -#: sql_help.c:5131 +#: sql_help.c:5411 msgid "define a new access method" -msgstr "新しいアクセスメソッドを定義します。" +msgstr "新しいアクセスメソッドを定義します" -#: sql_help.c:5137 +#: sql_help.c:5417 msgid "define a new aggregate function" -msgstr "新しい集約関数を定義します。" +msgstr "新しい集約関数を定義します" -#: sql_help.c:5143 +#: sql_help.c:5423 msgid "define a new cast" -msgstr "新しいキャストを定義します。" +msgstr "新しい型変換を定義します" -#: sql_help.c:5149 +#: sql_help.c:5429 msgid "define a new collation" -msgstr "新しい照合順序を定義します。" +msgstr "新しい照合順序を定義します" -#: sql_help.c:5155 +#: sql_help.c:5435 msgid "define a new encoding conversion" -msgstr "新しいエンコーディングの変換ルールを定義します。" +msgstr "新しいエンコーディング変換を定義します" -#: sql_help.c:5161 +#: sql_help.c:5441 msgid "create a new database" -msgstr "新しいデータベースを作成します。" +msgstr "新しいデータベースを作成します" -#: sql_help.c:5167 +#: sql_help.c:5447 msgid "define a new domain" -msgstr "新しいドメインを定義します。" +msgstr "新しいドメインを定義します" -#: sql_help.c:5173 +#: sql_help.c:5453 msgid "define a new event trigger" -msgstr "新しいイベントトリガーを定義します。" +msgstr "新しいイベントトリガーを定義します" -#: sql_help.c:5179 +#: sql_help.c:5459 msgid "install an extension" -msgstr "拡張をインストールします。" +msgstr "機能拡張をインストールします" -#: sql_help.c:5185 +#: sql_help.c:5465 msgid "define a new foreign-data wrapper" -msgstr "新しい外部データラッパを定義します。" +msgstr "新しい外部データラッパを定義します" -#: sql_help.c:5191 +#: sql_help.c:5471 msgid "define a new foreign table" -msgstr "新しい外部テーブルを定義します。" +msgstr "新しい外部テーブルを定義します" -#: sql_help.c:5197 +#: sql_help.c:5477 msgid "define a new function" -msgstr "新しい関数を定義します。" +msgstr "新しい関数を定義します" -#: sql_help.c:5203 sql_help.c:5263 sql_help.c:5365 +#: sql_help.c:5483 sql_help.c:5543 sql_help.c:5645 msgid "define a new database role" -msgstr "新しいデータベースロールを定義します。" +msgstr "新しいデータベースロールを定義します" -#: sql_help.c:5209 +#: sql_help.c:5489 msgid "define a new index" -msgstr "新しいインデックスを定義します。" +msgstr "新しいインデックスを定義します" -#: sql_help.c:5215 +#: sql_help.c:5495 msgid "define a new procedural language" -msgstr "新しい手続き言語を定義します。" +msgstr "新しい手続き言語を定義します" -#: sql_help.c:5221 +#: sql_help.c:5501 msgid "define a new materialized view" -msgstr "新しいマテリアライズドビューを定義します。" +msgstr "新しい実体化ビューを定義します" -#: sql_help.c:5227 +#: sql_help.c:5507 msgid "define a new operator" -msgstr "新しい演算子を定義します。" +msgstr "新しい演算子を定義します" -#: sql_help.c:5233 +#: sql_help.c:5513 msgid "define a new operator class" -msgstr "新しい演算子クラスを定義します。" +msgstr "新しい演算子クラスを定義します" -#: sql_help.c:5239 +#: sql_help.c:5519 msgid "define a new operator family" -msgstr "新しい演算子族を定義します。" +msgstr "新しい演算子族を定義します" -#: sql_help.c:5245 -msgid "define a new row level security policy for a table" -msgstr "テーブルに対して新しい行レベルのセキュリティポリシーを定義します。" +#: sql_help.c:5525 +msgid "define a new row-level security policy for a table" +msgstr "テーブルに対して新しい行レベルセキュリティポリシーを定義します" -#: sql_help.c:5251 +#: sql_help.c:5531 msgid "define a new procedure" msgstr "新しいプロシージャを定義します" -#: sql_help.c:5257 +#: sql_help.c:5537 msgid "define a new publication" -msgstr "新しいパブリケーションを定義します。" +msgstr "新しいパブリケーションを定義します" -#: sql_help.c:5269 +#: sql_help.c:5549 msgid "define a new rewrite rule" -msgstr "新しい書き換えルールを定義します。" +msgstr "新しい書き換えルールを定義します" -#: sql_help.c:5275 +#: sql_help.c:5555 msgid "define a new schema" -msgstr "新しいスキーマを定義します。" +msgstr "新しいスキーマを定義します" -#: sql_help.c:5281 +#: sql_help.c:5561 msgid "define a new sequence generator" -msgstr "新しいシーケンスジェネレーターを定義します。" +msgstr "新しいシーケンス生成器を定義します。" -#: sql_help.c:5287 +#: sql_help.c:5567 msgid "define a new foreign server" -msgstr "新しい外部サーバを定義します。" +msgstr "新しい外部サーバーを定義します" -#: sql_help.c:5293 +#: sql_help.c:5573 msgid "define extended statistics" -msgstr "拡張統計情報を定義します。" +msgstr "拡張統計情報を定義します" -#: sql_help.c:5299 +#: sql_help.c:5579 msgid "define a new subscription" -msgstr "新しいサブスクリプションを定義します。" +msgstr "新しいサブスクリプションを定義します" -#: sql_help.c:5305 +#: sql_help.c:5585 msgid "define a new table" -msgstr "新しいテーブルを定義します。" +msgstr "新しいテーブルを定義します" -#: sql_help.c:5311 sql_help.c:5827 +#: sql_help.c:5591 sql_help.c:6113 msgid "define a new table from the results of a query" -msgstr "問い合わせの結果から新しいテーブルを定義します。" +msgstr "問い合わせの結果から新しいテーブルを定義します" -#: sql_help.c:5317 +#: sql_help.c:5597 msgid "define a new tablespace" -msgstr "新しいテーブル空間を定義します。" +msgstr "新しいテーブル空間を定義します" -#: sql_help.c:5323 +#: sql_help.c:5603 msgid "define a new text search configuration" -msgstr "新しいテキスト検索設定を定義します。" +msgstr "新しいテキスト検索設定を定義します" -#: sql_help.c:5329 +#: sql_help.c:5609 msgid "define a new text search dictionary" -msgstr "新しいテキスト検索辞書を定義します。" +msgstr "新しいテキスト検索辞書を定義します" -#: sql_help.c:5335 +#: sql_help.c:5615 msgid "define a new text search parser" -msgstr "新しいテキスト検索パーサを定義します。" +msgstr "新しいテキスト検索パーサーを定義します" -#: sql_help.c:5341 +#: sql_help.c:5621 msgid "define a new text search template" -msgstr "新しいテキスト検索テンプレートを定義します。" +msgstr "新しいテキスト検索テンプレートを定義します" -#: sql_help.c:5347 +#: sql_help.c:5627 msgid "define a new transform" -msgstr "新しい変換を定義します。" +msgstr "新しいデータ変換を定義します" -#: sql_help.c:5353 +#: sql_help.c:5633 msgid "define a new trigger" -msgstr "新しいトリガーを定義します。" +msgstr "新しいトリガーを定義します" -#: sql_help.c:5359 +#: sql_help.c:5639 msgid "define a new data type" -msgstr "新しいデータ型を定義します。" +msgstr "新しいデータ型を定義します" -#: sql_help.c:5371 +#: sql_help.c:5651 msgid "define a new mapping of a user to a foreign server" msgstr "外部サーバに対するユーザの新しいマッピングを定義します。" -#: sql_help.c:5377 +#: sql_help.c:5657 msgid "define a new view" -msgstr "新しいビューを定義します。" +msgstr "新しいビューを定義します" -#: sql_help.c:5383 +#: sql_help.c:5663 msgid "deallocate a prepared statement" -msgstr "プリペアドステートメントを開放します。" +msgstr "準備した文を解放します" -#: sql_help.c:5389 +#: sql_help.c:5669 msgid "define a cursor" -msgstr "カーソルを定義します。" +msgstr "カーソルを定義します" -#: sql_help.c:5395 +#: sql_help.c:5675 msgid "delete rows of a table" -msgstr "テーブルの行を削除します。" +msgstr "テーブルの行を削除します" -#: sql_help.c:5401 +#: sql_help.c:5681 msgid "discard session state" -msgstr "セッション状態を破棄します。" +msgstr "セッション状態を破棄します" -#: sql_help.c:5407 +#: sql_help.c:5687 msgid "execute an anonymous code block" -msgstr "無名コードブロックを実行します。" +msgstr "無名コードブロックを実行します" -#: sql_help.c:5413 +#: sql_help.c:5693 msgid "remove an access method" -msgstr "アクセスメソッドを削除します。" +msgstr "アクセスメソッドを削除します" -#: sql_help.c:5419 +#: sql_help.c:5699 msgid "remove an aggregate function" -msgstr "集約関数を削除します。" +msgstr "集約関数を削除します" -#: sql_help.c:5425 +#: sql_help.c:5705 msgid "remove a cast" -msgstr "キャストを削除します。" +msgstr "型変換を削除します" -#: sql_help.c:5431 +#: sql_help.c:5711 msgid "remove a collation" -msgstr "照合順序を削除します。" +msgstr "照合順序を削除します" -#: sql_help.c:5437 +#: sql_help.c:5717 msgid "remove a conversion" -msgstr "符号化方式変換を削除します。" +msgstr "符号化方式変換を削除します" -#: sql_help.c:5443 +#: sql_help.c:5723 msgid "remove a database" -msgstr "データベースを削除します。" +msgstr "データベースを削除します" -#: sql_help.c:5449 +#: sql_help.c:5729 msgid "remove a domain" -msgstr "ドメインを削除します。" +msgstr "ドメインを削除します" -#: sql_help.c:5455 +#: sql_help.c:5735 msgid "remove an event trigger" -msgstr "イベントトリガーを削除します。" +msgstr "イベントトリガーを削除します" -#: sql_help.c:5461 +#: sql_help.c:5741 msgid "remove an extension" -msgstr "拡張を削除します。" +msgstr "機能拡張を削除します" -#: sql_help.c:5467 +#: sql_help.c:5747 msgid "remove a foreign-data wrapper" -msgstr "外部データラッパを削除します。" +msgstr "外部データラッパを削除します" -#: sql_help.c:5473 +#: sql_help.c:5753 msgid "remove a foreign table" -msgstr "外部テーブルを削除します。" +msgstr "外部テーブルを削除します" -#: sql_help.c:5479 +#: sql_help.c:5759 msgid "remove a function" -msgstr "関数を削除します。" +msgstr "関数を削除します" -#: sql_help.c:5485 sql_help.c:5551 sql_help.c:5653 +#: sql_help.c:5765 sql_help.c:5831 sql_help.c:5933 msgid "remove a database role" -msgstr "データベースロールを削除します。" +msgstr "データベースロールを削除します" -#: sql_help.c:5491 +#: sql_help.c:5771 msgid "remove an index" -msgstr "インデックスを削除します。" +msgstr "インデックスを削除します" -#: sql_help.c:5497 +#: sql_help.c:5777 msgid "remove a procedural language" -msgstr "手続き言語を削除します。" +msgstr "手続き言語を削除します" -#: sql_help.c:5503 +#: sql_help.c:5783 msgid "remove a materialized view" -msgstr "マテリアライズドビューを削除します。" +msgstr "実体化ビューを削除します" -#: sql_help.c:5509 +#: sql_help.c:5789 msgid "remove an operator" -msgstr "演算子を削除します。" +msgstr "演算子を削除します" -#: sql_help.c:5515 +#: sql_help.c:5795 msgid "remove an operator class" -msgstr "演算子クラスを削除します。" +msgstr "演算子クラスを削除します" -#: sql_help.c:5521 +#: sql_help.c:5801 msgid "remove an operator family" -msgstr "演算子族を削除します。" +msgstr "演算子族を削除します" -#: sql_help.c:5527 +#: sql_help.c:5807 msgid "remove database objects owned by a database role" -msgstr "データベースロールが所有するデータベースオブジェクトを削除します。" +msgstr "データベースロールが所有するデータベースオブジェクトを削除します" -#: sql_help.c:5533 -msgid "remove a row level security policy from a table" -msgstr "テーブルから行レベルのセキュリティポリシーを削除します。" +#: sql_help.c:5813 +msgid "remove a row-level security policy from a table" +msgstr "テーブルから行レベルのセキュリティポリシーを削除します" -#: sql_help.c:5539 +#: sql_help.c:5819 msgid "remove a procedure" -msgstr "プロシージャを削除します。" +msgstr "プロシージャを削除します" -#: sql_help.c:5545 +#: sql_help.c:5825 msgid "remove a publication" -msgstr "パブリケーションを削除します。" +msgstr "パブリケーションを削除します" -#: sql_help.c:5557 +#: sql_help.c:5837 msgid "remove a routine" -msgstr "ルーチンを削除します。" +msgstr "ルーチンを削除します" -#: sql_help.c:5563 +#: sql_help.c:5843 msgid "remove a rewrite rule" -msgstr "書き換えルールを削除します。" +msgstr "書き換えルールを削除します" -#: sql_help.c:5569 +#: sql_help.c:5849 msgid "remove a schema" -msgstr "スキーマを削除します。" +msgstr "スキーマを削除します" -#: sql_help.c:5575 +#: sql_help.c:5855 msgid "remove a sequence" -msgstr "シーケンスを削除します。" +msgstr "シーケンスを削除します" -#: sql_help.c:5581 +#: sql_help.c:5861 msgid "remove a foreign server descriptor" -msgstr "外部サーバ記述子を削除します。" +msgstr "外部サーバー記述子を削除します" -#: sql_help.c:5587 +#: sql_help.c:5867 msgid "remove extended statistics" -msgstr "拡張統計情報を削除します。" +msgstr "拡張統計情報を削除します" -#: sql_help.c:5593 +#: sql_help.c:5873 msgid "remove a subscription" -msgstr "サブスクリプションを削除します。" +msgstr "サブスクリプションを削除します" -#: sql_help.c:5599 +#: sql_help.c:5879 msgid "remove a table" -msgstr "テーブルを削除します。" +msgstr "テーブルを削除します" -#: sql_help.c:5605 +#: sql_help.c:5885 msgid "remove a tablespace" -msgstr "テーブル空間を削除します。" +msgstr "テーブル空間を削除します" -#: sql_help.c:5611 +#: sql_help.c:5891 msgid "remove a text search configuration" -msgstr "テキスト検索設定を削除します。" +msgstr "テキスト検索設定を削除します" -#: sql_help.c:5617 +#: sql_help.c:5897 msgid "remove a text search dictionary" -msgstr "テキスト検索辞書を削除します。" +msgstr "テキスト検索辞書を削除します" -#: sql_help.c:5623 +#: sql_help.c:5903 msgid "remove a text search parser" -msgstr "テキスト検索パーサを削除します。" +msgstr "テキスト検索パーサーを削除します" -#: sql_help.c:5629 +#: sql_help.c:5909 msgid "remove a text search template" -msgstr "テキスト検索テンプレートを削除します。" +msgstr "テキスト検索テンプレートを削除します" -#: sql_help.c:5635 +#: sql_help.c:5915 msgid "remove a transform" -msgstr "自動変換ルールを削除します。" +msgstr "データ変換を削除します" -#: sql_help.c:5641 +#: sql_help.c:5921 msgid "remove a trigger" -msgstr "トリガーを削除します。" +msgstr "トリガーを削除します" -#: sql_help.c:5647 +#: sql_help.c:5927 msgid "remove a data type" -msgstr "データ型を削除します。" +msgstr "データ型を削除します" -#: sql_help.c:5659 +#: sql_help.c:5939 msgid "remove a user mapping for a foreign server" -msgstr "外部サーバのユーザマッピングを削除します。" +msgstr "外部サーバーのユーザーマッピングを削除します" -#: sql_help.c:5665 +#: sql_help.c:5945 msgid "remove a view" -msgstr "ビューを削除します。" +msgstr "ビューを削除します" -#: sql_help.c:5677 +#: sql_help.c:5957 msgid "execute a prepared statement" -msgstr "プリペアドステートメントを実行します。" +msgstr "準備した文を実行します" -#: sql_help.c:5683 +#: sql_help.c:5963 msgid "show the execution plan of a statement" -msgstr "ステートメントの実行計画を表示します。" +msgstr "文の実行計画を表示します" -#: sql_help.c:5689 +#: sql_help.c:5969 msgid "retrieve rows from a query using a cursor" -msgstr "カーソルを使って問い合わせから行を取り出します。" +msgstr "カーソルを使って問い合わせから行を取り出します" -#: sql_help.c:5695 +#: sql_help.c:5975 msgid "define access privileges" -msgstr "アクセス権限を定義します。" +msgstr "アクセス権限を定義します" -#: sql_help.c:5701 +#: sql_help.c:5981 msgid "import table definitions from a foreign server" -msgstr "外部サーバからテーブル定義をインポートします。" +msgstr "外部サーバーからテーブル定義をインポートします" -#: sql_help.c:5707 +#: sql_help.c:5987 msgid "create new rows in a table" -msgstr "テーブルに新しい行を作成します。" +msgstr "テーブルに新しい行を作成します" -#: sql_help.c:5713 +#: sql_help.c:5993 msgid "listen for a notification" -msgstr "通知メッセージを監視します。" +msgstr "通知メッセージを監視します" -#: sql_help.c:5719 +#: sql_help.c:5999 msgid "load a shared library file" -msgstr "共有ライブラリファイルをロードします。" +msgstr "共有ライブラリファイルをロードします" -#: sql_help.c:5725 +#: sql_help.c:6005 msgid "lock a table" -msgstr "テーブルをロックします。" +msgstr "テーブルをロックします" -#: sql_help.c:5731 +#: sql_help.c:6011 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "条件によってテーブルの行を挿入、更新または削除する" + +#: sql_help.c:6017 msgid "position a cursor" -msgstr "カーソルを位置づけます。" +msgstr "カーソルを位置づけます" -#: sql_help.c:5737 +#: sql_help.c:6023 msgid "generate a notification" -msgstr "通知を生成します。" +msgstr "通知を生成します" -#: sql_help.c:5743 +#: sql_help.c:6029 msgid "prepare a statement for execution" -msgstr "実行に備えてステートメントを準備します。" +msgstr "実行に備えて文を準備します" -#: sql_help.c:5749 +#: sql_help.c:6035 msgid "prepare the current transaction for two-phase commit" -msgstr "二相コミットに備えて現在のトランザクションを準備します。" +msgstr "二相コミットに備えて現在のトランザクションを準備します" -#: sql_help.c:5755 +#: sql_help.c:6041 msgid "change the ownership of database objects owned by a database role" -msgstr "データベースロールが所有するデータベースオブジェクトの所有権を変更します。" +msgstr "データベースロールが所有するデータベースオブジェクトの所有権を変更します" -#: sql_help.c:5761 +#: sql_help.c:6047 msgid "replace the contents of a materialized view" -msgstr "マテリアライズドビューの内容を置き換えます。" +msgstr "実体化ビューの内容を置き換えます" -#: sql_help.c:5767 +#: sql_help.c:6053 msgid "rebuild indexes" -msgstr "インデックスを再構築します。" +msgstr "インデックスを再構築します" -#: sql_help.c:5773 +#: sql_help.c:6059 msgid "destroy a previously defined savepoint" -msgstr "以前に定義されたセーブポイントを破棄します。" +msgstr "以前に定義されたセーブポイントを破棄します" -#: sql_help.c:5779 +#: sql_help.c:6065 msgid "restore the value of a run-time parameter to the default value" -msgstr "実行時パラメータの値をデフォルト値に戻します。" +msgstr "実行時パラメータの値をデフォルト値に戻します" -#: sql_help.c:5785 +#: sql_help.c:6071 msgid "remove access privileges" -msgstr "アクセス特権を削除します。" +msgstr "アクセス権限を削除します" -#: sql_help.c:5797 +#: sql_help.c:6083 msgid "cancel a transaction that was earlier prepared for two-phase commit" -msgstr "二相コミットのために事前に準備されたトランザクションをキャンセルします。" +msgstr "二相コミットのために事前に準備されたトランザクションをキャンセルします" -#: sql_help.c:5803 +#: sql_help.c:6089 msgid "roll back to a savepoint" -msgstr "セーブポイントまでロールバックします。" +msgstr "セーブポイントまでロールバックします" -#: sql_help.c:5809 +#: sql_help.c:6095 msgid "define a new savepoint within the current transaction" -msgstr "現在のトランザクション内で新しいセーブポイントを定義します。" +msgstr "現在のトランザクション内で新しいセーブポイントを定義します" -#: sql_help.c:5815 +#: sql_help.c:6101 msgid "define or change a security label applied to an object" -msgstr "オブジェクトに適用されるセキュリティラベルを定義または変更します。" +msgstr "オブジェクトに適用されるセキュリティラベルを定義または変更します" -#: sql_help.c:5821 sql_help.c:5875 sql_help.c:5911 +#: sql_help.c:6107 sql_help.c:6161 sql_help.c:6197 msgid "retrieve rows from a table or view" -msgstr "テーブルまたはビューから行を取得します。" +msgstr "テーブルまたはビューから行を取得します" -#: sql_help.c:5833 +#: sql_help.c:6119 msgid "change a run-time parameter" -msgstr "実行時のパラメータを変更します。" +msgstr "実行時パラメータを変更します" -#: sql_help.c:5839 +#: sql_help.c:6125 msgid "set constraint check timing for the current transaction" -msgstr "現在のトランザクションについて、制約チェックのタイミングを設定します。" +msgstr "現在のトランザクションについて、制約チェックのタイミングを設定します" -#: sql_help.c:5845 +#: sql_help.c:6131 msgid "set the current user identifier of the current session" -msgstr "現在のセッションの現在のユーザ識別子を設定します。" +msgstr "現在のセッションの現在のユーザ識別子を設定します" -#: sql_help.c:5851 +#: sql_help.c:6137 msgid "set the session user identifier and the current user identifier of the current session" -msgstr "セッションのユーザ識別子および現在のセッションの現在のユーザ識別子を設定します。" +msgstr "セッションのユーザ識別子および現在のセッションの現在のユーザ識別子を設定します" -#: sql_help.c:5857 +#: sql_help.c:6143 msgid "set the characteristics of the current transaction" -msgstr "現在のトランザクションの特性を設定します。" +msgstr "現在のトランザクションの特性を設定します" -#: sql_help.c:5863 +#: sql_help.c:6149 msgid "show the value of a run-time parameter" -msgstr "実行時パラメータの値を表示します。" +msgstr "実行時パラメータの値を表示します" -#: sql_help.c:5881 +#: sql_help.c:6167 msgid "empty a table or set of tables" -msgstr "テーブルもしくはテーブルセットを0件に切り詰めます。" +msgstr "一つの、または複数のテーブルを空にします" -#: sql_help.c:5887 +#: sql_help.c:6173 msgid "stop listening for a notification" -msgstr "通知メッセージの監視を中止します。" +msgstr "通知メッセージの監視を中止します" -#: sql_help.c:5893 +#: sql_help.c:6179 msgid "update rows of a table" -msgstr "テーブルの行を更新します。" +msgstr "テーブルの行を更新します" -#: sql_help.c:5899 +#: sql_help.c:6185 msgid "garbage-collect and optionally analyze a database" -msgstr "ガーベッジコレクションを行い、また必要に応じてデータベースを分析します。" +msgstr "ガーベッジコレクションを行い、また必要に応じてデータベースを分析します" -#: sql_help.c:5905 +#: sql_help.c:6191 msgid "compute a set of rows" -msgstr "行セットを計算します。" +msgstr "行セットを計算します" -#: startup.c:212 +#: startup.c:220 #, c-format msgid "-1 can only be used in non-interactive mode" msgstr "-1 は非対話モード時でのみ使用可能です" -#: startup.c:299 -#, c-format -msgid "could not connect to server: %s" -msgstr "サーバに接続できませんでした: %s" - -#: startup.c:327 +#: startup.c:343 #, c-format msgid "could not open log file \"%s\": %m" msgstr "ロックファイル\"%s\"をオープンできませんでした: %m" -#: startup.c:439 +#: startup.c:453 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6360,27 +6632,27 @@ msgstr "" "\"help\"でヘルプを表示します。\n" "\n" -#: startup.c:589 +#: startup.c:605 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "表示パラメータ\"%s\"を設定できませんでした" -#: startup.c:697 +#: startup.c:712 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "詳細は\"%s --help\"をごらんください。\n" +msgid "Try \"%s --help\" for more information." +msgstr "詳細は\"%s --help\"を実行してください。" -#: startup.c:714 +#: startup.c:728 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "余分なコマンドライン引数\"%s\"は無視されました" -#: startup.c:763 +#: startup.c:776 #, c-format msgid "could not find own program executable" msgstr "実行可能ファイルが見つかりませんでした" -#: tab-complete.c:4672 +#: tab-complete.c:5920 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6406,7 +6678,7 @@ msgstr "\"%2$s\"の値\"%1$s\"が不正です: 整数を指定してください msgid "invalid variable name: \"%s\"" msgstr "変数名が不正です: \"%s\"" -#: variables.c:393 +#: variables.c:419 #, c-format msgid "" "unrecognized value \"%s\" for \"%s\"\n" @@ -6415,6 +6687,81 @@ msgstr "" "\"%2$s\"の値\"%1$s\"が認識できません。\n" "有効な値は %3$s。" +#~ msgid "fatal: " +#~ msgstr "致命的エラー: " + +#~ msgid "pclose failed: %m" +#~ msgstr "pcloseが失敗しました: %m" + +#~ msgid "Could not send cancel request: %s" +#~ msgstr "キャンセル要求を送信できませんでした: %s" + +#~ msgid "The server (version %s) does not support editing function source." +#~ msgstr "このサーバ(バージョン%s)は関数ソースコードの編集をサポートしていません。" + +#~ msgid "The server (version %s) does not support editing view definitions." +#~ msgstr "このサーバ(バージョン%s)はビュー定義の編集をサポートしていません。" + +#~ msgid "Enter new password: " +#~ msgstr "新しいパスワードを入力してください: " + +#~ msgid "The server (version %s) does not support showing function source." +#~ msgstr "このサーバ(バージョン%s)は関数ソースの表示をサポートしていません。" + +#~ msgid "The server (version %s) does not support showing view definitions." +#~ msgstr "このサーバ(バージョン%s)はビュー定義の表示をサポートしていません。" + +#~ msgid "All connection parameters must be supplied because no database connection exists" +#~ msgstr "既存のデータベース接続がないため、すべての接続パラメータを指定しなければなりません" + +#~ msgid "unexpected result status for \\watch" +#~ msgstr "\\watchで想定外の結果ステータス" + +#~ msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." +#~ msgstr "このサーバ(バージョン%s)はON_ERROR_ROLLBACKのためのセーブポイントをサポートしていません。" + +#~ msgid "The server (version %s) does not support tablespaces." +#~ msgstr "このサーバ(バージョン%s) はテーブル空間をサポートしていません。" + +#~ msgid "The server (version %s) does not support altering default privileges." +#~ msgstr "このサーバ(バージョン%s)はデフォルト権限の変更をサポートしていません。" + +#~ msgid "Special relation \"%s.%s\"" +#~ msgstr "特殊なリレーション\"%s.%s\"" + +#~ msgid "Disabled triggers:" +#~ msgstr "無効化されたトリガー:" + +#~ msgid "The server (version %s) does not support per-database role settings." +#~ msgstr "このサーバ(バージョン%s)はデータベースごとのロール設定をサポートしていません。" + +#~ msgid "special" +#~ msgstr "特殊" + +#~ msgid "The server (version %s) does not support collations." +#~ msgstr "このサーバ(バージョン%s)は照合順序をサポートしていません。" + +#~ msgid "The server (version %s) does not support full text search." +#~ msgstr "このサーバ(バージョン%s)は全文検索をサポートしていません。" + +#~ msgid "The server (version %s) does not support foreign-data wrappers." +#~ msgstr "このサーバ(バージョン%s)は外部データラッパをサポートしていません。" + +#~ msgid "The server (version %s) does not support foreign servers." +#~ msgstr "このサーバ(バージョン%s)は外部サーバをサポートしていません。" + +#~ msgid "The server (version %s) does not support user mappings." +#~ msgstr "このサーバ(バージョン%s)はユーザマッピングをサポートしていません。" + +#~ msgid "The server (version %s) does not support foreign tables." +#~ msgstr "このサーバ(バージョン%s)は外部テーブルをサポートしていません。" + +#~ msgid "could not connect to server: %s" +#~ msgstr "サーバに接続できませんでした: %s" + +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "詳細は\"%s --help\"をごらんください。\n" + #~ msgid "could not identify current directory: %s" #~ msgstr "カレントディレクトリを特定できませんでした: %s" @@ -6487,11 +6834,5 @@ msgstr "" #~ msgid "from_list" #~ msgstr "FROMリスト" -#~ msgid "using_list" -#~ msgstr "USINGリスト" - -#~ msgid "old_version" -#~ msgstr "旧バージョン" - #~ msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n" #~ msgstr " \\g [ファイル] または ; 問い合わせを実行(し、結果をファイルまたは |パイプ へ出力)します。\n" diff --git a/src/bin/psql/po/ru.po b/src/bin/psql/po/ru.po index 5e6303c655..64813d86bf 100644 --- a/src/bin/psql/po/ru.po +++ b/src/bin/psql/po/ru.po @@ -4,13 +4,14 @@ # Serguei A. Mokhov , 2001-2005. # Oleg Bartunov , 2004-2005. # Sergey Burladyan , 2012. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022. +# Maxim Yablokov , 2021. msgid "" msgstr "" "Project-Id-Version: psql (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-02-08 07:28+0300\n" -"PO-Revision-Date: 2020-11-20 15:23+0300\n" +"POT-Creation-Date: 2022-02-07 11:21+0300\n" +"PO-Revision-Date: 2022-02-07 11:38+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -20,58 +21,58 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "важно: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "ошибка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "предупреждение: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "не удалось определить текущий каталог: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "неверный исполняемый файл \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "не удалось прочитать исполняемый файл \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "не удалось найти запускаемый файл \"%s\"" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не удалось перейти в каталог \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не удалось прочитать символическую ссылку \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:409 #, c-format -msgid "pclose failed: %m" -msgstr "ошибка pclose: %m" +msgid "%s() failed: %m" +msgstr "ошибка в %s(): %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 -#: command.c:1255 command.c:3173 command.c:3222 command.c:3339 input.c:227 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 +#: command.c:1315 command.c:3254 command.c:3303 command.c:3420 input.c:227 #: mainloop.c:81 mainloop.c:402 #, c-format msgid "out of memory" @@ -93,7 +94,7 @@ msgstr "попытка дублирования нулевого указате msgid "could not look up effective user ID %ld: %s" msgstr "выяснить эффективный идентификатор пользователя (%ld) не удалось: %s" -#: ../../common/username.c:45 command.c:559 +#: ../../common/username.c:45 command.c:565 msgid "user does not exist" msgstr "пользователь не существует" @@ -132,15 +133,15 @@ msgstr "дочерний процесс завершён по сигналу %d: msgid "child process exited with unrecognized status %d" msgstr "дочерний процесс завершился с нераспознанным состоянием %d" -#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 msgid "Cancel request sent\n" msgstr "Сигнал отмены отправлен\n" -#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 msgid "Could not send cancel request: " msgstr "Отправить сигнал отмены не удалось: " -#: ../../fe_utils/print.c:350 +#: ../../fe_utils/print.c:336 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" @@ -148,71 +149,71 @@ msgstr[0] "(%lu строка)" msgstr[1] "(%lu строки)" msgstr[2] "(%lu строк)" -#: ../../fe_utils/print.c:3055 +#: ../../fe_utils/print.c:3039 #, c-format msgid "Interrupted\n" msgstr "Прервано\n" -#: ../../fe_utils/print.c:3119 +#: ../../fe_utils/print.c:3103 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "" "Ошибка добавления заголовка таблицы: превышен предел числа столбцов (%d).\n" -#: ../../fe_utils/print.c:3159 +#: ../../fe_utils/print.c:3143 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "" "Ошибка добавления ячейки в таблицу: превышен предел числа ячеек (%d).\n" -#: ../../fe_utils/print.c:3414 +#: ../../fe_utils/print.c:3401 #, c-format msgid "invalid output format (internal error): %d" msgstr "неверный формат вывода (внутренняя ошибка): %d" -#: ../../fe_utils/psqlscan.l:694 +#: ../../fe_utils/psqlscan.l:697 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "рекурсивное расширение переменной \"%s\" пропускается" -#: command.c:224 +#: command.c:230 #, c-format msgid "invalid command \\%s" msgstr "неверная команда \\%s" -#: command.c:226 +#: command.c:232 #, c-format msgid "Try \\? for help." msgstr "Введите \\? для получения справки." -#: command.c:244 +#: command.c:250 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: лишний аргумент \"%s\" пропущен" -#: command.c:296 +#: command.c:302 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "" "команда \\%s игнорируется; добавьте \\endif или нажмите Ctrl-C для " "завершения текущего блока \\if" -#: command.c:557 +#: command.c:563 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "не удалось получить домашний каталог пользователя c ид. %ld: %s" -#: command.c:575 +#: command.c:581 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: не удалось перейти в каталог \"%s\": %m" -#: command.c:600 +#: command.c:606 #, c-format msgid "You are currently not connected to a database.\n" msgstr "В данный момент вы не подключены к базе данных.\n" -#: command.c:613 +#: command.c:616 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at " @@ -221,7 +222,7 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" (адрес сервера " "\"%s\", порт \"%s\").\n" -#: command.c:616 +#: command.c:619 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at " @@ -230,7 +231,7 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" через сокет в \"%s" "\", порт \"%s\".\n" -#: command.c:622 +#: command.c:625 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address " @@ -239,7 +240,7 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" (сервер \"%s\": " "адрес \"%s\", порт \"%s\").\n" -#: command.c:625 +#: command.c:628 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port " @@ -248,187 +249,194 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" (сервер \"%s\", " "порт \"%s\").\n" -#: command.c:965 command.c:1061 command.c:2550 +#: command.c:1012 command.c:1121 command.c:2610 #, c-format msgid "no query buffer" msgstr "нет буфера запросов" -#: command.c:998 command.c:5171 +#: command.c:1045 command.c:5312 #, c-format msgid "invalid line number: %s" msgstr "неверный номер строки: %s" -#: command.c:1052 +#: command.c:1112 #, c-format msgid "The server (version %s) does not support editing function source." msgstr "" "Сервер (версия %s) не поддерживает редактирование исходного кода функции." -#: command.c:1055 +#: command.c:1115 #, c-format msgid "The server (version %s) does not support editing view definitions." msgstr "" "Сервер (версия %s) не поддерживает редактирование определения представления." -#: command.c:1137 +#: command.c:1197 msgid "No changes" msgstr "Изменений нет" -#: command.c:1216 +#: command.c:1276 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "" "%s: неверное название кодировки символов или не найдена процедура " "перекодировки" -#: command.c:1251 command.c:1992 command.c:3169 command.c:3361 command.c:5273 -#: common.c:174 common.c:223 common.c:388 common.c:1244 common.c:1272 -#: common.c:1380 common.c:1487 common.c:1525 copy.c:488 copy.c:707 help.c:62 -#: large_obj.c:157 large_obj.c:192 large_obj.c:254 startup.c:299 +#: command.c:1311 command.c:2063 command.c:3250 command.c:3442 command.c:5414 +#: common.c:174 common.c:223 common.c:392 common.c:1248 common.c:1276 +#: common.c:1385 common.c:1492 common.c:1530 copy.c:488 copy.c:709 help.c:62 +#: large_obj.c:157 large_obj.c:192 large_obj.c:254 startup.c:298 #, c-format msgid "%s" msgstr "%s" -#: command.c:1258 +#: command.c:1318 msgid "There is no previous error." msgstr "Ошибки не было." -#: command.c:1371 +#: command.c:1431 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: отсутствует правая скобка" -#: command.c:1548 command.c:1853 command.c:1867 command.c:1884 command.c:2044 -#: command.c:2281 command.c:2517 command.c:2557 +#: command.c:1608 command.c:1913 command.c:1927 command.c:1944 command.c:2114 +#: command.c:2350 command.c:2577 command.c:2617 #, c-format msgid "\\%s: missing required argument" msgstr "отсутствует необходимый аргумент \\%s" -#: command.c:1679 +#: command.c:1739 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif не может находиться после \\else" -#: command.c:1684 +#: command.c:1744 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif без соответствующего \\if" -#: command.c:1748 +#: command.c:1808 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else не может находиться после \\else" -#: command.c:1753 +#: command.c:1813 #, c-format msgid "\\else: no matching \\if" msgstr "\\else без соответствующего \\if" -#: command.c:1793 +#: command.c:1853 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif без соответствующего \\if" -#: command.c:1948 +#: command.c:2008 msgid "Query buffer is empty." msgstr "Буфер запроса пуст." -#: command.c:1970 -msgid "Enter new password: " -msgstr "Введите новый пароль: " +#: command.c:2045 +#, c-format +msgid "Enter new password for user \"%s\": " +msgstr "Введите новый пароль для пользователя \"%s\": " -#: command.c:1971 +#: command.c:2048 msgid "Enter it again: " msgstr "Повторите его: " -#: command.c:1975 +#: command.c:2052 #, c-format msgid "Passwords didn't match." msgstr "Пароли не совпадают." -#: command.c:2074 +#: command.c:2143 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: не удалось прочитать значение переменной" -#: command.c:2177 +#: command.c:2246 msgid "Query buffer reset (cleared)." msgstr "Буфер запроса сброшен (очищен)." -#: command.c:2199 +#: command.c:2268 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "История записана в файл \"%s\".\n" -#: command.c:2286 +#: command.c:2355 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: имя переменной окружения не может содержать знак \"=\"" -#: command.c:2347 +#: command.c:2407 #, c-format msgid "The server (version %s) does not support showing function source." msgstr "Сервер (версия %s) не поддерживает вывод исходного кода функции." -#: command.c:2350 +#: command.c:2410 #, c-format msgid "The server (version %s) does not support showing view definitions." msgstr "Сервер (версия %s) не поддерживает вывод определения представлений." -#: command.c:2357 +#: command.c:2417 #, c-format msgid "function name is required" msgstr "требуется имя функции" -#: command.c:2359 +#: command.c:2419 #, c-format msgid "view name is required" msgstr "требуется имя представления" -#: command.c:2489 +#: command.c:2549 msgid "Timing is on." msgstr "Секундомер включён." -#: command.c:2491 +#: command.c:2551 msgid "Timing is off." msgstr "Секундомер выключен." -#: command.c:2576 command.c:2604 command.c:3771 command.c:3774 command.c:3777 -#: command.c:3783 command.c:3785 command.c:3793 command.c:3803 command.c:3812 -#: command.c:3826 command.c:3843 command.c:3901 common.c:70 copy.c:331 +#: command.c:2636 command.c:2664 command.c:3881 command.c:3884 command.c:3887 +#: command.c:3893 command.c:3895 command.c:3921 command.c:3931 command.c:3943 +#: command.c:3957 command.c:3984 command.c:4042 common.c:70 copy.c:331 #: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:2988 startup.c:236 startup.c:287 +#: command.c:3055 startup.c:237 startup.c:287 msgid "Password: " msgstr "Пароль: " -#: command.c:2993 startup.c:284 +#: command.c:3060 startup.c:284 #, c-format msgid "Password for user %s: " msgstr "Пароль пользователя %s: " -#: command.c:3047 +#: command.c:3112 #, c-format msgid "" -"All connection parameters must be supplied because no database connection " -"exists" +"Do not give user, host, or port separately when using a connection string" msgstr "" -"Без подключения к базе данных необходимо указывать все параметры подключения" +"Не указывайте пользователя, сервер или порт отдельно, когда используете " +"строку подключения" -#: command.c:3367 +#: command.c:3147 +#, c-format +msgid "No database connection exists to re-use parameters from" +msgstr "" +"Нет подключения к базе, из которого можно было бы использовать параметры" + +#: command.c:3448 #, c-format msgid "Previous connection kept" msgstr "Сохранено предыдущее подключение" -#: command.c:3373 +#: command.c:3454 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3420 +#: command.c:3510 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at " @@ -437,7 +445,7 @@ msgstr "" "Сейчас вы подключены к базе данных \"%s\" как пользователь \"%s\" (адрес " "сервера \"%s\", порт \"%s\").\n" -#: command.c:3423 +#: command.c:3513 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" " @@ -446,7 +454,7 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" через сокет в \"%s" "\", порт \"%s\".\n" -#: command.c:3429 +#: command.c:3519 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on host \"%s" @@ -455,7 +463,7 @@ msgstr "" "Сейчас вы подключены к базе данных \"%s\" как пользователь \"%s\" (сервер " "\"%s\": адрес \"%s\", порт \"%s\").\n" -#: command.c:3432 +#: command.c:3522 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at " @@ -464,17 +472,17 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" (сервер \"%s\", " "порт \"%s\").\n" -#: command.c:3437 +#: command.c:3527 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Вы подключены к базе данных \"%s\" как пользователь \"%s\".\n" -#: command.c:3470 +#: command.c:3567 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, сервер %s)\n" -#: command.c:3478 +#: command.c:3575 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -483,29 +491,29 @@ msgstr "" "ПРЕДУПРЕЖДЕНИЕ: %s имеет базовую версию %s, а сервер - %s.\n" " Часть функций psql может не работать.\n" -#: command.c:3517 +#: command.c:3614 #, c-format msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" msgstr "SSL-соединение (протокол: %s, шифр: %s, бит: %s, сжатие: %s)\n" -#: command.c:3518 command.c:3519 command.c:3520 +#: command.c:3615 command.c:3616 command.c:3617 msgid "unknown" msgstr "неизвестно" -#: command.c:3521 help.c:45 +#: command.c:3618 help.c:45 msgid "off" msgstr "выкл." -#: command.c:3521 help.c:45 +#: command.c:3618 help.c:45 msgid "on" msgstr "вкл." -#: command.c:3535 +#: command.c:3632 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "Соединение зашифровано GSSAPI\n" -#: command.c:3555 +#: command.c:3652 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -518,7 +526,7 @@ msgstr "" " Подробнее об этом смотрите документацию psql, раздел\n" " \"Notes for Windows users\".\n" -#: command.c:3659 +#: command.c:3757 #, c-format msgid "" "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a " @@ -527,33 +535,33 @@ msgstr "" "в переменной окружения PSQL_EDITOR_LINENUMBER_ARG должен быть указан номер " "строки" -#: command.c:3688 +#: command.c:3786 #, c-format msgid "could not start editor \"%s\"" msgstr "не удалось запустить редактор \"%s\"" -#: command.c:3690 +#: command.c:3788 #, c-format msgid "could not start /bin/sh" msgstr "не удалось запустить /bin/sh" -#: command.c:3728 +#: command.c:3838 #, c-format msgid "could not locate temporary directory: %s" msgstr "не удалось найти временный каталог: %s" -#: command.c:3755 +#: command.c:3865 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "не удалось открыть временный файл \"%s\": %m" -#: command.c:4060 +#: command.c:4201 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "" "\\pset: неоднозначному сокращению \"%s\" соответствует и \"%s\", и \"%s\"" -#: command.c:4080 +#: command.c:4221 #, c-format msgid "" "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-" @@ -562,32 +570,32 @@ msgstr "" "\\pset: допустимые форматы: aligned, asciidoc, csv, html, latex, latex-" "longtable, troff-ms, unaligned, wrapped" -#: command.c:4099 +#: command.c:4240 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: допустимые стили линий: ascii, old-ascii, unicode" -#: command.c:4114 +#: command.c:4255 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: допустимые стили Unicode-линий границ: single, double" -#: command.c:4129 +#: command.c:4270 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: допустимые стили Unicode-линий столбцов: single, double" -#: command.c:4144 +#: command.c:4285 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: допустимые стили Unicode-линий заголовков: single, double" -#: command.c:4187 +#: command.c:4328 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: символ csv_fieldsep должен быть однобайтовым" -#: command.c:4192 +#: command.c:4333 #, c-format msgid "" "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage " @@ -596,107 +604,107 @@ msgstr "" "\\pset: в качестве csv_fieldsep нельзя выбрать символ кавычек, новой строки " "или возврата каретки" -#: command.c:4329 command.c:4517 +#: command.c:4470 command.c:4658 #, c-format msgid "\\pset: unknown option: %s" msgstr "неизвестный параметр \\pset: %s" -#: command.c:4349 +#: command.c:4490 #, c-format msgid "Border style is %d.\n" msgstr "Стиль границ: %d.\n" -#: command.c:4355 +#: command.c:4496 #, c-format msgid "Target width is unset.\n" msgstr "Ширина вывода сброшена.\n" -#: command.c:4357 +#: command.c:4498 #, c-format msgid "Target width is %d.\n" msgstr "Ширина вывода: %d.\n" -#: command.c:4364 +#: command.c:4505 #, c-format msgid "Expanded display is on.\n" msgstr "Расширенный вывод включён.\n" -#: command.c:4366 +#: command.c:4507 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Расширенный вывод применяется автоматически.\n" -#: command.c:4368 +#: command.c:4509 #, c-format msgid "Expanded display is off.\n" msgstr "Расширенный вывод выключен.\n" -#: command.c:4374 +#: command.c:4515 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Разделитель полей для CSV: \"%s\".\n" -#: command.c:4382 command.c:4390 +#: command.c:4523 command.c:4531 #, c-format msgid "Field separator is zero byte.\n" msgstr "Разделитель полей - нулевой байт.\n" -#: command.c:4384 +#: command.c:4525 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Разделитель полей: \"%s\".\n" -#: command.c:4397 +#: command.c:4538 #, c-format msgid "Default footer is on.\n" msgstr "Строка итогов включена.\n" -#: command.c:4399 +#: command.c:4540 #, c-format msgid "Default footer is off.\n" msgstr "Строка итогов выключена.\n" -#: command.c:4405 +#: command.c:4546 #, c-format msgid "Output format is %s.\n" msgstr "Формат вывода: %s.\n" -#: command.c:4411 +#: command.c:4552 #, c-format msgid "Line style is %s.\n" msgstr "Установлен стиль линий: %s.\n" -#: command.c:4418 +#: command.c:4559 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null выводится как: \"%s\".\n" -#: command.c:4426 +#: command.c:4567 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Локализованный вывод чисел включён.\n" -#: command.c:4428 +#: command.c:4569 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Локализованный вывод чисел выключен.\n" -#: command.c:4435 +#: command.c:4576 #, c-format msgid "Pager is used for long output.\n" msgstr "Постраничник используется для вывода длинного текста.\n" -#: command.c:4437 +#: command.c:4578 #, c-format msgid "Pager is always used.\n" msgstr "Постраничник используется всегда.\n" -#: command.c:4439 +#: command.c:4580 #, c-format msgid "Pager usage is off.\n" msgstr "Постраничник выключен.\n" -#: command.c:4445 +#: command.c:4586 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" @@ -704,87 +712,87 @@ msgstr[0] "Постраничник не будет использоваться msgstr[1] "Постраничник не будет использоваться, если строк меньше %d\n" msgstr[2] "Постраничник не будет использоваться, если строк меньше %d\n" -#: command.c:4455 command.c:4465 +#: command.c:4596 command.c:4606 #, c-format msgid "Record separator is zero byte.\n" msgstr "Разделитель записей - нулевой байт.\n" -#: command.c:4457 +#: command.c:4598 #, c-format msgid "Record separator is .\n" msgstr "Разделитель записей: <новая строка>.\n" -#: command.c:4459 +#: command.c:4600 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Разделитель записей: \"%s\".\n" -#: command.c:4472 +#: command.c:4613 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Атрибуты HTML-таблицы: \"%s\".\n" -#: command.c:4475 +#: command.c:4616 #, c-format msgid "Table attributes unset.\n" msgstr "Атрибуты HTML-таблицы не заданы.\n" -#: command.c:4482 +#: command.c:4623 #, c-format msgid "Title is \"%s\".\n" msgstr "Заголовок: \"%s\".\n" -#: command.c:4484 +#: command.c:4625 #, c-format msgid "Title is unset.\n" msgstr "Заголовок не задан.\n" -#: command.c:4491 +#: command.c:4632 #, c-format msgid "Tuples only is on.\n" msgstr "Режим вывода только кортежей включён.\n" -#: command.c:4493 +#: command.c:4634 #, c-format msgid "Tuples only is off.\n" msgstr "Режим вывода только кортежей выключен.\n" -#: command.c:4499 +#: command.c:4640 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Стиль Unicode-линий границ: \"%s\".\n" -#: command.c:4505 +#: command.c:4646 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Стиль Unicode-линий столбцов: \"%s\".\n" -#: command.c:4511 +#: command.c:4652 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Стиль Unicode-линий границ: \"%s\".\n" -#: command.c:4744 +#: command.c:4885 #, c-format msgid "\\!: failed" msgstr "\\!: ошибка" -#: command.c:4769 common.c:648 +#: command.c:4910 common.c:652 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch нельзя использовать с пустым запросом" -#: command.c:4810 +#: command.c:4951 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (обновление: %g с)\n" -#: command.c:4813 +#: command.c:4954 #, c-format msgid "%s (every %gs)\n" msgstr "%s (обновление: %g с)\n" -#: command.c:4867 command.c:4874 common.c:548 common.c:555 common.c:1227 +#: command.c:5008 command.c:5015 common.c:552 common.c:559 common.c:1231 #, c-format msgid "" "********* QUERY **********\n" @@ -797,12 +805,12 @@ msgstr "" "**************************\n" "\n" -#: command.c:5066 +#: command.c:5207 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\" — не представление" -#: command.c:5082 +#: command.c:5223 #, c-format msgid "could not parse reloptions array" msgstr "не удалось разобрать массив reloptions" @@ -834,52 +842,52 @@ msgstr "Подключение к серверу потеряно. Попытк msgid "Failed.\n" msgstr "неудачна.\n" -#: common.c:326 +#: common.c:330 #, c-format msgid "Succeeded.\n" msgstr "удачна.\n" -#: common.c:378 common.c:945 common.c:1162 +#: common.c:382 common.c:949 common.c:1166 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "неожиданное значение PQresultStatus: %d" -#: common.c:487 +#: common.c:491 #, c-format msgid "Time: %.3f ms\n" msgstr "Время: %.3f мс\n" -#: common.c:502 +#: common.c:506 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Время: %.3f мс (%02d:%06.3f)\n" -#: common.c:511 +#: common.c:515 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Время: %.3f мс (%02d:%02d:%06.3f)\n" -#: common.c:518 +#: common.c:522 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Время: %.3f мс (%.0f д. %02d:%02d:%06.3f)\n" -#: common.c:542 common.c:600 common.c:1198 +#: common.c:546 common.c:604 common.c:1202 #, c-format msgid "You are currently not connected to a database." msgstr "В данный момент вы не подключены к базе данных." -#: common.c:655 +#: common.c:659 #, c-format msgid "\\watch cannot be used with COPY" msgstr "\\watch нельзя использовать с COPY" -#: common.c:660 +#: common.c:664 #, c-format msgid "unexpected result status for \\watch" msgstr "неожиданное состояние результата для \\watch" -#: common.c:690 +#: common.c:694 #, c-format msgid "" "Asynchronous notification \"%s\" with payload \"%s\" received from server " @@ -888,34 +896,34 @@ msgstr "" "Получено асинхронное уведомление \"%s\" с сообщением-нагрузкой \"%s\" от " "серверного процесса с PID %d.\n" -#: common.c:693 +#: common.c:697 #, c-format msgid "" "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "" "Получено асинхронное уведомление \"%s\" от серверного процесса с PID %d.\n" -#: common.c:726 common.c:743 +#: common.c:730 common.c:747 #, c-format msgid "could not print result table: %m" msgstr "не удалось вывести таблицу результатов: %m" -#: common.c:764 +#: common.c:768 #, c-format msgid "no rows returned for \\gset" msgstr "сервер не возвратил строк для \\gset" -#: common.c:769 +#: common.c:773 #, c-format msgid "more than one row returned for \\gset" msgstr "сервер возвратил больше одной строки для \\gset" -#: common.c:787 +#: common.c:791 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "попытка выполнить \\gset со специальной переменной \"%s\" игнорируется" -#: common.c:1207 +#: common.c:1211 #, c-format msgid "" "***(Single step mode: verify " @@ -929,35 +937,35 @@ msgstr "" "%s\n" "***(Enter - выполнение; x и Enter - отмена)**************\n" -#: common.c:1262 +#: common.c:1266 #, c-format msgid "" "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." msgstr "" "Сервер (версия %s) не поддерживает точки сохранения для ON_ERROR_ROLLBACK." -#: common.c:1325 +#: common.c:1329 #, c-format msgid "STATEMENT: %s" msgstr "ОПЕРАТОР: %s" -#: common.c:1368 +#: common.c:1373 #, c-format msgid "unexpected transaction status (%d)" msgstr "неожиданное состояние транзакции (%d)" -#: common.c:1509 describe.c:2001 +#: common.c:1514 describe.c:2179 msgid "Column" msgstr "Столбец" -#: common.c:1510 describe.c:177 describe.c:393 describe.c:411 describe.c:456 -#: describe.c:473 describe.c:962 describe.c:1126 describe.c:1711 -#: describe.c:1735 describe.c:2002 describe.c:3733 describe.c:3943 -#: describe.c:4176 describe.c:5382 +#: common.c:1515 describe.c:178 describe.c:396 describe.c:414 describe.c:459 +#: describe.c:476 describe.c:1128 describe.c:1292 describe.c:1878 +#: describe.c:1902 describe.c:2180 describe.c:4071 describe.c:4294 +#: describe.c:4519 describe.c:5817 msgid "Type" msgstr "Тип" -#: common.c:1559 +#: common.c:1564 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "Команда не выдала результат, либо в результате нет столбцов.\n" @@ -1024,11 +1032,11 @@ msgstr "" "Вводите данные для копирования, разделяя строки переводом строки.\n" "Закончите ввод строкой '\\.' или сигналом EOF." -#: copy.c:669 +#: copy.c:671 msgid "aborted because of read failure" msgstr "прерывание из-за ошибки чтения" -#: copy.c:703 +#: copy.c:705 msgid "trying to exit copy mode" msgstr "попытка выйти из режима копирования" @@ -1088,766 +1096,771 @@ msgstr "\\crosstabview: неоднозначное имя столбца: \"%s\" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: имя столбца не найдено: \"%s\"" -#: describe.c:75 describe.c:373 describe.c:678 describe.c:810 describe.c:954 -#: describe.c:1115 describe.c:1187 describe.c:3722 describe.c:3930 -#: describe.c:4174 describe.c:4265 describe.c:4532 describe.c:4692 -#: describe.c:4933 describe.c:5008 describe.c:5019 describe.c:5081 -#: describe.c:5506 describe.c:5589 +#: describe.c:76 describe.c:376 describe.c:728 describe.c:924 describe.c:1120 +#: describe.c:1281 describe.c:1353 describe.c:4059 describe.c:4281 +#: describe.c:4517 describe.c:4608 describe.c:4754 describe.c:4967 +#: describe.c:5127 describe.c:5368 describe.c:5443 describe.c:5454 +#: describe.c:5516 describe.c:5941 describe.c:6024 msgid "Schema" msgstr "Схема" -#: describe.c:76 describe.c:174 describe.c:242 describe.c:250 describe.c:374 -#: describe.c:679 describe.c:811 describe.c:872 describe.c:955 describe.c:1188 -#: describe.c:3723 describe.c:3931 describe.c:4097 describe.c:4175 -#: describe.c:4266 describe.c:4345 describe.c:4533 describe.c:4617 -#: describe.c:4693 describe.c:4934 describe.c:5009 describe.c:5020 -#: describe.c:5082 describe.c:5279 describe.c:5363 describe.c:5587 -#: describe.c:5759 describe.c:5999 +#: describe.c:77 describe.c:175 describe.c:243 describe.c:251 describe.c:377 +#: describe.c:729 describe.c:925 describe.c:1038 describe.c:1121 +#: describe.c:1354 describe.c:4060 describe.c:4282 describe.c:4440 +#: describe.c:4518 describe.c:4609 describe.c:4688 describe.c:4755 +#: describe.c:4968 describe.c:5052 describe.c:5128 describe.c:5369 +#: describe.c:5444 describe.c:5455 describe.c:5517 describe.c:5714 +#: describe.c:5798 describe.c:6022 describe.c:6194 describe.c:6434 msgid "Name" msgstr "Имя" -#: describe.c:77 describe.c:386 describe.c:404 describe.c:450 describe.c:467 +#: describe.c:78 describe.c:389 describe.c:407 describe.c:453 describe.c:470 msgid "Result data type" msgstr "Тип данных результата" -#: describe.c:85 describe.c:98 describe.c:102 describe.c:387 describe.c:405 -#: describe.c:451 describe.c:468 +#: describe.c:86 describe.c:99 describe.c:103 describe.c:390 describe.c:408 +#: describe.c:454 describe.c:471 msgid "Argument data types" msgstr "Типы данных аргументов" -#: describe.c:110 describe.c:117 describe.c:185 describe.c:273 describe.c:513 -#: describe.c:727 describe.c:826 describe.c:897 describe.c:1190 describe.c:2020 -#: describe.c:3510 describe.c:3783 describe.c:3977 describe.c:4128 -#: describe.c:4202 describe.c:4275 describe.c:4358 describe.c:4441 -#: describe.c:4560 describe.c:4626 describe.c:4694 describe.c:4835 -#: describe.c:4877 describe.c:4950 describe.c:5012 describe.c:5021 -#: describe.c:5083 describe.c:5305 describe.c:5385 describe.c:5520 -#: describe.c:5590 large_obj.c:290 large_obj.c:300 +#: describe.c:111 describe.c:118 describe.c:186 describe.c:274 describe.c:523 +#: describe.c:777 describe.c:940 describe.c:1063 describe.c:1356 +#: describe.c:2200 describe.c:3846 describe.c:4131 describe.c:4328 +#: describe.c:4471 describe.c:4545 describe.c:4618 describe.c:4701 +#: describe.c:4876 describe.c:4995 describe.c:5061 describe.c:5129 +#: describe.c:5270 describe.c:5312 describe.c:5385 describe.c:5447 +#: describe.c:5456 describe.c:5518 describe.c:5740 describe.c:5820 +#: describe.c:5955 describe.c:6025 large_obj.c:290 large_obj.c:300 msgid "Description" msgstr "Описание" -#: describe.c:135 +#: describe.c:136 msgid "List of aggregate functions" msgstr "Список агрегатных функций" -#: describe.c:160 +#: describe.c:161 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Сервер (версия %s) не поддерживает методы доступа." -#: describe.c:175 +#: describe.c:176 msgid "Index" msgstr "Индекс" -#: describe.c:176 describe.c:3741 describe.c:3956 describe.c:5507 +#: describe.c:177 describe.c:4079 describe.c:4307 describe.c:5942 msgid "Table" msgstr "Таблица" -#: describe.c:184 describe.c:5284 +#: describe.c:185 describe.c:5719 msgid "Handler" msgstr "Обработчик" -#: describe.c:203 +#: describe.c:204 msgid "List of access methods" msgstr "Список методов доступа" -#: describe.c:229 +#: describe.c:230 #, c-format msgid "The server (version %s) does not support tablespaces." msgstr "Сервер (версия %s) не поддерживает табличные пространства." -#: describe.c:243 describe.c:251 describe.c:501 describe.c:717 describe.c:873 -#: describe.c:1114 describe.c:3734 describe.c:3932 describe.c:4101 -#: describe.c:4347 describe.c:4618 describe.c:5280 describe.c:5364 -#: describe.c:5760 describe.c:5897 describe.c:6000 describe.c:6115 -#: describe.c:6194 large_obj.c:289 +#: describe.c:244 describe.c:252 describe.c:504 describe.c:767 describe.c:1039 +#: describe.c:1280 describe.c:4072 describe.c:4283 describe.c:4444 +#: describe.c:4690 describe.c:5053 describe.c:5715 describe.c:5799 +#: describe.c:6195 describe.c:6332 describe.c:6435 describe.c:6558 +#: describe.c:6636 large_obj.c:289 msgid "Owner" msgstr "Владелец" -#: describe.c:244 describe.c:252 +#: describe.c:245 describe.c:253 msgid "Location" msgstr "Расположение" -#: describe.c:263 describe.c:3327 +#: describe.c:264 describe.c:3662 msgid "Options" msgstr "Параметры" -#: describe.c:268 describe.c:690 describe.c:889 describe.c:3775 describe.c:3779 +#: describe.c:269 describe.c:740 describe.c:1055 describe.c:4123 +#: describe.c:4127 msgid "Size" msgstr "Размер" -#: describe.c:290 +#: describe.c:291 msgid "List of tablespaces" msgstr "Список табличных пространств" -#: describe.c:333 +#: describe.c:336 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df принимает в качестве параметров только [anptwS+]" -#: describe.c:341 describe.c:352 +#: describe.c:344 describe.c:355 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df не поддерживает параметр \"%c\" с сервером версии %s" # well-spelled: агр #. translator: "agg" is short for "aggregate" -#: describe.c:389 describe.c:407 describe.c:453 describe.c:470 +#: describe.c:392 describe.c:410 describe.c:456 describe.c:473 msgid "agg" msgstr "агр." -#: describe.c:390 describe.c:408 +#: describe.c:393 describe.c:411 msgid "window" msgstr "оконная" -#: describe.c:391 +#: describe.c:394 msgid "proc" msgstr "проц." # well-spelled: функ -#: describe.c:392 describe.c:410 describe.c:455 describe.c:472 +#: describe.c:395 describe.c:413 describe.c:458 describe.c:475 msgid "func" msgstr "функ." -#: describe.c:409 describe.c:454 describe.c:471 describe.c:1324 +#: describe.c:412 describe.c:457 describe.c:474 describe.c:1490 msgid "trigger" msgstr "триггерная" -#: describe.c:483 +#: describe.c:486 msgid "immutable" msgstr "постоянная" -#: describe.c:484 +#: describe.c:487 msgid "stable" msgstr "стабильная" -#: describe.c:485 +#: describe.c:488 msgid "volatile" msgstr "изменчивая" -#: describe.c:486 +#: describe.c:489 msgid "Volatility" msgstr "Изменчивость" -#: describe.c:494 +#: describe.c:497 msgid "restricted" msgstr "ограниченная" -#: describe.c:495 +#: describe.c:498 msgid "safe" msgstr "безопасная" -#: describe.c:496 +#: describe.c:499 msgid "unsafe" msgstr "небезопасная" -#: describe.c:497 +#: describe.c:500 msgid "Parallel" msgstr "Параллельность" -#: describe.c:502 +#: describe.c:505 msgid "definer" msgstr "определившего" -#: describe.c:503 +#: describe.c:506 msgid "invoker" msgstr "вызывающего" -#: describe.c:504 +#: describe.c:507 msgid "Security" msgstr "Безопасность" -#: describe.c:511 +#: describe.c:512 msgid "Language" msgstr "Язык" -#: describe.c:512 +#: describe.c:516 describe.c:520 msgid "Source code" msgstr "Исходный код" -#: describe.c:641 +#: describe.c:691 msgid "List of functions" msgstr "Список функций" -#: describe.c:689 +#: describe.c:739 msgid "Internal name" msgstr "Внутреннее имя" -#: describe.c:711 +#: describe.c:761 msgid "Elements" msgstr "Элементы" -#: describe.c:768 +#: describe.c:822 msgid "List of data types" msgstr "Список типов данных" -#: describe.c:812 +#: describe.c:926 msgid "Left arg type" msgstr "Тип левого аргумента" -#: describe.c:813 +#: describe.c:927 msgid "Right arg type" msgstr "Тип правого аргумента" -#: describe.c:814 +#: describe.c:928 msgid "Result type" msgstr "Результирующий тип" -#: describe.c:819 describe.c:4353 describe.c:4418 describe.c:4424 -#: describe.c:4834 describe.c:6366 describe.c:6370 +#: describe.c:933 describe.c:4696 describe.c:4853 describe.c:4859 +#: describe.c:5269 describe.c:6807 describe.c:6811 msgid "Function" msgstr "Функция" -#: describe.c:844 +#: describe.c:1010 msgid "List of operators" msgstr "Список операторов" -#: describe.c:874 +#: describe.c:1040 msgid "Encoding" msgstr "Кодировка" -#: describe.c:879 describe.c:4534 +#: describe.c:1045 describe.c:4969 msgid "Collate" msgstr "LC_COLLATE" -#: describe.c:880 describe.c:4535 +#: describe.c:1046 describe.c:4970 msgid "Ctype" msgstr "LC_CTYPE" -#: describe.c:893 +#: describe.c:1059 msgid "Tablespace" msgstr "Табл. пространство" -#: describe.c:915 +#: describe.c:1081 msgid "List of databases" msgstr "Список баз данных" -#: describe.c:956 describe.c:1117 describe.c:3724 +#: describe.c:1122 describe.c:1283 describe.c:4061 msgid "table" msgstr "таблица" -#: describe.c:957 describe.c:3725 +#: describe.c:1123 describe.c:4062 msgid "view" msgstr "представление" -#: describe.c:958 describe.c:3726 +#: describe.c:1124 describe.c:4063 msgid "materialized view" msgstr "материализованное представление" -#: describe.c:959 describe.c:1119 describe.c:3728 +#: describe.c:1125 describe.c:1285 describe.c:4065 msgid "sequence" msgstr "последовательность" -#: describe.c:960 describe.c:3730 +#: describe.c:1126 describe.c:4068 msgid "foreign table" msgstr "сторонняя таблица" -#: describe.c:961 describe.c:3731 describe.c:3941 +#: describe.c:1127 describe.c:4069 describe.c:4292 msgid "partitioned table" msgstr "секционированная таблица" -#: describe.c:973 +#: describe.c:1139 msgid "Column privileges" msgstr "Права для столбцов" -#: describe.c:1004 describe.c:1038 +#: describe.c:1170 describe.c:1204 msgid "Policies" msgstr "Политики" -#: describe.c:1070 describe.c:6056 describe.c:6060 +#: describe.c:1236 describe.c:6499 describe.c:6503 msgid "Access privileges" msgstr "Права доступа" -#: describe.c:1101 +#: describe.c:1267 #, c-format msgid "The server (version %s) does not support altering default privileges." msgstr "Сервер (версия %s) не поддерживает изменение прав по умолчанию." -#: describe.c:1121 +#: describe.c:1287 msgid "function" msgstr "функция" -#: describe.c:1123 +#: describe.c:1289 msgid "type" msgstr "тип" -#: describe.c:1125 +#: describe.c:1291 msgid "schema" msgstr "схема" -#: describe.c:1149 +#: describe.c:1315 msgid "Default access privileges" msgstr "Права доступа по умолчанию" -#: describe.c:1189 +#: describe.c:1355 msgid "Object" msgstr "Объект" -#: describe.c:1203 +#: describe.c:1369 msgid "table constraint" msgstr "ограничение таблицы" -#: describe.c:1225 +#: describe.c:1391 msgid "domain constraint" msgstr "ограничение домена" -#: describe.c:1253 +#: describe.c:1419 msgid "operator class" msgstr "класс операторов" -#: describe.c:1282 +#: describe.c:1448 msgid "operator family" msgstr "семейство операторов" -#: describe.c:1304 +#: describe.c:1470 msgid "rule" msgstr "правило" -#: describe.c:1346 +#: describe.c:1512 msgid "Object descriptions" msgstr "Описание объекта" -#: describe.c:1402 describe.c:3847 +#: describe.c:1568 describe.c:4198 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Отношение \"%s\" не найдено." -#: describe.c:1405 describe.c:3850 +#: describe.c:1571 describe.c:4201 #, c-format msgid "Did not find any relations." msgstr "Отношения не найдены." -#: describe.c:1660 +#: describe.c:1827 #, c-format msgid "Did not find any relation with OID %s." msgstr "Отношение с OID %s не найдено." -#: describe.c:1712 describe.c:1736 +#: describe.c:1879 describe.c:1903 msgid "Start" msgstr "Начальное_значение" -#: describe.c:1713 describe.c:1737 +#: describe.c:1880 describe.c:1904 msgid "Minimum" msgstr "Минимум" -#: describe.c:1714 describe.c:1738 +#: describe.c:1881 describe.c:1905 msgid "Maximum" msgstr "Максимум" -#: describe.c:1715 describe.c:1739 +#: describe.c:1882 describe.c:1906 msgid "Increment" msgstr "Шаг" -#: describe.c:1716 describe.c:1740 describe.c:1871 describe.c:4269 -#: describe.c:4435 describe.c:4549 describe.c:4554 describe.c:6103 +#: describe.c:1883 describe.c:1907 describe.c:2038 describe.c:4612 +#: describe.c:4870 describe.c:4984 describe.c:4989 describe.c:6546 msgid "yes" msgstr "да" -#: describe.c:1717 describe.c:1741 describe.c:1872 describe.c:4269 -#: describe.c:4432 describe.c:4549 describe.c:6104 +#: describe.c:1884 describe.c:1908 describe.c:2039 describe.c:4612 +#: describe.c:4867 describe.c:4984 describe.c:6547 msgid "no" msgstr "нет" -#: describe.c:1718 describe.c:1742 +#: describe.c:1885 describe.c:1909 msgid "Cycles?" msgstr "Зацикливается?" -#: describe.c:1719 describe.c:1743 +#: describe.c:1886 describe.c:1910 msgid "Cache" msgstr "Кешируется" -#: describe.c:1786 +#: describe.c:1953 #, c-format msgid "Owned by: %s" msgstr "Владелец: %s" -#: describe.c:1790 +#: describe.c:1957 #, c-format msgid "Sequence for identity column: %s" msgstr "Последовательность для столбца идентификации: %s" -#: describe.c:1797 +#: describe.c:1964 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Последовательность \"%s.%s\"" -#: describe.c:1933 +#: describe.c:2111 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Нежурналируемая таблица \"%s.%s\"" -#: describe.c:1936 +#: describe.c:2114 #, c-format msgid "Table \"%s.%s\"" msgstr "Таблица \"%s.%s\"" -#: describe.c:1940 +#: describe.c:2118 #, c-format msgid "View \"%s.%s\"" msgstr "Представление \"%s.%s\"" -#: describe.c:1945 +#: describe.c:2123 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Нежурналируемое материализованное представление \"%s.%s\"" -#: describe.c:1948 +#: describe.c:2126 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Материализованное представление \"%s.%s\"" -#: describe.c:1953 +#: describe.c:2131 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Нежурналируемый индекс \"%s.%s\"" -#: describe.c:1956 +#: describe.c:2134 #, c-format msgid "Index \"%s.%s\"" msgstr "Индекс \"%s.%s\"" -#: describe.c:1961 +#: describe.c:2139 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Нежурналируемый секционированный индекс \"%s.%s\"" -#: describe.c:1964 +#: describe.c:2142 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Секционированный индекс \"%s.%s\"" -#: describe.c:1969 +#: describe.c:2147 #, c-format msgid "Special relation \"%s.%s\"" msgstr "Специальное отношение \"%s.%s\"" -#: describe.c:1973 +#: describe.c:2151 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST-таблица \"%s.%s\"" -#: describe.c:1977 +#: describe.c:2155 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Составной тип \"%s.%s\"" -#: describe.c:1981 +#: describe.c:2159 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Сторонняя таблица \"%s.%s\"" -#: describe.c:1986 +#: describe.c:2164 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Нежурналируемая секционированная таблица \"%s.%s\"" -#: describe.c:1989 +#: describe.c:2167 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Секционированная таблица \"%s.%s\"" -#: describe.c:2005 describe.c:4182 +#: describe.c:2183 describe.c:4525 msgid "Collation" msgstr "Правило сортировки" -#: describe.c:2006 describe.c:4189 +#: describe.c:2184 describe.c:4532 msgid "Nullable" msgstr "Допустимость NULL" -#: describe.c:2007 describe.c:4190 +#: describe.c:2185 describe.c:4533 msgid "Default" msgstr "По умолчанию" -#: describe.c:2010 +#: describe.c:2188 msgid "Key?" msgstr "Ключевой?" -#: describe.c:2012 +#: describe.c:2190 describe.c:4762 describe.c:4773 msgid "Definition" msgstr "Определение" # well-spelled: ОСД -#: describe.c:2014 describe.c:5300 describe.c:5384 describe.c:5455 -#: describe.c:5519 +#: describe.c:2192 describe.c:5735 describe.c:5819 describe.c:5890 +#: describe.c:5954 msgid "FDW options" msgstr "Параметры ОСД" -#: describe.c:2016 +#: describe.c:2194 msgid "Storage" msgstr "Хранилище" -#: describe.c:2018 +#: describe.c:2196 +msgid "Compression" +msgstr "Сжатие" + +#: describe.c:2198 msgid "Stats target" msgstr "Цель для статистики" -#: describe.c:2135 +#: describe.c:2334 #, c-format -msgid "Partition of: %s %s" -msgstr "Секция из: %s %s" +msgid "Partition of: %s %s%s" +msgstr "Секция: %s %s%s" -#: describe.c:2147 +#: describe.c:2347 msgid "No partition constraint" msgstr "Нет ограничения секции" -#: describe.c:2149 +#: describe.c:2349 #, c-format msgid "Partition constraint: %s" msgstr "Ограничение секции: %s" -#: describe.c:2173 +#: describe.c:2373 #, c-format msgid "Partition key: %s" msgstr "Ключ разбиения: %s" -#: describe.c:2199 +#: describe.c:2399 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Принадлежит таблице: \"%s.%s\"" -#: describe.c:2270 +#: describe.c:2470 msgid "primary key, " msgstr "первичный ключ, " -#: describe.c:2272 +#: describe.c:2472 msgid "unique, " msgstr "уникальный, " -#: describe.c:2278 +#: describe.c:2478 #, c-format msgid "for table \"%s.%s\"" msgstr "для таблицы \"%s.%s\"" -#: describe.c:2282 +#: describe.c:2482 #, c-format msgid ", predicate (%s)" msgstr ", предикат (%s)" -#: describe.c:2285 +#: describe.c:2485 msgid ", clustered" msgstr ", кластеризованный" -#: describe.c:2288 +#: describe.c:2488 msgid ", invalid" msgstr ", нерабочий" -#: describe.c:2291 +#: describe.c:2491 msgid ", deferrable" msgstr ", откладываемый" -#: describe.c:2294 +#: describe.c:2494 msgid ", initially deferred" msgstr ", изначально отложенный" -#: describe.c:2297 +#: describe.c:2497 msgid ", replica identity" msgstr ", репликационный" -#: describe.c:2364 +#: describe.c:2564 msgid "Indexes:" msgstr "Индексы:" -#: describe.c:2448 +#: describe.c:2648 msgid "Check constraints:" msgstr "Ограничения-проверки:" # TO REWVIEW -#: describe.c:2516 +#: describe.c:2716 msgid "Foreign-key constraints:" msgstr "Ограничения внешнего ключа:" -#: describe.c:2579 +#: describe.c:2779 msgid "Referenced by:" msgstr "Ссылки извне:" -#: describe.c:2629 +#: describe.c:2829 msgid "Policies:" msgstr "Политики:" -#: describe.c:2632 +#: describe.c:2832 msgid "Policies (forced row security enabled):" msgstr "Политики (усиленная защита строк включена):" -#: describe.c:2635 +#: describe.c:2835 msgid "Policies (row security enabled): (none)" msgstr "Политики (защита строк включена): (Нет)" -#: describe.c:2638 +#: describe.c:2838 msgid "Policies (forced row security enabled): (none)" msgstr "Политики (усиленная защита строк включена): (Нет)" -#: describe.c:2641 +#: describe.c:2841 msgid "Policies (row security disabled):" msgstr "Политики (защита строк выключена):" -#: describe.c:2709 +#: describe.c:2902 describe.c:3006 msgid "Statistics objects:" msgstr "Объекты статистики:" -#: describe.c:2823 describe.c:2927 +#: describe.c:3120 describe.c:3224 msgid "Rules:" msgstr "Правила:" -#: describe.c:2826 +#: describe.c:3123 msgid "Disabled rules:" msgstr "Отключённые правила:" -#: describe.c:2829 +#: describe.c:3126 msgid "Rules firing always:" msgstr "Правила, срабатывающие всегда:" -#: describe.c:2832 +#: describe.c:3129 msgid "Rules firing on replica only:" msgstr "Правила, срабатывающие только в реплике:" -#: describe.c:2872 +#: describe.c:3169 msgid "Publications:" msgstr "Публикации:" -#: describe.c:2910 +#: describe.c:3207 msgid "View definition:" msgstr "Определение представления:" -#: describe.c:3057 +#: describe.c:3377 msgid "Triggers:" msgstr "Триггеры:" -#: describe.c:3061 +#: describe.c:3381 msgid "Disabled user triggers:" msgstr "Отключённые пользовательские триггеры:" -#: describe.c:3063 +#: describe.c:3383 msgid "Disabled triggers:" msgstr "Отключённые триггеры:" -#: describe.c:3066 +#: describe.c:3386 msgid "Disabled internal triggers:" msgstr "Отключённые внутренние триггеры:" -#: describe.c:3069 +#: describe.c:3389 msgid "Triggers firing always:" msgstr "Триггеры, срабатывающие всегда:" -#: describe.c:3072 +#: describe.c:3392 msgid "Triggers firing on replica only:" msgstr "Триггеры, срабатывающие только в реплике:" -#: describe.c:3144 +#: describe.c:3464 #, c-format msgid "Server: %s" msgstr "Сервер: %s" # well-spelled: ОСД -#: describe.c:3152 +#: describe.c:3472 #, c-format msgid "FDW options: (%s)" msgstr "Параметр ОСД: (%s)" -#: describe.c:3173 +#: describe.c:3493 msgid "Inherits" msgstr "Наследует" -#: describe.c:3233 +#: describe.c:3566 #, c-format msgid "Number of partitions: %d" msgstr "Число секций: %d" -#: describe.c:3242 +#: describe.c:3575 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Число секций: %d (чтобы просмотреть их, введите \\d+)" -#: describe.c:3244 +#: describe.c:3577 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Дочерних таблиц: %d (чтобы просмотреть и их, воспользуйтесь \\d+)" -#: describe.c:3251 +#: describe.c:3584 msgid "Child tables" msgstr "Дочерние таблицы" -#: describe.c:3251 +#: describe.c:3584 msgid "Partitions" msgstr "Секции" -#: describe.c:3280 +#: describe.c:3615 #, c-format msgid "Typed table of type: %s" msgstr "Типизированная таблица типа: %s" -#: describe.c:3296 +#: describe.c:3631 msgid "Replica Identity" msgstr "Идентификация реплики" -#: describe.c:3309 +#: describe.c:3644 msgid "Has OIDs: yes" msgstr "Содержит OID: да" -#: describe.c:3318 +#: describe.c:3653 #, c-format msgid "Access method: %s" msgstr "Метод доступа: %s" -#: describe.c:3398 +#: describe.c:3733 #, c-format msgid "Tablespace: \"%s\"" msgstr "Табличное пространство: \"%s\"" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3410 +#: describe.c:3745 #, c-format msgid ", tablespace \"%s\"" msgstr ", табл. пространство \"%s\"" -#: describe.c:3503 +#: describe.c:3838 msgid "List of roles" msgstr "Список ролей" -#: describe.c:3505 +#: describe.c:3840 msgid "Role name" msgstr "Имя роли" -#: describe.c:3506 +#: describe.c:3841 msgid "Attributes" msgstr "Атрибуты" -#: describe.c:3507 +#: describe.c:3843 msgid "Member of" msgstr "Член ролей" -#: describe.c:3518 +#: describe.c:3854 msgid "Superuser" msgstr "Суперпользователь" -#: describe.c:3521 +#: describe.c:3857 msgid "No inheritance" msgstr "Не наследуется" -#: describe.c:3524 +#: describe.c:3860 msgid "Create role" msgstr "Создаёт роли" -#: describe.c:3527 +#: describe.c:3863 msgid "Create DB" msgstr "Создаёт БД" -#: describe.c:3530 +#: describe.c:3866 msgid "Cannot login" msgstr "Вход запрещён" -#: describe.c:3534 +#: describe.c:3870 msgid "Replication" msgstr "Репликация" -#: describe.c:3538 +#: describe.c:3874 msgid "Bypass RLS" msgstr "Пропускать RLS" -#: describe.c:3547 +#: describe.c:3883 msgid "No connections" msgstr "Нет подключений" -#: describe.c:3549 +#: describe.c:3885 #, c-format msgid "%d connection" msgid_plural "%d connections" @@ -1855,357 +1868,386 @@ msgstr[0] "%d подключение" msgstr[1] "%d подключения" msgstr[2] "%d подключений" -#: describe.c:3559 +#: describe.c:3895 msgid "Password valid until " msgstr "Пароль действует до " -#: describe.c:3609 +#: describe.c:3945 #, c-format msgid "The server (version %s) does not support per-database role settings." msgstr "" "Сервер (версия %s) не поддерживает назначение параметров ролей для баз " "данных." -#: describe.c:3622 +#: describe.c:3958 msgid "Role" msgstr "Роль" -#: describe.c:3623 +#: describe.c:3959 msgid "Database" msgstr "БД" -#: describe.c:3624 +#: describe.c:3960 msgid "Settings" msgstr "Параметры" -#: describe.c:3645 +#: describe.c:3981 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Параметры для роли \"%s\" и базы данных \"%s\" не найдены." -#: describe.c:3648 +#: describe.c:3984 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Параметры для роли \"%s\" не найдены." -#: describe.c:3651 +#: describe.c:3987 #, c-format msgid "Did not find any settings." msgstr "Никакие параметры не найдены." -#: describe.c:3656 +#: describe.c:3992 msgid "List of settings" msgstr "Список параметров" -#: describe.c:3727 +#: describe.c:4064 msgid "index" msgstr "индекс" # skip-rule: capital-letter-first -#: describe.c:3729 +#: describe.c:4066 msgid "special" msgstr "спец. отношение" -#: describe.c:3732 describe.c:3942 +#: describe.c:4067 +msgid "TOAST table" +msgstr "TOAST-таблица" + +#: describe.c:4070 describe.c:4293 msgid "partitioned index" msgstr "секционированный индекс" -#: describe.c:3756 +#: describe.c:4094 msgid "permanent" msgstr "постоянное" -#: describe.c:3757 +#: describe.c:4095 msgid "temporary" msgstr "временное" -#: describe.c:3758 +#: describe.c:4096 msgid "unlogged" msgstr "нежурналируемое" -#: describe.c:3759 +#: describe.c:4097 msgid "Persistence" msgstr "Хранение" -#: describe.c:3855 +#: describe.c:4114 +msgid "Access method" +msgstr "Метод доступа" + +#: describe.c:4206 msgid "List of relations" msgstr "Список отношений" -#: describe.c:3903 +#: describe.c:4254 #, c-format msgid "" "The server (version %s) does not support declarative table partitioning." msgstr "" "Сервер (версия %s) не поддерживает декларативное секционирование таблиц." -#: describe.c:3914 +#: describe.c:4265 msgid "List of partitioned indexes" msgstr "Список секционированных индексов" -#: describe.c:3916 +#: describe.c:4267 msgid "List of partitioned tables" msgstr "Список секционированных таблиц" -#: describe.c:3920 +#: describe.c:4271 msgid "List of partitioned relations" msgstr "Список секционированных отношений" -#: describe.c:3951 +#: describe.c:4302 msgid "Parent name" msgstr "Имя родителя" -#: describe.c:3964 +#: describe.c:4315 msgid "Leaf partition size" msgstr "Размер конечной секции" -#: describe.c:3967 describe.c:3973 +#: describe.c:4318 describe.c:4324 msgid "Total size" msgstr "Общий размер" -#: describe.c:4105 +#: describe.c:4448 msgid "Trusted" msgstr "Доверенный" -#: describe.c:4113 +#: describe.c:4456 msgid "Internal language" msgstr "Внутренний язык" -#: describe.c:4114 +#: describe.c:4457 msgid "Call handler" msgstr "Обработчик вызова" -#: describe.c:4115 describe.c:5287 +#: describe.c:4458 describe.c:5722 msgid "Validator" msgstr "Функция проверки" -#: describe.c:4118 +#: describe.c:4461 msgid "Inline handler" msgstr "Обработчик внедрённого кода" -#: describe.c:4146 +#: describe.c:4489 msgid "List of languages" msgstr "Список языков" -#: describe.c:4191 +#: describe.c:4534 msgid "Check" msgstr "Проверка" -#: describe.c:4233 +#: describe.c:4576 msgid "List of domains" msgstr "Список доменов" -#: describe.c:4267 +#: describe.c:4610 msgid "Source" msgstr "Источник" -#: describe.c:4268 +#: describe.c:4611 msgid "Destination" msgstr "Назначение" -#: describe.c:4270 describe.c:6105 +#: describe.c:4613 describe.c:6548 msgid "Default?" msgstr "По умолчанию?" -#: describe.c:4307 +#: describe.c:4650 msgid "List of conversions" msgstr "Список преобразований" -#: describe.c:4346 +#: describe.c:4689 msgid "Event" msgstr "Событие" -#: describe.c:4348 +#: describe.c:4691 msgid "enabled" msgstr "включён" -#: describe.c:4349 +#: describe.c:4692 msgid "replica" msgstr "реплика" -#: describe.c:4350 +#: describe.c:4693 msgid "always" msgstr "всегда" -#: describe.c:4351 +#: describe.c:4694 msgid "disabled" msgstr "отключён" -#: describe.c:4352 describe.c:6001 +#: describe.c:4695 describe.c:6436 msgid "Enabled" msgstr "Включён" -#: describe.c:4354 +#: describe.c:4697 msgid "Tags" msgstr "Теги" -#: describe.c:4373 +#: describe.c:4716 msgid "List of event triggers" msgstr "Список событийных триггеров" -#: describe.c:4402 +#: describe.c:4743 +#, c-format +msgid "The server (version %s) does not support extended statistics." +msgstr "Сервер (версия %s) не поддерживает расширенные статистики." + +#: describe.c:4780 +msgid "Ndistinct" +msgstr "Ndistinct" + +#: describe.c:4781 +msgid "Dependencies" +msgstr "Зависимости" + +#: describe.c:4791 +msgid "MCV" +msgstr "MCV" + +#: describe.c:4810 +msgid "List of extended statistics" +msgstr "Список расширенных статистик" + +#: describe.c:4837 msgid "Source type" msgstr "Исходный тип" -#: describe.c:4403 +#: describe.c:4838 msgid "Target type" msgstr "Целевой тип" -#: describe.c:4434 +#: describe.c:4869 msgid "in assignment" msgstr "в присваивании" -#: describe.c:4436 +#: describe.c:4871 msgid "Implicit?" msgstr "Неявное?" -#: describe.c:4491 +#: describe.c:4926 msgid "List of casts" msgstr "Список приведений типов" -#: describe.c:4519 +#: describe.c:4954 #, c-format msgid "The server (version %s) does not support collations." msgstr "Сервер (версия %s) не поддерживает правила сравнения." -#: describe.c:4540 describe.c:4544 +#: describe.c:4975 describe.c:4979 msgid "Provider" -msgstr "Поставщик" +msgstr "Провайдер" -#: describe.c:4550 describe.c:4555 +#: describe.c:4985 describe.c:4990 msgid "Deterministic?" msgstr "Детерминированное?" -#: describe.c:4590 +#: describe.c:5025 msgid "List of collations" msgstr "Список правил сортировки" -#: describe.c:4649 +#: describe.c:5084 msgid "List of schemas" msgstr "Список схем" -#: describe.c:4674 describe.c:4921 describe.c:4992 describe.c:5063 +#: describe.c:5109 describe.c:5356 describe.c:5427 describe.c:5498 #, c-format msgid "The server (version %s) does not support full text search." msgstr "Сервер (версия %s) не поддерживает полнотекстовый поиск." -#: describe.c:4709 +#: describe.c:5144 msgid "List of text search parsers" msgstr "Список анализаторов текстового поиска" -#: describe.c:4754 +#: describe.c:5189 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Анализатор текстового поиска \"%s\" не найден." -#: describe.c:4757 +#: describe.c:5192 #, c-format msgid "Did not find any text search parsers." msgstr "Никакие анализаторы текстового поиска не найдены." -#: describe.c:4832 +#: describe.c:5267 msgid "Start parse" msgstr "Начало разбора" -#: describe.c:4833 +#: describe.c:5268 msgid "Method" msgstr "Метод" -#: describe.c:4837 +#: describe.c:5272 msgid "Get next token" msgstr "Получение следующего фрагмента" -#: describe.c:4839 +#: describe.c:5274 msgid "End parse" msgstr "Окончание разбора" -#: describe.c:4841 +#: describe.c:5276 msgid "Get headline" msgstr "Получение выдержки" -#: describe.c:4843 +#: describe.c:5278 msgid "Get token types" msgstr "Получение типов фрагментов" -#: describe.c:4854 +#: describe.c:5289 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Анализатор текстового поиска \"%s.%s\"" -#: describe.c:4857 +#: describe.c:5292 #, c-format msgid "Text search parser \"%s\"" msgstr "Анализатор текстового поиска \"%s\"" -#: describe.c:4876 +#: describe.c:5311 msgid "Token name" msgstr "Имя фрагмента" -#: describe.c:4887 +#: describe.c:5322 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Типы фрагментов для анализатора \"%s.%s\"" -#: describe.c:4890 +#: describe.c:5325 #, c-format msgid "Token types for parser \"%s\"" msgstr "Типы фрагментов для анализатора \"%s\"" -#: describe.c:4944 +#: describe.c:5379 msgid "Template" msgstr "Шаблон" -#: describe.c:4945 +#: describe.c:5380 msgid "Init options" msgstr "Параметры инициализации" -#: describe.c:4967 +#: describe.c:5402 msgid "List of text search dictionaries" msgstr "Список словарей текстового поиска" -#: describe.c:5010 +#: describe.c:5445 msgid "Init" msgstr "Инициализация" -#: describe.c:5011 +#: describe.c:5446 msgid "Lexize" msgstr "Выделение лексем" -#: describe.c:5038 +#: describe.c:5473 msgid "List of text search templates" msgstr "Список шаблонов текстового поиска" -#: describe.c:5098 +#: describe.c:5533 msgid "List of text search configurations" msgstr "Список конфигураций текстового поиска" -#: describe.c:5144 +#: describe.c:5579 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Конфигурация текстового поиска \"%s\" не найдена." -#: describe.c:5147 +#: describe.c:5582 #, c-format msgid "Did not find any text search configurations." msgstr "Никакие конфигурации текстового поиска не найдены." -#: describe.c:5213 +#: describe.c:5648 msgid "Token" msgstr "Фрагмент" -#: describe.c:5214 +#: describe.c:5649 msgid "Dictionaries" msgstr "Словари" -#: describe.c:5225 +#: describe.c:5660 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Конфигурация текстового поиска \"%s.%s\"" -#: describe.c:5228 +#: describe.c:5663 #, c-format msgid "Text search configuration \"%s\"" msgstr "Конфигурация текстового поиска \"%s\"" -#: describe.c:5232 +#: describe.c:5667 #, c-format msgid "" "\n" @@ -2214,7 +2256,7 @@ msgstr "" "\n" "Анализатор: \"%s.%s\"" -#: describe.c:5235 +#: describe.c:5670 #, c-format msgid "" "\n" @@ -2223,232 +2265,240 @@ msgstr "" "\n" "Анализатор: \"%s\"" -#: describe.c:5269 +#: describe.c:5704 #, c-format msgid "The server (version %s) does not support foreign-data wrappers." msgstr "Сервер (версия %s) не поддерживает обёртки сторонних данных." -#: describe.c:5327 +#: describe.c:5762 msgid "List of foreign-data wrappers" msgstr "Список обёрток сторонних данных" -#: describe.c:5352 +#: describe.c:5787 #, c-format msgid "The server (version %s) does not support foreign servers." msgstr "Сервер (версия %s) не поддерживает сторонние серверы." -#: describe.c:5365 +#: describe.c:5800 msgid "Foreign-data wrapper" msgstr "Обёртка сторонних данных" -#: describe.c:5383 describe.c:5588 +#: describe.c:5818 describe.c:6023 msgid "Version" msgstr "Версия" -#: describe.c:5409 +#: describe.c:5844 msgid "List of foreign servers" msgstr "Список сторонних серверов" -#: describe.c:5434 +#: describe.c:5869 #, c-format msgid "The server (version %s) does not support user mappings." msgstr "Сервер (версия %s) не поддерживает сопоставления пользователей." -#: describe.c:5444 describe.c:5508 +#: describe.c:5879 describe.c:5943 msgid "Server" msgstr "Сервер" -#: describe.c:5445 +#: describe.c:5880 msgid "User name" msgstr "Имя пользователя" -#: describe.c:5470 +#: describe.c:5905 msgid "List of user mappings" msgstr "Список сопоставлений пользователей" -#: describe.c:5495 +#: describe.c:5930 #, c-format msgid "The server (version %s) does not support foreign tables." msgstr "Сервер (версия %s) не поддерживает сторонние таблицы." -#: describe.c:5548 +#: describe.c:5983 msgid "List of foreign tables" msgstr "Список сторонних таблиц" -#: describe.c:5573 describe.c:5630 +#: describe.c:6008 describe.c:6065 #, c-format msgid "The server (version %s) does not support extensions." msgstr "Сервер (версия %s) не поддерживает расширения." -#: describe.c:5605 +#: describe.c:6040 msgid "List of installed extensions" msgstr "Список установленных расширений" -#: describe.c:5658 +#: describe.c:6093 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Расширение \"%s\" не найдено." -#: describe.c:5661 +#: describe.c:6096 #, c-format msgid "Did not find any extensions." msgstr "Никакие расширения не найдены." -#: describe.c:5705 +#: describe.c:6140 msgid "Object description" msgstr "Описание объекта" -#: describe.c:5715 +#: describe.c:6150 #, c-format msgid "Objects in extension \"%s\"" msgstr "Объекты в расширении \"%s\"" -#: describe.c:5744 describe.c:5820 +#: describe.c:6179 describe.c:6255 #, c-format msgid "The server (version %s) does not support publications." msgstr "Сервер (версия %s) не поддерживает публикации." -#: describe.c:5761 describe.c:5898 +#: describe.c:6196 describe.c:6333 msgid "All tables" msgstr "Все таблицы" -#: describe.c:5762 describe.c:5899 +#: describe.c:6197 describe.c:6334 msgid "Inserts" msgstr "Добавления" -#: describe.c:5763 describe.c:5900 +#: describe.c:6198 describe.c:6335 msgid "Updates" msgstr "Изменения" -#: describe.c:5764 describe.c:5901 +#: describe.c:6199 describe.c:6336 msgid "Deletes" msgstr "Удаления" -#: describe.c:5768 describe.c:5903 +#: describe.c:6203 describe.c:6338 msgid "Truncates" msgstr "Опустошения" -#: describe.c:5772 describe.c:5905 +#: describe.c:6207 describe.c:6340 msgid "Via root" msgstr "Через корень" -#: describe.c:5789 +#: describe.c:6224 msgid "List of publications" msgstr "Список публикаций" -#: describe.c:5862 +#: describe.c:6297 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Публикация \"%s\" не найдена." -#: describe.c:5865 +#: describe.c:6300 #, c-format msgid "Did not find any publications." msgstr "Никакие публикации не найдены." -#: describe.c:5894 +#: describe.c:6329 #, c-format msgid "Publication %s" msgstr "Публикация %s" -#: describe.c:5942 +#: describe.c:6377 msgid "Tables:" msgstr "Таблицы:" -#: describe.c:5986 +#: describe.c:6421 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Сервер (версия %s) не поддерживает подписки." -#: describe.c:6002 +#: describe.c:6437 msgid "Publication" msgstr "Публикация" -#: describe.c:6009 +#: describe.c:6446 +msgid "Binary" +msgstr "Бинарная" + +#: describe.c:6447 +msgid "Streaming" +msgstr "Потоковая" + +#: describe.c:6452 msgid "Synchronous commit" msgstr "Синхронная фиксация" -#: describe.c:6010 +#: describe.c:6453 msgid "Conninfo" msgstr "Строка подключения" -#: describe.c:6032 +#: describe.c:6475 msgid "List of subscriptions" msgstr "Список подписок" -#: describe.c:6099 describe.c:6188 describe.c:6274 describe.c:6357 +#: describe.c:6542 describe.c:6630 describe.c:6715 describe.c:6798 msgid "AM" msgstr "МД" -#: describe.c:6100 +#: describe.c:6543 msgid "Input type" msgstr "Входной тип" -#: describe.c:6101 +#: describe.c:6544 msgid "Storage type" msgstr "Тип хранения" -#: describe.c:6102 +#: describe.c:6545 msgid "Operator class" msgstr "Класс операторов" -#: describe.c:6114 describe.c:6189 describe.c:6275 describe.c:6358 +#: describe.c:6557 describe.c:6631 describe.c:6716 describe.c:6799 msgid "Operator family" msgstr "Семейство операторов" -#: describe.c:6147 +#: describe.c:6589 msgid "List of operator classes" msgstr "Список классов операторов" -#: describe.c:6190 +#: describe.c:6632 msgid "Applicable types" msgstr "Применимые типы" -#: describe.c:6229 +#: describe.c:6670 msgid "List of operator families" msgstr "Список семейств операторов" -#: describe.c:6276 +#: describe.c:6717 msgid "Operator" msgstr "Оператор" -#: describe.c:6277 +#: describe.c:6718 msgid "Strategy" msgstr "Стратегия" -#: describe.c:6278 +#: describe.c:6719 msgid "ordering" msgstr "сортировка" -#: describe.c:6279 +#: describe.c:6720 msgid "search" msgstr "поиск" -#: describe.c:6280 +#: describe.c:6721 msgid "Purpose" msgstr "Назначение" -#: describe.c:6285 +#: describe.c:6726 msgid "Sort opfamily" msgstr "Семейство для сортировки" -#: describe.c:6316 +#: describe.c:6757 msgid "List of operators of operator families" msgstr "Список операторов из семейств операторов" -#: describe.c:6359 +#: describe.c:6800 msgid "Registered left type" msgstr "Зарегистрированный левый тип" -#: describe.c:6360 +#: describe.c:6801 msgid "Registered right type" msgstr "Зарегистрированный правый тип" -#: describe.c:6361 +#: describe.c:6802 msgid "Number" msgstr "Номер" -#: describe.c:6397 +#: describe.c:6838 msgid "List of support functions of operator families" msgstr "Список опорных функций из семейств операторов" @@ -2461,7 +2511,7 @@ msgstr "" "psql - это интерактивный терминал PostgreSQL.\n" "\n" -#: help.c:74 help.c:355 help.c:431 help.c:474 +#: help.c:74 help.c:355 help.c:433 help.c:476 #, c-format msgid "Usage:\n" msgstr "Использование:\n" @@ -2758,17 +2808,17 @@ msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr "" " -p, --port=ПОРТ порт сервера баз данных (по умолчанию: \"%s\")\n" -#: help.c:140 +#: help.c:137 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr " -U, --username=ИМЯ имя пользователя (по умолчанию: \"%s\")\n" -#: help.c:141 +#: help.c:138 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password не запрашивать пароль\n" -#: help.c:142 +#: help.c:139 #, c-format msgid "" " -W, --password force password prompt (should happen " @@ -2776,7 +2826,7 @@ msgid "" msgstr "" " -W, --password запрашивать пароль всегда (обычно не требуется)\n" -#: help.c:144 +#: help.c:141 #, c-format msgid "" "\n" @@ -2793,23 +2843,23 @@ msgstr "" "документации PostgreSQL.\n" "\n" -#: help.c:147 +#: help.c:144 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Об ошибках сообщайте по адресу <%s>.\n" -#: help.c:148 +#: help.c:145 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" -#: help.c:174 +#: help.c:171 #, c-format msgid "General\n" msgstr "Общие\n" # skip-rule: copyright -#: help.c:175 +#: help.c:172 #, c-format msgid "" " \\copyright show PostgreSQL usage and distribution terms\n" @@ -2817,7 +2867,7 @@ msgstr "" " \\copyright условия использования и распространения " "PostgreSQL\n" -#: help.c:176 +#: help.c:173 #, c-format msgid "" " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" @@ -2825,7 +2875,7 @@ msgstr "" " \\crosstabview [СТОЛБЦЫ] выполнить запрос и вывести результат в " "перекрёстном виде\n" -#: help.c:177 +#: help.c:174 #, c-format msgid "" " \\errverbose show most recent error message at maximum " @@ -2834,7 +2884,7 @@ msgstr "" " \\errverbose вывести максимально подробное сообщение о " "последней ошибке\n" -#: help.c:178 +#: help.c:175 #, c-format msgid "" " \\g [(OPTIONS)] [FILE] execute query (and send results to file or |" @@ -2846,14 +2896,14 @@ msgstr "" " или канал |); \\g без аргументов равнозначно \";" "\"\n" -#: help.c:180 +#: help.c:177 #, c-format msgid "" " \\gdesc describe result of query, without executing it\n" msgstr "" " \\gdesc описать результат запроса, но не выполнять его\n" -#: help.c:181 +#: help.c:178 #, c-format msgid "" " \\gexec execute query, then execute each value in its " @@ -2862,7 +2912,7 @@ msgstr "" " \\gexec выполнить запрос, а затем выполнить каждую строку " "в результате\n" -#: help.c:182 +#: help.c:179 #, c-format msgid "" " \\gset [PREFIX] execute query and store results in psql variables\n" @@ -2871,46 +2921,46 @@ msgstr "" "переменных\n" " psql\n" -#: help.c:183 +#: help.c:180 #, c-format msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr "" " \\gx [(ПАРАМЕТРЫ)] [ФАЙЛ] то же, что \\g, но в режиме развёрнутого вывода\n" -#: help.c:184 +#: help.c:181 #, c-format msgid " \\q quit psql\n" msgstr " \\q выйти из psql\n" -#: help.c:185 +#: help.c:182 #, c-format msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr "" " \\watch [СЕК] повторять запрос в цикле через заданное число " "секунд\n" -#: help.c:188 +#: help.c:185 #, c-format msgid "Help\n" msgstr "Справка\n" -#: help.c:190 +#: help.c:187 #, c-format msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] справка по командам psql c \\\n" -#: help.c:191 +#: help.c:188 #, c-format msgid " \\? options show help on psql command-line options\n" msgstr "" " \\? options справка по параметрам командной строки psql\n" -#: help.c:192 +#: help.c:189 #, c-format msgid " \\? variables show help on special variables\n" msgstr " \\? variables справка по специальным переменным\n" -#: help.c:193 +#: help.c:190 #, c-format msgid "" " \\h [NAME] help on syntax of SQL commands, * for all " @@ -2918,12 +2968,12 @@ msgid "" msgstr "" " \\h [ИМЯ] справка по заданному SQL-оператору; * - по всем\n" -#: help.c:196 +#: help.c:193 #, c-format msgid "Query Buffer\n" msgstr "Буфер запроса\n" -#: help.c:197 +#: help.c:194 #, c-format msgid "" " \\e [FILE] [LINE] edit the query buffer (or file) with external " @@ -2932,53 +2982,53 @@ msgstr "" " \\e [ФАЙЛ] [СТРОКА] править буфер запроса (или файл) во внешнем " "редакторе\n" -#: help.c:198 +#: help.c:195 #, c-format msgid "" " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr "" " \\ef [ФУНКЦИЯ [СТРОКА]] править определение функции во внешнем редакторе\n" -#: help.c:199 +#: help.c:196 #, c-format msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr "" " \\ev [VIEWNAME [LINE]] править определение представления во внешнем " "редакторе\n" -#: help.c:200 +#: help.c:197 #, c-format msgid " \\p show the contents of the query buffer\n" msgstr " \\p вывести содержимое буфера запросов\n" -#: help.c:201 +#: help.c:198 #, c-format msgid " \\r reset (clear) the query buffer\n" msgstr " \\r очистить буфер запроса\n" -#: help.c:203 +#: help.c:200 #, c-format msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [ФАЙЛ] вывести историю или сохранить её в файл\n" -#: help.c:205 +#: help.c:202 #, c-format msgid " \\w FILE write query buffer to file\n" msgstr " \\w ФАЙЛ записать буфер запроса в файл\n" -#: help.c:208 +#: help.c:205 #, c-format msgid "Input/Output\n" msgstr "Ввод/Вывод\n" -#: help.c:209 +#: help.c:206 #, c-format msgid "" " \\copy ... perform SQL COPY with data stream to the client " "host\n" msgstr " \\copy ... выполнить SQL COPY на стороне клиента\n" -#: help.c:210 +#: help.c:207 #, c-format msgid "" " \\echo [-n] [STRING] write string to standard output (-n for no " @@ -2987,12 +3037,12 @@ msgstr "" " \\echo [-n] [СТРОКА] записать строку в поток стандартного вывода\n" " (-n отключает перевод строки)\n" -#: help.c:211 +#: help.c:208 #, c-format msgid " \\i FILE execute commands from file\n" msgstr " \\i ФАЙЛ выполнить команды из файла\n" -#: help.c:212 +#: help.c:209 #, c-format msgid "" " \\ir FILE as \\i, but relative to location of current " @@ -3001,14 +3051,14 @@ msgstr "" " \\ir ФАЙЛ подобно \\i, но путь задаётся относительно\n" " текущего скрипта\n" -#: help.c:213 +#: help.c:210 #, c-format msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr "" " \\o [ФАЙЛ] выводить все результаты запросов в файл или канал " "|\n" -#: help.c:214 +#: help.c:211 #, c-format msgid "" " \\qecho [-n] [STRING] write string to \\o output stream (-n for no " @@ -3017,7 +3067,7 @@ msgstr "" " \\qecho [-n] [СТРОКА] записать строку в выходной поток \\o\n" " (-n отключает перевод строки)\n" -#: help.c:215 +#: help.c:212 #, c-format msgid "" " \\warn [-n] [STRING] write string to standard error (-n for no " @@ -3026,24 +3076,24 @@ msgstr "" " \\warn [-n] [СТРОКА] записать строку в поток вывода ошибок\n" " (-n отключает перевод строки)\n" -#: help.c:218 +#: help.c:215 #, c-format msgid "Conditional\n" msgstr "Условия\n" -#: help.c:219 +#: help.c:216 #, c-format msgid " \\if EXPR begin conditional block\n" msgstr " \\if ВЫРАЖЕНИЕ начало блока условия\n" -#: help.c:220 +#: help.c:217 #, c-format msgid "" " \\elif EXPR alternative within current conditional block\n" msgstr "" " \\elif ВЫРАЖЕНИЕ альтернативная ветвь в текущем блоке условия\n" -#: help.c:221 +#: help.c:218 #, c-format msgid "" " \\else final alternative within current conditional " @@ -3051,31 +3101,31 @@ msgid "" msgstr "" " \\else окончательная ветвь в текущем блоке условия\n" -#: help.c:222 +#: help.c:219 #, c-format msgid " \\endif end conditional block\n" msgstr " \\endif конец блока условия\n" -#: help.c:225 +#: help.c:222 #, c-format msgid "Informational\n" msgstr "Информационные\n" -#: help.c:226 +#: help.c:223 #, c-format msgid " (options: S = show system objects, + = additional detail)\n" msgstr "" " (дополнения: S = показывать системные объекты, + = дополнительные " "подробности)\n" -#: help.c:227 +#: help.c:224 #, c-format msgid " \\d[S+] list tables, views, and sequences\n" msgstr "" " \\d[S+] список таблиц, представлений и " "последовательностей\n" -#: help.c:228 +#: help.c:225 #, c-format msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr "" @@ -3083,172 +3133,178 @@ msgstr "" "последовательности\n" " или индекса\n" -#: help.c:229 +#: help.c:226 #, c-format msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [МАСКА] список агрегатных функций\n" -#: help.c:230 +#: help.c:227 #, c-format msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [МАСКА] список методов доступа\n" # well-spelled: МСК -#: help.c:231 +#: help.c:228 #, c-format msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [МСК_МД [МСК_ТИПА]] список классов операторов\n" # well-spelled: МСК -#: help.c:232 +#: help.c:229 #, c-format msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [МСК_МД [МСК_ТИПА]] список семейств операторов\n" # well-spelled: МСК -#: help.c:233 +#: help.c:230 #, c-format msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr "" " \\dAo[+] [МСК_МД [МСК_СОП]] список операторов из семейств операторов\n" # well-spelled: МСК -#: help.c:234 +#: help.c:231 #, c-format msgid "" -" \\dAp [AMPTRN [OPFPTRN]] list support functions of operator families\n" -msgstr "" -" \\dAp [МСК_МД [МСК_СОП]] список опорных функций из семейств " -"операторов\n" +" \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" +msgstr " \\dAp[+] [МСК_МД [МСК_СОП]] список опорных функций из семейств\n" -#: help.c:235 +#: help.c:232 #, c-format msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [МАСКА] список табличных пространств\n" -#: help.c:236 +#: help.c:233 #, c-format msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [МАСКА] список преобразований\n" -#: help.c:237 +#: help.c:234 #, c-format msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [МАСКА] список приведений типов\n" -#: help.c:238 +#: help.c:235 #, c-format msgid "" " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr "" " \\dd[S] [МАСКА] описания объектов, не выводимые в других режимах\n" -#: help.c:239 +#: help.c:236 #, c-format msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [МАСКА] список доменов\n" -#: help.c:240 +#: help.c:237 #, c-format msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [МАСКА] список прав по умолчанию\n" -#: help.c:241 +#: help.c:238 #, c-format msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [МАСКА] список сторонних таблиц\n" -#: help.c:242 -#, c-format -msgid " \\det[+] [PATTERN] list foreign tables\n" -msgstr " \\det[+] [МАСКА] список сторонних таблиц\n" - -#: help.c:243 +#: help.c:239 #, c-format msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [МАСКА] список сторонних серверов\n" -#: help.c:244 +#: help.c:240 +#, c-format +msgid " \\det[+] [PATTERN] list foreign tables\n" +msgstr " \\det[+] [МАСКА] список сторонних таблиц\n" + +#: help.c:241 #, c-format msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [МАСКА] список сопоставлений пользователей\n" -#: help.c:245 +#: help.c:242 #, c-format msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [МАСКА] список обёрток сторонних данных\n" -#: help.c:246 +# well-spelled: МСК, ФУНК +#: help.c:243 #, c-format msgid "" -" \\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] " +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" list [only agg/normal/procedure/trigger/window] " "functions\n" msgstr "" -" \\df[anptw][S+] [МАСКА] список [только агрегатных/обычных/(процедур)/\n" -" триггерных/оконных] функций\n" +" \\df[anptw][S+] [МСК_ФУНК [МСК_ТИПА ...]]\n" +" список функций [только агрегатных/обычных/процедур/" +"триггеров/оконных]\n" -#: help.c:247 +#: help.c:245 #, c-format msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [МАСКА] список конфигураций текстового поиска\n" -#: help.c:248 +#: help.c:246 #, c-format msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [МАСКА] список словарей текстового поиска\n" -#: help.c:249 +#: help.c:247 #, c-format msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [МАСКА] список анализаторов текстового поиска\n" -#: help.c:250 +#: help.c:248 #, c-format msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [МАСКА] список шаблонов текстового поиска\n" -#: help.c:251 +#: help.c:249 #, c-format msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [МАСКА] список ролей\n" -#: help.c:252 +#: help.c:250 #, c-format msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [МАСКА] список индексов\n" -#: help.c:253 +#: help.c:251 #, c-format msgid " \\dl list large objects, same as \\lo_list\n" msgstr "" " \\dl список больших объектов (то же, что и \\lo_list)\n" -#: help.c:254 +#: help.c:252 #, c-format msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [МАСКА] список языков процедур\n" -#: help.c:255 +#: help.c:253 #, c-format msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [МАСКА] список материализованных представлений\n" -#: help.c:256 +#: help.c:254 #, c-format msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [МАСКА] список схем\n" -#: help.c:257 +# well-spelled: МСК +#: help.c:255 #, c-format -msgid " \\do[S] [PATTERN] list operators\n" -msgstr " \\do[S] [МАСКА] список операторов\n" +msgid "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" list operators\n" +msgstr "" +" \\do[S+] [МСК_ОП [МСК_ТИПА [МСК_ТИПА]]]\n" +" список операторов\n" -#: help.c:258 +#: help.c:257 #, c-format msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [МАСКА] список правил сортировки\n" -#: help.c:259 +#: help.c:258 #, c-format msgid "" " \\dp [PATTERN] list table, view, and sequence access privileges\n" @@ -3256,7 +3312,7 @@ msgstr "" " \\dp [МАСКА] список прав доступа к таблицам, представлениям и\n" " последовательностям\n" -#: help.c:260 +#: help.c:259 #, c-format msgid "" " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations " @@ -3266,56 +3322,61 @@ msgstr "" " [только индексов (i)/таблиц (t)], с вложенностью " "(n)\n" -# well-spelled: МАСК -#: help.c:261 +# well-spelled: МСК +#: help.c:260 #, c-format -msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" -msgstr " \\drds [МАСК1 [МАСК2]] список параметров роли на уровне БД\n" +msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" +msgstr " \\drds [МСК_РОЛИ [МСК_БД]] список параметров роли на уровне БД\n" -#: help.c:262 +#: help.c:261 #, c-format msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [МАСКА] список публикаций для репликации\n" -#: help.c:263 +#: help.c:262 #, c-format msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [МАСКА] список подписок на репликацию\n" -#: help.c:264 +#: help.c:263 #, c-format msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [МАСКА] список последовательностей\n" -#: help.c:265 +#: help.c:264 #, c-format msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [МАСКА] список таблиц\n" -#: help.c:266 +#: help.c:265 #, c-format msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [МАСКА] список типов данных\n" -#: help.c:267 +#: help.c:266 #, c-format msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [МАСКА] список ролей\n" -#: help.c:268 +#: help.c:267 #, c-format msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [МАСКА] список представлений\n" -#: help.c:269 +#: help.c:268 #, c-format msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [МАСКА] список расширений\n" +#: help.c:269 +#, c-format +msgid " \\dX [PATTERN] list extended statistics\n" +msgstr " \\dX [МАСКА] список расширенных статистик\n" + #: help.c:270 #, c-format -msgid " \\dy [PATTERN] list event triggers\n" -msgstr " \\dy [МАСКА] список событийных триггеров\n" +msgid " \\dy[+] [PATTERN] list event triggers\n" +msgstr " \\dy[+] [МАСКА] список событийных триггеров\n" #: help.c:271 #, c-format @@ -3647,6 +3708,15 @@ msgstr "" #: help.c:379 #, c-format msgid "" +" HIDE_TOAST_COMPRESSION\n" +" if set, compression methods are not displayed\n" +msgstr "" +" HIDE_TOAST_COMPRESSION\n" +" если установлено, методы сжатия не выводятся\n" + +#: help.c:381 +#, c-format +msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" msgstr "" @@ -3654,7 +3724,7 @@ msgstr "" " управляет историей команд [ignorespace (игнорировать пробелы),\n" " ignoredups (игнорировать дубли), ignoreboth (и то, и другое)]\n" -#: help.c:381 +#: help.c:383 #, c-format msgid "" " HISTFILE\n" @@ -3663,7 +3733,7 @@ msgstr "" " HISTFILE\n" " имя файла, в котором будет сохраняться история команд\n" -#: help.c:383 +#: help.c:385 #, c-format msgid "" " HISTSIZE\n" @@ -3672,7 +3742,7 @@ msgstr "" " HISTSIZE\n" " максимальное число команд, сохраняемых в истории\n" -#: help.c:385 +#: help.c:387 #, c-format msgid "" " HOST\n" @@ -3681,7 +3751,7 @@ msgstr "" " HOST\n" " сервер баз данных, к которому установлено подключение\n" -#: help.c:387 +#: help.c:389 #, c-format msgid "" " IGNOREEOF\n" @@ -3690,7 +3760,7 @@ msgstr "" " IGNOREEOF\n" " количество EOF для завершения интерактивного сеанса\n" -#: help.c:389 +#: help.c:391 #, c-format msgid "" " LASTOID\n" @@ -3699,7 +3769,7 @@ msgstr "" " LASTOID\n" " значение последнего задействованного OID\n" -#: help.c:391 +#: help.c:393 #, c-format msgid "" " LAST_ERROR_MESSAGE\n" @@ -3713,7 +3783,7 @@ msgstr "" "\"00000\",\n" " если ошибки не было\n" -#: help.c:394 +#: help.c:396 #, c-format msgid "" " ON_ERROR_ROLLBACK\n" @@ -3723,7 +3793,7 @@ msgstr "" " если установлено, транзакция не прекращается при ошибке\n" " (используются неявные точки сохранения)\n" -#: help.c:396 +#: help.c:398 #, c-format msgid "" " ON_ERROR_STOP\n" @@ -3732,7 +3802,7 @@ msgstr "" " ON_ERROR_STOP\n" " останавливать выполнение пакета команд после ошибки\n" -#: help.c:398 +#: help.c:400 #, c-format msgid "" " PORT\n" @@ -3741,7 +3811,7 @@ msgstr "" " PORT\n" " порт сервера для текущего соединения\n" -#: help.c:400 +#: help.c:402 #, c-format msgid "" " PROMPT1\n" @@ -3750,7 +3820,7 @@ msgstr "" " PROMPT1\n" " устанавливает стандартное приглашение psql\n" -#: help.c:402 +#: help.c:404 #, c-format msgid "" " PROMPT2\n" @@ -3761,7 +3831,7 @@ msgstr "" " устанавливает приглашение, которое выводится при переносе оператора\n" " на новую строку\n" -#: help.c:404 +#: help.c:406 #, c-format msgid "" " PROMPT3\n" @@ -3770,7 +3840,7 @@ msgstr "" " PROMPT3\n" " устанавливает приглашение для выполнения COPY ... FROM STDIN\n" -#: help.c:406 +#: help.c:408 #, c-format msgid "" " QUIET\n" @@ -3779,7 +3849,7 @@ msgstr "" " QUIET\n" " выводить минимум сообщений (как и с параметром -q)\n" -#: help.c:408 +#: help.c:410 #, c-format msgid "" " ROW_COUNT\n" @@ -3789,7 +3859,7 @@ msgstr "" " число строк, возвращённых или обработанных последним SQL-запросом, либо " "0\n" -#: help.c:410 +#: help.c:412 #, c-format msgid "" " SERVER_VERSION_NAME\n" @@ -3800,7 +3870,7 @@ msgstr "" " SERVER_VERSION_NUM\n" " версия сервера (в коротком текстовом и числовом формате)\n" -#: help.c:413 +#: help.c:415 #, c-format msgid "" " SHOW_CONTEXT\n" @@ -3810,7 +3880,7 @@ msgstr "" " управляет отображением полей контекста сообщений\n" " [never (не отображать никогда), errors (ошибки), always (всегда]\n" -#: help.c:415 +#: help.c:417 #, c-format msgid "" " SINGLELINE\n" @@ -3820,7 +3890,7 @@ msgstr "" " если установлено, конец строки завершает режим ввода SQL-команды\n" " (как и с параметром -S)\n" -#: help.c:417 +#: help.c:419 #, c-format msgid "" " SINGLESTEP\n" @@ -3829,7 +3899,7 @@ msgstr "" " SINGLESTEP\n" " пошаговый режим (как и с параметром -s)\n" -#: help.c:419 +#: help.c:421 #, c-format msgid "" " SQLSTATE\n" @@ -3839,7 +3909,7 @@ msgstr "" " SQLSTATE последнего запроса или \"00000\", если он выполнился без " "ошибок\n" -#: help.c:421 +#: help.c:423 #, c-format msgid "" " USER\n" @@ -3848,7 +3918,7 @@ msgstr "" " USER\n" " текущий пользователь, подключённый к БД\n" -#: help.c:423 +#: help.c:425 #, c-format msgid "" " VERBOSITY\n" @@ -3858,7 +3928,7 @@ msgstr "" " управляет детализацией отчётов об ошибках [default (по умолчанию),\n" " verbose (подробно), terse (кратко), sqlstate (код состояния)]\n" -#: help.c:425 +#: help.c:427 #, c-format msgid "" " VERSION\n" @@ -3871,7 +3941,7 @@ msgstr "" " VERSION_NUM\n" " версия psql (в развёрнутом, в коротком текстовом и в числовом формате)\n" -#: help.c:430 +#: help.c:432 #, c-format msgid "" "\n" @@ -3880,7 +3950,7 @@ msgstr "" "\n" "Параметры отображения:\n" -#: help.c:432 +#: help.c:434 #, c-format msgid "" " psql --pset=NAME[=VALUE]\n" @@ -3891,7 +3961,7 @@ msgstr "" " или \\pset ИМЯ [ЗНАЧЕНИЕ] в приглашении psql\n" "\n" -#: help.c:434 +#: help.c:436 #, c-format msgid "" " border\n" @@ -3900,7 +3970,7 @@ msgstr "" " border\n" " стиль границы (число)\n" -#: help.c:436 +#: help.c:438 #, c-format msgid "" " columns\n" @@ -3909,7 +3979,7 @@ msgstr "" " columns\n" " целевая ширина для формата с переносом\n" -#: help.c:438 +#: help.c:440 #, c-format msgid "" " expanded (or x)\n" @@ -3918,7 +3988,7 @@ msgstr "" " expanded (или x)\n" " расширенный вывод [on (вкл.), off (выкл.), auto (авто)]\n" -#: help.c:440 +#: help.c:442 #, c-format msgid "" " fieldsep\n" @@ -3927,7 +3997,7 @@ msgstr "" " fieldsep\n" " разделитель полей для неформатированного вывода (по умолчанию \"%s\")\n" -#: help.c:443 +#: help.c:445 #, c-format msgid "" " fieldsep_zero\n" @@ -3936,7 +4006,7 @@ msgstr "" " fieldsep_zero\n" " устанавливает ноль разделителем полей при неформатированном выводе\n" -#: help.c:445 +#: help.c:447 #, c-format msgid "" " footer\n" @@ -3945,7 +4015,7 @@ msgstr "" " footer\n" " включает или выключает вывод подписей таблицы [on (вкл.), off (выкл.)]\n" -#: help.c:447 +#: help.c:449 #, c-format msgid "" " format\n" @@ -3956,7 +4026,7 @@ msgstr "" "\n" " aligned (выровненный), wrapped (с переносом), html, asciidoc, ...]\n" -#: help.c:449 +#: help.c:451 #, c-format msgid "" " linestyle\n" @@ -3965,7 +4035,7 @@ msgstr "" " linestyle\n" " задаёт стиль рисования линий границы [ascii, old-ascii, unicode]\n" -#: help.c:451 +#: help.c:453 #, c-format msgid "" " null\n" @@ -3974,7 +4044,7 @@ msgstr "" " null\n" " устанавливает строку, выводимую вместо значения NULL\n" -#: help.c:453 +#: help.c:455 #, c-format msgid "" " numericlocale\n" @@ -3984,7 +4054,7 @@ msgstr "" " numericlocale\n" " отключает вывод заданного локалью разделителя группы цифр\n" -#: help.c:455 +#: help.c:457 #, c-format msgid "" " pager\n" @@ -3994,7 +4064,7 @@ msgstr "" " определяет, используется ли внешний постраничник\n" " [yes (да), no (нет), always (всегда)]\n" -#: help.c:457 +#: help.c:459 #, c-format msgid "" " recordsep\n" @@ -4003,7 +4073,7 @@ msgstr "" " recordsep\n" " разделитель записей (строк) при неформатированном выводе\n" -#: help.c:459 +#: help.c:461 #, c-format msgid "" " recordsep_zero\n" @@ -4012,7 +4082,7 @@ msgstr "" " recordsep_zero\n" " устанавливает ноль разделителем записей при неформатированном выводе\n" -#: help.c:461 +#: help.c:463 #, c-format msgid "" " tableattr (or T)\n" @@ -4023,7 +4093,7 @@ msgstr "" " задаёт атрибуты для тега table в формате html или пропорциональные\n" " ширины столбцов для выровненных влево данных, в формате latex-longtable\n" -#: help.c:464 +#: help.c:466 #, c-format msgid "" " title\n" @@ -4032,7 +4102,7 @@ msgstr "" " title\n" " задаёт заголовок таблицы для последовательно печатаемых таблиц\n" -#: help.c:466 +#: help.c:468 #, c-format msgid "" " tuples_only\n" @@ -4041,7 +4111,7 @@ msgstr "" " tuples_only\n" " если установлено, выводятся только непосредственно табличные данные\n" -#: help.c:468 +#: help.c:470 #, c-format msgid "" " unicode_border_linestyle\n" @@ -4055,7 +4125,7 @@ msgstr "" " задаёт стиль рисуемых линий Unicode [single (одинарные), double " "(двойные)]\n" -#: help.c:473 +#: help.c:475 #, c-format msgid "" "\n" @@ -4064,7 +4134,7 @@ msgstr "" "\n" "Переменные окружения:\n" -#: help.c:477 +#: help.c:479 #, c-format msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" @@ -4075,7 +4145,7 @@ msgstr "" " или \\setenv ИМЯ [ЗНАЧЕНИЕ] в приглашении psql\n" "\n" -#: help.c:479 +#: help.c:481 #, c-format msgid "" " set NAME=VALUE\n" @@ -4088,7 +4158,7 @@ msgstr "" " или \\setenv ИМЯ ЗНАЧЕНИЕ в приглашении psql\n" "\n" -#: help.c:482 +#: help.c:484 #, c-format msgid "" " COLUMNS\n" @@ -4097,7 +4167,7 @@ msgstr "" " COLUMNS\n" " число столбцов для форматирования с переносом\n" -#: help.c:484 +#: help.c:486 #, c-format msgid "" " PGAPPNAME\n" @@ -4106,7 +4176,7 @@ msgstr "" " PGAPPNAME\n" " синоним параметра подключения application_name\n" -#: help.c:486 +#: help.c:488 #, c-format msgid "" " PGDATABASE\n" @@ -4115,7 +4185,7 @@ msgstr "" " PGDATABASE\n" " синоним параметра подключения dbname\n" -#: help.c:488 +#: help.c:490 #, c-format msgid "" " PGHOST\n" @@ -4124,15 +4194,6 @@ msgstr "" " PGHOST\n" " синоним параметра подключения host\n" -#: help.c:490 -#, c-format -msgid "" -" PGPASSWORD\n" -" connection password (not recommended)\n" -msgstr "" -" PGPASSWORD\n" -" пароль для подключения (использовать не рекомендуется)\n" - #: help.c:492 #, c-format msgid "" @@ -4145,13 +4206,22 @@ msgstr "" #: help.c:494 #, c-format msgid "" +" PGPASSWORD\n" +" connection password (not recommended)\n" +msgstr "" +" PGPASSWORD\n" +" пароль для подключения (использовать не рекомендуется)\n" + +#: help.c:496 +#, c-format +msgid "" " PGPORT\n" " same as the port connection parameter\n" msgstr "" " PGPORT\n" " синоним параметра подключения port\n" -#: help.c:496 +#: help.c:498 #, c-format msgid "" " PGUSER\n" @@ -4160,7 +4230,7 @@ msgstr "" " PGUSER\n" " синоним параметра подключения user\n" -#: help.c:498 +#: help.c:500 #, c-format msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" @@ -4169,7 +4239,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " редактор, вызываемый командами \\e, \\ef и \\ev\n" -#: help.c:500 +#: help.c:502 #, c-format msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" @@ -4178,7 +4248,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " определяет способ передачи номера строки при вызове редактора\n" -#: help.c:502 +#: help.c:504 #, c-format msgid "" " PSQL_HISTORY\n" @@ -4187,7 +4257,7 @@ msgstr "" " PSQL_HISTORY\n" " альтернативное размещение файла с историей команд\n" -#: help.c:504 +#: help.c:506 #, c-format msgid "" " PSQL_PAGER, PAGER\n" @@ -4196,7 +4266,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " имя программы внешнего постраничника\n" -#: help.c:506 +#: help.c:508 #, c-format msgid "" " PSQLRC\n" @@ -4205,7 +4275,7 @@ msgstr "" " PSQLRC\n" " альтернативное размещение пользовательского файла .psqlrc\n" -#: help.c:508 +#: help.c:510 #, c-format msgid "" " SHELL\n" @@ -4214,7 +4284,7 @@ msgstr "" " SHELL\n" " оболочка, вызываемая командой \\!\n" -#: help.c:510 +#: help.c:512 #, c-format msgid "" " TMPDIR\n" @@ -4223,11 +4293,11 @@ msgstr "" " TMPDIR\n" " каталог для временных файлов\n" -#: help.c:555 +#: help.c:557 msgid "Available help:\n" msgstr "Имеющаяся справка:\n" -#: help.c:650 +#: help.c:652 #, c-format msgid "" "Command: %s\n" @@ -4246,7 +4316,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:673 +#: help.c:675 #, c-format msgid "" "No help available for \"%s\".\n" @@ -4384,192 +4454,194 @@ msgstr "%s: нехватка памяти" #: sql_help.c:249 sql_help.c:251 sql_help.c:263 sql_help.c:264 sql_help.c:265 #: sql_help.c:267 sql_help.c:316 sql_help.c:318 sql_help.c:320 sql_help.c:322 #: sql_help.c:391 sql_help.c:396 sql_help.c:398 sql_help.c:440 sql_help.c:442 -#: sql_help.c:445 sql_help.c:447 sql_help.c:515 sql_help.c:520 sql_help.c:525 -#: sql_help.c:530 sql_help.c:535 sql_help.c:588 sql_help.c:590 sql_help.c:592 -#: sql_help.c:594 sql_help.c:596 sql_help.c:599 sql_help.c:601 sql_help.c:604 -#: sql_help.c:615 sql_help.c:617 sql_help.c:658 sql_help.c:660 sql_help.c:662 -#: sql_help.c:665 sql_help.c:667 sql_help.c:669 sql_help.c:702 sql_help.c:706 -#: sql_help.c:710 sql_help.c:729 sql_help.c:732 sql_help.c:735 sql_help.c:764 -#: sql_help.c:776 sql_help.c:784 sql_help.c:787 sql_help.c:790 sql_help.c:805 -#: sql_help.c:808 sql_help.c:837 sql_help.c:842 sql_help.c:847 sql_help.c:852 -#: sql_help.c:857 sql_help.c:879 sql_help.c:881 sql_help.c:883 sql_help.c:885 -#: sql_help.c:888 sql_help.c:890 sql_help.c:931 sql_help.c:975 sql_help.c:980 -#: sql_help.c:985 sql_help.c:990 sql_help.c:995 sql_help.c:1014 sql_help.c:1025 -#: sql_help.c:1027 sql_help.c:1046 sql_help.c:1056 sql_help.c:1058 -#: sql_help.c:1060 sql_help.c:1072 sql_help.c:1076 sql_help.c:1078 -#: sql_help.c:1090 sql_help.c:1092 sql_help.c:1094 sql_help.c:1096 -#: sql_help.c:1112 sql_help.c:1114 sql_help.c:1118 sql_help.c:1121 -#: sql_help.c:1122 sql_help.c:1123 sql_help.c:1126 sql_help.c:1128 -#: sql_help.c:1262 sql_help.c:1264 sql_help.c:1267 sql_help.c:1270 -#: sql_help.c:1272 sql_help.c:1274 sql_help.c:1277 sql_help.c:1280 -#: sql_help.c:1391 sql_help.c:1393 sql_help.c:1395 sql_help.c:1398 -#: sql_help.c:1419 sql_help.c:1422 sql_help.c:1425 sql_help.c:1428 -#: sql_help.c:1432 sql_help.c:1434 sql_help.c:1436 sql_help.c:1438 -#: sql_help.c:1452 sql_help.c:1455 sql_help.c:1457 sql_help.c:1459 -#: sql_help.c:1469 sql_help.c:1471 sql_help.c:1481 sql_help.c:1483 -#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1519 sql_help.c:1521 -#: sql_help.c:1523 sql_help.c:1525 sql_help.c:1528 sql_help.c:1530 -#: sql_help.c:1533 sql_help.c:1536 sql_help.c:1586 sql_help.c:1629 -#: sql_help.c:1632 sql_help.c:1634 sql_help.c:1636 sql_help.c:1639 -#: sql_help.c:1641 sql_help.c:1643 sql_help.c:1646 sql_help.c:1696 -#: sql_help.c:1712 sql_help.c:1933 sql_help.c:2002 sql_help.c:2021 -#: sql_help.c:2034 sql_help.c:2091 sql_help.c:2098 sql_help.c:2108 -#: sql_help.c:2129 sql_help.c:2155 sql_help.c:2173 sql_help.c:2200 -#: sql_help.c:2295 sql_help.c:2340 sql_help.c:2364 sql_help.c:2387 -#: sql_help.c:2391 sql_help.c:2425 sql_help.c:2445 sql_help.c:2467 -#: sql_help.c:2481 sql_help.c:2501 sql_help.c:2524 sql_help.c:2554 -#: sql_help.c:2579 sql_help.c:2625 sql_help.c:2903 sql_help.c:2916 -#: sql_help.c:2933 sql_help.c:2949 sql_help.c:2989 sql_help.c:3041 -#: sql_help.c:3045 sql_help.c:3047 sql_help.c:3053 sql_help.c:3071 -#: sql_help.c:3098 sql_help.c:3133 sql_help.c:3145 sql_help.c:3154 -#: sql_help.c:3198 sql_help.c:3212 sql_help.c:3240 sql_help.c:3248 -#: sql_help.c:3260 sql_help.c:3270 sql_help.c:3278 sql_help.c:3286 -#: sql_help.c:3294 sql_help.c:3302 sql_help.c:3311 sql_help.c:3322 -#: sql_help.c:3330 sql_help.c:3338 sql_help.c:3346 sql_help.c:3354 -#: sql_help.c:3364 sql_help.c:3373 sql_help.c:3382 sql_help.c:3390 -#: sql_help.c:3400 sql_help.c:3411 sql_help.c:3419 sql_help.c:3428 -#: sql_help.c:3439 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 -#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3488 sql_help.c:3496 -#: sql_help.c:3504 sql_help.c:3512 sql_help.c:3520 sql_help.c:3528 -#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3562 sql_help.c:3579 -#: sql_help.c:3594 sql_help.c:3869 sql_help.c:3920 sql_help.c:3949 -#: sql_help.c:3962 sql_help.c:4407 sql_help.c:4455 sql_help.c:4596 +#: sql_help.c:445 sql_help.c:447 sql_help.c:516 sql_help.c:521 sql_help.c:526 +#: sql_help.c:531 sql_help.c:536 sql_help.c:590 sql_help.c:592 sql_help.c:594 +#: sql_help.c:596 sql_help.c:598 sql_help.c:601 sql_help.c:603 sql_help.c:606 +#: sql_help.c:617 sql_help.c:619 sql_help.c:661 sql_help.c:663 sql_help.c:665 +#: sql_help.c:668 sql_help.c:670 sql_help.c:672 sql_help.c:707 sql_help.c:711 +#: sql_help.c:715 sql_help.c:734 sql_help.c:737 sql_help.c:740 sql_help.c:769 +#: sql_help.c:781 sql_help.c:789 sql_help.c:792 sql_help.c:795 sql_help.c:810 +#: sql_help.c:813 sql_help.c:842 sql_help.c:847 sql_help.c:852 sql_help.c:857 +#: sql_help.c:862 sql_help.c:884 sql_help.c:886 sql_help.c:888 sql_help.c:890 +#: sql_help.c:893 sql_help.c:895 sql_help.c:937 sql_help.c:982 sql_help.c:987 +#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1021 +#: sql_help.c:1032 sql_help.c:1034 sql_help.c:1053 sql_help.c:1063 +#: sql_help.c:1065 sql_help.c:1067 sql_help.c:1079 sql_help.c:1083 +#: sql_help.c:1085 sql_help.c:1097 sql_help.c:1099 sql_help.c:1101 +#: sql_help.c:1103 sql_help.c:1121 sql_help.c:1123 sql_help.c:1127 +#: sql_help.c:1131 sql_help.c:1135 sql_help.c:1138 sql_help.c:1139 +#: sql_help.c:1140 sql_help.c:1143 sql_help.c:1145 sql_help.c:1280 +#: sql_help.c:1282 sql_help.c:1285 sql_help.c:1288 sql_help.c:1290 +#: sql_help.c:1292 sql_help.c:1295 sql_help.c:1298 sql_help.c:1411 +#: sql_help.c:1413 sql_help.c:1415 sql_help.c:1418 sql_help.c:1439 +#: sql_help.c:1442 sql_help.c:1445 sql_help.c:1448 sql_help.c:1452 +#: sql_help.c:1454 sql_help.c:1456 sql_help.c:1458 sql_help.c:1472 +#: sql_help.c:1475 sql_help.c:1477 sql_help.c:1479 sql_help.c:1489 +#: sql_help.c:1491 sql_help.c:1501 sql_help.c:1503 sql_help.c:1513 +#: sql_help.c:1516 sql_help.c:1539 sql_help.c:1541 sql_help.c:1543 +#: sql_help.c:1545 sql_help.c:1548 sql_help.c:1550 sql_help.c:1553 +#: sql_help.c:1556 sql_help.c:1607 sql_help.c:1650 sql_help.c:1653 +#: sql_help.c:1655 sql_help.c:1657 sql_help.c:1660 sql_help.c:1662 +#: sql_help.c:1664 sql_help.c:1667 sql_help.c:1717 sql_help.c:1733 +#: sql_help.c:1964 sql_help.c:2033 sql_help.c:2052 sql_help.c:2065 +#: sql_help.c:2122 sql_help.c:2129 sql_help.c:2139 sql_help.c:2160 +#: sql_help.c:2186 sql_help.c:2204 sql_help.c:2232 sql_help.c:2329 +#: sql_help.c:2375 sql_help.c:2399 sql_help.c:2422 sql_help.c:2426 +#: sql_help.c:2460 sql_help.c:2480 sql_help.c:2502 sql_help.c:2516 +#: sql_help.c:2537 sql_help.c:2561 sql_help.c:2591 sql_help.c:2616 +#: sql_help.c:2663 sql_help.c:2951 sql_help.c:2964 sql_help.c:2981 +#: sql_help.c:2997 sql_help.c:3037 sql_help.c:3091 sql_help.c:3095 +#: sql_help.c:3097 sql_help.c:3104 sql_help.c:3123 sql_help.c:3150 +#: sql_help.c:3185 sql_help.c:3197 sql_help.c:3206 sql_help.c:3250 +#: sql_help.c:3264 sql_help.c:3292 sql_help.c:3300 sql_help.c:3312 +#: sql_help.c:3322 sql_help.c:3330 sql_help.c:3338 sql_help.c:3346 +#: sql_help.c:3354 sql_help.c:3363 sql_help.c:3374 sql_help.c:3382 +#: sql_help.c:3390 sql_help.c:3398 sql_help.c:3406 sql_help.c:3416 +#: sql_help.c:3425 sql_help.c:3434 sql_help.c:3442 sql_help.c:3452 +#: sql_help.c:3463 sql_help.c:3471 sql_help.c:3480 sql_help.c:3491 +#: sql_help.c:3500 sql_help.c:3508 sql_help.c:3516 sql_help.c:3524 +#: sql_help.c:3532 sql_help.c:3540 sql_help.c:3548 sql_help.c:3556 +#: sql_help.c:3564 sql_help.c:3572 sql_help.c:3580 sql_help.c:3597 +#: sql_help.c:3606 sql_help.c:3614 sql_help.c:3631 sql_help.c:3646 +#: sql_help.c:3948 sql_help.c:3999 sql_help.c:4028 sql_help.c:4043 +#: sql_help.c:4528 sql_help.c:4576 sql_help.c:4727 msgid "name" msgstr "имя" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1783 -#: sql_help.c:3213 sql_help.c:4193 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1814 +#: sql_help.c:3265 sql_help.c:4304 msgid "aggregate_signature" msgstr "сигнатура_агр_функции" #: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:250 -#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:524 sql_help.c:571 -#: sql_help.c:589 sql_help.c:616 sql_help.c:666 sql_help.c:731 sql_help.c:786 -#: sql_help.c:807 sql_help.c:846 sql_help.c:891 sql_help.c:932 sql_help.c:984 -#: sql_help.c:1016 sql_help.c:1026 sql_help.c:1059 sql_help.c:1079 -#: sql_help.c:1093 sql_help.c:1129 sql_help.c:1271 sql_help.c:1392 -#: sql_help.c:1435 sql_help.c:1456 sql_help.c:1470 sql_help.c:1482 -#: sql_help.c:1495 sql_help.c:1522 sql_help.c:1587 sql_help.c:1640 +#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:525 sql_help.c:573 +#: sql_help.c:591 sql_help.c:618 sql_help.c:669 sql_help.c:736 sql_help.c:791 +#: sql_help.c:812 sql_help.c:851 sql_help.c:896 sql_help.c:938 sql_help.c:991 +#: sql_help.c:1023 sql_help.c:1033 sql_help.c:1066 sql_help.c:1086 +#: sql_help.c:1100 sql_help.c:1146 sql_help.c:1289 sql_help.c:1412 +#: sql_help.c:1455 sql_help.c:1476 sql_help.c:1490 sql_help.c:1502 +#: sql_help.c:1515 sql_help.c:1542 sql_help.c:1608 sql_help.c:1661 msgid "new_name" msgstr "новое_имя" #: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:120 sql_help.c:248 -#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:529 sql_help.c:618 -#: sql_help.c:627 sql_help.c:685 sql_help.c:705 sql_help.c:734 sql_help.c:789 -#: sql_help.c:851 sql_help.c:889 sql_help.c:989 sql_help.c:1028 sql_help.c:1057 -#: sql_help.c:1077 sql_help.c:1091 sql_help.c:1127 sql_help.c:1332 -#: sql_help.c:1394 sql_help.c:1437 sql_help.c:1458 sql_help.c:1520 -#: sql_help.c:1635 sql_help.c:2889 +#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:530 sql_help.c:620 +#: sql_help.c:629 sql_help.c:690 sql_help.c:710 sql_help.c:739 sql_help.c:794 +#: sql_help.c:856 sql_help.c:894 sql_help.c:996 sql_help.c:1035 sql_help.c:1064 +#: sql_help.c:1084 sql_help.c:1098 sql_help.c:1144 sql_help.c:1352 +#: sql_help.c:1414 sql_help.c:1457 sql_help.c:1478 sql_help.c:1540 +#: sql_help.c:1656 sql_help.c:2937 msgid "new_owner" msgstr "новый_владелец" #: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319 -#: sql_help.c:448 sql_help.c:534 sql_help.c:668 sql_help.c:709 sql_help.c:737 -#: sql_help.c:792 sql_help.c:856 sql_help.c:994 sql_help.c:1061 sql_help.c:1095 -#: sql_help.c:1273 sql_help.c:1439 sql_help.c:1460 sql_help.c:1472 -#: sql_help.c:1484 sql_help.c:1524 sql_help.c:1642 +#: sql_help.c:448 sql_help.c:535 sql_help.c:671 sql_help.c:714 sql_help.c:742 +#: sql_help.c:797 sql_help.c:861 sql_help.c:1001 sql_help.c:1068 +#: sql_help.c:1102 sql_help.c:1291 sql_help.c:1459 sql_help.c:1480 +#: sql_help.c:1492 sql_help.c:1504 sql_help.c:1544 sql_help.c:1663 msgid "new_schema" msgstr "новая_схема" -#: sql_help.c:44 sql_help.c:1847 sql_help.c:3214 sql_help.c:4222 +#: sql_help.c:44 sql_help.c:1878 sql_help.c:3266 sql_help.c:4333 msgid "where aggregate_signature is:" msgstr "где сигнатура_агр_функции:" #: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:337 sql_help.c:350 -#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:516 -#: sql_help.c:521 sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:838 -#: sql_help.c:843 sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:976 -#: sql_help.c:981 sql_help.c:986 sql_help.c:991 sql_help.c:996 sql_help.c:1801 -#: sql_help.c:1818 sql_help.c:1824 sql_help.c:1848 sql_help.c:1851 -#: sql_help.c:1854 sql_help.c:2003 sql_help.c:2022 sql_help.c:2025 -#: sql_help.c:2296 sql_help.c:2502 sql_help.c:3215 sql_help.c:3218 -#: sql_help.c:3221 sql_help.c:3312 sql_help.c:3401 sql_help.c:3429 -#: sql_help.c:3753 sql_help.c:4101 sql_help.c:4199 sql_help.c:4206 -#: sql_help.c:4212 sql_help.c:4223 sql_help.c:4226 sql_help.c:4229 +#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:517 +#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:843 +#: sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:863 sql_help.c:983 +#: sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1003 sql_help.c:1832 +#: sql_help.c:1849 sql_help.c:1855 sql_help.c:1879 sql_help.c:1882 +#: sql_help.c:1885 sql_help.c:2034 sql_help.c:2053 sql_help.c:2056 +#: sql_help.c:2330 sql_help.c:2538 sql_help.c:3267 sql_help.c:3270 +#: sql_help.c:3273 sql_help.c:3364 sql_help.c:3453 sql_help.c:3481 +#: sql_help.c:3826 sql_help.c:4206 sql_help.c:4310 sql_help.c:4317 +#: sql_help.c:4323 sql_help.c:4334 sql_help.c:4337 sql_help.c:4340 msgid "argmode" msgstr "режим_аргумента" #: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:338 sql_help.c:351 -#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:839 -#: sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:977 -#: sql_help.c:982 sql_help.c:987 sql_help.c:992 sql_help.c:997 sql_help.c:1802 -#: sql_help.c:1819 sql_help.c:1825 sql_help.c:1849 sql_help.c:1852 -#: sql_help.c:1855 sql_help.c:2004 sql_help.c:2023 sql_help.c:2026 -#: sql_help.c:2297 sql_help.c:2503 sql_help.c:3216 sql_help.c:3219 -#: sql_help.c:3222 sql_help.c:3313 sql_help.c:3402 sql_help.c:3430 -#: sql_help.c:4200 sql_help.c:4207 sql_help.c:4213 sql_help.c:4224 -#: sql_help.c:4227 sql_help.c:4230 +#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:518 +#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:844 +#: sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:864 sql_help.c:984 +#: sql_help.c:989 sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1833 +#: sql_help.c:1850 sql_help.c:1856 sql_help.c:1880 sql_help.c:1883 +#: sql_help.c:1886 sql_help.c:2035 sql_help.c:2054 sql_help.c:2057 +#: sql_help.c:2331 sql_help.c:2539 sql_help.c:3268 sql_help.c:3271 +#: sql_help.c:3274 sql_help.c:3365 sql_help.c:3454 sql_help.c:3482 +#: sql_help.c:4311 sql_help.c:4318 sql_help.c:4324 sql_help.c:4335 +#: sql_help.c:4338 sql_help.c:4341 msgid "argname" msgstr "имя_аргумента" #: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:339 sql_help.c:352 -#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:840 -#: sql_help.c:845 sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:978 -#: sql_help.c:983 sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1803 -#: sql_help.c:1820 sql_help.c:1826 sql_help.c:1850 sql_help.c:1853 -#: sql_help.c:1856 sql_help.c:2298 sql_help.c:2504 sql_help.c:3217 -#: sql_help.c:3220 sql_help.c:3223 sql_help.c:3314 sql_help.c:3403 -#: sql_help.c:3431 sql_help.c:4201 sql_help.c:4208 sql_help.c:4214 -#: sql_help.c:4225 sql_help.c:4228 sql_help.c:4231 +#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:519 +#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:845 +#: sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:985 +#: sql_help.c:990 sql_help.c:995 sql_help.c:1000 sql_help.c:1005 +#: sql_help.c:1834 sql_help.c:1851 sql_help.c:1857 sql_help.c:1881 +#: sql_help.c:1884 sql_help.c:1887 sql_help.c:2332 sql_help.c:2540 +#: sql_help.c:3269 sql_help.c:3272 sql_help.c:3275 sql_help.c:3366 +#: sql_help.c:3455 sql_help.c:3483 sql_help.c:4312 sql_help.c:4319 +#: sql_help.c:4325 sql_help.c:4336 sql_help.c:4339 sql_help.c:4342 msgid "argtype" msgstr "тип_аргумента" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:926 -#: sql_help.c:1074 sql_help.c:1453 sql_help.c:1581 sql_help.c:1613 -#: sql_help.c:1665 sql_help.c:1904 sql_help.c:1911 sql_help.c:2203 -#: sql_help.c:2245 sql_help.c:2252 sql_help.c:2261 sql_help.c:2341 -#: sql_help.c:2555 sql_help.c:2647 sql_help.c:2918 sql_help.c:3099 -#: sql_help.c:3121 sql_help.c:3261 sql_help.c:3616 sql_help.c:3788 -#: sql_help.c:3961 sql_help.c:4658 +#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:932 +#: sql_help.c:1081 sql_help.c:1473 sql_help.c:1602 sql_help.c:1634 +#: sql_help.c:1686 sql_help.c:1749 sql_help.c:1935 sql_help.c:1942 +#: sql_help.c:2235 sql_help.c:2277 sql_help.c:2284 sql_help.c:2293 +#: sql_help.c:2376 sql_help.c:2592 sql_help.c:2685 sql_help.c:2966 +#: sql_help.c:3151 sql_help.c:3173 sql_help.c:3313 sql_help.c:3668 +#: sql_help.c:3867 sql_help.c:4042 sql_help.c:4790 msgid "option" msgstr "параметр" -#: sql_help.c:113 sql_help.c:927 sql_help.c:1582 sql_help.c:2342 -#: sql_help.c:2556 sql_help.c:3100 sql_help.c:3262 +#: sql_help.c:113 sql_help.c:933 sql_help.c:1603 sql_help.c:2377 +#: sql_help.c:2593 sql_help.c:3152 sql_help.c:3314 msgid "where option can be:" msgstr "где допустимые параметры:" -#: sql_help.c:114 sql_help.c:2137 +#: sql_help.c:114 sql_help.c:2168 msgid "allowconn" msgstr "разр_подключения" -#: sql_help.c:115 sql_help.c:928 sql_help.c:1583 sql_help.c:2138 -#: sql_help.c:2343 sql_help.c:2557 sql_help.c:3101 +#: sql_help.c:115 sql_help.c:934 sql_help.c:1604 sql_help.c:2169 +#: sql_help.c:2378 sql_help.c:2594 sql_help.c:3153 msgid "connlimit" msgstr "предел_подключений" -#: sql_help.c:116 sql_help.c:2139 +#: sql_help.c:116 sql_help.c:2170 msgid "istemplate" msgstr "это_шаблон" -#: sql_help.c:122 sql_help.c:606 sql_help.c:671 sql_help.c:1276 sql_help.c:1325 +#: sql_help.c:122 sql_help.c:608 sql_help.c:674 sql_help.c:1294 sql_help.c:1345 +#: sql_help.c:4046 msgid "new_tablespace" msgstr "новое_табл_пространство" -#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:544 sql_help.c:546 -#: sql_help.c:547 sql_help.c:863 sql_help.c:865 sql_help.c:866 sql_help.c:935 -#: sql_help.c:939 sql_help.c:942 sql_help.c:1003 sql_help.c:1005 -#: sql_help.c:1006 sql_help.c:1140 sql_help.c:1143 sql_help.c:1590 -#: sql_help.c:1594 sql_help.c:1597 sql_help.c:2308 sql_help.c:2508 -#: sql_help.c:3980 sql_help.c:4396 +#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:545 sql_help.c:547 +#: sql_help.c:548 sql_help.c:868 sql_help.c:870 sql_help.c:871 sql_help.c:941 +#: sql_help.c:945 sql_help.c:948 sql_help.c:1010 sql_help.c:1012 +#: sql_help.c:1013 sql_help.c:1157 sql_help.c:1160 sql_help.c:1611 +#: sql_help.c:1615 sql_help.c:1618 sql_help.c:2342 sql_help.c:2544 +#: sql_help.c:4064 sql_help.c:4517 msgid "configuration_parameter" msgstr "параметр_конфигурации" #: sql_help.c:125 sql_help.c:395 sql_help.c:466 sql_help.c:472 sql_help.c:484 -#: sql_help.c:545 sql_help.c:598 sql_help.c:677 sql_help.c:683 sql_help.c:864 -#: sql_help.c:887 sql_help.c:936 sql_help.c:1004 sql_help.c:1075 -#: sql_help.c:1117 sql_help.c:1120 sql_help.c:1125 sql_help.c:1141 -#: sql_help.c:1142 sql_help.c:1307 sql_help.c:1327 sql_help.c:1375 -#: sql_help.c:1397 sql_help.c:1454 sql_help.c:1538 sql_help.c:1591 -#: sql_help.c:1614 sql_help.c:2204 sql_help.c:2246 sql_help.c:2253 -#: sql_help.c:2262 sql_help.c:2309 sql_help.c:2310 sql_help.c:2372 -#: sql_help.c:2375 sql_help.c:2409 sql_help.c:2509 sql_help.c:2510 -#: sql_help.c:2527 sql_help.c:2648 sql_help.c:2678 sql_help.c:2783 -#: sql_help.c:2796 sql_help.c:2810 sql_help.c:2851 sql_help.c:2875 -#: sql_help.c:2892 sql_help.c:2919 sql_help.c:3122 sql_help.c:3789 -#: sql_help.c:4397 sql_help.c:4398 +#: sql_help.c:546 sql_help.c:600 sql_help.c:680 sql_help.c:688 sql_help.c:869 +#: sql_help.c:892 sql_help.c:942 sql_help.c:1011 sql_help.c:1082 +#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:1137 +#: sql_help.c:1142 sql_help.c:1158 sql_help.c:1159 sql_help.c:1325 +#: sql_help.c:1347 sql_help.c:1395 sql_help.c:1417 sql_help.c:1474 +#: sql_help.c:1558 sql_help.c:1612 sql_help.c:1635 sql_help.c:2236 +#: sql_help.c:2278 sql_help.c:2285 sql_help.c:2294 sql_help.c:2343 +#: sql_help.c:2344 sql_help.c:2407 sql_help.c:2410 sql_help.c:2444 +#: sql_help.c:2545 sql_help.c:2546 sql_help.c:2564 sql_help.c:2686 +#: sql_help.c:2725 sql_help.c:2831 sql_help.c:2844 sql_help.c:2858 +#: sql_help.c:2899 sql_help.c:2923 sql_help.c:2940 sql_help.c:2967 +#: sql_help.c:3174 sql_help.c:3868 sql_help.c:4518 sql_help.c:4519 msgid "value" msgstr "значение" @@ -4577,9 +4649,9 @@ msgstr "значение" msgid "target_role" msgstr "целевая_роль" -#: sql_help.c:198 sql_help.c:2188 sql_help.c:2603 sql_help.c:2608 -#: sql_help.c:3735 sql_help.c:3742 sql_help.c:3756 sql_help.c:3762 -#: sql_help.c:4083 sql_help.c:4090 sql_help.c:4104 sql_help.c:4110 +#: sql_help.c:198 sql_help.c:2220 sql_help.c:2641 sql_help.c:2646 +#: sql_help.c:3801 sql_help.c:3810 sql_help.c:3829 sql_help.c:3838 +#: sql_help.c:4181 sql_help.c:4190 sql_help.c:4209 sql_help.c:4218 msgid "schema_name" msgstr "имя_схемы" @@ -4593,30 +4665,31 @@ msgstr "где допустимое предложение_GRANT_или_REVOKE:" #: sql_help.c:201 sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205 #: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 -#: sql_help.c:569 sql_help.c:605 sql_help.c:670 sql_help.c:810 sql_help.c:946 -#: sql_help.c:1275 sql_help.c:1601 sql_help.c:2346 sql_help.c:2347 -#: sql_help.c:2348 sql_help.c:2349 sql_help.c:2350 sql_help.c:2483 -#: sql_help.c:2560 sql_help.c:2561 sql_help.c:2562 sql_help.c:2563 -#: sql_help.c:2564 sql_help.c:3104 sql_help.c:3105 sql_help.c:3106 -#: sql_help.c:3107 sql_help.c:3108 sql_help.c:3768 sql_help.c:3772 -#: sql_help.c:4116 sql_help.c:4120 sql_help.c:4417 +#: sql_help.c:571 sql_help.c:607 sql_help.c:673 sql_help.c:815 sql_help.c:952 +#: sql_help.c:1293 sql_help.c:1622 sql_help.c:2381 sql_help.c:2382 +#: sql_help.c:2383 sql_help.c:2384 sql_help.c:2385 sql_help.c:2518 +#: sql_help.c:2597 sql_help.c:2598 sql_help.c:2599 sql_help.c:2600 +#: sql_help.c:2601 sql_help.c:3156 sql_help.c:3157 sql_help.c:3158 +#: sql_help.c:3159 sql_help.c:3160 sql_help.c:3847 sql_help.c:3851 +#: sql_help.c:4227 sql_help.c:4231 sql_help.c:4538 msgid "role_name" msgstr "имя_роли" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1291 sql_help.c:1293 -#: sql_help.c:1342 sql_help.c:1354 sql_help.c:1379 sql_help.c:1631 -#: sql_help.c:2158 sql_help.c:2162 sql_help.c:2265 sql_help.c:2270 -#: sql_help.c:2368 sql_help.c:2778 sql_help.c:2791 sql_help.c:2805 -#: sql_help.c:2814 sql_help.c:2826 sql_help.c:2855 sql_help.c:3820 -#: sql_help.c:3835 sql_help.c:3837 sql_help.c:4282 sql_help.c:4283 -#: sql_help.c:4292 sql_help.c:4333 sql_help.c:4334 sql_help.c:4335 -#: sql_help.c:4336 sql_help.c:4337 sql_help.c:4338 sql_help.c:4371 -#: sql_help.c:4372 sql_help.c:4377 sql_help.c:4382 sql_help.c:4521 -#: sql_help.c:4522 sql_help.c:4531 sql_help.c:4572 sql_help.c:4573 -#: sql_help.c:4574 sql_help.c:4575 sql_help.c:4576 sql_help.c:4577 -#: sql_help.c:4624 sql_help.c:4626 sql_help.c:4685 sql_help.c:4741 -#: sql_help.c:4742 sql_help.c:4751 sql_help.c:4792 sql_help.c:4793 -#: sql_help.c:4794 sql_help.c:4795 sql_help.c:4796 sql_help.c:4797 +#: sql_help.c:236 sql_help.c:459 sql_help.c:1309 sql_help.c:1311 +#: sql_help.c:1362 sql_help.c:1374 sql_help.c:1399 sql_help.c:1652 +#: sql_help.c:2189 sql_help.c:2193 sql_help.c:2297 sql_help.c:2302 +#: sql_help.c:2403 sql_help.c:2702 sql_help.c:2707 sql_help.c:2709 +#: sql_help.c:2826 sql_help.c:2839 sql_help.c:2853 sql_help.c:2862 +#: sql_help.c:2874 sql_help.c:2903 sql_help.c:3899 sql_help.c:3914 +#: sql_help.c:3916 sql_help.c:4395 sql_help.c:4396 sql_help.c:4405 +#: sql_help.c:4447 sql_help.c:4448 sql_help.c:4449 sql_help.c:4450 +#: sql_help.c:4451 sql_help.c:4452 sql_help.c:4492 sql_help.c:4493 +#: sql_help.c:4498 sql_help.c:4503 sql_help.c:4644 sql_help.c:4645 +#: sql_help.c:4654 sql_help.c:4696 sql_help.c:4697 sql_help.c:4698 +#: sql_help.c:4699 sql_help.c:4700 sql_help.c:4701 sql_help.c:4755 +#: sql_help.c:4757 sql_help.c:4817 sql_help.c:4875 sql_help.c:4876 +#: sql_help.c:4885 sql_help.c:4927 sql_help.c:4928 sql_help.c:4929 +#: sql_help.c:4930 sql_help.c:4931 sql_help.c:4932 msgid "expression" msgstr "выражение" @@ -4625,18 +4698,18 @@ msgid "domain_constraint" msgstr "ограничение_домена" #: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475 -#: sql_help.c:1268 sql_help.c:1313 sql_help.c:1314 sql_help.c:1315 -#: sql_help.c:1341 sql_help.c:1353 sql_help.c:1370 sql_help.c:1789 -#: sql_help.c:1791 sql_help.c:2161 sql_help.c:2264 sql_help.c:2269 -#: sql_help.c:2813 sql_help.c:2825 sql_help.c:3832 +#: sql_help.c:1286 sql_help.c:1333 sql_help.c:1334 sql_help.c:1335 +#: sql_help.c:1361 sql_help.c:1373 sql_help.c:1390 sql_help.c:1820 +#: sql_help.c:1822 sql_help.c:2192 sql_help.c:2296 sql_help.c:2301 +#: sql_help.c:2861 sql_help.c:2873 sql_help.c:3911 msgid "constraint_name" msgstr "имя_ограничения" -#: sql_help.c:244 sql_help.c:1269 +#: sql_help.c:244 sql_help.c:1287 msgid "new_constraint_name" msgstr "имя_нового_ограничения" -#: sql_help.c:317 sql_help.c:1073 +#: sql_help.c:317 sql_help.c:1080 msgid "new_version" msgstr "новая_версия" @@ -4652,83 +4725,83 @@ msgstr "где элемент_объект:" #: sql_help.c:334 sql_help.c:335 sql_help.c:340 sql_help.c:344 sql_help.c:346 #: sql_help.c:348 sql_help.c:357 sql_help.c:358 sql_help.c:359 sql_help.c:360 #: sql_help.c:361 sql_help.c:362 sql_help.c:363 sql_help.c:364 sql_help.c:367 -#: sql_help.c:368 sql_help.c:1781 sql_help.c:1786 sql_help.c:1793 -#: sql_help.c:1794 sql_help.c:1795 sql_help.c:1796 sql_help.c:1797 -#: sql_help.c:1798 sql_help.c:1799 sql_help.c:1804 sql_help.c:1806 -#: sql_help.c:1810 sql_help.c:1812 sql_help.c:1816 sql_help.c:1821 -#: sql_help.c:1822 sql_help.c:1829 sql_help.c:1830 sql_help.c:1831 -#: sql_help.c:1832 sql_help.c:1833 sql_help.c:1834 sql_help.c:1835 -#: sql_help.c:1836 sql_help.c:1837 sql_help.c:1838 sql_help.c:1839 -#: sql_help.c:1844 sql_help.c:1845 sql_help.c:4189 sql_help.c:4194 -#: sql_help.c:4195 sql_help.c:4196 sql_help.c:4197 sql_help.c:4203 -#: sql_help.c:4204 sql_help.c:4209 sql_help.c:4210 sql_help.c:4215 -#: sql_help.c:4216 sql_help.c:4217 sql_help.c:4218 sql_help.c:4219 -#: sql_help.c:4220 +#: sql_help.c:368 sql_help.c:1812 sql_help.c:1817 sql_help.c:1824 +#: sql_help.c:1825 sql_help.c:1826 sql_help.c:1827 sql_help.c:1828 +#: sql_help.c:1829 sql_help.c:1830 sql_help.c:1835 sql_help.c:1837 +#: sql_help.c:1841 sql_help.c:1843 sql_help.c:1847 sql_help.c:1852 +#: sql_help.c:1853 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862 +#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1865 sql_help.c:1866 +#: sql_help.c:1867 sql_help.c:1868 sql_help.c:1869 sql_help.c:1870 +#: sql_help.c:1875 sql_help.c:1876 sql_help.c:4300 sql_help.c:4305 +#: sql_help.c:4306 sql_help.c:4307 sql_help.c:4308 sql_help.c:4314 +#: sql_help.c:4315 sql_help.c:4320 sql_help.c:4321 sql_help.c:4326 +#: sql_help.c:4327 sql_help.c:4328 sql_help.c:4329 sql_help.c:4330 +#: sql_help.c:4331 msgid "object_name" msgstr "имя_объекта" # well-spelled: агр -#: sql_help.c:326 sql_help.c:1782 sql_help.c:4192 +#: sql_help.c:326 sql_help.c:1813 sql_help.c:4303 msgid "aggregate_name" msgstr "имя_агр_функции" -#: sql_help.c:328 sql_help.c:1784 sql_help.c:2068 sql_help.c:2072 -#: sql_help.c:2074 sql_help.c:3231 +#: sql_help.c:328 sql_help.c:1815 sql_help.c:2099 sql_help.c:2103 +#: sql_help.c:2105 sql_help.c:3283 msgid "source_type" msgstr "исходный_тип" -#: sql_help.c:329 sql_help.c:1785 sql_help.c:2069 sql_help.c:2073 -#: sql_help.c:2075 sql_help.c:3232 +#: sql_help.c:329 sql_help.c:1816 sql_help.c:2100 sql_help.c:2104 +#: sql_help.c:2106 sql_help.c:3284 msgid "target_type" msgstr "целевой_тип" -#: sql_help.c:336 sql_help.c:774 sql_help.c:1800 sql_help.c:2070 -#: sql_help.c:2111 sql_help.c:2176 sql_help.c:2426 sql_help.c:2457 -#: sql_help.c:2995 sql_help.c:4100 sql_help.c:4198 sql_help.c:4311 -#: sql_help.c:4315 sql_help.c:4319 sql_help.c:4322 sql_help.c:4550 -#: sql_help.c:4554 sql_help.c:4558 sql_help.c:4561 sql_help.c:4770 -#: sql_help.c:4774 sql_help.c:4778 sql_help.c:4781 +#: sql_help.c:336 sql_help.c:779 sql_help.c:1831 sql_help.c:2101 +#: sql_help.c:2142 sql_help.c:2208 sql_help.c:2461 sql_help.c:2492 +#: sql_help.c:3043 sql_help.c:4205 sql_help.c:4309 sql_help.c:4424 +#: sql_help.c:4428 sql_help.c:4432 sql_help.c:4435 sql_help.c:4673 +#: sql_help.c:4677 sql_help.c:4681 sql_help.c:4684 sql_help.c:4904 +#: sql_help.c:4908 sql_help.c:4912 sql_help.c:4915 msgid "function_name" msgstr "имя_функции" -#: sql_help.c:341 sql_help.c:767 sql_help.c:1807 sql_help.c:2450 +#: sql_help.c:341 sql_help.c:772 sql_help.c:1838 sql_help.c:2485 msgid "operator_name" msgstr "имя_оператора" -#: sql_help.c:342 sql_help.c:703 sql_help.c:707 sql_help.c:711 sql_help.c:1808 -#: sql_help.c:2427 sql_help.c:3355 +#: sql_help.c:342 sql_help.c:708 sql_help.c:712 sql_help.c:716 sql_help.c:1839 +#: sql_help.c:2462 sql_help.c:3407 msgid "left_type" msgstr "тип_слева" -#: sql_help.c:343 sql_help.c:704 sql_help.c:708 sql_help.c:712 sql_help.c:1809 -#: sql_help.c:2428 sql_help.c:3356 +#: sql_help.c:343 sql_help.c:709 sql_help.c:713 sql_help.c:717 sql_help.c:1840 +#: sql_help.c:2463 sql_help.c:3408 msgid "right_type" msgstr "тип_справа" -#: sql_help.c:345 sql_help.c:347 sql_help.c:730 sql_help.c:733 sql_help.c:736 -#: sql_help.c:765 sql_help.c:777 sql_help.c:785 sql_help.c:788 sql_help.c:791 -#: sql_help.c:1359 sql_help.c:1811 sql_help.c:1813 sql_help.c:2447 -#: sql_help.c:2468 sql_help.c:2831 sql_help.c:3365 sql_help.c:3374 +#: sql_help.c:345 sql_help.c:347 sql_help.c:735 sql_help.c:738 sql_help.c:741 +#: sql_help.c:770 sql_help.c:782 sql_help.c:790 sql_help.c:793 sql_help.c:796 +#: sql_help.c:1379 sql_help.c:1842 sql_help.c:1844 sql_help.c:2482 +#: sql_help.c:2503 sql_help.c:2879 sql_help.c:3417 sql_help.c:3426 msgid "index_method" msgstr "метод_индекса" -#: sql_help.c:349 sql_help.c:1817 sql_help.c:4205 +#: sql_help.c:349 sql_help.c:1848 sql_help.c:4316 msgid "procedure_name" msgstr "имя_процедуры" -#: sql_help.c:353 sql_help.c:1823 sql_help.c:3752 sql_help.c:4211 +#: sql_help.c:353 sql_help.c:1854 sql_help.c:3825 sql_help.c:4322 msgid "routine_name" msgstr "имя_подпрограммы" -#: sql_help.c:365 sql_help.c:1331 sql_help.c:1840 sql_help.c:2304 -#: sql_help.c:2507 sql_help.c:2786 sql_help.c:2962 sql_help.c:3536 -#: sql_help.c:3766 sql_help.c:4114 +#: sql_help.c:365 sql_help.c:1351 sql_help.c:1871 sql_help.c:2338 +#: sql_help.c:2543 sql_help.c:2834 sql_help.c:3010 sql_help.c:3588 +#: sql_help.c:3844 sql_help.c:4224 msgid "type_name" msgstr "имя_типа" -#: sql_help.c:366 sql_help.c:1841 sql_help.c:2303 sql_help.c:2506 -#: sql_help.c:2963 sql_help.c:3189 sql_help.c:3537 sql_help.c:3758 -#: sql_help.c:4106 +#: sql_help.c:366 sql_help.c:1872 sql_help.c:2337 sql_help.c:2542 +#: sql_help.c:3011 sql_help.c:3241 sql_help.c:3589 sql_help.c:3832 +#: sql_help.c:4212 msgid "lang_name" msgstr "имя_языка" @@ -4736,1857 +4809,1909 @@ msgstr "имя_языка" msgid "and aggregate_signature is:" msgstr "и сигнатура_агр_функции:" -#: sql_help.c:392 sql_help.c:1935 sql_help.c:2201 +#: sql_help.c:392 sql_help.c:1966 sql_help.c:2233 msgid "handler_function" msgstr "функция_обработчик" -#: sql_help.c:393 sql_help.c:2202 +#: sql_help.c:393 sql_help.c:2234 msgid "validator_function" msgstr "функция_проверки" -#: sql_help.c:441 sql_help.c:519 sql_help.c:659 sql_help.c:841 sql_help.c:979 -#: sql_help.c:1263 sql_help.c:1529 +#: sql_help.c:441 sql_help.c:520 sql_help.c:662 sql_help.c:846 sql_help.c:986 +#: sql_help.c:1281 sql_help.c:1549 msgid "action" msgstr "действие" #: sql_help.c:443 sql_help.c:450 sql_help.c:454 sql_help.c:455 sql_help.c:458 #: sql_help.c:460 sql_help.c:461 sql_help.c:462 sql_help.c:464 sql_help.c:467 -#: sql_help.c:469 sql_help.c:470 sql_help.c:663 sql_help.c:673 sql_help.c:675 -#: sql_help.c:678 sql_help.c:680 sql_help.c:1055 sql_help.c:1265 -#: sql_help.c:1283 sql_help.c:1287 sql_help.c:1288 sql_help.c:1292 -#: sql_help.c:1294 sql_help.c:1295 sql_help.c:1296 sql_help.c:1297 -#: sql_help.c:1299 sql_help.c:1302 sql_help.c:1303 sql_help.c:1305 -#: sql_help.c:1308 sql_help.c:1310 sql_help.c:1355 sql_help.c:1357 -#: sql_help.c:1364 sql_help.c:1373 sql_help.c:1378 sql_help.c:1630 -#: sql_help.c:1633 sql_help.c:1637 sql_help.c:1673 sql_help.c:1788 -#: sql_help.c:1901 sql_help.c:1907 sql_help.c:1920 sql_help.c:1921 -#: sql_help.c:1922 sql_help.c:2243 sql_help.c:2256 sql_help.c:2301 -#: sql_help.c:2367 sql_help.c:2373 sql_help.c:2406 sql_help.c:2633 -#: sql_help.c:2661 sql_help.c:2662 sql_help.c:2769 sql_help.c:2777 -#: sql_help.c:2787 sql_help.c:2790 sql_help.c:2800 sql_help.c:2804 -#: sql_help.c:2827 sql_help.c:2829 sql_help.c:2836 sql_help.c:2849 -#: sql_help.c:2854 sql_help.c:2872 sql_help.c:2998 sql_help.c:3134 -#: sql_help.c:3737 sql_help.c:3738 sql_help.c:3819 sql_help.c:3834 -#: sql_help.c:3836 sql_help.c:3838 sql_help.c:4085 sql_help.c:4086 -#: sql_help.c:4191 sql_help.c:4342 sql_help.c:4581 sql_help.c:4623 -#: sql_help.c:4625 sql_help.c:4627 sql_help.c:4673 sql_help.c:4801 +#: sql_help.c:469 sql_help.c:470 sql_help.c:666 sql_help.c:676 sql_help.c:678 +#: sql_help.c:681 sql_help.c:683 sql_help.c:684 sql_help.c:1062 sql_help.c:1283 +#: sql_help.c:1301 sql_help.c:1305 sql_help.c:1306 sql_help.c:1310 +#: sql_help.c:1312 sql_help.c:1313 sql_help.c:1314 sql_help.c:1315 +#: sql_help.c:1317 sql_help.c:1320 sql_help.c:1321 sql_help.c:1323 +#: sql_help.c:1326 sql_help.c:1328 sql_help.c:1329 sql_help.c:1375 +#: sql_help.c:1377 sql_help.c:1384 sql_help.c:1393 sql_help.c:1398 +#: sql_help.c:1651 sql_help.c:1654 sql_help.c:1658 sql_help.c:1694 +#: sql_help.c:1819 sql_help.c:1932 sql_help.c:1938 sql_help.c:1951 +#: sql_help.c:1952 sql_help.c:1953 sql_help.c:2275 sql_help.c:2288 +#: sql_help.c:2335 sql_help.c:2402 sql_help.c:2408 sql_help.c:2441 +#: sql_help.c:2671 sql_help.c:2706 sql_help.c:2708 sql_help.c:2816 +#: sql_help.c:2825 sql_help.c:2835 sql_help.c:2838 sql_help.c:2848 +#: sql_help.c:2852 sql_help.c:2875 sql_help.c:2877 sql_help.c:2884 +#: sql_help.c:2897 sql_help.c:2902 sql_help.c:2920 sql_help.c:3046 +#: sql_help.c:3186 sql_help.c:3804 sql_help.c:3805 sql_help.c:3898 +#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3917 sql_help.c:4184 +#: sql_help.c:4185 sql_help.c:4302 sql_help.c:4456 sql_help.c:4462 +#: sql_help.c:4464 sql_help.c:4705 sql_help.c:4711 sql_help.c:4713 +#: sql_help.c:4754 sql_help.c:4756 sql_help.c:4758 sql_help.c:4805 +#: sql_help.c:4936 sql_help.c:4942 sql_help.c:4944 msgid "column_name" msgstr "имя_столбца" -#: sql_help.c:444 sql_help.c:664 sql_help.c:1266 sql_help.c:1638 +#: sql_help.c:444 sql_help.c:667 sql_help.c:1284 sql_help.c:1659 msgid "new_column_name" msgstr "новое_имя_столбца" -#: sql_help.c:449 sql_help.c:540 sql_help.c:672 sql_help.c:862 sql_help.c:1000 -#: sql_help.c:1282 sql_help.c:1539 +#: sql_help.c:449 sql_help.c:541 sql_help.c:675 sql_help.c:867 sql_help.c:1007 +#: sql_help.c:1300 sql_help.c:1559 msgid "where action is one of:" msgstr "где допустимое действие:" -#: sql_help.c:451 sql_help.c:456 sql_help.c:1047 sql_help.c:1284 -#: sql_help.c:1289 sql_help.c:1541 sql_help.c:1545 sql_help.c:2156 -#: sql_help.c:2244 sql_help.c:2446 sql_help.c:2626 sql_help.c:2770 -#: sql_help.c:3043 sql_help.c:3921 +#: sql_help.c:451 sql_help.c:456 sql_help.c:1054 sql_help.c:1302 +#: sql_help.c:1307 sql_help.c:1561 sql_help.c:1565 sql_help.c:2187 +#: sql_help.c:2276 sql_help.c:2481 sql_help.c:2664 sql_help.c:2817 +#: sql_help.c:3093 sql_help.c:4000 msgid "data_type" msgstr "тип_данных" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1285 sql_help.c:1290 -#: sql_help.c:1542 sql_help.c:1546 sql_help.c:2157 sql_help.c:2247 -#: sql_help.c:2369 sql_help.c:2771 sql_help.c:2779 sql_help.c:2792 -#: sql_help.c:2806 sql_help.c:3044 sql_help.c:3050 sql_help.c:3829 +#: sql_help.c:452 sql_help.c:457 sql_help.c:1303 sql_help.c:1308 +#: sql_help.c:1562 sql_help.c:1566 sql_help.c:2188 sql_help.c:2279 +#: sql_help.c:2404 sql_help.c:2819 sql_help.c:2827 sql_help.c:2840 +#: sql_help.c:2854 sql_help.c:3094 sql_help.c:3100 sql_help.c:3908 msgid "collation" msgstr "правило_сортировки" -#: sql_help.c:453 sql_help.c:1286 sql_help.c:2248 sql_help.c:2257 -#: sql_help.c:2772 sql_help.c:2788 sql_help.c:2801 +#: sql_help.c:453 sql_help.c:1304 sql_help.c:2280 sql_help.c:2289 +#: sql_help.c:2820 sql_help.c:2836 sql_help.c:2849 msgid "column_constraint" msgstr "ограничение_столбца" -#: sql_help.c:463 sql_help.c:603 sql_help.c:674 sql_help.c:1304 sql_help.c:4670 +#: sql_help.c:463 sql_help.c:605 sql_help.c:677 sql_help.c:1322 sql_help.c:4802 msgid "integer" msgstr "целое" -#: sql_help.c:465 sql_help.c:468 sql_help.c:676 sql_help.c:679 sql_help.c:1306 -#: sql_help.c:1309 +#: sql_help.c:465 sql_help.c:468 sql_help.c:679 sql_help.c:682 sql_help.c:1324 +#: sql_help.c:1327 msgid "attribute_option" msgstr "атрибут" -#: sql_help.c:473 sql_help.c:1311 sql_help.c:2249 sql_help.c:2258 -#: sql_help.c:2773 sql_help.c:2789 sql_help.c:2802 +#: sql_help.c:473 sql_help.c:1331 sql_help.c:2281 sql_help.c:2290 +#: sql_help.c:2821 sql_help.c:2837 sql_help.c:2850 msgid "table_constraint" msgstr "ограничение_таблицы" -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1316 -#: sql_help.c:1317 sql_help.c:1318 sql_help.c:1319 sql_help.c:1842 +#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1336 +#: sql_help.c:1337 sql_help.c:1338 sql_help.c:1339 sql_help.c:1873 msgid "trigger_name" msgstr "имя_триггера" -#: sql_help.c:480 sql_help.c:481 sql_help.c:1329 sql_help.c:1330 -#: sql_help.c:2250 sql_help.c:2255 sql_help.c:2776 sql_help.c:2799 +#: sql_help.c:480 sql_help.c:481 sql_help.c:1349 sql_help.c:1350 +#: sql_help.c:2282 sql_help.c:2287 sql_help.c:2824 sql_help.c:2847 msgid "parent_table" msgstr "таблица_родитель" -#: sql_help.c:539 sql_help.c:595 sql_help.c:661 sql_help.c:861 sql_help.c:999 -#: sql_help.c:1498 sql_help.c:2187 +#: sql_help.c:540 sql_help.c:597 sql_help.c:664 sql_help.c:866 sql_help.c:1006 +#: sql_help.c:1518 sql_help.c:2219 msgid "extension_name" msgstr "имя_расширения" -#: sql_help.c:541 sql_help.c:1001 sql_help.c:2305 +#: sql_help.c:542 sql_help.c:1008 sql_help.c:2339 msgid "execution_cost" msgstr "стоимость_выполнения" -#: sql_help.c:542 sql_help.c:1002 sql_help.c:2306 +#: sql_help.c:543 sql_help.c:1009 sql_help.c:2340 msgid "result_rows" msgstr "строк_в_результате" -#: sql_help.c:543 sql_help.c:2307 +#: sql_help.c:544 sql_help.c:2341 msgid "support_function" msgstr "вспомогательная_функция" -#: sql_help.c:564 sql_help.c:566 sql_help.c:925 sql_help.c:933 sql_help.c:937 -#: sql_help.c:940 sql_help.c:943 sql_help.c:1580 sql_help.c:1588 -#: sql_help.c:1592 sql_help.c:1595 sql_help.c:1598 sql_help.c:2604 -#: sql_help.c:2606 sql_help.c:2609 sql_help.c:2610 sql_help.c:3736 -#: sql_help.c:3740 sql_help.c:3743 sql_help.c:3745 sql_help.c:3747 -#: sql_help.c:3749 sql_help.c:3751 sql_help.c:3757 sql_help.c:3759 -#: sql_help.c:3761 sql_help.c:3763 sql_help.c:3765 sql_help.c:3767 -#: sql_help.c:3769 sql_help.c:3770 sql_help.c:4084 sql_help.c:4088 -#: sql_help.c:4091 sql_help.c:4093 sql_help.c:4095 sql_help.c:4097 -#: sql_help.c:4099 sql_help.c:4105 sql_help.c:4107 sql_help.c:4109 -#: sql_help.c:4111 sql_help.c:4113 sql_help.c:4115 sql_help.c:4117 -#: sql_help.c:4118 +#: sql_help.c:566 sql_help.c:568 sql_help.c:931 sql_help.c:939 sql_help.c:943 +#: sql_help.c:946 sql_help.c:949 sql_help.c:1601 sql_help.c:1609 +#: sql_help.c:1613 sql_help.c:1616 sql_help.c:1619 sql_help.c:2642 +#: sql_help.c:2644 sql_help.c:2647 sql_help.c:2648 sql_help.c:3802 +#: sql_help.c:3803 sql_help.c:3807 sql_help.c:3808 sql_help.c:3811 +#: sql_help.c:3812 sql_help.c:3814 sql_help.c:3815 sql_help.c:3817 +#: sql_help.c:3818 sql_help.c:3820 sql_help.c:3821 sql_help.c:3823 +#: sql_help.c:3824 sql_help.c:3830 sql_help.c:3831 sql_help.c:3833 +#: sql_help.c:3834 sql_help.c:3836 sql_help.c:3837 sql_help.c:3839 +#: sql_help.c:3840 sql_help.c:3842 sql_help.c:3843 sql_help.c:3845 +#: sql_help.c:3846 sql_help.c:3848 sql_help.c:3849 sql_help.c:4182 +#: sql_help.c:4183 sql_help.c:4187 sql_help.c:4188 sql_help.c:4191 +#: sql_help.c:4192 sql_help.c:4194 sql_help.c:4195 sql_help.c:4197 +#: sql_help.c:4198 sql_help.c:4200 sql_help.c:4201 sql_help.c:4203 +#: sql_help.c:4204 sql_help.c:4210 sql_help.c:4211 sql_help.c:4213 +#: sql_help.c:4214 sql_help.c:4216 sql_help.c:4217 sql_help.c:4219 +#: sql_help.c:4220 sql_help.c:4222 sql_help.c:4223 sql_help.c:4225 +#: sql_help.c:4226 sql_help.c:4228 sql_help.c:4229 msgid "role_specification" msgstr "указание_роли" -#: sql_help.c:565 sql_help.c:567 sql_help.c:1611 sql_help.c:2130 -#: sql_help.c:2612 sql_help.c:3119 sql_help.c:3570 sql_help.c:4427 +#: sql_help.c:567 sql_help.c:569 sql_help.c:1632 sql_help.c:2161 +#: sql_help.c:2650 sql_help.c:3171 sql_help.c:3622 sql_help.c:4548 msgid "user_name" msgstr "имя_пользователя" -#: sql_help.c:568 sql_help.c:945 sql_help.c:1600 sql_help.c:2611 -#: sql_help.c:3771 sql_help.c:4119 +#: sql_help.c:570 sql_help.c:951 sql_help.c:1621 sql_help.c:2649 +#: sql_help.c:3850 sql_help.c:4230 msgid "where role_specification can be:" msgstr "где допустимое указание_роли:" -#: sql_help.c:570 +#: sql_help.c:572 msgid "group_name" msgstr "имя_группы" -#: sql_help.c:591 sql_help.c:1376 sql_help.c:2136 sql_help.c:2376 -#: sql_help.c:2410 sql_help.c:2784 sql_help.c:2797 sql_help.c:2811 -#: sql_help.c:2852 sql_help.c:2876 sql_help.c:2888 sql_help.c:3764 -#: sql_help.c:4112 +#: sql_help.c:593 sql_help.c:1396 sql_help.c:2167 sql_help.c:2411 +#: sql_help.c:2445 sql_help.c:2832 sql_help.c:2845 sql_help.c:2859 +#: sql_help.c:2900 sql_help.c:2924 sql_help.c:2936 sql_help.c:3841 +#: sql_help.c:4221 msgid "tablespace_name" msgstr "табл_пространство" -#: sql_help.c:593 sql_help.c:681 sql_help.c:1324 sql_help.c:1333 -#: sql_help.c:1371 sql_help.c:1722 +#: sql_help.c:595 sql_help.c:686 sql_help.c:1344 sql_help.c:1353 +#: sql_help.c:1391 sql_help.c:1748 sql_help.c:1751 msgid "index_name" msgstr "имя_индекса" -#: sql_help.c:597 sql_help.c:600 sql_help.c:682 sql_help.c:684 sql_help.c:1326 -#: sql_help.c:1328 sql_help.c:1374 sql_help.c:2374 sql_help.c:2408 -#: sql_help.c:2782 sql_help.c:2795 sql_help.c:2809 sql_help.c:2850 -#: sql_help.c:2874 +#: sql_help.c:599 sql_help.c:602 sql_help.c:687 sql_help.c:689 sql_help.c:1346 +#: sql_help.c:1348 sql_help.c:1394 sql_help.c:2409 sql_help.c:2443 +#: sql_help.c:2830 sql_help.c:2843 sql_help.c:2857 sql_help.c:2898 +#: sql_help.c:2922 msgid "storage_parameter" msgstr "параметр_хранения" -#: sql_help.c:602 +#: sql_help.c:604 msgid "column_number" msgstr "номер_столбца" -#: sql_help.c:626 sql_help.c:1805 sql_help.c:4202 +#: sql_help.c:628 sql_help.c:1836 sql_help.c:4313 msgid "large_object_oid" msgstr "oid_большого_объекта" -#: sql_help.c:713 sql_help.c:2431 +#: sql_help.c:685 sql_help.c:1330 sql_help.c:2818 +msgid "compression_method" +msgstr "метод_сжатия" + +#: sql_help.c:718 sql_help.c:2466 msgid "res_proc" msgstr "процедура_ограничения" -#: sql_help.c:714 sql_help.c:2432 +#: sql_help.c:719 sql_help.c:2467 msgid "join_proc" msgstr "процедура_соединения" -#: sql_help.c:766 sql_help.c:778 sql_help.c:2449 +#: sql_help.c:771 sql_help.c:783 sql_help.c:2484 msgid "strategy_number" msgstr "номер_стратегии" -#: sql_help.c:768 sql_help.c:769 sql_help.c:772 sql_help.c:773 sql_help.c:779 -#: sql_help.c:780 sql_help.c:782 sql_help.c:783 sql_help.c:2451 sql_help.c:2452 -#: sql_help.c:2455 sql_help.c:2456 +#: sql_help.c:773 sql_help.c:774 sql_help.c:777 sql_help.c:778 sql_help.c:784 +#: sql_help.c:785 sql_help.c:787 sql_help.c:788 sql_help.c:2486 sql_help.c:2487 +#: sql_help.c:2490 sql_help.c:2491 msgid "op_type" msgstr "тип_операции" -#: sql_help.c:770 sql_help.c:2453 +#: sql_help.c:775 sql_help.c:2488 msgid "sort_family_name" msgstr "семейство_сортировки" -#: sql_help.c:771 sql_help.c:781 sql_help.c:2454 +#: sql_help.c:776 sql_help.c:786 sql_help.c:2489 msgid "support_number" msgstr "номер_опорной_процедуры" -#: sql_help.c:775 sql_help.c:2071 sql_help.c:2458 sql_help.c:2965 -#: sql_help.c:2967 +#: sql_help.c:780 sql_help.c:2102 sql_help.c:2493 sql_help.c:3013 +#: sql_help.c:3015 msgid "argument_type" msgstr "тип_аргумента" -#: sql_help.c:806 sql_help.c:809 sql_help.c:880 sql_help.c:882 sql_help.c:884 -#: sql_help.c:1015 sql_help.c:1054 sql_help.c:1494 sql_help.c:1497 -#: sql_help.c:1672 sql_help.c:1721 sql_help.c:1790 sql_help.c:1815 -#: sql_help.c:1828 sql_help.c:1843 sql_help.c:1900 sql_help.c:1906 -#: sql_help.c:2242 sql_help.c:2254 sql_help.c:2365 sql_help.c:2405 -#: sql_help.c:2482 sql_help.c:2525 sql_help.c:2581 sql_help.c:2632 -#: sql_help.c:2663 sql_help.c:2768 sql_help.c:2785 sql_help.c:2798 -#: sql_help.c:2871 sql_help.c:2991 sql_help.c:3168 sql_help.c:3391 -#: sql_help.c:3440 sql_help.c:3546 sql_help.c:3734 sql_help.c:3739 -#: sql_help.c:3785 sql_help.c:3817 sql_help.c:4082 sql_help.c:4087 -#: sql_help.c:4190 sql_help.c:4297 sql_help.c:4299 sql_help.c:4348 -#: sql_help.c:4387 sql_help.c:4536 sql_help.c:4538 sql_help.c:4587 -#: sql_help.c:4621 sql_help.c:4672 sql_help.c:4756 sql_help.c:4758 -#: sql_help.c:4807 +#: sql_help.c:811 sql_help.c:814 sql_help.c:885 sql_help.c:887 sql_help.c:889 +#: sql_help.c:1022 sql_help.c:1061 sql_help.c:1514 sql_help.c:1517 +#: sql_help.c:1693 sql_help.c:1747 sql_help.c:1750 sql_help.c:1821 +#: sql_help.c:1846 sql_help.c:1859 sql_help.c:1874 sql_help.c:1931 +#: sql_help.c:1937 sql_help.c:2274 sql_help.c:2286 sql_help.c:2400 +#: sql_help.c:2440 sql_help.c:2517 sql_help.c:2562 sql_help.c:2618 +#: sql_help.c:2670 sql_help.c:2703 sql_help.c:2710 sql_help.c:2815 +#: sql_help.c:2833 sql_help.c:2846 sql_help.c:2919 sql_help.c:3039 +#: sql_help.c:3220 sql_help.c:3443 sql_help.c:3492 sql_help.c:3598 +#: sql_help.c:3800 sql_help.c:3806 sql_help.c:3864 sql_help.c:3896 +#: sql_help.c:4180 sql_help.c:4186 sql_help.c:4301 sql_help.c:4410 +#: sql_help.c:4412 sql_help.c:4469 sql_help.c:4508 sql_help.c:4659 +#: sql_help.c:4661 sql_help.c:4718 sql_help.c:4752 sql_help.c:4804 +#: sql_help.c:4890 sql_help.c:4892 sql_help.c:4949 msgid "table_name" msgstr "имя_таблицы" -#: sql_help.c:811 sql_help.c:2484 +#: sql_help.c:816 sql_help.c:2519 msgid "using_expression" msgstr "выражение_использования" -#: sql_help.c:812 sql_help.c:2485 +#: sql_help.c:817 sql_help.c:2520 msgid "check_expression" msgstr "выражение_проверки" -#: sql_help.c:886 sql_help.c:2526 +#: sql_help.c:891 sql_help.c:2563 msgid "publication_parameter" msgstr "параметр_публикации" -#: sql_help.c:929 sql_help.c:1584 sql_help.c:2344 sql_help.c:2558 -#: sql_help.c:3102 +#: sql_help.c:935 sql_help.c:1605 sql_help.c:2379 sql_help.c:2595 +#: sql_help.c:3154 msgid "password" msgstr "пароль" -#: sql_help.c:930 sql_help.c:1585 sql_help.c:2345 sql_help.c:2559 -#: sql_help.c:3103 +#: sql_help.c:936 sql_help.c:1606 sql_help.c:2380 sql_help.c:2596 +#: sql_help.c:3155 msgid "timestamp" msgstr "timestamp" -#: sql_help.c:934 sql_help.c:938 sql_help.c:941 sql_help.c:944 sql_help.c:1589 -#: sql_help.c:1593 sql_help.c:1596 sql_help.c:1599 sql_help.c:3744 -#: sql_help.c:4092 +#: sql_help.c:940 sql_help.c:944 sql_help.c:947 sql_help.c:950 sql_help.c:1610 +#: sql_help.c:1614 sql_help.c:1617 sql_help.c:1620 sql_help.c:3813 +#: sql_help.c:4193 msgid "database_name" msgstr "имя_БД" -#: sql_help.c:1048 sql_help.c:2627 +#: sql_help.c:1055 sql_help.c:2665 msgid "increment" msgstr "шаг" -#: sql_help.c:1049 sql_help.c:2628 +#: sql_help.c:1056 sql_help.c:2666 msgid "minvalue" msgstr "мин_значение" -#: sql_help.c:1050 sql_help.c:2629 +#: sql_help.c:1057 sql_help.c:2667 msgid "maxvalue" msgstr "макс_значение" -#: sql_help.c:1051 sql_help.c:2630 sql_help.c:4295 sql_help.c:4385 -#: sql_help.c:4534 sql_help.c:4689 sql_help.c:4754 +#: sql_help.c:1058 sql_help.c:2668 sql_help.c:4408 sql_help.c:4506 +#: sql_help.c:4657 sql_help.c:4821 sql_help.c:4888 msgid "start" msgstr "начальное_значение" -#: sql_help.c:1052 sql_help.c:1301 +#: sql_help.c:1059 sql_help.c:1319 msgid "restart" msgstr "значение_перезапуска" -#: sql_help.c:1053 sql_help.c:2631 +#: sql_help.c:1060 sql_help.c:2669 msgid "cache" msgstr "кеш" -#: sql_help.c:1097 +#: sql_help.c:1104 msgid "new_target" msgstr "новое_имя" -#: sql_help.c:1113 sql_help.c:2675 +#: sql_help.c:1122 sql_help.c:2722 msgid "conninfo" msgstr "строка_подключения" -#: sql_help.c:1115 sql_help.c:2676 +#: sql_help.c:1124 sql_help.c:1128 sql_help.c:1132 sql_help.c:2723 msgid "publication_name" msgstr "имя_публикации" -#: sql_help.c:1116 -msgid "set_publication_option" -msgstr "параметр_set_publication" +#: sql_help.c:1125 sql_help.c:1129 sql_help.c:1133 +msgid "publication_option" +msgstr "параметр_публикации" -#: sql_help.c:1119 +#: sql_help.c:1136 msgid "refresh_option" msgstr "параметр_обновления" -#: sql_help.c:1124 sql_help.c:2677 +#: sql_help.c:1141 sql_help.c:2724 msgid "subscription_parameter" msgstr "параметр_подписки" -#: sql_help.c:1278 sql_help.c:1281 +#: sql_help.c:1296 sql_help.c:1299 msgid "partition_name" msgstr "имя_секции" -#: sql_help.c:1279 sql_help.c:2259 sql_help.c:2803 +#: sql_help.c:1297 sql_help.c:2291 sql_help.c:2851 msgid "partition_bound_spec" msgstr "указание_границ_секции" -#: sql_help.c:1298 sql_help.c:1345 sql_help.c:2817 +#: sql_help.c:1316 sql_help.c:1365 sql_help.c:2865 msgid "sequence_options" msgstr "параметры_последовательности" -#: sql_help.c:1300 +#: sql_help.c:1318 msgid "sequence_option" msgstr "параметр_последовательности" -#: sql_help.c:1312 +#: sql_help.c:1332 msgid "table_constraint_using_index" msgstr "ограничение_таблицы_с_индексом" -#: sql_help.c:1320 sql_help.c:1321 sql_help.c:1322 sql_help.c:1323 +#: sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 sql_help.c:1343 msgid "rewrite_rule_name" msgstr "имя_правила_перезаписи" -#: sql_help.c:1334 sql_help.c:2842 +#: sql_help.c:1354 sql_help.c:2890 msgid "and partition_bound_spec is:" msgstr "и указание_границ_секции:" -#: sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 sql_help.c:2843 -#: sql_help.c:2844 sql_help.c:2845 +#: sql_help.c:1355 sql_help.c:1356 sql_help.c:1357 sql_help.c:2891 +#: sql_help.c:2892 sql_help.c:2893 msgid "partition_bound_expr" msgstr "выражение_границ_секции" -#: sql_help.c:1338 sql_help.c:1339 sql_help.c:2846 sql_help.c:2847 +#: sql_help.c:1358 sql_help.c:1359 sql_help.c:2894 sql_help.c:2895 msgid "numeric_literal" msgstr "числовая_константа" -#: sql_help.c:1340 +#: sql_help.c:1360 msgid "and column_constraint is:" msgstr "и ограничение_столбца:" -#: sql_help.c:1343 sql_help.c:2266 sql_help.c:2299 sql_help.c:2505 -#: sql_help.c:2815 +#: sql_help.c:1363 sql_help.c:2298 sql_help.c:2333 sql_help.c:2541 +#: sql_help.c:2863 msgid "default_expr" msgstr "выражение_по_умолчанию" -#: sql_help.c:1344 sql_help.c:2267 sql_help.c:2816 +#: sql_help.c:1364 sql_help.c:2299 sql_help.c:2864 msgid "generation_expr" msgstr "генерирующее_выражение" -#: sql_help.c:1346 sql_help.c:1347 sql_help.c:1356 sql_help.c:1358 -#: sql_help.c:1362 sql_help.c:2818 sql_help.c:2819 sql_help.c:2828 -#: sql_help.c:2830 sql_help.c:2834 +#: sql_help.c:1366 sql_help.c:1367 sql_help.c:1376 sql_help.c:1378 +#: sql_help.c:1382 sql_help.c:2866 sql_help.c:2867 sql_help.c:2876 +#: sql_help.c:2878 sql_help.c:2882 msgid "index_parameters" msgstr "параметры_индекса" -#: sql_help.c:1348 sql_help.c:1365 sql_help.c:2820 sql_help.c:2837 +#: sql_help.c:1368 sql_help.c:1385 sql_help.c:2868 sql_help.c:2885 msgid "reftable" msgstr "целевая_таблица" -#: sql_help.c:1349 sql_help.c:1366 sql_help.c:2821 sql_help.c:2838 +#: sql_help.c:1369 sql_help.c:1386 sql_help.c:2869 sql_help.c:2886 msgid "refcolumn" msgstr "целевой_столбец" -#: sql_help.c:1350 sql_help.c:1351 sql_help.c:1367 sql_help.c:1368 -#: sql_help.c:2822 sql_help.c:2823 sql_help.c:2839 sql_help.c:2840 +#: sql_help.c:1370 sql_help.c:1371 sql_help.c:1387 sql_help.c:1388 +#: sql_help.c:2870 sql_help.c:2871 sql_help.c:2887 sql_help.c:2888 msgid "referential_action" msgstr "ссылочное_действие" -#: sql_help.c:1352 sql_help.c:2268 sql_help.c:2824 +#: sql_help.c:1372 sql_help.c:2300 sql_help.c:2872 msgid "and table_constraint is:" msgstr "и ограничение_таблицы:" -#: sql_help.c:1360 sql_help.c:2832 +#: sql_help.c:1380 sql_help.c:2880 msgid "exclude_element" msgstr "объект_исключения" -#: sql_help.c:1361 sql_help.c:2833 sql_help.c:4293 sql_help.c:4383 -#: sql_help.c:4532 sql_help.c:4687 sql_help.c:4752 +#: sql_help.c:1381 sql_help.c:2881 sql_help.c:4406 sql_help.c:4504 +#: sql_help.c:4655 sql_help.c:4819 sql_help.c:4886 msgid "operator" msgstr "оператор" -#: sql_help.c:1363 sql_help.c:2377 sql_help.c:2835 +#: sql_help.c:1383 sql_help.c:2412 sql_help.c:2883 msgid "predicate" msgstr "предикат" -#: sql_help.c:1369 +#: sql_help.c:1389 msgid "and table_constraint_using_index is:" msgstr "и ограничение_таблицы_с_индексом:" -#: sql_help.c:1372 sql_help.c:2848 +#: sql_help.c:1392 sql_help.c:2896 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "параметры_индекса в ограничениях UNIQUE, PRIMARY KEY и EXCLUDE:" -#: sql_help.c:1377 sql_help.c:2853 +#: sql_help.c:1397 sql_help.c:2901 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "объект_исключения в ограничении EXCLUDE:" -#: sql_help.c:1380 sql_help.c:2370 sql_help.c:2780 sql_help.c:2793 -#: sql_help.c:2807 sql_help.c:2856 sql_help.c:3830 +#: sql_help.c:1400 sql_help.c:2405 sql_help.c:2828 sql_help.c:2841 +#: sql_help.c:2855 sql_help.c:2904 sql_help.c:3909 msgid "opclass" msgstr "класс_оператора" -#: sql_help.c:1396 sql_help.c:1399 sql_help.c:2891 +#: sql_help.c:1416 sql_help.c:1419 sql_help.c:2939 msgid "tablespace_option" msgstr "параметр_табл_пространства" -#: sql_help.c:1420 sql_help.c:1423 sql_help.c:1429 sql_help.c:1433 +#: sql_help.c:1440 sql_help.c:1443 sql_help.c:1449 sql_help.c:1453 msgid "token_type" msgstr "тип_фрагмента" -#: sql_help.c:1421 sql_help.c:1424 +#: sql_help.c:1441 sql_help.c:1444 msgid "dictionary_name" msgstr "имя_словаря" -#: sql_help.c:1426 sql_help.c:1430 +#: sql_help.c:1446 sql_help.c:1450 msgid "old_dictionary" msgstr "старый_словарь" -#: sql_help.c:1427 sql_help.c:1431 +#: sql_help.c:1447 sql_help.c:1451 msgid "new_dictionary" msgstr "новый_словарь" -#: sql_help.c:1526 sql_help.c:1540 sql_help.c:1543 sql_help.c:1544 -#: sql_help.c:3042 +#: sql_help.c:1546 sql_help.c:1560 sql_help.c:1563 sql_help.c:1564 +#: sql_help.c:3092 msgid "attribute_name" msgstr "имя_атрибута" -#: sql_help.c:1527 +#: sql_help.c:1547 msgid "new_attribute_name" msgstr "новое_имя_атрибута" -#: sql_help.c:1531 sql_help.c:1535 +#: sql_help.c:1551 sql_help.c:1555 msgid "new_enum_value" msgstr "новое_значение_перечисления" -#: sql_help.c:1532 +#: sql_help.c:1552 msgid "neighbor_enum_value" msgstr "соседнее_значение_перечисления" -#: sql_help.c:1534 +#: sql_help.c:1554 msgid "existing_enum_value" msgstr "существующее_значение_перечисления" -#: sql_help.c:1537 +#: sql_help.c:1557 msgid "property" msgstr "свойство" -#: sql_help.c:1612 sql_help.c:2251 sql_help.c:2260 sql_help.c:2643 -#: sql_help.c:3120 sql_help.c:3571 sql_help.c:3750 sql_help.c:3786 -#: sql_help.c:4098 +#: sql_help.c:1633 sql_help.c:2283 sql_help.c:2292 sql_help.c:2681 +#: sql_help.c:3172 sql_help.c:3623 sql_help.c:3822 sql_help.c:3865 +#: sql_help.c:4202 msgid "server_name" msgstr "имя_сервера" -#: sql_help.c:1644 sql_help.c:1647 sql_help.c:3135 +#: sql_help.c:1665 sql_help.c:1668 sql_help.c:3187 msgid "view_option_name" msgstr "имя_параметра_представления" -#: sql_help.c:1645 sql_help.c:3136 +#: sql_help.c:1666 sql_help.c:3188 msgid "view_option_value" msgstr "значение_параметра_представления" -#: sql_help.c:1666 sql_help.c:1667 sql_help.c:4659 sql_help.c:4660 +#: sql_help.c:1687 sql_help.c:1688 sql_help.c:4791 sql_help.c:4792 msgid "table_and_columns" msgstr "таблица_и_столбцы" -#: sql_help.c:1668 sql_help.c:1912 sql_help.c:3619 sql_help.c:3963 -#: sql_help.c:4661 +#: sql_help.c:1689 sql_help.c:1752 sql_help.c:1943 sql_help.c:3671 +#: sql_help.c:4044 sql_help.c:4793 msgid "where option can be one of:" msgstr "где допустимый параметр:" -#: sql_help.c:1669 sql_help.c:1670 sql_help.c:1914 sql_help.c:1917 -#: sql_help.c:2096 sql_help.c:3620 sql_help.c:3621 sql_help.c:3622 -#: sql_help.c:3623 sql_help.c:3624 sql_help.c:3625 sql_help.c:3626 -#: sql_help.c:3627 sql_help.c:4662 sql_help.c:4663 sql_help.c:4664 -#: sql_help.c:4665 sql_help.c:4666 sql_help.c:4667 sql_help.c:4668 -#: sql_help.c:4669 +#: sql_help.c:1690 sql_help.c:1691 sql_help.c:1753 sql_help.c:1945 +#: sql_help.c:1948 sql_help.c:2127 sql_help.c:3672 sql_help.c:3673 +#: sql_help.c:3674 sql_help.c:3675 sql_help.c:3676 sql_help.c:3677 +#: sql_help.c:3678 sql_help.c:3679 sql_help.c:4045 sql_help.c:4047 +#: sql_help.c:4794 sql_help.c:4795 sql_help.c:4796 sql_help.c:4797 +#: sql_help.c:4798 sql_help.c:4799 sql_help.c:4800 sql_help.c:4801 msgid "boolean" msgstr "логическое_значение" -#: sql_help.c:1671 sql_help.c:4671 +#: sql_help.c:1692 sql_help.c:4803 msgid "and table_and_columns is:" msgstr "и таблица_и_столбцы:" -#: sql_help.c:1687 sql_help.c:4443 sql_help.c:4445 sql_help.c:4469 +#: sql_help.c:1708 sql_help.c:4564 sql_help.c:4566 sql_help.c:4590 msgid "transaction_mode" msgstr "режим_транзакции" -#: sql_help.c:1688 sql_help.c:4446 sql_help.c:4470 +#: sql_help.c:1709 sql_help.c:4567 sql_help.c:4591 msgid "where transaction_mode is one of:" msgstr "где допустимый режим_транзакции:" -#: sql_help.c:1697 sql_help.c:4303 sql_help.c:4312 sql_help.c:4316 -#: sql_help.c:4320 sql_help.c:4323 sql_help.c:4542 sql_help.c:4551 -#: sql_help.c:4555 sql_help.c:4559 sql_help.c:4562 sql_help.c:4762 -#: sql_help.c:4771 sql_help.c:4775 sql_help.c:4779 sql_help.c:4782 +#: sql_help.c:1718 sql_help.c:4416 sql_help.c:4425 sql_help.c:4429 +#: sql_help.c:4433 sql_help.c:4436 sql_help.c:4665 sql_help.c:4674 +#: sql_help.c:4678 sql_help.c:4682 sql_help.c:4685 sql_help.c:4896 +#: sql_help.c:4905 sql_help.c:4909 sql_help.c:4913 sql_help.c:4916 msgid "argument" msgstr "аргумент" -#: sql_help.c:1787 +#: sql_help.c:1818 msgid "relation_name" msgstr "имя_отношения" -#: sql_help.c:1792 sql_help.c:3746 sql_help.c:4094 +#: sql_help.c:1823 sql_help.c:3816 sql_help.c:4196 msgid "domain_name" msgstr "имя_домена" -#: sql_help.c:1814 +#: sql_help.c:1845 msgid "policy_name" msgstr "имя_политики" -#: sql_help.c:1827 +#: sql_help.c:1858 msgid "rule_name" msgstr "имя_правила" -#: sql_help.c:1846 +#: sql_help.c:1877 msgid "text" msgstr "текст" -#: sql_help.c:1871 sql_help.c:3930 sql_help.c:4135 +#: sql_help.c:1902 sql_help.c:4009 sql_help.c:4246 msgid "transaction_id" msgstr "код_транзакции" -#: sql_help.c:1902 sql_help.c:1909 sql_help.c:3856 +#: sql_help.c:1933 sql_help.c:1940 sql_help.c:3935 msgid "filename" msgstr "имя_файла" -#: sql_help.c:1903 sql_help.c:1910 sql_help.c:2583 sql_help.c:2584 -#: sql_help.c:2585 +#: sql_help.c:1934 sql_help.c:1941 sql_help.c:2620 sql_help.c:2621 +#: sql_help.c:2622 msgid "command" msgstr "команда" -#: sql_help.c:1905 sql_help.c:2582 sql_help.c:2994 sql_help.c:3171 -#: sql_help.c:3840 sql_help.c:4286 sql_help.c:4288 sql_help.c:4376 -#: sql_help.c:4378 sql_help.c:4525 sql_help.c:4527 sql_help.c:4630 -#: sql_help.c:4745 sql_help.c:4747 +#: sql_help.c:1936 sql_help.c:2619 sql_help.c:3042 sql_help.c:3223 +#: sql_help.c:3919 sql_help.c:4399 sql_help.c:4401 sql_help.c:4497 +#: sql_help.c:4499 sql_help.c:4648 sql_help.c:4650 sql_help.c:4761 +#: sql_help.c:4879 sql_help.c:4881 msgid "condition" msgstr "условие" -#: sql_help.c:1908 sql_help.c:2411 sql_help.c:2877 sql_help.c:3137 -#: sql_help.c:3155 sql_help.c:3821 +#: sql_help.c:1939 sql_help.c:2446 sql_help.c:2925 sql_help.c:3189 +#: sql_help.c:3207 sql_help.c:3900 msgid "query" msgstr "запрос" -#: sql_help.c:1913 +#: sql_help.c:1944 msgid "format_name" msgstr "имя_формата" -#: sql_help.c:1915 +#: sql_help.c:1946 msgid "delimiter_character" msgstr "символ_разделитель" -#: sql_help.c:1916 +#: sql_help.c:1947 msgid "null_string" msgstr "представление_NULL" -#: sql_help.c:1918 +#: sql_help.c:1949 msgid "quote_character" msgstr "символ_кавычек" -#: sql_help.c:1919 +#: sql_help.c:1950 msgid "escape_character" msgstr "спецсимвол" -#: sql_help.c:1923 +#: sql_help.c:1954 msgid "encoding_name" msgstr "имя_кодировки" -#: sql_help.c:1934 +#: sql_help.c:1965 msgid "access_method_type" msgstr "тип_метода_доступа" -#: sql_help.c:2005 sql_help.c:2024 sql_help.c:2027 +#: sql_help.c:2036 sql_help.c:2055 sql_help.c:2058 msgid "arg_data_type" msgstr "тип_данных_аргумента" -#: sql_help.c:2006 sql_help.c:2028 sql_help.c:2036 +#: sql_help.c:2037 sql_help.c:2059 sql_help.c:2067 msgid "sfunc" msgstr "функция_состояния" -#: sql_help.c:2007 sql_help.c:2029 sql_help.c:2037 +#: sql_help.c:2038 sql_help.c:2060 sql_help.c:2068 msgid "state_data_type" msgstr "тип_данных_состояния" -#: sql_help.c:2008 sql_help.c:2030 sql_help.c:2038 +#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069 msgid "state_data_size" msgstr "размер_данных_состояния" -#: sql_help.c:2009 sql_help.c:2031 sql_help.c:2039 +#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070 msgid "ffunc" msgstr "функция_завершения" -#: sql_help.c:2010 sql_help.c:2040 +#: sql_help.c:2041 sql_help.c:2071 msgid "combinefunc" msgstr "комбинирующая_функция" -#: sql_help.c:2011 sql_help.c:2041 +#: sql_help.c:2042 sql_help.c:2072 msgid "serialfunc" msgstr "функция_сериализации" -#: sql_help.c:2012 sql_help.c:2042 +#: sql_help.c:2043 sql_help.c:2073 msgid "deserialfunc" msgstr "функция_десериализации" -#: sql_help.c:2013 sql_help.c:2032 sql_help.c:2043 +#: sql_help.c:2044 sql_help.c:2063 sql_help.c:2074 msgid "initial_condition" msgstr "начальное_условие" -#: sql_help.c:2014 sql_help.c:2044 +#: sql_help.c:2045 sql_help.c:2075 msgid "msfunc" msgstr "функция_состояния_движ" -#: sql_help.c:2015 sql_help.c:2045 +#: sql_help.c:2046 sql_help.c:2076 msgid "minvfunc" msgstr "обратная_функция_движ" -#: sql_help.c:2016 sql_help.c:2046 +#: sql_help.c:2047 sql_help.c:2077 msgid "mstate_data_type" msgstr "тип_данных_состояния_движ" -#: sql_help.c:2017 sql_help.c:2047 +#: sql_help.c:2048 sql_help.c:2078 msgid "mstate_data_size" msgstr "размер_данных_состояния_движ" -#: sql_help.c:2018 sql_help.c:2048 +#: sql_help.c:2049 sql_help.c:2079 msgid "mffunc" msgstr "функция_завершения_движ" -#: sql_help.c:2019 sql_help.c:2049 +#: sql_help.c:2050 sql_help.c:2080 msgid "minitial_condition" msgstr "начальное_условие_движ" -#: sql_help.c:2020 sql_help.c:2050 +#: sql_help.c:2051 sql_help.c:2081 msgid "sort_operator" msgstr "оператор_сортировки" -#: sql_help.c:2033 +#: sql_help.c:2064 msgid "or the old syntax" msgstr "или старый синтаксис" -#: sql_help.c:2035 +#: sql_help.c:2066 msgid "base_type" msgstr "базовый_тип" -#: sql_help.c:2092 sql_help.c:2133 +#: sql_help.c:2123 sql_help.c:2164 msgid "locale" msgstr "код_локали" -#: sql_help.c:2093 sql_help.c:2134 +#: sql_help.c:2124 sql_help.c:2165 msgid "lc_collate" msgstr "код_правила_сортировки" -#: sql_help.c:2094 sql_help.c:2135 +#: sql_help.c:2125 sql_help.c:2166 msgid "lc_ctype" msgstr "код_классификации_символов" -#: sql_help.c:2095 sql_help.c:4188 +#: sql_help.c:2126 sql_help.c:4299 msgid "provider" -msgstr "поставщик" +msgstr "провайдер" -#: sql_help.c:2097 sql_help.c:2189 +#: sql_help.c:2128 sql_help.c:2221 msgid "version" msgstr "версия" -#: sql_help.c:2099 +#: sql_help.c:2130 msgid "existing_collation" msgstr "существующее_правило_сортировки" -#: sql_help.c:2109 +#: sql_help.c:2140 msgid "source_encoding" msgstr "исходная_кодировка" -#: sql_help.c:2110 +#: sql_help.c:2141 msgid "dest_encoding" msgstr "целевая_кодировка" -#: sql_help.c:2131 sql_help.c:2917 +#: sql_help.c:2162 sql_help.c:2965 msgid "template" msgstr "шаблон" -#: sql_help.c:2132 +#: sql_help.c:2163 msgid "encoding" msgstr "кодировка" -#: sql_help.c:2159 +#: sql_help.c:2190 msgid "constraint" msgstr "ограничение" -#: sql_help.c:2160 +#: sql_help.c:2191 msgid "where constraint is:" msgstr "где ограничение:" -#: sql_help.c:2174 sql_help.c:2580 sql_help.c:2990 +#: sql_help.c:2205 sql_help.c:2617 sql_help.c:3038 msgid "event" msgstr "событие" -#: sql_help.c:2175 +#: sql_help.c:2206 msgid "filter_variable" msgstr "переменная_фильтра" -#: sql_help.c:2263 sql_help.c:2812 +#: sql_help.c:2207 +msgid "filter_value" +msgstr "значение_фильтра" + +#: sql_help.c:2295 sql_help.c:2860 msgid "where column_constraint is:" msgstr "где ограничение_столбца:" -#: sql_help.c:2300 +#: sql_help.c:2334 msgid "rettype" msgstr "тип_возврата" -#: sql_help.c:2302 +#: sql_help.c:2336 msgid "column_type" msgstr "тип_столбца" -#: sql_help.c:2311 sql_help.c:2511 +#: sql_help.c:2345 sql_help.c:2547 msgid "definition" msgstr "определение" -#: sql_help.c:2312 sql_help.c:2512 +#: sql_help.c:2346 sql_help.c:2548 msgid "obj_file" msgstr "объектный_файл" -#: sql_help.c:2313 sql_help.c:2513 +#: sql_help.c:2347 sql_help.c:2549 msgid "link_symbol" msgstr "символ_в_экспорте" -#: sql_help.c:2351 sql_help.c:2565 sql_help.c:3109 +#: sql_help.c:2348 sql_help.c:2550 +msgid "sql_body" +msgstr "тело_sql" + +#: sql_help.c:2386 sql_help.c:2602 sql_help.c:3161 msgid "uid" msgstr "uid" -#: sql_help.c:2366 sql_help.c:2407 sql_help.c:2781 sql_help.c:2794 -#: sql_help.c:2808 sql_help.c:2873 +#: sql_help.c:2401 sql_help.c:2442 sql_help.c:2829 sql_help.c:2842 +#: sql_help.c:2856 sql_help.c:2921 msgid "method" msgstr "метод" -#: sql_help.c:2371 +#: sql_help.c:2406 msgid "opclass_parameter" msgstr "параметр_класса_оп" -#: sql_help.c:2388 +#: sql_help.c:2423 msgid "call_handler" msgstr "обработчик_вызова" -#: sql_help.c:2389 +#: sql_help.c:2424 msgid "inline_handler" msgstr "обработчик_внедрённого_кода" -#: sql_help.c:2390 +#: sql_help.c:2425 msgid "valfunction" msgstr "функция_проверки" -#: sql_help.c:2429 +#: sql_help.c:2464 msgid "com_op" msgstr "коммут_оператор" -#: sql_help.c:2430 +#: sql_help.c:2465 msgid "neg_op" msgstr "обратный_оператор" -#: sql_help.c:2448 +#: sql_help.c:2483 msgid "family_name" msgstr "имя_семейства" -#: sql_help.c:2459 +#: sql_help.c:2494 msgid "storage_type" msgstr "тип_хранения" -#: sql_help.c:2586 sql_help.c:2997 +#: sql_help.c:2623 sql_help.c:3045 msgid "where event can be one of:" msgstr "где допустимое событие:" -#: sql_help.c:2605 sql_help.c:2607 +#: sql_help.c:2643 sql_help.c:2645 msgid "schema_element" msgstr "элемент_схемы" -#: sql_help.c:2644 +#: sql_help.c:2682 msgid "server_type" msgstr "тип_сервера" -#: sql_help.c:2645 +#: sql_help.c:2683 msgid "server_version" msgstr "версия_сервера" -#: sql_help.c:2646 sql_help.c:3748 sql_help.c:4096 +#: sql_help.c:2684 sql_help.c:3819 sql_help.c:4199 msgid "fdw_name" msgstr "имя_обёртки_сторонних_данных" -#: sql_help.c:2659 +#: sql_help.c:2701 sql_help.c:2704 msgid "statistics_name" msgstr "имя_статистики" -#: sql_help.c:2660 +#: sql_help.c:2705 msgid "statistics_kind" msgstr "вид_статистики" -#: sql_help.c:2674 +#: sql_help.c:2721 msgid "subscription_name" msgstr "имя_подписки" -#: sql_help.c:2774 +#: sql_help.c:2822 msgid "source_table" msgstr "исходная_таблица" -#: sql_help.c:2775 +#: sql_help.c:2823 msgid "like_option" msgstr "параметр_порождения" -#: sql_help.c:2841 +#: sql_help.c:2889 msgid "and like_option is:" msgstr "и параметр_порождения:" -#: sql_help.c:2890 +#: sql_help.c:2938 msgid "directory" msgstr "каталог" -#: sql_help.c:2904 +#: sql_help.c:2952 msgid "parser_name" msgstr "имя_анализатора" -#: sql_help.c:2905 +#: sql_help.c:2953 msgid "source_config" msgstr "исходная_конфигурация" -#: sql_help.c:2934 +#: sql_help.c:2982 msgid "start_function" msgstr "функция_начала" -#: sql_help.c:2935 +#: sql_help.c:2983 msgid "gettoken_function" msgstr "функция_выдачи_фрагмента" -#: sql_help.c:2936 +#: sql_help.c:2984 msgid "end_function" msgstr "функция_окончания" -#: sql_help.c:2937 +#: sql_help.c:2985 msgid "lextypes_function" msgstr "функция_лекс_типов" -#: sql_help.c:2938 +#: sql_help.c:2986 msgid "headline_function" msgstr "функция_создания_выдержек" -#: sql_help.c:2950 +#: sql_help.c:2998 msgid "init_function" msgstr "функция_инициализации" -#: sql_help.c:2951 +#: sql_help.c:2999 msgid "lexize_function" msgstr "функция_выделения_лексем" -#: sql_help.c:2964 +#: sql_help.c:3012 msgid "from_sql_function_name" msgstr "имя_функции_из_sql" -#: sql_help.c:2966 +#: sql_help.c:3014 msgid "to_sql_function_name" msgstr "имя_функции_в_sql" -#: sql_help.c:2992 +#: sql_help.c:3040 msgid "referenced_table_name" msgstr "ссылающаяся_таблица" -#: sql_help.c:2993 +#: sql_help.c:3041 msgid "transition_relation_name" msgstr "имя_переходного_отношения" -#: sql_help.c:2996 +#: sql_help.c:3044 msgid "arguments" msgstr "аргументы" -#: sql_help.c:3046 sql_help.c:4221 +#: sql_help.c:3096 sql_help.c:4332 msgid "label" msgstr "метка" -#: sql_help.c:3048 +#: sql_help.c:3098 msgid "subtype" msgstr "подтип" -#: sql_help.c:3049 +#: sql_help.c:3099 msgid "subtype_operator_class" msgstr "класс_оператора_подтипа" -#: sql_help.c:3051 +#: sql_help.c:3101 msgid "canonical_function" msgstr "каноническая_функция" -#: sql_help.c:3052 +#: sql_help.c:3102 msgid "subtype_diff_function" msgstr "функция_различий_подтипа" -#: sql_help.c:3054 +#: sql_help.c:3103 +msgid "multirange_type_name" +msgstr "имя_мультидиапазонного_типа" + +#: sql_help.c:3105 msgid "input_function" msgstr "функция_ввода" -#: sql_help.c:3055 +#: sql_help.c:3106 msgid "output_function" msgstr "функция_вывода" -#: sql_help.c:3056 +#: sql_help.c:3107 msgid "receive_function" msgstr "функция_получения" -#: sql_help.c:3057 +#: sql_help.c:3108 msgid "send_function" msgstr "функция_отправки" -#: sql_help.c:3058 +#: sql_help.c:3109 msgid "type_modifier_input_function" msgstr "функция_ввода_модификатора_типа" -#: sql_help.c:3059 +#: sql_help.c:3110 msgid "type_modifier_output_function" msgstr "функция_вывода_модификатора_типа" -#: sql_help.c:3060 +#: sql_help.c:3111 msgid "analyze_function" msgstr "функция_анализа" -#: sql_help.c:3061 +#: sql_help.c:3112 +msgid "subscript_function" +msgstr "функция_обращения_по_индексу" + +#: sql_help.c:3113 msgid "internallength" msgstr "внутр_длина" -#: sql_help.c:3062 +#: sql_help.c:3114 msgid "alignment" msgstr "выравнивание" -#: sql_help.c:3063 +#: sql_help.c:3115 msgid "storage" msgstr "хранение" -#: sql_help.c:3064 +#: sql_help.c:3116 msgid "like_type" msgstr "тип_образец" -#: sql_help.c:3065 +#: sql_help.c:3117 msgid "category" msgstr "категория" -#: sql_help.c:3066 +#: sql_help.c:3118 msgid "preferred" msgstr "предпочитаемый" -#: sql_help.c:3067 +#: sql_help.c:3119 msgid "default" msgstr "по_умолчанию" -#: sql_help.c:3068 +#: sql_help.c:3120 msgid "element" msgstr "элемент" -#: sql_help.c:3069 +#: sql_help.c:3121 msgid "delimiter" msgstr "разделитель" -#: sql_help.c:3070 +#: sql_help.c:3122 msgid "collatable" msgstr "сортируемый" -#: sql_help.c:3167 sql_help.c:3816 sql_help.c:4281 sql_help.c:4370 -#: sql_help.c:4520 sql_help.c:4620 sql_help.c:4740 +#: sql_help.c:3219 sql_help.c:3895 sql_help.c:4394 sql_help.c:4491 +#: sql_help.c:4643 sql_help.c:4751 sql_help.c:4874 msgid "with_query" msgstr "запрос_WITH" -#: sql_help.c:3169 sql_help.c:3818 sql_help.c:4300 sql_help.c:4306 -#: sql_help.c:4309 sql_help.c:4313 sql_help.c:4317 sql_help.c:4325 -#: sql_help.c:4539 sql_help.c:4545 sql_help.c:4548 sql_help.c:4552 -#: sql_help.c:4556 sql_help.c:4564 sql_help.c:4622 sql_help.c:4759 -#: sql_help.c:4765 sql_help.c:4768 sql_help.c:4772 sql_help.c:4776 -#: sql_help.c:4784 +#: sql_help.c:3221 sql_help.c:3897 sql_help.c:4413 sql_help.c:4419 +#: sql_help.c:4422 sql_help.c:4426 sql_help.c:4430 sql_help.c:4438 +#: sql_help.c:4662 sql_help.c:4668 sql_help.c:4671 sql_help.c:4675 +#: sql_help.c:4679 sql_help.c:4687 sql_help.c:4753 sql_help.c:4893 +#: sql_help.c:4899 sql_help.c:4902 sql_help.c:4906 sql_help.c:4910 +#: sql_help.c:4918 msgid "alias" msgstr "псевдоним" -#: sql_help.c:3170 sql_help.c:4285 sql_help.c:4327 sql_help.c:4329 -#: sql_help.c:4375 sql_help.c:4524 sql_help.c:4566 sql_help.c:4568 -#: sql_help.c:4629 sql_help.c:4744 sql_help.c:4786 sql_help.c:4788 +#: sql_help.c:3222 sql_help.c:4398 sql_help.c:4440 sql_help.c:4442 +#: sql_help.c:4496 sql_help.c:4647 sql_help.c:4689 sql_help.c:4691 +#: sql_help.c:4760 sql_help.c:4878 sql_help.c:4920 sql_help.c:4922 msgid "from_item" msgstr "источник_данных" -#: sql_help.c:3172 sql_help.c:3653 sql_help.c:3897 sql_help.c:4631 +#: sql_help.c:3224 sql_help.c:3705 sql_help.c:3976 sql_help.c:4762 msgid "cursor_name" msgstr "имя_курсора" -#: sql_help.c:3173 sql_help.c:3824 sql_help.c:4632 +#: sql_help.c:3225 sql_help.c:3903 sql_help.c:4763 msgid "output_expression" msgstr "выражение_результата" -#: sql_help.c:3174 sql_help.c:3825 sql_help.c:4284 sql_help.c:4373 -#: sql_help.c:4523 sql_help.c:4633 sql_help.c:4743 +#: sql_help.c:3226 sql_help.c:3904 sql_help.c:4397 sql_help.c:4494 +#: sql_help.c:4646 sql_help.c:4764 sql_help.c:4877 msgid "output_name" msgstr "имя_результата" -#: sql_help.c:3190 +#: sql_help.c:3242 msgid "code" msgstr "внедрённый_код" -#: sql_help.c:3595 +#: sql_help.c:3647 msgid "parameter" msgstr "параметр" -#: sql_help.c:3617 sql_help.c:3618 sql_help.c:3922 +#: sql_help.c:3669 sql_help.c:3670 sql_help.c:4001 msgid "statement" msgstr "оператор" -#: sql_help.c:3652 sql_help.c:3896 +#: sql_help.c:3704 sql_help.c:3975 msgid "direction" msgstr "направление" -#: sql_help.c:3654 sql_help.c:3898 +#: sql_help.c:3706 sql_help.c:3977 msgid "where direction can be empty or one of:" msgstr "где допустимое направление пустое или:" -#: sql_help.c:3655 sql_help.c:3656 sql_help.c:3657 sql_help.c:3658 -#: sql_help.c:3659 sql_help.c:3899 sql_help.c:3900 sql_help.c:3901 -#: sql_help.c:3902 sql_help.c:3903 sql_help.c:4294 sql_help.c:4296 -#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4533 sql_help.c:4535 -#: sql_help.c:4688 sql_help.c:4690 sql_help.c:4753 sql_help.c:4755 +#: sql_help.c:3707 sql_help.c:3708 sql_help.c:3709 sql_help.c:3710 +#: sql_help.c:3711 sql_help.c:3978 sql_help.c:3979 sql_help.c:3980 +#: sql_help.c:3981 sql_help.c:3982 sql_help.c:4407 sql_help.c:4409 +#: sql_help.c:4505 sql_help.c:4507 sql_help.c:4656 sql_help.c:4658 +#: sql_help.c:4820 sql_help.c:4822 sql_help.c:4887 sql_help.c:4889 msgid "count" msgstr "число" -#: sql_help.c:3741 sql_help.c:4089 +#: sql_help.c:3809 sql_help.c:4189 msgid "sequence_name" msgstr "имя_последовательности" -#: sql_help.c:3754 sql_help.c:4102 +#: sql_help.c:3827 sql_help.c:4207 msgid "arg_name" msgstr "имя_аргумента" -#: sql_help.c:3755 sql_help.c:4103 +#: sql_help.c:3828 sql_help.c:4208 msgid "arg_type" msgstr "тип_аргумента" -#: sql_help.c:3760 sql_help.c:4108 +#: sql_help.c:3835 sql_help.c:4215 msgid "loid" msgstr "код_БО" -#: sql_help.c:3784 +#: sql_help.c:3863 msgid "remote_schema" msgstr "удалённая_схема" -#: sql_help.c:3787 +#: sql_help.c:3866 msgid "local_schema" msgstr "локальная_схема" -#: sql_help.c:3822 +#: sql_help.c:3901 msgid "conflict_target" msgstr "объект_конфликта" -#: sql_help.c:3823 +#: sql_help.c:3902 msgid "conflict_action" msgstr "действие_при_конфликте" -#: sql_help.c:3826 +#: sql_help.c:3905 msgid "where conflict_target can be one of:" msgstr "где допустимый объект_конфликта:" -#: sql_help.c:3827 +#: sql_help.c:3906 msgid "index_column_name" msgstr "имя_столбца_индекса" -#: sql_help.c:3828 +#: sql_help.c:3907 msgid "index_expression" msgstr "выражение_индекса" -#: sql_help.c:3831 +#: sql_help.c:3910 msgid "index_predicate" msgstr "предикат_индекса" -#: sql_help.c:3833 +#: sql_help.c:3912 msgid "and conflict_action is one of:" msgstr "а допустимое действие_при_конфликте:" -#: sql_help.c:3839 sql_help.c:4628 +#: sql_help.c:3918 sql_help.c:4759 msgid "sub-SELECT" msgstr "вложенный_SELECT" -#: sql_help.c:3848 sql_help.c:3911 sql_help.c:4604 +#: sql_help.c:3927 sql_help.c:3990 sql_help.c:4735 msgid "channel" msgstr "канал" -#: sql_help.c:3870 +#: sql_help.c:3949 msgid "lockmode" msgstr "режим_блокировки" -#: sql_help.c:3871 +#: sql_help.c:3950 msgid "where lockmode is one of:" msgstr "где допустимый режим_блокировки:" -#: sql_help.c:3912 +#: sql_help.c:3991 msgid "payload" msgstr "сообщение_нагрузка" -#: sql_help.c:3939 +#: sql_help.c:4018 msgid "old_role" msgstr "старая_роль" -#: sql_help.c:3940 +#: sql_help.c:4019 msgid "new_role" msgstr "новая_роль" -#: sql_help.c:3971 sql_help.c:4143 sql_help.c:4151 +#: sql_help.c:4055 sql_help.c:4254 sql_help.c:4262 msgid "savepoint_name" msgstr "имя_точки_сохранения" -#: sql_help.c:4287 sql_help.c:4339 sql_help.c:4526 sql_help.c:4578 -#: sql_help.c:4746 sql_help.c:4798 +#: sql_help.c:4400 sql_help.c:4453 sql_help.c:4649 sql_help.c:4702 +#: sql_help.c:4880 sql_help.c:4933 msgid "grouping_element" msgstr "элемент_группирования" -#: sql_help.c:4289 sql_help.c:4379 sql_help.c:4528 sql_help.c:4748 +#: sql_help.c:4402 sql_help.c:4500 sql_help.c:4651 sql_help.c:4882 msgid "window_name" msgstr "имя_окна" -#: sql_help.c:4290 sql_help.c:4380 sql_help.c:4529 sql_help.c:4749 +#: sql_help.c:4403 sql_help.c:4501 sql_help.c:4652 sql_help.c:4883 msgid "window_definition" msgstr "определение_окна" -#: sql_help.c:4291 sql_help.c:4305 sql_help.c:4343 sql_help.c:4381 -#: sql_help.c:4530 sql_help.c:4544 sql_help.c:4582 sql_help.c:4750 -#: sql_help.c:4764 sql_help.c:4802 +#: sql_help.c:4404 sql_help.c:4418 sql_help.c:4457 sql_help.c:4502 +#: sql_help.c:4653 sql_help.c:4667 sql_help.c:4706 sql_help.c:4884 +#: sql_help.c:4898 sql_help.c:4937 msgid "select" msgstr "select" -#: sql_help.c:4298 sql_help.c:4537 sql_help.c:4757 +#: sql_help.c:4411 sql_help.c:4660 sql_help.c:4891 msgid "where from_item can be one of:" msgstr "где допустимый источник_данных:" -#: sql_help.c:4301 sql_help.c:4307 sql_help.c:4310 sql_help.c:4314 -#: sql_help.c:4326 sql_help.c:4540 sql_help.c:4546 sql_help.c:4549 -#: sql_help.c:4553 sql_help.c:4565 sql_help.c:4760 sql_help.c:4766 -#: sql_help.c:4769 sql_help.c:4773 sql_help.c:4785 +#: sql_help.c:4414 sql_help.c:4420 sql_help.c:4423 sql_help.c:4427 +#: sql_help.c:4439 sql_help.c:4663 sql_help.c:4669 sql_help.c:4672 +#: sql_help.c:4676 sql_help.c:4688 sql_help.c:4894 sql_help.c:4900 +#: sql_help.c:4903 sql_help.c:4907 sql_help.c:4919 msgid "column_alias" msgstr "псевдоним_столбца" -#: sql_help.c:4302 sql_help.c:4541 sql_help.c:4761 +#: sql_help.c:4415 sql_help.c:4664 sql_help.c:4895 msgid "sampling_method" msgstr "метод_выборки" -#: sql_help.c:4304 sql_help.c:4543 sql_help.c:4763 +#: sql_help.c:4417 sql_help.c:4666 sql_help.c:4897 msgid "seed" msgstr "начальное_число" -#: sql_help.c:4308 sql_help.c:4341 sql_help.c:4547 sql_help.c:4580 -#: sql_help.c:4767 sql_help.c:4800 +#: sql_help.c:4421 sql_help.c:4455 sql_help.c:4670 sql_help.c:4704 +#: sql_help.c:4901 sql_help.c:4935 msgid "with_query_name" msgstr "имя_запроса_WITH" -#: sql_help.c:4318 sql_help.c:4321 sql_help.c:4324 sql_help.c:4557 -#: sql_help.c:4560 sql_help.c:4563 sql_help.c:4777 sql_help.c:4780 -#: sql_help.c:4783 +#: sql_help.c:4431 sql_help.c:4434 sql_help.c:4437 sql_help.c:4680 +#: sql_help.c:4683 sql_help.c:4686 sql_help.c:4911 sql_help.c:4914 +#: sql_help.c:4917 msgid "column_definition" msgstr "определение_столбца" -#: sql_help.c:4328 sql_help.c:4567 sql_help.c:4787 +#: sql_help.c:4441 sql_help.c:4690 sql_help.c:4921 msgid "join_type" msgstr "тип_соединения" -#: sql_help.c:4330 sql_help.c:4569 sql_help.c:4789 +#: sql_help.c:4443 sql_help.c:4692 sql_help.c:4923 msgid "join_condition" msgstr "условие_соединения" -#: sql_help.c:4331 sql_help.c:4570 sql_help.c:4790 +#: sql_help.c:4444 sql_help.c:4693 sql_help.c:4924 msgid "join_column" msgstr "столбец_соединения" -#: sql_help.c:4332 sql_help.c:4571 sql_help.c:4791 +#: sql_help.c:4445 sql_help.c:4694 sql_help.c:4925 +msgid "join_using_alias" +msgstr "псевдоним_использования_соединения" + +#: sql_help.c:4446 sql_help.c:4695 sql_help.c:4926 msgid "and grouping_element can be one of:" msgstr "где допустимый элемент_группирования:" -#: sql_help.c:4340 sql_help.c:4579 sql_help.c:4799 +#: sql_help.c:4454 sql_help.c:4703 sql_help.c:4934 msgid "and with_query is:" msgstr "и запрос_WITH:" -#: sql_help.c:4344 sql_help.c:4583 sql_help.c:4803 +#: sql_help.c:4458 sql_help.c:4707 sql_help.c:4938 msgid "values" msgstr "значения" -#: sql_help.c:4345 sql_help.c:4584 sql_help.c:4804 +#: sql_help.c:4459 sql_help.c:4708 sql_help.c:4939 msgid "insert" msgstr "insert" -#: sql_help.c:4346 sql_help.c:4585 sql_help.c:4805 +#: sql_help.c:4460 sql_help.c:4709 sql_help.c:4940 msgid "update" msgstr "update" -#: sql_help.c:4347 sql_help.c:4586 sql_help.c:4806 +#: sql_help.c:4461 sql_help.c:4710 sql_help.c:4941 msgid "delete" msgstr "delete" -#: sql_help.c:4374 +#: sql_help.c:4463 sql_help.c:4712 sql_help.c:4943 +msgid "search_seq_col_name" +msgstr "имя_столбца_послед_поиска" + +#: sql_help.c:4465 sql_help.c:4714 sql_help.c:4945 +msgid "cycle_mark_col_name" +msgstr "имя_столбца_пометки_цикла" + +#: sql_help.c:4466 sql_help.c:4715 sql_help.c:4946 +msgid "cycle_mark_value" +msgstr "значение_пометки_цикла" + +#: sql_help.c:4467 sql_help.c:4716 sql_help.c:4947 +msgid "cycle_mark_default" +msgstr "пометка_цикла_по_умолчанию" + +#: sql_help.c:4468 sql_help.c:4717 sql_help.c:4948 +msgid "cycle_path_col_name" +msgstr "имя_столбца_пути_цикла" + +#: sql_help.c:4495 msgid "new_table" msgstr "новая_таблица" -#: sql_help.c:4399 +#: sql_help.c:4520 msgid "timezone" msgstr "часовой_пояс" -#: sql_help.c:4444 +#: sql_help.c:4565 msgid "snapshot_id" msgstr "код_снимка" -#: sql_help.c:4686 +#: sql_help.c:4818 msgid "sort_expression" msgstr "выражение_сортировки" -#: sql_help.c:4813 sql_help.c:5791 +#: sql_help.c:4955 sql_help.c:5933 msgid "abort the current transaction" msgstr "прервать текущую транзакцию" -#: sql_help.c:4819 +#: sql_help.c:4961 msgid "change the definition of an aggregate function" msgstr "изменить определение агрегатной функции" -#: sql_help.c:4825 +#: sql_help.c:4967 msgid "change the definition of a collation" msgstr "изменить определение правила сортировки" -#: sql_help.c:4831 +#: sql_help.c:4973 msgid "change the definition of a conversion" msgstr "изменить определение преобразования" -#: sql_help.c:4837 +#: sql_help.c:4979 msgid "change a database" msgstr "изменить атрибуты базы данных" -#: sql_help.c:4843 +#: sql_help.c:4985 msgid "define default access privileges" msgstr "определить права доступа по умолчанию" -#: sql_help.c:4849 +#: sql_help.c:4991 msgid "change the definition of a domain" msgstr "изменить определение домена" -#: sql_help.c:4855 +#: sql_help.c:4997 msgid "change the definition of an event trigger" msgstr "изменить определение событийного триггера" -#: sql_help.c:4861 +#: sql_help.c:5003 msgid "change the definition of an extension" msgstr "изменить определение расширения" -#: sql_help.c:4867 +#: sql_help.c:5009 msgid "change the definition of a foreign-data wrapper" msgstr "изменить определение обёртки сторонних данных" -#: sql_help.c:4873 +#: sql_help.c:5015 msgid "change the definition of a foreign table" msgstr "изменить определение сторонней таблицы" -#: sql_help.c:4879 +#: sql_help.c:5021 msgid "change the definition of a function" msgstr "изменить определение функции" -#: sql_help.c:4885 +#: sql_help.c:5027 msgid "change role name or membership" msgstr "изменить имя роли или членство" -#: sql_help.c:4891 +#: sql_help.c:5033 msgid "change the definition of an index" msgstr "изменить определение индекса" -#: sql_help.c:4897 +#: sql_help.c:5039 msgid "change the definition of a procedural language" msgstr "изменить определение процедурного языка" -#: sql_help.c:4903 +#: sql_help.c:5045 msgid "change the definition of a large object" msgstr "изменить определение большого объекта" -#: sql_help.c:4909 +#: sql_help.c:5051 msgid "change the definition of a materialized view" msgstr "изменить определение материализованного представления" -#: sql_help.c:4915 +#: sql_help.c:5057 msgid "change the definition of an operator" msgstr "изменить определение оператора" -#: sql_help.c:4921 +#: sql_help.c:5063 msgid "change the definition of an operator class" msgstr "изменить определение класса операторов" -#: sql_help.c:4927 +#: sql_help.c:5069 msgid "change the definition of an operator family" msgstr "изменить определение семейства операторов" -#: sql_help.c:4933 -msgid "change the definition of a row level security policy" -msgstr "изменить определение политики безопасности на уровне строк" +#: sql_help.c:5075 +msgid "change the definition of a row-level security policy" +msgstr "изменить определение политики защиты на уровне строк" -#: sql_help.c:4939 +#: sql_help.c:5081 msgid "change the definition of a procedure" msgstr "изменить определение процедуры" -#: sql_help.c:4945 +#: sql_help.c:5087 msgid "change the definition of a publication" msgstr "изменить определение публикации" -#: sql_help.c:4951 sql_help.c:5053 +#: sql_help.c:5093 sql_help.c:5195 msgid "change a database role" msgstr "изменить роль пользователя БД" -#: sql_help.c:4957 +#: sql_help.c:5099 msgid "change the definition of a routine" msgstr "изменить определение подпрограммы" -#: sql_help.c:4963 +#: sql_help.c:5105 msgid "change the definition of a rule" msgstr "изменить определение правила" -#: sql_help.c:4969 +#: sql_help.c:5111 msgid "change the definition of a schema" msgstr "изменить определение схемы" -#: sql_help.c:4975 +#: sql_help.c:5117 msgid "change the definition of a sequence generator" msgstr "изменить определение генератора последовательности" -#: sql_help.c:4981 +#: sql_help.c:5123 msgid "change the definition of a foreign server" msgstr "изменить определение стороннего сервера" -#: sql_help.c:4987 +#: sql_help.c:5129 msgid "change the definition of an extended statistics object" msgstr "изменить определение объекта расширенной статистики" -#: sql_help.c:4993 +#: sql_help.c:5135 msgid "change the definition of a subscription" msgstr "изменить определение подписки" -#: sql_help.c:4999 +#: sql_help.c:5141 msgid "change a server configuration parameter" msgstr "изменить параметр конфигурации сервера" -#: sql_help.c:5005 +#: sql_help.c:5147 msgid "change the definition of a table" msgstr "изменить определение таблицы" -#: sql_help.c:5011 +#: sql_help.c:5153 msgid "change the definition of a tablespace" msgstr "изменить определение табличного пространства" -#: sql_help.c:5017 +#: sql_help.c:5159 msgid "change the definition of a text search configuration" msgstr "изменить определение конфигурации текстового поиска" -#: sql_help.c:5023 +#: sql_help.c:5165 msgid "change the definition of a text search dictionary" msgstr "изменить определение словаря текстового поиска" -#: sql_help.c:5029 +#: sql_help.c:5171 msgid "change the definition of a text search parser" msgstr "изменить определение анализатора текстового поиска" -#: sql_help.c:5035 +#: sql_help.c:5177 msgid "change the definition of a text search template" msgstr "изменить определение шаблона текстового поиска" -#: sql_help.c:5041 +#: sql_help.c:5183 msgid "change the definition of a trigger" msgstr "изменить определение триггера" -#: sql_help.c:5047 +#: sql_help.c:5189 msgid "change the definition of a type" msgstr "изменить определение типа" -#: sql_help.c:5059 +#: sql_help.c:5201 msgid "change the definition of a user mapping" msgstr "изменить сопоставление пользователей" -#: sql_help.c:5065 +#: sql_help.c:5207 msgid "change the definition of a view" msgstr "изменить определение представления" -#: sql_help.c:5071 +#: sql_help.c:5213 msgid "collect statistics about a database" msgstr "собрать статистику о базе данных" -#: sql_help.c:5077 sql_help.c:5869 +#: sql_help.c:5219 sql_help.c:6011 msgid "start a transaction block" msgstr "начать транзакцию" -#: sql_help.c:5083 +#: sql_help.c:5225 msgid "invoke a procedure" msgstr "вызвать процедуру" -#: sql_help.c:5089 +#: sql_help.c:5231 msgid "force a write-ahead log checkpoint" msgstr "произвести контрольную точку в журнале предзаписи" -#: sql_help.c:5095 +#: sql_help.c:5237 msgid "close a cursor" msgstr "закрыть курсор" -#: sql_help.c:5101 +#: sql_help.c:5243 msgid "cluster a table according to an index" msgstr "перегруппировать таблицу по индексу" -#: sql_help.c:5107 +#: sql_help.c:5249 msgid "define or change the comment of an object" msgstr "задать или изменить комментарий объекта" -#: sql_help.c:5113 sql_help.c:5671 +#: sql_help.c:5255 sql_help.c:5813 msgid "commit the current transaction" msgstr "зафиксировать текущую транзакцию" -#: sql_help.c:5119 +#: sql_help.c:5261 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "зафиксировать транзакцию, ранее подготовленную для двухфазной фиксации" -#: sql_help.c:5125 +#: sql_help.c:5267 msgid "copy data between a file and a table" msgstr "импорт/экспорт данных в файл" -#: sql_help.c:5131 +#: sql_help.c:5273 msgid "define a new access method" msgstr "создать новый метод доступа" -#: sql_help.c:5137 +#: sql_help.c:5279 msgid "define a new aggregate function" msgstr "создать агрегатную функцию" -#: sql_help.c:5143 +#: sql_help.c:5285 msgid "define a new cast" msgstr "создать приведение типов" -#: sql_help.c:5149 +#: sql_help.c:5291 msgid "define a new collation" msgstr "создать правило сортировки" -#: sql_help.c:5155 +#: sql_help.c:5297 msgid "define a new encoding conversion" msgstr "создать преобразование кодировки" -#: sql_help.c:5161 +#: sql_help.c:5303 msgid "create a new database" msgstr "создать базу данных" -#: sql_help.c:5167 +#: sql_help.c:5309 msgid "define a new domain" msgstr "создать домен" -#: sql_help.c:5173 +#: sql_help.c:5315 msgid "define a new event trigger" msgstr "создать событийный триггер" -#: sql_help.c:5179 +#: sql_help.c:5321 msgid "install an extension" msgstr "установить расширение" -#: sql_help.c:5185 +#: sql_help.c:5327 msgid "define a new foreign-data wrapper" msgstr "создать обёртку сторонних данных" -#: sql_help.c:5191 +#: sql_help.c:5333 msgid "define a new foreign table" msgstr "создать стороннюю таблицу" -#: sql_help.c:5197 +#: sql_help.c:5339 msgid "define a new function" msgstr "создать функцию" -#: sql_help.c:5203 sql_help.c:5263 sql_help.c:5365 +#: sql_help.c:5345 sql_help.c:5405 sql_help.c:5507 msgid "define a new database role" msgstr "создать роль пользователя БД" -#: sql_help.c:5209 +#: sql_help.c:5351 msgid "define a new index" msgstr "создать индекс" -#: sql_help.c:5215 +#: sql_help.c:5357 msgid "define a new procedural language" msgstr "создать процедурный язык" -#: sql_help.c:5221 +#: sql_help.c:5363 msgid "define a new materialized view" msgstr "создать материализованное представление" -#: sql_help.c:5227 +#: sql_help.c:5369 msgid "define a new operator" msgstr "создать оператор" -#: sql_help.c:5233 +#: sql_help.c:5375 msgid "define a new operator class" msgstr "создать класс операторов" -#: sql_help.c:5239 +#: sql_help.c:5381 msgid "define a new operator family" msgstr "создать семейство операторов" -#: sql_help.c:5245 -msgid "define a new row level security policy for a table" -msgstr "создать новую политику безопасности на уровне строк для таблицы" +#: sql_help.c:5387 +msgid "define a new row-level security policy for a table" +msgstr "создать новую политику защиты на уровне строк для таблицы" -#: sql_help.c:5251 +#: sql_help.c:5393 msgid "define a new procedure" msgstr "создать процедуру" -#: sql_help.c:5257 +#: sql_help.c:5399 msgid "define a new publication" msgstr "создать публикацию" -#: sql_help.c:5269 +#: sql_help.c:5411 msgid "define a new rewrite rule" msgstr "создать правило перезаписи" -#: sql_help.c:5275 +#: sql_help.c:5417 msgid "define a new schema" msgstr "создать схему" -#: sql_help.c:5281 +#: sql_help.c:5423 msgid "define a new sequence generator" msgstr "создать генератор последовательностей" -#: sql_help.c:5287 +#: sql_help.c:5429 msgid "define a new foreign server" msgstr "создать сторонний сервер" -#: sql_help.c:5293 +#: sql_help.c:5435 msgid "define extended statistics" msgstr "создать расширенную статистику" -#: sql_help.c:5299 +#: sql_help.c:5441 msgid "define a new subscription" msgstr "создать подписку" -#: sql_help.c:5305 +#: sql_help.c:5447 msgid "define a new table" msgstr "создать таблицу" -#: sql_help.c:5311 sql_help.c:5827 +#: sql_help.c:5453 sql_help.c:5969 msgid "define a new table from the results of a query" msgstr "создать таблицу из результатов запроса" -#: sql_help.c:5317 +#: sql_help.c:5459 msgid "define a new tablespace" msgstr "создать табличное пространство" -#: sql_help.c:5323 +#: sql_help.c:5465 msgid "define a new text search configuration" msgstr "создать конфигурацию текстового поиска" -#: sql_help.c:5329 +#: sql_help.c:5471 msgid "define a new text search dictionary" msgstr "создать словарь текстового поиска" -#: sql_help.c:5335 +#: sql_help.c:5477 msgid "define a new text search parser" msgstr "создать анализатор текстового поиска" -#: sql_help.c:5341 +#: sql_help.c:5483 msgid "define a new text search template" msgstr "создать шаблон текстового поиска" -#: sql_help.c:5347 +#: sql_help.c:5489 msgid "define a new transform" msgstr "создать преобразование" -#: sql_help.c:5353 +#: sql_help.c:5495 msgid "define a new trigger" msgstr "создать триггер" -#: sql_help.c:5359 +#: sql_help.c:5501 msgid "define a new data type" msgstr "создать тип данных" -#: sql_help.c:5371 +#: sql_help.c:5513 msgid "define a new mapping of a user to a foreign server" msgstr "создать сопоставление пользователя для стороннего сервера" -#: sql_help.c:5377 +#: sql_help.c:5519 msgid "define a new view" msgstr "создать представление" -#: sql_help.c:5383 +#: sql_help.c:5525 msgid "deallocate a prepared statement" msgstr "освободить подготовленный оператор" -#: sql_help.c:5389 +#: sql_help.c:5531 msgid "define a cursor" msgstr "создать курсор" -#: sql_help.c:5395 +#: sql_help.c:5537 msgid "delete rows of a table" msgstr "удалить записи таблицы" -#: sql_help.c:5401 +#: sql_help.c:5543 msgid "discard session state" msgstr "очистить состояние сеанса" -#: sql_help.c:5407 +#: sql_help.c:5549 msgid "execute an anonymous code block" msgstr "выполнить анонимный блок кода" -#: sql_help.c:5413 +#: sql_help.c:5555 msgid "remove an access method" msgstr "удалить метод доступа" -#: sql_help.c:5419 +#: sql_help.c:5561 msgid "remove an aggregate function" msgstr "удалить агрегатную функцию" -#: sql_help.c:5425 +#: sql_help.c:5567 msgid "remove a cast" msgstr "удалить приведение типа" -#: sql_help.c:5431 +#: sql_help.c:5573 msgid "remove a collation" msgstr "удалить правило сортировки" -#: sql_help.c:5437 +#: sql_help.c:5579 msgid "remove a conversion" msgstr "удалить преобразование" -#: sql_help.c:5443 +#: sql_help.c:5585 msgid "remove a database" msgstr "удалить базу данных" -#: sql_help.c:5449 +#: sql_help.c:5591 msgid "remove a domain" msgstr "удалить домен" -#: sql_help.c:5455 +#: sql_help.c:5597 msgid "remove an event trigger" msgstr "удалить событийный триггер" -#: sql_help.c:5461 +#: sql_help.c:5603 msgid "remove an extension" msgstr "удалить расширение" -#: sql_help.c:5467 +#: sql_help.c:5609 msgid "remove a foreign-data wrapper" msgstr "удалить обёртку сторонних данных" -#: sql_help.c:5473 +#: sql_help.c:5615 msgid "remove a foreign table" msgstr "удалить стороннюю таблицу" -#: sql_help.c:5479 +#: sql_help.c:5621 msgid "remove a function" msgstr "удалить функцию" -#: sql_help.c:5485 sql_help.c:5551 sql_help.c:5653 +#: sql_help.c:5627 sql_help.c:5693 sql_help.c:5795 msgid "remove a database role" msgstr "удалить роль пользователя БД" -#: sql_help.c:5491 +#: sql_help.c:5633 msgid "remove an index" msgstr "удалить индекс" -#: sql_help.c:5497 +#: sql_help.c:5639 msgid "remove a procedural language" msgstr "удалить процедурный язык" -#: sql_help.c:5503 +#: sql_help.c:5645 msgid "remove a materialized view" msgstr "удалить материализованное представление" -#: sql_help.c:5509 +#: sql_help.c:5651 msgid "remove an operator" msgstr "удалить оператор" -#: sql_help.c:5515 +#: sql_help.c:5657 msgid "remove an operator class" msgstr "удалить класс операторов" -#: sql_help.c:5521 +#: sql_help.c:5663 msgid "remove an operator family" msgstr "удалить семейство операторов" -#: sql_help.c:5527 +#: sql_help.c:5669 msgid "remove database objects owned by a database role" msgstr "удалить объекты базы данных, принадлежащие роли" -#: sql_help.c:5533 -msgid "remove a row level security policy from a table" -msgstr "удалить политику безопасности на уровне строк из таблицы" +#: sql_help.c:5675 +msgid "remove a row-level security policy from a table" +msgstr "удалить из таблицы политику защиты на уровне строк" -#: sql_help.c:5539 +#: sql_help.c:5681 msgid "remove a procedure" msgstr "удалить процедуру" -#: sql_help.c:5545 +#: sql_help.c:5687 msgid "remove a publication" msgstr "удалить публикацию" -#: sql_help.c:5557 +#: sql_help.c:5699 msgid "remove a routine" msgstr "удалить подпрограмму" -#: sql_help.c:5563 +#: sql_help.c:5705 msgid "remove a rewrite rule" msgstr "удалить правило перезаписи" -#: sql_help.c:5569 +#: sql_help.c:5711 msgid "remove a schema" msgstr "удалить схему" -#: sql_help.c:5575 +#: sql_help.c:5717 msgid "remove a sequence" msgstr "удалить последовательность" -#: sql_help.c:5581 +#: sql_help.c:5723 msgid "remove a foreign server descriptor" msgstr "удалить описание стороннего сервера" -#: sql_help.c:5587 +#: sql_help.c:5729 msgid "remove extended statistics" msgstr "удалить расширенную статистику" -#: sql_help.c:5593 +#: sql_help.c:5735 msgid "remove a subscription" msgstr "удалить подписку" -#: sql_help.c:5599 +#: sql_help.c:5741 msgid "remove a table" msgstr "удалить таблицу" -#: sql_help.c:5605 +#: sql_help.c:5747 msgid "remove a tablespace" msgstr "удалить табличное пространство" -#: sql_help.c:5611 +#: sql_help.c:5753 msgid "remove a text search configuration" msgstr "удалить конфигурацию текстового поиска" -#: sql_help.c:5617 +#: sql_help.c:5759 msgid "remove a text search dictionary" msgstr "удалить словарь текстового поиска" -#: sql_help.c:5623 +#: sql_help.c:5765 msgid "remove a text search parser" msgstr "удалить анализатор текстового поиска" -#: sql_help.c:5629 +#: sql_help.c:5771 msgid "remove a text search template" msgstr "удалить шаблон текстового поиска" -#: sql_help.c:5635 +#: sql_help.c:5777 msgid "remove a transform" msgstr "удалить преобразование" -#: sql_help.c:5641 +#: sql_help.c:5783 msgid "remove a trigger" msgstr "удалить триггер" -#: sql_help.c:5647 +#: sql_help.c:5789 msgid "remove a data type" msgstr "удалить тип данных" -#: sql_help.c:5659 +#: sql_help.c:5801 msgid "remove a user mapping for a foreign server" msgstr "удалить сопоставление пользователя для стороннего сервера" -#: sql_help.c:5665 +#: sql_help.c:5807 msgid "remove a view" msgstr "удалить представление" -#: sql_help.c:5677 +#: sql_help.c:5819 msgid "execute a prepared statement" msgstr "выполнить подготовленный оператор" -#: sql_help.c:5683 +#: sql_help.c:5825 msgid "show the execution plan of a statement" msgstr "показать план выполнения оператора" -#: sql_help.c:5689 +#: sql_help.c:5831 msgid "retrieve rows from a query using a cursor" msgstr "получить результат запроса через курсор" -#: sql_help.c:5695 +#: sql_help.c:5837 msgid "define access privileges" msgstr "определить права доступа" -#: sql_help.c:5701 +#: sql_help.c:5843 msgid "import table definitions from a foreign server" msgstr "импортировать определения таблиц со стороннего сервера" -#: sql_help.c:5707 +#: sql_help.c:5849 msgid "create new rows in a table" msgstr "добавить строки в таблицу" -#: sql_help.c:5713 +#: sql_help.c:5855 msgid "listen for a notification" msgstr "ожидать уведомления" -#: sql_help.c:5719 +#: sql_help.c:5861 msgid "load a shared library file" msgstr "загрузить файл разделяемой библиотеки" -#: sql_help.c:5725 +#: sql_help.c:5867 msgid "lock a table" msgstr "заблокировать таблицу" -#: sql_help.c:5731 +#: sql_help.c:5873 msgid "position a cursor" msgstr "установить курсор" -#: sql_help.c:5737 +#: sql_help.c:5879 msgid "generate a notification" msgstr "сгенерировать уведомление" -#: sql_help.c:5743 +#: sql_help.c:5885 msgid "prepare a statement for execution" msgstr "подготовить оператор для выполнения" -#: sql_help.c:5749 +#: sql_help.c:5891 msgid "prepare the current transaction for two-phase commit" msgstr "подготовить текущую транзакцию для двухфазной фиксации" -#: sql_help.c:5755 +#: sql_help.c:5897 msgid "change the ownership of database objects owned by a database role" msgstr "изменить владельца объектов БД, принадлежащих заданной роли" -#: sql_help.c:5761 +#: sql_help.c:5903 msgid "replace the contents of a materialized view" msgstr "заменить содержимое материализованного представления" -#: sql_help.c:5767 +#: sql_help.c:5909 msgid "rebuild indexes" msgstr "перестроить индексы" -#: sql_help.c:5773 +#: sql_help.c:5915 msgid "destroy a previously defined savepoint" msgstr "удалить ранее определённую точку сохранения" -#: sql_help.c:5779 +#: sql_help.c:5921 msgid "restore the value of a run-time parameter to the default value" msgstr "восстановить исходное значение параметра выполнения" -#: sql_help.c:5785 +#: sql_help.c:5927 msgid "remove access privileges" msgstr "удалить права доступа" -#: sql_help.c:5797 +#: sql_help.c:5939 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "отменить транзакцию, подготовленную ранее для двухфазной фиксации" -#: sql_help.c:5803 +#: sql_help.c:5945 msgid "roll back to a savepoint" msgstr "откатиться к точке сохранения" -#: sql_help.c:5809 +#: sql_help.c:5951 msgid "define a new savepoint within the current transaction" msgstr "определить новую точку сохранения в текущей транзакции" -#: sql_help.c:5815 +#: sql_help.c:5957 msgid "define or change a security label applied to an object" msgstr "задать или изменить метку безопасности, применённую к объекту" -#: sql_help.c:5821 sql_help.c:5875 sql_help.c:5911 +#: sql_help.c:5963 sql_help.c:6017 sql_help.c:6053 msgid "retrieve rows from a table or view" msgstr "выбрать строки из таблицы или представления" -#: sql_help.c:5833 +#: sql_help.c:5975 msgid "change a run-time parameter" msgstr "изменить параметр выполнения" -#: sql_help.c:5839 +#: sql_help.c:5981 msgid "set constraint check timing for the current transaction" msgstr "установить время проверки ограничений для текущей транзакции" -#: sql_help.c:5845 +#: sql_help.c:5987 msgid "set the current user identifier of the current session" msgstr "задать идентификатор текущего пользователя в текущем сеансе" -#: sql_help.c:5851 +#: sql_help.c:5993 msgid "" "set the session user identifier and the current user identifier of the " "current session" @@ -6594,45 +6719,45 @@ msgstr "" "задать идентификатор пользователя сеанса и идентификатор текущего " "пользователя в текущем сеансе" -#: sql_help.c:5857 +#: sql_help.c:5999 msgid "set the characteristics of the current transaction" msgstr "задать свойства текущей транзакции" -#: sql_help.c:5863 +#: sql_help.c:6005 msgid "show the value of a run-time parameter" msgstr "показать значение параметра выполнения" -#: sql_help.c:5881 +#: sql_help.c:6023 msgid "empty a table or set of tables" msgstr "опустошить таблицу или набор таблиц" -#: sql_help.c:5887 +#: sql_help.c:6029 msgid "stop listening for a notification" msgstr "прекратить ожидание уведомлений" -#: sql_help.c:5893 +#: sql_help.c:6035 msgid "update rows of a table" msgstr "изменить строки таблицы" -#: sql_help.c:5899 +#: sql_help.c:6041 msgid "garbage-collect and optionally analyze a database" msgstr "произвести сборку мусора и проанализировать базу данных" -#: sql_help.c:5905 +#: sql_help.c:6047 msgid "compute a set of rows" msgstr "получить набор строк" -#: startup.c:212 +#: startup.c:213 #, c-format msgid "-1 can only be used in non-interactive mode" msgstr "-1 можно использовать только в неинтерактивном режиме" -#: startup.c:327 +#: startup.c:326 #, c-format msgid "could not open log file \"%s\": %m" msgstr "не удалось открыть файл протокола \"%s\": %m" -#: startup.c:439 +#: startup.c:438 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6641,27 +6766,27 @@ msgstr "" "Введите \"help\", чтобы получить справку.\n" "\n" -#: startup.c:589 +#: startup.c:591 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "не удалось установить параметр печати \"%s\"" -#: startup.c:697 +#: startup.c:699 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Для дополнительной информации попробуйте \"%s --help\".\n" -#: startup.c:714 +#: startup.c:716 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "лишний аргумент \"%s\" проигнорирован" -#: startup.c:763 +#: startup.c:765 #, c-format msgid "could not find own program executable" -msgstr "не удалось найти собственный исполняемый файл" +msgstr "не удалось найти свой исполняемый файл" -#: tab-complete.c:4640 +#: tab-complete.c:4939 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6697,6 +6822,16 @@ msgstr "" "нераспознанное значение \"%s\" для \"%s\"\n" "Допустимые значения: %s." +#~ msgid "Enter new password: " +#~ msgstr "Введите новый пароль: " + +#~ msgid "" +#~ "All connection parameters must be supplied because no database connection " +#~ "exists" +#~ msgstr "" +#~ "Без подключения к базе данных необходимо указывать все параметры " +#~ "подключения" + #~ msgid "Could not send cancel request: %s" #~ msgstr "Отправить сигнал отмены не удалось: %s" @@ -6716,9 +6851,6 @@ msgstr "" #~ msgid "old_version" #~ msgstr "старая_версия" -#~ msgid "using_list" -#~ msgstr "список_USING" - #~ msgid "from_list" #~ msgstr "список_FROM" diff --git a/src/bin/psql/po/sv.po b/src/bin/psql/po/sv.po index 3d783d72fd..57fa7c0e2c 100644 --- a/src/bin/psql/po/sv.po +++ b/src/bin/psql/po/sv.po @@ -1,15 +1,15 @@ # Swedish message translation file for psql # Peter Eisentraut , 2001, 2009, 2010. -# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020. +# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. # # Use these quotes: "%s" # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-27 21:44+0000\n" -"PO-Revision-Date: 2020-08-30 10:09+0200\n" +"POT-Creation-Date: 2022-05-12 20:16+0000\n" +"PO-Revision-Date: 2022-05-14 07:31+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -18,58 +18,64 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatalt: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "varning: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "tips: " + +#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" msgstr "kunde inte identifiera aktuell katalog: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "ogiltig binär \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "kunde inte läsa binär \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "kunde inte hitta en \"%s\" att köra" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:282 ../../common/exec.c:321 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "kunde inte byta katalog till \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:299 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "kan inte läsa symbolisk länk \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:422 #, c-format -msgid "pclose failed: %m" -msgstr "pclose misslyckades: %m" +msgid "%s() failed: %m" +msgstr "%s() misslyckades: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 -#: command.c:1255 input.c:227 mainloop.c:81 mainloop.c:402 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: command.c:1320 command.c:3316 command.c:3365 command.c:3489 input.c:227 +#: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "slut på minne" @@ -90,7 +96,7 @@ msgstr "kan inte duplicera null-pekare (internt fel)\n" msgid "could not look up effective user ID %ld: %s" msgstr "kunde inte slå upp effektivt användar-id %ld: %s" -#: ../../common/username.c:45 command.c:559 +#: ../../common/username.c:45 command.c:576 msgid "user does not exist" msgstr "användaren finns inte" @@ -129,310 +135,302 @@ msgstr "barnprocess terminerades av signal %d: %s" msgid "child process exited with unrecognized status %d" msgstr "barnprocess avslutade med okänd statuskod %d" -#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 msgid "Cancel request sent\n" msgstr "Förfrågan om avbrytning skickad\n" -#: ../../fe_utils/cancel.c:165 +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 msgid "Could not send cancel request: " msgstr "Kunde inte skicka förfrågan om avbrytning: " -#: ../../fe_utils/cancel.c:210 -#, c-format -msgid "Could not send cancel request: %s" -msgstr "Kunde inte skicka förfrågan om avbrytning: %s" - -#: ../../fe_utils/print.c:350 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu rad)" msgstr[1] "(%lu rader)" -#: ../../fe_utils/print.c:3055 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Avbruten\n" -#: ../../fe_utils/print.c:3119 +#: ../../fe_utils/print.c:3173 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Kan inte lägga till rubrik till tabellinnehåll: antal kolumner (%d) överskridet.\n" -#: ../../fe_utils/print.c:3159 +#: ../../fe_utils/print.c:3213 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "Kan inte lägga till cell till tabellinnehåll: totala cellantalet (%d) överskridet.\n" -#: ../../fe_utils/print.c:3414 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "ogiltigt utdataformat (internt fel): %d" -#: ../../fe_utils/psqlscan.l:694 +#: ../../fe_utils/psqlscan.l:702 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "hoppar över rekursiv expandering av variabeln \"%s\"" -#: command.c:224 +#: ../../port/thread.c:100 ../../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "kunde inte slå upp lokalt användar-id %d: %s" + +#: ../../port/thread.c:105 ../../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "lokal användare med ID %d existerar inte" + +#: command.c:233 #, c-format msgid "invalid command \\%s" msgstr "ogiltigt kommando \\%s" -#: command.c:226 +#: command.c:235 #, c-format msgid "Try \\? for help." msgstr "Försök med \\? för hjälp." -#: command.c:244 +#: command.c:253 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: extra argument \"%s\" ignorerat" -#: command.c:296 +#: command.c:305 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "kommandot \\%s ignorerat; använd \\endif eller Ctrl-C för att avsluta nuvarande \\if-block" -#: command.c:557 +#: command.c:574 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "kunde inte hämta hemkatalog för användar-ID %ld: %s" -#: command.c:575 +#: command.c:593 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: kunde inte byta katalog till \"%s\": %m" -#: command.c:600 +#: command.c:618 #, c-format msgid "You are currently not connected to a database.\n" msgstr "Du är för närvarande inte uppkopplad mot en databas.\n" -#: command.c:613 +#: command.c:628 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Du är uppkopplad upp mot databas \"%s\" som användare \"%s\" på adress \"%s\" på port \"%s\".\n" -#: command.c:616 +#: command.c:631 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Du är uppkopplad mot databas \"%s\" som användare \"%s\" via uttag i \"%s\" på port \"%s\".\n" -#: command.c:622 +#: command.c:637 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Du är uppkopplad upp mot databas \"%s\" som användare \"%s\" på värd \"%s\" (adress \"%s\") på port \"%s\".\n" -#: command.c:625 +#: command.c:640 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Du är uppkopplad upp mot databas \"%s\" som användare \"%s\" på värd \"%s\" på port \"%s\".\n" -#: command.c:965 command.c:1061 command.c:2550 +#: command.c:1031 command.c:1126 command.c:2660 #, c-format msgid "no query buffer" msgstr "ingen frågebuffert" -#: command.c:998 command.c:5061 +#: command.c:1064 command.c:5485 #, c-format msgid "invalid line number: %s" msgstr "ogiltigt radnummer: %s" -#: command.c:1052 -#, c-format -msgid "The server (version %s) does not support editing function source." -msgstr "Servern (version %s) stöder inte redigering av funktionskällkod." - -#: command.c:1055 -#, c-format -msgid "The server (version %s) does not support editing view definitions." -msgstr "Servern (version %s) stöder inte redigering av vydefinitioner." - -#: command.c:1137 +#: command.c:1202 msgid "No changes" msgstr "Inga ändringar" -#: command.c:1216 +#: command.c:1281 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: ogiltigt kodningsnamn eller konverteringsprocedur hittades inte" -#: command.c:1251 command.c:1992 command.c:3253 command.c:5163 common.c:174 -#: common.c:223 common.c:388 common.c:1237 common.c:1265 common.c:1373 -#: common.c:1480 common.c:1518 copy.c:488 copy.c:707 help.c:62 large_obj.c:157 -#: large_obj.c:192 large_obj.c:254 +#: command.c:1316 command.c:2119 command.c:3312 command.c:3511 command.c:5587 +#: common.c:177 common.c:226 common.c:395 common.c:1097 common.c:1175 +#: common.c:1193 common.c:1267 common.c:1374 common.c:1412 common.c:1498 +#: common.c:1541 copy.c:488 copy.c:722 help.c:61 large_obj.c:157 +#: large_obj.c:192 large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1258 +#: command.c:1323 msgid "There is no previous error." msgstr "Det finns inget tidigare fel." -#: command.c:1371 +#: command.c:1436 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: saknar höger parentes" -#: command.c:1548 command.c:1853 command.c:1867 command.c:1884 command.c:2044 -#: command.c:2281 command.c:2517 command.c:2557 +#: command.c:1520 command.c:1650 command.c:1955 command.c:1969 command.c:1988 +#: command.c:2172 command.c:2414 command.c:2627 command.c:2667 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: obligatoriskt argument saknas" -#: command.c:1679 +#: command.c:1781 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: kan inte komma efter \\else" -#: command.c:1684 +#: command.c:1786 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: ingen matchande \\if" -#: command.c:1748 +#: command.c:1850 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: kan inte komma efter \\else" -#: command.c:1753 +#: command.c:1855 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: ingen matchande \\if" -#: command.c:1793 +#: command.c:1895 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: ingen matchande \\if" -#: command.c:1948 +#: command.c:2052 msgid "Query buffer is empty." msgstr "Frågebufferten är tom." -#: command.c:1970 -msgid "Enter new password: " -msgstr "Mata in nytt lösenord: " +#: command.c:2095 +#, c-format +msgid "Enter new password for user \"%s\": " +msgstr "Mata in nytt lösenord för användare \"%s\": " -#: command.c:1971 +#: command.c:2099 msgid "Enter it again: " msgstr "Mata in det igen: " -#: command.c:1975 +#: command.c:2108 #, c-format msgid "Passwords didn't match." msgstr "Lösenorden stämde inte överens." -#: command.c:2074 +#: command.c:2207 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: kunde inte läsa värde på varibeln" -#: command.c:2177 +#: command.c:2310 msgid "Query buffer reset (cleared)." msgstr "Frågebufferten har blivit borttagen." -#: command.c:2199 +#: command.c:2332 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Skrev historiken till fil \"%s\".\n" -#: command.c:2286 +#: command.c:2419 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: omgivningsvariabelnamn får ej innehålla \"=\"" -#: command.c:2347 -#, c-format -msgid "The server (version %s) does not support showing function source." -msgstr "Servern (version %s) stöder inte visning av funktionskällkod." - -#: command.c:2350 -#, c-format -msgid "The server (version %s) does not support showing view definitions." -msgstr "Servern (version %s) stöder inte visning av vydefinitioner." - -#: command.c:2357 +#: command.c:2467 #, c-format msgid "function name is required" msgstr "funktionsnamn krävs" -#: command.c:2359 +#: command.c:2469 #, c-format msgid "view name is required" msgstr "vynamn krävs" -#: command.c:2489 +#: command.c:2599 msgid "Timing is on." msgstr "Tidtagning är på." -#: command.c:2491 +#: command.c:2601 msgid "Timing is off." msgstr "Tidtagning är av." -#: command.c:2576 command.c:2604 command.c:3661 command.c:3664 command.c:3667 -#: command.c:3673 command.c:3675 command.c:3683 command.c:3693 command.c:3702 -#: command.c:3716 command.c:3733 command.c:3791 common.c:70 copy.c:331 +#: command.c:2686 command.c:2714 command.c:3952 command.c:3955 command.c:3958 +#: command.c:3964 command.c:3966 command.c:3992 command.c:4002 command.c:4014 +#: command.c:4028 command.c:4055 command.c:4113 common.c:73 copy.c:331 #: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:2988 startup.c:236 startup.c:287 +#: command.c:3113 startup.c:243 startup.c:293 msgid "Password: " msgstr "Lösenord: " -#: command.c:2993 startup.c:284 +#: command.c:3118 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Lösenord för användare %s: " -#: command.c:3064 +#: command.c:3174 +#, c-format +msgid "Do not give user, host, or port separately when using a connection string" +msgstr "Ange inte användare, värd eller port separat tillsammans med en anslutningssträng" + +#: command.c:3209 #, c-format -msgid "All connection parameters must be supplied because no database connection exists" -msgstr "Alla anslutningsparametrar måste anges då ingen databasuppkoppling är gjord" +msgid "No database connection exists to re-use parameters from" +msgstr "Det finns ingen anslutning att återanvända parametrar från" -#: command.c:3257 +#: command.c:3517 #, c-format msgid "Previous connection kept" -msgstr "Föregående förbindelse bevarad" +msgstr "Föregående anslutning bevarad" -#: command.c:3261 +#: command.c:3523 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3310 +#: command.c:3579 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" på adress \"%s\" på port \"%s\".\n" -#: command.c:3313 +#: command.c:3582 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" via uttag i \"%s\" på port \"%s\".\n" -#: command.c:3319 +#: command.c:3588 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" på värd \"%s\" (adress \"%s\") på port \"%s\".\n" -#: command.c:3322 +#: command.c:3591 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" på värd \"%s\" på port \"%s\".\n" -#: command.c:3327 +#: command.c:3596 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\".\n" -#: command.c:3360 +#: command.c:3636 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, server %s)\n" -#: command.c:3368 +#: command.c:3649 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -441,29 +439,29 @@ msgstr "" "VARNING: %s huvudversion %s, server huvudversion %s.\n" " En del psql-finesser kommer kanske inte fungera.\n" -#: command.c:3407 +#: command.c:3686 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" -msgstr "SSL-förbindelse (protokoll: %s, krypto: %s, bitar: %s, komprimering: %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" +msgstr "SSL-anslutning (protokoll: %s, krypto: %s, komprimering: %s)\n" -#: command.c:3408 command.c:3409 command.c:3410 +#: command.c:3687 command.c:3688 msgid "unknown" msgstr "okänd" -#: command.c:3411 help.c:45 +#: command.c:3689 help.c:45 msgid "off" msgstr "av" -#: command.c:3411 help.c:45 +#: command.c:3689 help.c:45 msgid "on" msgstr "på" -#: command.c:3425 +#: command.c:3703 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "GSSAPI-krypterad anslutning\n" -#: command.c:3445 +#: command.c:3723 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -474,259 +472,269 @@ msgstr "" " 8-bitars tecken kommer troligen inte fungera korrekt. Se psql:s\n" " referensmanual i sektionen \"Notes for Windows users\" för mer detaljer.\n" -#: command.c:3549 +#: command.c:3828 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "omgivningsvariabeln PSQL_EDITOR_LINENUMBER_ARG måste ange ett radnummer" -#: command.c:3578 +#: command.c:3857 #, c-format msgid "could not start editor \"%s\"" msgstr "kunde inte starta editorn \"%s\"" -#: command.c:3580 +#: command.c:3859 #, c-format msgid "could not start /bin/sh" msgstr "kunde inte starta /bin/sh" -#: command.c:3618 +#: command.c:3909 #, c-format msgid "could not locate temporary directory: %s" msgstr "kunde inte hitta temp-katalog: %s" -#: command.c:3645 +#: command.c:3936 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "kunde inte öppna temporär fil \"%s\": %m" -#: command.c:3950 +#: command.c:4272 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: tvetydig förkortning \"%s\" matchar både \"%s\" och \"%s\"" -#: command.c:3970 +#: command.c:4292 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset: tillåtna format är aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:3989 +#: command.c:4311 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: tillåtna linjestilar är ascii, old-ascii, unicode" -#: command.c:4004 +#: command.c:4326 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: tillåtna Unicode-ramstilar är single, double" -#: command.c:4019 +#: command.c:4341 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: tillåtna Unicode-kolumnlinjestilar ärsingle, double" -#: command.c:4034 +#: command.c:4356 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: tillåtna Unicode-rubriklinjestilar är single, double" -#: command.c:4077 +#: command.c:4399 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep måste vara ett ensamt en-byte-tecken" -#: command.c:4082 +#: command.c:4404 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldset kan inte vara dubbelcitat, nyrad eller vagnretur" -#: command.c:4219 command.c:4407 +#: command.c:4541 command.c:4729 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: okänd parameter: %s" -#: command.c:4239 +#: command.c:4561 #, c-format msgid "Border style is %d.\n" msgstr "Ramstil är %d.\n" -#: command.c:4245 +#: command.c:4567 #, c-format msgid "Target width is unset.\n" msgstr "Målvidd är inte satt.\n" -#: command.c:4247 +#: command.c:4569 #, c-format msgid "Target width is %d.\n" msgstr "Målvidd är %d.\n" -#: command.c:4254 +#: command.c:4576 #, c-format msgid "Expanded display is on.\n" msgstr "Utökad visning är på.\n" -#: command.c:4256 +#: command.c:4578 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Utökad visning används automatiskt.\n" -#: command.c:4258 +#: command.c:4580 #, c-format msgid "Expanded display is off.\n" msgstr "Utökad visning är av.\n" -#: command.c:4264 +#: command.c:4586 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Fältseparatorn för CSV är \"%s\".\n" -#: command.c:4272 command.c:4280 +#: command.c:4594 command.c:4602 #, c-format msgid "Field separator is zero byte.\n" msgstr "Fältseparatorn är noll-byte.\n" -#: command.c:4274 +#: command.c:4596 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Fältseparatorn är \"%s\".\n" -#: command.c:4287 +#: command.c:4609 #, c-format msgid "Default footer is on.\n" msgstr "Standard sidfot är på.\n" -#: command.c:4289 +#: command.c:4611 #, c-format msgid "Default footer is off.\n" msgstr "Standard sidfot är av.\n" -#: command.c:4295 +#: command.c:4617 #, c-format msgid "Output format is %s.\n" msgstr "Utdataformatet är \"%s\".\n" -#: command.c:4301 +#: command.c:4623 #, c-format msgid "Line style is %s.\n" msgstr "Linjestil är %s.\n" -#: command.c:4308 +#: command.c:4630 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null-visare är \"%s\".\n" -#: command.c:4316 +#: command.c:4638 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Lokal-anpassad numerisk utdata är på.\n" -#: command.c:4318 +#: command.c:4640 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Lokal-anpassad numerisk utdata är av.\n" -#: command.c:4325 +#: command.c:4647 #, c-format msgid "Pager is used for long output.\n" msgstr "Siduppdelare är på för lång utdata.\n" -#: command.c:4327 +#: command.c:4649 #, c-format msgid "Pager is always used.\n" msgstr "Siduppdelare används alltid.\n" -#: command.c:4329 +#: command.c:4651 #, c-format msgid "Pager usage is off.\n" msgstr "Siduppdelare är av.\n" -#: command.c:4335 +#: command.c:4657 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" msgstr[0] "Siduppdelare kommer inte användas för färre än %d linje.\n" msgstr[1] "Siduppdelare kommer inte användas för färre än %d linjer.\n" -#: command.c:4345 command.c:4355 +#: command.c:4667 command.c:4677 #, c-format msgid "Record separator is zero byte.\n" msgstr "Postseparatorn är noll-byte.\n" -#: command.c:4347 +#: command.c:4669 #, c-format msgid "Record separator is .\n" msgstr "Postseparatorn är .\n" -#: command.c:4349 +#: command.c:4671 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Postseparatorn är \"%s\".\n" -#: command.c:4362 +#: command.c:4684 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Tabellattributen är \"%s\".\n" -#: command.c:4365 +#: command.c:4687 #, c-format msgid "Table attributes unset.\n" msgstr "Tabellattributen är ej satta.\n" -#: command.c:4372 +#: command.c:4694 #, c-format msgid "Title is \"%s\".\n" msgstr "Titeln är \"%s\".\n" -#: command.c:4374 +#: command.c:4696 #, c-format msgid "Title is unset.\n" msgstr "Titeln är inte satt.\n" -#: command.c:4381 +#: command.c:4703 #, c-format msgid "Tuples only is on.\n" msgstr "Visa bara tupler är på.\n" -#: command.c:4383 +#: command.c:4705 #, c-format msgid "Tuples only is off.\n" msgstr "Visa bara tupler är av.\n" -#: command.c:4389 +#: command.c:4711 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Unicode-ramstil är \"%s\".\n" -#: command.c:4395 +#: command.c:4717 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Unicode-kolumnLinjestil är \"%s\".\n" -#: command.c:4401 +#: command.c:4723 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Unicode-rubriklinjestil är \"%s\".\n" -#: command.c:4634 +#: command.c:4956 #, c-format msgid "\\!: failed" msgstr "\\!: misslyckades" -#: command.c:4659 common.c:648 +#: command.c:4990 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch kan inte användas på en tom fråga" -#: command.c:4700 +#: command.c:5022 +#, c-format +msgid "could not set timer: %m" +msgstr "kunde inte sätta timer: %m" + +#: command.c:5084 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (varje %gs)\n" -#: command.c:4703 +#: command.c:5087 #, c-format msgid "%s (every %gs)\n" msgstr "%s (varje %gs)\n" -#: command.c:4757 command.c:4764 common.c:548 common.c:555 common.c:1220 +#: command.c:5148 +#, c-format +msgid "could not wait for signals: %m" +msgstr "kunde inte vänta på signaler: %m" + +#: command.c:5194 command.c:5201 common.c:568 common.c:575 common.c:1156 #, c-format msgid "" "********* QUERY **********\n" @@ -739,112 +747,107 @@ msgstr "" "**************************\n" "\n" -#: command.c:4956 +#: command.c:5380 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\" är inte en vy" -#: command.c:4972 +#: command.c:5396 #, c-format msgid "could not parse reloptions array" msgstr "kunde inte parsa arrayen reloptions" -#: common.c:159 +#: common.c:162 #, c-format msgid "cannot escape without active connection" msgstr "kan inte escape:a utan en aktiv uppkoppling" -#: common.c:200 +#: common.c:203 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "shell-kommandots argument innehåller nyrad eller vagnretur: \"%s\"" -#: common.c:304 +#: common.c:307 #, c-format msgid "connection to server was lost" -msgstr "förbindelsen till servern har brutits" +msgstr "uppkopplingen till servern har brutits" -#: common.c:308 +#: common.c:311 #, c-format msgid "The connection to the server was lost. Attempting reset: " -msgstr "Förbindelsen till servern har brutits. Försöker starta om: " +msgstr "Anslutningen till servern har brutits. Försöker starta om: " -#: common.c:313 +#: common.c:316 #, c-format msgid "Failed.\n" msgstr "Misslyckades.\n" -#: common.c:326 +#: common.c:333 #, c-format msgid "Succeeded.\n" msgstr "Lyckades.\n" -#: common.c:378 common.c:938 common.c:1155 +#: common.c:385 common.c:1054 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "oväntad PQresultStatus: %d" -#: common.c:487 +#: common.c:507 #, c-format msgid "Time: %.3f ms\n" msgstr "Tid: %.3f ms\n" -#: common.c:502 +#: common.c:522 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Tid: %.3f ms (%02d:%06.3f)\n" -#: common.c:511 +#: common.c:531 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Tid: %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:518 +#: common.c:538 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Tid: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:542 common.c:600 common.c:1191 +#: common.c:562 common.c:619 common.c:1127 describe.c:6028 #, c-format msgid "You are currently not connected to a database." msgstr "Du är för närvarande inte uppkopplad mot en databas." -#: common.c:655 -#, c-format -msgid "\\watch cannot be used with COPY" -msgstr "\\watch kan inte användas med COPY" - -#: common.c:660 -#, c-format -msgid "unexpected result status for \\watch" -msgstr "oväntat resultatstatus för \\watch" - -#: common.c:690 +#: common.c:650 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "Asynkron notificering \"%s\" mottagen med innehåll \"%s\" från serverprocess med PID %d.\n" -#: common.c:693 +#: common.c:653 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "Asynkron notificering \"%s\" mottagen från serverprocess med PID %d.\n" -#: common.c:726 common.c:743 +#: common.c:686 common.c:705 #, c-format msgid "could not print result table: %m" msgstr "kunde inte visa resultatabell: %m" -#: common.c:764 +#: common.c:726 #, c-format msgid "no rows returned for \\gset" msgstr "inga rader returnerades för \\gset" -#: common.c:769 +#: common.c:731 #, c-format msgid "more than one row returned for \\gset" msgstr "mer än en rad returnerades för \\gset" -#: common.c:1200 +#: common.c:749 +#, c-format +msgid "attempt to \\gset into specially treated variable \"%s\" ignored" +msgstr "försök att utföra \\gset in i en speciellt hanterad variabel \"%s\" hoppas över" + +#: common.c:1136 #, c-format msgid "" "***(Single step mode: verify command)*******************************************\n" @@ -855,37 +858,37 @@ msgstr "" "%s\n" "***(tryck return för att fortsätta eller skriv x och return för att avbryta)*****\n" -#: common.c:1255 -#, c-format -msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." -msgstr "Servern (version %s) stöder inte sparpunkter för ON_ERROR_ROLLBACK." - -#: common.c:1318 +#: common.c:1219 #, c-format msgid "STATEMENT: %s" msgstr "SATS: %s" -#: common.c:1361 +#: common.c:1255 #, c-format msgid "unexpected transaction status (%d)" msgstr "oväntad transaktionsstatus (%d)" -#: common.c:1502 describe.c:2001 +#: common.c:1396 describe.c:1986 msgid "Column" msgstr "Kolumn" -#: common.c:1503 describe.c:177 describe.c:393 describe.c:411 describe.c:456 -#: describe.c:473 describe.c:962 describe.c:1126 describe.c:1711 -#: describe.c:1735 describe.c:2002 describe.c:3719 describe.c:3929 -#: describe.c:4162 describe.c:5368 +#: common.c:1397 describe.c:167 describe.c:349 describe.c:367 describe.c:1012 +#: describe.c:1167 describe.c:1691 describe.c:1715 describe.c:1987 +#: describe.c:3850 describe.c:4059 describe.c:4290 describe.c:4446 +#: describe.c:5674 msgid "Type" msgstr "Typ" -#: common.c:1552 +#: common.c:1446 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "Kommandot hade inget resultat eller så hade resultatet inga kolumner.\n" +#: common.c:1599 +#, c-format +msgid "\\watch cannot be used with COPY" +msgstr "\\watch kan inte användas med COPY" + #: copy.c:98 #, c-format msgid "\\copy: arguments required" @@ -948,11 +951,11 @@ msgstr "" "Mata in data som skall kopieras följt av en nyrad.\n" "Avsluta med bakstreck och en punkt ensamma på en rad eller av en EOF." -#: copy.c:669 +#: copy.c:684 msgid "aborted because of read failure" msgstr "avbruten på grund av läsfel" -#: copy.c:703 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "försöker avsluta kopieringsläge" @@ -1001,558 +1004,567 @@ msgstr "\\crosstabview: tvetydigt kolumnnamn: \"%s\"" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: hittar ej kolumnnamn: \"%s\"" -#: describe.c:75 describe.c:373 describe.c:678 describe.c:810 describe.c:954 -#: describe.c:1115 describe.c:1187 describe.c:3708 describe.c:3916 -#: describe.c:4160 describe.c:4251 describe.c:4518 describe.c:4678 -#: describe.c:4919 describe.c:4994 describe.c:5005 describe.c:5067 -#: describe.c:5492 describe.c:5575 +#: describe.c:87 describe.c:329 describe.c:622 describe.c:796 describe.c:1004 +#: describe.c:1156 describe.c:1230 describe.c:3839 describe.c:4046 +#: describe.c:4288 describe.c:4367 describe.c:4596 describe.c:4798 +#: describe.c:5026 describe.c:5261 describe.c:5328 describe.c:5339 +#: describe.c:5393 describe.c:5782 describe.c:5857 msgid "Schema" msgstr "Schema" -#: describe.c:76 describe.c:174 describe.c:242 describe.c:250 describe.c:374 -#: describe.c:679 describe.c:811 describe.c:872 describe.c:955 describe.c:1188 -#: describe.c:3709 describe.c:3917 describe.c:4083 describe.c:4161 -#: describe.c:4252 describe.c:4331 describe.c:4519 describe.c:4603 -#: describe.c:4679 describe.c:4920 describe.c:4995 describe.c:5006 -#: describe.c:5068 describe.c:5265 describe.c:5349 describe.c:5573 -#: describe.c:5745 describe.c:5985 +#: describe.c:88 describe.c:164 describe.c:223 describe.c:330 describe.c:623 +#: describe.c:797 describe.c:916 describe.c:1005 describe.c:1231 +#: describe.c:3840 describe.c:4047 describe.c:4209 describe.c:4289 +#: describe.c:4368 describe.c:4528 describe.c:4597 describe.c:4799 +#: describe.c:4896 describe.c:5027 describe.c:5262 describe.c:5329 +#: describe.c:5340 describe.c:5394 describe.c:5587 describe.c:5655 +#: describe.c:5855 describe.c:6074 describe.c:6376 msgid "Name" msgstr "Namn" -#: describe.c:77 describe.c:386 describe.c:404 describe.c:450 describe.c:467 +#: describe.c:89 describe.c:342 describe.c:360 msgid "Result data type" msgstr "Resultatdatatyp" -#: describe.c:85 describe.c:98 describe.c:102 describe.c:387 describe.c:405 -#: describe.c:451 describe.c:468 +#: describe.c:90 describe.c:343 describe.c:361 msgid "Argument data types" msgstr "Argumentdatatyp" -#: describe.c:110 describe.c:117 describe.c:185 describe.c:273 describe.c:513 -#: describe.c:727 describe.c:826 describe.c:897 describe.c:1190 describe.c:2020 -#: describe.c:3496 describe.c:3769 describe.c:3963 describe.c:4114 -#: describe.c:4188 describe.c:4261 describe.c:4344 describe.c:4427 -#: describe.c:4546 describe.c:4612 describe.c:4680 describe.c:4821 -#: describe.c:4863 describe.c:4936 describe.c:4998 describe.c:5007 -#: describe.c:5069 describe.c:5291 describe.c:5371 describe.c:5506 -#: describe.c:5576 large_obj.c:290 large_obj.c:300 +#: describe.c:98 describe.c:105 describe.c:175 describe.c:237 describe.c:414 +#: describe.c:654 describe.c:812 describe.c:945 describe.c:1233 describe.c:2007 +#: describe.c:3639 describe.c:3894 describe.c:4093 describe.c:4233 +#: describe.c:4302 describe.c:4377 describe.c:4541 describe.c:4713 +#: describe.c:4835 describe.c:4905 describe.c:5028 describe.c:5173 +#: describe.c:5215 describe.c:5278 describe.c:5332 describe.c:5341 +#: describe.c:5395 describe.c:5605 describe.c:5677 describe.c:5796 +#: describe.c:5858 describe.c:6847 msgid "Description" msgstr "Beskrivning" -#: describe.c:135 +#: describe.c:125 msgid "List of aggregate functions" msgstr "Lista med aggregatfunktioner" -#: describe.c:160 +#: describe.c:150 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Servern (version %s) stöder inte accessmetoder." -#: describe.c:175 +#: describe.c:165 msgid "Index" msgstr "Index" -#: describe.c:176 describe.c:3727 describe.c:3942 describe.c:5493 +#: describe.c:166 describe.c:3858 describe.c:4072 describe.c:5783 msgid "Table" msgstr "Tabell" -#: describe.c:184 describe.c:5270 +#: describe.c:174 describe.c:5589 msgid "Handler" msgstr "Hanterare" -#: describe.c:203 +#: describe.c:195 msgid "List of access methods" msgstr "Lista med accessmetoder" -#: describe.c:229 -#, c-format -msgid "The server (version %s) does not support tablespaces." -msgstr "Servern (version %s) stöder inte tabellutrymmen." - -#: describe.c:243 describe.c:251 describe.c:501 describe.c:717 describe.c:873 -#: describe.c:1114 describe.c:3720 describe.c:3918 describe.c:4087 -#: describe.c:4333 describe.c:4604 describe.c:5266 describe.c:5350 -#: describe.c:5746 describe.c:5883 describe.c:5986 describe.c:6101 -#: describe.c:6180 large_obj.c:289 +#: describe.c:224 describe.c:395 describe.c:647 describe.c:917 describe.c:1155 +#: describe.c:3851 describe.c:4048 describe.c:4210 describe.c:4530 +#: describe.c:4897 describe.c:5588 describe.c:5656 describe.c:6075 +#: describe.c:6257 describe.c:6377 describe.c:6511 describe.c:6593 +#: describe.c:6835 msgid "Owner" msgstr "Ägare" -#: describe.c:244 describe.c:252 +#: describe.c:225 msgid "Location" msgstr "Plats" -#: describe.c:263 describe.c:3313 +#: describe.c:235 describe.c:3475 msgid "Options" msgstr "Alternativ" -#: describe.c:268 describe.c:690 describe.c:889 describe.c:3761 describe.c:3765 +#: describe.c:236 describe.c:645 describe.c:943 describe.c:3893 msgid "Size" msgstr "Storlek" -#: describe.c:290 +#: describe.c:257 msgid "List of tablespaces" msgstr "Lista med tabellutrymmen" -#: describe.c:333 +#: describe.c:302 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df tar bara [anptwS+] som flaggor" -#: describe.c:341 describe.c:352 +#: describe.c:310 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df tar inte en \"%c\"-flagga med serverversion %s" #. translator: "agg" is short for "aggregate" -#: describe.c:389 describe.c:407 describe.c:453 describe.c:470 +#: describe.c:345 describe.c:363 msgid "agg" msgstr "agg" -#: describe.c:390 describe.c:408 +#: describe.c:346 describe.c:364 msgid "window" msgstr "fönster" -#: describe.c:391 +#: describe.c:347 msgid "proc" msgstr "proc" -#: describe.c:392 describe.c:410 describe.c:455 describe.c:472 +#: describe.c:348 describe.c:366 msgid "func" msgstr "funk" -#: describe.c:409 describe.c:454 describe.c:471 describe.c:1324 +#: describe.c:365 describe.c:1363 msgid "trigger" msgstr "utlösare" -#: describe.c:483 +#: describe.c:377 msgid "immutable" msgstr "oföränderlig" -#: describe.c:484 +#: describe.c:378 msgid "stable" msgstr "stabil" -#: describe.c:485 +#: describe.c:379 msgid "volatile" msgstr "instabil" -#: describe.c:486 +#: describe.c:380 msgid "Volatility" msgstr "Instabilitet" -#: describe.c:494 +#: describe.c:388 msgid "restricted" msgstr "begränsad" -#: describe.c:495 +#: describe.c:389 msgid "safe" msgstr "säker" -#: describe.c:496 +#: describe.c:390 msgid "unsafe" msgstr "osäker" -#: describe.c:497 +#: describe.c:391 msgid "Parallel" msgstr "Parallell" -#: describe.c:502 +#: describe.c:396 msgid "definer" msgstr "definierare" -#: describe.c:503 +#: describe.c:397 msgid "invoker" msgstr "anropare" -#: describe.c:504 +#: describe.c:398 msgid "Security" msgstr "Säkerhet" -#: describe.c:511 +#: describe.c:403 msgid "Language" msgstr "Språk" -#: describe.c:512 +#: describe.c:407 describe.c:411 msgid "Source code" msgstr "Källkod" -#: describe.c:641 +#: describe.c:585 msgid "List of functions" msgstr "Lista med funktioner" -#: describe.c:689 +#: describe.c:644 msgid "Internal name" msgstr "Internt namn" -#: describe.c:711 +#: describe.c:646 msgid "Elements" msgstr "Element" -#: describe.c:768 +#: describe.c:695 msgid "List of data types" msgstr "Lista med datatyper" -#: describe.c:812 +#: describe.c:798 msgid "Left arg type" msgstr "Vänster argumenttyp" -#: describe.c:813 +#: describe.c:799 msgid "Right arg type" msgstr "Höger argumenttyp" -#: describe.c:814 +#: describe.c:800 msgid "Result type" msgstr "Resultattyp" -#: describe.c:819 describe.c:4339 describe.c:4404 describe.c:4410 -#: describe.c:4820 describe.c:6352 describe.c:6356 +#: describe.c:805 describe.c:4536 describe.c:4696 describe.c:5172 +#: describe.c:6772 describe.c:6776 msgid "Function" msgstr "Funktion" -#: describe.c:844 +#: describe.c:886 msgid "List of operators" msgstr "Lista med operatorer" -#: describe.c:874 +#: describe.c:918 msgid "Encoding" msgstr "Kodning" -#: describe.c:879 describe.c:4520 +#: describe.c:919 describe.c:4800 msgid "Collate" msgstr "Jämförelse" -#: describe.c:880 describe.c:4521 +#: describe.c:920 describe.c:4801 msgid "Ctype" msgstr "Ctype" -#: describe.c:893 +#: describe.c:925 describe.c:931 describe.c:4806 describe.c:4810 +msgid "ICU Locale" +msgstr "ICU-lokal" + +#: describe.c:926 describe.c:932 +msgid "Locale Provider" +msgstr "Lokalleverantör" + +#: describe.c:944 msgid "Tablespace" msgstr "Tabellutrymme" -#: describe.c:915 +#: describe.c:965 msgid "List of databases" msgstr "Lista med databaser" -#: describe.c:956 describe.c:1117 describe.c:3710 +#: describe.c:1006 describe.c:1158 describe.c:3841 msgid "table" msgstr "tabell" -#: describe.c:957 describe.c:3711 +#: describe.c:1007 describe.c:3842 msgid "view" msgstr "vy" -#: describe.c:958 describe.c:3712 +#: describe.c:1008 describe.c:3843 msgid "materialized view" msgstr "materialiserad vy" -#: describe.c:959 describe.c:1119 describe.c:3714 +#: describe.c:1009 describe.c:1160 describe.c:3845 msgid "sequence" msgstr "sekvens" -#: describe.c:960 describe.c:3716 +#: describe.c:1010 describe.c:3847 msgid "foreign table" msgstr "främmande tabell" -#: describe.c:961 describe.c:3717 describe.c:3927 +#: describe.c:1011 describe.c:3848 describe.c:4057 msgid "partitioned table" msgstr "partitionerad tabell" -#: describe.c:973 +#: describe.c:1022 msgid "Column privileges" msgstr "Kolumnrättigheter" -#: describe.c:1004 describe.c:1038 +#: describe.c:1053 describe.c:1087 msgid "Policies" msgstr "Policys" -#: describe.c:1070 describe.c:6042 describe.c:6046 +#: describe.c:1121 describe.c:4452 describe.c:6456 msgid "Access privileges" msgstr "Åtkomsträttigheter" -#: describe.c:1101 -#, c-format -msgid "The server (version %s) does not support altering default privileges." -msgstr "Servern (version %s) stöder inte ändring av standardrättigheter." - -#: describe.c:1121 +#: describe.c:1162 msgid "function" msgstr "funktion" -#: describe.c:1123 +#: describe.c:1164 msgid "type" msgstr "typ" -#: describe.c:1125 +#: describe.c:1166 msgid "schema" msgstr "schema" -#: describe.c:1149 +#: describe.c:1192 msgid "Default access privileges" msgstr "Standard accessrättigheter" -#: describe.c:1189 +#: describe.c:1232 msgid "Object" msgstr "Objekt" -#: describe.c:1203 +#: describe.c:1246 msgid "table constraint" msgstr "tabellvillkor" -#: describe.c:1225 +#: describe.c:1270 msgid "domain constraint" msgstr "domänvillkor" -#: describe.c:1253 +#: describe.c:1294 msgid "operator class" msgstr "operatorklass" -#: describe.c:1282 +#: describe.c:1318 msgid "operator family" msgstr "operatorfamilj" -#: describe.c:1304 +#: describe.c:1341 msgid "rule" msgstr "rule" -#: describe.c:1346 +#: describe.c:1387 msgid "Object descriptions" msgstr "Objektbeskrivningar" -#: describe.c:1402 describe.c:3833 +#: describe.c:1445 describe.c:3963 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Kunde inte hitta en relation med namn \"%s\"." -#: describe.c:1405 describe.c:3836 +#: describe.c:1448 describe.c:3966 #, c-format msgid "Did not find any relations." msgstr "Kunde inte hitta några relationer." -#: describe.c:1660 +#: describe.c:1644 #, c-format msgid "Did not find any relation with OID %s." msgstr "Kunde inte hitta en relation med OID %s." -#: describe.c:1712 describe.c:1736 +#: describe.c:1692 describe.c:1716 msgid "Start" msgstr "Start" -#: describe.c:1713 describe.c:1737 +#: describe.c:1693 describe.c:1717 msgid "Minimum" msgstr "Minimum" -#: describe.c:1714 describe.c:1738 +#: describe.c:1694 describe.c:1718 msgid "Maximum" msgstr "Maximum" -#: describe.c:1715 describe.c:1739 +#: describe.c:1695 describe.c:1719 msgid "Increment" msgstr "Ökning" -#: describe.c:1716 describe.c:1740 describe.c:1871 describe.c:4255 -#: describe.c:4421 describe.c:4535 describe.c:4540 describe.c:6089 +#: describe.c:1696 describe.c:1720 describe.c:1850 describe.c:4371 +#: describe.c:4707 describe.c:4824 describe.c:4829 describe.c:6499 msgid "yes" msgstr "ja" -#: describe.c:1717 describe.c:1741 describe.c:1872 describe.c:4255 -#: describe.c:4418 describe.c:4535 describe.c:6090 +#: describe.c:1697 describe.c:1721 describe.c:1851 describe.c:4371 +#: describe.c:4704 describe.c:4824 describe.c:6500 msgid "no" msgstr "nej" -#: describe.c:1718 describe.c:1742 +#: describe.c:1698 describe.c:1722 msgid "Cycles?" msgstr "Cyklisk?" -#: describe.c:1719 describe.c:1743 +#: describe.c:1699 describe.c:1723 msgid "Cache" msgstr "Cache" -#: describe.c:1786 +#: describe.c:1764 #, c-format msgid "Owned by: %s" msgstr "Ägd av: %s" -#: describe.c:1790 +#: describe.c:1768 #, c-format msgid "Sequence for identity column: %s" msgstr "Sekvens för identitetskolumn: %s" -#: describe.c:1797 +#: describe.c:1776 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "Ologgat sekvens \"%s.%s\"" + +#: describe.c:1779 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Sekvens \"%s.%s\"" -#: describe.c:1933 +#: describe.c:1923 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Ologgad tabell \"%s.%s\"" -#: describe.c:1936 +#: describe.c:1926 #, c-format msgid "Table \"%s.%s\"" msgstr "Tabell \"%s.%s\"" -#: describe.c:1940 +#: describe.c:1930 #, c-format msgid "View \"%s.%s\"" msgstr "Vy \"%s.%s\"" -#: describe.c:1945 +#: describe.c:1935 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Ologgad materialiserad vy \"%s.%s\"" -#: describe.c:1948 +#: describe.c:1938 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Materialiserad vy \"%s.%s\"" -#: describe.c:1953 +#: describe.c:1943 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Ologgat index \"%s.%s\"" -#: describe.c:1956 +#: describe.c:1946 #, c-format msgid "Index \"%s.%s\"" msgstr "Index \"%s.%s\"" -#: describe.c:1961 +#: describe.c:1951 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Ologgat partitionerat index \"%s.%s\"" -#: describe.c:1964 +#: describe.c:1954 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Partitionerat index \"%s.%s\"" -#: describe.c:1969 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "Särskild relation \"%s.%s\"" - -#: describe.c:1973 +#: describe.c:1958 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST-tabell \"%s.%s\"" -#: describe.c:1977 +#: describe.c:1962 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Sammansatt typ \"%s.%s\"" -#: describe.c:1981 +#: describe.c:1966 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Främmande tabell \"%s.%s\"" -#: describe.c:1986 +#: describe.c:1971 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Ologgad partitionerad tabell \"%s.%s\"" -#: describe.c:1989 +#: describe.c:1974 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Partitionerad tabell \"%s.%s\"" -#: describe.c:2005 describe.c:4168 +#: describe.c:1990 describe.c:4291 msgid "Collation" msgstr "Jämförelse" -#: describe.c:2006 describe.c:4175 +#: describe.c:1991 describe.c:4292 msgid "Nullable" msgstr "Nullbar" -#: describe.c:2007 describe.c:4176 +#: describe.c:1992 describe.c:4293 msgid "Default" msgstr "Standard" -#: describe.c:2010 +#: describe.c:1995 msgid "Key?" msgstr "Nyckel?" -#: describe.c:2012 +#: describe.c:1997 describe.c:4604 describe.c:4615 msgid "Definition" msgstr "Definition" -#: describe.c:2014 describe.c:5286 describe.c:5370 describe.c:5441 -#: describe.c:5505 +#: describe.c:1999 describe.c:5604 describe.c:5676 describe.c:5739 +#: describe.c:5795 msgid "FDW options" msgstr "FDW-alternativ" -#: describe.c:2016 +#: describe.c:2001 msgid "Storage" msgstr "Lagring" -#: describe.c:2018 +#: describe.c:2003 +msgid "Compression" +msgstr "Komprimering" + +#: describe.c:2005 msgid "Stats target" msgstr "Statistikmål" -#: describe.c:2131 +#: describe.c:2141 #, c-format -msgid "Partition of: %s %s" -msgstr "Partition av: %s %s" +msgid "Partition of: %s %s%s" +msgstr "Partition av: %s %s%s" -#: describe.c:2143 +#: describe.c:2154 msgid "No partition constraint" msgstr "Inget partitioneringsvillkor" -#: describe.c:2145 +#: describe.c:2156 #, c-format msgid "Partition constraint: %s" msgstr "Partitioneringsvillkor: %s" -#: describe.c:2169 +#: describe.c:2180 #, c-format msgid "Partition key: %s" msgstr "Partitioneringsnyckel: %s" -#: describe.c:2195 +#: describe.c:2206 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Ägande tabell \"%s.%s\"" -#: describe.c:2266 +#: describe.c:2275 msgid "primary key, " msgstr "primärnyckel, " -#: describe.c:2268 -msgid "unique, " -msgstr "unik, " +#: describe.c:2278 +msgid "unique" +msgstr "unik" -#: describe.c:2274 +#: describe.c:2280 +msgid " nulls not distinct" +msgstr " null-värden ej distinkta" + +#: describe.c:2281 +msgid ", " +msgstr ", " + +#: describe.c:2288 #, c-format msgid "for table \"%s.%s\"" msgstr "för tabell \"%s.%s\"" -#: describe.c:2278 +#: describe.c:2292 #, c-format msgid ", predicate (%s)" msgstr ", predikat (%s)" -#: describe.c:2281 +#: describe.c:2295 msgid ", clustered" msgstr ", klustrad" -#: describe.c:2284 +#: describe.c:2298 msgid ", invalid" msgstr ", ogiltig" -#: describe.c:2287 +#: describe.c:2301 msgid ", deferrable" msgstr ", uppskjutbar" -#: describe.c:2290 +#: describe.c:2304 msgid ", initially deferred" msgstr ", initialt uppskjuten" -#: describe.c:2293 +#: describe.c:2307 msgid ", replica identity" msgstr ", replikaidentitet" -#: describe.c:2360 +#: describe.c:2361 msgid "Indexes:" msgstr "Index:" @@ -1588,526 +1600,557 @@ msgstr "Policys (tvingad radsäkerhet påslagen): (ingen)" msgid "Policies (row security disabled):" msgstr "Policys (radsäkerhet avstängd):" -#: describe.c:2700 +#: describe.c:2697 describe.c:2801 msgid "Statistics objects:" msgstr "Statistikobjekt:" -#: describe.c:2809 describe.c:2913 +#: describe.c:2903 describe.c:3056 msgid "Rules:" msgstr "Regler:" -#: describe.c:2812 +#: describe.c:2906 msgid "Disabled rules:" msgstr "Avstängda regler:" -#: describe.c:2815 +#: describe.c:2909 msgid "Rules firing always:" msgstr "Regler som alltid utförs:" -#: describe.c:2818 +#: describe.c:2912 msgid "Rules firing on replica only:" msgstr "Regler som utförs enbart på replika:" -#: describe.c:2858 +#: describe.c:2991 describe.c:4965 msgid "Publications:" msgstr "Publiceringar:" -#: describe.c:2896 +#: describe.c:3039 msgid "View definition:" msgstr "Vydefinition:" -#: describe.c:3043 +#: describe.c:3202 msgid "Triggers:" msgstr "Utlösare:" -#: describe.c:3047 +#: describe.c:3205 msgid "Disabled user triggers:" msgstr "Avstängda användarutlösare:" -#: describe.c:3049 -msgid "Disabled triggers:" -msgstr "Avstängda utlösare:" - -#: describe.c:3052 +#: describe.c:3208 msgid "Disabled internal triggers:" msgstr "Avstängda interna utlösare:" -#: describe.c:3055 +#: describe.c:3211 msgid "Triggers firing always:" msgstr "Utlösare som alltid aktiveras:" -#: describe.c:3058 +#: describe.c:3214 msgid "Triggers firing on replica only:" msgstr "Utlösare som aktiveras enbart på replika:" -#: describe.c:3130 +#: describe.c:3285 #, c-format msgid "Server: %s" msgstr "Server: %s" -#: describe.c:3138 +#: describe.c:3293 #, c-format msgid "FDW options: (%s)" msgstr "FDW-alternativ: (%s)" -#: describe.c:3159 +#: describe.c:3314 msgid "Inherits" msgstr "Ärver" -#: describe.c:3219 +#: describe.c:3379 #, c-format msgid "Number of partitions: %d" msgstr "Antal partitioner: %d" -#: describe.c:3228 +#: describe.c:3388 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Antal partitioner: %d (Använd \\d+ för att lista dem.)" -#: describe.c:3230 +#: describe.c:3390 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Antal barntabeller: %d (Använd \\d+ för att lista dem.)" -#: describe.c:3237 +#: describe.c:3397 msgid "Child tables" msgstr "Barntabeller" -#: describe.c:3237 +#: describe.c:3397 msgid "Partitions" msgstr "Partitioner" -#: describe.c:3266 +#: describe.c:3428 #, c-format msgid "Typed table of type: %s" msgstr "Typad tabell av typ: %s" -#: describe.c:3282 +#: describe.c:3444 msgid "Replica Identity" msgstr "Replikaidentitet" -#: describe.c:3295 +#: describe.c:3457 msgid "Has OIDs: yes" msgstr "Har OID:er: ja" -#: describe.c:3304 +#: describe.c:3466 #, c-format msgid "Access method: %s" msgstr "Accessmetod: %s" -#: describe.c:3384 +#: describe.c:3545 #, c-format msgid "Tablespace: \"%s\"" msgstr "Tabellutrymme: \"%s\"" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3396 +#: describe.c:3557 #, c-format msgid ", tablespace \"%s\"" msgstr ", tabellutrymme: \"%s\"" -#: describe.c:3489 +#: describe.c:3631 msgid "List of roles" msgstr "Lista med roller" -#: describe.c:3491 +#: describe.c:3633 msgid "Role name" msgstr "Rollnamn" -#: describe.c:3492 +#: describe.c:3634 msgid "Attributes" msgstr "Attribut" -#: describe.c:3493 +#: describe.c:3636 msgid "Member of" msgstr "Medlem av" -#: describe.c:3504 +#: describe.c:3647 msgid "Superuser" msgstr "Superanvändare" -#: describe.c:3507 +#: describe.c:3650 msgid "No inheritance" msgstr "Inget arv" -#: describe.c:3510 +#: describe.c:3653 msgid "Create role" msgstr "Skapa roll" -#: describe.c:3513 +#: describe.c:3656 msgid "Create DB" msgstr "Skapa DB" -#: describe.c:3516 +#: describe.c:3659 msgid "Cannot login" msgstr "Kan inte logga in" -#: describe.c:3520 +#: describe.c:3662 msgid "Replication" msgstr "Replikering" -#: describe.c:3524 +#: describe.c:3666 msgid "Bypass RLS" msgstr "Hopp över RLS" -#: describe.c:3533 +#: describe.c:3675 msgid "No connections" msgstr "Inga uppkopplingar" -#: describe.c:3535 +#: describe.c:3677 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d uppkoppling" msgstr[1] "%d uppkopplingar" -#: describe.c:3545 +#: describe.c:3687 msgid "Password valid until " msgstr "Lösenord giltigt till " -#: describe.c:3595 -#, c-format -msgid "The server (version %s) does not support per-database role settings." -msgstr "Servern (version %s) stöder inte rollinställningar per databas." - -#: describe.c:3608 +#: describe.c:3740 msgid "Role" msgstr "Roll" -#: describe.c:3609 +#: describe.c:3741 msgid "Database" msgstr "Databas" -#: describe.c:3610 +#: describe.c:3742 msgid "Settings" msgstr "Inställningar" -#: describe.c:3631 +#: describe.c:3766 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Kunde inte hitta några inställningar för roll \"%s\" och databas \"%s\"." -#: describe.c:3634 +#: describe.c:3769 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Kunde inte hitta några inställningar för roll \"%s\"." -#: describe.c:3637 +#: describe.c:3772 #, c-format msgid "Did not find any settings." msgstr "Kunde inte hitta några inställningar." -#: describe.c:3642 +#: describe.c:3777 msgid "List of settings" msgstr "Lista med inställningar" -#: describe.c:3713 +#: describe.c:3844 msgid "index" msgstr "index" -#: describe.c:3715 -msgid "special" -msgstr "särskild" +#: describe.c:3846 +msgid "TOAST table" +msgstr "TOAST-tabell" -#: describe.c:3718 describe.c:3928 +#: describe.c:3849 describe.c:4058 msgid "partitioned index" msgstr "partitionerat index" -#: describe.c:3742 +#: describe.c:3869 msgid "permanent" msgstr "permanent" -#: describe.c:3743 +#: describe.c:3870 msgid "temporary" msgstr "temporär" -#: describe.c:3744 +#: describe.c:3871 msgid "unlogged" msgstr "ologgad" -#: describe.c:3745 +#: describe.c:3872 msgid "Persistence" msgstr "Persistens" -#: describe.c:3841 +#: describe.c:3888 +msgid "Access method" +msgstr "Accessmetod" + +#: describe.c:3971 msgid "List of relations" msgstr "Lista med relationer" -#: describe.c:3889 +#: describe.c:4019 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "Servern (version %s) stöder inte deklarativ tabellpartitionering." -#: describe.c:3900 +#: describe.c:4030 msgid "List of partitioned indexes" msgstr "Lista med partitionerade index" -#: describe.c:3902 +#: describe.c:4032 msgid "List of partitioned tables" msgstr "Lista med partitionerade tabeller" -#: describe.c:3906 +#: describe.c:4036 msgid "List of partitioned relations" msgstr "Lista med partitionerade relationer" -#: describe.c:3937 +#: describe.c:4067 msgid "Parent name" msgstr "Föräldranamn" -#: describe.c:3950 +#: describe.c:4080 msgid "Leaf partition size" msgstr "Partitionsstorlek av löv" -#: describe.c:3953 describe.c:3959 +#: describe.c:4083 describe.c:4089 msgid "Total size" msgstr "Total storlek" -#: describe.c:4091 +#: describe.c:4211 msgid "Trusted" msgstr "Tillförlitlig" -#: describe.c:4099 +#: describe.c:4220 msgid "Internal language" msgstr "Internt språk" -#: describe.c:4100 +#: describe.c:4221 msgid "Call handler" msgstr "Anropshanterare" -#: describe.c:4101 describe.c:5273 +#: describe.c:4222 describe.c:5590 msgid "Validator" msgstr "Validerare" -#: describe.c:4104 +#: describe.c:4223 msgid "Inline handler" msgstr "Inline-hanterare" -#: describe.c:4132 +#: describe.c:4253 msgid "List of languages" msgstr "Lista med språk" -#: describe.c:4177 +#: describe.c:4294 msgid "Check" msgstr "Check" -#: describe.c:4219 +#: describe.c:4335 msgid "List of domains" msgstr "Lista med domäner" -#: describe.c:4253 +#: describe.c:4369 msgid "Source" msgstr "Källa" -#: describe.c:4254 +#: describe.c:4370 msgid "Destination" msgstr "Mål" -#: describe.c:4256 describe.c:6091 +#: describe.c:4372 describe.c:6501 msgid "Default?" msgstr "Standard?" -#: describe.c:4293 +#: describe.c:4411 msgid "List of conversions" msgstr "Lista med konverteringar" -#: describe.c:4332 +#: describe.c:4439 +msgid "Parameter" +msgstr "Parameter" + +#: describe.c:4440 +msgid "Value" +msgstr "Värde" + +#: describe.c:4447 +msgid "Context" +msgstr "Kontext" + +#: describe.c:4480 +msgid "List of configuration parameters" +msgstr "Lista med konfigurationsparametrar" + +#: describe.c:4482 +msgid "List of non-default configuration parameters" +msgstr "Lista med icke-defaulta konfigurationsparametrar" + +#: describe.c:4509 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "Servern (version %s) stöder inte händelseutlösare." + +#: describe.c:4529 msgid "Event" msgstr "Händelse" -#: describe.c:4334 +#: describe.c:4531 msgid "enabled" msgstr "påslagen" -#: describe.c:4335 +#: describe.c:4532 msgid "replica" msgstr "replika" -#: describe.c:4336 +#: describe.c:4533 msgid "always" msgstr "alltid" -#: describe.c:4337 +#: describe.c:4534 msgid "disabled" msgstr "avstängd" -#: describe.c:4338 describe.c:5987 +#: describe.c:4535 describe.c:6378 msgid "Enabled" msgstr "Påslagen" -#: describe.c:4340 +#: describe.c:4537 msgid "Tags" msgstr "Etiketter" -#: describe.c:4359 +#: describe.c:4558 msgid "List of event triggers" msgstr "Lista med händelseutlösare" -#: describe.c:4388 +#: describe.c:4585 +#, c-format +msgid "The server (version %s) does not support extended statistics." +msgstr "Servern (version %s) stöder inte utökad statistik." + +#: describe.c:4622 +msgid "Ndistinct" +msgstr "Nunika" + +#: describe.c:4623 +msgid "Dependencies" +msgstr "Beroenden" + +#: describe.c:4633 +msgid "MCV" +msgstr "MCV" + +#: describe.c:4654 +msgid "List of extended statistics" +msgstr "Lista med utökad statistik" + +#: describe.c:4681 msgid "Source type" msgstr "Källtyp" -#: describe.c:4389 +#: describe.c:4682 msgid "Target type" msgstr "Måltyp" -#: describe.c:4420 +#: describe.c:4706 msgid "in assignment" msgstr "i tilldelning" -#: describe.c:4422 +#: describe.c:4708 msgid "Implicit?" msgstr "Implicit?" -#: describe.c:4477 +#: describe.c:4767 msgid "List of casts" msgstr "Lista med typomvandlingar" -#: describe.c:4505 -#, c-format -msgid "The server (version %s) does not support collations." -msgstr "Servern (version %s) stöder inte jämförelser (collations)." - -#: describe.c:4526 describe.c:4530 +#: describe.c:4815 describe.c:4819 msgid "Provider" msgstr "Leverantör" -#: describe.c:4536 describe.c:4541 +#: describe.c:4825 describe.c:4830 msgid "Deterministic?" msgstr "Deterministisk?" -#: describe.c:4576 +#: describe.c:4867 msgid "List of collations" msgstr "Lista med jämförelser (collations)" -#: describe.c:4635 +#: describe.c:4932 msgid "List of schemas" msgstr "Lista med scheman" -#: describe.c:4660 describe.c:4907 describe.c:4978 describe.c:5049 -#, c-format -msgid "The server (version %s) does not support full text search." -msgstr "Servern (version %s) stöder inte fulltextsökning." - -#: describe.c:4695 +#: describe.c:5045 msgid "List of text search parsers" msgstr "Lista med textsökparsrar" -#: describe.c:4740 +#: describe.c:5092 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Kunde inte hitta en textsökparser med namn \"%s\"." -#: describe.c:4743 +#: describe.c:5095 #, c-format msgid "Did not find any text search parsers." msgstr "Kunde inte hitta några textsökparsrar." -#: describe.c:4818 +#: describe.c:5170 msgid "Start parse" msgstr "Starta parsning" -#: describe.c:4819 +#: describe.c:5171 msgid "Method" msgstr "Metod" -#: describe.c:4823 +#: describe.c:5175 msgid "Get next token" msgstr "Hämta nästa symbol" -#: describe.c:4825 +#: describe.c:5177 msgid "End parse" msgstr "Avsluta parsning" -#: describe.c:4827 +#: describe.c:5179 msgid "Get headline" msgstr "Hämta rubrik" -#: describe.c:4829 +#: describe.c:5181 msgid "Get token types" msgstr "Hämta symboltyper" -#: describe.c:4840 +#: describe.c:5192 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Textsökparser \"%s.%s\"" -#: describe.c:4843 +#: describe.c:5195 #, c-format msgid "Text search parser \"%s\"" msgstr "Textsökparser \"%s\"" -#: describe.c:4862 +#: describe.c:5214 msgid "Token name" msgstr "Symbolnamn" -#: describe.c:4873 +#: describe.c:5225 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Symboltyper för parser \"%s.%s\"" -#: describe.c:4876 +#: describe.c:5228 #, c-format msgid "Token types for parser \"%s\"" msgstr "Symboltyper för parser \"%s\"" -#: describe.c:4930 +#: describe.c:5272 msgid "Template" msgstr "Mall" -#: describe.c:4931 +#: describe.c:5273 msgid "Init options" msgstr "Initieringsalternativ" -#: describe.c:4953 +#: describe.c:5297 msgid "List of text search dictionaries" msgstr "Lista med textsökordlistor" -#: describe.c:4996 +#: describe.c:5330 msgid "Init" msgstr "Init" -#: describe.c:4997 +#: describe.c:5331 msgid "Lexize" msgstr "Symboluppdelning" -#: describe.c:5024 +#: describe.c:5360 msgid "List of text search templates" msgstr "Lista med textsökmallar" -#: describe.c:5084 +#: describe.c:5412 msgid "List of text search configurations" msgstr "Lista med textsökkonfigurationer" -#: describe.c:5130 +#: describe.c:5460 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Kunde inte hitta en textsökkonfiguration med namn \"%s\"." -#: describe.c:5133 +#: describe.c:5463 #, c-format msgid "Did not find any text search configurations." msgstr "Kunde inte hitta några textsökkonfigurationer." -#: describe.c:5199 +#: describe.c:5529 msgid "Token" msgstr "Symbol" -#: describe.c:5200 +#: describe.c:5530 msgid "Dictionaries" msgstr "Ordlistor" -#: describe.c:5211 +#: describe.c:5541 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Textsökkonfiguration \"%s.%s\"" -#: describe.c:5214 +#: describe.c:5544 #, c-format msgid "Text search configuration \"%s\"" msgstr "Textsökkonfiguration \"%s\"" -#: describe.c:5218 +#: describe.c:5548 #, c-format msgid "" "\n" @@ -2116,7 +2159,7 @@ msgstr "" "\n" "Parser: \"%s.%s\"" -#: describe.c:5221 +#: describe.c:5551 #, c-format msgid "" "\n" @@ -2125,236 +2168,253 @@ msgstr "" "\n" "Parser: \"%s\"" -#: describe.c:5255 -#, c-format -msgid "The server (version %s) does not support foreign-data wrappers." -msgstr "Servern (version %s) stöder inte främmande data-omvandlare." - -#: describe.c:5313 +#: describe.c:5629 msgid "List of foreign-data wrappers" msgstr "Lista med främmande data-omvandlare" -#: describe.c:5338 -#, c-format -msgid "The server (version %s) does not support foreign servers." -msgstr "Servern (version %s) stöder inte främmande servrar." - -#: describe.c:5351 +#: describe.c:5657 msgid "Foreign-data wrapper" msgstr "Främmande data-omvandlare" -#: describe.c:5369 describe.c:5574 +#: describe.c:5675 describe.c:5856 msgid "Version" msgstr "Version" -#: describe.c:5395 +#: describe.c:5703 msgid "List of foreign servers" msgstr "Lista med främmande servrar" -#: describe.c:5420 -#, c-format -msgid "The server (version %s) does not support user mappings." -msgstr "Servern (version %s) stöder inte användarmappningar." - -#: describe.c:5430 describe.c:5494 +#: describe.c:5728 describe.c:5784 msgid "Server" msgstr "Server" -#: describe.c:5431 +#: describe.c:5729 msgid "User name" msgstr "Användarnamn" -#: describe.c:5456 +#: describe.c:5756 msgid "List of user mappings" msgstr "Lista av användarmappningar" -#: describe.c:5481 -#, c-format -msgid "The server (version %s) does not support foreign tables." -msgstr "Servern (version %s) stöder inte främmande tabeller." - -#: describe.c:5534 +#: describe.c:5826 msgid "List of foreign tables" msgstr "Lista med främmande tabeller" -#: describe.c:5559 describe.c:5616 -#, c-format -msgid "The server (version %s) does not support extensions." -msgstr "Servern (version %s) stöder inte utökningar." - -#: describe.c:5591 +#: describe.c:5875 msgid "List of installed extensions" msgstr "Lista med installerade utökningar" -#: describe.c:5644 +#: describe.c:5920 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Kunde inte hitta en utökning med namn \"%s\"." -#: describe.c:5647 +#: describe.c:5923 #, c-format msgid "Did not find any extensions." msgstr "Kunde inte hitta några utökningar." -#: describe.c:5691 +#: describe.c:5967 msgid "Object description" msgstr "Objektbeskrivning" -#: describe.c:5701 +#: describe.c:5977 #, c-format msgid "Objects in extension \"%s\"" msgstr "Objekt i utökning \"%s\"" -#: describe.c:5730 describe.c:5806 +#: describe.c:6018 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "ej korrekt kvalificerat namn (för många namn med punkt): %s" + +#: describe.c:6033 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "referenser till andra databaser är inte implementerat: %s" + +#: describe.c:6059 describe.c:6183 #, c-format msgid "The server (version %s) does not support publications." msgstr "Servern (version %s) stöder inte publiceringar." -#: describe.c:5747 describe.c:5884 +#: describe.c:6076 describe.c:6258 msgid "All tables" msgstr "Alla tabeller" -#: describe.c:5748 describe.c:5885 +#: describe.c:6077 describe.c:6259 msgid "Inserts" msgstr "Insättningar" -#: describe.c:5749 describe.c:5886 +#: describe.c:6078 describe.c:6260 msgid "Updates" msgstr "Uppdateringar" -#: describe.c:5750 describe.c:5887 +#: describe.c:6079 describe.c:6261 msgid "Deletes" msgstr "Borttagningar" -#: describe.c:5754 describe.c:5889 +#: describe.c:6083 describe.c:6263 msgid "Truncates" -msgstr "Trunkerar" +msgstr "Trunkeringar" -#: describe.c:5758 describe.c:5891 +#: describe.c:6087 describe.c:6265 msgid "Via root" msgstr "Via root" -#: describe.c:5775 +#: describe.c:6106 msgid "List of publications" msgstr "Lista med publiceringar" -#: describe.c:5848 +#: describe.c:6227 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Kunde inte hitta någon publicering med namn \"%s\"." -#: describe.c:5851 +#: describe.c:6230 #, c-format msgid "Did not find any publications." msgstr "Kunde inte hitta några publiceringar." -#: describe.c:5880 +#: describe.c:6254 #, c-format msgid "Publication %s" msgstr "Publicering %s" -#: describe.c:5928 +#: describe.c:6307 msgid "Tables:" msgstr "Tabeller:" -#: describe.c:5972 +#: describe.c:6319 +msgid "Tables from schemas:" +msgstr "Tabeller från scheman:" + +#: describe.c:6363 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Denna server (version %s) stöder inte prenumerationer." -#: describe.c:5988 +#: describe.c:6379 msgid "Publication" msgstr "Publicering" -#: describe.c:5995 +#: describe.c:6388 +msgid "Binary" +msgstr "Binär" + +#: describe.c:6389 +msgid "Streaming" +msgstr "Strömmande" + +#: describe.c:6396 +msgid "Two phase commit" +msgstr "Tvåfas-commit" + +#: describe.c:6397 +msgid "Disable on error" +msgstr "Stäng av vid fel" + +#: describe.c:6402 msgid "Synchronous commit" msgstr "Synkron commit" -#: describe.c:5996 +#: describe.c:6403 msgid "Conninfo" -msgstr "Förbindelseinfo" +msgstr "Anslutningsinfo" -#: describe.c:6018 +#: describe.c:6409 +msgid "Skip LSN" +msgstr "Skippa LSN" + +#: describe.c:6433 msgid "List of subscriptions" msgstr "Lista med prenumerationer" -#: describe.c:6085 describe.c:6174 describe.c:6260 describe.c:6343 +#: describe.c:6495 describe.c:6587 describe.c:6676 describe.c:6763 msgid "AM" msgstr "AM" -#: describe.c:6086 +#: describe.c:6496 msgid "Input type" msgstr "Indatatyp" -#: describe.c:6087 +#: describe.c:6497 msgid "Storage type" msgstr "Lagringstyp" -#: describe.c:6088 +#: describe.c:6498 msgid "Operator class" msgstr "Operatorklass" -#: describe.c:6100 describe.c:6175 describe.c:6261 describe.c:6344 +#: describe.c:6510 describe.c:6588 describe.c:6677 describe.c:6764 msgid "Operator family" msgstr "Operatorfamilj" -#: describe.c:6133 +#: describe.c:6546 msgid "List of operator classes" msgstr "Lista med operatorklasser" -#: describe.c:6176 +#: describe.c:6589 msgid "Applicable types" msgstr "Applicerbara typer" -#: describe.c:6215 +#: describe.c:6631 msgid "List of operator families" msgstr "Lista med operatorfamiljer" -#: describe.c:6262 +#: describe.c:6678 msgid "Operator" msgstr "Operator" -#: describe.c:6263 +#: describe.c:6679 msgid "Strategy" msgstr "Strategi" -#: describe.c:6264 +#: describe.c:6680 msgid "ordering" msgstr "ordning" -#: describe.c:6265 +#: describe.c:6681 msgid "search" msgstr "sök" -#: describe.c:6266 +#: describe.c:6682 msgid "Purpose" msgstr "Ändamål" -#: describe.c:6271 +#: describe.c:6687 msgid "Sort opfamily" msgstr "Sortering-opfamilj" -#: describe.c:6302 +#: describe.c:6722 msgid "List of operators of operator families" msgstr "Lista med operatorer i operatorfamiljer" -#: describe.c:6345 +#: describe.c:6765 msgid "Registered left type" msgstr "Registrerad vänstertyp" -#: describe.c:6346 +#: describe.c:6766 msgid "Registered right type" msgstr "Registrerad högertyp" -#: describe.c:6347 +#: describe.c:6767 msgid "Number" msgstr "Nummer" -#: describe.c:6383 +#: describe.c:6807 msgid "List of support functions of operator families" msgstr "Lista med supportfunktioner i operatorfamiljer" -#: help.c:73 +#: describe.c:6834 +msgid "ID" +msgstr "ID" + +#: describe.c:6855 +msgid "Large objects" +msgstr "Stora objekt" + +#: help.c:70 #, c-format msgid "" "psql is the PostgreSQL interactive terminal.\n" @@ -2363,12 +2423,12 @@ msgstr "" "psql är den interaktiva PostgreSQL-terminalen.\n" "\n" -#: help.c:74 help.c:355 help.c:431 help.c:474 +#: help.c:71 help.c:354 help.c:434 help.c:477 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: help.c:75 +#: help.c:72 #, c-format msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" @@ -2377,32 +2437,32 @@ msgstr "" " psql [FLAGGA]... [DBNAMN [ANVÄNDARNAMN]]\n" "\n" -#: help.c:77 +#: help.c:74 #, c-format msgid "General options:\n" msgstr "Allmänna flaggor:\n" -#: help.c:82 +#: help.c:79 #, c-format msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=KOMMANDO kör ett kommando (SQL eller internt) och avsluta sedan\n" -#: help.c:83 +#: help.c:80 #, c-format msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" msgstr " -d, --dbname=DBNAMN databasnamn att koppla upp mot (standard: \"%s\")\n" -#: help.c:84 +#: help.c:81 #, c-format msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=FILNAMN kör kommandon från fil och avsluta sedan\n" -#: help.c:85 +#: help.c:82 #, c-format msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list lista befintliga databaser och avsluta sedan\n" -#: help.c:86 +#: help.c:83 #, c-format msgid "" " -v, --set=, --variable=NAME=VALUE\n" @@ -2413,17 +2473,17 @@ msgstr "" " sätt psql-variabel NAMN till VÄRDE\n" " (t.ex. -v ON_ERROR_STOP=1)\n" -#: help.c:89 +#: help.c:86 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: help.c:90 +#: help.c:87 #, c-format msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc läs inte startfilen (~/.psqlrc)\n" -#: help.c:91 +#: help.c:88 #, c-format msgid "" " -1 (\"one\"), --single-transaction\n" @@ -2432,22 +2492,22 @@ msgstr "" " -1 (\"ett\"), --single-transaction\n" " kör kommandofilen som en transaktion (om icke-interaktiv)\n" -#: help.c:93 +#: help.c:90 #, c-format msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=alternativ] visa denna hjälp, avsluta sedan\n" -#: help.c:94 +#: help.c:91 #, c-format msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands lista bakstreck-kommandon, avsluta sedan\n" -#: help.c:95 +#: help.c:92 #, c-format msgid " --help=variables list special variables, then exit\n" msgstr " --help=variabler lista speciella variabler, avsluta sedan\n" -#: help.c:97 +#: help.c:94 #, c-format msgid "" "\n" @@ -2456,57 +2516,57 @@ msgstr "" "\n" "Flaggor för in-/utmatning:\n" -#: help.c:98 +#: help.c:95 #, c-format msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all visa all indata från skript\n" -#: help.c:99 +#: help.c:96 #, c-format msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors visa misslyckade kommandon\n" -#: help.c:100 +#: help.c:97 #, c-format msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries visa kommandon som skickas till servern\n" -#: help.c:101 +#: help.c:98 #, c-format msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden visa frågor som interna kommandon skapar\n" -#: help.c:102 +#: help.c:99 #, c-format msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=FILENAME skicka sessions-logg till fil\n" -#: help.c:103 +#: help.c:100 #, c-format msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline slå av förbättrad kommandoradsredigering (readline)\n" -#: help.c:104 +#: help.c:101 #, c-format msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=FILNAMN skriv frågeresultat till fil (eller |rör)\n" -#: help.c:105 +#: help.c:102 #, c-format msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet kör tyst (inga meddelanden, endast frågeutdata)\n" -#: help.c:106 +#: help.c:103 #, c-format msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step stegningsläge (bekräfta varje fråga)\n" -#: help.c:107 +#: help.c:104 #, c-format msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr " -S, --single-line enradsläge (slutet på raden avslutar SQL-kommando)\n" -#: help.c:109 +#: help.c:106 #, c-format msgid "" "\n" @@ -2515,17 +2575,17 @@ msgstr "" "\n" "Flaggor för utdataformat:\n" -#: help.c:110 +#: help.c:107 #, c-format msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align ojusterad utskrift av tabeller\n" -#: help.c:111 +#: help.c:108 #, c-format msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv CSV-utmarningsläge (kommaseparerade värden)\n" -#: help.c:112 +#: help.c:109 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2534,17 +2594,17 @@ msgstr "" " -F, --field-separator=STRÄNG\n" " fältseparator för icke justerad utdata (standard: \"%s\")\n" -#: help.c:115 +#: help.c:112 #, c-format msgid " -H, --html HTML table output mode\n" msgstr " -H, --html HTML-utskrift av tabeller\n" -#: help.c:116 +#: help.c:113 #, c-format msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr " -P, --pset=VAR[=ARG] sätt utskriftsvariabel VAR till ARG (se kommando \\pset)\n" -#: help.c:117 +#: help.c:114 #, c-format msgid "" " -R, --record-separator=STRING\n" @@ -2553,22 +2613,22 @@ msgstr "" " -R, --record-separator=STRÄNG\n" " sätt postseparator för icke justerad utdata (standard: newline)\n" -#: help.c:119 +#: help.c:116 #, c-format msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only visa endast rader\n" -#: help.c:120 +#: help.c:117 #, c-format msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr " -T, --table-attr=TEXT sätt HTML-tabellers flaggor (t.ex. width, border)\n" -#: help.c:121 +#: help.c:118 #, c-format msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded slå på utökad utsrift av tabeller\n" -#: help.c:122 +#: help.c:119 #, c-format msgid "" " -z, --field-separator-zero\n" @@ -2577,7 +2637,7 @@ msgstr "" " -z, --field-separator-zero\n" " sätt fältseparator för icke justerad utdata till noll-byte\n" -#: help.c:124 +#: help.c:121 #, c-format msgid "" " -0, --record-separator-zero\n" @@ -2586,7 +2646,7 @@ msgstr "" " -0, --record-separator=zero\n" " sätt postseparator för icke justerad utdata till noll-byte\n" -#: help.c:127 +#: help.c:124 #, c-format msgid "" "\n" @@ -2595,38 +2655,38 @@ msgstr "" "\n" "Flaggor för anslutning:\n" -#: help.c:130 +#: help.c:127 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" msgstr "" " -h, --host=VÄRDNAMN databasens värdnamn eller uttagkatalog (socket)\n" " (standard: \"%s\")\n" -#: help.c:131 +#: help.c:128 msgid "local socket" msgstr "lokalt uttag (socket)" -#: help.c:134 +#: help.c:131 #, c-format msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr " -p, --port=PORT databasens serverport (standard: \"%s\")\n" -#: help.c:140 +#: help.c:134 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr " -U, --username=ANVNAMN användarnamn för databasen (standard: \"%s\")\n" -#: help.c:141 +#: help.c:135 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password fråga aldrig efter lösenord\n" -#: help.c:142 +#: help.c:136 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password fråga om lösenord (borde ske automatiskt)\n" -#: help.c:144 +#: help.c:138 #, c-format msgid "" "\n" @@ -2641,481 +2701,501 @@ msgstr "" "i PostgreSQL-dokumentationen.\n" "\n" -#: help.c:147 +#: help.c:141 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapportera fel till <%s>.\n" -#: help.c:148 +#: help.c:142 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: help.c:174 +#: help.c:168 #, c-format msgid "General\n" msgstr "Allmänna\n" -#: help.c:175 +#: help.c:169 #, c-format msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright visa PostgreSQL-upphovsrättsinformation\n" -#: help.c:176 +#: help.c:170 #, c-format -msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" +msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr " \\crosstabview [KOLUMNER] kör fråga och visa resultatet i en korstabell\n" -#: help.c:177 +#: help.c:171 #, c-format msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose visa senste felmeddelande vid maximal verbositet\n" -#: help.c:178 +#: help.c:172 #, c-format msgid "" -" \\g [(OPTIONS)] [FILE] execute query (and send results to file or |pipe);\n" +" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" msgstr "" " \\g [(FLAGGOR)] [FIL] kör frågan (och skicka resultatet till fil eller |rör);\n" " \\g utan argument är samma som ett semikolon\n" -#: help.c:180 +#: help.c:174 #, c-format msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc beskriv resultatet av fråga utan att köra den\n" -#: help.c:181 +#: help.c:175 #, c-format msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec kör fråga, kör sen varje värde i resultatet\n" -#: help.c:182 +#: help.c:176 #, c-format -msgid " \\gset [PREFIX] execute query and store results in psql variables\n" +msgid " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr " \\gset [PREFIX] kör frågan och spara resultatet i psql-variabler\n" -#: help.c:183 +#: help.c:177 #, c-format msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [(FLAGGOR)] [FIL] som \\g, men tvinga expanderat utmatningsläge\n" -#: help.c:184 +#: help.c:178 #, c-format msgid " \\q quit psql\n" msgstr " \\q avsluta psql\n" -#: help.c:185 +#: help.c:179 #, c-format msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr " \\watch [SEK] kör fråga var SEK sekund\n" -#: help.c:188 +#: help.c:182 #, c-format msgid "Help\n" msgstr "Hjälp\n" -#: help.c:190 +#: help.c:184 #, c-format msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [kommandon] visa hjälp om backstreckkommandon\n" -#: help.c:191 +#: help.c:185 #, c-format msgid " \\? options show help on psql command-line options\n" msgstr " \\? options visa hjälp för psqls kommandoradflaggor\n" -#: help.c:192 +#: help.c:186 #, c-format msgid " \\? variables show help on special variables\n" msgstr " \\? variables visa hjälp om speciella variabler\n" -#: help.c:193 +#: help.c:187 #, c-format msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [NAMN] hjälp med syntaxen för SQL-kommandon, * för alla kommandon\n" -#: help.c:196 +#: help.c:190 #, c-format msgid "Query Buffer\n" msgstr "Frågebuffert\n" -#: help.c:197 +#: help.c:191 #, c-format msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr " \\e [FIL] [RAD] redigera frågebufferten (eller filen) med extern redigerare\n" -#: help.c:198 +#: help.c:192 #, c-format msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [FUNKNAMN [RAD]] redigera funktionsdefinition med extern redigerare\n" -#: help.c:199 +#: help.c:193 #, c-format msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [FUNKNAMN [RAD]] redigera vydefinition med extern redigerare\n" -#: help.c:200 +#: help.c:194 #, c-format msgid " \\p show the contents of the query buffer\n" msgstr " \\p visa innehållet i frågebufferten\n" -#: help.c:201 +#: help.c:195 #, c-format msgid " \\r reset (clear) the query buffer\n" msgstr " \\r nollställ (radera) frågebufferten\n" -#: help.c:203 +#: help.c:197 #, c-format msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [FILNAMN] visa kommandohistorien eller spara den i fil\n" -#: help.c:205 +#: help.c:199 #, c-format msgid " \\w FILE write query buffer to file\n" msgstr " \\w FILNAMN skriv frågebuffert till fil\n" -#: help.c:208 +#: help.c:202 #, c-format msgid "Input/Output\n" msgstr "In-/Utmatning\n" -#: help.c:209 +#: help.c:203 #, c-format msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr " \\copy ... utför SQL COPY med dataström till klientvärden\n" -#: help.c:210 +#: help.c:204 #, c-format msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [TEXT] skriv text till standard ut (-n för ingen nyrad)\n" -#: help.c:211 +#: help.c:205 #, c-format msgid " \\i FILE execute commands from file\n" msgstr " \\i FILNAMN kör kommandon från fil\n" -#: help.c:212 +#: help.c:206 #, c-format msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr " \\ir FIL som \\i, men relativt platsen för aktuellt script\n" -#: help.c:213 +#: help.c:207 #, c-format msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [FIL] skicka frågeresultat till fil eller |rör\n" -#: help.c:214 +#: help.c:208 #, c-format msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr " \\qecho [-n] [TEXT] skriv text till \\o-utdataströmmen (-n för ingen nyrad)\n" -#: help.c:215 +#: help.c:209 #, c-format msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr " \\warn [-n] [TEXT] skriv text till standard error (-n för ingen nyrad)\n" -#: help.c:218 +#: help.c:212 #, c-format msgid "Conditional\n" msgstr "Villkor\n" -#: help.c:219 +#: help.c:213 #, c-format msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR starta villkorsblock\n" -#: help.c:220 +#: help.c:214 #, c-format msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR alternativ inom aktuellt villkorsblock\n" -#: help.c:221 +#: help.c:215 #, c-format msgid " \\else final alternative within current conditional block\n" msgstr " \\else avslutningsalternativ inom aktuellt villkorsblock\n" -#: help.c:222 +#: help.c:216 #, c-format msgid " \\endif end conditional block\n" msgstr " \\endif avsluta villkorsblock\n" -#: help.c:225 +#: help.c:219 #, c-format msgid "Informational\n" -msgstr "Informationer\n" +msgstr "Information\n" -#: help.c:226 +#: help.c:220 #, c-format msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (flaggor: S = lista systemobjekt, + = mer detaljer)\n" -#: help.c:227 +#: help.c:221 #, c-format msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] lista tabeller, vyer och sekvenser\n" -#: help.c:228 +#: help.c:222 #, c-format msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NAMN beskriv tabell, vy, sekvens eller index\n" -#: help.c:229 +#: help.c:223 #, c-format msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [MALL] lista aggregatfunktioner\n" -#: help.c:230 +#: help.c:224 #, c-format msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [MALL] lista accessmetoder\n" -#: help.c:231 +#: help.c:225 #, c-format msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] lista operatorklasser\n" -#: help.c:232 +#: help.c:226 #, c-format msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] lista operatorfamiljer\n" -#: help.c:233 +#: help.c:227 #, c-format msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" -msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] lista operatorer i operatorfamiljer\n" +msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] lista operatorer i operatorfamiljer\n" -#: help.c:234 +#: help.c:228 #, c-format -msgid " \\dAp [AMPTRN [OPFPTRN]] list support functions of operator families\n" -msgstr " \\dAp [AMPTRN [OPFPTRN]] lista supportfunktioner i operatorfamiljer\n" +msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" +msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] lista supportfunktioner i operatorfamiljer\n" -#: help.c:235 +#: help.c:229 #, c-format msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [MALL] lista tabellutrymmen\n" -#: help.c:236 +#: help.c:230 #, c-format msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [MALL] lista konverteringar\n" -#: help.c:237 +#: help.c:231 +#, c-format +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [MALL] lista konfigurationsparametrar\n" + +#: help.c:232 #, c-format msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [MALL] lista typomvandlingar\n" -#: help.c:238 +#: help.c:233 #, c-format msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [MALL] visa objektbeskrivning som inte visas på andra ställen\n" -#: help.c:239 +#: help.c:234 #, c-format msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [MALL] lista domäner\n" -#: help.c:240 +#: help.c:235 #, c-format msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [MALL] lista standardrättigheter\n" -#: help.c:241 +#: help.c:236 #, c-format msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [MALL] lista främmande tabeller\n" -#: help.c:242 -#, c-format -msgid " \\det[+] [PATTERN] list foreign tables\n" -msgstr " \\det[+] [MALL] lista främmande tabeller\n" - -#: help.c:243 +#: help.c:237 #, c-format msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [MALL] lista främmande servrar\n" -#: help.c:244 +#: help.c:238 +#, c-format +msgid " \\det[+] [PATTERN] list foreign tables\n" +msgstr " \\det[+] [MALL] lista främmande tabeller\n" + +#: help.c:239 #, c-format msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [MALL] lista användarmappning\n" -#: help.c:245 +#: help.c:240 #, c-format msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [MALL] lista främmande data-omvandlare\n" -#: help.c:246 +#: help.c:241 #, c-format -msgid " \\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions\n" -msgstr " \\df[anptw][S+] [MALL] lista [endast agg/normala/procedur/utlösar/window] funktioner\n" +msgid "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" list [only agg/normal/procedure/trigger/window] functions\n" +msgstr "" +" \\df[anptw][S+] [FUNKMALL [TYPMALL ...]]\n" +" lista [endast agg/normala/procedur/utlösar/window] funktioner\n" -#: help.c:247 +#: help.c:243 #, c-format msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [MALL] lista textsökkonfigurationer\n" -#: help.c:248 +#: help.c:244 #, c-format msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [MALL] lista textsökordlistor\n" -#: help.c:249 +#: help.c:245 #, c-format msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [MALL] lista textsökparsrar\n" -#: help.c:250 +#: help.c:246 #, c-format msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [MALL] lista textsökmallar\n" -#: help.c:251 +#: help.c:247 #, c-format msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [MALL] lista roller\n" -#: help.c:252 +#: help.c:248 #, c-format msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [MALL] lista index\n" -#: help.c:253 +#: help.c:249 #, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl lista stora objekt, samma som \\lo_list\n" +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] lista stora objekt, samma som \\lo_list\n" -#: help.c:254 +#: help.c:250 #, c-format msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [MALL] lista procedurspråk\n" -#: help.c:255 +#: help.c:251 #, c-format msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [MALL] lista materialiserade vyer\n" -#: help.c:256 +#: help.c:252 #, c-format msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [MALL] lista scheman\n" -#: help.c:257 +#: help.c:253 #, c-format -msgid " \\do[S] [PATTERN] list operators\n" -msgstr " \\do[S] [MALL] lista operatorer\n" +msgid "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" list operators\n" +msgstr "" +" \\do[S+] [OPMALL [TYPMALL [TYPMALL]]]\n" +" lista operatorer\n" -#: help.c:258 +#: help.c:255 #, c-format msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [MALL] lista jämförelser (collation)\n" -#: help.c:259 +#: help.c:256 #, c-format msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" msgstr " \\dp [MALL] lista åtkomsträttigheter för tabeller, vyer och sekvenser\n" -#: help.c:260 +#: help.c:257 #, c-format msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr " \\dP[tin+] [MALL] lista [bara tabell/index] partitionerade relationer [n=nästlad]\n" -#: help.c:261 +#: help.c:258 #, c-format -msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" -msgstr " \\drds [MALL1 [MALL2]] lista rollinställningar per databas\n" +msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" +msgstr "" +" \\drds [ROLLMALL1 [DBMALL2]]\n" +" lista rollinställningar per databas\n" -#: help.c:262 +#: help.c:259 #, c-format msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [MALL] lista replikeringspubliceringar\n" -#: help.c:263 +#: help.c:260 #, c-format msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [MALL] lista replikeringsprenumerationer\n" -#: help.c:264 +#: help.c:261 #, c-format msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [MALL] lista sekvenser\n" -#: help.c:265 +#: help.c:262 #, c-format msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [MALL] lista tabeller\n" -#: help.c:266 +#: help.c:263 #, c-format msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [MALL] lista datatyper\n" -#: help.c:267 +#: help.c:264 #, c-format msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [MALL] lista roller\n" -#: help.c:268 +#: help.c:265 #, c-format msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [MALL] lista vyer\n" -#: help.c:269 +#: help.c:266 #, c-format msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [MALL] lista utökningar\n" -#: help.c:270 +#: help.c:267 #, c-format -msgid " \\dy [PATTERN] list event triggers\n" -msgstr " \\dy [MALL] lista händelseutlösare\n" +msgid " \\dX [PATTERN] list extended statistics\n" +msgstr " \\dX [MALL] lista utökad statistik\n" -#: help.c:271 +#: help.c:268 +#, c-format +msgid " \\dy[+] [PATTERN] list event triggers\n" +msgstr " \\dy[+] [MALL] lista händelseutlösare\n" + +#: help.c:269 #, c-format msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [MALL] lista databaser\n" -#: help.c:272 +#: help.c:270 #, c-format msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNKNAMN visa en funktions definition\n" -#: help.c:273 +#: help.c:271 #, c-format msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] VYNAMN visa en vys definition\n" -#: help.c:274 +#: help.c:272 #, c-format msgid " \\z [PATTERN] same as \\dp\n" msgstr " \\z [MALL] samma som \\dp\n" -#: help.c:277 +#: help.c:275 #, c-format msgid "Formatting\n" msgstr "Formatering\n" -#: help.c:278 +#: help.c:276 #, c-format msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a byt mellan ojusterat och justerat utdataformat\n" -#: help.c:279 +#: help.c:277 #, c-format msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [TEXT] sätt tabelltitel, eller nollställ\n" -#: help.c:280 +#: help.c:278 #, c-format msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr " \\f [TEXT] visa eller sätt fältseparatorn för ojusterad utmatning\n" -#: help.c:281 +#: help.c:279 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H slå på/av HTML-utskriftsläge (för närvarande: %s)\n" -#: help.c:283 +#: help.c:281 #, c-format msgid "" " \\pset [NAME [VALUE]] set table output option\n" @@ -3134,27 +3214,27 @@ msgstr "" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle)\n" -#: help.c:290 +#: help.c:288 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] visa endast rader (för närvarande: %s)\n" -#: help.c:292 +#: help.c:290 #, c-format msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr " \\T [TEXT] sätt HTML-tabellens
-attribut, eller nollställ\n" -#: help.c:293 +#: help.c:291 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] slå på/av utökad utskrift (för närvarande: %s)\n" -#: help.c:297 +#: help.c:295 #, c-format msgid "Connection\n" -msgstr "Förbindelse\n" +msgstr "Anslutning\n" -#: help.c:299 +#: help.c:297 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3163,7 +3243,7 @@ msgstr "" " \\c[onnect] {[DBNAMN|- ANVÄNDARE|- VÄRD|- PORT|-] | conninfo}\n" " koppla upp mot ny databas (för närvarande \"%s\")\n" -#: help.c:303 +#: help.c:301 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3172,97 +3252,102 @@ msgstr "" " \\c[onnect] {[DBNAMN|- ANVÄNDARE|- VÄRD|- PORT|-] | conninfo}\n" " koppla upp mot ny databas (för närvarande ingen uppkoppling)\n" -#: help.c:305 +#: help.c:303 #, c-format msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo visa information om aktuell uppkoppling\n" -#: help.c:306 +#: help.c:304 #, c-format msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [KODNING] visa eller sätt klientens teckenkodning\n" -#: help.c:307 +#: help.c:305 #, c-format msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [ANVÄNDARNAMN] byt användares lösenord på ett säkert sätt\n" -#: help.c:310 +#: help.c:308 #, c-format msgid "Operating System\n" msgstr "Operativsystem\n" -#: help.c:311 +#: help.c:309 #, c-format msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [KATALOG] byt den aktuella katalogen\n" -#: help.c:312 +#: help.c:310 +#, c-format +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\getenv PSQLVAR ENVVAR hämta omgivningsvariabel\n" + +#: help.c:311 #, c-format msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv NAMN [VÄRDE] sätt eller nollställ omgivningsvariabel\n" -#: help.c:313 +#: help.c:312 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] slå på/av tidstagning av kommandon (för närvarande: %s)\n" -#: help.c:315 +#: help.c:314 #, c-format msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr " \\! [KOMMANDO] kör kommando i skal eller starta interaktivt skal\n" -#: help.c:318 +#: help.c:317 #, c-format msgid "Variables\n" msgstr "Variabler\n" -#: help.c:319 +#: help.c:318 #, c-format msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [TEXT] NAMN be användaren att sätta en intern variabel\n" -#: help.c:320 +#: help.c:319 #, c-format msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr " \\set [NAMN [VÄRDE]] sätt intern variabel, eller lista alla om ingen param\n" -#: help.c:321 +#: help.c:320 #, c-format msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NAME ta bort intern variabel\n" -#: help.c:324 +#: help.c:323 #, c-format msgid "Large Objects\n" msgstr "Stora objekt\n" -#: help.c:325 +#: help.c:324 #, c-format msgid "" " \\lo_export LOBOID FILE\n" " \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" +" \\lo_list[+]\n" " \\lo_unlink LOBOID large object operations\n" msgstr "" " \\lo_export LOBOID FIL\n" " \\lo_import FIL [KOMMENTAR]\n" -" \\lo_list\n" +" \\lo_list[+]\n" " \\lo_unlink LOBOID operationer på stora objekt\n" -#: help.c:352 +#: help.c:351 #, c-format msgid "" "List of specially treated variables\n" "\n" msgstr "Lista av variabler som hanteras speciellt\n" -#: help.c:354 +#: help.c:353 #, c-format msgid "psql variables:\n" msgstr "psql-variabler:\n" -#: help.c:356 +#: help.c:355 #, c-format msgid "" " psql --set=NAME=VALUE\n" @@ -3273,7 +3358,7 @@ msgstr "" " eller \\set NAMN VÄRDE inne i psql\n" "\n" -#: help.c:358 +#: help.c:357 #, c-format msgid "" " AUTOCOMMIT\n" @@ -3282,7 +3367,7 @@ msgstr "" " AUTOCOMMIT\n" " om satt så kommer efterföljande SQL-kommandon commit:as automatiskt\n" -#: help.c:360 +#: help.c:359 #, c-format msgid "" " COMP_KEYWORD_CASE\n" @@ -3293,7 +3378,7 @@ msgstr "" " bestämmer skiftläge för att komplettera SQL-nyckelord\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:363 +#: help.c:362 #, c-format msgid "" " DBNAME\n" @@ -3302,7 +3387,7 @@ msgstr "" " DBNAME\n" " den uppkopplade databasens namn\n" -#: help.c:365 +#: help.c:364 #, c-format msgid "" " ECHO\n" @@ -3313,7 +3398,7 @@ msgstr "" " bestämmer vilken indata som skrivs till standard ut\n" " [all, errors, none, queries]\n" -#: help.c:368 +#: help.c:367 #, c-format msgid "" " ECHO_HIDDEN\n" @@ -3324,7 +3409,7 @@ msgstr "" " om satt, visa interna frågor som körs av backåtstreckkommandon:\n" " om satt till \"noexec\", bara visa dem utan att köra\n" -#: help.c:371 +#: help.c:370 #, c-format msgid "" " ENCODING\n" @@ -3333,7 +3418,7 @@ msgstr "" " ENCODING\n" " aktuell teckenkodning för klient\n" -#: help.c:373 +#: help.c:372 #, c-format msgid "" " ERROR\n" @@ -3342,7 +3427,7 @@ msgstr "" " ERROR\n" " sant om sista frågan misslyckades, falskt annars\n" -#: help.c:375 +#: help.c:374 #, c-format msgid "" " FETCH_COUNT\n" @@ -3351,7 +3436,7 @@ msgstr "" " FETCH_COUNT\n" " antal resultatrader som hämtas och visas åt gången (0=obegränsat)\n" -#: help.c:377 +#: help.c:376 #, c-format msgid "" " HIDE_TABLEAM\n" @@ -3360,7 +3445,16 @@ msgstr "" " HIDE_TABLEAM\n" " om satt så visas inte accessmetoder\n" -#: help.c:379 +#: help.c:378 +#, c-format +msgid "" +" HIDE_TOAST_COMPRESSION\n" +" if set, compression methods are not displayed\n" +msgstr "" +" HIDE_TOAST_COMPRESSION\n" +" om satt så visas inte komprimeringsmetoder\n" + +#: help.c:380 #, c-format msgid "" " HISTCONTROL\n" @@ -3369,7 +3463,7 @@ msgstr "" " HISTCONTROL\n" " styr kommandohistoriken [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:381 +#: help.c:382 #, c-format msgid "" " HISTFILE\n" @@ -3378,7 +3472,7 @@ msgstr "" " HISTFILE\n" " filnamn för att spara kommandohistoriken i\n" -#: help.c:383 +#: help.c:384 #, c-format msgid "" " HISTSIZE\n" @@ -3387,7 +3481,7 @@ msgstr "" " HISTSIZE\n" " maximalt antal kommandon som sparas i kommandohistoriken\n" -#: help.c:385 +#: help.c:386 #, c-format msgid "" " HOST\n" @@ -3396,7 +3490,7 @@ msgstr "" " HOST\n" " den uppkopplade databasens värd\n" -#: help.c:387 +#: help.c:388 #, c-format msgid "" " IGNOREEOF\n" @@ -3405,7 +3499,7 @@ msgstr "" " IGNOREEOF\n" " antal EOF som behövs för att avsluta en interaktiv session\n" -#: help.c:389 +#: help.c:390 #, c-format msgid "" " LASTOID\n" @@ -3414,7 +3508,7 @@ msgstr "" " LASTOID\n" " värdet av den senast påverkade OID:en\n" -#: help.c:391 +#: help.c:392 #, c-format msgid "" " LAST_ERROR_MESSAGE\n" @@ -3425,7 +3519,7 @@ msgstr "" " LAST_ERROR_SQLSTATE\n" " meddelande och SQLSTATE för sista felet eller en tom sträng och \"00000\" om det inte varit fel\n" -#: help.c:394 +#: help.c:395 #, c-format msgid "" " ON_ERROR_ROLLBACK\n" @@ -3434,7 +3528,7 @@ msgstr "" " ON_ERROR_ROLLBACK\n" " om satt, ett fel stoppar inte en transaktion (använder implicita sparpunkter)\n" -#: help.c:396 +#: help.c:397 #, c-format msgid "" " ON_ERROR_STOP\n" @@ -3443,7 +3537,7 @@ msgstr "" " ON_ERROR_STOP\n" " avsluta batchkörning vid fel\n" -#: help.c:398 +#: help.c:399 #, c-format msgid "" " PORT\n" @@ -3452,7 +3546,7 @@ msgstr "" " PORT\n" " värdport för den aktuella uppkopplingen\n" -#: help.c:400 +#: help.c:401 #, c-format msgid "" " PROMPT1\n" @@ -3461,7 +3555,7 @@ msgstr "" " PROMPT1\n" " anger standardprompten för psql\n" -#: help.c:402 +#: help.c:403 #, c-format msgid "" " PROMPT2\n" @@ -3470,7 +3564,7 @@ msgstr "" " PROMPT2\n" " anger den prompt som används om en sats forsätter på efterföljande rad\n" -#: help.c:404 +#: help.c:405 #, c-format msgid "" " PROMPT3\n" @@ -3479,7 +3573,7 @@ msgstr "" " PROMPT3\n" " anger den prompt som används för COPY ... FROM STDIN\n" -#: help.c:406 +#: help.c:407 #, c-format msgid "" " QUIET\n" @@ -3488,7 +3582,7 @@ msgstr "" " QUIET\n" " kör tyst (samma som flaggan -q)\n" -#: help.c:408 +#: help.c:409 #, c-format msgid "" " ROW_COUNT\n" @@ -3497,7 +3591,7 @@ msgstr "" " ROW_COUNT\n" " antal rader som returnerades eller påverkades av senaste frågan alternativt 0\n" -#: help.c:410 +#: help.c:411 #, c-format msgid "" " SERVER_VERSION_NAME\n" @@ -3508,7 +3602,17 @@ msgstr "" " SERVER_VERSION_NAME\n" " serverns version (i kort sträng eller numeriskt format)\n" -#: help.c:413 +#: help.c:414 +#, c-format +msgid "" +" SHOW_ALL_RESULTS\n" +" show all results of a combined query (\\;) instead of only the last\n" +msgstr "" +" SHOW_ALL_RESULTS\n" +" visa alla resultat från en kombinerad fråga (\\;) istället för bara\n" +" det sista\n" + +#: help.c:416 #, c-format msgid "" " SHOW_CONTEXT\n" @@ -3517,7 +3621,7 @@ msgstr "" " SHOW_CONTEXT\n" " styr visning av meddelandekontextfält [never, errors, always]\n" -#: help.c:415 +#: help.c:418 #, c-format msgid "" " SINGLELINE\n" @@ -3526,7 +3630,7 @@ msgstr "" " SINGLELINE\n" " om satt, slut på raden avslutar SQL-kommandon (samma som flaggan -S )\n" -#: help.c:417 +#: help.c:420 #, c-format msgid "" " SINGLESTEP\n" @@ -3535,7 +3639,7 @@ msgstr "" " SINGLESTEP\n" " stegningsläge (samma som flaggan -s)\n" -#: help.c:419 +#: help.c:422 #, c-format msgid "" " SQLSTATE\n" @@ -3544,7 +3648,7 @@ msgstr "" " SQLSTATE\n" " SQLSTATE för sista frågan eller \"00000\" om det inte varit fel\n" -#: help.c:421 +#: help.c:424 #, c-format msgid "" " USER\n" @@ -3553,7 +3657,7 @@ msgstr "" " USER\n" " den uppkopplade databasanvändaren\n" -#: help.c:423 +#: help.c:426 #, c-format msgid "" " VERBOSITY\n" @@ -3562,7 +3666,7 @@ msgstr "" " VERBOSITY\n" " styr verbositet för felrapporter [default, verbose, terse, sqlstate]\n" -#: help.c:425 +#: help.c:428 #, c-format msgid "" " VERSION\n" @@ -3575,7 +3679,7 @@ msgstr "" " VERSION_NUM\n" " psql:s version (i lång sträng, kort sträng eller numeriskt format)\n" -#: help.c:430 +#: help.c:433 #, c-format msgid "" "\n" @@ -3584,7 +3688,7 @@ msgstr "" "\n" "Visningsinställningar:\n" -#: help.c:432 +#: help.c:435 #, c-format msgid "" " psql --pset=NAME[=VALUE]\n" @@ -3595,7 +3699,7 @@ msgstr "" " eller \\pset NAMN [VÄRDE] inne i psql\n" "\n" -#: help.c:434 +#: help.c:437 #, c-format msgid "" " border\n" @@ -3604,7 +3708,7 @@ msgstr "" " border\n" " ramstil (nummer)\n" -#: help.c:436 +#: help.c:439 #, c-format msgid "" " columns\n" @@ -3613,7 +3717,7 @@ msgstr "" " columns\n" " målvidd för wrappade format\n" -#: help.c:438 +#: help.c:441 #, c-format msgid "" " expanded (or x)\n" @@ -3622,7 +3726,7 @@ msgstr "" " expanded (eller x)\n" " expanderad utdata [on, off, auto]\n" -#: help.c:440 +#: help.c:443 #, c-format msgid "" " fieldsep\n" @@ -3631,7 +3735,7 @@ msgstr "" " fieldsep\n" " fältseparator för ej justerad utdata (standard \"%s\")\n" -#: help.c:443 +#: help.c:446 #, c-format msgid "" " fieldsep_zero\n" @@ -3640,7 +3744,7 @@ msgstr "" " fieldsep_zero\n" " sätt fältseparator för ej justerad utdata till noll-byte\n" -#: help.c:445 +#: help.c:448 #, c-format msgid "" " footer\n" @@ -3649,7 +3753,7 @@ msgstr "" " footer\n" " slå på/av visning av tabellfot [on, off]\n" -#: help.c:447 +#: help.c:450 #, c-format msgid "" " format\n" @@ -3658,7 +3762,7 @@ msgstr "" " format\n" " sätt utdataformat [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:449 +#: help.c:452 #, c-format msgid "" " linestyle\n" @@ -3667,7 +3771,7 @@ msgstr "" " linestyle\n" " sätt ramlinjestil [ascii, old-ascii, unicode]\n" -#: help.c:451 +#: help.c:454 #, c-format msgid "" " null\n" @@ -3676,7 +3780,7 @@ msgstr "" " null\n" " sätt sträng som visas istället för null-värden\n" -#: help.c:453 +#: help.c:456 #, c-format msgid "" " numericlocale\n" @@ -3685,7 +3789,7 @@ msgstr "" " numericlocale\n" " slå på visning av lokalspecifika tecken för gruppering av siffror\n" -#: help.c:455 +#: help.c:458 #, c-format msgid "" " pager\n" @@ -3694,7 +3798,7 @@ msgstr "" " pager\n" " styr när en extern pagenerare används [yes, no, always]\n" -#: help.c:457 +#: help.c:460 #, c-format msgid "" " recordsep\n" @@ -3703,7 +3807,7 @@ msgstr "" " recordsep\n" " post (rad) separator för ej justerad utdata\n" -#: help.c:459 +#: help.c:462 #, c-format msgid "" " recordsep_zero\n" @@ -3712,7 +3816,7 @@ msgstr "" " recordsep_zero\n" " sätt postseparator för ej justerad utdata till noll-byte\n" -#: help.c:461 +#: help.c:464 #, c-format msgid "" " tableattr (or T)\n" @@ -3723,7 +3827,7 @@ msgstr "" " ange attribut för tabelltaggen i html-format eller proportionella\n" " kolumnvidder för vänsterjusterade datatypet i latex-longtable-format\n" -#: help.c:464 +#: help.c:467 #, c-format msgid "" " title\n" @@ -3732,7 +3836,7 @@ msgstr "" " title\n" " sätt tabelltitel för efterkommande tabellutskrifter\n" -#: help.c:466 +#: help.c:469 #, c-format msgid "" " tuples_only\n" @@ -3741,7 +3845,7 @@ msgstr "" " tuples_only\n" " om satt, bara tabelldatan visas\n" -#: help.c:468 +#: help.c:471 #, c-format msgid "" " unicode_border_linestyle\n" @@ -3754,7 +3858,7 @@ msgstr "" " unicode_header_linestyle\n" " sätter stilen på Unicode-linjer [single, double]\n" -#: help.c:473 +#: help.c:476 #, c-format msgid "" "\n" @@ -3763,7 +3867,7 @@ msgstr "" "\n" "Omgivningsvariabler:\n" -#: help.c:477 +#: help.c:480 #, c-format msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" @@ -3774,7 +3878,7 @@ msgstr "" " eller \\setenv NAMN [VÄRDE] inne psql\n" "\n" -#: help.c:479 +#: help.c:482 #, c-format msgid "" " set NAME=VALUE\n" @@ -3787,7 +3891,7 @@ msgstr "" " eller \\setenv NAMN [VÄRDE] inne i psql\n" "\n" -#: help.c:482 +#: help.c:485 #, c-format msgid "" " COLUMNS\n" @@ -3796,7 +3900,7 @@ msgstr "" " COLUMNS\n" " antal kolumner i wrappade format\n" -#: help.c:484 +#: help.c:487 #, c-format msgid "" " PGAPPNAME\n" @@ -3805,7 +3909,7 @@ msgstr "" " PGAPPNAME\n" " samma som anslutningsparametern \"application_name\"\n" -#: help.c:486 +#: help.c:489 #, c-format msgid "" " PGDATABASE\n" @@ -3814,7 +3918,7 @@ msgstr "" " PGDATABASE\n" " samma som anslutningsparametern \"dbname\"\n" -#: help.c:488 +#: help.c:491 #, c-format msgid "" " PGHOST\n" @@ -3823,16 +3927,7 @@ msgstr "" " PGHOST\n" " samma som anslutningsparametern \"host\"\n" -#: help.c:490 -#, c-format -msgid "" -" PGPASSWORD\n" -" connection password (not recommended)\n" -msgstr "" -" PGPASSWORD\n" -" uppkoppingens lösenord (rekommenderas inte)\n" - -#: help.c:492 +#: help.c:493 #, c-format msgid "" " PGPASSFILE\n" @@ -3841,7 +3936,16 @@ msgstr "" " PGPASSFILE\n" " lösenordsfilnamn\n" -#: help.c:494 +#: help.c:495 +#, c-format +msgid "" +" PGPASSWORD\n" +" connection password (not recommended)\n" +msgstr "" +" PGPASSWORD\n" +" uppkoppingens lösenord (rekommenderas inte)\n" + +#: help.c:497 #, c-format msgid "" " PGPORT\n" @@ -3850,7 +3954,7 @@ msgstr "" " PGPORT\n" " samma som anslutingsparametern \"port\"\n" -#: help.c:496 +#: help.c:499 #, c-format msgid "" " PGUSER\n" @@ -3859,7 +3963,7 @@ msgstr "" " PGUSER\n" " samma som anslutningsparametern \"user\"\n" -#: help.c:498 +#: help.c:501 #, c-format msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" @@ -3868,7 +3972,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " redigerare som används av kommanona \\e, \\ef och \\ev\n" -#: help.c:500 +#: help.c:503 #, c-format msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" @@ -3877,7 +3981,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " hur radnummer anges när redigerare startas\n" -#: help.c:502 +#: help.c:505 #, c-format msgid "" " PSQL_HISTORY\n" @@ -3886,7 +3990,7 @@ msgstr "" " PSQL_HISTORY\n" " alternativ plats för kommandohistorikfilen\n" -#: help.c:504 +#: help.c:507 #, c-format msgid "" " PSQL_PAGER, PAGER\n" @@ -3895,7 +3999,16 @@ msgstr "" " PAGER\n" " namnet på den externa pageneraren\n" -#: help.c:506 +#: help.c:510 +#, c-format +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_WATCH_PAGER\n" +" namn på externt paginerarprogram för \\watch\n" + +#: help.c:513 #, c-format msgid "" " PSQLRC\n" @@ -3904,7 +4017,7 @@ msgstr "" " PSQLRC\n" " alternativ plats för användarens \".psqlrc\"-fil\n" -#: help.c:508 +#: help.c:515 #, c-format msgid "" " SHELL\n" @@ -3913,7 +4026,7 @@ msgstr "" " SHELL\n" " skalet som används av kommandot \\!\n" -#: help.c:510 +#: help.c:517 #, c-format msgid "" " TMPDIR\n" @@ -3922,11 +4035,11 @@ msgstr "" " TMPDIR\n" " katalog för temporärfiler\n" -#: help.c:554 +#: help.c:562 msgid "Available help:\n" msgstr "Tillgänglig hjälp:\n" -#: help.c:642 +#: help.c:657 #, c-format msgid "" "Command: %s\n" @@ -3945,7 +4058,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:661 +#: help.c:680 #, c-format msgid "" "No help available for \"%s\".\n" @@ -3959,12 +4072,12 @@ msgstr "" msgid "could not read from input file: %m" msgstr "kunde inte läsa från infilen: %m" -#: input.c:471 input.c:509 +#: input.c:478 input.c:516 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "kunde inte skriva kommandohistorien till \"%s\": %m" -#: input.c:528 +#: input.c:535 #, c-format msgid "history is not supported by this installation" msgstr "historia stöds inte av denna installationen" @@ -3984,25 +4097,17 @@ msgstr "%s: aktuell transaktion är avbruten" msgid "%s: unknown transaction status" msgstr "%s: okänd transaktionsstatus" -#: large_obj.c:288 large_obj.c:299 -msgid "ID" -msgstr "ID" - -#: large_obj.c:309 -msgid "Large objects" -msgstr "Stora objekt" - -#: mainloop.c:136 +#: mainloop.c:133 #, c-format msgid "\\if: escaped" msgstr "\\if: escape:ad" -#: mainloop.c:195 +#: mainloop.c:192 #, c-format msgid "Use \"\\q\" to leave %s.\n" msgstr "Använd \"\\q\" för att lämna %s.\n" -#: mainloop.c:217 +#: mainloop.c:214 msgid "" "The input is a PostgreSQL custom-format dump.\n" "Use the pg_restore command-line client to restore this dump to a database.\n" @@ -4010,19 +4115,19 @@ msgstr "" "Indatan är en PostgreSQL-specifik dump.\n" "Använd kommandoradsprogrammet pg_restore för att läsa in denna dump till databasen.\n" -#: mainloop.c:298 +#: mainloop.c:295 msgid "Use \\? for help or press control-C to clear the input buffer." msgstr "Använd \\? för hjälp eller tryck control-C för att nollställa inmatningsbufferten." -#: mainloop.c:300 +#: mainloop.c:297 msgid "Use \\? for help." msgstr "Använd \\? för hjälp." -#: mainloop.c:304 +#: mainloop.c:301 msgid "You are using psql, the command-line interface to PostgreSQL." msgstr "Du använder psql, den interaktiva PostgreSQL-terminalen." -#: mainloop.c:305 +#: mainloop.c:302 #, c-format msgid "" "Type: \\copyright for distribution terms\n" @@ -4037,24 +4142,24 @@ msgstr "" " \\g eller avsluta med semikolon för att köra en fråga\n" " \\q för att avsluta\n" -#: mainloop.c:329 +#: mainloop.c:326 msgid "Use \\q to quit." msgstr "Använd \\q för att avsluta." -#: mainloop.c:332 mainloop.c:356 +#: mainloop.c:329 mainloop.c:353 msgid "Use control-D to quit." msgstr "Använd control-D för att avsluta." -#: mainloop.c:334 mainloop.c:358 +#: mainloop.c:331 mainloop.c:355 msgid "Use control-C to quit." msgstr "Använd control-C för att avsluta." -#: mainloop.c:465 mainloop.c:613 +#: mainloop.c:459 mainloop.c:618 #, c-format msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "fråga ignorerat; använd \\endif eller Ctrl-C för att avsluta aktuellt \\if-block" -#: mainloop.c:631 +#: mainloop.c:636 #, c-format msgid "reached EOF without finding closing \\endif(s)" msgstr "kom till EOF utan att hitta avslutande \\endif" @@ -4071,2261 +4176,2427 @@ msgstr "%s: slut på minne" #: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 #: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 -#: sql_help.c:111 sql_help.c:117 sql_help.c:119 sql_help.c:121 sql_help.c:123 -#: sql_help.c:126 sql_help.c:128 sql_help.c:130 sql_help.c:235 sql_help.c:237 -#: sql_help.c:238 sql_help.c:240 sql_help.c:242 sql_help.c:245 sql_help.c:247 -#: sql_help.c:249 sql_help.c:251 sql_help.c:263 sql_help.c:264 sql_help.c:265 -#: sql_help.c:267 sql_help.c:316 sql_help.c:318 sql_help.c:320 sql_help.c:322 -#: sql_help.c:391 sql_help.c:396 sql_help.c:398 sql_help.c:440 sql_help.c:442 -#: sql_help.c:445 sql_help.c:447 sql_help.c:515 sql_help.c:520 sql_help.c:525 -#: sql_help.c:530 sql_help.c:535 sql_help.c:588 sql_help.c:590 sql_help.c:592 -#: sql_help.c:594 sql_help.c:596 sql_help.c:599 sql_help.c:601 sql_help.c:604 -#: sql_help.c:615 sql_help.c:617 sql_help.c:658 sql_help.c:660 sql_help.c:662 -#: sql_help.c:665 sql_help.c:667 sql_help.c:669 sql_help.c:702 sql_help.c:706 -#: sql_help.c:710 sql_help.c:729 sql_help.c:732 sql_help.c:735 sql_help.c:764 -#: sql_help.c:776 sql_help.c:784 sql_help.c:787 sql_help.c:790 sql_help.c:805 -#: sql_help.c:808 sql_help.c:837 sql_help.c:842 sql_help.c:847 sql_help.c:852 -#: sql_help.c:857 sql_help.c:879 sql_help.c:881 sql_help.c:883 sql_help.c:885 -#: sql_help.c:888 sql_help.c:890 sql_help.c:931 sql_help.c:975 sql_help.c:980 -#: sql_help.c:985 sql_help.c:990 sql_help.c:995 sql_help.c:1014 sql_help.c:1025 -#: sql_help.c:1027 sql_help.c:1046 sql_help.c:1056 sql_help.c:1058 -#: sql_help.c:1060 sql_help.c:1072 sql_help.c:1076 sql_help.c:1078 -#: sql_help.c:1090 sql_help.c:1092 sql_help.c:1094 sql_help.c:1096 -#: sql_help.c:1112 sql_help.c:1114 sql_help.c:1118 sql_help.c:1121 -#: sql_help.c:1122 sql_help.c:1123 sql_help.c:1126 sql_help.c:1128 -#: sql_help.c:1262 sql_help.c:1264 sql_help.c:1267 sql_help.c:1270 -#: sql_help.c:1272 sql_help.c:1274 sql_help.c:1277 sql_help.c:1280 -#: sql_help.c:1391 sql_help.c:1393 sql_help.c:1395 sql_help.c:1398 -#: sql_help.c:1419 sql_help.c:1422 sql_help.c:1425 sql_help.c:1428 -#: sql_help.c:1432 sql_help.c:1434 sql_help.c:1436 sql_help.c:1438 -#: sql_help.c:1452 sql_help.c:1455 sql_help.c:1457 sql_help.c:1459 -#: sql_help.c:1469 sql_help.c:1471 sql_help.c:1481 sql_help.c:1483 -#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1519 sql_help.c:1521 -#: sql_help.c:1523 sql_help.c:1525 sql_help.c:1528 sql_help.c:1530 -#: sql_help.c:1533 sql_help.c:1536 sql_help.c:1586 sql_help.c:1629 -#: sql_help.c:1632 sql_help.c:1634 sql_help.c:1636 sql_help.c:1639 -#: sql_help.c:1641 sql_help.c:1643 sql_help.c:1646 sql_help.c:1696 -#: sql_help.c:1712 sql_help.c:1933 sql_help.c:2002 sql_help.c:2021 -#: sql_help.c:2034 sql_help.c:2091 sql_help.c:2098 sql_help.c:2108 -#: sql_help.c:2129 sql_help.c:2155 sql_help.c:2173 sql_help.c:2200 -#: sql_help.c:2295 sql_help.c:2340 sql_help.c:2364 sql_help.c:2387 -#: sql_help.c:2391 sql_help.c:2425 sql_help.c:2445 sql_help.c:2467 -#: sql_help.c:2481 sql_help.c:2501 sql_help.c:2524 sql_help.c:2554 -#: sql_help.c:2579 sql_help.c:2625 sql_help.c:2903 sql_help.c:2916 -#: sql_help.c:2933 sql_help.c:2949 sql_help.c:2989 sql_help.c:3041 -#: sql_help.c:3045 sql_help.c:3047 sql_help.c:3053 sql_help.c:3071 -#: sql_help.c:3098 sql_help.c:3133 sql_help.c:3145 sql_help.c:3154 -#: sql_help.c:3198 sql_help.c:3212 sql_help.c:3240 sql_help.c:3248 -#: sql_help.c:3260 sql_help.c:3270 sql_help.c:3278 sql_help.c:3286 -#: sql_help.c:3294 sql_help.c:3302 sql_help.c:3311 sql_help.c:3322 -#: sql_help.c:3330 sql_help.c:3338 sql_help.c:3346 sql_help.c:3354 -#: sql_help.c:3364 sql_help.c:3373 sql_help.c:3382 sql_help.c:3390 -#: sql_help.c:3400 sql_help.c:3411 sql_help.c:3419 sql_help.c:3428 -#: sql_help.c:3439 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 -#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3488 sql_help.c:3496 -#: sql_help.c:3504 sql_help.c:3512 sql_help.c:3520 sql_help.c:3528 -#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3562 sql_help.c:3579 -#: sql_help.c:3594 sql_help.c:3869 sql_help.c:3920 sql_help.c:3949 -#: sql_help.c:3962 sql_help.c:4407 sql_help.c:4455 sql_help.c:4596 +#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238 +#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248 +#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267 +#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323 +#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443 +#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524 +#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595 +#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606 +#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668 +#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714 +#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747 +#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802 +#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859 +#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900 +#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999 +#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019 +#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071 +#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086 +#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116 +#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141 +#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155 +#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163 +#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310 +#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320 +#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445 +#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474 +#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486 +#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507 +#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523 +#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548 +#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577 +#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588 +#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687 +#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696 +#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1997 +#: sql_help.c:2066 sql_help.c:2085 sql_help.c:2098 sql_help.c:2155 +#: sql_help.c:2162 sql_help.c:2172 sql_help.c:2198 sql_help.c:2229 +#: sql_help.c:2247 sql_help.c:2275 sql_help.c:2372 sql_help.c:2418 +#: sql_help.c:2443 sql_help.c:2466 sql_help.c:2470 sql_help.c:2504 +#: sql_help.c:2524 sql_help.c:2546 sql_help.c:2560 sql_help.c:2581 +#: sql_help.c:2610 sql_help.c:2645 sql_help.c:2670 sql_help.c:2717 +#: sql_help.c:3012 sql_help.c:3025 sql_help.c:3042 sql_help.c:3058 +#: sql_help.c:3098 sql_help.c:3152 sql_help.c:3156 sql_help.c:3158 +#: sql_help.c:3165 sql_help.c:3184 sql_help.c:3211 sql_help.c:3246 +#: sql_help.c:3258 sql_help.c:3267 sql_help.c:3311 sql_help.c:3325 +#: sql_help.c:3353 sql_help.c:3361 sql_help.c:3373 sql_help.c:3383 +#: sql_help.c:3391 sql_help.c:3399 sql_help.c:3407 sql_help.c:3415 +#: sql_help.c:3424 sql_help.c:3435 sql_help.c:3443 sql_help.c:3451 +#: sql_help.c:3459 sql_help.c:3467 sql_help.c:3477 sql_help.c:3486 +#: sql_help.c:3495 sql_help.c:3503 sql_help.c:3513 sql_help.c:3524 +#: sql_help.c:3532 sql_help.c:3541 sql_help.c:3552 sql_help.c:3561 +#: sql_help.c:3569 sql_help.c:3577 sql_help.c:3585 sql_help.c:3593 +#: sql_help.c:3601 sql_help.c:3609 sql_help.c:3617 sql_help.c:3625 +#: sql_help.c:3633 sql_help.c:3641 sql_help.c:3658 sql_help.c:3667 +#: sql_help.c:3675 sql_help.c:3692 sql_help.c:3707 sql_help.c:4017 +#: sql_help.c:4127 sql_help.c:4156 sql_help.c:4171 sql_help.c:4666 +#: sql_help.c:4714 sql_help.c:4865 msgid "name" msgstr "namn" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1783 -#: sql_help.c:3213 sql_help.c:4193 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 +#: sql_help.c:3326 sql_help.c:4442 msgid "aggregate_signature" msgstr "aggregatsignatur" -#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:250 -#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:524 sql_help.c:571 -#: sql_help.c:589 sql_help.c:616 sql_help.c:666 sql_help.c:731 sql_help.c:786 -#: sql_help.c:807 sql_help.c:846 sql_help.c:891 sql_help.c:932 sql_help.c:984 -#: sql_help.c:1016 sql_help.c:1026 sql_help.c:1059 sql_help.c:1079 -#: sql_help.c:1093 sql_help.c:1129 sql_help.c:1271 sql_help.c:1392 -#: sql_help.c:1435 sql_help.c:1456 sql_help.c:1470 sql_help.c:1482 -#: sql_help.c:1495 sql_help.c:1522 sql_help.c:1587 sql_help.c:1640 +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253 +#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576 +#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798 +#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008 +#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105 +#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444 +#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534 +#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693 msgid "new_name" msgstr "nytt_namn" -#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:120 sql_help.c:248 -#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:529 sql_help.c:618 -#: sql_help.c:627 sql_help.c:685 sql_help.c:705 sql_help.c:734 sql_help.c:789 -#: sql_help.c:851 sql_help.c:889 sql_help.c:989 sql_help.c:1028 sql_help.c:1057 -#: sql_help.c:1077 sql_help.c:1091 sql_help.c:1127 sql_help.c:1332 -#: sql_help.c:1394 sql_help.c:1437 sql_help.c:1458 sql_help.c:1520 -#: sql_help.c:1635 sql_help.c:2889 +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251 +#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623 +#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801 +#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052 +#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167 +#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510 +#: sql_help.c:1572 sql_help.c:1688 sql_help.c:2998 msgid "new_owner" msgstr "ny_ägare" -#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319 -#: sql_help.c:448 sql_help.c:534 sql_help.c:668 sql_help.c:709 sql_help.c:737 -#: sql_help.c:792 sql_help.c:856 sql_help.c:994 sql_help.c:1061 sql_help.c:1095 -#: sql_help.c:1273 sql_help.c:1439 sql_help.c:1460 sql_help.c:1472 -#: sql_help.c:1484 sql_help.c:1524 sql_help.c:1642 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322 +#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749 +#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087 +#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512 +#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695 msgid "new_schema" msgstr "nytt_schema" -#: sql_help.c:44 sql_help.c:1847 sql_help.c:3214 sql_help.c:4222 +#: sql_help.c:44 sql_help.c:1910 sql_help.c:3327 sql_help.c:4471 msgid "where aggregate_signature is:" msgstr "där aggregatsignatur är:" -#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:337 sql_help.c:350 -#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:516 -#: sql_help.c:521 sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:838 -#: sql_help.c:843 sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:976 -#: sql_help.c:981 sql_help.c:986 sql_help.c:991 sql_help.c:996 sql_help.c:1801 -#: sql_help.c:1818 sql_help.c:1824 sql_help.c:1848 sql_help.c:1851 -#: sql_help.c:1854 sql_help.c:2003 sql_help.c:2022 sql_help.c:2025 -#: sql_help.c:2296 sql_help.c:2502 sql_help.c:3215 sql_help.c:3218 -#: sql_help.c:3221 sql_help.c:3312 sql_help.c:3401 sql_help.c:3429 -#: sql_help.c:3753 sql_help.c:4101 sql_help.c:4199 sql_help.c:4206 -#: sql_help.c:4212 sql_help.c:4223 sql_help.c:4226 sql_help.c:4229 +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353 +#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520 +#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850 +#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000 +#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020 +#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911 +#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2067 sql_help.c:2086 +#: sql_help.c:2089 sql_help.c:2373 sql_help.c:2582 sql_help.c:3328 +#: sql_help.c:3331 sql_help.c:3334 sql_help.c:3425 sql_help.c:3514 +#: sql_help.c:3542 sql_help.c:3892 sql_help.c:4341 sql_help.c:4448 +#: sql_help.c:4455 sql_help.c:4461 sql_help.c:4472 sql_help.c:4475 +#: sql_help.c:4478 msgid "argmode" msgstr "arg_läge" -#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:338 sql_help.c:351 -#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:839 -#: sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:977 -#: sql_help.c:982 sql_help.c:987 sql_help.c:992 sql_help.c:997 sql_help.c:1802 -#: sql_help.c:1819 sql_help.c:1825 sql_help.c:1849 sql_help.c:1852 -#: sql_help.c:1855 sql_help.c:2004 sql_help.c:2023 sql_help.c:2026 -#: sql_help.c:2297 sql_help.c:2503 sql_help.c:3216 sql_help.c:3219 -#: sql_help.c:3222 sql_help.c:3313 sql_help.c:3402 sql_help.c:3430 -#: sql_help.c:4200 sql_help.c:4207 sql_help.c:4213 sql_help.c:4224 -#: sql_help.c:4227 sql_help.c:4230 +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354 +#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521 +#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 +#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001 +#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 +#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912 +#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2068 sql_help.c:2087 +#: sql_help.c:2090 sql_help.c:2374 sql_help.c:2583 sql_help.c:3329 +#: sql_help.c:3332 sql_help.c:3335 sql_help.c:3426 sql_help.c:3515 +#: sql_help.c:3543 sql_help.c:4449 sql_help.c:4456 sql_help.c:4462 +#: sql_help.c:4473 sql_help.c:4476 sql_help.c:4479 msgid "argname" msgstr "arg_namn" -#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:339 sql_help.c:352 -#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:840 -#: sql_help.c:845 sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:978 -#: sql_help.c:983 sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1803 -#: sql_help.c:1820 sql_help.c:1826 sql_help.c:1850 sql_help.c:1853 -#: sql_help.c:1856 sql_help.c:2298 sql_help.c:2504 sql_help.c:3217 -#: sql_help.c:3220 sql_help.c:3223 sql_help.c:3314 sql_help.c:3403 -#: sql_help.c:3431 sql_help.c:4201 sql_help.c:4208 sql_help.c:4214 -#: sql_help.c:4225 sql_help.c:4228 sql_help.c:4231 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355 +#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522 +#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 +#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002 +#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 +#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 +#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2375 sql_help.c:2584 +#: sql_help.c:3330 sql_help.c:3333 sql_help.c:3336 sql_help.c:3427 +#: sql_help.c:3516 sql_help.c:3544 sql_help.c:4450 sql_help.c:4457 +#: sql_help.c:4463 sql_help.c:4474 sql_help.c:4477 sql_help.c:4480 msgid "argtype" msgstr "arg_typ" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:926 -#: sql_help.c:1074 sql_help.c:1453 sql_help.c:1581 sql_help.c:1613 -#: sql_help.c:1665 sql_help.c:1904 sql_help.c:1911 sql_help.c:2203 -#: sql_help.c:2245 sql_help.c:2252 sql_help.c:2261 sql_help.c:2341 -#: sql_help.c:2555 sql_help.c:2647 sql_help.c:2918 sql_help.c:3099 -#: sql_help.c:3121 sql_help.c:3261 sql_help.c:3616 sql_help.c:3788 -#: sql_help.c:3961 sql_help.c:4658 +#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949 +#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666 +#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974 +#: sql_help.c:2278 sql_help.c:2320 sql_help.c:2327 sql_help.c:2336 +#: sql_help.c:2419 sql_help.c:2646 sql_help.c:2739 sql_help.c:3027 +#: sql_help.c:3212 sql_help.c:3234 sql_help.c:3374 sql_help.c:3729 +#: sql_help.c:3936 sql_help.c:4170 sql_help.c:4928 msgid "option" msgstr "flaggor" -#: sql_help.c:113 sql_help.c:927 sql_help.c:1582 sql_help.c:2342 -#: sql_help.c:2556 sql_help.c:3100 sql_help.c:3262 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2420 +#: sql_help.c:2647 sql_help.c:3213 sql_help.c:3375 msgid "where option can be:" msgstr "där flaggor kan vara:" -#: sql_help.c:114 sql_help.c:2137 +#: sql_help.c:116 sql_help.c:2210 msgid "allowconn" msgstr "tillåtansl" -#: sql_help.c:115 sql_help.c:928 sql_help.c:1583 sql_help.c:2138 -#: sql_help.c:2343 sql_help.c:2557 sql_help.c:3101 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2211 +#: sql_help.c:2421 sql_help.c:2648 sql_help.c:3214 msgid "connlimit" msgstr "anslutningstak" -#: sql_help.c:116 sql_help.c:2139 +#: sql_help.c:118 sql_help.c:2212 msgid "istemplate" msgstr "ärmall" -#: sql_help.c:122 sql_help.c:606 sql_help.c:671 sql_help.c:1276 sql_help.c:1325 +#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322 +#: sql_help.c:1374 sql_help.c:4174 msgid "new_tablespace" msgstr "nytt_tabellutrymme" -#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:544 sql_help.c:546 -#: sql_help.c:547 sql_help.c:863 sql_help.c:865 sql_help.c:866 sql_help.c:935 -#: sql_help.c:939 sql_help.c:942 sql_help.c:1003 sql_help.c:1005 -#: sql_help.c:1006 sql_help.c:1140 sql_help.c:1143 sql_help.c:1590 -#: sql_help.c:1594 sql_help.c:1597 sql_help.c:2308 sql_help.c:2508 -#: sql_help.c:3980 sql_help.c:4396 +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550 +#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958 +#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029 +#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643 +#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2385 sql_help.c:2588 +#: sql_help.c:3904 sql_help.c:4192 sql_help.c:4353 sql_help.c:4655 msgid "configuration_parameter" msgstr "konfigurationsparameter" -#: sql_help.c:125 sql_help.c:395 sql_help.c:466 sql_help.c:472 sql_help.c:484 -#: sql_help.c:545 sql_help.c:598 sql_help.c:677 sql_help.c:683 sql_help.c:864 -#: sql_help.c:887 sql_help.c:936 sql_help.c:1004 sql_help.c:1075 -#: sql_help.c:1117 sql_help.c:1120 sql_help.c:1125 sql_help.c:1141 -#: sql_help.c:1142 sql_help.c:1307 sql_help.c:1327 sql_help.c:1375 -#: sql_help.c:1397 sql_help.c:1454 sql_help.c:1538 sql_help.c:1591 -#: sql_help.c:1614 sql_help.c:2204 sql_help.c:2246 sql_help.c:2253 -#: sql_help.c:2262 sql_help.c:2309 sql_help.c:2310 sql_help.c:2372 -#: sql_help.c:2375 sql_help.c:2409 sql_help.c:2509 sql_help.c:2510 -#: sql_help.c:2527 sql_help.c:2648 sql_help.c:2678 sql_help.c:2783 -#: sql_help.c:2796 sql_help.c:2810 sql_help.c:2851 sql_help.c:2875 -#: sql_help.c:2892 sql_help.c:2919 sql_help.c:3122 sql_help.c:3789 -#: sql_help.c:4397 sql_help.c:4398 +#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487 +#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876 +#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101 +#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157 +#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182 +#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449 +#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667 +#: sql_help.c:2279 sql_help.c:2321 sql_help.c:2328 sql_help.c:2337 +#: sql_help.c:2386 sql_help.c:2387 sql_help.c:2451 sql_help.c:2454 +#: sql_help.c:2488 sql_help.c:2589 sql_help.c:2590 sql_help.c:2613 +#: sql_help.c:2740 sql_help.c:2779 sql_help.c:2889 sql_help.c:2902 +#: sql_help.c:2916 sql_help.c:2957 sql_help.c:2984 sql_help.c:3001 +#: sql_help.c:3028 sql_help.c:3235 sql_help.c:3937 sql_help.c:4656 +#: sql_help.c:4657 msgid "value" msgstr "värde" -#: sql_help.c:197 +#: sql_help.c:200 msgid "target_role" msgstr "målroll" -#: sql_help.c:198 sql_help.c:2188 sql_help.c:2603 sql_help.c:2608 -#: sql_help.c:3735 sql_help.c:3742 sql_help.c:3756 sql_help.c:3762 -#: sql_help.c:4083 sql_help.c:4090 sql_help.c:4104 sql_help.c:4110 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2263 sql_help.c:2618 +#: sql_help.c:2695 sql_help.c:2700 sql_help.c:3867 sql_help.c:3876 +#: sql_help.c:3895 sql_help.c:3907 sql_help.c:4316 sql_help.c:4325 +#: sql_help.c:4344 sql_help.c:4356 msgid "schema_name" msgstr "schemanamn" -#: sql_help.c:199 +#: sql_help.c:202 msgid "abbreviated_grant_or_revoke" msgstr "förkortad_grant_eller_revoke" -#: sql_help.c:200 +#: sql_help.c:203 msgid "where abbreviated_grant_or_revoke is one of:" msgstr "där förkortad_grant_eller_revok är en av:" -#: sql_help.c:201 sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205 -#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 -#: sql_help.c:569 sql_help.c:605 sql_help.c:670 sql_help.c:810 sql_help.c:946 -#: sql_help.c:1275 sql_help.c:1601 sql_help.c:2346 sql_help.c:2347 -#: sql_help.c:2348 sql_help.c:2349 sql_help.c:2350 sql_help.c:2483 -#: sql_help.c:2560 sql_help.c:2561 sql_help.c:2562 sql_help.c:2563 -#: sql_help.c:2564 sql_help.c:3104 sql_help.c:3105 sql_help.c:3106 -#: sql_help.c:3107 sql_help.c:3108 sql_help.c:3768 sql_help.c:3772 -#: sql_help.c:4116 sql_help.c:4120 sql_help.c:4417 +#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 +#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 +#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969 +#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2424 sql_help.c:2425 +#: sql_help.c:2426 sql_help.c:2427 sql_help.c:2428 sql_help.c:2562 +#: sql_help.c:2651 sql_help.c:2652 sql_help.c:2653 sql_help.c:2654 +#: sql_help.c:2655 sql_help.c:3217 sql_help.c:3218 sql_help.c:3219 +#: sql_help.c:3220 sql_help.c:3221 sql_help.c:3916 sql_help.c:3920 +#: sql_help.c:4365 sql_help.c:4369 sql_help.c:4676 msgid "role_name" msgstr "rollnamn" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1291 sql_help.c:1293 -#: sql_help.c:1342 sql_help.c:1354 sql_help.c:1379 sql_help.c:1631 -#: sql_help.c:2158 sql_help.c:2162 sql_help.c:2265 sql_help.c:2270 -#: sql_help.c:2368 sql_help.c:2778 sql_help.c:2791 sql_help.c:2805 -#: sql_help.c:2814 sql_help.c:2826 sql_help.c:2855 sql_help.c:3820 -#: sql_help.c:3835 sql_help.c:3837 sql_help.c:4282 sql_help.c:4283 -#: sql_help.c:4292 sql_help.c:4333 sql_help.c:4334 sql_help.c:4335 -#: sql_help.c:4336 sql_help.c:4337 sql_help.c:4338 sql_help.c:4371 -#: sql_help.c:4372 sql_help.c:4377 sql_help.c:4382 sql_help.c:4521 -#: sql_help.c:4522 sql_help.c:4531 sql_help.c:4572 sql_help.c:4573 -#: sql_help.c:4574 sql_help.c:4575 sql_help.c:4576 sql_help.c:4577 -#: sql_help.c:4624 sql_help.c:4626 sql_help.c:4685 sql_help.c:4741 -#: sql_help.c:4742 sql_help.c:4751 sql_help.c:4792 sql_help.c:4793 -#: sql_help.c:4794 sql_help.c:4795 sql_help.c:4796 sql_help.c:4797 +#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339 +#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684 +#: sql_help.c:2232 sql_help.c:2236 sql_help.c:2340 sql_help.c:2345 +#: sql_help.c:2447 sql_help.c:2617 sql_help.c:2756 sql_help.c:2761 +#: sql_help.c:2763 sql_help.c:2884 sql_help.c:2897 sql_help.c:2911 +#: sql_help.c:2920 sql_help.c:2932 sql_help.c:2961 sql_help.c:3968 +#: sql_help.c:3983 sql_help.c:3985 sql_help.c:4072 sql_help.c:4075 +#: sql_help.c:4077 sql_help.c:4533 sql_help.c:4534 sql_help.c:4543 +#: sql_help.c:4585 sql_help.c:4586 sql_help.c:4587 sql_help.c:4588 +#: sql_help.c:4589 sql_help.c:4590 sql_help.c:4630 sql_help.c:4631 +#: sql_help.c:4636 sql_help.c:4641 sql_help.c:4782 sql_help.c:4783 +#: sql_help.c:4792 sql_help.c:4834 sql_help.c:4835 sql_help.c:4836 +#: sql_help.c:4837 sql_help.c:4838 sql_help.c:4839 sql_help.c:4893 +#: sql_help.c:4895 sql_help.c:4955 sql_help.c:5013 sql_help.c:5014 +#: sql_help.c:5023 sql_help.c:5065 sql_help.c:5066 sql_help.c:5067 +#: sql_help.c:5068 sql_help.c:5069 sql_help.c:5070 msgid "expression" msgstr "uttryck" -#: sql_help.c:239 +#: sql_help.c:242 msgid "domain_constraint" msgstr "domain_villkor" -#: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475 -#: sql_help.c:1268 sql_help.c:1313 sql_help.c:1314 sql_help.c:1315 -#: sql_help.c:1341 sql_help.c:1353 sql_help.c:1370 sql_help.c:1789 -#: sql_help.c:1791 sql_help.c:2161 sql_help.c:2264 sql_help.c:2269 -#: sql_help.c:2813 sql_help.c:2825 sql_help.c:3832 +#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 +#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363 +#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852 +#: sql_help.c:1854 sql_help.c:2235 sql_help.c:2339 sql_help.c:2344 +#: sql_help.c:2919 sql_help.c:2931 sql_help.c:3980 msgid "constraint_name" msgstr "villkorsnamn" -#: sql_help.c:244 sql_help.c:1269 +#: sql_help.c:247 sql_help.c:1315 msgid "new_constraint_name" msgstr "nyy_villkorsnamn" -#: sql_help.c:317 sql_help.c:1073 +#: sql_help.c:320 sql_help.c:1099 msgid "new_version" msgstr "ny_version" -#: sql_help.c:321 sql_help.c:323 +#: sql_help.c:324 sql_help.c:326 msgid "member_object" msgstr "medlemsobjekt" -#: sql_help.c:324 +#: sql_help.c:327 msgid "where member_object is:" msgstr "där medlemsobjekt är:" -#: sql_help.c:325 sql_help.c:330 sql_help.c:331 sql_help.c:332 sql_help.c:333 -#: sql_help.c:334 sql_help.c:335 sql_help.c:340 sql_help.c:344 sql_help.c:346 -#: sql_help.c:348 sql_help.c:357 sql_help.c:358 sql_help.c:359 sql_help.c:360 -#: sql_help.c:361 sql_help.c:362 sql_help.c:363 sql_help.c:364 sql_help.c:367 -#: sql_help.c:368 sql_help.c:1781 sql_help.c:1786 sql_help.c:1793 -#: sql_help.c:1794 sql_help.c:1795 sql_help.c:1796 sql_help.c:1797 -#: sql_help.c:1798 sql_help.c:1799 sql_help.c:1804 sql_help.c:1806 -#: sql_help.c:1810 sql_help.c:1812 sql_help.c:1816 sql_help.c:1821 -#: sql_help.c:1822 sql_help.c:1829 sql_help.c:1830 sql_help.c:1831 -#: sql_help.c:1832 sql_help.c:1833 sql_help.c:1834 sql_help.c:1835 -#: sql_help.c:1836 sql_help.c:1837 sql_help.c:1838 sql_help.c:1839 -#: sql_help.c:1844 sql_help.c:1845 sql_help.c:4189 sql_help.c:4194 -#: sql_help.c:4195 sql_help.c:4196 sql_help.c:4197 sql_help.c:4203 -#: sql_help.c:4204 sql_help.c:4209 sql_help.c:4210 sql_help.c:4215 -#: sql_help.c:4216 sql_help.c:4217 sql_help.c:4218 sql_help.c:4219 -#: sql_help.c:4220 +#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336 +#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349 +#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363 +#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370 +#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856 +#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 +#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869 +#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884 +#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894 +#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898 +#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902 +#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4438 sql_help.c:4443 +#: sql_help.c:4444 sql_help.c:4445 sql_help.c:4446 sql_help.c:4452 +#: sql_help.c:4453 sql_help.c:4458 sql_help.c:4459 sql_help.c:4464 +#: sql_help.c:4465 sql_help.c:4466 sql_help.c:4467 sql_help.c:4468 +#: sql_help.c:4469 msgid "object_name" msgstr "objektnamn" -#: sql_help.c:326 sql_help.c:1782 sql_help.c:4192 +#: sql_help.c:329 sql_help.c:1845 sql_help.c:4441 msgid "aggregate_name" msgstr "aggregatnamn" -#: sql_help.c:328 sql_help.c:1784 sql_help.c:2068 sql_help.c:2072 -#: sql_help.c:2074 sql_help.c:3231 +#: sql_help.c:331 sql_help.c:1847 sql_help.c:2132 sql_help.c:2136 +#: sql_help.c:2138 sql_help.c:3344 msgid "source_type" msgstr "källtyp" -#: sql_help.c:329 sql_help.c:1785 sql_help.c:2069 sql_help.c:2073 -#: sql_help.c:2075 sql_help.c:3232 +#: sql_help.c:332 sql_help.c:1848 sql_help.c:2133 sql_help.c:2137 +#: sql_help.c:2139 sql_help.c:3345 msgid "target_type" msgstr "måltyp" -#: sql_help.c:336 sql_help.c:774 sql_help.c:1800 sql_help.c:2070 -#: sql_help.c:2111 sql_help.c:2176 sql_help.c:2426 sql_help.c:2457 -#: sql_help.c:2995 sql_help.c:4100 sql_help.c:4198 sql_help.c:4311 -#: sql_help.c:4315 sql_help.c:4319 sql_help.c:4322 sql_help.c:4550 -#: sql_help.c:4554 sql_help.c:4558 sql_help.c:4561 sql_help.c:4770 -#: sql_help.c:4774 sql_help.c:4778 sql_help.c:4781 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2134 +#: sql_help.c:2175 sql_help.c:2251 sql_help.c:2505 sql_help.c:2536 +#: sql_help.c:3104 sql_help.c:4340 sql_help.c:4447 sql_help.c:4562 +#: sql_help.c:4566 sql_help.c:4570 sql_help.c:4573 sql_help.c:4811 +#: sql_help.c:4815 sql_help.c:4819 sql_help.c:4822 sql_help.c:5042 +#: sql_help.c:5046 sql_help.c:5050 sql_help.c:5053 msgid "function_name" msgstr "funktionsnamn" -#: sql_help.c:341 sql_help.c:767 sql_help.c:1807 sql_help.c:2450 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2529 msgid "operator_name" msgstr "operatornamn" -#: sql_help.c:342 sql_help.c:703 sql_help.c:707 sql_help.c:711 sql_help.c:1808 -#: sql_help.c:2427 sql_help.c:3355 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 +#: sql_help.c:2506 sql_help.c:3468 msgid "left_type" msgstr "vänster_typ" -#: sql_help.c:343 sql_help.c:704 sql_help.c:708 sql_help.c:712 sql_help.c:1809 -#: sql_help.c:2428 sql_help.c:3356 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 +#: sql_help.c:2507 sql_help.c:3469 msgid "right_type" msgstr "höger_typ" -#: sql_help.c:345 sql_help.c:347 sql_help.c:730 sql_help.c:733 sql_help.c:736 -#: sql_help.c:765 sql_help.c:777 sql_help.c:785 sql_help.c:788 sql_help.c:791 -#: sql_help.c:1359 sql_help.c:1811 sql_help.c:1813 sql_help.c:2447 -#: sql_help.c:2468 sql_help.c:2831 sql_help.c:3365 sql_help.c:3374 +#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748 +#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 +#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2526 +#: sql_help.c:2547 sql_help.c:2937 sql_help.c:3478 sql_help.c:3487 msgid "index_method" msgstr "indexmetod" -#: sql_help.c:349 sql_help.c:1817 sql_help.c:4205 +#: sql_help.c:352 sql_help.c:1880 sql_help.c:4454 msgid "procedure_name" msgstr "procedurnamn" -#: sql_help.c:353 sql_help.c:1823 sql_help.c:3752 sql_help.c:4211 +#: sql_help.c:356 sql_help.c:1886 sql_help.c:3891 sql_help.c:4460 msgid "routine_name" msgstr "rutinnamn" -#: sql_help.c:365 sql_help.c:1331 sql_help.c:1840 sql_help.c:2304 -#: sql_help.c:2507 sql_help.c:2786 sql_help.c:2962 sql_help.c:3536 -#: sql_help.c:3766 sql_help.c:4114 +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2381 +#: sql_help.c:2587 sql_help.c:2892 sql_help.c:3071 sql_help.c:3649 +#: sql_help.c:3913 sql_help.c:4362 msgid "type_name" msgstr "typnamn" -#: sql_help.c:366 sql_help.c:1841 sql_help.c:2303 sql_help.c:2506 -#: sql_help.c:2963 sql_help.c:3189 sql_help.c:3537 sql_help.c:3758 -#: sql_help.c:4106 +#: sql_help.c:369 sql_help.c:1904 sql_help.c:2380 sql_help.c:2586 +#: sql_help.c:3072 sql_help.c:3302 sql_help.c:3650 sql_help.c:3898 +#: sql_help.c:4347 msgid "lang_name" msgstr "språknamn" -#: sql_help.c:369 +#: sql_help.c:372 msgid "and aggregate_signature is:" msgstr "och aggregatsignatur är:" -#: sql_help.c:392 sql_help.c:1935 sql_help.c:2201 +#: sql_help.c:395 sql_help.c:1999 sql_help.c:2276 msgid "handler_function" msgstr "hanterarfunktion" -#: sql_help.c:393 sql_help.c:2202 +#: sql_help.c:396 sql_help.c:2277 msgid "validator_function" msgstr "valideringsfunktion" -#: sql_help.c:441 sql_help.c:519 sql_help.c:659 sql_help.c:841 sql_help.c:979 -#: sql_help.c:1263 sql_help.c:1529 +#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003 +#: sql_help.c:1309 sql_help.c:1581 msgid "action" msgstr "aktion" -#: sql_help.c:443 sql_help.c:450 sql_help.c:454 sql_help.c:455 sql_help.c:458 -#: sql_help.c:460 sql_help.c:461 sql_help.c:462 sql_help.c:464 sql_help.c:467 -#: sql_help.c:469 sql_help.c:470 sql_help.c:663 sql_help.c:673 sql_help.c:675 -#: sql_help.c:678 sql_help.c:680 sql_help.c:1055 sql_help.c:1265 -#: sql_help.c:1283 sql_help.c:1287 sql_help.c:1288 sql_help.c:1292 -#: sql_help.c:1294 sql_help.c:1295 sql_help.c:1296 sql_help.c:1297 -#: sql_help.c:1299 sql_help.c:1302 sql_help.c:1303 sql_help.c:1305 -#: sql_help.c:1308 sql_help.c:1310 sql_help.c:1355 sql_help.c:1357 -#: sql_help.c:1364 sql_help.c:1373 sql_help.c:1378 sql_help.c:1630 -#: sql_help.c:1633 sql_help.c:1637 sql_help.c:1673 sql_help.c:1788 -#: sql_help.c:1901 sql_help.c:1907 sql_help.c:1920 sql_help.c:1921 -#: sql_help.c:1922 sql_help.c:2243 sql_help.c:2256 sql_help.c:2301 -#: sql_help.c:2367 sql_help.c:2373 sql_help.c:2406 sql_help.c:2633 -#: sql_help.c:2661 sql_help.c:2662 sql_help.c:2769 sql_help.c:2777 -#: sql_help.c:2787 sql_help.c:2790 sql_help.c:2800 sql_help.c:2804 -#: sql_help.c:2827 sql_help.c:2829 sql_help.c:2836 sql_help.c:2849 -#: sql_help.c:2854 sql_help.c:2872 sql_help.c:2998 sql_help.c:3134 -#: sql_help.c:3737 sql_help.c:3738 sql_help.c:3819 sql_help.c:3834 -#: sql_help.c:3836 sql_help.c:3838 sql_help.c:4085 sql_help.c:4086 -#: sql_help.c:4191 sql_help.c:4342 sql_help.c:4581 sql_help.c:4623 -#: sql_help.c:4625 sql_help.c:4627 sql_help.c:4673 sql_help.c:4801 +#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461 +#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470 +#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683 +#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080 +#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334 +#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 +#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349 +#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 +#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422 +#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683 +#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851 +#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1984 sql_help.c:1985 +#: sql_help.c:1986 sql_help.c:2318 sql_help.c:2331 sql_help.c:2378 +#: sql_help.c:2446 sql_help.c:2452 sql_help.c:2485 sql_help.c:2616 +#: sql_help.c:2725 sql_help.c:2760 sql_help.c:2762 sql_help.c:2874 +#: sql_help.c:2883 sql_help.c:2893 sql_help.c:2896 sql_help.c:2906 +#: sql_help.c:2910 sql_help.c:2933 sql_help.c:2935 sql_help.c:2942 +#: sql_help.c:2955 sql_help.c:2960 sql_help.c:2964 sql_help.c:2965 +#: sql_help.c:2981 sql_help.c:3107 sql_help.c:3247 sql_help.c:3870 +#: sql_help.c:3871 sql_help.c:3967 sql_help.c:3982 sql_help.c:3984 +#: sql_help.c:3986 sql_help.c:4071 sql_help.c:4074 sql_help.c:4076 +#: sql_help.c:4319 sql_help.c:4320 sql_help.c:4440 sql_help.c:4594 +#: sql_help.c:4600 sql_help.c:4602 sql_help.c:4843 sql_help.c:4849 +#: sql_help.c:4851 sql_help.c:4892 sql_help.c:4894 sql_help.c:4896 +#: sql_help.c:4943 sql_help.c:5074 sql_help.c:5080 sql_help.c:5082 msgid "column_name" msgstr "kolumnnamn" -#: sql_help.c:444 sql_help.c:664 sql_help.c:1266 sql_help.c:1638 +#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 msgid "new_column_name" msgstr "nytt_kolumnnamn" -#: sql_help.c:449 sql_help.c:540 sql_help.c:672 sql_help.c:862 sql_help.c:1000 -#: sql_help.c:1282 sql_help.c:1539 +#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024 +#: sql_help.c:1328 sql_help.c:1591 msgid "where action is one of:" msgstr "där aktion är en av:" -#: sql_help.c:451 sql_help.c:456 sql_help.c:1047 sql_help.c:1284 -#: sql_help.c:1289 sql_help.c:1541 sql_help.c:1545 sql_help.c:2156 -#: sql_help.c:2244 sql_help.c:2446 sql_help.c:2626 sql_help.c:2770 -#: sql_help.c:3043 sql_help.c:3921 +#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330 +#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2230 +#: sql_help.c:2319 sql_help.c:2525 sql_help.c:2718 sql_help.c:2875 +#: sql_help.c:3154 sql_help.c:4128 msgid "data_type" msgstr "datatyp" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1285 sql_help.c:1290 -#: sql_help.c:1542 sql_help.c:1546 sql_help.c:2157 sql_help.c:2247 -#: sql_help.c:2369 sql_help.c:2771 sql_help.c:2779 sql_help.c:2792 -#: sql_help.c:2806 sql_help.c:3044 sql_help.c:3050 sql_help.c:3829 +#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336 +#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2231 sql_help.c:2322 +#: sql_help.c:2448 sql_help.c:2877 sql_help.c:2885 sql_help.c:2898 +#: sql_help.c:2912 sql_help.c:3155 sql_help.c:3161 sql_help.c:3977 msgid "collation" msgstr "jämförelse" -#: sql_help.c:453 sql_help.c:1286 sql_help.c:2248 sql_help.c:2257 -#: sql_help.c:2772 sql_help.c:2788 sql_help.c:2801 +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2323 sql_help.c:2332 +#: sql_help.c:2878 sql_help.c:2894 sql_help.c:2907 msgid "column_constraint" msgstr "kolumnvillkor" -#: sql_help.c:463 sql_help.c:603 sql_help.c:674 sql_help.c:1304 sql_help.c:4670 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4940 msgid "integer" msgstr "heltal" -#: sql_help.c:465 sql_help.c:468 sql_help.c:676 sql_help.c:679 sql_help.c:1306 -#: sql_help.c:1309 +#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352 +#: sql_help.c:1355 msgid "attribute_option" msgstr "attributalternativ" -#: sql_help.c:473 sql_help.c:1311 sql_help.c:2249 sql_help.c:2258 -#: sql_help.c:2773 sql_help.c:2789 sql_help.c:2802 +#: sql_help.c:476 sql_help.c:1359 sql_help.c:2324 sql_help.c:2333 +#: sql_help.c:2879 sql_help.c:2895 sql_help.c:2908 msgid "table_constraint" msgstr "tabellvillkor" -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1316 -#: sql_help.c:1317 sql_help.c:1318 sql_help.c:1319 sql_help.c:1842 +#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364 +#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905 msgid "trigger_name" msgstr "utlösarnamn" -#: sql_help.c:480 sql_help.c:481 sql_help.c:1329 sql_help.c:1330 -#: sql_help.c:2250 sql_help.c:2255 sql_help.c:2776 sql_help.c:2799 +#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 +#: sql_help.c:2325 sql_help.c:2330 sql_help.c:2882 sql_help.c:2905 msgid "parent_table" msgstr "föräldertabell" -#: sql_help.c:539 sql_help.c:595 sql_help.c:661 sql_help.c:861 sql_help.c:999 -#: sql_help.c:1498 sql_help.c:2187 +#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 +#: sql_help.c:1550 sql_help.c:2262 msgid "extension_name" msgstr "utökningsnamn" -#: sql_help.c:541 sql_help.c:1001 sql_help.c:2305 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2382 msgid "execution_cost" msgstr "körkostnad" -#: sql_help.c:542 sql_help.c:1002 sql_help.c:2306 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2383 msgid "result_rows" msgstr "resultatrader" -#: sql_help.c:543 sql_help.c:2307 +#: sql_help.c:547 sql_help.c:2384 msgid "support_function" msgstr "supportfunktion" -#: sql_help.c:564 sql_help.c:566 sql_help.c:925 sql_help.c:933 sql_help.c:937 -#: sql_help.c:940 sql_help.c:943 sql_help.c:1580 sql_help.c:1588 -#: sql_help.c:1592 sql_help.c:1595 sql_help.c:1598 sql_help.c:2604 -#: sql_help.c:2606 sql_help.c:2609 sql_help.c:2610 sql_help.c:3736 -#: sql_help.c:3740 sql_help.c:3743 sql_help.c:3745 sql_help.c:3747 -#: sql_help.c:3749 sql_help.c:3751 sql_help.c:3757 sql_help.c:3759 -#: sql_help.c:3761 sql_help.c:3763 sql_help.c:3765 sql_help.c:3767 -#: sql_help.c:3769 sql_help.c:3770 sql_help.c:4084 sql_help.c:4088 -#: sql_help.c:4091 sql_help.c:4093 sql_help.c:4095 sql_help.c:4097 -#: sql_help.c:4099 sql_help.c:4105 sql_help.c:4107 sql_help.c:4109 -#: sql_help.c:4111 sql_help.c:4113 sql_help.c:4115 sql_help.c:4117 -#: sql_help.c:4118 +#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960 +#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641 +#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2696 +#: sql_help.c:2698 sql_help.c:2701 sql_help.c:2702 sql_help.c:3868 +#: sql_help.c:3869 sql_help.c:3873 sql_help.c:3874 sql_help.c:3877 +#: sql_help.c:3878 sql_help.c:3880 sql_help.c:3881 sql_help.c:3883 +#: sql_help.c:3884 sql_help.c:3886 sql_help.c:3887 sql_help.c:3889 +#: sql_help.c:3890 sql_help.c:3896 sql_help.c:3897 sql_help.c:3899 +#: sql_help.c:3900 sql_help.c:3902 sql_help.c:3903 sql_help.c:3905 +#: sql_help.c:3906 sql_help.c:3908 sql_help.c:3909 sql_help.c:3911 +#: sql_help.c:3912 sql_help.c:3914 sql_help.c:3915 sql_help.c:3917 +#: sql_help.c:3918 sql_help.c:4317 sql_help.c:4318 sql_help.c:4322 +#: sql_help.c:4323 sql_help.c:4326 sql_help.c:4327 sql_help.c:4329 +#: sql_help.c:4330 sql_help.c:4332 sql_help.c:4333 sql_help.c:4335 +#: sql_help.c:4336 sql_help.c:4338 sql_help.c:4339 sql_help.c:4345 +#: sql_help.c:4346 sql_help.c:4348 sql_help.c:4349 sql_help.c:4351 +#: sql_help.c:4352 sql_help.c:4354 sql_help.c:4355 sql_help.c:4357 +#: sql_help.c:4358 sql_help.c:4360 sql_help.c:4361 sql_help.c:4363 +#: sql_help.c:4364 sql_help.c:4366 sql_help.c:4367 msgid "role_specification" msgstr "rollspecifikation" -#: sql_help.c:565 sql_help.c:567 sql_help.c:1611 sql_help.c:2130 -#: sql_help.c:2612 sql_help.c:3119 sql_help.c:3570 sql_help.c:4427 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2199 +#: sql_help.c:2704 sql_help.c:3232 sql_help.c:3683 sql_help.c:4686 msgid "user_name" msgstr "användarnamn" -#: sql_help.c:568 sql_help.c:945 sql_help.c:1600 sql_help.c:2611 -#: sql_help.c:3771 sql_help.c:4119 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2703 +#: sql_help.c:3919 sql_help.c:4368 msgid "where role_specification can be:" msgstr "där rollspecifikation kan vara:" -#: sql_help.c:570 +#: sql_help.c:575 msgid "group_name" msgstr "gruppnamn" -#: sql_help.c:591 sql_help.c:1376 sql_help.c:2136 sql_help.c:2376 -#: sql_help.c:2410 sql_help.c:2784 sql_help.c:2797 sql_help.c:2811 -#: sql_help.c:2852 sql_help.c:2876 sql_help.c:2888 sql_help.c:3764 -#: sql_help.c:4112 +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2209 sql_help.c:2455 +#: sql_help.c:2489 sql_help.c:2890 sql_help.c:2903 sql_help.c:2917 +#: sql_help.c:2958 sql_help.c:2985 sql_help.c:2997 sql_help.c:3910 +#: sql_help.c:4359 msgid "tablespace_name" msgstr "tabellutrymmesnamn" -#: sql_help.c:593 sql_help.c:681 sql_help.c:1324 sql_help.c:1333 -#: sql_help.c:1371 sql_help.c:1722 +#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382 +#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783 msgid "index_name" msgstr "indexnamn" -#: sql_help.c:597 sql_help.c:600 sql_help.c:682 sql_help.c:684 sql_help.c:1326 -#: sql_help.c:1328 sql_help.c:1374 sql_help.c:2374 sql_help.c:2408 -#: sql_help.c:2782 sql_help.c:2795 sql_help.c:2809 sql_help.c:2850 -#: sql_help.c:2874 +#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375 +#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2453 sql_help.c:2487 +#: sql_help.c:2888 sql_help.c:2901 sql_help.c:2915 sql_help.c:2956 +#: sql_help.c:2983 msgid "storage_parameter" msgstr "lagringsparameter" -#: sql_help.c:602 +#: sql_help.c:607 msgid "column_number" msgstr "kolumnnummer" -#: sql_help.c:626 sql_help.c:1805 sql_help.c:4202 +#: sql_help.c:631 sql_help.c:1868 sql_help.c:4451 msgid "large_object_oid" msgstr "stort_objekt_oid" -#: sql_help.c:713 sql_help.c:2431 +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2876 +msgid "compression_method" +msgstr "komprimeringsmetod" + +#: sql_help.c:692 sql_help.c:1373 +msgid "new_access_method" +msgstr "ny_accessmetod" + +#: sql_help.c:725 sql_help.c:2510 msgid "res_proc" msgstr "res_proc" -#: sql_help.c:714 sql_help.c:2432 +#: sql_help.c:726 sql_help.c:2511 msgid "join_proc" msgstr "join_proc" -#: sql_help.c:766 sql_help.c:778 sql_help.c:2449 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2528 msgid "strategy_number" msgstr "strateginummer" -#: sql_help.c:768 sql_help.c:769 sql_help.c:772 sql_help.c:773 sql_help.c:779 -#: sql_help.c:780 sql_help.c:782 sql_help.c:783 sql_help.c:2451 sql_help.c:2452 -#: sql_help.c:2455 sql_help.c:2456 +#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791 +#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2530 sql_help.c:2531 +#: sql_help.c:2534 sql_help.c:2535 msgid "op_type" msgstr "op_typ" -#: sql_help.c:770 sql_help.c:2453 +#: sql_help.c:782 sql_help.c:2532 msgid "sort_family_name" msgstr "sorteringsfamiljnamn" -#: sql_help.c:771 sql_help.c:781 sql_help.c:2454 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2533 msgid "support_number" msgstr "supportnummer" -#: sql_help.c:775 sql_help.c:2071 sql_help.c:2458 sql_help.c:2965 -#: sql_help.c:2967 +#: sql_help.c:787 sql_help.c:2135 sql_help.c:2537 sql_help.c:3074 +#: sql_help.c:3076 msgid "argument_type" msgstr "argumenttyp" -#: sql_help.c:806 sql_help.c:809 sql_help.c:880 sql_help.c:882 sql_help.c:884 -#: sql_help.c:1015 sql_help.c:1054 sql_help.c:1494 sql_help.c:1497 -#: sql_help.c:1672 sql_help.c:1721 sql_help.c:1790 sql_help.c:1815 -#: sql_help.c:1828 sql_help.c:1843 sql_help.c:1900 sql_help.c:1906 -#: sql_help.c:2242 sql_help.c:2254 sql_help.c:2365 sql_help.c:2405 -#: sql_help.c:2482 sql_help.c:2525 sql_help.c:2581 sql_help.c:2632 -#: sql_help.c:2663 sql_help.c:2768 sql_help.c:2785 sql_help.c:2798 -#: sql_help.c:2871 sql_help.c:2991 sql_help.c:3168 sql_help.c:3391 -#: sql_help.c:3440 sql_help.c:3546 sql_help.c:3734 sql_help.c:3739 -#: sql_help.c:3785 sql_help.c:3817 sql_help.c:4082 sql_help.c:4087 -#: sql_help.c:4190 sql_help.c:4297 sql_help.c:4299 sql_help.c:4348 -#: sql_help.c:4387 sql_help.c:4536 sql_help.c:4538 sql_help.c:4587 -#: sql_help.c:4621 sql_help.c:4672 sql_help.c:4756 sql_help.c:4758 -#: sql_help.c:4807 +#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079 +#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779 +#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891 +#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2317 +#: sql_help.c:2329 sql_help.c:2444 sql_help.c:2484 sql_help.c:2561 +#: sql_help.c:2615 sql_help.c:2672 sql_help.c:2724 sql_help.c:2757 +#: sql_help.c:2764 sql_help.c:2873 sql_help.c:2891 sql_help.c:2904 +#: sql_help.c:2980 sql_help.c:3100 sql_help.c:3281 sql_help.c:3504 +#: sql_help.c:3553 sql_help.c:3659 sql_help.c:3866 sql_help.c:3872 +#: sql_help.c:3933 sql_help.c:3965 sql_help.c:4315 sql_help.c:4321 +#: sql_help.c:4439 sql_help.c:4548 sql_help.c:4550 sql_help.c:4607 +#: sql_help.c:4646 sql_help.c:4797 sql_help.c:4799 sql_help.c:4856 +#: sql_help.c:4890 sql_help.c:4942 sql_help.c:5028 sql_help.c:5030 +#: sql_help.c:5087 msgid "table_name" msgstr "tabellnamn" -#: sql_help.c:811 sql_help.c:2484 +#: sql_help.c:823 sql_help.c:2563 msgid "using_expression" msgstr "using-uttryck" -#: sql_help.c:812 sql_help.c:2485 +#: sql_help.c:824 sql_help.c:2564 msgid "check_expression" msgstr "check-uttryck" -#: sql_help.c:886 sql_help.c:2526 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2611 +msgid "publication_object" +msgstr "publiceringsobject" + +#: sql_help.c:903 sql_help.c:2612 msgid "publication_parameter" msgstr "publiceringsparameter" -#: sql_help.c:929 sql_help.c:1584 sql_help.c:2344 sql_help.c:2558 -#: sql_help.c:3102 +#: sql_help.c:909 sql_help.c:2614 +msgid "where publication_object is one of:" +msgstr "där publiceringsobjekt är en av:" + +#: sql_help.c:952 sql_help.c:1637 sql_help.c:2422 sql_help.c:2649 +#: sql_help.c:3215 msgid "password" msgstr "lösenord" -#: sql_help.c:930 sql_help.c:1585 sql_help.c:2345 sql_help.c:2559 -#: sql_help.c:3103 +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2423 sql_help.c:2650 +#: sql_help.c:3216 msgid "timestamp" msgstr "tidsstämpel" -#: sql_help.c:934 sql_help.c:938 sql_help.c:941 sql_help.c:944 sql_help.c:1589 -#: sql_help.c:1593 sql_help.c:1596 sql_help.c:1599 sql_help.c:3744 -#: sql_help.c:4092 +#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642 +#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3879 +#: sql_help.c:4328 msgid "database_name" msgstr "databasnamn" -#: sql_help.c:1048 sql_help.c:2627 +#: sql_help.c:1073 sql_help.c:2719 msgid "increment" msgstr "ökningsvärde" -#: sql_help.c:1049 sql_help.c:2628 +#: sql_help.c:1074 sql_help.c:2720 msgid "minvalue" msgstr "minvärde" -#: sql_help.c:1050 sql_help.c:2629 +#: sql_help.c:1075 sql_help.c:2721 msgid "maxvalue" msgstr "maxvärde" -#: sql_help.c:1051 sql_help.c:2630 sql_help.c:4295 sql_help.c:4385 -#: sql_help.c:4534 sql_help.c:4689 sql_help.c:4754 +#: sql_help.c:1076 sql_help.c:2722 sql_help.c:4546 sql_help.c:4644 +#: sql_help.c:4795 sql_help.c:4959 sql_help.c:5026 msgid "start" msgstr "start" -#: sql_help.c:1052 sql_help.c:1301 +#: sql_help.c:1077 sql_help.c:1347 msgid "restart" msgstr "starta om" -#: sql_help.c:1053 sql_help.c:2631 +#: sql_help.c:1078 sql_help.c:2723 msgid "cache" msgstr "cache" -#: sql_help.c:1097 +#: sql_help.c:1123 msgid "new_target" msgstr "nytt_mål" -#: sql_help.c:1113 sql_help.c:2675 +#: sql_help.c:1142 sql_help.c:2776 msgid "conninfo" msgstr "anslinfo" -#: sql_help.c:1115 sql_help.c:2676 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2777 msgid "publication_name" msgstr "publiceringsnamn" -#: sql_help.c:1116 -msgid "set_publication_option" -msgstr "sätt_publicerings_alternativ" +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +msgid "publication_option" +msgstr "publicerings_alternativ" -#: sql_help.c:1119 +#: sql_help.c:1156 msgid "refresh_option" msgstr "refresh_alternativ" -#: sql_help.c:1124 sql_help.c:2677 +#: sql_help.c:1161 sql_help.c:2778 msgid "subscription_parameter" msgstr "prenumerationsparameter" -#: sql_help.c:1278 sql_help.c:1281 +#: sql_help.c:1164 +msgid "skip_option" +msgstr "skip_alternativ" + +#: sql_help.c:1324 sql_help.c:1327 msgid "partition_name" msgstr "partitionsnamn" -#: sql_help.c:1279 sql_help.c:2259 sql_help.c:2803 +#: sql_help.c:1325 sql_help.c:2334 sql_help.c:2909 msgid "partition_bound_spec" msgstr "partitionsgränsspec" -#: sql_help.c:1298 sql_help.c:1345 sql_help.c:2817 +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2923 msgid "sequence_options" msgstr "sekvensalternativ" -#: sql_help.c:1300 +#: sql_help.c:1346 msgid "sequence_option" msgstr "sekvensalternativ" -#: sql_help.c:1312 +#: sql_help.c:1360 msgid "table_constraint_using_index" msgstr "tabellvillkor_för_index" -#: sql_help.c:1320 sql_help.c:1321 sql_help.c:1322 sql_help.c:1323 +#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 msgid "rewrite_rule_name" msgstr "omskrivningsregelnamn" -#: sql_help.c:1334 sql_help.c:2842 +#: sql_help.c:1383 sql_help.c:2948 msgid "and partition_bound_spec is:" msgstr "och partitionsgränsspec är:" -#: sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 sql_help.c:2843 -#: sql_help.c:2844 sql_help.c:2845 +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2949 +#: sql_help.c:2950 sql_help.c:2951 msgid "partition_bound_expr" msgstr "partitionsgränsuttryck" -#: sql_help.c:1338 sql_help.c:1339 sql_help.c:2846 sql_help.c:2847 +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2952 sql_help.c:2953 msgid "numeric_literal" msgstr "numerisk_literal" -#: sql_help.c:1340 +#: sql_help.c:1389 msgid "and column_constraint is:" msgstr "och kolumnvillkor är:" -#: sql_help.c:1343 sql_help.c:2266 sql_help.c:2299 sql_help.c:2505 -#: sql_help.c:2815 +#: sql_help.c:1392 sql_help.c:2341 sql_help.c:2376 sql_help.c:2585 +#: sql_help.c:2921 msgid "default_expr" msgstr "default_uttryck" -#: sql_help.c:1344 sql_help.c:2267 sql_help.c:2816 +#: sql_help.c:1393 sql_help.c:2342 sql_help.c:2922 msgid "generation_expr" msgstr "generatoruttryck" -#: sql_help.c:1346 sql_help.c:1347 sql_help.c:1356 sql_help.c:1358 -#: sql_help.c:1362 sql_help.c:2818 sql_help.c:2819 sql_help.c:2828 -#: sql_help.c:2830 sql_help.c:2834 +#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 +#: sql_help.c:1411 sql_help.c:2924 sql_help.c:2925 sql_help.c:2934 +#: sql_help.c:2936 sql_help.c:2940 msgid "index_parameters" msgstr "indexparametrar" -#: sql_help.c:1348 sql_help.c:1365 sql_help.c:2820 sql_help.c:2837 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2926 sql_help.c:2943 msgid "reftable" msgstr "reftabell" -#: sql_help.c:1349 sql_help.c:1366 sql_help.c:2821 sql_help.c:2838 +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2927 sql_help.c:2944 msgid "refcolumn" msgstr "refkolumn" -#: sql_help.c:1350 sql_help.c:1351 sql_help.c:1367 sql_help.c:1368 -#: sql_help.c:2822 sql_help.c:2823 sql_help.c:2839 sql_help.c:2840 +#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 +#: sql_help.c:2928 sql_help.c:2929 sql_help.c:2945 sql_help.c:2946 msgid "referential_action" msgstr "referentiell_aktion" -#: sql_help.c:1352 sql_help.c:2268 sql_help.c:2824 +#: sql_help.c:1401 sql_help.c:2343 sql_help.c:2930 msgid "and table_constraint is:" msgstr "och tabellvillkor är:" -#: sql_help.c:1360 sql_help.c:2832 +#: sql_help.c:1409 sql_help.c:2938 msgid "exclude_element" msgstr "uteslutelement" -#: sql_help.c:1361 sql_help.c:2833 sql_help.c:4293 sql_help.c:4383 -#: sql_help.c:4532 sql_help.c:4687 sql_help.c:4752 +#: sql_help.c:1410 sql_help.c:2939 sql_help.c:4544 sql_help.c:4642 +#: sql_help.c:4793 sql_help.c:4957 sql_help.c:5024 msgid "operator" msgstr "operator" -#: sql_help.c:1363 sql_help.c:2377 sql_help.c:2835 +#: sql_help.c:1412 sql_help.c:2456 sql_help.c:2941 msgid "predicate" msgstr "predikat" -#: sql_help.c:1369 +#: sql_help.c:1418 msgid "and table_constraint_using_index is:" msgstr "och tabellvillkor_för_index är:" -#: sql_help.c:1372 sql_help.c:2848 +#: sql_help.c:1421 sql_help.c:2954 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "indexparametrar i UNIQUE-, PRIMARY KEY- och EXCLUDE-villkor är:" -#: sql_help.c:1377 sql_help.c:2853 +#: sql_help.c:1426 sql_help.c:2959 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "uteslutelement i ett EXCLUDE-villkort är:" -#: sql_help.c:1380 sql_help.c:2370 sql_help.c:2780 sql_help.c:2793 -#: sql_help.c:2807 sql_help.c:2856 sql_help.c:3830 +#: sql_help.c:1429 sql_help.c:2449 sql_help.c:2886 sql_help.c:2899 +#: sql_help.c:2913 sql_help.c:2962 sql_help.c:3978 msgid "opclass" msgstr "op-klass" -#: sql_help.c:1396 sql_help.c:1399 sql_help.c:2891 +#: sql_help.c:1430 sql_help.c:2963 +msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" +msgstr "referentiell_aktion i ett FOREIGN KEY/REFERENCES-villkor är:" + +#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3000 msgid "tablespace_option" msgstr "tabellutrymmesalternativ" -#: sql_help.c:1420 sql_help.c:1423 sql_help.c:1429 sql_help.c:1433 +#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 msgid "token_type" msgstr "symboltyp" -#: sql_help.c:1421 sql_help.c:1424 +#: sql_help.c:1473 sql_help.c:1476 msgid "dictionary_name" msgstr "ordlistnamn" -#: sql_help.c:1426 sql_help.c:1430 +#: sql_help.c:1478 sql_help.c:1482 msgid "old_dictionary" msgstr "gammal_ordlista" -#: sql_help.c:1427 sql_help.c:1431 +#: sql_help.c:1479 sql_help.c:1483 msgid "new_dictionary" msgstr "ny_ordlista" -#: sql_help.c:1526 sql_help.c:1540 sql_help.c:1543 sql_help.c:1544 -#: sql_help.c:3042 +#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 +#: sql_help.c:3153 msgid "attribute_name" msgstr "attributnamn" -#: sql_help.c:1527 +#: sql_help.c:1579 msgid "new_attribute_name" msgstr "nytt_attributnamn" -#: sql_help.c:1531 sql_help.c:1535 +#: sql_help.c:1583 sql_help.c:1587 msgid "new_enum_value" msgstr "nytt_enumvärde" -#: sql_help.c:1532 +#: sql_help.c:1584 msgid "neighbor_enum_value" msgstr "närliggande_enumvärde" -#: sql_help.c:1534 +#: sql_help.c:1586 msgid "existing_enum_value" msgstr "existerande_enumvärde" -#: sql_help.c:1537 +#: sql_help.c:1589 msgid "property" msgstr "egenskap" -#: sql_help.c:1612 sql_help.c:2251 sql_help.c:2260 sql_help.c:2643 -#: sql_help.c:3120 sql_help.c:3571 sql_help.c:3750 sql_help.c:3786 -#: sql_help.c:4098 +#: sql_help.c:1665 sql_help.c:2326 sql_help.c:2335 sql_help.c:2735 +#: sql_help.c:3233 sql_help.c:3684 sql_help.c:3888 sql_help.c:3934 +#: sql_help.c:4337 msgid "server_name" msgstr "servernamn" -#: sql_help.c:1644 sql_help.c:1647 sql_help.c:3135 +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3248 msgid "view_option_name" msgstr "visningsalternativnamn" -#: sql_help.c:1645 sql_help.c:3136 +#: sql_help.c:1698 sql_help.c:3249 msgid "view_option_value" msgstr "visningsalternativvärde" -#: sql_help.c:1666 sql_help.c:1667 sql_help.c:4659 sql_help.c:4660 +#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4929 sql_help.c:4930 msgid "table_and_columns" msgstr "tabell_och_kolumner" -#: sql_help.c:1668 sql_help.c:1912 sql_help.c:3619 sql_help.c:3963 -#: sql_help.c:4661 +#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3732 +#: sql_help.c:4172 sql_help.c:4931 msgid "where option can be one of:" msgstr "där flaggor kan vara en av:" -#: sql_help.c:1669 sql_help.c:1670 sql_help.c:1914 sql_help.c:1917 -#: sql_help.c:2096 sql_help.c:3620 sql_help.c:3621 sql_help.c:3622 -#: sql_help.c:3623 sql_help.c:3624 sql_help.c:3625 sql_help.c:3626 -#: sql_help.c:3627 sql_help.c:4662 sql_help.c:4663 sql_help.c:4664 -#: sql_help.c:4665 sql_help.c:4666 sql_help.c:4667 sql_help.c:4668 -#: sql_help.c:4669 +#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 +#: sql_help.c:1980 sql_help.c:2160 sql_help.c:3733 sql_help.c:3734 +#: sql_help.c:3735 sql_help.c:3736 sql_help.c:3737 sql_help.c:3738 +#: sql_help.c:3739 sql_help.c:3740 sql_help.c:4173 sql_help.c:4175 +#: sql_help.c:4932 sql_help.c:4933 sql_help.c:4934 sql_help.c:4935 +#: sql_help.c:4936 sql_help.c:4937 sql_help.c:4938 sql_help.c:4939 msgid "boolean" msgstr "boolean" -#: sql_help.c:1671 sql_help.c:4671 +#: sql_help.c:1724 sql_help.c:4941 msgid "and table_and_columns is:" msgstr "och tabell_och_kolumner är:" -#: sql_help.c:1687 sql_help.c:4443 sql_help.c:4445 sql_help.c:4469 +#: sql_help.c:1740 sql_help.c:4702 sql_help.c:4704 sql_help.c:4728 msgid "transaction_mode" msgstr "transaktionsläge" -#: sql_help.c:1688 sql_help.c:4446 sql_help.c:4470 +#: sql_help.c:1741 sql_help.c:4705 sql_help.c:4729 msgid "where transaction_mode is one of:" msgstr "där transaktionsläge är en av:" -#: sql_help.c:1697 sql_help.c:4303 sql_help.c:4312 sql_help.c:4316 -#: sql_help.c:4320 sql_help.c:4323 sql_help.c:4542 sql_help.c:4551 -#: sql_help.c:4555 sql_help.c:4559 sql_help.c:4562 sql_help.c:4762 -#: sql_help.c:4771 sql_help.c:4775 sql_help.c:4779 sql_help.c:4782 +#: sql_help.c:1750 sql_help.c:4554 sql_help.c:4563 sql_help.c:4567 +#: sql_help.c:4571 sql_help.c:4574 sql_help.c:4803 sql_help.c:4812 +#: sql_help.c:4816 sql_help.c:4820 sql_help.c:4823 sql_help.c:5034 +#: sql_help.c:5043 sql_help.c:5047 sql_help.c:5051 sql_help.c:5054 msgid "argument" msgstr "argument" -#: sql_help.c:1787 +#: sql_help.c:1850 msgid "relation_name" msgstr "relationsnamn" -#: sql_help.c:1792 sql_help.c:3746 sql_help.c:4094 +#: sql_help.c:1855 sql_help.c:3882 sql_help.c:4331 msgid "domain_name" msgstr "domännamn" -#: sql_help.c:1814 +#: sql_help.c:1877 msgid "policy_name" msgstr "policynamn" -#: sql_help.c:1827 +#: sql_help.c:1890 msgid "rule_name" msgstr "regelnamn" -#: sql_help.c:1846 +#: sql_help.c:1909 msgid "text" msgstr "text" -#: sql_help.c:1871 sql_help.c:3930 sql_help.c:4135 +#: sql_help.c:1934 sql_help.c:4137 sql_help.c:4384 msgid "transaction_id" msgstr "transaktions-id" -#: sql_help.c:1902 sql_help.c:1909 sql_help.c:3856 +#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4004 msgid "filename" msgstr "filnamn" -#: sql_help.c:1903 sql_help.c:1910 sql_help.c:2583 sql_help.c:2584 -#: sql_help.c:2585 +#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2674 sql_help.c:2675 +#: sql_help.c:2676 msgid "command" msgstr "kommando" -#: sql_help.c:1905 sql_help.c:2582 sql_help.c:2994 sql_help.c:3171 -#: sql_help.c:3840 sql_help.c:4286 sql_help.c:4288 sql_help.c:4376 -#: sql_help.c:4378 sql_help.c:4525 sql_help.c:4527 sql_help.c:4630 -#: sql_help.c:4745 sql_help.c:4747 +#: sql_help.c:1968 sql_help.c:2673 sql_help.c:3103 sql_help.c:3284 +#: sql_help.c:3988 sql_help.c:4065 sql_help.c:4068 sql_help.c:4537 +#: sql_help.c:4539 sql_help.c:4635 sql_help.c:4637 sql_help.c:4786 +#: sql_help.c:4788 sql_help.c:4899 sql_help.c:5017 sql_help.c:5019 msgid "condition" msgstr "villkor" -#: sql_help.c:1908 sql_help.c:2411 sql_help.c:2877 sql_help.c:3137 -#: sql_help.c:3155 sql_help.c:3821 +#: sql_help.c:1971 sql_help.c:2490 sql_help.c:2986 sql_help.c:3250 +#: sql_help.c:3268 sql_help.c:3969 msgid "query" msgstr "fråga" -#: sql_help.c:1913 +#: sql_help.c:1976 msgid "format_name" msgstr "formatnamn" -#: sql_help.c:1915 +#: sql_help.c:1978 msgid "delimiter_character" msgstr "avdelartecken" -#: sql_help.c:1916 +#: sql_help.c:1979 msgid "null_string" msgstr "null-sträng" -#: sql_help.c:1918 +#: sql_help.c:1981 +msgid "match" +msgstr "match" + +#: sql_help.c:1982 msgid "quote_character" msgstr "citattecken" -#: sql_help.c:1919 +#: sql_help.c:1983 msgid "escape_character" msgstr "escape-tecken" -#: sql_help.c:1923 +#: sql_help.c:1987 msgid "encoding_name" msgstr "kodningsnamn" -#: sql_help.c:1934 +#: sql_help.c:1998 msgid "access_method_type" msgstr "accessmetodtyp" -#: sql_help.c:2005 sql_help.c:2024 sql_help.c:2027 +#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2091 msgid "arg_data_type" msgstr "arg_datatyp" -#: sql_help.c:2006 sql_help.c:2028 sql_help.c:2036 +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 msgid "sfunc" msgstr "sfunc" -#: sql_help.c:2007 sql_help.c:2029 sql_help.c:2037 +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 msgid "state_data_type" msgstr "tillståndsdatatyp" -#: sql_help.c:2008 sql_help.c:2030 sql_help.c:2038 +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 msgid "state_data_size" msgstr "tillståndsdatastorlek" -#: sql_help.c:2009 sql_help.c:2031 sql_help.c:2039 +#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103 msgid "ffunc" msgstr "ffunc" -#: sql_help.c:2010 sql_help.c:2040 +#: sql_help.c:2074 sql_help.c:2104 msgid "combinefunc" msgstr "kombinerafunk" -#: sql_help.c:2011 sql_help.c:2041 +#: sql_help.c:2075 sql_help.c:2105 msgid "serialfunc" msgstr "serialiseringsfunk" -#: sql_help.c:2012 sql_help.c:2042 +#: sql_help.c:2076 sql_help.c:2106 msgid "deserialfunc" msgstr "deserialiseringsfunk" -#: sql_help.c:2013 sql_help.c:2032 sql_help.c:2043 +#: sql_help.c:2077 sql_help.c:2096 sql_help.c:2107 msgid "initial_condition" msgstr "startvärde" -#: sql_help.c:2014 sql_help.c:2044 +#: sql_help.c:2078 sql_help.c:2108 msgid "msfunc" msgstr "msfunk" -#: sql_help.c:2015 sql_help.c:2045 +#: sql_help.c:2079 sql_help.c:2109 msgid "minvfunc" msgstr "minvfunk" -#: sql_help.c:2016 sql_help.c:2046 +#: sql_help.c:2080 sql_help.c:2110 msgid "mstate_data_type" msgstr "mtillståndsdatatyp" -#: sql_help.c:2017 sql_help.c:2047 +#: sql_help.c:2081 sql_help.c:2111 msgid "mstate_data_size" msgstr "ntillståndsstorlek" -#: sql_help.c:2018 sql_help.c:2048 +#: sql_help.c:2082 sql_help.c:2112 msgid "mffunc" msgstr "mffunk" -#: sql_help.c:2019 sql_help.c:2049 +#: sql_help.c:2083 sql_help.c:2113 msgid "minitial_condition" msgstr "mstartvärde" -#: sql_help.c:2020 sql_help.c:2050 +#: sql_help.c:2084 sql_help.c:2114 msgid "sort_operator" msgstr "sorteringsoperator" -#: sql_help.c:2033 +#: sql_help.c:2097 msgid "or the old syntax" msgstr "eller gamla syntaxen" -#: sql_help.c:2035 +#: sql_help.c:2099 msgid "base_type" msgstr "bastyp" -#: sql_help.c:2092 sql_help.c:2133 +#: sql_help.c:2156 sql_help.c:2203 msgid "locale" msgstr "lokal" -#: sql_help.c:2093 sql_help.c:2134 +#: sql_help.c:2157 sql_help.c:2204 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2094 sql_help.c:2135 +#: sql_help.c:2158 sql_help.c:2205 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2095 sql_help.c:4188 +#: sql_help.c:2159 sql_help.c:4437 msgid "provider" msgstr "leverantör" -#: sql_help.c:2097 sql_help.c:2189 +#: sql_help.c:2161 sql_help.c:2264 msgid "version" msgstr "version" -#: sql_help.c:2099 +#: sql_help.c:2163 msgid "existing_collation" msgstr "existerande_jämförelse" -#: sql_help.c:2109 +#: sql_help.c:2173 msgid "source_encoding" msgstr "källkodning" -#: sql_help.c:2110 +#: sql_help.c:2174 msgid "dest_encoding" msgstr "målkodning" -#: sql_help.c:2131 sql_help.c:2917 +#: sql_help.c:2200 sql_help.c:3026 msgid "template" msgstr "mall" -#: sql_help.c:2132 +#: sql_help.c:2201 msgid "encoding" msgstr "kodning" -#: sql_help.c:2159 +#: sql_help.c:2202 +msgid "strategy" +msgstr "strategi" + +#: sql_help.c:2206 +msgid "icu_locale" +msgstr "icu_lokal" + +#: sql_help.c:2207 +msgid "locale_provider" +msgstr "lokal_leverantör" + +#: sql_help.c:2208 +msgid "collation_version" +msgstr "jämförelse_version" + +#: sql_help.c:2213 +msgid "oid" +msgstr "oid" + +#: sql_help.c:2233 msgid "constraint" msgstr "villkor" -#: sql_help.c:2160 +#: sql_help.c:2234 msgid "where constraint is:" msgstr "där villkor är:" -#: sql_help.c:2174 sql_help.c:2580 sql_help.c:2990 +#: sql_help.c:2248 sql_help.c:2671 sql_help.c:3099 msgid "event" msgstr "händelse" -#: sql_help.c:2175 +#: sql_help.c:2249 msgid "filter_variable" msgstr "filtervariabel" -#: sql_help.c:2263 sql_help.c:2812 +#: sql_help.c:2250 +msgid "filter_value" +msgstr "filtervärde" + +#: sql_help.c:2338 sql_help.c:2918 msgid "where column_constraint is:" msgstr "där kolumnvillkor är:" -#: sql_help.c:2300 +#: sql_help.c:2377 msgid "rettype" msgstr "rettyp" -#: sql_help.c:2302 +#: sql_help.c:2379 msgid "column_type" msgstr "kolumntyp" -#: sql_help.c:2311 sql_help.c:2511 +#: sql_help.c:2388 sql_help.c:2591 msgid "definition" msgstr "definition" -#: sql_help.c:2312 sql_help.c:2512 +#: sql_help.c:2389 sql_help.c:2592 msgid "obj_file" msgstr "obj-fil" -#: sql_help.c:2313 sql_help.c:2513 +#: sql_help.c:2390 sql_help.c:2593 msgid "link_symbol" msgstr "linksymbol" -#: sql_help.c:2351 sql_help.c:2565 sql_help.c:3109 +#: sql_help.c:2391 sql_help.c:2594 +msgid "sql_body" +msgstr "sql-kropp" + +#: sql_help.c:2429 sql_help.c:2656 sql_help.c:3222 msgid "uid" msgstr "uid" -#: sql_help.c:2366 sql_help.c:2407 sql_help.c:2781 sql_help.c:2794 -#: sql_help.c:2808 sql_help.c:2873 +#: sql_help.c:2445 sql_help.c:2486 sql_help.c:2887 sql_help.c:2900 +#: sql_help.c:2914 sql_help.c:2982 msgid "method" msgstr "metod" -#: sql_help.c:2371 +#: sql_help.c:2450 msgid "opclass_parameter" msgstr "opclass_parameter" -#: sql_help.c:2388 +#: sql_help.c:2467 msgid "call_handler" msgstr "anropshanterare" -#: sql_help.c:2389 +#: sql_help.c:2468 msgid "inline_handler" msgstr "inline-hanterare" -#: sql_help.c:2390 +#: sql_help.c:2469 msgid "valfunction" msgstr "val-funktion" -#: sql_help.c:2429 +#: sql_help.c:2508 msgid "com_op" msgstr "com_op" -#: sql_help.c:2430 +#: sql_help.c:2509 msgid "neg_op" msgstr "neg_op" -#: sql_help.c:2448 +#: sql_help.c:2527 msgid "family_name" msgstr "familjenamn" -#: sql_help.c:2459 +#: sql_help.c:2538 msgid "storage_type" msgstr "lagringstyp" -#: sql_help.c:2586 sql_help.c:2997 +#: sql_help.c:2677 sql_help.c:3106 msgid "where event can be one of:" msgstr "där händelse kan vara en av:" -#: sql_help.c:2605 sql_help.c:2607 +#: sql_help.c:2697 sql_help.c:2699 msgid "schema_element" msgstr "schema-element" -#: sql_help.c:2644 +#: sql_help.c:2736 msgid "server_type" msgstr "servertyp" -#: sql_help.c:2645 +#: sql_help.c:2737 msgid "server_version" msgstr "serverversion" -#: sql_help.c:2646 sql_help.c:3748 sql_help.c:4096 +#: sql_help.c:2738 sql_help.c:3885 sql_help.c:4334 msgid "fdw_name" msgstr "fdw-namn" -#: sql_help.c:2659 +#: sql_help.c:2755 sql_help.c:2758 msgid "statistics_name" msgstr "statistiknamn" -#: sql_help.c:2660 +#: sql_help.c:2759 msgid "statistics_kind" msgstr "statistiksort" -#: sql_help.c:2674 +#: sql_help.c:2775 msgid "subscription_name" msgstr "prenumerationsnamn" -#: sql_help.c:2774 +#: sql_help.c:2880 msgid "source_table" msgstr "källtabell" -#: sql_help.c:2775 +#: sql_help.c:2881 msgid "like_option" msgstr "like_alternativ" -#: sql_help.c:2841 +#: sql_help.c:2947 msgid "and like_option is:" msgstr "och likealternativ är:" -#: sql_help.c:2890 +#: sql_help.c:2999 msgid "directory" msgstr "katalog" -#: sql_help.c:2904 +#: sql_help.c:3013 msgid "parser_name" msgstr "parsernamn" -#: sql_help.c:2905 +#: sql_help.c:3014 msgid "source_config" msgstr "källkonfig" -#: sql_help.c:2934 +#: sql_help.c:3043 msgid "start_function" msgstr "startfunktion" -#: sql_help.c:2935 +#: sql_help.c:3044 msgid "gettoken_function" msgstr "gettoken_funktion" -#: sql_help.c:2936 +#: sql_help.c:3045 msgid "end_function" msgstr "slutfunktion" -#: sql_help.c:2937 +#: sql_help.c:3046 msgid "lextypes_function" msgstr "symboltypfunktion" -#: sql_help.c:2938 +#: sql_help.c:3047 msgid "headline_function" msgstr "rubrikfunktion" -#: sql_help.c:2950 +#: sql_help.c:3059 msgid "init_function" msgstr "init_funktion" -#: sql_help.c:2951 +#: sql_help.c:3060 msgid "lexize_function" msgstr "symboluppdelningsfunktion" -#: sql_help.c:2964 +#: sql_help.c:3073 msgid "from_sql_function_name" msgstr "från_sql_funktionsnamn" -#: sql_help.c:2966 +#: sql_help.c:3075 msgid "to_sql_function_name" msgstr "till_sql_funktionsnamn" -#: sql_help.c:2992 +#: sql_help.c:3101 msgid "referenced_table_name" msgstr "refererat_tabellnamn" -#: sql_help.c:2993 +#: sql_help.c:3102 msgid "transition_relation_name" msgstr "övergångsrelationsnamn" -#: sql_help.c:2996 +#: sql_help.c:3105 msgid "arguments" msgstr "argument" -#: sql_help.c:3046 sql_help.c:4221 +#: sql_help.c:3157 sql_help.c:4470 msgid "label" msgstr "etikett" -#: sql_help.c:3048 +#: sql_help.c:3159 msgid "subtype" msgstr "subtyp" -#: sql_help.c:3049 +#: sql_help.c:3160 msgid "subtype_operator_class" msgstr "subtypoperatorklass" -#: sql_help.c:3051 +#: sql_help.c:3162 msgid "canonical_function" msgstr "kanonisk_funktion" -#: sql_help.c:3052 +#: sql_help.c:3163 msgid "subtype_diff_function" msgstr "subtyp_diff_funktion" -#: sql_help.c:3054 +#: sql_help.c:3164 +msgid "multirange_type_name" +msgstr "multirange_typnamn" + +#: sql_help.c:3166 msgid "input_function" msgstr "inmatningsfunktion" -#: sql_help.c:3055 +#: sql_help.c:3167 msgid "output_function" msgstr "utmatningsfunktion" -#: sql_help.c:3056 +#: sql_help.c:3168 msgid "receive_function" msgstr "mottagarfunktion" -#: sql_help.c:3057 +#: sql_help.c:3169 msgid "send_function" msgstr "sändfunktion" -#: sql_help.c:3058 +#: sql_help.c:3170 msgid "type_modifier_input_function" msgstr "typmodifiering_indatafunktion" -#: sql_help.c:3059 +#: sql_help.c:3171 msgid "type_modifier_output_function" msgstr "typmodifiering_utdatafunktion" -#: sql_help.c:3060 +#: sql_help.c:3172 msgid "analyze_function" msgstr "analysfunktion" -#: sql_help.c:3061 +#: sql_help.c:3173 +msgid "subscript_function" +msgstr "arrayindexfunktion" + +#: sql_help.c:3174 msgid "internallength" msgstr "internlängd" -#: sql_help.c:3062 +#: sql_help.c:3175 msgid "alignment" msgstr "justering" -#: sql_help.c:3063 +#: sql_help.c:3176 msgid "storage" msgstr "lagring" -#: sql_help.c:3064 +#: sql_help.c:3177 msgid "like_type" msgstr "liketyp" -#: sql_help.c:3065 +#: sql_help.c:3178 msgid "category" msgstr "kategori" -#: sql_help.c:3066 +#: sql_help.c:3179 msgid "preferred" msgstr "föredragen" -#: sql_help.c:3067 +#: sql_help.c:3180 msgid "default" msgstr "standard" -#: sql_help.c:3068 +#: sql_help.c:3181 msgid "element" msgstr "element" -#: sql_help.c:3069 +#: sql_help.c:3182 msgid "delimiter" msgstr "avskiljare" -#: sql_help.c:3070 +#: sql_help.c:3183 msgid "collatable" msgstr "sorterbar" -#: sql_help.c:3167 sql_help.c:3816 sql_help.c:4281 sql_help.c:4370 -#: sql_help.c:4520 sql_help.c:4620 sql_help.c:4740 +#: sql_help.c:3280 sql_help.c:3964 sql_help.c:4054 sql_help.c:4532 +#: sql_help.c:4629 sql_help.c:4781 sql_help.c:4889 sql_help.c:5012 msgid "with_query" msgstr "with_fråga" -#: sql_help.c:3169 sql_help.c:3818 sql_help.c:4300 sql_help.c:4306 -#: sql_help.c:4309 sql_help.c:4313 sql_help.c:4317 sql_help.c:4325 -#: sql_help.c:4539 sql_help.c:4545 sql_help.c:4548 sql_help.c:4552 -#: sql_help.c:4556 sql_help.c:4564 sql_help.c:4622 sql_help.c:4759 -#: sql_help.c:4765 sql_help.c:4768 sql_help.c:4772 sql_help.c:4776 -#: sql_help.c:4784 +#: sql_help.c:3282 sql_help.c:3966 sql_help.c:4551 sql_help.c:4557 +#: sql_help.c:4560 sql_help.c:4564 sql_help.c:4568 sql_help.c:4576 +#: sql_help.c:4800 sql_help.c:4806 sql_help.c:4809 sql_help.c:4813 +#: sql_help.c:4817 sql_help.c:4825 sql_help.c:4891 sql_help.c:5031 +#: sql_help.c:5037 sql_help.c:5040 sql_help.c:5044 sql_help.c:5048 +#: sql_help.c:5056 msgid "alias" msgstr "alias" -#: sql_help.c:3170 sql_help.c:4285 sql_help.c:4327 sql_help.c:4329 -#: sql_help.c:4375 sql_help.c:4524 sql_help.c:4566 sql_help.c:4568 -#: sql_help.c:4629 sql_help.c:4744 sql_help.c:4786 sql_help.c:4788 +#: sql_help.c:3283 sql_help.c:4536 sql_help.c:4578 sql_help.c:4580 +#: sql_help.c:4634 sql_help.c:4785 sql_help.c:4827 sql_help.c:4829 +#: sql_help.c:4898 sql_help.c:5016 sql_help.c:5058 sql_help.c:5060 msgid "from_item" msgstr "frånval" -#: sql_help.c:3172 sql_help.c:3653 sql_help.c:3897 sql_help.c:4631 +#: sql_help.c:3285 sql_help.c:3766 sql_help.c:4104 sql_help.c:4900 msgid "cursor_name" msgstr "markörnamn" -#: sql_help.c:3173 sql_help.c:3824 sql_help.c:4632 +#: sql_help.c:3286 sql_help.c:3972 sql_help.c:4901 msgid "output_expression" msgstr "utdatauttryck" -#: sql_help.c:3174 sql_help.c:3825 sql_help.c:4284 sql_help.c:4373 -#: sql_help.c:4523 sql_help.c:4633 sql_help.c:4743 +#: sql_help.c:3287 sql_help.c:3973 sql_help.c:4535 sql_help.c:4632 +#: sql_help.c:4784 sql_help.c:4902 sql_help.c:5015 msgid "output_name" msgstr "utdatanamn" -#: sql_help.c:3190 +#: sql_help.c:3303 msgid "code" msgstr "kod" -#: sql_help.c:3595 +#: sql_help.c:3708 msgid "parameter" msgstr "parameter" -#: sql_help.c:3617 sql_help.c:3618 sql_help.c:3922 +#: sql_help.c:3730 sql_help.c:3731 sql_help.c:4129 msgid "statement" msgstr "sats" -#: sql_help.c:3652 sql_help.c:3896 +#: sql_help.c:3765 sql_help.c:4103 msgid "direction" msgstr "riktning" -#: sql_help.c:3654 sql_help.c:3898 +#: sql_help.c:3767 sql_help.c:4105 msgid "where direction can be empty or one of:" msgstr "där riktning kan vara tom eller en av:" -#: sql_help.c:3655 sql_help.c:3656 sql_help.c:3657 sql_help.c:3658 -#: sql_help.c:3659 sql_help.c:3899 sql_help.c:3900 sql_help.c:3901 -#: sql_help.c:3902 sql_help.c:3903 sql_help.c:4294 sql_help.c:4296 -#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4533 sql_help.c:4535 -#: sql_help.c:4688 sql_help.c:4690 sql_help.c:4753 sql_help.c:4755 +#: sql_help.c:3768 sql_help.c:3769 sql_help.c:3770 sql_help.c:3771 +#: sql_help.c:3772 sql_help.c:4106 sql_help.c:4107 sql_help.c:4108 +#: sql_help.c:4109 sql_help.c:4110 sql_help.c:4545 sql_help.c:4547 +#: sql_help.c:4643 sql_help.c:4645 sql_help.c:4794 sql_help.c:4796 +#: sql_help.c:4958 sql_help.c:4960 sql_help.c:5025 sql_help.c:5027 msgid "count" msgstr "antal" -#: sql_help.c:3741 sql_help.c:4089 +#: sql_help.c:3875 sql_help.c:4324 msgid "sequence_name" msgstr "sekvensnamn" -#: sql_help.c:3754 sql_help.c:4102 +#: sql_help.c:3893 sql_help.c:4342 msgid "arg_name" msgstr "arg_namn" -#: sql_help.c:3755 sql_help.c:4103 +#: sql_help.c:3894 sql_help.c:4343 msgid "arg_type" msgstr "arg_typ" -#: sql_help.c:3760 sql_help.c:4108 +#: sql_help.c:3901 sql_help.c:4350 msgid "loid" msgstr "loid" -#: sql_help.c:3784 +#: sql_help.c:3932 msgid "remote_schema" msgstr "externt_schema" -#: sql_help.c:3787 +#: sql_help.c:3935 msgid "local_schema" msgstr "lokalt_schema" -#: sql_help.c:3822 +#: sql_help.c:3970 msgid "conflict_target" msgstr "konfliktmål" -#: sql_help.c:3823 +#: sql_help.c:3971 msgid "conflict_action" msgstr "konfliktaktion" -#: sql_help.c:3826 +#: sql_help.c:3974 msgid "where conflict_target can be one of:" msgstr "där konfliktmål kan vara en av:" -#: sql_help.c:3827 +#: sql_help.c:3975 msgid "index_column_name" msgstr "indexkolumnnamn" -#: sql_help.c:3828 +#: sql_help.c:3976 msgid "index_expression" msgstr "indexuttryck" -#: sql_help.c:3831 +#: sql_help.c:3979 msgid "index_predicate" msgstr "indexpredikat" -#: sql_help.c:3833 +#: sql_help.c:3981 msgid "and conflict_action is one of:" msgstr "och konfliktaktion är en av:" -#: sql_help.c:3839 sql_help.c:4628 +#: sql_help.c:3987 sql_help.c:4897 msgid "sub-SELECT" msgstr "sub-SELECT" -#: sql_help.c:3848 sql_help.c:3911 sql_help.c:4604 +#: sql_help.c:3996 sql_help.c:4118 sql_help.c:4873 msgid "channel" msgstr "kanal" -#: sql_help.c:3870 +#: sql_help.c:4018 msgid "lockmode" msgstr "låsläge" -#: sql_help.c:3871 +#: sql_help.c:4019 msgid "where lockmode is one of:" msgstr "där låsläge är en av:" -#: sql_help.c:3912 +#: sql_help.c:4055 +msgid "target_table_name" +msgstr "måltabellnamn" + +#: sql_help.c:4056 +msgid "target_alias" +msgstr "målalias" + +#: sql_help.c:4057 +msgid "data_source" +msgstr "datakälla" + +#: sql_help.c:4058 sql_help.c:4581 sql_help.c:4830 sql_help.c:5061 +msgid "join_condition" +msgstr "join-villkor" + +#: sql_help.c:4059 +msgid "when_clause" +msgstr "when_sats" + +#: sql_help.c:4060 +msgid "where data_source is" +msgstr "där datakälla är" + +#: sql_help.c:4061 +msgid "source_table_name" +msgstr "källtabellnamn" + +#: sql_help.c:4062 +msgid "source_query" +msgstr "källfråga" + +#: sql_help.c:4063 +msgid "source_alias" +msgstr "källalias" + +#: sql_help.c:4064 +msgid "and when_clause is" +msgstr "och when_sats är:" + +#: sql_help.c:4066 +msgid "merge_update" +msgstr "merge_update" + +#: sql_help.c:4067 +msgid "merge_delete" +msgstr "merge_delete" + +#: sql_help.c:4069 +msgid "merge_insert" +msgstr "merge_insert" + +#: sql_help.c:4070 +msgid "and merge_insert is" +msgstr "och merge_insert är" + +#: sql_help.c:4073 +msgid "and merge_update is" +msgstr "och merge_update är" + +#: sql_help.c:4078 +msgid "and merge_delete is" +msgstr "och merge_delete är" + +#: sql_help.c:4119 msgid "payload" msgstr "innehåll" -#: sql_help.c:3939 +#: sql_help.c:4146 msgid "old_role" msgstr "gammal_roll" -#: sql_help.c:3940 +#: sql_help.c:4147 msgid "new_role" msgstr "ny_roll" -#: sql_help.c:3971 sql_help.c:4143 sql_help.c:4151 +#: sql_help.c:4183 sql_help.c:4392 sql_help.c:4400 msgid "savepoint_name" msgstr "sparpunktnamn" -#: sql_help.c:4287 sql_help.c:4339 sql_help.c:4526 sql_help.c:4578 -#: sql_help.c:4746 sql_help.c:4798 +#: sql_help.c:4538 sql_help.c:4591 sql_help.c:4787 sql_help.c:4840 +#: sql_help.c:5018 sql_help.c:5071 msgid "grouping_element" msgstr "gruperingselement" -#: sql_help.c:4289 sql_help.c:4379 sql_help.c:4528 sql_help.c:4748 +#: sql_help.c:4540 sql_help.c:4638 sql_help.c:4789 sql_help.c:5020 msgid "window_name" msgstr "fönsternamn" -#: sql_help.c:4290 sql_help.c:4380 sql_help.c:4529 sql_help.c:4749 +#: sql_help.c:4541 sql_help.c:4639 sql_help.c:4790 sql_help.c:5021 msgid "window_definition" msgstr "fönsterdefinition" -#: sql_help.c:4291 sql_help.c:4305 sql_help.c:4343 sql_help.c:4381 -#: sql_help.c:4530 sql_help.c:4544 sql_help.c:4582 sql_help.c:4750 -#: sql_help.c:4764 sql_help.c:4802 +#: sql_help.c:4542 sql_help.c:4556 sql_help.c:4595 sql_help.c:4640 +#: sql_help.c:4791 sql_help.c:4805 sql_help.c:4844 sql_help.c:5022 +#: sql_help.c:5036 sql_help.c:5075 msgid "select" msgstr "select" -#: sql_help.c:4298 sql_help.c:4537 sql_help.c:4757 +#: sql_help.c:4549 sql_help.c:4798 sql_help.c:5029 msgid "where from_item can be one of:" msgstr "där frånval kan vara en av:" -#: sql_help.c:4301 sql_help.c:4307 sql_help.c:4310 sql_help.c:4314 -#: sql_help.c:4326 sql_help.c:4540 sql_help.c:4546 sql_help.c:4549 -#: sql_help.c:4553 sql_help.c:4565 sql_help.c:4760 sql_help.c:4766 -#: sql_help.c:4769 sql_help.c:4773 sql_help.c:4785 +#: sql_help.c:4552 sql_help.c:4558 sql_help.c:4561 sql_help.c:4565 +#: sql_help.c:4577 sql_help.c:4801 sql_help.c:4807 sql_help.c:4810 +#: sql_help.c:4814 sql_help.c:4826 sql_help.c:5032 sql_help.c:5038 +#: sql_help.c:5041 sql_help.c:5045 sql_help.c:5057 msgid "column_alias" msgstr "kolumnalias" -#: sql_help.c:4302 sql_help.c:4541 sql_help.c:4761 +#: sql_help.c:4553 sql_help.c:4802 sql_help.c:5033 msgid "sampling_method" msgstr "samplingsmetod" -#: sql_help.c:4304 sql_help.c:4543 sql_help.c:4763 +#: sql_help.c:4555 sql_help.c:4804 sql_help.c:5035 msgid "seed" msgstr "frö" -#: sql_help.c:4308 sql_help.c:4341 sql_help.c:4547 sql_help.c:4580 -#: sql_help.c:4767 sql_help.c:4800 +#: sql_help.c:4559 sql_help.c:4593 sql_help.c:4808 sql_help.c:4842 +#: sql_help.c:5039 sql_help.c:5073 msgid "with_query_name" msgstr "with_frågenamn" -#: sql_help.c:4318 sql_help.c:4321 sql_help.c:4324 sql_help.c:4557 -#: sql_help.c:4560 sql_help.c:4563 sql_help.c:4777 sql_help.c:4780 -#: sql_help.c:4783 +#: sql_help.c:4569 sql_help.c:4572 sql_help.c:4575 sql_help.c:4818 +#: sql_help.c:4821 sql_help.c:4824 sql_help.c:5049 sql_help.c:5052 +#: sql_help.c:5055 msgid "column_definition" msgstr "kolumndefinition" -#: sql_help.c:4328 sql_help.c:4567 sql_help.c:4787 +#: sql_help.c:4579 sql_help.c:4828 sql_help.c:5059 msgid "join_type" msgstr "join-typ" -#: sql_help.c:4330 sql_help.c:4569 sql_help.c:4789 -msgid "join_condition" -msgstr "join-villkor" - -#: sql_help.c:4331 sql_help.c:4570 sql_help.c:4790 +#: sql_help.c:4582 sql_help.c:4831 sql_help.c:5062 msgid "join_column" msgstr "join-kolumn" -#: sql_help.c:4332 sql_help.c:4571 sql_help.c:4791 +#: sql_help.c:4583 sql_help.c:4832 sql_help.c:5063 +msgid "join_using_alias" +msgstr "join_using_alias" + +#: sql_help.c:4584 sql_help.c:4833 sql_help.c:5064 msgid "and grouping_element can be one of:" msgstr "och grupperingselement kan vara en av:" -#: sql_help.c:4340 sql_help.c:4579 sql_help.c:4799 +#: sql_help.c:4592 sql_help.c:4841 sql_help.c:5072 msgid "and with_query is:" msgstr "och with_fråga är:" -#: sql_help.c:4344 sql_help.c:4583 sql_help.c:4803 +#: sql_help.c:4596 sql_help.c:4845 sql_help.c:5076 msgid "values" msgstr "värden" -#: sql_help.c:4345 sql_help.c:4584 sql_help.c:4804 +#: sql_help.c:4597 sql_help.c:4846 sql_help.c:5077 msgid "insert" msgstr "insert" -#: sql_help.c:4346 sql_help.c:4585 sql_help.c:4805 +#: sql_help.c:4598 sql_help.c:4847 sql_help.c:5078 msgid "update" msgstr "update" -#: sql_help.c:4347 sql_help.c:4586 sql_help.c:4806 +#: sql_help.c:4599 sql_help.c:4848 sql_help.c:5079 msgid "delete" msgstr "delete" -#: sql_help.c:4374 +#: sql_help.c:4601 sql_help.c:4850 sql_help.c:5081 +msgid "search_seq_col_name" +msgstr "söksekvens_kolumnnamn" + +#: sql_help.c:4603 sql_help.c:4852 sql_help.c:5083 +msgid "cycle_mark_col_name" +msgstr "cykelmarkering_kolumnnamn" + +#: sql_help.c:4604 sql_help.c:4853 sql_help.c:5084 +msgid "cycle_mark_value" +msgstr "cykelmarkering_värde" + +#: sql_help.c:4605 sql_help.c:4854 sql_help.c:5085 +msgid "cycle_mark_default" +msgstr "cykelmarkering_standard" + +#: sql_help.c:4606 sql_help.c:4855 sql_help.c:5086 +msgid "cycle_path_col_name" +msgstr "cykelväg_kolumnnamn" + +#: sql_help.c:4633 msgid "new_table" msgstr "ny_tabell" -#: sql_help.c:4399 +#: sql_help.c:4658 msgid "timezone" msgstr "tidszon" -#: sql_help.c:4444 +#: sql_help.c:4703 msgid "snapshot_id" msgstr "snapshot_id" -#: sql_help.c:4686 +#: sql_help.c:4956 msgid "sort_expression" msgstr "sorteringsuttryck" -#: sql_help.c:4813 sql_help.c:5791 +#: sql_help.c:5093 sql_help.c:6077 msgid "abort the current transaction" msgstr "avbryt aktuell transaktion" -#: sql_help.c:4819 +#: sql_help.c:5099 msgid "change the definition of an aggregate function" msgstr "ändra definitionen av en aggregatfunktion" -#: sql_help.c:4825 +#: sql_help.c:5105 msgid "change the definition of a collation" msgstr "ändra definitionen av en jämförelse" -#: sql_help.c:4831 +#: sql_help.c:5111 msgid "change the definition of a conversion" msgstr "ändra definitionen av en konvertering" -#: sql_help.c:4837 +#: sql_help.c:5117 msgid "change a database" msgstr "ändra en databas" -#: sql_help.c:4843 +#: sql_help.c:5123 msgid "define default access privileges" msgstr "definiera standardaccessrättigheter" -#: sql_help.c:4849 +#: sql_help.c:5129 msgid "change the definition of a domain" msgstr "ändra definitionen av en domän" -#: sql_help.c:4855 +#: sql_help.c:5135 msgid "change the definition of an event trigger" msgstr "ändra definitionen av en händelseutlösare" -#: sql_help.c:4861 +#: sql_help.c:5141 msgid "change the definition of an extension" msgstr "ändra definitionen av en utökning" -#: sql_help.c:4867 +#: sql_help.c:5147 msgid "change the definition of a foreign-data wrapper" msgstr "ändra definitionen av en främmande data-omvandlare" -#: sql_help.c:4873 +#: sql_help.c:5153 msgid "change the definition of a foreign table" msgstr "ändra definitionen av en främmande tabell" -#: sql_help.c:4879 +#: sql_help.c:5159 msgid "change the definition of a function" msgstr "ändra definitionen av en funktion" -#: sql_help.c:4885 +#: sql_help.c:5165 msgid "change role name or membership" msgstr "ändra rollnamn eller medlemskap" -#: sql_help.c:4891 +#: sql_help.c:5171 msgid "change the definition of an index" msgstr "ändra definitionen av ett index" -#: sql_help.c:4897 +#: sql_help.c:5177 msgid "change the definition of a procedural language" msgstr "ändra definitionen av ett procedur-språk" -#: sql_help.c:4903 +#: sql_help.c:5183 msgid "change the definition of a large object" msgstr "ändra definitionen av ett stort objekt" -#: sql_help.c:4909 +#: sql_help.c:5189 msgid "change the definition of a materialized view" msgstr "ändra definitionen av en materialiserad vy" -#: sql_help.c:4915 +#: sql_help.c:5195 msgid "change the definition of an operator" msgstr "ändra definitionen av en operator" -#: sql_help.c:4921 +#: sql_help.c:5201 msgid "change the definition of an operator class" msgstr "ändra definitionen av en operatorklass" -#: sql_help.c:4927 +#: sql_help.c:5207 msgid "change the definition of an operator family" msgstr "ändra definitionen av en operatorfamilj" -#: sql_help.c:4933 -msgid "change the definition of a row level security policy" +#: sql_help.c:5213 +msgid "change the definition of a row-level security policy" msgstr "ändra definitionen av en säkerhetspolicy på radnivå" -#: sql_help.c:4939 +#: sql_help.c:5219 msgid "change the definition of a procedure" msgstr "ändra definitionen av en procedur" -#: sql_help.c:4945 +#: sql_help.c:5225 msgid "change the definition of a publication" msgstr "ändra definitionen av en publicering" -#: sql_help.c:4951 sql_help.c:5053 +#: sql_help.c:5231 sql_help.c:5333 msgid "change a database role" msgstr "ändra databasroll" -#: sql_help.c:4957 +#: sql_help.c:5237 msgid "change the definition of a routine" msgstr "ändra definitionen av en rutin" -#: sql_help.c:4963 +#: sql_help.c:5243 msgid "change the definition of a rule" msgstr "ändra definitionen av en regel" -#: sql_help.c:4969 +#: sql_help.c:5249 msgid "change the definition of a schema" msgstr "ändra definitionen av ett schema" -#: sql_help.c:4975 +#: sql_help.c:5255 msgid "change the definition of a sequence generator" msgstr "ändra definitionen av en sekvensgenerator" -#: sql_help.c:4981 +#: sql_help.c:5261 msgid "change the definition of a foreign server" msgstr "ändra definitionen av en främmande server" -#: sql_help.c:4987 +#: sql_help.c:5267 msgid "change the definition of an extended statistics object" msgstr "ändra definitionen av ett utökat statistikobjekt" -#: sql_help.c:4993 +#: sql_help.c:5273 msgid "change the definition of a subscription" msgstr "ändra definitionen av en prenumerering" -#: sql_help.c:4999 +#: sql_help.c:5279 msgid "change a server configuration parameter" msgstr "ändra en servers konfigurationsparameter" -#: sql_help.c:5005 +#: sql_help.c:5285 msgid "change the definition of a table" msgstr "ändra definitionen av en tabell" -#: sql_help.c:5011 +#: sql_help.c:5291 msgid "change the definition of a tablespace" msgstr "ändra definitionen av ett tabellutrymme" -#: sql_help.c:5017 +#: sql_help.c:5297 msgid "change the definition of a text search configuration" msgstr "ändra definitionen av en textsökkonfiguration" -#: sql_help.c:5023 +#: sql_help.c:5303 msgid "change the definition of a text search dictionary" msgstr "ändra definitionen av en textsökordlista" -#: sql_help.c:5029 +#: sql_help.c:5309 msgid "change the definition of a text search parser" msgstr "ändra definitionen av en textsökparser" -#: sql_help.c:5035 +#: sql_help.c:5315 msgid "change the definition of a text search template" msgstr "ändra definitionen av en textsökmall" -#: sql_help.c:5041 +#: sql_help.c:5321 msgid "change the definition of a trigger" msgstr "ändra definitionen av en utlösare" -#: sql_help.c:5047 +#: sql_help.c:5327 msgid "change the definition of a type" msgstr "ändra definitionen av en typ" -#: sql_help.c:5059 +#: sql_help.c:5339 msgid "change the definition of a user mapping" msgstr "ändra definitionen av en användarmappning" -#: sql_help.c:5065 +#: sql_help.c:5345 msgid "change the definition of a view" msgstr "ändra definitionen av en vy" -#: sql_help.c:5071 +#: sql_help.c:5351 msgid "collect statistics about a database" msgstr "samla in statistik om en databas" -#: sql_help.c:5077 sql_help.c:5869 +#: sql_help.c:5357 sql_help.c:6155 msgid "start a transaction block" msgstr "starta ett transaktionsblock" -#: sql_help.c:5083 +#: sql_help.c:5363 msgid "invoke a procedure" msgstr "anropa en procedur" -#: sql_help.c:5089 +#: sql_help.c:5369 msgid "force a write-ahead log checkpoint" msgstr "tvinga checkpoint i transaktionsloggen" -#: sql_help.c:5095 +#: sql_help.c:5375 msgid "close a cursor" msgstr "stäng en markör" -#: sql_help.c:5101 +#: sql_help.c:5381 msgid "cluster a table according to an index" msgstr "klustra en tabell efter ett index" -#: sql_help.c:5107 +#: sql_help.c:5387 msgid "define or change the comment of an object" msgstr "definiera eller ändra en kommentar på ett objekt" -#: sql_help.c:5113 sql_help.c:5671 +#: sql_help.c:5393 sql_help.c:5951 msgid "commit the current transaction" msgstr "utför den aktuella transaktionen" -#: sql_help.c:5119 +#: sql_help.c:5399 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "utför commit på en transaktion som tidigare förberetts för två-fas-commit" -#: sql_help.c:5125 +#: sql_help.c:5405 msgid "copy data between a file and a table" msgstr "kopiera data mellan en fil och en tabell" -#: sql_help.c:5131 +#: sql_help.c:5411 msgid "define a new access method" msgstr "definiera en ny accessmetod" -#: sql_help.c:5137 +#: sql_help.c:5417 msgid "define a new aggregate function" msgstr "definiera en ny aggregatfunktion" -#: sql_help.c:5143 +#: sql_help.c:5423 msgid "define a new cast" msgstr "definiera en ny typomvandling" -#: sql_help.c:5149 +#: sql_help.c:5429 msgid "define a new collation" msgstr "definiera en ny jämförelse" -#: sql_help.c:5155 +#: sql_help.c:5435 msgid "define a new encoding conversion" msgstr "definiera en ny teckenkodningskonvertering" -#: sql_help.c:5161 +#: sql_help.c:5441 msgid "create a new database" msgstr "skapa en ny databas" -#: sql_help.c:5167 +#: sql_help.c:5447 msgid "define a new domain" msgstr "definiera en ny domän" -#: sql_help.c:5173 +#: sql_help.c:5453 msgid "define a new event trigger" msgstr "definiera en ny händelseutlösare" -#: sql_help.c:5179 +#: sql_help.c:5459 msgid "install an extension" msgstr "installera en utökning" -#: sql_help.c:5185 +#: sql_help.c:5465 msgid "define a new foreign-data wrapper" msgstr "definiera en ny främmande data-omvandlare" -#: sql_help.c:5191 +#: sql_help.c:5471 msgid "define a new foreign table" msgstr "definiera en ny främmande tabell" -#: sql_help.c:5197 +#: sql_help.c:5477 msgid "define a new function" msgstr "definiera en ny funktion" -#: sql_help.c:5203 sql_help.c:5263 sql_help.c:5365 +#: sql_help.c:5483 sql_help.c:5543 sql_help.c:5645 msgid "define a new database role" msgstr "definiera en ny databasroll" -#: sql_help.c:5209 +#: sql_help.c:5489 msgid "define a new index" msgstr "skapa ett nytt index" -#: sql_help.c:5215 +#: sql_help.c:5495 msgid "define a new procedural language" msgstr "definiera ett nytt procedur-språk" -#: sql_help.c:5221 +#: sql_help.c:5501 msgid "define a new materialized view" msgstr "definiera en ny materialiserad vy" -#: sql_help.c:5227 +#: sql_help.c:5507 msgid "define a new operator" msgstr "definiera en ny operator" -#: sql_help.c:5233 +#: sql_help.c:5513 msgid "define a new operator class" msgstr "definiera en ny operatorklass" -#: sql_help.c:5239 +#: sql_help.c:5519 msgid "define a new operator family" msgstr "definiera en ny operatorfamilj" -#: sql_help.c:5245 -msgid "define a new row level security policy for a table" +#: sql_help.c:5525 +msgid "define a new row-level security policy for a table" msgstr "definiera en ny säkerhetspolicy på radnivå för en tabell" -#: sql_help.c:5251 +#: sql_help.c:5531 msgid "define a new procedure" msgstr "definiera ett ny procedur" -#: sql_help.c:5257 +#: sql_help.c:5537 msgid "define a new publication" msgstr "definiera en ny publicering" -#: sql_help.c:5269 +#: sql_help.c:5549 msgid "define a new rewrite rule" msgstr "definiera en ny omskrivningsregel" -#: sql_help.c:5275 +#: sql_help.c:5555 msgid "define a new schema" msgstr "definiera ett nytt schema" -#: sql_help.c:5281 +#: sql_help.c:5561 msgid "define a new sequence generator" msgstr "definiera en ny sekvensgenerator" -#: sql_help.c:5287 +#: sql_help.c:5567 msgid "define a new foreign server" msgstr "definiera en ny främmande server" -#: sql_help.c:5293 +#: sql_help.c:5573 msgid "define extended statistics" msgstr "definiera utökad statistik" -#: sql_help.c:5299 +#: sql_help.c:5579 msgid "define a new subscription" msgstr "definiera en ny prenumeration" -#: sql_help.c:5305 +#: sql_help.c:5585 msgid "define a new table" msgstr "definiera en ny tabell" -#: sql_help.c:5311 sql_help.c:5827 +#: sql_help.c:5591 sql_help.c:6113 msgid "define a new table from the results of a query" msgstr "definiera en ny tabell utifrån resultatet av en fråga" -#: sql_help.c:5317 +#: sql_help.c:5597 msgid "define a new tablespace" msgstr "definiera ett nytt tabellutrymme" -#: sql_help.c:5323 +#: sql_help.c:5603 msgid "define a new text search configuration" msgstr "definiera en ny textsökkonfiguration" -#: sql_help.c:5329 +#: sql_help.c:5609 msgid "define a new text search dictionary" msgstr "definiera en ny textsökordlista" -#: sql_help.c:5335 +#: sql_help.c:5615 msgid "define a new text search parser" msgstr "definiera en ny textsökparser" -#: sql_help.c:5341 +#: sql_help.c:5621 msgid "define a new text search template" msgstr "definiera en ny textsökmall" -#: sql_help.c:5347 +#: sql_help.c:5627 msgid "define a new transform" msgstr "definiera en ny transform" -#: sql_help.c:5353 +#: sql_help.c:5633 msgid "define a new trigger" msgstr "definiera en ny utlösare" -#: sql_help.c:5359 +#: sql_help.c:5639 msgid "define a new data type" msgstr "definiera en ny datatyp" -#: sql_help.c:5371 +#: sql_help.c:5651 msgid "define a new mapping of a user to a foreign server" msgstr "definiera en ny mappning av en användare till en främmande server" -#: sql_help.c:5377 +#: sql_help.c:5657 msgid "define a new view" msgstr "definiera en ny vy" -#: sql_help.c:5383 +#: sql_help.c:5663 msgid "deallocate a prepared statement" msgstr "deallokera en förberedd sats" -#: sql_help.c:5389 +#: sql_help.c:5669 msgid "define a cursor" msgstr "definiera en markör" -#: sql_help.c:5395 +#: sql_help.c:5675 msgid "delete rows of a table" msgstr "radera rader i en tabell" -#: sql_help.c:5401 +#: sql_help.c:5681 msgid "discard session state" msgstr "släng sessionstillstånd" -#: sql_help.c:5407 +#: sql_help.c:5687 msgid "execute an anonymous code block" msgstr "kör ett annonymt kodblock" -#: sql_help.c:5413 +#: sql_help.c:5693 msgid "remove an access method" msgstr "ta bort en accessmetod" -#: sql_help.c:5419 +#: sql_help.c:5699 msgid "remove an aggregate function" msgstr "ta bort en aggregatfunktioner" -#: sql_help.c:5425 +#: sql_help.c:5705 msgid "remove a cast" msgstr "ta bort en typomvandling" -#: sql_help.c:5431 +#: sql_help.c:5711 msgid "remove a collation" msgstr "ta bort en jämförelse" -#: sql_help.c:5437 +#: sql_help.c:5717 msgid "remove a conversion" msgstr "ta bort en konvertering" -#: sql_help.c:5443 +#: sql_help.c:5723 msgid "remove a database" msgstr "ta bort en databas" -#: sql_help.c:5449 +#: sql_help.c:5729 msgid "remove a domain" msgstr "ta bort en domän" -#: sql_help.c:5455 +#: sql_help.c:5735 msgid "remove an event trigger" msgstr "ta bort en händelseutlösare" -#: sql_help.c:5461 +#: sql_help.c:5741 msgid "remove an extension" msgstr "ta bort en utökning" -#: sql_help.c:5467 +#: sql_help.c:5747 msgid "remove a foreign-data wrapper" msgstr "ta bort en frammande data-omvandlare" -#: sql_help.c:5473 +#: sql_help.c:5753 msgid "remove a foreign table" msgstr "ta bort en främmande tabell" -#: sql_help.c:5479 +#: sql_help.c:5759 msgid "remove a function" msgstr "ta bort en funktion" -#: sql_help.c:5485 sql_help.c:5551 sql_help.c:5653 +#: sql_help.c:5765 sql_help.c:5831 sql_help.c:5933 msgid "remove a database role" msgstr "ta bort en databasroll" -#: sql_help.c:5491 +#: sql_help.c:5771 msgid "remove an index" msgstr "ta bort ett index" -#: sql_help.c:5497 +#: sql_help.c:5777 msgid "remove a procedural language" msgstr "ta bort ett procedur-språk" -#: sql_help.c:5503 +#: sql_help.c:5783 msgid "remove a materialized view" msgstr "ta bort en materialiserad vy" -#: sql_help.c:5509 +#: sql_help.c:5789 msgid "remove an operator" msgstr "ta bort en operator" -#: sql_help.c:5515 +#: sql_help.c:5795 msgid "remove an operator class" msgstr "ta bort en operatorklass" -#: sql_help.c:5521 +#: sql_help.c:5801 msgid "remove an operator family" msgstr "ta bort en operatorfamilj" -#: sql_help.c:5527 +#: sql_help.c:5807 msgid "remove database objects owned by a database role" msgstr "ta bort databasobjekt som ägs av databasroll" -#: sql_help.c:5533 -msgid "remove a row level security policy from a table" +#: sql_help.c:5813 +msgid "remove a row-level security policy from a table" msgstr "ta bort en säkerhetspolicy på radnivå från en tabell" -#: sql_help.c:5539 +#: sql_help.c:5819 msgid "remove a procedure" msgstr "ta bort en procedur" -#: sql_help.c:5545 +#: sql_help.c:5825 msgid "remove a publication" msgstr "ta bort en publicering" -#: sql_help.c:5557 +#: sql_help.c:5837 msgid "remove a routine" msgstr "ta bort en rutin" -#: sql_help.c:5563 +#: sql_help.c:5843 msgid "remove a rewrite rule" msgstr "ta bort en omskrivningsregel" -#: sql_help.c:5569 +#: sql_help.c:5849 msgid "remove a schema" msgstr "ta bort ett schema" -#: sql_help.c:5575 +#: sql_help.c:5855 msgid "remove a sequence" msgstr "ta bort en sekvens" -#: sql_help.c:5581 +#: sql_help.c:5861 msgid "remove a foreign server descriptor" msgstr "ta bort en främmande server-deskriptor" -#: sql_help.c:5587 +#: sql_help.c:5867 msgid "remove extended statistics" msgstr "ta bort utökad statistik" -#: sql_help.c:5593 +#: sql_help.c:5873 msgid "remove a subscription" msgstr "ta bort en prenumeration" -#: sql_help.c:5599 +#: sql_help.c:5879 msgid "remove a table" msgstr "ta bort en tabell" -#: sql_help.c:5605 +#: sql_help.c:5885 msgid "remove a tablespace" msgstr "ta bort ett tabellutrymme" -#: sql_help.c:5611 +#: sql_help.c:5891 msgid "remove a text search configuration" msgstr "ta bort en textsökkonfiguration" -#: sql_help.c:5617 +#: sql_help.c:5897 msgid "remove a text search dictionary" msgstr "ta bort en textsökordlista" -#: sql_help.c:5623 +#: sql_help.c:5903 msgid "remove a text search parser" msgstr "ta bort en textsökparser" -#: sql_help.c:5629 +#: sql_help.c:5909 msgid "remove a text search template" msgstr "ta bort en textsökmall" -#: sql_help.c:5635 +#: sql_help.c:5915 msgid "remove a transform" msgstr "ta bort en transform" -#: sql_help.c:5641 +#: sql_help.c:5921 msgid "remove a trigger" msgstr "ta bort en utlösare" -#: sql_help.c:5647 +#: sql_help.c:5927 msgid "remove a data type" msgstr "ta bort en datatyp" -#: sql_help.c:5659 +#: sql_help.c:5939 msgid "remove a user mapping for a foreign server" msgstr "ta bort en användarmappning för en främmande server" -#: sql_help.c:5665 +#: sql_help.c:5945 msgid "remove a view" msgstr "ta bort en vy" -#: sql_help.c:5677 +#: sql_help.c:5957 msgid "execute a prepared statement" msgstr "utför en förberedd sats" -#: sql_help.c:5683 +#: sql_help.c:5963 msgid "show the execution plan of a statement" msgstr "visa körningsplanen för en sats" -#: sql_help.c:5689 +#: sql_help.c:5969 msgid "retrieve rows from a query using a cursor" msgstr "hämta rader från en fråga med hjälp av en markör" -#: sql_help.c:5695 +#: sql_help.c:5975 msgid "define access privileges" msgstr "definera åtkomsträttigheter" -#: sql_help.c:5701 +#: sql_help.c:5981 msgid "import table definitions from a foreign server" msgstr "importera tabelldefinitioner från en främmande server" -#: sql_help.c:5707 +#: sql_help.c:5987 msgid "create new rows in a table" msgstr "skapa nya rader i en tabell" -#: sql_help.c:5713 +#: sql_help.c:5993 msgid "listen for a notification" msgstr "lyssna efter notifiering" -#: sql_help.c:5719 +#: sql_help.c:5999 msgid "load a shared library file" msgstr "ladda en delad biblioteksfil (shared library)" -#: sql_help.c:5725 +#: sql_help.c:6005 msgid "lock a table" msgstr "lås en tabell" -#: sql_help.c:5731 +#: sql_help.c:6011 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "villkorlig insert, updare eller delete av rader i en tabell" + +#: sql_help.c:6017 msgid "position a cursor" msgstr "flytta en markör" -#: sql_help.c:5737 +#: sql_help.c:6023 msgid "generate a notification" msgstr "generera en notifiering" -#: sql_help.c:5743 +#: sql_help.c:6029 msgid "prepare a statement for execution" msgstr "förbered en sats för körning" -#: sql_help.c:5749 +#: sql_help.c:6035 msgid "prepare the current transaction for two-phase commit" msgstr "avbryt aktuell transaktion för två-fas-commit" -#: sql_help.c:5755 +#: sql_help.c:6041 msgid "change the ownership of database objects owned by a database role" msgstr "byt ägare på databasobjekt som ägs av en databasroll" -#: sql_help.c:5761 +#: sql_help.c:6047 msgid "replace the contents of a materialized view" msgstr "ersätt innehållet av en materialiserad vy" -#: sql_help.c:5767 +#: sql_help.c:6053 msgid "rebuild indexes" msgstr "återskapa index" -#: sql_help.c:5773 +#: sql_help.c:6059 msgid "destroy a previously defined savepoint" msgstr "ta bort en tidigare definierad sparpunkt" -#: sql_help.c:5779 +#: sql_help.c:6065 msgid "restore the value of a run-time parameter to the default value" msgstr "återställ värde av körningsparameter till standardvärdet" -#: sql_help.c:5785 +#: sql_help.c:6071 msgid "remove access privileges" msgstr "ta bort åtkomsträttigheter" -#: sql_help.c:5797 +#: sql_help.c:6083 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "avbryt en transaktion som tidigare förberetts för två-fas-commit" -#: sql_help.c:5803 +#: sql_help.c:6089 msgid "roll back to a savepoint" msgstr "rulla tillbaka till sparpunkt" -#: sql_help.c:5809 +#: sql_help.c:6095 msgid "define a new savepoint within the current transaction" msgstr "definera en ny sparpunkt i den aktuella transaktionen" -#: sql_help.c:5815 +#: sql_help.c:6101 msgid "define or change a security label applied to an object" msgstr "definiera eller ändra en säkerhetsetikett på ett objekt" -#: sql_help.c:5821 sql_help.c:5875 sql_help.c:5911 +#: sql_help.c:6107 sql_help.c:6161 sql_help.c:6197 msgid "retrieve rows from a table or view" msgstr "hämta rader från en tabell eller vy" -#: sql_help.c:5833 +#: sql_help.c:6119 msgid "change a run-time parameter" msgstr "ändra en körningsparameter" -#: sql_help.c:5839 +#: sql_help.c:6125 msgid "set constraint check timing for the current transaction" msgstr "sätt integritetsvillkorstiming för nuvarande transaktion" -#: sql_help.c:5845 +#: sql_help.c:6131 msgid "set the current user identifier of the current session" msgstr "sätt användare för den aktiva sessionen" -#: sql_help.c:5851 +#: sql_help.c:6137 msgid "set the session user identifier and the current user identifier of the current session" msgstr "sätt sessionsanvändaridentifierare och nuvarande användaridentifierare för den aktiva sessionen" -#: sql_help.c:5857 +#: sql_help.c:6143 msgid "set the characteristics of the current transaction" msgstr "sätt inställningar för nuvarande transaktionen" -#: sql_help.c:5863 +#: sql_help.c:6149 msgid "show the value of a run-time parameter" msgstr "visa värde på en körningsparameter" -#: sql_help.c:5881 +#: sql_help.c:6167 msgid "empty a table or set of tables" msgstr "töm en eller flera tabeller" -#: sql_help.c:5887 +#: sql_help.c:6173 msgid "stop listening for a notification" msgstr "sluta att lyssna efter notifiering" -#: sql_help.c:5893 +#: sql_help.c:6179 msgid "update rows of a table" msgstr "uppdatera rader i en tabell" -#: sql_help.c:5899 +#: sql_help.c:6185 msgid "garbage-collect and optionally analyze a database" msgstr "skräpsamla och eventuellt analysera en databas" -#: sql_help.c:5905 +#: sql_help.c:6191 msgid "compute a set of rows" msgstr "beräkna en mängd rader" -#: startup.c:212 +#: startup.c:220 #, c-format msgid "-1 can only be used in non-interactive mode" msgstr "-1 kan bara användas i icke-interaktivt läge" -#: startup.c:299 -#, c-format -msgid "could not connect to server: %s" -msgstr "kunde inte ansluta till server: %s" - -#: startup.c:327 +#: startup.c:343 #, c-format msgid "could not open log file \"%s\": %m" msgstr "kunde inte öppna loggfil \"%s\": %m" -#: startup.c:439 +#: startup.c:453 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6334,27 +6605,27 @@ msgstr "" "Skriv \"help\" för hjälp.\n" "\n" -#: startup.c:589 +#: startup.c:605 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "kunde inte sätta utskriftsparameter \"%s\"" -#: startup.c:697 +#: startup.c:712 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Försök med \"%s --help\" för mer information.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." -#: startup.c:714 +#: startup.c:728 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "extra kommandoradsargument \"%s\" ignorerad" -#: startup.c:763 +#: startup.c:776 #, c-format msgid "could not find own program executable" msgstr "kunde inte hitta det egna programmets körbara fil" -#: tab-complete.c:4640 +#: tab-complete.c:5921 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6380,7 +6651,7 @@ msgstr "ogiltigt värde \"%s\" för \"%s\": förväntade sig ett heltal" msgid "invalid variable name: \"%s\"" msgstr "ogiltigt variabelnamn: \"%s\"" -#: variables.c:393 +#: variables.c:419 #, c-format msgid "" "unrecognized value \"%s\" for \"%s\"\n" @@ -6388,15 +6659,3 @@ msgid "" msgstr "" "okänt värde \"%s\" för \"%s\"\n" "Tillgängliga värden är: %s." - -#~ msgid "Opfamily Name" -#~ msgstr "Opfamiljenamn" - -#~ msgid "Proc name" -#~ msgstr "Proc-namn" - -#~ msgid "List of procedures of operator families" -#~ msgstr "Lista med procedurer i operatorfamilj" - -#~ msgid " \\g with no arguments is equivalent to a semicolon\n" -#~ msgstr " \\g utan argument är ekvivalent med ett semikolon\n" diff --git a/src/bin/psql/po/uk.po b/src/bin/psql/po/uk.po index 5037f3a245..7f412db7cd 100644 --- a/src/bin/psql/po/uk.po +++ b/src/bin/psql/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:14+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" +"POT-Creation-Date: 2021-06-28 07:14+0000\n" +"PO-Revision-Date: 2021-08-17 11:21\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,61 +14,62 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/psql.pot\n" -"X-Crowdin-File-ID: 526\n" +"X-Crowdin-File: /REL_14_DEV/psql.pot\n" +"X-Crowdin-File-ID: 768\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "збій: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "помилка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "попередження: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "не вдалося визначити поточний каталог: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "невірний бінарний файл \"%s\"" -#: ../../common/exec.c:206 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "неможливо прочитати бінарний файл \"%s\"" -#: ../../common/exec.c:214 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "неможливо знайти \"%s\" для виконання" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не вдалося змінити каталог на \"%s\": %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не можливо прочитати символічне послання \"%s\": %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:409 #, c-format -msgid "pclose failed: %m" -msgstr "помилка pclose: %m" +msgid "%s() failed: %m" +msgstr "%s() помилка: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 -#: command.c:1255 input.c:227 mainloop.c:81 mainloop.c:402 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 +#: command.c:1315 command.c:3246 command.c:3295 command.c:3412 input.c:227 +#: mainloop.c:81 mainloop.c:402 #, c-format msgid "out of memory" msgstr "недостатньо пам'яті" @@ -89,7 +90,7 @@ msgstr "неможливо дублювати нульовий покажчик msgid "could not look up effective user ID %ld: %s" msgstr "не можу знайти користувача з ефективним ID %ld: %s" -#: ../../common/username.c:45 command.c:559 +#: ../../common/username.c:45 command.c:565 msgid "user does not exist" msgstr "користувача не існує" @@ -132,16 +133,11 @@ msgstr "дочірній процес завершився з невизнани msgid "Cancel request sent\n" msgstr "Запит на скасування відправлений\n" -#: ../../fe_utils/cancel.c:165 +#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 msgid "Could not send cancel request: " -msgstr "не вдалося надіслати запит на скасування: " +msgstr "Не вдалося надіслати запит на скасування: " -#: ../../fe_utils/cancel.c:210 -#, c-format -msgid "Could not send cancel request: %s" -msgstr "Не вдалося надіслати скасування запиту: %s" - -#: ../../fe_utils/print.c:350 +#: ../../fe_utils/print.c:336 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" @@ -150,319 +146,324 @@ msgstr[1] "(%lu рядки)" msgstr[2] "(%lu рядків)" msgstr[3] "(%lu рядка)" -#: ../../fe_utils/print.c:3055 +#: ../../fe_utils/print.c:3039 #, c-format msgid "Interrupted\n" msgstr "Перервано\n" -#: ../../fe_utils/print.c:3119 +#: ../../fe_utils/print.c:3103 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Неможливо додати заголовок до вмісту таблиці: кількість колонок %d перевищено.\n" -#: ../../fe_utils/print.c:3159 +#: ../../fe_utils/print.c:3143 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "Неможливо додати комірку до вмісту таблиці: перевищено загальну кількість комірок %d.\n" -#: ../../fe_utils/print.c:3414 +#: ../../fe_utils/print.c:3401 #, c-format msgid "invalid output format (internal error): %d" msgstr "невірний формат виводу (внутрішня помилка): %d" -#: ../../fe_utils/psqlscan.l:694 +#: ../../fe_utils/psqlscan.l:697 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "пропуск рекурсивного розгортання змінної \"%s\"" -#: command.c:224 +#: command.c:230 #, c-format msgid "invalid command \\%s" msgstr "Невірна команда \\%s" -#: command.c:226 +#: command.c:232 #, c-format msgid "Try \\? for help." msgstr "Спробуйте \\? для отримання довідки." -#: command.c:244 +#: command.c:250 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: зайвий аргумент \"%s\" проігноровано" -#: command.c:296 +#: command.c:302 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "\\%s команду проігноровано; скористайтесь \\endif або Ctrl-C, щоб вийти з поточного блоку \\if" -#: command.c:557 +#: command.c:563 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "неможливо отримати домашню директорію для користувача ID %ld: %s" -#: command.c:575 +#: command.c:581 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: неможливо змінити директорію на \"%s\": %m" -#: command.c:600 +#: command.c:606 #, c-format msgid "You are currently not connected to a database.\n" msgstr "На даний момент ви від'єднанні від бази даних.\n" -#: command.c:613 +#: command.c:616 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Ви під'єднані до бази даних \"%s\" як користувач \"%s\" за аресою \"%s\" на порту \"%s\".\n" -#: command.c:616 +#: command.c:619 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Ви під'єднані до бази даних \"%s\" як користувач \"%s\" через сокет в \"%s\" на порту \"%s\".\n" -#: command.c:622 +#: command.c:625 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Ви під'єднані до бази даних \"%s\" як користувач \"%s\" на хості \"%s\" (за аресою \"%s\") на порту \"%s\".\n" -#: command.c:625 +#: command.c:628 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Ви під'єднані до бази даних \"%s\" як користувач \"%s\" на хості \"%s\" на порту \"%s\".\n" -#: command.c:965 command.c:1061 command.c:2550 +#: command.c:1012 command.c:1121 command.c:2602 #, c-format msgid "no query buffer" msgstr "немає буферу запитів" -#: command.c:998 command.c:5061 +#: command.c:1045 command.c:5304 #, c-format msgid "invalid line number: %s" msgstr "невірний номер рядка: %s" -#: command.c:1052 +#: command.c:1112 #, c-format msgid "The server (version %s) does not support editing function source." msgstr "Сервер (версія %s) не пітдримує редагування вихідного коду функцій." -#: command.c:1055 +#: command.c:1115 #, c-format msgid "The server (version %s) does not support editing view definitions." msgstr "Сервер (версія %s) не підтримує редагування визначення подання." -#: command.c:1137 +#: command.c:1197 msgid "No changes" msgstr "Без змін" -#: command.c:1216 +#: command.c:1276 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: невірне ім'я кодування або не знайдено процедуру конверсії" -#: command.c:1251 command.c:1992 command.c:3253 command.c:5163 common.c:174 -#: common.c:223 common.c:388 common.c:1237 common.c:1265 common.c:1373 -#: common.c:1480 common.c:1518 copy.c:488 copy.c:707 help.c:62 large_obj.c:157 -#: large_obj.c:192 large_obj.c:254 +#: command.c:1311 command.c:2052 command.c:3242 command.c:3434 command.c:5406 +#: common.c:174 common.c:223 common.c:392 common.c:1248 common.c:1276 +#: common.c:1385 common.c:1492 common.c:1530 copy.c:488 copy.c:709 help.c:62 +#: large_obj.c:157 large_obj.c:192 large_obj.c:254 startup.c:298 #, c-format msgid "%s" msgstr "%s" -#: command.c:1258 +#: command.c:1318 msgid "There is no previous error." msgstr "Попередня помилка відсутня." -#: command.c:1371 +#: command.c:1431 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: відсутня права дужка" -#: command.c:1548 command.c:1853 command.c:1867 command.c:1884 command.c:2044 -#: command.c:2281 command.c:2517 command.c:2557 +#: command.c:1608 command.c:1913 command.c:1927 command.c:1944 command.c:2106 +#: command.c:2342 command.c:2569 command.c:2609 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: не вистачає обов'язкового аргументу" -#: command.c:1679 +#: command.c:1739 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: не може йти після \\else" -#: command.c:1684 +#: command.c:1744 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: немає відповідного \\if" -#: command.c:1748 +#: command.c:1808 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: не може йти після \\else" -#: command.c:1753 +#: command.c:1813 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: немає відповідного \\if" -#: command.c:1793 +#: command.c:1853 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: немає відповідного \\if" -#: command.c:1948 +#: command.c:2008 msgid "Query buffer is empty." msgstr "Буфер запиту порожній." -#: command.c:1970 +#: command.c:2030 msgid "Enter new password: " msgstr "Введіть новий пароль:" -#: command.c:1971 +#: command.c:2031 msgid "Enter it again: " msgstr "Введіть знову: " -#: command.c:1975 +#: command.c:2035 #, c-format msgid "Passwords didn't match." msgstr "Паролі не співпадають." -#: command.c:2074 +#: command.c:2135 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: не вдалося прочитати значення змінної" -#: command.c:2177 +#: command.c:2238 msgid "Query buffer reset (cleared)." msgstr "Буфер запитів скинуто (очищено)." -#: command.c:2199 +#: command.c:2260 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Історію записано до файлу \"%s\".\n" -#: command.c:2286 +#: command.c:2347 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: змінна середовища не повинна містити \"=\"" -#: command.c:2347 +#: command.c:2399 #, c-format msgid "The server (version %s) does not support showing function source." msgstr "Сервер (версія %s) не пітдримує відображнення вихідного коду функцій." -#: command.c:2350 +#: command.c:2402 #, c-format msgid "The server (version %s) does not support showing view definitions." msgstr "Сервер (версія %s) не підтримує відображення визначення подання." -#: command.c:2357 +#: command.c:2409 #, c-format msgid "function name is required" msgstr "необхідне ім'я функції" -#: command.c:2359 +#: command.c:2411 #, c-format msgid "view name is required" msgstr "необхідне ім'я подання" -#: command.c:2489 +#: command.c:2541 msgid "Timing is on." msgstr "Таймер увімкнено." -#: command.c:2491 +#: command.c:2543 msgid "Timing is off." msgstr "Таймер вимкнено." -#: command.c:2576 command.c:2604 command.c:3661 command.c:3664 command.c:3667 -#: command.c:3673 command.c:3675 command.c:3683 command.c:3693 command.c:3702 -#: command.c:3716 command.c:3733 command.c:3791 common.c:70 copy.c:331 +#: command.c:2628 command.c:2656 command.c:3873 command.c:3876 command.c:3879 +#: command.c:3885 command.c:3887 command.c:3913 command.c:3923 command.c:3935 +#: command.c:3949 command.c:3976 command.c:4034 common.c:70 copy.c:331 #: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:2988 startup.c:236 startup.c:287 +#: command.c:3047 startup.c:237 startup.c:287 msgid "Password: " msgstr "Пароль: " -#: command.c:2993 startup.c:284 +#: command.c:3052 startup.c:284 #, c-format msgid "Password for user %s: " msgstr "Пароль користувача %s:" -#: command.c:3064 +#: command.c:3104 #, c-format -msgid "All connection parameters must be supplied because no database connection exists" -msgstr "Мають бути введені усі параметри з'єднання, оскільки відсутнє підключення до бази даних" +msgid "Do not give user, host, or port separately when using a connection string" +msgstr "Не надайте користувачеві, хосту або порту окремо під час використання рядка підключення" -#: command.c:3257 +#: command.c:3139 +#, c-format +msgid "No database connection exists to re-use parameters from" +msgstr "Не існує підключення до бази даних для повторного використання параметрів" + +#: command.c:3440 #, c-format msgid "Previous connection kept" msgstr "Попереднє підключення триває" -#: command.c:3261 +#: command.c:3446 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3310 +#: command.c:3502 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Ви під'єднані до бази даних \"%s\" як користувач \"%s\" за адресою \"%s\" на порту \"%s\".\n" -#: command.c:3313 +#: command.c:3505 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Ви тепер під'єднані до бази даних \"%s\" як користувач \"%s\" через сокет в \"%s\" на порту \"%s\".\n" -#: command.c:3319 +#: command.c:3511 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Ви під'єднані до бази даних \"%s\" як користувач \"%s\" на хості \"%s\" (за адресою \"%s\") на порту \"%s\".\n" -#: command.c:3322 +#: command.c:3514 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Ви тепер під'єднані до бази даних \"%s\" як користувач \"%s\" на хості \"%s\" на порту \"%s\".\n" -#: command.c:3327 +#: command.c:3519 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Ви тепер під'єднані до бази даних \"%s\" як користувач \"%s\".\n" -#: command.c:3360 +#: command.c:3559 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, сервер %s)\n" -#: command.c:3368 +#: command.c:3567 #, c-format msgid "WARNING: %s major version %s, server major version %s.\n" " Some psql features might not work.\n" msgstr "УВАГА: мажорна версія %s %s, мажорна версія сервера %s.\n" " Деякі функції psql можуть не працювати.\n" -#: command.c:3407 +#: command.c:3606 #, c-format msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" msgstr "З'єднання SSL (протокол: %s, шифр: %s, біти: %s, компресія: %s)\n" -#: command.c:3408 command.c:3409 command.c:3410 +#: command.c:3607 command.c:3608 command.c:3609 msgid "unknown" msgstr "невідомо" -#: command.c:3411 help.c:45 +#: command.c:3610 help.c:45 msgid "off" msgstr "вимк" -#: command.c:3411 help.c:45 +#: command.c:3610 help.c:45 msgid "on" msgstr "увімк" -#: command.c:3425 +#: command.c:3624 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "З'єднання зашифровано GSSAPI\n" -#: command.c:3445 +#: command.c:3644 #, c-format msgid "WARNING: Console code page (%u) differs from Windows code page (%u)\n" " 8-bit characters might not work correctly. See psql reference\n" @@ -471,172 +472,172 @@ msgstr "УВАГА: Кодова сторінка консолі (%u) відрі " 8-бітові символи можуть працювати неправильно. Детальніше у розділі \n" " \"Нотатки для користувачів Windows\" у документації psql.\n" -#: command.c:3549 +#: command.c:3749 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "змінна середовища PSQL_EDITOR_LINENUMBER_ARG має бути встановлена, щоб вказувати номер рядка" -#: command.c:3578 +#: command.c:3778 #, c-format msgid "could not start editor \"%s\"" msgstr "неможливо запустити редактор \"%s\"" -#: command.c:3580 +#: command.c:3780 #, c-format msgid "could not start /bin/sh" msgstr "неможливо запустити /bin/sh" -#: command.c:3618 +#: command.c:3830 #, c-format msgid "could not locate temporary directory: %s" msgstr "неможливо знайти тимчасову директорію: %s" -#: command.c:3645 +#: command.c:3857 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "неможливо відкрити тимчасовий файл \"%s\": %m" -#: command.c:3950 +#: command.c:4193 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: неоднозначна абревіатура \"%s\" відповідає обом \"%s\" і \"%s" -#: command.c:3970 +#: command.c:4213 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset: дозволені формати: aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:3989 +#: command.c:4232 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: дозволені стилі ліній: ascii, old-ascii, unicode" -#: command.c:4004 +#: command.c:4247 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: дозволені стилі ліній рамок Unicode: single, double" -#: command.c:4019 +#: command.c:4262 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: дозволені стилі ліній стовпців для Unicode: single, double" -#: command.c:4034 +#: command.c:4277 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: дозволені стилі ліній заголовків для Unicode: single, double" -#: command.c:4077 +#: command.c:4320 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep повинен бути однобайтовим символом" -#: command.c:4082 +#: command.c:4325 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldsep не може бути подвійною лапкою, новим рядком або поверненням каретки" -#: command.c:4219 command.c:4407 +#: command.c:4462 command.c:4650 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: невідомий параметр: %s" -#: command.c:4239 +#: command.c:4482 #, c-format msgid "Border style is %d.\n" msgstr "Стиль рамки %d.\n" -#: command.c:4245 +#: command.c:4488 #, c-format msgid "Target width is unset.\n" msgstr "Цільова ширина не встановлена.\n" -#: command.c:4247 +#: command.c:4490 #, c-format msgid "Target width is %d.\n" msgstr "Цільова ширина %d.\n" -#: command.c:4254 +#: command.c:4497 #, c-format msgid "Expanded display is on.\n" msgstr "Розширене відображення увімкнуто.\n" -#: command.c:4256 +#: command.c:4499 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Розширене відображення використовується автоматично.\n" -#: command.c:4258 +#: command.c:4501 #, c-format msgid "Expanded display is off.\n" msgstr "Розширене відображення вимкнуто.\n" -#: command.c:4264 +#: command.c:4507 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Розділювач полів CSV: \"%s\".\n" -#: command.c:4272 command.c:4280 +#: command.c:4515 command.c:4523 #, c-format msgid "Field separator is zero byte.\n" msgstr "Розділювач полів - нульовий байт.\n" -#: command.c:4274 +#: command.c:4517 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Розділювач полів \"%s\".\n" -#: command.c:4287 +#: command.c:4530 #, c-format msgid "Default footer is on.\n" msgstr "Нинжній колонтитул увімкнуто за замовчуванням.\n" -#: command.c:4289 +#: command.c:4532 #, c-format msgid "Default footer is off.\n" msgstr "Нинжній колонтитул вимкнуто за замовчуванням.\n" -#: command.c:4295 +#: command.c:4538 #, c-format msgid "Output format is %s.\n" msgstr "Формат виводу %s.\n" -#: command.c:4301 +#: command.c:4544 #, c-format msgid "Line style is %s.\n" msgstr "Стиль лінії %s.\n" -#: command.c:4308 +#: command.c:4551 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null відображається як \"%s\".\n" -#: command.c:4316 +#: command.c:4559 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Локалізоване виведення чисел ввімкнено.\n" -#: command.c:4318 +#: command.c:4561 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Локалізоване виведення чисел вимкнено.\n" -#: command.c:4325 +#: command.c:4568 #, c-format msgid "Pager is used for long output.\n" msgstr "Пейджер використовується для виведення довгого тексту.\n" -#: command.c:4327 +#: command.c:4570 #, c-format msgid "Pager is always used.\n" msgstr "Завжди використовується пейджер.\n" -#: command.c:4329 +#: command.c:4572 #, c-format msgid "Pager usage is off.\n" msgstr "Пейджер не використовується.\n" -#: command.c:4335 +#: command.c:4578 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" @@ -645,87 +646,87 @@ msgstr[1] "Пейджер не буде використовуватися дл msgstr[2] "Пейджер не буде використовуватися для менш ніж %d рядків.\n" msgstr[3] "Пейджер не буде використовуватися для менш ніж %d рядка.\n" -#: command.c:4345 command.c:4355 +#: command.c:4588 command.c:4598 #, c-format msgid "Record separator is zero byte.\n" msgstr "Розділювач записів - нульовий байт.\n" -#: command.c:4347 +#: command.c:4590 #, c-format msgid "Record separator is .\n" msgstr "Розділювач записів: .\n" -#: command.c:4349 +#: command.c:4592 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Розділювач записів: \"%s\".\n" -#: command.c:4362 +#: command.c:4605 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Табличні атрибути \"%s\".\n" -#: command.c:4365 +#: command.c:4608 #, c-format msgid "Table attributes unset.\n" msgstr "Атрибути таблиць не задані.\n" -#: command.c:4372 +#: command.c:4615 #, c-format msgid "Title is \"%s\".\n" msgstr "Заголовок: \"%s\".\n" -#: command.c:4374 +#: command.c:4617 #, c-format msgid "Title is unset.\n" msgstr "Заголовок не встановлено.\n" -#: command.c:4381 +#: command.c:4624 #, c-format msgid "Tuples only is on.\n" msgstr "Увімкнуто тільки кортежі.\n" -#: command.c:4383 +#: command.c:4626 #, c-format msgid "Tuples only is off.\n" msgstr "Вимкнуто тільки кортежі.\n" -#: command.c:4389 +#: command.c:4632 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Стиль ліній рамки для Unicode: \"%s\".\n" -#: command.c:4395 +#: command.c:4638 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Стиль ліній стовпців для Unicode: \"%s\".\n" -#: command.c:4401 +#: command.c:4644 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Стиль ліній заголовків для Unicode: \"%s\".\n" -#: command.c:4634 +#: command.c:4877 #, c-format msgid "\\!: failed" msgstr "\\!: помилка" -#: command.c:4659 common.c:648 +#: command.c:4902 common.c:652 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch не може бути використано із пустим запитом" -#: command.c:4700 +#: command.c:4943 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (кожні %g сек)\n" -#: command.c:4703 +#: command.c:4946 #, c-format msgid "%s (every %gs)\n" msgstr "%s (кожні %g сек)\n" -#: command.c:4757 command.c:4764 common.c:548 common.c:555 common.c:1220 +#: command.c:5000 command.c:5007 common.c:552 common.c:559 common.c:1231 #, c-format msgid "********* QUERY **********\n" "%s\n" @@ -734,12 +735,12 @@ msgstr "********* ЗАПИТ **********\n" "%s\n" "**************************\n\n" -#: command.c:4956 +#: command.c:5199 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\" не є поданням" -#: command.c:4972 +#: command.c:5215 #, c-format msgid "could not parse reloptions array" msgstr "неможливо розібрати масив reloptions" @@ -769,77 +770,82 @@ msgstr "З'єднання із сервером втрачено. Спроба msgid "Failed.\n" msgstr "Помилка.\n" -#: common.c:326 +#: common.c:330 #, c-format msgid "Succeeded.\n" msgstr "Вдало.\n" -#: common.c:378 common.c:938 common.c:1155 +#: common.c:382 common.c:949 common.c:1166 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "неочікуваний PQresultStatus: %d" -#: common.c:487 +#: common.c:491 #, c-format msgid "Time: %.3f ms\n" msgstr "Час: %.3f мс\n" -#: common.c:502 +#: common.c:506 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Час: %.3f мс (%02d:%06.3f)\n" -#: common.c:511 +#: common.c:515 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Час: %.3f мс (%02d:%02d:%06.3f)\n" -#: common.c:518 +#: common.c:522 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Час: %.3f мс (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:542 common.c:600 common.c:1191 +#: common.c:546 common.c:604 common.c:1202 #, c-format msgid "You are currently not connected to a database." msgstr "На даний момент ви від'єднанні від бази даних." -#: common.c:655 +#: common.c:659 #, c-format msgid "\\watch cannot be used with COPY" msgstr "\\watch не може бути використано з COPY" -#: common.c:660 +#: common.c:664 #, c-format msgid "unexpected result status for \\watch" msgstr "неочікуваний результат статусу для \\watch" -#: common.c:690 +#: common.c:694 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "Асинхронне сповіщення \"%s\" з навантаженням \"%s\" отримане від серверного процесу з PID %d.\n" -#: common.c:693 +#: common.c:697 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "Асинхронне сповіщення \"%s\" отримане від серверного процесу з PID %d.\n" -#: common.c:726 common.c:743 +#: common.c:730 common.c:747 #, c-format msgid "could not print result table: %m" msgstr "не вдалося надрукувати таблицю результатів: %m" -#: common.c:764 +#: common.c:768 #, c-format msgid "no rows returned for \\gset" msgstr "немає рядків повернутих для \\gset" -#: common.c:769 +#: common.c:773 #, c-format msgid "more than one row returned for \\gset" msgstr "більш, ніж один рядок повернуто для \\gset" -#: common.c:1200 +#: common.c:791 +#, c-format +msgid "attempt to \\gset into specially treated variable \"%s\" ignored" +msgstr "спробу виконати \\gset в спеціальну змінну \"%s\" проігноровано" + +#: common.c:1211 #, c-format msgid "***(Single step mode: verify command)*******************************************\n" "%s\n" @@ -848,33 +854,33 @@ msgstr "***(Покроковий режим: перевірка команди)* "%s\n" "***(Enter - виповнити; х і Enter - відмінити)********************\n" -#: common.c:1255 +#: common.c:1266 #, c-format msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." msgstr "Сервер (версія %s) не підтримує точки збереження для ON_ERROR_ROLLBACK." -#: common.c:1318 +#: common.c:1329 #, c-format msgid "STATEMENT: %s" msgstr "ІНСТРУКЦІЯ: %s" -#: common.c:1361 +#: common.c:1373 #, c-format msgid "unexpected transaction status (%d)" msgstr "неочікуваний стан транзакції (%d)" -#: common.c:1502 describe.c:2001 +#: common.c:1514 describe.c:2179 msgid "Column" msgstr "Стовпець" -#: common.c:1503 describe.c:177 describe.c:393 describe.c:411 describe.c:456 -#: describe.c:473 describe.c:962 describe.c:1126 describe.c:1711 -#: describe.c:1735 describe.c:2002 describe.c:3729 describe.c:3939 -#: describe.c:4172 describe.c:5378 +#: common.c:1515 describe.c:178 describe.c:396 describe.c:414 describe.c:459 +#: describe.c:476 describe.c:1128 describe.c:1292 describe.c:1878 +#: describe.c:1902 describe.c:2180 describe.c:4048 describe.c:4271 +#: describe.c:4496 describe.c:5794 msgid "Type" msgstr "Тип" -#: common.c:1552 +#: common.c:1564 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "Команда не має результату або результат не має стовпців.\n" @@ -939,11 +945,11 @@ msgid "Enter data to be copied followed by a newline.\n" msgstr "Введіть дані для копювання, розділяючи переносом рядка.\n" "Завершіть введення за допомогою \"\\.\" або за допомогою сигналу EOF." -#: copy.c:669 +#: copy.c:671 msgid "aborted because of read failure" msgstr "перервано через помилку читання" -#: copy.c:703 +#: copy.c:705 msgid "trying to exit copy mode" msgstr "спроба вийти з режиму копіювання" @@ -992,761 +998,766 @@ msgstr "\\crosstabview: неоднозначна назва стовпця: \"%s msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: ім'я стовпця не знайдено: \"%s\"" -#: describe.c:75 describe.c:373 describe.c:678 describe.c:810 describe.c:954 -#: describe.c:1115 describe.c:1187 describe.c:3718 describe.c:3926 -#: describe.c:4170 describe.c:4261 describe.c:4528 describe.c:4688 -#: describe.c:4929 describe.c:5004 describe.c:5015 describe.c:5077 -#: describe.c:5502 describe.c:5585 +#: describe.c:76 describe.c:376 describe.c:728 describe.c:924 describe.c:1120 +#: describe.c:1281 describe.c:1353 describe.c:4036 describe.c:4258 +#: describe.c:4494 describe.c:4585 describe.c:4731 describe.c:4944 +#: describe.c:5104 describe.c:5345 describe.c:5420 describe.c:5431 +#: describe.c:5493 describe.c:5918 describe.c:6001 msgid "Schema" msgstr "Схема" -#: describe.c:76 describe.c:174 describe.c:242 describe.c:250 describe.c:374 -#: describe.c:679 describe.c:811 describe.c:872 describe.c:955 describe.c:1188 -#: describe.c:3719 describe.c:3927 describe.c:4093 describe.c:4171 -#: describe.c:4262 describe.c:4341 describe.c:4529 describe.c:4613 -#: describe.c:4689 describe.c:4930 describe.c:5005 describe.c:5016 -#: describe.c:5078 describe.c:5275 describe.c:5359 describe.c:5583 -#: describe.c:5755 describe.c:5995 +#: describe.c:77 describe.c:175 describe.c:243 describe.c:251 describe.c:377 +#: describe.c:729 describe.c:925 describe.c:1038 describe.c:1121 +#: describe.c:1354 describe.c:4037 describe.c:4259 describe.c:4417 +#: describe.c:4495 describe.c:4586 describe.c:4665 describe.c:4732 +#: describe.c:4945 describe.c:5029 describe.c:5105 describe.c:5346 +#: describe.c:5421 describe.c:5432 describe.c:5494 describe.c:5691 +#: describe.c:5775 describe.c:5999 describe.c:6171 describe.c:6411 msgid "Name" msgstr "Назва" -#: describe.c:77 describe.c:386 describe.c:404 describe.c:450 describe.c:467 +#: describe.c:78 describe.c:389 describe.c:407 describe.c:453 describe.c:470 msgid "Result data type" msgstr "Тип даних результату" -#: describe.c:85 describe.c:98 describe.c:102 describe.c:387 describe.c:405 -#: describe.c:451 describe.c:468 +#: describe.c:86 describe.c:99 describe.c:103 describe.c:390 describe.c:408 +#: describe.c:454 describe.c:471 msgid "Argument data types" msgstr "Типи даних аргументів" -#: describe.c:110 describe.c:117 describe.c:185 describe.c:273 describe.c:513 -#: describe.c:727 describe.c:826 describe.c:897 describe.c:1190 describe.c:2020 -#: describe.c:3506 describe.c:3779 describe.c:3973 describe.c:4124 -#: describe.c:4198 describe.c:4271 describe.c:4354 describe.c:4437 -#: describe.c:4556 describe.c:4622 describe.c:4690 describe.c:4831 -#: describe.c:4873 describe.c:4946 describe.c:5008 describe.c:5017 -#: describe.c:5079 describe.c:5301 describe.c:5381 describe.c:5516 -#: describe.c:5586 large_obj.c:290 large_obj.c:300 +#: describe.c:111 describe.c:118 describe.c:186 describe.c:274 describe.c:523 +#: describe.c:777 describe.c:940 describe.c:1063 describe.c:1356 +#: describe.c:2200 describe.c:3823 describe.c:4108 describe.c:4305 +#: describe.c:4448 describe.c:4522 describe.c:4595 describe.c:4678 +#: describe.c:4853 describe.c:4972 describe.c:5038 describe.c:5106 +#: describe.c:5247 describe.c:5289 describe.c:5362 describe.c:5424 +#: describe.c:5433 describe.c:5495 describe.c:5717 describe.c:5797 +#: describe.c:5932 describe.c:6002 large_obj.c:290 large_obj.c:300 msgid "Description" msgstr "Опис" -#: describe.c:135 +#: describe.c:136 msgid "List of aggregate functions" msgstr "Перелік агрегатних функцій" -#: describe.c:160 +#: describe.c:161 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Сервер (версія %s) не підтримує методи доступу." -#: describe.c:175 +#: describe.c:176 msgid "Index" msgstr "Індекс" -#: describe.c:176 describe.c:3737 describe.c:3952 describe.c:5503 +#: describe.c:177 describe.c:4056 describe.c:4284 describe.c:5919 msgid "Table" msgstr "Таблиця" -#: describe.c:184 describe.c:5280 +#: describe.c:185 describe.c:5696 msgid "Handler" msgstr "Обробник" -#: describe.c:203 +#: describe.c:204 msgid "List of access methods" msgstr "Список методів доступу" -#: describe.c:229 +#: describe.c:230 #, c-format msgid "The server (version %s) does not support tablespaces." msgstr "Сервер (версія %s) не підтримує табличні простори." -#: describe.c:243 describe.c:251 describe.c:501 describe.c:717 describe.c:873 -#: describe.c:1114 describe.c:3730 describe.c:3928 describe.c:4097 -#: describe.c:4343 describe.c:4614 describe.c:5276 describe.c:5360 -#: describe.c:5756 describe.c:5893 describe.c:5996 describe.c:6111 -#: describe.c:6190 large_obj.c:289 +#: describe.c:244 describe.c:252 describe.c:504 describe.c:767 describe.c:1039 +#: describe.c:1280 describe.c:4049 describe.c:4260 describe.c:4421 +#: describe.c:4667 describe.c:5030 describe.c:5692 describe.c:5776 +#: describe.c:6172 describe.c:6309 describe.c:6412 describe.c:6535 +#: describe.c:6613 large_obj.c:289 msgid "Owner" msgstr "Власник" -#: describe.c:244 describe.c:252 +#: describe.c:245 describe.c:253 msgid "Location" msgstr "Розташування" -#: describe.c:263 describe.c:3323 +#: describe.c:264 describe.c:3639 msgid "Options" msgstr "Параметри" -#: describe.c:268 describe.c:690 describe.c:889 describe.c:3771 describe.c:3775 +#: describe.c:269 describe.c:740 describe.c:1055 describe.c:4100 +#: describe.c:4104 msgid "Size" msgstr "Розмір" -#: describe.c:290 +#: describe.c:291 msgid "List of tablespaces" msgstr "Список табличних просторів" -#: describe.c:333 +#: describe.c:336 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df приймає в якості параметрів тільки [anptwS+]" -#: describe.c:341 describe.c:352 +#: describe.c:344 describe.c:355 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df не приймає параметр \"%c\" із сервером версії %s" #. translator: "agg" is short for "aggregate" -#: describe.c:389 describe.c:407 describe.c:453 describe.c:470 +#: describe.c:392 describe.c:410 describe.c:456 describe.c:473 msgid "agg" msgstr "агр." -#: describe.c:390 describe.c:408 +#: describe.c:393 describe.c:411 msgid "window" msgstr "вікно" -#: describe.c:391 +#: describe.c:394 msgid "proc" msgstr "проц" -#: describe.c:392 describe.c:410 describe.c:455 describe.c:472 +#: describe.c:395 describe.c:413 describe.c:458 describe.c:475 msgid "func" msgstr "функ" -#: describe.c:409 describe.c:454 describe.c:471 describe.c:1324 +#: describe.c:412 describe.c:457 describe.c:474 describe.c:1490 msgid "trigger" msgstr "тригер" -#: describe.c:483 +#: describe.c:486 msgid "immutable" msgstr "постійна" -#: describe.c:484 +#: describe.c:487 msgid "stable" msgstr "стабільна" -#: describe.c:485 +#: describe.c:488 msgid "volatile" msgstr "мінлива" -#: describe.c:486 +#: describe.c:489 msgid "Volatility" msgstr "Мінливість" -#: describe.c:494 +#: describe.c:497 msgid "restricted" msgstr "обмежений" -#: describe.c:495 +#: describe.c:498 msgid "safe" msgstr "безпечний" -#: describe.c:496 +#: describe.c:499 msgid "unsafe" msgstr "небезпечний" -#: describe.c:497 +#: describe.c:500 msgid "Parallel" msgstr "Паралельність" -#: describe.c:502 +#: describe.c:505 msgid "definer" msgstr "визначник" -#: describe.c:503 +#: describe.c:506 msgid "invoker" msgstr "викликач" -#: describe.c:504 +#: describe.c:507 msgid "Security" msgstr "Безпека" -#: describe.c:511 +#: describe.c:512 msgid "Language" msgstr "Мова" -#: describe.c:512 +#: describe.c:516 describe.c:520 msgid "Source code" msgstr "Вихідний код" -#: describe.c:641 +#: describe.c:691 msgid "List of functions" msgstr "Список функцій" -#: describe.c:689 +#: describe.c:739 msgid "Internal name" msgstr "Внутрішнє назва" -#: describe.c:711 +#: describe.c:761 msgid "Elements" msgstr "Елементи" -#: describe.c:768 +#: describe.c:822 msgid "List of data types" msgstr "Список типів даних" -#: describe.c:812 +#: describe.c:926 msgid "Left arg type" msgstr "Тип лівого аргумента" -#: describe.c:813 +#: describe.c:927 msgid "Right arg type" msgstr "Тип правого аргумента" -#: describe.c:814 +#: describe.c:928 msgid "Result type" msgstr "Результуючий тип" -#: describe.c:819 describe.c:4349 describe.c:4414 describe.c:4420 -#: describe.c:4830 describe.c:6362 describe.c:6366 +#: describe.c:933 describe.c:4673 describe.c:4830 describe.c:4836 +#: describe.c:5246 describe.c:6784 describe.c:6788 msgid "Function" msgstr "Функція" -#: describe.c:844 +#: describe.c:1010 msgid "List of operators" msgstr "Список операторів" -#: describe.c:874 +#: describe.c:1040 msgid "Encoding" msgstr "Кодування" -#: describe.c:879 describe.c:4530 +#: describe.c:1045 describe.c:4946 msgid "Collate" msgstr "Порядок сортування" -#: describe.c:880 describe.c:4531 +#: describe.c:1046 describe.c:4947 msgid "Ctype" msgstr "Ctype" -#: describe.c:893 +#: describe.c:1059 msgid "Tablespace" msgstr "Табличний простір" -#: describe.c:915 +#: describe.c:1081 msgid "List of databases" msgstr "Список баз даних" -#: describe.c:956 describe.c:1117 describe.c:3720 +#: describe.c:1122 describe.c:1283 describe.c:4038 msgid "table" msgstr "таблиця" -#: describe.c:957 describe.c:3721 +#: describe.c:1123 describe.c:4039 msgid "view" msgstr "подання" -#: describe.c:958 describe.c:3722 +#: describe.c:1124 describe.c:4040 msgid "materialized view" msgstr "матеріалізоване подання" -#: describe.c:959 describe.c:1119 describe.c:3724 +#: describe.c:1125 describe.c:1285 describe.c:4042 msgid "sequence" msgstr "послідовність" -#: describe.c:960 describe.c:3726 +#: describe.c:1126 describe.c:4045 msgid "foreign table" msgstr "зовнішня таблиця" -#: describe.c:961 describe.c:3727 describe.c:3937 +#: describe.c:1127 describe.c:4046 describe.c:4269 msgid "partitioned table" msgstr "секційна таблиця" -#: describe.c:973 +#: describe.c:1139 msgid "Column privileges" msgstr "Права для стовпців" -#: describe.c:1004 describe.c:1038 +#: describe.c:1170 describe.c:1204 msgid "Policies" msgstr "Політики" -#: describe.c:1070 describe.c:6052 describe.c:6056 +#: describe.c:1236 describe.c:6476 describe.c:6480 msgid "Access privileges" msgstr "Права доступу" -#: describe.c:1101 +#: describe.c:1267 #, c-format msgid "The server (version %s) does not support altering default privileges." msgstr "Сервер (версія %s) не підтримує зміну прав за замовчуванням." -#: describe.c:1121 +#: describe.c:1287 msgid "function" msgstr "функція" -#: describe.c:1123 +#: describe.c:1289 msgid "type" msgstr "тип" -#: describe.c:1125 +#: describe.c:1291 msgid "schema" msgstr "схема" -#: describe.c:1149 +#: describe.c:1315 msgid "Default access privileges" msgstr "Права доступу за замовчуванням" -#: describe.c:1189 +#: describe.c:1355 msgid "Object" msgstr "Об'єкт" -#: describe.c:1203 +#: describe.c:1369 msgid "table constraint" msgstr "обмеження таблиці" -#: describe.c:1225 +#: describe.c:1391 msgid "domain constraint" msgstr "обмеження домену" -#: describe.c:1253 +#: describe.c:1419 msgid "operator class" msgstr "клас операторів" -#: describe.c:1282 +#: describe.c:1448 msgid "operator family" msgstr "сімейство операторів" -#: describe.c:1304 +#: describe.c:1470 msgid "rule" msgstr "правило" -#: describe.c:1346 +#: describe.c:1512 msgid "Object descriptions" msgstr "Опис об'єкту" -#: describe.c:1402 describe.c:3843 +#: describe.c:1568 describe.c:4175 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Не знайдено жодного відношення під назвою \"%s\"." -#: describe.c:1405 describe.c:3846 +#: describe.c:1571 describe.c:4178 #, c-format msgid "Did not find any relations." msgstr "Не знайдено жодного відношення." -#: describe.c:1660 +#: describe.c:1827 #, c-format msgid "Did not find any relation with OID %s." msgstr "Не знайдено жодного відношення з OID %s." -#: describe.c:1712 describe.c:1736 +#: describe.c:1879 describe.c:1903 msgid "Start" msgstr "Початок" -#: describe.c:1713 describe.c:1737 +#: describe.c:1880 describe.c:1904 msgid "Minimum" msgstr "Мінімум" -#: describe.c:1714 describe.c:1738 +#: describe.c:1881 describe.c:1905 msgid "Maximum" msgstr "Максимум" -#: describe.c:1715 describe.c:1739 +#: describe.c:1882 describe.c:1906 msgid "Increment" msgstr "Приріст" -#: describe.c:1716 describe.c:1740 describe.c:1871 describe.c:4265 -#: describe.c:4431 describe.c:4545 describe.c:4550 describe.c:6099 +#: describe.c:1883 describe.c:1907 describe.c:2038 describe.c:4589 +#: describe.c:4847 describe.c:4961 describe.c:4966 describe.c:6523 msgid "yes" msgstr "так" -#: describe.c:1717 describe.c:1741 describe.c:1872 describe.c:4265 -#: describe.c:4428 describe.c:4545 describe.c:6100 +#: describe.c:1884 describe.c:1908 describe.c:2039 describe.c:4589 +#: describe.c:4844 describe.c:4961 describe.c:6524 msgid "no" msgstr "ні" -#: describe.c:1718 describe.c:1742 +#: describe.c:1885 describe.c:1909 msgid "Cycles?" msgstr "Цикли?" -#: describe.c:1719 describe.c:1743 +#: describe.c:1886 describe.c:1910 msgid "Cache" msgstr "Кеш" -#: describe.c:1786 +#: describe.c:1953 #, c-format msgid "Owned by: %s" msgstr "Власник: %s" -#: describe.c:1790 +#: describe.c:1957 #, c-format msgid "Sequence for identity column: %s" msgstr "Послідовність для стовпця identity: %s" -#: describe.c:1797 +#: describe.c:1964 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Послідовність \"%s.%s\"" -#: describe.c:1933 +#: describe.c:2111 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Таблиця без журналювання \"%s.%s\"" -#: describe.c:1936 +#: describe.c:2114 #, c-format msgid "Table \"%s.%s\"" msgstr "Таблиця \"%s.%s\"" -#: describe.c:1940 +#: describe.c:2118 #, c-format msgid "View \"%s.%s\"" msgstr "Подання \"%s.%s\"" -#: describe.c:1945 +#: describe.c:2123 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Матеріалізоване подання без журналювання \"%s.%s\"" -#: describe.c:1948 +#: describe.c:2126 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Матеріалізоване подання \"%s.%s\"" -#: describe.c:1953 +#: describe.c:2131 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Індекс без журналювання \"%s.%s\"" -#: describe.c:1956 +#: describe.c:2134 #, c-format msgid "Index \"%s.%s\"" msgstr "Індекс \"%s.%s\"" -#: describe.c:1961 +#: describe.c:2139 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Секційний індекс без журналювання \"%s.%s\"" -#: describe.c:1964 +#: describe.c:2142 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Секційний індекс \"%s.%s\"" -#: describe.c:1969 +#: describe.c:2147 #, c-format msgid "Special relation \"%s.%s\"" msgstr "Спеціальне відношення \"%s.%s\"" -#: describe.c:1973 +#: describe.c:2151 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "Таблиця TOAST \"%s.%s\"" -#: describe.c:1977 +#: describe.c:2155 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Композитний тип \"%s.%s\"" -#: describe.c:1981 +#: describe.c:2159 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Зовнішня таблиця \"%s.%s\"" -#: describe.c:1986 +#: describe.c:2164 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Секційна таблиця без журналювання \"%s.%s\"" -#: describe.c:1989 +#: describe.c:2167 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Секційна таблиця \"%s.%s\"" -#: describe.c:2005 describe.c:4178 +#: describe.c:2183 describe.c:4502 msgid "Collation" msgstr "Сортування" -#: describe.c:2006 describe.c:4185 +#: describe.c:2184 describe.c:4509 msgid "Nullable" msgstr "Обнуляється" -#: describe.c:2007 describe.c:4186 +#: describe.c:2185 describe.c:4510 msgid "Default" msgstr "За замовчуванням" -#: describe.c:2010 +#: describe.c:2188 msgid "Key?" msgstr "Ключ?" -#: describe.c:2012 +#: describe.c:2190 describe.c:4739 describe.c:4750 msgid "Definition" msgstr "Визначення" -#: describe.c:2014 describe.c:5296 describe.c:5380 describe.c:5451 -#: describe.c:5515 +#: describe.c:2192 describe.c:5712 describe.c:5796 describe.c:5867 +#: describe.c:5931 msgid "FDW options" msgstr "Налаштування FDW" -#: describe.c:2016 +#: describe.c:2194 msgid "Storage" msgstr "Сховище" -#: describe.c:2018 +#: describe.c:2196 +msgid "Compression" +msgstr "Стискання" + +#: describe.c:2198 msgid "Stats target" msgstr "Статистична ціль" -#: describe.c:2131 +#: describe.c:2334 #, c-format -msgid "Partition of: %s %s" -msgstr "Розділ: %s %s" +msgid "Partition of: %s %s%s" +msgstr "Розділ: %s %s%s" -#: describe.c:2143 +#: describe.c:2347 msgid "No partition constraint" msgstr "Відсутнє розділове обмеження" -#: describe.c:2145 +#: describe.c:2349 #, c-format msgid "Partition constraint: %s" msgstr "Обмеження секції: %s" -#: describe.c:2169 +#: describe.c:2373 #, c-format msgid "Partition key: %s" msgstr "Ключ розділу: %s" -#: describe.c:2195 +#: describe.c:2399 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Таблиця, що володіє: \"%s.%s\"" -#: describe.c:2266 +#: describe.c:2470 msgid "primary key, " msgstr "первинний ключ," -#: describe.c:2268 +#: describe.c:2472 msgid "unique, " msgstr "унікальний," -#: describe.c:2274 +#: describe.c:2478 #, c-format msgid "for table \"%s.%s\"" msgstr "для таблиці \"%s.%s\"" -#: describe.c:2278 +#: describe.c:2482 #, c-format msgid ", predicate (%s)" msgstr ", предикат (%s)" -#: describe.c:2281 +#: describe.c:2485 msgid ", clustered" msgstr ", кластеризовано" -#: describe.c:2284 +#: describe.c:2488 msgid ", invalid" msgstr ", недійсний" -#: describe.c:2287 +#: describe.c:2491 msgid ", deferrable" msgstr ", відтермінований" -#: describe.c:2290 +#: describe.c:2494 msgid ", initially deferred" msgstr ", від початку відтермінований" -#: describe.c:2293 +#: describe.c:2497 msgid ", replica identity" msgstr ", ідентичність репліки" -#: describe.c:2360 +#: describe.c:2564 msgid "Indexes:" msgstr "Індекси:" -#: describe.c:2444 +#: describe.c:2648 msgid "Check constraints:" msgstr "Обмеження перевірки:" -#: describe.c:2512 +#: describe.c:2716 msgid "Foreign-key constraints:" msgstr "Обмеження зовнішнього ключа:" -#: describe.c:2575 +#: describe.c:2779 msgid "Referenced by:" msgstr "Посилання ззовні:" -#: describe.c:2625 +#: describe.c:2829 msgid "Policies:" msgstr "Політики:" -#: describe.c:2628 +#: describe.c:2832 msgid "Policies (forced row security enabled):" msgstr "Політики (посилений захист рядків активовано):" -#: describe.c:2631 +#: describe.c:2835 msgid "Policies (row security enabled): (none)" msgstr "Політики (захист рядків ввімкнуто): (ні)" -#: describe.c:2634 +#: describe.c:2838 msgid "Policies (forced row security enabled): (none)" msgstr "Політики (посилений захист рядків ввімкнуто): (ні)" -#: describe.c:2637 +#: describe.c:2841 msgid "Policies (row security disabled):" msgstr "Політики (захист рядків вимкнуто):" -#: describe.c:2705 +#: describe.c:2902 describe.c:3006 msgid "Statistics objects:" msgstr "Об'єкти статистики:" -#: describe.c:2819 describe.c:2923 +#: describe.c:3120 describe.c:3224 msgid "Rules:" msgstr "Правила:" -#: describe.c:2822 +#: describe.c:3123 msgid "Disabled rules:" msgstr "Вимкнені правила:" -#: describe.c:2825 +#: describe.c:3126 msgid "Rules firing always:" msgstr "Правила, що завжди працюють:" -#: describe.c:2828 +#: describe.c:3129 msgid "Rules firing on replica only:" msgstr "Правила, що працюють тільки на репліці:" -#: describe.c:2868 +#: describe.c:3169 msgid "Publications:" msgstr "Публікації:" -#: describe.c:2906 +#: describe.c:3207 msgid "View definition:" msgstr "Визначення подання:" -#: describe.c:3053 +#: describe.c:3354 msgid "Triggers:" msgstr "Тригери:" -#: describe.c:3057 +#: describe.c:3358 msgid "Disabled user triggers:" msgstr "Вимкнені користувацькі тригери:" -#: describe.c:3059 +#: describe.c:3360 msgid "Disabled triggers:" msgstr "Вимкнені тригери:" -#: describe.c:3062 +#: describe.c:3363 msgid "Disabled internal triggers:" msgstr "Вимкнені внутрішні тригери:" -#: describe.c:3065 +#: describe.c:3366 msgid "Triggers firing always:" msgstr "Тригери, що завжди працюють:" -#: describe.c:3068 +#: describe.c:3369 msgid "Triggers firing on replica only:" msgstr "Тригери, що працюють тільки на репліці:" -#: describe.c:3140 +#: describe.c:3441 #, c-format msgid "Server: %s" msgstr "Сервер: %s" -#: describe.c:3148 +#: describe.c:3449 #, c-format msgid "FDW options: (%s)" msgstr "Налаштування FDW: (%s)" -#: describe.c:3169 +#: describe.c:3470 msgid "Inherits" msgstr "Успадковує" -#: describe.c:3229 +#: describe.c:3543 #, c-format msgid "Number of partitions: %d" msgstr "Число секцій: %d" -#: describe.c:3238 +#: describe.c:3552 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Кількість розділів: %d (\\d+ для списку)" -#: describe.c:3240 +#: describe.c:3554 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Кількість дочірніх таблиць: %d (\\d+ для списку)" -#: describe.c:3247 +#: describe.c:3561 msgid "Child tables" msgstr "Дочірні таблиці" -#: describe.c:3247 +#: describe.c:3561 msgid "Partitions" msgstr "Розділи" -#: describe.c:3276 +#: describe.c:3592 #, c-format msgid "Typed table of type: %s" msgstr "Типізована таблиця типу: %s" -#: describe.c:3292 +#: describe.c:3608 msgid "Replica Identity" msgstr "Ідентичність репліки" -#: describe.c:3305 +#: describe.c:3621 msgid "Has OIDs: yes" msgstr "Має OIDs: так" -#: describe.c:3314 +#: describe.c:3630 #, c-format msgid "Access method: %s" msgstr "Метод доступу: %s" -#: describe.c:3394 +#: describe.c:3710 #, c-format msgid "Tablespace: \"%s\"" msgstr "Табличний простір: \"%s\"" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3406 +#: describe.c:3722 #, c-format msgid ", tablespace \"%s\"" msgstr ", табличний простір \"%s\"" -#: describe.c:3499 +#: describe.c:3815 msgid "List of roles" msgstr "Список ролей" -#: describe.c:3501 +#: describe.c:3817 msgid "Role name" msgstr "Ім'я ролі" -#: describe.c:3502 +#: describe.c:3818 msgid "Attributes" msgstr "Атрибути" -#: describe.c:3503 +#: describe.c:3820 msgid "Member of" msgstr "Член" -#: describe.c:3514 +#: describe.c:3831 msgid "Superuser" msgstr "Суперкористувач" -#: describe.c:3517 +#: describe.c:3834 msgid "No inheritance" msgstr "Без успадкування" -#: describe.c:3520 +#: describe.c:3837 msgid "Create role" msgstr "Створити роль" -#: describe.c:3523 +#: describe.c:3840 msgid "Create DB" msgstr "Створити базу даних" -#: describe.c:3526 +#: describe.c:3843 msgid "Cannot login" msgstr "Не може увійти" -#: describe.c:3530 +#: describe.c:3847 msgid "Replication" msgstr "Реплікація" -#: describe.c:3534 +#: describe.c:3851 msgid "Bypass RLS" msgstr "Обхід RLC" -#: describe.c:3543 +#: describe.c:3860 msgid "No connections" msgstr "Без підключень" -#: describe.c:3545 +#: describe.c:3862 #, c-format msgid "%d connection" msgid_plural "%d connections" @@ -1755,591 +1766,628 @@ msgstr[1] "%d підключення" msgstr[2] "%d підключень" msgstr[3] "%d підключення" -#: describe.c:3555 +#: describe.c:3872 msgid "Password valid until " msgstr "Пароль дійнсий до" -#: describe.c:3605 +#: describe.c:3922 #, c-format msgid "The server (version %s) does not support per-database role settings." msgstr "Сервер (версія %s) не підтримує рольові налаштування побазово." -#: describe.c:3618 +#: describe.c:3935 msgid "Role" msgstr "Роль" -#: describe.c:3619 +#: describe.c:3936 msgid "Database" msgstr "База даних" -#: describe.c:3620 +#: describe.c:3937 msgid "Settings" msgstr "Параметри" -#: describe.c:3641 +#: describe.c:3958 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Не знайдено жодного параметра для ролі \"%s\" і бази даних \"%s\"." -#: describe.c:3644 +#: describe.c:3961 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Не знайдено жодного параметру для ролі \"%s\"." -#: describe.c:3647 +#: describe.c:3964 #, c-format msgid "Did not find any settings." msgstr "Не знайдено жодного параметру." -#: describe.c:3652 +#: describe.c:3969 msgid "List of settings" msgstr "Список параметрів" -#: describe.c:3723 +#: describe.c:4041 msgid "index" msgstr "індекс" -#: describe.c:3725 +#: describe.c:4043 msgid "special" msgstr "спеціальний" -#: describe.c:3728 describe.c:3938 +#: describe.c:4044 +msgid "TOAST table" +msgstr "Таблиця TOAST" + +#: describe.c:4047 describe.c:4270 msgid "partitioned index" msgstr "секційний індекс" -#: describe.c:3752 +#: describe.c:4071 msgid "permanent" msgstr "постійна" -#: describe.c:3753 +#: describe.c:4072 msgid "temporary" msgstr "тимчасова" -#: describe.c:3754 +#: describe.c:4073 msgid "unlogged" msgstr "нежурнальована" -#: describe.c:3755 +#: describe.c:4074 msgid "Persistence" msgstr "Стійкість" -#: describe.c:3851 +#: describe.c:4091 +msgid "Access method" +msgstr "Метод доступу" + +#: describe.c:4183 msgid "List of relations" msgstr "Список відношень" -#: describe.c:3899 +#: describe.c:4231 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "Сервер (версія %s) не підтримує декларативне секціонування таблиць." -#: describe.c:3910 +#: describe.c:4242 msgid "List of partitioned indexes" msgstr "Список секційних індексів" -#: describe.c:3912 +#: describe.c:4244 msgid "List of partitioned tables" msgstr "Список секційних таблиць" -#: describe.c:3916 +#: describe.c:4248 msgid "List of partitioned relations" msgstr "Список секційних відношень" -#: describe.c:3947 +#: describe.c:4279 msgid "Parent name" msgstr "Батьківська назва" -#: describe.c:3960 +#: describe.c:4292 msgid "Leaf partition size" msgstr "Розмір дочірньої секції" -#: describe.c:3963 describe.c:3969 +#: describe.c:4295 describe.c:4301 msgid "Total size" msgstr "Загальний розмір" -#: describe.c:4101 +#: describe.c:4425 msgid "Trusted" msgstr "Надійний" -#: describe.c:4109 +#: describe.c:4433 msgid "Internal language" msgstr "Внутрішня мова" -#: describe.c:4110 +#: describe.c:4434 msgid "Call handler" msgstr "Обробник виклику" -#: describe.c:4111 describe.c:5283 +#: describe.c:4435 describe.c:5699 msgid "Validator" msgstr "Функція перевірки" -#: describe.c:4114 +#: describe.c:4438 msgid "Inline handler" msgstr "Оброблювач впровадженого коду" -#: describe.c:4142 +#: describe.c:4466 msgid "List of languages" msgstr "Список мов" -#: describe.c:4187 +#: describe.c:4511 msgid "Check" msgstr "Перевірка" -#: describe.c:4229 +#: describe.c:4553 msgid "List of domains" msgstr "Список доменів" -#: describe.c:4263 +#: describe.c:4587 msgid "Source" msgstr "Джерело" -#: describe.c:4264 +#: describe.c:4588 msgid "Destination" msgstr "Призначення" -#: describe.c:4266 describe.c:6101 +#: describe.c:4590 describe.c:6525 msgid "Default?" msgstr "За замовчуванням?" -#: describe.c:4303 +#: describe.c:4627 msgid "List of conversions" msgstr "Список перетворень" -#: describe.c:4342 +#: describe.c:4666 msgid "Event" msgstr "Подія" -#: describe.c:4344 +#: describe.c:4668 msgid "enabled" msgstr "увімкнено" -#: describe.c:4345 +#: describe.c:4669 msgid "replica" msgstr "репліка" -#: describe.c:4346 +#: describe.c:4670 msgid "always" msgstr "завжди" -#: describe.c:4347 +#: describe.c:4671 msgid "disabled" msgstr "вимкнено" -#: describe.c:4348 describe.c:5997 +#: describe.c:4672 describe.c:6413 msgid "Enabled" msgstr "Увімкнено" -#: describe.c:4350 +#: describe.c:4674 msgid "Tags" msgstr "Теги" -#: describe.c:4369 +#: describe.c:4693 msgid "List of event triggers" msgstr "Список тригерів подій" -#: describe.c:4398 +#: describe.c:4720 +#, c-format +msgid "The server (version %s) does not support extended statistics." +msgstr "Сервер (версія %s) не підтримує розширену статистику." + +#: describe.c:4757 +msgid "Ndistinct" +msgstr "Ndistinct" + +#: describe.c:4758 +msgid "Dependencies" +msgstr "Залежності" + +#: describe.c:4768 +msgid "MCV" +msgstr "MCV" + +#: describe.c:4787 +msgid "List of extended statistics" +msgstr "Список розширеної статистики" + +#: describe.c:4814 msgid "Source type" msgstr "Початковий тип" -#: describe.c:4399 +#: describe.c:4815 msgid "Target type" msgstr "Тип цілі" -#: describe.c:4430 +#: describe.c:4846 msgid "in assignment" msgstr "у призначенні" -#: describe.c:4432 +#: describe.c:4848 msgid "Implicit?" msgstr "Приховане?" -#: describe.c:4487 +#: describe.c:4903 msgid "List of casts" msgstr "Список приведення типів" -#: describe.c:4515 +#: describe.c:4931 #, c-format msgid "The server (version %s) does not support collations." msgstr "Сервер (версія %s) не підтримує співставлення." -#: describe.c:4536 describe.c:4540 +#: describe.c:4952 describe.c:4956 msgid "Provider" msgstr "Постачальник" -#: describe.c:4546 describe.c:4551 +#: describe.c:4962 describe.c:4967 msgid "Deterministic?" msgstr "Детермінований?" -#: describe.c:4586 +#: describe.c:5002 msgid "List of collations" msgstr "Список правил сортування" -#: describe.c:4645 +#: describe.c:5061 msgid "List of schemas" msgstr "Список схем" -#: describe.c:4670 describe.c:4917 describe.c:4988 describe.c:5059 +#: describe.c:5086 describe.c:5333 describe.c:5404 describe.c:5475 #, c-format msgid "The server (version %s) does not support full text search." msgstr "Сервер (версія %s) не підтримує повнотекстовий пошук." -#: describe.c:4705 +#: describe.c:5121 msgid "List of text search parsers" msgstr "Список парсерів текстового пошуку" -#: describe.c:4750 +#: describe.c:5166 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Не знайдено жодного парсера текстового пошуку \"%s\"." -#: describe.c:4753 +#: describe.c:5169 #, c-format msgid "Did not find any text search parsers." msgstr "Не знайдено жодного парсера текстового пошуку." -#: describe.c:4828 +#: describe.c:5244 msgid "Start parse" msgstr "Почати розбір" -#: describe.c:4829 +#: describe.c:5245 msgid "Method" msgstr "Метод" -#: describe.c:4833 +#: describe.c:5249 msgid "Get next token" msgstr "Отримати наступний токен" -#: describe.c:4835 +#: describe.c:5251 msgid "End parse" msgstr "Закінчити розбір" -#: describe.c:4837 +#: describe.c:5253 msgid "Get headline" msgstr "Отримати заголовок" -#: describe.c:4839 +#: describe.c:5255 msgid "Get token types" msgstr "Отримати типи токенів" -#: describe.c:4850 +#: describe.c:5266 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Парсер текстового пошуку \"%s.%s\"" -#: describe.c:4853 +#: describe.c:5269 #, c-format msgid "Text search parser \"%s\"" msgstr "Парсер текстового пошуку \"%s\"" -#: describe.c:4872 +#: describe.c:5288 msgid "Token name" msgstr "Ім'я токену" -#: describe.c:4883 +#: describe.c:5299 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Типи токенів для парсера \"%s.%s\"" -#: describe.c:4886 +#: describe.c:5302 #, c-format msgid "Token types for parser \"%s\"" msgstr "Типи токенів для парсера \"%s\"" -#: describe.c:4940 +#: describe.c:5356 msgid "Template" msgstr "Шаблон" -#: describe.c:4941 +#: describe.c:5357 msgid "Init options" msgstr "Параметри ініціалізації" -#: describe.c:4963 +#: describe.c:5379 msgid "List of text search dictionaries" msgstr "Список словників текстового пошуку" -#: describe.c:5006 +#: describe.c:5422 msgid "Init" msgstr "Ініціалізація" -#: describe.c:5007 +#: describe.c:5423 msgid "Lexize" msgstr "Виділення лексем" -#: describe.c:5034 +#: describe.c:5450 msgid "List of text search templates" msgstr "Список шаблонів текстового пошуку" -#: describe.c:5094 +#: describe.c:5510 msgid "List of text search configurations" msgstr "Список конфігурацій текстового пошуку" -#: describe.c:5140 +#: describe.c:5556 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Не знайдено жодної конфігурації текстового пошуку під назвою \"%s\"." -#: describe.c:5143 +#: describe.c:5559 #, c-format msgid "Did not find any text search configurations." msgstr "Не знайдено жодної конфігурації текствого пошуку." -#: describe.c:5209 +#: describe.c:5625 msgid "Token" msgstr "Токен" -#: describe.c:5210 +#: describe.c:5626 msgid "Dictionaries" msgstr "Словники" -#: describe.c:5221 +#: describe.c:5637 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Конфігурація пошуку тексту \"%s.%s\"" -#: describe.c:5224 +#: describe.c:5640 #, c-format msgid "Text search configuration \"%s\"" msgstr "Конфігурація пошуку тексту \"%s\"" -#: describe.c:5228 +#: describe.c:5644 #, c-format msgid "\n" "Parser: \"%s.%s\"" msgstr "\n" "Парсер: \"%s.%s\"" -#: describe.c:5231 +#: describe.c:5647 #, c-format msgid "\n" "Parser: \"%s\"" msgstr "\n" "Парсер: \"%s\"" -#: describe.c:5265 +#: describe.c:5681 #, c-format msgid "The server (version %s) does not support foreign-data wrappers." msgstr "Сервер (версія %s) не підтримує джерела сторонніх даних." -#: describe.c:5323 +#: describe.c:5739 msgid "List of foreign-data wrappers" msgstr "Список джерел сторонніх даних" -#: describe.c:5348 +#: describe.c:5764 #, c-format msgid "The server (version %s) does not support foreign servers." msgstr "Сервер (версія %s) не підтримує сторонні сервери." -#: describe.c:5361 +#: describe.c:5777 msgid "Foreign-data wrapper" msgstr "Джерело сторонніх даних" -#: describe.c:5379 describe.c:5584 +#: describe.c:5795 describe.c:6000 msgid "Version" msgstr "Версія" -#: describe.c:5405 +#: describe.c:5821 msgid "List of foreign servers" msgstr "Список сторонніх серверів" -#: describe.c:5430 +#: describe.c:5846 #, c-format msgid "The server (version %s) does not support user mappings." msgstr "Сервер (версія %s) не підтримує зіставлення користувачів." -#: describe.c:5440 describe.c:5504 +#: describe.c:5856 describe.c:5920 msgid "Server" msgstr "Сервер" -#: describe.c:5441 +#: describe.c:5857 msgid "User name" msgstr "Ім'я користувача" -#: describe.c:5466 +#: describe.c:5882 msgid "List of user mappings" msgstr "Список зіставлень користувачів" -#: describe.c:5491 +#: describe.c:5907 #, c-format msgid "The server (version %s) does not support foreign tables." msgstr "Сервер (версія %s) не підтримує сторонні таблиці." -#: describe.c:5544 +#: describe.c:5960 msgid "List of foreign tables" msgstr "Список сторонніх таблиць" -#: describe.c:5569 describe.c:5626 +#: describe.c:5985 describe.c:6042 #, c-format msgid "The server (version %s) does not support extensions." msgstr "Сервер (версія %s) не підтримує розширення." -#: describe.c:5601 +#: describe.c:6017 msgid "List of installed extensions" msgstr "Список встановлених розширень" -#: describe.c:5654 +#: describe.c:6070 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Не знайдено жодного розширення під назвою \"%s\"." -#: describe.c:5657 +#: describe.c:6073 #, c-format msgid "Did not find any extensions." msgstr "Не знайдено жодного розширення." -#: describe.c:5701 +#: describe.c:6117 msgid "Object description" msgstr "Опис об'єкту" -#: describe.c:5711 +#: describe.c:6127 #, c-format msgid "Objects in extension \"%s\"" msgstr "Об'єкти в розширенні \"%s\"" -#: describe.c:5740 describe.c:5816 +#: describe.c:6156 describe.c:6232 #, c-format msgid "The server (version %s) does not support publications." msgstr "Сервер (версія %s) не підтримує публікації." -#: describe.c:5757 describe.c:5894 +#: describe.c:6173 describe.c:6310 msgid "All tables" msgstr "Усі таблиці" -#: describe.c:5758 describe.c:5895 +#: describe.c:6174 describe.c:6311 msgid "Inserts" msgstr "Вставки" -#: describe.c:5759 describe.c:5896 +#: describe.c:6175 describe.c:6312 msgid "Updates" msgstr "Оновлення" -#: describe.c:5760 describe.c:5897 +#: describe.c:6176 describe.c:6313 msgid "Deletes" msgstr "Видалення" -#: describe.c:5764 describe.c:5899 +#: describe.c:6180 describe.c:6315 msgid "Truncates" msgstr "Очищення" -#: describe.c:5768 describe.c:5901 +#: describe.c:6184 describe.c:6317 msgid "Via root" msgstr "Через root" -#: describe.c:5785 +#: describe.c:6201 msgid "List of publications" msgstr "Список публікацій" -#: describe.c:5858 +#: describe.c:6274 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Не знайдено жодної публікації під назвою \"%s\"." -#: describe.c:5861 +#: describe.c:6277 #, c-format msgid "Did not find any publications." msgstr "Не знайдено жодної публікації." -#: describe.c:5890 +#: describe.c:6306 #, c-format msgid "Publication %s" msgstr "Публікація %s" -#: describe.c:5938 +#: describe.c:6354 msgid "Tables:" msgstr "Таблиці:" -#: describe.c:5982 +#: describe.c:6398 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Сервер (версія %s) не підтримує підписки." -#: describe.c:5998 +#: describe.c:6414 msgid "Publication" msgstr "Публікація" -#: describe.c:6005 +#: describe.c:6423 +msgid "Binary" +msgstr "Бінарний" + +#: describe.c:6424 +msgid "Streaming" +msgstr "Потокова передача" + +#: describe.c:6429 msgid "Synchronous commit" msgstr "Синхронні затвердження" -#: describe.c:6006 +#: describe.c:6430 msgid "Conninfo" msgstr "Conninfo" -#: describe.c:6028 +#: describe.c:6452 msgid "List of subscriptions" msgstr "Список підписок" -#: describe.c:6095 describe.c:6184 describe.c:6270 describe.c:6353 +#: describe.c:6519 describe.c:6607 describe.c:6692 describe.c:6775 msgid "AM" msgstr "АМ" -#: describe.c:6096 +#: describe.c:6520 msgid "Input type" msgstr "Тип вводу" -#: describe.c:6097 +#: describe.c:6521 msgid "Storage type" msgstr "Тип сховища" -#: describe.c:6098 +#: describe.c:6522 msgid "Operator class" msgstr "Клас операторів" -#: describe.c:6110 describe.c:6185 describe.c:6271 describe.c:6354 +#: describe.c:6534 describe.c:6608 describe.c:6693 describe.c:6776 msgid "Operator family" msgstr "Сімейство операторів" -#: describe.c:6143 +#: describe.c:6566 msgid "List of operator classes" msgstr "Список класів операторів" -#: describe.c:6186 +#: describe.c:6609 msgid "Applicable types" msgstr "Типи для застосування" -#: describe.c:6225 +#: describe.c:6647 msgid "List of operator families" msgstr "Список сімейств операторів" -#: describe.c:6272 +#: describe.c:6694 msgid "Operator" msgstr "Оператор" -#: describe.c:6273 +#: describe.c:6695 msgid "Strategy" msgstr "Стратегія" -#: describe.c:6274 +#: describe.c:6696 msgid "ordering" msgstr "упорядкування" -#: describe.c:6275 +#: describe.c:6697 msgid "search" msgstr "пошук" -#: describe.c:6276 +#: describe.c:6698 msgid "Purpose" msgstr "Ціль" -#: describe.c:6281 +#: describe.c:6703 msgid "Sort opfamily" msgstr "Сімейство операторів сортування" -#: describe.c:6312 +#: describe.c:6734 msgid "List of operators of operator families" msgstr "Список операторів сімейств операторів" -#: describe.c:6355 +#: describe.c:6777 msgid "Registered left type" msgstr "Зареєстрований лівий тип" -#: describe.c:6356 +#: describe.c:6778 msgid "Registered right type" msgstr "Зареєстрований правий тип" -#: describe.c:6357 +#: describe.c:6779 msgid "Number" msgstr "Число" -#: describe.c:6393 +#: describe.c:6815 msgid "List of support functions of operator families" msgstr "Список функцій підтримки сімейств операторів" @@ -2348,7 +2396,7 @@ msgstr "Список функцій підтримки сімейств опер msgid "psql is the PostgreSQL interactive terminal.\n\n" msgstr "psql - це інтерактивний термінал PostgreSQL.\n\n" -#: help.c:74 help.c:355 help.c:431 help.c:474 +#: help.c:74 help.c:355 help.c:433 help.c:476 #, c-format msgid "Usage:\n" msgstr "Використання:\n" @@ -2574,22 +2622,22 @@ msgstr "локальний сокет" msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr " -p, --port=PORT порт сервера бази даних (за замовчуванням: \"%s\")\n" -#: help.c:140 +#: help.c:137 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr " -U, --username=USERNAME ім'я користувача бази даних (за змовчуванням: \"%s\")\n" -#: help.c:141 +#: help.c:138 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ніколи не запитувати пароль\n" -#: help.c:142 +#: help.c:139 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password запитувати пароль завжди (повинно траплятись автоматично)\n" -#: help.c:144 +#: help.c:141 #, c-format msgid "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2598,432 +2646,441 @@ msgid "\n" msgstr "\n" "Щоб дізнатися більше, введіть \"\\?\" (для внутрішніх команд) або \"\\help\"(для команд SQL) в psql, або звіртеся з розділом psql документації PostgreSQL. \n\n" -#: help.c:147 +#: help.c:144 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Повідомляти про помилки на <%s>.\n" -#: help.c:148 +#: help.c:145 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" -#: help.c:174 +#: help.c:171 #, c-format msgid "General\n" msgstr "Загальні\n" -#: help.c:175 +#: help.c:172 #, c-format msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright умови використання і розповсюдження PostgreSQL\n" -#: help.c:176 +#: help.c:173 #, c-format msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" msgstr " \\crosstabview [COLUMNS] виконати запит і відобразити результати у перехресній таблиці\n" -#: help.c:177 +#: help.c:174 #, c-format msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose вивести максимально докладне повідомлення про останню помилку\n" -#: help.c:178 +#: help.c:175 #, c-format msgid " \\g [(OPTIONS)] [FILE] execute query (and send results to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" msgstr " \\g [(OPTIONS)] [FILE] виконати запит (і надіслати результати до файлу або |каналу);\n" " \\g без аргументів рівнозначно крапці з комою\n" -#: help.c:180 +#: help.c:177 #, c-format msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc описати результат запиту без виконання\n" -#: help.c:181 +#: help.c:178 #, c-format msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec виконати запит, потім виконати кожне значення в його результаті\n" -#: help.c:182 +#: help.c:179 #, c-format msgid " \\gset [PREFIX] execute query and store results in psql variables\n" msgstr " \\gset [PREFIX] виконати запит та зберегти результати в змінних psql \n" -#: help.c:183 +#: help.c:180 #, c-format msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [(OPTIONS)] [FILE] як \\g, але вмикає розширений режим виводу\n" -#: help.c:184 +#: help.c:181 #, c-format msgid " \\q quit psql\n" msgstr " \\q вийти з psql\n" -#: help.c:185 +#: help.c:182 #, c-format msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr " \\watch [SEC] виконувати запит кожні SEC секунд\n" -#: help.c:188 +#: help.c:185 #, c-format msgid "Help\n" msgstr "Довідка\n" -#: help.c:190 +#: help.c:187 #, c-format msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] показати довідку по командах з \\\n" -#: help.c:191 +#: help.c:188 #, c-format msgid " \\? options show help on psql command-line options\n" msgstr " \\? options показати довідку по параметрах командного рядку psql\n" -#: help.c:192 +#: help.c:189 #, c-format msgid " \\? variables show help on special variables\n" msgstr " \\? variables показати довідку по спеціальних змінних\n" -#: help.c:193 +#: help.c:190 #, c-format msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [NAME] довідка з синтаксису команд SQL, * для всіх команд\n" -#: help.c:196 +#: help.c:193 #, c-format msgid "Query Buffer\n" msgstr "Буфер запитів\n" -#: help.c:197 +#: help.c:194 #, c-format msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr " \\e [FILE] [LINE] редагувати буфер запитів (або файл) зовнішнім редактором\n" -#: help.c:198 +#: help.c:195 #, c-format msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [FUNCNAME [LINE]] редагувати визначення функції зовнішнім редактором\n" -#: help.c:199 +#: help.c:196 #, c-format msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [VIEWNAME [LINE]] редагувати визначення подання зовнішнім редактором\n" -#: help.c:200 +#: help.c:197 #, c-format msgid " \\p show the contents of the query buffer\n" msgstr " \\p показати вміст буфера запитів\n" -#: help.c:201 +#: help.c:198 #, c-format msgid " \\r reset (clear) the query buffer\n" msgstr " \\r скинути (очистити) буфер запитів\n" -#: help.c:203 +#: help.c:200 #, c-format msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [FILE] відобразити історію або зберегти її до файлу\n" -#: help.c:205 +#: help.c:202 #, c-format msgid " \\w FILE write query buffer to file\n" msgstr " \\w FILE писати буфер запитів до файлу\n" -#: help.c:208 +#: help.c:205 #, c-format msgid "Input/Output\n" msgstr "Ввід/Вивід\n" -#: help.c:209 +#: help.c:206 #, c-format msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr " \\copy ... виконати команду SQL COPY з потоком даних на клієнтський хост\n" -#: help.c:210 +#: help.c:207 #, c-format msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [STRING] записати рядок до стандартного виводу (-n для пропуску нового рядка)\n" -#: help.c:211 +#: help.c:208 #, c-format msgid " \\i FILE execute commands from file\n" msgstr " \\i FILE виконати команди з файлу\n" -#: help.c:212 +#: help.c:209 #, c-format msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr " \\ir ФАЙЛ те саме, що \\i, але відносно розташування поточного сценарію\n" -#: help.c:213 +#: help.c:210 #, c-format msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [FILE] надсилати всі результати запитів до файлу або до каналу |\n" -#: help.c:214 +#: help.c:211 #, c-format msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr " \\qecho [-n] [STRING] записати рядок до вихідного потоку \\o (-n для пропуску нового рядка)\n" -#: help.c:215 +#: help.c:212 #, c-format msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr " \\warn [-n] [STRING] записати рядок до стандартної помилки (-n для пропуску нового рядка)\n" -#: help.c:218 +#: help.c:215 #, c-format msgid "Conditional\n" msgstr "Умовний\n" -#: help.c:219 +#: help.c:216 #, c-format msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR початок умовного блоку\n" -#: help.c:220 +#: help.c:217 #, c-format msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR альтернатива в рамках поточного блоку\n" -#: help.c:221 +#: help.c:218 #, c-format msgid " \\else final alternative within current conditional block\n" msgstr " \\else остаточна альтернатива в рамках поточного умовного блоку\n" -#: help.c:222 +#: help.c:219 #, c-format msgid " \\endif end conditional block\n" msgstr " \\endif кінець умовного блоку\n" -#: help.c:225 +#: help.c:222 #, c-format msgid "Informational\n" msgstr "Інформаційний\n" -#: help.c:226 +#: help.c:223 #, c-format msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (параметри: S = показати системні об'єкти, + = додаткові деталі)\n" -#: help.c:227 +#: help.c:224 #, c-format msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] вивести таблиці, подання і послідовності\n" -#: help.c:228 +#: help.c:225 #, c-format msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NAME описати таблицю, подання, послідовність або індекс\n" -#: help.c:229 +#: help.c:226 #, c-format msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [PATTERN] вивести агрегати\n" -#: help.c:230 +#: help.c:227 #, c-format msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [PATTERN] вивести методи доступу\n" -#: help.c:231 +#: help.c:228 #, c-format msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] список класів операторів\n" -#: help.c:232 +#: help.c:229 #, c-format msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] список сімейств операторів\n" -#: help.c:233 +#: help.c:230 #, c-format msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] список операторів сімейств операторів\n" -#: help.c:234 +#: help.c:231 #, c-format -msgid " \\dAp [AMPTRN [OPFPTRN]] list support functions of operator families\n" -msgstr " \\dAp [AMPTRN [OPFPTRN]] список функцій підтримки сімейств операторів\n" +msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" +msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] список функцій підтримки сімейств операторів\n" -#: help.c:235 +#: help.c:232 #, c-format msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [PATTERN] вивести табличні простори\n" -#: help.c:236 +#: help.c:233 #, c-format msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [PATTERN] вивести перетворення\n" -#: help.c:237 +#: help.c:234 #, c-format msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [PATTERN] вивести приведення типів\n" -#: help.c:238 +#: help.c:235 #, c-format msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [PATTERN] показати опис об'єкта, що не відображається в іншому місці\n" -#: help.c:239 +#: help.c:236 #, c-format msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [PATTERN] вивести домени\n" -#: help.c:240 +#: help.c:237 #, c-format msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [PATTERN] вивести привілеї за замовчуванням\n" -#: help.c:241 +#: help.c:238 #, c-format msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [PATTERN] вивести зовнішні таблиці\n" -#: help.c:242 +#: help.c:239 #, c-format msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [PATTERN] вивести зовнішні таблиці\n" -#: help.c:243 +#: help.c:240 #, c-format msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [PATTERN] вивести зовнішні сервери\n" -#: help.c:244 +#: help.c:241 #, c-format msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [PATTERN] вивести користувацькі зіставлення\n" -#: help.c:245 +#: help.c:242 #, c-format msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [PATTERN] список джерел сторонніх даних\n" -#: help.c:246 +#: help.c:243 #, c-format -msgid " \\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions\n" -msgstr " \\df[anptw][S+] [PATRN] вивести [тільки аггрегатні/нормальні/процедурні/тригерні/віконні] функції\n" +msgid " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" list [only agg/normal/procedure/trigger/window] functions\n" +msgstr " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" список [лише агрегатних/нормальних/процедурних/тригерних/віконних] функцій\n" -#: help.c:247 +#: help.c:245 #, c-format msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [PATTERN] вивести конфігурації текстового пошуку\n" -#: help.c:248 +#: help.c:246 #, c-format msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [PATTERN] вивести словники текстового пошуку\n" -#: help.c:249 +#: help.c:247 #, c-format msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [PATTERN] вивести парсери текстового пошуку\n" -#: help.c:250 +#: help.c:248 #, c-format msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [PATTERN] вивести шаблони текстового пошуку\n" -#: help.c:251 +#: help.c:249 #, c-format msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [PATTERN] вивести ролі\n" -#: help.c:252 +#: help.c:250 #, c-format msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [PATTERN] вивести індекси\n" -#: help.c:253 +#: help.c:251 #, c-format msgid " \\dl list large objects, same as \\lo_list\n" msgstr " \\dl вивести великі об'єкти, те саме, що \\lo_list\n" -#: help.c:254 +#: help.c:252 #, c-format msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [PATTERN] вивести процедурні мови\n" -#: help.c:255 +#: help.c:253 #, c-format msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [PATTERN] вивести матеріалізовані подання\n" -#: help.c:256 +#: help.c:254 #, c-format msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [PATTERN] вивести схеми\n" -#: help.c:257 +#: help.c:255 #, c-format -msgid " \\do[S] [PATTERN] list operators\n" -msgstr " \\do[S] [PATTERN] вивести оператори\n" +msgid " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" list operators\n" +msgstr " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" список операторів\n" -#: help.c:258 +#: help.c:257 #, c-format msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [PATTERN] вивести правила сортування\n" -#: help.c:259 +#: help.c:258 #, c-format msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" msgstr " \\dp [PATTERN] вивести привілеї доступу до таблиць, подань або послідновностей \n" -#: help.c:260 +#: help.c:259 #, c-format msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr " \\dP[itn+] [PATTERN] вивести [тільки індекс/таблицю] секційні відношення [n=вкладені]\n" -#: help.c:261 +#: help.c:260 #, c-format msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" msgstr " \\drds [PATRN1 [PATRN2]] вивести налаштування ролей побазово\n" -#: help.c:262 +#: help.c:261 #, c-format msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [PATTERN] вивести реплікаційні публікації\n" -#: help.c:263 +#: help.c:262 #, c-format msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [PATTERN] вивести реплікаційні підписки\n" -#: help.c:264 +#: help.c:263 #, c-format msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [PATTERN] вивести послідовності\n" -#: help.c:265 +#: help.c:264 #, c-format msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [PATTERN] вивести таблиці\n" -#: help.c:266 +#: help.c:265 #, c-format msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [PATTERN] вивести типи даних\n" -#: help.c:267 +#: help.c:266 #, c-format msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [PATTERN] вивести ролі\n" -#: help.c:268 +#: help.c:267 #, c-format msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [PATTERN] вивести подання\n" -#: help.c:269 +#: help.c:268 #, c-format msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [PATTERN] вивести розширення\n" +#: help.c:269 +#, c-format +msgid " \\dX [PATTERN] list extended statistics\n" +msgstr " \\dX [PATTERN] список розширеної статистики\n" + #: help.c:270 #, c-format -msgid " \\dy [PATTERN] list event triggers\n" -msgstr " \\dy [PATTERN] вивести тригери подій\n" +msgid " \\dy[+] [PATTERN] list event triggers\n" +msgstr " \\dy[+] [PATTERN] вивести тригери подій\n" #: help.c:271 #, c-format @@ -3280,41 +3337,48 @@ msgstr " HIDE_TABLEAM\n" #: help.c:379 #, c-format +msgid " HIDE_TOAST_COMPRESSION\n" +" if set, compression methods are not displayed\n" +msgstr " HIDE_TOAST_COMPRESSION\n" +" якщо встановлено, методи стискання не відображаються\n" + +#: help.c:381 +#, c-format msgid " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" msgstr " HISTCONTROL контролює історію команд [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:381 +#: help.c:383 #, c-format msgid " HISTFILE\n" " file name used to store the command history\n" msgstr " HISTFILE ім'я файлу для зберігання історії команд\n" -#: help.c:383 +#: help.c:385 #, c-format msgid " HISTSIZE\n" " maximum number of commands to store in the command history\n" msgstr " HISTSIZE максимальна кількість команд для зберігання в історії команд\n" -#: help.c:385 +#: help.c:387 #, c-format msgid " HOST\n" " the currently connected database server host\n" msgstr " HOST поточний підключений хост сервера бази даних\n" -#: help.c:387 +#: help.c:389 #, c-format msgid " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" msgstr " IGNOREEOF кількість EOF для завершення інтерактивної сесії\n" -#: help.c:389 +#: help.c:391 #, c-format msgid " LASTOID\n" " value of the last affected OID\n" msgstr " LASTOID значення останнього залученого OID\n" -#: help.c:391 +#: help.c:393 #, c-format msgid " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3323,63 +3387,63 @@ msgstr " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" " повідомлення та код SQLSTATE останньої помилки, або пустий рядок та \"00000\", якщо помилки не було\n" -#: help.c:394 +#: help.c:396 #, c-format msgid " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" msgstr " ON_ERROR_ROLLBACK\n" " якщо встановлено, транзакція не припиняється у разі помилки (використовуються неявні точки збереження)\n" -#: help.c:396 +#: help.c:398 #, c-format msgid " ON_ERROR_STOP\n" " stop batch execution after error\n" msgstr " ON_ERROR_STOP\n" " зупиняти виконання пакету команд після помилки\n" -#: help.c:398 +#: help.c:400 #, c-format msgid " PORT\n" " server port of the current connection\n" msgstr " PORT\n" " порт сервера для поточного з'єднання\n" -#: help.c:400 +#: help.c:402 #, c-format msgid " PROMPT1\n" " specifies the standard psql prompt\n" msgstr " PROMPT1\n" " визначає стандратне запрошення psql \n" -#: help.c:402 +#: help.c:404 #, c-format msgid " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" msgstr " PROMPT2\n" " визначає запрошення, яке використовується при продовженні команди з попереднього рядка\n" -#: help.c:404 +#: help.c:406 #, c-format msgid " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" msgstr " PROMPT3\n" " визначає запрошення, яке виконується під час COPY ... FROM STDIN\n" -#: help.c:406 +#: help.c:408 #, c-format msgid " QUIET\n" " run quietly (same as -q option)\n" msgstr " QUIET\n" " тихий запуск ( як із параметром -q)\n" -#: help.c:408 +#: help.c:410 #, c-format msgid " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" msgstr " ROW_COUNT\n" " число повернених або оброблених рядків останнім запитом, або 0\n" -#: help.c:410 +#: help.c:412 #, c-format msgid " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3388,49 +3452,49 @@ msgstr " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" " версія серевера (у короткому текстовому або числовому форматі)\n" -#: help.c:413 +#: help.c:415 #, c-format msgid " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" msgstr " SHOW_CONTEXT\n" " керує відображенням полів контексту повідомлень [never, errors, always]\n" -#: help.c:415 +#: help.c:417 #, c-format msgid " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" msgstr " SINGLELINE\n" " якщо встановлено, кінець рядка завершує режим вводу SQL-команди (як з параметром -S)\n" -#: help.c:417 +#: help.c:419 #, c-format msgid " SINGLESTEP\n" " single-step mode (same as -s option)\n" msgstr " SINGLESTEP\n" " покроковий режим (як з параметром -s)\n" -#: help.c:419 +#: help.c:421 #, c-format msgid " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" msgstr " SQLSTATE\n" " SQLSTATE останнього запиту, або \"00000\" якщо немає помилок\n" -#: help.c:421 +#: help.c:423 #, c-format msgid " USER\n" " the currently connected database user\n" msgstr " USER\n" " поточний користувач, підключений до бази даних\n" -#: help.c:423 +#: help.c:425 #, c-format msgid " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" msgstr " VERBOSITY\n" " контролює докладність звітів про помилку [default, verbose, terse, sqlstate]\n" -#: help.c:425 +#: help.c:427 #, c-format msgid " VERSION\n" " VERSION_NAME\n" @@ -3441,112 +3505,112 @@ msgstr " VERSION\n" " VERSION_NUM\n" " psql версія (в розгорнутому, в короткому текстовому або числовому форматі)\n" -#: help.c:430 +#: help.c:432 #, c-format msgid "\n" "Display settings:\n" msgstr "\n" "Налаштування відобреження:\n" -#: help.c:432 +#: help.c:434 #, c-format msgid " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n\n" msgstr " psql --pset=NAME[=VALUE]\n" " або \\pset ІМ'Я [VALUE] всередині psql\n\n" -#: help.c:434 +#: help.c:436 #, c-format msgid " border\n" " border style (number)\n" msgstr " border\n" " стиль рамки (число)\n" -#: help.c:436 +#: help.c:438 #, c-format msgid " columns\n" " target width for the wrapped format\n" msgstr " columns\n" " цільова ширина для формату з переносом\n" -#: help.c:438 +#: help.c:440 #, c-format msgid " expanded (or x)\n" " expanded output [on, off, auto]\n" msgstr " expanded (or x)\n" " розширений вивід [on, off, auto]\n" -#: help.c:440 +#: help.c:442 #, c-format msgid " fieldsep\n" " field separator for unaligned output (default \"%s\")\n" msgstr " fieldsep\n" " розділювач полів для не вирівняного виводу (за замовчуванням \"%s\")\n" -#: help.c:443 +#: help.c:445 #, c-format msgid " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" msgstr " fieldsep_zero\n" " встановити розділювач полів для невирівняного виводу на нульовий байт\n" -#: help.c:445 +#: help.c:447 #, c-format msgid " footer\n" " enable or disable display of the table footer [on, off]\n" msgstr " footer\n" " вмикає або вимикає вивід підписів таблиці [on, off]\n" -#: help.c:447 +#: help.c:449 #, c-format msgid " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" msgstr " format\n" " встановити формат виводу [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:449 +#: help.c:451 #, c-format msgid " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" msgstr " linestyle\n" " встановлює стиль малювання ліній рамки [ascii, old-ascii, unicode]\n" -#: help.c:451 +#: help.c:453 #, c-format msgid " null\n" " set the string to be printed in place of a null value\n" msgstr " null\n" " встановлює рядок, який буде виведено замість значення (null)\n" -#: help.c:453 +#: help.c:455 #, c-format msgid " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" msgstr " numericlocale\n" " вмикає виведення заданого локалью роздільника групи цифр\n" -#: help.c:455 +#: help.c:457 #, c-format msgid " pager\n" " control when an external pager is used [yes, no, always]\n" msgstr " pager\n" " контролює використання зовнішнього пейджера [yes, no, always]\n" -#: help.c:457 +#: help.c:459 #, c-format msgid " recordsep\n" " record (line) separator for unaligned output\n" msgstr " recordsep\n" " розділювач записів (рядків) для не вирівняного виводу\n" -#: help.c:459 +#: help.c:461 #, c-format msgid " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" msgstr " recordsep_zero\n" " встановлює розділювач записів для невирівняного виводу на нульовий байт\n" -#: help.c:461 +#: help.c:463 #, c-format msgid " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3555,21 +3619,21 @@ msgstr " tableattr (або T)\n" " вказує атрибути для тегу table у html форматі або пропорційні \n" " ширини стовпців для вирівняних вліво даних, у latex-longtable форматі\n" -#: help.c:464 +#: help.c:466 #, c-format msgid " title\n" " set the table title for subsequently printed tables\n" msgstr " title\n" " задає заголовок таблиці для послідовно друкованих таблиць\n" -#: help.c:466 +#: help.c:468 #, c-format msgid " tuples_only\n" " if set, only actual table data is shown\n" msgstr " tuples_only\n" " якщо встановлено, виводяться лише фактичні табличні дані\n" -#: help.c:468 +#: help.c:470 #, c-format msgid " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3580,21 +3644,21 @@ msgstr " unicode_border_linestyle\n" " unicode_header_linestyle\n" " задає стиль мальювання ліній (Unicode) [single, double]\n" -#: help.c:473 +#: help.c:475 #, c-format msgid "\n" "Environment variables:\n" msgstr "\n" "Змінні оточення:\n" -#: help.c:477 +#: help.c:479 #, c-format msgid " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n\n" msgstr " ІМ'Я=ЗНАЧЕННЯ [ІМ'Я=ЗНАЧЕННЯ] psql ...\n" " або \\setenv ІМ'Я [VALUE] всередині psql\n\n" -#: help.c:479 +#: help.c:481 #, c-format msgid " set NAME=VALUE\n" " psql ...\n" @@ -3603,41 +3667,34 @@ msgstr " встановлює ІМ'Я=ЗНАЧЕННЯ\n" " psql ...\n" " або \\setenv ІМ'Я [VALUE] всередині psql\n\n" -#: help.c:482 +#: help.c:484 #, c-format msgid " COLUMNS\n" " number of columns for wrapped format\n" msgstr " COLUMNS\n" " число стовпців для форматування з переносом\n" -#: help.c:484 +#: help.c:486 #, c-format msgid " PGAPPNAME\n" " same as the application_name connection parameter\n" msgstr " PGAPPNAME\n" " те саме, що параметр підключення application_name\n" -#: help.c:486 +#: help.c:488 #, c-format msgid " PGDATABASE\n" " same as the dbname connection parameter\n" msgstr " PGDATABASE\n" " те саме, що параметр підключення dbname\n" -#: help.c:488 +#: help.c:490 #, c-format msgid " PGHOST\n" " same as the host connection parameter\n" msgstr " PGHOST\n" " те саме, що параметр підключення host\n" -#: help.c:490 -#, c-format -msgid " PGPASSWORD\n" -" connection password (not recommended)\n" -msgstr " PGPASSWORD\n" -" пароль для підключення (не рекомендується)\n" - #: help.c:492 #, c-format msgid " PGPASSFILE\n" @@ -3647,72 +3704,79 @@ msgstr " PGPASSFILE\n" #: help.c:494 #, c-format +msgid " PGPASSWORD\n" +" connection password (not recommended)\n" +msgstr " PGPASSWORD\n" +" пароль для підключення (не рекомендується)\n" + +#: help.c:496 +#, c-format msgid " PGPORT\n" " same as the port connection parameter\n" msgstr " PGPORT\n" " те саме, що параметр підключення port\n" -#: help.c:496 +#: help.c:498 #, c-format msgid " PGUSER\n" " same as the user connection parameter\n" msgstr " PGUSER\n" " те саме, що параметр підключення user\n" -#: help.c:498 +#: help.c:500 #, c-format msgid " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" msgstr " PSQL_EDITOR, EDITOR, VISUAL\n" " редактор для команд \\e, \\ef і \\ev\n" -#: help.c:500 +#: help.c:502 #, c-format msgid " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" msgstr " PSQL_EDITOR_LINENUMBER_ARG\n" " як вказати номер рядка при виклику редактора\n" -#: help.c:502 +#: help.c:504 #, c-format msgid " PSQL_HISTORY\n" " alternative location for the command history file\n" msgstr " PSQL_HISTORY\n" " альтернативне розміщення файлу з історією команд\n" -#: help.c:504 +#: help.c:506 #, c-format msgid " PSQL_PAGER, PAGER\n" " name of external pager program\n" msgstr " PSQL_PAGER, PAGER\n" " ім'я програми зовнішнього пейджеру\n" -#: help.c:506 +#: help.c:508 #, c-format msgid " PSQLRC\n" " alternative location for the user's .psqlrc file\n" msgstr " PSQLRC\n" " альтернативне розміщення користувацького файла .psqlrc\n" -#: help.c:508 +#: help.c:510 #, c-format msgid " SHELL\n" " shell used by the \\! command\n" msgstr " SHELL\n" " оболонка, що використовується командою \\!\n" -#: help.c:510 +#: help.c:512 #, c-format msgid " TMPDIR\n" " directory for temporary files\n" msgstr " TMPDIR\n" " каталог для тимчасових файлів\n" -#: help.c:554 +#: help.c:557 msgid "Available help:\n" msgstr "Доступна довідка:\n" -#: help.c:642 +#: help.c:652 #, c-format msgid "Command: %s\n" "Description: %s\n" @@ -3725,7 +3789,7 @@ msgstr "Команда: %s\n" "%s\n\n" "URL: %s\n\n" -#: help.c:661 +#: help.c:675 #, c-format msgid "No help available for \"%s\".\n" "Try \\h with no arguments to see available help.\n" @@ -3851,192 +3915,194 @@ msgstr "%s: бракує пам'яті" #: sql_help.c:249 sql_help.c:251 sql_help.c:263 sql_help.c:264 sql_help.c:265 #: sql_help.c:267 sql_help.c:316 sql_help.c:318 sql_help.c:320 sql_help.c:322 #: sql_help.c:391 sql_help.c:396 sql_help.c:398 sql_help.c:440 sql_help.c:442 -#: sql_help.c:445 sql_help.c:447 sql_help.c:515 sql_help.c:520 sql_help.c:525 -#: sql_help.c:530 sql_help.c:535 sql_help.c:588 sql_help.c:590 sql_help.c:592 -#: sql_help.c:594 sql_help.c:596 sql_help.c:599 sql_help.c:601 sql_help.c:604 -#: sql_help.c:615 sql_help.c:617 sql_help.c:658 sql_help.c:660 sql_help.c:662 -#: sql_help.c:665 sql_help.c:667 sql_help.c:669 sql_help.c:702 sql_help.c:706 -#: sql_help.c:710 sql_help.c:729 sql_help.c:732 sql_help.c:735 sql_help.c:764 -#: sql_help.c:776 sql_help.c:784 sql_help.c:787 sql_help.c:790 sql_help.c:805 -#: sql_help.c:808 sql_help.c:837 sql_help.c:842 sql_help.c:847 sql_help.c:852 -#: sql_help.c:857 sql_help.c:879 sql_help.c:881 sql_help.c:883 sql_help.c:885 -#: sql_help.c:888 sql_help.c:890 sql_help.c:931 sql_help.c:975 sql_help.c:980 -#: sql_help.c:985 sql_help.c:990 sql_help.c:995 sql_help.c:1014 sql_help.c:1025 -#: sql_help.c:1027 sql_help.c:1046 sql_help.c:1056 sql_help.c:1058 -#: sql_help.c:1060 sql_help.c:1072 sql_help.c:1076 sql_help.c:1078 -#: sql_help.c:1090 sql_help.c:1092 sql_help.c:1094 sql_help.c:1096 -#: sql_help.c:1112 sql_help.c:1114 sql_help.c:1118 sql_help.c:1121 -#: sql_help.c:1122 sql_help.c:1123 sql_help.c:1126 sql_help.c:1128 -#: sql_help.c:1262 sql_help.c:1264 sql_help.c:1267 sql_help.c:1270 -#: sql_help.c:1272 sql_help.c:1274 sql_help.c:1277 sql_help.c:1280 -#: sql_help.c:1391 sql_help.c:1393 sql_help.c:1395 sql_help.c:1398 -#: sql_help.c:1419 sql_help.c:1422 sql_help.c:1425 sql_help.c:1428 -#: sql_help.c:1432 sql_help.c:1434 sql_help.c:1436 sql_help.c:1438 -#: sql_help.c:1452 sql_help.c:1455 sql_help.c:1457 sql_help.c:1459 -#: sql_help.c:1469 sql_help.c:1471 sql_help.c:1481 sql_help.c:1483 -#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1519 sql_help.c:1521 -#: sql_help.c:1523 sql_help.c:1525 sql_help.c:1528 sql_help.c:1530 -#: sql_help.c:1533 sql_help.c:1536 sql_help.c:1586 sql_help.c:1629 -#: sql_help.c:1632 sql_help.c:1634 sql_help.c:1636 sql_help.c:1639 -#: sql_help.c:1641 sql_help.c:1643 sql_help.c:1646 sql_help.c:1696 -#: sql_help.c:1712 sql_help.c:1933 sql_help.c:2002 sql_help.c:2021 -#: sql_help.c:2034 sql_help.c:2091 sql_help.c:2098 sql_help.c:2108 -#: sql_help.c:2129 sql_help.c:2155 sql_help.c:2173 sql_help.c:2200 -#: sql_help.c:2295 sql_help.c:2340 sql_help.c:2364 sql_help.c:2387 -#: sql_help.c:2391 sql_help.c:2425 sql_help.c:2445 sql_help.c:2467 -#: sql_help.c:2481 sql_help.c:2501 sql_help.c:2524 sql_help.c:2554 -#: sql_help.c:2579 sql_help.c:2625 sql_help.c:2903 sql_help.c:2916 -#: sql_help.c:2933 sql_help.c:2949 sql_help.c:2989 sql_help.c:3041 -#: sql_help.c:3045 sql_help.c:3047 sql_help.c:3053 sql_help.c:3071 -#: sql_help.c:3098 sql_help.c:3133 sql_help.c:3145 sql_help.c:3154 -#: sql_help.c:3198 sql_help.c:3212 sql_help.c:3240 sql_help.c:3248 -#: sql_help.c:3260 sql_help.c:3270 sql_help.c:3278 sql_help.c:3286 -#: sql_help.c:3294 sql_help.c:3302 sql_help.c:3311 sql_help.c:3322 -#: sql_help.c:3330 sql_help.c:3338 sql_help.c:3346 sql_help.c:3354 -#: sql_help.c:3364 sql_help.c:3373 sql_help.c:3382 sql_help.c:3390 -#: sql_help.c:3400 sql_help.c:3411 sql_help.c:3419 sql_help.c:3428 -#: sql_help.c:3439 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 -#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3488 sql_help.c:3496 -#: sql_help.c:3504 sql_help.c:3512 sql_help.c:3520 sql_help.c:3528 -#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3562 sql_help.c:3579 -#: sql_help.c:3594 sql_help.c:3869 sql_help.c:3920 sql_help.c:3949 -#: sql_help.c:3962 sql_help.c:4407 sql_help.c:4455 sql_help.c:4596 +#: sql_help.c:445 sql_help.c:447 sql_help.c:516 sql_help.c:521 sql_help.c:526 +#: sql_help.c:531 sql_help.c:536 sql_help.c:590 sql_help.c:592 sql_help.c:594 +#: sql_help.c:596 sql_help.c:598 sql_help.c:601 sql_help.c:603 sql_help.c:606 +#: sql_help.c:617 sql_help.c:619 sql_help.c:661 sql_help.c:663 sql_help.c:665 +#: sql_help.c:668 sql_help.c:670 sql_help.c:672 sql_help.c:707 sql_help.c:711 +#: sql_help.c:715 sql_help.c:734 sql_help.c:737 sql_help.c:740 sql_help.c:769 +#: sql_help.c:781 sql_help.c:789 sql_help.c:792 sql_help.c:795 sql_help.c:810 +#: sql_help.c:813 sql_help.c:842 sql_help.c:847 sql_help.c:852 sql_help.c:857 +#: sql_help.c:862 sql_help.c:884 sql_help.c:886 sql_help.c:888 sql_help.c:890 +#: sql_help.c:893 sql_help.c:895 sql_help.c:937 sql_help.c:982 sql_help.c:987 +#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1021 +#: sql_help.c:1032 sql_help.c:1034 sql_help.c:1053 sql_help.c:1063 +#: sql_help.c:1065 sql_help.c:1067 sql_help.c:1079 sql_help.c:1083 +#: sql_help.c:1085 sql_help.c:1097 sql_help.c:1099 sql_help.c:1101 +#: sql_help.c:1103 sql_help.c:1121 sql_help.c:1123 sql_help.c:1127 +#: sql_help.c:1131 sql_help.c:1135 sql_help.c:1138 sql_help.c:1139 +#: sql_help.c:1140 sql_help.c:1143 sql_help.c:1145 sql_help.c:1280 +#: sql_help.c:1282 sql_help.c:1285 sql_help.c:1288 sql_help.c:1290 +#: sql_help.c:1292 sql_help.c:1295 sql_help.c:1298 sql_help.c:1411 +#: sql_help.c:1413 sql_help.c:1415 sql_help.c:1418 sql_help.c:1439 +#: sql_help.c:1442 sql_help.c:1445 sql_help.c:1448 sql_help.c:1452 +#: sql_help.c:1454 sql_help.c:1456 sql_help.c:1458 sql_help.c:1472 +#: sql_help.c:1475 sql_help.c:1477 sql_help.c:1479 sql_help.c:1489 +#: sql_help.c:1491 sql_help.c:1501 sql_help.c:1503 sql_help.c:1513 +#: sql_help.c:1516 sql_help.c:1539 sql_help.c:1541 sql_help.c:1543 +#: sql_help.c:1545 sql_help.c:1548 sql_help.c:1550 sql_help.c:1553 +#: sql_help.c:1556 sql_help.c:1607 sql_help.c:1650 sql_help.c:1653 +#: sql_help.c:1655 sql_help.c:1657 sql_help.c:1660 sql_help.c:1662 +#: sql_help.c:1664 sql_help.c:1667 sql_help.c:1717 sql_help.c:1733 +#: sql_help.c:1964 sql_help.c:2033 sql_help.c:2052 sql_help.c:2065 +#: sql_help.c:2122 sql_help.c:2129 sql_help.c:2139 sql_help.c:2160 +#: sql_help.c:2186 sql_help.c:2204 sql_help.c:2231 sql_help.c:2328 +#: sql_help.c:2374 sql_help.c:2398 sql_help.c:2421 sql_help.c:2425 +#: sql_help.c:2459 sql_help.c:2479 sql_help.c:2501 sql_help.c:2515 +#: sql_help.c:2536 sql_help.c:2560 sql_help.c:2590 sql_help.c:2615 +#: sql_help.c:2662 sql_help.c:2950 sql_help.c:2963 sql_help.c:2980 +#: sql_help.c:2996 sql_help.c:3036 sql_help.c:3090 sql_help.c:3094 +#: sql_help.c:3096 sql_help.c:3103 sql_help.c:3122 sql_help.c:3149 +#: sql_help.c:3184 sql_help.c:3196 sql_help.c:3205 sql_help.c:3249 +#: sql_help.c:3263 sql_help.c:3291 sql_help.c:3299 sql_help.c:3311 +#: sql_help.c:3321 sql_help.c:3329 sql_help.c:3337 sql_help.c:3345 +#: sql_help.c:3353 sql_help.c:3362 sql_help.c:3373 sql_help.c:3381 +#: sql_help.c:3389 sql_help.c:3397 sql_help.c:3405 sql_help.c:3415 +#: sql_help.c:3424 sql_help.c:3433 sql_help.c:3441 sql_help.c:3451 +#: sql_help.c:3462 sql_help.c:3470 sql_help.c:3479 sql_help.c:3490 +#: sql_help.c:3499 sql_help.c:3507 sql_help.c:3515 sql_help.c:3523 +#: sql_help.c:3531 sql_help.c:3539 sql_help.c:3547 sql_help.c:3555 +#: sql_help.c:3563 sql_help.c:3571 sql_help.c:3579 sql_help.c:3596 +#: sql_help.c:3605 sql_help.c:3613 sql_help.c:3630 sql_help.c:3645 +#: sql_help.c:3947 sql_help.c:3998 sql_help.c:4027 sql_help.c:4042 +#: sql_help.c:4527 sql_help.c:4575 sql_help.c:4726 msgid "name" msgstr "назва" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1783 -#: sql_help.c:3213 sql_help.c:4193 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1814 +#: sql_help.c:3264 sql_help.c:4303 msgid "aggregate_signature" msgstr "сигнатура_агр_функції" #: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:250 -#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:524 sql_help.c:571 -#: sql_help.c:589 sql_help.c:616 sql_help.c:666 sql_help.c:731 sql_help.c:786 -#: sql_help.c:807 sql_help.c:846 sql_help.c:891 sql_help.c:932 sql_help.c:984 -#: sql_help.c:1016 sql_help.c:1026 sql_help.c:1059 sql_help.c:1079 -#: sql_help.c:1093 sql_help.c:1129 sql_help.c:1271 sql_help.c:1392 -#: sql_help.c:1435 sql_help.c:1456 sql_help.c:1470 sql_help.c:1482 -#: sql_help.c:1495 sql_help.c:1522 sql_help.c:1587 sql_help.c:1640 +#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:525 sql_help.c:573 +#: sql_help.c:591 sql_help.c:618 sql_help.c:669 sql_help.c:736 sql_help.c:791 +#: sql_help.c:812 sql_help.c:851 sql_help.c:896 sql_help.c:938 sql_help.c:991 +#: sql_help.c:1023 sql_help.c:1033 sql_help.c:1066 sql_help.c:1086 +#: sql_help.c:1100 sql_help.c:1146 sql_help.c:1289 sql_help.c:1412 +#: sql_help.c:1455 sql_help.c:1476 sql_help.c:1490 sql_help.c:1502 +#: sql_help.c:1515 sql_help.c:1542 sql_help.c:1608 sql_help.c:1661 msgid "new_name" msgstr "нова_назва" #: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:120 sql_help.c:248 -#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:529 sql_help.c:618 -#: sql_help.c:627 sql_help.c:685 sql_help.c:705 sql_help.c:734 sql_help.c:789 -#: sql_help.c:851 sql_help.c:889 sql_help.c:989 sql_help.c:1028 sql_help.c:1057 -#: sql_help.c:1077 sql_help.c:1091 sql_help.c:1127 sql_help.c:1332 -#: sql_help.c:1394 sql_help.c:1437 sql_help.c:1458 sql_help.c:1520 -#: sql_help.c:1635 sql_help.c:2889 +#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:530 sql_help.c:620 +#: sql_help.c:629 sql_help.c:690 sql_help.c:710 sql_help.c:739 sql_help.c:794 +#: sql_help.c:856 sql_help.c:894 sql_help.c:996 sql_help.c:1035 sql_help.c:1064 +#: sql_help.c:1084 sql_help.c:1098 sql_help.c:1144 sql_help.c:1352 +#: sql_help.c:1414 sql_help.c:1457 sql_help.c:1478 sql_help.c:1540 +#: sql_help.c:1656 sql_help.c:2936 msgid "new_owner" msgstr "новий_власник" #: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319 -#: sql_help.c:448 sql_help.c:534 sql_help.c:668 sql_help.c:709 sql_help.c:737 -#: sql_help.c:792 sql_help.c:856 sql_help.c:994 sql_help.c:1061 sql_help.c:1095 -#: sql_help.c:1273 sql_help.c:1439 sql_help.c:1460 sql_help.c:1472 -#: sql_help.c:1484 sql_help.c:1524 sql_help.c:1642 +#: sql_help.c:448 sql_help.c:535 sql_help.c:671 sql_help.c:714 sql_help.c:742 +#: sql_help.c:797 sql_help.c:861 sql_help.c:1001 sql_help.c:1068 +#: sql_help.c:1102 sql_help.c:1291 sql_help.c:1459 sql_help.c:1480 +#: sql_help.c:1492 sql_help.c:1504 sql_help.c:1544 sql_help.c:1663 msgid "new_schema" msgstr "нова_схема" -#: sql_help.c:44 sql_help.c:1847 sql_help.c:3214 sql_help.c:4222 +#: sql_help.c:44 sql_help.c:1878 sql_help.c:3265 sql_help.c:4332 msgid "where aggregate_signature is:" msgstr "де сигнатура_агр_функції:" #: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:337 sql_help.c:350 -#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:516 -#: sql_help.c:521 sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:838 -#: sql_help.c:843 sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:976 -#: sql_help.c:981 sql_help.c:986 sql_help.c:991 sql_help.c:996 sql_help.c:1801 -#: sql_help.c:1818 sql_help.c:1824 sql_help.c:1848 sql_help.c:1851 -#: sql_help.c:1854 sql_help.c:2003 sql_help.c:2022 sql_help.c:2025 -#: sql_help.c:2296 sql_help.c:2502 sql_help.c:3215 sql_help.c:3218 -#: sql_help.c:3221 sql_help.c:3312 sql_help.c:3401 sql_help.c:3429 -#: sql_help.c:3753 sql_help.c:4101 sql_help.c:4199 sql_help.c:4206 -#: sql_help.c:4212 sql_help.c:4223 sql_help.c:4226 sql_help.c:4229 +#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:517 +#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:843 +#: sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:863 sql_help.c:983 +#: sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1003 sql_help.c:1832 +#: sql_help.c:1849 sql_help.c:1855 sql_help.c:1879 sql_help.c:1882 +#: sql_help.c:1885 sql_help.c:2034 sql_help.c:2053 sql_help.c:2056 +#: sql_help.c:2329 sql_help.c:2537 sql_help.c:3266 sql_help.c:3269 +#: sql_help.c:3272 sql_help.c:3363 sql_help.c:3452 sql_help.c:3480 +#: sql_help.c:3825 sql_help.c:4205 sql_help.c:4309 sql_help.c:4316 +#: sql_help.c:4322 sql_help.c:4333 sql_help.c:4336 sql_help.c:4339 msgid "argmode" msgstr "режим_аргументу" #: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:338 sql_help.c:351 -#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:839 -#: sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:977 -#: sql_help.c:982 sql_help.c:987 sql_help.c:992 sql_help.c:997 sql_help.c:1802 -#: sql_help.c:1819 sql_help.c:1825 sql_help.c:1849 sql_help.c:1852 -#: sql_help.c:1855 sql_help.c:2004 sql_help.c:2023 sql_help.c:2026 -#: sql_help.c:2297 sql_help.c:2503 sql_help.c:3216 sql_help.c:3219 -#: sql_help.c:3222 sql_help.c:3313 sql_help.c:3402 sql_help.c:3430 -#: sql_help.c:4200 sql_help.c:4207 sql_help.c:4213 sql_help.c:4224 -#: sql_help.c:4227 sql_help.c:4230 +#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:518 +#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:844 +#: sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:864 sql_help.c:984 +#: sql_help.c:989 sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1833 +#: sql_help.c:1850 sql_help.c:1856 sql_help.c:1880 sql_help.c:1883 +#: sql_help.c:1886 sql_help.c:2035 sql_help.c:2054 sql_help.c:2057 +#: sql_help.c:2330 sql_help.c:2538 sql_help.c:3267 sql_help.c:3270 +#: sql_help.c:3273 sql_help.c:3364 sql_help.c:3453 sql_help.c:3481 +#: sql_help.c:4310 sql_help.c:4317 sql_help.c:4323 sql_help.c:4334 +#: sql_help.c:4337 sql_help.c:4340 msgid "argname" msgstr "ім'я_аргументу" #: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:339 sql_help.c:352 -#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:840 -#: sql_help.c:845 sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:978 -#: sql_help.c:983 sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1803 -#: sql_help.c:1820 sql_help.c:1826 sql_help.c:1850 sql_help.c:1853 -#: sql_help.c:1856 sql_help.c:2298 sql_help.c:2504 sql_help.c:3217 -#: sql_help.c:3220 sql_help.c:3223 sql_help.c:3314 sql_help.c:3403 -#: sql_help.c:3431 sql_help.c:4201 sql_help.c:4208 sql_help.c:4214 -#: sql_help.c:4225 sql_help.c:4228 sql_help.c:4231 +#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:519 +#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:845 +#: sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:985 +#: sql_help.c:990 sql_help.c:995 sql_help.c:1000 sql_help.c:1005 +#: sql_help.c:1834 sql_help.c:1851 sql_help.c:1857 sql_help.c:1881 +#: sql_help.c:1884 sql_help.c:1887 sql_help.c:2331 sql_help.c:2539 +#: sql_help.c:3268 sql_help.c:3271 sql_help.c:3274 sql_help.c:3365 +#: sql_help.c:3454 sql_help.c:3482 sql_help.c:4311 sql_help.c:4318 +#: sql_help.c:4324 sql_help.c:4335 sql_help.c:4338 sql_help.c:4341 msgid "argtype" msgstr "тип_аргументу" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:926 -#: sql_help.c:1074 sql_help.c:1453 sql_help.c:1581 sql_help.c:1613 -#: sql_help.c:1665 sql_help.c:1904 sql_help.c:1911 sql_help.c:2203 -#: sql_help.c:2245 sql_help.c:2252 sql_help.c:2261 sql_help.c:2341 -#: sql_help.c:2555 sql_help.c:2647 sql_help.c:2918 sql_help.c:3099 -#: sql_help.c:3121 sql_help.c:3261 sql_help.c:3616 sql_help.c:3788 -#: sql_help.c:3961 sql_help.c:4658 +#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:932 +#: sql_help.c:1081 sql_help.c:1473 sql_help.c:1602 sql_help.c:1634 +#: sql_help.c:1686 sql_help.c:1749 sql_help.c:1935 sql_help.c:1942 +#: sql_help.c:2234 sql_help.c:2276 sql_help.c:2283 sql_help.c:2292 +#: sql_help.c:2375 sql_help.c:2591 sql_help.c:2684 sql_help.c:2965 +#: sql_help.c:3150 sql_help.c:3172 sql_help.c:3312 sql_help.c:3667 +#: sql_help.c:3866 sql_help.c:4041 sql_help.c:4789 msgid "option" msgstr "параметр" -#: sql_help.c:113 sql_help.c:927 sql_help.c:1582 sql_help.c:2342 -#: sql_help.c:2556 sql_help.c:3100 sql_help.c:3262 +#: sql_help.c:113 sql_help.c:933 sql_help.c:1603 sql_help.c:2376 +#: sql_help.c:2592 sql_help.c:3151 sql_help.c:3313 msgid "where option can be:" msgstr "де параметр може бути:" -#: sql_help.c:114 sql_help.c:2137 +#: sql_help.c:114 sql_help.c:2168 msgid "allowconn" msgstr "дозвол_підкл" -#: sql_help.c:115 sql_help.c:928 sql_help.c:1583 sql_help.c:2138 -#: sql_help.c:2343 sql_help.c:2557 sql_help.c:3101 +#: sql_help.c:115 sql_help.c:934 sql_help.c:1604 sql_help.c:2169 +#: sql_help.c:2377 sql_help.c:2593 sql_help.c:3152 msgid "connlimit" msgstr "ліміт_підключень" -#: sql_help.c:116 sql_help.c:2139 +#: sql_help.c:116 sql_help.c:2170 msgid "istemplate" msgstr "чи_шаблон" -#: sql_help.c:122 sql_help.c:606 sql_help.c:671 sql_help.c:1276 sql_help.c:1325 +#: sql_help.c:122 sql_help.c:608 sql_help.c:674 sql_help.c:1294 sql_help.c:1345 +#: sql_help.c:4045 msgid "new_tablespace" msgstr "новий_табл_простір" -#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:544 sql_help.c:546 -#: sql_help.c:547 sql_help.c:863 sql_help.c:865 sql_help.c:866 sql_help.c:935 -#: sql_help.c:939 sql_help.c:942 sql_help.c:1003 sql_help.c:1005 -#: sql_help.c:1006 sql_help.c:1140 sql_help.c:1143 sql_help.c:1590 -#: sql_help.c:1594 sql_help.c:1597 sql_help.c:2308 sql_help.c:2508 -#: sql_help.c:3980 sql_help.c:4396 +#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:545 sql_help.c:547 +#: sql_help.c:548 sql_help.c:868 sql_help.c:870 sql_help.c:871 sql_help.c:941 +#: sql_help.c:945 sql_help.c:948 sql_help.c:1010 sql_help.c:1012 +#: sql_help.c:1013 sql_help.c:1157 sql_help.c:1160 sql_help.c:1611 +#: sql_help.c:1615 sql_help.c:1618 sql_help.c:2341 sql_help.c:2543 +#: sql_help.c:4063 sql_help.c:4516 msgid "configuration_parameter" msgstr "параметр_конфігурації" #: sql_help.c:125 sql_help.c:395 sql_help.c:466 sql_help.c:472 sql_help.c:484 -#: sql_help.c:545 sql_help.c:598 sql_help.c:677 sql_help.c:683 sql_help.c:864 -#: sql_help.c:887 sql_help.c:936 sql_help.c:1004 sql_help.c:1075 -#: sql_help.c:1117 sql_help.c:1120 sql_help.c:1125 sql_help.c:1141 -#: sql_help.c:1142 sql_help.c:1307 sql_help.c:1327 sql_help.c:1375 -#: sql_help.c:1397 sql_help.c:1454 sql_help.c:1538 sql_help.c:1591 -#: sql_help.c:1614 sql_help.c:2204 sql_help.c:2246 sql_help.c:2253 -#: sql_help.c:2262 sql_help.c:2309 sql_help.c:2310 sql_help.c:2372 -#: sql_help.c:2375 sql_help.c:2409 sql_help.c:2509 sql_help.c:2510 -#: sql_help.c:2527 sql_help.c:2648 sql_help.c:2678 sql_help.c:2783 -#: sql_help.c:2796 sql_help.c:2810 sql_help.c:2851 sql_help.c:2875 -#: sql_help.c:2892 sql_help.c:2919 sql_help.c:3122 sql_help.c:3789 -#: sql_help.c:4397 sql_help.c:4398 +#: sql_help.c:546 sql_help.c:600 sql_help.c:680 sql_help.c:688 sql_help.c:869 +#: sql_help.c:892 sql_help.c:942 sql_help.c:1011 sql_help.c:1082 +#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:1137 +#: sql_help.c:1142 sql_help.c:1158 sql_help.c:1159 sql_help.c:1325 +#: sql_help.c:1347 sql_help.c:1395 sql_help.c:1417 sql_help.c:1474 +#: sql_help.c:1558 sql_help.c:1612 sql_help.c:1635 sql_help.c:2235 +#: sql_help.c:2277 sql_help.c:2284 sql_help.c:2293 sql_help.c:2342 +#: sql_help.c:2343 sql_help.c:2406 sql_help.c:2409 sql_help.c:2443 +#: sql_help.c:2544 sql_help.c:2545 sql_help.c:2563 sql_help.c:2685 +#: sql_help.c:2724 sql_help.c:2830 sql_help.c:2843 sql_help.c:2857 +#: sql_help.c:2898 sql_help.c:2922 sql_help.c:2939 sql_help.c:2966 +#: sql_help.c:3173 sql_help.c:3867 sql_help.c:4517 sql_help.c:4518 msgid "value" msgstr "значення" @@ -4044,9 +4110,9 @@ msgstr "значення" msgid "target_role" msgstr "цільова_роль" -#: sql_help.c:198 sql_help.c:2188 sql_help.c:2603 sql_help.c:2608 -#: sql_help.c:3735 sql_help.c:3742 sql_help.c:3756 sql_help.c:3762 -#: sql_help.c:4083 sql_help.c:4090 sql_help.c:4104 sql_help.c:4110 +#: sql_help.c:198 sql_help.c:2219 sql_help.c:2640 sql_help.c:2645 +#: sql_help.c:3800 sql_help.c:3809 sql_help.c:3828 sql_help.c:3837 +#: sql_help.c:4180 sql_help.c:4189 sql_help.c:4208 sql_help.c:4217 msgid "schema_name" msgstr "ім'я_схеми" @@ -4060,30 +4126,31 @@ msgstr "де скорочено_GRANT_або_REVOKE є одним з:" #: sql_help.c:201 sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205 #: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 -#: sql_help.c:569 sql_help.c:605 sql_help.c:670 sql_help.c:810 sql_help.c:946 -#: sql_help.c:1275 sql_help.c:1601 sql_help.c:2346 sql_help.c:2347 -#: sql_help.c:2348 sql_help.c:2349 sql_help.c:2350 sql_help.c:2483 -#: sql_help.c:2560 sql_help.c:2561 sql_help.c:2562 sql_help.c:2563 -#: sql_help.c:2564 sql_help.c:3104 sql_help.c:3105 sql_help.c:3106 -#: sql_help.c:3107 sql_help.c:3108 sql_help.c:3768 sql_help.c:3772 -#: sql_help.c:4116 sql_help.c:4120 sql_help.c:4417 +#: sql_help.c:571 sql_help.c:607 sql_help.c:673 sql_help.c:815 sql_help.c:952 +#: sql_help.c:1293 sql_help.c:1622 sql_help.c:2380 sql_help.c:2381 +#: sql_help.c:2382 sql_help.c:2383 sql_help.c:2384 sql_help.c:2517 +#: sql_help.c:2596 sql_help.c:2597 sql_help.c:2598 sql_help.c:2599 +#: sql_help.c:2600 sql_help.c:3155 sql_help.c:3156 sql_help.c:3157 +#: sql_help.c:3158 sql_help.c:3159 sql_help.c:3846 sql_help.c:3850 +#: sql_help.c:4226 sql_help.c:4230 sql_help.c:4537 msgid "role_name" msgstr "ім'я_ролі" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1291 sql_help.c:1293 -#: sql_help.c:1342 sql_help.c:1354 sql_help.c:1379 sql_help.c:1631 -#: sql_help.c:2158 sql_help.c:2162 sql_help.c:2265 sql_help.c:2270 -#: sql_help.c:2368 sql_help.c:2778 sql_help.c:2791 sql_help.c:2805 -#: sql_help.c:2814 sql_help.c:2826 sql_help.c:2855 sql_help.c:3820 -#: sql_help.c:3835 sql_help.c:3837 sql_help.c:4282 sql_help.c:4283 -#: sql_help.c:4292 sql_help.c:4333 sql_help.c:4334 sql_help.c:4335 -#: sql_help.c:4336 sql_help.c:4337 sql_help.c:4338 sql_help.c:4371 -#: sql_help.c:4372 sql_help.c:4377 sql_help.c:4382 sql_help.c:4521 -#: sql_help.c:4522 sql_help.c:4531 sql_help.c:4572 sql_help.c:4573 -#: sql_help.c:4574 sql_help.c:4575 sql_help.c:4576 sql_help.c:4577 -#: sql_help.c:4624 sql_help.c:4626 sql_help.c:4685 sql_help.c:4741 -#: sql_help.c:4742 sql_help.c:4751 sql_help.c:4792 sql_help.c:4793 -#: sql_help.c:4794 sql_help.c:4795 sql_help.c:4796 sql_help.c:4797 +#: sql_help.c:236 sql_help.c:459 sql_help.c:1309 sql_help.c:1311 +#: sql_help.c:1362 sql_help.c:1374 sql_help.c:1399 sql_help.c:1652 +#: sql_help.c:2189 sql_help.c:2193 sql_help.c:2296 sql_help.c:2301 +#: sql_help.c:2402 sql_help.c:2701 sql_help.c:2706 sql_help.c:2708 +#: sql_help.c:2825 sql_help.c:2838 sql_help.c:2852 sql_help.c:2861 +#: sql_help.c:2873 sql_help.c:2902 sql_help.c:3898 sql_help.c:3913 +#: sql_help.c:3915 sql_help.c:4394 sql_help.c:4395 sql_help.c:4404 +#: sql_help.c:4446 sql_help.c:4447 sql_help.c:4448 sql_help.c:4449 +#: sql_help.c:4450 sql_help.c:4451 sql_help.c:4491 sql_help.c:4492 +#: sql_help.c:4497 sql_help.c:4502 sql_help.c:4643 sql_help.c:4644 +#: sql_help.c:4653 sql_help.c:4695 sql_help.c:4696 sql_help.c:4697 +#: sql_help.c:4698 sql_help.c:4699 sql_help.c:4700 sql_help.c:4754 +#: sql_help.c:4756 sql_help.c:4816 sql_help.c:4874 sql_help.c:4875 +#: sql_help.c:4884 sql_help.c:4926 sql_help.c:4927 sql_help.c:4928 +#: sql_help.c:4929 sql_help.c:4930 sql_help.c:4931 msgid "expression" msgstr "вираз" @@ -4092,18 +4159,18 @@ msgid "domain_constraint" msgstr "обмеження_домену" #: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475 -#: sql_help.c:1268 sql_help.c:1313 sql_help.c:1314 sql_help.c:1315 -#: sql_help.c:1341 sql_help.c:1353 sql_help.c:1370 sql_help.c:1789 -#: sql_help.c:1791 sql_help.c:2161 sql_help.c:2264 sql_help.c:2269 -#: sql_help.c:2813 sql_help.c:2825 sql_help.c:3832 +#: sql_help.c:1286 sql_help.c:1333 sql_help.c:1334 sql_help.c:1335 +#: sql_help.c:1361 sql_help.c:1373 sql_help.c:1390 sql_help.c:1820 +#: sql_help.c:1822 sql_help.c:2192 sql_help.c:2295 sql_help.c:2300 +#: sql_help.c:2860 sql_help.c:2872 sql_help.c:3910 msgid "constraint_name" msgstr "ім'я_обмеження" -#: sql_help.c:244 sql_help.c:1269 +#: sql_help.c:244 sql_help.c:1287 msgid "new_constraint_name" msgstr "ім'я_нового_обмеження" -#: sql_help.c:317 sql_help.c:1073 +#: sql_help.c:317 sql_help.c:1080 msgid "new_version" msgstr "нова_версія" @@ -4119,82 +4186,82 @@ msgstr "де елемент_об'єкт є:" #: sql_help.c:334 sql_help.c:335 sql_help.c:340 sql_help.c:344 sql_help.c:346 #: sql_help.c:348 sql_help.c:357 sql_help.c:358 sql_help.c:359 sql_help.c:360 #: sql_help.c:361 sql_help.c:362 sql_help.c:363 sql_help.c:364 sql_help.c:367 -#: sql_help.c:368 sql_help.c:1781 sql_help.c:1786 sql_help.c:1793 -#: sql_help.c:1794 sql_help.c:1795 sql_help.c:1796 sql_help.c:1797 -#: sql_help.c:1798 sql_help.c:1799 sql_help.c:1804 sql_help.c:1806 -#: sql_help.c:1810 sql_help.c:1812 sql_help.c:1816 sql_help.c:1821 -#: sql_help.c:1822 sql_help.c:1829 sql_help.c:1830 sql_help.c:1831 -#: sql_help.c:1832 sql_help.c:1833 sql_help.c:1834 sql_help.c:1835 -#: sql_help.c:1836 sql_help.c:1837 sql_help.c:1838 sql_help.c:1839 -#: sql_help.c:1844 sql_help.c:1845 sql_help.c:4189 sql_help.c:4194 -#: sql_help.c:4195 sql_help.c:4196 sql_help.c:4197 sql_help.c:4203 -#: sql_help.c:4204 sql_help.c:4209 sql_help.c:4210 sql_help.c:4215 -#: sql_help.c:4216 sql_help.c:4217 sql_help.c:4218 sql_help.c:4219 -#: sql_help.c:4220 +#: sql_help.c:368 sql_help.c:1812 sql_help.c:1817 sql_help.c:1824 +#: sql_help.c:1825 sql_help.c:1826 sql_help.c:1827 sql_help.c:1828 +#: sql_help.c:1829 sql_help.c:1830 sql_help.c:1835 sql_help.c:1837 +#: sql_help.c:1841 sql_help.c:1843 sql_help.c:1847 sql_help.c:1852 +#: sql_help.c:1853 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862 +#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1865 sql_help.c:1866 +#: sql_help.c:1867 sql_help.c:1868 sql_help.c:1869 sql_help.c:1870 +#: sql_help.c:1875 sql_help.c:1876 sql_help.c:4299 sql_help.c:4304 +#: sql_help.c:4305 sql_help.c:4306 sql_help.c:4307 sql_help.c:4313 +#: sql_help.c:4314 sql_help.c:4319 sql_help.c:4320 sql_help.c:4325 +#: sql_help.c:4326 sql_help.c:4327 sql_help.c:4328 sql_help.c:4329 +#: sql_help.c:4330 msgid "object_name" msgstr "ім'я_об'єкту" -#: sql_help.c:326 sql_help.c:1782 sql_help.c:4192 +#: sql_help.c:326 sql_help.c:1813 sql_help.c:4302 msgid "aggregate_name" msgstr "ім'я_агр_функції" -#: sql_help.c:328 sql_help.c:1784 sql_help.c:2068 sql_help.c:2072 -#: sql_help.c:2074 sql_help.c:3231 +#: sql_help.c:328 sql_help.c:1815 sql_help.c:2099 sql_help.c:2103 +#: sql_help.c:2105 sql_help.c:3282 msgid "source_type" msgstr "початковий_тип" -#: sql_help.c:329 sql_help.c:1785 sql_help.c:2069 sql_help.c:2073 -#: sql_help.c:2075 sql_help.c:3232 +#: sql_help.c:329 sql_help.c:1816 sql_help.c:2100 sql_help.c:2104 +#: sql_help.c:2106 sql_help.c:3283 msgid "target_type" msgstr "тип_цілі" -#: sql_help.c:336 sql_help.c:774 sql_help.c:1800 sql_help.c:2070 -#: sql_help.c:2111 sql_help.c:2176 sql_help.c:2426 sql_help.c:2457 -#: sql_help.c:2995 sql_help.c:4100 sql_help.c:4198 sql_help.c:4311 -#: sql_help.c:4315 sql_help.c:4319 sql_help.c:4322 sql_help.c:4550 -#: sql_help.c:4554 sql_help.c:4558 sql_help.c:4561 sql_help.c:4770 -#: sql_help.c:4774 sql_help.c:4778 sql_help.c:4781 +#: sql_help.c:336 sql_help.c:779 sql_help.c:1831 sql_help.c:2101 +#: sql_help.c:2142 sql_help.c:2207 sql_help.c:2460 sql_help.c:2491 +#: sql_help.c:3042 sql_help.c:4204 sql_help.c:4308 sql_help.c:4423 +#: sql_help.c:4427 sql_help.c:4431 sql_help.c:4434 sql_help.c:4672 +#: sql_help.c:4676 sql_help.c:4680 sql_help.c:4683 sql_help.c:4903 +#: sql_help.c:4907 sql_help.c:4911 sql_help.c:4914 msgid "function_name" msgstr "ім'я_функції" -#: sql_help.c:341 sql_help.c:767 sql_help.c:1807 sql_help.c:2450 +#: sql_help.c:341 sql_help.c:772 sql_help.c:1838 sql_help.c:2484 msgid "operator_name" msgstr "ім'я_оператора" -#: sql_help.c:342 sql_help.c:703 sql_help.c:707 sql_help.c:711 sql_help.c:1808 -#: sql_help.c:2427 sql_help.c:3355 +#: sql_help.c:342 sql_help.c:708 sql_help.c:712 sql_help.c:716 sql_help.c:1839 +#: sql_help.c:2461 sql_help.c:3406 msgid "left_type" msgstr "тип_ліворуч" -#: sql_help.c:343 sql_help.c:704 sql_help.c:708 sql_help.c:712 sql_help.c:1809 -#: sql_help.c:2428 sql_help.c:3356 +#: sql_help.c:343 sql_help.c:709 sql_help.c:713 sql_help.c:717 sql_help.c:1840 +#: sql_help.c:2462 sql_help.c:3407 msgid "right_type" msgstr "тип_праворуч" -#: sql_help.c:345 sql_help.c:347 sql_help.c:730 sql_help.c:733 sql_help.c:736 -#: sql_help.c:765 sql_help.c:777 sql_help.c:785 sql_help.c:788 sql_help.c:791 -#: sql_help.c:1359 sql_help.c:1811 sql_help.c:1813 sql_help.c:2447 -#: sql_help.c:2468 sql_help.c:2831 sql_help.c:3365 sql_help.c:3374 +#: sql_help.c:345 sql_help.c:347 sql_help.c:735 sql_help.c:738 sql_help.c:741 +#: sql_help.c:770 sql_help.c:782 sql_help.c:790 sql_help.c:793 sql_help.c:796 +#: sql_help.c:1379 sql_help.c:1842 sql_help.c:1844 sql_help.c:2481 +#: sql_help.c:2502 sql_help.c:2878 sql_help.c:3416 sql_help.c:3425 msgid "index_method" msgstr "метод_індексу" -#: sql_help.c:349 sql_help.c:1817 sql_help.c:4205 +#: sql_help.c:349 sql_help.c:1848 sql_help.c:4315 msgid "procedure_name" msgstr "назва_процедури" -#: sql_help.c:353 sql_help.c:1823 sql_help.c:3752 sql_help.c:4211 +#: sql_help.c:353 sql_help.c:1854 sql_help.c:3824 sql_help.c:4321 msgid "routine_name" msgstr "ім'я_підпрограми" -#: sql_help.c:365 sql_help.c:1331 sql_help.c:1840 sql_help.c:2304 -#: sql_help.c:2507 sql_help.c:2786 sql_help.c:2962 sql_help.c:3536 -#: sql_help.c:3766 sql_help.c:4114 +#: sql_help.c:365 sql_help.c:1351 sql_help.c:1871 sql_help.c:2337 +#: sql_help.c:2542 sql_help.c:2833 sql_help.c:3009 sql_help.c:3587 +#: sql_help.c:3843 sql_help.c:4223 msgid "type_name" msgstr "назва_типу" -#: sql_help.c:366 sql_help.c:1841 sql_help.c:2303 sql_help.c:2506 -#: sql_help.c:2963 sql_help.c:3189 sql_help.c:3537 sql_help.c:3758 -#: sql_help.c:4106 +#: sql_help.c:366 sql_help.c:1872 sql_help.c:2336 sql_help.c:2541 +#: sql_help.c:3010 sql_help.c:3240 sql_help.c:3588 sql_help.c:3831 +#: sql_help.c:4211 msgid "lang_name" msgstr "назва_мови" @@ -4202,1929 +4269,1972 @@ msgstr "назва_мови" msgid "and aggregate_signature is:" msgstr "і сигнатура_агр_функції:" -#: sql_help.c:392 sql_help.c:1935 sql_help.c:2201 +#: sql_help.c:392 sql_help.c:1966 sql_help.c:2232 msgid "handler_function" msgstr "функція_обробник" -#: sql_help.c:393 sql_help.c:2202 +#: sql_help.c:393 sql_help.c:2233 msgid "validator_function" msgstr "функція_перевірки" -#: sql_help.c:441 sql_help.c:519 sql_help.c:659 sql_help.c:841 sql_help.c:979 -#: sql_help.c:1263 sql_help.c:1529 +#: sql_help.c:441 sql_help.c:520 sql_help.c:662 sql_help.c:846 sql_help.c:986 +#: sql_help.c:1281 sql_help.c:1549 msgid "action" msgstr "дія" #: sql_help.c:443 sql_help.c:450 sql_help.c:454 sql_help.c:455 sql_help.c:458 #: sql_help.c:460 sql_help.c:461 sql_help.c:462 sql_help.c:464 sql_help.c:467 -#: sql_help.c:469 sql_help.c:470 sql_help.c:663 sql_help.c:673 sql_help.c:675 -#: sql_help.c:678 sql_help.c:680 sql_help.c:1055 sql_help.c:1265 -#: sql_help.c:1283 sql_help.c:1287 sql_help.c:1288 sql_help.c:1292 -#: sql_help.c:1294 sql_help.c:1295 sql_help.c:1296 sql_help.c:1297 -#: sql_help.c:1299 sql_help.c:1302 sql_help.c:1303 sql_help.c:1305 -#: sql_help.c:1308 sql_help.c:1310 sql_help.c:1355 sql_help.c:1357 -#: sql_help.c:1364 sql_help.c:1373 sql_help.c:1378 sql_help.c:1630 -#: sql_help.c:1633 sql_help.c:1637 sql_help.c:1673 sql_help.c:1788 -#: sql_help.c:1901 sql_help.c:1907 sql_help.c:1920 sql_help.c:1921 -#: sql_help.c:1922 sql_help.c:2243 sql_help.c:2256 sql_help.c:2301 -#: sql_help.c:2367 sql_help.c:2373 sql_help.c:2406 sql_help.c:2633 -#: sql_help.c:2661 sql_help.c:2662 sql_help.c:2769 sql_help.c:2777 -#: sql_help.c:2787 sql_help.c:2790 sql_help.c:2800 sql_help.c:2804 -#: sql_help.c:2827 sql_help.c:2829 sql_help.c:2836 sql_help.c:2849 -#: sql_help.c:2854 sql_help.c:2872 sql_help.c:2998 sql_help.c:3134 -#: sql_help.c:3737 sql_help.c:3738 sql_help.c:3819 sql_help.c:3834 -#: sql_help.c:3836 sql_help.c:3838 sql_help.c:4085 sql_help.c:4086 -#: sql_help.c:4191 sql_help.c:4342 sql_help.c:4581 sql_help.c:4623 -#: sql_help.c:4625 sql_help.c:4627 sql_help.c:4673 sql_help.c:4801 +#: sql_help.c:469 sql_help.c:470 sql_help.c:666 sql_help.c:676 sql_help.c:678 +#: sql_help.c:681 sql_help.c:683 sql_help.c:684 sql_help.c:1062 sql_help.c:1283 +#: sql_help.c:1301 sql_help.c:1305 sql_help.c:1306 sql_help.c:1310 +#: sql_help.c:1312 sql_help.c:1313 sql_help.c:1314 sql_help.c:1315 +#: sql_help.c:1317 sql_help.c:1320 sql_help.c:1321 sql_help.c:1323 +#: sql_help.c:1326 sql_help.c:1328 sql_help.c:1329 sql_help.c:1375 +#: sql_help.c:1377 sql_help.c:1384 sql_help.c:1393 sql_help.c:1398 +#: sql_help.c:1651 sql_help.c:1654 sql_help.c:1658 sql_help.c:1694 +#: sql_help.c:1819 sql_help.c:1932 sql_help.c:1938 sql_help.c:1951 +#: sql_help.c:1952 sql_help.c:1953 sql_help.c:2274 sql_help.c:2287 +#: sql_help.c:2334 sql_help.c:2401 sql_help.c:2407 sql_help.c:2440 +#: sql_help.c:2670 sql_help.c:2705 sql_help.c:2707 sql_help.c:2815 +#: sql_help.c:2824 sql_help.c:2834 sql_help.c:2837 sql_help.c:2847 +#: sql_help.c:2851 sql_help.c:2874 sql_help.c:2876 sql_help.c:2883 +#: sql_help.c:2896 sql_help.c:2901 sql_help.c:2919 sql_help.c:3045 +#: sql_help.c:3185 sql_help.c:3803 sql_help.c:3804 sql_help.c:3897 +#: sql_help.c:3912 sql_help.c:3914 sql_help.c:3916 sql_help.c:4183 +#: sql_help.c:4184 sql_help.c:4301 sql_help.c:4455 sql_help.c:4461 +#: sql_help.c:4463 sql_help.c:4704 sql_help.c:4710 sql_help.c:4712 +#: sql_help.c:4753 sql_help.c:4755 sql_help.c:4757 sql_help.c:4804 +#: sql_help.c:4935 sql_help.c:4941 sql_help.c:4943 msgid "column_name" msgstr "назва_стовпця" -#: sql_help.c:444 sql_help.c:664 sql_help.c:1266 sql_help.c:1638 +#: sql_help.c:444 sql_help.c:667 sql_help.c:1284 sql_help.c:1659 msgid "new_column_name" msgstr "нова_назва_стовпця" -#: sql_help.c:449 sql_help.c:540 sql_help.c:672 sql_help.c:862 sql_help.c:1000 -#: sql_help.c:1282 sql_help.c:1539 +#: sql_help.c:449 sql_help.c:541 sql_help.c:675 sql_help.c:867 sql_help.c:1007 +#: sql_help.c:1300 sql_help.c:1559 msgid "where action is one of:" msgstr "де допустима дія:" -#: sql_help.c:451 sql_help.c:456 sql_help.c:1047 sql_help.c:1284 -#: sql_help.c:1289 sql_help.c:1541 sql_help.c:1545 sql_help.c:2156 -#: sql_help.c:2244 sql_help.c:2446 sql_help.c:2626 sql_help.c:2770 -#: sql_help.c:3043 sql_help.c:3921 +#: sql_help.c:451 sql_help.c:456 sql_help.c:1054 sql_help.c:1302 +#: sql_help.c:1307 sql_help.c:1561 sql_help.c:1565 sql_help.c:2187 +#: sql_help.c:2275 sql_help.c:2480 sql_help.c:2663 sql_help.c:2816 +#: sql_help.c:3092 sql_help.c:3999 msgid "data_type" msgstr "тип_даних" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1285 sql_help.c:1290 -#: sql_help.c:1542 sql_help.c:1546 sql_help.c:2157 sql_help.c:2247 -#: sql_help.c:2369 sql_help.c:2771 sql_help.c:2779 sql_help.c:2792 -#: sql_help.c:2806 sql_help.c:3044 sql_help.c:3050 sql_help.c:3829 +#: sql_help.c:452 sql_help.c:457 sql_help.c:1303 sql_help.c:1308 +#: sql_help.c:1562 sql_help.c:1566 sql_help.c:2188 sql_help.c:2278 +#: sql_help.c:2403 sql_help.c:2818 sql_help.c:2826 sql_help.c:2839 +#: sql_help.c:2853 sql_help.c:3093 sql_help.c:3099 sql_help.c:3907 msgid "collation" msgstr "правила_сортування" -#: sql_help.c:453 sql_help.c:1286 sql_help.c:2248 sql_help.c:2257 -#: sql_help.c:2772 sql_help.c:2788 sql_help.c:2801 +#: sql_help.c:453 sql_help.c:1304 sql_help.c:2279 sql_help.c:2288 +#: sql_help.c:2819 sql_help.c:2835 sql_help.c:2848 msgid "column_constraint" msgstr "обмеження_стовпця" -#: sql_help.c:463 sql_help.c:603 sql_help.c:674 sql_help.c:1304 sql_help.c:4670 +#: sql_help.c:463 sql_help.c:605 sql_help.c:677 sql_help.c:1322 sql_help.c:4801 msgid "integer" msgstr "ціле" -#: sql_help.c:465 sql_help.c:468 sql_help.c:676 sql_help.c:679 sql_help.c:1306 -#: sql_help.c:1309 +#: sql_help.c:465 sql_help.c:468 sql_help.c:679 sql_help.c:682 sql_help.c:1324 +#: sql_help.c:1327 msgid "attribute_option" msgstr "параметр_атрибуту" -#: sql_help.c:473 sql_help.c:1311 sql_help.c:2249 sql_help.c:2258 -#: sql_help.c:2773 sql_help.c:2789 sql_help.c:2802 +#: sql_help.c:473 sql_help.c:1331 sql_help.c:2280 sql_help.c:2289 +#: sql_help.c:2820 sql_help.c:2836 sql_help.c:2849 msgid "table_constraint" msgstr "обмеження_таблиці" -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1316 -#: sql_help.c:1317 sql_help.c:1318 sql_help.c:1319 sql_help.c:1842 +#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1336 +#: sql_help.c:1337 sql_help.c:1338 sql_help.c:1339 sql_help.c:1873 msgid "trigger_name" msgstr "ім'я_тригеру" -#: sql_help.c:480 sql_help.c:481 sql_help.c:1329 sql_help.c:1330 -#: sql_help.c:2250 sql_help.c:2255 sql_help.c:2776 sql_help.c:2799 +#: sql_help.c:480 sql_help.c:481 sql_help.c:1349 sql_help.c:1350 +#: sql_help.c:2281 sql_help.c:2286 sql_help.c:2823 sql_help.c:2846 msgid "parent_table" msgstr "батьківська_таблиця" -#: sql_help.c:539 sql_help.c:595 sql_help.c:661 sql_help.c:861 sql_help.c:999 -#: sql_help.c:1498 sql_help.c:2187 +#: sql_help.c:540 sql_help.c:597 sql_help.c:664 sql_help.c:866 sql_help.c:1006 +#: sql_help.c:1518 sql_help.c:2218 msgid "extension_name" msgstr "ім'я_розширення" -#: sql_help.c:541 sql_help.c:1001 sql_help.c:2305 +#: sql_help.c:542 sql_help.c:1008 sql_help.c:2338 msgid "execution_cost" msgstr "вартість_виконання" -#: sql_help.c:542 sql_help.c:1002 sql_help.c:2306 +#: sql_help.c:543 sql_help.c:1009 sql_help.c:2339 msgid "result_rows" msgstr "рядки_результату" -#: sql_help.c:543 sql_help.c:2307 +#: sql_help.c:544 sql_help.c:2340 msgid "support_function" msgstr "функція_підтримки" -#: sql_help.c:564 sql_help.c:566 sql_help.c:925 sql_help.c:933 sql_help.c:937 -#: sql_help.c:940 sql_help.c:943 sql_help.c:1580 sql_help.c:1588 -#: sql_help.c:1592 sql_help.c:1595 sql_help.c:1598 sql_help.c:2604 -#: sql_help.c:2606 sql_help.c:2609 sql_help.c:2610 sql_help.c:3736 -#: sql_help.c:3740 sql_help.c:3743 sql_help.c:3745 sql_help.c:3747 -#: sql_help.c:3749 sql_help.c:3751 sql_help.c:3757 sql_help.c:3759 -#: sql_help.c:3761 sql_help.c:3763 sql_help.c:3765 sql_help.c:3767 -#: sql_help.c:3769 sql_help.c:3770 sql_help.c:4084 sql_help.c:4088 -#: sql_help.c:4091 sql_help.c:4093 sql_help.c:4095 sql_help.c:4097 -#: sql_help.c:4099 sql_help.c:4105 sql_help.c:4107 sql_help.c:4109 -#: sql_help.c:4111 sql_help.c:4113 sql_help.c:4115 sql_help.c:4117 -#: sql_help.c:4118 +#: sql_help.c:566 sql_help.c:568 sql_help.c:931 sql_help.c:939 sql_help.c:943 +#: sql_help.c:946 sql_help.c:949 sql_help.c:1601 sql_help.c:1609 +#: sql_help.c:1613 sql_help.c:1616 sql_help.c:1619 sql_help.c:2641 +#: sql_help.c:2643 sql_help.c:2646 sql_help.c:2647 sql_help.c:3801 +#: sql_help.c:3802 sql_help.c:3806 sql_help.c:3807 sql_help.c:3810 +#: sql_help.c:3811 sql_help.c:3813 sql_help.c:3814 sql_help.c:3816 +#: sql_help.c:3817 sql_help.c:3819 sql_help.c:3820 sql_help.c:3822 +#: sql_help.c:3823 sql_help.c:3829 sql_help.c:3830 sql_help.c:3832 +#: sql_help.c:3833 sql_help.c:3835 sql_help.c:3836 sql_help.c:3838 +#: sql_help.c:3839 sql_help.c:3841 sql_help.c:3842 sql_help.c:3844 +#: sql_help.c:3845 sql_help.c:3847 sql_help.c:3848 sql_help.c:4181 +#: sql_help.c:4182 sql_help.c:4186 sql_help.c:4187 sql_help.c:4190 +#: sql_help.c:4191 sql_help.c:4193 sql_help.c:4194 sql_help.c:4196 +#: sql_help.c:4197 sql_help.c:4199 sql_help.c:4200 sql_help.c:4202 +#: sql_help.c:4203 sql_help.c:4209 sql_help.c:4210 sql_help.c:4212 +#: sql_help.c:4213 sql_help.c:4215 sql_help.c:4216 sql_help.c:4218 +#: sql_help.c:4219 sql_help.c:4221 sql_help.c:4222 sql_help.c:4224 +#: sql_help.c:4225 sql_help.c:4227 sql_help.c:4228 msgid "role_specification" msgstr "вказання_ролі" -#: sql_help.c:565 sql_help.c:567 sql_help.c:1611 sql_help.c:2130 -#: sql_help.c:2612 sql_help.c:3119 sql_help.c:3570 sql_help.c:4427 +#: sql_help.c:567 sql_help.c:569 sql_help.c:1632 sql_help.c:2161 +#: sql_help.c:2649 sql_help.c:3170 sql_help.c:3621 sql_help.c:4547 msgid "user_name" msgstr "ім'я_користувача" -#: sql_help.c:568 sql_help.c:945 sql_help.c:1600 sql_help.c:2611 -#: sql_help.c:3771 sql_help.c:4119 +#: sql_help.c:570 sql_help.c:951 sql_help.c:1621 sql_help.c:2648 +#: sql_help.c:3849 sql_help.c:4229 msgid "where role_specification can be:" msgstr "де вказання_ролі може бути:" -#: sql_help.c:570 +#: sql_help.c:572 msgid "group_name" msgstr "ім'я_групи" -#: sql_help.c:591 sql_help.c:1376 sql_help.c:2136 sql_help.c:2376 -#: sql_help.c:2410 sql_help.c:2784 sql_help.c:2797 sql_help.c:2811 -#: sql_help.c:2852 sql_help.c:2876 sql_help.c:2888 sql_help.c:3764 -#: sql_help.c:4112 +#: sql_help.c:593 sql_help.c:1396 sql_help.c:2167 sql_help.c:2410 +#: sql_help.c:2444 sql_help.c:2831 sql_help.c:2844 sql_help.c:2858 +#: sql_help.c:2899 sql_help.c:2923 sql_help.c:2935 sql_help.c:3840 +#: sql_help.c:4220 msgid "tablespace_name" msgstr "ім'я_табличного_простору" -#: sql_help.c:593 sql_help.c:681 sql_help.c:1324 sql_help.c:1333 -#: sql_help.c:1371 sql_help.c:1722 +#: sql_help.c:595 sql_help.c:686 sql_help.c:1344 sql_help.c:1353 +#: sql_help.c:1391 sql_help.c:1748 sql_help.c:1751 msgid "index_name" msgstr "назва_індексу" -#: sql_help.c:597 sql_help.c:600 sql_help.c:682 sql_help.c:684 sql_help.c:1326 -#: sql_help.c:1328 sql_help.c:1374 sql_help.c:2374 sql_help.c:2408 -#: sql_help.c:2782 sql_help.c:2795 sql_help.c:2809 sql_help.c:2850 -#: sql_help.c:2874 +#: sql_help.c:599 sql_help.c:602 sql_help.c:687 sql_help.c:689 sql_help.c:1346 +#: sql_help.c:1348 sql_help.c:1394 sql_help.c:2408 sql_help.c:2442 +#: sql_help.c:2829 sql_help.c:2842 sql_help.c:2856 sql_help.c:2897 +#: sql_help.c:2921 msgid "storage_parameter" msgstr "параметр_зберігання" -#: sql_help.c:602 +#: sql_help.c:604 msgid "column_number" msgstr "номер_стовпця" -#: sql_help.c:626 sql_help.c:1805 sql_help.c:4202 +#: sql_help.c:628 sql_help.c:1836 sql_help.c:4312 msgid "large_object_oid" msgstr "oid_великого_об'єкта" -#: sql_help.c:713 sql_help.c:2431 +#: sql_help.c:685 sql_help.c:1330 sql_help.c:2817 +msgid "compression_method" +msgstr "compression_method" + +#: sql_help.c:718 sql_help.c:2465 msgid "res_proc" msgstr "res_процедура" -#: sql_help.c:714 sql_help.c:2432 +#: sql_help.c:719 sql_help.c:2466 msgid "join_proc" msgstr "процедура_приєднання" -#: sql_help.c:766 sql_help.c:778 sql_help.c:2449 +#: sql_help.c:771 sql_help.c:783 sql_help.c:2483 msgid "strategy_number" msgstr "номер_стратегії" -#: sql_help.c:768 sql_help.c:769 sql_help.c:772 sql_help.c:773 sql_help.c:779 -#: sql_help.c:780 sql_help.c:782 sql_help.c:783 sql_help.c:2451 sql_help.c:2452 -#: sql_help.c:2455 sql_help.c:2456 +#: sql_help.c:773 sql_help.c:774 sql_help.c:777 sql_help.c:778 sql_help.c:784 +#: sql_help.c:785 sql_help.c:787 sql_help.c:788 sql_help.c:2485 sql_help.c:2486 +#: sql_help.c:2489 sql_help.c:2490 msgid "op_type" msgstr "тип_операції" -#: sql_help.c:770 sql_help.c:2453 +#: sql_help.c:775 sql_help.c:2487 msgid "sort_family_name" msgstr "ім'я_родини_сортування" -#: sql_help.c:771 sql_help.c:781 sql_help.c:2454 +#: sql_help.c:776 sql_help.c:786 sql_help.c:2488 msgid "support_number" msgstr "номер_підтримки" -#: sql_help.c:775 sql_help.c:2071 sql_help.c:2458 sql_help.c:2965 -#: sql_help.c:2967 +#: sql_help.c:780 sql_help.c:2102 sql_help.c:2492 sql_help.c:3012 +#: sql_help.c:3014 msgid "argument_type" msgstr "тип_аргументу" -#: sql_help.c:806 sql_help.c:809 sql_help.c:880 sql_help.c:882 sql_help.c:884 -#: sql_help.c:1015 sql_help.c:1054 sql_help.c:1494 sql_help.c:1497 -#: sql_help.c:1672 sql_help.c:1721 sql_help.c:1790 sql_help.c:1815 -#: sql_help.c:1828 sql_help.c:1843 sql_help.c:1900 sql_help.c:1906 -#: sql_help.c:2242 sql_help.c:2254 sql_help.c:2365 sql_help.c:2405 -#: sql_help.c:2482 sql_help.c:2525 sql_help.c:2581 sql_help.c:2632 -#: sql_help.c:2663 sql_help.c:2768 sql_help.c:2785 sql_help.c:2798 -#: sql_help.c:2871 sql_help.c:2991 sql_help.c:3168 sql_help.c:3391 -#: sql_help.c:3440 sql_help.c:3546 sql_help.c:3734 sql_help.c:3739 -#: sql_help.c:3785 sql_help.c:3817 sql_help.c:4082 sql_help.c:4087 -#: sql_help.c:4190 sql_help.c:4297 sql_help.c:4299 sql_help.c:4348 -#: sql_help.c:4387 sql_help.c:4536 sql_help.c:4538 sql_help.c:4587 -#: sql_help.c:4621 sql_help.c:4672 sql_help.c:4756 sql_help.c:4758 -#: sql_help.c:4807 +#: sql_help.c:811 sql_help.c:814 sql_help.c:885 sql_help.c:887 sql_help.c:889 +#: sql_help.c:1022 sql_help.c:1061 sql_help.c:1514 sql_help.c:1517 +#: sql_help.c:1693 sql_help.c:1747 sql_help.c:1750 sql_help.c:1821 +#: sql_help.c:1846 sql_help.c:1859 sql_help.c:1874 sql_help.c:1931 +#: sql_help.c:1937 sql_help.c:2273 sql_help.c:2285 sql_help.c:2399 +#: sql_help.c:2439 sql_help.c:2516 sql_help.c:2561 sql_help.c:2617 +#: sql_help.c:2669 sql_help.c:2702 sql_help.c:2709 sql_help.c:2814 +#: sql_help.c:2832 sql_help.c:2845 sql_help.c:2918 sql_help.c:3038 +#: sql_help.c:3219 sql_help.c:3442 sql_help.c:3491 sql_help.c:3597 +#: sql_help.c:3799 sql_help.c:3805 sql_help.c:3863 sql_help.c:3895 +#: sql_help.c:4179 sql_help.c:4185 sql_help.c:4300 sql_help.c:4409 +#: sql_help.c:4411 sql_help.c:4468 sql_help.c:4507 sql_help.c:4658 +#: sql_help.c:4660 sql_help.c:4717 sql_help.c:4751 sql_help.c:4803 +#: sql_help.c:4889 sql_help.c:4891 sql_help.c:4948 msgid "table_name" msgstr "ім'я_таблиці" -#: sql_help.c:811 sql_help.c:2484 +#: sql_help.c:816 sql_help.c:2518 msgid "using_expression" msgstr "вираз_використання" -#: sql_help.c:812 sql_help.c:2485 +#: sql_help.c:817 sql_help.c:2519 msgid "check_expression" msgstr "вираз_перевірки" -#: sql_help.c:886 sql_help.c:2526 +#: sql_help.c:891 sql_help.c:2562 msgid "publication_parameter" msgstr "параметр_публікації" -#: sql_help.c:929 sql_help.c:1584 sql_help.c:2344 sql_help.c:2558 -#: sql_help.c:3102 +#: sql_help.c:935 sql_help.c:1605 sql_help.c:2378 sql_help.c:2594 +#: sql_help.c:3153 msgid "password" msgstr "пароль" -#: sql_help.c:930 sql_help.c:1585 sql_help.c:2345 sql_help.c:2559 -#: sql_help.c:3103 +#: sql_help.c:936 sql_help.c:1606 sql_help.c:2379 sql_help.c:2595 +#: sql_help.c:3154 msgid "timestamp" msgstr "мітка часу" -#: sql_help.c:934 sql_help.c:938 sql_help.c:941 sql_help.c:944 sql_help.c:1589 -#: sql_help.c:1593 sql_help.c:1596 sql_help.c:1599 sql_help.c:3744 -#: sql_help.c:4092 +#: sql_help.c:940 sql_help.c:944 sql_help.c:947 sql_help.c:950 sql_help.c:1610 +#: sql_help.c:1614 sql_help.c:1617 sql_help.c:1620 sql_help.c:3812 +#: sql_help.c:4192 msgid "database_name" msgstr "назва_бази_даних" -#: sql_help.c:1048 sql_help.c:2627 +#: sql_help.c:1055 sql_help.c:2664 msgid "increment" msgstr "інкремент" -#: sql_help.c:1049 sql_help.c:2628 +#: sql_help.c:1056 sql_help.c:2665 msgid "minvalue" msgstr "мін_значення" -#: sql_help.c:1050 sql_help.c:2629 +#: sql_help.c:1057 sql_help.c:2666 msgid "maxvalue" msgstr "макс_значення" -#: sql_help.c:1051 sql_help.c:2630 sql_help.c:4295 sql_help.c:4385 -#: sql_help.c:4534 sql_help.c:4689 sql_help.c:4754 +#: sql_help.c:1058 sql_help.c:2667 sql_help.c:4407 sql_help.c:4505 +#: sql_help.c:4656 sql_help.c:4820 sql_help.c:4887 msgid "start" msgstr "початок" -#: sql_help.c:1052 sql_help.c:1301 +#: sql_help.c:1059 sql_help.c:1319 msgid "restart" msgstr "перезапуск" -#: sql_help.c:1053 sql_help.c:2631 +#: sql_help.c:1060 sql_help.c:2668 msgid "cache" msgstr "кеш" -#: sql_help.c:1097 +#: sql_help.c:1104 msgid "new_target" msgstr "нова_ціль" -#: sql_help.c:1113 sql_help.c:2675 +#: sql_help.c:1122 sql_help.c:2721 msgid "conninfo" msgstr "інформація_підключення" -#: sql_help.c:1115 sql_help.c:2676 +#: sql_help.c:1124 sql_help.c:1128 sql_help.c:1132 sql_help.c:2722 msgid "publication_name" msgstr "назва_публікації" -#: sql_help.c:1116 -msgid "set_publication_option" -msgstr "опція_set_publication" +#: sql_help.c:1125 sql_help.c:1129 sql_help.c:1133 +msgid "publication_option" +msgstr "publication_option" -#: sql_help.c:1119 +#: sql_help.c:1136 msgid "refresh_option" msgstr "опція_оновлення" -#: sql_help.c:1124 sql_help.c:2677 +#: sql_help.c:1141 sql_help.c:2723 msgid "subscription_parameter" msgstr "параметр_підписки" -#: sql_help.c:1278 sql_help.c:1281 +#: sql_help.c:1296 sql_help.c:1299 msgid "partition_name" msgstr "ім'я_розділу" -#: sql_help.c:1279 sql_help.c:2259 sql_help.c:2803 +#: sql_help.c:1297 sql_help.c:2290 sql_help.c:2850 msgid "partition_bound_spec" msgstr "специфікація_рамок_розділу" -#: sql_help.c:1298 sql_help.c:1345 sql_help.c:2817 +#: sql_help.c:1316 sql_help.c:1365 sql_help.c:2864 msgid "sequence_options" msgstr "опції_послідовності" -#: sql_help.c:1300 +#: sql_help.c:1318 msgid "sequence_option" msgstr "опція_послідовності" -#: sql_help.c:1312 +#: sql_help.c:1332 msgid "table_constraint_using_index" msgstr "індекс_обмеження_таблиці" -#: sql_help.c:1320 sql_help.c:1321 sql_help.c:1322 sql_help.c:1323 +#: sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 sql_help.c:1343 msgid "rewrite_rule_name" msgstr "ім'я_правила_перезапису" -#: sql_help.c:1334 sql_help.c:2842 +#: sql_help.c:1354 sql_help.c:2889 msgid "and partition_bound_spec is:" msgstr "і специфікація_рамок_розділу:" -#: sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 sql_help.c:2843 -#: sql_help.c:2844 sql_help.c:2845 +#: sql_help.c:1355 sql_help.c:1356 sql_help.c:1357 sql_help.c:2890 +#: sql_help.c:2891 sql_help.c:2892 msgid "partition_bound_expr" msgstr "код_секції" -#: sql_help.c:1338 sql_help.c:1339 sql_help.c:2846 sql_help.c:2847 +#: sql_help.c:1358 sql_help.c:1359 sql_help.c:2893 sql_help.c:2894 msgid "numeric_literal" msgstr "числовий_літерал" -#: sql_help.c:1340 +#: sql_help.c:1360 msgid "and column_constraint is:" msgstr "і обмеження_стовпця:" -#: sql_help.c:1343 sql_help.c:2266 sql_help.c:2299 sql_help.c:2505 -#: sql_help.c:2815 +#: sql_help.c:1363 sql_help.c:2297 sql_help.c:2332 sql_help.c:2540 +#: sql_help.c:2862 msgid "default_expr" msgstr "вираз_за_замовчуванням" -#: sql_help.c:1344 sql_help.c:2267 sql_help.c:2816 +#: sql_help.c:1364 sql_help.c:2298 sql_help.c:2863 msgid "generation_expr" msgstr "код_генерації" -#: sql_help.c:1346 sql_help.c:1347 sql_help.c:1356 sql_help.c:1358 -#: sql_help.c:1362 sql_help.c:2818 sql_help.c:2819 sql_help.c:2828 -#: sql_help.c:2830 sql_help.c:2834 +#: sql_help.c:1366 sql_help.c:1367 sql_help.c:1376 sql_help.c:1378 +#: sql_help.c:1382 sql_help.c:2865 sql_help.c:2866 sql_help.c:2875 +#: sql_help.c:2877 sql_help.c:2881 msgid "index_parameters" msgstr "параметри_індексу" -#: sql_help.c:1348 sql_help.c:1365 sql_help.c:2820 sql_help.c:2837 +#: sql_help.c:1368 sql_help.c:1385 sql_help.c:2867 sql_help.c:2884 msgid "reftable" msgstr "залежна_таблиця" -#: sql_help.c:1349 sql_help.c:1366 sql_help.c:2821 sql_help.c:2838 +#: sql_help.c:1369 sql_help.c:1386 sql_help.c:2868 sql_help.c:2885 msgid "refcolumn" msgstr "залежний_стовпець" -#: sql_help.c:1350 sql_help.c:1351 sql_help.c:1367 sql_help.c:1368 -#: sql_help.c:2822 sql_help.c:2823 sql_help.c:2839 sql_help.c:2840 +#: sql_help.c:1370 sql_help.c:1371 sql_help.c:1387 sql_help.c:1388 +#: sql_help.c:2869 sql_help.c:2870 sql_help.c:2886 sql_help.c:2887 msgid "referential_action" msgstr "дія_посилання" -#: sql_help.c:1352 sql_help.c:2268 sql_help.c:2824 +#: sql_help.c:1372 sql_help.c:2299 sql_help.c:2871 msgid "and table_constraint is:" msgstr "і обмеження_таблиці:" -#: sql_help.c:1360 sql_help.c:2832 +#: sql_help.c:1380 sql_help.c:2879 msgid "exclude_element" msgstr "об'єкт_виключення" -#: sql_help.c:1361 sql_help.c:2833 sql_help.c:4293 sql_help.c:4383 -#: sql_help.c:4532 sql_help.c:4687 sql_help.c:4752 +#: sql_help.c:1381 sql_help.c:2880 sql_help.c:4405 sql_help.c:4503 +#: sql_help.c:4654 sql_help.c:4818 sql_help.c:4885 msgid "operator" msgstr "оператор" -#: sql_help.c:1363 sql_help.c:2377 sql_help.c:2835 +#: sql_help.c:1383 sql_help.c:2411 sql_help.c:2882 msgid "predicate" msgstr "предикат" -#: sql_help.c:1369 +#: sql_help.c:1389 msgid "and table_constraint_using_index is:" msgstr "і індекс_обмеження_таблиці:" -#: sql_help.c:1372 sql_help.c:2848 +#: sql_help.c:1392 sql_help.c:2895 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "параметри_індексу в обмеженнях UNIQUE, PRIMARY KEY, EXCLUDE:" -#: sql_help.c:1377 sql_help.c:2853 +#: sql_help.c:1397 sql_help.c:2900 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "елемент_виключення в обмеженні EXCLUDE:" -#: sql_help.c:1380 sql_help.c:2370 sql_help.c:2780 sql_help.c:2793 -#: sql_help.c:2807 sql_help.c:2856 sql_help.c:3830 +#: sql_help.c:1400 sql_help.c:2404 sql_help.c:2827 sql_help.c:2840 +#: sql_help.c:2854 sql_help.c:2903 sql_help.c:3908 msgid "opclass" msgstr "клас_оператора" -#: sql_help.c:1396 sql_help.c:1399 sql_help.c:2891 +#: sql_help.c:1416 sql_help.c:1419 sql_help.c:2938 msgid "tablespace_option" msgstr "опція_табличного_простору" -#: sql_help.c:1420 sql_help.c:1423 sql_help.c:1429 sql_help.c:1433 +#: sql_help.c:1440 sql_help.c:1443 sql_help.c:1449 sql_help.c:1453 msgid "token_type" msgstr "тип_токену" -#: sql_help.c:1421 sql_help.c:1424 +#: sql_help.c:1441 sql_help.c:1444 msgid "dictionary_name" msgstr "ім'я_словника" -#: sql_help.c:1426 sql_help.c:1430 +#: sql_help.c:1446 sql_help.c:1450 msgid "old_dictionary" msgstr "старий_словник" -#: sql_help.c:1427 sql_help.c:1431 +#: sql_help.c:1447 sql_help.c:1451 msgid "new_dictionary" msgstr "новий_словник" -#: sql_help.c:1526 sql_help.c:1540 sql_help.c:1543 sql_help.c:1544 -#: sql_help.c:3042 +#: sql_help.c:1546 sql_help.c:1560 sql_help.c:1563 sql_help.c:1564 +#: sql_help.c:3091 msgid "attribute_name" msgstr "ім'я_атрибута" -#: sql_help.c:1527 +#: sql_help.c:1547 msgid "new_attribute_name" msgstr "нове_ім'я_атрибута" -#: sql_help.c:1531 sql_help.c:1535 +#: sql_help.c:1551 sql_help.c:1555 msgid "new_enum_value" msgstr "нове_значення_перерахування" -#: sql_help.c:1532 +#: sql_help.c:1552 msgid "neighbor_enum_value" msgstr "сусіднє_значення_перерахування" -#: sql_help.c:1534 +#: sql_help.c:1554 msgid "existing_enum_value" msgstr "існуюче_значення_перерахування" -#: sql_help.c:1537 +#: sql_help.c:1557 msgid "property" msgstr "властивість" -#: sql_help.c:1612 sql_help.c:2251 sql_help.c:2260 sql_help.c:2643 -#: sql_help.c:3120 sql_help.c:3571 sql_help.c:3750 sql_help.c:3786 -#: sql_help.c:4098 +#: sql_help.c:1633 sql_help.c:2282 sql_help.c:2291 sql_help.c:2680 +#: sql_help.c:3171 sql_help.c:3622 sql_help.c:3821 sql_help.c:3864 +#: sql_help.c:4201 msgid "server_name" msgstr "назва_серверу" -#: sql_help.c:1644 sql_help.c:1647 sql_help.c:3135 +#: sql_help.c:1665 sql_help.c:1668 sql_help.c:3186 msgid "view_option_name" msgstr "ім'я_параметра_представлення" -#: sql_help.c:1645 sql_help.c:3136 +#: sql_help.c:1666 sql_help.c:3187 msgid "view_option_value" msgstr "значення_параметра_представлення" -#: sql_help.c:1666 sql_help.c:1667 sql_help.c:4659 sql_help.c:4660 +#: sql_help.c:1687 sql_help.c:1688 sql_help.c:4790 sql_help.c:4791 msgid "table_and_columns" msgstr "таблиця_і_стовпці" -#: sql_help.c:1668 sql_help.c:1912 sql_help.c:3619 sql_help.c:3963 -#: sql_help.c:4661 +#: sql_help.c:1689 sql_help.c:1752 sql_help.c:1943 sql_help.c:3670 +#: sql_help.c:4043 sql_help.c:4792 msgid "where option can be one of:" msgstr "де параметр може бути одним із:" -#: sql_help.c:1669 sql_help.c:1670 sql_help.c:1914 sql_help.c:1917 -#: sql_help.c:2096 sql_help.c:3620 sql_help.c:3621 sql_help.c:3622 -#: sql_help.c:3623 sql_help.c:3624 sql_help.c:3625 sql_help.c:3626 -#: sql_help.c:3627 sql_help.c:4662 sql_help.c:4663 sql_help.c:4664 -#: sql_help.c:4665 sql_help.c:4666 sql_help.c:4667 sql_help.c:4668 -#: sql_help.c:4669 +#: sql_help.c:1690 sql_help.c:1691 sql_help.c:1753 sql_help.c:1945 +#: sql_help.c:1948 sql_help.c:2127 sql_help.c:3671 sql_help.c:3672 +#: sql_help.c:3673 sql_help.c:3674 sql_help.c:3675 sql_help.c:3676 +#: sql_help.c:3677 sql_help.c:3678 sql_help.c:4044 sql_help.c:4046 +#: sql_help.c:4793 sql_help.c:4794 sql_help.c:4795 sql_help.c:4796 +#: sql_help.c:4797 sql_help.c:4798 sql_help.c:4799 sql_help.c:4800 msgid "boolean" msgstr "логічний" -#: sql_help.c:1671 sql_help.c:4671 +#: sql_help.c:1692 sql_help.c:4802 msgid "and table_and_columns is:" msgstr "і таблиця_і_стовпці:" -#: sql_help.c:1687 sql_help.c:4443 sql_help.c:4445 sql_help.c:4469 +#: sql_help.c:1708 sql_help.c:4563 sql_help.c:4565 sql_help.c:4589 msgid "transaction_mode" msgstr "режим_транзакції" -#: sql_help.c:1688 sql_help.c:4446 sql_help.c:4470 +#: sql_help.c:1709 sql_help.c:4566 sql_help.c:4590 msgid "where transaction_mode is one of:" msgstr "де режим_транзакції один з:" -#: sql_help.c:1697 sql_help.c:4303 sql_help.c:4312 sql_help.c:4316 -#: sql_help.c:4320 sql_help.c:4323 sql_help.c:4542 sql_help.c:4551 -#: sql_help.c:4555 sql_help.c:4559 sql_help.c:4562 sql_help.c:4762 -#: sql_help.c:4771 sql_help.c:4775 sql_help.c:4779 sql_help.c:4782 +#: sql_help.c:1718 sql_help.c:4415 sql_help.c:4424 sql_help.c:4428 +#: sql_help.c:4432 sql_help.c:4435 sql_help.c:4664 sql_help.c:4673 +#: sql_help.c:4677 sql_help.c:4681 sql_help.c:4684 sql_help.c:4895 +#: sql_help.c:4904 sql_help.c:4908 sql_help.c:4912 sql_help.c:4915 msgid "argument" msgstr "аргумент" -#: sql_help.c:1787 +#: sql_help.c:1818 msgid "relation_name" msgstr "назва_відношення" -#: sql_help.c:1792 sql_help.c:3746 sql_help.c:4094 +#: sql_help.c:1823 sql_help.c:3815 sql_help.c:4195 msgid "domain_name" msgstr "назва_домену" -#: sql_help.c:1814 +#: sql_help.c:1845 msgid "policy_name" msgstr "назва_політики" -#: sql_help.c:1827 +#: sql_help.c:1858 msgid "rule_name" msgstr "назва_правила" -#: sql_help.c:1846 +#: sql_help.c:1877 msgid "text" msgstr "текст" -#: sql_help.c:1871 sql_help.c:3930 sql_help.c:4135 +#: sql_help.c:1902 sql_help.c:4008 sql_help.c:4245 msgid "transaction_id" msgstr "ідентифікатор_транзакції" -#: sql_help.c:1902 sql_help.c:1909 sql_help.c:3856 +#: sql_help.c:1933 sql_help.c:1940 sql_help.c:3934 msgid "filename" msgstr "ім'я файлу" -#: sql_help.c:1903 sql_help.c:1910 sql_help.c:2583 sql_help.c:2584 -#: sql_help.c:2585 +#: sql_help.c:1934 sql_help.c:1941 sql_help.c:2619 sql_help.c:2620 +#: sql_help.c:2621 msgid "command" msgstr "команда" -#: sql_help.c:1905 sql_help.c:2582 sql_help.c:2994 sql_help.c:3171 -#: sql_help.c:3840 sql_help.c:4286 sql_help.c:4288 sql_help.c:4376 -#: sql_help.c:4378 sql_help.c:4525 sql_help.c:4527 sql_help.c:4630 -#: sql_help.c:4745 sql_help.c:4747 +#: sql_help.c:1936 sql_help.c:2618 sql_help.c:3041 sql_help.c:3222 +#: sql_help.c:3918 sql_help.c:4398 sql_help.c:4400 sql_help.c:4496 +#: sql_help.c:4498 sql_help.c:4647 sql_help.c:4649 sql_help.c:4760 +#: sql_help.c:4878 sql_help.c:4880 msgid "condition" msgstr "умова" -#: sql_help.c:1908 sql_help.c:2411 sql_help.c:2877 sql_help.c:3137 -#: sql_help.c:3155 sql_help.c:3821 +#: sql_help.c:1939 sql_help.c:2445 sql_help.c:2924 sql_help.c:3188 +#: sql_help.c:3206 sql_help.c:3899 msgid "query" msgstr "запит" -#: sql_help.c:1913 +#: sql_help.c:1944 msgid "format_name" msgstr "назва_формату" -#: sql_help.c:1915 +#: sql_help.c:1946 msgid "delimiter_character" msgstr "символ_роздільник" -#: sql_help.c:1916 +#: sql_help.c:1947 msgid "null_string" msgstr "представлення_NULL" -#: sql_help.c:1918 +#: sql_help.c:1949 msgid "quote_character" msgstr "символ_лапок" -#: sql_help.c:1919 +#: sql_help.c:1950 msgid "escape_character" msgstr "символ_екранування" -#: sql_help.c:1923 +#: sql_help.c:1954 msgid "encoding_name" msgstr "ім'я_кодування" -#: sql_help.c:1934 +#: sql_help.c:1965 msgid "access_method_type" msgstr "тип_метода_доступа" -#: sql_help.c:2005 sql_help.c:2024 sql_help.c:2027 +#: sql_help.c:2036 sql_help.c:2055 sql_help.c:2058 msgid "arg_data_type" msgstr "тип_даних_аргумента" -#: sql_help.c:2006 sql_help.c:2028 sql_help.c:2036 +#: sql_help.c:2037 sql_help.c:2059 sql_help.c:2067 msgid "sfunc" msgstr "функція_стану" -#: sql_help.c:2007 sql_help.c:2029 sql_help.c:2037 +#: sql_help.c:2038 sql_help.c:2060 sql_help.c:2068 msgid "state_data_type" msgstr "тип_даних_стану" -#: sql_help.c:2008 sql_help.c:2030 sql_help.c:2038 +#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069 msgid "state_data_size" msgstr "розмір_даних_стану" -#: sql_help.c:2009 sql_help.c:2031 sql_help.c:2039 +#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070 msgid "ffunc" msgstr "функція_завершення" -#: sql_help.c:2010 sql_help.c:2040 +#: sql_help.c:2041 sql_help.c:2071 msgid "combinefunc" msgstr "комбінуюча_функція" -#: sql_help.c:2011 sql_help.c:2041 +#: sql_help.c:2042 sql_help.c:2072 msgid "serialfunc" msgstr "функція_серіалізації" -#: sql_help.c:2012 sql_help.c:2042 +#: sql_help.c:2043 sql_help.c:2073 msgid "deserialfunc" msgstr "функція_десеріалізації" -#: sql_help.c:2013 sql_help.c:2032 sql_help.c:2043 +#: sql_help.c:2044 sql_help.c:2063 sql_help.c:2074 msgid "initial_condition" msgstr "початкова_умова" -#: sql_help.c:2014 sql_help.c:2044 +#: sql_help.c:2045 sql_help.c:2075 msgid "msfunc" msgstr "функція_стану_рух" -#: sql_help.c:2015 sql_help.c:2045 +#: sql_help.c:2046 sql_help.c:2076 msgid "minvfunc" msgstr "зворотна_функція_рух" -#: sql_help.c:2016 sql_help.c:2046 +#: sql_help.c:2047 sql_help.c:2077 msgid "mstate_data_type" msgstr "тип_даних_стану_рух" -#: sql_help.c:2017 sql_help.c:2047 +#: sql_help.c:2048 sql_help.c:2078 msgid "mstate_data_size" msgstr "розмір_даних_стану_рух" -#: sql_help.c:2018 sql_help.c:2048 +#: sql_help.c:2049 sql_help.c:2079 msgid "mffunc" msgstr "функція_завершення_рух" -#: sql_help.c:2019 sql_help.c:2049 +#: sql_help.c:2050 sql_help.c:2080 msgid "minitial_condition" msgstr "початкова_умова_рух" -#: sql_help.c:2020 sql_help.c:2050 +#: sql_help.c:2051 sql_help.c:2081 msgid "sort_operator" msgstr "оператор_сортування" -#: sql_help.c:2033 +#: sql_help.c:2064 msgid "or the old syntax" msgstr "або старий синтаксис" -#: sql_help.c:2035 +#: sql_help.c:2066 msgid "base_type" msgstr "базовий_тип" -#: sql_help.c:2092 sql_help.c:2133 +#: sql_help.c:2123 sql_help.c:2164 msgid "locale" msgstr "локаль" -#: sql_help.c:2093 sql_help.c:2134 +#: sql_help.c:2124 sql_help.c:2165 msgid "lc_collate" msgstr "код_правила_сортування" -#: sql_help.c:2094 sql_help.c:2135 +#: sql_help.c:2125 sql_help.c:2166 msgid "lc_ctype" msgstr "код_класифікації_символів" -#: sql_help.c:2095 sql_help.c:4188 +#: sql_help.c:2126 sql_help.c:4298 msgid "provider" msgstr "постачальник" -#: sql_help.c:2097 sql_help.c:2189 +#: sql_help.c:2128 sql_help.c:2220 msgid "version" msgstr "версія" -#: sql_help.c:2099 +#: sql_help.c:2130 msgid "existing_collation" msgstr "існуюче_правило_сортування" -#: sql_help.c:2109 +#: sql_help.c:2140 msgid "source_encoding" msgstr "початкове_кодування" -#: sql_help.c:2110 +#: sql_help.c:2141 msgid "dest_encoding" msgstr "цільве_кодування" -#: sql_help.c:2131 sql_help.c:2917 +#: sql_help.c:2162 sql_help.c:2964 msgid "template" msgstr "шаблон" -#: sql_help.c:2132 +#: sql_help.c:2163 msgid "encoding" msgstr "кодування" -#: sql_help.c:2159 +#: sql_help.c:2190 msgid "constraint" msgstr "обмеження" -#: sql_help.c:2160 +#: sql_help.c:2191 msgid "where constraint is:" msgstr "де обмеження:" -#: sql_help.c:2174 sql_help.c:2580 sql_help.c:2990 +#: sql_help.c:2205 sql_help.c:2616 sql_help.c:3037 msgid "event" msgstr "подія" -#: sql_help.c:2175 +#: sql_help.c:2206 msgid "filter_variable" msgstr "змінна_фільтру" -#: sql_help.c:2263 sql_help.c:2812 +#: sql_help.c:2294 sql_help.c:2859 msgid "where column_constraint is:" msgstr "де обмеження_стовпців:" -#: sql_help.c:2300 +#: sql_help.c:2333 msgid "rettype" msgstr "тип_результату" -#: sql_help.c:2302 +#: sql_help.c:2335 msgid "column_type" msgstr "тип_стовпця" -#: sql_help.c:2311 sql_help.c:2511 +#: sql_help.c:2344 sql_help.c:2546 msgid "definition" msgstr "визначення" -#: sql_help.c:2312 sql_help.c:2512 +#: sql_help.c:2345 sql_help.c:2547 msgid "obj_file" msgstr "об'єктний_файл" -#: sql_help.c:2313 sql_help.c:2513 +#: sql_help.c:2346 sql_help.c:2548 msgid "link_symbol" msgstr "символ_експорту" -#: sql_help.c:2351 sql_help.c:2565 sql_help.c:3109 +#: sql_help.c:2347 sql_help.c:2549 +msgid "sql_body" +msgstr "sql_body" + +#: sql_help.c:2385 sql_help.c:2601 sql_help.c:3160 msgid "uid" msgstr "uid" -#: sql_help.c:2366 sql_help.c:2407 sql_help.c:2781 sql_help.c:2794 -#: sql_help.c:2808 sql_help.c:2873 +#: sql_help.c:2400 sql_help.c:2441 sql_help.c:2828 sql_help.c:2841 +#: sql_help.c:2855 sql_help.c:2920 msgid "method" msgstr "метод" -#: sql_help.c:2371 +#: sql_help.c:2405 msgid "opclass_parameter" msgstr "opclass_parameter" -#: sql_help.c:2388 +#: sql_help.c:2422 msgid "call_handler" msgstr "обробник_виклику" -#: sql_help.c:2389 +#: sql_help.c:2423 msgid "inline_handler" msgstr "обробник_впровадженого_коду" -#: sql_help.c:2390 +#: sql_help.c:2424 msgid "valfunction" msgstr "функція_перевірки" -#: sql_help.c:2429 +#: sql_help.c:2463 msgid "com_op" msgstr "комут_оператор" -#: sql_help.c:2430 +#: sql_help.c:2464 msgid "neg_op" msgstr "зворотній_оператор" -#: sql_help.c:2448 +#: sql_help.c:2482 msgid "family_name" msgstr "назва_сімейства" -#: sql_help.c:2459 +#: sql_help.c:2493 msgid "storage_type" msgstr "тип_зберігання" -#: sql_help.c:2586 sql_help.c:2997 +#: sql_help.c:2622 sql_help.c:3044 msgid "where event can be one of:" msgstr "де подія може бути однією з:" -#: sql_help.c:2605 sql_help.c:2607 +#: sql_help.c:2642 sql_help.c:2644 msgid "schema_element" msgstr "елемент_схеми" -#: sql_help.c:2644 +#: sql_help.c:2681 msgid "server_type" msgstr "тип_серверу" -#: sql_help.c:2645 +#: sql_help.c:2682 msgid "server_version" msgstr "версія_серверу" -#: sql_help.c:2646 sql_help.c:3748 sql_help.c:4096 +#: sql_help.c:2683 sql_help.c:3818 sql_help.c:4198 msgid "fdw_name" msgstr "назва_fdw" -#: sql_help.c:2659 +#: sql_help.c:2700 sql_help.c:2703 msgid "statistics_name" msgstr "назва_статистики" -#: sql_help.c:2660 +#: sql_help.c:2704 msgid "statistics_kind" msgstr "вид_статистики" -#: sql_help.c:2674 +#: sql_help.c:2720 msgid "subscription_name" msgstr "назва_підписки" -#: sql_help.c:2774 +#: sql_help.c:2821 msgid "source_table" msgstr "вихідна_таблиця" -#: sql_help.c:2775 +#: sql_help.c:2822 msgid "like_option" msgstr "параметр_породження" -#: sql_help.c:2841 +#: sql_help.c:2888 msgid "and like_option is:" msgstr "і параметр_породження:" -#: sql_help.c:2890 +#: sql_help.c:2937 msgid "directory" msgstr "каталог" -#: sql_help.c:2904 +#: sql_help.c:2951 msgid "parser_name" msgstr "назва_парсера" -#: sql_help.c:2905 +#: sql_help.c:2952 msgid "source_config" msgstr "початкова_конфігурація" -#: sql_help.c:2934 +#: sql_help.c:2981 msgid "start_function" msgstr "функція_початку" -#: sql_help.c:2935 +#: sql_help.c:2982 msgid "gettoken_function" msgstr "функція_видачі_токену" -#: sql_help.c:2936 +#: sql_help.c:2983 msgid "end_function" msgstr "функція_завершення" -#: sql_help.c:2937 +#: sql_help.c:2984 msgid "lextypes_function" msgstr "функція_лекс_типів" -#: sql_help.c:2938 +#: sql_help.c:2985 msgid "headline_function" msgstr "функція_створення_заголовків" -#: sql_help.c:2950 +#: sql_help.c:2997 msgid "init_function" msgstr "функція_ініціалізації" -#: sql_help.c:2951 +#: sql_help.c:2998 msgid "lexize_function" msgstr "функція_виділення_лексем" -#: sql_help.c:2964 +#: sql_help.c:3011 msgid "from_sql_function_name" msgstr "ім'я_функції_з_sql" -#: sql_help.c:2966 +#: sql_help.c:3013 msgid "to_sql_function_name" msgstr "ім'я_функції_в_sql" -#: sql_help.c:2992 +#: sql_help.c:3039 msgid "referenced_table_name" msgstr "ім'я_залежної_таблиці" -#: sql_help.c:2993 +#: sql_help.c:3040 msgid "transition_relation_name" msgstr "ім'я_перехідного_відношення" -#: sql_help.c:2996 +#: sql_help.c:3043 msgid "arguments" msgstr "аргументи" -#: sql_help.c:3046 sql_help.c:4221 +#: sql_help.c:3095 sql_help.c:4331 msgid "label" msgstr "мітка" -#: sql_help.c:3048 +#: sql_help.c:3097 msgid "subtype" msgstr "підтип" -#: sql_help.c:3049 +#: sql_help.c:3098 msgid "subtype_operator_class" msgstr "клас_оператора_підтипу" -#: sql_help.c:3051 +#: sql_help.c:3100 msgid "canonical_function" msgstr "канонічна_функція" -#: sql_help.c:3052 +#: sql_help.c:3101 msgid "subtype_diff_function" msgstr "функція_розбіжностей_підтипу" -#: sql_help.c:3054 +#: sql_help.c:3102 +msgid "multirange_type_name" +msgstr "multirange_type_name" + +#: sql_help.c:3104 msgid "input_function" msgstr "функція_вводу" -#: sql_help.c:3055 +#: sql_help.c:3105 msgid "output_function" msgstr "функція_виводу" -#: sql_help.c:3056 +#: sql_help.c:3106 msgid "receive_function" msgstr "функція_отримання" -#: sql_help.c:3057 +#: sql_help.c:3107 msgid "send_function" msgstr "функція_відправки" -#: sql_help.c:3058 +#: sql_help.c:3108 msgid "type_modifier_input_function" msgstr "функція_введення_модифікатора_типу" -#: sql_help.c:3059 +#: sql_help.c:3109 msgid "type_modifier_output_function" msgstr "функція_виводу_модифікатора_типу" -#: sql_help.c:3060 +#: sql_help.c:3110 msgid "analyze_function" msgstr "функція_аналізу" -#: sql_help.c:3061 +#: sql_help.c:3111 +msgid "subscript_function" +msgstr "subscript_function" + +#: sql_help.c:3112 msgid "internallength" msgstr "внутр_довжина" -#: sql_help.c:3062 +#: sql_help.c:3113 msgid "alignment" msgstr "вирівнювання" -#: sql_help.c:3063 +#: sql_help.c:3114 msgid "storage" msgstr "зберігання" -#: sql_help.c:3064 +#: sql_help.c:3115 msgid "like_type" msgstr "тип_зразок" -#: sql_help.c:3065 +#: sql_help.c:3116 msgid "category" msgstr "категорія" -#: sql_help.c:3066 +#: sql_help.c:3117 msgid "preferred" msgstr "привілейований" -#: sql_help.c:3067 +#: sql_help.c:3118 msgid "default" msgstr "за_замовчуванням" -#: sql_help.c:3068 +#: sql_help.c:3119 msgid "element" msgstr "елемент" -#: sql_help.c:3069 +#: sql_help.c:3120 msgid "delimiter" msgstr "роздільник" -#: sql_help.c:3070 +#: sql_help.c:3121 msgid "collatable" msgstr "сортувальний" -#: sql_help.c:3167 sql_help.c:3816 sql_help.c:4281 sql_help.c:4370 -#: sql_help.c:4520 sql_help.c:4620 sql_help.c:4740 +#: sql_help.c:3218 sql_help.c:3894 sql_help.c:4393 sql_help.c:4490 +#: sql_help.c:4642 sql_help.c:4750 sql_help.c:4873 msgid "with_query" msgstr "with_запит" -#: sql_help.c:3169 sql_help.c:3818 sql_help.c:4300 sql_help.c:4306 -#: sql_help.c:4309 sql_help.c:4313 sql_help.c:4317 sql_help.c:4325 -#: sql_help.c:4539 sql_help.c:4545 sql_help.c:4548 sql_help.c:4552 -#: sql_help.c:4556 sql_help.c:4564 sql_help.c:4622 sql_help.c:4759 -#: sql_help.c:4765 sql_help.c:4768 sql_help.c:4772 sql_help.c:4776 -#: sql_help.c:4784 +#: sql_help.c:3220 sql_help.c:3896 sql_help.c:4412 sql_help.c:4418 +#: sql_help.c:4421 sql_help.c:4425 sql_help.c:4429 sql_help.c:4437 +#: sql_help.c:4661 sql_help.c:4667 sql_help.c:4670 sql_help.c:4674 +#: sql_help.c:4678 sql_help.c:4686 sql_help.c:4752 sql_help.c:4892 +#: sql_help.c:4898 sql_help.c:4901 sql_help.c:4905 sql_help.c:4909 +#: sql_help.c:4917 msgid "alias" msgstr "псевдонім" -#: sql_help.c:3170 sql_help.c:4285 sql_help.c:4327 sql_help.c:4329 -#: sql_help.c:4375 sql_help.c:4524 sql_help.c:4566 sql_help.c:4568 -#: sql_help.c:4629 sql_help.c:4744 sql_help.c:4786 sql_help.c:4788 +#: sql_help.c:3221 sql_help.c:4397 sql_help.c:4439 sql_help.c:4441 +#: sql_help.c:4495 sql_help.c:4646 sql_help.c:4688 sql_help.c:4690 +#: sql_help.c:4759 sql_help.c:4877 sql_help.c:4919 sql_help.c:4921 msgid "from_item" msgstr "джерело_даних" -#: sql_help.c:3172 sql_help.c:3653 sql_help.c:3897 sql_help.c:4631 +#: sql_help.c:3223 sql_help.c:3704 sql_help.c:3975 sql_help.c:4761 msgid "cursor_name" msgstr "ім'я_курсору" -#: sql_help.c:3173 sql_help.c:3824 sql_help.c:4632 +#: sql_help.c:3224 sql_help.c:3902 sql_help.c:4762 msgid "output_expression" msgstr "вираз_результату" -#: sql_help.c:3174 sql_help.c:3825 sql_help.c:4284 sql_help.c:4373 -#: sql_help.c:4523 sql_help.c:4633 sql_help.c:4743 +#: sql_help.c:3225 sql_help.c:3903 sql_help.c:4396 sql_help.c:4493 +#: sql_help.c:4645 sql_help.c:4763 sql_help.c:4876 msgid "output_name" msgstr "ім'я_результату" -#: sql_help.c:3190 +#: sql_help.c:3241 msgid "code" msgstr "код" -#: sql_help.c:3595 +#: sql_help.c:3646 msgid "parameter" msgstr "параметр" -#: sql_help.c:3617 sql_help.c:3618 sql_help.c:3922 +#: sql_help.c:3668 sql_help.c:3669 sql_help.c:4000 msgid "statement" msgstr "оператор" -#: sql_help.c:3652 sql_help.c:3896 +#: sql_help.c:3703 sql_help.c:3974 msgid "direction" msgstr "напрямок" -#: sql_help.c:3654 sql_help.c:3898 +#: sql_help.c:3705 sql_help.c:3976 msgid "where direction can be empty or one of:" msgstr "де напрямок може бути пустим або одним із:" -#: sql_help.c:3655 sql_help.c:3656 sql_help.c:3657 sql_help.c:3658 -#: sql_help.c:3659 sql_help.c:3899 sql_help.c:3900 sql_help.c:3901 -#: sql_help.c:3902 sql_help.c:3903 sql_help.c:4294 sql_help.c:4296 -#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4533 sql_help.c:4535 -#: sql_help.c:4688 sql_help.c:4690 sql_help.c:4753 sql_help.c:4755 +#: sql_help.c:3706 sql_help.c:3707 sql_help.c:3708 sql_help.c:3709 +#: sql_help.c:3710 sql_help.c:3977 sql_help.c:3978 sql_help.c:3979 +#: sql_help.c:3980 sql_help.c:3981 sql_help.c:4406 sql_help.c:4408 +#: sql_help.c:4504 sql_help.c:4506 sql_help.c:4655 sql_help.c:4657 +#: sql_help.c:4819 sql_help.c:4821 sql_help.c:4886 sql_help.c:4888 msgid "count" msgstr "кількість" -#: sql_help.c:3741 sql_help.c:4089 +#: sql_help.c:3808 sql_help.c:4188 msgid "sequence_name" msgstr "ім'я_послідовності" -#: sql_help.c:3754 sql_help.c:4102 +#: sql_help.c:3826 sql_help.c:4206 msgid "arg_name" msgstr "ім'я_аргументу" -#: sql_help.c:3755 sql_help.c:4103 +#: sql_help.c:3827 sql_help.c:4207 msgid "arg_type" msgstr "тип_аргументу" -#: sql_help.c:3760 sql_help.c:4108 +#: sql_help.c:3834 sql_help.c:4214 msgid "loid" msgstr "код_вел_об'єкту" -#: sql_help.c:3784 +#: sql_help.c:3862 msgid "remote_schema" msgstr "віддалена_схема" -#: sql_help.c:3787 +#: sql_help.c:3865 msgid "local_schema" msgstr "локальна_схема" -#: sql_help.c:3822 +#: sql_help.c:3900 msgid "conflict_target" msgstr "ціль_конфлікту" -#: sql_help.c:3823 +#: sql_help.c:3901 msgid "conflict_action" msgstr "дія_при_конфлікті" -#: sql_help.c:3826 +#: sql_help.c:3904 msgid "where conflict_target can be one of:" msgstr "де ціль_конфлікту може бути одним з:" -#: sql_help.c:3827 +#: sql_help.c:3905 msgid "index_column_name" msgstr "ім'я_стовпця_індексу" -#: sql_help.c:3828 +#: sql_help.c:3906 msgid "index_expression" msgstr "вираз_індексу" -#: sql_help.c:3831 +#: sql_help.c:3909 msgid "index_predicate" msgstr "предикат_індексу" -#: sql_help.c:3833 +#: sql_help.c:3911 msgid "and conflict_action is one of:" msgstr "і дія_при_конфлікті одна з:" -#: sql_help.c:3839 sql_help.c:4628 +#: sql_help.c:3917 sql_help.c:4758 msgid "sub-SELECT" msgstr "вкладений-SELECT" -#: sql_help.c:3848 sql_help.c:3911 sql_help.c:4604 +#: sql_help.c:3926 sql_help.c:3989 sql_help.c:4734 msgid "channel" msgstr "канал" -#: sql_help.c:3870 +#: sql_help.c:3948 msgid "lockmode" msgstr "режим_блокування" -#: sql_help.c:3871 +#: sql_help.c:3949 msgid "where lockmode is one of:" msgstr "де режим_блокування один з:" -#: sql_help.c:3912 +#: sql_help.c:3990 msgid "payload" msgstr "зміст" -#: sql_help.c:3939 +#: sql_help.c:4017 msgid "old_role" msgstr "стара_роль" -#: sql_help.c:3940 +#: sql_help.c:4018 msgid "new_role" msgstr "нова_роль" -#: sql_help.c:3971 sql_help.c:4143 sql_help.c:4151 +#: sql_help.c:4054 sql_help.c:4253 sql_help.c:4261 msgid "savepoint_name" msgstr "ім'я_точки_збереження" -#: sql_help.c:4287 sql_help.c:4339 sql_help.c:4526 sql_help.c:4578 -#: sql_help.c:4746 sql_help.c:4798 +#: sql_help.c:4399 sql_help.c:4452 sql_help.c:4648 sql_help.c:4701 +#: sql_help.c:4879 sql_help.c:4932 msgid "grouping_element" msgstr "елемент_групування" -#: sql_help.c:4289 sql_help.c:4379 sql_help.c:4528 sql_help.c:4748 +#: sql_help.c:4401 sql_help.c:4499 sql_help.c:4650 sql_help.c:4881 msgid "window_name" msgstr "назва_вікна" -#: sql_help.c:4290 sql_help.c:4380 sql_help.c:4529 sql_help.c:4749 +#: sql_help.c:4402 sql_help.c:4500 sql_help.c:4651 sql_help.c:4882 msgid "window_definition" msgstr "визначення_вікна" -#: sql_help.c:4291 sql_help.c:4305 sql_help.c:4343 sql_help.c:4381 -#: sql_help.c:4530 sql_help.c:4544 sql_help.c:4582 sql_help.c:4750 -#: sql_help.c:4764 sql_help.c:4802 +#: sql_help.c:4403 sql_help.c:4417 sql_help.c:4456 sql_help.c:4501 +#: sql_help.c:4652 sql_help.c:4666 sql_help.c:4705 sql_help.c:4883 +#: sql_help.c:4897 sql_help.c:4936 msgid "select" msgstr "виберіть" -#: sql_help.c:4298 sql_help.c:4537 sql_help.c:4757 +#: sql_help.c:4410 sql_help.c:4659 sql_help.c:4890 msgid "where from_item can be one of:" msgstr "де джерело_даних може бути одним з:" -#: sql_help.c:4301 sql_help.c:4307 sql_help.c:4310 sql_help.c:4314 -#: sql_help.c:4326 sql_help.c:4540 sql_help.c:4546 sql_help.c:4549 -#: sql_help.c:4553 sql_help.c:4565 sql_help.c:4760 sql_help.c:4766 -#: sql_help.c:4769 sql_help.c:4773 sql_help.c:4785 +#: sql_help.c:4413 sql_help.c:4419 sql_help.c:4422 sql_help.c:4426 +#: sql_help.c:4438 sql_help.c:4662 sql_help.c:4668 sql_help.c:4671 +#: sql_help.c:4675 sql_help.c:4687 sql_help.c:4893 sql_help.c:4899 +#: sql_help.c:4902 sql_help.c:4906 sql_help.c:4918 msgid "column_alias" msgstr "псевдонім_стовпця" -#: sql_help.c:4302 sql_help.c:4541 sql_help.c:4761 +#: sql_help.c:4414 sql_help.c:4663 sql_help.c:4894 msgid "sampling_method" msgstr "метод_вибірки" -#: sql_help.c:4304 sql_help.c:4543 sql_help.c:4763 +#: sql_help.c:4416 sql_help.c:4665 sql_help.c:4896 msgid "seed" msgstr "початкове_число" -#: sql_help.c:4308 sql_help.c:4341 sql_help.c:4547 sql_help.c:4580 -#: sql_help.c:4767 sql_help.c:4800 +#: sql_help.c:4420 sql_help.c:4454 sql_help.c:4669 sql_help.c:4703 +#: sql_help.c:4900 sql_help.c:4934 msgid "with_query_name" msgstr "ім'я_запиту_WITH" -#: sql_help.c:4318 sql_help.c:4321 sql_help.c:4324 sql_help.c:4557 -#: sql_help.c:4560 sql_help.c:4563 sql_help.c:4777 sql_help.c:4780 -#: sql_help.c:4783 +#: sql_help.c:4430 sql_help.c:4433 sql_help.c:4436 sql_help.c:4679 +#: sql_help.c:4682 sql_help.c:4685 sql_help.c:4910 sql_help.c:4913 +#: sql_help.c:4916 msgid "column_definition" msgstr "визначення_стовпця" -#: sql_help.c:4328 sql_help.c:4567 sql_help.c:4787 +#: sql_help.c:4440 sql_help.c:4689 sql_help.c:4920 msgid "join_type" msgstr "тип_поєднання" -#: sql_help.c:4330 sql_help.c:4569 sql_help.c:4789 +#: sql_help.c:4442 sql_help.c:4691 sql_help.c:4922 msgid "join_condition" msgstr "умова_поєднання" -#: sql_help.c:4331 sql_help.c:4570 sql_help.c:4790 +#: sql_help.c:4443 sql_help.c:4692 sql_help.c:4923 msgid "join_column" msgstr "стовпець_поєднання" -#: sql_help.c:4332 sql_help.c:4571 sql_help.c:4791 +#: sql_help.c:4444 sql_help.c:4693 sql_help.c:4924 +msgid "join_using_alias" +msgstr "join_using_alias" + +#: sql_help.c:4445 sql_help.c:4694 sql_help.c:4925 msgid "and grouping_element can be one of:" msgstr "і елемент_групування може бути одним з:" -#: sql_help.c:4340 sql_help.c:4579 sql_help.c:4799 +#: sql_help.c:4453 sql_help.c:4702 sql_help.c:4933 msgid "and with_query is:" msgstr "і запит_WITH:" -#: sql_help.c:4344 sql_help.c:4583 sql_help.c:4803 +#: sql_help.c:4457 sql_help.c:4706 sql_help.c:4937 msgid "values" msgstr "значення" -#: sql_help.c:4345 sql_help.c:4584 sql_help.c:4804 +#: sql_help.c:4458 sql_help.c:4707 sql_help.c:4938 msgid "insert" msgstr "вставка" -#: sql_help.c:4346 sql_help.c:4585 sql_help.c:4805 +#: sql_help.c:4459 sql_help.c:4708 sql_help.c:4939 msgid "update" msgstr "оновлення" -#: sql_help.c:4347 sql_help.c:4586 sql_help.c:4806 +#: sql_help.c:4460 sql_help.c:4709 sql_help.c:4940 msgid "delete" msgstr "видалення" -#: sql_help.c:4374 +#: sql_help.c:4462 sql_help.c:4711 sql_help.c:4942 +msgid "search_seq_col_name" +msgstr "search_seq_col_name" + +#: sql_help.c:4464 sql_help.c:4713 sql_help.c:4944 +msgid "cycle_mark_col_name" +msgstr "cycle_mark_col_name" + +#: sql_help.c:4465 sql_help.c:4714 sql_help.c:4945 +msgid "cycle_mark_value" +msgstr "cycle_mark_value" + +#: sql_help.c:4466 sql_help.c:4715 sql_help.c:4946 +msgid "cycle_mark_default" +msgstr "cycle_mark_default" + +#: sql_help.c:4467 sql_help.c:4716 sql_help.c:4947 +msgid "cycle_path_col_name" +msgstr "cycle_path_col_name" + +#: sql_help.c:4494 msgid "new_table" msgstr "нова_таблиця" -#: sql_help.c:4399 +#: sql_help.c:4519 msgid "timezone" msgstr "часовий пояс" -#: sql_help.c:4444 +#: sql_help.c:4564 msgid "snapshot_id" msgstr "код_знімку" -#: sql_help.c:4686 +#: sql_help.c:4817 msgid "sort_expression" msgstr "вираз_сортування" -#: sql_help.c:4813 sql_help.c:5791 +#: sql_help.c:4954 sql_help.c:5932 msgid "abort the current transaction" msgstr "перервати поточну транзакцію" -#: sql_help.c:4819 +#: sql_help.c:4960 msgid "change the definition of an aggregate function" msgstr "змінити визначення агрегатної функції" -#: sql_help.c:4825 +#: sql_help.c:4966 msgid "change the definition of a collation" msgstr "змінити визначення правила сортування" -#: sql_help.c:4831 +#: sql_help.c:4972 msgid "change the definition of a conversion" msgstr "змінити визначення перетворення" -#: sql_help.c:4837 +#: sql_help.c:4978 msgid "change a database" msgstr "змінити базу даних" -#: sql_help.c:4843 +#: sql_help.c:4984 msgid "define default access privileges" msgstr "визначити права доступу за замовчуванням" -#: sql_help.c:4849 +#: sql_help.c:4990 msgid "change the definition of a domain" msgstr "змінити визначення домену" -#: sql_help.c:4855 +#: sql_help.c:4996 msgid "change the definition of an event trigger" msgstr "змінити визначення тригеру події" -#: sql_help.c:4861 +#: sql_help.c:5002 msgid "change the definition of an extension" msgstr "змінити визначення розширення" -#: sql_help.c:4867 +#: sql_help.c:5008 msgid "change the definition of a foreign-data wrapper" msgstr "змінити визначення джерела сторонніх даних" -#: sql_help.c:4873 +#: sql_help.c:5014 msgid "change the definition of a foreign table" msgstr "змінити визначення сторонньої таблиці" -#: sql_help.c:4879 +#: sql_help.c:5020 msgid "change the definition of a function" msgstr "змінити визначення функції" -#: sql_help.c:4885 +#: sql_help.c:5026 msgid "change role name or membership" msgstr "змінити назву ролі або членства" -#: sql_help.c:4891 +#: sql_help.c:5032 msgid "change the definition of an index" msgstr "змінити визначення індексу" -#: sql_help.c:4897 +#: sql_help.c:5038 msgid "change the definition of a procedural language" msgstr "змінити визначення процедурної мови" -#: sql_help.c:4903 +#: sql_help.c:5044 msgid "change the definition of a large object" msgstr "змінити визначення великого об'єкту" -#: sql_help.c:4909 +#: sql_help.c:5050 msgid "change the definition of a materialized view" msgstr "змінити визначення матеріалізованого подання" -#: sql_help.c:4915 +#: sql_help.c:5056 msgid "change the definition of an operator" msgstr "змінити визначення оператора" -#: sql_help.c:4921 +#: sql_help.c:5062 msgid "change the definition of an operator class" msgstr "змінити визначення класа операторів" -#: sql_help.c:4927 +#: sql_help.c:5068 msgid "change the definition of an operator family" msgstr "змінити визначення сімейства операторів" -#: sql_help.c:4933 -msgid "change the definition of a row level security policy" +#: sql_help.c:5074 +msgid "change the definition of a row-level security policy" msgstr "змінити визначення політики безпеки на рівні рядків" -#: sql_help.c:4939 +#: sql_help.c:5080 msgid "change the definition of a procedure" msgstr "змінити визначення процедури" -#: sql_help.c:4945 +#: sql_help.c:5086 msgid "change the definition of a publication" msgstr "змінити визначення публікації" -#: sql_help.c:4951 sql_help.c:5053 +#: sql_help.c:5092 sql_help.c:5194 msgid "change a database role" msgstr "змінити роль бази даних" -#: sql_help.c:4957 +#: sql_help.c:5098 msgid "change the definition of a routine" msgstr "змінити визначення підпрограми" -#: sql_help.c:4963 +#: sql_help.c:5104 msgid "change the definition of a rule" msgstr "змінити визначення правила" -#: sql_help.c:4969 +#: sql_help.c:5110 msgid "change the definition of a schema" msgstr "змінити визначення схеми" -#: sql_help.c:4975 +#: sql_help.c:5116 msgid "change the definition of a sequence generator" msgstr "змінити визначення генератору послідовності" -#: sql_help.c:4981 +#: sql_help.c:5122 msgid "change the definition of a foreign server" msgstr "змінити визначення стороннього серверу" -#: sql_help.c:4987 +#: sql_help.c:5128 msgid "change the definition of an extended statistics object" msgstr "змінити визначення об'єкту розширеної статистики" -#: sql_help.c:4993 +#: sql_help.c:5134 msgid "change the definition of a subscription" msgstr "змінити визначення підписки" -#: sql_help.c:4999 +#: sql_help.c:5140 msgid "change a server configuration parameter" msgstr "змінити параметр конфігурації сервера" -#: sql_help.c:5005 +#: sql_help.c:5146 msgid "change the definition of a table" msgstr "змінити визначення таблиці" -#: sql_help.c:5011 +#: sql_help.c:5152 msgid "change the definition of a tablespace" msgstr "змінити визначення табличного простору" -#: sql_help.c:5017 +#: sql_help.c:5158 msgid "change the definition of a text search configuration" msgstr "змінити визначення конфігурації текстового пошуку" -#: sql_help.c:5023 +#: sql_help.c:5164 msgid "change the definition of a text search dictionary" msgstr "змінити визначення словника текстового пошуку" -#: sql_help.c:5029 +#: sql_help.c:5170 msgid "change the definition of a text search parser" msgstr "змінити визначення парсера текстового пошуку" -#: sql_help.c:5035 +#: sql_help.c:5176 msgid "change the definition of a text search template" msgstr "змінити визначення шаблона текстового пошуку" -#: sql_help.c:5041 +#: sql_help.c:5182 msgid "change the definition of a trigger" msgstr "змінити визначення тригеру" -#: sql_help.c:5047 +#: sql_help.c:5188 msgid "change the definition of a type" msgstr "змінити визначення типу" -#: sql_help.c:5059 +#: sql_help.c:5200 msgid "change the definition of a user mapping" msgstr "змінити визначення зіставлень користувачів" -#: sql_help.c:5065 +#: sql_help.c:5206 msgid "change the definition of a view" msgstr "змінити визначення подання" -#: sql_help.c:5071 +#: sql_help.c:5212 msgid "collect statistics about a database" msgstr "зібрати статистику про базу даних" -#: sql_help.c:5077 sql_help.c:5869 +#: sql_help.c:5218 sql_help.c:6010 msgid "start a transaction block" msgstr "розпочати транзакцію" -#: sql_help.c:5083 +#: sql_help.c:5224 msgid "invoke a procedure" msgstr "викликати процедуру" -#: sql_help.c:5089 +#: sql_help.c:5230 msgid "force a write-ahead log checkpoint" msgstr "провести контрольну точку в журналі попереднього запису" -#: sql_help.c:5095 +#: sql_help.c:5236 msgid "close a cursor" msgstr "закрити курсор" -#: sql_help.c:5101 +#: sql_help.c:5242 msgid "cluster a table according to an index" msgstr "перегрупувати таблицю за індексом" -#: sql_help.c:5107 +#: sql_help.c:5248 msgid "define or change the comment of an object" msgstr "задати або змінити коментар об'єкта" -#: sql_help.c:5113 sql_help.c:5671 +#: sql_help.c:5254 sql_help.c:5812 msgid "commit the current transaction" msgstr "затвердити поточну транзакцію" -#: sql_help.c:5119 +#: sql_help.c:5260 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "затвердити транзакцію, раніше підготовлену до двохфазного затвердження" -#: sql_help.c:5125 +#: sql_help.c:5266 msgid "copy data between a file and a table" msgstr "копіювати дані між файлом та таблицею" -#: sql_help.c:5131 +#: sql_help.c:5272 msgid "define a new access method" msgstr "визначити новий метод доступу" -#: sql_help.c:5137 +#: sql_help.c:5278 msgid "define a new aggregate function" msgstr "визначити нову агрегатну функцію" -#: sql_help.c:5143 +#: sql_help.c:5284 msgid "define a new cast" msgstr "визначити приведення типів" -#: sql_help.c:5149 +#: sql_help.c:5290 msgid "define a new collation" msgstr "визначити нове правило сортування" -#: sql_help.c:5155 +#: sql_help.c:5296 msgid "define a new encoding conversion" msgstr "визначити нове перетворення кодування" -#: sql_help.c:5161 +#: sql_help.c:5302 msgid "create a new database" msgstr "створити нову базу даних" -#: sql_help.c:5167 +#: sql_help.c:5308 msgid "define a new domain" msgstr "визначити новий домен" -#: sql_help.c:5173 +#: sql_help.c:5314 msgid "define a new event trigger" msgstr "визначити новий тригер події" -#: sql_help.c:5179 +#: sql_help.c:5320 msgid "install an extension" msgstr "встановити розширення" -#: sql_help.c:5185 +#: sql_help.c:5326 msgid "define a new foreign-data wrapper" msgstr "визначити нове джерело сторонніх даних" -#: sql_help.c:5191 +#: sql_help.c:5332 msgid "define a new foreign table" msgstr "визначити нову сторонню таблицю" -#: sql_help.c:5197 +#: sql_help.c:5338 msgid "define a new function" msgstr "визначити нову функцію" -#: sql_help.c:5203 sql_help.c:5263 sql_help.c:5365 +#: sql_help.c:5344 sql_help.c:5404 sql_help.c:5506 msgid "define a new database role" msgstr "визначити нову роль бази даних" -#: sql_help.c:5209 +#: sql_help.c:5350 msgid "define a new index" msgstr "визначити новий індекс" -#: sql_help.c:5215 +#: sql_help.c:5356 msgid "define a new procedural language" msgstr "визначити нову процедурну мову" -#: sql_help.c:5221 +#: sql_help.c:5362 msgid "define a new materialized view" msgstr "визначити нове матеріалізоване подання" -#: sql_help.c:5227 +#: sql_help.c:5368 msgid "define a new operator" msgstr "визначити новий оператор" -#: sql_help.c:5233 +#: sql_help.c:5374 msgid "define a new operator class" msgstr "визначити новий клас оператора" -#: sql_help.c:5239 +#: sql_help.c:5380 msgid "define a new operator family" msgstr "визначити нове сімейство операторів" -#: sql_help.c:5245 -msgid "define a new row level security policy for a table" +#: sql_help.c:5386 +msgid "define a new row-level security policy for a table" msgstr "визначити нову політику безпеки на рівні рядків для таблиці" -#: sql_help.c:5251 +#: sql_help.c:5392 msgid "define a new procedure" msgstr "визначити нову процедуру" -#: sql_help.c:5257 +#: sql_help.c:5398 msgid "define a new publication" msgstr "визначити нову публікацію" -#: sql_help.c:5269 +#: sql_help.c:5410 msgid "define a new rewrite rule" msgstr "визначити нове правило перезапису" -#: sql_help.c:5275 +#: sql_help.c:5416 msgid "define a new schema" msgstr "визначити нову схему" -#: sql_help.c:5281 +#: sql_help.c:5422 msgid "define a new sequence generator" msgstr "визначити новий генератор послідовностей" -#: sql_help.c:5287 +#: sql_help.c:5428 msgid "define a new foreign server" msgstr "визначити новий сторонній сервер" -#: sql_help.c:5293 +#: sql_help.c:5434 msgid "define extended statistics" msgstr "визначити розширену статистику" -#: sql_help.c:5299 +#: sql_help.c:5440 msgid "define a new subscription" msgstr "визначити нову підписку" -#: sql_help.c:5305 +#: sql_help.c:5446 msgid "define a new table" msgstr "визначити нову таблицю" -#: sql_help.c:5311 sql_help.c:5827 +#: sql_help.c:5452 sql_help.c:5968 msgid "define a new table from the results of a query" msgstr "визначити нову таблицю з результатів запиту" -#: sql_help.c:5317 +#: sql_help.c:5458 msgid "define a new tablespace" msgstr "визначити новий табличний простір" -#: sql_help.c:5323 +#: sql_help.c:5464 msgid "define a new text search configuration" msgstr "визначити нову конфігурацію текстового пошуку" -#: sql_help.c:5329 +#: sql_help.c:5470 msgid "define a new text search dictionary" msgstr "визначити новий словник текстового пошуку" -#: sql_help.c:5335 +#: sql_help.c:5476 msgid "define a new text search parser" msgstr "визначити новий аналізатор текстового пошуку" -#: sql_help.c:5341 +#: sql_help.c:5482 msgid "define a new text search template" msgstr "визначити новий шаблон текстового пошуку" -#: sql_help.c:5347 +#: sql_help.c:5488 msgid "define a new transform" msgstr "визначити нове перетворення" -#: sql_help.c:5353 +#: sql_help.c:5494 msgid "define a new trigger" msgstr "визначити новий тригер" -#: sql_help.c:5359 +#: sql_help.c:5500 msgid "define a new data type" msgstr "визначити новий тип даних" -#: sql_help.c:5371 +#: sql_help.c:5512 msgid "define a new mapping of a user to a foreign server" msgstr "визначити нове зіставлення користувача для стороннього сервера" -#: sql_help.c:5377 +#: sql_help.c:5518 msgid "define a new view" msgstr "визначити нове подання" -#: sql_help.c:5383 +#: sql_help.c:5524 msgid "deallocate a prepared statement" msgstr "звільнити підготовлену команду" -#: sql_help.c:5389 +#: sql_help.c:5530 msgid "define a cursor" msgstr "визначити курсор" -#: sql_help.c:5395 +#: sql_help.c:5536 msgid "delete rows of a table" msgstr "видалити рядки таблиці" -#: sql_help.c:5401 +#: sql_help.c:5542 msgid "discard session state" msgstr "очистити стан сесії" -#: sql_help.c:5407 +#: sql_help.c:5548 msgid "execute an anonymous code block" msgstr "виконати анонімний блок коду" -#: sql_help.c:5413 +#: sql_help.c:5554 msgid "remove an access method" msgstr "видалити метод доступу" -#: sql_help.c:5419 +#: sql_help.c:5560 msgid "remove an aggregate function" msgstr "видалити агрегатну функцію" -#: sql_help.c:5425 +#: sql_help.c:5566 msgid "remove a cast" msgstr "видалити приведення типів" -#: sql_help.c:5431 +#: sql_help.c:5572 msgid "remove a collation" msgstr "видалити правило сортування" -#: sql_help.c:5437 +#: sql_help.c:5578 msgid "remove a conversion" msgstr "видалити перетворення" -#: sql_help.c:5443 +#: sql_help.c:5584 msgid "remove a database" msgstr "видалити базу даних" -#: sql_help.c:5449 +#: sql_help.c:5590 msgid "remove a domain" msgstr "видалити домен" -#: sql_help.c:5455 +#: sql_help.c:5596 msgid "remove an event trigger" msgstr "видалити тригер події" -#: sql_help.c:5461 +#: sql_help.c:5602 msgid "remove an extension" msgstr "видалити розширення" -#: sql_help.c:5467 +#: sql_help.c:5608 msgid "remove a foreign-data wrapper" msgstr "видалити джерело сторонніх даних" -#: sql_help.c:5473 +#: sql_help.c:5614 msgid "remove a foreign table" msgstr "видалити сторонню таблицю" -#: sql_help.c:5479 +#: sql_help.c:5620 msgid "remove a function" msgstr "видалити функцію" -#: sql_help.c:5485 sql_help.c:5551 sql_help.c:5653 +#: sql_help.c:5626 sql_help.c:5692 sql_help.c:5794 msgid "remove a database role" msgstr "видалити роль бази даних" -#: sql_help.c:5491 +#: sql_help.c:5632 msgid "remove an index" msgstr "видалити індекс" -#: sql_help.c:5497 +#: sql_help.c:5638 msgid "remove a procedural language" msgstr "видалити процедурну мову" -#: sql_help.c:5503 +#: sql_help.c:5644 msgid "remove a materialized view" msgstr "видалити матеріалізоване подання" -#: sql_help.c:5509 +#: sql_help.c:5650 msgid "remove an operator" msgstr "видалити оператор" -#: sql_help.c:5515 +#: sql_help.c:5656 msgid "remove an operator class" msgstr "видалити клас операторів" -#: sql_help.c:5521 +#: sql_help.c:5662 msgid "remove an operator family" msgstr "видалити сімейство операторів" -#: sql_help.c:5527 +#: sql_help.c:5668 msgid "remove database objects owned by a database role" msgstr "видалити об'єкти бази даних, що належать ролі" -#: sql_help.c:5533 -msgid "remove a row level security policy from a table" +#: sql_help.c:5674 +msgid "remove a row-level security policy from a table" msgstr "видалити політику безпеки на рівні рядків з таблиці" -#: sql_help.c:5539 +#: sql_help.c:5680 msgid "remove a procedure" msgstr "видалити процедуру" -#: sql_help.c:5545 +#: sql_help.c:5686 msgid "remove a publication" msgstr "видалити публікацію" -#: sql_help.c:5557 +#: sql_help.c:5698 msgid "remove a routine" msgstr "видалити підпрограму" -#: sql_help.c:5563 +#: sql_help.c:5704 msgid "remove a rewrite rule" msgstr "видалити правило перезапису" -#: sql_help.c:5569 +#: sql_help.c:5710 msgid "remove a schema" msgstr "видалити схему" -#: sql_help.c:5575 +#: sql_help.c:5716 msgid "remove a sequence" msgstr "видалити послідовність" -#: sql_help.c:5581 +#: sql_help.c:5722 msgid "remove a foreign server descriptor" msgstr "видалити опис стороннього серверу" -#: sql_help.c:5587 +#: sql_help.c:5728 msgid "remove extended statistics" msgstr "видалити розширену статистику" -#: sql_help.c:5593 +#: sql_help.c:5734 msgid "remove a subscription" msgstr "видалити підписку" -#: sql_help.c:5599 +#: sql_help.c:5740 msgid "remove a table" msgstr "видалити таблицю" -#: sql_help.c:5605 +#: sql_help.c:5746 msgid "remove a tablespace" msgstr "видалити табличний простір" -#: sql_help.c:5611 +#: sql_help.c:5752 msgid "remove a text search configuration" msgstr "видалити конфігурацію тектового пошуку" -#: sql_help.c:5617 +#: sql_help.c:5758 msgid "remove a text search dictionary" msgstr "видалити словник тектового пошуку" -#: sql_help.c:5623 +#: sql_help.c:5764 msgid "remove a text search parser" msgstr "видалити парсер тектового пошуку" -#: sql_help.c:5629 +#: sql_help.c:5770 msgid "remove a text search template" msgstr "видалити шаблон тектового пошуку" -#: sql_help.c:5635 +#: sql_help.c:5776 msgid "remove a transform" msgstr "видалити перетворення" -#: sql_help.c:5641 +#: sql_help.c:5782 msgid "remove a trigger" msgstr "видалити тригер" -#: sql_help.c:5647 +#: sql_help.c:5788 msgid "remove a data type" msgstr "видалити тип даних" -#: sql_help.c:5659 +#: sql_help.c:5800 msgid "remove a user mapping for a foreign server" msgstr "видалити зіставлення користувача для стороннього серверу" -#: sql_help.c:5665 +#: sql_help.c:5806 msgid "remove a view" msgstr "видалити подання" -#: sql_help.c:5677 +#: sql_help.c:5818 msgid "execute a prepared statement" msgstr "виконати підготовлену команду" -#: sql_help.c:5683 +#: sql_help.c:5824 msgid "show the execution plan of a statement" msgstr "показати план виконання команди" -#: sql_help.c:5689 +#: sql_help.c:5830 msgid "retrieve rows from a query using a cursor" msgstr "отримати рядки запиту з курсору" -#: sql_help.c:5695 +#: sql_help.c:5836 msgid "define access privileges" msgstr "визначити права доступу" -#: sql_help.c:5701 +#: sql_help.c:5842 msgid "import table definitions from a foreign server" msgstr "імпортувати визначення таблиць зі стороннього серверу" -#: sql_help.c:5707 +#: sql_help.c:5848 msgid "create new rows in a table" msgstr "створити нові рядки в таблиці" -#: sql_help.c:5713 +#: sql_help.c:5854 msgid "listen for a notification" msgstr "очікувати на повідомлення" -#: sql_help.c:5719 +#: sql_help.c:5860 msgid "load a shared library file" msgstr "завантажити файл спільної бібліотеки" -#: sql_help.c:5725 +#: sql_help.c:5866 msgid "lock a table" msgstr "заблокувати таблицю" -#: sql_help.c:5731 +#: sql_help.c:5872 msgid "position a cursor" msgstr "розташувати курсор" -#: sql_help.c:5737 +#: sql_help.c:5878 msgid "generate a notification" msgstr "згенерувати повідомлення" -#: sql_help.c:5743 +#: sql_help.c:5884 msgid "prepare a statement for execution" msgstr "підготувати команду для виконання" -#: sql_help.c:5749 +#: sql_help.c:5890 msgid "prepare the current transaction for two-phase commit" msgstr "підготувати поточну транзакцію для двохфазного затвердження" -#: sql_help.c:5755 +#: sql_help.c:5896 msgid "change the ownership of database objects owned by a database role" msgstr "змінити власника об'єктів БД, що належать заданій ролі" -#: sql_help.c:5761 +#: sql_help.c:5902 msgid "replace the contents of a materialized view" msgstr "замінити вміст матеріалізованого подання" -#: sql_help.c:5767 +#: sql_help.c:5908 msgid "rebuild indexes" msgstr "перебудувати індекси" -#: sql_help.c:5773 +#: sql_help.c:5914 msgid "destroy a previously defined savepoint" msgstr "видалити раніше визначену точку збереження" -#: sql_help.c:5779 +#: sql_help.c:5920 msgid "restore the value of a run-time parameter to the default value" msgstr "відновити початкове значення параметру виконання" -#: sql_help.c:5785 +#: sql_help.c:5926 msgid "remove access privileges" msgstr "видалити права доступу" -#: sql_help.c:5797 +#: sql_help.c:5938 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "скасувати транзакцію, раніше підготовлену до двохфазного затвердження" -#: sql_help.c:5803 +#: sql_help.c:5944 msgid "roll back to a savepoint" msgstr "відкотитися до точки збереження" -#: sql_help.c:5809 +#: sql_help.c:5950 msgid "define a new savepoint within the current transaction" msgstr "визначити нову точку збереження в рамках поточної транзакції" -#: sql_help.c:5815 +#: sql_help.c:5956 msgid "define or change a security label applied to an object" msgstr "визначити або змінити мітку безпеки, застосовану до об'єкта" -#: sql_help.c:5821 sql_help.c:5875 sql_help.c:5911 +#: sql_help.c:5962 sql_help.c:6016 sql_help.c:6052 msgid "retrieve rows from a table or view" msgstr "отримати рядки з таблиці або подання" -#: sql_help.c:5833 +#: sql_help.c:5974 msgid "change a run-time parameter" msgstr "змінити параметр виконання" -#: sql_help.c:5839 +#: sql_help.c:5980 msgid "set constraint check timing for the current transaction" msgstr "встановити час перевірки обмеження для поточної транзакції" -#: sql_help.c:5845 +#: sql_help.c:5986 msgid "set the current user identifier of the current session" msgstr "встановити ідентифікатор поточного користувача в поточній сесії" -#: sql_help.c:5851 +#: sql_help.c:5992 msgid "set the session user identifier and the current user identifier of the current session" msgstr "встановити ідентифікатор користувача сесії й ідентифікатор поточного користувача в поточній сесії" -#: sql_help.c:5857 +#: sql_help.c:5998 msgid "set the characteristics of the current transaction" msgstr "встановити характеристики поточної транзакції" -#: sql_help.c:5863 +#: sql_help.c:6004 msgid "show the value of a run-time parameter" msgstr "показати значення параметра виконання" -#: sql_help.c:5881 +#: sql_help.c:6022 msgid "empty a table or set of tables" msgstr "очистити таблицю або декілька таблиць" -#: sql_help.c:5887 +#: sql_help.c:6028 msgid "stop listening for a notification" msgstr "припинити очікування повідомлень" -#: sql_help.c:5893 +#: sql_help.c:6034 msgid "update rows of a table" msgstr "змінити рядки таблиці" -#: sql_help.c:5899 +#: sql_help.c:6040 msgid "garbage-collect and optionally analyze a database" msgstr "виконати збір сміття і проаналізувати базу даних" -#: sql_help.c:5905 +#: sql_help.c:6046 msgid "compute a set of rows" msgstr "отримати набір рядків" -#: startup.c:212 +#: startup.c:213 #, c-format msgid "-1 can only be used in non-interactive mode" msgstr "-1 можна використовувати лише в неінтерактивному режимі" -#: startup.c:299 -#, c-format -msgid "could not connect to server: %s" -msgstr "не вдалося підключитися до сервера: %s" - -#: startup.c:327 +#: startup.c:326 #, c-format msgid "could not open log file \"%s\": %m" -msgstr "не вдалося відкрити файл протоколу \"%s\": %m" +msgstr "не вдалося відкрити файл журналу \"%s\": %m" -#: startup.c:439 +#: startup.c:438 #, c-format msgid "Type \"help\" for help.\n\n" msgstr "Введіть \"help\", щоб отримати допомогу.\n\n" -#: startup.c:589 +#: startup.c:591 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "не вдалося встановити параметр друку \"%s\"" -#: startup.c:697 +#: startup.c:699 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" для отримання додаткової інформації.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" -#: startup.c:714 +#: startup.c:716 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "зайвий аргумент \"%s\" проігнорований" -#: startup.c:763 +#: startup.c:765 #, c-format msgid "could not find own program executable" msgstr "не вдалося знайти ехе файл власної програми" -#: tab-complete.c:4640 +#: tab-complete.c:4904 #, c-format msgid "tab completion query failed: %s\n" "Query was:\n" @@ -6148,7 +6258,7 @@ msgstr "неправильне значення \"%s\" для \"%s\": очіку msgid "invalid variable name: \"%s\"" msgstr "неправильне ім'я змінної: \"%s\"" -#: variables.c:393 +#: variables.c:419 #, c-format msgid "unrecognized value \"%s\" for \"%s\"\n" "Available values are: %s." diff --git a/src/bin/psql/po/zh_CN.po b/src/bin/psql/po/zh_CN.po index 79c4ddaaf0..131e90660a 100644 --- a/src/bin/psql/po/zh_CN.po +++ b/src/bin/psql/po/zh_CN.po @@ -1,83 +1,83 @@ msgid "" msgstr "" -"Project-Id-Version: psql (PostgreSQL) 12\n" +"Project-Id-Version: psql (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-06-17 16:00+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:45+0000\n" +"PO-Revision-Date: 2021-08-16 16:00+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "X-Poedit-SourceCharset: utf-8\n" "X-Poedit-Bookmarks: 175,-1,-1,-1,-1,-1,-1,-1,-1,-1\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.5.7\n" -#: ../../../src/common/logging.c:188 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "致命的:" -#: ../../../src/common/logging.c:195 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "错误: " -#: ../../../src/common/logging.c:202 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "警告: " -#: ../../common/exec.c:138 ../../common/exec.c:255 ../../common/exec.c:301 +#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 #, c-format msgid "could not identify current directory: %m" msgstr "无法确认当前目录: %m" -#: ../../common/exec.c:157 +#: ../../common/exec.c:155 #, c-format msgid "invalid binary \"%s\"" msgstr "无效的二进制码 \"%s\"" -#: ../../common/exec.c:207 +#: ../../common/exec.c:205 #, c-format msgid "could not read binary \"%s\"" msgstr "无法读取二进制码 \"%s\"" -#: ../../common/exec.c:215 +#: ../../common/exec.c:213 #, c-format msgid "could not find a \"%s\" to execute" msgstr "未能找到一个 \"%s\" 来执行" -#: ../../common/exec.c:271 ../../common/exec.c:310 +#: ../../common/exec.c:269 ../../common/exec.c:308 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "无法跳转到目录 \"%s\" 中: %m" -#: ../../common/exec.c:288 +#: ../../common/exec.c:286 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "无法读取符号链接 \"%s\": %m" -#: ../../common/exec.c:541 -#, c-format -msgid "pclose failed: %m" -msgstr "pclose调用失败: %m" +#: ../../common/exec.c:409 +msgid "%s() failed: %m" +msgstr "%s()失败: %m" -#: ../../common/exec.c:670 ../../common/exec.c:715 ../../common/exec.c:807 -#: command.c:1218 input.c:228 mainloop.c:82 mainloop.c:386 +#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 +#: command.c:1315 command.c:3246 command.c:3295 command.c:3412 input.c:227 +#: mainloop.c:81 mainloop.c:402 #, c-format msgid "out of memory" -msgstr "内存用尽" +msgstr "内存不足" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format msgid "out of memory\n" -msgstr "内存耗尽\n" +msgstr "内存不足\n" -#: ../../common/fe_memutils.c:92 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "无法复制空指针 (内部错误)\n" @@ -87,7 +87,7 @@ msgstr "无法复制空指针 (内部错误)\n" msgid "could not look up effective user ID %ld: %s" msgstr "无法找到有效的用户ID %ld: %s" -#: ../../common/username.c:45 command.c:555 +#: ../../common/username.c:45 command.c:565 msgid "user does not exist" msgstr "用户不存在" @@ -104,17 +104,17 @@ msgstr "无法执行命令" #: ../../common/wait_error.c:49 #, c-format msgid "command not found" -msgstr "没有找到命令" +msgstr "命令没有找到" #: ../../common/wait_error.c:54 #, c-format msgid "child process exited with exit code %d" -msgstr "子进程结束,结束代码 %d" +msgstr "子进程已退出, 退出码为 %d" #: ../../common/wait_error.c:62 #, c-format msgid "child process was terminated by exception 0x%X" -msgstr "子进程被异常(exception) 0x%X 终止" +msgstr "子进程被例外(exception) 0x%X 终止" #: ../../common/wait_error.c:66 #, c-format @@ -124,288 +124,310 @@ msgstr "子进程被信号 %d 终止: %s" #: ../../common/wait_error.c:72 #, c-format msgid "child process exited with unrecognized status %d" -msgstr "子进程结束,不明状态代码 %d" +msgstr "子进程已退出, 未知状态 %d" + +#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +msgid "Cancel request sent\n" +msgstr "取消发送的请求\n" + +#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 +msgid "Could not send cancel request: " +msgstr "无法发送取消请求: " -#: ../../fe_utils/print.c:353 +#: ../../fe_utils/print.c:336 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu 行记录)" -#: ../../fe_utils/print.c:3058 +#: ../../fe_utils/print.c:3039 #, c-format msgid "Interrupted\n" msgstr "已中断\n" -#: ../../fe_utils/print.c:3122 +#: ../../fe_utils/print.c:3103 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "无法对表的内容增加标题:已经超过%d列的数量.\n" -#: ../../fe_utils/print.c:3162 +#: ../../fe_utils/print.c:3143 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "无法对表的内容添加单元: 总共有%d个单元超过.\n" -#: ../../fe_utils/print.c:3417 +#: ../../fe_utils/print.c:3401 #, c-format msgid "invalid output format (internal error): %d" msgstr "无效的输出格式 (内部错误): %d" -#: command.c:221 +#: ../../fe_utils/psqlscan.l:697 +#, c-format +msgid "skipping recursive expansion of variable \"%s\"" +msgstr "跳过变量 \"%s\"的递归扩展" + +#: command.c:230 #, c-format msgid "invalid command \\%s" msgstr "无效的命令 \\%s" -#: command.c:223 +#: command.c:232 #, c-format msgid "Try \\? for help." msgstr "使用\\?获取帮助." -#: command.c:241 +#: command.c:250 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s:忽略多余的参数 \"%s\"" -#: command.c:293 +#: command.c:302 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "忽略\\%s命令;使用\\endif或Ctrl-C退出当前\\if块" -#: command.c:553 +#: command.c:563 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "无法获取用户ID %ld: %s对应的home 目录" -#: command.c:571 +#: command.c:581 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: 无法切换目录至 \"%s\": %m" -#: command.c:596 +#: command.c:606 #, c-format msgid "You are currently not connected to a database.\n" -msgstr "你目前没有连接到数据库。\n" +msgstr "你目前没有连接到数据库.\n" -#: command.c:609 +#: command.c:616 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "以用户 \"%2$s\" 的身份, 在地址\"%3$s\", 端口\"%4$s\"连接到数据库 \"%1$s\"\n" -#: command.c:612 +#: command.c:619 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "以用户 \"%2$s\" 的身份,通过套接字\"%3$s\"在端口\"%4$s\"连接到数据库 \"%1$s\"\n" -#: command.c:618 +#: command.c:625 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "以用户 \"%2$s\" 的身份, 在主机\"%3$s\" (地址 \"%4$s\"), 端口\"%5$s\"连接到数据库 \"%1$s\".\n" -#: command.c:621 +#: command.c:628 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "以用户 \"%2$s\" 的身份, 在主机\"%3$s\", 端口\"%4$s\"连接到数据库 \"%1$s\"\n" -#: command.c:930 command.c:1026 command.c:2411 -#, c-format +#: command.c:1012 command.c:1121 command.c:2602 +#, c-format msgid "no query buffer" msgstr "没有查询缓存区" -#: command.c:963 command.c:4801 +#: command.c:1045 command.c:5304 #, c-format msgid "invalid line number: %s" msgstr "行号无效: %s" -#: command.c:1017 +#: command.c:1112 #, c-format msgid "The server (version %s) does not support editing function source." msgstr "服务器(版本%s)不支持编辑函数源码." -#: command.c:1020 +#: command.c:1115 #, c-format msgid "The server (version %s) does not support editing view definitions." msgstr "服务器(版本%s)不支持编辑视图定义." -#: command.c:1102 +#: command.c:1197 msgid "No changes" msgstr "没有发生更改" -#: command.c:1179 +#: command.c:1276 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s:无效的编码名称或找不到转换程序" -#: command.c:1214 command.c:1853 command.c:3089 command.c:4903 common.c:175 -#: common.c:224 common.c:521 common.c:1362 common.c:1390 common.c:1498 -#: common.c:1601 common.c:1639 copy.c:490 copy.c:709 help.c:63 large_obj.c:157 -#: large_obj.c:192 large_obj.c:254 +#: command.c:1311 command.c:2052 command.c:3242 command.c:3434 command.c:5406 +#: common.c:174 common.c:223 common.c:392 common.c:1248 common.c:1276 +#: common.c:1385 common.c:1492 common.c:1530 copy.c:488 copy.c:709 help.c:62 +#: large_obj.c:157 large_obj.c:192 large_obj.c:254 startup.c:298 #, c-format msgid "%s" msgstr "%s" -#: command.c:1221 +#: command.c:1318 msgid "There is no previous error." msgstr "没有之前的错误。" -#: command.c:1409 command.c:1714 command.c:1728 command.c:1745 command.c:1905 -#: command.c:2142 command.c:2378 command.c:2418 +#: command.c:1431 +msgid "\\%s: missing right parenthesis" +msgstr "\\%s:缺少一个右括弧" + +#: command.c:1608 command.c:1913 command.c:1927 command.c:1944 command.c:2106 +#: command.c:2342 command.c:2569 command.c:2609 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s:缺少所需参数" -#: command.c:1540 +#: command.c:1739 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif:不能出现在\\else之后" -#: command.c:1545 +#: command.c:1744 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: 不匹配\\if" -#: command.c:1609 +#: command.c:1808 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: 不能出现在 \\else" -#: command.c:1614 +#: command.c:1813 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: 不匹配\\if" -#: command.c:1654 +#: command.c:1853 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif:不匹配\\if" -#: command.c:1809 +#: command.c:2008 msgid "Query buffer is empty." msgstr "查询缓存区是空的." -#: command.c:1831 +#: command.c:2030 msgid "Enter new password: " msgstr "输入新的密码:" -#: command.c:1832 +#: command.c:2031 msgid "Enter it again: " -msgstr "再次输入:" +msgstr "再输入一遍:" -#: command.c:1836 +#: command.c:2035 #, c-format msgid "Passwords didn't match." -msgstr "两次密码不匹配." +msgstr "口令不匹配." -#: command.c:1935 +#: command.c:2135 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s:无法读取变量的值" -#: command.c:2038 +#: command.c:2238 msgid "Query buffer reset (cleared)." msgstr "查询缓存区重置(已清空)." -#: command.c:2060 +#: command.c:2260 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "写入历史记录到文件 \"%s\".\n" -#: command.c:2147 +#: command.c:2347 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: 环境变量不能包含 \"=\"" -#: command.c:2208 +#: command.c:2399 #, c-format msgid "The server (version %s) does not support showing function source." msgstr "服务器(版本%s)不支持显示函数源码." -#: command.c:2211 +#: command.c:2402 #, c-format msgid "The server (version %s) does not support showing view definitions." msgstr "服务器(版本%s)不支持显示视图定义." -#: command.c:2218 +#: command.c:2409 #, c-format msgid "function name is required" msgstr "需要函数名" -#: command.c:2220 +#: command.c:2411 #, c-format msgid "view name is required" msgstr "需要视图名" -#: command.c:2350 +#: command.c:2541 msgid "Timing is on." msgstr "启用计时功能." -#: command.c:2352 +#: command.c:2543 msgid "Timing is off." msgstr "停止计时功能." -#: command.c:2437 command.c:2465 command.c:3485 command.c:3488 command.c:3491 -#: command.c:3497 command.c:3499 command.c:3507 command.c:3517 command.c:3526 -#: command.c:3540 command.c:3557 command.c:3615 common.c:71 copy.c:333 -#: copy.c:405 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 +#: command.c:2628 command.c:2656 command.c:3873 command.c:3876 command.c:3879 +#: command.c:3885 command.c:3887 command.c:3913 command.c:3923 command.c:3935 +#: command.c:3949 command.c:3976 command.c:4034 common.c:70 copy.c:331 +#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:2849 startup.c:240 startup.c:291 +#: command.c:3047 startup.c:237 startup.c:287 msgid "Password: " -msgstr "口令:" +msgstr "口令: " -#: command.c:2854 startup.c:288 +#: command.c:3052 startup.c:284 #, c-format msgid "Password for user %s: " msgstr "用户 %s 的口令:" -#: command.c:2905 +#: command.c:3104 +#, c-format +msgid "Do not give user, host, or port separately when using a connection string" +msgstr "使用连接字符串时,不要单独提供用户、主机或端口" + +#: command.c:3139 #, c-format -msgid "All connection parameters must be supplied because no database connection exists" -msgstr "没有可用的数据库连接,所以必须提供所有的连接参数" +msgid "No database connection exists to re-use parameters from" +msgstr "不存在可从中重复使用参数的数据库连接" -#: command.c:3093 +#: command.c:3440 #, c-format msgid "Previous connection kept" msgstr "保留上一次连接" -#: command.c:3097 +#: command.c:3446 #, c-format msgid "\\connect: %s" msgstr "\\连接:%s" -#: command.c:3136 +#: command.c:3502 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "您现在已经连接到数据库 \"%s\", 用户 \"%s\",地址 \"%s\",端口号 \"%s\".\n" -#: command.c:3139 +#: command.c:3505 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "您现在已经连接到数据库 \"%s\", 用户名 \"%s\" , 套接字 \"%s\", 端口号 \"%s\".\n" -#: command.c:3145 +#: command.c:3511 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "您现在已经连接到数据库 \"%s\", 用户 \"%s\",主机 \"%s\"(地址 \"%s\"),端口号 \"%s\".\n" -#: command.c:3148 +#: command.c:3514 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "您现在已经连接到数据库 \"%s\", 用户 \"%s\",主机 \"%s\",端口号 \"%s\".\n" -#: command.c:3153 +#: command.c:3519 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "您现在已经连接到数据库 \"%s\",用户 \"%s\".\n" -#: command.c:3186 +#: command.c:3559 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, 服务器 %s)\n" -#: command.c:3194 +#: command.c:3567 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -414,29 +436,28 @@ msgstr "" "警告:%s 主版本%s,服务器主版本为%s.\n" " 一些psql功能可能无法正常使用.\n" -#: command.c:3232 +#: command.c:3606 #, c-format msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" msgstr "SSL 连接(协议:%s,密码:%s,密钥位:%s,压缩:%s)\n" -#: command.c:3233 command.c:3234 command.c:3235 +#: command.c:3607 command.c:3608 command.c:3609 msgid "unknown" msgstr "未知" -#: command.c:3236 help.c:46 +#: command.c:3610 help.c:45 msgid "off" msgstr "关闭" -#: command.c:3236 help.c:46 +#: command.c:3610 help.c:45 msgid "on" msgstr "开启" -#: command.c:3250 -#, c-format -msgid "GSSAPI Encrypted connection\n" +#: command.c:3624 +msgid "GSSAPI-encrypted connection\n" msgstr "GSSAPI加密连接\n" -#: command.c:3270 +#: command.c:3644 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -447,258 +468,258 @@ msgstr "" " 8-bit 字符可能无法正常工作。请查阅 psql 参考\n" " 页 \"Windows 用户注意事项\" 的详细说明.\n" -#: command.c:3374 +#: command.c:3749 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "必须设置环境变量 PSQL_EDITOR_LINENUMBER_ARG,用于指定行号" -#: command.c:3403 +#: command.c:3778 #, c-format msgid "could not start editor \"%s\"" msgstr "无法启动编辑器 \"%s\"" -#: command.c:3405 +#: command.c:3780 #, c-format msgid "could not start /bin/sh" msgstr "无法启动 /bin/sh" -#: command.c:3443 +#: command.c:3830 #, c-format msgid "could not locate temporary directory: %s" msgstr "找不到临时目录:%s" -#: command.c:3470 +#: command.c:3857 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "无法打开临时文件 \"%s\": %m" -#: command.c:3763 +#: command.c:4193 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset:模糊的缩写\"%s\"同时匹配\"%s\"和\"%s\"" -#: command.c:3783 +#: command.c:4213 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset: 允许的格式是 aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:3802 +#: command.c:4232 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: 所允许使用的文本风格是ascii, old-ascii, unicode" -#: command.c:3817 +#: command.c:4247 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset:允许的 Unicode 边界线型是 single 和 double" -#: command.c:3832 +#: command.c:4262 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset:允许的 Unicode 列线型是 single 和 double" -#: command.c:3847 +#: command.c:4277 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset:允许的 Unicode 页眉线型是 single 和 double" -#: command.c:3890 +#: command.c:4320 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep必须是单字节字符" -#: command.c:3895 +#: command.c:4325 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldsep不能是双引号、换行符或回车符" -#: command.c:4032 command.c:4218 +#: command.c:4462 command.c:4650 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: 不明选项: %s" -#: command.c:4050 +#: command.c:4482 #, c-format msgid "Border style is %d.\n" msgstr "边缘风格是 %d.\n" -#: command.c:4056 +#: command.c:4488 #, c-format msgid "Target width is unset.\n" msgstr "目标宽度未设置.\n" -#: command.c:4058 +#: command.c:4490 #, c-format msgid "Target width is %d.\n" msgstr "目标宽度为 %d.\n" -#: command.c:4065 +#: command.c:4497 #, c-format msgid "Expanded display is on.\n" msgstr "扩展显示已打开.\n" -#: command.c:4067 +#: command.c:4499 #, c-format msgid "Expanded display is used automatically.\n" msgstr "扩展显示已自动打开.\n" -#: command.c:4069 +#: command.c:4501 #, c-format msgid "Expanded display is off.\n" msgstr "扩展显示已关闭.\n" -#: command.c:4075 +#: command.c:4507 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "CSV的字段分隔符是\"%s\".\n" -#: command.c:4083 command.c:4091 +#: command.c:4515 command.c:4523 #, c-format msgid "Field separator is zero byte.\n" msgstr "栏位分隔符号是0字节\n" -#: command.c:4085 +#: command.c:4517 #, c-format msgid "Field separator is \"%s\".\n" msgstr "栏位分隔符号是 \"%s\".\n" -#: command.c:4098 +#: command.c:4530 #, c-format msgid "Default footer is on.\n" msgstr "打开默认步进器.\n" -#: command.c:4100 +#: command.c:4532 #, c-format msgid "Default footer is off.\n" msgstr "关闭默认步进器.\n" -#: command.c:4106 +#: command.c:4538 #, c-format msgid "Output format is %s.\n" msgstr "输出格式是 %s.\n" -#: command.c:4112 +#: command.c:4544 #, c-format msgid "Line style is %s.\n" msgstr "文本的风格是%s. \n" -#: command.c:4119 +#: command.c:4551 #, c-format msgid "Null display is \"%s\".\n" msgstr " \"%s\" 是空值显示.\n" -#: command.c:4127 +#: command.c:4559 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "启动语言环境调整后的数值输出.\n" -#: command.c:4129 +#: command.c:4561 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "关闭语言环境调整后的数值输出.\n" -#: command.c:4136 +#: command.c:4568 #, c-format msgid "Pager is used for long output.\n" msgstr "显示大量数据时使用分页器.\n" -#: command.c:4138 +#: command.c:4570 #, c-format msgid "Pager is always used.\n" msgstr "总是使用分页器.\n" -#: command.c:4140 +#: command.c:4572 #, c-format msgid "Pager usage is off.\n" msgstr "不使用分页器.\n" -#: command.c:4146 +#: command.c:4578 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" msgstr[0] "分页器不能被用于少于%d行.\n" -#: command.c:4156 command.c:4166 +#: command.c:4588 command.c:4598 #, c-format msgid "Record separator is zero byte.\n" msgstr "记录分隔符号是 0字节.\n" -#: command.c:4158 +#: command.c:4590 #, c-format msgid "Record separator is .\n" msgstr "记录分隔符号是 .\n" -#: command.c:4160 +#: command.c:4592 #, c-format msgid "Record separator is \"%s\".\n" msgstr "记录分隔符号是 \"%s\".\n" -#: command.c:4173 +#: command.c:4605 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "表属性是 \"%s\".\n" -#: command.c:4176 +#: command.c:4608 #, c-format msgid "Table attributes unset.\n" msgstr "未设置数据表属性.\n" -#: command.c:4183 +#: command.c:4615 #, c-format msgid "Title is \"%s\".\n" msgstr "标题是 \"%s\".\n" -#: command.c:4185 +#: command.c:4617 #, c-format msgid "Title is unset.\n" msgstr "无标题.\n" -#: command.c:4192 +#: command.c:4624 #, c-format msgid "Tuples only is on.\n" msgstr "开启只显示元组.\n" -#: command.c:4194 +#: command.c:4626 #, c-format msgid "Tuples only is off.\n" msgstr "关闭只显示元组.\n" -#: command.c:4200 +#: command.c:4632 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Unicode 边界线型是 \"%s\".\n" -#: command.c:4206 +#: command.c:4638 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Unicode 列线型是 \"%s\".\n" -#: command.c:4212 +#: command.c:4644 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Unicode 页眉线型是 \"%s\".\n" -#: command.c:4374 +#: command.c:4877 #, c-format msgid "\\!: failed" msgstr "\\!:失败" -#: command.c:4399 common.c:781 +#: command.c:4902 common.c:652 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch命令不能用于空查询" -#: command.c:4440 +#: command.c:4943 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (每 %gs)\n" -#: command.c:4443 +#: command.c:4946 #, c-format msgid "%s (every %gs)\n" msgstr "%s (每 %gs)\n" -#: command.c:4497 command.c:4504 common.c:681 common.c:688 common.c:1345 +#: command.c:5000 command.c:5007 common.c:552 common.c:559 common.c:1231 #, c-format msgid "" "********* QUERY **********\n" @@ -711,107 +732,115 @@ msgstr "" "**************************\n" "\n" -#: command.c:4696 +#: command.c:5199 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\"不是一个视图" -#: command.c:4712 +#: command.c:5215 #, c-format msgid "could not parse reloptions array" msgstr "无法解析 reloptions 数组" -#: common.c:160 +#: common.c:159 #, c-format msgid "cannot escape without active connection" msgstr "没有数据库连接时无法转义" -#: common.c:201 +#: common.c:200 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "shell命令参数包含换行符或回车符: \"%s\"" -#: common.c:395 +#: common.c:304 #, c-format msgid "connection to server was lost" msgstr "与数据库的连接已经断开" -#: common.c:399 +#: common.c:308 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "与服务器的连接已断开,正在试图重置: " -#: common.c:404 +#: common.c:313 #, c-format msgid "Failed.\n" msgstr "失败。\n" -#: common.c:411 +#: common.c:330 #, c-format msgid "Succeeded.\n" msgstr "完成。\n" -#: common.c:511 common.c:1063 common.c:1280 +#: common.c:382 common.c:949 common.c:1166 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "意外的 PQresultStatus: %d" -#: common.c:620 +#: common.c:491 #, c-format msgid "Time: %.3f ms\n" msgstr "时间:%.3f ms\n" -#: common.c:635 +#: common.c:506 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "时间:%.3f ms (%02d:%06.3f)\n" -#: common.c:644 +#: common.c:515 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "时间: %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:651 +#: common.c:522 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "时间:%.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:675 common.c:733 common.c:1316 +#: common.c:546 common.c:604 common.c:1202 #, c-format msgid "You are currently not connected to a database." msgstr "你目前没有连接到数据库." -#: common.c:788 +#: common.c:659 #, c-format msgid "\\watch cannot be used with COPY" msgstr "\\watch不能用于COPY命令中" -#: common.c:793 +#: common.c:664 #, c-format msgid "unexpected result status for \\watch" msgstr "\\Watch出现意外的结果状态" -#: common.c:823 +#: common.c:694 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "从PID为%3$d的服务器进程接收到带有字节流量\"%2$s\"的异步通知消息\"%1$s\".\n" -#: common.c:826 +#: common.c:697 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "收到来自服务器 \"%s\" 进程 PID %d 非同步通知。\n" -#: common.c:889 +#: common.c:730 common.c:747 +msgid "could not print result table: %m" +msgstr "无法打印结果表: %m" + +#: common.c:768 #, c-format msgid "no rows returned for \\gset" msgstr "\\gset没有记录行返回" -#: common.c:894 +#: common.c:773 #, c-format msgid "more than one row returned for \\gset" msgstr "\\gset返回超过1个记录行" -#: common.c:1325 +#: common.c:791 +msgid "attempt to \\gset into specially treated variable \"%s\" ignored" +msgstr "试图\\gset为经过特殊处理的变量\"%s\"已忽略" + +#: common.c:1211 #, c-format msgid "" "***(Single step mode: verify command)*******************************************\n" @@ -822,92 +851,92 @@ msgstr "" "%s\n" "***(按 Enter 键继续或键入 x 来取消)********************\n" -#: common.c:1380 +#: common.c:1266 #, c-format msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." msgstr "服务器(版本 %s)不支持保存点(Savepoint)ON_ERROR_ROLLBACK." -#: common.c:1443 +#: common.c:1329 #, c-format msgid "STATEMENT: %s" msgstr "语句: %s" -#: common.c:1486 +#: common.c:1373 #, c-format msgid "unexpected transaction status (%d)" msgstr "意外的事务状态值 (%d)" -#: common.c:1623 describe.c:2002 +#: common.c:1514 describe.c:2179 msgid "Column" msgstr "栏位" -#: common.c:1624 describe.c:179 describe.c:394 describe.c:412 describe.c:457 -#: describe.c:474 describe.c:963 describe.c:1127 describe.c:1712 -#: describe.c:1736 describe.c:2003 describe.c:3673 describe.c:3858 -#: describe.c:4091 describe.c:5297 +#: common.c:1515 describe.c:178 describe.c:396 describe.c:414 describe.c:459 +#: describe.c:476 describe.c:1128 describe.c:1292 describe.c:1878 +#: describe.c:1902 describe.c:2180 describe.c:4048 describe.c:4271 +#: describe.c:4496 describe.c:5794 msgid "Type" msgstr "类型" -#: common.c:1673 +#: common.c:1564 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "命令没有结果,或者结果没有列.\n" -#: copy.c:100 +#: copy.c:98 #, c-format msgid "\\copy: arguments required" msgstr "\\copy:需要参数" -#: copy.c:255 +#: copy.c:253 #, c-format msgid "\\copy: parse error at \"%s\"" msgstr "\\copy:在 \"%s\" 发生解读错误" -#: copy.c:257 +#: copy.c:255 #, c-format msgid "\\copy: parse error at end of line" msgstr "\\copy:在行尾发生解读错误" -#: copy.c:330 +#: copy.c:328 #, c-format msgid "could not execute command \"%s\": %m" msgstr "无法执行命令 \"%s\": %m" -#: copy.c:346 +#: copy.c:344 #, c-format msgid "could not stat file \"%s\": %m" msgstr "无法取文件 \"%s\" 的状态: %m" -#: copy.c:350 +#: copy.c:348 #, c-format msgid "%s: cannot copy from/to a directory" msgstr "%s:无法从目录复制或复制到目录" -#: copy.c:387 +#: copy.c:385 #, c-format msgid "could not close pipe to external command: %m" msgstr "无法为外部命令: %m关闭管道" -#: copy.c:392 +#: copy.c:390 #, c-format msgid "%s: %s" msgstr "%s: %s" -#: copy.c:455 copy.c:465 +#: copy.c:453 copy.c:463 #, c-format msgid "could not write COPY data: %m" msgstr "无法写入 COPY 数据:%m" -#: copy.c:471 +#: copy.c:469 #, c-format msgid "COPY data transfer failed: %s" msgstr "COPY 数据转换失败:%s" -#: copy.c:532 +#: copy.c:530 msgid "canceled by user" msgstr "依用户取消" -#: copy.c:543 +#: copy.c:541 msgid "" "Enter data to be copied followed by a newline.\n" "End with a backslash and a period on a line by itself, or an EOF signal." @@ -923,215 +952,216 @@ msgstr "因读取失败已被中止" msgid "trying to exit copy mode" msgstr "正在尝试退出" -#: crosstabview.c:124 +#: crosstabview.c:123 #, c-format msgid "\\crosstabview: statement did not return a result set" msgstr "\\crosstabview:语句未返回结果集" -#: crosstabview.c:130 +#: crosstabview.c:129 #, c-format msgid "\\crosstabview: query must return at least three columns" msgstr "\\crosstabview:查询必须返回至少三列" -#: crosstabview.c:157 +#: crosstabview.c:156 #, c-format msgid "\\crosstabview: vertical and horizontal headers must be different columns" msgstr "\\crosstabview: 垂直和水平表头必须是不同的列" -#: crosstabview.c:173 +#: crosstabview.c:172 #, c-format msgid "\\crosstabview: data column must be specified when query returns more than three columns" msgstr "\\crosstabview: 当查询返回三列以上时,必须指定数据列" -#: crosstabview.c:229 +#: crosstabview.c:228 #, c-format msgid "\\crosstabview: maximum number of columns (%d) exceeded" msgstr "\\crosstabview: 超过最大列数(%d)" -#: crosstabview.c:398 +#: crosstabview.c:397 #, c-format msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"" msgstr "\\crosstabview: 查询结果包含行\"%s\"、列\"%s\"的多个数据值" -#: crosstabview.c:646 +#: crosstabview.c:645 #, c-format msgid "\\crosstabview: column number %d is out of range 1..%d" msgstr "\\crosstabview: 列号码 %d 超出了范围 1..%d" -#: crosstabview.c:671 +#: crosstabview.c:670 #, c-format msgid "\\crosstabview: ambiguous column name: \"%s\"" msgstr "\\crosstabview: 不明确的列名: \"%s\"" -#: crosstabview.c:679 +#: crosstabview.c:678 #, c-format msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: 找不到列名: \"%s\"" -#: describe.c:77 describe.c:374 describe.c:679 describe.c:811 describe.c:955 -#: describe.c:1116 describe.c:1188 describe.c:3662 describe.c:3845 -#: describe.c:4089 describe.c:4180 describe.c:4447 describe.c:4607 -#: describe.c:4848 describe.c:4923 describe.c:4934 describe.c:4996 -#: describe.c:5421 describe.c:5504 +#: describe.c:76 describe.c:376 describe.c:728 describe.c:924 describe.c:1120 +#: describe.c:1281 describe.c:1353 describe.c:4036 describe.c:4258 +#: describe.c:4494 describe.c:4585 describe.c:4731 describe.c:4944 +#: describe.c:5104 describe.c:5345 describe.c:5420 describe.c:5431 +#: describe.c:5493 describe.c:5918 describe.c:6001 msgid "Schema" msgstr "架构模式" -#: describe.c:78 describe.c:176 describe.c:244 describe.c:252 describe.c:375 -#: describe.c:680 describe.c:812 describe.c:873 describe.c:956 describe.c:1189 -#: describe.c:3663 describe.c:3846 describe.c:4012 describe.c:4090 -#: describe.c:4181 describe.c:4260 describe.c:4448 describe.c:4532 -#: describe.c:4608 describe.c:4849 describe.c:4924 describe.c:4935 -#: describe.c:4997 describe.c:5194 describe.c:5278 describe.c:5502 -#: describe.c:5674 describe.c:5899 +#: describe.c:77 describe.c:175 describe.c:243 describe.c:251 describe.c:377 +#: describe.c:729 describe.c:925 describe.c:1038 describe.c:1121 +#: describe.c:1354 describe.c:4037 describe.c:4259 describe.c:4417 +#: describe.c:4495 describe.c:4586 describe.c:4665 describe.c:4732 +#: describe.c:4945 describe.c:5029 describe.c:5105 describe.c:5346 +#: describe.c:5421 describe.c:5432 describe.c:5494 describe.c:5691 +#: describe.c:5775 describe.c:5999 describe.c:6171 describe.c:6411 msgid "Name" msgstr "名称" -#: describe.c:79 describe.c:387 describe.c:405 describe.c:451 describe.c:468 +#: describe.c:78 describe.c:389 describe.c:407 describe.c:453 describe.c:470 msgid "Result data type" msgstr "结果数据类型" -#: describe.c:87 describe.c:100 describe.c:104 describe.c:388 describe.c:406 -#: describe.c:452 describe.c:469 +#: describe.c:86 describe.c:99 describe.c:103 describe.c:390 describe.c:408 +#: describe.c:454 describe.c:471 msgid "Argument data types" msgstr "参数数据类型" -#: describe.c:112 describe.c:119 describe.c:187 describe.c:275 describe.c:514 -#: describe.c:728 describe.c:827 describe.c:898 describe.c:1191 -#: describe.c:2021 describe.c:3451 describe.c:3698 describe.c:3892 -#: describe.c:4043 describe.c:4117 describe.c:4190 describe.c:4273 -#: describe.c:4356 describe.c:4475 describe.c:4541 describe.c:4609 -#: describe.c:4750 describe.c:4792 describe.c:4865 describe.c:4927 -#: describe.c:4936 describe.c:4998 describe.c:5220 describe.c:5300 -#: describe.c:5435 describe.c:5505 large_obj.c:290 large_obj.c:300 +#: describe.c:111 describe.c:118 describe.c:186 describe.c:274 describe.c:523 +#: describe.c:777 describe.c:940 describe.c:1063 describe.c:1356 +#: describe.c:2200 describe.c:3823 describe.c:4108 describe.c:4305 +#: describe.c:4448 describe.c:4522 describe.c:4595 describe.c:4678 +#: describe.c:4853 describe.c:4972 describe.c:5038 describe.c:5106 +#: describe.c:5247 describe.c:5289 describe.c:5362 describe.c:5424 +#: describe.c:5433 describe.c:5495 describe.c:5717 describe.c:5797 +#: describe.c:5932 describe.c:6002 large_obj.c:290 large_obj.c:300 msgid "Description" msgstr "描述" -#: describe.c:137 +#: describe.c:136 msgid "List of aggregate functions" msgstr "聚集函数列表" -#: describe.c:162 +#: describe.c:161 #, c-format msgid "The server (version %s) does not support access methods." msgstr "服务器(版本%s) 不支持访问方法." -#: describe.c:177 +#: describe.c:176 msgid "Index" msgstr "索引" -#: describe.c:178 describe.c:3679 describe.c:3871 describe.c:5422 +#: describe.c:177 describe.c:4056 describe.c:4284 describe.c:5919 msgid "Table" msgstr "数据表" -#: describe.c:186 describe.c:5199 +#: describe.c:185 describe.c:5696 msgid "Handler" msgstr "处理函数" -#: describe.c:205 +#: describe.c:204 msgid "List of access methods" msgstr "访问方法列表" -#: describe.c:231 +#: describe.c:230 #, c-format msgid "The server (version %s) does not support tablespaces." msgstr "服务器(版本%s) 不支持使用表空间." -#: describe.c:245 describe.c:253 describe.c:502 describe.c:718 describe.c:874 -#: describe.c:1115 describe.c:3674 describe.c:3847 describe.c:4016 -#: describe.c:4262 describe.c:4533 describe.c:5195 describe.c:5279 -#: describe.c:5675 describe.c:5801 describe.c:5900 large_obj.c:289 +#: describe.c:244 describe.c:252 describe.c:504 describe.c:767 describe.c:1039 +#: describe.c:1280 describe.c:4049 describe.c:4260 describe.c:4421 +#: describe.c:4667 describe.c:5030 describe.c:5692 describe.c:5776 +#: describe.c:6172 describe.c:6309 describe.c:6412 describe.c:6535 +#: describe.c:6613 large_obj.c:289 msgid "Owner" msgstr "拥有者" -#: describe.c:246 describe.c:254 +#: describe.c:245 describe.c:253 msgid "Location" msgstr "所在地" -#: describe.c:265 describe.c:3269 +#: describe.c:264 describe.c:3639 msgid "Options" msgstr "选项" -#: describe.c:270 describe.c:691 describe.c:890 describe.c:3690 -#: describe.c:3694 +#: describe.c:269 describe.c:740 describe.c:1055 describe.c:4100 +#: describe.c:4104 msgid "Size" msgstr "大小" -#: describe.c:292 +#: describe.c:291 msgid "List of tablespaces" msgstr "表空间列表" -#: describe.c:334 +#: describe.c:336 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df 只能将 [anptwS+]作为选项" -#: describe.c:342 describe.c:353 +#: describe.c:344 describe.c:355 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df 不能有带着服务器版本%2$s 的选项\"%1$c\"" #. translator: "agg" is short for "aggregate" -#: describe.c:390 describe.c:408 describe.c:454 describe.c:471 +#: describe.c:392 describe.c:410 describe.c:456 describe.c:473 msgid "agg" msgstr "agg" -#: describe.c:391 describe.c:409 +#: describe.c:393 describe.c:411 msgid "window" msgstr "窗口" -#: describe.c:392 +#: describe.c:394 msgid "proc" msgstr "proc" -#: describe.c:393 describe.c:411 describe.c:456 describe.c:473 +#: describe.c:395 describe.c:413 describe.c:458 describe.c:475 msgid "func" msgstr "函数" -#: describe.c:410 describe.c:455 describe.c:472 describe.c:1325 +#: describe.c:412 describe.c:457 describe.c:474 describe.c:1490 msgid "trigger" msgstr "触发器" -#: describe.c:484 +#: describe.c:486 msgid "immutable" msgstr "不可更改" -#: describe.c:485 +#: describe.c:487 msgid "stable" msgstr "稳定" -#: describe.c:486 +#: describe.c:488 msgid "volatile" msgstr "不稳定性" -#: describe.c:487 +#: describe.c:489 msgid "Volatility" msgstr "挥发性" -#: describe.c:495 +#: describe.c:497 msgid "restricted" msgstr "受限制的" -#: describe.c:496 +#: describe.c:498 msgid "safe" msgstr "安全的" -#: describe.c:497 +#: describe.c:499 msgid "unsafe" msgstr "不安全的" -#: describe.c:498 +#: describe.c:500 msgid "Parallel" msgstr "平行" -#: describe.c:503 +#: describe.c:505 msgid "definer" msgstr "定义者" -#: describe.c:504 +#: describe.c:506 msgid "invoker" msgstr "调用者" -#: describe.c:505 +#: describe.c:507 msgid "Security" msgstr "安全" @@ -1139,920 +1169,971 @@ msgstr "安全" msgid "Language" msgstr "程序语言" -#: describe.c:513 +#: describe.c:516 describe.c:520 msgid "Source code" msgstr "原始程式" -#: describe.c:642 +#: describe.c:691 msgid "List of functions" msgstr "函数列表" -#: describe.c:690 +#: describe.c:739 msgid "Internal name" msgstr "内部名称" -#: describe.c:712 +#: describe.c:761 msgid "Elements" msgstr "成员" -#: describe.c:769 +#: describe.c:822 msgid "List of data types" msgstr "数据类型列表" -#: describe.c:813 +#: describe.c:926 msgid "Left arg type" msgstr "左参数类型" -#: describe.c:814 +#: describe.c:927 msgid "Right arg type" msgstr "右参数类型" -#: describe.c:815 +#: describe.c:928 msgid "Result type" msgstr "结果类型" -#: describe.c:820 describe.c:4268 describe.c:4333 describe.c:4339 -#: describe.c:4749 +#: describe.c:933 describe.c:4673 describe.c:4830 describe.c:4836 +#: describe.c:5246 describe.c:6784 describe.c:6788 msgid "Function" msgstr "函数" -#: describe.c:845 +#: describe.c:1010 msgid "List of operators" msgstr "运算子列表" -#: describe.c:875 +#: describe.c:1040 msgid "Encoding" msgstr "字元编码" -#: describe.c:880 describe.c:4449 +#: describe.c:1045 describe.c:4946 msgid "Collate" msgstr "校对规则" -#: describe.c:881 describe.c:4450 +#: describe.c:1046 describe.c:4947 msgid "Ctype" msgstr "Ctype" -#: describe.c:894 +#: describe.c:1059 msgid "Tablespace" msgstr "表空间" -#: describe.c:916 +#: describe.c:1081 msgid "List of databases" msgstr "数据库列表" -#: describe.c:957 describe.c:1118 describe.c:3664 +#: describe.c:1122 describe.c:1283 describe.c:4038 msgid "table" msgstr "数据表" -#: describe.c:958 describe.c:3665 +#: describe.c:1123 describe.c:4039 msgid "view" msgstr "视图" -#: describe.c:959 describe.c:3666 +#: describe.c:1124 describe.c:4040 msgid "materialized view" msgstr "物化视图" -#: describe.c:960 describe.c:1120 describe.c:3668 +#: describe.c:1125 describe.c:1285 describe.c:4042 msgid "sequence" msgstr "序列数" -#: describe.c:961 describe.c:3670 +#: describe.c:1126 describe.c:4045 msgid "foreign table" msgstr "所引用的外表" -#: describe.c:962 describe.c:3671 describe.c:3856 +#: describe.c:1127 describe.c:4046 describe.c:4269 msgid "partitioned table" msgstr "分区表" -#: describe.c:974 +#: describe.c:1139 msgid "Column privileges" msgstr "列特权" -#: describe.c:1005 describe.c:1039 +#: describe.c:1170 describe.c:1204 msgid "Policies" msgstr "策略" -#: describe.c:1071 describe.c:5956 describe.c:5960 +#: describe.c:1236 describe.c:6476 describe.c:6480 msgid "Access privileges" msgstr "存取权限" -#: describe.c:1102 +#: describe.c:1267 #, c-format msgid "The server (version %s) does not support altering default privileges." msgstr "服务器(版本%s)不支持修改默认权限." -#: describe.c:1122 +#: describe.c:1287 msgid "function" msgstr "函数" -#: describe.c:1124 +#: describe.c:1289 msgid "type" msgstr "类型Ctype" -#: describe.c:1126 +#: describe.c:1291 msgid "schema" msgstr "架构模式" -#: describe.c:1150 +#: describe.c:1315 msgid "Default access privileges" msgstr "默认的访问权限" -#: describe.c:1190 +#: describe.c:1355 msgid "Object" msgstr "对象" -#: describe.c:1204 +#: describe.c:1369 msgid "table constraint" msgstr "表约束" -#: describe.c:1226 +#: describe.c:1391 msgid "domain constraint" msgstr "域约束" -#: describe.c:1254 +#: describe.c:1419 msgid "operator class" msgstr "操作符类" -#: describe.c:1283 +#: describe.c:1448 msgid "operator family" msgstr "操作符家族" -#: describe.c:1305 +#: describe.c:1470 msgid "rule" msgstr "规则" -#: describe.c:1347 +#: describe.c:1512 msgid "Object descriptions" msgstr "对象描述" -#: describe.c:1403 describe.c:3762 +#: describe.c:1568 describe.c:4175 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "没有找到任何名称为 \"%s\" 的关联." -#: describe.c:1406 describe.c:3765 +#: describe.c:1571 describe.c:4178 #, c-format msgid "Did not find any relations." msgstr "没有找到任何关系." -#: describe.c:1661 +#: describe.c:1827 #, c-format msgid "Did not find any relation with OID %s." msgstr "没有找到任何OID为 %s 的关联." -#: describe.c:1713 describe.c:1737 +#: describe.c:1879 describe.c:1903 msgid "Start" msgstr "起始值" -#: describe.c:1714 describe.c:1738 +#: describe.c:1880 describe.c:1904 msgid "Minimum" msgstr "最小值" -#: describe.c:1715 describe.c:1739 +#: describe.c:1881 describe.c:1905 msgid "Maximum" msgstr "最大值" -#: describe.c:1716 describe.c:1740 +#: describe.c:1882 describe.c:1906 msgid "Increment" msgstr "增量" -#: describe.c:1717 describe.c:1741 describe.c:1872 describe.c:4184 -#: describe.c:4350 describe.c:4464 describe.c:4469 +#: describe.c:1883 describe.c:1907 describe.c:2038 describe.c:4589 +#: describe.c:4847 describe.c:4961 describe.c:4966 describe.c:6523 msgid "yes" msgstr "是" -#: describe.c:1718 describe.c:1742 describe.c:1873 describe.c:4184 -#: describe.c:4347 describe.c:4464 +#: describe.c:1884 describe.c:1908 describe.c:2039 describe.c:4589 +#: describe.c:4844 describe.c:4961 describe.c:6524 msgid "no" msgstr "否" -#: describe.c:1719 describe.c:1743 +#: describe.c:1885 describe.c:1909 msgid "Cycles?" msgstr "循环?" -#: describe.c:1720 describe.c:1744 +#: describe.c:1886 describe.c:1910 msgid "Cache" msgstr "缓存" -#: describe.c:1787 +#: describe.c:1953 #, c-format msgid "Owned by: %s" msgstr "属于: %s" -#: describe.c:1791 +#: describe.c:1957 #, c-format msgid "Sequence for identity column: %s" msgstr "标识列的序列: %s" -#: describe.c:1798 +#: describe.c:1964 #, c-format msgid "Sequence \"%s.%s\"" msgstr "序列数 \"%s.%s\"" -#: describe.c:1934 +#: describe.c:2111 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "不记录日志的表 \"%s.%s\"" -#: describe.c:1937 +#: describe.c:2114 #, c-format msgid "Table \"%s.%s\"" msgstr "数据表 \"%s.%s\"" -#: describe.c:1941 +#: describe.c:2118 #, c-format msgid "View \"%s.%s\"" msgstr "视图 \"%s.%s\"" -#: describe.c:1946 +#: describe.c:2123 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "不记录日志的物化视图 \"%s.%s\"" -#: describe.c:1949 +#: describe.c:2126 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "物化视图 \"%s.%s\"" -#: describe.c:1954 +#: describe.c:2131 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "不记录日志的索引 \"%s.%s\"" -#: describe.c:1957 +#: describe.c:2134 #, c-format msgid "Index \"%s.%s\"" msgstr "索引 \"%s.%s\"" -#: describe.c:1962 +#: describe.c:2139 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "不记录日志的分区索引 \"%s.%s\"" -#: describe.c:1965 +#: describe.c:2142 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "分区索引 \"%s.%s\"" -#: describe.c:1970 +#: describe.c:2147 #, c-format msgid "Special relation \"%s.%s\"" msgstr "特殊关联 \"%s.%s\"" -#: describe.c:1974 +#: describe.c:2151 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST 数据表 \"%s.%s\"" -#: describe.c:1978 +#: describe.c:2155 #, c-format msgid "Composite type \"%s.%s\"" msgstr "合成类型 \"%s.%s\"" -#: describe.c:1982 +#: describe.c:2159 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "引用的外部表 \"%s.%s\"" -#: describe.c:1987 +#: describe.c:2164 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "不记录日志的分区表 \"%s.%s\"" -#: describe.c:1990 +#: describe.c:2167 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "分区表 \"%s.%s\"" -#: describe.c:2006 describe.c:4097 +#: describe.c:2183 describe.c:4502 msgid "Collation" msgstr "校对规则" -#: describe.c:2007 describe.c:4104 +#: describe.c:2184 describe.c:4509 msgid "Nullable" msgstr "可空的" -#: describe.c:2008 describe.c:4105 +#: describe.c:2185 describe.c:4510 msgid "Default" msgstr "预设" -#: describe.c:2011 +#: describe.c:2188 msgid "Key?" msgstr "键值?" -#: describe.c:2013 +#: describe.c:2190 describe.c:4739 describe.c:4750 msgid "Definition" msgstr "定义" -#: describe.c:2015 describe.c:5215 describe.c:5299 describe.c:5370 -#: describe.c:5434 +#: describe.c:2192 describe.c:5712 describe.c:5796 describe.c:5867 +#: describe.c:5931 msgid "FDW options" msgstr "FDW选项" -#: describe.c:2017 +#: describe.c:2194 msgid "Storage" msgstr "存储" -#: describe.c:2019 +#: describe.c:2196 +msgid "Compression" +msgstr "压缩" + +#: describe.c:2198 msgid "Stats target" msgstr "统计目标" -#: describe.c:2137 -#, c-format -msgid "Partition of: %s %s" -msgstr "分区: %s %s" +#: describe.c:2334 +msgid "Partition of: %s %s%s" +msgstr "分区: %s %s%s" -#: describe.c:2145 +#: describe.c:2347 msgid "No partition constraint" msgstr "无分区约束" -#: describe.c:2147 +#: describe.c:2349 #, c-format msgid "Partition constraint: %s" msgstr "分区约束: %s" -#: describe.c:2170 +#: describe.c:2373 #, c-format msgid "Partition key: %s" msgstr "分区键值: %s" -#: describe.c:2239 +#: describe.c:2399 +msgid "Owning table: \"%s.%s\"" +msgstr "拥有表: \"%s.%s\"" + +#: describe.c:2470 msgid "primary key, " msgstr "主键(PK)," -#: describe.c:2241 +#: describe.c:2472 msgid "unique, " msgstr "唯一的," -#: describe.c:2247 +#: describe.c:2478 #, c-format msgid "for table \"%s.%s\"" msgstr "给数据表 \"%s.%s\"" -#: describe.c:2251 +#: describe.c:2482 #, c-format msgid ", predicate (%s)" msgstr ", 叙述 (%s)" -#: describe.c:2254 +#: describe.c:2485 msgid ", clustered" msgstr ", 已丛集" -#: describe.c:2257 +#: describe.c:2488 msgid ", invalid" msgstr ", 无效的" -#: describe.c:2260 +#: describe.c:2491 msgid ", deferrable" msgstr ",可延迟" -#: describe.c:2263 +#: describe.c:2494 msgid ", initially deferred" msgstr ",开始被延迟" -#: describe.c:2266 +#: describe.c:2497 msgid ", replica identity" msgstr ",复制标识" -#: describe.c:2325 +#: describe.c:2564 msgid "Indexes:" msgstr "索引:" -#: describe.c:2409 +#: describe.c:2648 msgid "Check constraints:" msgstr "检查约束限制" -#: describe.c:2477 +#: describe.c:2716 msgid "Foreign-key constraints:" msgstr "外部键(FK)限制:" -#: describe.c:2540 +#: describe.c:2779 msgid "Referenced by:" msgstr "由引用:" -#: describe.c:2590 +#: describe.c:2829 msgid "Policies:" msgstr "策略:" -#: describe.c:2593 +#: describe.c:2832 msgid "Policies (forced row security enabled):" msgstr "策略(强制行安全性启用):" -#: describe.c:2596 +#: describe.c:2835 msgid "Policies (row security enabled): (none)" msgstr "策略(行安全性启用):(无)" -#: describe.c:2599 +#: describe.c:2838 msgid "Policies (forced row security enabled): (none)" msgstr "策略(强制行安全性启用):(无)" -#: describe.c:2602 +#: describe.c:2841 msgid "Policies (row security disabled):" msgstr "策略(行安全性禁用):" -#: describe.c:2665 +#: describe.c:2902 describe.c:3006 msgid "Statistics objects:" msgstr "统计信息对象:" -#: describe.c:2774 describe.c:2878 +#: describe.c:3120 describe.c:3224 msgid "Rules:" msgstr "规则:" -#: describe.c:2777 +#: describe.c:3123 msgid "Disabled rules:" msgstr "已停用规则:" -#: describe.c:2780 +#: describe.c:3126 msgid "Rules firing always:" msgstr "永远触发规则" -#: describe.c:2783 +#: describe.c:3129 msgid "Rules firing on replica only:" msgstr "只有在复制时触发规则:" -#: describe.c:2823 +#: describe.c:3169 msgid "Publications:" msgstr "发布:" -#: describe.c:2861 +#: describe.c:3207 msgid "View definition:" msgstr "视图定义:" -#: describe.c:3000 +#: describe.c:3354 msgid "Triggers:" msgstr "触发器:" -#: describe.c:3004 +#: describe.c:3358 msgid "Disabled user triggers:" msgstr "禁用用户触发器:" -#: describe.c:3006 +#: describe.c:3360 msgid "Disabled triggers:" msgstr "停用触发器:" -#: describe.c:3009 +#: describe.c:3363 msgid "Disabled internal triggers:" msgstr "禁用内部触发器:" -#: describe.c:3012 +#: describe.c:3366 msgid "Triggers firing always:" msgstr "永远激活触发器" -#: describe.c:3015 +#: describe.c:3369 msgid "Triggers firing on replica only:" msgstr "只有在复制时激活触发器" -#: describe.c:3074 +#: describe.c:3441 #, c-format msgid "Server: %s" msgstr "服务器 %s" -#: describe.c:3082 +#: describe.c:3449 #, c-format msgid "FDW options: (%s)" msgstr "FDW选项: (%s)" -#: describe.c:3101 +#: describe.c:3470 msgid "Inherits" msgstr "继承" -#: describe.c:3160 +#: describe.c:3543 #, c-format msgid "Number of partitions: %d" msgstr "分区数: %d" -#: describe.c:3169 -#, c-format -msgid "Number of child tables: %d (Use \\d+ to list them.)" -msgstr "子表的数量:%d(可以使用 \\d+ 来列出它们)" - -#: describe.c:3171 +#: describe.c:3552 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "分区的数量:%d(可以使用 \\d+ 来列出它们)" -#: describe.c:3179 +#: describe.c:3554 +#, c-format +msgid "Number of child tables: %d (Use \\d+ to list them.)" +msgstr "子表的数量:%d(可以使用 \\d+ 来列出它们)" + +#: describe.c:3561 msgid "Child tables" msgstr "子表" -#: describe.c:3179 +#: describe.c:3561 msgid "Partitions" msgstr "分区" -#: describe.c:3222 +#: describe.c:3592 #, c-format msgid "Typed table of type: %s" msgstr "类型的已确定类型表(typed table):%s" -#: describe.c:3238 +#: describe.c:3608 msgid "Replica Identity" msgstr "复制标识" -#: describe.c:3251 +#: describe.c:3621 msgid "Has OIDs: yes" msgstr "有 OIDs:yes" -#: describe.c:3260 +#: describe.c:3630 #, c-format msgid "Access method: %s" msgstr "访问方法 %s" -#: describe.c:3339 +#: describe.c:3710 #, c-format msgid "Tablespace: \"%s\"" msgstr "表空间:\"%s\"" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3351 +#: describe.c:3722 #, c-format msgid ", tablespace \"%s\"" msgstr ", 表空间 \"%s\"" -#: describe.c:3444 +#: describe.c:3815 msgid "List of roles" msgstr "角色列表" -#: describe.c:3446 +#: describe.c:3817 msgid "Role name" msgstr "角色名称" -#: describe.c:3447 +#: describe.c:3818 msgid "Attributes" msgstr "属性" -#: describe.c:3448 +#: describe.c:3820 msgid "Member of" msgstr "成员属于" -#: describe.c:3459 +#: describe.c:3831 msgid "Superuser" msgstr "超级用户" -#: describe.c:3462 +#: describe.c:3834 msgid "No inheritance" msgstr "没有继承" -#: describe.c:3465 +#: describe.c:3837 msgid "Create role" msgstr "建立角色" -#: describe.c:3468 +#: describe.c:3840 msgid "Create DB" msgstr "建立 DB" -#: describe.c:3471 +#: describe.c:3843 msgid "Cannot login" msgstr "无法登录" -#: describe.c:3475 +#: describe.c:3847 msgid "Replication" msgstr "复制" -#: describe.c:3479 +#: describe.c:3851 msgid "Bypass RLS" msgstr "绕过RLS" -#: describe.c:3488 +#: describe.c:3860 msgid "No connections" msgstr "没有连接" -#: describe.c:3490 +#: describe.c:3862 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d个连接" -#: describe.c:3500 +#: describe.c:3872 msgid "Password valid until " msgstr "密码有效直至" -#: describe.c:3550 +#: describe.c:3922 #, c-format msgid "The server (version %s) does not support per-database role settings." msgstr "服务器(版本%s) 每个数据库角色设置." -#: describe.c:3563 +#: describe.c:3935 msgid "Role" msgstr "角色" -#: describe.c:3564 +#: describe.c:3936 msgid "Database" msgstr "数据库" -#: describe.c:3565 +#: describe.c:3937 msgid "Settings" msgstr "设置" -#: describe.c:3586 +#: describe.c:3958 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "找不到角色\"%s\"和数据库\"%s\"的任何设置." -#: describe.c:3589 +#: describe.c:3961 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "找不到角色\"%s\"的任何设置." -#: describe.c:3592 +#: describe.c:3964 #, c-format msgid "Did not find any settings." msgstr "找不到任何设置." -#: describe.c:3597 +#: describe.c:3969 msgid "List of settings" msgstr "设置的列表" -#: describe.c:3667 +#: describe.c:4041 msgid "index" msgstr "索引" -#: describe.c:3669 +#: describe.c:4043 msgid "special" msgstr "特殊" -#: describe.c:3672 describe.c:3857 +#: describe.c:4044 +msgid "TOAST table" +msgstr "TOAST 表" + +#: describe.c:4047 describe.c:4270 msgid "partitioned index" msgstr "分区索引" -#: describe.c:3770 +#: describe.c:4071 +msgid "permanent" +msgstr "永久的" + +#: describe.c:4072 +msgid "temporary" +msgstr "临时的" + +#: describe.c:4073 +msgid "unlogged" +msgstr "未记录" + +#: describe.c:4074 +msgid "Persistence" +msgstr "持续的" + +#: describe.c:4091 +msgid "Access method" +msgstr "访问方法" + +#: describe.c:4183 msgid "List of relations" msgstr "关联列表" -#: describe.c:3818 +#: describe.c:4231 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "服务器(版本%s)不支持声明性表分区." -#: describe.c:3829 +#: describe.c:4242 msgid "List of partitioned indexes" msgstr "分区索引列表" -#: describe.c:3831 +#: describe.c:4244 msgid "List of partitioned tables" msgstr "分区表列表" -#: describe.c:3835 +#: describe.c:4248 msgid "List of partitioned relations" msgstr "分区关系列表" -#: describe.c:3866 +#: describe.c:4279 msgid "Parent name" msgstr "父名" -#: describe.c:3879 +#: describe.c:4292 msgid "Leaf partition size" msgstr "叶子分区大小" -#: describe.c:3882 describe.c:3888 +#: describe.c:4295 describe.c:4301 msgid "Total size" msgstr "总大小" -#: describe.c:4020 +#: describe.c:4425 msgid "Trusted" msgstr "信任" -#: describe.c:4028 +#: describe.c:4433 msgid "Internal language" msgstr "内部语言" -#: describe.c:4029 +#: describe.c:4434 msgid "Call handler" msgstr "调用函数" -#: describe.c:4030 describe.c:5202 +#: describe.c:4435 describe.c:5699 msgid "Validator" msgstr "验证" -#: describe.c:4033 +#: describe.c:4438 msgid "Inline handler" msgstr "内联函数" -#: describe.c:4061 +#: describe.c:4466 msgid "List of languages" msgstr "语言列表" -#: describe.c:4106 +#: describe.c:4511 msgid "Check" msgstr "检查" -#: describe.c:4148 +#: describe.c:4553 msgid "List of domains" msgstr "共同值域列表" -#: describe.c:4182 +#: describe.c:4587 msgid "Source" msgstr "来源" -#: describe.c:4183 +#: describe.c:4588 msgid "Destination" msgstr "目的地" -#: describe.c:4185 +#: describe.c:4590 describe.c:6525 msgid "Default?" msgstr "预设?" -#: describe.c:4222 +#: describe.c:4627 msgid "List of conversions" msgstr "字元编码转换列表" -#: describe.c:4261 +#: describe.c:4666 msgid "Event" msgstr "Event" -#: describe.c:4263 +#: describe.c:4668 msgid "enabled" msgstr "启用" -#: describe.c:4264 +#: describe.c:4669 msgid "replica" msgstr "replica" -#: describe.c:4265 +#: describe.c:4670 msgid "always" msgstr "经常" -#: describe.c:4266 +#: describe.c:4671 msgid "disabled" msgstr "禁用" -#: describe.c:4267 describe.c:5901 +#: describe.c:4672 describe.c:6413 msgid "Enabled" msgstr "使能" -#: describe.c:4269 +#: describe.c:4674 msgid "Tags" msgstr "标签" -#: describe.c:4288 +#: describe.c:4693 msgid "List of event triggers" msgstr "事件触发器列表" -#: describe.c:4317 +#: describe.c:4720 +msgid "The server (version %s) does not support extended statistics." +msgstr "服务器(版本%s) 不支持使用扩展统计." + +#: describe.c:4757 +msgid "Ndistinct" +msgstr "禁止" + +#: describe.c:4758 +msgid "Dependencies" +msgstr "依赖关系" + +#: describe.c:4768 +msgid "MCV" +msgstr "MCV" + +#: describe.c:4787 +msgid "List of extended statistics" +msgstr "扩展统计表" + +#: describe.c:4814 msgid "Source type" msgstr "来源类型" -#: describe.c:4318 +#: describe.c:4815 msgid "Target type" msgstr "目标类型" -#: describe.c:4349 +#: describe.c:4846 msgid "in assignment" msgstr "在指派中" -#: describe.c:4351 +#: describe.c:4848 msgid "Implicit?" msgstr "隐含的?" -#: describe.c:4406 +#: describe.c:4903 msgid "List of casts" msgstr "类型转换列表" -#: describe.c:4434 +#: describe.c:4931 #, c-format msgid "The server (version %s) does not support collations." msgstr "服务器(版本%s)不支持排序校对." -#: describe.c:4455 describe.c:4459 +#: describe.c:4952 describe.c:4956 msgid "Provider" msgstr "提供者" -#: describe.c:4465 describe.c:4470 +#: describe.c:4962 describe.c:4967 msgid "Deterministic?" msgstr "确定性?" -#: describe.c:4505 +#: describe.c:5002 msgid "List of collations" msgstr "校对列表" -#: describe.c:4564 +#: describe.c:5061 msgid "List of schemas" msgstr "架构模式列表" -#: describe.c:4589 describe.c:4836 describe.c:4907 describe.c:4978 +#: describe.c:5086 describe.c:5333 describe.c:5404 describe.c:5475 #, c-format msgid "The server (version %s) does not support full text search." msgstr "服务器(版本%s)不支持使用全文搜索." -#: describe.c:4624 +#: describe.c:5121 msgid "List of text search parsers" msgstr "文本剖析器列表" -#: describe.c:4669 +#: describe.c:5166 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "没有找到任何命名为 \"%s\" 的文本剖析器." -#: describe.c:4672 +#: describe.c:5169 #, c-format msgid "Did not find any text search parsers." msgstr "找不到任何文本搜索解析器." -#: describe.c:4747 +#: describe.c:5244 msgid "Start parse" msgstr "开始剖析" -#: describe.c:4748 +#: describe.c:5245 msgid "Method" msgstr "方法" -#: describe.c:4752 +#: describe.c:5249 msgid "Get next token" msgstr "取得下一个标志符" -#: describe.c:4754 +#: describe.c:5251 msgid "End parse" msgstr "结束剖析" -#: describe.c:4756 +#: describe.c:5253 msgid "Get headline" msgstr "取得首行" -#: describe.c:4758 +#: describe.c:5255 msgid "Get token types" msgstr "取得标志符类型" -#: describe.c:4769 +#: describe.c:5266 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "文本搜索剖析器 \"%s.%s\"" -#: describe.c:4772 +#: describe.c:5269 #, c-format msgid "Text search parser \"%s\"" msgstr "文本搜索剖析器 \"%s\"" -#: describe.c:4791 +#: describe.c:5288 msgid "Token name" msgstr "标志名称" -#: describe.c:4802 +#: describe.c:5299 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "标志符别型给剖析器 \"%s.%s\"" -#: describe.c:4805 +#: describe.c:5302 #, c-format msgid "Token types for parser \"%s\"" msgstr "标志符类型给剖析器 \"%s\"" -#: describe.c:4859 +#: describe.c:5356 msgid "Template" msgstr "模版" -#: describe.c:4860 +#: describe.c:5357 msgid "Init options" msgstr "初始选项" -#: describe.c:4882 +#: describe.c:5379 msgid "List of text search dictionaries" msgstr "文本搜索字典列表" -#: describe.c:4925 +#: describe.c:5422 msgid "Init" msgstr "初始化" -#: describe.c:4926 +#: describe.c:5423 msgid "Lexize" msgstr "词汇" -#: describe.c:4953 +#: describe.c:5450 msgid "List of text search templates" msgstr "文本搜索样式列表" -#: describe.c:5013 +#: describe.c:5510 msgid "List of text search configurations" msgstr "文本搜索组态列表" -#: describe.c:5059 +#: describe.c:5556 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "没有找到任何命名为 \"%s\" 的文本搜索组态." -#: describe.c:5062 +#: describe.c:5559 #, c-format msgid "Did not find any text search configurations." msgstr "未找到任何文本搜索配置." -#: describe.c:5128 +#: describe.c:5625 msgid "Token" msgstr "标志符" -#: describe.c:5129 +#: describe.c:5626 msgid "Dictionaries" msgstr "字典" -#: describe.c:5140 +#: describe.c:5637 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "文本搜索组态 \"%s.%s\"" -#: describe.c:5143 +#: describe.c:5640 #, c-format msgid "Text search configuration \"%s\"" msgstr "文本搜索组态 \"%s\"" -#: describe.c:5147 +#: describe.c:5644 #, c-format msgid "" "\n" @@ -2061,7 +2142,7 @@ msgstr "" "\n" "剖析器:\"%s.%s\"" -#: describe.c:5150 +#: describe.c:5647 #, c-format msgid "" "\n" @@ -2070,200 +2151,288 @@ msgstr "" "\n" "剖析器:\"%s\"" -#: describe.c:5184 +#: describe.c:5681 #, c-format msgid "The server (version %s) does not support foreign-data wrappers." msgstr "服务器(版本%s)不支持使用外部数据封装器." -#: describe.c:5242 +#: describe.c:5739 msgid "List of foreign-data wrappers" msgstr "外部数据封装器列表" -#: describe.c:5267 +#: describe.c:5764 #, c-format msgid "The server (version %s) does not support foreign servers." msgstr "服务器(版本%s)不支持使用外部服务器." -#: describe.c:5280 +#: describe.c:5777 msgid "Foreign-data wrapper" msgstr "外部数据封装器" -#: describe.c:5298 describe.c:5503 +#: describe.c:5795 describe.c:6000 msgid "Version" msgstr "版本" -#: describe.c:5324 +#: describe.c:5821 msgid "List of foreign servers" msgstr "外部服务器列表" -#: describe.c:5349 +#: describe.c:5846 #, c-format msgid "The server (version %s) does not support user mappings." msgstr "服务器(版本%s)不支持使用用户映射." -#: describe.c:5359 describe.c:5423 +#: describe.c:5856 describe.c:5920 msgid "Server" msgstr "服务器" -#: describe.c:5360 +#: describe.c:5857 msgid "User name" msgstr "用户名: " -#: describe.c:5385 +#: describe.c:5882 msgid "List of user mappings" msgstr "列出用户映射" -#: describe.c:5410 +#: describe.c:5907 #, c-format msgid "The server (version %s) does not support foreign tables." msgstr "服务器(版本%s)不支持使用引用表." -#: describe.c:5463 +#: describe.c:5960 msgid "List of foreign tables" msgstr "引用表列表" -#: describe.c:5488 describe.c:5545 +#: describe.c:5985 describe.c:6042 #, c-format msgid "The server (version %s) does not support extensions." msgstr "服务器(版本%s) 不支持使用扩展." -#: describe.c:5520 +#: describe.c:6017 msgid "List of installed extensions" msgstr "已安装扩展列表" -#: describe.c:5573 +#: describe.c:6070 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "没有找到任何名称为 \"%s\" 的扩展." -#: describe.c:5576 +#: describe.c:6073 #, c-format msgid "Did not find any extensions." msgstr "没有找到任何扩展." -#: describe.c:5620 +#: describe.c:6117 msgid "Object description" msgstr "对象描述" -#: describe.c:5630 +#: describe.c:6127 #, c-format msgid "Objects in extension \"%s\"" msgstr "对象用于扩展 \"%s\"" -#: describe.c:5659 describe.c:5730 +#: describe.c:6156 describe.c:6232 #, c-format msgid "The server (version %s) does not support publications." msgstr "服务器(版本%s)不支持发布." -#: describe.c:5676 describe.c:5802 +#: describe.c:6173 describe.c:6310 msgid "All tables" msgstr "所有表" -#: describe.c:5677 describe.c:5803 +#: describe.c:6174 describe.c:6311 msgid "Inserts" msgstr "插入" -#: describe.c:5678 describe.c:5804 +#: describe.c:6175 describe.c:6312 msgid "Updates" msgstr "更新" -#: describe.c:5679 describe.c:5805 +#: describe.c:6176 describe.c:6313 msgid "Deletes" msgstr "删除" -#: describe.c:5683 describe.c:5807 +#: describe.c:6180 describe.c:6315 msgid "Truncates" msgstr "截断" -#: describe.c:5700 +#: describe.c:6184 describe.c:6317 +msgid "Via root" +msgstr "Via root" + +#: describe.c:6201 msgid "List of publications" msgstr "发布列表" -#: describe.c:5768 +#: describe.c:6274 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "没有找到任何名称为 \"%s\" 的发布." -#: describe.c:5771 +#: describe.c:6277 #, c-format msgid "Did not find any publications." msgstr "没有找到任何发布." -#: describe.c:5798 +#: describe.c:6306 #, c-format msgid "Publication %s" msgstr "发布 %s" -#: describe.c:5842 +#: describe.c:6354 msgid "Tables:" msgstr "数据表" -#: describe.c:5886 +#: describe.c:6398 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "服务器(版本%s)不支持订阅." -#: describe.c:5902 +#: describe.c:6414 msgid "Publication" msgstr "发布" -#: describe.c:5909 +#: describe.c:6423 +msgid "Binary" +msgstr "二进制" + +#: describe.c:6424 +msgid "Streaming" +msgstr "流" + +#: describe.c:6429 msgid "Synchronous commit" msgstr "同步提交" -#: describe.c:5910 +#: describe.c:6430 msgid "Conninfo" msgstr "连接信息" -#: describe.c:5932 +#: describe.c:6452 msgid "List of subscriptions" msgstr "订阅列表" -#: help.c:74 +#: describe.c:6519 describe.c:6607 describe.c:6692 describe.c:6775 +msgid "AM" +msgstr "AM" + +#: describe.c:6520 +msgid "Input type" +msgstr "输入类型" + +#: describe.c:6521 +msgid "Storage type" +msgstr "存储类型" + +#: describe.c:6522 +msgid "Operator class" +msgstr "操作符类" + +#: describe.c:6534 describe.c:6608 describe.c:6693 describe.c:6776 +msgid "Operator family" +msgstr "操作符家族" + +#: describe.c:6566 +msgid "List of operator classes" +msgstr "运算子列表" + +#: describe.c:6609 +msgid "Applicable types" +msgstr "适用类型" + +#: describe.c:6647 +msgid "List of operator families" +msgstr "运算子系列列表" + +#: describe.c:6694 +msgid "Operator" +msgstr "运算子" + +#: describe.c:6695 +msgid "Strategy" +msgstr "策略" + +#: describe.c:6696 +msgid "ordering" +msgstr "排序" + +#: describe.c:6697 +msgid "search" +msgstr "搜索" + +#: describe.c:6698 +msgid "Purpose" +msgstr "目的" + +#: describe.c:6703 +msgid "Sort opfamily" +msgstr "排序操作符家族" + +#: describe.c:6734 +msgid "List of operators of operator families" +msgstr "操作符集合的列表" + +#: describe.c:6777 +msgid "Registered left type" +msgstr "注册左型" + +#: describe.c:6778 +msgid "Registered right type" +msgstr "注册右型" + +#: describe.c:6779 +msgid "Number" +msgstr "数" + +#: describe.c:6815 +msgid "List of support functions of operator families" +msgstr "操作符集合的支持功能列表" + +#: help.c:73 #, c-format msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" msgstr "psql是PostgreSQL 的交互式客户端工具。\n" -#: help.c:75 help.c:349 help.c:425 help.c:468 +#: help.c:74 help.c:355 help.c:433 help.c:476 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: help.c:76 +#: help.c:75 #, c-format msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" msgstr " psql [选项]... [数据库名称 [用户名称]]\n" -#: help.c:78 +#: help.c:77 #, c-format msgid "General options:\n" msgstr "通用选项:\n" -#: help.c:83 +#: help.c:82 #, c-format msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=命令 执行单一命令(SQL或内部指令)然后结束\n" -#: help.c:84 +#: help.c:83 #, c-format msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" msgstr " -d, --dbname=DBNAME 指定要连接的数据库 (默认:\"%s\")\n" -#: help.c:85 +#: help.c:84 #, c-format msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=文件名 从文件中执行命令然后退出\n" -#: help.c:86 +#: help.c:85 #, c-format msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list 列出所有可用的数据库,然后退出\n" -#: help.c:87 +#: help.c:86 #, c-format msgid "" " -v, --set=, --variable=NAME=VALUE\n" @@ -2274,17 +2443,17 @@ msgstr "" " 设置psql变量NAME为VALUE\n" " (例如,-v ON_ERROR_STOP=1)\n" -#: help.c:90 +#: help.c:89 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 输出版本信息, 然后退出\n" -#: help.c:91 +#: help.c:90 #, c-format msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc 不读取启动文档(~/.psqlrc)\n" -#: help.c:92 +#: help.c:91 #, c-format msgid "" " -1 (\"one\"), --single-transaction\n" @@ -2293,22 +2462,22 @@ msgstr "" " -1 (\"one\"), --single-transaction\n" " 作为一个单一事务来执行命令文件(如果是非交互型的)\n" -#: help.c:94 +#: help.c:93 #, c-format msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] 显示此帮助,然后退出\n" -#: help.c:95 +#: help.c:94 #, c-format msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands 列出反斜线命令,然后退出\n" -#: help.c:96 +#: help.c:95 #, c-format msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables 列出特殊变量,然后退出\n" -#: help.c:98 +#: help.c:97 #, c-format msgid "" "\n" @@ -2317,57 +2486,57 @@ msgstr "" "\n" "输入和输出选项:\n" -#: help.c:99 +#: help.c:98 #, c-format msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all 显示所有来自于脚本的输入\n" -#: help.c:100 +#: help.c:99 #, c-format msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors 回显失败的命令\n" -#: help.c:101 +#: help.c:100 #, c-format msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries 显示发送给服务器的命令\n" -#: help.c:102 +#: help.c:101 #, c-format msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden 显示内部命令产生的查询\n" -#: help.c:103 +#: help.c:102 #, c-format msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=文件名 将会话日志写入文件\n" -#: help.c:104 +#: help.c:103 #, c-format msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline 禁用增强命令行编辑功能(readline)\n" -#: help.c:105 +#: help.c:104 #, c-format msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=FILENAME 将查询结果写入文件(或 |管道)\n" -#: help.c:106 +#: help.c:105 #, c-format msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet 以沉默模式运行(不显示消息,只有查询结果)\n" -#: help.c:107 +#: help.c:106 #, c-format msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step 单步模式 (确认每个查询)\n" -#: help.c:108 +#: help.c:107 #, c-format msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr " -S, --single-line 单行模式 (一行就是一条 SQL 命令)\n" -#: help.c:110 +#: help.c:109 #, c-format msgid "" "\n" @@ -2376,17 +2545,17 @@ msgstr "" "\n" "输出格式选项 :\n" -#: help.c:111 +#: help.c:110 #, c-format msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align 使用非对齐表格输出模式\n" -#: help.c:112 +#: help.c:111 #, c-format msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv CSV(逗号分隔值)表输出模式\n" -#: help.c:113 +#: help.c:112 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2395,17 +2564,17 @@ msgstr "" " -F, --field-separator=STRING\n" " 为字段设置分隔符,用于不整齐的输出(默认:\"%s\")\n" -#: help.c:116 +#: help.c:115 #, c-format msgid " -H, --html HTML table output mode\n" msgstr " -H, --html HTML 表格输出模式\n" -#: help.c:117 +#: help.c:116 #, c-format msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr " -P, --pset=变量[=参数] 设置将变量打印到参数的选项(查阅 \\pset 命令)\n" -#: help.c:118 +#: help.c:117 #, c-format msgid "" " -R, --record-separator=STRING\n" @@ -2414,22 +2583,22 @@ msgstr "" " -R, --record-separator=STRING\n" " 为不整齐的输出设置字录的分隔符(默认:换行符号)\n" -#: help.c:120 +#: help.c:119 #, c-format msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only 只打印记录i\n" -#: help.c:121 +#: help.c:120 #, c-format msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr " -T, --table-attr=文本 设定 HTML 表格标记属性(例如,宽度,边界)\n" -#: help.c:122 +#: help.c:121 #, c-format msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded 打开扩展表格输出\n" -#: help.c:123 +#: help.c:122 #, c-format msgid "" " -z, --field-separator-zero\n" @@ -2438,7 +2607,7 @@ msgstr "" " -z, --field-separator-zero\n" " 为不整齐的输出设置字段分隔符为字节0\n" -#: help.c:125 +#: help.c:124 #, c-format msgid "" " -0, --record-separator-zero\n" @@ -2447,7 +2616,7 @@ msgstr "" " -0, --record-separator-zero\n" " 为不整齐的输出设置记录分隔符为字节0\n" -#: help.c:128 +#: help.c:127 #, c-format msgid "" "\n" @@ -2456,36 +2625,36 @@ msgstr "" "\n" "联接选项:\n" -#: help.c:131 +#: help.c:130 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" msgstr " -h, --host=主机名 数据库服务器主机或socket目录(默认:\"%s\")\n" -#: help.c:132 +#: help.c:131 msgid "local socket" msgstr "本地接口" -#: help.c:135 +#: help.c:134 #, c-format msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr " -p, --port=端口 数据库服务器的端口(默认:\"%s\")\n" -#: help.c:141 +#: help.c:137 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr " -U, --username=用户名 指定数据库用户名(默认:\"%s\")\n" -#: help.c:142 +#: help.c:138 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password 永远不提示输入口令\n" -#: help.c:143 +#: help.c:139 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password 强制口令提示 (自动)\n" -#: help.c:145 +#: help.c:141 #, c-format msgid "" "\n" @@ -2499,447 +2668,484 @@ msgstr "" "或者参考PostgreSQL文档中的psql章节.\n" "\n" -#: help.c:148 +#: help.c:144 #, c-format -msgid "Report bugs to .\n" -msgstr "报告错误至 .\n" +msgid "Report bugs to <%s>.\n" +msgstr "臭虫报告至<%s>.\n" -#: help.c:174 +#: help.c:145 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 主页: <%s>\n" + +#: help.c:171 #, c-format msgid "General\n" msgstr "一般性\n" -#: help.c:175 +#: help.c:172 #, c-format msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright 显示PostgreSQL的使用和发行许可条款\n" -#: help.c:176 +#: help.c:173 #, c-format msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" msgstr " \\crosstabview [COLUMNS] 执行查询并且以交叉表显示结果\n" -#: help.c:177 +#: help.c:174 #, c-format msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose 以最冗长的形式显示最近的错误消息\n" -#: help.c:178 +#: help.c:175 +#, c-format +#: help.c:175 #, c-format -msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n" -msgstr " \\g [文件] or; 执行查询 (并把结果写入文件或 |管道)\n" +msgid "" +" \\g [(OPTIONS)] [FILE] execute query (and send results to file or |pipe);\n" +" \\g with no arguments is equivalent to a semicolon\n" +msgstr "" +" \\g [(OPTIONS)] [FILE] 执行查询(并将结果发送到文件或|管道);\n" +" 不带参数的\\g等价于分号\n" -#: help.c:179 +#: help.c:177 #, c-format msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc 描述查询结果,而不执行它\n" -#: help.c:180 +#: help.c:178 #, c-format msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec 执行策略,然后执行其结果中的每个值\n" -#: help.c:181 +#: help.c:179 #, c-format msgid " \\gset [PREFIX] execute query and store results in psql variables\n" msgstr " \\gset [PREFIX] 执行查询并把结果存到psql变量中\n" -#: help.c:182 -#, c-format -msgid " \\gx [FILE] as \\g, but forces expanded output mode\n" -msgstr " \\gx [FILE] 就像\\g,但强制扩展输出模式\n" +#: help.c:180 +msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" +msgstr " \\gx [(OPTIONS)] [FILE] 就像\\g,但强制扩展输出模式\n" -#: help.c:183 +#: help.c:181 #, c-format msgid " \\q quit psql\n" msgstr " \\q 退出 psql\n" -#: help.c:184 +#: help.c:182 #, c-format msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr " \\watch [SEC] 每隔SEC秒执行一次查询\n" -#: help.c:187 +#: help.c:185 #, c-format msgid "Help\n" msgstr "帮助\n" -#: help.c:189 +#: help.c:187 #, c-format msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] 显示反斜线命令的帮助\n" -#: help.c:190 +#: help.c:188 #, c-format msgid " \\? options show help on psql command-line options\n" msgstr " \\? options 显示 psql 命令行选项的帮助\n" -#: help.c:191 +#: help.c:189 #, c-format msgid " \\? variables show help on special variables\n" msgstr " \\? variables 显示特殊变量的帮助\n" -#: help.c:192 +#: help.c:190 #, c-format msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [NAME] SQL命令语法上的说明,用*显示全部命令的语法说明\n" -#: help.c:195 +#: help.c:193 #, c-format msgid "Query Buffer\n" msgstr "查询缓存区\n" -#: help.c:196 +#: help.c:194 #, c-format msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr " \\e [FILE] [LINE] 使用外部编辑器编辑查询缓存区(或文件)\n" -#: help.c:197 +#: help.c:195 #, c-format msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [FUNCNAME [LINE]] 使用外部编辑器编辑函数定义\n" -#: help.c:198 +#: help.c:196 #, c-format msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [VIEWNAME [LINE]] 用外部编辑器编辑视图定义\n" -#: help.c:199 +#: help.c:197 #, c-format msgid " \\p show the contents of the query buffer\n" msgstr " \\p 显示查询缓存区的内容\n" -#: help.c:200 +#: help.c:198 #, c-format msgid " \\r reset (clear) the query buffer\n" msgstr " \\r 重置(清除)查询缓存区\n" -#: help.c:202 +#: help.c:200 #, c-format msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [文件] 显示历史记录或将历史记录保存在文件中\n" -#: help.c:204 +#: help.c:202 #, c-format msgid " \\w FILE write query buffer to file\n" msgstr " \\w 文件 将查询缓存区的内容写入文件\n" -#: help.c:207 +#: help.c:205 #, c-format msgid "Input/Output\n" msgstr "输入/输出\n" -#: help.c:208 +#: help.c:206 #, c-format msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr " \\copy ... 执行 SQL COPY,将数据流发送到客户端主机\n" -#: help.c:209 -#, c-format -msgid " \\echo [STRING] write string to standard output\n" -msgstr " \\echo [字符串] 将字符串写到标准输出\n" +#: help.c:207 +msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" +msgstr " \\echo [-n] [STRING] 将字符串写到标准输出(-n表示没有换行符)\n" -#: help.c:210 +#: help.c:208 #, c-format msgid " \\i FILE execute commands from file\n" msgstr " \\i 文件 从文件中执行命令\n" -#: help.c:211 +#: help.c:209 #, c-format msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr " \\ir FILE 与 \\i类似, 但是相对于当前脚本的位置\n" -#: help.c:212 +#: help.c:210 #, c-format msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [文件] 将全部查询结果写入文件或 |管道\n" -#: help.c:213 -#, c-format -msgid " \\qecho [STRING] write string to query output stream (see \\o)\n" -msgstr " \\qecho [字符串] 将字符串写到查询输出串流(参考 \\o)\n" +#: help.c:211 +msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" +msgstr " \\qecho [-n] [STRING] 将字符串写入\\o输出流(-n表示无换行)\n" -#: help.c:216 +#: help.c:212 +msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" +msgstr " \\warn [-n] [STRING] 将字符串写入标准错误(-n 表示无换行)\n" + +#: help.c:215 #, c-format msgid "Conditional\n" msgstr "条件\n" -#: help.c:217 +#: help.c:216 #, c-format msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR 开始条件块\n" -#: help.c:218 +#: help.c:217 #, c-format msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR 当前条件块内的备选方案\n" -#: help.c:219 +#: help.c:218 #, c-format msgid " \\else final alternative within current conditional block\n" msgstr " \\else 当前条件块内的最终备选方案\n" -#: help.c:220 +#: help.c:219 #, c-format msgid " \\endif end conditional block\n" msgstr " \\endif 条件块的结尾\n" -#: help.c:223 +#: help.c:222 #, c-format msgid "Informational\n" msgstr "资讯性\n" -#: help.c:224 +#: help.c:223 #, c-format msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (选项: S = 显示系统对象, + = 其余的详细信息)\n" -#: help.c:225 +#: help.c:224 #, c-format msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] 列出表,视图和序列\n" -#: help.c:226 +#: help.c:225 #, c-format msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] 名称 描述表,视图,序列,或索引\n" -#: help.c:227 +#: help.c:226 #, c-format msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [模式] 列出聚合函数\n" -#: help.c:228 +#: help.c:227 #, c-format msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [模式] 列出访问方法\n" +#: help.c:228 +msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" +msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] 列出运算符\n" + #: help.c:229 +msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" +msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] 列出运算符集合\n" + +#: help.c:230 +msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" +msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] 列出运算符集合\n" + +#: help.c:231 +#, c-format +msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" +msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] 列出运算符集合所支持的功能\n" + +#: help.c:232 #, c-format msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [模式] 列出表空间\n" -#: help.c:230 +#: help.c:233 #, c-format msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [模式] 列表转换\n" -#: help.c:231 +#: help.c:234 #, c-format msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [模式] 列出类型强制转换\n" -#: help.c:232 +#: help.c:235 #, c-format msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [模式] 显示没有在别处显示的对象描述\n" -#: help.c:233 +#: help.c:236 #, c-format msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [模式] 列出共同值域\n" -#: help.c:234 +#: help.c:237 #, c-format msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [模式] 列出默认权限\n" -#: help.c:235 +#: help.c:238 #, c-format msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [模式] 列出引用表\n" -#: help.c:236 +#: help.c:239 #, c-format msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [模式] 列出引用表\n" -#: help.c:237 +#: help.c:240 #, c-format msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [模式] 列出外部服务器\n" -#: help.c:238 +#: help.c:241 #, c-format msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [模式] 列出用户映射\n" -#: help.c:239 +#: help.c:242 #, c-format msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [模式] 列出外部数据封装器\n" -#: help.c:240 -#, c-format -msgid " \\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions\n" -msgstr " \\df[anptw][S+] [PATRN] 列出[只包括 聚合/常规/程序/触发器/窗口]函数 \n" +#: help.c:243 +msgid "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" list [only agg/normal/procedure/trigger/window] functions\n" +msgstr "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" 列出 [only agg/normal/procedure/trigger/window] 函数\n" -#: help.c:241 +#: help.c:245 #, c-format msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [模式] 列出文本搜索配置\n" -#: help.c:242 +#: help.c:246 #, c-format msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [模式] 列出文本搜索字典\n" -#: help.c:243 +#: help.c:247 #, c-format msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [模式] 列出文本搜索解析器\n" -#: help.c:244 +#: help.c:248 #, c-format msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [模式] 列出文本搜索模版\n" -#: help.c:245 +#: help.c:249 #, c-format msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [模式] 列出角色\n" -#: help.c:246 +#: help.c:250 #, c-format msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [模式] 列出索引\n" -#: help.c:247 +#: help.c:251 #, c-format msgid " \\dl list large objects, same as \\lo_list\n" msgstr " \\dl 列出大对象, 功能与\\lo_list相同\n" -#: help.c:248 +#: help.c:252 #, c-format msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [模式] 列出所有过程语言\n" -#: help.c:249 +#: help.c:253 #, c-format msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [模式] 列出所有物化视图\n" -#: help.c:250 +#: help.c:254 #, c-format msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [模式] 列出所有模式\n" -#: help.c:251 -#, c-format -msgid " \\do[S] [PATTERN] list operators\n" -msgstr " \\do[S] [模式] 列出运算符\n" +#: help.c:255 +msgid "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" list operators\n" +msgstr "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" 列出运算符\n" -#: help.c:252 +#: help.c:257 #, c-format msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [模式] 列出所有校对规则\n" -#: help.c:253 +#: help.c:258 #, c-format msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" msgstr " \\dp [模式] 列出表,视图和序列的访问权限\n" -#: help.c:254 -#, c-format -msgid " \\dP[tin+] [PATTERN] list [only table/index] partitioned relations\n" -msgstr " \\dP[tin+] [模式] 列出[仅 表/索引]分区关系\n" +#: help.c:259 +msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" +msgstr " \\dP[itn+] [PATTERN] 列出[仅表/索引]分区关系[n=nested]\n" -#: help.c:255 +#: help.c:260 #, c-format msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" msgstr " \\drds [模式1 [模式2]] 列出每个数据库的角色设置\n" -#: help.c:256 +#: help.c:261 #, c-format msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [模式] 列出复制发布\n" -#: help.c:257 +#: help.c:262 #, c-format msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [模式] 列出复制订阅\n" -#: help.c:258 +#: help.c:263 #, c-format msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [模式] 列出序列\n" -#: help.c:259 +#: help.c:264 #, c-format msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [模式] 列出表\n" -#: help.c:260 +#: help.c:265 #, c-format msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [模式] 列出数据类型\n" -#: help.c:261 +#: help.c:266 #, c-format msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [模式] 列出角色\n" -#: help.c:262 +#: help.c:267 #, c-format msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [模式] 列出视图\n" -#: help.c:263 +#: help.c:268 #, c-format msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [模式] 列出扩展\n" -#: help.c:264 -#, c-format -msgid " \\dy [PATTERN] list event triggers\n" -msgstr " \\dy [模式] 列出所有事件触发器\n" +#: help.c:269 +msgid " \\dX [PATTERN] list extended statistics\n" +msgstr " \\dX [PATTERN] 列出扩展统计信息\n" -#: help.c:265 +#: help.c:270 +msgid " \\dy[+] [PATTERN] list event triggers\n" +msgstr " \\dy[+] [PATTERN] l列出所有事件触发器\n" + +#: help.c:271 #, c-format msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [模式] 列出所有数据库\n" -#: help.c:266 +#: help.c:272 #, c-format msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNCNAME 显示一个函数的定义\n" -#: help.c:267 +#: help.c:273 #, c-format msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] VIEWNAME 显示一个视图的定义\n" -#: help.c:268 +#: help.c:274 #, c-format msgid " \\z [PATTERN] same as \\dp\n" msgstr " \\z [模式] 和\\dp的功能相同\n" -#: help.c:271 +#: help.c:277 #, c-format msgid "Formatting\n" msgstr "格式化\n" -#: help.c:272 +#: help.c:278 #, c-format msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a 在非对齐模式和对齐模式之间切换\n" -#: help.c:273 +#: help.c:279 #, c-format msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [字符串] 设置表的标题,或如果没有的标题就取消\n" -#: help.c:274 +#: help.c:280 #, c-format msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr " \\f [字符串] 显示或设定非对齐模式查询输出的字段分隔符\n" -#: help.c:275 +#: help.c:281 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H 切换HTML输出模式 (目前是 %s)\n" -#: help.c:277 +#: help.c:283 #, c-format msgid "" " \\pset [NAME [VALUE]] set table output option\n" @@ -2958,27 +3164,27 @@ msgstr "" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle\n" -#: help.c:284 +#: help.c:290 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [开|关] 只显示记录 (目前是%s)\n" -#: help.c:286 +#: help.c:292 #, c-format msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr " \\T [字符串] 设置HTML <表格>标签属性, 或者如果没有的话取消设置\n" -#: help.c:287 +#: help.c:293 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] 切换扩展输出模式(目前是 %s)\n" -#: help.c:291 +#: help.c:297 #, c-format msgid "Connection\n" msgstr "连接\n" -#: help.c:293 +#: help.c:299 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -2987,7 +3193,7 @@ msgstr "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " 连接到新数据库(当前是\"%s\")\n" -#: help.c:297 +#: help.c:303 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -2996,72 +3202,72 @@ msgstr "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " 连接到新数据库(当前无连接)\n" -#: help.c:299 +#: help.c:305 #, c-format msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo 显示当前连接的相关信息\n" -#: help.c:300 +#: help.c:306 #, c-format msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [编码名称] 显示或设定客户端编码\n" -#: help.c:301 +#: help.c:307 #, c-format msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [USERNAME] 安全地为用户更改口令\n" -#: help.c:304 +#: help.c:310 #, c-format msgid "Operating System\n" msgstr "操作系统\n" -#: help.c:305 +#: help.c:311 #, c-format msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [目录] 更改目前的工作目录\n" -#: help.c:306 +#: help.c:312 #, c-format msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv NAME [VALUE] 设置或清空环境变量\n" -#: help.c:307 +#: help.c:313 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [开|关] 切换命令计时开关 (目前是%s)\n" -#: help.c:309 +#: help.c:315 #, c-format msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr " \\! [命令] 在 shell中执行命令或启动一个交互式shell\n" -#: help.c:312 +#: help.c:318 #, c-format msgid "Variables\n" msgstr "变量\n" -#: help.c:313 +#: help.c:319 #, c-format msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [文本] 名称 提示用户设定内部变量\n" -#: help.c:314 +#: help.c:320 #, c-format msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr " \\set [名称 [值数]] 设定内部变量,若无参数则列出全部变量\n" -#: help.c:315 +#: help.c:321 #, c-format msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset 名称 清空(删除)内部变量\n" -#: help.c:318 +#: help.c:324 #, c-format msgid "Large Objects\n" msgstr "大对象\n" -#: help.c:319 +#: help.c:325 #, c-format msgid "" " \\lo_export LOBOID FILE\n" @@ -3074,7 +3280,7 @@ msgstr "" " \\lo_list\n" " \\lo_unlink LOBOID 大对象运算\n" -#: help.c:346 +#: help.c:352 #, c-format msgid "" "List of specially treated variables\n" @@ -3083,12 +3289,12 @@ msgstr "" "特殊对待的变量的列表\n" "\n" -#: help.c:348 +#: help.c:354 #, c-format msgid "psql variables:\n" msgstr "psql变量:\n" -#: help.c:350 +#: help.c:356 #, c-format msgid "" " psql --set=NAME=VALUE\n" @@ -3099,7 +3305,7 @@ msgstr "" " 或者在 psql 中的 \\set NAME VALUE\n" "\n" -#: help.c:352 +#: help.c:358 #, c-format msgid "" " AUTOCOMMIT\n" @@ -3108,7 +3314,7 @@ msgstr "" " AUTOCOMMIT\n" " 如果被设置,成功的SQL命令将会被自动提交\n" -#: help.c:354 +#: help.c:360 #, c-format msgid "" " COMP_KEYWORD_CASE\n" @@ -3119,7 +3325,7 @@ msgstr "" " 决定用于完成 SQL 关键词的大小写\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:357 +#: help.c:363 #, c-format msgid "" " DBNAME\n" @@ -3128,7 +3334,7 @@ msgstr "" " DBNAME\n" " 当前已连接的数据库名\n" -#: help.c:359 +#: help.c:365 #, c-format msgid "" " ECHO\n" @@ -3139,7 +3345,7 @@ msgstr "" " 控制哪些输入被写入到标准输出\n" " [all, errors, none, queries]\n" -#: help.c:362 +#: help.c:368 #, c-format msgid "" " ECHO_HIDDEN\n" @@ -3150,7 +3356,7 @@ msgstr "" " 如果被设置,显示反斜线命令执行的内部命令;\n" " 如果被设置为 \"noexec\",只显示但不执行\n" -#: help.c:365 +#: help.c:371 #, c-format msgid "" " ENCODING\n" @@ -3159,7 +3365,7 @@ msgstr "" " ENCODING\n" " 当前的客户端字符集编码\n" -#: help.c:367 +#: help.c:373 #, c-format msgid "" " ERROR\n" @@ -3168,7 +3374,7 @@ msgstr "" " 错误\n" " 如果上次查询失败,则为true,否则为false\n" -#: help.c:369 +#: help.c:375 #, c-format msgid "" " FETCH_COUNT\n" @@ -3177,7 +3383,7 @@ msgstr "" " FETCH_COUNT\n" " 一次取得并显示的结果行的数量 (0=无限)\n" -#: help.c:371 +#: help.c:377 #, c-format msgid "" " HIDE_TABLEAM\n" @@ -3186,7 +3392,15 @@ msgstr "" " HIDE_TABLEAM\n" " 如果设置,则不显示表访问方法\n" -#: help.c:373 +#: help.c:379 +msgid "" +" HIDE_TOAST_COMPRESSION\n" +" if set, compression methods are not displayed\n" +msgstr "" +" HIDE_TOAST_COMPRESSION\n" +" 如果设置,不显示压缩方法\n" + +#: help.c:381 #, c-format msgid "" " HISTCONTROL\n" @@ -3195,7 +3409,7 @@ msgstr "" " HISTCONTROL\n" " 控制命令历史 [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:375 +#: help.c:383 #, c-format msgid "" " HISTFILE\n" @@ -3204,7 +3418,7 @@ msgstr "" " HISTFILE\n" " 用来存储命令历史的文件名\n" -#: help.c:377 +#: help.c:385 #, c-format msgid "" " HISTSIZE\n" @@ -3213,7 +3427,7 @@ msgstr "" " HISTSIZE\n" " 保存在命令历史中的最大命令数\n" -#: help.c:379 +#: help.c:387 #, c-format msgid "" " HOST\n" @@ -3222,7 +3436,7 @@ msgstr "" " HOST\n" " 当前连接的数据库服务器主机\n" -#: help.c:381 +#: help.c:389 #, c-format msgid "" " IGNOREEOF\n" @@ -3231,7 +3445,7 @@ msgstr "" " IGNOREEOF\n" " 终止交互式会话所需的EOF数\n" -#: help.c:383 +#: help.c:391 #, c-format msgid "" " LASTOID\n" @@ -3240,7 +3454,7 @@ msgstr "" " LASTOID\n" " 最后一个受影响的 OID 的值\n" -#: help.c:385 +#: help.c:393 #, c-format msgid "" " LAST_ERROR_MESSAGE\n" @@ -3251,7 +3465,7 @@ msgstr "" " LAST_ERROR_SQLSTATE\n" " 最后一个错误的消息和SQL状态,如果没有,则为空字符串和\"00000\"\n" -#: help.c:388 +#: help.c:396 #, c-format msgid "" " ON_ERROR_ROLLBACK\n" @@ -3260,7 +3474,7 @@ msgstr "" " ON_ERROR_ROLLBACK\n" " 如果被设置,则错误不会停止一个事务(使用隐式保存点)\n" -#: help.c:390 +#: help.c:398 #, c-format msgid "" " ON_ERROR_STOP\n" @@ -3269,7 +3483,7 @@ msgstr "" " ON_ERROR_STOP\n" " 发生错误后停止批量执行\n" -#: help.c:392 +#: help.c:400 #, c-format msgid "" " PORT\n" @@ -3278,7 +3492,7 @@ msgstr "" " PORT\n" " 当前连接的服务器端口\n" -#: help.c:394 +#: help.c:402 #, c-format msgid "" " PROMPT1\n" @@ -3287,7 +3501,7 @@ msgstr "" " PROMPT1\n" " 指定标准的 psql 提示符\n" -#: help.c:396 +#: help.c:404 #, c-format msgid "" " PROMPT2\n" @@ -3296,7 +3510,7 @@ msgstr "" " PROMPT2\n" " 指定在语句跨行时使用的提示符\n" -#: help.c:398 +#: help.c:406 #, c-format msgid "" " PROMPT3\n" @@ -3305,7 +3519,7 @@ msgstr "" " PROMPT3\n" " 指定 COPY ... FROM STDIN 期间使用的提示符\n" -#: help.c:400 +#: help.c:408 #, c-format msgid "" " QUIET\n" @@ -3314,7 +3528,7 @@ msgstr "" " QUIET\n" " 静默地运行(和-q选项相同)\n" -#: help.c:402 +#: help.c:410 #, c-format msgid "" " ROW_COUNT\n" @@ -3323,7 +3537,7 @@ msgstr "" " ROW_COUNT\n" " 上一个查询返回或影响的行数,或0\n" -#: help.c:404 +#: help.c:412 #, c-format msgid "" " SERVER_VERSION_NAME\n" @@ -3334,7 +3548,7 @@ msgstr "" " SERVER_VERSION_NUM\n" " 服务器版本(短字符串或数字格式)\n" -#: help.c:407 +#: help.c:415 #, c-format msgid "" " SHOW_CONTEXT\n" @@ -3343,7 +3557,7 @@ msgstr "" " SHOW_CONTEXT\n" " 控制消息上下文域的显示 [never, errors, always]\n" -#: help.c:409 +#: help.c:417 #, c-format msgid "" " SINGLELINE\n" @@ -3352,7 +3566,7 @@ msgstr "" " SINGLELINE\n" " 设置的话,行尾会终止SQL命令模式(与-S选项相同)\n" -#: help.c:411 +#: help.c:419 #, c-format msgid "" " SINGLESTEP\n" @@ -3361,7 +3575,7 @@ msgstr "" " SINGLESTEP\n" " 单步模式(与-s选项相同)\n" -#: help.c:413 +#: help.c:421 #, c-format msgid "" " SQLSTATE\n" @@ -3370,7 +3584,7 @@ msgstr "" " SQLSTATE\n" " 上次查询的SQL状态,如果没有错误,则为\"00000\"\n" -#: help.c:415 +#: help.c:423 #, c-format msgid "" " USER\n" @@ -3379,7 +3593,7 @@ msgstr "" " USER\n" " 当前连接上的数据库用户\n" -#: help.c:417 +#: help.c:425 #, c-format msgid "" " VERBOSITY\n" @@ -3388,7 +3602,7 @@ msgstr "" " VERBOSITY\n" " 控制错误报告的冗长程度 [default, verbose, terse, sqlstate]\n" -#: help.c:419 +#: help.c:427 #, c-format msgid "" " VERSION\n" @@ -3401,7 +3615,7 @@ msgstr "" " VERSION_NUM\n" " psql版本(详细字符串、短字符串或数字格式)\n" -#: help.c:424 +#: help.c:432 #, c-format msgid "" "\n" @@ -3410,7 +3624,7 @@ msgstr "" "\n" "显示设置:\n" -#: help.c:426 +#: help.c:434 #, c-format msgid "" " psql --pset=NAME[=VALUE]\n" @@ -3421,7 +3635,7 @@ msgstr "" " 或者 psql 中的 \\pset NAME [VALUE]\n" "\n" -#: help.c:428 +#: help.c:436 #, c-format msgid "" " border\n" @@ -3430,7 +3644,7 @@ msgstr "" " border\n" " 边界样式(数字)\n" -#: help.c:430 +#: help.c:438 #, c-format msgid "" " columns\n" @@ -3439,7 +3653,7 @@ msgstr "" " columns\n" " 用于回卷格式的目标宽度\n" -#: help.c:432 +#: help.c:440 #, c-format msgid "" " expanded (or x)\n" @@ -3448,7 +3662,7 @@ msgstr "" " expanded (or x)\n" " 扩展输出 [on, off, auto]\n" -#: help.c:434 +#: help.c:442 #, c-format msgid "" " fieldsep\n" @@ -3457,7 +3671,7 @@ msgstr "" " fieldsep\n" " 用于非对齐输出的域分隔符(默认是 \"%s\")\n" -#: help.c:437 +#: help.c:445 #, c-format msgid "" " fieldsep_zero\n" @@ -3466,7 +3680,7 @@ msgstr "" " fieldsep_zero\n" " 将用于非对齐模式中的域分隔符设置为零字节\n" -#: help.c:439 +#: help.c:447 #, c-format msgid "" " footer\n" @@ -3475,7 +3689,7 @@ msgstr "" " footer\n" " 启用或禁用表格页脚的显示 [on, off]\n" -#: help.c:441 +#: help.c:449 #, c-format msgid "" " format\n" @@ -3484,7 +3698,7 @@ msgstr "" " format\n" " 设置输出格式 [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:443 +#: help.c:451 #, c-format msgid "" " linestyle\n" @@ -3493,7 +3707,7 @@ msgstr "" " linestyle\n" " 设置边界线绘制风格 [ascii, old-ascii, unicode]\n" -#: help.c:445 +#: help.c:453 #, c-format msgid "" " null\n" @@ -3502,7 +3716,7 @@ msgstr "" " null\n" " 设置代替空值被打印的字符串\n" -#: help.c:447 +#: help.c:455 #, c-format msgid "" " numericlocale\n" @@ -3511,7 +3725,7 @@ msgstr "" " numericlocale\n" " 允许显示特定于区域设置的字符以分隔数字组\n" -#: help.c:449 +#: help.c:457 #, c-format msgid "" " pager\n" @@ -3520,7 +3734,7 @@ msgstr "" " pager\n" " 控制何时使用一个外部分页器 [yes, no, always]\n" -#: help.c:451 +#: help.c:459 #, c-format msgid "" " recordsep\n" @@ -3529,7 +3743,7 @@ msgstr "" " recordsep\n" " 用于非对齐输出中的记录(行)分隔符\n" -#: help.c:453 +#: help.c:461 #, c-format msgid "" " recordsep_zero\n" @@ -3538,7 +3752,7 @@ msgstr "" " recordsep_zero\n" " 将用于非对齐输出中的记录分隔符设置为零字节\n" -#: help.c:455 +#: help.c:463 #, c-format msgid "" " tableattr (or T)\n" @@ -3549,7 +3763,7 @@ msgstr "" " 指定 html 格式中表标签的属性\n" " 或者 latex-longtable 格式中左对齐数据类型的比例列宽\n" -#: help.c:458 +#: help.c:466 #, c-format msgid "" " title\n" @@ -3558,7 +3772,7 @@ msgstr "" " title\n" " 为任何后续被打印的表设置表标题\n" -#: help.c:460 +#: help.c:468 #, c-format msgid "" " tuples_only\n" @@ -3567,7 +3781,7 @@ msgstr "" " tuples_only\n" " 如果被设置,只有真实的表数据会被显示\n" -#: help.c:462 +#: help.c:470 #, c-format msgid "" " unicode_border_linestyle\n" @@ -3580,7 +3794,7 @@ msgstr "" " unicode_header_linestyle\n" " 设置 Unicode 线绘制的风格 [single, double]\n" -#: help.c:467 +#: help.c:475 #, c-format msgid "" "\n" @@ -3589,7 +3803,7 @@ msgstr "" "\n" "环境变量:\n" -#: help.c:471 +#: help.c:479 #, c-format msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" @@ -3600,7 +3814,7 @@ msgstr "" " 或者 psql 中的 \\setenv NAME [VALUE]\n" "\n" -#: help.c:473 +#: help.c:481 #, c-format msgid "" " set NAME=VALUE\n" @@ -3613,7 +3827,7 @@ msgstr "" " 或者 psql 中的 \\setenv NAME [VALUE]\n" "\n" -#: help.c:476 +#: help.c:484 #, c-format msgid "" " COLUMNS\n" @@ -3622,7 +3836,7 @@ msgstr "" " COLUMNS\n" " 回卷格式的列数\n" -#: help.c:478 +#: help.c:486 #, c-format msgid "" " PGAPPNAME\n" @@ -3631,7 +3845,7 @@ msgstr "" " PGAPPNAME\n" " 和application_name连接参数相同\n" -#: help.c:480 +#: help.c:488 #, c-format msgid "" " PGDATABASE\n" @@ -3640,7 +3854,7 @@ msgstr "" " PGDATABASE\n" " 和dbname连接参数相同\n" -#: help.c:482 +#: help.c:490 #, c-format msgid "" " PGHOST\n" @@ -3649,16 +3863,7 @@ msgstr "" " PGHOST\n" " 与主机连接参数相同\n" -#: help.c:484 -#, c-format -msgid "" -" PGPASSWORD\n" -" connection password (not recommended)\n" -msgstr "" -" PGPASSWORD\n" -" 连接口令(不推荐)\n" - -#: help.c:486 +#: help.c:492 #, c-format msgid "" " PGPASSFILE\n" @@ -3667,7 +3872,16 @@ msgstr "" " PGPASSFILE\n" " 口令文件名\n" -#: help.c:488 +#: help.c:494 +#, c-format +msgid "" +" PGPASSWORD\n" +" connection password (not recommended)\n" +msgstr "" +" PGPASSWORD\n" +" 连接口令(不推荐)\n" + +#: help.c:496 #, c-format msgid "" " PGPORT\n" @@ -3676,7 +3890,7 @@ msgstr "" " PGPORT\n" " 与端口连接参数相同\n" -#: help.c:490 +#: help.c:498 #, c-format msgid "" " PGUSER\n" @@ -3685,7 +3899,7 @@ msgstr "" " PGUSER\n" " 与用户连接参数相同\n" -#: help.c:492 +#: help.c:500 #, c-format msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" @@ -3694,7 +3908,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " \\e, \\ef, 和 \\ev 命令使用的编辑器\n" -#: help.c:494 +#: help.c:502 #, c-format msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" @@ -3703,7 +3917,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " 调用编辑器时如何指定一个行号\n" -#: help.c:496 +#: help.c:504 #, c-format msgid "" " PSQL_HISTORY\n" @@ -3712,7 +3926,7 @@ msgstr "" " PSQL_HISTORY\n" " 命令历史文件的可选位置\n" -#: help.c:498 +#: help.c:506 #, c-format msgid "" " PSQL_PAGER, PAGER\n" @@ -3721,7 +3935,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " 外部分页程序的名称\n" -#: help.c:500 +#: help.c:508 #, c-format msgid "" " PSQLRC\n" @@ -3730,7 +3944,7 @@ msgstr "" " PSQLRC\n" " 用户的.psqlrc文件的可选位置\n" -#: help.c:502 +#: help.c:510 #, c-format msgid "" " SHELL\n" @@ -3739,7 +3953,7 @@ msgstr "" " SHELL\n" " \\! 命令使用的shell\n" -#: help.c:504 +#: help.c:512 #, c-format msgid "" " TMPDIR\n" @@ -3748,11 +3962,11 @@ msgstr "" " TMPDIR\n" " 临时文件的目录\n" -#: help.c:548 +#: help.c:557 msgid "Available help:\n" msgstr "可用的说明:\n" -#: help.c:636 +#: help.c:652 #, c-format msgid "" "Command: %s\n" @@ -3771,7 +3985,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:655 +#: help.c:675 #, c-format msgid "" "No help available for \"%s\".\n" @@ -3780,17 +3994,17 @@ msgstr "" "没有 \"%s\" 的帮助说明.\n" "请尝试用不带参数的 \\h 来看一下是否有可使用的帮助信息.\n" -#: input.c:218 +#: input.c:217 #, c-format msgid "could not read from input file: %m" msgstr "无法从输入档案读取:%m" -#: input.c:472 input.c:510 +#: input.c:471 input.c:509 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "无法将历史记录储存到 \"%s\":%m" -#: input.c:529 +#: input.c:528 #, c-format msgid "history is not supported by this installation" msgstr "这个安装不支援命令记录" @@ -3823,12 +4037,12 @@ msgstr "大型对象" msgid "\\if: escaped" msgstr "\\if: 逃脱" -#: mainloop.c:183 +#: mainloop.c:195 #, c-format msgid "Use \"\\q\" to leave %s.\n" msgstr "使用 \"\\q\" 离开 %s.\n" -#: mainloop.c:205 +#: mainloop.c:217 msgid "" "The input is a PostgreSQL custom-format dump.\n" "Use the pg_restore command-line client to restore this dump to a database.\n" @@ -3836,19 +4050,19 @@ msgstr "" "该输入是一个PostgreSQL自定义格式的转储.\n" "请使用pg_restore命令行客户端来将这个转储恢复到数据库.\n" -#: mainloop.c:282 +#: mainloop.c:298 msgid "Use \\? for help or press control-C to clear the input buffer." msgstr "使用\\?获得帮助或按control-C清除输入缓冲区." -#: mainloop.c:284 +#: mainloop.c:300 msgid "Use \\? for help." msgstr "使用\\?获取帮助." -#: mainloop.c:288 +#: mainloop.c:304 msgid "You are using psql, the command-line interface to PostgreSQL." msgstr "您正在使用psql, 这是一种用于访问PostgreSQL的命令行界面." -#: mainloop.c:289 +#: mainloop.c:305 #, c-format msgid "" "Type: \\copyright for distribution terms\n" @@ -3863,33 +4077,28 @@ msgstr "" " \\g 或者以分号(;)结尾以执行查询\n" " \\q 退出\n" -#: mainloop.c:313 +#: mainloop.c:329 msgid "Use \\q to quit." msgstr "使用\\q 退出." -#: mainloop.c:316 mainloop.c:340 +#: mainloop.c:332 mainloop.c:356 msgid "Use control-D to quit." msgstr "使用control-D退出." -#: mainloop.c:318 mainloop.c:342 +#: mainloop.c:334 mainloop.c:358 msgid "Use control-C to quit." msgstr "使用control-C退出." -#: mainloop.c:449 mainloop.c:591 +#: mainloop.c:465 mainloop.c:613 #, c-format msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "查询被忽略;使用\\endif或Ctrl-C退出当前\\if块" -#: mainloop.c:609 +#: mainloop.c:631 #, c-format msgid "reached EOF without finding closing \\endif(s)" msgstr "已到达EOF,但未找到结束符\\endif" -#: psqlscan.l:729 -#, c-format -msgid "skipping recursive expansion of variable \"%s\"" -msgstr "跳过变量 \"%s\"的递归扩展" - #: psqlscanslash.l:638 #, c-format msgid "unterminated quoted string" @@ -3898,7 +4107,7 @@ msgstr "未结束的引用字符串" #: psqlscanslash.l:811 #, c-format msgid "%s: out of memory" -msgstr "%s: 内存溢出" +msgstr "%s: 内存不足" #: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 #: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 @@ -3908,191 +4117,194 @@ msgstr "%s: 内存溢出" #: sql_help.c:249 sql_help.c:251 sql_help.c:263 sql_help.c:264 sql_help.c:265 #: sql_help.c:267 sql_help.c:316 sql_help.c:318 sql_help.c:320 sql_help.c:322 #: sql_help.c:391 sql_help.c:396 sql_help.c:398 sql_help.c:440 sql_help.c:442 -#: sql_help.c:445 sql_help.c:447 sql_help.c:515 sql_help.c:520 sql_help.c:525 -#: sql_help.c:530 sql_help.c:535 sql_help.c:588 sql_help.c:590 sql_help.c:592 -#: sql_help.c:594 sql_help.c:596 sql_help.c:599 sql_help.c:601 sql_help.c:604 -#: sql_help.c:615 sql_help.c:617 sql_help.c:658 sql_help.c:660 sql_help.c:662 -#: sql_help.c:665 sql_help.c:667 sql_help.c:669 sql_help.c:702 sql_help.c:706 -#: sql_help.c:710 sql_help.c:729 sql_help.c:732 sql_help.c:735 sql_help.c:764 -#: sql_help.c:776 sql_help.c:784 sql_help.c:787 sql_help.c:790 sql_help.c:805 -#: sql_help.c:808 sql_help.c:837 sql_help.c:842 sql_help.c:847 sql_help.c:852 -#: sql_help.c:857 sql_help.c:879 sql_help.c:881 sql_help.c:883 sql_help.c:885 -#: sql_help.c:888 sql_help.c:890 sql_help.c:931 sql_help.c:975 sql_help.c:980 -#: sql_help.c:985 sql_help.c:990 sql_help.c:995 sql_help.c:1014 -#: sql_help.c:1025 sql_help.c:1027 sql_help.c:1046 sql_help.c:1056 -#: sql_help.c:1058 sql_help.c:1060 sql_help.c:1072 sql_help.c:1076 -#: sql_help.c:1078 sql_help.c:1089 sql_help.c:1091 sql_help.c:1093 -#: sql_help.c:1109 sql_help.c:1111 sql_help.c:1115 sql_help.c:1118 -#: sql_help.c:1119 sql_help.c:1120 sql_help.c:1123 sql_help.c:1125 -#: sql_help.c:1257 sql_help.c:1259 sql_help.c:1262 sql_help.c:1265 -#: sql_help.c:1267 sql_help.c:1269 sql_help.c:1272 sql_help.c:1275 -#: sql_help.c:1384 sql_help.c:1386 sql_help.c:1388 sql_help.c:1391 -#: sql_help.c:1412 sql_help.c:1415 sql_help.c:1418 sql_help.c:1421 -#: sql_help.c:1425 sql_help.c:1427 sql_help.c:1429 sql_help.c:1431 -#: sql_help.c:1445 sql_help.c:1448 sql_help.c:1450 sql_help.c:1452 -#: sql_help.c:1462 sql_help.c:1464 sql_help.c:1474 sql_help.c:1476 -#: sql_help.c:1486 sql_help.c:1489 sql_help.c:1511 sql_help.c:1513 -#: sql_help.c:1515 sql_help.c:1518 sql_help.c:1520 sql_help.c:1522 -#: sql_help.c:1525 sql_help.c:1575 sql_help.c:1617 sql_help.c:1620 -#: sql_help.c:1622 sql_help.c:1624 sql_help.c:1626 sql_help.c:1628 -#: sql_help.c:1631 sql_help.c:1679 sql_help.c:1695 sql_help.c:1916 -#: sql_help.c:1985 sql_help.c:2004 sql_help.c:2017 sql_help.c:2074 -#: sql_help.c:2081 sql_help.c:2091 sql_help.c:2111 sql_help.c:2136 -#: sql_help.c:2154 sql_help.c:2183 sql_help.c:2278 sql_help.c:2320 -#: sql_help.c:2343 sql_help.c:2364 sql_help.c:2365 sql_help.c:2402 -#: sql_help.c:2422 sql_help.c:2444 sql_help.c:2458 sql_help.c:2478 -#: sql_help.c:2501 sql_help.c:2531 sql_help.c:2556 sql_help.c:2602 -#: sql_help.c:2880 sql_help.c:2893 sql_help.c:2910 sql_help.c:2926 -#: sql_help.c:2966 sql_help.c:3018 sql_help.c:3022 sql_help.c:3024 -#: sql_help.c:3030 sql_help.c:3048 sql_help.c:3075 sql_help.c:3110 -#: sql_help.c:3122 sql_help.c:3131 sql_help.c:3175 sql_help.c:3189 -#: sql_help.c:3217 sql_help.c:3225 sql_help.c:3233 sql_help.c:3241 -#: sql_help.c:3249 sql_help.c:3257 sql_help.c:3265 sql_help.c:3273 -#: sql_help.c:3282 sql_help.c:3293 sql_help.c:3301 sql_help.c:3309 -#: sql_help.c:3317 sql_help.c:3325 sql_help.c:3335 sql_help.c:3344 -#: sql_help.c:3353 sql_help.c:3361 sql_help.c:3371 sql_help.c:3382 -#: sql_help.c:3390 sql_help.c:3399 sql_help.c:3410 sql_help.c:3419 -#: sql_help.c:3427 sql_help.c:3435 sql_help.c:3443 sql_help.c:3451 -#: sql_help.c:3459 sql_help.c:3467 sql_help.c:3475 sql_help.c:3483 -#: sql_help.c:3491 sql_help.c:3499 sql_help.c:3516 sql_help.c:3525 -#: sql_help.c:3533 sql_help.c:3550 sql_help.c:3565 sql_help.c:3835 -#: sql_help.c:3886 sql_help.c:3915 sql_help.c:3923 sql_help.c:4356 -#: sql_help.c:4404 sql_help.c:4545 +#: sql_help.c:445 sql_help.c:447 sql_help.c:516 sql_help.c:521 sql_help.c:526 +#: sql_help.c:531 sql_help.c:536 sql_help.c:590 sql_help.c:592 sql_help.c:594 +#: sql_help.c:596 sql_help.c:598 sql_help.c:601 sql_help.c:603 sql_help.c:606 +#: sql_help.c:617 sql_help.c:619 sql_help.c:661 sql_help.c:663 sql_help.c:665 +#: sql_help.c:668 sql_help.c:670 sql_help.c:672 sql_help.c:707 sql_help.c:711 +#: sql_help.c:715 sql_help.c:734 sql_help.c:737 sql_help.c:740 sql_help.c:769 +#: sql_help.c:781 sql_help.c:789 sql_help.c:792 sql_help.c:795 sql_help.c:810 +#: sql_help.c:813 sql_help.c:842 sql_help.c:847 sql_help.c:852 sql_help.c:857 +#: sql_help.c:862 sql_help.c:884 sql_help.c:886 sql_help.c:888 sql_help.c:890 +#: sql_help.c:893 sql_help.c:895 sql_help.c:937 sql_help.c:982 sql_help.c:987 +#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1021 +#: sql_help.c:1032 sql_help.c:1034 sql_help.c:1053 sql_help.c:1063 +#: sql_help.c:1065 sql_help.c:1067 sql_help.c:1079 sql_help.c:1083 +#: sql_help.c:1085 sql_help.c:1097 sql_help.c:1099 sql_help.c:1101 +#: sql_help.c:1103 sql_help.c:1121 sql_help.c:1123 sql_help.c:1127 +#: sql_help.c:1131 sql_help.c:1135 sql_help.c:1138 sql_help.c:1139 +#: sql_help.c:1140 sql_help.c:1143 sql_help.c:1145 sql_help.c:1280 +#: sql_help.c:1282 sql_help.c:1285 sql_help.c:1288 sql_help.c:1290 +#: sql_help.c:1292 sql_help.c:1295 sql_help.c:1298 sql_help.c:1411 +#: sql_help.c:1413 sql_help.c:1415 sql_help.c:1418 sql_help.c:1439 +#: sql_help.c:1442 sql_help.c:1445 sql_help.c:1448 sql_help.c:1452 +#: sql_help.c:1454 sql_help.c:1456 sql_help.c:1458 sql_help.c:1472 +#: sql_help.c:1475 sql_help.c:1477 sql_help.c:1479 sql_help.c:1489 +#: sql_help.c:1491 sql_help.c:1501 sql_help.c:1503 sql_help.c:1513 +#: sql_help.c:1516 sql_help.c:1539 sql_help.c:1541 sql_help.c:1543 +#: sql_help.c:1545 sql_help.c:1548 sql_help.c:1550 sql_help.c:1553 +#: sql_help.c:1556 sql_help.c:1607 sql_help.c:1650 sql_help.c:1653 +#: sql_help.c:1655 sql_help.c:1657 sql_help.c:1660 sql_help.c:1662 +#: sql_help.c:1664 sql_help.c:1667 sql_help.c:1717 sql_help.c:1733 +#: sql_help.c:1964 sql_help.c:2033 sql_help.c:2052 sql_help.c:2065 +#: sql_help.c:2122 sql_help.c:2129 sql_help.c:2139 sql_help.c:2160 +#: sql_help.c:2186 sql_help.c:2204 sql_help.c:2231 sql_help.c:2328 +#: sql_help.c:2374 sql_help.c:2398 sql_help.c:2421 sql_help.c:2425 +#: sql_help.c:2459 sql_help.c:2479 sql_help.c:2501 sql_help.c:2515 +#: sql_help.c:2536 sql_help.c:2560 sql_help.c:2590 sql_help.c:2615 +#: sql_help.c:2662 sql_help.c:2950 sql_help.c:2963 sql_help.c:2980 +#: sql_help.c:2996 sql_help.c:3036 sql_help.c:3090 sql_help.c:3094 +#: sql_help.c:3096 sql_help.c:3103 sql_help.c:3122 sql_help.c:3149 +#: sql_help.c:3184 sql_help.c:3196 sql_help.c:3205 sql_help.c:3249 +#: sql_help.c:3263 sql_help.c:3291 sql_help.c:3299 sql_help.c:3311 +#: sql_help.c:3321 sql_help.c:3329 sql_help.c:3337 sql_help.c:3345 +#: sql_help.c:3353 sql_help.c:3362 sql_help.c:3373 sql_help.c:3381 +#: sql_help.c:3389 sql_help.c:3397 sql_help.c:3405 sql_help.c:3415 +#: sql_help.c:3424 sql_help.c:3433 sql_help.c:3441 sql_help.c:3451 +#: sql_help.c:3462 sql_help.c:3470 sql_help.c:3479 sql_help.c:3490 +#: sql_help.c:3499 sql_help.c:3507 sql_help.c:3515 sql_help.c:3523 +#: sql_help.c:3531 sql_help.c:3539 sql_help.c:3547 sql_help.c:3555 +#: sql_help.c:3563 sql_help.c:3571 sql_help.c:3579 sql_help.c:3596 +#: sql_help.c:3605 sql_help.c:3613 sql_help.c:3630 sql_help.c:3645 +#: sql_help.c:3947 sql_help.c:3998 sql_help.c:4027 sql_help.c:4042 +#: sql_help.c:4527 sql_help.c:4575 sql_help.c:4726 msgid "name" msgstr "名称" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1766 -#: sql_help.c:3190 sql_help.c:4142 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1814 +#: sql_help.c:3264 sql_help.c:4303 msgid "aggregate_signature" msgstr "aggregate_signature" #: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:250 -#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:524 sql_help.c:571 -#: sql_help.c:589 sql_help.c:616 sql_help.c:666 sql_help.c:731 sql_help.c:786 -#: sql_help.c:807 sql_help.c:846 sql_help.c:891 sql_help.c:932 sql_help.c:984 -#: sql_help.c:1016 sql_help.c:1026 sql_help.c:1059 sql_help.c:1079 -#: sql_help.c:1092 sql_help.c:1126 sql_help.c:1266 sql_help.c:1385 -#: sql_help.c:1428 sql_help.c:1449 sql_help.c:1463 sql_help.c:1475 -#: sql_help.c:1488 sql_help.c:1519 sql_help.c:1576 sql_help.c:1625 +#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:525 sql_help.c:573 +#: sql_help.c:591 sql_help.c:618 sql_help.c:669 sql_help.c:736 sql_help.c:791 +#: sql_help.c:812 sql_help.c:851 sql_help.c:896 sql_help.c:938 sql_help.c:991 +#: sql_help.c:1023 sql_help.c:1033 sql_help.c:1066 sql_help.c:1086 +#: sql_help.c:1100 sql_help.c:1146 sql_help.c:1289 sql_help.c:1412 +#: sql_help.c:1455 sql_help.c:1476 sql_help.c:1490 sql_help.c:1502 +#: sql_help.c:1515 sql_help.c:1542 sql_help.c:1608 sql_help.c:1661 msgid "new_name" msgstr "新的名称" #: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:120 sql_help.c:248 -#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:529 sql_help.c:618 -#: sql_help.c:627 sql_help.c:685 sql_help.c:705 sql_help.c:734 sql_help.c:789 -#: sql_help.c:851 sql_help.c:889 sql_help.c:989 sql_help.c:1028 -#: sql_help.c:1057 sql_help.c:1077 sql_help.c:1090 sql_help.c:1124 -#: sql_help.c:1326 sql_help.c:1387 sql_help.c:1430 sql_help.c:1451 -#: sql_help.c:1514 sql_help.c:1623 sql_help.c:2866 +#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:530 sql_help.c:620 +#: sql_help.c:629 sql_help.c:690 sql_help.c:710 sql_help.c:739 sql_help.c:794 +#: sql_help.c:856 sql_help.c:894 sql_help.c:996 sql_help.c:1035 sql_help.c:1064 +#: sql_help.c:1084 sql_help.c:1098 sql_help.c:1144 sql_help.c:1352 +#: sql_help.c:1414 sql_help.c:1457 sql_help.c:1478 sql_help.c:1540 +#: sql_help.c:1656 sql_help.c:2936 msgid "new_owner" msgstr "新的属主" #: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319 -#: sql_help.c:448 sql_help.c:534 sql_help.c:668 sql_help.c:709 sql_help.c:737 -#: sql_help.c:792 sql_help.c:856 sql_help.c:994 sql_help.c:1061 -#: sql_help.c:1094 sql_help.c:1268 sql_help.c:1432 sql_help.c:1453 -#: sql_help.c:1465 sql_help.c:1477 sql_help.c:1521 sql_help.c:1627 +#: sql_help.c:448 sql_help.c:535 sql_help.c:671 sql_help.c:714 sql_help.c:742 +#: sql_help.c:797 sql_help.c:861 sql_help.c:1001 sql_help.c:1068 +#: sql_help.c:1102 sql_help.c:1291 sql_help.c:1459 sql_help.c:1480 +#: sql_help.c:1492 sql_help.c:1504 sql_help.c:1544 sql_help.c:1663 msgid "new_schema" msgstr "新的模式" -#: sql_help.c:44 sql_help.c:1830 sql_help.c:3191 sql_help.c:4171 +#: sql_help.c:44 sql_help.c:1878 sql_help.c:3265 sql_help.c:4332 msgid "where aggregate_signature is:" msgstr "其中 aggregate_signature 是:" #: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:337 sql_help.c:350 -#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:516 -#: sql_help.c:521 sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:838 -#: sql_help.c:843 sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:976 -#: sql_help.c:981 sql_help.c:986 sql_help.c:991 sql_help.c:996 sql_help.c:1784 -#: sql_help.c:1801 sql_help.c:1807 sql_help.c:1831 sql_help.c:1834 -#: sql_help.c:1837 sql_help.c:1986 sql_help.c:2005 sql_help.c:2008 -#: sql_help.c:2279 sql_help.c:2479 sql_help.c:3192 sql_help.c:3195 -#: sql_help.c:3198 sql_help.c:3283 sql_help.c:3372 sql_help.c:3400 -#: sql_help.c:3720 sql_help.c:4053 sql_help.c:4148 sql_help.c:4155 -#: sql_help.c:4161 sql_help.c:4172 sql_help.c:4175 sql_help.c:4178 +#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:517 +#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:843 +#: sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:863 sql_help.c:983 +#: sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1003 sql_help.c:1832 +#: sql_help.c:1849 sql_help.c:1855 sql_help.c:1879 sql_help.c:1882 +#: sql_help.c:1885 sql_help.c:2034 sql_help.c:2053 sql_help.c:2056 +#: sql_help.c:2329 sql_help.c:2537 sql_help.c:3266 sql_help.c:3269 +#: sql_help.c:3272 sql_help.c:3363 sql_help.c:3452 sql_help.c:3480 +#: sql_help.c:3825 sql_help.c:4205 sql_help.c:4309 sql_help.c:4316 +#: sql_help.c:4322 sql_help.c:4333 sql_help.c:4336 sql_help.c:4339 msgid "argmode" msgstr "参数模式" #: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:338 sql_help.c:351 -#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:839 -#: sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:977 -#: sql_help.c:982 sql_help.c:987 sql_help.c:992 sql_help.c:997 sql_help.c:1785 -#: sql_help.c:1802 sql_help.c:1808 sql_help.c:1832 sql_help.c:1835 -#: sql_help.c:1838 sql_help.c:1987 sql_help.c:2006 sql_help.c:2009 -#: sql_help.c:2280 sql_help.c:2480 sql_help.c:3193 sql_help.c:3196 -#: sql_help.c:3199 sql_help.c:3284 sql_help.c:3373 sql_help.c:3401 -#: sql_help.c:4149 sql_help.c:4156 sql_help.c:4162 sql_help.c:4173 -#: sql_help.c:4176 sql_help.c:4179 +#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:518 +#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:844 +#: sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:864 sql_help.c:984 +#: sql_help.c:989 sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1833 +#: sql_help.c:1850 sql_help.c:1856 sql_help.c:1880 sql_help.c:1883 +#: sql_help.c:1886 sql_help.c:2035 sql_help.c:2054 sql_help.c:2057 +#: sql_help.c:2330 sql_help.c:2538 sql_help.c:3267 sql_help.c:3270 +#: sql_help.c:3273 sql_help.c:3364 sql_help.c:3453 sql_help.c:3481 +#: sql_help.c:4310 sql_help.c:4317 sql_help.c:4323 sql_help.c:4334 +#: sql_help.c:4337 sql_help.c:4340 msgid "argname" msgstr "参数名称" #: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:339 sql_help.c:352 -#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:840 -#: sql_help.c:845 sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:978 -#: sql_help.c:983 sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1786 -#: sql_help.c:1803 sql_help.c:1809 sql_help.c:1833 sql_help.c:1836 -#: sql_help.c:1839 sql_help.c:2281 sql_help.c:2481 sql_help.c:3194 -#: sql_help.c:3197 sql_help.c:3200 sql_help.c:3285 sql_help.c:3374 -#: sql_help.c:3402 sql_help.c:4150 sql_help.c:4157 sql_help.c:4163 -#: sql_help.c:4174 sql_help.c:4177 sql_help.c:4180 +#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:519 +#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:845 +#: sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:985 +#: sql_help.c:990 sql_help.c:995 sql_help.c:1000 sql_help.c:1005 +#: sql_help.c:1834 sql_help.c:1851 sql_help.c:1857 sql_help.c:1881 +#: sql_help.c:1884 sql_help.c:1887 sql_help.c:2331 sql_help.c:2539 +#: sql_help.c:3268 sql_help.c:3271 sql_help.c:3274 sql_help.c:3365 +#: sql_help.c:3454 sql_help.c:3482 sql_help.c:4311 sql_help.c:4318 +#: sql_help.c:4324 sql_help.c:4335 sql_help.c:4338 sql_help.c:4341 msgid "argtype" msgstr "参数类型" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:926 -#: sql_help.c:1074 sql_help.c:1446 sql_help.c:1570 sql_help.c:1602 -#: sql_help.c:1650 sql_help.c:1887 sql_help.c:1894 sql_help.c:2186 -#: sql_help.c:2228 sql_help.c:2235 sql_help.c:2244 sql_help.c:2321 -#: sql_help.c:2532 sql_help.c:2624 sql_help.c:2895 sql_help.c:3076 -#: sql_help.c:3098 sql_help.c:3586 sql_help.c:3754 sql_help.c:4606 +#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:932 +#: sql_help.c:1081 sql_help.c:1473 sql_help.c:1602 sql_help.c:1634 +#: sql_help.c:1686 sql_help.c:1749 sql_help.c:1935 sql_help.c:1942 +#: sql_help.c:2234 sql_help.c:2276 sql_help.c:2283 sql_help.c:2292 +#: sql_help.c:2375 sql_help.c:2591 sql_help.c:2684 sql_help.c:2965 +#: sql_help.c:3150 sql_help.c:3172 sql_help.c:3312 sql_help.c:3667 +#: sql_help.c:3866 sql_help.c:4041 sql_help.c:4789 msgid "option" msgstr "选项" -#: sql_help.c:113 sql_help.c:927 sql_help.c:1571 sql_help.c:2322 -#: sql_help.c:2533 sql_help.c:3077 +#: sql_help.c:113 sql_help.c:933 sql_help.c:1603 sql_help.c:2376 +#: sql_help.c:2592 sql_help.c:3151 sql_help.c:3313 msgid "where option can be:" msgstr "选项可以是" -#: sql_help.c:114 sql_help.c:2118 +#: sql_help.c:114 sql_help.c:2168 msgid "allowconn" msgstr "allowconn" -#: sql_help.c:115 sql_help.c:928 sql_help.c:1572 sql_help.c:2119 -#: sql_help.c:2534 sql_help.c:3078 +#: sql_help.c:115 sql_help.c:934 sql_help.c:1604 sql_help.c:2169 +#: sql_help.c:2377 sql_help.c:2593 sql_help.c:3152 msgid "connlimit" msgstr "连接限制" -#: sql_help.c:116 sql_help.c:2120 +#: sql_help.c:116 sql_help.c:2170 msgid "istemplate" msgstr "istemplate" -#: sql_help.c:122 sql_help.c:606 sql_help.c:671 sql_help.c:1271 -#: sql_help.c:1319 +#: sql_help.c:122 sql_help.c:608 sql_help.c:674 sql_help.c:1294 sql_help.c:1345 +#: sql_help.c:4045 msgid "new_tablespace" msgstr "新的表空间" -#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:544 sql_help.c:546 -#: sql_help.c:547 sql_help.c:863 sql_help.c:865 sql_help.c:866 sql_help.c:935 -#: sql_help.c:939 sql_help.c:942 sql_help.c:1003 sql_help.c:1005 -#: sql_help.c:1006 sql_help.c:1137 sql_help.c:1140 sql_help.c:1579 -#: sql_help.c:1583 sql_help.c:1586 sql_help.c:2291 sql_help.c:2485 -#: sql_help.c:3940 sql_help.c:4345 +#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:545 sql_help.c:547 +#: sql_help.c:548 sql_help.c:868 sql_help.c:870 sql_help.c:871 sql_help.c:941 +#: sql_help.c:945 sql_help.c:948 sql_help.c:1010 sql_help.c:1012 +#: sql_help.c:1013 sql_help.c:1157 sql_help.c:1160 sql_help.c:1611 +#: sql_help.c:1615 sql_help.c:1618 sql_help.c:2341 sql_help.c:2543 +#: sql_help.c:4063 sql_help.c:4516 msgid "configuration_parameter" msgstr "配置参数" #: sql_help.c:125 sql_help.c:395 sql_help.c:466 sql_help.c:472 sql_help.c:484 -#: sql_help.c:545 sql_help.c:598 sql_help.c:677 sql_help.c:683 sql_help.c:864 -#: sql_help.c:887 sql_help.c:936 sql_help.c:1004 sql_help.c:1075 -#: sql_help.c:1114 sql_help.c:1117 sql_help.c:1122 sql_help.c:1138 -#: sql_help.c:1139 sql_help.c:1301 sql_help.c:1321 sql_help.c:1368 -#: sql_help.c:1390 sql_help.c:1447 sql_help.c:1580 sql_help.c:1603 -#: sql_help.c:2187 sql_help.c:2229 sql_help.c:2236 sql_help.c:2245 -#: sql_help.c:2292 sql_help.c:2293 sql_help.c:2352 sql_help.c:2386 -#: sql_help.c:2486 sql_help.c:2487 sql_help.c:2504 sql_help.c:2625 -#: sql_help.c:2655 sql_help.c:2760 sql_help.c:2773 sql_help.c:2787 -#: sql_help.c:2828 sql_help.c:2852 sql_help.c:2869 sql_help.c:2896 -#: sql_help.c:3099 sql_help.c:3755 sql_help.c:4346 sql_help.c:4347 +#: sql_help.c:546 sql_help.c:600 sql_help.c:680 sql_help.c:688 sql_help.c:869 +#: sql_help.c:892 sql_help.c:942 sql_help.c:1011 sql_help.c:1082 +#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:1137 +#: sql_help.c:1142 sql_help.c:1158 sql_help.c:1159 sql_help.c:1325 +#: sql_help.c:1347 sql_help.c:1395 sql_help.c:1417 sql_help.c:1474 +#: sql_help.c:1558 sql_help.c:1612 sql_help.c:1635 sql_help.c:2235 +#: sql_help.c:2277 sql_help.c:2284 sql_help.c:2293 sql_help.c:2342 +#: sql_help.c:2343 sql_help.c:2406 sql_help.c:2409 sql_help.c:2443 +#: sql_help.c:2544 sql_help.c:2545 sql_help.c:2563 sql_help.c:2685 +#: sql_help.c:2724 sql_help.c:2830 sql_help.c:2843 sql_help.c:2857 +#: sql_help.c:2898 sql_help.c:2922 sql_help.c:2939 sql_help.c:2966 +#: sql_help.c:3173 sql_help.c:3867 sql_help.c:4517 sql_help.c:4518 msgid "value" msgstr "值" @@ -4100,9 +4312,9 @@ msgstr "值" msgid "target_role" msgstr "目标角色" -#: sql_help.c:198 sql_help.c:2170 sql_help.c:2580 sql_help.c:2585 -#: sql_help.c:3702 sql_help.c:3709 sql_help.c:3723 sql_help.c:3729 -#: sql_help.c:4035 sql_help.c:4042 sql_help.c:4056 sql_help.c:4062 +#: sql_help.c:198 sql_help.c:2219 sql_help.c:2640 sql_help.c:2645 +#: sql_help.c:3800 sql_help.c:3809 sql_help.c:3828 sql_help.c:3837 +#: sql_help.c:4180 sql_help.c:4189 sql_help.c:4208 sql_help.c:4217 msgid "schema_name" msgstr "模式名称" @@ -4116,34 +4328,31 @@ msgstr "简写形式的可授予或回收权限是下列内容之一:" #: sql_help.c:201 sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205 #: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 -#: sql_help.c:569 sql_help.c:605 sql_help.c:670 sql_help.c:810 sql_help.c:946 -#: sql_help.c:1270 sql_help.c:1590 sql_help.c:2325 sql_help.c:2326 -#: sql_help.c:2327 sql_help.c:2328 sql_help.c:2329 sql_help.c:2460 -#: sql_help.c:2537 sql_help.c:2538 sql_help.c:2539 sql_help.c:2540 -#: sql_help.c:2541 sql_help.c:3081 sql_help.c:3082 sql_help.c:3083 -#: sql_help.c:3084 sql_help.c:3085 sql_help.c:3736 sql_help.c:3737 -#: sql_help.c:3738 sql_help.c:4036 sql_help.c:4040 sql_help.c:4043 -#: sql_help.c:4045 sql_help.c:4047 sql_help.c:4049 sql_help.c:4051 -#: sql_help.c:4057 sql_help.c:4059 sql_help.c:4061 sql_help.c:4063 -#: sql_help.c:4065 sql_help.c:4067 sql_help.c:4068 sql_help.c:4069 -#: sql_help.c:4366 +#: sql_help.c:571 sql_help.c:607 sql_help.c:673 sql_help.c:815 sql_help.c:952 +#: sql_help.c:1293 sql_help.c:1622 sql_help.c:2380 sql_help.c:2381 +#: sql_help.c:2382 sql_help.c:2383 sql_help.c:2384 sql_help.c:2517 +#: sql_help.c:2596 sql_help.c:2597 sql_help.c:2598 sql_help.c:2599 +#: sql_help.c:2600 sql_help.c:3155 sql_help.c:3156 sql_help.c:3157 +#: sql_help.c:3158 sql_help.c:3159 sql_help.c:3846 sql_help.c:3850 +#: sql_help.c:4226 sql_help.c:4230 sql_help.c:4537 msgid "role_name" msgstr "角色名称" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1286 sql_help.c:1288 -#: sql_help.c:1336 sql_help.c:1347 sql_help.c:1372 sql_help.c:1619 -#: sql_help.c:2139 sql_help.c:2143 sql_help.c:2248 sql_help.c:2253 -#: sql_help.c:2347 sql_help.c:2755 sql_help.c:2768 sql_help.c:2782 -#: sql_help.c:2791 sql_help.c:2803 sql_help.c:2832 sql_help.c:3786 -#: sql_help.c:3801 sql_help.c:3803 sql_help.c:4231 sql_help.c:4232 -#: sql_help.c:4241 sql_help.c:4282 sql_help.c:4283 sql_help.c:4284 -#: sql_help.c:4285 sql_help.c:4286 sql_help.c:4287 sql_help.c:4320 -#: sql_help.c:4321 sql_help.c:4326 sql_help.c:4331 sql_help.c:4470 -#: sql_help.c:4471 sql_help.c:4480 sql_help.c:4521 sql_help.c:4522 -#: sql_help.c:4523 sql_help.c:4524 sql_help.c:4525 sql_help.c:4526 -#: sql_help.c:4573 sql_help.c:4575 sql_help.c:4632 sql_help.c:4688 -#: sql_help.c:4689 sql_help.c:4698 sql_help.c:4739 sql_help.c:4740 -#: sql_help.c:4741 sql_help.c:4742 sql_help.c:4743 sql_help.c:4744 +#: sql_help.c:236 sql_help.c:459 sql_help.c:1309 sql_help.c:1311 +#: sql_help.c:1362 sql_help.c:1374 sql_help.c:1399 sql_help.c:1652 +#: sql_help.c:2189 sql_help.c:2193 sql_help.c:2296 sql_help.c:2301 +#: sql_help.c:2402 sql_help.c:2701 sql_help.c:2706 sql_help.c:2708 +#: sql_help.c:2825 sql_help.c:2838 sql_help.c:2852 sql_help.c:2861 +#: sql_help.c:2873 sql_help.c:2902 sql_help.c:3898 sql_help.c:3913 +#: sql_help.c:3915 sql_help.c:4394 sql_help.c:4395 sql_help.c:4404 +#: sql_help.c:4446 sql_help.c:4447 sql_help.c:4448 sql_help.c:4449 +#: sql_help.c:4450 sql_help.c:4451 sql_help.c:4491 sql_help.c:4492 +#: sql_help.c:4497 sql_help.c:4502 sql_help.c:4643 sql_help.c:4644 +#: sql_help.c:4653 sql_help.c:4695 sql_help.c:4696 sql_help.c:4697 +#: sql_help.c:4698 sql_help.c:4699 sql_help.c:4700 sql_help.c:4754 +#: sql_help.c:4756 sql_help.c:4816 sql_help.c:4874 sql_help.c:4875 +#: sql_help.c:4884 sql_help.c:4926 sql_help.c:4927 sql_help.c:4928 +#: sql_help.c:4929 sql_help.c:4930 sql_help.c:4931 msgid "expression" msgstr "表达式" @@ -4152,18 +4361,18 @@ msgid "domain_constraint" msgstr "域_约束" #: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475 -#: sql_help.c:1263 sql_help.c:1307 sql_help.c:1308 sql_help.c:1309 -#: sql_help.c:1335 sql_help.c:1346 sql_help.c:1363 sql_help.c:1772 -#: sql_help.c:1774 sql_help.c:2142 sql_help.c:2247 sql_help.c:2252 -#: sql_help.c:2790 sql_help.c:2802 sql_help.c:3798 +#: sql_help.c:1286 sql_help.c:1333 sql_help.c:1334 sql_help.c:1335 +#: sql_help.c:1361 sql_help.c:1373 sql_help.c:1390 sql_help.c:1820 +#: sql_help.c:1822 sql_help.c:2192 sql_help.c:2295 sql_help.c:2300 +#: sql_help.c:2860 sql_help.c:2872 sql_help.c:3910 msgid "constraint_name" msgstr "约束名称" -#: sql_help.c:244 sql_help.c:1264 +#: sql_help.c:244 sql_help.c:1287 msgid "new_constraint_name" msgstr "new_constraint_name(新约束名)" -#: sql_help.c:317 sql_help.c:1073 +#: sql_help.c:317 sql_help.c:1080 msgid "new_version" msgstr "新版本" @@ -4179,82 +4388,82 @@ msgstr "member_object的位置:" #: sql_help.c:334 sql_help.c:335 sql_help.c:340 sql_help.c:344 sql_help.c:346 #: sql_help.c:348 sql_help.c:357 sql_help.c:358 sql_help.c:359 sql_help.c:360 #: sql_help.c:361 sql_help.c:362 sql_help.c:363 sql_help.c:364 sql_help.c:367 -#: sql_help.c:368 sql_help.c:1764 sql_help.c:1769 sql_help.c:1776 -#: sql_help.c:1777 sql_help.c:1778 sql_help.c:1779 sql_help.c:1780 -#: sql_help.c:1781 sql_help.c:1782 sql_help.c:1787 sql_help.c:1789 -#: sql_help.c:1793 sql_help.c:1795 sql_help.c:1799 sql_help.c:1804 -#: sql_help.c:1805 sql_help.c:1812 sql_help.c:1813 sql_help.c:1814 -#: sql_help.c:1815 sql_help.c:1816 sql_help.c:1817 sql_help.c:1818 -#: sql_help.c:1819 sql_help.c:1820 sql_help.c:1821 sql_help.c:1822 -#: sql_help.c:1827 sql_help.c:1828 sql_help.c:4138 sql_help.c:4143 -#: sql_help.c:4144 sql_help.c:4145 sql_help.c:4146 sql_help.c:4152 -#: sql_help.c:4153 sql_help.c:4158 sql_help.c:4159 sql_help.c:4164 -#: sql_help.c:4165 sql_help.c:4166 sql_help.c:4167 sql_help.c:4168 -#: sql_help.c:4169 +#: sql_help.c:368 sql_help.c:1812 sql_help.c:1817 sql_help.c:1824 +#: sql_help.c:1825 sql_help.c:1826 sql_help.c:1827 sql_help.c:1828 +#: sql_help.c:1829 sql_help.c:1830 sql_help.c:1835 sql_help.c:1837 +#: sql_help.c:1841 sql_help.c:1843 sql_help.c:1847 sql_help.c:1852 +#: sql_help.c:1853 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862 +#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1865 sql_help.c:1866 +#: sql_help.c:1867 sql_help.c:1868 sql_help.c:1869 sql_help.c:1870 +#: sql_help.c:1875 sql_help.c:1876 sql_help.c:4299 sql_help.c:4304 +#: sql_help.c:4305 sql_help.c:4306 sql_help.c:4307 sql_help.c:4313 +#: sql_help.c:4314 sql_help.c:4319 sql_help.c:4320 sql_help.c:4325 +#: sql_help.c:4326 sql_help.c:4327 sql_help.c:4328 sql_help.c:4329 +#: sql_help.c:4330 msgid "object_name" msgstr "对象_名称" -#: sql_help.c:326 sql_help.c:1765 sql_help.c:4141 +#: sql_help.c:326 sql_help.c:1813 sql_help.c:4302 msgid "aggregate_name" msgstr "aggregate_name" -#: sql_help.c:328 sql_help.c:1767 sql_help.c:2051 sql_help.c:2055 -#: sql_help.c:2057 sql_help.c:3208 +#: sql_help.c:328 sql_help.c:1815 sql_help.c:2099 sql_help.c:2103 +#: sql_help.c:2105 sql_help.c:3282 msgid "source_type" msgstr "类型指派中的源数据类型" -#: sql_help.c:329 sql_help.c:1768 sql_help.c:2052 sql_help.c:2056 -#: sql_help.c:2058 sql_help.c:3209 +#: sql_help.c:329 sql_help.c:1816 sql_help.c:2100 sql_help.c:2104 +#: sql_help.c:2106 sql_help.c:3283 msgid "target_type" msgstr "类型指派中的目标数据类型" -#: sql_help.c:336 sql_help.c:774 sql_help.c:1783 sql_help.c:2053 -#: sql_help.c:2094 sql_help.c:2157 sql_help.c:2403 sql_help.c:2434 -#: sql_help.c:2972 sql_help.c:4052 sql_help.c:4147 sql_help.c:4260 -#: sql_help.c:4264 sql_help.c:4268 sql_help.c:4271 sql_help.c:4499 -#: sql_help.c:4503 sql_help.c:4507 sql_help.c:4510 sql_help.c:4717 -#: sql_help.c:4721 sql_help.c:4725 sql_help.c:4728 +#: sql_help.c:336 sql_help.c:779 sql_help.c:1831 sql_help.c:2101 +#: sql_help.c:2142 sql_help.c:2207 sql_help.c:2460 sql_help.c:2491 +#: sql_help.c:3042 sql_help.c:4204 sql_help.c:4308 sql_help.c:4423 +#: sql_help.c:4427 sql_help.c:4431 sql_help.c:4434 sql_help.c:4672 +#: sql_help.c:4676 sql_help.c:4680 sql_help.c:4683 sql_help.c:4903 +#: sql_help.c:4907 sql_help.c:4911 sql_help.c:4914 msgid "function_name" msgstr "函数名称" -#: sql_help.c:341 sql_help.c:767 sql_help.c:1790 sql_help.c:2427 +#: sql_help.c:341 sql_help.c:772 sql_help.c:1838 sql_help.c:2484 msgid "operator_name" msgstr "操作符名称" -#: sql_help.c:342 sql_help.c:703 sql_help.c:707 sql_help.c:711 sql_help.c:1791 -#: sql_help.c:2404 sql_help.c:3326 +#: sql_help.c:342 sql_help.c:708 sql_help.c:712 sql_help.c:716 sql_help.c:1839 +#: sql_help.c:2461 sql_help.c:3406 msgid "left_type" msgstr "操作符左边操作数的类型" -#: sql_help.c:343 sql_help.c:704 sql_help.c:708 sql_help.c:712 sql_help.c:1792 -#: sql_help.c:2405 sql_help.c:3327 +#: sql_help.c:343 sql_help.c:709 sql_help.c:713 sql_help.c:717 sql_help.c:1840 +#: sql_help.c:2462 sql_help.c:3407 msgid "right_type" msgstr "操作符右边操作数的类型" -#: sql_help.c:345 sql_help.c:347 sql_help.c:730 sql_help.c:733 sql_help.c:736 -#: sql_help.c:765 sql_help.c:777 sql_help.c:785 sql_help.c:788 sql_help.c:791 -#: sql_help.c:1352 sql_help.c:1794 sql_help.c:1796 sql_help.c:2424 -#: sql_help.c:2445 sql_help.c:2808 sql_help.c:3336 sql_help.c:3345 +#: sql_help.c:345 sql_help.c:347 sql_help.c:735 sql_help.c:738 sql_help.c:741 +#: sql_help.c:770 sql_help.c:782 sql_help.c:790 sql_help.c:793 sql_help.c:796 +#: sql_help.c:1379 sql_help.c:1842 sql_help.c:1844 sql_help.c:2481 +#: sql_help.c:2502 sql_help.c:2878 sql_help.c:3416 sql_help.c:3425 msgid "index_method" msgstr "访问索引的方法" -#: sql_help.c:349 sql_help.c:1800 sql_help.c:4154 +#: sql_help.c:349 sql_help.c:1848 sql_help.c:4315 msgid "procedure_name" msgstr "程序名称 " -#: sql_help.c:353 sql_help.c:1806 sql_help.c:3719 sql_help.c:4160 +#: sql_help.c:353 sql_help.c:1854 sql_help.c:3824 sql_help.c:4321 msgid "routine_name" msgstr "程序名称" -#: sql_help.c:365 sql_help.c:1325 sql_help.c:1823 sql_help.c:2287 -#: sql_help.c:2484 sql_help.c:2763 sql_help.c:2939 sql_help.c:3507 -#: sql_help.c:3733 sql_help.c:4066 +#: sql_help.c:365 sql_help.c:1351 sql_help.c:1871 sql_help.c:2337 +#: sql_help.c:2542 sql_help.c:2833 sql_help.c:3009 sql_help.c:3587 +#: sql_help.c:3843 sql_help.c:4223 msgid "type_name" msgstr "类型名称" -#: sql_help.c:366 sql_help.c:1824 sql_help.c:2286 sql_help.c:2483 -#: sql_help.c:2940 sql_help.c:3166 sql_help.c:3508 sql_help.c:3725 -#: sql_help.c:4058 +#: sql_help.c:366 sql_help.c:1872 sql_help.c:2336 sql_help.c:2541 +#: sql_help.c:3010 sql_help.c:3240 sql_help.c:3588 sql_help.c:3831 +#: sql_help.c:4211 msgid "lang_name" msgstr "语言名称" @@ -4262,1897 +4471,1947 @@ msgstr "语言名称" msgid "and aggregate_signature is:" msgstr "aggregate_signature指的是:" -#: sql_help.c:392 sql_help.c:1918 sql_help.c:2184 +#: sql_help.c:392 sql_help.c:1966 sql_help.c:2232 msgid "handler_function" msgstr "handler_function(处理_函数)" -#: sql_help.c:393 sql_help.c:2185 +#: sql_help.c:393 sql_help.c:2233 msgid "validator_function" msgstr "validator_function(验证_函数)" -#: sql_help.c:441 sql_help.c:519 sql_help.c:659 sql_help.c:841 sql_help.c:979 -#: sql_help.c:1258 sql_help.c:1512 +#: sql_help.c:441 sql_help.c:520 sql_help.c:662 sql_help.c:846 sql_help.c:986 +#: sql_help.c:1281 sql_help.c:1549 msgid "action" msgstr "操作" #: sql_help.c:443 sql_help.c:450 sql_help.c:454 sql_help.c:455 sql_help.c:458 #: sql_help.c:460 sql_help.c:461 sql_help.c:462 sql_help.c:464 sql_help.c:467 -#: sql_help.c:469 sql_help.c:470 sql_help.c:663 sql_help.c:673 sql_help.c:675 -#: sql_help.c:678 sql_help.c:680 sql_help.c:1055 sql_help.c:1260 -#: sql_help.c:1278 sql_help.c:1282 sql_help.c:1283 sql_help.c:1287 -#: sql_help.c:1289 sql_help.c:1290 sql_help.c:1291 sql_help.c:1293 -#: sql_help.c:1296 sql_help.c:1297 sql_help.c:1299 sql_help.c:1302 -#: sql_help.c:1304 sql_help.c:1348 sql_help.c:1350 sql_help.c:1357 -#: sql_help.c:1366 sql_help.c:1371 sql_help.c:1618 sql_help.c:1621 -#: sql_help.c:1656 sql_help.c:1771 sql_help.c:1884 sql_help.c:1890 -#: sql_help.c:1903 sql_help.c:1904 sql_help.c:1905 sql_help.c:2226 -#: sql_help.c:2239 sql_help.c:2284 sql_help.c:2346 sql_help.c:2350 -#: sql_help.c:2383 sql_help.c:2610 sql_help.c:2638 sql_help.c:2639 -#: sql_help.c:2746 sql_help.c:2754 sql_help.c:2764 sql_help.c:2767 -#: sql_help.c:2777 sql_help.c:2781 sql_help.c:2804 sql_help.c:2806 -#: sql_help.c:2813 sql_help.c:2826 sql_help.c:2831 sql_help.c:2849 -#: sql_help.c:2975 sql_help.c:3111 sql_help.c:3704 sql_help.c:3705 -#: sql_help.c:3785 sql_help.c:3800 sql_help.c:3802 sql_help.c:3804 -#: sql_help.c:4037 sql_help.c:4038 sql_help.c:4140 sql_help.c:4291 -#: sql_help.c:4530 sql_help.c:4572 sql_help.c:4574 sql_help.c:4576 -#: sql_help.c:4620 sql_help.c:4748 +#: sql_help.c:469 sql_help.c:470 sql_help.c:666 sql_help.c:676 sql_help.c:678 +#: sql_help.c:681 sql_help.c:683 sql_help.c:684 sql_help.c:1062 sql_help.c:1283 +#: sql_help.c:1301 sql_help.c:1305 sql_help.c:1306 sql_help.c:1310 +#: sql_help.c:1312 sql_help.c:1313 sql_help.c:1314 sql_help.c:1315 +#: sql_help.c:1317 sql_help.c:1320 sql_help.c:1321 sql_help.c:1323 +#: sql_help.c:1326 sql_help.c:1328 sql_help.c:1329 sql_help.c:1375 +#: sql_help.c:1377 sql_help.c:1384 sql_help.c:1393 sql_help.c:1398 +#: sql_help.c:1651 sql_help.c:1654 sql_help.c:1658 sql_help.c:1694 +#: sql_help.c:1819 sql_help.c:1932 sql_help.c:1938 sql_help.c:1951 +#: sql_help.c:1952 sql_help.c:1953 sql_help.c:2274 sql_help.c:2287 +#: sql_help.c:2334 sql_help.c:2401 sql_help.c:2407 sql_help.c:2440 +#: sql_help.c:2670 sql_help.c:2705 sql_help.c:2707 sql_help.c:2815 +#: sql_help.c:2824 sql_help.c:2834 sql_help.c:2837 sql_help.c:2847 +#: sql_help.c:2851 sql_help.c:2874 sql_help.c:2876 sql_help.c:2883 +#: sql_help.c:2896 sql_help.c:2901 sql_help.c:2919 sql_help.c:3045 +#: sql_help.c:3185 sql_help.c:3803 sql_help.c:3804 sql_help.c:3897 +#: sql_help.c:3912 sql_help.c:3914 sql_help.c:3916 sql_help.c:4183 +#: sql_help.c:4184 sql_help.c:4301 sql_help.c:4455 sql_help.c:4461 +#: sql_help.c:4463 sql_help.c:4704 sql_help.c:4710 sql_help.c:4712 +#: sql_help.c:4753 sql_help.c:4755 sql_help.c:4757 sql_help.c:4804 +#: sql_help.c:4935 sql_help.c:4941 sql_help.c:4943 msgid "column_name" msgstr "列名称" -#: sql_help.c:444 sql_help.c:664 sql_help.c:1261 +#: sql_help.c:444 sql_help.c:667 sql_help.c:1284 sql_help.c:1659 msgid "new_column_name" msgstr "new_column_name(新列名)" -#: sql_help.c:449 sql_help.c:540 sql_help.c:672 sql_help.c:862 sql_help.c:1000 -#: sql_help.c:1277 sql_help.c:1528 +#: sql_help.c:449 sql_help.c:541 sql_help.c:675 sql_help.c:867 sql_help.c:1007 +#: sql_help.c:1300 sql_help.c:1559 msgid "where action is one of:" msgstr "操作可以是下列选项之一" -#: sql_help.c:451 sql_help.c:456 sql_help.c:1047 sql_help.c:1279 -#: sql_help.c:1284 sql_help.c:1530 sql_help.c:1534 sql_help.c:2137 -#: sql_help.c:2227 sql_help.c:2423 sql_help.c:2603 sql_help.c:2747 -#: sql_help.c:3020 sql_help.c:3887 +#: sql_help.c:451 sql_help.c:456 sql_help.c:1054 sql_help.c:1302 +#: sql_help.c:1307 sql_help.c:1561 sql_help.c:1565 sql_help.c:2187 +#: sql_help.c:2275 sql_help.c:2480 sql_help.c:2663 sql_help.c:2816 +#: sql_help.c:3092 sql_help.c:3999 msgid "data_type" msgstr "数据_类型" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1280 sql_help.c:1285 -#: sql_help.c:1531 sql_help.c:1535 sql_help.c:2138 sql_help.c:2230 -#: sql_help.c:2348 sql_help.c:2748 sql_help.c:2756 sql_help.c:2769 -#: sql_help.c:2783 sql_help.c:3021 sql_help.c:3027 sql_help.c:3795 +#: sql_help.c:452 sql_help.c:457 sql_help.c:1303 sql_help.c:1308 +#: sql_help.c:1562 sql_help.c:1566 sql_help.c:2188 sql_help.c:2278 +#: sql_help.c:2403 sql_help.c:2818 sql_help.c:2826 sql_help.c:2839 +#: sql_help.c:2853 sql_help.c:3093 sql_help.c:3099 sql_help.c:3907 msgid "collation" msgstr "校对规则" -#: sql_help.c:453 sql_help.c:1281 sql_help.c:2231 sql_help.c:2240 -#: sql_help.c:2749 sql_help.c:2765 sql_help.c:2778 +#: sql_help.c:453 sql_help.c:1304 sql_help.c:2279 sql_help.c:2288 +#: sql_help.c:2819 sql_help.c:2835 sql_help.c:2848 msgid "column_constraint" msgstr "列约束" -#: sql_help.c:463 sql_help.c:603 sql_help.c:674 sql_help.c:1298 +#: sql_help.c:463 sql_help.c:605 sql_help.c:677 sql_help.c:1322 sql_help.c:4801 msgid "integer" msgstr "整数" -#: sql_help.c:465 sql_help.c:468 sql_help.c:676 sql_help.c:679 sql_help.c:1300 -#: sql_help.c:1303 +#: sql_help.c:465 sql_help.c:468 sql_help.c:679 sql_help.c:682 sql_help.c:1324 +#: sql_help.c:1327 msgid "attribute_option" msgstr "属性选项" -#: sql_help.c:473 sql_help.c:1305 sql_help.c:2232 sql_help.c:2241 -#: sql_help.c:2750 sql_help.c:2766 sql_help.c:2779 +#: sql_help.c:473 sql_help.c:1331 sql_help.c:2280 sql_help.c:2289 +#: sql_help.c:2820 sql_help.c:2836 sql_help.c:2849 msgid "table_constraint" msgstr "表约束" -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1310 -#: sql_help.c:1311 sql_help.c:1312 sql_help.c:1313 sql_help.c:1825 +#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1336 +#: sql_help.c:1337 sql_help.c:1338 sql_help.c:1339 sql_help.c:1873 msgid "trigger_name" msgstr "触发器_名称" -#: sql_help.c:480 sql_help.c:481 sql_help.c:1323 sql_help.c:1324 -#: sql_help.c:2233 sql_help.c:2238 sql_help.c:2753 sql_help.c:2776 +#: sql_help.c:480 sql_help.c:481 sql_help.c:1349 sql_help.c:1350 +#: sql_help.c:2281 sql_help.c:2286 sql_help.c:2823 sql_help.c:2846 msgid "parent_table" msgstr "父表" -#: sql_help.c:539 sql_help.c:595 sql_help.c:661 sql_help.c:861 sql_help.c:999 -#: sql_help.c:1491 sql_help.c:2169 +#: sql_help.c:540 sql_help.c:597 sql_help.c:664 sql_help.c:866 sql_help.c:1006 +#: sql_help.c:1518 sql_help.c:2218 msgid "extension_name" msgstr "extension_name(扩展名)" -#: sql_help.c:541 sql_help.c:1001 sql_help.c:2288 +#: sql_help.c:542 sql_help.c:1008 sql_help.c:2338 msgid "execution_cost" msgstr "执行函数的开销" -#: sql_help.c:542 sql_help.c:1002 sql_help.c:2289 +#: sql_help.c:543 sql_help.c:1009 sql_help.c:2339 msgid "result_rows" msgstr "返回记录的数量" -#: sql_help.c:543 sql_help.c:2290 +#: sql_help.c:544 sql_help.c:2340 msgid "support_function" msgstr "支持_函数" -#: sql_help.c:564 sql_help.c:566 sql_help.c:925 sql_help.c:933 sql_help.c:937 -#: sql_help.c:940 sql_help.c:943 sql_help.c:1569 sql_help.c:1577 -#: sql_help.c:1581 sql_help.c:1584 sql_help.c:1587 sql_help.c:2581 -#: sql_help.c:2583 sql_help.c:2586 sql_help.c:2587 sql_help.c:3703 -#: sql_help.c:3707 sql_help.c:3710 sql_help.c:3712 sql_help.c:3714 -#: sql_help.c:3716 sql_help.c:3718 sql_help.c:3724 sql_help.c:3726 -#: sql_help.c:3728 sql_help.c:3730 sql_help.c:3732 sql_help.c:3734 +#: sql_help.c:566 sql_help.c:568 sql_help.c:931 sql_help.c:939 sql_help.c:943 +#: sql_help.c:946 sql_help.c:949 sql_help.c:1601 sql_help.c:1609 +#: sql_help.c:1613 sql_help.c:1616 sql_help.c:1619 sql_help.c:2641 +#: sql_help.c:2643 sql_help.c:2646 sql_help.c:2647 sql_help.c:3801 +#: sql_help.c:3802 sql_help.c:3806 sql_help.c:3807 sql_help.c:3810 +#: sql_help.c:3811 sql_help.c:3813 sql_help.c:3814 sql_help.c:3816 +#: sql_help.c:3817 sql_help.c:3819 sql_help.c:3820 sql_help.c:3822 +#: sql_help.c:3823 sql_help.c:3829 sql_help.c:3830 sql_help.c:3832 +#: sql_help.c:3833 sql_help.c:3835 sql_help.c:3836 sql_help.c:3838 +#: sql_help.c:3839 sql_help.c:3841 sql_help.c:3842 sql_help.c:3844 +#: sql_help.c:3845 sql_help.c:3847 sql_help.c:3848 sql_help.c:4181 +#: sql_help.c:4182 sql_help.c:4186 sql_help.c:4187 sql_help.c:4190 +#: sql_help.c:4191 sql_help.c:4193 sql_help.c:4194 sql_help.c:4196 +#: sql_help.c:4197 sql_help.c:4199 sql_help.c:4200 sql_help.c:4202 +#: sql_help.c:4203 sql_help.c:4209 sql_help.c:4210 sql_help.c:4212 +#: sql_help.c:4213 sql_help.c:4215 sql_help.c:4216 sql_help.c:4218 +#: sql_help.c:4219 sql_help.c:4221 sql_help.c:4222 sql_help.c:4224 +#: sql_help.c:4225 sql_help.c:4227 sql_help.c:4228 msgid "role_specification" msgstr "role_specification" -#: sql_help.c:565 sql_help.c:567 sql_help.c:1600 sql_help.c:2112 -#: sql_help.c:2589 sql_help.c:3096 sql_help.c:3541 sql_help.c:4376 +#: sql_help.c:567 sql_help.c:569 sql_help.c:1632 sql_help.c:2161 +#: sql_help.c:2649 sql_help.c:3170 sql_help.c:3621 sql_help.c:4547 msgid "user_name" msgstr "用户名" -#: sql_help.c:568 sql_help.c:945 sql_help.c:1589 sql_help.c:2588 -#: sql_help.c:3735 +#: sql_help.c:570 sql_help.c:951 sql_help.c:1621 sql_help.c:2648 +#: sql_help.c:3849 sql_help.c:4229 msgid "where role_specification can be:" msgstr "这里role_specification可以是:" -#: sql_help.c:570 +#: sql_help.c:572 msgid "group_name" msgstr "组名称" -#: sql_help.c:591 sql_help.c:1369 sql_help.c:2117 sql_help.c:2353 -#: sql_help.c:2387 sql_help.c:2761 sql_help.c:2774 sql_help.c:2788 -#: sql_help.c:2829 sql_help.c:2853 sql_help.c:2865 sql_help.c:3731 -#: sql_help.c:4064 +#: sql_help.c:593 sql_help.c:1396 sql_help.c:2167 sql_help.c:2410 +#: sql_help.c:2444 sql_help.c:2831 sql_help.c:2844 sql_help.c:2858 +#: sql_help.c:2899 sql_help.c:2923 sql_help.c:2935 sql_help.c:3840 +#: sql_help.c:4220 msgid "tablespace_name" msgstr "表空间的名称" -#: sql_help.c:593 sql_help.c:681 sql_help.c:1318 sql_help.c:1327 -#: sql_help.c:1364 sql_help.c:1705 +#: sql_help.c:595 sql_help.c:686 sql_help.c:1344 sql_help.c:1353 +#: sql_help.c:1391 sql_help.c:1748 sql_help.c:1751 msgid "index_name" msgstr "索引名称" -#: sql_help.c:597 sql_help.c:600 sql_help.c:682 sql_help.c:684 sql_help.c:1320 -#: sql_help.c:1322 sql_help.c:1367 sql_help.c:2351 sql_help.c:2385 -#: sql_help.c:2759 sql_help.c:2772 sql_help.c:2786 sql_help.c:2827 -#: sql_help.c:2851 +#: sql_help.c:599 sql_help.c:602 sql_help.c:687 sql_help.c:689 sql_help.c:1346 +#: sql_help.c:1348 sql_help.c:1394 sql_help.c:2408 sql_help.c:2442 +#: sql_help.c:2829 sql_help.c:2842 sql_help.c:2856 sql_help.c:2897 +#: sql_help.c:2921 msgid "storage_parameter" msgstr "存储参数" -#: sql_help.c:602 +#: sql_help.c:604 msgid "column_number" msgstr "列数" -#: sql_help.c:626 sql_help.c:1788 sql_help.c:4151 +#: sql_help.c:628 sql_help.c:1836 sql_help.c:4312 msgid "large_object_oid" msgstr "大对象的OID" -#: sql_help.c:713 sql_help.c:2408 +#: sql_help.c:685 sql_help.c:1330 sql_help.c:2817 +msgid "compression_method" +msgstr "压缩方法" + +#: sql_help.c:718 sql_help.c:2465 msgid "res_proc" msgstr "限制选择性估算函数" -#: sql_help.c:714 sql_help.c:2409 +#: sql_help.c:719 sql_help.c:2466 msgid "join_proc" msgstr "连接选择性估算函数" -#: sql_help.c:766 sql_help.c:778 sql_help.c:2426 +#: sql_help.c:771 sql_help.c:783 sql_help.c:2483 msgid "strategy_number" msgstr "访问索引所用方法的编号" -#: sql_help.c:768 sql_help.c:769 sql_help.c:772 sql_help.c:773 sql_help.c:779 -#: sql_help.c:780 sql_help.c:782 sql_help.c:783 sql_help.c:2428 -#: sql_help.c:2429 sql_help.c:2432 sql_help.c:2433 +#: sql_help.c:773 sql_help.c:774 sql_help.c:777 sql_help.c:778 sql_help.c:784 +#: sql_help.c:785 sql_help.c:787 sql_help.c:788 sql_help.c:2485 sql_help.c:2486 +#: sql_help.c:2489 sql_help.c:2490 msgid "op_type" msgstr "操作数类型" -#: sql_help.c:770 sql_help.c:2430 +#: sql_help.c:775 sql_help.c:2487 msgid "sort_family_name" msgstr "sort_family_name(排序家族名)" -#: sql_help.c:771 sql_help.c:781 sql_help.c:2431 +#: sql_help.c:776 sql_help.c:786 sql_help.c:2488 msgid "support_number" msgstr "访问索引所使用函数的编号" -#: sql_help.c:775 sql_help.c:2054 sql_help.c:2435 sql_help.c:2942 -#: sql_help.c:2944 +#: sql_help.c:780 sql_help.c:2102 sql_help.c:2492 sql_help.c:3012 +#: sql_help.c:3014 msgid "argument_type" msgstr "参数类型" -#: sql_help.c:806 sql_help.c:809 sql_help.c:880 sql_help.c:882 sql_help.c:884 -#: sql_help.c:1015 sql_help.c:1054 sql_help.c:1487 sql_help.c:1490 -#: sql_help.c:1655 sql_help.c:1704 sql_help.c:1773 sql_help.c:1798 -#: sql_help.c:1811 sql_help.c:1826 sql_help.c:1883 sql_help.c:1889 -#: sql_help.c:2225 sql_help.c:2237 sql_help.c:2344 sql_help.c:2382 -#: sql_help.c:2459 sql_help.c:2502 sql_help.c:2558 sql_help.c:2609 -#: sql_help.c:2640 sql_help.c:2745 sql_help.c:2762 sql_help.c:2775 -#: sql_help.c:2848 sql_help.c:2968 sql_help.c:3145 sql_help.c:3362 -#: sql_help.c:3411 sql_help.c:3517 sql_help.c:3701 sql_help.c:3706 -#: sql_help.c:3751 sql_help.c:3783 sql_help.c:4034 sql_help.c:4039 -#: sql_help.c:4139 sql_help.c:4246 sql_help.c:4248 sql_help.c:4297 -#: sql_help.c:4336 sql_help.c:4485 sql_help.c:4487 sql_help.c:4536 -#: sql_help.c:4570 sql_help.c:4619 sql_help.c:4703 sql_help.c:4705 -#: sql_help.c:4754 +#: sql_help.c:811 sql_help.c:814 sql_help.c:885 sql_help.c:887 sql_help.c:889 +#: sql_help.c:1022 sql_help.c:1061 sql_help.c:1514 sql_help.c:1517 +#: sql_help.c:1693 sql_help.c:1747 sql_help.c:1750 sql_help.c:1821 +#: sql_help.c:1846 sql_help.c:1859 sql_help.c:1874 sql_help.c:1931 +#: sql_help.c:1937 sql_help.c:2273 sql_help.c:2285 sql_help.c:2399 +#: sql_help.c:2439 sql_help.c:2516 sql_help.c:2561 sql_help.c:2617 +#: sql_help.c:2669 sql_help.c:2702 sql_help.c:2709 sql_help.c:2814 +#: sql_help.c:2832 sql_help.c:2845 sql_help.c:2918 sql_help.c:3038 +#: sql_help.c:3219 sql_help.c:3442 sql_help.c:3491 sql_help.c:3597 +#: sql_help.c:3799 sql_help.c:3805 sql_help.c:3863 sql_help.c:3895 +#: sql_help.c:4179 sql_help.c:4185 sql_help.c:4300 sql_help.c:4409 +#: sql_help.c:4411 sql_help.c:4468 sql_help.c:4507 sql_help.c:4658 +#: sql_help.c:4660 sql_help.c:4717 sql_help.c:4751 sql_help.c:4803 +#: sql_help.c:4889 sql_help.c:4891 sql_help.c:4948 msgid "table_name" msgstr "表名" -#: sql_help.c:811 sql_help.c:2461 +#: sql_help.c:816 sql_help.c:2518 msgid "using_expression" msgstr "使用表达式" -#: sql_help.c:812 sql_help.c:2462 +#: sql_help.c:817 sql_help.c:2519 msgid "check_expression" msgstr "检查表达式" -#: sql_help.c:886 sql_help.c:2503 +#: sql_help.c:891 sql_help.c:2562 msgid "publication_parameter" msgstr "发布参数" -#: sql_help.c:929 sql_help.c:1573 sql_help.c:2323 sql_help.c:2535 -#: sql_help.c:3079 +#: sql_help.c:935 sql_help.c:1605 sql_help.c:2378 sql_help.c:2594 +#: sql_help.c:3153 msgid "password" msgstr "口令" -#: sql_help.c:930 sql_help.c:1574 sql_help.c:2324 sql_help.c:2536 -#: sql_help.c:3080 +#: sql_help.c:936 sql_help.c:1606 sql_help.c:2379 sql_help.c:2595 +#: sql_help.c:3154 msgid "timestamp" msgstr "时间戳" -#: sql_help.c:934 sql_help.c:938 sql_help.c:941 sql_help.c:944 sql_help.c:1578 -#: sql_help.c:1582 sql_help.c:1585 sql_help.c:1588 sql_help.c:3711 -#: sql_help.c:4044 +#: sql_help.c:940 sql_help.c:944 sql_help.c:947 sql_help.c:950 sql_help.c:1610 +#: sql_help.c:1614 sql_help.c:1617 sql_help.c:1620 sql_help.c:3812 +#: sql_help.c:4192 msgid "database_name" msgstr "数据库名称" -#: sql_help.c:1048 sql_help.c:2604 +#: sql_help.c:1055 sql_help.c:2664 msgid "increment" msgstr "增量" -#: sql_help.c:1049 sql_help.c:2605 +#: sql_help.c:1056 sql_help.c:2665 msgid "minvalue" msgstr "最小值" -#: sql_help.c:1050 sql_help.c:2606 +#: sql_help.c:1057 sql_help.c:2666 msgid "maxvalue" msgstr "最大值" -#: sql_help.c:1051 sql_help.c:2607 sql_help.c:4244 sql_help.c:4334 -#: sql_help.c:4483 sql_help.c:4636 sql_help.c:4701 +#: sql_help.c:1058 sql_help.c:2667 sql_help.c:4407 sql_help.c:4505 +#: sql_help.c:4656 sql_help.c:4820 sql_help.c:4887 msgid "start" msgstr "起始值" -#: sql_help.c:1052 sql_help.c:1295 +#: sql_help.c:1059 sql_help.c:1319 msgid "restart" msgstr "重新启动后的序列值" -#: sql_help.c:1053 sql_help.c:2608 +#: sql_help.c:1060 sql_help.c:2668 msgid "cache" msgstr "缓存" -#: sql_help.c:1110 sql_help.c:2652 +#: sql_help.c:1104 +msgid "new_target" +msgstr "新目标" + +#: sql_help.c:1122 sql_help.c:2721 msgid "conninfo" msgstr "连接信息" -#: sql_help.c:1112 sql_help.c:2653 +#: sql_help.c:1124 sql_help.c:1128 sql_help.c:1132 sql_help.c:2722 msgid "publication_name" msgstr "发布名" -#: sql_help.c:1113 -msgid "set_publication_option" -msgstr "设置发布选项" +#: sql_help.c:1125 sql_help.c:1129 sql_help.c:1133 +msgid "publication_option" +msgstr "发布选项" -#: sql_help.c:1116 +#: sql_help.c:1136 msgid "refresh_option" msgstr "refresh选项" -#: sql_help.c:1121 sql_help.c:2654 +#: sql_help.c:1141 sql_help.c:2723 msgid "subscription_parameter" msgstr "订阅参数" -#: sql_help.c:1273 sql_help.c:1276 +#: sql_help.c:1296 sql_help.c:1299 msgid "partition_name" msgstr "分区名" -#: sql_help.c:1274 sql_help.c:2242 sql_help.c:2780 +#: sql_help.c:1297 sql_help.c:2290 sql_help.c:2850 msgid "partition_bound_spec" msgstr "分区绑定规范" -#: sql_help.c:1292 sql_help.c:1338 sql_help.c:2794 +#: sql_help.c:1316 sql_help.c:1365 sql_help.c:2864 msgid "sequence_options" msgstr "序列选项" -#: sql_help.c:1294 +#: sql_help.c:1318 msgid "sequence_option" msgstr "序列选项" -#: sql_help.c:1306 +#: sql_help.c:1332 msgid "table_constraint_using_index" msgstr "table_constraint_using_index(表约束使用索引)" -#: sql_help.c:1314 sql_help.c:1315 sql_help.c:1316 sql_help.c:1317 +#: sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 sql_help.c:1343 msgid "rewrite_rule_name" msgstr "重写规则名称" -#: sql_help.c:1328 sql_help.c:2819 +#: sql_help.c:1354 sql_help.c:2889 msgid "and partition_bound_spec is:" msgstr "并且分区绑定的规范是:" -#: sql_help.c:1329 sql_help.c:1330 sql_help.c:1331 sql_help.c:2820 -#: sql_help.c:2821 sql_help.c:2822 +#: sql_help.c:1355 sql_help.c:1356 sql_help.c:1357 sql_help.c:2890 +#: sql_help.c:2891 sql_help.c:2892 msgid "partition_bound_expr" msgstr "分区_绑定_表达式" -#: sql_help.c:1332 sql_help.c:1333 sql_help.c:2823 sql_help.c:2824 +#: sql_help.c:1358 sql_help.c:1359 sql_help.c:2893 sql_help.c:2894 msgid "numeric_literal" msgstr "数字_文字" -#: sql_help.c:1334 +#: sql_help.c:1360 msgid "and column_constraint is:" msgstr "并且列的约束是:" -#: sql_help.c:1337 sql_help.c:2249 sql_help.c:2282 sql_help.c:2482 -#: sql_help.c:2792 +#: sql_help.c:1363 sql_help.c:2297 sql_help.c:2332 sql_help.c:2540 +#: sql_help.c:2862 msgid "default_expr" msgstr "默认_表达式" -#: sql_help.c:1339 sql_help.c:1340 sql_help.c:1349 sql_help.c:1351 -#: sql_help.c:1355 sql_help.c:2795 sql_help.c:2796 sql_help.c:2805 -#: sql_help.c:2807 sql_help.c:2811 +#: sql_help.c:1364 sql_help.c:2298 sql_help.c:2863 +msgid "generation_expr" +msgstr "生成表_达式" + +#: sql_help.c:1366 sql_help.c:1367 sql_help.c:1376 sql_help.c:1378 +#: sql_help.c:1382 sql_help.c:2865 sql_help.c:2866 sql_help.c:2875 +#: sql_help.c:2877 sql_help.c:2881 msgid "index_parameters" msgstr "索引参数" -#: sql_help.c:1341 sql_help.c:1358 sql_help.c:2797 sql_help.c:2814 +#: sql_help.c:1368 sql_help.c:1385 sql_help.c:2867 sql_help.c:2884 msgid "reftable" msgstr "所引用的表" -#: sql_help.c:1342 sql_help.c:1359 sql_help.c:2798 sql_help.c:2815 +#: sql_help.c:1369 sql_help.c:1386 sql_help.c:2868 sql_help.c:2885 msgid "refcolumn" msgstr "所引用的列" -#: sql_help.c:1343 sql_help.c:1344 sql_help.c:1360 sql_help.c:1361 -#: sql_help.c:2799 sql_help.c:2800 sql_help.c:2816 sql_help.c:2817 +#: sql_help.c:1370 sql_help.c:1371 sql_help.c:1387 sql_help.c:1388 +#: sql_help.c:2869 sql_help.c:2870 sql_help.c:2886 sql_help.c:2887 msgid "referential_action" msgstr "参考_行动" -#: sql_help.c:1345 sql_help.c:2251 sql_help.c:2801 +#: sql_help.c:1372 sql_help.c:2299 sql_help.c:2871 msgid "and table_constraint is:" msgstr "表约束是:" -#: sql_help.c:1353 sql_help.c:2809 +#: sql_help.c:1380 sql_help.c:2879 msgid "exclude_element" msgstr "排除项" -#: sql_help.c:1354 sql_help.c:2810 sql_help.c:4242 sql_help.c:4332 -#: sql_help.c:4481 sql_help.c:4634 sql_help.c:4699 +#: sql_help.c:1381 sql_help.c:2880 sql_help.c:4405 sql_help.c:4503 +#: sql_help.c:4654 sql_help.c:4818 sql_help.c:4885 msgid "operator" msgstr "运算子" -#: sql_help.c:1356 sql_help.c:2354 sql_help.c:2812 +#: sql_help.c:1383 sql_help.c:2411 sql_help.c:2882 msgid "predicate" msgstr "述词" -#: sql_help.c:1362 +#: sql_help.c:1389 msgid "and table_constraint_using_index is:" msgstr "table_constraint_using_index 是:" -#: sql_help.c:1365 sql_help.c:2825 +#: sql_help.c:1392 sql_help.c:2895 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "在UNIQUE, PRIMARY KEY和EXCLUDE中的索引参数是:" -#: sql_help.c:1370 sql_help.c:2830 +#: sql_help.c:1397 sql_help.c:2900 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "在EXCLUDE约束中的排除项是:" -#: sql_help.c:1373 sql_help.c:2349 sql_help.c:2757 sql_help.c:2770 -#: sql_help.c:2784 sql_help.c:2833 sql_help.c:3796 +#: sql_help.c:1400 sql_help.c:2404 sql_help.c:2827 sql_help.c:2840 +#: sql_help.c:2854 sql_help.c:2903 sql_help.c:3908 msgid "opclass" msgstr "操作符类型的名称" -#: sql_help.c:1389 sql_help.c:1392 sql_help.c:2868 +#: sql_help.c:1416 sql_help.c:1419 sql_help.c:2938 msgid "tablespace_option" msgstr "表空间_选项" -#: sql_help.c:1413 sql_help.c:1416 sql_help.c:1422 sql_help.c:1426 +#: sql_help.c:1440 sql_help.c:1443 sql_help.c:1449 sql_help.c:1453 msgid "token_type" msgstr "符号类型" -#: sql_help.c:1414 sql_help.c:1417 +#: sql_help.c:1441 sql_help.c:1444 msgid "dictionary_name" msgstr "字典名称" -#: sql_help.c:1419 sql_help.c:1423 +#: sql_help.c:1446 sql_help.c:1450 msgid "old_dictionary" msgstr "旧的字典" -#: sql_help.c:1420 sql_help.c:1424 +#: sql_help.c:1447 sql_help.c:1451 msgid "new_dictionary" msgstr "新的字典" -#: sql_help.c:1516 sql_help.c:1529 sql_help.c:1532 sql_help.c:1533 -#: sql_help.c:3019 +#: sql_help.c:1546 sql_help.c:1560 sql_help.c:1563 sql_help.c:1564 +#: sql_help.c:3091 msgid "attribute_name" msgstr "属性_名称" -#: sql_help.c:1517 +#: sql_help.c:1547 msgid "new_attribute_name" msgstr "new_attribute_name(新属性名)" -#: sql_help.c:1523 sql_help.c:1527 +#: sql_help.c:1551 sql_help.c:1555 msgid "new_enum_value" msgstr "new_enum_value(新枚举名)" -#: sql_help.c:1524 +#: sql_help.c:1552 msgid "neighbor_enum_value" msgstr "相邻的枚举值" -#: sql_help.c:1526 +#: sql_help.c:1554 msgid "existing_enum_value" msgstr "现有枚举值" -#: sql_help.c:1601 sql_help.c:2234 sql_help.c:2243 sql_help.c:2620 -#: sql_help.c:3097 sql_help.c:3542 sql_help.c:3717 sql_help.c:3752 -#: sql_help.c:4050 +#: sql_help.c:1557 +msgid "property" +msgstr "属性" + +#: sql_help.c:1633 sql_help.c:2282 sql_help.c:2291 sql_help.c:2680 +#: sql_help.c:3171 sql_help.c:3622 sql_help.c:3821 sql_help.c:3864 +#: sql_help.c:4201 msgid "server_name" msgstr "服务器名称" -#: sql_help.c:1629 sql_help.c:1632 sql_help.c:3112 +#: sql_help.c:1665 sql_help.c:1668 sql_help.c:3186 msgid "view_option_name" msgstr "view_option_name(视图选项名)" -#: sql_help.c:1630 sql_help.c:3113 +#: sql_help.c:1666 sql_help.c:3187 msgid "view_option_value" msgstr "view_option_value(视图选项值)" -#: sql_help.c:1651 sql_help.c:1652 sql_help.c:4607 sql_help.c:4608 +#: sql_help.c:1687 sql_help.c:1688 sql_help.c:4790 sql_help.c:4791 msgid "table_and_columns" msgstr "表和列" -#: sql_help.c:1653 sql_help.c:1895 sql_help.c:3589 sql_help.c:4609 +#: sql_help.c:1689 sql_help.c:1752 sql_help.c:1943 sql_help.c:3670 +#: sql_help.c:4043 sql_help.c:4792 msgid "where option can be one of:" msgstr "选项可以是下列内容之一:" -#: sql_help.c:1654 sql_help.c:4618 +#: sql_help.c:1690 sql_help.c:1691 sql_help.c:1753 sql_help.c:1945 +#: sql_help.c:1948 sql_help.c:2127 sql_help.c:3671 sql_help.c:3672 +#: sql_help.c:3673 sql_help.c:3674 sql_help.c:3675 sql_help.c:3676 +#: sql_help.c:3677 sql_help.c:3678 sql_help.c:4044 sql_help.c:4046 +#: sql_help.c:4793 sql_help.c:4794 sql_help.c:4795 sql_help.c:4796 +#: sql_help.c:4797 sql_help.c:4798 sql_help.c:4799 sql_help.c:4800 +msgid "boolean" +msgstr "布尔" + +#: sql_help.c:1692 sql_help.c:4802 msgid "and table_and_columns is:" msgstr "并且表和列:" -#: sql_help.c:1670 sql_help.c:4392 sql_help.c:4394 sql_help.c:4418 +#: sql_help.c:1708 sql_help.c:4563 sql_help.c:4565 sql_help.c:4589 msgid "transaction_mode" msgstr "事务模式" -#: sql_help.c:1671 sql_help.c:4395 sql_help.c:4419 +#: sql_help.c:1709 sql_help.c:4566 sql_help.c:4590 msgid "where transaction_mode is one of:" msgstr "事务模式可以是下列选项之一:" -#: sql_help.c:1680 sql_help.c:4252 sql_help.c:4261 sql_help.c:4265 -#: sql_help.c:4269 sql_help.c:4272 sql_help.c:4491 sql_help.c:4500 -#: sql_help.c:4504 sql_help.c:4508 sql_help.c:4511 sql_help.c:4709 -#: sql_help.c:4718 sql_help.c:4722 sql_help.c:4726 sql_help.c:4729 +#: sql_help.c:1718 sql_help.c:4415 sql_help.c:4424 sql_help.c:4428 +#: sql_help.c:4432 sql_help.c:4435 sql_help.c:4664 sql_help.c:4673 +#: sql_help.c:4677 sql_help.c:4681 sql_help.c:4684 sql_help.c:4895 +#: sql_help.c:4904 sql_help.c:4908 sql_help.c:4912 sql_help.c:4915 msgid "argument" msgstr "参数" -#: sql_help.c:1770 +#: sql_help.c:1818 msgid "relation_name" msgstr "relation_name(关系名)" -#: sql_help.c:1775 sql_help.c:3713 sql_help.c:4046 +#: sql_help.c:1823 sql_help.c:3815 sql_help.c:4195 msgid "domain_name" msgstr "域_名称" -#: sql_help.c:1797 +#: sql_help.c:1845 msgid "policy_name" msgstr "policy_name" -#: sql_help.c:1810 +#: sql_help.c:1858 msgid "rule_name" msgstr "规则_名称" -#: sql_help.c:1829 +#: sql_help.c:1877 msgid "text" msgstr "文本" -#: sql_help.c:1854 sql_help.c:3896 sql_help.c:4084 +#: sql_help.c:1902 sql_help.c:4008 sql_help.c:4245 msgid "transaction_id" msgstr "事务_ID" -#: sql_help.c:1885 sql_help.c:1892 sql_help.c:3822 +#: sql_help.c:1933 sql_help.c:1940 sql_help.c:3934 msgid "filename" msgstr "文件名" -#: sql_help.c:1886 sql_help.c:1893 sql_help.c:2560 sql_help.c:2561 -#: sql_help.c:2562 +#: sql_help.c:1934 sql_help.c:1941 sql_help.c:2619 sql_help.c:2620 +#: sql_help.c:2621 msgid "command" msgstr "命令" -#: sql_help.c:1888 sql_help.c:2559 sql_help.c:2971 sql_help.c:3148 -#: sql_help.c:3806 sql_help.c:4235 sql_help.c:4237 sql_help.c:4325 -#: sql_help.c:4327 sql_help.c:4474 sql_help.c:4476 sql_help.c:4579 -#: sql_help.c:4692 sql_help.c:4694 +#: sql_help.c:1936 sql_help.c:2618 sql_help.c:3041 sql_help.c:3222 +#: sql_help.c:3918 sql_help.c:4398 sql_help.c:4400 sql_help.c:4496 +#: sql_help.c:4498 sql_help.c:4647 sql_help.c:4649 sql_help.c:4760 +#: sql_help.c:4878 sql_help.c:4880 msgid "condition" msgstr "条件" -#: sql_help.c:1891 sql_help.c:2388 sql_help.c:2854 sql_help.c:3114 -#: sql_help.c:3132 sql_help.c:3787 +#: sql_help.c:1939 sql_help.c:2445 sql_help.c:2924 sql_help.c:3188 +#: sql_help.c:3206 sql_help.c:3899 msgid "query" msgstr "查询" -#: sql_help.c:1896 +#: sql_help.c:1944 msgid "format_name" msgstr "格式_名称" -#: sql_help.c:1897 sql_help.c:1900 sql_help.c:2079 sql_help.c:3590 -#: sql_help.c:3591 sql_help.c:3592 sql_help.c:3593 sql_help.c:3594 -#: sql_help.c:3595 sql_help.c:3596 sql_help.c:4610 sql_help.c:4611 -#: sql_help.c:4612 sql_help.c:4613 sql_help.c:4614 sql_help.c:4615 -#: sql_help.c:4616 sql_help.c:4617 -msgid "boolean" -msgstr "布尔" - -#: sql_help.c:1898 +#: sql_help.c:1946 msgid "delimiter_character" msgstr "分隔字符" -#: sql_help.c:1899 +#: sql_help.c:1947 msgid "null_string" msgstr "空字符串" -#: sql_help.c:1901 +#: sql_help.c:1949 msgid "quote_character" msgstr "引用字符" -#: sql_help.c:1902 +#: sql_help.c:1950 msgid "escape_character" msgstr "转义字符" -#: sql_help.c:1906 +#: sql_help.c:1954 msgid "encoding_name" msgstr "encoding_name(编码名)" -#: sql_help.c:1917 +#: sql_help.c:1965 msgid "access_method_type" msgstr "access_method_type" -#: sql_help.c:1988 sql_help.c:2007 sql_help.c:2010 +#: sql_help.c:2036 sql_help.c:2055 sql_help.c:2058 msgid "arg_data_type" msgstr "arg_data_type" -#: sql_help.c:1989 sql_help.c:2011 sql_help.c:2019 +#: sql_help.c:2037 sql_help.c:2059 sql_help.c:2067 msgid "sfunc" msgstr "状态转换函数名称" -#: sql_help.c:1990 sql_help.c:2012 sql_help.c:2020 +#: sql_help.c:2038 sql_help.c:2060 sql_help.c:2068 msgid "state_data_type" msgstr "状态值的数据类型" -#: sql_help.c:1991 sql_help.c:2013 sql_help.c:2021 +#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069 msgid "state_data_size" msgstr "state_data_size" -#: sql_help.c:1992 sql_help.c:2014 sql_help.c:2022 +#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070 msgid "ffunc" msgstr "计算最终结果集的函数名称" -#: sql_help.c:1993 sql_help.c:2023 +#: sql_help.c:2041 sql_help.c:2071 msgid "combinefunc" msgstr "combinefunc" -#: sql_help.c:1994 sql_help.c:2024 +#: sql_help.c:2042 sql_help.c:2072 msgid "serialfunc" msgstr "serialfunc" -#: sql_help.c:1995 sql_help.c:2025 +#: sql_help.c:2043 sql_help.c:2073 msgid "deserialfunc" msgstr "deserialfunc" -#: sql_help.c:1996 sql_help.c:2015 sql_help.c:2026 +#: sql_help.c:2044 sql_help.c:2063 sql_help.c:2074 msgid "initial_condition" msgstr "初始条件" -#: sql_help.c:1997 sql_help.c:2027 +#: sql_help.c:2045 sql_help.c:2075 msgid "msfunc" msgstr "msfunc" -#: sql_help.c:1998 sql_help.c:2028 +#: sql_help.c:2046 sql_help.c:2076 msgid "minvfunc" msgstr "minvfunc" -#: sql_help.c:1999 sql_help.c:2029 +#: sql_help.c:2047 sql_help.c:2077 msgid "mstate_data_type" msgstr "mstate_data_type" -#: sql_help.c:2000 sql_help.c:2030 +#: sql_help.c:2048 sql_help.c:2078 msgid "mstate_data_size" msgstr "mstate_data_size" -#: sql_help.c:2001 sql_help.c:2031 +#: sql_help.c:2049 sql_help.c:2079 msgid "mffunc" msgstr "mffunc" -#: sql_help.c:2002 sql_help.c:2032 +#: sql_help.c:2050 sql_help.c:2080 msgid "minitial_condition" msgstr "minitial_condition" -#: sql_help.c:2003 sql_help.c:2033 +#: sql_help.c:2051 sql_help.c:2081 msgid "sort_operator" msgstr "排序_操作符" -#: sql_help.c:2016 +#: sql_help.c:2064 msgid "or the old syntax" msgstr "或者是旧的语法" -#: sql_help.c:2018 +#: sql_help.c:2066 msgid "base_type" msgstr "基础_类型" -#: sql_help.c:2075 +#: sql_help.c:2123 sql_help.c:2164 msgid "locale" msgstr "本地化语言" -#: sql_help.c:2076 sql_help.c:2115 +#: sql_help.c:2124 sql_help.c:2165 msgid "lc_collate" msgstr "排序规则" -#: sql_help.c:2077 sql_help.c:2116 +#: sql_help.c:2125 sql_help.c:2166 msgid "lc_ctype" msgstr "字符分类" -#: sql_help.c:2078 sql_help.c:4137 +#: sql_help.c:2126 sql_help.c:4298 msgid "provider" msgstr "provider(提供者)" -#: sql_help.c:2080 sql_help.c:2171 +#: sql_help.c:2128 sql_help.c:2220 msgid "version" msgstr "version(版本)" -#: sql_help.c:2082 +#: sql_help.c:2130 msgid "existing_collation" msgstr "existing_collation(当前的本地化语言)" -#: sql_help.c:2092 +#: sql_help.c:2140 msgid "source_encoding" msgstr "源_编码" -#: sql_help.c:2093 +#: sql_help.c:2141 msgid "dest_encoding" msgstr "目的_编码" -#: sql_help.c:2113 sql_help.c:2894 +#: sql_help.c:2162 sql_help.c:2964 msgid "template" msgstr "模版" -#: sql_help.c:2114 +#: sql_help.c:2163 msgid "encoding" msgstr "字符集编码" -#: sql_help.c:2140 +#: sql_help.c:2190 msgid "constraint" msgstr "约束" -#: sql_help.c:2141 +#: sql_help.c:2191 msgid "where constraint is:" msgstr "约束是:" -#: sql_help.c:2155 sql_help.c:2557 sql_help.c:2967 +#: sql_help.c:2205 sql_help.c:2616 sql_help.c:3037 msgid "event" msgstr "事件" -#: sql_help.c:2156 +#: sql_help.c:2206 msgid "filter_variable" msgstr "过滤器变量" -#: sql_help.c:2172 -msgid "old_version" -msgstr "老版本" - -#: sql_help.c:2246 sql_help.c:2789 +#: sql_help.c:2294 sql_help.c:2859 msgid "where column_constraint is:" msgstr "列的约束是:" -#: sql_help.c:2250 sql_help.c:2793 -msgid "generation_expr" -msgstr "生成表_达式" - -#: sql_help.c:2283 +#: sql_help.c:2333 msgid "rettype" msgstr "返回类型" -#: sql_help.c:2285 +#: sql_help.c:2335 msgid "column_type" msgstr "列的类型" -#: sql_help.c:2294 sql_help.c:2488 +#: sql_help.c:2344 sql_help.c:2546 msgid "definition" msgstr "定义" -#: sql_help.c:2295 sql_help.c:2489 +#: sql_help.c:2345 sql_help.c:2547 msgid "obj_file" msgstr "目标文件" -#: sql_help.c:2296 sql_help.c:2490 +#: sql_help.c:2346 sql_help.c:2548 msgid "link_symbol" msgstr "链接_符号" -#: sql_help.c:2330 sql_help.c:2542 sql_help.c:3086 +#: sql_help.c:2347 sql_help.c:2549 +msgid "sql_body" +msgstr "sql_body" + +#: sql_help.c:2385 sql_help.c:2601 sql_help.c:3160 msgid "uid" msgstr "uid" -#: sql_help.c:2345 sql_help.c:2384 sql_help.c:2758 sql_help.c:2771 -#: sql_help.c:2785 sql_help.c:2850 +#: sql_help.c:2400 sql_help.c:2441 sql_help.c:2828 sql_help.c:2841 +#: sql_help.c:2855 sql_help.c:2920 msgid "method" msgstr "方法" -#: sql_help.c:2366 +#: sql_help.c:2405 +msgid "opclass_parameter" +msgstr "opclass_parameter" + +#: sql_help.c:2422 msgid "call_handler" msgstr "调用函数" -#: sql_help.c:2367 +#: sql_help.c:2423 msgid "inline_handler" msgstr "匿名代码块" -#: sql_help.c:2368 +#: sql_help.c:2424 msgid "valfunction" msgstr "验证函数" -#: sql_help.c:2406 +#: sql_help.c:2463 msgid "com_op" msgstr "交换操作符" -#: sql_help.c:2407 +#: sql_help.c:2464 msgid "neg_op" msgstr "取负操作符" -#: sql_help.c:2425 +#: sql_help.c:2482 msgid "family_name" msgstr "操作符群的名称" -#: sql_help.c:2436 +#: sql_help.c:2493 msgid "storage_type" msgstr "存储类型" -#: sql_help.c:2563 sql_help.c:2974 +#: sql_help.c:2622 sql_help.c:3044 msgid "where event can be one of:" msgstr "事件可以下述之一:" -#: sql_help.c:2582 sql_help.c:2584 +#: sql_help.c:2642 sql_help.c:2644 msgid "schema_element" msgstr "模式中对象" -#: sql_help.c:2621 +#: sql_help.c:2681 msgid "server_type" msgstr "服务器类型" -#: sql_help.c:2622 +#: sql_help.c:2682 msgid "server_version" msgstr "服务器版本" -#: sql_help.c:2623 sql_help.c:3715 sql_help.c:4048 +#: sql_help.c:2683 sql_help.c:3818 sql_help.c:4198 msgid "fdw_name" msgstr "外部数据封装器的名称" -#: sql_help.c:2636 +#: sql_help.c:2700 sql_help.c:2703 msgid "statistics_name" msgstr "统计信息_名称" -#: sql_help.c:2637 +#: sql_help.c:2704 msgid "statistics_kind" msgstr "统计信息_方式" -#: sql_help.c:2651 +#: sql_help.c:2720 msgid "subscription_name" msgstr "订阅_名称" -#: sql_help.c:2751 +#: sql_help.c:2821 msgid "source_table" msgstr "源表" -#: sql_help.c:2752 +#: sql_help.c:2822 msgid "like_option" msgstr "like选项" -#: sql_help.c:2818 +#: sql_help.c:2888 msgid "and like_option is:" msgstr "like_选项是" -#: sql_help.c:2867 +#: sql_help.c:2937 msgid "directory" msgstr "目录" -#: sql_help.c:2881 +#: sql_help.c:2951 msgid "parser_name" msgstr "解析器名称 " -#: sql_help.c:2882 +#: sql_help.c:2952 msgid "source_config" msgstr "已存在的文本搜索配置名称" -#: sql_help.c:2911 +#: sql_help.c:2981 msgid "start_function" msgstr "启动_函数" -#: sql_help.c:2912 +#: sql_help.c:2982 msgid "gettoken_function" msgstr "获取下一个符号函数的名称" -#: sql_help.c:2913 +#: sql_help.c:2983 msgid "end_function" msgstr "结束_函数" -#: sql_help.c:2914 +#: sql_help.c:2984 msgid "lextypes_function" msgstr "语义类型_函数" -#: sql_help.c:2915 +#: sql_help.c:2985 msgid "headline_function" msgstr "标题_函数" -#: sql_help.c:2927 +#: sql_help.c:2997 msgid "init_function" msgstr "初始化_函数" -#: sql_help.c:2928 +#: sql_help.c:2998 msgid "lexize_function" msgstr "LEXIZE函数" -#: sql_help.c:2941 +#: sql_help.c:3011 msgid "from_sql_function_name" msgstr "from_sql_function_name" -#: sql_help.c:2943 +#: sql_help.c:3013 msgid "to_sql_function_name" msgstr "to_sql_function_name" -#: sql_help.c:2969 +#: sql_help.c:3039 msgid "referenced_table_name" msgstr "被引用表的名称" -#: sql_help.c:2970 +#: sql_help.c:3040 msgid "transition_relation_name" msgstr "transition_relation_name(转换关系名)" -#: sql_help.c:2973 +#: sql_help.c:3043 msgid "arguments" msgstr "参数" -#: sql_help.c:3023 sql_help.c:4170 +#: sql_help.c:3095 sql_help.c:4331 msgid "label" msgstr "标签" -#: sql_help.c:3025 +#: sql_help.c:3097 msgid "subtype" msgstr "子类型" -#: sql_help.c:3026 +#: sql_help.c:3098 msgid "subtype_operator_class" msgstr "subtype_operator_class(子类型_操作符_类)" -#: sql_help.c:3028 +#: sql_help.c:3100 msgid "canonical_function" msgstr "标准_函数" -#: sql_help.c:3029 +#: sql_help.c:3101 msgid "subtype_diff_function" msgstr "subtype_diff_function(子类型_区分_函数)" -#: sql_help.c:3031 +#: sql_help.c:3102 +msgid "multirange_type_name" +msgstr "multirange_type_name" + +#: sql_help.c:3104 msgid "input_function" msgstr "输入_函数" -#: sql_help.c:3032 +#: sql_help.c:3105 msgid "output_function" msgstr "输出_函数" -#: sql_help.c:3033 +#: sql_help.c:3106 msgid "receive_function" msgstr "接收_函数" -#: sql_help.c:3034 +#: sql_help.c:3107 msgid "send_function" msgstr "发送_函数" -#: sql_help.c:3035 +#: sql_help.c:3108 msgid "type_modifier_input_function" msgstr "类型修改器数组输入函数名称" -#: sql_help.c:3036 +#: sql_help.c:3109 msgid "type_modifier_output_function" msgstr "类型修改器输出函数名称" -#: sql_help.c:3037 +#: sql_help.c:3110 msgid "analyze_function" msgstr "分析_函数" -#: sql_help.c:3038 +#: sql_help.c:3111 +msgid "subscript_function" +msgstr "subscript_function" + +#: sql_help.c:3112 msgid "internallength" msgstr "内部长度" -#: sql_help.c:3039 +#: sql_help.c:3113 msgid "alignment" msgstr "顺序排列(alignment)" -#: sql_help.c:3040 +#: sql_help.c:3114 msgid "storage" msgstr "存储" -#: sql_help.c:3041 +#: sql_help.c:3115 msgid "like_type" msgstr "LIKE类型(like_type)" -#: sql_help.c:3042 +#: sql_help.c:3116 msgid "category" msgstr "类型" -#: sql_help.c:3043 +#: sql_help.c:3117 msgid "preferred" msgstr "优先" -#: sql_help.c:3044 +#: sql_help.c:3118 msgid "default" msgstr "默认" -#: sql_help.c:3045 +#: sql_help.c:3119 msgid "element" msgstr "成员项" -#: sql_help.c:3046 +#: sql_help.c:3120 msgid "delimiter" msgstr "分隔符" -#: sql_help.c:3047 +#: sql_help.c:3121 msgid "collatable" msgstr "要校对的" -#: sql_help.c:3144 sql_help.c:3782 sql_help.c:4230 sql_help.c:4319 -#: sql_help.c:4469 sql_help.c:4569 sql_help.c:4687 +#: sql_help.c:3218 sql_help.c:3894 sql_help.c:4393 sql_help.c:4490 +#: sql_help.c:4642 sql_help.c:4750 sql_help.c:4873 msgid "with_query" msgstr "with查询语句(with_query)" -#: sql_help.c:3146 sql_help.c:3784 sql_help.c:4249 sql_help.c:4255 -#: sql_help.c:4258 sql_help.c:4262 sql_help.c:4266 sql_help.c:4274 -#: sql_help.c:4488 sql_help.c:4494 sql_help.c:4497 sql_help.c:4501 -#: sql_help.c:4505 sql_help.c:4513 sql_help.c:4571 sql_help.c:4706 -#: sql_help.c:4712 sql_help.c:4715 sql_help.c:4719 sql_help.c:4723 -#: sql_help.c:4731 +#: sql_help.c:3220 sql_help.c:3896 sql_help.c:4412 sql_help.c:4418 +#: sql_help.c:4421 sql_help.c:4425 sql_help.c:4429 sql_help.c:4437 +#: sql_help.c:4661 sql_help.c:4667 sql_help.c:4670 sql_help.c:4674 +#: sql_help.c:4678 sql_help.c:4686 sql_help.c:4752 sql_help.c:4892 +#: sql_help.c:4898 sql_help.c:4901 sql_help.c:4905 sql_help.c:4909 +#: sql_help.c:4917 msgid "alias" msgstr "别名" -#: sql_help.c:3147 -msgid "using_list" -msgstr "USING列表(using_list)" +#: sql_help.c:3221 sql_help.c:4397 sql_help.c:4439 sql_help.c:4441 +#: sql_help.c:4495 sql_help.c:4646 sql_help.c:4688 sql_help.c:4690 +#: sql_help.c:4759 sql_help.c:4877 sql_help.c:4919 sql_help.c:4921 +msgid "from_item" +msgstr "from列表中项" -#: sql_help.c:3149 sql_help.c:3622 sql_help.c:3863 sql_help.c:4580 +#: sql_help.c:3223 sql_help.c:3704 sql_help.c:3975 sql_help.c:4761 msgid "cursor_name" msgstr "游标名称" -#: sql_help.c:3150 sql_help.c:3790 sql_help.c:4581 +#: sql_help.c:3224 sql_help.c:3902 sql_help.c:4762 msgid "output_expression" msgstr "输出表达式" -#: sql_help.c:3151 sql_help.c:3791 sql_help.c:4233 sql_help.c:4322 -#: sql_help.c:4472 sql_help.c:4582 sql_help.c:4690 +#: sql_help.c:3225 sql_help.c:3903 sql_help.c:4396 sql_help.c:4493 +#: sql_help.c:4645 sql_help.c:4763 sql_help.c:4876 msgid "output_name" msgstr "输出名称" -#: sql_help.c:3167 +#: sql_help.c:3241 msgid "code" msgstr "编码" -#: sql_help.c:3566 +#: sql_help.c:3646 msgid "parameter" msgstr "参数" -#: sql_help.c:3587 sql_help.c:3588 sql_help.c:3888 +#: sql_help.c:3668 sql_help.c:3669 sql_help.c:4000 msgid "statement" msgstr "语句" -#: sql_help.c:3621 sql_help.c:3862 +#: sql_help.c:3703 sql_help.c:3974 msgid "direction" msgstr "方向" -#: sql_help.c:3623 sql_help.c:3864 +#: sql_help.c:3705 sql_help.c:3976 msgid "where direction can be empty or one of:" msgstr "方向可以为空或者是下列选项之一:" -#: sql_help.c:3624 sql_help.c:3625 sql_help.c:3626 sql_help.c:3627 -#: sql_help.c:3628 sql_help.c:3865 sql_help.c:3866 sql_help.c:3867 -#: sql_help.c:3868 sql_help.c:3869 sql_help.c:4243 sql_help.c:4245 -#: sql_help.c:4333 sql_help.c:4335 sql_help.c:4482 sql_help.c:4484 -#: sql_help.c:4635 sql_help.c:4637 sql_help.c:4700 sql_help.c:4702 +#: sql_help.c:3706 sql_help.c:3707 sql_help.c:3708 sql_help.c:3709 +#: sql_help.c:3710 sql_help.c:3977 sql_help.c:3978 sql_help.c:3979 +#: sql_help.c:3980 sql_help.c:3981 sql_help.c:4406 sql_help.c:4408 +#: sql_help.c:4504 sql_help.c:4506 sql_help.c:4655 sql_help.c:4657 +#: sql_help.c:4819 sql_help.c:4821 sql_help.c:4886 sql_help.c:4888 msgid "count" -msgstr "查询所用返回记录的最大数量" +msgstr "计数" -#: sql_help.c:3708 sql_help.c:4041 +#: sql_help.c:3808 sql_help.c:4188 msgid "sequence_name" msgstr "序列名称" -#: sql_help.c:3721 sql_help.c:4054 +#: sql_help.c:3826 sql_help.c:4206 msgid "arg_name" msgstr "参数名称" -#: sql_help.c:3722 sql_help.c:4055 +#: sql_help.c:3827 sql_help.c:4207 msgid "arg_type" msgstr "参数类型" -#: sql_help.c:3727 sql_help.c:4060 +#: sql_help.c:3834 sql_help.c:4214 msgid "loid" msgstr "loid" -#: sql_help.c:3750 +#: sql_help.c:3862 msgid "remote_schema" msgstr "remote_schema" -#: sql_help.c:3753 +#: sql_help.c:3865 msgid "local_schema" msgstr "local_schema" -#: sql_help.c:3788 +#: sql_help.c:3900 msgid "conflict_target" msgstr "冲突目标" -#: sql_help.c:3789 +#: sql_help.c:3901 msgid "conflict_action" msgstr "冲突行动" -#: sql_help.c:3792 +#: sql_help.c:3904 msgid "where conflict_target can be one of:" msgstr "这里conflict_target可以是下列之一:" -#: sql_help.c:3793 +#: sql_help.c:3905 msgid "index_column_name" msgstr "索引列名称" -#: sql_help.c:3794 +#: sql_help.c:3906 msgid "index_expression" msgstr "索引表达式" -#: sql_help.c:3797 +#: sql_help.c:3909 msgid "index_predicate" msgstr "index_predicate" -#: sql_help.c:3799 +#: sql_help.c:3911 msgid "and conflict_action is one of:" msgstr "并且conflict_action是下列之一:" -#: sql_help.c:3805 sql_help.c:4577 +#: sql_help.c:3917 sql_help.c:4758 msgid "sub-SELECT" msgstr "sub-SELECT" -#: sql_help.c:3814 sql_help.c:3877 sql_help.c:4553 +#: sql_help.c:3926 sql_help.c:3989 sql_help.c:4734 msgid "channel" msgstr "通道" -#: sql_help.c:3836 +#: sql_help.c:3948 msgid "lockmode" msgstr "锁模式" -#: sql_help.c:3837 +#: sql_help.c:3949 msgid "where lockmode is one of:" msgstr "锁模式可以是下列选项之一:" -#: sql_help.c:3878 +#: sql_help.c:3990 msgid "payload" msgstr "消息中负载流量(payload)" -#: sql_help.c:3905 +#: sql_help.c:4017 msgid "old_role" msgstr "旧的角色" -#: sql_help.c:3906 +#: sql_help.c:4018 msgid "new_role" msgstr "新的角色" -#: sql_help.c:3931 sql_help.c:4092 sql_help.c:4100 +#: sql_help.c:4054 sql_help.c:4253 sql_help.c:4261 msgid "savepoint_name" msgstr "保存点名称" -#: sql_help.c:4234 sql_help.c:4276 sql_help.c:4278 sql_help.c:4324 -#: sql_help.c:4473 sql_help.c:4515 sql_help.c:4517 sql_help.c:4691 -#: sql_help.c:4733 sql_help.c:4735 -msgid "from_item" -msgstr "from列表中项" - -#: sql_help.c:4236 sql_help.c:4288 sql_help.c:4475 sql_help.c:4527 -#: sql_help.c:4693 sql_help.c:4745 +#: sql_help.c:4399 sql_help.c:4452 sql_help.c:4648 sql_help.c:4701 +#: sql_help.c:4879 sql_help.c:4932 msgid "grouping_element" msgstr "grouping_element" -#: sql_help.c:4238 sql_help.c:4328 sql_help.c:4477 sql_help.c:4695 +#: sql_help.c:4401 sql_help.c:4499 sql_help.c:4650 sql_help.c:4881 msgid "window_name" msgstr "窗口名称" -#: sql_help.c:4239 sql_help.c:4329 sql_help.c:4478 sql_help.c:4696 +#: sql_help.c:4402 sql_help.c:4500 sql_help.c:4651 sql_help.c:4882 msgid "window_definition" msgstr "窗口定义" -#: sql_help.c:4240 sql_help.c:4254 sql_help.c:4292 sql_help.c:4330 -#: sql_help.c:4479 sql_help.c:4493 sql_help.c:4531 sql_help.c:4697 -#: sql_help.c:4711 sql_help.c:4749 +#: sql_help.c:4403 sql_help.c:4417 sql_help.c:4456 sql_help.c:4501 +#: sql_help.c:4652 sql_help.c:4666 sql_help.c:4705 sql_help.c:4883 +#: sql_help.c:4897 sql_help.c:4936 msgid "select" msgstr "查询" -#: sql_help.c:4247 sql_help.c:4486 sql_help.c:4704 +#: sql_help.c:4410 sql_help.c:4659 sql_help.c:4890 msgid "where from_item can be one of:" msgstr "from 列表中的项可以是下列内容之一" -#: sql_help.c:4250 sql_help.c:4256 sql_help.c:4259 sql_help.c:4263 -#: sql_help.c:4275 sql_help.c:4489 sql_help.c:4495 sql_help.c:4498 -#: sql_help.c:4502 sql_help.c:4514 sql_help.c:4707 sql_help.c:4713 -#: sql_help.c:4716 sql_help.c:4720 sql_help.c:4732 +#: sql_help.c:4413 sql_help.c:4419 sql_help.c:4422 sql_help.c:4426 +#: sql_help.c:4438 sql_help.c:4662 sql_help.c:4668 sql_help.c:4671 +#: sql_help.c:4675 sql_help.c:4687 sql_help.c:4893 sql_help.c:4899 +#: sql_help.c:4902 sql_help.c:4906 sql_help.c:4918 msgid "column_alias" msgstr "列的别名" -#: sql_help.c:4251 sql_help.c:4490 sql_help.c:4708 +#: sql_help.c:4414 sql_help.c:4663 sql_help.c:4894 msgid "sampling_method" msgstr "sampling_method" -#: sql_help.c:4253 sql_help.c:4492 sql_help.c:4710 +#: sql_help.c:4416 sql_help.c:4665 sql_help.c:4896 msgid "seed" msgstr "种子" -#: sql_help.c:4257 sql_help.c:4290 sql_help.c:4496 sql_help.c:4529 -#: sql_help.c:4714 sql_help.c:4747 +#: sql_help.c:4420 sql_help.c:4454 sql_help.c:4669 sql_help.c:4703 +#: sql_help.c:4900 sql_help.c:4934 msgid "with_query_name" msgstr "WITH查询语句名称(with_query_name)" -#: sql_help.c:4267 sql_help.c:4270 sql_help.c:4273 sql_help.c:4506 -#: sql_help.c:4509 sql_help.c:4512 sql_help.c:4724 sql_help.c:4727 -#: sql_help.c:4730 +#: sql_help.c:4430 sql_help.c:4433 sql_help.c:4436 sql_help.c:4679 +#: sql_help.c:4682 sql_help.c:4685 sql_help.c:4910 sql_help.c:4913 +#: sql_help.c:4916 msgid "column_definition" msgstr "列定义" -#: sql_help.c:4277 sql_help.c:4516 sql_help.c:4734 +#: sql_help.c:4440 sql_help.c:4689 sql_help.c:4920 msgid "join_type" msgstr "连接操作的类型" -#: sql_help.c:4279 sql_help.c:4518 sql_help.c:4736 +#: sql_help.c:4442 sql_help.c:4691 sql_help.c:4922 msgid "join_condition" msgstr "用连接操作的条件" -#: sql_help.c:4280 sql_help.c:4519 sql_help.c:4737 +#: sql_help.c:4443 sql_help.c:4692 sql_help.c:4923 msgid "join_column" msgstr "用于连接操作的列" -#: sql_help.c:4281 sql_help.c:4520 sql_help.c:4738 +#: sql_help.c:4444 sql_help.c:4693 sql_help.c:4924 +msgid "join_using_alias" +msgstr "join_using_alia" + +#: sql_help.c:4445 sql_help.c:4694 sql_help.c:4925 msgid "and grouping_element can be one of:" msgstr "并且grouping_element可以是下列之一:" -#: sql_help.c:4289 sql_help.c:4528 sql_help.c:4746 +#: sql_help.c:4453 sql_help.c:4702 sql_help.c:4933 msgid "and with_query is:" msgstr "with查询语句是:" -#: sql_help.c:4293 sql_help.c:4532 sql_help.c:4750 +#: sql_help.c:4457 sql_help.c:4706 sql_help.c:4937 msgid "values" msgstr "值" -#: sql_help.c:4294 sql_help.c:4533 sql_help.c:4751 +#: sql_help.c:4458 sql_help.c:4707 sql_help.c:4938 msgid "insert" msgstr "insert" -#: sql_help.c:4295 sql_help.c:4534 sql_help.c:4752 +#: sql_help.c:4459 sql_help.c:4708 sql_help.c:4939 msgid "update" msgstr "update" -#: sql_help.c:4296 sql_help.c:4535 sql_help.c:4753 +#: sql_help.c:4460 sql_help.c:4709 sql_help.c:4940 msgid "delete" msgstr "delete" -#: sql_help.c:4323 +#: sql_help.c:4462 sql_help.c:4711 sql_help.c:4942 +msgid "search_seq_col_name" +msgstr "search_seq_col_name" + +#: sql_help.c:4464 sql_help.c:4713 sql_help.c:4944 +msgid "cycle_mark_col_name" +msgstr "cycle_mark_col_name" + +#: sql_help.c:4465 sql_help.c:4714 sql_help.c:4945 +msgid "cycle_mark_value" +msgstr "cycle_mark_value" + +#: sql_help.c:4466 sql_help.c:4715 sql_help.c:4946 +msgid "cycle_mark_default" +msgstr "cycle_mark_default" + +#: sql_help.c:4467 sql_help.c:4716 sql_help.c:4947 +msgid "cycle_path_col_name" +msgstr "cycle_path_col_name" + +#: sql_help.c:4494 msgid "new_table" msgstr "新的表" -#: sql_help.c:4348 +#: sql_help.c:4519 msgid "timezone" msgstr "时区" -#: sql_help.c:4393 +#: sql_help.c:4564 msgid "snapshot_id" msgstr "快照id" -#: sql_help.c:4578 -msgid "from_list" -msgstr "from列表(from_list)" - -#: sql_help.c:4633 +#: sql_help.c:4817 msgid "sort_expression" msgstr "排序表达式" -#: sql_help.c:4760 sql_help.c:5738 +#: sql_help.c:4954 sql_help.c:5932 msgid "abort the current transaction" msgstr "中止目前的事务" -#: sql_help.c:4766 +#: sql_help.c:4960 msgid "change the definition of an aggregate function" msgstr "更改聚集函数的定义" -#: sql_help.c:4772 +#: sql_help.c:4966 msgid "change the definition of a collation" msgstr "更改校对规则的定义" -#: sql_help.c:4778 +#: sql_help.c:4972 msgid "change the definition of a conversion" msgstr "更改一个字符编码转换的定义" -#: sql_help.c:4784 +#: sql_help.c:4978 msgid "change a database" msgstr "更改一个数据库" -#: sql_help.c:4790 +#: sql_help.c:4984 msgid "define default access privileges" msgstr "定义默认的访问权限" -#: sql_help.c:4796 +#: sql_help.c:4990 msgid "change the definition of a domain" msgstr "更改共同值域的定义" -#: sql_help.c:4802 +#: sql_help.c:4996 msgid "change the definition of an event trigger" msgstr "更改事件触发器的定义" -#: sql_help.c:4808 +#: sql_help.c:5002 msgid "change the definition of an extension" msgstr "更改扩展的定义" -#: sql_help.c:4814 +#: sql_help.c:5008 msgid "change the definition of a foreign-data wrapper" msgstr "更改外部数据封装器的定义" -#: sql_help.c:4820 +#: sql_help.c:5014 msgid "change the definition of a foreign table" msgstr "更改外部表的定义" -#: sql_help.c:4826 +#: sql_help.c:5020 msgid "change the definition of a function" msgstr "更改函数的定义" -#: sql_help.c:4832 +#: sql_help.c:5026 msgid "change role name or membership" msgstr "更改角色名称或成员状态" -#: sql_help.c:4838 +#: sql_help.c:5032 msgid "change the definition of an index" msgstr "更改索引的定义" -#: sql_help.c:4844 +#: sql_help.c:5038 msgid "change the definition of a procedural language" msgstr "更改程序语言的定义" -#: sql_help.c:4850 +#: sql_help.c:5044 msgid "change the definition of a large object" msgstr "更改大对象的定义" -#: sql_help.c:4856 +#: sql_help.c:5050 msgid "change the definition of a materialized view" msgstr "更改物化视图的定义" -#: sql_help.c:4862 +#: sql_help.c:5056 msgid "change the definition of an operator" msgstr "更改运算子的定义" -#: sql_help.c:4868 +#: sql_help.c:5062 msgid "change the definition of an operator class" msgstr "更改运算子类别的定义" -#: sql_help.c:4874 +#: sql_help.c:5068 msgid "change the definition of an operator family" msgstr "更改一个运算子家族的识别" -#: sql_help.c:4880 -msgid "change the definition of a row level security policy" +#: sql_help.c:5074 +msgid "change the definition of a row-level security policy" msgstr "更改一条行级安全性策略的定义" -#: sql_help.c:4886 +#: sql_help.c:5080 msgid "change the definition of a procedure" msgstr "更改程序的定义" -#: sql_help.c:4892 +#: sql_help.c:5086 msgid "change the definition of a publication" msgstr "更改发布的定义" -#: sql_help.c:4898 sql_help.c:5000 +#: sql_help.c:5092 sql_help.c:5194 msgid "change a database role" msgstr "更改数据库角色" -#: sql_help.c:4904 +#: sql_help.c:5098 msgid "change the definition of a routine" msgstr "更改程序的定义" -#: sql_help.c:4910 +#: sql_help.c:5104 msgid "change the definition of a rule" msgstr "更改规则的定义" -#: sql_help.c:4916 +#: sql_help.c:5110 msgid "change the definition of a schema" msgstr "更改架构模式的定义" -#: sql_help.c:4922 +#: sql_help.c:5116 msgid "change the definition of a sequence generator" msgstr "更改序列数产生器的定义" -#: sql_help.c:4928 +#: sql_help.c:5122 msgid "change the definition of a foreign server" msgstr "更改外部服务器的定义" -#: sql_help.c:4934 +#: sql_help.c:5128 msgid "change the definition of an extended statistics object" msgstr "更改扩展统计信息对象的定义" -#: sql_help.c:4940 +#: sql_help.c:5134 msgid "change the definition of a subscription" msgstr "更改订阅的定义" -#: sql_help.c:4946 +#: sql_help.c:5140 msgid "change a server configuration parameter" msgstr "更改服务器的配置参数" -#: sql_help.c:4952 +#: sql_help.c:5146 msgid "change the definition of a table" msgstr "更改数据表的定义" -#: sql_help.c:4958 +#: sql_help.c:5152 msgid "change the definition of a tablespace" msgstr "更改表空间的定义" -#: sql_help.c:4964 +#: sql_help.c:5158 msgid "change the definition of a text search configuration" msgstr "更改一个文本搜索组态的定义" -#: sql_help.c:4970 +#: sql_help.c:5164 msgid "change the definition of a text search dictionary" msgstr "更改一个文本搜索字典的定义" -#: sql_help.c:4976 +#: sql_help.c:5170 msgid "change the definition of a text search parser" msgstr "更改一个文本搜索剖析器的定义" -#: sql_help.c:4982 +#: sql_help.c:5176 msgid "change the definition of a text search template" msgstr "更改一个文本搜索模版的定义" -#: sql_help.c:4988 +#: sql_help.c:5182 msgid "change the definition of a trigger" msgstr "更改触发器的定义" -#: sql_help.c:4994 +#: sql_help.c:5188 msgid "change the definition of a type" msgstr "更改数据类型的定义" -#: sql_help.c:5006 +#: sql_help.c:5200 msgid "change the definition of a user mapping" msgstr "更改用户映射的定义" -#: sql_help.c:5012 +#: sql_help.c:5206 msgid "change the definition of a view" msgstr "更改视图的定义" -#: sql_help.c:5018 +#: sql_help.c:5212 msgid "collect statistics about a database" msgstr "收集数据库的统计信息" -#: sql_help.c:5024 sql_help.c:5816 +#: sql_help.c:5218 sql_help.c:6010 msgid "start a transaction block" msgstr "开始一个事务区块" -#: sql_help.c:5030 +#: sql_help.c:5224 msgid "invoke a procedure" msgstr "调用过程" -#: sql_help.c:5036 +#: sql_help.c:5230 msgid "force a write-ahead log checkpoint" msgstr "强制一个预写日志检查点" -#: sql_help.c:5042 +#: sql_help.c:5236 msgid "close a cursor" msgstr "关闭游标" -#: sql_help.c:5048 +#: sql_help.c:5242 msgid "cluster a table according to an index" msgstr "按照索引进行表的聚集" -#: sql_help.c:5054 +#: sql_help.c:5248 msgid "define or change the comment of an object" msgstr "定义或更改一个对象的注解" -#: sql_help.c:5060 sql_help.c:5618 +#: sql_help.c:5254 sql_help.c:5812 msgid "commit the current transaction" msgstr "确认目前的事务" -#: sql_help.c:5066 +#: sql_help.c:5260 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "提交一项事务这是两阶段提交的先前准备" -#: sql_help.c:5072 +#: sql_help.c:5266 msgid "copy data between a file and a table" msgstr "在档案和数据表间复制数据" -#: sql_help.c:5078 +#: sql_help.c:5272 msgid "define a new access method" msgstr "定义新的访问方法" -#: sql_help.c:5084 +#: sql_help.c:5278 msgid "define a new aggregate function" msgstr "定义一个新的聚集函数" -#: sql_help.c:5090 +#: sql_help.c:5284 msgid "define a new cast" msgstr "建立新的类型转换" -#: sql_help.c:5096 +#: sql_help.c:5290 msgid "define a new collation" msgstr "建立新的校对规则" -#: sql_help.c:5102 +#: sql_help.c:5296 msgid "define a new encoding conversion" msgstr "定义一个新的字元编码转换" -#: sql_help.c:5108 +#: sql_help.c:5302 msgid "create a new database" msgstr "建立新的数据库" -#: sql_help.c:5114 +#: sql_help.c:5308 msgid "define a new domain" msgstr "建立新的共同值域" -#: sql_help.c:5120 +#: sql_help.c:5314 msgid "define a new event trigger" msgstr "定义新的事件触发器" -#: sql_help.c:5126 +#: sql_help.c:5320 msgid "install an extension" msgstr "安装一个扩展" -#: sql_help.c:5132 +#: sql_help.c:5326 msgid "define a new foreign-data wrapper" msgstr "定义一个新的外部数据封装器" -#: sql_help.c:5138 +#: sql_help.c:5332 msgid "define a new foreign table" msgstr "建立新的外部表" -#: sql_help.c:5144 +#: sql_help.c:5338 msgid "define a new function" msgstr "建立新的函数" -#: sql_help.c:5150 sql_help.c:5210 sql_help.c:5312 +#: sql_help.c:5344 sql_help.c:5404 sql_help.c:5506 msgid "define a new database role" msgstr "定义一个新数据库角色" -#: sql_help.c:5156 +#: sql_help.c:5350 msgid "define a new index" msgstr "建立新的索引" -#: sql_help.c:5162 +#: sql_help.c:5356 msgid "define a new procedural language" msgstr "建立新的程序语言" -#: sql_help.c:5168 +#: sql_help.c:5362 msgid "define a new materialized view" msgstr "建立新的物化视图" -#: sql_help.c:5174 +#: sql_help.c:5368 msgid "define a new operator" msgstr "建立新的运算子" -#: sql_help.c:5180 +#: sql_help.c:5374 msgid "define a new operator class" msgstr "建立新的运算子类别" -#: sql_help.c:5186 +#: sql_help.c:5380 msgid "define a new operator family" msgstr "定义一个新的运算子家族" -#: sql_help.c:5192 -msgid "define a new row level security policy for a table" +#: sql_help.c:5386 +msgid "define a new row-level security policy for a table" msgstr "为一个表定义一条新的行级安全性策略" -#: sql_help.c:5198 +#: sql_help.c:5392 msgid "define a new procedure" msgstr "建立新的程序" -#: sql_help.c:5204 +#: sql_help.c:5398 msgid "define a new publication" msgstr "建立新的发布" -#: sql_help.c:5216 +#: sql_help.c:5410 msgid "define a new rewrite rule" msgstr "建立新的重写规则" -#: sql_help.c:5222 +#: sql_help.c:5416 msgid "define a new schema" msgstr "建立新的架构模式" -#: sql_help.c:5228 +#: sql_help.c:5422 msgid "define a new sequence generator" msgstr "建立新的序列数产生器" -#: sql_help.c:5234 +#: sql_help.c:5428 msgid "define a new foreign server" msgstr "建立新的触发器" -#: sql_help.c:5240 +#: sql_help.c:5434 msgid "define extended statistics" msgstr "建立新的扩展统计" -#: sql_help.c:5246 +#: sql_help.c:5440 msgid "define a new subscription" msgstr "建立新的订阅" -#: sql_help.c:5252 +#: sql_help.c:5446 msgid "define a new table" msgstr "建立新的数据表" -#: sql_help.c:5258 sql_help.c:5774 +#: sql_help.c:5452 sql_help.c:5968 msgid "define a new table from the results of a query" msgstr "以查询结果建立新的数据表" -#: sql_help.c:5264 +#: sql_help.c:5458 msgid "define a new tablespace" msgstr "建立新的表空间" -#: sql_help.c:5270 +#: sql_help.c:5464 msgid "define a new text search configuration" msgstr "定义一个新文本搜索组态" -#: sql_help.c:5276 +#: sql_help.c:5470 msgid "define a new text search dictionary" msgstr "定义一个新文本搜索字典" -#: sql_help.c:5282 +#: sql_help.c:5476 msgid "define a new text search parser" msgstr "定义一个新文本搜索剖析器" -#: sql_help.c:5288 +#: sql_help.c:5482 msgid "define a new text search template" msgstr "定义一个新文本搜索模版" -#: sql_help.c:5294 +#: sql_help.c:5488 msgid "define a new transform" msgstr "定义一个新的转换" -#: sql_help.c:5300 +#: sql_help.c:5494 msgid "define a new trigger" msgstr "建立新的触发器" -#: sql_help.c:5306 +#: sql_help.c:5500 msgid "define a new data type" msgstr "建立新的数据类型" -#: sql_help.c:5318 +#: sql_help.c:5512 msgid "define a new mapping of a user to a foreign server" msgstr "将用户的新映射定义到一个外部服务器" -#: sql_help.c:5324 +#: sql_help.c:5518 msgid "define a new view" msgstr "建立新的视图" -#: sql_help.c:5330 +#: sql_help.c:5524 msgid "deallocate a prepared statement" msgstr "释放一个已预备好的叙述区块" -#: sql_help.c:5336 +#: sql_help.c:5530 msgid "define a cursor" msgstr "建立一个 cursor" -#: sql_help.c:5342 +#: sql_help.c:5536 msgid "delete rows of a table" msgstr "删除数据表中的数据列" -#: sql_help.c:5348 +#: sql_help.c:5542 msgid "discard session state" msgstr "抛弃 session 状态" -#: sql_help.c:5354 +#: sql_help.c:5548 msgid "execute an anonymous code block" msgstr "执行一个匿名代码块" -#: sql_help.c:5360 +#: sql_help.c:5554 msgid "remove an access method" msgstr "移除一种访问方法" -#: sql_help.c:5366 +#: sql_help.c:5560 msgid "remove an aggregate function" msgstr "移除一个聚集函数" -#: sql_help.c:5372 +#: sql_help.c:5566 msgid "remove a cast" msgstr "移除一个类型转换" -#: sql_help.c:5378 +#: sql_help.c:5572 msgid "remove a collation" msgstr "移除一个校对规则" -#: sql_help.c:5384 +#: sql_help.c:5578 msgid "remove a conversion" msgstr "移除一个字元编码转换" -#: sql_help.c:5390 +#: sql_help.c:5584 msgid "remove a database" msgstr "移除数据库" -#: sql_help.c:5396 +#: sql_help.c:5590 msgid "remove a domain" msgstr "移除一个共同值域" -#: sql_help.c:5402 +#: sql_help.c:5596 msgid "remove an event trigger" msgstr "移除事件触发器" -#: sql_help.c:5408 +#: sql_help.c:5602 msgid "remove an extension" msgstr "移除一个扩展" -#: sql_help.c:5414 +#: sql_help.c:5608 msgid "remove a foreign-data wrapper" msgstr "删除一个外部数据封装器" -#: sql_help.c:5420 +#: sql_help.c:5614 msgid "remove a foreign table" msgstr "移除外部引用表" -#: sql_help.c:5426 +#: sql_help.c:5620 msgid "remove a function" msgstr "移除函数" -#: sql_help.c:5432 sql_help.c:5498 sql_help.c:5600 +#: sql_help.c:5626 sql_help.c:5692 sql_help.c:5794 msgid "remove a database role" msgstr "移除一个数据库成员" -#: sql_help.c:5438 +#: sql_help.c:5632 msgid "remove an index" msgstr "移除一个索引" -#: sql_help.c:5444 +#: sql_help.c:5638 msgid "remove a procedural language" msgstr "移除一个程序语言" -#: sql_help.c:5450 +#: sql_help.c:5644 msgid "remove a materialized view" msgstr "移除一个物化视图" -#: sql_help.c:5456 +#: sql_help.c:5650 msgid "remove an operator" msgstr "移除运算子" -#: sql_help.c:5462 +#: sql_help.c:5656 msgid "remove an operator class" msgstr "移除一个运算子类别" -#: sql_help.c:5468 +#: sql_help.c:5662 msgid "remove an operator family" msgstr "移除一个运算子家族" -#: sql_help.c:5474 +#: sql_help.c:5668 msgid "remove database objects owned by a database role" msgstr "依照一个数据库角色拥有的数据库对象来移除" -#: sql_help.c:5480 -msgid "remove a row level security policy from a table" +#: sql_help.c:5674 +msgid "remove a row-level security policy from a table" msgstr "从一个表移除一条行级安全性策略" -#: sql_help.c:5486 +#: sql_help.c:5680 msgid "remove a procedure" msgstr "移除一个程序" -#: sql_help.c:5492 +#: sql_help.c:5686 msgid "remove a publication" msgstr "移除一个发布" -#: sql_help.c:5504 +#: sql_help.c:5698 msgid "remove a routine" msgstr "移除程序" -#: sql_help.c:5510 +#: sql_help.c:5704 msgid "remove a rewrite rule" msgstr "移除一个重写规则" -#: sql_help.c:5516 +#: sql_help.c:5710 msgid "remove a schema" msgstr "移除一个模式" -#: sql_help.c:5522 +#: sql_help.c:5716 msgid "remove a sequence" msgstr "移除序列" -#: sql_help.c:5528 +#: sql_help.c:5722 msgid "remove a foreign server descriptor" msgstr "删除一个外部服务器描述符" -#: sql_help.c:5534 +#: sql_help.c:5728 msgid "remove extended statistics" msgstr "移除一个扩展统计" -#: sql_help.c:5540 +#: sql_help.c:5734 msgid "remove a subscription" msgstr "移除一个订阅" -#: sql_help.c:5546 +#: sql_help.c:5740 msgid "remove a table" msgstr "移除数据表" -#: sql_help.c:5552 +#: sql_help.c:5746 msgid "remove a tablespace" msgstr "移除一个表空间" -#: sql_help.c:5558 +#: sql_help.c:5752 msgid "remove a text search configuration" msgstr "移除一个文本搜索配置" -#: sql_help.c:5564 +#: sql_help.c:5758 msgid "remove a text search dictionary" msgstr "移除一个文本搜索字典" -#: sql_help.c:5570 +#: sql_help.c:5764 msgid "remove a text search parser" msgstr "移除一个文本搜索剖析器" -#: sql_help.c:5576 +#: sql_help.c:5770 msgid "remove a text search template" msgstr "移除一个文本搜索模版" -#: sql_help.c:5582 +#: sql_help.c:5776 msgid "remove a transform" msgstr "移除一个转换" -#: sql_help.c:5588 +#: sql_help.c:5782 msgid "remove a trigger" msgstr "移除触发器" -#: sql_help.c:5594 +#: sql_help.c:5788 msgid "remove a data type" msgstr "移除数据类型" -#: sql_help.c:5606 +#: sql_help.c:5800 msgid "remove a user mapping for a foreign server" msgstr "为外部服务器删除用户映射" -#: sql_help.c:5612 +#: sql_help.c:5806 msgid "remove a view" msgstr "移除一个视图" -#: sql_help.c:5624 +#: sql_help.c:5818 msgid "execute a prepared statement" msgstr "执行一个已准备好的语句块" -#: sql_help.c:5630 +#: sql_help.c:5824 msgid "show the execution plan of a statement" msgstr "显示一个语句块的执行计划" -#: sql_help.c:5636 +#: sql_help.c:5830 msgid "retrieve rows from a query using a cursor" msgstr "从使用游标的查询读取数据" -#: sql_help.c:5642 +#: sql_help.c:5836 msgid "define access privileges" msgstr "定义存取权限" -#: sql_help.c:5648 +#: sql_help.c:5842 msgid "import table definitions from a foreign server" msgstr "从一个外部服务器导入表定义" -#: sql_help.c:5654 +#: sql_help.c:5848 msgid "create new rows in a table" msgstr "在表中创建新数据行" -#: sql_help.c:5660 +#: sql_help.c:5854 msgid "listen for a notification" msgstr "等待通知" -#: sql_help.c:5666 +#: sql_help.c:5860 msgid "load a shared library file" msgstr "加载一个共享库文件" -#: sql_help.c:5672 +#: sql_help.c:5866 msgid "lock a table" msgstr "锁定数据表" -#: sql_help.c:5678 +#: sql_help.c:5872 msgid "position a cursor" msgstr "移动游标位置" -#: sql_help.c:5684 +#: sql_help.c:5878 msgid "generate a notification" msgstr "产生通知" -#: sql_help.c:5690 +#: sql_help.c:5884 msgid "prepare a statement for execution" msgstr "预先编译语句以执行" -#: sql_help.c:5696 +#: sql_help.c:5890 msgid "prepare the current transaction for two-phase commit" msgstr "准备将当前事务进行二段式提交" -#: sql_help.c:5702 +#: sql_help.c:5896 msgid "change the ownership of database objects owned by a database role" msgstr "依照一个数据库角色拥有的的数据库对象来更变所有权" -#: sql_help.c:5708 +#: sql_help.c:5902 msgid "replace the contents of a materialized view" msgstr "替换物化视图的内容" -#: sql_help.c:5714 +#: sql_help.c:5908 msgid "rebuild indexes" msgstr "重新建构索引" -#: sql_help.c:5720 +#: sql_help.c:5914 msgid "destroy a previously defined savepoint" msgstr "删除先前建立的储存点(Savepoint)" -#: sql_help.c:5726 +#: sql_help.c:5920 msgid "restore the value of a run-time parameter to the default value" msgstr "将执行时期参数还原成预设值" -#: sql_help.c:5732 +#: sql_help.c:5926 msgid "remove access privileges" msgstr "移除存取权限" -#: sql_help.c:5744 +#: sql_help.c:5938 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "取消一个可以为两阶段提交容易配置的事务" -#: sql_help.c:5750 +#: sql_help.c:5944 msgid "roll back to a savepoint" msgstr "还原至一个储存点(Savepoint)" -#: sql_help.c:5756 +#: sql_help.c:5950 msgid "define a new savepoint within the current transaction" msgstr "在当前事务中建立新的储存点(Savepoint)" -#: sql_help.c:5762 +#: sql_help.c:5956 msgid "define or change a security label applied to an object" msgstr "定义或更改一个对象的安全标签" -#: sql_help.c:5768 sql_help.c:5822 sql_help.c:5858 +#: sql_help.c:5962 sql_help.c:6016 sql_help.c:6052 msgid "retrieve rows from a table or view" msgstr "从数据表或视图中读取数据" -#: sql_help.c:5780 +#: sql_help.c:5974 msgid "change a run-time parameter" msgstr "更改一个运行期参数" -#: sql_help.c:5786 +#: sql_help.c:5980 msgid "set constraint check timing for the current transaction" msgstr "为当前事务设定约束限制检查的时间模式" -#: sql_help.c:5792 +#: sql_help.c:5986 msgid "set the current user identifier of the current session" msgstr "为当前会话的当前用户的设置身份标识" -#: sql_help.c:5798 +#: sql_help.c:5992 msgid "set the session user identifier and the current user identifier of the current session" msgstr "为当前会话设置会话用户标识符和当前用户标识符" -#: sql_help.c:5804 +#: sql_help.c:5998 msgid "set the characteristics of the current transaction" msgstr "设定当前事务属性" -#: sql_help.c:5810 +#: sql_help.c:6004 msgid "show the value of a run-time parameter" msgstr "显示运行期的参数值" -#: sql_help.c:5828 +#: sql_help.c:6022 msgid "empty a table or set of tables" msgstr "空的数据表或数据表集合" -#: sql_help.c:5834 +#: sql_help.c:6028 msgid "stop listening for a notification" msgstr "停止监听通知" -#: sql_help.c:5840 +#: sql_help.c:6034 msgid "update rows of a table" msgstr "更新数据表中的数据列" -#: sql_help.c:5846 +#: sql_help.c:6040 msgid "garbage-collect and optionally analyze a database" msgstr "垃圾收集(GC)并选择地分析数据库" -#: sql_help.c:5852 +#: sql_help.c:6046 msgid "compute a set of rows" msgstr "计算一个数据列的集合" -#: startup.c:216 +#: startup.c:213 #, c-format msgid "-1 can only be used in non-interactive mode" msgstr "-1只能在非交互模式下使用" -#: startup.c:303 -#, c-format -msgid "could not connect to server: %s" -msgstr "无法连接到服务器:%s" - -#: startup.c:331 +#: startup.c:326 #, c-format msgid "could not open log file \"%s\": %m" msgstr "无法打开事务日志文件 \"%s\": %m" -#: startup.c:442 +#: startup.c:438 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6161,27 +6420,27 @@ msgstr "" "输入 \"help\" 来获取帮助信息.\n" "\n" -#: startup.c:592 +#: startup.c:591 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "无法设定列打印参数 \"%s\"" -#: startup.c:697 +#: startup.c:699 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "尝试 \"%s --help\" 以得到更多信息.\n" +msgstr "请用 \"%s --help\" 获取更多的信息.\n" -#: startup.c:714 +#: startup.c:716 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "忽略多余的命令行参数 \"%s\"" -#: startup.c:763 +#: startup.c:765 #, c-format msgid "could not find own program executable" msgstr "找不到可执行文件" -#: tab-complete.c:4361 +#: tab-complete.c:4904 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6192,22 +6451,22 @@ msgstr "" "查询是:\n" "%s" -#: variables.c:141 +#: variables.c:139 #, c-format msgid "unrecognized value \"%s\" for \"%s\": Boolean expected" msgstr "\"%2$s\"的不能识别的值\"%1$s\":应为布尔值" -#: variables.c:178 +#: variables.c:176 #, c-format msgid "invalid value \"%s\" for \"%s\": integer expected" msgstr "\"%s\"的值\"%s\"无效: 应为整数" -#: variables.c:226 +#: variables.c:224 #, c-format msgid "invalid variable name: \"%s\"" msgstr "无效的语言环境名称: \"%s\"" -#: variables.c:395 +#: variables.c:419 #, c-format msgid "" "unrecognized value \"%s\" for \"%s\"\n" @@ -6215,68 +6474,3 @@ msgid "" msgstr "" "\"%2$s\"的不能识别的值\"%1$s\"\n" "可用值为\"%3$s\"." - -# command.c:1148 -#~ msgid "%s: could not open log file \"%s\": %s\n" -#~ msgstr "%s:无法开启日志文件 \"%s\":%s\n" - -#~ msgid "string_literal" -#~ msgstr "字符串_文字" - -#~ msgid "unterminated quoted string\n" -#~ msgstr "未结束的引用字符串\n" - -# input.c:210 -#~ msgid "could not read from input file: %s\n" -#~ msgstr "无法从输入档案读取:%s\n" - -#~ msgid "Report bugs to .\n" -#~ msgstr "臭虫报告至 .\n" - -# command.c:953 -# common.c:216 -# common.c:605 -# common.c:660 -# common.c:903 -#~ msgid "%s\n" -#~ msgstr "%s\n" - -#~ msgid "could not close pipe to external command: %s\n" -#~ msgstr "无法为外部命令: %s关闭管道\n" - -#~ msgid "could not stat file \"%s\": %s\n" -#~ msgstr "无法获取文件 \"%s\":%s 的状态\n" - -#~ msgid "could not execute command \"%s\": %s\n" -#~ msgstr "无法执行命令 \"%s\": %s\n" - -#~ msgid "could not parse reloptions array\n" -#~ msgstr "无法解析 reloptions 数组\n" - -# command.c:1148 -#~ msgid "could not open temporary file \"%s\": %s\n" -#~ msgstr "无法打开临时文件 \"%s\": %s\n" - -# command.c:120 -#~ msgid "Invalid command \\%s. Try \\? for help.\n" -#~ msgstr "无效的命令 \\%s,用 \\? 查看帮助。\n" - -#~ msgid "child process was terminated by signal %d" -#~ msgstr "子进程被信号 %d 终止" - -#~ msgid "child process was terminated by signal %s" -#~ msgstr "子进程被信号 %s 终止" - -#~ msgid "pclose failed: %s" -#~ msgstr "pclose调用失败: %s" - -# command.c:1103 -#~ msgid "could not read symbolic link \"%s\"" -#~ msgstr "无法读取符号链接 \"%s\"" - -#~ msgid "could not change directory to \"%s\": %s" -#~ msgstr "无法跳转到目录 \"%s\" 中: %s" - -# command.c:240 -#~ msgid "could not identify current directory: %s" -#~ msgstr "无法识别目前目录:%s" diff --git a/src/bin/scripts/nls.mk b/src/bin/scripts/nls.mk index 86063f3759..f61ff79396 100644 --- a/src/bin/scripts/nls.mk +++ b/src/bin/scripts/nls.mk @@ -1,6 +1,6 @@ # src/bin/scripts/nls.mk CATALOG_NAME = pgscripts -AVAIL_LANGUAGES = cs de es fr he it ja ko pl pt_BR ru sv tr uk zh_CN +AVAIL_LANGUAGES = cs de el es fr he it ja ko pl pt_BR ru sv tr uk zh_CN GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ createdb.c createuser.c \ dropdb.c dropuser.c \ diff --git a/src/bin/scripts/po/cs.po b/src/bin/scripts/po/cs.po index b59aa2903a..dead987bac 100644 --- a/src/bin/scripts/po/cs.po +++ b/src/bin/scripts/po/cs.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: pgscripts-cs (PostgreSQL 9.3)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2020-10-31 16:16+0000\n" -"PO-Revision-Date: 2020-10-31 21:04+0100\n" +"PO-Revision-Date: 2021-09-16 09:15+0200\n" "Last-Translator: Tomas Vondra \n" "Language-Team: Czech \n" "Language: cs\n" @@ -230,7 +230,7 @@ msgstr " -h, --host=HOSTNAME jméno databázového serveru nebo adresář #: vacuumdb.c:936 #, c-format msgid " -p, --port=PORT database server port\n" -msgstr " -p, --port=PORT port databázového serveru\n" +msgstr " -p, --port=PORT port databázového serveru\n" #: clusterdb.c:280 dropdb.c:182 reindexdb.c:769 vacuumdb.c:937 #, c-format @@ -655,7 +655,7 @@ msgstr " %s [PŘEPÍNAČ]... DATABÁZE\n" #: dropdb.c:174 #, c-format msgid " -f, --force try to terminate other connections before dropping\n" -msgstr " -f, --force pokus se přerušit ostatní spojení před smazáním\n" +msgstr " -f, --force pokus se přerušit ostatní spojení před smazáním\n" #: dropdb.c:175 #, c-format @@ -791,12 +791,12 @@ msgstr " -h, --host=HOSTNAME jméno databázového serveru nebo adresář #: pg_isready.c:235 #, c-format msgid " -p, --port=PORT database server port\n" -msgstr " -p, --port=PORT port databázového serveru\n" +msgstr " -p, --port=PORT port databázového serveru\n" #: pg_isready.c:236 #, c-format msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n" -msgstr " -t, --timeout=SECS počet vteřin čekání při pokusu o spojení, 0 toto omezení vypne (výchozí: %s)\n" +msgstr " -t, --timeout=SECS počet vteřin čekání při pokusu o spojení, 0 toto omezení vypne (výchozí: %s)\n" #: pg_isready.c:237 #, c-format @@ -931,7 +931,7 @@ msgstr " -i, --index=JMÉNO obnovit pouze vybraný index\n" #: reindexdb.c:758 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" -msgstr " -j, --jobs=NUM použij tento počet paralelních jobů pro reindexování\n" +msgstr " -j, --jobs=NUM použij tento počet paralelních jobů pro reindexování\n" #: reindexdb.c:760 #, c-format diff --git a/src/bin/scripts/po/de.po b/src/bin/scripts/po/de.po index 8f6bbad909..1ec7454f70 100644 --- a/src/bin/scripts/po/de.po +++ b/src/bin/scripts/po/de.po @@ -1,14 +1,14 @@ # German message translation file for "scripts". -# Peter Eisentraut , 2003 - 2021. +# Peter Eisentraut , 2003 - 2022. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-30 03:18+0000\n" -"PO-Revision-Date: 2021-04-30 07:11+0200\n" +"POT-Creation-Date: 2022-05-09 05:50+0000\n" +"PO-Revision-Date: 2022-05-10 07:33+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -17,21 +17,26 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "Fatal: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "Warnung: " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "Tipp: " + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -57,61 +62,71 @@ msgstr "Benutzer existiert nicht" msgid "user name lookup failure: error code %lu" msgstr "Fehler beim Nachschlagen des Benutzernamens: Fehlercode %lu" -#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 msgid "Cancel request sent\n" msgstr "Abbruchsanforderung gesendet\n" -#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 msgid "Could not send cancel request: " msgstr "Konnte Abbruchsanforderung nicht senden: " -#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:107 +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104 msgid "Password: " msgstr "Passwort: " -#: ../../fe_utils/connect_utils.c:92 +#: ../../fe_utils/connect_utils.c:91 #, c-format msgid "could not connect to database %s: out of memory" msgstr "konnte nicht mit Datenbank %s verbinden: Speicher aufgebraucht" -#: ../../fe_utils/connect_utils.c:120 pg_isready.c:145 +#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146 #, c-format msgid "%s" msgstr "%s" -#: ../../fe_utils/parallel_slot.c:302 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ungültiger Wert »%s« für Option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s muss im Bereich %d..%d sein" + +#: ../../fe_utils/parallel_slot.c:301 #, c-format msgid "too many jobs for this platform" msgstr "zu viele Jobs für diese Plattform" -#: ../../fe_utils/parallel_slot.c:522 +#: ../../fe_utils/parallel_slot.c:519 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "Verarbeitung der Datenbank »%s« fehlgeschlagen: %s" -#: ../../fe_utils/print.c:336 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu Zeile)" msgstr[1] "(%lu Zeilen)" -#: ../../fe_utils/print.c:3039 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Unterbrochen\n" -#: ../../fe_utils/print.c:3103 +#: ../../fe_utils/print.c:3173 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Kann keinen weiteren Spaltenkopf zur Tabelle hinzufügen: Spaltenzahl %d überschritten.\n" -#: ../../fe_utils/print.c:3143 +#: ../../fe_utils/print.c:3213 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "Cann keine weitere Zelle zur Tabelle hinzufügen: Zellengesamtzahl %d überschritten.\n" -#: ../../fe_utils/print.c:3401 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "ungültiges Ausgabeformat (interner Fehler): %d" @@ -123,19 +138,19 @@ msgstr "Anfrage fehlgeschlagen: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 #, c-format -msgid "query was: %s" +msgid "Query was: %s" msgstr "Anfrage war: %s" -#: clusterdb.c:112 clusterdb.c:131 createdb.c:123 createdb.c:142 -#: createuser.c:172 createuser.c:187 dropdb.c:103 dropdb.c:112 dropdb.c:120 -#: dropuser.c:94 dropuser.c:109 dropuser.c:122 pg_isready.c:96 pg_isready.c:110 -#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:245 vacuumdb.c:264 +#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158 +#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121 +#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 +#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: clusterdb.c:129 createdb.c:140 createuser.c:185 dropdb.c:118 dropuser.c:107 -#: pg_isready.c:108 reindexdb.c:191 vacuumdb.c:262 +#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108 +#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" @@ -145,27 +160,27 @@ msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" msgid "cannot cluster all databases and a specific one at the same time" msgstr "kann nicht alle Datenbanken und eine bestimmte gleichzeitig clustern" -#: clusterdb.c:154 +#: clusterdb.c:151 #, c-format msgid "cannot cluster specific table(s) in all databases" msgstr "kann nicht bestimmte Tabelle(n) in allen Datenbanken clustern" -#: clusterdb.c:220 +#: clusterdb.c:215 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "Clustern der Tabelle »%s« in Datenbank »%s« fehlgeschlagen: %s" -#: clusterdb.c:223 +#: clusterdb.c:218 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "Clustern der Datenbank »%s« fehlgeschlagen: %s" -#: clusterdb.c:251 +#: clusterdb.c:246 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: clustere Datenbank »%s«\n" -#: clusterdb.c:267 +#: clusterdb.c:262 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -174,19 +189,19 @@ msgstr "" "%s clustert alle vorher geclusterten Tabellen in einer Datenbank.\n" "\n" -#: clusterdb.c:268 createdb.c:267 createuser.c:351 dropdb.c:171 dropuser.c:169 -#: pg_isready.c:225 reindexdb.c:792 vacuumdb.c:988 +#: clusterdb.c:263 createdb.c:283 createuser.c:346 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: clusterdb.c:269 reindexdb.c:793 vacuumdb.c:989 +#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: clusterdb.c:270 createdb.c:269 createuser.c:353 dropdb.c:173 dropuser.c:171 -#: pg_isready.c:228 reindexdb.c:794 vacuumdb.c:990 +#: clusterdb.c:265 createdb.c:285 createuser.c:348 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966 #, c-format msgid "" "\n" @@ -195,50 +210,50 @@ msgstr "" "\n" "Optionen:\n" -#: clusterdb.c:271 +#: clusterdb.c:266 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all clustere alle Datenbanken\n" -#: clusterdb.c:272 +#: clusterdb.c:267 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=DBNAME zu clusternde Datenbank\n" -#: clusterdb.c:273 createuser.c:357 dropdb.c:174 dropuser.c:172 +#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr "" " -e, --echo zeige die Befehle, die an den Server\n" " gesendet werden\n" -#: clusterdb.c:274 +#: clusterdb.c:269 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet unterdrücke alle Mitteilungen\n" -#: clusterdb.c:275 +#: clusterdb.c:270 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=TABELLE clustere nur bestimmte Tabelle(n)\n" -#: clusterdb.c:276 +#: clusterdb.c:271 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: clusterdb.c:277 createuser.c:369 dropdb.c:177 dropuser.c:175 +#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: clusterdb.c:278 createuser.c:374 dropdb.c:179 dropuser.c:177 +#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: clusterdb.c:279 createdb.c:280 createuser.c:375 dropdb.c:180 dropuser.c:178 -#: pg_isready.c:234 reindexdb.c:809 vacuumdb.c:1014 +#: clusterdb.c:274 createdb.c:300 createuser.c:370 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 #, c-format msgid "" "\n" @@ -247,37 +262,37 @@ msgstr "" "\n" "Verbindungsoptionen:\n" -#: clusterdb.c:280 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1015 +#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: clusterdb.c:281 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1016 +#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT Port des Datenbankservers\n" -#: clusterdb.c:282 dropdb.c:183 vacuumdb.c:1017 +#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: clusterdb.c:283 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1018 +#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: clusterdb.c:284 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1019 +#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password Passwortfrage erzwingen\n" -#: clusterdb.c:285 dropdb.c:186 vacuumdb.c:1020 +#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n" -#: clusterdb.c:286 +#: clusterdb.c:281 #, c-format msgid "" "\n" @@ -287,8 +302,8 @@ msgstr "" "Für weitere Informationen lesen Sie bitte die Beschreibung des\n" "SQL-Befehls CLUSTER.\n" -#: clusterdb.c:287 createdb.c:288 createuser.c:381 dropdb.c:187 dropuser.c:184 -#: pg_isready.c:239 reindexdb.c:817 vacuumdb.c:1022 +#: clusterdb.c:282 createdb.c:308 createuser.c:376 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999 #, c-format msgid "" "\n" @@ -297,8 +312,8 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: clusterdb.c:288 createdb.c:289 createuser.c:382 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:818 vacuumdb.c:1023 +#: clusterdb.c:283 createdb.c:309 createuser.c:377 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" @@ -332,32 +347,32 @@ msgstr "%s (%s/%s) " msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Bitte antworten Sie »%s« oder »%s«.\n" -#: createdb.c:150 +#: createdb.c:165 #, c-format msgid "only one of --locale and --lc-ctype can be specified" msgstr "--locale und --lc-ctype können nicht zusammen angegeben werden" -#: createdb.c:155 +#: createdb.c:167 #, c-format msgid "only one of --locale and --lc-collate can be specified" msgstr "--locale und --lc-collate können nicht zusammen angegeben werden" -#: createdb.c:166 +#: createdb.c:175 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "»%s« ist kein gültiger Kodierungsname" -#: createdb.c:229 +#: createdb.c:245 #, c-format msgid "database creation failed: %s" msgstr "Erzeugen der Datenbank ist fehlgeschlagen: %s" -#: createdb.c:248 +#: createdb.c:264 #, c-format msgid "comment creation failed (database was created): %s" msgstr "Erzeugen des Kommentars ist fehlgeschlagen (Datenbank wurde erzeugt): %s" -#: createdb.c:266 +#: createdb.c:282 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -366,94 +381,113 @@ msgstr "" "%s erzeugt eine PostgreSQL-Datenbank.\n" "\n" -#: createdb.c:268 +#: createdb.c:284 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [OPTION]... [DBNAME] [BESCHREIBUNG]\n" -#: createdb.c:270 +#: createdb.c:286 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TABLESPACE Standard-Tablespace der Datenbank\n" -#: createdb.c:271 reindexdb.c:798 +#: createdb.c:287 reindexdb.c:766 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr "" " -e, --echo zeige die Befehle, die an den Server\n" " gesendet werden\n" -#: createdb.c:272 +#: createdb.c:288 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=KODIERUNG Kodierung für die Datenbank\n" -#: createdb.c:273 +#: createdb.c:289 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" -msgstr " -l, --locale=LOCALE Lokale-Einstellungen für die Datenbank\n" +msgstr " -l, --locale=LOCALE Locale-Einstellungen für die Datenbank\n" -#: createdb.c:274 +#: createdb.c:290 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOCALE LC_COLLATE-Einstellung für die Datenbank\n" -#: createdb.c:275 +#: createdb.c:291 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=LOCALE LC_CTYPE-Einstellung für die Datenbank\n" -#: createdb.c:276 +#: createdb.c:292 +#, c-format +msgid " --icu-locale=LOCALE ICU locale setting for the database\n" +msgstr " --icu-locale=LOCALE ICU-Locale-Einstellung für die Datenbank\n" + +#: createdb.c:293 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" locale provider for the database's default collation\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" Locale-Provider für Standardsortierfolge der Datenbank\n" + +#: createdb.c:295 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=EIGENTÜMER Eigentümer der neuen Datenbank\n" -#: createdb.c:277 +#: createdb.c:296 +#, c-format +msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" +msgstr " -S, --strategy=STRATEGIE Datenbankerzeugungsstrategie wal_log oder file_copy\n" + +#: createdb.c:297 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=TEMPLATE zu kopierende Template-Datenbank\n" -#: createdb.c:278 reindexdb.c:807 +#: createdb.c:298 reindexdb.c:775 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: createdb.c:279 reindexdb.c:808 +#: createdb.c:299 reindexdb.c:776 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: createdb.c:281 reindexdb.c:810 +#: createdb.c:301 reindexdb.c:778 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: createdb.c:282 reindexdb.c:811 +#: createdb.c:302 reindexdb.c:779 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT Port des Datenbankservers\n" -#: createdb.c:283 reindexdb.c:812 +#: createdb.c:303 reindexdb.c:780 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: createdb.c:284 reindexdb.c:813 +#: createdb.c:304 reindexdb.c:781 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: createdb.c:285 reindexdb.c:814 +#: createdb.c:305 reindexdb.c:782 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password Passwortfrage erzwingen\n" -#: createdb.c:286 reindexdb.c:815 +#: createdb.c:306 reindexdb.c:783 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n" -#: createdb.c:287 +#: createdb.c:307 #, c-format msgid "" "\n" @@ -463,51 +497,46 @@ msgstr "" "Wenn nichts anderes angegeben ist, dann wird eine Datenbank mit dem Namen\n" "des aktuellen Benutzers erzeugt.\n" -#: createuser.c:151 -#, c-format -msgid "invalid value for --connection-limit: %s" -msgstr "ungültiger Wert für --connection-limit: %s" - -#: createuser.c:195 +#: createuser.c:193 msgid "Enter name of role to add: " msgstr "Geben Sie den Namen der neuen Rolle ein: " -#: createuser.c:210 +#: createuser.c:208 msgid "Enter password for new role: " msgstr "Geben Sie das Passwort der neuen Rolle ein: " -#: createuser.c:211 +#: createuser.c:209 msgid "Enter it again: " msgstr "Geben Sie es noch einmal ein: " -#: createuser.c:214 +#: createuser.c:212 #, c-format msgid "Passwords didn't match.\n" msgstr "Passwörter stimmten nicht überein.\n" -#: createuser.c:222 +#: createuser.c:220 msgid "Shall the new role be a superuser?" msgstr "Soll die neue Rolle ein Superuser sein?" -#: createuser.c:237 +#: createuser.c:235 msgid "Shall the new role be allowed to create databases?" msgstr "Soll die neue Rolle Datenbanken erzeugen dürfen?" -#: createuser.c:245 +#: createuser.c:243 msgid "Shall the new role be allowed to create more new roles?" msgstr "Soll die neue Rolle weitere neue Rollen erzeugen dürfen?" -#: createuser.c:281 +#: createuser.c:278 #, c-format msgid "password encryption failed: %s" msgstr "Passwortverschlüsselung ist fehlgeschlagen: %s" -#: createuser.c:336 +#: createuser.c:331 #, c-format msgid "creation of new role failed: %s" msgstr "Erzeugen der neuen Rolle fehlgeschlagen: %s" -#: createuser.c:350 +#: createuser.c:345 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -516,34 +545,34 @@ msgstr "" "%s erzeugt eine neue PostgreSQL-Rolle.\n" "\n" -#: createuser.c:352 dropuser.c:170 +#: createuser.c:347 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [OPTION]... [ROLLENNAME]\n" -#: createuser.c:354 +#: createuser.c:349 #, c-format msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" msgstr "" " -c, --connection-limit=N Hochzahl an Verbindungen für Rolle\n" " (Voreinstellung: keine Begrenzung)\n" -#: createuser.c:355 +#: createuser.c:350 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb Rolle kann neue Datenbanken erzeugen\n" -#: createuser.c:356 +#: createuser.c:351 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb Rolle kann keine Datenbanken erzeugen (Voreinstellung)\n" -#: createuser.c:358 +#: createuser.c:353 #, c-format msgid " -g, --role=ROLE new role will be a member of this role\n" msgstr " -g, --role=ROLLE neue Rolle wird Mitglied dieser Rolle\n" -#: createuser.c:359 +#: createuser.c:354 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -552,47 +581,47 @@ msgstr "" " -i, --inherit Rolle erbt alle Privilegien von Rollen, deren\n" " Mitglied sie ist (Voreinstellung)\n" -#: createuser.c:361 +#: createuser.c:356 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit Rolle erbt keine Privilegien\n" -#: createuser.c:362 +#: createuser.c:357 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login Rolle kann sich anmelden (Voreinstellung)\n" -#: createuser.c:363 +#: createuser.c:358 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login Rolle kann sich nicht anmelden\n" -#: createuser.c:364 +#: createuser.c:359 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt weise der neuen Rolle ein Passwort zu\n" -#: createuser.c:365 +#: createuser.c:360 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole Rolle kann neue Rollen erzeugen\n" -#: createuser.c:366 +#: createuser.c:361 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole Rolle kann keine Rollen erzeugen (Voreinstellung)\n" -#: createuser.c:367 +#: createuser.c:362 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser Rolle wird Superuser\n" -#: createuser.c:368 +#: createuser.c:363 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr " -S, --no-superuser Rolle wird kein Superuser (Voreinstellung)\n" -#: createuser.c:370 +#: createuser.c:365 #, c-format msgid "" " --interactive prompt for missing role name and attributes rather\n" @@ -601,43 +630,43 @@ msgstr "" " --interactive nach fehlenden Rollennamen und -attributen fragen\n" " anstatt Vorgabewerte zu nehmen\n" -#: createuser.c:372 +#: createuser.c:367 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication Rolle kann Replikation einleiten\n" -#: createuser.c:373 +#: createuser.c:368 #, c-format msgid " --no-replication role cannot initiate replication\n" msgstr " --no-replication Rolle kann Replikation nicht einleiten\n" -#: createuser.c:378 +#: createuser.c:373 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" msgstr "" " -U, --username=NAME Datenbankbenutzername für die Verbindung\n" " (nicht der Name des neuen Benutzers)\n" -#: dropdb.c:111 +#: dropdb.c:112 #, c-format msgid "missing required argument database name" msgstr "Datenbankname als Argument fehlt" -#: dropdb.c:126 +#: dropdb.c:127 #, c-format msgid "Database \"%s\" will be permanently removed.\n" msgstr "Datenbank »%s« wird unwiderruflich gelöscht werden.\n" -#: dropdb.c:127 dropuser.c:130 +#: dropdb.c:128 dropuser.c:131 msgid "Are you sure?" msgstr "Sind Sie sich sicher?" -#: dropdb.c:156 +#: dropdb.c:157 #, c-format msgid "database removal failed: %s" msgstr "Löschen der Datenbank fehlgeschlagen: %s" -#: dropdb.c:170 +#: dropdb.c:171 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -646,46 +675,46 @@ msgstr "" "%s löscht eine PostgreSQL-Datenbank.\n" "\n" -#: dropdb.c:172 +#: dropdb.c:173 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [OPTION]... DBNAME\n" -#: dropdb.c:175 +#: dropdb.c:176 #, c-format msgid " -f, --force try to terminate other connections before dropping\n" msgstr " -f, --force vor dem Löschen versuchen andere Verbindungen abzubrechen\n" -#: dropdb.c:176 +#: dropdb.c:177 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr " -i, --interactive frage nach, bevor irgendetwas gelöscht wird\n" -#: dropdb.c:178 +#: dropdb.c:179 #, c-format msgid " --if-exists don't report error if database doesn't exist\n" -msgstr " --if-exists keinen Fehler ausgeben, wenn Datenbank nicht existiert\n" +msgstr " --if-exists keinen Fehler ausgeben, wenn Datenbank nicht existiert\n" -#: dropuser.c:117 +#: dropuser.c:118 msgid "Enter name of role to drop: " msgstr "Geben Sie den Namen der zu löschenden Rolle ein: " -#: dropuser.c:121 +#: dropuser.c:122 #, c-format msgid "missing required argument role name" msgstr "Rollenname als Argument fehlt" -#: dropuser.c:129 +#: dropuser.c:130 #, c-format msgid "Role \"%s\" will be permanently removed.\n" msgstr "Rolle »%s« wird unwiderruflich gelöscht werden.\n" -#: dropuser.c:153 +#: dropuser.c:154 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "Löschen der Rolle »%s« fehlgeschlagen: %s" -#: dropuser.c:168 +#: dropuser.c:169 #, c-format msgid "" "%s removes a PostgreSQL role.\n" @@ -694,7 +723,7 @@ msgstr "" "%s löscht eine PostgreSQL-Rolle.\n" "\n" -#: dropuser.c:173 +#: dropuser.c:174 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -703,49 +732,49 @@ msgstr "" " -i, --interactive nachfragen, bevor irgendetwas gelöscht wird, und\n" " nach Rollennamen fragen, wenn nicht angegeben\n" -#: dropuser.c:176 +#: dropuser.c:177 #, c-format msgid " --if-exists don't report error if user doesn't exist\n" -msgstr " --if-exists keinen Fehler ausgeben, wenn Benutzer nicht existiert\n" +msgstr " --if-exists keinen Fehler ausgeben, wenn Benutzer nicht existiert\n" -#: dropuser.c:181 +#: dropuser.c:182 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n" msgstr "" " -U, --username=NAME Datenbankbenutzername für die Verbindung\n" " (nicht der Name des zu löschenden Benutzers)\n" -#: pg_isready.c:153 +#: pg_isready.c:154 #, c-format msgid "could not fetch default options" msgstr "konnte Standardoptionen nicht ermitteln" -#: pg_isready.c:202 +#: pg_isready.c:203 #, c-format msgid "accepting connections\n" msgstr "Verbindungen werden angenommen\n" -#: pg_isready.c:205 +#: pg_isready.c:206 #, c-format msgid "rejecting connections\n" msgstr "Verbindungen werden abgelehnt\n" -#: pg_isready.c:208 +#: pg_isready.c:209 #, c-format msgid "no response\n" msgstr "keine Antwort\n" -#: pg_isready.c:211 +#: pg_isready.c:212 #, c-format msgid "no attempt\n" msgstr "kein Verbindungsversuch\n" -#: pg_isready.c:214 +#: pg_isready.c:215 #, c-format msgid "unknown\n" msgstr "unbekannt\n" -#: pg_isready.c:224 +#: pg_isready.c:225 #, c-format msgid "" "%s issues a connection check to a PostgreSQL database.\n" @@ -754,148 +783,144 @@ msgstr "" "%s führt eine Verbindungsprüfung gegen eine PostgreSQL-Datenbank aus.\n" "\n" -#: pg_isready.c:226 +#: pg_isready.c:227 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_isready.c:229 +#: pg_isready.c:230 #, c-format msgid " -d, --dbname=DBNAME database name\n" msgstr " -d, --dbname=DBNAME Datenbankname\n" -#: pg_isready.c:230 +#: pg_isready.c:231 #, c-format msgid " -q, --quiet run quietly\n" msgstr " -q, --quiet weniger ausgeben\n" -#: pg_isready.c:231 +#: pg_isready.c:232 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_isready.c:232 +#: pg_isready.c:233 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_isready.c:235 +#: pg_isready.c:236 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: pg_isready.c:236 +#: pg_isready.c:237 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT Port des Datenbankservers\n" -#: pg_isready.c:237 +#: pg_isready.c:238 #, c-format msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n" msgstr " -t, --timeout=SEK Sekunden auf Verbindung warten, 0 schaltet aus (Vorgabe: %s)\n" -#: pg_isready.c:238 +#: pg_isready.c:239 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: reindexdb.c:157 vacuumdb.c:195 -#, c-format -msgid "number of parallel jobs must be at least 1" -msgstr "Anzahl paralleler Jobs muss mindestens 1 sein" - -#: reindexdb.c:210 +#: reindexdb.c:209 #, c-format msgid "cannot reindex all databases and a specific one at the same time" msgstr "kann nicht alle Datenbanken und eine bestimmte gleichzeitig reindizieren" -#: reindexdb.c:215 +#: reindexdb.c:211 #, c-format msgid "cannot reindex all databases and system catalogs at the same time" msgstr "kann nicht alle Datenbanken und Systemkataloge gleichzeitig reindizieren" -#: reindexdb.c:220 +#: reindexdb.c:213 #, c-format msgid "cannot reindex specific schema(s) in all databases" msgstr "kann nicht bestimmte Schemas in allen Datenbanken reindizieren" -#: reindexdb.c:225 +#: reindexdb.c:215 #, c-format msgid "cannot reindex specific table(s) in all databases" msgstr "kann nicht bestimmte Tabelle(n) in allen Datenbanken reindizieren" -#: reindexdb.c:230 +#: reindexdb.c:217 #, c-format msgid "cannot reindex specific index(es) in all databases" msgstr "kann nicht bestimmte Indexe in allen Datenbanken reindizieren" -#: reindexdb.c:243 +#: reindexdb.c:227 #, c-format msgid "cannot reindex specific schema(s) and system catalogs at the same time" msgstr "kann nicht bestimmte Schemas und Systemkataloge gleichzeitig reindizieren" -#: reindexdb.c:248 +#: reindexdb.c:229 #, c-format msgid "cannot reindex specific table(s) and system catalogs at the same time" msgstr "kann nicht bestimmte Tabelle(n) und Systemkataloge gleichzeitig reindizieren" -#: reindexdb.c:253 +#: reindexdb.c:231 #, c-format msgid "cannot reindex specific index(es) and system catalogs at the same time" msgstr "kann nicht bestimmte Indexe und Systemkataloge gleichzeitig reindizieren" -#: reindexdb.c:259 +#: reindexdb.c:234 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "kann nicht mehrere Jobs verwenden, um Systemkataloge zu reindizieren" -#: reindexdb.c:288 +#: reindexdb.c:260 #, c-format msgid "cannot use multiple jobs to reindex indexes" msgstr "kann nicht mehrere Jobs verwenden, um Indexe zu reindizieren" -#: reindexdb.c:353 reindexdb.c:361 vacuumdb.c:451 vacuumdb.c:459 vacuumdb.c:467 -#: vacuumdb.c:475 vacuumdb.c:483 vacuumdb.c:490 vacuumdb.c:497 vacuumdb.c:504 +#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439 +#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469 +#: vacuumdb.c:473 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "Option »%s« kann nicht mit Serverversionen älter als PostgreSQL %s verwendet werden" -#: reindexdb.c:401 +#: reindexdb.c:369 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "Systemkataloge können nicht nebenläufig reindiziert werden, werden alle übersprungen" -#: reindexdb.c:605 +#: reindexdb.c:573 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "Reindizieren der Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:609 +#: reindexdb.c:577 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "Reindizieren des Index »%s« in Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:613 +#: reindexdb.c:581 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "Reindizieren des Schemas »%s« in Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:617 +#: reindexdb.c:585 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "Reindizieren der Systemkataloge in Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:621 +#: reindexdb.c:589 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "Reindizieren der Tabelle »%s« in Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:774 +#: reindexdb.c:742 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: reindiziere Datenbank »%s«\n" -#: reindexdb.c:791 +#: reindexdb.c:759 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -904,64 +929,64 @@ msgstr "" "%s reindiziert eine PostgreSQL-Datenbank.\n" "\n" -#: reindexdb.c:795 +#: reindexdb.c:763 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all alle Datenbanken reindizieren\n" -#: reindexdb.c:796 +#: reindexdb.c:764 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " --concurrently nebenläufig reindizieren\n" -#: reindexdb.c:797 +#: reindexdb.c:765 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=DBNAME zu reindizierende Datenbank\n" -#: reindexdb.c:799 +#: reindexdb.c:767 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr " -i, --index=INDEX nur bestimmte(n) Index(e) erneuern\n" -#: reindexdb.c:800 +#: reindexdb.c:768 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" msgstr "" " -j, --jobs=NUM so viele parallele Verbindungen zum Reindizieren\n" " verwenden\n" -#: reindexdb.c:801 +#: reindexdb.c:769 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet unterdrücke alle Mitteilungen\n" -#: reindexdb.c:802 +#: reindexdb.c:770 #, c-format -msgid " -s, --system reindex system catalogs\n" -msgstr " -s, --system Systemkataloge reindizieren\n" +msgid " -s, --system reindex system catalogs only\n" +msgstr " -s, --system nur Systemkataloge reindizieren\n" -#: reindexdb.c:803 +#: reindexdb.c:771 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr " -S, --schema=SCHEMA nur bestimmte(s) Schema(s) reindizieren\n" -#: reindexdb.c:804 +#: reindexdb.c:772 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=TABELLE nur bestimmte Tabelle(n) reindizieren\n" -#: reindexdb.c:805 +#: reindexdb.c:773 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr " --tablespace=TABLESPACE Tablespace wo Indexe neu gebaut werden\n" -#: reindexdb.c:806 +#: reindexdb.c:774 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: reindexdb.c:816 +#: reindexdb.c:784 #, c-format msgid "" "\n" @@ -971,75 +996,65 @@ msgstr "" "Für weitere Informationen lesen Sie bitte die Beschreibung des\n" "SQL-Befehls REINDEX.\n" -#: vacuumdb.c:203 -#, c-format -msgid "parallel vacuum degree must be a non-negative integer" -msgstr "parallele Vacuum-Einstellung muss eine nicht-negative ganze Zahl sein" - -#: vacuumdb.c:223 -#, c-format -msgid "minimum transaction ID age must be at least 1" -msgstr "minimales Transaktions-ID-Alter muss mindestens 1 sein" - -#: vacuumdb.c:231 -#, c-format -msgid "minimum multixact ID age must be at least 1" -msgstr "minimales Multixact-ID-Alter muss mindestens 1 sein" - -#: vacuumdb.c:272 vacuumdb.c:278 vacuumdb.c:284 vacuumdb.c:290 vacuumdb.c:296 -#: vacuumdb.c:302 vacuumdb.c:314 +#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279 +#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "kann Option »%s« nicht verwenden, wenn nur Analyze durchgeführt wird" -#: vacuumdb.c:320 +#: vacuumdb.c:297 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "kann Option »%s« nicht verwenden, wenn volles Vacuum durchgeführt wird" -#: vacuumdb.c:343 +#: vacuumdb.c:303 +#, c-format +msgid "cannot use the \"%s\" option with the \"%s\" option" +msgstr "kann Option »%s« nicht mit der Option »%s« verwenden" + +#: vacuumdb.c:322 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "kann nicht alle Datenbanken und eine bestimmte gleichzeitig vacuumen" -#: vacuumdb.c:348 +#: vacuumdb.c:324 #, c-format msgid "cannot vacuum specific table(s) in all databases" msgstr "kann nicht bestimmte Tabelle(n) in allen Datenbanken vacuumen" -#: vacuumdb.c:438 +#: vacuumdb.c:412 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Erzeuge minimale Optimierer-Statistiken (1 Ziel)" -#: vacuumdb.c:439 +#: vacuumdb.c:413 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Erzeuge mittlere Optimierer-Statistiken (10 Ziele)" -#: vacuumdb.c:440 +#: vacuumdb.c:414 msgid "Generating default (full) optimizer statistics" msgstr "Erzeuge volle Optimierer-Statistiken" -#: vacuumdb.c:512 +#: vacuumdb.c:479 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: bearbeite Datenbank »%s«: %s\n" -#: vacuumdb.c:515 +#: vacuumdb.c:482 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: führe Vacuum in Datenbank »%s« aus\n" -#: vacuumdb.c:976 +#: vacuumdb.c:952 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "Vacuum der Tabelle »%s« in Datenbank »%s« fehlgeschlagen: %s" -#: vacuumdb.c:979 +#: vacuumdb.c:955 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "Vacuum der Datenbank »%s« fehlgeschlagen: %s" -#: vacuumdb.c:987 +#: vacuumdb.c:963 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1048,123 +1063,128 @@ msgstr "" "%s säubert und analysiert eine PostgreSQL-Datenbank.\n" "\n" -#: vacuumdb.c:991 +#: vacuumdb.c:967 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all führe Vacuum in allen Datenbanken aus\n" -#: vacuumdb.c:992 +#: vacuumdb.c:968 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=DBNAME führe Vacuum in dieser Datenbank aus\n" -#: vacuumdb.c:993 +#: vacuumdb.c:969 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping Page-Skipping-Verhalten abschalten\n" -#: vacuumdb.c:994 +#: vacuumdb.c:970 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr "" " -e, --echo zeige die Befehle, die an den Server\n" " gesendet werden\n" -#: vacuumdb.c:995 +#: vacuumdb.c:971 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full führe volles Vacuum durch\n" -#: vacuumdb.c:996 +#: vacuumdb.c:972 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze Zeilentransaktionsinformationen einfrieren\n" -#: vacuumdb.c:997 +#: vacuumdb.c:973 +#, c-format +msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" +msgstr " --force-index-cleanup Indexeinträge, die auf tote Tupel zeigen, immer entfernen\n" + +#: vacuumdb.c:974 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr "" " -j, --jobs=NUM so viele parallele Verbindungen zum Vacuum\n" " verwenden\n" -#: vacuumdb.c:998 +#: vacuumdb.c:975 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr "" " --min-mxid-age=MXID-ALTER minimales Multixact-ID-Alter zu bearbeitender\n" " Tabellen\n" -#: vacuumdb.c:999 +#: vacuumdb.c:976 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr "" " --min-xid-age=XID-ALTER minimales Transaktions-ID-Alter zu bearbeitender\n" " Tabellen\n" -#: vacuumdb.c:1000 +#: vacuumdb.c:977 #, c-format msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" msgstr " --no-index-cleanup Indexeinträge, die auf tote Tupel zeigen, nicht entfernen\n" -#: vacuumdb.c:1001 +#: vacuumdb.c:978 #, c-format msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" msgstr " --no-process-toast zur Tabelle gehörige TOAST-Tabelle überspringen\n" -#: vacuumdb.c:1002 +#: vacuumdb.c:979 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" msgstr " --no-truncate leere Seiten am Ende der Tabelle nicht abschneiden\n" -#: vacuumdb.c:1003 +#: vacuumdb.c:980 #, c-format -msgid " -P, --parallel=PARALLEL_DEGREE use this many background workers for vacuum, if available\n" +msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" msgstr "" -" -P, --parallel=PARALLEL-GRAD so viele Background-Worker für Vacuum verwenden,\n" +" -P, --parallel=PARALLEL-PROZ so viele Background-Worker für Vacuum verwenden,\n" " wenn verfügbar\n" -#: vacuumdb.c:1004 +#: vacuumdb.c:981 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet unterdrücke alle Mitteilungen\n" -#: vacuumdb.c:1005 +#: vacuumdb.c:982 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr "" " --skip-locked Relationen überspringen, die nicht sofort\n" " gesperrt werden können\n" -#: vacuumdb.c:1006 +#: vacuumdb.c:983 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr "" " -t, --table='TABELLE[(SPALTEN)]'\n" " führe Vacuum für bestimmte Tabelle(n) aus\n" -#: vacuumdb.c:1007 +#: vacuumdb.c:984 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: vacuumdb.c:1008 +#: vacuumdb.c:985 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: vacuumdb.c:1009 +#: vacuumdb.c:986 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze aktualisiere Statistiken für den Optimierer\n" -#: vacuumdb.c:1010 +#: vacuumdb.c:987 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr "" " -Z, --analyze-only aktualisiere nur Statistiken für den Optimierer;\n" " kein Vacuum\n" -#: vacuumdb.c:1011 +#: vacuumdb.c:988 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1174,12 +1194,12 @@ msgstr "" " in mehreren Phasen für schnellere Ergebnisse;\n" " kein Vacuum\n" -#: vacuumdb.c:1013 +#: vacuumdb.c:990 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: vacuumdb.c:1021 +#: vacuumdb.c:998 #, c-format msgid "" "\n" diff --git a/src/bin/scripts/po/el.po b/src/bin/scripts/po/el.po new file mode 100644 index 0000000000..7cf6af1375 --- /dev/null +++ b/src/bin/scripts/po/el.po @@ -0,0 +1,1173 @@ +# Greek message translation file for pgscripts +# Copyright (C) 2021 PostgreSQL Global Development Group +# This file is distributed under the same license as the pgscripts (PostgreSQL) package. +# Georgios Kokolatos , 2021. +# +msgid "" +msgstr "" +"Project-Id-Version: pgscripts (PostgreSQL) 14\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2021-11-08 10:16+0000\n" +"PO-Revision-Date: 2021-11-08 12:11+0100\n" +"Last-Translator: Georgios Kokolatos \n" +"Language-Team: \n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.0\n" + +#: ../../../src/common/logging.c:259 +#, c-format +msgid "fatal: " +msgstr "κρίσιμο: " + +#: ../../../src/common/logging.c:266 +#, c-format +msgid "error: " +msgstr "σφάλμα: " + +#: ../../../src/common/logging.c:273 +#, c-format +msgid "warning: " +msgstr "προειδοποίηση: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#, c-format +msgid "out of memory\n" +msgstr "έλλειψη μνήμης\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "δεν ήταν δυνατή η αντιγραφή δείκτη null (εσωτερικό σφάλμα)\n" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "δεν ήταν δυνατή η αναζήτηση ενεργής ταυτότητας χρήστη %ld: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "ο χρήστης δεν υπάρχει" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "αποτυχία αναζήτησης ονόματος χρήστη: κωδικός σφάλματος % lu" + +#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +msgid "Cancel request sent\n" +msgstr "Αίτηση ακύρωσης εστάλη\n" + +#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 +msgid "Could not send cancel request: " +msgstr "Δεν ήταν δυνατή η αποστολή αίτησης ακύρωσης: " + +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:107 +msgid "Password: " +msgstr "Κωδικός πρόσβασης: " + +#: ../../fe_utils/connect_utils.c:92 +#, c-format +msgid "could not connect to database %s: out of memory" +msgstr "δεν ήταν δυνατή η σύνδεση με τη βάσης δεδομένων %s: έλλειψη μνήμης" + +#: ../../fe_utils/connect_utils.c:120 pg_isready.c:145 +#, c-format +msgid "%s" +msgstr "%s" + +#: ../../fe_utils/parallel_slot.c:302 +#, c-format +msgid "too many jobs for this platform" +msgstr "πάρα πολλές εργασίες για την παρούσα πλατφόρμα" + +#: ../../fe_utils/parallel_slot.c:522 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "η επεξεργασία της βάσης δεδομένων «%s» απέτυχε: %s" + +#: ../../fe_utils/print.c:336 +#, c-format +msgid "(%lu row)" +msgid_plural "(%lu rows)" +msgstr[0] "(%lu σειρά)" +msgstr[1] "(%lu σειρές)" + +#: ../../fe_utils/print.c:3039 +#, c-format +msgid "Interrupted\n" +msgstr "Διακόπηκε\n" + +#: ../../fe_utils/print.c:3103 +#, c-format +msgid "Cannot add header to table content: column count of %d exceeded.\n" +msgstr "Δεν είναι δυνατή η προσθήκη κεφαλίδας σε περιεχόμενο πίνακα: υπέρβαση του πλήθους στηλών %d.\n" + +#: ../../fe_utils/print.c:3143 +#, c-format +msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" +msgstr "Δεν είναι δυνατή η προσθήκη κελιού σε περιεχόμενο πίνακα: υπέρβαση του συνολικού αριθμού κελιών %d.\n" + +#: ../../fe_utils/print.c:3401 +#, c-format +msgid "invalid output format (internal error): %d" +msgstr "μη έγκυρη μορφή εξόδου (εσωτερικό σφάλμα): %d" + +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 +#, c-format +msgid "query failed: %s" +msgstr "το ερώτημα απέτυχε: %s" + +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#, c-format +msgid "query was: %s" +msgstr "το ερώτημα ήταν: %s" + +#: clusterdb.c:112 clusterdb.c:131 createdb.c:123 createdb.c:142 +#: createuser.c:172 createuser.c:187 dropdb.c:103 dropdb.c:112 dropdb.c:120 +#: dropuser.c:94 dropuser.c:109 dropuser.c:122 pg_isready.c:96 pg_isready.c:110 +#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:251 vacuumdb.c:270 +#, c-format +msgid "Try \"%s --help\" for more information.\n" +msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n" + +#: clusterdb.c:129 createdb.c:140 createuser.c:185 dropdb.c:118 dropuser.c:107 +#: pg_isready.c:108 reindexdb.c:191 vacuumdb.c:268 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "πάρα πολλοί παραμέτροι εισόδου από την γραμμή εντολών (ο πρώτη είναι η «%s»)" + +#: clusterdb.c:148 +#, c-format +msgid "cannot cluster all databases and a specific one at the same time" +msgstr "δεν είναι δυνατή η ομαδοποίηση όλων των βάσεων δεδομένων και μιας συγκεκριμένης ταυτόχρονα" + +#: clusterdb.c:154 +#, c-format +msgid "cannot cluster specific table(s) in all databases" +msgstr "δεν είναι δυνατή η ομαδοποίηση συγκεκριμένων πινάκων σε όλες τις βάσεις δεδομένων" + +#: clusterdb.c:220 +#, c-format +msgid "clustering of table \"%s\" in database \"%s\" failed: %s" +msgstr "η ομαδοποίηση του πίνακα «%s» στη βάση δεδομένων «%s» απέτυχε: %s" + +#: clusterdb.c:223 +#, c-format +msgid "clustering of database \"%s\" failed: %s" +msgstr "η ομαδοποίηση της βάσης δεδομένων «%s» απέτυχε: %s" + +#: clusterdb.c:251 +#, c-format +msgid "%s: clustering database \"%s\"\n" +msgstr "%s: ομαδοποιείται η βάση δεδομένων «%s»\n" + +#: clusterdb.c:267 +#, c-format +msgid "" +"%s clusters all previously clustered tables in a database.\n" +"\n" +msgstr "" +"%s: ομαδοποιεί όλους του προηγούμενα ομαδοποιημένους πίνακες σε μία βάση δεδομένων\n" +"\n" + +#: clusterdb.c:268 createdb.c:267 createuser.c:351 dropdb.c:171 dropuser.c:169 +#: pg_isready.c:225 reindexdb.c:792 vacuumdb.c:1025 +#, c-format +msgid "Usage:\n" +msgstr "Χρήση:\n" + +#: clusterdb.c:269 reindexdb.c:793 vacuumdb.c:1026 +#, c-format +msgid " %s [OPTION]... [DBNAME]\n" +msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n" + +#: clusterdb.c:270 createdb.c:269 createuser.c:353 dropdb.c:173 dropuser.c:171 +#: pg_isready.c:228 reindexdb.c:794 vacuumdb.c:1027 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Επιλογές:\n" + +#: clusterdb.c:271 +#, c-format +msgid " -a, --all cluster all databases\n" +msgstr " -a, --all ομαδοποίησε όλες τις βάσεις δεδομένων\n" + +#: clusterdb.c:272 +#, c-format +msgid " -d, --dbname=DBNAME database to cluster\n" +msgstr " -d, --dbname=DBNAME βάση δεδομένων για ομαδοποίηση\n" + +#: clusterdb.c:273 createuser.c:357 dropdb.c:174 dropuser.c:172 +#, c-format +msgid " -e, --echo show the commands being sent to the server\n" +msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n" + +#: clusterdb.c:274 +#, c-format +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet να μην γράψεις κανένα μήνυμα\n" + +#: clusterdb.c:275 +#, c-format +msgid " -t, --table=TABLE cluster specific table(s) only\n" +msgstr " -t, --table=TABLE να ομαδοποιήσεις μόνο συγκεκριμένους πίνακες\n" + +#: clusterdb.c:276 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose γράψε πολλά μηνύματα εξόδου\n" + +#: clusterdb.c:277 createuser.c:369 dropdb.c:177 dropuser.c:175 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" + +#: clusterdb.c:278 createuser.c:374 dropdb.c:179 dropuser.c:177 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" + +#: clusterdb.c:279 createdb.c:280 createuser.c:375 dropdb.c:180 dropuser.c:178 +#: pg_isready.c:234 reindexdb.c:809 vacuumdb.c:1052 +#, c-format +msgid "" +"\n" +"Connection options:\n" +msgstr "" +"\n" +"Επιλογές σύνδεσης:\n" + +#: clusterdb.c:280 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1053 +#, c-format +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n" + +#: clusterdb.c:281 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων\n" + +#: clusterdb.c:282 dropdb.c:183 vacuumdb.c:1055 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=USERNAME όνομα χρήστη με το οποίο να συνδεθεί\n" + +#: clusterdb.c:283 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1056 +#, c-format +msgid " -w, --no-password never prompt for password\n" +msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n" + +#: clusterdb.c:284 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057 +#, c-format +msgid " -W, --password force password prompt\n" +msgstr " -W, --password αναγκαστική προτροπή κωδικού πρόσβασης\n" + +#: clusterdb.c:285 dropdb.c:186 vacuumdb.c:1058 +#, c-format +msgid " --maintenance-db=DBNAME alternate maintenance database\n" +msgstr " --maintenance-db=DBNAME εναλλακτική βάση δεδομένων συντήρησης\n" + +#: clusterdb.c:286 +#, c-format +msgid "" +"\n" +"Read the description of the SQL command CLUSTER for details.\n" +msgstr "" +"\n" +"Διαβάστε την περιγραφή της SQL εντολής CLUSTER για λεπτομέρειες.\n" + +#: clusterdb.c:287 createdb.c:288 createuser.c:381 dropdb.c:187 dropuser.c:184 +#: pg_isready.c:239 reindexdb.c:817 vacuumdb.c:1060 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Υποβάλετε αναφορές σφάλματων σε <%s>.\n" + +#: clusterdb.c:288 createdb.c:289 createuser.c:382 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:818 vacuumdb.c:1061 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s αρχική σελίδα: <%s>\n" + +#: common.c:107 +#, c-format +msgid "query returned %d row instead of one: %s" +msgid_plural "query returned %d rows instead of one: %s" +msgstr[0] "το ερώτημα επέστρεψε %d σειρά αντί μίας: %s" +msgstr[1] "το ερώτημα επέστρεψε %d σειρές αντί μίας: %s" + +#. translator: abbreviation for "yes" +#: common.c:131 +msgid "y" +msgstr "y" + +#. translator: abbreviation for "no" +#: common.c:133 +msgid "n" +msgstr "n" + +#. translator: This is a question followed by the translated options for +#. "yes" and "no". +#: common.c:143 +#, c-format +msgid "%s (%s/%s) " +msgstr "%s (%s/%s) " + +#: common.c:164 +#, c-format +msgid "Please answer \"%s\" or \"%s\".\n" +msgstr "Παρακαλώ απαντήστε «%s» ή «%s».\n" + +#: createdb.c:150 +#, c-format +msgid "only one of --locale and --lc-ctype can be specified" +msgstr "μόνο ένα από τα --locale και --lc-ctype μπορεί να καθοριστεί" + +#: createdb.c:155 +#, c-format +msgid "only one of --locale and --lc-collate can be specified" +msgstr "μόνο ένα από τα --locale και --lc-collate μπορεί να καθοριστεί" + +#: createdb.c:166 +#, c-format +msgid "\"%s\" is not a valid encoding name" +msgstr "«%s» δεν είναι έγκυρο όνομα κωδικοποίησης" + +#: createdb.c:229 +#, c-format +msgid "database creation failed: %s" +msgstr "η δημιουργία βάσης δεδομένων απέτυχε: %s" + +#: createdb.c:248 +#, c-format +msgid "comment creation failed (database was created): %s" +msgstr "η δημιουργία σχολίων απέτυχε (δημιουργήθηκε βάση δεδομένων): %s" + +#: createdb.c:266 +#, c-format +msgid "" +"%s creates a PostgreSQL database.\n" +"\n" +msgstr "" +"%s δημιουργεί μια βάση δεδομένων PostgreSQL.\n" +"\n" + +#: createdb.c:268 +#, c-format +msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" +msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME] [ΠΕΡΙΓΡΑΦΗ]\n" + +#: createdb.c:270 +#, c-format +msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" +msgstr " -D, --tablespace=TABLESPACE προεπιλεγμένος πινακοχώρος για τη βάση δεδομένων\n" + +#: createdb.c:271 reindexdb.c:798 +#, c-format +msgid " -e, --echo show the commands being sent to the server\n" +msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n" + +#: createdb.c:272 +#, c-format +msgid " -E, --encoding=ENCODING encoding for the database\n" +msgstr " -E, --encoding=ENCODING κωδικοποίηση για την βάση δεδομένων\n" + +#: createdb.c:273 +#, c-format +msgid " -l, --locale=LOCALE locale settings for the database\n" +msgstr " -l, --locale=LOCALE ρυθμίσεις εντοπιότητας για τη βάση δεδομένων\n" + +#: createdb.c:274 +#, c-format +msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" +msgstr " --lc-collate=LOCALE ρύθμιση LC_COLLATE για την βάση δεδομένων\n" + +#: createdb.c:275 +#, c-format +msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" +msgstr " --lc-collate=LOCALE ρύθμιση LC_CTYPE για την βάση δεδομένων\n" + +#: createdb.c:276 +#, c-format +msgid " -O, --owner=OWNER database user to own the new database\n" +msgstr " -O, --owner=OWNER όνομα χρήστη που θα κατέχει την νέα βάση δεδομένων\n" + +#: createdb.c:277 +#, c-format +msgid " -T, --template=TEMPLATE template database to copy\n" +msgstr " -T, --template=TEMPLATE πρωτότυπη βάση δεδομένων για αντιγραφή\n" + +#: createdb.c:278 reindexdb.c:807 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης και, στη συνέχεια, έξοδος\n" + +#: createdb.c:279 reindexdb.c:808 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, και μετά έξοδος\n" + +#: createdb.c:281 reindexdb.c:810 +#, c-format +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n" + +#: createdb.c:282 reindexdb.c:811 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων\n" + +#: createdb.c:283 reindexdb.c:812 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=USERNAME όνομα χρήστη με το οποίο να συνδεθεί\n" + +#: createdb.c:284 reindexdb.c:813 +#, c-format +msgid " -w, --no-password never prompt for password\n" +msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n" + +#: createdb.c:285 reindexdb.c:814 +#, c-format +msgid " -W, --password force password prompt\n" +msgstr " -W, --password αναγκαστική προτροπή κωδικού πρόσβασης\n" + +#: createdb.c:286 reindexdb.c:815 +#, c-format +msgid " --maintenance-db=DBNAME alternate maintenance database\n" +msgstr " --maintenance-db=DBNAME εναλλακτική βάση δεδομένων συντήρησης\n" + +#: createdb.c:287 +#, c-format +msgid "" +"\n" +"By default, a database with the same name as the current user is created.\n" +msgstr "" +"\n" +"Από προεπιλογή, δημιουργείται μια βάση δεδομένων με το ίδιο όνομα με τον τρέχοντα χρήστη.\n" + +#: createuser.c:151 +#, c-format +msgid "invalid value for --connection-limit: %s" +msgstr "άκυρη τιμή για --connection-limit: %s" + +#: createuser.c:195 +msgid "Enter name of role to add: " +msgstr "Εισαγάγετε το όνομα του ρόλου για να προσθέσετε: " + +#: createuser.c:210 +msgid "Enter password for new role: " +msgstr "Εισαγάγετε κωδικό πρόσβασης για νέο ρόλο: " + +#: createuser.c:211 +msgid "Enter it again: " +msgstr "Εισάγετε ξανά: " + +#: createuser.c:214 +#, c-format +msgid "Passwords didn't match.\n" +msgstr "Οι κωδικοί πρόσβασης δεν είναι ίδιοι.\n" + +#: createuser.c:222 +msgid "Shall the new role be a superuser?" +msgstr "Να είναι ο νέος ρόλος υπερχρήστης;" + +#: createuser.c:237 +msgid "Shall the new role be allowed to create databases?" +msgstr "Να επιτραπεί στον νέο ρόλο η δημιουργία βάσεων δεδομένων;" + +#: createuser.c:245 +msgid "Shall the new role be allowed to create more new roles?" +msgstr "Να επιτραπεί στον νέο ρόλο να δημιουργήσει περισσότερους νέους ρόλους;" + +#: createuser.c:281 +#, c-format +msgid "password encryption failed: %s" +msgstr "η κρυπτογράφηση κωδικού πρόσβασης απέτυχε: %s" + +#: createuser.c:336 +#, c-format +msgid "creation of new role failed: %s" +msgstr "η δημιουργία νέου ρόλου απέτυχε: %s" + +#: createuser.c:350 +#, c-format +msgid "" +"%s creates a new PostgreSQL role.\n" +"\n" +msgstr "" +"%s δημιουργεί ένα νέο ρόλο PostgreSQL.\n" +"\n" + +#: createuser.c:352 dropuser.c:170 +#, c-format +msgid " %s [OPTION]... [ROLENAME]\n" +msgstr " %s [ΕΠΙΛΟΓΗ]... [ROLENAME]\n" + +#: createuser.c:354 +#, c-format +msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" +msgstr " -c, --connection-limit=N όριο σύνδεσης για το ρόλο (προεπιλογή: κανένα όριο)\n" + +#: createuser.c:355 +#, c-format +msgid " -d, --createdb role can create new databases\n" +msgstr " -d, --createdb ο ρόλος μπορεί να δημιουργήσει νέες βάσεις δεδομένων\n" + +#: createuser.c:356 +#, c-format +msgid " -D, --no-createdb role cannot create databases (default)\n" +msgstr " -D, --no-createdb ο ρόλος δεν μπορεί να δημιουργήσει βάσεις δεδομένων (προεπιλογή)\n" + +#: createuser.c:358 +#, c-format +msgid " -g, --role=ROLE new role will be a member of this role\n" +msgstr " -g, --role=ROLE ο καινούριος ρόλος να αποτελεί μέλος αυτού του ρόλου\n" + +#: createuser.c:359 +#, c-format +msgid "" +" -i, --inherit role inherits privileges of roles it is a\n" +" member of (default)\n" +msgstr "" +" -i, --inherit ο ρόλος να κληρονομεί τα προνόμια των ρόλων των\n" +" οποίων είναι μέλος τους (προεπιλογή)\n" + +#: createuser.c:361 +#, c-format +msgid " -I, --no-inherit role does not inherit privileges\n" +msgstr " -I, --no-inherit ο ρόλος δεν κληρονομεί προνόμια\n" + +#: createuser.c:362 +#, c-format +msgid " -l, --login role can login (default)\n" +msgstr " -l, --login ο ρόλος μπορεί να συνδεθεί (προεπιλογή)\n" + +#: createuser.c:363 +#, c-format +msgid " -L, --no-login role cannot login\n" +msgstr " -L, --no-login ο ρόλος δεν μπορεί να συνδεθεί\n" + +#: createuser.c:364 +#, c-format +msgid " -P, --pwprompt assign a password to new role\n" +msgstr " -P, --pwprompt αντιστοιχίσε έναν κωδικό πρόσβασης στο νέο ρόλο\n" + +#: createuser.c:365 +#, c-format +msgid " -r, --createrole role can create new roles\n" +msgstr " -r, --createrole ο ρόλος μπορεί να δημιουργεί νέους ρόλους\n" + +#: createuser.c:366 +#, c-format +msgid " -R, --no-createrole role cannot create roles (default)\n" +msgstr " -R, --no-createrole ο ρόλος δεν μπορεί να δημιουργεί νέους ρόλους (προεπιλογή)\n" + +#: createuser.c:367 +#, c-format +msgid " -s, --superuser role will be superuser\n" +msgstr " -s, --superuser ο ρόλος θα είναι υπερχρήστης\n" + +#: createuser.c:368 +#, c-format +msgid " -S, --no-superuser role will not be superuser (default)\n" +msgstr " -S, --no-superuser ο ρόλος δεν θα είναι υπερχρήστης (προεπιλογή)\n" + +#: createuser.c:370 +#, c-format +msgid "" +" --interactive prompt for missing role name and attributes rather\n" +" than using defaults\n" +msgstr "" +" --interactive να προτρέψει για το όνομα ρόλου και τα χαρακτηριστικά αντί\n" +" να χρησιμοποιήσει προεπιλογές\n" + +#: createuser.c:372 +#, c-format +msgid " --replication role can initiate replication\n" +msgstr " --replication ο ρόλος μπορεί να εκκινήσει αναπαραγωγή\n" + +#: createuser.c:373 +#, c-format +msgid " --no-replication role cannot initiate replication\n" +msgstr " --no-replication ο ρόλος να μην μπορεί να εκκινήσει αναπαραγωγή\n" + +#: createuser.c:378 +#, c-format +msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" +msgstr " -U, --username=USERNAME όνομα χρήστη για να συνδεθεί ως (όχι αυτό που θα δημιουργηθεί)\n" + +#: dropdb.c:111 +#, c-format +msgid "missing required argument database name" +msgstr "λείπει αναγκαία παράμετρος ονόματος βάσης δεδομένων" + +#: dropdb.c:126 +#, c-format +msgid "Database \"%s\" will be permanently removed.\n" +msgstr "Η βάση δεδομένων «%s» θα αφαιρεθεί οριστικά.\n" + +#: dropdb.c:127 dropuser.c:130 +msgid "Are you sure?" +msgstr "Είστε βέβαιος;" + +#: dropdb.c:156 +#, c-format +msgid "database removal failed: %s" +msgstr "η αφαίρεση της βάσης δεδομένων απέτυχε: %s" + +#: dropdb.c:170 +#, c-format +msgid "" +"%s removes a PostgreSQL database.\n" +"\n" +msgstr "" +"%s αφαιρεί μία βάση δεδομένων PostgreSQL.\n" +"\n" + +#: dropdb.c:172 +#, c-format +msgid " %s [OPTION]... DBNAME\n" +msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n" + +#: dropdb.c:175 +#, c-format +msgid " -f, --force try to terminate other connections before dropping\n" +msgstr " -f, --force να προσπαθήσει να τερματίσει άλλες συνδέσεις πριν την εγκατάληψη\n" + +#: dropdb.c:176 +#, c-format +msgid " -i, --interactive prompt before deleting anything\n" +msgstr " -i, --interactive να προτρέψει πριν να διαγράψει οτιδήποτε\n" + +#: dropdb.c:178 +#, c-format +msgid " --if-exists don't report error if database doesn't exist\n" +msgstr " --if-exists να μην αναφέρει σφάλμα εάν η βάση δεδομένων δεν υπάρχει\n" + +#: dropuser.c:117 +msgid "Enter name of role to drop: " +msgstr "Εισαγάγετε το όνομα του ρόλου για να απορρίψετε: " + +#: dropuser.c:121 +#, c-format +msgid "missing required argument role name" +msgstr "λείπει η απαιτούμενη παράμετρος ονόματος ρόλου" + +#: dropuser.c:129 +#, c-format +msgid "Role \"%s\" will be permanently removed.\n" +msgstr "Ο ρόλος «%s» θα αφαιρεθεί οριστικά.\n" + +#: dropuser.c:153 +#, c-format +msgid "removal of role \"%s\" failed: %s" +msgstr "η αφαίρεση του ρόλου «%s» απέτυχε: %s" + +#: dropuser.c:168 +#, c-format +msgid "" +"%s removes a PostgreSQL role.\n" +"\n" +msgstr "" +"%s αφαιρεί ένα ρόλο PostgreSQL.\n" +"\n" + +#: dropuser.c:173 +#, c-format +msgid "" +" -i, --interactive prompt before deleting anything, and prompt for\n" +" role name if not specified\n" +msgstr "" +" -i, --interactive να προτρέψει πριν να διαγράψει οτιδήποτε, και να προτρέψει για\n" +" το όνομα του ρόλου, εάν αυτό δεν έχει καθοριστεί\n" + +#: dropuser.c:176 +#, c-format +msgid " --if-exists don't report error if user doesn't exist\n" +msgstr " --if-exists να μην αναφέρει σφάλμα εάν ο χρήστης δεν υπάρχει\n" + +#: dropuser.c:181 +#, c-format +msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n" +msgstr " -U, --username=USERNAME όνομα χρήστη με το οποίο να συνδεθεί (όχι αυτό που θα αφαιρέσει)\n" + +#: pg_isready.c:153 +#, c-format +msgid "could not fetch default options" +msgstr "δεν ήταν δυνατή η λήψη προεπιλεγμένων ρυθμίσεων" + +#: pg_isready.c:202 +#, c-format +msgid "accepting connections\n" +msgstr "αποδέχεται συνδέσεις\n" + +#: pg_isready.c:205 +#, c-format +msgid "rejecting connections\n" +msgstr "απορρίπτει συνδέσεις\n" + +#: pg_isready.c:208 +#, c-format +msgid "no response\n" +msgstr "καμία απάντηση\n" + +#: pg_isready.c:211 +#, c-format +msgid "no attempt\n" +msgstr "καμία προσπάθεια\n" + +#: pg_isready.c:214 +#, c-format +msgid "unknown\n" +msgstr "άγνωστο\n" + +#: pg_isready.c:224 +#, c-format +msgid "" +"%s issues a connection check to a PostgreSQL database.\n" +"\n" +msgstr "" +"%s εκτελεί ένα έλεγχο σύνδεσης σε μια βάση δεδομένων PostgreSQL.\n" +"\n" + +#: pg_isready.c:226 +#, c-format +msgid " %s [OPTION]...\n" +msgstr " %s [ΕΠΙΛΟΓΗ]...\n" + +#: pg_isready.c:229 +#, c-format +msgid " -d, --dbname=DBNAME database name\n" +msgstr " -d, --dbname=DBNAME ονομασία βάσης δεδομένων\n" + +#: pg_isready.c:230 +#, c-format +msgid " -q, --quiet run quietly\n" +msgstr " -q, --quiet εκτέλεσε σιωπηλά\n" + +#: pg_isready.c:231 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" + +#: pg_isready.c:232 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" + +#: pg_isready.c:235 +#, c-format +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n" + +#: pg_isready.c:236 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων\n" + +#: pg_isready.c:237 +#, c-format +msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n" +msgstr "" +" -t, --timeout=SECS πόσα δευτερόλεπτα να περιμένει όταν προσπαθεί να συνδεθεί,\n" +" 0 το απενεργοποιεί (προεπιλογή: %s)\n" + +#: pg_isready.c:238 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=USERNAME όνομα χρήστη με το οποίο να συνδεθεί\n" + +#: reindexdb.c:157 vacuumdb.c:198 +#, c-format +msgid "number of parallel jobs must be at least 1" +msgstr "ο αριθμός παράλληλων εργασιών πρέπει να είναι τουλάχιστον 1" + +#: reindexdb.c:210 +#, c-format +msgid "cannot reindex all databases and a specific one at the same time" +msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση όλων των βάσεων δεδομένων και μιας συγκεκριμένης ταυτόχρονα" + +#: reindexdb.c:215 +#, c-format +msgid "cannot reindex all databases and system catalogs at the same time" +msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση όλων των βάσεων δεδομένων και των καταλόγων συστήματος ταυτόχρονα" + +#: reindexdb.c:220 +#, c-format +msgid "cannot reindex specific schema(s) in all databases" +msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων σχημάτων σε όλες τις βάσεις δεδομένων" + +#: reindexdb.c:225 +#, c-format +msgid "cannot reindex specific table(s) in all databases" +msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων πινάκων σε όλες τις βάσεις δεδομένων" + +#: reindexdb.c:230 +#, c-format +msgid "cannot reindex specific index(es) in all databases" +msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων ευρετηρίων σε όλες τις βάσεις δεδομένων" + +#: reindexdb.c:243 +#, c-format +msgid "cannot reindex specific schema(s) and system catalogs at the same time" +msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων σχημάτων και καταλόγων συστήματος ταυτόχρονα" + +#: reindexdb.c:248 +#, c-format +msgid "cannot reindex specific table(s) and system catalogs at the same time" +msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων πινάκων και καταλόγων συστήματος ταυτόχρονα" + +#: reindexdb.c:253 +#, c-format +msgid "cannot reindex specific index(es) and system catalogs at the same time" +msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων ευρετηρίων και καταλόγων συστήματος ταυτόχρονα" + +#: reindexdb.c:259 +#, c-format +msgid "cannot use multiple jobs to reindex system catalogs" +msgstr "δεν είναι δυνατή η χρήση πολλαπλών εργασιών για την επαναευρετηριοποίηση καταλόγων συστήματος" + +#: reindexdb.c:288 +#, c-format +msgid "cannot use multiple jobs to reindex indexes" +msgstr "δεν είναι δυνατή η χρήση πολλαπλών εργασιών για την επαναευρετηριοποίηση ευρετηρίων" + +#: reindexdb.c:353 reindexdb.c:361 vacuumdb.c:471 vacuumdb.c:479 vacuumdb.c:487 +#: vacuumdb.c:495 vacuumdb.c:503 vacuumdb.c:511 vacuumdb.c:518 vacuumdb.c:525 +#: vacuumdb.c:532 +#, c-format +msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" +msgstr "δεν είναι δυνατή η χρήση της επιλογής «%s» σε εκδόσεις διακομιστών παλαιότερες από την PostgreSQL %s" + +#: reindexdb.c:401 +#, c-format +msgid "cannot reindex system catalogs concurrently, skipping all" +msgstr "δεν είναι δυνατή η ταυτόχρονη επαναευρετηριοποίηση καταλόγων συστήματος, παρακάμπτονται όλοι" + +#: reindexdb.c:605 +#, c-format +msgid "reindexing of database \"%s\" failed: %s" +msgstr "επαναευρετηριοποίηση της βάσης δεδομένων «%s» απέτυχε: %s" + +#: reindexdb.c:609 +#, c-format +msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" +msgstr "η επανενεξάγηση του ευρετηρίου «%s» στη βάση δεδομένων «%s» απέτυχε: %s" + +#: reindexdb.c:613 +#, c-format +msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" +msgstr "η επαναευρετηριοποίηση του σχήματος «%s» στη βάση δεδομένων «%s» απέτυχε: %s" + +#: reindexdb.c:617 +#, c-format +msgid "reindexing of system catalogs in database \"%s\" failed: %s" +msgstr "η επαναευρετηριοποίηση καταλόγων συστήματος στη βάση δεδομένων «%s» απέτυχε: %s" + +#: reindexdb.c:621 +#, c-format +msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" +msgstr "η επαναευρετηριοποίηση του πίνακα «%s» στη βάση δεδομένων «%s» απέτυχε: %s" + +#: reindexdb.c:774 +#, c-format +msgid "%s: reindexing database \"%s\"\n" +msgstr "%s: επαναευρετηριοποίηση της βάσης δεδομένων «%s»\n" + +#: reindexdb.c:791 +#, c-format +msgid "" +"%s reindexes a PostgreSQL database.\n" +"\n" +msgstr "" +"%s επαναευρετηριοποιεί μια βάση δεδομένων PostgreSQL.\n" +"\n" + +#: reindexdb.c:795 +#, c-format +msgid " -a, --all reindex all databases\n" +msgstr " -a, --all επαναευρετηριοποίηση όλων των βάσεων δεδομένων\n" + +#: reindexdb.c:796 +#, c-format +msgid " --concurrently reindex concurrently\n" +msgstr " -a, --all ταυτόχρονη επαναευρετηριοποίηση\n" + +#: reindexdb.c:797 +#, c-format +msgid " -d, --dbname=DBNAME database to reindex\n" +msgstr " -d, --dbname=DBNAME βάση δεδομένων για επαναευρετηριοποίηση\n" + +#: reindexdb.c:799 +#, c-format +msgid " -i, --index=INDEX recreate specific index(es) only\n" +msgstr " -i, --index=INDEX δημιούργησε συγκεκριμένο(ους) πίνακα(ες) μόνο\n" + +#: reindexdb.c:800 +#, c-format +msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" +msgstr " -j, --jobs=NUM χρησιμοποιήσε τόσες πολλές ταυτόχρονες συνδέσεις με το διακομιστή\n" + +#: reindexdb.c:801 +#, c-format +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet να μην γράψεις κανένα μήνυμα\n" + +#: reindexdb.c:802 +#, c-format +msgid " -s, --system reindex system catalogs only\n" +msgstr " -s, --system επαναευρετηριοποίηση μόνο καταλόγων συστήματος\n" + +#: reindexdb.c:803 +#, c-format +msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" +msgstr " -S, --schema=SCHEMA επαναευρετηριοποίησε συγκεκριμένο(-α) σχήμα(-τα) μόνο\n" + +#: reindexdb.c:804 +#, c-format +msgid " -t, --table=TABLE reindex specific table(s) only\n" +msgstr " -t, --table=TABLE επαναευρετηριοποίησε συγκεκριμένο(-ους) πίνακα(-ες) μόνο\n" + +#: reindexdb.c:805 +#, c-format +msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" +msgstr " --tablespace=TABLESPACE πινακοχώρος όπου επαναδημιουργούνται τα ευρετήρια\n" + +#: reindexdb.c:806 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose γράψε πολλά μηνύματα εξόδου\n" + +#: reindexdb.c:816 +#, c-format +msgid "" +"\n" +"Read the description of the SQL command REINDEX for details.\n" +msgstr "" +"\n" +"Διαβάστε την περιγραφή της SQL εντολής REINDEX για λεπτομέρειες.\n" + +#: vacuumdb.c:206 +#, c-format +msgid "parallel workers for vacuum must be greater than or equal to zero" +msgstr "οι παράλληλοι εργάτες για vacuum πρέπει να είναι περισσότεροι ή ίσοι με μηδέν" + +#: vacuumdb.c:226 +#, c-format +msgid "minimum transaction ID age must be at least 1" +msgstr "η ελάχιστη ηλικία transaction ID πρέπει να είναι τουλάχιστον 1" + +#: vacuumdb.c:234 +#, c-format +msgid "minimum multixact ID age must be at least 1" +msgstr "η ελάχιστη ηλικία multixact ID πρέπει να είναι τουλάχιστον 1" + +#: vacuumdb.c:278 vacuumdb.c:284 vacuumdb.c:290 vacuumdb.c:296 vacuumdb.c:302 +#: vacuumdb.c:308 vacuumdb.c:314 vacuumdb.c:326 +#, c-format +msgid "cannot use the \"%s\" option when performing only analyze" +msgstr "δεν είναι δυνατή η χρήση της επιλογής «%s» κατά την εκτέλεση μόνο της ανάλυσης" + +#: vacuumdb.c:332 +#, c-format +msgid "cannot use the \"%s\" option when performing full vacuum" +msgstr "δεν είναι δυνατή η χρήση της επιλογής «%s» κατά την εκτέλεση full vacuum" + +#: vacuumdb.c:341 +#, c-format +msgid "cannot use the \"%s\" option with the \"%s\" option" +msgstr "δεν είναι δυνατή η χρήση της επιλογής «%s» μαζί με την επιλογή«%s»" + +#: vacuumdb.c:363 +#, c-format +msgid "cannot vacuum all databases and a specific one at the same time" +msgstr "δεν μπορεί να εκτελέσει vacuum σε όλες τις βάσεις δεδομένων και μια συγκεκριμένη ταυτόχρονα" + +#: vacuumdb.c:368 +#, c-format +msgid "cannot vacuum specific table(s) in all databases" +msgstr "δεν μπορεί να εκτελέσει vacuum συγκεκριμένους πίνακες σε όλες τις βάσεις δεδομένων" + +#: vacuumdb.c:458 +msgid "Generating minimal optimizer statistics (1 target)" +msgstr "Δημιουργία ελάχιστων στατιστικών βελτιστοποιητή (1 στόχος)" + +#: vacuumdb.c:459 +msgid "Generating medium optimizer statistics (10 targets)" +msgstr "Δημιουργία μεσαίων στατιστικών βελτιστοποιητή (10 στόχοι)" + +#: vacuumdb.c:460 +msgid "Generating default (full) optimizer statistics" +msgstr "Δημιουργία προεπιλεγμένων (πλήρων) στατιστικών βελτιστοποιητή" + +#: vacuumdb.c:540 +#, c-format +msgid "%s: processing database \"%s\": %s\n" +msgstr "%s: επεξεργάζεται τη βάση δεδομένων «%s»: %s\n" + +#: vacuumdb.c:543 +#, c-format +msgid "%s: vacuuming database \"%s\"\n" +msgstr "%s: εκτελεί vacuum στη βάση δεδομένων «%s»\n" + +#: vacuumdb.c:1013 +#, c-format +msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" +msgstr "η εκτέλεση vacuum στον πίνακα «%s» στη βάση δεδομένων «%s» απέτυχε: %s" + +#: vacuumdb.c:1016 +#, c-format +msgid "vacuuming of database \"%s\" failed: %s" +msgstr "η εκτέλεση vacuum στη βάση δεδομένων «%s» απέτυχε: %s" + +#: vacuumdb.c:1024 +#, c-format +msgid "" +"%s cleans and analyzes a PostgreSQL database.\n" +"\n" +msgstr "" +"%s καθαρίζει και αναλύει μια βάση δεδομένων PostgreSQL.\n" +"\n" + +#: vacuumdb.c:1028 +#, c-format +msgid " -a, --all vacuum all databases\n" +msgstr " -a, --all εκτέλεσε vacuum σε όλες τις βάσεις δεδομένων\n" + +#: vacuumdb.c:1029 +#, c-format +msgid " -d, --dbname=DBNAME database to vacuum\n" +msgstr " -d, --dbname=DBNAME βάση δεδομένων για vacuum\n" + +#: vacuumdb.c:1030 +#, c-format +msgid " --disable-page-skipping disable all page-skipping behavior\n" +msgstr " --disable-page-skipping απενεργοποιήστε κάθε συμπεριφορά παράλειψης σελίδας\n" + +#: vacuumdb.c:1031 +#, c-format +msgid " -e, --echo show the commands being sent to the server\n" +msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n" + +#: vacuumdb.c:1032 +#, c-format +msgid " -f, --full do full vacuuming\n" +msgstr " -f, --full να εκτελέσει πλήρες vacuum\n" + +#: vacuumdb.c:1033 +#, c-format +msgid " -F, --freeze freeze row transaction information\n" +msgstr " -F, --freeze πάγωσε τις πληροφορίες σειράς συναλλαγής\n" + +#: vacuumdb.c:1034 +#, c-format +msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" +msgstr " --force-index-cleanup αφαιρεί πάντα καταχωρήσεις ευρετηρίου που οδηγούν σε νεκρές πλειάδες\n" + +#: vacuumdb.c:1035 +#, c-format +msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" +msgstr " -j, --jobs=NUM χρησιμοποιήσε τόσες πολλές ταυτόχρονες συνδέσεις με το διακομιστή\n" + +#: vacuumdb.c:1036 +#, c-format +msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" +msgstr " --min-mxid-age=MXID_AGE ελάχιστη ηλικία multixact ID πινάκων για vacuum\n" + +#: vacuumdb.c:1037 +#, c-format +msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" +msgstr " --min-xid-age=XID_AGE ελάχιστη ηλικία transaction ID πινάκων για vacuum\n" + +#: vacuumdb.c:1038 +#, c-format +msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" +msgstr " --no-index-cleanup να μην αφαιρέσει καταχωρήσεις ευρετηρίου που οδηγούν σε νεκρές πλειάδες\n" + +#: vacuumdb.c:1039 +#, c-format +msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" +msgstr " --no-process-toast παράλειψε τον πίνακα TOAST που σχετίζεται με τον πίνακα που εκτελείται vacuum\n" + +#: vacuumdb.c:1040 +#, c-format +msgid " --no-truncate don't truncate empty pages at the end of the table\n" +msgstr " --no-truncate να μην περικόψει άδειες σελίδες από το τέλος του πίνακα\n" + +#: vacuumdb.c:1041 +#, c-format +msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" +msgstr "" +" -P, --parallel=PARALLEL_WORKERS χρησιμοποίησε τόσους πολλούς εργάτες παρασκηνίου\n" +" για την εκτέλεση vacuum, εάν αυτοί είναι διαθέσιμοι\n" + +#: vacuumdb.c:1042 +#, c-format +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet να μην γράψεις κανένα μήνυμα\n" + +#: vacuumdb.c:1043 +#, c-format +msgid " --skip-locked skip relations that cannot be immediately locked\n" +msgstr " --skip-locked να παραλείψει σχέσεις που δεν μπορούν να κλειδωθούν άμεσα\n" + +#: vacuumdb.c:1044 +#, c-format +msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" +msgstr " -t, --table=‘TABLE[(COLUMNS)]’ να εκτελέσει vacuum μόνο σε συγκεκριμένους πίνακες\n" + +#: vacuumdb.c:1045 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose γράψε πολλά μηνύματα εξόδου\n" + +#: vacuumdb.c:1046 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" + +#: vacuumdb.c:1047 +#, c-format +msgid " -z, --analyze update optimizer statistics\n" +msgstr " -z, --analyze ενημέρωσε τα στατιστικά του βελτιστοποιητή\n" + +#: vacuumdb.c:1048 +#, c-format +msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" +msgstr " -z, --analyze μόνο ενημέρωσε τα στατιστικά του βελτιστοποιητή· χωρίς vacuum\n" + +#: vacuumdb.c:1049 +#, c-format +msgid "" +" --analyze-in-stages only update optimizer statistics, in multiple\n" +" stages for faster results; no vacuum\n" +msgstr "" +" --analyze-in-stages ενημέρωσε μόνο τα στατιστικά στοιχεία βελτιστοποίησης, σε πολλαπλά\n" +" στάδια για ταχύτερα αποτελέσματα· χωρίς vacuum\n" + +#: vacuumdb.c:1051 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" + +#: vacuumdb.c:1059 +#, c-format +msgid "" +"\n" +"Read the description of the SQL command VACUUM for details.\n" +msgstr "" +"\n" +"Διαβάστε την περιγραφή της SQL εντολής VACUUM για λεπτομέρειες.\n" diff --git a/src/bin/scripts/po/es.po b/src/bin/scripts/po/es.po index 60caeb05ac..af74bb7edb 100644 --- a/src/bin/scripts/po/es.po +++ b/src/bin/scripts/po/es.po @@ -1,6 +1,6 @@ # pgscripts spanish translation # -# Copyright (c) 2003-2019, PostgreSQL Global Development Group +# Copyright (c) 2003-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Alvaro Herrera, , 2003-2013 @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: pgscripts (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-06-11 16:48+0000\n" -"PO-Revision-Date: 2021-06-14 20:04-0500\n" +"POT-Creation-Date: 2022-01-12 04:17+0000\n" +"PO-Revision-Date: 2022-01-12 17:38-0500\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -135,13 +135,13 @@ msgstr "la consulta era: %s" #: clusterdb.c:112 clusterdb.c:131 createdb.c:123 createdb.c:142 #: createuser.c:172 createuser.c:187 dropdb.c:103 dropdb.c:112 dropdb.c:120 #: dropuser.c:94 dropuser.c:109 dropuser.c:122 pg_isready.c:96 pg_isready.c:110 -#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:245 vacuumdb.c:264 +#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:251 vacuumdb.c:270 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Use «%s --help» para mayor información.\n" #: clusterdb.c:129 createdb.c:140 createuser.c:185 dropdb.c:118 dropuser.c:107 -#: pg_isready.c:108 reindexdb.c:191 vacuumdb.c:262 +#: pg_isready.c:108 reindexdb.c:191 vacuumdb.c:268 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" @@ -182,18 +182,18 @@ msgstr "" "\n" #: clusterdb.c:268 createdb.c:267 createuser.c:351 dropdb.c:171 dropuser.c:169 -#: pg_isready.c:225 reindexdb.c:792 vacuumdb.c:988 +#: pg_isready.c:225 reindexdb.c:792 vacuumdb.c:1025 #, c-format msgid "Usage:\n" msgstr "Empleo:\n" -#: clusterdb.c:269 reindexdb.c:793 vacuumdb.c:989 +#: clusterdb.c:269 reindexdb.c:793 vacuumdb.c:1026 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPCIÓN]... [BASE-DE-DATOS]\n" #: clusterdb.c:270 createdb.c:269 createuser.c:353 dropdb.c:173 dropuser.c:171 -#: pg_isready.c:228 reindexdb.c:794 vacuumdb.c:990 +#: pg_isready.c:228 reindexdb.c:794 vacuumdb.c:1027 #, c-format msgid "" "\n" @@ -243,7 +243,7 @@ msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" #: clusterdb.c:279 createdb.c:280 createuser.c:375 dropdb.c:180 dropuser.c:178 -#: pg_isready.c:234 reindexdb.c:809 vacuumdb.c:1014 +#: pg_isready.c:234 reindexdb.c:809 vacuumdb.c:1052 #, c-format msgid "" "\n" @@ -252,32 +252,32 @@ msgstr "" "\n" "Opciones de conexión:\n" -#: clusterdb.c:280 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1015 +#: clusterdb.c:280 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1053 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=ANFITRIÓN nombre del servidor o directorio del socket\n" -#: clusterdb.c:281 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1016 +#: clusterdb.c:281 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PUERTO puerto del servidor\n" -#: clusterdb.c:282 dropdb.c:183 vacuumdb.c:1017 +#: clusterdb.c:282 dropdb.c:183 vacuumdb.c:1055 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n" -#: clusterdb.c:283 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1018 +#: clusterdb.c:283 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1056 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password nunca pedir contraseña\n" -#: clusterdb.c:284 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1019 +#: clusterdb.c:284 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password forzar la petición de contraseña\n" -#: clusterdb.c:285 dropdb.c:186 vacuumdb.c:1020 +#: clusterdb.c:285 dropdb.c:186 vacuumdb.c:1058 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=BASE base de datos de mantención alternativa\n" @@ -292,7 +292,7 @@ msgstr "" "Lea la descripción de la orden CLUSTER de SQL para obtener mayores detalles.\n" #: clusterdb.c:287 createdb.c:288 createuser.c:381 dropdb.c:187 dropuser.c:184 -#: pg_isready.c:239 reindexdb.c:817 vacuumdb.c:1022 +#: pg_isready.c:239 reindexdb.c:817 vacuumdb.c:1060 #, c-format msgid "" "\n" @@ -302,7 +302,7 @@ msgstr "" "Reporte errores a <%s>.\n" #: clusterdb.c:288 createdb.c:289 createuser.c:382 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:818 vacuumdb.c:1023 +#: pg_isready.c:240 reindexdb.c:818 vacuumdb.c:1061 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" @@ -656,7 +656,7 @@ msgstr " %s [OPCIÓN]... BASE-DE-DATOS\n" #: dropdb.c:175 #, c-format msgid " -f, --force try to terminate other connections before dropping\n" -msgstr " -f, --force intentar cancelar otras conexiones antes de borrar\n" +msgstr " -f, --force intentar cancelar otras conexiones antes de borrar\n" #: dropdb.c:176 #, c-format @@ -803,7 +803,7 @@ msgstr "" msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n" -#: reindexdb.c:157 vacuumdb.c:195 +#: reindexdb.c:157 vacuumdb.c:198 #, c-format msgid "number of parallel jobs must be at least 1" msgstr "número de trabajos en paralelo debe ser al menos 1" @@ -858,8 +858,9 @@ msgstr "no se pueden usar múltiples procesos para reindexar índices de sistema msgid "cannot use multiple jobs to reindex indexes" msgstr "no se pueden usar múltiples procesos para reindexar índices" -#: reindexdb.c:353 reindexdb.c:361 vacuumdb.c:451 vacuumdb.c:459 vacuumdb.c:467 -#: vacuumdb.c:475 vacuumdb.c:483 vacuumdb.c:490 vacuumdb.c:497 vacuumdb.c:504 +#: reindexdb.c:353 reindexdb.c:361 vacuumdb.c:471 vacuumdb.c:479 vacuumdb.c:487 +#: vacuumdb.c:495 vacuumdb.c:503 vacuumdb.c:511 vacuumdb.c:518 vacuumdb.c:525 +#: vacuumdb.c:532 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "no se puede usar la opción «%s» cuando con versiones más antiguas que PostgreSQL %s" @@ -940,8 +941,8 @@ msgstr " -q, --quiet no desplegar mensajes\n" #: reindexdb.c:802 #, c-format -msgid " -s, --system reindex system catalogs\n" -msgstr " -s, --system reindexar los catálogos del sistema\n" +msgid " -s, --system reindex system catalogs only\n" +msgstr " -s, --system solo reindexar los catálogos del sistema\n" #: reindexdb.c:803 #, c-format @@ -972,75 +973,80 @@ msgstr "" "\n" "Lea la descripción de la orden REINDEX de SQL para obtener mayores detalles.\n" -#: vacuumdb.c:203 +#: vacuumdb.c:206 #, c-format msgid "parallel workers for vacuum must be greater than or equal to zero" msgstr "el número de procesos paralelos para vacuum debe ser mayor o igual que cero" -#: vacuumdb.c:223 +#: vacuumdb.c:226 #, c-format msgid "minimum transaction ID age must be at least 1" msgstr "edad mínima del ID de transacción debe ser al menos 1" -#: vacuumdb.c:231 +#: vacuumdb.c:234 #, c-format msgid "minimum multixact ID age must be at least 1" msgstr "edad mínima del ID de multixact debe ser al menos 1" -#: vacuumdb.c:272 vacuumdb.c:278 vacuumdb.c:284 vacuumdb.c:290 vacuumdb.c:296 -#: vacuumdb.c:302 vacuumdb.c:314 +#: vacuumdb.c:278 vacuumdb.c:284 vacuumdb.c:290 vacuumdb.c:296 vacuumdb.c:302 +#: vacuumdb.c:308 vacuumdb.c:314 vacuumdb.c:326 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "no se puede usar la opción «%s» cuando se está sólo actualizando estadísticas" -#: vacuumdb.c:320 +#: vacuumdb.c:332 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "no se puede usar la opción «%s» cuando se está ejecutando vacuum full" -#: vacuumdb.c:343 +#: vacuumdb.c:341 +#, c-format +msgid "cannot use the \"%s\" option with the \"%s\" option" +msgstr "no se puede usar la opción «%s» junto con la opción «%s»" + +#: vacuumdb.c:363 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "no se pueden limpiar todas las bases de datos y una de ellas en particular simultáneamente" -#: vacuumdb.c:348 +#: vacuumdb.c:368 #, c-format msgid "cannot vacuum specific table(s) in all databases" msgstr "no es posible limpiar tablas específicas en todas las bases de datos" -#: vacuumdb.c:438 +#: vacuumdb.c:458 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Generando estadísticas mínimas para el optimizador (tamaño = 1)" -#: vacuumdb.c:439 +#: vacuumdb.c:459 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Generando estadísticas medias para el optimizador (tamaño = 10)" -#: vacuumdb.c:440 +#: vacuumdb.c:460 msgid "Generating default (full) optimizer statistics" msgstr "Generando estadísticas predeterminadas (completas) para el optimizador" -#: vacuumdb.c:512 +#: vacuumdb.c:540 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: procesando la base de datos «%s»: %s\n" -#: vacuumdb.c:515 +#: vacuumdb.c:543 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: limpiando la base de datos «%s»\n" -#: vacuumdb.c:976 +#: vacuumdb.c:1013 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "falló la limpieza de la tabla «%s» en la base de datos «%s»: %s" -#: vacuumdb.c:979 +#: vacuumdb.c:1016 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "falló la limpieza de la base de datos «%s»: %s" -#: vacuumdb.c:987 +#: vacuumdb.c:1024 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1049,111 +1055,116 @@ msgstr "" "%s limpia (VACUUM) y analiza una base de datos PostgreSQL.\n" "\n" -#: vacuumdb.c:991 +#: vacuumdb.c:1028 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all limpia todas las bases de datos\n" -#: vacuumdb.c:992 +#: vacuumdb.c:1029 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=BASE base de datos a limpiar\n" -#: vacuumdb.c:993 +#: vacuumdb.c:1030 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping desactiva todo comportamiento de saltar páginas\n" -#: vacuumdb.c:994 +#: vacuumdb.c:1031 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo mostrar las órdenes enviadas al servidor\n" -#: vacuumdb.c:995 +#: vacuumdb.c:1032 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full usar «vacuum full»\n" -#: vacuumdb.c:996 +#: vacuumdb.c:1033 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze usar «vacuum freeze»\n" -#: vacuumdb.c:997 +#: vacuumdb.c:1034 +#, c-format +msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" +msgstr " --force-index-cleanup siempre eliminar entradas de índice que apunten a tuplas muertas\n" + +#: vacuumdb.c:1035 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr " -j, --jobs=NUM usar esta cantidad de conexiones concurrentes\n" -#: vacuumdb.c:998 +#: vacuumdb.c:1036 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr " --min-mxid-age=EDAD_MXID edad de multixact ID mínima de tablas a limpiar\n" -#: vacuumdb.c:999 +#: vacuumdb.c:1037 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr " --min-xid-age=EDAD_XID edad de ID de transacción mínima de tablas a limpiar\n" -#: vacuumdb.c:1000 +#: vacuumdb.c:1038 #, c-format msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" msgstr " --no-index-cleanup no eliminar entradas de índice que apunten a tuplas muertas\n" -#: vacuumdb.c:1001 +#: vacuumdb.c:1039 #, c-format msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" msgstr " --no-process-toast Omitir la tabla TOAST asociada con la tabla a la que se hará vacuum\n" -#: vacuumdb.c:1002 +#: vacuumdb.c:1040 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" msgstr " --no-truncate no truncar las páginas vacías al final de la tabla\n" -#: vacuumdb.c:1003 +#: vacuumdb.c:1041 #, c-format msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" msgstr " -P, --parallel=PROC_PARALELOS usar esta cantidad de procesos para vacuum, si están disponibles\n" -#: vacuumdb.c:1004 +#: vacuumdb.c:1042 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet no desplegar mensajes\n" -#: vacuumdb.c:1005 +#: vacuumdb.c:1043 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr " --skip-locked ignorar relaciones que no pueden bloquearse inmediatamente\n" -#: vacuumdb.c:1006 +#: vacuumdb.c:1044 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr "" " -t, --table='TABLA[(COLUMNAS)]'\n" " limpiar sólo esta(s) tabla(s)\n" -#: vacuumdb.c:1007 +#: vacuumdb.c:1045 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose desplegar varios mensajes informativos\n" -#: vacuumdb.c:1008 +#: vacuumdb.c:1046 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión y salir\n" -#: vacuumdb.c:1009 +#: vacuumdb.c:1047 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze actualizar las estadísticas del optimizador\n" -#: vacuumdb.c:1010 +#: vacuumdb.c:1048 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr "" " -Z, --analyze-only sólo actualizar las estadísticas del optimizador;\n" " no hacer vacuum\n" -#: vacuumdb.c:1011 +#: vacuumdb.c:1049 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1163,12 +1174,12 @@ msgstr "" " en múltiples etapas para resultados más rápidos;\n" " no hacer vacuum\n" -#: vacuumdb.c:1013 +#: vacuumdb.c:1051 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: vacuumdb.c:1021 +#: vacuumdb.c:1059 #, c-format msgid "" "\n" @@ -1177,11 +1188,11 @@ msgstr "" "\n" "Lea la descripción de la orden VACUUM de SQL para obtener mayores detalles.\n" -#~ msgid "parallel vacuum degree must be a non-negative integer" -#~ msgstr "el grado de vacuum paralelo debe ser un entero no negativo" +#~ msgid "Could not send cancel request: %s" +#~ msgstr "No se pudo enviar el paquete de cancelación: %s" #~ msgid "could not connect to database %s: %s" #~ msgstr "no se pudo conectar a la base de datos %s: %s" -#~ msgid "Could not send cancel request: %s" -#~ msgstr "No se pudo enviar el paquete de cancelación: %s" +#~ msgid "parallel vacuum degree must be a non-negative integer" +#~ msgstr "el grado de vacuum paralelo debe ser un entero no negativo" diff --git a/src/bin/scripts/po/fr.po b/src/bin/scripts/po/fr.po index 163d147225..7301c792c7 100644 --- a/src/bin/scripts/po/fr.po +++ b/src/bin/scripts/po/fr.po @@ -1,40 +1,48 @@ -# translation of pgscripts.po to fr_fr -# french message translation file for pgscripts +# LANGUAGE message translation file for pgscripts +# Copyright (C) 2004-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pgscripts (PostgreSQL) package. # # Use these quotes: « %s » # # Guillaume Lelarge , 2004-2009. # Stéphane Schildknecht , 2009. +# Guillaume Lelarge , 2010-2022. +# msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-06-19 16:17+0000\n" -"PO-Revision-Date: 2021-06-20 17:21+0200\n" +"POT-Creation-Date: 2022-05-14 10:19+0000\n" +"PO-Revision-Date: 2022-05-14 17:16+0200\n" "Last-Translator: Guillaume Lelarge \n" -"Language-Team: PostgreSQLfr \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.3\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "fatal : " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "attention : " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "astuce : " + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -58,67 +66,77 @@ msgstr "l'utilisateur n'existe pas" #: ../../common/username.c:60 #, c-format msgid "user name lookup failure: error code %lu" -msgstr "échec lors de la recherche du nom d'utilisateur : code erreur %lu" +msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu" -#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 msgid "Cancel request sent\n" msgstr "Requête d'annulation envoyée\n" -#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 msgid "Could not send cancel request: " msgstr "N'a pas pu envoyer la requête d'annulation : " -#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:107 +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104 msgid "Password: " msgstr "Mot de passe : " -#: ../../fe_utils/connect_utils.c:92 +#: ../../fe_utils/connect_utils.c:91 #, c-format msgid "could not connect to database %s: out of memory" msgstr "n'a pas pu se connecter à la base de données %s : plus de mémoire" -#: ../../fe_utils/connect_utils.c:120 pg_isready.c:145 +#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146 #, c-format msgid "%s" msgstr "%s" -#: ../../fe_utils/parallel_slot.c:302 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "valeur « %s » invalide pour l'option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s doit être compris entre %d et %d" + +#: ../../fe_utils/parallel_slot.c:301 #, c-format msgid "too many jobs for this platform" msgstr "trop de jobs pour cette plateforme" -#: ../../fe_utils/parallel_slot.c:522 +#: ../../fe_utils/parallel_slot.c:519 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "le traitement de la base de données « %s » a échoué : %s" -#: ../../fe_utils/print.c:336 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu ligne)" msgstr[1] "(%lu lignes)" -#: ../../fe_utils/print.c:3039 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Interrompu\n" -#: ../../fe_utils/print.c:3103 +#: ../../fe_utils/print.c:3173 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "" "Ne peut pas ajouter l'en-tête au contenu de la table : le nombre de colonnes\n" "%d est dépassé.\n" -#: ../../fe_utils/print.c:3143 +#: ../../fe_utils/print.c:3213 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "" "Ne peut pas ajouter une cellule au contenu de la table : le nombre total des\n" "cellules %d est dépassé.\n" -#: ../../fe_utils/print.c:3401 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "format de sortie invalide (erreur interne) : %d" @@ -130,19 +148,19 @@ msgstr "échec de la requête : %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 #, c-format -msgid "query was: %s" -msgstr "la requête était : %s" +msgid "Query was: %s" +msgstr "La requête était : %s" -#: clusterdb.c:112 clusterdb.c:131 createdb.c:123 createdb.c:142 -#: createuser.c:172 createuser.c:187 dropdb.c:103 dropdb.c:112 dropdb.c:120 -#: dropuser.c:94 dropuser.c:109 dropuser.c:122 pg_isready.c:96 pg_isready.c:110 -#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:251 vacuumdb.c:270 +#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158 +#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121 +#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 +#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Essayer « %s --help » pour plus d'informations.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." -#: clusterdb.c:129 createdb.c:140 createuser.c:185 dropdb.c:118 dropuser.c:107 -#: pg_isready.c:108 reindexdb.c:191 vacuumdb.c:268 +#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108 +#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" @@ -152,49 +170,49 @@ msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" msgid "cannot cluster all databases and a specific one at the same time" msgstr "ne peut pas réorganiser à la fois toutes les bases de données et une base spécifique via la commande CLUSTER" -#: clusterdb.c:154 +#: clusterdb.c:151 #, c-format msgid "cannot cluster specific table(s) in all databases" msgstr "ne peut pas réorganiser la(les) table(s) spécifique(s) dans toutes les bases de données" -#: clusterdb.c:220 +#: clusterdb.c:215 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "la réorganisation de la table « %s » de la base de données « %s » avec la commande CLUSTER a échoué : %s" -#: clusterdb.c:223 +#: clusterdb.c:218 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "la réorganisation de la base de données « %s » via la commande CLUSTER a échoué : %s" -#: clusterdb.c:251 +#: clusterdb.c:246 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s : réorganisation de la base de données « %s » via la commande CLUSTER\n" -#: clusterdb.c:267 +#: clusterdb.c:262 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" "\n" msgstr "" -"%s réorganise toutes les tables précédemment réorganisées au sein d'une base\n" -"de données via la commande CLUSTER.\n" +"%s réorganise toutes les tables précédemment réorganisées au sein d'une\n" +"base de données via la commande CLUSTER.\n" "\n" -#: clusterdb.c:268 createdb.c:267 createuser.c:351 dropdb.c:171 dropuser.c:169 -#: pg_isready.c:225 reindexdb.c:792 vacuumdb.c:1032 +#: clusterdb.c:263 createdb.c:283 createuser.c:346 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: clusterdb.c:269 reindexdb.c:793 vacuumdb.c:1033 +#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 #, c-format msgid " %s [OPTION]... [DBNAME]\n" -msgstr " %s [OPTION]... [NOMBASE]\n" +msgstr " %s [OPTION]... [BASE]\n" -#: clusterdb.c:270 createdb.c:269 createuser.c:353 dropdb.c:173 dropuser.c:171 -#: pg_isready.c:228 reindexdb.c:794 vacuumdb.c:1034 +#: clusterdb.c:265 createdb.c:285 createuser.c:348 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966 #, c-format msgid "" "\n" @@ -203,48 +221,48 @@ msgstr "" "\n" "Options :\n" -#: clusterdb.c:271 +#: clusterdb.c:266 #, c-format msgid " -a, --all cluster all databases\n" -msgstr " -a, --all réorganise toutes les bases de données\n" +msgstr " -a, --all réorganise toutes les bases de données\n" -#: clusterdb.c:272 +#: clusterdb.c:267 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" -msgstr " -d, --dbname=NOMBASE base de données à réorganiser\n" +msgstr " -d, --dbname=BASE réorganise la base de données spécifiée\n" -#: clusterdb.c:273 createuser.c:357 dropdb.c:174 dropuser.c:172 +#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo affiche les commandes envoyées au serveur\n" -#: clusterdb.c:274 +#: clusterdb.c:269 #, c-format msgid " -q, --quiet don't write any messages\n" -msgstr " -q, --quiet n'écrit aucun message\n" +msgstr " -q, --quiet n'écrit aucun message\n" -#: clusterdb.c:275 +#: clusterdb.c:270 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" -msgstr " -t, --table=TABLE réorganise uniquement cette(ces) table(s)\n" +msgstr " -t, --table=TABLE réorganise uniquement la table spécifiée\n" -#: clusterdb.c:276 +#: clusterdb.c:271 #, c-format msgid " -v, --verbose write a lot of output\n" -msgstr " -v, --verbose mode verbeux\n" +msgstr " -v, --verbose mode verbeux\n" -#: clusterdb.c:277 createuser.c:369 dropdb.c:177 dropuser.c:175 +#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version puis quitte\n" +msgstr " -V, --version affiche la version puis quitte\n" -#: clusterdb.c:278 createuser.c:374 dropdb.c:179 dropuser.c:177 +#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide puis quitte\n" +msgstr " -?, --help affiche cette aide puis quitte\n" -#: clusterdb.c:279 createdb.c:280 createuser.c:375 dropdb.c:180 dropuser.c:178 -#: pg_isready.c:234 reindexdb.c:809 vacuumdb.c:1059 +#: clusterdb.c:274 createdb.c:300 createuser.c:370 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 #, c-format msgid "" "\n" @@ -253,39 +271,39 @@ msgstr "" "\n" "Options de connexion :\n" -#: clusterdb.c:280 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1060 +#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" -" -h, --host=HOTE hôte du serveur de bases de données ou\n" +" -h, --host=HÔTE hôte du serveur de bases de données ou\n" " répertoire des sockets\n" -#: clusterdb.c:281 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1061 +#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT port du serveur de bases de données\n" -#: clusterdb.c:282 dropdb.c:183 vacuumdb.c:1062 +#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" -msgstr " -U, --username=NOMUTILISATEUR nom d'utilisateur pour la connexion\n" +msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n" -#: clusterdb.c:283 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1063 +#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995 #, c-format msgid " -w, --no-password never prompt for password\n" -msgstr " -w, --no-password empêche la demande d'un mot de passe\n" +msgstr " -w, --no-password empêche la demande d'un mot de passe\n" -#: clusterdb.c:284 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1064 +#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996 #, c-format msgid " -W, --password force password prompt\n" -msgstr " -W, --password force la demande d'un mot de passe\n" +msgstr " -W, --password force la demande d'un mot de passe\n" -#: clusterdb.c:285 dropdb.c:186 vacuumdb.c:1065 +#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" -msgstr " --maintenance-db=NOM_BASE indique une autre base par défaut\n" +msgstr " --maintenance-db=BASE indique une autre base par défaut\n" -#: clusterdb.c:286 +#: clusterdb.c:281 #, c-format msgid "" "\n" @@ -294,8 +312,8 @@ msgstr "" "\n" "Lire la description de la commande SQL CLUSTER pour de plus amples détails.\n" -#: clusterdb.c:287 createdb.c:288 createuser.c:381 dropdb.c:187 dropuser.c:184 -#: pg_isready.c:239 reindexdb.c:817 vacuumdb.c:1067 +#: clusterdb.c:282 createdb.c:308 createuser.c:376 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999 #, c-format msgid "" "\n" @@ -304,11 +322,11 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: clusterdb.c:288 createdb.c:289 createuser.c:382 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:818 vacuumdb.c:1068 +#: clusterdb.c:283 createdb.c:309 createuser.c:377 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil %s : <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" #: common.c:107 #, c-format @@ -339,32 +357,32 @@ msgstr "%s (%s/%s) " msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Merci de répondre « %s » ou « %s ».\n" -#: createdb.c:150 +#: createdb.c:165 #, c-format msgid "only one of --locale and --lc-ctype can be specified" msgstr "une seule des options --locale et --lc-ctype peut être indiquée" -#: createdb.c:155 +#: createdb.c:167 #, c-format msgid "only one of --locale and --lc-collate can be specified" msgstr "une seule des options --locale et --lc-collate peut être indiquée" -#: createdb.c:166 +#: createdb.c:175 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "« %s » n'est pas un nom d'encodage valide" -#: createdb.c:229 +#: createdb.c:245 #, c-format msgid "database creation failed: %s" msgstr "la création de la base de données a échoué : %s" -#: createdb.c:248 +#: createdb.c:264 #, c-format msgid "comment creation failed (database was created): %s" msgstr "l'ajout du commentaire a échoué (la base de données a été créée) : %s" -#: createdb.c:266 +#: createdb.c:282 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -373,98 +391,115 @@ msgstr "" "%s crée une base de données PostgreSQL.\n" "\n" -#: createdb.c:268 +#: createdb.c:284 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" -msgstr " %s [OPTION]... [NOMBASE] [DESCRIPTION]\n" +msgstr " %s [OPTION]... [BASE] [DESCRIPTION]\n" -#: createdb.c:270 +#: createdb.c:286 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TABLESPACE tablespace par défaut de la base de données\n" -#: createdb.c:271 reindexdb.c:798 +#: createdb.c:287 reindexdb.c:766 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo affiche les commandes envoyées au serveur\n" -#: createdb.c:272 +#: createdb.c:288 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" -msgstr " -E, --encoding=ENC encodage de la base de données\n" +msgstr " -E, --encoding=ENCODAGE encodage de la base de données\n" -#: createdb.c:273 +#: createdb.c:289 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" -msgstr "" -" -l, --locale=LOCALE paramètre de la locale pour la base de\n" -" données\n" +msgstr " -l, --locale=LOCALE paramètre de la locale pour la base de données\n" -#: createdb.c:274 +#: createdb.c:290 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOCALE paramètre LC_COLLATE pour la base de données\n" -#: createdb.c:275 +#: createdb.c:291 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=LOCALE paramètre LC_CTYPE pour la base de données\n" -#: createdb.c:276 +#: createdb.c:292 +#, c-format +msgid " --icu-locale=LOCALE ICU locale setting for the database\n" +msgstr " --icu-locale=LOCALE paramètre de la locale ICU pour la base de données\n" + +#: createdb.c:293 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" locale provider for the database's default collation\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" fournisseur de locale pour la collation par défaut de la base de données\n" + +#: createdb.c:295 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr "" " -O, --owner=PROPRIÉTAIRE nom du propriétaire de la nouvelle base de\n" " données\n" -#: createdb.c:277 +#: createdb.c:296 +#, c-format +msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" +msgstr " -S, --strategy=STRATEGIE stratégie de création de base (wal_log ou file_copy)\n" + +#: createdb.c:297 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=MODÈLE base de données modèle à copier\n" -#: createdb.c:278 reindexdb.c:807 +#: createdb.c:298 reindexdb.c:775 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version puis quitte\n" +msgstr " -V, --version affiche la version puis quitte\n" -#: createdb.c:279 reindexdb.c:808 +#: createdb.c:299 reindexdb.c:776 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide puis quitte\n" +msgstr " -?, --help affiche cette aide puis quitte\n" -#: createdb.c:281 reindexdb.c:810 +#: createdb.c:301 reindexdb.c:778 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" -" -h, --host=HOTE hôte du serveur de bases de données\n" +" -h, --host=HÔTE hôte du serveur de bases de données\n" " ou répertoire des sockets\n" -#: createdb.c:282 reindexdb.c:811 +#: createdb.c:302 reindexdb.c:779 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT port du serveur de bases de données\n" -#: createdb.c:283 reindexdb.c:812 +#: createdb.c:303 reindexdb.c:780 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" -msgstr " -U, --username=NOMUTILISATEUR nom d'utilisateur pour la connexion\n" +msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n" -#: createdb.c:284 reindexdb.c:813 +#: createdb.c:304 reindexdb.c:781 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password empêche la demande d'un mot de passe\n" -#: createdb.c:285 reindexdb.c:814 +#: createdb.c:305 reindexdb.c:782 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password force la demande d'un mot de passe\n" -#: createdb.c:286 reindexdb.c:815 +#: createdb.c:306 reindexdb.c:783 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" -msgstr " --maintenance-db=NOM_BASE indique une autre base par défaut\n" +msgstr " --maintenance-db=BASE indique une autre base par défaut\n" -#: createdb.c:287 +#: createdb.c:307 #, c-format msgid "" "\n" @@ -473,51 +508,46 @@ msgstr "" "\n" "Par défaut, la base de donnée créée porte le nom de l'utilisateur courant.\n" -#: createuser.c:151 -#, c-format -msgid "invalid value for --connection-limit: %s" -msgstr "valeur invalide pour --connection-limit : %s" - -#: createuser.c:195 +#: createuser.c:193 msgid "Enter name of role to add: " msgstr "Saisir le nom du rôle à ajouter : " -#: createuser.c:210 +#: createuser.c:208 msgid "Enter password for new role: " msgstr "Saisir le mot de passe pour le nouveau rôle : " -#: createuser.c:211 +#: createuser.c:209 msgid "Enter it again: " -msgstr "Le saisir de nouveau : " +msgstr "Saisir le mot de passe à nouveau : " -#: createuser.c:214 +#: createuser.c:212 #, c-format msgid "Passwords didn't match.\n" msgstr "Les mots de passe ne sont pas identiques.\n" -#: createuser.c:222 +#: createuser.c:220 msgid "Shall the new role be a superuser?" msgstr "Le nouveau rôle est-il super-utilisateur ?" -#: createuser.c:237 +#: createuser.c:235 msgid "Shall the new role be allowed to create databases?" msgstr "Le nouveau rôle est-il autorisé à créer des bases de données ?" -#: createuser.c:245 +#: createuser.c:243 msgid "Shall the new role be allowed to create more new roles?" msgstr "Le nouveau rôle est-il autorisé à créer de nouveaux rôles ?" -#: createuser.c:281 +#: createuser.c:278 #, c-format msgid "password encryption failed: %s" msgstr "échec du chiffrement du mot de passe : %s" -#: createuser.c:336 +#: createuser.c:331 #, c-format msgid "creation of new role failed: %s" -msgstr "la création du nouvel rôle a échoué : %s" +msgstr "la création du nouveau rôle a échoué : %s" -#: createuser.c:350 +#: createuser.c:345 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -526,87 +556,87 @@ msgstr "" "%s crée un nouvel rôle PostgreSQL.\n" "\n" -#: createuser.c:352 dropuser.c:170 +#: createuser.c:347 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" -msgstr " %s [OPTION]... [NOMROLE]\n" +msgstr " %s [OPTION]... [RÔLE]\n" -#: createuser.c:354 +#: createuser.c:349 #, c-format msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" msgstr "" -" -c, --connection-limit=N nombre maximal de connexions pour le rôle\n" -" (par défaut sans limite)\n" +" -c, --connection-limit=N nombre maximum de connexions pour le rôle (par\n" +" défaut sans limite)\n" -#: createuser.c:355 +#: createuser.c:350 #, c-format msgid " -d, --createdb role can create new databases\n" -msgstr "" -" -d, --createdb l'utilisateur peut créer des bases de\n" -" données\n" +msgstr " -d, --createdb le rôle peut créer des bases de données\n" -#: createuser.c:356 +#: createuser.c:351 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr "" -" -D, --no-createdb le rôle ne peut pas créer de bases de\n" -" données (par défaut)\n" +" -D, --no-createdb le rôle ne peut pas créer de bases de données\n" +" (par défaut)\n" -#: createuser.c:358 +#: createuser.c:353 #, c-format msgid " -g, --role=ROLE new role will be a member of this role\n" msgstr " -g, --role=ROLE le nouveau rôle sera un membre de ce rôle\n" -#: createuser.c:359 +#: createuser.c:354 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" " member of (default)\n" msgstr "" -" -i, --inherit le rôle hérite des droits des rôles dont il\n" -" est membre (par défaut)\n" +" -i, --inherit le rôle hérite des droits des rôles dont il est\n" +" membre (par défaut)\n" -#: createuser.c:361 +#: createuser.c:356 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit le rôle n'hérite pas des droits\n" -#: createuser.c:362 +#: createuser.c:357 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login le rôle peut se connecter (par défaut)\n" -#: createuser.c:363 +#: createuser.c:358 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login le rôle ne peut pas se connecter\n" -#: createuser.c:364 +#: createuser.c:359 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt affecte un mot de passe au nouveau rôle\n" -#: createuser.c:365 +#: createuser.c:360 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole le rôle peut créer des rôles\n" -#: createuser.c:366 +#: createuser.c:361 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole le rôle ne peut pas créer de rôles (par défaut)\n" -#: createuser.c:367 +#: createuser.c:362 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser le rôle est super-utilisateur\n" -#: createuser.c:368 +#: createuser.c:363 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" -msgstr " -S, --no-superuser le rôle ne sera pas super-utilisateur (par défaut)\n" +msgstr "" +" -S, --no-superuser le rôle n'est pas super-utilisateur (par\n" +" défaut)\n" -#: createuser.c:370 +#: createuser.c:365 #, c-format msgid "" " --interactive prompt for missing role name and attributes rather\n" @@ -615,47 +645,47 @@ msgstr "" " --interactive demande le nom du rôle et les attributs\n" " plutôt qu'utiliser des valeurs par défaut\n" -#: createuser.c:372 +#: createuser.c:367 #, c-format msgid " --replication role can initiate replication\n" msgstr "" -" --replication le rôle peut initier une connexion de\n" -" réplication\n" +" --replication le rôle peut initier une connexion de\n" +" réplication\n" -#: createuser.c:373 +#: createuser.c:368 #, c-format msgid " --no-replication role cannot initiate replication\n" msgstr "" -" --no-replication le rôle ne peut pas initier de connexion de\n" -" réplication\n" +" --no-replication le rôle ne peut pas initier de connexion de\n" +" réplication\n" -#: createuser.c:378 +#: createuser.c:373 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" msgstr "" -" -U, --username=NOMUTILISATEUR nom de l'utilisateur pour la connexion (pas\n" +" -U, --username=UTILISATEUR nom de l'utilisateur pour la connexion (pas\n" " celui à créer)\n" -#: dropdb.c:111 +#: dropdb.c:112 #, c-format msgid "missing required argument database name" msgstr "argument nom de la base de données requis mais manquant" -#: dropdb.c:126 +#: dropdb.c:127 #, c-format msgid "Database \"%s\" will be permanently removed.\n" msgstr "La base de données « %s » sera définitivement supprimée.\n" -#: dropdb.c:127 dropuser.c:130 +#: dropdb.c:128 dropuser.c:131 msgid "Are you sure?" msgstr "Êtes-vous sûr ?" -#: dropdb.c:156 +#: dropdb.c:157 #, c-format msgid "database removal failed: %s" msgstr "la suppression de la base de données a échoué : %s" -#: dropdb.c:170 +#: dropdb.c:171 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -664,50 +694,52 @@ msgstr "" "%s supprime une base de données PostgreSQL.\n" "\n" -#: dropdb.c:172 +#: dropdb.c:173 #, c-format msgid " %s [OPTION]... DBNAME\n" -msgstr " %s [OPTION]... NOMBASE\n" +msgstr " %s [OPTION]... BASE\n" -#: dropdb.c:175 +#: dropdb.c:176 #, c-format msgid " -f, --force try to terminate other connections before dropping\n" -msgstr " -f, --force essaie d'arrêter les autres connexions avant de supprimer\n" +msgstr "" +" -f, --force essaie d'arrêter les autres connexions avant de\n" +" supprimer\n" -#: dropdb.c:176 +#: dropdb.c:177 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr "" -" -i, --interactive demande confirmation avant de supprimer quoi que\n" -" ce soit\n" +" -i, --interactive demande confirmation avant de supprimer quoi\n" +" que ce soit\n" -#: dropdb.c:178 +#: dropdb.c:179 #, c-format msgid " --if-exists don't report error if database doesn't exist\n" msgstr "" -" --if-exists ne renvoie pas d'erreur si la base\n" -" n'existe pas\n" +" --if-exists ne renvoie pas d'erreur si la base\n" +" n'existe pas\n" -#: dropuser.c:117 +#: dropuser.c:118 msgid "Enter name of role to drop: " msgstr "Saisir le nom du rôle à supprimer : " -#: dropuser.c:121 +#: dropuser.c:122 #, c-format msgid "missing required argument role name" msgstr "argument nom du rôle requis mais manquant" -#: dropuser.c:129 +#: dropuser.c:130 #, c-format msgid "Role \"%s\" will be permanently removed.\n" msgstr "Le rôle « %s » sera définitivement supprimé.\n" -#: dropuser.c:153 +#: dropuser.c:154 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "la suppression du rôle « %s » a échoué : %s" -#: dropuser.c:168 +#: dropuser.c:169 #, c-format msgid "" "%s removes a PostgreSQL role.\n" @@ -716,216 +748,211 @@ msgstr "" "%s supprime un rôle PostgreSQL.\n" "\n" -#: dropuser.c:173 +#: dropuser.c:174 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" " role name if not specified\n" msgstr "" -" -i, --interactive demande confirmation avant de supprimer quoi que\n" -" ce soit, et demande le nom du rôle s'il n'est pas\n" -" indiqué\n" +" -i, --interactive demande confirmation avant de supprimer quoi\n" +" que ce soit, et demande le nom du rôle s'il\n" +" n'est pas indiqué\n" -#: dropuser.c:176 +#: dropuser.c:177 #, c-format msgid " --if-exists don't report error if user doesn't exist\n" msgstr "" -" --if-exists ne renvoie pas d'erreur si l'utilisateur\n" -" n'existe pas\n" +" --if-exists ne renvoie pas d'erreur si l'utilisateur\n" +" n'existe pas\n" -#: dropuser.c:181 +#: dropuser.c:182 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n" msgstr "" -" -U, --username=NOMUTILISATEUR nom de l'utilisateur pour la connexion (pas\n" +" -U, --username=UTILISATEUR nom de l'utilisateur pour la connexion (pas\n" " celui à supprimer)\n" -#: pg_isready.c:153 +#: pg_isready.c:154 #, c-format msgid "could not fetch default options" msgstr "n'a pas pu récupérer les options par défaut" -#: pg_isready.c:202 +#: pg_isready.c:203 #, c-format msgid "accepting connections\n" msgstr "acceptation des connexions\n" -#: pg_isready.c:205 +#: pg_isready.c:206 #, c-format msgid "rejecting connections\n" msgstr "rejet des connexions\n" -#: pg_isready.c:208 +#: pg_isready.c:209 #, c-format msgid "no response\n" msgstr "pas de réponse\n" -#: pg_isready.c:211 +#: pg_isready.c:212 #, c-format msgid "no attempt\n" msgstr "pas de tentative\n" -#: pg_isready.c:214 +#: pg_isready.c:215 #, c-format msgid "unknown\n" msgstr "inconnu\n" -#: pg_isready.c:224 +#: pg_isready.c:225 #, c-format msgid "" "%s issues a connection check to a PostgreSQL database.\n" "\n" msgstr "" -"%s produitun test de connexion à une base de données PostgreSQL.\n" +"%s réalise un test de connexion à une base de données PostgreSQL.\n" "\n" -#: pg_isready.c:226 +#: pg_isready.c:227 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_isready.c:229 +#: pg_isready.c:230 #, c-format msgid " -d, --dbname=DBNAME database name\n" -msgstr " -d, --dbname=NOMBASE base de données\n" +msgstr " -d, --dbname=BASE base de données\n" -#: pg_isready.c:230 +#: pg_isready.c:231 #, c-format msgid " -q, --quiet run quietly\n" -msgstr " -q, --quiet s'exécute sans affichage\n" +msgstr " -q, --quiet s'exécute sans affichage\n" -#: pg_isready.c:231 +#: pg_isready.c:232 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version puis quitte\n" +msgstr " -V, --version affiche la version puis quitte\n" -#: pg_isready.c:232 +#: pg_isready.c:233 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide puis quitte\n" +msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_isready.c:235 +#: pg_isready.c:236 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" -" -h, --host=NOMHÔTE hôte du serveur de bases de données ou\n" -" répertoire des sockets\n" +" -h, --host=HÔTE hôte du serveur de bases de données ou\n" +" répertoire des sockets\n" -#: pg_isready.c:236 +#: pg_isready.c:237 #, c-format msgid " -p, --port=PORT database server port\n" -msgstr " -p, --port=PORT port du serveur de bases de données\n" +msgstr " -p, --port=PORT port du serveur de bases de données\n" -#: pg_isready.c:237 +#: pg_isready.c:238 #, c-format msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n" msgstr "" -" -t, --timeout=SECS durée en secondes à attendre lors d'une tentative de connexion\n" -" 0 pour désactiver (défaut: %s)\n" +" -t, --timeout=SECS durée en secondes à attendre lors d'une tentative\n" +" de connexion ; 0 pour désactiver (défaut: %s)\n" -#: pg_isready.c:238 +#: pg_isready.c:239 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" -msgstr " -U, --username=NOMUTILISATEUR nom d'utilisateur pour la connexion\n" +msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n" -#: reindexdb.c:157 vacuumdb.c:198 -#, c-format -msgid "number of parallel jobs must be at least 1" -msgstr "le nombre maximum de jobs en parallèle doit être au moins de 1" - -#: reindexdb.c:210 +#: reindexdb.c:209 #, c-format msgid "cannot reindex all databases and a specific one at the same time" msgstr "ne peut pas réindexer toutes les bases de données et une base spécifique en même temps" -#: reindexdb.c:215 +#: reindexdb.c:211 #, c-format msgid "cannot reindex all databases and system catalogs at the same time" msgstr "ne peut pas réindexer toutes les bases de données et les catalogues système en même temps" -#: reindexdb.c:220 +#: reindexdb.c:213 #, c-format msgid "cannot reindex specific schema(s) in all databases" msgstr "ne peut pas réindexer un (des) schéma(s) spécifique(s) dans toutes les bases de données" -#: reindexdb.c:225 +#: reindexdb.c:215 #, c-format msgid "cannot reindex specific table(s) in all databases" msgstr "ne peut pas réindexer une (des) table(s) spécifique(s) dans toutes les bases de données" -#: reindexdb.c:230 +#: reindexdb.c:217 #, c-format msgid "cannot reindex specific index(es) in all databases" msgstr "ne peut pas réindexer un (des) index spécifique(s) dans toutes les bases de données" -#: reindexdb.c:243 +#: reindexdb.c:227 #, c-format msgid "cannot reindex specific schema(s) and system catalogs at the same time" msgstr "ne peut pas réindexer un (des) schéma(s) spécifique(s) et les catalogues système en même temps" -#: reindexdb.c:248 +#: reindexdb.c:229 #, c-format msgid "cannot reindex specific table(s) and system catalogs at the same time" msgstr "ne peut pas réindexer une (des) table(s) spécifique(s) etles catalogues système en même temps" -#: reindexdb.c:253 +#: reindexdb.c:231 #, c-format msgid "cannot reindex specific index(es) and system catalogs at the same time" msgstr "ne peut pas réindexer un (des) index spécifique(s) et les catalogues système en même temps" -#: reindexdb.c:259 +#: reindexdb.c:234 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "ne peut pas utiliser plusieurs jobs pour réindexer les catalogues systèmes" -#: reindexdb.c:288 +#: reindexdb.c:260 #, c-format msgid "cannot use multiple jobs to reindex indexes" msgstr "ne peut pas utiliser plusieurs jobs pour réindexer les index" -#: reindexdb.c:353 reindexdb.c:361 vacuumdb.c:471 vacuumdb.c:479 vacuumdb.c:487 -#: vacuumdb.c:495 vacuumdb.c:503 vacuumdb.c:511 vacuumdb.c:518 vacuumdb.c:525 -#: vacuumdb.c:532 +#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439 +#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469 +#: vacuumdb.c:473 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "ne peut utiliser l'option « %s » sur des versions serveurs plus anciennes que PostgreSQL %s" -#: reindexdb.c:401 +#: reindexdb.c:369 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "ne peut pas réindexer les catalogues système de manière concurrente, ignore tout" -#: reindexdb.c:605 +#: reindexdb.c:573 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "la réindexation de la base de données « %s » a échoué : %s" -#: reindexdb.c:609 +#: reindexdb.c:577 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "la réindexation de l'index « %s » dans la base de données « %s » a échoué : %s" -#: reindexdb.c:613 +#: reindexdb.c:581 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "la réindexation du schéma « %s » dans la base de données « %s » a échoué : %s" -#: reindexdb.c:617 +#: reindexdb.c:585 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "la réindexation des catalogues systèmes dans la base de données « %s » a échoué : %s" -#: reindexdb.c:621 +#: reindexdb.c:589 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "la réindexation de la table « %s » dans la base de données « %s » a échoué : %s" -#: reindexdb.c:774 +#: reindexdb.c:742 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s : réindexation de la base de données « %s »\n" -#: reindexdb.c:791 +#: reindexdb.c:759 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -934,64 +961,66 @@ msgstr "" "%s réindexe une base de données PostgreSQL.\n" "\n" -#: reindexdb.c:795 +#: reindexdb.c:763 #, c-format msgid " -a, --all reindex all databases\n" -msgstr " -a, --all réindexe toutes les bases de données\n" +msgstr " -a, --all réindexe toutes les bases de données\n" -#: reindexdb.c:796 +#: reindexdb.c:764 #, c-format msgid " --concurrently reindex concurrently\n" -msgstr " --concurrently réindexation en concurrence\n" +msgstr " --concurrently réindexation en concurrence\n" -#: reindexdb.c:797 +#: reindexdb.c:765 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" -msgstr " -d, --dbname=NOMBASE base de données à réindexer\n" +msgstr " -d, --dbname=BASE réindexe la base de données spécifiée\n" -#: reindexdb.c:799 +#: reindexdb.c:767 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" -msgstr " -i, --index=INDEX recrée uniquement cet (ces) index\n" +msgstr " -i, --index=INDEX réindexe uniquement l'index spécifié\n" -#: reindexdb.c:800 +#: reindexdb.c:768 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" msgstr "" -" -j, --jobs=NUM utilise ce nombre de connexions concurrentes pour\n" -" l'opération de réindexation\n" +" -j, --jobs=NOMBRE utilise ce nombre de connexions concurrentes\n" +" pour l'opération de réindexation\n" -#: reindexdb.c:801 +#: reindexdb.c:769 #, c-format msgid " -q, --quiet don't write any messages\n" -msgstr " -q, --quiet n'écrit aucun message\n" +msgstr " -q, --quiet n'écrit aucun message\n" -#: reindexdb.c:802 +#: reindexdb.c:770 #, c-format -msgid " -s, --system reindex system catalogs\n" -msgstr " -s, --system réindexe les catalogues système\n" +msgid " -s, --system reindex system catalogs only\n" +msgstr " -s, --system réindexe seulement les catalogues système\n" -#: reindexdb.c:803 +#: reindexdb.c:771 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" -msgstr " -S, --schema=SCHEMA réindexe seulement le(s) schéma(s) indiqué(s)\n" +msgstr " -S, --schema=SCHÉMA réindexe uniquement le schéma spécifié\n" -#: reindexdb.c:804 +#: reindexdb.c:772 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" -msgstr " -t, --table=TABLE réindexe uniquement cette (ces) table(s)\n" +msgstr " -t, --table=TABLE réindexe uniquement la table spécifiée\n" -#: reindexdb.c:805 +#: reindexdb.c:773 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" -msgstr " -D, --tablespace=TABLESPACE tablespace où les index seront reconstruits\n" +msgstr "" +" --tablespace=TABLESPACE précise le tablespace où les index seront\n" +" reconstruits\n" -#: reindexdb.c:806 +#: reindexdb.c:774 #, c-format msgid " -v, --verbose write a lot of output\n" -msgstr " -v, --verbose mode verbeux\n" +msgstr " -v, --verbose mode verbeux\n" -#: reindexdb.c:816 +#: reindexdb.c:784 #, c-format msgid "" "\n" @@ -1000,80 +1029,65 @@ msgstr "" "\n" "Lire la description de la commande SQL REINDEX pour plus d'informations.\n" -#: vacuumdb.c:206 -#, c-format -msgid "parallel workers for vacuum must be greater than or equal to zero" -msgstr "le nombre de processus parallélisés pour l VACUUM doit être supérieur à zéro" - -#: vacuumdb.c:226 -#, c-format -msgid "minimum transaction ID age must be at least 1" -msgstr "l'identifiant de la transaction (-x) doit valoir au moins 1" - -#: vacuumdb.c:234 -#, c-format -msgid "minimum multixact ID age must be at least 1" -msgstr "l'âge minimum de l'identifiant de multitransaction doit au moins être 1" - -#: vacuumdb.c:278 vacuumdb.c:284 vacuumdb.c:290 vacuumdb.c:296 vacuumdb.c:302 -#: vacuumdb.c:308 vacuumdb.c:314 vacuumdb.c:326 +#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279 +#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "ne peut pas utiliser l'option « %s » lors de l'exécution d'un ANALYZE seul" -#: vacuumdb.c:332 +#: vacuumdb.c:297 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "ne peut pas utiliser l'option « %s » lors de l'exécution d'un VACUUM FULL" -#: vacuumdb.c:341 +#: vacuumdb.c:303 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" msgstr "ne peut pas utiliser l'option « %s » lors de l'option « %s »" -#: vacuumdb.c:363 +#: vacuumdb.c:322 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "ne peut pas exécuter VACUUM sur toutes les bases de données et sur une base spécifique en même temps" -#: vacuumdb.c:368 +#: vacuumdb.c:324 #, c-format msgid "cannot vacuum specific table(s) in all databases" msgstr "ne peut pas exécuter VACUUM sur une(des) table(s) spécifique(s) dans toutes les bases de données" -#: vacuumdb.c:458 +#: vacuumdb.c:412 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Génération de statistiques minimales pour l'optimiseur (une cible)" -#: vacuumdb.c:459 +#: vacuumdb.c:413 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Génération de statistiques moyennes pour l'optimiseur (dix cibles)" -#: vacuumdb.c:460 +#: vacuumdb.c:414 msgid "Generating default (full) optimizer statistics" msgstr "Génération de statistiques complètes pour l'optimiseur" -#: vacuumdb.c:540 +#: vacuumdb.c:479 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s : traitement de la base de données « %s » %s\n" -#: vacuumdb.c:543 +#: vacuumdb.c:482 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s : exécution de VACUUM sur la base de données « %s »\n" -#: vacuumdb.c:1020 +#: vacuumdb.c:952 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "l'exécution de VACUUM sur la table « %s » dans la base de données « %s » a échoué : %s" -#: vacuumdb.c:1023 +#: vacuumdb.c:955 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "l'exécution de VACUUM sur la base de données « %s » a échoué : %s" -#: vacuumdb.c:1031 +#: vacuumdb.c:963 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1082,135 +1096,149 @@ msgstr "" "%s nettoie et analyse une base de données PostgreSQL.\n" "\n" -#: vacuumdb.c:1035 +#: vacuumdb.c:967 #, c-format msgid " -a, --all vacuum all databases\n" -msgstr "" -" -a, --all exécute VACUUM sur toutes les bases de\n" -" données\n" +msgstr " -a, --all exécute VACUUM sur toutes les bases de données\n" -#: vacuumdb.c:1036 +#: vacuumdb.c:968 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" -msgstr " -d, --dbname=NOMBASE exécute VACUUM sur cette base de données\n" +msgstr " -d, --dbname=BASE exécute VACUUM sur cette base de données\n" -#: vacuumdb.c:1037 +#: vacuumdb.c:969 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping désactive le comportement page-skipping\n" -#: vacuumdb.c:1038 +#: vacuumdb.c:970 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo affiche les commandes envoyées au serveur\n" -#: vacuumdb.c:1039 +#: vacuumdb.c:971 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full exécute VACUUM en mode FULL\n" -#: vacuumdb.c:1040 +#: vacuumdb.c:972 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr "" -" -F, --freeze gèle les informations de transactions des\n" -" lignes\n" +" -F, --freeze gèle les informations de transactions des\n" +" lignes\n" + +#: vacuumdb.c:973 +#, c-format +msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" +msgstr "" +" --force-index-cleanup supprime toujours les enregistrements dans\n" +" l'index pointant vers des lignes mortes\n" -#: vacuumdb.c:1041 +#: vacuumdb.c:974 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr "" -" -j, --jobs=NUMERO utilise ce nombre de connexions concurrentes pour\n" -" le VACUUM\n" +" -j, --jobs=NOMBRE utilise ce nombre de connexions concurrentes\n" +" pour le VACUUM\n" -#: vacuumdb.c:1042 +#: vacuumdb.c:975 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" -msgstr " --min-mxid-age=MXID_AGE âge minimum des identifiants de multitransactions pour les tables à nettoyer\n" +msgstr "" +" --min-mxid-age=MXID_AGE âge minimum des identifiants de\n" +" multitransactions pour les tables à nettoyer\n" -#: vacuumdb.c:1043 +#: vacuumdb.c:976 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" -msgstr " --min-xid-age=XID_AGE âge minimum des identifiants de transactions pour les tables à nettoyer\n" +msgstr "" +" --min-xid-age=XID_AGE âge minimum des identifiants de transactions\n" +" pour les tables à nettoyer\n" -#: vacuumdb.c:1044 +#: vacuumdb.c:977 #, c-format msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" -msgstr " --no-index-cleanup ne supprime pas les enregistrements dans l'index pointant vers des lignes mortes\n" - -#: vacuumdb.c:1045 -#, c-format -msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" -msgstr " --force-index-cleanup supprime toujours les enregistrements dans l'index pointant vers des lignes mortes\n" +msgstr "" +" --no-index-cleanup ne supprime pas les enregistrements dans\n" +" l'index pointant vers des lignes mortes\n" -#: vacuumdb.c:1046 +#: vacuumdb.c:978 #, c-format msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" -msgstr " --no-process-toast ignore la table TOAST associée à la table à traiter\n" +msgstr "" +" --no-process-toast ignore la table TOAST associée à la table à\n" +" traiter\n" -#: vacuumdb.c:1047 +#: vacuumdb.c:979 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" -msgstr " --no-truncate ni supprime pas les pages vides à la fin de la table\n" +msgstr "" +" --no-truncate ne supprime pas les pages vides à la fin de\n" +" la table\n" -#: vacuumdb.c:1048 +#: vacuumdb.c:980 #, c-format msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" -msgstr " -P, --parallel=PARALLEL_WORKERS utilise ce nombre de processus en tâche de fond pour le VACUUM, si possible\n" +msgstr "" +" -P, --parallel=NOMBRE utilise ce nombre de processus en tâche de\n" +" fond pour le VACUUM, si possible\n" -#: vacuumdb.c:1049 +#: vacuumdb.c:981 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet n'écrit aucun message\n" -#: vacuumdb.c:1050 +#: vacuumdb.c:982 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" -msgstr " --skip-locked ignore les relations qui ne peuvent pas être verrouillées immédiatement\n" +msgstr "" +" --skip-locked ignore les relations qui ne peuvent pas être\n" +" verrouillées immédiatement\n" -#: vacuumdb.c:1051 +#: vacuumdb.c:983 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" -msgstr " -t, --table='TABLE[(COLONNES)]' exécute VACUUM sur cette (ces) tables\n" +msgstr " -t, --table='TABLE[(COLONNES)]' exécute VACUUM sur cette table\n" -#: vacuumdb.c:1052 +#: vacuumdb.c:984 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose mode verbeux\n" -#: vacuumdb.c:1053 +#: vacuumdb.c:985 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version puis quitte\n" +msgstr " -V, --version affiche la version puis quitte\n" -#: vacuumdb.c:1054 +#: vacuumdb.c:986 #, c-format msgid " -z, --analyze update optimizer statistics\n" -msgstr " -z, --analyze met à jour les statistiques de l'optimiseur\n" +msgstr " -z, --analyze met à jour les statistiques de l'optimiseur\n" -#: vacuumdb.c:1055 +#: vacuumdb.c:987 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr "" -" -Z, --analyze-only met seulement à jour les statistiques de\n" -" l'optimiseur ; pas de VACUUM\n" +" -Z, --analyze-only met seulement à jour les statistiques de\n" +" l'optimiseur ; pas de VACUUM\n" -#: vacuumdb.c:1056 +#: vacuumdb.c:988 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" " stages for faster results; no vacuum\n" msgstr "" -" --analyze-in-stages met seulement à jour les statistiques de\n" -" l'optimiseur, en plusieurs étapes pour de\n" -" meilleurs résultats ; pas de VACUUM\n" +" --analyze-in-stages met seulement à jour les statistiques de\n" +" l'optimiseur, en plusieurs étapes pour de\n" +" meilleurs résultats ; pas de VACUUM\n" -#: vacuumdb.c:1058 +#: vacuumdb.c:990 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide puis quitte\n" +msgstr " -?, --help affiche cette aide puis quitte\n" -#: vacuumdb.c:1066 +#: vacuumdb.c:998 #, c-format msgid "" "\n" @@ -1219,91 +1247,68 @@ msgstr "" "\n" "Lire la description de la commande SQL VACUUM pour plus d'informations.\n" -#~ msgid "parallel vacuum degree must be a non-negative integer" -#~ msgstr "le degré de parallélisation du VACUUM doit être un entier non négatif" - -#~ msgid "Could not send cancel request: %s" -#~ msgstr "N'a pas pu envoyer la requête d'annulation : %s" - -#~ msgid "could not connect to database %s: %s" -#~ msgstr "n'a pas pu se connecter à la base de données %s : %s" - -#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" -#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" - -#~ msgid "%s: query failed: %s" -#~ msgstr "%s : échec de la requête : %s" - -#~ msgid "%s: query was: %s\n" -#~ msgstr "%s : la requête était : %s\n" - -#~ msgid "%s: query returned %d row instead of one: %s\n" -#~ msgid_plural "%s: query returned %d rows instead of one: %s\n" -#~ msgstr[0] "%s : la requête a renvoyé %d ligne au lieu d'une seule : %s\n" -#~ msgstr[1] "%s : la requête a renvoyé %d lignes au lieu d'une seule : %s\n" - -#~ msgid "%s: \"%s\" is not a valid encoding name\n" -#~ msgstr "%s : « %s » n'est pas un nom d'encodage valide\n" +#~ msgid "" +#~ "\n" +#~ "If one of -d, -D, -r, -R, -s, -S, and ROLENAME is not specified, you will\n" +#~ "be prompted interactively.\n" +#~ msgstr "" +#~ "\n" +#~ "Si une des options -d, -D, -r, -R, -s, -S et RÔLE n'est pas précisée,\n" +#~ "elle sera demandée interactivement.\n" -#~ msgid "%s: %s" -#~ msgstr "%s : %s" +#~ msgid "" +#~ "\n" +#~ "Report bugs to .\n" +#~ msgstr "" +#~ "\n" +#~ "Rapporter les bogues à .\n" -#~ msgid "%s: too many parallel jobs requested (maximum: %d)\n" -#~ msgstr "%s : trop de jobs en parallèle demandés (maximum %d)\n" +#~ msgid " %s [OPTION]... LANGNAME [DBNAME]\n" +#~ msgstr " %s [OPTION]... NOMLANGAGE [BASE]\n" -#~ msgid "Name" -#~ msgstr "Nom" +#~ msgid " --help show this help, then exit\n" +#~ msgstr " --help affiche cette aide et quitte\n" -#~ msgid "no" -#~ msgstr "non" +#~ msgid " --help show this help, then exit\n" +#~ msgstr " --help affiche cette aide et quitte\n" -#~ msgid "yes" -#~ msgstr "oui" +#~ msgid " --help show this help, then exit\n" +#~ msgstr " --help affiche cette aide et quitte\n" -#~ msgid "Trusted?" -#~ msgstr "De confiance (trusted) ?" +#~ msgid " --version output version information, then exit\n" +#~ msgstr " --version affiche la version et quitte\n" -#~ msgid "Procedural Languages" -#~ msgstr "Langages procéduraux" +#~ msgid " --version output version information, then exit\n" +#~ msgstr " --version affiche la version et quitte\n" -#~ msgid "%s: missing required argument language name\n" -#~ msgstr "%s : argument nom du langage requis mais manquant\n" +#~ msgid " --version output version information, then exit\n" +#~ msgstr " --version affiche la version et quitte\n" -#~ msgid "%s: language \"%s\" is already installed in database \"%s\"\n" -#~ msgstr "%s : le langage « %s » est déjà installé sur la base de données « %s »\n" +#~ msgid " -E, --encrypted encrypt stored password\n" +#~ msgstr " -E, --encrypted chiffre le mot de passe stocké\n" -#~ msgid "%s: language installation failed: %s" -#~ msgstr "%s : l'installation du langage a échoué : %s" +#~ msgid " -N, --unencrypted do not encrypt stored password\n" +#~ msgstr " -N, --unencrypted ne chiffre pas le mot de passe stocké\n" -#~ msgid "" -#~ "%s installs a procedural language into a PostgreSQL database.\n" -#~ "\n" +#~ msgid " -d, --dbname=DBNAME database from which to remove the language\n" #~ msgstr "" -#~ "%s installe un langage de procédures dans une base de données PostgreSQL.\n" -#~ "\n" - -#~ msgid " %s [OPTION]... LANGNAME [DBNAME]\n" -#~ msgstr " %s [OPTION]... NOMLANGAGE [NOMBASE]\n" +#~ " -d, --dbname=BASE base de données à partir de laquelle\n" +#~ " supprimer le langage\n" #~ msgid " -d, --dbname=DBNAME database to install language in\n" -#~ msgstr " -d, --dbname=NOMBASE base sur laquelle installer le langage\n" +#~ msgstr " -d, --dbname=BASE base sur laquelle installer le langage\n" #~ msgid " -l, --list show a list of currently installed languages\n" #~ msgstr "" #~ " -l, --list affiche la liste des langages déjà\n" #~ " installés\n" -#~ msgid " -E, --encrypted encrypt stored password\n" -#~ msgstr " -E, --encrypted chiffre le mot de passe stocké\n" - -#~ msgid " -N, --unencrypted do not encrypt stored password\n" -#~ msgstr " -N, --unencrypted ne chiffre pas le mot de passe stocké\n" - -#~ msgid "%s: language \"%s\" is not installed in database \"%s\"\n" -#~ msgstr "%s : le langage « %s » n'est pas installé dans la base de données « %s »\n" - -#~ msgid "%s: language removal failed: %s" -#~ msgstr "%s : la suppression du langage a échoué : %s" +#~ msgid "" +#~ "%s installs a procedural language into a PostgreSQL database.\n" +#~ "\n" +#~ msgstr "" +#~ "%s installe un langage de procédures dans une base de données PostgreSQL.\n" +#~ "\n" #~ msgid "" #~ "%s removes a procedural language from a database.\n" @@ -1312,69 +1317,120 @@ msgstr "" #~ "%s supprime un langage procédural d'une base de données.\n" #~ "\n" -#~ msgid " -d, --dbname=DBNAME database from which to remove the language\n" -#~ msgstr "" -#~ " -d, --dbname=NOMBASE base de données à partir de laquelle\n" -#~ " supprimer le langage\n" +#~ msgid "%s: \"%s\" is not a valid encoding name\n" +#~ msgstr "%s : « %s » n'est pas un nom d'encodage valide\n" + +#~ msgid "%s: %s" +#~ msgstr "%s : %s" #~ msgid "%s: cannot use the \"freeze\" option when performing only analyze\n" #~ msgstr "" #~ "%s : ne peut utiliser l'option « freeze » lors de l'exécution d'un ANALYZE\n" #~ "seul\n" -#~ msgid "%s: out of memory\n" -#~ msgstr "%s : mémoire épuisée\n" +#~ msgid "%s: could not get current user name: %s\n" +#~ msgstr "%s : n'a pas pu récupérer le nom de l'utilisateur actuel : %s\n" -#~ msgid "pg_strdup: cannot duplicate null pointer (internal error)\n" -#~ msgstr "pg_strdup : ne peut pas dupliquer un pointeur nul (erreur interne)\n" +#~ msgid "%s: could not obtain information about current user: %s\n" +#~ msgstr "%s : n'a pas pu obtenir les informations concernant l'utilisateur actuel : %s\n" -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide et quitte\n" +#~ msgid "%s: invalid socket: %s" +#~ msgstr "%s : socket invalide : %s" -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version et quitte\n" +#~ msgid "%s: language \"%s\" is already installed in database \"%s\"\n" +#~ msgstr "%s : le langage « %s » est déjà installé sur la base de données « %s »\n" -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide et quitte\n" +#~ msgid "%s: language \"%s\" is not installed in database \"%s\"\n" +#~ msgstr "%s : le langage « %s » n'est pas installé dans la base de données « %s »\n" -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version et quitte\n" +#~ msgid "%s: language installation failed: %s" +#~ msgstr "%s : l'installation du langage a échoué : %s" -#~ msgid "" -#~ "\n" -#~ "If one of -d, -D, -r, -R, -s, -S, and ROLENAME is not specified, you will\n" -#~ "be prompted interactively.\n" -#~ msgstr "" -#~ "\n" -#~ "Si une des options -d, -D, -r, -R, -s, -S et NOMROLE n'est pas précisée,\n" -#~ "elle sera demandée interactivement.\n" +#~ msgid "%s: language removal failed: %s" +#~ msgstr "%s : la suppression du langage a échoué : %s" + +#~ msgid "%s: missing required argument language name\n" +#~ msgstr "%s : argument nom du langage requis mais manquant\n" + +#~ msgid "%s: out of memory\n" +#~ msgstr "%s : mémoire épuisée\n" + +#~ msgid "%s: query failed: %s" +#~ msgstr "%s : échec de la requête : %s" + +#~ msgid "%s: query returned %d row instead of one: %s\n" +#~ msgid_plural "%s: query returned %d rows instead of one: %s\n" +#~ msgstr[0] "%s : la requête a renvoyé %d ligne au lieu d'une seule : %s\n" +#~ msgstr[1] "%s : la requête a renvoyé %d lignes au lieu d'une seule : %s\n" + +#~ msgid "%s: query was: %s\n" +#~ msgstr "%s : la requête était : %s\n" #~ msgid "%s: still %s functions declared in language \"%s\"; language not removed\n" #~ msgstr "" #~ "%s : il existe encore %s fonctions déclarées dans le langage « %s » ;\n" #~ "langage non supprimé\n" -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide et quitte\n" +#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" +#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version et quitte\n" +#~ msgid "%s: too many parallel jobs requested (maximum: %d)\n" +#~ msgstr "%s : trop de jobs en parallèle demandés (maximum %d)\n" -#~ msgid "%s: could not get current user name: %s\n" -#~ msgstr "%s : n'a pas pu récupérer le nom de l'utilisateur actuel : %s\n" +#~ msgid "Could not send cancel request: %s" +#~ msgstr "N'a pas pu envoyer la requête d'annulation : %s" -#~ msgid "%s: could not obtain information about current user: %s\n" -#~ msgstr "%s : n'a pas pu obtenir les informations concernant l'utilisateur actuel : %s\n" +#~ msgid "Name" +#~ msgstr "Nom" -#~ msgid "%s: invalid socket: %s" -#~ msgstr "%s : socket invalide : %s" +#~ msgid "Procedural Languages" +#~ msgstr "Langages procéduraux" + +#~ msgid "Trusted?" +#~ msgstr "De confiance (trusted) ?" + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Essayer « %s --help » pour plus d'informations.\n" + +#~ msgid "could not connect to database %s: %s" +#~ msgstr "n'a pas pu se connecter à la base de données %s : %s" + +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatal : " + +#, c-format +#~ msgid "invalid value for --connection-limit: %s" +#~ msgstr "valeur invalide pour --connection-limit : %s" + +#, c-format +#~ msgid "minimum multixact ID age must be at least 1" +#~ msgstr "l'âge minimum de l'identifiant de multitransaction doit au moins être 1" + +#, c-format +#~ msgid "minimum transaction ID age must be at least 1" +#~ msgstr "l'identifiant de la transaction (-x) doit valoir au moins 1" + +#~ msgid "no" +#~ msgstr "non" + +#, c-format +#~ msgid "number of parallel jobs must be at least 1" +#~ msgstr "le nombre maximum de jobs en parallèle doit être au moins de 1" + +#~ msgid "parallel vacuum degree must be a non-negative integer" +#~ msgstr "le degré de parallélisation du VACUUM doit être un entier non négatif" + +#, c-format +#~ msgid "parallel workers for vacuum must be greater than or equal to zero" +#~ msgstr "le nombre de processus parallélisés pour l VACUUM doit être supérieur à zéro" + +#~ msgid "pg_strdup: cannot duplicate null pointer (internal error)\n" +#~ msgstr "pg_strdup : ne peut pas dupliquer un pointeur nul (erreur interne)\n" #~ msgid "reindexing of system catalogs failed: %s" #~ msgstr "la réindexation des catalogues système a échoué : %s" -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" +#~ msgid "yes" +#~ msgstr "oui" diff --git a/src/bin/scripts/po/ja.po b/src/bin/scripts/po/ja.po index 746593a4c0..86ac053ab4 100644 --- a/src/bin/scripts/po/ja.po +++ b/src/bin/scripts/po/ja.po @@ -1,37 +1,45 @@ -# Japanese message translation file for scripts -# Copyright (C) 2019 PostgreSQL Global Development Group -# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. +# pgscripts.po +# Japanese message translation file for scripts +# +# Copyright (C) 2011-2022 PostgreSQL Global Development Group +# +# This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: scripts (PostgreSQL 13)\n" +"Project-Id-Version: scripts (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 15:56+0900\n" -"PO-Revision-Date: 2020-09-13 08:58+0200\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" +"PO-Revision-Date: 2022-05-11 14:48+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:241 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " - -#: ../../../src/common/logging.c:248 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:255 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "警告: " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "ヒント: " + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -57,105 +65,143 @@ msgstr "ユーザが存在しません" msgid "user name lookup failure: error code %lu" msgstr "ユーザ名の検索に失敗: エラーコード%lu" -#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 msgid "Cancel request sent\n" msgstr "キャンセル要求を送信しました\n" -#: ../../fe_utils/cancel.c:165 +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 msgid "Could not send cancel request: " msgstr "キャンセル要求を送信できませんでした: " -#: ../../fe_utils/cancel.c:210 +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104 +msgid "Password: " +msgstr "パスワード: " + +#: ../../fe_utils/connect_utils.c:91 +#, c-format +msgid "could not connect to database %s: out of memory" +msgstr "データベース%sに接続できませんでした: メモリ不足です" + +#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146 +#, c-format +msgid "%s" +msgstr "%s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "オプション %2$s に対する不正な値\"%1$s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%sは%d..%dの範囲でなければなりません" + +#: ../../fe_utils/parallel_slot.c:301 #, c-format -msgid "Could not send cancel request: %s" -msgstr "キャンセル要求を送信できませんでした: %s" +msgid "too many jobs for this platform" +msgstr "このプラットフォームではジョブ数が多すぎます" -#: ../../fe_utils/print.c:336 +#: ../../fe_utils/parallel_slot.c:519 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "データベース\"%s\"の処理に失敗しました: %s" + +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu 行)" -msgstr[1] "(%lu 行)" -#: ../../fe_utils/print.c:3039 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "中断されました\n" -#: ../../fe_utils/print.c:3103 +#: ../../fe_utils/print.c:3173 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "テーブルの内容に見出しを追加できませんでした:列数%dが制限を越えています。\n" -#: ../../fe_utils/print.c:3143 +#: ../../fe_utils/print.c:3213 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "テーブルの内容にセルを追加できませんでした:全セル数%dが制限を越えています。\n" -#: ../../fe_utils/print.c:3398 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "出力フォーマットが無効(内部エラー):%d" -#: clusterdb.c:114 clusterdb.c:133 createdb.c:121 createdb.c:140 -#: createuser.c:171 createuser.c:186 dropdb.c:101 dropdb.c:110 dropdb.c:118 -#: dropuser.c:92 dropuser.c:107 dropuser.c:122 pg_isready.c:95 pg_isready.c:109 -#: reindexdb.c:168 reindexdb.c:187 vacuumdb.c:239 vacuumdb.c:258 +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 +#, c-format +msgid "query failed: %s" +msgstr "問い合わせが失敗しました: %s" + +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#, c-format +msgid "Query was: %s" +msgstr "問い合わせ: %s" + +#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158 +#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121 +#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 +#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "詳細は\"%s --help\"を実行してください。\n" +msgid "Try \"%s --help\" for more information." +msgstr "詳細は\"%s --help\"を実行してください。" -#: clusterdb.c:131 createdb.c:138 createuser.c:184 dropdb.c:116 dropuser.c:105 -#: pg_isready.c:107 reindexdb.c:185 vacuumdb.c:256 +#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108 +#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")" -#: clusterdb.c:143 +#: clusterdb.c:148 #, c-format msgid "cannot cluster all databases and a specific one at the same time" msgstr "全データベースと特定のデータベースを同時にクラスタ化することはできません" -#: clusterdb.c:149 +#: clusterdb.c:151 #, c-format msgid "cannot cluster specific table(s) in all databases" msgstr "すべてのデータベースの特定のテーブル(群)はクラスタ化できません" -#: clusterdb.c:217 +#: clusterdb.c:215 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "データベース\"%2$s\"のテーブル\"%1$s\"のクラスタ化に失敗しました: %3$s" -#: clusterdb.c:220 +#: clusterdb.c:218 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "データベース\"%s\"のクラスタ化に失敗しました: %s" -#: clusterdb.c:253 +#: clusterdb.c:246 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: データベース\"%s\"をクラスタ化しています\n" -#: clusterdb.c:274 +#: clusterdb.c:262 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" "\n" -msgstr "%sはデータベース内で事前にクラスタ化されているすべてのテーブルをクラスタ化します\n" +msgstr "%sはデータベース内で事前にクラスタ化されているすべてのテーブルをクラスタ化します。\n" -#: clusterdb.c:275 createdb.c:259 createuser.c:347 dropdb.c:164 dropuser.c:163 -#: pg_isready.c:224 reindexdb.c:753 vacuumdb.c:975 +#: clusterdb.c:263 createdb.c:283 createuser.c:346 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: clusterdb.c:276 reindexdb.c:754 vacuumdb.c:976 +#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [オプション]... [データベース名]\n" -#: clusterdb.c:277 createdb.c:261 createuser.c:349 dropdb.c:166 dropuser.c:165 -#: pg_isready.c:227 reindexdb.c:755 vacuumdb.c:977 +#: clusterdb.c:265 createdb.c:285 createuser.c:348 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966 #, c-format msgid "" "\n" @@ -164,48 +210,48 @@ msgstr "" "\n" "オプション:\n" -#: clusterdb.c:278 +#: clusterdb.c:266 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all すべてのデータベースをクラスタ化\n" -#: clusterdb.c:279 +#: clusterdb.c:267 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=DBNAME クラスタ化するデータベース\n" -#: clusterdb.c:280 createuser.c:353 dropdb.c:167 dropuser.c:166 reindexdb.c:759 +#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173 #, c-format msgid " -e, --echo show the commands being sent to the server\n" -msgstr " -e, --echo サーバへ送信されているコマンドを表示\n" +msgstr " -e, --echo サーバーへ送信されているコマンドを表示\n" -#: clusterdb.c:281 reindexdb.c:762 +#: clusterdb.c:269 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet メッセージを何も出力しない\n" -#: clusterdb.c:282 +#: clusterdb.c:270 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=テーブル名 指定したテーブル(群)のみをクラスタ化する\n" -#: clusterdb.c:283 reindexdb.c:766 +#: clusterdb.c:271 #, c-format msgid " -v, --verbose write a lot of output\n" -msgstr " -v, --verbose 多くのメッセージを出力する\n" +msgstr " -v, --verbose 多量のメッセージを出力\n" -#: clusterdb.c:284 createuser.c:365 dropdb.c:170 dropuser.c:169 reindexdb.c:767 +#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: clusterdb.c:285 createuser.c:370 dropdb.c:172 dropuser.c:171 reindexdb.c:768 +#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: clusterdb.c:286 createdb.c:272 createuser.c:371 dropdb.c:173 dropuser.c:172 -#: pg_isready.c:233 reindexdb.c:769 vacuumdb.c:1000 +#: clusterdb.c:274 createdb.c:300 createuser.c:370 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 #, c-format msgid "" "\n" @@ -214,41 +260,37 @@ msgstr "" "\n" "接続オプション:\n" -#: clusterdb.c:287 createuser.c:372 dropdb.c:174 dropuser.c:173 reindexdb.c:770 -#: vacuumdb.c:1001 +#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME データベースサーバのホストまたはソケットディレクトリ\n" -#: clusterdb.c:288 createuser.c:373 dropdb.c:175 dropuser.c:174 reindexdb.c:771 -#: vacuumdb.c:1002 +#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT データベースサーバのポート番号\n" -#: clusterdb.c:289 dropdb.c:176 reindexdb.c:772 vacuumdb.c:1003 +#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME このユーザ名で接続する\n" -#: clusterdb.c:290 createuser.c:375 dropdb.c:177 dropuser.c:176 reindexdb.c:773 -#: vacuumdb.c:1004 +#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password パスワード入力を要求しない\n" -#: clusterdb.c:291 createuser.c:376 dropdb.c:178 dropuser.c:177 reindexdb.c:774 -#: vacuumdb.c:1005 +#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password パスワードプロンプトを強制表示する\n" -#: clusterdb.c:292 dropdb.c:179 reindexdb.c:775 vacuumdb.c:1006 +#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME 別の保守用データベースを指定する\n" -#: clusterdb.c:293 +#: clusterdb.c:281 #, c-format msgid "" "\n" @@ -257,8 +299,8 @@ msgstr "" "\n" "詳細は SQL コマンドの CLUSTER の説明を参照してください。\n" -#: clusterdb.c:294 createdb.c:280 createuser.c:377 dropdb.c:180 dropuser.c:178 -#: pg_isready.c:238 reindexdb.c:777 vacuumdb.c:1008 +#: clusterdb.c:282 createdb.c:308 createuser.c:376 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999 #, c-format msgid "" "\n" @@ -267,96 +309,66 @@ msgstr "" "\n" "バグは<%s>に報告してください。\n" -#: clusterdb.c:295 createdb.c:281 createuser.c:378 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:239 reindexdb.c:778 vacuumdb.c:1009 +#: clusterdb.c:283 createdb.c:309 createuser.c:377 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: common.c:79 common.c:125 -msgid "Password: " -msgstr "パスワード: " - -#: common.c:112 -#, c-format -msgid "could not connect to database %s: out of memory" -msgstr "データベース%sに接続できませんでした: メモリ不足です" - -#: common.c:139 -#, c-format -msgid "could not connect to database %s: %s" -msgstr "データベース%sに接続できませんでした: %s" - -#: common.c:214 common.c:239 -#, c-format -msgid "query failed: %s" -msgstr "問い合わせが失敗しました: %s" - -#: common.c:215 common.c:240 -#, c-format -msgid "query was: %s" -msgstr "問い合わせ: %s" - -#: common.c:312 -#, c-format -msgid "processing of database \"%s\" failed: %s" -msgstr "データベース\"%s\"の処理に失敗しました: %s" - -#: common.c:406 +#: common.c:107 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" msgstr[0] "問い合わせが1行ではなく%d行返しました: %s" -msgstr[1] "問い合わせが1行ではなく%d行返しました: %s" #. translator: abbreviation for "yes" -#: common.c:430 +#: common.c:131 msgid "y" msgstr "y" #. translator: abbreviation for "no" -#: common.c:432 +#: common.c:133 msgid "n" msgstr "n" #. translator: This is a question followed by the translated options for #. "yes" and "no". -#: common.c:442 +#: common.c:143 #, c-format msgid "%s (%s/%s) " msgstr "%s (%s/%s)" -#: common.c:456 +#: common.c:164 #, c-format msgid "Please answer \"%s\" or \"%s\".\n" msgstr " \"%s\" または \"%s\" に答えてください\n" -#: createdb.c:148 +#: createdb.c:165 #, c-format msgid "only one of --locale and --lc-ctype can be specified" msgstr "--locale か --lc-ctype のいずれか一方のみを指定してください" -#: createdb.c:153 +#: createdb.c:167 #, c-format msgid "only one of --locale and --lc-collate can be specified" msgstr "--locale か --lc-collate のいずれか一方のみを指定してください" -#: createdb.c:164 +#: createdb.c:175 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" は有効な符号化方式名ではありません" -#: createdb.c:221 +#: createdb.c:245 #, c-format msgid "database creation failed: %s" msgstr "データベースの生成に失敗しました:%s" -#: createdb.c:240 +#: createdb.c:264 #, c-format msgid "comment creation failed (database was created): %s" msgstr "コメントの生成に失敗(データベースは生成されました): %s" -#: createdb.c:258 +#: createdb.c:282 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -365,94 +377,114 @@ msgstr "" "%sはPostgreSQLデータベースを生成します。\n" "\n" -#: createdb.c:260 +#: createdb.c:284 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [オプション]... [データベース名] [説明]\n" -#: createdb.c:262 +#: createdb.c:286 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TABLESPACE データベースのデフォルトテーブルスペース名\n" -#: createdb.c:263 +#: createdb.c:287 reindexdb.c:766 #, c-format msgid " -e, --echo show the commands being sent to the server\n" -msgstr " -e, --echo サーバに送られるコマンドを表示\n" +msgstr " -e, --echo サーバーに送られるコマンドを表示\n" -#: createdb.c:264 +#: createdb.c:288 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=ENCODING データベースの符号化方式\n" -#: createdb.c:265 +#: createdb.c:289 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOCALE データベースのロケール設定\n" -#: createdb.c:266 +#: createdb.c:290 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOCALE データベースのLC_COLLATE設定\n" -#: createdb.c:267 +#: createdb.c:291 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=LOCALE データベースのLC_CTYPE設定\n" -#: createdb.c:268 +#: createdb.c:292 +#, c-format +msgid " --icu-locale=LOCALE ICU locale setting for the database\n" +msgstr " --icu-locale=LOCALE データベースのICUロケール設定\n" + +#: createdb.c:293 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" locale provider for the database's default collation\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" データベースのデフォルト照合順序のロケール\n" +" プロバイダ\n" + +#: createdb.c:295 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=OWNER 新しいデータベースを所有するデータベースユーザ\n" -#: createdb.c:269 +#: createdb.c:296 +#, c-format +msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" +msgstr " -S, --strategy=STRATEGY データベース生成方法 wal_log または file_copy\n" + +#: createdb.c:297 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=TEMPLATE コピーするテンプレートデータベース\n" -#: createdb.c:270 +#: createdb.c:298 reindexdb.c:775 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: createdb.c:271 +#: createdb.c:299 reindexdb.c:776 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: createdb.c:273 +#: createdb.c:301 reindexdb.c:778 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HOSTNAME データベースサーバホストまたはソケット\n" " ディレクトリ\n" -#: createdb.c:274 +#: createdb.c:302 reindexdb.c:779 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT データベースサーバのポート番号\n" -#: createdb.c:275 +#: createdb.c:303 reindexdb.c:780 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME 接続する際のユーザ名\n" -#: createdb.c:276 +#: createdb.c:304 reindexdb.c:781 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password パスワード入力を要求しない\n" -#: createdb.c:277 +#: createdb.c:305 reindexdb.c:782 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password パスワードプロンプトを強制\n" -#: createdb.c:278 +#: createdb.c:306 reindexdb.c:783 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME 別の保守用データベースを指定する\n" -#: createdb.c:279 +#: createdb.c:307 #, c-format msgid "" "\n" @@ -461,85 +493,80 @@ msgstr "" "\n" "デフォルトでは、現在のユーザ名と同名のデータベースが生成されます\n" -#: createuser.c:150 -#, c-format -msgid "invalid value for --connection-limit: %s" -msgstr "--connection-limit に対する不正な値: %s" - -#: createuser.c:194 +#: createuser.c:193 msgid "Enter name of role to add: " msgstr "追加したいロール名を入力:" -#: createuser.c:211 +#: createuser.c:208 msgid "Enter password for new role: " msgstr "新しいロールのためのパスワード: " -#: createuser.c:213 +#: createuser.c:209 msgid "Enter it again: " msgstr "もう一度入力してください:" -#: createuser.c:216 +#: createuser.c:212 #, c-format msgid "Passwords didn't match.\n" msgstr "パスワードがマッチしません。\n" -#: createuser.c:224 +#: createuser.c:220 msgid "Shall the new role be a superuser?" msgstr "新しいロールをスーパユーザにしますか?" -#: createuser.c:239 +#: createuser.c:235 msgid "Shall the new role be allowed to create databases?" msgstr "新しいロールに対してデータベースを作成する権限を与えますか?" -#: createuser.c:247 +#: createuser.c:243 msgid "Shall the new role be allowed to create more new roles?" msgstr "新しいロールに対して別のロールを作成する権限を与えますか?" -#: createuser.c:277 +#: createuser.c:278 #, c-format msgid "password encryption failed: %s" msgstr "パスワードの暗号化に失敗しました: %s" -#: createuser.c:332 +#: createuser.c:331 #, c-format msgid "creation of new role failed: %s" msgstr "新しいロールの作成に失敗しました: %s" -#: createuser.c:346 +#: createuser.c:345 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" "\n" msgstr "" -"%sは新しいPostgreSQLロールを作成します\n" +"%sは新しいPostgreSQLロールを作成します。\n" "\n" -#: createuser.c:348 dropuser.c:164 +#: createuser.c:347 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [オプション]... [ロール名]\n" -#: createuser.c:350 +#: createuser.c:349 #, c-format msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" msgstr " -c, --connection-limit=N ロールのコネクション数制限(デフォルト: 制限なし)\n" -#: createuser.c:351 +#: createuser.c:350 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb ロールは新しいデータベースを作成可\n" -#: createuser.c:352 +#: createuser.c:351 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb ロールは新しいデータベースを作成不可(デフォルト)\n" -#: createuser.c:354 +#: createuser.c:353 #, c-format msgid " -g, --role=ROLE new role will be a member of this role\n" msgstr " -g, --role=ROLE 新しいロールはこのロールのメンバーにする\n" -#: createuser.c:355 +#: createuser.c:354 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -548,88 +575,88 @@ msgstr "" " -i, --inherit ロールがメンバーとなるロール群から権限を継承\n" " (デフォルト)\n" -#: createuser.c:357 +#: createuser.c:356 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit 権限を継承しない\n" -#: createuser.c:358 +#: createuser.c:357 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login ロールはログイン可能(デフォルト)\n" -#: createuser.c:359 +#: createuser.c:358 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login ロールはログイン不可\n" -#: createuser.c:360 +#: createuser.c:359 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt 新しいロールにパスワードを割り当てる\n" -#: createuser.c:361 +#: createuser.c:360 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole ロールは別のロールを作成可\n" -#: createuser.c:362 +#: createuser.c:361 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole ロールは別のロールを作成不可(デフォルト)\n" -#: createuser.c:363 +#: createuser.c:362 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser ロールをスーパユーザにする\n" -#: createuser.c:364 +#: createuser.c:363 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr " -S, --no-superuser ロールをスーパユーザにしない(デフォルト)\n" -#: createuser.c:366 +#: createuser.c:365 #, c-format msgid "" " --interactive prompt for missing role name and attributes rather\n" " than using defaults\n" msgstr " --interactive デフォルトを使わず未指定のロール名や属性は入力を促す\n" -#: createuser.c:368 +#: createuser.c:367 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication ロールはレプリケーションを初期化可\n" -#: createuser.c:369 +#: createuser.c:368 #, c-format msgid " --no-replication role cannot initiate replication\n" msgstr " --no-replication ロールはレプリケーションを初期化不可\n" -#: createuser.c:374 +#: createuser.c:373 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" msgstr " -U, --username=ユーザ名 このユーザとして接続(作成対象ユーザではありません)\n" -#: dropdb.c:109 +#: dropdb.c:112 #, c-format msgid "missing required argument database name" msgstr "必須の引数であるデータベース名がありません" -#: dropdb.c:124 +#: dropdb.c:127 #, c-format msgid "Database \"%s\" will be permanently removed.\n" msgstr "データベース\"%s\"は永久に削除されます。\n" -#: dropdb.c:125 dropuser.c:130 +#: dropdb.c:128 dropuser.c:131 msgid "Are you sure?" msgstr "実行しますか?" -#: dropdb.c:149 +#: dropdb.c:157 #, c-format msgid "database removal failed: %s" msgstr "データベースの削除に失敗しました: %s" -#: dropdb.c:163 +#: dropdb.c:171 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -638,55 +665,55 @@ msgstr "" "%sはPostgreSQLデータベースを削除します。\n" "\n" -#: dropdb.c:165 +#: dropdb.c:173 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [オプション]... [データベース名]\n" -#: dropdb.c:168 +#: dropdb.c:176 #, c-format msgid " -f, --force try to terminate other connections before dropping\n" msgstr " -f, --force 削除前に他の接続の終了を試行\n" -#: dropdb.c:169 +#: dropdb.c:177 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr " -i, --interactive 何かを削除する前に警告する\n" -#: dropdb.c:171 +#: dropdb.c:179 #, c-format msgid " --if-exists don't report error if database doesn't exist\n" msgstr " --if-exists データベースが存在しない場合にエラーを報告しない\n" -#: dropuser.c:115 +#: dropuser.c:118 msgid "Enter name of role to drop: " msgstr "削除したいロール名を入力:" -#: dropuser.c:121 +#: dropuser.c:122 #, c-format msgid "missing required argument role name" msgstr "必須の引数であるロール名がありません" -#: dropuser.c:129 +#: dropuser.c:130 #, c-format msgid "Role \"%s\" will be permanently removed.\n" msgstr "ロール\"%s\"は永久に削除されます\n" -#: dropuser.c:147 +#: dropuser.c:154 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "ロール\"%s\"の削除に失敗しました: %s" -#: dropuser.c:162 +#: dropuser.c:169 #, c-format msgid "" "%s removes a PostgreSQL role.\n" "\n" msgstr "" -"%sはPostgreSQLのロールを削除します\n" +"%sはPostgreSQLのロールを削除します。\n" "\n" -#: dropuser.c:167 +#: dropuser.c:174 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -695,126 +722,116 @@ msgstr "" " -i, --interactive 何かを削除する前に入力を促し、またロール名が指定\n" " されていない場合はその入力を促す\n" -#: dropuser.c:170 +#: dropuser.c:177 #, c-format msgid " --if-exists don't report error if user doesn't exist\n" msgstr " --if-exists ユーザが存在しない場合にエラーを報告しない\n" -#: dropuser.c:175 +#: dropuser.c:182 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n" msgstr " -U, --username=ユーザ名 このユーザとして接続(削除対象ユーザではありません)\n" -#: pg_isready.c:144 -#, c-format -msgid "%s" -msgstr "%s" - -#: pg_isready.c:152 +#: pg_isready.c:154 #, c-format msgid "could not fetch default options" msgstr "デフォルトのオプションを取り出すことができませんでした" -#: pg_isready.c:201 +#: pg_isready.c:203 #, c-format msgid "accepting connections\n" msgstr "接続を受け付けています\n" -#: pg_isready.c:204 +#: pg_isready.c:206 #, c-format msgid "rejecting connections\n" msgstr "接続を拒絶しています\n" -#: pg_isready.c:207 +#: pg_isready.c:209 #, c-format msgid "no response\n" msgstr "レスポンスがありません\n" -#: pg_isready.c:210 +#: pg_isready.c:212 #, c-format msgid "no attempt\n" msgstr "施行がありません\n" -#: pg_isready.c:213 +#: pg_isready.c:215 #, c-format msgid "unknown\n" msgstr "unknown\n" -#: pg_isready.c:223 +#: pg_isready.c:225 #, c-format msgid "" "%s issues a connection check to a PostgreSQL database.\n" "\n" msgstr "" -"%sはPostgreSQLデータベースに対して接続検査を発行します\n" +"%sはPostgreSQLデータベースに対して接続検査を発行します。\n" "\n" -#: pg_isready.c:225 +#: pg_isready.c:227 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_isready.c:228 +#: pg_isready.c:230 #, c-format msgid " -d, --dbname=DBNAME database name\n" msgstr " -d, --dbname=DBNAME データベース名\n" -#: pg_isready.c:229 +#: pg_isready.c:231 #, c-format msgid " -q, --quiet run quietly\n" msgstr " -q, --quiet メッセージを出力せずに実行する\n" -#: pg_isready.c:230 +#: pg_isready.c:232 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: pg_isready.c:231 +#: pg_isready.c:233 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: pg_isready.c:234 +#: pg_isready.c:236 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME データベースサーバのホストまたはソケットディレクトリ\n" -#: pg_isready.c:235 +#: pg_isready.c:237 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT データベースサーバのポート番号\n" -#: pg_isready.c:236 +#: pg_isready.c:238 #, c-format msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n" msgstr " -t, --timeout=SECS 接続試行時の待機秒数、ゼロで無効化(デフォルト: %s)\n" -#: pg_isready.c:237 +#: pg_isready.c:239 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME このユーザ名で接続する\n" -#: reindexdb.c:154 vacuumdb.c:192 -#, c-format -msgid "number of parallel jobs must be at least 1" -msgstr "並列ジョブの数は最低でも1以上でなければなりません" - -#: reindexdb.c:197 +#: reindexdb.c:209 #, c-format msgid "cannot reindex all databases and a specific one at the same time" msgstr "全データベースと特定のデータベースは同時に再インデックス化はできません" -#: reindexdb.c:202 +#: reindexdb.c:211 #, c-format msgid "cannot reindex all databases and system catalogs at the same time" msgstr "全データベースとシステムカタログの両方は同時に再インデックス化はできません" -#: reindexdb.c:207 +#: reindexdb.c:213 #, c-format msgid "cannot reindex specific schema(s) in all databases" msgstr "全データベースにおける特定のスキーマ(群)の再インデックス化はできません" -#: reindexdb.c:212 +#: reindexdb.c:215 #, c-format msgid "cannot reindex specific table(s) in all databases" msgstr "全データベースにおける特定のテーブル(群)の再インデックス化はできません" @@ -824,73 +841,74 @@ msgstr "全データベースにおける特定のテーブル(群)の再イン msgid "cannot reindex specific index(es) in all databases" msgstr "全データベースにおける特定のインデックス(群)の再作成はできません" -#: reindexdb.c:229 +#: reindexdb.c:227 #, c-format msgid "cannot reindex specific schema(s) and system catalogs at the same time" msgstr "特定のスキーマ(群)とシステムカタログは同時に再インデックス化はできません" -#: reindexdb.c:234 +#: reindexdb.c:229 #, c-format msgid "cannot reindex specific table(s) and system catalogs at the same time" msgstr "特定のテーブル(群)とシステムカタログは同時に再インデックス化はできません" -#: reindexdb.c:239 +#: reindexdb.c:231 #, c-format msgid "cannot reindex specific index(es) and system catalogs at the same time" msgstr "特定のインデックスとシステムカタログは同時に再インデックス化はできません" -#: reindexdb.c:245 +#: reindexdb.c:234 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "システムカタログのインデックス再構築では複数ジョブを使用できません" -#: reindexdb.c:272 +#: reindexdb.c:260 #, c-format msgid "cannot use multiple jobs to reindex indexes" msgstr "インデックス再構築には複数ジョブを使用できません" -#: reindexdb.c:337 vacuumdb.c:434 vacuumdb.c:442 vacuumdb.c:450 vacuumdb.c:458 -#: vacuumdb.c:465 vacuumdb.c:472 vacuumdb.c:479 +#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439 +#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469 +#: vacuumdb.c:473 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "PostgreSQL %2$sよりも古いサーバーバージョンでは\"%1$s\"オプションは使えません" -#: reindexdb.c:377 +#: reindexdb.c:369 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "システムカタログではインデックスの並行再構築はできません、全てスキップします" -#: reindexdb.c:558 +#: reindexdb.c:573 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "データベース\"%s\"のインデックス再構築に失敗しました: %s" -#: reindexdb.c:562 +#: reindexdb.c:577 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "データベース\"%2$s\"中にあるインデックス\"%1$s\"の再作成に失敗しました: %3$s" -#: reindexdb.c:566 +#: reindexdb.c:581 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "データベース\"%2$s\"中にあるスキーマ\"%1$s\"のインデックス再構築に失敗しました: %3$s" -#: reindexdb.c:570 +#: reindexdb.c:585 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "データベース\"%s\"中のシステムカタログのインデックス再構築に失敗しました: %s" -#: reindexdb.c:574 +#: reindexdb.c:589 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "データベース\"%2$s\"中にあるテーブル\"%1$s\"のインでックス再構築に失敗しました: %3$s" -#: reindexdb.c:731 +#: reindexdb.c:742 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: データベース\"%s\"を再インデックス化しています\n" -#: reindexdb.c:752 +#: reindexdb.c:759 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -899,239 +917,253 @@ msgstr "" "%sはPostgreSQLデータベースを再インデックス化します。\n" "\n" -#: reindexdb.c:756 -#, c-format -msgid " -a, --all reindex all databases\n" -msgstr " -a, --all 全データベースを再インデックス化します\n" - -#: reindexdb.c:757 +#: reindexdb.c:763 #, c-format -msgid " --concurrently reindex concurrently\n" -msgstr " --concurrently 並行再構築\n" +msgid " -a, --all reindex all databases\n" +msgstr " -a, --all 全データベースでインデックス再構築を行う\n" -#: reindexdb.c:758 +#: reindexdb.c:764 #, c-format -msgid " -d, --dbname=DBNAME database to reindex\n" -msgstr " -d, --dbname=DBNAME 再インデックス化対象のデータベース名\n" +msgid " --concurrently reindex concurrently\n" +msgstr " --concurrently 並行インデックス再構築\n" -#: reindexdb.c:760 +#: reindexdb.c:765 #, c-format -msgid " -i, --index=INDEX recreate specific index(es) only\n" -msgstr " -i, --index=INDEX 指定したインデックス(群)のみを再インデックス化\n" +msgid " -d, --dbname=DBNAME database to reindex\n" +msgstr " -d, --dbname=DBNAME インデックス再構築対象のデータベース\n" -#: reindexdb.c:761 +#: reindexdb.c:767 #, c-format -msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" -msgstr " -j, --jobs=NUM インデックス再構築にこの数の並列接続を使用\n" +msgid " -i, --index=INDEX recreate specific index(es) only\n" +msgstr " -i, --index=INDEX 指定したインデックス(群)のみを再構築\n" -#: reindexdb.c:763 +#: reindexdb.c:768 #, c-format -msgid " -s, --system reindex system catalogs\n" -msgstr " -s, --system システムカタログを再インデックス化\n" +msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" +msgstr " -j, --jobs=NUM インデックス再構築にこの数の並列接続を使用\n" -#: reindexdb.c:764 +#: reindexdb.c:769 #, c-format -msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" -msgstr " -S, --schema=SCHEMA 指定したスキーマ(群)のみを再インデックス化\n" +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet メッセージを一切出力しない\n" -#: reindexdb.c:765 +#: reindexdb.c:770 #, c-format -msgid " -t, --table=TABLE reindex specific table(s) only\n" -msgstr " -t, --table=TABLE 指定したテーブル(群)のみを再インデックス化\n" +msgid " -s, --system reindex system catalogs only\n" +msgstr " -s, --system システムカタログのインデックスのみを再構築\n" -#: reindexdb.c:776 +#: reindexdb.c:771 #, c-format -msgid "" -"\n" -"Read the description of the SQL command REINDEX for details.\n" -msgstr "" -"\n" -"詳細はSQLコマンドREINDEXに関する説明を参照してください。\n" +msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" +msgstr " -S, --schema=SCHEMA 指定したスキーマ(群)のインデックスのみを再構築\n" -#: scripts_parallel.c:234 +#: reindexdb.c:772 #, c-format -msgid "too many jobs for this platform -- try %d" -msgstr "このプラットフォームではジョブ数が多すぎます -- %dで試してください" +msgid " -t, --table=TABLE reindex specific table(s) only\n" +msgstr " -t, --table=TABLE 指定したテーブル(群)のインデックスを再構築\n" -#: vacuumdb.c:200 +#: reindexdb.c:773 #, c-format -msgid "parallel vacuum degree must be a non-negative integer" -msgstr "並列VACUUMの並列度は非負の整数でなければなりません" +msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" +msgstr " -D, --tablespace=TABLESPACE インデックス再構築先のテーブル空間\n" -#: vacuumdb.c:220 +#: reindexdb.c:774 #, c-format -msgid "minimum transaction ID age must be at least 1" -msgstr "最小トランザクションID差分は1以上でなければなりません" +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose 多量のメッセージを出力\n" -#: vacuumdb.c:228 +#: reindexdb.c:784 #, c-format -msgid "minimum multixact ID age must be at least 1" -msgstr "最小マルチトランザクションID差分は1以上でなくてはなりません" +msgid "" +"\n" +"Read the description of the SQL command REINDEX for details.\n" +msgstr "" +"\n" +"詳細はSQLコマンドREINDEXに関する説明を参照してください。\n" -#: vacuumdb.c:266 vacuumdb.c:272 vacuumdb.c:278 vacuumdb.c:284 vacuumdb.c:290 -#: vacuumdb.c:302 +#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279 +#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "analyzeのみを実行する場合\"%s\"は使えません" -#: vacuumdb.c:308 +#: vacuumdb.c:297 #, c-format -msgid "cannot use the \"%s\" option when performing full" -msgstr "fullを実行する場合\"%s\"オプションは使えません" +msgid "cannot use the \"%s\" option when performing full vacuum" +msgstr "完全(full)VACUUMを実行する場合は\"%s\"オプションは使えません" -#: vacuumdb.c:324 +#: vacuumdb.c:303 +#, c-format +msgid "cannot use the \"%s\" option with the \"%s\" option" +msgstr "\"%s\"オプションは\"%s\"と同時には使えません" + +#: vacuumdb.c:322 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "全データベースと特定のデータベースを同時にVACUUMすることはできません" -#: vacuumdb.c:329 +#: vacuumdb.c:324 #, c-format msgid "cannot vacuum specific table(s) in all databases" msgstr "全データベースの特定のテーブル(群)をVACUUMすることはできません" -#: vacuumdb.c:420 +#: vacuumdb.c:412 msgid "Generating minimal optimizer statistics (1 target)" msgstr "最適化のための情報を最小限生成します(1対象)" -#: vacuumdb.c:421 +#: vacuumdb.c:413 msgid "Generating medium optimizer statistics (10 targets)" msgstr "最適化のための情報を複数生成します(10対象)" -#: vacuumdb.c:422 +#: vacuumdb.c:414 msgid "Generating default (full) optimizer statistics" msgstr "最適化のための情報をデフォルト数(全て)生成します" -#: vacuumdb.c:487 +#: vacuumdb.c:479 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: データベース\"%s\"の処理中です: %s\n" -#: vacuumdb.c:490 +#: vacuumdb.c:482 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: データベース\"%s\"をVACUUMしています\n" -#: vacuumdb.c:963 +#: vacuumdb.c:952 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "データベース \"%2$s\"のテーブル\"%1$sのVACUUMに失敗しました: %3$s" -#: vacuumdb.c:966 +#: vacuumdb.c:955 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "データベース\"%s\"のVACUUMに失敗しました: %s" -#: vacuumdb.c:974 +#: vacuumdb.c:963 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" "\n" msgstr "%sはPostgreSQLデータベースのゴミ回収および分析を行います。\n" -#: vacuumdb.c:978 +#: vacuumdb.c:967 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all 全データベースをVACUUM\n" -#: vacuumdb.c:979 +#: vacuumdb.c:968 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=DBNAME VACUUMするデータベース名\n" -#: vacuumdb.c:980 +#: vacuumdb.c:969 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping すべてのページスキップ動作を禁止\n" -#: vacuumdb.c:981 +#: vacuumdb.c:970 #, c-format msgid " -e, --echo show the commands being sent to the server\n" -msgstr " -e, --echo サーバに送られるコマンドを表示\n" +msgstr " -e, --echo サーバーに送られるコマンドを表示\n" -#: vacuumdb.c:982 +#: vacuumdb.c:971 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full VACUUM FULLを実行\n" -#: vacuumdb.c:983 +#: vacuumdb.c:972 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze 行トランザクション情報を凍結\n" -#: vacuumdb.c:984 +#: vacuumdb.c:973 +#, c-format +msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" +msgstr "" +" --force-index-cleanup デッドタプルを指すインデックスエントリを常に\n" +" 除去する\n" + +#: vacuumdb.c:974 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr " -j, --jobs=NUM バキューム時に指定した同時接続数を使用\n" -#: vacuumdb.c:985 +#: vacuumdb.c:975 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr "" " --min-mxid-age=MXID_AGE VACUUM対象とするテーブルの最小のマルチ\n" " トランザクションID差分\n" -#: vacuumdb.c:986 +#: vacuumdb.c:976 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr "" " --min-xid-age=XID_AGE VACUUM対象とするテーブルの最小の\n" " トランザクションID差分\n" -#: vacuumdb.c:987 +#: vacuumdb.c:977 #, c-format msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" msgstr "" " --no-index-cleanup デッドタプルを指すインデックスエントリを\n" -"\t 削除しない\n" +" 削除しない\n" -#: vacuumdb.c:988 +#: vacuumdb.c:978 +#, c-format +msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" +msgstr "" +" --no-process-toast テーブルに関連づくTOASTテーブルのVACUUMを\n" +" スキップ\n" + +#: vacuumdb.c:979 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" msgstr " --no-truncate テーブル終端の空ページの切り詰めを行わない\n" -#: vacuumdb.c:989 +#: vacuumdb.c:980 #, c-format -msgid " -P, --parallel=PARALLEL_DEGREE use this many background workers for vacuum, if available\n" +msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" msgstr "" -" -P, --parallel=PARALLEL_DEGREE 可能であればこの数のバックグラウンドワーカを\n" -" VACUUMで使用\n" +" -P, --parallel=PARALLEL_WORKERS 可能であればVACUUMで指定の数のバックグラウンド\n" +" ワーカーを使用\n" -#: vacuumdb.c:990 +#: vacuumdb.c:981 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet メッセージを出力しない\n" -#: vacuumdb.c:991 +#: vacuumdb.c:982 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr " --skip-locked 直ちにロックできなかったリレーションをスキップ\n" -#: vacuumdb.c:992 +#: vacuumdb.c:983 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" -msgstr " -t, --table='TABLE[(COLUMNS)]' 指定したテーブル(複数可)のみをVACUUMします\n" +msgstr " -t, --table='TABLE[(COLUMNS)]' 指定したテーブル(複数可)のみをVACUUM\n" -#: vacuumdb.c:993 +#: vacuumdb.c:984 #, c-format msgid " -v, --verbose write a lot of output\n" -msgstr " -v, --verbose 多くのメッセージを出力します\n" +msgstr " -v, --verbose 多量のメッセージを出力\n" -#: vacuumdb.c:994 +#: vacuumdb.c:985 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: vacuumdb.c:995 +#: vacuumdb.c:986 #, c-format msgid " -z, --analyze update optimizer statistics\n" -msgstr " -z, --analyze 最適化用統計情報を更新します\n" +msgstr " -z, --analyze 最適化用統計情報を更新\n" -#: vacuumdb.c:996 +#: vacuumdb.c:987 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr " -Z, --analyze-only 最適化用統計情報のみ更新; バキュームは行わない\n" -#: vacuumdb.c:997 +#: vacuumdb.c:988 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1140,12 +1172,12 @@ msgstr "" " --analyze-in-stages 高速化のため最適化用統計情報のみを複数段階で\n" " 更新; VACUUMは行わない\n" -#: vacuumdb.c:999 +#: vacuumdb.c:990 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: vacuumdb.c:1007 +#: vacuumdb.c:998 #, c-format msgid "" "\n" @@ -1154,6 +1186,33 @@ msgstr "" "\n" "詳細はSQLコマンドのVACUUMの説明を参照してください。\n" +#~ msgid "fatal: " +#~ msgstr "致命的エラー: " + +#~ msgid "Could not send cancel request: %s" +#~ msgstr "キャンセル要求を送信できませんでした: %s" + +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "詳細は\"%s --help\"を実行してください。\n" + +#~ msgid "could not connect to database %s: %s" +#~ msgstr "データベース%sに接続できませんでした: %s" + +#~ msgid "invalid value for --connection-limit: %s" +#~ msgstr "--connection-limit に対する不正な値: %s" + +#~ msgid "number of parallel jobs must be at least 1" +#~ msgstr "並列ジョブの数は最低でも1以上でなければなりません" + +#~ msgid "parallel vacuum degree must be a non-negative integer" +#~ msgstr "並列VACUUMの並列度は非負の整数でなければなりません" + +#~ msgid "minimum transaction ID age must be at least 1" +#~ msgstr "最小トランザクションID差分は1以上でなければなりません" + +#~ msgid "minimum multixact ID age must be at least 1" +#~ msgstr "最小マルチトランザクションID差分は1以上でなくてはなりません" + #~ msgid "%s: could not obtain information about current user: %s\n" #~ msgstr "%s: 現在のユーザに関する情報を取得できませんでした: %s\n" diff --git a/src/bin/scripts/po/ru.po b/src/bin/scripts/po/ru.po index 6166c32182..dd747b2913 100644 --- a/src/bin/scripts/po/ru.po +++ b/src/bin/scripts/po/ru.po @@ -3,13 +3,13 @@ # This file is distributed under the same license as the PostgreSQL package. # Serguei A. Mokhov, , 2003-2004. # Oleg Bartunov , 2004. -# Alexander Lakhin , 2012-2017, 2019, 2020. +# Alexander Lakhin , 2012-2017, 2019, 2020, 2021. msgid "" msgstr "" "Project-Id-Version: pgscripts (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-11-20 15:13+0300\n" -"PO-Revision-Date: 2020-09-15 18:56+0300\n" +"POT-Creation-Date: 2022-02-07 11:21+0300\n" +"PO-Revision-Date: 2021-11-08 05:30+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -19,17 +19,17 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "важно: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "ошибка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "предупреждение: " @@ -59,15 +59,39 @@ msgstr "пользователь не существует" msgid "user name lookup failure: error code %lu" msgstr "распознать имя пользователя не удалось (код ошибки: %lu)" -#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 msgid "Cancel request sent\n" msgstr "Сигнал отмены отправлен\n" -#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 msgid "Could not send cancel request: " msgstr "Отправить сигнал отмены не удалось: " -#: ../../fe_utils/print.c:350 +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:107 +msgid "Password: " +msgstr "Пароль: " + +#: ../../fe_utils/connect_utils.c:92 +#, c-format +msgid "could not connect to database %s: out of memory" +msgstr "не удалось подключиться к базе %s (нехватка памяти)" + +#: ../../fe_utils/connect_utils.c:120 pg_isready.c:145 +#, c-format +msgid "%s" +msgstr "%s" + +#: ../../fe_utils/parallel_slot.c:302 +#, c-format +msgid "too many jobs for this platform" +msgstr "слишком много заданий для этой платформы" + +#: ../../fe_utils/parallel_slot.c:522 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "ошибка при обработке базы \"%s\": %s" + +#: ../../fe_utils/print.c:336 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" @@ -75,70 +99,78 @@ msgstr[0] "(%lu строка)" msgstr[1] "(%lu строки)" msgstr[2] "(%lu строк)" -#: ../../fe_utils/print.c:3055 +#: ../../fe_utils/print.c:3039 #, c-format msgid "Interrupted\n" -msgstr "Прерывание\n" +msgstr "Прервано\n" -#: ../../fe_utils/print.c:3119 +#: ../../fe_utils/print.c:3103 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "" -"Добавить заголовок к содержимому таблицы нельзя: число столбцов превышает " -"%d.\n" +"Ошибка добавления заголовка таблицы: превышен предел числа столбцов (%d).\n" -#: ../../fe_utils/print.c:3159 +#: ../../fe_utils/print.c:3143 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "" -"Добавить ячейку к содержимому таблицы нельзя: общее число ячеек превышает " -"%d.\n" +"Ошибка добавления ячейки в таблицу: превышен предел числа ячеек (%d).\n" -#: ../../fe_utils/print.c:3414 +#: ../../fe_utils/print.c:3401 #, c-format msgid "invalid output format (internal error): %d" msgstr "неверный формат вывода (внутренняя ошибка): %d" -#: clusterdb.c:110 clusterdb.c:129 createdb.c:122 createdb.c:141 -#: createuser.c:172 createuser.c:187 dropdb.c:102 dropdb.c:111 dropdb.c:119 -#: dropuser.c:93 dropuser.c:108 dropuser.c:123 pg_isready.c:95 pg_isready.c:109 -#: reindexdb.c:166 reindexdb.c:185 vacuumdb.c:225 vacuumdb.c:244 +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 +#, c-format +msgid "query failed: %s" +msgstr "ошибка при выполнении запроса: %s" + +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#, c-format +msgid "query was: %s" +msgstr "запрос: %s" + +#: clusterdb.c:112 clusterdb.c:131 createdb.c:123 createdb.c:142 +#: createuser.c:172 createuser.c:187 dropdb.c:103 dropdb.c:112 dropdb.c:120 +#: dropuser.c:94 dropuser.c:109 dropuser.c:122 pg_isready.c:96 pg_isready.c:110 +#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:251 vacuumdb.c:270 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Для дополнительной информации попробуйте \"%s --help\".\n" -#: clusterdb.c:127 createdb.c:139 createuser.c:185 dropdb.c:117 dropuser.c:106 -#: pg_isready.c:107 reindexdb.c:183 vacuumdb.c:242 +#: clusterdb.c:129 createdb.c:140 createuser.c:185 dropdb.c:118 dropuser.c:107 +#: pg_isready.c:108 reindexdb.c:191 vacuumdb.c:268 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "слишком много аргументов командной строки (первый: \"%s\")" -#: clusterdb.c:146 +#: clusterdb.c:148 #, c-format msgid "cannot cluster all databases and a specific one at the same time" msgstr "нельзя кластеризовать все базы и одну конкретную одновременно" -#: clusterdb.c:152 +#: clusterdb.c:154 #, c-format msgid "cannot cluster specific table(s) in all databases" msgstr "нельзя кластеризовать указанную таблицу(ы) во всех базах" -#: clusterdb.c:218 +#: clusterdb.c:220 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "кластеризовать таблицу \"%s\" в базе \"%s\" не удалось: %s" -#: clusterdb.c:221 +#: clusterdb.c:223 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "кластеризовать базу \"%s\" не удалось: %s" -#: clusterdb.c:249 +#: clusterdb.c:251 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: кластеризация базы \"%s\"\n" -#: clusterdb.c:265 +#: clusterdb.c:267 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -147,19 +179,19 @@ msgstr "" "%s упорядочивает данные всех кластеризованных таблиц в базе данных.\n" "\n" -#: clusterdb.c:266 createdb.c:266 createuser.c:354 dropdb.c:170 dropuser.c:170 -#: pg_isready.c:224 reindexdb.c:750 vacuumdb.c:911 +#: clusterdb.c:268 createdb.c:267 createuser.c:351 dropdb.c:171 dropuser.c:169 +#: pg_isready.c:225 reindexdb.c:792 vacuumdb.c:1025 #, c-format msgid "Usage:\n" msgstr "Использование:\n" -#: clusterdb.c:267 reindexdb.c:751 vacuumdb.c:912 +#: clusterdb.c:269 reindexdb.c:793 vacuumdb.c:1026 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [ПАРАМЕТР]... [ИМЯ_БД]\n" -#: clusterdb.c:268 createdb.c:268 createuser.c:356 dropdb.c:172 dropuser.c:172 -#: pg_isready.c:227 reindexdb.c:752 vacuumdb.c:913 +#: clusterdb.c:270 createdb.c:269 createuser.c:353 dropdb.c:173 dropuser.c:171 +#: pg_isready.c:228 reindexdb.c:794 vacuumdb.c:1027 #, c-format msgid "" "\n" @@ -168,50 +200,50 @@ msgstr "" "\n" "Параметры:\n" -#: clusterdb.c:269 +#: clusterdb.c:271 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all кластеризовать все базы\n" -#: clusterdb.c:270 +#: clusterdb.c:272 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=ИМЯ_БД имя базы данных для кластеризации\n" -#: clusterdb.c:271 createuser.c:360 dropdb.c:173 dropuser.c:173 reindexdb.c:756 +#: clusterdb.c:273 createuser.c:357 dropdb.c:174 dropuser.c:172 #, c-format msgid "" " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo отображать команды, отправляемые серверу\n" -#: clusterdb.c:272 reindexdb.c:759 +#: clusterdb.c:274 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не выводить никакие сообщения\n" -#: clusterdb.c:273 +#: clusterdb.c:275 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr "" " -t, --table=ТАБЛИЦА кластеризовать только указанную таблицу(ы)\n" -#: clusterdb.c:274 reindexdb.c:763 +#: clusterdb.c:276 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose выводить исчерпывающие сообщения\n" -#: clusterdb.c:275 createuser.c:372 dropdb.c:176 dropuser.c:176 reindexdb.c:764 +#: clusterdb.c:277 createuser.c:369 dropdb.c:177 dropuser.c:175 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: clusterdb.c:276 createuser.c:377 dropdb.c:178 dropuser.c:178 reindexdb.c:765 +#: clusterdb.c:278 createuser.c:374 dropdb.c:179 dropuser.c:177 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: clusterdb.c:277 createdb.c:279 createuser.c:378 dropdb.c:179 dropuser.c:179 -#: pg_isready.c:233 reindexdb.c:766 vacuumdb.c:934 +#: clusterdb.c:279 createdb.c:280 createuser.c:375 dropdb.c:180 dropuser.c:178 +#: pg_isready.c:234 reindexdb.c:809 vacuumdb.c:1052 #, c-format msgid "" "\n" @@ -220,43 +252,39 @@ msgstr "" "\n" "Параметры подключения:\n" -#: clusterdb.c:278 createuser.c:379 dropdb.c:180 dropuser.c:180 reindexdb.c:767 -#: vacuumdb.c:935 +#: clusterdb.c:280 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1053 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=ИМЯ имя сервера баз данных или каталог сокетов\n" -#: clusterdb.c:279 createuser.c:380 dropdb.c:181 dropuser.c:181 reindexdb.c:768 -#: vacuumdb.c:936 +#: clusterdb.c:281 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт сервера баз данных\n" -#: clusterdb.c:280 dropdb.c:182 reindexdb.c:769 vacuumdb.c:937 +#: clusterdb.c:282 dropdb.c:183 vacuumdb.c:1055 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr "" " -U, --username=ИМЯ имя пользователя для подключения к серверу\n" -#: clusterdb.c:281 createuser.c:382 dropdb.c:183 dropuser.c:183 reindexdb.c:770 -#: vacuumdb.c:938 +#: clusterdb.c:283 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1056 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password не запрашивать пароль\n" -#: clusterdb.c:282 createuser.c:383 dropdb.c:184 dropuser.c:184 reindexdb.c:771 -#: vacuumdb.c:939 +#: clusterdb.c:284 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password запросить пароль\n" -#: clusterdb.c:283 dropdb.c:185 reindexdb.c:772 vacuumdb.c:940 +#: clusterdb.c:285 dropdb.c:186 vacuumdb.c:1058 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" -msgstr " --maintenance-db=ИМЯ_БД выбор другой обслуживаемой базы данных\n" +msgstr " --maintenance-db=ИМЯ_БД сменить опорную базу данных\n" -#: clusterdb.c:284 +#: clusterdb.c:286 #, c-format msgid "" "\n" @@ -265,8 +293,8 @@ msgstr "" "\n" "Подробнее о кластеризации вы можете узнать в описании SQL-команды CLUSTER.\n" -#: clusterdb.c:285 createdb.c:287 createuser.c:384 dropdb.c:186 dropuser.c:185 -#: pg_isready.c:238 reindexdb.c:774 vacuumdb.c:942 +#: clusterdb.c:287 createdb.c:288 createuser.c:381 dropdb.c:187 dropuser.c:184 +#: pg_isready.c:239 reindexdb.c:817 vacuumdb.c:1060 #, c-format msgid "" "\n" @@ -275,42 +303,13 @@ msgstr "" "\n" "Об ошибках сообщайте по адресу <%s>.\n" -#: clusterdb.c:286 createdb.c:288 createuser.c:385 dropdb.c:187 dropuser.c:186 -#: pg_isready.c:239 reindexdb.c:775 vacuumdb.c:943 +#: clusterdb.c:288 createdb.c:289 createuser.c:382 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:818 vacuumdb.c:1061 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" -#: common.c:80 common.c:138 -msgid "Password: " -msgstr "Пароль: " - -#: common.c:125 -#, c-format -msgid "could not connect to database %s: out of memory" -msgstr "не удалось подключиться к базе %s (нехватка памяти)" - -#: common.c:152 -#, c-format -msgid "could not connect to database %s: %s" -msgstr "не удалось подключиться к базе %s: %s" - -#: common.c:231 common.c:256 -#, c-format -msgid "query failed: %s" -msgstr "ошибка при выполнении запроса: %s" - -#: common.c:232 common.c:257 -#, c-format -msgid "query was: %s" -msgstr "запрос: %s" - -#: common.c:329 -#, c-format -msgid "processing of database \"%s\" failed: %s" -msgstr "ошибка при обработке базы \"%s\": %s" - -#: common.c:423 +#: common.c:107 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" @@ -319,53 +318,53 @@ msgstr[1] "запрос вернул %d строки вместо одной: %s msgstr[2] "запрос вернул %d строк вместо одной: %s" #. translator: abbreviation for "yes" -#: common.c:447 +#: common.c:131 msgid "y" msgstr "y" #. translator: abbreviation for "no" -#: common.c:449 +#: common.c:133 msgid "n" msgstr "n" #. translator: This is a question followed by the translated options for #. "yes" and "no". -#: common.c:459 +#: common.c:143 #, c-format msgid "%s (%s/%s) " msgstr "%s (%s - да/%s - нет) " -#: common.c:473 +#: common.c:164 #, c-format msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Пожалуйста, введите \"%s\" или \"%s\".\n" -#: createdb.c:149 +#: createdb.c:150 #, c-format msgid "only one of --locale and --lc-ctype can be specified" msgstr "можно указать только --locale или --lc-ctype" -#: createdb.c:154 +#: createdb.c:155 #, c-format msgid "only one of --locale and --lc-collate can be specified" msgstr "можно указать только --locale и --lc-collate" -#: createdb.c:165 +#: createdb.c:166 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" не является верным названием кодировки" -#: createdb.c:228 +#: createdb.c:229 #, c-format msgid "database creation failed: %s" msgstr "создать базу данных не удалось: %s" -#: createdb.c:247 +#: createdb.c:248 #, c-format msgid "comment creation failed (database was created): %s" msgstr "создать комментарий не удалось (база данных была создана): %s" -#: createdb.c:265 +#: createdb.c:266 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -374,102 +373,101 @@ msgstr "" "%s создаёт базу данных PostgreSQL.\n" "\n" -#: createdb.c:267 +#: createdb.c:268 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [ПАРАМЕТР]... [ИМЯ_БД] [ОПИСАНИЕ]\n" # well-spelled: ПРОСТР -#: createdb.c:269 +#: createdb.c:270 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr "" " -D, --tablespace=ТАБЛ_ПРОСТР табличное пространство по умолчанию для базы " "данных\n" -#: createdb.c:270 +#: createdb.c:271 reindexdb.c:798 #, c-format msgid "" " -e, --echo show the commands being sent to the server\n" msgstr "" " -e, --echo отображать команды, отправляемые серверу\n" -#: createdb.c:271 +#: createdb.c:272 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=КОДИРОВКА кодировка базы данных\n" -#: createdb.c:272 +#: createdb.c:273 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=ЛОКАЛЬ локаль для базы данных\n" -#: createdb.c:273 +#: createdb.c:274 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=ЛОКАЛЬ параметр LC_COLLATE для базы данных\n" -#: createdb.c:274 +#: createdb.c:275 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=ЛОКАЛЬ параметр LC_CTYPE для базы данных\n" -#: createdb.c:275 +#: createdb.c:276 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr "" " -O, --owner=ВЛАДЕЛЕЦ пользователь-владелец новой базы данных\n" -#: createdb.c:276 +#: createdb.c:277 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=ШАБЛОН исходная база данных для копирования\n" -#: createdb.c:277 +#: createdb.c:278 reindexdb.c:807 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: createdb.c:278 +#: createdb.c:279 reindexdb.c:808 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: createdb.c:280 +#: createdb.c:281 reindexdb.c:810 #, c-format msgid "" " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=ИМЯ имя сервера баз данных или каталог сокетов\n" -#: createdb.c:281 +#: createdb.c:282 reindexdb.c:811 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт сервера баз данных\n" -#: createdb.c:282 +#: createdb.c:283 reindexdb.c:812 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr "" " -U, --username=ИМЯ имя пользователя для подключения к серверу\n" -#: createdb.c:283 +#: createdb.c:284 reindexdb.c:813 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password не запрашивать пароль\n" -#: createdb.c:284 +#: createdb.c:285 reindexdb.c:814 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password запросить пароль\n" -#: createdb.c:285 +#: createdb.c:286 reindexdb.c:815 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" -msgstr "" -" --maintenance-db=ИМЯ_БД выбор другой обслуживаемой базы данных\n" +msgstr " --maintenance-db=ИМЯ_БД сменить опорную базу данных\n" -#: createdb.c:286 +#: createdb.c:287 #, c-format msgid "" "\n" @@ -487,42 +485,42 @@ msgstr "неверное значение параметра --connection-limit: msgid "Enter name of role to add: " msgstr "Введите имя новой роли: " -#: createuser.c:212 +#: createuser.c:210 msgid "Enter password for new role: " msgstr "Введите пароль для новой роли: " -#: createuser.c:214 +#: createuser.c:211 msgid "Enter it again: " msgstr "Повторите его: " -#: createuser.c:217 +#: createuser.c:214 #, c-format msgid "Passwords didn't match.\n" msgstr "Пароли не совпадают.\n" -#: createuser.c:225 +#: createuser.c:222 msgid "Shall the new role be a superuser?" msgstr "Должна ли новая роль иметь полномочия суперпользователя?" -#: createuser.c:240 +#: createuser.c:237 msgid "Shall the new role be allowed to create databases?" msgstr "Новая роль должна иметь право создавать базы данных?" -#: createuser.c:248 +#: createuser.c:245 msgid "Shall the new role be allowed to create more new roles?" msgstr "Новая роль должна иметь право создавать другие роли?" -#: createuser.c:284 +#: createuser.c:281 #, c-format msgid "password encryption failed: %s" msgstr "ошибка при шифровании пароля: %s" -#: createuser.c:339 +#: createuser.c:336 #, c-format msgid "creation of new role failed: %s" msgstr "создать роль не удалось: %s" -#: createuser.c:353 +#: createuser.c:350 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -531,12 +529,12 @@ msgstr "" "%s создаёт роль пользователя PostgreSQL.\n" "\n" -#: createuser.c:355 dropuser.c:171 +#: createuser.c:352 dropuser.c:170 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [ПАРАМЕТР]... [ИМЯ_РОЛИ]\n" -#: createuser.c:357 +#: createuser.c:354 #, c-format msgid "" " -c, --connection-limit=N connection limit for role (default: no limit)\n" @@ -544,24 +542,24 @@ msgstr "" " -c, --connection-limit=N предел подключений для роли\n" " (по умолчанию предела нет)\n" -#: createuser.c:358 +#: createuser.c:355 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb роль с правом создания баз данных\n" -#: createuser.c:359 +#: createuser.c:356 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr "" " -D, --no-createdb роль без права создания баз данных (по " "умолчанию)\n" -#: createuser.c:361 +#: createuser.c:358 #, c-format msgid " -g, --role=ROLE new role will be a member of this role\n" msgstr " -g, --role=РОЛЬ новая роль будет включена в эту роль\n" -#: createuser.c:362 +#: createuser.c:359 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -571,52 +569,52 @@ msgstr "" "она\n" " включена (по умолчанию)\n" -#: createuser.c:364 +#: createuser.c:361 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit роль не наследует права\n" -#: createuser.c:365 +#: createuser.c:362 #, c-format msgid " -l, --login role can login (default)\n" msgstr "" " -l, --login роль с правом подключения к серверу (по " "умолчанию)\n" -#: createuser.c:366 +#: createuser.c:363 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login роль без права подключения\n" -#: createuser.c:367 +#: createuser.c:364 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt назначить пароль новой роли\n" -#: createuser.c:368 +#: createuser.c:365 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole роль с правом создания других ролей\n" -#: createuser.c:369 +#: createuser.c:366 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr "" " -R, --no-createrole роль без права создания ролей (по умолчанию)\n" -#: createuser.c:370 +#: createuser.c:367 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser роль с полномочиями суперпользователя\n" -#: createuser.c:371 +#: createuser.c:368 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr "" " -S, --no-superuser роль без полномочий суперпользователя (по " "умолчанию)\n" -#: createuser.c:373 +#: createuser.c:370 #, c-format msgid "" " --interactive prompt for missing role name and attributes " @@ -626,17 +624,17 @@ msgstr "" " --interactive запрашивать отсутствующие атрибуты и имя роли,\n" " а не использовать значения по умолчанию\n" -#: createuser.c:375 +#: createuser.c:372 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication роль может инициировать репликацию\n" -#: createuser.c:376 +#: createuser.c:373 #, c-format msgid " --no-replication role cannot initiate replication\n" msgstr " --no-replication роль не может инициировать репликацию\n" -#: createuser.c:381 +#: createuser.c:378 #, c-format msgid "" " -U, --username=USERNAME user name to connect as (not the one to create)\n" @@ -644,26 +642,26 @@ msgstr "" " -U, --username=ИМЯ имя пользователя для выполнения операции\n" " (но не имя новой роли)\n" -#: dropdb.c:110 +#: dropdb.c:111 #, c-format msgid "missing required argument database name" msgstr "отсутствует необходимый аргумент: имя базы данных" -#: dropdb.c:125 +#: dropdb.c:126 #, c-format msgid "Database \"%s\" will be permanently removed.\n" msgstr "База данных \"%s\" будет удалена безвозвратно.\n" -#: dropdb.c:126 dropuser.c:131 +#: dropdb.c:127 dropuser.c:130 msgid "Are you sure?" msgstr "Вы уверены? (y/n)" -#: dropdb.c:155 +#: dropdb.c:156 #, c-format msgid "database removal failed: %s" msgstr "ошибка при удалении базы данных: %s" -#: dropdb.c:169 +#: dropdb.c:170 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -672,12 +670,12 @@ msgstr "" "%s удаляет базу данных PostgreSQL.\n" "\n" -#: dropdb.c:171 +#: dropdb.c:172 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [ПАРАМЕТР]... БД\n" -#: dropdb.c:174 +#: dropdb.c:175 #, c-format msgid "" " -f, --force try to terminate other connections before " @@ -686,38 +684,38 @@ msgstr "" " -f, --force пытаться закрыть другие подключения перед " "удалением\n" -#: dropdb.c:175 +#: dropdb.c:176 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr " -i, --interactive подтвердить операцию удаления\n" -#: dropdb.c:177 +#: dropdb.c:178 #, c-format msgid "" " --if-exists don't report error if database doesn't exist\n" msgstr "" " --if-exists не считать ошибкой отсутствие базы данных\n" -#: dropuser.c:116 +#: dropuser.c:117 msgid "Enter name of role to drop: " msgstr "Введите имя удаляемой роли: " -#: dropuser.c:122 +#: dropuser.c:121 #, c-format msgid "missing required argument role name" msgstr "отсутствует необходимый аргумент: имя роли" -#: dropuser.c:130 +#: dropuser.c:129 #, c-format msgid "Role \"%s\" will be permanently removed.\n" msgstr "Роль \"%s\" будет удалена безвозвратно.\n" -#: dropuser.c:154 +#: dropuser.c:153 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "ошибка при удалении роли \"%s\": %s" -#: dropuser.c:169 +#: dropuser.c:168 #, c-format msgid "" "%s removes a PostgreSQL role.\n" @@ -726,7 +724,7 @@ msgstr "" "%s удаляет роль PostgreSQL.\n" "\n" -#: dropuser.c:174 +#: dropuser.c:173 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -735,13 +733,13 @@ msgstr "" " -i, --interactive подтверждать операцию удаления и запрашивать\n" " имя роли, если оно не указано\n" -#: dropuser.c:177 +#: dropuser.c:176 #, c-format msgid " --if-exists don't report error if user doesn't exist\n" msgstr "" " --if-exists не считать ошибкой отсутствие пользователя\n" -#: dropuser.c:182 +#: dropuser.c:181 #, c-format msgid "" " -U, --username=USERNAME user name to connect as (not the one to drop)\n" @@ -749,42 +747,37 @@ msgstr "" " -U, --username=ИМЯ имя пользователя для выполнения операции\n" " (но не имя удаляемой роли)\n" -#: pg_isready.c:144 -#, c-format -msgid "%s" -msgstr "%s" - -#: pg_isready.c:152 +#: pg_isready.c:153 #, c-format msgid "could not fetch default options" msgstr "не удалось получить параметры по умолчанию" -#: pg_isready.c:201 +#: pg_isready.c:202 #, c-format msgid "accepting connections\n" msgstr "принимает подключения\n" -#: pg_isready.c:204 +#: pg_isready.c:205 #, c-format msgid "rejecting connections\n" msgstr "отвергает подключения\n" -#: pg_isready.c:207 +#: pg_isready.c:208 #, c-format msgid "no response\n" msgstr "нет ответа\n" -#: pg_isready.c:210 +#: pg_isready.c:211 #, c-format msgid "no attempt\n" msgstr "проверка не выполнялась\n" -#: pg_isready.c:213 +#: pg_isready.c:214 #, c-format msgid "unknown\n" msgstr "неизвестно\n" -#: pg_isready.c:223 +#: pg_isready.c:224 #, c-format msgid "" "%s issues a connection check to a PostgreSQL database.\n" @@ -793,43 +786,43 @@ msgstr "" "%s проверяет подключение к базе данных PostgreSQL.\n" "\n" -#: pg_isready.c:225 +#: pg_isready.c:226 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [ПАРАМЕТР]...\n" -#: pg_isready.c:228 +#: pg_isready.c:229 #, c-format msgid " -d, --dbname=DBNAME database name\n" msgstr " -d, --dbname=БД имя базы\n" -#: pg_isready.c:229 +#: pg_isready.c:230 #, c-format msgid " -q, --quiet run quietly\n" msgstr " -q, --quiet не выводить никакие сообщения\n" -#: pg_isready.c:230 +#: pg_isready.c:231 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: pg_isready.c:231 +#: pg_isready.c:232 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: pg_isready.c:234 +#: pg_isready.c:235 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=ИМЯ имя сервера баз данных или каталог сокетов\n" -#: pg_isready.c:235 +#: pg_isready.c:236 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт сервера баз данных\n" -#: pg_isready.c:236 +#: pg_isready.c:237 #, c-format msgid "" " -t, --timeout=SECS seconds to wait when attempting connection, 0 " @@ -838,122 +831,123 @@ msgstr "" " -t, --timeout=СЕК время ожидания при попытке подключения;\n" " 0 - без ограничения (по умолчанию: %s)\n" -#: pg_isready.c:237 +#: pg_isready.c:238 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr "" " -U, --username=ИМЯ имя пользователя для подключения к серверу\n" -#: reindexdb.c:152 vacuumdb.c:184 +#: reindexdb.c:157 vacuumdb.c:198 #, c-format msgid "number of parallel jobs must be at least 1" msgstr "число параллельных заданий должно быть не меньше 1" -#: reindexdb.c:202 +#: reindexdb.c:210 #, c-format msgid "cannot reindex all databases and a specific one at the same time" msgstr "" "нельзя переиндексировать все базы данных и одну конкретную одновременно" -#: reindexdb.c:207 +#: reindexdb.c:215 #, c-format msgid "cannot reindex all databases and system catalogs at the same time" msgstr "" "нельзя переиндексировать все базы данных и системные каталоги одновременно" -#: reindexdb.c:212 +#: reindexdb.c:220 #, c-format msgid "cannot reindex specific schema(s) in all databases" msgstr "нельзя переиндексировать указанную схему(ы) во всех базах" -#: reindexdb.c:217 +#: reindexdb.c:225 #, c-format msgid "cannot reindex specific table(s) in all databases" msgstr "нельзя переиндексировать указанную таблицу(ы) во всех базах" -#: reindexdb.c:222 +#: reindexdb.c:230 #, c-format msgid "cannot reindex specific index(es) in all databases" msgstr "нельзя переиндексировать указанный индекс(ы) во всех базах" -#: reindexdb.c:235 +#: reindexdb.c:243 #, c-format msgid "cannot reindex specific schema(s) and system catalogs at the same time" msgstr "" "нельзя переиндексировать указанную схему(ы) и системные каталоги одновременно" -#: reindexdb.c:240 +#: reindexdb.c:248 #, c-format msgid "cannot reindex specific table(s) and system catalogs at the same time" msgstr "" "нельзя переиндексировать указанную таблицу(ы) и системные каталоги " "одновременно" -#: reindexdb.c:245 +#: reindexdb.c:253 #, c-format msgid "cannot reindex specific index(es) and system catalogs at the same time" msgstr "" "нельзя переиндексировать указанный индекс(ы) и системные каталоги " "одновременно" -#: reindexdb.c:251 +#: reindexdb.c:259 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "" "нельзя задействовать несколько заданий для переиндексирования системных " "каталогов" -#: reindexdb.c:280 +#: reindexdb.c:288 #, c-format msgid "cannot use multiple jobs to reindex indexes" msgstr "нельзя задействовать несколько заданий для перестроения индексов" -#: reindexdb.c:344 vacuumdb.c:413 vacuumdb.c:421 vacuumdb.c:428 vacuumdb.c:435 -#: vacuumdb.c:442 +#: reindexdb.c:353 reindexdb.c:361 vacuumdb.c:471 vacuumdb.c:479 vacuumdb.c:487 +#: vacuumdb.c:495 vacuumdb.c:503 vacuumdb.c:511 vacuumdb.c:518 vacuumdb.c:525 +#: vacuumdb.c:532 #, c-format msgid "" "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "" "параметр \"%s\" нельзя использовать с серверами PostgreSQL версии старее %s" -#: reindexdb.c:384 +#: reindexdb.c:401 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "" "все системные каталоги пропускаются, так как их нельзя переиндексировать " "неблокирующим способом" -#: reindexdb.c:564 +#: reindexdb.c:605 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "переиндексировать базу данных \"%s\" не удалось: %s" -#: reindexdb.c:568 +#: reindexdb.c:609 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "перестроить индекс \"%s\" в базе \"%s\" не удалось: %s" -#: reindexdb.c:572 +#: reindexdb.c:613 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "переиндексировать схему \"%s\" в базе \"%s\" не удалось: %s" -#: reindexdb.c:576 +#: reindexdb.c:617 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "переиндексировать системные каталоги в базе \"%s\" не удалось: %s" -#: reindexdb.c:580 +#: reindexdb.c:621 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "переиндексировать таблицу \"%s\" в базе \"%s\" не удалось: %s" -#: reindexdb.c:732 +#: reindexdb.c:774 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: переиндексация базы данных \"%s\"\n" -#: reindexdb.c:749 +#: reindexdb.c:791 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -962,52 +956,75 @@ msgstr "" "%s переиндексирует базу данных PostgreSQL.\n" "\n" -#: reindexdb.c:753 +#: reindexdb.c:795 #, c-format -msgid " -a, --all reindex all databases\n" -msgstr " -a, --all переиндексировать все базы данных\n" +msgid " -a, --all reindex all databases\n" +msgstr " -a, --all переиндексировать все базы данных\n" -#: reindexdb.c:754 +#: reindexdb.c:796 #, c-format -msgid " --concurrently reindex concurrently\n" -msgstr " --concurrently переиндексировать в неблокирующем режиме\n" +msgid " --concurrently reindex concurrently\n" +msgstr "" +" --concurrently переиндексировать в неблокирующем режиме\n" -#: reindexdb.c:755 +#: reindexdb.c:797 #, c-format -msgid " -d, --dbname=DBNAME database to reindex\n" -msgstr " -d, --dbname=БД имя базы для переиндексации\n" +msgid " -d, --dbname=DBNAME database to reindex\n" +msgstr " -d, --dbname=БД имя базы для переиндексации\n" -#: reindexdb.c:757 +#: reindexdb.c:799 #, c-format -msgid " -i, --index=INDEX recreate specific index(es) only\n" -msgstr " -i, --index=ИНДЕКС пересоздать только указанный индекс(ы)\n" +msgid " -i, --index=INDEX recreate specific index(es) only\n" +msgstr "" +" -i, --index=ИНДЕКС пересоздать только указанный индекс(ы)\n" -#: reindexdb.c:758 +#: reindexdb.c:800 #, c-format msgid "" -" -j, --jobs=NUM use this many concurrent connections to reindex\n" +" -j, --jobs=NUM use this many concurrent connections to " +"reindex\n" msgstr "" -" -j, --jobs=ЧИСЛО запускать для переиндексации заданное число " -"заданий\n" +" -j, --jobs=ЧИСЛО запускать для переиндексации заданное число\n" +" заданий\n" -#: reindexdb.c:760 +#: reindexdb.c:801 #, c-format -msgid " -s, --system reindex system catalogs\n" -msgstr " -s, --system переиндексировать системные каталоги\n" +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet не выводить сообщения\n" + +#: reindexdb.c:802 +#, c-format +msgid " -s, --system reindex system catalogs only\n" +msgstr "" +" -s, --system переиндексировать только системные каталоги\n" -#: reindexdb.c:761 +#: reindexdb.c:803 #, c-format -msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" +msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr "" -" -S, --schema=СХЕМА переиндексировать только указанную схему(ы)\n" +" -S, --schema=СХЕМА переиндексировать только указанную схему(ы)\n" -#: reindexdb.c:762 +#: reindexdb.c:804 +#, c-format +msgid " -t, --table=TABLE reindex specific table(s) only\n" +msgstr "" +" -t, --table=ТАБЛИЦА переиндексировать только указанную " +"таблицу(ы)\n" + +# well-spelled: ПРОСТР +#: reindexdb.c:805 #, c-format -msgid " -t, --table=TABLE reindex specific table(s) only\n" +msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr "" -" -t, --table=ТАБЛИЦА переиндексировать только указанную таблицу(ы)\n" +" --tablespace=ТАБЛ_ПРОСТР табличное пространство, в котором будут\n" +" перестраиваться индексы\n" -#: reindexdb.c:773 +#: reindexdb.c:806 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose выводить исчерпывающие сообщения\n" + +#: reindexdb.c:816 #, c-format msgid "" "\n" @@ -1016,80 +1033,82 @@ msgstr "" "\n" "Подробнее о переиндексации вы можете узнать в описании SQL-команды REINDEX.\n" -#: scripts_parallel.c:232 -#, c-format -msgid "too many jobs for this platform -- try %d" -msgstr "слишком много заданий для этой платформы — попробуйте уменьшить до %d" - -#: vacuumdb.c:192 +#: vacuumdb.c:206 #, c-format -msgid "parallel vacuum degree must be a non-negative integer" +msgid "parallel workers for vacuum must be greater than or equal to zero" msgstr "" -"степень параллельности для очистки должна задаваться неотрицательным целым" +"число параллельных исполнителей для выполнения очистки должно быть " +"неотрицательным" -#: vacuumdb.c:212 +#: vacuumdb.c:226 #, c-format msgid "minimum transaction ID age must be at least 1" msgstr "минимальный возраст транзакций должен быть не меньше 1" -#: vacuumdb.c:220 +#: vacuumdb.c:234 #, c-format msgid "minimum multixact ID age must be at least 1" msgstr "минимальный возраст мультитранзакций должен быть не меньше 1" -#: vacuumdb.c:252 vacuumdb.c:258 vacuumdb.c:264 vacuumdb.c:276 +#: vacuumdb.c:278 vacuumdb.c:284 vacuumdb.c:290 vacuumdb.c:296 vacuumdb.c:302 +#: vacuumdb.c:308 vacuumdb.c:314 vacuumdb.c:326 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "при выполнении только анализа нельзя использовать параметр \"%s\"" -#: vacuumdb.c:282 +#: vacuumdb.c:332 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "при выполнении полной очистки нельзя использовать параметр \"%s\"" -#: vacuumdb.c:305 +#: vacuumdb.c:341 +#, c-format +msgid "cannot use the \"%s\" option with the \"%s\" option" +msgstr "параметр \"%s\" нельзя использовать совместно с \"%s\"" + +#: vacuumdb.c:363 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "нельзя очистить все базы данных и одну конкретную одновременно" -#: vacuumdb.c:310 +#: vacuumdb.c:368 #, c-format msgid "cannot vacuum specific table(s) in all databases" msgstr "нельзя очистить только указанную таблицу(ы) во всех базах" -#: vacuumdb.c:400 +#: vacuumdb.c:458 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Вычисление минимальной статистики для оптимизатора (1 запись)" -#: vacuumdb.c:401 +#: vacuumdb.c:459 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Вычисление средней статистики для оптимизатора (10 записей)" -#: vacuumdb.c:402 +#: vacuumdb.c:460 msgid "Generating default (full) optimizer statistics" msgstr "Вычисление стандартной (полной) статистики для оптимизатора" -#: vacuumdb.c:450 +#: vacuumdb.c:540 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: обработка базы данных \"%s\": %s\n" -#: vacuumdb.c:453 +#: vacuumdb.c:543 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: очистка базы данных \"%s\"\n" -#: vacuumdb.c:899 +#: vacuumdb.c:1013 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "очистить таблицу \"%s\" в базе \"%s\" не удалось: %s" -#: vacuumdb.c:902 +#: vacuumdb.c:1016 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "очистить базу данных \"%s\" не удалось: %s" -#: vacuumdb.c:910 +#: vacuumdb.c:1024 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1098,23 +1117,23 @@ msgstr "" "%s очищает и анализирует базу данных PostgreSQL.\n" "\n" -#: vacuumdb.c:914 +#: vacuumdb.c:1028 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all очистить все базы данных\n" -#: vacuumdb.c:915 +#: vacuumdb.c:1029 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=ИМЯ_БД очистить указанную базу данных\n" -#: vacuumdb.c:916 +#: vacuumdb.c:1030 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr "" " --disable-page-skipping исключить все варианты пропуска страниц\n" -#: vacuumdb.c:917 +#: vacuumdb.c:1031 #, c-format msgid "" " -e, --echo show the commands being sent to the " @@ -1122,19 +1141,29 @@ msgid "" msgstr "" " -e, --echo отображать команды, отправляемые серверу\n" -#: vacuumdb.c:918 +#: vacuumdb.c:1032 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full произвести полную очистку\n" -#: vacuumdb.c:919 +#: vacuumdb.c:1033 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr "" " -F, --freeze заморозить информацию о транзакциях в " "строках\n" -#: vacuumdb.c:920 +#: vacuumdb.c:1034 +#, c-format +msgid "" +" --force-index-cleanup always remove index entries that point to " +"dead tuples\n" +msgstr "" +" --force-index-cleanup всегда удалять элементы индекса, " +"указывающие\n" +" на мёртвые кортежи\n" + +#: vacuumdb.c:1035 #, c-format msgid "" " -j, --jobs=NUM use this many concurrent connections to " @@ -1143,7 +1172,7 @@ msgstr "" " -j, --jobs=ЧИСЛО запускать для очистки заданное число " "заданий\n" -#: vacuumdb.c:921 +#: vacuumdb.c:1036 #, c-format msgid "" " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to " @@ -1152,7 +1181,7 @@ msgstr "" " --min-mxid-age=ВОЗРАСТ минимальный возраст мультитранзакций для\n" " таблиц, подлежащих очистке\n" -#: vacuumdb.c:922 +#: vacuumdb.c:1037 #, c-format msgid "" " --min-xid-age=XID_AGE minimum transaction ID age of tables to " @@ -1162,22 +1191,49 @@ msgstr "" "таблиц,\n" " подлежащих очистке\n" -#: vacuumdb.c:923 +#: vacuumdb.c:1038 #, c-format msgid "" -" -P, --parallel=PARALLEL_DEGREE use this many background workers for " +" --no-index-cleanup don't remove index entries that point to " +"dead tuples\n" +msgstr "" +" --no-index-cleanup не удалять элементы индекса, указывающие\n" +" на мёртвые кортежи\n" + +#: vacuumdb.c:1039 +#, c-format +msgid "" +" --no-process-toast skip the TOAST table associated with the " +"table to vacuum\n" +msgstr "" +" --no-process-toast пропускать TOAST-таблицу, связанную\n" +" с очищаемой таблицей\n" + +#: vacuumdb.c:1040 +#, c-format +msgid "" +" --no-truncate don't truncate empty pages at the end of " +"the table\n" +msgstr "" +" --no-truncate не отсекать пустые страницы в конце " +"таблицы\n" + +#: vacuumdb.c:1041 +#, c-format +msgid "" +" -P, --parallel=PARALLEL_WORKERS use this many background workers for " "vacuum, if available\n" msgstr "" -" -P, --parallel=СТЕПЕНЬ_ПАРАЛЛЕЛЬНОСТИ\n" +" -P, --parallel=ПАРАЛЛЕЛЬНЫЕ_ИСПОЛНИТЕЛИ\n" " по возможности использовать для очистки\n" " заданное число фоновых процессов\n" -#: vacuumdb.c:924 +#: vacuumdb.c:1042 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не выводить сообщения\n" -#: vacuumdb.c:925 +#: vacuumdb.c:1043 #, c-format msgid "" " --skip-locked skip relations that cannot be immediately " @@ -1186,29 +1242,29 @@ msgstr "" " --skip-locked пропускать отношения, которые не удаётся\n" " заблокировать немедленно\n" -#: vacuumdb.c:926 +#: vacuumdb.c:1044 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr "" " -t, --table='ТАБЛ[(СТОЛБЦЫ)]' очистить только указанную таблицу(ы)\n" -#: vacuumdb.c:927 +#: vacuumdb.c:1045 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose выводить исчерпывающие сообщения\n" -#: vacuumdb.c:928 +#: vacuumdb.c:1046 #, c-format msgid "" " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: vacuumdb.c:929 +#: vacuumdb.c:1047 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze обновить статистику оптимизатора\n" -#: vacuumdb.c:930 +#: vacuumdb.c:1048 #, c-format msgid "" " -Z, --analyze-only only update optimizer statistics; no " @@ -1217,7 +1273,7 @@ msgstr "" " -Z, --analyze-only только обновить статистику оптимизатора,\n" " не очищать БД\n" -#: vacuumdb.c:931 +#: vacuumdb.c:1049 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in " @@ -1229,12 +1285,12 @@ msgstr "" " (в несколько проходов для большей " "скорости), без очистки\n" -#: vacuumdb.c:933 +#: vacuumdb.c:1051 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: vacuumdb.c:941 +#: vacuumdb.c:1059 #, c-format msgid "" "\n" @@ -1243,6 +1299,13 @@ msgstr "" "\n" "Подробнее об очистке вы можете узнать в описании SQL-команды VACUUM.\n" +#~ msgid "could not connect to database %s: %s" +#~ msgstr "не удалось подключиться к базе %s: %s" + +#~ msgid "parallel vacuum degree must be a non-negative integer" +#~ msgstr "" +#~ "степень параллельности для очистки должна задаваться неотрицательным целым" + #~ msgid "Could not send cancel request: %s" #~ msgstr "Отправить сигнал отмены не удалось: %s" diff --git a/src/bin/scripts/po/sv.po b/src/bin/scripts/po/sv.po index 926b1fea69..c33a139413 100644 --- a/src/bin/scripts/po/sv.po +++ b/src/bin/scripts/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for postgresql -# Dennis Björklund , 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020. +# Dennis Björklund , 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. # Peter Eisentraut , 2013. # Mats Erik Andersson , 2014. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-16 05:16+0000\n" -"PO-Revision-Date: 2020-09-16 07:56+0200\n" +"POT-Creation-Date: 2022-05-09 18:50+0000\n" +"PO-Revision-Date: 2022-05-09 21:46+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,21 +17,26 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "fatalt: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:284 #, c-format msgid "warning: " msgstr "varning: " +#: ../../../src/common/logging.c:295 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:302 +#, c-format +msgid "hint: " +msgstr "tips: " + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -57,86 +62,125 @@ msgstr "användaren finns inte" msgid "user name lookup failure: error code %lu" msgstr "misslyckad sökning efter användarnamn: felkod %lu" -#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 msgid "Cancel request sent\n" msgstr "Förfrågan om avbrytning skickad\n" -#: ../../fe_utils/cancel.c:165 +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 msgid "Could not send cancel request: " msgstr "Kunde inte skicka förfrågan om avbrytning: " -#: ../../fe_utils/cancel.c:210 +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104 +msgid "Password: " +msgstr "Lösenord: " + +#: ../../fe_utils/connect_utils.c:91 #, c-format -msgid "Could not send cancel request: %s" -msgstr "Kunde inte skicka förfrågan om avbrytning: %s" +msgid "could not connect to database %s: out of memory" +msgstr "kunde inte ansluta till databas %s: slut på minne" -#: ../../fe_utils/print.c:350 +#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146 +#, c-format +msgid "%s" +msgstr "%s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s måste vara i intervallet %d..%d" + +#: ../../fe_utils/parallel_slot.c:301 +#, c-format +msgid "too many jobs for this platform" +msgstr "för många jobb för denna plattform" + +#: ../../fe_utils/parallel_slot.c:519 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "processande av databas \"%s\" misslyckades: %s" + +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu rad)" msgstr[1] "(%lu rader)" -#: ../../fe_utils/print.c:3055 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Avbruten\n" -#: ../../fe_utils/print.c:3119 +#: ../../fe_utils/print.c:3173 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Kan inte lägga till rubrik till tabellinnehåll: antal kolumner (%d) överskridet.\n" -#: ../../fe_utils/print.c:3159 +#: ../../fe_utils/print.c:3213 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "Kan inte lägga till cell till tabellinnehåll: totala cellantalet (%d) överskridet.\n" -#: ../../fe_utils/print.c:3414 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "ogiltigt utdataformat (internt fel): %d" -#: clusterdb.c:114 clusterdb.c:133 createdb.c:121 createdb.c:140 -#: createuser.c:171 createuser.c:186 dropdb.c:101 dropdb.c:110 dropdb.c:118 -#: dropuser.c:92 dropuser.c:107 dropuser.c:122 pg_isready.c:95 pg_isready.c:109 -#: reindexdb.c:168 reindexdb.c:187 vacuumdb.c:227 vacuumdb.c:246 +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Försök med \"%s --help\" för mer information.\n" +msgid "query failed: %s" +msgstr "fråga misslyckades: %s" -#: clusterdb.c:131 createdb.c:138 createuser.c:184 dropdb.c:116 dropuser.c:105 -#: pg_isready.c:107 reindexdb.c:185 vacuumdb.c:244 +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#, c-format +msgid "Query was: %s" +msgstr "Frågan var: %s" + +#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158 +#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121 +#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 +#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." + +#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108 +#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för många kommandoradsargument (första är \"%s\")" -#: clusterdb.c:143 +#: clusterdb.c:148 #, c-format msgid "cannot cluster all databases and a specific one at the same time" msgstr "kan inte klustra alla databaser och en angiven på samma gång" -#: clusterdb.c:149 +#: clusterdb.c:151 #, c-format msgid "cannot cluster specific table(s) in all databases" msgstr "kan inte klustra angivna tabeller i alla databaser" -#: clusterdb.c:217 +#: clusterdb.c:215 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "klustring av tabell \"%s\" i databas \"%s\" misslyckades: %s" -#: clusterdb.c:220 +#: clusterdb.c:218 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "klustring av databas \"%s\" misslyckades: %s" -#: clusterdb.c:253 +#: clusterdb.c:246 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: klustring av databas \"%s\"\n" -#: clusterdb.c:274 +#: clusterdb.c:262 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -145,19 +189,19 @@ msgstr "" "%s klustrar alla tidigare klustrade tabeller i en databas.\n" "\n" -#: clusterdb.c:275 createdb.c:259 createuser.c:347 dropdb.c:164 dropuser.c:163 -#: pg_isready.c:224 reindexdb.c:753 vacuumdb.c:921 +#: clusterdb.c:263 createdb.c:283 createuser.c:346 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: clusterdb.c:276 reindexdb.c:754 vacuumdb.c:922 +#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [FLAGGA]... [DBNAMN]\n" -#: clusterdb.c:277 createdb.c:261 createuser.c:349 dropdb.c:166 dropuser.c:165 -#: pg_isready.c:227 reindexdb.c:755 vacuumdb.c:923 +#: clusterdb.c:265 createdb.c:285 createuser.c:348 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966 #, c-format msgid "" "\n" @@ -166,48 +210,48 @@ msgstr "" "\n" "Flaggor:\n" -#: clusterdb.c:278 +#: clusterdb.c:266 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all klustra alla databaser\n" -#: clusterdb.c:279 +#: clusterdb.c:267 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=DBNAME databas att klustra\n" -#: clusterdb.c:280 createuser.c:353 dropdb.c:167 dropuser.c:166 reindexdb.c:759 +#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo visa kommandon som skickas till servern\n" -#: clusterdb.c:281 reindexdb.c:762 +#: clusterdb.c:269 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet skriv inte ut några meddelanden\n" -#: clusterdb.c:282 +#: clusterdb.c:270 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=TABELL klustra enbart ingivna tabeller\n" -#: clusterdb.c:283 reindexdb.c:766 +#: clusterdb.c:271 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose skriv massor med utdata\n" -#: clusterdb.c:284 createuser.c:365 dropdb.c:170 dropuser.c:169 reindexdb.c:767 +#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: clusterdb.c:285 createuser.c:370 dropdb.c:172 dropuser.c:171 reindexdb.c:768 +#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: clusterdb.c:286 createdb.c:272 createuser.c:371 dropdb.c:173 dropuser.c:172 -#: pg_isready.c:233 reindexdb.c:769 vacuumdb.c:944 +#: clusterdb.c:274 createdb.c:300 createuser.c:370 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 #, c-format msgid "" "\n" @@ -216,41 +260,37 @@ msgstr "" "\n" "Flaggor för anslutning:\n" -#: clusterdb.c:287 createuser.c:372 dropdb.c:174 dropuser.c:173 reindexdb.c:770 -#: vacuumdb.c:945 +#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n" -#: clusterdb.c:288 createuser.c:373 dropdb.c:175 dropuser.c:174 reindexdb.c:771 -#: vacuumdb.c:946 +#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT databasserverns port\n" -#: clusterdb.c:289 dropdb.c:176 reindexdb.c:772 vacuumdb.c:947 +#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n" -#: clusterdb.c:290 createuser.c:375 dropdb.c:177 dropuser.c:176 reindexdb.c:773 -#: vacuumdb.c:948 +#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password fråga ej efter lösenord\n" -#: clusterdb.c:291 createuser.c:376 dropdb.c:178 dropuser.c:177 reindexdb.c:774 -#: vacuumdb.c:949 +#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password framtvinga fråga om lösenord\n" -#: clusterdb.c:292 dropdb.c:179 reindexdb.c:775 vacuumdb.c:950 +#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAMN annat val av underhållsdatabas\n" -#: clusterdb.c:293 +#: clusterdb.c:281 #, c-format msgid "" "\n" @@ -259,8 +299,8 @@ msgstr "" "\n" "Läs beskrivningen av SQL-kommandot CLUSTER för detaljer.\n" -#: clusterdb.c:294 createdb.c:280 createuser.c:377 dropdb.c:180 dropuser.c:178 -#: pg_isready.c:238 reindexdb.c:777 vacuumdb.c:952 +#: clusterdb.c:282 createdb.c:308 createuser.c:376 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999 #, c-format msgid "" "\n" @@ -269,42 +309,13 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: clusterdb.c:295 createdb.c:281 createuser.c:378 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:239 reindexdb.c:778 vacuumdb.c:953 +#: clusterdb.c:283 createdb.c:309 createuser.c:377 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: common.c:79 common.c:125 -msgid "Password: " -msgstr "Lösenord: " - -#: common.c:112 -#, c-format -msgid "could not connect to database %s: out of memory" -msgstr "kunde inte ansluta till databas %s: slut på minne" - -#: common.c:139 -#, c-format -msgid "could not connect to database %s: %s" -msgstr "kunde inte ansluta till databas %s: %s" - -#: common.c:214 common.c:239 -#, c-format -msgid "query failed: %s" -msgstr "fråga misslyckades: %s" - -#: common.c:215 common.c:240 -#, c-format -msgid "query was: %s" -msgstr "frågan var: %s" - -#: common.c:312 -#, c-format -msgid "processing of database \"%s\" failed: %s" -msgstr "processande av databas \"%s\" misslyckades: %s" - -#: common.c:406 +#: common.c:107 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" @@ -312,53 +323,53 @@ msgstr[0] "fråga gav %d rad istället för en: %s" msgstr[1] "fråga gav %d rader istället för en: %s" #. translator: abbreviation for "yes" -#: common.c:430 +#: common.c:131 msgid "y" msgstr "j" #. translator: abbreviation for "no" -#: common.c:432 +#: common.c:133 msgid "n" msgstr "n" #. translator: This is a question followed by the translated options for #. "yes" and "no". -#: common.c:442 +#: common.c:143 #, c-format msgid "%s (%s/%s) " msgstr "%s (%s/%s) " -#: common.c:456 +#: common.c:164 #, c-format msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Var vänlig att svara \"%s\" eller \"%s\".\n" -#: createdb.c:148 +#: createdb.c:165 #, c-format msgid "only one of --locale and --lc-ctype can be specified" msgstr "endast en av --locale och --lc-ctype kan anges" -#: createdb.c:153 +#: createdb.c:167 #, c-format msgid "only one of --locale and --lc-collate can be specified" msgstr "endast en av --locale och --lc-collate kan anges" -#: createdb.c:164 +#: createdb.c:175 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" är inte ett giltigt kodningsnamn" -#: createdb.c:221 +#: createdb.c:245 #, c-format msgid "database creation failed: %s" msgstr "misslyckades att skapa databas: %s" -#: createdb.c:240 +#: createdb.c:264 #, c-format msgid "comment creation failed (database was created): %s" msgstr "misslyckades att skapa kommentar (databasen skapades): %s" -#: createdb.c:258 +#: createdb.c:282 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -367,92 +378,113 @@ msgstr "" "%s skapar en PostgreSQL-databas.\n" "\n" -#: createdb.c:260 +#: createdb.c:284 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [FLAGGA]... [DBNAMN] [BESKRIVNING]\n" -#: createdb.c:262 +#: createdb.c:286 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TABELLRYMD förvalt tabellutrymme för databasen\n" -#: createdb.c:263 +#: createdb.c:287 reindexdb.c:766 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo visa kommandon som skickas till servern\n" -#: createdb.c:264 +#: createdb.c:288 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=KODNING teckenkodning för databasen\n" -#: createdb.c:265 +#: createdb.c:289 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOKAL lokalnamn för databasen\n" -#: createdb.c:266 +#: createdb.c:290 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOKAL värde på LC_COLLATE för databasen\n" -#: createdb.c:267 +#: createdb.c:291 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=LOKAL värde på LC_CTYPE för databasen\n" -#: createdb.c:268 +#: createdb.c:292 +#, c-format +msgid " --icu-locale=LOCALE ICU locale setting for the database\n" +msgstr " --icu-locale=LOKAL värde på ICU-lokal för databasen\n" + +#: createdb.c:293 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" locale provider for the database's default collation\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" lokalleverantör av databasens standardjämförelser\n" + +#: createdb.c:295 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=ÄGARE databasanvändare som äger nya databasen\n" -#: createdb.c:269 +#: createdb.c:296 +#, c-format +msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" +msgstr "" +" -S, --strategy=STRATEGI strategi för att skapa en databas, wal_log\n" +" eller file_copy\n" + +#: createdb.c:297 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=MALL databasmall att kopiera\n" -#: createdb.c:270 +#: createdb.c:298 reindexdb.c:775 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: createdb.c:271 +#: createdb.c:299 reindexdb.c:776 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: createdb.c:273 +#: createdb.c:301 reindexdb.c:778 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n" -#: createdb.c:274 +#: createdb.c:302 reindexdb.c:779 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT databasserverns port\n" -#: createdb.c:275 +#: createdb.c:303 reindexdb.c:780 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n" -#: createdb.c:276 +#: createdb.c:304 reindexdb.c:781 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password fråga ej efter lösenord\n" -#: createdb.c:277 +#: createdb.c:305 reindexdb.c:782 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password framtvinga fråga om lösenord\n" -#: createdb.c:278 +#: createdb.c:306 reindexdb.c:783 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAMN annat val av underhållsdatabas\n" -#: createdb.c:279 +#: createdb.c:307 #, c-format msgid "" "\n" @@ -461,51 +493,46 @@ msgstr "" "\n" "Som standard skapas en databas med samma namn som den nuvarande användares namn.\n" -#: createuser.c:150 -#, c-format -msgid "invalid value for --connection-limit: %s" -msgstr "ogiltigt värde till --connection-limit: %s" - -#: createuser.c:194 +#: createuser.c:193 msgid "Enter name of role to add: " msgstr "Mata in namn på den roll som skall läggas till: " -#: createuser.c:211 +#: createuser.c:208 msgid "Enter password for new role: " msgstr "Mata in lösenord för den nya rollen: " -#: createuser.c:213 +#: createuser.c:209 msgid "Enter it again: " msgstr "Mata in det igen: " -#: createuser.c:216 +#: createuser.c:212 #, c-format msgid "Passwords didn't match.\n" msgstr "Lösenorden stämde inte överens.\n" -#: createuser.c:224 +#: createuser.c:220 msgid "Shall the new role be a superuser?" -msgstr "Skall den nya rollen vara en superanvändare?" +msgstr "Skall den nya rollen vara en superuser?" -#: createuser.c:239 +#: createuser.c:235 msgid "Shall the new role be allowed to create databases?" msgstr "Skall den nya rollen tillåtas skapa databaser?" -#: createuser.c:247 +#: createuser.c:243 msgid "Shall the new role be allowed to create more new roles?" msgstr "Skall den nya rollen tillåtas skapa fler nya roller?" -#: createuser.c:277 +#: createuser.c:278 #, c-format msgid "password encryption failed: %s" msgstr "misslyckades med lösenordskryptering: %s" -#: createuser.c:332 +#: createuser.c:331 #, c-format msgid "creation of new role failed: %s" msgstr "misslyckades med att skapa ny roll: %s" -#: createuser.c:346 +#: createuser.c:345 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -514,32 +541,32 @@ msgstr "" "%s skapar en ny PostgreSQL-roll.\n" "\n" -#: createuser.c:348 dropuser.c:164 +#: createuser.c:347 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [FLAGGA]... [ROLLNAMN]\n" -#: createuser.c:350 +#: createuser.c:349 #, c-format msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" msgstr " -c, --connection-limit=N anslutningsgräns för roll (standard: ingen gräns)\n" -#: createuser.c:351 +#: createuser.c:350 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb rollen kan skapa nya databaser\n" -#: createuser.c:352 +#: createuser.c:351 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb rollen kan inte skapa databaser (standard)\n" -#: createuser.c:354 +#: createuser.c:353 #, c-format msgid " -g, --role=ROLE new role will be a member of this role\n" msgstr " -g, --role=ROLL nya rollen kommer bli medlem i denna roll\n" -#: createuser.c:355 +#: createuser.c:354 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -548,47 +575,47 @@ msgstr "" " -i, --inherit rollen ärver rättigheter från roller den\n" " är medlem i (standard)\n" -#: createuser.c:357 +#: createuser.c:356 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit rollen ärver inga rättigheter\n" -#: createuser.c:358 +#: createuser.c:357 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login rollen kan logga in (standard)\n" -#: createuser.c:359 +#: createuser.c:358 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login rollen kan inte logga in\n" -#: createuser.c:360 +#: createuser.c:359 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt tilldela den nya rollen ett lösenord\n" -#: createuser.c:361 +#: createuser.c:360 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole rollen kan skapa nya roller\n" -#: createuser.c:362 +#: createuser.c:361 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole rollen kan inte skapa roller (standard)\n" -#: createuser.c:363 +#: createuser.c:362 #, c-format msgid " -s, --superuser role will be superuser\n" -msgstr " -s, --superuser rollen blir en superanvändare\n" +msgstr " -s, --superuser rollen blir en superuser\n" -#: createuser.c:364 +#: createuser.c:363 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" -msgstr " -S, --no-superuser rollen blir inte superanvändare (standard)\n" +msgstr " -S, --no-superuser rollen blir inte superuser (standard)\n" -#: createuser.c:366 +#: createuser.c:365 #, c-format msgid "" " --interactive prompt for missing role name and attributes rather\n" @@ -597,41 +624,41 @@ msgstr "" " --interactive fråga efter rollnamn och egenskaper, snarare än\n" " att falla tillbaka på förval\n" -#: createuser.c:368 +#: createuser.c:367 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication rollen kan starta replikering\n" -#: createuser.c:369 +#: createuser.c:368 #, c-format msgid " --no-replication role cannot initiate replication\n" msgstr " --no-replication rollen får inte starta replikering\n" -#: createuser.c:374 +#: createuser.c:373 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som (ej den som skapas)\n" -#: dropdb.c:109 +#: dropdb.c:112 #, c-format msgid "missing required argument database name" msgstr "saknar nödvändigt databasnamn" -#: dropdb.c:124 +#: dropdb.c:127 #, c-format msgid "Database \"%s\" will be permanently removed.\n" msgstr "Databasen \"%s\" kommer att tas bort permanent.\n" -#: dropdb.c:125 dropuser.c:130 +#: dropdb.c:128 dropuser.c:131 msgid "Are you sure?" msgstr "Är du säker?" -#: dropdb.c:149 +#: dropdb.c:157 #, c-format msgid "database removal failed: %s" msgstr "borttagning av databas misslyckades: %s" -#: dropdb.c:163 +#: dropdb.c:171 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -640,53 +667,53 @@ msgstr "" "%s tar bort en PostgreSQL-databas.\n" "\n" -#: dropdb.c:165 +#: dropdb.c:173 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [FLAGGA]... DBNAMN\n" -#: dropdb.c:168 +#: dropdb.c:176 #, c-format msgid " -f, --force try to terminate other connections before dropping\n" msgstr " -f, --force försöka stänga andra uppkopplingar innan radering\n" -#: dropdb.c:169 +#: dropdb.c:177 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr " -i, --interactive fråga innan något tas bort\n" -#: dropdb.c:171 +#: dropdb.c:179 #, c-format msgid " --if-exists don't report error if database doesn't exist\n" msgstr " --if-exists felrapportera ej om databasen saknas\n" -#: dropuser.c:115 +#: dropuser.c:118 msgid "Enter name of role to drop: " msgstr "Mata inn namnet på den roll som skall tas bort: " -#: dropuser.c:121 +#: dropuser.c:122 #, c-format msgid "missing required argument role name" msgstr "saknar ett nödvändigt rollnamn" -#: dropuser.c:129 +#: dropuser.c:130 #, c-format msgid "Role \"%s\" will be permanently removed.\n" msgstr "Rollen \"%s\" kommer att tas bort permanent.\n" -#: dropuser.c:147 +#: dropuser.c:154 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "borttagning av rollen \"%s\" misslyckades: %s" -#: dropuser.c:162 +#: dropuser.c:169 #, c-format msgid "" "%s removes a PostgreSQL role.\n" "\n" msgstr "%s tar bort en PostgreSQL-roll.\n" -#: dropuser.c:167 +#: dropuser.c:174 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -695,52 +722,47 @@ msgstr "" " -i, --interactive fråga innan något tas bort och fråga efter\n" " rollnamn om sådant saknas\n" -#: dropuser.c:170 +#: dropuser.c:177 #, c-format msgid " --if-exists don't report error if user doesn't exist\n" msgstr " --if-exists felrapportera ej om användaren saknas\n" -#: dropuser.c:175 +#: dropuser.c:182 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n" msgstr " -U, --username=ANVÄNDARE användare som ansluter (inte den som tas bort)\n" -#: pg_isready.c:144 -#, c-format -msgid "%s" -msgstr "%s" - -#: pg_isready.c:152 +#: pg_isready.c:154 #, c-format msgid "could not fetch default options" msgstr "kunde inte hämta förvalda värde." -#: pg_isready.c:201 +#: pg_isready.c:203 #, c-format msgid "accepting connections\n" msgstr "accepterar anslutningar\n" -#: pg_isready.c:204 +#: pg_isready.c:206 #, c-format msgid "rejecting connections\n" msgstr "vägrar anslutningar\n" -#: pg_isready.c:207 +#: pg_isready.c:209 #, c-format msgid "no response\n" msgstr "inget svar\n" -#: pg_isready.c:210 +#: pg_isready.c:212 #, c-format msgid "no attempt\n" msgstr "inget försök\n" -#: pg_isready.c:213 +#: pg_isready.c:215 #, c-format msgid "unknown\n" msgstr "okänt\n" -#: pg_isready.c:223 +#: pg_isready.c:225 #, c-format msgid "" "%s issues a connection check to a PostgreSQL database.\n" @@ -749,72 +771,67 @@ msgstr "" "%s utför en anslutningskontroll mot en PostgreSQL-databas.\n" "\n" -#: pg_isready.c:225 +#: pg_isready.c:227 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [FLAGGA]...\n" -#: pg_isready.c:228 +#: pg_isready.c:230 #, c-format msgid " -d, --dbname=DBNAME database name\n" msgstr " -d, --dbname=DBNAMN databasens namn\n" -#: pg_isready.c:229 +#: pg_isready.c:231 #, c-format msgid " -q, --quiet run quietly\n" msgstr " -q, --quiet tyst körning\n" -#: pg_isready.c:230 +#: pg_isready.c:232 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_isready.c:231 +#: pg_isready.c:233 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: pg_isready.c:234 +#: pg_isready.c:236 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n" -#: pg_isready.c:235 +#: pg_isready.c:237 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT databasserverns port\n" -#: pg_isready.c:236 +#: pg_isready.c:238 #, c-format msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n" msgstr " -t, --timeout=SEK sekunder att vänta på anslutning; 0 stänger av (förval: %s)\n" -#: pg_isready.c:237 +#: pg_isready.c:239 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n" -#: reindexdb.c:154 vacuumdb.c:186 -#, c-format -msgid "number of parallel jobs must be at least 1" -msgstr "antalet parallella jobb måste vara minst 1" - -#: reindexdb.c:197 +#: reindexdb.c:209 #, c-format msgid "cannot reindex all databases and a specific one at the same time" msgstr "kan inte omindexera alla databaser och samtidigt en specifik databas" -#: reindexdb.c:202 +#: reindexdb.c:211 #, c-format msgid "cannot reindex all databases and system catalogs at the same time" msgstr "kan inte omindexera alla databaser samtidigt med systemkatalogerna" -#: reindexdb.c:207 +#: reindexdb.c:213 #, c-format msgid "cannot reindex specific schema(s) in all databases" msgstr "kan inte omindexera angivna scheman i alla databaser" -#: reindexdb.c:212 +#: reindexdb.c:215 #, c-format msgid "cannot reindex specific table(s) in all databases" msgstr "Kan inte indexera specifik tabell i alla databaser" @@ -824,73 +841,74 @@ msgstr "Kan inte indexera specifik tabell i alla databaser" msgid "cannot reindex specific index(es) in all databases" msgstr "Kan inte omindexera angivet index i alla databaser" -#: reindexdb.c:229 +#: reindexdb.c:227 #, c-format msgid "cannot reindex specific schema(s) and system catalogs at the same time" msgstr "kan inte omindexera angivna scheman och systemkataloger på samma gång" -#: reindexdb.c:234 +#: reindexdb.c:229 #, c-format msgid "cannot reindex specific table(s) and system catalogs at the same time" msgstr "kan inte omindexera specifik tabell och systemkatalogerna samtidigt" -#: reindexdb.c:239 +#: reindexdb.c:231 #, c-format msgid "cannot reindex specific index(es) and system catalogs at the same time" msgstr "kan inte omindexera angivna index och systemkatalogerna samtidigt." -#: reindexdb.c:245 +#: reindexdb.c:234 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "kan inte använda multipla jobb för att omindexera systemkataloger" -#: reindexdb.c:272 +#: reindexdb.c:260 #, c-format msgid "cannot use multiple jobs to reindex indexes" msgstr "kan inte använda multipla jobb för att omindexera index" -#: reindexdb.c:337 vacuumdb.c:410 vacuumdb.c:418 vacuumdb.c:425 vacuumdb.c:432 -#: vacuumdb.c:439 +#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439 +#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469 +#: vacuumdb.c:473 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "flaggan \"%s\" kan inte användas på serverversioner äldre än PostgreSQL %s" -#: reindexdb.c:377 +#: reindexdb.c:369 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "kan inte omindexera systemkataloger parallellt, hoppar över alla" -#: reindexdb.c:558 +#: reindexdb.c:573 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "omindexering av databasen \"%s\" misslyckades: %s" -#: reindexdb.c:562 +#: reindexdb.c:577 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "omindexering av index \"%s\" i databasen \"%s\" misslyckades: %s" -#: reindexdb.c:566 +#: reindexdb.c:581 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "omindexering av schemat \"%s\" i databasen \"%s\" misslyckades: %s" -#: reindexdb.c:570 +#: reindexdb.c:585 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "omindexering av systemkataloger i databasen \"%s\" misslyckades: %s" -#: reindexdb.c:574 +#: reindexdb.c:589 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "omindexering av tabell \"%s\" i databasen \"%s\" misslyckades: %s" -#: reindexdb.c:731 +#: reindexdb.c:742 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: omindexering av databasen \"%s\"\n" -#: reindexdb.c:752 +#: reindexdb.c:759 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -899,128 +917,131 @@ msgstr "" "%s indexerar om en PostgreSQL-databas.\n" "\n" -#: reindexdb.c:756 +#: reindexdb.c:763 #, c-format -msgid " -a, --all reindex all databases\n" -msgstr " -a, --all indexera om alla databaser\n" +msgid " -a, --all reindex all databases\n" +msgstr " -a, --all indexera om alla databaser\n" -#: reindexdb.c:757 +#: reindexdb.c:764 #, c-format -msgid " --concurrently reindex concurrently\n" -msgstr " --concurrently indexer om utan att låsa\n" +msgid " --concurrently reindex concurrently\n" +msgstr " --concurrently indexera om utan att låsa\n" -#: reindexdb.c:758 +#: reindexdb.c:765 #, c-format -msgid " -d, --dbname=DBNAME database to reindex\n" -msgstr " -d, --dbname=DBNAME databas att indexera om\n" +msgid " -d, --dbname=DBNAME database to reindex\n" +msgstr " -d, --dbname=DBNAME databas att indexera om\n" -#: reindexdb.c:760 +#: reindexdb.c:767 #, c-format -msgid " -i, --index=INDEX recreate specific index(es) only\n" -msgstr " -i, --index=INDEX återskapa enbart angivna index\n" +msgid " -i, --index=INDEX recreate specific index(es) only\n" +msgstr " -i, --index=INDEX återskapa enbart angivna index\n" -#: reindexdb.c:761 +#: reindexdb.c:768 #, c-format -msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" -msgstr " -j, --jobs=NUM använd så här många samtida anslutningar för omindexering\n" +msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" +msgstr "" +" -j, --jobs=NUM använd så här många samtida anslutningar\n" +" för omindexering\n" -#: reindexdb.c:763 +#: reindexdb.c:769 #, c-format -msgid " -s, --system reindex system catalogs\n" -msgstr " -s, --system indexera om systemkatalogerna\n" +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet skriv inte ut några meddelanden\n" -#: reindexdb.c:764 +#: reindexdb.c:770 #, c-format -msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" -msgstr " -S, --schema=SCHEMA indexera enbart om angivna scheman\n" +msgid " -s, --system reindex system catalogs only\n" +msgstr " -s, --system indexera enbart om systemkataloger\n" -#: reindexdb.c:765 +#: reindexdb.c:771 #, c-format -msgid " -t, --table=TABLE reindex specific table(s) only\n" -msgstr " -t, --table=TABELL indexera endast om angivna tabeller\n" - -#: reindexdb.c:776 -#, c-format -msgid "" -"\n" -"Read the description of the SQL command REINDEX for details.\n" -msgstr "" -"\n" -"Läs beskrivningen av SQL-kommandot REINDEX för detaljer.\n" +msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" +msgstr " -S, --schema=SCHEMA indexera enbart om angivna scheman\n" -#: scripts_parallel.c:234 +#: reindexdb.c:772 #, c-format -msgid "too many jobs for this platform -- try %d" -msgstr "för många jobb för denna plattform -- försök med %d" +msgid " -t, --table=TABLE reindex specific table(s) only\n" +msgstr " -t, --table=TABELL indexera enbart om angivna tabeller\n" -#: vacuumdb.c:194 +#: reindexdb.c:773 #, c-format -msgid "parallel vacuum degree must be a non-negative integer" -msgstr "parallell städningsnivå måste vara ett ickenegativt heltal" +msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" +msgstr " --tablespace=TABELLRYMD tabellutrymme där index byggs om\n" -#: vacuumdb.c:214 +#: reindexdb.c:774 #, c-format -msgid "minimum transaction ID age must be at least 1" -msgstr "minimal transaktions-ID-ålder måste vara minst 1" +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose skriv massor med utdata\n" -#: vacuumdb.c:222 +#: reindexdb.c:784 #, c-format -msgid "minimum multixact ID age must be at least 1" -msgstr "minimal multixact-ID-ålder måste vara minst 1" +msgid "" +"\n" +"Read the description of the SQL command REINDEX for details.\n" +msgstr "" +"\n" +"Läs beskrivningen av SQL-kommandot REINDEX för detaljer.\n" -#: vacuumdb.c:254 vacuumdb.c:260 vacuumdb.c:266 vacuumdb.c:278 +#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279 +#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "flaggan \"%s\" kan inte användas vid enbart analys" -#: vacuumdb.c:284 +#: vacuumdb.c:297 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "flaggan \"%s\" kan inte användas vid \"full vacuum\"" -#: vacuumdb.c:300 +#: vacuumdb.c:303 +#, c-format +msgid "cannot use the \"%s\" option with the \"%s\" option" +msgstr "flaggan \"%s\" kan inte användas tillsammans med flaggan \"%s\"" + +#: vacuumdb.c:322 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "kan inte städa alla databaser och endast en angiven på samma gång" -#: vacuumdb.c:305 +#: vacuumdb.c:324 #, c-format msgid "cannot vacuum specific table(s) in all databases" msgstr "kan inte städa en specifik tabell i alla databaser." -#: vacuumdb.c:396 +#: vacuumdb.c:412 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Skapar minimal optimeringsstatistik (1 mål)" -#: vacuumdb.c:397 +#: vacuumdb.c:413 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Skapar medium optimeringsstatistik (10 mål)" -#: vacuumdb.c:398 +#: vacuumdb.c:414 msgid "Generating default (full) optimizer statistics" msgstr "Skapar förvald (full) optimeringsstatistik" -#: vacuumdb.c:447 +#: vacuumdb.c:479 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: processar databasen \"%s\": %s\n" -#: vacuumdb.c:450 +#: vacuumdb.c:482 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: städar databasen \"%s\".\n" -#: vacuumdb.c:909 +#: vacuumdb.c:952 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "städning av tabell \"%s\" i databasen \"%s\" misslyckades: %s" -#: vacuumdb.c:912 +#: vacuumdb.c:955 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "städning av databasen \"%s\" misslyckades: %s" -#: vacuumdb.c:920 +#: vacuumdb.c:963 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1029,92 +1050,114 @@ msgstr "" "%s städar och analyserar en PostgreSQL-databas.\n" "\n" -#: vacuumdb.c:924 +#: vacuumdb.c:967 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all städa i alla databaser\n" -#: vacuumdb.c:925 +#: vacuumdb.c:968 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=DBNAMN databas att städa i\n" -#: vacuumdb.c:926 +#: vacuumdb.c:969 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping stäng av alla sidöverhoppande beteeenden\n" -#: vacuumdb.c:927 +#: vacuumdb.c:970 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo visa kommandon som skickas till servern\n" -#: vacuumdb.c:928 +#: vacuumdb.c:971 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full utför full städning\n" -#: vacuumdb.c:929 +#: vacuumdb.c:972 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze frys information om radtransaktioner\n" -#: vacuumdb.c:930 +#: vacuumdb.c:973 +#, c-format +msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" +msgstr " --force-index-cleanup ta alltid bort indexposter som pekar på döda tupler\n" + +#: vacuumdb.c:974 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr " -j, --jobs=NUM använd så här många samtida anslutningar för städning\n" -#: vacuumdb.c:931 +#: vacuumdb.c:975 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr " --min-mxid-age=MXID_ÅLDER minimal multixact-ID-ålder i tabeller som skall städas\n" -#: vacuumdb.c:932 +#: vacuumdb.c:976 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr " --min-xid-age=XID_ÅLDER minimal transaktions-ID-ålder i tabeller som skall städas\n" -#: vacuumdb.c:933 +#: vacuumdb.c:977 +#, c-format +msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" +msgstr " --no-index-cleanup ta inte bort indexposter som pekar på döda tupler\n" + +#: vacuumdb.c:978 +#, c-format +msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" +msgstr " --no-process-toast hoppa över TOAST-tabellen som hör ihop med tabellen som städas\n" + +#: vacuumdb.c:979 +#, c-format +msgid " --no-truncate don't truncate empty pages at the end of the table\n" +msgstr " --no-truncate trunkera inte tomma sidor i slutet av tabellen\n" + +#: vacuumdb.c:980 #, c-format -msgid " -P, --parallel=PARALLEL_DEGREE use this many background workers for vacuum, if available\n" -msgstr " -P, --parallel=PARALLELLNIVÅ använda så här många bakgrundsarbetare för städning, om det finns\n" +msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" +msgstr "" +" -P, --parallel=PARALLELLA_ARBETARE\n" +" använda så här många bakgrundsarbetare för städning, om det finns\n" -#: vacuumdb.c:934 +#: vacuumdb.c:981 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet skriv inte ut några meddelanden\n" -#: vacuumdb.c:935 +#: vacuumdb.c:982 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr " --skip-locked hoppa äver relationer som inte kan låsas direkt\n" -#: vacuumdb.c:936 +#: vacuumdb.c:983 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr " -t, --table='TABELL[(KOLUMNER)]' städa enbart i dessa tabeller\n" -#: vacuumdb.c:937 +#: vacuumdb.c:984 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose skriv massor med utdata\n" -#: vacuumdb.c:938 +#: vacuumdb.c:985 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: vacuumdb.c:939 +#: vacuumdb.c:986 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze uppdatera optimeringsstatistik\n" -#: vacuumdb.c:940 +#: vacuumdb.c:987 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr " -Z, --analyze-only uppdatera bara optimeringsstatistik; ingen städning\n" -#: vacuumdb.c:941 +#: vacuumdb.c:988 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1123,12 +1166,12 @@ msgstr "" " --analyze-in-stages uppdatera bara optimeringsstatistik, men i\n" " flera steg för snabbare resultat; ingen städning\n" -#: vacuumdb.c:943 +#: vacuumdb.c:990 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: vacuumdb.c:951 +#: vacuumdb.c:998 #, c-format msgid "" "\n" diff --git a/src/bin/scripts/po/tr.po b/src/bin/scripts/po/tr.po index f815827916..0565244e4a 100644 --- a/src/bin/scripts/po/tr.po +++ b/src/bin/scripts/po/tr.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pgscripts-tr\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2019-04-26 13:47+0000\n" -"PO-Revision-Date: 2019-06-13 14:10+0300\n" +"PO-Revision-Date: 2021-09-16 09:36+0200\n" "Last-Translator: Abdullah G. GüLNER\n" "Language-Team: Turkish \n" "Language: tr\n" @@ -179,7 +179,7 @@ msgstr " -q, --quiet hiçbir ileti yazma\n" #: clusterdb.c:281 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" -msgstr " -t, --table=TABLO_ADI sadece belirli (bir) tabloyu/tabloları cluster eder\n" +msgstr " -t, --table=TABLO_ADI sadece belirli (bir) tabloyu/tabloları cluster eder\n" #: clusterdb.c:282 reindexdb.c:437 #, c-format @@ -238,7 +238,7 @@ msgstr " -W, --password parola sorulmasını sağla\n" #: clusterdb.c:291 dropdb.c:171 reindexdb.c:446 vacuumdb.c:1241 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" -msgstr " --maintenance-db=VTADI alternatif bakım veritabanı\n" +msgstr " --maintenance-db=VTADI alternatif bakım veritabanı\n" #: clusterdb.c:292 #, c-format @@ -379,12 +379,12 @@ msgstr " -E, --encoding=ENCODING veritabanı için dil kodlaması\n" #: createdb.c:256 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" -msgstr " -l, --locale=LOCALE veritabanı için yerel ayarları\n" +msgstr " -l, --locale=LOCALE veritabanı için yerel ayarları\n" #: createdb.c:257 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" -msgstr " --lc-collate=LOCALE Veritabanı için LC_COLLATE ayarı\n" +msgstr " --lc-collate=LOCALE Veritabanı için LC_COLLATE ayarı\n" #: createdb.c:258 #, c-format @@ -424,7 +424,7 @@ msgstr " -p, --port=PORT veritabanı sunucu portu\n" #: createdb.c:266 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" -msgstr " -U, --username=KULLANICI_ADI bağlanılacak kullanıcı adı\n" +msgstr " -U, --username=KULLANICI_ADI bağlanılacak kullanıcı adı\n" #: createdb.c:267 #, c-format @@ -521,7 +521,7 @@ msgstr " -D, --no-createdb rol veritabanı oluşturamaz (varsayılan)\n #: createuser.c:351 #, c-format msgid " -g, --role=ROLE new role will be a member of this role\n" -msgstr " -g, --role=ROL yeni rol bu rolün üyesi olacaktır\n" +msgstr " -g, --role=ROL yeni rol bu rolün üyesi olacaktır\n" #: createuser.c:352 #, c-format @@ -530,8 +530,7 @@ msgid "" " member of (default)\n" msgstr "" " -i, --inherit rol, üye olduğu rollerin yetkilerini \n" -" miras alır (varsayılan)\n" -"\n" +" miras alır (varsayılan)\n" #: createuser.c:354 #, c-format @@ -675,7 +674,7 @@ msgid "" " role name if not specified\n" msgstr "" " -i, --interactive herhangi birşeyi silmeden önce uyarı ver, ve\n" -" belirtilmemişse rol adının girilmesini iste\n" +" belirtilmemişse rol adının girilmesini iste\n" #: dropuser.c:170 #, c-format diff --git a/src/bin/scripts/po/uk.po b/src/bin/scripts/po/uk.po index 8787c2780c..10a400a203 100644 --- a/src/bin/scripts/po/uk.po +++ b/src/bin/scripts/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:16+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" +"POT-Creation-Date: 2021-08-17 08:47+0000\n" +"PO-Revision-Date: 2021-08-17 11:21\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,20 +14,20 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/pgscripts.pot\n" -"X-Crowdin-File-ID: 514\n" +"X-Crowdin-File: /REL_14_DEV/pgscripts.pot\n" +"X-Crowdin-File-ID: 784\n" -#: ../../../src/common/logging.c:236 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "збій: " -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "помилка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "попередження: " @@ -61,16 +61,35 @@ msgstr "невдала підстановка імені користувача: msgid "Cancel request sent\n" msgstr "Запит на скасування відправлений\n" -#: ../../fe_utils/cancel.c:165 +#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 msgid "Could not send cancel request: " -msgstr "не вдалося надіслати запит на скасування: " +msgstr "Не вдалося надіслати запит на скасування: " -#: ../../fe_utils/cancel.c:210 +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:107 +msgid "Password: " +msgstr "Пароль: " + +#: ../../fe_utils/connect_utils.c:92 +#, c-format +msgid "could not connect to database %s: out of memory" +msgstr "не можливо під'єднатися до бази даних %s: не вистачає пам'яті" + +#: ../../fe_utils/connect_utils.c:120 pg_isready.c:145 +#, c-format +msgid "%s" +msgstr "%s" + +#: ../../fe_utils/parallel_slot.c:302 +#, c-format +msgid "too many jobs for this platform" +msgstr "занадто багато завдань для цієї платформи" + +#: ../../fe_utils/parallel_slot.c:522 #, c-format -msgid "Could not send cancel request: %s" -msgstr "Не вдалося надіслати скасування запиту: %s" +msgid "processing of database \"%s\" failed: %s" +msgstr "обробка бази даних \"%s\" не вдалась: %s" -#: ../../fe_utils/print.c:350 +#: ../../fe_utils/print.c:336 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" @@ -79,222 +98,199 @@ msgstr[1] "(%lu рядки)" msgstr[2] "(%lu рядків)" msgstr[3] "(%lu рядка)" -#: ../../fe_utils/print.c:3055 +#: ../../fe_utils/print.c:3039 #, c-format msgid "Interrupted\n" msgstr "Перервано\n" -#: ../../fe_utils/print.c:3119 +#: ../../fe_utils/print.c:3103 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Неможливо додати заголовок до вмісту таблиці: кількість колонок %d перевищено.\n" -#: ../../fe_utils/print.c:3159 +#: ../../fe_utils/print.c:3143 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "Неможливо додати комірку до вмісту таблиці: перевищено загальну кількість комірок %d.\n" -#: ../../fe_utils/print.c:3414 +#: ../../fe_utils/print.c:3401 #, c-format msgid "invalid output format (internal error): %d" msgstr "невірний формат виводу (внутрішня помилка): %d" -#: clusterdb.c:114 clusterdb.c:133 createdb.c:121 createdb.c:140 -#: createuser.c:171 createuser.c:186 dropdb.c:101 dropdb.c:110 dropdb.c:118 -#: dropuser.c:92 dropuser.c:107 dropuser.c:122 pg_isready.c:95 pg_isready.c:109 -#: reindexdb.c:168 reindexdb.c:187 vacuumdb.c:227 vacuumdb.c:246 +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 +#, c-format +msgid "query failed: %s" +msgstr "запит не вдався: %s" + +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#, c-format +msgid "query was: %s" +msgstr "запит був: %s" + +#: clusterdb.c:112 clusterdb.c:131 createdb.c:123 createdb.c:142 +#: createuser.c:172 createuser.c:187 dropdb.c:103 dropdb.c:112 dropdb.c:120 +#: dropuser.c:94 dropuser.c:109 dropuser.c:122 pg_isready.c:96 pg_isready.c:110 +#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:251 vacuumdb.c:270 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" для отримання додаткової інформації.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" -#: clusterdb.c:131 createdb.c:138 createuser.c:184 dropdb.c:116 dropuser.c:105 -#: pg_isready.c:107 reindexdb.c:185 vacuumdb.c:244 +#: clusterdb.c:129 createdb.c:140 createuser.c:185 dropdb.c:118 dropuser.c:107 +#: pg_isready.c:108 reindexdb.c:191 vacuumdb.c:268 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному рядку (перший \"%s\")" -#: clusterdb.c:143 +#: clusterdb.c:148 #, c-format msgid "cannot cluster all databases and a specific one at the same time" msgstr "неможливо кластеризувати всі бази даних і одну вказану одночасно" -#: clusterdb.c:149 +#: clusterdb.c:154 #, c-format msgid "cannot cluster specific table(s) in all databases" msgstr "неможливо кластеризувати вказані таблиці у всіх базах даних" -#: clusterdb.c:217 +#: clusterdb.c:220 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "кластеризувати таблицю \"%s\" у базі даних \"%s\" не вдалося: %s" -#: clusterdb.c:220 +#: clusterdb.c:223 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "кластеризувати базу даних \"%s\" не вдалося: %s" -#: clusterdb.c:253 +#: clusterdb.c:251 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: кластеризація бази даних \"%s\"\n" -#: clusterdb.c:274 +#: clusterdb.c:267 #, c-format msgid "%s clusters all previously clustered tables in a database.\n\n" msgstr "%s кластеризація усіх попередньо кластеризованих таблиць в базі даних.\n\n" -#: clusterdb.c:275 createdb.c:259 createuser.c:347 dropdb.c:164 dropuser.c:163 -#: pg_isready.c:224 reindexdb.c:753 vacuumdb.c:921 +#: clusterdb.c:268 createdb.c:267 createuser.c:351 dropdb.c:171 dropuser.c:169 +#: pg_isready.c:225 reindexdb.c:792 vacuumdb.c:1025 #, c-format msgid "Usage:\n" msgstr "Використання:\n" -#: clusterdb.c:276 reindexdb.c:754 vacuumdb.c:922 +#: clusterdb.c:269 reindexdb.c:793 vacuumdb.c:1026 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: clusterdb.c:277 createdb.c:261 createuser.c:349 dropdb.c:166 dropuser.c:165 -#: pg_isready.c:227 reindexdb.c:755 vacuumdb.c:923 +#: clusterdb.c:270 createdb.c:269 createuser.c:353 dropdb.c:173 dropuser.c:171 +#: pg_isready.c:228 reindexdb.c:794 vacuumdb.c:1027 #, c-format msgid "\n" "Options:\n" msgstr "\n" "Параметри:\n" -#: clusterdb.c:278 +#: clusterdb.c:271 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all кластеризація усіх баз даних\n" -#: clusterdb.c:279 +#: clusterdb.c:272 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=ІМ'Я_БД база даних для кластеризації\n" -#: clusterdb.c:280 createuser.c:353 dropdb.c:167 dropuser.c:166 reindexdb.c:759 +#: clusterdb.c:273 createuser.c:357 dropdb.c:174 dropuser.c:172 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo показати команди, надіслані серверу\n" -#: clusterdb.c:281 reindexdb.c:762 +#: clusterdb.c:274 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не виводити жодних повідомлень\n" -#: clusterdb.c:282 +#: clusterdb.c:275 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=ТАБЛИЦЯ кластеризувати тільки вказані таблиці\n" -#: clusterdb.c:283 reindexdb.c:766 +#: clusterdb.c:276 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose виводити багато інформації\n" -#: clusterdb.c:284 createuser.c:365 dropdb.c:170 dropuser.c:169 reindexdb.c:767 +#: clusterdb.c:277 createuser.c:369 dropdb.c:177 dropuser.c:175 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію і вийти\n" -#: clusterdb.c:285 createuser.c:370 dropdb.c:172 dropuser.c:171 reindexdb.c:768 +#: clusterdb.c:278 createuser.c:374 dropdb.c:179 dropuser.c:177 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: clusterdb.c:286 createdb.c:272 createuser.c:371 dropdb.c:173 dropuser.c:172 -#: pg_isready.c:233 reindexdb.c:769 vacuumdb.c:944 +#: clusterdb.c:279 createdb.c:280 createuser.c:375 dropdb.c:180 dropuser.c:178 +#: pg_isready.c:234 reindexdb.c:809 vacuumdb.c:1052 #, c-format msgid "\n" "Connection options:\n" msgstr "\n" "Налаштування з'єднання:\n" -#: clusterdb.c:287 createuser.c:372 dropdb.c:174 dropuser.c:173 reindexdb.c:770 -#: vacuumdb.c:945 +#: clusterdb.c:280 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1053 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME хост сервера бази даних або каталог сокетів\n" -#: clusterdb.c:288 createuser.c:373 dropdb.c:175 dropuser.c:174 reindexdb.c:771 -#: vacuumdb.c:946 +#: clusterdb.c:281 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT порт сервера бази даних\n" -#: clusterdb.c:289 dropdb.c:176 reindexdb.c:772 vacuumdb.c:947 +#: clusterdb.c:282 dropdb.c:183 vacuumdb.c:1055 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=ІМ'Я_КОРИСТУВАЧА ім'я користувача для з'єднання з сервером\n" -#: clusterdb.c:290 createuser.c:375 dropdb.c:177 dropuser.c:176 reindexdb.c:773 -#: vacuumdb.c:948 +#: clusterdb.c:283 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1056 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ніколи не запитувати пароль\n" -#: clusterdb.c:291 createuser.c:376 dropdb.c:178 dropuser.c:177 reindexdb.c:774 -#: vacuumdb.c:949 +#: clusterdb.c:284 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password запросити пароль\n" -#: clusterdb.c:292 dropdb.c:179 reindexdb.c:775 vacuumdb.c:950 +#: clusterdb.c:285 dropdb.c:186 vacuumdb.c:1058 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME альтернативна бази даних для обслуговування\n" -#: clusterdb.c:293 +#: clusterdb.c:286 #, c-format msgid "\n" "Read the description of the SQL command CLUSTER for details.\n" msgstr "\n" "Для деталей читайте опис команди SQL CLUSTER.\n" -#: clusterdb.c:294 createdb.c:280 createuser.c:377 dropdb.c:180 dropuser.c:178 -#: pg_isready.c:238 reindexdb.c:777 vacuumdb.c:952 +#: clusterdb.c:287 createdb.c:288 createuser.c:381 dropdb.c:187 dropuser.c:184 +#: pg_isready.c:239 reindexdb.c:817 vacuumdb.c:1060 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "Повідомляти про помилки на <%s>.\n" -#: clusterdb.c:295 createdb.c:281 createuser.c:378 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:239 reindexdb.c:778 vacuumdb.c:953 +#: clusterdb.c:288 createdb.c:289 createuser.c:382 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:818 vacuumdb.c:1061 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" -#: common.c:79 common.c:125 -msgid "Password: " -msgstr "Пароль: " - -#: common.c:112 -#, c-format -msgid "could not connect to database %s: out of memory" -msgstr "не можливо під'єднатися до бази даних %s: не вистачає пам'яті" - -#: common.c:139 -#, c-format -msgid "could not connect to database %s: %s" -msgstr "не можливо під'єднатися до бази даних %s: %s" - -#: common.c:214 common.c:239 -#, c-format -msgid "query failed: %s" -msgstr "запит не вдався: %s" - -#: common.c:215 common.c:240 -#, c-format -msgid "query was: %s" -msgstr "запит був: %s" - -#: common.c:312 -#, c-format -msgid "processing of database \"%s\" failed: %s" -msgstr "обробка бази даних \"%s\" не вдалась: %s" - -#: common.c:406 +#: common.c:107 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" @@ -304,336 +300,336 @@ msgstr[2] "запит повернув %d рядків замість одног msgstr[3] "запит повернув %d рядків замість одного: %s" #. translator: abbreviation for "yes" -#: common.c:430 +#: common.c:131 msgid "y" msgstr "y" #. translator: abbreviation for "no" -#: common.c:432 +#: common.c:133 msgid "n" msgstr "n" #. translator: This is a question followed by the translated options for #. "yes" and "no". -#: common.c:442 +#: common.c:143 #, c-format msgid "%s (%s/%s) " msgstr "%s (%s/%s) " -#: common.c:456 +#: common.c:164 #, c-format msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Відповідь має бути \"%s\" або \"%s\".\n" -#: createdb.c:148 +#: createdb.c:150 #, c-format msgid "only one of --locale and --lc-ctype can be specified" msgstr "тільки --locale або --lc-ctype може бути вказаний" -#: createdb.c:153 +#: createdb.c:155 #, c-format msgid "only one of --locale and --lc-collate can be specified" msgstr "можна вказати лише одне: або --locale, або --lc-collate" -#: createdb.c:164 +#: createdb.c:166 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" не є невірним ім'ям кодування" -#: createdb.c:221 +#: createdb.c:229 #, c-format msgid "database creation failed: %s" msgstr "створити базу даних не вдалося: %s" -#: createdb.c:240 +#: createdb.c:248 #, c-format msgid "comment creation failed (database was created): %s" msgstr "не вдалося створити коментарі (база даних була створена): %s" -#: createdb.c:258 +#: createdb.c:266 #, c-format msgid "%s creates a PostgreSQL database.\n\n" msgstr "%s створює базу даних PostgreSQL.\n\n" -#: createdb.c:260 +#: createdb.c:268 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" -#: createdb.c:262 +#: createdb.c:270 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=ТАБЛИЧНИЙ_ПРОСТІР табличний простір для бази даних за замовчуванням\n" -#: createdb.c:263 +#: createdb.c:271 reindexdb.c:798 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo показати команди, надіслані серверу\n" -#: createdb.c:264 +#: createdb.c:272 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=КОДУВАННЯ кодування бази даних\n" -#: createdb.c:265 +#: createdb.c:273 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=ЛОКАЛЬ параметри локалі бази даних\n" -#: createdb.c:266 +#: createdb.c:274 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=ЛОКАЛЬ параметр LC_COLLATE для бази даних\n" -#: createdb.c:267 +#: createdb.c:275 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=ЛОКАЛЬ параметр LC_CTYPE для бази даних\n" -#: createdb.c:268 +#: createdb.c:276 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --власник=ВЛАСНИК користувач-власник нової бази даних\n" -#: createdb.c:269 +#: createdb.c:277 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --шаблон=ШАБЛОН шаблонна база даних для копіювання\n" -#: createdb.c:270 +#: createdb.c:278 reindexdb.c:807 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію, потім вийти\n" -#: createdb.c:271 +#: createdb.c:279 reindexdb.c:808 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: createdb.c:273 +#: createdb.c:281 reindexdb.c:810 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=ІМ'Я_ХОСТА хост сервера бази даних або каталог сокетів\n" -#: createdb.c:274 +#: createdb.c:282 reindexdb.c:811 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт сервера бази даних\n" -#: createdb.c:275 +#: createdb.c:283 reindexdb.c:812 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=ІМ'Я_КОРИСТУВАЧА ім'я користувача для з'єднання з сервером\n" -#: createdb.c:276 +#: createdb.c:284 reindexdb.c:813 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ніколи не запитувати пароль\n" -#: createdb.c:277 +#: createdb.c:285 reindexdb.c:814 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password запросити пароль\n" -#: createdb.c:278 +#: createdb.c:286 reindexdb.c:815 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME альтернативна бази даних для обслуговування\n" -#: createdb.c:279 +#: createdb.c:287 #, c-format msgid "\n" "By default, a database with the same name as the current user is created.\n" msgstr "\n" "За замовчуванням ім'ям бази даних вважається ім'я поточного користувача.\n" -#: createuser.c:150 +#: createuser.c:151 #, c-format msgid "invalid value for --connection-limit: %s" msgstr "неприпустиме значення для --connection-limit: %s" -#: createuser.c:194 +#: createuser.c:195 msgid "Enter name of role to add: " msgstr "Введіть ім'я нової ролі: " -#: createuser.c:211 +#: createuser.c:210 msgid "Enter password for new role: " msgstr "Введіть пароль для нової ролі: " -#: createuser.c:213 +#: createuser.c:211 msgid "Enter it again: " msgstr "Введіть знову: " -#: createuser.c:216 +#: createuser.c:214 #, c-format msgid "Passwords didn't match.\n" msgstr "Паролі не співпадають.\n" -#: createuser.c:224 +#: createuser.c:222 msgid "Shall the new role be a superuser?" msgstr "Чи буде нова роль суперкористувачем?" -#: createuser.c:239 +#: createuser.c:237 msgid "Shall the new role be allowed to create databases?" msgstr "Чи дозволено новій ролі створювати бази даних?" -#: createuser.c:247 +#: createuser.c:245 msgid "Shall the new role be allowed to create more new roles?" msgstr "Чи дозволено новій ролі створювати інші нові ролі?" -#: createuser.c:277 +#: createuser.c:281 #, c-format msgid "password encryption failed: %s" msgstr "помилка шифрування пароля: %s" -#: createuser.c:332 +#: createuser.c:336 #, c-format msgid "creation of new role failed: %s" msgstr "не вдалося створити нову роль: %s" -#: createuser.c:346 +#: createuser.c:350 #, c-format msgid "%s creates a new PostgreSQL role.\n\n" msgstr "%s створює нову роль PostgreSQL.\n\n" -#: createuser.c:348 dropuser.c:164 +#: createuser.c:352 dropuser.c:170 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [OPTION]... [ROLENAME]\n" -#: createuser.c:350 +#: createuser.c:354 #, c-format msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" msgstr " -c, --connection-limit=N ліміт під'єднань для ролі (за замовчуванням ліміту немає)\n" -#: createuser.c:351 +#: createuser.c:355 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb роль може створювати нові бази даних\n" -#: createuser.c:352 +#: createuser.c:356 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb роль не може створювати нові бази даних (за замовчуванням)\n" -#: createuser.c:354 +#: createuser.c:358 #, c-format msgid " -g, --role=ROLE new role will be a member of this role\n" msgstr " -g, --role=РОЛЬ нова роль буде включена в цю роль\n" -#: createuser.c:355 +#: createuser.c:359 #, c-format msgid " -i, --inherit role inherits privileges of roles it is a\n" " member of (default)\n" msgstr " -i, --inherit роль переймає права від ролей до яких вона\n" " включена (за замовчуванням)\n" -#: createuser.c:357 +#: createuser.c:361 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit роль не переймає права\n" -#: createuser.c:358 +#: createuser.c:362 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login роль може увійти (за замовчуванням)\n" -#: createuser.c:359 +#: createuser.c:363 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login роль не може увійти\n" -#: createuser.c:360 +#: createuser.c:364 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt призначення паролю для нової ролі\n" -#: createuser.c:361 +#: createuser.c:365 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole роль може створювати нові ролі\n" -#: createuser.c:362 +#: createuser.c:366 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole роль не може створювати нові бази даних (за замовчуванням)\n" -#: createuser.c:363 +#: createuser.c:367 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser роль буде суперкористувачем\n" -#: createuser.c:364 +#: createuser.c:368 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr " -S, --no-superuser роль не буде суперкористувачем (за замовчуванням)\n" -#: createuser.c:366 +#: createuser.c:370 #, c-format msgid " --interactive prompt for missing role name and attributes rather\n" " than using defaults\n" msgstr " --interactive запитати пропущені ім’я ролі та атрибути, а не використовувати стандартні\n" -#: createuser.c:368 +#: createuser.c:372 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication роль може ініціювати реплікацію\n" -#: createuser.c:369 +#: createuser.c:373 #, c-format msgid " --no-replication role cannot initiate replication\n" msgstr " --no-replication роль не може ініціювати реплікацію\n" -#: createuser.c:374 +#: createuser.c:378 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" msgstr " -U, --username=USERNAME ім'я користувача для підключення (не для створення)\n" -#: dropdb.c:109 +#: dropdb.c:111 #, c-format msgid "missing required argument database name" msgstr "немає запитаного аргументу: імені бази даних" -#: dropdb.c:124 +#: dropdb.c:126 #, c-format msgid "Database \"%s\" will be permanently removed.\n" msgstr "База даних \"%s\" буде назавжди видалена.\n" -#: dropdb.c:125 dropuser.c:130 +#: dropdb.c:127 dropuser.c:130 msgid "Are you sure?" msgstr "Ви впевнені?" -#: dropdb.c:149 +#: dropdb.c:156 #, c-format msgid "database removal failed: %s" msgstr "помилка при видаленні бази даних: %s" -#: dropdb.c:163 +#: dropdb.c:170 #, c-format msgid "%s removes a PostgreSQL database.\n\n" msgstr "%s видаляє базу даних PostgreSQL.\n\n" -#: dropdb.c:165 +#: dropdb.c:172 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [OPTION]... ІМ'Я_БД\n" -#: dropdb.c:168 +#: dropdb.c:175 #, c-format msgid " -f, --force try to terminate other connections before dropping\n" msgstr " -f, --force спробувати завершити інші підключення перед видаленням\n" -#: dropdb.c:169 +#: dropdb.c:176 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr " -i, --interactive запитувати перед видаленням чого-небудь\n" -#: dropdb.c:171 +#: dropdb.c:178 #, c-format msgid " --if-exists don't report error if database doesn't exist\n" msgstr " --if-exists не повідомляти про помилку, якщо бази даних не існує\n" -#: dropuser.c:115 +#: dropuser.c:117 msgid "Enter name of role to drop: " msgstr "Введіть ім'я ролі для видалення: " @@ -647,440 +643,472 @@ msgstr "немає запитаного аргументу: імені ролі" msgid "Role \"%s\" will be permanently removed.\n" msgstr "Роль \"%s\" буде назавжди видалена.\n" -#: dropuser.c:147 +#: dropuser.c:153 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "помилка при видаленні ролі \"%s\": %s" -#: dropuser.c:162 +#: dropuser.c:168 #, c-format msgid "%s removes a PostgreSQL role.\n\n" msgstr "%s видаляє роль PostgreSQL.\n\n" -#: dropuser.c:167 +#: dropuser.c:173 #, c-format msgid " -i, --interactive prompt before deleting anything, and prompt for\n" " role name if not specified\n" msgstr " -i, --interactive запитувати перед видаленням чого-небудь і запитувати\n" " ім'я ролі, якщо не вказано\n" -#: dropuser.c:170 +#: dropuser.c:176 #, c-format msgid " --if-exists don't report error if user doesn't exist\n" msgstr " --if-exists не повідомляти про помилку, якщо користувача не існує\n" -#: dropuser.c:175 +#: dropuser.c:181 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n" msgstr " -U, --username=USERNAME ім'я користувача для підключення (не для розривання)\n" -#: pg_isready.c:144 -#, c-format -msgid "%s" -msgstr "%s" - -#: pg_isready.c:152 +#: pg_isready.c:153 #, c-format msgid "could not fetch default options" msgstr "не вдалося отримати параметри за замовчуванням" -#: pg_isready.c:201 +#: pg_isready.c:202 #, c-format msgid "accepting connections\n" msgstr "отримання підключень\n" -#: pg_isready.c:204 +#: pg_isready.c:205 #, c-format msgid "rejecting connections\n" msgstr "відторгнення підключень\n" -#: pg_isready.c:207 +#: pg_isready.c:208 #, c-format msgid "no response\n" msgstr "відповіді немає\n" -#: pg_isready.c:210 +#: pg_isready.c:211 #, c-format msgid "no attempt\n" msgstr "немає спроб\n" -#: pg_isready.c:213 +#: pg_isready.c:214 #, c-format msgid "unknown\n" msgstr "невідомо\n" -#: pg_isready.c:223 +#: pg_isready.c:224 #, c-format msgid "%s issues a connection check to a PostgreSQL database.\n\n" msgstr "%s: перевірка підключення до бази даних PostgreSQL.\n\n" -#: pg_isready.c:225 +#: pg_isready.c:226 #, c-format msgid " %s [OPTION]...\n" msgstr " %s: [OPTION]...\n" -#: pg_isready.c:228 +#: pg_isready.c:229 #, c-format msgid " -d, --dbname=DBNAME database name\n" msgstr " -d, --dbname=ІМ'Я_БД ім'я бази даних\n" -#: pg_isready.c:229 +#: pg_isready.c:230 #, c-format msgid " -q, --quiet run quietly\n" msgstr " -q, --quiet тихий запуск\n" -#: pg_isready.c:230 +#: pg_isready.c:231 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію, потім вийти\n" -#: pg_isready.c:231 +#: pg_isready.c:232 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: pg_isready.c:234 +#: pg_isready.c:235 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME хост серверу баз даних або каталог сокетів\n" -#: pg_isready.c:235 +#: pg_isready.c:236 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт сервера бази даних\n" -#: pg_isready.c:236 +#: pg_isready.c:237 #, c-format msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n" msgstr " -t, --timeout=SECS секунд для очікування при спробі підключення, 0 без обмежень (за замовчуванням: %s)\n" -#: pg_isready.c:237 +#: pg_isready.c:238 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=ІМ'Я_КОРИСТУВАЧА ім'я користувача для з'єднання з сервером\n" -#: reindexdb.c:154 vacuumdb.c:186 +#: reindexdb.c:157 vacuumdb.c:198 #, c-format msgid "number of parallel jobs must be at least 1" msgstr "число паралельних завдань повинно бути не менше 1" -#: reindexdb.c:197 +#: reindexdb.c:210 #, c-format msgid "cannot reindex all databases and a specific one at the same time" msgstr "неможливо переіндексувати всі бази даних і одну вказану одночасно" -#: reindexdb.c:202 +#: reindexdb.c:215 #, c-format msgid "cannot reindex all databases and system catalogs at the same time" msgstr "не можливо переіндексувати всі бази даних і системні каталоги одночасно" -#: reindexdb.c:207 +#: reindexdb.c:220 #, c-format msgid "cannot reindex specific schema(s) in all databases" msgstr "неможливо переіндексувати вказані схеми в усіх базах даних" -#: reindexdb.c:212 +#: reindexdb.c:225 #, c-format msgid "cannot reindex specific table(s) in all databases" msgstr "неможливо переіндексувати вказані таблиці в усіх базах даних" -#: reindexdb.c:217 +#: reindexdb.c:230 #, c-format msgid "cannot reindex specific index(es) in all databases" msgstr "неможливо переіндексувати вказані індекси в усіх базах даних" -#: reindexdb.c:229 +#: reindexdb.c:243 #, c-format msgid "cannot reindex specific schema(s) and system catalogs at the same time" msgstr "не можливо переіндексувати вказані схеми і системні каталоги одночасно" -#: reindexdb.c:234 +#: reindexdb.c:248 #, c-format msgid "cannot reindex specific table(s) and system catalogs at the same time" msgstr "не можливо переіндексувати вказані таблиці і системні каталоги одночасно" -#: reindexdb.c:239 +#: reindexdb.c:253 #, c-format msgid "cannot reindex specific index(es) and system catalogs at the same time" msgstr "не можливо переіндексувати вказані індекси і системні каталоги одночасно" -#: reindexdb.c:245 +#: reindexdb.c:259 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "не можна використовувати декілька завдань для переіндексування системних каталогів" -#: reindexdb.c:272 +#: reindexdb.c:288 #, c-format msgid "cannot use multiple jobs to reindex indexes" msgstr "не можна використовувати декілька завдань для переіндексування індексів" -#: reindexdb.c:337 vacuumdb.c:410 vacuumdb.c:418 vacuumdb.c:425 vacuumdb.c:432 -#: vacuumdb.c:439 +#: reindexdb.c:353 reindexdb.c:361 vacuumdb.c:471 vacuumdb.c:479 vacuumdb.c:487 +#: vacuumdb.c:495 vacuumdb.c:503 vacuumdb.c:511 vacuumdb.c:518 vacuumdb.c:525 +#: vacuumdb.c:532 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "не можна використовувати параметр \"%s\" на серверній версії старішій за PostgreSQL %s" -#: reindexdb.c:377 +#: reindexdb.c:401 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "не можна конкурентно переіндексувати системні каталоги, пропускаємо" -#: reindexdb.c:558 +#: reindexdb.c:605 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "переіндексувати базу даних \"%s\" не вдалося: %s" -#: reindexdb.c:562 +#: reindexdb.c:609 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "переіндексувати індекси \"%s\" в базі даних \"%s\" не вдалося: %s" -#: reindexdb.c:566 +#: reindexdb.c:613 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "переіндексувати схему \"%s\" в базі даних \"%s\" не вдалося: %s" -#: reindexdb.c:570 +#: reindexdb.c:617 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "переіндексування системних каталогів в базі даних \"%s\" не вдалося: %s" -#: reindexdb.c:574 +#: reindexdb.c:621 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "переіндексувати таблиці \"%s\" в базі даних \"%s\" не вдалося: %s" -#: reindexdb.c:731 +#: reindexdb.c:774 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: переіндексування бази даних \"%s\"\n" -#: reindexdb.c:752 +#: reindexdb.c:791 #, c-format msgid "%s reindexes a PostgreSQL database.\n\n" msgstr "%s переіндексовує базу даних PostgreSQL.\n\n" -#: reindexdb.c:756 +#: reindexdb.c:795 +#, c-format +msgid " -a, --all reindex all databases\n" +msgstr " -a, --all переіндексувати всі бази даних\n" + +#: reindexdb.c:796 +#, c-format +msgid " --concurrently reindex concurrently\n" +msgstr " --concurrently переіндексувати одночасно\n" + +#: reindexdb.c:797 +#, c-format +msgid " -d, --dbname=DBNAME database to reindex\n" +msgstr " -d, --dbname=DBNAME база даних для переіндексування\n" + +#: reindexdb.c:799 #, c-format -msgid " -a, --all reindex all databases\n" -msgstr " -a, --all переіндексувати усі бази даних\n" +msgid " -i, --index=INDEX recreate specific index(es) only\n" +msgstr " -i, --index=INDEX повторно створити лише вказані індекси\n" -#: reindexdb.c:757 +#: reindexdb.c:800 #, c-format -msgid " --concurrently reindex concurrently\n" -msgstr " --concurrently переіндексувати одночасно\n" +msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" +msgstr " -j, --jobs=NUM використати цю кількість паралельних підключень для переіндексування\n" -#: reindexdb.c:758 +#: reindexdb.c:801 #, c-format -msgid " -d, --dbname=DBNAME database to reindex\n" -msgstr " -d, --dbname=ІМ'Я_БД база даних для переіндексування\n" +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet не писати жодних повідомлень\n" -#: reindexdb.c:760 +#: reindexdb.c:802 #, c-format -msgid " -i, --index=INDEX recreate specific index(es) only\n" -msgstr " -i, --index=ІНДЕКС відтворити тільки вказані індекси\n" +msgid " -s, --system reindex system catalogs\n" +msgstr " -s, --system переіндексувати системні каталоги\n" -#: reindexdb.c:761 +#: reindexdb.c:803 #, c-format -msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" -msgstr " -j, --jobs=NUM використати таку кількість паралельних підключень для переіндексації\n" +msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" +msgstr " -S, --schema=SCHEMA переіндексувати лише вказані схеми\n" -#: reindexdb.c:763 +#: reindexdb.c:804 #, c-format -msgid " -s, --system reindex system catalogs\n" -msgstr " -s, --system переіндексувати системні каталоги\n" +msgid " -t, --table=TABLE reindex specific table(s) only\n" +msgstr " -t, --table=TABLE переіндексувати лише вказані таблиці\n" -#: reindexdb.c:764 +#: reindexdb.c:805 #, c-format -msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" -msgstr " -S, --schema=СХЕМА переіндексувати тільки вказані схеми\n" +msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" +msgstr " --tablespace=TABLESPACE табличний простір для перебудованих індексів\n" -#: reindexdb.c:765 +#: reindexdb.c:806 #, c-format -msgid " -t, --table=TABLE reindex specific table(s) only\n" -msgstr " -t, --table=ТАБЛИЦЯ переіндексувати тільки вказані таблиці\n" +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose виводити багато повідомлень\n" -#: reindexdb.c:776 +#: reindexdb.c:816 #, c-format msgid "\n" "Read the description of the SQL command REINDEX for details.\n" msgstr "\n" "Для деталей читайте опис команди SQL REINDEX.\n" -#: scripts_parallel.c:234 -#, c-format -msgid "too many jobs for this platform -- try %d" -msgstr "надто багато завдань для цієї платформи -- спробуйте %d" - -#: vacuumdb.c:194 +#: vacuumdb.c:206 #, c-format -msgid "parallel vacuum degree must be a non-negative integer" -msgstr "ступінь паралельного очищення повинен бути не від'ємним цілим" +msgid "parallel workers for vacuum must be greater than or equal to zero" +msgstr "паралельні робітники для вакууму повинні бути більшими або дорівнювати нулю" -#: vacuumdb.c:214 +#: vacuumdb.c:226 #, c-format msgid "minimum transaction ID age must be at least 1" msgstr "мінімальний ID ери транзакції має бути хоча б 1" -#: vacuumdb.c:222 +#: vacuumdb.c:234 #, c-format msgid "minimum multixact ID age must be at least 1" msgstr "мінімальна ера ID мультитранзакції повинна бути щонайменше 1" -#: vacuumdb.c:254 vacuumdb.c:260 vacuumdb.c:266 vacuumdb.c:278 +#: vacuumdb.c:278 vacuumdb.c:284 vacuumdb.c:290 vacuumdb.c:296 vacuumdb.c:302 +#: vacuumdb.c:308 vacuumdb.c:314 vacuumdb.c:326 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "не можна використовувати параметр \"%s\" під час виконання лише аналіза" -#: vacuumdb.c:284 +#: vacuumdb.c:332 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "не можна використовувати параметр \"%s\" під час виконання VACUUM FULL" -#: vacuumdb.c:300 +#: vacuumdb.c:341 +#, c-format +msgid "cannot use the \"%s\" option with the \"%s\" option" +msgstr "використовувати параметр \"%s\" з параметром \"%s\" не можна" + +#: vacuumdb.c:363 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "неможливо очистити всі бази даних і одну вказану одночасно" -#: vacuumdb.c:305 +#: vacuumdb.c:368 #, c-format msgid "cannot vacuum specific table(s) in all databases" msgstr "неможливо очистити вказані таблиці в усіх базах даних" -#: vacuumdb.c:396 +#: vacuumdb.c:458 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Генерування мінімальної статистики для оптімизатора (1 мета)" -#: vacuumdb.c:397 +#: vacuumdb.c:459 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Генерування середньої статистики для оптимізатора (10 цілей)" -#: vacuumdb.c:398 +#: vacuumdb.c:460 msgid "Generating default (full) optimizer statistics" msgstr "Генерування статистики для оптимізатора за замовчуванням (повністю)" -#: vacuumdb.c:447 +#: vacuumdb.c:540 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: обробка бази даних \"%s\": %s\n" -#: vacuumdb.c:450 +#: vacuumdb.c:543 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: очищення бази даних \"%s\"\n" -#: vacuumdb.c:909 +#: vacuumdb.c:1013 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "очистити таблиці \"%s\" в базі даних \"%s\" не вдалося: %s" -#: vacuumdb.c:912 +#: vacuumdb.c:1016 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "очистити базу даних \"%s\" не вдалося: %s" -#: vacuumdb.c:920 +#: vacuumdb.c:1024 #, c-format msgid "%s cleans and analyzes a PostgreSQL database.\n\n" msgstr "%s очищує й аналізує базу даних PostgreSQL.\n\n" -#: vacuumdb.c:924 +#: vacuumdb.c:1028 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all очистити усі бази даних\n" -#: vacuumdb.c:925 +#: vacuumdb.c:1029 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=ІМ'Я_БД база даних для очищення\n" -#: vacuumdb.c:926 +#: vacuumdb.c:1030 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping відключити пропуск сторінок\n" -#: vacuumdb.c:927 +#: vacuumdb.c:1031 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo показати команди, надіслані серверу\n" -#: vacuumdb.c:928 +#: vacuumdb.c:1032 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full зробити повне очищення\n" -#: vacuumdb.c:929 +#: vacuumdb.c:1033 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze заморозити інформацію щодо транзакцій в рядках\n" -#: vacuumdb.c:930 +#: vacuumdb.c:1034 +#, c-format +msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" +msgstr " --force-index-cleanup завжди видаляти записи індексів, які вказують на мертві кортежі\n" + +#: vacuumdb.c:1035 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr " -j, --jobs=ЧИСЛО використати ці паралельні підключення для очищення\n" -#: vacuumdb.c:931 +#: vacuumdb.c:1036 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr " --min-mxid-age=MXID_AGE мінімальний ID ери мультитранзакції таблиць для вакууму\n" -#: vacuumdb.c:932 +#: vacuumdb.c:1037 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr " --min-mxid-age=MXID_AGE мінімальний ID ери транзакції таблиць для вакууму\n" -#: vacuumdb.c:933 +#: vacuumdb.c:1038 +#, c-format +msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" +msgstr " --no-index-cleanup не видаляти записи індексів, які вказують на мертві кортежі\n" + +#: vacuumdb.c:1039 +#, c-format +msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" +msgstr " --no-process-toast пропускати таблицю TOAST, пов'язану з таблицею для очищення\n" + +#: vacuumdb.c:1040 +#, c-format +msgid " --no-truncate don't truncate empty pages at the end of the table\n" +msgstr " --no-truncate не скорочувати пусті сторінки наприкінці таблиці\n" + +#: vacuumdb.c:1041 #, c-format -msgid " -P, --parallel=PARALLEL_DEGREE use this many background workers for vacuum, if available\n" -msgstr " -P, --parallel=PARALLEL_DEGREE використати таку кількість фонових процесів для очищення, якщо вони доступні\n" +msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" +msgstr " -P, --parallel=PARALLEL_WORKERS використати таку кількість фонових робітників для очищення, якщо вони доступні\n" -#: vacuumdb.c:934 +#: vacuumdb.c:1042 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не писати жодних повідомлень\n" -#: vacuumdb.c:935 +#: vacuumdb.c:1043 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr " --skip-locked пропустити відношення, що не можуть бути заблоковані негайно\n" -#: vacuumdb.c:936 +#: vacuumdb.c:1044 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr " -t, --table='ТАБЛИЦЯ[(СТОВПЦІ)]' очистити тільки вказані таблиці\n" -#: vacuumdb.c:937 +#: vacuumdb.c:1045 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose виводити багато інформації\n" -#: vacuumdb.c:938 +#: vacuumdb.c:1046 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію і вийти\n" -#: vacuumdb.c:939 +#: vacuumdb.c:1047 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze оновити статистику для оптимізатора\n" -#: vacuumdb.c:940 +#: vacuumdb.c:1048 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr " -Z, --analyze-only оновити лише статистику для оптимізатора, не очищати\n" -#: vacuumdb.c:941 +#: vacuumdb.c:1049 #, c-format msgid " --analyze-in-stages only update optimizer statistics, in multiple\n" " stages for faster results; no vacuum\n" msgstr " --analyze-in-stages оновити лише статистику для оптимізатора, у декілька стадій для швидших результатів, не очищати\n" -#: vacuumdb.c:943 +#: vacuumdb.c:1051 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю справку, потім вийти\n" -#: vacuumdb.c:951 +#: vacuumdb.c:1059 #, c-format msgid "\n" "Read the description of the SQL command VACUUM for details.\n" diff --git a/src/bin/scripts/po/zh_CN.po b/src/bin/scripts/po/zh_CN.po index 6ccd93d5ef..12c75603ec 100644 --- a/src/bin/scripts/po/zh_CN.po +++ b/src/bin/scripts/po/zh_CN.po @@ -4,41 +4,41 @@ # msgid "" msgstr "" -"Project-Id-Version: pgscripts (PostgreSQL) 12\n" +"Project-Id-Version: pgscripts (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-06-03 18:30+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:47+0000\n" +"PO-Revision-Date: 2021-08-15 18:30+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "X-Generator: Poedit 1.5.7\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/common/logging.c:188 +#: ../../../src/common/logging.c:259 #, c-format msgid "fatal: " msgstr "致命的: " -#: ../../../src/common/logging.c:195 +#: ../../../src/common/logging.c:266 #, c-format msgid "error: " msgstr "错误: " -#: ../../../src/common/logging.c:202 +#: ../../../src/common/logging.c:273 #, c-format msgid "warning: " msgstr "警告: " #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format msgid "out of memory\n" -msgstr "内存溢出\n" +msgstr "内存不足\n" -#: ../../common/fe_memutils.c:92 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "无法复制空指针 (内部错误)\n" @@ -46,7 +46,7 @@ msgstr "无法复制空指针 (内部错误)\n" #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" -msgstr "无法查找得到有效的用户ID %ld: %s" +msgstr "无法找到有效的用户ID %ld: %s" #: ../../common/username.c:45 msgid "user does not exist" @@ -57,74 +57,114 @@ msgstr "用户不存在" msgid "user name lookup failure: error code %lu" msgstr "用户名查找失败:错误代码%lu" -#: ../../fe_utils/print.c:353 +#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +msgid "Cancel request sent\n" +msgstr "取消发送的请求\n" + +#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210 +msgid "Could not send cancel request: " +msgstr "无法发送取消请求: " + +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:107 +msgid "Password: " +msgstr "口令: " + +#: ../../fe_utils/connect_utils.c:92 +#, c-format +msgid "could not connect to database %s: out of memory" +msgstr "无法连接到数据库 %s:内存不足" + +#: ../../fe_utils/connect_utils.c:120 pg_isready.c:145 +#, c-format +msgid "%s" +msgstr "%s" + +#: ../../fe_utils/parallel_slot.c:302 +#, c-format +msgid "too many jobs for this platform" +msgstr "此平台的作业太多" + +#: ../../fe_utils/parallel_slot.c:522 +msgid "processing of database \"%s\" failed: %s" +msgstr "处理数据库\"%s\"失败:%s" + +#: ../../fe_utils/print.c:336 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu 行记录)" msgstr[1] "(%lu 行记录)" -#: ../../fe_utils/print.c:3058 +#: ../../fe_utils/print.c:3039 #, c-format msgid "Interrupted\n" msgstr "已中断\n" -#: ../../fe_utils/print.c:3122 +#: ../../fe_utils/print.c:3103 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "无法对表的内容增加标题:已经超过%d列的数量.\n" -#: ../../fe_utils/print.c:3162 +#: ../../fe_utils/print.c:3143 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "无法对表的内容添加单元: 总共有%d个单元超过.\n" -#: ../../fe_utils/print.c:3417 +#: ../../fe_utils/print.c:3401 #, c-format msgid "invalid output format (internal error): %d" msgstr "无效的输出格式 (内部错误): %d" -#: clusterdb.c:113 clusterdb.c:132 createdb.c:121 createdb.c:140 -#: createuser.c:168 createuser.c:183 dropdb.c:96 dropdb.c:105 dropdb.c:113 -#: dropuser.c:92 dropuser.c:107 dropuser.c:122 pg_isready.c:95 -#: pg_isready.c:109 reindexdb.c:139 reindexdb.c:158 vacuumdb.c:246 -#: vacuumdb.c:265 +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 +#, c-format +msgid "query failed: %s" +msgstr "查询失败: %s" + +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#, c-format +msgid "query was: %s" +msgstr "查询是: %s" + +#: clusterdb.c:112 clusterdb.c:131 createdb.c:123 createdb.c:142 +#: createuser.c:172 createuser.c:187 dropdb.c:103 dropdb.c:112 dropdb.c:120 +#: dropuser.c:94 dropuser.c:109 dropuser.c:122 pg_isready.c:96 pg_isready.c:110 +#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:251 vacuumdb.c:270 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "请用 \"%s --help\" 获取更多的信息.\n" -#: clusterdb.c:130 createdb.c:138 createuser.c:181 dropdb.c:111 dropuser.c:105 -#: pg_isready.c:107 reindexdb.c:156 vacuumdb.c:263 +#: clusterdb.c:129 createdb.c:140 createuser.c:185 dropdb.c:118 dropuser.c:107 +#: pg_isready.c:108 reindexdb.c:191 vacuumdb.c:268 #, c-format msgid "too many command-line arguments (first is \"%s\")" -msgstr "太多的命令行参数 (第一个是 \"%s\")" +msgstr "命令行参数太多 (第一个是 \"%s\")" -#: clusterdb.c:142 +#: clusterdb.c:148 #, c-format msgid "cannot cluster all databases and a specific one at the same time" msgstr "无法对所有数据库和一个指定的数据库同时建簇" -#: clusterdb.c:148 +#: clusterdb.c:154 #, c-format msgid "cannot cluster specific table(s) in all databases" msgstr "无法在所有数据库中对指定表进行建簇" -#: clusterdb.c:216 +#: clusterdb.c:220 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "在数据库 \"%2$s\" 中的表 \"%1$s\" 建簇失败: %3$s" -#: clusterdb.c:219 +#: clusterdb.c:223 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "数据库 \"%s\" 建簇失败: %s" -#: clusterdb.c:252 +#: clusterdb.c:251 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: 对数据库 \"%s\" 进行建簇\n" -#: clusterdb.c:273 +#: clusterdb.c:267 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -133,19 +173,19 @@ msgstr "" "%s 对一个数据库中先前已经建过簇的表进行建簇.\n" "\n" -#: clusterdb.c:274 createdb.c:250 createuser.c:344 dropdb.c:157 dropuser.c:163 -#: pg_isready.c:224 reindexdb.c:425 vacuumdb.c:1216 +#: clusterdb.c:268 createdb.c:267 createuser.c:351 dropdb.c:171 dropuser.c:169 +#: pg_isready.c:225 reindexdb.c:792 vacuumdb.c:1025 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: clusterdb.c:275 reindexdb.c:426 vacuumdb.c:1217 +#: clusterdb.c:269 reindexdb.c:793 vacuumdb.c:1026 #, c-format msgid " %s [OPTION]... [DBNAME]\n" -msgstr " %s [选项]... [数据库名]\n" +msgstr " %s [选项]... [数据库名字]\n" -#: clusterdb.c:276 createdb.c:252 createuser.c:346 dropdb.c:159 dropuser.c:165 -#: pg_isready.c:227 reindexdb.c:427 vacuumdb.c:1218 +#: clusterdb.c:270 createdb.c:269 createuser.c:353 dropdb.c:173 dropuser.c:171 +#: pg_isready.c:228 reindexdb.c:794 vacuumdb.c:1027 #, c-format msgid "" "\n" @@ -154,51 +194,48 @@ msgstr "" "\n" "选项:\n" -#: clusterdb.c:277 +#: clusterdb.c:271 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all 对所有数据库建簇\n" -#: clusterdb.c:278 +#: clusterdb.c:272 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=DBNAME 对数据库 DBNAME 建簇\n" -#: clusterdb.c:279 createuser.c:350 dropdb.c:160 dropuser.c:166 -#: reindexdb.c:431 +#: clusterdb.c:273 createuser.c:357 dropdb.c:174 dropuser.c:172 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo 显示发送到服务端的命令\n" -#: clusterdb.c:280 reindexdb.c:433 +#: clusterdb.c:274 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet 不写任何信息\n" -#: clusterdb.c:281 +#: clusterdb.c:275 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=TABLE 只对指定的表建簇\n" -#: clusterdb.c:282 reindexdb.c:437 +#: clusterdb.c:276 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose 写大量的输出\n" -#: clusterdb.c:283 createuser.c:362 dropdb.c:162 dropuser.c:169 -#: reindexdb.c:438 +#: clusterdb.c:277 createuser.c:369 dropdb.c:177 dropuser.c:175 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 输出版本信息, 然后退出\n" -#: clusterdb.c:284 createuser.c:367 dropdb.c:164 dropuser.c:171 -#: reindexdb.c:439 +#: clusterdb.c:278 createuser.c:374 dropdb.c:179 dropuser.c:177 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 显示此帮助, 然后退出\n" -#: clusterdb.c:285 createdb.c:263 createuser.c:368 dropdb.c:165 dropuser.c:172 -#: pg_isready.c:233 reindexdb.c:440 vacuumdb.c:1238 +#: clusterdb.c:279 createdb.c:280 createuser.c:375 dropdb.c:180 dropuser.c:178 +#: pg_isready.c:234 reindexdb.c:809 vacuumdb.c:1052 #, c-format msgid "" "\n" @@ -207,41 +244,37 @@ msgstr "" "\n" "联接选项:\n" -#: clusterdb.c:286 createuser.c:369 dropdb.c:166 dropuser.c:173 -#: reindexdb.c:441 vacuumdb.c:1239 +#: clusterdb.c:280 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1053 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAM 数据库服务器所在机器的主机名或套接字目录\n" -#: clusterdb.c:287 createuser.c:370 dropdb.c:167 dropuser.c:174 -#: reindexdb.c:442 vacuumdb.c:1240 +#: clusterdb.c:281 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT 数据库服务器端口号\n" -#: clusterdb.c:288 dropdb.c:168 reindexdb.c:443 vacuumdb.c:1241 +#: clusterdb.c:282 dropdb.c:183 vacuumdb.c:1055 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME 联接的用户名\n" -#: clusterdb.c:289 createuser.c:372 dropdb.c:169 dropuser.c:176 -#: reindexdb.c:444 vacuumdb.c:1242 +#: clusterdb.c:283 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1056 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password 永远不提示输入口令\n" -#: clusterdb.c:290 createuser.c:373 dropdb.c:170 dropuser.c:177 -#: reindexdb.c:445 vacuumdb.c:1243 +#: clusterdb.c:284 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password 强制提示输入口令\n" -#: clusterdb.c:291 dropdb.c:171 reindexdb.c:446 vacuumdb.c:1244 +#: clusterdb.c:285 dropdb.c:186 vacuumdb.c:1058 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME 更改维护数据库\n" -#: clusterdb.c:292 +#: clusterdb.c:286 #, c-format msgid "" "\n" @@ -250,41 +283,23 @@ msgstr "" "\n" "阅读 SQL 命令 CLUSTER 的描述信息, 以便获得更详细的信息.\n" -#: clusterdb.c:293 createdb.c:271 createuser.c:374 dropdb.c:172 dropuser.c:178 -#: pg_isready.c:238 reindexdb.c:448 vacuumdb.c:1246 +#: clusterdb.c:287 createdb.c:288 createuser.c:381 dropdb.c:187 dropuser.c:184 +#: pg_isready.c:239 reindexdb.c:817 vacuumdb.c:1060 #, c-format msgid "" "\n" -"Report bugs to .\n" +"Report bugs to <%s>.\n" msgstr "" "\n" -"臭虫报告至 .\n" +"臭虫报告至<%s>.\n" -#: common.c:84 common.c:130 -msgid "Password: " -msgstr "口令: " - -#: common.c:117 +#: clusterdb.c:288 createdb.c:289 createuser.c:382 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:818 vacuumdb.c:1061 #, c-format -msgid "could not connect to database %s: out of memory" -msgstr "无法连接到数据库 %s:内存不足" +msgid "%s home page: <%s>\n" +msgstr "%s 主页: <%s>\n" -#: common.c:144 -#, c-format -msgid "could not connect to database %s: %s" -msgstr "无法联接到数据库 %s: %s" - -#: common.c:196 common.c:222 -#, c-format -msgid "query failed: %s" -msgstr "查询失败: %s" - -#: common.c:197 common.c:223 -#, c-format -msgid "query was: %s" -msgstr "查询是: %s" - -#: common.c:339 +#: common.c:107 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" @@ -292,63 +307,53 @@ msgstr[0] "查询返回了%d条记录,而不是一条记录: %s" msgstr[1] "查询返回了%d条记录,而不是一条记录: %s" #. translator: abbreviation for "yes" -#: common.c:364 +#: common.c:131 msgid "y" msgstr "y" #. translator: abbreviation for "no" -#: common.c:366 +#: common.c:133 msgid "n" msgstr "n" #. translator: This is a question followed by the translated options for #. "yes" and "no". -#: common.c:376 +#: common.c:143 #, c-format msgid "%s (%s/%s) " msgstr "%s (%s/%s) " -#: common.c:390 +#: common.c:164 #, c-format msgid "Please answer \"%s\" or \"%s\".\n" msgstr "请回答\"%s\"或\"%s\".\n" -#: common.c:469 common.c:506 -#, c-format -msgid "Cancel request sent\n" -msgstr "取消发送的请求\n" - -#: common.c:472 common.c:510 -#, c-format -msgid "Could not send cancel request: %s" -msgstr "无法发送取消请求: %s" - -#: createdb.c:148 +#: createdb.c:150 #, c-format msgid "only one of --locale and --lc-ctype can be specified" msgstr "只能指定--locale和--lc-ctype这两个选项之一" -#: createdb.c:153 +#: createdb.c:155 #, c-format msgid "only one of --locale and --lc-collate can be specified" msgstr "只能指定--locale和--lc-collate这两个选项之一" -#: createdb.c:164 +#: createdb.c:166 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" 是一个无效编码名" -#: createdb.c:212 +#: createdb.c:229 #, c-format msgid "database creation failed: %s" msgstr "创建数据库失败: %s" -#: createdb.c:231 +#: createdb.c:248 #, c-format msgid "comment creation failed (database was created): %s" msgstr "创建注释失败 (数据库已创建): %s" -#: createdb.c:249 +#: createdb.c:266 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -357,92 +362,92 @@ msgstr "" "%s 创建一个 PostgreSQL 数据库.\n" "\n" -#: createdb.c:251 +#: createdb.c:268 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [选项]... [数据库名称] [描述]\n" -#: createdb.c:253 +#: createdb.c:270 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TABLESPACE 数据库默认表空间\n" -#: createdb.c:254 +#: createdb.c:271 reindexdb.c:798 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo 显示发送到服务端的命令\n" -#: createdb.c:255 +#: createdb.c:272 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=ENCODING 数据库编码\n" -#: createdb.c:256 +#: createdb.c:273 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOCALE 数据库的本地化设置\n" -#: createdb.c:257 +#: createdb.c:274 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOCALE 数据库的LC_COLLATE设置\n" -#: createdb.c:258 +#: createdb.c:275 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=LOCALE 数据库的LC_CTYPE设置\n" -#: createdb.c:259 +#: createdb.c:276 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=OWNER 新数据库的所属用户\n" -#: createdb.c:260 +#: createdb.c:277 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=TEMPLATE 要拷贝的数据库模板\n" -#: createdb.c:261 +#: createdb.c:278 reindexdb.c:807 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 输出版本信息, 然后退出\n" -#: createdb.c:262 +#: createdb.c:279 reindexdb.c:808 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 显示此帮助, 然后退出\n" -#: createdb.c:264 +#: createdb.c:281 reindexdb.c:810 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME 数据库服务器所在机器的主机名或套接字目录\n" -#: createdb.c:265 +#: createdb.c:282 reindexdb.c:811 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT 数据库服务器端口号\n" -#: createdb.c:266 +#: createdb.c:283 reindexdb.c:812 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME 联接的用户名\n" -#: createdb.c:267 +#: createdb.c:284 reindexdb.c:813 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password 永远不提示输入口令\n" -#: createdb.c:268 +#: createdb.c:285 reindexdb.c:814 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password 强制提示输入口令\n" -#: createdb.c:269 +#: createdb.c:286 reindexdb.c:815 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME 更改维护数据库\n" -#: createdb.c:270 +#: createdb.c:287 #, c-format msgid "" "\n" @@ -451,46 +456,50 @@ msgstr "" "\n" "默认情况下, 以当前用户的用户名创建数据库.\n" -#: createuser.c:191 +#: createuser.c:151 +msgid "invalid value for --connection-limit: %s" +msgstr "--connection-limit的值无效: %s" + +#: createuser.c:195 msgid "Enter name of role to add: " msgstr "输入要增加的角色名称: " -#: createuser.c:208 +#: createuser.c:210 msgid "Enter password for new role: " msgstr "为新角色输入的口令: " -#: createuser.c:210 +#: createuser.c:211 msgid "Enter it again: " msgstr "再输入一遍: " -#: createuser.c:213 +#: createuser.c:214 #, c-format msgid "Passwords didn't match.\n" msgstr "口令不匹配.\n" -#: createuser.c:221 +#: createuser.c:222 msgid "Shall the new role be a superuser?" msgstr "新的角色是否是超级用户?" -#: createuser.c:236 +#: createuser.c:237 msgid "Shall the new role be allowed to create databases?" msgstr "新的角色允许创建数据库吗?" -#: createuser.c:244 +#: createuser.c:245 msgid "Shall the new role be allowed to create more new roles?" msgstr "新角色允许创建其它新的角色吗? " -#: createuser.c:274 +#: createuser.c:281 #, c-format msgid "password encryption failed: %s" msgstr "密码加密失败: %s" -#: createuser.c:329 +#: createuser.c:336 #, c-format msgid "creation of new role failed: %s" msgstr "创建新用户失败: %s" -#: createuser.c:343 +#: createuser.c:350 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -499,32 +508,32 @@ msgstr "" "%s 创建一个新的 PostgreSQL 用户.\n" "\n" -#: createuser.c:345 dropuser.c:164 +#: createuser.c:352 dropuser.c:170 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [选项]... [用户名]\n" -#: createuser.c:347 +#: createuser.c:354 #, c-format msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" msgstr " -c, --connection-limit=N 角色的连接限制(缺省: 没有限制)\n" -#: createuser.c:348 +#: createuser.c:355 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb 此角色可以创建新数据库\n" -#: createuser.c:349 +#: createuser.c:356 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb 此角色不可以创建新数据库(默认)\n" -#: createuser.c:351 +#: createuser.c:358 #, c-format msgid " -g, --role=ROLE new role will be a member of this role\n" msgstr " -g, --role=ROLE 新的角色必须是这个角色的成员\n" -#: createuser.c:352 +#: createuser.c:359 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -533,47 +542,47 @@ msgstr "" " -i, --inherit 角色能够继承它所属角色的权限\n" " (这是缺省情况)\n" -#: createuser.c:354 +#: createuser.c:361 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit 角色不继承权限\n" -#: createuser.c:355 +#: createuser.c:362 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login 角色能够登录(这是缺省情况)\n" -#: createuser.c:356 +#: createuser.c:363 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login 角色不能登录\n" -#: createuser.c:357 +#: createuser.c:364 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt 给新角色指定口令\n" -#: createuser.c:358 +#: createuser.c:365 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole 这个角色可以创建新的角色\n" -#: createuser.c:359 +#: createuser.c:366 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole 这个角色没有创建其它角色的权限(默认)\n" -#: createuser.c:360 +#: createuser.c:367 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser 角色将是超级用户\n" -#: createuser.c:361 +#: createuser.c:368 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr " -S, --no-superuser 角色不能是超级用户(默认)\n" -#: createuser.c:363 +#: createuser.c:370 #, c-format msgid "" " --interactive prompt for missing role name and attributes rather\n" @@ -582,41 +591,41 @@ msgstr "" " --interactive 提示缺少角色名及其属性\n" " 而不是使用默认值\n" -#: createuser.c:365 +#: createuser.c:372 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication 角色能启动复制\n" -#: createuser.c:366 +#: createuser.c:373 #, c-format msgid " --no-replication role cannot initiate replication\n" msgstr " --no-replication 角色不能启动复制\n" -#: createuser.c:371 +#: createuser.c:378 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" msgstr " -U, --username=USERNAME 联接用户 (不是要创建的用户名)\n" -#: dropdb.c:104 +#: dropdb.c:111 #, c-format msgid "missing required argument database name" msgstr "缺少需要的数据库名参数" -#: dropdb.c:119 +#: dropdb.c:126 #, c-format msgid "Database \"%s\" will be permanently removed.\n" msgstr "数据库 \"%s\" 将被永久的删除.\n" -#: dropdb.c:120 dropuser.c:130 +#: dropdb.c:127 dropuser.c:130 msgid "Are you sure?" msgstr "您确定吗? (y/n) " -#: dropdb.c:142 +#: dropdb.c:156 #, c-format msgid "database removal failed: %s" msgstr "数据库删除失败: %s" -#: dropdb.c:156 +#: dropdb.c:170 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -625,22 +634,26 @@ msgstr "" "%s 删除一个 PostgreSQL 数据库.\n" "\n" -#: dropdb.c:158 +#: dropdb.c:172 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [选项]... 数据库名\n" -#: dropdb.c:161 +#: dropdb.c:175 +msgid " -f, --force try to terminate other connections before dropping\n" +msgstr " -f, --force 强尝试在删除之前终止其他连接\n" + +#: dropdb.c:176 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr " -i, --interactive 删除任何东西之前给予提示\n" -#: dropdb.c:163 +#: dropdb.c:178 #, c-format msgid " --if-exists don't report error if database doesn't exist\n" msgstr " --if-exists 如果数据库不存在则不报告错误\n" -#: dropuser.c:115 +#: dropuser.c:117 msgid "Enter name of role to drop: " msgstr "输入要删除的用户名: " @@ -654,12 +667,12 @@ msgstr "缺少需要的参数角色名" msgid "Role \"%s\" will be permanently removed.\n" msgstr "用户 \"%s\" 将被永久删除.\n" -#: dropuser.c:147 +#: dropuser.c:153 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "删除用户 \"%s\" 失败: %s" -#: dropuser.c:162 +#: dropuser.c:168 #, c-format msgid "" "%s removes a PostgreSQL role.\n" @@ -668,7 +681,7 @@ msgstr "" "%s 删除一个 PostgreSQL 用户.\n" "\n" -#: dropuser.c:167 +#: dropuser.c:173 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -677,52 +690,47 @@ msgstr "" " -i, --interactive 删除任何东西之前给予提示, 如果没有指定\n" " 角色名也给予提示\n" -#: dropuser.c:170 +#: dropuser.c:176 #, c-format msgid " --if-exists don't report error if user doesn't exist\n" msgstr " --if-exists 用户名不存在时则不报告错误\n" -#: dropuser.c:175 +#: dropuser.c:181 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n" msgstr " -U, --username=USERNAME 联接用户 (不是要删除的用户名)\n" -#: pg_isready.c:144 -#, c-format -msgid "%s" -msgstr "%s" - -#: pg_isready.c:152 +#: pg_isready.c:153 #, c-format msgid "could not fetch default options" msgstr "无法取得缺省选项" -#: pg_isready.c:201 +#: pg_isready.c:202 #, c-format msgid "accepting connections\n" msgstr "接受连接\n" -#: pg_isready.c:204 +#: pg_isready.c:205 #, c-format msgid "rejecting connections\n" msgstr "拒绝连接\n" -#: pg_isready.c:207 +#: pg_isready.c:208 #, c-format msgid "no response\n" msgstr "没有响应\n" -#: pg_isready.c:210 +#: pg_isready.c:211 #, c-format msgid "no attempt\n" msgstr "没有尝试\n" -#: pg_isready.c:213 +#: pg_isready.c:214 #, c-format msgid "unknown\n" msgstr "未知\n" -#: pg_isready.c:223 +#: pg_isready.c:224 #, c-format msgid "" "%s issues a connection check to a PostgreSQL database.\n" @@ -731,128 +739,145 @@ msgstr "" "%s 发起一个到指定 PostgreSQL数据库的连接检查.\n" "\n" -#: pg_isready.c:225 +#: pg_isready.c:226 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [选项]...\n" -#: pg_isready.c:228 +#: pg_isready.c:229 #, c-format msgid " -d, --dbname=DBNAME database name\n" msgstr " -d, --dbname=DBNAME 数据库名\n" -#: pg_isready.c:229 +#: pg_isready.c:230 #, c-format msgid " -q, --quiet run quietly\n" msgstr " -q, --quiet 静默运行\n" -#: pg_isready.c:230 +#: pg_isready.c:231 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 输出版本信息, 然后退出\n" -#: pg_isready.c:231 +#: pg_isready.c:232 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 显示此帮助, 然后退出\n" -#: pg_isready.c:234 +#: pg_isready.c:235 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=主机名 数据库服务器的主机名或套接字目录\n" -#: pg_isready.c:235 +#: pg_isready.c:236 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT 数据库服务器端口\n" -#: pg_isready.c:236 +#: pg_isready.c:237 #, c-format msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n" msgstr " -t, --timeout=SECS 尝试连接时要等待的秒数, 值为0表示禁用(缺省值: %s)\n" -#: pg_isready.c:237 +#: pg_isready.c:238 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME 连接的用户名\n" -#: reindexdb.c:168 +#: reindexdb.c:157 vacuumdb.c:198 +#, c-format +msgid "number of parallel jobs must be at least 1" +msgstr "并行工作的数量必须至少为1" + +#: reindexdb.c:210 #, c-format msgid "cannot reindex all databases and a specific one at the same time" msgstr "无法对所有数据库和一个指定的索引同时进行索引重建操作" -#: reindexdb.c:173 +#: reindexdb.c:215 #, c-format msgid "cannot reindex all databases and system catalogs at the same time" msgstr "无法对所有数据库和系统目录同时进行索引重建操作" -#: reindexdb.c:178 +#: reindexdb.c:220 #, c-format msgid "cannot reindex specific schema(s) in all databases" msgstr "无法在所有数据库中对指定模式上的索引进行重建" -#: reindexdb.c:183 +#: reindexdb.c:225 #, c-format msgid "cannot reindex specific table(s) in all databases" msgstr "无法在所有数据库中对指定表上的索引进行重建" -#: reindexdb.c:188 +#: reindexdb.c:230 #, c-format msgid "cannot reindex specific index(es) in all databases" msgstr "无法在所有数据库中对指定的索引进行重建" -#: reindexdb.c:199 +#: reindexdb.c:243 #, c-format msgid "cannot reindex specific schema(s) and system catalogs at the same time" msgstr "无法对指定的模式和系统目录同时进行索引重建" -#: reindexdb.c:204 +#: reindexdb.c:248 #, c-format msgid "cannot reindex specific table(s) and system catalogs at the same time" msgstr "无法对指定的表和系统视图同时进行索引重建操作" -#: reindexdb.c:209 +#: reindexdb.c:253 #, c-format msgid "cannot reindex specific index(es) and system catalogs at the same time" msgstr "无法对指定索引和系统视图同时进行索引重建操作" -#: reindexdb.c:298 vacuumdb.c:412 vacuumdb.c:420 vacuumdb.c:427 vacuumdb.c:434 +#: reindexdb.c:259 +msgid "cannot use multiple jobs to reindex system catalogs" +msgstr "无法使用多个作业重新索引系统目录" + +#: reindexdb.c:288 +msgid "cannot use multiple jobs to reindex indexes" +msgstr "无法使用多个作业重新索引索引" + +#: reindexdb.c:353 reindexdb.c:361 vacuumdb.c:471 vacuumdb.c:479 vacuumdb.c:487 +#: vacuumdb.c:495 vacuumdb.c:503 vacuumdb.c:511 vacuumdb.c:518 vacuumdb.c:525 +#: vacuumdb.c:532 #, c-format -#| msgid "%s: cannot use the \"%s\" option when performing only analyze\n" msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "不能在PostgreSQL %2$s之前的服务器版本上使用 \"%1$s\" 选项" -#: reindexdb.c:326 +#: reindexdb.c:401 +msgid "cannot reindex system catalogs concurrently, skipping all" +msgstr "无法同时重新索引系统目录,跳过所有" + +#: reindexdb.c:605 #, c-format -msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" -msgstr "在数据库\"%2$s\"中对表\"%1$s\"上的索引重新创建失败: %3$s" +msgid "reindexing of database \"%s\" failed: %s" +msgstr "在数据库\"%s\"上重新创建索引失败: %s" -#: reindexdb.c:329 +#: reindexdb.c:609 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "在数据库\"%2$s\"中对索引\"%1$s\"重新创建失败: %3$s" -#: reindexdb.c:332 +#: reindexdb.c:613 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "在数据库\"%2$s\"中对模式\"%1$s\"的索引重建失败:%3$s" -#: reindexdb.c:335 +#: reindexdb.c:617 +msgid "reindexing of system catalogs in database \"%s\" failed: %s" +msgstr "在数据库\"%s\"中重新索引系统目录失败: %s" + +#: reindexdb.c:621 #, c-format -msgid "reindexing of database \"%s\" failed: %s" -msgstr "在数据库\"%s\"上重新创建索引失败: %s" +msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" +msgstr "在数据库\"%2$s\"中对表\"%1$s\"上的索引重新创建失败: %3$s" -#: reindexdb.c:369 +#: reindexdb.c:774 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: 对数据库 \"%s\" 重新创建索引\n" -#: reindexdb.c:412 -#, c-format -msgid "reindexing of system catalogs failed: %s" -msgstr "对目录视图重新创建索引失败: %s" - -#: reindexdb.c:424 +#: reindexdb.c:791 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -861,42 +886,51 @@ msgstr "" "%s 对一个PostgreSQL 数据库重新创建索引.\n" "\n" -#: reindexdb.c:428 -#, c-format -msgid " -a, --all reindex all databases\n" -msgstr " -a, --all 对所有数据库进行重建索引操作\n" +#: reindexdb.c:795 +msgid " -a, --all reindex all databases\n" +msgstr " -a, --all 对所有数据库进行重建索引操作\n" -#: reindexdb.c:429 -#, c-format -msgid " --concurrently reindex concurrently\n" -msgstr " --concurrently 同时重新索引\n" +#: reindexdb.c:796 +msgid " --concurrently reindex concurrently\n" +msgstr " --concurrently 同时重新索引\n" -#: reindexdb.c:430 -#, c-format -msgid " -d, --dbname=DBNAME database to reindex\n" -msgstr " -d, --dbname=数据库名称 对数据库中的索引进行重建\n" +#: reindexdb.c:797 +msgid " -d, --dbname=DBNAME database to reindex\n" +msgstr " -d, --dbname=DBNAME 对数据库中的索引进行重建\n" -#: reindexdb.c:432 -#, c-format -msgid " -i, --index=INDEX recreate specific index(es) only\n" -msgstr " -i, --index=INDEX 仅重新创建指定的索引\n" +#: reindexdb.c:799 +msgid " -i, --index=INDEX recreate specific index(es) only\n" +msgstr " -i, --index=INDEX 仅重新创建指定的索引\n" -#: reindexdb.c:434 -#, c-format -msgid " -s, --system reindex system catalogs\n" -msgstr " -s, --system 对系统视图重新创建索引\n" +#: reindexdb.c:800 +msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" +msgstr " -j, --jobs=NUM 使用这么多并发连接来重新创建索引\n" -#: reindexdb.c:435 -#, c-format -msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" -msgstr " -S, --schema=SCHEMA 只对指定模式重建索引\n" +#: reindexdb.c:801 +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet 不写任何信息\n" -#: reindexdb.c:436 -#, c-format -msgid " -t, --table=TABLE reindex specific table(s) only\n" -msgstr " -t, --table=表名 只对指定的表重新创建索引\n" +#: reindexdb.c:802 +msgid " -s, --system reindex system catalogs\n" +msgstr " -s, --system 对系统视图重新创建索引\n" + +#: reindexdb.c:803 +msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" +msgstr " -S, --schema=SCHEMA 只对指定模式重建索引\n" + +#: reindexdb.c:804 +msgid " -t, --table=TABLE reindex specific table(s) only\n" +msgstr " -t, --table=TABLE 只对指定的表重新创建索引\n" + +#: reindexdb.c:805 +msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" +msgstr " --tablespace=TABLESPACE 重建索引的表空间\n" -#: reindexdb.c:447 +#: reindexdb.c:806 +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose 写大量的输出\n" + +#: reindexdb.c:816 #, c-format msgid "" "\n" @@ -905,74 +939,77 @@ msgstr "" "\n" "阅读SQL命令REINDEX的描述信息, 以便获得更详细的信息.\n" -#: vacuumdb.c:207 -#, c-format -msgid "number of parallel jobs must be at least 1" -msgstr "并行工作的数量必须至少为1" +#: vacuumdb.c:206 +msgid "parallel workers for vacuum must be greater than or equal to zero" +msgstr "真空平行工作必须大于或等于零" -#: vacuumdb.c:212 -#, c-format -msgid "too many parallel jobs requested (maximum: %d)" -msgstr "请求了太多并行任务(最大:%d)" - -#: vacuumdb.c:233 +#: vacuumdb.c:226 #, c-format msgid "minimum transaction ID age must be at least 1" msgstr "最小事务ID必须至少为1" -#: vacuumdb.c:241 +#: vacuumdb.c:234 #, c-format msgid "minimum multixact ID age must be at least 1" msgstr "最小多事务ID必须至少为1" -#: vacuumdb.c:273 vacuumdb.c:279 vacuumdb.c:285 +#: vacuumdb.c:278 vacuumdb.c:284 vacuumdb.c:290 vacuumdb.c:296 vacuumdb.c:302 +#: vacuumdb.c:308 vacuumdb.c:314 vacuumdb.c:326 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "在只执行分析的时候,无法使用\"%s\"选项" -#: vacuumdb.c:302 +#: vacuumdb.c:332 +msgid "cannot use the \"%s\" option when performing full vacuum" +msgstr "执行完全真空时,无法使用\"%s\"选项" + +#: vacuumdb.c:341 +msgid "cannot use the \"%s\" option with the \"%s\" option" +msgstr "无法将\"%s\"选项与\"%s\"选项一起使用" + +#: vacuumdb.c:363 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "无法对所有数据库和一个指定的数据库同时清理" -#: vacuumdb.c:307 +#: vacuumdb.c:368 #, c-format msgid "cannot vacuum specific table(s) in all databases" msgstr "无法在所有数据库中对指定的表进行清理" -#: vacuumdb.c:398 +#: vacuumdb.c:458 msgid "Generating minimal optimizer statistics (1 target)" msgstr "产生最小优化器统计(一个目标)" -#: vacuumdb.c:399 +#: vacuumdb.c:459 msgid "Generating medium optimizer statistics (10 targets)" msgstr "产生中等优化器统计(10个目标)" -#: vacuumdb.c:400 +#: vacuumdb.c:460 msgid "Generating default (full) optimizer statistics" msgstr "产生缺省(完全)优化器统计" -#: vacuumdb.c:442 +#: vacuumdb.c:540 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s:处理数据库\"%s\":%s\n" -#: vacuumdb.c:445 +#: vacuumdb.c:543 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: 清理数据库 \"%s\"\n" -#: vacuumdb.c:942 +#: vacuumdb.c:1013 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "在数据库 \"%2$s\" 中的表 \"%1$s\" 清理失败: %3$s" -#: vacuumdb.c:945 vacuumdb.c:1080 +#: vacuumdb.c:1016 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "数据库 \"%s\" 清理失败: %s" -#: vacuumdb.c:1215 +#: vacuumdb.c:1024 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -981,87 +1018,111 @@ msgstr "" "%s 清理并且优化一个 PostgreSQL 数据库.\n" "\n" -#: vacuumdb.c:1219 +#: vacuumdb.c:1028 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all 清理所有的数据库\n" -#: vacuumdb.c:1220 +#: vacuumdb.c:1029 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=DBNAME 清理数据库 DBNAME\n" -#: vacuumdb.c:1221 +#: vacuumdb.c:1030 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping 禁用所有页面跳过行为\n" -#: vacuumdb.c:1222 +#: vacuumdb.c:1031 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo 显示发送到服务端的命令\n" -#: vacuumdb.c:1223 +#: vacuumdb.c:1032 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full 完全清理\n" -#: vacuumdb.c:1224 +#: vacuumdb.c:1033 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze 冻结记录的事务信息\n" -#: vacuumdb.c:1225 +#: vacuumdb.c:1034 +#, c-format +msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" +msgstr " --force-index-cleanup 始终删除指向死元组的索引项\n" + +#: vacuumdb.c:1035 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr " -j, --jobs=NUM 使用这么多个并发连接进行清理\n" -#: vacuumdb.c:1226 +#: vacuumdb.c:1036 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr " --min-mxid-age=MXID_AGE 清理表的最小多事务ID\n" -#: vacuumdb.c:1227 +#: vacuumdb.c:1037 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr " --min-xid-age=XID_AGE 清理表的最小事务ID\n" -#: vacuumdb.c:1228 +#: vacuumdb.c:1038 +#, c-format +msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" +msgstr " --no-index-cleanup 不要删除指向死元组的索引项\n" + +#: vacuumdb.c:1039 +#, c-format +msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" +msgstr " --no-process-toast 跳过与该表关联的TOAST表以使用真空\n" + +#: vacuumdb.c:1040 +msgid " --no-truncate don't truncate empty pages at the end of the table\n" +msgstr " --no-truncate 不要截断表末尾的空白页\n" + +#: vacuumdb.c:1041 +#, c-format +msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" +msgstr " -P, --parallel=PARALLEL_WORKERS 如果可以的话,用这么多的后台工作来制作真空\n" + +#: vacuumdb.c:1042 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet 不写任何信息\n" -#: vacuumdb.c:1229 +#: vacuumdb.c:1043 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr " --skip-locked 跳过不能立即锁定的关系\n" -#: vacuumdb.c:1230 +#: vacuumdb.c:1044 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr " -t, --table='TABLE[(COLUMNS)]' 只清理指定的表\n" -#: vacuumdb.c:1231 +#: vacuumdb.c:1045 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose 写大量的输出\n" -#: vacuumdb.c:1232 +#: vacuumdb.c:1046 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 输出版本信息, 然后退出\n" -#: vacuumdb.c:1233 +#: vacuumdb.c:1047 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze 更新优化器统计\n" -#: vacuumdb.c:1234 +#: vacuumdb.c:1048 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr " -Z, --analyze-only 只更新优化器统计信息,但不做清理\n" -#: vacuumdb.c:1235 +#: vacuumdb.c:1049 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1070,12 +1131,12 @@ msgstr "" " --analyze-in-stages 只更新优化器统计, 为了更快得到结果分多阶段;\n" " 不做清理\n" -#: vacuumdb.c:1237 +#: vacuumdb.c:1051 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 显示此帮助信息, 然后退出\n" -#: vacuumdb.c:1245 +#: vacuumdb.c:1059 #, c-format msgid "" "\n" diff --git a/src/interfaces/ecpg/ecpglib/nls.mk b/src/interfaces/ecpg/ecpglib/nls.mk index 3223a039b4..2f6b0895f5 100644 --- a/src/interfaces/ecpg/ecpglib/nls.mk +++ b/src/interfaces/ecpg/ecpglib/nls.mk @@ -1,6 +1,6 @@ # src/interfaces/ecpg/ecpglib/nls.mk CATALOG_NAME = ecpglib -AVAIL_LANGUAGES = cs de es fr it ja ko pl pt_BR ru sv tr uk vi zh_CN +AVAIL_LANGUAGES = cs de el es fr it ja ko pl pt_BR ru sv tr uk vi zh_CN GETTEXT_FILES = connect.c descriptor.c error.c execute.c misc.c GETTEXT_TRIGGERS = ecpg_gettext GETTEXT_FLAGS = ecpg_gettext:1:pass-c-format diff --git a/src/interfaces/ecpg/ecpglib/po/el.po b/src/interfaces/ecpg/ecpglib/po/el.po new file mode 100644 index 0000000000..1aa9583c08 --- /dev/null +++ b/src/interfaces/ecpg/ecpglib/po/el.po @@ -0,0 +1,200 @@ +# Greek message translation file for ecpglib +# Copyright (C) 2021 PostgreSQL Global Development Group +# This file is distributed under the same license as the ecpglib (PostgreSQL) package. +# Georgios Kokolatos , 2021. +# +msgid "" +msgstr "" +"Project-Id-Version: ecpglib (PostgreSQL) 14\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2021-08-20 09:09+0000\n" +"PO-Revision-Date: 2021-08-23 10:40+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.0\n" +"Last-Translator: Georgios Kokolatos \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: el\n" + +#: connect.c:237 +msgid "empty message text" +msgstr "κενό κείμενο μηνύματος" + +#: connect.c:405 connect.c:627 +msgid "" +msgstr "" + +#: descriptor.c:871 misc.c:119 +msgid "NULL" +msgstr "NULL" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:33 +#, c-format +msgid "no data found on line %d" +msgstr "δεν βρέθηκαν δεδομένα στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:40 +#, c-format +msgid "out of memory on line %d" +msgstr "έλλειψη μνήμης στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:47 +#, c-format +msgid "unsupported type \"%s\" on line %d" +msgstr "μη υποστηριζόμενος τύπος «%s» στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:54 +#, c-format +msgid "too many arguments on line %d" +msgstr "πάρα πολλές παράμετροι στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:61 +#, c-format +msgid "too few arguments on line %d" +msgstr "πολύ λίγες παράμετροι στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:68 +#, c-format +msgid "invalid input syntax for type int: \"%s\", on line %d" +msgstr "μη έγκυρη σύνταξη εισόδου για τύπο int: «%s», στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:75 +#, c-format +msgid "invalid input syntax for type unsigned int: \"%s\", on line %d" +msgstr "μη έγκυρη σύνταξη εισόδου για τύπο unsigned int: «%s», στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:82 +#, c-format +msgid "invalid input syntax for floating-point type: \"%s\", on line %d" +msgstr "μη έγκυρη σύνταξη εισόδου για τύπο floating-point: «%s», on-line %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:90 +#, c-format +msgid "invalid syntax for type boolean: \"%s\", on line %d" +msgstr "μη έγκυρη σύνταξη για τύπο boolean: «%s», στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:95 +#, c-format +msgid "could not convert boolean value: size mismatch, on line %d" +msgstr "δεν ήταν δυνατή η μετατροπή της δυαδικής τιμής: αναντιστοιχία μεγέθους, στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:102 +#, c-format +msgid "empty query on line %d" +msgstr "άδειο ερώτημα στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:109 +#, c-format +msgid "null value without indicator on line %d" +msgstr "τιμή null χωρίς ένδειξη στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:116 +#, c-format +msgid "variable does not have an array type on line %d" +msgstr "η μεταβλητή δεν έχει τύπο συστάδας στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:123 +#, c-format +msgid "data read from server is not an array on line %d" +msgstr "τα δεδομένα που διαβάζονται από το διακομιστή δεν είναι μία συστάδα στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:130 +#, c-format +msgid "inserting an array of variables is not supported on line %d" +msgstr "η εισαγωγή μίας συστάδας μεταβλητών δεν υποστηρίζεται στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:137 +#, c-format +msgid "connection \"%s\" does not exist on line %d" +msgstr "η σύνδεση «%s» δεν υπάρχει στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:144 +#, c-format +msgid "not connected to connection \"%s\" on line %d" +msgstr "δεν έχει συνδεθεί στη σύνδεση «%s» στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:151 +#, c-format +msgid "invalid statement name \"%s\" on line %d" +msgstr "μη έγκυρο όνομα δήλωσης «%s» στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:158 +#, c-format +msgid "descriptor \"%s\" not found on line %d" +msgstr "περιγραφέας «%s» δεν βρέθηκε στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:165 +#, c-format +msgid "descriptor index out of range on line %d" +msgstr "ευρετήριο περιγραφέα εκτός εύρους στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:172 +#, c-format +msgid "unrecognized descriptor item \"%s\" on line %d" +msgstr "μη αναγνωρίσιμο στοιχείο περιγραφέα «%s» στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:179 +#, c-format +msgid "variable does not have a numeric type on line %d" +msgstr "η μεταβλητή δεν έχει αριθμητικό τύπο στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:186 +#, c-format +msgid "variable does not have a character type on line %d" +msgstr "η μεταβλητή δεν έχει τύπο χαρακτήρα στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:193 +#, c-format +msgid "error in transaction processing on line %d" +msgstr "σφάλμα κατά την επεξεργασία συναλλαγής στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:200 +#, c-format +msgid "could not connect to database \"%s\" on line %d" +msgstr "δεν ήταν δυνατή η σύνδεση στη βάση δεδομένων «%s» στη γραμμή %d" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:207 +#, c-format +msgid "SQL error %d on line %d" +msgstr "SQL σφάλμα %d στη γραμμή %d" + +#: error.c:254 +msgid "the connection to the server was lost" +msgstr "η σύνδεση στον διακομιστή χάθηκε" + +#: error.c:346 +#, c-format +msgid "SQL error: %s\n" +msgstr "SQL σφάλμα: %s\n" + +#: execute.c:2196 execute.c:2203 +msgid "" +msgstr "" diff --git a/src/interfaces/ecpg/ecpglib/po/es.po b/src/interfaces/ecpg/ecpglib/po/es.po index ad56d88968..b8f7666b3c 100644 --- a/src/interfaces/ecpg/ecpglib/po/es.po +++ b/src/interfaces/ecpg/ecpglib/po/es.po @@ -1,13 +1,13 @@ # Spanish message translation file for ecpglib # -# Copyright (c) 2009-2019, PostgreSQL Global Development Group +# Copyright (c) 2009-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Emanuel Calvo Franco , 2009. # msgid "" msgstr "" -"Project-Id-Version: ecpglib (PostgreSQL) 12\n" +"Project-Id-Version: ecpglib (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2020-09-13 10:39+0000\n" "PO-Revision-Date: 2019-06-06 17:20-0400\n" diff --git a/src/interfaces/ecpg/ecpglib/po/fr.po b/src/interfaces/ecpg/ecpglib/po/fr.po index 5f6c7d7f43..e976d5cb0e 100644 --- a/src/interfaces/ecpg/ecpglib/po/fr.po +++ b/src/interfaces/ecpg/ecpglib/po/fr.po @@ -1,23 +1,26 @@ -# translation of ecpglib.po to fr_fr -# french message translation file for ecpglib +# LANGUAGE message translation file for ecpglib +# Copyright (C) 2009-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the ecpglib (PostgreSQL) package. # # Use these quotes: « %s » # -# Guillaume Lelarge , 2009. # Stéphane Schildknecht , 2009. +# Guillaume Lelarge , 2010-2022. +# msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-09-20 12:38+0000\n" -"PO-Revision-Date: 2019-09-20 15:13+0200\n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" "Last-Translator: Guillaume Lelarge \n" -"Language-Team: PostgreSQLfr \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.3\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" #: connect.c:237 msgid "empty message text" diff --git a/src/interfaces/ecpg/ecpglib/po/ja.po b/src/interfaces/ecpg/ecpglib/po/ja.po index 8cd6def97b..1ce22396b3 100644 --- a/src/interfaces/ecpg/ecpglib/po/ja.po +++ b/src/interfaces/ecpg/ecpglib/po/ja.po @@ -1,12 +1,12 @@ # Japanese message translation file for ecpglib -# Copyright (C) 2019 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: ecpglib (PostgreSQL 12 beta 1)\n" +"Project-Id-Version: ecpglib (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-06-11 09:00+0900\n" +"POT-Creation-Date: 2022-05-11 14:16+0900\n" "PO-Revision-Date: 2019-06-11 09:04+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" @@ -21,11 +21,11 @@ msgstr "" msgid "empty message text" msgstr "メッセージテキストが空です" -#: connect.c:403 connect.c:432 connect.c:640 +#: connect.c:404 connect.c:633 msgid "" msgstr "<デフォルト>" -#: descriptor.c:887 misc.c:120 +#: descriptor.c:871 misc.c:119 msgid "NULL" msgstr "ヌル" @@ -69,15 +69,13 @@ msgstr "行番号%2$dにおいて、整数型に対して無効な入力構文 #: error.c:75 #, c-format msgid "invalid input syntax for type unsigned int: \"%s\", on line %d" -msgstr "" -"行番号%2$dにおいて、符号無し整数型に対して無効な入力構文があります:\"%1$s\"" +msgstr "行番号%2$dにおいて、符号無し整数型に対して無効な入力構文があります:\"%1$s\"" #. translator: this string will be truncated at 149 characters expanded. #: error.c:82 #, c-format msgid "invalid input syntax for floating-point type: \"%s\", on line %d" -msgstr "" -"行番号%2$dにおいて、浮動小数点型に対して無効な入力構文があります:\"%1$s\"" +msgstr "行番号%2$dにおいて、浮動小数点型に対して無効な入力構文があります:\"%1$s\"" #. translator: this string will be truncated at 149 characters expanded. #: error.c:90 @@ -184,25 +182,18 @@ msgstr "行番号%2$dにおいて、データベース\"%1$s\"に接続できま #. translator: this string will be truncated at 149 characters expanded. #: error.c:207 #, c-format -#| msgid "SQL error %d on line %d" -msgid "The cursor is invalid on line %d" -msgstr "行番号%dにおいて、カーソルが不正です" - -#. translator: this string will be truncated at 149 characters expanded. -#: error.c:214 -#, c-format msgid "SQL error %d on line %d" msgstr "行番号%2$dにおいて、SQLエラー%1$dがあります" -#: error.c:261 +#: error.c:254 msgid "the connection to the server was lost" msgstr "サーバへの接続が切れました" -#: error.c:354 +#: error.c:346 #, c-format msgid "SQL error: %s\n" msgstr "SQLエラー: %s\n" -#: execute.c:2187 execute.c:2194 +#: execute.c:2195 execute.c:2202 msgid "" msgstr "<空>" diff --git a/src/interfaces/ecpg/ecpglib/po/ru.po b/src/interfaces/ecpg/ecpglib/po/ru.po index 18f185aeac..2133fff5b5 100644 --- a/src/interfaces/ecpg/ecpglib/po/ru.po +++ b/src/interfaces/ecpg/ecpglib/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: ecpglib (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-03 11:22+0300\n" +"POT-Creation-Date: 2021-09-13 07:55+0300\n" "PO-Revision-Date: 2019-09-09 13:30+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -21,7 +21,7 @@ msgstr "" msgid "empty message text" msgstr "пустое сообщение" -#: connect.c:401 connect.c:430 connect.c:653 +#: connect.c:405 connect.c:634 msgid "" msgstr "<ПО_УМОЛЧАНИЮ>" @@ -191,7 +191,7 @@ msgstr "SQL-ошибка %d в строке %d" msgid "the connection to the server was lost" msgstr "подключение к серверу потеряно" -#: error.c:347 +#: error.c:346 #, c-format msgid "SQL error: %s\n" msgstr "ошибка SQL: %s\n" diff --git a/src/interfaces/ecpg/ecpglib/po/sv.po b/src/interfaces/ecpg/ecpglib/po/sv.po index 246e7ad374..7ccde101ca 100644 --- a/src/interfaces/ecpg/ecpglib/po/sv.po +++ b/src/interfaces/ecpg/ecpglib/po/sv.po @@ -1,14 +1,14 @@ # SWEDISH message translation file for ecpglib # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2020-04-10 02:39+0000\n" -"PO-Revision-Date: 2020-04-10 07:44+0200\n" +"PO-Revision-Date: 2021-11-07 10:36+0100\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" diff --git a/src/interfaces/ecpg/ecpglib/po/uk.po b/src/interfaces/ecpg/ecpglib/po/uk.po index 2310334996..4b01e9c2fd 100644 --- a/src/interfaces/ecpg/ecpglib/po/uk.po +++ b/src/interfaces/ecpg/ecpglib/po/uk.po @@ -2,11 +2,11 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:09+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" -"Last-Translator: pasha_golub\n" +"POT-Creation-Date: 2021-06-10 08:39+0000\n" +"PO-Revision-Date: 2021-08-17 10:54\n" +"Last-Translator: \n" "Language-Team: Ukrainian\n" -"Language: uk\n" +"Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -14,14 +14,14 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/ecpglib.pot\n" -"X-Crowdin-File-ID: 482\n" +"X-Crowdin-File: /REL_14_DEV/ecpglib.pot\n" +"X-Crowdin-File-ID: 746\n" #: connect.c:237 msgid "empty message text" msgstr "пусте повідомлення" -#: connect.c:401 connect.c:430 connect.c:653 +#: connect.c:405 connect.c:627 msgid "" msgstr "<ЗА_ЗАМОВЧУВАННЯМ>" @@ -189,7 +189,7 @@ msgstr "помилка SQL %d в рядку %d" msgid "the connection to the server was lost" msgstr "з'єднання із сервером втрачено" -#: error.c:347 +#: error.c:346 #, c-format msgid "SQL error: %s\n" msgstr "помилка SQL: %s\n" diff --git a/src/interfaces/ecpg/ecpglib/po/zh_CN.po b/src/interfaces/ecpg/ecpglib/po/zh_CN.po index 37e14bcdf4..d775d4fc89 100644 --- a/src/interfaces/ecpg/ecpglib/po/zh_CN.po +++ b/src/interfaces/ecpg/ecpglib/po/zh_CN.po @@ -5,26 +5,26 @@ # msgid "" msgstr "" -"Project-Id-Version: ecpglib (PostgreSQL) 12\n" +"Project-Id-Version: ecpglib (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-05-24 18:50+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:39+0000\n" +"PO-Revision-Date: 2021-08-15 18:50+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" #: connect.c:237 msgid "empty message text" msgstr "消息文本为空" -#: connect.c:403 connect.c:432 connect.c:640 +#: connect.c:405 connect.c:627 msgid "" msgstr "" -#: descriptor.c:888 misc.c:120 +#: descriptor.c:871 misc.c:119 msgid "NULL" msgstr "NULL" @@ -181,24 +181,19 @@ msgstr "在第%2$d行上无法连接数据库\"%1$s\"" #. translator: this string will be truncated at 149 characters expanded. #: error.c:207 #, c-format -msgid "The cursor is invalid on line %d" -msgstr "游标在第%d行无效" - -#. translator: this string will be truncated at 149 characters expanded. -#: error.c:214 -#, c-format msgid "SQL error %d on line %d" msgstr "在第%2$d行上的SQL命令发生错误 代码%1$d" -#: error.c:261 +#: error.c:254 msgid "the connection to the server was lost" msgstr "与服务器的连接丢失" -#: error.c:354 +#: error.c:346 #, c-format msgid "SQL error: %s\n" msgstr "SQL语句错误: %s\n" -#: execute.c:2174 execute.c:2181 +#: execute.c:2196 execute.c:2203 msgid "" msgstr "<空>" + diff --git a/src/interfaces/ecpg/preproc/nls.mk b/src/interfaces/ecpg/preproc/nls.mk index 98ce9c0983..fed0f7c9e5 100644 --- a/src/interfaces/ecpg/preproc/nls.mk +++ b/src/interfaces/ecpg/preproc/nls.mk @@ -1,6 +1,6 @@ # src/interfaces/ecpg/preproc/nls.mk CATALOG_NAME = ecpg -AVAIL_LANGUAGES = cs de es fr it ja ko pl pt_BR ru sv tr uk vi zh_CN zh_TW +AVAIL_LANGUAGES = cs de el es fr it ja ko pl pt_BR ru sv tr uk vi zh_CN zh_TW GETTEXT_FILES = descriptor.c ecpg.c pgc.c preproc.c type.c variable.c GETTEXT_TRIGGERS = mmerror:3 mmfatal:2 GETTEXT_FLAGS = mmerror:3:c-format mmfatal:2:c-format diff --git a/src/interfaces/ecpg/preproc/po/cs.po b/src/interfaces/ecpg/preproc/po/cs.po index e7d2c0cdb0..0112bad6bd 100644 --- a/src/interfaces/ecpg/preproc/po/cs.po +++ b/src/interfaces/ecpg/preproc/po/cs.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: ecpg-cs (PostgreSQL 9.3)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2020-10-31 16:09+0000\n" -"PO-Revision-Date: 2020-10-31 21:47+0100\n" +"PO-Revision-Date: 2021-09-16 09:06+0200\n" "Last-Translator: Tomas Vondra \n" "Language-Team: Czech \n" "Language: cs\n" @@ -124,7 +124,7 @@ msgstr " -I ADRESÁŘ vyhledá include soubory v ADRESÁŘi\n" #: ecpg.c:52 #, c-format msgid " -o OUTFILE write result to OUTFILE\n" -msgstr " -o SOUBOR zapíše výsledek do SOUBORu\n" +msgstr " -o SOUBOR zapíše výsledek do SOUBORu\n" #: ecpg.c:53 #, c-format @@ -132,7 +132,7 @@ msgid "" " -r OPTION specify run-time behavior; OPTION can be:\n" " \"no_indicator\", \"prepare\", \"questionmarks\"\n" msgstr "" -" -r VOLBA určuje run-time chování; VOLBA může být:\n" +" -r VOLBA určuje run-time chování; VOLBA může být:\n" " \"no_indicator\", \"prepare\", \"questionmarks\"\n" #: ecpg.c:55 @@ -148,7 +148,7 @@ msgstr " -t zapne autocommit transakcí\n" #: ecpg.c:57 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version vypíše informaci o verzi, poté skončí\n" +msgstr " -V, --version vypíše informaci o verzi, poté skončí\n" #: ecpg.c:58 #, c-format diff --git a/src/interfaces/ecpg/preproc/po/de.po b/src/interfaces/ecpg/preproc/po/de.po index dc7d32bb35..9575a1a296 100644 --- a/src/interfaces/ecpg/preproc/po/de.po +++ b/src/interfaces/ecpg/preproc/po/de.po @@ -1,15 +1,15 @@ # German message translation file for ecpg -# Copyright (C) 2009-2021 PostgreSQL Global Development Group +# Copyright (C) 2009-2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-14 08:39+0000\n" -"PO-Revision-Date: 2021-05-14 14:37+0200\n" +"POT-Creation-Date: 2022-05-08 07:39+0000\n" +"PO-Revision-Date: 2022-05-08 13:50+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -23,32 +23,37 @@ msgstr "" msgid "variable \"%s\" must have a numeric type" msgstr "Variable »%s« muss einen numerischen Typ haben" -#: descriptor.c:124 descriptor.c:146 +#: descriptor.c:125 descriptor.c:156 #, c-format -msgid "descriptor \"%s\" does not exist" -msgstr "Deskriptor »%s« existiert nicht" +msgid "descriptor %s bound to connection %s does not exist" +msgstr "Deskriptor %s gebunden an Verbindung %s existiert nicht" -#: descriptor.c:161 descriptor.c:213 +#: descriptor.c:127 descriptor.c:158 +#, c-format +msgid "descriptor %s bound to the default connection does not exist" +msgstr "Deskriptor %s gebunden an die Standardverbindung existiert nicht" + +#: descriptor.c:173 descriptor.c:225 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "Deskriptorkopfelement »%d« existiert nicht" -#: descriptor.c:183 +#: descriptor.c:195 #, c-format msgid "nullable is always 1" msgstr "nullable ist immer 1" -#: descriptor.c:186 +#: descriptor.c:198 #, c-format msgid "key_member is always 0" msgstr "key_member ist immer 0" -#: descriptor.c:280 +#: descriptor.c:292 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "Deskriptorelement »%s« ist nicht implementiert" -#: descriptor.c:290 +#: descriptor.c:302 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "Deskriptorelement »%s« kann nicht gesetzt werden" @@ -230,117 +235,127 @@ msgstr "Cursor »%s« wurde deklariert aber nicht geöffnet" msgid "could not remove output file \"%s\"\n" msgstr "konnte Ausgabedatei »%s« nicht entfernen\n" -#: pgc.l:502 +#: pgc.l:508 #, c-format msgid "unterminated /* comment" msgstr "/*-Kommentar nicht abgeschlossen" -#: pgc.l:519 +#: pgc.l:525 #, c-format msgid "unterminated bit string literal" msgstr "Bitkettenkonstante nicht abgeschlossen" -#: pgc.l:527 +#: pgc.l:533 #, c-format msgid "unterminated hexadecimal string literal" msgstr "hexadezimale Zeichenkette nicht abgeschlossen" -#: pgc.l:602 +#: pgc.l:608 #, c-format msgid "invalid bit string literal" msgstr "ungültige Bitkettenkonstante" -#: pgc.l:607 +#: pgc.l:613 #, c-format -msgid "invalid hex string literal" +msgid "invalid hexadecimal string literal" msgstr "ungültige hexadezimale Zeichenkettenkonstante" -#: pgc.l:625 +#: pgc.l:631 #, c-format msgid "unhandled previous state in xqs\n" msgstr "unbehandelter vorheriger Zustand in xqs\n" -#: pgc.l:651 pgc.l:760 +#: pgc.l:657 pgc.l:766 #, c-format msgid "unterminated quoted string" msgstr "Zeichenkette in Anführungszeichen nicht abgeschlossen" -#: pgc.l:702 +#: pgc.l:708 #, c-format msgid "unterminated dollar-quoted string" msgstr "Dollar-Quotes nicht abgeschlossen" -#: pgc.l:720 pgc.l:740 +#: pgc.l:726 pgc.l:746 #, c-format msgid "zero-length delimited identifier" msgstr "Bezeichner in Anführungszeichen hat Länge null" -#: pgc.l:751 +#: pgc.l:757 #, c-format msgid "unterminated quoted identifier" msgstr "Bezeichner in Anführungszeichen nicht abgeschlossen" -#: pgc.l:1082 +#: pgc.l:926 +#, c-format +msgid "trailing junk after parameter" +msgstr "Müll folgt auf Parameter" + +#: pgc.l:968 pgc.l:971 pgc.l:974 +#, c-format +msgid "trailing junk after numeric literal" +msgstr "Müll folgt auf numerische Konstante" + +#: pgc.l:1100 #, c-format msgid "nested /* ... */ comments" msgstr "geschachtelte /* ... */-Kommentare" -#: pgc.l:1175 +#: pgc.l:1193 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "fehlender Bezeichner im Befehl EXEC SQL UNDEF" -#: pgc.l:1193 pgc.l:1206 pgc.l:1222 pgc.l:1235 +#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 #, c-format msgid "too many nested EXEC SQL IFDEF conditions" msgstr "zu viele verschachtelte EXEC SQL IFDEF-Bedingungen" -#: pgc.l:1251 pgc.l:1262 pgc.l:1277 pgc.l:1299 +#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "passendes »EXEC SQL IFDEF« / »EXEC SQL IFNDEF« fehlt" -#: pgc.l:1253 pgc.l:1264 pgc.l:1445 +#: pgc.l:1271 pgc.l:1282 pgc.l:1463 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "»EXEC SQL ENDIF;« fehlt" -#: pgc.l:1279 pgc.l:1301 +#: pgc.l:1297 pgc.l:1319 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "mehr als ein EXEC SQL ENDIF" -#: pgc.l:1324 pgc.l:1338 +#: pgc.l:1342 pgc.l:1356 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "unzusammenhängendes EXEC SQL ENDIF" -#: pgc.l:1393 +#: pgc.l:1411 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "fehlender Bezeichner im Befehl EXEC SQL IFDEF" -#: pgc.l:1402 +#: pgc.l:1420 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "fehlender Bezeichner im Befehl EXEC SQL DEFINE" -#: pgc.l:1435 +#: pgc.l:1453 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "Syntaxfehler im Befehl EXEC SQL INCLUDE" -#: pgc.l:1485 +#: pgc.l:1503 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "interner Fehler: unerreichbarer Zustand; bitte an <%s> berichten" -#: pgc.l:1637 +#: pgc.l:1655 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "Fehler: Include-Pfad »%s/%s« ist zu lang auf Zeile %d, wird übersprungen\n" -#: pgc.l:1660 +#: pgc.l:1678 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "konnte Include-Datei »%s« nicht öffnen auf Zeile %d" @@ -374,195 +389,195 @@ msgstr "Initialisierungswert nicht erlaubt in Typdefinition" msgid "type name \"string\" is reserved in Informix mode" msgstr "Typname »string« ist im Informix-Modus reserviert" -#: preproc.y:552 preproc.y:17682 +#: preproc.y:552 preproc.y:19317 #, c-format msgid "type \"%s\" is already defined" msgstr "Typ »%s« ist bereits definiert" -#: preproc.y:577 preproc.y:18325 preproc.y:18650 variable.c:621 +#: preproc.y:577 preproc.y:19952 preproc.y:20277 variable.c:621 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "mehrdimensionale Arrays für einfache Datentypen werden nicht unterstützt" -#: preproc.y:1752 +#: preproc.y:599 +#, c-format +msgid "connection %s is overwritten with %s by DECLARE statement %s" +msgstr "Verbindung %s wird mit %s überschrieben, durch DECLARE-Anweisung %s" + +#: preproc.y:1872 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "AT-Option ist nicht erlaubt im Befehl CLOSE DATABASE" -#: preproc.y:2000 +#: preproc.y:2122 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "AT-Option ist nicht erlaubt im Befehl CONNECT" -#: preproc.y:2038 +#: preproc.y:2162 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "AT-Option ist nicht erlaubt im Befehl DISCONNECT" -#: preproc.y:2093 +#: preproc.y:2217 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "AT-Option ist nicht erlaubt im Befehl SET CONNECTION" -#: preproc.y:2115 +#: preproc.y:2239 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "AT-Option ist nicht erlaubt im TYPE-Befehl" -#: preproc.y:2124 +#: preproc.y:2248 #, c-format msgid "AT option not allowed in VAR statement" msgstr "AT-Option ist nicht erlaubt im VAR-Befehl" -#: preproc.y:2131 +#: preproc.y:2255 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "AT-Option ist nicht erlaubt im WHENEVER-Befehl" -#: preproc.y:2208 preproc.y:2380 preproc.y:2385 preproc.y:2508 preproc.y:4128 -#: preproc.y:4792 preproc.y:5325 preproc.y:5663 preproc.y:5963 preproc.y:7531 -#: preproc.y:9099 preproc.y:9104 preproc.y:11932 +#: preproc.y:2332 preproc.y:2504 preproc.y:2509 preproc.y:2632 preproc.y:4283 +#: preproc.y:4357 preproc.y:4948 preproc.y:5481 preproc.y:5819 preproc.y:6119 +#: preproc.y:7687 preproc.y:9288 preproc.y:9293 preproc.y:12272 #, c-format msgid "unsupported feature will be passed to server" msgstr "nicht mehr unterstütztes Feature wird an Server weitergereicht werden" -#: preproc.y:2766 +#: preproc.y:2890 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL ist nicht implementiert" -#: preproc.y:3461 +#: preproc.y:3589 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN ist nicht implementiert" -#: preproc.y:10031 preproc.y:17257 +#: preproc.y:10335 preproc.y:18892 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "»database« kann im INFORMIX-Modus nicht als Cursorname verwendet werden" -#: preproc.y:10038 preproc.y:17267 +#: preproc.y:10342 preproc.y:18902 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "Verwendung der Variable »%s« in verschiedenen DECLARE-Anweisungen wird nicht unterstützt" -#: preproc.y:10040 preproc.y:17269 +#: preproc.y:10344 preproc.y:18904 #, c-format msgid "cursor \"%s\" is already defined" msgstr "Cursor »%s« ist bereits definiert" -#: preproc.y:10514 +#: preproc.y:10818 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "nicht mehr unterstützte Syntax LIMIT x,y wird an Server weitergereicht" -#: preproc.y:10847 preproc.y:10854 +#: preproc.y:11151 preproc.y:11158 #, c-format msgid "subquery in FROM must have an alias" msgstr "Unteranfrage in FROM muss Aliasnamen erhalten" -#: preproc.y:16949 preproc.y:16956 +#: preproc.y:18584 preproc.y:18591 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS kann INTO nicht verwenden" -#: preproc.y:16992 +#: preproc.y:18627 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "»@« erwartet, »%s« gefunden" -#: preproc.y:17004 +#: preproc.y:18639 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "er werden nur die Protokolle »tcp« und »unix« und der Datenbanktyp »postgresql« unterstützt" -#: preproc.y:17007 +#: preproc.y:18642 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "»://« erwartet, »%s« gefunden" -#: preproc.y:17012 +#: preproc.y:18647 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Unix-Domain-Sockets funktionieren nur mit »localhost«, aber nicht mit »%s«" -#: preproc.y:17038 +#: preproc.y:18673 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "»postgresql« erwartet, »%s« gefunden" -#: preproc.y:17041 +#: preproc.y:18676 #, c-format msgid "invalid connection type: %s" msgstr "ungültiger Verbindungstyp: %s" -#: preproc.y:17050 +#: preproc.y:18685 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "»@« oder »://« erwartet, »%s« gefunden" -#: preproc.y:17125 preproc.y:17143 +#: preproc.y:18760 preproc.y:18778 #, c-format msgid "invalid data type" msgstr "ungültiger Datentyp" -#: preproc.y:17154 preproc.y:17171 +#: preproc.y:18789 preproc.y:18806 #, c-format msgid "incomplete statement" msgstr "unvollständige Anweisung" -#: preproc.y:17157 preproc.y:17174 +#: preproc.y:18792 preproc.y:18809 #, c-format msgid "unrecognized token \"%s\"" msgstr "nicht erkanntes Token »%s«" -#: preproc.y:17219 +#: preproc.y:18854 #, c-format msgid "name \"%s\" is already declared" msgstr "Name »%s« ist bereits deklariert" -#: preproc.y:17485 +#: preproc.y:19120 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "nur die Datentypen NUMERIC und DECIMAL haben Argumente für Präzision und Skala" -#: preproc.y:17497 +#: preproc.y:19132 #, c-format msgid "interval specification not allowed here" msgstr "Intervallangabe hier nicht erlaubt" -#: preproc.y:17657 preproc.y:17709 +#: preproc.y:19292 preproc.y:19344 #, c-format msgid "too many levels in nested structure/union definition" msgstr "zu viele Ebenen in verschachtelter Definition von Struktur/Union" -#: preproc.y:17832 +#: preproc.y:19467 #, c-format msgid "pointers to varchar are not implemented" msgstr "Zeiger auf varchar sind nicht implementiert" -#: preproc.y:18019 preproc.y:18044 -#, c-format -msgid "using unsupported DESCRIBE statement" -msgstr "nicht unterstützter DESCRIBE-Befehl wird verwendet" - -#: preproc.y:18291 +#: preproc.y:19918 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "Initialisierungswert nicht erlaubt in Befehl EXEC SQL VAR" -#: preproc.y:18608 +#: preproc.y:20235 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "Array aus Indikatoren bei der Eingabe nicht erlaubt" -#: preproc.y:18795 +#: preproc.y:20422 #, c-format msgid "operator not allowed in variable definition" msgstr "Operator nicht erlaubt in Variablendefinition" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:18836 +#: preproc.y:20463 #, c-format msgid "%s at or near \"%s\"" msgstr "%s bei »%s«" diff --git a/src/interfaces/ecpg/preproc/po/el.po b/src/interfaces/ecpg/preproc/po/el.po new file mode 100644 index 0000000000..e0e1d55046 --- /dev/null +++ b/src/interfaces/ecpg/preproc/po/el.po @@ -0,0 +1,700 @@ +# Greek message translation file for ecpg +# Copyright (C) 2021 PostgreSQL Global Development Group +# This file is distributed under the same license as the ecpg (PostgreSQL) package. +# Georgios Kokolatos , 2021. +# +msgid "" +msgstr "" +"Project-Id-Version: ecpg (PostgreSQL) 14\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2021-11-03 18:09+0000\n" +"PO-Revision-Date: 2021-11-05 11:17+0100\n" +"Last-Translator: Georgios Kokolatos \n" +"Language-Team: \n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.0\n" + +#: descriptor.c:64 +#, c-format +msgid "variable \"%s\" must have a numeric type" +msgstr "η μεταβλητή «%s» πρέπει να έχει αριθμητικό τύπο" + +#: descriptor.c:125 descriptor.c:156 +#, c-format +msgid "descriptor %s bound to connection %s does not exist" +msgstr "ο περιγραφέας %s δεσμευμένος στη σύνδεση %s δεν υπάρχει" + +#: descriptor.c:127 descriptor.c:158 +#, c-format +msgid "descriptor %s bound to the default connection does not exist" +msgstr "ο περιγραφέας %s δεσμευμένος στη προεπιλεγμένη σύνδεση δεν υπάρχει" + +#: descriptor.c:173 descriptor.c:225 +#, c-format +msgid "descriptor header item \"%d\" does not exist" +msgstr "ο περιγραφέας στοιχείου κεφαλίδας «%d» δεν υπάρχει" + +#: descriptor.c:195 +#, c-format +msgid "nullable is always 1" +msgstr "nullable είναι πάντα 1" + +#: descriptor.c:198 +#, c-format +msgid "key_member is always 0" +msgstr "key_member είναι πάντα 0" + +#: descriptor.c:292 +#, c-format +msgid "descriptor item \"%s\" is not implemented" +msgstr "το στοιχείο περιγραφής «%s» δεν έχει υλοποιηθεί" + +#: descriptor.c:302 +#, c-format +msgid "descriptor item \"%s\" cannot be set" +msgstr "το στοιχείο περιγραφής «%s» δεν δύναται να οριστεί" + +#: ecpg.c:36 +#, c-format +msgid "" +"%s is the PostgreSQL embedded SQL preprocessor for C programs.\n" +"\n" +msgstr "" +"%s είναι ο ενσωματωμένος SQL προεπεξεργαστής της PostgreSQL για προγράμματα γραμμένα σε C.\n" +"\n" + +#: ecpg.c:38 +#, c-format +msgid "" +"Usage:\n" +" %s [OPTION]... FILE...\n" +"\n" +msgstr "" +"Χρήση:\n" +" %s [ΕΠΙΛΟΓΗ]... ΑΡΧΕΙΟ...\n" +"\n" + +#: ecpg.c:41 +#, c-format +msgid "Options:\n" +msgstr "Επιλογές:\n" + +#: ecpg.c:42 +#, c-format +msgid "" +" -c automatically generate C code from embedded SQL code;\n" +" this affects EXEC SQL TYPE\n" +msgstr "" +" -c δημιούργησε αυτόματα κώδικα σε C από ενσωματωμένο SQL κώδικα·\n" +" αυτό επηρεάζει την εντολή EXEC SQL TYPE\n" + +#: ecpg.c:44 +#, c-format +msgid "" +" -C MODE set compatibility mode; MODE can be one of\n" +" \"INFORMIX\", \"INFORMIX_SE\", \"ORACLE\"\n" +msgstr "" +" -C MODE όρισε λειτουργία συμβατότητας; MODE μπορεί να είναι ένα από\n" +" «INFORMIX», «INFORMIX_SE», «ORACLE»\n" + +#: ecpg.c:47 +#, c-format +msgid " -d generate parser debug output\n" +msgstr " -d παράξε έξοδο αποσφαλμάτωσης parser\n" + +#: ecpg.c:49 +#, c-format +msgid " -D SYMBOL define SYMBOL\n" +msgstr " -D SYMBOL όρισε SYMBOL\n" + +#: ecpg.c:50 +#, c-format +msgid " -h parse a header file, this option includes option \"-c\"\n" +msgstr " -h ανάλυσε αρχείο header, αυτή η επιλογή περιλαμβάνει την επιλογή «-c»\n" + +#: ecpg.c:51 +#, c-format +msgid " -i parse system include files as well\n" +msgstr " -i ανάλυσε επίσης αρχεία include του συστήματος\n" + +#: ecpg.c:52 +#, c-format +msgid " -I DIRECTORY search DIRECTORY for include files\n" +msgstr " -I DIRECTORY ψάξε στο DIRECTORY για αρχεία include\n" + +#: ecpg.c:53 +#, c-format +msgid " -o OUTFILE write result to OUTFILE\n" +msgstr " -o OUTFILE γράψε το αποτέλεσμα στο αρχείο OUTFILE\n" + +#: ecpg.c:54 +#, c-format +msgid "" +" -r OPTION specify run-time behavior; OPTION can be:\n" +" \"no_indicator\", \"prepare\", \"questionmarks\"\n" +msgstr "" +" -r OPTION καθόρισε τη συμπεριφορά χρόνου εκτέλεσης. OPTION μπορεί να είναι:\n" +" «no_indicator», «prepare», «questionmarks»\n" + +#: ecpg.c:56 +#, c-format +msgid " --regression run in regression testing mode\n" +msgstr " --regression εκτέλεσε σε λειτουργία ελέγχου αναδρομής\n" + +#: ecpg.c:57 +#, c-format +msgid " -t turn on autocommit of transactions\n" +msgstr " -t ενεργοποίησε την αυτόματη ολοκλήρωση συναλλαγών\n" + +#: ecpg.c:58 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" + +#: ecpg.c:59 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" + +#: ecpg.c:60 +#, c-format +msgid "" +"\n" +"If no output file is specified, the name is formed by adding .c to the\n" +"input file name, after stripping off .pgc if present.\n" +msgstr "" +"\n" +"Εάν δεν καθοριστεί αρχείο εξόδου, το όνομα σχηματίζεται προσθέτοντας .c στο\n" +"όνομα αρχείου εισόδου, μετά την αφαίρεση του .pgc, εάν αυτό υπάρχει.\n" + +#: ecpg.c:62 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Υποβάλετε αναφορές σφάλματων σε <%s>.\n" + +#: ecpg.c:63 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s αρχική σελίδα: <%s>\n" + +#: ecpg.c:141 +#, c-format +msgid "%s: could not locate my own executable path\n" +msgstr "%s: δεν ήταν δυνατός ο εντοπισμός της ιδίας εκτελέσιμης διαδρομής\n" + +#: ecpg.c:176 ecpg.c:333 ecpg.c:344 +#, c-format +msgid "%s: could not open file \"%s\": %s\n" +msgstr "%s: δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %s\n" + +#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 +#, c-format +msgid "Try \"%s --help\" for more information.\n" +msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n" + +#: ecpg.c:243 +#, c-format +msgid "%s: parser debug support (-d) not available\n" +msgstr "%s: η υποστήριξη εντοπισμού σφαλμάτων (-d) του αναλυτή δεν είναι διαθέσιμη\n" + +#: ecpg.c:262 +#, c-format +msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" +msgstr "%s, ο ενσωματωμένος προεπεξεργαστής C της PostgreSQL, έκδοση %s\n" + +#: ecpg.c:264 +#, c-format +msgid "EXEC SQL INCLUDE ... search starts here:\n" +msgstr "EXEC SQL INCLUDE ... η αναζήτηση ξεκινάει εδώ:\n" + +#: ecpg.c:267 +#, c-format +msgid "end of search list\n" +msgstr "τέλος της λίστας αναζήτησης\n" + +#: ecpg.c:273 +#, c-format +msgid "%s: no input files specified\n" +msgstr "%s: δεν καθορίστηκαν αρχεία εισόδου\n" + +#: ecpg.c:477 +#, c-format +msgid "cursor \"%s\" has been declared but not opened" +msgstr "ο δρομέας «%s» έχει δηλωθεί αλλά δεν έχει ανοιχτεί" + +#: ecpg.c:490 preproc.y:130 +#, c-format +msgid "could not remove output file \"%s\"\n" +msgstr "δεν ήταν δυνατή η αφαίρεση του αρχείου εξόδου «%s»\n" + +#: pgc.l:502 +#, c-format +msgid "unterminated /* comment" +msgstr "ατερμάτιστο /* σχόλιο" + +#: pgc.l:519 +#, c-format +msgid "unterminated bit string literal" +msgstr "ατερμάτιστη bit κυριολεκτική συμβολοσειρά" + +#: pgc.l:527 +#, c-format +msgid "unterminated hexadecimal string literal" +msgstr "ατερμάτιστη δεκαεξαδική κυριολεκτική συμβολοσειρά" + +#: pgc.l:602 +#, c-format +msgid "invalid bit string literal" +msgstr "μη έγκυρη bit κυριολεκτική συμβολοσειρά" + +#: pgc.l:607 +#, c-format +msgid "invalid hex string literal" +msgstr "μη έγκυρη hex κυριολεκτική συμβολοσειρά" + +#: pgc.l:625 +#, c-format +msgid "unhandled previous state in xqs\n" +msgstr "μη χειρισμένη προηγούμενη κατάσταση σε xqs\n" + +#: pgc.l:651 pgc.l:760 +#, c-format +msgid "unterminated quoted string" +msgstr "ανολοκλήρωτη συμβολοσειρά με εισαγωγικά" + +#: pgc.l:702 +#, c-format +msgid "unterminated dollar-quoted string" +msgstr "ατερμάτιστη dollar-quoted συμβολοσειρά" + +#: pgc.l:720 pgc.l:740 +#, c-format +msgid "zero-length delimited identifier" +msgstr "μηδενικού μήκους οριοθετημένο αναγνωριστικό" + +#: pgc.l:751 +#, c-format +msgid "unterminated quoted identifier" +msgstr "ατερμάτιστο αναγνωριστικό σε εισαγωγικά" + +#: pgc.l:1082 +#, c-format +msgid "nested /* ... */ comments" +msgstr "ένθετα /* ... */ σχόλια" + +#: pgc.l:1175 +#, c-format +msgid "missing identifier in EXEC SQL UNDEF command" +msgstr "λείπει αναγνωριστικό στην εντολή EXEC SQL UNDEF" + +#: pgc.l:1193 pgc.l:1206 pgc.l:1222 pgc.l:1235 +#, c-format +msgid "too many nested EXEC SQL IFDEF conditions" +msgstr "πάρα πολλές ένθετες συνθήκες EXEC SQL IFDEF" + +#: pgc.l:1251 pgc.l:1262 pgc.l:1277 pgc.l:1299 +#, c-format +msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" +msgstr "λείπει αντιστοίχιση «EXEC SQL IFDEF» / «EXEC SQL IFNDEF»" + +#: pgc.l:1253 pgc.l:1264 pgc.l:1445 +#, c-format +msgid "missing \"EXEC SQL ENDIF;\"" +msgstr "λείπει «EXEC SQL ENDIF;»" + +#: pgc.l:1279 pgc.l:1301 +#, c-format +msgid "more than one EXEC SQL ELSE" +msgstr "περισσότερες από μία EXEC SQL ELSE" + +#: pgc.l:1324 pgc.l:1338 +#, c-format +msgid "unmatched EXEC SQL ENDIF" +msgstr "μη αντιστοιχισμένο EXEC SQL ENDIF" + +#: pgc.l:1393 +#, c-format +msgid "missing identifier in EXEC SQL IFDEF command" +msgstr "λείπει αναγνωριστικό στην εντολή EXEC SQL IFDEF" + +#: pgc.l:1402 +#, c-format +msgid "missing identifier in EXEC SQL DEFINE command" +msgstr "λείπει αναγνωριστικό στην εντολή EXEC SQL DEFINE" + +#: pgc.l:1435 +#, c-format +msgid "syntax error in EXEC SQL INCLUDE command" +msgstr "συντακτικό σφάλμα στην εντολή EXEC SQL INCLUDE" + +#: pgc.l:1485 +#, c-format +msgid "internal error: unreachable state; please report this to <%s>" +msgstr "εσωτερικό σφάλμα: μη δυνατή κατάσταση· Παρακαλούμε όπως το αναφέρετε σε <%s>" + +#: pgc.l:1637 +#, c-format +msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" +msgstr "Σφάλμα: η διαδρομή ενσωμάτωσης «%s/%s» είναι πολύ μακρυά στη γραμμή %d, παρακάμπτεται\n" + +#: pgc.l:1660 +#, c-format +msgid "could not open include file \"%s\" on line %d" +msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου ενσωμάτωσης «%s» στη γραμμή %d" + +#: preproc.y:31 +msgid "syntax error" +msgstr "συντακτικό σφάλμα" + +#: preproc.y:84 +#, c-format +msgid "WARNING: " +msgstr "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: " + +#: preproc.y:87 +#, c-format +msgid "ERROR: " +msgstr "ΣΦΑΛΜΑ: " + +#: preproc.y:514 +#, c-format +msgid "cursor \"%s\" does not exist" +msgstr "ο δρομέας «%s» δεν υπάρχει" + +#: preproc.y:543 +#, c-format +msgid "initializer not allowed in type definition" +msgstr "δεν επιτρέπεται εκκινητής σε ορισμό τύπου" + +#: preproc.y:545 +#, c-format +msgid "type name \"string\" is reserved in Informix mode" +msgstr "το όνομα τύπου «string» είναι δεσμευμένο σε λειτουργία Informix" + +#: preproc.y:552 preproc.y:17675 +#, c-format +msgid "type \"%s\" is already defined" +msgstr "ο τύπος «%s» έχει ήδη οριστεί" + +#: preproc.y:577 preproc.y:18310 preproc.y:18635 variable.c:621 +#, c-format +msgid "multidimensional arrays for simple data types are not supported" +msgstr "οι πολυδιάστατες συστυχίες για απλούς τύπους δεδομένων δεν υποστηρίζονται" + +#: preproc.y:599 +#, c-format +msgid "connection %s is overwritten with %s by DECLARE statement %s" +msgstr "η σύνδεση %s αντικαθίσταται με %s από τη δήλωση DECLARE %s" + +#: preproc.y:1753 +#, c-format +msgid "AT option not allowed in CLOSE DATABASE statement" +msgstr "η επιλογή AT δεν επιτρέπεται σε δήλωση CLOSE DATABASE" + +#: preproc.y:2001 +#, c-format +msgid "AT option not allowed in CONNECT statement" +msgstr "η επιλογή AT δεν επιτρέπεται σε δήλωση CONNECT" + +#: preproc.y:2041 +#, c-format +msgid "AT option not allowed in DISCONNECT statement" +msgstr "η επιλογή AT δεν επιτρέπεται σε δήλωση DISCONNECT" + +#: preproc.y:2096 +#, c-format +msgid "AT option not allowed in SET CONNECTION statement" +msgstr "η επιλογή AT δεν επιτρέπεται σε δήλωση SET CONNECTION" + +#: preproc.y:2118 +#, c-format +msgid "AT option not allowed in TYPE statement" +msgstr "η επιλογή AT δεν επιτρέπεται σε δήλωση TYPE" + +#: preproc.y:2127 +#, c-format +msgid "AT option not allowed in VAR statement" +msgstr "η επιλογή AT δεν επιτρέπεται σε δήλωση VAR" + +#: preproc.y:2134 +#, c-format +msgid "AT option not allowed in WHENEVER statement" +msgstr "η επιλογή AT δεν επιτρέπεται σε δήλωση WHENEVER" + +#: preproc.y:2211 preproc.y:2383 preproc.y:2388 preproc.y:2511 preproc.y:4143 +#: preproc.y:4807 preproc.y:5340 preproc.y:5678 preproc.y:5978 preproc.y:7514 +#: preproc.y:9082 preproc.y:9087 preproc.y:11915 +#, c-format +msgid "unsupported feature will be passed to server" +msgstr "μη υποστηριζόμενο χαρακτηριστικό που θα προωθηθεί στον διακομιστή" + +#: preproc.y:2769 +#, c-format +msgid "SHOW ALL is not implemented" +msgstr "SHOW ALL δεν είναι υλοποιημένο" + +#: preproc.y:3464 +#, c-format +msgid "COPY FROM STDIN is not implemented" +msgstr "COPY FROM STDIN δεν είναι υλοποιημένο" + +#: preproc.y:10014 preproc.y:17250 +#, c-format +msgid "\"database\" cannot be used as cursor name in INFORMIX mode" +msgstr "το «database» δεν μπορεί να χρησιμοποιηθεί ως όνομα δρομέα σε λειτουργία INFORMIX" + +#: preproc.y:10021 preproc.y:17260 +#, c-format +msgid "using variable \"%s\" in different declare statements is not supported" +msgstr "η χρήση της μεταβλητής «%s» σε διαφορετικές δηλώσεις προτάσεων δεν υποστηρίζεται" + +#: preproc.y:10023 preproc.y:17262 +#, c-format +msgid "cursor \"%s\" is already defined" +msgstr "ο δρομέας «%s» έχει ήδη οριστεί" + +#: preproc.y:10497 +#, c-format +msgid "no longer supported LIMIT #,# syntax passed to server" +msgstr "μη υποστηριζόμενη πλέον σύνταξη LIMIT #,# που θα προωθηθεί στον διακομιστή" + +#: preproc.y:10830 preproc.y:10837 +#, c-format +msgid "subquery in FROM must have an alias" +msgstr "υποερώτημα σε FROM πρέπει να έχει ένα alias" + +#: preproc.y:16942 preproc.y:16949 +#, c-format +msgid "CREATE TABLE AS cannot specify INTO" +msgstr "CREATE TABLE AS δεν δύναται να ορίσει INTO" + +#: preproc.y:16985 +#, c-format +msgid "expected \"@\", found \"%s\"" +msgstr "ανέμενε «@», βρήκε «%s»." + +#: preproc.y:16997 +#, c-format +msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" +msgstr "μόνο τα πρωτόκολλα \"TCP\" και \"UNIX\" και ο τύπος βάσης δεδομένων «postgresql» υποστηρίζονται" + +#: preproc.y:17000 +#, c-format +msgid "expected \"://\", found \"%s\"" +msgstr "ανέμενε «://», βρήκε «%s»." + +#: preproc.y:17005 +#, c-format +msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" +msgstr "οι υποδοχές πεδίου-Unix λειτουργούν μόνο στο «localhost» αλλά όχι στο «%s»" + +#: preproc.y:17031 +#, c-format +msgid "expected \"postgresql\", found \"%s\"" +msgstr "ανέμενε «postgresql», βρήκε «%s»." + +#: preproc.y:17034 +#, c-format +msgid "invalid connection type: %s" +msgstr "άκυρη επιλογή σύνδεσης: %s" + +#: preproc.y:17043 +#, c-format +msgid "expected \"@\" or \"://\", found \"%s\"" +msgstr "ανέμενε «@» ή «://», βρήκε «%s»." + +#: preproc.y:17118 preproc.y:17136 +#, c-format +msgid "invalid data type" +msgstr "μη έγκυρος τύπος δεδομένων" + +#: preproc.y:17147 preproc.y:17164 +#, c-format +msgid "incomplete statement" +msgstr "ανολοκλήρωτη δήλωση" + +#: preproc.y:17150 preproc.y:17167 +#, c-format +msgid "unrecognized token \"%s\"" +msgstr "μη αναγνωρίσιμο διακριτικό «%s»" + +#: preproc.y:17212 +#, c-format +msgid "name \"%s\" is already declared" +msgstr "το όνομα «%s» έχει ήδη δηλωθεί" + +#: preproc.y:17478 +#, c-format +msgid "only data types numeric and decimal have precision/scale argument" +msgstr "μόνο οι αριθμητικοί και δεκαδικοί τύποι δεδομένων έχουν όρισμα ακρίβειας/κλίμακας" + +#: preproc.y:17490 +#, c-format +msgid "interval specification not allowed here" +msgstr "προδιαγραφές διαστήματος δεν επιτρέπονται εδώ" + +#: preproc.y:17650 preproc.y:17702 +#, c-format +msgid "too many levels in nested structure/union definition" +msgstr "πάρα πολλά επίπεδα σε ένθετο ορισμό δομής/ένωσης" + +#: preproc.y:17825 +#, c-format +msgid "pointers to varchar are not implemented" +msgstr "δείκτες σε varchar δεν είναι υλοποιημένοι" + +#: preproc.y:18276 +#, c-format +msgid "initializer not allowed in EXEC SQL VAR command" +msgstr "δεν επιτρέπεται αρχικοποιητής σε εντολή EXEC SQL VAR" + +#: preproc.y:18593 +#, c-format +msgid "arrays of indicators are not allowed on input" +msgstr "δεν επιτρέπονται δείκτες συστάδων για είσοδο" + +#: preproc.y:18780 +#, c-format +msgid "operator not allowed in variable definition" +msgstr "δεν επιτρέπεται χειριστής σε ορισμό μεταβλητής" + +#. translator: %s is typically the translation of "syntax error" +#: preproc.y:18821 +#, c-format +msgid "%s at or near \"%s\"" +msgstr "%s σε ή κοντά σε «%s»" + +#: type.c:18 type.c:30 +#, c-format +msgid "out of memory" +msgstr "έλλειψη μνήμης" + +#: type.c:214 type.c:685 +#, c-format +msgid "unrecognized variable type code %d" +msgstr "μη αναγνωρίσιμος κωδικός τύπου μεταβλητής %d" + +#: type.c:263 +#, c-format +msgid "variable \"%s\" is hidden by a local variable of a different type" +msgstr "η μεταβλητή «%s» αποκρύπτεται από μια τοπική μεταβλητή διαφορετικού τύπου" + +#: type.c:265 +#, c-format +msgid "variable \"%s\" is hidden by a local variable" +msgstr "η μεταβλητή «%s» αποκρύπτεται από μια τοπική μεταβλητή" + +#: type.c:277 +#, c-format +msgid "indicator variable \"%s\" is hidden by a local variable of a different type" +msgstr "ο δείκτης μεταβλητής «%s» αποκρύπτεται από μια τοπική μεταβλητή διαφορετικού τύπου" + +#: type.c:279 +#, c-format +msgid "indicator variable \"%s\" is hidden by a local variable" +msgstr "ο δείκτης μεταβλητής «%s» αποκρύπτεται από μια τοπική μεταβλητή" + +#: type.c:287 +#, c-format +msgid "indicator for array/pointer has to be array/pointer" +msgstr "ο δείκτης για συστάδα/δείκτη πρέπει να είναι πίνακας/δείκτης" + +#: type.c:291 +#, c-format +msgid "nested arrays are not supported (except strings)" +msgstr "οι ένθετες συστάδες δεν υποστηρίζονται (εξαιρούνται οι συμβολοσειρές)" + +#: type.c:333 +#, c-format +msgid "indicator for struct has to be a struct" +msgstr "ο δείκτης για δομή πρέπει να είναι μια δομή" + +#: type.c:353 type.c:374 type.c:394 +#, c-format +msgid "indicator for simple data type has to be simple" +msgstr "ο δείκτης για απλό τύπο δεδομένων πρέπει να είναι απλός" + +#: type.c:625 +#, c-format +msgid "indicator struct \"%s\" has too few members" +msgstr "ο δείκτης δομής «%s» έχει πολύ λίγα μέλη" + +#: type.c:633 +#, c-format +msgid "indicator struct \"%s\" has too many members" +msgstr "ο δείκτης δομής «%s» έχει πάρα πολλά μέλη" + +#: type.c:744 +#, c-format +msgid "unrecognized descriptor item code %d" +msgstr "μη αναγνωρίσιμος κωδικός στοιχείου περιγραφέα %d" + +#: variable.c:89 variable.c:116 +#, c-format +msgid "incorrectly formed variable \"%s\"" +msgstr "εσφαλμένα σχηματισμένη μεταβλητή «%s»" + +#: variable.c:139 +#, c-format +msgid "variable \"%s\" is not a pointer" +msgstr "η μεταβλητή «%s» δεν είναι δείκτης" + +#: variable.c:142 variable.c:167 +#, c-format +msgid "variable \"%s\" is not a pointer to a structure or a union" +msgstr "η μεταβλητή «%s» δεν είναι δείκτης προς μια δομή ή μια ένωση" + +#: variable.c:154 +#, c-format +msgid "variable \"%s\" is neither a structure nor a union" +msgstr "η μεταβλητή «%s» δεν είναι ούτε δομή ούτε ένωση" + +#: variable.c:164 +#, c-format +msgid "variable \"%s\" is not an array" +msgstr "η μεταβλητή «%s» δεν είναι μία συστάδα" + +#: variable.c:233 variable.c:255 +#, c-format +msgid "variable \"%s\" is not declared" +msgstr "η μεταβλητή «%s» δεν έχει δηλωθεί" + +#: variable.c:494 +#, c-format +msgid "indicator variable must have an integer type" +msgstr "ο δείκτης μεταβλητής πρέπει να έχει ακέραιο τύπο" + +#: variable.c:506 +#, c-format +msgid "unrecognized data type name \"%s\"" +msgstr "μη αναγνωρίσιμο όνομα τύπου δεδομένων «%s»" + +#: variable.c:517 variable.c:525 variable.c:542 variable.c:545 +#, c-format +msgid "multidimensional arrays are not supported" +msgstr "οι πολυδιάστατες συστάδες δεν υποστηρίζονται" + +#: variable.c:534 +#, c-format +msgid "multilevel pointers (more than 2 levels) are not supported; found %d level" +msgid_plural "multilevel pointers (more than 2 levels) are not supported; found %d levels" +msgstr[0] "οι δείκτες πολλαπλών επιπέδων (περισσότερα από 2 επίπεδα) δεν υποστηρίζονται· βρέθηκε %d επίπεδο" +msgstr[1] "οι δείκτες πολλαπλών επιπέδων (περισσότερα από 2 επίπεδα) δεν υποστηρίζονται· βρέθηκαν %d επίπεδα" + +#: variable.c:539 +#, c-format +msgid "pointer to pointer is not supported for this data type" +msgstr "δεν υποστηρίζεται δείκτης προς δείκτη για αυτόν τον τύπο δεδομένων" + +#: variable.c:559 +#, c-format +msgid "multidimensional arrays for structures are not supported" +msgstr "οι πολυδιάστατες συστάδες για δομές δεν υποστηρίζονται" diff --git a/src/interfaces/ecpg/preproc/po/es.po b/src/interfaces/ecpg/preproc/po/es.po index 9d3a2c90fe..55186c7c08 100644 --- a/src/interfaces/ecpg/preproc/po/es.po +++ b/src/interfaces/ecpg/preproc/po/es.po @@ -1,19 +1,19 @@ # Spanish translation file for ecpg # -# Copyright (c) 2009-2019, PostgreSQL Global Development Group +# Copyright (c) 2009-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Emanuel Calvo Franco , 2009. # Alvaro Herrera , 2009-2012 # Franco Catena, , 2009 -# Carlos Chapi , 2018-2021 +# Carlos Chapi , 2018, 2021 # msgid "" msgstr "" -"Project-Id-Version: ecpg (PostgreSQL) 12\n" +"Project-Id-Version: ecpg (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-14 19:39+0000\n" -"PO-Revision-Date: 2021-05-19 22:22-0500\n" +"POT-Creation-Date: 2021-10-13 22:09+0000\n" +"PO-Revision-Date: 2021-10-13 23:43-0500\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -21,39 +21,44 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: BlackCAT 1.1\n" #: descriptor.c:64 #, c-format msgid "variable \"%s\" must have a numeric type" msgstr "la variable «%s» debe tener tipo numérico" -#: descriptor.c:124 descriptor.c:146 +#: descriptor.c:125 descriptor.c:156 #, c-format -msgid "descriptor \"%s\" does not exist" -msgstr "no existe el descriptor «%s»" +msgid "descriptor %s bound to connection %s does not exist" +msgstr "el descriptor %s vinculado a la conexión %s no existe" -#: descriptor.c:161 descriptor.c:213 +#: descriptor.c:127 descriptor.c:158 +#, c-format +msgid "descriptor %s bound to the default connection does not exist" +msgstr "el descriptor %s vinculado a la conexión predeterminada no existe" + +#: descriptor.c:173 descriptor.c:225 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "no existe el descriptor del elemento de cabecera «%d»" -#: descriptor.c:183 +#: descriptor.c:195 #, c-format msgid "nullable is always 1" msgstr "nullable es siempre 1" -#: descriptor.c:186 +#: descriptor.c:198 #, c-format msgid "key_member is always 0" msgstr "key_member es siempre 0" -#: descriptor.c:280 +#: descriptor.c:292 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "elemento del descriptor «%s» no está implementado" -#: descriptor.c:290 +#: descriptor.c:302 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "no se puede establecer el elemento del descriptor «%s»" @@ -124,7 +129,7 @@ msgstr " -i analiza además los archivos de inclusión de sistema\n #: ecpg.c:52 #, c-format msgid " -I DIRECTORY search DIRECTORY for include files\n" -msgstr " -I DIRECTORIO busca los archivos de inclusión en DIRECTORIO\n" +msgstr " -I DIRECTORIO busca los archivos de inclusión en DIRECTORIO\n" #: ecpg.c:53 #, c-format @@ -380,195 +385,195 @@ msgstr "inicializador no permitido en definición de tipo" msgid "type name \"string\" is reserved in Informix mode" msgstr "el nombre de tipo «string» está reservado en modo Informix" -#: preproc.y:552 preproc.y:17682 +#: preproc.y:552 preproc.y:17675 #, c-format msgid "type \"%s\" is already defined" msgstr "el tipo «%s» ya está definido" -#: preproc.y:577 preproc.y:18325 preproc.y:18650 variable.c:621 +#: preproc.y:577 preproc.y:18310 preproc.y:18635 variable.c:621 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "los arrays multidimensionales para tipos de datos simples no están soportados" -#: preproc.y:1752 +#: preproc.y:599 +#, c-format +msgid "connection %s is overwritten with %s by DECLARE statement %s" +msgstr "la conexión %s es sobrescrita con %s por la sentencia DECLARE %s" + +#: preproc.y:1753 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "la opción AT no está permitida en la sentencia CLOSE DATABASE" -#: preproc.y:2000 +#: preproc.y:2001 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "la opción AT no está permitida en la sentencia CONNECT" -#: preproc.y:2038 +#: preproc.y:2041 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "la opción AT no está permitida en la sentencia DISCONNECT" -#: preproc.y:2093 +#: preproc.y:2096 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "la opción AT no está permitida en la sentencia SET CONNECTION" -#: preproc.y:2115 +#: preproc.y:2118 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "la opción AT no está permitida en la sentencia TYPE" -#: preproc.y:2124 +#: preproc.y:2127 #, c-format msgid "AT option not allowed in VAR statement" msgstr "la opción AT no está permitida en la sentencia VAR" -#: preproc.y:2131 +#: preproc.y:2134 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "la opción AT no está permitida en la sentencia WHENEVER" -#: preproc.y:2208 preproc.y:2380 preproc.y:2385 preproc.y:2508 preproc.y:4128 -#: preproc.y:4792 preproc.y:5325 preproc.y:5663 preproc.y:5963 preproc.y:7531 -#: preproc.y:9099 preproc.y:9104 preproc.y:11932 +#: preproc.y:2211 preproc.y:2383 preproc.y:2388 preproc.y:2511 preproc.y:4143 +#: preproc.y:4807 preproc.y:5340 preproc.y:5678 preproc.y:5978 preproc.y:7514 +#: preproc.y:9082 preproc.y:9087 preproc.y:11915 #, c-format msgid "unsupported feature will be passed to server" msgstr "característica no soportada será pasada al servidor" -#: preproc.y:2766 +#: preproc.y:2769 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL no está implementado" -#: preproc.y:3461 +#: preproc.y:3464 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN no está implementado" -#: preproc.y:10031 preproc.y:17257 +#: preproc.y:10014 preproc.y:17250 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "no se puede usar «database» como nombre de cursor en modo INFORMIX" -#: preproc.y:10038 preproc.y:17267 +#: preproc.y:10021 preproc.y:17260 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "el uso de la variable «%s» en diferentes sentencias declare no está soportado" -#: preproc.y:10040 preproc.y:17269 +#: preproc.y:10023 preproc.y:17262 #, c-format msgid "cursor \"%s\" is already defined" msgstr "el cursor «%s» ya está definido" -#: preproc.y:10514 +#: preproc.y:10497 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "la sintaxis LIMIT #,# que ya no está soportada ha sido pasada al servidor" -#: preproc.y:10847 preproc.y:10854 +#: preproc.y:10830 preproc.y:10837 #, c-format msgid "subquery in FROM must have an alias" msgstr "las subconsultas en FROM deben tener un alias" -#: preproc.y:16949 preproc.y:16956 +#: preproc.y:16942 preproc.y:16949 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS no puede especificar INTO" -#: preproc.y:16992 +#: preproc.y:16985 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "se esperaba «@», se encontró «%s»" -#: preproc.y:17004 +#: preproc.y:16997 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "sólo los protocolos «tcp» y «unix» y tipo de bases de datos «postgresql» están soportados" -#: preproc.y:17007 +#: preproc.y:17000 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "se esperaba «://», se encontró «%s»" -#: preproc.y:17012 +#: preproc.y:17005 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "los sockets de dominio unix sólo trabajan en «localhost» pero no en «%s»" -#: preproc.y:17038 +#: preproc.y:17031 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "se esperaba «postgresql», se encontró «%s»" -#: preproc.y:17041 +#: preproc.y:17034 #, c-format msgid "invalid connection type: %s" msgstr "tipo de conexión no válido: %s" -#: preproc.y:17050 +#: preproc.y:17043 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "se esperaba «@» o «://», se encontró «%s»" -#: preproc.y:17125 preproc.y:17143 +#: preproc.y:17118 preproc.y:17136 #, c-format msgid "invalid data type" msgstr "tipo de dato no válido" -#: preproc.y:17154 preproc.y:17171 +#: preproc.y:17147 preproc.y:17164 #, c-format msgid "incomplete statement" msgstr "sentencia incompleta" -#: preproc.y:17157 preproc.y:17174 +#: preproc.y:17150 preproc.y:17167 #, c-format msgid "unrecognized token \"%s\"" msgstr "elemento «%s» no reconocido" -#: preproc.y:17219 +#: preproc.y:17212 #, c-format msgid "name \"%s\" is already declared" msgstr "el nombre «%s» ya está declarado" -#: preproc.y:17485 +#: preproc.y:17478 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "sólo los tipos de dato numeric y decimal tienen argumento de precisión/escala" -#: preproc.y:17497 +#: preproc.y:17490 #, c-format msgid "interval specification not allowed here" msgstr "la especificación de intervalo no está permitida aquí" -#: preproc.y:17657 preproc.y:17709 +#: preproc.y:17650 preproc.y:17702 #, c-format msgid "too many levels in nested structure/union definition" msgstr "demasiados niveles en la definición anidada de estructura/unión" -#: preproc.y:17832 +#: preproc.y:17825 #, c-format msgid "pointers to varchar are not implemented" msgstr "los punteros a varchar no están implementados" -#: preproc.y:18019 preproc.y:18044 -#, c-format -msgid "using unsupported DESCRIBE statement" -msgstr "utilizando sentencia DESCRIBE no soportada" - -#: preproc.y:18291 +#: preproc.y:18276 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "inicializador no permitido en la orden EXEC SQL VAR" -#: preproc.y:18608 +#: preproc.y:18593 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "no se permiten los arrays de indicadores en la entrada" -#: preproc.y:18795 +#: preproc.y:18780 #, c-format msgid "operator not allowed in variable definition" msgstr "operador no permitido en definición de variable" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:18836 +#: preproc.y:18821 #, c-format msgid "%s at or near \"%s\"" msgstr "%s en o cerca de «%s»" @@ -699,3 +704,6 @@ msgstr "los punteros a puntero no están soportados para este tipo de dato" #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "los arrays multidimensionales para estructuras no están soportados" + +#~ msgid "using unsupported DESCRIBE statement" +#~ msgstr "utilizando sentencia DESCRIBE no soportada" diff --git a/src/interfaces/ecpg/preproc/po/fr.po b/src/interfaces/ecpg/preproc/po/fr.po index 9519cb263e..ca4aa527ee 100644 --- a/src/interfaces/ecpg/preproc/po/fr.po +++ b/src/interfaces/ecpg/preproc/po/fr.po @@ -1,56 +1,63 @@ -# translation of ecpg.po to fr_fr -# french message translation file for ecpg +# LANGUAGE message translation file for ecpg +# Copyright (C) 2009-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the ecpg (PostgreSQL) package. # # Use these quotes: « %s » # -# Guillaume Lelarge , 2009. # Stéphane Schildknecht , 2009. +# Guillaume Lelarge , 2010-2022. +# msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-28 00:39+0000\n" -"PO-Revision-Date: 2021-05-28 15:22+0200\n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" "Last-Translator: Guillaume Lelarge \n" -"Language-Team: PostgreSQLfr \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 2.4.3\n" +"X-Generator: Poedit 3.0.1\n" #: descriptor.c:64 #, c-format msgid "variable \"%s\" must have a numeric type" msgstr "la variable « %s » doit avoir un type numeric" -#: descriptor.c:124 descriptor.c:146 +#: descriptor.c:125 descriptor.c:156 +#, c-format +msgid "descriptor %s bound to connection %s does not exist" +msgstr "le descripteur %s lié à la connexion %s n'existe pas" + +#: descriptor.c:127 descriptor.c:158 #, c-format -msgid "descriptor \"%s\" does not exist" -msgstr "le descripteur « %s » n'existe pas" +msgid "descriptor %s bound to the default connection does not exist" +msgstr "le descripteur %s lié à la connexion par défaut n'existe pas" -#: descriptor.c:161 descriptor.c:213 +#: descriptor.c:173 descriptor.c:225 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "l'élément d'en-tête du descripteur « %d » n'existe pas" -#: descriptor.c:183 +#: descriptor.c:195 #, c-format msgid "nullable is always 1" msgstr "nullable vaut toujours 1" -#: descriptor.c:186 +#: descriptor.c:198 #, c-format msgid "key_member is always 0" msgstr "key_member vaut toujours 0" -#: descriptor.c:280 +#: descriptor.c:292 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "l'élément du descripteur « %s » n'est pas implanté" -#: descriptor.c:290 +#: descriptor.c:302 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "l'élément du descripteur « %s » ne peut pas être initialisé" @@ -78,7 +85,7 @@ msgstr "" #: ecpg.c:41 #, c-format msgid "Options:\n" -msgstr "Options:\n" +msgstr "Options :\n" #: ecpg.c:42 #, c-format @@ -86,8 +93,8 @@ msgid "" " -c automatically generate C code from embedded SQL code;\n" " this affects EXEC SQL TYPE\n" msgstr "" -" -c produit automatiquement le code C à partir du code SQL embarqué ;\n" -" ceci affecte EXEC SQL TYPE\n" +" -c produit automatiquement le code C à partir du code SQL\n" +" embarqué ; ceci affecte EXEC SQL TYPE\n" #: ecpg.c:44 #, c-format @@ -111,7 +118,9 @@ msgstr " -D SYMBOLE définit SYMBOLE\n" #: ecpg.c:50 #, c-format msgid " -h parse a header file, this option includes option \"-c\"\n" -msgstr " -h analyse un fichier d'en-tête, cette option inclut l'option « -c »\n" +msgstr "" +" -h analyse un fichier d'en-tête, cette option inclut l'option\n" +" « -c »\n" #: ecpg.c:51 #, c-format @@ -165,9 +174,9 @@ msgid "" "input file name, after stripping off .pgc if present.\n" msgstr "" "\n" -"Si aucun nom de fichier en sortie n'est fourni, le nom est formaté en\n" -"ajoutant le suffixe .c au nom du fichier en entrée après avoir supprimé le\n" -"suffixe .pgc s'il est présent\n" +"Si aucun nom de fichier en sortie n'est fourni, le nom est formaté en ajoutant\n" +"le suffixe .c au nom du fichier en entrée après avoir supprimé le suffixe .pgc\n" +"s'il est présent.\n" #: ecpg.c:62 #, c-format @@ -181,12 +190,12 @@ msgstr "" #: ecpg.c:63 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil de %s : <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" #: ecpg.c:141 #, c-format msgid "%s: could not locate my own executable path\n" -msgstr "%s : n'a pas pu localiser mon propre exécutable\n" +msgstr "%s : n'a pas pu localiser le chemin de mon propre exécutable\n" #: ecpg.c:176 ecpg.c:333 ecpg.c:344 #, c-format @@ -233,119 +242,129 @@ msgstr "le curseur « %s » est déclaré mais non ouvert" msgid "could not remove output file \"%s\"\n" msgstr "n'a pas pu supprimer le fichier « %s » en sortie\n" -#: pgc.l:502 +#: pgc.l:508 #, c-format msgid "unterminated /* comment" msgstr "commentaire /* non terminé" -#: pgc.l:519 +#: pgc.l:525 #, c-format msgid "unterminated bit string literal" msgstr "chaîne bit litéral non terminée" -#: pgc.l:527 +#: pgc.l:533 #, c-format msgid "unterminated hexadecimal string literal" -msgstr "chaîne hexadécimale litéralle non terminée" +msgstr "chaîne hexadécimale litérale non terminée" -#: pgc.l:602 +#: pgc.l:608 #, c-format msgid "invalid bit string literal" msgstr "chaîne bit litéral invalide" -#: pgc.l:607 +#: pgc.l:613 #, c-format -msgid "invalid hex string literal" -msgstr "chaîne hexadécimale litéralle invalide" +msgid "invalid hexadecimal string literal" +msgstr "chaîne hexadécimale invalide" -#: pgc.l:625 +#: pgc.l:631 #, c-format msgid "unhandled previous state in xqs\n" msgstr "état précédent non géré dans xqs\n" -#: pgc.l:651 pgc.l:760 +#: pgc.l:657 pgc.l:766 #, c-format msgid "unterminated quoted string" msgstr "chaîne entre guillemets non terminée" -#: pgc.l:702 +#: pgc.l:708 #, c-format msgid "unterminated dollar-quoted string" msgstr "chaîne entre guillemets dollars non terminée" -#: pgc.l:720 pgc.l:740 +#: pgc.l:726 pgc.l:746 #, c-format msgid "zero-length delimited identifier" -msgstr "identifiant délimité de taille zéro" +msgstr "identifiant délimité de longueur nulle" -#: pgc.l:751 +#: pgc.l:757 #, c-format msgid "unterminated quoted identifier" -msgstr "identifiant entre guillemet non terminé" +msgstr "identifiant entre guillemets non terminé" + +#: pgc.l:926 +#, c-format +msgid "trailing junk after parameter" +msgstr "élément indésirable après le paramètre" + +#: pgc.l:968 pgc.l:971 pgc.l:974 +#, c-format +msgid "trailing junk after numeric literal" +msgstr "élément indésirable après la valeur numérique" -#: pgc.l:1082 +#: pgc.l:1100 #, c-format msgid "nested /* ... */ comments" msgstr "commentaires /* ... */ imbriqués" -#: pgc.l:1175 +#: pgc.l:1193 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "identifiant manquant dans la commande EXEC SQL UNDEF" -#: pgc.l:1193 pgc.l:1206 pgc.l:1222 pgc.l:1235 +#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 #, c-format msgid "too many nested EXEC SQL IFDEF conditions" msgstr "trop de conditions EXEC SQL IFDEF imbriquées" -#: pgc.l:1251 pgc.l:1262 pgc.l:1277 pgc.l:1299 +#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "correspondance manquante « EXEC SQL IFDEF » / « EXEC SQL IFNDEF »" -#: pgc.l:1253 pgc.l:1264 pgc.l:1445 +#: pgc.l:1271 pgc.l:1282 pgc.l:1463 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "« EXEC SQL ENDIF; » manquant" -#: pgc.l:1279 pgc.l:1301 +#: pgc.l:1297 pgc.l:1319 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "plusieurs EXEC SQL ELSE" -#: pgc.l:1324 pgc.l:1338 +#: pgc.l:1342 pgc.l:1356 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "EXEC SQL ENDIF différent" -#: pgc.l:1393 +#: pgc.l:1411 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "identifiant manquant dans la commande EXEC SQL IFDEF" -#: pgc.l:1402 +#: pgc.l:1420 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "identifiant manquant dans la commande EXEC SQL DEFINE" -#: pgc.l:1435 +#: pgc.l:1453 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "erreur de syntaxe dans la commande EXEC SQL INCLUDE" -#: pgc.l:1485 +#: pgc.l:1503 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "erreur interne : l'état ne peut être atteint ; merci de rapporter ceci à <%s>" -#: pgc.l:1637 +#: pgc.l:1655 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "" "Erreur : le chemin d'en-tête « %s/%s » est trop long sur la ligne %d,\n" "ignoré\n" -#: pgc.l:1660 +#: pgc.l:1678 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "n'a pas pu ouvrir le fichier d'en-tête « %s » sur la ligne %d" @@ -379,203 +398,203 @@ msgstr "initialiseur non autorisé dans la définition du type" msgid "type name \"string\" is reserved in Informix mode" msgstr "le nom du type « string » est réservé dans le mode Informix" -#: preproc.y:552 preproc.y:17695 +#: preproc.y:552 preproc.y:19317 #, c-format msgid "type \"%s\" is already defined" msgstr "le type « %s » est déjà défini" -#: preproc.y:577 preproc.y:18338 preproc.y:18663 variable.c:621 +#: preproc.y:577 preproc.y:19952 preproc.y:20277 variable.c:621 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "" "les tableaux multi-dimensionnels pour les types de données simples ne sont\n" "pas supportés" -#: preproc.y:1753 +#: preproc.y:599 +#, c-format +msgid "connection %s is overwritten with %s by DECLARE statement %s" +msgstr "la connexion %s est surchargée avec %s par l'instruction DECLARE %s" + +#: preproc.y:1872 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "option AT non autorisée dans une instruction CLOSE DATABASE" -#: preproc.y:2001 +#: preproc.y:2122 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "option AT non autorisée dans une instruction CONNECT" -#: preproc.y:2039 +#: preproc.y:2162 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "option AT non autorisée dans une instruction DISCONNECT" -#: preproc.y:2094 +#: preproc.y:2217 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "option AT non autorisée dans une instruction SET CONNECTION" -#: preproc.y:2116 +#: preproc.y:2239 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "option AT non autorisée dans une instruction TYPE" -#: preproc.y:2125 +#: preproc.y:2248 #, c-format msgid "AT option not allowed in VAR statement" msgstr "option AT non autorisée dans une instruction VAR" -#: preproc.y:2132 +#: preproc.y:2255 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "option AT non autorisée dans une instruction WHENEVER" -#: preproc.y:2209 preproc.y:2381 preproc.y:2386 preproc.y:2509 preproc.y:4141 preproc.y:4805 -#: preproc.y:5338 preproc.y:5676 preproc.y:5976 preproc.y:7544 preproc.y:9112 preproc.y:9117 -#: preproc.y:11945 +#: preproc.y:2332 preproc.y:2504 preproc.y:2509 preproc.y:2632 preproc.y:4283 preproc.y:4357 +#: preproc.y:4948 preproc.y:5481 preproc.y:5819 preproc.y:6119 preproc.y:7687 preproc.y:9288 +#: preproc.y:9293 preproc.y:12272 #, c-format msgid "unsupported feature will be passed to server" msgstr "la fonctionnalité non supportée sera passée au serveur" -#: preproc.y:2767 +#: preproc.y:2890 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL n'est pas implanté" -#: preproc.y:3462 +#: preproc.y:3589 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN n'est pas implanté" -#: preproc.y:10044 preproc.y:17270 +#: preproc.y:10335 preproc.y:18892 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "« database » ne peut pas être utilisé comme nom de curseur dans le mode INFORMIX" -#: preproc.y:10051 preproc.y:17280 +#: preproc.y:10342 preproc.y:18902 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "" "l'utilisation de la variable « %s » dans différentes instructions de déclaration\n" "n'est pas supportée" -#: preproc.y:10053 preproc.y:17282 +#: preproc.y:10344 preproc.y:18904 #, c-format msgid "cursor \"%s\" is already defined" msgstr "le curseur « %s » est déjà défini" -#: preproc.y:10527 +#: preproc.y:10818 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "la syntaxe obsolète LIMIT #,# a été passée au serveur" -#: preproc.y:10860 preproc.y:10867 +#: preproc.y:11151 preproc.y:11158 #, c-format msgid "subquery in FROM must have an alias" msgstr "la sous-requête du FROM doit avoir un alias" -#: preproc.y:16962 preproc.y:16969 +#: preproc.y:18584 preproc.y:18591 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS ne peut pas indiquer INTO" -#: preproc.y:17005 +#: preproc.y:18627 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "« @ » attendu, « %s » trouvé" -#: preproc.y:17017 +#: preproc.y:18639 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "" "seuls les protocoles « tcp » et « unix » et les types de base de données\n" "« postgresql » sont supportés" -#: preproc.y:17020 +#: preproc.y:18642 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "« :// » attendu, « %s » trouvé" -#: preproc.y:17025 +#: preproc.y:18647 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "les sockets de domaine Unix fonctionnent seulement sur « localhost », mais pas sur « %s »" -#: preproc.y:17051 +#: preproc.y:18673 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "« postgresql » attendu, « %s » trouvé" -#: preproc.y:17054 +#: preproc.y:18676 #, c-format msgid "invalid connection type: %s" msgstr "type de connexion invalide : %s" -#: preproc.y:17063 +#: preproc.y:18685 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "« @ » ou « :// » attendu, « %s » trouvé" -#: preproc.y:17138 preproc.y:17156 +#: preproc.y:18760 preproc.y:18778 #, c-format msgid "invalid data type" msgstr "type de données invalide" -#: preproc.y:17167 preproc.y:17184 +#: preproc.y:18789 preproc.y:18806 #, c-format msgid "incomplete statement" msgstr "instruction incomplète" -#: preproc.y:17170 preproc.y:17187 +#: preproc.y:18792 preproc.y:18809 #, c-format msgid "unrecognized token \"%s\"" msgstr "jeton « %s » non reconnu" -#: preproc.y:17232 +#: preproc.y:18854 #, c-format msgid "name \"%s\" is already declared" msgstr "le nom « %s » est déjà défini" -#: preproc.y:17498 +#: preproc.y:19120 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "" "seuls les types de données numeric et decimal ont des arguments de\n" "précision et d'échelle" -#: preproc.y:17510 +#: preproc.y:19132 #, c-format msgid "interval specification not allowed here" msgstr "interval de spécification non autorisé ici" -#: preproc.y:17670 preproc.y:17722 +#: preproc.y:19292 preproc.y:19344 #, c-format msgid "too many levels in nested structure/union definition" msgstr "trop de niveaux dans la définition de structure/union imbriquée" -#: preproc.y:17845 +#: preproc.y:19467 #, c-format msgid "pointers to varchar are not implemented" msgstr "les pointeurs sur des chaînes de caractères (varchar) ne sont pas implantés" -#: preproc.y:18032 preproc.y:18057 -#, c-format -msgid "using unsupported DESCRIBE statement" -msgstr "utilisation de l'instruction DESCRIBE non supporté" - -#: preproc.y:18304 +#: preproc.y:19918 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "initialiseur non autorisé dans la commande EXEC SQL VAR" -#: preproc.y:18621 +#: preproc.y:20235 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "les tableaux d'indicateurs ne sont pas autorisés en entrée" -#: preproc.y:18808 +#: preproc.y:20422 #, c-format msgid "operator not allowed in variable definition" msgstr "opérateur non autorisé dans la définition de la variable" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:18849 +#: preproc.y:20463 #, c-format msgid "%s at or near \"%s\"" msgstr "%s sur ou près de « %s »" @@ -728,20 +747,23 @@ msgstr "les tableaux multidimensionnels ne sont pas supportés pour les structur #~ msgid "AT option not allowed in DEALLOCATE statement" #~ msgstr "option AT non autorisée dans une instruction DEALLOCATE" -#~ msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" -#~ msgstr "une contrainte déclarée INITIALLY DEFERRED doit être DEFERRABLE" +#~ msgid "COPY FROM STDOUT is not possible" +#~ msgstr "COPY FROM STDOUT n'est pas possible" -#~ msgid "OLD used in query that is not in a rule" -#~ msgstr "OLD utilisé dans une requête qui n'est pas dans une règle" +#~ msgid "COPY TO STDIN is not possible" +#~ msgstr "COPY TO STDIN n'est pas possible" #~ msgid "NEW used in query that is not in a rule" #~ msgstr "NEW utilisé dans une requête qui n'est pas dans une règle" -#~ msgid "COPY FROM STDOUT is not possible" -#~ msgstr "COPY FROM STDOUT n'est pas possible" +#~ msgid "OLD used in query that is not in a rule" +#~ msgstr "OLD utilisé dans une requête qui n'est pas dans une règle" -#~ msgid "COPY TO STDIN is not possible" -#~ msgstr "COPY TO STDIN n'est pas possible" +#~ msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" +#~ msgstr "une contrainte déclarée INITIALLY DEFERRED doit être DEFERRABLE" #~ msgid "declared name %s is already defined" #~ msgstr "le nom déclaré %s est déjà défini" + +#~ msgid "using unsupported DESCRIBE statement" +#~ msgstr "utilisation de l'instruction DESCRIBE non supporté" diff --git a/src/interfaces/ecpg/preproc/po/ja.po b/src/interfaces/ecpg/preproc/po/ja.po index 81b06266f2..d25faa7e9b 100644 --- a/src/interfaces/ecpg/preproc/po/ja.po +++ b/src/interfaces/ecpg/preproc/po/ja.po @@ -1,53 +1,58 @@ # Japanese message translation file for ecpg-preproc -# Copyright (C) 2019 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: ecpg-preproc (PostgreSQL 12 beta 1)\n" +"Project-Id-Version: ecpg-preproc (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-06-11 09:06+0900\n" -"PO-Revision-Date: 2019-06-11 09:10+0900\n" +"POT-Creation-Date: 2022-05-11 14:16+0900\n" +"PO-Revision-Date: 2022-05-11 14:50+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 1.5.4\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 1.8.13\n" #: descriptor.c:64 #, c-format msgid "variable \"%s\" must have a numeric type" msgstr "変数\"%s\"は数値型でなければなりません" -#: descriptor.c:124 descriptor.c:146 +#: descriptor.c:125 descriptor.c:156 #, c-format -msgid "descriptor \"%s\" does not exist" -msgstr "%s記述子は存在しません" +msgid "descriptor %s bound to connection %s does not exist" +msgstr "接続%2$sに関連付けられている記述子%1$sは存在しません" -#: descriptor.c:161 descriptor.c:213 +#: descriptor.c:127 descriptor.c:158 +#, c-format +msgid "descriptor %s bound to the default connection does not exist" +msgstr "デフォルト接続に関連付けられている記述子%sは存在しません" + +#: descriptor.c:173 descriptor.c:225 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "記述子ヘッダ項目%dは存在しません" -#: descriptor.c:183 +#: descriptor.c:195 #, c-format msgid "nullable is always 1" msgstr "nullableは常に1です" -#: descriptor.c:186 +#: descriptor.c:198 #, c-format msgid "key_member is always 0" msgstr "key_memberは常に0です" -#: descriptor.c:280 +#: descriptor.c:292 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "記述子項目%sは実装されていません" -#: descriptor.c:290 +#: descriptor.c:302 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "記述子項目%sは設定できません" @@ -107,11 +112,9 @@ msgstr " -D SYMBOL シンボル SYMBOL を定義します\n" #: ecpg.c:50 #, c-format -msgid "" -" -h parse a header file, this option includes option \"-c\"\n" +msgid " -h parse a header file, this option includes option \"-c\"\n" msgstr "" -" -h ヘッダファイルをパースします。このオプションには\"-c\"オプ" -"ション\n" +" -h ヘッダファイルをパースします。このオプションには\"-c\"オプション\n" " が含まれます\n" #: ecpg.c:51 @@ -166,405 +169,416 @@ msgid "" "input file name, after stripping off .pgc if present.\n" msgstr "" "\n" -"出力ファイルの指定がない場合は、入力ファイルの名前に.cを付けた名前になりま" -"す。\n" +"出力ファイルの指定がない場合は、入力ファイルの名前に.cを付けた名前になります。\n" "ただし、もし.pgcがある場合はこれを取り除いてから.cが付けられます。\n" #: ecpg.c:62 #, c-format msgid "" "\n" -"Report bugs to .\n" +"Report bugs to <%s>.\n" msgstr "" "\n" -"不具合はまで報告してください。\n" +"バグは<%s>に報告してください。\n" + +#: ecpg.c:63 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s ホームページ: <%s>\n" -#: ecpg.c:182 +#: ecpg.c:141 #, c-format msgid "%s: could not locate my own executable path\n" msgstr "%s: 自身の実行ファイルの場所がわかりません\n" -#: ecpg.c:217 ecpg.c:374 ecpg.c:385 +#: ecpg.c:176 ecpg.c:333 ecpg.c:344 #, c-format msgid "%s: could not open file \"%s\": %s\n" msgstr "%s: ファイル\"%s\"をオープンできませんでした: %s\n" -#: ecpg.c:260 ecpg.c:273 ecpg.c:289 ecpg.c:315 +#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "詳細は\"%s --help\"を実行してください。\n" -#: ecpg.c:284 +#: ecpg.c:243 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: パーサデバッグのサポート(-d)を利用できません\n" -#: ecpg.c:303 +#: ecpg.c:262 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, PostgreSQL埋込みC言語プリプロセッサ, バージョン%s\n" -#: ecpg.c:305 +#: ecpg.c:264 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "EXEC SQL INCLUDE ... 検索が始まります\n" -#: ecpg.c:308 +#: ecpg.c:267 #, c-format msgid "end of search list\n" msgstr "検索リストの終端です\n" -#: ecpg.c:314 +#: ecpg.c:273 #, c-format msgid "%s: no input files specified\n" msgstr "%s: 入力ファイルが指定されていません\n" -#: ecpg.c:497 +#: ecpg.c:477 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "カーソル%sは宣言されましたが、オープンされていません" -#: ecpg.c:510 preproc.y:129 +#: ecpg.c:490 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "出力ファイル\"%s\"を削除できませんでした\n" -#: pgc.l:472 +#: pgc.l:507 #, c-format msgid "unterminated /* comment" msgstr "/*コメントが閉じていません" -#: pgc.l:490 -#, c-format -msgid "invalid bit string literal" -msgstr "無効なビット列リテラルです" - -#: pgc.l:502 +#: pgc.l:524 #, c-format msgid "unterminated bit string literal" msgstr "ビット文字列リテラルの終端がありません" -#: pgc.l:518 +#: pgc.l:532 #, c-format msgid "unterminated hexadecimal string literal" msgstr "16進数文字列リテラルの終端がありません" -#: pgc.l:614 pgc.l:718 +#: pgc.l:607 +#, c-format +msgid "invalid bit string literal" +msgstr "無効なビット列リテラルです" + +#: pgc.l:612 +#, c-format +msgid "invalid hexadecimal string literal" +msgstr "不正な16進数文字列リテラル" + +#: pgc.l:630 +#, c-format +msgid "unhandled previous state in xqs\n" +msgstr "xqsの中で処理されない前ステート\n" + +#: pgc.l:656 pgc.l:765 #, c-format msgid "unterminated quoted string" msgstr "文字列の引用符が閉じていません" -#: pgc.l:665 +#: pgc.l:707 #, c-format msgid "unterminated dollar-quoted string" msgstr "文字列のドル引用符が閉じていません" -#: pgc.l:684 pgc.l:697 +#: pgc.l:725 pgc.l:745 #, c-format msgid "zero-length delimited identifier" msgstr "区切りつき識別子の長さがゼロです" -#: pgc.l:709 +#: pgc.l:756 #, c-format msgid "unterminated quoted identifier" msgstr "識別子の引用符が閉じていません" -#: pgc.l:1040 +#: pgc.l:925 +#, c-format +msgid "trailing junk after parameter" +msgstr "パラメータの後に余分な文字" + +#: pgc.l:967 pgc.l:970 pgc.l:973 +#, c-format +msgid "trailing junk after numeric literal" +msgstr "数値リテラルの後ろにゴミがあります" + +#: pgc.l:1099 #, c-format msgid "nested /* ... */ comments" msgstr "入れ子状の /* ... */ コメント" -#: pgc.l:1133 +#: pgc.l:1192 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "EXEC SQL UNDEFコマンドにおいて識別子がありません" -#: pgc.l:1179 pgc.l:1193 +#: pgc.l:1210 pgc.l:1223 pgc.l:1239 pgc.l:1252 +#, c-format +msgid "too many nested EXEC SQL IFDEF conditions" +msgstr "入れ子状のEXEC SQL IFDEF条件が多すぎます" + +#: pgc.l:1268 pgc.l:1279 pgc.l:1294 pgc.l:1316 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "対応する\"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"がありません" -#: pgc.l:1182 pgc.l:1195 pgc.l:1373 +#: pgc.l:1270 pgc.l:1281 pgc.l:1462 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "\"EXEC SQL ENDIF;\"がありません" -#: pgc.l:1211 pgc.l:1230 +#: pgc.l:1296 pgc.l:1318 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "1つ以上のEXEC SQL ELSE\"が存在します" -#: pgc.l:1252 pgc.l:1266 +#: pgc.l:1341 pgc.l:1355 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "EXEC SQL ENDIFに対応するものがありません" -#: pgc.l:1286 -#, c-format -msgid "too many nested EXEC SQL IFDEF conditions" -msgstr "入れ子状のEXEC SQL IFDEF条件が多すぎます" - -#: pgc.l:1321 +#: pgc.l:1410 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "EXEC SQL IFDEFコマンドにおいて識別子がありません" -#: pgc.l:1330 +#: pgc.l:1419 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "EXEC SQL DEFINEコマンドにおいて識別子がありません" -#: pgc.l:1363 +#: pgc.l:1452 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "EXEC SQL INCLUDEコマンドにおいて構文エラーがあります" -#: pgc.l:1413 +#: pgc.l:1502 #, c-format -#| msgid "" -#| "internal error: unreachable state; please report this to " -msgid "" -"internal error: unreachable state; please report this to " -msgstr "" -"内部エラー: 到達しないはずの状態です。まで報" -"告してください" +msgid "internal error: unreachable state; please report this to <%s>" +msgstr "内部エラー: 到達しないはずの状態です。<%s>まで報告してください" -#: pgc.l:1564 +#: pgc.l:1655 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" -msgstr "" -"エラー:行番号%3$dのインクルードパス\"%1$s/%2$s\"が長すぎます。無視しまし" -"た。\n" +msgstr "エラー:行番号%3$dのインクルードパス\"%1$s/%2$s\"が長すぎます。無視しました。\n" -#: pgc.l:1587 +#: pgc.l:1678 #, c-format msgid "could not open include file \"%s\" on line %d" -msgstr "" -"行番号%2$dのインクルードファイル\"%1$s\"をオープンすることができませんでした" +msgstr "行番号%2$dのインクルードファイル\"%1$s\"をオープンすることができませんでした" #: preproc.y:31 msgid "syntax error" msgstr "構文エラー" -#: preproc.y:83 +#: preproc.y:84 #, c-format msgid "WARNING: " msgstr "警告: " -#: preproc.y:86 +#: preproc.y:87 #, c-format msgid "ERROR: " msgstr "エラー: " -#: preproc.y:510 +#: preproc.y:514 #, c-format msgid "cursor \"%s\" does not exist" msgstr "カーソル\"%s\"は存在しません" -#: preproc.y:539 +#: preproc.y:543 #, c-format msgid "initializer not allowed in type definition" msgstr "型定義では初期化子は許されません" -#: preproc.y:541 +#: preproc.y:545 #, c-format msgid "type name \"string\" is reserved in Informix mode" msgstr "型名\"string\"はInformixモードですでに予約されています" -#: preproc.y:548 preproc.y:15877 +#: preproc.y:552 preproc.y:19317 #, c-format msgid "type \"%s\" is already defined" msgstr "\"%s\"型はすでに定義されています" -#: preproc.y:573 preproc.y:16548 preproc.y:16873 variable.c:621 +#: preproc.y:577 preproc.y:19952 preproc.y:20277 variable.c:621 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "単純なデータ型の多次元配列はサポートされていません" -#: preproc.y:1938 +#: preproc.y:599 +#, c-format +msgid "connection %s is overwritten with %s by DECLARE statement %s" +msgstr "DECLARE文%3$sにより接続%1$sは%2$sで上書きされます" + +#: preproc.y:1872 +#, c-format +msgid "AT option not allowed in CLOSE DATABASE statement" +msgstr "CLOSE DATABASE文ではATオプションは許されません" + +#: preproc.y:2122 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "CONNECT文ではATオプションは許されません" -#: preproc.y:1976 +#: preproc.y:2162 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "DISCONNECT文ではATオプションは許されません" -#: preproc.y:2038 +#: preproc.y:2217 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "SET CONNECTION文ではATオプションは許されません" -#: preproc.y:2060 +#: preproc.y:2239 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "TYPE文ではATオプションは許されません" -#: preproc.y:2069 +#: preproc.y:2248 #, c-format msgid "AT option not allowed in VAR statement" msgstr "VAR文ではATオプションは許されません" -#: preproc.y:2076 +#: preproc.y:2255 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "WHENEVER文ではATオプションは許されません" -#: preproc.y:2153 preproc.y:2325 preproc.y:2330 preproc.y:2453 preproc.y:4046 -#: preproc.y:5635 preproc.y:5935 preproc.y:7563 preproc.y:9075 preproc.y:9080 -#: preproc.y:11880 +#: preproc.y:2332 preproc.y:2504 preproc.y:2509 preproc.y:2632 preproc.y:4283 +#: preproc.y:4357 preproc.y:4948 preproc.y:5481 preproc.y:5819 preproc.y:6119 +#: preproc.y:7687 preproc.y:9288 preproc.y:9293 preproc.y:12272 #, c-format msgid "unsupported feature will be passed to server" msgstr "非サポートの機能がサーバに渡されます" -#: preproc.y:2711 +#: preproc.y:2890 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALLは実装されていません" -#: preproc.y:3369 -#, c-format -msgid "AT option not allowed in CLOSE DATABASE statement" -msgstr "CLOSE DATABASE文ではATオプションは許されません" - -#: preproc.y:3394 +#: preproc.y:3589 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDINは実装されていません" -#: preproc.y:10026 preproc.y:15460 +#: preproc.y:10335 preproc.y:18892 +#, c-format +msgid "\"database\" cannot be used as cursor name in INFORMIX mode" +msgstr "INFORMIXモードでは\"database\"をカーソル名として使用できません" + +#: preproc.y:10342 preproc.y:18902 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" -msgstr "" -"異なったdeclareステートメントにおける変数\"%s\"の使用はサポートされていません" +msgstr "異なったdeclareステートメントにおける変数\"%s\"の使用はサポートされていません" -#: preproc.y:10028 preproc.y:15462 +#: preproc.y:10344 preproc.y:18904 #, c-format msgid "cursor \"%s\" is already defined" msgstr "カーソル\"%s\"はすでに定義されています" -#: preproc.y:10469 +#: preproc.y:10818 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "サーバに渡されるLIMIT #,#構文はもはやサポートされていません" -#: preproc.y:10794 preproc.y:10801 +#: preproc.y:11151 preproc.y:11158 #, c-format msgid "subquery in FROM must have an alias" msgstr "FROM句の副問い合わせは別名を持たなければなりません" -#: preproc.y:15151 preproc.y:15158 +#: preproc.y:18584 preproc.y:18591 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE ASはINTOを指定できません" -#: preproc.y:15194 +#: preproc.y:18627 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "想定では\"@\"、結果では\"%s\"" -#: preproc.y:15206 +#: preproc.y:18639 #, c-format -msgid "" -"only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are " -"supported" -msgstr "" -"プロトコルでは\"tcp\"および\"unix\"のみ、データベースの種類では\"postgresql" -"\"のみがサポートされています" +msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" +msgstr "プロトコルでは\"tcp\"および\"unix\"のみ、データベースの種類では\"postgresql\"のみがサポートされています" -#: preproc.y:15209 +#: preproc.y:18642 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "想定では\"://\"、結果では\"%s\"" -#: preproc.y:15214 +#: preproc.y:18647 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" -msgstr "" -"Unixドメインソケットは\"localhost\"でのみで動作し、\"%s\"では動作しません" +msgstr "Unixドメインソケットは\"localhost\"でのみで動作し、\"%s\"では動作しません" -#: preproc.y:15240 +#: preproc.y:18673 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "想定では\"postgresql\"、結果では\"%s\"" -#: preproc.y:15243 +#: preproc.y:18676 #, c-format msgid "invalid connection type: %s" msgstr "無効な接続種類: %s" -#: preproc.y:15252 +#: preproc.y:18685 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "想定では\"@または\"\"://\"、結果では\"%s\"" -#: preproc.y:15327 preproc.y:15345 +#: preproc.y:18760 preproc.y:18778 #, c-format msgid "invalid data type" msgstr "無効なデータ型" -#: preproc.y:15356 preproc.y:15373 +#: preproc.y:18789 preproc.y:18806 #, c-format msgid "incomplete statement" msgstr "不完全な文" -#: preproc.y:15359 preproc.y:15376 +#: preproc.y:18792 preproc.y:18809 #, c-format msgid "unrecognized token \"%s\"" msgstr "認識できないトークン\"%s\"" -#: preproc.y:15422 +#: preproc.y:18854 #, c-format -#| msgid "cursor \"%s\" is already defined" -msgid "declared name %s is already defined" -msgstr "宣言名\"%s\"はすでに定義されています" +msgid "name \"%s\" is already declared" +msgstr "名前\"%s\"はすでに定義されています" -#: preproc.y:15680 +#: preproc.y:19120 #, c-format msgid "only data types numeric and decimal have precision/scale argument" -msgstr "" -"数値データ型または10進数データ型のみが精度/位取り引数と取ることができます" +msgstr "数値データ型または10進数データ型のみが精度/位取り引数と取ることができます" -#: preproc.y:15692 +#: preproc.y:19132 #, c-format msgid "interval specification not allowed here" msgstr "時間間隔の指定はここでは許されません" -#: preproc.y:15852 preproc.y:15904 +#: preproc.y:19292 preproc.y:19344 #, c-format msgid "too many levels in nested structure/union definition" msgstr "構造体/ユニオンの定義の入れ子レベルが深すぎます" -#: preproc.y:16055 +#: preproc.y:19467 #, c-format msgid "pointers to varchar are not implemented" msgstr "varcharを指し示すポインタは実装されていません" -#: preproc.y:16242 preproc.y:16267 -#, c-format -msgid "using unsupported DESCRIBE statement" -msgstr "未サポートのDESCRIBE文の使用" - -#: preproc.y:16514 +#: preproc.y:19918 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "EXEC SQL VARコマンドでは初期化子は許されません" -#: preproc.y:16831 +#: preproc.y:20235 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "指示子配列は入力として許されません" -#: preproc.y:17052 +#: preproc.y:20422 #, c-format msgid "operator not allowed in variable definition" msgstr "変数定義では演算子は許されません" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:17093 +#: preproc.y:20463 #, c-format msgid "%s at or near \"%s\"" msgstr "\"%2$s\"またはその近辺で%1$s" @@ -591,8 +605,7 @@ msgstr "変数\"%s\"はローカル変数により隠蔽されています" #: type.c:277 #, c-format -msgid "" -"indicator variable \"%s\" is hidden by a local variable of a different type" +msgid "indicator variable \"%s\" is hidden by a local variable of a different type" msgstr "指示子変数\"%s\"は、異なった型を持つローカル変数により隠蔽されています" #: type.c:279 @@ -682,14 +695,9 @@ msgstr "多次元配列はサポートされません" #: variable.c:534 #, c-format -msgid "" -"multilevel pointers (more than 2 levels) are not supported; found %d level" -msgid_plural "" -"multilevel pointers (more than 2 levels) are not supported; found %d levels" -msgstr[0] "" -"複数レベルのポインタ(2レベル以上)はサポートされません。%dレベルあります" -msgstr[1] "" -"複数レベルのポインタ(2レベル以上)はサポートされません。%dレベルあります" +msgid "multilevel pointers (more than 2 levels) are not supported; found %d level" +msgid_plural "multilevel pointers (more than 2 levels) are not supported; found %d levels" +msgstr[0] "複数レベルのポインタ(2レベル以上)はサポートされません。%dレベルあります" #: variable.c:539 #, c-format @@ -701,6 +709,16 @@ msgstr "このデータ型では、ポインタを指し示すポインタはサ msgid "multidimensional arrays for structures are not supported" msgstr "構造体の多次元配列はサポートされていません" +#~ msgid "" +#~ "\n" +#~ "Report bugs to .\n" +#~ msgstr "" +#~ "\n" +#~ "不具合はまで報告してください。\n" + +#~ msgid "using unsupported DESCRIBE statement" +#~ msgstr "未サポートのDESCRIBE文の使用" + #~ msgid "" #~ "\n" #~ "Report bugs to .\n" diff --git a/src/interfaces/ecpg/preproc/po/ru.po b/src/interfaces/ecpg/preproc/po/ru.po index 79b69b068f..056cd1380a 100644 --- a/src/interfaces/ecpg/preproc/po/ru.po +++ b/src/interfaces/ecpg/preproc/po/ru.po @@ -1,13 +1,13 @@ # Russian message translation file for ecpg # Copyright (C) 2012-2016 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021. msgid "" msgstr "" "Project-Id-Version: ecpg (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-11-09 07:34+0300\n" -"PO-Revision-Date: 2020-11-09 08:27+0300\n" +"POT-Creation-Date: 2021-09-01 12:57+0300\n" +"PO-Revision-Date: 2021-09-04 10:54+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -22,37 +22,42 @@ msgstr "" msgid "variable \"%s\" must have a numeric type" msgstr "переменная \"%s\" должна иметь числовой тип" -#: descriptor.c:124 descriptor.c:146 +#: descriptor.c:125 descriptor.c:156 #, c-format -msgid "descriptor \"%s\" does not exist" -msgstr "дескриптор \"%s\" не существует" +msgid "descriptor %s bound to connection %s does not exist" +msgstr "дескриптор %s, привязанный к соединению %s, не существует" -#: descriptor.c:161 descriptor.c:213 +#: descriptor.c:127 descriptor.c:158 +#, c-format +msgid "descriptor %s bound to the default connection does not exist" +msgstr "дескриптор %s, привязанный к соединению по умолчанию, не существует" + +#: descriptor.c:173 descriptor.c:225 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "заголовок дескриптора не содержит элемент \"%d\"" -#: descriptor.c:183 +#: descriptor.c:195 #, c-format msgid "nullable is always 1" msgstr "NULLABLE всегда равно 1" -#: descriptor.c:186 +#: descriptor.c:198 #, c-format msgid "key_member is always 0" msgstr "KEY_MEMBER всегда равно 0" -#: descriptor.c:280 +#: descriptor.c:292 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "поле \"%s\" в дескрипторе не реализовано" -#: descriptor.c:290 +#: descriptor.c:302 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "установить поле \"%s\" в дескрипторе нельзя" -#: ecpg.c:35 +#: ecpg.c:36 #, c-format msgid "" "%s is the PostgreSQL embedded SQL preprocessor for C programs.\n" @@ -61,7 +66,7 @@ msgstr "" "%s - препроцессор SQL-вставок в программах на C для PostgreSQL.\n" "\n" -#: ecpg.c:37 +#: ecpg.c:38 #, c-format msgid "" "Usage:\n" @@ -72,12 +77,12 @@ msgstr "" " %s [ПАРАМЕТР]... ФАЙЛ...\n" "\n" -#: ecpg.c:40 +#: ecpg.c:41 #, c-format msgid "Options:\n" msgstr "Параметры:\n" -#: ecpg.c:41 +#: ecpg.c:42 #, c-format msgid "" " -c automatically generate C code from embedded SQL code;\n" @@ -86,7 +91,7 @@ msgstr "" " -c автоматически генерировать код C из внедрённого SQL-кода;\n" " (это касается EXEC SQL TYPE)\n" -#: ecpg.c:43 +#: ecpg.c:44 #, c-format msgid "" " -C MODE set compatibility mode; MODE can be one of\n" @@ -95,38 +100,38 @@ msgstr "" " -C РЕЖИМ установить режим совместимости; допустимый РЕЖИМ:\n" " \"INFORMIX\", \"INFORMIX_SE\" или \"ORACLE\"\n" -#: ecpg.c:46 +#: ecpg.c:47 #, c-format msgid " -d generate parser debug output\n" msgstr " -d генерировать отладочные сообщения при разборе\n" -#: ecpg.c:48 +#: ecpg.c:49 #, c-format msgid " -D SYMBOL define SYMBOL\n" msgstr " -D СИМВОЛ определить (define) СИМВОЛ\n" -#: ecpg.c:49 +#: ecpg.c:50 #, c-format msgid "" " -h parse a header file, this option includes option \"-c\"\n" msgstr " -h разобрать файл заголовка (включает параметр \"-c\")\n" -#: ecpg.c:50 +#: ecpg.c:51 #, c-format msgid " -i parse system include files as well\n" msgstr " -i разобрать также системные включаемые файлы\n" -#: ecpg.c:51 +#: ecpg.c:52 #, c-format msgid " -I DIRECTORY search DIRECTORY for include files\n" msgstr " -I КАТАЛОГ искать включаемые файлы в указанном каталоге\n" -#: ecpg.c:52 +#: ecpg.c:53 #, c-format msgid " -o OUTFILE write result to OUTFILE\n" msgstr " -o ФАЙЛ записать результат в ФАЙЛ\n" -#: ecpg.c:53 +#: ecpg.c:54 #, c-format msgid "" " -r OPTION specify run-time behavior; OPTION can be:\n" @@ -135,28 +140,28 @@ msgstr "" " -r ПАРАМЕТР определить режим выполнения; допустимый ПАРАМЕТР:\n" " \"no_indicator\", \"prepare\" или \"questionmarks\"\n" -#: ecpg.c:55 +#: ecpg.c:56 #, c-format msgid " --regression run in regression testing mode\n" msgstr " --regression запустить в режиме тестирования регрессии\n" -#: ecpg.c:56 +#: ecpg.c:57 #, c-format msgid " -t turn on autocommit of transactions\n" msgstr " -t включить автофиксацию транзакций\n" -#: ecpg.c:57 +#: ecpg.c:58 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: ecpg.c:58 +#: ecpg.c:59 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" # skip-rule: space-before-period -#: ecpg.c:59 +#: ecpg.c:60 #, c-format msgid "" "\n" @@ -167,7 +172,7 @@ msgstr "" "Если выходной файл не указан, к имени входного файла без расширения .pgc\n" "добавляется .c.\n" -#: ecpg.c:61 +#: ecpg.c:62 #, c-format msgid "" "\n" @@ -176,57 +181,57 @@ msgstr "" "\n" "Об ошибках сообщайте по адресу <%s>.\n" -#: ecpg.c:62 +#: ecpg.c:63 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" -#: ecpg.c:140 +#: ecpg.c:141 #, c-format msgid "%s: could not locate my own executable path\n" -msgstr "%s: не удалось найти свой путь к исполняемым файлам\n" +msgstr "%s: не удалось найти путь к собственному исполняемому файлу\n" -#: ecpg.c:175 ecpg.c:332 ecpg.c:343 +#: ecpg.c:176 ecpg.c:333 ecpg.c:344 #, c-format msgid "%s: could not open file \"%s\": %s\n" msgstr "%s: не удалось открыть файл \"%s\": %s\n" -#: ecpg.c:218 ecpg.c:231 ecpg.c:247 ecpg.c:273 +#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Для дополнительной информации попробуйте \"%s --help\".\n" -#: ecpg.c:242 +#: ecpg.c:243 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: отладочные сообщения при разборе (-d) не поддерживаются\n" -#: ecpg.c:261 +#: ecpg.c:262 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, препроцессор внедрённого в С языка СУБД PostgreSQL, версия %s\n" -#: ecpg.c:263 +#: ecpg.c:264 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "поиск файлов для EXEC SQL INCLUDE ... начинается в каталогах:\n" -#: ecpg.c:266 +#: ecpg.c:267 #, c-format msgid "end of search list\n" msgstr "конец списка поиска\n" -#: ecpg.c:272 +#: ecpg.c:273 #, c-format msgid "%s: no input files specified\n" msgstr "%s: нет входных файлов\n" -#: ecpg.c:466 +#: ecpg.c:477 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "курсор \"%s\" был объявлен, но не открыт" -#: ecpg.c:479 preproc.y:128 +#: ecpg.c:490 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "ошибка при удалении выходного файла \"%s\"\n" @@ -263,89 +268,89 @@ msgstr "" "необрабатываемое предыдущее состояние при обнаружении закрывающего " "апострофа\n" -#: pgc.l:654 pgc.l:756 +#: pgc.l:651 pgc.l:760 #, c-format msgid "unterminated quoted string" msgstr "незавершённая строка в кавычках" -#: pgc.l:705 +#: pgc.l:702 #, c-format msgid "unterminated dollar-quoted string" -msgstr "незавершённая строка в долларах" +msgstr "незавершённая строка с $" -#: pgc.l:723 pgc.l:736 +#: pgc.l:720 pgc.l:740 #, c-format msgid "zero-length delimited identifier" msgstr "пустой идентификатор в кавычках" -#: pgc.l:747 +#: pgc.l:751 #, c-format msgid "unterminated quoted identifier" msgstr "незавершённый идентификатор в кавычках" -#: pgc.l:1078 +#: pgc.l:1082 #, c-format msgid "nested /* ... */ comments" msgstr "вложенные комментарии /* ... */" -#: pgc.l:1171 +#: pgc.l:1175 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "в команде EXEC SQL UNDEF отсутствует идентификатор" -#: pgc.l:1189 pgc.l:1202 pgc.l:1218 pgc.l:1231 +#: pgc.l:1193 pgc.l:1206 pgc.l:1222 pgc.l:1235 #, c-format msgid "too many nested EXEC SQL IFDEF conditions" msgstr "слишком много вложенных условий EXEC SQL IFDEF" -#: pgc.l:1247 pgc.l:1258 pgc.l:1273 pgc.l:1295 +#: pgc.l:1251 pgc.l:1262 pgc.l:1277 pgc.l:1299 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "нет соответствующего \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" -#: pgc.l:1249 pgc.l:1260 pgc.l:1441 +#: pgc.l:1253 pgc.l:1264 pgc.l:1445 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "отсутствует \"EXEC SQL ENDIF;\"" -#: pgc.l:1275 pgc.l:1297 +#: pgc.l:1279 pgc.l:1301 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "неоднократная команда EXEC SQL ELSE" -#: pgc.l:1320 pgc.l:1334 +#: pgc.l:1324 pgc.l:1338 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "непарная команда EXEC SQL ENDIF" -#: pgc.l:1389 +#: pgc.l:1393 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "в команде EXEC SQL IFDEF отсутствует идентификатор" -#: pgc.l:1398 +#: pgc.l:1402 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "в команде EXEC SQL DEFINE отсутствует идентификатор" -#: pgc.l:1431 +#: pgc.l:1435 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "ошибка синтаксиса в команде EXEC SQL INCLUDE" -#: pgc.l:1481 +#: pgc.l:1485 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "внутренняя ошибка: недостижимое состояние; пожалуйста, сообщите в <%s>" -#: pgc.l:1633 +#: pgc.l:1637 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "" "Ошибка: путь включаемых файлов \"%s/%s\" в строке %d слишком длинный, " "пропускается\n" -#: pgc.l:1656 +#: pgc.l:1660 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "не удалось открыть включаемый файл \"%s\" (строка %d)" @@ -354,125 +359,136 @@ msgstr "не удалось открыть включаемый файл \"%s\" msgid "syntax error" msgstr "ошибка синтаксиса" -#: preproc.y:82 +#: preproc.y:84 #, c-format msgid "WARNING: " msgstr "ПРЕДУПРЕЖДЕНИЕ: " -#: preproc.y:85 +#: preproc.y:87 #, c-format msgid "ERROR: " msgstr "ОШИБКА: " -#: preproc.y:512 +#: preproc.y:514 #, c-format msgid "cursor \"%s\" does not exist" msgstr "курсор \"%s\" не существует" -#: preproc.y:541 +#: preproc.y:543 #, c-format msgid "initializer not allowed in type definition" msgstr "определение типа не может включать инициализатор" -#: preproc.y:543 +#: preproc.y:545 #, c-format msgid "type name \"string\" is reserved in Informix mode" msgstr "имя типа \"string\" в режиме Informix зарезервировано" -#: preproc.y:550 preproc.y:15962 +#: preproc.y:552 preproc.y:17675 #, c-format msgid "type \"%s\" is already defined" msgstr "тип \"%s\" уже определён" -#: preproc.y:575 preproc.y:16605 preproc.y:16930 variable.c:621 +#: preproc.y:577 preproc.y:18310 preproc.y:18635 variable.c:621 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "многомерные массивы с простыми типами данных не поддерживаются" -#: preproc.y:1706 +#: preproc.y:599 +#, c-format +msgid "connection %s is overwritten with %s by DECLARE statement %s" +msgstr "подключение %s заменяется на %s оператором DECLARE %s" + +#: preproc.y:1753 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "оператор CLOSE DATABASE с параметром AT не поддерживается" -#: preproc.y:1954 +#: preproc.y:2001 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "оператор CONNECT с параметром AT не поддерживается" -#: preproc.y:1988 +#: preproc.y:2041 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "оператор DISCONNECT с параметром AT не поддерживается" -#: preproc.y:2043 +#: preproc.y:2096 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "оператор SET CONNECTION с параметром AT не поддерживается" -#: preproc.y:2065 +#: preproc.y:2118 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "оператор TYPE с параметром AT не поддерживается" -#: preproc.y:2074 +#: preproc.y:2127 #, c-format msgid "AT option not allowed in VAR statement" msgstr "оператор VAR с параметром AT не поддерживается" -#: preproc.y:2081 +#: preproc.y:2134 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "оператор WHENEVER с параметром AT не поддерживается" -#: preproc.y:2158 preproc.y:2330 preproc.y:2335 preproc.y:2458 preproc.y:4036 -#: preproc.y:4684 preproc.y:5626 preproc.y:5926 preproc.y:7544 preproc.y:9083 -#: preproc.y:9088 preproc.y:11923 +#: preproc.y:2211 preproc.y:2383 preproc.y:2388 preproc.y:2511 preproc.y:4143 +#: preproc.y:4807 preproc.y:5340 preproc.y:5678 preproc.y:5978 preproc.y:7514 +#: preproc.y:9082 preproc.y:9087 preproc.y:11915 #, c-format msgid "unsupported feature will be passed to server" msgstr "неподдерживаемая функция будет передана серверу" -#: preproc.y:2716 +#: preproc.y:2769 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL не реализовано" -#: preproc.y:3384 +#: preproc.y:3464 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "операция COPY FROM STDIN не реализована" -#: preproc.y:10062 preproc.y:15547 +#: preproc.y:10014 preproc.y:17250 +#, c-format +msgid "\"database\" cannot be used as cursor name in INFORMIX mode" +msgstr "" +"в режиме INFORMIX нельзя использовать \"database\" в качестве имени курсора" + +#: preproc.y:10021 preproc.y:17260 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "" "использование переменной \"%s\" в разных операторах DECLARE не поддерживается" -#: preproc.y:10064 preproc.y:15549 +#: preproc.y:10023 preproc.y:17262 #, c-format msgid "cursor \"%s\" is already defined" msgstr "курсор \"%s\" уже определён" -#: preproc.y:10504 +#: preproc.y:10497 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "не поддерживаемое более предложение LIMIT #,# передано на сервер" -#: preproc.y:10837 preproc.y:10844 +#: preproc.y:10830 preproc.y:10837 #, c-format msgid "subquery in FROM must have an alias" msgstr "подзапрос во FROM должен иметь псевдоним" -#: preproc.y:15270 preproc.y:15277 +#: preproc.y:16942 preproc.y:16949 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "в CREATE TABLE AS нельзя указать INTO" -#: preproc.y:15313 +#: preproc.y:16985 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "ожидался знак \"@\", но на этом месте \"%s\"" -#: preproc.y:15325 +#: preproc.y:16997 #, c-format msgid "" "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are " @@ -481,89 +497,89 @@ msgstr "" "поддерживаются только протоколы \"tcp\" и \"unix\", а тип базы данных - " "\"postgresql\"" -#: preproc.y:15328 +#: preproc.y:17000 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "ожидалось \"://\", но на этом месте \"%s\"" -#: preproc.y:15333 +#: preproc.y:17005 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Unix-сокеты работают только с \"localhost\", но не с адресом \"%s\"" -#: preproc.y:15359 +#: preproc.y:17031 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "ожидался тип \"postgresql\", но на этом месте \"%s\"" -#: preproc.y:15362 +#: preproc.y:17034 #, c-format msgid "invalid connection type: %s" msgstr "неверный тип подключения: %s" -#: preproc.y:15371 +#: preproc.y:17043 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "ожидалось \"@\" или \"://\", но на этом месте \"%s\"" -#: preproc.y:15446 preproc.y:15464 +#: preproc.y:17118 preproc.y:17136 #, c-format msgid "invalid data type" msgstr "неверный тип данных" -#: preproc.y:15475 preproc.y:15492 +#: preproc.y:17147 preproc.y:17164 #, c-format msgid "incomplete statement" msgstr "неполный оператор" -#: preproc.y:15478 preproc.y:15495 +#: preproc.y:17150 preproc.y:17167 #, c-format msgid "unrecognized token \"%s\"" msgstr "нераспознанное ключевое слово \"%s\"" -#: preproc.y:15765 +#: preproc.y:17212 +#, c-format +msgid "name \"%s\" is already declared" +msgstr "имя \"%s\" уже объявлено" + +#: preproc.y:17478 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "" "точность/масштаб можно указать только для типов данных numeric и decimal" -#: preproc.y:15777 +#: preproc.y:17490 #, c-format msgid "interval specification not allowed here" msgstr "определение интервала здесь не допускается" -#: preproc.y:15937 preproc.y:15989 +#: preproc.y:17650 preproc.y:17702 #, c-format msgid "too many levels in nested structure/union definition" msgstr "слишком много уровней в определении вложенной структуры/объединения" -#: preproc.y:16112 +#: preproc.y:17825 #, c-format msgid "pointers to varchar are not implemented" msgstr "указатели на varchar не реализованы" -#: preproc.y:16299 preproc.y:16324 -#, c-format -msgid "using unsupported DESCRIBE statement" -msgstr "используется неподдерживаемый оператор DESCRIBE" - -#: preproc.y:16571 +#: preproc.y:18276 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "команда EXEC SQL VAR не может включать инициализатор" -#: preproc.y:16888 +#: preproc.y:18593 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "массивы индикаторов на входе недопустимы" -#: preproc.y:17075 +#: preproc.y:18780 #, c-format msgid "operator not allowed in variable definition" msgstr "недопустимый оператор в определении переменной" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:17116 +#: preproc.y:18821 #, c-format msgid "%s at or near \"%s\"" msgstr "%s (примерное положение: \"%s\")" @@ -705,6 +721,9 @@ msgstr "для этого типа данных указатели на указ msgid "multidimensional arrays for structures are not supported" msgstr "многомерные массивы структур не поддерживаются" +#~ msgid "using unsupported DESCRIBE statement" +#~ msgstr "используется неподдерживаемый оператор DESCRIBE" + #~ msgid "" #~ "\n" #~ "Report bugs to .\n" diff --git a/src/interfaces/ecpg/preproc/po/sv.po b/src/interfaces/ecpg/preproc/po/sv.po index 6703c2dcb5..3b8d67c61d 100644 --- a/src/interfaces/ecpg/preproc/po/sv.po +++ b/src/interfaces/ecpg/preproc/po/sv.po @@ -1,14 +1,14 @@ # SWEDISHE message translation file for ecpg # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-10 02:39+0000\n" -"PO-Revision-Date: 2020-04-10 07:48+0200\n" +"POT-Creation-Date: 2022-04-11 09:09+0000\n" +"PO-Revision-Date: 2022-04-11 14:39+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -22,37 +22,42 @@ msgstr "" msgid "variable \"%s\" must have a numeric type" msgstr "variabel \"%s\" måste ha en numerisk typ" -#: descriptor.c:124 descriptor.c:146 +#: descriptor.c:125 descriptor.c:156 #, c-format -msgid "descriptor \"%s\" does not exist" -msgstr "deskriptor \"%s\" finns inte" +msgid "descriptor %s bound to connection %s does not exist" +msgstr "deskriptor %s kopplad till anslutning %s finns inte" -#: descriptor.c:161 descriptor.c:213 +#: descriptor.c:127 descriptor.c:158 +#, c-format +msgid "descriptor %s bound to the default connection does not exist" +msgstr "deskriptor %s kopplad till standardanslutning finns inte" + +#: descriptor.c:173 descriptor.c:225 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "deskriptor-header-post \"%d\" finns inte" -#: descriptor.c:183 +#: descriptor.c:195 #, c-format msgid "nullable is always 1" msgstr "nullable är alltid 1" -#: descriptor.c:186 +#: descriptor.c:198 #, c-format msgid "key_member is always 0" msgstr "key_member är alltid 0" -#: descriptor.c:280 +#: descriptor.c:292 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "deskriptor-post \"%s\" är inte implementerad" -#: descriptor.c:290 +#: descriptor.c:302 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "deskriptor-post \"%s\" kan inte sättas" -#: ecpg.c:35 +#: ecpg.c:36 #, c-format msgid "" "%s is the PostgreSQL embedded SQL preprocessor for C programs.\n" @@ -61,7 +66,7 @@ msgstr "" "%s är PostgreSQLs inbäddade SQL-preprocessor för C-program.\n" "\n" -#: ecpg.c:37 +#: ecpg.c:38 #, c-format msgid "" "Usage:\n" @@ -72,12 +77,12 @@ msgstr "" " %s [FLAGGA]... FIL...\n" "\n" -#: ecpg.c:40 +#: ecpg.c:41 #, c-format msgid "Options:\n" msgstr "Flaggor:\n" -#: ecpg.c:41 +#: ecpg.c:42 #, c-format msgid "" " -c automatically generate C code from embedded SQL code;\n" @@ -86,7 +91,7 @@ msgstr "" " -c generera automatiskt C-kod från inbäddad SQL-kod;\n" " detta påverkar EXEC SQL TYPE\n" -#: ecpg.c:43 +#: ecpg.c:44 #, c-format msgid "" " -C MODE set compatibility mode; MODE can be one of\n" @@ -95,37 +100,37 @@ msgstr "" " -C LÄGE sätt kompabilitetsläge; LÄGE kan vara en av\n" " \"INFORMIX\", \"INFORMIX_SE\", \"ORACLE\"\n" -#: ecpg.c:46 +#: ecpg.c:47 #, c-format msgid " -d generate parser debug output\n" msgstr " -d generera parser-debug-utmatning\n" -#: ecpg.c:48 +#: ecpg.c:49 #, c-format msgid " -D SYMBOL define SYMBOL\n" msgstr " -D SYMBOL definiera SYMBOL\n" -#: ecpg.c:49 +#: ecpg.c:50 #, c-format msgid " -h parse a header file, this option includes option \"-c\"\n" msgstr " -h parsa en header-fil, denna flagga inkluderar flaggan \"-c\"\n" -#: ecpg.c:50 +#: ecpg.c:51 #, c-format msgid " -i parse system include files as well\n" msgstr " -i parsa system-include-filer dessutom\n" -#: ecpg.c:51 +#: ecpg.c:52 #, c-format msgid " -I DIRECTORY search DIRECTORY for include files\n" msgstr " -I KATALOG sök i KATALOG efter include-filer\n" -#: ecpg.c:52 +#: ecpg.c:53 #, c-format msgid " -o OUTFILE write result to OUTFILE\n" msgstr " -o UTFIL skriv resultat till UTFIL\n" -#: ecpg.c:53 +#: ecpg.c:54 #, c-format msgid "" " -r OPTION specify run-time behavior; OPTION can be:\n" @@ -134,27 +139,27 @@ msgstr "" " -r FLAGGA ange runtime-beteende; FLAGGA kan vara en av:\n" " \"no_indicator\", \"prepare\", \"questionmarks\"\n" -#: ecpg.c:55 +#: ecpg.c:56 #, c-format msgid " --regression run in regression testing mode\n" msgstr " --regression kör i regressions-test-läge\n" -#: ecpg.c:56 +#: ecpg.c:57 #, c-format msgid " -t turn on autocommit of transactions\n" msgstr " -t slå på auto-commit av transaktioner\n" -#: ecpg.c:57 +#: ecpg.c:58 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: ecpg.c:58 +#: ecpg.c:59 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: ecpg.c:59 +#: ecpg.c:60 #, c-format msgid "" "\n" @@ -165,174 +170,191 @@ msgstr "" "Om ingen utdatafil anges så skapas namnet genom att lägga till .c till\n" "indatafilnamnet, detta efter att .pgc strippats bort om det var med.\n" -#: ecpg.c:61 +#: ecpg.c:62 #, c-format msgid "" "\n" "Report bugs to <%s>.\n" -msgstr "\nRapportera fel till <%s>.\n" +msgstr "" +"\n" +"Rapportera fel till <%s>.\n" -#: ecpg.c:62 +#: ecpg.c:63 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: ecpg.c:140 +#: ecpg.c:141 #, c-format msgid "%s: could not locate my own executable path\n" msgstr "%s: kunde inte hitta min egna körbara fils sökväg\n" -#: ecpg.c:175 ecpg.c:332 ecpg.c:343 +#: ecpg.c:176 ecpg.c:333 ecpg.c:344 #, c-format msgid "%s: could not open file \"%s\": %s\n" msgstr "%s: kunde inte öppna fil \"%s\": %s\n" -#: ecpg.c:218 ecpg.c:231 ecpg.c:247 ecpg.c:273 +#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Försök med \"%s --help\" för mer information.\n" -#: ecpg.c:242 +#: ecpg.c:243 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: parser-debug-stöd (-d) är inte tillgängligt\n" -#: ecpg.c:261 +#: ecpg.c:262 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, PostgreSQLs inbäddade C-preprocessor, version %s\n" -#: ecpg.c:263 +#: ecpg.c:264 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "EXEC SQL INCLUDE ... sökning startar här:\n" -#: ecpg.c:266 +#: ecpg.c:267 #, c-format msgid "end of search list\n" msgstr "slut på söklista\n" -#: ecpg.c:272 +#: ecpg.c:273 #, c-format msgid "%s: no input files specified\n" msgstr "%s: inga indatafiler angivna\n" -#: ecpg.c:466 +#: ecpg.c:477 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "markören \"%s\" har deklarerats men inte öppnats" -#: ecpg.c:479 preproc.y:128 +#: ecpg.c:490 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "kunde inte ta bort utdatafil \"%s\"\n" -#: pgc.l:486 +#: pgc.l:508 #, c-format msgid "unterminated /* comment" msgstr "ej avslutad /*-kommentar" -#: pgc.l:503 +#: pgc.l:525 #, c-format msgid "unterminated bit string literal" msgstr "ej avslutad bitsträngslitteral" -#: pgc.l:511 +#: pgc.l:533 #, c-format msgid "unterminated hexadecimal string literal" msgstr "ej avslutad hexadecimal stränglitteral" -#: pgc.l:586 +#: pgc.l:608 #, c-format msgid "invalid bit string literal" msgstr "ogiltig bit-sträng-literal" -#: pgc.l:607 +#: pgc.l:613 +#, c-format +msgid "invalid hexadecimal string literal" +msgstr "ogiltig hexdecimal sträng-literal" + +#: pgc.l:631 #, c-format msgid "unhandled previous state in xqs\n" msgstr "tidigare state i xqs som ej kan hanteras\n" -#: pgc.l:636 pgc.l:738 +#: pgc.l:657 pgc.l:766 #, c-format msgid "unterminated quoted string" msgstr "icketerminerad citerad sträng" -#: pgc.l:687 +#: pgc.l:708 #, c-format msgid "unterminated dollar-quoted string" msgstr "icke terminerad dollarciterad sträng" -#: pgc.l:705 pgc.l:718 +#: pgc.l:726 pgc.l:746 #, c-format msgid "zero-length delimited identifier" msgstr "noll-längds avdelad identifierare" -#: pgc.l:729 +#: pgc.l:757 #, c-format msgid "unterminated quoted identifier" msgstr "ej avslutad citerad identifierare" -#: pgc.l:1060 +#: pgc.l:926 +#, c-format +msgid "trailing junk after parameter" +msgstr "efterföljande skräp efter parameter" + +#: pgc.l:968 pgc.l:971 pgc.l:974 +#, c-format +msgid "trailing junk after numeric literal" +msgstr "efterföljande skräp efter numerisk literal" + +#: pgc.l:1100 #, c-format msgid "nested /* ... */ comments" msgstr "nästlade /* ... */-kommentarer" -#: pgc.l:1153 +#: pgc.l:1193 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "saknar identifierare i EXEC SQL UNDEF-kommando" -#: pgc.l:1199 pgc.l:1213 +#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 +#, c-format +msgid "too many nested EXEC SQL IFDEF conditions" +msgstr "för många nästlade EXEC SQL IFDEF-villkor" + +#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "saknar matchande \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" -#: pgc.l:1202 pgc.l:1215 pgc.l:1393 +#: pgc.l:1271 pgc.l:1282 pgc.l:1463 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "saknar \"EXEC SQL ENDIF;\"" -#: pgc.l:1231 pgc.l:1250 +#: pgc.l:1297 pgc.l:1319 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "mer än en EXEC SQL ELSE" -#: pgc.l:1272 pgc.l:1286 +#: pgc.l:1342 pgc.l:1356 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "ej matchad EXEC SQL ENDIF" -#: pgc.l:1306 -#, c-format -msgid "too many nested EXEC SQL IFDEF conditions" -msgstr "för många nästlade EXEC SQL IFDEF-villkor" - -#: pgc.l:1341 +#: pgc.l:1411 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "saknar identifierare i EXEC SQL IFDEF-kommando" -#: pgc.l:1350 +#: pgc.l:1420 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "saknar identifierare i EXEC SQL DEFINE-kommando" -#: pgc.l:1383 +#: pgc.l:1453 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "syntaxfel i EXEC SQL INCLUDE-kommando" -#: pgc.l:1433 +#: pgc.l:1503 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "internt fel: state som ej skall kunna nås; vänligen rapportera detta till <%s>" -#: pgc.l:1583 +#: pgc.l:1655 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "Fel: include-sökväg \"%s/%s\" är för lång på rad %d, hoppar över\n" -#: pgc.l:1606 +#: pgc.l:1678 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "kunde inte öppna inkludefil \"%s\" på rad %d" @@ -341,210 +363,220 @@ msgstr "kunde inte öppna inkludefil \"%s\" på rad %d" msgid "syntax error" msgstr "syntaxfel" -#: preproc.y:82 +#: preproc.y:84 #, c-format msgid "WARNING: " msgstr "VARNING: " -#: preproc.y:85 +#: preproc.y:87 #, c-format msgid "ERROR: " msgstr "FEL: " -#: preproc.y:509 +#: preproc.y:514 #, c-format msgid "cursor \"%s\" does not exist" msgstr "markör \"%s\" existerar inte" -#: preproc.y:538 +#: preproc.y:543 #, c-format msgid "initializer not allowed in type definition" msgstr "initialiserare tillåts inte i typdefinition" -#: preproc.y:540 +#: preproc.y:545 #, c-format msgid "type name \"string\" is reserved in Informix mode" msgstr "typnamn \"string\" är reserverat i Informix-läge" -#: preproc.y:547 preproc.y:15954 +#: preproc.y:552 preproc.y:19317 #, c-format msgid "type \"%s\" is already defined" msgstr "typen \"%s\" är redan definierad" -#: preproc.y:572 preproc.y:16597 preproc.y:16922 variable.c:621 +#: preproc.y:577 preproc.y:19952 preproc.y:20277 variable.c:621 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "multidimensionella array:er för enkla datatyper stöds inte" -#: preproc.y:1701 +#: preproc.y:599 +#, c-format +msgid "connection %s is overwritten with %s by DECLARE statement %s" +msgstr "anslutning %s överskriven med %s av DECLARE-sats %s" + +#: preproc.y:1872 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "AT-flaggan tillåts inte i CLOSE DATABASE-sats" -#: preproc.y:1949 +#: preproc.y:2122 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "AT-flaggan tillåts inte i CONNECT-sats" -#: preproc.y:1983 +#: preproc.y:2162 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "AT-flaggan tillåts inte i DISCONNECT-sats" -#: preproc.y:2038 +#: preproc.y:2217 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "AT-flaggan tillåts inte i SET CONNECTION-sats" -#: preproc.y:2060 +#: preproc.y:2239 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "AT-flaggan tillåts inte i TYPE-sats" -#: preproc.y:2069 +#: preproc.y:2248 #, c-format msgid "AT option not allowed in VAR statement" msgstr "AT-flaggan tillåts inte i VAR-sats" -#: preproc.y:2076 +#: preproc.y:2255 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "AT-flaggan tillåts inte i WHENEVER-sats" -#: preproc.y:2153 preproc.y:2325 preproc.y:2330 preproc.y:2453 preproc.y:4031 -#: preproc.y:4691 preproc.y:5633 preproc.y:5933 preproc.y:7551 preproc.y:9079 -#: preproc.y:9084 preproc.y:11915 +#: preproc.y:2332 preproc.y:2504 preproc.y:2509 preproc.y:2632 preproc.y:4283 +#: preproc.y:4357 preproc.y:4948 preproc.y:5481 preproc.y:5819 preproc.y:6119 +#: preproc.y:7687 preproc.y:9288 preproc.y:9293 preproc.y:12272 #, c-format msgid "unsupported feature will be passed to server" msgstr "ej stödd funktion skickass till servern" -#: preproc.y:2711 +#: preproc.y:2890 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL är inte implementerad" -#: preproc.y:3379 +#: preproc.y:3589 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN är inte implementerad" -#: preproc.y:10058 preproc.y:15539 +#: preproc.y:10335 preproc.y:18892 +#, c-format +msgid "\"database\" cannot be used as cursor name in INFORMIX mode" +msgstr "\"database\" kan inte användas som markörsnamn i INFORMIX-läge" + +#: preproc.y:10342 preproc.y:18902 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "använda variabel \"%s\" i olika deklarationssatser stöds inte" -#: preproc.y:10060 preproc.y:15541 +#: preproc.y:10344 preproc.y:18904 #, c-format msgid "cursor \"%s\" is already defined" msgstr "markören \"%s\" är redan definierad" -#: preproc.y:10500 +#: preproc.y:10818 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "ej längre stödd syntax LIMIT #,# har skickats till servern" -#: preproc.y:10829 preproc.y:10836 +#: preproc.y:11151 preproc.y:11158 #, c-format msgid "subquery in FROM must have an alias" msgstr "subfråga i FROM måste ha ett alias" -#: preproc.y:15262 preproc.y:15269 +#: preproc.y:18584 preproc.y:18591 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS kan inte ange INTO" -#: preproc.y:15305 +#: preproc.y:18627 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "förväntade \"@\", hittade \"%s\"" -#: preproc.y:15317 +#: preproc.y:18639 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "bara protokoll \"tcp\" och \"unix\" samt databastyp \"postgresql\" stöds" -#: preproc.y:15320 +#: preproc.y:18642 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "förväntade \"://\", hittade \"%s\"" -#: preproc.y:15325 +#: preproc.y:18647 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Unix-domän-socket fungerart bara på \"localhost\" men inte på \"%s\"" -#: preproc.y:15351 +#: preproc.y:18673 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "förväntade \"postgresql\", hittade \"%s\"" -#: preproc.y:15354 +#: preproc.y:18676 #, c-format msgid "invalid connection type: %s" msgstr "ogiltig anslutningstyp: %s" -#: preproc.y:15363 +#: preproc.y:18685 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "förväntade \"@\" eller \"://\", hittade \"%s\"" -#: preproc.y:15438 preproc.y:15456 +#: preproc.y:18760 preproc.y:18778 #, c-format msgid "invalid data type" msgstr "ogiltig datatyp" -#: preproc.y:15467 preproc.y:15484 +#: preproc.y:18789 preproc.y:18806 #, c-format msgid "incomplete statement" msgstr "ofullständig sats" -#: preproc.y:15470 preproc.y:15487 +#: preproc.y:18792 preproc.y:18809 #, c-format msgid "unrecognized token \"%s\"" msgstr "okänd symbol \"%s\"" -#: preproc.y:15757 +#: preproc.y:18854 +#, c-format +msgid "name \"%s\" is already declared" +msgstr "namnet \"%s\" är redan deklarerat" + +#: preproc.y:19120 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "bara datatyperna numeric och decimal har precision/skala-argument" -#: preproc.y:15769 +#: preproc.y:19132 #, c-format msgid "interval specification not allowed here" msgstr "intervallspecifikation tillåts inte här" -#: preproc.y:15929 preproc.y:15981 +#: preproc.y:19292 preproc.y:19344 #, c-format msgid "too many levels in nested structure/union definition" msgstr "för många nästlade nivåer i struktur/union-definition" -#: preproc.y:16104 +#: preproc.y:19467 #, c-format msgid "pointers to varchar are not implemented" msgstr "pekare till varchar är inte implementerat" -#: preproc.y:16291 preproc.y:16316 -#, c-format -msgid "using unsupported DESCRIBE statement" -msgstr "använder ej stödd DESCRIBE-sats" - -#: preproc.y:16563 +#: preproc.y:19918 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "initialiserare tillåts inte i EXEC SQL VAR-kommando" -#: preproc.y:16880 +#: preproc.y:20235 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "array:er av indikatorer tillåts inte vid indata" -#: preproc.y:17067 +#: preproc.y:20422 #, c-format msgid "operator not allowed in variable definition" msgstr "operator tillåts inte i variabeldefinition" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:17108 +#: preproc.y:20463 #, c-format msgid "%s at or near \"%s\"" msgstr "%s vid eller nära \"%s\"" diff --git a/src/interfaces/ecpg/preproc/po/tr.po b/src/interfaces/ecpg/preproc/po/tr.po index 3bff3293ac..dc19759b16 100644 --- a/src/interfaces/ecpg/preproc/po/tr.po +++ b/src/interfaces/ecpg/preproc/po/tr.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 8.4\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2019-04-26 13:39+0000\n" -"PO-Revision-Date: 2019-06-13 17:15+0300\n" +"PO-Revision-Date: 2021-09-16 09:37+0200\n" "Last-Translator: Abdullah GÜLNER \n" "Language-Team: Turkish \n" "Language: tr\n" @@ -105,7 +105,7 @@ msgstr " -d ayrıştırıcı hata ayıklama çıktısını oluştur\ #: ecpg.c:49 #, c-format msgid " -D SYMBOL define SYMBOL\n" -msgstr " -D SEMBOL SEMBOLü tanımla\n" +msgstr " -D SEMBOL SEMBOLü tanımla\n" #: ecpg.c:50 #, c-format @@ -133,7 +133,7 @@ msgid "" " -r OPTION specify run-time behavior; OPTION can be:\n" " \"no_indicator\", \"prepare\", \"questionmarks\"\n" msgstr "" -" -r SEÇENEK çalışma zamanı davranışını belirt; SEÇENEK şunlardan birisi olabilir:\n" +" -r SEÇENEK çalışma zamanı davranışını belirt; SEÇENEK şunlardan birisi olabilir:\n" " \"no_indicator\", \"prepare\", \"questionmarks\"\n" #: ecpg.c:56 @@ -144,7 +144,7 @@ msgstr " --regression regression testi modunda çalış\n" #: ecpg.c:57 #, c-format msgid " -t turn on autocommit of transactions\n" -msgstr " -t transactionların otomatik commit olması özelliğini aç\n" +msgstr " -t transactionların otomatik commit olması özelliğini aç\n" #: ecpg.c:58 #, c-format diff --git a/src/interfaces/ecpg/preproc/po/uk.po b/src/interfaces/ecpg/preproc/po/uk.po index b93eec4c66..cd70ab8115 100644 --- a/src/interfaces/ecpg/preproc/po/uk.po +++ b/src/interfaces/ecpg/preproc/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:09+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" +"POT-Creation-Date: 2021-08-17 08:39+0000\n" +"PO-Revision-Date: 2021-08-17 11:18\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,133 +14,138 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/ecpg.pot\n" -"X-Crowdin-File-ID: 480\n" +"X-Crowdin-File: /REL_14_DEV/ecpg.pot\n" +"X-Crowdin-File-ID: 782\n" #: descriptor.c:64 #, c-format msgid "variable \"%s\" must have a numeric type" msgstr "змінна \"%s\" повинна мати числовий тип" -#: descriptor.c:124 descriptor.c:146 +#: descriptor.c:125 descriptor.c:156 #, c-format -msgid "descriptor \"%s\" does not exist" -msgstr "дескриптор \"%s\" не існує" +msgid "descriptor %s bound to connection %s does not exist" +msgstr "дескриптор %s, прив'язаний до підключення %s, не існує" -#: descriptor.c:161 descriptor.c:213 +#: descriptor.c:127 descriptor.c:158 +#, c-format +msgid "descriptor %s bound to the default connection does not exist" +msgstr "дескриптор %s, прив'язаний до підключення за замовчуванням, не існує" + +#: descriptor.c:173 descriptor.c:225 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "елемент заголовка дескриптору \"%d\" не існує" -#: descriptor.c:183 +#: descriptor.c:195 #, c-format msgid "nullable is always 1" msgstr "nullable завжди 1" -#: descriptor.c:186 +#: descriptor.c:198 #, c-format msgid "key_member is always 0" msgstr "key_member завжди 0" -#: descriptor.c:280 +#: descriptor.c:292 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "елемент дескриптору \"%s\" не реалізовано" -#: descriptor.c:290 +#: descriptor.c:302 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "елемент дескриптору \"%s\" не можна встановити" -#: ecpg.c:35 +#: ecpg.c:36 #, c-format msgid "%s is the PostgreSQL embedded SQL preprocessor for C programs.\n\n" msgstr "%s - це препроцесор SQL-вставок PostgreSQL для C програм.\n\n" -#: ecpg.c:37 +#: ecpg.c:38 #, c-format msgid "Usage:\n" " %s [OPTION]... FILE...\n\n" msgstr "Використання: \n" " %s [OPTION]... FILE...\n\n" -#: ecpg.c:40 +#: ecpg.c:41 #, c-format msgid "Options:\n" msgstr "Параметри:\n" -#: ecpg.c:41 +#: ecpg.c:42 #, c-format msgid " -c automatically generate C code from embedded SQL code;\n" " this affects EXEC SQL TYPE\n" msgstr " -c автоматично генерувати C-код з вбудованого SQL-коду;\n" " це стосується EXEC SQL TYPE\n" -#: ecpg.c:43 +#: ecpg.c:44 #, c-format msgid " -C MODE set compatibility mode; MODE can be one of\n" " \"INFORMIX\", \"INFORMIX_SE\", \"ORACLE\"\n" msgstr " -C MODE встановити режим сумісності; допустимий режим може бути одним з:\n" " \"INFORMIX\", \"INFORMIX_SE\", \"ORACLE\"\n" -#: ecpg.c:46 +#: ecpg.c:47 #, c-format msgid " -d generate parser debug output\n" msgstr " -d генерувати налагоджувальні повідомлення при аналізі\n" -#: ecpg.c:48 +#: ecpg.c:49 #, c-format msgid " -D SYMBOL define SYMBOL\n" msgstr " -D SYMBOL визначити СИМВОЛ\n" -#: ecpg.c:49 +#: ecpg.c:50 #, c-format msgid " -h parse a header file, this option includes option \"-c\"\n" msgstr " -h аналізувати файл заголовку, цей параметр включає параметр \"-c\"\n" -#: ecpg.c:50 +#: ecpg.c:51 #, c-format msgid " -i parse system include files as well\n" msgstr " -i аналізувати системні файли include\n" -#: ecpg.c:51 +#: ecpg.c:52 #, c-format msgid " -I DIRECTORY search DIRECTORY for include files\n" msgstr " -I DIRECTORY шукати файли для включення у зазначенному каталозі\n" -#: ecpg.c:52 +#: ecpg.c:53 #, c-format msgid " -o OUTFILE write result to OUTFILE\n" msgstr " -o OUTFILE записати результат до OUTFILE\n" -#: ecpg.c:53 +#: ecpg.c:54 #, c-format msgid " -r OPTION specify run-time behavior; OPTION can be:\n" " \"no_indicator\", \"prepare\", \"questionmarks\"\n" msgstr " -r OPTION визначити поведінку під час виконання; допустимий парамтер може бути:\n" " \"no_indicator\", \"prepare\", \"questionmarks\"\n" -#: ecpg.c:55 +#: ecpg.c:56 #, c-format msgid " --regression run in regression testing mode\n" msgstr " --regression запустити в режимі тестування регресії\n" -#: ecpg.c:56 +#: ecpg.c:57 #, c-format msgid " -t turn on autocommit of transactions\n" msgstr " -t увімкнути автопідтвердження транзакцій\n" -#: ecpg.c:57 +#: ecpg.c:58 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показати версію, потім вийти\n" -#: ecpg.c:58 +#: ecpg.c:59 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: ecpg.c:59 +#: ecpg.c:60 #, c-format msgid "\n" "If no output file is specified, the name is formed by adding .c to the\n" @@ -148,64 +153,64 @@ msgid "\n" msgstr "\n" "Якщо файл виводу не вказано, ім'я файла формується додаванням .c до введеного імені файла, після обрізання розширення .pgc, якщо присутнє.\n" -#: ecpg.c:61 +#: ecpg.c:62 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "Повідомляти про помилки на <%s>.\n" -#: ecpg.c:62 +#: ecpg.c:63 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" -#: ecpg.c:140 +#: ecpg.c:141 #, c-format msgid "%s: could not locate my own executable path\n" msgstr "%s: не вдалося знайти свій власний шлях для виконання\n" -#: ecpg.c:175 ecpg.c:332 ecpg.c:343 +#: ecpg.c:176 ecpg.c:333 ecpg.c:344 #, c-format msgid "%s: could not open file \"%s\": %s\n" msgstr "%s: не вдалося відкрити файл \"%s\": %s\n" -#: ecpg.c:218 ecpg.c:231 ecpg.c:247 ecpg.c:273 +#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" для отримання додаткової інформації.\n" +msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n" -#: ecpg.c:242 +#: ecpg.c:243 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: налагоджувальні повідомлення під час аналізу (-d) не підтримуються\n" -#: ecpg.c:261 +#: ecpg.c:262 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, вбудований препроцесор PostgreSQL, версія %s\n" -#: ecpg.c:263 +#: ecpg.c:264 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "EXEC SQL INCLUDE ... пошук починається тут:\n" -#: ecpg.c:266 +#: ecpg.c:267 #, c-format msgid "end of search list\n" msgstr "кінець списку пошуку\n" -#: ecpg.c:272 +#: ecpg.c:273 #, c-format msgid "%s: no input files specified\n" msgstr "%s: не вказано вхідні файли\n" -#: ecpg.c:466 +#: ecpg.c:477 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "курсор \"%s\" був оголошений, але не відкритий" -#: ecpg.c:479 preproc.y:128 +#: ecpg.c:490 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "не вдалося видалити файл виводу \"%s\"\n" @@ -230,92 +235,97 @@ msgstr "незавершений шістнадцятковий рядок" msgid "invalid bit string literal" msgstr "неприпустимий літерал бітового рядка" -#: pgc.l:623 +#: pgc.l:607 +#, c-format +msgid "invalid hex string literal" +msgstr "неприпустимий шістнадцятковий рядок" + +#: pgc.l:625 #, c-format msgid "unhandled previous state in xqs\n" msgstr "необроблений попередній стан у xqs\n" -#: pgc.l:652 pgc.l:754 +#: pgc.l:651 pgc.l:760 #, c-format msgid "unterminated quoted string" msgstr "незавершений рядок в лапках" -#: pgc.l:703 +#: pgc.l:702 #, c-format msgid "unterminated dollar-quoted string" msgstr "незавершений рядок з $" -#: pgc.l:721 pgc.l:734 +#: pgc.l:720 pgc.l:740 #, c-format msgid "zero-length delimited identifier" msgstr "пустий ідентифікатор із роздільниками" -#: pgc.l:745 +#: pgc.l:751 #, c-format msgid "unterminated quoted identifier" msgstr "незавершений ідентифікатор в лапках" -#: pgc.l:1076 +#: pgc.l:1082 #, c-format msgid "nested /* ... */ comments" msgstr "вкладені /* ... */ коменарі" -#: pgc.l:1169 +#: pgc.l:1175 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "відсутній ідентифікатор у команді EXEC SQL UNDEF" -#: pgc.l:1187 pgc.l:1200 pgc.l:1216 pgc.l:1229 +#: pgc.l:1193 pgc.l:1206 pgc.l:1222 pgc.l:1235 #, c-format msgid "too many nested EXEC SQL IFDEF conditions" msgstr "забагато вкладених умов EXEC SQL IFDEF" -#: pgc.l:1245 pgc.l:1256 pgc.l:1271 pgc.l:1293 +#: pgc.l:1251 pgc.l:1262 pgc.l:1277 pgc.l:1299 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "немає відповідного \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" -#: pgc.l:1247 pgc.l:1258 pgc.l:1439 +#: pgc.l:1253 pgc.l:1264 pgc.l:1445 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "відсутній \"EXEC SQL ENDIF;\"" -#: pgc.l:1273 pgc.l:1295 +#: pgc.l:1279 pgc.l:1301 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "більше ніж один EXEC SQL ELSE" -#: pgc.l:1318 pgc.l:1332 +#: pgc.l:1324 pgc.l:1338 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "невідповідний EXEC SQL ENDIF" -#: pgc.l:1387 +#: pgc.l:1393 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "відсутній ідентифікатор у команді EXEC SQL IFDEF" -#: pgc.l:1396 +#: pgc.l:1402 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "відсутній ідентифікатор у команді EXEC SQL DEFINE" -#: pgc.l:1429 +#: pgc.l:1435 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "синтаксична помилка у команді EXEC SQL INCLUDE" -#: pgc.l:1479 +#: pgc.l:1485 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "внутрішня помилка: недосяжний стан; будь ласка, повідомте про це на <%s>" -#: pgc.l:1631 +#: pgc.l:1637 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "Помилка: шлях включення \"%s/%s\" занадто довгий у рядку %d, пропускається\n" -#: pgc.l:1654 +#: pgc.l:1660 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "не вдалося відкрити файл включення \"%s\" у рядку %d" @@ -324,210 +334,220 @@ msgstr "не вдалося відкрити файл включення \"%s\" msgid "syntax error" msgstr "синтаксична помилка" -#: preproc.y:82 +#: preproc.y:84 #, c-format msgid "WARNING: " msgstr "ПОПЕРЕДЖЕННЯ: " -#: preproc.y:85 +#: preproc.y:87 #, c-format msgid "ERROR: " msgstr "ПОМИЛКА: " -#: preproc.y:512 +#: preproc.y:514 #, c-format msgid "cursor \"%s\" does not exist" msgstr "курсор \"%s\" не існує" -#: preproc.y:541 +#: preproc.y:543 #, c-format msgid "initializer not allowed in type definition" msgstr "ініціалізація заборонена у визначенні типу" -#: preproc.y:543 +#: preproc.y:545 #, c-format msgid "type name \"string\" is reserved in Informix mode" msgstr "ім’я типу \"string\" зарезервовано у режимі Informix" -#: preproc.y:550 preproc.y:15960 +#: preproc.y:552 preproc.y:17675 #, c-format msgid "type \"%s\" is already defined" msgstr "тип \"%s\" вже визначений" -#: preproc.y:575 preproc.y:16603 preproc.y:16928 variable.c:621 +#: preproc.y:577 preproc.y:18310 preproc.y:18635 variable.c:621 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "багатовимірні масиви для простих типів даних не підтримуються" -#: preproc.y:1704 +#: preproc.y:599 +#, c-format +msgid "connection %s is overwritten to %s." +msgstr "підключення %s перезаписано на %s." + +#: preproc.y:1753 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "Параметр AT не дозволений в інструкції CLOSE DATABASE" -#: preproc.y:1952 +#: preproc.y:2001 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "Параметр AT не дозволений в інструкції CONNECT" -#: preproc.y:1986 +#: preproc.y:2041 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "Параметр AT не дозволений в інструкції DISCONNECT" -#: preproc.y:2041 +#: preproc.y:2096 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "Параметр AT не дозволений в інструкції SET CONNECTION" -#: preproc.y:2063 +#: preproc.y:2118 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "Параметр AT не дозволений в інструкції TYPE" -#: preproc.y:2072 +#: preproc.y:2127 #, c-format msgid "AT option not allowed in VAR statement" msgstr "Параметр AT не дозволений в інструкції VAR" -#: preproc.y:2079 +#: preproc.y:2134 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "Параметр AT не дозволений в інструкції WHENEVER" -#: preproc.y:2156 preproc.y:2328 preproc.y:2333 preproc.y:2456 preproc.y:4034 -#: preproc.y:4682 preproc.y:5624 preproc.y:5924 preproc.y:7542 preproc.y:9081 -#: preproc.y:9086 preproc.y:11921 +#: preproc.y:2211 preproc.y:2383 preproc.y:2388 preproc.y:2511 preproc.y:4143 +#: preproc.y:4807 preproc.y:5340 preproc.y:5678 preproc.y:5978 preproc.y:7514 +#: preproc.y:9082 preproc.y:9087 preproc.y:11915 #, c-format msgid "unsupported feature will be passed to server" msgstr "непідтримувана функція буде передана до сервера" -#: preproc.y:2714 +#: preproc.y:2769 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL не реалізовано" -#: preproc.y:3382 +#: preproc.y:3464 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN не реалізовано" -#: preproc.y:10060 preproc.y:15545 +#: preproc.y:10014 preproc.y:17250 +#, c-format +msgid "\"database\" cannot be used as cursor name in INFORMIX mode" +msgstr "\"database\" не може використовуватись як назва курсора в режимі INFORMIX" + +#: preproc.y:10021 preproc.y:17260 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "використання змінної \"%s\" у різних інструкціях declare не підтримується" -#: preproc.y:10062 preproc.y:15547 +#: preproc.y:10023 preproc.y:17262 #, c-format msgid "cursor \"%s\" is already defined" msgstr "курсор \"%s\" вже визначено" -#: preproc.y:10502 +#: preproc.y:10497 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "непідтримуваний синтаксис LIMIT #,# передано до сервера" -#: preproc.y:10835 preproc.y:10842 +#: preproc.y:10830 preproc.y:10837 #, c-format msgid "subquery in FROM must have an alias" msgstr "підзапит в FROM повинен мати псевдонім" -#: preproc.y:15268 preproc.y:15275 +#: preproc.y:16942 preproc.y:16949 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS не може містити INTO" -#: preproc.y:15311 +#: preproc.y:16985 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "очікувалося \"@\", знайдено \"%s\"" -#: preproc.y:15323 +#: preproc.y:16997 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "підтримуються лише протоколи \"tcp\" та \"unix\" і тип бази даних \"postgresql\"" -#: preproc.y:15326 +#: preproc.y:17000 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "очікувалося \"://\", знайдено \"%s\"" -#: preproc.y:15331 +#: preproc.y:17005 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Unix-сокети працюють лише з \"localhost\", але не з \"%s\"" -#: preproc.y:15357 +#: preproc.y:17031 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "очікувалось \"postgresql\", знайдено \"%s\"" -#: preproc.y:15360 +#: preproc.y:17034 #, c-format msgid "invalid connection type: %s" msgstr "неприпустимий тип підключення: %s" -#: preproc.y:15369 +#: preproc.y:17043 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "очікувалось \"@\" або \"://\", знайдено \"%s\"" -#: preproc.y:15444 preproc.y:15462 +#: preproc.y:17118 preproc.y:17136 #, c-format msgid "invalid data type" msgstr "неприпустимий тип даних" -#: preproc.y:15473 preproc.y:15490 +#: preproc.y:17147 preproc.y:17164 #, c-format msgid "incomplete statement" msgstr "неповний оператор" -#: preproc.y:15476 preproc.y:15493 +#: preproc.y:17150 preproc.y:17167 #, c-format msgid "unrecognized token \"%s\"" msgstr "нерозпізнаний токен \"%s\"" -#: preproc.y:15763 +#: preproc.y:17212 +#, c-format +msgid "name \"%s\" is already declared" +msgstr "ім'я \"%s\" вже оголошена" + +#: preproc.y:17478 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "точність/масштаб можна вказати лише для типів даних numeric і decimal" -#: preproc.y:15775 +#: preproc.y:17490 #, c-format msgid "interval specification not allowed here" msgstr "специфікація інтервалу тут не допускається" -#: preproc.y:15935 preproc.y:15987 +#: preproc.y:17650 preproc.y:17702 #, c-format msgid "too many levels in nested structure/union definition" msgstr "занадто багато рівнів у визначенні вкладеної структури/об'єднання" -#: preproc.y:16110 +#: preproc.y:17825 #, c-format msgid "pointers to varchar are not implemented" msgstr "вказівників на varchar не реалізовано" -#: preproc.y:16297 preproc.y:16322 -#, c-format -msgid "using unsupported DESCRIBE statement" -msgstr "використовується непідтримуваний оператор DESCRIBE" - -#: preproc.y:16569 +#: preproc.y:18276 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "команда EXEC SQL VAR не допускає ініціалізатор" -#: preproc.y:16886 +#: preproc.y:18593 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "вхідні масиви індикаторів не допускаються" -#: preproc.y:17073 +#: preproc.y:18780 #, c-format msgid "operator not allowed in variable definition" msgstr "у визначенні змінної оператор не допускається" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:17114 +#: preproc.y:18821 #, c-format msgid "%s at or near \"%s\"" msgstr "%s в або поблизу \"%s\"" diff --git a/src/interfaces/ecpg/preproc/po/zh_CN.po b/src/interfaces/ecpg/preproc/po/zh_CN.po index 0af39c4f76..74fd9da89f 100644 --- a/src/interfaces/ecpg/preproc/po/zh_CN.po +++ b/src/interfaces/ecpg/preproc/po/zh_CN.po @@ -5,16 +5,16 @@ # msgid "" msgstr "" -"Project-Id-Version: ecpg (PostgreSQL) 12\n" +"Project-Id-Version: ecpg (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-05-23 18:42+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:39+0000\n" +"PO-Revision-Date: 2021-08-15 18:42+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.5.4\n" @@ -23,32 +23,35 @@ msgstr "" msgid "variable \"%s\" must have a numeric type" msgstr "变量 \"%s\"必须是数值类型" -#: descriptor.c:124 descriptor.c:146 -#, c-format -msgid "descriptor \"%s\" does not exist" -msgstr "描述符\"%s\"不存在" +#: descriptor.c:125 descriptor.c:156 +msgid "descriptor %s bound to connection %s does not exist" +msgstr "绑定到连接%2$s的描述符%1$s不存在" -#: descriptor.c:161 descriptor.c:213 +#: descriptor.c:127 descriptor.c:158 +msgid "descriptor %s bound to the default connection does not exist" +msgstr "绑定到默认连接%2$s的描述符%1$s不存在" + +#: descriptor.c:173 descriptor.c:225 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "描述符标题成员\"%d\"不存在" -#: descriptor.c:183 +#: descriptor.c:195 #, c-format msgid "nullable is always 1" msgstr "可为空永远用1表示" -#: descriptor.c:186 +#: descriptor.c:198 #, c-format msgid "key_member is always 0" msgstr "key_member永远是0" -#: descriptor.c:280 +#: descriptor.c:292 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "没有使用描述符成员\"%s\"." -#: descriptor.c:290 +#: descriptor.c:302 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "无法设置描述符成员 \"%s\"" @@ -170,162 +173,175 @@ msgstr "" #, c-format msgid "" "\n" -"Report bugs to .\n" +"Report bugs to <%s>.\n" msgstr "" "\n" -"错误报告至 .\n" +"臭虫报告至<%s>.\n" + +#: ecpg.c:63 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 主页: <%s>\n" -#: ecpg.c:182 +#: ecpg.c:141 #, c-format msgid "%s: could not locate my own executable path\n" msgstr "%s: 找不到我的可执行文件路径\n" -#: ecpg.c:217 ecpg.c:374 ecpg.c:385 +#: ecpg.c:176 ecpg.c:333 ecpg.c:344 #, c-format msgid "%s: could not open file \"%s\": %s\n" msgstr "%s: 无法打开文件 \"%s\": %s\n" -#: ecpg.c:260 ecpg.c:273 ecpg.c:289 ecpg.c:315 +#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "请用 \"%s --help\" 获取更多的信息.\n" -#: ecpg.c:284 +#: ecpg.c:243 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: 解析器跟踪调试支持(-d)无效\n" -#: ecpg.c:303 +#: ecpg.c:262 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, PostgreSQL嵌入式C语言预处理器, 版本%s\n" -#: ecpg.c:305 +#: ecpg.c:264 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "EXEC SQL INCLUDE ... 从这里开始搜索:\n" -#: ecpg.c:308 +#: ecpg.c:267 #, c-format msgid "end of search list\n" msgstr "搜索列表的结束部分\n" -#: ecpg.c:314 +#: ecpg.c:273 #, c-format msgid "%s: no input files specified\n" msgstr "%s: 没有指定输入文件\n" -#: ecpg.c:497 +#: ecpg.c:477 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "已经声明了游标\"%s\",但是没有打开" -#: ecpg.c:510 preproc.y:129 +#: ecpg.c:490 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "无法删除输出文件 \"%s\"\n" -#: pgc.l:472 +#: pgc.l:502 #, c-format msgid "unterminated /* comment" msgstr "/* 注释没有结束" -#: pgc.l:490 -#, c-format -msgid "invalid bit string literal" -msgstr "无效的bit字符串常量" - -#: pgc.l:502 +#: pgc.l:519 #, c-format msgid "unterminated bit string literal" msgstr "未结束的bit字符串常量" -#: pgc.l:518 +#: pgc.l:527 #, c-format msgid "unterminated hexadecimal string literal" msgstr "未结束的16进制字符串常量" -#: pgc.l:614 pgc.l:718 +#: pgc.l:602 +#, c-format +msgid "invalid bit string literal" +msgstr "无效的bit字符串常量" + +#: pgc.l:607 +msgid "invalid hex string literal" +msgstr "无效的十六进制字符串常量" + +#: pgc.l:625 +#, c-format +msgid "unhandled previous state in xqs\n" +msgstr "xqs中未处理的先前状态\n" + +#: pgc.l:651 pgc.l:760 #, c-format msgid "unterminated quoted string" msgstr "未结束的引用字符串" -#: pgc.l:665 +#: pgc.l:702 #, c-format msgid "unterminated dollar-quoted string" msgstr "未结束的用$符号引用的字符串" -#: pgc.l:684 pgc.l:697 +#: pgc.l:720 pgc.l:740 #, c-format msgid "zero-length delimited identifier" msgstr "长度为0的分隔标识符" -#: pgc.l:709 +#: pgc.l:751 #, c-format msgid "unterminated quoted identifier" msgstr "未结束的引用标识符" -#: pgc.l:1040 +#: pgc.l:1082 #, c-format msgid "nested /* ... */ comments" msgstr "有嵌套注释/*...*/" -#: pgc.l:1133 +#: pgc.l:1175 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "在EXEC SQL UNDEF命令中丢失标识符" -#: pgc.l:1179 pgc.l:1193 +#: pgc.l:1193 pgc.l:1206 pgc.l:1222 pgc.l:1235 +#, c-format +msgid "too many nested EXEC SQL IFDEF conditions" +msgstr "嵌套EXEC SQL IFDEF条件太多" + +#: pgc.l:1251 pgc.l:1262 pgc.l:1277 pgc.l:1299 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "丢失匹配 \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" -#: pgc.l:1182 pgc.l:1195 pgc.l:1371 +#: pgc.l:1253 pgc.l:1264 pgc.l:1445 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "\"EXEC SQL ENDIF;\"丢失" -#: pgc.l:1211 pgc.l:1230 +#: pgc.l:1279 pgc.l:1301 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "多个EXEC SQL ELSE" -#: pgc.l:1252 pgc.l:1266 +#: pgc.l:1324 pgc.l:1338 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "EXEC SQL ENDIF不匹配" -#: pgc.l:1286 -#, c-format -msgid "too many nested EXEC SQL IFDEF conditions" -msgstr "嵌套EXEC SQL IFDEF条件太多" - -#: pgc.l:1319 +#: pgc.l:1393 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "在EXEC SQL IFDEF命令中丢失标识符" -#: pgc.l:1328 +#: pgc.l:1402 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "在EXEC SQL DEFINE命令中丢失标识符" -#: pgc.l:1361 +#: pgc.l:1435 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "在EXEC SQL INCLUDE命令中出现语法错误" -#: pgc.l:1411 -#, c-format -msgid "internal error: unreachable state; please report this to " -msgstr "内部错误:不可到达的状态;请向发送报告" +#: pgc.l:1485 +msgid "internal error: unreachable state; please report this to <%s>" +msgstr "内部错误:不可到达的状态;请向<%s>发送报告" -#: pgc.l:1562 +#: pgc.l:1637 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "错误:在第%3$d行上包含路径\"%1$s/%2$s\"太长,跳过\n" -#: pgc.l:1585 +#: pgc.l:1660 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "在第%2$d行无法打开应用文件\"%1$s\"" @@ -334,215 +350,217 @@ msgstr "在第%2$d行无法打开应用文件\"%1$s\"" msgid "syntax error" msgstr "语法错误" -#: preproc.y:83 +#: preproc.y:84 #, c-format msgid "WARNING: " msgstr "警告:" -#: preproc.y:86 +#: preproc.y:87 #, c-format msgid "ERROR: " msgstr "错误:" -#: preproc.y:510 +#: preproc.y:514 #, c-format msgid "cursor \"%s\" does not exist" msgstr "游标 \"%s\" 不存在" -#: preproc.y:539 +#: preproc.y:543 #, c-format msgid "initializer not allowed in type definition" msgstr "在类型定义中不允许进行初始化" -#: preproc.y:541 +#: preproc.y:545 #, c-format msgid "type name \"string\" is reserved in Informix mode" msgstr "在Informix模式中类型名称\"string\" 是被保留的" -#: preproc.y:548 preproc.y:15877 +#: preproc.y:552 preproc.y:17675 #, c-format msgid "type \"%s\" is already defined" msgstr "已定义类型\"%s\" " -#: preproc.y:573 preproc.y:16548 preproc.y:16873 variable.c:621 +#: preproc.y:577 preproc.y:18310 preproc.y:18635 variable.c:621 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "不支持针对简单数据类型的多维数组" -#: preproc.y:1938 +#: preproc.y:599 +msgid "connection %s is overwritten to %s." +msgstr "连接%s被覆盖到%s." + +#: preproc.y:1753 +#, c-format +msgid "AT option not allowed in CLOSE DATABASE statement" +msgstr "在CLOSE DATABASE语句中不允许使用AT选项" + +#: preproc.y:2001 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "在CONNECT语句中不允许使用AT选项" -#: preproc.y:1976 +#: preproc.y:2041 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "在DISCONNECT语句中不允许使用AT选项" -#: preproc.y:2038 +#: preproc.y:2096 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "在SET CONNECTION语句中不允许使用AT选项" -#: preproc.y:2060 +#: preproc.y:2118 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "在TYPE语句中不允许使用AT选项" -#: preproc.y:2069 +#: preproc.y:2127 #, c-format msgid "AT option not allowed in VAR statement" msgstr "在VAR语句中不允许使用AT选项" -#: preproc.y:2076 +#: preproc.y:2134 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "在WHENEVER语句中不允许使用AT选项" -#: preproc.y:2153 preproc.y:2325 preproc.y:2330 preproc.y:2453 preproc.y:4046 -#: preproc.y:5635 preproc.y:5935 preproc.y:7563 preproc.y:9075 preproc.y:9080 -#: preproc.y:11880 +#: preproc.y:2211 preproc.y:2383 preproc.y:2388 preproc.y:2511 preproc.y:4143 +#: preproc.y:4807 preproc.y:5340 preproc.y:5678 preproc.y:5978 preproc.y:7514 +#: preproc.y:9082 preproc.y:9087 preproc.y:11915 #, c-format msgid "unsupported feature will be passed to server" msgstr "不支持的功能特性将会传递给服务器" -#: preproc.y:2711 +#: preproc.y:2769 #, c-format msgid "SHOW ALL is not implemented" msgstr "没有使用SHOW ALL" -#: preproc.y:3369 -#, c-format -msgid "AT option not allowed in CLOSE DATABASE statement" -msgstr "在CLOSE DATABASE语句中不允许使用AT选项" - -#: preproc.y:3394 +#: preproc.y:3464 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "不能进行COPY FROM STDIN的操作" -#: preproc.y:10026 preproc.y:15460 +#: preproc.y:10014 preproc.y:17250 +msgid "\"database\" cannot be used as cursor name in INFORMIX mode" +msgstr "在INFORMIX模式下,\"database\"不能用作游标名称" + +#: preproc.y:10021 preproc.y:17260 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "不支持在不同的声明语句中使用变量\"%s\"" -#: preproc.y:10028 preproc.y:15462 +#: preproc.y:10023 preproc.y:17262 #, c-format msgid "cursor \"%s\" is already defined" msgstr "已经定义了游标\"%s\"" -#: preproc.y:10469 +#: preproc.y:10497 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "不再支持将LIMIT #,#语法传递给服务器" -#: preproc.y:10794 preproc.y:10801 +#: preproc.y:10830 preproc.y:10837 #, c-format msgid "subquery in FROM must have an alias" msgstr "FROM 中的子查询必须有一个别名" -#: preproc.y:15151 preproc.y:15158 +#: preproc.y:16942 preproc.y:16949 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "在CREATE TABLE AS语句中不能指定INTO子句" -#: preproc.y:15194 +#: preproc.y:16985 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "期望 \"@\", 但是找到了\"%s\"" -#: preproc.y:15206 +#: preproc.y:16997 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "只支持协议\"tcp\"和 \"unix\"以及数据库类型 \"postgresql\"" -#: preproc.y:15209 +#: preproc.y:17000 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "期望得到 \"://\",但是找到了\"%s\"" -#: preproc.y:15214 +#: preproc.y:17005 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Unix-域的sockets只能在\"localhost\"上运行,而不能在\"%s\"上运行" -#: preproc.y:15240 +#: preproc.y:17031 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "期望\"postgresql\", 但是只找到了\"%s\"" -#: preproc.y:15243 +#: preproc.y:17034 #, c-format msgid "invalid connection type: %s" msgstr "无效的连接类型: %s" -#: preproc.y:15252 +#: preproc.y:17043 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "期望\"@\"或\"://\",但是只找到了\"%s\"" -#: preproc.y:15327 preproc.y:15345 +#: preproc.y:17118 preproc.y:17136 #, c-format msgid "invalid data type" msgstr "无效数据类型" -#: preproc.y:15356 preproc.y:15373 +#: preproc.y:17147 preproc.y:17164 #, c-format msgid "incomplete statement" msgstr "未结束的语句" -#: preproc.y:15359 preproc.y:15376 +#: preproc.y:17150 preproc.y:17167 #, c-format msgid "unrecognized token \"%s\"" msgstr "无法识别的符号\"%s\"" -#: preproc.y:15422 -#, c-format -msgid "declared name %s is already defined" -msgstr "已定义声明的名称%s" +#: preproc.y:17212 +msgid "name \"%s\" is already declared" +msgstr "已声明名称\"%s\"" -#: preproc.y:15680 +#: preproc.y:17478 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "只有数据类型numeric和decimal有精度/范围参数" -#: preproc.y:15692 +#: preproc.y:17490 #, c-format msgid "interval specification not allowed here" msgstr "在这里不允许使用间隔定义" -#: preproc.y:15852 preproc.y:15904 +#: preproc.y:17650 preproc.y:17702 #, c-format msgid "too many levels in nested structure/union definition" msgstr "在嵌套结构/联合定义中存在太多的层次" -#: preproc.y:16055 +#: preproc.y:17825 #, c-format msgid "pointers to varchar are not implemented" msgstr "没有实现指向varchar类型值的指针" -#: preproc.y:16242 preproc.y:16267 -#, c-format -msgid "using unsupported DESCRIBE statement" -msgstr "使用不支持的DESCRIBE语句" - -#: preproc.y:16514 +#: preproc.y:18276 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "在EXEC SQL VAR命令中不允许初始化" -#: preproc.y:16831 +#: preproc.y:18593 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "在输入上不允许使用标识数组" -#: preproc.y:17052 +#: preproc.y:18780 #, c-format msgid "operator not allowed in variable definition" msgstr "操作符不允许出现在变量定义当中" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:17093 +#: preproc.y:18821 #, c-format msgid "%s at or near \"%s\"" msgstr "%s 在 \"%s\" 或附近的" @@ -550,7 +568,7 @@ msgstr "%s 在 \"%s\" 或附近的" #: type.c:18 type.c:30 #, c-format msgid "out of memory" -msgstr "内存用尽" +msgstr "内存不足" #: type.c:214 type.c:685 #, c-format @@ -672,3 +690,4 @@ msgstr "对于这种数据类型不支持指向指针的指针" #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "不支持结构类型的多维数组" + diff --git a/src/interfaces/libpq/po/de.po b/src/interfaces/libpq/po/de.po index c34b84ec39..99b2e6f38f 100644 --- a/src/interfaces/libpq/po/de.po +++ b/src/interfaces/libpq/po/de.po @@ -1,14 +1,14 @@ # German message translation file for libpq -# Peter Eisentraut , 2001 - 2021. +# Peter Eisentraut , 2001 - 2022. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-03 16:39+0000\n" -"PO-Revision-Date: 2021-05-03 19:42+0200\n" +"POT-Creation-Date: 2022-05-10 05:40+0000\n" +"PO-Revision-Date: 2022-05-10 18:12+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -16,97 +16,109 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: fe-auth-scram.c:213 +#: fe-auth-scram.c:231 msgid "malformed SCRAM message (empty message)\n" msgstr "fehlerhafte SCRAM-Nachricht (leere Nachricht)\n" -#: fe-auth-scram.c:219 +#: fe-auth-scram.c:237 msgid "malformed SCRAM message (length mismatch)\n" msgstr "fehlerhafte SCRAM-Nachricht (Länge stimmt nicht überein)\n" -#: fe-auth-scram.c:263 -msgid "could not verify server signature\n" -msgstr "konnte Serversignatur nicht überprüfen\n" +#: fe-auth-scram.c:281 +#, c-format +msgid "could not verify server signature: %s\n" +msgstr "konnte Serversignatur nicht überprüfen: %s\n" -#: fe-auth-scram.c:270 +#: fe-auth-scram.c:288 msgid "incorrect server signature\n" msgstr "falsche Serversignatur\n" -#: fe-auth-scram.c:279 +#: fe-auth-scram.c:297 msgid "invalid SCRAM exchange state\n" msgstr "ungültiger Zustand des SCRAM-Austauschs\n" -#: fe-auth-scram.c:306 +#: fe-auth-scram.c:324 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)\n" msgstr "fehlerhafte SCRAM-Nachricht (Attribut »%c« erwartet)\n" -#: fe-auth-scram.c:315 +#: fe-auth-scram.c:333 #, c-format msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" msgstr "fehlerhafte SCRAM-Nachricht (Zeichen »=« für Attribut »%c« erwartet)\n" -#: fe-auth-scram.c:356 +#: fe-auth-scram.c:374 msgid "could not generate nonce\n" msgstr "konnte Nonce nicht erzeugen\n" -#: fe-auth-scram.c:366 fe-auth-scram.c:441 fe-auth-scram.c:595 -#: fe-auth-scram.c:616 fe-auth-scram.c:642 fe-auth-scram.c:657 -#: fe-auth-scram.c:707 fe-auth-scram.c:746 fe-auth.c:290 fe-auth.c:362 -#: fe-auth.c:398 fe-auth.c:615 fe-auth.c:774 fe-auth.c:1132 fe-auth.c:1282 -#: fe-connect.c:912 fe-connect.c:1456 fe-connect.c:1625 fe-connect.c:2977 -#: fe-connect.c:4658 fe-connect.c:4919 fe-connect.c:5038 fe-connect.c:5282 -#: fe-connect.c:5364 fe-connect.c:5463 fe-connect.c:5719 fe-connect.c:5748 -#: fe-connect.c:5820 fe-connect.c:5844 fe-connect.c:5862 fe-connect.c:5963 -#: fe-connect.c:5972 fe-connect.c:6330 fe-connect.c:6480 fe-exec.c:1209 -#: fe-exec.c:2993 fe-exec.c:3145 fe-exec.c:3918 fe-exec.c:4083 -#: fe-gssapi-common.c:110 fe-lobj.c:881 fe-protocol3.c:1016 fe-protocol3.c:1724 -#: fe-secure-common.c:110 fe-secure-gssapi.c:504 fe-secure-openssl.c:440 -#: fe-secure-openssl.c:1129 +#: fe-auth-scram.c:384 fe-auth-scram.c:459 fe-auth-scram.c:615 +#: fe-auth-scram.c:636 fe-auth-scram.c:662 fe-auth-scram.c:677 +#: fe-auth-scram.c:727 fe-auth-scram.c:766 fe-auth.c:290 fe-auth.c:362 +#: fe-auth.c:398 fe-auth.c:623 fe-auth.c:799 fe-auth.c:1152 fe-auth.c:1322 +#: fe-connect.c:906 fe-connect.c:1455 fe-connect.c:1624 fe-connect.c:2976 +#: fe-connect.c:4823 fe-connect.c:5084 fe-connect.c:5203 fe-connect.c:5455 +#: fe-connect.c:5536 fe-connect.c:5635 fe-connect.c:5891 fe-connect.c:5920 +#: fe-connect.c:5992 fe-connect.c:6016 fe-connect.c:6034 fe-connect.c:6135 +#: fe-connect.c:6144 fe-connect.c:6502 fe-connect.c:6652 fe-connect.c:6918 +#: fe-exec.c:710 fe-exec.c:976 fe-exec.c:1324 fe-exec.c:3135 fe-exec.c:3318 +#: fe-exec.c:4096 fe-exec.c:4261 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:985 fe-protocol3.c:1000 fe-protocol3.c:1033 +#: fe-protocol3.c:1741 fe-protocol3.c:2144 fe-secure-common.c:112 +#: fe-secure-gssapi.c:504 fe-secure-openssl.c:449 fe-secure-openssl.c:1261 msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: fe-auth-scram.c:374 +#: fe-auth-scram.c:392 msgid "could not encode nonce\n" msgstr "konnte Nonce nicht kodieren\n" -#: fe-auth-scram.c:563 -msgid "could not calculate client proof\n" -msgstr "konnte Client-Proof nicht berechnen\n" +#: fe-auth-scram.c:582 +#, c-format +msgid "could not calculate client proof: %s\n" +msgstr "konnte Client-Proof nicht berechnen: %s\n" -#: fe-auth-scram.c:579 +#: fe-auth-scram.c:599 msgid "could not encode client proof\n" msgstr "konnte Client-Proof nicht kodieren\n" -#: fe-auth-scram.c:634 +#: fe-auth-scram.c:654 msgid "invalid SCRAM response (nonce mismatch)\n" msgstr "ungültige SCRAM-Antwort (Nonce stimmt nicht überein)\n" -#: fe-auth-scram.c:667 +#: fe-auth-scram.c:687 msgid "malformed SCRAM message (invalid salt)\n" msgstr "fehlerhafte SCRAM-Nachricht (ungültiges Salt)\n" -#: fe-auth-scram.c:681 +#: fe-auth-scram.c:701 msgid "malformed SCRAM message (invalid iteration count)\n" msgstr "fehlerhafte SCRAM-Nachricht (ungültige Iterationszahl)\n" -#: fe-auth-scram.c:687 +#: fe-auth-scram.c:707 msgid "malformed SCRAM message (garbage at end of server-first-message)\n" msgstr "fehlerhafte SCRAM-Nachricht (Müll am Ende der »server-first-message«)\n" -#: fe-auth-scram.c:723 +#: fe-auth-scram.c:743 #, c-format msgid "error received from server in SCRAM exchange: %s\n" msgstr "Fehler vom Server empfangen im SCRAM-Austausch: %s\n" -#: fe-auth-scram.c:739 +#: fe-auth-scram.c:759 msgid "malformed SCRAM message (garbage at end of server-final-message)\n" msgstr "fehlerhafte SCRAM-Nachricht (Müll am Ende der »server-final-message«)\n" -#: fe-auth-scram.c:758 +#: fe-auth-scram.c:778 msgid "malformed SCRAM message (invalid server signature)\n" msgstr "fehlerhafte SCRAM-Nachricht (ungültige Serversignatur)\n" +#: fe-auth-scram.c:934 fe-exec.c:527 fe-protocol3.c:219 fe-protocol3.c:244 +#: fe-protocol3.c:273 fe-protocol3.c:291 fe-protocol3.c:372 fe-protocol3.c:745 +msgid "out of memory" +msgstr "Speicher aufgebraucht" + +#: fe-auth-scram.c:943 +msgid "failed to generate random salt" +msgstr "konnte zufälliges Salt nicht erzeugen" + #: fe-auth.c:76 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)\n" @@ -116,7 +128,8 @@ msgstr "Speicher aufgebraucht beim Anlegen des GSSAPI-Puffers (%d)\n" msgid "GSSAPI continuation error" msgstr "GSSAPI-Fortsetzungsfehler" -#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:97 fe-secure-common.c:98 +#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:98 fe-secure-common.c:100 +#: fe-secure-common.c:177 msgid "host name must be specified\n" msgstr "Hostname muss angegeben werden\n" @@ -149,630 +162,613 @@ msgstr "Channel-Binding wurde verlangt, aber SSL wird nicht verwendet\n" msgid "duplicate SASL authentication request\n" msgstr "doppelte SASL-Authentifizierungsanfrage\n" -#: fe-auth.c:496 +#: fe-auth.c:499 msgid "channel binding is required, but client does not support it\n" msgstr "Channel-Binding wurde verlangt, aber der Client unterstützt es nicht\n" -#: fe-auth.c:513 +#: fe-auth.c:516 msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" msgstr "Server hat Authentifizierung mit SCRAM-SHA-256-PLUS über eine Verbindung ohne SSL angeboten\n" -#: fe-auth.c:525 +#: fe-auth.c:531 msgid "none of the server's SASL authentication mechanisms are supported\n" msgstr "keine der SASL-Authentifizierungsmechanismen des Servers werden unterstützt\n" -#: fe-auth.c:533 +#: fe-auth.c:539 msgid "channel binding is required, but server did not offer an authentication method that supports channel binding\n" msgstr "Channel-Binding wurde verlangt, aber der Server hat keine Authentifizierungsmethode mit Channel-Binding angeboten\n" -#: fe-auth.c:639 +#: fe-auth.c:647 #, c-format msgid "out of memory allocating SASL buffer (%d)\n" msgstr "Speicher aufgebraucht beim Anlegen des SASL-Puffers (%d)\n" -#: fe-auth.c:664 +#: fe-auth.c:672 msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed\n" msgstr "AuthenticationSASLFinal vom Server empfangen, aber SASL-Authentifizierung war noch nicht abgeschlossen\n" -#: fe-auth.c:741 +#: fe-auth.c:683 +msgid "no client response found after SASL exchange success\n" +msgstr "keine Client-Antwort gefunden nach Erfolg des SASL-Austauschs\n" + +#: fe-auth.c:765 msgid "SCM_CRED authentication method not supported\n" msgstr "SCM_CRED-Authentifizierungsmethode nicht unterstützt\n" -#: fe-auth.c:836 +#: fe-auth.c:809 fe-auth.c:818 fe-auth.c:1301 fe-auth.c:1314 +#, c-format +msgid "could not encrypt password: %s\n" +msgstr "konnte Passwort nicht verschlüsseln: %s\n" + +#: fe-auth.c:868 msgid "channel binding required, but server authenticated client without channel binding\n" msgstr "Channel-Binding wurde verlangt, aber der Server hat den Client ohne Channel-Binding authentifiziert\n" -#: fe-auth.c:842 +#: fe-auth.c:874 msgid "channel binding required but not supported by server's authentication request\n" msgstr "Channel-Binding wurde verlangt aber von der Authentifizierungsanfrage des Servers nicht unterstützt\n" -#: fe-auth.c:877 +#: fe-auth.c:909 msgid "Kerberos 4 authentication not supported\n" msgstr "Authentifizierung mit Kerberos 4 nicht unterstützt\n" -#: fe-auth.c:882 +#: fe-auth.c:914 msgid "Kerberos 5 authentication not supported\n" msgstr "Authentifizierung mit Kerberos 5 nicht unterstützt\n" -#: fe-auth.c:953 +#: fe-auth.c:985 msgid "GSSAPI authentication not supported\n" msgstr "Authentifizierung mit GSSAPI nicht unterstützt\n" -#: fe-auth.c:985 +#: fe-auth.c:1017 msgid "SSPI authentication not supported\n" msgstr "Authentifizierung mit SSPI nicht unterstützt\n" -#: fe-auth.c:993 +#: fe-auth.c:1025 msgid "Crypt authentication not supported\n" msgstr "Authentifizierung mit Crypt nicht unterstützt\n" -#: fe-auth.c:1060 +#: fe-auth.c:1092 #, c-format msgid "authentication method %u not supported\n" msgstr "Authentifizierungsmethode %u nicht unterstützt\n" -#: fe-auth.c:1107 +#: fe-auth.c:1138 #, c-format msgid "user name lookup failure: error code %lu\n" msgstr "Fehler beim Nachschlagen des Benutzernamens: Fehlercode %lu\n" -#: fe-auth.c:1117 fe-connect.c:2852 -#, c-format -msgid "could not look up local user ID %d: %s\n" -msgstr "konnte lokale Benutzer-ID %d nicht nachschlagen: %s\n" - -#: fe-auth.c:1122 fe-connect.c:2857 -#, c-format -msgid "local user with ID %d does not exist\n" -msgstr "lokaler Benutzer mit ID %d existiert nicht\n" - -#: fe-auth.c:1226 +#: fe-auth.c:1264 msgid "unexpected shape of result set returned for SHOW\n" msgstr "unerwartete Form der Ergebnismenge von SHOW\n" -#: fe-auth.c:1235 +#: fe-auth.c:1273 msgid "password_encryption value too long\n" msgstr "Wert von password_encryption ist zu lang\n" -#: fe-auth.c:1275 +#: fe-auth.c:1327 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" msgstr "unbekannter Passwortverschlüsselungsalgorithmus »%s«\n" -#: fe-connect.c:1095 +#: fe-connect.c:1089 #, c-format msgid "could not match %d host names to %d hostaddr values\n" msgstr "fehlerhafte Angabe: %d Hostnamen und %d hostaddr-Angaben\n" -#: fe-connect.c:1176 +#: fe-connect.c:1175 #, c-format msgid "could not match %d port numbers to %d hosts\n" msgstr "fehlerhafte Angabe: %d Portnummern und %d Hosts\n" -#: fe-connect.c:1269 fe-connect.c:1295 fe-connect.c:1337 fe-connect.c:1346 -#: fe-connect.c:1379 fe-connect.c:1423 +#: fe-connect.c:1268 fe-connect.c:1294 fe-connect.c:1336 fe-connect.c:1345 +#: fe-connect.c:1378 fe-connect.c:1422 #, c-format msgid "invalid %s value: \"%s\"\n" msgstr "ungültiger %s-Wert: »%s«\n" -#: fe-connect.c:1316 +#: fe-connect.c:1315 #, c-format msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" msgstr "sslmode-Wert »%s« ist ungültig, wenn SSL-Unterstützung nicht einkompiliert worden ist\n" -#: fe-connect.c:1364 +#: fe-connect.c:1363 msgid "invalid SSL protocol version range\n" msgstr "ungültiges SSL-Protokollsintervall\n" -#: fe-connect.c:1389 +#: fe-connect.c:1388 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" msgstr "gssencmode-Wert »%s« ist ungültig, wenn GSSAPI-Unterstützung nicht einkompiliert worden ist\n" -#: fe-connect.c:1649 +#: fe-connect.c:1648 #, c-format msgid "could not set socket to TCP no delay mode: %s\n" msgstr "konnte Socket nicht auf TCP »No Delay«-Modus umstellen: %s\n" -#: fe-connect.c:1711 -#, fuzzy, c-format -#| msgid "connection to server was lost" +#: fe-connect.c:1710 +#, c-format msgid "connection to server on socket \"%s\" failed: " -msgstr "Verbindung zum Server wurde verloren" +msgstr "Verbindung zum Server auf Socket »%s« fehlgeschlagen: " -#: fe-connect.c:1738 -#, fuzzy, c-format -#| msgid "connection to server was lost" +#: fe-connect.c:1737 +#, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " -msgstr "Verbindung zum Server wurde verloren" +msgstr "Verbindung zum Server auf »%s« (%s), Port %s fehlgeschlagen: " -#: fe-connect.c:1743 -#, fuzzy, c-format -#| msgid "connection to server was lost" +#: fe-connect.c:1742 +#, c-format msgid "connection to server at \"%s\", port %s failed: " -msgstr "Verbindung zum Server wurde verloren" - -#: fe-connect.c:1768 -#, fuzzy -#| msgid "" -#| "could not connect to server: %s\n" -#| "\tIs the server running locally and accepting\n" -#| "\tconnections on Unix domain socket \"%s\"?\n" +msgstr "Verbindung zum Server auf »%s«, Port %s fehlgeschlagen: " + +#: fe-connect.c:1767 msgid "\tIs the server running locally and accepting connections on that socket?\n" -msgstr "" -"konnte nicht mit dem Server verbinden: %s\n" -"\tLäuft der Server lokal und akzeptiert er Verbindungen\n" -"\tauf dem Unix-Domain-Socket »%s«?\n" - -#: fe-connect.c:1772 -#, fuzzy -#| msgid "" -#| "could not connect to server: %s\n" -#| "\tIs the server running on host \"%s\" and accepting\n" -#| "\tTCP/IP connections on port %s?\n" +msgstr "\tLäuft der Server lokal und akzeptiert er Verbindungen auf diesem Socket?\n" + +#: fe-connect.c:1771 msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" -msgstr "" -"konnte nicht mit dem Server verbinden: %s\n" -"\tLäuft der Server auf dem Host »%s« und akzeptiert er\n" -"\tTCP/IP-Verbindungen auf Port %s?\n" +msgstr "\tLäuft der Server auf diesem Host und akzeptiert er TCP/IP-Verbindungen?\n" -#: fe-connect.c:1836 +#: fe-connect.c:1835 #, c-format msgid "invalid integer value \"%s\" for connection option \"%s\"\n" msgstr "ungültiger Zahlenwert »%s« für Verbindungsoption »%s«\n" -#: fe-connect.c:1866 fe-connect.c:1901 fe-connect.c:1937 fe-connect.c:2026 -#: fe-connect.c:2640 +#: fe-connect.c:1865 fe-connect.c:1900 fe-connect.c:1936 fe-connect.c:2036 +#: fe-connect.c:2650 #, c-format msgid "%s(%s) failed: %s\n" msgstr "%s(%s) fehlgeschlagen: %s\n" -#: fe-connect.c:1991 +#: fe-connect.c:2001 #, c-format msgid "%s(%s) failed: error code %d\n" msgstr "%s(%s) fehlgeschlagen: Fehlercode %d\n" -#: fe-connect.c:2306 +#: fe-connect.c:2316 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "ungültiger Verbindungszustand, möglicherweise ein Speicherproblem\n" -#: fe-connect.c:2385 +#: fe-connect.c:2395 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "ungültige Portnummer: »%s«\n" -#: fe-connect.c:2401 +#: fe-connect.c:2411 #, c-format msgid "could not translate host name \"%s\" to address: %s\n" msgstr "konnte Hostnamen »%s« nicht in Adresse übersetzen: %s\n" -#: fe-connect.c:2414 +#: fe-connect.c:2424 #, c-format msgid "could not parse network address \"%s\": %s\n" msgstr "konnte Netzwerkadresse »%s« nicht interpretieren: %s\n" -#: fe-connect.c:2427 +#: fe-connect.c:2437 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" msgstr "Unix-Domain-Socket-Pfad »%s« ist zu lang (maximal %d Bytes)\n" -#: fe-connect.c:2442 +#: fe-connect.c:2452 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" msgstr "konnte Unix-Domain-Socket-Pfad »%s« nicht in Adresse übersetzen: %s\n" -#: fe-connect.c:2568 +#: fe-connect.c:2578 #, c-format msgid "could not create socket: %s\n" msgstr "konnte Socket nicht erzeugen: %s\n" -#: fe-connect.c:2599 +#: fe-connect.c:2609 #, c-format msgid "could not set socket to nonblocking mode: %s\n" msgstr "konnte Socket nicht auf nicht-blockierenden Modus umstellen: %s\n" -#: fe-connect.c:2609 +#: fe-connect.c:2619 #, c-format msgid "could not set socket to close-on-exec mode: %s\n" msgstr "konnte Socket nicht auf »Close on exec«-Modus umstellen: %s\n" -#: fe-connect.c:2627 +#: fe-connect.c:2637 msgid "keepalives parameter must be an integer\n" msgstr "Parameter »keepalives« muss eine ganze Zahl sein\n" -#: fe-connect.c:2768 +#: fe-connect.c:2778 #, c-format msgid "could not get socket error status: %s\n" msgstr "konnte Socket-Fehlerstatus nicht ermitteln: %s\n" -#: fe-connect.c:2796 +#: fe-connect.c:2806 #, c-format msgid "could not get client address from socket: %s\n" msgstr "konnte Client-Adresse vom Socket nicht ermitteln: %s\n" -#: fe-connect.c:2838 +#: fe-connect.c:2845 msgid "requirepeer parameter is not supported on this platform\n" msgstr "Parameter »requirepeer« wird auf dieser Plattform nicht unterstützt\n" -#: fe-connect.c:2841 +#: fe-connect.c:2848 #, c-format msgid "could not get peer credentials: %s\n" msgstr "konnte Credentials von Gegenstelle nicht ermitteln: %s\n" -#: fe-connect.c:2865 +#: fe-connect.c:2862 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" msgstr "requirepeer gibt »%s« an, aber tatsächlicher Benutzername der Gegenstelle ist »%s«\n" -#: fe-connect.c:2905 +#: fe-connect.c:2904 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "konnte Paket zur GSSAPI-Verhandlung nicht senden: %s\n" -#: fe-connect.c:2917 +#: fe-connect.c:2916 msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)\n" msgstr "GSSAPI-Verschlüsselung war gefordert aber war nicht möglich (möglicherweise kein Credential-Cache, keine Serverunterstützung oder lokales Socket wird verwendet)\n" -#: fe-connect.c:2959 +#: fe-connect.c:2958 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "konnte Paket zur SSL-Verhandlung nicht senden: %s\n" -#: fe-connect.c:2990 +#: fe-connect.c:2989 #, c-format msgid "could not send startup packet: %s\n" msgstr "konnte Startpaket nicht senden: %s\n" -#: fe-connect.c:3066 +#: fe-connect.c:3065 msgid "server does not support SSL, but SSL was required\n" msgstr "Server unterstützt kein SSL, aber SSL wurde verlangt\n" -#: fe-connect.c:3093 +#: fe-connect.c:3092 #, c-format msgid "received invalid response to SSL negotiation: %c\n" msgstr "ungültige Antwort auf SSL-Verhandlungspaket empfangen: %c\n" -#: fe-connect.c:3182 +#: fe-connect.c:3113 +msgid "received unencrypted data after SSL response\n" +msgstr "unverschlüsselte Daten nach SSL-Antwort empfangen\n" + +#: fe-connect.c:3194 msgid "server doesn't support GSSAPI encryption, but it was required\n" msgstr "Server unterstützt keine GSSAPI-Verschlüsselung, sie wurde aber verlangt\n" -#: fe-connect.c:3194 +#: fe-connect.c:3206 #, c-format msgid "received invalid response to GSSAPI negotiation: %c\n" msgstr "ungültige Antwort auf GSSAPI-Verhandlungspaket empfangen: %c\n" -#: fe-connect.c:3260 fe-connect.c:3285 +#: fe-connect.c:3225 +msgid "received unencrypted data after GSSAPI encryption response\n" +msgstr "unverschlüsselte Daten nach GSSAPI-Verschlüsselungsantwort empfangen\n" + +#: fe-connect.c:3285 fe-connect.c:3310 #, c-format msgid "expected authentication request from server, but received %c\n" msgstr "Authentifizierungsanfrage wurde vom Server erwartet, aber %c wurde empfangen\n" -#: fe-connect.c:3492 +#: fe-connect.c:3517 msgid "unexpected message from server during startup\n" msgstr "unerwartete Nachricht vom Server beim Start\n" -#: fe-connect.c:3584 +#: fe-connect.c:3609 msgid "session is read-only\n" msgstr "Sitzung ist read-only\n" -#: fe-connect.c:3587 +#: fe-connect.c:3612 msgid "session is not read-only\n" msgstr "Sitzung ist nicht read-only\n" -#: fe-connect.c:3641 +#: fe-connect.c:3666 msgid "server is in hot standby mode\n" msgstr "Server ist im Hot-Standby-Modus\n" -#: fe-connect.c:3644 +#: fe-connect.c:3669 msgid "server is not in hot standby mode\n" msgstr "Server ist nicht im Hot-Standby-Modus\n" -#: fe-connect.c:3755 fe-connect.c:3807 +#: fe-connect.c:3787 fe-connect.c:3839 #, c-format msgid "\"%s\" failed\n" msgstr "»%s« fehlgeschlagen\n" -#: fe-connect.c:3821 +#: fe-connect.c:3853 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption\n" msgstr "ungültiger Verbindungszustand %d, möglicherweise ein Speicherproblem\n" -#: fe-connect.c:4267 fe-connect.c:4327 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "PGEventProc »%s« während PGEVT_CONNRESET-Ereignis fehlgeschlagen\n" - -#: fe-connect.c:4671 +#: fe-connect.c:4836 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" msgstr "ungültige LDAP-URL »%s«: Schema muss ldap:// sein\n" -#: fe-connect.c:4686 +#: fe-connect.c:4851 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" msgstr "ungültige LDAP-URL »%s«: Distinguished Name fehlt\n" -#: fe-connect.c:4698 fe-connect.c:4756 +#: fe-connect.c:4863 fe-connect.c:4921 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" msgstr "ungültige LDAP-URL »%s«: muss genau ein Attribut haben\n" -#: fe-connect.c:4710 fe-connect.c:4772 +#: fe-connect.c:4875 fe-connect.c:4937 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" msgstr "ungültige LDAP-URL »%s«: Suchbereich fehlt (base/one/sub)\n" -#: fe-connect.c:4722 +#: fe-connect.c:4887 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "ungültige LDAP-URL »%s«: kein Filter\n" -#: fe-connect.c:4744 +#: fe-connect.c:4909 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" msgstr "ungültige LDAP-URL »%s«: ungültige Portnummer\n" -#: fe-connect.c:4782 +#: fe-connect.c:4947 msgid "could not create LDAP structure\n" msgstr "konnte LDAP-Struktur nicht erzeugen\n" -#: fe-connect.c:4858 +#: fe-connect.c:5023 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "Suche auf LDAP-Server fehlgeschlagen: %s\n" -#: fe-connect.c:4869 +#: fe-connect.c:5034 msgid "more than one entry found on LDAP lookup\n" msgstr "LDAP-Suche ergab mehr als einen Eintrag\n" -#: fe-connect.c:4870 fe-connect.c:4882 +#: fe-connect.c:5035 fe-connect.c:5047 msgid "no entry found on LDAP lookup\n" msgstr "kein Eintrag gefunden bei LDAP-Suche\n" -#: fe-connect.c:4893 fe-connect.c:4906 +#: fe-connect.c:5058 fe-connect.c:5071 msgid "attribute has no values on LDAP lookup\n" msgstr "Attribut hat keine Werte bei LDAP-Suche\n" -#: fe-connect.c:4958 fe-connect.c:4977 fe-connect.c:5502 +#: fe-connect.c:5123 fe-connect.c:5142 fe-connect.c:5674 #, c-format msgid "missing \"=\" after \"%s\" in connection info string\n" msgstr "fehlendes »=« nach »%s« in der Zeichenkette der Verbindungsdaten\n" -#: fe-connect.c:5050 fe-connect.c:5687 fe-connect.c:6463 +#: fe-connect.c:5215 fe-connect.c:5859 fe-connect.c:6635 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "ungültige Verbindungsoption »%s«\n" -#: fe-connect.c:5066 fe-connect.c:5551 +#: fe-connect.c:5231 fe-connect.c:5723 msgid "unterminated quoted string in connection info string\n" msgstr "fehlendes schließendes Anführungszeichen (\") in der Zeichenkette der Verbindungsdaten\n" -#: fe-connect.c:5147 +#: fe-connect.c:5312 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "Definition von Service »%s« nicht gefunden\n" -#: fe-connect.c:5173 +#: fe-connect.c:5338 #, c-format msgid "service file \"%s\" not found\n" msgstr "Servicedatei »%s« nicht gefunden\n" -#: fe-connect.c:5250 fe-connect.c:5294 +#: fe-connect.c:5352 +#, c-format +msgid "line %d too long in service file \"%s\"\n" +msgstr "Zeile %d zu lang in Servicedatei »%s«\n" + +#: fe-connect.c:5423 fe-connect.c:5467 #, c-format msgid "syntax error in service file \"%s\", line %d\n" msgstr "Syntaxfehler in Servicedatei »%s«, Zeile %d\n" -#: fe-connect.c:5261 +#: fe-connect.c:5434 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d\n" msgstr "geschachtelte »service«-Definitionen werden nicht unterstützt in Servicedatei »%s«, Zeile %d\n" -#: fe-connect.c:5983 +#: fe-connect.c:6155 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"\n" msgstr "ungültige URI an interne Parserroutine weitergeleitet: »%s«\n" -#: fe-connect.c:6060 +#: fe-connect.c:6232 #, c-format msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"\n" msgstr "Ende der Eingabezeichenkette gefunden beim Suchen nach passendem »]« in IPv6-Hostadresse in URI: »%s«\n" -#: fe-connect.c:6067 +#: fe-connect.c:6239 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"\n" msgstr "IPv6-Hostadresse darf nicht leer sein in URI: »%s«\n" -#: fe-connect.c:6082 +#: fe-connect.c:6254 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" msgstr "unerwartetes Zeichen »%c« an Position %d in URI (»:« oder »/« erwartet): »%s«\n" -#: fe-connect.c:6212 +#: fe-connect.c:6384 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "zusätzliches Schlüssel/Wert-Trennzeichen »=« in URI-Query-Parameter: »%s«\n" -#: fe-connect.c:6232 +#: fe-connect.c:6404 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "fehlendes Schlüssel/Wert-Trennzeichen »=« in URI-Query-Parameter: »%s«\n" -#: fe-connect.c:6284 +#: fe-connect.c:6456 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "ungültiger URI-Query-Parameter: »%s«\n" -#: fe-connect.c:6358 +#: fe-connect.c:6530 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "ungültiges Prozent-kodiertes Token: »%s«\n" -#: fe-connect.c:6368 +#: fe-connect.c:6540 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" msgstr "verbotener Wert %%00 in Prozent-kodiertem Wert: »%s«\n" -#: fe-connect.c:6738 +#: fe-connect.c:6910 msgid "connection pointer is NULL\n" msgstr "Verbindung ist ein NULL-Zeiger\n" -#: fe-connect.c:7018 +#: fe-connect.c:7198 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "WARNUNG: Passwortdatei »%s« ist keine normale Datei\n" -#: fe-connect.c:7027 +#: fe-connect.c:7207 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "WARNUNG: Passwortdatei »%s« erlaubt Lesezugriff für Gruppe oder Andere; Rechte sollten u=rw (0600) oder weniger sein\n" -#: fe-connect.c:7135 +#: fe-connect.c:7315 #, c-format msgid "password retrieved from file \"%s\"\n" msgstr "Passwort wurde aus Datei »%s« gelesen\n" -#: fe-exec.c:449 fe-exec.c:3219 +#: fe-exec.c:466 fe-exec.c:3392 #, c-format msgid "row number %d is out of range 0..%d" msgstr "Zeilennummer %d ist außerhalb des zulässigen Bereichs 0..%d" -#: fe-exec.c:510 fe-protocol3.c:219 fe-protocol3.c:244 fe-protocol3.c:273 -#: fe-protocol3.c:291 fe-protocol3.c:371 fe-protocol3.c:743 fe-protocol3.c:975 -msgid "out of memory" -msgstr "Speicher aufgebraucht" - -#: fe-exec.c:511 fe-protocol3.c:1932 +#: fe-exec.c:528 fe-protocol3.c:1949 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:778 +#: fe-exec.c:836 msgid "write to server failed\n" msgstr "Schreiben zum Server fehlgeschlagen\n" -#: fe-exec.c:850 +#: fe-exec.c:875 +msgid "no error text available\n" +msgstr "kein Fehlertext verfügbar\n" + +#: fe-exec.c:964 msgid "NOTICE" msgstr "HINWEIS" -#: fe-exec.c:908 +#: fe-exec.c:1022 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult kann nicht mehr als INT_MAX Tupel enthalten" -#: fe-exec.c:920 +#: fe-exec.c:1034 msgid "size_t overflow" msgstr "Überlauf von size_t" -#: fe-exec.c:1302 fe-exec.c:1403 fe-exec.c:1451 +#: fe-exec.c:1447 fe-exec.c:1552 fe-exec.c:1601 msgid "command string is a null pointer\n" msgstr "Befehlszeichenkette ist ein NULL-Zeiger\n" -#: fe-exec.c:1409 fe-exec.c:1457 fe-exec.c:1554 -msgid "number of parameters must be between 0 and 65535\n" -msgstr "Anzahl der Parameter muss zwischen 0 und 65535 sein\n" +#: fe-exec.c:1558 fe-exec.c:1607 fe-exec.c:1703 +#, c-format +msgid "number of parameters must be between 0 and %d\n" +msgstr "Anzahl der Parameter muss zwischen 0 und %d sein\n" -#: fe-exec.c:1445 fe-exec.c:1548 +#: fe-exec.c:1595 fe-exec.c:1697 msgid "statement name is a null pointer\n" msgstr "Anweisungsname ist ein NULL-Zeiger\n" -#: fe-exec.c:1589 +#: fe-exec.c:1741 fe-exec.c:3245 msgid "no connection to the server\n" msgstr "keine Verbindung mit dem Server\n" -#: fe-exec.c:1598 +#: fe-exec.c:1750 fe-exec.c:3254 msgid "another command is already in progress\n" msgstr "ein anderer Befehl ist bereits in Ausführung\n" -#: fe-exec.c:1627 +#: fe-exec.c:1779 msgid "cannot queue commands during COPY\n" msgstr "während COPY können keine Befehle aufgereiht werden\n" -#: fe-exec.c:1745 +#: fe-exec.c:1897 msgid "length must be given for binary parameter\n" msgstr "für binäre Parameter muss eine Länge angegeben werden\n" -#: fe-exec.c:2066 +#: fe-exec.c:2215 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "unerwarteter asyncStatus: %d\n" -#: fe-exec.c:2086 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "PGEventProc »%s« während PGEVT_RESULTCREATE-Ereignis fehlgeschlagen\n" - -#: fe-exec.c:2234 +#: fe-exec.c:2373 msgid "synchronous command execution functions are not allowed in pipeline mode\n" msgstr "synchrone Befehlsausführungsfunktionen sind im Pipeline-Modus nicht erlaubt\n" -#: fe-exec.c:2256 +#: fe-exec.c:2390 msgid "COPY terminated by new PQexec" msgstr "COPY von neuem PQexec beendet" -#: fe-exec.c:2273 +#: fe-exec.c:2407 msgid "PQexec not allowed during COPY BOTH\n" msgstr "PQexec ist während COPY BOTH nicht erlaubt\n" -#: fe-exec.c:2502 fe-exec.c:2558 fe-exec.c:2627 fe-protocol3.c:1863 +#: fe-exec.c:2635 fe-exec.c:2691 fe-exec.c:2760 fe-protocol3.c:1880 msgid "no COPY in progress\n" msgstr "keine COPY in Ausführung\n" -#: fe-exec.c:2804 +#: fe-exec.c:2940 msgid "PQfn not allowed in pipeline mode\n" msgstr "PQfn im Pipeline-Modus nicht erlaubt\n" -#: fe-exec.c:2812 +#: fe-exec.c:2948 msgid "connection in wrong state\n" msgstr "Verbindung im falschen Zustand\n" -#: fe-exec.c:2856 +#: fe-exec.c:2992 msgid "cannot enter pipeline mode, connection not idle\n" msgstr "kann Pipeline-Modus nicht einschalten, Verbindung ist nicht inaktiv\n" -#: fe-exec.c:2890 fe-exec.c:2907 +#: fe-exec.c:3026 fe-exec.c:3043 msgid "cannot exit pipeline mode with uncollected results\n" msgstr "kann Pipeline-Modus nicht beenden, wegen nicht eingesammelter Ergebnisse\n" -#: fe-exec.c:2895 +#: fe-exec.c:3031 msgid "cannot exit pipeline mode while busy\n" msgstr "kann Pipeline-Modus nicht beenden während die Verbindung beschäftigt ist\n" -#: fe-exec.c:3037 +#: fe-exec.c:3179 msgid "cannot send pipeline when not in pipeline mode\n" msgstr "Pipeline kann nicht gesendet werden, wenn der Pipeline-Modus aus ist\n" -#: fe-exec.c:3108 +#: fe-exec.c:3281 msgid "invalid ExecStatusType code" msgstr "ungültiger ExecStatusType-Kode" -#: fe-exec.c:3135 +#: fe-exec.c:3308 msgid "PGresult is not an error result\n" msgstr "PGresult ist kein Fehlerresultat\n" -#: fe-exec.c:3203 fe-exec.c:3226 +#: fe-exec.c:3376 fe-exec.c:3399 #, c-format msgid "column number %d is out of range 0..%d" msgstr "Spaltennummer %d ist außerhalb des zulässigen Bereichs 0..%d" -#: fe-exec.c:3241 +#: fe-exec.c:3414 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "Parameternummer %d ist außerhalb des zulässigen Bereichs 0..%d" -#: fe-exec.c:3551 +#: fe-exec.c:3725 #, c-format msgid "could not interpret result from server: %s" msgstr "konnte Ergebnis vom Server nicht interpretieren: %s" -#: fe-exec.c:3811 fe-exec.c:3900 +#: fe-exec.c:3987 fe-exec.c:4078 msgid "incomplete multibyte character\n" msgstr "unvollständiges Mehrbyte-Zeichen\n" -#: fe-gssapi-common.c:123 +#: fe-gssapi-common.c:124 msgid "GSSAPI name import error" msgstr "GSSAPI-Namensimportfehler" #: fe-lobj.c:145 fe-lobj.c:210 fe-lobj.c:403 fe-lobj.c:494 fe-lobj.c:568 -#: fe-lobj.c:969 fe-lobj.c:977 fe-lobj.c:985 fe-lobj.c:993 fe-lobj.c:1001 -#: fe-lobj.c:1009 fe-lobj.c:1017 fe-lobj.c:1025 +#: fe-lobj.c:972 fe-lobj.c:980 fe-lobj.c:988 fe-lobj.c:996 fe-lobj.c:1004 +#: fe-lobj.c:1012 fe-lobj.c:1020 fe-lobj.c:1028 #, c-format msgid "cannot determine OID of function %s\n" msgstr "kann OID der Funktion %s nicht ermitteln\n" @@ -789,22 +785,22 @@ msgstr "Argument von lo_read überschreitet Bereich für ganze Zahlen\n" msgid "argument of lo_write exceeds integer range\n" msgstr "Argument von lo_write überschreitet Bereich für ganze Zahlen\n" -#: fe-lobj.c:678 fe-lobj.c:789 +#: fe-lobj.c:678 fe-lobj.c:791 #, c-format msgid "could not open file \"%s\": %s\n" msgstr "konnte Datei »%s« nicht öffnen: %s\n" -#: fe-lobj.c:734 +#: fe-lobj.c:735 #, c-format msgid "could not read from file \"%s\": %s\n" msgstr "konnte nicht aus Datei »%s« lesen: %s\n" -#: fe-lobj.c:810 fe-lobj.c:834 +#: fe-lobj.c:813 fe-lobj.c:837 #, c-format msgid "could not write to file \"%s\": %s\n" msgstr "konnte nicht in Datei »%s« schreiben: %s\n" -#: fe-lobj.c:920 +#: fe-lobj.c:923 msgid "query to initialize large object functions did not return data\n" msgstr "Abfrage zur Initialisierung der Large-Object-Funktionen ergab keine Daten\n" @@ -822,8 +818,9 @@ msgstr "Integer der Größe %lu wird von pqPutInt nicht unterstützt" msgid "connection not open\n" msgstr "Verbindung nicht offen\n" -#: fe-misc.c:755 fe-secure-openssl.c:209 fe-secure-openssl.c:316 -#: fe-secure.c:260 fe-secure.c:373 +#: fe-misc.c:755 fe-secure-openssl.c:218 fe-secure-openssl.c:325 +#: fe-secure.c:260 fe-secure.c:423 +#, c-format msgid "" "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" @@ -833,15 +830,15 @@ msgstr "" "\tDas heißt wahrscheinlich, dass der Server abnormal beendete\n" "\tbevor oder während die Anweisung bearbeitet wurde.\n" -#: fe-misc.c:1015 +#: fe-misc.c:1008 msgid "timeout expired\n" msgstr "Timeout abgelaufen\n" -#: fe-misc.c:1060 +#: fe-misc.c:1053 msgid "invalid socket\n" msgstr "ungültiges Socket\n" -#: fe-misc.c:1083 +#: fe-misc.c:1076 #, c-format msgid "%s() failed: %s\n" msgstr "%s() fehlgeschlagen: %s\n" @@ -851,142 +848,156 @@ msgstr "%s() fehlgeschlagen: %s\n" msgid "message type 0x%02x arrived from server while idle" msgstr "Nachricht vom Typ 0x%02x kam vom Server im Ruhezustand" -#: fe-protocol3.c:403 +#: fe-protocol3.c:405 msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" msgstr "Server sendete Daten (»D«-Nachricht) ohne vorherige Zeilenbeschreibung (»T«-Nachricht)\n" -#: fe-protocol3.c:446 +#: fe-protocol3.c:448 #, c-format msgid "unexpected response from server; first received character was \"%c\"\n" msgstr "unerwartete Antwort vom Server; erstes empfangenes Zeichen war »%c«\n" -#: fe-protocol3.c:471 +#: fe-protocol3.c:473 #, c-format msgid "message contents do not agree with length in message type \"%c\"\n" msgstr "Nachrichteninhalt stimmt nicht mit Länge in Nachrichtentyp »%c« überein\n" -#: fe-protocol3.c:491 +#: fe-protocol3.c:493 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d\n" msgstr "Synchronisation mit Server verloren: Nachrichtentyp »%c« empfangen, Länge %d\n" -#: fe-protocol3.c:543 fe-protocol3.c:583 +#: fe-protocol3.c:545 fe-protocol3.c:585 msgid "insufficient data in \"T\" message" msgstr "nicht genug Daten in »T«-Nachricht" -#: fe-protocol3.c:654 fe-protocol3.c:860 +#: fe-protocol3.c:656 fe-protocol3.c:862 msgid "out of memory for query result" msgstr "Speicher für Anfrageergebnis aufgebraucht" -#: fe-protocol3.c:723 +#: fe-protocol3.c:725 msgid "insufficient data in \"t\" message" msgstr "nicht genug Daten in »t«-Nachricht" -#: fe-protocol3.c:782 fe-protocol3.c:814 fe-protocol3.c:832 +#: fe-protocol3.c:784 fe-protocol3.c:816 fe-protocol3.c:834 msgid "insufficient data in \"D\" message" msgstr "nicht genug Daten in »D«-Nachricht" -#: fe-protocol3.c:788 +#: fe-protocol3.c:790 msgid "unexpected field count in \"D\" message" msgstr "unerwartete Feldzahl in »D«-Nachricht" -#: fe-protocol3.c:1029 +#: fe-protocol3.c:1046 msgid "no error message available\n" msgstr "keine Fehlermeldung verfügbar\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1077 fe-protocol3.c:1096 +#: fe-protocol3.c:1094 fe-protocol3.c:1113 #, c-format msgid " at character %s" msgstr " bei Zeichen %s" -#: fe-protocol3.c:1109 +#: fe-protocol3.c:1126 #, c-format msgid "DETAIL: %s\n" msgstr "DETAIL: %s\n" -#: fe-protocol3.c:1112 +#: fe-protocol3.c:1129 #, c-format msgid "HINT: %s\n" msgstr "TIP: %s\n" -#: fe-protocol3.c:1115 +#: fe-protocol3.c:1132 #, c-format msgid "QUERY: %s\n" msgstr "ANFRAGE: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1139 #, c-format msgid "CONTEXT: %s\n" msgstr "KONTEXT: %s\n" -#: fe-protocol3.c:1131 +#: fe-protocol3.c:1148 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMANAME: %s\n" -#: fe-protocol3.c:1135 +#: fe-protocol3.c:1152 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABELLENNAME: %s\n" -#: fe-protocol3.c:1139 +#: fe-protocol3.c:1156 #, c-format msgid "COLUMN NAME: %s\n" msgstr "SPALTENNAME: %s\n" -#: fe-protocol3.c:1143 +#: fe-protocol3.c:1160 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATENTYPNAME: %s\n" -#: fe-protocol3.c:1147 +#: fe-protocol3.c:1164 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "CONSTRAINT-NAME: %s\n" -#: fe-protocol3.c:1159 +#: fe-protocol3.c:1176 msgid "LOCATION: " msgstr "ORT: " -#: fe-protocol3.c:1161 +#: fe-protocol3.c:1178 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1163 +#: fe-protocol3.c:1180 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1358 +#: fe-protocol3.c:1375 #, c-format msgid "LINE %d: " msgstr "ZEILE %d: " -#: fe-protocol3.c:1757 +#: fe-protocol3.c:1774 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline: Text COPY OUT nicht ausgeführt\n" -#: fe-protocol3.c:2123 +#: fe-protocol3.c:2151 +msgid "protocol error: no function result\n" +msgstr "Protokollfehler: kein Funktionsergebnis\n" + +#: fe-protocol3.c:2163 #, c-format msgid "protocol error: id=0x%x\n" msgstr "Protokollfehler: id=0x%x\n" -#: fe-secure-common.c:124 +#: fe-secure-common.c:126 msgid "SSL certificate's name contains embedded null\n" msgstr "Name im SSL-Zertifikat enthält Null-Byte\n" -#: fe-secure-common.c:171 +#: fe-secure-common.c:232 +#, c-format +msgid "certificate contains IP address with invalid length %lu\n" +msgstr "Zertifikat enthält IP-Adresse mit ungültiger Länge %lu\n" + +#: fe-secure-common.c:242 +#, c-format +msgid "could not convert certificate's IP address to string: %s\n" +msgstr "konnte IP-Adresse des Zertifikats nicht in Zeichenkette umwandeln: %s\n" + +#: fe-secure-common.c:275 msgid "host name must be specified for a verified SSL connection\n" msgstr "Hostname muss angegeben werden für eine verifizierte SSL-Verbindung\n" -#: fe-secure-common.c:196 +#: fe-secure-common.c:300 #, c-format msgid "server certificate for \"%s\" does not match host name \"%s\"\n" msgstr "Server-Zertifikat für »%s« stimmt nicht mit dem Hostnamen »%s« überein\n" -#: fe-secure-common.c:202 +#: fe-secure-common.c:306 msgid "could not get server's host name from server certificate\n" msgstr "konnte Hostnamen des Servers nicht aus dem Serverzertifikat ermitteln\n" @@ -1028,77 +1039,81 @@ msgstr "GSSAPI-Fehler bei der Größenprüfung" msgid "GSSAPI context establishment error" msgstr "GSSAPI-Fehler beim Einrichten des Kontexts" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1329 +#: fe-secure-openssl.c:223 fe-secure-openssl.c:330 fe-secure-openssl.c:1499 #, c-format msgid "SSL SYSCALL error: %s\n" msgstr "SSL-SYSCALL-Fehler: %s\n" -#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1333 +#: fe-secure-openssl.c:230 fe-secure-openssl.c:337 fe-secure-openssl.c:1503 msgid "SSL SYSCALL error: EOF detected\n" msgstr "SSL-SYSCALL-Fehler: Dateiende entdeckt\n" -#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1342 +#: fe-secure-openssl.c:241 fe-secure-openssl.c:348 fe-secure-openssl.c:1512 #, c-format msgid "SSL error: %s\n" msgstr "SSL-Fehler: %s\n" -#: fe-secure-openssl.c:247 fe-secure-openssl.c:354 +#: fe-secure-openssl.c:256 fe-secure-openssl.c:363 msgid "SSL connection has been closed unexpectedly\n" msgstr "SSL-Verbindung wurde unerwartet geschlossen\n" -#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1392 +#: fe-secure-openssl.c:262 fe-secure-openssl.c:369 fe-secure-openssl.c:1562 #, c-format msgid "unrecognized SSL error code: %d\n" msgstr "unbekannter SSL-Fehlercode: %d\n" -#: fe-secure-openssl.c:400 +#: fe-secure-openssl.c:409 msgid "could not determine server certificate signature algorithm\n" msgstr "konnte Signaturalgorithmus des Serverzertifikats nicht ermitteln\n" -#: fe-secure-openssl.c:421 +#: fe-secure-openssl.c:430 #, c-format msgid "could not find digest for NID %s\n" msgstr "konnte Digest für NID %s nicht finden\n" -#: fe-secure-openssl.c:431 +#: fe-secure-openssl.c:440 msgid "could not generate peer certificate hash\n" msgstr "konnte Hash des Zertifikats der Gegenstelle nicht erzeugen\n" -#: fe-secure-openssl.c:488 +#: fe-secure-openssl.c:497 msgid "SSL certificate's name entry is missing\n" msgstr "Namenseintrag fehlt im SSL-Zertifikat\n" -#: fe-secure-openssl.c:822 +#: fe-secure-openssl.c:532 +msgid "SSL certificate's address entry is missing\n" +msgstr "Adresseintrag fehlt im SSL-Zertifikat\n" + +#: fe-secure-openssl.c:950 #, c-format msgid "could not create SSL context: %s\n" msgstr "konnte SSL-Kontext nicht erzeugen: %s\n" -#: fe-secure-openssl.c:861 +#: fe-secure-openssl.c:989 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version\n" msgstr "ungültiger Wert »%s« für minimale SSL-Protokollversion\n" -#: fe-secure-openssl.c:872 +#: fe-secure-openssl.c:1000 #, c-format msgid "could not set minimum SSL protocol version: %s\n" msgstr "konnte minimale SSL-Protokollversion nicht setzen: %s\n" -#: fe-secure-openssl.c:890 +#: fe-secure-openssl.c:1018 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version\n" msgstr "ungültiger Wert »%s« für maximale SSL-Protokollversion\n" -#: fe-secure-openssl.c:901 +#: fe-secure-openssl.c:1029 #, c-format msgid "could not set maximum SSL protocol version: %s\n" msgstr "konnte maximale SSL-Protokollversion nicht setzen: %s\n" -#: fe-secure-openssl.c:937 +#: fe-secure-openssl.c:1065 #, c-format msgid "could not read root certificate file \"%s\": %s\n" msgstr "konnte Root-Zertifikat-Datei »%s« nicht lesen: %s\n" -#: fe-secure-openssl.c:990 +#: fe-secure-openssl.c:1118 msgid "" "could not get home directory to locate root certificate file\n" "Either provide the file or change sslmode to disable server certificate verification.\n" @@ -1106,7 +1121,7 @@ msgstr "" "konnte Home-Verzeichnis nicht ermitteln, um Root-Zertifikat-Datei zu finden\n" "Legen Sie entweder die Datei an oder ändern Sie sslmode, um die Überprüfung der Serverzertifikate abzuschalten.\n" -#: fe-secure-openssl.c:994 +#: fe-secure-openssl.c:1122 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1115,87 +1130,102 @@ msgstr "" "Root-Zertifikat-Datei »%s« existiert nicht\n" "Legen Sie entweder die Datei an oder ändern Sie sslmode, um die Überprüfung der Serverzertifikate abzuschalten.\n" -#: fe-secure-openssl.c:1025 +#: fe-secure-openssl.c:1153 #, c-format msgid "could not open certificate file \"%s\": %s\n" msgstr "konnte Zertifikatdatei »%s« nicht öffnen: %s\n" -#: fe-secure-openssl.c:1044 +#: fe-secure-openssl.c:1172 #, c-format msgid "could not read certificate file \"%s\": %s\n" msgstr "konnte Zertifikatdatei »%s« nicht lesen: %s\n" -#: fe-secure-openssl.c:1069 +#: fe-secure-openssl.c:1197 #, c-format msgid "could not establish SSL connection: %s\n" msgstr "konnte SSL-Verbindung nicht aufbauen: %s\n" -#: fe-secure-openssl.c:1099 +#: fe-secure-openssl.c:1231 #, c-format msgid "could not set SSL Server Name Indication (SNI): %s\n" msgstr "konnte SSL-Server-Name-Indication (SNI) nicht setzen: %s\n" -#: fe-secure-openssl.c:1145 +#: fe-secure-openssl.c:1277 #, c-format msgid "could not load SSL engine \"%s\": %s\n" msgstr "konnte SSL-Engine »%s« nicht laden: %s\n" -#: fe-secure-openssl.c:1157 +#: fe-secure-openssl.c:1289 #, c-format msgid "could not initialize SSL engine \"%s\": %s\n" msgstr "konnte SSL-Engine »%s« nicht initialisieren: %s\n" -#: fe-secure-openssl.c:1173 +#: fe-secure-openssl.c:1305 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" msgstr "konnte privaten SSL-Schlüssel »%s« nicht von Engine »%s« lesen: %s\n" -#: fe-secure-openssl.c:1187 +#: fe-secure-openssl.c:1319 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" msgstr "konnte privaten SSL-Schlüssel »%s« nicht von Engine »%s« laden: %s\n" -#: fe-secure-openssl.c:1224 +#: fe-secure-openssl.c:1357 #, c-format msgid "certificate present, but not private key file \"%s\"\n" msgstr "Zertifikat vorhanden, aber keine private Schlüsseldatei »%s«\n" -#: fe-secure-openssl.c:1232 +#: fe-secure-openssl.c:1361 +#, c-format +msgid "could not stat private key file \"%s\": %m\n" +msgstr "konnte »stat« für private Schlüsseldatei »%s« nicht ausführen: %m\n" + +#: fe-secure-openssl.c:1370 #, c-format -msgid "private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" -msgstr "WARNUNG: private Schlüsseldatei »%s« erlaubt Lesezugriff für Gruppe oder Andere; Rechte sollten u=rw (0600) oder weniger sein\n" +msgid "private key file \"%s\" is not a regular file\n" +msgstr "private Schlüsseldatei »%s« ist keine normale Datei\n" -#: fe-secure-openssl.c:1257 +#: fe-secure-openssl.c:1394 +#, c-format +msgid "private key file \"%s\" must be owned by the current user or root\n" +msgstr "private Schlüsseldatei »%s« muss als Eigentümer den aktuellen Benutzer oder »root« haben\n" + +#: fe-secure-openssl.c:1403 +#, c-format +msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root\n" +msgstr "private Schlüsseldatei »%s« erlaubt Lesezugriff für Gruppe oder Andere; Dateirechte müssen u=rw (0600) oder weniger sein, wenn der Eigentümer der aktuelle Benutzer ist, oder u=rw,g=r (0640) oder weniger, wenn der Eigentümer »root« ist\n" + +#: fe-secure-openssl.c:1428 #, c-format msgid "could not load private key file \"%s\": %s\n" msgstr "konnte private Schlüsseldatei »%s« nicht laden: %s\n" -#: fe-secure-openssl.c:1275 +#: fe-secure-openssl.c:1445 #, c-format msgid "certificate does not match private key file \"%s\": %s\n" msgstr "Zertifikat passt nicht zur privaten Schlüsseldatei »%s«: %s\n" -#: fe-secure-openssl.c:1375 +#: fe-secure-openssl.c:1545 #, c-format msgid "This may indicate that the server does not support any SSL protocol version between %s and %s.\n" msgstr "Das zeigt möglicherweise an, dass der Server keine SSL-Protokollversion zwischen %s und %s unterstützt.\n" -#: fe-secure-openssl.c:1411 +#: fe-secure-openssl.c:1581 #, c-format msgid "certificate could not be obtained: %s\n" msgstr "Zertifikat konnte nicht ermittelt werden: %s\n" -#: fe-secure-openssl.c:1517 +#: fe-secure-openssl.c:1687 #, c-format msgid "no SSL error reported" msgstr "kein SSL-Fehler berichtet" -#: fe-secure-openssl.c:1526 +#: fe-secure-openssl.c:1696 #, c-format msgid "SSL error code %lu" msgstr "SSL-Fehlercode %lu" -#: fe-secure-openssl.c:1773 +#: fe-secure-openssl.c:1944 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "WARNUNG: sslpassword abgeschnitten\n" @@ -1205,7 +1235,7 @@ msgstr "WARNUNG: sslpassword abgeschnitten\n" msgid "could not receive data from server: %s\n" msgstr "konnte keine Daten vom Server empfangen: %s\n" -#: fe-secure.c:380 +#: fe-secure.c:436 #, c-format msgid "could not send data to server: %s\n" msgstr "konnte keine Daten an den Server senden: %s\n" @@ -1215,14 +1245,10 @@ msgstr "konnte keine Daten an den Server senden: %s\n" msgid "unrecognized socket error: 0x%08X/%d" msgstr "unbekannter Socket-Fehler: 0x%08X/%d" -#~ msgid "" -#~ "could not connect to server: %s\n" -#~ "\tIs the server running on host \"%s\" (%s) and accepting\n" -#~ "\tTCP/IP connections on port %s?\n" -#~ msgstr "" -#~ "konnte nicht mit dem Server verbinden: %s\n" -#~ "\tLäuft der Server auf dem Host »%s« (%s) und akzeptiert er\n" -#~ "\tTCP/IP-Verbindungen auf Port %s?\n" - -#~ msgid "could not make a writable connection to server \"%s:%s\"\n" -#~ msgstr "konnte keine schreibbare Verbindung zum Server »%s:%s« aufbauen\n" +#, c-format +#~ msgid "could not look up local user ID %d: %s\n" +#~ msgstr "konnte lokale Benutzer-ID %d nicht nachschlagen: %s\n" + +#, c-format +#~ msgid "local user with ID %d does not exist\n" +#~ msgstr "lokaler Benutzer mit ID %d existiert nicht\n" diff --git a/src/interfaces/libpq/po/el.po b/src/interfaces/libpq/po/el.po index b55d9d75bb..cb286d41b0 100644 --- a/src/interfaces/libpq/po/el.po +++ b/src/interfaces/libpq/po/el.po @@ -3,19 +3,21 @@ # This file is distributed under the same license as the libpq (PostgreSQL) package. # Georgios Kokolatos , 2021 # +# +# msgid "" msgstr "" -"Project-Id-Version: libpq (PostgreSQL) 13\n" +"Project-Id-Version: libpq (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-25 05:39+0000\n" -"PO-Revision-Date: 2021-04-23 09:35+0200\n" +"POT-Creation-Date: 2021-07-14 05:09+0000\n" +"PO-Revision-Date: 2021-07-14 10:16+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: fe-auth-scram.c:213 @@ -27,10 +29,8 @@ msgid "malformed SCRAM message (length mismatch)\n" msgstr "κακοσχηματισμένο μήνυμα SCRAM (αναντιστοιχία μήκους)\n" #: fe-auth-scram.c:263 -#, fuzzy -#| msgid "could not get server version" msgid "could not verify server signature\n" -msgstr "δεν ήταν δυνατή η απόκτηση έκδοσης διακομιστή" +msgstr "δεν ήταν δυνατή πιστοποίηση της υπογραφής του διακομιστή\n" #: fe-auth-scram.c:270 msgid "incorrect server signature\n" @@ -43,12 +43,12 @@ msgstr "άκυρη κατάσταση ανταλλαγής SCRAM\n" #: fe-auth-scram.c:306 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)\n" -msgstr "κακοσχηματισμένο μήνυμα SCRAM (αναμένεται χαρακτηριστικό \"%c\")\n" +msgstr "κακοσχηματισμένο μήνυμα SCRAM (αναμένεται χαρακτηριστικό «%c»)\n" #: fe-auth-scram.c:315 #, c-format msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" -msgstr "κακοσχηματισμένο μήνυμα SCRAM (αναμένεται χαρακτήρας “=“ για το χαρακτηριστικό \"%c\")\n" +msgstr "κακοσχηματισμένο μήνυμα SCRAM (αναμένεται χαρακτήρας «=» για το χαρακτηριστικό «%c»)\n" #: fe-auth-scram.c:356 msgid "could not generate nonce\n" @@ -58,15 +58,15 @@ msgstr "δεν δύναται να δημιουργήσει nonce\n" #: fe-auth-scram.c:616 fe-auth-scram.c:642 fe-auth-scram.c:657 #: fe-auth-scram.c:707 fe-auth-scram.c:746 fe-auth.c:290 fe-auth.c:362 #: fe-auth.c:398 fe-auth.c:615 fe-auth.c:774 fe-auth.c:1132 fe-auth.c:1282 -#: fe-connect.c:912 fe-connect.c:1456 fe-connect.c:1625 fe-connect.c:2977 -#: fe-connect.c:4658 fe-connect.c:4919 fe-connect.c:5038 fe-connect.c:5282 -#: fe-connect.c:5364 fe-connect.c:5463 fe-connect.c:5719 fe-connect.c:5748 -#: fe-connect.c:5820 fe-connect.c:5844 fe-connect.c:5862 fe-connect.c:5963 -#: fe-connect.c:5972 fe-connect.c:6330 fe-connect.c:6480 fe-exec.c:1209 -#: fe-exec.c:2993 fe-exec.c:3145 fe-exec.c:3918 fe-exec.c:4083 -#: fe-gssapi-common.c:110 fe-lobj.c:881 fe-protocol3.c:1016 fe-protocol3.c:1724 +#: fe-connect.c:911 fe-connect.c:1455 fe-connect.c:1624 fe-connect.c:2976 +#: fe-connect.c:4657 fe-connect.c:4918 fe-connect.c:5037 fe-connect.c:5289 +#: fe-connect.c:5370 fe-connect.c:5469 fe-connect.c:5725 fe-connect.c:5754 +#: fe-connect.c:5826 fe-connect.c:5850 fe-connect.c:5868 fe-connect.c:5969 +#: fe-connect.c:5978 fe-connect.c:6336 fe-connect.c:6486 fe-exec.c:1209 +#: fe-exec.c:3029 fe-exec.c:3212 fe-exec.c:3985 fe-exec.c:4150 +#: fe-gssapi-common.c:111 fe-lobj.c:881 fe-protocol3.c:1016 fe-protocol3.c:1724 #: fe-secure-common.c:110 fe-secure-gssapi.c:504 fe-secure-openssl.c:440 -#: fe-secure-openssl.c:1129 +#: fe-secure-openssl.c:1133 msgid "out of memory\n" msgstr "έλλειψη μνήμης\n" @@ -75,10 +75,8 @@ msgid "could not encode nonce\n" msgstr "δεν δύναται να κωδικοποιήσει nonce\n" #: fe-auth-scram.c:563 -#, fuzzy -#| msgid "could not encode client proof\n" msgid "could not calculate client proof\n" -msgstr "δεν δύναται να κωδικοποιήσει την απόδειξη του πελάτη\n" +msgstr "δεν δύναται να υπολογίσει την απόδειξη του πελάτη\n" #: fe-auth-scram.c:579 msgid "could not encode client proof\n" @@ -122,7 +120,7 @@ msgstr "η μνήμη δεν επαρκεί για την εκχώρηση τη msgid "GSSAPI continuation error" msgstr "σφάλμα συνέχισης GSSAPI" -#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:97 fe-secure-common.c:98 +#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:98 fe-secure-common.c:98 msgid "host name must be specified\n" msgstr "πρέπει να καθοριστεί το όνομα κεντρικού υπολογιστή\n" @@ -222,12 +220,12 @@ msgstr "δεν υποστηρίζεται η μέθοδος πιστοποίησ msgid "user name lookup failure: error code %lu\n" msgstr "αποτυχία αναζήτησης ονόματος χρήστη: κωδικός σφάλματος % lu\n" -#: fe-auth.c:1117 fe-connect.c:2852 +#: fe-auth.c:1117 fe-connect.c:2851 #, c-format msgid "could not look up local user ID %d: %s\n" msgstr "δεν ήταν δυνατή η αναζήτηση ID τοπικού χρήστη %d: %s\n" -#: fe-auth.c:1122 fe-connect.c:2857 +#: fe-auth.c:1122 fe-connect.c:2856 #, c-format msgid "local user with ID %d does not exist\n" msgstr "δεν υπάρχει τοπικός χρήστης με ID %d\n" @@ -243,410 +241,388 @@ msgstr "πολύ μακρυά τιμή password_encryption\n" #: fe-auth.c:1275 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" -msgstr "μη αναγνωρίσιμος αλγόριθμος κρυπτογράφησης “%s” κωδικού πρόσβασης\n" +msgstr "μη αναγνωρίσιμος αλγόριθμος κρυπτογράφησης «%s» κωδικού πρόσβασης\n" -#: fe-connect.c:1095 +#: fe-connect.c:1094 #, c-format msgid "could not match %d host names to %d hostaddr values\n" msgstr "δεν μπόρεσε να ταιριάξει %d ονομασίες διακομιστών με %d τιμές hostaddr\n" -#: fe-connect.c:1176 +#: fe-connect.c:1175 #, c-format msgid "could not match %d port numbers to %d hosts\n" msgstr "δεν μπόρεσε να ταιριάξει %d αριθμούς θυρών με %d διακομιστές\n" -#: fe-connect.c:1269 fe-connect.c:1295 fe-connect.c:1337 fe-connect.c:1346 -#: fe-connect.c:1379 fe-connect.c:1423 -#, fuzzy, c-format -#| msgid "invalid sslmode value: \"%s\"\n" +#: fe-connect.c:1268 fe-connect.c:1294 fe-connect.c:1336 fe-connect.c:1345 +#: fe-connect.c:1378 fe-connect.c:1422 +#, c-format msgid "invalid %s value: \"%s\"\n" -msgstr "άκυρη τιμή sslmode: “%s”\n" +msgstr "άκυρο %s τιμή: «%s»\n" -#: fe-connect.c:1316 +#: fe-connect.c:1315 #, c-format msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" -msgstr "η τιμή SSLmode \"%s\" είναι άκυρη όταν η υποστήριξη SSL δεν έχει μεταγλωττιστεί (compiled)\n" +msgstr "η τιμή SSLmode «%s» είναι άκυρη όταν η υποστήριξη SSL δεν έχει μεταγλωττιστεί (compiled)\n" -#: fe-connect.c:1364 +#: fe-connect.c:1363 msgid "invalid SSL protocol version range\n" msgstr "άκυρο εύρος εκδόσεων πρωτοκόλλου SSL\n" -#: fe-connect.c:1389 +#: fe-connect.c:1388 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" -msgstr "η τιμή SSLmode \"%s\" είναι άκυρη όταν η υποστήριξη GSSAPI δεν έχει μεταγλωττιστεί (compiled)\n" +msgstr "η τιμή SSLmode «%s» είναι άκυρη όταν η υποστήριξη GSSAPI δεν έχει μεταγλωττιστεί (compiled)\n" -#: fe-connect.c:1649 +#: fe-connect.c:1648 #, c-format msgid "could not set socket to TCP no delay mode: %s\n" msgstr "δεν μπόρεσε να ορίσει τον υποδοχέα σε λειτουργία TCP χωρίς καθυστέρηση: %s\n" -#: fe-connect.c:1711 -#, fuzzy, c-format -#| msgid "connection to database \"%s\" failed: %s" +#: fe-connect.c:1710 +#, c-format msgid "connection to server on socket \"%s\" failed: " -msgstr "σύνδεση στη βάση δεδομένων “%s” απέτυχε: %s" +msgstr "σύνδεση στον διακομιστή στην υποδοχή «%s» απέτυχε: " -#: fe-connect.c:1738 -#, fuzzy, c-format -#| msgid "connection to database \"%s\" failed: %s" +#: fe-connect.c:1737 +#, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " -msgstr "σύνδεση στη βάση δεδομένων “%s” απέτυχε: %s" +msgstr "σύνδεση στον διακομιστή σε «%s» (%s), θύρα %s απέτυχε: " -#: fe-connect.c:1743 -#, fuzzy, c-format -#| msgid "connection to database \"%s\" failed: %s" +#: fe-connect.c:1742 +#, c-format msgid "connection to server at \"%s\", port %s failed: " -msgstr "σύνδεση στη βάση δεδομένων “%s” απέτυχε: %s" - -#: fe-connect.c:1768 -#, fuzzy -#| msgid "" -#| "could not connect to server: %s\n" -#| "\tIs the server running locally and accepting\n" -#| "\tconnections on Unix domain socket \"%s\"?\n" +msgstr "σύνδεση στον διακομιστή σε «%s», θύρα %s απέτυχε: " + +#: fe-connect.c:1767 msgid "\tIs the server running locally and accepting connections on that socket?\n" -msgstr "" -"δεν ήταν δυνατή η σύνδεση με το διακομιστή: %s\n" -"\tΕκτελείται τοπικά ο διακομιστής και αποδέχεται\n" -"\tσυνδέσεις στην υποδοχή πεδίου Unix \"%s\";\n" - -#: fe-connect.c:1772 -#, fuzzy -#| msgid "" -#| "could not connect to server: %s\n" -#| "\tIs the server running on host \"%s\" and accepting\n" -#| "\tTCP/IP connections on port %s?\n" +msgstr "\tΕκτελείται τοπικά ο διακομιστής και αποδέχεται συνδέσεις σε αυτή την υποδοχή;\n" + +#: fe-connect.c:1771 msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" -msgstr "" -"δεν ήταν δυνατή η σύνδεση με το διακομιστή: %s\n" -"\tΕκτελείται ο διακομιστής στον κεντρικό υπολογιστή \"%s\" και αποδέχεται\n" -"\tσυνδέσεις TCP/IP στην θύρα %s;\n" +msgstr "\tΕκτελείται ο διακομιστής σε αυτόν τον κεντρικό υπολογιστή και αποδέχεται συνδέσεις TCP/IP;\n" -#: fe-connect.c:1836 +#: fe-connect.c:1835 #, c-format msgid "invalid integer value \"%s\" for connection option \"%s\"\n" -msgstr "άκυρη τιμή ακεραίου ”%s” για την επιλογή σύνδεσης “%s”\n" +msgstr "άκυρη τιμή ακεραίου »%s» για την επιλογή σύνδεσης «%s»\n" -#: fe-connect.c:1866 fe-connect.c:1901 fe-connect.c:1937 fe-connect.c:2026 -#: fe-connect.c:2640 -#, fuzzy, c-format -#| msgid "%s() failed: %m" +#: fe-connect.c:1865 fe-connect.c:1900 fe-connect.c:1936 fe-connect.c:2025 +#: fe-connect.c:2639 +#, c-format msgid "%s(%s) failed: %s\n" -msgstr "%s () απέτυχε: %m" +msgstr "%s(%s) απέτυχε: %s\n" -#: fe-connect.c:1991 -#, fuzzy, c-format -#| msgid "pgpipe: getsockname() failed: error code %d" +#: fe-connect.c:1990 +#, c-format msgid "%s(%s) failed: error code %d\n" -msgstr "pgpipe: getsockname() απέτυχε: κωδικός σφάλματος %d" +msgstr "%s(%s) απέτυχε: κωδικός σφάλματος %d\n" -#: fe-connect.c:2306 +#: fe-connect.c:2305 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "μη έγκυρη κατάσταση σύνδεσης, πιθανώς ενδεικτική αλλοίωσης μνήμης\n" -#: fe-connect.c:2385 +#: fe-connect.c:2384 #, c-format msgid "invalid port number: \"%s\"\n" -msgstr "μη έγκυρος αριθμός πύλης: “%s”\n" +msgstr "μη έγκυρος αριθμός πύλης: «%s»\n" -#: fe-connect.c:2401 +#: fe-connect.c:2400 #, c-format msgid "could not translate host name \"%s\" to address: %s\n" -msgstr "δεν ήταν δυνατή η μετάφραση του ονόματος κεντρικού υπολογιστή \"%s\" στη διεύθυνση: %s\n" +msgstr "δεν ήταν δυνατή η μετάφραση του ονόματος κεντρικού υπολογιστή «%s» στη διεύθυνση: %s\n" -#: fe-connect.c:2414 +#: fe-connect.c:2413 #, c-format msgid "could not parse network address \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η ανάλυση της διεύθυνσης δικτύου \"%s\": %s\n" +msgstr "δεν ήταν δυνατή η ανάλυση της διεύθυνσης δικτύου «%s»: %s\n" -#: fe-connect.c:2427 +#: fe-connect.c:2426 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" -msgstr "η διαδρομή υποδοχής τομέα Unix \"%s\" είναι πολύ μακρυά (μέγιστο %d bytes)\n" +msgstr "η διαδρομή υποδοχής τομέα Unix «%s» είναι πολύ μακρυά (μέγιστο %d bytes)\n" -#: fe-connect.c:2442 +#: fe-connect.c:2441 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" -msgstr "δεν ήταν δυνατή η μετάφραση της διαδρομής υποδοχής πεδίου-Unix \"%s\" στη διεύθυνση: %s\n" +msgstr "δεν ήταν δυνατή η μετάφραση της διαδρομής υποδοχής πεδίου-Unix «%s» στη διεύθυνση: %s\n" -#: fe-connect.c:2568 +#: fe-connect.c:2567 #, c-format msgid "could not create socket: %s\n" msgstr "δεν ήταν δυνατή η δημιουργία υποδοχέα: %s\n" -#: fe-connect.c:2599 +#: fe-connect.c:2598 #, c-format msgid "could not set socket to nonblocking mode: %s\n" msgstr "δεν ήταν δυνατή η ρύθμιση της υποδοχής σε λειτουργία μη αποκλεισμού: %s\n" -#: fe-connect.c:2609 +#: fe-connect.c:2608 #, c-format msgid "could not set socket to close-on-exec mode: %s\n" msgstr "δεν ήταν δυνατή η ρύθμιση της υποδοχής σε λειτουργία close-on-exec: %s\n" -#: fe-connect.c:2627 +#: fe-connect.c:2626 msgid "keepalives parameter must be an integer\n" msgstr "η παράμετρος keepalives πρέπει να είναι ακέραιος\n" -#: fe-connect.c:2768 +#: fe-connect.c:2767 #, c-format msgid "could not get socket error status: %s\n" msgstr "δεν ήταν δυνατή η απόκτηση κατάστασης σφάλματος της υποδοχής: %s\n" -#: fe-connect.c:2796 +#: fe-connect.c:2795 #, c-format msgid "could not get client address from socket: %s\n" msgstr "δεν ήταν δυνατή η απόκτηση διεύθυνσης πελάτη από την υποδοχή: %s\n" -#: fe-connect.c:2838 +#: fe-connect.c:2837 msgid "requirepeer parameter is not supported on this platform\n" msgstr "η παράμετρος requirepeer δεν υποστηρίζεται από την παρούσα πλατφόρμα\n" -#: fe-connect.c:2841 +#: fe-connect.c:2840 #, c-format msgid "could not get peer credentials: %s\n" msgstr "δεν ήταν δυνατή η απόκτηση διαπιστευτηρίων από peer: %s\n" -#: fe-connect.c:2865 +#: fe-connect.c:2864 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" -msgstr "το requirepeer καθορίζει \"%s\", αλλά το πραγματικό όνομα ομότιμου χρήστη είναι \"%s\"\n" +msgstr "το requirepeer καθορίζει «%s», αλλά το πραγματικό όνομα ομότιμου χρήστη είναι «%s»\n" -#: fe-connect.c:2905 +#: fe-connect.c:2904 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "δεν ήταν δυνατή η αποστολή GSSAPI πακέτου διαπραγμάτευσης: %s\n" -#: fe-connect.c:2917 +#: fe-connect.c:2916 msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)\n" -msgstr "απαιτείται κρυπτογράφηση GSSAPI, αλλά ήταν αδύνατη (πιθανώς απουσία cache διαπιστευτηρίων, απουσία υποστήριξης διακομιστή, ή χρησιμοποιεί τοπική υποδοχή)\n" +msgstr "GSSAPI κρυπτογράφηση απαιτείται αλλά ήταν αδύνατη (πιθανώς απουσία cache διαπιστευτηρίων, απουσία υποστήριξης διακομιστή, ή χρησιμοποιείται τοπική υποδοχή)\n" -#: fe-connect.c:2959 +#: fe-connect.c:2958 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "" "δεν ήταν δυνατή η αποστολή SSL πακέτου διαπραγμάτευσης: %s\n" "\n" -#: fe-connect.c:2990 +#: fe-connect.c:2989 #, c-format msgid "could not send startup packet: %s\n" msgstr "δεν ήταν δυνατή η αποστολή πακέτου εκκίνησης: %s\n" -#: fe-connect.c:3066 +#: fe-connect.c:3065 msgid "server does not support SSL, but SSL was required\n" msgstr "ο διακομιστής δεν υποστηρίζει SSL, αλλά απαιτείται SSL\n" -#: fe-connect.c:3093 +#: fe-connect.c:3092 #, c-format msgid "received invalid response to SSL negotiation: %c\n" msgstr "έλαβε μη έγκυρη απάντηση κατά τη διαπραγμάτευση SSL: %c\n" -#: fe-connect.c:3182 +#: fe-connect.c:3181 msgid "server doesn't support GSSAPI encryption, but it was required\n" msgstr "ο διακομιστής δεν υποστηρίζει κρυπτογράφηση GSSAPI, αλλά αυτή ήταν απαραίτητη\n" -#: fe-connect.c:3194 +#: fe-connect.c:3193 #, c-format msgid "received invalid response to GSSAPI negotiation: %c\n" msgstr "έλαβε μη έγκυρη απάντηση κατά τη διαπραγμάτευση GSSAPI: %c\n" -#: fe-connect.c:3260 fe-connect.c:3285 +#: fe-connect.c:3259 fe-connect.c:3284 #, c-format msgid "expected authentication request from server, but received %c\n" msgstr "ανέμενε αίτηση ελέγχου ταυτότητας από το διακομιστή, αλλά αντί αυτής ελήφθη %c\n" -#: fe-connect.c:3492 +#: fe-connect.c:3491 msgid "unexpected message from server during startup\n" msgstr "μη αναμενόμενο μήνυμα από το διακομιστή κατά την εκκίνηση\n" -#: fe-connect.c:3584 +#: fe-connect.c:3583 msgid "session is read-only\n" -msgstr "" +msgstr "η περίοδος λειτουργίας είναι μόνο για ανάγνωση\n" -#: fe-connect.c:3587 +#: fe-connect.c:3586 msgid "session is not read-only\n" -msgstr "" +msgstr "η περίοδος λειτουργίας δεν είναι μόνο για ανάγνωση\n" -#: fe-connect.c:3641 -#, fuzzy -#| msgid "%s: server did not start in time\n" +#: fe-connect.c:3640 msgid "server is in hot standby mode\n" -msgstr "%s: ο διακομιστής δεν ξεκίνησε εγκαίρως\n" +msgstr "%s: ο διακομιστής βρίσκεται σε hot κατάσταση αναμονής\n" -#: fe-connect.c:3644 -#, fuzzy -#| msgid "%s: cannot promote server; server is not in standby mode\n" +#: fe-connect.c:3643 msgid "server is not in hot standby mode\n" -msgstr "%s: δεν είναι δυνατή η προβίβαση του διακομιστή· ο διακομιστής δεν βρίσκεται σε κατάσταση αναμονής\n" +msgstr "ο διακομιστής δεν βρίσκεται σε hot κατάσταση αναμονής\n" -#: fe-connect.c:3755 fe-connect.c:3807 -#, fuzzy, c-format -#| msgid " failed\n" +#: fe-connect.c:3754 fe-connect.c:3806 +#, c-format msgid "\"%s\" failed\n" -msgstr " απέτυχε.\n" +msgstr "«%s» απέτυχε.\n" -#: fe-connect.c:3821 +#: fe-connect.c:3820 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption\n" msgstr "κατάσταση μη έγκυρης σύνδεσης %d, πιθανώς ενδεικτική αλλοίωσης της μνήμης\n" -#: fe-connect.c:4267 fe-connect.c:4327 +#: fe-connect.c:4266 fe-connect.c:4326 #, c-format msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "PGEventProc \"%s\" απέτυχε κατά τη διάρκεια συμβάντος PGEVT_CONNRESET\n" +msgstr "PGEventProc «%s» απέτυχε κατά τη διάρκεια συμβάντος PGEVT_CONNRESET\n" -#: fe-connect.c:4671 +#: fe-connect.c:4670 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" -msgstr "άκυρη διεύθυνση URL LDAP \"%s\": ο συνδυασμός πρέπει να είναι ldap://\n" +msgstr "άκυρη διεύθυνση URL LDAP «%s»: ο συνδυασμός πρέπει να είναι ldap://\n" -#: fe-connect.c:4686 +#: fe-connect.c:4685 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" -msgstr "άκυρη διεύθυνση URL LDAP \"%s\": λείπει το αποκλειστικό όνομα\n" +msgstr "άκυρη διεύθυνση URL LDAP «%s»: λείπει το αποκλειστικό όνομα\n" -#: fe-connect.c:4698 fe-connect.c:4756 +#: fe-connect.c:4697 fe-connect.c:4755 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" -msgstr "άκυρη διεύθυνση URL LDAP \"%s\": πρέπει να περιέχει ακριβώς ένα χαρακτηριστικό\n" +msgstr "άκυρη διεύθυνση URL LDAP «%s»: πρέπει να περιέχει ακριβώς ένα χαρακτηριστικό\n" -#: fe-connect.c:4710 fe-connect.c:4772 +#: fe-connect.c:4709 fe-connect.c:4771 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" -msgstr "άκυρη διεύθυνση URL LDAP \"%s\": πρέπει να έχει εμβέλεια αναζήτησης (base/one/sub)\n" +msgstr "άκυρη διεύθυνση URL LDAP «%s»: πρέπει να έχει εμβέλεια αναζήτησης (base/one/sub)\n" -#: fe-connect.c:4722 +#: fe-connect.c:4721 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" -msgstr "άκυρη διεύθυνση URL LDAP “%s”: κανένα φίλτρο\n" +msgstr "άκυρη διεύθυνση URL LDAP «%s»: κανένα φίλτρο\n" -#: fe-connect.c:4744 +#: fe-connect.c:4743 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" -msgstr "άκυρη διεύθυνση URL LDAP “%s”: άκυρος αριθμός θύρας\n" +msgstr "άκυρη διεύθυνση URL LDAP «%s»: άκυρος αριθμός θύρας\n" -#: fe-connect.c:4782 +#: fe-connect.c:4781 msgid "could not create LDAP structure\n" msgstr "δεν ήταν δυνατή η δημιουργία δομής LDAP\n" -#: fe-connect.c:4858 +#: fe-connect.c:4857 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "απέτυχε η αναζήτηση στον διακομιστή LDAP: %s\n" -#: fe-connect.c:4869 +#: fe-connect.c:4868 msgid "more than one entry found on LDAP lookup\n" msgstr "βρέθηκαν περισσότερες από μία καταχωρήσεις στην αναζήτηση LDAP\n" -#: fe-connect.c:4870 fe-connect.c:4882 +#: fe-connect.c:4869 fe-connect.c:4881 msgid "no entry found on LDAP lookup\n" msgstr "δεν βρέθηκε καταχώρηση στην αναζήτηση LDAP\n" -#: fe-connect.c:4893 fe-connect.c:4906 +#: fe-connect.c:4892 fe-connect.c:4905 msgid "attribute has no values on LDAP lookup\n" msgstr "το χαρακτηριστικό δεν έχει τιμές στην αναζήτηση LDAP\n" -#: fe-connect.c:4958 fe-connect.c:4977 fe-connect.c:5502 +#: fe-connect.c:4957 fe-connect.c:4976 fe-connect.c:5508 #, c-format msgid "missing \"=\" after \"%s\" in connection info string\n" -msgstr "λείπει το “=“ μετά από “%s” στην συμβολοσειρά πληροφορίας σύνδεσης\n" +msgstr "λείπει το «=» μετά από «%s» στην συμβολοσειρά πληροφορίας σύνδεσης\n" -#: fe-connect.c:5050 fe-connect.c:5687 fe-connect.c:6463 +#: fe-connect.c:5049 fe-connect.c:5693 fe-connect.c:6469 #, c-format msgid "invalid connection option \"%s\"\n" -msgstr "άκυρη επιλογή σύνδεσης “%s”\n" +msgstr "άκυρη επιλογή σύνδεσης «%s»\n" -#: fe-connect.c:5066 fe-connect.c:5551 +#: fe-connect.c:5065 fe-connect.c:5557 msgid "unterminated quoted string in connection info string\n" msgstr "ατερμάτιστη συμβολοσειρά με εισαγωγικά στην συμβολοσειρά πληροφορίας σύνδεσης\n" -#: fe-connect.c:5147 +#: fe-connect.c:5146 #, c-format msgid "definition of service \"%s\" not found\n" -msgstr "δεν βρέθηκε ο ορισμός της υπηρεσίας “%s”\n" +msgstr "δεν βρέθηκε ο ορισμός της υπηρεσίας «%s»\n" -#: fe-connect.c:5173 +#: fe-connect.c:5172 #, c-format msgid "service file \"%s\" not found\n" -msgstr "δεν βρέθηκε αρχείο υπηρεσίας “%s”\n" +msgstr "δεν βρέθηκε αρχείο υπηρεσίας «%s»\n" + +#: fe-connect.c:5186 +#, c-format +msgid "line %d too long in service file \"%s\"\n" +msgstr "Πολύ μακρυά γραμμή %d στο αρχείο υπηρεσίας «%s»\n" -#: fe-connect.c:5250 fe-connect.c:5294 +#: fe-connect.c:5257 fe-connect.c:5301 #, c-format msgid "syntax error in service file \"%s\", line %d\n" -msgstr "συντακτικό σφάλμα στο αρχείο υπηρεσίας “%s”, γραμμή %d\n" +msgstr "συντακτικό σφάλμα στο αρχείο υπηρεσίας «%s», γραμμή %d\n" -#: fe-connect.c:5261 +#: fe-connect.c:5268 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d\n" -msgstr "οι ένθετες προδιαγραφές υπηρεσίας δεν υποστηρίζονται στο αρχείο υπηρεσίας \"%s\", γραμμή %d\n" +msgstr "οι ένθετες προδιαγραφές υπηρεσίας δεν υποστηρίζονται στο αρχείο υπηρεσίας «%s», γραμμή %d\n" -#: fe-connect.c:5983 +#: fe-connect.c:5989 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"\n" -msgstr "μη έγκυρο URI διαδόθηκε στη ρουτίνα εσωτερικής ανάλυσης: \"%s\"\n" +msgstr "μη έγκυρο URI διαδόθηκε στη ρουτίνα εσωτερικής ανάλυσης: «%s»\n" -#: fe-connect.c:6060 +#: fe-connect.c:6066 #, c-format msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"\n" -msgstr "έφτασε στο τέλος της συμβολοσειράς κατά την αναζήτηση αντίστοιχου \"]\" στη διεύθυνση IPv6 κεντρικού υπολογιστή στο URI: \"%s\"\n" +msgstr "έφτασε στο τέλος της συμβολοσειράς κατά την αναζήτηση αντίστοιχου «]» στη διεύθυνση IPv6 κεντρικού υπολογιστή στο URI: «%s»\n" -#: fe-connect.c:6067 +#: fe-connect.c:6073 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"\n" -msgstr "η διεύθυνση IPv6 κεντρικού υπολογιστή δεν δύναται να είναι κενή στο URI: \"%s\"\n" +msgstr "η διεύθυνση IPv6 κεντρικού υπολογιστή δεν δύναται να είναι κενή στο URI: «%s»\n" -#: fe-connect.c:6082 +#: fe-connect.c:6088 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" -msgstr "μη αναμενόμενος χαρακτήρας \"%c\" στη θέση %d του URI (αναμένεται “:” ή \"/\"): \"%s\"\n" +msgstr "μη αναμενόμενος χαρακτήρας «%c» στη θέση %d του URI (αναμένεται «:» ή «/»): «%s»\n" -#: fe-connect.c:6212 +#: fe-connect.c:6218 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "επιπλέον διαχωριστικό κλειδιού/τιμής \"=\" στην παράμετρο ερωτήματος URI: \"%s\"\n" +msgstr "επιπλέον διαχωριστικό κλειδιού/τιμής «=» στην παράμετρο ερωτήματος URI: «%s»\n" -#: fe-connect.c:6232 +#: fe-connect.c:6238 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "λείπει διαχωριστικό κλειδιού/τιμής “=“ στην παράμετρο ερωτήματος URI: “%s”\n" +msgstr "λείπει διαχωριστικό κλειδιού/τιμής «=» στην παράμετρο ερωτήματος URI: «%s»\n" -#: fe-connect.c:6284 +#: fe-connect.c:6290 #, c-format msgid "invalid URI query parameter: \"%s\"\n" -msgstr "άκυρη παράμετρος ερωτήματος URI: “%s”\n" +msgstr "άκυρη παράμετρος ερωτήματος URI: «%s»\n" -#: fe-connect.c:6358 +#: fe-connect.c:6364 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" -msgstr "άκυρο διακριτικό με κωδικοποίηση ποσοστού: \"%s\"\n" +msgstr "άκυρο διακριτικό με κωδικοποίηση ποσοστού: «%s»\n" -#: fe-connect.c:6368 +#: fe-connect.c:6374 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" -msgstr "απαγορευμένη τιμή %%00 σε τιμή κωδικοποιημένου ποσοστού: \"%s\"\n" +msgstr "απαγορευμένη τιμή %%00 σε τιμή κωδικοποιημένου ποσοστού: «%s»\n" -#: fe-connect.c:6738 +#: fe-connect.c:6744 msgid "connection pointer is NULL\n" msgstr "ο δείκτης σύνδεσης είναι NULL\n" -#: fe-connect.c:7018 +#: fe-connect.c:7024 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" -msgstr "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: το αρχείο κωδικών πρόσβασης “%s” δεν είναι ένα απλό αρχείο\n" +msgstr "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: το αρχείο κωδικών πρόσβασης «%s» δεν είναι ένα απλό αρχείο\n" -#: fe-connect.c:7027 +#: fe-connect.c:7033 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" -msgstr "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: το αρχείο κωδικού πρόσβασης \"%s\" έχει ομαδική ή παγκόσμια πρόσβαση· τα δικαιώματα πρέπει να είναι U=RW (0600) ή λιγότερα\n" +msgstr "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: το αρχείο κωδικού πρόσβασης «%s» έχει ομαδική ή παγκόσμια πρόσβαση· τα δικαιώματα πρέπει να είναι U=RW (0600) ή λιγότερα\n" -#: fe-connect.c:7135 +#: fe-connect.c:7141 #, c-format msgid "password retrieved from file \"%s\"\n" -msgstr "ο κωδικός πρόσβασης ελήφθει από αρχείο “%s”\n" +msgstr "ο κωδικός πρόσβασης ελήφθει από αρχείο «%s»\n" -#: fe-exec.c:449 fe-exec.c:3219 +#: fe-exec.c:449 fe-exec.c:3286 #, c-format msgid "row number %d is out of range 0..%d" msgstr "ο αριθμός σειράς %d βρίσκεται εκτός εύρους 0..%d" @@ -677,124 +653,122 @@ msgstr "το PGresult δεν μπορεί να υποστηρίξει περισ msgid "size_t overflow" msgstr "υπερχείλιση overflow" -#: fe-exec.c:1302 fe-exec.c:1403 fe-exec.c:1451 +#: fe-exec.c:1335 fe-exec.c:1440 fe-exec.c:1489 msgid "command string is a null pointer\n" msgstr "η συμβολοσειρά εντολής είναι ένας κενός δείκτης\n" -#: fe-exec.c:1409 fe-exec.c:1457 fe-exec.c:1554 -msgid "number of parameters must be between 0 and 65535\n" -msgstr "ο αριθμός των παραμέτρων πρέπει να είναι μεταξύ 0 και 65535\n" +#: fe-exec.c:1446 fe-exec.c:1495 fe-exec.c:1591 +#, c-format +msgid "number of parameters must be between 0 and %d\n" +msgstr "ο αριθμός των παραμέτρων πρέπει να είναι μεταξύ 0 και %d\n" -#: fe-exec.c:1445 fe-exec.c:1548 +#: fe-exec.c:1483 fe-exec.c:1585 msgid "statement name is a null pointer\n" msgstr "η ονομασία της δήλωσης είναι ένας κενός δείκτης\n" -#: fe-exec.c:1589 +#: fe-exec.c:1627 fe-exec.c:3139 msgid "no connection to the server\n" msgstr "καμία σύνδεση στον διακομιστή\n" -#: fe-exec.c:1598 +#: fe-exec.c:1636 fe-exec.c:3148 msgid "another command is already in progress\n" msgstr "υπάρχει άλλη εντολή σε πρόοδο\n" -#: fe-exec.c:1627 +#: fe-exec.c:1665 msgid "cannot queue commands during COPY\n" -msgstr "" +msgstr "δεν είναι δυνατή η ουρά εντολών κατά τη διάρκεια του COPY\n" -#: fe-exec.c:1745 +#: fe-exec.c:1783 msgid "length must be given for binary parameter\n" msgstr "το μήκος πρέπει να περαστεί ως δυαδική παράμετρος\n" -#: fe-exec.c:2066 +#: fe-exec.c:2103 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "μη αναμενόμενο asyncStatus: %d\n" -#: fe-exec.c:2086 +#: fe-exec.c:2123 #, c-format msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "PGEventProc “%s” κατά τη διάρκεια συμβάντος PGEVT_RESULTCREATE\n" +msgstr "PGEventProc «%s» κατά τη διάρκεια συμβάντος PGEVT_RESULTCREATE\n" -#: fe-exec.c:2234 +#: fe-exec.c:2271 msgid "synchronous command execution functions are not allowed in pipeline mode\n" -msgstr "" +msgstr "οι συναρτήσεις σύγχρονης εκτέλεσης εντολών δεν επιτρέπονται σε λειτουργία διοχέτευσης\n" -#: fe-exec.c:2256 +#: fe-exec.c:2293 msgid "COPY terminated by new PQexec" msgstr "COPY τερματίστηκε από νέο PQexec" -#: fe-exec.c:2273 +#: fe-exec.c:2310 msgid "PQexec not allowed during COPY BOTH\n" msgstr "PQexec δεν επιτρέπεται κατά τη διάρκεια COPY BOTH\n" -#: fe-exec.c:2502 fe-exec.c:2558 fe-exec.c:2627 fe-protocol3.c:1863 +#: fe-exec.c:2538 fe-exec.c:2594 fe-exec.c:2663 fe-protocol3.c:1863 msgid "no COPY in progress\n" msgstr "κανένα COPY σε εξέλιξη\n" -#: fe-exec.c:2804 +#: fe-exec.c:2840 msgid "PQfn not allowed in pipeline mode\n" -msgstr "" +msgstr "το PQfn δεν επιτρέπεται σε λειτουργία διοχέτευσης\n" -#: fe-exec.c:2812 +#: fe-exec.c:2848 msgid "connection in wrong state\n" msgstr "σύνδεση σε λανθάνουσα κατάσταση\n" -#: fe-exec.c:2856 -#, fuzzy -#| msgid "cannot determine OID of function lo_tell\n" +#: fe-exec.c:2892 msgid "cannot enter pipeline mode, connection not idle\n" -msgstr "δεν είναι δυνατός ο προσδιορισμός του OID της συνάρτησης lo_tell\n" +msgstr "δεν ήταν δυνατή η είσοδος σε λειτουργία διοχέτευσης, σύνδεση μη αδρανή\n" -#: fe-exec.c:2890 fe-exec.c:2907 +#: fe-exec.c:2926 fe-exec.c:2943 msgid "cannot exit pipeline mode with uncollected results\n" -msgstr "" +msgstr "δεν είναι δυνατή η έξοδος από τη λειτουργία διοχέτευσης με μη λαμβανόμενα αποτελέσματα\n" -#: fe-exec.c:2895 +#: fe-exec.c:2931 msgid "cannot exit pipeline mode while busy\n" -msgstr "" +msgstr "δεν είναι δυνατή η έξοδος από τη λειτουργία διοχέτευσης ενώ απασχολείται\n" -#: fe-exec.c:3037 +#: fe-exec.c:3073 msgid "cannot send pipeline when not in pipeline mode\n" -msgstr "" +msgstr "δεν είναι δυνατή η αποστολή διοχέτευσης όταν δεν βρίσκεται σε λειτουργία διοχέτευσης\n" -#: fe-exec.c:3108 +#: fe-exec.c:3175 msgid "invalid ExecStatusType code" msgstr "άκυρος κωδικός ExecStatusType" -#: fe-exec.c:3135 +#: fe-exec.c:3202 msgid "PGresult is not an error result\n" msgstr "PGresult δεν είναι ένα αποτέλεσμα σφάλματος\n" -#: fe-exec.c:3203 fe-exec.c:3226 +#: fe-exec.c:3270 fe-exec.c:3293 #, c-format msgid "column number %d is out of range 0..%d" msgstr "αριθμός στήλης %d βρίσκεται εκτός εύρους 0..%d" -#: fe-exec.c:3241 +#: fe-exec.c:3308 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "αριθμός παραμέτρου %d βρίσκεται εκτός εύρους 0..%d" -#: fe-exec.c:3551 +#: fe-exec.c:3618 #, c-format msgid "could not interpret result from server: %s" msgstr "δεν μπόρεσε να ερμηνεύσει το αποτέλεσμα από τον διακομιστή: %s" -#: fe-exec.c:3811 fe-exec.c:3900 +#: fe-exec.c:3878 fe-exec.c:3967 msgid "incomplete multibyte character\n" msgstr "ελλιπής χαρακτήρας πολλαπλών byte\n" -#: fe-gssapi-common.c:123 +#: fe-gssapi-common.c:124 msgid "GSSAPI name import error" msgstr "σφάλμα εισαγωγής ονόματος GSSAPI" #: fe-lobj.c:145 fe-lobj.c:210 fe-lobj.c:403 fe-lobj.c:494 fe-lobj.c:568 #: fe-lobj.c:969 fe-lobj.c:977 fe-lobj.c:985 fe-lobj.c:993 fe-lobj.c:1001 #: fe-lobj.c:1009 fe-lobj.c:1017 fe-lobj.c:1025 -#, fuzzy, c-format -#| msgid "cannot determine OID of function lo_close\n" +#, c-format msgid "cannot determine OID of function %s\n" -msgstr "δεν είναι δυνατός ο προσδιορισμός του OID της συνάρτησης lo_close\n" +msgstr "δεν ήταν δυνατός ο προσδιορισμός του OID της συνάρτησης %s\n" #: fe-lobj.c:162 msgid "argument of lo_truncate exceeds integer range\n" @@ -811,17 +785,17 @@ msgstr "η παράμετρος του lo_write υπερβαίνει το εύρ #: fe-lobj.c:678 fe-lobj.c:789 #, c-format msgid "could not open file \"%s\": %s\n" -msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου “%s”: %s\n" +msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %s\n" #: fe-lobj.c:734 #, c-format msgid "could not read from file \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η ανάγνωση από το αρχείο “%s”: %s\n" +msgstr "δεν ήταν δυνατή η ανάγνωση από το αρχείο «%s»: %s\n" #: fe-lobj.c:810 fe-lobj.c:834 #, c-format msgid "could not write to file \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η εγγραφή στο αρχείο ”%s”: %s\n" +msgstr "δεν ήταν δυνατή η εγγραφή στο αρχείο »%s»: %s\n" #: fe-lobj.c:920 msgid "query to initialize large object functions did not return data\n" @@ -861,10 +835,9 @@ msgid "invalid socket\n" msgstr "άκυρος υποδοχέας\n" #: fe-misc.c:1083 -#, fuzzy, c-format -#| msgid "%s() failed: %m" +#, c-format msgid "%s() failed: %s\n" -msgstr "%s () απέτυχε: %m" +msgstr "%s() απέτυχε: %s\n" #: fe-protocol3.c:196 #, c-format @@ -873,26 +846,26 @@ msgstr "μήνυμα τύπου 0x%02x έφτασε από το διακομισ #: fe-protocol3.c:403 msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" -msgstr "ο διακομιστής έστειλε δεδομένα (“D” μήνυμα) χωρίς προηγούμενη περιγραφή γραμμής (“T” μήνυμα)\n" +msgstr "ο διακομιστής έστειλε δεδομένα («D» μήνυμα) χωρίς προηγούμενη περιγραφή γραμμής («T» μήνυμα)\n" #: fe-protocol3.c:446 #, c-format msgid "unexpected response from server; first received character was \"%c\"\n" -msgstr "μη αναμενόμενη απόκριση από το διακομιστή· πρώτος χαρακτήρας που ελήφθη ήταν \"%c\"\n" +msgstr "μη αναμενόμενη απόκριση από το διακομιστή· πρώτος χαρακτήρας που ελήφθη ήταν «%c»\n" #: fe-protocol3.c:471 #, c-format msgid "message contents do not agree with length in message type \"%c\"\n" -msgstr "τα περιεχόμενα του μηνύματος δεν συμφωνούν με το μήκος του σε τύπο μηνύματος \"%c\"\n" +msgstr "τα περιεχόμενα του μηνύματος δεν συμφωνούν με το μήκος του σε τύπο μηνύματος «%c»\n" #: fe-protocol3.c:491 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d\n" -msgstr "χάθηκε ο συγχρονισμός με το διακομιστή: ελήφθει τύπος μηνύματος \"%c\", μήκους %d\n" +msgstr "χάθηκε ο συγχρονισμός με το διακομιστή: ελήφθει τύπος μηνύματος «%c», μήκους %d\n" #: fe-protocol3.c:543 fe-protocol3.c:583 msgid "insufficient data in \"T\" message" -msgstr "ανεπαρκή δεδομένα σε “T” μήνυμα" +msgstr "ανεπαρκή δεδομένα σε «T» μήνυμα" #: fe-protocol3.c:654 fe-protocol3.c:860 msgid "out of memory for query result" @@ -900,15 +873,15 @@ msgstr "έλλειψη μνήμης για το αποτέλεσμα ερωτή #: fe-protocol3.c:723 msgid "insufficient data in \"t\" message" -msgstr "ανεπαρκή δεδομένα σε “t” μήνυμα" +msgstr "ανεπαρκή δεδομένα σε «t» μήνυμα" #: fe-protocol3.c:782 fe-protocol3.c:814 fe-protocol3.c:832 msgid "insufficient data in \"D\" message" -msgstr "ανεπαρκή δεδομένα σε “D” μήνυμα" +msgstr "ανεπαρκή δεδομένα σε «D» μήνυμα" #: fe-protocol3.c:788 msgid "unexpected field count in \"D\" message" -msgstr "μη αναμενόμενο πλήθος πεδίων σε ”D” μήνυμα" +msgstr "μη αναμενόμενο πλήθος πεδίων σε »D» μήνυμα" #: fe-protocol3.c:1029 msgid "no error message available\n" @@ -972,7 +945,7 @@ msgstr "LOCATION: " #: fe-protocol3.c:1161 #, c-format msgid "%s, " -msgstr "%s," +msgstr "%s, " #: fe-protocol3.c:1163 #, c-format @@ -1004,7 +977,7 @@ msgstr "το όνομα κεντρικού υπολογιστή πρέπει ν #: fe-secure-common.c:196 #, c-format msgid "server certificate for \"%s\" does not match host name \"%s\"\n" -msgstr "το πιστοποιητικό διακομιστή για το \"%s\" δεν ταιριάζει με το όνομα κεντρικού υπολογιστή \"%s\"\n" +msgstr "το πιστοποιητικό διακομιστή για το «%s» δεν ταιριάζει με το όνομα κεντρικού υπολογιστή «%s»\n" #: fe-secure-common.c:202 msgid "could not get server's host name from server certificate\n" @@ -1048,16 +1021,16 @@ msgstr "σφάλμα ελέγχου μεγέθους GSSAPI" msgid "GSSAPI context establishment error" msgstr "σφάλμα δημιουργίας περιεχομένου GSSAPI" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1329 +#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1333 #, c-format msgid "SSL SYSCALL error: %s\n" msgstr "SSL SYSCALL σφάλμα: %s\n" -#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1333 +#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1337 msgid "SSL SYSCALL error: EOF detected\n" msgstr "SSL SYSCALL σφάλμα: ανιχνεύτηκε EOF\n" -#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1342 +#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1346 #, c-format msgid "SSL error: %s\n" msgstr "SSL σφάλμα: %s\n" @@ -1066,7 +1039,7 @@ msgstr "SSL σφάλμα: %s\n" msgid "SSL connection has been closed unexpectedly\n" msgstr "η σύνδεση SSL έκλεισε απροσδόκητα\n" -#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1392 +#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1396 #, c-format msgid "unrecognized SSL error code: %d\n" msgstr "μη αναγνωρίσιμος κωδικός σφάλματος SSL: %d\n" @@ -1082,7 +1055,7 @@ msgstr "δεν μπόρεσε να βρεθεί σύνοψη (digest) για NID #: fe-secure-openssl.c:431 msgid "could not generate peer certificate hash\n" -msgstr "Δεν ήταν δυνατή η δημιουργία ομότιμου πιστοποιητικού hash\n" +msgstr "δεν ήταν δυνατή η δημιουργία ομότιμου πιστοποιητικού hash\n" #: fe-secure-openssl.c:488 msgid "SSL certificate's name entry is missing\n" @@ -1096,7 +1069,7 @@ msgstr "δεν ήταν δυνατή η δημιουργία περιεχομέ #: fe-secure-openssl.c:861 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version\n" -msgstr "άκυρη τιμή \"%s\" για την ελάχιστη έκδοση πρωτοκόλλου SSL\n" +msgstr "άκυρη τιμή «%s» για την ελάχιστη έκδοση πρωτοκόλλου SSL\n" #: fe-secure-openssl.c:872 #, c-format @@ -1106,7 +1079,7 @@ msgstr "δεν ήταν δυνατό να ορίσει ελάχιστη έκδο #: fe-secure-openssl.c:890 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version\n" -msgstr "άκυρη τιμή “%s” για μέγιστη έκδοση πρωτοκόλλου SSL\n" +msgstr "άκυρη τιμή «%s» για μέγιστη έκδοση πρωτοκόλλου SSL\n" #: fe-secure-openssl.c:901 #, c-format @@ -1116,7 +1089,7 @@ msgstr "δεν ήταν δυνατό να ορίσει μέγιστη έκδοσ #: fe-secure-openssl.c:937 #, c-format msgid "could not read root certificate file \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η ανάγνωση βασικού αρχείου πιστοποιητικού “%s”: %s\n" +msgstr "δεν ήταν δυνατή η ανάγνωση βασικού αρχείου πιστοποιητικού «%s»: %s\n" #: fe-secure-openssl.c:990 msgid "" @@ -1138,91 +1111,88 @@ msgstr "" #: fe-secure-openssl.c:1025 #, c-format msgid "could not open certificate file \"%s\": %s\n" -msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου πιστοποιητικού “%s”: %s\n" +msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου πιστοποιητικού «%s»: %s\n" #: fe-secure-openssl.c:1044 #, c-format msgid "could not read certificate file \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η ανάγνωση αρχείου πιστοποιητικού “%s”: %s\n" +msgstr "δεν ήταν δυνατή η ανάγνωση αρχείου πιστοποιητικού «%s»: %s\n" #: fe-secure-openssl.c:1069 #, c-format msgid "could not establish SSL connection: %s\n" msgstr "δεν ήταν δυνατή η δημιουργία σύνδεσης SSL: %s\n" -#: fe-secure-openssl.c:1099 -#, fuzzy, c-format -#| msgid "could not send SSL negotiation packet: %s\n" +#: fe-secure-openssl.c:1103 +#, c-format msgid "could not set SSL Server Name Indication (SNI): %s\n" -msgstr "" -"δεν ήταν δυνατή η αποστολή SSL πακέτου διαπραγμάτευσης: %s\n" -"\n" +msgstr "δεν ήταν δυνατός ο ορισμός SSL Server Name Indication (SNI): %s\n" -#: fe-secure-openssl.c:1145 +#: fe-secure-openssl.c:1149 #, c-format msgid "could not load SSL engine \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η φόρτωση της μηχανής SSL \"%s\": %s\n" +msgstr "δεν ήταν δυνατή η φόρτωση της μηχανής SSL «%s»: %s\n" -#: fe-secure-openssl.c:1157 +#: fe-secure-openssl.c:1161 #, c-format msgid "could not initialize SSL engine \"%s\": %s\n" msgstr "" -"δεν ήταν δυνατή η εκκίνηση του κινητήρα SSL ”%s”: %s\n" +"δεν ήταν δυνατή η εκκίνηση του κινητήρα SSL »%s»: %s\n" "\n" -#: fe-secure-openssl.c:1173 +#: fe-secure-openssl.c:1177 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η ανάγνωση του ιδιωτικού κλειδιού SSL \"%s\" από την μηχανή \"%s\": %s\n" +msgstr "δεν ήταν δυνατή η ανάγνωση του ιδιωτικού κλειδιού SSL «%s» από την μηχανή «%s»: %s\n" -#: fe-secure-openssl.c:1187 +#: fe-secure-openssl.c:1191 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η φόρτωση του ιδιωτικού κλειδιού SSL \"%s\" από την μηχανή \"%s\": %s\n" +msgstr "δεν ήταν δυνατή η φόρτωση του ιδιωτικού κλειδιού SSL «%s» από την μηχανή «%s»: %s\n" -#: fe-secure-openssl.c:1224 +#: fe-secure-openssl.c:1228 #, c-format msgid "certificate present, but not private key file \"%s\"\n" -msgstr "υπάρχει πιστοποιητικό, αλλά όχι αρχείο ιδιωτικού κλειδιού \"%s\"\n" +msgstr "υπάρχει πιστοποιητικό, αλλά όχι αρχείο ιδιωτικού κλειδιού «%s»\n" -#: fe-secure-openssl.c:1232 +#: fe-secure-openssl.c:1236 #, c-format msgid "private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" -msgstr "αρχείο ιδιωτικού κλειδιού \"%s\" έχει ομαδική ή παγκόσμια πρόσβαση· τα δικαιώματα πρέπει να είναι U=RW (0600) ή λιγότερα\n" +msgstr "αρχείο ιδιωτικού κλειδιού «%s» έχει ομαδική ή παγκόσμια πρόσβαση· τα δικαιώματα πρέπει να είναι U=RW (0600) ή λιγότερα\n" -#: fe-secure-openssl.c:1257 +#: fe-secure-openssl.c:1261 #, c-format msgid "could not load private key file \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η φόρτωση αρχείου ιδιωτικού κλειδιού “%s”: %s\n" +msgstr "δεν ήταν δυνατή η φόρτωση αρχείου ιδιωτικού κλειδιού «%s»: %s\n" -#: fe-secure-openssl.c:1275 +#: fe-secure-openssl.c:1279 #, c-format msgid "certificate does not match private key file \"%s\": %s\n" -msgstr "το πιστοποιητικό δεν ταιριάζει με το αρχείο ιδιωτικού κλειδιού “%s”: %s\n" +msgstr "το πιστοποιητικό δεν ταιριάζει με το αρχείο ιδιωτικού κλειδιού «%s»: %s\n" -#: fe-secure-openssl.c:1375 +#: fe-secure-openssl.c:1379 #, c-format msgid "This may indicate that the server does not support any SSL protocol version between %s and %s.\n" msgstr "Αυτό μπορεί να υποδεικνύει ότι ο διακομιστής δεν υποστηρίζει καμία έκδοση πρωτοκόλλου SSL μεταξύ %s και %s.\n" -#: fe-secure-openssl.c:1411 +#: fe-secure-openssl.c:1415 #, c-format msgid "certificate could not be obtained: %s\n" msgstr "" "δεν ήταν δυνατή η λήψη πιστοποιητικού: %s\n" "\n" -#: fe-secure-openssl.c:1517 +#: fe-secure-openssl.c:1521 #, c-format msgid "no SSL error reported" msgstr "δεν αναφέρθηκε κανένα σφάλμα SSL" -#: fe-secure-openssl.c:1526 +#: fe-secure-openssl.c:1530 #, c-format msgid "SSL error code %lu" msgstr "κωδικός σφάλματος SSL %lu" -#: fe-secure-openssl.c:1773 +#: fe-secure-openssl.c:1777 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "WARNING: περικομμένο sslpassword\n" @@ -1242,106 +1212,103 @@ msgstr "δεν ήταν δυνατή η αποστολή δεδομένων στ msgid "unrecognized socket error: 0x%08X/%d" msgstr "μη αναγνωρίσιμο σφάλμα υποδοχής: 0x%08X/%d" -#~ msgid "lost synchronization with server, resetting connection" -#~ msgstr "χάθηκε ο συγχρονισμός με τον διακομιστή, επαναρυθμίζεται η σύνδεση" +#~ msgid "invalid channel_binding value: \"%s\"\n" +#~ msgstr "άκυρη τιμή channel_binding: «%s»\n" -#~ msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" -#~ msgstr "ο διακομιστής έστειλε δυαδικά δεδομένα (“B” μήνυμα) χωρίς προηγούμενη περιγραφή γραμμής (“T” μήνυμα)" +#~ msgid "invalid ssl_min_protocol_version value: \"%s\"\n" +#~ msgstr "άκυρη τιμή ssl_min_protocol_version: «%s»\n" -#~ msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" -#~ msgstr "ο διακομιστής έστειλε δεδομένα (“D” μήνυμα) χωρίς προηγούμενη περιγραφή γραμμής (“T” μήνυμα)" +#~ msgid "invalid ssl_max_protocol_version value: \"%s\"\n" +#~ msgstr "άκυρη τιμή ssl_max_protocol_version: «%s»\n" -#~ msgid "unexpected character %c following empty query response (\"I\" message)" -#~ msgstr "μη αναμενόμενος χαρακτήρας %c μετά από κενή απόκριση ερωτήματος (“I” μήνυμα)" +#~ msgid "invalid gssencmode value: \"%s\"\n" +#~ msgstr "άκυρη τιμή gssencmode: «%s»\n" -#~ msgid "invalid state %c, probably indicative of memory corruption\n" -#~ msgstr "μη έγκυρη κατάσταση %c, πιθανώς ενδεικτική αλλοίωσης μνήμης\n" +#~ msgid "invalid target_session_attrs value: \"%s\"\n" +#~ msgstr "άκυρη τιμή target_session_attrs: «%s»\n" -#~ msgid "invalid setenv state %c, probably indicative of memory corruption\n" -#~ msgstr "μη έγκυρη κατάσταση %c setenv, πιθανώς ενδεικτική αλλοίωσης μνήμης\n" +#~ msgid "" +#~ "could not connect to server: %s\n" +#~ "\tIs the server running on host \"%s\" (%s) and accepting\n" +#~ "\tTCP/IP connections on port %s?\n" +#~ msgstr "" +#~ "δεν ήταν δυνατή η σύνδεση με το διακομιστή: %s\n" +#~ "\tΕκτελείται ο διακομιστής στον κεντρικό υπολογιστή »%s» (%s) και αποδέχεται\n" +#~ "\tσυνδέσεις TCP/IP στην θύρα %s;\n" -#~ msgid "select() failed: %s\n" -#~ msgstr "απέτυχε το select(): %s\n" +#~ msgid "setsockopt(%s) failed: %s\n" +#~ msgstr "setsockopt(%s) απέτυχε: %s\n" -#~ msgid "cannot determine OID of function lowrite\n" -#~ msgstr "δεν είναι δυνατός ο προσδιορισμός του OID της συνάρτησης lowrite\n" +#~ msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" +#~ msgstr "WSAIoctl(SIO_KEEPALIVE_VALS) απέτυχε: %ui\n" -#~ msgid "cannot determine OID of function loread\n" -#~ msgstr "δεν είναι δυνατός ο προσδιορισμός του OID της συνάρτησης loread\n" +#~ msgid "could not make a writable connection to server \"%s:%s\"\n" +#~ msgstr "δεν ήταν δυνατή η πραγματοποίηση εγγράψιμης σύνδεσης με το διακομιστή \"%s:%s\"\n" -#~ msgid "cannot determine OID of function lo_lseek\n" -#~ msgstr "δεν είναι δυνατός ο προσδιορισμός του OID της συνάρτησης lo_lseek\n" +#~ msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" +#~ msgstr "το τεστ «SHOW transaction_read_only» απέτυχε στον διακομιστή «%s:%s»\n" -#~ msgid "cannot determine OID of function lo_unlink\n" -#~ msgstr "δεν είναι δυνατός ο προσδιορισμός του OID της συνάρτησης lo_unlink\n" +#~ msgid "function requires at least protocol version 3.0\n" +#~ msgstr "η συνάρτηση απαιτεί πρωτόκολλο ελάχιστης έκδοσης 3.0\n" -#~ msgid "cannot determine OID of function lo_creat\n" -#~ msgstr "δεν είναι δυνατός ο προσδιορισμός του OID της συνάρτησης lo_creat\n" +#~ msgid "COPY IN state must be terminated first\n" +#~ msgstr "" +#~ "πρέπει πρώτα να τερματιστεί η κατάσταση COPY IN\n" +#~ "\n" -#~ msgid "cannot determine OID of function lo_open\n" -#~ msgstr "δεν είναι δυνατός ο προσδιορισμός του OID της συνάρτησης lo_open\n" +#~ msgid "COPY OUT state must be terminated first\n" +#~ msgstr "πρέπει πρώτα να τερματιστεί η κατάσταση COPY OUT\n" -#~ msgid "cannot determine OID of function lo_tell64\n" -#~ msgstr "δεν μπόρεσε να προσδιορίσει το OID της συνάρτησης lo_tell64\n" +#~ msgid "cannot determine OID of function lo_truncate\n" +#~ msgstr "δεν μπόρεσε να προσδιορίσει το OID της συνάρτησης lo_truncate\n" -#~ msgid "cannot determine OID of function lo_create\n" -#~ msgstr "δεν μπόρεσε να προσδιορίσει το OID της συνάρτησης lo_create\n" +#~ msgid "cannot determine OID of function lo_truncate64\n" +#~ msgstr "δεν μπόρεσε να προσδιορίσει το OID της συνάρτησης lo_truncate64\n" #~ msgid "cannot determine OID of function lo_lseek64\n" #~ msgstr "δεν μπόρεσε να προσδιορίσει το OID της συνάρτησης lo_lseek64\n" -#~ msgid "cannot determine OID of function lo_truncate64\n" -#~ msgstr "δεν μπόρεσε να προσδιορίσει το OID της συνάρτησης lo_truncate64\n" - -#~ msgid "cannot determine OID of function lo_truncate\n" -#~ msgstr "δεν μπόρεσε να προσδιορίσει το OID της συνάρτησης lo_truncate\n" +#~ msgid "cannot determine OID of function lo_create\n" +#~ msgstr "δεν μπόρεσε να προσδιορίσει το OID της συνάρτησης lo_create\n" -#~ msgid "COPY OUT state must be terminated first\n" -#~ msgstr "πρέπει πρώτα να τερματιστεί η κατάσταση COPY OUT\n" +#~ msgid "cannot determine OID of function lo_tell64\n" +#~ msgstr "δεν μπόρεσε να προσδιορίσει το OID της συνάρτησης lo_tell64\n" -#~ msgid "COPY IN state must be terminated first\n" -#~ msgstr "" -#~ "πρέπει πρώτα να τερματιστεί η κατάσταση COPY IN\n" -#~ "\n" +#~ msgid "cannot determine OID of function lo_open\n" +#~ msgstr "δεν είναι δυνατός ο προσδιορισμός του OID της συνάρτησης lo_open\n" -#~ msgid "function requires at least protocol version 3.0\n" -#~ msgstr "η συνάρτηση απαιτεί πρωτόκολλο ελάχιστης έκδοσης 3.0\n" +#~ msgid "cannot determine OID of function lo_creat\n" +#~ msgstr "δεν είναι δυνατός ο προσδιορισμός του OID της συνάρτησης lo_creat\n" -#~ msgid "line %d too long in service file \"%s\"\n" -#~ msgstr "Πολύ μακρυά γραμμή %d στο αρχείο υπηρεσίας “%s”\n" +#~ msgid "cannot determine OID of function lo_unlink\n" +#~ msgstr "δεν είναι δυνατός ο προσδιορισμός του OID της συνάρτησης lo_unlink\n" -#~ msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" -#~ msgstr "το τεστ “SHOW transaction_read_only” απέτυχε στον διακομιστή “%s:%s”\n" +#~ msgid "cannot determine OID of function lo_lseek\n" +#~ msgstr "δεν είναι δυνατός ο προσδιορισμός του OID της συνάρτησης lo_lseek\n" -#~ msgid "could not make a writable connection to server \"%s:%s\"\n" -#~ msgstr "δεν ήταν δυνατή η πραγματοποίηση εγγράψιμης σύνδεσης με το διακομιστή \"%s:%s\"\n" +#~ msgid "cannot determine OID of function loread\n" +#~ msgstr "δεν είναι δυνατός ο προσδιορισμός του OID της συνάρτησης loread\n" -#~ msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" -#~ msgstr "WSAIoctl(SIO_KEEPALIVE_VALS) απέτυχε: %ui\n" +#~ msgid "cannot determine OID of function lowrite\n" +#~ msgstr "δεν είναι δυνατός ο προσδιορισμός του OID της συνάρτησης lowrite\n" -#~ msgid "setsockopt(%s) failed: %s\n" -#~ msgstr "setsockopt(%s) απέτυχε: %s\n" +#~ msgid "select() failed: %s\n" +#~ msgstr "απέτυχε το select(): %s\n" -#~ msgid "" -#~ "could not connect to server: %s\n" -#~ "\tIs the server running on host \"%s\" (%s) and accepting\n" -#~ "\tTCP/IP connections on port %s?\n" -#~ msgstr "" -#~ "δεν ήταν δυνατή η σύνδεση με το διακομιστή: %s\n" -#~ "\tΕκτελείται ο διακομιστής στον κεντρικό υπολογιστή ”%s” (%s) και αποδέχεται\n" -#~ "\tσυνδέσεις TCP/IP στην θύρα %s;\n" +#~ msgid "invalid setenv state %c, probably indicative of memory corruption\n" +#~ msgstr "μη έγκυρη κατάσταση %c setenv, πιθανώς ενδεικτική αλλοίωσης μνήμης\n" -#~ msgid "invalid target_session_attrs value: \"%s\"\n" -#~ msgstr "άκυρη τιμή target_session_attrs: “%s”\n" +#~ msgid "invalid state %c, probably indicative of memory corruption\n" +#~ msgstr "μη έγκυρη κατάσταση %c, πιθανώς ενδεικτική αλλοίωσης μνήμης\n" -#~ msgid "invalid gssencmode value: \"%s\"\n" -#~ msgstr "άκυρη τιμή gssencmode: “%s”\n" +#~ msgid "unexpected character %c following empty query response (\"I\" message)" +#~ msgstr "μη αναμενόμενος χαρακτήρας %c μετά από κενή απόκριση ερωτήματος («I» μήνυμα)" -#~ msgid "invalid ssl_max_protocol_version value: \"%s\"\n" -#~ msgstr "άκυρη τιμή ssl_max_protocol_version: “%s”\n" +#~ msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" +#~ msgstr "ο διακομιστής έστειλε δεδομένα («D» μήνυμα) χωρίς προηγούμενη περιγραφή γραμμής («T» μήνυμα)" -#~ msgid "invalid ssl_min_protocol_version value: \"%s\"\n" -#~ msgstr "άκυρη τιμή ssl_min_protocol_version: “%s”\n" +#~ msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" +#~ msgstr "ο διακομιστής έστειλε δυαδικά δεδομένα («B» μήνυμα) χωρίς προηγούμενη περιγραφή γραμμής («T» μήνυμα)" -#~ msgid "invalid channel_binding value: \"%s\"\n" -#~ msgstr "άκυρη τιμή channel_binding: “%s”\n" +#~ msgid "lost synchronization with server, resetting connection" +#~ msgstr "χάθηκε ο συγχρονισμός με τον διακομιστή, επαναρυθμίζεται η σύνδεση" diff --git a/src/interfaces/libpq/po/es.po b/src/interfaces/libpq/po/es.po index 1cb1dc86b7..cb299e8f71 100644 --- a/src/interfaces/libpq/po/es.po +++ b/src/interfaces/libpq/po/es.po @@ -1,19 +1,19 @@ # Spanish message translation file for libpq 2013-08-30 12:42-0400\n" # -# Copyright (c) 2002-2019, PostgreSQL Global Development Group +# Copyright (c) 2002-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Karim , 2002. # Alvaro Herrera , 2003-2013 # Mario González , 2005 -# Carlos Chapi , 2017-2021 +# Carlos Chapi , 2017, 2021 # msgid "" msgstr "" -"Project-Id-Version: libpq (PostgreSQL) 12\n" +"Project-Id-Version: libpq (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-06-11 16:39+0000\n" -"PO-Revision-Date: 2021-06-14 19:58-0500\n" +"POT-Creation-Date: 2022-01-12 04:10+0000\n" +"PO-Revision-Date: 2022-01-12 17:27-0500\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -59,16 +59,17 @@ msgstr "no se pude generar nonce\n" #: fe-auth-scram.c:366 fe-auth-scram.c:441 fe-auth-scram.c:595 #: fe-auth-scram.c:616 fe-auth-scram.c:642 fe-auth-scram.c:657 #: fe-auth-scram.c:707 fe-auth-scram.c:746 fe-auth.c:290 fe-auth.c:362 -#: fe-auth.c:398 fe-auth.c:615 fe-auth.c:774 fe-auth.c:1132 fe-auth.c:1282 -#: fe-connect.c:912 fe-connect.c:1456 fe-connect.c:1625 fe-connect.c:2977 -#: fe-connect.c:4658 fe-connect.c:4919 fe-connect.c:5038 fe-connect.c:5282 -#: fe-connect.c:5364 fe-connect.c:5463 fe-connect.c:5719 fe-connect.c:5748 -#: fe-connect.c:5820 fe-connect.c:5844 fe-connect.c:5862 fe-connect.c:5963 -#: fe-connect.c:5972 fe-connect.c:6330 fe-connect.c:6480 fe-exec.c:1209 -#: fe-exec.c:2996 fe-exec.c:3148 fe-exec.c:3921 fe-exec.c:4086 -#: fe-gssapi-common.c:110 fe-lobj.c:881 fe-protocol3.c:1016 fe-protocol3.c:1724 -#: fe-secure-common.c:110 fe-secure-gssapi.c:504 fe-secure-openssl.c:440 -#: fe-secure-openssl.c:1133 +#: fe-auth.c:398 fe-auth.c:615 fe-auth.c:775 fe-auth.c:1140 fe-auth.c:1271 +#: fe-auth.c:1291 fe-connect.c:911 fe-connect.c:1455 fe-connect.c:1624 +#: fe-connect.c:2976 fe-connect.c:4690 fe-connect.c:4951 fe-connect.c:5070 +#: fe-connect.c:5322 fe-connect.c:5403 fe-connect.c:5502 fe-connect.c:5758 +#: fe-connect.c:5787 fe-connect.c:5859 fe-connect.c:5883 fe-connect.c:5901 +#: fe-connect.c:6002 fe-connect.c:6011 fe-connect.c:6369 fe-connect.c:6519 +#: fe-connect.c:6785 fe-exec.c:686 fe-exec.c:876 fe-exec.c:1223 fe-exec.c:3043 +#: fe-exec.c:3226 fe-exec.c:3999 fe-exec.c:4164 fe-gssapi-common.c:111 +#: fe-lobj.c:881 fe-protocol3.c:975 fe-protocol3.c:990 fe-protocol3.c:1023 +#: fe-protocol3.c:1731 fe-secure-common.c:110 fe-secure-gssapi.c:504 +#: fe-secure-openssl.c:440 fe-secure-openssl.c:1133 msgid "out of memory\n" msgstr "memoria agotada\n" @@ -122,7 +123,7 @@ msgstr "memoria agotada creando el búfer GSSAPI (%d)\n" msgid "GSSAPI continuation error" msgstr "error en continuación de GSSAPI" -#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:97 fe-secure-common.c:98 +#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:98 fe-secure-common.c:98 msgid "host name must be specified\n" msgstr "el nombre de servidor debe ser especificado\n" @@ -184,577 +185,595 @@ msgstr "Se recibió AuthenticationSASLFinal desde el servidor, pero la autentifi msgid "SCM_CRED authentication method not supported\n" msgstr "el método de autentificación SCM_CRED no está soportado\n" -#: fe-auth.c:836 +#: fe-auth.c:785 fe-auth.c:794 fe-auth.c:1283 +#, c-format +msgid "could not encrypt password: %s\n" +msgstr "no se pudo cifrar contraseña: %s\n" + +#: fe-auth.c:844 msgid "channel binding required, but server authenticated client without channel binding\n" msgstr "se requiere enlazado de canal (channel binding), pero el servidor autenticó al cliente sin enlazado de canal\n" -#: fe-auth.c:842 +#: fe-auth.c:850 msgid "channel binding required but not supported by server's authentication request\n" msgstr "se requiere enlazado de canal (channel binding), pero no es compatible con la solicitud de autenticación del servidor\n" -#: fe-auth.c:877 +#: fe-auth.c:885 msgid "Kerberos 4 authentication not supported\n" msgstr "el método de autentificación Kerberos 4 no está soportado\n" -#: fe-auth.c:882 +#: fe-auth.c:890 msgid "Kerberos 5 authentication not supported\n" msgstr "el método de autentificación Kerberos 5 no está soportado\n" -#: fe-auth.c:953 +#: fe-auth.c:961 msgid "GSSAPI authentication not supported\n" msgstr "el método de autentificación GSSAPI no está soportado\n" -#: fe-auth.c:985 +#: fe-auth.c:993 msgid "SSPI authentication not supported\n" msgstr "el método de autentificación SSPI no está soportado\n" -#: fe-auth.c:993 +#: fe-auth.c:1001 msgid "Crypt authentication not supported\n" msgstr "el método de autentificación Crypt no está soportado\n" -#: fe-auth.c:1060 +#: fe-auth.c:1068 #, c-format msgid "authentication method %u not supported\n" msgstr "el método de autentificación %u no está soportado\n" -#: fe-auth.c:1107 +#: fe-auth.c:1115 #, c-format msgid "user name lookup failure: error code %lu\n" msgstr "fallo en la búsqueda del nombre de usuario: código de error %lu\n" -#: fe-auth.c:1117 fe-connect.c:2852 +#: fe-auth.c:1125 fe-connect.c:2851 #, c-format msgid "could not look up local user ID %d: %s\n" msgstr "no se pudo buscar el usuario local de ID %d: %s\n" -#: fe-auth.c:1122 fe-connect.c:2857 +#: fe-auth.c:1130 fe-connect.c:2856 #, c-format msgid "local user with ID %d does not exist\n" msgstr "no existe un usuario local con ID %d\n" -#: fe-auth.c:1226 +#: fe-auth.c:1235 msgid "unexpected shape of result set returned for SHOW\n" msgstr "SHOW retornó un conjunto de resultados con estructura inesperada\n" -#: fe-auth.c:1235 +#: fe-auth.c:1244 msgid "password_encryption value too long\n" msgstr "el valor para password_encryption es demasiado largo\n" -#: fe-auth.c:1275 +#: fe-auth.c:1296 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" msgstr "algoritmo para cifrado de contraseña «%s» desconocido\n" -#: fe-connect.c:1095 +#: fe-connect.c:1094 #, c-format msgid "could not match %d host names to %d hostaddr values\n" msgstr "no se pudo emparejar %d nombres de host a %d direcciones de host\n" -#: fe-connect.c:1176 +#: fe-connect.c:1175 #, c-format msgid "could not match %d port numbers to %d hosts\n" msgstr "no se pudo emparejar %d números de puertos a %d hosts\n" -#: fe-connect.c:1269 fe-connect.c:1295 fe-connect.c:1337 fe-connect.c:1346 -#: fe-connect.c:1379 fe-connect.c:1423 +#: fe-connect.c:1268 fe-connect.c:1294 fe-connect.c:1336 fe-connect.c:1345 +#: fe-connect.c:1378 fe-connect.c:1422 #, c-format msgid "invalid %s value: \"%s\"\n" msgstr "valor %s no válido: «%s»\n" -#: fe-connect.c:1316 +#: fe-connect.c:1315 #, c-format msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" msgstr "el valor sslmode «%s» no es válido cuando no se ha compilado con soporte SSL\n" -#: fe-connect.c:1364 +#: fe-connect.c:1363 msgid "invalid SSL protocol version range\n" msgstr "rango de protocolo SSL no válido \n" -#: fe-connect.c:1389 +#: fe-connect.c:1388 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" msgstr "el valor gssencmode «%s» no es válido cuando no se ha compilado con soporte GSSAPI\n" -#: fe-connect.c:1649 +#: fe-connect.c:1648 #, c-format msgid "could not set socket to TCP no delay mode: %s\n" msgstr "no se pudo establecer el socket en modo TCP sin retardo: %s\n" -#: fe-connect.c:1711 +#: fe-connect.c:1710 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "falló la conexión al servidor en el socket «%s»: " -#: fe-connect.c:1738 +#: fe-connect.c:1737 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "falló la conexión al servidor en «%s» (%s), puerto %s: " -#: fe-connect.c:1743 +#: fe-connect.c:1742 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "falló la conexión al servidor en «%s», puerto %s: " -#: fe-connect.c:1768 +#: fe-connect.c:1767 msgid "\tIs the server running locally and accepting connections on that socket?\n" msgstr "\t¿Está el servidor en ejecución localmente y aceptando conexiones en ese socket?\n" -#: fe-connect.c:1772 +#: fe-connect.c:1771 msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" msgstr "\t¿Está el servidor en ejecución en ese host y aceptando conexiones TCP/IP?\n" -#: fe-connect.c:1836 +#: fe-connect.c:1835 #, c-format msgid "invalid integer value \"%s\" for connection option \"%s\"\n" msgstr "valor entero «%s» no válido para la opción de conexión «%s»\n" -#: fe-connect.c:1866 fe-connect.c:1901 fe-connect.c:1937 fe-connect.c:2026 -#: fe-connect.c:2640 +#: fe-connect.c:1865 fe-connect.c:1900 fe-connect.c:1936 fe-connect.c:2025 +#: fe-connect.c:2639 #, c-format msgid "%s(%s) failed: %s\n" msgstr "%s(%s) falló: %s\n" -#: fe-connect.c:1991 +#: fe-connect.c:1990 #, c-format msgid "%s(%s) failed: error code %d\n" msgstr "%s(%s) falló: código de error %d\n" -#: fe-connect.c:2306 +#: fe-connect.c:2305 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "el estado de conexión no es válido, probablemente por corrupción de memoria\n" -#: fe-connect.c:2385 +#: fe-connect.c:2384 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "número de puerto no válido: «%s»\n" -#: fe-connect.c:2401 +#: fe-connect.c:2400 #, c-format msgid "could not translate host name \"%s\" to address: %s\n" msgstr "no se pudo traducir el nombre «%s» a una dirección: %s\n" -#: fe-connect.c:2414 +#: fe-connect.c:2413 #, c-format msgid "could not parse network address \"%s\": %s\n" msgstr "no se pudo interpretar la dirección de red «%s»: %s\n" -#: fe-connect.c:2427 +#: fe-connect.c:2426 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" msgstr "la ruta del socket de dominio Unix «%s» es demasiado larga (máximo %d bytes)\n" -#: fe-connect.c:2442 +#: fe-connect.c:2441 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" msgstr "no se pudo traducir la ruta del socket Unix «%s» a una dirección: %s\n" -#: fe-connect.c:2568 +#: fe-connect.c:2567 #, c-format msgid "could not create socket: %s\n" msgstr "no se pudo crear el socket: %s\n" -#: fe-connect.c:2599 +#: fe-connect.c:2598 #, c-format msgid "could not set socket to nonblocking mode: %s\n" msgstr "no se pudo establecer el socket en modo no bloqueante: %s\n" -#: fe-connect.c:2609 +#: fe-connect.c:2608 #, c-format msgid "could not set socket to close-on-exec mode: %s\n" msgstr "no se pudo poner el socket en modo close-on-exec: %s\n" -#: fe-connect.c:2627 +#: fe-connect.c:2626 msgid "keepalives parameter must be an integer\n" msgstr "el parámetro de keepalives debe ser un entero\n" -#: fe-connect.c:2768 +#: fe-connect.c:2767 #, c-format msgid "could not get socket error status: %s\n" msgstr "no se pudo determinar el estado de error del socket: %s\n" -#: fe-connect.c:2796 +#: fe-connect.c:2795 #, c-format msgid "could not get client address from socket: %s\n" msgstr "no se pudo obtener la dirección del cliente desde el socket: %s\n" -#: fe-connect.c:2838 +#: fe-connect.c:2837 msgid "requirepeer parameter is not supported on this platform\n" msgstr "el parámetro requirepeer no está soportado en esta plataforma\n" -#: fe-connect.c:2841 +#: fe-connect.c:2840 #, c-format msgid "could not get peer credentials: %s\n" msgstr "no se pudo obtener credenciales de la contraparte: %s\n" -#: fe-connect.c:2865 +#: fe-connect.c:2864 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" msgstr "requirepeer especifica «%s», pero el nombre de usuario de la contraparte es «%s»\n" -#: fe-connect.c:2905 +#: fe-connect.c:2904 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "no se pudo enviar el paquete de negociación GSSAPI: %s\n" -#: fe-connect.c:2917 +#: fe-connect.c:2916 msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)\n" msgstr "cifrado GSSAPI requerido, pero fue imposible (posiblemente no hay cache de credenciales, no hay soporte de servidor, o se está usando un socket local)\n" -#: fe-connect.c:2959 +#: fe-connect.c:2958 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "no se pudo enviar el paquete de negociación SSL: %s\n" -#: fe-connect.c:2990 +#: fe-connect.c:2989 #, c-format msgid "could not send startup packet: %s\n" msgstr "no se pudo enviar el paquete de inicio: %s\n" -#: fe-connect.c:3066 +#: fe-connect.c:3065 msgid "server does not support SSL, but SSL was required\n" msgstr "el servidor no soporta SSL, pero SSL es requerida\n" -#: fe-connect.c:3093 +#: fe-connect.c:3092 #, c-format msgid "received invalid response to SSL negotiation: %c\n" msgstr "se ha recibido una respuesta no válida en la negociación SSL: %c\n" -#: fe-connect.c:3182 +#: fe-connect.c:3113 +msgid "received unencrypted data after SSL response\n" +msgstr "se recibieron datos no cifrados después de la respuesta SSL\n" + +#: fe-connect.c:3194 msgid "server doesn't support GSSAPI encryption, but it was required\n" msgstr "el servidor no soporta cifrado GSSAPI, pero es requerida\n" -#: fe-connect.c:3194 +#: fe-connect.c:3206 #, c-format msgid "received invalid response to GSSAPI negotiation: %c\n" msgstr "se ha recibido una respuesta no válida en la negociación GSSAPI: %c\n" -#: fe-connect.c:3260 fe-connect.c:3285 +#: fe-connect.c:3225 +msgid "received unencrypted data after GSSAPI encryption response\n" +msgstr "se recibieron datos no cifrados después de la respuesta de cifrado GSSAPI\n" + +#: fe-connect.c:3285 fe-connect.c:3310 #, c-format msgid "expected authentication request from server, but received %c\n" msgstr "se esperaba una petición de autentificación desde el servidor, pero se ha recibido %c\n" -#: fe-connect.c:3492 +#: fe-connect.c:3517 msgid "unexpected message from server during startup\n" msgstr "se ha recibido un mensaje inesperado del servidor durante el inicio\n" -#: fe-connect.c:3584 +#: fe-connect.c:3609 msgid "session is read-only\n" msgstr "la sesión es de solo lectura\n" -#: fe-connect.c:3587 +#: fe-connect.c:3612 msgid "session is not read-only\n" msgstr "la sesión no es de solo lectura\n" -#: fe-connect.c:3641 +#: fe-connect.c:3666 msgid "server is in hot standby mode\n" msgstr "el servidor está en modo hot standby\n" -#: fe-connect.c:3644 +#: fe-connect.c:3669 msgid "server is not in hot standby mode\n" msgstr "el servidor no está en modo hot standby\n" -#: fe-connect.c:3755 fe-connect.c:3807 +#: fe-connect.c:3787 fe-connect.c:3839 #, c-format msgid "\"%s\" failed\n" msgstr "«%s» falló\n" -#: fe-connect.c:3821 +#: fe-connect.c:3853 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption\n" msgstr "estado de conexión no válido %d, probablemente por corrupción de memoria\n" -#: fe-connect.c:4267 fe-connect.c:4327 +#: fe-connect.c:4299 fe-connect.c:4359 #, c-format msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" msgstr "PGEventProc «%s» falló durante el evento PGEVT_CONNRESET\n" -#: fe-connect.c:4671 +#: fe-connect.c:4703 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" msgstr "URL LDAP no válida «%s»: el esquema debe ser ldap://\n" -#: fe-connect.c:4686 +#: fe-connect.c:4718 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" msgstr "URL LDAP no válida «%s»: distinguished name faltante\n" -#: fe-connect.c:4698 fe-connect.c:4756 +#: fe-connect.c:4730 fe-connect.c:4788 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" msgstr "URL LDAP no válida «%s»: debe tener exactamente un atributo\n" -#: fe-connect.c:4710 fe-connect.c:4772 +#: fe-connect.c:4742 fe-connect.c:4804 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" msgstr "URL LDAP no válida «%s»: debe tener ámbito de búsqueda (base/one/sub)\n" -#: fe-connect.c:4722 +#: fe-connect.c:4754 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "URL LDAP no válida «%s»: no tiene filtro\n" -#: fe-connect.c:4744 +#: fe-connect.c:4776 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" msgstr "URL LDAP no válida «%s»: número de puerto no válido\n" -#: fe-connect.c:4782 +#: fe-connect.c:4814 msgid "could not create LDAP structure\n" msgstr "no se pudo crear estructura LDAP\n" -#: fe-connect.c:4858 +#: fe-connect.c:4890 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "búsqueda en servidor LDAP falló: %s\n" -#: fe-connect.c:4869 +#: fe-connect.c:4901 msgid "more than one entry found on LDAP lookup\n" msgstr "se encontro más de una entrada en búsqueda LDAP\n" -#: fe-connect.c:4870 fe-connect.c:4882 +#: fe-connect.c:4902 fe-connect.c:4914 msgid "no entry found on LDAP lookup\n" msgstr "no se encontró ninguna entrada en búsqueda LDAP\n" -#: fe-connect.c:4893 fe-connect.c:4906 +#: fe-connect.c:4925 fe-connect.c:4938 msgid "attribute has no values on LDAP lookup\n" msgstr "la búsqueda LDAP entregó atributo sin valores\n" -#: fe-connect.c:4958 fe-connect.c:4977 fe-connect.c:5502 +#: fe-connect.c:4990 fe-connect.c:5009 fe-connect.c:5541 #, c-format msgid "missing \"=\" after \"%s\" in connection info string\n" msgstr "falta «=» después de «%s» en la cadena de información de la conexión\n" -#: fe-connect.c:5050 fe-connect.c:5687 fe-connect.c:6463 +#: fe-connect.c:5082 fe-connect.c:5726 fe-connect.c:6502 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "opción de conexión no válida «%s»\n" -#: fe-connect.c:5066 fe-connect.c:5551 +#: fe-connect.c:5098 fe-connect.c:5590 msgid "unterminated quoted string in connection info string\n" msgstr "cadena de caracteres entre comillas sin terminar en la cadena de información de conexión\n" -#: fe-connect.c:5147 +#: fe-connect.c:5179 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "la definición de servicio «%s» no fue encontrada\n" -#: fe-connect.c:5173 +#: fe-connect.c:5205 #, c-format msgid "service file \"%s\" not found\n" msgstr "el archivo de servicio «%s» no fue encontrado\n" -#: fe-connect.c:5250 fe-connect.c:5294 +#: fe-connect.c:5219 +#, c-format +msgid "line %d too long in service file \"%s\"\n" +msgstr "la línea %d es demasiado larga en archivo de servicio «%s»\n" + +#: fe-connect.c:5290 fe-connect.c:5334 #, c-format msgid "syntax error in service file \"%s\", line %d\n" msgstr "error de sintaxis en archivo de servicio «%s», línea %d\n" -#: fe-connect.c:5261 +#: fe-connect.c:5301 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d\n" msgstr "especificaciones de servicio anidadas no soportadas en archivo de servicio «%s», línea %d\n" -#: fe-connect.c:5983 +#: fe-connect.c:6022 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"\n" msgstr "URI no válida propagada a rutina interna de procesamiento: «%s»\n" -#: fe-connect.c:6060 +#: fe-connect.c:6099 #, c-format msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"\n" msgstr "se encontró el fin de la cadena mientras se buscaba el «]» correspondiente en dirección IPv6 en URI: «%s»\n" -#: fe-connect.c:6067 +#: fe-connect.c:6106 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"\n" msgstr "la dirección IPv6 no puede ser vacía en la URI: «%s»\n" -#: fe-connect.c:6082 +#: fe-connect.c:6121 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" msgstr "carácter «%c» inesperado en la posición %d en URI (se esperaba «:» o «/»): «%s»\n" -#: fe-connect.c:6212 +#: fe-connect.c:6251 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "separador llave/valor «=» extra en parámetro de la URI: «%s»\n" -#: fe-connect.c:6232 +#: fe-connect.c:6271 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "separador llave/valor «=» faltante en parámetro de la URI: «%s»\n" -#: fe-connect.c:6284 +#: fe-connect.c:6323 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "parámetro de URI no válido: «%s»\n" -#: fe-connect.c:6358 +#: fe-connect.c:6397 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "elemento escapado con %% no válido: «%s»\n" -#: fe-connect.c:6368 +#: fe-connect.c:6407 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" msgstr "valor no permitido %%00 en valor escapado con %%: «%s»\n" -#: fe-connect.c:6738 +#: fe-connect.c:6777 msgid "connection pointer is NULL\n" msgstr "el puntero de conexión es NULL\n" -#: fe-connect.c:7018 +#: fe-connect.c:7065 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ADVERTENCIA: El archivo de claves «%s» no es un archivo plano\n" -#: fe-connect.c:7027 +#: fe-connect.c:7074 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "ADVERTENCIA: El archivo de claves «%s» tiene permiso de lectura para el grupo u otros; los permisos deberían ser u=rw (0600) o menos\n" -#: fe-connect.c:7135 +#: fe-connect.c:7182 #, c-format msgid "password retrieved from file \"%s\"\n" msgstr "contraseña obtenida desde el archivo «%s»\n" -#: fe-exec.c:449 fe-exec.c:3222 +#: fe-exec.c:449 fe-exec.c:3300 #, c-format msgid "row number %d is out of range 0..%d" msgstr "el número de fila %d está fuera del rango 0..%d" #: fe-exec.c:510 fe-protocol3.c:219 fe-protocol3.c:244 fe-protocol3.c:273 -#: fe-protocol3.c:291 fe-protocol3.c:371 fe-protocol3.c:743 fe-protocol3.c:975 +#: fe-protocol3.c:291 fe-protocol3.c:371 fe-protocol3.c:743 msgid "out of memory" msgstr "memoria agotada" -#: fe-exec.c:511 fe-protocol3.c:1932 +#: fe-exec.c:511 fe-protocol3.c:1939 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:778 +#: fe-exec.c:792 msgid "write to server failed\n" msgstr "falló escritura al servidor\n" -#: fe-exec.c:850 +#: fe-exec.c:864 msgid "NOTICE" msgstr "AVISO" -#: fe-exec.c:908 +#: fe-exec.c:922 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult no puede soportar un número de tuplas mayor que INT_MAX" -#: fe-exec.c:920 +#: fe-exec.c:934 msgid "size_t overflow" msgstr "desbordamiento de size_t" -#: fe-exec.c:1302 fe-exec.c:1403 fe-exec.c:1452 +#: fe-exec.c:1349 fe-exec.c:1454 fe-exec.c:1503 msgid "command string is a null pointer\n" msgstr "la cadena de orden es un puntero nulo\n" -#: fe-exec.c:1409 fe-exec.c:1458 fe-exec.c:1556 +#: fe-exec.c:1460 fe-exec.c:1509 fe-exec.c:1605 #, c-format msgid "number of parameters must be between 0 and %d\n" msgstr "el número de parámetros debe estar entre 0 y %d\n" -#: fe-exec.c:1446 fe-exec.c:1550 +#: fe-exec.c:1497 fe-exec.c:1599 msgid "statement name is a null pointer\n" msgstr "el nombre de sentencia es un puntero nulo\n" -#: fe-exec.c:1592 +#: fe-exec.c:1641 fe-exec.c:3153 msgid "no connection to the server\n" msgstr "no hay conexión con el servidor\n" -#: fe-exec.c:1601 +#: fe-exec.c:1650 fe-exec.c:3162 msgid "another command is already in progress\n" msgstr "hay otra orden en ejecución\n" -#: fe-exec.c:1630 +#: fe-exec.c:1679 msgid "cannot queue commands during COPY\n" msgstr "no se puede agregar órdenes a la cola mientras se hace COPY\n" -#: fe-exec.c:1748 +#: fe-exec.c:1797 msgid "length must be given for binary parameter\n" msgstr "el largo debe ser especificado para un parámetro binario\n" -#: fe-exec.c:2069 +#: fe-exec.c:2117 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "asyncStatus no esperado: %d\n" -#: fe-exec.c:2089 +#: fe-exec.c:2137 #, c-format msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" msgstr "PGEventProc «%s» falló durante el evento PGEVT_RESULTCREATE\n" -#: fe-exec.c:2237 +#: fe-exec.c:2285 msgid "synchronous command execution functions are not allowed in pipeline mode\n" msgstr "no se permiten funciones que ejecuten órdenes sincrónicas en modo pipeline\n" -#: fe-exec.c:2259 +#: fe-exec.c:2307 msgid "COPY terminated by new PQexec" msgstr "COPY terminado por un nuevo PQexec" -#: fe-exec.c:2276 +#: fe-exec.c:2324 msgid "PQexec not allowed during COPY BOTH\n" msgstr "PQexec no está permitido durante COPY BOTH\n" -#: fe-exec.c:2505 fe-exec.c:2561 fe-exec.c:2630 fe-protocol3.c:1863 +#: fe-exec.c:2552 fe-exec.c:2608 fe-exec.c:2677 fe-protocol3.c:1870 msgid "no COPY in progress\n" msgstr "no hay COPY alguno en ejecución\n" -#: fe-exec.c:2807 +#: fe-exec.c:2854 msgid "PQfn not allowed in pipeline mode\n" msgstr "no se permite PQfn en modo pipeline\n" -#: fe-exec.c:2815 +#: fe-exec.c:2862 msgid "connection in wrong state\n" msgstr "la conexión está en un estado incorrecto\n" -#: fe-exec.c:2859 +#: fe-exec.c:2906 msgid "cannot enter pipeline mode, connection not idle\n" msgstr "no se puede entrar en modo pipeline, la conexión no está inactiva\n" -#: fe-exec.c:2893 fe-exec.c:2910 +#: fe-exec.c:2940 fe-exec.c:2957 msgid "cannot exit pipeline mode with uncollected results\n" msgstr "no se puede salir de modo pipeline al tener resultados sin recolectar\n" -#: fe-exec.c:2898 +#: fe-exec.c:2945 msgid "cannot exit pipeline mode while busy\n" msgstr "no se puede salir de modo pipeline mientras haya actividad\n" -#: fe-exec.c:3040 +#: fe-exec.c:3087 msgid "cannot send pipeline when not in pipeline mode\n" msgstr "no se puede enviar pipeline cuando no se está en modo pipeline\n" -#: fe-exec.c:3111 +#: fe-exec.c:3189 msgid "invalid ExecStatusType code" msgstr "el código de ExecStatusType no es válido" -#: fe-exec.c:3138 +#: fe-exec.c:3216 msgid "PGresult is not an error result\n" msgstr "PGresult no es un resultado de error\n" -#: fe-exec.c:3206 fe-exec.c:3229 +#: fe-exec.c:3284 fe-exec.c:3307 #, c-format msgid "column number %d is out of range 0..%d" msgstr "el número de columna %d está fuera del rango 0..%d" -#: fe-exec.c:3244 +#: fe-exec.c:3322 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "el número de parámetro %d está fuera del rango 0..%d" -#: fe-exec.c:3554 +#: fe-exec.c:3632 #, c-format msgid "could not interpret result from server: %s" msgstr "no se pudo interpretar el resultado del servidor: %s" -#: fe-exec.c:3814 fe-exec.c:3903 +#: fe-exec.c:3892 fe-exec.c:3981 msgid "incomplete multibyte character\n" msgstr "carácter multibyte incompleto\n" -#: fe-gssapi-common.c:123 +#: fe-gssapi-common.c:124 msgid "GSSAPI name import error" msgstr "error de importación de nombre de GSSAPI" @@ -878,85 +897,85 @@ msgstr "datos insuficientes en el mensaje «D»" msgid "unexpected field count in \"D\" message" msgstr "cantidad de campos inesperada en mensaje «D»" -#: fe-protocol3.c:1029 +#: fe-protocol3.c:1036 msgid "no error message available\n" msgstr "no hay mensaje de error disponible\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1077 fe-protocol3.c:1096 +#: fe-protocol3.c:1084 fe-protocol3.c:1103 #, c-format msgid " at character %s" msgstr " en el carácter %s" -#: fe-protocol3.c:1109 +#: fe-protocol3.c:1116 #, c-format msgid "DETAIL: %s\n" msgstr "DETALLE: %s\n" -#: fe-protocol3.c:1112 +#: fe-protocol3.c:1119 #, c-format msgid "HINT: %s\n" msgstr "SUGERENCIA: %s\n" -#: fe-protocol3.c:1115 +#: fe-protocol3.c:1122 #, c-format msgid "QUERY: %s\n" msgstr "CONSULTA: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1129 #, c-format msgid "CONTEXT: %s\n" msgstr "CONTEXTO: %s\n" -#: fe-protocol3.c:1131 +#: fe-protocol3.c:1138 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "NOMBRE DE ESQUEMA: %s\n" -#: fe-protocol3.c:1135 +#: fe-protocol3.c:1142 #, c-format msgid "TABLE NAME: %s\n" msgstr "NOMBRE DE TABLA: %s\n" -#: fe-protocol3.c:1139 +#: fe-protocol3.c:1146 #, c-format msgid "COLUMN NAME: %s\n" msgstr "NOMBRE DE COLUMNA: %s\n" -#: fe-protocol3.c:1143 +#: fe-protocol3.c:1150 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "NOMBRE TIPO DE DATO: %s\n" -#: fe-protocol3.c:1147 +#: fe-protocol3.c:1154 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "NOMBRE DE RESTRICCIÓN: %s\n" -#: fe-protocol3.c:1159 +#: fe-protocol3.c:1166 msgid "LOCATION: " msgstr "UBICACIÓN: " -#: fe-protocol3.c:1161 +#: fe-protocol3.c:1168 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1163 +#: fe-protocol3.c:1170 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1358 +#: fe-protocol3.c:1365 #, c-format msgid "LINE %d: " msgstr "LÍNEA %d: " -#: fe-protocol3.c:1757 +#: fe-protocol3.c:1764 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline: no se está haciendo COPY OUT de texto\n" -#: fe-protocol3.c:2123 +#: fe-protocol3.c:2130 #, c-format msgid "protocol error: id=0x%x\n" msgstr "error de protocolo: id=0x%x\n" @@ -1183,7 +1202,7 @@ msgstr "código de error SSL no reportado" msgid "SSL error code %lu" msgstr "código de error SSL %lu" -#: fe-secure-openssl.c:1777 +#: fe-secure-openssl.c:1778 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "ADVERTENCIA: sslpassword truncada\n" @@ -1203,113 +1222,110 @@ msgstr "no se pudo enviar datos al servidor: %s\n" msgid "unrecognized socket error: 0x%08X/%d" msgstr "código de error de socket no reconocido: 0x%08X/%d" -#~ msgid "invalid channel_binding value: \"%s\"\n" -#~ msgstr "valor cidr no válido: «%s»\n" - -#~ msgid "invalid ssl_min_protocol_version value: \"%s\"\n" -#~ msgstr "valor sslmode no válido: «%s»\n" - -#~ msgid "invalid ssl_max_protocol_version value: \"%s\"\n" -#~ msgstr "valor sslmode no válido: «%s»\n" - -#~ msgid "invalid gssencmode value: \"%s\"\n" -#~ msgstr "valor gssencmode no válido: «%s»\n" - -#~ msgid "invalid target_session_attrs value: \"%s\"\n" -#~ msgstr "valor para target_session_attrs no válido: «%s»\n" - -#~ msgid "" -#~ "could not connect to server: %s\n" -#~ "\tIs the server running on host \"%s\" (%s) and accepting\n" -#~ "\tTCP/IP connections on port %s?\n" -#~ msgstr "" -#~ "no se pudo conectar con el servidor: %s\n" -#~ "\t¿Está el servidor en ejecución en el servidor «%s» (%s) y aceptando\n" -#~ "\tconexiones TCP/IP en el puerto %s?\n" - -#~ msgid "setsockopt(%s) failed: %s\n" -#~ msgstr "setsockopt(%s) falló: %s\n" - -#~ msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" -#~ msgstr "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" - -#~ msgid "could not make a writable connection to server \"%s:%s\"\n" -#~ msgstr "no se pudo establecer una conexión de escritura al servidor: «%s:%s»\n" - -#~ msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" -#~ msgstr "la prueba «SHOW transaction_read_only» falló en el servidor «%s:%s»\n" - -#~ msgid "line %d too long in service file \"%s\"\n" -#~ msgstr "la línea %d es demasiado larga en archivo de servicio «%s»\n" - -#~ msgid "function requires at least protocol version 3.0\n" -#~ msgstr "la función requiere protocolo 3.0 o superior\n" - #~ msgid "COPY IN state must be terminated first\n" #~ msgstr "el estado COPY IN debe ser terminado primero\n" #~ msgid "COPY OUT state must be terminated first\n" #~ msgstr "el estado COPY OUT debe ser terminado primero\n" -#~ msgid "cannot determine OID of function lo_truncate\n" -#~ msgstr "no se puede determinar el OID de la función lo_truncate\n" +#~ msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" +#~ msgstr "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" -#~ msgid "cannot determine OID of function lo_truncate64\n" -#~ msgstr "no se puede determinar el OID de la función lo_truncate64\n" +#~ msgid "cannot determine OID of function lo_creat\n" +#~ msgstr "no se puede determinar el OID de la función lo_creat\n" + +#~ msgid "cannot determine OID of function lo_create\n" +#~ msgstr "no se puede determinar el OID de la función lo_create\n" + +#~ msgid "cannot determine OID of function lo_lseek\n" +#~ msgstr "no se puede determinar el OID de la función lo_lseek\n" #~ msgid "cannot determine OID of function lo_lseek64\n" #~ msgstr "no se puede determinar el OID de la función lo_lseek64\n" -#~ msgid "cannot determine OID of function lo_create\n" -#~ msgstr "no se puede determinar el OID de la función lo_create\n" +#~ msgid "cannot determine OID of function lo_open\n" +#~ msgstr "no se puede determinar el OID de la función lo_open\n" #~ msgid "cannot determine OID of function lo_tell64\n" #~ msgstr "no se puede determinar el OID de la función lo_tell64\n" -#~ msgid "cannot determine OID of function lo_open\n" -#~ msgstr "no se puede determinar el OID de la función lo_open\n" +#~ msgid "cannot determine OID of function lo_truncate\n" +#~ msgstr "no se puede determinar el OID de la función lo_truncate\n" -#~ msgid "cannot determine OID of function lo_creat\n" -#~ msgstr "no se puede determinar el OID de la función lo_creat\n" +#~ msgid "cannot determine OID of function lo_truncate64\n" +#~ msgstr "no se puede determinar el OID de la función lo_truncate64\n" #~ msgid "cannot determine OID of function lo_unlink\n" #~ msgstr "no se puede determinar el OID de la función lo_unlink\n" -#~ msgid "cannot determine OID of function lo_lseek\n" -#~ msgstr "no se puede determinar el OID de la función lo_lseek\n" - #~ msgid "cannot determine OID of function loread\n" #~ msgstr "no se puede determinar el OID de la función loread\n" #~ msgid "cannot determine OID of function lowrite\n" #~ msgstr "no se puede determinar el OID de la función lowrite\n" -#~ msgid "select() failed: %s\n" -#~ msgstr "select() fallida: %s\n" +#~ msgid "" +#~ "could not connect to server: %s\n" +#~ "\tIs the server running on host \"%s\" (%s) and accepting\n" +#~ "\tTCP/IP connections on port %s?\n" +#~ msgstr "" +#~ "no se pudo conectar con el servidor: %s\n" +#~ "\t¿Está el servidor en ejecución en el servidor «%s» (%s) y aceptando\n" +#~ "\tconexiones TCP/IP en el puerto %s?\n" + +#~ msgid "could not make a writable connection to server \"%s:%s\"\n" +#~ msgstr "no se pudo establecer una conexión de escritura al servidor: «%s:%s»\n" + +#~ msgid "extraneous data in \"D\" message" +#~ msgstr "datos ininteligibles en mensaje «D»" + +#~ msgid "extraneous data in \"T\" message" +#~ msgstr "datos ininteligibles en mensaje «T»" + +#~ msgid "extraneous data in \"t\" message" +#~ msgstr "datos ininteligibles en mensaje «t»" + +#~ msgid "function requires at least protocol version 3.0\n" +#~ msgstr "la función requiere protocolo 3.0 o superior\n" + +#~ msgid "invalid channel_binding value: \"%s\"\n" +#~ msgstr "valor cidr no válido: «%s»\n" + +#~ msgid "invalid gssencmode value: \"%s\"\n" +#~ msgstr "valor gssencmode no válido: «%s»\n" #~ msgid "invalid setenv state %c, probably indicative of memory corruption\n" #~ msgstr "el estado de setenv %c no es válido, probablemente por corrupción de memoria\n" +#~ msgid "invalid ssl_max_protocol_version value: \"%s\"\n" +#~ msgstr "valor sslmode no válido: «%s»\n" + +#~ msgid "invalid ssl_min_protocol_version value: \"%s\"\n" +#~ msgstr "valor sslmode no válido: «%s»\n" + #~ msgid "invalid state %c, probably indicative of memory corruption\n" #~ msgstr "el estado %c no es válido, probablemente por corrupción de memoria\n" -#~ msgid "unexpected character %c following empty query response (\"I\" message)" -#~ msgstr "carácter %c no esperado, siguiendo una respuesta de consulta vacía (mensaje «I»)" +#~ msgid "invalid target_session_attrs value: \"%s\"\n" +#~ msgstr "valor para target_session_attrs no válido: «%s»\n" -#~ msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" -#~ msgstr "el servidor envió datos (mensaje «D») sin precederlos con una descripción de fila (mensaje «T»)" +#~ msgid "lost synchronization with server, resetting connection" +#~ msgstr "se perdió la sincronía con el servidor, reseteando la conexión" + +#~ msgid "select() failed: %s\n" +#~ msgstr "select() fallida: %s\n" #~ msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" #~ msgstr "el servidor envió datos binarios (mensaje «B») sin precederlos con una description de fila (mensaje «T»)" -#~ msgid "lost synchronization with server, resetting connection" -#~ msgstr "se perdió la sincronía con el servidor, reseteando la conexión" +#~ msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" +#~ msgstr "el servidor envió datos (mensaje «D») sin precederlos con una descripción de fila (mensaje «T»)" -#~ msgid "extraneous data in \"T\" message" -#~ msgstr "datos ininteligibles en mensaje «T»" +#~ msgid "setsockopt(%s) failed: %s\n" +#~ msgstr "setsockopt(%s) falló: %s\n" -#~ msgid "extraneous data in \"t\" message" -#~ msgstr "datos ininteligibles en mensaje «t»" +#~ msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" +#~ msgstr "la prueba «SHOW transaction_read_only» falló en el servidor «%s:%s»\n" -#~ msgid "extraneous data in \"D\" message" -#~ msgstr "datos ininteligibles en mensaje «D»" +#~ msgid "unexpected character %c following empty query response (\"I\" message)" +#~ msgstr "carácter %c no esperado, siguiendo una respuesta de consulta vacía (mensaje «I»)" diff --git a/src/interfaces/libpq/po/fr.po b/src/interfaces/libpq/po/fr.po index 890949e3c0..1a7f5203b7 100644 --- a/src/interfaces/libpq/po/fr.po +++ b/src/interfaces/libpq/po/fr.po @@ -1,115 +1,141 @@ -# translation of libpq.po to fr_fr -# french message translation file for libpq +# LANGUAGE message translation file for libpq +# Copyright (C) 2004-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the libpq (PostgreSQL) package. # # Use these quotes: « %s » # # Guillaume Lelarge , 2004-2009. # Stéphane Schildknecht , 2009. +# Guillaume Lelarge , 2010-2009. +# msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-06-14 06:09+0000\n" -"PO-Revision-Date: 2021-06-14 16:10+0200\n" +"POT-Creation-Date: 2022-05-14 10:10+0000\n" +"PO-Revision-Date: 2022-05-14 17:15+0200\n" "Last-Translator: Guillaume Lelarge \n" -"Language-Team: PostgreSQLfr \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.3\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" + +#: ../../port/thread.c:100 ../../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "n'a pas pu rechercher l'identifiant de l'utilisateur local %d : %s" + +#: ../../port/thread.c:105 ../../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "l'utilisateur local dont l'identifiant est %d n'existe pas" -#: fe-auth-scram.c:213 +#: fe-auth-scram.c:231 msgid "malformed SCRAM message (empty message)\n" msgstr "message SCRAM malformé (message vide)\n" -#: fe-auth-scram.c:219 +#: fe-auth-scram.c:237 msgid "malformed SCRAM message (length mismatch)\n" msgstr "message SCRAM malformé (pas de correspondance sur la longueur)\n" -#: fe-auth-scram.c:263 -msgid "could not verify server signature\n" -msgstr "n'a pas pu vérifier la signature du serveur\n" +#: fe-auth-scram.c:281 +#, c-format +msgid "could not verify server signature: %s\n" +msgstr "n'a pas pu vérifier la signature du serveur : %s\n" -#: fe-auth-scram.c:270 +#: fe-auth-scram.c:288 msgid "incorrect server signature\n" msgstr "signature invalide du serveur\n" -#: fe-auth-scram.c:279 +#: fe-auth-scram.c:297 msgid "invalid SCRAM exchange state\n" msgstr "état d'échange SCRAM invalide\n" -#: fe-auth-scram.c:306 +#: fe-auth-scram.c:324 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)\n" msgstr "message SCRAM malformé (attribut « %c » attendu)\n" -#: fe-auth-scram.c:315 +#: fe-auth-scram.c:333 #, c-format msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" msgstr "message SCRAM malformé (caractère « = » attendu pour l'attribut « %c »)\n" -#: fe-auth-scram.c:356 +#: fe-auth-scram.c:374 msgid "could not generate nonce\n" msgstr "n'a pas pu générer le nonce\n" -#: fe-auth-scram.c:366 fe-auth-scram.c:441 fe-auth-scram.c:595 -#: fe-auth-scram.c:616 fe-auth-scram.c:642 fe-auth-scram.c:657 -#: fe-auth-scram.c:707 fe-auth-scram.c:746 fe-auth.c:290 fe-auth.c:362 -#: fe-auth.c:398 fe-auth.c:615 fe-auth.c:774 fe-auth.c:1132 fe-auth.c:1282 -#: fe-connect.c:912 fe-connect.c:1456 fe-connect.c:1625 fe-connect.c:2977 -#: fe-connect.c:4658 fe-connect.c:4919 fe-connect.c:5038 fe-connect.c:5282 -#: fe-connect.c:5364 fe-connect.c:5463 fe-connect.c:5719 fe-connect.c:5748 -#: fe-connect.c:5820 fe-connect.c:5844 fe-connect.c:5862 fe-connect.c:5963 -#: fe-connect.c:5972 fe-connect.c:6330 fe-connect.c:6480 fe-exec.c:1209 -#: fe-exec.c:3002 fe-exec.c:3154 fe-exec.c:3927 fe-exec.c:4092 -#: fe-gssapi-common.c:110 fe-lobj.c:881 fe-protocol3.c:1016 fe-protocol3.c:1724 -#: fe-secure-common.c:110 fe-secure-gssapi.c:504 fe-secure-openssl.c:440 -#: fe-secure-openssl.c:1133 +#: fe-auth-scram.c:384 fe-auth-scram.c:459 fe-auth-scram.c:615 +#: fe-auth-scram.c:636 fe-auth-scram.c:662 fe-auth-scram.c:677 +#: fe-auth-scram.c:727 fe-auth-scram.c:766 fe-auth.c:290 fe-auth.c:362 +#: fe-auth.c:398 fe-auth.c:623 fe-auth.c:799 fe-auth.c:1152 fe-auth.c:1322 +#: fe-connect.c:907 fe-connect.c:1456 fe-connect.c:1625 fe-connect.c:2977 +#: fe-connect.c:4824 fe-connect.c:5085 fe-connect.c:5204 fe-connect.c:5456 +#: fe-connect.c:5537 fe-connect.c:5636 fe-connect.c:5892 fe-connect.c:5921 +#: fe-connect.c:5993 fe-connect.c:6017 fe-connect.c:6035 fe-connect.c:6136 +#: fe-connect.c:6145 fe-connect.c:6503 fe-connect.c:6653 fe-connect.c:6919 +#: fe-exec.c:710 fe-exec.c:976 fe-exec.c:1324 fe-exec.c:3135 fe-exec.c:3318 +#: fe-exec.c:4096 fe-exec.c:4261 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:985 fe-protocol3.c:1000 fe-protocol3.c:1033 +#: fe-protocol3.c:1741 fe-protocol3.c:2144 fe-secure-common.c:112 +#: fe-secure-gssapi.c:504 fe-secure-openssl.c:449 fe-secure-openssl.c:1261 msgid "out of memory\n" msgstr "mémoire épuisée\n" -#: fe-auth-scram.c:374 +#: fe-auth-scram.c:392 msgid "could not encode nonce\n" msgstr "n'a pas pu encoder le nonce\n" -#: fe-auth-scram.c:563 -msgid "could not calculate client proof\n" -msgstr "n'a pas pu calculer la preuve du client\n" +#: fe-auth-scram.c:582 +#, c-format +msgid "could not calculate client proof: %s\n" +msgstr "n'a pas pu calculer la preuve du client : %s\n" -#: fe-auth-scram.c:579 +#: fe-auth-scram.c:599 msgid "could not encode client proof\n" msgstr "n'a pas pu encoder la preuve du client\n" -#: fe-auth-scram.c:634 +#: fe-auth-scram.c:654 msgid "invalid SCRAM response (nonce mismatch)\n" msgstr "réponse SCRAM invalide (pas de correspondance sur nonce)\n" -#: fe-auth-scram.c:667 +#: fe-auth-scram.c:687 msgid "malformed SCRAM message (invalid salt)\n" msgstr "message SCRAM malformé (sel invalide)\n" -#: fe-auth-scram.c:681 +#: fe-auth-scram.c:701 msgid "malformed SCRAM message (invalid iteration count)\n" msgstr "message SCRAM malformé (décompte d'itération invalide)\n" -#: fe-auth-scram.c:687 +#: fe-auth-scram.c:707 msgid "malformed SCRAM message (garbage at end of server-first-message)\n" msgstr "message SCRAM malformé (problème à la fin du server-first-message)\n" -#: fe-auth-scram.c:723 +#: fe-auth-scram.c:743 #, c-format msgid "error received from server in SCRAM exchange: %s\n" msgstr "réception d'une erreur du serveur dans l'échange SCRAM : %s\n" -#: fe-auth-scram.c:739 +#: fe-auth-scram.c:759 msgid "malformed SCRAM message (garbage at end of server-final-message)\n" msgstr "message SCRAM malformé (problème à la fin du server-final-message)\n" -#: fe-auth-scram.c:758 +#: fe-auth-scram.c:778 msgid "malformed SCRAM message (invalid server signature)\n" msgstr "message SCRAM malformé (signature serveur invalide)\n" +#: fe-auth-scram.c:934 fe-exec.c:527 fe-protocol3.c:219 fe-protocol3.c:244 +#: fe-protocol3.c:273 fe-protocol3.c:291 fe-protocol3.c:372 fe-protocol3.c:745 +msgid "out of memory" +msgstr "mémoire épuisée" + +#: fe-auth-scram.c:943 +msgid "failed to generate random salt" +msgstr "a échoué à générer le sel aléatoire" + #: fe-auth.c:76 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)\n" @@ -119,7 +145,8 @@ msgstr "mémoire épuisée lors de l'allocation du tampon GSSAPI (%d)\n" msgid "GSSAPI continuation error" msgstr "erreur de suite GSSAPI" -#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:97 fe-secure-common.c:98 +#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:98 fe-secure-common.c:100 +#: fe-secure-common.c:177 msgid "host name must be specified\n" msgstr "le nom d'hôte doit être précisé\n" @@ -142,7 +169,7 @@ msgstr "requête d'authentification SSPI dupliquée\n" #: fe-auth.c:377 msgid "could not acquire SSPI credentials" -msgstr "n'a pas pu récupérer les pièces d'identité SSPI" +msgstr "n'a pas pu obtenir les pièces d'identité SSPI" #: fe-auth.c:433 msgid "channel binding required, but SSL not in use\n" @@ -152,99 +179,98 @@ msgstr "lien de canal requis, mais SSL non utilisé\n" msgid "duplicate SASL authentication request\n" msgstr "requête d'authentification SASL dupliquée\n" -#: fe-auth.c:496 +#: fe-auth.c:499 msgid "channel binding is required, but client does not support it\n" msgstr "le lien de canal SCRAM est requis mais le client ne supporte par cette option\n" -#: fe-auth.c:513 +#: fe-auth.c:516 msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" msgstr "le serveur a proposé une authentification SCRAM-SHA-256-PLUS sur une connexion non SSL\n" -#: fe-auth.c:525 +#: fe-auth.c:531 msgid "none of the server's SASL authentication mechanisms are supported\n" msgstr "" "authentification Kerberos 4 non supportée\n" "aucun des mécanismes d'authentification SASL du serveur n'est supporté\n" -#: fe-auth.c:533 +#: fe-auth.c:539 msgid "channel binding is required, but server did not offer an authentication method that supports channel binding\n" msgstr "Lien de canal requis, mais le serveur ne propose pas de méthode d'authentification le supportant\n" -#: fe-auth.c:639 +#: fe-auth.c:647 #, c-format msgid "out of memory allocating SASL buffer (%d)\n" msgstr "mémoire épuisée lors de l'allocation du tampon SASL (%d)\n" -#: fe-auth.c:664 +#: fe-auth.c:672 msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed\n" msgstr "AuthenticationSASLFinal reçu du serveur mais l'authentification SASL n'a pas été terminée\n" -#: fe-auth.c:741 +#: fe-auth.c:683 +msgid "no client response found after SASL exchange success\n" +msgstr "aucune réponse client trouvée après le succès de l'échange SASL\n" + +#: fe-auth.c:765 msgid "SCM_CRED authentication method not supported\n" msgstr "authentification SCM_CRED non supportée\n" -#: fe-auth.c:836 +#: fe-auth.c:809 fe-auth.c:818 fe-auth.c:1301 fe-auth.c:1314 +#, c-format +msgid "could not encrypt password: %s\n" +msgstr "n'a pas pu chiffré le mot de passe : %s\n" + +#: fe-auth.c:868 msgid "channel binding required, but server authenticated client without channel binding\n" msgstr "lien de canal requis, mais le serveur a authentifié le client sans lien de canal\n" -#: fe-auth.c:842 +#: fe-auth.c:874 msgid "channel binding required but not supported by server's authentication request\n" msgstr "lien de canal requis, mais non supporté par la requête d'authentification du serveur\n" -#: fe-auth.c:877 +#: fe-auth.c:909 msgid "Kerberos 4 authentication not supported\n" msgstr "authentification Kerberos 4 non supportée\n" -#: fe-auth.c:882 +#: fe-auth.c:914 msgid "Kerberos 5 authentication not supported\n" msgstr "authentification Kerberos 5 non supportée\n" -#: fe-auth.c:953 +#: fe-auth.c:985 msgid "GSSAPI authentication not supported\n" msgstr "authentification GSSAPI non supportée\n" -#: fe-auth.c:985 +#: fe-auth.c:1017 msgid "SSPI authentication not supported\n" msgstr "authentification SSPI non supportée\n" -#: fe-auth.c:993 +#: fe-auth.c:1025 msgid "Crypt authentication not supported\n" msgstr "authentification crypt non supportée\n" -#: fe-auth.c:1060 +#: fe-auth.c:1092 #, c-format msgid "authentication method %u not supported\n" msgstr "méthode d'authentification %u non supportée\n" -#: fe-auth.c:1107 +#: fe-auth.c:1138 #, c-format msgid "user name lookup failure: error code %lu\n" -msgstr "échec de la recherche du nom d'utilisateur : code erreur %lu\n" - -#: fe-auth.c:1117 fe-connect.c:2852 -#, c-format -msgid "could not look up local user ID %d: %s\n" -msgstr "n'a pas pu rechercher l'identifiant de l'utilisateur local %d : %s\n" - -#: fe-auth.c:1122 fe-connect.c:2857 -#, c-format -msgid "local user with ID %d does not exist\n" -msgstr "l'utilisateur local dont l'identifiant est %d n'existe pas\n" +msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu\n" -#: fe-auth.c:1226 +#: fe-auth.c:1264 msgid "unexpected shape of result set returned for SHOW\n" msgstr "forme du résultat inattendu pour SHOW\n" -#: fe-auth.c:1235 +#: fe-auth.c:1273 msgid "password_encryption value too long\n" msgstr "la valeur de password_encryption est trop longue\n" -#: fe-auth.c:1275 +#: fe-auth.c:1327 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" msgstr "algorithme de chiffrement du mot de passe « %s » non reconnu\n" -#: fe-connect.c:1095 +#: fe-connect.c:1090 #, c-format msgid "could not match %d host names to %d hostaddr values\n" msgstr "n'a pas pu faire correspondre les %d noms d'hôte aux %d valeurs hostaddr\n" @@ -307,87 +333,87 @@ msgstr "\tLe serveur est-il actif sur cet hôte et accepte-t-il les connexions ? msgid "invalid integer value \"%s\" for connection option \"%s\"\n" msgstr "valeur entière « %s » invalide pour l'option de connexion « %s »\n" -#: fe-connect.c:1866 fe-connect.c:1901 fe-connect.c:1937 fe-connect.c:2026 -#: fe-connect.c:2640 +#: fe-connect.c:1866 fe-connect.c:1901 fe-connect.c:1937 fe-connect.c:2037 +#: fe-connect.c:2651 #, c-format msgid "%s(%s) failed: %s\n" msgstr "échec de %s(%s) : %s\n" -#: fe-connect.c:1991 +#: fe-connect.c:2002 #, c-format msgid "%s(%s) failed: error code %d\n" msgstr "échec de %s(%s) : code d'erreur %d\n" -#: fe-connect.c:2306 +#: fe-connect.c:2317 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "état de connexion invalide, indique probablement une corruption de mémoire\n" -#: fe-connect.c:2385 +#: fe-connect.c:2396 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "numéro de port invalide : « %s »\n" -#: fe-connect.c:2401 +#: fe-connect.c:2412 #, c-format msgid "could not translate host name \"%s\" to address: %s\n" msgstr "n'a pas pu traduire le nom d'hôte « %s » en adresse : %s\n" -#: fe-connect.c:2414 +#: fe-connect.c:2425 #, c-format msgid "could not parse network address \"%s\": %s\n" msgstr "n'a pas pu analyser l'adresse réseau « %s » : %s\n" -#: fe-connect.c:2427 +#: fe-connect.c:2438 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" msgstr "Le chemin du socket de domaine Unix, « %s », est trop (maximum %d octets)\n" -#: fe-connect.c:2442 +#: fe-connect.c:2453 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" msgstr "" "n'a pas pu traduire le chemin de la socket du domaine Unix « %s » en adresse :\n" "%s\n" -#: fe-connect.c:2568 +#: fe-connect.c:2579 #, c-format msgid "could not create socket: %s\n" msgstr "n'a pas pu créer la socket : %s\n" -#: fe-connect.c:2599 +#: fe-connect.c:2610 #, c-format msgid "could not set socket to nonblocking mode: %s\n" msgstr "n'a pas pu activer le mode non-bloquant pour la socket : %s\n" -#: fe-connect.c:2609 +#: fe-connect.c:2620 #, c-format msgid "could not set socket to close-on-exec mode: %s\n" msgstr "n'a pas pu paramétrer la socket en mode close-on-exec : %s\n" -#: fe-connect.c:2627 +#: fe-connect.c:2638 msgid "keepalives parameter must be an integer\n" msgstr "le paramètre keepalives doit être un entier\n" -#: fe-connect.c:2768 +#: fe-connect.c:2779 #, c-format msgid "could not get socket error status: %s\n" msgstr "n'a pas pu déterminer le statut d'erreur de la socket : %s\n" -#: fe-connect.c:2796 +#: fe-connect.c:2807 #, c-format msgid "could not get client address from socket: %s\n" msgstr "n'a pas pu obtenir l'adresse du client depuis la socket : %s\n" -#: fe-connect.c:2838 +#: fe-connect.c:2846 msgid "requirepeer parameter is not supported on this platform\n" msgstr "le paramètre requirepeer n'est pas supporté sur cette plateforme\n" -#: fe-connect.c:2841 +#: fe-connect.c:2849 #, c-format msgid "could not get peer credentials: %s\n" msgstr "n'a pas pu obtenir l'authentification de l'autre : %s\n" -#: fe-connect.c:2865 +#: fe-connect.c:2863 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" msgstr "requirepeer indique « %s » mais le nom de l'utilisateur réel est « %s »\n" @@ -420,203 +446,211 @@ msgstr "le serveur ne supporte pas SSL alors que SSL était réclamé\n" msgid "received invalid response to SSL negotiation: %c\n" msgstr "a reçu une réponse invalide à la négociation SSL : %c\n" -#: fe-connect.c:3182 +#: fe-connect.c:3114 +msgid "received unencrypted data after SSL response\n" +msgstr "a reçu des données non chiffrées après la réponse SSL\n" + +#: fe-connect.c:3195 msgid "server doesn't support GSSAPI encryption, but it was required\n" msgstr "le serveur ne supporte pas le chiffrage GSSAPI alors qu'il était réclamé\n" -#: fe-connect.c:3194 +#: fe-connect.c:3207 #, c-format msgid "received invalid response to GSSAPI negotiation: %c\n" msgstr "a reçu une réponse invalide à la négociation GSSAPI : %c\n" -#: fe-connect.c:3260 fe-connect.c:3285 +#: fe-connect.c:3226 +msgid "received unencrypted data after GSSAPI encryption response\n" +msgstr "a reçu des données non chiffrées après la réponse de chiffrement GSSAPI\n" + +#: fe-connect.c:3286 fe-connect.c:3311 #, c-format msgid "expected authentication request from server, but received %c\n" msgstr "" "attendait une requête d'authentification en provenance du serveur, mais a\n" " reçu %c\n" -#: fe-connect.c:3492 +#: fe-connect.c:3518 msgid "unexpected message from server during startup\n" msgstr "message inattendu du serveur lors du démarrage\n" -#: fe-connect.c:3584 +#: fe-connect.c:3610 msgid "session is read-only\n" msgstr "la session est en lecture seule\n" -#: fe-connect.c:3587 +#: fe-connect.c:3613 msgid "session is not read-only\n" msgstr "la session n'est pas en lecture seule\n" -#: fe-connect.c:3641 +#: fe-connect.c:3667 msgid "server is in hot standby mode\n" msgstr "le serveur est dans le mode hot standby\n" -#: fe-connect.c:3644 +#: fe-connect.c:3670 msgid "server is not in hot standby mode\n" msgstr "le serveur n'est pas dans le mode hot standby\n" -#: fe-connect.c:3755 fe-connect.c:3807 +#: fe-connect.c:3788 fe-connect.c:3840 #, c-format msgid "\"%s\" failed\n" msgstr "échec de « %s »\n" -#: fe-connect.c:3821 +#: fe-connect.c:3854 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption\n" msgstr "" "état de connexion invalide (%d), indiquant probablement une corruption de\n" " mémoire\n" -#: fe-connect.c:4267 fe-connect.c:4327 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "échec de PGEventProc « %s » lors de l'événement PGEVT_CONNRESET\n" - -#: fe-connect.c:4671 +#: fe-connect.c:4837 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" msgstr "URL LDAP « %s » invalide : le schéma doit être ldap://\n" -#: fe-connect.c:4686 +#: fe-connect.c:4852 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" msgstr "URL LDAP « %s » invalide : le « distinguished name » manque\n" -#: fe-connect.c:4698 fe-connect.c:4756 +#: fe-connect.c:4864 fe-connect.c:4922 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" msgstr "URL LDAP « %s » invalide : doit avoir exactement un attribut\n" -#: fe-connect.c:4710 fe-connect.c:4772 +#: fe-connect.c:4876 fe-connect.c:4938 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" msgstr "URL LDAP « %s » invalide : doit avoir une échelle de recherche (base/un/sous)\n" -#: fe-connect.c:4722 +#: fe-connect.c:4888 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "URL LDAP « %s » invalide : aucun filtre\n" -#: fe-connect.c:4744 +#: fe-connect.c:4910 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" msgstr "URL LDAP « %s » invalide : numéro de port invalide\n" -#: fe-connect.c:4782 +#: fe-connect.c:4948 msgid "could not create LDAP structure\n" msgstr "n'a pas pu créer la structure LDAP\n" -#: fe-connect.c:4858 +#: fe-connect.c:5024 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "échec de la recherche sur le serveur LDAP : %s\n" -#: fe-connect.c:4869 +#: fe-connect.c:5035 msgid "more than one entry found on LDAP lookup\n" msgstr "plusieurs entrées trouvées pendant la recherche LDAP\n" -#: fe-connect.c:4870 fe-connect.c:4882 +#: fe-connect.c:5036 fe-connect.c:5048 msgid "no entry found on LDAP lookup\n" msgstr "aucune entrée trouvée pendant la recherche LDAP\n" -#: fe-connect.c:4893 fe-connect.c:4906 +#: fe-connect.c:5059 fe-connect.c:5072 msgid "attribute has no values on LDAP lookup\n" msgstr "l'attribut n'a pas de valeur après la recherche LDAP\n" -#: fe-connect.c:4958 fe-connect.c:4977 fe-connect.c:5502 +#: fe-connect.c:5124 fe-connect.c:5143 fe-connect.c:5675 #, c-format msgid "missing \"=\" after \"%s\" in connection info string\n" msgstr "« = » manquant après « %s » dans la chaîne des paramètres de connexion\n" -#: fe-connect.c:5050 fe-connect.c:5687 fe-connect.c:6463 +#: fe-connect.c:5216 fe-connect.c:5860 fe-connect.c:6636 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "option de connexion « %s » invalide\n" -#: fe-connect.c:5066 fe-connect.c:5551 +#: fe-connect.c:5232 fe-connect.c:5724 msgid "unterminated quoted string in connection info string\n" msgstr "guillemets non refermés dans la chaîne des paramètres de connexion\n" -#: fe-connect.c:5147 +#: fe-connect.c:5313 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "définition du service « %s » introuvable\n" -#: fe-connect.c:5173 +#: fe-connect.c:5339 #, c-format msgid "service file \"%s\" not found\n" msgstr "fichier de service « %s » introuvable\n" -#: fe-connect.c:5250 fe-connect.c:5294 +#: fe-connect.c:5353 +#, c-format +msgid "line %d too long in service file \"%s\"\n" +msgstr "ligne %d trop longue dans le fichier service « %s »\n" + +#: fe-connect.c:5424 fe-connect.c:5468 #, c-format msgid "syntax error in service file \"%s\", line %d\n" msgstr "erreur de syntaxe dans le fichier service « %s », ligne %d\n" -#: fe-connect.c:5261 +#: fe-connect.c:5435 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d\n" msgstr "spécifications imbriquées de service non supportées dans le fichier service « %s », ligne %d\n" -#: fe-connect.c:5983 +#: fe-connect.c:6156 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"\n" msgstr "URI invalide propagée à la routine d'analyse interne : « %s »\n" -#: fe-connect.c:6060 +#: fe-connect.c:6233 #, c-format msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"\n" msgstr "" "fin de chaîne atteinte lors de la recherche du « ] » correspondant dans\n" "l'adresse IPv6 de l'hôte indiquée dans l'URI : « %s »\n" -#: fe-connect.c:6067 +#: fe-connect.c:6240 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"\n" msgstr "l'adresse IPv6 de l'hôte ne peut pas être vide dans l'URI : « %s »\n" -#: fe-connect.c:6082 +#: fe-connect.c:6255 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" msgstr "" "caractère « %c » inattendu à la position %d de l'URI (caractère « : » ou\n" "« / » attendu) : « %s »\n" -#: fe-connect.c:6212 +#: fe-connect.c:6385 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "séparateur « = » de clé/valeur en trop dans le paramètre de requête URI : « %s »\n" -#: fe-connect.c:6232 +#: fe-connect.c:6405 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "séparateur « = » de clé/valeur manquant dans le paramètre de requête URI : « %s »\n" -#: fe-connect.c:6284 +#: fe-connect.c:6457 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "paramètre de la requête URI invalide : « %s »\n" -#: fe-connect.c:6358 +#: fe-connect.c:6531 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "jeton encodé en pourcentage invalide : « %s »\n" -#: fe-connect.c:6368 +#: fe-connect.c:6541 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" msgstr "valeur %%00 interdite dans la valeur codée en pourcentage : « %s »\n" -#: fe-connect.c:6738 +#: fe-connect.c:6911 msgid "connection pointer is NULL\n" msgstr "le pointeur de connexion est NULL\n" -#: fe-connect.c:7018 +#: fe-connect.c:7199 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ATTENTION : le fichier de mots de passe « %s » n'est pas un fichier texte\n" -#: fe-connect.c:7027 +#: fe-connect.c:7208 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "" @@ -624,155 +658,149 @@ msgstr "" "lecture pour le groupe ou universel ; les droits devraient être u=rw (0600)\n" "ou inférieur\n" -#: fe-connect.c:7135 +#: fe-connect.c:7316 #, c-format msgid "password retrieved from file \"%s\"\n" msgstr "mot de passe récupéré dans le fichier « %s »\n" -#: fe-exec.c:449 fe-exec.c:3228 +#: fe-exec.c:466 fe-exec.c:3392 #, c-format msgid "row number %d is out of range 0..%d" msgstr "le numéro de ligne %d est en dehors des limites 0..%d" -#: fe-exec.c:510 fe-protocol3.c:219 fe-protocol3.c:244 fe-protocol3.c:273 -#: fe-protocol3.c:291 fe-protocol3.c:371 fe-protocol3.c:743 fe-protocol3.c:975 -msgid "out of memory" -msgstr "mémoire épuisée" - -#: fe-exec.c:511 fe-protocol3.c:1932 +#: fe-exec.c:528 fe-protocol3.c:1949 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:778 +#: fe-exec.c:836 msgid "write to server failed\n" msgstr "échec en écriture vers le serveur\n" -#: fe-exec.c:850 +#: fe-exec.c:875 +msgid "no error text available\n" +msgstr "aucun texte d'erreur disponible\n" + +#: fe-exec.c:964 msgid "NOTICE" msgstr "NOTICE" -#: fe-exec.c:908 +#: fe-exec.c:1022 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult ne supporte pas plus de INT_MAX lignes" -#: fe-exec.c:920 +#: fe-exec.c:1034 msgid "size_t overflow" msgstr "saturation de size_t" -#: fe-exec.c:1302 fe-exec.c:1409 fe-exec.c:1458 +#: fe-exec.c:1447 fe-exec.c:1552 fe-exec.c:1601 msgid "command string is a null pointer\n" msgstr "la chaîne de commande est un pointeur nul\n" -#: fe-exec.c:1415 fe-exec.c:1464 fe-exec.c:1562 +#: fe-exec.c:1558 fe-exec.c:1607 fe-exec.c:1703 #, c-format msgid "number of parameters must be between 0 and %d\n" msgstr "le nombre de paramètres doit être compris entre 0 et %d\n" -#: fe-exec.c:1452 fe-exec.c:1556 +#: fe-exec.c:1595 fe-exec.c:1697 msgid "statement name is a null pointer\n" msgstr "le nom de l'instruction est un pointeur nul\n" -#: fe-exec.c:1598 +#: fe-exec.c:1741 fe-exec.c:3245 msgid "no connection to the server\n" msgstr "aucune connexion au serveur\n" -#: fe-exec.c:1607 +#: fe-exec.c:1750 fe-exec.c:3254 msgid "another command is already in progress\n" msgstr "une autre commande est déjà en cours\n" -#: fe-exec.c:1636 +#: fe-exec.c:1779 msgid "cannot queue commands during COPY\n" msgstr "ne peut pas mettre en queue les commandes lors du COPY\n" -#: fe-exec.c:1754 +#: fe-exec.c:1897 msgid "length must be given for binary parameter\n" msgstr "la longueur doit être indiquée pour les paramètres binaires\n" -#: fe-exec.c:2075 +#: fe-exec.c:2215 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "asyncStatus inattendu : %d\n" -#: fe-exec.c:2095 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "échec de PGEventProc « %s » lors de l'événement PGEVT_RESULTCREATE\n" - -#: fe-exec.c:2243 +#: fe-exec.c:2373 msgid "synchronous command execution functions are not allowed in pipeline mode\n" msgstr "les fonctions d'exécution de commande synchrone ne sont pas autorisées en mode pipeline\n" -#: fe-exec.c:2265 +#: fe-exec.c:2390 msgid "COPY terminated by new PQexec" msgstr "COPY terminé par un nouveau PQexec" -#: fe-exec.c:2282 +#: fe-exec.c:2407 msgid "PQexec not allowed during COPY BOTH\n" msgstr "PQexec non autorisé pendant COPY BOTH\n" -#: fe-exec.c:2511 fe-exec.c:2567 fe-exec.c:2636 fe-protocol3.c:1863 +#: fe-exec.c:2635 fe-exec.c:2691 fe-exec.c:2760 fe-protocol3.c:1880 msgid "no COPY in progress\n" msgstr "aucun COPY en cours\n" -#: fe-exec.c:2813 +#: fe-exec.c:2940 msgid "PQfn not allowed in pipeline mode\n" msgstr "PQfn non autorisé dans le mode pipeline\n" -#: fe-exec.c:2821 +#: fe-exec.c:2948 msgid "connection in wrong state\n" msgstr "connexion dans un état erroné\n" -#: fe-exec.c:2865 +#: fe-exec.c:2992 msgid "cannot enter pipeline mode, connection not idle\n" msgstr "ne peut pas entrer dans le mode pipeline, connexion active\n" -#: fe-exec.c:2899 fe-exec.c:2916 +#: fe-exec.c:3026 fe-exec.c:3043 msgid "cannot exit pipeline mode with uncollected results\n" msgstr "ne peut pas sortir du mode pipeline avec des résultats non récupérés\n" -#: fe-exec.c:2904 +#: fe-exec.c:3031 msgid "cannot exit pipeline mode while busy\n" msgstr "ne peut pas sortir du mode pipeline alors qu'il est occupé\n" -#: fe-exec.c:3046 +#: fe-exec.c:3179 msgid "cannot send pipeline when not in pipeline mode\n" msgstr "ne peut pas envoyer le pipeline lorsqu'il n'est pas en mode pipeline\n" -#: fe-exec.c:3117 +#: fe-exec.c:3281 msgid "invalid ExecStatusType code" msgstr "code ExecStatusType invalide" -#: fe-exec.c:3144 +#: fe-exec.c:3308 msgid "PGresult is not an error result\n" msgstr "PGresult n'est pas un résultat d'erreur\n" -#: fe-exec.c:3212 fe-exec.c:3235 +#: fe-exec.c:3376 fe-exec.c:3399 #, c-format msgid "column number %d is out of range 0..%d" msgstr "le numéro de colonne %d est en dehors des limites 0..%d" -#: fe-exec.c:3250 +#: fe-exec.c:3414 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "le numéro de paramètre %d est en dehors des limites 0..%d" -#: fe-exec.c:3560 +#: fe-exec.c:3725 #, c-format msgid "could not interpret result from server: %s" msgstr "n'a pas pu interpréter la réponse du serveur : %s" -#: fe-exec.c:3820 fe-exec.c:3909 +#: fe-exec.c:3987 fe-exec.c:4078 msgid "incomplete multibyte character\n" msgstr "caractère multi-octet incomplet\n" -#: fe-gssapi-common.c:123 +#: fe-gssapi-common.c:124 msgid "GSSAPI name import error" msgstr "erreur d'import du nom GSSAPI" #: fe-lobj.c:145 fe-lobj.c:210 fe-lobj.c:403 fe-lobj.c:494 fe-lobj.c:568 -#: fe-lobj.c:969 fe-lobj.c:977 fe-lobj.c:985 fe-lobj.c:993 fe-lobj.c:1001 -#: fe-lobj.c:1009 fe-lobj.c:1017 fe-lobj.c:1025 +#: fe-lobj.c:972 fe-lobj.c:980 fe-lobj.c:988 fe-lobj.c:996 fe-lobj.c:1004 +#: fe-lobj.c:1012 fe-lobj.c:1020 fe-lobj.c:1028 #, c-format msgid "cannot determine OID of function %s\n" msgstr "ne peut pas déterminer l'OID de la fonction %s\n" @@ -789,22 +817,22 @@ msgstr "l'argument de lo_read dépasse l'échelle des entiers\n" msgid "argument of lo_write exceeds integer range\n" msgstr "l'argument de lo_write dépasse l'échelle des entiers\n" -#: fe-lobj.c:678 fe-lobj.c:789 +#: fe-lobj.c:678 fe-lobj.c:791 #, c-format msgid "could not open file \"%s\": %s\n" msgstr "n'a pas pu ouvrir le fichier « %s » : %s\n" -#: fe-lobj.c:734 +#: fe-lobj.c:735 #, c-format msgid "could not read from file \"%s\": %s\n" msgstr "n'a pas pu lire le fichier « %s » : %s\n" -#: fe-lobj.c:810 fe-lobj.c:834 +#: fe-lobj.c:813 fe-lobj.c:837 #, c-format msgid "could not write to file \"%s\": %s\n" msgstr "n'a pas pu écrire dans le fichier « %s » : %s\n" -#: fe-lobj.c:920 +#: fe-lobj.c:923 msgid "query to initialize large object functions did not return data\n" msgstr "" "la requête d'initialisation des fonctions pour « Larges Objects » ne renvoie\n" @@ -824,8 +852,9 @@ msgstr "entier de taille %lu non supporté par pqPutInt" msgid "connection not open\n" msgstr "la connexion n'est pas active\n" -#: fe-misc.c:755 fe-secure-openssl.c:209 fe-secure-openssl.c:316 -#: fe-secure.c:260 fe-secure.c:373 +#: fe-misc.c:755 fe-secure-openssl.c:218 fe-secure-openssl.c:325 +#: fe-secure.c:260 fe-secure.c:423 +#, c-format msgid "" "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" @@ -835,15 +864,15 @@ msgstr "" "\tLe serveur s'est peut-être arrêté anormalement avant ou durant le\n" "\ttraitement de la requête.\n" -#: fe-misc.c:1015 +#: fe-misc.c:1008 msgid "timeout expired\n" msgstr "le délai est dépassé\n" -#: fe-misc.c:1060 +#: fe-misc.c:1053 msgid "invalid socket\n" msgstr "socket invalide\n" -#: fe-misc.c:1083 +#: fe-misc.c:1076 #, c-format msgid "%s() failed: %s\n" msgstr "échec de %s() : %s\n" @@ -853,158 +882,172 @@ msgstr "échec de %s() : %s\n" msgid "message type 0x%02x arrived from server while idle" msgstr "le message de type 0x%02x est arrivé alors que le serveur était en attente" -#: fe-protocol3.c:403 +#: fe-protocol3.c:405 msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" msgstr "" "le serveur a envoyé des données (message « D ») sans description préalable\n" "de la ligne (message « T »)\n" -#: fe-protocol3.c:446 +#: fe-protocol3.c:448 #, c-format msgid "unexpected response from server; first received character was \"%c\"\n" msgstr "réponse inattendue du serveur, le premier caractère reçu étant « %c »\n" -#: fe-protocol3.c:471 +#: fe-protocol3.c:473 #, c-format msgid "message contents do not agree with length in message type \"%c\"\n" msgstr "" "le contenu du message ne correspond pas avec la longueur du type de message\n" "« %c »\n" -#: fe-protocol3.c:491 +#: fe-protocol3.c:493 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d\n" msgstr "" "synchronisation perdue avec le serveur : a reçu le type de message « %c »,\n" "longueur %d\n" -#: fe-protocol3.c:543 fe-protocol3.c:583 +#: fe-protocol3.c:545 fe-protocol3.c:585 msgid "insufficient data in \"T\" message" msgstr "données insuffisantes dans le message « T »" -#: fe-protocol3.c:654 fe-protocol3.c:860 +#: fe-protocol3.c:656 fe-protocol3.c:862 msgid "out of memory for query result" msgstr "mémoire épuisée pour le résultat de la requête" -#: fe-protocol3.c:723 +#: fe-protocol3.c:725 msgid "insufficient data in \"t\" message" msgstr "données insuffisantes dans le message « t »" -#: fe-protocol3.c:782 fe-protocol3.c:814 fe-protocol3.c:832 +#: fe-protocol3.c:784 fe-protocol3.c:816 fe-protocol3.c:834 msgid "insufficient data in \"D\" message" msgstr "données insuffisantes dans le message « D »" -#: fe-protocol3.c:788 +#: fe-protocol3.c:790 msgid "unexpected field count in \"D\" message" msgstr "nombre de champs inattendu dans le message « D »" -#: fe-protocol3.c:1029 +#: fe-protocol3.c:1046 msgid "no error message available\n" msgstr "aucun message d'erreur disponible\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1077 fe-protocol3.c:1096 +#: fe-protocol3.c:1094 fe-protocol3.c:1113 #, c-format msgid " at character %s" msgstr " au caractère %s" -#: fe-protocol3.c:1109 +#: fe-protocol3.c:1126 #, c-format msgid "DETAIL: %s\n" msgstr "DÉTAIL : %s\n" -#: fe-protocol3.c:1112 +#: fe-protocol3.c:1129 #, c-format msgid "HINT: %s\n" msgstr "ASTUCE : %s\n" -#: fe-protocol3.c:1115 +#: fe-protocol3.c:1132 #, c-format msgid "QUERY: %s\n" msgstr "REQUÊTE : %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1139 #, c-format msgid "CONTEXT: %s\n" msgstr "CONTEXTE : %s\n" -#: fe-protocol3.c:1131 +#: fe-protocol3.c:1148 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "NOM DE SCHÉMA : %s\n" -#: fe-protocol3.c:1135 +#: fe-protocol3.c:1152 #, c-format msgid "TABLE NAME: %s\n" msgstr "NOM DE TABLE : %s\n" -#: fe-protocol3.c:1139 +#: fe-protocol3.c:1156 #, c-format msgid "COLUMN NAME: %s\n" msgstr "NOM DE COLONNE : %s\n" -#: fe-protocol3.c:1143 +#: fe-protocol3.c:1160 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "NOM DU TYPE DE DONNÉES : %s\n" -#: fe-protocol3.c:1147 +#: fe-protocol3.c:1164 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "NOM DE CONTRAINTE : %s\n" -#: fe-protocol3.c:1159 +#: fe-protocol3.c:1176 msgid "LOCATION: " msgstr "EMPLACEMENT : " -#: fe-protocol3.c:1161 +#: fe-protocol3.c:1178 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1163 +#: fe-protocol3.c:1180 #, c-format msgid "%s:%s" msgstr "%s : %s" -#: fe-protocol3.c:1358 +#: fe-protocol3.c:1375 #, c-format msgid "LINE %d: " msgstr "LIGNE %d : " -#: fe-protocol3.c:1757 +#: fe-protocol3.c:1774 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline : ne va pas réaliser un COPY OUT au format texte\n" -#: fe-protocol3.c:2123 +#: fe-protocol3.c:2151 +msgid "protocol error: no function result\n" +msgstr "erreur de protocole : aucun résultat de fonction\n" + +#: fe-protocol3.c:2163 #, c-format msgid "protocol error: id=0x%x\n" msgstr "erreur de protocole : id=0x%x\n" -#: fe-secure-common.c:124 +#: fe-secure-common.c:126 msgid "SSL certificate's name contains embedded null\n" msgstr "le nom du certificat SSL contient des NULL\n" -#: fe-secure-common.c:171 +#: fe-secure-common.c:233 +#, c-format +msgid "certificate contains IP address with invalid length %lu\n" +msgstr "le certificat contient une adresse IP de longueur invalide %lu\n" + +#: fe-secure-common.c:243 +#, c-format +msgid "could not convert certificate's IP address to string: %s\n" +msgstr "n'a pas pu convertir l'adresse IP du certificat en chaîne de caractères : %s\n" + +#: fe-secure-common.c:276 msgid "host name must be specified for a verified SSL connection\n" msgstr "le nom d'hôte doit être précisé pour une connexion SSL vérifiée\n" -#: fe-secure-common.c:196 +#: fe-secure-common.c:301 #, c-format msgid "server certificate for \"%s\" does not match host name \"%s\"\n" msgstr "le certificat serveur pour « %s » ne correspond pas au nom d'hôte « %s »\n" -#: fe-secure-common.c:202 +#: fe-secure-common.c:307 msgid "could not get server's host name from server certificate\n" msgstr "n'a pas pu récupérer le nom d'hôte du serveur à partir du certificat serveur\n" #: fe-secure-gssapi.c:201 msgid "GSSAPI wrap error" -msgstr "erreur wrap GSSAPI" +msgstr "erreur d'emballage GSSAPI" #: fe-secure-gssapi.c:209 msgid "outgoing GSSAPI message would not use confidentiality\n" -msgstr "le message sortant GSSAPI n'utilisera pas la confidentialité\n" +msgstr "le message sortant GSSAPI n'utiliserait pas la confidentialité\n" #: fe-secure-gssapi.c:217 #, c-format @@ -1018,11 +1061,11 @@ msgstr "paquet GSSAPI trop gros envoyé par le serveur (%zu > %zu)\n" #: fe-secure-gssapi.c:393 msgid "GSSAPI unwrap error" -msgstr "erreur unwrap GSSAPI" +msgstr "erreur de dépaquetage GSSAPI" #: fe-secure-gssapi.c:403 msgid "incoming GSSAPI message did not use confidentiality\n" -msgstr "le message entrant GSSAPI n'utilisait pas la confidentialité\n" +msgstr "le message entrant GSSAPI n'a pas utilisé pas la confidentialité\n" #: fe-secure-gssapi.c:642 msgid "could not initiate GSSAPI security context" @@ -1036,77 +1079,81 @@ msgstr "erreur de vérification de la taille GSSAPI" msgid "GSSAPI context establishment error" msgstr "erreur d'établissement du contexte GSSAPI" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1333 +#: fe-secure-openssl.c:223 fe-secure-openssl.c:330 fe-secure-openssl.c:1499 #, c-format msgid "SSL SYSCALL error: %s\n" msgstr "erreur SYSCALL SSL : %s\n" -#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1337 +#: fe-secure-openssl.c:230 fe-secure-openssl.c:337 fe-secure-openssl.c:1503 msgid "SSL SYSCALL error: EOF detected\n" msgstr "erreur SYSCALL SSL : EOF détecté\n" -#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1346 +#: fe-secure-openssl.c:241 fe-secure-openssl.c:348 fe-secure-openssl.c:1512 #, c-format msgid "SSL error: %s\n" msgstr "erreur SSL : %s\n" -#: fe-secure-openssl.c:247 fe-secure-openssl.c:354 +#: fe-secure-openssl.c:256 fe-secure-openssl.c:363 msgid "SSL connection has been closed unexpectedly\n" msgstr "la connexion SSL a été fermée de façon inattendu\n" -#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1396 +#: fe-secure-openssl.c:262 fe-secure-openssl.c:369 fe-secure-openssl.c:1562 #, c-format msgid "unrecognized SSL error code: %d\n" msgstr "code d'erreur SSL inconnu : %d\n" -#: fe-secure-openssl.c:400 +#: fe-secure-openssl.c:409 msgid "could not determine server certificate signature algorithm\n" msgstr "n'a pas pu déterminer l'algorithme de signature du certificat serveur\n" -#: fe-secure-openssl.c:421 +#: fe-secure-openssl.c:430 #, c-format msgid "could not find digest for NID %s\n" msgstr "n'a pas pu trouver l'entrée pour le NID %s\n" -#: fe-secure-openssl.c:431 +#: fe-secure-openssl.c:440 msgid "could not generate peer certificate hash\n" msgstr "n'a pas pu générer le hachage du certificat peer\n" -#: fe-secure-openssl.c:488 +#: fe-secure-openssl.c:497 msgid "SSL certificate's name entry is missing\n" msgstr "l'entrée du nom du certificat SSL est manquante\n" -#: fe-secure-openssl.c:822 +#: fe-secure-openssl.c:532 +msgid "SSL certificate's address entry is missing\n" +msgstr "l'entrée d'adresse du certificat SSL est manquante\n" + +#: fe-secure-openssl.c:950 #, c-format msgid "could not create SSL context: %s\n" msgstr "n'a pas pu créer le contexte SSL : %s\n" -#: fe-secure-openssl.c:861 +#: fe-secure-openssl.c:989 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version\n" msgstr "valeur « %s » invalide pour la version minimale du protocole SSL\n" -#: fe-secure-openssl.c:872 +#: fe-secure-openssl.c:1000 #, c-format msgid "could not set minimum SSL protocol version: %s\n" msgstr "n'a pas pu configurer la version minimale de protocole SSL : %s\n" -#: fe-secure-openssl.c:890 +#: fe-secure-openssl.c:1018 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version\n" msgstr "valeur « %s » invalide pour la version maximale du protocole SSL\n" -#: fe-secure-openssl.c:901 +#: fe-secure-openssl.c:1029 #, c-format msgid "could not set maximum SSL protocol version: %s\n" msgstr "n'a pas pu configurer la version maximale de protocole SSL : %s\n" -#: fe-secure-openssl.c:937 +#: fe-secure-openssl.c:1065 #, c-format msgid "could not read root certificate file \"%s\": %s\n" msgstr "n'a pas pu lire le certificat racine « %s » : %s\n" -#: fe-secure-openssl.c:990 +#: fe-secure-openssl.c:1118 msgid "" "could not get home directory to locate root certificate file\n" "Either provide the file or change sslmode to disable server certificate verification.\n" @@ -1115,7 +1162,7 @@ msgstr "" "Fournissez le fichier ou modifiez sslmode pour désactiver la vérification du\n" "certificat par le serveur.\n" -#: fe-secure-openssl.c:994 +#: fe-secure-openssl.c:1122 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1125,90 +1172,102 @@ msgstr "" "Fournissez le fichier ou modifiez sslmode pour désactiver la vérification du\n" "certificat par le serveur.\n" -#: fe-secure-openssl.c:1025 +#: fe-secure-openssl.c:1153 #, c-format msgid "could not open certificate file \"%s\": %s\n" msgstr "n'a pas pu ouvrir le certificat « %s » : %s\n" -#: fe-secure-openssl.c:1044 +#: fe-secure-openssl.c:1172 #, c-format msgid "could not read certificate file \"%s\": %s\n" msgstr "n'a pas pu lire le certificat « %s » : %s\n" -#: fe-secure-openssl.c:1069 +#: fe-secure-openssl.c:1197 #, c-format msgid "could not establish SSL connection: %s\n" msgstr "n'a pas pu établir la connexion SSL : %s\n" -#: fe-secure-openssl.c:1103 +#: fe-secure-openssl.c:1231 #, c-format msgid "could not set SSL Server Name Indication (SNI): %s\n" msgstr "n'a pas pu configurer le SSL Server Name Indication (SNI) : %s\n" -#: fe-secure-openssl.c:1149 +#: fe-secure-openssl.c:1277 #, c-format msgid "could not load SSL engine \"%s\": %s\n" msgstr "n'a pas pu charger le moteur SSL « %s » : %s\n" -#: fe-secure-openssl.c:1161 +#: fe-secure-openssl.c:1289 #, c-format msgid "could not initialize SSL engine \"%s\": %s\n" msgstr "n'a pas pu initialiser le moteur SSL « %s » : %s\n" -#: fe-secure-openssl.c:1177 +#: fe-secure-openssl.c:1305 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" msgstr "n'a pas pu lire la clé privée SSL « %s » à partir du moteur « %s » : %s\n" -#: fe-secure-openssl.c:1191 +#: fe-secure-openssl.c:1319 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" msgstr "n'a pas pu charger la clé privée SSL « %s » à partir du moteur « %s » : %s\n" -#: fe-secure-openssl.c:1228 +#: fe-secure-openssl.c:1357 #, c-format msgid "certificate present, but not private key file \"%s\"\n" msgstr "le certificat est présent, mais la clé privée « %s » est absente\n" -#: fe-secure-openssl.c:1236 +#: fe-secure-openssl.c:1361 #, c-format -msgid "private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" -msgstr "" -"le fichier de la clé privée « %s » a des droits d'accès en lecture\n" -"pour le groupe ou universel ; les droits devraient être u=rw (0600)\n" -"ou inférieur\n" +msgid "could not stat private key file \"%s\": %m\n" +msgstr "n'a pas pu interroger le fichier de clé privée « %s » : %m\n" -#: fe-secure-openssl.c:1261 +#: fe-secure-openssl.c:1370 +#, c-format +msgid "private key file \"%s\" is not a regular file\n" +msgstr "le fichier de clé privée « %s » n'est pas un fichier standard\n" + +#: fe-secure-openssl.c:1394 +#, c-format +msgid "private key file \"%s\" must be owned by the current user or root\n" +msgstr "le fichier de clé privée « %s » doit avoir comme propriétaire l'utilisateur courant ou root\n" + +#: fe-secure-openssl.c:1403 +#, c-format +msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root\n" +msgstr "le fichier de clé privée « %s » a des droits d'accès pour le groupe ou le monde ; le fichier doit avoir les droits u=rw (0600) ou moins si le propriétaire est l'utilisateur courant, ou les droits u=rw,g=r (0640) ou moins si le propriétaire est root\n" + +#: fe-secure-openssl.c:1428 #, c-format msgid "could not load private key file \"%s\": %s\n" msgstr "n'a pas pu charger le fichier de clé privée « %s » : %s\n" -#: fe-secure-openssl.c:1279 +#: fe-secure-openssl.c:1445 #, c-format msgid "certificate does not match private key file \"%s\": %s\n" msgstr "le certificat ne correspond pas à la clé privée « %s » : %s\n" -#: fe-secure-openssl.c:1379 +#: fe-secure-openssl.c:1545 #, c-format msgid "This may indicate that the server does not support any SSL protocol version between %s and %s.\n" msgstr "Ceci pourrait indiquer que le serveur ne supporte aucune des versions du protocole SSL entre %s et %s.\n" -#: fe-secure-openssl.c:1415 +#: fe-secure-openssl.c:1581 #, c-format msgid "certificate could not be obtained: %s\n" msgstr "le certificat n'a pas pu être obtenu : %s\n" -#: fe-secure-openssl.c:1521 +#: fe-secure-openssl.c:1687 #, c-format msgid "no SSL error reported" msgstr "aucune erreur SSL reportée" -#: fe-secure-openssl.c:1530 +#: fe-secure-openssl.c:1696 #, c-format msgid "SSL error code %lu" -msgstr "erreur SSL %lu" +msgstr "code d'erreur SSL %lu" -#: fe-secure-openssl.c:1777 +#: fe-secure-openssl.c:1944 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "ATTENTION : sslpassword tronqué\n" @@ -1218,7 +1277,7 @@ msgstr "ATTENTION : sslpassword tronqué\n" msgid "could not receive data from server: %s\n" msgstr "n'a pas pu recevoir des données depuis le serveur : %s\n" -#: fe-secure.c:380 +#: fe-secure.c:436 #, c-format msgid "could not send data to server: %s\n" msgstr "n'a pas pu transmettre les données au serveur : %s\n" @@ -1228,122 +1287,87 @@ msgstr "n'a pas pu transmettre les données au serveur : %s\n" msgid "unrecognized socket error: 0x%08X/%d" msgstr "erreur de socket non reconnue : 0x%08X/%d" -#~ msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %d\n" -#~ msgstr "échec de WSAIoctl(SIO_KEEPALIVE_VALS) : %d\n" - -#~ msgid "\"SHOW transaction_read_only\" failed\n" -#~ msgstr "\"SHOW transaction_read_only\" a échoué\n" - #~ msgid "\"SELECT pg_is_in_recovery()\" failed\n" #~ msgstr "\"SELECT pg_is_in_recovery()\" a échoué\n" -#~ msgid "invalid channel_binding value: \"%s\"\n" -#~ msgstr "valeur de channel_binding invalide : « %s »\n" - -#~ msgid "invalid ssl_min_protocol_version value: \"%s\"\n" -#~ msgstr "valeur ssl_min_protocol_version invalide : « %s »\n" +#~ msgid "\"SHOW transaction_read_only\" failed\n" +#~ msgstr "\"SHOW transaction_read_only\" a échoué\n" -#~ msgid "invalid ssl_max_protocol_version value: \"%s\"\n" -#~ msgstr "valeur ssl_max_protocol_version invalide : « %s »\n" +#~ msgid "COPY IN state must be terminated first\n" +#~ msgstr "l'état COPY IN doit d'abord être terminé\n" -#~ msgid "invalid gssencmode value: \"%s\"\n" -#~ msgstr "valeur gssencmode invalide : « %s »\n" +#~ msgid "COPY OUT state must be terminated first\n" +#~ msgstr "l'état COPY OUT doit d'abord être terminé\n" -#~ msgid "invalid target_session_attrs value: \"%s\"\n" -#~ msgstr "valeur target_session_attrs invalide : « %s »\n" +#~ msgid "Kerberos 5 authentication rejected: %*s\n" +#~ msgstr "authentification Kerberos 5 rejetée : %*s\n" -#~ msgid "" -#~ "could not connect to server: %s\n" -#~ "\tIs the server running on host \"%s\" (%s) and accepting\n" -#~ "\tTCP/IP connections on port %s?\n" -#~ msgstr "" -#~ "n'a pas pu se connecter au serveur : %s\n" -#~ "\tLe serveur est-il actif sur l'hôte « %s » (%s)\n" -#~ "\tet accepte-t-il les connexionsTCP/IP sur le port %s ?\n" +#, c-format +#~ msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" +#~ msgstr "échec de PGEventProc « %s » lors de l'événement PGEVT_CONNRESET\n" -#~ msgid "could not make a writable connection to server \"%s:%s\"\n" -#~ msgstr "n'a pas pu réaliser une connexion en écriture au serveur « %s » : %s\n" +#, c-format +#~ msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" +#~ msgstr "échec de PGEventProc « %s » lors de l'événement PGEVT_RESULTCREATE\n" -#~ msgid "line %d too long in service file \"%s\"\n" -#~ msgstr "ligne %d trop longue dans le fichier service « %s »\n" +#~ msgid "SSL library does not support CRL certificates (file \"%s\")\n" +#~ msgstr "la bibliothèque SSL ne supporte pas les certificats CRL (fichier « %s »)\n" -#~ msgid "function requires at least protocol version 3.0\n" -#~ msgstr "la fonction nécessite au minimum le protocole 3.0\n" +#~ msgid "WARNING: line %d too long in password file \"%s\"\n" +#~ msgstr "ATTENTION : ligne %d trop longue dans le fichier de mots de passe « %s »\n" -#~ msgid "COPY IN state must be terminated first\n" -#~ msgstr "l'état COPY IN doit d'abord être terminé\n" +#~ msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %d\n" +#~ msgstr "échec de WSAIoctl(SIO_KEEPALIVE_VALS) : %d\n" -#~ msgid "COPY OUT state must be terminated first\n" -#~ msgstr "l'état COPY OUT doit d'abord être terminé\n" +#~ msgid "cannot determine OID of function lo_creat\n" +#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_creat\n" -#~ msgid "cannot determine OID of function lo_truncate\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_truncate\n" +#~ msgid "cannot determine OID of function lo_create\n" +#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_create\n" -#~ msgid "cannot determine OID of function lo_truncate64\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_truncate64\n" +#~ msgid "cannot determine OID of function lo_lseek\n" +#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_lseek\n" #~ msgid "cannot determine OID of function lo_lseek64\n" #~ msgstr "ne peut pas déterminer l'OID de la fonction lo_lseek64\n" -#~ msgid "cannot determine OID of function lo_create\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_create\n" +#~ msgid "cannot determine OID of function lo_open\n" +#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_open\n" #~ msgid "cannot determine OID of function lo_tell64\n" #~ msgstr "ne peut pas déterminer l'OID de la fonction lo_tell64\n" -#~ msgid "cannot determine OID of function lo_open\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_open\n" +#~ msgid "cannot determine OID of function lo_truncate\n" +#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_truncate\n" -#~ msgid "cannot determine OID of function lo_creat\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_creat\n" +#~ msgid "cannot determine OID of function lo_truncate64\n" +#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_truncate64\n" #~ msgid "cannot determine OID of function lo_unlink\n" #~ msgstr "ne peut pas déterminer l'OID de la fonction lo_unlink\n" -#~ msgid "cannot determine OID of function lo_lseek\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_lseek\n" - #~ msgid "cannot determine OID of function loread\n" #~ msgstr "ne peut pas déterminer l'OID de la fonction loread\n" #~ msgid "cannot determine OID of function lowrite\n" #~ msgstr "ne peut pas déterminer l'OID de la fonction lowrite\n" -#~ msgid "invalid setenv state %c, probably indicative of memory corruption\n" -#~ msgstr "état setenv %c invalide, indiquant probablement une corruption de la mémoire\n" - -#~ msgid "invalid state %c, probably indicative of memory corruption\n" -#~ msgstr "état %c invalide, indiquant probablement une corruption de la mémoire\n" - -#~ msgid "unexpected character %c following empty query response (\"I\" message)" -#~ msgstr "" -#~ "caractère %c inattendu à la suite d'une réponse de requête vide (message\n" -#~ "« I »)" +#~ msgid "could not acquire mutex: %s\n" +#~ msgstr "n'a pas pu acquérir le mutex : %s\n" -#~ msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" +#~ msgid "" +#~ "could not connect to server: %s\n" +#~ "\tIs the server running on host \"%s\" (%s) and accepting\n" +#~ "\tTCP/IP connections on port %s?\n" #~ msgstr "" -#~ "le serveur a envoyé des données (message « D ») sans description préalable\n" -#~ "de la ligne (message « T »)" +#~ "n'a pas pu se connecter au serveur : %s\n" +#~ "\tLe serveur est-il actif sur l'hôte « %s » (%s)\n" +#~ "\tet accepte-t-il les connexionsTCP/IP sur le port %s ?\n" -#~ msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" +#~ msgid "could not get home directory to locate client certificate files\n" #~ msgstr "" -#~ "le serveur a envoyé des données binaires (message « B ») sans description\n" -#~ "préalable de la ligne (message « T »)" - -#~ msgid "lost synchronization with server, resetting connection" -#~ msgstr "synchronisation perdue avec le serveur, réinitialisation de la connexion" - -#~ msgid "WARNING: line %d too long in password file \"%s\"\n" -#~ msgstr "ATTENTION : ligne %d trop longue dans le fichier de mots de passe « %s »\n" - -#~ msgid "could not set minimum version of SSL protocol: %s\n" -#~ msgstr "n'a pas pu mettre en place la version minimale du protocole SSL : %s\n" - -#~ msgid "could not set maximum version of SSL protocol: %s\n" -#~ msgstr "n'a pas pu mettre en place la version maximale du protocole SSL : %s\n" - -#~ msgid "SSL library does not support CRL certificates (file \"%s\")\n" -#~ msgstr "la bibliothèque SSL ne supporte pas les certificats CRL (fichier « %s »)\n" +#~ "n'a pas pu récupérer le répertoire personnel pour trouver les certificats\n" +#~ "du client\n" #~ msgid "could not get home directory to locate password file\n" #~ msgstr "" @@ -1355,75 +1379,126 @@ msgstr "erreur de socket non reconnue : 0x%08X/%d" #~ "n'a pas pu obtenir le répertoire personnel pour trouver le certificat de\n" #~ "définition du service" -#~ msgid "setsockopt(TCP_KEEPIDLE) failed: %s\n" -#~ msgstr "setsockopt(TCP_KEEPIDLE) a échoué : %s\n" +#~ msgid "could not make a writable connection to server \"%s:%s\"\n" +#~ msgstr "n'a pas pu réaliser une connexion en écriture au serveur « %s » : %s\n" -#~ msgid "setsockopt(TCP_KEEPALIVE) failed: %s\n" -#~ msgstr "setsockopt(TCP_KEEPALIVE) a échoué : %s\n" +#~ msgid "could not open private key file \"%s\": %s\n" +#~ msgstr "n'a pas pu ouvrir le fichier de clé privée « %s » : %s\n" -#~ msgid "setsockopt(TCP_KEEPINTVL) failed: %s\n" -#~ msgstr "setsockopt(TCP_KEEPINTVL) a échoué : %s\n" +#~ msgid "could not read private key file \"%s\": %s\n" +#~ msgstr "n'a pas pu lire la clé privée « %s » : %s\n" -#~ msgid "setsockopt(SO_KEEPALIVE) failed: %s\n" -#~ msgstr "setsockopt(SO_KEEPALIVE) a échoué : %s\n" +#~ msgid "could not restore nonblocking mode on socket: %s\n" +#~ msgstr "n'a pas pu rétablir le mode non-bloquant pour la socket : %s\n" -#~ msgid "could not acquire mutex: %s\n" -#~ msgstr "n'a pas pu acquérir le mutex : %s\n" +#~ msgid "could not set maximum version of SSL protocol: %s\n" +#~ msgstr "n'a pas pu mettre en place la version maximale du protocole SSL : %s\n" -#~ msgid "unrecognized return value from row processor" -#~ msgstr "valeur de retour du traitement de la ligne non reconnue" +#~ msgid "could not set minimum version of SSL protocol: %s\n" +#~ msgstr "n'a pas pu mettre en place la version minimale du protocole SSL : %s\n" + +#~ msgid "could not set socket to blocking mode: %s\n" +#~ msgstr "n'a pas pu activer le mode bloquant pour la socket : %s\n" + +#~ msgid "extraneous data in \"D\" message" +#~ msgstr "données supplémentaires dans le message « D »" + +#~ msgid "extraneous data in \"T\" message" +#~ msgstr "données supplémentaires dans le message « T »" + +#~ msgid "extraneous data in \"t\" message" +#~ msgstr "données supplémentaires dans le message « t »" + +#~ msgid "failed to generate nonce\n" +#~ msgstr "échec pour la génération de nonce\n" + +#~ msgid "function requires at least protocol version 3.0\n" +#~ msgstr "la fonction nécessite au minimum le protocole 3.0\n" #~ msgid "invalid appname state %d, probably indicative of memory corruption\n" #~ msgstr "état appname %d invalide, indiquant probablement une corruption de la mémoire\n" -#~ msgid "could not read private key file \"%s\": %s\n" -#~ msgstr "n'a pas pu lire la clé privée « %s » : %s\n" - -#~ msgid "private key file \"%s\" changed during execution\n" -#~ msgstr "la clé privée « %s » a été modifiée durant l'exécution\n" +#~ msgid "invalid channel_binding value: \"%s\"\n" +#~ msgstr "valeur de channel_binding invalide : « %s »\n" -#~ msgid "could not open private key file \"%s\": %s\n" -#~ msgstr "n'a pas pu ouvrir le fichier de clé privée « %s » : %s\n" +#~ msgid "invalid gssencmode value: \"%s\"\n" +#~ msgstr "valeur gssencmode invalide : « %s »\n" -#~ msgid "verified SSL connections are only supported when connecting to a host name\n" -#~ msgstr "" -#~ "les connexions SSL vérifiées ne sont supportées que lors de la connexion\n" -#~ "à un alias hôte\n" +#~ msgid "invalid setenv state %c, probably indicative of memory corruption\n" +#~ msgstr "état setenv %c invalide, indiquant probablement une corruption de la mémoire\n" -#~ msgid "could not get home directory to locate client certificate files\n" -#~ msgstr "" -#~ "n'a pas pu récupérer le répertoire personnel pour trouver les certificats\n" -#~ "du client\n" +#~ msgid "invalid ssl_max_protocol_version value: \"%s\"\n" +#~ msgstr "valeur ssl_max_protocol_version invalide : « %s »\n" -#~ msgid "could not restore nonblocking mode on socket: %s\n" -#~ msgstr "n'a pas pu rétablir le mode non-bloquant pour la socket : %s\n" +#~ msgid "invalid ssl_min_protocol_version value: \"%s\"\n" +#~ msgstr "valeur ssl_min_protocol_version invalide : « %s »\n" -#~ msgid "Kerberos 5 authentication rejected: %*s\n" -#~ msgstr "authentification Kerberos 5 rejetée : %*s\n" +#~ msgid "invalid state %c, probably indicative of memory corruption\n" +#~ msgstr "état %c invalide, indiquant probablement une corruption de la mémoire\n" -#~ msgid "could not set socket to blocking mode: %s\n" -#~ msgstr "n'a pas pu activer le mode bloquant pour la socket : %s\n" +#~ msgid "invalid target_session_attrs value: \"%s\"\n" +#~ msgstr "valeur target_session_attrs invalide : « %s »\n" -#~ msgid "socket not open\n" -#~ msgstr "socket non ouvert\n" +#, c-format +#~ msgid "local user with ID %d does not exist\n" +#~ msgstr "l'utilisateur local dont l'identifiant est %d n'existe pas\n" -#~ msgid "failed to generate nonce\n" -#~ msgstr "échec pour la génération de nonce\n" +#~ msgid "lost synchronization with server, resetting connection" +#~ msgstr "synchronisation perdue avec le serveur, réinitialisation de la connexion" #~ msgid "no GSSAPI support; cannot require GSSAPI\n" #~ msgstr "pas de support de GSSAPI : ne peut pas nécessiter GSSAPI\n" -#~ msgid "extraneous data in \"D\" message" -#~ msgstr "données supplémentaires dans le message « D »" - -#~ msgid "extraneous data in \"t\" message" -#~ msgstr "données supplémentaires dans le message « t »" +#~ msgid "private key file \"%s\" changed during execution\n" +#~ msgstr "la clé privée « %s » a été modifiée durant l'exécution\n" -#~ msgid "extraneous data in \"T\" message" -#~ msgstr "données supplémentaires dans le message « T »" +#, c-format +#~ msgid "private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" +#~ msgstr "" +#~ "le fichier de la clé privée « %s » a des droits d'accès en lecture\n" +#~ "pour le groupe ou universel ; les droits devraient être u=rw (0600)\n" +#~ "ou inférieur\n" #~ msgid "select() failed: %s\n" #~ msgstr "échec de select() : %s\n" +#~ msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" +#~ msgstr "" +#~ "le serveur a envoyé des données binaires (message « B ») sans description\n" +#~ "préalable de la ligne (message « T »)" + +#~ msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" +#~ msgstr "" +#~ "le serveur a envoyé des données (message « D ») sans description préalable\n" +#~ "de la ligne (message « T »)" + #~ msgid "setsockopt(%s) failed: %s\n" #~ msgstr "setsockopt(%s) a échoué : %s\n" + +#~ msgid "setsockopt(SO_KEEPALIVE) failed: %s\n" +#~ msgstr "setsockopt(SO_KEEPALIVE) a échoué : %s\n" + +#~ msgid "setsockopt(TCP_KEEPALIVE) failed: %s\n" +#~ msgstr "setsockopt(TCP_KEEPALIVE) a échoué : %s\n" + +#~ msgid "setsockopt(TCP_KEEPIDLE) failed: %s\n" +#~ msgstr "setsockopt(TCP_KEEPIDLE) a échoué : %s\n" + +#~ msgid "setsockopt(TCP_KEEPINTVL) failed: %s\n" +#~ msgstr "setsockopt(TCP_KEEPINTVL) a échoué : %s\n" + +#~ msgid "socket not open\n" +#~ msgstr "socket non ouvert\n" + +#~ msgid "unexpected character %c following empty query response (\"I\" message)" +#~ msgstr "" +#~ "caractère %c inattendu à la suite d'une réponse de requête vide (message\n" +#~ "« I »)" + +#~ msgid "unrecognized return value from row processor" +#~ msgstr "valeur de retour du traitement de la ligne non reconnue" + +#~ msgid "verified SSL connections are only supported when connecting to a host name\n" +#~ msgstr "" +#~ "les connexions SSL vérifiées ne sont supportées que lors de la connexion\n" +#~ "à un alias hôte\n" diff --git a/src/interfaces/libpq/po/ja.po b/src/interfaces/libpq/po/ja.po index 3e08d465cb..5988779a5e 100644 --- a/src/interfaces/libpq/po/ja.po +++ b/src/interfaces/libpq/po/ja.po @@ -1,13 +1,16 @@ -# Japanese message translation file for libpq -# Copyright (C) 2019 PostgreSQL Global Development Group -# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. +# libpq.po +# Japanese message translation file for libpq +# +# Copyright (C) 2011-2022 PostgreSQL Global Development Group +# +# This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: libpq (PostgreSQL 13)\n" +"Project-Id-Version: libpq (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-21 23:39+0900\n" -"PO-Revision-Date: 2020-08-22 00:02+0900\n" +"POT-Creation-Date: 2022-05-11 14:16+0900\n" +"PO-Revision-Date: 2022-05-11 13:06+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -17,89 +20,119 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: fe-auth-scram.c:212 +#: ../../port/thread.c:100 ../../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "ローカルユーザID %dの参照に失敗しました: %s" + +#: ../../port/thread.c:105 ../../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "ID %d を持つローカルユーザは存在しません" + +#: fe-auth-scram.c:231 msgid "malformed SCRAM message (empty message)\n" msgstr "SCRAMメッセージのフォーマット異常 (空のメッセージ)\n" -#: fe-auth-scram.c:218 +#: fe-auth-scram.c:237 msgid "malformed SCRAM message (length mismatch)\n" msgstr "SCRAMメッセージのフォーマット異常 (長さの不整合)\n" -#: fe-auth-scram.c:265 +#: fe-auth-scram.c:281 +#, c-format +msgid "could not verify server signature: %s\n" +msgstr "サーバー署名を検証できませんでした: %s\n" + +#: fe-auth-scram.c:288 msgid "incorrect server signature\n" msgstr "正しくないサーバ署名\n" -#: fe-auth-scram.c:274 +#: fe-auth-scram.c:297 msgid "invalid SCRAM exchange state\n" msgstr "不正なSCRAM交換状態\n" -#: fe-auth-scram.c:296 +#: fe-auth-scram.c:324 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)\n" msgstr "SCRAMメッセージのフォーマット異常 (属性 \"%c\" が必要)\n" -#: fe-auth-scram.c:305 +#: fe-auth-scram.c:333 #, c-format msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" msgstr "SCRAMメッセージのフォーマット異常 (属性 \"%c\" に文字 \"=\" が必要)\n" -#: fe-auth-scram.c:346 +#: fe-auth-scram.c:374 msgid "could not generate nonce\n" msgstr "nonce を生成できませんでした\n" -#: fe-auth-scram.c:356 fe-auth-scram.c:431 fe-auth-scram.c:579 -#: fe-auth-scram.c:600 fe-auth-scram.c:626 fe-auth-scram.c:641 -#: fe-auth-scram.c:691 fe-auth-scram.c:725 fe-auth.c:289 fe-auth.c:359 -#: fe-auth.c:394 fe-auth.c:611 fe-auth.c:770 fe-auth.c:1129 fe-auth.c:1277 -#: fe-connect.c:892 fe-connect.c:1423 fe-connect.c:1599 fe-connect.c:2204 -#: fe-connect.c:2227 fe-connect.c:2956 fe-connect.c:4602 fe-connect.c:4858 -#: fe-connect.c:4977 fe-connect.c:5230 fe-connect.c:5310 fe-connect.c:5409 -#: fe-connect.c:5665 fe-connect.c:5694 fe-connect.c:5766 fe-connect.c:5790 -#: fe-connect.c:5808 fe-connect.c:5909 fe-connect.c:5918 fe-connect.c:6274 -#: fe-connect.c:6424 fe-exec.c:2747 fe-exec.c:3494 fe-exec.c:3659 -#: fe-gssapi-common.c:111 fe-lobj.c:895 fe-protocol2.c:1207 fe-protocol3.c:995 -#: fe-protocol3.c:1699 fe-secure-common.c:110 fe-secure-gssapi.c:504 -#: fe-secure-openssl.c:440 fe-secure-openssl.c:1091 +#: fe-auth-scram.c:384 fe-auth-scram.c:459 fe-auth-scram.c:615 +#: fe-auth-scram.c:636 fe-auth-scram.c:662 fe-auth-scram.c:677 +#: fe-auth-scram.c:727 fe-auth-scram.c:766 fe-auth.c:290 fe-auth.c:362 +#: fe-auth.c:398 fe-auth.c:623 fe-auth.c:799 fe-auth.c:1152 fe-auth.c:1322 +#: fe-connect.c:906 fe-connect.c:1455 fe-connect.c:1624 fe-connect.c:2976 +#: fe-connect.c:4823 fe-connect.c:5084 fe-connect.c:5203 fe-connect.c:5455 +#: fe-connect.c:5536 fe-connect.c:5635 fe-connect.c:5891 fe-connect.c:5920 +#: fe-connect.c:5992 fe-connect.c:6016 fe-connect.c:6034 fe-connect.c:6135 +#: fe-connect.c:6144 fe-connect.c:6502 fe-connect.c:6652 fe-connect.c:6918 +#: fe-exec.c:710 fe-exec.c:976 fe-exec.c:1324 fe-exec.c:3135 fe-exec.c:3318 +#: fe-exec.c:4096 fe-exec.c:4261 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:985 fe-protocol3.c:1000 fe-protocol3.c:1033 +#: fe-protocol3.c:1741 fe-protocol3.c:2144 fe-secure-common.c:112 +#: fe-secure-gssapi.c:504 fe-secure-openssl.c:449 fe-secure-openssl.c:1261 msgid "out of memory\n" msgstr "メモリ不足\n" -#: fe-auth-scram.c:364 +#: fe-auth-scram.c:392 msgid "could not encode nonce\n" msgstr "nonceをエンコードに失敗しました\n" -#: fe-auth-scram.c:563 +#: fe-auth-scram.c:582 +#, c-format +msgid "could not calculate client proof: %s\n" +msgstr "クライアント証明の算出に失敗しました: %s\n" + +#: fe-auth-scram.c:599 msgid "could not encode client proof\n" msgstr "クライアントの証明のエンコードに失敗しました\n" -#: fe-auth-scram.c:618 +#: fe-auth-scram.c:654 msgid "invalid SCRAM response (nonce mismatch)\n" msgstr "不正なSCRAM応答 (nonce の不一致)\n" -#: fe-auth-scram.c:651 +#: fe-auth-scram.c:687 msgid "malformed SCRAM message (invalid salt)\n" -msgstr "SCRAMメッセージのフォーマット異常 (不正なサーバソルト)\n" +msgstr "SCRAMメッセージのフォーマット異常 (不正なソルト)\n" -#: fe-auth-scram.c:665 +#: fe-auth-scram.c:701 msgid "malformed SCRAM message (invalid iteration count)\n" msgstr "SCRAMメッセージのフォーマット異常 (不正な繰り返し回数)\n" -#: fe-auth-scram.c:671 +#: fe-auth-scram.c:707 msgid "malformed SCRAM message (garbage at end of server-first-message)\n" msgstr "SCRAMメッセージのフォーマット異常 (server-first-message 終端の余分なデータ)\n" -#: fe-auth-scram.c:702 +#: fe-auth-scram.c:743 #, c-format msgid "error received from server in SCRAM exchange: %s\n" msgstr "SCRAM交換中にサーバからのエラーを受信しました: %s\n" -#: fe-auth-scram.c:718 +#: fe-auth-scram.c:759 msgid "malformed SCRAM message (garbage at end of server-final-message)\n" msgstr "SCRAMメッセージのフォーマット異常 (server-final-message 終端の余分なデータ)\n" -#: fe-auth-scram.c:737 +#: fe-auth-scram.c:778 msgid "malformed SCRAM message (invalid server signature)\n" msgstr "SCRAMメッセージのフォーマット異常 (不正なサーバ署名)\n" +#: fe-auth-scram.c:934 fe-exec.c:527 fe-protocol3.c:219 fe-protocol3.c:244 +#: fe-protocol3.c:273 fe-protocol3.c:291 fe-protocol3.c:372 fe-protocol3.c:745 +msgid "out of memory" +msgstr "メモリ不足です" + +#: fe-auth-scram.c:943 +msgid "failed to generate random salt" +msgstr "乱数ソルトを生成できませんでした" + #: fe-auth.c:76 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)\n" @@ -109,7 +142,8 @@ msgstr "GSSAPIバッファの割り当ての際のメモリ不足(%d)\n" msgid "GSSAPI continuation error" msgstr "GSSAI続行エラー" -#: fe-auth.c:158 fe-auth.c:388 fe-gssapi-common.c:98 fe-secure-common.c:98 +#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:98 fe-secure-common.c:100 +#: fe-secure-common.c:177 msgid "host name must be specified\n" msgstr "ホスト名を指定しなければなりません\n" @@ -126,612 +160,621 @@ msgstr "SSPIバッファの割り当ての際のメモリ不足(%d)\n" msgid "SSPI continuation error" msgstr "SSPI続行エラー" -#: fe-auth.c:349 +#: fe-auth.c:351 msgid "duplicate SSPI authentication request\n" msgstr "重複するSSPI認証要求\n" -#: fe-auth.c:374 +#: fe-auth.c:377 msgid "could not acquire SSPI credentials" msgstr "SSPI資格を入手できませんでした" -#: fe-auth.c:429 +#: fe-auth.c:433 msgid "channel binding required, but SSL not in use\n" msgstr "チャネルバインディングが要求されていますが、SSLが使用されていません\n" -#: fe-auth.c:436 +#: fe-auth.c:440 msgid "duplicate SASL authentication request\n" msgstr "重複するSASL認証要求\n" -#: fe-auth.c:492 +#: fe-auth.c:499 msgid "channel binding is required, but client does not support it\n" msgstr "チャネルバインディングが要求されていますが、クライアントがサポートしていません\n" -#: fe-auth.c:509 +#: fe-auth.c:516 msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" msgstr "サーバが非SSL接続上で SCRAM-SHA-256-PLUS 認証を提示してきました\n" -#: fe-auth.c:521 +#: fe-auth.c:531 msgid "none of the server's SASL authentication mechanisms are supported\n" msgstr "サーバ側のいずれのSASL認証機構もサポートされていません\n" -#: fe-auth.c:529 +#: fe-auth.c:539 msgid "channel binding is required, but server did not offer an authentication method that supports channel binding\n" msgstr "チャネルバインディングが要求されていますが、サーバがチャネルバインディングをサポートする認証方式を提供しませんでした\n" -#: fe-auth.c:635 +#: fe-auth.c:647 #, c-format msgid "out of memory allocating SASL buffer (%d)\n" msgstr "SASLバッファの割り当ての際のメモリ不足(%d)\n" -#: fe-auth.c:660 +#: fe-auth.c:672 msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed\n" msgstr "サーバからAuthenticationSASLFinalを受信しました、しかしSASL認証は完了していません\n" -#: fe-auth.c:737 +#: fe-auth.c:683 +msgid "no client response found after SASL exchange success\n" +msgstr "SASL交換の成功後にクライアントからの応答がありません\n" + +#: fe-auth.c:765 msgid "SCM_CRED authentication method not supported\n" msgstr "SCM_CRED認証方式はサポートされていません\n" -#: fe-auth.c:836 +#: fe-auth.c:809 fe-auth.c:818 fe-auth.c:1301 fe-auth.c:1314 +#, c-format +msgid "could not encrypt password: %s\n" +msgstr "パスワードを暗号化できませんでした: %s\n" + +#: fe-auth.c:868 msgid "channel binding required, but server authenticated client without channel binding\n" msgstr "チャネルバインディングが要求されていますが、サーバはチャネルバインディングを使用せずに認証を行いました\n" -#: fe-auth.c:842 +#: fe-auth.c:874 msgid "channel binding required but not supported by server's authentication request\n" msgstr "チャネルバインディングが要求されていますが、サーバの認証要求ではサポートされていません\n" -#: fe-auth.c:875 +#: fe-auth.c:909 msgid "Kerberos 4 authentication not supported\n" msgstr "Kerberos 4認証はサポートされていません\n" -#: fe-auth.c:880 +#: fe-auth.c:914 msgid "Kerberos 5 authentication not supported\n" msgstr "Kerberos 5認証はサポートされていません\n" -#: fe-auth.c:951 +#: fe-auth.c:985 msgid "GSSAPI authentication not supported\n" msgstr "GSSAPI認証はサポートされていません\n" -#: fe-auth.c:983 +#: fe-auth.c:1017 msgid "SSPI authentication not supported\n" msgstr "SSPI認証はサポートされていません\n" -#: fe-auth.c:991 +#: fe-auth.c:1025 msgid "Crypt authentication not supported\n" msgstr "Crypt認証はサポートされていません\n" -#: fe-auth.c:1057 +#: fe-auth.c:1092 #, c-format msgid "authentication method %u not supported\n" msgstr "認証方式%uはサポートされていません\n" -#: fe-auth.c:1104 +#: fe-auth.c:1138 #, c-format msgid "user name lookup failure: error code %lu\n" msgstr "ユーザー名の検索に失敗: エラー コード %lu\n" -#: fe-auth.c:1114 fe-connect.c:2838 -#, c-format -msgid "could not look up local user ID %d: %s\n" -msgstr "ローカルユーザID%dが見つかりませんでした: %s\n" - -#: fe-auth.c:1119 fe-connect.c:2843 -#, c-format -msgid "local user with ID %d does not exist\n" -msgstr "ID %d を持つローカルユーザは存在しません\n" - -#: fe-auth.c:1221 +#: fe-auth.c:1264 msgid "unexpected shape of result set returned for SHOW\n" msgstr "SHOW に対する予期しない形のリザルトセット\n" -#: fe-auth.c:1230 +#: fe-auth.c:1273 msgid "password_encryption value too long\n" msgstr "password_encryptionの値が長すぎます\n" -#: fe-auth.c:1270 +#: fe-auth.c:1327 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" msgstr "認識できないパスワード暗号化アルゴリズム \"%s\"\n" -#: fe-connect.c:1075 +#: fe-connect.c:1089 #, c-format msgid "could not match %d host names to %d hostaddr values\n" msgstr "%d個のホスト名と%d個のhostaddrの値との突き合せはできません\n" -#: fe-connect.c:1156 +#: fe-connect.c:1175 #, c-format msgid "could not match %d port numbers to %d hosts\n" msgstr "%d個のポート番号と%d個のホストとの突き合せはできません\n" -#: fe-connect.c:1249 fe-connect.c:1275 fe-connect.c:1317 fe-connect.c:1326 -#: fe-connect.c:1359 fe-connect.c:1404 +#: fe-connect.c:1268 fe-connect.c:1294 fe-connect.c:1336 fe-connect.c:1345 +#: fe-connect.c:1378 fe-connect.c:1422 #, c-format msgid "invalid %s value: \"%s\"\n" msgstr "%s の値が不正: \"%s\"\n" -#: fe-connect.c:1296 +#: fe-connect.c:1315 #, c-format msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" msgstr "SSLサポートが組み込まれていない場合sslmodeの値\"%s\"は不正です\n" -#: fe-connect.c:1344 +#: fe-connect.c:1363 msgid "invalid SSL protocol version range\n" msgstr "不正なSSLプロトコルバージョン範囲\n" -#: fe-connect.c:1369 +#: fe-connect.c:1388 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" msgstr "gssencmodeの値\"%s\"はGSSAPIサポートがコンパイルされていない場合は不正\n" -#: fe-connect.c:1623 +#: fe-connect.c:1648 #, c-format msgid "could not set socket to TCP no delay mode: %s\n" msgstr "TCPソケットを非遅延モードに設定できませんでした: %s\n" -#: fe-connect.c:1684 +#: fe-connect.c:1710 #, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running locally and accepting\n" -"\tconnections on Unix domain socket \"%s\"?\n" -msgstr "" -"サーバに接続できませんでした: %s\n" -" ローカルにサーバが稼動していますか?\n" -" Unixドメインソケット\"%s\"で通信を受け付けていますか?\n" +msgid "connection to server on socket \"%s\" failed: " +msgstr "ソケット\"%s\"のサーバーへの接続に失敗しました: " -#: fe-connect.c:1721 +#: fe-connect.c:1737 #, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running on host \"%s\" (%s) and accepting\n" -"\tTCP/IP connections on port %s?\n" -msgstr "" -"サーバに接続できませんでした: %s\n" -"\tサーバはホスト \"%s\" (%s) で稼動しており、\n" -"\tまた、ポート %s で TCP/IP 接続を受け付けていますか?\n" +msgid "connection to server at \"%s\" (%s), port %s failed: " +msgstr "\"%s\"(%s)、ポート%sのサーバーへの接続に失敗しました: " -#: fe-connect.c:1729 +#: fe-connect.c:1742 #, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running on host \"%s\" and accepting\n" -"\tTCP/IP connections on port %s?\n" -msgstr "" -"サーバに接続できませんでした: %s\n" -"\tサーバはホスト\"%s\"で稼動していますか?\n" -"\tまた、ポート%sでTCP/IP接続を受け付けていますか?\n" +msgid "connection to server at \"%s\", port %s failed: " +msgstr "\"%s\"、ポート%sのサーバーへの接続に失敗しました: " + +#: fe-connect.c:1767 +msgid "\tIs the server running locally and accepting connections on that socket?\n" +msgstr "\tサーバーはローカルで稼働していてそのソケットで接続を受け付けていますか?\n" -#: fe-connect.c:1799 +#: fe-connect.c:1771 +msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" +msgstr "\tサーバーはそのホスト上で稼働していてTCP/IP接続を受け付けていますか?\n" + +#: fe-connect.c:1835 #, c-format msgid "invalid integer value \"%s\" for connection option \"%s\"\n" msgstr "接続オプション\"%2$s\"に対する不正な整数値\"%1$s\"\n" -#: fe-connect.c:1829 fe-connect.c:1863 fe-connect.c:1898 fe-connect.c:1985 -#: fe-connect.c:2627 +#: fe-connect.c:1865 fe-connect.c:1900 fe-connect.c:1936 fe-connect.c:2036 +#: fe-connect.c:2650 #, c-format -msgid "setsockopt(%s) failed: %s\n" -msgstr "setsockopt(%s)が失敗しました: %s\n" +msgid "%s(%s) failed: %s\n" +msgstr "%s(%s)が失敗しました: %s\n" -#: fe-connect.c:1951 +#: fe-connect.c:2001 #, c-format -msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" -msgstr "WSAIoctl(SIO_KEEPALIVE_VALS)に失敗しました:%ui\n" +msgid "%s(%s) failed: error code %d\n" +msgstr "%s(%s)が失敗しました: エラーコード %d\n" -#: fe-connect.c:2317 +#: fe-connect.c:2316 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "接続状態が不正です。メモリ障害の可能性があります\n" -#: fe-connect.c:2383 +#: fe-connect.c:2395 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "不正なポート番号です: \"%s\"\n" -#: fe-connect.c:2399 +#: fe-connect.c:2411 #, c-format msgid "could not translate host name \"%s\" to address: %s\n" msgstr "ホスト名\"%s\"をアドレスに変換できませんでした: %s\n" -#: fe-connect.c:2412 +#: fe-connect.c:2424 #, c-format msgid "could not parse network address \"%s\": %s\n" msgstr "ネットワークアドレス\"%s\"をパースできませんでした: %s\n" -#: fe-connect.c:2425 +#: fe-connect.c:2437 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" msgstr "Unixドメインソケットのパス\"%s\"が長すぎます(最大 %d バイト)\n" -#: fe-connect.c:2440 +#: fe-connect.c:2452 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" msgstr "Unixドメインソケットのパス\"%s\"をアドレスに変換できませんでした: %s\n" -#: fe-connect.c:2564 +#: fe-connect.c:2578 #, c-format msgid "could not create socket: %s\n" msgstr "ソケットを作成できませんでした: %s\n" -#: fe-connect.c:2586 +#: fe-connect.c:2609 #, c-format msgid "could not set socket to nonblocking mode: %s\n" msgstr "ソケットを非ブロッキングモードに設定できませんでした: %s\n" -#: fe-connect.c:2596 +#: fe-connect.c:2619 #, c-format msgid "could not set socket to close-on-exec mode: %s\n" msgstr "ソケットをclose-on-execモードに設定できませんでした: %s\n" -#: fe-connect.c:2614 +#: fe-connect.c:2637 msgid "keepalives parameter must be an integer\n" msgstr "keepaliveのパラメータは整数でなければなりません\n" -#: fe-connect.c:2754 +#: fe-connect.c:2778 #, c-format msgid "could not get socket error status: %s\n" msgstr "ソケットのエラー状態を入手できませんでした: %s\n" -#: fe-connect.c:2782 +#: fe-connect.c:2806 #, c-format msgid "could not get client address from socket: %s\n" msgstr "ソケットからクライアントアドレスを入手できませんでした: %s\n" -#: fe-connect.c:2824 +#: fe-connect.c:2845 msgid "requirepeer parameter is not supported on this platform\n" msgstr "このプラットフォームでは requirepeer パラメータはサポートされていません\n" -#: fe-connect.c:2827 +#: fe-connect.c:2848 #, c-format msgid "could not get peer credentials: %s\n" msgstr "ピアの資格証明を入手できませんでした: %s\n" -#: fe-connect.c:2851 +#: fe-connect.c:2862 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" msgstr "requirepeerは\"%s\"を指定していますが、実際のピア名は\"%s\"です\n" -#: fe-connect.c:2891 +#: fe-connect.c:2904 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "GSSAPIネゴシエーションパケットを送信できませんでした: %s\n" -#: fe-connect.c:2903 +#: fe-connect.c:2916 msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)\n" msgstr "GSSAPI暗号化が要求されていますが、実行できませんでした(おそらく資格キャッシュがない、サーバがサポートしていないあるいはローカルソケットで接続しています)\n" -#: fe-connect.c:2930 +#: fe-connect.c:2958 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "SSLネゴシエーションパケットを送信できませんでした: %s\n" -#: fe-connect.c:2969 +#: fe-connect.c:2989 #, c-format msgid "could not send startup packet: %s\n" msgstr "開始パケットを送信できませんでした: %s\n" -#: fe-connect.c:3039 +#: fe-connect.c:3065 msgid "server does not support SSL, but SSL was required\n" msgstr "サーバはSSLをサポートしていませんが、SSLが要求されました\n" -#: fe-connect.c:3065 +#: fe-connect.c:3092 #, c-format msgid "received invalid response to SSL negotiation: %c\n" msgstr "SSLネゴシエーションに対して不正な応答を受信しました: %c\n" -#: fe-connect.c:3155 +#: fe-connect.c:3113 +msgid "received unencrypted data after SSL response\n" +msgstr "SSL応答の後に非暗号化データを受信しました\n" + +#: fe-connect.c:3194 msgid "server doesn't support GSSAPI encryption, but it was required\n" msgstr "サーバはGSSAPI暗号化をサポートしていませんが、要求されました\n" -#: fe-connect.c:3166 +#: fe-connect.c:3206 #, c-format msgid "received invalid response to GSSAPI negotiation: %c\n" msgstr "GSSAPIネゴシエーションに対して不正な応答を受信しました: %c\n" -#: fe-connect.c:3233 fe-connect.c:3264 +#: fe-connect.c:3225 +msgid "received unencrypted data after GSSAPI encryption response\n" +msgstr "GSSAPI暗号化応答の後に非暗号化データを受信しました\n" + +#: fe-connect.c:3285 fe-connect.c:3310 #, c-format msgid "expected authentication request from server, but received %c\n" msgstr "サーバからの認証要求を想定していましたが、%cを受信しました\n" -#: fe-connect.c:3506 +#: fe-connect.c:3517 msgid "unexpected message from server during startup\n" msgstr "起動時にサーバから想定外のメッセージがありました\n" -#: fe-connect.c:3711 -#, c-format -msgid "could not make a writable connection to server \"%s:%s\"\n" -msgstr "サーバ\"%s:%s\"への書き込み可能な接続を確立できませんでした\n" +#: fe-connect.c:3609 +msgid "session is read-only\n" +msgstr "セッションは読み取り専用です\n" + +#: fe-connect.c:3612 +msgid "session is not read-only\n" +msgstr "セッションは読み取り専用ではありません\n" -#: fe-connect.c:3757 +#: fe-connect.c:3666 +msgid "server is in hot standby mode\n" +msgstr "サーバーはホットスタンバイモードです\n" + +#: fe-connect.c:3669 +msgid "server is not in hot standby mode\n" +msgstr "サーバーはスタンバイモードではありません\n" + +#: fe-connect.c:3787 fe-connect.c:3839 #, c-format -msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" -msgstr "サーバ\"%s:%s\"で\"SHOW transaction_read_only\"のテストに失敗しました\n" +msgid "\"%s\" failed\n" +msgstr "\"%s\"が失敗しました\n" -#: fe-connect.c:3772 +#: fe-connect.c:3853 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption\n" msgstr "接続状態%dが不正です。メモリ障害の可能性があります\n" -#: fe-connect.c:4208 fe-connect.c:4268 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "PGEVT_CONNRESETイベント中にPGEventProc \"%s\"に失敗しました\n" - -#: fe-connect.c:4615 +#: fe-connect.c:4836 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" msgstr "不正なLDAP URL\"%s\":スキーマはldap://でなければなりません\n" -#: fe-connect.c:4630 +#: fe-connect.c:4851 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" msgstr "不正なLDAP URL \"%s\": 区別名がありません\n" -#: fe-connect.c:4642 fe-connect.c:4697 +#: fe-connect.c:4863 fe-connect.c:4921 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" msgstr "不正なLDAP URL \"%s\": 正確に1つの属性を持たなければなりません\n" -#: fe-connect.c:4653 fe-connect.c:4712 +#: fe-connect.c:4875 fe-connect.c:4937 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" msgstr "不正なLDAP URL \"%s\": 検索スコープ(base/one/sub)を持たなければなりません\n" -#: fe-connect.c:4664 +#: fe-connect.c:4887 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "不正なLDAP URL \"%s\": フィルタがありません\n" -#: fe-connect.c:4685 +#: fe-connect.c:4909 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" msgstr "不正なLDAP URL \"%s\": ポート番号が不正です\n" -#: fe-connect.c:4721 +#: fe-connect.c:4947 msgid "could not create LDAP structure\n" msgstr "LDAP構造体を作成できませんでした\n" -#: fe-connect.c:4797 +#: fe-connect.c:5023 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "LDAPサーバで検索に失敗しました: %s\n" -#: fe-connect.c:4808 +#: fe-connect.c:5034 msgid "more than one entry found on LDAP lookup\n" msgstr "LDAP検索結果が複数ありました\n" -#: fe-connect.c:4809 fe-connect.c:4821 +#: fe-connect.c:5035 fe-connect.c:5047 msgid "no entry found on LDAP lookup\n" msgstr "LDAP検索結果が空でした\n" -#: fe-connect.c:4832 fe-connect.c:4845 +#: fe-connect.c:5058 fe-connect.c:5071 msgid "attribute has no values on LDAP lookup\n" msgstr "LDAP検索で属性に値がありませんでした\n" -#: fe-connect.c:4897 fe-connect.c:4916 fe-connect.c:5448 +#: fe-connect.c:5123 fe-connect.c:5142 fe-connect.c:5674 #, c-format msgid "missing \"=\" after \"%s\" in connection info string\n" msgstr "接続情報文字列において\"%s\"の後に\"=\"がありませんでした\n" -#: fe-connect.c:4989 fe-connect.c:5633 fe-connect.c:6407 +#: fe-connect.c:5215 fe-connect.c:5859 fe-connect.c:6635 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "接続オプション\"%s\"は不正です\n" -#: fe-connect.c:5005 fe-connect.c:5497 +#: fe-connect.c:5231 fe-connect.c:5723 msgid "unterminated quoted string in connection info string\n" msgstr "接続情報文字列において閉じていない引用符がありました\n" -#: fe-connect.c:5088 +#: fe-connect.c:5312 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "サービス定義\"%s\"がみつかりません\n" -#: fe-connect.c:5111 +#: fe-connect.c:5338 #, c-format msgid "service file \"%s\" not found\n" msgstr "サービスファイル\"%s\"がみつかりません\n" -#: fe-connect.c:5126 +#: fe-connect.c:5352 #, c-format msgid "line %d too long in service file \"%s\"\n" msgstr "サービスファイル\"%2$s\"の行%1$dが長すぎます。\n" -#: fe-connect.c:5198 fe-connect.c:5242 +#: fe-connect.c:5423 fe-connect.c:5467 #, c-format msgid "syntax error in service file \"%s\", line %d\n" msgstr "サービスファイル\"%s\"の行%dに構文エラーがあります\n" -#: fe-connect.c:5209 +#: fe-connect.c:5434 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d\n" msgstr "サービスファイル\"%s\"ではネストしたサービス指定はサポートされていません、行%d\n" -#: fe-connect.c:5929 +#: fe-connect.c:6155 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"\n" msgstr "内部パーサ処理へ伝わった不正なURI: \"%s\"\n" -#: fe-connect.c:6006 +#: fe-connect.c:6232 #, c-format msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"\n" msgstr "URI \"%s\"内のIPv6ホストアドレスにおいて対応する\"]\"を探している間に文字列が終わりました\n" -#: fe-connect.c:6013 +#: fe-connect.c:6239 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"\n" msgstr "URI \"%s\"内のIPv6ホストアドレスが空である可能性があります\n" -#: fe-connect.c:6028 +#: fe-connect.c:6254 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" msgstr "URI(\":\"と\"/\"を除く)内の位置%2$dに想定外の\"%1$c\"文字があります: \"%3$s\"\n" -#: fe-connect.c:6157 +#: fe-connect.c:6384 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "URI問い合わせパラメータ内に余分なキーと値を分ける\"=\"があります: \"%s\"\n" -#: fe-connect.c:6177 +#: fe-connect.c:6404 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "URI問い合わせパラメータ内にキーと値を分ける\\\"=\\\"がありません: \"%s\"\n" -#: fe-connect.c:6228 +#: fe-connect.c:6456 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "不正なURI問い合わせパラメータ:\"%s\"\n" -#: fe-connect.c:6302 +#: fe-connect.c:6530 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "不正なパーセント符号化トークン: \"%s\"\n" -#: fe-connect.c:6312 +#: fe-connect.c:6540 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" msgstr "パーセント符号化された値では%%00値は許されません: \"%s\"\n" -#: fe-connect.c:6675 +#: fe-connect.c:6910 msgid "connection pointer is NULL\n" msgstr "接続ポインタはNULLです\n" -#: fe-connect.c:6974 +#: fe-connect.c:7198 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "WARNING: パスワードファイル\"%s\"がテキストファイルではありません\n" -#: fe-connect.c:6983 +#: fe-connect.c:7207 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "警告: パスワードファイル \"%s\" がグループメンバもしくは他のユーザから読める状態になっています。この権限はu=rw (0600)以下にすべきです\n" -#: fe-connect.c:7024 -#, c-format -msgid "WARNING: line %d too long in password file \"%s\"\n" -msgstr "警告: パスワードファイル\"%2$s\"中の行%1$dが長すぎます\n" - -#: fe-connect.c:7103 +#: fe-connect.c:7315 #, c-format msgid "password retrieved from file \"%s\"\n" msgstr "ファイル\"%s\"からパスワードを読み込みました\n" -#: fe-exec.c:444 fe-exec.c:2821 +#: fe-exec.c:466 fe-exec.c:3392 #, c-format msgid "row number %d is out of range 0..%d" msgstr "行番号%dは0..%dの範囲を超えています" -#: fe-exec.c:505 fe-protocol2.c:497 fe-protocol2.c:532 fe-protocol2.c:1050 -#: fe-protocol3.c:206 fe-protocol3.c:233 fe-protocol3.c:250 fe-protocol3.c:330 -#: fe-protocol3.c:723 fe-protocol3.c:954 -msgid "out of memory" -msgstr "メモリ不足です" - -#: fe-exec.c:506 fe-protocol2.c:1396 fe-protocol3.c:1907 +#: fe-exec.c:528 fe-protocol3.c:1949 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:815 +#: fe-exec.c:836 msgid "write to server failed\n" msgstr "サーバへの書き込みに失敗\n" -#: fe-exec.c:896 +#: fe-exec.c:875 +msgid "no error text available\n" +msgstr "エラーメッセージがありません\n" + +#: fe-exec.c:964 msgid "NOTICE" msgstr "注意" -#: fe-exec.c:954 +#: fe-exec.c:1022 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresultはINT_MAX個以上のタプルを扱えません" -#: fe-exec.c:966 +#: fe-exec.c:1034 msgid "size_t overflow" msgstr "size_t オーバーフロー" -#: fe-exec.c:1243 fe-exec.c:1301 fe-exec.c:1347 +#: fe-exec.c:1447 fe-exec.c:1552 fe-exec.c:1601 msgid "command string is a null pointer\n" msgstr "コマンド文字列がヌルポインタです\n" -#: fe-exec.c:1307 fe-exec.c:1353 fe-exec.c:1448 -msgid "number of parameters must be between 0 and 65535\n" -msgstr "パラメータ数は0から65535まででなければなりません\n" +#: fe-exec.c:1558 fe-exec.c:1607 fe-exec.c:1703 +#, c-format +msgid "number of parameters must be between 0 and %d\n" +msgstr "パラメータ数は0から%dまでの間でなければなりません\n" -#: fe-exec.c:1341 fe-exec.c:1442 +#: fe-exec.c:1595 fe-exec.c:1697 msgid "statement name is a null pointer\n" msgstr "文の名前がヌルポインタです\n" -#: fe-exec.c:1361 fe-exec.c:1524 fe-exec.c:2233 fe-exec.c:2435 -msgid "function requires at least protocol version 3.0\n" -msgstr "関数は少なくともプロトコルバージョン3.0が必要です\n" - -#: fe-exec.c:1479 +#: fe-exec.c:1741 fe-exec.c:3245 msgid "no connection to the server\n" msgstr "サーバへの接続がありません\n" -#: fe-exec.c:1486 +#: fe-exec.c:1750 fe-exec.c:3254 msgid "another command is already in progress\n" msgstr "他のコマンドを処理しています\n" -#: fe-exec.c:1600 +#: fe-exec.c:1779 +msgid "cannot queue commands during COPY\n" +msgstr "COPY中はコマンドのキューイングはできません\n" + +#: fe-exec.c:1897 msgid "length must be given for binary parameter\n" msgstr "バイナリパラメータには長さを指定しなければなりません\n" -#: fe-exec.c:1863 +#: fe-exec.c:2215 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "想定外のasyncStatus: %d\n" -#: fe-exec.c:1883 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "PGEVT_RESULTCREATEイベント中にPGEventProc \"%s\"に失敗しました\n" +#: fe-exec.c:2373 +msgid "synchronous command execution functions are not allowed in pipeline mode\n" +msgstr "同期的にコマンドを実行する関数はパイプラインモード中は実行できません\n" -#: fe-exec.c:2043 +#: fe-exec.c:2390 msgid "COPY terminated by new PQexec" msgstr "新たなPQexec\"によりCOPYが終了しました" -#: fe-exec.c:2051 -msgid "COPY IN state must be terminated first\n" -msgstr "まずCOPY IN状態を終了させなければなりません\n" - -#: fe-exec.c:2071 -msgid "COPY OUT state must be terminated first\n" -msgstr "まずCOPY OUT状態を終了させなければなりません\n" - -#: fe-exec.c:2079 +#: fe-exec.c:2407 msgid "PQexec not allowed during COPY BOTH\n" msgstr "COPY BOTH 実行中の PQexec は許可されていません\n" -#: fe-exec.c:2325 fe-exec.c:2392 fe-exec.c:2482 fe-protocol2.c:1353 -#: fe-protocol3.c:1838 +#: fe-exec.c:2635 fe-exec.c:2691 fe-exec.c:2760 fe-protocol3.c:1880 msgid "no COPY in progress\n" msgstr "実行中のCOPYはありません\n" -#: fe-exec.c:2672 +#: fe-exec.c:2940 +msgid "PQfn not allowed in pipeline mode\n" +msgstr "PQfnはパイプラインモードでは使用できません\n" + +#: fe-exec.c:2948 msgid "connection in wrong state\n" msgstr "接続状態が異常です\n" -#: fe-exec.c:2703 +#: fe-exec.c:2992 +msgid "cannot enter pipeline mode, connection not idle\n" +msgstr "" +"パイプラインモードに入れません、接続がアイドル状態ではありません\n" +"\n" + +#: fe-exec.c:3026 fe-exec.c:3043 +msgid "cannot exit pipeline mode with uncollected results\n" +msgstr "未回収の結果が残っている状態でパイプラインモードを抜けることはできません\n" + +#: fe-exec.c:3031 +msgid "cannot exit pipeline mode while busy\n" +msgstr "ビジー状態でパイプラインモードを抜けることはできません\n" + +#: fe-exec.c:3179 +msgid "cannot send pipeline when not in pipeline mode\n" +msgstr "パイプラインモード外でパイプライン送出はできません\n" + +#: fe-exec.c:3281 msgid "invalid ExecStatusType code" msgstr "ExecStatusTypeコードが不正です" -#: fe-exec.c:2730 +#: fe-exec.c:3308 msgid "PGresult is not an error result\n" msgstr "PGresutがエラー結果ではありません\n" -#: fe-exec.c:2805 fe-exec.c:2828 +#: fe-exec.c:3376 fe-exec.c:3399 #, c-format msgid "column number %d is out of range 0..%d" msgstr "列番号%dは0..%dの範囲を超えています" -#: fe-exec.c:2843 +#: fe-exec.c:3414 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "パラメータ%dは0..%dの範囲を超えています" -#: fe-exec.c:3153 +#: fe-exec.c:3725 #, c-format msgid "could not interpret result from server: %s" msgstr "サーバからの結果を解釈できませんでした: %s" -#: fe-exec.c:3392 fe-exec.c:3476 +#: fe-exec.c:3987 fe-exec.c:4078 msgid "incomplete multibyte character\n" msgstr "不完全なマルチバイト文字\n" @@ -739,105 +782,61 @@ msgstr "不完全なマルチバイト文字\n" msgid "GSSAPI name import error" msgstr "GSSAPI名のインポートエラー" -#: fe-lobj.c:154 -msgid "cannot determine OID of function lo_truncate\n" -msgstr "lo_truncate関数のOIDを決定できません\n" +#: fe-lobj.c:145 fe-lobj.c:210 fe-lobj.c:403 fe-lobj.c:494 fe-lobj.c:568 +#: fe-lobj.c:972 fe-lobj.c:980 fe-lobj.c:988 fe-lobj.c:996 fe-lobj.c:1004 +#: fe-lobj.c:1012 fe-lobj.c:1020 fe-lobj.c:1028 +#, c-format +msgid "cannot determine OID of function %s\n" +msgstr "関数%sのOIDが確定できません\n" -#: fe-lobj.c:170 +#: fe-lobj.c:162 msgid "argument of lo_truncate exceeds integer range\n" msgstr "lo_truncateへの引数が整数範囲を超えています。\n" -#: fe-lobj.c:221 -msgid "cannot determine OID of function lo_truncate64\n" -msgstr "lo_truncate64関数のOIDを決定できません\n" - -#: fe-lobj.c:279 +#: fe-lobj.c:266 msgid "argument of lo_read exceeds integer range\n" msgstr "lo_readへの引数が整数範囲を超えています。\n" -#: fe-lobj.c:334 +#: fe-lobj.c:318 msgid "argument of lo_write exceeds integer range\n" msgstr "lo_writeへの引数が整数範囲を超えています。\n" -#: fe-lobj.c:425 -msgid "cannot determine OID of function lo_lseek64\n" -msgstr "lo_lseek64関数のOIDを決定できません\n" - -#: fe-lobj.c:521 -msgid "cannot determine OID of function lo_create\n" -msgstr "lo_create関数のOIDを決定できません\n" - -#: fe-lobj.c:600 -msgid "cannot determine OID of function lo_tell64\n" -msgstr "lo_tell64関数のOIDを決定できません\n" - -#: fe-lobj.c:706 fe-lobj.c:815 +#: fe-lobj.c:678 fe-lobj.c:791 #, c-format msgid "could not open file \"%s\": %s\n" msgstr "ファイル\"%s\"をオープンできませんでした: %s\n" -#: fe-lobj.c:761 +#: fe-lobj.c:735 #, c-format msgid "could not read from file \"%s\": %s\n" msgstr "ファイル\"%s\"を読み込めませんでした: %s\n" -#: fe-lobj.c:835 fe-lobj.c:859 +#: fe-lobj.c:813 fe-lobj.c:837 #, c-format msgid "could not write to file \"%s\": %s\n" msgstr "ファイル\"%s\"に書き込めませんでした: %s\n" -#: fe-lobj.c:946 +#: fe-lobj.c:923 msgid "query to initialize large object functions did not return data\n" msgstr "ラージオブジェクト機能を初期化する問い合わせがデータを返しませんでした\n" -#: fe-lobj.c:995 -msgid "cannot determine OID of function lo_open\n" -msgstr "lo_open関数のOIDを決定できません\n" - -#: fe-lobj.c:1002 -msgid "cannot determine OID of function lo_close\n" -msgstr "lo_close関数のOIDを決定できません\n" - -#: fe-lobj.c:1009 -msgid "cannot determine OID of function lo_creat\n" -msgstr "lo_creat関数のOIDを決定できません\n" - -#: fe-lobj.c:1016 -msgid "cannot determine OID of function lo_unlink\n" -msgstr "lo_unlink関数のOIDを決定できません\n" - -#: fe-lobj.c:1023 -msgid "cannot determine OID of function lo_lseek\n" -msgstr "lo_lseek関数のOIDを決定できません\n" - -#: fe-lobj.c:1030 -msgid "cannot determine OID of function lo_tell\n" -msgstr "lo_tell関数のOIDを決定できません\n" - -#: fe-lobj.c:1037 -msgid "cannot determine OID of function loread\n" -msgstr "loread関数のOIDを決定できません\n" - -#: fe-lobj.c:1044 -msgid "cannot determine OID of function lowrite\n" -msgstr "lowrite関数のOIDを決定できません\n" - -#: fe-misc.c:276 +#: fe-misc.c:242 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "サイズ%luの整数はpqGetIntでサポートされていません" -#: fe-misc.c:312 +#: fe-misc.c:275 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "サイズ%luの整数はpqPutIntでサポートされていません" -#: fe-misc.c:623 fe-misc.c:856 +#: fe-misc.c:576 fe-misc.c:822 msgid "connection not open\n" msgstr "接続はオープンされていません\n" -#: fe-misc.c:792 fe-secure-openssl.c:209 fe-secure-openssl.c:316 -#: fe-secure.c:267 fe-secure.c:383 +#: fe-misc.c:755 fe-secure-openssl.c:218 fe-secure-openssl.c:325 +#: fe-secure.c:260 fe-secure.c:423 +#, c-format msgid "" "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" @@ -847,198 +846,174 @@ msgstr "" " おそらく要求の処理前または処理中にサーバが異常終了\n" " したことを意味しています。\n" -#: fe-misc.c:1050 +#: fe-misc.c:1008 msgid "timeout expired\n" msgstr "タイムアウト期間が過ぎました\n" -#: fe-misc.c:1095 +#: fe-misc.c:1053 msgid "invalid socket\n" msgstr "不正なソケットです\n" -#: fe-misc.c:1118 +#: fe-misc.c:1076 #, c-format -msgid "select() failed: %s\n" -msgstr "select()が失敗しました: %s\n" +msgid "%s() failed: %s\n" +msgstr "%s() が失敗しました: %s\n" -#: fe-protocol2.c:87 -#, c-format -msgid "invalid setenv state %c, probably indicative of memory corruption\n" -msgstr "setenv状態%cは不正です。メモリ障害の可能性があります\n" - -#: fe-protocol2.c:384 -#, c-format -msgid "invalid state %c, probably indicative of memory corruption\n" -msgstr "状態%cは不正です。メモリ障害の可能性があります\n" - -#: fe-protocol2.c:473 fe-protocol3.c:183 +#: fe-protocol3.c:196 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "待機中にサーバからメッセージ種類0x%02xが届きました" -#: fe-protocol2.c:523 -#, c-format -msgid "unexpected character %c following empty query response (\"I\" message)" -msgstr "空の問い合わせ応答(\"I\"メッセージ)の後に想定外の文字%cがありました" - -#: fe-protocol2.c:589 -#, c-format -msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" -msgstr "サーバが事前の行記述(\"T\"メッセージ)なしにデータ(\"D\"メッセージ)を送信しました" - -#: fe-protocol2.c:607 -#, c-format -msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" -msgstr "サーバが事前の行記述(\"T\"メッセージ)なしにバイナリデータ(\"B\"メッセージ)を送信しました" +#: fe-protocol3.c:405 +msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" +msgstr "サーバが事前の行記述(\"T\"メッセージ)なしにデータ(\"D\"メッセージ)を送信しました\"\n" -#: fe-protocol2.c:626 fe-protocol3.c:408 +#: fe-protocol3.c:448 #, c-format msgid "unexpected response from server; first received character was \"%c\"\n" msgstr "サーバから想定外の応答がありました。受け付けた先頭文字は\"%c\"です\n" -#: fe-protocol2.c:755 fe-protocol2.c:930 fe-protocol3.c:622 fe-protocol3.c:849 -msgid "out of memory for query result" -msgstr "問い合わせ結果用のメモリが不足しています" - -#: fe-protocol2.c:1408 -#, c-format -msgid "lost synchronization with server, resetting connection" -msgstr "サーバとの動機が失われました。接続をリセットしています" - -#: fe-protocol2.c:1530 fe-protocol2.c:1562 fe-protocol3.c:2095 -#, c-format -msgid "protocol error: id=0x%x\n" -msgstr "プロトコルエラー: id=0x%x\n" - -#: fe-protocol3.c:365 -msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" -msgstr "サーバが事前の行記述(\"T\"メッセージ)なしにデータ(\"D\"メッセージ)を送信しました\"\n" - -#: fe-protocol3.c:429 +#: fe-protocol3.c:473 #, c-format msgid "message contents do not agree with length in message type \"%c\"\n" msgstr "メッセージの内容がメッセージ種類\"%c\"の長さに合いません\n" -#: fe-protocol3.c:449 +#: fe-protocol3.c:493 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d\n" msgstr "サーバとの同期が失われました。受信したメッセージ種類は\"%c\"、長さは%d\n" -#: fe-protocol3.c:500 fe-protocol3.c:540 +#: fe-protocol3.c:545 fe-protocol3.c:585 msgid "insufficient data in \"T\" message" msgstr "\"T\"メッセージ内のデータが不十分です" -#: fe-protocol3.c:573 -msgid "extraneous data in \"T\" message" -msgstr "\"T\"メッセージ内に無関係なデータがあります" +#: fe-protocol3.c:656 fe-protocol3.c:862 +msgid "out of memory for query result" +msgstr "問い合わせ結果用のメモリが不足しています" -#: fe-protocol3.c:686 -msgid "extraneous data in \"t\" message" -msgstr "\"t\"メッセージ内に無関係なデータがあります" +#: fe-protocol3.c:725 +msgid "insufficient data in \"t\" message" +msgstr "\"t\"メッセージ内のデータが足りません" -#: fe-protocol3.c:757 fe-protocol3.c:789 fe-protocol3.c:807 +#: fe-protocol3.c:784 fe-protocol3.c:816 fe-protocol3.c:834 msgid "insufficient data in \"D\" message" msgstr "\"D\"\"メッセージ内のデータが不十分です" -#: fe-protocol3.c:763 +#: fe-protocol3.c:790 msgid "unexpected field count in \"D\" message" msgstr "\"D\"メッセージ内のフィールド数が想定外です。" -#: fe-protocol3.c:816 -msgid "extraneous data in \"D\" message" -msgstr "”D\"メッセージ内に無関係なデータがあります" - -#: fe-protocol3.c:1008 +#: fe-protocol3.c:1046 msgid "no error message available\n" msgstr "エラーメッセージがありません\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1056 fe-protocol3.c:1075 +#: fe-protocol3.c:1094 fe-protocol3.c:1113 #, c-format msgid " at character %s" msgstr "(文字位置: %s)" -#: fe-protocol3.c:1088 +#: fe-protocol3.c:1126 #, c-format msgid "DETAIL: %s\n" msgstr "DETAIL: %s\n" -#: fe-protocol3.c:1091 +#: fe-protocol3.c:1129 #, c-format msgid "HINT: %s\n" msgstr "HINT: %s\n" -#: fe-protocol3.c:1094 +#: fe-protocol3.c:1132 #, c-format msgid "QUERY: %s\n" msgstr "QUERY: %s\n" -#: fe-protocol3.c:1101 +#: fe-protocol3.c:1139 #, c-format msgid "CONTEXT: %s\n" msgstr "CONTEXT: %s\n" -#: fe-protocol3.c:1110 +#: fe-protocol3.c:1148 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMA NAME: %s\n" -#: fe-protocol3.c:1114 +#: fe-protocol3.c:1152 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABLE NAME: %s\n" -#: fe-protocol3.c:1118 +#: fe-protocol3.c:1156 #, c-format msgid "COLUMN NAME: %s\n" msgstr "COLUMN NAME: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1160 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATATYPE NAME: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1164 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "CONSTRAINT NAME: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1176 msgid "LOCATION: " msgstr "LOCATION: " -#: fe-protocol3.c:1140 +#: fe-protocol3.c:1178 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1180 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1337 +#: fe-protocol3.c:1375 #, c-format msgid "LINE %d: " msgstr "行 %d: " -#: fe-protocol3.c:1732 +#: fe-protocol3.c:1774 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline: テキストのCOPY OUTを行っていません\n" -#: fe-secure-common.c:124 +#: fe-protocol3.c:2151 +msgid "protocol error: no function result\n" +msgstr "プロトコルエラー: 関数の結果がありません\n" + +#: fe-protocol3.c:2163 +#, c-format +msgid "protocol error: id=0x%x\n" +msgstr "プロトコルエラー: id=0x%x\n" + +#: fe-secure-common.c:126 msgid "SSL certificate's name contains embedded null\n" msgstr "SSL証明書の名前の途中にnullが含まれています\n" -#: fe-secure-common.c:171 +#: fe-secure-common.c:232 +#, c-format +msgid "certificate contains IP address with invalid length %lu\n" +msgstr "証明書は不正な長さ%luのIPアドレスを含んでいます\n" + +#: fe-secure-common.c:242 +#, c-format +msgid "could not convert certificate's IP address to string: %s\n" +msgstr "証明書のIPアドレスを文字列へ変換できませんでした: %s\n" + +#: fe-secure-common.c:275 msgid "host name must be specified for a verified SSL connection\n" msgstr "SSL 接続を検証するためにホスト名を指定しなければなりません\n" -#: fe-secure-common.c:196 +#: fe-secure-common.c:300 #, c-format msgid "server certificate for \"%s\" does not match host name \"%s\"\n" msgstr "\"%s\"のサーバ証明書がホスト名\"%s\"とマッチしません\n" -#: fe-secure-common.c:202 +#: fe-secure-common.c:306 msgid "could not get server's host name from server certificate\n" msgstr "サーバ証明書からサーバのホスト名を取り出すことができませんでした。\n" @@ -1072,85 +1047,89 @@ msgstr "受信したGSSAPIパケットは機密性を使用していませんで msgid "could not initiate GSSAPI security context" msgstr "GSSAPIセキュリティコンテキストを初期化できませんでした" -#: fe-secure-gssapi.c:673 +#: fe-secure-gssapi.c:670 msgid "GSSAPI size check error" msgstr "GSSAPIサイズチェックエラー" -#: fe-secure-gssapi.c:684 +#: fe-secure-gssapi.c:681 msgid "GSSAPI context establishment error" msgstr "GSSAPIコンテクスト確立エラー" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1291 +#: fe-secure-openssl.c:223 fe-secure-openssl.c:330 fe-secure-openssl.c:1499 #, c-format msgid "SSL SYSCALL error: %s\n" msgstr "SSL SYSCALLエラー: %s\n" -#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1295 +#: fe-secure-openssl.c:230 fe-secure-openssl.c:337 fe-secure-openssl.c:1503 msgid "SSL SYSCALL error: EOF detected\n" msgstr "SSL SYSCALLエラー: EOFを検知\n" -#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1304 +#: fe-secure-openssl.c:241 fe-secure-openssl.c:348 fe-secure-openssl.c:1512 #, c-format msgid "SSL error: %s\n" msgstr "SSLエラー: %s\n" -#: fe-secure-openssl.c:247 fe-secure-openssl.c:354 +#: fe-secure-openssl.c:256 fe-secure-openssl.c:363 msgid "SSL connection has been closed unexpectedly\n" msgstr "SSL接続が意図せずにクローズされました\n" -#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1354 +#: fe-secure-openssl.c:262 fe-secure-openssl.c:369 fe-secure-openssl.c:1562 #, c-format msgid "unrecognized SSL error code: %d\n" msgstr "不明のSSLエラーコード: %d\n" -#: fe-secure-openssl.c:400 +#: fe-secure-openssl.c:409 msgid "could not determine server certificate signature algorithm\n" msgstr "サーバ証明書の署名アルゴリズムを決定できませんでした\n" -#: fe-secure-openssl.c:421 +#: fe-secure-openssl.c:430 #, c-format msgid "could not find digest for NID %s\n" msgstr "NID %sのダイジェストが見つかりませんでした\n" -#: fe-secure-openssl.c:431 +#: fe-secure-openssl.c:440 msgid "could not generate peer certificate hash\n" msgstr "ピアの証明書ハッシュの生成に失敗しました\n" -#: fe-secure-openssl.c:488 +#: fe-secure-openssl.c:497 msgid "SSL certificate's name entry is missing\n" msgstr "SSL証明書に名前の項目がありません\n" -#: fe-secure-openssl.c:815 +#: fe-secure-openssl.c:532 +msgid "SSL certificate's address entry is missing\n" +msgstr "SSL証明書のアドレスのエントリがありません\n" + +#: fe-secure-openssl.c:950 #, c-format msgid "could not create SSL context: %s\n" msgstr "SSLコンテキストを作成できませんでした: %s\n" -#: fe-secure-openssl.c:854 +#: fe-secure-openssl.c:989 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version\n" msgstr "不正なSSLプロトコル最小バージョンの値\"%s\"\n" -#: fe-secure-openssl.c:865 +#: fe-secure-openssl.c:1000 #, c-format msgid "could not set minimum SSL protocol version: %s\n" msgstr "SSLプロトコル最小バージョンを設定できませんでした: %s\n" -#: fe-secure-openssl.c:883 +#: fe-secure-openssl.c:1018 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version\n" msgstr "不正なSSLプロトコル最大バージョンの値\"%s\"\n" -#: fe-secure-openssl.c:894 +#: fe-secure-openssl.c:1029 #, c-format msgid "could not set maximum SSL protocol version: %s\n" msgstr "SSLプロトコル最大バージョンを設定できませんでした: %s\n" -#: fe-secure-openssl.c:930 +#: fe-secure-openssl.c:1065 #, c-format msgid "could not read root certificate file \"%s\": %s\n" msgstr "ルート証明書\"%s\"を読み取れませんでした: %s\n" -#: fe-secure-openssl.c:974 +#: fe-secure-openssl.c:1118 msgid "" "could not get home directory to locate root certificate file\n" "Either provide the file or change sslmode to disable server certificate verification.\n" @@ -1158,7 +1137,7 @@ msgstr "" "ルート証明書ファイルを置くためのホームディレクトリが存在しません。\n" "ファイルを用意するか、サーバ証明書の検証を無効にするように sslmode を変更してください\n" -#: fe-secure-openssl.c:978 +#: fe-secure-openssl.c:1122 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1167,92 +1146,114 @@ msgstr "" "ルート証明書ファイル\"%s\"が存在しません。\n" "ファイルを用意するかサーバ証明書の検証を無効にするようにsslmodeを変更してください\n" -#: fe-secure-openssl.c:1009 +#: fe-secure-openssl.c:1153 #, c-format msgid "could not open certificate file \"%s\": %s\n" msgstr "証明書ファイル\"%s\"をオープンできませんでした: %s\n" -#: fe-secure-openssl.c:1028 +#: fe-secure-openssl.c:1172 #, c-format msgid "could not read certificate file \"%s\": %s\n" msgstr "証明書ファイル\"%s\"を読み込めませんでした: %s\n" -#: fe-secure-openssl.c:1053 +#: fe-secure-openssl.c:1197 #, c-format msgid "could not establish SSL connection: %s\n" msgstr "SSL接続を確立できませんでした: %s\n" -#: fe-secure-openssl.c:1107 +#: fe-secure-openssl.c:1231 +#, c-format +msgid "could not set SSL Server Name Indication (SNI): %s\n" +msgstr "" +"SSLサーバー名表示(SNI)を設定できませんでした: %s\n" +"\n" + +#: fe-secure-openssl.c:1277 #, c-format msgid "could not load SSL engine \"%s\": %s\n" msgstr "SSLエンジン\"%s\"を読み込みできませんでした: %s\n" -#: fe-secure-openssl.c:1119 +#: fe-secure-openssl.c:1289 #, c-format msgid "could not initialize SSL engine \"%s\": %s\n" msgstr "SSLエンジン\"%s\"を初期化できませんでした: %s\n" -#: fe-secure-openssl.c:1135 +#: fe-secure-openssl.c:1305 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "SSL秘密キーファイル\"%s\"をエンジン\"%s\"から読み取れませんでした: %s\n" +msgstr "SSL秘密鍵ファイル\"%s\"をエンジン\"%s\"から読み取れませんでした: %s\n" -#: fe-secure-openssl.c:1149 +#: fe-secure-openssl.c:1319 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "SSL秘密キー\"%s\"をエンジン\"%s\"から読み取れませんでした: %s\n" +msgstr "SSL秘密鍵\"%s\"をエンジン\"%s\"から読み取れませんでした: %s\n" -#: fe-secure-openssl.c:1186 +#: fe-secure-openssl.c:1357 #, c-format msgid "certificate present, but not private key file \"%s\"\n" -msgstr "証明書はありましたが、秘密キーファイル\"%s\"はありませんでした\n" +msgstr "証明書はありましたが、秘密鍵ファイル\"%s\"はありませんでした\n" + +#: fe-secure-openssl.c:1361 +#, c-format +msgid "could not stat private key file \"%s\": %m\n" +msgstr "秘密鍵ファイル\"%s\"をstatできませんでした: %m\n" -#: fe-secure-openssl.c:1194 +#: fe-secure-openssl.c:1370 #, c-format -msgid "private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" -msgstr "警告:秘密キーファイル \"%s\" がグループメンバや第三者から読める状態になっています。この権限はu=rw (0600)またはそれ以下とすべきです\n" +msgid "private key file \"%s\" is not a regular file\n" +msgstr "秘密鍵ファイル\"%s\"は通常のファイルではありません\n" -#: fe-secure-openssl.c:1219 +#: fe-secure-openssl.c:1394 +#, c-format +msgid "private key file \"%s\" must be owned by the current user or root\n" +msgstr "秘密鍵ファイル\"%s\"は現在のユーザーもしくはrootの所有である必要があります\n" + +#: fe-secure-openssl.c:1403 +#, c-format +msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root\n" +msgstr "秘密鍵ファイル\"%s\"はグループに対して、もしくは無制限にアクセスを許可しています; ファイルのパーミッションは u=rw (0600) かそれよりも狭い必要があります、rootが所有している場合は u=rw,g=r (0640) かそれよりも狭い必要があります\n" + +#: fe-secure-openssl.c:1428 #, c-format msgid "could not load private key file \"%s\": %s\n" -msgstr "秘密キーファイル\"%s\"をロードできませんでした: %s\n" +msgstr "秘密鍵ファイル\"%s\"をロードできませんでした: %s\n" -#: fe-secure-openssl.c:1237 +#: fe-secure-openssl.c:1445 #, c-format msgid "certificate does not match private key file \"%s\": %s\n" -msgstr "証明書と秘密キーファイル\"%s\"が一致しません: %s\n" +msgstr "証明書と秘密鍵ファイル\"%s\"が一致しません: %s\n" -#: fe-secure-openssl.c:1337 +#: fe-secure-openssl.c:1545 #, c-format msgid "This may indicate that the server does not support any SSL protocol version between %s and %s.\n" msgstr "このことは、クライアントがSSLプロトコルのバージョン%sから%sの間のいずれもサポートしていないことを示唆しているかもしれません。\n" -#: fe-secure-openssl.c:1373 +#: fe-secure-openssl.c:1581 #, c-format msgid "certificate could not be obtained: %s\n" msgstr "証明書を入手できませんでした: %s\n" -#: fe-secure-openssl.c:1462 +#: fe-secure-openssl.c:1687 #, c-format msgid "no SSL error reported" msgstr "SSLエラーはありませんでした" -#: fe-secure-openssl.c:1471 +#: fe-secure-openssl.c:1696 #, c-format msgid "SSL error code %lu" msgstr "SSLエラーコード: %lu" -#: fe-secure-openssl.c:1718 +#: fe-secure-openssl.c:1944 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "警告: sslpasswordが切り詰められました\n" -#: fe-secure.c:275 +#: fe-secure.c:267 #, c-format msgid "could not receive data from server: %s\n" msgstr "サーバからデータを受信できませんでした: %s\n" -#: fe-secure.c:390 +#: fe-secure.c:436 #, c-format msgid "could not send data to server: %s\n" msgstr "サーバにデータを送信できませんでした: %s\n" @@ -1262,6 +1263,117 @@ msgstr "サーバにデータを送信できませんでした: %s\n" msgid "unrecognized socket error: 0x%08X/%d" msgstr "不明なソケットエラー 0x%08X/%d" +#~ msgid "could not look up local user ID %d: %s\n" +#~ msgstr "ローカルユーザID%dが見つかりませんでした: %s\n" + +#~ msgid "local user with ID %d does not exist\n" +#~ msgstr "ID %d を持つローカルユーザは存在しません\n" + +#~ msgid "" +#~ "could not connect to server: %s\n" +#~ "\tIs the server running on host \"%s\" (%s) and accepting\n" +#~ "\tTCP/IP connections on port %s?\n" +#~ msgstr "" +#~ "サーバに接続できませんでした: %s\n" +#~ "\tサーバはホスト \"%s\" (%s) で稼動しており、\n" +#~ "\tまた、ポート %s で TCP/IP 接続を受け付けていますか?\n" + +#~ msgid "setsockopt(%s) failed: %s\n" +#~ msgstr "setsockopt(%s)が失敗しました: %s\n" + +#~ msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" +#~ msgstr "WSAIoctl(SIO_KEEPALIVE_VALS)に失敗しました:%ui\n" + +#~ msgid "could not make a writable connection to server \"%s:%s\"\n" +#~ msgstr "サーバ\"%s:%s\"への書き込み可能な接続を確立できませんでした\n" + +#~ msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" +#~ msgstr "サーバ\"%s:%s\"で\"SHOW transaction_read_only\"のテストに失敗しました\n" + +#~ msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" +#~ msgstr "PGEVT_CONNRESETイベント中にPGEventProc \"%s\"に失敗しました\n" + +#~ msgid "WARNING: line %d too long in password file \"%s\"\n" +#~ msgstr "警告: パスワードファイル\"%2$s\"中の行%1$dが長すぎます\n" + +#~ msgid "function requires at least protocol version 3.0\n" +#~ msgstr "関数は少なくともプロトコルバージョン3.0が必要です\n" + +#~ msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" +#~ msgstr "PGEVT_RESULTCREATEイベント中にPGEventProc \"%s\"に失敗しました\n" + +#~ msgid "COPY IN state must be terminated first\n" +#~ msgstr "まずCOPY IN状態を終了させなければなりません\n" + +#~ msgid "COPY OUT state must be terminated first\n" +#~ msgstr "まずCOPY OUT状態を終了させなければなりません\n" + +#~ msgid "cannot determine OID of function lo_truncate\n" +#~ msgstr "lo_truncate関数のOIDを決定できません\n" + +#~ msgid "cannot determine OID of function lo_truncate64\n" +#~ msgstr "lo_truncate64関数のOIDを決定できません\n" + +#~ msgid "cannot determine OID of function lo_lseek64\n" +#~ msgstr "lo_lseek64関数のOIDを決定できません\n" + +#~ msgid "cannot determine OID of function lo_create\n" +#~ msgstr "lo_create関数のOIDを決定できません\n" + +#~ msgid "cannot determine OID of function lo_tell64\n" +#~ msgstr "lo_tell64関数のOIDを決定できません\n" + +#~ msgid "cannot determine OID of function lo_open\n" +#~ msgstr "lo_open関数のOIDを決定できません\n" + +#~ msgid "cannot determine OID of function lo_creat\n" +#~ msgstr "lo_creat関数のOIDを決定できません\n" + +#~ msgid "cannot determine OID of function lo_unlink\n" +#~ msgstr "lo_unlink関数のOIDを決定できません\n" + +#~ msgid "cannot determine OID of function lo_lseek\n" +#~ msgstr "lo_lseek関数のOIDを決定できません\n" + +#~ msgid "cannot determine OID of function loread\n" +#~ msgstr "loread関数のOIDを決定できません\n" + +#~ msgid "cannot determine OID of function lowrite\n" +#~ msgstr "lowrite関数のOIDを決定できません\n" + +#~ msgid "select() failed: %s\n" +#~ msgstr "select()が失敗しました: %s\n" + +#~ msgid "invalid setenv state %c, probably indicative of memory corruption\n" +#~ msgstr "setenv状態%cは不正です。メモリ障害の可能性があります\n" + +#~ msgid "invalid state %c, probably indicative of memory corruption\n" +#~ msgstr "状態%cは不正です。メモリ障害の可能性があります\n" + +#~ msgid "unexpected character %c following empty query response (\"I\" message)" +#~ msgstr "空の問い合わせ応答(\"I\"メッセージ)の後に想定外の文字%cがありました" + +#~ msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" +#~ msgstr "サーバが事前の行記述(\"T\"メッセージ)なしにデータ(\"D\"メッセージ)を送信しました" + +#~ msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" +#~ msgstr "サーバが事前の行記述(\"T\"メッセージ)なしにバイナリデータ(\"B\"メッセージ)を送信しました" + +#~ msgid "lost synchronization with server, resetting connection" +#~ msgstr "サーバとの動機が失われました。接続をリセットしています" + +#~ msgid "extraneous data in \"T\" message" +#~ msgstr "\"T\"メッセージ内に無関係なデータがあります" + +#~ msgid "extraneous data in \"t\" message" +#~ msgstr "\"t\"メッセージ内に無関係なデータがあります" + +#~ msgid "extraneous data in \"D\" message" +#~ msgstr "”D\"メッセージ内に無関係なデータがあります" + +#~ msgid "private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" +#~ msgstr "警告:秘密鍵ファイル \"%s\" がグループメンバや第三者から読める状態になっています。この権限はu=rw (0600)またはそれ以下とすべきです\n" + #~ msgid "SSL library does not support CRL certificates (file \"%s\")\n" #~ msgstr "SSLライブラリがCRL証明書(\"%s\")をオープンできませんでした\n" diff --git a/src/interfaces/libpq/po/ru.po b/src/interfaces/libpq/po/ru.po index ac21a953b5..6606738fa1 100644 --- a/src/interfaces/libpq/po/ru.po +++ b/src/interfaces/libpq/po/ru.po @@ -4,13 +4,14 @@ # Serguei A. Mokhov , 2001-2004. # Oleg Bartunov , 2005. # Andrey Sudnik , 2010. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021. +# Maxim Yablokov , 2021. msgid "" msgstr "" "Project-Id-Version: libpq (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-01-26 17:52+0300\n" -"PO-Revision-Date: 2020-09-07 15:43+0300\n" +"POT-Creation-Date: 2022-02-07 11:21+0300\n" +"PO-Revision-Date: 2021-11-25 12:45+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -20,90 +21,99 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: fe-auth-scram.c:212 +#: fe-auth-scram.c:213 msgid "malformed SCRAM message (empty message)\n" msgstr "неправильное сообщение SCRAM (пустое содержимое)\n" -#: fe-auth-scram.c:218 +#: fe-auth-scram.c:219 msgid "malformed SCRAM message (length mismatch)\n" msgstr "неправильное сообщение SCRAM (некорректная длина)\n" -#: fe-auth-scram.c:265 +#: fe-auth-scram.c:263 +msgid "could not verify server signature\n" +msgstr "не удалось проверить сигнатуру сервера\n" + +#: fe-auth-scram.c:270 msgid "incorrect server signature\n" msgstr "некорректная сигнатура сервера\n" -#: fe-auth-scram.c:274 +#: fe-auth-scram.c:279 msgid "invalid SCRAM exchange state\n" msgstr "ошибочное состояние обмена SCRAM\n" -#: fe-auth-scram.c:296 +#: fe-auth-scram.c:306 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)\n" msgstr "неправильное сообщение SCRAM (ожидался атрибут \"%c\")\n" -#: fe-auth-scram.c:305 +#: fe-auth-scram.c:315 #, c-format msgid "" "malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" msgstr "" "неправильное сообщение SCRAM (для атрибута \"%c\" ожидался символ \"=\")\n" -#: fe-auth-scram.c:346 +#: fe-auth-scram.c:356 msgid "could not generate nonce\n" msgstr "не удалось сгенерировать разовый код\n" -#: fe-auth-scram.c:356 fe-auth-scram.c:431 fe-auth-scram.c:579 -#: fe-auth-scram.c:600 fe-auth-scram.c:626 fe-auth-scram.c:641 -#: fe-auth-scram.c:691 fe-auth-scram.c:725 fe-auth.c:289 fe-auth.c:359 -#: fe-auth.c:394 fe-auth.c:611 fe-auth.c:770 fe-auth.c:1129 fe-auth.c:1277 -#: fe-connect.c:892 fe-connect.c:1419 fe-connect.c:1595 fe-connect.c:2200 -#: fe-connect.c:2223 fe-connect.c:2957 fe-connect.c:4605 fe-connect.c:4861 -#: fe-connect.c:4980 fe-connect.c:5233 fe-connect.c:5313 fe-connect.c:5412 -#: fe-connect.c:5668 fe-connect.c:5697 fe-connect.c:5769 fe-connect.c:5793 -#: fe-connect.c:5811 fe-connect.c:5912 fe-connect.c:5921 fe-connect.c:6277 -#: fe-connect.c:6427 fe-exec.c:2747 fe-exec.c:3494 fe-exec.c:3659 -#: fe-gssapi-common.c:111 fe-lobj.c:895 fe-protocol2.c:1207 fe-protocol3.c:995 -#: fe-protocol3.c:1699 fe-secure-common.c:110 fe-secure-gssapi.c:504 -#: fe-secure-openssl.c:440 fe-secure-openssl.c:1091 +#: fe-auth-scram.c:366 fe-auth-scram.c:441 fe-auth-scram.c:595 +#: fe-auth-scram.c:616 fe-auth-scram.c:642 fe-auth-scram.c:657 +#: fe-auth-scram.c:707 fe-auth-scram.c:746 fe-auth.c:290 fe-auth.c:362 +#: fe-auth.c:398 fe-auth.c:615 fe-auth.c:774 fe-auth.c:1132 fe-auth.c:1282 +#: fe-connect.c:911 fe-connect.c:1455 fe-connect.c:1624 fe-connect.c:2976 +#: fe-connect.c:4706 fe-connect.c:4967 fe-connect.c:5086 fe-connect.c:5338 +#: fe-connect.c:5419 fe-connect.c:5518 fe-connect.c:5774 fe-connect.c:5803 +#: fe-connect.c:5875 fe-connect.c:5899 fe-connect.c:5917 fe-connect.c:6018 +#: fe-connect.c:6027 fe-connect.c:6385 fe-connect.c:6535 fe-connect.c:6801 +#: fe-exec.c:686 fe-exec.c:876 fe-exec.c:1223 fe-exec.c:3043 fe-exec.c:3226 +#: fe-exec.c:3999 fe-exec.c:4164 fe-gssapi-common.c:111 fe-lobj.c:881 +#: fe-protocol3.c:975 fe-protocol3.c:990 fe-protocol3.c:1023 +#: fe-protocol3.c:1731 fe-secure-common.c:110 fe-secure-gssapi.c:504 +#: fe-secure-openssl.c:440 fe-secure-openssl.c:1133 msgid "out of memory\n" msgstr "нехватка памяти\n" -#: fe-auth-scram.c:364 +#: fe-auth-scram.c:374 msgid "could not encode nonce\n" msgstr "не удалось оформить разовый код\n" #: fe-auth-scram.c:563 +msgid "could not calculate client proof\n" +msgstr "не удалось вычислить подтверждение клиента\n" + +#: fe-auth-scram.c:579 msgid "could not encode client proof\n" msgstr "не удалось закодировать подтверждение клиента\n" -#: fe-auth-scram.c:618 +#: fe-auth-scram.c:634 msgid "invalid SCRAM response (nonce mismatch)\n" msgstr "неверный ответ SCRAM (несовпадение проверочного кода)\n" -#: fe-auth-scram.c:651 +#: fe-auth-scram.c:667 msgid "malformed SCRAM message (invalid salt)\n" msgstr "неправильное сообщение SCRAM (некорректная соль)\n" -#: fe-auth-scram.c:665 +#: fe-auth-scram.c:681 msgid "malformed SCRAM message (invalid iteration count)\n" msgstr "неправильное сообщение SCRAM (некорректное число итераций)\n" -#: fe-auth-scram.c:671 +#: fe-auth-scram.c:687 msgid "malformed SCRAM message (garbage at end of server-first-message)\n" msgstr "" "неправильное сообщение SCRAM (мусор в конце первого сообщения сервера)\n" -#: fe-auth-scram.c:702 +#: fe-auth-scram.c:723 #, c-format msgid "error received from server in SCRAM exchange: %s\n" msgstr "в ходе обмена SCRAM от сервера получена ошибка: %s\n" -#: fe-auth-scram.c:718 +#: fe-auth-scram.c:739 msgid "malformed SCRAM message (garbage at end of server-final-message)\n" msgstr "" "неправильное сообщение SCRAM (мусор в конце последнего сообщения сервера)\n" -#: fe-auth-scram.c:737 +#: fe-auth-scram.c:758 msgid "malformed SCRAM message (invalid server signature)\n" msgstr "неправильное сообщение SCRAM (неверная сигнатура сервера)\n" @@ -116,7 +126,7 @@ msgstr "недостаточно памяти для буфера GSSAPI (%d)\n" msgid "GSSAPI continuation error" msgstr "ошибка продолжения в GSSAPI" -#: fe-auth.c:158 fe-auth.c:388 fe-gssapi-common.c:98 fe-secure-common.c:98 +#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:98 fe-secure-common.c:98 msgid "host name must be specified\n" msgstr "требуется указать имя сервера\n" @@ -133,39 +143,39 @@ msgstr "недостаточно памяти для буфера SSPI (%d)\n" msgid "SSPI continuation error" msgstr "ошибка продолжения в SSPI" -#: fe-auth.c:349 +#: fe-auth.c:351 msgid "duplicate SSPI authentication request\n" msgstr "повторный запрос аутентификации SSPI\n" -#: fe-auth.c:374 +#: fe-auth.c:377 msgid "could not acquire SSPI credentials" msgstr "не удалось получить удостоверение SSPI" -#: fe-auth.c:429 +#: fe-auth.c:433 msgid "channel binding required, but SSL not in use\n" msgstr "требуется привязка каналов, но SSL не используется\n" -#: fe-auth.c:436 +#: fe-auth.c:440 msgid "duplicate SASL authentication request\n" msgstr "повторный запрос аутентификации SASL\n" -#: fe-auth.c:492 +#: fe-auth.c:496 msgid "channel binding is required, but client does not support it\n" msgstr "требуется привязка каналов, но клиент её не поддерживает\n" -#: fe-auth.c:509 +#: fe-auth.c:513 msgid "" "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" msgstr "" "сервер предложил аутентификацию SCRAM-SHA-256-PLUS для соединения, не " "защищённого SSL\n" -#: fe-auth.c:521 +#: fe-auth.c:525 msgid "none of the server's SASL authentication mechanisms are supported\n" msgstr "" "ни один из серверных механизмов аутентификации SASL не поддерживается\n" -#: fe-auth.c:529 +#: fe-auth.c:533 msgid "" "channel binding is required, but server did not offer an authentication " "method that supports channel binding\n" @@ -173,12 +183,12 @@ msgstr "" "требуется привязка каналов, но сервер не предложил поддерживающий её метод " "аутентификации\n" -#: fe-auth.c:635 +#: fe-auth.c:639 #, c-format msgid "out of memory allocating SASL buffer (%d)\n" msgstr "недостаточно памяти для буфера SASL (%d)\n" -#: fe-auth.c:660 +#: fe-auth.c:664 msgid "" "AuthenticationSASLFinal received from server, but SASL authentication was " "not completed\n" @@ -186,7 +196,7 @@ msgstr "" "c сервера получено сообщение AuthenticationSASLFinal, но аутентификация SASL " "ещё не завершена\n" -#: fe-auth.c:737 +#: fe-auth.c:741 msgid "SCM_CRED authentication method not supported\n" msgstr "аутентификация SCM_CRED не поддерживается\n" @@ -205,252 +215,224 @@ msgstr "" "требуется привязка каналов, но она не поддерживается при том запросе " "аутентификации, который передал сервер\n" -#: fe-auth.c:875 +#: fe-auth.c:877 msgid "Kerberos 4 authentication not supported\n" msgstr "аутентификация Kerberos 4 не поддерживается\n" -#: fe-auth.c:880 +#: fe-auth.c:882 msgid "Kerberos 5 authentication not supported\n" msgstr "аутентификация Kerberos 5 не поддерживается\n" -#: fe-auth.c:951 +#: fe-auth.c:953 msgid "GSSAPI authentication not supported\n" msgstr "аутентификация через GSSAPI не поддерживается\n" -#: fe-auth.c:983 +#: fe-auth.c:985 msgid "SSPI authentication not supported\n" msgstr "аутентификация через SSPI не поддерживается\n" -#: fe-auth.c:991 +#: fe-auth.c:993 msgid "Crypt authentication not supported\n" msgstr "аутентификация Crypt не поддерживается\n" -#: fe-auth.c:1057 +#: fe-auth.c:1060 #, c-format msgid "authentication method %u not supported\n" msgstr "метод аутентификации %u не поддерживается\n" -#: fe-auth.c:1104 +#: fe-auth.c:1107 #, c-format msgid "user name lookup failure: error code %lu\n" msgstr "распознать имя пользователя не удалось (код ошибки: %lu)\n" -#: fe-auth.c:1114 fe-connect.c:2834 +#: fe-auth.c:1117 fe-connect.c:2851 #, c-format msgid "could not look up local user ID %d: %s\n" msgstr "найти локального пользователя по идентификатору (%d) не удалось: %s\n" -#: fe-auth.c:1119 fe-connect.c:2839 +#: fe-auth.c:1122 fe-connect.c:2856 #, c-format msgid "local user with ID %d does not exist\n" msgstr "локальный пользователь с ID %d не существует\n" -#: fe-auth.c:1221 +#: fe-auth.c:1226 msgid "unexpected shape of result set returned for SHOW\n" msgstr "неожиданная форма набора результатов, возвращённого для SHOW\n" -#: fe-auth.c:1230 +#: fe-auth.c:1235 msgid "password_encryption value too long\n" msgstr "слишком длинное значение password_encryption\n" -#: fe-auth.c:1270 +#: fe-auth.c:1275 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" msgstr "нераспознанный алгоритм шифрования пароля \"%s\"\n" -#: fe-connect.c:1075 +#: fe-connect.c:1094 #, c-format msgid "could not match %d host names to %d hostaddr values\n" msgstr "не удалось сопоставить имена узлов (%d) со значениями hostaddr (%d)\n" -#: fe-connect.c:1156 +#: fe-connect.c:1175 #, c-format msgid "could not match %d port numbers to %d hosts\n" msgstr "не удалось сопоставить номера портов (%d) с узлами (%d)\n" -#: fe-connect.c:1249 +#: fe-connect.c:1268 fe-connect.c:1294 fe-connect.c:1336 fe-connect.c:1345 +#: fe-connect.c:1378 fe-connect.c:1422 #, c-format -msgid "invalid channel_binding value: \"%s\"\n" -msgstr "неверное значение channel_binding: \"%s\"\n" +msgid "invalid %s value: \"%s\"\n" +msgstr "неверное значение %s: \"%s\"\n" -#: fe-connect.c:1275 -#, c-format -msgid "invalid sslmode value: \"%s\"\n" -msgstr "неверное значение sslmode: \"%s\"\n" - -#: fe-connect.c:1296 +#: fe-connect.c:1315 #, c-format msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" msgstr "значение sslmode \"%s\" недопустимо для сборки без поддержки SSL\n" -#: fe-connect.c:1317 -#, c-format -msgid "invalid ssl_min_protocol_version value: \"%s\"\n" -msgstr "неверное значение ssl_min_protocol_version: \"%s\"\n" - -#: fe-connect.c:1325 -#, c-format -msgid "invalid ssl_max_protocol_version value: \"%s\"\n" -msgstr "неверное значение ssl_max_protocol_version: \"%s\"\n" - -#: fe-connect.c:1342 +#: fe-connect.c:1363 msgid "invalid SSL protocol version range\n" msgstr "неверный диапазон версий протокола SSL\n" -#: fe-connect.c:1357 -#, c-format -msgid "invalid gssencmode value: \"%s\"\n" -msgstr "неверное значение gssencmode: \"%s\"\n" - -#: fe-connect.c:1366 +#: fe-connect.c:1388 #, c-format msgid "" "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" msgstr "" "значение gssencmode \"%s\" недопустимо для сборки без поддержки GSSAPI\n" -#: fe-connect.c:1401 -#, c-format -msgid "invalid target_session_attrs value: \"%s\"\n" -msgstr "неверное значение target_session_attrs: \"%s\"\n" - -#: fe-connect.c:1619 +#: fe-connect.c:1648 #, c-format msgid "could not set socket to TCP no delay mode: %s\n" msgstr "не удалось перевести сокет в режим TCP-передачи без задержки: %s\n" -#: fe-connect.c:1680 +#: fe-connect.c:1710 #, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running locally and accepting\n" -"\tconnections on Unix domain socket \"%s\"?\n" -msgstr "" -"не удалось подключиться к серверу: %s\n" -"\tОн действительно работает локально и принимает\n" -"\tсоединения через Unix-сокет \"%s\"?\n" +msgid "connection to server on socket \"%s\" failed: " +msgstr "подключиться к серверу через сокет \"%s\" не удалось: " -#: fe-connect.c:1717 +#: fe-connect.c:1737 #, c-format +msgid "connection to server at \"%s\" (%s), port %s failed: " +msgstr "подключиться к серверу \"%s\" (%s), порту %s не удалось: " + +#: fe-connect.c:1742 +#, c-format +msgid "connection to server at \"%s\", port %s failed: " +msgstr "подключиться к серверу \"%s\", порту %s не удалось: " + +#: fe-connect.c:1767 msgid "" -"could not connect to server: %s\n" -"\tIs the server running on host \"%s\" (%s) and accepting\n" -"\tTCP/IP connections on port %s?\n" +"\tIs the server running locally and accepting connections on that socket?\n" msgstr "" -"не удалось подключиться к серверу: %s\n" -"\tОн действительно работает по адресу \"%s\" (%s)\n" -"\t и принимает TCP-соединения (порт %s)?\n" +"\tСервер действительно работает локально и принимает подключения через этот " +"сокет?\n" -#: fe-connect.c:1725 -#, c-format +#: fe-connect.c:1771 msgid "" -"could not connect to server: %s\n" -"\tIs the server running on host \"%s\" and accepting\n" -"\tTCP/IP connections on port %s?\n" +"\tIs the server running on that host and accepting TCP/IP connections?\n" msgstr "" -"не удалось подключиться к серверу: %s\n" -"\tОн действительно работает по адресу \"%s\"\n" -"\t и принимает TCP-соединения (порт %s)?\n" +"\tСервер действительно работает по данному адресу и принимает TCP-" +"соединения?\n" -#: fe-connect.c:1795 +#: fe-connect.c:1835 #, c-format msgid "invalid integer value \"%s\" for connection option \"%s\"\n" msgstr "" "неверное целочисленное значение \"%s\" для параметра соединения \"%s\"\n" -#: fe-connect.c:1825 fe-connect.c:1859 fe-connect.c:1894 fe-connect.c:1981 -#: fe-connect.c:2623 +#: fe-connect.c:1865 fe-connect.c:1900 fe-connect.c:1936 fe-connect.c:2025 +#: fe-connect.c:2639 #, c-format -msgid "setsockopt(%s) failed: %s\n" -msgstr "ошибка в setsockopt(%s): %s\n" +msgid "%s(%s) failed: %s\n" +msgstr "ошибка в %s(%s): %s\n" -#: fe-connect.c:1947 +#: fe-connect.c:1990 #, c-format -msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" -msgstr "ошибка в WSAIoctl(SIO_KEEPALIVE_VALS): %ui\n" +msgid "%s(%s) failed: error code %d\n" +msgstr "ошибка в %s(%s): код ошибки %d\n" -#: fe-connect.c:2313 +#: fe-connect.c:2305 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "неверное состояние соединения - возможно разрушение памяти\n" -#: fe-connect.c:2379 +#: fe-connect.c:2384 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "неверный номер порта: \"%s\"\n" -#: fe-connect.c:2395 +#: fe-connect.c:2400 #, c-format msgid "could not translate host name \"%s\" to address: %s\n" msgstr "преобразовать имя \"%s\" в адрес не удалось: %s\n" -#: fe-connect.c:2408 +#: fe-connect.c:2413 #, c-format msgid "could not parse network address \"%s\": %s\n" msgstr "не удалось разобрать сетевой адрес \"%s\": %s\n" -#: fe-connect.c:2421 +#: fe-connect.c:2426 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" msgstr "длина пути Unix-сокета \"%s\" превышает предел (%d байт)\n" -#: fe-connect.c:2436 +#: fe-connect.c:2441 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" msgstr "преобразовать путь Unix-сокета \"%s\" в адрес не удалось: %s\n" -#: fe-connect.c:2560 +#: fe-connect.c:2567 #, c-format msgid "could not create socket: %s\n" msgstr "не удалось создать сокет: %s\n" -#: fe-connect.c:2582 +#: fe-connect.c:2598 #, c-format msgid "could not set socket to nonblocking mode: %s\n" msgstr "не удалось перевести сокет в неблокирующий режим: %s\n" -#: fe-connect.c:2592 +#: fe-connect.c:2608 #, c-format msgid "could not set socket to close-on-exec mode: %s\n" msgstr "" "не удалось перевести сокет в режим закрытия при выполнении (close-on-exec): " "%s\n" -#: fe-connect.c:2610 +#: fe-connect.c:2626 msgid "keepalives parameter must be an integer\n" msgstr "параметр keepalives должен быть целым числом\n" -#: fe-connect.c:2750 +#: fe-connect.c:2767 #, c-format msgid "could not get socket error status: %s\n" msgstr "не удалось получить статус ошибки сокета: %s\n" -#: fe-connect.c:2778 +#: fe-connect.c:2795 #, c-format msgid "could not get client address from socket: %s\n" msgstr "не удалось получить адрес клиента из сокета: %s\n" -#: fe-connect.c:2820 +#: fe-connect.c:2837 msgid "requirepeer parameter is not supported on this platform\n" msgstr "параметр requirepeer не поддерживается в этой ОС\n" -#: fe-connect.c:2823 +#: fe-connect.c:2840 #, c-format msgid "could not get peer credentials: %s\n" msgstr "не удалось получить учётные данные сервера: %s\n" -#: fe-connect.c:2847 +#: fe-connect.c:2864 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" msgstr "" "requirepeer допускает подключение только к \"%s\", но сервер работает под " "именем \"%s\"\n" -#: fe-connect.c:2887 +#: fe-connect.c:2904 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "не удалось отправить пакет согласования GSSAPI: %s\n" -#: fe-connect.c:2899 +#: fe-connect.c:2916 msgid "" "GSSAPI encryption required but was impossible (possibly no credential cache, " "no server support, or using a local socket)\n" @@ -459,152 +441,170 @@ msgstr "" "отсутствует кеш учётных данных, нет поддержки на сервере или используется " "локальный сокет)\n" -#: fe-connect.c:2931 +#: fe-connect.c:2958 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "не удалось отправить пакет согласования SSL: %s\n" -#: fe-connect.c:2970 +#: fe-connect.c:2989 #, c-format msgid "could not send startup packet: %s\n" msgstr "не удалось отправить стартовый пакет: %s\n" -#: fe-connect.c:3040 +#: fe-connect.c:3065 msgid "server does not support SSL, but SSL was required\n" msgstr "затребовано подключение через SSL, но сервер не поддерживает SSL\n" -#: fe-connect.c:3067 +#: fe-connect.c:3092 #, c-format msgid "received invalid response to SSL negotiation: %c\n" msgstr "получен неверный ответ при согласовании SSL: %c\n" -#: fe-connect.c:3156 +#: fe-connect.c:3113 +msgid "received unencrypted data after SSL response\n" +msgstr "после ответа SSL получены незашифрованные данные\n" + +#: fe-connect.c:3194 msgid "server doesn't support GSSAPI encryption, but it was required\n" msgstr "затребовано шифрование GSSAPI, но сервер его не поддерживает\n" -#: fe-connect.c:3168 +#: fe-connect.c:3206 #, c-format msgid "received invalid response to GSSAPI negotiation: %c\n" msgstr "получен неверный ответ при согласовании GSSAPI: %c\n" -#: fe-connect.c:3234 fe-connect.c:3265 +#: fe-connect.c:3225 +msgid "received unencrypted data after GSSAPI encryption response\n" +msgstr "" +"после ответа на запрос шифрования GSSAPI получены незашифрованные данные\n" + +#: fe-connect.c:3285 fe-connect.c:3310 #, c-format msgid "expected authentication request from server, but received %c\n" msgstr "ожидался запрос аутентификации от сервера, но получено: %c\n" -#: fe-connect.c:3506 +#: fe-connect.c:3517 msgid "unexpected message from server during startup\n" msgstr "неожиданное сообщение от сервера в начале работы\n" -#: fe-connect.c:3711 -#, c-format -msgid "could not make a writable connection to server \"%s:%s\"\n" -msgstr "" -"не удалось установить подключение для чтения/записи к серверу \"%s:%s\"\n" +#: fe-connect.c:3609 +msgid "session is read-only\n" +msgstr "сеанс не допускает запись\n" -#: fe-connect.c:3757 +#: fe-connect.c:3612 +msgid "session is not read-only\n" +msgstr "сеанс допускает запись\n" + +#: fe-connect.c:3666 +msgid "server is in hot standby mode\n" +msgstr "сервер работает в режиме горячего резерва\n" + +#: fe-connect.c:3669 +msgid "server is not in hot standby mode\n" +msgstr "сервер работает не в режиме горячего резерва\n" + +#: fe-connect.c:3787 fe-connect.c:3839 #, c-format -msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" -msgstr "" -"проверка \"SHOW transaction_read_only\" не пройдена на сервере \"%s:%s\"\n" +msgid "\"%s\" failed\n" +msgstr "выполнить \"%s\" не удалось\n" -#: fe-connect.c:3772 +#: fe-connect.c:3853 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption\n" msgstr "неверное состояние соединения %d - возможно разрушение памяти\n" -#: fe-connect.c:4211 fe-connect.c:4271 +#: fe-connect.c:4299 fe-connect.c:4359 #, c-format msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" msgstr "ошибка в PGEventProc \"%s\" при обработке события PGEVT_CONNRESET\n" -#: fe-connect.c:4618 +#: fe-connect.c:4719 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" msgstr "некорректный адрес LDAP \"%s\": схема должна быть ldap://\n" -#: fe-connect.c:4633 +#: fe-connect.c:4734 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" msgstr "некорректный адрес LDAP \"%s\": отсутствует уникальное имя\n" -#: fe-connect.c:4645 fe-connect.c:4700 +#: fe-connect.c:4746 fe-connect.c:4804 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" msgstr "некорректный адрес LDAP \"%s\": должен быть только один атрибут\n" -#: fe-connect.c:4656 fe-connect.c:4715 +#: fe-connect.c:4758 fe-connect.c:4820 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" msgstr "" "некорректный адрес LDAP \"%s\": не указана область поиска (base/one/sub)\n" -#: fe-connect.c:4667 +#: fe-connect.c:4770 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "некорректный адрес LDAP \"%s\": нет фильтра\n" -#: fe-connect.c:4688 +#: fe-connect.c:4792 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" msgstr "некорректный адрес LDAP \"%s\": неверный номер порта\n" -#: fe-connect.c:4724 +#: fe-connect.c:4830 msgid "could not create LDAP structure\n" msgstr "не удалось создать структуру LDAP\n" -#: fe-connect.c:4800 +#: fe-connect.c:4906 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "ошибка поиска на сервере LDAP: %s\n" -#: fe-connect.c:4811 +#: fe-connect.c:4917 msgid "more than one entry found on LDAP lookup\n" msgstr "при поиске LDAP найдено более одного вхождения\n" -#: fe-connect.c:4812 fe-connect.c:4824 +#: fe-connect.c:4918 fe-connect.c:4930 msgid "no entry found on LDAP lookup\n" msgstr "при поиске LDAP ничего не найдено\n" -#: fe-connect.c:4835 fe-connect.c:4848 +#: fe-connect.c:4941 fe-connect.c:4954 msgid "attribute has no values on LDAP lookup\n" msgstr "атрибут не содержит значений при поиске LDAP\n" -#: fe-connect.c:4900 fe-connect.c:4919 fe-connect.c:5451 +#: fe-connect.c:5006 fe-connect.c:5025 fe-connect.c:5557 #, c-format msgid "missing \"=\" after \"%s\" in connection info string\n" msgstr "в строке соединения нет \"=\" после \"%s\"\n" -#: fe-connect.c:4992 fe-connect.c:5636 fe-connect.c:6410 +#: fe-connect.c:5098 fe-connect.c:5742 fe-connect.c:6518 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "неверный параметр соединения \"%s\"\n" -#: fe-connect.c:5008 fe-connect.c:5500 +#: fe-connect.c:5114 fe-connect.c:5606 msgid "unterminated quoted string in connection info string\n" msgstr "в строке соединения не хватает закрывающей кавычки\n" -#: fe-connect.c:5091 +#: fe-connect.c:5195 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "определение службы \"%s\" не найдено\n" -#: fe-connect.c:5114 +#: fe-connect.c:5221 #, c-format msgid "service file \"%s\" not found\n" msgstr "файл определений служб \"%s\" не найден\n" -#: fe-connect.c:5129 +#: fe-connect.c:5235 #, c-format msgid "line %d too long in service file \"%s\"\n" msgstr "слишком длинная строка (%d) в файле определений служб \"%s\"\n" -#: fe-connect.c:5201 fe-connect.c:5245 +#: fe-connect.c:5306 fe-connect.c:5350 #, c-format msgid "syntax error in service file \"%s\", line %d\n" msgstr "синтаксическая ошибка в файле определения служб \"%s\" (строка %d)\n" -#: fe-connect.c:5212 +#: fe-connect.c:5317 #, c-format msgid "" "nested service specifications not supported in service file \"%s\", line %d\n" @@ -612,24 +612,24 @@ msgstr "" "рекурсивные определения служб не поддерживаются (файл определения служб \"%s" "\", строка %d)\n" -#: fe-connect.c:5932 +#: fe-connect.c:6038 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"\n" msgstr "во внутреннюю процедуру разбора строки передан ошибочный URI: \"%s\"\n" -#: fe-connect.c:6009 +#: fe-connect.c:6115 #, c-format msgid "" "end of string reached when looking for matching \"]\" in IPv6 host address " "in URI: \"%s\"\n" msgstr "URI не содержит символ \"]\" после адреса IPv6: \"%s\"\n" -#: fe-connect.c:6016 +#: fe-connect.c:6122 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"\n" msgstr "IPv6, содержащийся в URI, не может быть пустым: \"%s\"\n" -#: fe-connect.c:6031 +#: fe-connect.c:6137 #, c-format msgid "" "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): " @@ -638,41 +638,41 @@ msgstr "" "неожиданный символ \"%c\" в позиции %d в URI (ожидалось \":\" или \"/\"): " "\"%s\"\n" -#: fe-connect.c:6160 +#: fe-connect.c:6267 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "лишний разделитель ключа/значения \"=\" в параметрах URI: \"%s\"\n" -#: fe-connect.c:6180 +#: fe-connect.c:6287 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "в параметрах URI не хватает разделителя ключа/значения \"=\": \"%s\"\n" -#: fe-connect.c:6231 +#: fe-connect.c:6339 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "неверный параметр в URI: \"%s\"\n" -#: fe-connect.c:6305 +#: fe-connect.c:6413 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "неверный символ, закодированный с %%: \"%s\"\n" -#: fe-connect.c:6315 +#: fe-connect.c:6423 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" msgstr "недопустимое значение %%00 для символа, закодированного с %%: \"%s\"\n" -#: fe-connect.c:6678 +#: fe-connect.c:6793 msgid "connection pointer is NULL\n" msgstr "нулевой указатель соединения\n" -#: fe-connect.c:6974 +#: fe-connect.c:7081 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ПРЕДУПРЕЖДЕНИЕ: файл паролей \"%s\" - не обычный файл\n" -#: fe-connect.c:6983 +#: fe-connect.c:7090 #, c-format msgid "" "WARNING: password file \"%s\" has group or world access; permissions should " @@ -681,130 +681,147 @@ msgstr "" "ПРЕДУПРЕЖДЕНИЕ: к файлу паролей \"%s\" имеют доступ все или группа; права " "должны быть u=rw (0600) или более ограниченные\n" -#: fe-connect.c:7091 +#: fe-connect.c:7198 #, c-format msgid "password retrieved from file \"%s\"\n" msgstr "пароль получен из файла \"%s\"\n" -#: fe-exec.c:444 fe-exec.c:2821 +#: fe-exec.c:449 fe-exec.c:3300 #, c-format msgid "row number %d is out of range 0..%d" msgstr "номер записи %d вне диапазона 0..%d" -#: fe-exec.c:505 fe-protocol2.c:497 fe-protocol2.c:532 fe-protocol2.c:1050 -#: fe-protocol3.c:206 fe-protocol3.c:233 fe-protocol3.c:250 fe-protocol3.c:330 -#: fe-protocol3.c:723 fe-protocol3.c:954 +#: fe-exec.c:510 fe-protocol3.c:219 fe-protocol3.c:244 fe-protocol3.c:273 +#: fe-protocol3.c:291 fe-protocol3.c:371 fe-protocol3.c:743 msgid "out of memory" msgstr "нехватка памяти" -#: fe-exec.c:506 fe-protocol2.c:1396 fe-protocol3.c:1907 +#: fe-exec.c:511 fe-protocol3.c:1939 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:815 +#: fe-exec.c:792 msgid "write to server failed\n" msgstr "ошибка при передаче данных серверу\n" -#: fe-exec.c:896 +#: fe-exec.c:864 msgid "NOTICE" msgstr "ЗАМЕЧАНИЕ" -#: fe-exec.c:954 +#: fe-exec.c:922 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult не может вместить больше чем INT_MAX кортежей" -#: fe-exec.c:966 +#: fe-exec.c:934 msgid "size_t overflow" msgstr "переполнение size_t" -#: fe-exec.c:1243 fe-exec.c:1301 fe-exec.c:1347 +#: fe-exec.c:1349 fe-exec.c:1454 fe-exec.c:1503 msgid "command string is a null pointer\n" msgstr "указатель на командную строку нулевой\n" -#: fe-exec.c:1307 fe-exec.c:1353 fe-exec.c:1448 -msgid "number of parameters must be between 0 and 65535\n" -msgstr "число параметров должно быть от 0 до 65535\n" +#: fe-exec.c:1460 fe-exec.c:1509 fe-exec.c:1605 +#, c-format +msgid "number of parameters must be between 0 and %d\n" +msgstr "число параметров должно быть от 0 до %d\n" -#: fe-exec.c:1341 fe-exec.c:1442 +#: fe-exec.c:1497 fe-exec.c:1599 msgid "statement name is a null pointer\n" msgstr "указатель на имя оператора нулевой\n" -#: fe-exec.c:1361 fe-exec.c:1524 fe-exec.c:2233 fe-exec.c:2435 -msgid "function requires at least protocol version 3.0\n" -msgstr "функция требует протокол минимум версии 3.0\n" - -#: fe-exec.c:1479 +#: fe-exec.c:1641 fe-exec.c:3153 msgid "no connection to the server\n" msgstr "нет соединения с сервером\n" -#: fe-exec.c:1486 +#: fe-exec.c:1650 fe-exec.c:3162 msgid "another command is already in progress\n" msgstr "уже выполняется другая команда\n" -#: fe-exec.c:1600 +#: fe-exec.c:1679 +msgid "cannot queue commands during COPY\n" +msgstr "во время COPY нельзя добавлять команды в очередь\n" + +#: fe-exec.c:1797 msgid "length must be given for binary parameter\n" msgstr "для двоичного параметра должна быть указана длина\n" -#: fe-exec.c:1863 +#: fe-exec.c:2117 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "неожиданный asyncStatus: %d\n" -#: fe-exec.c:1883 +#: fe-exec.c:2137 #, c-format msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" msgstr "ошибка в PGEventProc \"%s\" при обработке события PGEVT_RESULTCREATE\n" -#: fe-exec.c:2043 +#: fe-exec.c:2285 +msgid "" +"synchronous command execution functions are not allowed in pipeline mode\n" +msgstr "" +"функции синхронного выполнения команд не допускаются в конвейерном режиме\n" + +#: fe-exec.c:2307 msgid "COPY terminated by new PQexec" msgstr "операция COPY прервана вызовом PQexec" -#: fe-exec.c:2051 -msgid "COPY IN state must be terminated first\n" -msgstr "сначала должно завершиться состояние COPY IN\n" - -#: fe-exec.c:2071 -msgid "COPY OUT state must be terminated first\n" -msgstr "сначала должно завершиться состояние COPY OUT\n" - -#: fe-exec.c:2079 +#: fe-exec.c:2324 msgid "PQexec not allowed during COPY BOTH\n" msgstr "вызов PQexec не допускается в процессе COPY BOTH\n" -#: fe-exec.c:2325 fe-exec.c:2392 fe-exec.c:2482 fe-protocol2.c:1353 -#: fe-protocol3.c:1838 +#: fe-exec.c:2552 fe-exec.c:2608 fe-exec.c:2677 fe-protocol3.c:1870 msgid "no COPY in progress\n" msgstr "операция COPY не выполняется\n" -#: fe-exec.c:2672 +#: fe-exec.c:2854 +msgid "PQfn not allowed in pipeline mode\n" +msgstr "PQfn не допускается в конвейерном режиме\n" + +#: fe-exec.c:2862 msgid "connection in wrong state\n" msgstr "соединение в неправильном состоянии\n" -#: fe-exec.c:2703 +#: fe-exec.c:2906 +msgid "cannot enter pipeline mode, connection not idle\n" +msgstr "перейти в конвейерный режиме нельзя, соединение не простаивает\n" + +#: fe-exec.c:2940 fe-exec.c:2957 +msgid "cannot exit pipeline mode with uncollected results\n" +msgstr "выйти из конвейерного режима нельзя, не собрав все результаты\n" + +#: fe-exec.c:2945 +msgid "cannot exit pipeline mode while busy\n" +msgstr "выйти из конвейерного режима в занятом состоянии нельзя\n" + +#: fe-exec.c:3087 +msgid "cannot send pipeline when not in pipeline mode\n" +msgstr "отправить конвейер, не перейдя в конвейерный режим, нельзя\n" + +#: fe-exec.c:3189 msgid "invalid ExecStatusType code" msgstr "неверный код ExecStatusType" -#: fe-exec.c:2730 +#: fe-exec.c:3216 msgid "PGresult is not an error result\n" msgstr "В PGresult не передан результат ошибки\n" -#: fe-exec.c:2805 fe-exec.c:2828 +#: fe-exec.c:3284 fe-exec.c:3307 #, c-format msgid "column number %d is out of range 0..%d" msgstr "номер столбца %d вне диапазона 0..%d" -#: fe-exec.c:2843 +#: fe-exec.c:3322 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "номер параметра %d вне диапазона 0..%d" -#: fe-exec.c:3153 +#: fe-exec.c:3632 #, c-format msgid "could not interpret result from server: %s" msgstr "не удалось интерпретировать ответ сервера: %s" -#: fe-exec.c:3392 fe-exec.c:3476 +#: fe-exec.c:3892 fe-exec.c:3981 msgid "incomplete multibyte character\n" msgstr "неполный многобайтный символ\n" @@ -812,105 +829,60 @@ msgstr "неполный многобайтный символ\n" msgid "GSSAPI name import error" msgstr "ошибка импорта имени в GSSAPI" -#: fe-lobj.c:154 -msgid "cannot determine OID of function lo_truncate\n" -msgstr "не удалось определить OID функции lo_truncate\n" +#: fe-lobj.c:145 fe-lobj.c:210 fe-lobj.c:403 fe-lobj.c:494 fe-lobj.c:568 +#: fe-lobj.c:969 fe-lobj.c:977 fe-lobj.c:985 fe-lobj.c:993 fe-lobj.c:1001 +#: fe-lobj.c:1009 fe-lobj.c:1017 fe-lobj.c:1025 +#, c-format +msgid "cannot determine OID of function %s\n" +msgstr "определить OID функции %s нельзя\n" -#: fe-lobj.c:170 +#: fe-lobj.c:162 msgid "argument of lo_truncate exceeds integer range\n" msgstr "аргумент lo_truncate не умещается в обычном целом\n" -#: fe-lobj.c:221 -msgid "cannot determine OID of function lo_truncate64\n" -msgstr "не удалось определить OID функции lo_truncate64\n" - -#: fe-lobj.c:279 +#: fe-lobj.c:266 msgid "argument of lo_read exceeds integer range\n" msgstr "аргумент lo_read не умещается в обычном целом\n" -#: fe-lobj.c:334 +#: fe-lobj.c:318 msgid "argument of lo_write exceeds integer range\n" msgstr "аргумент lo_write не умещается в обычном целом\n" -#: fe-lobj.c:425 -msgid "cannot determine OID of function lo_lseek64\n" -msgstr "не удалось определить OID функции lo_lseek64\n" - -#: fe-lobj.c:521 -msgid "cannot determine OID of function lo_create\n" -msgstr "не удалось определить OID функции lo_create\n" - -#: fe-lobj.c:600 -msgid "cannot determine OID of function lo_tell64\n" -msgstr "не удалось определить OID функции lo_tell64\n" - -#: fe-lobj.c:706 fe-lobj.c:815 +#: fe-lobj.c:678 fe-lobj.c:789 #, c-format msgid "could not open file \"%s\": %s\n" msgstr "не удалось открыть файл \"%s\": %s\n" -#: fe-lobj.c:761 +#: fe-lobj.c:734 #, c-format msgid "could not read from file \"%s\": %s\n" msgstr "не удалось прочитать файл \"%s\": %s\n" -#: fe-lobj.c:835 fe-lobj.c:859 +#: fe-lobj.c:810 fe-lobj.c:834 #, c-format msgid "could not write to file \"%s\": %s\n" msgstr "не удалось записать файл \"%s\": %s\n" -#: fe-lobj.c:946 +#: fe-lobj.c:920 msgid "query to initialize large object functions did not return data\n" msgstr "запрос инициализации функций для больших объектов не вернул данные\n" -#: fe-lobj.c:995 -msgid "cannot determine OID of function lo_open\n" -msgstr "не удалось определить OID функции lo_open\n" - -#: fe-lobj.c:1002 -msgid "cannot determine OID of function lo_close\n" -msgstr "не удалось определить OID функции lo_close\n" - -#: fe-lobj.c:1009 -msgid "cannot determine OID of function lo_creat\n" -msgstr "не удалось определить OID функции lo_creat\n" - -#: fe-lobj.c:1016 -msgid "cannot determine OID of function lo_unlink\n" -msgstr "не удалось определить OID функции lo_unlink\n" - -#: fe-lobj.c:1023 -msgid "cannot determine OID of function lo_lseek\n" -msgstr "не удалось определить OID функции lo_lseek\n" - -#: fe-lobj.c:1030 -msgid "cannot determine OID of function lo_tell\n" -msgstr "не удалось определить OID функции lo_tell\n" - -#: fe-lobj.c:1037 -msgid "cannot determine OID of function loread\n" -msgstr "не удалось определить OID функции loread\n" - -#: fe-lobj.c:1044 -msgid "cannot determine OID of function lowrite\n" -msgstr "не удалось определить OID функции lowrite\n" - -#: fe-misc.c:289 +#: fe-misc.c:242 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "функция pqGetInt не поддерживает integer размером %lu байт" -#: fe-misc.c:325 +#: fe-misc.c:275 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "функция pqPutInt не поддерживает integer размером %lu байт" -#: fe-misc.c:636 fe-misc.c:869 +#: fe-misc.c:576 fe-misc.c:822 msgid "connection not open\n" msgstr "соединение не открыто\n" -#: fe-misc.c:805 fe-secure-openssl.c:209 fe-secure-openssl.c:316 -#: fe-secure.c:267 fe-secure.c:383 +#: fe-misc.c:755 fe-secure-openssl.c:209 fe-secure-openssl.c:316 +#: fe-secure.c:260 fe-secure.c:373 msgid "" "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" @@ -920,197 +892,151 @@ msgstr "" "\tСкорее всего сервер прекратил работу из-за сбоя\n" "\tдо или в процессе выполнения запроса.\n" -#: fe-misc.c:1063 +#: fe-misc.c:1015 msgid "timeout expired\n" msgstr "тайм-аут\n" -#: fe-misc.c:1108 +#: fe-misc.c:1060 msgid "invalid socket\n" msgstr "неверный сокет\n" -#: fe-misc.c:1131 -#, c-format -msgid "select() failed: %s\n" -msgstr "ошибка в select(): %s\n" - -#: fe-protocol2.c:87 -#, c-format -msgid "invalid setenv state %c, probably indicative of memory corruption\n" -msgstr "неверное состояние setenv %c - возможно разрушение памяти\n" - -#: fe-protocol2.c:384 +#: fe-misc.c:1083 #, c-format -msgid "invalid state %c, probably indicative of memory corruption\n" -msgstr "неверное состояние %c - возможно разрушение памяти\n" +msgid "%s() failed: %s\n" +msgstr "ошибка в %s(): %s\n" -#: fe-protocol2.c:473 fe-protocol3.c:183 +#: fe-protocol3.c:196 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "от сервера во время простоя получено сообщение типа 0x%02x" -#: fe-protocol2.c:523 -#, c-format -msgid "unexpected character %c following empty query response (\"I\" message)" -msgstr "неожиданный символ %c вслед за пустым ответом (сообщение \"I\")" - -#: fe-protocol2.c:589 -#, c-format +#: fe-protocol3.c:403 msgid "" "server sent data (\"D\" message) without prior row description (\"T\" " -"message)" +"message)\n" msgstr "" "сервер отправил данные (сообщение \"D\") без предварительного описания " -"строки (сообщение \"T\")" - -#: fe-protocol2.c:607 -#, c-format -msgid "" -"server sent binary data (\"B\" message) without prior row description (\"T\" " -"message)" -msgstr "" -"сервер отправил двоичные данные (сообщение \"B\") без предварительного " -"описания строки (сообщение \"T\")" +"строки (сообщение \"T\")\n" -#: fe-protocol2.c:626 fe-protocol3.c:408 +#: fe-protocol3.c:446 #, c-format msgid "unexpected response from server; first received character was \"%c\"\n" msgstr "неожиданный ответ сервера; первый полученный символ: \"%c\"\n" -#: fe-protocol2.c:755 fe-protocol2.c:930 fe-protocol3.c:622 fe-protocol3.c:849 -msgid "out of memory for query result" -msgstr "недостаточно памяти для результата запроса" - -#: fe-protocol2.c:1408 -#, c-format -msgid "lost synchronization with server, resetting connection" -msgstr "потеряна синхронизация с сервером; попытка восстановить соединение" - -#: fe-protocol2.c:1530 fe-protocol2.c:1562 fe-protocol3.c:2095 -#, c-format -msgid "protocol error: id=0x%x\n" -msgstr "ошибка протокола: id=0x%x\n" - -#: fe-protocol3.c:365 -msgid "" -"server sent data (\"D\" message) without prior row description (\"T\" " -"message)\n" -msgstr "" -"сервер отправил данные (сообщение \"D\") без предварительного описания " -"строки (сообщение \"T\")\n" - -#: fe-protocol3.c:429 +#: fe-protocol3.c:471 #, c-format msgid "message contents do not agree with length in message type \"%c\"\n" msgstr "содержимое не соответствует длине в сообщении типа \"%c\"\n" -#: fe-protocol3.c:449 +#: fe-protocol3.c:491 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d\n" msgstr "" "потеряна синхронизация с сервером: получено сообщение типа \"%c\", длина %d\n" -#: fe-protocol3.c:500 fe-protocol3.c:540 +#: fe-protocol3.c:543 fe-protocol3.c:583 msgid "insufficient data in \"T\" message" msgstr "недостаточно данных в сообщении \"T\"" -#: fe-protocol3.c:573 -msgid "extraneous data in \"T\" message" -msgstr "лишние данные в сообщении \"T\"" +#: fe-protocol3.c:654 fe-protocol3.c:860 +msgid "out of memory for query result" +msgstr "недостаточно памяти для результата запроса" -#: fe-protocol3.c:686 -msgid "extraneous data in \"t\" message" -msgstr "лишние данные в сообщении \"t\"" +#: fe-protocol3.c:723 +msgid "insufficient data in \"t\" message" +msgstr "недостаточно данных в сообщении \"t\"" -#: fe-protocol3.c:757 fe-protocol3.c:789 fe-protocol3.c:807 +#: fe-protocol3.c:782 fe-protocol3.c:814 fe-protocol3.c:832 msgid "insufficient data in \"D\" message" msgstr "недостаточно данных в сообщении \"D\"" -#: fe-protocol3.c:763 +#: fe-protocol3.c:788 msgid "unexpected field count in \"D\" message" msgstr "неверное число полей в сообщении \"D\"" -#: fe-protocol3.c:816 -msgid "extraneous data in \"D\" message" -msgstr "лишние данные в сообщении \"D\"" - -#: fe-protocol3.c:1008 +#: fe-protocol3.c:1036 msgid "no error message available\n" msgstr "нет сообщения об ошибке\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1056 fe-protocol3.c:1075 +#: fe-protocol3.c:1084 fe-protocol3.c:1103 #, c-format msgid " at character %s" msgstr " символ %s" -#: fe-protocol3.c:1088 +#: fe-protocol3.c:1116 #, c-format msgid "DETAIL: %s\n" msgstr "ПОДРОБНОСТИ: %s\n" -#: fe-protocol3.c:1091 +#: fe-protocol3.c:1119 #, c-format msgid "HINT: %s\n" msgstr "ПОДСКАЗКА: %s\n" -#: fe-protocol3.c:1094 +#: fe-protocol3.c:1122 #, c-format msgid "QUERY: %s\n" msgstr "ЗАПРОС: %s\n" -#: fe-protocol3.c:1101 +#: fe-protocol3.c:1129 #, c-format msgid "CONTEXT: %s\n" msgstr "КОНТЕКСТ: %s\n" -#: fe-protocol3.c:1110 +#: fe-protocol3.c:1138 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "СХЕМА: %s\n" -#: fe-protocol3.c:1114 +#: fe-protocol3.c:1142 #, c-format msgid "TABLE NAME: %s\n" msgstr "ТАБЛИЦА: %s\n" -#: fe-protocol3.c:1118 +#: fe-protocol3.c:1146 #, c-format msgid "COLUMN NAME: %s\n" msgstr "СТОЛБЕЦ: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1150 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "ТИП ДАННЫХ: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1154 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "ОГРАНИЧЕНИЕ: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1166 msgid "LOCATION: " msgstr "ПОЛОЖЕНИЕ: " -#: fe-protocol3.c:1140 +#: fe-protocol3.c:1168 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1170 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1337 +#: fe-protocol3.c:1365 #, c-format msgid "LINE %d: " msgstr "СТРОКА %d: " -#: fe-protocol3.c:1732 +#: fe-protocol3.c:1764 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline можно вызывать только во время COPY OUT с текстом\n" +#: fe-protocol3.c:2130 +#, c-format +msgid "protocol error: id=0x%x\n" +msgstr "ошибка протокола: id=0x%x\n" + #: fe-secure-common.c:124 msgid "SSL certificate's name contains embedded null\n" msgstr "имя в SSL-сертификате включает нулевой байт\n" @@ -1167,16 +1093,16 @@ msgstr "ошибка проверки размера в GSSAPI" msgid "GSSAPI context establishment error" msgstr "ошибка установления контекста в GSSAPI" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1291 +#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1333 #, c-format msgid "SSL SYSCALL error: %s\n" msgstr "ошибка SSL SYSCALL: %s\n" -#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1295 +#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1337 msgid "SSL SYSCALL error: EOF detected\n" msgstr "ошибка SSL SYSCALL: конец файла (EOF)\n" -#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1304 +#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1346 #, c-format msgid "SSL error: %s\n" msgstr "ошибка SSL: %s\n" @@ -1185,7 +1111,7 @@ msgstr "ошибка SSL: %s\n" msgid "SSL connection has been closed unexpectedly\n" msgstr "SSL-соединение было неожиданно закрыто\n" -#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1354 +#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1396 #, c-format msgid "unrecognized SSL error code: %d\n" msgstr "нераспознанный код ошибки SSL: %d\n" @@ -1207,37 +1133,37 @@ msgstr "не удалось сгенерировать хеш сертифика msgid "SSL certificate's name entry is missing\n" msgstr "запись имени в SSL-сертификате отсутствует\n" -#: fe-secure-openssl.c:815 +#: fe-secure-openssl.c:822 #, c-format msgid "could not create SSL context: %s\n" msgstr "не удалось создать контекст SSL: %s\n" -#: fe-secure-openssl.c:854 +#: fe-secure-openssl.c:861 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version\n" msgstr "неверное значение \"%s\" для минимальной версии протокола SSL\n" -#: fe-secure-openssl.c:865 +#: fe-secure-openssl.c:872 #, c-format msgid "could not set minimum SSL protocol version: %s\n" msgstr "не удалось задать минимальную версию протокола SSL: %s\n" -#: fe-secure-openssl.c:883 +#: fe-secure-openssl.c:890 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version\n" msgstr "неверное значение \"%s\" для максимальной версии протокола SSL\n" -#: fe-secure-openssl.c:894 +#: fe-secure-openssl.c:901 #, c-format msgid "could not set maximum SSL protocol version: %s\n" msgstr "не удалось задать максимальную версию протокола SSL: %s\n" -#: fe-secure-openssl.c:930 +#: fe-secure-openssl.c:937 #, c-format msgid "could not read root certificate file \"%s\": %s\n" msgstr "не удалось прочитать файл корневых сертификатов \"%s\": %s\n" -#: fe-secure-openssl.c:974 +#: fe-secure-openssl.c:990 msgid "" "could not get home directory to locate root certificate file\n" "Either provide the file or change sslmode to disable server certificate " @@ -1247,7 +1173,7 @@ msgstr "" "Укажите полный путь к файлу или отключите проверку сертификата сервера, " "изменив sslmode.\n" -#: fe-secure-openssl.c:978 +#: fe-secure-openssl.c:994 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1258,47 +1184,53 @@ msgstr "" "Укажите полный путь к файлу или отключите проверку сертификата сервера, " "изменив sslmode.\n" -#: fe-secure-openssl.c:1009 +#: fe-secure-openssl.c:1025 #, c-format msgid "could not open certificate file \"%s\": %s\n" msgstr "не удалось открыть файл сертификата \"%s\": %s\n" -#: fe-secure-openssl.c:1028 +#: fe-secure-openssl.c:1044 #, c-format msgid "could not read certificate file \"%s\": %s\n" msgstr "не удалось прочитать файл сертификата \"%s\": %s\n" -#: fe-secure-openssl.c:1053 +#: fe-secure-openssl.c:1069 #, c-format msgid "could not establish SSL connection: %s\n" msgstr "не удалось установить SSL-соединение: %s\n" -#: fe-secure-openssl.c:1107 +#: fe-secure-openssl.c:1103 +#, c-format +msgid "could not set SSL Server Name Indication (SNI): %s\n" +msgstr "" +"не удалось задать SNI (Server Name Indication) для SSL-подключения: %s\n" + +#: fe-secure-openssl.c:1149 #, c-format msgid "could not load SSL engine \"%s\": %s\n" msgstr "не удалось загрузить модуль SSL ENGINE \"%s\": %s\n" -#: fe-secure-openssl.c:1119 +#: fe-secure-openssl.c:1161 #, c-format msgid "could not initialize SSL engine \"%s\": %s\n" msgstr "не удалось инициализировать модуль SSL ENGINE \"%s\": %s\n" -#: fe-secure-openssl.c:1135 +#: fe-secure-openssl.c:1177 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" msgstr "не удалось прочитать закрытый ключ SSL \"%s\" из модуля \"%s\": %s\n" -#: fe-secure-openssl.c:1149 +#: fe-secure-openssl.c:1191 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" msgstr "не удалось загрузить закрытый ключ SSL \"%s\" из модуля \"%s\": %s\n" -#: fe-secure-openssl.c:1186 +#: fe-secure-openssl.c:1228 #, c-format msgid "certificate present, but not private key file \"%s\"\n" msgstr "сертификат присутствует, но файла закрытого ключа \"%s\" нет\n" -#: fe-secure-openssl.c:1194 +#: fe-secure-openssl.c:1236 #, c-format msgid "" "private key file \"%s\" has group or world access; permissions should be " @@ -1307,17 +1239,17 @@ msgstr "" "к файлу закрытого ключа \"%s\" имеют доступ все или группа; права должны " "быть u=rw (0600) или более ограниченные\n" -#: fe-secure-openssl.c:1219 +#: fe-secure-openssl.c:1261 #, c-format msgid "could not load private key file \"%s\": %s\n" msgstr "не удалось загрузить файл закрытого ключа \"%s\": %s\n" -#: fe-secure-openssl.c:1237 +#: fe-secure-openssl.c:1279 #, c-format msgid "certificate does not match private key file \"%s\": %s\n" msgstr "сертификат не соответствует файлу закрытого ключа \"%s\": %s\n" -#: fe-secure-openssl.c:1337 +#: fe-secure-openssl.c:1379 #, c-format msgid "" "This may indicate that the server does not support any SSL protocol version " @@ -1326,32 +1258,32 @@ msgstr "" "Это может указывать на то, что сервер не поддерживает ни одну версию " "протокола SSL между %s и %s.\n" -#: fe-secure-openssl.c:1373 +#: fe-secure-openssl.c:1415 #, c-format msgid "certificate could not be obtained: %s\n" msgstr "не удалось получить сертификат: %s\n" -#: fe-secure-openssl.c:1462 +#: fe-secure-openssl.c:1521 #, c-format msgid "no SSL error reported" msgstr "нет сообщения об ошибке SSL" -#: fe-secure-openssl.c:1471 +#: fe-secure-openssl.c:1530 #, c-format msgid "SSL error code %lu" msgstr "код ошибки SSL: %lu" -#: fe-secure-openssl.c:1718 +#: fe-secure-openssl.c:1778 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "ПРЕДУПРЕЖДЕНИЕ: значение sslpassword усечено\n" -#: fe-secure.c:275 +#: fe-secure.c:267 #, c-format msgid "could not receive data from server: %s\n" msgstr "не удалось получить данные с сервера: %s\n" -#: fe-secure.c:390 +#: fe-secure.c:380 #, c-format msgid "could not send data to server: %s\n" msgstr "не удалось передать данные серверу: %s\n" @@ -1361,6 +1293,122 @@ msgstr "не удалось передать данные серверу: %s\n" msgid "unrecognized socket error: 0x%08X/%d" msgstr "нераспознанная ошибка сокета: 0x%08X/%d" +#~ msgid "invalid channel_binding value: \"%s\"\n" +#~ msgstr "неверное значение channel_binding: \"%s\"\n" + +#~ msgid "invalid ssl_min_protocol_version value: \"%s\"\n" +#~ msgstr "неверное значение ssl_min_protocol_version: \"%s\"\n" + +#~ msgid "invalid ssl_max_protocol_version value: \"%s\"\n" +#~ msgstr "неверное значение ssl_max_protocol_version: \"%s\"\n" + +#~ msgid "invalid gssencmode value: \"%s\"\n" +#~ msgstr "неверное значение gssencmode: \"%s\"\n" + +#~ msgid "invalid target_session_attrs value: \"%s\"\n" +#~ msgstr "неверное значение target_session_attrs: \"%s\"\n" + +#~ msgid "" +#~ "could not connect to server: %s\n" +#~ "\tIs the server running on host \"%s\" (%s) and accepting\n" +#~ "\tTCP/IP connections on port %s?\n" +#~ msgstr "" +#~ "не удалось подключиться к серверу: %s\n" +#~ "\tОн действительно работает по адресу \"%s\" (%s)\n" +#~ "\t и принимает TCP-соединения (порт %s)?\n" + +#~ msgid "setsockopt(%s) failed: %s\n" +#~ msgstr "ошибка в setsockopt(%s): %s\n" + +#~ msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" +#~ msgstr "ошибка в WSAIoctl(SIO_KEEPALIVE_VALS): %ui\n" + +#~ msgid "could not make a writable connection to server \"%s:%s\"\n" +#~ msgstr "" +#~ "не удалось установить подключение для чтения/записи к серверу \"%s:%s\"\n" + +#~ msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" +#~ msgstr "" +#~ "проверка \"SHOW transaction_read_only\" не пройдена на сервере \"%s:%s\"\n" + +#~ msgid "function requires at least protocol version 3.0\n" +#~ msgstr "функция требует протокол минимум версии 3.0\n" + +#~ msgid "COPY IN state must be terminated first\n" +#~ msgstr "сначала должно завершиться состояние COPY IN\n" + +#~ msgid "COPY OUT state must be terminated first\n" +#~ msgstr "сначала должно завершиться состояние COPY OUT\n" + +#~ msgid "cannot determine OID of function lo_truncate\n" +#~ msgstr "не удалось определить OID функции lo_truncate\n" + +#~ msgid "cannot determine OID of function lo_truncate64\n" +#~ msgstr "не удалось определить OID функции lo_truncate64\n" + +#~ msgid "cannot determine OID of function lo_lseek64\n" +#~ msgstr "не удалось определить OID функции lo_lseek64\n" + +#~ msgid "cannot determine OID of function lo_create\n" +#~ msgstr "не удалось определить OID функции lo_create\n" + +#~ msgid "cannot determine OID of function lo_tell64\n" +#~ msgstr "не удалось определить OID функции lo_tell64\n" + +#~ msgid "cannot determine OID of function lo_open\n" +#~ msgstr "не удалось определить OID функции lo_open\n" + +#~ msgid "cannot determine OID of function lo_creat\n" +#~ msgstr "не удалось определить OID функции lo_creat\n" + +#~ msgid "cannot determine OID of function lo_unlink\n" +#~ msgstr "не удалось определить OID функции lo_unlink\n" + +#~ msgid "cannot determine OID of function lo_lseek\n" +#~ msgstr "не удалось определить OID функции lo_lseek\n" + +#~ msgid "cannot determine OID of function loread\n" +#~ msgstr "не удалось определить OID функции loread\n" + +#~ msgid "cannot determine OID of function lowrite\n" +#~ msgstr "не удалось определить OID функции lowrite\n" + +#~ msgid "invalid setenv state %c, probably indicative of memory corruption\n" +#~ msgstr "неверное состояние setenv %c - возможно разрушение памяти\n" + +#~ msgid "invalid state %c, probably indicative of memory corruption\n" +#~ msgstr "неверное состояние %c - возможно разрушение памяти\n" + +#~ msgid "" +#~ "unexpected character %c following empty query response (\"I\" message)" +#~ msgstr "неожиданный символ %c вслед за пустым ответом (сообщение \"I\")" + +#~ msgid "" +#~ "server sent data (\"D\" message) without prior row description (\"T\" " +#~ "message)" +#~ msgstr "" +#~ "сервер отправил данные (сообщение \"D\") без предварительного описания " +#~ "строки (сообщение \"T\")" + +#~ msgid "" +#~ "server sent binary data (\"B\" message) without prior row description (\"T" +#~ "\" message)" +#~ msgstr "" +#~ "сервер отправил двоичные данные (сообщение \"B\") без предварительного " +#~ "описания строки (сообщение \"T\")" + +#~ msgid "lost synchronization with server, resetting connection" +#~ msgstr "потеряна синхронизация с сервером; попытка восстановить соединение" + +#~ msgid "extraneous data in \"T\" message" +#~ msgstr "лишние данные в сообщении \"T\"" + +#~ msgid "extraneous data in \"t\" message" +#~ msgstr "лишние данные в сообщении \"t\"" + +#~ msgid "extraneous data in \"D\" message" +#~ msgstr "лишние данные в сообщении \"D\"" + #~ msgid "SSL library does not support CRL certificates (file \"%s\")\n" #~ msgstr "Библиотека SSL не поддерживает проверку CRL (файл \"%s\")\n" diff --git a/src/interfaces/libpq/po/sv.po b/src/interfaces/libpq/po/sv.po index 6d7f4aaefd..2e4e904fce 100644 --- a/src/interfaces/libpq/po/sv.po +++ b/src/interfaces/libpq/po/sv.po @@ -1,15 +1,15 @@ # Swedish message translation file for libpq # Peter Eisentraut , 2001, 2010. -# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020. +# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. # # Use these quotes: "%s" # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-08-27 21:39+0000\n" -"PO-Revision-Date: 2020-08-30 07:05+0200\n" +"POT-Creation-Date: 2022-05-12 20:09+0000\n" +"PO-Revision-Date: 2022-04-11 22:47+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -18,89 +18,119 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: fe-auth-scram.c:212 +#: ../../port/thread.c:100 ../../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "kunde inte slå upp lokalt användar-id %d: %s" + +#: ../../port/thread.c:105 ../../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "lokal användare med ID %d existerar inte" + +#: fe-auth-scram.c:231 msgid "malformed SCRAM message (empty message)\n" msgstr "felaktigt SCRAM-meddelande (tomt meddelande)\n" -#: fe-auth-scram.c:218 +#: fe-auth-scram.c:237 msgid "malformed SCRAM message (length mismatch)\n" msgstr "felaktigt SCRAM-meddelande (längden stämmer inte)\n" -#: fe-auth-scram.c:265 +#: fe-auth-scram.c:281 +#, c-format +msgid "could not verify server signature: %s\n" +msgstr "kunde inte verifiera serversignaturen: %s\n" + +#: fe-auth-scram.c:288 msgid "incorrect server signature\n" msgstr "felaktig serversignatur\n" -#: fe-auth-scram.c:274 +#: fe-auth-scram.c:297 msgid "invalid SCRAM exchange state\n" msgstr "ogiltig SCRAM-utbytesstatus\n" -#: fe-auth-scram.c:296 +#: fe-auth-scram.c:324 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)\n" msgstr "felaktigt SCRAM-meddelande (förväntade attribut %c)\n" -#: fe-auth-scram.c:305 +#: fe-auth-scram.c:333 #, c-format msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" msgstr "felaktigt SCRAM-meddelande (förväntade tecken \"=\" för attribut '%c')\n" -#: fe-auth-scram.c:346 +#: fe-auth-scram.c:374 msgid "could not generate nonce\n" msgstr "kunde inte skapa engångsnummer\n" -#: fe-auth-scram.c:356 fe-auth-scram.c:431 fe-auth-scram.c:579 -#: fe-auth-scram.c:600 fe-auth-scram.c:626 fe-auth-scram.c:641 -#: fe-auth-scram.c:691 fe-auth-scram.c:725 fe-auth.c:289 fe-auth.c:359 -#: fe-auth.c:394 fe-auth.c:611 fe-auth.c:770 fe-auth.c:1129 fe-auth.c:1277 -#: fe-connect.c:892 fe-connect.c:1419 fe-connect.c:1595 fe-connect.c:2200 -#: fe-connect.c:2223 fe-connect.c:2952 fe-connect.c:4598 fe-connect.c:4854 -#: fe-connect.c:4973 fe-connect.c:5226 fe-connect.c:5306 fe-connect.c:5405 -#: fe-connect.c:5661 fe-connect.c:5690 fe-connect.c:5762 fe-connect.c:5786 -#: fe-connect.c:5804 fe-connect.c:5905 fe-connect.c:5914 fe-connect.c:6270 -#: fe-connect.c:6420 fe-exec.c:2747 fe-exec.c:3494 fe-exec.c:3659 -#: fe-gssapi-common.c:111 fe-lobj.c:895 fe-protocol2.c:1207 fe-protocol3.c:995 -#: fe-protocol3.c:1699 fe-secure-common.c:110 fe-secure-gssapi.c:504 -#: fe-secure-openssl.c:440 fe-secure-openssl.c:1091 +#: fe-auth-scram.c:384 fe-auth-scram.c:459 fe-auth-scram.c:615 +#: fe-auth-scram.c:636 fe-auth-scram.c:662 fe-auth-scram.c:677 +#: fe-auth-scram.c:727 fe-auth-scram.c:766 fe-auth.c:290 fe-auth.c:362 +#: fe-auth.c:398 fe-auth.c:623 fe-auth.c:799 fe-auth.c:1152 fe-auth.c:1322 +#: fe-connect.c:907 fe-connect.c:1456 fe-connect.c:1625 fe-connect.c:2977 +#: fe-connect.c:4824 fe-connect.c:5085 fe-connect.c:5204 fe-connect.c:5456 +#: fe-connect.c:5537 fe-connect.c:5636 fe-connect.c:5892 fe-connect.c:5921 +#: fe-connect.c:5993 fe-connect.c:6017 fe-connect.c:6035 fe-connect.c:6136 +#: fe-connect.c:6145 fe-connect.c:6503 fe-connect.c:6653 fe-connect.c:6919 +#: fe-exec.c:710 fe-exec.c:976 fe-exec.c:1324 fe-exec.c:3135 fe-exec.c:3318 +#: fe-exec.c:4096 fe-exec.c:4261 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:985 fe-protocol3.c:1000 fe-protocol3.c:1033 +#: fe-protocol3.c:1741 fe-protocol3.c:2144 fe-secure-common.c:112 +#: fe-secure-gssapi.c:504 fe-secure-openssl.c:449 fe-secure-openssl.c:1261 msgid "out of memory\n" msgstr "slut på minne\n" -#: fe-auth-scram.c:364 +#: fe-auth-scram.c:392 msgid "could not encode nonce\n" msgstr "kunde inte koda engångsnummer\n" -#: fe-auth-scram.c:563 +#: fe-auth-scram.c:582 +#, c-format +msgid "could not calculate client proof: %s\n" +msgstr "kunde inte räkna ut klientbevis: %s\n" + +#: fe-auth-scram.c:599 msgid "could not encode client proof\n" msgstr "kunde inte koda klientbevis\n" -#: fe-auth-scram.c:618 +#: fe-auth-scram.c:654 msgid "invalid SCRAM response (nonce mismatch)\n" msgstr "ogiltigt SCRAM-svar (engångsnummer matchar inte)\n" -#: fe-auth-scram.c:651 +#: fe-auth-scram.c:687 msgid "malformed SCRAM message (invalid salt)\n" msgstr "felaktigt SCRAM-meddelande (ogiltigt salt)\n" -#: fe-auth-scram.c:665 +#: fe-auth-scram.c:701 msgid "malformed SCRAM message (invalid iteration count)\n" msgstr "felaktigt SCRAM-meddelande (ogiltig iterationsräknare)\n" -#: fe-auth-scram.c:671 +#: fe-auth-scram.c:707 msgid "malformed SCRAM message (garbage at end of server-first-message)\n" msgstr "felaktigt SCRAM-meddelande (skräp i slutet på server-first-message)\n" -#: fe-auth-scram.c:702 +#: fe-auth-scram.c:743 #, c-format msgid "error received from server in SCRAM exchange: %s\n" msgstr "fel mottaget från server i SCRAM-utbyte: %s\n" -#: fe-auth-scram.c:718 +#: fe-auth-scram.c:759 msgid "malformed SCRAM message (garbage at end of server-final-message)\n" msgstr "felaktigt SCRAM-meddelande (skräp i slutet av server-final-message)\n" -#: fe-auth-scram.c:737 +#: fe-auth-scram.c:778 msgid "malformed SCRAM message (invalid server signature)\n" msgstr "felaktigt SCRAM-meddelande (ogiltigt serversignatur)\n" +#: fe-auth-scram.c:934 fe-exec.c:527 fe-protocol3.c:219 fe-protocol3.c:244 +#: fe-protocol3.c:273 fe-protocol3.c:291 fe-protocol3.c:372 fe-protocol3.c:745 +msgid "out of memory" +msgstr "slut på minne" + +#: fe-auth-scram.c:943 +msgid "failed to generate random salt" +msgstr "misslyckades att generera slumpat salt" + #: fe-auth.c:76 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)\n" @@ -110,7 +140,8 @@ msgstr "slut på minne vid allokering av buffer till GSSAPI (%d)\n" msgid "GSSAPI continuation error" msgstr "GSSAPI fortsättningsfel" -#: fe-auth.c:158 fe-auth.c:388 fe-gssapi-common.c:98 fe-secure-common.c:98 +#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:98 fe-secure-common.c:100 +#: fe-secure-common.c:177 msgid "host name must be specified\n" msgstr "värdnamn måste anges\n" @@ -127,636 +158,621 @@ msgstr "slut på minne vid allokering av buffer till GSSAPI (%d)\n" msgid "SSPI continuation error" msgstr "SSPI fortsättningsfel" -#: fe-auth.c:349 +#: fe-auth.c:351 msgid "duplicate SSPI authentication request\n" msgstr "duplicerad autentiseringsbegäran från SSPI\n" -#: fe-auth.c:374 +#: fe-auth.c:377 msgid "could not acquire SSPI credentials" msgstr "kunde inte hämta SSPI-referenser" -#: fe-auth.c:429 +#: fe-auth.c:433 msgid "channel binding required, but SSL not in use\n" msgstr "kräver kanalbindning, men SSL används inte\n" -#: fe-auth.c:436 +#: fe-auth.c:440 msgid "duplicate SASL authentication request\n" msgstr "duplicerad autentiseringsbegäran från SASL\n" -#: fe-auth.c:492 +#: fe-auth.c:499 msgid "channel binding is required, but client does not support it\n" msgstr "kanalbindning krävs men klienten stöder inte det\n" -#: fe-auth.c:509 +#: fe-auth.c:516 msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" msgstr "servern erbjöd SCRAM-SHA-256-PLUS-autentisering över en icke-SSL-anslutning\n" -#: fe-auth.c:521 +#: fe-auth.c:531 msgid "none of the server's SASL authentication mechanisms are supported\n" msgstr "ingen av serverns SASL-autentiseringsmekanismer stöds\n" -#: fe-auth.c:529 +#: fe-auth.c:539 msgid "channel binding is required, but server did not offer an authentication method that supports channel binding\n" msgstr "kräver kanalbindning, men servern erbjöd ingen autentiseringsmetod som stöder kanalbindning\n" -#: fe-auth.c:635 +#: fe-auth.c:647 #, c-format msgid "out of memory allocating SASL buffer (%d)\n" msgstr "slut på minne vid allokering av buffer till SASL (%d)\n" -#: fe-auth.c:660 +#: fe-auth.c:672 msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed\n" msgstr "mottog AuthenticationSASLFinal från server, men SASL-autentisering slutfördes ej\n" -#: fe-auth.c:737 +#: fe-auth.c:683 +msgid "no client response found after SASL exchange success\n" +msgstr "hittade inget klientsvar efter lyckat SASL-utbyte\n" + +#: fe-auth.c:765 msgid "SCM_CRED authentication method not supported\n" msgstr "autentiseringsmetoden SCM_CRED stöds ej\n" -#: fe-auth.c:836 +#: fe-auth.c:809 fe-auth.c:818 fe-auth.c:1301 fe-auth.c:1314 +#, c-format +msgid "could not encrypt password: %s\n" +msgstr "kan inte kryptera lösenord: %s\n" + +#: fe-auth.c:868 msgid "channel binding required, but server authenticated client without channel binding\n" msgstr "kräver kanalbindning, men servern autentiserade klienten utan kanalbindning\n" -#: fe-auth.c:842 +#: fe-auth.c:874 msgid "channel binding required but not supported by server's authentication request\n" msgstr "kanalbindning krävs men stöds inte av serverns autentiseringsförfrågan\n" -#: fe-auth.c:875 +#: fe-auth.c:909 msgid "Kerberos 4 authentication not supported\n" msgstr "Kerberos-4-autentisering stöds ej\n" -#: fe-auth.c:880 +#: fe-auth.c:914 msgid "Kerberos 5 authentication not supported\n" msgstr "Kerberos-5-autentisering stöds ej\n" -#: fe-auth.c:951 +#: fe-auth.c:985 msgid "GSSAPI authentication not supported\n" msgstr "GSSAPI-autentisering stöds ej\n" -#: fe-auth.c:983 +#: fe-auth.c:1017 msgid "SSPI authentication not supported\n" msgstr "SSPI-autentisering stöds ej\n" -#: fe-auth.c:991 +#: fe-auth.c:1025 msgid "Crypt authentication not supported\n" msgstr "Crypt-autentisering stöds ej\n" -#: fe-auth.c:1057 +#: fe-auth.c:1092 #, c-format msgid "authentication method %u not supported\n" msgstr "autentiseringsmetod %u stöds ej\n" -#: fe-auth.c:1104 +#: fe-auth.c:1138 #, c-format msgid "user name lookup failure: error code %lu\n" msgstr "misslyckad sökning efter användarnamn: felkod %lu\n" -#: fe-auth.c:1114 fe-connect.c:2834 -#, c-format -msgid "could not look up local user ID %d: %s\n" -msgstr "kunde inte slå upp lokalt användar-id %d: %s\n" - -#: fe-auth.c:1119 fe-connect.c:2839 -#, c-format -msgid "local user with ID %d does not exist\n" -msgstr "lokal användare med ID %d existerar inte\n" - -#: fe-auth.c:1221 +#: fe-auth.c:1264 msgid "unexpected shape of result set returned for SHOW\n" msgstr "oväntad form på resultatmängden som returnerades för SHOW\n" -#: fe-auth.c:1230 +#: fe-auth.c:1273 msgid "password_encryption value too long\n" msgstr "password_encryption-värdet är för långt\n" -#: fe-auth.c:1270 +#: fe-auth.c:1327 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" msgstr "okänd lösenordskrypteringsalgoritm \"%s\"\n" -#: fe-connect.c:1075 +#: fe-connect.c:1090 #, c-format msgid "could not match %d host names to %d hostaddr values\n" msgstr "kunde inte matcha %d värdnamn till %d värdadresser\n" -#: fe-connect.c:1156 +#: fe-connect.c:1176 #, c-format msgid "could not match %d port numbers to %d hosts\n" msgstr "kunde inte matcha %d portnummer med %d värdar\n" -#: fe-connect.c:1249 -#, c-format -msgid "invalid channel_binding value: \"%s\"\n" -msgstr "ogiltigt channel_binding-värde: \"%s\"\n" - -#: fe-connect.c:1275 +#: fe-connect.c:1269 fe-connect.c:1295 fe-connect.c:1337 fe-connect.c:1346 +#: fe-connect.c:1379 fe-connect.c:1423 #, c-format -msgid "invalid sslmode value: \"%s\"\n" -msgstr "ogiltigt värde för ssl-läge: \"%s\"\n" +msgid "invalid %s value: \"%s\"\n" +msgstr "ogiltigt %s-värde: \"%s\"\n" -#: fe-connect.c:1296 +#: fe-connect.c:1316 #, c-format msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" msgstr "värde för ssl-läge, \"%s\", är ogiltigt när SSL-stöd inte kompilerats in\n" -#: fe-connect.c:1317 -#, c-format -msgid "invalid ssl_min_protocol_version value: \"%s\"\n" -msgstr "ogiltigt ssl_min_protocol_version-värde: \"%s\"\n" - -#: fe-connect.c:1325 -#, c-format -msgid "invalid ssl_max_protocol_version value: \"%s\"\n" -msgstr "ogiltigt ssl_max_protocol_version-värde: \"%s\"\n" - -#: fe-connect.c:1342 +#: fe-connect.c:1364 msgid "invalid SSL protocol version range\n" msgstr "ogiltigt intervall för SSL-protokollversion\n" -#: fe-connect.c:1357 -#, c-format -msgid "invalid gssencmode value: \"%s\"\n" -msgstr "ogiltigt värde för gssencmode: \"%s\"\n" - -#: fe-connect.c:1366 +#: fe-connect.c:1389 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" msgstr "värde för gssenc-läge, \"%s\", är ogiltigt när GSSAPI-stöd inte kompilerats in\n" -#: fe-connect.c:1401 -#, c-format -msgid "invalid target_session_attrs value: \"%s\"\n" -msgstr "ogiltigt target_session_attrs-värde: \"%s\"\n" - -#: fe-connect.c:1619 +#: fe-connect.c:1649 #, c-format msgid "could not set socket to TCP no delay mode: %s\n" msgstr "kunde inte sätta uttag (socket) till läget TCP-ingen-fördröjning: %s\n" -#: fe-connect.c:1680 +#: fe-connect.c:1711 #, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running locally and accepting\n" -"\tconnections on Unix domain socket \"%s\"?\n" -msgstr "" -"kan inte ansluta till servern: %s\n" -"\tKör servern på lokalt och accepterar den\n" -"\tanslutningar på Unix-uttaget \"%s\"?\n" +msgid "connection to server on socket \"%s\" failed: " +msgstr "anslutning till server på uttag \"%s\" misslyckades: " -#: fe-connect.c:1717 +#: fe-connect.c:1738 #, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running on host \"%s\" (%s) and accepting\n" -"\tTCP/IP connections on port %s?\n" -msgstr "" -"kunde inte ansluta till servern: %s\n" -"\tKör servern på värden \"%s\" (%s) och accepterar\n" -"\tden TCP/IP-uppkopplingar på port %s?\n" +msgid "connection to server at \"%s\" (%s), port %s failed: " +msgstr "anslutning til server på \"%s\" (%s), port %s misslyckades: " -#: fe-connect.c:1725 +#: fe-connect.c:1743 #, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running on host \"%s\" and accepting\n" -"\tTCP/IP connections on port %s?\n" +msgid "connection to server at \"%s\", port %s failed: " +msgstr "anslutning till server på \"%s\", port %s misslyckades: " + +#: fe-connect.c:1768 +msgid "\tIs the server running locally and accepting connections on that socket?\n" msgstr "" -"kunde inte ansluta till servern: %s\n" -"\tKör servern på värden \"%s\" och accepterar\n" -"\tden TCP/IP-uppkopplingar på porten %s?\n" +"\tKör servern lokalt och accepterar den\n" +"\tanslutningar till detta uttag (socket)?\n" + +#: fe-connect.c:1772 +msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" +msgstr "\tKör servern på den värden och accepterar den TCP/IP-anslutningar?\n" -#: fe-connect.c:1795 +#: fe-connect.c:1836 #, c-format msgid "invalid integer value \"%s\" for connection option \"%s\"\n" msgstr "ogiltigt heltalsvärde \"%s\" för anslutningsflagga \"%s\"\n" -#: fe-connect.c:1825 fe-connect.c:1859 fe-connect.c:1894 fe-connect.c:1981 -#: fe-connect.c:2623 +#: fe-connect.c:1866 fe-connect.c:1901 fe-connect.c:1937 fe-connect.c:2037 +#: fe-connect.c:2651 #, c-format -msgid "setsockopt(%s) failed: %s\n" -msgstr "setsockopt(%s) misslyckades: %s\n" +msgid "%s(%s) failed: %s\n" +msgstr "%s(%s) misslyckades: %s\n" -#: fe-connect.c:1947 +#: fe-connect.c:2002 #, c-format -msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" -msgstr "WSAIoctl(SIO_KEEPALIVE_VALS) misslyckades: %ui\n" +msgid "%s(%s) failed: error code %d\n" +msgstr "%s(%s) misslyckades: felkod %d\n" -#: fe-connect.c:2313 +#: fe-connect.c:2317 msgid "invalid connection state, probably indicative of memory corruption\n" -msgstr "ogiltigt förbindelsetillstånd, antagligen korrupt minne\n" +msgstr "ogiltigt tillstånd i anslutning, antagligen korrupt minne\n" -#: fe-connect.c:2379 +#: fe-connect.c:2396 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "ogiltigt portnummer \"%s\"\n" -#: fe-connect.c:2395 +#: fe-connect.c:2412 #, c-format msgid "could not translate host name \"%s\" to address: %s\n" msgstr "kunde inte översätta värdnamn \"%s\" till adress: %s\n" -#: fe-connect.c:2408 +#: fe-connect.c:2425 #, c-format msgid "could not parse network address \"%s\": %s\n" msgstr "kunde inte parsa nätverksadress \"%s\": %s\n" -#: fe-connect.c:2421 +#: fe-connect.c:2438 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" msgstr "Sökväg till unixdomänuttag \"%s\" är för lång (maximalt %d byte)\n" -#: fe-connect.c:2436 +#: fe-connect.c:2453 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" msgstr "kunde inte översätta sökväg till unix-uttag (socket) \"%s\" till adress: %s\n" -#: fe-connect.c:2560 +#: fe-connect.c:2579 #, c-format msgid "could not create socket: %s\n" msgstr "kan inte skapa uttag: %s\n" -#: fe-connect.c:2582 +#: fe-connect.c:2610 #, c-format msgid "could not set socket to nonblocking mode: %s\n" msgstr "kunde inte sätta uttag (socket) till ickeblockerande läge: %s\n" -#: fe-connect.c:2592 +#: fe-connect.c:2620 #, c-format msgid "could not set socket to close-on-exec mode: %s\n" msgstr "kunde inte ställa in uttag (socket) i \"close-on-exec\"-läge: %s\n" -#: fe-connect.c:2610 +#: fe-connect.c:2638 msgid "keepalives parameter must be an integer\n" msgstr "keepalives-parameter måste vara ett heltal\n" -#: fe-connect.c:2750 +#: fe-connect.c:2779 #, c-format msgid "could not get socket error status: %s\n" msgstr "kunde inte hämta felstatus för uttag (socket): %s\n" -#: fe-connect.c:2778 +#: fe-connect.c:2807 #, c-format msgid "could not get client address from socket: %s\n" msgstr "kunde inte få tag på klientadressen från uttag (socket): %s\n" -#: fe-connect.c:2820 +#: fe-connect.c:2846 msgid "requirepeer parameter is not supported on this platform\n" msgstr "requirepeer-parameter stöds inte på denna plattform\n" -#: fe-connect.c:2823 +#: fe-connect.c:2849 #, c-format msgid "could not get peer credentials: %s\n" msgstr "kunde inte hämta andra sidans referenser: %s\n" -#: fe-connect.c:2847 +#: fe-connect.c:2863 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" msgstr "requirepeer anger \"%s\", men andra sidans användarnamn är \"%s\"\n" -#: fe-connect.c:2887 +#: fe-connect.c:2905 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "kunde inte skicka GSSAPI-paket för uppkopplingsförhandling: %s\n" -#: fe-connect.c:2899 +#: fe-connect.c:2917 msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)\n" msgstr "GSSAPI-kryptering krävdes men var omöjligt (kanske ingen credential-cache, inget serverstöd eller använder ett lokalt uttag)\n" -#: fe-connect.c:2926 +#: fe-connect.c:2959 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "kunde inte skicka SSL-paket för uppkopplingsförhandling: %s\n" -#: fe-connect.c:2965 +#: fe-connect.c:2990 #, c-format msgid "could not send startup packet: %s\n" msgstr "kan inte skicka startpaketet: %s\n" -#: fe-connect.c:3035 +#: fe-connect.c:3066 msgid "server does not support SSL, but SSL was required\n" msgstr "SSL stöds inte av servern, men SSL krävdes\n" -#: fe-connect.c:3061 +#: fe-connect.c:3093 #, c-format msgid "received invalid response to SSL negotiation: %c\n" msgstr "tog emot ogiltigt svar till SSL-uppkopplingsförhandling: %c\n" -#: fe-connect.c:3151 +#: fe-connect.c:3114 +msgid "received unencrypted data after SSL response\n" +msgstr "tog emot okrypterad data efter SSL-svar\n" + +#: fe-connect.c:3195 msgid "server doesn't support GSSAPI encryption, but it was required\n" msgstr "GSSAPI stöds inte av servern, men det krävdes\n" -#: fe-connect.c:3162 +#: fe-connect.c:3207 #, c-format msgid "received invalid response to GSSAPI negotiation: %c\n" msgstr "tog emot ogiltigt svar till GSSAPI-uppkopplingsförhandling: %c\n" -#: fe-connect.c:3229 fe-connect.c:3260 +#: fe-connect.c:3226 +msgid "received unencrypted data after GSSAPI encryption response\n" +msgstr "tog emot okrypterad data efter GSSAPI-krypteringssvar\n" + +#: fe-connect.c:3286 fe-connect.c:3311 #, c-format msgid "expected authentication request from server, but received %c\n" msgstr "förväntade autentiseringsförfrågan från servern, men fick %c\n" -#: fe-connect.c:3502 +#: fe-connect.c:3518 msgid "unexpected message from server during startup\n" msgstr "oväntat meddelande från servern under starten\n" -#: fe-connect.c:3707 -#, c-format -msgid "could not make a writable connection to server \"%s:%s\"\n" -msgstr "kunde inte upprätta en skrivbar anslutning till server \"%s:%s\"\n" +#: fe-connect.c:3610 +msgid "session is read-only\n" +msgstr "sessionen är i readonly-läge\n" -#: fe-connect.c:3753 -#, c-format -msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" -msgstr "test \"SHOW transaction_read_only\" misslyckades på server \"%s:%s\"\n" +#: fe-connect.c:3613 +msgid "session is not read-only\n" +msgstr "sessionen är inte i readonly-läge\n" + +#: fe-connect.c:3667 +msgid "server is in hot standby mode\n" +msgstr "servern är i varmt standby-läge\n" + +#: fe-connect.c:3670 +msgid "server is not in hot standby mode\n" +msgstr "servern är inte i varmt standby-läge\n" -#: fe-connect.c:3768 +#: fe-connect.c:3788 fe-connect.c:3840 #, c-format -msgid "invalid connection state %d, probably indicative of memory corruption\n" -msgstr "ogiltigt förbindelsetillstånd %d, antagligen korrupt minne\n" +msgid "\"%s\" failed\n" +msgstr "\"%s\" misslyckades\n" -#: fe-connect.c:4204 fe-connect.c:4264 +#: fe-connect.c:3854 #, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "PGEventProc \"%s\" misslyckades under PGEVT_CONNRESET-händelse\n" +msgid "invalid connection state %d, probably indicative of memory corruption\n" +msgstr "ogiltigt tillstånd %d i anslutning, antagligen korrupt minne\n" -#: fe-connect.c:4611 +#: fe-connect.c:4837 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" msgstr "ogiltig LDAP URL \"%s\": schemat måste vara ldap://\n" -#: fe-connect.c:4626 +#: fe-connect.c:4852 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" msgstr "ogiltig LDAP URL \"%s\": saknar urskiljbart namn\n" -#: fe-connect.c:4638 fe-connect.c:4693 +#: fe-connect.c:4864 fe-connect.c:4922 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" msgstr "ogiltig LDAP URL \"%s\": måste finnas exakt ett attribut\n" -#: fe-connect.c:4649 fe-connect.c:4708 +#: fe-connect.c:4876 fe-connect.c:4938 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" msgstr "ogiltig LDAP URL \"%s\": måste ha sök-scope (base/one/sub)\n" -#: fe-connect.c:4660 +#: fe-connect.c:4888 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "ogiltigt LDAP URL \"%s\": inget filter\n" -#: fe-connect.c:4681 +#: fe-connect.c:4910 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" msgstr "ogiltig LDAP URL \"%s\": ogiltigt portnummer\n" -#: fe-connect.c:4717 +#: fe-connect.c:4948 msgid "could not create LDAP structure\n" msgstr "kunde inte skapa LDAP-struktur\n" -#: fe-connect.c:4793 +#: fe-connect.c:5024 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "uppslagning av LDAP-server misslyckades: %s\n" -#: fe-connect.c:4804 +#: fe-connect.c:5035 msgid "more than one entry found on LDAP lookup\n" msgstr "mer än en post hittad i LDAP-uppslagning\n" -#: fe-connect.c:4805 fe-connect.c:4817 +#: fe-connect.c:5036 fe-connect.c:5048 msgid "no entry found on LDAP lookup\n" msgstr "ingen post hittad i LDAP-uppslagning\n" -#: fe-connect.c:4828 fe-connect.c:4841 +#: fe-connect.c:5059 fe-connect.c:5072 msgid "attribute has no values on LDAP lookup\n" msgstr "attributet har inga värden i LDAP-uppslagning\n" -#: fe-connect.c:4893 fe-connect.c:4912 fe-connect.c:5444 +#: fe-connect.c:5124 fe-connect.c:5143 fe-connect.c:5675 #, c-format msgid "missing \"=\" after \"%s\" in connection info string\n" -msgstr "\"=\" efter \"%s\" saknas i förbindelseinfosträng\n" +msgstr "\"=\" efter \"%s\" saknas i anslutningssträng\n" -#: fe-connect.c:4985 fe-connect.c:5629 fe-connect.c:6403 +#: fe-connect.c:5216 fe-connect.c:5860 fe-connect.c:6636 #, c-format msgid "invalid connection option \"%s\"\n" -msgstr "ogiltig förbindelseparameter \"%s\"\n" +msgstr "ogiltig anslutningsparameter \"%s\"\n" -#: fe-connect.c:5001 fe-connect.c:5493 +#: fe-connect.c:5232 fe-connect.c:5724 msgid "unterminated quoted string in connection info string\n" msgstr "icke terminerad sträng i uppkopplingsinformationen\n" -#: fe-connect.c:5084 +#: fe-connect.c:5313 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "definition av service \"%s\" hittades inte\n" -#: fe-connect.c:5107 +#: fe-connect.c:5339 #, c-format msgid "service file \"%s\" not found\n" msgstr "servicefil \"%s\" hittades inte\n" -#: fe-connect.c:5122 +#: fe-connect.c:5353 #, c-format msgid "line %d too long in service file \"%s\"\n" msgstr "rad %d för lång i servicefil \"%s\"\n" -#: fe-connect.c:5194 fe-connect.c:5238 +#: fe-connect.c:5424 fe-connect.c:5468 #, c-format msgid "syntax error in service file \"%s\", line %d\n" msgstr "syntaxfel i servicefel \"%s\", rad %d\n" -#: fe-connect.c:5205 +#: fe-connect.c:5435 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d\n" msgstr "nästlade servicespecifikationer stöds inte i servicefil \"%s\", rad %d\n" -#: fe-connect.c:5925 +#: fe-connect.c:6156 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"\n" msgstr "ogiltig URI propagerad till intern parsningsrutin: \"%s\"\n" -#: fe-connect.c:6002 +#: fe-connect.c:6233 #, c-format msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"\n" msgstr "nådde slutet på strängen när vi letade efter matchande \"]\" i IPv6-värdadress i URI: \"%s\"\n" -#: fe-connect.c:6009 +#: fe-connect.c:6240 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"\n" msgstr "IPv6-värdadress får ej vara tom i URI: \"%s\"\n" -#: fe-connect.c:6024 +#: fe-connect.c:6255 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" msgstr "oväntat tecken \"%c\" vid position %d i URI (förväntade \":\" eller \"/\"): \"%s\"\n" -#: fe-connect.c:6153 +#: fe-connect.c:6385 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "extra nyckel/värde-separator \"=\" i URI-frågeparameter: \"%s\"\n" -#: fe-connect.c:6173 +#: fe-connect.c:6405 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "saknar nyckel/värde-separator \"=\" i URI-frågeparameter: \"%s\"\n" -#: fe-connect.c:6224 +#: fe-connect.c:6457 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "ogiltig URI-frågeparameter: \"%s\"\n" -#: fe-connect.c:6298 +#: fe-connect.c:6531 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "ogiltigt procent-kodad symbol: \"%s\"\n" -#: fe-connect.c:6308 +#: fe-connect.c:6541 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" msgstr "förbjudet värde %%00 i procentkodat värde: \"%s\"\n" -#: fe-connect.c:6671 +#: fe-connect.c:6911 msgid "connection pointer is NULL\n" msgstr "anslutningspekare är NULL\n" -#: fe-connect.c:6970 +#: fe-connect.c:7199 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "FEL: lösenordsfil \"%s\" är inte en vanlig fil\n" -#: fe-connect.c:6979 +#: fe-connect.c:7208 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "VARNING: lösenordsfilen \"%s\" har läsrättigheter för gruppen eller världen; rättigheten skall vara u=rw (0600) eller mindre\n" -#: fe-connect.c:7020 -#, c-format -msgid "WARNING: line %d too long in password file \"%s\"\n" -msgstr "VARNING: rad %d för lång i lösenordsfil \"%s\"\n" - -#: fe-connect.c:7099 +#: fe-connect.c:7316 #, c-format msgid "password retrieved from file \"%s\"\n" msgstr "lösenord hämtat från fil \"%s\"\n" -#: fe-exec.c:444 fe-exec.c:2821 +#: fe-exec.c:466 fe-exec.c:3392 #, c-format msgid "row number %d is out of range 0..%d" msgstr "radnummer %d är utanför giltigt intervall 0..%d" -#: fe-exec.c:505 fe-protocol2.c:497 fe-protocol2.c:532 fe-protocol2.c:1050 -#: fe-protocol3.c:206 fe-protocol3.c:233 fe-protocol3.c:250 fe-protocol3.c:330 -#: fe-protocol3.c:723 fe-protocol3.c:954 -msgid "out of memory" -msgstr "slut på minne" - -#: fe-exec.c:506 fe-protocol2.c:1396 fe-protocol3.c:1907 +#: fe-exec.c:528 fe-protocol3.c:1949 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:815 +#: fe-exec.c:836 msgid "write to server failed\n" msgstr "skrivning till servern misslyckades\n" -#: fe-exec.c:896 +#: fe-exec.c:875 +msgid "no error text available\n" +msgstr "inget feltext finns tillgänglig\n" + +#: fe-exec.c:964 msgid "NOTICE" msgstr "NOTIS" -#: fe-exec.c:954 +#: fe-exec.c:1022 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult stöder inte mer än INT_MAX tupler" -#: fe-exec.c:966 +#: fe-exec.c:1034 msgid "size_t overflow" msgstr "size_t-överspill" -#: fe-exec.c:1243 fe-exec.c:1301 fe-exec.c:1347 +#: fe-exec.c:1447 fe-exec.c:1552 fe-exec.c:1601 msgid "command string is a null pointer\n" msgstr "kommandosträngen är en null-pekare\n" -#: fe-exec.c:1307 fe-exec.c:1353 fe-exec.c:1448 -msgid "number of parameters must be between 0 and 65535\n" -msgstr "antal parametrar måste bara mellan 0 och 65535\n" +#: fe-exec.c:1558 fe-exec.c:1607 fe-exec.c:1703 +#, c-format +msgid "number of parameters must be between 0 and %d\n" +msgstr "antal parametrar måste vara mellan 0 och %d\n" -#: fe-exec.c:1341 fe-exec.c:1442 +#: fe-exec.c:1595 fe-exec.c:1697 msgid "statement name is a null pointer\n" msgstr "satsens namn är en null-pekare\n" -#: fe-exec.c:1361 fe-exec.c:1524 fe-exec.c:2233 fe-exec.c:2435 -msgid "function requires at least protocol version 3.0\n" -msgstr "funktionen kräver minst protokollversion 3.0\n" - -#: fe-exec.c:1479 +#: fe-exec.c:1741 fe-exec.c:3245 msgid "no connection to the server\n" msgstr "inte förbunden till servern\n" -#: fe-exec.c:1486 +#: fe-exec.c:1750 fe-exec.c:3254 msgid "another command is already in progress\n" msgstr "ett annat kommando pågår redan\n" -#: fe-exec.c:1600 +#: fe-exec.c:1779 +msgid "cannot queue commands during COPY\n" +msgstr "kan inte köa kommandon när COPY körs\n" + +#: fe-exec.c:1897 msgid "length must be given for binary parameter\n" msgstr "längden måste anges för en binär parameter\n" -#: fe-exec.c:1863 +#: fe-exec.c:2215 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "oväntad asyncStatus: %d\n" -#: fe-exec.c:1883 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "PGEventProc \"%s\" misslyckades under PGEVT_RESULTCREATE-händelse\n" +#: fe-exec.c:2373 +msgid "synchronous command execution functions are not allowed in pipeline mode\n" +msgstr "synkrona kommandoexekveringsfunktioner tillåts inte i pipeline-läge\n" -#: fe-exec.c:2043 +#: fe-exec.c:2390 msgid "COPY terminated by new PQexec" msgstr "COPY terminerad av ny PQexec" -#: fe-exec.c:2051 -msgid "COPY IN state must be terminated first\n" -msgstr "COPY IN-läge måste avslutas först\n" - -#: fe-exec.c:2071 -msgid "COPY OUT state must be terminated first\n" -msgstr "COPY OUT-läge måste avslutas först\n" - -#: fe-exec.c:2079 +#: fe-exec.c:2407 msgid "PQexec not allowed during COPY BOTH\n" msgstr "PQexec tillåts inte under COPY BOTH\n" -#: fe-exec.c:2325 fe-exec.c:2392 fe-exec.c:2482 fe-protocol2.c:1353 -#: fe-protocol3.c:1838 +#: fe-exec.c:2635 fe-exec.c:2691 fe-exec.c:2760 fe-protocol3.c:1880 msgid "no COPY in progress\n" msgstr "ingen COPY pågår\n" -#: fe-exec.c:2672 +#: fe-exec.c:2940 +msgid "PQfn not allowed in pipeline mode\n" +msgstr "PQfn tillåts inte i pipeline-läge\n" + +#: fe-exec.c:2948 msgid "connection in wrong state\n" -msgstr "förbindelse i felaktigt tillstånd\n" +msgstr "anslutning i felaktigt tillstånd\n" + +#: fe-exec.c:2992 +msgid "cannot enter pipeline mode, connection not idle\n" +msgstr "kan inte byta till pipeline-läge, anslutningen är inte inaktiv\n" + +#: fe-exec.c:3026 fe-exec.c:3043 +msgid "cannot exit pipeline mode with uncollected results\n" +msgstr "kan inte anvsluta pipeline-läge när alla svar inte tagits emot\n" + +#: fe-exec.c:3031 +msgid "cannot exit pipeline mode while busy\n" +msgstr "är upptagen och kan inte avsluta pipeline-läge\n" + +#: fe-exec.c:3179 +msgid "cannot send pipeline when not in pipeline mode\n" +msgstr "kan inte skicka en pipeline när vi inte är i pipeline-läge\n" -#: fe-exec.c:2703 +#: fe-exec.c:3281 msgid "invalid ExecStatusType code" msgstr "ogiltig ExecStatusType-kod" -#: fe-exec.c:2730 +#: fe-exec.c:3308 msgid "PGresult is not an error result\n" msgstr "PGresult är inte ett felresultat\n" -#: fe-exec.c:2805 fe-exec.c:2828 +#: fe-exec.c:3376 fe-exec.c:3399 #, c-format msgid "column number %d is out of range 0..%d" msgstr "kolumnnummer %d är utanför giltigt intervall 0..%d" -#: fe-exec.c:2843 +#: fe-exec.c:3414 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "parameter nummer %d är utanför giltigt intervall 0..%d" -#: fe-exec.c:3153 +#: fe-exec.c:3725 #, c-format msgid "could not interpret result from server: %s" msgstr "kunde inte tolka svaret från servern: %s" -#: fe-exec.c:3392 fe-exec.c:3476 +#: fe-exec.c:3987 fe-exec.c:4078 msgid "incomplete multibyte character\n" msgstr "ofullständigt multibyte-tecken\n" @@ -764,105 +780,61 @@ msgstr "ofullständigt multibyte-tecken\n" msgid "GSSAPI name import error" msgstr "GSSAPI-fel vid import av namn" -#: fe-lobj.c:154 -msgid "cannot determine OID of function lo_truncate\n" -msgstr "kan inte ta reda på OID för funktionen lo_truncate\n" +#: fe-lobj.c:145 fe-lobj.c:210 fe-lobj.c:403 fe-lobj.c:494 fe-lobj.c:568 +#: fe-lobj.c:972 fe-lobj.c:980 fe-lobj.c:988 fe-lobj.c:996 fe-lobj.c:1004 +#: fe-lobj.c:1012 fe-lobj.c:1020 fe-lobj.c:1028 +#, c-format +msgid "cannot determine OID of function %s\n" +msgstr "kan inte ta reda på OID för funktionen %s\n" -#: fe-lobj.c:170 +#: fe-lobj.c:162 msgid "argument of lo_truncate exceeds integer range\n" msgstr "argumentet till lo_truncate överskrider heltalsintervallet\n" -#: fe-lobj.c:221 -msgid "cannot determine OID of function lo_truncate64\n" -msgstr "kan inte ta reda på OID för funktionen lo_truncate64\n" - -#: fe-lobj.c:279 +#: fe-lobj.c:266 msgid "argument of lo_read exceeds integer range\n" msgstr "ett argument till lo_read överskriver heltalsintervallet\n" -#: fe-lobj.c:334 +#: fe-lobj.c:318 msgid "argument of lo_write exceeds integer range\n" msgstr "ett argument till lo_write överskriver heltalsintervallet\n" -#: fe-lobj.c:425 -msgid "cannot determine OID of function lo_lseek64\n" -msgstr "kan inte ta reda på OID för funktionen lo_lseek64\n" - -#: fe-lobj.c:521 -msgid "cannot determine OID of function lo_create\n" -msgstr "kan inte ta reda på OID för funktionen lo_create\n" - -#: fe-lobj.c:600 -msgid "cannot determine OID of function lo_tell64\n" -msgstr "kan inte ta reda på OID för funktionen lo_tell64\n" - -#: fe-lobj.c:706 fe-lobj.c:815 +#: fe-lobj.c:678 fe-lobj.c:791 #, c-format msgid "could not open file \"%s\": %s\n" msgstr "kan inte öppna fil \"%s\": %s\n" -#: fe-lobj.c:761 +#: fe-lobj.c:735 #, c-format msgid "could not read from file \"%s\": %s\n" msgstr "kunde inte läsa från fil \"%s\": %s\n" -#: fe-lobj.c:835 fe-lobj.c:859 +#: fe-lobj.c:813 fe-lobj.c:837 #, c-format msgid "could not write to file \"%s\": %s\n" msgstr "kan inte skriva till fil \"%s\": %s\n" -#: fe-lobj.c:946 +#: fe-lobj.c:923 msgid "query to initialize large object functions did not return data\n" msgstr "fråga för att initiera stort objekt-funktion returnerade ingen data\n" -#: fe-lobj.c:995 -msgid "cannot determine OID of function lo_open\n" -msgstr "kan inte ta reda på OID för funktionen lo_open\n" - -#: fe-lobj.c:1002 -msgid "cannot determine OID of function lo_close\n" -msgstr "kan inte ta reda på OID för funktionen lo_close\n" - -#: fe-lobj.c:1009 -msgid "cannot determine OID of function lo_creat\n" -msgstr "kan inte ta reda på OID för funktionen lo_create\n" - -#: fe-lobj.c:1016 -msgid "cannot determine OID of function lo_unlink\n" -msgstr "kan inte ta reda på OID för funktionen lo_unlink\n" - -#: fe-lobj.c:1023 -msgid "cannot determine OID of function lo_lseek\n" -msgstr "kan inte ta reda på OID för funktionen lo_lseek\n" - -#: fe-lobj.c:1030 -msgid "cannot determine OID of function lo_tell\n" -msgstr "kan inte ta reda på OID för funktionen lo_tell\n" - -#: fe-lobj.c:1037 -msgid "cannot determine OID of function loread\n" -msgstr "kan inte ta reda på OID för funktionen loread\n" - -#: fe-lobj.c:1044 -msgid "cannot determine OID of function lowrite\n" -msgstr "kan inte ta reda på OID för funktionen lowrite\n" - -#: fe-misc.c:289 +#: fe-misc.c:242 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "heltal med storlek %lu stöds inte av pqGetInt" -#: fe-misc.c:325 +#: fe-misc.c:275 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "heltal med storlek %lu stöds inte av pqPutInt" -#: fe-misc.c:636 fe-misc.c:869 +#: fe-misc.c:576 fe-misc.c:822 msgid "connection not open\n" -msgstr "förbindelse inte öppen\n" +msgstr "anslutningen är inte öppen\n" -#: fe-misc.c:805 fe-secure-openssl.c:209 fe-secure-openssl.c:316 -#: fe-secure.c:267 fe-secure.c:383 +#: fe-misc.c:755 fe-secure-openssl.c:218 fe-secure-openssl.c:325 +#: fe-secure.c:260 fe-secure.c:423 +#, c-format msgid "" "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" @@ -872,198 +844,174 @@ msgstr "" "\tTroligen så terminerade servern pga något fel antingen\n" "\tinnan eller under tiden den bearbetade en förfrågan.\n" -#: fe-misc.c:1063 +#: fe-misc.c:1008 msgid "timeout expired\n" msgstr "timeout utgången\n" -#: fe-misc.c:1108 +#: fe-misc.c:1053 msgid "invalid socket\n" msgstr "ogiltigt uttag\n" -#: fe-misc.c:1131 -#, c-format -msgid "select() failed: %s\n" -msgstr "select() misslyckades: %s\n" - -#: fe-protocol2.c:87 +#: fe-misc.c:1076 #, c-format -msgid "invalid setenv state %c, probably indicative of memory corruption\n" -msgstr "ogiltigt setenv-tillstånd %c, indikerar troligen ett minnesfel\n" +msgid "%s() failed: %s\n" +msgstr "%s() misslyckades: %s\n" -#: fe-protocol2.c:384 -#, c-format -msgid "invalid state %c, probably indicative of memory corruption\n" -msgstr "ogiltigt tillstånd %c, indikerar troligen ett minnesfel\n" - -#: fe-protocol2.c:473 fe-protocol3.c:183 +#: fe-protocol3.c:196 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "meddelandetyp 0x%02x kom från server under viloperiod" -#: fe-protocol2.c:523 -#, c-format -msgid "unexpected character %c following empty query response (\"I\" message)" -msgstr "oväntat tecken %c följer på ett tomt frågesvar (meddelande \"I\")" - -#: fe-protocol2.c:589 -#, c-format -msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" -msgstr "servern skickade data (meddelande \"D\") utan föregående radbeskrivning (meddelande \"T\")" - -#: fe-protocol2.c:607 -#, c-format -msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" -msgstr "servern skickade binärdata (meddelande \"B\") utan föregående radbeskrivning (meddelande \"T\")" +#: fe-protocol3.c:405 +msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" +msgstr "servern skickade data (meddelande \"D\") utan att först skicka en radbeskrivning (meddelande \"T\")\n" -#: fe-protocol2.c:626 fe-protocol3.c:408 +#: fe-protocol3.c:448 #, c-format msgid "unexpected response from server; first received character was \"%c\"\n" msgstr "oväntat svar för servern; första mottagna tecknet var \"%c\"\n" -#: fe-protocol2.c:755 fe-protocol2.c:930 fe-protocol3.c:622 fe-protocol3.c:849 -msgid "out of memory for query result" -msgstr "slut på minnet för frågeresultat" - -#: fe-protocol2.c:1408 -#, c-format -msgid "lost synchronization with server, resetting connection" -msgstr "tappade synkronisering med servern, startar o, uppkopplingen" - -#: fe-protocol2.c:1530 fe-protocol2.c:1562 fe-protocol3.c:2095 -#, c-format -msgid "protocol error: id=0x%x\n" -msgstr "protokollfel: id=0x%x\n" - -#: fe-protocol3.c:365 -msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" -msgstr "servern skickade data (meddelande \"D\") utan att först skicka en radbeskrivning (meddelande \"T\")\n" - -#: fe-protocol3.c:429 +#: fe-protocol3.c:473 #, c-format msgid "message contents do not agree with length in message type \"%c\"\n" msgstr "meddelandeinnehåll stämmer inte med längden för meddelandetyp \"%c\"\n" -#: fe-protocol3.c:449 +#: fe-protocol3.c:493 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d\n" msgstr "tappade synkronisering med servern: fick meddelandetyp \"%c\", längd %d\n" -#: fe-protocol3.c:500 fe-protocol3.c:540 +#: fe-protocol3.c:545 fe-protocol3.c:585 msgid "insufficient data in \"T\" message" msgstr "otillräckligt med data i \"T\"-meddelande" -#: fe-protocol3.c:573 -msgid "extraneous data in \"T\" message" -msgstr "extra data i \"T\"-meddelande" +#: fe-protocol3.c:656 fe-protocol3.c:862 +msgid "out of memory for query result" +msgstr "slut på minnet för frågeresultat" -#: fe-protocol3.c:686 -msgid "extraneous data in \"t\" message" -msgstr "extra data i \"t\"-meddelande" +#: fe-protocol3.c:725 +msgid "insufficient data in \"t\" message" +msgstr "otillräckligt med data i \"t\"-meddelande" -#: fe-protocol3.c:757 fe-protocol3.c:789 fe-protocol3.c:807 +#: fe-protocol3.c:784 fe-protocol3.c:816 fe-protocol3.c:834 msgid "insufficient data in \"D\" message" msgstr "otillräckligt med data i \"D\"-meddelande" -#: fe-protocol3.c:763 +#: fe-protocol3.c:790 msgid "unexpected field count in \"D\" message" msgstr "oväntat fältantal i \"D\"-meddelande" -#: fe-protocol3.c:816 -msgid "extraneous data in \"D\" message" -msgstr "extra data i \"D\"-meddelande" - -#: fe-protocol3.c:1008 +#: fe-protocol3.c:1046 msgid "no error message available\n" msgstr "inget felmeddelande finns tillgängligt\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1056 fe-protocol3.c:1075 +#: fe-protocol3.c:1094 fe-protocol3.c:1113 #, c-format msgid " at character %s" msgstr " vid tecken %s" -#: fe-protocol3.c:1088 +#: fe-protocol3.c:1126 #, c-format msgid "DETAIL: %s\n" msgstr "DETALJ: %s\n" -#: fe-protocol3.c:1091 +#: fe-protocol3.c:1129 #, c-format msgid "HINT: %s\n" msgstr "TIPS: %s\n" -#: fe-protocol3.c:1094 +#: fe-protocol3.c:1132 #, c-format msgid "QUERY: %s\n" msgstr "FRÅGA: %s\n" -#: fe-protocol3.c:1101 +#: fe-protocol3.c:1139 #, c-format msgid "CONTEXT: %s\n" msgstr "KONTEXT: %s\n" -#: fe-protocol3.c:1110 +#: fe-protocol3.c:1148 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMANAMN: %s\n" -#: fe-protocol3.c:1114 +#: fe-protocol3.c:1152 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABELLNAMN: %s\n" -#: fe-protocol3.c:1118 +#: fe-protocol3.c:1156 #, c-format msgid "COLUMN NAME: %s\n" msgstr "KOLUMNNAMN: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1160 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATATYPNAMN: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1164 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "VILLKORSNAMN: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1176 msgid "LOCATION: " msgstr "PLATS: " -#: fe-protocol3.c:1140 +#: fe-protocol3.c:1178 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1180 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1337 +#: fe-protocol3.c:1375 #, c-format msgid "LINE %d: " msgstr "RAD %d: " -#: fe-protocol3.c:1732 +#: fe-protocol3.c:1774 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline: utför inte text-COPY OUT\n" -#: fe-secure-common.c:124 +#: fe-protocol3.c:2151 +msgid "protocol error: no function result\n" +msgstr "protokollfel: inget funktionsresultat\n" + +#: fe-protocol3.c:2163 +#, c-format +msgid "protocol error: id=0x%x\n" +msgstr "protokollfel: id=0x%x\n" + +#: fe-secure-common.c:126 msgid "SSL certificate's name contains embedded null\n" msgstr "SSL-certifikatets namn innehåller null-värden\n" -#: fe-secure-common.c:171 +#: fe-secure-common.c:233 +#, c-format +msgid "certificate contains IP address with invalid length %lu\n" +msgstr "certifikater innehåller IP-adress med ogiltig längd %lu\n" + +#: fe-secure-common.c:243 +#, c-format +msgid "could not convert certificate's IP address to string: %s\n" +msgstr "kunde inte konvertera certifikatets IP-adress till sträng: %s\n" + +#: fe-secure-common.c:276 msgid "host name must be specified for a verified SSL connection\n" msgstr "värdnamn måste anges för en verifierad SSL-anslutning\n" -#: fe-secure-common.c:196 +#: fe-secure-common.c:301 #, c-format msgid "server certificate for \"%s\" does not match host name \"%s\"\n" msgstr "servercertifikat för \"%s\" matchar inte värdnamn \"%s\"\n" -#: fe-secure-common.c:202 +#: fe-secure-common.c:307 msgid "could not get server's host name from server certificate\n" msgstr "kan inte hämta ut serverns värdnamn från servercertifikatet\n" @@ -1097,85 +1045,89 @@ msgstr "inkommande GSSAPI-meddelande använde inte sekretess\n" msgid "could not initiate GSSAPI security context" msgstr "kunde inte initiera GSSAPI-säkerhetskontext" -#: fe-secure-gssapi.c:673 +#: fe-secure-gssapi.c:670 msgid "GSSAPI size check error" msgstr "GSSAPI-fel vid kontroll av storlek" -#: fe-secure-gssapi.c:684 +#: fe-secure-gssapi.c:681 msgid "GSSAPI context establishment error" msgstr "GSSAPI-fel vid skapande av kontext" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1291 +#: fe-secure-openssl.c:223 fe-secure-openssl.c:330 fe-secure-openssl.c:1499 #, c-format msgid "SSL SYSCALL error: %s\n" msgstr "SSL SYSCALL fel: %s\n" -#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1295 +#: fe-secure-openssl.c:230 fe-secure-openssl.c:337 fe-secure-openssl.c:1503 msgid "SSL SYSCALL error: EOF detected\n" msgstr "SSL SYSCALL-fel: EOF upptäckt\n" -#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1304 +#: fe-secure-openssl.c:241 fe-secure-openssl.c:348 fe-secure-openssl.c:1512 #, c-format msgid "SSL error: %s\n" msgstr "SSL-fel: %s\n" -#: fe-secure-openssl.c:247 fe-secure-openssl.c:354 +#: fe-secure-openssl.c:256 fe-secure-openssl.c:363 msgid "SSL connection has been closed unexpectedly\n" msgstr "SSL-anslutning har oväntat stängts\n" -#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1354 +#: fe-secure-openssl.c:262 fe-secure-openssl.c:369 fe-secure-openssl.c:1562 #, c-format msgid "unrecognized SSL error code: %d\n" msgstr "okänd SSL-felkod: %d\n" -#: fe-secure-openssl.c:400 +#: fe-secure-openssl.c:409 msgid "could not determine server certificate signature algorithm\n" msgstr "kunde inte lista ut serverns algoritm för certifikatsignering\n" -#: fe-secure-openssl.c:421 +#: fe-secure-openssl.c:430 #, c-format msgid "could not find digest for NID %s\n" msgstr "kunde inte hitta kontrollsumma för NID %s\n" -#: fe-secure-openssl.c:431 +#: fe-secure-openssl.c:440 msgid "could not generate peer certificate hash\n" msgstr "kunde inte generera peer-certifikathash\n" -#: fe-secure-openssl.c:488 +#: fe-secure-openssl.c:497 msgid "SSL certificate's name entry is missing\n" -msgstr "SSL-certifikatets namn saknas\n" +msgstr "SSL-certifikatets namnpost saknas\n" -#: fe-secure-openssl.c:815 +#: fe-secure-openssl.c:532 +msgid "SSL certificate's address entry is missing\n" +msgstr "SSL-certifikatets adresspost saknas\n" + +#: fe-secure-openssl.c:950 #, c-format msgid "could not create SSL context: %s\n" msgstr "kan inte skapa SSL-omgivning: %s\n" -#: fe-secure-openssl.c:854 +#: fe-secure-openssl.c:989 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version\n" msgstr "ogiltigt värde \"%s\" för minimal SSL-protokollversion\n" -#: fe-secure-openssl.c:865 +#: fe-secure-openssl.c:1000 #, c-format msgid "could not set minimum SSL protocol version: %s\n" msgstr "kunde inte sätta minimal SSL-protokollversion: %s\n" -#: fe-secure-openssl.c:883 +#: fe-secure-openssl.c:1018 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version\n" msgstr "ogiltigt värde \"%s\" för maximal SSL-protokollversion\n" -#: fe-secure-openssl.c:894 +#: fe-secure-openssl.c:1029 #, c-format msgid "could not set maximum SSL protocol version: %s\n" msgstr "kunde inte sätta maximal SSL-protokollversion: %s\n" -#: fe-secure-openssl.c:930 +#: fe-secure-openssl.c:1065 #, c-format msgid "could not read root certificate file \"%s\": %s\n" msgstr "kunde inte läsa root-certifikatfilen \"%s\": %s\n" -#: fe-secure-openssl.c:974 +#: fe-secure-openssl.c:1118 msgid "" "could not get home directory to locate root certificate file\n" "Either provide the file or change sslmode to disable server certificate verification.\n" @@ -1183,7 +1135,7 @@ msgstr "" "kunde inte hämta hemkatalogen för att lokalisera root-certifikatfilen\n" "Antingen tillhandahåll filen eller ändra sslmode för att stänga av serverns certifikatverifiering.\n" -#: fe-secure-openssl.c:978 +#: fe-secure-openssl.c:1122 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1192,92 +1144,112 @@ msgstr "" "root-certifikatfilen \"%s\" finns inte\n" "Antingen tillhandahåll filen eller ändra sslmode för att stänga av serverns certifikatverifiering.\n" -#: fe-secure-openssl.c:1009 +#: fe-secure-openssl.c:1153 #, c-format msgid "could not open certificate file \"%s\": %s\n" msgstr "kunde inte öppna certifikatfil \"%s\": %s\n" -#: fe-secure-openssl.c:1028 +#: fe-secure-openssl.c:1172 #, c-format msgid "could not read certificate file \"%s\": %s\n" msgstr "kunde inte läsa certifikatfil \"%s\": %s\n" -#: fe-secure-openssl.c:1053 +#: fe-secure-openssl.c:1197 #, c-format msgid "could not establish SSL connection: %s\n" -msgstr "kan inte skapa SSL-förbindelse: %s\n" +msgstr "kan inte skapa SSL-anslutning: %s\n" + +#: fe-secure-openssl.c:1231 +#, c-format +msgid "could not set SSL Server Name Indication (SNI): %s\n" +msgstr "kunde inte sätta SSL servernamnsindikering (SNI): %s\n" -#: fe-secure-openssl.c:1107 +#: fe-secure-openssl.c:1277 #, c-format msgid "could not load SSL engine \"%s\": %s\n" msgstr "kunde inte ladda SSL-motor \"%s\": %s\n" -#: fe-secure-openssl.c:1119 +#: fe-secure-openssl.c:1289 #, c-format msgid "could not initialize SSL engine \"%s\": %s\n" msgstr "kunde inte initiera SSL-motor \"%s\": %s\n" -#: fe-secure-openssl.c:1135 +#: fe-secure-openssl.c:1305 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" msgstr "kunde inte läsa privat SSL-nyckel \"%s\" från motor \"%s\": %s\n" -#: fe-secure-openssl.c:1149 +#: fe-secure-openssl.c:1319 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" msgstr "kunde inte ladda privat SSL-nyckel \"%s\" från motor \"%s\": %s\n" -#: fe-secure-openssl.c:1186 +#: fe-secure-openssl.c:1357 #, c-format msgid "certificate present, but not private key file \"%s\"\n" msgstr "certifikat tillgängligt, men inte den privata nyckelfilen \"%s\"\n" -#: fe-secure-openssl.c:1194 +#: fe-secure-openssl.c:1361 #, c-format -msgid "private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" -msgstr "privata nyckelfilen \"%s\" har läsrättigheter för gruppen eller världen; rättigheten skall vara u=rw (0600) eller mindre\n" +msgid "could not stat private key file \"%s\": %m\n" +msgstr "kunde inte köra stat() på privata nyckelfilen \"%s\": %m\n" -#: fe-secure-openssl.c:1219 +#: fe-secure-openssl.c:1370 +#, c-format +msgid "private key file \"%s\" is not a regular file\n" +msgstr "privat nyckelfilen \"%s\" är inte en vanlig fil\n" + +#: fe-secure-openssl.c:1394 +#, c-format +msgid "private key file \"%s\" must be owned by the current user or root\n" +msgstr "privat nyckelfilen \"%s\" måste ägas av databasanvändaren eller root\n" + +#: fe-secure-openssl.c:1403 +#, c-format +msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root\n" +msgstr "privata nyckelfilen \"%s\" har grupp- eller världsrättigheter; filen måste ha rättigheterna u=rw (0600) eller mindre om den ägs av databasanvändaren eller rättigheterna u=rw,g=r (0640) eller mindre om den ägs av root.\n" + +#: fe-secure-openssl.c:1428 #, c-format msgid "could not load private key file \"%s\": %s\n" msgstr "kunde inte ladda privata nyckelfilen \"%s\": %s\n" -#: fe-secure-openssl.c:1237 +#: fe-secure-openssl.c:1445 #, c-format msgid "certificate does not match private key file \"%s\": %s\n" msgstr "certifikatet matchar inte den privata nyckelfilen \"%s\": %s\n" -#: fe-secure-openssl.c:1337 +#: fe-secure-openssl.c:1545 #, c-format msgid "This may indicate that the server does not support any SSL protocol version between %s and %s.\n" msgstr "Detta kan tyda på att servern inte stöder någon SSL-protokolversion mellan %s och %s.\n" -#: fe-secure-openssl.c:1373 +#: fe-secure-openssl.c:1581 #, c-format msgid "certificate could not be obtained: %s\n" msgstr "certifikatet kunde inte hämtas: %s\n" -#: fe-secure-openssl.c:1462 +#: fe-secure-openssl.c:1687 #, c-format msgid "no SSL error reported" msgstr "inget SSL-fel rapporterat" -#: fe-secure-openssl.c:1471 +#: fe-secure-openssl.c:1696 #, c-format msgid "SSL error code %lu" msgstr "SSL-felkod %lu" -#: fe-secure-openssl.c:1718 +#: fe-secure-openssl.c:1944 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "VARNING: sslpassword trunkerat\n" -#: fe-secure.c:275 +#: fe-secure.c:267 #, c-format msgid "could not receive data from server: %s\n" msgstr "kan inte ta emot data från servern: %s\n" -#: fe-secure.c:390 +#: fe-secure.c:436 #, c-format msgid "could not send data to server: %s\n" msgstr "kan inte skicka data till servern: %s\n" @@ -1286,9 +1258,3 @@ msgstr "kan inte skicka data till servern: %s\n" #, c-format msgid "unrecognized socket error: 0x%08X/%d" msgstr "okänt uttagsfel: 0x%08X/%d" - -#~ msgid "could not set minimum version of SSL protocol: %s\n" -#~ msgstr "kunde inte sätta minimal version för SSL-protokoll: %s\n" - -#~ msgid "could not set maximum version of SSL protocol: %s\n" -#~ msgstr "kunde inte sätta maximal version för SSL-protokollet: %s\n" diff --git a/src/interfaces/libpq/po/uk.po b/src/interfaces/libpq/po/uk.po index 3920b7d7ba..de5d8f21c2 100644 --- a/src/interfaces/libpq/po/uk.po +++ b/src/interfaces/libpq/po/uk.po @@ -2,11 +2,11 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:09+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" -"Last-Translator: pasha_golub\n" +"POT-Creation-Date: 2021-08-17 08:39+0000\n" +"PO-Revision-Date: 2021-08-17 11:25\n" +"Last-Translator: \n" "Language-Team: Ukrainian\n" -"Language: uk\n" +"Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -14,89 +14,98 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/libpq.pot\n" -"X-Crowdin-File-ID: 486\n" +"X-Crowdin-File: /REL_14_DEV/libpq.pot\n" +"X-Crowdin-File-ID: 774\n" -#: fe-auth-scram.c:212 +#: fe-auth-scram.c:213 msgid "malformed SCRAM message (empty message)\n" msgstr "неправильне повідомлення SCRAM (пусте повідомлення)\n" -#: fe-auth-scram.c:218 +#: fe-auth-scram.c:219 msgid "malformed SCRAM message (length mismatch)\n" msgstr "неправильне повідомлення SCRAM (невідповідність довжини)\n" -#: fe-auth-scram.c:265 +#: fe-auth-scram.c:263 +msgid "could not verify server signature\n" +msgstr "не вдалося перевірити підпис сервера\n" + +#: fe-auth-scram.c:270 msgid "incorrect server signature\n" msgstr "невірний підпис сервера\n" -#: fe-auth-scram.c:274 +#: fe-auth-scram.c:279 msgid "invalid SCRAM exchange state\n" msgstr "неприпустимий стан обміну SCRAM\n" -#: fe-auth-scram.c:296 +#: fe-auth-scram.c:306 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)\n" msgstr "неправильне повідомлення SCRAM (очікувався атрибут \"%c\")\n" -#: fe-auth-scram.c:305 +#: fe-auth-scram.c:315 #, c-format msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" msgstr "неправильне повідомлення SCRAM (очікувався символ \"=\" для атрибута \"%c\")\n" -#: fe-auth-scram.c:346 +#: fe-auth-scram.c:356 msgid "could not generate nonce\n" msgstr "не вдалося згенерувати одноразовий ідентифікатор\n" -#: fe-auth-scram.c:356 fe-auth-scram.c:431 fe-auth-scram.c:579 -#: fe-auth-scram.c:600 fe-auth-scram.c:626 fe-auth-scram.c:641 -#: fe-auth-scram.c:691 fe-auth-scram.c:725 fe-auth.c:289 fe-auth.c:359 -#: fe-auth.c:394 fe-auth.c:611 fe-auth.c:770 fe-auth.c:1129 fe-auth.c:1277 -#: fe-connect.c:892 fe-connect.c:1419 fe-connect.c:1595 fe-connect.c:2200 -#: fe-connect.c:2223 fe-connect.c:2952 fe-connect.c:4598 fe-connect.c:4854 -#: fe-connect.c:4973 fe-connect.c:5226 fe-connect.c:5306 fe-connect.c:5405 -#: fe-connect.c:5661 fe-connect.c:5690 fe-connect.c:5762 fe-connect.c:5786 -#: fe-connect.c:5804 fe-connect.c:5905 fe-connect.c:5914 fe-connect.c:6270 -#: fe-connect.c:6420 fe-exec.c:2747 fe-exec.c:3494 fe-exec.c:3659 -#: fe-gssapi-common.c:111 fe-lobj.c:895 fe-protocol2.c:1207 fe-protocol3.c:995 -#: fe-protocol3.c:1699 fe-secure-common.c:110 fe-secure-gssapi.c:504 -#: fe-secure-openssl.c:440 fe-secure-openssl.c:1091 +#: fe-auth-scram.c:366 fe-auth-scram.c:441 fe-auth-scram.c:595 +#: fe-auth-scram.c:616 fe-auth-scram.c:642 fe-auth-scram.c:657 +#: fe-auth-scram.c:707 fe-auth-scram.c:746 fe-auth.c:290 fe-auth.c:362 +#: fe-auth.c:398 fe-auth.c:615 fe-auth.c:774 fe-auth.c:1132 fe-auth.c:1282 +#: fe-connect.c:911 fe-connect.c:1455 fe-connect.c:1624 fe-connect.c:2976 +#: fe-connect.c:4657 fe-connect.c:4918 fe-connect.c:5037 fe-connect.c:5289 +#: fe-connect.c:5370 fe-connect.c:5469 fe-connect.c:5725 fe-connect.c:5754 +#: fe-connect.c:5826 fe-connect.c:5850 fe-connect.c:5868 fe-connect.c:5969 +#: fe-connect.c:5978 fe-connect.c:6336 fe-connect.c:6486 fe-connect.c:6752 +#: fe-exec.c:686 fe-exec.c:876 fe-exec.c:1223 fe-exec.c:3043 fe-exec.c:3226 +#: fe-exec.c:3999 fe-exec.c:4164 fe-gssapi-common.c:111 fe-lobj.c:881 +#: fe-protocol3.c:975 fe-protocol3.c:990 fe-protocol3.c:1023 +#: fe-protocol3.c:1731 fe-secure-common.c:110 fe-secure-gssapi.c:504 +#: fe-secure-openssl.c:440 fe-secure-openssl.c:1133 msgid "out of memory\n" msgstr "недостатньо пам'яті\n" -#: fe-auth-scram.c:364 +#: fe-auth-scram.c:374 msgid "could not encode nonce\n" msgstr "не вдалося закодувати одноразовий ідентифікатор\n" #: fe-auth-scram.c:563 +msgid "could not calculate client proof\n" +msgstr "не вдалося обчислити підтвердження клієнта\n" + +#: fe-auth-scram.c:579 msgid "could not encode client proof\n" msgstr "не вдалося закодувати підтвердження клієнта\n" -#: fe-auth-scram.c:618 +#: fe-auth-scram.c:634 msgid "invalid SCRAM response (nonce mismatch)\n" msgstr "неприпустима відповідь SCRAM (невідповідність одноразового ідентифікатора)\n" -#: fe-auth-scram.c:651 +#: fe-auth-scram.c:667 msgid "malformed SCRAM message (invalid salt)\n" msgstr "неправильне повідомлення SCRAM (неприпустима сіль)\n" -#: fe-auth-scram.c:665 +#: fe-auth-scram.c:681 msgid "malformed SCRAM message (invalid iteration count)\n" msgstr "неправильне повідомлення SCRAM (неприпустима кількість ітерацій)\n" -#: fe-auth-scram.c:671 +#: fe-auth-scram.c:687 msgid "malformed SCRAM message (garbage at end of server-first-message)\n" msgstr "неправильне повідомлення SCRAM (сміття в кінці першого повідомлення сервера)\n" -#: fe-auth-scram.c:702 +#: fe-auth-scram.c:723 #, c-format msgid "error received from server in SCRAM exchange: %s\n" msgstr "отримано помилку від сервера під час обміну SCRAM: %s\n" -#: fe-auth-scram.c:718 +#: fe-auth-scram.c:739 msgid "malformed SCRAM message (garbage at end of server-final-message)\n" msgstr "неправильне повідомлення SCRAM (сміття в кінці останнього повідомлення сервера)\n" -#: fe-auth-scram.c:737 +#: fe-auth-scram.c:758 msgid "malformed SCRAM message (invalid server signature)\n" msgstr "неправильне повідомлення SCRAM (неприпустимий підпис сервера)\n" @@ -109,7 +118,7 @@ msgstr "недостатньо пам'яті для буфера GSSAPI (%d)\n" msgid "GSSAPI continuation error" msgstr "Помилка продовження у GSSAPI" -#: fe-auth.c:158 fe-auth.c:388 fe-gssapi-common.c:98 fe-secure-common.c:98 +#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:98 fe-secure-common.c:98 msgid "host name must be specified\n" msgstr "потрібно вказати ім’я хоста\n" @@ -126,48 +135,48 @@ msgstr "недостатньо пам'яті для буфера SSPI (%d)\n" msgid "SSPI continuation error" msgstr "Помилка продовження SSPI" -#: fe-auth.c:349 +#: fe-auth.c:351 msgid "duplicate SSPI authentication request\n" msgstr "дублікат запиту автентифікації SSPI\n" -#: fe-auth.c:374 +#: fe-auth.c:377 msgid "could not acquire SSPI credentials" msgstr "не вдалось отримати облікові дані SSPI" -#: fe-auth.c:429 +#: fe-auth.c:433 msgid "channel binding required, but SSL not in use\n" msgstr "необхідно зв’язування каналів, але SSL не використовується\n" -#: fe-auth.c:436 +#: fe-auth.c:440 msgid "duplicate SASL authentication request\n" msgstr "дублікат запиту автентифікації SASL\n" -#: fe-auth.c:492 +#: fe-auth.c:496 msgid "channel binding is required, but client does not support it\n" msgstr "потрібно зв'язування каналів, але клієнт не підтримує його\n" -#: fe-auth.c:509 +#: fe-auth.c:513 msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" msgstr "сервер запропонував автентифікацію SCRAM-SHA-256-PLUS через підключення без SSL\n" -#: fe-auth.c:521 +#: fe-auth.c:525 msgid "none of the server's SASL authentication mechanisms are supported\n" msgstr "жоден з серверних механізмів автентифікації SASL не підтримується\n" -#: fe-auth.c:529 +#: fe-auth.c:533 msgid "channel binding is required, but server did not offer an authentication method that supports channel binding\n" msgstr "потрібно зв'язування каналів, але сервер не запропонував метод аутентифікації, який підтримує зв’язування каналів\n" -#: fe-auth.c:635 +#: fe-auth.c:639 #, c-format msgid "out of memory allocating SASL buffer (%d)\n" msgstr "недостатньо пам'яті для буфера SASL (%d)\n" -#: fe-auth.c:660 +#: fe-auth.c:664 msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed\n" msgstr "Від сервера отримано AuthenticationSASLFinal, але автентифікація SASL не була завершена\n" -#: fe-auth.c:737 +#: fe-auth.c:741 msgid "SCM_CRED authentication method not supported\n" msgstr "Спосіб автентифікації SCM_CRED не підтримується\n" @@ -179,572 +188,570 @@ msgstr "потрібно зв'язування каналів, але серве msgid "channel binding required but not supported by server's authentication request\n" msgstr "потрібно зв'язування каналів, але не підтримується запитом на аутентифікацію сервера\n" -#: fe-auth.c:875 +#: fe-auth.c:877 msgid "Kerberos 4 authentication not supported\n" msgstr "Автентифікація Kerberos 4 не підтримується\n" -#: fe-auth.c:880 +#: fe-auth.c:882 msgid "Kerberos 5 authentication not supported\n" msgstr "Автентифікація Kerberos 5 не підтримується\n" -#: fe-auth.c:951 +#: fe-auth.c:953 msgid "GSSAPI authentication not supported\n" msgstr "Автентифікація GSSAPI не підтримується\n" -#: fe-auth.c:983 +#: fe-auth.c:985 msgid "SSPI authentication not supported\n" msgstr "Автентифікація SSPI не підтримується\n" -#: fe-auth.c:991 +#: fe-auth.c:993 msgid "Crypt authentication not supported\n" msgstr "Автентифікація Crypt не підтримується\n" -#: fe-auth.c:1057 +#: fe-auth.c:1060 #, c-format msgid "authentication method %u not supported\n" msgstr "спосіб автентифікації %u не підтримується\n" -#: fe-auth.c:1104 +#: fe-auth.c:1107 #, c-format msgid "user name lookup failure: error code %lu\n" msgstr "невдала підстановка імені користувача: код помилки %lu\n" -#: fe-auth.c:1114 fe-connect.c:2834 +#: fe-auth.c:1117 fe-connect.c:2851 #, c-format msgid "could not look up local user ID %d: %s\n" msgstr "не вдалося знайти локального користувача за ідентифікатором: %d: %s\n" -#: fe-auth.c:1119 fe-connect.c:2839 +#: fe-auth.c:1122 fe-connect.c:2856 #, c-format msgid "local user with ID %d does not exist\n" msgstr "локального користувача з ідентифікатором %d не існує\n" -#: fe-auth.c:1221 +#: fe-auth.c:1226 msgid "unexpected shape of result set returned for SHOW\n" msgstr "неочікувану форму набору результатів повернуто для SHOW\n" -#: fe-auth.c:1230 +#: fe-auth.c:1235 msgid "password_encryption value too long\n" msgstr "занадто довге значення password_encryption \n" -#: fe-auth.c:1270 +#: fe-auth.c:1275 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" msgstr "нерозпізнаний алгоритм шифрування пароля \"%s\"\n" -#: fe-connect.c:1075 +#: fe-connect.c:1094 #, c-format msgid "could not match %d host names to %d hostaddr values\n" msgstr "не вдалося зіставити %d імен хостів зі %d значеннями hostaddr\n" -#: fe-connect.c:1156 +#: fe-connect.c:1175 #, c-format msgid "could not match %d port numbers to %d hosts\n" msgstr "не вдалося зіставити %d номерів портів з %d хостами\n" -#: fe-connect.c:1249 -#, c-format -msgid "invalid channel_binding value: \"%s\"\n" -msgstr "неприпустиме значення channel_binding : \"%s\"\n" - -#: fe-connect.c:1275 +#: fe-connect.c:1268 fe-connect.c:1294 fe-connect.c:1336 fe-connect.c:1345 +#: fe-connect.c:1378 fe-connect.c:1422 #, c-format -msgid "invalid sslmode value: \"%s\"\n" -msgstr "неприпустиме значення sslmode: \"%s\"\n" +msgid "invalid %s value: \"%s\"\n" +msgstr "неприпустиме значення %s : \"%s\"\n" -#: fe-connect.c:1296 +#: fe-connect.c:1315 #, c-format msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" msgstr "значення sslmode \"%s\" неприпустиме, якщо підтримку протоколу SSL не скомпільовано\n" -#: fe-connect.c:1317 -#, c-format -msgid "invalid ssl_min_protocol_version value: \"%s\"\n" -msgstr "неприпустиме значення ssl_min_protocol_version: \"%s\"\n" - -#: fe-connect.c:1325 -#, c-format -msgid "invalid ssl_max_protocol_version value: \"%s\"\n" -msgstr "неприпустиме значення ssl_max_protocol_version: \"%s\"\n" - -#: fe-connect.c:1342 +#: fe-connect.c:1363 msgid "invalid SSL protocol version range\n" msgstr "неприпустимий діапазон версії протоколу SSL\n" -#: fe-connect.c:1357 -#, c-format -msgid "invalid gssencmode value: \"%s\"\n" -msgstr "неприпустиме значення gssencmode: \"%s\"\n" - -#: fe-connect.c:1366 +#: fe-connect.c:1388 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" msgstr "значення gssencmode \"%s\" неприпустиме, якщо підтримку протоколу GSSAPI не скомпільовано\n" -#: fe-connect.c:1401 -#, c-format -msgid "invalid target_session_attrs value: \"%s\"\n" -msgstr "неприпустиме значення target_session_attrs: \"%s\"\n" - -#: fe-connect.c:1619 +#: fe-connect.c:1648 #, c-format msgid "could not set socket to TCP no delay mode: %s\n" msgstr "не вдалося встановити сокет у TCP-режим без затримки: %s\n" -#: fe-connect.c:1680 +#: fe-connect.c:1710 #, c-format -msgid "could not connect to server: %s\n" -"\tIs the server running locally and accepting\n" -"\tconnections on Unix domain socket \"%s\"?\n" -msgstr "не вдалося підключитися до сервера: %s\n" -" Чи дійсно працює сервер локально і приймає\n" -" підключення через домен сокету Unix \"%s\"?\n" +msgid "connection to server on socket \"%s\" failed: " +msgstr "помилка при з'єднанні з сервером через сокет \"%s\": " -#: fe-connect.c:1717 +#: fe-connect.c:1737 #, c-format -msgid "could not connect to server: %s\n" -"\tIs the server running on host \"%s\" (%s) and accepting\n" -"\tTCP/IP connections on port %s?\n" -msgstr "не вдалося підключитися до сервера: %s\n" -" Чи дійсно сервер працює на хості \"%s\" (%s) і приймає\n" -" TCP/IP підключення на порту %s?\n" +msgid "connection to server at \"%s\" (%s), port %s failed: " +msgstr "підключення до серверу \"%s\" (%s), порт %s провалено: " -#: fe-connect.c:1725 +#: fe-connect.c:1742 #, c-format -msgid "could not connect to server: %s\n" -"\tIs the server running on host \"%s\" and accepting\n" -"\tTCP/IP connections on port %s?\n" -msgstr "не вдалося підключитися до сервера: %s\n" -" Чи дійсно сервер працює на хості \"%s\" і приймає\n" -" TCP/IP підключення на порту %s?\n" +msgid "connection to server at \"%s\", port %s failed: " +msgstr "підключення до серверу \"%s\", порт %s провалено: " + +#: fe-connect.c:1767 +msgid "\tIs the server running locally and accepting connections on that socket?\n" +msgstr "\tЧи працює сервер локально і приймає підключення до цього сокету?\n" + +#: fe-connect.c:1771 +msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" +msgstr "\tЧи працює сервер на цьому хості і приймає TCP/IP підключення?\n" -#: fe-connect.c:1795 +#: fe-connect.c:1835 #, c-format msgid "invalid integer value \"%s\" for connection option \"%s\"\n" msgstr "неприпустиме ціле значення \"%s\" для параметра з'єднання \"%s\"\n" -#: fe-connect.c:1825 fe-connect.c:1859 fe-connect.c:1894 fe-connect.c:1981 -#: fe-connect.c:2623 +#: fe-connect.c:1865 fe-connect.c:1900 fe-connect.c:1936 fe-connect.c:2025 +#: fe-connect.c:2639 #, c-format -msgid "setsockopt(%s) failed: %s\n" -msgstr "помилка у setsockopt(%s): %s\n" +msgid "%s(%s) failed: %s\n" +msgstr "%s(%s) помилка: %s\n" -#: fe-connect.c:1947 +#: fe-connect.c:1990 #, c-format -msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" -msgstr "Помилка у WSAIoctl(SIO_KEEPALIVE_VALS): %ui\n" +msgid "%s(%s) failed: error code %d\n" +msgstr "%s(%s) помилка: код помилки %d\n" -#: fe-connect.c:2313 +#: fe-connect.c:2305 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "неприпустимий стан підключення, можливо, пошкоджена пам'ять\n" -#: fe-connect.c:2379 +#: fe-connect.c:2384 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "неприпустимий номер порту: \"%s\"\n" -#: fe-connect.c:2395 +#: fe-connect.c:2400 #, c-format msgid "could not translate host name \"%s\" to address: %s\n" msgstr "не вдалося перекласти ім’я хоста \"%s\" в адресу: %s\n" -#: fe-connect.c:2408 +#: fe-connect.c:2413 #, c-format msgid "could not parse network address \"%s\": %s\n" msgstr "не вдалося проаналізувати адресу мережі \"%s\": %s\n" -#: fe-connect.c:2421 +#: fe-connect.c:2426 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" msgstr "Шлях Unix-сокету \"%s\" занадто довгий (максимум %d байтів)\n" -#: fe-connect.c:2436 +#: fe-connect.c:2441 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" msgstr "не вдалося перекласти шлях Unix-сокету \"%s\" в адресу: %s\n" -#: fe-connect.c:2560 +#: fe-connect.c:2567 #, c-format msgid "could not create socket: %s\n" msgstr "не вдалося створити сокет: %s\n" -#: fe-connect.c:2582 +#: fe-connect.c:2598 #, c-format msgid "could not set socket to nonblocking mode: %s\n" msgstr "не вдалося встановити сокет у режим без блокування: %s\n" -#: fe-connect.c:2592 +#: fe-connect.c:2608 #, c-format msgid "could not set socket to close-on-exec mode: %s\n" msgstr "не вдалося встановити сокет у режим закриття по виконанню: %s\n" -#: fe-connect.c:2610 +#: fe-connect.c:2626 msgid "keepalives parameter must be an integer\n" msgstr "параметр keepalives має бути цілим числом\n" -#: fe-connect.c:2750 +#: fe-connect.c:2767 #, c-format msgid "could not get socket error status: %s\n" msgstr "не вдалося отримати статус помилки сокету: %s\n" -#: fe-connect.c:2778 +#: fe-connect.c:2795 #, c-format msgid "could not get client address from socket: %s\n" msgstr "не вдалося отримати адресу клієнта з сокету: %s\n" -#: fe-connect.c:2820 +#: fe-connect.c:2837 msgid "requirepeer parameter is not supported on this platform\n" msgstr "параметр requirepeer не підтримується на цій платформі\n" -#: fe-connect.c:2823 +#: fe-connect.c:2840 #, c-format msgid "could not get peer credentials: %s\n" msgstr "не вдалося отримати облікові дані сервера: %s\n" -#: fe-connect.c:2847 +#: fe-connect.c:2864 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" msgstr "requirepeer вказує на \"%s\", але фактичне ім'я вузла \"%s\"\n" -#: fe-connect.c:2887 +#: fe-connect.c:2904 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "не вдалося передати пакет узгодження протоколу GSSAPI: %s\n" -#: fe-connect.c:2899 +#: fe-connect.c:2916 msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)\n" msgstr "вимагалося шифрування GSSAPI, але не було неможливим (можливо, без кешу облікових даних, підтримки сервера, або використання локального сокета)\n" -#: fe-connect.c:2926 +#: fe-connect.c:2958 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "не вдалося передати пакет узгодження протоколу SSL: %s\n" -#: fe-connect.c:2965 +#: fe-connect.c:2989 #, c-format msgid "could not send startup packet: %s\n" msgstr "не вдалося передати стартовий пакет: %s\n" -#: fe-connect.c:3035 +#: fe-connect.c:3065 msgid "server does not support SSL, but SSL was required\n" msgstr "сервер не підтримує протокол SSL, але протокол SSL вимагається\n" -#: fe-connect.c:3061 +#: fe-connect.c:3092 #, c-format msgid "received invalid response to SSL negotiation: %c\n" msgstr "отримано неприпустиму відповідь на узгодження SSL: %c\n" -#: fe-connect.c:3151 +#: fe-connect.c:3181 msgid "server doesn't support GSSAPI encryption, but it was required\n" msgstr "сервер не підтримує шифрування GSSAPI, але це було необхідно\n" -#: fe-connect.c:3162 +#: fe-connect.c:3193 #, c-format msgid "received invalid response to GSSAPI negotiation: %c\n" msgstr "отримано неприпустиму відповідь на узгодження GSSAPI: %c\n" -#: fe-connect.c:3229 fe-connect.c:3260 +#: fe-connect.c:3259 fe-connect.c:3284 #, c-format msgid "expected authentication request from server, but received %c\n" msgstr "очікувався запит автентифікації від сервера, але отримано %c\n" -#: fe-connect.c:3502 +#: fe-connect.c:3491 msgid "unexpected message from server during startup\n" msgstr "неочікуване повідомлення від сервера під час запуску\n" -#: fe-connect.c:3707 -#, c-format -msgid "could not make a writable connection to server \"%s:%s\"\n" -msgstr "не вдалося встановити підключення для запису з сервером \"%s:%s\"\n" +#: fe-connect.c:3583 +msgid "session is read-only\n" +msgstr "сесія доступна тільки для читання\n" + +#: fe-connect.c:3586 +msgid "session is not read-only\n" +msgstr "сесія доступна не лише для читання\n" -#: fe-connect.c:3753 +#: fe-connect.c:3640 +msgid "server is in hot standby mode\n" +msgstr "сервер знаходиться у режимі hot standby\n" + +#: fe-connect.c:3643 +msgid "server is not in hot standby mode\n" +msgstr "сервер не в режимі hot standby\n" + +#: fe-connect.c:3754 fe-connect.c:3806 #, c-format -msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" -msgstr "помилка тесту \"SHOW transaction_read_only\" на сервері \"%s:%s\"\n" +msgid "\"%s\" failed\n" +msgstr "\"%s\" помилка\n" -#: fe-connect.c:3768 +#: fe-connect.c:3820 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption\n" msgstr "неприпустимий стан підключення %d, можливо, пошкоджена пам'ять\n" -#: fe-connect.c:4204 fe-connect.c:4264 +#: fe-connect.c:4266 fe-connect.c:4326 #, c-format msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" msgstr "Помилка у PGEventProc \"%s\" під час події PGEVT_CONNRESET\n" -#: fe-connect.c:4611 +#: fe-connect.c:4670 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": схема має бути ldap://\n" -#: fe-connect.c:4626 +#: fe-connect.c:4685 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": відсутнє унікальне ім'я\n" -#: fe-connect.c:4638 fe-connect.c:4693 +#: fe-connect.c:4697 fe-connect.c:4755 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": має бути лише один атрибут\n" -#: fe-connect.c:4649 fe-connect.c:4708 +#: fe-connect.c:4709 fe-connect.c:4771 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": відсутня область пошуку (base/one/sub)\n" -#: fe-connect.c:4660 +#: fe-connect.c:4721 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": відсутній фільтр\n" -#: fe-connect.c:4681 +#: fe-connect.c:4743 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": неприпустимий номер порту\n" -#: fe-connect.c:4717 +#: fe-connect.c:4781 msgid "could not create LDAP structure\n" msgstr "не вдалося створити структуру протоколу LDAP\n" -#: fe-connect.c:4793 +#: fe-connect.c:4857 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "помилка підстановки на сервері протоколу LDAP: %s\n" -#: fe-connect.c:4804 +#: fe-connect.c:4868 msgid "more than one entry found on LDAP lookup\n" msgstr "знайдено більше одного входження при підстановці протоколу LDAP\n" -#: fe-connect.c:4805 fe-connect.c:4817 +#: fe-connect.c:4869 fe-connect.c:4881 msgid "no entry found on LDAP lookup\n" msgstr "не знайдено входження при підстановці протоколу LDAP\n" -#: fe-connect.c:4828 fe-connect.c:4841 +#: fe-connect.c:4892 fe-connect.c:4905 msgid "attribute has no values on LDAP lookup\n" msgstr "атрибут не має значення при підстановці протоколу LDAP\n" -#: fe-connect.c:4893 fe-connect.c:4912 fe-connect.c:5444 +#: fe-connect.c:4957 fe-connect.c:4976 fe-connect.c:5508 #, c-format msgid "missing \"=\" after \"%s\" in connection info string\n" msgstr "відсутній \"=\" після \"%s\" у рядку інформації про підключення\n" -#: fe-connect.c:4985 fe-connect.c:5629 fe-connect.c:6403 +#: fe-connect.c:5049 fe-connect.c:5693 fe-connect.c:6469 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "неприпустимий параметр підключення \"%s\"\n" -#: fe-connect.c:5001 fe-connect.c:5493 +#: fe-connect.c:5065 fe-connect.c:5557 msgid "unterminated quoted string in connection info string\n" msgstr "відкриті лапки у рядку інформації про підключення\n" -#: fe-connect.c:5084 +#: fe-connect.c:5146 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "не знайдено визначення сервера \"%s\"\n" -#: fe-connect.c:5107 +#: fe-connect.c:5172 #, c-format msgid "service file \"%s\" not found\n" msgstr "не знайдено сервісний файл \"%s\"\n" -#: fe-connect.c:5122 +#: fe-connect.c:5186 #, c-format msgid "line %d too long in service file \"%s\"\n" msgstr "рядок %d занадто довгий у сервісному файлі \"%s\"\n" -#: fe-connect.c:5194 fe-connect.c:5238 +#: fe-connect.c:5257 fe-connect.c:5301 #, c-format msgid "syntax error in service file \"%s\", line %d\n" msgstr "синтаксична помилка у сервісному файлі \"%s\", рядок %d\n" -#: fe-connect.c:5205 +#: fe-connect.c:5268 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d\n" msgstr "вкладені сервісні специфікації не підтримуються у сервісному файлі \"%s\", рядок %d\n" -#: fe-connect.c:5925 +#: fe-connect.c:5989 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"\n" msgstr "у внутрішню процедуру аналізу рядка передано помилковий URI: \"%s\"\n" -#: fe-connect.c:6002 +#: fe-connect.c:6066 #, c-format msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"\n" msgstr "досягнуто кінця рядка під час пошуку відповідного \"]\" в адресі IPv6 URI: \"%s\"\n" -#: fe-connect.c:6009 +#: fe-connect.c:6073 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"\n" msgstr "IPv6, що знаходиться в URI, не може бути пустим: \"%s\"\n" -#: fe-connect.c:6024 +#: fe-connect.c:6088 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" msgstr "неочікуваний символ \"%c\" на позиції %d в URI (очікувалося \":\" або \"/\"): \"%s\"\n" -#: fe-connect.c:6153 +#: fe-connect.c:6218 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "зайвий розділювач ключа/значення \"=\" в параметрі запиту URI: \"%s\"\n" -#: fe-connect.c:6173 +#: fe-connect.c:6238 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "відсутній розділювач ключа/значення \"=\" у параметрі запиту URI: \"%s\"\n" -#: fe-connect.c:6224 +#: fe-connect.c:6290 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "неприпустимий параметр запиту URI: \"%s\"\n" -#: fe-connect.c:6298 +#: fe-connect.c:6364 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "неприпустимий токен, закодований відсотками: \"%s\"\n" -#: fe-connect.c:6308 +#: fe-connect.c:6374 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" msgstr "неприпустиме значення %%00 для значення, закодованого відсотками: \"%s\"\n" -#: fe-connect.c:6671 +#: fe-connect.c:6744 msgid "connection pointer is NULL\n" msgstr "нульове значення вказівника підключення \n" -#: fe-connect.c:6967 +#: fe-connect.c:7032 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ПОПЕРЕДЖЕННЯ: файл паролів \"%s\" не є простим файлом\n" -#: fe-connect.c:6976 +#: fe-connect.c:7041 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "ПОПЕРЕДЖЕННЯ: до файлу паролів \"%s\" мають доступ група або всі; дозволи мають бути u=rw (0600) або менше\n" -#: fe-connect.c:7084 +#: fe-connect.c:7149 #, c-format msgid "password retrieved from file \"%s\"\n" msgstr "пароль отримано з файлу \"%s\"\n" -#: fe-exec.c:444 fe-exec.c:2821 +#: fe-exec.c:449 fe-exec.c:3300 #, c-format msgid "row number %d is out of range 0..%d" msgstr "число рядків %d поза діапазоном 0..%d" -#: fe-exec.c:505 fe-protocol2.c:497 fe-protocol2.c:532 fe-protocol2.c:1050 -#: fe-protocol3.c:206 fe-protocol3.c:233 fe-protocol3.c:250 fe-protocol3.c:330 -#: fe-protocol3.c:723 fe-protocol3.c:954 +#: fe-exec.c:510 fe-protocol3.c:219 fe-protocol3.c:244 fe-protocol3.c:273 +#: fe-protocol3.c:291 fe-protocol3.c:371 fe-protocol3.c:743 msgid "out of memory" msgstr "недостатньо пам'яті" -#: fe-exec.c:506 fe-protocol2.c:1396 fe-protocol3.c:1907 +#: fe-exec.c:511 fe-protocol3.c:1939 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:815 +#: fe-exec.c:792 msgid "write to server failed\n" msgstr "записати на сервер не вдалося\n" -#: fe-exec.c:896 +#: fe-exec.c:864 msgid "NOTICE" msgstr "ПОВІДОМЛЕННЯ" -#: fe-exec.c:954 +#: fe-exec.c:922 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult не може підтримувати більше ніж INT_MAX кортежів" -#: fe-exec.c:966 +#: fe-exec.c:934 msgid "size_t overflow" msgstr "переповнення size_t" -#: fe-exec.c:1243 fe-exec.c:1301 fe-exec.c:1347 +#: fe-exec.c:1349 fe-exec.c:1454 fe-exec.c:1503 msgid "command string is a null pointer\n" msgstr "рядок команди є нульовим вказівником\n" -#: fe-exec.c:1307 fe-exec.c:1353 fe-exec.c:1448 -msgid "number of parameters must be between 0 and 65535\n" -msgstr "число параметрів має бути між 0 і 65535\n" +#: fe-exec.c:1460 fe-exec.c:1509 fe-exec.c:1605 +#, c-format +msgid "number of parameters must be between 0 and %d\n" +msgstr "кількість параметрів має бути між 0 і %d\n" -#: fe-exec.c:1341 fe-exec.c:1442 +#: fe-exec.c:1497 fe-exec.c:1599 msgid "statement name is a null pointer\n" msgstr "ім’я оператора є пустим вказівником\n" -#: fe-exec.c:1361 fe-exec.c:1524 fe-exec.c:2233 fe-exec.c:2435 -msgid "function requires at least protocol version 3.0\n" -msgstr "функція вимагає протокол мінімум версії 3.0\n" - -#: fe-exec.c:1479 +#: fe-exec.c:1641 fe-exec.c:3153 msgid "no connection to the server\n" msgstr "немає підключення до сервера\n" -#: fe-exec.c:1486 +#: fe-exec.c:1650 fe-exec.c:3162 msgid "another command is already in progress\n" msgstr "інша команда уже в прогресі\n" -#: fe-exec.c:1600 +#: fe-exec.c:1679 +msgid "cannot queue commands during COPY\n" +msgstr "не можна поставити в чергу команди під час COPY\n" + +#: fe-exec.c:1797 msgid "length must be given for binary parameter\n" msgstr "для бінарного параметра має бути надана довжина\n" -#: fe-exec.c:1863 +#: fe-exec.c:2117 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "неочікуваний asyncStatus: %d\n" -#: fe-exec.c:1883 +#: fe-exec.c:2137 #, c-format msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" msgstr "Помилка у PGEventProc \"%s\" під час події PGEVT_RESULTCREAT\n" -#: fe-exec.c:2043 +#: fe-exec.c:2285 +msgid "synchronous command execution functions are not allowed in pipeline mode\n" +msgstr "функції синхронного виконання команд заборонені в режимі конвеєра\n" + +#: fe-exec.c:2307 msgid "COPY terminated by new PQexec" msgstr "COPY завершено новим PQexec" -#: fe-exec.c:2051 -msgid "COPY IN state must be terminated first\n" -msgstr "Спочатку стан COPY IN має завершитися\n" - -#: fe-exec.c:2071 -msgid "COPY OUT state must be terminated first\n" -msgstr "Спочатку стан COPY OUT має завершитися\n" - -#: fe-exec.c:2079 +#: fe-exec.c:2324 msgid "PQexec not allowed during COPY BOTH\n" msgstr "PQexec не дозволяється під час COPY BOTH\n" -#: fe-exec.c:2325 fe-exec.c:2392 fe-exec.c:2482 fe-protocol2.c:1353 -#: fe-protocol3.c:1838 +#: fe-exec.c:2552 fe-exec.c:2608 fe-exec.c:2677 fe-protocol3.c:1870 msgid "no COPY in progress\n" msgstr "Немає COPY у процесі\n" -#: fe-exec.c:2672 +#: fe-exec.c:2854 +msgid "PQfn not allowed in pipeline mode\n" +msgstr "PQfn заборонено в режимі конвеєра\n" + +#: fe-exec.c:2862 msgid "connection in wrong state\n" msgstr "підключення у неправильному стані\n" -#: fe-exec.c:2703 +#: fe-exec.c:2906 +msgid "cannot enter pipeline mode, connection not idle\n" +msgstr "не можна увійти в режим конвеєра, підключення не в очікуванні\n" + +#: fe-exec.c:2940 fe-exec.c:2957 +msgid "cannot exit pipeline mode with uncollected results\n" +msgstr "не можна вийти з режиму конвеєра з незібраними результатами\n" + +#: fe-exec.c:2945 +msgid "cannot exit pipeline mode while busy\n" +msgstr "не можна вийти з режиму конвеєра, коли зайнято\n" + +#: fe-exec.c:3087 +msgid "cannot send pipeline when not in pipeline mode\n" +msgstr "неможливо скористатися конвеєром не у режимі конвеєра\n" + +#: fe-exec.c:3189 msgid "invalid ExecStatusType code" msgstr "неприпустимий код ExecStatusType" -#: fe-exec.c:2730 +#: fe-exec.c:3216 msgid "PGresult is not an error result\n" msgstr "PGresult не є помилковим результатом\n" -#: fe-exec.c:2805 fe-exec.c:2828 +#: fe-exec.c:3284 fe-exec.c:3307 #, c-format msgid "column number %d is out of range 0..%d" msgstr "число стовпців %d поза діапазоном 0..%d" -#: fe-exec.c:2843 +#: fe-exec.c:3322 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "число параметрів %d поза діапазоном 0..%d" -#: fe-exec.c:3153 +#: fe-exec.c:3632 #, c-format msgid "could not interpret result from server: %s" msgstr "не вдалося інтерпретувати результат від сервера: %s" -#: fe-exec.c:3392 fe-exec.c:3476 +#: fe-exec.c:3892 fe-exec.c:3981 msgid "incomplete multibyte character\n" msgstr "неповний мультибайтний символ\n" @@ -752,289 +759,206 @@ msgstr "неповний мультибайтний символ\n" msgid "GSSAPI name import error" msgstr "Помилка імпорту імені у GSSAPI" -#: fe-lobj.c:154 -msgid "cannot determine OID of function lo_truncate\n" -msgstr "неможливо визначити ідентифікатор OID функції lo_truncate\n" +#: fe-lobj.c:145 fe-lobj.c:210 fe-lobj.c:403 fe-lobj.c:494 fe-lobj.c:568 +#: fe-lobj.c:969 fe-lobj.c:977 fe-lobj.c:985 fe-lobj.c:993 fe-lobj.c:1001 +#: fe-lobj.c:1009 fe-lobj.c:1017 fe-lobj.c:1025 +#, c-format +msgid "cannot determine OID of function %s\n" +msgstr "неможливо визначити ідентифікатор OID функції %s\n" -#: fe-lobj.c:170 +#: fe-lobj.c:162 msgid "argument of lo_truncate exceeds integer range\n" msgstr "аргумент lo_truncate перевищує діапазон цілого числа\n" -#: fe-lobj.c:221 -msgid "cannot determine OID of function lo_truncate64\n" -msgstr "неможливо визначити ідентифікатор OID функції lo_truncate64\n" - -#: fe-lobj.c:279 +#: fe-lobj.c:266 msgid "argument of lo_read exceeds integer range\n" msgstr "аргумент lo_read перевищує діапазон цілого числа\n" -#: fe-lobj.c:334 +#: fe-lobj.c:318 msgid "argument of lo_write exceeds integer range\n" msgstr "аргумент lo_write перевищує діапазон цілого числа\n" -#: fe-lobj.c:425 -msgid "cannot determine OID of function lo_lseek64\n" -msgstr "неможливо визначити ідентифікатор OID функції lo_lseek64\n" - -#: fe-lobj.c:521 -msgid "cannot determine OID of function lo_create\n" -msgstr "неможливо визначити ідентифікатор OID функції lo_create\n" - -#: fe-lobj.c:600 -msgid "cannot determine OID of function lo_tell64\n" -msgstr "неможливо визначити ідентифікатор OID функції lo_tell64\n" - -#: fe-lobj.c:706 fe-lobj.c:815 +#: fe-lobj.c:678 fe-lobj.c:789 #, c-format msgid "could not open file \"%s\": %s\n" msgstr "не вдалося відкрити файл \"%s\": %s\n" -#: fe-lobj.c:761 +#: fe-lobj.c:734 #, c-format msgid "could not read from file \"%s\": %s\n" msgstr "не вдалося прочитати з файлу \"%s\": %s\n" -#: fe-lobj.c:835 fe-lobj.c:859 +#: fe-lobj.c:810 fe-lobj.c:834 #, c-format msgid "could not write to file \"%s\": %s\n" msgstr "не вдалося записати у файл \"%s\": %s\n" -#: fe-lobj.c:946 +#: fe-lobj.c:920 msgid "query to initialize large object functions did not return data\n" msgstr "запит на ініціалізацію функцій для великих об’єктів не повернув дані\n" -#: fe-lobj.c:995 -msgid "cannot determine OID of function lo_open\n" -msgstr "неможливо визначити ідентифікатор OID функції lo_open\n" - -#: fe-lobj.c:1002 -msgid "cannot determine OID of function lo_close\n" -msgstr "неможливо визначити ідентифікатор OID функції lo_close\n" - -#: fe-lobj.c:1009 -msgid "cannot determine OID of function lo_creat\n" -msgstr "неможливо визначити ідентифікатор OID функції lo_creat\n" - -#: fe-lobj.c:1016 -msgid "cannot determine OID of function lo_unlink\n" -msgstr "неможливо визначити ідентифікатор OID функції lo_unlink\n" - -#: fe-lobj.c:1023 -msgid "cannot determine OID of function lo_lseek\n" -msgstr "неможливо визначити ідентифікатор OID функції lo_lseek\n" - -#: fe-lobj.c:1030 -msgid "cannot determine OID of function lo_tell\n" -msgstr "неможливо визначити ідентифікатор OID функції lo_tell\n" - -#: fe-lobj.c:1037 -msgid "cannot determine OID of function loread\n" -msgstr "неможливо визначити ідентифікатор OID функції loread\n" - -#: fe-lobj.c:1044 -msgid "cannot determine OID of function lowrite\n" -msgstr "неможливо визначити ідентифікатор OID функції lowrite\n" - -#: fe-misc.c:289 +#: fe-misc.c:242 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "pqGetInt не підтримує ціле число розміром %lu" -#: fe-misc.c:325 +#: fe-misc.c:275 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "pqPutInt не підтримує ціле число розміром %lu" -#: fe-misc.c:636 fe-misc.c:869 +#: fe-misc.c:576 fe-misc.c:822 msgid "connection not open\n" msgstr "підключення не відкрито\n" -#: fe-misc.c:805 fe-secure-openssl.c:209 fe-secure-openssl.c:316 -#: fe-secure.c:267 fe-secure.c:383 +#: fe-misc.c:755 fe-secure-openssl.c:209 fe-secure-openssl.c:316 +#: fe-secure.c:260 fe-secure.c:373 msgid "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" "\tbefore or while processing the request.\n" msgstr "сервер неочікувано закрив підключення\n" " Це може означати, що сервер завершив роботу ненормально до або під час обробки запиту.\n" -#: fe-misc.c:1063 +#: fe-misc.c:1015 msgid "timeout expired\n" msgstr "тайм-аут минув\n" -#: fe-misc.c:1108 +#: fe-misc.c:1060 msgid "invalid socket\n" msgstr "неприпустимий сокет\n" -#: fe-misc.c:1131 +#: fe-misc.c:1083 #, c-format -msgid "select() failed: %s\n" -msgstr "помилка в select(): %s\n" +msgid "%s() failed: %s\n" +msgstr "%s() помилка: %s\n" -#: fe-protocol2.c:87 -#, c-format -msgid "invalid setenv state %c, probably indicative of memory corruption\n" -msgstr "неприпустимий стан setenv %c, можливо, пошкоджена пам'ять\n" - -#: fe-protocol2.c:384 -#, c-format -msgid "invalid state %c, probably indicative of memory corruption\n" -msgstr "неприпустимий стан %c, можливо, пошкоджена пам'ять\n" - -#: fe-protocol2.c:473 fe-protocol3.c:183 +#: fe-protocol3.c:196 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "отримано тип повідомлення 0x%02x від сервера під час бездіяльності" -#: fe-protocol2.c:523 -#, c-format -msgid "unexpected character %c following empty query response (\"I\" message)" -msgstr "неочікуваний символ %c слідом за пустою відповіддю на запит (\"I\" повідомлення)" - -#: fe-protocol2.c:589 -#, c-format -msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" -msgstr "сервер передав дані (повідомлення \"D\") без попереднього опису рядка (повідомлення \"T\")" - -#: fe-protocol2.c:607 -#, c-format -msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" -msgstr "сервер передав бінарні дані (повідомлення \"B\") без попереднього опису рядка (повідомлення \"T\")" +#: fe-protocol3.c:403 +msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" +msgstr "сервер передав дані (повідомлення \"D\") без попереднього опису рядка (повідомлення \"T\")\n" -#: fe-protocol2.c:626 fe-protocol3.c:408 +#: fe-protocol3.c:446 #, c-format msgid "unexpected response from server; first received character was \"%c\"\n" msgstr "неочікувана відповідь від сервера; перший отриманий символ був \"%c\"\n" -#: fe-protocol2.c:755 fe-protocol2.c:930 fe-protocol3.c:622 fe-protocol3.c:849 -msgid "out of memory for query result" -msgstr "недостатньо пам'яті для результату запиту" - -#: fe-protocol2.c:1408 -#, c-format -msgid "lost synchronization with server, resetting connection" -msgstr "втрачено синхронізацію з сервером, відновлення підключення" - -#: fe-protocol2.c:1530 fe-protocol2.c:1562 fe-protocol3.c:2095 -#, c-format -msgid "protocol error: id=0x%x\n" -msgstr "помилка протоколу: id=0x%x\n" - -#: fe-protocol3.c:365 -msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" -msgstr "сервер передав дані (повідомлення \"D\") без попереднього опису рядка (повідомлення \"T\")\n" - -#: fe-protocol3.c:429 +#: fe-protocol3.c:471 #, c-format msgid "message contents do not agree with length in message type \"%c\"\n" msgstr "вміст повідомлення не відповідає довжині у типі повідомлення \"%c\"\n" -#: fe-protocol3.c:449 +#: fe-protocol3.c:491 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d\n" msgstr "втрачено синхронізацію з сервером: отримано тип повідомлення \"%c\", довжина %d\n" -#: fe-protocol3.c:500 fe-protocol3.c:540 +#: fe-protocol3.c:543 fe-protocol3.c:583 msgid "insufficient data in \"T\" message" msgstr "недостатньо даних у повідомленні \"T\"" -#: fe-protocol3.c:573 -msgid "extraneous data in \"T\" message" -msgstr "зайві дані у повідомленні \"T\"" +#: fe-protocol3.c:654 fe-protocol3.c:860 +msgid "out of memory for query result" +msgstr "недостатньо пам'яті для результату запиту" -#: fe-protocol3.c:686 -msgid "extraneous data in \"t\" message" -msgstr "зайві дані у повідомленні \"t\"" +#: fe-protocol3.c:723 +msgid "insufficient data in \"t\" message" +msgstr "недостатньо даних у повідомленні \"t\"" -#: fe-protocol3.c:757 fe-protocol3.c:789 fe-protocol3.c:807 +#: fe-protocol3.c:782 fe-protocol3.c:814 fe-protocol3.c:832 msgid "insufficient data in \"D\" message" msgstr "зайві дані у повідомленні \"D\"" -#: fe-protocol3.c:763 +#: fe-protocol3.c:788 msgid "unexpected field count in \"D\" message" msgstr "неочікувана кількість полів у повідомленні \"D\"" -#: fe-protocol3.c:816 -msgid "extraneous data in \"D\" message" -msgstr "зайві дані у повідомленні \"D\"" - -#: fe-protocol3.c:1008 +#: fe-protocol3.c:1036 msgid "no error message available\n" msgstr "немає доступного повідомлення про помилку\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1056 fe-protocol3.c:1075 +#: fe-protocol3.c:1084 fe-protocol3.c:1103 #, c-format msgid " at character %s" msgstr " в символі %s" -#: fe-protocol3.c:1088 +#: fe-protocol3.c:1116 #, c-format msgid "DETAIL: %s\n" msgstr "ДЕТАЛІ: %s\n" -#: fe-protocol3.c:1091 +#: fe-protocol3.c:1119 #, c-format msgid "HINT: %s\n" msgstr "ПІДКАЗКА: %s\n" -#: fe-protocol3.c:1094 +#: fe-protocol3.c:1122 #, c-format msgid "QUERY: %s\n" msgstr "ЗАПИТ: %s\n" -#: fe-protocol3.c:1101 +#: fe-protocol3.c:1129 #, c-format msgid "CONTEXT: %s\n" msgstr "КОНТЕКСТ: %s\n" -#: fe-protocol3.c:1110 +#: fe-protocol3.c:1138 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "ІМ'Я СХЕМИ: %s\n" -#: fe-protocol3.c:1114 +#: fe-protocol3.c:1142 #, c-format msgid "TABLE NAME: %s\n" msgstr "ІМ'Я ТАБЛИЦІ: %s\n" -#: fe-protocol3.c:1118 +#: fe-protocol3.c:1146 #, c-format msgid "COLUMN NAME: %s\n" msgstr "ІМ'Я СТОВПЦЯ: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1150 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "ІМ'Я ТИПУ ДАНИХ: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1154 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "ІМ'Я ОБМЕЖЕННЯ: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1166 msgid "LOCATION: " msgstr "РОЗТАШУВАННЯ: " -#: fe-protocol3.c:1140 +#: fe-protocol3.c:1168 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1170 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1337 +#: fe-protocol3.c:1365 #, c-format msgid "LINE %d: " msgstr "РЯДОК %d: " -#: fe-protocol3.c:1732 +#: fe-protocol3.c:1764 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline можна викликати лише під час COPY OUT\n" +#: fe-protocol3.c:2130 +#, c-format +msgid "protocol error: id=0x%x\n" +msgstr "помилка протоколу: id=0x%x\n" + #: fe-secure-common.c:124 msgid "SSL certificate's name contains embedded null\n" msgstr "Ім'я сертифікату SSL містить вбудоване Null-значення\n" @@ -1076,42 +1000,42 @@ msgstr "помилка при розгортанні GSSAPI" #: fe-secure-gssapi.c:403 msgid "incoming GSSAPI message did not use confidentiality\n" -msgstr "вхідне повідомлення GSSAPI не використовувує конфіденційність\n" +msgstr "вхідне повідомлення GSSAPI не використовувало конфіденційність\n" #: fe-secure-gssapi.c:642 msgid "could not initiate GSSAPI security context" msgstr "не вдалося ініціювати контекст безпеки GSSAPI" -#: fe-secure-gssapi.c:673 +#: fe-secure-gssapi.c:670 msgid "GSSAPI size check error" msgstr "помилка перевірки розміру GSSAPI" -#: fe-secure-gssapi.c:684 +#: fe-secure-gssapi.c:681 msgid "GSSAPI context establishment error" msgstr "помилка встановлення контексту GSSAPI" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1291 +#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1333 #, c-format msgid "SSL SYSCALL error: %s\n" msgstr "Помилка SSL SYSCALL: %s\n" -#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1295 +#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1337 msgid "SSL SYSCALL error: EOF detected\n" msgstr "Помилка SSL SYSCALL: виявлено EOF\n" -#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1304 +#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1346 #, c-format msgid "SSL error: %s\n" -msgstr "Помилка протоколу SSL: %s\n" +msgstr "Помилка SSL: %s\n" #: fe-secure-openssl.c:247 fe-secure-openssl.c:354 msgid "SSL connection has been closed unexpectedly\n" msgstr "SSL підключення було неочікувано перервано\n" -#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1354 +#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1396 #, c-format msgid "unrecognized SSL error code: %d\n" -msgstr "нерозпізнаний код помилки протоколу SSL: %d\n" +msgstr "нерозпізнаний код помилки SSL: %d\n" #: fe-secure-openssl.c:400 msgid "could not determine server certificate signature algorithm\n" @@ -1130,135 +1054,140 @@ msgstr "не вдалося згенерувати хеш сертифікату msgid "SSL certificate's name entry is missing\n" msgstr "Відсутня ім'я в сертифікаті SSL\n" -#: fe-secure-openssl.c:815 +#: fe-secure-openssl.c:822 #, c-format msgid "could not create SSL context: %s\n" msgstr "не вдалося створити контекст SSL: %s\n" -#: fe-secure-openssl.c:854 +#: fe-secure-openssl.c:861 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version\n" msgstr "неприпустиме значення \"%s\" для мінімальної версії протоколу SSL\n" -#: fe-secure-openssl.c:865 +#: fe-secure-openssl.c:872 #, c-format msgid "could not set minimum SSL protocol version: %s\n" msgstr "не вдалося встановити мінімальну версію протоколу SSL: %s\n" -#: fe-secure-openssl.c:883 +#: fe-secure-openssl.c:890 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version\n" msgstr "неприпустиме значення \"%s\" для максимальної версії протоколу SSL\n" -#: fe-secure-openssl.c:894 +#: fe-secure-openssl.c:901 #, c-format msgid "could not set maximum SSL protocol version: %s\n" msgstr "не вдалося встановити максимальну версію протоколу SSL: %s\n" -#: fe-secure-openssl.c:930 +#: fe-secure-openssl.c:937 #, c-format msgid "could not read root certificate file \"%s\": %s\n" msgstr "не вдалося прочитати файл кореневого сертифікату \"%s\": %s\n" -#: fe-secure-openssl.c:974 +#: fe-secure-openssl.c:990 msgid "could not get home directory to locate root certificate file\n" "Either provide the file or change sslmode to disable server certificate verification.\n" msgstr "не вдалося отримати домашній каталог, щоб знайти файл кореневого сертифікату\n" "Надайте файл або змініть sslmode, щоб вимкнути перевірку серверного сертифікату.\n" -#: fe-secure-openssl.c:978 +#: fe-secure-openssl.c:994 #, c-format msgid "root certificate file \"%s\" does not exist\n" "Either provide the file or change sslmode to disable server certificate verification.\n" msgstr "файлу кореневого сертифікату \"%s\" не існує\n" "Вкажіть повний шлях до файлу або вимкніть перевірку сертифікату сервера, змінивши sslmode.\n" -#: fe-secure-openssl.c:1009 +#: fe-secure-openssl.c:1025 #, c-format msgid "could not open certificate file \"%s\": %s\n" msgstr "не вдалося відкрити файл сертифікату \"%s\": %s\n" -#: fe-secure-openssl.c:1028 +#: fe-secure-openssl.c:1044 #, c-format msgid "could not read certificate file \"%s\": %s\n" msgstr "не вдалося прочитати файл сертифікату \"%s\": %s\n" -#: fe-secure-openssl.c:1053 +#: fe-secure-openssl.c:1069 #, c-format msgid "could not establish SSL connection: %s\n" msgstr "не вдалося встановити SSL-підключення: %s\n" -#: fe-secure-openssl.c:1107 +#: fe-secure-openssl.c:1103 +#, c-format +msgid "could not set SSL Server Name Indication (SNI): %s\n" +msgstr "не вдалося встановити Індикацію Імені Сервера протокол SSL (SNI): %s\n" + +#: fe-secure-openssl.c:1149 #, c-format msgid "could not load SSL engine \"%s\": %s\n" msgstr "не вдалося завантажити модуль SSL \"%s\": %s\n" -#: fe-secure-openssl.c:1119 +#: fe-secure-openssl.c:1161 #, c-format msgid "could not initialize SSL engine \"%s\": %s\n" msgstr "не вдалося ініціалізувати модуль SSL \"%s\": %s\n" -#: fe-secure-openssl.c:1135 +#: fe-secure-openssl.c:1177 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" msgstr "не вдалося прочитати закритий ключ SSL \"%s\" з модуля \"%s\": %s\n" -#: fe-secure-openssl.c:1149 +#: fe-secure-openssl.c:1191 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" msgstr "не вдалося завантажити закритий ключ SSL \"%s\" з модуля \"%s\": %s\n" -#: fe-secure-openssl.c:1186 +#: fe-secure-openssl.c:1228 #, c-format msgid "certificate present, but not private key file \"%s\"\n" msgstr "сертифікат присутній, але файл закритого ключа \"%s\" ні\n" -#: fe-secure-openssl.c:1194 +#: fe-secure-openssl.c:1236 #, c-format msgid "private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "файл закритого ключа \"%s\" має груповий або всесвітній доступ; права повинні бути u=rw (0600) або більш обмежені\n" -#: fe-secure-openssl.c:1219 +#: fe-secure-openssl.c:1261 #, c-format msgid "could not load private key file \"%s\": %s\n" msgstr "не вдалося завантажити файл закритого ключа \"%s\": %s\n" -#: fe-secure-openssl.c:1237 +#: fe-secure-openssl.c:1279 #, c-format msgid "certificate does not match private key file \"%s\": %s\n" msgstr "сертифікат не відповідає файлу закритого ключа \"%s\": %s\n" -#: fe-secure-openssl.c:1337 +#: fe-secure-openssl.c:1379 #, c-format msgid "This may indicate that the server does not support any SSL protocol version between %s and %s.\n" msgstr "Це може вказувати, що сервер не підтримує жодної версії протоколу SSL між %s і %s.\n" -#: fe-secure-openssl.c:1373 +#: fe-secure-openssl.c:1415 #, c-format msgid "certificate could not be obtained: %s\n" msgstr "не вдалося отримати сертифікат: %s\n" -#: fe-secure-openssl.c:1462 +#: fe-secure-openssl.c:1521 #, c-format msgid "no SSL error reported" msgstr "немає повідомлення про помилку SSL" -#: fe-secure-openssl.c:1471 +#: fe-secure-openssl.c:1530 #, c-format msgid "SSL error code %lu" msgstr "Код помилки SSL %lu" -#: fe-secure-openssl.c:1718 +#: fe-secure-openssl.c:1777 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "ПОПЕРЕДЖЕННЯ: sslpassword скорочено\n" -#: fe-secure.c:275 +#: fe-secure.c:267 #, c-format msgid "could not receive data from server: %s\n" msgstr "не вдалося отримати дані з серверу: %s\n" -#: fe-secure.c:390 +#: fe-secure.c:380 #, c-format msgid "could not send data to server: %s\n" msgstr "не вдалося передати дані серверу: %s\n" @@ -1268,6 +1197,3 @@ msgstr "не вдалося передати дані серверу: %s\n" msgid "unrecognized socket error: 0x%08X/%d" msgstr "нерозпізнана помилка сокету: 0x%08X/%d" -#~ msgid "WARNING: line %d too long in password file \"%s\"\n" -#~ msgstr "ПОПЕРЕДЖЕННЯ: рядок %d занадто довгий у файлі паролю \"%s\"\n" - diff --git a/src/interfaces/libpq/po/zh_CN.po b/src/interfaces/libpq/po/zh_CN.po index c128306e56..34a34a8bd8 100644 --- a/src/interfaces/libpq/po/zh_CN.po +++ b/src/interfaces/libpq/po/zh_CN.po @@ -3,98 +3,107 @@ # msgid "" msgstr "" -"Project-Id-Version: libpq (PostgreSQL) 13\n" +"Project-Id-Version: libpq (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-06-05 01:39+0000\n" -"PO-Revision-Date: 2020-06-20 16:25+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:40+0000\n" +"PO-Revision-Date: 2021-08-15 16:25+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.7\n" -#: fe-auth-scram.c:212 +#: fe-auth-scram.c:213 msgid "malformed SCRAM message (empty message)\n" msgstr "错误的SCRAM消息(空消息)\n" -#: fe-auth-scram.c:218 +#: fe-auth-scram.c:219 msgid "malformed SCRAM message (length mismatch)\n" msgstr "错误的SCRAM消息(长度不匹配)\n" -#: fe-auth-scram.c:265 +#: fe-auth-scram.c:263 +msgid "could not verify server signature\n" +msgstr "无法验证服务器签名\n" + +#: fe-auth-scram.c:270 msgid "incorrect server signature\n" msgstr "服务器签名不正确\n" -#: fe-auth-scram.c:274 +#: fe-auth-scram.c:279 msgid "invalid SCRAM exchange state\n" msgstr "SCRAM交换状态无效\n" -#: fe-auth-scram.c:296 +#: fe-auth-scram.c:306 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)\n" msgstr "错误的SCRAM消息(应为属性\"%c\")\n" -#: fe-auth-scram.c:305 +#: fe-auth-scram.c:315 #, c-format msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" msgstr "错误的SCRAM消息(属性\"%c\"需要字符\"=\")\n" -#: fe-auth-scram.c:346 +#: fe-auth-scram.c:356 msgid "could not generate nonce\n" msgstr "无法生成nonce\n" -#: fe-auth-scram.c:356 fe-auth-scram.c:431 fe-auth-scram.c:579 -#: fe-auth-scram.c:600 fe-auth-scram.c:626 fe-auth-scram.c:641 -#: fe-auth-scram.c:691 fe-auth-scram.c:725 fe-auth.c:289 fe-auth.c:359 -#: fe-auth.c:394 fe-auth.c:611 fe-auth.c:770 fe-auth.c:1129 fe-auth.c:1277 -#: fe-connect.c:886 fe-connect.c:1413 fe-connect.c:1589 fe-connect.c:2199 -#: fe-connect.c:2222 fe-connect.c:2948 fe-connect.c:4617 fe-connect.c:4873 -#: fe-connect.c:4992 fe-connect.c:5245 fe-connect.c:5325 fe-connect.c:5424 -#: fe-connect.c:5680 fe-connect.c:5709 fe-connect.c:5781 fe-connect.c:5805 -#: fe-connect.c:5823 fe-connect.c:5924 fe-connect.c:5933 fe-connect.c:6289 -#: fe-connect.c:6439 fe-exec.c:2747 fe-exec.c:3494 fe-exec.c:3659 -#: fe-gssapi-common.c:111 fe-lobj.c:895 fe-protocol2.c:1207 fe-protocol3.c:995 -#: fe-protocol3.c:1699 fe-secure-common.c:110 fe-secure-gssapi.c:504 -#: fe-secure-openssl.c:440 fe-secure-openssl.c:1091 +#: fe-auth-scram.c:366 fe-auth-scram.c:441 fe-auth-scram.c:595 +#: fe-auth-scram.c:616 fe-auth-scram.c:642 fe-auth-scram.c:657 +#: fe-auth-scram.c:707 fe-auth-scram.c:746 fe-auth.c:290 fe-auth.c:362 +#: fe-auth.c:398 fe-auth.c:615 fe-auth.c:774 fe-auth.c:1132 fe-auth.c:1282 +#: fe-connect.c:911 fe-connect.c:1455 fe-connect.c:1624 fe-connect.c:2976 +#: fe-connect.c:4657 fe-connect.c:4918 fe-connect.c:5037 fe-connect.c:5289 +#: fe-connect.c:5370 fe-connect.c:5469 fe-connect.c:5725 fe-connect.c:5754 +#: fe-connect.c:5826 fe-connect.c:5850 fe-connect.c:5868 fe-connect.c:5969 +#: fe-connect.c:5978 fe-connect.c:6336 fe-connect.c:6486 fe-connect.c:6752 +#: fe-exec.c:686 fe-exec.c:876 fe-exec.c:1223 fe-exec.c:3043 fe-exec.c:3226 +#: fe-exec.c:3999 fe-exec.c:4164 fe-gssapi-common.c:111 fe-lobj.c:881 +#: fe-protocol3.c:975 fe-protocol3.c:990 fe-protocol3.c:1023 +#: fe-protocol3.c:1731 fe-secure-common.c:110 fe-secure-gssapi.c:504 +#: fe-secure-openssl.c:440 fe-secure-openssl.c:1133 msgid "out of memory\n" -msgstr "内存用尽\n" +msgstr "内存不足\n" -#: fe-auth-scram.c:364 +#: fe-auth-scram.c:374 msgid "could not encode nonce\n" msgstr "无法编码nonce\n" #: fe-auth-scram.c:563 +msgid "could not calculate client proof\n" +msgstr "无法计算客户端证明\n" + +#: fe-auth-scram.c:579 msgid "could not encode client proof\n" msgstr "无法对客户端证明进行编码\n" -#: fe-auth-scram.c:618 +#: fe-auth-scram.c:634 msgid "invalid SCRAM response (nonce mismatch)\n" msgstr "SCRAM响应无效(非匹配)\n" -#: fe-auth-scram.c:651 +#: fe-auth-scram.c:667 msgid "malformed SCRAM message (invalid salt)\n" msgstr "错误的SCRAM消息 (无效的salt)\n" -#: fe-auth-scram.c:665 +#: fe-auth-scram.c:681 msgid "malformed SCRAM message (invalid iteration count)\n" msgstr "错误的SCRAM消息(迭代计数无效)\n" -#: fe-auth-scram.c:671 +#: fe-auth-scram.c:687 msgid "malformed SCRAM message (garbage at end of server-first-message)\n" msgstr "错误的SCRAM消息 (服务器第一条消息结束时为垃圾消息)\n" -#: fe-auth-scram.c:702 +#: fe-auth-scram.c:723 #, c-format msgid "error received from server in SCRAM exchange: %s\n" msgstr "在SCRAM交换中从服务器接收到错误: %s\n" -#: fe-auth-scram.c:718 +#: fe-auth-scram.c:739 msgid "malformed SCRAM message (garbage at end of server-final-message)\n" msgstr "错误的SCRAM消息 (服务器最后一条消息结束时为垃圾消息)\n" -#: fe-auth-scram.c:737 +#: fe-auth-scram.c:758 msgid "malformed SCRAM message (invalid server signature)\n" msgstr "错误的SCRAM消息 (服务器签名无效)\n" @@ -107,7 +116,7 @@ msgstr "在分配GSSAPI缓冲区(%d)时内存用尽\n" msgid "GSSAPI continuation error" msgstr "GSSAPI连续出现错误" -#: fe-auth.c:158 fe-auth.c:388 fe-gssapi-common.c:98 fe-secure-common.c:98 +#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:98 fe-secure-common.c:98 msgid "host name must be specified\n" msgstr "必须指定主机名\n" @@ -124,48 +133,48 @@ msgstr "在分配SSPI缓冲区(%d)时内存用尽\n" msgid "SSPI continuation error" msgstr "SSPI连续出现错误" -#: fe-auth.c:349 +#: fe-auth.c:351 msgid "duplicate SSPI authentication request\n" msgstr "重复的SSPI认证请求\n" -#: fe-auth.c:374 +#: fe-auth.c:377 msgid "could not acquire SSPI credentials" msgstr "无法获得SSPI证书" -#: fe-auth.c:429 +#: fe-auth.c:433 msgid "channel binding required, but SSL not in use\n" msgstr "需要通道绑定,但未使用SSL\n" -#: fe-auth.c:436 +#: fe-auth.c:440 msgid "duplicate SASL authentication request\n" msgstr "重复的SASL认证请求\n" -#: fe-auth.c:492 +#: fe-auth.c:496 msgid "channel binding is required, but client does not support it\n" msgstr "通道绑定是必需的,但客户端不支持它\n" -#: fe-auth.c:509 +#: fe-auth.c:513 msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" msgstr "服务器通过非SSL连接提供了SCRAM-SHA-256-PLUS身份验证\n" -#: fe-auth.c:521 +#: fe-auth.c:525 msgid "none of the server's SASL authentication mechanisms are supported\n" msgstr "不支持服务器的SASL身份验证机制\n" -#: fe-auth.c:529 +#: fe-auth.c:533 msgid "channel binding is required, but server did not offer an authentication method that supports channel binding\n" msgstr "需要通道绑定,但服务器未提供支持通道绑定的身份验证方法\n" -#: fe-auth.c:635 +#: fe-auth.c:639 #, c-format msgid "out of memory allocating SASL buffer (%d)\n" msgstr "在分配SASL缓冲区(%d)时内存用尽\n" -#: fe-auth.c:660 +#: fe-auth.c:664 msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed\n" msgstr "从服务器接收到AuthenticationSASLFinal,但未完成SASL身份验证\n" -#: fe-auth.c:737 +#: fe-auth.c:741 msgid "SCM_CRED authentication method not supported\n" msgstr "不支持 SCM_CRED 认证方式\n" @@ -177,583 +186,562 @@ msgstr "需要通道绑定,但服务器验证的客户端没有通道绑定\n" msgid "channel binding required but not supported by server's authentication request\n" msgstr "服务器的身份验证请求需要但不支持通道绑定\n" -#: fe-auth.c:875 +#: fe-auth.c:877 msgid "Kerberos 4 authentication not supported\n" msgstr "不支持 Kerberos 4 认证\n" -#: fe-auth.c:880 +#: fe-auth.c:882 msgid "Kerberos 5 authentication not supported\n" msgstr "不支持 Kerberos 5 认证\n" -#: fe-auth.c:951 +#: fe-auth.c:953 msgid "GSSAPI authentication not supported\n" msgstr "不支持GSSAPI认证\n" -#: fe-auth.c:983 +#: fe-auth.c:985 msgid "SSPI authentication not supported\n" msgstr "不支持SSPI认证\n" -#: fe-auth.c:991 +#: fe-auth.c:993 msgid "Crypt authentication not supported\n" msgstr "不支持Crypt认证\n" -#: fe-auth.c:1057 +#: fe-auth.c:1060 #, c-format msgid "authentication method %u not supported\n" msgstr "不支持 %u 认证方式\n" -#: fe-auth.c:1104 +#: fe-auth.c:1107 #, c-format msgid "user name lookup failure: error code %lu\n" msgstr "用户名查找失败:错误代码%lu\n" -#: fe-auth.c:1114 fe-connect.c:2830 +#: fe-auth.c:1117 fe-connect.c:2851 #, c-format msgid "could not look up local user ID %d: %s\n" msgstr "无法查找本地用户ID %d: %s\n" -#: fe-auth.c:1119 fe-connect.c:2835 +#: fe-auth.c:1122 fe-connect.c:2856 #, c-format msgid "local user with ID %d does not exist\n" msgstr "ID 为 %d 的本地用户不存在\n" -#: fe-auth.c:1221 +#: fe-auth.c:1226 msgid "unexpected shape of result set returned for SHOW\n" msgstr "SHOW出现意外的结果状态\n" -#: fe-auth.c:1230 +#: fe-auth.c:1235 msgid "password_encryption value too long\n" msgstr "密码_加密值太长\n" -#: fe-auth.c:1270 +#: fe-auth.c:1275 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" msgstr "无法识别的密码加密算法 \"%s\"\n" -#: fe-connect.c:1069 +#: fe-connect.c:1094 #, c-format msgid "could not match %d host names to %d hostaddr values\n" msgstr "无法将主机名 %d 与主机地址 %d匹配\n" -#: fe-connect.c:1150 +#: fe-connect.c:1175 #, c-format msgid "could not match %d port numbers to %d hosts\n" msgstr "无法将端口号 %d与主机%d匹配\n" -#: fe-connect.c:1243 -#, c-format -msgid "invalid channel_binding value: \"%s\"\n" -msgstr "通道绑定值无效: \"%s\"\n" +#: fe-connect.c:1268 fe-connect.c:1294 fe-connect.c:1336 fe-connect.c:1345 +#: fe-connect.c:1378 fe-connect.c:1422 +msgid "invalid %s value: \"%s\"\n" +msgstr "无效的 %s值: \"%s\"\n" -#: fe-connect.c:1269 -#, c-format -msgid "invalid sslmode value: \"%s\"\n" -msgstr "无效的 sslmode 值: \"%s\"\n" - -#: fe-connect.c:1290 +#: fe-connect.c:1315 #, c-format msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" msgstr "无效的 sslmode 值 \"%s\" 当没有把 SSL 支持编译进来时\n" -#: fe-connect.c:1311 -#, c-format -msgid "invalid ssl_min_protocol_version value: \"%s\"\n" -msgstr "无效的 ssl_min_protocol_version 值: \"%s\"\n" - -#: fe-connect.c:1319 -#, c-format -msgid "invalid ssl_max_protocol_version value: \"%s\"\n" -msgstr "无效的 ssl_max_protocol_version 值: \"%s\"\n" - -#: fe-connect.c:1336 +#: fe-connect.c:1363 msgid "invalid SSL protocol version range\n" msgstr "无效的SSL协议版本范围\n" -#: fe-connect.c:1351 -#, c-format -msgid "invalid gssencmode value: \"%s\"\n" -msgstr "无效的 gssencmode 值: \"%s\"\n" - -#: fe-connect.c:1360 +#: fe-connect.c:1388 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" msgstr "无效的 gssencmode 值 \"%s\" 当没有把 GSSAPI 支持编译进来时\n" -#: fe-connect.c:1395 -#, c-format -msgid "invalid target_session_attrs value: \"%s\"\n" -msgstr "无效的 target_session_attrs 值: \"%s\"\n" - -#: fe-connect.c:1613 +#: fe-connect.c:1648 #, c-format msgid "could not set socket to TCP no delay mode: %s\n" msgstr "无法将套接字设置为 TCP 无延迟模式: %s\n" -#: fe-connect.c:1674 -#, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running locally and accepting\n" -"\tconnections on Unix domain socket \"%s\"?\n" -msgstr "" -"无法联接到服务器: %s\n" -"\t服务器是否在本地运行并且在 Unix 域套接字\n" -"\t\"%s\"上准备接受联接?\n" +#: fe-connect.c:1710 +msgid "connection to server on socket \"%s\" failed: " +msgstr "连接到套接字\"%s\"上的服务器失败:" -#: fe-connect.c:1711 -#, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running on host \"%s\" (%s) and accepting\n" -"\tTCP/IP connections on port %s?\n" -msgstr "" -"无法联接到服务器: %s\n" -"\t服务器是否在主机 \"%s\"(%s) 上运行并且准备接受在端口\n" -"%s 上的 TCP/IP 联接?\n" +#: fe-connect.c:1737 +msgid "connection to server at \"%s\" (%s), port %s failed: " +msgstr "连接到\"%s\" (%s)上的服务器,端口%s失败:" -#: fe-connect.c:1719 -#, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running on host \"%s\" and accepting\n" -"\tTCP/IP connections on port %s?\n" -msgstr "" -"无法联接到服务器: %s\n" -"\t服务器是否在主机 \"%s\" 上运行并且准备接受在端口\n" -"%s 上的 TCP/IP 联接?\n" +#: fe-connect.c:1742 +msgid "connection to server at \"%s\", port %s failed: " +msgstr "连接到\"%s\"上的服务器,端口%s失败:" -#: fe-connect.c:1789 +#: fe-connect.c:1767 +msgid "\tIs the server running locally and accepting connections on that socket?\n" +msgstr "\t服务器是否在本地运行并接受该套接字上的连接?\n" + +#: fe-connect.c:1771 +msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" +msgstr "\t服务器是否在该主机上运行并接受TCP/IP连接?\n" + +#: fe-connect.c:1835 #, c-format msgid "invalid integer value \"%s\" for connection option \"%s\"\n" msgstr "连接选项\"%2$s\"的整数值\"%1$s\"无效\n" -#: fe-connect.c:1819 fe-connect.c:1853 fe-connect.c:1888 fe-connect.c:1975 -#: fe-connect.c:2619 -#, c-format -msgid "setsockopt(%s) failed: %s\n" -msgstr "执行setsockopt(%s) 失败: %s\n" +#: fe-connect.c:1865 fe-connect.c:1900 fe-connect.c:1936 fe-connect.c:2025 +#: fe-connect.c:2639 +msgid "%s(%s) failed: %s\n" +msgstr "%s(%s)失败: %s\n" -#: fe-connect.c:1941 -#, c-format -msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" -msgstr "执行WSAIoctl(SIO_KEEPALIVE_VALS)失败:%u\n" +#: fe-connect.c:1990 +msgid "%s(%s) failed: error code %d\n" +msgstr "%s(%s) 失败: 错误码为 %d\n" -#: fe-connect.c:2312 +#: fe-connect.c:2305 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "无效的联接状态, 可能是存储器数据被破坏的标志\n" -#: fe-connect.c:2378 +#: fe-connect.c:2384 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "无效端口号: \"%s\"\n" -#: fe-connect.c:2394 +#: fe-connect.c:2400 #, c-format msgid "could not translate host name \"%s\" to address: %s\n" msgstr "无法解释主机名 \"%s\" 到地址: %s\n" -#: fe-connect.c:2407 +#: fe-connect.c:2413 #, c-format msgid "could not parse network address \"%s\": %s\n" msgstr "无法分析网络地址\"%s\": %s\n" -#: fe-connect.c:2420 +#: fe-connect.c:2426 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" msgstr "Unix域的套接字路径\"%s\"超长(最大为%d字节)\n" -#: fe-connect.c:2435 +#: fe-connect.c:2441 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" msgstr "无法解释 Unix-domian 套接字路径 \"%s\" 到地址: %s\n" -#: fe-connect.c:2556 +#: fe-connect.c:2567 #, c-format msgid "could not create socket: %s\n" msgstr "无法创建套接字: %s\n" -#: fe-connect.c:2578 +#: fe-connect.c:2598 #, c-format msgid "could not set socket to nonblocking mode: %s\n" msgstr "无法设置套接字为非阻塞模式: %s\n" -#: fe-connect.c:2588 +#: fe-connect.c:2608 #, c-format msgid "could not set socket to close-on-exec mode: %s\n" msgstr "无法将套接字设置为执行时关闭 (close-on-exec) 模式: %s\n" -#: fe-connect.c:2606 +#: fe-connect.c:2626 msgid "keepalives parameter must be an integer\n" msgstr "参数keepalives必须是一个整数\n" -#: fe-connect.c:2746 +#: fe-connect.c:2767 #, c-format msgid "could not get socket error status: %s\n" msgstr "无法获取套接字错误状态: %s\n" -#: fe-connect.c:2774 +#: fe-connect.c:2795 #, c-format msgid "could not get client address from socket: %s\n" msgstr "无法从套接字获取客户端地址: %s\n" -#: fe-connect.c:2816 +#: fe-connect.c:2837 msgid "requirepeer parameter is not supported on this platform\n" msgstr "在此平台上不支持requirepeer参数\n" -#: fe-connect.c:2819 +#: fe-connect.c:2840 #, c-format msgid "could not get peer credentials: %s\n" msgstr "无法获得对等(peer)证书:%s\n" -#: fe-connect.c:2843 +#: fe-connect.c:2864 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" msgstr "期望对方用户指定值为 \"%s\", 但实际的对方用户名为 \"%s\"\n" -#: fe-connect.c:2883 +#: fe-connect.c:2904 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "无法发送 GSSAPI 握手包: %s\n" -#: fe-connect.c:2895 +#: fe-connect.c:2916 msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)\n" msgstr "需要GSSAPI加密,但不可能(可能没有凭据缓存、服务器不支持或使用本地套接字)\n" -#: fe-connect.c:2922 +#: fe-connect.c:2958 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "无法发送 SSL 握手包: %s\n" -#: fe-connect.c:2961 +#: fe-connect.c:2989 #, c-format msgid "could not send startup packet: %s\n" msgstr "无法发送启动包: %s\n" -#: fe-connect.c:3031 +#: fe-connect.c:3065 msgid "server does not support SSL, but SSL was required\n" msgstr "服务器不支持 SSL, 但是要求使用 SSL\n" -#: fe-connect.c:3057 +#: fe-connect.c:3092 #, c-format msgid "received invalid response to SSL negotiation: %c\n" msgstr "收到对 SSL 握手的无效响应: %c\n" -#: fe-connect.c:3147 +#: fe-connect.c:3181 msgid "server doesn't support GSSAPI encryption, but it was required\n" msgstr "服务器不支持 GSSAPI, 但这是必须的\n" -#: fe-connect.c:3158 +#: fe-connect.c:3193 #, c-format msgid "received invalid response to GSSAPI negotiation: %c\n" msgstr "收到对 GSSAPI 握手的无效响应: %c\n" -#: fe-connect.c:3225 fe-connect.c:3256 +#: fe-connect.c:3259 fe-connect.c:3284 #, c-format msgid "expected authentication request from server, but received %c\n" msgstr "期待来自服务器的认证请求, 却收到 %c\n" -#: fe-connect.c:3502 +#: fe-connect.c:3491 msgid "unexpected message from server during startup\n" msgstr "启动过程中收到来自服务器的非预期信息\n" -#: fe-connect.c:3707 -#, c-format -msgid "could not make a writable connection to server \"%s:%s\"\n" -msgstr "无法与服务器建立可写连接\"%s:%s\"\n" +#: fe-connect.c:3583 +msgid "session is read-only\n" +msgstr "会话是只读的\n" -#: fe-connect.c:3753 -#, c-format -msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" -msgstr "在服务器\"%s:%s\"上测试\"SHOW transaction_read_only\"失败\n" +#: fe-connect.c:3586 +msgid "session is not read-only\n" +msgstr "会话不是只读的\n" + +#: fe-connect.c:3640 +msgid "server is in hot standby mode\n" +msgstr "服务器处于热备份模式\n" + +#: fe-connect.c:3643 +msgid "server is not in hot standby mode\n" +msgstr "服务器不处于热备份模式\n" + +#: fe-connect.c:3754 fe-connect.c:3806 +msgid "\"%s\" failed\n" +msgstr "\"%s\" 失败\n" -#: fe-connect.c:3768 +#: fe-connect.c:3820 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption\n" msgstr "无效的连接状态 %d, 这可能表示内存出现问题\n" -#: fe-connect.c:4223 fe-connect.c:4283 +#: fe-connect.c:4266 fe-connect.c:4326 #, c-format msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" msgstr "在PGEVT_CONNRESET事件触发期间执行PGEventProc \"%s\"错误\n" -#: fe-connect.c:4630 +#: fe-connect.c:4670 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" msgstr "无效LDAP URL\"%s\": 模式必须是ldap://\n" -#: fe-connect.c:4645 +#: fe-connect.c:4685 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" msgstr "无效LDAP URL \"%s\": 丢失可区分的名称\n" -#: fe-connect.c:4657 fe-connect.c:4712 +#: fe-connect.c:4697 fe-connect.c:4755 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" msgstr "无效LDAP URL \"%s\": 只能有一个属性\n" -#: fe-connect.c:4668 fe-connect.c:4727 +#: fe-connect.c:4709 fe-connect.c:4771 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" msgstr "无效LDAP URL \"%s\": 必须有搜索范围(base/one/sub)\n" -#: fe-connect.c:4679 +#: fe-connect.c:4721 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "无效的 LDAP URL \"%s\": 没有过滤器\n" -#: fe-connect.c:4700 +#: fe-connect.c:4743 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" msgstr "无效LDAP URL \"%s\": 无效端口号\n" -#: fe-connect.c:4736 +#: fe-connect.c:4781 msgid "could not create LDAP structure\n" msgstr "无法创建LDAP结构\n" -#: fe-connect.c:4812 +#: fe-connect.c:4857 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "在LDAP服务器上的查找失败: %s\n" -#: fe-connect.c:4823 +#: fe-connect.c:4868 msgid "more than one entry found on LDAP lookup\n" msgstr "在LDAP搜索上找到多个入口\n" -#: fe-connect.c:4824 fe-connect.c:4836 +#: fe-connect.c:4869 fe-connect.c:4881 msgid "no entry found on LDAP lookup\n" msgstr "在LDAP查找上没有发现入口\n" -#: fe-connect.c:4847 fe-connect.c:4860 +#: fe-connect.c:4892 fe-connect.c:4905 msgid "attribute has no values on LDAP lookup\n" msgstr "在LDAP查找上的属性没有值\n" -#: fe-connect.c:4912 fe-connect.c:4931 fe-connect.c:5463 +#: fe-connect.c:4957 fe-connect.c:4976 fe-connect.c:5508 #, c-format msgid "missing \"=\" after \"%s\" in connection info string\n" msgstr "在联接信息字串里的 \"%s\" 后面缺少 \"=\"\n" -#: fe-connect.c:5004 fe-connect.c:5648 fe-connect.c:6422 +#: fe-connect.c:5049 fe-connect.c:5693 fe-connect.c:6469 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "非法联接选项 \"%s\"\n" -#: fe-connect.c:5020 fe-connect.c:5512 +#: fe-connect.c:5065 fe-connect.c:5557 msgid "unterminated quoted string in connection info string\n" msgstr "联接信息字串中未结束的引号字串\n" -#: fe-connect.c:5103 +#: fe-connect.c:5146 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "错误:没有找到服务\"%s\"的定义\n" -#: fe-connect.c:5126 +#: fe-connect.c:5172 #, c-format msgid "service file \"%s\" not found\n" msgstr "错误:没有找到服务文件\"%s\"\n" -#: fe-connect.c:5141 +#: fe-connect.c:5186 #, c-format msgid "line %d too long in service file \"%s\"\n" msgstr "在服务文件\"%2$s\"中的第%1$d行的长度太长\n" -#: fe-connect.c:5213 fe-connect.c:5257 +#: fe-connect.c:5257 fe-connect.c:5301 #, c-format msgid "syntax error in service file \"%s\", line %d\n" msgstr "在服务文件\"%s\"的第%d行出现语法错误\n" -#: fe-connect.c:5224 +#: fe-connect.c:5268 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d\n" msgstr "在服务文件\"%s\"的第%d行出现不支持的嵌套服务说明\n" -#: fe-connect.c:5944 +#: fe-connect.c:5989 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"\n" msgstr "无效的URI传入内部解析器处理程序: \"%s\"\n" -#: fe-connect.c:6021 +#: fe-connect.c:6066 #, c-format msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"\n" msgstr "在 URI: \"%s\"中的IPv6主机地址里查找匹配符\"]\"时遇到了字符串结束符\n" -#: fe-connect.c:6028 +#: fe-connect.c:6073 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"\n" msgstr "URI:\"%s\"中的IPv6主机地址可能不为空\n" -#: fe-connect.c:6043 +#: fe-connect.c:6088 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" msgstr "非预期的字符\"%c\"出现在在位置%d, URI (expected \":\" or \"/\"):\"%s\"\n" -#: fe-connect.c:6172 +#: fe-connect.c:6218 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "遇到多余的键/值分隔符\"=\"在URI查询参数里: \"%s\"\n" -#: fe-connect.c:6192 +#: fe-connect.c:6238 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "缺少相应的键/值分隔符\"=\"在URI查询参数里: \"%s\"\n" -#: fe-connect.c:6243 +#: fe-connect.c:6290 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "无效的URI查询参数: \"%s\"\n" -#: fe-connect.c:6317 +#: fe-connect.c:6364 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "无效的百分号编码令牌: \"%s\"\n" -#: fe-connect.c:6327 +#: fe-connect.c:6374 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" msgstr "在百分值编码的值: \"%s\"里禁止使用 %%00\n" -#: fe-connect.c:6690 +#: fe-connect.c:6744 msgid "connection pointer is NULL\n" msgstr "联接指针是 NULL\n" -#: fe-connect.c:6989 +#: fe-connect.c:7032 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "警告: 口令文件\"%s\"不是普通文本文件\n" -#: fe-connect.c:6998 +#: fe-connect.c:7041 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "警告: 口令文件\"%s\"的访问权限过大; 权限应设置 为 u=rw (0600)或更少\n" -#: fe-connect.c:7039 -#, c-format -msgid "WARNING: line %d too long in password file \"%s\"\n" -msgstr "警告:在密码文件\"%2$s\"中的第%1$d行的长度太长\n" - -#: fe-connect.c:7118 +#: fe-connect.c:7149 #, c-format msgid "password retrieved from file \"%s\"\n" msgstr "从文件\"%s\"中获取口令\n" -#: fe-exec.c:444 fe-exec.c:2821 +#: fe-exec.c:449 fe-exec.c:3300 #, c-format msgid "row number %d is out of range 0..%d" msgstr "行号码 %d 超出了范围 0..%d" -#: fe-exec.c:505 fe-protocol2.c:497 fe-protocol2.c:532 fe-protocol2.c:1050 -#: fe-protocol3.c:206 fe-protocol3.c:233 fe-protocol3.c:250 fe-protocol3.c:330 -#: fe-protocol3.c:723 fe-protocol3.c:954 +#: fe-exec.c:510 fe-protocol3.c:219 fe-protocol3.c:244 fe-protocol3.c:273 +#: fe-protocol3.c:291 fe-protocol3.c:371 fe-protocol3.c:743 msgid "out of memory" -msgstr "内存用尽" +msgstr "内存不足" -#: fe-exec.c:506 fe-protocol2.c:1396 fe-protocol3.c:1907 +#: fe-exec.c:511 fe-protocol3.c:1939 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:815 +#: fe-exec.c:792 msgid "write to server failed\n" msgstr "写入服务器失败\n" -#: fe-exec.c:896 +#: fe-exec.c:864 msgid "NOTICE" msgstr "注意" -#: fe-exec.c:954 +#: fe-exec.c:922 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult不能支持超过INT_MAX元组" -#: fe-exec.c:966 +#: fe-exec.c:934 msgid "size_t overflow" msgstr "size_t溢出" -#: fe-exec.c:1243 fe-exec.c:1301 fe-exec.c:1347 +#: fe-exec.c:1349 fe-exec.c:1454 fe-exec.c:1503 msgid "command string is a null pointer\n" msgstr "命令字串是一个空指针\n" -#: fe-exec.c:1307 fe-exec.c:1353 fe-exec.c:1448 -msgid "number of parameters must be between 0 and 65535\n" -msgstr "参数的个数必须介于0到65535之间\n" +#: fe-exec.c:1460 fe-exec.c:1509 fe-exec.c:1605 +msgid "number of parameters must be between 0 and %d\n" +msgstr "参数的个数必须介于0到%d之间\n" -#: fe-exec.c:1341 fe-exec.c:1442 +#: fe-exec.c:1497 fe-exec.c:1599 msgid "statement name is a null pointer\n" msgstr "声明名字是一个空指针\n" -#: fe-exec.c:1361 fe-exec.c:1524 fe-exec.c:2233 fe-exec.c:2435 -msgid "function requires at least protocol version 3.0\n" -msgstr "函数至少需要 3.0 版本的协议\n" - -#: fe-exec.c:1479 +#: fe-exec.c:1641 fe-exec.c:3153 msgid "no connection to the server\n" msgstr "没有到服务器的联接\n" -#: fe-exec.c:1486 +#: fe-exec.c:1650 fe-exec.c:3162 msgid "another command is already in progress\n" msgstr "已经有另外一条命令在处理\n" -#: fe-exec.c:1600 +#: fe-exec.c:1679 +msgid "cannot queue commands during COPY\n" +msgstr "复制期间无法对命令排队\n" + +#: fe-exec.c:1797 msgid "length must be given for binary parameter\n" msgstr "对于2进制参数必须指定长度\n" -#: fe-exec.c:1863 +#: fe-exec.c:2117 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "意外的 asyncStatus(异步状态): %d\n" -#: fe-exec.c:1883 +#: fe-exec.c:2137 #, c-format msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" msgstr "在PGEVT_CONNRESET事件触发期间执行PGEventProc \"%s\"错误\n" -#: fe-exec.c:2043 +#: fe-exec.c:2285 +msgid "synchronous command execution functions are not allowed in pipeline mode\n" +msgstr "管道模式下不允许使用同步命令执行函数\n" + +#: fe-exec.c:2307 msgid "COPY terminated by new PQexec" msgstr "COPY 被一个新的 PQexec 终止" -#: fe-exec.c:2051 -msgid "COPY IN state must be terminated first\n" -msgstr "COPY IN 状态必须先结束\n" - -#: fe-exec.c:2071 -msgid "COPY OUT state must be terminated first\n" -msgstr "COPY OUT 状态必须先结束\n" - -#: fe-exec.c:2079 +#: fe-exec.c:2324 msgid "PQexec not allowed during COPY BOTH\n" msgstr "在 COPY BOTH时不允许调用PQexec\n" -#: fe-exec.c:2325 fe-exec.c:2392 fe-exec.c:2482 fe-protocol2.c:1353 -#: fe-protocol3.c:1838 +#: fe-exec.c:2552 fe-exec.c:2608 fe-exec.c:2677 fe-protocol3.c:1870 msgid "no COPY in progress\n" msgstr "没有正在处理的 COPY\n" -#: fe-exec.c:2672 +#: fe-exec.c:2854 +msgid "PQfn not allowed in pipeline mode\n" +msgstr "管道模式下不允许使用PQfn\n" + +#: fe-exec.c:2862 msgid "connection in wrong state\n" msgstr "联接处于错误状态\n" -#: fe-exec.c:2703 +#: fe-exec.c:2906 +msgid "cannot enter pipeline mode, connection not idle\n" +msgstr "无法进入管道模式,连接未空闲\n" + +#: fe-exec.c:2940 fe-exec.c:2957 +msgid "cannot exit pipeline mode with uncollected results\n" +msgstr "无法退出具有未收集结果的管道模式\n" + +#: fe-exec.c:2945 +msgid "cannot exit pipeline mode while busy\n" +msgstr "忙时无法退出管道模式\n" + +#: fe-exec.c:3087 +msgid "cannot send pipeline when not in pipeline mode\n" +msgstr "不处于管道模式时无法发送管道\n" + +#: fe-exec.c:3189 msgid "invalid ExecStatusType code" msgstr "非法 ExecStatusType 代码" -#: fe-exec.c:2730 +#: fe-exec.c:3216 msgid "PGresult is not an error result\n" msgstr "PGresult不是错误的结果\n" -#: fe-exec.c:2805 fe-exec.c:2828 +#: fe-exec.c:3284 fe-exec.c:3307 #, c-format msgid "column number %d is out of range 0..%d" msgstr "列号码 %d 超出了范围 0..%d" -#: fe-exec.c:2843 +#: fe-exec.c:3322 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "参数号%d超出了范围 0..%d" -#: fe-exec.c:3153 +#: fe-exec.c:3632 #, c-format msgid "could not interpret result from server: %s" msgstr "无法解释来自服务器的结果: %s" -#: fe-exec.c:3392 fe-exec.c:3476 +#: fe-exec.c:3892 fe-exec.c:3981 msgid "incomplete multibyte character\n" msgstr "无效的多字节字符\n" @@ -761,105 +749,59 @@ msgstr "无效的多字节字符\n" msgid "GSSAPI name import error" msgstr "GSSAPI名称导入错误" -#: fe-lobj.c:154 -msgid "cannot determine OID of function lo_truncate\n" -msgstr "无法确定函数 lo_creat 的 OID\n" +#: fe-lobj.c:145 fe-lobj.c:210 fe-lobj.c:403 fe-lobj.c:494 fe-lobj.c:568 +#: fe-lobj.c:969 fe-lobj.c:977 fe-lobj.c:985 fe-lobj.c:993 fe-lobj.c:1001 +#: fe-lobj.c:1009 fe-lobj.c:1017 fe-lobj.c:1025 +msgid "cannot determine OID of function %s\n" +msgstr "无法判断函数%s的 OID\n" -#: fe-lobj.c:170 +#: fe-lobj.c:162 msgid "argument of lo_truncate exceeds integer range\n" msgstr "lo_truncate的参数超出整数范围\n" -#: fe-lobj.c:221 -msgid "cannot determine OID of function lo_truncate64\n" -msgstr "无法确定函数lo_truncate64的OID值\n" - -#: fe-lobj.c:279 +#: fe-lobj.c:266 msgid "argument of lo_read exceeds integer range\n" msgstr "lo_read的参数值已超出整数范围\n" -#: fe-lobj.c:334 +#: fe-lobj.c:318 msgid "argument of lo_write exceeds integer range\n" msgstr "lo_write的参数值已超出整数范围\n" -#: fe-lobj.c:425 -msgid "cannot determine OID of function lo_lseek64\n" -msgstr "无法确定函数lo_lseek64的OID值\n" - -#: fe-lobj.c:521 -msgid "cannot determine OID of function lo_create\n" -msgstr "无法确定函数 lo_creat 的 OID\n" - -#: fe-lobj.c:600 -msgid "cannot determine OID of function lo_tell64\n" -msgstr "无法确定函数lo_tell64的OID值\n" - -#: fe-lobj.c:706 fe-lobj.c:815 +#: fe-lobj.c:678 fe-lobj.c:789 #, c-format msgid "could not open file \"%s\": %s\n" msgstr "无法打开文件 \"%s\": %s\n" -#: fe-lobj.c:761 +#: fe-lobj.c:734 #, c-format msgid "could not read from file \"%s\": %s\n" msgstr "无法读取文件 \"%s\": %s\n" -#: fe-lobj.c:835 fe-lobj.c:859 +#: fe-lobj.c:810 fe-lobj.c:834 #, c-format msgid "could not write to file \"%s\": %s\n" msgstr "无法写入文件 \"%s\": %s\n" -#: fe-lobj.c:946 +#: fe-lobj.c:920 msgid "query to initialize large object functions did not return data\n" msgstr "初始化大对象函数的查询没有返回数据\n" -#: fe-lobj.c:995 -msgid "cannot determine OID of function lo_open\n" -msgstr "无法判断函数 lo_open 的 OID\n" - -#: fe-lobj.c:1002 -msgid "cannot determine OID of function lo_close\n" -msgstr "无法判断函数 lo_close 的 OID\n" - -#: fe-lobj.c:1009 -msgid "cannot determine OID of function lo_creat\n" -msgstr "无法判断函数 lo_creat 的 OID\n" - -#: fe-lobj.c:1016 -msgid "cannot determine OID of function lo_unlink\n" -msgstr "无法判断函数 lo_unlink 的 OID\n" - -#: fe-lobj.c:1023 -msgid "cannot determine OID of function lo_lseek\n" -msgstr "无法判断函数 lo_lseek 的 OID\n" - -#: fe-lobj.c:1030 -msgid "cannot determine OID of function lo_tell\n" -msgstr "无法判断函数 lo_tell 的 OID\n" - -#: fe-lobj.c:1037 -msgid "cannot determine OID of function loread\n" -msgstr "无法判断函数 loread 的 OID\n" - -#: fe-lobj.c:1044 -msgid "cannot determine OID of function lowrite\n" -msgstr "无法判断函数 lowrite 的 OID\n" - -#: fe-misc.c:289 +#: fe-misc.c:242 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "pqGetInt 不支持大小为 %lu 的整数" -#: fe-misc.c:325 +#: fe-misc.c:275 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "pqPutInt 不支持大小为 %lu 的整数" -#: fe-misc.c:636 fe-misc.c:869 +#: fe-misc.c:576 fe-misc.c:822 msgid "connection not open\n" msgstr "联接未打开\n" -#: fe-misc.c:805 fe-secure-openssl.c:209 fe-secure-openssl.c:316 -#: fe-secure.c:267 fe-secure.c:383 +#: fe-misc.c:755 fe-secure-openssl.c:209 fe-secure-openssl.c:316 +#: fe-secure.c:260 fe-secure.c:373 msgid "" "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" @@ -869,184 +811,145 @@ msgstr "" "\t这种现象通常意味着服务器在处理请求之前\n" "或者正在处理请求的时候意外中止\n" -#: fe-misc.c:1063 +#: fe-misc.c:1015 msgid "timeout expired\n" msgstr "超时满\n" -#: fe-misc.c:1108 +#: fe-misc.c:1060 msgid "invalid socket\n" msgstr "无效套接字\n" -#: fe-misc.c:1131 -#, c-format -msgid "select() failed: %s\n" -msgstr "select() 失败: %s\n" +#: fe-misc.c:1083 +msgid "%s() failed: %s\n" +msgstr "%s()失败: %s\n" -#: fe-protocol2.c:87 -#, c-format -msgid "invalid setenv state %c, probably indicative of memory corruption\n" -msgstr "无效的 setenv 状态 %c, 可能是内存被破坏\n" - -#: fe-protocol2.c:384 -#, c-format -msgid "invalid state %c, probably indicative of memory corruption\n" -msgstr "无效状态 %c, 可能是内存被破坏\n" - -#: fe-protocol2.c:473 fe-protocol3.c:183 +#: fe-protocol3.c:196 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "当空闲时收到服务起发送过来的消息类型 0x%02x" -#: fe-protocol2.c:523 -#, c-format -msgid "unexpected character %c following empty query response (\"I\" message)" -msgstr "unexpected character %c following empty query response (\"I\" message)" - -#: fe-protocol2.c:589 -#, c-format -msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" -msgstr "server sent data (\"D\" message) without prior row description (\"T\" message)" - -#: fe-protocol2.c:607 -#, c-format -msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" -msgstr "server sent binary data (\"B\" message) without prior row description (\"T\" message)" +#: fe-protocol3.c:403 +msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" +msgstr "server sent data (\"D\" message) without prior row description (\"T\" message)\n" -#: fe-protocol2.c:626 fe-protocol3.c:408 +#: fe-protocol3.c:446 #, c-format msgid "unexpected response from server; first received character was \"%c\"\n" msgstr "来自服务器意外的回执, 第一个收到的字符是 \"%c\"\n" -#: fe-protocol2.c:755 fe-protocol2.c:930 fe-protocol3.c:622 fe-protocol3.c:849 -msgid "out of memory for query result" -msgstr "查询结果时内存耗尽" - -#: fe-protocol2.c:1408 -#, c-format -msgid "lost synchronization with server, resetting connection" -msgstr "失去与服务器同步, 重置连接" - -#: fe-protocol2.c:1530 fe-protocol2.c:1562 fe-protocol3.c:2095 -#, c-format -msgid "protocol error: id=0x%x\n" -msgstr "协议错误: id=0x%x\n" - -#: fe-protocol3.c:365 -msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" -msgstr "server sent data (\"D\" message) without prior row description (\"T\" message)\n" - -#: fe-protocol3.c:429 +#: fe-protocol3.c:471 #, c-format msgid "message contents do not agree with length in message type \"%c\"\n" msgstr "在消息类型 \"%c\" 中, 消息内容与长度不匹配\n" -#: fe-protocol3.c:449 +#: fe-protocol3.c:491 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d\n" msgstr "失去与服务器同步: 获取到消息类型 \"%c\", 长度 %d\n" -#: fe-protocol3.c:500 fe-protocol3.c:540 +#: fe-protocol3.c:543 fe-protocol3.c:583 msgid "insufficient data in \"T\" message" msgstr "\"T\"消息中剩下的数据不够" -#: fe-protocol3.c:573 -msgid "extraneous data in \"T\" message" -msgstr "\"T\"消息中有无关的数据" +#: fe-protocol3.c:654 fe-protocol3.c:860 +msgid "out of memory for query result" +msgstr "查询结果时内存耗尽" -#: fe-protocol3.c:686 -msgid "extraneous data in \"t\" message" -msgstr "\"t\"消息中有无关的数据" +#: fe-protocol3.c:723 +msgid "insufficient data in \"t\" message" +msgstr "\"t\"消息中剩下的数据不够" -#: fe-protocol3.c:757 fe-protocol3.c:789 fe-protocol3.c:807 +#: fe-protocol3.c:782 fe-protocol3.c:814 fe-protocol3.c:832 msgid "insufficient data in \"D\" message" msgstr "\"D\"消息中剩下的数据不够" -#: fe-protocol3.c:763 +#: fe-protocol3.c:788 msgid "unexpected field count in \"D\" message" msgstr "在 \"D\" 消息中, 意外的字段个数" -#: fe-protocol3.c:816 -msgid "extraneous data in \"D\" message" -msgstr "\"D\"消息中已经没有数据了" - -#: fe-protocol3.c:1008 +#: fe-protocol3.c:1036 msgid "no error message available\n" msgstr "没有可用的错误消息\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1056 fe-protocol3.c:1075 +#: fe-protocol3.c:1084 fe-protocol3.c:1103 #, c-format msgid " at character %s" msgstr " 在字符 %s" -#: fe-protocol3.c:1088 +#: fe-protocol3.c:1116 #, c-format msgid "DETAIL: %s\n" msgstr "描述: %s\n" -#: fe-protocol3.c:1091 +#: fe-protocol3.c:1119 #, c-format msgid "HINT: %s\n" msgstr "提示: %s\n" -#: fe-protocol3.c:1094 +#: fe-protocol3.c:1122 #, c-format msgid "QUERY: %s\n" msgstr "查询: %s\n" -#: fe-protocol3.c:1101 +#: fe-protocol3.c:1129 #, c-format msgid "CONTEXT: %s\n" msgstr "背景: %s\n" -#: fe-protocol3.c:1110 +#: fe-protocol3.c:1138 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "方案名: %s\n" -#: fe-protocol3.c:1114 +#: fe-protocol3.c:1142 #, c-format msgid "TABLE NAME: %s\n" msgstr "表名: %s\n" -#: fe-protocol3.c:1118 +#: fe-protocol3.c:1146 #, c-format msgid "COLUMN NAME: %s\n" msgstr "列名: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1150 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "数据类型名: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1154 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "约束名: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1166 msgid "LOCATION: " msgstr "位置: " -#: fe-protocol3.c:1140 +#: fe-protocol3.c:1168 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1170 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1337 +#: fe-protocol3.c:1365 #, c-format msgid "LINE %d: " msgstr "第%d行" -#: fe-protocol3.c:1732 +#: fe-protocol3.c:1764 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline: not doing text COPY OUT\n" +#: fe-protocol3.c:2130 +#, c-format +msgid "protocol error: id=0x%x\n" +msgstr "协议错误: id=0x%x\n" + #: fe-secure-common.c:124 msgid "SSL certificate's name contains embedded null\n" msgstr "SSL证书的名称包含嵌入的空值\n" @@ -1094,24 +997,24 @@ msgstr "传入的GSSAPI消息未使用机密性\n" msgid "could not initiate GSSAPI security context" msgstr "无法初始化GSSAPI安全上下文" -#: fe-secure-gssapi.c:673 +#: fe-secure-gssapi.c:670 msgid "GSSAPI size check error" msgstr "GSSAPI大小检查错误" -#: fe-secure-gssapi.c:684 +#: fe-secure-gssapi.c:681 msgid "GSSAPI context establishment error" msgstr "GSSAPI上下文创建错误" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1291 +#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1333 #, c-format msgid "SSL SYSCALL error: %s\n" msgstr "SSL SYSCALL 错误: %s\n" -#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1295 +#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1337 msgid "SSL SYSCALL error: EOF detected\n" msgstr "SSL SYSCALL 错误: 发现结束符\n" -#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1304 +#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1346 #, c-format msgid "SSL error: %s\n" msgstr "SSL 错误: %s\n" @@ -1120,7 +1023,7 @@ msgstr "SSL 错误: %s\n" msgid "SSL connection has been closed unexpectedly\n" msgstr "SSL连接异常关闭\n" -#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1313 +#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1396 #, c-format msgid "unrecognized SSL error code: %d\n" msgstr "未知的 SSL 错误码: %d\n" @@ -1142,37 +1045,37 @@ msgstr "无法生成对等证书哈希\n" msgid "SSL certificate's name entry is missing\n" msgstr "SSL证书的名称项缺失\n" -#: fe-secure-openssl.c:815 +#: fe-secure-openssl.c:822 #, c-format msgid "could not create SSL context: %s\n" msgstr "无法创建 SSL 环境: %s\n" -#: fe-secure-openssl.c:854 +#: fe-secure-openssl.c:861 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version\n" msgstr "最小SSL协议版本的值\"%s\"无效\n" -#: fe-secure-openssl.c:865 +#: fe-secure-openssl.c:872 #, c-format msgid "could not set minimum SSL protocol version: %s\n" msgstr "无法设置最低SSL协议版本: %s\n" -#: fe-secure-openssl.c:883 +#: fe-secure-openssl.c:890 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version\n" msgstr "最大SSL协议版本的值\"%s\"无效\n" -#: fe-secure-openssl.c:894 +#: fe-secure-openssl.c:901 #, c-format msgid "could not set maximum SSL protocol version: %s\n" msgstr "无法设置最大SSL协议版本: %s\n" -#: fe-secure-openssl.c:930 +#: fe-secure-openssl.c:937 #, c-format msgid "could not read root certificate file \"%s\": %s\n" msgstr "无法读取根证书文件 \"%s\": %s\n" -#: fe-secure-openssl.c:974 +#: fe-secure-openssl.c:990 msgid "" "could not get home directory to locate root certificate file\n" "Either provide the file or change sslmode to disable server certificate verification.\n" @@ -1180,7 +1083,7 @@ msgstr "" "无法获取home目录以定位根认证文件\n" "可以提供该文件或者将sslmode改为禁用服务器证书认证.\n" -#: fe-secure-openssl.c:978 +#: fe-secure-openssl.c:994 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1189,87 +1092,96 @@ msgstr "" "根认证文件\"%s\"不存在\n" "可以提供这个文件或者将sslmode改为禁用服务器认证检验.\n" -#: fe-secure-openssl.c:1009 +#: fe-secure-openssl.c:1025 #, c-format msgid "could not open certificate file \"%s\": %s\n" msgstr "无法打开证书文件 \"%s\": %s\n" -#: fe-secure-openssl.c:1028 +#: fe-secure-openssl.c:1044 #, c-format msgid "could not read certificate file \"%s\": %s\n" msgstr "无法读取证书文件 \"%s\": %s\n" -#: fe-secure-openssl.c:1053 +#: fe-secure-openssl.c:1069 #, c-format msgid "could not establish SSL connection: %s\n" msgstr "无法建立 SSL 联接: %s\n" -#: fe-secure-openssl.c:1107 +#: fe-secure-openssl.c:1103 +msgid "could not set SSL Server Name Indication (SNI): %s\n" +msgstr "无法设置SSL服务器名称指示(SNI): %s\n" + +#: fe-secure-openssl.c:1149 #, c-format msgid "could not load SSL engine \"%s\": %s\n" msgstr "无法加载SSL引擎 \"%s\": %s\n" -#: fe-secure-openssl.c:1119 +#: fe-secure-openssl.c:1161 #, c-format msgid "could not initialize SSL engine \"%s\": %s\n" msgstr "无法初始化SSL引擎\"%s\": %s\n" -#: fe-secure-openssl.c:1135 +#: fe-secure-openssl.c:1177 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" msgstr "无法从引擎\"%2$s\"读取私有SSL钥\"%1$s\": %3$s\n" -#: fe-secure-openssl.c:1149 +#: fe-secure-openssl.c:1191 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" msgstr "无法从引擎\"%2$s\"读取私有SSL钥\"%1$s\": %3$s\n" -#: fe-secure-openssl.c:1186 +#: fe-secure-openssl.c:1228 #, c-format msgid "certificate present, but not private key file \"%s\"\n" msgstr "有证书, 但不是私钥文件 \"%s\"\n" -#: fe-secure-openssl.c:1194 +#: fe-secure-openssl.c:1236 #, c-format msgid "private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "警告: 私钥文件 \"%s\"的访问权限过大; 权限应设置 为 u=rw (0600)或更小\n" -#: fe-secure-openssl.c:1219 +#: fe-secure-openssl.c:1261 #, c-format msgid "could not load private key file \"%s\": %s\n" msgstr "无法装载私钥文件 \"%s\": %s\n" -#: fe-secure-openssl.c:1237 +#: fe-secure-openssl.c:1279 #, c-format msgid "certificate does not match private key file \"%s\": %s\n" msgstr "证书不匹配私钥文件 \"%s\": %s\n" -#: fe-secure-openssl.c:1332 +#: fe-secure-openssl.c:1379 +#, c-format +msgid "This may indicate that the server does not support any SSL protocol version between %s and %s.\n" +msgstr "这可能表示服务器不支持%s和%s之间的任何SSL协议版本.\n" + +#: fe-secure-openssl.c:1415 #, c-format msgid "certificate could not be obtained: %s\n" msgstr "无法获得证书: %s\n" -#: fe-secure-openssl.c:1421 +#: fe-secure-openssl.c:1521 #, c-format msgid "no SSL error reported" msgstr "没有报告SSL错误" -#: fe-secure-openssl.c:1430 +#: fe-secure-openssl.c:1530 #, c-format msgid "SSL error code %lu" -msgstr "SSL 错误代码 %lu" +msgstr "SSL错误代码 %lu" -#: fe-secure-openssl.c:1677 +#: fe-secure-openssl.c:1777 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "警告:ssl密码被截断\n" -#: fe-secure.c:275 +#: fe-secure.c:267 #, c-format msgid "could not receive data from server: %s\n" msgstr "无法从服务器接收数据: %s\n" -#: fe-secure.c:390 +#: fe-secure.c:380 #, c-format msgid "could not send data to server: %s\n" msgstr "无法向服务器发送数据: %s\n" @@ -1278,3 +1190,4 @@ msgstr "无法向服务器发送数据: %s\n" #, c-format msgid "unrecognized socket error: 0x%08X/%d" msgstr "不可识别的套接字错误: 0x%08X/%d" + diff --git a/src/pl/plperl/po/de.po b/src/pl/plperl/po/de.po index ba33d41ce1..91260febae 100644 --- a/src/pl/plperl/po/de.po +++ b/src/pl/plperl/po/de.po @@ -1,16 +1,16 @@ # German message translation file for plperl -# Copyright (C) 2019 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Peter Eisentraut , 2009 - 2019. +# Peter Eisentraut , 2009 - 2022. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-08 08:08+0000\n" -"PO-Revision-Date: 2019-05-08 10:45+0200\n" +"POT-Creation-Date: 2022-04-08 12:09+0000\n" +"PO-Revision-Date: 2022-04-08 14:39+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -18,205 +18,210 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: plperl.c:409 +#: plperl.c:408 msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "Wenn wahr, dann wird vertrauenswürdiger und nicht vertrauenswürdiger Perl-Code im »strict«-Modus kompiliert." -#: plperl.c:423 +#: plperl.c:422 msgid "Perl initialization code to execute when a Perl interpreter is initialized." msgstr "Perl-Initialisierungscode, der ausgeführt wird, wenn der Perl-Interpreter initialisiert wird." -#: plperl.c:445 +#: plperl.c:444 msgid "Perl initialization code to execute once when plperl is first used." msgstr "Perl-Initialisierungscode, der ausgeführt wird, wenn plperl zum ersten Mal benutzt wird." -#: plperl.c:453 +#: plperl.c:452 msgid "Perl initialization code to execute once when plperlu is first used." msgstr "Perl-Initialisierungscode, der ausgeführt wird, wenn plperlu zum ersten Mal benutzt wird." -#: plperl.c:650 +#: plperl.c:646 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "auf dieser Plattform können nicht mehrere Perl-Interpreter angelegt werden" -#: plperl.c:673 plperl.c:857 plperl.c:863 plperl.c:980 plperl.c:992 -#: plperl.c:1035 plperl.c:1058 plperl.c:2157 plperl.c:2267 plperl.c:2335 -#: plperl.c:2398 +#: plperl.c:669 plperl.c:853 plperl.c:859 plperl.c:976 plperl.c:988 +#: plperl.c:1031 plperl.c:1054 plperl.c:2138 plperl.c:2246 plperl.c:2314 +#: plperl.c:2377 #, c-format msgid "%s" msgstr "%s" -#: plperl.c:674 +#: plperl.c:670 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "beim Ausführen von PostgreSQL::InServer::SPI::bootstrap" -#: plperl.c:858 +#: plperl.c:854 #, c-format msgid "while parsing Perl initialization" msgstr "beim Parsen der Perl-Initialisierung" -#: plperl.c:864 +#: plperl.c:860 #, c-format msgid "while running Perl initialization" msgstr "beim Ausführen der Perl-Initialisierung" -#: plperl.c:981 +#: plperl.c:977 #, c-format msgid "while executing PLC_TRUSTED" msgstr "beim Ausführen von PLC_TRUSTED" -#: plperl.c:993 +#: plperl.c:989 #, c-format msgid "while executing utf8fix" msgstr "beim Ausführen von utf8fix" -#: plperl.c:1036 +#: plperl.c:1032 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "beim Ausführen von plperl.on_plperl_init" -#: plperl.c:1059 +#: plperl.c:1055 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "beim Ausführen von plperl.on_plperlu_init" -#: plperl.c:1105 plperl.c:1796 +#: plperl.c:1101 plperl.c:1791 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "Perl-Hash enthält nicht existierende Spalte »%s«" -#: plperl.c:1110 plperl.c:1801 +#: plperl.c:1106 plperl.c:1796 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "Systemattribut »%s« kann nicht gesetzt werden" -#: plperl.c:1198 +#: plperl.c:1194 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "Anzahl der Arraydimensionen (%d) überschreitet erlaubtes Maximum (%d)" -#: plperl.c:1210 plperl.c:1227 +#: plperl.c:1206 plperl.c:1223 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "mehrdimensionale Arrays müssen Arraysausdrücke mit gleicher Anzahl Dimensionen haben" -#: plperl.c:1263 +#: plperl.c:1259 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "kann Perl-Array nicht in Nicht-Array-Typ %s umwandeln" -#: plperl.c:1366 +#: plperl.c:1362 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "kann Perl-Hash nicht in nicht zusammengesetzten Typ %s umwandeln" -#: plperl.c:1388 plperl.c:3309 +#: plperl.c:1384 plperl.c:3304 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "Funktion, die einen Record zurückgibt, in einem Zusammenhang aufgerufen, der Typ record nicht verarbeiten kann" -#: plperl.c:1447 +#: plperl.c:1445 #, c-format msgid "lookup failed for type %s" msgstr "Nachschlagen nach Typ %s fehlgeschlagen" -#: plperl.c:1771 +#: plperl.c:1766 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} existiert nicht" -#: plperl.c:1775 +#: plperl.c:1770 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} ist keine Hash-Referenz" -#: plperl.c:1806 +#: plperl.c:1801 #, c-format msgid "cannot set generated column \"%s\"" msgstr "kann generierte Spalte »%s« nicht setzen" -#: plperl.c:2032 plperl.c:2874 +#: plperl.c:2013 plperl.c:2854 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "PL/Perl-Funktionen können keinen Rückgabetyp %s haben" -#: plperl.c:2045 plperl.c:2915 +#: plperl.c:2026 plperl.c:2893 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "PL/Perl-Funktionen können Typ %s nicht annehmen" -#: plperl.c:2162 +#: plperl.c:2143 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "keine CODE-Referenz erhalten beim Kompilieren von Funktion »%s«" -#: plperl.c:2255 +#: plperl.c:2234 #, c-format msgid "didn't get a return item from function" msgstr "keinen Rückgabewert aus Funktion erhalten" -#: plperl.c:2299 plperl.c:2366 +#: plperl.c:2278 plperl.c:2345 #, c-format msgid "couldn't fetch $_TD" msgstr "konnte $_TD nicht auslesen" -#: plperl.c:2323 plperl.c:2386 +#: plperl.c:2302 plperl.c:2365 #, c-format msgid "didn't get a return item from trigger function" msgstr "keinen Rückgabewert aus Triggerfunktion erhalten" -#: plperl.c:2447 +#: plperl.c:2423 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "Funktion mit Mengenergebnis in einem Zusammenhang aufgerufen, der keine Mengenergebnisse verarbeiten kann" -#: plperl.c:2492 +#: plperl.c:2428 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "Materialisierungsmodus wird benötigt, ist aber in diesem Zusammenhang nicht erlaubt" + +#: plperl.c:2472 #, c-format msgid "set-returning PL/Perl function must return reference to array or use return_next" msgstr "PL/Perl-Funktionen mit Mengenergebnis müssen eine Referenz auf ein Array zurückgeben oder return_next verwenden" -#: plperl.c:2613 +#: plperl.c:2593 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "geänderte Zeile im DELETE-Trigger wird ignoriert" -#: plperl.c:2621 +#: plperl.c:2601 #, c-format msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "Ergebnis einer PL/Perl-Triggerfunktion muss undef, »SKIP« oder »MODIFY« sein" -#: plperl.c:2869 +#: plperl.c:2849 #, c-format msgid "trigger functions can only be called as triggers" msgstr "Triggerfunktionen können nur als Trigger aufgerufen werden" -#: plperl.c:3216 +#: plperl.c:3209 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "Anfrageergebnis hat zu viele Zeilen, um in ein Perl-Array zu passen" -#: plperl.c:3286 +#: plperl.c:3281 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "return_next kann nur in einer Funktion mit SETOF-Rückgabetyp verwendet werden" -#: plperl.c:3360 +#: plperl.c:3355 #, c-format msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" msgstr "PL/Perl-Funktion, die SETOF eines zusammengesetzten Typs zurückgibt, muss return_next mit einer Referenz auf ein Hash aufrufen" -#: plperl.c:4135 +#: plperl.c:4137 #, c-format msgid "PL/Perl function \"%s\"" msgstr "PL/Perl-Funktion »%s«" -#: plperl.c:4147 +#: plperl.c:4149 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "Kompilierung der PL/Perl-Funktion »%s«" -#: plperl.c:4156 +#: plperl.c:4158 #, c-format msgid "PL/Perl anonymous code block" msgstr "anonymer PL/Perl-Codeblock" diff --git a/src/pl/plperl/po/el.po b/src/pl/plperl/po/el.po index a5ed2bead9..6592804670 100644 --- a/src/pl/plperl/po/el.po +++ b/src/pl/plperl/po/el.po @@ -3,19 +3,23 @@ # This file is distributed under the same license as the plperl (PostgreSQL) package. # Georgios Kokolatos , 2021. # +# +# msgid "" msgstr "" "Project-Id-Version: plperl (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-10 08:38+0000\n" -"PO-Revision-Date: 2021-05-11 10:41+0200\n" +"POT-Creation-Date: 2021-07-21 05:08+0000\n" +"PO-Revision-Date: 2021-07-21 09:36+0200\n" +"Last-Translator: Georgios Kokolatos \n" +"Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" -"X-Generator: Poedit 2.4.3\n" +"X-Generator: Poedit 3.0\n" #: plperl.c:405 msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." @@ -83,12 +87,12 @@ msgstr "κατά την εκτέλεση plperl.on_plperlu_init" #: plperl.c:1098 plperl.c:1786 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" -msgstr "Κατατεμαχιστής Perl περιέχει ανύπαρκτη στήλη \"%s\"" +msgstr "Κατατεμαχιστής Perl περιέχει ανύπαρκτη στήλη «%s»" #: plperl.c:1103 plperl.c:1791 #, c-format msgid "cannot set system attribute \"%s\"" -msgstr "δεν είναι δυνατός ο ορισμός του χαρακτηριστικού συστήματος \"%s\"" +msgstr "δεν είναι δυνατός ο ορισμός του χαρακτηριστικού συστήματος «%s»" #: plperl.c:1191 #, c-format @@ -133,7 +137,7 @@ msgstr "Το >{new} $_TD δεν είναι αναφορά κατατμητή" #: plperl.c:1796 #, c-format msgid "cannot set generated column \"%s\"" -msgstr "δεν είναι δυνατός ο ορισμός δημιουργημένης στήλης \"%s\"" +msgstr "δεν είναι δυνατός ο ορισμός δημιουργημένης στήλης «%s»" #: plperl.c:2008 plperl.c:2846 #, c-format @@ -148,7 +152,7 @@ msgstr "PL/Tcl συναρτήσεις δεν είναι δυνατό να δεχ #: plperl.c:2138 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" -msgstr "δεν έλαβε μία αναφορά CODE από τη μεταγλώττιση της συνάρτησης \"%s\"" +msgstr "δεν έλαβε μία αναφορά CODE από τη μεταγλώττιση της συνάρτησης «%s»" #: plperl.c:2229 #, c-format @@ -183,7 +187,7 @@ msgstr "παράβλεψη τροποποιημένης σειράς σε ενα #: plperl.c:2593 #, c-format msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" -msgstr "το αποτέλεσμα της συνάρτησης ενεργοποίησης PL/Perl πρέπει να είναι undef, \"SKIP\" ή \"MODIFY\"" +msgstr "το αποτέλεσμα της συνάρτησης ενεργοποίησης PL/Perl πρέπει να είναι undef, «SKIP» ή «MODIFY»" #: plperl.c:2841 #, c-format @@ -208,12 +212,12 @@ msgstr "συνάρτηση SETOF-composite-returning PL/Perl πρέπει να #: plperl.c:4105 #, c-format msgid "PL/Perl function \"%s\"" -msgstr "PL/Perl συνάρτηση “%s”" +msgstr "PL/Perl συνάρτηση «%s»" #: plperl.c:4117 #, c-format msgid "compilation of PL/Perl function \"%s\"" -msgstr "μεταγλώτιση της συνάρτησης PL/Perl “%s”" +msgstr "μεταγλώτιση της συνάρτησης PL/Perl «%s»" #: plperl.c:4126 #, c-format diff --git a/src/pl/plperl/po/es.po b/src/pl/plperl/po/es.po index 7d75fece99..f958b5c694 100644 --- a/src/pl/plperl/po/es.po +++ b/src/pl/plperl/po/es.po @@ -1,6 +1,6 @@ # Spanish message translation file for plperl # -# Copyright (c) 2008-2019, PostgreSQL Global Development Group +# Copyright (c) 2008-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Emanuel Calvo Franco , 2008. @@ -8,7 +8,7 @@ # msgid "" msgstr "" -"Project-Id-Version: plperl (PostgreSQL) 12\n" +"Project-Id-Version: plperl (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2020-09-13 10:38+0000\n" "PO-Revision-Date: 2019-06-06 17:25-0400\n" diff --git a/src/pl/plperl/po/fr.po b/src/pl/plperl/po/fr.po index d34cac6ae3..fcb6d67fa0 100644 --- a/src/pl/plperl/po/fr.po +++ b/src/pl/plperl/po/fr.po @@ -1,279 +1,264 @@ -# translation of plperl.po to fr_fr -# french message translation file for plperl +# LANGUAGE message translation file for plperl +# Copyright (C) 2009-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the plperl (PostgreSQL) package. # # Use these quotes: « %s » -# Guillaume Lelarge , 2009. +# +# Guillaume Lelarge , 2009-2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-17 01:08+0000\n" -"PO-Revision-Date: 2019-05-17 15:02+0200\n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.1\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" -#: plperl.c:409 -msgid "" -"If true, trusted and untrusted Perl code will be compiled in strict mode." +#: plperl.c:408 +msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "" "Si true, le code Perl de confiance et sans confiance sera compilé en mode\n" "strict." -#: plperl.c:423 -msgid "" -"Perl initialization code to execute when a Perl interpreter is initialized." +#: plperl.c:422 +msgid "Perl initialization code to execute when a Perl interpreter is initialized." msgstr "" "Code d'initialisation Perl à exécuter lorsque un interpréteur Perl est\n" "initialisé." -#: plperl.c:445 +#: plperl.c:444 msgid "Perl initialization code to execute once when plperl is first used." -msgstr "" -"Code d'initialisation Perl à exécuter lorsque plperl est utilisé pour la\n" -"première fois" +msgstr "Code d'initialisation Perl à exécuter lorsque plperl est utilisé pour la première fois." -#: plperl.c:453 +#: plperl.c:452 msgid "Perl initialization code to execute once when plperlu is first used." -msgstr "" -"Code d'initialisation Perl à exécuter lorsque plperlu est utilisé pour la\n" -"première fois" +msgstr "Code d'initialisation Perl à exécuter lorsque plperlu est utilisé pour la première fois." -#: plperl.c:650 +#: plperl.c:646 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "ne peut pas allouer plusieurs interpréteurs Perl sur cette plateforme" -#: plperl.c:673 plperl.c:857 plperl.c:863 plperl.c:980 plperl.c:992 -#: plperl.c:1035 plperl.c:1058 plperl.c:2157 plperl.c:2267 plperl.c:2335 -#: plperl.c:2398 +#: plperl.c:669 plperl.c:853 plperl.c:859 plperl.c:976 plperl.c:988 +#: plperl.c:1031 plperl.c:1054 plperl.c:2138 plperl.c:2246 plperl.c:2314 +#: plperl.c:2377 #, c-format msgid "%s" msgstr "%s" -#: plperl.c:674 +#: plperl.c:670 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "lors de l'exécution de PostgreSQL::InServer::SPI::bootstrap" -#: plperl.c:858 +#: plperl.c:854 #, c-format msgid "while parsing Perl initialization" msgstr "lors de l'analyse de l'initialisation de perl" -#: plperl.c:864 +#: plperl.c:860 #, c-format msgid "while running Perl initialization" msgstr "lors de l'exécution de l'initialisation de perl" -#: plperl.c:981 +#: plperl.c:977 #, c-format msgid "while executing PLC_TRUSTED" msgstr "lors de l'exécution de PLC_TRUSTED" -#: plperl.c:993 +#: plperl.c:989 #, c-format msgid "while executing utf8fix" msgstr "lors de l'exécution de utf8fix" -#: plperl.c:1036 +#: plperl.c:1032 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "lors de l'exécution de plperl.on_plperl_init" -#: plperl.c:1059 +#: plperl.c:1055 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "lors de l'exécution de plperl.on_plperlu_init" -#: plperl.c:1105 plperl.c:1796 +#: plperl.c:1101 plperl.c:1791 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "Le hachage Perl contient la colonne « %s » inexistante" -#: plperl.c:1110 plperl.c:1801 +#: plperl.c:1106 plperl.c:1796 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "ne peut pas initialiser l'attribut système « %s »" -#: plperl.c:1198 +#: plperl.c:1194 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "" -"le nombre de dimensions du tableau (%d) dépasse la maximum autorisé (%d)" +msgstr "le nombre de dimensions du tableau (%d) dépasse le maximum autorisé (%d)" -#: plperl.c:1210 plperl.c:1227 +#: plperl.c:1206 plperl.c:1223 #, c-format -msgid "" -"multidimensional arrays must have array expressions with matching dimensions" +msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "" "les tableaux multidimensionnels doivent avoir des expressions de tableaux\n" "avec les dimensions correspondantes" -#: plperl.c:1263 +#: plperl.c:1259 #, c-format msgid "cannot convert Perl array to non-array type %s" -msgstr "" -"ne peut pas convertir le tableau Perl en un type %s qui n'est pas un tableau" +msgstr "ne peut pas convertir le tableau Perl en un type %s qui n'est pas un tableau" -#: plperl.c:1366 +#: plperl.c:1362 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "ne peut pas convertir le hachage Perl en un type %s non composite" -#: plperl.c:1388 plperl.c:3309 +#: plperl.c:1384 plperl.c:3304 #, c-format -msgid "" -"function returning record called in context that cannot accept type record" +msgid "function returning record called in context that cannot accept type record" msgstr "" "fonction renvoyant le type record appelée dans un contexte qui ne peut pas\n" "accepter le type record" -#: plperl.c:1447 +#: plperl.c:1445 #, c-format msgid "lookup failed for type %s" msgstr "recherche échouée pour le type %s" -#: plperl.c:1771 +#: plperl.c:1766 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} n'existe pas" -#: plperl.c:1775 +#: plperl.c:1770 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} n'est pas une référence de hachage" -#: plperl.c:1806 +#: plperl.c:1801 #, c-format msgid "cannot set generated column \"%s\"" msgstr "ne peut pas initialiser la colonne générée « %s »" -#: plperl.c:2032 plperl.c:2874 +#: plperl.c:2013 plperl.c:2854 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "Les fonctions PL/perl ne peuvent pas renvoyer le type %s" -#: plperl.c:2045 plperl.c:2915 +#: plperl.c:2026 plperl.c:2893 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "Les fonctions PL/perl ne peuvent pas accepter le type %s" -#: plperl.c:2162 +#: plperl.c:2143 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" -msgstr "" -"n'a pas obtenu une référence CODE lors de la compilation de la fonction « %s " -"»" +msgstr "n'a pas obtenu une référence CODE lors de la compilation de la fonction « %s »" -#: plperl.c:2255 +#: plperl.c:2234 #, c-format msgid "didn't get a return item from function" msgstr "n'a pas obtenu un élément en retour de la fonction" -#: plperl.c:2299 plperl.c:2366 +#: plperl.c:2278 plperl.c:2345 #, c-format msgid "couldn't fetch $_TD" msgstr "n'a pas pu récupérer $_TD" -#: plperl.c:2323 plperl.c:2386 +#: plperl.c:2302 plperl.c:2365 #, c-format msgid "didn't get a return item from trigger function" msgstr "n'a pas obtenu un élément en retour de la fonction trigger" -#: plperl.c:2447 +#: plperl.c:2423 #, c-format msgid "set-valued function called in context that cannot accept a set" -msgstr "" -"fonction renvoyant un ensemble appelée dans un contexte qui ne peut pas\n" -"accepter un ensemble" +msgstr "la fonction renvoyant un ensemble a été appelée dans un contexte qui n'accepte pas un ensemble" -#: plperl.c:2492 +#: plperl.c:2428 #, c-format -msgid "" -"set-returning PL/Perl function must return reference to array or use " -"return_next" +msgid "materialize mode required, but it is not allowed in this context" +msgstr "mode matérialisé requis mais interdit dans ce contexte" + +#: plperl.c:2472 +#, c-format +msgid "set-returning PL/Perl function must return reference to array or use return_next" msgstr "" "la fonction PL/perl renvoyant des ensembles doit renvoyer la référence à\n" "un tableau ou utiliser return_next" -#: plperl.c:2613 +#: plperl.c:2593 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "ignore la ligne modifiée dans le trigger DELETE" -#: plperl.c:2621 +#: plperl.c:2601 #, c-format -msgid "" -"result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" +msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "" "le résultat de la fonction trigger PL/perl doit être undef, « SKIP » ou\n" "« MODIFY »" -#: plperl.c:2869 +#: plperl.c:2849 #, c-format msgid "trigger functions can only be called as triggers" msgstr "les fonctions trigger peuvent seulement être appelées par des triggers" -#: plperl.c:3216 +#: plperl.c:3209 #, c-format msgid "query result has too many rows to fit in a Perl array" -msgstr "" -"le résultat de la requête contient trop de lignes pour être intégré dans un " -"tableau Perl" +msgstr "le résultat de la requête contient trop de lignes pour être intégré dans un tableau Perl" -#: plperl.c:3286 +#: plperl.c:3281 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "ne peut pas utiliser return_next dans une fonction non SETOF" -#: plperl.c:3360 +#: plperl.c:3355 #, c-format -msgid "" -"SETOF-composite-returning PL/Perl function must call return_next with " -"reference to hash" +msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" msgstr "" "une fonction PL/perl renvoyant des lignes composites doit appeler\n" "return_next avec la référence à un hachage" -#: plperl.c:4135 +#: plperl.c:4137 #, c-format msgid "PL/Perl function \"%s\"" msgstr "fonction PL/Perl « %s »" -#: plperl.c:4147 +#: plperl.c:4149 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "compilation de la fonction PL/Perl « %s »" -#: plperl.c:4156 +#: plperl.c:4158 #, c-format msgid "PL/Perl anonymous code block" msgstr "bloc de code PL/Perl anonyme" -#~ msgid "out of memory" -#~ msgstr "mémoire épuisée" +#~ msgid "PL/Perl function must return reference to hash or array" +#~ msgstr "la fonction PL/perl doit renvoyer la référence à un hachage ou à un tableau" #~ msgid "composite-returning PL/Perl function must return reference to hash" #~ msgstr "" #~ "la fonction PL/perl renvoyant des valeurs composites doit renvoyer la\n" #~ "référence à un hachage" -#~ msgid "while executing PLC_SAFE_OK" -#~ msgstr "lors de l'exécution de PLC_SAFE_OK" - #~ msgid "creation of Perl function \"%s\" failed: %s" #~ msgstr "échec de la création de la fonction Perl « %s » : %s" #~ msgid "error from Perl function \"%s\": %s" #~ msgstr "échec dans la fonction Perl « %s » : %s" -#~ msgid "PL/Perl function must return reference to hash or array" -#~ msgstr "" -#~ "la fonction PL/perl doit renvoyer la référence à un hachage ou à un " -#~ "tableau" +#~ msgid "out of memory" +#~ msgstr "mémoire épuisée" + +#~ msgid "while executing PLC_SAFE_OK" +#~ msgstr "lors de l'exécution de PLC_SAFE_OK" diff --git a/src/pl/plperl/po/ja.po b/src/pl/plperl/po/ja.po index aaf8015001..9ec09a0f7a 100644 --- a/src/pl/plperl/po/ja.po +++ b/src/pl/plperl/po/ja.po @@ -1,13 +1,13 @@ # Japanese message translation file for plperl -# Copyright (C) 2019 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # Honda Shigehiro , 2012 # msgid "" msgstr "" -"Project-Id-Version: plperl (PostgreSQL 12 beta 1)\n" +"Project-Id-Version: plperl (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-06-11 11:34+0900\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" "PO-Revision-Date: 2019-06-11 12:08+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" @@ -18,226 +18,210 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.5.4\n" -#: plperl.c:406 -msgid "" -"If true, trusted and untrusted Perl code will be compiled in strict mode." -msgstr "" -"true の場合、trusted および untrusted な Perl のコードはいずれも strict モー" -"ドでコンパイルされます。" +#: plperl.c:408 +msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." +msgstr "true の場合、trusted および untrusted な Perl のコードはいずれも strict モードでコンパイルされます。" -#: plperl.c:420 -msgid "" -"Perl initialization code to execute when a Perl interpreter is initialized." -msgstr "" -"Perl のインタプリタが初期化される際に実行されるべき Perl の初期化コード。" +#: plperl.c:422 +msgid "Perl initialization code to execute when a Perl interpreter is initialized." +msgstr "Perl のインタプリタが初期化される際に実行されるべき Perl の初期化コード。" -#: plperl.c:442 +#: plperl.c:444 msgid "Perl initialization code to execute once when plperl is first used." msgstr "plperl が最初に使用される際に一度だけ実行される Perl の初期化コード。" -#: plperl.c:450 +#: plperl.c:452 msgid "Perl initialization code to execute once when plperlu is first used." msgstr "plperlu が最初に使用される際に一度だけ実行される Perl の初期化コード。" -#: plperl.c:647 +#: plperl.c:646 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "このプラットフォームでは複数の Perl インタプリタを設定できません" -#: plperl.c:670 plperl.c:854 plperl.c:860 plperl.c:977 plperl.c:989 -#: plperl.c:1032 plperl.c:1055 plperl.c:2154 plperl.c:2264 plperl.c:2332 -#: plperl.c:2395 +#: plperl.c:669 plperl.c:853 plperl.c:859 plperl.c:976 plperl.c:988 +#: plperl.c:1031 plperl.c:1054 plperl.c:2138 plperl.c:2246 plperl.c:2314 +#: plperl.c:2377 #, c-format msgid "%s" msgstr "%s" -#: plperl.c:671 +#: plperl.c:670 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "PostgreSQL::InServer::SPI::bootstrap の実行中" -#: plperl.c:855 +#: plperl.c:854 #, c-format msgid "while parsing Perl initialization" msgstr "Perl 初期化処理のパース中" -#: plperl.c:861 +#: plperl.c:860 #, c-format msgid "while running Perl initialization" msgstr "Perl 初期化処理の実行中" -#: plperl.c:978 +#: plperl.c:977 #, c-format msgid "while executing PLC_TRUSTED" msgstr "PLC_TRUSTED の実行中" -#: plperl.c:990 +#: plperl.c:989 #, c-format msgid "while executing utf8fix" msgstr "utf8fix の実行中" -#: plperl.c:1033 +#: plperl.c:1032 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "plperl.on_plperl_init の実行中" -#: plperl.c:1056 +#: plperl.c:1055 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "plperl.on_plperlu_init の実行中" -#: plperl.c:1102 plperl.c:1793 +#: plperl.c:1101 plperl.c:1791 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "Perl ハッシュに存在しない列 \"%s\" があります" -#: plperl.c:1107 plperl.c:1798 +#: plperl.c:1106 plperl.c:1796 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "システム属性 \"%s\" は変更できません" -#: plperl.c:1195 +#: plperl.c:1194 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "配列の次元数(%d)が制限値(%d)を超えています" -#: plperl.c:1207 plperl.c:1224 +#: plperl.c:1206 plperl.c:1223 #, c-format -msgid "" -"multidimensional arrays must have array expressions with matching dimensions" +msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "多次元配列は次元数に合った配列式を持たなければなりません" -#: plperl.c:1260 +#: plperl.c:1259 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "Perl 配列を非配列型 %s に変換できません" -#: plperl.c:1363 +#: plperl.c:1362 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "Perl ハッシュを非複合型 %s に変換できません" -#: plperl.c:1385 plperl.c:3306 +#: plperl.c:1384 plperl.c:3304 #, c-format -msgid "" -"function returning record called in context that cannot accept type record" -msgstr "" -"レコード型を受け付けられないコンテキストでレコードを返す関数が呼び出されまし" -"た" +msgid "function returning record called in context that cannot accept type record" +msgstr "レコード型を受け付けられないコンテキストでレコードを返す関数が呼び出されました" -#: plperl.c:1444 +#: plperl.c:1445 #, c-format msgid "lookup failed for type %s" msgstr "型 %s の検索に失敗しました" -#: plperl.c:1768 +#: plperl.c:1766 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} は存在しません" -#: plperl.c:1772 +#: plperl.c:1770 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} はハッシュへの参照ではありません" -#: plperl.c:1803 +#: plperl.c:1801 #, c-format -#| msgid "cannot alter inherited column \"%s\"" msgid "cannot set generated column \"%s\"" msgstr "生成列\"%s\"は変更できません" -#: plperl.c:2029 plperl.c:2871 +#: plperl.c:2013 plperl.c:2854 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "PL/Perl 関数は %s 型を返すことができません" -#: plperl.c:2042 plperl.c:2912 +#: plperl.c:2026 plperl.c:2893 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "PL/Perl 関数は %s 型を受け付けられません" -#: plperl.c:2159 +#: plperl.c:2143 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "関数 \"%s\" のコンパイルからはコード参照を取得しませんでした" -#: plperl.c:2252 +#: plperl.c:2234 #, c-format msgid "didn't get a return item from function" msgstr "関数からは戻り項目を取得しませんでした" -#: plperl.c:2296 plperl.c:2363 +#: plperl.c:2278 plperl.c:2345 #, c-format msgid "couldn't fetch $_TD" msgstr "$_TD を取り出せませんでした" -#: plperl.c:2320 plperl.c:2383 +#: plperl.c:2302 plperl.c:2365 #, c-format msgid "didn't get a return item from trigger function" msgstr "トリガー関数から項目を取得しませんでした" -#: plperl.c:2444 +#: plperl.c:2423 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "集合を受け付けられないコンテキストで集合値関数が呼ばれました" -#: plperl.c:2489 +#: plperl.c:2428 #, c-format -msgid "" -"set-returning PL/Perl function must return reference to array or use " -"return_next" -msgstr "" -"集合を返す PL/Perl 関数は、配列への参照を返すかまたは return_next を使う必要" -"があります" +msgid "materialize mode required, but it is not allowed in this context" +msgstr "マテリアライズモードが必要ですが、現在のコンテクストで禁止されています" + +#: plperl.c:2472 +#, c-format +msgid "set-returning PL/Perl function must return reference to array or use return_next" +msgstr "集合を返す PL/Perl 関数は、配列への参照を返すかまたは return_next を使う必要があります" -#: plperl.c:2610 +#: plperl.c:2593 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "DELETE トリガーで変更された行を無視しています" -#: plperl.c:2618 +#: plperl.c:2601 #, c-format -msgid "" -"result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" -msgstr "" -"PL/Perl のトリガー関数の結果は undef、\"SKIP\"、\"MODIFY\" のいずれかでなけれ" -"ばなりません" +msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" +msgstr "PL/Perl のトリガー関数の結果は undef、\"SKIP\"、\"MODIFY\" のいずれかでなければなりません" -#: plperl.c:2866 +#: plperl.c:2849 #, c-format msgid "trigger functions can only be called as triggers" msgstr "トリガー関数はトリガーとしてのみコールできます" -#: plperl.c:3213 +#: plperl.c:3209 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "問い合わせの結果に含まれる行数が Perl の配列に対して多すぎます" -#: plperl.c:3283 +#: plperl.c:3281 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "集合を返す関数以外で return_next を使うことはできません" -#: plperl.c:3357 +#: plperl.c:3355 #, c-format -msgid "" -"SETOF-composite-returning PL/Perl function must call return_next with " -"reference to hash" -msgstr "" -"複合型の集合を返す PL/Perl 関数は、ハッシュへの参照を持つ return_next を呼び" -"出さなければなりません" +msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" +msgstr "複合型の集合を返す PL/Perl 関数は、ハッシュへの参照を持つ return_next を呼び出さなければなりません" -#: plperl.c:4132 +#: plperl.c:4137 #, c-format msgid "PL/Perl function \"%s\"" msgstr "PL/Perl 関数 \"%s\"" -#: plperl.c:4144 +#: plperl.c:4149 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "PL/Perl 関数 \"%s\" のコンパイル" -#: plperl.c:4153 +#: plperl.c:4158 #, c-format msgid "PL/Perl anonymous code block" msgstr "PL/Perl の無名コードブロック" diff --git a/src/pl/plperl/po/ru.po b/src/pl/plperl/po/ru.po index fa609f770d..47f65daa70 100644 --- a/src/pl/plperl/po/ru.po +++ b/src/pl/plperl/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: plperl (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-03 11:22+0300\n" +"POT-Creation-Date: 2022-02-07 11:21+0300\n" "PO-Revision-Date: 2019-08-29 15:42+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -17,95 +17,95 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: plperl.c:405 +#: plperl.c:407 msgid "" "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "" "Если этот параметр равен true, доверенный и недоверенный код Perl будет " "компилироваться в строгом режиме." -#: plperl.c:419 +#: plperl.c:421 msgid "" "Perl initialization code to execute when a Perl interpreter is initialized." msgstr "" "Код инициализации Perl, который выполняется при инициализации интерпретатора " "Perl." -#: plperl.c:441 +#: plperl.c:443 msgid "Perl initialization code to execute once when plperl is first used." msgstr "" "Код инициализации Perl, который выполняется один раз, при первом " "использовании plperl." -#: plperl.c:449 +#: plperl.c:451 msgid "Perl initialization code to execute once when plperlu is first used." msgstr "" "Код инициализации Perl, который выполняется один раз, при первом " "использовании plperlu." -#: plperl.c:646 +#: plperl.c:645 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "на этой платформе нельзя запустить множество интерпретаторов Perl" -#: plperl.c:669 plperl.c:853 plperl.c:859 plperl.c:976 plperl.c:988 -#: plperl.c:1031 plperl.c:1054 plperl.c:2136 plperl.c:2244 plperl.c:2312 -#: plperl.c:2375 +#: plperl.c:668 plperl.c:852 plperl.c:858 plperl.c:975 plperl.c:987 +#: plperl.c:1030 plperl.c:1053 plperl.c:2135 plperl.c:2243 plperl.c:2311 +#: plperl.c:2374 #, c-format msgid "%s" msgstr "%s" -#: plperl.c:670 +#: plperl.c:669 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "при выполнении PostgreSQL::InServer::SPI::bootstrap" -#: plperl.c:854 +#: plperl.c:853 #, c-format msgid "while parsing Perl initialization" msgstr "при разборе параметров инициализации Perl" -#: plperl.c:860 +#: plperl.c:859 #, c-format msgid "while running Perl initialization" msgstr "при выполнении инициализации Perl" -#: plperl.c:977 +#: plperl.c:976 #, c-format msgid "while executing PLC_TRUSTED" msgstr "при выполнении PLC_TRUSTED" -#: plperl.c:989 +#: plperl.c:988 #, c-format msgid "while executing utf8fix" msgstr "при выполнении utf8fix" -#: plperl.c:1032 +#: plperl.c:1031 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "при выполнении plperl.on_plperl_init" -#: plperl.c:1055 +#: plperl.c:1054 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "при выполнении plperl.on_plperlu_init" -#: plperl.c:1101 plperl.c:1789 +#: plperl.c:1100 plperl.c:1788 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "Perl-хеш содержит несуществующий столбец \"%s\"" -#: plperl.c:1106 plperl.c:1794 +#: plperl.c:1105 plperl.c:1793 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "присвоить значение системному атрибуту \"%s\" нельзя" -#: plperl.c:1194 +#: plperl.c:1193 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "число размерностей массива (%d) превышает предел (%d)" -#: plperl.c:1206 plperl.c:1223 +#: plperl.c:1205 plperl.c:1222 #, c-format msgid "" "multidimensional arrays must have array expressions with matching dimensions" @@ -113,80 +113,80 @@ msgstr "" "для многомерных массивов должны задаваться выражения с соответствующими " "размерностями" -#: plperl.c:1259 +#: plperl.c:1258 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "Perl-массив нельзя преобразовать в тип не массива %s" -#: plperl.c:1362 +#: plperl.c:1361 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "Perl-хеш нельзя преобразовать в не составной тип %s" -#: plperl.c:1384 plperl.c:3284 +#: plperl.c:1383 plperl.c:3281 #, c-format msgid "" "function returning record called in context that cannot accept type record" msgstr "" "функция, возвращающая запись, вызвана в контексте, не допускающем этот тип" -#: plperl.c:1443 +#: plperl.c:1442 #, c-format msgid "lookup failed for type %s" msgstr "найти тип %s не удалось" -#: plperl.c:1764 +#: plperl.c:1763 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} не существует" -#: plperl.c:1768 +#: plperl.c:1767 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} - не ссылка на хеш" -#: plperl.c:1799 +#: plperl.c:1798 #, c-format msgid "cannot set generated column \"%s\"" msgstr "присвоить значение генерируемому столбцу \"%s\" нельзя" -#: plperl.c:2011 plperl.c:2849 +#: plperl.c:2010 plperl.c:2848 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "функции PL/Perl не могут возвращать тип %s" -#: plperl.c:2024 plperl.c:2890 +#: plperl.c:2023 plperl.c:2887 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "функции PL/Perl не могут принимать тип %s" -#: plperl.c:2141 +#: plperl.c:2140 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "не удалось получить ссылку на код после компиляции функции \"%s\"" -#: plperl.c:2232 +#: plperl.c:2231 #, c-format msgid "didn't get a return item from function" msgstr "не удалось получить возвращаемый элемент от функции" -#: plperl.c:2276 plperl.c:2343 +#: plperl.c:2275 plperl.c:2342 #, c-format msgid "couldn't fetch $_TD" msgstr "не удалось получить $_TD" -#: plperl.c:2300 plperl.c:2363 +#: plperl.c:2299 plperl.c:2362 #, c-format msgid "didn't get a return item from trigger function" msgstr "не удалось получить возвращаемый элемент от триггерной функции" -#: plperl.c:2422 +#: plperl.c:2421 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "функция, возвращающая множество, вызвана в контексте, где ему нет места" -#: plperl.c:2467 +#: plperl.c:2466 #, c-format msgid "" "set-returning PL/Perl function must return reference to array or use " @@ -195,12 +195,12 @@ msgstr "" "функция PL/Perl, возвращающая множество, должна возвращать ссылку на массив " "или вызывать return_next" -#: plperl.c:2588 +#: plperl.c:2587 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "в триггере DELETE изменённая строка игнорируется" -#: plperl.c:2596 +#: plperl.c:2595 #, c-format msgid "" "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" @@ -208,24 +208,24 @@ msgstr "" "результатом триггерной функции PL/Perl должен быть undef, \"SKIP\" или " "\"MODIFY\"" -#: plperl.c:2844 +#: plperl.c:2843 #, c-format msgid "trigger functions can only be called as triggers" msgstr "триггерные функции могут вызываться только в триггерах" -#: plperl.c:3191 +#: plperl.c:3188 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "" "результат запроса содержит слишком много строк для передачи в массиве Perl" -#: plperl.c:3261 +#: plperl.c:3258 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "" "return_next можно использовать только в функциях, возвращающих множества" -#: plperl.c:3335 +#: plperl.c:3332 #, c-format msgid "" "SETOF-composite-returning PL/Perl function must call return_next with " @@ -234,17 +234,17 @@ msgstr "" "функция PL/Perl, возвращающая составное множество, должна вызывать " "return_next со ссылкой на хеш" -#: plperl.c:4110 +#: plperl.c:4107 #, c-format msgid "PL/Perl function \"%s\"" msgstr "функция PL/Perl \"%s\"" -#: plperl.c:4122 +#: plperl.c:4119 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "компиляция функции PL/Perl \"%s\"" -#: plperl.c:4131 +#: plperl.c:4128 #, c-format msgid "PL/Perl anonymous code block" msgstr "анонимный блок кода PL/Perl" diff --git a/src/pl/plperl/po/sv.po b/src/pl/plperl/po/sv.po index a856fc0d5d..787e44240e 100644 --- a/src/pl/plperl/po/sv.po +++ b/src/pl/plperl/po/sv.po @@ -2,14 +2,14 @@ # Copyright (C) 2014 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # Mats Erik Andersson , 2014. -# Dennis Björklund 2017, 2018, 2019, 2020. +# Dennis Björklund 2017, 2018, 2019, 2020, 2021, 2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-11 01:08+0000\n" -"PO-Revision-Date: 2020-04-11 08:42+0200\n" +"POT-Creation-Date: 2022-04-11 13:38+0000\n" +"PO-Revision-Date: 2022-04-11 16:03+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -18,19 +18,19 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: plperl.c:405 +#: plperl.c:408 msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "Om sant, tillförlitlig och otillförlitlig Perl-kod kommer kompileras i strikt läge." -#: plperl.c:419 +#: plperl.c:422 msgid "Perl initialization code to execute when a Perl interpreter is initialized." msgstr "Perl-kod för initialisering, utföres när perl-tolken förbereds." -#: plperl.c:441 +#: plperl.c:444 msgid "Perl initialization code to execute once when plperl is first used." msgstr "Perl-kod för engångs-initialisering då plperl används första gången." -#: plperl.c:449 +#: plperl.c:452 msgid "Perl initialization code to execute once when plperlu is first used." msgstr "Perl-kod för engångs-initialisering då plperlu används första gången." @@ -40,8 +40,8 @@ msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "kan inte utnyttja flera Perl-interpretorer på denna plattform" #: plperl.c:669 plperl.c:853 plperl.c:859 plperl.c:976 plperl.c:988 -#: plperl.c:1031 plperl.c:1054 plperl.c:2136 plperl.c:2244 plperl.c:2312 -#: plperl.c:2375 +#: plperl.c:1031 plperl.c:1054 plperl.c:2138 plperl.c:2246 plperl.c:2314 +#: plperl.c:2377 #, c-format msgid "%s" msgstr "%s" @@ -81,12 +81,12 @@ msgstr "vid utförande av plperl.on_plperl_init" msgid "while executing plperl.on_plperlu_init" msgstr "vid utförande av plperl.on_plperlu_init" -#: plperl.c:1101 plperl.c:1789 +#: plperl.c:1101 plperl.c:1791 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "Perlhash innehåller en okänd kolumn \"%s\"." -#: plperl.c:1106 plperl.c:1794 +#: plperl.c:1106 plperl.c:1796 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "kan inte sätta systemattribut \"%s\"" @@ -111,112 +111,117 @@ msgstr "kan inte omvandla perlvektor till icke-array av typ \"%s\"." msgid "cannot convert Perl hash to non-composite type %s" msgstr "kan inte omvandla en perlhash till icke-composite-typ \"%s\"." -#: plperl.c:1384 plperl.c:3284 +#: plperl.c:1384 plperl.c:3304 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "en funktion med post som värde anropades i sammanhang där poster inte kan godtagas." -#: plperl.c:1443 +#: plperl.c:1445 #, c-format msgid "lookup failed for type %s" msgstr "uppslag misslyckades för typen \"%s\"" -#: plperl.c:1764 +#: plperl.c:1766 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} finns inte." -#: plperl.c:1768 +#: plperl.c:1770 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} är inte en hash-referens." -#: plperl.c:1799 +#: plperl.c:1801 #, c-format msgid "cannot set generated column \"%s\"" msgstr "kan inte sätta genererad kolumn \"%s\"" -#: plperl.c:2011 plperl.c:2849 +#: plperl.c:2013 plperl.c:2854 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "Funktioner i PL/Perl kan inte svara med typ \"%s\"." -#: plperl.c:2024 plperl.c:2890 +#: plperl.c:2026 plperl.c:2893 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "Funktioner i PL/Perl kan inte hantera typ \"%s\"." -#: plperl.c:2141 +#: plperl.c:2143 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "fick inte en CODE-referens vid kompilering av funktionen \"%s\"." -#: plperl.c:2232 +#: plperl.c:2234 #, c-format msgid "didn't get a return item from function" msgstr "fick inget returnvärde från funktion" -#: plperl.c:2276 plperl.c:2343 +#: plperl.c:2278 plperl.c:2345 #, c-format msgid "couldn't fetch $_TD" msgstr "kunde inte hämta $_TD" -#: plperl.c:2300 plperl.c:2363 +#: plperl.c:2302 plperl.c:2365 #, c-format msgid "didn't get a return item from trigger function" msgstr "fick inget returvärde från utlösarfunktion" -#: plperl.c:2422 +#: plperl.c:2423 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "en funktion som returnerar en mängd anropades i kontext som inte godtar en mängd" -#: plperl.c:2467 +#: plperl.c:2428 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "materialiserat läge krävs, men stöds inte i detta kontext" + +#: plperl.c:2472 #, c-format msgid "set-returning PL/Perl function must return reference to array or use return_next" msgstr "En mängd-returnerande funktion i PL/Perl måste göra det som referens eller med return_next." -#: plperl.c:2588 +#: plperl.c:2593 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "Lämnar ändrad rad orörd i en DELETE-triggning" -#: plperl.c:2596 +#: plperl.c:2601 #, c-format msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "resultat av en triggningsfunktion i PL/Perl måste vara undef, \"SKIP\" eller \"MODIFY\"." -#: plperl.c:2844 +#: plperl.c:2849 #, c-format msgid "trigger functions can only be called as triggers" msgstr "Triggningsfunktioner kan bara anropas vid triggning." -#: plperl.c:3191 +#: plperl.c:3209 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "frågeresultatet har för många rader för att få plats i en Perl-array" -#: plperl.c:3261 +#: plperl.c:3281 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "får inte nyttja return_next i funktion som ej är SETOF" -#: plperl.c:3335 +#: plperl.c:3355 #, c-format msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" msgstr "En funktion i PL/Perl med värderetur som SETOF måste anropa return_next med en hashreferens" -#: plperl.c:4110 +#: plperl.c:4137 #, c-format msgid "PL/Perl function \"%s\"" msgstr "PL/Perl-funktion \"%s\"." -#: plperl.c:4122 +#: plperl.c:4149 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "kompilering av PL/Perl-funktion \"%s\"" -#: plperl.c:4131 +#: plperl.c:4158 #, c-format msgid "PL/Perl anonymous code block" msgstr "Anonymt kodblock i PL/Perl." diff --git a/src/pl/plperl/po/uk.po b/src/pl/plperl/po/uk.po index 28a5884bf4..6259c8c77f 100644 --- a/src/pl/plperl/po/uk.po +++ b/src/pl/plperl/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:08+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" +"POT-Creation-Date: 2021-06-10 08:38+0000\n" +"PO-Revision-Date: 2021-08-17 10:54\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/plperl.pot\n" -"X-Crowdin-File-ID: 516\n" +"X-Crowdin-File: /REL_14_DEV/plperl.pot\n" +"X-Crowdin-File-ID: 770\n" #: plperl.c:405 msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." @@ -33,189 +33,189 @@ msgstr "Виконати код ініціалізації один раз пі msgid "Perl initialization code to execute once when plperlu is first used." msgstr "Виконати код ініціалізації один раз під час першого використання plperlu." -#: plperl.c:646 +#: plperl.c:643 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "не можна розмістити декілька Perl інтерпретаторів на цій платформі" -#: plperl.c:669 plperl.c:853 plperl.c:859 plperl.c:976 plperl.c:988 -#: plperl.c:1031 plperl.c:1054 plperl.c:2136 plperl.c:2244 plperl.c:2312 -#: plperl.c:2375 +#: plperl.c:666 plperl.c:850 plperl.c:856 plperl.c:973 plperl.c:985 +#: plperl.c:1028 plperl.c:1051 plperl.c:2133 plperl.c:2241 plperl.c:2309 +#: plperl.c:2372 #, c-format msgid "%s" msgstr "%s" -#: plperl.c:670 +#: plperl.c:667 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "під час виконання PostgreSQL::InServer::SPI::bootstrap" -#: plperl.c:854 +#: plperl.c:851 #, c-format msgid "while parsing Perl initialization" msgstr "під час обробки ініціалізації Perl" -#: plperl.c:860 +#: plperl.c:857 #, c-format msgid "while running Perl initialization" msgstr "під час запуску Perl ініціалізації" -#: plperl.c:977 +#: plperl.c:974 #, c-format msgid "while executing PLC_TRUSTED" msgstr "під час виконання PLC_TRUSTED" -#: plperl.c:989 +#: plperl.c:986 #, c-format msgid "while executing utf8fix" msgstr "під час виконання utf8fix" -#: plperl.c:1032 +#: plperl.c:1029 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "під час виконання plperl.on_plperl_init" -#: plperl.c:1055 +#: plperl.c:1052 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "під час виконання plperl.on_plperlu_init" -#: plperl.c:1101 plperl.c:1789 +#: plperl.c:1098 plperl.c:1786 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "хеш Perl містить неіснуючу колонку \"%s\"" -#: plperl.c:1106 plperl.c:1794 +#: plperl.c:1103 plperl.c:1791 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "не вдалося встановити системний атрибут \"%s\"" -#: plperl.c:1194 +#: plperl.c:1191 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "число вимірів масива (%d) перевищує ліміт (%d)" -#: plperl.c:1206 plperl.c:1223 +#: plperl.c:1203 plperl.c:1220 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "для багатовимірних масивів повинні задаватись вирази з відповідними вимірами" -#: plperl.c:1259 +#: plperl.c:1256 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "неможливо конвертувати масив Perl у тип не масиву %s" -#: plperl.c:1362 +#: plperl.c:1359 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "неможливо конвертувати хеш Perl у нескладений тип %s" -#: plperl.c:1384 plperl.c:3284 +#: plperl.c:1381 plperl.c:3279 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "функція, що повертає набір, викликана у контексті, що не приймає тип запис" -#: plperl.c:1443 +#: plperl.c:1440 #, c-format msgid "lookup failed for type %s" msgstr "неможливо фільтрувати для типу %s" -#: plperl.c:1764 +#: plperl.c:1761 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} не існує" -#: plperl.c:1768 +#: plperl.c:1765 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} не є посиланням на хеш" -#: plperl.c:1799 +#: plperl.c:1796 #, c-format msgid "cannot set generated column \"%s\"" msgstr "неможливо оновити згенерований стовпець \"%s\"" -#: plperl.c:2011 plperl.c:2849 +#: plperl.c:2008 plperl.c:2846 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "функції PL/Perl не можуть повертати тип %s" -#: plperl.c:2024 plperl.c:2890 +#: plperl.c:2021 plperl.c:2885 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "функції PL/Perl не можуть приймати тип %s" -#: plperl.c:2141 +#: plperl.c:2138 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "не отримано посилання CODE з функції компіляції \"%s\"" -#: plperl.c:2232 +#: plperl.c:2229 #, c-format msgid "didn't get a return item from function" msgstr "не отримано елемент результату з функції" -#: plperl.c:2276 plperl.c:2343 +#: plperl.c:2273 plperl.c:2340 #, c-format msgid "couldn't fetch $_TD" msgstr "не вдалось отримати $_TD" -#: plperl.c:2300 plperl.c:2363 +#: plperl.c:2297 plperl.c:2360 #, c-format msgid "didn't get a return item from trigger function" msgstr "не отримано елемент результату з функції-тригеру" -#: plperl.c:2422 +#: plperl.c:2419 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "функція \"set-valued\" викликана в контексті, де йому немає місця" -#: plperl.c:2467 +#: plperl.c:2464 #, c-format msgid "set-returning PL/Perl function must return reference to array or use return_next" msgstr "функція PL/Perl, що вертає набір значень, повинна посилатися на масив або використовувати return_next" -#: plperl.c:2588 +#: plperl.c:2585 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "ігнорується змінений рядок у тригері DELETE" -#: plperl.c:2596 +#: plperl.c:2593 #, c-format msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "результат тригерної функції PL/Perl повинен бути undef, \"SKIP\" або \"MODIFY\"" -#: plperl.c:2844 +#: plperl.c:2841 #, c-format msgid "trigger functions can only be called as triggers" msgstr "тригер-функція може викликатися лише як тригер" -#: plperl.c:3191 +#: plperl.c:3186 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "результат запиту має забагато рядків для відповідності в масиві Perl" -#: plperl.c:3261 +#: plperl.c:3256 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "не можна використовувати return_next в функціях, що не повертають набори даних" -#: plperl.c:3335 +#: plperl.c:3330 #, c-format msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" msgstr "Функція PL/Perl, що повертає набір композитних даних, повинна викликати return_next з посиланням на хеш" -#: plperl.c:4110 +#: plperl.c:4105 #, c-format msgid "PL/Perl function \"%s\"" msgstr "PL/Perl функція \"%s\"" -#: plperl.c:4122 +#: plperl.c:4117 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "компіляція функції PL/Perl \"%s\"" -#: plperl.c:4131 +#: plperl.c:4126 #, c-format msgid "PL/Perl anonymous code block" msgstr "анонімний блок коду PL/Perl" diff --git a/src/pl/plperl/po/zh_CN.po b/src/pl/plperl/po/zh_CN.po index 01957bf849..14e2324227 100644 --- a/src/pl/plperl/po/zh_CN.po +++ b/src/pl/plperl/po/zh_CN.po @@ -5,217 +5,217 @@ # msgid "" msgstr "" -"Project-Id-Version: plperl (PostgreSQL) 12\n" +"Project-Id-Version: plperl (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-06-03 17:30+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:39+0000\n" +"PO-Revision-Date: 2021-08-15 17:30+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "X-Generator: Poedit 1.5.7\n" -#: plperl.c:409 +#: plperl.c:405 msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "如果为真的话,那么信任和非信任的Perl代码将以限制模式编译." -#: plperl.c:423 +#: plperl.c:419 msgid "Perl initialization code to execute when a Perl interpreter is initialized." msgstr "当初始化一个Perl解释器时候执行Perl初始化代码" -#: plperl.c:445 +#: plperl.c:441 msgid "Perl initialization code to execute once when plperl is first used." msgstr "在第一次使用plperl的时候执行一次Perl初始化代码" -#: plperl.c:453 +#: plperl.c:449 msgid "Perl initialization code to execute once when plperlu is first used." msgstr "在plperlu第一次使用的时候执行一次Perl初始化代码" -#: plperl.c:650 +#: plperl.c:643 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "在这个平台上无法分配多个Perl解释器" -#: plperl.c:673 plperl.c:857 plperl.c:863 plperl.c:980 plperl.c:992 -#: plperl.c:1035 plperl.c:1058 plperl.c:2157 plperl.c:2267 plperl.c:2335 -#: plperl.c:2398 +#: plperl.c:666 plperl.c:850 plperl.c:856 plperl.c:973 plperl.c:985 +#: plperl.c:1028 plperl.c:1051 plperl.c:2133 plperl.c:2241 plperl.c:2309 +#: plperl.c:2372 #, c-format msgid "%s" msgstr "%s" -#: plperl.c:674 +#: plperl.c:667 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "同时在执行PostgreSQL::InServer::SPI::bootstrap" -#: plperl.c:858 +#: plperl.c:851 #, c-format msgid "while parsing Perl initialization" msgstr "同时在解析Perl初始化" -#: plperl.c:864 +#: plperl.c:857 #, c-format msgid "while running Perl initialization" msgstr "同时在运行Perl初始化" -#: plperl.c:981 +#: plperl.c:974 #, c-format msgid "while executing PLC_TRUSTED" msgstr "同时在执行PLC_TRUSTED" -#: plperl.c:993 +#: plperl.c:986 #, c-format msgid "while executing utf8fix" msgstr "同时在执行utf8fix" -#: plperl.c:1036 +#: plperl.c:1029 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "同时在执行plperl.on_plperl_init" -#: plperl.c:1059 +#: plperl.c:1052 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "同时在执行plperl.on_plperlu_init" -#: plperl.c:1105 plperl.c:1796 +#: plperl.c:1098 plperl.c:1786 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "Perl的哈希功能包含不存在的列\"%s\"" -#: plperl.c:1110 plperl.c:1801 +#: plperl.c:1103 plperl.c:1791 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "不能设置系统属性\"%s\"" -#: plperl.c:1198 +#: plperl.c:1191 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "数组的维数(%d)超过最大允许值(%d)" -#: plperl.c:1210 plperl.c:1227 +#: plperl.c:1203 plperl.c:1220 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "多维数组必须有符合维度的数组表达式" -#: plperl.c:1263 +#: plperl.c:1256 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "无法将Perl数组转换成非数组类型 %s" -#: plperl.c:1366 +#: plperl.c:1359 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "无法将Perl哈希类型转换成非组合类型 %s" -#: plperl.c:1388 plperl.c:3309 +#: plperl.c:1381 plperl.c:3279 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "返回值类型是记录的函数在不接受使用记录类型的环境中调用" -#: plperl.c:1447 +#: plperl.c:1440 #, c-format msgid "lookup failed for type %s" msgstr "类型%s查找失败" -#: plperl.c:1771 +#: plperl.c:1761 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new}不存在" -#: plperl.c:1775 +#: plperl.c:1765 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new}不是一个哈希引用" -#: plperl.c:1806 +#: plperl.c:1796 #, c-format msgid "cannot set generated column \"%s\"" -msgstr "无法设置生成的列\"%s\"" +msgstr "无法设置生成的列 \"%s\"" -#: plperl.c:2032 plperl.c:2874 +#: plperl.c:2008 plperl.c:2846 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "PL/Perl函数无法返回类型%s" -#: plperl.c:2045 plperl.c:2915 +#: plperl.c:2021 plperl.c:2885 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "PL/Perl 函数无法使用类型%s" -#: plperl.c:2162 +#: plperl.c:2138 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "没有从正在编译的函数 \"%s\"得到CODE参考" -#: plperl.c:2255 +#: plperl.c:2229 #, c-format msgid "didn't get a return item from function" msgstr "没有从函数得到一个返回项" -#: plperl.c:2299 plperl.c:2366 +#: plperl.c:2273 plperl.c:2340 #, c-format msgid "couldn't fetch $_TD" msgstr "无法取得 $_TD" -#: plperl.c:2323 plperl.c:2386 +#: plperl.c:2297 plperl.c:2360 #, c-format msgid "didn't get a return item from trigger function" msgstr "没有从触发器函数得到一个返回项" -#: plperl.c:2447 +#: plperl.c:2419 #, c-format msgid "set-valued function called in context that cannot accept a set" -msgstr "集值函数在不能使用集合的环境中调用" +msgstr "在不能接受使用集合的环境中调用set-valued函数" -#: plperl.c:2492 +#: plperl.c:2464 #, c-format msgid "set-returning PL/Perl function must return reference to array or use return_next" msgstr "返回集合的PL/Perl函数必须返回对数组的引用或者使用return_next" -#: plperl.c:2613 +#: plperl.c:2585 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "在DELETE触发器中忽略已修改的记录" -#: plperl.c:2621 +#: plperl.c:2593 #, c-format msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "PL/Perl 触发器函数的结果必须是undef, \"SKIP\", 或 \"MODIFY\"" -#: plperl.c:2869 +#: plperl.c:2841 #, c-format msgid "trigger functions can only be called as triggers" msgstr "触发器函数只能以触发器的形式调用" -#: plperl.c:3216 +#: plperl.c:3186 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "查询结果中的行太多,无法放在一个Perl数组中" -#: plperl.c:3286 +#: plperl.c:3256 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "不能在非SETOF函数中使用return_next" -#: plperl.c:3360 +#: plperl.c:3330 #, c-format msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" msgstr "返回SETOF-组合类型值的PL/Perl函数必须调用带有对哈希引用的return_next" -#: plperl.c:4135 +#: plperl.c:4105 #, c-format msgid "PL/Perl function \"%s\"" msgstr "PL/Perl函数\"%s\"" -#: plperl.c:4147 +#: plperl.c:4117 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "编译PL/Perl函数\"%s\"" -#: plperl.c:4156 +#: plperl.c:4126 #, c-format msgid "PL/Perl anonymous code block" msgstr "PL/Perl匿名代码块" diff --git a/src/pl/plpgsql/src/nls.mk b/src/pl/plpgsql/src/nls.mk index 3b197be046..11878d2d5b 100644 --- a/src/pl/plpgsql/src/nls.mk +++ b/src/pl/plpgsql/src/nls.mk @@ -1,6 +1,6 @@ # src/pl/plpgsql/src/nls.mk CATALOG_NAME = plpgsql -AVAIL_LANGUAGES = cs de es fr it ja ko pl pt_BR ro ru sv tr uk vi zh_CN zh_TW +AVAIL_LANGUAGES = cs de el es fr it ja ko pl pt_BR ro ru sv tr uk vi zh_CN zh_TW GETTEXT_FILES = pl_comp.c pl_exec.c pl_gram.c pl_funcs.c pl_handler.c pl_scanner.c GETTEXT_TRIGGERS = $(BACKEND_COMMON_GETTEXT_TRIGGERS) yyerror plpgsql_yyerror GETTEXT_FLAGS = $(BACKEND_COMMON_GETTEXT_FLAGS) diff --git a/src/pl/plpgsql/src/po/de.po b/src/pl/plpgsql/src/po/de.po index 5cf84696d9..16a0cfa657 100644 --- a/src/pl/plpgsql/src/po/de.po +++ b/src/pl/plpgsql/src/po/de.po @@ -1,15 +1,15 @@ # German message translation file for plpgsql -# Copyright (C) 2009 - 2021 PostgreSQL Global Development Group +# Copyright (C) 2009 - 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-12 14:08+0000\n" -"PO-Revision-Date: 2021-04-12 17:04+0200\n" +"POT-Creation-Date: 2022-04-08 12:09+0000\n" +"PO-Revision-Date: 2022-04-08 14:40+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -23,149 +23,154 @@ msgstr "" msgid "PL/pgSQL functions cannot accept type %s" msgstr "PL/pgSQL-Funktionen können Typ %s nicht annehmen" -#: pl_comp.c:531 +#: pl_comp.c:530 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "konnte den tatsächlichen Rückgabetyp der polymorphischen Funktion »%s« nicht ermitteln" -#: pl_comp.c:561 +#: pl_comp.c:560 #, c-format msgid "trigger functions can only be called as triggers" msgstr "Triggerfunktionen können nur als Trigger aufgerufen werden" -#: pl_comp.c:565 pl_handler.c:480 +#: pl_comp.c:564 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "PL/pgSQL-Funktionen können keinen Rückgabetyp %s haben" -#: pl_comp.c:605 +#: pl_comp.c:604 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "Triggerfunktionen können keine deklarierten Argumente haben" -#: pl_comp.c:606 +#: pl_comp.c:605 #, c-format msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." msgstr "Auf die Argumente des Triggers kann stattdessen über TG_NARGS und TG_ARGV zugegriffen werden." -#: pl_comp.c:739 +#: pl_comp.c:738 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "Ereignistriggerfunktionen können keine deklarierten Argumente haben" -#: pl_comp.c:1003 +#: pl_comp.c:1002 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "Kompilierung der PL/pgSQL-Funktion »%s« nahe Zeile %d" -#: pl_comp.c:1026 +#: pl_comp.c:1025 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "Parametername »%s« mehrmals angegeben" -#: pl_comp.c:1138 +#: pl_comp.c:1139 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "Spaltenverweis »%s« ist nicht eindeutig" -#: pl_comp.c:1140 +#: pl_comp.c:1141 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Er könnte sich entweder auf eine PL/pgSQL-Variable oder eine Tabellenspalte beziehen." -#: pl_comp.c:1323 pl_exec.c:5235 pl_exec.c:5408 pl_exec.c:5495 pl_exec.c:5586 -#: pl_exec.c:6566 +#: pl_comp.c:1324 pl_exec.c:5216 pl_exec.c:5389 pl_exec.c:5476 pl_exec.c:5567 +#: pl_exec.c:6588 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "Record »%s« hat kein Feld »%s«" -#: pl_comp.c:1817 +#: pl_comp.c:1818 #, c-format msgid "relation \"%s\" does not exist" msgstr "Relation »%s« existiert nicht" -#: pl_comp.c:1824 pl_comp.c:1866 +#: pl_comp.c:1825 pl_comp.c:1867 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "Relation »%s« hat keinen zusammengesetzten Typ" -#: pl_comp.c:1932 +#: pl_comp.c:1933 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "Variable »%s« hat Pseudotyp %s" -#: pl_comp.c:2121 +#: pl_comp.c:2122 #, c-format msgid "type \"%s\" is only a shell" msgstr "Typ »%s« ist nur eine Hülle" -#: pl_comp.c:2203 pl_exec.c:6867 +#: pl_comp.c:2204 pl_exec.c:6889 #, c-format msgid "type %s is not composite" msgstr "Typ %s ist kein zusammengesetzter Typ" -#: pl_comp.c:2251 pl_comp.c:2304 +#: pl_comp.c:2252 pl_comp.c:2305 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "unbekannte Ausnahmebedingung »%s«" -#: pl_comp.c:2525 +#: pl_comp.c:2526 #, c-format msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "konnte den tatsächlichen Argumenttyp der polymorphischen Funktion »%s« nicht ermitteln" -#: pl_exec.c:501 pl_exec.c:935 pl_exec.c:1170 +#: pl_exec.c:500 pl_exec.c:939 pl_exec.c:1174 msgid "during initialization of execution state" msgstr "bei der Initialisierung des Ausführungszustandes" -#: pl_exec.c:507 +#: pl_exec.c:506 msgid "while storing call arguments into local variables" msgstr "beim Abspeichern der Aufrufargumente in lokale Variablen" -#: pl_exec.c:595 pl_exec.c:1008 +#: pl_exec.c:594 pl_exec.c:1012 msgid "during function entry" msgstr "beim Eintritts in die Funktion" -#: pl_exec.c:618 +#: pl_exec.c:617 #, c-format msgid "control reached end of function without RETURN" msgstr "Kontrollfluss erreichte das Ende der Funktion ohne RETURN" -#: pl_exec.c:624 +#: pl_exec.c:623 msgid "while casting return value to function's return type" msgstr "bei der Umwandlung des Rückgabewerts in den Rückgabetyp der Funktion" -#: pl_exec.c:637 pl_exec.c:3670 +#: pl_exec.c:635 pl_exec.c:3656 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "Funktion mit Mengenergebnis in einem Zusammenhang aufgerufen, der keine Mengenergebnisse verarbeiten kann" -#: pl_exec.c:763 pl_exec.c:1034 pl_exec.c:1192 +#: pl_exec.c:640 pl_exec.c:3662 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "Materialisierungsmodus wird benötigt, ist aber in diesem Zusammenhang nicht erlaubt" + +#: pl_exec.c:767 pl_exec.c:1038 pl_exec.c:1196 msgid "during function exit" msgstr "beim Verlassen der Funktion" -#: pl_exec.c:818 pl_exec.c:882 pl_exec.c:3468 +#: pl_exec.c:822 pl_exec.c:886 pl_exec.c:3455 msgid "returned record type does not match expected record type" msgstr "zurückgegebener Record-Typ stimmt nicht mit erwartetem Record-Typ überein" -#: pl_exec.c:1031 pl_exec.c:1189 +#: pl_exec.c:1035 pl_exec.c:1193 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "Kontrollfluss erreichte das Ende der Triggerprozedur ohne RETURN" -#: pl_exec.c:1039 +#: pl_exec.c:1043 #, c-format msgid "trigger procedure cannot return a set" msgstr "Triggerprozedur kann keine Ergebnismenge zurückgeben" -#: pl_exec.c:1078 pl_exec.c:1106 +#: pl_exec.c:1082 pl_exec.c:1110 msgid "returned row structure does not match the structure of the triggering table" msgstr "zurückgegebene Zeilenstruktur stimmt nicht mit der Struktur der Tabelle, die den Trigger ausgelöst hat, überein" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1238 +#: pl_exec.c:1251 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "PL/pgSQL-Funktion %s Zeile %d %s" @@ -173,326 +178,331 @@ msgstr "PL/pgSQL-Funktion %s Zeile %d %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1249 +#: pl_exec.c:1262 #, c-format msgid "PL/pgSQL function %s %s" msgstr "PL/pgSQL-Funktion %s %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1257 +#: pl_exec.c:1270 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "PL/pgSQL-Funktion %s Zeile %d bei %s" -#: pl_exec.c:1263 +#: pl_exec.c:1276 #, c-format msgid "PL/pgSQL function %s" msgstr "PL/pgSQL-Funktion %s" -#: pl_exec.c:1634 +#: pl_exec.c:1647 msgid "during statement block local variable initialization" msgstr "bei der Initialisierung der lokalen Variablen des Anweisungsblocks" -#: pl_exec.c:1732 +#: pl_exec.c:1752 msgid "during statement block entry" msgstr "beim Eintreten in den Anweisungsblock" -#: pl_exec.c:1764 +#: pl_exec.c:1784 msgid "during statement block exit" msgstr "beim Verlassen des Anweisungsblocks" -#: pl_exec.c:1802 +#: pl_exec.c:1822 msgid "during exception cleanup" msgstr "beim Aufräumen der Ausnahme" -#: pl_exec.c:2369 +#: pl_exec.c:2355 #, c-format msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" msgstr "Prozedurparameter »%s« ist ein Ausgabeparameter, aber das entsprechende Argument ist nicht schreibbar" -#: pl_exec.c:2374 +#: pl_exec.c:2360 #, c-format msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" msgstr "Prozedurparameter %d ist ein Ausgabeparameter, aber das entsprechende Argument ist nicht schreibbar" -#: pl_exec.c:2407 +#: pl_exec.c:2394 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS kann nicht außerhalb einer Ausnahmebehandlung verwendet werden" -#: pl_exec.c:2607 +#: pl_exec.c:2594 #, c-format msgid "case not found" msgstr "Fall nicht gefunden" -#: pl_exec.c:2608 +#: pl_exec.c:2595 #, c-format msgid "CASE statement is missing ELSE part." msgstr "Der CASE-Anweisung fehlt ein ELSE-Teil." -#: pl_exec.c:2701 +#: pl_exec.c:2688 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "Untergrenze einer FOR-Schleife darf nicht NULL sein" -#: pl_exec.c:2717 +#: pl_exec.c:2704 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "Obergrenze einer FOR-Schleife darf nicht NULL sein" -#: pl_exec.c:2735 +#: pl_exec.c:2722 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "BY-Wert einer FOR-Schleife darf nicht NULL sein" -#: pl_exec.c:2741 +#: pl_exec.c:2728 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "BY-Wert einer FOR-Schleife muss größer als null sein" -#: pl_exec.c:2875 pl_exec.c:4640 +#: pl_exec.c:2862 pl_exec.c:4658 #, c-format msgid "cursor \"%s\" already in use" msgstr "Cursor »%s« ist bereits in Verwendung" -#: pl_exec.c:2898 pl_exec.c:4705 +#: pl_exec.c:2885 pl_exec.c:4723 #, c-format msgid "arguments given for cursor without arguments" msgstr "einem Cursor ohne Argumente wurden Argumente übergeben" -#: pl_exec.c:2917 pl_exec.c:4724 +#: pl_exec.c:2904 pl_exec.c:4742 #, c-format msgid "arguments required for cursor" msgstr "Cursor benötigt Argumente" -#: pl_exec.c:3004 +#: pl_exec.c:2991 #, c-format msgid "FOREACH expression must not be null" msgstr "FOREACH-Ausdruck darf nicht NULL sein" -#: pl_exec.c:3019 +#: pl_exec.c:3006 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "FOREACH-Ausdruck muss ein Array ergeben, nicht Typ %s" -#: pl_exec.c:3036 +#: pl_exec.c:3023 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "Slice-Dimension (%d) ist außerhalb des gültigen Bereichs 0..%d" -#: pl_exec.c:3063 +#: pl_exec.c:3050 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "FOREACH ... SLICE Schleifenvariable muss einen Arraytyp haben" -#: pl_exec.c:3067 +#: pl_exec.c:3054 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "FOREACH-Schleifenvariable darf keinen Array-Typ haben" -#: pl_exec.c:3229 pl_exec.c:3286 pl_exec.c:3461 +#: pl_exec.c:3216 pl_exec.c:3273 pl_exec.c:3448 #, c-format msgid "cannot return non-composite value from function returning composite type" msgstr "kann keinen nicht zusammengesetzten Wert aus einer Funktion zurückgeben, die einen zusammengesetzten Typ zurückgibt" -#: pl_exec.c:3325 pl_gram.y:3344 +#: pl_exec.c:3312 pl_gram.y:3318 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "RETURN NEXT kann nur in einer Funktion mit SETOF-Rückgabetyp verwendet werden" -#: pl_exec.c:3366 pl_exec.c:3498 +#: pl_exec.c:3353 pl_exec.c:3485 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "falscher Ergebnistyp angegeben in RETURN NEXT" -#: pl_exec.c:3404 pl_exec.c:3425 +#: pl_exec.c:3391 pl_exec.c:3412 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "falscher Record-Typ angegeben in RETURN NEXT" -#: pl_exec.c:3517 +#: pl_exec.c:3504 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT muss einen Parameter haben" -#: pl_exec.c:3545 pl_gram.y:3408 +#: pl_exec.c:3532 pl_gram.y:3382 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "RETURN QUERY kann nur in einer Funktion mit SETOF-Rückgabetyp verwendet werden" -#: pl_exec.c:3563 +#: pl_exec.c:3550 msgid "structure of query does not match function result type" msgstr "Struktur der Anfrage stimmt nicht mit Rückgabetyp der Funktion überein" -#: pl_exec.c:3596 pl_exec.c:5792 -#, c-format -msgid "query \"%s\" is not a SELECT" -msgstr "Anfrage »%s« ist kein SELECT" - -#: pl_exec.c:3618 pl_exec.c:4418 pl_exec.c:8603 +#: pl_exec.c:3605 pl_exec.c:4435 pl_exec.c:8630 #, c-format msgid "query string argument of EXECUTE is null" msgstr "Anfrageargument von EXECUTE ist NULL" -#: pl_exec.c:3698 pl_exec.c:3836 +#: pl_exec.c:3690 pl_exec.c:3828 #, c-format msgid "RAISE option already specified: %s" msgstr "RAISE-Option bereits angegeben: %s" -#: pl_exec.c:3732 +#: pl_exec.c:3724 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "RAISE ohne Parameter kann nicht außerhalb einer Ausnahmebehandlung verwendet werden" -#: pl_exec.c:3826 +#: pl_exec.c:3818 #, c-format msgid "RAISE statement option cannot be null" msgstr "Option einer RAISE-Anweisung darf nicht NULL sein" -#: pl_exec.c:3896 +#: pl_exec.c:3888 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3951 +#: pl_exec.c:3943 #, c-format msgid "assertion failed" msgstr "Assertion fehlgeschlagen" -#: pl_exec.c:4291 pl_exec.c:4479 +#: pl_exec.c:4308 pl_exec.c:4497 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "COPY vom/zum Client funktioniert in PL/pgSQL nicht" -#: pl_exec.c:4297 +#: pl_exec.c:4314 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "nicht unterstützter Transaktionsbefehl in PL/pgSQL" -#: pl_exec.c:4320 pl_exec.c:4508 +#: pl_exec.c:4337 pl_exec.c:4526 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO mit einem Befehl verwendet, der keine Daten zurückgeben kann" -#: pl_exec.c:4343 pl_exec.c:4531 +#: pl_exec.c:4360 pl_exec.c:4549 #, c-format msgid "query returned no rows" msgstr "Anfrage gab keine Zeilen zurück" -#: pl_exec.c:4365 pl_exec.c:4550 +#: pl_exec.c:4382 pl_exec.c:4568 pl_exec.c:5711 #, c-format msgid "query returned more than one row" msgstr "Anfrage gab mehr als eine Zeile zurück" -#: pl_exec.c:4367 +#: pl_exec.c:4384 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "Stellen Sie sicher, dass die Anfrage eine einzige Zeile zurückgibt, oder verwenden Sie LIMIT 1." -#: pl_exec.c:4383 +#: pl_exec.c:4400 #, c-format msgid "query has no destination for result data" msgstr "Anfrage hat keinen Bestimmungsort für die Ergebnisdaten" -#: pl_exec.c:4384 +#: pl_exec.c:4401 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "Wenn Sie die Ergebnisse eines SELECT verwerfen wollen, verwenden Sie stattdessen PERFORM." -#: pl_exec.c:4471 +#: pl_exec.c:4489 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "EXECUTE von SELECT ... INTO ist nicht implementiert" -#: pl_exec.c:4472 +#: pl_exec.c:4490 #, c-format msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." msgstr "Sie könnten stattdessen EXECUTE ... INTO oder EXECUTE CREATE TABLE ... AS verwenden." -#: pl_exec.c:4485 +#: pl_exec.c:4503 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE von Transaktionsbefehlen ist nicht implementiert" -#: pl_exec.c:4786 pl_exec.c:4874 +#: pl_exec.c:4804 pl_exec.c:4892 #, c-format msgid "cursor variable \"%s\" is null" msgstr "Cursor-Variable »%s« ist NULL" -#: pl_exec.c:4797 pl_exec.c:4885 +#: pl_exec.c:4815 pl_exec.c:4903 #, c-format msgid "cursor \"%s\" does not exist" msgstr "Cursor »%s« existiert nicht" -#: pl_exec.c:4810 +#: pl_exec.c:4828 #, c-format msgid "relative or absolute cursor position is null" msgstr "relative oder absolute Cursorposition ist NULL" -#: pl_exec.c:5085 pl_exec.c:5180 +#: pl_exec.c:5066 pl_exec.c:5161 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "NULL-Wert kann der Variable »%s« nicht zugewiesen werden, weil sie als NOT NULL deklariert ist" -#: pl_exec.c:5161 +#: pl_exec.c:5142 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "nicht zusammengesetzter Wert kann nicht einer Zeilenvariable zugewiesen werden" -#: pl_exec.c:5193 +#: pl_exec.c:5174 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "nicht zusammengesetzter Wert kann nicht einer Record-Variable zugewiesen werden" -#: pl_exec.c:5244 +#: pl_exec.c:5225 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "kann Systemspalte »%s« keinen Wert zuweisen" -#: pl_exec.c:5693 +#: pl_exec.c:5674 +#, c-format +msgid "query did not return data" +msgstr "Anfrage hat keine Daten zurückgegeben" + +#: pl_exec.c:5675 pl_exec.c:5687 pl_exec.c:5712 pl_exec.c:5788 pl_exec.c:5793 +#, c-format +msgid "query: %s" +msgstr "Anfrage: %s" + +#: pl_exec.c:5683 #, c-format -msgid "query \"%s\" did not return data" -msgstr "Anfrage »%s« hat keine Daten zurückgegeben" +msgid "query returned %d column" +msgid_plural "query returned %d columns" +msgstr[0] "Anfrage hat %d Spalte zurückgegeben" +msgstr[1] "Anfrage hat %d Spalten zurückgegeben" -#: pl_exec.c:5701 +#: pl_exec.c:5787 #, c-format -msgid "query \"%s\" returned %d column" -msgid_plural "query \"%s\" returned %d columns" -msgstr[0] "Anfrage »%s« hat %d Spalte zurückgegeben" -msgstr[1] "Anfrage »%s« hat %d Spalten zurückgegeben" +msgid "query is SELECT INTO, but it should be plain SELECT" +msgstr "Anfrage ist SELECT INTO, sollte aber ein normales SELECT sein" -#: pl_exec.c:5729 +#: pl_exec.c:5792 #, c-format -msgid "query \"%s\" returned more than one row" -msgstr "Anfrage »%s« hat mehr als eine Zeile zurückgegeben" +msgid "query is not a SELECT" +msgstr "Anfrage ist kein SELECT" -#: pl_exec.c:6580 pl_exec.c:6620 pl_exec.c:6660 +#: pl_exec.c:6602 pl_exec.c:6642 pl_exec.c:6682 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "Typ von Parameter %d (%s) stimmt nicht mit dem überein, als der Plan vorbereitet worden ist (%s)" -#: pl_exec.c:7071 pl_exec.c:7105 pl_exec.c:7179 pl_exec.c:7205 +#: pl_exec.c:7093 pl_exec.c:7127 pl_exec.c:7201 pl_exec.c:7227 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "Anzahl der Quell- und Zielfelder in der Zuweisung stimmt nicht überein" #. translator: %s represents a name of an extra check -#: pl_exec.c:7073 pl_exec.c:7107 pl_exec.c:7181 pl_exec.c:7207 +#: pl_exec.c:7095 pl_exec.c:7129 pl_exec.c:7203 pl_exec.c:7229 #, c-format msgid "%s check of %s is active." msgstr "Check »%s« aus »%s« ist aktiv." -#: pl_exec.c:7077 pl_exec.c:7111 pl_exec.c:7185 pl_exec.c:7211 +#: pl_exec.c:7099 pl_exec.c:7133 pl_exec.c:7207 pl_exec.c:7233 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "Stellen Sie sicher, dass die Anfrage die genaue Spaltenliste zurückgibt." -#: pl_exec.c:7598 +#: pl_exec.c:7620 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "Record »%s« hat noch keinen Wert" -#: pl_exec.c:7599 +#: pl_exec.c:7621 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "Die Tupelstruktur eines Records ohne Wert ist unbestimmt." @@ -529,280 +539,280 @@ msgstr "SQL-Anweisung" msgid "FOR over EXECUTE statement" msgstr "FOR-über-EXECUTE-Anweisung" -#: pl_gram.y:487 +#: pl_gram.y:486 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "Blocklabel muss vor DECLARE stehen, nicht danach" -#: pl_gram.y:507 +#: pl_gram.y:506 #, c-format msgid "collations are not supported by type %s" msgstr "Sortierfolgen werden von Typ %s nicht unterstützt" -#: pl_gram.y:526 +#: pl_gram.y:525 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "Variable »%s« muss einen Vorgabewert haben, da sie als NOT NULL deklariert ist" -#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 +#: pl_gram.y:673 pl_gram.y:688 pl_gram.y:714 #, c-format msgid "variable \"%s\" does not exist" msgstr "Variable »%s« existiert nicht" -#: pl_gram.y:733 pl_gram.y:761 +#: pl_gram.y:732 pl_gram.y:760 msgid "duplicate declaration" msgstr "doppelte Deklaration" -#: pl_gram.y:744 pl_gram.y:772 +#: pl_gram.y:743 pl_gram.y:771 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "Variable »%s« verdeckt eine zuvor definierte Variable" -#: pl_gram.y:1046 +#: pl_gram.y:1043 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "Diagnostikelement %s ist in GET STACKED DIAGNOSTICS nicht erlaubt" -#: pl_gram.y:1064 +#: pl_gram.y:1061 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "Diagnostikelement %s ist in GET CURRENT DIAGNOSTICS nicht erlaubt" -#: pl_gram.y:1159 +#: pl_gram.y:1156 msgid "unrecognized GET DIAGNOSTICS item" msgstr "unbekanntes Element in GET DIAGNOSTICS" -#: pl_gram.y:1175 pl_gram.y:3583 +#: pl_gram.y:1172 pl_gram.y:3557 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "»%s« ist keine skalare Variable" -#: pl_gram.y:1405 pl_gram.y:1599 +#: pl_gram.y:1402 pl_gram.y:1596 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "Schleifenvariable einer Schleife über Zeilen muss eine Record-Variable oder eine Liste von skalaren Variablen sein" -#: pl_gram.y:1440 +#: pl_gram.y:1437 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "Cursor-FOR-Schleife darf nur eine Zielvariable haben" -#: pl_gram.y:1447 +#: pl_gram.y:1444 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "Cursor-FOR-Schleife muss eine gebundene Cursor-Variable verwenden" -#: pl_gram.y:1538 +#: pl_gram.y:1535 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "ganzzahlige FOR-Schleife darf nur eine Zielvariable haben" -#: pl_gram.y:1572 +#: pl_gram.y:1569 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "REVERSE kann nicht in einer Anfrage-FOR-Schleife verwendet werden" -#: pl_gram.y:1702 +#: pl_gram.y:1699 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "Schleifenvariable von FOREACH muss eine bekannte Variable oder Liste von Variablen sein" -#: pl_gram.y:1744 +#: pl_gram.y:1741 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "diese Anweisung umschließt kein Block und keine Schleife mit Label »%s«" -#: pl_gram.y:1752 +#: pl_gram.y:1749 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "Blocklabel »%s« kann nicht in CONTINUE verwendet werden" -#: pl_gram.y:1767 +#: pl_gram.y:1764 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT kann nicht außerhalb einer Schleife verwendet werden, außer wenn es ein Label hat" -#: pl_gram.y:1768 +#: pl_gram.y:1765 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE kann nicht außerhalb einer Schleife verwendet werden" -#: pl_gram.y:1792 pl_gram.y:1830 pl_gram.y:1878 pl_gram.y:3032 pl_gram.y:3118 -#: pl_gram.y:3229 pl_gram.y:3982 +#: pl_gram.y:1789 pl_gram.y:1827 pl_gram.y:1875 pl_gram.y:3004 pl_gram.y:3092 +#: pl_gram.y:3203 pl_gram.y:3956 msgid "unexpected end of function definition" msgstr "unerwartetes Ende der Funktionsdefinition" -#: pl_gram.y:1898 pl_gram.y:1922 pl_gram.y:1938 pl_gram.y:1944 pl_gram.y:2065 -#: pl_gram.y:2073 pl_gram.y:2087 pl_gram.y:2182 pl_gram.y:2434 pl_gram.y:2524 -#: pl_gram.y:2683 pl_gram.y:3825 pl_gram.y:3886 pl_gram.y:3963 +#: pl_gram.y:1895 pl_gram.y:1919 pl_gram.y:1935 pl_gram.y:1941 pl_gram.y:2066 +#: pl_gram.y:2074 pl_gram.y:2088 pl_gram.y:2183 pl_gram.y:2407 pl_gram.y:2497 +#: pl_gram.y:2655 pl_gram.y:3799 pl_gram.y:3860 pl_gram.y:3937 msgid "syntax error" msgstr "Syntaxfehler" -#: pl_gram.y:1926 pl_gram.y:1928 pl_gram.y:2438 pl_gram.y:2440 +#: pl_gram.y:1923 pl_gram.y:1925 pl_gram.y:2411 pl_gram.y:2413 msgid "invalid SQLSTATE code" msgstr "ungültiger SQLSTATE-Code" -#: pl_gram.y:2130 +#: pl_gram.y:2131 msgid "syntax error, expected \"FOR\"" msgstr "Syntaxfehler, »FOR« erwartet" -#: pl_gram.y:2191 +#: pl_gram.y:2192 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "FETCH-Anweisung kann nicht mehrere Zeilen zurückgeben" -#: pl_gram.y:2316 +#: pl_gram.y:2289 #, c-format msgid "cursor variable must be a simple variable" msgstr "Cursor-Variable muss eine einfache Variable sein" -#: pl_gram.y:2322 +#: pl_gram.y:2295 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "Variable »%s« muss Typ cursor oder refcursor haben" -#: pl_gram.y:2654 pl_gram.y:2665 +#: pl_gram.y:2626 pl_gram.y:2637 #, c-format msgid "\"%s\" is not a known variable" msgstr "»%s« ist keine bekannte Variable" -#: pl_gram.y:2771 pl_gram.y:2781 pl_gram.y:2937 +#: pl_gram.y:2743 pl_gram.y:2753 pl_gram.y:2909 msgid "mismatched parentheses" msgstr "Klammern passen nicht" -#: pl_gram.y:2785 +#: pl_gram.y:2757 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "»%s« fehlt am Ende des SQL-Ausdrucks" -#: pl_gram.y:2791 +#: pl_gram.y:2763 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "»%s« fehlt am Ende der SQL-Anweisung" -#: pl_gram.y:2808 +#: pl_gram.y:2780 msgid "missing expression" msgstr "Ausdruck fehlt" -#: pl_gram.y:2810 +#: pl_gram.y:2782 msgid "missing SQL statement" msgstr "SQL-Anweisung fehlt" -#: pl_gram.y:2939 +#: pl_gram.y:2911 msgid "incomplete data type declaration" msgstr "unvollständige Datentypdeklaration" -#: pl_gram.y:2962 +#: pl_gram.y:2934 msgid "missing data type declaration" msgstr "fehlende Datentypdeklaration" -#: pl_gram.y:3040 +#: pl_gram.y:3014 msgid "INTO specified more than once" msgstr "INTO mehr als einmal angegeben" -#: pl_gram.y:3210 +#: pl_gram.y:3184 msgid "expected FROM or IN" msgstr "FROM oder IN erwartet" -#: pl_gram.y:3271 +#: pl_gram.y:3245 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "RETURN kann keinen Parameter haben in einer Funktion mit Mengenergebnis" -#: pl_gram.y:3272 +#: pl_gram.y:3246 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Verwenden Sie RETURN NEXT oder RETURN QUERY." -#: pl_gram.y:3282 +#: pl_gram.y:3256 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "RETURN kann keinen Parameter haben in einer Prozedur" -#: pl_gram.y:3287 +#: pl_gram.y:3261 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "RETURN kann keinen Parameter haben in einer Funktion, die »void« zurückgibt" -#: pl_gram.y:3296 +#: pl_gram.y:3270 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN kann keinen Parameter haben in einer Funktion mit OUT-Parametern" -#: pl_gram.y:3359 +#: pl_gram.y:3333 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "RETURN NEXT kann keinen Parameter haben in einer Funktion mit OUT-Parametern" -#: pl_gram.y:3467 +#: pl_gram.y:3441 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "Variable »%s« ist als CONSTANT deklariert" -#: pl_gram.y:3525 +#: pl_gram.y:3499 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "Record-Variable kann nicht Teil einer INTO-Liste mit mehreren Elementen sein" -#: pl_gram.y:3571 +#: pl_gram.y:3545 #, c-format msgid "too many INTO variables specified" msgstr "zu viele INTO-Variablen angegeben" -#: pl_gram.y:3779 +#: pl_gram.y:3753 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "Endlabel »%s« für ungelabelten Block angegeben" -#: pl_gram.y:3786 +#: pl_gram.y:3760 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "Endlabel »%s« unterscheidet sich vom Label des Blocks »%s«" -#: pl_gram.y:3820 +#: pl_gram.y:3794 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "Cursor »%s« hat keine Argumente" -#: pl_gram.y:3834 +#: pl_gram.y:3808 #, c-format msgid "cursor \"%s\" has arguments" msgstr "Cursor »%s« hat Argumente" -#: pl_gram.y:3876 +#: pl_gram.y:3850 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "Cursor »%s« hat kein Argument namens »%s«" -#: pl_gram.y:3896 +#: pl_gram.y:3870 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "Wert für Parameter »%s« von Cursor »%s« mehrmals angegeben" -#: pl_gram.y:3921 +#: pl_gram.y:3895 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "nicht genügend Argumente für Cursor »%s«" -#: pl_gram.y:3928 +#: pl_gram.y:3902 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "zu viele Argumente für Cursor »%s«" -#: pl_gram.y:4014 +#: pl_gram.y:3988 msgid "unrecognized RAISE statement option" msgstr "unbekannte Option für RAISE-Anweisung" -#: pl_gram.y:4018 +#: pl_gram.y:3992 msgid "syntax error, expected \"=\"" msgstr "Syntaxfehler, »=« erwartet" -#: pl_gram.y:4059 +#: pl_gram.y:4033 #, c-format msgid "too many parameters specified for RAISE" msgstr "zu viele Parameter für RAISE angegeben" -#: pl_gram.y:4063 +#: pl_gram.y:4037 #, c-format msgid "too few parameters specified for RAISE" msgstr "zu wenige Parameter für RAISE angegeben" diff --git a/src/pl/plpgsql/src/po/el.po b/src/pl/plpgsql/src/po/el.po new file mode 100644 index 0000000000..bafc55b751 --- /dev/null +++ b/src/pl/plpgsql/src/po/el.po @@ -0,0 +1,850 @@ +# Greek message translation file for plpgsql +# Copyright (C) 2021 PostgreSQL Global Development Group +# This file is distributed under the same license as the plpgsql (PostgreSQL) package. +# Georgios Kokolatos , 2021. +# +# +# +msgid "" +msgstr "" +"Project-Id-Version: plpgsql (PostgreSQL) 14\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2021-11-08 10:09+0000\n" +"PO-Revision-Date: 2021-11-08 12:19+0100\n" +"Last-Translator: Georgios Kokolatos \n" +"Language-Team: \n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.0\n" + +#: pl_comp.c:438 pl_handler.c:496 +#, c-format +msgid "PL/pgSQL functions cannot accept type %s" +msgstr "οι συναρτήσεις PL/pgSQL δεν μπορούν να δεχθούν τύπο %s" + +#: pl_comp.c:530 +#, c-format +msgid "could not determine actual return type for polymorphic function \"%s\"" +msgstr "δεν ήταν δυνατός ο προσδιορισμός του πραγματικού τύπου επιστροφής για την πολυμορφική συνάρτηση «%s»" + +#: pl_comp.c:560 +#, c-format +msgid "trigger functions can only be called as triggers" +msgstr "συναρτήσεις εναυσμάτων μπορούν να κληθούν μόνο ως εναύσματα" + +#: pl_comp.c:564 pl_handler.c:480 +#, c-format +msgid "PL/pgSQL functions cannot return type %s" +msgstr "οι συναρτήσεις PL/pgSQL δεν μπορούν να επιστρέψουν τύπο %s" + +#: pl_comp.c:604 +#, c-format +msgid "trigger functions cannot have declared arguments" +msgstr "οι συναρτήσεις εναυσμάτων δεν μπορούν να έχουν δηλωμένες παραμέτρους" + +#: pl_comp.c:605 +#, c-format +msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." +msgstr "Οι παράμετροι του εναύσματος μπορούν εναλλακτικά να προσπελαστούν μέσω TG_NARGS και TG_ARGV." + +#: pl_comp.c:738 +#, c-format +msgid "event trigger functions cannot have declared arguments" +msgstr "οι συναρτήσεις εναυσμάτων συμβάντος δεν μπορούν να έχουν δηλωμένες παραμέτρους" + +#: pl_comp.c:1002 +#, c-format +msgid "compilation of PL/pgSQL function \"%s\" near line %d" +msgstr "μεταγλώτηση της συνάρτησης PL/pgSQL «%s» κοντά στη γραμμή %d" + +#: pl_comp.c:1025 +#, c-format +msgid "parameter name \"%s\" used more than once" +msgstr "όνομα παραμέτρου «%s» χρησιμοποιείται περισσότερες από μία φορές" + +#: pl_comp.c:1139 +#, c-format +msgid "column reference \"%s\" is ambiguous" +msgstr "αναφορά στήλης «%s» είναι αμφίσημη" + +#: pl_comp.c:1141 +#, c-format +msgid "It could refer to either a PL/pgSQL variable or a table column." +msgstr "Θα μπορούσε να αναφέρεται είτε σε μεταβλητή PL/pgSQL είτε σε στήλη πίνακα." + +#: pl_comp.c:1324 pl_exec.c:5190 pl_exec.c:5363 pl_exec.c:5450 pl_exec.c:5541 +#: pl_exec.c:6562 +#, c-format +msgid "record \"%s\" has no field \"%s\"" +msgstr "η εγγραφή «%s» δεν έχει πεδίο «%s»" + +#: pl_comp.c:1818 +#, c-format +msgid "relation \"%s\" does not exist" +msgstr "η σχέση «%s» δεν υπάρχει" + +#: pl_comp.c:1825 pl_comp.c:1867 +#, c-format +msgid "relation \"%s\" does not have a composite type" +msgstr "η σχέση «%s» δεν έχει συνθετικό τύπο" + +#: pl_comp.c:1933 +#, c-format +msgid "variable \"%s\" has pseudo-type %s" +msgstr "η μεταβλητή «%s» έχει ψευδο-τύπο %s" + +#: pl_comp.c:2122 +#, c-format +msgid "type \"%s\" is only a shell" +msgstr "τύπος «%s» είναι μόνο ένα κέλυφος" + +#: pl_comp.c:2204 pl_exec.c:6863 +#, c-format +msgid "type %s is not composite" +msgstr "τύπος %s δεν είναι συνθετικός" + +#: pl_comp.c:2252 pl_comp.c:2305 +#, c-format +msgid "unrecognized exception condition \"%s\"" +msgstr "μη αναγνωρίσιμη συνθήκη εξαίρεσης «%s»" + +#: pl_comp.c:2526 +#, c-format +msgid "could not determine actual argument type for polymorphic function \"%s\"" +msgstr "δεν ήταν δυνατός ο προσδιορισμός του πραγματικού τύπου παραμέτρου για την πολυμορφική συνάρτηση «%s»" + +#: pl_exec.c:500 pl_exec.c:934 pl_exec.c:1169 +msgid "during initialization of execution state" +msgstr "κατά την αρχικοποίηση της κατάστασης εκτέλεσης" + +#: pl_exec.c:506 +msgid "while storing call arguments into local variables" +msgstr "κατά την αποθήκευση παραμέτρων κλήσης σε τοπικές μεταβλητές" + +#: pl_exec.c:594 pl_exec.c:1007 +msgid "during function entry" +msgstr "κατά τη διάρκεια εισόδου συνάρτησης" + +#: pl_exec.c:617 +#, c-format +msgid "control reached end of function without RETURN" +msgstr "ο έλεγχος έφθασε στο τέλος συνάρτησης χωρίς RETURN" + +#: pl_exec.c:623 +msgid "while casting return value to function's return type" +msgstr "κατά τη διάρκεια cast της τιμής επιστροφής στον τύπο επιστροφής της συνάρτησης" + +#: pl_exec.c:636 pl_exec.c:3637 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "set-valued συνάρτηση καλείται σε περιεχόμενο που δεν μπορεί να δεχτεί ένα σύνολο" + +#: pl_exec.c:762 pl_exec.c:1033 pl_exec.c:1191 +msgid "during function exit" +msgstr "κατά τη διάρκεια εξόδου συνάρτησης" + +#: pl_exec.c:817 pl_exec.c:881 pl_exec.c:3434 +msgid "returned record type does not match expected record type" +msgstr "ο επιστρεφόμενος τύπος εγγραφής δεν ταιριάζει με τον αναμενόμενο τύπο εγγραφής" + +#: pl_exec.c:1030 pl_exec.c:1188 +#, c-format +msgid "control reached end of trigger procedure without RETURN" +msgstr "ο έλεγχος έφτασε στο τέλος της διαδικασίας εναύσματος χωρίς RETURN" + +#: pl_exec.c:1038 +#, c-format +msgid "trigger procedure cannot return a set" +msgstr "διεργασία εναύσματος δεν δύναται να επιστρέψει ένα σύνολο" + +#: pl_exec.c:1077 pl_exec.c:1105 +msgid "returned row structure does not match the structure of the triggering table" +msgstr "η δομή της σειράς επιστροφής δεν ταιριάζει με τη δομή του πίνακα ενεργοποίησης" + +#. translator: last %s is a phrase such as "during statement block +#. local variable initialization" +#. +#: pl_exec.c:1237 +#, c-format +msgid "PL/pgSQL function %s line %d %s" +msgstr "συνάρτηση PL/pgSQL %s γραμμή %d %s" + +#. translator: last %s is a phrase such as "while storing call +#. arguments into local variables" +#. +#: pl_exec.c:1248 +#, c-format +msgid "PL/pgSQL function %s %s" +msgstr "συνάρτηση PL/pgSQL %s %s" + +#. translator: last %s is a plpgsql statement type name +#: pl_exec.c:1256 +#, c-format +msgid "PL/pgSQL function %s line %d at %s" +msgstr "συνάρτηση PL/pgSQL %s γραμμή %d στο %s" + +#: pl_exec.c:1262 +#, c-format +msgid "PL/pgSQL function %s" +msgstr "συνάρτηση PL/pgSQL «%s»" + +#: pl_exec.c:1633 +msgid "during statement block local variable initialization" +msgstr "κατά τη διάρκεια μπλοκ δήλωσης τοπικής αρχικοποίησης μεταβλητής" + +#: pl_exec.c:1731 +msgid "during statement block entry" +msgstr "κατά τη διάρκεια εισόδου μπλοκ δήλωσης" + +#: pl_exec.c:1763 +msgid "during statement block exit" +msgstr "κατά τη διάρκεια εξόδου μπλοκ δήλωσης" + +#: pl_exec.c:1801 +msgid "during exception cleanup" +msgstr "κατά τη διάρκεια καθαρισμού εξαίρεσης" + +#: pl_exec.c:2334 +#, c-format +msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" +msgstr "η παράμετρος διαδικασίας «%s» είναι παράμετρος εξόδου, αλλά το αντίστοιχο όρισμα δεν είναι εγγράψιμο" + +#: pl_exec.c:2339 +#, c-format +msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" +msgstr "η παράμετρος διαδικασίας %d είναι παράμετρος εξόδου, αλλά το αντίστοιχο όρισμα δεν είναι εγγράψιμο" + +#: pl_exec.c:2373 +#, c-format +msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" +msgstr "GET STACKED DIAGNOSTICS δεν είναι δυνατό να χρησιμοποιηθεί εκτός ενός χειριστή εξαιρέσεων" + +#: pl_exec.c:2573 +#, c-format +msgid "case not found" +msgstr "υπόθεση δεν βρέθηκε" + +#: pl_exec.c:2574 +#, c-format +msgid "CASE statement is missing ELSE part." +msgstr "Η δήλωση CASE δεν περιέχει τμήμα ELSE." + +#: pl_exec.c:2667 +#, c-format +msgid "lower bound of FOR loop cannot be null" +msgstr "το κατώτατο όριο του βρόχου FOR δεν μπορεί να είναι null" + +#: pl_exec.c:2683 +#, c-format +msgid "upper bound of FOR loop cannot be null" +msgstr "το ανώνοτατο όριο του βρόχου FOR δεν μπορεί να είναι null" + +#: pl_exec.c:2701 +#, c-format +msgid "BY value of FOR loop cannot be null" +msgstr "η τιμή BY του βρόχου FOR δεν μπορεί να είναι null" + +#: pl_exec.c:2707 +#, c-format +msgid "BY value of FOR loop must be greater than zero" +msgstr "η τιμή BY του βρόχου FOR πρέπει να είναι μεγαλύτερη του μηδενός" + +#: pl_exec.c:2841 pl_exec.c:4626 +#, c-format +msgid "cursor \"%s\" already in use" +msgstr "ο δρομέας «%s» βρίσκεται ήδη σε χρήση" + +#: pl_exec.c:2864 pl_exec.c:4691 +#, c-format +msgid "arguments given for cursor without arguments" +msgstr "δίνονται ορίσματα σε δρομέα χωρίς ορίσματα" + +#: pl_exec.c:2883 pl_exec.c:4710 +#, c-format +msgid "arguments required for cursor" +msgstr "επιβάλλονται ορίσματα για τον δρομέα" + +#: pl_exec.c:2970 +#, c-format +msgid "FOREACH expression must not be null" +msgstr "η έκφραση FOREACH πρέπει να μην είναι null" + +#: pl_exec.c:2985 +#, c-format +msgid "FOREACH expression must yield an array, not type %s" +msgstr "η έκφραση FOREACH πρέπει αποδώσει μία συστοιχία, όχι ένα τύπο %s" + +#: pl_exec.c:3002 +#, c-format +msgid "slice dimension (%d) is out of the valid range 0..%d" +msgstr "η διάσταση (%d) του slice βρίσκεται εκτός του έγκυρου εύρους 0.. %d" + +#: pl_exec.c:3029 +#, c-format +msgid "FOREACH ... SLICE loop variable must be of an array type" +msgstr "η μεταβλητή βρόχου FOREACH ... SLICE πρέπει να είναι τύπου συστοιχίας" + +#: pl_exec.c:3033 +#, c-format +msgid "FOREACH loop variable must not be of an array type" +msgstr "η μεταβλητή βρόχου FOREACH δεν πρέπει να είναι τύπου συστοιχίας" + +#: pl_exec.c:3195 pl_exec.c:3252 pl_exec.c:3427 +#, c-format +msgid "cannot return non-composite value from function returning composite type" +msgstr "δεν είναι δυνατή η επιστροφή μη-σύνθετης τιμής από σύνθετο τύπο συνάρτησης που επιστρέφει σύνθετο τύπο" + +#: pl_exec.c:3291 pl_gram.y:3310 +#, c-format +msgid "cannot use RETURN NEXT in a non-SETOF function" +msgstr "δεν είναι δυνατή η χρήση RETURN NEXT σε συνάρτηση non-SETOF" + +#: pl_exec.c:3332 pl_exec.c:3464 +#, c-format +msgid "wrong result type supplied in RETURN NEXT" +msgstr "εσφαλμένος τύπος αποτελέσματος που παρέχεται στο RETURN NEXT" + +#: pl_exec.c:3370 pl_exec.c:3391 +#, c-format +msgid "wrong record type supplied in RETURN NEXT" +msgstr "εσφαλμένος τύπος εγγραφής που παρέχεται στο RETURN NEXT" + +#: pl_exec.c:3483 +#, c-format +msgid "RETURN NEXT must have a parameter" +msgstr "το RETURN NEXT πρέπει να έχει παράμετρο" + +#: pl_exec.c:3511 pl_gram.y:3374 +#, c-format +msgid "cannot use RETURN QUERY in a non-SETOF function" +msgstr "δεν είναι δυνατή η χρήση RETURN QUERY σε συνάρτηση non-SETOF" + +#: pl_exec.c:3529 +msgid "structure of query does not match function result type" +msgstr "η δομή του ερωτήματος δεν ταιριάζει με τον τύπο αποτελέσματος της συνάρτησης" + +#: pl_exec.c:3584 pl_exec.c:4404 pl_exec.c:8604 +#, c-format +msgid "query string argument of EXECUTE is null" +msgstr "η παράμετρος συμβολοσειράς ερωτήματος του EXECUTE είναι null" + +#: pl_exec.c:3665 pl_exec.c:3803 +#, c-format +msgid "RAISE option already specified: %s" +msgstr "επιλογή RAISE που έχει ήδη καθοριστεί: %s" + +#: pl_exec.c:3699 +#, c-format +msgid "RAISE without parameters cannot be used outside an exception handler" +msgstr "RAISE χωρίς παραμέτρους δεν μπορεί να χρησιμοποιηθεί εκτός ενός δείκτη χειρισμού εξαιρέσεων" + +#: pl_exec.c:3793 +#, c-format +msgid "RAISE statement option cannot be null" +msgstr "η επιλογή δήλωσης RAISE δεν μπορεί να είναι null" + +#: pl_exec.c:3863 +#, c-format +msgid "%s" +msgstr "%s" + +#: pl_exec.c:3918 +#, c-format +msgid "assertion failed" +msgstr "η επιβεβαίωση απέτυχε" + +#: pl_exec.c:4277 pl_exec.c:4465 +#, c-format +msgid "cannot COPY to/from client in PL/pgSQL" +msgstr "δεν είναι δυνατό το COPY to/from τον πελάτη σε PL/pgSQL" + +#: pl_exec.c:4283 +#, c-format +msgid "unsupported transaction command in PL/pgSQL" +msgstr "μη υποστηριζόμενη συναλλαγή σε PL/pgSQL" + +#: pl_exec.c:4306 pl_exec.c:4494 +#, c-format +msgid "INTO used with a command that cannot return data" +msgstr "το INTO χρησιμοποιείται με μια εντολή που δεν μπορεί να επιστρέψει δεδομένα" + +#: pl_exec.c:4329 pl_exec.c:4517 +#, c-format +msgid "query returned no rows" +msgstr "το ερώτημα επέστρεψε καθόλου γραμμές" + +#: pl_exec.c:4351 pl_exec.c:4536 pl_exec.c:5685 +#, c-format +msgid "query returned more than one row" +msgstr "ερώτημα επέστρεψε περισσότερες από μία γραμμές" + +#: pl_exec.c:4353 +#, c-format +msgid "Make sure the query returns a single row, or use LIMIT 1." +msgstr "Βεβαιωθείτε ότι το ερώτημα επιστρέφει μία μόνο γραμμή ή χρησιμοποιήστε το LIMIT 1." + +#: pl_exec.c:4369 +#, c-format +msgid "query has no destination for result data" +msgstr "το ερώτημα δεν έχει προορισμό για τα δεδομένα αποτελεσμάτων" + +#: pl_exec.c:4370 +#, c-format +msgid "If you want to discard the results of a SELECT, use PERFORM instead." +msgstr "Εάν θέλετε να απορρίψετε τα αποτελέσματα ενός SELECT, χρησιμοποιήστε την επιλογή PERFORM." + +#: pl_exec.c:4457 +#, c-format +msgid "EXECUTE of SELECT ... INTO is not implemented" +msgstr "EXECUTE of SELECT ... INTO δεν έχει υλοποιηθεί" + +#: pl_exec.c:4458 +#, c-format +msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." +msgstr "Ίσως θέλετε να χρησιμοποιήσετε το EXECUTE ... INTO ή EXECUTE CREATE TABLE ... AS αντ' αυτού." + +#: pl_exec.c:4471 +#, c-format +msgid "EXECUTE of transaction commands is not implemented" +msgstr "EXECUTE εντολών συναλλαγής δεν έχει εφαρμοσθεί" + +#: pl_exec.c:4772 pl_exec.c:4860 +#, c-format +msgid "cursor variable \"%s\" is null" +msgstr "η μεταβλήτη «%s» του δρομέα είναι κενή" + +#: pl_exec.c:4783 pl_exec.c:4871 +#, c-format +msgid "cursor \"%s\" does not exist" +msgstr "ο δρομέας «%s» δεν υπάρχει" + +#: pl_exec.c:4796 +#, c-format +msgid "relative or absolute cursor position is null" +msgstr "η σχετική ή η απόλυτη θέση δρομέα είναι null" + +#: pl_exec.c:5040 pl_exec.c:5135 +#, c-format +msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" +msgstr "δεν είναι δυνατή η αντιστοίχιση τιμής null στη μεταβλητή «%s» δηλωμένης ως NOT NULL" + +#: pl_exec.c:5116 +#, c-format +msgid "cannot assign non-composite value to a row variable" +msgstr "δεν είναι δυνατή η αντιστοίχιση μη-σύνθετης τιμής σε μεταβλητή σειράς" + +#: pl_exec.c:5148 +#, c-format +msgid "cannot assign non-composite value to a record variable" +msgstr "δεν είναι δυνατή η αντιστοίχιση μη-σύνθετης τιμής σε μεταβλητή εγγραφής" + +#: pl_exec.c:5199 +#, c-format +msgid "cannot assign to system column \"%s\"" +msgstr "δεν είναι δυνατή η ανάθεση στη στήλη συστήματος «%s»" + +#: pl_exec.c:5648 +#, c-format +msgid "query did not return data" +msgstr "το ερώτημα δεν επέστρεψε δεδομένα" + +#: pl_exec.c:5649 pl_exec.c:5661 pl_exec.c:5686 pl_exec.c:5762 pl_exec.c:5767 +#, c-format +msgid "query: %s" +msgstr "ερώτημα: %s" + +#: pl_exec.c:5657 +#, c-format +msgid "query returned %d column" +msgid_plural "query returned %d columns" +msgstr[0] "το ερώτημα επέστρεψε %d στήλη" +msgstr[1] "το ερώτημα επέστρεψε %d στήλες" + +#: pl_exec.c:5761 +#, c-format +msgid "query is SELECT INTO, but it should be plain SELECT" +msgstr "το ερώτημα είναι SELECT INTO, αλλά θα έπρεπε να είναι απλό SELECT" + +#: pl_exec.c:5766 +#, c-format +msgid "query is not a SELECT" +msgstr "ερώτημα δεν είναι SELECT" + +#: pl_exec.c:6576 pl_exec.c:6616 pl_exec.c:6656 +#, c-format +msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" +msgstr "ο τύπος παραμέτρου %d (%s) δεν συμφωνεί με αυτόν κατά την προετοιμασία του σχεδίου (%s)" + +#: pl_exec.c:7067 pl_exec.c:7101 pl_exec.c:7175 pl_exec.c:7201 +#, c-format +msgid "number of source and target fields in assignment does not match" +msgstr "ο αριθμός των πεδίων προέλευσης και προορισμού στην ανάθεση δεν συμφωνεί" + +#. translator: %s represents a name of an extra check +#: pl_exec.c:7069 pl_exec.c:7103 pl_exec.c:7177 pl_exec.c:7203 +#, c-format +msgid "%s check of %s is active." +msgstr "%s έλεγχος του %s είναι ενεργός." + +#: pl_exec.c:7073 pl_exec.c:7107 pl_exec.c:7181 pl_exec.c:7207 +#, c-format +msgid "Make sure the query returns the exact list of columns." +msgstr "Βεβαιωθείτε ότι το ερώτημα επιστρέφει την ακριβή λίστα στηλών." + +#: pl_exec.c:7594 +#, c-format +msgid "record \"%s\" is not assigned yet" +msgstr "η εγγραφή «%s» δεν έχει ανατεθεί ακόμα" + +#: pl_exec.c:7595 +#, c-format +msgid "The tuple structure of a not-yet-assigned record is indeterminate." +msgstr "Η δομή πλειάδας μίας εγγραφής που δεν έχει ακόμη ανατεθεί είναι απροσδιόριστη." + +#: pl_funcs.c:237 +msgid "statement block" +msgstr "μπλοκ δήλωσης" + +#: pl_funcs.c:239 +msgid "assignment" +msgstr "ανάθεση" + +#: pl_funcs.c:249 +msgid "FOR with integer loop variable" +msgstr "FOR με ακέραια μεταβλητή βρόχου" + +#: pl_funcs.c:251 +msgid "FOR over SELECT rows" +msgstr "FOR σε SELECT rows" + +#: pl_funcs.c:253 +msgid "FOR over cursor" +msgstr "FOR σε ένα δρομέα" + +#: pl_funcs.c:255 +msgid "FOREACH over array" +msgstr "FOREACH σε συστοιχία" + +#: pl_funcs.c:269 +msgid "SQL statement" +msgstr "SQL δήλωση" + +#: pl_funcs.c:273 +msgid "FOR over EXECUTE statement" +msgstr "FOR σε δήλωση EXECUTE" + +#: pl_gram.y:485 +#, c-format +msgid "block label must be placed before DECLARE, not after" +msgstr "η ετικέτα μπλοκ πρέπει να τοποθετείται πριν από το DECLARE, όχι μετά" + +#: pl_gram.y:505 +#, c-format +msgid "collations are not supported by type %s" +msgstr "συρραφές δεν υποστηρίζονται από τον τύπο %s" + +#: pl_gram.y:524 +#, c-format +msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" +msgstr "η μεταβλητή «%s» πρέπει να έχει προεπιλεγμένη τιμή, καθώς έχει δηλωθεί NOT NULL" + +#: pl_gram.y:672 pl_gram.y:687 pl_gram.y:713 +#, c-format +msgid "variable \"%s\" does not exist" +msgstr "μεταβλητή «%s» δεν υπάρχει" + +#: pl_gram.y:731 pl_gram.y:759 +msgid "duplicate declaration" +msgstr "διπλότυπη δήλωση" + +#: pl_gram.y:742 pl_gram.y:770 +#, c-format +msgid "variable \"%s\" shadows a previously defined variable" +msgstr "η μεταβλητή «%s» σκιάζει μια προηγουμένως ορισμένη μεταβλητή" + +#: pl_gram.y:1042 +#, c-format +msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" +msgstr "δεν επιτρέπεται το διαγνωστικό στοιχείο %s σε GET STACKED DIAGNOSTICS" + +#: pl_gram.y:1060 +#, c-format +msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" +msgstr "δεν επιτρέπεται το διαγνωστικό στοιχείο %s σε GET CURRENT DIAGNOSTICS" + +#: pl_gram.y:1155 +msgid "unrecognized GET DIAGNOSTICS item" +msgstr "μη αναγνωρίσιμο στοιχείο GET DIAGNOSTICS" + +#: pl_gram.y:1171 pl_gram.y:3549 +#, c-format +msgid "\"%s\" is not a scalar variable" +msgstr "«%s» δεν είναι scalar μεταβλητή" + +#: pl_gram.y:1401 pl_gram.y:1595 +#, c-format +msgid "loop variable of loop over rows must be a record variable or list of scalar variables" +msgstr "η μεταβλητή βρόχου ενός βρόχου πάνω από γραμμές πρέπει να είναι είτε μεταβλητή εγγραφής ή μια λίστα scalar μεταβλητών" + +#: pl_gram.y:1436 +#, c-format +msgid "cursor FOR loop must have only one target variable" +msgstr "ο δρομέας βρόχου FOR πρέπει να έχει μόνο μία μεταβλητή προορισμού" + +#: pl_gram.y:1443 +#, c-format +msgid "cursor FOR loop must use a bound cursor variable" +msgstr "ο δρομέας βρόχου FOR πρέπει να χρησιμοποιήσει μια δεσμευμένη μεταβλητή δρομέα" + +#: pl_gram.y:1534 +#, c-format +msgid "integer FOR loop must have only one target variable" +msgstr "ακέραιος βρόχος FOR πρέπει να έχει μόνο μία μεταβλητή προορισμού" + +#: pl_gram.y:1568 +#, c-format +msgid "cannot specify REVERSE in query FOR loop" +msgstr "δεν είναι δυνατός ο καθορισμός REVERSE σε ερώτημα βρόχου FOR" + +#: pl_gram.y:1698 +#, c-format +msgid "loop variable of FOREACH must be a known variable or list of variables" +msgstr "η μεταβλητή του βρόχου FOREACH πρέπει να είναι είτε γνωστή μεταβλητή ή λίστα μεταβλητών" + +#: pl_gram.y:1740 +#, c-format +msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" +msgstr "δεν υπάρχει ετικέτα «%s» προσαρτημένη σε οποιοδήποτε μπλοκ ή βρόχο που περικλείει αυτήν τη δήλωση" + +#: pl_gram.y:1748 +#, c-format +msgid "block label \"%s\" cannot be used in CONTINUE" +msgstr "η ετικέτα μπλοκ «%s» δεν μπορεί να χρησιμοποιηθεί σε CONTINUE" + +#: pl_gram.y:1763 +#, c-format +msgid "EXIT cannot be used outside a loop, unless it has a label" +msgstr "το EXIT δεν μπορεί να χρησιμοποιηθεί εκτός βρόχου, εκτός εάν έχει ετικέτα" + +#: pl_gram.y:1764 +#, c-format +msgid "CONTINUE cannot be used outside a loop" +msgstr "το CONTINUE δεν μπορεί να χρησιμοποιηθεί εκτός βρόχου" + +#: pl_gram.y:1788 pl_gram.y:1826 pl_gram.y:1874 pl_gram.y:2998 pl_gram.y:3084 +#: pl_gram.y:3195 pl_gram.y:3948 +msgid "unexpected end of function definition" +msgstr "μη αναμενόμενο τέλος ορισμού συνάρτησης" + +#: pl_gram.y:1894 pl_gram.y:1918 pl_gram.y:1934 pl_gram.y:1940 pl_gram.y:2061 +#: pl_gram.y:2069 pl_gram.y:2083 pl_gram.y:2178 pl_gram.y:2402 pl_gram.y:2492 +#: pl_gram.y:2649 pl_gram.y:3791 pl_gram.y:3852 pl_gram.y:3929 +msgid "syntax error" +msgstr "συντακτικό σφάλμα" + +#: pl_gram.y:1922 pl_gram.y:1924 pl_gram.y:2406 pl_gram.y:2408 +msgid "invalid SQLSTATE code" +msgstr "μη έγκυρος κωδικός SQLSTATE" + +#: pl_gram.y:2126 +msgid "syntax error, expected \"FOR\"" +msgstr "συντακτικό σφάλμα, αναμενόταν «FOR«" + +#: pl_gram.y:2187 +#, c-format +msgid "FETCH statement cannot return multiple rows" +msgstr "η δήλωση FETCH δεν είναι δυνατό να επιστρέψει πολλαπλές σειρές" + +#: pl_gram.y:2284 +#, c-format +msgid "cursor variable must be a simple variable" +msgstr "η μεταβλητή δρομέα πρέπει να είναι απλή μεταβλητή" + +#: pl_gram.y:2290 +#, c-format +msgid "variable \"%s\" must be of type cursor or refcursor" +msgstr "η μεταβλητή «%s» πρέπει να έχει τύπο δρομέα ή refcursor" + +#: pl_gram.y:2620 pl_gram.y:2631 +#, c-format +msgid "\"%s\" is not a known variable" +msgstr "«%s» δεν είναι γνωστή μεταβλητή" + +#: pl_gram.y:2737 pl_gram.y:2747 pl_gram.y:2903 +msgid "mismatched parentheses" +msgstr "ασυμφωνία παρενθέσεων" + +#: pl_gram.y:2751 +#, c-format +msgid "missing \"%s\" at end of SQL expression" +msgstr "λείπει «%s» στο τέλος SQL έκφρασης" + +#: pl_gram.y:2757 +#, c-format +msgid "missing \"%s\" at end of SQL statement" +msgstr "λείπει «%s» στο τέλος SQL δήλωσης" + +#: pl_gram.y:2774 +msgid "missing expression" +msgstr "λείπει έκφραση" + +#: pl_gram.y:2776 +msgid "missing SQL statement" +msgstr "λείπει SQL δήλωση" + +#: pl_gram.y:2905 +msgid "incomplete data type declaration" +msgstr "ελλιπής δήλωση τύπου δεδομένων" + +#: pl_gram.y:2928 +msgid "missing data type declaration" +msgstr "λείπει δήλωση τύπου δεδομένων" + +#: pl_gram.y:3006 +msgid "INTO specified more than once" +msgstr "INTO ορίστηκε περισσότερο από μία φορά" + +#: pl_gram.y:3176 +msgid "expected FROM or IN" +msgstr "αναμενόταν FROM ή IN" + +#: pl_gram.y:3237 +#, c-format +msgid "RETURN cannot have a parameter in function returning set" +msgstr "RETURN δεν μπορεί να έχει μία παράμετρο σε συνάρτηση που επιστρέφει σύνολο" + +#: pl_gram.y:3238 +#, c-format +msgid "Use RETURN NEXT or RETURN QUERY." +msgstr "Χρησιμοποίησε RETURN NEXT ή RETURN QUERY." + +#: pl_gram.y:3248 +#, c-format +msgid "RETURN cannot have a parameter in a procedure" +msgstr "RETURN δεν μπορεί να έχει μία παράμετρο σε μια διαδικασία" + +#: pl_gram.y:3253 +#, c-format +msgid "RETURN cannot have a parameter in function returning void" +msgstr "RETURN δεν μπορεί να έχει μία παράμετρο σε συνάρτηση που επιστρέφει κενό" + +#: pl_gram.y:3262 +#, c-format +msgid "RETURN cannot have a parameter in function with OUT parameters" +msgstr "RETURN δεν μπορεί να έχει μια παράμετρο σε συνάρτηση με παραμέτρους OUT" + +#: pl_gram.y:3325 +#, c-format +msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" +msgstr "RETURN NEXT δεν μπορεί να έχει μια παράμετρο σε συνάρτηση με παραμέτρους OUT" + +#: pl_gram.y:3433 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "η μεταβλητή «%s» είναι δηλωμένη ως CONSTANT" + +#: pl_gram.y:3491 +#, c-format +msgid "record variable cannot be part of multiple-item INTO list" +msgstr "η μεταβλητή εγγραφής δεν μπορεί να είναι μέρος λίστας INTO πολλαπλών στοιχείων" + +#: pl_gram.y:3537 +#, c-format +msgid "too many INTO variables specified" +msgstr "έχουν οριστεί πάρα πολλές παράμετροι ΙΝΤΟ" + +#: pl_gram.y:3745 +#, c-format +msgid "end label \"%s\" specified for unlabeled block" +msgstr "ετικέτα τέλους «%s» έχει καθοριστεί για μπλοκ χωρίς ετικέτα" + +#: pl_gram.y:3752 +#, c-format +msgid "end label \"%s\" differs from block's label \"%s\"" +msgstr "η ετικέτα τέλους «%s» διαφέρει από την ετικέτα «%s» του μπλοκ" + +#: pl_gram.y:3786 +#, c-format +msgid "cursor \"%s\" has no arguments" +msgstr "o δρομέας «%s» δεν έχει παραμέτρους" + +#: pl_gram.y:3800 +#, c-format +msgid "cursor \"%s\" has arguments" +msgstr "o δρομέας «%s» έχει παραμέτρους" + +#: pl_gram.y:3842 +#, c-format +msgid "cursor \"%s\" has no argument named \"%s\"" +msgstr "ο δρομέας «%s» δεν έχει παράμετρο με όνομα «%s»" + +#: pl_gram.y:3862 +#, c-format +msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" +msgstr "τιμή για την παράμετρο «%s» του δρομέα «%s» που καθορίζεται περισσότερες από μία φορές" + +#: pl_gram.y:3887 +#, c-format +msgid "not enough arguments for cursor \"%s\"" +msgstr "λείπουν παράμετροι για τον δρομέα «%s»" + +#: pl_gram.y:3894 +#, c-format +msgid "too many arguments for cursor \"%s\"" +msgstr "πάρα πολλές παράμετροι για δρομέα «%s»" + +#: pl_gram.y:3980 +msgid "unrecognized RAISE statement option" +msgstr "μη αναγνωρίσιμη επιλογή δήλωσης RAISE" + +#: pl_gram.y:3984 +msgid "syntax error, expected \"=\"" +msgstr "συντακτικό σφάλμα, αναμενόταν «=«" + +#: pl_gram.y:4025 +#, c-format +msgid "too many parameters specified for RAISE" +msgstr "έχουν οριστεί πάρα πολλές παράμετροι για RAISE" + +#: pl_gram.y:4029 +#, c-format +msgid "too few parameters specified for RAISE" +msgstr "έχουν οριστεί πολύ λίγες παράμετροι για RAISE" + +#: pl_handler.c:156 +msgid "Sets handling of conflicts between PL/pgSQL variable names and table column names." +msgstr "Ορίζει το χειρισμό των διενέξεων μεταξύ των ονομάτων μεταβλητών PL/pgSQL και των ονομάτων στηλών πίνακα." + +#: pl_handler.c:165 +msgid "Print information about parameters in the DETAIL part of the error messages generated on INTO ... STRICT failures." +msgstr "Εκτύπωσε πληροφορίες σχετικά με παραμέτρους στο τμήμα DETAIL των μηνυμάτων σφάλματος που δημιουργούνται από αποτυχίες INTO ... STRICT." + +#: pl_handler.c:173 +msgid "Perform checks given in ASSERT statements." +msgstr "Εκτέλεσε ελέγχους που δίνονται σε δηλώσεις ASSERT." + +#: pl_handler.c:181 +msgid "List of programming constructs that should produce a warning." +msgstr "Λίστα προγραμματιστικών κατασκευών που θα πρέπει να παράγουν μια προειδοποίηση." + +#: pl_handler.c:191 +msgid "List of programming constructs that should produce an error." +msgstr "Λίστα προγραμματιστικών κατασκευών που θα πρέπει να παράγουν ένα σφάλμα." + +#. translator: %s is typically the translation of "syntax error" +#: pl_scanner.c:508 +#, c-format +msgid "%s at end of input" +msgstr "«%s» στο τέλος εισόδου" + +#. translator: first %s is typically the translation of "syntax error" +#: pl_scanner.c:524 +#, c-format +msgid "%s at or near \"%s\"" +msgstr "%s σε ή κοντά σε «%s»" + +#~ msgid "query \"%s\" returned more than one row" +#~ msgstr "το ερώτημα «%s» επέστρεψε περισσότερες από μία γραμμές" diff --git a/src/pl/plpgsql/src/po/es.po b/src/pl/plpgsql/src/po/es.po index 49108de0c1..fa62286032 100644 --- a/src/pl/plpgsql/src/po/es.po +++ b/src/pl/plpgsql/src/po/es.po @@ -1,6 +1,6 @@ # Spanish message translation file for plpgsql # -# Copyright (c) 2008-2019, PostgreSQL Global Development Group +# Copyright (c) 2008-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Álvaro Herrera 2008-2013 @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: plpgsql (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-14 19:39+0000\n" -"PO-Revision-Date: 2021-05-25 12:04-0500\n" +"POT-Creation-Date: 2021-10-13 22:09+0000\n" +"PO-Revision-Date: 2021-10-14 10:18-0500\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -21,156 +21,156 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 2.4.3\n" +"X-Generator: BlackCAT 1.1\n" #: pl_comp.c:438 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "las funciones PL/pgSQL no pueden aceptar el tipo %s" -#: pl_comp.c:531 +#: pl_comp.c:530 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "no se pudo determinar el verdadero tipo de resultado para la función polimórfica «%s»" -#: pl_comp.c:561 +#: pl_comp.c:560 #, c-format msgid "trigger functions can only be called as triggers" msgstr "las funciones de disparador sólo pueden ser invocadas como disparadores" -#: pl_comp.c:565 pl_handler.c:480 +#: pl_comp.c:564 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "las funciones PL/pgSQL no pueden retornar el tipo %s" -#: pl_comp.c:605 +#: pl_comp.c:604 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "las funciones de disparador no pueden tener argumentos declarados" -#: pl_comp.c:606 +#: pl_comp.c:605 #, c-format msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." msgstr "Los argumentos del disparador pueden accederse usando TG_NARGS y TG_ARGV." -#: pl_comp.c:739 +#: pl_comp.c:738 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "las funciones de disparador por eventos no pueden tener argumentos declarados" -#: pl_comp.c:1003 +#: pl_comp.c:1002 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "compilación de la función PL/pgSQL «%s» cerca de la línea %d" -#: pl_comp.c:1026 +#: pl_comp.c:1025 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "el nombre de parámetro «%s» fue usado más de una vez" -#: pl_comp.c:1138 +#: pl_comp.c:1139 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "la referencia a la columna «%s» es ambigua" -#: pl_comp.c:1140 +#: pl_comp.c:1141 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Podría referirse tanto a una variable PL/pgSQL como a una columna de una tabla." -#: pl_comp.c:1323 pl_exec.c:5235 pl_exec.c:5408 pl_exec.c:5495 pl_exec.c:5586 -#: pl_exec.c:6566 +#: pl_comp.c:1324 pl_exec.c:5190 pl_exec.c:5363 pl_exec.c:5450 pl_exec.c:5541 +#: pl_exec.c:6562 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "el registro «%s» no tiene un campo «%s»" -#: pl_comp.c:1817 +#: pl_comp.c:1818 #, c-format msgid "relation \"%s\" does not exist" msgstr "no existe la relación «%s»" -#: pl_comp.c:1824 pl_comp.c:1866 +#: pl_comp.c:1825 pl_comp.c:1867 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "la relación «%s» no contiene un tipo compuesto" -#: pl_comp.c:1932 +#: pl_comp.c:1933 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "la variable «%s» tiene pseudotipo %s" -#: pl_comp.c:2121 +#: pl_comp.c:2122 #, c-format msgid "type \"%s\" is only a shell" msgstr "el tipo «%s» está inconcluso" -#: pl_comp.c:2203 pl_exec.c:6867 +#: pl_comp.c:2204 pl_exec.c:6863 #, c-format msgid "type %s is not composite" msgstr "el tipo %s no es compuesto" -#: pl_comp.c:2251 pl_comp.c:2304 +#: pl_comp.c:2252 pl_comp.c:2305 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "no se reconoce la condición de excepción «%s»" -#: pl_comp.c:2525 +#: pl_comp.c:2526 #, c-format msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "no se pudo determinar el verdadero tipo de argumento para la función polimórfica «%s»" -#: pl_exec.c:501 pl_exec.c:935 pl_exec.c:1170 +#: pl_exec.c:500 pl_exec.c:934 pl_exec.c:1169 msgid "during initialization of execution state" msgstr "durante la inicialización del estado de ejecución" -#: pl_exec.c:507 +#: pl_exec.c:506 msgid "while storing call arguments into local variables" msgstr "mientras se almacenaban los argumentos de invocación en variables locales" -#: pl_exec.c:595 pl_exec.c:1008 +#: pl_exec.c:594 pl_exec.c:1007 msgid "during function entry" msgstr "durante el ingreso a la función" -#: pl_exec.c:618 +#: pl_exec.c:617 #, c-format msgid "control reached end of function without RETURN" msgstr "la ejecución alcanzó el fin de la función sin encontrar RETURN" -#: pl_exec.c:624 +#: pl_exec.c:623 msgid "while casting return value to function's return type" msgstr "mientras se hacía la conversión del valor de retorno al tipo de retorno de la función" -#: pl_exec.c:637 pl_exec.c:3670 +#: pl_exec.c:636 pl_exec.c:3637 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "se llamó una función que retorna un conjunto en un contexto que no puede aceptarlo" -#: pl_exec.c:763 pl_exec.c:1034 pl_exec.c:1192 +#: pl_exec.c:762 pl_exec.c:1033 pl_exec.c:1191 msgid "during function exit" msgstr "durante la salida de la función" -#: pl_exec.c:818 pl_exec.c:882 pl_exec.c:3468 +#: pl_exec.c:817 pl_exec.c:881 pl_exec.c:3434 msgid "returned record type does not match expected record type" msgstr "el tipo de registro retornado no coincide con el tipo de registro esperado" -#: pl_exec.c:1031 pl_exec.c:1189 +#: pl_exec.c:1030 pl_exec.c:1188 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "la ejecución alcanzó el fin del procedimiento disparador sin encontrar RETURN" -#: pl_exec.c:1039 +#: pl_exec.c:1038 #, c-format msgid "trigger procedure cannot return a set" msgstr "los procedimientos disparadores no pueden retornar conjuntos" -#: pl_exec.c:1078 pl_exec.c:1106 +#: pl_exec.c:1077 pl_exec.c:1105 msgid "returned row structure does not match the structure of the triggering table" msgstr "la estructura de fila retornada no coincide con la estructura de la tabla que generó el evento de disparador" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1238 +#: pl_exec.c:1237 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "función PL/pgSQL %s en la línea %d %s" @@ -178,326 +178,331 @@ msgstr "función PL/pgSQL %s en la línea %d %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1249 +#: pl_exec.c:1248 #, c-format msgid "PL/pgSQL function %s %s" msgstr "función PL/pgSQL %s %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1257 +#: pl_exec.c:1256 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "función PL/pgSQL %s en la línea %d en %s" -#: pl_exec.c:1263 +#: pl_exec.c:1262 #, c-format msgid "PL/pgSQL function %s" msgstr "función PL/pgSQL %s" -#: pl_exec.c:1634 +#: pl_exec.c:1633 msgid "during statement block local variable initialization" msgstr "durante inicialización de variables locales en el bloque de sentencias" -#: pl_exec.c:1732 +#: pl_exec.c:1731 msgid "during statement block entry" msgstr "durante la entrada al bloque de sentencias" -#: pl_exec.c:1764 +#: pl_exec.c:1763 msgid "during statement block exit" msgstr "durante la salida del bloque de sentencias" -#: pl_exec.c:1802 +#: pl_exec.c:1801 msgid "during exception cleanup" msgstr "durante la finalización por excepción" -#: pl_exec.c:2369 +#: pl_exec.c:2334 #, c-format msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" msgstr "el parámetro de procedimiento «%s» es un parámetro de salida pero el argumento correspondiente no es escribible" -#: pl_exec.c:2374 +#: pl_exec.c:2339 #, c-format msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" msgstr "el parámetro de procedimiento %d es un parámetro de salida pero el argumento correspondiente no es escribible" -#: pl_exec.c:2407 +#: pl_exec.c:2373 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS no puede ser usado fuera de un manejador de excepción" -#: pl_exec.c:2607 +#: pl_exec.c:2573 #, c-format msgid "case not found" msgstr "caso no encontrado" -#: pl_exec.c:2608 +#: pl_exec.c:2574 #, c-format msgid "CASE statement is missing ELSE part." msgstr "A la sentencia CASE le falta la parte ELSE." -#: pl_exec.c:2701 +#: pl_exec.c:2667 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "el límite inferior de un ciclo FOR no puede ser null" -#: pl_exec.c:2717 +#: pl_exec.c:2683 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "el límite superior de un ciclo FOR no puede ser null" -#: pl_exec.c:2735 +#: pl_exec.c:2701 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "el valor BY de un ciclo FOR no puede ser null" -#: pl_exec.c:2741 +#: pl_exec.c:2707 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "el valor BY de un ciclo FOR debe ser mayor que cero" -#: pl_exec.c:2875 pl_exec.c:4640 +#: pl_exec.c:2841 pl_exec.c:4626 #, c-format msgid "cursor \"%s\" already in use" msgstr "el cursor «%s» ya está en uso" -#: pl_exec.c:2898 pl_exec.c:4705 +#: pl_exec.c:2864 pl_exec.c:4691 #, c-format msgid "arguments given for cursor without arguments" msgstr "se dieron argumentos a un cursor sin argumentos" -#: pl_exec.c:2917 pl_exec.c:4724 +#: pl_exec.c:2883 pl_exec.c:4710 #, c-format msgid "arguments required for cursor" msgstr "se requieren argumentos para el cursor" -#: pl_exec.c:3004 +#: pl_exec.c:2970 #, c-format msgid "FOREACH expression must not be null" msgstr "la expresión FOREACH no debe ser nula" -#: pl_exec.c:3019 +#: pl_exec.c:2985 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "una expresión FOREACH debe retornar un array, no tipo %s" -#: pl_exec.c:3036 +#: pl_exec.c:3002 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "la dimensión del slice (%d) está fuera de rango 0..%d" -#: pl_exec.c:3063 +#: pl_exec.c:3029 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "las variables de bucles FOREACH ... SLICE deben ser de un tipo array" -#: pl_exec.c:3067 +#: pl_exec.c:3033 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "la variable de bucle FOREACH no debe ser de tipo array" -#: pl_exec.c:3229 pl_exec.c:3286 pl_exec.c:3461 +#: pl_exec.c:3195 pl_exec.c:3252 pl_exec.c:3427 #, c-format msgid "cannot return non-composite value from function returning composite type" msgstr "no se puede retornar un valor no-compuesto desde una función que retorne tipos compuestos" -#: pl_exec.c:3325 pl_gram.y:3344 +#: pl_exec.c:3291 pl_gram.y:3310 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "no se puede usar RETURN NEXT en una función que no es SETOF" -#: pl_exec.c:3366 pl_exec.c:3498 +#: pl_exec.c:3332 pl_exec.c:3464 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "se pasó un tipo incorrecto de resultado a RETURN NEXT" -#: pl_exec.c:3404 pl_exec.c:3425 +#: pl_exec.c:3370 pl_exec.c:3391 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "se pasó un tipo de registro incorrecto a RETURN NEXT" -#: pl_exec.c:3517 +#: pl_exec.c:3483 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT debe tener un parámetro" -#: pl_exec.c:3545 pl_gram.y:3408 +#: pl_exec.c:3511 pl_gram.y:3374 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "no se puede usar RETURN QUERY en una función que no ha sido declarada SETOF" -#: pl_exec.c:3563 +#: pl_exec.c:3529 msgid "structure of query does not match function result type" msgstr "la estructura de la consulta no coincide con el tipo del resultado de la función" -#: pl_exec.c:3596 pl_exec.c:5792 -#, c-format -msgid "query \"%s\" is not a SELECT" -msgstr "la consulta «%s» no es una orden SELECT" - -#: pl_exec.c:3618 pl_exec.c:4418 pl_exec.c:8603 +#: pl_exec.c:3584 pl_exec.c:4404 pl_exec.c:8604 #, c-format msgid "query string argument of EXECUTE is null" msgstr "el argumento de consulta a ejecutar en EXECUTE es null" -#: pl_exec.c:3698 pl_exec.c:3836 +#: pl_exec.c:3665 pl_exec.c:3803 #, c-format msgid "RAISE option already specified: %s" msgstr "la opción de RAISE ya se especificó: %s" -#: pl_exec.c:3732 +#: pl_exec.c:3699 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "RAISE sin parámetros no puede ser usado fuera de un manejador de excepción" -#: pl_exec.c:3826 +#: pl_exec.c:3793 #, c-format msgid "RAISE statement option cannot be null" msgstr "la opción de sentencia en RAISE no puede ser null" -#: pl_exec.c:3896 +#: pl_exec.c:3863 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3951 +#: pl_exec.c:3918 #, c-format msgid "assertion failed" msgstr "aseveración falló" -#: pl_exec.c:4291 pl_exec.c:4479 +#: pl_exec.c:4277 pl_exec.c:4465 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "no se puede ejecutar COPY desde/a un cliente en PL/pgSQL" -#: pl_exec.c:4297 +#: pl_exec.c:4283 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "orden de transacción no soportada en PL/pgSQL" -#: pl_exec.c:4320 pl_exec.c:4508 +#: pl_exec.c:4306 pl_exec.c:4494 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO es utilizado con una orden que no puede retornar datos" -#: pl_exec.c:4343 pl_exec.c:4531 +#: pl_exec.c:4329 pl_exec.c:4517 #, c-format msgid "query returned no rows" msgstr "la consulta no regresó filas" -#: pl_exec.c:4365 pl_exec.c:4550 +#: pl_exec.c:4351 pl_exec.c:4536 pl_exec.c:5685 #, c-format msgid "query returned more than one row" msgstr "la consulta regresó más de una fila" -#: pl_exec.c:4367 +#: pl_exec.c:4353 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "Asegúrese que la consulta retorne una única fila, o use LIMIT 1." -#: pl_exec.c:4383 +#: pl_exec.c:4369 #, c-format msgid "query has no destination for result data" msgstr "la consulta no tiene un destino para los datos de resultado" -#: pl_exec.c:4384 +#: pl_exec.c:4370 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "Si quiere descartar los resultados de un SELECT, utilice PERFORM." -#: pl_exec.c:4471 +#: pl_exec.c:4457 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "no está implementado EXECUTE de un SELECT ... INTO" -#: pl_exec.c:4472 +#: pl_exec.c:4458 #, c-format msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." msgstr "Puede desear usar EXECUTE ... INTO o EXECUTE CREATE TABLE ... AS en su lugar." -#: pl_exec.c:4485 +#: pl_exec.c:4471 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "no está implementado EXECUTE de órdenes de transacción" -#: pl_exec.c:4786 pl_exec.c:4874 +#: pl_exec.c:4772 pl_exec.c:4860 #, c-format msgid "cursor variable \"%s\" is null" msgstr "variable cursor «%s» es null" -#: pl_exec.c:4797 pl_exec.c:4885 +#: pl_exec.c:4783 pl_exec.c:4871 #, c-format msgid "cursor \"%s\" does not exist" msgstr "no existe el cursor «%s»" -#: pl_exec.c:4810 +#: pl_exec.c:4796 #, c-format msgid "relative or absolute cursor position is null" msgstr "la posición relativa o absoluta del cursor es null" -#: pl_exec.c:5085 pl_exec.c:5180 +#: pl_exec.c:5040 pl_exec.c:5135 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "no puede asignarse un valor null a la variable «%s» que fue declarada NOT NULL" -#: pl_exec.c:5161 +#: pl_exec.c:5116 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "no se puede asignar un valor no compuesto a una variable de tipo row" -#: pl_exec.c:5193 +#: pl_exec.c:5148 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "no se puede asignar un valor no compuesto a una variable de tipo record" -#: pl_exec.c:5244 +#: pl_exec.c:5199 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "no se puede asignar a la columna de sistema «%s»" -#: pl_exec.c:5693 +#: pl_exec.c:5648 +#, c-format +msgid "query did not return data" +msgstr "la consulta no retornó datos" + +#: pl_exec.c:5649 pl_exec.c:5661 pl_exec.c:5686 pl_exec.c:5762 pl_exec.c:5767 #, c-format -msgid "query \"%s\" did not return data" -msgstr "la consulta «%s» no retornó datos" +msgid "query: %s" +msgstr "consulta: %s" -#: pl_exec.c:5701 +#: pl_exec.c:5657 #, c-format -msgid "query \"%s\" returned %d column" -msgid_plural "query \"%s\" returned %d columns" -msgstr[0] "la consulta «%s» retornó %d columna" -msgstr[1] "la consulta «%s» retornó %d columnas" +msgid "query returned %d column" +msgid_plural "query returned %d columns" +msgstr[0] "la consulta retornó %d columna" +msgstr[1] "la consulta retornó %d columnas" -#: pl_exec.c:5729 +#: pl_exec.c:5761 #, c-format -msgid "query \"%s\" returned more than one row" -msgstr "la consulta «%s» retornó más de una fila" +msgid "query is SELECT INTO, but it should be plain SELECT" +msgstr "la consulta es SELECT INTO, pero debería ser un SELECT simple" -#: pl_exec.c:6580 pl_exec.c:6620 pl_exec.c:6660 +#: pl_exec.c:5766 +#, c-format +msgid "query is not a SELECT" +msgstr "la consulta no es un SELECT" + +#: pl_exec.c:6576 pl_exec.c:6616 pl_exec.c:6656 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "el tipo del parámetro %d (%s) no coincide aquel con que fue preparado el plan (%s)" -#: pl_exec.c:7071 pl_exec.c:7105 pl_exec.c:7179 pl_exec.c:7205 +#: pl_exec.c:7067 pl_exec.c:7101 pl_exec.c:7175 pl_exec.c:7201 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "no coincide el número de campos de origen y destino en la asignación" #. translator: %s represents a name of an extra check -#: pl_exec.c:7073 pl_exec.c:7107 pl_exec.c:7181 pl_exec.c:7207 +#: pl_exec.c:7069 pl_exec.c:7103 pl_exec.c:7177 pl_exec.c:7203 #, c-format msgid "%s check of %s is active." msgstr "El chequeo %s de %s está activo." -#: pl_exec.c:7077 pl_exec.c:7111 pl_exec.c:7185 pl_exec.c:7211 +#: pl_exec.c:7073 pl_exec.c:7107 pl_exec.c:7181 pl_exec.c:7207 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "Asegúrese que la consulta retorna la lista exacta de columnas." -#: pl_exec.c:7598 +#: pl_exec.c:7594 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "el registro «%s» no ha sido asignado aún" -#: pl_exec.c:7599 +#: pl_exec.c:7595 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "La estructura de fila de un registro aún no asignado no está determinado." @@ -534,280 +539,280 @@ msgstr "sentencia SQL" msgid "FOR over EXECUTE statement" msgstr "bucle FOR en torno a una sentencia EXECUTE" -#: pl_gram.y:487 +#: pl_gram.y:485 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "etiqueta de bloque debe estar antes de DECLARE, no después" -#: pl_gram.y:507 +#: pl_gram.y:505 #, c-format msgid "collations are not supported by type %s" msgstr "los ordenamientos (collation) no están soportados por el tipo %s" -#: pl_gram.y:526 +#: pl_gram.y:524 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "la variable «%s» debe tener valor por omisión, puesto que está declarado NOT NULL" -#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 +#: pl_gram.y:672 pl_gram.y:687 pl_gram.y:713 #, c-format msgid "variable \"%s\" does not exist" msgstr "no existe la variable «%s»" -#: pl_gram.y:733 pl_gram.y:761 +#: pl_gram.y:731 pl_gram.y:759 msgid "duplicate declaration" msgstr "declaración duplicada" -#: pl_gram.y:744 pl_gram.y:772 +#: pl_gram.y:742 pl_gram.y:770 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "la variable «%s» oculta una variable definida anteriormente" -#: pl_gram.y:1046 +#: pl_gram.y:1042 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "elemento de diagnóstico %s no se permite en GET STACKED DIAGNOSTICS" -#: pl_gram.y:1064 +#: pl_gram.y:1060 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "elemento de diagnóstico %s no se permite en GET STACKED DIAGNOSTICS" -#: pl_gram.y:1159 +#: pl_gram.y:1155 msgid "unrecognized GET DIAGNOSTICS item" msgstr "elemento de GET DIAGNOSTICS no reconocido" -#: pl_gram.y:1175 pl_gram.y:3583 +#: pl_gram.y:1171 pl_gram.y:3549 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "«%s» no es una variable escalar" -#: pl_gram.y:1405 pl_gram.y:1599 +#: pl_gram.y:1401 pl_gram.y:1595 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "la variable de bucle de un bucle sobre filas debe ser una variable de tipo record o una lista de variables escalares" -#: pl_gram.y:1440 +#: pl_gram.y:1436 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "un bucle FOR de un cursor debe tener sólo una variable de destino" -#: pl_gram.y:1447 +#: pl_gram.y:1443 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "un bucle FOR en torno a un cursor debe usar un cursor enlazado (bound)" -#: pl_gram.y:1538 +#: pl_gram.y:1534 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "un bucle FOR de un número entero debe tener sólo una variable de destino" -#: pl_gram.y:1572 +#: pl_gram.y:1568 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "no se puede especificar REVERSE en un bucle FOR de una consulta" -#: pl_gram.y:1702 +#: pl_gram.y:1698 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "la variable de bucle de FOREACH debe ser una variable conocida o una lista de variables conocidas" -#: pl_gram.y:1744 +#: pl_gram.y:1740 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "ningún bloque o bucle que contenga esta sentencia tiene una etiqueta «%s»" -#: pl_gram.y:1752 +#: pl_gram.y:1748 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "la etiqueta de bloque «%s» no puede usarse en CONTINUE" -#: pl_gram.y:1767 +#: pl_gram.y:1763 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT no puede usarse fuera de un bucle, a menos que tenga una etiqueta" -#: pl_gram.y:1768 +#: pl_gram.y:1764 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE no puede usarse fuera de un bucle" -#: pl_gram.y:1792 pl_gram.y:1830 pl_gram.y:1878 pl_gram.y:3032 pl_gram.y:3118 -#: pl_gram.y:3229 pl_gram.y:3982 +#: pl_gram.y:1788 pl_gram.y:1826 pl_gram.y:1874 pl_gram.y:2998 pl_gram.y:3084 +#: pl_gram.y:3195 pl_gram.y:3948 msgid "unexpected end of function definition" msgstr "fin inesperado de la definición de la función" -#: pl_gram.y:1898 pl_gram.y:1922 pl_gram.y:1938 pl_gram.y:1944 pl_gram.y:2065 -#: pl_gram.y:2073 pl_gram.y:2087 pl_gram.y:2182 pl_gram.y:2434 pl_gram.y:2524 -#: pl_gram.y:2683 pl_gram.y:3825 pl_gram.y:3886 pl_gram.y:3963 +#: pl_gram.y:1894 pl_gram.y:1918 pl_gram.y:1934 pl_gram.y:1940 pl_gram.y:2061 +#: pl_gram.y:2069 pl_gram.y:2083 pl_gram.y:2178 pl_gram.y:2402 pl_gram.y:2492 +#: pl_gram.y:2649 pl_gram.y:3791 pl_gram.y:3852 pl_gram.y:3929 msgid "syntax error" msgstr "error de sintaxis" -#: pl_gram.y:1926 pl_gram.y:1928 pl_gram.y:2438 pl_gram.y:2440 +#: pl_gram.y:1922 pl_gram.y:1924 pl_gram.y:2406 pl_gram.y:2408 msgid "invalid SQLSTATE code" msgstr "código SQLSTATE no válido" -#: pl_gram.y:2130 +#: pl_gram.y:2126 msgid "syntax error, expected \"FOR\"" msgstr "error de sintaxis, se esperaba «FOR»" -#: pl_gram.y:2191 +#: pl_gram.y:2187 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "la sentencia FETCH no puede retornar múltiples filas" -#: pl_gram.y:2316 +#: pl_gram.y:2284 #, c-format msgid "cursor variable must be a simple variable" msgstr "variable de cursor debe ser una variable simple" -#: pl_gram.y:2322 +#: pl_gram.y:2290 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "la variable «%s» debe ser de tipo cursor o refcursor" -#: pl_gram.y:2654 pl_gram.y:2665 +#: pl_gram.y:2620 pl_gram.y:2631 #, c-format msgid "\"%s\" is not a known variable" msgstr "«%s» no es una variable conocida" -#: pl_gram.y:2771 pl_gram.y:2781 pl_gram.y:2937 +#: pl_gram.y:2737 pl_gram.y:2747 pl_gram.y:2903 msgid "mismatched parentheses" msgstr "no coinciden los paréntesis" -#: pl_gram.y:2785 +#: pl_gram.y:2751 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "falta «%s» al final de la expresión SQL" -#: pl_gram.y:2791 +#: pl_gram.y:2757 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "falta «%s» al final de la sentencia SQL" -#: pl_gram.y:2808 +#: pl_gram.y:2774 msgid "missing expression" msgstr "expresión faltante" -#: pl_gram.y:2810 +#: pl_gram.y:2776 msgid "missing SQL statement" msgstr "sentencia SQL faltante" -#: pl_gram.y:2939 +#: pl_gram.y:2905 msgid "incomplete data type declaration" msgstr "declaración de tipo de dato incompleta" -#: pl_gram.y:2962 +#: pl_gram.y:2928 msgid "missing data type declaration" msgstr "declaración de tipo de dato faltante" -#: pl_gram.y:3040 +#: pl_gram.y:3006 msgid "INTO specified more than once" msgstr "INTO fue especificado más de una vez" -#: pl_gram.y:3210 +#: pl_gram.y:3176 msgid "expected FROM or IN" msgstr "se espera FROM o IN" -#: pl_gram.y:3271 +#: pl_gram.y:3237 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "RETURN no puede tener un parámetro en una función que retorna un conjunto" -#: pl_gram.y:3272 +#: pl_gram.y:3238 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Use RETURN NEXT o RETURN QUERY." -#: pl_gram.y:3282 +#: pl_gram.y:3248 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "RETURN no puede tener un parámetro un procedimiento" -#: pl_gram.y:3287 +#: pl_gram.y:3253 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "RETURN no puede tener parámetro en una función que retorna void" -#: pl_gram.y:3296 +#: pl_gram.y:3262 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN no puede tener parámetros en una función con parámetros OUT" -#: pl_gram.y:3359 +#: pl_gram.y:3325 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "RETURN NEXT no puede tener parámetros en una función con parámetros OUT" -#: pl_gram.y:3467 +#: pl_gram.y:3433 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "la variable «%s» esta declarada como CONSTANT" -#: pl_gram.y:3525 +#: pl_gram.y:3491 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "una variable de tipo record no puede ser parte de una lista INTO de múltiples elementos" -#: pl_gram.y:3571 +#: pl_gram.y:3537 #, c-format msgid "too many INTO variables specified" msgstr "se especificaron demasiadas variables INTO" -#: pl_gram.y:3779 +#: pl_gram.y:3745 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "etiqueta de término «%s» especificada para un bloque sin etiqueta" -#: pl_gram.y:3786 +#: pl_gram.y:3752 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "etiqueta de término «%s» difiere de la etiqueta de bloque «%s»" -#: pl_gram.y:3820 +#: pl_gram.y:3786 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "el cursor «%s» no tiene argumentos" -#: pl_gram.y:3834 +#: pl_gram.y:3800 #, c-format msgid "cursor \"%s\" has arguments" msgstr "el cursor «%s» tiene argumentos" -#: pl_gram.y:3876 +#: pl_gram.y:3842 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "el cursor «%s» no tiene un argumento llamado «%s»" -#: pl_gram.y:3896 +#: pl_gram.y:3862 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "el valor para el parámetro «%s» del cursor «%s» fue especificado más de una vez" -#: pl_gram.y:3921 +#: pl_gram.y:3887 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "no hay suficientes argumentos para el cursor «%s»" -#: pl_gram.y:3928 +#: pl_gram.y:3894 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "demasiados argumentos para el cursor «%s»" -#: pl_gram.y:4014 +#: pl_gram.y:3980 msgid "unrecognized RAISE statement option" msgstr "no se reconoce la opción de sentencia RAISE" -#: pl_gram.y:4018 +#: pl_gram.y:3984 msgid "syntax error, expected \"=\"" msgstr "error de sintaxis, se esperaba «=»" -#: pl_gram.y:4059 +#: pl_gram.y:4025 #, c-format msgid "too many parameters specified for RAISE" msgstr "se especificaron demasiados parámetros a RAISE" -#: pl_gram.y:4063 +#: pl_gram.y:4029 #, c-format msgid "too few parameters specified for RAISE" msgstr "se especificaron muy pocos parámetros a RAISE" @@ -844,11 +849,14 @@ msgstr "%s al final de la entrada" msgid "%s at or near \"%s\"" msgstr "%s en o cerca de «%s»" -#~ msgid "array subscript in assignment must not be null" -#~ msgstr "subíndice de array en asignación no puede ser null" +#~ msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +#~ msgstr "el número de dimensiones del array (%d) excede el máximo permitido (%d)" #~ msgid "subscripted object is not an array" #~ msgstr "el objeto al que se le puso un subíndice no es un array" -#~ msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -#~ msgstr "el número de dimensiones del array (%d) excede el máximo permitido (%d)" +#~ msgid "array subscript in assignment must not be null" +#~ msgstr "subíndice de array en asignación no puede ser null" + +#~ msgid "query \"%s\" returned more than one row" +#~ msgstr "la consulta «%s» retornó más de una fila" diff --git a/src/pl/plpgsql/src/po/fr.po b/src/pl/plpgsql/src/po/fr.po index e797c24f92..19676ff681 100644 --- a/src/pl/plpgsql/src/po/fr.po +++ b/src/pl/plpgsql/src/po/fr.po @@ -1,15 +1,17 @@ -# translation of plpgsql.po to fr_fr -# french message translation file for plpgsql +# LANGUAGE message translation file for plpgsql +# Copyright (C) 2009-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the plpgsql (PostgreSQL) package. # # Use these quotes: « %s » -# Guillaume Lelarge , 2009. +# +# Guillaume Lelarge , 2009-2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-15 01:39+0000\n" -"PO-Revision-Date: 2021-04-15 08:43+0200\n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -17,156 +19,161 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 3.0.1\n" #: pl_comp.c:438 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "les fonctions PL/pgSQL ne peuvent pas accepter le type %s" -#: pl_comp.c:531 +#: pl_comp.c:530 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "n'a pas pu déterminer le type de retour pour la fonction polymorphique « %s »" -#: pl_comp.c:561 +#: pl_comp.c:560 #, c-format msgid "trigger functions can only be called as triggers" -msgstr "les fonctions triggers peuvent seulement être appelées par des triggers" +msgstr "les fonctions trigger peuvent seulement être appelées par des triggers" -#: pl_comp.c:565 pl_handler.c:480 +#: pl_comp.c:564 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "les fonctions PL/pgSQL ne peuvent pas renvoyer le type %s" -#: pl_comp.c:605 +#: pl_comp.c:604 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "les fonctions triggers ne peuvent pas avoir d'arguments déclarés" -#: pl_comp.c:606 +#: pl_comp.c:605 #, c-format msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." msgstr "À la place, on peut accéder aux arguments du trigger par TG_NARGS et TG_ARGV." -#: pl_comp.c:739 +#: pl_comp.c:738 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "les fonctions triggers sur événement ne peuvent pas avoir des arguments déclarés" -#: pl_comp.c:1003 +#: pl_comp.c:1002 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "compilation de la fonction PL/pgSQL « %s » près de la ligne %d" -#: pl_comp.c:1026 +#: pl_comp.c:1025 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "le nom du paramètre « %s » est utilisé plus d'une fois" -#: pl_comp.c:1138 +#: pl_comp.c:1139 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "la référence à la colonne « %s » est ambigüe" -#: pl_comp.c:1140 +#: pl_comp.c:1141 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Cela pourrait faire référence à une variable PL/pgSQL ou à la colonne d'une table." -#: pl_comp.c:1323 pl_exec.c:5235 pl_exec.c:5408 pl_exec.c:5495 pl_exec.c:5586 -#: pl_exec.c:6566 +#: pl_comp.c:1324 pl_exec.c:5216 pl_exec.c:5389 pl_exec.c:5476 pl_exec.c:5567 +#: pl_exec.c:6588 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "l'enregistrement « %s » n'a pas de champs « %s »" -#: pl_comp.c:1817 +#: pl_comp.c:1818 #, c-format msgid "relation \"%s\" does not exist" msgstr "la relation « %s » n'existe pas" -#: pl_comp.c:1824 pl_comp.c:1866 +#: pl_comp.c:1825 pl_comp.c:1867 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "la relation « %s » n'a pas un type composite" -#: pl_comp.c:1932 +#: pl_comp.c:1933 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "la variable « %s » a le pseudo-type %s" -#: pl_comp.c:2121 +#: pl_comp.c:2122 #, c-format msgid "type \"%s\" is only a shell" msgstr "le type « %s » n'est qu'une coquille" -#: pl_comp.c:2203 pl_exec.c:6867 +#: pl_comp.c:2204 pl_exec.c:6889 #, c-format msgid "type %s is not composite" msgstr "le type %s n'est pas un type composite" -#: pl_comp.c:2251 pl_comp.c:2304 +#: pl_comp.c:2252 pl_comp.c:2305 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "condition d'exception non reconnue « %s »" -#: pl_comp.c:2525 +#: pl_comp.c:2526 #, c-format msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "n'a pas pu déterminer le type d'argument pour la fonction polymorphique « %s »" -#: pl_exec.c:501 pl_exec.c:935 pl_exec.c:1170 +#: pl_exec.c:500 pl_exec.c:939 pl_exec.c:1174 msgid "during initialization of execution state" msgstr "durant l'initialisation de l'état de la fonction" -#: pl_exec.c:507 +#: pl_exec.c:506 msgid "while storing call arguments into local variables" msgstr "lors du stockage des arguments dans les variables locales" -#: pl_exec.c:595 pl_exec.c:1008 +#: pl_exec.c:594 pl_exec.c:1012 msgid "during function entry" msgstr "durant l'entrée d'une fonction" -#: pl_exec.c:618 +#: pl_exec.c:617 #, c-format msgid "control reached end of function without RETURN" msgstr "le contrôle a atteint la fin de la fonction sans RETURN" -#: pl_exec.c:624 +#: pl_exec.c:623 msgid "while casting return value to function's return type" msgstr "lors de la conversion de la valeur de retour au type de retour de la fonction" -#: pl_exec.c:637 pl_exec.c:3670 +#: pl_exec.c:635 pl_exec.c:3656 #, c-format msgid "set-valued function called in context that cannot accept a set" -msgstr "fonction renvoyant un ensemble appelée dans un contexte qui ne peut pas accepter un ensemble" +msgstr "la fonction renvoyant un ensemble a été appelée dans un contexte qui n'accepte pas un ensemble" -#: pl_exec.c:763 pl_exec.c:1034 pl_exec.c:1192 +#: pl_exec.c:640 pl_exec.c:3662 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "mode matérialisé requis mais interdit dans ce contexte" + +#: pl_exec.c:767 pl_exec.c:1038 pl_exec.c:1196 msgid "during function exit" msgstr "lors de la sortie de la fonction" -#: pl_exec.c:818 pl_exec.c:882 pl_exec.c:3468 +#: pl_exec.c:822 pl_exec.c:886 pl_exec.c:3455 msgid "returned record type does not match expected record type" msgstr "le type d'enregistrement renvoyé ne correspond pas au type d'enregistrement attendu" -#: pl_exec.c:1031 pl_exec.c:1189 +#: pl_exec.c:1035 pl_exec.c:1193 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "le contrôle a atteint la fin de la procédure trigger sans RETURN" -#: pl_exec.c:1039 +#: pl_exec.c:1043 #, c-format msgid "trigger procedure cannot return a set" msgstr "une procédure trigger ne peut pas renvoyer un ensemble" -#: pl_exec.c:1078 pl_exec.c:1106 +#: pl_exec.c:1082 pl_exec.c:1110 msgid "returned row structure does not match the structure of the triggering table" msgstr "la structure de ligne renvoyée ne correspond pas à la structure de la table du trigger" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1238 +#: pl_exec.c:1251 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "fonction PL/pgSQL %s, ligne %d, %s" @@ -174,49 +181,49 @@ msgstr "fonction PL/pgSQL %s, ligne %d, %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1249 +#: pl_exec.c:1262 #, c-format msgid "PL/pgSQL function %s %s" msgstr "fonction PL/pgSQL %s, %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1257 +#: pl_exec.c:1270 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "fonction PL/pgSQL %s, ligne %d à %s" -#: pl_exec.c:1263 +#: pl_exec.c:1276 #, c-format msgid "PL/pgSQL function %s" msgstr "fonction PL/pgSQL %s" -#: pl_exec.c:1634 +#: pl_exec.c:1647 msgid "during statement block local variable initialization" msgstr "lors de l'initialisation des variables locales du bloc d'instructions" -#: pl_exec.c:1732 +#: pl_exec.c:1752 msgid "during statement block entry" msgstr "lors de l'entrée dans le bloc d'instructions" -#: pl_exec.c:1764 +#: pl_exec.c:1784 msgid "during statement block exit" msgstr "lors de la sortie du bloc d'instructions" -#: pl_exec.c:1802 +#: pl_exec.c:1822 msgid "during exception cleanup" msgstr "lors du nettoyage de l'exception" -#: pl_exec.c:2369 +#: pl_exec.c:2355 #, c-format msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" msgstr "le paramètre de la procédure « %s » est un argument en sortie mais l'argument correspondant n'est pas modifiable" -#: pl_exec.c:2374 +#: pl_exec.c:2360 #, c-format msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" msgstr "le paramètre de la procédure %d est un paramètre en sortie mais l'argument correspondant n'est pas modifiable" -#: pl_exec.c:2407 +#: pl_exec.c:2394 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS ne peut pas être utilisé à l'extérieur d'un gestionnaire d'exception" @@ -227,279 +234,284 @@ msgstr "GET STACKED DIAGNOSTICS ne peut pas être utilisé à l'extérieur d'un # (errcode(ERRCODE_CASE_NOT_FOUND), # errmsg("case not found"), # errhint("CASE statement is missing ELSE part."))); -#: pl_exec.c:2607 +#: pl_exec.c:2594 #, c-format msgid "case not found" msgstr "cas introuvable" -#: pl_exec.c:2608 +#: pl_exec.c:2595 #, c-format msgid "CASE statement is missing ELSE part." msgstr "l'instruction CASE n'a pas de partie ELSE." -#: pl_exec.c:2701 +#: pl_exec.c:2688 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "la limite inférieure d'une boucle FOR ne peut pas être NULL" -#: pl_exec.c:2717 +#: pl_exec.c:2704 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "la limite supérieure de la boucle FOR ne peut pas être NULL" -#: pl_exec.c:2735 +#: pl_exec.c:2722 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "la valeur BY d'une boucle FOR ne peut pas être NULL" -#: pl_exec.c:2741 +#: pl_exec.c:2728 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "la valeur BY d'une boucle FOR doit être plus grande que zéro" -#: pl_exec.c:2875 pl_exec.c:4640 +#: pl_exec.c:2862 pl_exec.c:4658 #, c-format msgid "cursor \"%s\" already in use" msgstr "curseur « %s » déjà en cours d'utilisation" -#: pl_exec.c:2898 pl_exec.c:4705 +#: pl_exec.c:2885 pl_exec.c:4723 #, c-format msgid "arguments given for cursor without arguments" msgstr "arguments fournis pour un curseur sans argument" -#: pl_exec.c:2917 pl_exec.c:4724 +#: pl_exec.c:2904 pl_exec.c:4742 #, c-format msgid "arguments required for cursor" msgstr "arguments requis pour le curseur" -#: pl_exec.c:3004 +#: pl_exec.c:2991 #, c-format msgid "FOREACH expression must not be null" msgstr "l'expression FOREACH ne doit pas être NULL" -#: pl_exec.c:3019 +#: pl_exec.c:3006 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "l'expression FOREACH doit renvoyer un tableau, pas un type %s" -#: pl_exec.c:3036 +#: pl_exec.c:3023 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "la dimension de la partie (%d) est en dehors des valeurs valides (0..%d)" -#: pl_exec.c:3063 +#: pl_exec.c:3050 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "la variable d'une boucle FOREACH ... SLICE doit être d'un type tableau" -#: pl_exec.c:3067 +#: pl_exec.c:3054 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "la valeur d'une boucle FOREACH ne doit pas être de type tableau" -#: pl_exec.c:3229 pl_exec.c:3286 pl_exec.c:3461 +#: pl_exec.c:3216 pl_exec.c:3273 pl_exec.c:3448 #, c-format msgid "cannot return non-composite value from function returning composite type" msgstr "ne peut pas renvoyer de valeurs non composites à partir d'une fonction renvoyant un type composite" -#: pl_exec.c:3325 pl_gram.y:3344 +#: pl_exec.c:3312 pl_gram.y:3318 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "ne peut pas utiliser RETURN NEXT dans une fonction non SETOF" -#: pl_exec.c:3366 pl_exec.c:3498 +#: pl_exec.c:3353 pl_exec.c:3485 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "mauvais type de résultat fourni dans RETURN NEXT" -#: pl_exec.c:3404 pl_exec.c:3425 +#: pl_exec.c:3391 pl_exec.c:3412 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "mauvais type d'enregistrement fourni à RETURN NEXT" -#: pl_exec.c:3517 +#: pl_exec.c:3504 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT doit avoir un paramètre" -#: pl_exec.c:3545 pl_gram.y:3408 +#: pl_exec.c:3532 pl_gram.y:3382 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "ne peut pas utiliser RETURN QUERY dans une fonction non SETOF" -#: pl_exec.c:3563 +#: pl_exec.c:3550 msgid "structure of query does not match function result type" msgstr "la structure de la requête ne correspond pas au type de résultat de la fonction" -#: pl_exec.c:3596 pl_exec.c:5792 -#, c-format -msgid "query \"%s\" is not a SELECT" -msgstr "la requête « %s » n'est pas un SELECT" - -#: pl_exec.c:3618 pl_exec.c:4418 pl_exec.c:8603 +#: pl_exec.c:3605 pl_exec.c:4435 pl_exec.c:8630 #, c-format msgid "query string argument of EXECUTE is null" msgstr "l'argument de la requête d'EXECUTE est NULL" -#: pl_exec.c:3698 pl_exec.c:3836 +#: pl_exec.c:3690 pl_exec.c:3828 #, c-format msgid "RAISE option already specified: %s" msgstr "option RAISE déjà spécifiée : %s" -#: pl_exec.c:3732 +#: pl_exec.c:3724 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "RAISE sans paramètre ne peut pas être utilisé sans un gestionnaire d'exceptions" -#: pl_exec.c:3826 +#: pl_exec.c:3818 #, c-format msgid "RAISE statement option cannot be null" msgstr "l'option de l'instruction RAISE ne peut pas être NULL" -#: pl_exec.c:3896 +#: pl_exec.c:3888 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3951 +#: pl_exec.c:3943 #, c-format msgid "assertion failed" msgstr "échec de l'assertion" -#: pl_exec.c:4291 pl_exec.c:4479 +#: pl_exec.c:4308 pl_exec.c:4497 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "ne peut pas utiliser COPY vers/depuis un client en PL/pgSQL" -#: pl_exec.c:4297 +#: pl_exec.c:4314 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "commande de transaction non supportée dans PL/pgSQL" -#: pl_exec.c:4320 pl_exec.c:4508 +#: pl_exec.c:4337 pl_exec.c:4526 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO utilisé dans une commande qui ne peut pas envoyer de données" -#: pl_exec.c:4343 pl_exec.c:4531 +#: pl_exec.c:4360 pl_exec.c:4549 #, c-format msgid "query returned no rows" msgstr "la requête n'a renvoyé aucune ligne" -#: pl_exec.c:4365 pl_exec.c:4550 +#: pl_exec.c:4382 pl_exec.c:4568 pl_exec.c:5711 #, c-format msgid "query returned more than one row" msgstr "la requête a renvoyé plus d'une ligne" -#: pl_exec.c:4367 +#: pl_exec.c:4384 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "Assurez-vous que la requête ne renvoie qu'une seule ligne ou utilisez LIMIT 1." -#: pl_exec.c:4383 +#: pl_exec.c:4400 #, c-format msgid "query has no destination for result data" msgstr "la requête n'a pas de destination pour les données résultantes" -#: pl_exec.c:4384 +#: pl_exec.c:4401 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "Si vous voulez ignorer le résultat d'un SELECT, utilisez PERFORM à la place." -#: pl_exec.c:4471 +#: pl_exec.c:4489 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "EXECUTE n'est pas implementé pour SELECT ... INTO" -#: pl_exec.c:4472 +#: pl_exec.c:4490 #, c-format msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." msgstr "Vous pouvez aussi utiliser EXECUTE ... INTO ou EXECUTE CREATE TABLE ... AS à la place." -#: pl_exec.c:4485 +#: pl_exec.c:4503 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE pour les commandes de transactions n'est pas implémenté" -#: pl_exec.c:4786 pl_exec.c:4874 +#: pl_exec.c:4804 pl_exec.c:4892 #, c-format msgid "cursor variable \"%s\" is null" msgstr "la variable du curseur « %s » est NULL" -#: pl_exec.c:4797 pl_exec.c:4885 +#: pl_exec.c:4815 pl_exec.c:4903 #, c-format msgid "cursor \"%s\" does not exist" msgstr "le curseur « %s » n'existe pas" -#: pl_exec.c:4810 +#: pl_exec.c:4828 #, c-format msgid "relative or absolute cursor position is null" msgstr "la position relative ou absolue du curseur est NULL" -#: pl_exec.c:5085 pl_exec.c:5180 +#: pl_exec.c:5066 pl_exec.c:5161 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "une valeur NULL ne peut pas être affectée à la variable « %s » déclarée non NULL" -#: pl_exec.c:5161 +#: pl_exec.c:5142 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "ne peut pas affecter une valeur non composite à une variable de type ROW" -#: pl_exec.c:5193 +#: pl_exec.c:5174 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "ne peut pas affecter une valeur non composite à une variable RECORD" -#: pl_exec.c:5244 +#: pl_exec.c:5225 #, c-format msgid "cannot assign to system column \"%s\"" -msgstr "ne peut pas affecter « %s » à une colonne système" +msgstr "ne peut pas affecter à une colonne système « %s »" + +#: pl_exec.c:5674 +#, c-format +msgid "query did not return data" +msgstr "la requête n'a pas renvoyé de données" + +#: pl_exec.c:5675 pl_exec.c:5687 pl_exec.c:5712 pl_exec.c:5788 pl_exec.c:5793 +#, c-format +msgid "query: %s" +msgstr "requête : %s" -#: pl_exec.c:5693 +#: pl_exec.c:5683 #, c-format -msgid "query \"%s\" did not return data" -msgstr "la requête « %s » ne renvoie pas de données" +msgid "query returned %d column" +msgid_plural "query returned %d columns" +msgstr[0] "la requête a renvoyé %d colonne" +msgstr[1] "la requête a renvoyé %d colonnes" -#: pl_exec.c:5701 +#: pl_exec.c:5787 #, c-format -msgid "query \"%s\" returned %d column" -msgid_plural "query \"%s\" returned %d columns" -msgstr[0] "la requête « %s » a renvoyé %d colonne" -msgstr[1] "la requête « %s » a renvoyé %d colonnes" +msgid "query is SELECT INTO, but it should be plain SELECT" +msgstr "la requête est SELECT INTO, alors qu'elle devrait être un simple SELECT" -#: pl_exec.c:5729 +#: pl_exec.c:5792 #, c-format -msgid "query \"%s\" returned more than one row" -msgstr "la requête « %s » a renvoyé plus d'une ligne" +msgid "query is not a SELECT" +msgstr "la requête n'est pas un SELECT" -#: pl_exec.c:6580 pl_exec.c:6620 pl_exec.c:6660 +#: pl_exec.c:6602 pl_exec.c:6642 pl_exec.c:6682 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "le type de paramètre %d (%s) ne correspond pas à celui préparé dans le plan (%s)" -#: pl_exec.c:7071 pl_exec.c:7105 pl_exec.c:7179 pl_exec.c:7205 +#: pl_exec.c:7093 pl_exec.c:7127 pl_exec.c:7201 pl_exec.c:7227 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "le nombre de champs source et celui de champs cible dans l'affectation ne correspondent pas" #. translator: %s represents a name of an extra check -#: pl_exec.c:7073 pl_exec.c:7107 pl_exec.c:7181 pl_exec.c:7207 +#: pl_exec.c:7095 pl_exec.c:7129 pl_exec.c:7203 pl_exec.c:7229 #, c-format msgid "%s check of %s is active." msgstr "%s vérification de %s est active." -#: pl_exec.c:7077 pl_exec.c:7111 pl_exec.c:7185 pl_exec.c:7211 +#: pl_exec.c:7099 pl_exec.c:7133 pl_exec.c:7207 pl_exec.c:7233 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "Assurez-vous que la requête renvoie la liste exacte des colonnes." -#: pl_exec.c:7598 +#: pl_exec.c:7620 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "l'enregistrement « %s » n'est pas encore affecté" -#: pl_exec.c:7599 +#: pl_exec.c:7621 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "La structure de ligne d'un enregistrement pas encore affecté est indéterminée." @@ -536,280 +548,280 @@ msgstr "instruction SQL" msgid "FOR over EXECUTE statement" msgstr "FOR sur une instruction EXECUTE" -#: pl_gram.y:487 +#: pl_gram.y:486 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "le label du bloc doit être placé avant DECLARE, et non pas après" -#: pl_gram.y:507 +#: pl_gram.y:506 #, c-format msgid "collations are not supported by type %s" msgstr "les collationnements ne sont pas supportés par le type %s" -#: pl_gram.y:526 +#: pl_gram.y:525 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "la variable « %s » doit avoir une valeur par défaut car elle est déclarée NOT NULL" -#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 +#: pl_gram.y:673 pl_gram.y:688 pl_gram.y:714 #, c-format msgid "variable \"%s\" does not exist" msgstr "la variable « %s » n'existe pas" -#: pl_gram.y:733 pl_gram.y:761 +#: pl_gram.y:732 pl_gram.y:760 msgid "duplicate declaration" msgstr "déclaration dupliquée" -#: pl_gram.y:744 pl_gram.y:772 +#: pl_gram.y:743 pl_gram.y:771 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "la variable « %s » cache une variable définie précédemment" -#: pl_gram.y:1046 +#: pl_gram.y:1043 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "l'élément %s de diagnostique n'est pas autorisé dans GET STACKED DIAGNOSTICS" -#: pl_gram.y:1064 +#: pl_gram.y:1061 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "l'élément %s de diagnostique n'est pas autorisé dans GET CURRENT DIAGNOSTICS" -#: pl_gram.y:1159 +#: pl_gram.y:1156 msgid "unrecognized GET DIAGNOSTICS item" msgstr "élément GET DIAGNOSTICS non reconnu" -#: pl_gram.y:1175 pl_gram.y:3583 +#: pl_gram.y:1172 pl_gram.y:3557 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "« %s » n'est pas une variable scalaire" -#: pl_gram.y:1405 pl_gram.y:1599 +#: pl_gram.y:1402 pl_gram.y:1596 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "la variable d'une boucle sur des lignes doit être une variable de type record ou une liste de variables scalaires" -#: pl_gram.y:1440 +#: pl_gram.y:1437 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "le curseur de la boucle FOR ne doit avoir qu'une seule variable cible" -#: pl_gram.y:1447 +#: pl_gram.y:1444 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "le curseur de la boucle FOR doit utiliser une variable d'un curseur lié" -#: pl_gram.y:1538 +#: pl_gram.y:1535 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "une boucle FOR de type entier ne doit avoir qu'une seule variable cible" -#: pl_gram.y:1572 +#: pl_gram.y:1569 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "ne peut pas spécifier REVERSE dans la requête d'une boucle FOR" -#: pl_gram.y:1702 +#: pl_gram.y:1699 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "la variable d'une boucle FOREACH doit être une variable connue ou une liste de variables" -#: pl_gram.y:1744 +#: pl_gram.y:1741 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "il n'existe pas de label « %s » attaché à un bloc ou à une boucle englobant cette instruction" -#: pl_gram.y:1752 +#: pl_gram.y:1749 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "le label de bloc « %s » ne peut pas être utilisé avec CONTINUE" -#: pl_gram.y:1767 +#: pl_gram.y:1764 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT ne peut pas être utilisé à l'extérieur d'une boucle, sauf s'il a un label" -#: pl_gram.y:1768 +#: pl_gram.y:1765 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE ne peut pas être utilisé à l'extérieur d'une boucle" -#: pl_gram.y:1792 pl_gram.y:1830 pl_gram.y:1878 pl_gram.y:3032 pl_gram.y:3118 -#: pl_gram.y:3229 pl_gram.y:3982 +#: pl_gram.y:1789 pl_gram.y:1827 pl_gram.y:1875 pl_gram.y:3004 pl_gram.y:3092 +#: pl_gram.y:3203 pl_gram.y:3956 msgid "unexpected end of function definition" msgstr "fin inattendue de la définition de la fonction" -#: pl_gram.y:1898 pl_gram.y:1922 pl_gram.y:1938 pl_gram.y:1944 pl_gram.y:2065 -#: pl_gram.y:2073 pl_gram.y:2087 pl_gram.y:2182 pl_gram.y:2434 pl_gram.y:2524 -#: pl_gram.y:2683 pl_gram.y:3825 pl_gram.y:3886 pl_gram.y:3963 +#: pl_gram.y:1895 pl_gram.y:1919 pl_gram.y:1935 pl_gram.y:1941 pl_gram.y:2066 +#: pl_gram.y:2074 pl_gram.y:2088 pl_gram.y:2183 pl_gram.y:2407 pl_gram.y:2497 +#: pl_gram.y:2655 pl_gram.y:3799 pl_gram.y:3860 pl_gram.y:3937 msgid "syntax error" msgstr "erreur de syntaxe" -#: pl_gram.y:1926 pl_gram.y:1928 pl_gram.y:2438 pl_gram.y:2440 +#: pl_gram.y:1923 pl_gram.y:1925 pl_gram.y:2411 pl_gram.y:2413 msgid "invalid SQLSTATE code" msgstr "code SQLSTATE invalide" -#: pl_gram.y:2130 +#: pl_gram.y:2131 msgid "syntax error, expected \"FOR\"" msgstr "erreur de syntaxe, « FOR » attendu" -#: pl_gram.y:2191 +#: pl_gram.y:2192 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "l'instruction FETCH ne peut pas renvoyer plusieurs lignes" -#: pl_gram.y:2316 +#: pl_gram.y:2289 #, c-format msgid "cursor variable must be a simple variable" msgstr "la variable de curseur doit être une variable simple" -#: pl_gram.y:2322 +#: pl_gram.y:2295 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "la variable « %s » doit être de type cursor ou refcursor" -#: pl_gram.y:2654 pl_gram.y:2665 +#: pl_gram.y:2626 pl_gram.y:2637 #, c-format msgid "\"%s\" is not a known variable" msgstr "« %s » n'est pas une variable connue" -#: pl_gram.y:2771 pl_gram.y:2781 pl_gram.y:2937 +#: pl_gram.y:2743 pl_gram.y:2753 pl_gram.y:2909 msgid "mismatched parentheses" msgstr "parenthèses non correspondantes" -#: pl_gram.y:2785 +#: pl_gram.y:2757 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "« %s » manquant à la fin de l'expression SQL" -#: pl_gram.y:2791 +#: pl_gram.y:2763 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "« %s » manquant à la fin de l'instruction SQL" -#: pl_gram.y:2808 +#: pl_gram.y:2780 msgid "missing expression" msgstr "expression manquante" -#: pl_gram.y:2810 +#: pl_gram.y:2782 msgid "missing SQL statement" msgstr "instruction SQL manquante" -#: pl_gram.y:2939 +#: pl_gram.y:2911 msgid "incomplete data type declaration" msgstr "déclaration incomplète d'un type de données" -#: pl_gram.y:2962 +#: pl_gram.y:2934 msgid "missing data type declaration" msgstr "déclaration manquante d'un type de données" -#: pl_gram.y:3040 +#: pl_gram.y:3014 msgid "INTO specified more than once" msgstr "INTO spécifié plus d'une fois" -#: pl_gram.y:3210 +#: pl_gram.y:3184 msgid "expected FROM or IN" msgstr "attendait FROM ou IN" -#: pl_gram.y:3271 +#: pl_gram.y:3245 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "RETURN ne peut pas avoir de paramètre dans une fonction renvoyant un ensemble" -#: pl_gram.y:3272 +#: pl_gram.y:3246 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Utilisez RETURN NEXT ou RETURN QUERY." -#: pl_gram.y:3282 +#: pl_gram.y:3256 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "RETURN ne peut pas avoir de paramètre dans une procédure" -#: pl_gram.y:3287 +#: pl_gram.y:3261 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "RETURN ne peut pas avoir de paramètre dans une fonction renvoyant void" -#: pl_gram.y:3296 +#: pl_gram.y:3270 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN ne peut pas avoir de paramètre dans une fonction avec des paramètres OUT" -#: pl_gram.y:3359 +#: pl_gram.y:3333 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "RETURN NEXT ne peut pas avoir de paramètre dans une fonction avec des paramètres OUT" -#: pl_gram.y:3467 +#: pl_gram.y:3441 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "la variable « %s » est déclarée CONSTANT" -#: pl_gram.y:3525 +#: pl_gram.y:3499 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "la variable de type record ne peut pas faire partie d'une liste INTO à plusieurs éléments" -#: pl_gram.y:3571 +#: pl_gram.y:3545 #, c-format msgid "too many INTO variables specified" msgstr "trop de variables INTO indiquées" -#: pl_gram.y:3779 +#: pl_gram.y:3753 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "label de fin « %s » spécifié pour un bloc sans label" -#: pl_gram.y:3786 +#: pl_gram.y:3760 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "le label de fin « %s » est différent du label « %s » du bloc" -#: pl_gram.y:3820 +#: pl_gram.y:3794 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "le curseur « %s » n'a pas d'argument" -#: pl_gram.y:3834 +#: pl_gram.y:3808 #, c-format msgid "cursor \"%s\" has arguments" msgstr "le curseur « %s » a des arguments" -#: pl_gram.y:3876 +#: pl_gram.y:3850 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "le curseur « %s » n'a pas d'argument nommé « %s »" -#: pl_gram.y:3896 +#: pl_gram.y:3870 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "la valeur du paramètre « %s » pour le curseur « %s » est spécifiée plus d'une fois" -#: pl_gram.y:3921 +#: pl_gram.y:3895 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "pas assez d'arguments pour le curseur « %s »" -#: pl_gram.y:3928 +#: pl_gram.y:3902 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "trop d'arguments pour le curseur « %s »" -#: pl_gram.y:4014 +#: pl_gram.y:3988 msgid "unrecognized RAISE statement option" msgstr "option de l'instruction RAISE inconnue" -#: pl_gram.y:4018 +#: pl_gram.y:3992 msgid "syntax error, expected \"=\"" msgstr "erreur de syntaxe, « = » attendu" -#: pl_gram.y:4059 +#: pl_gram.y:4033 #, c-format msgid "too many parameters specified for RAISE" msgstr "trop de paramètres spécifiés pour RAISE" -#: pl_gram.y:4063 +#: pl_gram.y:4037 #, c-format msgid "too few parameters specified for RAISE" msgstr "trop peu de paramètres pour RAISE" @@ -846,144 +858,147 @@ msgstr "%s à la fin de l'entrée" msgid "%s at or near \"%s\"" msgstr "%s sur ou près de « %s »" -#~ msgid "relation \"%s\" is not a table" -#~ msgstr "la relation « %s » n'est pas une table" +#~ msgid "EXECUTE statement" +#~ msgstr "instruction EXECUTE" -#~ msgid "variable \"%s\" declared NOT NULL cannot default to NULL" -#~ msgstr "la variable « %s » déclarée NOT NULL ne peut pas valoir NULL par défaut" +#~ msgid "Expected \"FOR\", to open a cursor for an unbound cursor variable." +#~ msgstr "Attendait « FOR » pour ouvrir un curseur pour une variable sans limite." -#~ msgid "Use a BEGIN block with an EXCEPTION clause instead." -#~ msgstr "Utiliser un bloc BEGIN dans une clause EXCEPTION à la place." +#~ msgid "Expected record variable, row variable, or list of scalar variables following INTO." +#~ msgstr "" +#~ "Attendait une variable RECORD, ROW ou une liste de variables scalaires\n" +#~ "suivant INTO." -#~ msgid "row or record variable cannot be CONSTANT" -#~ msgstr "la variable ROW ou RECORD ne peut pas être CONSTANT" +#~ msgid "N/A (dropped column)" +#~ msgstr "N/A (colonne supprimée)" -#~ msgid "row or record variable cannot be NOT NULL" -#~ msgstr "la variable ROW ou RECORD ne peut pas être NOT NULL" +#~ msgid "Number of returned columns (%d) does not match expected column count (%d)." +#~ msgstr "" +#~ "Le nombre de colonnes renvoyées (%d) ne correspond pas au nombre de colonnes\n" +#~ "attendues (%d)." -#~ msgid "default value for row or record variable is not supported" -#~ msgstr "la valeur par défaut de variable ROW ou RECORD n'est pas supportée" +#~ msgid "RETURN NEXT must specify a record or row variable in function returning row" +#~ msgstr "" +#~ "RETURN NEXT doit indiquer une variable RECORD ou ROW dans une fonction\n" +#~ "renvoyant une ligne" -#~ msgid "EXECUTE statement" -#~ msgstr "instruction EXECUTE" +#~ msgid "RETURN cannot have a parameter in function returning set; use RETURN NEXT or RETURN QUERY" +#~ msgstr "" +#~ "RETURN ne peut pas avoir un paramètre dans une fonction renvoyant des\n" +#~ "lignes ; utilisez RETURN NEXT ou RETURN QUERY" -#~ msgid "relation \"%s.%s\" does not exist" -#~ msgstr "la relation « %s.%s » n'existe pas" +#~ msgid "RETURN must specify a record or row variable in function returning row" +#~ msgstr "" +#~ "RETURN ne peut pas indiquer une variable RECORD ou ROW dans une fonction\n" +#~ "renvoyant une ligne" + +#~ msgid "Returned type %s does not match expected type %s in column \"%s\"." +#~ msgstr "Le type %s renvoyé ne correspond pas au type %s attendu dans la colonne « %s »." + +#~ msgid "SQL statement in PL/PgSQL function \"%s\" near line %d" +#~ msgstr "instruction SQL dans la fonction PL/pgsql « %s » près de la ligne %d" + +#~ msgid "Use a BEGIN block with an EXCEPTION clause instead." +#~ msgstr "Utiliser un bloc BEGIN dans une clause EXCEPTION à la place." + +#~ msgid "array subscript in assignment must not be null" +#~ msgstr "un indice de tableau dans une affectation ne peut pas être NULL" + +#~ msgid "cannot assign to tg_argv" +#~ msgstr "ne peut pas affecter à tg_argv" #~ msgid "cursor \"%s\" closed unexpectedly" #~ msgstr "le curseur « %s » a été fermé de façon inattendu" -#~ msgid "row \"%s\" has no field \"%s\"" -#~ msgstr "la ligne « %s » n'a aucun champ « %s »" +#~ msgid "default value for row or record variable is not supported" +#~ msgstr "la valeur par défaut de variable ROW ou RECORD n'est pas supportée" -#~ msgid "row \"%s.%s\" has no field \"%s\"" -#~ msgstr "la ligne « %s.%s » n'a aucun champ « %s »" +#~ msgid "expected \")\"" +#~ msgstr "« ) » attendu" #~ msgid "expected \"[\"" #~ msgstr "« [ » attendu" -#~ msgid "type of \"%s\" does not match that when preparing the plan" -#~ msgstr "le type de « %s » ne correspond pas à ce qui est préparé dans le plan" - -#~ msgid "type of \"%s.%s\" does not match that when preparing the plan" -#~ msgstr "le type de « %s.%s » ne correspond pas à ce qui est préparé dans le plan" +#~ msgid "expected a cursor or refcursor variable" +#~ msgstr "attendait une variable de type cursor ou refcursor" -#~ msgid "type of tg_argv[%d] does not match that when preparing the plan" -#~ msgstr "le type de tg_argv[%d] ne correspond pas à ce qui est préparé dans le plan" +#~ msgid "expected an integer variable" +#~ msgstr "attend une variable entière" -#~ msgid "N/A (dropped column)" -#~ msgstr "N/A (colonne supprimée)" +#~ msgid "function has no parameter \"%s\"" +#~ msgstr "la fonction n'a pas de paramètre « %s »" -#~ msgid "Number of returned columns (%d) does not match expected column count (%d)." -#~ msgstr "" -#~ "Le nombre de colonnes renvoyées (%d) ne correspond pas au nombre de colonnes\n" -#~ "attendues (%d)." +#~ msgid "label does not exist" +#~ msgstr "le label n'existe pas" -#~ msgid "Returned type %s does not match expected type %s in column \"%s\"." -#~ msgstr "Le type %s renvoyé ne correspond pas au type %s attendu dans la colonne « %s »." +#~ msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +#~ msgstr "le nombre de dimensions du tableau (%d) dépasse la maximum autorisé (%d)" #~ msgid "only positional parameters can be aliased" #~ msgstr "seuls les paramètres de position peuvent avoir un alias" -#~ msgid "function has no parameter \"%s\"" -#~ msgstr "la fonction n'a pas de paramètre « %s »" - -#~ msgid "expected an integer variable" -#~ msgstr "attend une variable entière" - -#~ msgid "syntax error at \"%s\"" -#~ msgstr "erreur de syntaxe à « %s »" +#~ msgid "qualified identifier cannot be used here: %s" +#~ msgstr "l'identifiant qualifié ne peut pas être utilisé ici : %s" -#~ msgid "Expected \"FOR\", to open a cursor for an unbound cursor variable." -#~ msgstr "Attendait « FOR » pour ouvrir un curseur pour une variable sans limite." +#~ msgid "query \"%s\" returned more than one row" +#~ msgstr "la requête « %s » a renvoyé plus d'une ligne" -#~ msgid "expected a cursor or refcursor variable" -#~ msgstr "attendait une variable de type cursor ou refcursor" +#~ msgid "relation \"%s\" is not a table" +#~ msgstr "la relation « %s » n'est pas une table" -#~ msgid "too many variables specified in SQL statement" -#~ msgstr "trop de variables spécifiées dans l'instruction SQL" +#~ msgid "relation \"%s.%s\" does not exist" +#~ msgstr "la relation « %s.%s » n'existe pas" -#~ msgid "RETURN cannot have a parameter in function returning set; use RETURN NEXT or RETURN QUERY" -#~ msgstr "" -#~ "RETURN ne peut pas avoir un paramètre dans une fonction renvoyant des\n" -#~ "lignes ; utilisez RETURN NEXT ou RETURN QUERY" +#~ msgid "row \"%s\" has no field \"%s\"" +#~ msgstr "la ligne « %s » n'a aucun champ « %s »" -#~ msgid "cannot assign to tg_argv" -#~ msgstr "ne peut pas affecter à tg_argv" +#~ msgid "row \"%s.%s\" has no field \"%s\"" +#~ msgstr "la ligne « %s.%s » n'a aucun champ « %s »" -#~ msgid "Expected record variable, row variable, or list of scalar variables following INTO." -#~ msgstr "" -#~ "Attendait une variable RECORD, ROW ou une liste de variables scalaires\n" -#~ "suivant INTO." +#~ msgid "row or record variable cannot be CONSTANT" +#~ msgstr "la variable ROW ou RECORD ne peut pas être CONSTANT" -#~ msgid "SQL statement in PL/PgSQL function \"%s\" near line %d" -#~ msgstr "instruction SQL dans la fonction PL/pgsql « %s » près de la ligne %d" +#~ msgid "row or record variable cannot be NOT NULL" +#~ msgstr "la variable ROW ou RECORD ne peut pas être NOT NULL" #~ msgid "string literal in PL/PgSQL function \"%s\" near line %d" #~ msgstr "chaîne littérale dans la fonction PL/pgsql « %s » près de la ligne %d" -#~ msgid "expected \")\"" -#~ msgstr "« ) » attendu" +#~ msgid "subscripted object is not an array" +#~ msgstr "l'objet souscrit n'est pas un tableau" -#~ msgid "variable \"%s\" does not exist in the current block" -#~ msgstr "la variable « %s » n'existe pas dans le bloc actuel" +#~ msgid "syntax error at \"%s\"" +#~ msgstr "erreur de syntaxe à « %s »" -#~ msgid "unterminated \" in identifier: %s" -#~ msgstr "\" non terminé dans l'identifiant : %s" +#~ msgid "too many variables specified in SQL statement" +#~ msgstr "trop de variables spécifiées dans l'instruction SQL" -#~ msgid "qualified identifier cannot be used here: %s" -#~ msgstr "l'identifiant qualifié ne peut pas être utilisé ici : %s" +#~ msgid "type of \"%s\" does not match that when preparing the plan" +#~ msgstr "le type de « %s » ne correspond pas à ce qui est préparé dans le plan" -#~ msgid "unterminated quoted identifier" -#~ msgstr "identifiant entre guillemets non terminé" +#~ msgid "type of \"%s.%s\" does not match that when preparing the plan" +#~ msgstr "le type de « %s.%s » ne correspond pas à ce qui est préparé dans le plan" + +#~ msgid "type of tg_argv[%d] does not match that when preparing the plan" +#~ msgstr "le type de tg_argv[%d] ne correspond pas à ce qui est préparé dans le plan" + +#~ msgid "unterminated \" in identifier: %s" +#~ msgstr "\" non terminé dans l'identifiant : %s" #~ msgid "unterminated /* comment" #~ msgstr "commentaire /* non terminé" -#~ msgid "unterminated quoted string" -#~ msgstr "chaîne entre guillemets non terminée" - #~ msgid "unterminated dollar-quoted string" #~ msgstr "chaîne entre dollars non terminée" -#~ msgid "RETURN NEXT must specify a record or row variable in function returning row" -#~ msgstr "" -#~ "RETURN NEXT doit indiquer une variable RECORD ou ROW dans une fonction\n" -#~ "renvoyant une ligne" - -#~ msgid "RETURN must specify a record or row variable in function returning row" -#~ msgstr "" -#~ "RETURN ne peut pas indiquer une variable RECORD ou ROW dans une fonction\n" -#~ "renvoyant une ligne" - -#~ msgid "label does not exist" -#~ msgstr "le label n'existe pas" +#~ msgid "unterminated quoted identifier" +#~ msgstr "identifiant entre guillemets non terminé" -#~ msgid "array subscript in assignment must not be null" -#~ msgstr "un indice de tableau dans une affectation ne peut pas être NULL" +#~ msgid "unterminated quoted string" +#~ msgstr "chaîne entre guillemets non terminée" -#~ msgid "subscripted object is not an array" -#~ msgstr "l'objet souscrit n'est pas un tableau" +#~ msgid "variable \"%s\" declared NOT NULL cannot default to NULL" +#~ msgstr "la variable « %s » déclarée NOT NULL ne peut pas valoir NULL par défaut" -#~ msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -#~ msgstr "le nombre de dimensions du tableau (%d) dépasse la maximum autorisé (%d)" +#~ msgid "variable \"%s\" does not exist in the current block" +#~ msgstr "la variable « %s » n'existe pas dans le bloc actuel" diff --git a/src/pl/plpgsql/src/po/ja.po b/src/pl/plpgsql/src/po/ja.po index 9573b5c127..a59225f346 100644 --- a/src/pl/plpgsql/src/po/ja.po +++ b/src/pl/plpgsql/src/po/ja.po @@ -1,14 +1,14 @@ # Japanese message translation file for plpgsql -# Copyright (C) 2019 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # HOTTA Michihde , 2013 # msgid "" msgstr "" -"Project-Id-Version: plpgsql (PostgreSQL 12 beta 1)\n" +"Project-Id-Version: plpgsql (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-06-11 11:34+0900\n" -"PO-Revision-Date: 2019-06-11 13:38+0900\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" +"PO-Revision-Date: 2022-05-11 13:52+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" "Language: ja\n" @@ -16,155 +16,161 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 1.5.4\n" +"X-Generator: Poedit 1.8.13\n" -#: pl_comp.c:436 pl_handler.c:461 +#: pl_comp.c:438 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "PL/pgSQL 関数では %s 型は指定できません" -#: pl_comp.c:524 +#: pl_comp.c:530 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "多相関数\"%s\"の実際の戻り値の型を特定できませんでした" -#: pl_comp.c:554 +#: pl_comp.c:560 #, c-format msgid "trigger functions can only be called as triggers" msgstr "トリガー関数はトリガーとしてのみコールできます" -#: pl_comp.c:558 pl_handler.c:445 +#: pl_comp.c:564 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "PL/pgSQL 関数は %s 型を返せません" -#: pl_comp.c:597 +#: pl_comp.c:604 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "トリガー関数には引数を宣言できません" -#: pl_comp.c:598 +#: pl_comp.c:605 #, c-format -msgid "" -"The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV " -"instead." -msgstr "" -"その代わり、トリガーの引数には TG_NARGS と TG_ARGV を通してのみアクセスできま" -"す" +msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." +msgstr "その代わり、トリガーの引数には TG_NARGS と TG_ARGV を通してのみアクセスできます" -#: pl_comp.c:721 +#: pl_comp.c:738 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "イベントトリガー関数では引数を宣言できません" -#: pl_comp.c:980 +#: pl_comp.c:1002 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "PL/pgSQL 関数 \"%s\" の %d 行目付近でのコンパイル" -#: pl_comp.c:1003 +#: pl_comp.c:1025 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "パラメータ \"%s\" が複数指定されました" -#: pl_comp.c:1115 +#: pl_comp.c:1139 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "列参照 \"%s\" が一意に特定できません" -#: pl_comp.c:1117 +#: pl_comp.c:1141 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." -msgstr "" -"PL/pgSQL 変数もしくはテーブルのカラム名のどちらかを参照していた可能性がありま" -"す。" +msgstr "PL/pgSQL 変数もしくはテーブルのカラム名のどちらかを参照していた可能性があります。" -#: pl_comp.c:1300 pl_exec.c:5106 pl_exec.c:5471 pl_exec.c:5558 pl_exec.c:5649 -#: pl_exec.c:6566 +#: pl_comp.c:1324 pl_exec.c:5234 pl_exec.c:5407 pl_exec.c:5494 pl_exec.c:5585 +#: pl_exec.c:6606 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "レコード \"%s\" には項目 \"%s\" はありません" -#: pl_comp.c:1765 +#: pl_comp.c:1818 #, c-format msgid "relation \"%s\" does not exist" msgstr "リレーション \"%s\" がありません" -#: pl_comp.c:1857 +#: pl_comp.c:1825 pl_comp.c:1867 +#, c-format +msgid "relation \"%s\" does not have a composite type" +msgstr "リレーション\"%s\"は複合型を持っていません" + +#: pl_comp.c:1933 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "変数 \"%s\" の型は擬似タイプ %s です" -#: pl_comp.c:2037 +#: pl_comp.c:2122 #, c-format msgid "type \"%s\" is only a shell" msgstr "型 \"%s\" はシェルでのみ使えます" -#: pl_comp.c:2134 pl_comp.c:2187 +#: pl_comp.c:2204 pl_exec.c:6907 +#, c-format +msgid "type %s is not composite" +msgstr "型%sは複合型ではありません" + +#: pl_comp.c:2252 pl_comp.c:2305 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "例外条件 \"%s\" が認識できません" -#: pl_comp.c:2401 +#: pl_comp.c:2526 #, c-format -msgid "" -"could not determine actual argument type for polymorphic function \"%s\"" +msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "多相関数\"%s\"の実際の引数の型を特定できませんでした" -#: pl_exec.c:475 pl_exec.c:887 pl_exec.c:1125 +#: pl_exec.c:501 pl_exec.c:940 pl_exec.c:1175 msgid "during initialization of execution state" msgstr "実行状態の初期化の際" -#: pl_exec.c:481 +#: pl_exec.c:507 msgid "while storing call arguments into local variables" msgstr "引数をローカル変数に格納する際" -#: pl_exec.c:569 pl_exec.c:960 +#: pl_exec.c:595 pl_exec.c:1013 msgid "during function entry" msgstr "関数に入る際" -#: pl_exec.c:594 +#: pl_exec.c:618 #, c-format msgid "control reached end of function without RETURN" msgstr "RETURN が現れる前に、制御が関数の終わりに達しました" -#: pl_exec.c:601 +#: pl_exec.c:624 msgid "while casting return value to function's return type" msgstr "戻り値を関数の戻り値の型へキャストする際に" -#: pl_exec.c:614 pl_exec.c:3556 +#: pl_exec.c:636 pl_exec.c:3665 #, c-format msgid "set-valued function called in context that cannot accept a set" -msgstr "" -"値の集合を受け付けないようなコンテキストで、集合値を返す関数が呼ばれました" +msgstr "値の集合を受け付けないようなコンテキストで、集合値を返す関数が呼ばれました" -#: pl_exec.c:740 pl_exec.c:989 pl_exec.c:1150 +#: pl_exec.c:641 pl_exec.c:3671 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "マテリアライズモードが必要ですが、現在のコンテクストで禁止されています" + +#: pl_exec.c:768 pl_exec.c:1039 pl_exec.c:1197 msgid "during function exit" msgstr "関数を抜ける際" -#: pl_exec.c:795 pl_exec.c:834 pl_exec.c:3401 +#: pl_exec.c:823 pl_exec.c:887 pl_exec.c:3464 msgid "returned record type does not match expected record type" msgstr "返されたレコードの型が期待するレコードの型と一致しません" -#: pl_exec.c:985 pl_exec.c:1146 +#: pl_exec.c:1036 pl_exec.c:1194 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "RETURN が現れる前に、制御がトリガープロシージャの終わりに達しました" -#: pl_exec.c:994 +#: pl_exec.c:1044 #, c-format msgid "trigger procedure cannot return a set" msgstr "トリガー手続きは集合値を返すことができません" -#: pl_exec.c:1033 pl_exec.c:1061 -msgid "" -"returned row structure does not match the structure of the triggering table" +#: pl_exec.c:1083 pl_exec.c:1111 +msgid "returned row structure does not match the structure of the triggering table" msgstr "返された行の構造が、トリガーしているテーブルの構造とマッチしません" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1198 +#: pl_exec.c:1252 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "PL/pgSQL関数%sの%d行目 %s" @@ -172,705 +178,661 @@ msgstr "PL/pgSQL関数%sの%d行目 %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1209 +#: pl_exec.c:1263 #, c-format msgid "PL/pgSQL function %s %s" msgstr "PL/pgSQL関数%s - %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1217 +#: pl_exec.c:1271 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "PL/pgSQL関数%sの%d行目 - %s" -#: pl_exec.c:1223 +#: pl_exec.c:1277 #, c-format msgid "PL/pgSQL function %s" msgstr "PL/pgSQL関数 %s" -#: pl_exec.c:1561 +#: pl_exec.c:1648 msgid "during statement block local variable initialization" msgstr "ステートメントブロックでローカル変数を初期化中" -#: pl_exec.c:1659 +#: pl_exec.c:1753 msgid "during statement block entry" msgstr "ステートメントブロックに入る際に" -#: pl_exec.c:1691 +#: pl_exec.c:1785 msgid "during statement block exit" msgstr "ステートメントブロックを抜ける際に" -#: pl_exec.c:1729 +#: pl_exec.c:1823 msgid "during exception cleanup" msgstr "例外をクリーンアップする際に" -#: pl_exec.c:2225 +#: pl_exec.c:2360 #, c-format -#| msgid "argument %d is an output argument but is not writable" -msgid "" -"procedure parameter \"%s\" is an output parameter but corresponding argument " -"is not writable" -msgstr "" -"プロシージャのパラメータ\"%s\"は出力パラメータですが対応する引数が書き込み不" -"可です" +msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" +msgstr "プロシージャのパラメータ\"%s\"は出力パラメータですが対応する引数が書き込み不可です" -#: pl_exec.c:2230 +#: pl_exec.c:2365 #, c-format -#| msgid "argument %d is an output argument but is not writable" -msgid "" -"procedure parameter %d is an output parameter but corresponding argument is " -"not writable" -msgstr "" -"プロシージャのパラメータ%dは出力パラメータですが対応する引数が書き込み不可で" -"す" +msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" +msgstr "プロシージャのパラメータ%dは出力パラメータですが対応する引数が書き込み不可です" -#: pl_exec.c:2341 +#: pl_exec.c:2399 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS は例外ハンドラの外では使えません" -#: pl_exec.c:2540 +#: pl_exec.c:2599 #, c-format msgid "case not found" msgstr "case が見つかりません" -#: pl_exec.c:2541 +#: pl_exec.c:2600 #, c-format msgid "CASE statement is missing ELSE part." msgstr "CASE ステートメントに ELSE 部分がありません" -#: pl_exec.c:2634 +#: pl_exec.c:2693 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "FOR ループの下限を NULL にすることはできません" -#: pl_exec.c:2650 +#: pl_exec.c:2709 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "FOR ループの上限を NULL にすることはできません" -#: pl_exec.c:2668 +#: pl_exec.c:2727 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "FOR ループにおける BY の値を NULL にすることはできません" -#: pl_exec.c:2674 +#: pl_exec.c:2733 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "FOR ループにおける BY の値はゼロより大きくなければなりません" -#: pl_exec.c:2808 pl_exec.c:4530 +#: pl_exec.c:2867 pl_exec.c:4667 #, c-format msgid "cursor \"%s\" already in use" msgstr "カーソル \"%s\" はすでに使われています" -#: pl_exec.c:2831 pl_exec.c:4595 +#: pl_exec.c:2890 pl_exec.c:4737 #, c-format msgid "arguments given for cursor without arguments" msgstr "引数なしのカーソルに引数が与えられました" -#: pl_exec.c:2850 pl_exec.c:4614 +#: pl_exec.c:2909 pl_exec.c:4756 #, c-format msgid "arguments required for cursor" msgstr "カーソルには引数が必要です" -#: pl_exec.c:2937 +#: pl_exec.c:3000 #, c-format msgid "FOREACH expression must not be null" msgstr "FOREACH 式は NULL であってはなりません" -#: pl_exec.c:2952 +#: pl_exec.c:3015 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "FOREACH 式は %s 型ではなく配列を生成しなければなりません" -#: pl_exec.c:2969 +#: pl_exec.c:3032 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "配列の要素数 (%d) が有効範囲0から%dまでの間にありません" -#: pl_exec.c:2996 +#: pl_exec.c:3059 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "FOREACH ... SLICE ループ変数は配列型でなければなりません" -#: pl_exec.c:3000 +#: pl_exec.c:3063 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "FOREACH ループ変数は配列型であってはなりません" -#: pl_exec.c:3162 pl_exec.c:3219 pl_exec.c:3394 +#: pl_exec.c:3225 pl_exec.c:3282 pl_exec.c:3457 #, c-format -msgid "" -"cannot return non-composite value from function returning composite type" +msgid "cannot return non-composite value from function returning composite type" msgstr "複合型を返す関数から複合型以外の値を返すことはできません" -#: pl_exec.c:3258 pl_gram.y:3305 +#: pl_exec.c:3321 pl_gram.y:3318 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "SETOF でない関数では RETURN NEXT は使えません" -#: pl_exec.c:3299 pl_exec.c:3431 +#: pl_exec.c:3362 pl_exec.c:3494 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "RETURN NEXT で指定されている結果の型が誤っています" -#: pl_exec.c:3337 pl_exec.c:3358 +#: pl_exec.c:3400 pl_exec.c:3421 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "RETURN NEXT で指定されているレコードの型が誤っています" -#: pl_exec.c:3450 +#: pl_exec.c:3513 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT にはパラメーターが必要です" -#: pl_exec.c:3476 pl_gram.y:3369 +#: pl_exec.c:3541 pl_gram.y:3382 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "SETOF でない関数では RETURN QUERY は使えません" -#: pl_exec.c:3500 +#: pl_exec.c:3559 msgid "structure of query does not match function result type" msgstr "問い合わせの構造が関数の結果の型と一致しません" -#: pl_exec.c:3584 pl_exec.c:3722 +#: pl_exec.c:3614 pl_exec.c:4444 pl_exec.c:8685 +#, c-format +msgid "query string argument of EXECUTE is null" +msgstr "EXECUTE の問い合わせ文字列の引数が NULL です" + +#: pl_exec.c:3699 pl_exec.c:3837 #, c-format msgid "RAISE option already specified: %s" msgstr "RAISE オプションは既に指定されています: %s" -#: pl_exec.c:3618 +#: pl_exec.c:3733 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "引数の無い RAISE は、例外ハンドラの外では使えません" -#: pl_exec.c:3712 +#: pl_exec.c:3827 #, c-format msgid "RAISE statement option cannot be null" msgstr "RAISE ステートメントのオプションには NULL は指定できません" -#: pl_exec.c:3782 +#: pl_exec.c:3897 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3837 +#: pl_exec.c:3952 #, c-format msgid "assertion failed" msgstr "アサーションに失敗" -#: pl_exec.c:4179 pl_exec.c:4369 +#: pl_exec.c:4317 pl_exec.c:4506 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "PL/pgSQL 内では COPY to/from クライアントは使えません" -#: pl_exec.c:4185 +#: pl_exec.c:4323 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "PL/pgSQL 内ではサポートされないトランザクションコマンド" -#: pl_exec.c:4208 pl_exec.c:4398 +#: pl_exec.c:4346 pl_exec.c:4535 #, c-format msgid "INTO used with a command that cannot return data" msgstr "データを返せないコマンドで INTO が使われました" -#: pl_exec.c:4231 pl_exec.c:4421 +#: pl_exec.c:4369 pl_exec.c:4558 #, c-format msgid "query returned no rows" msgstr "問い合わせは行を返しませんでした" -#: pl_exec.c:4253 pl_exec.c:4440 +#: pl_exec.c:4391 pl_exec.c:4577 pl_exec.c:5729 #, c-format msgid "query returned more than one row" msgstr "問い合わせが複数の行を返しました" -#: pl_exec.c:4255 +#: pl_exec.c:4393 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "問い合わせを1行返却するようにするか、LIMIT 1 をつけてください。" -#: pl_exec.c:4271 +#: pl_exec.c:4409 #, c-format msgid "query has no destination for result data" msgstr "問い合わせに結果データの返却先が指定されていません" -#: pl_exec.c:4272 +#: pl_exec.c:4410 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "SELECT の結果を破棄したい場合、代わりに PERFORM を使ってください" -#: pl_exec.c:4305 pl_exec.c:8416 -#, c-format -msgid "query string argument of EXECUTE is null" -msgstr "EXECUTE の問い合わせ文字列の引数が NULL です" - -#: pl_exec.c:4361 +#: pl_exec.c:4498 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "SELECT ... INTO の EXECUTE は実装されていません" -#: pl_exec.c:4362 +#: pl_exec.c:4499 #, c-format -msgid "" -"You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS " -"instead." -msgstr "" -"代わりに EXECUTE ... INTO または EXECUTE CREATE TABLE ... AS が使えます。" +msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." +msgstr "代わりに EXECUTE ... INTO または EXECUTE CREATE TABLE ... AS が使えます。" -#: pl_exec.c:4375 +#: pl_exec.c:4512 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "トランザクションコマンドのEXECUTEは実装されていません" -#: pl_exec.c:4676 pl_exec.c:4764 +#: pl_exec.c:4822 pl_exec.c:4910 #, c-format msgid "cursor variable \"%s\" is null" msgstr "カーソル変数 \"%s\" が NULL です" -#: pl_exec.c:4687 pl_exec.c:4775 +#: pl_exec.c:4833 pl_exec.c:4921 #, c-format msgid "cursor \"%s\" does not exist" msgstr "カーソル \"%s\" は存在しません" -#: pl_exec.c:4700 +#: pl_exec.c:4846 #, c-format msgid "relative or absolute cursor position is null" msgstr "相対もしくは絶対カーソル位置が NULL です" -#: pl_exec.c:4956 pl_exec.c:5051 +#: pl_exec.c:5084 pl_exec.c:5179 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "NOT NULL として宣言された変数 \"%s\" には NULL を代入できません" -#: pl_exec.c:5032 +#: pl_exec.c:5160 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "複合型でない値を行変数に代入できません" -#: pl_exec.c:5064 +#: pl_exec.c:5192 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "複合型でない値をレコード変数に代入できません" -#: pl_exec.c:5115 +#: pl_exec.c:5243 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "システム列\"%s\"に代入できません" -#: pl_exec.c:5179 -#, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "配列の次元数(%d)が制限値(%d)を超えています" - -#: pl_exec.c:5211 -#, c-format -msgid "subscripted object is not an array" -msgstr "添字つきオブジェクトは配列ではありません" - -#: pl_exec.c:5249 +#: pl_exec.c:5692 #, c-format -msgid "array subscript in assignment must not be null" -msgstr "代入における配列の添字が NULL であってはなりません" +msgid "query did not return data" +msgstr "問い合わせがデータを返しませんでした" -#: pl_exec.c:5756 +#: pl_exec.c:5693 pl_exec.c:5705 pl_exec.c:5730 pl_exec.c:5806 pl_exec.c:5811 #, c-format -msgid "query \"%s\" did not return data" -msgstr "問い合わせ \"%s\" がデータを返しませんでした" +msgid "query: %s" +msgstr "問い合わせ: %s" -#: pl_exec.c:5764 +#: pl_exec.c:5701 #, c-format -msgid "query \"%s\" returned %d column" -msgid_plural "query \"%s\" returned %d columns" -msgstr[0] "問い合わせ \"%s\" が %d 個の列を返しました" +msgid "query returned %d column" +msgid_plural "query returned %d columns" +msgstr[0] "問い合わせが%d個の列を返しました" -#: pl_exec.c:5792 +#: pl_exec.c:5805 #, c-format -msgid "query \"%s\" returned more than one row" -msgstr "問い合わせ \"%s\" が複数の行を返しました" +msgid "query is SELECT INTO, but it should be plain SELECT" +msgstr "問い合わせはSELECT INTOですが、単純なSELECTでなければなりません" -#: pl_exec.c:5855 +#: pl_exec.c:5810 #, c-format -msgid "query \"%s\" is not a SELECT" -msgstr "問い合わせ \"%s\" が SELECT ではありません" +msgid "query is not a SELECT" +msgstr "問い合わせがSELECTではありません" -#: pl_exec.c:6580 pl_exec.c:6620 pl_exec.c:6660 +#: pl_exec.c:6620 pl_exec.c:6660 pl_exec.c:6700 #, c-format -msgid "" -"type of parameter %d (%s) does not match that when preparing the plan (%s)" +msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "パラメータの型%d(%s)が実行計画(%s)を準備する時点と一致しません" -#: pl_exec.c:6996 pl_exec.c:7030 pl_exec.c:7104 pl_exec.c:7130 +#: pl_exec.c:7111 pl_exec.c:7145 pl_exec.c:7219 pl_exec.c:7245 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "代入のソースとターゲットのフィールド数が一致していません" #. translator: %s represents a name of an extra check -#: pl_exec.c:6998 pl_exec.c:7032 pl_exec.c:7106 pl_exec.c:7132 +#: pl_exec.c:7113 pl_exec.c:7147 pl_exec.c:7221 pl_exec.c:7247 #, c-format msgid "%s check of %s is active." msgstr "%2$sの%1$sチェックが有効です。" -#: pl_exec.c:7002 pl_exec.c:7036 pl_exec.c:7110 pl_exec.c:7136 +#: pl_exec.c:7117 pl_exec.c:7151 pl_exec.c:7225 pl_exec.c:7251 #, c-format -#| msgid "Final statement must return exactly one column." msgid "Make sure the query returns the exact list of columns." msgstr "問い合わせはカラムの正確なリストを返却するようにしてください。" -#: pl_exec.c:7518 +#: pl_exec.c:7638 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "レコード \"%s\" にはまだ値が代入されていません" -#: pl_exec.c:7519 +#: pl_exec.c:7639 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "まだ代入されていないレコードのタプル構造は不定です" -#: pl_funcs.c:239 +#: pl_exec.c:8283 pl_gram.y:3441 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "変数\"%s\" はCONSTANTとして定義されています" + +#: pl_funcs.c:237 msgid "statement block" msgstr "ステートメントブロック" -#: pl_funcs.c:241 +#: pl_funcs.c:239 msgid "assignment" msgstr "代入" -#: pl_funcs.c:251 +#: pl_funcs.c:249 msgid "FOR with integer loop variable" msgstr "整数のループ変数を使った FOR" -#: pl_funcs.c:253 +#: pl_funcs.c:251 msgid "FOR over SELECT rows" msgstr "SELECT 行を使った FOR" -#: pl_funcs.c:255 +#: pl_funcs.c:253 msgid "FOR over cursor" msgstr "カーソルを使った FOR" -#: pl_funcs.c:257 +#: pl_funcs.c:255 msgid "FOREACH over array" msgstr "配列を巡回する FOREACH" -#: pl_funcs.c:271 +#: pl_funcs.c:269 msgid "SQL statement" msgstr "SQL ステートメント" -#: pl_funcs.c:275 +#: pl_funcs.c:273 msgid "FOR over EXECUTE statement" msgstr "EXECUTE ステートメントを使った FOR" -#: pl_gram.y:489 +#: pl_gram.y:486 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "ブロックラベルは DECLARE の後ではなく前に置かなければなりません" -#: pl_gram.y:509 +#: pl_gram.y:506 #, c-format msgid "collations are not supported by type %s" msgstr "%s 型では照合順序はサポートされていません" -#: pl_gram.y:528 +#: pl_gram.y:525 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" -msgstr "" -"NOT NULL宣言されているため、変数\"%s\"はデフォルト値を持つ必要があります" +msgstr "NOT NULL宣言されているため、変数\"%s\"はデフォルト値を持つ必要があります" -#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 +#: pl_gram.y:673 pl_gram.y:688 pl_gram.y:714 #, c-format msgid "variable \"%s\" does not exist" msgstr "変数 \"%s\" は存在しません" -#: pl_gram.y:733 pl_gram.y:761 +#: pl_gram.y:732 pl_gram.y:760 msgid "duplicate declaration" msgstr "重複した宣言です。" -#: pl_gram.y:744 pl_gram.y:772 +#: pl_gram.y:743 pl_gram.y:771 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "変数 \"%s\" が事前に定義された変数を不可視にしています" -#: pl_gram.y:992 +#: pl_gram.y:1043 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "GET STACKED DIAGNOSTICS では診断項目 %s は許可されていません" -#: pl_gram.y:1010 +#: pl_gram.y:1061 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "GET CURRENT DIAGNOSTICS では診断項目 %s は許可されていません" -#: pl_gram.y:1105 +#: pl_gram.y:1156 msgid "unrecognized GET DIAGNOSTICS item" msgstr "GET DIAGNOSTICS 項目が認識できません" -#: pl_gram.y:1115 pl_gram.y:3549 +#: pl_gram.y:1172 pl_gram.y:3557 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\" はスカラー変数ではありません" -#: pl_gram.y:1369 pl_gram.y:1565 +#: pl_gram.y:1402 pl_gram.y:1596 #, c-format -msgid "" -"loop variable of loop over rows must be a record variable or list of scalar " -"variables" -msgstr "" -"行に対するループでのループ変数は、レコード変数またはスカラー変数のリストでな" -"ければなりません" +msgid "loop variable of loop over rows must be a record variable or list of scalar variables" +msgstr "行に対するループでのループ変数は、レコード変数またはスカラー変数のリストでなければなりません" -#: pl_gram.y:1404 +#: pl_gram.y:1437 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "カーソルを使った FOR ループには、ターゲット変数が1個だけ必要です" -#: pl_gram.y:1411 +#: pl_gram.y:1444 #, c-format msgid "cursor FOR loop must use a bound cursor variable" -msgstr "" -"カーソルを使った FOR ループでは、それに関連付けられたカーソル変数を使用しなけ" -"ればなりません" +msgstr "カーソルを使った FOR ループでは、それに関連付けられたカーソル変数を使用しなければなりません" -#: pl_gram.y:1498 +#: pl_gram.y:1535 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "整数を使った FOR ループには、ターゲット変数が1個だけ必要です" -#: pl_gram.y:1535 +#: pl_gram.y:1569 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "問い合わせを使った FOR ループの中では REVERSE は指定できません" -#: pl_gram.y:1668 +#: pl_gram.y:1699 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" -msgstr "" -"FOREACH のループ変数は、既知の変数または変数のリストでなければなりません" +msgstr "FOREACH のループ変数は、既知の変数または変数のリストでなければなりません" -#: pl_gram.y:1710 +#: pl_gram.y:1741 #, c-format -msgid "" -"there is no label \"%s\" attached to any block or loop enclosing this " -"statement" -msgstr "" -"このステートメントを囲むブロックやループに割り当てられた \"%s\" というラベル" -"はありません。" +msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" +msgstr "このステートメントを囲むブロックやループに割り当てられた \"%s\" というラベルはありません。" -#: pl_gram.y:1718 +#: pl_gram.y:1749 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "ブロックラベル \"%s\" は CONTINUE の中では使えません。" -#: pl_gram.y:1733 +#: pl_gram.y:1764 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "ラベルのない EXIT は、ループの外では使えません" -#: pl_gram.y:1734 +#: pl_gram.y:1765 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE はループの外では使えません" -#: pl_gram.y:1758 pl_gram.y:1796 pl_gram.y:1844 pl_gram.y:2994 pl_gram.y:3079 -#: pl_gram.y:3190 pl_gram.y:3950 +#: pl_gram.y:1789 pl_gram.y:1827 pl_gram.y:1875 pl_gram.y:3004 pl_gram.y:3092 +#: pl_gram.y:3203 pl_gram.y:3956 msgid "unexpected end of function definition" msgstr "予期しない関数定義の終端に達しました" -#: pl_gram.y:1864 pl_gram.y:1888 pl_gram.y:1904 pl_gram.y:1910 pl_gram.y:2029 -#: pl_gram.y:2037 pl_gram.y:2051 pl_gram.y:2146 pl_gram.y:2395 pl_gram.y:2489 -#: pl_gram.y:2648 pl_gram.y:3792 pl_gram.y:3853 pl_gram.y:3931 +#: pl_gram.y:1895 pl_gram.y:1919 pl_gram.y:1935 pl_gram.y:1941 pl_gram.y:2066 +#: pl_gram.y:2074 pl_gram.y:2088 pl_gram.y:2183 pl_gram.y:2407 pl_gram.y:2497 +#: pl_gram.y:2655 pl_gram.y:3799 pl_gram.y:3860 pl_gram.y:3937 msgid "syntax error" msgstr "構文エラー" -#: pl_gram.y:1892 pl_gram.y:1894 pl_gram.y:2399 pl_gram.y:2401 +#: pl_gram.y:1923 pl_gram.y:1925 pl_gram.y:2411 pl_gram.y:2413 msgid "invalid SQLSTATE code" msgstr "無効な SQLSTATE コードです" -#: pl_gram.y:2094 +#: pl_gram.y:2131 msgid "syntax error, expected \"FOR\"" msgstr "構文エラー。\"FOR\" が現れるべきでした。" -#: pl_gram.y:2155 +#: pl_gram.y:2192 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "FETCH ステートメントは複数行を返せません" -#: pl_gram.y:2279 +#: pl_gram.y:2289 #, c-format msgid "cursor variable must be a simple variable" msgstr "カーソル変数は単純変数でなければなりません" -#: pl_gram.y:2285 +#: pl_gram.y:2295 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "変数 \"%s\" は cursor 型または refcursor 型でなければなりません" -#: pl_gram.y:2619 pl_gram.y:2630 +#: pl_gram.y:2626 pl_gram.y:2637 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" は既知の変数ではありません" -#: pl_gram.y:2734 pl_gram.y:2744 pl_gram.y:2899 +#: pl_gram.y:2743 pl_gram.y:2753 pl_gram.y:2909 msgid "mismatched parentheses" msgstr "括弧が対応していません" -#: pl_gram.y:2748 +#: pl_gram.y:2757 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "SQL 表現式の終わりに \"%s\" がありません" -#: pl_gram.y:2754 +#: pl_gram.y:2763 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "SQL ステートメントの終わりに \"%s\" がありません" -#: pl_gram.y:2771 +#: pl_gram.y:2780 msgid "missing expression" msgstr "表現式がありません" -#: pl_gram.y:2773 +#: pl_gram.y:2782 msgid "missing SQL statement" msgstr "SQL ステートメントがありません" -#: pl_gram.y:2901 +#: pl_gram.y:2911 msgid "incomplete data type declaration" msgstr "データ型の定義が不完全です" -#: pl_gram.y:2924 +#: pl_gram.y:2934 msgid "missing data type declaration" msgstr "データ型の定義がありません" -#: pl_gram.y:3002 +#: pl_gram.y:3014 msgid "INTO specified more than once" msgstr "INTO が複数回指定されています" -#: pl_gram.y:3171 +#: pl_gram.y:3184 msgid "expected FROM or IN" msgstr "FROM もしくは IN が来るべきでした" -#: pl_gram.y:3232 +#: pl_gram.y:3245 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "集合を返す関数では、RETURN にパラメータを指定できません" -#: pl_gram.y:3233 +#: pl_gram.y:3246 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "RETURN NEXT もしくは RETURN QUERY を使用してください" -#: pl_gram.y:3243 +#: pl_gram.y:3256 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "プロシージャないのRETURNはパラメータを取ることができません" -#: pl_gram.y:3248 +#: pl_gram.y:3261 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "void を返す関数では、RETURN にパラメータを指定できません" -#: pl_gram.y:3257 +#: pl_gram.y:3270 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "OUT パラメータのない関数では、RETURN にパラメータを指定できません" -#: pl_gram.y:3320 +#: pl_gram.y:3333 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "OUT パラメータ付きの関数では、RETURN NEXT にパラメータを指定できません" -#: pl_gram.y:3428 -#, c-format -msgid "variable \"%s\" is declared CONSTANT" -msgstr "変数\"%s\" はCONSTANTとして定義されています" - -#: pl_gram.y:3491 +#: pl_gram.y:3499 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "レコード変数は、複数項目を持つ INTO リストでは使えません" -#: pl_gram.y:3537 +#: pl_gram.y:3545 #, c-format msgid "too many INTO variables specified" msgstr "INTO 変数の指定が多すぎます" -#: pl_gram.y:3745 +#: pl_gram.y:3753 #, c-format -msgid "end label \"%s\" specified for unlabelled block" -msgstr "ラベル無しブロックで終端ラベル \"%s\" が指定されました" +msgid "end label \"%s\" specified for unlabeled block" +msgstr "終端ラベル\"%s\"がラベルなしのブロックに対して指定されました" -#: pl_gram.y:3752 +#: pl_gram.y:3760 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "終端ラベル \"%s\" がブロックのラベル \"%s\" と異なります" -#: pl_gram.y:3787 +#: pl_gram.y:3794 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "カーソル \"%s\" に引数がありません" -#: pl_gram.y:3801 +#: pl_gram.y:3808 #, c-format msgid "cursor \"%s\" has arguments" msgstr "カーソル \"%s\" に引数がついています" -#: pl_gram.y:3843 +#: pl_gram.y:3850 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "カーソル \"%s\" に \"%s\" という名前の引数がありません" -#: pl_gram.y:3863 +#: pl_gram.y:3870 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "カーソル \"%2$s\" のパラメータ \"%1$s\" の値が複数個指定されました" -#: pl_gram.y:3888 +#: pl_gram.y:3895 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "カーソル \"%s\" の引数が不足しています" -#: pl_gram.y:3895 +#: pl_gram.y:3902 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "カーソル \"%s\" に対する引数が多すぎます" -#: pl_gram.y:3982 +#: pl_gram.y:3988 msgid "unrecognized RAISE statement option" msgstr "RAISE ステートメントのオプションを認識できません" -#: pl_gram.y:3986 +#: pl_gram.y:3992 msgid "syntax error, expected \"=\"" msgstr "構文エラー。\"=\" を期待していました" -#: pl_gram.y:4027 +#: pl_gram.y:4033 #, c-format msgid "too many parameters specified for RAISE" msgstr "RAISE に指定されたパラメーターの数が多すぎます" -#: pl_gram.y:4031 +#: pl_gram.y:4037 #, c-format msgid "too few parameters specified for RAISE" msgstr "RAISE に指定されたパラメーターの数が足りません" -#: pl_handler.c:158 -msgid "" -"Sets handling of conflicts between PL/pgSQL variable names and table column " -"names." +#: pl_handler.c:156 +msgid "Sets handling of conflicts between PL/pgSQL variable names and table column names." msgstr "PL/pgSQL 変数名とテーブルのカラム名の間の衝突時処理を設定します。" -#: pl_handler.c:167 -msgid "" -"Print information about parameters in the DETAIL part of the error messages " -"generated on INTO ... STRICT failures." -msgstr "" -"INTO ... STRICT 失敗時に生成されたエラーメッセージの DETAIL 部分のパラメー" -"ター情報を表示します。" +#: pl_handler.c:165 +msgid "Print information about parameters in the DETAIL part of the error messages generated on INTO ... STRICT failures." +msgstr "INTO ... STRICT 失敗時に生成されたエラーメッセージの DETAIL 部分のパラメーター情報を表示します。" -#: pl_handler.c:175 +#: pl_handler.c:173 msgid "Perform checks given in ASSERT statements." msgstr "ASSERT ステートメントで指定されたチェックを実行します。" -#: pl_handler.c:183 +#: pl_handler.c:181 msgid "List of programming constructs that should produce a warning." msgstr "生成されたプログラムの中で、警告を発生すべき部分の一覧です。" -#: pl_handler.c:193 +#: pl_handler.c:191 msgid "List of programming constructs that should produce an error." msgstr "生成されたプログラムの中で、エラーを発生すべき部分の一覧です。" @@ -886,13 +848,23 @@ msgstr "入力の最後で %s" msgid "%s at or near \"%s\"" msgstr "\"%2$s\" もしくはその近辺で %1$s" +#~ msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +#~ msgstr "配列の次元数(%d)が制限値(%d)を超えています" + +#~ msgid "subscripted object is not an array" +#~ msgstr "添字つきオブジェクトは配列ではありません" + +#~ msgid "array subscript in assignment must not be null" +#~ msgstr "代入における配列の添字が NULL であってはなりません" + +#~ msgid "query \"%s\" returned more than one row" +#~ msgstr "問い合わせ \"%s\" が複数の行を返しました" + #~ msgid "relation \"%s\" is not a table" #~ msgstr "リレーション \"%s\" はテーブルではありません" #~ msgid "variable \"%s\" declared NOT NULL cannot default to NULL" -#~ msgstr "" -#~ "変数 \"%s\" は NOT NULL として宣言されているため、デフォルト値を NULL にす" -#~ "ることはできません" +#~ msgstr "変数 \"%s\" は NOT NULL として宣言されているため、デフォルト値を NULL にすることはできません" #~ msgid "Use a BEGIN block with an EXCEPTION clause instead." #~ msgstr "代わりに EXCEPTION 句を伴う BEGIN ブロックを使用してください" diff --git a/src/pl/plpgsql/src/po/ru.po b/src/pl/plpgsql/src/po/ru.po index 317fbef8d3..c4ffec3086 100644 --- a/src/pl/plpgsql/src/po/ru.po +++ b/src/pl/plpgsql/src/po/ru.po @@ -1,13 +1,13 @@ # Russian message translation file for plpgsql # Copyright (C) 2012-2016 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021. msgid "" msgstr "" "Project-Id-Version: plpgsql (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-02-08 07:28+0300\n" -"PO-Revision-Date: 2020-09-03 15:25+0300\n" +"POT-Creation-Date: 2021-11-08 05:22+0300\n" +"PO-Revision-Date: 2021-09-04 12:39+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -17,99 +17,104 @@ msgstr "" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -#: pl_comp.c:436 pl_handler.c:471 +#: pl_comp.c:438 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "функции PL/pgSQL не могут принимать тип %s" -#: pl_comp.c:526 +#: pl_comp.c:530 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "" "не удалось определить фактический тип результата для полиморфной функции \"%s" "\"" -#: pl_comp.c:556 +#: pl_comp.c:560 #, c-format msgid "trigger functions can only be called as triggers" msgstr "триггерные функции могут вызываться только в триггерах" -#: pl_comp.c:560 pl_handler.c:455 +#: pl_comp.c:564 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "функции PL/pgSQL не могут возвращать тип %s" -#: pl_comp.c:600 +#: pl_comp.c:604 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "у триггерных функций не может быть объявленных аргументов" -#: pl_comp.c:601 +#: pl_comp.c:605 #, c-format msgid "" "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV " "instead." msgstr "" "При необходимости к аргументам триггера можно обращаться через переменные " -"TG_NARGS and TG_ARGV." +"TG_NARGS и TG_ARGV." -#: pl_comp.c:734 +#: pl_comp.c:738 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "у функций событийных триггеров не может быть объявленных аргументов" -#: pl_comp.c:997 +#: pl_comp.c:1002 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "компиляция функции PL/pgSQL \"%s\" в районе строки %d" -#: pl_comp.c:1020 +#: pl_comp.c:1025 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "имя параметра \"%s\" указано неоднократно" -#: pl_comp.c:1132 +#: pl_comp.c:1139 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "неоднозначная ссылка на столбец \"%s\"" -#: pl_comp.c:1134 +#: pl_comp.c:1141 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Подразумевается ссылка на переменную PL/pgSQL или столбец таблицы." -#: pl_comp.c:1317 pl_exec.c:5218 pl_exec.c:5583 pl_exec.c:5670 pl_exec.c:5761 -#: pl_exec.c:6749 +#: pl_comp.c:1324 pl_exec.c:5190 pl_exec.c:5363 pl_exec.c:5450 pl_exec.c:5541 +#: pl_exec.c:6562 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "в записи \"%s\" нет поля \"%s\"" -#: pl_comp.c:1793 +#: pl_comp.c:1818 #, c-format msgid "relation \"%s\" does not exist" msgstr "отношение \"%s\" не существует" -#: pl_comp.c:1891 +#: pl_comp.c:1825 pl_comp.c:1867 +#, c-format +msgid "relation \"%s\" does not have a composite type" +msgstr "отношение \"%s\" не имеет составного типа" + +#: pl_comp.c:1933 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "переменная \"%s\" имеет псевдотип %s" -#: pl_comp.c:2080 +#: pl_comp.c:2122 #, c-format msgid "type \"%s\" is only a shell" -msgstr "тип \"%s\" — лишь пустышка" +msgstr "тип \"%s\" является пустышкой" -#: pl_comp.c:2162 pl_exec.c:7050 +#: pl_comp.c:2204 pl_exec.c:6863 #, c-format msgid "type %s is not composite" msgstr "тип %s не является составным" -#: pl_comp.c:2210 pl_comp.c:2263 +#: pl_comp.c:2252 pl_comp.c:2305 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "нераспознанное условие исключения \"%s\"" -#: pl_comp.c:2484 +#: pl_comp.c:2526 #, c-format msgid "" "could not determine actual argument type for polymorphic function \"%s\"" @@ -117,15 +122,15 @@ msgstr "" "не удалось определить фактический тип аргумента для полиморфной функции \"%s" "\"" -#: pl_exec.c:498 pl_exec.c:935 pl_exec.c:1173 +#: pl_exec.c:500 pl_exec.c:934 pl_exec.c:1169 msgid "during initialization of execution state" msgstr "в процессе инициализации состояния выполнения" -#: pl_exec.c:504 +#: pl_exec.c:506 msgid "while storing call arguments into local variables" msgstr "при сохранении аргументов вызова в локальных переменных" -#: pl_exec.c:592 pl_exec.c:1008 +#: pl_exec.c:594 pl_exec.c:1007 msgid "during function entry" msgstr "при входе в функцию" @@ -134,35 +139,35 @@ msgstr "при входе в функцию" msgid "control reached end of function without RETURN" msgstr "конец функции достигнут без RETURN" -#: pl_exec.c:624 +#: pl_exec.c:623 msgid "while casting return value to function's return type" msgstr "при приведении возвращаемого значения к типу результата функции" -#: pl_exec.c:637 pl_exec.c:3653 +#: pl_exec.c:636 pl_exec.c:3637 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "функция, возвращающая множество, вызвана в контексте, где ему нет места" -#: pl_exec.c:763 pl_exec.c:1037 pl_exec.c:1198 +#: pl_exec.c:762 pl_exec.c:1033 pl_exec.c:1191 msgid "during function exit" msgstr "при выходе из функции" -#: pl_exec.c:818 pl_exec.c:882 pl_exec.c:3498 +#: pl_exec.c:817 pl_exec.c:881 pl_exec.c:3434 msgid "returned record type does not match expected record type" msgstr "возвращаемый тип записи не соответствует ожидаемому" -#: pl_exec.c:1033 pl_exec.c:1194 +#: pl_exec.c:1030 pl_exec.c:1188 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "конец триггерной процедуры достигнут без RETURN" -#: pl_exec.c:1042 +#: pl_exec.c:1038 #, c-format msgid "trigger procedure cannot return a set" msgstr "триггерная процедура не может возвращать множество" -#: pl_exec.c:1081 pl_exec.c:1109 +#: pl_exec.c:1077 pl_exec.c:1105 msgid "" "returned row structure does not match the structure of the triggering table" msgstr "" @@ -172,7 +177,7 @@ msgstr "" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1244 +#: pl_exec.c:1237 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "функция PL/pgSQL %s, строка %d, %s" @@ -180,39 +185,39 @@ msgstr "функция PL/pgSQL %s, строка %d, %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1255 +#: pl_exec.c:1248 #, c-format msgid "PL/pgSQL function %s %s" msgstr "функция PL/pgSQL %s, %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1263 +#: pl_exec.c:1256 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "функция PL/pgSQL %s, строка %d, оператор %s" -#: pl_exec.c:1269 +#: pl_exec.c:1262 #, c-format msgid "PL/pgSQL function %s" msgstr "функция PL/pgSQL %s" -#: pl_exec.c:1607 +#: pl_exec.c:1633 msgid "during statement block local variable initialization" msgstr "при инициализации локальной переменной в блоке операторов" -#: pl_exec.c:1705 +#: pl_exec.c:1731 msgid "during statement block entry" msgstr "при входе в блок операторов" -#: pl_exec.c:1737 +#: pl_exec.c:1763 msgid "during statement block exit" msgstr "при выходе из блока операторов" -#: pl_exec.c:1775 +#: pl_exec.c:1801 msgid "during exception cleanup" msgstr "при очистке после исключения" -#: pl_exec.c:2304 +#: pl_exec.c:2334 #, c-format msgid "" "procedure parameter \"%s\" is an output parameter but corresponding argument " @@ -221,7 +226,7 @@ msgstr "" "параметр процедуры \"%s\" является выходным, но соответствующий аргумент не " "допускает запись" -#: pl_exec.c:2309 +#: pl_exec.c:2339 #, c-format msgid "" "procedure parameter %d is an output parameter but corresponding argument is " @@ -230,199 +235,199 @@ msgstr "" "параметр процедуры %d является выходным, но соответствующий аргумент не " "допускает запись" -#: pl_exec.c:2437 +#: pl_exec.c:2373 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "" "GET STACKED DIAGNOSTICS нельзя использовать вне блока обработчика исключения" -#: pl_exec.c:2637 +#: pl_exec.c:2573 #, c-format msgid "case not found" msgstr "неправильный CASE" -#: pl_exec.c:2638 +#: pl_exec.c:2574 #, c-format msgid "CASE statement is missing ELSE part." msgstr "В операторе CASE не хватает части ELSE." -#: pl_exec.c:2731 +#: pl_exec.c:2667 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "нижняя граница цикла FOR не может быть равна NULL" -#: pl_exec.c:2747 +#: pl_exec.c:2683 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "верхняя граница цикла FOR не может быть равна NULL" -#: pl_exec.c:2765 +#: pl_exec.c:2701 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "значение BY в цикле FOR не может быть равно NULL" -#: pl_exec.c:2771 +#: pl_exec.c:2707 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "значение BY в цикле FOR должно быть больше нуля" -#: pl_exec.c:2905 pl_exec.c:4632 +#: pl_exec.c:2841 pl_exec.c:4626 #, c-format msgid "cursor \"%s\" already in use" msgstr "курсор \"%s\" уже используется" -#: pl_exec.c:2928 pl_exec.c:4697 +#: pl_exec.c:2864 pl_exec.c:4691 #, c-format msgid "arguments given for cursor without arguments" msgstr "курсору без аргументов были переданы аргументы" -#: pl_exec.c:2947 pl_exec.c:4716 +#: pl_exec.c:2883 pl_exec.c:4710 #, c-format msgid "arguments required for cursor" msgstr "курсору требуются аргументы" -#: pl_exec.c:3034 +#: pl_exec.c:2970 #, c-format msgid "FOREACH expression must not be null" msgstr "выражение FOREACH не может быть равно NULL" -#: pl_exec.c:3049 +#: pl_exec.c:2985 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "выражение в FOREACH должно быть массивом, но не типом %s" -#: pl_exec.c:3066 +#: pl_exec.c:3002 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "размерность среза (%d) вне допустимого диапазона 0..%d" -#: pl_exec.c:3093 +#: pl_exec.c:3029 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "переменная цикла FOREACH ... SLICE должна быть массивом" -#: pl_exec.c:3097 +#: pl_exec.c:3033 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "переменная цикла FOREACH не должна быть массивом" -#: pl_exec.c:3259 pl_exec.c:3316 pl_exec.c:3491 +#: pl_exec.c:3195 pl_exec.c:3252 pl_exec.c:3427 #, c-format msgid "" "cannot return non-composite value from function returning composite type" msgstr "" "функция, возвращающая составной тип, не может вернуть несоставное значение" -#: pl_exec.c:3355 pl_gram.y:3307 +#: pl_exec.c:3291 pl_gram.y:3310 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "" "RETURN NEXT можно использовать только в функциях, возвращающих множества" -#: pl_exec.c:3396 pl_exec.c:3528 +#: pl_exec.c:3332 pl_exec.c:3464 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "в RETURN NEXT передан неправильный тип результата" -#: pl_exec.c:3434 pl_exec.c:3455 +#: pl_exec.c:3370 pl_exec.c:3391 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "в RETURN NEXT передан неправильный тип записи" -#: pl_exec.c:3547 +#: pl_exec.c:3483 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "у оператора RETURN NEXT должен быть параметр" -#: pl_exec.c:3573 pl_gram.y:3371 +#: pl_exec.c:3511 pl_gram.y:3374 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "" "RETURN QUERY можно использовать только в функциях, возвращающих множества" -#: pl_exec.c:3597 +#: pl_exec.c:3529 msgid "structure of query does not match function result type" msgstr "структура запроса не соответствует типу результата функции" -#: pl_exec.c:3681 pl_exec.c:3819 +#: pl_exec.c:3584 pl_exec.c:4404 pl_exec.c:8604 +#, c-format +msgid "query string argument of EXECUTE is null" +msgstr "в качестве текста запроса в EXECUTE передан NULL" + +#: pl_exec.c:3665 pl_exec.c:3803 #, c-format msgid "RAISE option already specified: %s" msgstr "этот параметр RAISE уже указан: %s" -#: pl_exec.c:3715 +#: pl_exec.c:3699 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "" "RAISE без параметров нельзя использовать вне блока обработчика исключения" -#: pl_exec.c:3809 +#: pl_exec.c:3793 #, c-format msgid "RAISE statement option cannot be null" msgstr "параметром оператора RAISE не может быть NULL" -#: pl_exec.c:3879 +#: pl_exec.c:3863 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3934 +#: pl_exec.c:3918 #, c-format msgid "assertion failed" msgstr "нарушение истинности" -#: pl_exec.c:4281 pl_exec.c:4471 +#: pl_exec.c:4277 pl_exec.c:4465 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "в PL/pgSQL нельзя выполнить COPY с участием клиента" -#: pl_exec.c:4287 +#: pl_exec.c:4283 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "неподдерживаемая транзакционная команда в PL/pgSQL" -#: pl_exec.c:4310 pl_exec.c:4500 +#: pl_exec.c:4306 pl_exec.c:4494 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO с командой не может возвращать данные" -#: pl_exec.c:4333 pl_exec.c:4523 +#: pl_exec.c:4329 pl_exec.c:4517 #, c-format msgid "query returned no rows" msgstr "запрос не вернул строк" -#: pl_exec.c:4355 pl_exec.c:4542 +#: pl_exec.c:4351 pl_exec.c:4536 pl_exec.c:5685 #, c-format msgid "query returned more than one row" msgstr "запрос вернул несколько строк" -#: pl_exec.c:4357 +#: pl_exec.c:4353 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "" "Измените запрос, чтобы он выбирал одну строку, или используйте LIMIT 1." -#: pl_exec.c:4373 +#: pl_exec.c:4369 #, c-format msgid "query has no destination for result data" msgstr "в запросе нет назначения для данных результата" -#: pl_exec.c:4374 +#: pl_exec.c:4370 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "Если вам нужно отбросить результаты SELECT, используйте PERFORM." -#: pl_exec.c:4407 pl_exec.c:8729 -#, c-format -msgid "query string argument of EXECUTE is null" -msgstr "в качестве текста запроса в EXECUTE передан NULL" - -#: pl_exec.c:4463 +#: pl_exec.c:4457 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "возможность выполнения SELECT ... INTO в EXECUTE не реализована" # skip-rule: space-before-ellipsis -#: pl_exec.c:4464 +#: pl_exec.c:4458 #, c-format msgid "" "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS " @@ -431,85 +436,75 @@ msgstr "" "Альтернативой может стать EXECUTE ... INTO или EXECUTE CREATE TABLE ... " "AS ..." -#: pl_exec.c:4477 +#: pl_exec.c:4471 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE с транзакционными командами не поддерживается" -#: pl_exec.c:4778 pl_exec.c:4866 +#: pl_exec.c:4772 pl_exec.c:4860 #, c-format msgid "cursor variable \"%s\" is null" msgstr "переменная курсора \"%s\" равна NULL" -#: pl_exec.c:4789 pl_exec.c:4877 +#: pl_exec.c:4783 pl_exec.c:4871 #, c-format msgid "cursor \"%s\" does not exist" msgstr "курсор \"%s\" не существует" -#: pl_exec.c:4802 +#: pl_exec.c:4796 #, c-format msgid "relative or absolute cursor position is null" msgstr "относительная или абсолютная позиция курсора равна NULL" -#: pl_exec.c:5068 pl_exec.c:5163 +#: pl_exec.c:5040 pl_exec.c:5135 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "значение NULL нельзя присвоить переменной \"%s\", объявленной NOT NULL" -#: pl_exec.c:5144 +#: pl_exec.c:5116 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "переменной типа кортеж можно присвоить только составное значение" -#: pl_exec.c:5176 +#: pl_exec.c:5148 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "переменной типа запись можно присвоить только составное значение" -#: pl_exec.c:5227 +#: pl_exec.c:5199 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "присвоить значение системному столбцу \"%s\" нельзя" -#: pl_exec.c:5291 -#, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "число размерностей массива (%d) превышает предел (%d)" - -#: pl_exec.c:5323 -#, c-format -msgid "subscripted object is not an array" -msgstr "для объекта указан индекс, но этот объект - не массив" - -#: pl_exec.c:5361 +#: pl_exec.c:5648 #, c-format -msgid "array subscript in assignment must not be null" -msgstr "индекс элемента массива в присваивании не может быть NULL" +msgid "query did not return data" +msgstr "запрос не вернул данные" -#: pl_exec.c:5868 +#: pl_exec.c:5649 pl_exec.c:5661 pl_exec.c:5686 pl_exec.c:5762 pl_exec.c:5767 #, c-format -msgid "query \"%s\" did not return data" -msgstr "запрос \"%s\" не вернул данные" +msgid "query: %s" +msgstr "запрос: %s" -#: pl_exec.c:5876 +#: pl_exec.c:5657 #, c-format -msgid "query \"%s\" returned %d column" -msgid_plural "query \"%s\" returned %d columns" -msgstr[0] "запрос \"%s\" вернул %d столбец" -msgstr[1] "запрос \"%s\" вернул %d столбца" -msgstr[2] "запрос \"%s\" вернул %d столбцов" +msgid "query returned %d column" +msgid_plural "query returned %d columns" +msgstr[0] "запрос вернул %d столбец" +msgstr[1] "запрос вернул %d столбца" +msgstr[2] "запрос вернул %d столбцов" -#: pl_exec.c:5904 +#: pl_exec.c:5761 #, c-format -msgid "query \"%s\" returned more than one row" -msgstr "запрос \"%s\" вернул несколько строк" +msgid "query is SELECT INTO, but it should be plain SELECT" +msgstr "запрос - не просто SELECT, а SELECT INTO" -#: pl_exec.c:5967 +#: pl_exec.c:5766 #, c-format -msgid "query \"%s\" is not a SELECT" -msgstr "запрос \"%s\" - не SELECT" +msgid "query is not a SELECT" +msgstr "запрос - не SELECT" -#: pl_exec.c:6763 pl_exec.c:6803 pl_exec.c:6843 +#: pl_exec.c:6576 pl_exec.c:6616 pl_exec.c:6656 #, c-format msgid "" "type of parameter %d (%s) does not match that when preparing the plan (%s)" @@ -517,29 +512,29 @@ msgstr "" "тип параметра %d (%s) не соответствует тому, с которым подготавливался план " "(%s)" -#: pl_exec.c:7254 pl_exec.c:7288 pl_exec.c:7362 pl_exec.c:7388 +#: pl_exec.c:7067 pl_exec.c:7101 pl_exec.c:7175 pl_exec.c:7201 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "в левой и правой части присваивания разное количество полей" #. translator: %s represents a name of an extra check -#: pl_exec.c:7256 pl_exec.c:7290 pl_exec.c:7364 pl_exec.c:7390 +#: pl_exec.c:7069 pl_exec.c:7103 pl_exec.c:7177 pl_exec.c:7203 #, c-format msgid "%s check of %s is active." msgstr "Включена проверка %s (с %s)." -#: pl_exec.c:7260 pl_exec.c:7294 pl_exec.c:7368 pl_exec.c:7394 +#: pl_exec.c:7073 pl_exec.c:7107 pl_exec.c:7181 pl_exec.c:7207 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "" "Измените запрос, чтобы он возвращал в точности требуемый список столбцов." -#: pl_exec.c:7781 +#: pl_exec.c:7594 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "записи \"%s\" не присвоено значение" -#: pl_exec.c:7782 +#: pl_exec.c:7595 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "" @@ -577,57 +572,57 @@ msgstr "SQL-оператор" msgid "FOR over EXECUTE statement" msgstr "FOR по результатам EXECUTE" -#: pl_gram.y:489 +#: pl_gram.y:485 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "метка блока должна помещаться до DECLARE, а не после" -#: pl_gram.y:509 +#: pl_gram.y:505 #, c-format msgid "collations are not supported by type %s" msgstr "тип %s не поддерживает сортировку (COLLATION)" -#: pl_gram.y:528 +#: pl_gram.y:524 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "" "у переменной \"%s\" должно быть значение по умолчанию, так как она объявлена " "как NOT NULL" -#: pl_gram.y:675 pl_gram.y:690 pl_gram.y:716 +#: pl_gram.y:672 pl_gram.y:687 pl_gram.y:713 #, c-format msgid "variable \"%s\" does not exist" msgstr "переменная \"%s\" не существует" -#: pl_gram.y:734 pl_gram.y:762 +#: pl_gram.y:731 pl_gram.y:759 msgid "duplicate declaration" msgstr "повторяющееся объявление" -#: pl_gram.y:745 pl_gram.y:773 +#: pl_gram.y:742 pl_gram.y:770 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "переменная \"%s\" скрывает ранее определённую переменную" -#: pl_gram.y:993 +#: pl_gram.y:1042 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "команда GET STACKED DIAGNOSTICS не принимает элемент %s" -#: pl_gram.y:1011 +#: pl_gram.y:1060 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "команда GET CURRENT DIAGNOSTICS не принимает элемент %s" -#: pl_gram.y:1106 +#: pl_gram.y:1155 msgid "unrecognized GET DIAGNOSTICS item" msgstr "нераспознанный элемент GET DIAGNOSTICS" -#: pl_gram.y:1116 pl_gram.y:3551 +#: pl_gram.y:1171 pl_gram.y:3549 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\" - не скалярная переменная" -#: pl_gram.y:1368 pl_gram.y:1565 +#: pl_gram.y:1401 pl_gram.y:1595 #, c-format msgid "" "loop variable of loop over rows must be a record variable or list of scalar " @@ -636,234 +631,234 @@ msgstr "" "переменная цикла по кортежам должна быть переменной типа запись или списком " "скалярных переменных" -#: pl_gram.y:1403 +#: pl_gram.y:1436 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "в цикле FOR с курсором должна быть только одна переменная" -#: pl_gram.y:1410 +#: pl_gram.y:1443 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "" "в цикле FOR с курсором должен использоваться курсор, привязанный к запросу" -#: pl_gram.y:1497 +#: pl_gram.y:1534 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "в целочисленном цикле FOR должна быть только одна переменная" -#: pl_gram.y:1535 +#: pl_gram.y:1568 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "в цикле FOR с запросом нельзя указать REVERSE" -#: pl_gram.y:1668 +#: pl_gram.y:1698 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "" "переменной цикла FOREACH должна быть известная переменная или список " "переменных" -#: pl_gram.y:1710 +#: pl_gram.y:1740 #, c-format msgid "" "there is no label \"%s\" attached to any block or loop enclosing this " "statement" msgstr "в блоке или цикле, окружающем этот оператор, нет метки \"%s\"" -#: pl_gram.y:1718 +#: pl_gram.y:1748 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "метку блока \"%s\" нельзя использовать в CONTINUE" -#: pl_gram.y:1733 +#: pl_gram.y:1763 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT можно использовать вне цикла только с указанием метки" -#: pl_gram.y:1734 +#: pl_gram.y:1764 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE нельзя использовать вне цикла" -#: pl_gram.y:1758 pl_gram.y:1796 pl_gram.y:1844 pl_gram.y:2996 pl_gram.y:3081 -#: pl_gram.y:3192 pl_gram.y:3955 +#: pl_gram.y:1788 pl_gram.y:1826 pl_gram.y:1874 pl_gram.y:2998 pl_gram.y:3084 +#: pl_gram.y:3195 pl_gram.y:3948 msgid "unexpected end of function definition" msgstr "неожиданный конец определения функции" -#: pl_gram.y:1864 pl_gram.y:1888 pl_gram.y:1904 pl_gram.y:1910 pl_gram.y:2029 -#: pl_gram.y:2037 pl_gram.y:2051 pl_gram.y:2146 pl_gram.y:2397 pl_gram.y:2491 -#: pl_gram.y:2650 pl_gram.y:3797 pl_gram.y:3858 pl_gram.y:3936 +#: pl_gram.y:1894 pl_gram.y:1918 pl_gram.y:1934 pl_gram.y:1940 pl_gram.y:2061 +#: pl_gram.y:2069 pl_gram.y:2083 pl_gram.y:2178 pl_gram.y:2402 pl_gram.y:2492 +#: pl_gram.y:2649 pl_gram.y:3791 pl_gram.y:3852 pl_gram.y:3929 msgid "syntax error" msgstr "ошибка синтаксиса" -#: pl_gram.y:1892 pl_gram.y:1894 pl_gram.y:2401 pl_gram.y:2403 +#: pl_gram.y:1922 pl_gram.y:1924 pl_gram.y:2406 pl_gram.y:2408 msgid "invalid SQLSTATE code" msgstr "неверный код SQLSTATE" -#: pl_gram.y:2094 +#: pl_gram.y:2126 msgid "syntax error, expected \"FOR\"" msgstr "ошибка синтаксиса, ожидался \"FOR\"" -#: pl_gram.y:2155 +#: pl_gram.y:2187 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "оператор FETCH не может вернуть несколько строк" -#: pl_gram.y:2279 +#: pl_gram.y:2284 #, c-format msgid "cursor variable must be a simple variable" msgstr "переменная-курсор должна быть простой переменной" -#: pl_gram.y:2285 +#: pl_gram.y:2290 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "переменная \"%s\" должна быть типа cursor или refcursor" -#: pl_gram.y:2621 pl_gram.y:2632 +#: pl_gram.y:2620 pl_gram.y:2631 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" - не известная переменная" -#: pl_gram.y:2736 pl_gram.y:2746 pl_gram.y:2901 +#: pl_gram.y:2737 pl_gram.y:2747 pl_gram.y:2903 msgid "mismatched parentheses" msgstr "непарные скобки" -#: pl_gram.y:2750 +#: pl_gram.y:2751 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "отсутствует \"%s\" в конце выражения SQL" -#: pl_gram.y:2756 +#: pl_gram.y:2757 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "отсутствует \"%s\" в конце оператора SQL" -#: pl_gram.y:2773 +#: pl_gram.y:2774 msgid "missing expression" msgstr "отсутствует выражение" -#: pl_gram.y:2775 +#: pl_gram.y:2776 msgid "missing SQL statement" msgstr "отсутствует оператор SQL" -#: pl_gram.y:2903 +#: pl_gram.y:2905 msgid "incomplete data type declaration" msgstr "неполное определение типа данных" -#: pl_gram.y:2926 +#: pl_gram.y:2928 msgid "missing data type declaration" msgstr "отсутствует определение типа данных" -#: pl_gram.y:3004 +#: pl_gram.y:3006 msgid "INTO specified more than once" msgstr "INTO указано неоднократно" -#: pl_gram.y:3173 +#: pl_gram.y:3176 msgid "expected FROM or IN" msgstr "ожидалось FROM или IN" -#: pl_gram.y:3234 +#: pl_gram.y:3237 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "в функции, возвращающей множество, RETURN должен быть без параметров" -#: pl_gram.y:3235 +#: pl_gram.y:3238 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Используйте RETURN NEXT или RETURN QUERY." -#: pl_gram.y:3245 +#: pl_gram.y:3248 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "в процедуре RETURN должен быть без параметров" -#: pl_gram.y:3250 +#: pl_gram.y:3253 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "в функции, не возвращающей ничего, RETURN не должен иметь параметров" -#: pl_gram.y:3259 +#: pl_gram.y:3262 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN должен быть без параметров в функции с параметрами OUT" -#: pl_gram.y:3322 +#: pl_gram.y:3325 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "RETURN NEXT должен быть без параметров в функции с параметрами OUT" -#: pl_gram.y:3430 +#: pl_gram.y:3433 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "переменная \"%s\" объявлена как CONSTANT" -#: pl_gram.y:3493 +#: pl_gram.y:3491 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "" "переменная типа запись не может быть частью списка INTO с несколькими " "элементами" -#: pl_gram.y:3539 +#: pl_gram.y:3537 #, c-format msgid "too many INTO variables specified" msgstr "указано слишком много переменных INTO" -#: pl_gram.y:3750 +#: pl_gram.y:3745 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "конечная метка \"%s\" указана для непомеченного блока" -#: pl_gram.y:3757 +#: pl_gram.y:3752 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "конечная метка \"%s\" отличается от метки блока \"%s\"" -#: pl_gram.y:3792 +#: pl_gram.y:3786 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "курсор \"%s\" не имеет аргументов" -#: pl_gram.y:3806 +#: pl_gram.y:3800 #, c-format msgid "cursor \"%s\" has arguments" msgstr "курсор \"%s\" имеет аргументы" -#: pl_gram.y:3848 +#: pl_gram.y:3842 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "курсор \"%s\" не имеет аргумента \"%s\"" -#: pl_gram.y:3868 +#: pl_gram.y:3862 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "значение параметра \"%s\" курсора \"%s\" указано неоднократно" -#: pl_gram.y:3893 +#: pl_gram.y:3887 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "недостаточно аргументов для курсора \"%s\"" -#: pl_gram.y:3900 +#: pl_gram.y:3894 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "слишком много аргументов для курсора \"%s\"" -#: pl_gram.y:3987 +#: pl_gram.y:3980 msgid "unrecognized RAISE statement option" msgstr "нераспознанный параметр оператора RAISE" -#: pl_gram.y:3991 +#: pl_gram.y:3984 msgid "syntax error, expected \"=\"" msgstr "ошибка синтаксиса, ожидалось \"=\"" -#: pl_gram.y:4032 +#: pl_gram.y:4025 #, c-format msgid "too many parameters specified for RAISE" msgstr "слишком много параметров для RAISE" -#: pl_gram.y:4036 +#: pl_gram.y:4029 #, c-format msgid "too few parameters specified for RAISE" msgstr "недостаточно параметров для RAISE" @@ -909,6 +904,18 @@ msgstr "%s в конце" msgid "%s at or near \"%s\"" msgstr "%s (примерное положение: \"%s\")" +#~ msgid "query \"%s\" returned more than one row" +#~ msgstr "запрос \"%s\" вернул несколько строк" + +#~ msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +#~ msgstr "число размерностей массива (%d) превышает предел (%d)" + +#~ msgid "subscripted object is not an array" +#~ msgstr "для объекта указан индекс, но этот объект - не массив" + +#~ msgid "array subscript in assignment must not be null" +#~ msgstr "индекс элемента массива в присваивании не может быть NULL" + #~ msgid "relation \"%s\" is not a table" #~ msgstr "отношение \"%s\" не является таблицей" diff --git a/src/pl/plpgsql/src/po/sv.po b/src/pl/plpgsql/src/po/sv.po index 1e55336851..8f051446b1 100644 --- a/src/pl/plpgsql/src/po/sv.po +++ b/src/pl/plpgsql/src/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for plpgsql # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-06-21 02:08+0000\n" -"PO-Revision-Date: 2020-06-21 11:27+0200\n" +"POT-Creation-Date: 2022-04-11 13:39+0000\n" +"PO-Revision-Date: 2022-04-11 16:02+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,106 +17,111 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: pl_comp.c:436 pl_handler.c:471 +#: pl_comp.c:438 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "PL/pgSQL-funktioner kan inte acceptera typ %s" -#: pl_comp.c:526 +#: pl_comp.c:530 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "kunde inte bestämma aktuell returtyp för polymorfisk funktion \"%s\"" -#: pl_comp.c:556 +#: pl_comp.c:560 #, c-format msgid "trigger functions can only be called as triggers" msgstr "utlösarfunktioner kan bara anropas som utlösare" -#: pl_comp.c:560 pl_handler.c:455 +#: pl_comp.c:564 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "PL/pgSQL-funktioner kan inte returnera typ %s" -#: pl_comp.c:600 +#: pl_comp.c:604 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "utlösarfunktioner kan inte ha deklarerade argument" -#: pl_comp.c:601 +#: pl_comp.c:605 #, c-format msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." msgstr "Argumenten till utlösaren kan accessas via TG_NARGS och TG_ARGV istället." -#: pl_comp.c:734 +#: pl_comp.c:738 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "händelseutlösarfunktioner kan inte ha deklarerade argument" -#: pl_comp.c:997 +#: pl_comp.c:1002 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "kompilering av PL/pgSQL-funktion \"%s\" nära rad %d" -#: pl_comp.c:1020 +#: pl_comp.c:1025 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "parameternamn \"%s\" angivet mer än en gång" -#: pl_comp.c:1132 +#: pl_comp.c:1139 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "kolumnreferens \"%s\" är tvetydig" -#: pl_comp.c:1134 +#: pl_comp.c:1141 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Det kan referera till antingen en PL/pgSQL-variabel eller en tabellkolumn." -#: pl_comp.c:1317 pl_exec.c:5169 pl_exec.c:5534 pl_exec.c:5621 pl_exec.c:5712 -#: pl_exec.c:6700 +#: pl_comp.c:1324 pl_exec.c:5216 pl_exec.c:5389 pl_exec.c:5476 pl_exec.c:5567 +#: pl_exec.c:6588 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "post \"%s\" saknar fält \"%s\"" -#: pl_comp.c:1793 +#: pl_comp.c:1818 #, c-format msgid "relation \"%s\" does not exist" msgstr "relationen \"%s\" existerar inte" -#: pl_comp.c:1891 +#: pl_comp.c:1825 pl_comp.c:1867 +#, c-format +msgid "relation \"%s\" does not have a composite type" +msgstr "relationen \"%s\" har inte en composite-typ" + +#: pl_comp.c:1933 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "variabel \"%s\" har pseudotyp %s" -#: pl_comp.c:2080 +#: pl_comp.c:2122 #, c-format msgid "type \"%s\" is only a shell" msgstr "typ \"%s\" är bara ett skal" -#: pl_comp.c:2162 pl_exec.c:7001 +#: pl_comp.c:2204 pl_exec.c:6889 #, c-format msgid "type %s is not composite" msgstr "typen %s är inte composite" -#: pl_comp.c:2210 pl_comp.c:2263 +#: pl_comp.c:2252 pl_comp.c:2305 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "okänt avbrottsvillkor \"%s\"" -#: pl_comp.c:2484 +#: pl_comp.c:2526 #, c-format msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "kunde inte bestämma argumenttyp för polymorfisk funktion function \"%s\"" -#: pl_exec.c:498 pl_exec.c:935 pl_exec.c:1173 +#: pl_exec.c:500 pl_exec.c:939 pl_exec.c:1174 msgid "during initialization of execution state" msgstr "unde initiering av körtillstånd" -#: pl_exec.c:504 +#: pl_exec.c:506 msgid "while storing call arguments into local variables" msgstr "under sparande av anropsargument till lokala variabler" -#: pl_exec.c:592 pl_exec.c:1008 +#: pl_exec.c:594 pl_exec.c:1012 msgid "during function entry" msgstr "under funktionsingången" @@ -125,41 +130,46 @@ msgstr "under funktionsingången" msgid "control reached end of function without RETURN" msgstr "kontrollen nådde slutet av funktionen utan RETURN" -#: pl_exec.c:624 +#: pl_exec.c:623 msgid "while casting return value to function's return type" msgstr "under typomvandling av returvärde till funktionens returtyp" -#: pl_exec.c:637 pl_exec.c:3604 +#: pl_exec.c:635 pl_exec.c:3656 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "en funktion som returnerar en mängd anropades i kontext som inte godtar en mängd" -#: pl_exec.c:763 pl_exec.c:1037 pl_exec.c:1198 +#: pl_exec.c:640 pl_exec.c:3662 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "materialiserat läge krävs, men stöds inte i detta kontext" + +#: pl_exec.c:767 pl_exec.c:1038 pl_exec.c:1196 msgid "during function exit" msgstr "under funktionsavslutning" -#: pl_exec.c:818 pl_exec.c:882 pl_exec.c:3449 +#: pl_exec.c:822 pl_exec.c:886 pl_exec.c:3455 msgid "returned record type does not match expected record type" msgstr "returnerad posttyp matchar inte förväntad posttyp" -#: pl_exec.c:1033 pl_exec.c:1194 +#: pl_exec.c:1035 pl_exec.c:1193 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "kontroll nådde slutet på utlösarprocedur utan RETURN" -#: pl_exec.c:1042 +#: pl_exec.c:1043 #, c-format msgid "trigger procedure cannot return a set" msgstr "utlösarprocedur kan inte returnera en mängd" -#: pl_exec.c:1081 pl_exec.c:1109 +#: pl_exec.c:1082 pl_exec.c:1110 msgid "returned row structure does not match the structure of the triggering table" msgstr "returnerad radstruktur matchar inte strukturen på utlösande tabell" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1244 +#: pl_exec.c:1251 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "PL/pgSQL-funktion %s rad %d %s" @@ -167,341 +177,331 @@ msgstr "PL/pgSQL-funktion %s rad %d %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1255 +#: pl_exec.c:1262 #, c-format msgid "PL/pgSQL function %s %s" msgstr "PL/pgSQL-funktion %s %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1263 +#: pl_exec.c:1270 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "PL/pgSQL-funktion %s rad %d vid %s" -#: pl_exec.c:1269 +#: pl_exec.c:1276 #, c-format msgid "PL/pgSQL function %s" msgstr "PL/pgSQL-funktion %s" -#: pl_exec.c:1607 +#: pl_exec.c:1647 msgid "during statement block local variable initialization" msgstr "under initiering av lokala variabler i satsblock" -#: pl_exec.c:1705 +#: pl_exec.c:1752 msgid "during statement block entry" msgstr "under ingång till satsblock" -#: pl_exec.c:1737 +#: pl_exec.c:1784 msgid "during statement block exit" msgstr "under satsblockavslutning" -#: pl_exec.c:1775 +#: pl_exec.c:1822 msgid "during exception cleanup" msgstr "under avbrottsuppstädning" -#: pl_exec.c:2271 +#: pl_exec.c:2355 #, c-format msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" msgstr "procedurparameter \"%s\" är en utdataparameter men motsvarande argument är inte skrivbar" -#: pl_exec.c:2276 +#: pl_exec.c:2360 #, c-format msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" msgstr "procedurparameter %d är en utdataparameter men motsvarande argument är inte skrivbar" -#: pl_exec.c:2388 +#: pl_exec.c:2394 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS kan inte användas utanför en avbrottshanterare" -#: pl_exec.c:2588 +#: pl_exec.c:2594 #, c-format msgid "case not found" msgstr "hittade inte alternativ" -#: pl_exec.c:2589 +#: pl_exec.c:2595 #, c-format msgid "CASE statement is missing ELSE part." msgstr "CASE-sats saknar ELSE-del." -#: pl_exec.c:2682 +#: pl_exec.c:2688 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "lägre gräns i FOR-loop kan inte vara null" -#: pl_exec.c:2698 +#: pl_exec.c:2704 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "övre gräns i FOR-loop kan inte vara null" -#: pl_exec.c:2716 +#: pl_exec.c:2722 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "BY-värde i FOR-loop kan inte vara null" -#: pl_exec.c:2722 +#: pl_exec.c:2728 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "BY-värde i FOR-loop måste vara större än noll" -#: pl_exec.c:2856 pl_exec.c:4583 +#: pl_exec.c:2862 pl_exec.c:4658 #, c-format msgid "cursor \"%s\" already in use" msgstr "markören \"%s\" används redan" -#: pl_exec.c:2879 pl_exec.c:4648 +#: pl_exec.c:2885 pl_exec.c:4723 #, c-format msgid "arguments given for cursor without arguments" msgstr "argument angivna till markör utan argumnet" -#: pl_exec.c:2898 pl_exec.c:4667 +#: pl_exec.c:2904 pl_exec.c:4742 #, c-format msgid "arguments required for cursor" msgstr "argument krävs för markör" -#: pl_exec.c:2985 +#: pl_exec.c:2991 #, c-format msgid "FOREACH expression must not be null" msgstr "FOREACH-uttryck får inte vara null" -#: pl_exec.c:3000 +#: pl_exec.c:3006 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "FOREACH-uttryck måste ge en array, inte typ %s" -#: pl_exec.c:3017 +#: pl_exec.c:3023 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "slice-storlek (%d) är utanför giltigt intervall 0..%d" -#: pl_exec.c:3044 +#: pl_exec.c:3050 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "FOREACH ... SLICE-loop-variabel måste ha typen array" -#: pl_exec.c:3048 +#: pl_exec.c:3054 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "FOREACH-loop-variable får inte ha typen array" -#: pl_exec.c:3210 pl_exec.c:3267 pl_exec.c:3442 +#: pl_exec.c:3216 pl_exec.c:3273 pl_exec.c:3448 #, c-format msgid "cannot return non-composite value from function returning composite type" msgstr "kan inte returnera icke-composit-värde från funktion med returtyp composit" -#: pl_exec.c:3306 pl_gram.y:3309 +#: pl_exec.c:3312 pl_gram.y:3318 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "kan inte använda RETURN NEXT i en icke-SETOF-funktion" -#: pl_exec.c:3347 pl_exec.c:3479 +#: pl_exec.c:3353 pl_exec.c:3485 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "fel resultattyp given i RETURN NEXT" -#: pl_exec.c:3385 pl_exec.c:3406 +#: pl_exec.c:3391 pl_exec.c:3412 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "fel posttyp given i RETURN NEXT" -#: pl_exec.c:3498 +#: pl_exec.c:3504 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT måste ha en parameter" -#: pl_exec.c:3524 pl_gram.y:3373 +#: pl_exec.c:3532 pl_gram.y:3382 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "kan inte använda RETURN QUERY i en icke-SETOF-funktion" -#: pl_exec.c:3548 +#: pl_exec.c:3550 msgid "structure of query does not match function result type" msgstr "strukturen på frågan matchar inte funktionens resultattyp" -#: pl_exec.c:3632 pl_exec.c:3770 +#: pl_exec.c:3605 pl_exec.c:4435 pl_exec.c:8630 +#, c-format +msgid "query string argument of EXECUTE is null" +msgstr "frågesträngargumentet till EXECUTE är null" + +#: pl_exec.c:3690 pl_exec.c:3828 #, c-format msgid "RAISE option already specified: %s" msgstr "RAISE-flagga redan angiven: %s" -#: pl_exec.c:3666 +#: pl_exec.c:3724 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "RAISE utan parametrar kan inte användas utanför en avbrottshanterare" -#: pl_exec.c:3760 +#: pl_exec.c:3818 #, c-format msgid "RAISE statement option cannot be null" msgstr "RAISE-satsens flagga får inte vare null" -#: pl_exec.c:3830 +#: pl_exec.c:3888 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3885 +#: pl_exec.c:3943 #, c-format msgid "assertion failed" msgstr "assert misslyckades" -#: pl_exec.c:4232 pl_exec.c:4422 +#: pl_exec.c:4308 pl_exec.c:4497 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "kan inte COPY till/från klient i PL/pgSQL" -#: pl_exec.c:4238 +#: pl_exec.c:4314 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "transaktionskommando saknar stöd i PL/pgSQL" -#: pl_exec.c:4261 pl_exec.c:4451 +#: pl_exec.c:4337 pl_exec.c:4526 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO använd med ett kommando som inte returnerar data" -#: pl_exec.c:4284 pl_exec.c:4474 +#: pl_exec.c:4360 pl_exec.c:4549 #, c-format msgid "query returned no rows" msgstr "frågan returnerade inga rader" -#: pl_exec.c:4306 pl_exec.c:4493 +#: pl_exec.c:4382 pl_exec.c:4568 pl_exec.c:5711 #, c-format msgid "query returned more than one row" msgstr "frågan returnerade mer än en rad" -#: pl_exec.c:4308 +#: pl_exec.c:4384 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "Se till att frågan returerar exakt en rad eller använd LIMIT 1." -#: pl_exec.c:4324 +#: pl_exec.c:4400 #, c-format msgid "query has no destination for result data" msgstr "frågan har ingen destination för resultatdatan" -#: pl_exec.c:4325 +#: pl_exec.c:4401 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "Om du vill slänga resultatet av en SELECT, använd PERFORM istället." -#: pl_exec.c:4358 pl_exec.c:8680 -#, c-format -msgid "query string argument of EXECUTE is null" -msgstr "frågesträngargumentet till EXECUTE är null" - -#: pl_exec.c:4414 +#: pl_exec.c:4489 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "EXECUTE för SELECT ... INTO är inte implementerad" -#: pl_exec.c:4415 +#: pl_exec.c:4490 #, c-format msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." msgstr "Du vill nog använda EXECUTE ... INTO eller EXECUTE CREATE TABLE ... AS istället." -#: pl_exec.c:4428 +#: pl_exec.c:4503 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE på transaktionskommanon är inte implementerat" -#: pl_exec.c:4729 pl_exec.c:4817 +#: pl_exec.c:4804 pl_exec.c:4892 #, c-format msgid "cursor variable \"%s\" is null" msgstr "markörvariabel \"%s\" är null" -#: pl_exec.c:4740 pl_exec.c:4828 +#: pl_exec.c:4815 pl_exec.c:4903 #, c-format msgid "cursor \"%s\" does not exist" msgstr "markör \"%s\" existerar inte" -#: pl_exec.c:4753 +#: pl_exec.c:4828 #, c-format msgid "relative or absolute cursor position is null" msgstr "relativ eller absolut markörposition är null" -#: pl_exec.c:5019 pl_exec.c:5114 +#: pl_exec.c:5066 pl_exec.c:5161 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "null-value kan inte tilldelas till variabel \"%s\" som deklarerats NOT NULL" -#: pl_exec.c:5095 +#: pl_exec.c:5142 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "kan inte tilldela icke-composite-värde till radvariabel" -#: pl_exec.c:5127 +#: pl_exec.c:5174 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "kan inte tilldela icke-composite-värde till en post-variabel" -#: pl_exec.c:5178 +#: pl_exec.c:5225 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "kan inte skriva till systemkolumn \"%s\"" -#: pl_exec.c:5242 -#, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "antalet array-dimensioner (%d) överskrider det maximalt tillåtna (%d)" - -#: pl_exec.c:5274 -#, c-format -msgid "subscripted object is not an array" -msgstr "arrayindexobjekt är inte en array" - -#: pl_exec.c:5312 +#: pl_exec.c:5674 #, c-format -msgid "array subscript in assignment must not be null" -msgstr "arrayindex i tilldelning kan inte vara null" +msgid "query did not return data" +msgstr "frågan returnerade ingen data" -#: pl_exec.c:5819 +#: pl_exec.c:5675 pl_exec.c:5687 pl_exec.c:5712 pl_exec.c:5788 pl_exec.c:5793 #, c-format -msgid "query \"%s\" did not return data" -msgstr "frågan \"%s\" returnerade ingen data" +msgid "query: %s" +msgstr "fråga: %s" -#: pl_exec.c:5827 +#: pl_exec.c:5683 #, c-format -msgid "query \"%s\" returned %d column" -msgid_plural "query \"%s\" returned %d columns" -msgstr[0] "frågan \"%s\" returnerade %d kolumn" -msgstr[1] "frågan \"%s\" returnerade %d kolumner" +msgid "query returned %d column" +msgid_plural "query returned %d columns" +msgstr[0] "frågan returnerade %d kolumn" +msgstr[1] "frågan returnerade %d kolumner" -#: pl_exec.c:5855 +#: pl_exec.c:5787 #, c-format -msgid "query \"%s\" returned more than one row" -msgstr "frågan \"%s\" returnerade mer än en rad" +msgid "query is SELECT INTO, but it should be plain SELECT" +msgstr "frågan är SELECT INTO men skall vara en vanlig SELECT" -#: pl_exec.c:5918 +#: pl_exec.c:5792 #, c-format -msgid "query \"%s\" is not a SELECT" -msgstr "frågan \"%s\" är inte en SELECT" +msgid "query is not a SELECT" +msgstr "frågan är inte en SELECT" -#: pl_exec.c:6714 pl_exec.c:6754 pl_exec.c:6794 +#: pl_exec.c:6602 pl_exec.c:6642 pl_exec.c:6682 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "typen av parameter %d (%s) matchar inte det som var vid preparerande av plan (%s)" -#: pl_exec.c:7205 pl_exec.c:7239 pl_exec.c:7313 pl_exec.c:7339 +#: pl_exec.c:7093 pl_exec.c:7127 pl_exec.c:7201 pl_exec.c:7227 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "antal käll- och mål-fält i tilldelningen matchar inte" #. translator: %s represents a name of an extra check -#: pl_exec.c:7207 pl_exec.c:7241 pl_exec.c:7315 pl_exec.c:7341 +#: pl_exec.c:7095 pl_exec.c:7129 pl_exec.c:7203 pl_exec.c:7229 #, c-format msgid "%s check of %s is active." msgstr "%s kontroll av %s är aktiv." -#: pl_exec.c:7211 pl_exec.c:7245 pl_exec.c:7319 pl_exec.c:7345 +#: pl_exec.c:7099 pl_exec.c:7133 pl_exec.c:7207 pl_exec.c:7233 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "Se till att frågan returerar exakt rätt lista med kolumner." -#: pl_exec.c:7732 +#: pl_exec.c:7620 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "posten \"%s\" är inte tilldelad än" -#: pl_exec.c:7733 +#: pl_exec.c:7621 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "Tuple-strukturen av en ej-ännu-tilldelad post är obestämd." @@ -538,232 +538,232 @@ msgstr "SQL-sats" msgid "FOR over EXECUTE statement" msgstr "FOR över EXECUTE-sats" -#: pl_gram.y:489 +#: pl_gram.y:486 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "blocketikett måste anges före DECLARE, inte efter" -#: pl_gram.y:509 +#: pl_gram.y:506 #, c-format msgid "collations are not supported by type %s" msgstr "jämförelser stöds inte för typ %s" -#: pl_gram.y:528 +#: pl_gram.y:525 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "variabel \"%s\" måste ha ett default-värde då det inte deklarerats som NOT NULL" -#: pl_gram.y:675 pl_gram.y:690 pl_gram.y:716 +#: pl_gram.y:673 pl_gram.y:688 pl_gram.y:714 #, c-format msgid "variable \"%s\" does not exist" msgstr "variabel \"%s\" finns inte" -#: pl_gram.y:734 pl_gram.y:762 +#: pl_gram.y:732 pl_gram.y:760 msgid "duplicate declaration" msgstr "duplicerad deklaration" -#: pl_gram.y:745 pl_gram.y:773 +#: pl_gram.y:743 pl_gram.y:771 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "variabeln \"%s\" döljer en tidigare definierad variabel" -#: pl_gram.y:993 +#: pl_gram.y:1043 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "diagnostikdel %s tillåts inte i GET STACKED DIAGNOSTICS" -#: pl_gram.y:1011 +#: pl_gram.y:1061 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "diagnostikdel %s tillåts inte i GET CURRENT DIAGNOSTICS" -#: pl_gram.y:1106 +#: pl_gram.y:1156 msgid "unrecognized GET DIAGNOSTICS item" msgstr "okänd GET DIAGNOSTICS-del" -#: pl_gram.y:1116 pl_gram.y:3553 +#: pl_gram.y:1172 pl_gram.y:3557 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\" är inte ett skalärt värde" -#: pl_gram.y:1370 pl_gram.y:1567 +#: pl_gram.y:1402 pl_gram.y:1596 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "loop-variabeln för loop över rader måste vara en postvariabel eller en lista av skalärvariabler" -#: pl_gram.y:1405 +#: pl_gram.y:1437 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "markör-FOR-loop måste ha exakt en målvariabel" -#: pl_gram.y:1412 +#: pl_gram.y:1444 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "markör-FOR-loop måste använda en bunden markörvariabel" -#: pl_gram.y:1499 +#: pl_gram.y:1535 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "heltals-FOR-loop måste ha exakt en målvariabel" -#: pl_gram.y:1537 +#: pl_gram.y:1569 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "kan inte ange REVERSE i fråge-FOR-loop" -#: pl_gram.y:1670 +#: pl_gram.y:1699 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "loop-variabel för FOREACH måste vara en känd variabel eller lista av variabler" -#: pl_gram.y:1712 +#: pl_gram.y:1741 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "det finns ingen etikett \"%s\" kopplad till något block eller loop-omslutning i denna sats" -#: pl_gram.y:1720 +#: pl_gram.y:1749 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "blocketikett \"%s\" kan inte användas i CONTINUE" -#: pl_gram.y:1735 +#: pl_gram.y:1764 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT kan inte användas utanför en loop, om den inte har en etikett" -#: pl_gram.y:1736 +#: pl_gram.y:1765 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE kan inte användas utanför en loop" -#: pl_gram.y:1760 pl_gram.y:1798 pl_gram.y:1846 pl_gram.y:2998 pl_gram.y:3083 -#: pl_gram.y:3194 pl_gram.y:3957 +#: pl_gram.y:1789 pl_gram.y:1827 pl_gram.y:1875 pl_gram.y:3004 pl_gram.y:3092 +#: pl_gram.y:3203 pl_gram.y:3956 msgid "unexpected end of function definition" msgstr "oväntat slut på funktionsdefinitionen" -#: pl_gram.y:1866 pl_gram.y:1890 pl_gram.y:1906 pl_gram.y:1912 pl_gram.y:2031 -#: pl_gram.y:2039 pl_gram.y:2053 pl_gram.y:2148 pl_gram.y:2399 pl_gram.y:2493 -#: pl_gram.y:2652 pl_gram.y:3799 pl_gram.y:3860 pl_gram.y:3938 +#: pl_gram.y:1895 pl_gram.y:1919 pl_gram.y:1935 pl_gram.y:1941 pl_gram.y:2066 +#: pl_gram.y:2074 pl_gram.y:2088 pl_gram.y:2183 pl_gram.y:2407 pl_gram.y:2497 +#: pl_gram.y:2655 pl_gram.y:3799 pl_gram.y:3860 pl_gram.y:3937 msgid "syntax error" msgstr "syntaxfel" -#: pl_gram.y:1894 pl_gram.y:1896 pl_gram.y:2403 pl_gram.y:2405 +#: pl_gram.y:1923 pl_gram.y:1925 pl_gram.y:2411 pl_gram.y:2413 msgid "invalid SQLSTATE code" msgstr "ogiltig SQLSTATE-kod" -#: pl_gram.y:2096 +#: pl_gram.y:2131 msgid "syntax error, expected \"FOR\"" msgstr "syntaxfel, förväntade \"FOR\"" -#: pl_gram.y:2157 +#: pl_gram.y:2192 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "FETCH-sats kan inte returnera multipla rader" -#: pl_gram.y:2281 +#: pl_gram.y:2289 #, c-format msgid "cursor variable must be a simple variable" msgstr "markörvariabel måste vara en enkel variabel" -#: pl_gram.y:2287 +#: pl_gram.y:2295 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "variabel \"%s\" måste ha typen cursor eller refcursor" -#: pl_gram.y:2623 pl_gram.y:2634 +#: pl_gram.y:2626 pl_gram.y:2637 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" är inte en känd variabel" -#: pl_gram.y:2738 pl_gram.y:2748 pl_gram.y:2903 +#: pl_gram.y:2743 pl_gram.y:2753 pl_gram.y:2909 msgid "mismatched parentheses" msgstr "missmatchade parenteser" -#: pl_gram.y:2752 +#: pl_gram.y:2757 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "saknar \"%s\" vid slutet av SQL-uttryck" -#: pl_gram.y:2758 +#: pl_gram.y:2763 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "saknar \"%s\" vid slutet av SQL-sats" -#: pl_gram.y:2775 +#: pl_gram.y:2780 msgid "missing expression" msgstr "saknar uttryck" -#: pl_gram.y:2777 +#: pl_gram.y:2782 msgid "missing SQL statement" msgstr "saknars SQL-sats" -#: pl_gram.y:2905 +#: pl_gram.y:2911 msgid "incomplete data type declaration" msgstr "inkomplett datatypdeklaration" -#: pl_gram.y:2928 +#: pl_gram.y:2934 msgid "missing data type declaration" msgstr "saknar datatypdeklaration" -#: pl_gram.y:3006 +#: pl_gram.y:3014 msgid "INTO specified more than once" msgstr "INTO angiven mer än en gång" -#: pl_gram.y:3175 +#: pl_gram.y:3184 msgid "expected FROM or IN" msgstr "förväntade FROM eller IN" -#: pl_gram.y:3236 +#: pl_gram.y:3245 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "RETURN kan inte ha en parameter i funktion som returnerar en mängd" -#: pl_gram.y:3237 +#: pl_gram.y:3246 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Använd RETURN NEXT eller RETURN QUERY." -#: pl_gram.y:3247 +#: pl_gram.y:3256 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "RETURN kan inte ha en parameter i en procedur" -#: pl_gram.y:3252 +#: pl_gram.y:3261 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "RETURN kan inte ha en parameter i funktion som returnerar void" -#: pl_gram.y:3261 +#: pl_gram.y:3270 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN kan inte ha en parameter i en funktion med OUT-parameterar" -#: pl_gram.y:3324 +#: pl_gram.y:3333 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "RETURN NEXT kan inte ha en parameter i funktion med OUT-parametrar" -#: pl_gram.y:3432 +#: pl_gram.y:3441 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "variabel \"%s\" är deklarerad CONSTANT" -#: pl_gram.y:3495 +#: pl_gram.y:3499 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "postvariabel kan inte vara del av en multipel-INTO-lista" -#: pl_gram.y:3541 +#: pl_gram.y:3545 #, c-format msgid "too many INTO variables specified" msgstr "för många INTO-variabler angivna" -#: pl_gram.y:3752 +#: pl_gram.y:3753 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "slutetikett \"%s\" angiven för block utan etikett" -#: pl_gram.y:3759 +#: pl_gram.y:3760 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "slutetikett \"%s\" stämmer inte med blockets etikett \"%s\"" @@ -798,20 +798,20 @@ msgstr "ej tillräckligt med argument för markör \"%s\"" msgid "too many arguments for cursor \"%s\"" msgstr "fär många argument för markör \"%s\"" -#: pl_gram.y:3989 +#: pl_gram.y:3988 msgid "unrecognized RAISE statement option" msgstr "okänd RAISE-sats-flagga" -#: pl_gram.y:3993 +#: pl_gram.y:3992 msgid "syntax error, expected \"=\"" msgstr "syntaxfel, förväntade \"=\"" -#: pl_gram.y:4034 +#: pl_gram.y:4033 #, c-format msgid "too many parameters specified for RAISE" msgstr "för många parametrar angivna för RAISE" -#: pl_gram.y:4038 +#: pl_gram.y:4037 #, c-format msgid "too few parameters specified for RAISE" msgstr "för få parametrar angivna för RAISE" diff --git a/src/pl/plpgsql/src/po/uk.po b/src/pl/plpgsql/src/po/uk.po index d3a381c3aa..b7ee4750fb 100644 --- a/src/pl/plpgsql/src/po/uk.po +++ b/src/pl/plpgsql/src/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:09+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" +"POT-Creation-Date: 2021-08-17 08:39+0000\n" +"PO-Revision-Date: 2021-08-17 10:54\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,109 +14,114 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/plpgsql.pot\n" -"X-Crowdin-File-ID: 518\n" +"X-Crowdin-File: /REL_14_DEV/plpgsql.pot\n" +"X-Crowdin-File-ID: 758\n" -#: pl_comp.c:436 pl_handler.c:471 +#: pl_comp.c:438 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "Функції PL/pgSQl не можуть приймати тип %s" -#: pl_comp.c:526 +#: pl_comp.c:530 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "не вдалося визначити фактичний тип результату поліморфної функції \"%s\"" -#: pl_comp.c:556 +#: pl_comp.c:560 #, c-format msgid "trigger functions can only be called as triggers" msgstr "тригер-функція може викликатися лише як тригер" -#: pl_comp.c:560 pl_handler.c:455 +#: pl_comp.c:564 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "Функції PL/pgSQL не можуть повертати тип %s" -#: pl_comp.c:600 +#: pl_comp.c:604 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "тригер-функції не можуть мати задекларованих аргументи" -#: pl_comp.c:601 +#: pl_comp.c:605 #, c-format msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." msgstr "Аргументи тригеру доступні через TG_NARGS та TG_ARGV замість цього." -#: pl_comp.c:734 +#: pl_comp.c:738 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "функції тригерів подій не можуть мати задекларовані аргументи" -#: pl_comp.c:997 +#: pl_comp.c:1002 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "компіляція функції PL/pgSQL \"%s\" біля рядка %d" -#: pl_comp.c:1020 +#: pl_comp.c:1025 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "ім'я параметру «%s» використано декілька разів" -#: pl_comp.c:1132 +#: pl_comp.c:1137 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "посилання на стовпець \"%s\" є неоднозначним" -#: pl_comp.c:1134 +#: pl_comp.c:1139 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Це може відноситися до змінної PL/pgSQL або стовпця таблиці." -#: pl_comp.c:1317 pl_exec.c:5169 pl_exec.c:5534 pl_exec.c:5621 pl_exec.c:5712 -#: pl_exec.c:6700 +#: pl_comp.c:1322 pl_exec.c:5189 pl_exec.c:5362 pl_exec.c:5449 pl_exec.c:5540 +#: pl_exec.c:6547 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "запис \"%s\" не має поля \"%s\"" -#: pl_comp.c:1793 +#: pl_comp.c:1816 #, c-format msgid "relation \"%s\" does not exist" msgstr "відношення \"%s\" не існує" -#: pl_comp.c:1891 +#: pl_comp.c:1823 pl_comp.c:1865 +#, c-format +msgid "relation \"%s\" does not have a composite type" +msgstr "відношення \"%s\" не має складеного типу" + +#: pl_comp.c:1931 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "змінна \"%s\" має псевдотип %s" -#: pl_comp.c:2080 +#: pl_comp.c:2120 #, c-format msgid "type \"%s\" is only a shell" msgstr "тип \"%s\" є лише оболонкою" -#: pl_comp.c:2162 pl_exec.c:7001 +#: pl_comp.c:2202 pl_exec.c:6848 #, c-format msgid "type %s is not composite" msgstr "тип %s не є складеним" -#: pl_comp.c:2210 pl_comp.c:2263 +#: pl_comp.c:2250 pl_comp.c:2303 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "нерозпізнана умова виключення \"%s\"" -#: pl_comp.c:2484 +#: pl_comp.c:2524 #, c-format msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "не вдалося визначити фактичний тип аргумента поліморфної функції \"%s\"" -#: pl_exec.c:498 pl_exec.c:935 pl_exec.c:1173 +#: pl_exec.c:500 pl_exec.c:934 pl_exec.c:1169 msgid "during initialization of execution state" msgstr "під час ініціалізації стану виконання" -#: pl_exec.c:504 +#: pl_exec.c:506 msgid "while storing call arguments into local variables" msgstr "під час зберігання аргументів виклику до локальних змінних" -#: pl_exec.c:592 pl_exec.c:1008 +#: pl_exec.c:594 pl_exec.c:1007 msgid "during function entry" msgstr "під час входу до функції" @@ -125,41 +130,41 @@ msgstr "під час входу до функції" msgid "control reached end of function without RETURN" msgstr "досягнуто кінця функції без RETURN" -#: pl_exec.c:624 +#: pl_exec.c:623 msgid "while casting return value to function's return type" msgstr "під час приведення значення, що повертається, до типу результата функції" -#: pl_exec.c:637 pl_exec.c:3604 +#: pl_exec.c:636 pl_exec.c:3636 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "функція \"set-valued\" викликана в контексті, де йому немає місця" -#: pl_exec.c:763 pl_exec.c:1037 pl_exec.c:1198 +#: pl_exec.c:762 pl_exec.c:1033 pl_exec.c:1191 msgid "during function exit" msgstr "під час виходу з функції" -#: pl_exec.c:818 pl_exec.c:882 pl_exec.c:3449 +#: pl_exec.c:817 pl_exec.c:881 pl_exec.c:3434 msgid "returned record type does not match expected record type" msgstr "тип запису, що повертається, не відповідає очікуваному типу" -#: pl_exec.c:1033 pl_exec.c:1194 +#: pl_exec.c:1030 pl_exec.c:1188 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "досягнуто кінця тригерної процедури без RETURN" -#: pl_exec.c:1042 +#: pl_exec.c:1038 #, c-format msgid "trigger procedure cannot return a set" msgstr "тригерна процедура не може повернути набір" -#: pl_exec.c:1081 pl_exec.c:1109 +#: pl_exec.c:1077 pl_exec.c:1105 msgid "returned row structure does not match the structure of the triggering table" msgstr "структура рядка, що повертається, не відповідає структурі таблиці, яка викликала тригер" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1244 +#: pl_exec.c:1237 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "Функція PL/pgSQL %s рядок %d %s" @@ -167,298 +172,288 @@ msgstr "Функція PL/pgSQL %s рядок %d %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1255 +#: pl_exec.c:1248 #, c-format msgid "PL/pgSQL function %s %s" msgstr "Функція PL/pgSQL %s %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1263 +#: pl_exec.c:1256 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "Функція PL/pgSQL %s рядок %d в %s" -#: pl_exec.c:1269 +#: pl_exec.c:1262 #, c-format msgid "PL/pgSQL function %s" msgstr "Функція PL/pgSQL %s" -#: pl_exec.c:1607 +#: pl_exec.c:1633 msgid "during statement block local variable initialization" msgstr "під час ініціалізації локальної змінної в блоці операторів" -#: pl_exec.c:1705 +#: pl_exec.c:1731 msgid "during statement block entry" msgstr "під час входу в блок операторів" -#: pl_exec.c:1737 +#: pl_exec.c:1763 msgid "during statement block exit" msgstr "під час виходу з блоку операторів" -#: pl_exec.c:1775 +#: pl_exec.c:1801 msgid "during exception cleanup" msgstr "під час очищення винятку" -#: pl_exec.c:2271 +#: pl_exec.c:2334 #, c-format msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" msgstr "параметр процедури \"%s\" є вихідним, але відповідний аргумент не допускає запис" -#: pl_exec.c:2276 +#: pl_exec.c:2339 #, c-format msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" msgstr "параметр процедури %d є вихідним, але відповідний аргумент не допускає запис" -#: pl_exec.c:2388 +#: pl_exec.c:2373 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS не може використовуватись поза блоком обробника винятків" -#: pl_exec.c:2588 +#: pl_exec.c:2573 #, c-format msgid "case not found" msgstr "гілку не знайдено" -#: pl_exec.c:2589 +#: pl_exec.c:2574 #, c-format msgid "CASE statement is missing ELSE part." msgstr "В операторі CASE пропущено частину ELSE." -#: pl_exec.c:2682 +#: pl_exec.c:2667 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "нижня границя циклу FOR не може бути null" -#: pl_exec.c:2698 +#: pl_exec.c:2683 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "верхня границя циклу FOR не може бути null" -#: pl_exec.c:2716 +#: pl_exec.c:2701 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "Значення BY циклу FOR не може бути null" -#: pl_exec.c:2722 +#: pl_exec.c:2707 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "Значення BY циклу FOR повинно бути більше нуля" -#: pl_exec.c:2856 pl_exec.c:4583 +#: pl_exec.c:2841 pl_exec.c:4625 #, c-format msgid "cursor \"%s\" already in use" msgstr "курсор \"%s\" вже використовується" -#: pl_exec.c:2879 pl_exec.c:4648 +#: pl_exec.c:2864 pl_exec.c:4690 #, c-format msgid "arguments given for cursor without arguments" msgstr "аргументи, надані курсору без аргументів" -#: pl_exec.c:2898 pl_exec.c:4667 +#: pl_exec.c:2883 pl_exec.c:4709 #, c-format msgid "arguments required for cursor" msgstr "аргументи, необхідні для курсора" -#: pl_exec.c:2985 +#: pl_exec.c:2970 #, c-format msgid "FOREACH expression must not be null" msgstr "Вираз FOREACH не може бути null" -#: pl_exec.c:3000 +#: pl_exec.c:2985 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "Вираз в FOREACH повинен бути масивом, не типом %s" -#: pl_exec.c:3017 +#: pl_exec.c:3002 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "розмір зрізу (%d) поза припустимим діапазоном 0..%d" -#: pl_exec.c:3044 +#: pl_exec.c:3029 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "Змінна циклу FOREACH ... SLICE повинна бути масивом" -#: pl_exec.c:3048 +#: pl_exec.c:3033 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "Змінна циклу FOREACH не повинна бути масивом" -#: pl_exec.c:3210 pl_exec.c:3267 pl_exec.c:3442 +#: pl_exec.c:3195 pl_exec.c:3252 pl_exec.c:3427 #, c-format msgid "cannot return non-composite value from function returning composite type" msgstr "функція, що повертає складений тип, не може повернути не складене значення" -#: pl_exec.c:3306 pl_gram.y:3309 +#: pl_exec.c:3291 pl_gram.y:3310 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "не можна використовувати RETURN NEXT в функціях, що не повертають набори даних" -#: pl_exec.c:3347 pl_exec.c:3479 +#: pl_exec.c:3332 pl_exec.c:3464 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "в RETURN NEXT вказано неправильний тип результату" -#: pl_exec.c:3385 pl_exec.c:3406 +#: pl_exec.c:3370 pl_exec.c:3391 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "в RETURN NEXT вказано неправильний тип запису" -#: pl_exec.c:3498 +#: pl_exec.c:3483 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT повинен мати параметр" -#: pl_exec.c:3524 pl_gram.y:3373 +#: pl_exec.c:3511 pl_gram.y:3374 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "не можна використовувати RETURN QUERY в функціях, що не повертають набір" -#: pl_exec.c:3548 +#: pl_exec.c:3529 msgid "structure of query does not match function result type" msgstr "структура запиту не відповідає типу результата функції" -#: pl_exec.c:3632 pl_exec.c:3770 +#: pl_exec.c:3562 pl_exec.c:5753 +#, c-format +msgid "query \"%s\" is not a SELECT" +msgstr "запит \"%s\" не є SELECT" + +#: pl_exec.c:3584 pl_exec.c:4403 pl_exec.c:8589 +#, c-format +msgid "query string argument of EXECUTE is null" +msgstr "текстовий аргумент запиту EXECUTE є null" + +#: pl_exec.c:3664 pl_exec.c:3802 #, c-format msgid "RAISE option already specified: %s" msgstr "Параметр RAISE вже вказано: %s" -#: pl_exec.c:3666 +#: pl_exec.c:3698 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "RAISE без параметрів не можна використовувати поза блоком обробника винятків" -#: pl_exec.c:3760 +#: pl_exec.c:3792 #, c-format msgid "RAISE statement option cannot be null" msgstr "Параметром оператора RAISE не може бути null" -#: pl_exec.c:3830 +#: pl_exec.c:3862 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3885 +#: pl_exec.c:3917 #, c-format msgid "assertion failed" msgstr "порушення істинності" -#: pl_exec.c:4232 pl_exec.c:4422 +#: pl_exec.c:4276 pl_exec.c:4464 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "в PL/pgSQL не можна виконати COPY за участю клієнта" -#: pl_exec.c:4238 +#: pl_exec.c:4282 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "непідтримувана транзакційна команда в PL/pgSQL" -#: pl_exec.c:4261 pl_exec.c:4451 +#: pl_exec.c:4305 pl_exec.c:4493 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO використаний з командою, що не може повертати дані" -#: pl_exec.c:4284 pl_exec.c:4474 +#: pl_exec.c:4328 pl_exec.c:4516 #, c-format msgid "query returned no rows" msgstr "запит не повернув рядки" -#: pl_exec.c:4306 pl_exec.c:4493 +#: pl_exec.c:4350 pl_exec.c:4535 #, c-format msgid "query returned more than one row" msgstr "запит повернув декілька рядків" -#: pl_exec.c:4308 +#: pl_exec.c:4352 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "Переконайтеся, що запит повертає один рядок, або використовуйте LIMIT 1." -#: pl_exec.c:4324 +#: pl_exec.c:4368 #, c-format msgid "query has no destination for result data" msgstr "запит не має призначення для даних результату" -#: pl_exec.c:4325 +#: pl_exec.c:4369 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "Якщо ви хочете відкинути результати SELECT, використайте PERFORM." -#: pl_exec.c:4358 pl_exec.c:8680 -#, c-format -msgid "query string argument of EXECUTE is null" -msgstr "текстовий аргумент запиту EXECUTE є null" - -#: pl_exec.c:4414 +#: pl_exec.c:4456 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "EXECUTE виразу SELECT ... INTO не реалізовано" -#: pl_exec.c:4415 +#: pl_exec.c:4457 #, c-format msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." msgstr "Альтернативою може стати EXECUTE ... INTO або EXECUTE CREATE TABLE ... AS." -#: pl_exec.c:4428 +#: pl_exec.c:4470 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE з транзакційними командами не реалізовано" -#: pl_exec.c:4729 pl_exec.c:4817 +#: pl_exec.c:4771 pl_exec.c:4859 #, c-format msgid "cursor variable \"%s\" is null" msgstr "змінна курсора \"%s\" дорівнює null" -#: pl_exec.c:4740 pl_exec.c:4828 +#: pl_exec.c:4782 pl_exec.c:4870 #, c-format msgid "cursor \"%s\" does not exist" msgstr "курсор \"%s\" не існує" -#: pl_exec.c:4753 +#: pl_exec.c:4795 #, c-format msgid "relative or absolute cursor position is null" msgstr "відносна або абсолютна позиція курсора дорівнює null" -#: pl_exec.c:5019 pl_exec.c:5114 +#: pl_exec.c:5039 pl_exec.c:5134 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "значення null не можна призначити змінній \"%s\", оголошеній NOT NULL" -#: pl_exec.c:5095 +#: pl_exec.c:5115 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "змінній типу кортеж можна призначити лише складене значення" -#: pl_exec.c:5127 +#: pl_exec.c:5147 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "змінній типу запис можна призначити лише складене значення" -#: pl_exec.c:5178 +#: pl_exec.c:5198 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "призначити значення системному стовпцю \"%s\" не можна" -#: pl_exec.c:5242 -#, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "число вимірів масива (%d) перевищує ліміт (%d)" - -#: pl_exec.c:5274 -#, c-format -msgid "subscripted object is not an array" -msgstr "для об'єкта вказано індекс, але цей об'єкт не є масивом" - -#: pl_exec.c:5312 -#, c-format -msgid "array subscript in assignment must not be null" -msgstr "підрядковий символ масиву у призначенні не може бути NULL" - -#: pl_exec.c:5819 +#: pl_exec.c:5647 #, c-format msgid "query \"%s\" did not return data" msgstr "запит \"%s\" не повернув дані" -#: pl_exec.c:5827 +#: pl_exec.c:5655 #, c-format msgid "query \"%s\" returned %d column" msgid_plural "query \"%s\" returned %d columns" @@ -467,43 +462,38 @@ msgstr[1] "запит \"%s\" повернув %d колонки" msgstr[2] "запит \"%s\" повернув %d колонок" msgstr[3] "запит \"%s\" повернув %d колонки" -#: pl_exec.c:5855 +#: pl_exec.c:5683 #, c-format msgid "query \"%s\" returned more than one row" msgstr "запит \"%s\" повернув декілька рядків" -#: pl_exec.c:5918 -#, c-format -msgid "query \"%s\" is not a SELECT" -msgstr "запит \"%s\" не є SELECT" - -#: pl_exec.c:6714 pl_exec.c:6754 pl_exec.c:6794 +#: pl_exec.c:6561 pl_exec.c:6601 pl_exec.c:6641 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "тип параметру %d (%s) не відповідає тому, з котрим тривала підготовка плану (%s)" -#: pl_exec.c:7205 pl_exec.c:7239 pl_exec.c:7313 pl_exec.c:7339 +#: pl_exec.c:7052 pl_exec.c:7086 pl_exec.c:7160 pl_exec.c:7186 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "кількість вихідних і цільових полів у присвоюванні не збігається" #. translator: %s represents a name of an extra check -#: pl_exec.c:7207 pl_exec.c:7241 pl_exec.c:7315 pl_exec.c:7341 +#: pl_exec.c:7054 pl_exec.c:7088 pl_exec.c:7162 pl_exec.c:7188 #, c-format msgid "%s check of %s is active." msgstr "%s перевірка %s активна." -#: pl_exec.c:7211 pl_exec.c:7245 pl_exec.c:7319 pl_exec.c:7345 +#: pl_exec.c:7058 pl_exec.c:7092 pl_exec.c:7166 pl_exec.c:7192 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "Переконайтеся, що запит повертає точний список стовпців." -#: pl_exec.c:7732 +#: pl_exec.c:7579 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "запис \"%s\" ще не призначено" -#: pl_exec.c:7733 +#: pl_exec.c:7580 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "Для запису, котрому не призначене значення, структура кортежа не визначена." @@ -540,162 +530,162 @@ msgstr "SQL-оператор" msgid "FOR over EXECUTE statement" msgstr "FOR за результатами EXECUTE" -#: pl_gram.y:489 +#: pl_gram.y:485 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "мітка блоку повинна бути розміщена до DECLARE, а не після" -#: pl_gram.y:509 +#: pl_gram.y:505 #, c-format msgid "collations are not supported by type %s" msgstr "тип %s не підтримує правила сортування" -#: pl_gram.y:528 +#: pl_gram.y:524 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "змінна \"%s\" повинна мати значення за замовчуванням після того, як вона оголошена як NOT NULL" -#: pl_gram.y:675 pl_gram.y:690 pl_gram.y:716 +#: pl_gram.y:672 pl_gram.y:687 pl_gram.y:713 #, c-format msgid "variable \"%s\" does not exist" msgstr "змінної \"%s\" не існує" -#: pl_gram.y:734 pl_gram.y:762 +#: pl_gram.y:731 pl_gram.y:759 msgid "duplicate declaration" msgstr "дублікат оголошення" -#: pl_gram.y:745 pl_gram.y:773 +#: pl_gram.y:742 pl_gram.y:770 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "змінна \"%s\" приховує раніше оголошену змінну" -#: pl_gram.y:993 +#: pl_gram.y:1042 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "команда GET STACKED DIAGNOSTICS не дозволяє елемент діагностування %s" -#: pl_gram.y:1011 +#: pl_gram.y:1060 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "команда GET CURRENT DIAGNOSTICS не дозволяє елемент діагностування %s" -#: pl_gram.y:1106 +#: pl_gram.y:1155 msgid "unrecognized GET DIAGNOSTICS item" msgstr "нерозпізнаний елемент GET DIAGNOSTICS" -#: pl_gram.y:1116 pl_gram.y:3553 +#: pl_gram.y:1171 pl_gram.y:3549 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\" не є скалярною змінною" -#: pl_gram.y:1370 pl_gram.y:1567 +#: pl_gram.y:1401 pl_gram.y:1595 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "змінна циклу по кортежах повинна бути змінною типу запис або списком скалярних змінних" -#: pl_gram.y:1405 +#: pl_gram.y:1436 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "курсор в циклі FOR повинен мати лише одну цільову змінну" -#: pl_gram.y:1412 +#: pl_gram.y:1443 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "цикл курсора FOR повинен використовувати обмежуючу змінну курсора" -#: pl_gram.y:1499 +#: pl_gram.y:1534 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "цілочисельний цикл FOR повинен мати лише одну цільову змінну" -#: pl_gram.y:1537 +#: pl_gram.y:1568 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "в циклі FOR з запитом не можна вказати REVERSE" -#: pl_gram.y:1670 +#: pl_gram.y:1698 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "змінній циклу FOREACH повинна бути відома змінна або список змінних" -#: pl_gram.y:1712 +#: pl_gram.y:1740 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "в блоку або циклу, розділеному цим оператором, немає мітки \"%s\"" -#: pl_gram.y:1720 +#: pl_gram.y:1748 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "мітку блока \"%s\" не можна використовувати в CONTINUE" -#: pl_gram.y:1735 +#: pl_gram.y:1763 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT можна використовувати поза циклом, тільки з зазначенням мітки" -#: pl_gram.y:1736 +#: pl_gram.y:1764 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE не можна використовувати поза циклом" -#: pl_gram.y:1760 pl_gram.y:1798 pl_gram.y:1846 pl_gram.y:2998 pl_gram.y:3083 -#: pl_gram.y:3194 pl_gram.y:3957 +#: pl_gram.y:1788 pl_gram.y:1826 pl_gram.y:1874 pl_gram.y:2998 pl_gram.y:3084 +#: pl_gram.y:3195 pl_gram.y:3948 msgid "unexpected end of function definition" msgstr "неочікуваний кінец визначення функції" -#: pl_gram.y:1866 pl_gram.y:1890 pl_gram.y:1906 pl_gram.y:1912 pl_gram.y:2031 -#: pl_gram.y:2039 pl_gram.y:2053 pl_gram.y:2148 pl_gram.y:2399 pl_gram.y:2493 -#: pl_gram.y:2652 pl_gram.y:3799 pl_gram.y:3860 pl_gram.y:3938 +#: pl_gram.y:1894 pl_gram.y:1918 pl_gram.y:1934 pl_gram.y:1940 pl_gram.y:2061 +#: pl_gram.y:2069 pl_gram.y:2083 pl_gram.y:2178 pl_gram.y:2402 pl_gram.y:2492 +#: pl_gram.y:2649 pl_gram.y:3791 pl_gram.y:3852 pl_gram.y:3929 msgid "syntax error" msgstr "синтаксична помилка" -#: pl_gram.y:1894 pl_gram.y:1896 pl_gram.y:2403 pl_gram.y:2405 +#: pl_gram.y:1922 pl_gram.y:1924 pl_gram.y:2406 pl_gram.y:2408 msgid "invalid SQLSTATE code" msgstr "неприпустимий код SQLSTATE" -#: pl_gram.y:2096 +#: pl_gram.y:2126 msgid "syntax error, expected \"FOR\"" msgstr "помилка синтаксису, очікувався \"FOR\"" -#: pl_gram.y:2157 +#: pl_gram.y:2187 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "Оператор FETCH не може повернути декілька рядків" -#: pl_gram.y:2281 +#: pl_gram.y:2284 #, c-format msgid "cursor variable must be a simple variable" msgstr "змінна-курсор повинна бути простою змінною" -#: pl_gram.y:2287 +#: pl_gram.y:2290 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "змінна \"%s\" повинна бути типу cursor або refcursor" -#: pl_gram.y:2623 pl_gram.y:2634 +#: pl_gram.y:2620 pl_gram.y:2631 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" - невідома змінна" -#: pl_gram.y:2738 pl_gram.y:2748 pl_gram.y:2903 +#: pl_gram.y:2737 pl_gram.y:2747 pl_gram.y:2903 msgid "mismatched parentheses" msgstr "неузгоджені дужки" -#: pl_gram.y:2752 +#: pl_gram.y:2751 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "пропущено \"%s\" в кінці виразу SQL" -#: pl_gram.y:2758 +#: pl_gram.y:2757 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "пропущено \"%s\" в кінці оператора SQL" -#: pl_gram.y:2775 +#: pl_gram.y:2774 msgid "missing expression" msgstr "пропущено вираз" -#: pl_gram.y:2777 +#: pl_gram.y:2776 msgid "missing SQL statement" msgstr "пропущений оператор SQL" @@ -711,109 +701,109 @@ msgstr "пропущено оголошення типу даних" msgid "INTO specified more than once" msgstr "INTO вказано неодноразово" -#: pl_gram.y:3175 +#: pl_gram.y:3176 msgid "expected FROM or IN" msgstr "очікувалось FROM або IN" -#: pl_gram.y:3236 +#: pl_gram.y:3237 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "В функції, яка повертає набір, RETURN не може мати параметр" -#: pl_gram.y:3237 +#: pl_gram.y:3238 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Використайте RETURN NEXT або RETURN QUERY." -#: pl_gram.y:3247 +#: pl_gram.y:3248 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "В процедурі RETURN не може мати параметр" -#: pl_gram.y:3252 +#: pl_gram.y:3253 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "В функції, яка не повертає нічого, RETURN не може мати параметр" -#: pl_gram.y:3261 +#: pl_gram.y:3262 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "В функції з параметрами OUT, RETURN не може мати параметр" -#: pl_gram.y:3324 +#: pl_gram.y:3325 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "В функції з параметрами OUT, RETURN NEXT не може мати параметр" -#: pl_gram.y:3432 +#: pl_gram.y:3433 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "змінна \"%s\" оголошена як CONSTANT" -#: pl_gram.y:3495 +#: pl_gram.y:3491 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "змінна типу запис не може бути частиною списка INTO з декількома елементами" -#: pl_gram.y:3541 +#: pl_gram.y:3537 #, c-format msgid "too many INTO variables specified" msgstr "вказано занадто багато змінних INTO" -#: pl_gram.y:3752 +#: pl_gram.y:3745 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "кінцева мітка \"%s\" вказана для невідміченого блоку" -#: pl_gram.y:3759 +#: pl_gram.y:3752 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "кінцева мітка \"%s\" відрізняється від мітки блоку \"%s\"" -#: pl_gram.y:3794 +#: pl_gram.y:3786 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "курсор \"%s\" не має аргументів" -#: pl_gram.y:3808 +#: pl_gram.y:3800 #, c-format msgid "cursor \"%s\" has arguments" msgstr "курсор \"%s\" має аргументи" -#: pl_gram.y:3850 +#: pl_gram.y:3842 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "курсор \"%s\" не має аргументу \"%s\"" -#: pl_gram.y:3870 +#: pl_gram.y:3862 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "значення параметра \"%s\" курсора \"%s\" вказано неодноразово" -#: pl_gram.y:3895 +#: pl_gram.y:3887 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "недостатньо аргументів для курсора \"%s\"" -#: pl_gram.y:3902 +#: pl_gram.y:3894 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "занадто багато аргументів для курсора \"%s\"" -#: pl_gram.y:3989 +#: pl_gram.y:3980 msgid "unrecognized RAISE statement option" msgstr "нерозпізнаний параметр оператора RAISE" -#: pl_gram.y:3993 +#: pl_gram.y:3984 msgid "syntax error, expected \"=\"" msgstr "помилка синтаксису, очікувалось \"=\"" -#: pl_gram.y:4034 +#: pl_gram.y:4025 #, c-format msgid "too many parameters specified for RAISE" msgstr "занадто багато параметрів вказано для RAISE" -#: pl_gram.y:4038 +#: pl_gram.y:4029 #, c-format msgid "too few parameters specified for RAISE" msgstr "занадто мало параметрів вказано для RAISE" diff --git a/src/pl/plpgsql/src/po/zh_CN.po b/src/pl/plpgsql/src/po/zh_CN.po index 1acf18edf2..702d62dd68 100644 --- a/src/pl/plpgsql/src/po/zh_CN.po +++ b/src/pl/plpgsql/src/po/zh_CN.po @@ -5,734 +5,736 @@ # msgid "" msgstr "" -"Project-Id-Version: plpgsql (PostgreSQL) 12\n" +"Project-Id-Version: plpgsql (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-06-04 18:20+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:39+0000\n" +"PO-Revision-Date: 2021-08-15 18:20+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.5.7\n" -#: pl_comp.c:436 pl_handler.c:461 +#: pl_comp.c:438 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "PL/pgSQL函数不使用类型%s" -#: pl_comp.c:524 +#: pl_comp.c:530 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "无法确定多态函数\"%s\"的实际返回类型" -#: pl_comp.c:554 +#: pl_comp.c:560 #, c-format msgid "trigger functions can only be called as triggers" msgstr "触发器函数只能以触发器的形式调用" -#: pl_comp.c:558 pl_handler.c:445 +#: pl_comp.c:564 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "PL/pgSQL函数不能返回类型%s" -#: pl_comp.c:597 +#: pl_comp.c:604 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "触发器函数不能有已声明的参数" -#: pl_comp.c:598 +#: pl_comp.c:605 #, c-format msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." msgstr "触发器的参数可以通过TG_NARGS和TG_ARGV进行访问." -#: pl_comp.c:721 +#: pl_comp.c:738 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "事件触发器函数不能有已声明的参数" -#: pl_comp.c:980 +#: pl_comp.c:1002 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "在第%2$d行附件编译PL/pgSQL函数\"%1$s\"" -#: pl_comp.c:1003 +#: pl_comp.c:1025 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "多次使用参数名称 \"%s\"" -#: pl_comp.c:1115 +#: pl_comp.c:1137 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "字段关联 \"%s\" 是不明确的" -#: pl_comp.c:1117 +#: pl_comp.c:1139 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "可以指向一个PL/pgSQL变量或表中的列" -#: pl_comp.c:1300 pl_exec.c:5106 pl_exec.c:5471 pl_exec.c:5558 pl_exec.c:5649 -#: pl_exec.c:6566 +#: pl_comp.c:1322 pl_exec.c:5189 pl_exec.c:5362 pl_exec.c:5449 pl_exec.c:5540 +#: pl_exec.c:6547 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "记录\"%s\"没有字段\"%s\"" -#: pl_comp.c:1765 +#: pl_comp.c:1816 #, c-format msgid "relation \"%s\" does not exist" msgstr "关系 \"%s\" 不存在" -#: pl_comp.c:1857 +#: pl_comp.c:1823 pl_comp.c:1865 +#, fuzzy, c-format +#| msgid "\"%s\" is not a composite type" +msgid "relation \"%s\" does not have a composite type" +msgstr "\"%s\" 不是组合类型" + +#: pl_comp.c:1931 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "变量\"%s\"具有伪类型%s" -#: pl_comp.c:2037 +#: pl_comp.c:2120 #, c-format msgid "type \"%s\" is only a shell" msgstr "类型 \"%s\" 只是一个 shell" -#: pl_comp.c:2134 pl_comp.c:2187 +#: pl_comp.c:2202 pl_exec.c:6848 +#, c-format +msgid "type %s is not composite" +msgstr "类型 %s 不是复合类型" + +#: pl_comp.c:2250 pl_comp.c:2303 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "不可识别的异常条件\"%s\"" -#: pl_comp.c:2401 +#: pl_comp.c:2524 #, c-format msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "无法确定多态函数\"%s\"的实际参数类型" -#: pl_exec.c:475 pl_exec.c:887 pl_exec.c:1125 +#: pl_exec.c:500 pl_exec.c:934 pl_exec.c:1169 msgid "during initialization of execution state" msgstr "在执行状态的初始化期间" -#: pl_exec.c:481 +#: pl_exec.c:506 msgid "while storing call arguments into local variables" msgstr "在将调用的参数存储到本地变量时" -#: pl_exec.c:569 pl_exec.c:960 +#: pl_exec.c:594 pl_exec.c:1007 msgid "during function entry" msgstr "在进入函数期间" -#: pl_exec.c:594 +#: pl_exec.c:617 #, c-format msgid "control reached end of function without RETURN" msgstr "控制流程到达函数的结束部分,但是没有看到RETURN" -#: pl_exec.c:601 +#: pl_exec.c:623 msgid "while casting return value to function's return type" msgstr "正在将返回值强行指派为函数的返回类型" -#: pl_exec.c:614 pl_exec.c:3556 +#: pl_exec.c:636 pl_exec.c:3636 #, c-format msgid "set-valued function called in context that cannot accept a set" -msgstr "集值函数在不接受使用集合的环境中调用" +msgstr "在不能接受使用集合的环境中调用set-valued函数" -#: pl_exec.c:740 pl_exec.c:989 pl_exec.c:1150 +#: pl_exec.c:762 pl_exec.c:1033 pl_exec.c:1191 msgid "during function exit" msgstr "在函数退出期间" -#: pl_exec.c:795 pl_exec.c:834 pl_exec.c:3401 +#: pl_exec.c:817 pl_exec.c:881 pl_exec.c:3434 msgid "returned record type does not match expected record type" msgstr "所返回的记录类型与所期待的记录类型不匹配" -#: pl_exec.c:985 pl_exec.c:1146 +#: pl_exec.c:1030 pl_exec.c:1188 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "控制流程到达触发器/存储过程的结束部分,但是没有看到RETURN" -#: pl_exec.c:994 +#: pl_exec.c:1038 #, c-format msgid "trigger procedure cannot return a set" msgstr "触发器存储过程无法返回集合" -#: pl_exec.c:1033 pl_exec.c:1061 +#: pl_exec.c:1077 pl_exec.c:1105 msgid "returned row structure does not match the structure of the triggering table" msgstr "所返回的记录结构与触发表的结构不匹配" -#: pl_exec.c:1198 +#. translator: last %s is a phrase such as "during statement block +#. local variable initialization" +#. +#: pl_exec.c:1237 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "PL/pgSQL 函数%s在第%d行%s" -#: pl_exec.c:1209 +#. translator: last %s is a phrase such as "while storing call +#. arguments into local variables" +#. +#: pl_exec.c:1248 #, c-format msgid "PL/pgSQL function %s %s" msgstr "PL/pgSQL 函数%s %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1217 +#: pl_exec.c:1256 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "在%3$s的第%2$d行的PL/pgSQL函数%1$s" -#: pl_exec.c:1223 +#: pl_exec.c:1262 #, c-format msgid "PL/pgSQL function %s" msgstr "PL/pgSQL函数 %s" -#: pl_exec.c:1561 +#: pl_exec.c:1633 msgid "during statement block local variable initialization" msgstr "在初始化语句块的局部变量期间" -#: pl_exec.c:1659 +#: pl_exec.c:1731 msgid "during statement block entry" msgstr "在进入语句块期间" -#: pl_exec.c:1691 +#: pl_exec.c:1763 msgid "during statement block exit" msgstr "在退出语句块期间" -#: pl_exec.c:1729 +#: pl_exec.c:1801 msgid "during exception cleanup" msgstr "在清理异常期间" -#: pl_exec.c:2225 +#: pl_exec.c:2334 #, c-format msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" msgstr "过程参数\"%s\"是输出参数,但相应的参数不可写" -#: pl_exec.c:2230 +#: pl_exec.c:2339 #, c-format msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" msgstr "过程参数%d是输出参数,但相应的参数不可写" -#: pl_exec.c:2341 +#: pl_exec.c:2373 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS不能用于异常处理之外" -#: pl_exec.c:2540 +#: pl_exec.c:2573 #, c-format msgid "case not found" msgstr "没有找到CASE" -#: pl_exec.c:2541 +#: pl_exec.c:2574 #, c-format msgid "CASE statement is missing ELSE part." msgstr "在CASE语句结构中丢失ELSE部分" -#: pl_exec.c:2634 +#: pl_exec.c:2667 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "FOR循环的低位边界不能为空" -#: pl_exec.c:2650 +#: pl_exec.c:2683 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "FOR循环的高位边界不能为空" -#: pl_exec.c:2668 +#: pl_exec.c:2701 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "FOR循环的BY值不能为空" -#: pl_exec.c:2674 +#: pl_exec.c:2707 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "FOR循环的BY值必须大于0" -#: pl_exec.c:2808 pl_exec.c:4530 +#: pl_exec.c:2841 pl_exec.c:4625 #, c-format msgid "cursor \"%s\" already in use" msgstr "游标\"%s\"已经在使用" -#: pl_exec.c:2831 pl_exec.c:4595 +#: pl_exec.c:2864 pl_exec.c:4690 #, c-format msgid "arguments given for cursor without arguments" msgstr "给不带有参数的游标指定参数" -#: pl_exec.c:2850 pl_exec.c:4614 +#: pl_exec.c:2883 pl_exec.c:4709 #, c-format msgid "arguments required for cursor" msgstr "游标需要参数" -#: pl_exec.c:2937 +#: pl_exec.c:2970 #, c-format msgid "FOREACH expression must not be null" msgstr "FOREACH表达式不能为空" -#: pl_exec.c:2952 +#: pl_exec.c:2985 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "FOREACH表达式的结果必须是数组, 而不是类型 %s" -#: pl_exec.c:2969 +#: pl_exec.c:3002 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "索引维数(%d)超出有效范围: 0..%d" -#: pl_exec.c:2996 +#: pl_exec.c:3029 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "FOREACH ... SLICE循环变量必须属于数组类型" -#: pl_exec.c:3000 +#: pl_exec.c:3033 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "FOREACH循环变量不能为数组类型" -#: pl_exec.c:3162 pl_exec.c:3219 pl_exec.c:3394 +#: pl_exec.c:3195 pl_exec.c:3252 pl_exec.c:3427 #, c-format msgid "cannot return non-composite value from function returning composite type" msgstr "返回值为组合类型的函数不能返回非组合型的值" -#: pl_exec.c:3258 pl_gram.y:3305 +#: pl_exec.c:3291 pl_gram.y:3310 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "无法在非SETOF函数中使用RETURN NEXT" -#: pl_exec.c:3299 pl_exec.c:3431 +#: pl_exec.c:3332 pl_exec.c:3464 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "在RETURN NEXT中提供了错误的结果类型" -#: pl_exec.c:3337 pl_exec.c:3358 +#: pl_exec.c:3370 pl_exec.c:3391 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "在RETURN NEXT中提供了错误的记录类型" -#: pl_exec.c:3450 +#: pl_exec.c:3483 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT必须有一个参数" -#: pl_exec.c:3476 pl_gram.y:3369 +#: pl_exec.c:3511 pl_gram.y:3374 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "无法在非SETOF函数中使用RETURN QUERY" -#: pl_exec.c:3500 +#: pl_exec.c:3529 msgid "structure of query does not match function result type" msgstr "查询的结构与函数的返回类型不匹配" -#: pl_exec.c:3584 pl_exec.c:3722 +#: pl_exec.c:3562 pl_exec.c:5753 +#, c-format +msgid "query \"%s\" is not a SELECT" +msgstr "查询 \"%s\"不是SELECT语句" + +#: pl_exec.c:3584 pl_exec.c:4403 pl_exec.c:8589 +#, c-format +msgid "query string argument of EXECUTE is null" +msgstr "EXECUTE的查询字符串参数是空值" + +#: pl_exec.c:3664 pl_exec.c:3802 #, c-format msgid "RAISE option already specified: %s" msgstr "已经指定了RAISE选项:%s" -#: pl_exec.c:3618 +#: pl_exec.c:3698 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "不带有参数的RAISE不能在异常处理的外部使用" -#: pl_exec.c:3712 +#: pl_exec.c:3792 #, c-format msgid "RAISE statement option cannot be null" msgstr "RAISE语句选项不能为空" -#: pl_exec.c:3782 +#: pl_exec.c:3862 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3837 +#: pl_exec.c:3917 #, c-format msgid "assertion failed" msgstr "断言失败" -#: pl_exec.c:4179 pl_exec.c:4369 +#: pl_exec.c:4276 pl_exec.c:4464 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "无法在PL/pgSQL中从客户端或向客户端使用COPY命令" -#: pl_exec.c:4185 +#: pl_exec.c:4282 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "PL/pgSQL中不支持的事务命令" -#: pl_exec.c:4208 pl_exec.c:4398 +#: pl_exec.c:4305 pl_exec.c:4493 #, c-format msgid "INTO used with a command that cannot return data" msgstr "使用了带有无法返回数据的命令的INTO" -#: pl_exec.c:4231 pl_exec.c:4421 +#: pl_exec.c:4328 pl_exec.c:4516 #, c-format msgid "query returned no rows" msgstr "查询没有返回记录" -#: pl_exec.c:4253 pl_exec.c:4440 +#: pl_exec.c:4350 pl_exec.c:4535 #, c-format msgid "query returned more than one row" msgstr "查询返回多条记录" -#: pl_exec.c:4255 +#: pl_exec.c:4352 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "确保查询返回单行,或使用 LIMIT 1." -#: pl_exec.c:4271 +#: pl_exec.c:4368 #, c-format msgid "query has no destination for result data" msgstr "对于结果数据,查询没有目标" -#: pl_exec.c:4272 +#: pl_exec.c:4369 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "如果您想要放弃SELECT语句的结果,请使用PERFORM." -#: pl_exec.c:4305 pl_exec.c:8416 -#, c-format -msgid "query string argument of EXECUTE is null" -msgstr "EXECUTE的查询字符串参数是空值" - -#: pl_exec.c:4361 +#: pl_exec.c:4456 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "没有执行EXECUTE of SELECT ... INTO " -#: pl_exec.c:4362 +#: pl_exec.c:4457 #, c-format msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." msgstr "您可以使用EXECUTE ... INTO或者EXECUTE CREATE TABLE ... AS语句来替代" -#: pl_exec.c:4375 +#: pl_exec.c:4470 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "未执行事务命令" -#: pl_exec.c:4676 pl_exec.c:4764 +#: pl_exec.c:4771 pl_exec.c:4859 #, c-format msgid "cursor variable \"%s\" is null" msgstr "游标变量\"%s\"是空的" -#: pl_exec.c:4687 pl_exec.c:4775 +#: pl_exec.c:4782 pl_exec.c:4870 #, c-format msgid "cursor \"%s\" does not exist" msgstr "游标 \"%s\" 不存在" -#: pl_exec.c:4700 +#: pl_exec.c:4795 #, c-format msgid "relative or absolute cursor position is null" msgstr "游标的相对或绝对位置是空的" -#: pl_exec.c:4956 pl_exec.c:5051 +#: pl_exec.c:5039 pl_exec.c:5134 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "不能将声明为NOT NULL的变量\"%s\" 分配空值" -#: pl_exec.c:5032 +#: pl_exec.c:5115 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "无法将非组合值分配给记录变量" -#: pl_exec.c:5064 +#: pl_exec.c:5147 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "无法将非组合值分配给记录类型变量" -#: pl_exec.c:5115 +#: pl_exec.c:5198 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "不能指定系统字段名 \"%s\"" -#: pl_exec.c:5179 -#, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "数组维数(%d)超过了最大允许值(%d)" - -#: pl_exec.c:5211 -#, c-format -msgid "subscripted object is not an array" -msgstr "下标对象不是一个数组" - -#: pl_exec.c:5249 -#, c-format -msgid "array subscript in assignment must not be null" -msgstr "在赋值中数组下标不能为空" - -#: pl_exec.c:5756 +#: pl_exec.c:5647 #, c-format msgid "query \"%s\" did not return data" msgstr "查询\"%s\"没有返回数据" -#: pl_exec.c:5764 +#: pl_exec.c:5655 #, c-format msgid "query \"%s\" returned %d column" msgid_plural "query \"%s\" returned %d columns" msgstr[0] "查询\"%s\"返回%d列" -#: pl_exec.c:5792 +#: pl_exec.c:5683 #, c-format msgid "query \"%s\" returned more than one row" msgstr "查询\"%s\"返回多条数据" -#: pl_exec.c:5855 -#, c-format -msgid "query \"%s\" is not a SELECT" -msgstr "查询 \"%s\"不是SELECT语句" - -#: pl_exec.c:6580 pl_exec.c:6620 pl_exec.c:6660 +#: pl_exec.c:6561 pl_exec.c:6601 pl_exec.c:6641 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "第%d个参数(%s)的类型与正在执行计划(%s)中的不匹配" -#: pl_exec.c:6996 pl_exec.c:7030 pl_exec.c:7104 pl_exec.c:7130 +#: pl_exec.c:7052 pl_exec.c:7086 pl_exec.c:7160 pl_exec.c:7186 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "分配中的源字段和目标字段数不匹配" #. translator: %s represents a name of an extra check -#: pl_exec.c:6998 pl_exec.c:7032 pl_exec.c:7106 pl_exec.c:7132 +#: pl_exec.c:7054 pl_exec.c:7088 pl_exec.c:7162 pl_exec.c:7188 #, c-format msgid "%s check of %s is active." msgstr "%s检查%s是否激活." -#: pl_exec.c:7002 pl_exec.c:7036 pl_exec.c:7110 pl_exec.c:7136 +#: pl_exec.c:7058 pl_exec.c:7092 pl_exec.c:7166 pl_exec.c:7192 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "确保查询返回准确的列列表." -#: pl_exec.c:7518 +#: pl_exec.c:7579 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "记录 \"%s\"还没有分配" -#: pl_exec.c:7519 +#: pl_exec.c:7580 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "未分配记录的元组结构未确定." -#: pl_funcs.c:239 +#: pl_funcs.c:237 msgid "statement block" msgstr "语句块" -#: pl_funcs.c:241 +#: pl_funcs.c:239 msgid "assignment" msgstr "赋值" -#: pl_funcs.c:251 +#: pl_funcs.c:249 msgid "FOR with integer loop variable" msgstr "带有整型循环变量的FOR语句" -#: pl_funcs.c:253 +#: pl_funcs.c:251 msgid "FOR over SELECT rows" msgstr "在SELECT记录上的FOR语句" -#: pl_funcs.c:255 +#: pl_funcs.c:253 msgid "FOR over cursor" msgstr "在游标上运行的FOR语句" -#: pl_funcs.c:257 +#: pl_funcs.c:255 msgid "FOREACH over array" msgstr "在数组上运行的FOREACH语句" -#: pl_funcs.c:271 +#: pl_funcs.c:269 msgid "SQL statement" msgstr "SQL语句" -#: pl_funcs.c:275 +#: pl_funcs.c:273 msgid "FOR over EXECUTE statement" msgstr "在EXECUTE语句上的FOR语句" -#: pl_gram.y:489 +#: pl_gram.y:485 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "代码块标签必须放在DECLARE的前面,而不是后面" -#: pl_gram.y:509 +#: pl_gram.y:505 #, c-format msgid "collations are not supported by type %s" -msgstr "类型 %s不支持校对函数" +msgstr "类型%s不能使用排序规则" -#: pl_gram.y:528 +#: pl_gram.y:524 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "变量\"%s\"必须有默认值,因为它声明为非空" -#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 +#: pl_gram.y:672 pl_gram.y:687 pl_gram.y:713 #, c-format msgid "variable \"%s\" does not exist" msgstr "变量 \"%s\" 不存在" -#: pl_gram.y:733 pl_gram.y:761 +#: pl_gram.y:731 pl_gram.y:759 msgid "duplicate declaration" msgstr "重复声明" -#: pl_gram.y:744 pl_gram.y:772 +#: pl_gram.y:742 pl_gram.y:770 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "变量\"%s\"隐藏了前一个已定义的变量" -#: pl_gram.y:992 +#: pl_gram.y:1042 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "诊断项 %s 不允许出现在GET STACKED DIAGNOSTICS的结果中" -#: pl_gram.y:1010 +#: pl_gram.y:1060 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "诊断项 %s 不允许出现在GET CURRENT DIAGNOSTICS的结果中" -#: pl_gram.y:1105 +#: pl_gram.y:1155 msgid "unrecognized GET DIAGNOSTICS item" msgstr "无法识别的项GET DIAGNOSTICS" -#: pl_gram.y:1115 pl_gram.y:3549 +#: pl_gram.y:1171 pl_gram.y:3549 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\" 不是一个标量变量" -#: pl_gram.y:1369 pl_gram.y:1565 +#: pl_gram.y:1401 pl_gram.y:1595 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "在记录集上进行循环的循环变量必须是记录变量或标量变量列表" -#: pl_gram.y:1404 +#: pl_gram.y:1436 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "游标的FOR循环只能有一个目标变量" -#: pl_gram.y:1411 +#: pl_gram.y:1443 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "游标的FOR循环必须使用有界游标变量" -#: pl_gram.y:1498 +#: pl_gram.y:1534 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "整数FOR循环必须只能有一个目标变量" -#: pl_gram.y:1535 +#: pl_gram.y:1568 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "无法在查询FOR循环中指定REVERSE " -#: pl_gram.y:1668 +#: pl_gram.y:1698 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "FOREACH的循环变量必须是已知类型或者是变量列表" -#: pl_gram.y:1710 +#: pl_gram.y:1740 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "在任何包围这个语句的块或者循环上都没有附着标签\"%s\"" -#: pl_gram.y:1718 +#: pl_gram.y:1748 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "块标签 \"%s\" 不能被用在 CONTINUE 中" -#: pl_gram.y:1733 +#: pl_gram.y:1763 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "不能在循环外部使用EXIT,除非该循环有一个标签" -#: pl_gram.y:1734 +#: pl_gram.y:1764 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "在循环的外部不能使用CONTINUE" -#: pl_gram.y:1758 pl_gram.y:1796 pl_gram.y:1844 pl_gram.y:2994 pl_gram.y:3079 -#: pl_gram.y:3190 pl_gram.y:3950 +#: pl_gram.y:1788 pl_gram.y:1826 pl_gram.y:1874 pl_gram.y:2998 pl_gram.y:3084 +#: pl_gram.y:3195 pl_gram.y:3948 msgid "unexpected end of function definition" msgstr "在函数定义中意外出现的结束标志" -#: pl_gram.y:1864 pl_gram.y:1888 pl_gram.y:1904 pl_gram.y:1910 pl_gram.y:2029 -#: pl_gram.y:2037 pl_gram.y:2051 pl_gram.y:2146 pl_gram.y:2395 pl_gram.y:2489 -#: pl_gram.y:2648 pl_gram.y:3792 pl_gram.y:3853 pl_gram.y:3931 +#: pl_gram.y:1894 pl_gram.y:1918 pl_gram.y:1934 pl_gram.y:1940 pl_gram.y:2061 +#: pl_gram.y:2069 pl_gram.y:2083 pl_gram.y:2178 pl_gram.y:2402 pl_gram.y:2492 +#: pl_gram.y:2649 pl_gram.y:3791 pl_gram.y:3852 pl_gram.y:3929 msgid "syntax error" msgstr "语法错误" -#: pl_gram.y:1892 pl_gram.y:1894 pl_gram.y:2399 pl_gram.y:2401 +#: pl_gram.y:1922 pl_gram.y:1924 pl_gram.y:2406 pl_gram.y:2408 msgid "invalid SQLSTATE code" msgstr "无效的SQLSTATE代码" -#: pl_gram.y:2094 +#: pl_gram.y:2126 msgid "syntax error, expected \"FOR\"" msgstr "语法错误,期望\"FOR\"" -#: pl_gram.y:2155 +#: pl_gram.y:2187 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "FETCH语句无法返回多条记录" -#: pl_gram.y:2279 +#: pl_gram.y:2284 #, c-format msgid "cursor variable must be a simple variable" msgstr "游标变量必须是一个简单变量" -#: pl_gram.y:2285 +#: pl_gram.y:2290 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "变量\"%s\" 必须属于游标类型或refcursor类型" -#: pl_gram.y:2619 pl_gram.y:2630 +#: pl_gram.y:2620 pl_gram.y:2631 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" 不是一个已知变量" -#: pl_gram.y:2734 pl_gram.y:2744 pl_gram.y:2899 +#: pl_gram.y:2737 pl_gram.y:2747 pl_gram.y:2903 msgid "mismatched parentheses" msgstr "括号不匹配" -#: pl_gram.y:2748 +#: pl_gram.y:2751 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "在SQL表达式的结尾处丢失\"%s\"" -#: pl_gram.y:2754 +#: pl_gram.y:2757 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "在SQL语句的结尾处丢失\"%s\"" -#: pl_gram.y:2771 +#: pl_gram.y:2774 msgid "missing expression" msgstr "缺少表达式" -#: pl_gram.y:2773 +#: pl_gram.y:2776 msgid "missing SQL statement" msgstr "缺少SQL语句" -#: pl_gram.y:2901 +#: pl_gram.y:2905 msgid "incomplete data type declaration" msgstr "未完成的数据类型声明" -#: pl_gram.y:2924 +#: pl_gram.y:2928 msgid "missing data type declaration" msgstr "丢失数据类型声明" -#: pl_gram.y:3002 +#: pl_gram.y:3006 msgid "INTO specified more than once" msgstr "多次指定INTO" -#: pl_gram.y:3171 +#: pl_gram.y:3176 msgid "expected FROM or IN" msgstr "期望关键字FROM或IN" -#: pl_gram.y:3232 +#: pl_gram.y:3237 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "在返回为集合的函数中RETURN不能带有参数" -#: pl_gram.y:3233 +#: pl_gram.y:3238 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "使用RETURN NEXT或RETURN QUERY." -#: pl_gram.y:3243 +#: pl_gram.y:3248 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "在过程中RETURN不能带有参数" -#: pl_gram.y:3248 +#: pl_gram.y:3253 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "在返回为空的函数中RETURN不能有参数" -#: pl_gram.y:3257 +#: pl_gram.y:3262 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "在带有输出参数的函数中RETURN不能有参数" -#: pl_gram.y:3320 +#: pl_gram.y:3325 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "在带有输出参数的函数中RETURN NEXT不能有参数" -#: pl_gram.y:3428 +#: pl_gram.y:3433 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "变量\"%s\"被声明为常量" @@ -748,8 +750,9 @@ msgid "too many INTO variables specified" msgstr "在INTO后面指定了太多的变量" #: pl_gram.y:3745 -#, c-format -msgid "end label \"%s\" specified for unlabelled block" +#, fuzzy, c-format +#| msgid "end label \"%s\" specified for unlabelled block" +msgid "end label \"%s\" specified for unlabeled block" msgstr "为没有标签的代码块指定结束标签\"%s\" " #: pl_gram.y:3752 @@ -757,71 +760,71 @@ msgstr "为没有标签的代码块指定结束标签\"%s\" " msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "结束标签\"%s\" 与代码块标签\"%s\"不同" -#: pl_gram.y:3787 +#: pl_gram.y:3786 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "游标\"%s\" 没有参数" -#: pl_gram.y:3801 +#: pl_gram.y:3800 #, c-format msgid "cursor \"%s\" has arguments" msgstr "游标\"%s\"有参数" -#: pl_gram.y:3843 +#: pl_gram.y:3842 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "游标\"%s\" 没有名为 \"%s\"的参数" -#: pl_gram.y:3863 +#: pl_gram.y:3862 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "游标\"%2$s\"中的参数值\"%1$s\"指定了多次" -#: pl_gram.y:3888 +#: pl_gram.y:3887 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "游标 \"%s\"没有足够的参数" -#: pl_gram.y:3895 +#: pl_gram.y:3894 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "游标 \"%s\"给定的参数太多" -#: pl_gram.y:3982 +#: pl_gram.y:3980 msgid "unrecognized RAISE statement option" msgstr "无法识别的RAISE语句选项" -#: pl_gram.y:3986 +#: pl_gram.y:3984 msgid "syntax error, expected \"=\"" msgstr "语法错误,期望\"=\"" -#: pl_gram.y:4027 +#: pl_gram.y:4025 #, c-format msgid "too many parameters specified for RAISE" msgstr "为RAISE子句指定参数过多" -#: pl_gram.y:4031 +#: pl_gram.y:4029 #, c-format msgid "too few parameters specified for RAISE" msgstr "为RAISE子句指定参数过少" -#: pl_handler.c:158 +#: pl_handler.c:156 msgid "Sets handling of conflicts between PL/pgSQL variable names and table column names." msgstr "设置在PL/pgSQL变量名称和表中列名冲突时的处理原则" -#: pl_handler.c:167 +#: pl_handler.c:165 msgid "Print information about parameters in the DETAIL part of the error messages generated on INTO ... STRICT failures." msgstr "打印产生于INTO...STRICT失败时的详细的错误消息里的参数信息" -#: pl_handler.c:175 +#: pl_handler.c:173 msgid "Perform checks given in ASSERT statements." msgstr "执行在ASSERT语句中给定的检查。" -#: pl_handler.c:183 +#: pl_handler.c:181 msgid "List of programming constructs that should produce a warning." msgstr "程序构造列表必须输出警告." -#: pl_handler.c:193 +#: pl_handler.c:191 msgid "List of programming constructs that should produce an error." msgstr "程序构造列表必须输出一个错误信息提示." @@ -836,3 +839,4 @@ msgstr "%s 在输入的末尾" #, c-format msgid "%s at or near \"%s\"" msgstr "%s 在 \"%s\" 或附近的" + diff --git a/src/pl/plpython/po/el.po b/src/pl/plpython/po/el.po index 63a5ddc1d8..cfe112353a 100644 --- a/src/pl/plpython/po/el.po +++ b/src/pl/plpython/po/el.po @@ -3,19 +3,21 @@ # This file is distributed under the same license as the plpython (PostgreSQL) package. # Georgios Kokolatos , 2021. # +# +# msgid "" msgstr "" "Project-Id-Version: plpython (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-24 01:08+0000\n" -"PO-Revision-Date: 2021-05-26 09:57+0200\n" +"POT-Creation-Date: 2021-07-15 06:08+0000\n" +"PO-Revision-Date: 2021-07-15 09:57+0200\n" "Last-Translator: Georgios Kokolatos \n" +"Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"Language-Team: \n" "X-Generator: Poedit 2.4.3\n" #: plpy_cursorobject.c:72 @@ -103,7 +105,7 @@ msgstr "διεργασία PL/Python δεν επέστρεψε None" #: plpy_exec.c:215 #, c-format msgid "PL/Python function with return type \"void\" did not return None" -msgstr "συνάρτηση PL/Python με τύπο επιστροφής “void” δεν επέστρεψε None" +msgstr "συνάρτηση PL/Python με τύπο επιστροφής «void» δεν επέστρεψε None" #: plpy_exec.c:371 plpy_exec.c:397 #, c-format @@ -118,12 +120,12 @@ msgstr "Αναμενόταν None ή μία συμβολοσειρά." #: plpy_exec.c:387 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" -msgstr "συνάρτηση εναύσματος PL/Python επέστρεψε \"MODIFY\" σε ένα έναυσμα DELETE -- παραβλέφθηκε" +msgstr "συνάρτηση εναύσματος PL/Python επέστρεψε «MODIFY» σε ένα έναυσμα DELETE -- παραβλέφθηκε" #: plpy_exec.c:398 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." -msgstr "Αναμενόταν None, “OK”, “SKIP”, ή “MODIFY”." +msgstr "Αναμενόταν None, «OK», «SKIP», ή «MODIFY»." #: plpy_exec.c:443 #, c-format @@ -148,32 +150,32 @@ msgstr "κατά τη δημιουργία τιμής επιστροφής" #: plpy_exec.c:910 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" -msgstr "TD[“new”] διαγράφηκε, δεν είναι δυνατή η μετατροπή σειράς" +msgstr "TD[«new»] διαγράφηκε, δεν είναι δυνατή η μετατροπή σειράς" #: plpy_exec.c:915 #, c-format msgid "TD[\"new\"] is not a dictionary" -msgstr "TD[“new”] δεν είναι ένα λεξικό" +msgstr "TD[«new»] δεν είναι ένα λεξικό" #: plpy_exec.c:942 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" -msgstr "TD[“new”] κλειδί λεξικού στη τακτή θέση %d δεν είναι μία συμβολοσειρά" +msgstr "TD[«new»] κλειδί λεξικού στη τακτή θέση %d δεν είναι μία συμβολοσειρά" #: plpy_exec.c:949 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" -msgstr "κλειδί \"%s\" που βρίσκεται στο TD[\"New\"] δεν υπάρχει ως στήλη στη γραμμή εναύσματος" +msgstr "κλειδί «%s» που βρίσκεται στο TD[\"New\"] δεν υπάρχει ως στήλη στη γραμμή εναύσματος" #: plpy_exec.c:954 #, c-format msgid "cannot set system attribute \"%s\"" -msgstr "δεν είναι δυνατός ο ορισμός του χαρακτηριστικού συστήματος \"%s\"" +msgstr "δεν είναι δυνατός ο ορισμός του χαρακτηριστικού συστήματος «%s»" #: plpy_exec.c:959 #, c-format msgid "cannot set generated column \"%s\"" -msgstr "δεν είναι δυνατός ο ορισμός δημιουργημένης στήλης \"%s\"" +msgstr "δεν είναι δυνατός ο ορισμός δημιουργημένης στήλης «%s»" #: plpy_exec.c:1017 #, c-format @@ -203,7 +205,7 @@ msgstr "μη παγιδευμένο σφάλμα κατά την προετοι #: plpy_main.c:161 #, c-format msgid "could not import \"__main__\" module" -msgstr "δεν ήταν δυνατή η εισαγωγή του αρθρώματος “__main__”" +msgstr "δεν ήταν δυνατή η εισαγωγή του αρθρώματος «__main__»" #: plpy_main.c:170 #, c-format @@ -213,12 +215,12 @@ msgstr "δεν ήταν δυνατή η αρχικοποίηση καθολικ #: plpy_main.c:393 #, c-format msgid "PL/Python procedure \"%s\"" -msgstr "διεργασία PL/Python “%s”" +msgstr "διεργασία PL/Python «%s»" #: plpy_main.c:396 #, c-format msgid "PL/Python function \"%s\"" -msgstr "συνάρτηση PL/Python “%s”" +msgstr "συνάρτηση PL/Python «%s»" #: plpy_main.c:404 #, c-format @@ -228,7 +230,7 @@ msgstr "ονώνυμο μπλοκ κώδικα PL/Python" #: plpy_plpymodule.c:182 plpy_plpymodule.c:185 #, c-format msgid "could not import \"plpy\" module" -msgstr "δεν ήταν δυνατή η εισαγωγή του αρθρώματος “plpy”" +msgstr "δεν ήταν δυνατή η εισαγωγή του αρθρώματος «plpy»" #: plpy_plpymodule.c:200 #, c-format @@ -287,7 +289,7 @@ msgstr "οι συναρτήσεις PL/Python δεν μπορούν να δεχ #: plpy_procedure.c:397 #, c-format msgid "could not compile PL/Python function \"%s\"" -msgstr "δεν ήταν δυνατή η μεταγλώττιση της συνάρτησης PL/Python \"%s\"" +msgstr "δεν ήταν δυνατή η μεταγλώττιση της συνάρτησης PL/Python «%s»" #: plpy_procedure.c:400 #, c-format @@ -412,7 +414,7 @@ msgstr "Για να κατασκευαστεί μια πολυδιάστατη #: plpy_typeio.c:1350 #, c-format msgid "malformed record literal: \"%s\"" -msgstr "κακοσχηματισμένο εγγραφή: “%s”" +msgstr "κακοσχηματισμένο εγγραφή: «%s»" #: plpy_typeio.c:1351 #, c-format @@ -422,12 +424,12 @@ msgstr "Λείπει δεξιά παρένθεση." #: plpy_typeio.c:1352 plpy_typeio.c:1553 #, c-format msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." -msgstr "Για να επιστρέψετε έναν σύνθετο τύπο σε μία συστυχία, επιστρέψτε τον σύνθετο τύπο ως πλειάδα Python, π.χ. “[(‘foo’,)”." +msgstr "Για να επιστρέψετε έναν σύνθετο τύπο σε μία συστυχία, επιστρέψτε τον σύνθετο τύπο ως πλειάδα Python, π.χ. «[(‘foo’,)»." #: plpy_typeio.c:1399 #, c-format msgid "key \"%s\" not found in mapping" -msgstr "κλειδί “%s” δεν βρέθηκε σε αντιστοίχιση" +msgstr "κλειδί «%s» δεν βρέθηκε σε αντιστοίχιση" #: plpy_typeio.c:1400 #, c-format @@ -442,7 +444,7 @@ msgstr "το μήκος της ακολουθίας που επιστράφηκ #: plpy_typeio.c:1551 #, c-format msgid "attribute \"%s\" does not exist in Python object" -msgstr "η ιδιότητα “%s” δεν υπάρχει στο αντικείμενο Python" +msgstr "η ιδιότητα «%s» δεν υπάρχει στο αντικείμενο Python" #: plpy_typeio.c:1554 #, c-format diff --git a/src/pl/plpython/po/es.po b/src/pl/plpython/po/es.po index a28f27fef9..86122b2f3b 100644 --- a/src/pl/plpython/po/es.po +++ b/src/pl/plpython/po/es.po @@ -1,6 +1,6 @@ # Spanish message translation file for plpython # -# Copyright (c) 2009-2019, PostgreSQL Global Development Group +# Copyright (c) 2009-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Emanuel Calvo Franco , 2009. @@ -8,7 +8,7 @@ # msgid "" msgstr "" -"Project-Id-Version: plpython (PostgreSQL) 12\n" +"Project-Id-Version: plpython (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2020-09-13 10:38+0000\n" "PO-Revision-Date: 2019-06-06 17:26-0400\n" diff --git a/src/pl/plpython/po/fr.po b/src/pl/plpython/po/fr.po index 5de52a4213..d364d36b13 100644 --- a/src/pl/plpython/po/fr.po +++ b/src/pl/plpython/po/fr.po @@ -1,15 +1,17 @@ -# translation of plpython.po to fr_fr -# french message translation file for plpython +# LANGUAGE message translation file for plpython +# Copyright (C) 2009-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the plpython (PostgreSQL) package. # # Use these quotes: « %s » -# Guillaume Lelarge , 2009. +# +# Guillaume Lelarge , 2009-2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-17 01:07+0000\n" -"PO-Revision-Date: 2019-05-17 14:58+0200\n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -17,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 2.2.1\n" +"X-Generator: Poedit 3.0.1\n" #: plpy_cursorobject.c:78 #, c-format @@ -455,7 +457,7 @@ msgstr "enregistrement litéral invalide : « %s »" #: plpy_typeio.c:1348 #, c-format msgid "Missing left parenthesis." -msgstr "Parenthèse gauche manquante" +msgstr "Parenthèse gauche manquante." #: plpy_typeio.c:1349 plpy_typeio.c:1550 #, c-format diff --git a/src/pl/plpython/po/ja.po b/src/pl/plpython/po/ja.po index 42b1ec821d..567047829a 100644 --- a/src/pl/plpython/po/ja.po +++ b/src/pl/plpython/po/ja.po @@ -1,14 +1,14 @@ # Japanese message translation file for plpython -# Copyright (C) 2019 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # Honda Shigehiro , 2012. # msgid "" msgstr "" -"Project-Id-Version: plpython (PostgreSQL 12 beta 1)\n" +"Project-Id-Version: plpython (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2019-06-11 11:34+0900\n" -"PO-Revision-Date: 2019-06-11 13:46+0900\n" +"PO-Revision-Date: 2021-08-25 17:42+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 1.5.4\n" +"X-Generator: Poedit 1.8.13\n" #: plpy_cursorobject.c:78 #, c-format @@ -58,7 +58,7 @@ msgstr "クローズされたカーソルからのフェッチ" #: plpy_cursorobject.c:438 plpy_spi.c:409 #, c-format msgid "query result has too many rows to fit in a Python list" -msgstr "問い合わせの結果に含まれる行数が、Python のリストに対して多すぎます" +msgstr "問い合わせの結果に含まれる行数が、Pythonのリストに対して多すぎます" #: plpy_cursorobject.c:490 #, c-format @@ -81,8 +81,8 @@ msgstr "非サポートの集合関数リターンモードです。" msgid "" "PL/Python set-returning functions only support returning one value per call." msgstr "" -"PL/Python の集合を返す関数では、1回の呼び出しに対して1つの値を返すことのみ" -"がサポートされています。" +"集合を返却するPL/Python関数では、1回の呼び出しに対して1つの値を返すことのみが" +"サポートされています。" #: plpy_exec.c:157 #, c-format @@ -93,13 +93,13 @@ msgstr "返されたオブジェクトは反復利用できません" #, c-format msgid "PL/Python set-returning functions must return an iterable object." msgstr "" -"PL/Python の集合を返す関数は、イテレータ(反復利用可能)オブジェクトを返さな" -"ければなりません。" +"PL/Pythonの集合を返す関数は、反復処理可能なオブジェクトを返さなければなりませ" +"ん。" #: plpy_exec.c:172 #, c-format msgid "error fetching next item from iterator" -msgstr "イテレータ(反復子)から次の項目をフェッチ(取り出し)できません" +msgstr "反復子から次の項目を取り出せませんでした" #: plpy_exec.c:215 #, c-format @@ -109,7 +109,7 @@ msgstr "PL/Python プロシージャが None を返しませんでした" #: plpy_exec.c:219 #, c-format msgid "PL/Python function with return type \"void\" did not return None" -msgstr "戻り値が \"void\" 型である PL/Python 関数が None を返しませんでした" +msgstr "戻り値が\"void\"型である PL/Python関数がNoneを返しませんでした" #: plpy_exec.c:375 plpy_exec.c:401 #, c-format @@ -126,8 +126,7 @@ msgstr "None もしくは文字列を期待していました。" msgid "" "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "" -"PL/Python トリガ関数が、DELETE トリガで \"MODIFY\" を返しました-- 無視されま" -"した" +"PL/Python トリガ関数が、DELETE トリガで \"MODIFY\" を返しました-- 無視します" #: plpy_exec.c:402 #, c-format @@ -184,13 +183,13 @@ msgstr "" #: plpy_exec.c:963 #, c-format msgid "cannot set system attribute \"%s\"" -msgstr "システム属性 \"%s\" を設定できません" +msgstr "システム属性\"%s\"は設定できません" #: plpy_exec.c:968 #, c-format #| msgid "cannot alter inherited column \"%s\"" msgid "cannot set generated column \"%s\"" -msgstr "生成列\"%s\"は変更できません" +msgstr "生成列\"%s\"は設定できません" #: plpy_exec.c:1026 #, c-format @@ -210,8 +209,7 @@ msgstr "セッションに複数の Python ライブラリが存在します" #: plpy_main.c:126 #, c-format msgid "Only one Python major version can be used in one session." -msgstr "" -"1個のセッション中で使える Python のメジャーバージョンは1種類だけです。" +msgstr "1個のセッション中で使えるPythonのメジャーバージョンは1種類だけです。" #: plpy_main.c:142 #, c-format @@ -231,46 +229,46 @@ msgstr "グローバル変数(globals)を初期化できませんでした" #: plpy_main.c:399 #, c-format msgid "PL/Python procedure \"%s\"" -msgstr "PL/Python プロシージャ \"%s\"" +msgstr "PL/Pythonプロシージャ\"%s\"" #: plpy_main.c:402 #, c-format msgid "PL/Python function \"%s\"" -msgstr "PL/Python 関数 \"%s\"" +msgstr "PL/Python関数\"%s\"" #: plpy_main.c:410 #, c-format msgid "PL/Python anonymous code block" -msgstr "PL/Python の無名コードブロック" +msgstr "PL/Pythonの無名コードブロック" #: plpy_plpymodule.c:186 plpy_plpymodule.c:189 #, c-format msgid "could not import \"plpy\" module" -msgstr "\"plpy\" モジュールをインポートできませんでした" +msgstr "\"plpy\"モジュールをインポートできませんでした" #: plpy_plpymodule.c:204 #, c-format msgid "could not create the spiexceptions module" -msgstr "spiexceptions モジュールを生成できませんでした" +msgstr "spiexceptionsモジュールを生成できませんでした" #: plpy_plpymodule.c:212 #, c-format msgid "could not add the spiexceptions module" -msgstr "spiexceptions モジュールを追加できませんでした" +msgstr "spiexceptionsモジュールを追加できませんでした" #: plpy_plpymodule.c:280 #, c-format msgid "could not generate SPI exceptions" -msgstr "SPI 例外を生成できませんでした" +msgstr "SPI例外を生成できませんでした" #: plpy_plpymodule.c:448 #, c-format msgid "could not unpack arguments in plpy.elog" -msgstr "plpy.elog で引数を展開できませんでした" +msgstr "plpy.elogで引数を展開できませんでした" #: plpy_plpymodule.c:457 msgid "could not parse error message in plpy.elog" -msgstr "plpy.elog でエラーメッセージをパースできませんでした" +msgstr "plpy.elogでエラーメッセージをパースできませんでした" #: plpy_plpymodule.c:474 #, c-format @@ -280,37 +278,37 @@ msgstr "名前と位置で 'message' 引数が渡されました" #: plpy_plpymodule.c:501 #, c-format msgid "'%s' is an invalid keyword argument for this function" -msgstr "この関数に対して '%s' は無効なキーワード引数です" +msgstr "この関数に対して'%s'は無効なキーワード引数です" #: plpy_plpymodule.c:512 plpy_plpymodule.c:518 #, c-format msgid "invalid SQLSTATE code" -msgstr "無効な SQLSTATE コードです" +msgstr "無効なSQLSTATEコードです" #: plpy_procedure.c:230 #, c-format msgid "trigger functions can only be called as triggers" -msgstr "トリガ関数はトリガとしてのみコールできます" +msgstr "トリガー関数はトリガーとしてのみ呼び出せます" #: plpy_procedure.c:234 #, c-format msgid "PL/Python functions cannot return type %s" -msgstr "PL/Python 関数は %s 型を返せません" +msgstr "PL/Python関数は%s型を返せません" #: plpy_procedure.c:312 #, c-format msgid "PL/Python functions cannot accept type %s" -msgstr "PL/Python 関数は %s 型を受け付けられません" +msgstr "PL/Python関数は%s型を受け付けられません" #: plpy_procedure.c:402 #, c-format msgid "could not compile PL/Python function \"%s\"" -msgstr "PL/Python 関数 \"%s\" をコンパイルできませんでした" +msgstr "PL/Python関数\"%s\"をコンパイルできませんでした" #: plpy_procedure.c:405 #, c-format msgid "could not compile anonymous PL/Python code block" -msgstr "匿名の PL/Python コードブロックをコンパイルできませんでした" +msgstr "PL/Python無名コードブロックをコンパイルできませんでした" #: plpy_resultobject.c:121 plpy_resultobject.c:147 plpy_resultobject.c:173 #, c-format @@ -320,7 +318,7 @@ msgstr "コマンドは結果セットを生成しませんでした" #: plpy_spi.c:60 #, c-format msgid "second argument of plpy.prepare must be a sequence" -msgstr "plpy.prepare の第二引数はシーケンスでなければなりません" +msgstr "plpy.prepareの第二引数はシーケンスでなければなりません" #: plpy_spi.c:104 #, c-format @@ -340,12 +338,12 @@ msgstr "plpy.execute は第二引数としてシーケンスを取ります" #: plpy_spi.c:305 #, c-format msgid "SPI_execute_plan failed: %s" -msgstr "SPI_execute_plan が失敗しました:%s" +msgstr "SPI_execute_plan が失敗しました: %s" #: plpy_spi.c:347 #, c-format msgid "SPI_execute failed: %s" -msgstr "SPI_execute が失敗しました:%s" +msgstr "SPI_execute が失敗しました: %s" #: plpy_subxactobject.c:97 #, c-format @@ -370,27 +368,27 @@ msgstr "抜けるべきサブトランザクションがありません" #: plpy_typeio.c:591 #, c-format msgid "could not import a module for Decimal constructor" -msgstr "Decimal コンストラクタのためのモジュールをインポートできませんでした" +msgstr "Decimalコンストラクタのためのモジュールをインポートできませんでした" #: plpy_typeio.c:595 #, c-format msgid "no Decimal attribute in module" -msgstr "モジュールの中に Decimal 属性が含まれていません" +msgstr "モジュールの中にDecimal属性が含まれていません" #: plpy_typeio.c:601 #, c-format msgid "conversion from numeric to Decimal failed" -msgstr "numeric から Decimal への変換に失敗しました" +msgstr "numericからDecimalへの変換に失敗しました" #: plpy_typeio.c:915 #, c-format msgid "could not create bytes representation of Python object" -msgstr "バイト表現の Python オブジェクトを生成できませんでした" +msgstr "Pythonオブジェクトのバイト表現を生成できませんでした" #: plpy_typeio.c:1063 #, c-format msgid "could not create string representation of Python object" -msgstr "文字列表現の Python オブジェクトを生成できませんでした" +msgstr "Pythonオブジェクトの文字列表現を生成できませんでした" #: plpy_typeio.c:1074 #, c-format @@ -398,8 +396,8 @@ msgid "" "could not convert Python object into cstring: Python string representation " "appears to contain null bytes" msgstr "" -"Python オブジェクトを cstring に変換できませんでした:Python の文字列表現に " -"null バイトが含まれているようです" +"Pythonオブジェクトをcstringに変換できませんでした: Pythonの文字列表現にnullバ" +"イトが含まれているようです" #: plpy_typeio.c:1183 #, c-format @@ -420,13 +418,12 @@ msgstr "配列のサイズが制限値を超えています" #, c-format msgid "" "return value of function with array return type is not a Python sequence" -msgstr "配列型を返す関数の戻り値が Python のシーケンスではありません" +msgstr "配列型を返す関数の戻り値がPythonのシーケンスではありません" #: plpy_typeio.c:1266 #, c-format msgid "wrong length of inner sequence: has length %d, but %d was expected" -msgstr "" -"内部シーケンスで長さが異常です:長さは %d ですが、期待する値は %d でした" +msgstr "内部シーケンスで長さが異常です: 長さは%dですが、期待する値は%dでした" #: plpy_typeio.c:1268 #, c-format @@ -440,7 +437,7 @@ msgstr "" #: plpy_typeio.c:1347 #, c-format msgid "malformed record literal: \"%s\"" -msgstr "不正な形式のレコードリテラルです: \"%s\"" +msgstr "不正な形式のレコードリテラル: \"%s\"" #: plpy_typeio.c:1348 #, c-format @@ -459,7 +456,7 @@ msgstr "" #: plpy_typeio.c:1396 #, c-format msgid "key \"%s\" not found in mapping" -msgstr "マッピング上にキー \"%s\" が見つかりません" +msgstr "マッピング上にキー\"%s\"が見つかりません" #: plpy_typeio.c:1397 #, c-format @@ -467,8 +464,8 @@ msgid "" "To return null in a column, add the value None to the mapping with the key " "named after the column." msgstr "" -"カラムに null を入れて返す場合、カラム名をキーとして値が None のエントリを" -"マッピングに追加してください" +"カラムにnullを入れて返す場合、カラム名をキーとして値がNoneのエントリをマッピ" +"ングに追加してください。" #: plpy_typeio.c:1450 #, c-format @@ -478,7 +475,7 @@ msgstr "返されたシーケンスの長さが行のカラム数とマッチし #: plpy_typeio.c:1548 #, c-format msgid "attribute \"%s\" does not exist in Python object" -msgstr "属性 \"%s\" が Python オブジェクト中に存在しません" +msgstr "属性\"%s\"がPythonオブジェクト中に存在しません" #: plpy_typeio.c:1551 #, c-format @@ -486,27 +483,15 @@ msgid "" "To return null in a column, let the returned object have an attribute named " "after column with value None." msgstr "" -"カラムに null を入れて返す場合、カラム名をキーとして値が None である属性を持" -"つオブジェクトを返すようにしてください。" +"カラムにnullを入れて返す場合、カラム名をキーとして値がNoneである属性を持つオ" +"ブジェクトを返すようにしてください。" #: plpy_util.c:35 #, c-format msgid "could not convert Python Unicode object to bytes" -msgstr "Python の Unicode オブジェクトをバイト列に変換できませんでした" +msgstr "PythonのUnicodeオブジェクトをバイト列に変換できませんでした" #: plpy_util.c:41 #, c-format msgid "could not extract bytes from encoded string" msgstr "エンコードされた文字列からバイト列を抽出できませんでした" - -#~ msgid "could not create new dictionary while building trigger arguments" -#~ msgstr "トリガの引数を構成中、新しい辞書を生成できませんでした" - -#~ msgid "could not create globals" -#~ msgstr "グローバル変数(globals)を作成できませんでした" - -#~ msgid "could not create exception \"%s\"" -#~ msgstr "例外 \"%s \"を作成できませんでした" - -#~ msgid "could not create new dictionary" -#~ msgstr "新しい辞書を作れませんでした" diff --git a/src/pl/plpython/po/ru.po b/src/pl/plpython/po/ru.po index 93d229997b..4e3e171f5a 100644 --- a/src/pl/plpython/po/ru.po +++ b/src/pl/plpython/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: plpython (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-03 11:22+0300\n" +"POT-Creation-Date: 2021-08-14 06:29+0300\n" "PO-Revision-Date: 2019-08-29 15:42+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -66,7 +66,7 @@ msgstr "" msgid "closing a cursor in an aborted subtransaction" msgstr "закрытие курсора в прерванной подтранзакции" -#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:549 +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:548 #, c-format msgid "%s" msgstr "%s" @@ -255,56 +255,56 @@ msgstr "не удалось создать модуль spiexceptions" msgid "could not add the spiexceptions module" msgstr "не удалось добавить модуль spiexceptions" -#: plpy_plpymodule.c:276 +#: plpy_plpymodule.c:275 #, c-format msgid "could not generate SPI exceptions" msgstr "не удалось сгенерировать исключения SPI" -#: plpy_plpymodule.c:444 +#: plpy_plpymodule.c:443 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "не удалось распаковать аргументы в plpy.elog" -#: plpy_plpymodule.c:453 +#: plpy_plpymodule.c:452 msgid "could not parse error message in plpy.elog" msgstr "не удалось разобрать сообщение об ошибке в plpy.elog" -#: plpy_plpymodule.c:470 +#: plpy_plpymodule.c:469 #, c-format msgid "argument 'message' given by name and position" msgstr "аргумент 'message' задан и по имени, и по позиции" -#: plpy_plpymodule.c:497 +#: plpy_plpymodule.c:496 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "'%s' - недопустимое ключевое слово (аргумент) для этой функции" -#: plpy_plpymodule.c:508 plpy_plpymodule.c:514 +#: plpy_plpymodule.c:507 plpy_plpymodule.c:513 #, c-format msgid "invalid SQLSTATE code" msgstr "неверный код SQLSTATE" -#: plpy_procedure.c:226 +#: plpy_procedure.c:225 #, c-format msgid "trigger functions can only be called as triggers" msgstr "триггерные функции могут вызываться только в триггерах" -#: plpy_procedure.c:230 +#: plpy_procedure.c:229 #, c-format msgid "PL/Python functions cannot return type %s" msgstr "функции PL/Python не могут возвращать тип %s" -#: plpy_procedure.c:308 +#: plpy_procedure.c:307 #, c-format msgid "PL/Python functions cannot accept type %s" msgstr "функции PL/Python не могут принимать тип %s" -#: plpy_procedure.c:398 +#: plpy_procedure.c:397 #, c-format msgid "could not compile PL/Python function \"%s\"" msgstr "не удалось скомпилировать функцию PL/Python \"%s\"" -#: plpy_procedure.c:401 +#: plpy_procedure.c:400 #, c-format msgid "could not compile anonymous PL/Python code block" msgstr "не удалось скомпилировать анонимный блок кода PL/Python" @@ -398,24 +398,24 @@ msgstr "" "не удалось преобразовать объект Python в cstring: похоже, представление " "строки Python содержит нулевые байты" -#: plpy_typeio.c:1176 +#: plpy_typeio.c:1178 #, c-format msgid "number of array dimensions exceeds the maximum allowed (%d)" msgstr "число размерностей массива превышает предел (%d)" -#: plpy_typeio.c:1180 +#: plpy_typeio.c:1183 #, c-format msgid "could not determine sequence length for function return value" msgstr "" "не удалось определить длину последовательности в возвращаемом функцией " "значении" -#: plpy_typeio.c:1183 plpy_typeio.c:1187 +#: plpy_typeio.c:1188 plpy_typeio.c:1194 #, c-format msgid "array size exceeds the maximum allowed" msgstr "размер массива превышает предел" -#: plpy_typeio.c:1213 +#: plpy_typeio.c:1222 #, c-format msgid "" "return value of function with array return type is not a Python sequence" @@ -423,12 +423,12 @@ msgstr "" "возвращаемое значение функции с результатом-массивом не является " "последовательностью" -#: plpy_typeio.c:1259 +#: plpy_typeio.c:1269 #, c-format msgid "wrong length of inner sequence: has length %d, but %d was expected" msgstr "неверная длина внутренней последовательности: %d (ожидалось: %d)" -#: plpy_typeio.c:1261 +#: plpy_typeio.c:1271 #, c-format msgid "" "To construct a multidimensional array, the inner sequences must all have the " @@ -437,17 +437,17 @@ msgstr "" "Для образования многомерного массива внутренние последовательности должны " "иметь одинаковую длину." -#: plpy_typeio.c:1340 +#: plpy_typeio.c:1350 #, c-format msgid "malformed record literal: \"%s\"" msgstr "ошибка в литерале записи: \"%s\"" -#: plpy_typeio.c:1341 +#: plpy_typeio.c:1351 #, c-format msgid "Missing left parenthesis." msgstr "Отсутствует левая скобка." -#: plpy_typeio.c:1342 plpy_typeio.c:1543 +#: plpy_typeio.c:1352 plpy_typeio.c:1553 #, c-format msgid "" "To return a composite type in an array, return the composite type as a " @@ -456,12 +456,12 @@ msgstr "" "Чтобы возвратить составной тип в массиве, нужно возвратить составное " "значение в виде кортежа Python, например: \"[('foo',)]\"." -#: plpy_typeio.c:1389 +#: plpy_typeio.c:1399 #, c-format msgid "key \"%s\" not found in mapping" msgstr "ключ \"%s\" не найден в сопоставлении" -#: plpy_typeio.c:1390 +#: plpy_typeio.c:1400 #, c-format msgid "" "To return null in a column, add the value None to the mapping with the key " @@ -470,17 +470,17 @@ msgstr "" "Чтобы присвоить столбцу NULL, добавьте в сопоставление значение None с " "ключом-именем столбца." -#: plpy_typeio.c:1443 +#: plpy_typeio.c:1453 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "длина возвращённой последовательности не равна числу столбцов в строке" -#: plpy_typeio.c:1541 +#: plpy_typeio.c:1551 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "в объекте Python не существует атрибут \"%s\"" -#: plpy_typeio.c:1544 +#: plpy_typeio.c:1554 #, c-format msgid "" "To return null in a column, let the returned object have an attribute named " diff --git a/src/pl/plpython/po/sv.po b/src/pl/plpython/po/sv.po index 1d9ffda136..c12cd51e2a 100644 --- a/src/pl/plpython/po/sv.po +++ b/src/pl/plpython/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for plpython # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2020-04-11 01:08+0000\n" -"PO-Revision-Date: 2019-04-29 14:54+0200\n" +"PO-Revision-Date: 2021-11-07 10:38+0100\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" diff --git a/src/pl/plpython/po/uk.po b/src/pl/plpython/po/uk.po index d20c9a0d8e..d9049a9514 100644 --- a/src/pl/plpython/po/uk.po +++ b/src/pl/plpython/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:08+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" +"POT-Creation-Date: 2021-06-10 08:38+0000\n" +"PO-Revision-Date: 2021-08-17 10:54\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/plpython.pot\n" -"X-Crowdin-File-ID: 520\n" +"X-Crowdin-File: /REL_14_DEV/plpython.pot\n" +"X-Crowdin-File-ID: 752\n" #: plpy_cursorobject.c:72 #, c-format @@ -66,7 +66,7 @@ msgstr "результат запиту має забагато рядків д msgid "closing a cursor in an aborted subtransaction" msgstr "закриття курсора в перерваній транзакції" -#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:549 +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:548 #, c-format msgid "%s" msgstr "%s" @@ -241,56 +241,56 @@ msgstr "не вдалося створити spiexceptions модуль" msgid "could not add the spiexceptions module" msgstr "не вдалося додати spiexceptions модуль" -#: plpy_plpymodule.c:276 +#: plpy_plpymodule.c:275 #, c-format msgid "could not generate SPI exceptions" msgstr "не вдається створити винятки SPI" -#: plpy_plpymodule.c:444 +#: plpy_plpymodule.c:443 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "не вдалося розпакувати аргументи в plpy.elog" -#: plpy_plpymodule.c:453 +#: plpy_plpymodule.c:452 msgid "could not parse error message in plpy.elog" msgstr "не вдалося проаналізувати повідомлення про помилку в plpy.elog" -#: plpy_plpymodule.c:470 +#: plpy_plpymodule.c:469 #, c-format msgid "argument 'message' given by name and position" msgstr "аргумент 'повідомлення' виданий за ім'ям та розташуванням" -#: plpy_plpymodule.c:497 +#: plpy_plpymodule.c:496 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "'%s' є неприпустимим ключовим словом-аргументом для цієї функції" -#: plpy_plpymodule.c:508 plpy_plpymodule.c:514 +#: plpy_plpymodule.c:507 plpy_plpymodule.c:513 #, c-format msgid "invalid SQLSTATE code" msgstr "неприпустимий код SQLSTATE" -#: plpy_procedure.c:226 +#: plpy_procedure.c:225 #, c-format msgid "trigger functions can only be called as triggers" msgstr "тригер-функція може викликатися лише як тригер" -#: plpy_procedure.c:230 +#: plpy_procedure.c:229 #, c-format msgid "PL/Python functions cannot return type %s" msgstr "PL/Python функції не можуть повернути тип %s" -#: plpy_procedure.c:308 +#: plpy_procedure.c:307 #, c-format msgid "PL/Python functions cannot accept type %s" msgstr "PL/Python функції не можуть прийняти тип %s" -#: plpy_procedure.c:398 +#: plpy_procedure.c:397 #, c-format msgid "could not compile PL/Python function \"%s\"" msgstr "не вдалося скомпілювати функцію PL/Python \"%s\"" -#: plpy_procedure.c:401 +#: plpy_procedure.c:400 #, c-format msgid "could not compile anonymous PL/Python code block" msgstr "не вдалося скомпілювати анонімні коди блоку PL/Python" @@ -380,72 +380,72 @@ msgstr "не вдалося створити рядкову репрезента msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" msgstr "не вдалося перетворити об'єкт Python на cstring: репрезентація рядка Python містить значення null-байти" -#: plpy_typeio.c:1176 +#: plpy_typeio.c:1178 #, c-format msgid "number of array dimensions exceeds the maximum allowed (%d)" msgstr "кількість вимірів масиву перевищує максимально дозволену (%d)" -#: plpy_typeio.c:1180 +#: plpy_typeio.c:1183 #, c-format msgid "could not determine sequence length for function return value" msgstr "не вдалося визначити довжину послідовності для значення функція" -#: plpy_typeio.c:1183 plpy_typeio.c:1187 +#: plpy_typeio.c:1188 plpy_typeio.c:1194 #, c-format msgid "array size exceeds the maximum allowed" msgstr "розмір масиву перевищує максимально дозволений" -#: plpy_typeio.c:1213 +#: plpy_typeio.c:1222 #, c-format msgid "return value of function with array return type is not a Python sequence" msgstr "значення функції з масивом в якості результату не є послідовністю Python" -#: plpy_typeio.c:1259 +#: plpy_typeio.c:1269 #, c-format msgid "wrong length of inner sequence: has length %d, but %d was expected" msgstr "неправильна довжина внутрішньої послідовності: довжина %d, але очікується %d" -#: plpy_typeio.c:1261 +#: plpy_typeio.c:1271 #, c-format msgid "To construct a multidimensional array, the inner sequences must all have the same length." msgstr "Щоб побудувати багатовимірний масив, внутрішні послідовності повинні мати однакову довжину." -#: plpy_typeio.c:1340 +#: plpy_typeio.c:1350 #, c-format msgid "malformed record literal: \"%s\"" msgstr "невірно сформований літерал запису: \"%s\"" -#: plpy_typeio.c:1341 +#: plpy_typeio.c:1351 #, c-format msgid "Missing left parenthesis." msgstr "Відсутня ліва дужка." -#: plpy_typeio.c:1342 plpy_typeio.c:1543 +#: plpy_typeio.c:1352 plpy_typeio.c:1553 #, c-format msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." msgstr "Щоб повернути складений тип в масиві, треба повернути композитний тип як кортеж Python, наприклад, \"[('foo',)]\"." -#: plpy_typeio.c:1389 +#: plpy_typeio.c:1399 #, c-format msgid "key \"%s\" not found in mapping" msgstr "ключ \"%s\" не знайдено в зіставленні" -#: plpy_typeio.c:1390 +#: plpy_typeio.c:1400 #, c-format msgid "To return null in a column, add the value None to the mapping with the key named after the column." msgstr "Для повернення значення null в стовпці, додайте значення None з ключом, що дорівнює імені стовпця." -#: plpy_typeio.c:1443 +#: plpy_typeio.c:1453 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "довжина повернутої послідовності не відповідає кількості стовпців у рядку" -#: plpy_typeio.c:1541 +#: plpy_typeio.c:1551 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "атрибут \"%s\" не існує в об'єкті Python" -#: plpy_typeio.c:1544 +#: plpy_typeio.c:1554 #, c-format msgid "To return null in a column, let the returned object have an attribute named after column with value None." msgstr "Щоб повернути null в стовпці, результуючий об'єкт має мати атрибут з іменем стовпця зі значенням None." diff --git a/src/pl/plpython/po/zh_CN.po b/src/pl/plpython/po/zh_CN.po index 71bfd86af9..264d4f52f6 100644 --- a/src/pl/plpython/po/zh_CN.po +++ b/src/pl/plpython/po/zh_CN.po @@ -5,455 +5,455 @@ # msgid "" msgstr "" -"Project-Id-Version: plpython (PostgreSQL) 12\n" +"Project-Id-Version: plpython (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-06-04 18:00+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:38+0000\n" +"PO-Revision-Date: 2021-08-16 18:00+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.5.7\n" -#: plpy_cursorobject.c:78 +#: plpy_cursorobject.c:72 #, c-format msgid "plpy.cursor expected a query or a plan" msgstr "plpy.cursor期望一个查询或一个计划" -#: plpy_cursorobject.c:161 +#: plpy_cursorobject.c:155 #, c-format msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor将一个序列作为它的第二个参数" -#: plpy_cursorobject.c:177 plpy_spi.c:211 +#: plpy_cursorobject.c:171 plpy_spi.c:207 #, c-format msgid "could not execute plan" msgstr "无法执行计划" -#: plpy_cursorobject.c:180 plpy_spi.c:214 +#: plpy_cursorobject.c:174 plpy_spi.c:210 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" msgstr[0] "期望%d序列参数,但是得到%d: %s" -#: plpy_cursorobject.c:329 +#: plpy_cursorobject.c:321 #, c-format msgid "iterating a closed cursor" msgstr "遍历一个关闭的游标" -#: plpy_cursorobject.c:337 plpy_cursorobject.c:403 +#: plpy_cursorobject.c:329 plpy_cursorobject.c:395 #, c-format msgid "iterating a cursor in an aborted subtransaction" msgstr "在终止的子事务里遍历一个游标" -#: plpy_cursorobject.c:395 +#: plpy_cursorobject.c:387 #, c-format msgid "fetch from a closed cursor" msgstr "从关闭的游标里获取结果" -#: plpy_cursorobject.c:438 plpy_spi.c:409 +#: plpy_cursorobject.c:430 plpy_spi.c:403 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "查询结果中的行太多,无法放在一个Python列表中" -#: plpy_cursorobject.c:490 +#: plpy_cursorobject.c:482 #, c-format msgid "closing a cursor in an aborted subtransaction" msgstr "在终止的子事务里关闭一个游标" -#: plpy_elog.c:129 plpy_elog.c:130 plpy_plpymodule.c:553 +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:548 #, c-format msgid "%s" msgstr "%s" -#: plpy_exec.c:143 +#: plpy_exec.c:139 #, c-format msgid "unsupported set function return mode" msgstr "不支持集合函数返回模式" -#: plpy_exec.c:144 +#: plpy_exec.c:140 #, c-format msgid "PL/Python set-returning functions only support returning one value per call." msgstr "PL/Python集合返回函数只支持在每次调用时返回一个值。" -#: plpy_exec.c:157 +#: plpy_exec.c:153 #, c-format msgid "returned object cannot be iterated" msgstr "所返回的对象无法迭代" -#: plpy_exec.c:158 +#: plpy_exec.c:154 #, c-format msgid "PL/Python set-returning functions must return an iterable object." msgstr "PL/Python集合返回函数必须返回一个可迭代的对象." -#: plpy_exec.c:172 +#: plpy_exec.c:168 #, c-format msgid "error fetching next item from iterator" msgstr "当从迭代器中取回下一个成员时出现错误" -#: plpy_exec.c:215 +#: plpy_exec.c:211 #, c-format msgid "PL/Python procedure did not return None" msgstr "PL/Python过程没有返回None" -#: plpy_exec.c:219 +#: plpy_exec.c:215 #, c-format msgid "PL/Python function with return type \"void\" did not return None" msgstr "返回类型为\"void\"的PL/Python函数不返回None" -#: plpy_exec.c:375 plpy_exec.c:401 +#: plpy_exec.c:371 plpy_exec.c:397 #, c-format msgid "unexpected return value from trigger procedure" msgstr "在触发器存储过程出现非期望的返回值" -#: plpy_exec.c:376 +#: plpy_exec.c:372 #, c-format msgid "Expected None or a string." msgstr "期望空值或一个字符串" -#: plpy_exec.c:391 +#: plpy_exec.c:387 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "在DELETE触发器中的PL/Python 触发器函数返回 \"MODIFY\" -- 忽略" -#: plpy_exec.c:402 +#: plpy_exec.c:398 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "期望None, \"OK\", \"SKIP\", 或\"MODIFY\"" -#: plpy_exec.c:452 +#: plpy_exec.c:443 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "当设置参数的同时, 执行PyList_SetItem()失败" -#: plpy_exec.c:456 +#: plpy_exec.c:447 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "当设置参数的同时, 执行PyDict_SetItemString()失败" -#: plpy_exec.c:468 +#: plpy_exec.c:459 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "返回值类型是记录的函数在不接受使用记录类型的环境中调用" -#: plpy_exec.c:685 +#: plpy_exec.c:676 #, c-format msgid "while creating return value" msgstr "同时在创建返回值" -#: plpy_exec.c:919 +#: plpy_exec.c:910 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] 已删除,无法修改记录" -#: plpy_exec.c:924 +#: plpy_exec.c:915 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"]不是一个字典" -#: plpy_exec.c:951 +#: plpy_exec.c:942 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "在顺序位置%d的TD[\"new\"]字典键值不是字符串" -#: plpy_exec.c:958 +#: plpy_exec.c:949 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" msgstr "在 TD[\"new\"]中找到的键 \"%s\"在正在触发的记录中不是作为列而存在." -#: plpy_exec.c:963 +#: plpy_exec.c:954 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "不能设置系统属性\"%s\"" -#: plpy_exec.c:968 +#: plpy_exec.c:959 #, c-format msgid "cannot set generated column \"%s\"" msgstr "无法设置生成的列 \"%s\"" -#: plpy_exec.c:1026 +#: plpy_exec.c:1017 #, c-format msgid "while modifying trigger row" msgstr "同时正在修改触发器记录" -#: plpy_exec.c:1087 +#: plpy_exec.c:1075 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "强行终止一个还未退出的子事务" -#: plpy_main.c:125 +#: plpy_main.c:121 #, c-format msgid "multiple Python libraries are present in session" msgstr "会话中存在多个Python库" -#: plpy_main.c:126 +#: plpy_main.c:122 #, c-format msgid "Only one Python major version can be used in one session." msgstr "一个会话中只能使用一个Python主版本." -#: plpy_main.c:142 +#: plpy_main.c:138 #, c-format msgid "untrapped error in initialization" msgstr "在初始化过程中出现无法捕获的错误" -#: plpy_main.c:165 +#: plpy_main.c:161 #, c-format msgid "could not import \"__main__\" module" msgstr "无法导入模块\"__main__\" " -#: plpy_main.c:174 +#: plpy_main.c:170 #, c-format msgid "could not initialize globals" msgstr "无法初始化全局变量" -#: plpy_main.c:399 +#: plpy_main.c:393 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "PL/Python过程\"%s\"" -#: plpy_main.c:402 +#: plpy_main.c:396 #, c-format msgid "PL/Python function \"%s\"" msgstr "PL/Python函数\"%s\"" -#: plpy_main.c:410 +#: plpy_main.c:404 #, c-format msgid "PL/Python anonymous code block" msgstr "PL/Python匿名代码块" -#: plpy_plpymodule.c:186 plpy_plpymodule.c:189 +#: plpy_plpymodule.c:182 plpy_plpymodule.c:185 #, c-format msgid "could not import \"plpy\" module" msgstr "无法导入模块\"plpy\" " -#: plpy_plpymodule.c:204 +#: plpy_plpymodule.c:200 #, c-format msgid "could not create the spiexceptions module" msgstr "无法创建spiexceptions模块" -#: plpy_plpymodule.c:212 +#: plpy_plpymodule.c:208 #, c-format msgid "could not add the spiexceptions module" msgstr "无法添加spiexceptions模块 " -#: plpy_plpymodule.c:280 +#: plpy_plpymodule.c:275 #, c-format msgid "could not generate SPI exceptions" msgstr "无法产生SPI异常" -#: plpy_plpymodule.c:448 +#: plpy_plpymodule.c:443 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "无法解析plpy.elog中的参数" -#: plpy_plpymodule.c:457 +#: plpy_plpymodule.c:452 msgid "could not parse error message in plpy.elog" msgstr "无法解析在plpy.elog中的错误消息" -#: plpy_plpymodule.c:474 +#: plpy_plpymodule.c:469 #, c-format msgid "argument 'message' given by name and position" msgstr "由名称和位置提供的参数'message'" -#: plpy_plpymodule.c:501 +#: plpy_plpymodule.c:496 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "对于这个函数,'%s'是一个无效的关键词参数" -#: plpy_plpymodule.c:512 plpy_plpymodule.c:518 +#: plpy_plpymodule.c:507 plpy_plpymodule.c:513 #, c-format msgid "invalid SQLSTATE code" msgstr "无效的SQLSTATE代码" -#: plpy_procedure.c:230 +#: plpy_procedure.c:225 #, c-format msgid "trigger functions can only be called as triggers" msgstr "触发器函数只能以触发器的形式调用" -#: plpy_procedure.c:234 +#: plpy_procedure.c:229 #, c-format msgid "PL/Python functions cannot return type %s" msgstr "PL/Python函数不能返回类型%s" -#: plpy_procedure.c:312 +#: plpy_procedure.c:307 #, c-format msgid "PL/Python functions cannot accept type %s" msgstr "PL/Python函数不能接受类型%s" -#: plpy_procedure.c:402 +#: plpy_procedure.c:397 #, c-format msgid "could not compile PL/Python function \"%s\"" msgstr "无法编译PL/Python函数\"%s\"" -#: plpy_procedure.c:405 +#: plpy_procedure.c:400 #, c-format msgid "could not compile anonymous PL/Python code block" msgstr "无法编译PL/Python中的匿名代码块" -#: plpy_resultobject.c:121 plpy_resultobject.c:147 plpy_resultobject.c:173 +#: plpy_resultobject.c:117 plpy_resultobject.c:143 plpy_resultobject.c:169 #, c-format msgid "command did not produce a result set" msgstr "命令没有产生结果集" -#: plpy_spi.c:60 +#: plpy_spi.c:56 #, c-format msgid "second argument of plpy.prepare must be a sequence" msgstr "plpy.prepare的第二个参数必须是一个序列" -#: plpy_spi.c:104 +#: plpy_spi.c:100 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: 在顺序位置%d的类型名称不是string" -#: plpy_spi.c:176 +#: plpy_spi.c:172 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute期望一个查询或一个计划" -#: plpy_spi.c:195 +#: plpy_spi.c:191 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute将一个序列作为它的第二个参数" -#: plpy_spi.c:305 +#: plpy_spi.c:299 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "执行SPI_execute_plan失败: %s" -#: plpy_spi.c:347 +#: plpy_spi.c:341 #, c-format msgid "SPI_execute failed: %s" msgstr "SPI_execute执行失败: %s" -#: plpy_subxactobject.c:97 +#: plpy_subxactobject.c:92 #, c-format msgid "this subtransaction has already been entered" msgstr "已经进入该子事务" -#: plpy_subxactobject.c:103 plpy_subxactobject.c:161 +#: plpy_subxactobject.c:98 plpy_subxactobject.c:156 #, c-format msgid "this subtransaction has already been exited" msgstr "已经退出该子事务" -#: plpy_subxactobject.c:155 +#: plpy_subxactobject.c:150 #, c-format msgid "this subtransaction has not been entered" msgstr "该子事务仍没有进入" -#: plpy_subxactobject.c:167 +#: plpy_subxactobject.c:162 #, c-format msgid "there is no subtransaction to exit from" msgstr "没有子事务可以退出" -#: plpy_typeio.c:591 +#: plpy_typeio.c:587 #, c-format msgid "could not import a module for Decimal constructor" msgstr "无法为十进制构造函数导入模块" -#: plpy_typeio.c:595 +#: plpy_typeio.c:591 #, c-format msgid "no Decimal attribute in module" msgstr "模块中没有小数位属性" -#: plpy_typeio.c:601 +#: plpy_typeio.c:597 #, c-format msgid "conversion from numeric to Decimal failed" msgstr "由numeric数值到Decimal小数转换失败" -#: plpy_typeio.c:915 +#: plpy_typeio.c:911 #, c-format msgid "could not create bytes representation of Python object" msgstr "无法创建Python对象的字节表达式" -#: plpy_typeio.c:1063 +#: plpy_typeio.c:1056 #, c-format msgid "could not create string representation of Python object" msgstr "无法创建Python对象的字符串表达式" -#: plpy_typeio.c:1074 +#: plpy_typeio.c:1067 #, c-format msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" msgstr "无法将Python对象转换为cstring: Python字符串表达式可能包含空字节" -#: plpy_typeio.c:1183 +#: plpy_typeio.c:1178 #, c-format msgid "number of array dimensions exceeds the maximum allowed (%d)" msgstr "数组的维数超过最大允许值(%d)" -#: plpy_typeio.c:1187 +#: plpy_typeio.c:1183 #, c-format msgid "could not determine sequence length for function return value" msgstr "无法确定函数返回值的序列长度" -#: plpy_typeio.c:1190 plpy_typeio.c:1194 +#: plpy_typeio.c:1188 plpy_typeio.c:1194 #, c-format msgid "array size exceeds the maximum allowed" msgstr "数组的大小超过了最大允许值" -#: plpy_typeio.c:1220 +#: plpy_typeio.c:1222 #, c-format msgid "return value of function with array return type is not a Python sequence" msgstr "带有数组返回类型的函数返回值不是一个Python序列" -#: plpy_typeio.c:1266 +#: plpy_typeio.c:1269 #, c-format msgid "wrong length of inner sequence: has length %d, but %d was expected" msgstr "内部序列的长度错误:长度为%d,但应为%d" -#: plpy_typeio.c:1268 +#: plpy_typeio.c:1271 #, c-format msgid "To construct a multidimensional array, the inner sequences must all have the same length." msgstr "要构造多维数组,内部序列的长度必须相同." -#: plpy_typeio.c:1347 +#: plpy_typeio.c:1350 #, c-format msgid "malformed record literal: \"%s\"" msgstr "有缺陷的记录常量: \"%s\"" -#: plpy_typeio.c:1348 +#: plpy_typeio.c:1351 #, c-format msgid "Missing left parenthesis." msgstr "缺少一个左括弧" -#: plpy_typeio.c:1349 plpy_typeio.c:1550 +#: plpy_typeio.c:1352 plpy_typeio.c:1553 #, c-format msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." msgstr "要返回数组中的复合类型,请将复合类型作为Python元组返回,例如 \"[('foo',)]\"." -#: plpy_typeio.c:1396 +#: plpy_typeio.c:1399 #, c-format msgid "key \"%s\" not found in mapping" msgstr "在映射中没有找到键\"%s\"" -#: plpy_typeio.c:1397 +#: plpy_typeio.c:1400 #, c-format msgid "To return null in a column, add the value None to the mapping with the key named after the column." msgstr "为了在一列中返回空值, 需要在列的后面对带有已命名键的映射添加值None" -#: plpy_typeio.c:1450 +#: plpy_typeio.c:1453 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "所返回序列的长度与在记录中列的数量不匹配" -#: plpy_typeio.c:1548 +#: plpy_typeio.c:1551 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "在Python对象中不存在属性\"%s\"" -#: plpy_typeio.c:1551 +#: plpy_typeio.c:1554 #, c-format msgid "To return null in a column, let the returned object have an attribute named after column with value None." msgstr "为了在一列中返回空值, 需要让返回的对象在带有值None的列后面的带有已命名属性" -#: plpy_util.c:35 +#: plpy_util.c:31 #, c-format msgid "could not convert Python Unicode object to bytes" msgstr "无法将Python中以Unicode编码的对象转换为PostgreSQL服务器字节码" -#: plpy_util.c:41 +#: plpy_util.c:37 #, c-format msgid "could not extract bytes from encoded string" msgstr "无法从已编码字符串里提取相应字节码值" diff --git a/src/pl/tcl/po/de.po b/src/pl/tcl/po/de.po index 7e4877062c..e191a2bb4d 100644 --- a/src/pl/tcl/po/de.po +++ b/src/pl/tcl/po/de.po @@ -1,14 +1,14 @@ # German message translation file for PL/Tcl -# Peter Eisentraut , 2009 - 2019. +# Peter Eisentraut , 2009 - 2022. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-08-28 09:07+0000\n" -"PO-Revision-Date: 2019-08-28 11:21+0200\n" +"POT-Creation-Date: 2022-04-08 12:09+0000\n" +"PO-Revision-Date: 2022-04-08 14:40+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -16,51 +16,56 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: pltcl.c:464 +#: pltcl.c:463 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "PL/Tcl-Funktion, die einmal aufgerufen wird, wenn pltcl zum ersten Mal benutzt wird." -#: pltcl.c:471 +#: pltcl.c:470 msgid "PL/TclU function to call once when pltclu is first used." msgstr "PL/Tcl-Funktion, die einmal aufgerufen wird, wenn pltclu zum ersten Mal benutzt wird." -#: pltcl.c:636 +#: pltcl.c:637 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "Funktion »%s« ist in der falschen Sprache" -#: pltcl.c:647 +#: pltcl.c:648 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "Funktion »%s« darf nicht SECURITY DEFINER sein" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:681 +#: pltcl.c:682 #, c-format msgid "processing %s parameter" msgstr "Verarbeiten von Parameter von %s" -#: pltcl.c:842 +#: pltcl.c:835 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "Funktion mit Mengenergebnis in einem Zusammenhang aufgerufen, der keine Mengenergebnisse verarbeiten kann" -#: pltcl.c:1015 +#: pltcl.c:840 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "Materialisierungsmodus wird benötigt, ist aber in diesem Zusammenhang nicht erlaubt" + +#: pltcl.c:1013 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "Funktion, die einen Record zurückgibt, in einem Zusammenhang aufgerufen, der Typ record nicht verarbeiten kann" -#: pltcl.c:1299 +#: pltcl.c:1297 #, c-format msgid "could not split return value from trigger: %s" msgstr "konnte Rückgabewert des Triggers nicht splitten: %s" -#: pltcl.c:1379 pltcl.c:1809 +#: pltcl.c:1378 pltcl.c:1808 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1380 +#: pltcl.c:1379 #, c-format msgid "" "%s\n" @@ -69,42 +74,42 @@ msgstr "" "%s\n" "in PL/Tcl-Funktion »%s«" -#: pltcl.c:1544 +#: pltcl.c:1543 #, c-format msgid "trigger functions can only be called as triggers" msgstr "Triggerfunktionen können nur als Trigger aufgerufen werden" -#: pltcl.c:1548 +#: pltcl.c:1547 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "PL/Tcl-Funktionen können keinen Rückgabetyp %s haben" -#: pltcl.c:1587 +#: pltcl.c:1586 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "PL/Tcl-Funktionen können Typ %s nicht annehmen" -#: pltcl.c:1701 +#: pltcl.c:1700 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "konnte interne Prozedur »%s« nicht erzeugen: %s" -#: pltcl.c:3208 +#: pltcl.c:3202 #, c-format msgid "column name/value list must have even number of elements" msgstr "Liste der Spaltennamen/-werte muss gerade Anzahl Elemente haben" -#: pltcl.c:3226 +#: pltcl.c:3220 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "Liste der Spaltennamen/-werte enthält nicht existierenden Spaltennamen »%s«" -#: pltcl.c:3233 +#: pltcl.c:3227 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "Systemattribut »%s« kann nicht gesetzt werden" -#: pltcl.c:3239 +#: pltcl.c:3233 #, c-format msgid "cannot set generated column \"%s\"" msgstr "kann generierte Spalte »%s« nicht setzen" diff --git a/src/pl/tcl/po/el.po b/src/pl/tcl/po/el.po index 5891530f2d..cd6a5e0570 100644 --- a/src/pl/tcl/po/el.po +++ b/src/pl/tcl/po/el.po @@ -3,19 +3,21 @@ # This file is distributed under the same license as the pltcl (PostgreSQL) package. # Georgios Kokolatos , 2021 # +# +# msgid "" msgstr "" "Project-Id-Version: pltcl (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-05-25 05:38+0000\n" -"PO-Revision-Date: 2021-05-04 13:48+0200\n" +"POT-Creation-Date: 2021-07-21 05:08+0000\n" +"PO-Revision-Date: 2021-07-21 09:41+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.3\n" +"X-Generator: Poedit 3.0\n" #: pltcl.c:463 msgid "PL/Tcl function to call once when pltcl is first used." @@ -28,12 +30,12 @@ msgstr "Συνάρτηση PL/Tcl για να καλέσει μία μόνο φ #: pltcl.c:634 #, c-format msgid "function \"%s\" is in the wrong language" -msgstr "η συνάρτηση \"%s\" βρίσκεται σε λάθος γλώσσα" +msgstr "η συνάρτηση «%s» βρίσκεται σε λάθος γλώσσα" #: pltcl.c:645 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" -msgstr "η συνάρτηση \"%s\" δεν πρέπει να είναι SECURITY DEFINER" +msgstr "η συνάρτηση «%s» δεν πρέπει να είναι SECURITY DEFINER" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" #: pltcl.c:679 @@ -88,7 +90,7 @@ msgstr "συναρτήσεις PL/Tcl δεν είναι δυνατό να δεχ #: pltcl.c:1693 #, c-format msgid "could not create internal procedure \"%s\": %s" -msgstr "δεν ήταν δυνατή η δημιουργία εσωτερικής διαδικασίας \"%s\": %s" +msgstr "δεν ήταν δυνατή η δημιουργία εσωτερικής διαδικασίας «%s»: %s" #: pltcl.c:3197 #, c-format @@ -98,14 +100,14 @@ msgstr "λίστα ονόματος/τιμής στήλης πρέπει να έ #: pltcl.c:3215 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" -msgstr "λίστα ονόματος/τιμής στήλης περιέχει ανύπαρκτο όνομα στήλης \"%s\"" +msgstr "λίστα ονόματος/τιμής στήλης περιέχει ανύπαρκτο όνομα στήλης «%s»" #: pltcl.c:3222 #, c-format msgid "cannot set system attribute \"%s\"" -msgstr "δεν είναι δυνατός ο ορισμός του χαρακτηριστικού συστήματος \"%s\"" +msgstr "δεν είναι δυνατός ο ορισμός του χαρακτηριστικού συστήματος «%s»" #: pltcl.c:3228 #, c-format msgid "cannot set generated column \"%s\"" -msgstr "δεν είναι δυνατός ο ορισμός δημιουργημένης στήλης \"%s\"" +msgstr "δεν είναι δυνατός ο ορισμός δημιουργημένης στήλης «%s»" diff --git a/src/pl/tcl/po/es.po b/src/pl/tcl/po/es.po index 7aa76588ee..2a5eabcea3 100644 --- a/src/pl/tcl/po/es.po +++ b/src/pl/tcl/po/es.po @@ -1,6 +1,6 @@ # Spanish translation file for pltcl # -# Copyright (c) 2009-2019, PostgreSQL Global Development Group +# Copyright (c) 2009-2021, PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Emanuel Calvo Franco , 2009. @@ -8,7 +8,7 @@ # msgid "" msgstr "" -"Project-Id-Version: pltcl (PostgreSQL) 12\n" +"Project-Id-Version: pltcl (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2020-09-13 10:38+0000\n" "PO-Revision-Date: 2019-06-06 17:26-0400\n" diff --git a/src/pl/tcl/po/fr.po b/src/pl/tcl/po/fr.po index cca8823e25..f0f2489e8a 100644 --- a/src/pl/tcl/po/fr.po +++ b/src/pl/tcl/po/fr.po @@ -1,77 +1,80 @@ -# translation of pltcl.po to fr_fr -# french message translation file for pltcl +# LANGUAGE message translation file for pltcl +# Copyright (C) 2009-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pltcl (PostgreSQL) package. # # Use these quotes: « %s » -# Guillaume Lelarge , 2009. +# +# Guillaume Lelarge , 2009-2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 12\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-17 01:07+0000\n" -"PO-Revision-Date: 2019-05-17 14:57+0200\n" +"POT-Creation-Date: 2022-04-12 05:16+0000\n" +"PO-Revision-Date: 2022-04-12 17:29+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.1\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" -#: pltcl.c:464 +#: pltcl.c:463 msgid "PL/Tcl function to call once when pltcl is first used." -msgstr "" -"Fonction PL/Tcl à appeler une fois quand pltcl est utilisé pour la\n" -"première fois" +msgstr "Fonction PL/Tcl à appeler une fois quand pltcl est utilisé pour la première fois." -#: pltcl.c:471 +#: pltcl.c:470 msgid "PL/TclU function to call once when pltclu is first used." -msgstr "" -"Fonction PL/TclU à appeler une fois quand pltcl est utilisé pour la\n" -"première fois" +msgstr "Fonction PL/TclU à appeler une fois quand pltcl est utilisé pour la première fois." -#: pltcl.c:636 +#: pltcl.c:637 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "la fonction « %s » est dans le mauvais langage" -#: pltcl.c:647 +#: pltcl.c:648 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "la fonction « %s » doit être définie en SECURITY DEFINER" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:681 +#: pltcl.c:682 #, c-format msgid "processing %s parameter" msgstr "traitement du paramètre %s" -#: pltcl.c:842 +#: pltcl.c:835 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" -"la fonction avec set-value a été appelé dans un contexte qui n'accepte pas\n" +"la fonction renvoyant un ensemble a été appelée dans un contexte qui n'accepte pas\n" "un ensemble" -#: pltcl.c:1015 +#: pltcl.c:840 #, c-format -msgid "" -"function returning record called in context that cannot accept type record" +msgid "materialize mode required, but it is not allowed in this context" +msgstr "mode matérialisé requis mais interdit dans ce contexte" + +#: pltcl.c:1013 +#, c-format +msgid "function returning record called in context that cannot accept type record" msgstr "" "fonction renvoyant le type record appelée dans un contexte qui ne peut pas\n" "accepter le type record" -#: pltcl.c:1299 +#: pltcl.c:1297 #, c-format msgid "could not split return value from trigger: %s" msgstr "n'a pas pu séparer la valeur de retour du trigger : %s" -#: pltcl.c:1379 pltcl.c:1809 +#: pltcl.c:1378 pltcl.c:1808 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1380 +#: pltcl.c:1379 #, c-format msgid "" "%s\n" @@ -80,62 +83,60 @@ msgstr "" "%s\n" "dans la fonction PL/Tcl « %s »" -#: pltcl.c:1544 +#: pltcl.c:1543 #, c-format msgid "trigger functions can only be called as triggers" msgstr "les fonctions trigger peuvent seulement être appelées par des triggers" -#: pltcl.c:1548 +#: pltcl.c:1547 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "les fonctions PL/Tcl ne peuvent pas renvoyer le type %s" -#: pltcl.c:1587 +#: pltcl.c:1586 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "les fonctions PL/Tcl ne peuvent pas accepter le type %s" -#: pltcl.c:1701 +#: pltcl.c:1700 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "n'a pas pu créer la procédure interne « %s » : %s" -#: pltcl.c:3208 +#: pltcl.c:3202 #, c-format msgid "column name/value list must have even number of elements" msgstr "la liste de nom de colonne/valeur doit avoir un nombre pair d'éléments" -#: pltcl.c:3226 +#: pltcl.c:3220 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" -msgstr "" -"la liste de nom de colonne/valeur contient des noms de colonne inexistantes " -"(« %s »)" +msgstr "la liste de nom de colonne/valeur contient des noms de colonne inexistantes (« %s »)" -#: pltcl.c:3233 +#: pltcl.c:3227 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "ne peut pas initialiser l'attribut système « %s »" -#: pltcl.c:3239 +#: pltcl.c:3233 #, c-format msgid "cannot set generated column \"%s\"" msgstr "ne peut pas initialiser la colonne générée « %s »" -#~ msgid "module \"unknown\" not found in pltcl_modules" -#~ msgstr "module « unkown » introuvable dans pltcl_modules" +#~ msgid "PL/Tcl functions cannot return composite types" +#~ msgstr "les fonctions PL/Tcl ne peuvent pas renvoyer des types composites" #~ msgid "could not load module \"unknown\": %s" #~ msgstr "n'a pas pu charger le module « unknown » : %s" +#~ msgid "module \"unknown\" not found in pltcl_modules" +#~ msgstr "module « unkown » introuvable dans pltcl_modules" + +#~ msgid "out of memory" +#~ msgstr "mémoire épuisée" + #~ msgid "trigger's return list must have even number of elements" #~ msgstr "la liste de retour du trigger doit avoir un nombre pair d'éléments" #~ msgid "unrecognized attribute \"%s\"" #~ msgstr "attribut « %s » non reconnu" - -#~ msgid "out of memory" -#~ msgstr "mémoire épuisée" - -#~ msgid "PL/Tcl functions cannot return composite types" -#~ msgstr "les fonctions PL/Tcl ne peuvent pas renvoyer des types composites" diff --git a/src/pl/tcl/po/ja.po b/src/pl/tcl/po/ja.po index ddae7b47c9..0c302bcd40 100644 --- a/src/pl/tcl/po/ja.po +++ b/src/pl/tcl/po/ja.po @@ -1,13 +1,13 @@ # Japanese message translation file for pltcl -# Copyright (C) 2019 PostgreSQL Global Development Group +# Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # KOIZUMI Satoru , 2015. # msgid "" msgstr "" -"Project-Id-Version: pltcl (PostgreSQL 12 beta 1)\n" +"Project-Id-Version: pltcl (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-06-11 11:34+0900\n" +"POT-Creation-Date: 2022-05-11 14:17+0900\n" "PO-Revision-Date: 2019-06-11 17:26+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" @@ -18,54 +18,56 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.5.4\n" -#: pltcl.c:464 +#: pltcl.c:463 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "pltcl が最初に使用される際に一度だけ呼び出される PL/Tcl 関数。" -#: pltcl.c:471 +#: pltcl.c:470 msgid "PL/TclU function to call once when pltclu is first used." msgstr "pltclu が最初に使用される際に一度だけ呼び出される PL/TclU 関数。" -#: pltcl.c:636 +#: pltcl.c:637 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "関数\"%s\"は言語が異なります" -#: pltcl.c:647 +#: pltcl.c:648 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "関数\"%s\"はSECURITY DEFINERであってはなりません" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:681 +#: pltcl.c:682 #, c-format msgid "processing %s parameter" msgstr "%sパラメーターを処理しています" -#: pltcl.c:842 +#: pltcl.c:835 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "このコンテキストでは、集合値の関数は集合を受け付けられません" -#: pltcl.c:1015 +#: pltcl.c:840 #, c-format -msgid "" -"function returning record called in context that cannot accept type record" -msgstr "" -"レコード型を受け付けられないコンテキストでレコードを返す関数が呼び出されまし" -"た" +msgid "materialize mode required, but it is not allowed in this context" +msgstr "マテリアライズモードが必要ですが、現在のコンテクストで禁止されています" + +#: pltcl.c:1013 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "レコード型を受け付けられないコンテキストでレコードを返す関数が呼び出されました" -#: pltcl.c:1299 +#: pltcl.c:1296 #, c-format msgid "could not split return value from trigger: %s" msgstr "トリガーからの戻り値を分割できませんでした: %s" -#: pltcl.c:1379 pltcl.c:1809 +#: pltcl.c:1377 pltcl.c:1807 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1380 +#: pltcl.c:1378 #, c-format msgid "" "%s\n" @@ -74,43 +76,42 @@ msgstr "" "%s\n" "PL/Tcl 関数 \"%s\"" -#: pltcl.c:1544 +#: pltcl.c:1542 #, c-format msgid "trigger functions can only be called as triggers" msgstr "トリガー関数はトリガーとしてのみコールできます" -#: pltcl.c:1548 +#: pltcl.c:1546 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "PL/Tcl 関数は%s型の戻り値を返せません" -#: pltcl.c:1587 +#: pltcl.c:1585 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "PL/Tcl 関数は%s型を受け付けません" -#: pltcl.c:1701 +#: pltcl.c:1699 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "内部プロシージャ\"%s\"を作成できませんでした: %s" -#: pltcl.c:3208 +#: pltcl.c:3201 #, c-format msgid "column name/value list must have even number of elements" msgstr "列名/値のリストの要素は偶数個でなければなりません" -#: pltcl.c:3226 +#: pltcl.c:3219 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "列名/値のリストの中に、存在しない列名\"%s\"が含まれています" -#: pltcl.c:3233 +#: pltcl.c:3226 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "システム属性\"%s\"は設定できません" -#: pltcl.c:3239 +#: pltcl.c:3232 #, c-format -#| msgid "cannot alter inherited column \"%s\"" msgid "cannot set generated column \"%s\"" msgstr "生成列\"%s\"を変更できません" diff --git a/src/pl/tcl/po/ru.po b/src/pl/tcl/po/ru.po index c866c071e0..f5848e4922 100644 --- a/src/pl/tcl/po/ru.po +++ b/src/pl/tcl/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: pltcl (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-03 11:22+0300\n" +"POT-Creation-Date: 2021-08-14 06:29+0300\n" "PO-Revision-Date: 2019-08-29 15:43+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -17,54 +17,54 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: pltcl.c:465 +#: pltcl.c:463 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "Функция на PL/Tcl, вызываемая при первом использовании pltcl." -#: pltcl.c:472 +#: pltcl.c:470 msgid "PL/TclU function to call once when pltclu is first used." msgstr "Функция на PL/TclU, вызываемая при первом использовании pltclu." -#: pltcl.c:636 +#: pltcl.c:634 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "Функция \"%s\" объявлена на другом языке" -#: pltcl.c:647 +#: pltcl.c:645 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "функция \"%s\" не должна иметь характеристику SECURITY DEFINER" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:681 +#: pltcl.c:679 #, c-format msgid "processing %s parameter" msgstr "обработка параметра %s" -#: pltcl.c:835 +#: pltcl.c:833 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "функция, возвращающая множество, вызвана в контексте, где ему нет места" -#: pltcl.c:1008 +#: pltcl.c:1006 #, c-format msgid "" "function returning record called in context that cannot accept type record" msgstr "" "функция, возвращающая запись, вызвана в контексте, не допускающем этот тип" -#: pltcl.c:1292 +#: pltcl.c:1290 #, c-format msgid "could not split return value from trigger: %s" msgstr "разложить возвращаемое из триггера значение не удалось: %s" -#: pltcl.c:1373 pltcl.c:1803 +#: pltcl.c:1371 pltcl.c:1801 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1374 +#: pltcl.c:1372 #, c-format msgid "" "%s\n" @@ -73,43 +73,43 @@ msgstr "" "%s\n" "в функции PL/Tcl \"%s\"" -#: pltcl.c:1538 +#: pltcl.c:1536 #, c-format msgid "trigger functions can only be called as triggers" msgstr "триггерные функции могут вызываться только в триггерах" -#: pltcl.c:1542 +#: pltcl.c:1540 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "функции PL/Tcl не могут возвращать тип %s" -#: pltcl.c:1581 +#: pltcl.c:1579 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "функции PL/Tcl не могут принимать тип %s" -#: pltcl.c:1695 +#: pltcl.c:1693 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "не удалось создать внутреннюю процедуру \"%s\": %s" -#: pltcl.c:3199 +#: pltcl.c:3197 #, c-format msgid "column name/value list must have even number of elements" msgstr "в списке имён/значений столбцов должно быть чётное число элементов" -#: pltcl.c:3217 +#: pltcl.c:3215 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "" "список имён/значений столбцов содержит имя несуществующего столбца \"%s\"" -#: pltcl.c:3224 +#: pltcl.c:3222 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "присвоить значение системному атрибуту \"%s\" нельзя" -#: pltcl.c:3230 +#: pltcl.c:3228 #, c-format msgid "cannot set generated column \"%s\"" msgstr "присвоить значение генерируемому столбцу \"%s\" нельзя" diff --git a/src/pl/tcl/po/sv.po b/src/pl/tcl/po/sv.po index bacc8e7132..90205f638e 100644 --- a/src/pl/tcl/po/sv.po +++ b/src/pl/tcl/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pltcl # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 13\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-11 01:08+0000\n" -"PO-Revision-Date: 2020-04-11 08:45+0200\n" +"POT-Creation-Date: 2022-04-11 13:38+0000\n" +"PO-Revision-Date: 2022-04-11 16:11+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,51 +17,56 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: pltcl.c:465 +#: pltcl.c:463 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "PL/Tcl-funktion att anropa en gång när pltcl först används." -#: pltcl.c:472 +#: pltcl.c:470 msgid "PL/TclU function to call once when pltclu is first used." msgstr "PL/TclU-funktion att anrop en gång när pltclu först används." -#: pltcl.c:636 +#: pltcl.c:637 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "funktionen \"%s\" är skriven i fel språk" -#: pltcl.c:647 +#: pltcl.c:648 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "funktionen \"%s\" får ej vara SECURITY DEFINER" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:681 +#: pltcl.c:682 #, c-format msgid "processing %s parameter" msgstr "processar parameter %s" -#: pltcl.c:832 +#: pltcl.c:835 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "en funktion som returnerar en mängd anropades i kontext som inte godtar en mängd" -#: pltcl.c:1005 +#: pltcl.c:840 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "materialiserat läge krävs, men stöds inte i detta kontext" + +#: pltcl.c:1013 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "en funktion med post som värde anropades i sammanhang där poster inte kan godtagas." -#: pltcl.c:1289 +#: pltcl.c:1297 #, c-format msgid "could not split return value from trigger: %s" msgstr "kunde inte dela på returvärde och utlösare: %s" -#: pltcl.c:1370 pltcl.c:1800 +#: pltcl.c:1378 pltcl.c:1808 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1371 +#: pltcl.c:1379 #, c-format msgid "" "%s\n" @@ -70,42 +75,42 @@ msgstr "" "%s\n" "i PL/Tcl-funktion \"%s\"" -#: pltcl.c:1535 +#: pltcl.c:1543 #, c-format msgid "trigger functions can only be called as triggers" msgstr "Triggningsfunktioner kan bara anropas vid triggning." -#: pltcl.c:1539 +#: pltcl.c:1547 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "PL/Tcl-funktioner kan inte returnera typ %s" -#: pltcl.c:1578 +#: pltcl.c:1586 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "PL/Tcl-funktioner kan inte ta emot typ %s" -#: pltcl.c:1692 +#: pltcl.c:1700 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "kunde inte skapa en intern procedur \"%s\": %s" -#: pltcl.c:3197 +#: pltcl.c:3202 #, c-format msgid "column name/value list must have even number of elements" msgstr "kolumn-namn/-värde måste ha ett jämt antal element" -#: pltcl.c:3215 +#: pltcl.c:3220 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "listan med kolumn-namn/-värde innehåller det icke existerande kolumnnamnet \"%s\"" -#: pltcl.c:3222 +#: pltcl.c:3227 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "kan inte sätta systemattribut \"%s\"" -#: pltcl.c:3228 +#: pltcl.c:3233 #, c-format msgid "cannot set generated column \"%s\"" msgstr "kan inte sätta genererad kolumn \"%s\"" diff --git a/src/pl/tcl/po/uk.po b/src/pl/tcl/po/uk.po index bea5631a50..429ad29417 100644 --- a/src/pl/tcl/po/uk.po +++ b/src/pl/tcl/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:08+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" +"POT-Creation-Date: 2021-06-10 08:38+0000\n" +"PO-Revision-Date: 2021-08-17 10:54\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,96 +14,96 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/pltcl.pot\n" -"X-Crowdin-File-ID: 522\n" +"X-Crowdin-File: /REL_14_DEV/pltcl.pot\n" +"X-Crowdin-File-ID: 736\n" -#: pltcl.c:465 +#: pltcl.c:463 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "Функція PL/Tcl використовується для виклику коли pltcl вперше використаний." -#: pltcl.c:472 +#: pltcl.c:470 msgid "PL/TclU function to call once when pltclu is first used." msgstr "Функція PL/TclU використовується для виклику коли pltclu вперше використаний." -#: pltcl.c:636 +#: pltcl.c:634 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "функція «%s» написана неправильною мовою" -#: pltcl.c:647 +#: pltcl.c:645 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "функція \"%s\" не має бути SECURITY DEFINER" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:681 +#: pltcl.c:679 #, c-format msgid "processing %s parameter" msgstr "обробляється параметр %s" -#: pltcl.c:835 +#: pltcl.c:833 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "функція \"set-valued\" викликана в контексті, де йому немає місця" -#: pltcl.c:1008 +#: pltcl.c:1006 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "функція, що повертає набір, викликана у контексті, що не приймає тип запис" -#: pltcl.c:1292 +#: pltcl.c:1290 #, c-format msgid "could not split return value from trigger: %s" msgstr "не вдалося розділити повернене значення з тригера: %s" -#: pltcl.c:1373 pltcl.c:1803 +#: pltcl.c:1371 pltcl.c:1801 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1374 +#: pltcl.c:1372 #, c-format msgid "%s\n" "in PL/Tcl function \"%s\"" msgstr "%s\n" "у функції PL/Tcl \"%s\"" -#: pltcl.c:1538 +#: pltcl.c:1536 #, c-format msgid "trigger functions can only be called as triggers" msgstr "тригер-функція може викликатися лише як тригер" -#: pltcl.c:1542 +#: pltcl.c:1540 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "Функції PL/Tcl не можуть повертати тип %s" -#: pltcl.c:1581 +#: pltcl.c:1579 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "Функції PL/Tcl не можуть приймати тип %s" -#: pltcl.c:1695 +#: pltcl.c:1693 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "не вдалося створити внутрішню процедуру \"%s\": %s" -#: pltcl.c:3199 +#: pltcl.c:3197 #, c-format msgid "column name/value list must have even number of elements" msgstr "список імен і значень стовпців повинен мати парну кількість елементів" -#: pltcl.c:3217 +#: pltcl.c:3215 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "список імен і значень стовпців містить неіснуєче ім'я стовпця \"%s\"" -#: pltcl.c:3224 +#: pltcl.c:3222 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "не вдалося встановити системний атрибут \"%s\"" -#: pltcl.c:3230 +#: pltcl.c:3228 #, c-format msgid "cannot set generated column \"%s\"" msgstr "неможливо оновити згенерований стовпець \"%s\"" diff --git a/src/pl/tcl/po/zh_CN.po b/src/pl/tcl/po/zh_CN.po index be25e830f8..d9e49a74ce 100644 --- a/src/pl/tcl/po/zh_CN.po +++ b/src/pl/tcl/po/zh_CN.po @@ -5,63 +5,63 @@ # msgid "" msgstr "" -"Project-Id-Version: pltcl (PostgreSQL) 12\n" +"Project-Id-Version: pltcl (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-05-22 17:56+0800\n" -"PO-Revision-Date: 2019-06-04 18:00+0800\n" -"Last-Translator: Jie Zhang \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-08-14 05:38+0000\n" +"PO-Revision-Date: 2021-08-16 18:00+0800\n" +"Last-Translator: Jie Zhang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "X-Generator: Poedit 1.5.7\n" -#: pltcl.c:464 +#: pltcl.c:463 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "PL/Tcl函数在首次使用pltcl时调用一次." -#: pltcl.c:471 +#: pltcl.c:470 msgid "PL/TclU function to call once when pltclu is first used." msgstr "PL/TclU函数在首次使用pltcl时调用一次." -#: pltcl.c:636 +#: pltcl.c:634 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "函数\"%s\"的语言错误" -#: pltcl.c:647 +#: pltcl.c:645 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "函数\"%s\"不能是安全定义者" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:681 +#: pltcl.c:679 #, c-format msgid "processing %s parameter" msgstr "正在处理%s参数" -#: pltcl.c:842 +#: pltcl.c:833 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "在不能接受使用集合的环境中调用set-valued函数" -#: pltcl.c:1015 +#: pltcl.c:1006 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "返回值类型是记录的函数在不接受使用记录类型的环境中调用" -#: pltcl.c:1299 +#: pltcl.c:1290 #, c-format msgid "could not split return value from trigger: %s" msgstr "无法分离来自触发器的返回值:%s" -#: pltcl.c:1379 pltcl.c:1809 +#: pltcl.c:1371 pltcl.c:1801 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1380 +#: pltcl.c:1372 #, c-format msgid "" "%s\n" @@ -70,42 +70,42 @@ msgstr "" "%s\n" "在PL/Tcl函数\"%s\"中" -#: pltcl.c:1544 +#: pltcl.c:1536 #, c-format msgid "trigger functions can only be called as triggers" msgstr "触发器函数只能以触发器的形式调用" -#: pltcl.c:1548 +#: pltcl.c:1540 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "PL/Tcl函数不能返回类型%s" -#: pltcl.c:1587 +#: pltcl.c:1579 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "PL/Tcl函数不能使用类型 %s" -#: pltcl.c:1701 +#: pltcl.c:1693 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "无法创建内部过程\"%s\":%s" -#: pltcl.c:3208 +#: pltcl.c:3197 #, c-format msgid "column name/value list must have even number of elements" msgstr "列名/值列表必须具有偶数个元素" -#: pltcl.c:3226 +#: pltcl.c:3215 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "列名/值列表包含不存在的列名\"%s\"" -#: pltcl.c:3233 +#: pltcl.c:3222 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "不能设置系统属性\"%s\"" -#: pltcl.c:3239 +#: pltcl.c:3228 #, c-format msgid "cannot set generated column \"%s\"" msgstr "无法设置生成的列 \"%s\"" From 9499c0fcf488e2f8e0e3ae71b06003fe7735feb4 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 16 May 2022 10:09:36 -0400 Subject: [PATCH 680/772] relnotes: improve UTF8 text item in relation to ASCII Reported-by: John Naylor Discussion: https://postgr.es/m/CAFBsxsE-US0sgVxVHjt99GCGky4TCD57gwMHWPF9XWo7R5rXPg@mail.gmail.com --- doc/src/sgml/release-15.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/release-15.sgml b/doc/src/sgml/release-15.sgml index d18a4821ae..2f059ffd0a 100644 --- a/doc/src/sgml/release-15.sgml +++ b/doc/src/sgml/release-15.sgml @@ -757,7 +757,7 @@ Author: John Naylor -Improve validation of ASCII and UTF-8 text by processing 16 bytes at a time (John Naylor) +Improve validation of UTF-8 text (even ASCII-only) by processing 16 bytes at a time (John Naylor) From 4bfa420075b4e85012837b6b6d376edf8af5ede5 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 16 May 2022 10:18:17 -0400 Subject: [PATCH 681/772] relnotes: improve updated UTF8 item wording --- doc/src/sgml/release-15.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/release-15.sgml b/doc/src/sgml/release-15.sgml index 2f059ffd0a..4a46c4278c 100644 --- a/doc/src/sgml/release-15.sgml +++ b/doc/src/sgml/release-15.sgml @@ -757,7 +757,7 @@ Author: John Naylor -Improve validation of UTF-8 text (even ASCII-only) by processing 16 bytes at a time (John Naylor) +Improve validation of UTF-8 text (even if only ASCII) by processing 16 bytes at a time (John Naylor) From 05a5a1775c89f6beb326725282e7eea1373cbec8 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 16 May 2022 17:10:42 -0400 Subject: [PATCH 682/772] Stamp 15beta1. --- configure | 18 +++++++++--------- configure.ac | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/configure b/configure index 274e0db8c5..7dec6b7bf9 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for PostgreSQL 15devel. +# Generated by GNU Autoconf 2.69 for PostgreSQL 15beta1. # # Report bugs to . # @@ -582,8 +582,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='PostgreSQL' PACKAGE_TARNAME='postgresql' -PACKAGE_VERSION='15devel' -PACKAGE_STRING='PostgreSQL 15devel' +PACKAGE_VERSION='15beta1' +PACKAGE_STRING='PostgreSQL 15beta1' PACKAGE_BUGREPORT='pgsql-bugs@lists.postgresql.org' PACKAGE_URL='https://www.postgresql.org/' @@ -1452,7 +1452,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures PostgreSQL 15devel to adapt to many kinds of systems. +\`configure' configures PostgreSQL 15beta1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1517,7 +1517,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of PostgreSQL 15devel:";; + short | recursive ) echo "Configuration of PostgreSQL 15beta1:";; esac cat <<\_ACEOF @@ -1691,7 +1691,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -PostgreSQL configure 15devel +PostgreSQL configure 15beta1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2444,7 +2444,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by PostgreSQL $as_me 15devel, which was +It was created by PostgreSQL $as_me 15beta1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -20534,7 +20534,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by PostgreSQL $as_me 15devel, which was +This file was extended by PostgreSQL $as_me 15beta1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -20605,7 +20605,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -PostgreSQL config.status 15devel +PostgreSQL config.status 15beta1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index bba1ac5878..d093fb88dd 100644 --- a/configure.ac +++ b/configure.ac @@ -17,7 +17,7 @@ dnl Read the Autoconf manual for details. dnl m4_pattern_forbid(^PGAC_)dnl to catch undefined macros -AC_INIT([PostgreSQL], [15devel], [pgsql-bugs@lists.postgresql.org], [], [https://www.postgresql.org/]) +AC_INIT([PostgreSQL], [15beta1], [pgsql-bugs@lists.postgresql.org], [], [https://www.postgresql.org/]) m4_if(m4_defn([m4_PACKAGE_VERSION]), [2.69], [], [m4_fatal([Autoconf version 2.69 is required. Untested combinations of 'autoconf' and PostgreSQL versions are not From bbf7c2d9e932db873469cd9cecf0e05e39c1962d Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 18 May 2022 09:06:22 +0900 Subject: [PATCH 683/772] Fix typo in walreceiver.c s/primary_slotname/primary_slot_name/. Author: Bharath Rupireddy Discussion: https://postgr.es/m/CALj2ACX3=pHkCpoGG-z+O=7Gp5YZv70jmfTyGnNV7YF3SkK73g@mail.gmail.com --- src/backend/replication/walreceiver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c index b369d28a80..9452932d59 100644 --- a/src/backend/replication/walreceiver.c +++ b/src/backend/replication/walreceiver.c @@ -681,7 +681,7 @@ WalRcvWaitForStartPosition(XLogRecPtr *startpoint, TimeLineID *startpointTLI) { /* * No need to handle changes in primary_conninfo or - * primary_slotname here. Startup process will signal us to + * primary_slot_name here. Startup process will signal us to * terminate in case those change. */ *startpoint = walrcv->receiveStart; From 27f1366050c6cd8c1ea5f03b367a5a167ebf34b7 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 18 May 2022 09:47:38 +0900 Subject: [PATCH 684/772] pgbench: Restore compatibility of --partitions=0 A value of 0 is allowed for this option since its creation, that would map with the default of having no partitions for pgbench_accounts, but 6f164e6 broke that by enforcing an error. This commit restores the original behavior. Author: Amit Langote Discussion: https://postgr.es/m/CA+HiwqGAGobiiHR8nH382HJxqm1mzZs8=3oKPXnXivWoFSZmNA@mail.gmail.com --- src/bin/pgbench/pgbench.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 79c0cd374d..fbb74bdc4c 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -6865,7 +6865,7 @@ main(int argc, char **argv) break; case 11: /* partitions */ initialization_option_set = true; - if (!option_parse_int(optarg, "--partitions", 1, INT_MAX, + if (!option_parse_int(optarg, "--partitions", 0, INT_MAX, &partitions)) exit(1); break; From 81e3c83d988daa8fd763ec5104d540713832dd1a Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 18 May 2022 18:18:22 +0200 Subject: [PATCH 685/772] Fix markup in synopsis There is no need for a inside a , since the latter is already all "literal" implicitly. Also, create_help.pl misparses it. So just remove it. Reported-by: Kyotaro Horiguchi Discussion: https://www.postgresql.org/message-id/flat/20220517.174342.1884842412165214815.horikyota.ntt%40gmail.com --- doc/src/sgml/ref/copy.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/copy.sgml b/doc/src/sgml/ref/copy.sgml index e7a6676efd..546cef04b9 100644 --- a/doc/src/sgml/ref/copy.sgml +++ b/doc/src/sgml/ref/copy.sgml @@ -36,7 +36,7 @@ COPY { table_name [ ( boolean ] DELIMITER 'delimiter_character' NULL 'null_string' - HEADER [ boolean | match ] + HEADER [ boolean | match ] QUOTE 'quote_character' ESCAPE 'escape_character' FORCE_QUOTE { ( column_name [, ...] ) | * } From 598ac10be1c20961baac44db773eb826f788fdfa Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 18 May 2022 18:33:04 +0200 Subject: [PATCH 686/772] Make EXPLAIN MERGE output format more compact We can use a single line to print all tuple counts that MERGE processed, for conciseness, and elide those that are zeroes. Non-text formats report all numbers, as is typical. Per comment from Justin Pryzby Discussion: https://postgr.es/m/20220511163350.GL19626@telsasoft.com --- src/backend/commands/explain.c | 25 +++++++++++++++++---- src/test/regress/expected/merge.out | 35 +++++++++-------------------- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index c461061fe9..2de546f16e 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -4068,10 +4068,27 @@ show_modifytable_info(ModifyTableState *mtstate, List *ancestors, skipped_path = total - insert_path - update_path - delete_path; Assert(skipped_path >= 0); - ExplainPropertyFloat("Tuples Inserted", NULL, insert_path, 0, es); - ExplainPropertyFloat("Tuples Updated", NULL, update_path, 0, es); - ExplainPropertyFloat("Tuples Deleted", NULL, delete_path, 0, es); - ExplainPropertyFloat("Tuples Skipped", NULL, skipped_path, 0, es); + if (es->format == EXPLAIN_FORMAT_TEXT && total > 0) + { + ExplainIndentText(es); + appendStringInfoString(es->str, "Tuples:"); + if (insert_path > 0) + appendStringInfo(es->str, " inserted=%.0f", insert_path); + if (update_path > 0) + appendStringInfo(es->str, " updated=%.0f", update_path); + if (delete_path > 0) + appendStringInfo(es->str, " deleted=%.0f", delete_path); + if (skipped_path > 0) + appendStringInfo(es->str, " skipped=%.0f", skipped_path); + appendStringInfoChar(es->str, '\n'); + } + else + { + ExplainPropertyFloat("Tuples Inserted", NULL, insert_path, 0, es); + ExplainPropertyFloat("Tuples Updated", NULL, update_path, 0, es); + ExplainPropertyFloat("Tuples Deleted", NULL, delete_path, 0, es); + ExplainPropertyFloat("Tuples Skipped", NULL, skipped_path, 0, es); + } } } diff --git a/src/test/regress/expected/merge.out b/src/test/regress/expected/merge.out index 0fd037b45a..09d11ba742 100644 --- a/src/test/regress/expected/merge.out +++ b/src/test/regress/expected/merge.out @@ -1329,10 +1329,7 @@ WHEN MATCHED THEN explain_merge ---------------------------------------------------------------------- Merge on ex_mtarget t (actual rows=0 loops=1) - Tuples Inserted: 0 - Tuples Updated: 50 - Tuples Deleted: 0 - Tuples Skipped: 0 + Tuples: updated=50 -> Merge Join (actual rows=50 loops=1) Merge Cond: (t.a = s.a) -> Sort (actual rows=50 loops=1) @@ -1343,7 +1340,7 @@ WHEN MATCHED THEN Sort Key: s.a Sort Method: quicksort Memory: xxx -> Seq Scan on ex_msource s (actual rows=100 loops=1) -(15 rows) +(12 rows) -- only updates to selected tuples SELECT explain_merge(' @@ -1353,10 +1350,7 @@ WHEN MATCHED AND t.a < 10 THEN explain_merge ---------------------------------------------------------------------- Merge on ex_mtarget t (actual rows=0 loops=1) - Tuples Inserted: 0 - Tuples Updated: 5 - Tuples Deleted: 0 - Tuples Skipped: 45 + Tuples: updated=5 skipped=45 -> Merge Join (actual rows=50 loops=1) Merge Cond: (t.a = s.a) -> Sort (actual rows=50 loops=1) @@ -1367,7 +1361,7 @@ WHEN MATCHED AND t.a < 10 THEN Sort Key: s.a Sort Method: quicksort Memory: xxx -> Seq Scan on ex_msource s (actual rows=100 loops=1) -(15 rows) +(12 rows) -- updates + deletes SELECT explain_merge(' @@ -1379,10 +1373,7 @@ WHEN MATCHED AND t.a >= 10 AND t.a <= 20 THEN explain_merge ---------------------------------------------------------------------- Merge on ex_mtarget t (actual rows=0 loops=1) - Tuples Inserted: 0 - Tuples Updated: 5 - Tuples Deleted: 5 - Tuples Skipped: 40 + Tuples: updated=5 deleted=5 skipped=40 -> Merge Join (actual rows=50 loops=1) Merge Cond: (t.a = s.a) -> Sort (actual rows=50 loops=1) @@ -1393,7 +1384,7 @@ WHEN MATCHED AND t.a >= 10 AND t.a <= 20 THEN Sort Key: s.a Sort Method: quicksort Memory: xxx -> Seq Scan on ex_msource s (actual rows=100 loops=1) -(15 rows) +(12 rows) -- only inserts SELECT explain_merge(' @@ -1403,10 +1394,7 @@ WHEN NOT MATCHED AND s.a < 10 THEN explain_merge ---------------------------------------------------------------------- Merge on ex_mtarget t (actual rows=0 loops=1) - Tuples Inserted: 4 - Tuples Updated: 0 - Tuples Deleted: 0 - Tuples Skipped: 96 + Tuples: inserted=4 skipped=96 -> Merge Left Join (actual rows=100 loops=1) Merge Cond: (s.a = t.a) -> Sort (actual rows=100 loops=1) @@ -1417,7 +1405,7 @@ WHEN NOT MATCHED AND s.a < 10 THEN Sort Key: t.a Sort Method: quicksort Memory: xxx -> Seq Scan on ex_mtarget t (actual rows=45 loops=1) -(15 rows) +(12 rows) -- all three SELECT explain_merge(' @@ -1431,10 +1419,7 @@ WHEN NOT MATCHED AND s.a < 20 THEN explain_merge ---------------------------------------------------------------------- Merge on ex_mtarget t (actual rows=0 loops=1) - Tuples Inserted: 10 - Tuples Updated: 9 - Tuples Deleted: 5 - Tuples Skipped: 76 + Tuples: inserted=10 updated=9 deleted=5 skipped=76 -> Merge Left Join (actual rows=100 loops=1) Merge Cond: (s.a = t.a) -> Sort (actual rows=100 loops=1) @@ -1445,7 +1430,7 @@ WHEN NOT MATCHED AND s.a < 20 THEN Sort Key: t.a Sort Method: quicksort Memory: xxx -> Seq Scan on ex_mtarget t (actual rows=49 loops=1) -(15 rows) +(12 rows) DROP TABLE ex_msource, ex_mtarget; DROP FUNCTION explain_merge(text); From 0fbf0112002355efb2bb525ab88edf891dbfd033 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 18 May 2022 20:28:31 +0200 Subject: [PATCH 687/772] Check column list length in XMLTABLE/JSON_TABLE alias We weren't checking the length of the column list in the alias clause of an XMLTABLE or JSON_TABLE function (a "tablefunc" RTE), and it was possible to make the server crash by passing an overly long one. Fix it by throwing an error in that case, like the other places that deal with alias lists. In passing, modify the equivalent test used for join RTEs to look like the other ones, which was different for no apparent reason. This bug came in when XMLTABLE was born in version 10; backpatch to all stable versions. Reported-by: Wang Ke Discussion: https://postgr.es/m/17480-1c9d73565bb28e90@postgresql.org --- src/backend/parser/parse_clause.c | 15 --------------- src/backend/parser/parse_relation.c | 19 +++++++++++++++++-- src/test/regress/expected/int2.out | 4 ++++ src/test/regress/expected/join.out | 3 +++ src/test/regress/expected/jsonb_sqljson.out | 2 ++ src/test/regress/expected/with.out | 5 +++++ src/test/regress/expected/xml.out | 3 +++ src/test/regress/sql/int2.sql | 4 ++++ src/test/regress/sql/join.sql | 3 +++ src/test/regress/sql/jsonb_sqljson.sql | 2 ++ src/test/regress/sql/with.sql | 3 +++ src/test/regress/sql/xml.sql | 3 +++ 12 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index e2baa9d852..249255b65f 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -1444,21 +1444,6 @@ transformFromClauseItem(ParseState *pstate, Node *n, &res_colnames, &res_colvars, res_nscolumns + res_colindex); - /* - * Check alias (AS clause), if any. - */ - if (j->alias) - { - if (j->alias->colnames != NIL) - { - if (list_length(j->alias->colnames) > list_length(res_colnames)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("column alias list for \"%s\" has too many entries", - j->alias->aliasname))); - } - } - /* * Now build an RTE and nsitem for the result of the join. * res_nscolumns isn't totally done yet, but that's OK because diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index 00469763e8..926dcbf30e 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -1989,11 +1989,13 @@ addRangeTableEntryForTableFunc(ParseState *pstate, bool inFromCl) { RangeTblEntry *rte = makeNode(RangeTblEntry); - char *refname = alias ? alias->aliasname : - pstrdup(tf->functype == TFT_XMLTABLE ? "xmltable" : "json_table"); + char *refname; Alias *eref; int numaliases; + refname = alias ? alias->aliasname : + pstrdup(tf->functype == TFT_XMLTABLE ? "xmltable" : "json_table"); + Assert(pstate != NULL); rte->rtekind = RTE_TABLEFUNC; @@ -2013,6 +2015,13 @@ addRangeTableEntryForTableFunc(ParseState *pstate, eref->colnames = list_concat(eref->colnames, list_copy_tail(tf->colnames, numaliases)); + if (numaliases > list_length(tf->colnames)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), + errmsg("%s function has %d columns available but %d columns specified", + tf->functype == TFT_XMLTABLE ? "XMLTABLE" : "JSON_TABLE", + list_length(tf->colnames), numaliases))); + rte->eref = eref; /* @@ -2192,6 +2201,12 @@ addRangeTableEntryForJoin(ParseState *pstate, eref->colnames = list_concat(eref->colnames, list_copy_tail(colnames, numaliases)); + if (numaliases > list_length(colnames)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), + errmsg("join expression \"%s\" has %d columns available but %d columns specified", + eref->aliasname, list_length(colnames), numaliases))); + rte->eref = eref; /* diff --git a/src/test/regress/expected/int2.out b/src/test/regress/expected/int2.out index 0306648fa2..109cf9baaa 100644 --- a/src/test/regress/expected/int2.out +++ b/src/test/regress/expected/int2.out @@ -45,6 +45,10 @@ SELECT * FROM INT2_TBL; -32767 (5 rows) +SELECT * FROM INT2_TBL AS f(a, b); +ERROR: table "f" has 1 columns available but 2 columns specified +SELECT * FROM (TABLE int2_tbl) AS s (a, b); +ERROR: table "s" has 1 columns available but 2 columns specified SELECT i.* FROM INT2_TBL i WHERE i.f1 <> int2 '0'; f1 -------- diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out index bd3375f2ba..2538bd6a79 100644 --- a/src/test/regress/expected/join.out +++ b/src/test/regress/expected/join.out @@ -5872,6 +5872,9 @@ select * from 3 | 3 (6 rows) +-- check the number of columns specified +SELECT * FROM (int8_tbl i cross join int4_tbl j) ss(a,b,c,d); +ERROR: join expression "ss" has 3 columns available but 4 columns specified -- check we don't try to do a unique-ified semijoin with LATERAL explain (verbose, costs off) select * from diff --git a/src/test/regress/expected/jsonb_sqljson.out b/src/test/regress/expected/jsonb_sqljson.out index 28338b4d19..ec7dc50593 100644 --- a/src/test/regress/expected/jsonb_sqljson.out +++ b/src/test/regress/expected/jsonb_sqljson.out @@ -1031,6 +1031,8 @@ SELECT * FROM JSON_TABLE(NULL, '$' COLUMNS ()); ERROR: syntax error at or near ")" LINE 1: SELECT * FROM JSON_TABLE(NULL, '$' COLUMNS ()); ^ +SELECT * FROM JSON_TABLE (NULL::jsonb, '$' COLUMNS (v1 timestamp)) AS f (v1, v2); +ERROR: JSON_TABLE function has 1 columns available but 2 columns specified -- NULL => empty table SELECT * FROM JSON_TABLE(NULL::jsonb, '$' COLUMNS (foo int)) bar; foo diff --git a/src/test/regress/expected/with.out b/src/test/regress/expected/with.out index d731604374..30dd900e11 100644 --- a/src/test/regress/expected/with.out +++ b/src/test/regress/expected/with.out @@ -1794,6 +1794,11 @@ DROP TABLE y; -- -- error cases -- +WITH x(n, b) AS (SELECT 1) +SELECT * FROM x; +ERROR: WITH query "x" has 1 columns available but 2 columns specified +LINE 1: WITH x(n, b) AS (SELECT 1) + ^ -- INTERSECT WITH RECURSIVE x(n) AS (SELECT 1 INTERSECT SELECT n+1 FROM x) SELECT * FROM x; diff --git a/src/test/regress/expected/xml.out b/src/test/regress/expected/xml.out index 55b65ef324..55ac49be26 100644 --- a/src/test/regress/expected/xml.out +++ b/src/test/regress/expected/xml.out @@ -1145,6 +1145,9 @@ EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME/text()'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) (7 rows) +-- errors +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); +ERROR: XMLTABLE function has 1 columns available but 2 columns specified -- XMLNAMESPACES tests SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y/' AS zz), '/zz:rows/zz:row' diff --git a/src/test/regress/sql/int2.sql b/src/test/regress/sql/int2.sql index 8e8d33892d..ea29066b78 100644 --- a/src/test/regress/sql/int2.sql +++ b/src/test/regress/sql/int2.sql @@ -17,6 +17,10 @@ INSERT INTO INT2_TBL(f1) VALUES (''); SELECT * FROM INT2_TBL; +SELECT * FROM INT2_TBL AS f(a, b); + +SELECT * FROM (TABLE int2_tbl) AS s (a, b); + SELECT i.* FROM INT2_TBL i WHERE i.f1 <> int2 '0'; SELECT i.* FROM INT2_TBL i WHERE i.f1 <> int4 '0'; diff --git a/src/test/regress/sql/join.sql b/src/test/regress/sql/join.sql index 6dd01b022e..a27a72086e 100644 --- a/src/test/regress/sql/join.sql +++ b/src/test/regress/sql/join.sql @@ -1985,6 +1985,9 @@ select * from (select q1.v) ) as q2; +-- check the number of columns specified +SELECT * FROM (int8_tbl i cross join int4_tbl j) ss(a,b,c,d); + -- check we don't try to do a unique-ified semijoin with LATERAL explain (verbose, costs off) select * from diff --git a/src/test/regress/sql/jsonb_sqljson.sql b/src/test/regress/sql/jsonb_sqljson.sql index ba1895d42d..fff2537480 100644 --- a/src/test/regress/sql/jsonb_sqljson.sql +++ b/src/test/regress/sql/jsonb_sqljson.sql @@ -328,6 +328,8 @@ SELECT JSON_TABLE('[]', '$'); -- Should fail (no columns) SELECT * FROM JSON_TABLE(NULL, '$' COLUMNS ()); +SELECT * FROM JSON_TABLE (NULL::jsonb, '$' COLUMNS (v1 timestamp)) AS f (v1, v2); + -- NULL => empty table SELECT * FROM JSON_TABLE(NULL::jsonb, '$' COLUMNS (foo int)) bar; diff --git a/src/test/regress/sql/with.sql b/src/test/regress/sql/with.sql index 3251c29584..5c52561a8a 100644 --- a/src/test/regress/sql/with.sql +++ b/src/test/regress/sql/with.sql @@ -803,6 +803,9 @@ DROP TABLE y; -- error cases -- +WITH x(n, b) AS (SELECT 1) +SELECT * FROM x; + -- INTERSECT WITH RECURSIVE x(n) AS (SELECT 1 INTERSECT SELECT n+1 FROM x) SELECT * FROM x; diff --git a/src/test/regress/sql/xml.sql b/src/test/regress/sql/xml.sql index f3f83c7827..e3f90db4d5 100644 --- a/src/test/regress/sql/xml.sql +++ b/src/test/regress/sql/xml.sql @@ -384,6 +384,9 @@ SELECT * FROM xmltableview1; EXPLAIN (COSTS OFF) SELECT * FROM xmltableview1; EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; +-- errors +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); + -- XMLNAMESPACES tests SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y/' AS zz), '/zz:rows/zz:row' From 12e423e21d8ef47d95a099c12f625f6d191eaf92 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 18 May 2022 21:20:49 +0200 Subject: [PATCH 688/772] Fix EXPLAIN MERGE output when no tuples are processed An 'else' clause was misplaced in commit 598ac10be1c2, making zero-rows output look a bit silly. Add a test case for it. Pointed out by Tom Lane. Discussion: https://postgr.es/m/21030.1652893083@sss.pgh.pa.us --- src/backend/commands/explain.c | 27 +++++++++++++++------------ src/test/regress/expected/merge.out | 20 +++++++++++++++++++- src/test/regress/sql/merge.sql | 8 +++++++- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 2de546f16e..5d1f7089da 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -4068,19 +4068,22 @@ show_modifytable_info(ModifyTableState *mtstate, List *ancestors, skipped_path = total - insert_path - update_path - delete_path; Assert(skipped_path >= 0); - if (es->format == EXPLAIN_FORMAT_TEXT && total > 0) + if (es->format == EXPLAIN_FORMAT_TEXT) { - ExplainIndentText(es); - appendStringInfoString(es->str, "Tuples:"); - if (insert_path > 0) - appendStringInfo(es->str, " inserted=%.0f", insert_path); - if (update_path > 0) - appendStringInfo(es->str, " updated=%.0f", update_path); - if (delete_path > 0) - appendStringInfo(es->str, " deleted=%.0f", delete_path); - if (skipped_path > 0) - appendStringInfo(es->str, " skipped=%.0f", skipped_path); - appendStringInfoChar(es->str, '\n'); + if (total > 0) + { + ExplainIndentText(es); + appendStringInfoString(es->str, "Tuples:"); + if (insert_path > 0) + appendStringInfo(es->str, " inserted=%.0f", insert_path); + if (update_path > 0) + appendStringInfo(es->str, " updated=%.0f", update_path); + if (delete_path > 0) + appendStringInfo(es->str, " deleted=%.0f", delete_path); + if (skipped_path > 0) + appendStringInfo(es->str, " skipped=%.0f", skipped_path); + appendStringInfoChar(es->str, '\n'); + } } else { diff --git a/src/test/regress/expected/merge.out b/src/test/regress/expected/merge.out index 09d11ba742..af670e28e7 100644 --- a/src/test/regress/expected/merge.out +++ b/src/test/regress/expected/merge.out @@ -1316,7 +1316,7 @@ BEGIN EXECUTE 'explain (analyze, timing off, summary off, costs off) ' || query LOOP - ln := regexp_replace(ln, 'Memory: \S*', 'Memory: xxx'); + ln := regexp_replace(ln, '(Memory( Usage)?|Buckets|Batches): \S*', '\1: xxx', 'g'); RETURN NEXT ln; END LOOP; END; @@ -1432,6 +1432,24 @@ WHEN NOT MATCHED AND s.a < 20 THEN -> Seq Scan on ex_mtarget t (actual rows=49 loops=1) (12 rows) +-- nothing +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a AND t.a < -1000 +WHEN MATCHED AND t.a < 10 THEN + DO NOTHING'); + explain_merge +-------------------------------------------------------------------- + Merge on ex_mtarget t (actual rows=0 loops=1) + -> Hash Join (actual rows=0 loops=1) + Hash Cond: (s.a = t.a) + -> Seq Scan on ex_msource s (actual rows=1 loops=1) + -> Hash (actual rows=0 loops=1) + Buckets: xxx Batches: xxx Memory Usage: xxx + -> Seq Scan on ex_mtarget t (actual rows=0 loops=1) + Filter: (a < '-1000'::integer) + Rows Removed by Filter: 54 +(9 rows) + DROP TABLE ex_msource, ex_mtarget; DROP FUNCTION explain_merge(text); -- Subqueries diff --git a/src/test/regress/sql/merge.sql b/src/test/regress/sql/merge.sql index 8815e0cc49..afeb212f3c 100644 --- a/src/test/regress/sql/merge.sql +++ b/src/test/regress/sql/merge.sql @@ -878,7 +878,7 @@ BEGIN EXECUTE 'explain (analyze, timing off, summary off, costs off) ' || query LOOP - ln := regexp_replace(ln, 'Memory: \S*', 'Memory: xxx'); + ln := regexp_replace(ln, '(Memory( Usage)?|Buckets|Batches): \S*', '\1: xxx', 'g'); RETURN NEXT ln; END LOOP; END; @@ -920,6 +920,12 @@ WHEN MATCHED AND t.a >= 30 AND t.a <= 40 THEN WHEN NOT MATCHED AND s.a < 20 THEN INSERT VALUES (a, b)'); +-- nothing +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a AND t.a < -1000 +WHEN MATCHED AND t.a < 10 THEN + DO NOTHING'); + DROP TABLE ex_msource, ex_mtarget; DROP FUNCTION explain_merge(text); From 62221ef187b0098c8f331f804b7c63859e5ee6ff Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 18 May 2022 23:19:53 +0200 Subject: [PATCH 689/772] Update xml_1.out and xml_2.out Commit 0fbf01120023 should have updated them but didn't. --- src/test/regress/expected/xml_1.out | 3 +++ src/test/regress/expected/xml_2.out | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/test/regress/expected/xml_1.out b/src/test/regress/expected/xml_1.out index 9aadc89a89..3477606af7 100644 --- a/src/test/regress/expected/xml_1.out +++ b/src/test/regress/expected/xml_1.out @@ -873,6 +873,9 @@ EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME/text()'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) (7 rows) +-- errors +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); +ERROR: XMLTABLE function has 1 columns available but 2 columns specified -- XMLNAMESPACES tests SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y/' AS zz), '/zz:rows/zz:row' diff --git a/src/test/regress/expected/xml_2.out b/src/test/regress/expected/xml_2.out index 0484260281..493c6186e1 100644 --- a/src/test/regress/expected/xml_2.out +++ b/src/test/regress/expected/xml_2.out @@ -1125,6 +1125,9 @@ EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME/text()'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) (7 rows) +-- errors +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); +ERROR: XMLTABLE function has 1 columns available but 2 columns specified -- XMLNAMESPACES tests SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y/' AS zz), '/zz:rows/zz:row' From 0ff20288e1cb3282efb43401896a939916fceb4d Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Thu, 19 May 2022 08:20:55 +0530 Subject: [PATCH 690/772] Extend pg_publication_tables to display column list and row filter. Commit 923def9a53 and 52e4f0cd47 allowed to specify column lists and row filters for publication tables. This commit extends the pg_publication_tables view and pg_get_publication_tables function to display that information. This information will be useful to users and we also need this for the later commit that prohibits combining multiple publications with different column lists for the same table. Author: Hou Zhijie Reviewed By: Amit Kapila, Alvaro Herrera, Shi Yu, Takamichi Osumi Discussion: https://postgr.es/m/202204251548.mudq7jbqnh7r@alvherre.pgsql --- doc/src/sgml/catalogs.sgml | 27 +++++++++-- src/backend/catalog/pg_publication.c | 54 ++++++++++++++++++++- src/backend/catalog/system_views.sql | 10 +++- src/backend/replication/logical/tablesync.c | 14 ++---- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_proc.dat | 8 +-- src/test/regress/expected/publication.out | 42 ++++++++-------- src/test/regress/expected/rules.out | 13 ++++- 8 files changed, 126 insertions(+), 44 deletions(-) diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index a533a2153e..d96c72e531 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -9691,7 +9691,7 @@ SCRAM-SHA-256$<iteration count>:&l pg_publication_tables - publications and their associated tables + publications and information of their associated tables @@ -11635,8 +11635,8 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx The view pg_publication_tables provides - information about the mapping between publications and the tables they - contain. Unlike the underlying catalog + information about the mapping between publications and information of + tables they contain. Unlike the underlying catalog pg_publication_rel, this view expands publications defined as FOR ALL TABLES and FOR ALL TABLES IN SCHEMA, so for such publications @@ -11687,6 +11687,27 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx Name of table + + + + attnames name[] + (references pg_attribute.attname) + + + Names of table columns included in the publication. This contains all + the columns of the table when the user didn't specify the column list + for the table. + + + + + + rowfilter text + + + Expression for the table's publication qualifying condition + +
diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index e2c8bcb279..8c7fca62de 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -1077,11 +1077,12 @@ get_publication_name(Oid pubid, bool missing_ok) } /* - * Returns Oids of tables in a publication. + * Returns information of tables in a publication. */ Datum pg_get_publication_tables(PG_FUNCTION_ARGS) { +#define NUM_PUBLICATOIN_TABLES_ELEM 3 FuncCallContext *funcctx; char *pubname = text_to_cstring(PG_GETARG_TEXT_PP(0)); Publication *publication; @@ -1090,6 +1091,7 @@ pg_get_publication_tables(PG_FUNCTION_ARGS) /* stuff done only on the first call of the function */ if (SRF_IS_FIRSTCALL()) { + TupleDesc tupdesc; MemoryContext oldcontext; /* create a function context for cross-call persistence */ @@ -1136,6 +1138,16 @@ pg_get_publication_tables(PG_FUNCTION_ARGS) tables = filter_partitions(tables); } + /* Construct a tuple descriptor for the result rows. */ + tupdesc = CreateTemplateTupleDesc(NUM_PUBLICATOIN_TABLES_ELEM); + TupleDescInitEntry(tupdesc, (AttrNumber) 1, "relid", + OIDOID, -1, 0); + TupleDescInitEntry(tupdesc, (AttrNumber) 2, "attrs", + INT2VECTOROID, -1, 0); + TupleDescInitEntry(tupdesc, (AttrNumber) 3, "qual", + PG_NODE_TREEOID, -1, 0); + + funcctx->tuple_desc = BlessTupleDesc(tupdesc); funcctx->user_fctx = (void *) tables; MemoryContextSwitchTo(oldcontext); @@ -1147,9 +1159,47 @@ pg_get_publication_tables(PG_FUNCTION_ARGS) if (funcctx->call_cntr < list_length(tables)) { + HeapTuple pubtuple = NULL; + HeapTuple rettuple; Oid relid = list_nth_oid(tables, funcctx->call_cntr); + Datum values[NUM_PUBLICATOIN_TABLES_ELEM]; + bool nulls[NUM_PUBLICATOIN_TABLES_ELEM]; + + /* + * Form tuple with appropriate data. + */ + MemSet(nulls, 0, sizeof(nulls)); + MemSet(values, 0, sizeof(values)); + + publication = GetPublicationByName(pubname, false); + + values[0] = ObjectIdGetDatum(relid); + + pubtuple = SearchSysCacheCopy2(PUBLICATIONRELMAP, + ObjectIdGetDatum(relid), + ObjectIdGetDatum(publication->oid)); + + if (HeapTupleIsValid(pubtuple)) + { + /* Lookup the column list attribute. */ + values[1] = SysCacheGetAttr(PUBLICATIONRELMAP, pubtuple, + Anum_pg_publication_rel_prattrs, + &(nulls[1])); + + /* Null indicates no filter. */ + values[2] = SysCacheGetAttr(PUBLICATIONRELMAP, pubtuple, + Anum_pg_publication_rel_prqual, + &(nulls[2])); + } + else + { + nulls[1] = true; + nulls[2] = true; + } + + rettuple = heap_form_tuple(funcctx->tuple_desc, values, nulls); - SRF_RETURN_NEXT(funcctx, ObjectIdGetDatum(relid)); + SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(rettuple)); } SRF_RETURN_DONE(funcctx); diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 0fc614e32c..fedaed533b 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -368,7 +368,15 @@ CREATE VIEW pg_publication_tables AS SELECT P.pubname AS pubname, N.nspname AS schemaname, - C.relname AS tablename + C.relname AS tablename, + ( SELECT array_agg(a.attname ORDER BY a.attnum) + FROM unnest(CASE WHEN GPT.attrs IS NOT NULL THEN GPT.attrs + ELSE (SELECT array_agg(g) FROM generate_series(1, C.relnatts) g) + END) k + JOIN pg_attribute a + ON (a.attrelid = GPT.relid AND a.attnum = k) + ) AS attnames, + pg_get_expr(GPT.qual, GPT.relid) AS rowfilter FROM pg_publication P, LATERAL pg_get_publication_tables(P.pubname) GPT, pg_class C JOIN pg_namespace N ON (N.oid = C.relnamespace) diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index b03e0f5aac..994c7a09d9 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -795,15 +795,12 @@ fetch_remote_table_info(char *nspname, char *relname, resetStringInfo(&cmd); appendStringInfo(&cmd, "SELECT DISTINCT unnest" - " FROM pg_publication p" - " LEFT OUTER JOIN pg_publication_rel pr" - " ON (p.oid = pr.prpubid AND pr.prrelid = %u)" - " LEFT OUTER JOIN unnest(pr.prattrs) ON TRUE," + " FROM pg_publication p," " LATERAL pg_get_publication_tables(p.pubname) gpt" + " LEFT OUTER JOIN unnest(gpt.attrs) ON TRUE" " WHERE gpt.relid = %u" " AND p.pubname IN ( %s )", lrel->remoteid, - lrel->remoteid, pub_names.data); pubres = walrcv_exec(LogRepWorkerWalRcvConn, cmd.data, @@ -965,15 +962,12 @@ fetch_remote_table_info(char *nspname, char *relname, /* Check for row filters. */ resetStringInfo(&cmd); appendStringInfo(&cmd, - "SELECT DISTINCT pg_get_expr(pr.prqual, pr.prrelid)" - " FROM pg_publication p" - " LEFT OUTER JOIN pg_publication_rel pr" - " ON (p.oid = pr.prpubid AND pr.prrelid = %u)," + "SELECT DISTINCT pg_get_expr(gpt.qual, gpt.relid)" + " FROM pg_publication p," " LATERAL pg_get_publication_tables(p.pubname) gpt" " WHERE gpt.relid = %u" " AND p.pubname IN ( %s )", lrel->remoteid, - lrel->remoteid, pub_names.data); res = walrcv_exec(LogRepWorkerWalRcvConn, cmd.data, 1, qualRow); diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 2cdcfa667a..8eac3f8c82 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202205131 +#define CATALOG_VERSION_NO 202205191 #endif diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index babe16f00a..87aa571a33 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -11673,11 +11673,11 @@ prosrc => 'pg_show_replication_origin_status' }, # publications -{ oid => '6119', descr => 'get OIDs of tables in a publication', +{ oid => '6119', descr => 'get information of tables in a publication', proname => 'pg_get_publication_tables', prorows => '1000', proretset => 't', - provolatile => 's', prorettype => 'oid', proargtypes => 'text', - proallargtypes => '{text,oid}', proargmodes => '{i,o}', - proargnames => '{pubname,relid}', prosrc => 'pg_get_publication_tables' }, + provolatile => 's', prorettype => 'record', proargtypes => 'text', + proallargtypes => '{text,oid,int2vector,pg_node_tree}', proargmodes => '{i,o,o,o}', + proargnames => '{pubname,relid,attrs,qual}', prosrc => 'pg_get_publication_tables' }, { oid => '6121', descr => 'returns whether a relation can be part of a publication', proname => 'pg_relation_is_publishable', provolatile => 's', diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index 398c0f38f6..274b37dfe5 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -1585,52 +1585,52 @@ CREATE TABLE sch2.tbl1_part1 PARTITION OF sch1.tbl1 FOR VALUES FROM (1) to (10); -- Schema publication that does not include the schema that has the parent table CREATE PUBLICATION pub FOR ALL TABLES IN SCHEMA sch2 WITH (PUBLISH_VIA_PARTITION_ROOT=1); SELECT * FROM pg_publication_tables; - pubname | schemaname | tablename ----------+------------+------------ - pub | sch2 | tbl1_part1 + pubname | schemaname | tablename | attnames | rowfilter +---------+------------+------------+----------+----------- + pub | sch2 | tbl1_part1 | {a} | (1 row) DROP PUBLICATION pub; -- Table publication that does not include the parent table CREATE PUBLICATION pub FOR TABLE sch2.tbl1_part1 WITH (PUBLISH_VIA_PARTITION_ROOT=1); SELECT * FROM pg_publication_tables; - pubname | schemaname | tablename ----------+------------+------------ - pub | sch2 | tbl1_part1 + pubname | schemaname | tablename | attnames | rowfilter +---------+------------+------------+----------+----------- + pub | sch2 | tbl1_part1 | {a} | (1 row) -- Table publication that includes both the parent table and the child table ALTER PUBLICATION pub ADD TABLE sch1.tbl1; SELECT * FROM pg_publication_tables; - pubname | schemaname | tablename ----------+------------+----------- - pub | sch1 | tbl1 + pubname | schemaname | tablename | attnames | rowfilter +---------+------------+-----------+----------+----------- + pub | sch1 | tbl1 | {a} | (1 row) DROP PUBLICATION pub; -- Schema publication that does not include the schema that has the parent table CREATE PUBLICATION pub FOR ALL TABLES IN SCHEMA sch2 WITH (PUBLISH_VIA_PARTITION_ROOT=0); SELECT * FROM pg_publication_tables; - pubname | schemaname | tablename ----------+------------+------------ - pub | sch2 | tbl1_part1 + pubname | schemaname | tablename | attnames | rowfilter +---------+------------+------------+----------+----------- + pub | sch2 | tbl1_part1 | {a} | (1 row) DROP PUBLICATION pub; -- Table publication that does not include the parent table CREATE PUBLICATION pub FOR TABLE sch2.tbl1_part1 WITH (PUBLISH_VIA_PARTITION_ROOT=0); SELECT * FROM pg_publication_tables; - pubname | schemaname | tablename ----------+------------+------------ - pub | sch2 | tbl1_part1 + pubname | schemaname | tablename | attnames | rowfilter +---------+------------+------------+----------+----------- + pub | sch2 | tbl1_part1 | {a} | (1 row) -- Table publication that includes both the parent table and the child table ALTER PUBLICATION pub ADD TABLE sch1.tbl1; SELECT * FROM pg_publication_tables; - pubname | schemaname | tablename ----------+------------+------------ - pub | sch2 | tbl1_part1 + pubname | schemaname | tablename | attnames | rowfilter +---------+------------+------------+----------+----------- + pub | sch2 | tbl1_part1 | {a} | (1 row) DROP PUBLICATION pub; @@ -1643,9 +1643,9 @@ CREATE TABLE sch1.tbl1_part3 (a int) PARTITION BY RANGE(a); ALTER TABLE sch1.tbl1 ATTACH PARTITION sch1.tbl1_part3 FOR VALUES FROM (20) to (30); CREATE PUBLICATION pub FOR ALL TABLES IN SCHEMA sch1 WITH (PUBLISH_VIA_PARTITION_ROOT=1); SELECT * FROM pg_publication_tables; - pubname | schemaname | tablename ----------+------------+----------- - pub | sch1 | tbl1 + pubname | schemaname | tablename | attnames | rowfilter +---------+------------+-----------+----------+----------- + pub | sch1 | tbl1 | {a} | (1 row) RESET client_min_messages; diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 21effe8315..fc3cde3226 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -1437,9 +1437,18 @@ pg_prepared_xacts| SELECT p.transaction, LEFT JOIN pg_database d ON ((p.dbid = d.oid))); pg_publication_tables| SELECT p.pubname, n.nspname AS schemaname, - c.relname AS tablename + c.relname AS tablename, + ( SELECT array_agg(a.attname ORDER BY a.attnum) AS array_agg + FROM (unnest( + CASE + WHEN (gpt.attrs IS NOT NULL) THEN (gpt.attrs)::integer[] + ELSE ( SELECT array_agg(g.g) AS array_agg + FROM generate_series(1, (c.relnatts)::integer) g(g)) + END) k(k) + JOIN pg_attribute a ON (((a.attrelid = gpt.relid) AND (a.attnum = k.k))))) AS attnames, + pg_get_expr(gpt.qual, gpt.relid) AS rowfilter FROM pg_publication p, - LATERAL pg_get_publication_tables((p.pubname)::text) gpt(relid), + LATERAL pg_get_publication_tables((p.pubname)::text) gpt(relid, attrs, qual), (pg_class c JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.oid = gpt.relid); From c4a4e760f6b0e7933e7d3bff0b589af9da49f8e6 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Thu, 19 May 2022 17:14:23 +1200 Subject: [PATCH 691/772] Fix incorrect comments for Memoize struct Reported-by: Peter Eisentraut Discussion: https://postgr.es/m/0635f5aa-4973-8dc2-4e4e-df9fd5778a65@enterprisedb.com Backpatch-through: 14, where Memoize was added --- src/include/nodes/plannodes.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h index e319e83bd8..0ea9a22dfb 100644 --- a/src/include/nodes/plannodes.h +++ b/src/include/nodes/plannodes.h @@ -824,8 +824,9 @@ typedef struct Memoize int numKeys; /* size of the two arrays below */ Oid *hashOperators; /* hash operators for each key */ - Oid *collations; /* cache keys */ - List *param_exprs; /* exprs containing parameters */ + Oid *collations; /* collations for each key */ + List *param_exprs; /* cache keys in the form of exprs containing + * parameters */ bool singlerow; /* true if the cache entry should be marked as * complete after we store the first tuple in * it. */ From 648aa6734fefb2cc2c9bba7d6444890e727eaca1 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 19 May 2022 09:27:34 +0200 Subject: [PATCH 692/772] doc: Properly punctuate "etc." --- doc/src/sgml/arch-dev.sgml | 2 +- doc/src/sgml/bki.sgml | 4 ++-- doc/src/sgml/config.sgml | 4 ++-- doc/src/sgml/datetime.sgml | 2 +- doc/src/sgml/ddl.sgml | 2 +- doc/src/sgml/extend.sgml | 2 +- doc/src/sgml/func.sgml | 2 +- doc/src/sgml/glossary.sgml | 2 +- doc/src/sgml/libpq.sgml | 8 ++++---- doc/src/sgml/manage-ag.sgml | 2 +- doc/src/sgml/plperl.sgml | 6 +++--- doc/src/sgml/pltcl.sgml | 2 +- doc/src/sgml/postgres-fdw.sgml | 2 +- doc/src/sgml/protocol.sgml | 12 ++++++------ doc/src/sgml/ref/values.sgml | 2 +- doc/src/sgml/sources.sgml | 4 ++-- doc/src/sgml/syntax.sgml | 2 +- doc/src/sgml/xfunc.sgml | 2 +- doc/src/sgml/xml2.sgml | 2 +- 19 files changed, 32 insertions(+), 32 deletions(-) diff --git a/doc/src/sgml/arch-dev.sgml b/doc/src/sgml/arch-dev.sgml index c2be28fac8..1315ce962d 100644 --- a/doc/src/sgml/arch-dev.sgml +++ b/doc/src/sgml/arch-dev.sgml @@ -261,7 +261,7 @@ system catalog lookups can only be done within a transaction, and we do not wish to start a transaction immediately upon receiving a query string. The raw parsing stage is sufficient to identify the transaction - control commands (BEGIN, ROLLBACK, etc), and + control commands (BEGIN, ROLLBACK, etc.), and these can then be correctly executed without any further analysis. Once we know that we are dealing with an actual query (such as SELECT or UPDATE), it is okay to diff --git a/doc/src/sgml/bki.sgml b/doc/src/sgml/bki.sgml index 20894baf18..f71644e398 100644 --- a/doc/src/sgml/bki.sgml +++ b/doc/src/sgml/bki.sgml @@ -836,11 +836,11 @@ $ perl rewrite_dat_with_prokind.pl pg_proc.dat When bootstrap is specified, the table will only be created on disk; nothing is entered into pg_class, - pg_attribute, etc, for it. Thus the + pg_attribute, etc., for it. Thus the table will not be accessible by ordinary SQL operations until such entries are made the hard way (with insert commands). This option is used for creating - pg_class etc themselves. + pg_class etc. themselves. diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 03986946a8..8cefe7045b 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -6374,7 +6374,7 @@ local0.* /var/log/postgresql Example: To keep 7 days of logs, one log file per day named server_log.Mon, server_log.Tue, - etc, and automatically overwrite last week's log with this week's log, + etc., and automatically overwrite last week's log with this week's log, set log_filename to server_log.%a, log_truncate_on_rotation to on, and log_rotation_age to 1440. @@ -8552,7 +8552,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; alias pg_temppg_temp. If it is not listed in the path then it is searched first (even before pg_catalog). However, the temporary schema is only searched for relation (table, view, - sequence, etc) and data type names. It is never searched for + sequence, etc.) and data type names. It is never searched for function or operator names. diff --git a/doc/src/sgml/datetime.sgml b/doc/src/sgml/datetime.sgml index adaf72dcbd..ecc3245a46 100644 --- a/doc/src/sgml/datetime.sgml +++ b/doc/src/sgml/datetime.sgml @@ -515,7 +515,7 @@ For reference purposes, a standard installation also contains files - Africa.txt, America.txt, etc, containing + Africa.txt, America.txt, etc., containing information about every time zone abbreviation known to be in use according to the IANA timezone database. The zone name definitions found in these files can be copied and pasted into a custom diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml index f2ac1ba003..b01e3ad544 100644 --- a/doc/src/sgml/ddl.sgml +++ b/doc/src/sgml/ddl.sgml @@ -1694,7 +1694,7 @@ ALTER TABLE products RENAME TO items; EXECUTE, USAGE, SET and ALTER SYSTEM. The privileges applicable to a particular - object vary depending on the object's type (table, function, etc). + object vary depending on the object's type (table, function, etc.). More detail about the meanings of these privileges appears below. The following sections and chapters will also show you how these privileges are used. diff --git a/doc/src/sgml/extend.sgml b/doc/src/sgml/extend.sgml index e928894726..b3857015b1 100644 --- a/doc/src/sgml/extend.sgml +++ b/doc/src/sgml/extend.sgml @@ -825,7 +825,7 @@ RETURNS anycompatible AS ... An extension's SQL script files can contain any SQL commands, except for transaction control commands (BEGIN, - COMMIT, etc) and commands that cannot be executed inside a + COMMIT, etc.) and commands that cannot be executed inside a transaction block (such as VACUUM). This is because the script files are implicitly executed within a transaction block. diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 85ecc639fd..8819b60685 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -6156,7 +6156,7 @@ regexp_substr('ABCDEFGHI', '(c..)(...)', 1, 1, 'i', 2) A branch is zero or more quantified atoms or constraints, concatenated. - It matches a match for the first, followed by a match for the second, etc; + It matches a match for the first, followed by a match for the second, etc.; an empty branch matches the empty string. diff --git a/doc/src/sgml/glossary.sgml b/doc/src/sgml/glossary.sgml index f81fdc31f9..d6d0a3a814 100644 --- a/doc/src/sgml/glossary.sgml +++ b/doc/src/sgml/glossary.sgml @@ -1389,7 +1389,7 @@ More generically, the term schema is used to mean all data descriptions (table definitions, - constraints, comments, etc) + constraints, comments, etc.) for a given database or subset thereof. diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index 1c20901c3c..40035d7656 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -3049,7 +3049,7 @@ PGresult *PQdescribePrepared(PGconn *conn, const char *stmtName); PGresult to obtain information about the parameters of the prepared statement, and the functions , , - , etc provide information about the + , etc. provide information about the result columns (if any) of the statement. @@ -3081,7 +3081,7 @@ PGresult *PQdescribePortal(PGconn *conn, const char *portalName); portal. On success, a PGresult with status PGRES_COMMAND_OK is returned. The functions , , - , etc can be applied to the + , etc. can be applied to the PGresult to obtain information about the result columns (if any) of the portal. @@ -5544,7 +5544,7 @@ UPDATE mytable SET x = x + 1 WHERE id = 42; more rows will arrive. (But note that it is still necessary to continue calling until it returns null.) All of these PGresult objects will contain the same row - description data (column names, types, etc) that an ordinary + description data (column names, types, etc.) that an ordinary PGresult object for the query would have. Each object should be freed with as usual. @@ -6010,7 +6010,7 @@ typedef struct pgNotify 0 indicates the overall copy format is textual (rows separated by - newlines, columns separated by separator characters, etc). 1 + newlines, columns separated by separator characters, etc.). 1 indicates the overall copy format is binary. See for more information. diff --git a/doc/src/sgml/manage-ag.sgml b/doc/src/sgml/manage-ag.sgml index 23f116befe..8903ab2fc9 100644 --- a/doc/src/sgml/manage-ag.sgml +++ b/doc/src/sgml/manage-ag.sgml @@ -412,7 +412,7 @@ dropdb dbname of data files. They are dependent on metadata contained in the main data directory, and therefore cannot be attached to a different database cluster or backed up individually. Similarly, if you lose - a tablespace (file deletion, disk failure, etc), the database cluster + a tablespace (file deletion, disk failure, etc.), the database cluster might become unreadable or unable to start. Placing a tablespace on a temporary file system like a RAM disk risks the reliability of the entire cluster. diff --git a/doc/src/sgml/plperl.sgml b/doc/src/sgml/plperl.sgml index 627c7936fc..6c81ee8fbe 100644 --- a/doc/src/sgml/plperl.sgml +++ b/doc/src/sgml/plperl.sgml @@ -632,7 +632,7 @@ SELECT * from lotsa_md5(500); spi_prepare, spi_query_prepared, spi_exec_prepared, and spi_freeplan implement the same functionality but for prepared queries. - spi_prepare accepts a query string with numbered argument placeholders ($1, $2, etc) + spi_prepare accepts a query string with numbered argument placeholders ($1, $2, etc.) and a string list of argument types: $plan = spi_prepare('SELECT * FROM test WHERE id > $1 AND name = $2', @@ -677,7 +677,7 @@ SELECT done(); 2005-12-10 | 2005-12-11 | 2005-12-12 Note that the parameter subscript in spi_prepare is defined via - $1, $2, $3, etc, so avoid declaring query strings in double quotes that might easily + $1, $2, $3, etc., so avoid declaring query strings in double quotes that might easily lead to hard-to-catch bugs. @@ -1051,7 +1051,7 @@ $$ LANGUAGE plperl; PL/Perl functions will share the same value of %_SHARED if and only if they are executed by the same SQL role. In an application wherein a single session executes code under multiple SQL roles (via - SECURITY DEFINER functions, use of SET ROLE, etc) + SECURITY DEFINER functions, use of SET ROLE, etc.) you may need to take explicit steps to ensure that PL/Perl functions can share data via %_SHARED. To do that, make sure that functions that should communicate are owned by the same user, and mark diff --git a/doc/src/sgml/pltcl.sgml b/doc/src/sgml/pltcl.sgml index 9839e375ad..bf56ba6b1c 100644 --- a/doc/src/sgml/pltcl.sgml +++ b/doc/src/sgml/pltcl.sgml @@ -279,7 +279,7 @@ $$ LANGUAGE pltcl; functions will share the same global variables if and only if they are executed by the same SQL role. In an application wherein a single session executes code under multiple SQL roles (via SECURITY - DEFINER functions, use of SET ROLE, etc) you may need to + DEFINER functions, use of SET ROLE, etc.) you may need to take explicit steps to ensure that PL/Tcl functions can share data. To do that, make sure that functions that should communicate are owned by the same user, and mark them SECURITY DEFINER. You must of diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml index 68362fd160..bfd344cdc0 100644 --- a/doc/src/sgml/postgres-fdw.sgml +++ b/doc/src/sgml/postgres-fdw.sgml @@ -190,7 +190,7 @@ OPTIONS (ADD password_required 'false'); on the public role. Keep in mind that the mapped user can potentially use any client certificates, .pgpass, - .pg_service.conf etc in the unix home directory of the + .pg_service.conf etc. in the unix home directory of the system user the postgres server runs as. They can also use any trust relationship granted by authentication modes like peer or ident authentication. diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index a155370a3c..bb30340892 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -148,7 +148,7 @@ bind step, which creates a portal given a prepared statement and values for any needed parameters; and an execute step that runs a portal's query. In the case of - a query that returns rows (SELECT, SHOW, etc), + a query that returns rows (SELECT, SHOW, etc.), the execute step can be told to fetch only a limited number of rows, so that multiple execute steps might be needed to complete the operation. @@ -584,7 +584,7 @@ Indicates that rows are about to be returned in response to - a SELECT, FETCH, etc query. + a SELECT, FETCH, etc. query. The contents of this message describe the column layout of the rows. This will be followed by a DataRow message for each row being returned to the frontend. @@ -597,7 +597,7 @@ One of the set of rows returned by - a SELECT, FETCH, etc query. + a SELECT, FETCH, etc. query. @@ -4203,7 +4203,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" 0 indicates the overall COPY format is textual (rows separated by newlines, columns separated by separator - characters, etc). + characters, etc.). 1 indicates the overall copy format is binary (similar to DataRow format). See @@ -4265,7 +4265,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" 0 indicates the overall COPY format is textual (rows separated by newlines, columns - separated by separator characters, etc). 1 indicates + separated by separator characters, etc.). 1 indicates the overall copy format is binary (similar to DataRow format). See for more information. @@ -4325,7 +4325,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" 0 indicates the overall COPY format is textual (rows separated by newlines, columns - separated by separator characters, etc). 1 indicates + separated by separator characters, etc.). 1 indicates the overall copy format is binary (similar to DataRow format). See for more information. diff --git a/doc/src/sgml/ref/values.sgml b/doc/src/sgml/ref/values.sgml index d3a3aaff14..4bf7bfdffe 100644 --- a/doc/src/sgml/ref/values.sgml +++ b/doc/src/sgml/ref/values.sgml @@ -203,7 +203,7 @@ UPDATE employees SET salary = salary * v.increase SELECT. It is not required that the AS clause specify names for all the columns, but it's good practice to do so. (The default column names for VALUES are column1, - column2, etc in PostgreSQL, but + column2, etc. in PostgreSQL, but these names might be different in other database systems.) diff --git a/doc/src/sgml/sources.sgml b/doc/src/sgml/sources.sgml index 2d01efc950..5186d75d61 100644 --- a/doc/src/sgml/sources.sgml +++ b/doc/src/sgml/sources.sgml @@ -13,9 +13,9 @@ - Layout rules (brace positioning, etc) follow BSD conventions. In + Layout rules (brace positioning, etc.) follow BSD conventions. In particular, curly braces for the controlled blocks of if, - while, switch, etc go on their own lines. + while, switch, etc. go on their own lines. diff --git a/doc/src/sgml/syntax.sgml b/doc/src/sgml/syntax.sgml index 487ea58d89..a99c24373e 100644 --- a/doc/src/sgml/syntax.sgml +++ b/doc/src/sgml/syntax.sgml @@ -1062,7 +1062,7 @@ CAST ( 'string' AS type ) IS ISNULL NOTNULL IS TRUE, IS FALSE, IS - NULL, IS DISTINCT FROM, etc + NULL, IS DISTINCT FROM, etc. diff --git a/doc/src/sgml/xfunc.sgml b/doc/src/sgml/xfunc.sgml index 3b0adc0704..b8cefb9c2c 100644 --- a/doc/src/sgml/xfunc.sgml +++ b/doc/src/sgml/xfunc.sgml @@ -1256,7 +1256,7 @@ SELECT x, CASE WHEN x > 0 THEN generate_series(1, 5) ELSE 0 END FROM tab; described above; instead, a set-returning function could have at most one set-returning argument, and each nest of set-returning functions was run independently. Also, conditional execution (set-returning - functions inside CASE etc) was previously allowed, + functions inside CASE etc.) was previously allowed, complicating things even more. Use of the LATERAL syntax is recommended when writing queries that need to work in older PostgreSQL versions, diff --git a/doc/src/sgml/xml2.sgml b/doc/src/sgml/xml2.sgml index 584bb3e923..47650d9dfd 100644 --- a/doc/src/sgml/xml2.sgml +++ b/doc/src/sgml/xml2.sgml @@ -304,7 +304,7 @@ AS t(article_id integer, author text, page_count integer, title text); just SELECT * — it can reference the output columns by name or join them to other tables. The function produces a virtual table with which you can perform any operation you wish (e.g., - aggregation, joining, sorting etc). So we could also have: + aggregation, joining, sorting etc.). So we could also have: SELECT t.title, p.fullname, p.email FROM xpath_table('article_id', 'article_xml', 'articles', From a1e7616d6e1e8056b6eae6d68be9e1e658afaf96 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 19 May 2022 10:03:43 -0400 Subject: [PATCH 693/772] Rework SQL/JSON documentation This makes the documentation conform more closely the style of other function sections. Includes suggestions from Erik Rijkers, Alvaro Herrera, and Justin Pryzby. Discussion: https://postgr.es/m/CAKFQuwaq5Ny6d3nWbJo=QO4RmhSk9JD8zrkURLR-wWmB2Pkz7Q@mail.gmail.com --- doc/src/sgml/func.sgml | 2642 +++++++++------------------------------- 1 file changed, 580 insertions(+), 2062 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 8819b60685..e52e2d953b 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -16287,7 +16287,7 @@ table2-mapping jsonb_set_lax('[{"f1":1,"f2":null},2,null,3]', '{0,f1}', null) - [{"f1":null,"f2":null},2,null,3] + [{"f1": null, "f2": null}, 2, null, 3] jsonb_set_lax('[{"f1":99,"f2":null},2]', '{0,f3}', null, true, 'return_target') @@ -16526,7 +16526,7 @@ table2-mapping comparisons. - jsonb_path_exists_tz('["2015-08-01 12:00:00 -05"]', '$[*] ? (@.datetime() < "2015-08-02".datetime())') + jsonb_path_exists_tz('["2015-08-01 12:00:00-05"]', '$[*] ? (@.datetime() < "2015-08-02".datetime())') t @@ -17564,1870 +17564,556 @@ $.* ? (@ like_regex "^\\d+$")
- + SQL/JSON Functions and Expressions - SQL/JSON - functions and expressions + SQL/JSON + functions and expressions - - To provide native support for JSON data types within the SQL environment, - PostgreSQL implements the - SQL/JSON data model. - This model comprises sequences of items. Each item can hold SQL scalar - values, with an additional SQL/JSON null value, and composite data structures - that use JSON arrays and objects. The model is a formalization of the implied - data model in the JSON specification - RFC 7159. - - - - SQL/JSON allows you to handle JSON data alongside regular SQL data, - with transaction support, including: - - - - + + To provide native support for JSON data types within the SQL environment, + PostgreSQL implements the + SQL/JSON data model. + This model comprises sequences of items. Each item can hold SQL scalar + values, with an additional SQL/JSON null value, and composite data structures + that use JSON arrays and objects. The model is a formalization of the implied + data model in the JSON specification + RFC 7159. + + + + SQL/JSON allows you to handle JSON data alongside regular SQL data, + with transaction support, including: + + + + - Uploading JSON data into the database and storing it in - regular SQL columns as character or binary strings. + Uploading JSON data into the database and storing it in + regular SQL columns as character or binary strings. - - + + - Generating JSON objects and arrays from relational data. + Generating JSON objects and arrays from relational data. - - + + Querying JSON data using SQL/JSON query functions and SQL/JSON path language expressions. - - + + - - All SQL/JSON functions fall into one of two groups. + + There are two groups of SQL/JSON functions. Constructor functions generate JSON data from values of SQL types. Query functions evaluate SQL/JSON path language expressions against JSON values and produce values of SQL/JSON types, which are converted to SQL types. - - - - Producing JSON Content - - - PostgreSQL provides several functions - that generate JSON data. Taking values of SQL types as input, these - functions construct JSON objects, JSON arrays or JSON scalars represented - as the json or jsonb types, or as - SQL character or binary strings. - - - - - - JSON - - - - - JSON_SCALAR - - - - - JSON_OBJECT - - - - - JSON_OBJECTAGG - - - - - JSON_ARRAY - - - - - JSON_ARRAYAGG - - - - - - <literal>JSON</literal> - json - -JSON ( - expression FORMAT JSON ENCODING UTF8 - { WITH | WITHOUT } UNIQUE KEYS - RETURNING json_data_type -) - - - - Description - - - The JSON function generates JSON - from text data. - - - - - Parameters - - - - expression FORMAT JSON ENCODING UTF8 - - - - The string expression provides the - JSON text data. - It can be any character string (text, - char, etc.) or binary string (bytea) - in UTF8 encoding. - If the expression is NULL an - SQL null value is returned. - - - The optional FORMAT clause is provided to conform - to the SQL/JSON standard. - - - - - - { WITH | WITHOUT } UNIQUE KEYS - - - - Defines whether duplicate keys are allowed: - - - - WITHOUT - - - Default. The constructed - JSON object can contain duplicate keys. - - - - - WITH - - - Duplicate keys are not allowed. - If the input data contains duplicate keys, an error is returned. - - - - - - Optionally, you can add the KEYS keyword for - semantic clarity. - - - - - - RETURNING json_data_type - - - - The output clause that specifies the type (json or - jsonb) of the generated JSON. - The default is json. - - - - - - - - Notes - - Alternatively, you can construct JSON values simply - using PostgreSQL-specific casts to - json and jsonb types. - - - - Examples - - Construct JSON using the provided strings: - - -SELECT JSON('{ "a" : 123, "b": [ true, "foo" ], "a" : "bar" }'); - json --------------------------------------------------- - { "a" : 123, "b": [ true, "foo" ], "a" : "bar" } -(1 row) - - -SELECT JSON('{"a": 123, "b": [true, "foo"], "a": "bar"}' RETURNING jsonb); - json ----------------------------------- - {"a": "bar", "b": [true, "foo"]} -(1 row) - -SELECT JSON('{"a": 123, "b": [true, "foo"], "a": "bar"}' WITH UNIQUE KEYS); -ERROR: duplicate JSON object key value - - - - - - <literal>JSON_SCALAR</literal> - json_scalar - - -JSON_SCALAR ( - expression - RETURNING json_data_type -) - - - - Description - - - The JSON_SCALAR function generates a - JSON scalar value from SQL data. - - - - - Parameters - - - - expression - - - - The expression provides the data for constructing a - JSON value. - For null input, SQL null - (not a JSON null) value is returned. - For any scalar other than a number or a Boolean, the text - representation will be used, with escaping as necessary to make - it a valid JSON string value. - For details, see - to_json()/to_jsonb() - in . - - - - - - RETURNING json_data_type - - - - The output clause that specifies the type (json or - jsonb) of the generated JSON scalar. - The default is json. - - - - - - - - Notes - - Alternatively, you can construct JSON objects by - using the PostgreSQL-specific - to_json()/to_jsonb() functions. - See for details. - - - - Examples - - Construct JSON scalars from the provided values of various types: - - -SELECT JSON_SCALAR(123.45); - json_scalar -------------- - 123.45 -(1 row) - -SELECT JSON_SCALAR('123'); - json_scalar -------------- - "123" -(1 row) - -SELECT JSON_SCALAR(true); - json_scalar -------------- - true -(1 row) - - - - - - <literal>JSON_OBJECT</literal> - json_object - - -JSON_OBJECT ( - { key_expression { VALUE | ':' } - value_expression FORMAT JSON ENCODING UTF8 }, ... - { NULL | ABSENT } ON NULL - { WITH | WITHOUT } UNIQUE KEYS - RETURNING data_type FORMAT JSON ENCODING UTF8 -) - - - - Description - - - The JSON_OBJECT function generates a - JSON object from SQL or - JSON data. - - - - - Parameters - - - - - - key_expression { VALUE | ':' } - value_expression FORMAT JSON ENCODING UTF8 - - - - - The input clause that provides the data for constructing a JSON object: - - - - - key_expression is a scalar expression - defining the JSON key, which is implicitly - converted to the text type. - The provided expression cannot be NULL or - belong to a type that has a cast to json. - - - - - value_expression is an expression - that provides the input for the JSON value. - - - - - The optional FORMAT clause is provided to - conform to the SQL/JSON standard. - - - - - You must use a colon or the VALUE keyword as a - separator between the key and the value. Multiple key/value pairs are - separated by commas. - - - - - - - { NULL | ABSENT } ON NULL - - - - Defines whether NULL values are allowed in the constructed - JSON object: - - - - NULL - - - Default. NULL values are allowed. - - - - - ABSENT - - - If the value is NULL, - the corresponding key/value pair is omitted from the generated - JSON object. - - - - - - - - - - { WITH | WITHOUT } UNIQUE KEYS - - - Defines whether duplicate keys are allowed: - - - - WITHOUT - - - Default. The constructed - JSON object can contain duplicate keys. - - - - - WITH - - - Duplicate keys are not allowed. - If the input data contains duplicate keys, an error is returned. - This check is performed before removing JSON items with NULL values. - - - - - - Optionally, you can add the KEYS keyword for semantic clarity. - - - - - - - RETURNING data_type FORMAT JSON ENCODING UTF8 - - - - The output clause that specifies the type of the generated JSON object. - For details, see . - - - - - - - - - Notes - Alternatively, you can construct JSON objects by using the - PostgreSQL-specific json_build_object()/ - jsonb_build_object() functions. - See for details. - - - Examples - Construct a JSON object from the provided key/value pairs of various types: + Many SQL/JSON functions have an optional FORMAT + clause. This is provided to conform with the SQL standard, but has no + effect except where noted otherwise. - -SELECT JSON_OBJECT( --- scalar JSON types - 'key1': 'string', - 'key2': '[1, 2]', - 'key3' VALUE 123, -- alternative syntax for key-value delimiter - 'key4': NULL, --- other types - 'key5': ARRAY[1, 2, 3], -- postgres array - 'key6': jsonb '{"a": ["b", 1]}', -- composite json/jsonb - 'key7': date '2017-09-30', -- datetime type - 'key8': row(1, 'a'), -- row type - 'key9': '[1, 2]' FORMAT JSON, -- same value as for key2, but with FORMAT --- key can be an expression - 'key' || 'last' : TRUE -ABSENT ON NULL) AS json; - json ----------------------------------------------------- -{"key1" : "string", "key2" : "[1, 2]", "key3" : 123, - "key5" : [1,2,3], "key6" : {"a": ["b", 1]}, - "key7" : "2017-09-30", "key8" : {"f1":1,"f2":"a"}, - "key9" : [1, 2], "keylast" : true} -(1 row) - - From the films table, select some data - about the films distributed by Paramount Pictures - (did = 103) and return JSON objects: - - -SELECT -JSON_OBJECT( - 'code' VALUE f.code, - 'title' VALUE f.title, - 'did' VALUE f.did -) AS paramount -FROM films AS f -WHERE f.did = 103; - paramount ----------------------------------------------------- -{"code" : "P_301", "title" : "Vertigo", "did" : 103} -{"code" : "P_302", "title" : "Becket", "did" : 103} -{"code" : "P_303", "title" : "48 Hrs", "did" : 103} -(3 rows) - - - - - - <literal>JSON_OBJECTAGG</literal> - json_objectagg - - -JSON_OBJECTAGG ( - { key_expression { VALUE | ':' } value_expression } - { NULL | ABSENT } ON NULL - { WITH | WITHOUT } UNIQUE KEYS - RETURNING data_type FORMAT JSON ENCODING UTF8 -) - - - - - Description - - - The JSON_OBJECTAGG function aggregates the provided data - into a JSON object. You can use this function to combine values - stored in different table columns into pairs. - - - - - Parameters - - - - - key_expression { VALUE | ':' } value_expression - - - - - The input clause that provides the data to be aggregated as a JSON object: - - - - - key_expression is a scalar expression - defining the JSON key, which is implicitly - converted to the text type. - The provided expression cannot be NULL or - belong to a type that has a cast to json. - - - - - value_expression is an expression that - provides the input for the JSON value preceded - by its type. - For JSON scalar types, you can omit the type. - - - - The input value of the bytea type must be stored in UTF8 - and contain a valid UTF8 string. Otherwise, an error occurs. - PostgreSQL currently supports only UTF8. - - - - - - You must use a colon or the VALUE keyword as a separator between - keys and values. Multiple key/value pairs are separated by commas. - - - - - - - { NULL | ABSENT } ON NULL - - - - Defines whether NULL values are allowed in the constructed - JSON object: - - - - NULL - - - Default. NULL values are allowed. - - - - - ABSENT - - - If the value is NULL, - the corresponding key/value pair is omitted from the generated - JSON object. - - - - - - - - - - { WITH | WITHOUT } UNIQUE KEYS - - - Defines whether duplicate keys are allowed: - - - - WITHOUT - - - Default. The constructed - JSON object can contain duplicate keys. - - - - - WITH - - - Duplicate keys are not allowed. - If the input data contains duplicate keys, an error is returned. - This check is performed before removing JSON items with NULL values. - - - - - - Optionally, you can add the KEYS keyword for semantic clarity. - - - - - - - RETURNING data_type FORMAT JSON ENCODING UTF8 - - - - The output clause that specifies the type of the generated JSON object. - For details, see . - - - - - - - - - Notes - Alternatively, you can create JSON objects by using - PostgreSQL-specific json_object_agg()/ - jsonb_object_agg() aggregate functions. - See for details. + lists the SQL/JSON + Constructor functions. Each function has a RETURNING + clause specifying the data type returned. For the json and + json_scalar functions, this needs to be either json or + jsonb. For the other constructor functions it must be one of json, + jsonb, bytea, a character string type (text, char, + varchar, or nchar), or a type for which there is a cast + from json to that type. + By default, the json type is returned. - - - - Examples - - For films with did = 103, aggregate key/value pairs - of film genre (f.kind) and title (f.title) - into a single object: - - -SELECT -JSON_OBJECTAGG( - f.kind VALUE f.title) - AS films_list -FROM films AS f -where f.did = 103; - films_list ----------------------------------------------------- -{ "Action" : "Vertigo", "Drama" : "Becket", "Action" : "48 Hrs" } - + + + Many of the results that can be obtained from the SQL/JSON Constructor + functions can also be obtained by calling + PostgreSQL-specific functions detailed in + and + . + + - - Return the same object as jsonb. Note that only a single film of - the action genre is included as the jsonb type does not allow duplicate keys. - - -SELECT -JSON_OBJECTAGG( - f.kind VALUE f.title - RETURNING jsonb) -AS films_list -FROM films AS f -where f.did = 103; - films_list ----------------------------------------------------- -{"Drama": "Becket", "Action": "48 Hrs"} - - - - Return objects of film titles and length, grouped by the film genre: - - -SELECT - f.kind, - JSON_OBJECTAGG( - f.title VALUE f.len -) AS films_list -FROM films AS f -GROUP BY f.kind; - - kind | films_list --------------+---------------------------------- -Musical | { "West Side Story" : "02:32:00", "The King and I" : "02:13:00", "Bed Knobs and Broomsticks" : "01:57:00" } -Romantic | { "The African Queen" : "01:43:00", "Une Femme est une Femme" : "01:25:00", "Storia di una donna" : "01:30:00" } -Comedy | { "Bananas" : "01:22:00", "There's a Girl in my Soup" : "01:36:00" } -Drama | { "The Third Man" : "01:44:00", "Becket" : "02:28:00", "War and Peace" : "05:57:00", "Yojimbo" : "01:50:00", "Das Boot" : "02:29:00" } -Action | { "Vertigo" : "02:08:00", "48 Hrs" : "01:37:00", "Taxi Driver" : "01:54:00", "Absence of Malice" : "01:55:00" } -(5 rows) - - - - - - <literal>JSON_ARRAY</literal> - json_array - - -JSON_ARRAY ( - { value_expression FORMAT JSON } , ... - { NULL | ABSENT } ON NULL - RETURNING data_type FORMAT JSON ENCODING UTF8 -) - -JSON_ARRAY ( - query_expression - RETURNING data_type FORMAT JSON ENCODING UTF8 -) - - - - Description - - - The JSON_ARRAY function constructs a JSON array from - the provided SQL or JSON data. - - - - - Parameters - - - - - value_expression - - - - - The input clause that provides the data for constructing a JSON array. - The value_expression is an expression - that provides the input for the JSON value preceded by its type. - For JSON scalar types, you can omit the type. - - - - The input value of the bytea type must be stored in UTF8 - and contain a valid UTF8 string. Otherwise, an error occurs. - PostgreSQL currently supports only UTF8. - - - - - - - - - query_expression - - - - An SQL query that provides the data for constructing a JSON array. - The query must return a single column that holds the values to be - used in the array. - - - - - - - { NULL | ABSENT } ON NULL - - - - Defines whether NULL values are allowed in the generated JSON array: - - - - NULL - - - NULL values are allowed. - - - - - ABSENT - - - Default. If the value is NULL, - the corresponding key/value pair is omitted from the generated - JSON object. - - - - - - This clause is only supported for arrays built from an explicit list of values. - If you are using an SQL query to generate an array, NULL values are always - omitted. - - - - - - - RETURNING data_type FORMAT JSON ENCODING UTF8 - - - - The output clause that specifies the return type of the constructed JSON array. - For details, see . - - - - - - - - - Notes - Alternatively, you can create JSON arrays by using - PostgreSQL-specific json_build_array()/ - jsonb_build_array() functions. - See for details. - - - - - Examples - - From the films table, select some data - about the films distributed by Paramount Pictures - (did = 103) and return JSON arrays: - - -SELECT -JSON_ARRAY( - f.code, - f.title, - f.did -) AS films -FROM films AS f -WHERE f.did = 103; - films ----------------------------------------------------- -["P_301", "Vertigo", 103] -["P_302", "Becket", 103] -["P_303", "48 Hrs", 103] -(3 rows) - - - Construct a JSON array from the list of film titles returned from the - films table by a subquery: - - -SELECT -JSON_ARRAY( - SELECT - f.title -FROM films AS f -where f.did = 103) -AS film_titles; - film_titles ----------------------------------------------------- -["Vertigo", "Becket", "48 Hrs"] -(1 row) - - - - - - <literal>JSON_ARRAYAGG</literal> - json_arrayagg - - -JSON_ARRAYAGG ( - value_expression - ORDER BY sort_expression - { NULL | ABSENT } ON NULL - RETURNING data_type FORMAT JSON ENCODING UTF8 -) - - - - - Description - - - The JSON_ARRAYAGG function aggregates the provided SQL - or JSON data into a JSON array. - - - - - Parameters - - - - - value_expression - - - - - The input clause that provides the input data to be aggregated as - a JSON array. - The value_expression can be a value or a query - returning the values to be used as input in array construction. - You can provide multiple input values separated by commas. - - - - - - - ORDER BY - - - - Sorts the input data to be aggregated as a JSON array. - For details on the exact syntax of the ORDER BY clause, see . - - - - - - - { NULL | ABSENT } ON NULL - - - - Defines whether NULL values are allowed in the constructed array: - - - - NULLNULL values are allowed. - - - - - ABSENT (default) — NULL - values are omitted from the generated array. - - - - - - - - - - RETURNING data_type FORMAT JSON ENCODING UTF8 - - - - The output clause that specifies the return type of the constructed JSON array. - For details, see . - - - - - - - - - Notes - Alternatively, you can create JSON arrays by using - PostgreSQL-specific json_agg()/ - jsonb_agg() functions. - See for details. - - - - - Examples - - Construct an array of film titles sorted in alphabetical order: - - -SELECT -JSON_ARRAYAGG( - f.title -ORDER BY f.title ASC) AS film_titles -FROM films AS f; - film_titles ----------------------------------------------------- -["48 Hrs", "Absence of Malice", "Bananas", "Becket", "Bed Knobs and Broomsticks", "Das Boot", "Storia di una donna", "Taxi Driver", "The African Queen", "The King and I", "There's a Girl in my Soup", "The Third Man", "Une Femme est une Femme", "Vertigo", "War and Peace", "West Side Story", "Yojimbo"] -(1 row) - - - - - - - Querying JSON - - - SQL/JSON query functions evaluate SQL/JSON path language expressions - against JSON values, producing values of SQL/JSON types, which are - converted to SQL types. All SQL/JSON query functions accept several - common clauses described in . - For details on the SQL/JSON path language, - see . - - - - - - IS JSON - - - - - JSON_EXISTS - - - - - JSON_VALUE - - - - - JSON_QUERY - - - - - JSON_TABLE - - - - - - In some usage examples for these functions, - the following small table storing some JSON data will be used: - -CREATE TABLE my_films ( - js text ); - -INSERT INTO my_films VALUES ( -'{ "favorites" : [ - { "kind" : "comedy", "films" : [ - { "title" : "Bananas", - "director" : "Woody Allen"}, - { "title" : "The Dinner Game", - "director" : "Francis Veber" } ] }, - { "kind" : "horror", "films" : [ - { "title" : "Psycho", - "director" : "Alfred Hitchcock" } ] }, - { "kind" : "thriller", "films" : [ - { "title" : "Vertigo", - "director" : "Alfred Hitchcock" } ] }, - { "kind" : "drama", "films" : [ - { "title" : "Yojimbo", - "director" : "Akira Kurosawa" } ] } - ] }'); - - - - - <literal>JSON_EXISTS</literal> - json_exists - - -JSON_EXISTS ( - context_item, path_expression PASSING { value AS varname } , ... - RETURNING data_type - { TRUE | FALSE | UNKNOWN | ERROR } ON ERROR -) - - - - Description - - - The JSON_EXISTS function checks whether the provided - JSON path expression can return any SQL/JSON items. - - - - - Parameters - - - - context_item, path_expression PASSING { value AS varname } , ... - - - - - The input data to query, the JSON path expression defining the query, and an optional PASSING clause. - See for details. - - - - - - - RETURNING data_type - - - - The output clause that specifies the data type of the returned value. - The specified data type should have a cast from a boolean - type, which is returned by default. - - - - - - - { TRUE | FALSE | UNKNOWN | ERROR } ON ERROR - - - - Defines the return value if an error occurs. The default value is FALSE. - - - - - - - - - Examples - - - Check whether the provided jsonb data contains a - key/value pair with the key1 key, and its value - contains an array with one or more elements bigger than 2: - - -SELECT JSON_EXISTS(jsonb '{"key1": [1,2,3]}', 'strict $.key1[*] ? (@ > 2)'); - json_exists -------------- - t -(1 row) - - - - Note the difference between strict and lax modes - if the required item does not exist: - - --- Strict mode with ERROR on ERROR clause -SELECT JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'strict $.a[5]' ERROR ON ERROR); -ERROR: Invalid SQL/JSON subscript -(1 row) - - - --- Lax mode -SELECT JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'lax $.a[5]' ERROR ON ERROR); - json_exists -------------- - f -(1 row) - - - --- Strict mode using the default value for the ON ERROR clause -SELECT JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'strict $.a[5]'); - json_exists -------------- - f -(1 row) - - - - - - - <literal>JSON_VALUE</literal> - json_value - - -JSON_VALUE ( - context_item, path_expression PASSING { value AS varname } , ... - RETURNING data_type - { ERROR | NULL | DEFAULT expression } ON EMPTY - { ERROR | NULL | DEFAULT expression } ON ERROR -) - - - - Description - - - The JSON_VALUE function extracts a value from the provided - JSON data and converts it to an SQL scalar. - If the specified JSON path expression returns more than one - SQL/JSON item, an error occurs. To extract - an SQL/JSON array or object, use . - - - - - Parameters - - - - - - context_item, path_expression PASSING { value AS varname } , ... - - - - - The input data to query, the JSON path expression defining the query, and an optional PASSING clause. - For details, see . - - - - - - - RETURNING data_type - - - - The output clause that specifies the data type of the returned value. - Out of the box, PostgreSQL - supports the following types: json, jsonb, - bytea, and character string types (text, char, - varchar, and nchar). - The extracted value must be a single SQL/JSON scalar item - and have a cast to the specified type. Otherwise, an error occurs. - By default, JSON_VALUE returns a string - of the text type. - - - - - - - { ERROR | NULL | DEFAULT expression } ON EMPTY - - - - Defines the return value if no JSON value is found. The default is - NULL. If you use - DEFAULT expression, - the provided expression is - evaluated and cast to the type specified in the RETURNING clause. - - - - - - - { ERROR | NULL | DEFAULT expression } ON ERROR - - - - Defines the return value if an unhandled error occurs. The default is - NULL. If you use - DEFAULT expression, - the provided expression is - evaluated and cast to the type specified in the RETURNING clause. - - - - - - - - - Examples - - - Extract an SQL/JSON value and return it as an SQL - scalar of the specified type. Note that - JSON_VALUE can only return a - single scalar, and the returned value must have a - cast to the specified return type: - - - -SELECT JSON_VALUE('"123.45"', '$' RETURNING float); - json_value ------------- - 123.45 -(1 row) - -SELECT JSON_VALUE('123.45', '$' RETURNING int ERROR ON ERROR); - json_value ------------- - 123 -(1 row) - -SELECT JSON_VALUE('"03:04 2015-02-01"', '$.datetime("HH24:MI YYYY-MM-DD")' RETURNING date); - json_value ------------- - 2015-02-01 -(1 row) - -SELECT JSON_VALUE('"123.45"', '$' RETURNING int ERROR ON ERROR); -ERROR: invalid input syntax for integer: "123.45" - -SELECT JSON_VALUE(jsonb '[1]', 'strict $' ERROR ON ERROR); -ERROR: SQL/JSON scalar required - -SELECT JSON_VALUE(jsonb '[1,2]', 'strict $[*]' ERROR ON ERROR); -ERROR: more than one SQL/JSON item - - - - If the path expression returns an array, an object, or - multiple SQL/JSON items, an error is returned, as specified - in the ON ERROR clause: - - -SELECT JSON_VALUE(jsonb '[1]', 'strict $' ERROR ON ERROR); -ERROR: SQL/JSON scalar required - -SELECT JSON_VALUE(jsonb '{"a": 1}', 'strict $' ERROR ON ERROR); -ERROR: SQL/JSON scalar required - -SELECT JSON_VALUE(jsonb '[1,2]', 'strict $[*]' ERROR ON ERROR); -ERROR: more than one SQL/JSON item - -SELECT JSON_VALUE(jsonb '[1,2]', 'strict $[*]' DEFAULT 1 ON ERROR); -1 - - - - - - - <literal>JSON_QUERY</literal> - json_query - - -JSON_QUERY ( - context_item, path_expression PASSING { value AS varname } , ... - RETURNING data_type FORMAT JSON ENCODING UTF8 - { WITHOUT | WITH { CONDITIONAL | UNCONDITIONAL } } ARRAY WRAPPER - { KEEP | OMIT } QUOTES ON SCALAR STRING - { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON EMPTY - { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON ERROR -) - - - - Description - - - The JSON_QUERY function extracts an SQL/JSON - array or object from JSON data. This function must return - a JSON string, so if the path expression returns a scalar or multiple SQL/JSON - items, you must wrap the result using the WITH WRAPPER clause. - To extract a single SQL/JSON value, you can use . - - - - - Parameters - - - - - - context_item, path_expression PASSING { value AS varname } , ... - - - - - The input data to query, the JSON path expression defining the query, and an optional PASSING clause. - For details, see . - - - - - - - RETURNING data_type FORMAT JSON ENCODING UTF8 - - - - The output clause that specifies the data type of the returned value. - For details, see . - - - - - - - { WITHOUT | WITH { CONDITIONAL | UNCONDITIONAL } } ARRAY WRAPPER - - - - Defines whether to wrap a returned sequence of SQL/JSON - items into an SQL/JSON array. - - - - WITHOUT WRAPPER - - - Do not wrap the result. - This is the default behavior if the WRAPPER - clause is omitted. - - - - - WITH UNCONDITIONAL WRAPPER - - - Always wrap the result. - - - - - WITH CONDITIONAL WRAPPER - - - Wrap the result if the path - expression returns anything other than a single - SQL/JSON array or object. - - - - - - Optionally, you can add the ARRAY keyword for semantic clarity. - - - You cannot use this clause together with the ON EMPTY clause. - - - - - - - - { KEEP | OMIT } QUOTES ON SCALAR STRING - - - - Defines whether to keep or omit quotes if a scalar string is returned. - By default, scalar strings are returned with quotes. Using this - clause together with the WITH WRAPPER clause is not allowed. - - - Optionally, you can add the ON SCALAR STRING keywords for semantic clarity. - - - - - - - { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON EMPTY - - - - Defines the return value if no JSON value is found. The default is NULL. - If you use EMPTY ARRAY or EMPTY OBJECT, - an empty JSON array [] or object {} is returned, respectively. - If you use DEFAULT expression, - the provided expression is evaluated and cast - to the type specified in the RETURNING clause. - - - You cannot use this clause together with the WRAPPER clause. - - - - - - - { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON ERROR - - - - Defines the return value if an unhandled error occurs. The default is NULL. - If you use EMPTY ARRAY or EMPTY OBJECT, - an empty JSON array [] or object {} are returned, respectively. - If you use DEFAULT expression, - the provided expression is evaluated and cast - to the type specified in the RETURNING clause. - - - - - - - - - Examples - - - Extract all film genres listed in the my_films table: - - -SELECT - JSON_QUERY(js, '$.favorites[*].kind' WITH WRAPPER ERROR ON ERROR) -FROM my_films; - json_query ------------- - ["comedy", "horror", "thriller", "drama"] -(1 row) - - - - Note that the same query will result in an error if you omit the - WITH WRAPPER clause, as it returns multiple SQL/JSON items: - - -SELECT - JSON_QUERY(js, '$.favorites[*].kind' ERROR ON ERROR) -FROM my_films; -ERROR: more than one SQL/JSON item - - - - Compare the effect of different WRAPPER clauses: - - -SELECT - js, - JSON_QUERY(js, 'lax $[*]') AS "without", - JSON_QUERY(js, 'lax $[*]' WITH WRAPPER) AS "with uncond", - JSON_QUERY(js, 'lax $[*]' WITH CONDITIONAL WRAPPER) AS "with cond" -FROM - (VALUES (jsonb '[]'), ('[1]'), ('[[1,2,3]]'), ('[{"a": 1}]'), ('[1, null, "2"]')) foo(js); - js | without | with uncond | with cond -----------------+-----------+----------------+---------------- - [] | (null) | (null) | (null) - [1] | 1 | [1] | [1] - [[1, 2, 3]] | [1, 2, 3] | [[1, 2, 3]] | [1, 2, 3] - [{"a": 1}] | {"a": 1} | [{"a": 1}] | {"a": 1} - [1, null, "2"] | (null) | [1, null, "2"] | [1, null, "2"] -(5 rows) - - -Compare quote handling for scalar types with and without the OMIT QUOTES clause: - - -SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text); - json_query ------------- - "aaa" -(1 row) - -SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text OMIT QUOTES); - json_query ------------- - aaa -(1 row) - - - - - - <literal>IS JSON</literal> - is_json - - -expression - IS NOT JSON - { VALUE | SCALAR | ARRAY | OBJECT } - { WITH | WITHOUT } UNIQUE KEYS - - - - Description - - - The IS JSON predicate tests whether the provided value is valid - JSON data. If you provide a specific JSON data type as a parameter, - you can check whether the value belongs to this type. - You can also use this predicate in the IS NOT JSON form. - The return values are: - - - - t if the value satisfies the specified condition. - - - - - f if the value does not satisfy the specified condition. - - - - - - - - Parameters - - - - - - expression - - - - - The input clause defining the value to test. You can provide the values - of json, jsonb, - bytea, or character string types. - - - - - - - VALUE | SCALAR | ARRAY | OBJECT - - - - - Specifies the JSON data type to test for: - - - - VALUE (default) — any JSON type. - - - - - SCALARJSON number, string, or boolean. - - - - - ARRAYJSON array. - - - - - OBJECTJSON object. - - - - - - - - - - { WITH | WITHOUT } UNIQUE KEYS - - - Defines whether duplicate keys are allowed: - - - - WITHOUT (default) — the - JSON object can contain duplicate keys. - - - - - WITH — duplicate keys are not allowed. - If the input data contains duplicate keys, it is considered to be invalid JSON. - - - - Optionally, you can add the KEYS keyword for semantic clarity. - - - - - - + + SQL/JSON Constructor Functions + + + + + Function signature + + + Description + + + Example(s) + + + + + + + json constructor + json ( + expression + FORMAT JSON ENCODING UTF8 + { WITH | WITHOUT } UNIQUE KEYS + RETURNING json_data_type ) + + + The expression can be any text type or a + bytea in UTF8 encoding. If the + expression is NULL, an + SQL null value is returned. + If WITH UNIQUE is specified, the + expression must not contain any duplicate + object keys. + + + json('{"a":123, "b":[true,"foo"], "a":"bar"}') + {"a":123, "b":[true,"foo"], "a":"bar"} + + + json('{"a":123,"b":[true,"foo"],"a":"bar"}' returning jsonb) + {"a": "bar", "b": [true, "foo"]} + + + + + json_scalar + json_scalar (expression + RETURNING json_data_type ) + + + Returns a JSON scalar value representing + expression. + If the input is NULL, an SQL NULL is returned. If the input is a number + or a boolean value, a corresponding JSON number or boolean value is + returned. For any other value a JSON string is returned. + + + json_scalar(123.45) + 123.45 + + + json_scalar(CURRENT_TIMESTAMP) + "2022-05-10T10:51:04.62128-04:00" + + + + + json_object + json_object ( + { key_expression { VALUE | ':' } + value_expression FORMAT JSON ENCODING UTF8 }, ... + { NULL | ABSENT } ON NULL + { WITH | WITHOUT } UNIQUE KEYS + RETURNING data_type FORMAT JSON ENCODING UTF8 ) + + + Constructs a JSON object of all the key value pairs given, + or an empty object if none are given. + key_expression is a scalar expression + defining the JSON key, which is + converted to the text type. + It cannot be NULL nor can it + belong to a type that has a cast to the json. + If WITH UNIQUE is specified, there must not + be any duplicate key_expression. + If ABSENT ON NULL is specified, the entire + pair is omitted if the value_expression + is NULL. + + + json_object('code' VALUE 'P123', 'title': 'Jaws') + {"code" : "P123", "title" : "Jaws"} + + + + + json_objectagg + json_objectagg ( + { key_expression { VALUE | ':' } value_expression } + { NULL | ABSENT } ON NULL + { WITH | WITHOUT } UNIQUE KEYS + RETURNING data_type FORMAT JSON ENCODING UTF8 ) + + + Behaves like json_object above, but as an + aggregate function, so it only takes one + key_expression and one + value_expression parameter. + + + SELECT json_objectagg(k:v) FROM (VALUES ('a'::text,current_date),('b',current_date + 1)) AS t(k,v) + { "a" : "2022-05-10", "b" : "2022-05-11" } + + + + + json_array + json_array ( + { value_expression FORMAT JSON } , ... + { NULL | ABSENT } ON NULL + RETURNING data_type FORMAT JSON ENCODING UTF8 ) + + + json_array ( + query_expression + RETURNING data_type FORMAT JSON ENCODING UTF8 ) + + + Constructs a JSON array from either a series of + value_expression parameters or from the results + of query_expression, + which must be a SELECT query returning a single column. If + ABSENT ON NULL is specified, NULL values are ignored. + This is always the case if a + query_expression is used. + + + json_array(1,true,json '{"a":null}') + [1, true, {"a":null}] + + + json_array(SELECT * FROM (VALUES(1),(2)) t) + [1, 2] + + + + + json_arrayagg + json_arrayagg ( + value_expression + ORDER BY sort_expression + { NULL | ABSENT } ON NULL + RETURNING data_type FORMAT JSON ENCODING UTF8 ) + + + Behaves in the same way as json_array + but as an aggregate function so it only takes one + value_expression parameter. + If ABSENT ON NULL is specified, any NULL + values are omitted. + If ORDER BY is specified, the elements will + appear in the array in that order rather than in the input order. + + + SELECT json_arrayagg(v) FROM (VALUES(2),(1)) t(v) + [2, 1] + + + + +
- - Examples + + details SQL/JSON + facilities for testing and serializing JSON. + - - Compare the result returned by the IS JSON - predicate for different data types: - - -SELECT - js, - js IS JSON "is json", - js IS NOT JSON "is not json", - js IS JSON SCALAR "is scalar", - js IS JSON OBJECT "is object", - js IS JSON ARRAY "is array" + + SQL/JSON Testing and Serializing Functions + + + + + Function signature + + + Description + + + Example(s) + + + + + + + IS JSON + expression IS NOT JSON + { VALUE | SCALAR | ARRAY | OBJECT } + { WITH | WITHOUT } UNIQUE KEYS + + + This predicate tests whether expression can be + parsed as JSON, possibly of a specified type. + If SCALAR or ARRAY or + OBJECT is specified, the + test is whether or not the JSON is of that particular type. If + WITH UNIQUE is specified, then an any object in the + expression is also tested to see if it + has duplicate keys. + + + +SELECT js, + js IS JSON "json?", + js IS JSON SCALAR "scalar?", + js IS JSON OBJECT "object?", + js IS JSON ARRAY "array?" FROM - (VALUES ('123'), ('"abc"'), ('{"a": "b"}'), ('[1,2]'), ('abc')) foo(js); - - js | is json | is not json | is scalar | is object | is array -------------+---------+-------------+-----------+-----------|------------- - 123 | t | f | t | f | f - "abc" | t | f | t | f | f - {"a": "b"} | t | f | f | t | f - [1,2] | t | f | f | f | t - abc | f | t | f | f | f -(5 rows) +(VALUES ('123'), ('"abc"'), ('{"a": "b"}'), +('[1,2]'),('abc')) foo(js); + js | json? | scalar? | object? | array? +------------+-------+---------+---------+-------- + 123 | t | t | f | f + "abc" | t | t | f | f + {"a": "b"} | t | f | t | f + [1,2] | t | f | f | t + abc | f | f | f | f - - + + + + + json_serialize ( + expression FORMAT JSON ENCODING UTF8 + RETURNING data_type FORMAT JSON ENCODING UTF8 ) + + + Transforms an SQL/JSON value into a character or binary string. The + expression can be of any JSON type, any + character string type, or bytea in UTF8 encoding. + The returned type can be any character string type or + bytea. The default is text. + + + json_serialize('{ "a" : 1 } ' RETURNING bytea) + \x7b20226122203a2031207d20 + + + + +
- - <literal>JSON_TABLE</literal> - json_table + + details the SQL/JSON + functions that can be used to query JSON data, except + for json_table. + - -JSON_TABLE ( - context_item, path_expression AS json_path_name PASSING { value AS varname } , ... - COLUMNS ( json_table_column , ... ) - - PLAN ( json_table_plan ) | - PLAN DEFAULT ( { INNER | OUTER } , { CROSS | UNION } - | { CROSS | UNION } , { INNER | OUTER } ) - -) - -where json_table_column is: - - name type PATH json_path_specification - { WITHOUT | WITH { CONDITIONAL | UNCONDITIONAL } } ARRAY WRAPPER - { KEEP | OMIT } QUOTES ON SCALAR STRING - { ERROR | NULL | DEFAULT expression } ON EMPTY - { ERROR | NULL | DEFAULT expression } ON ERROR - | name type FORMAT json_representation - PATH json_path_specification - { WITHOUT | WITH { CONDITIONAL | UNCONDITIONAL } } ARRAY WRAPPER - { KEEP | OMIT } QUOTES ON SCALAR STRING - { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON EMPTY - { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON ERROR - | name type EXISTS PATH json_path_specification - { ERROR | TRUE | FALSE | UNKNOWN } ON ERROR - | NESTED PATH json_path_specification AS path_name - COLUMNS ( json_table_column , ... ) - | name FOR ORDINALITY - -json_table_plan is: - - json_path_name { OUTER | INNER } json_table_plan_primary - | json_table_plan_primary { UNION json_table_plan_primary } ... - | json_table_plan_primary { CROSS json_table_plan_primary } ... - -json_table_plan_primary is: - - json_path_name | ( json_table_plan ) + + + SQL/JSON paths can only be applied to the jsonb type, so it + might be necessary to cast the context_item + argument of these functions to jsonb. + + - + + SQL/JSON Query Functions + + + + + Function signature + + + Description + + + Example(s) + + + + + + + json_exists + json_exists ( + context_item, path_expression PASSING { value AS varname } , ... + RETURNING data_type + { TRUE | FALSE | UNKNOWN | ERROR } ON ERROR ) + + + Returns true if the SQL/JSON path_expression + applied to the context_item using the + values yields any items. + The ON ERROR clause specifies what is returned if + an error occurs. Note that if the path_expression + is strict, an error is generated if it yields no items. + The default value is UNKNOWN which causes a NULL + result. + + + json_exists(jsonb '{"key1": [1,2,3]}', 'strict $.key1[*] ? (@ > 2)') + t + + + json_exists(jsonb '{"a": [1,2,3]}', 'lax $.a[5]' ERROR ON ERROR) + f + + + json_exists(jsonb '{"a": [1,2,3]}', 'strict $.a[5]' ERROR ON ERROR) + ERROR: jsonpath array subscript is out of bounds + + + + + json_value + json_value ( + context_item, path_expression + PASSING { value AS varname } , ... + RETURNING data_type + { ERROR | NULL | DEFAULT expression } ON EMPTY + { ERROR | NULL | DEFAULT expression } ON ERROR ) + + + Returns the result of applying the + path_expression to the + context_item using the + values. The extracted value must be + a single SQL/JSON scalar item. For results that + are objects or arrays, use the json_query + instead. + The returned data_type has the same semantics + as for constructor functions like json_objectagg. + The default returned type is text. + The ON EMPTY clause specifies the behavior if the + path_expression yields no value at all. + The ON ERROR clause specifies the behavior if an + error occurs, as a result of either the evaluation or the application + of the ON EMPTY clause. + + + json_value(jsonb '"123.45"', '$' RETURNING float) + 123.45 + + + json_value(jsonb '"03:04 2015-02-01"', '$.datetime("HH24:MI YYYY-MM-DD")' RETURNING date) + 2015-02-01 + + + json_value(jsonb '[1,2]', 'strict $[*]' DEFAULT 9 ON ERROR) + 9 + + + + + json_query + json_query ( + context_item, path_expression PASSING { value AS varname } , ... + RETURNING data_type FORMAT JSON ENCODING UTF8 + { WITHOUT | WITH { CONDITIONAL | UNCONDITIONAL } } ARRAY WRAPPER + { KEEP | OMIT } QUOTES ON SCALAR STRING + { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON EMPTY + { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON ERROR ) + + + Returns the result of applying the + path_expression to the + context_item using the + values. + This function must return a JSON string, so if the path expression + returns multiple SQL/JSON items, you must wrap the result using the + WITH WRAPPER clause. If the wrapper is + UNCONDITIONAL, an array wrapper will always + be applied, even if the returned value is already a single JSON object + or array, but if it is CONDITIONAL it will not be + applied to a single array or object. UNCONDITIONAL + is the default. + If the result is a a scalar string, by default the value returned will have + surrounding quotes making it a valid JSON value. However, this behavior + is reversed if OMIT QUOTES is specified. + The ON ERROR and ON EMPTY + clauses have similar semantics to those clauses for + json_value. + The returned data_type has the same semantics + as for constructor functions like json_objectagg. + The default returned type is text. + + + json_query(jsonb '[1,[2,3],null]', 'lax $[*][1]' WITH CONDITIONAL WRAPPER) + [3] + + + + +
- - Description +
- - The JSON_TABLE function queries JSON data - and presents the results as a relational view, which can be accessed as a - regular SQL table. You can only use JSON_TABLE inside the - FROM clause of the SELECT statement - for an SQL table. - + + JSON_TABLE + + json_table + - - Taking JSON data as input, JSON_TABLE uses - a path expression to extract a part of the provided data that - will be used as a row pattern for the - constructed view. Each SQL/JSON item at the top level of the row pattern serves - as the source for a separate row in the constructed relational view. - + + json_table is an SQL/JSON function which + queries JSON data + and presents the results as a relational view, which can be accessed as a + regular SQL table. You can only use json_table inside the + FROM clause of a SELECT statement. + - - To split the row pattern into columns, JSON_TABLE - provides the COLUMNS clause that defines the - schema of the created view. For each column to be constructed, - this clause provides a separate path expression that evaluates - the row pattern, extracts a JSON item, and returns it as a - separate SQL value for the specified column. If the required value - is stored in a nested level of the row pattern, it can be extracted - using the NESTED PATH subclause. Joining the - columns returned by NESTED PATH can add multiple - new rows to the constructed view. Such rows are called - child rows, as opposed to the parent row - that generates them. - + + Taking JSON data as input, json_table uses + a path expression to extract a part of the provided data that + will be used as a row pattern for the + constructed view. Each SQL/JSON item at the top level of the row pattern serves + as the source for a separate row in the constructed relational view. + - - The rows produced by JSON_TABLE are laterally - joined to the row that generated them, so you do not have to explicitly join - the constructed view with the original table holding JSON - data. Optionally, you can specify how to join the columns returned - by NESTED PATH using the PLAN clause. - + + To split the row pattern into columns, json_table + provides the COLUMNS clause that defines the + schema of the created view. For each column to be constructed, + this clause provides a separate path expression that evaluates + the row pattern, extracts a JSON item, and returns it as a + separate SQL value for the specified column. If the required value + is stored in a nested level of the row pattern, it can be extracted + using the NESTED PATH subclause. Joining the + columns returned by NESTED PATH can add multiple + new rows to the constructed view. Such rows are called + child rows, as opposed to the parent row + that generates them. + - - Each NESTED PATH clause can generate one or more - columns, which are considered to be siblings - to each other. In relation to the columns returned directly from the row - expression or by the NESTED PATH clause of a - higher level, these columns are child columns. - Sibling columns are always joined first. Once they are processed, - the resulting rows are joined to the parent row. - + + The rows produced by JSON_TABLE are laterally + joined to the row that generated them, so you do not have to explicitly join + the constructed view with the original table holding JSON + data. Optionally, you can specify how to join the columns returned + by NESTED PATH using the PLAN clause. + - - - Parameters + + Each NESTED PATH clause can generate one or more + columns. Columns produced by NESTED PATHs at the + same level are considered to be siblings, + while a column produced by a NESTED PATH is + considered to be a child of the column produced by and + NESTED PATH or row expression at a higher level. + Sibling columns are always joined first. Once they are processed, + the resulting rows are joined to the parent row. + - context_item, path_expression AS json_path_name PASSING { value AS varname } , ... + context_item, path_expression AS json_path_name PASSING { value AS varname } , ... - The input data to query, the JSON path expression defining the query, - and an optional PASSING clause, as described in - . The result of the input data + and an optional PASSING clause, which can provide data + values to the path_expression. + The result of the input data evaluation is called the row pattern. The row pattern is used as the source for row values in the constructed view. @@ -19436,7 +18122,7 @@ where json_table_column is: - COLUMNS( json_table_column , ... ) + COLUMNS( json_table_column , ... ) @@ -19444,15 +18130,15 @@ where json_table_column is: The COLUMNS clause defining the schema of the constructed view. In this clause, you must specify all the columns to be filled with SQL/JSON items. - The json_table_column + The json_table_column expression has the following syntax variants: - name type - PATH json_path_specification + name type + PATH json_path_specification @@ -19462,7 +18148,7 @@ where json_table_column is: The provided PATH expression parses the - row pattern defined by json_api_common_syntax + row pattern defined by json_api_common_syntax and fills the column with produced SQL/JSON items, one for each row. If the PATH expression is omitted, JSON_TABLE uses the @@ -19471,30 +18157,22 @@ where json_table_column is: In this case, the column name must correspond to one of the keys within the SQL/JSON item produced by the row pattern. - - Internally, and - are used to produce resulting values. - is used for JSON, array, and - composite column types, is used for - other types. - Optionally, you can add ON EMPTY and ON ERROR clauses to define how to handle missing values or structural errors. WRAPPER and QUOTES clauses can only be used with JSON, array, and composite types. - These clauses have the same syntax and semantics as in - and - . + These clauses have the same syntax and semantics as for + json_value and json_query. - name type FORMAT json_representation - PATH json_path_specification + name type FORMAT json_representation + PATH json_path_specification @@ -19504,35 +18182,29 @@ where json_table_column is: The provided PATH expression parses the - row pattern defined by json_api_common_syntax + row pattern defined by json_api_common_syntax and fills the column with produced SQL/JSON items, one for each row. If the PATH expression is omitted, JSON_TABLE uses the - $.name path expression, - where name is the provided column name. + $.name path expression, + where name is the provided column name. In this case, the column name must correspond to one of the keys within the SQL/JSON item produced by the row pattern. - - Internally, is used to produce - resulting values. - Optionally, you can add WRAPPER, QUOTES, ON EMPTY and ON ERROR clauses to define additional settings for the returned SQL/JSON items. These clauses have the same syntax and semantics as - in . + for json_query. - - name type - EXISTS PATH json_path_specification - + name type + EXISTS PATH json_path_specification @@ -19541,10 +18213,10 @@ where json_table_column is: The provided PATH expression parses the - row pattern defined by json_api_common_syntax, + row pattern defined by json_api_common_syntax, checks whether any SQL/JSON items were returned, and fills the column with resulting boolean value, one for each row. - The specified type should have cast from + The specified type should have cast from boolean. If the PATH expression is omitted, JSON_TABLE uses the @@ -19553,16 +18225,16 @@ where json_table_column is: Optionally, you can add ON ERROR clause to define - error behavior. This clause have the same syntax and semantics as in - . + error behavior. This clause has the same syntax and semantics as + for json_exists. - NESTED PATH json_path_specification AS json_path_name - COLUMNS ( json_table_column , ... ) + NESTED PATH json_path_specification AS json_path_name + COLUMNS ( json_table_column , ... ) @@ -19570,7 +18242,7 @@ where json_table_column is: Extracts SQL/JSON items from nested levels of the row pattern, generates one or more columns as defined by the COLUMNS subclause, and inserts the extracted SQL/JSON items into each row of these columns. - The json_table_column expression in the + The json_table_column expression in the COLUMNS subclause uses the same syntax as in the parent COLUMNS clause. @@ -19586,14 +18258,14 @@ where json_table_column is: You can use the PLAN clause to define how - to join the columns returned by NESTED PATH clauses. + to join the columns returned by NESTED PATH clauses. - name FOR ORDINALITY + name FOR ORDINALITY @@ -19612,13 +18284,13 @@ where json_table_column is: - AS json_path_name + AS json_path_name - The optional json_path_name serves as an - identifier of the provided json_path_specification. + The optional json_path_name serves as an + identifier of the provided json_path_specification. The path name must be unique and distinct from the column names. When using the PLAN clause, you must specify the names for all the paths, including the row pattern. Each path name can appear in @@ -19629,12 +18301,12 @@ where json_table_column is: - PLAN ( json_table_plan ) + PLAN ( json_table_plan ) - Defines how to join the data returned by NESTED PATH + Defines how to join the data returned by NESTED PATH clauses to the constructed view. @@ -19687,9 +18359,8 @@ where json_table_column is: - Use FULL OUTER JOIN ON FALSE, so that both parent and child - rows are included into the output, with NULL values inserted - into both child and parent columns for all missing values. + Generate one row for each value produced by each of the sibling + columns. The columns from the other siblings are set to null. This is the default option for joining sibling columns. @@ -19704,9 +18375,7 @@ where json_table_column is: - Use CROSS JOIN, so that the output includes - a row for every possible combination of rows from the left-hand - and the right-hand columns. + Generate one row for each combination of values from the sibling columns. @@ -19718,26 +18387,55 @@ where json_table_column is: - PLAN DEFAULT ( option , ... ) + PLAN DEFAULT ( OUTER | INNER , UNION | CROSS ) - Overrides the default joining plans. The INNER and - OUTER options define the joining plan for parent/child - columns, while UNION and CROSS - affect the sibling columns. You can override the default plans for all columns at once. - Even though the path names are not included into the PLAN DEFAULT - clause, they must be provided for all the paths to conform to - the SQL/JSON standard. + The terms can also be specified in reverse order. The + INNER or OUTER option defines the + joining plan for parent/child columns, while UNION or + CROSS affects joins of sibling columns. This form + of PLAN overrides the default plan for + all columns at once. Even though the path names are not included in the + PLAN DEFAULT form, to conform to the SQL/JSON standard + they must be provided for all the paths if the PLAN + clause is used. + + + PLAN DEFAULT is simpler than specifying a complete + PLAN, and is often all that is required to get the desired + output. - - - Examples + Examples + + + In these examples the following small table storing some JSON data will be used: + +CREATE TABLE my_films ( js jsonb ); +INSERT INTO my_films VALUES ( +'{ "favorites" : [ + { "kind" : "comedy", "films" : [ + { "title" : "Bananas", + "director" : "Woody Allen"}, + { "title" : "The Dinner Game", + "director" : "Francis Veber" } ] }, + { "kind" : "horror", "films" : [ + { "title" : "Psycho", + "director" : "Alfred Hitchcock" } ] }, + { "kind" : "thriller", "films" : [ + { "title" : "Vertigo", + "director" : "Alfred Hitchcock" } ] }, + { "kind" : "drama", "films" : [ + { "title" : "Yojimbo", + "director" : "Akira Kurosawa" } ] } + ] }'); + + Query the my_films table holding some JSON data about the films and create a view that @@ -19757,7 +18455,7 @@ SELECT jt.* FROM 1 | comedy | Bananas | Woody Allen 1 | comedy | The Dinner Game | Francis Veber 2 | horror | Psycho | Alfred Hitchcock - 3 | thriller | Vertigo | Hitchcock + 3 | thriller | Vertigo | Alfred Hitchcock 4 | drama | Yojimbo | Akira Kurosawa (5 rows)
@@ -19788,194 +18486,14 @@ FROM PLAN (favs OUTER ((films1 INNER film1) CROSS (films2 INNER film2))) ) AS jt WHERE kind1 > kind2 AND director1 = director2; -
- - - - - - - Serializing JSON data - - - - JSON_SERIALIZE - - - - - - <literal>JSON_SERIALAIZE</literal> - json_serialize - - -JSON_SERIALIZE ( - expression FORMAT JSON ENCODING UTF8 - RETURNING data_type FORMAT JSON ENCODING UTF8 -) - - - - Description - - - The JSON_SERIALIZE function transforms an SQL/JSON value - into a character or binary string. - - - - - Parameters - - - - expression FORMAT JSON ENCODING UTF8 - - - - JSON typed expression that provides a data for - serialization. Accepted JSON types (json and - jsonb), any character string types (text, - char, etc.), binary strings (bytea) in - UTF8 encoding. - For null input, null value is returned. - - - The optional FORMAT clause is provided to conform - to the SQL/JSON standard. - - - - - - RETURNING data_type FORMAT JSON ENCODING UTF8 - - - - The output clause that specifies the target character or binary string - type (text, char, bytea, etc.). - - - - - - - - Notes - - Alternatively, you can construct JSON values simply - using PostgreSQL-specific casts to - json and jsonb types. - - - - Examples - - Construct serialized JSON using the provided strings: - - -SELECT JSON_SERIALIZE(JSON_SCALAR('foo')); - json_serialize ----------------- - "foo" -(1 row) -SELECT JSON_SERIALIZE('{"foo": "bar", "baz": [1, 2]}' RETURNING bytea); - json_serialize --------------------------------------------------------------- - \x7b22666f6f223a2022626172222c202262617a223a205b312c20325d7d + director | title1 | kind1 | title2 | kind2 +------------------+---------+----------+--------+-------- + Alfred Hitchcock | Vertigo | thriller | Psycho | horror (1 row) - - - - - - - SQL/JSON Common Clauses - - - SQL/JSON Input Clause - - - - - context_item, path_expression - PASSING { value AS varname } , ... - - - - The input clause specifies the JSON data to query and - the exact query path to be passed to SQL/JSON query functions: - - - - - The context_item is the JSON data to query. - - - - Currently for functions JSON_VALUE, - JSON_EXISTS, and JSON_QUERY - this must be a value of type jsonb. - - - - - - The path_expression is an SQL/JSON path - expression that specifies the items to be retrieved from the JSON - data. For details on path expression syntax, see - . - - - - - The optional PASSING clause provides the values for - the named variables used in the SQL/JSON path expression. - - - - - The input clause is common for all SQL/JSON query functions. - - - - - - - - - SQL/JSON Output Clause - - - - - RETURNING data_type FORMAT JSON ENCODING UTF8 - - - - The output clause that specifies the return type of the generated - JSON object. Out of the box, PostgreSQL - supports the following types: json, jsonb, - bytea, and character string types (text, char, - varchar, and nchar). - To use another type, you must create a cast from json to that type. - By default, the json type is returned. - - - The optional FORMAT clause is provided to conform to the SQL/JSON standard. - - - The output clause is common for both constructor and query SQL/JSON functions. - - - - - - - + @@ -22684,8 +21202,8 @@ SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab; - In addition to the JSON aggregates shown here, see the JSON_OBJECTAGG - and JSON_ARRAYAGG constructors in . + In addition to the JSON aggregates shown here, see the json_objectagg + and json_arrayagg constructors in . From 8d061acd12af26551b607299aa204c946d2b6ba2 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 19 May 2022 16:20:32 +0200 Subject: [PATCH 694/772] Repurpose PROC_COPYABLE_FLAGS as PROC_XMIN_FLAGS This is a slight, convenient semantics change from what commit 0f0cfb494004 ("Fix parallel operations that prevent oldest xmin from advancing") introduced that lets us simplify the coding in the one place where it is used. Backpatch to 13. This is related to commit 6fea65508a1a ("Tighten ComputeXidHorizons' handling of walsenders") rewriting the code site where this is used, which has not yet been backpatched, but it may well be in the future. Reviewed-by: Masahiko Sawada Discussion: https://postgr.es/m/202204191637.eldwa2exvguw@alvherre.pgsql --- src/backend/storage/ipc/procarray.c | 17 +++++++---------- src/include/storage/proc.h | 7 +++---- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index ca22336e35..cd58c5faf0 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -2685,17 +2685,14 @@ ProcArrayInstallRestoredXmin(TransactionId xmin, PGPROC *proc) TransactionIdIsNormal(xid) && TransactionIdPrecedesOrEquals(xid, xmin)) { - /* Install xmin */ + /* + * Install xmin and propagate the statusFlags that affect how the + * value is interpreted by vacuum. + */ MyProc->xmin = TransactionXmin = xmin; - - /* walsender cheats by passing proc == MyProc, don't check its flags */ - if (proc != MyProc) - { - /* Flags being copied must be valid copy-able flags. */ - Assert((proc->statusFlags & (~PROC_COPYABLE_FLAGS)) == 0); - MyProc->statusFlags = proc->statusFlags; - ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags; - } + MyProc->statusFlags = (MyProc->statusFlags & ~PROC_XMIN_FLAGS) | + (proc->statusFlags & PROC_XMIN_FLAGS); + ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags; result = true; } diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h index 15be21c00a..2579e619eb 100644 --- a/src/include/storage/proc.h +++ b/src/include/storage/proc.h @@ -69,11 +69,10 @@ struct XidCache (PROC_IN_VACUUM | PROC_IN_SAFE_IC | PROC_VACUUM_FOR_WRAPAROUND) /* - * Flags that are valid to copy from another proc, the parallel leader - * process in practice. Currently, flags that are set during parallel - * vacuum and parallel index creation are allowed. + * Xmin-related flags. Make sure any flags that affect how the process' Xmin + * value is interpreted by VACUUM are included here. */ -#define PROC_COPYABLE_FLAGS (PROC_IN_VACUUM | PROC_IN_SAFE_IC) +#define PROC_XMIN_FLAGS (PROC_IN_VACUUM | PROC_IN_SAFE_IC) /* * We allow a small number of "weak" relation locks (AccessShareLock, From 1d8ef62f6e1982c3019fc044dea070a8861a91bf Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 19 May 2022 18:36:07 -0400 Subject: [PATCH 695/772] Doc: clarify location of libpq's default service file on Windows. The documentation didn't specify the name of the per-user service file on Windows, and extrapolating from the pattern used for other config files gave the wrong answer. The fact that it isn't consistent with the others sure seems like a bug, but it's far too late to change that now; we'd just penalize people who worked it out in the past. So, simply document the true state of affairs. In passing, fix some gratuitous differences between the discussions of the service file and the password file. Julien Rouhaud, per question from Dominique Devienne. Backpatch to all supported branches. I (tgl) also chose to back-patch the part of commit ba356a397 that touched libpq.sgml's description of the service file --- in hindsight, I'm not sure why I didn't do so at the time, as it includes some fairly essential information. Discussion: https://postgr.es/m/CAFCRh-_mdLrh8eYVzhRzu4c8bAFEBn=rwoHOmFJcQOTsCy5nig@mail.gmail.com --- doc/src/sgml/libpq.sgml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index 40035d7656..37ec3cb4e5 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -7787,9 +7787,11 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough) PGSERVICEFILE PGSERVICEFILE specifies the name of the per-user - connection service file. If not set, it defaults - to ~/.pg_service.conf + connection service file (see ). + Defaults to ~/.pg_service.conf, or + %APPDATA%\postgresql\.pg_service.conf on + Microsoft Windows. @@ -8089,11 +8091,11 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough) The file .pgpass in a user's home directory can contain passwords to be used if the connection requires a password (and no password has been - specified otherwise). On Microsoft Windows the file is named + specified otherwise). On Microsoft Windows the file is named %APPDATA%\postgresql\pgpass.conf (where %APPDATA% refers to the Application Data subdirectory in the user's profile). - Alternatively, a password file can be specified + Alternatively, the password file to use can be specified using the connection parameter or the environment variable PGPASSFILE. @@ -8162,8 +8164,12 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough) Service names can be defined in either a per-user service file or a system-wide file. If the same service name exists in both the user and the system file, the user file takes precedence. - By default, the per-user service file is located - at ~/.pg_service.conf; this can be overridden by + By default, the per-user service file is named + ~/.pg_service.conf. + On Microsoft Windows, it is named + %APPDATA%\postgresql\.pg_service.conf (where + %APPDATA% refers to the Application Data subdirectory + in the user's profile). A different file name can be specified by setting the environment variable PGSERVICEFILE. The system-wide file is named pg_service.conf. By default it is sought in the etc directory From 25f915b31e41e5c86e1905d199c7d41cc66161ed Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 20 May 2022 09:26:21 +0200 Subject: [PATCH 696/772] pg_waldump: Improve option parsing error messages I rephrased the error messages to be more in the style of option_parse_int(), and also made use of the new "detail" message facility. I didn't actually use option_parse_int() (which could be used for -n) because libpgfeutils wasn't used here yet and I wanted to keep this just to string changes. But it could be done in the future. --- src/bin/pg_waldump/pg_waldump.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 3151cb5562..5dc60109b1 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -794,7 +794,7 @@ main(int argc, char **argv) if (sscanf(optarg, "%u", &config.filter_by_relation_block) != 1 || !BlockNumberIsValid(config.filter_by_relation_block)) { - pg_log_error("could not parse valid block number \"%s\"", optarg); + pg_log_error("invalid block number: \"%s\"", optarg); goto bad_argument; } config.filter_by_relation_block_enabled = true; @@ -803,7 +803,7 @@ main(int argc, char **argv) case 'e': if (sscanf(optarg, "%X/%X", &xlogid, &xrecoff) != 2) { - pg_log_error("could not parse end WAL location \"%s\"", + pg_log_error("invalid WAL location: \"%s\"", optarg); goto bad_argument; } @@ -816,7 +816,7 @@ main(int argc, char **argv) config.filter_by_relation_forknum = forkname_to_number(optarg); if (config.filter_by_relation_forknum == InvalidForkNumber) { - pg_log_error("could not parse fork \"%s\"", optarg); + pg_log_error("invalid fork name: \"%s\"", optarg); goto bad_argument; } config.filter_by_extended = true; @@ -824,7 +824,7 @@ main(int argc, char **argv) case 'n': if (sscanf(optarg, "%d", &config.stop_after_records) != 1) { - pg_log_error("could not parse limit \"%s\"", optarg); + pg_log_error("invalid value \"%s\" for option %s", optarg, "-n/--limit"); goto bad_argument; } break; @@ -891,9 +891,8 @@ main(int argc, char **argv) !OidIsValid(config.filter_by_relation.spcNode) || !OidIsValid(config.filter_by_relation.relNode)) { - pg_log_error("could not parse valid relation from \"%s\"" - " (expecting \"tablespace OID/database OID/" - "relation filenode\")", optarg); + pg_log_error("invalid relation specification: \"%s\"", optarg); + pg_log_error_detail("Expecting \"tablespace OID/database OID/relation filenode\"."); goto bad_argument; } config.filter_by_relation_enabled = true; @@ -902,7 +901,7 @@ main(int argc, char **argv) case 's': if (sscanf(optarg, "%X/%X", &xlogid, &xrecoff) != 2) { - pg_log_error("could not parse start WAL location \"%s\"", + pg_log_error("invalid WAL location: \"%s\"", optarg); goto bad_argument; } @@ -912,7 +911,7 @@ main(int argc, char **argv) case 't': if (sscanf(optarg, "%u", &private.timeline) != 1) { - pg_log_error("could not parse timeline \"%s\"", optarg); + pg_log_error("invalid timeline specification: \"%s\"", optarg); goto bad_argument; } break; @@ -922,7 +921,7 @@ main(int argc, char **argv) case 'x': if (sscanf(optarg, "%u", &config.filter_by_xid) != 1) { - pg_log_error("could not parse \"%s\" as a transaction ID", + pg_log_error("invalid transaction ID specification: \"%s\"", optarg); goto bad_argument; } @@ -937,8 +936,8 @@ main(int argc, char **argv) config.stats_per_record = true; else if (strcmp(optarg, "rmgr") != 0) { - pg_log_error("unrecognized argument to --stats: %s", - optarg); + pg_log_error("unrecognized value for option %s: %s", + "--stats", optarg); goto bad_argument; } } @@ -951,7 +950,8 @@ main(int argc, char **argv) if (config.filter_by_relation_block_enabled && !config.filter_by_relation_enabled) { - pg_log_error("--block option requires --relation option to be specified"); + pg_log_error("option %s requires option %s to be specified", + "-B/--block", "-R/--relation"); goto bad_argument; } From a5084a10fe60412036899a79b3aee76ba31a3579 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Fri, 20 May 2022 10:05:31 +0200 Subject: [PATCH 697/772] doc: Explain 'invalid' index state for CREATE INDEX CONCURRENTLY It wasn't previously mentioned that the index is created as invalid, which is confusing to new users. Backpatch to 14 (only because of a conflict in 13). Author: Laurenz Albe Reported-by: Lauren Fliksteen Reviewed-by: Rajakavitha Kodhandapani Discussion: https://postgr.es/m/165290238488.670.7500177735573254738@wrigleys.postgresql.org --- doc/src/sgml/ref/create_index.sgml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/ref/create_index.sgml b/doc/src/sgml/ref/create_index.sgml index d3102a87d9..907324b93e 100644 --- a/doc/src/sgml/ref/create_index.sgml +++ b/doc/src/sgml/ref/create_index.sgml @@ -622,7 +622,8 @@ CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] - In a concurrent index build, the index is actually entered into + In a concurrent index build, the index is actually entered as an + invalid index into the system catalogs in one transaction, then two table scans occur in two more transactions. Before each table scan, the index build must wait for existing transactions that have modified the table to terminate. @@ -631,7 +632,7 @@ CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] valid and ready for use, and the CREATE INDEX command terminates. Even then, however, the index may not be immediately usable for queries: in the worst case, it cannot be used as long as transactions exist that From b39838889e76274b107935fa8e8951baf0e8b31b Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 20 May 2022 18:29:51 +0900 Subject: [PATCH 698/772] Add pg_version() to PostgreSQL::Test::Cluster _pg_version (version number based on PostgreSQL::Version) is a field private to Cluster.pm but there was no helper routine to retrieve it from a Cluster's node. The same is done for install_path, for example, and the version object becomes handy when writing tests that need version-specific handling. Reviewed-by: Andrew Dunstan, Daniel Gustafsson Discussion: https://postgr.es/m/YoWfoJTc987tsxpV@paquier.xyz --- src/test/perl/PostgreSQL/Test/Cluster.pm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index f842be1a72..c8c7bc5045 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -331,6 +331,20 @@ sub install_path =pod +=item $node->pg_version() + +The version number for the node, from PostgreSQL::Version. + +=cut + +sub pg_version +{ + my ($self) = @_; + return $self->{_pg_version}; +} + +=pod + =item $node->config_data($option) Return a string holding configuration data from pg_config, with $option From 6029861916e8e2c0155c332c10f182a22619c663 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Fri, 20 May 2022 18:52:55 +0200 Subject: [PATCH 699/772] Fix DDL deparse of CREATE OPERATOR CLASS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When an implicit operator family is created, it wasn't getting reported. Make it do so. This has always been missing. Backpatch to 10. Author: Masahiko Sawada Reported-by: Leslie LEMAIRE Reviewed-by: Amit Kapila Reviewed-by: Michael Paquiër Discussion: https://postgr.es/m/f74d69e151b22171e8829551b1159e77@developpement-durable.gouv.fr --- src/backend/commands/opclasscmds.c | 19 ++++++++++++++----- src/backend/tcop/utility.c | 6 ++++++ .../test_ddl_deparse/expected/opfamily.out | 1 + src/test/regress/expected/event_trigger.out | 5 +++++ src/test/regress/sql/event_trigger.sql | 4 ++++ 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c index 66987966b4..7a931ab758 100644 --- a/src/backend/commands/opclasscmds.c +++ b/src/backend/commands/opclasscmds.c @@ -240,7 +240,8 @@ get_opclass_oid(Oid amID, List *opclassname, bool missing_ok) * Caller must have done permissions checks etc. already. */ static ObjectAddress -CreateOpFamily(const char *amname, const char *opfname, Oid namespaceoid, Oid amoid) +CreateOpFamily(CreateOpFamilyStmt *stmt, const char *opfname, + Oid namespaceoid, Oid amoid) { Oid opfamilyoid; Relation rel; @@ -264,7 +265,7 @@ CreateOpFamily(const char *amname, const char *opfname, Oid namespaceoid, Oid am ereport(ERROR, (errcode(ERRCODE_DUPLICATE_OBJECT), errmsg("operator family \"%s\" for access method \"%s\" already exists", - opfname, amname))); + opfname, stmt->amname))); /* * Okay, let's create the pg_opfamily entry. @@ -312,6 +313,10 @@ CreateOpFamily(const char *amname, const char *opfname, Oid namespaceoid, Oid am /* dependency on extension */ recordDependencyOnCurrentExtension(&myself, false); + /* Report the new operator family to possibly interested event triggers */ + EventTriggerCollectSimpleCommand(myself, InvalidObjectAddress, + (Node *) stmt); + /* Post creation hook for new operator family */ InvokeObjectPostCreateHook(OperatorFamilyRelationId, opfamilyoid, 0); @@ -447,13 +452,17 @@ DefineOpClass(CreateOpClassStmt *stmt) } else { + CreateOpFamilyStmt *opfstmt; ObjectAddress tmpAddr; + opfstmt = makeNode(CreateOpFamilyStmt); + opfstmt->opfamilyname = stmt->opclassname; + opfstmt->amname = stmt->amname; + /* * Create it ... again no need for more permissions ... */ - tmpAddr = CreateOpFamily(stmt->amname, opcname, - namespaceoid, amoid); + tmpAddr = CreateOpFamily(opfstmt, opcname, namespaceoid, amoid); opfamilyoid = tmpAddr.objectId; } } @@ -792,7 +801,7 @@ DefineOpFamily(CreateOpFamilyStmt *stmt) errmsg("must be superuser to create an operator family"))); /* Insert pg_opfamily catalog entry */ - return CreateOpFamily(stmt->amname, opfname, namespaceoid, amoid); + return CreateOpFamily(stmt, opfname, namespaceoid, amoid); } diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 0e7b7b3138..6a5bcded55 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -1721,6 +1721,12 @@ ProcessUtilitySlow(ParseState *pstate, case T_CreateOpFamilyStmt: address = DefineOpFamily((CreateOpFamilyStmt *) parsetree); + + /* + * DefineOpFamily calls EventTriggerCollectSimpleCommand + * directly. + */ + commandCollected = true; break; case T_CreateTransformStmt: diff --git a/src/test/modules/test_ddl_deparse/expected/opfamily.out b/src/test/modules/test_ddl_deparse/expected/opfamily.out index 14bd6037cd..c7e3a23ef7 100644 --- a/src/test/modules/test_ddl_deparse/expected/opfamily.out +++ b/src/test/modules/test_ddl_deparse/expected/opfamily.out @@ -64,4 +64,5 @@ NOTICE: DDL test: type simple, tag CREATE OPERATOR create operator class ctype_hash_ops default for type ctype using hash as operator 1 =(ctype, ctype); +NOTICE: DDL test: type simple, tag CREATE OPERATOR FAMILY NOTICE: DDL test: type create operator class, tag CREATE OPERATOR CLASS diff --git a/src/test/regress/expected/event_trigger.out b/src/test/regress/expected/event_trigger.out index 44d545de25..c95c30b314 100644 --- a/src/test/regress/expected/event_trigger.out +++ b/src/test/regress/expected/event_trigger.out @@ -476,6 +476,11 @@ NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.part_10_15 NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.part_15_20 name={evttrig,part_15_20} args={} DROP TABLE a_temp_tbl; NOTICE: NORMAL: orig=t normal=f istemp=t type=table identity=pg_temp.a_temp_tbl name={pg_temp,a_temp_tbl} args={} +-- CREATE OPERATOR CLASS without FAMILY clause should report +-- both CREATE OPERATOR FAMILY and CREATE OPERATOR CLASS +CREATE OPERATOR CLASS evttrigopclass FOR TYPE int USING btree AS STORAGE int; +NOTICE: END: command_tag=CREATE OPERATOR FAMILY type=operator family identity=public.evttrigopclass USING btree +NOTICE: END: command_tag=CREATE OPERATOR CLASS type=operator class identity=public.evttrigopclass USING btree DROP EVENT TRIGGER regress_event_trigger_report_dropped; DROP EVENT TRIGGER regress_event_trigger_report_end; -- only allowed from within an event trigger function, should fail diff --git a/src/test/regress/sql/event_trigger.sql b/src/test/regress/sql/event_trigger.sql index 1446cf8cc8..5e45e3f190 100644 --- a/src/test/regress/sql/event_trigger.sql +++ b/src/test/regress/sql/event_trigger.sql @@ -337,6 +337,10 @@ DROP INDEX evttrig.one_idx; DROP SCHEMA evttrig CASCADE; DROP TABLE a_temp_tbl; +-- CREATE OPERATOR CLASS without FAMILY clause should report +-- both CREATE OPERATOR FAMILY and CREATE OPERATOR CLASS +CREATE OPERATOR CLASS evttrigopclass FOR TYPE int USING btree AS STORAGE int; + DROP EVENT TRIGGER regress_event_trigger_report_dropped; DROP EVENT TRIGGER regress_event_trigger_report_end; From 5e5fa323350060360799004f96840bbf3cb51e49 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 20 May 2022 13:42:02 -0400 Subject: [PATCH 700/772] Remove portability hazard in unsafe_tests/sql/guc_privs.sql. This new-in-v15 test case assumed it could set max_stack_depth as high as 2MB. You might think that'd be true on any modern platform but you'd be wrong, as I found out while experimenting with NetBSD/hppa. This test is about privileges not platform capabilities, so there seems no need to use any value greater than the 100kB setting already used in a couple of places in the core regression tests. There's certainly no call to expect people to raise their platform's default ulimit just to run this test. --- src/test/modules/unsafe_tests/expected/guc_privs.out | 4 ++-- src/test/modules/unsafe_tests/sql/guc_privs.sql | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/modules/unsafe_tests/expected/guc_privs.out b/src/test/modules/unsafe_tests/expected/guc_privs.out index 58dc87f958..de4e1b3cdf 100644 --- a/src/test/modules/unsafe_tests/expected/guc_privs.out +++ b/src/test/modules/unsafe_tests/expected/guc_privs.out @@ -436,9 +436,9 @@ ERROR: parameter "autovacuum_work_mem" cannot be changed now ALTER SYSTEM RESET temp_file_limit; -- ok SET TimeZone = 'Europe/Helsinki'; -- ok RESET TimeZone; -- ok -SET max_stack_depth = 2048; -- ok, privileges have been granted +SET max_stack_depth = '100kB'; -- ok, privileges have been granted RESET max_stack_depth; -- ok, privileges have been granted -ALTER SYSTEM SET max_stack_depth = 2048; -- ok, privileges have been granted +ALTER SYSTEM SET max_stack_depth = '100kB'; -- ok, privileges have been granted ALTER SYSTEM RESET max_stack_depth; -- ok, privileges have been granted SET lc_messages = 'C'; -- fail, insufficient privileges ERROR: permission denied to set parameter "lc_messages" diff --git a/src/test/modules/unsafe_tests/sql/guc_privs.sql b/src/test/modules/unsafe_tests/sql/guc_privs.sql index 12b22548f0..a86b957b9c 100644 --- a/src/test/modules/unsafe_tests/sql/guc_privs.sql +++ b/src/test/modules/unsafe_tests/sql/guc_privs.sql @@ -176,9 +176,9 @@ SET autovacuum_work_mem = 50; -- cannot be changed now ALTER SYSTEM RESET temp_file_limit; -- ok SET TimeZone = 'Europe/Helsinki'; -- ok RESET TimeZone; -- ok -SET max_stack_depth = 2048; -- ok, privileges have been granted +SET max_stack_depth = '100kB'; -- ok, privileges have been granted RESET max_stack_depth; -- ok, privileges have been granted -ALTER SYSTEM SET max_stack_depth = 2048; -- ok, privileges have been granted +ALTER SYSTEM SET max_stack_depth = '100kB'; -- ok, privileges have been granted ALTER SYSTEM RESET max_stack_depth; -- ok, privileges have been granted SET lc_messages = 'C'; -- fail, insufficient privileges RESET lc_messages; -- fail, insufficient privileges From eaa5ebe046c4f247d843bdfd36da4c28be9dbfab Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 21 May 2022 12:01:48 +0900 Subject: [PATCH 701/772] Improve and fix some issues in the TAP tests of pg_upgrade This is based on a set of suggestions from Noah, with the following changes made: - The set of databases created in the tests are now prefixed with "regression" to not trigger any warnings with name restrictions when compiling the code with -DENFORCE_REGRESSION_TEST_NAME_RESTRICTIONS, and now only the first name checks after the Windows case of double quotes mixed with backslashes. - Fix an issue with EXTRA_REGRESS_OPTS, which were not processed in a way consistent with 027_stream_regress.pl (missing space between the option string and pg_regress). This got introduced in 7dd3ee5. - Add a check on the exit code of the pg_regress command, to catch failures after running the regression tests. Reviewed-by: Noah Misch Discussion: https://postgr.es/m/YoHhWD5vQzb2mmiF@paquier.xyz --- src/bin/pg_upgrade/t/002_pg_upgrade.pl | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl index 8372a85e6e..75ac768a96 100644 --- a/src/bin/pg_upgrade/t/002_pg_upgrade.pl +++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl @@ -13,18 +13,16 @@ # Generate a database with a name made of a range of ASCII characters. sub generate_db { - my ($node, $from_char, $to_char) = @_; + my ($node, $prefix, $from_char, $to_char, $suffix) = @_; - my $dbname = ''; + my $dbname = $prefix; for my $i ($from_char .. $to_char) { next if $i == 7 || $i == 10 || $i == 13; # skip BEL, LF, and CR $dbname = $dbname . sprintf('%c', $i); } - # Exercise backslashes adjacent to double quotes, a Windows special - # case. - $dbname = '\\"\\' . $dbname . '\\\\"\\\\\\'; + $dbname .= $suffix; $node->command_ok([ 'createdb', $dbname ]); } @@ -79,10 +77,12 @@ sub generate_db { # Default is to use pg_regress to set up the old instance. - # Create databases with names covering most ASCII bytes - generate_db($oldnode, 1, 45); - generate_db($oldnode, 46, 90); - generate_db($oldnode, 91, 127); + # Create databases with names covering most ASCII bytes. The + # first name exercises backslashes adjacent to double quotes, a + # Windows special case. + generate_db($oldnode, 'regression\\"\\', 1, 45, '\\\\"\\\\\\'); + generate_db($oldnode, 'regression', 46, 90, ''); + generate_db($oldnode, 'regression', 91, 127, ''); # Grab any regression options that may be passed down by caller. my $extra_opts = $ENV{EXTRA_REGRESS_OPTS} || ""; @@ -99,7 +99,7 @@ sub generate_db my $rc = system($ENV{PG_REGRESS} - . "$extra_opts " + . " $extra_opts " . "--dlpath=\"$dlpath\" " . "--bindir= " . "--host=" @@ -121,6 +121,7 @@ sub generate_db print "=== EOF ===\n"; } } + is($rc, 0, 'regression tests pass'); } # Before dumping, get rid of objects not existing or not supported in later From d1436555f5ab33b1e4d458e9b2722e5eaf0548f6 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 21 May 2022 17:57:23 +0900 Subject: [PATCH 702/772] doc: Fix description of the JIT time fields in pg_stat_statements The four fields tracking the time spent by queries for JIT operations added in 57d6aea were listed as having bigint as data type, but these are of type double precision. Author: Noriyoshi Shinoda Reviewed-by: Nathan Bossart Discussion: https://postgr.es/m/DM4PR84MB1734375E63148AADC6A1E6B4EED39@DM4PR84MB1734.NAMPRD84.PROD.OUTLOOK.COM --- doc/src/sgml/pgstatstatements.sgml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/src/sgml/pgstatstatements.sgml b/doc/src/sgml/pgstatstatements.sgml index 215419f23c..ecf6cd6bf3 100644 --- a/doc/src/sgml/pgstatstatements.sgml +++ b/doc/src/sgml/pgstatstatements.sgml @@ -413,7 +413,7 @@ - jit_generation_time bigint + jit_generation_time double precision Total time spent by the statement on generating JIT code, in milliseconds @@ -431,7 +431,7 @@ - jit_inlining_time bigint + jit_inlining_time double precision Total time spent by the statement on inlining functions, in milliseconds @@ -449,7 +449,7 @@ - jit_optimization_time bigint + jit_optimization_time double precision Total time spent by the statement on optimizing, in milliseconds @@ -467,7 +467,7 @@ - jit_emission_time bigint + jit_emission_time double precision Total time spent by the statement on emitting code, in milliseconds From ac1ae477f85c6aeb3119071c1c00eb042b4afa4d Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 21 May 2022 19:05:47 +0900 Subject: [PATCH 703/772] doc: Mention pg_read_all_stats in description of track_activities The description of track_activities mentioned that it is visible to superusers and that the information related to the current session can be seen, without telling about pg_read_all_stats. Roles that are granted the privileges of pg_read_all_stats can also see this information, so mention it in the docs. Author: Ian Barwick Reviewed-by: Nathan Bossart Discussion: https://postgr.es/m/CAB8KJ=jhPyYFu-A5r-ZGP+Ax715mUKsMxAGcEQ9Cx_mBAmrPow@mail.gmail.com Backpatch-through: 10 --- doc/src/sgml/config.sgml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 8cefe7045b..fe64239ed9 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -7916,10 +7916,10 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; Enables the collection of information on the currently executing command of each session, along with its identifier and the time when that command began execution. This parameter is on by - default. Note that even when enabled, this information is not - visible to all users, only to superusers and the user owning - the session being reported on, so it should not represent a - security risk. + default. Note that even when enabled, this information is only + visible to superusers, members of the + pg_read_all_stats role and the user owning the + session being reported on, so it should not represent a security risk. Only superusers and users with the appropriate SET privilege can change this setting. From a916cb9d5a89804998dd4e7fd7bbb27cb5a7abc8 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 21 May 2022 13:13:41 -0400 Subject: [PATCH 704/772] Avoid overflow hazard when clamping group counts to "long int". Several places in the planner tried to clamp a double value to fit in a "long" by doing (long) Min(x, (double) LONG_MAX); This is subtly incorrect, because it casts LONG_MAX to double and potentially back again. If long is 64 bits then the double value is inexact, and the platform might round it up to LONG_MAX+1 resulting in an overflow and an undesirably negative output. While it's not hard to rewrite the expression into a safe form, let's put it into a common function to reduce the risk of someone doing it wrong in future. In principle this is a bug fix, but since the problem could only manifest with group count estimates exceeding 2^63, it seems unlikely that anyone has actually hit this or will do so anytime soon. We're fixing it mainly to satisfy fuzzer-type tools. That being the case, a HEAD-only fix seems sufficient. Andrey Lepikhov Discussion: https://postgr.es/m/ebbc2efb-7ef9-bf2f-1ada-d6ec48f70e58@postgrespro.ru --- src/backend/executor/nodeSubplan.c | 4 ++-- src/backend/optimizer/path/costsize.c | 27 +++++++++++++++++++++++++ src/backend/optimizer/plan/createplan.c | 7 +++---- src/include/optimizer/optimizer.h | 1 + 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/backend/executor/nodeSubplan.c b/src/backend/executor/nodeSubplan.c index 60d2290030..43b36dcd3b 100644 --- a/src/backend/executor/nodeSubplan.c +++ b/src/backend/executor/nodeSubplan.c @@ -26,7 +26,6 @@ */ #include "postgres.h" -#include #include #include "access/htup_details.h" @@ -35,6 +34,7 @@ #include "miscadmin.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" +#include "optimizer/optimizer.h" #include "utils/array.h" #include "utils/lsyscache.h" #include "utils/memutils.h" @@ -498,7 +498,7 @@ buildSubPlanHash(SubPlanState *node, ExprContext *econtext) node->havehashrows = false; node->havenullrows = false; - nbuckets = (long) Min(planstate->plan->plan_rows, (double) LONG_MAX); + nbuckets = clamp_cardinality_to_long(planstate->plan->plan_rows); if (nbuckets < 1) nbuckets = 1; diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index ed98ba7dbd..fcc26b01a4 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -71,6 +71,7 @@ #include "postgres.h" +#include #include #include "access/amapi.h" @@ -215,6 +216,32 @@ clamp_row_est(double nrows) return nrows; } +/* + * clamp_cardinality_to_long + * Cast a Cardinality value to a sane long value. + */ +long +clamp_cardinality_to_long(Cardinality x) +{ + /* + * Just for paranoia's sake, ensure we do something sane with negative or + * NaN values. + */ + if (isnan(x)) + return LONG_MAX; + if (x <= 0) + return 0; + + /* + * If "long" is 64 bits, then LONG_MAX cannot be represented exactly as a + * double. Casting it to double and back may well result in overflow due + * to rounding, so avoid doing that. We trust that any double value that + * compares strictly less than "(double) LONG_MAX" will cast to a + * representable "long" value. + */ + return (x < (double) LONG_MAX) ? (long) x : LONG_MAX; +} + /* * cost_seqscan diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index f4cc56039c..76606faa3e 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -16,7 +16,6 @@ */ #include "postgres.h" -#include #include #include "access/sysattr.h" @@ -2724,7 +2723,7 @@ create_setop_plan(PlannerInfo *root, SetOpPath *best_path, int flags) flags | CP_LABEL_TLIST); /* Convert numGroups to long int --- but 'ware overflow! */ - numGroups = (long) Min(best_path->numGroups, (double) LONG_MAX); + numGroups = clamp_cardinality_to_long(best_path->numGroups); plan = make_setop(best_path->cmd, best_path->strategy, @@ -2761,7 +2760,7 @@ create_recursiveunion_plan(PlannerInfo *root, RecursiveUnionPath *best_path) tlist = build_path_tlist(root, &best_path->path); /* Convert numGroups to long int --- but 'ware overflow! */ - numGroups = (long) Min(best_path->numGroups, (double) LONG_MAX); + numGroups = clamp_cardinality_to_long(best_path->numGroups); plan = make_recursive_union(tlist, leftplan, @@ -6554,7 +6553,7 @@ make_agg(List *tlist, List *qual, long numGroups; /* Reduce to long, but 'ware overflow! */ - numGroups = (long) Min(dNumGroups, (double) LONG_MAX); + numGroups = clamp_cardinality_to_long(dNumGroups); node->aggstrategy = aggstrategy; node->aggsplit = aggsplit; diff --git a/src/include/optimizer/optimizer.h b/src/include/optimizer/optimizer.h index d40ce2eae1..7be1e5906b 100644 --- a/src/include/optimizer/optimizer.h +++ b/src/include/optimizer/optimizer.h @@ -95,6 +95,7 @@ extern PGDLLIMPORT double recursive_worktable_factor; extern PGDLLIMPORT int effective_cache_size; extern double clamp_row_est(double nrows); +extern long clamp_cardinality_to_long(Cardinality x); /* in path/indxpath.c: */ From e19272ef603bdb11a09e7f8500dc4e0fb4ec73de Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 21 May 2022 13:26:08 -0400 Subject: [PATCH 705/772] Remove unused-and-misspelled function extern declaration. Commit c65507763 added "extern XLogRecPtr CalculateMaxmumSafeLSN(void)", which bears no trace of connection to anything else in that patch or anywhere else. Remove it again. Sergei Kornilov (also spotted by Bharath Rupireddy) Discussion: https://postgr.es/m/706501646056870@vla3-6a5326aeb4ee.qloud-c.yandex.net Discussion: https://postgr.es/m/CALj2ACVoQ7NEf43Xz0rfxsGOKYTN5r4VZp2DO2_5p+CMzsRPFw@mail.gmail.com --- src/include/access/xlog.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index d9f2487a96..cd674c3c23 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -233,7 +233,6 @@ extern void ShutdownXLOG(int code, Datum arg); extern void CreateCheckPoint(int flags); extern bool CreateRestartPoint(int flags); extern WALAvailability GetWALAvailability(XLogRecPtr targetLSN); -extern XLogRecPtr CalculateMaxmumSafeLSN(void); extern void XLogPutNextOid(Oid nextOid); extern XLogRecPtr XLogRestorePoint(const char *rpName); extern void UpdateFullPageWrites(void); From c7461fc25558832dd347a9c8150b0f1ed85e36e8 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 21 May 2022 14:45:58 -0400 Subject: [PATCH 706/772] Show 'AS "?column?"' explicitly when it's important. ruleutils.c was coded to suppress the AS label for a SELECT output expression if the column name is "?column?", which is the parser's fallback if it can't think of something better. This is fine, and avoids ugly clutter, so long as (1) nothing further up in the parse tree relies on that column name or (2) the same fallback would be assigned when the rule or view definition is reloaded. Unfortunately (2) is far from certain, both because ruleutils.c might print the expression in a different form from how it was originally written and because FigureColname's rules might change in future releases. So we shouldn't rely on that. Detecting exactly whether there is any outer-level use of a SELECT column name would be rather expensive. This patch takes the simpler approach of just passing down a flag indicating whether there *could* be any outer use; for example, the output column names of a SubLink are not referenceable, and we also do not care about the names exposed by the right-hand side of a setop. This is sufficient to suppress unwanted clutter in all but one case in the regression tests. That seems like reasonable evidence that it won't be too much in users' faces, while still fixing the cases we need to fix. Per bug #17486 from Nicolas Lutic. This issue is ancient, so back-patch to all supported branches. Discussion: https://postgr.es/m/17486-1ad6fd786728b8af@postgresql.org --- src/backend/utils/adt/ruleutils.c | 107 ++++++++++++++++---------- src/test/regress/expected/matview.out | 4 +- 2 files changed, 70 insertions(+), 41 deletions(-) diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 49c4201dde..c3937a60fd 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -395,26 +395,29 @@ static void make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, static void make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, int prettyFlags, int wrapColumn); static void get_query_def(Query *query, StringInfo buf, List *parentnamespace, - TupleDesc resultDesc, + TupleDesc resultDesc, bool colNamesVisible, int prettyFlags, int wrapColumn, int startIndent); static void get_values_def(List *values_lists, deparse_context *context); static void get_with_clause(Query *query, deparse_context *context); static void get_select_query_def(Query *query, deparse_context *context, - TupleDesc resultDesc); -static void get_insert_query_def(Query *query, deparse_context *context); -static void get_update_query_def(Query *query, deparse_context *context); + TupleDesc resultDesc, bool colNamesVisible); +static void get_insert_query_def(Query *query, deparse_context *context, + bool colNamesVisible); +static void get_update_query_def(Query *query, deparse_context *context, + bool colNamesVisible); static void get_update_query_targetlist_def(Query *query, List *targetList, deparse_context *context, RangeTblEntry *rte); -static void get_delete_query_def(Query *query, deparse_context *context); +static void get_delete_query_def(Query *query, deparse_context *context, + bool colNamesVisible); static void get_utility_query_def(Query *query, deparse_context *context); static void get_basic_select_query(Query *query, deparse_context *context, - TupleDesc resultDesc); + TupleDesc resultDesc, bool colNamesVisible); static void get_target_list(List *targetList, deparse_context *context, - TupleDesc resultDesc); + TupleDesc resultDesc, bool colNamesVisible); static void get_setop_query(Node *setOp, Query *query, deparse_context *context, - TupleDesc resultDesc); + TupleDesc resultDesc, bool colNamesVisible); static Node *get_rule_sortgroupclause(Index ref, List *tlist, bool force_colno, deparse_context *context); @@ -1544,7 +1547,8 @@ pg_get_querydef(Query *query, bool pretty) initStringInfo(&buf); - get_query_def(query, &buf, NIL, NULL, prettyFlags, WRAP_COLUMN_DEFAULT, 0); + get_query_def(query, &buf, NIL, NULL, true, + prettyFlags, WRAP_COLUMN_DEFAULT, 0); return buf.data; } @@ -3548,7 +3552,7 @@ print_function_sqlbody(StringInfo buf, HeapTuple proctup) /* It seems advisable to get at least AccessShareLock on rels */ AcquireRewriteLocks(query, false, false); - get_query_def(query, buf, list_make1(&dpns), NULL, + get_query_def(query, buf, list_make1(&dpns), NULL, false, PRETTYFLAG_INDENT, WRAP_COLUMN_DEFAULT, 1); appendStringInfoChar(buf, ';'); appendStringInfoChar(buf, '\n'); @@ -3562,7 +3566,7 @@ print_function_sqlbody(StringInfo buf, HeapTuple proctup) /* It seems advisable to get at least AccessShareLock on rels */ AcquireRewriteLocks(query, false, false); - get_query_def(query, buf, list_make1(&dpns), NULL, + get_query_def(query, buf, list_make1(&dpns), NULL, false, 0, WRAP_COLUMN_DEFAULT, 0); } } @@ -5299,7 +5303,7 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, foreach(action, actions) { query = (Query *) lfirst(action); - get_query_def(query, buf, NIL, viewResultDesc, + get_query_def(query, buf, NIL, viewResultDesc, true, prettyFlags, WRAP_COLUMN_DEFAULT, 0); if (prettyFlags) appendStringInfoString(buf, ";\n"); @@ -5313,7 +5317,7 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, Query *query; query = (Query *) linitial(actions); - get_query_def(query, buf, NIL, viewResultDesc, + get_query_def(query, buf, NIL, viewResultDesc, true, prettyFlags, WRAP_COLUMN_DEFAULT, 0); appendStringInfoChar(buf, ';'); } @@ -5387,7 +5391,7 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, ev_relation = table_open(ev_class, AccessShareLock); - get_query_def(query, buf, NIL, RelationGetDescr(ev_relation), + get_query_def(query, buf, NIL, RelationGetDescr(ev_relation), true, prettyFlags, wrapColumn, 0); appendStringInfoChar(buf, ';'); @@ -5398,13 +5402,23 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, /* ---------- * get_query_def - Parse back one query parsetree * - * If resultDesc is not NULL, then it is the output tuple descriptor for - * the view represented by a SELECT query. + * query: parsetree to be displayed + * buf: output text is appended to buf + * parentnamespace: list (initially empty) of outer-level deparse_namespace's + * resultDesc: if not NULL, the output tuple descriptor for the view + * represented by a SELECT query. We use the column names from it + * to label SELECT output columns, in preference to names in the query + * colNamesVisible: true if the surrounding context cares about the output + * column names at all (as, for example, an EXISTS() context does not); + * when false, we can suppress dummy column labels such as "?column?" + * prettyFlags: bitmask of PRETTYFLAG_XXX options + * wrapColumn: maximum line length, or -1 to disable wrapping + * startIndent: initial indentation amount * ---------- */ static void get_query_def(Query *query, StringInfo buf, List *parentnamespace, - TupleDesc resultDesc, + TupleDesc resultDesc, bool colNamesVisible, int prettyFlags, int wrapColumn, int startIndent) { deparse_context context; @@ -5442,19 +5456,19 @@ get_query_def(Query *query, StringInfo buf, List *parentnamespace, switch (query->commandType) { case CMD_SELECT: - get_select_query_def(query, &context, resultDesc); + get_select_query_def(query, &context, resultDesc, colNamesVisible); break; case CMD_UPDATE: - get_update_query_def(query, &context); + get_update_query_def(query, &context, colNamesVisible); break; case CMD_INSERT: - get_insert_query_def(query, &context); + get_insert_query_def(query, &context, colNamesVisible); break; case CMD_DELETE: - get_delete_query_def(query, &context); + get_delete_query_def(query, &context, colNamesVisible); break; case CMD_NOTHING: @@ -5578,6 +5592,7 @@ get_with_clause(Query *query, deparse_context *context) if (PRETTY_INDENT(context)) appendContextKeyword(context, "", 0, 0, 0); get_query_def((Query *) cte->ctequery, buf, context->namespaces, NULL, + true, context->prettyFlags, context->wrapColumn, context->indentLevel); if (PRETTY_INDENT(context)) @@ -5659,7 +5674,7 @@ get_with_clause(Query *query, deparse_context *context) */ static void get_select_query_def(Query *query, deparse_context *context, - TupleDesc resultDesc) + TupleDesc resultDesc, bool colNamesVisible) { StringInfo buf = context->buf; List *save_windowclause; @@ -5683,13 +5698,14 @@ get_select_query_def(Query *query, deparse_context *context, */ if (query->setOperations) { - get_setop_query(query->setOperations, query, context, resultDesc); + get_setop_query(query->setOperations, query, context, resultDesc, + colNamesVisible); /* ORDER BY clauses must be simple in this case */ force_colno = true; } else { - get_basic_select_query(query, context, resultDesc); + get_basic_select_query(query, context, resultDesc, colNamesVisible); force_colno = false; } @@ -5859,7 +5875,7 @@ get_simple_values_rte(Query *query, TupleDesc resultDesc) static void get_basic_select_query(Query *query, deparse_context *context, - TupleDesc resultDesc) + TupleDesc resultDesc, bool colNamesVisible) { StringInfo buf = context->buf; RangeTblEntry *values_rte; @@ -5915,7 +5931,7 @@ get_basic_select_query(Query *query, deparse_context *context, } /* Then we tell what to select (the targetlist) */ - get_target_list(query->targetList, context, resultDesc); + get_target_list(query->targetList, context, resultDesc, colNamesVisible); /* Add the FROM clause if needed */ get_from_clause(query, " FROM ", context); @@ -5987,11 +6003,13 @@ get_basic_select_query(Query *query, deparse_context *context, * get_target_list - Parse back a SELECT target list * * This is also used for RETURNING lists in INSERT/UPDATE/DELETE. + * + * resultDesc and colNamesVisible are as for get_query_def() * ---------- */ static void get_target_list(List *targetList, deparse_context *context, - TupleDesc resultDesc) + TupleDesc resultDesc, bool colNamesVisible) { StringInfo buf = context->buf; StringInfoData targetbuf; @@ -6042,8 +6060,13 @@ get_target_list(List *targetList, deparse_context *context, else { get_rule_expr((Node *) tle->expr, context, true); - /* We'll show the AS name unless it's this: */ - attname = "?column?"; + + /* + * When colNamesVisible is true, we should always show the + * assigned column name explicitly. Otherwise, show it only if + * it's not FigureColname's fallback. + */ + attname = colNamesVisible ? NULL : "?column?"; } /* @@ -6122,7 +6145,7 @@ get_target_list(List *targetList, deparse_context *context, static void get_setop_query(Node *setOp, Query *query, deparse_context *context, - TupleDesc resultDesc) + TupleDesc resultDesc, bool colNamesVisible) { StringInfo buf = context->buf; bool need_paren; @@ -6148,6 +6171,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context, if (need_paren) appendStringInfoChar(buf, '('); get_query_def(subquery, buf, context->namespaces, resultDesc, + colNamesVisible, context->prettyFlags, context->wrapColumn, context->indentLevel); if (need_paren) @@ -6190,7 +6214,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context, else subindent = 0; - get_setop_query(op->larg, query, context, resultDesc); + get_setop_query(op->larg, query, context, resultDesc, colNamesVisible); if (need_paren) appendContextKeyword(context, ") ", -subindent, 0, 0); @@ -6234,7 +6258,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context, subindent = 0; appendContextKeyword(context, "", subindent, 0, 0); - get_setop_query(op->rarg, query, context, resultDesc); + get_setop_query(op->rarg, query, context, resultDesc, false); if (PRETTY_INDENT(context)) context->indentLevel -= subindent; @@ -6570,7 +6594,8 @@ get_rule_windowspec(WindowClause *wc, List *targetList, * ---------- */ static void -get_insert_query_def(Query *query, deparse_context *context) +get_insert_query_def(Query *query, deparse_context *context, + bool colNamesVisible) { StringInfo buf = context->buf; RangeTblEntry *select_rte = NULL; @@ -6680,6 +6705,7 @@ get_insert_query_def(Query *query, deparse_context *context) { /* Add the SELECT */ get_query_def(select_rte->subquery, buf, context->namespaces, NULL, + false, context->prettyFlags, context->wrapColumn, context->indentLevel); } @@ -6773,7 +6799,7 @@ get_insert_query_def(Query *query, deparse_context *context) { appendContextKeyword(context, " RETURNING", -PRETTYINDENT_STD, PRETTYINDENT_STD, 1); - get_target_list(query->returningList, context, NULL); + get_target_list(query->returningList, context, NULL, colNamesVisible); } } @@ -6783,7 +6809,8 @@ get_insert_query_def(Query *query, deparse_context *context) * ---------- */ static void -get_update_query_def(Query *query, deparse_context *context) +get_update_query_def(Query *query, deparse_context *context, + bool colNamesVisible) { StringInfo buf = context->buf; RangeTblEntry *rte; @@ -6828,7 +6855,7 @@ get_update_query_def(Query *query, deparse_context *context) { appendContextKeyword(context, " RETURNING", -PRETTYINDENT_STD, PRETTYINDENT_STD, 1); - get_target_list(query->returningList, context, NULL); + get_target_list(query->returningList, context, NULL, colNamesVisible); } } @@ -6990,7 +7017,8 @@ get_update_query_targetlist_def(Query *query, List *targetList, * ---------- */ static void -get_delete_query_def(Query *query, deparse_context *context) +get_delete_query_def(Query *query, deparse_context *context, + bool colNamesVisible) { StringInfo buf = context->buf; RangeTblEntry *rte; @@ -7031,7 +7059,7 @@ get_delete_query_def(Query *query, deparse_context *context) { appendContextKeyword(context, " RETURNING", -PRETTYINDENT_STD, PRETTYINDENT_STD, 1); - get_target_list(query->returningList, context, NULL); + get_target_list(query->returningList, context, NULL, colNamesVisible); } } @@ -11039,7 +11067,7 @@ get_sublink_expr(SubLink *sublink, deparse_context *context) if (need_paren) appendStringInfoChar(buf, '('); - get_query_def(query, buf, context->namespaces, NULL, + get_query_def(query, buf, context->namespaces, NULL, false, context->prettyFlags, context->wrapColumn, context->indentLevel); @@ -11548,6 +11576,7 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context) /* Subquery RTE */ appendStringInfoChar(buf, '('); get_query_def(rte->subquery, buf, context->namespaces, NULL, + true, context->prettyFlags, context->wrapColumn, context->indentLevel); appendStringInfoChar(buf, ')'); diff --git a/src/test/regress/expected/matview.out b/src/test/regress/expected/matview.out index 313c72a268..c109d97635 100644 --- a/src/test/regress/expected/matview.out +++ b/src/test/regress/expected/matview.out @@ -347,7 +347,7 @@ CREATE VIEW mvtest_vt2 AS SELECT moo, 2*moo FROM mvtest_vt1 UNION ALL SELECT moo ?column? | integer | | | | plain | View definition: SELECT mvtest_vt1.moo, - 2 * mvtest_vt1.moo + 2 * mvtest_vt1.moo AS "?column?" FROM mvtest_vt1 UNION ALL SELECT mvtest_vt1.moo, @@ -363,7 +363,7 @@ CREATE MATERIALIZED VIEW mv_test2 AS SELECT moo, 2*moo FROM mvtest_vt2 UNION ALL ?column? | integer | | | | plain | | View definition: SELECT mvtest_vt2.moo, - 2 * mvtest_vt2.moo + 2 * mvtest_vt2.moo AS "?column?" FROM mvtest_vt2 UNION ALL SELECT mvtest_vt2.moo, From 7fdbdf204920ac279f280d0a8e96946fdaf41aef Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sun, 22 May 2022 15:09:50 -0700 Subject: [PATCH 707/772] pgstat: fix stats.spec instability on slow machines. On slow machines the modified test could end up switching the order in which transactional stats are reported in one session and non-transactional stats in another session. As stats handling of truncate is implemented as setting live/dead rows 0, the order in which a truncate's stats changes are applied, relative to normal stats updates, matters. The handling of stats for truncate hasn't changed due to shared memory stats, this is longstanding behavior. We might want to improve truncate's stats handling in the future, but for now just change the order of forced flushed to make the test stable. Reported-By: Christoph Berg Discussion: https://postgr.es/m/YoZf7U/WmfmFYFEx@msg.df7cb.de --- src/test/isolation/expected/stats.out | 4 ++-- src/test/isolation/expected/stats_1.out | 6 +++--- src/test/isolation/specs/stats.spec | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/test/isolation/expected/stats.out b/src/test/isolation/expected/stats.out index 8bf6e57d0b..61b5a710ec 100644 --- a/src/test/isolation/expected/stats.out +++ b/src/test/isolation/expected/stats.out @@ -2812,7 +2812,7 @@ seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum (1 row) -starting permutation: s1_table_insert s1_begin s1_table_update_k1 s1_table_update_k1 s1_table_truncate s1_table_insert_k1 s1_table_update_k1 s1_prepare_a s2_commit_prepared_a s1_ff s2_ff s1_table_stats +starting permutation: s1_table_insert s1_begin s1_table_update_k1 s1_table_update_k1 s1_table_truncate s1_table_insert_k1 s1_table_update_k1 s1_prepare_a s1_ff s2_commit_prepared_a s2_ff s1_table_stats pg_stat_force_next_flush ------------------------ @@ -2826,13 +2826,13 @@ step s1_table_truncate: TRUNCATE test_stat_tab; step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; step s1_prepare_a: PREPARE TRANSACTION 'a'; -step s2_commit_prepared_a: COMMIT PREPARED 'a'; step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ (1 row) +step s2_commit_prepared_a: COMMIT PREPARED 'a'; step s2_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ diff --git a/src/test/isolation/expected/stats_1.out b/src/test/isolation/expected/stats_1.out index 61fda0b502..3854320106 100644 --- a/src/test/isolation/expected/stats_1.out +++ b/src/test/isolation/expected/stats_1.out @@ -2826,7 +2826,7 @@ seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum (1 row) -starting permutation: s1_table_insert s1_begin s1_table_update_k1 s1_table_update_k1 s1_table_truncate s1_table_insert_k1 s1_table_update_k1 s1_prepare_a s2_commit_prepared_a s1_ff s2_ff s1_table_stats +starting permutation: s1_table_insert s1_begin s1_table_update_k1 s1_table_update_k1 s1_table_truncate s1_table_insert_k1 s1_table_update_k1 s1_prepare_a s1_ff s2_commit_prepared_a s2_ff s1_table_stats pg_stat_force_next_flush ------------------------ @@ -2841,14 +2841,14 @@ step s1_table_insert_k1: INSERT INTO test_stat_tab(key, value) VALUES('k1', 1); step s1_table_update_k1: UPDATE test_stat_tab SET value = value + 1 WHERE key = 'k1'; step s1_prepare_a: PREPARE TRANSACTION 'a'; ERROR: prepared transactions are disabled -step s2_commit_prepared_a: COMMIT PREPARED 'a'; -ERROR: prepared transaction with identifier "a" does not exist step s1_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ (1 row) +step s2_commit_prepared_a: COMMIT PREPARED 'a'; +ERROR: prepared transaction with identifier "a" does not exist step s2_ff: SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush ------------------------ diff --git a/src/test/isolation/specs/stats.spec b/src/test/isolation/specs/stats.spec index be4ae1f4ff..5b922d788c 100644 --- a/src/test/isolation/specs/stats.spec +++ b/src/test/isolation/specs/stats.spec @@ -562,8 +562,9 @@ permutation s1_table_insert_k1 # should be counted s1_table_update_k1 # dito s1_prepare_a + s1_ff # flush out non-transactional stats, might happen anyway s2_commit_prepared_a - s1_ff s2_ff + s2_ff s1_table_stats # S1 prepares, S1 aborts prepared From 6e647ef0e750bc5007e4af48b19023d68ae91b6a Mon Sep 17 00:00:00 2001 From: John Naylor Date: Mon, 23 May 2022 13:11:43 +0700 Subject: [PATCH 708/772] Remove debug messages from tuplesort_sort_memtuples() These were of value only during development. Reported by Justin Pryzby Discussion: https://www.postgresql.org/message-id/20220519201254.GU19626%40telsasoft.com --- src/backend/utils/sort/tuplesort.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index 8340a66052..31554fd867 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -3664,7 +3664,6 @@ tuplesort_sort_memtuples(Tuplesortstate *state) { if (state->sortKeys[0].comparator == ssup_datum_unsigned_cmp) { - elog(DEBUG1, "qsort_tuple_unsigned"); qsort_tuple_unsigned(state->memtuples, state->memtupcount, state); @@ -3673,7 +3672,6 @@ tuplesort_sort_memtuples(Tuplesortstate *state) #if SIZEOF_DATUM >= 8 else if (state->sortKeys[0].comparator == ssup_datum_signed_cmp) { - elog(DEBUG1, "qsort_tuple_signed"); qsort_tuple_signed(state->memtuples, state->memtupcount, state); @@ -3682,7 +3680,6 @@ tuplesort_sort_memtuples(Tuplesortstate *state) #endif else if (state->sortKeys[0].comparator == ssup_datum_int32_cmp) { - elog(DEBUG1, "qsort_tuple_int32"); qsort_tuple_int32(state->memtuples, state->memtupcount, state); @@ -3693,13 +3690,11 @@ tuplesort_sort_memtuples(Tuplesortstate *state) /* Can we use the single-key sort function? */ if (state->onlyKey != NULL) { - elog(DEBUG1, "qsort_ssup"); qsort_ssup(state->memtuples, state->memtupcount, state->onlyKey); } else { - elog(DEBUG1, "qsort_tuple"); qsort_tuple(state->memtuples, state->memtupcount, state->comparetup, From 9520f8d92a8681e441cc863422babd544353dd39 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 23 May 2022 10:07:36 +0200 Subject: [PATCH 709/772] psql: Update \timing also in case of an error The changes to show all query results (7844c9918) broke \timing output in case of an error; it didn't update the timing result and showed 0.000 ms. Fix by updating the timing result also in the error case. Also, for robustness, update the timing result any time a result is obtained, not only for the last, so a sensible value is always available. Reported-by: Tom Lane Author: Richard Guo Author: Fabien COELHO Discussion: https://www.postgresql.org/message-id/3813350.1652111765%40sss.pgh.pa.us --- src/bin/psql/common.c | 14 ++++++++++++-- src/bin/psql/t/001_basic.pl | 12 ++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index 9b140badeb..03e6d9ce8f 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1566,6 +1566,16 @@ ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_g else result = PQgetResult(pset.db); + /* + * Get current timing measure in case an error occurs + */ + if (timing) + { + INSTR_TIME_SET_CURRENT(after); + INSTR_TIME_SUBTRACT(after, before); + *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); + } + continue; } else if (svpt_gone_p && !*svpt_gone_p) @@ -1619,7 +1629,7 @@ ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_g last = (next_result == NULL); /* - * Get timing measure before printing the last result. + * Update current timing measure. * * It will include the display of previous results, if any. This * cannot be helped because the server goes on processing further @@ -1630,7 +1640,7 @@ ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_g * With combined queries, timing must be understood as an upper bound * of the time spent processing them. */ - if (last && timing) + if (timing) { INSTR_TIME_SET_CURRENT(after); INSTR_TIME_SUBTRACT(after, before); diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl index 90e69d7cdb..c3ed18e84d 100644 --- a/src/bin/psql/t/001_basic.pl +++ b/src/bin/psql/t/001_basic.pl @@ -85,8 +85,16 @@ sub psql_fails_like '\timing on SELECT 1', qr/^1$ -^Time: \d+.\d\d\d ms/m, - '\timing'); +^Time: \d+\.\d\d\d ms/m, + '\timing with successful query'); + +# test \timing with query that fails +{ + my ($ret, $stdout, $stderr) = $node->psql('postgres', "\\timing on\nSELECT error"); + isnt($ret, 0, '\timing with query error: query failed'); + like($stdout, qr/^Time: \d+\.\d\d\d ms/m, '\timing with query error: timing output appears'); + unlike($stdout, qr/^Time: 0\.000 ms/m, '\timing with query error: timing was updated'); +} # test that ENCODING variable is set and that it is updated when # client encoding is changed From 09ed73f1a4af5cdcbe9725727822e54bd8e9f743 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 23 May 2022 10:31:33 +0200 Subject: [PATCH 710/772] doc: Add documentation for pg_database.datlocprovider column This was apparently missed in the original commit. Author: Shinoda, Noriyoshi (PN Japan FSIP) Discussion: https://www.postgresql.org/message-id/flat/DM4PR84MB1734BA51BC8B08CF3FA239BBEED49%40DM4PR84MB1734.NAMPRD84.PROD.OUTLOOK.COM --- doc/src/sgml/catalogs.sgml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index d96c72e531..c00c93dd7b 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -2965,6 +2965,16 @@ SCRAM-SHA-256$<iteration count>:&l + + + datlocprovider char + + + Locale provider for this database: c = libc, + i = icu + + + datistemplate bool From da1c0acd0a61eb8c1d62725ded9c219e783cc6a2 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 23 May 2022 10:54:39 +0200 Subject: [PATCH 711/772] pg_upgrade: Tweak translatable strings "\r" (for progress output) must not be inside a translatable string (gettext gets upset). In passing, move the minimum supported version number to a separate argument, so that we don't have to retranslate this string every year now. --- src/bin/pg_upgrade/check.c | 3 ++- src/bin/pg_upgrade/util.c | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c index dd3972bb6c..6114303b52 100644 --- a/src/bin/pg_upgrade/check.c +++ b/src/bin/pg_upgrade/check.c @@ -289,7 +289,8 @@ check_cluster_versions(void) */ if (GET_MAJOR_VERSION(old_cluster.major_version) < 902) - pg_fatal("This utility can only upgrade from PostgreSQL version 9.2 and later.\n"); + pg_fatal("This utility can only upgrade from PostgreSQL version %s and later.\n", + "9.2"); /* Only current PG version is supported as a target */ if (GET_MAJOR_VERSION(new_cluster.major_version) != GET_MAJOR_VERSION(PG_VERSION_NUM)) diff --git a/src/bin/pg_upgrade/util.c b/src/bin/pg_upgrade/util.c index 9edfe7c360..1a328b4270 100644 --- a/src/bin/pg_upgrade/util.c +++ b/src/bin/pg_upgrade/util.c @@ -47,7 +47,10 @@ end_progress_output(void) * nicely. */ if (log_opts.isatty) - pg_log(PG_REPORT, "\r%-*s", MESSAGE_WIDTH, ""); + { + printf("\r"); + pg_log(PG_REPORT, "%-*s", MESSAGE_WIDTH, ""); + } else if (log_opts.verbose) pg_log(PG_REPORT, "%-*s", MESSAGE_WIDTH, ""); } From d45e824b6719147ef5d225c1949c2e65548e00ff Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 23 May 2022 13:09:18 +0200 Subject: [PATCH 712/772] doc: Improve COPY synopsis Upper-case MATCH so that it is clearer that it is a keyword in this context. Discussion: https://www.postgresql.org/message-id/flat/20220517.174342.1884842412165214815.horikyota.ntt%40gmail.com --- doc/src/sgml/ref/copy.sgml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/ref/copy.sgml b/doc/src/sgml/ref/copy.sgml index 546cef04b9..40af423ccf 100644 --- a/doc/src/sgml/ref/copy.sgml +++ b/doc/src/sgml/ref/copy.sgml @@ -36,7 +36,7 @@ COPY { table_name [ ( boolean ] DELIMITER 'delimiter_character' NULL 'null_string' - HEADER [ boolean | match ] + HEADER [ boolean | MATCH ] QUOTE 'quote_character' ESCAPE 'escape_character' FORCE_QUOTE { ( column_name [, ...] ) | * } @@ -278,7 +278,7 @@ COPY { table_name [ ( true (or equivalent Boolean value). - If this option is set to match, the number and names + If this option is set to MATCH, the number and names of the columns in the header line must match the actual column names of the table, otherwise an error is raised. This option is not allowed when using binary format. From c9dfe2e83a8dbc30e6992ced01da2f7cfa0f63f3 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 24 May 2022 11:00:41 +0900 Subject: [PATCH 713/772] Remove duplicated words in comments of pgstat.c and pgstat_internal.h Author: Atsushi Torikoshi Reviewed-by: Nathan Bossart Discussion: https://postgr.es/m/d00ddbf29f9d09b3a471e64977560de1@oss.nttdata.com --- src/backend/utils/activity/pgstat.c | 4 ++-- src/include/utils/pgstat_internal.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index 3c3fd0e9b7..05f2d9e9bd 100644 --- a/src/backend/utils/activity/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -32,9 +32,9 @@ * backend-local hashtable (pgStatEntryRefHash) in front of the shared * hashtable, containing references (PgStat_EntryRef) to shared hashtable * entries. The shared hashtable only needs to be accessed when no prior - * reference is found in the local hashtable. Besides pointing to the the + * reference is found in the local hashtable. Besides pointing to the * shared hashtable entry (PgStatShared_HashEntry) PgStat_EntryRef also - * contains a pointer to the the shared statistics data, as a process-local + * contains a pointer to the shared statistics data, as a process-local * address, to reduce access costs. * * The names for structs stored in shared memory are prefixed with diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index 0eccaea6c1..9303d05427 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -296,9 +296,9 @@ static const char *const slru_names[] = { * values in a copy of the stats data, which is protected by ->lock. See * pgstat_fetch_stat_(archiver|bgwriter|checkpointer) for the reader side. * - * The only exception to that is the the stat_reset_timestamp in these - * structs, which is protected by ->lock, because it has to be written by - * another backend while resetting + * The only exception to that is the stat_reset_timestamp in these structs, + * which is protected by ->lock, because it has to be written by another + * backend while resetting. * ---------- */ From 335e444f2269086c22146d885afb9d6e92d5cb01 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 24 May 2022 19:37:50 -0400 Subject: [PATCH 714/772] relnotes: add Heikki to UTF8 item Reported-by: John Naylor Discussion: https://postgr.es/m/CAFBsxsFhbhMbK_ZaLpH6J8BfJL_uowtGg+Qs9XA=F4uPU3aucA@mail.gmail.com --- doc/src/sgml/release-15.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/release-15.sgml b/doc/src/sgml/release-15.sgml index 4a46c4278c..f7344b9884 100644 --- a/doc/src/sgml/release-15.sgml +++ b/doc/src/sgml/release-15.sgml @@ -757,7 +757,7 @@ Author: John Naylor -Improve validation of UTF-8 text (even if only ASCII) by processing 16 bytes at a time (John Naylor) +Improve validation of UTF-8 text (even if only ASCII) by processing 16 bytes at a time (John Naylor, Heikki Linnakangas) From 98f897339b011d04f3b9f48050aa31de9a5a4869 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 24 May 2022 21:24:13 -0700 Subject: [PATCH 715/772] Fix stats_fetch_consistency default value indicated in postgresql.conf.sample. Mistake in 5891c7a8ed8, likely made when switching the default value from none to fetch during development. Reported-By: Nathan Bossart Author: Nathan Bossart Discussion: https://postgr.es/m/20220524220147.GA1298892@nathanxps13 --- src/backend/utils/misc/postgresql.conf.sample | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index a5a6d14cd4..48ad80cf2e 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -619,7 +619,7 @@ #track_io_timing = off #track_wal_io_timing = off #track_functions = none # none, pl, all -#stats_fetch_consistency = none +#stats_fetch_consistency = cache # - Monitoring - From 0dc379de646309d388990399132f9c12137e86e4 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 25 May 2022 14:21:05 +0900 Subject: [PATCH 716/772] Add tab completion for table_rewrite's CREATE EVENT TRIGGER in psql Author: Hou Zhijie Discussion: https://postgr.es/m/OS0PR01MB5716DEFF787B925C4778228C94D69@OS0PR01MB5716.jpnprd01.prod.outlook.com --- src/bin/psql/tab-complete.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 55af9eb04e..e1cc753489 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -3408,7 +3408,8 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("ON"); /* Complete CREATE EVENT TRIGGER ON with event_type */ else if (Matches("CREATE", "EVENT", "TRIGGER", MatchAny, "ON")) - COMPLETE_WITH("ddl_command_start", "ddl_command_end", "sql_drop"); + COMPLETE_WITH("ddl_command_start", "ddl_command_end", "sql_drop", + "table_rewrite"); /* * Complete CREATE EVENT TRIGGER ON . EXECUTE FUNCTION From de89d8711e2b70150a2c5b3215d99da108fbe1e8 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Wed, 25 May 2022 22:19:20 -0400 Subject: [PATCH 717/772] relnotes: update ordered partition scan item Reported-by: Amit Langote Discussion: https://postgr.es/m/CA+HiwqFMmOK9cjrqxJeY1HKKbgMup0HcZ+Co7JuzJG_8ZypceA@mail.gmail.com --- doc/src/sgml/release-15.sgml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/src/sgml/release-15.sgml b/doc/src/sgml/release-15.sgml index f7344b9884..8390578a9a 100644 --- a/doc/src/sgml/release-15.sgml +++ b/doc/src/sgml/release-15.sgml @@ -548,8 +548,7 @@ Allow ordered scans of partitions to avoid sorting in more cases (David Rowley) -Previously, a partitioned table with any LIST partition containing multiple values could not be used for ordered partition scans. Now only non-pruned LIST partitions are checked. This also helps with -partitioned tables with DEFAULT partitions. +Previously, a partitioned table with a DEFAULT partition or a LIST partition containing multiple values could not be used for ordered partition scans. Now they can be used if these partitions are pruned. From 6217053f4e856159442629bd50c583ce3e4bc1fb Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 26 May 2022 12:25:10 -0400 Subject: [PATCH 718/772] Avoid ERRCODE_INTERNAL_ERROR in oracle_compat.c functions. repeat() checked for integer overflow during its calculation of the required output space, but it just passed the resulting integer to palloc(). This meant that result sizes between 1GB and 2GB led to ERRCODE_INTERNAL_ERROR, "invalid memory alloc request size" rather than ERRCODE_PROGRAM_LIMIT_EXCEEDED, "requested length too large". That seems like a bit of a wart, so add an explicit AllocSizeIsValid check to make these error cases uniform. Do likewise in the sibling functions lpad() etc. While we're here, also modernize their overflow checks to use pg_mul_s32_overflow() etc instead of expensive divisions. Per complaint from Japin Li. This is basically cosmetic, so I don't feel a need to back-patch. Discussion: https://postgr.es/m/ME3P282MB16676ED32167189CB0462173B6D69@ME3P282MB1667.AUSP282.PROD.OUTLOOK.COM --- src/backend/utils/adt/oracle_compat.c | 43 +++++++++++++++------------ 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/backend/utils/adt/oracle_compat.c b/src/backend/utils/adt/oracle_compat.c index a6e043c32c..018e8c9342 100644 --- a/src/backend/utils/adt/oracle_compat.c +++ b/src/backend/utils/adt/oracle_compat.c @@ -20,6 +20,8 @@ #include "miscadmin.h" #include "utils/builtins.h" #include "utils/formatting.h" +#include "utils/memutils.h" + static text *dotrim(const char *string, int stringlen, const char *set, int setlen, @@ -155,7 +157,6 @@ lpad(PG_FUNCTION_ARGS) int m, s1len, s2len; - int bytelen; /* Negative len is silently taken as zero */ @@ -178,15 +179,16 @@ lpad(PG_FUNCTION_ARGS) if (s2len <= 0) len = s1len; /* nothing to pad with, so don't pad */ - bytelen = pg_database_encoding_max_length() * len; - - /* check for integer overflow */ - if (len != 0 && bytelen / pg_database_encoding_max_length() != len) + /* compute worst-case output length */ + if (unlikely(pg_mul_s32_overflow(pg_database_encoding_max_length(), len, + &bytelen)) || + unlikely(pg_add_s32_overflow(bytelen, VARHDRSZ, &bytelen)) || + unlikely(!AllocSizeIsValid(bytelen))) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("requested length too large"))); - ret = (text *) palloc(VARHDRSZ + bytelen); + ret = (text *) palloc(bytelen); m = len - s1len; @@ -253,7 +255,6 @@ rpad(PG_FUNCTION_ARGS) int m, s1len, s2len; - int bytelen; /* Negative len is silently taken as zero */ @@ -276,15 +277,17 @@ rpad(PG_FUNCTION_ARGS) if (s2len <= 0) len = s1len; /* nothing to pad with, so don't pad */ - bytelen = pg_database_encoding_max_length() * len; - - /* Check for integer overflow */ - if (len != 0 && bytelen / pg_database_encoding_max_length() != len) + /* compute worst-case output length */ + if (unlikely(pg_mul_s32_overflow(pg_database_encoding_max_length(), len, + &bytelen)) || + unlikely(pg_add_s32_overflow(bytelen, VARHDRSZ, &bytelen)) || + unlikely(!AllocSizeIsValid(bytelen))) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("requested length too large"))); - ret = (text *) palloc(VARHDRSZ + bytelen); + ret = (text *) palloc(bytelen); + m = len - s1len; ptr1 = VARDATA_ANY(string1); @@ -805,7 +808,7 @@ translate(PG_FUNCTION_ARGS) tolen, retlen, i; - int worst_len; + int bytelen; int len; int source_len; int from_index; @@ -824,15 +827,16 @@ translate(PG_FUNCTION_ARGS) * The worst-case expansion is to substitute a max-length character for a * single-byte character at each position of the string. */ - worst_len = pg_database_encoding_max_length() * m; - - /* check for integer overflow */ - if (worst_len / pg_database_encoding_max_length() != m) + if (unlikely(pg_mul_s32_overflow(pg_database_encoding_max_length(), m, + &bytelen)) || + unlikely(pg_add_s32_overflow(bytelen, VARHDRSZ, &bytelen)) || + unlikely(!AllocSizeIsValid(bytelen))) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("requested length too large"))); - result = (text *) palloc(worst_len + VARHDRSZ); + result = (text *) palloc(bytelen); + target = VARDATA(result); retlen = 0; @@ -1128,7 +1132,8 @@ repeat(PG_FUNCTION_ARGS) slen = VARSIZE_ANY_EXHDR(string); if (unlikely(pg_mul_s32_overflow(count, slen, &tlen)) || - unlikely(pg_add_s32_overflow(tlen, VARHDRSZ, &tlen))) + unlikely(pg_add_s32_overflow(tlen, VARHDRSZ, &tlen)) || + unlikely(!AllocSizeIsValid(tlen))) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("requested length too large"))); From ce21a36cf837083cb41521aff035d9c1310f0f66 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Thu, 26 May 2022 12:54:33 -0400 Subject: [PATCH 719/772] In CREATE FOREIGN TABLE syntax synopsis, fix partitioning stuff. Foreign tables can be partitioned, but previous documentation commits left the syntax synopsis both incomplete and incorrect. Justin Pryzby and Amit Langote Discussion: http://postgr.es/m/20220521130922.GX19626@telsasoft.com --- doc/src/sgml/ref/create_foreign_table.sgml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/create_foreign_table.sgml b/doc/src/sgml/ref/create_foreign_table.sgml index b374d8645d..6b208c4848 100644 --- a/doc/src/sgml/ref/create_foreign_table.sgml +++ b/doc/src/sgml/ref/create_foreign_table.sgml @@ -35,7 +35,8 @@ CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name { column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ] | table_constraint } [, ... ] -) ] partition_bound_spec +) ] +{ FOR VALUES partition_bound_spec | DEFAULT } SERVER server_name [ OPTIONS ( option 'value' [, ... ] ) ] @@ -52,6 +53,13 @@ CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name [ CONSTRAINT constraint_name ] CHECK ( expression ) [ NO INHERIT ] + +and partition_bound_spec is: + +IN ( partition_bound_expr [, ...] ) | +FROM ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) + TO ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) | +WITH ( MODULUS numeric_literal, REMAINDER numeric_literal ) From 2b65de7fc296bb5060c8d4ae8cb680f71364fbe0 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 26 May 2022 14:14:05 -0400 Subject: [PATCH 720/772] Remove misguided SSL key file ownership check in libpq. Commits a59c79564 et al. tried to sync libpq's SSL key file permissions checks with what we've used for years in the backend. We did not intend to create any new failure cases, but it turns out we did: restricting the key file's ownership breaks cases where the client is allowed to read a key file despite not having the identical UID. In particular a client running as root used to be able to read someone else's key file; and having seen that I suspect that there are other, less-dubious use cases that this restriction breaks on some platforms. We don't really need an ownership check, since if we can read the key file despite its having restricted permissions, it must have the right ownership --- under normal conditions anyway, and the point of this patch is that any additional corner cases where that works should be deemed allowable, as they have been historically. Hence, just drop the ownership check, and rearrange the permissions check to get rid of its faulty assumption that geteuid() can't be zero. (Note that the comparable backend-side code doesn't have to cater for geteuid() == 0, since the server rejects that very early on.) This does have the end result that the permissions safety check used for a root user's private key file is weaker than that used for anyone else's. While odd, root really ought to know what she's doing with file permissions, so I think this is acceptable. Per report from Yogendra Suralkar. Like the previous patch, back-patch to all supported branches. Discussion: https://postgr.es/m/MW3PR15MB3931DF96896DC36D21AFD47CA3D39@MW3PR15MB3931.namprd15.prod.outlook.com --- src/backend/libpq/be-secure-common.c | 5 ++-- src/interfaces/libpq/fe-secure-openssl.c | 34 ++++++++++++------------ 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/backend/libpq/be-secure-common.c b/src/backend/libpq/be-secure-common.c index 7a9de524db..2719ce1403 100644 --- a/src/backend/libpq/be-secure-common.c +++ b/src/backend/libpq/be-secure-common.c @@ -160,9 +160,10 @@ check_ssl_key_file_permissions(const char *ssl_key_file, bool isServerStart) * allow read access through either our gid or a supplementary gid that * allows us to read system-wide certificates. * - * Note that similar checks are performed in + * Note that roughly similar checks are performed in * src/interfaces/libpq/fe-secure-openssl.c so any changes here may need - * to be made there as well. + * to be made there as well. The environment is different though; this + * code can assume that we're not running as root. * * Ideally we would do similar permissions checks on Windows, but it is * not clear how that would work since Unix-style permissions may not be diff --git a/src/interfaces/libpq/fe-secure-openssl.c b/src/interfaces/libpq/fe-secure-openssl.c index 42d8d4616e..8117cbd40f 100644 --- a/src/interfaces/libpq/fe-secure-openssl.c +++ b/src/interfaces/libpq/fe-secure-openssl.c @@ -1373,31 +1373,31 @@ initialize_SSL(PGconn *conn) } /* - * Refuse to load key files owned by users other than us or root, and - * require no public access to the key file. If the file is owned by - * us, require mode 0600 or less. If owned by root, require 0640 or - * less to allow read access through either our gid or a supplementary - * gid that allows us to read system-wide certificates. + * Refuse to load world-readable key files. We accept root-owned + * files with mode 0640 or less, so that we can access system-wide + * certificates if we have a supplementary group membership that + * allows us to read 'em. For files with non-root ownership, require + * mode 0600 or less. We need not check the file's ownership exactly; + * if we're able to read it despite it having such restrictive + * permissions, it must have the right ownership. * - * Note that similar checks are performed in + * Note: be very careful about tightening these rules. Some people + * expect, for example, that a client process running as root should + * be able to use a non-root-owned key file. + * + * Note that roughly similar checks are performed in * src/backend/libpq/be-secure-common.c so any changes here may need - * to be made there as well. + * to be made there as well. However, this code caters for the case + * of current user == root, while that code does not. * * Ideally we would do similar permissions checks on Windows, but it * is not clear how that would work since Unix-style permissions may * not be available. */ #if !defined(WIN32) && !defined(__CYGWIN__) - if (buf.st_uid != geteuid() && buf.st_uid != 0) - { - appendPQExpBuffer(&conn->errorMessage, - libpq_gettext("private key file \"%s\" must be owned by the current user or root\n"), - fnbuf); - return -1; - } - - if ((buf.st_uid == geteuid() && buf.st_mode & (S_IRWXG | S_IRWXO)) || - (buf.st_uid == 0 && buf.st_mode & (S_IWGRP | S_IXGRP | S_IRWXO))) + if (buf.st_uid == 0 ? + buf.st_mode & (S_IWGRP | S_IXGRP | S_IRWXO) : + buf.st_mode & (S_IRWXG | S_IRWXO)) { appendPQExpBuffer(&conn->errorMessage, libpq_gettext("private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root\n"), From 3e9abd2eb1b1f6863250f060290f514f30ce8044 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Fri, 27 May 2022 10:37:58 +1200 Subject: [PATCH 721/772] Teach remove_unused_subquery_outputs about window run conditions 9d9c02ccd added code to allow the executor to take shortcuts when quals on monotonic window functions guaranteed that once the qual became false it could never become true again. When possible, baserestrictinfo quals are converted to become these quals, which we call run conditions. Unfortunately, in 9d9c02ccd, I forgot to update remove_unused_subquery_outputs to teach it about these run conditions. This could cause a WindowFunc column which was unused in the target list but referenced by an upper-level WHERE clause to be removed from the subquery when the qual in the WHERE clause was converted into a window run condition. Because of this, the entire WindowClause would be removed from the query resulting in additional rows making it into the resultset when they should have been filtered out by the WHERE clause. Here we fix this by recording which target list items in the subquery have run conditions. That gets passed along to remove_unused_subquery_outputs to tell it not to remove these items from the target list. Bug: #17495 Reported-by: Jeremy Evans Reviewed-by: Richard Guo Discussion: https://postgr.es/m/17495-7ffe2fa0b261b9fa@postgresql.org --- src/backend/optimizer/path/allpaths.c | 50 +++++++++++++++++++++------ src/backend/parser/parse_clause.c | 1 + src/test/regress/expected/window.out | 19 ++++++++++ src/test/regress/sql/window.sql | 10 ++++++ 4 files changed, 69 insertions(+), 11 deletions(-) diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 7ac116a791..e9342097e5 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -142,7 +142,8 @@ static void subquery_push_qual(Query *subquery, RangeTblEntry *rte, Index rti, Node *qual); static void recurse_push_qual(Node *setOp, Query *topquery, RangeTblEntry *rte, Index rti, Node *qual); -static void remove_unused_subquery_outputs(Query *subquery, RelOptInfo *rel); +static void remove_unused_subquery_outputs(Query *subquery, RelOptInfo *rel, + Bitmapset *extra_used_attrs); /* @@ -2177,14 +2178,16 @@ has_multiple_baserels(PlannerInfo *root) * the run condition will handle all of the required filtering. * * Returns true if 'opexpr' was found to be useful and was added to the - * WindowClauses runCondition. We also set *keep_original accordingly. + * WindowClauses runCondition. We also set *keep_original accordingly and add + * 'attno' to *run_cond_attrs offset by FirstLowInvalidHeapAttributeNumber. * If the 'opexpr' cannot be used then we set *keep_original to true and * return false. */ static bool find_window_run_conditions(Query *subquery, RangeTblEntry *rte, Index rti, AttrNumber attno, WindowFunc *wfunc, OpExpr *opexpr, - bool wfunc_left, bool *keep_original) + bool wfunc_left, bool *keep_original, + Bitmapset **run_cond_attrs) { Oid prosupport; Expr *otherexpr; @@ -2356,6 +2359,9 @@ find_window_run_conditions(Query *subquery, RangeTblEntry *rte, Index rti, wclause->runCondition = lappend(wclause->runCondition, newexpr); + /* record that this attno was used in a run condition */ + *run_cond_attrs = bms_add_member(*run_cond_attrs, + attno - FirstLowInvalidHeapAttributeNumber); return true; } @@ -2369,13 +2375,17 @@ find_window_run_conditions(Query *subquery, RangeTblEntry *rte, Index rti, * WindowClause as a 'runCondition' qual. These, when present, allow * some unnecessary work to be skipped during execution. * + * 'run_cond_attrs' will be populated with all targetlist resnos of subquery + * targets (offset by FirstLowInvalidHeapAttributeNumber) that we pushed + * window quals for. + * * Returns true if the caller still must keep the original qual or false if * the caller can safely ignore the original qual because the WindowAgg node * will use the runCondition to stop returning tuples. */ static bool check_and_push_window_quals(Query *subquery, RangeTblEntry *rte, Index rti, - Node *clause) + Node *clause, Bitmapset **run_cond_attrs) { OpExpr *opexpr = (OpExpr *) clause; bool keep_original = true; @@ -2403,7 +2413,8 @@ check_and_push_window_quals(Query *subquery, RangeTblEntry *rte, Index rti, WindowFunc *wfunc = (WindowFunc *) tle->expr; if (find_window_run_conditions(subquery, rte, rti, tle->resno, wfunc, - opexpr, true, &keep_original)) + opexpr, true, &keep_original, + run_cond_attrs)) return keep_original; } @@ -2415,7 +2426,8 @@ check_and_push_window_quals(Query *subquery, RangeTblEntry *rte, Index rti, WindowFunc *wfunc = (WindowFunc *) tle->expr; if (find_window_run_conditions(subquery, rte, rti, tle->resno, wfunc, - opexpr, false, &keep_original)) + opexpr, false, &keep_original, + run_cond_attrs)) return keep_original; } @@ -2444,6 +2456,7 @@ set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel, pushdown_safety_info safetyInfo; double tuple_fraction; RelOptInfo *sub_final_rel; + Bitmapset *run_cond_attrs = NULL; ListCell *lc; /* @@ -2526,7 +2539,8 @@ set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel, * it might be useful to use for the WindowAgg's runCondition. */ if (!subquery->hasWindowFuncs || - check_and_push_window_quals(subquery, rte, rti, clause)) + check_and_push_window_quals(subquery, rte, rti, clause, + &run_cond_attrs)) { /* * subquery has no window funcs or the clause is not a @@ -2545,9 +2559,11 @@ set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel, /* * The upper query might not use all the subquery's output columns; if - * not, we can simplify. + * not, we can simplify. Pass the attributes that were pushed down into + * WindowAgg run conditions to ensure we don't accidentally think those + * are unused. */ - remove_unused_subquery_outputs(subquery, rel); + remove_unused_subquery_outputs(subquery, rel, run_cond_attrs); /* * We can safely pass the outer tuple_fraction down to the subquery if the @@ -3945,16 +3961,28 @@ recurse_push_qual(Node *setOp, Query *topquery, * compute expressions, but because deletion of output columns might allow * optimizations such as join removal to occur within the subquery. * + * extra_used_attrs can be passed as non-NULL to mark any columns (offset by + * FirstLowInvalidHeapAttributeNumber) that we should not remove. This + * parameter is modifed by the function, so callers must make a copy if they + * need to use the passed in Bitmapset after calling this function. + * * To avoid affecting column numbering in the targetlist, we don't physically * remove unused tlist entries, but rather replace their expressions with NULL * constants. This is implemented by modifying subquery->targetList. */ static void -remove_unused_subquery_outputs(Query *subquery, RelOptInfo *rel) +remove_unused_subquery_outputs(Query *subquery, RelOptInfo *rel, + Bitmapset *extra_used_attrs) { - Bitmapset *attrs_used = NULL; + Bitmapset *attrs_used; ListCell *lc; + /* + * Just point directly to extra_used_attrs. No need to bms_copy as none of + * the current callers use the Bitmapset after calling this function. + */ + attrs_used = extra_used_attrs; + /* * Do nothing if subquery has UNION/INTERSECT/EXCEPT: in principle we * could update all the child SELECTs' tlists, but it seems not worth the diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index 249255b65f..c655d188c7 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -2831,6 +2831,7 @@ transformWindowDefinitions(ParseState *pstate, rangeopfamily, rangeopcintype, &wc->endInRangeFunc, windef->endOffset); + wc->runCondition = NIL; wc->winref = winref; result = lappend(result, wc); diff --git a/src/test/regress/expected/window.out b/src/test/regress/expected/window.out index d78b4c463c..433a0bb025 100644 --- a/src/test/regress/expected/window.out +++ b/src/test/regress/expected/window.out @@ -3589,6 +3589,25 @@ WHERE rn < 3; 3 | sales | 2 (6 rows) +-- ensure that "unused" subquery columns are not removed when the column only +-- exists in the run condition +EXPLAIN (COSTS OFF) +SELECT empno, depname FROM + (SELECT empno, + depname, + row_number() OVER (PARTITION BY depname ORDER BY empno) rn + FROM empsalary) emp +WHERE rn < 3; + QUERY PLAN +------------------------------------------------------------ + Subquery Scan on emp + -> WindowAgg + Run Condition: (row_number() OVER (?) < 3) + -> Sort + Sort Key: empsalary.depname, empsalary.empno + -> Seq Scan on empsalary +(6 rows) + -- likewise with count(empno) instead of row_number() EXPLAIN (COSTS OFF) SELECT * FROM diff --git a/src/test/regress/sql/window.sql b/src/test/regress/sql/window.sql index 967b9413de..a504e46e40 100644 --- a/src/test/regress/sql/window.sql +++ b/src/test/regress/sql/window.sql @@ -1121,6 +1121,16 @@ SELECT * FROM FROM empsalary) emp WHERE rn < 3; +-- ensure that "unused" subquery columns are not removed when the column only +-- exists in the run condition +EXPLAIN (COSTS OFF) +SELECT empno, depname FROM + (SELECT empno, + depname, + row_number() OVER (PARTITION BY depname ORDER BY empno) rn + FROM empsalary) emp +WHERE rn < 3; + -- likewise with count(empno) instead of row_number() EXPLAIN (COSTS OFF) SELECT * FROM From f1431f3bffa00962ae8debb98a750ed2fb09fa3b Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 28 May 2022 12:12:40 +0900 Subject: [PATCH 722/772] Handle NULL for short descriptions of custom GUC variables If a short description is specified as NULL in one of the various DefineCustomXXXVariable() functions available to external modules to define a custom parameter, SHOW ALL would crash. This change teaches SHOW ALL to properly handle NULL short descriptions, as well as any code paths that manipulate it, to gain in flexibility. Note that help_config.c was already able to do that, when describing a set of GUCs for postgres --describe-config. Author: Steve Chavez Reviewed by: Nathan Bossart, Andres Freund, Michael Paquier, Tom Lane Discussion: https://postgr.es/m/CAGRrpzY6hO-Kmykna_XvsTv8P2DshGiU6G3j8yGao4mk0CqjHA%40mail.gmail.com Backpatch-through: 10 --- src/backend/utils/misc/guc.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 8e9b71375c..55d41ae7d6 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -9780,7 +9780,16 @@ ShowAllGUCConfig(DestReceiver *dest) isnull[1] = true; } - values[2] = PointerGetDatum(cstring_to_text(conf->short_desc)); + if (conf->short_desc) + { + values[2] = PointerGetDatum(cstring_to_text(conf->short_desc)); + isnull[2] = false; + } + else + { + values[2] = PointerGetDatum(NULL); + isnull[2] = true; + } /* send it to dest */ do_tup_output(tstate, values, isnull); @@ -9792,7 +9801,8 @@ ShowAllGUCConfig(DestReceiver *dest) pfree(setting); pfree(DatumGetPointer(values[1])); } - pfree(DatumGetPointer(values[2])); + if (conf->short_desc) + pfree(DatumGetPointer(values[2])); } end_tup_output(tstate); @@ -10002,7 +10012,7 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow) values[3] = _(config_group_names[conf->group]); /* short_desc */ - values[4] = _(conf->short_desc); + values[4] = conf->short_desc != NULL ? _(conf->short_desc) : NULL; /* extra_desc */ values[5] = conf->long_desc != NULL ? _(conf->long_desc) : NULL; From b4529005fd387e863bfa9eb863629b1183c0449c Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 28 May 2022 15:02:08 +0900 Subject: [PATCH 723/772] Revert "Add single-item cache when looking at topmost XID of a subtrans XID" This reverts commit 06f5295 as per issues with this approach, both in terms of efficiency impact and stability. First, contrary to the single-item cache for transaction IDs in transam.c, the cache may finish by not be hit for a long time, and without an invalidation mechanism to clear it, it would cause inconsistent results on wraparound for example. Second, the use of SubTransGetTopmostTransaction() for the caching has a limited impact on performance. SubTransGetParent() could have more impact, though the benchmarking of the single-item approach still needs to be proved, particularly under the conditions where SLRU lookups are stressed in parallel with overflowed snapshots (aka more than 64 subxids generated, for example). After discussion with Andres Freund. Discussion: https://postgr.es/m/20220524235250.gtt3uu5zktfkr4hv@alap3.anarazel.de --- src/backend/access/transam/subtrans.c | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/backend/access/transam/subtrans.c b/src/backend/access/transam/subtrans.c index 7240454ca4..66d3548155 100644 --- a/src/backend/access/transam/subtrans.c +++ b/src/backend/access/transam/subtrans.c @@ -54,14 +54,6 @@ #define TransactionIdToPage(xid) ((xid) / (TransactionId) SUBTRANS_XACTS_PER_PAGE) #define TransactionIdToEntry(xid) ((xid) % (TransactionId) SUBTRANS_XACTS_PER_PAGE) -/* - * Single-item cache for results of SubTransGetTopmostTransaction(). It's - * worth having such a cache because we frequently find ourselves repeatedly - * checking the same XID, for example when scanning a table just after a - * bulk insert, update, or delete. - */ -static TransactionId cachedFetchSubXid = InvalidTransactionId; -static TransactionId cachedFetchTopmostXid = InvalidTransactionId; /* * Link to shared-memory data structures for SUBTRANS control @@ -163,13 +155,6 @@ SubTransGetTopmostTransaction(TransactionId xid) /* Can't ask about stuff that might not be around anymore */ Assert(TransactionIdFollowsOrEquals(xid, TransactionXmin)); - /* - * Before going to the subtrans log, check our single item cache to see if - * we know the result from a previous/recent request. - */ - if (TransactionIdEquals(xid, cachedFetchSubXid)) - return cachedFetchTopmostXid; - while (TransactionIdIsValid(parentXid)) { previousXid = parentXid; @@ -189,9 +174,6 @@ SubTransGetTopmostTransaction(TransactionId xid) Assert(TransactionIdIsValid(previousXid)); - cachedFetchSubXid = xid; - cachedFetchTopmostXid = previousXid; - return previousXid; } From 0107855b1480d381f28f935e279ec3b64f410ef7 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 28 May 2022 13:08:19 -0700 Subject: [PATCH 724/772] Align stats_fetch_consistency definition with guc.c default. Somewhat embarrassing oversight in 98f897339b0. Does not have a functional impact, but is unnecessarily confusing. Reported-By: Michael Paquier Discussion: https://postgr.es/m/Yo2351qVYqd/bJws@paquier.xyz --- src/backend/utils/activity/pgstat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index 05f2d9e9bd..ad5cf6fb91 100644 --- a/src/backend/utils/activity/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -183,7 +183,7 @@ static inline bool pgstat_is_kind_valid(int ikind); */ bool pgstat_track_counts = false; -int pgstat_fetch_consistency = PGSTAT_FETCH_CONSISTENCY_NONE; +int pgstat_fetch_consistency = PGSTAT_FETCH_CONSISTENCY_CACHE; /* ---------- From cfce3be818ab6778cf2c314ff4f6f398b74f75eb Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Sun, 29 May 2022 16:33:26 +1200 Subject: [PATCH 725/772] Doc: Document pg_stat_recovery_prefetch.stats_reset. This column was missing from the table that describes the new view. Author: Shinoda, Noriyoshi (PN Japan FSIP) Discussion: https://postgr.es/m/DM4PR84MB173401C19A0EB9B1CAAB197CEED29@DM4PR84MB1734.NAMPRD84.PROD.OUTLOOK.COM --- doc/src/sgml/monitoring.sgml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 56d9b375ec..4549c2560e 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -3009,6 +3009,17 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i + + + + stats_reset timestamp with time zone + + + Time at which these statistics were last reset + + + + From f6b6a8fb94f115c5197fbba0c004a262dc710134 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 29 May 2022 13:25:21 -0400 Subject: [PATCH 726/772] Doc: fix missing/bogus documentation of range_intersect_agg(). The form taking anymultirange had not been documented. This was fixed in HEAD in b21c4cf95, but that should have been back-patched to v14 since the function was added there. Do so now. Also, the form taking anyrange was incorrectly documented as returning anymultirange, when it returns anyrange. Remove b21c4cf95 from the v15 release notes, since it no longer qualifies as new-in-v15. Noted by Shay Rojansky. Discussion: https://postgr.es/m/CADT4RqAktzP7t6SFf0Xqm9YhahzvsmxFbzXe-gFOd=+_CHm0JA@mail.gmail.com --- doc/src/sgml/func.sgml | 2 +- doc/src/sgml/release-15.sgml | 11 ----------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index e52e2d953b..db3147d1c4 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -21067,7 +21067,7 @@ SELECT NULLIF(value, '(none)') ... range_intersect_agg ( value anyrange ) - anymultirange + anyrange range_intersect_agg ( value diff --git a/doc/src/sgml/release-15.sgml b/doc/src/sgml/release-15.sgml index 8390578a9a..b9aba1df76 100644 --- a/doc/src/sgml/release-15.sgml +++ b/doc/src/sgml/release-15.sgml @@ -2489,17 +2489,6 @@ Add documentation for pg_encoding_to_char() and pg_char_to_encoding() (Ian Lawre - - - - -Add documentation for range_intersect_agg(anymultirange) (Paul Jungwirth) - - - - - - -Remove PUBLIC 'creation' permission on the 'public' schema (Noah Misch) - + + + Remove PUBLIC creation permission on the public schema + (Noah Misch) + - -This is a change in the default for newly-created databases in existing clusters and for new clusters; usage permissions on the 'public' schema has not been changed. Databases restored from previous -Postgres releases will be restored with their current permissions. Users wishing to have the old permissions on new objects will need to grant 'create' permission for PUBLIC on the 'public' schema; this -change can be made on 'template1' to cause all new databases to have these permissions. template1 permissions for pg_dumpall and pg_upgrade? - - + + This is a change in the default for newly-created databases in existing + clusters and for new clusters; USAGE permissions on + the public schema has not been changed. Databases + restored from previous Postgres releases will be restored with their + current permissions. Users wishing to have the old permissions on + new objects will need to grant CREATE permission + for PUBLIC on the public schema; + this change can be made on template1 to cause all new + databases to have these permissions. template1 + permissions for pg_dumpall and + pg_upgrade? + + - - -Change the owner of the public schema to pg_database_owner (Noah Misch) - + + + Change the owner of the public schema to + pg_database_owner (Noah Misch) + - -Previously it was the literal user name of the database owner. Databases restored from previous Postgres releases will be restored with their current owner specification. - - + + Previously it was the literal user name of the database owner. Databases + restored from previous Postgres releases will be restored with their + current owner specification. + + - - -Remove long-deprecated exclusive backup mode (David Steele, Nathan Bossart) - + + + Remove long-deprecated exclusive backup + mode (David Steele, Nathan Bossart) + - -If the database server stops abruptly while in this mode, the server could fail to start. The non-exclusive backup mode requires a continuous database connection during the -backup. Functions pg_start_backup()/pg_stop_backup() have been renamed to pg_backup_start()/pg_backup_stop(), and the functions pg_backup_start_time() and pg_is_in_backup() have been removed. - - + + If the database server stops abruptly while in this mode, the + server could fail to start. The non-exclusive backup mode requires + a continuous database connection during the backup. Functions + pg_start_backup()/pg_stop_backup() + have been renamed to + pg_backup_start()/pg_backup_stop(), + and the functions pg_backup_start_time() and + pg_is_in_backup() have been removed. + + - - -Increase hash_mem_multiplier default to 2.0 (Peter Geoghegan) - + + + Increase hash_mem_multiplier + default to 2.0 (Peter Geoghegan) + - -This allows query hash operations to use double the amount of work_mem memory as other operations. - - + + This allows query hash operations to use double the amount of work_mem memory as + other operations. + + - - -Remove server-side language plpython2u and generic Python language plpythonu (Andres Freund) - - + + + Remove server-side language plpython2u and generic Python + language plpythonu (Andres Freund) + + - - -Mark the interval output function as stable, not immutable, since it depends on IntervalStyle (Tom Lane) - + + + Mark the interval + output function as stable, not immutable, since it depends on IntervalStyle + (Tom Lane) + - -This will cause the creation of indexes relying on the text output of interval values to fail. - - + + This will cause the creation of indexes relying on the text output of + interval values to fail. + + - - -Generate an error if array_to_tsvector() is passed an empty array element (Jean-Christophe Arnu) - + + + Generate an error if array_to_tsvector() + is passed an empty array element (Jean-Christophe Arnu) + - -This is prohibited because lexemes should never be empty. Users of previous Postgres releases should verify that no empty lexemes are stored because they can lead to dump/restore failures and inconsistent -results. - - + + This is prohibited because lexemes should never be empty. Users of + previous Postgres releases should verify that no empty lexemes are stored + because they can lead to dump/restore failures and inconsistent results. + + - - -Generate an error when char() is supplied with a negative argument (Peter Eisentraut) - - + + + Generate an error when chr() is + supplied with a negative argument (Peter Eisentraut) + + - - -Prevent Unicode zero-length identifiers, e.g., U&"" (Peter Eisentraut) - + + + Prevent Unicode zero-length identifiers, e.g., U&"" + (Peter Eisentraut) + - -Non-Unicode zero-length identifiers were already prevented. - - + + Non-Unicode zero-length identifiers were already prevented. + + - - -Remove pg_dump's option since all supported server versions support synchronized snapshots (Tom Lane) - - + + + Remove pg_dump's + option since all supported + server versions support synchronized snapshots (Tom Lane) + + - - -Prevent CREATE OR REPLACE VIEW from changing the collation of an output column (Tom Lane) - - + + + Prevent CREATE OR REPLACE + VIEW from changing the collation of an output column + (Tom Lane) + + - - -Prevent numeric literals from having non-numeric trailing characters (Peter Eisentraut) - + + + Prevent numeric + literals from having non-numeric trailing characters (Peter + Eisentraut) + - -Previously literals like '123abc' would be interpreted as '123' and 'abc'. - - + + Previously literals like 123abc would be interpreted + as 123 and abc. + + - - -Adjust JSON numeric literal processing to match the SQL/JSON-standard (Peter Eisentraut) - + + + Adjust JSON + numeric literal processing to match the + SQL/JSON-standard (Peter Eisentraut) + - -This accepts numeric formats like ".1" and "1.", and disallows trailing junk after numeric literals, like "1.type()". - - + + This accepts numeric formats like .1 and + 1., and disallows trailing junk after numeric literals, + like 1.type(). + + - - -Improve consistency of interval parsing with trailing periods (Tom Lane) - + + + Improve consistency of interval + parsing with trailing periods (Tom Lane) + - -Some platforms disallowed trailing periods. - - + + Some platforms disallowed trailing periods. + + - - -When specifying fractional interval values in units greater than months, round to the nearest month (Bruce Momjian) - + + + When specifying fractional interval values in units greater than months, + round to the nearest month (Bruce Momjian) + - -For example, report '1.99 years' as '2 years', not '1 year 11 months'. - - + + For example, report 1.99 years as 2 + years, not 1 year 11 months. + + - - -Detect integer overflow in interval justification functions (Joe Koshakow) - + + + Detect integer overflow in interval justification functions + (Joe Koshakow) + - -Specifically, functions justify_interval(), justify_hours(), and justify_days() are affected. - - + + Specifically, functions justify_interval(), + justify_hours(), and + justify_days() are affected. + + - - -Remove the default ADMIN OPTION privilege a login role has on its own role membership (Robert Haas) - + + + Remove the default ADMIN + OPTION privilege a login role has on its own role + membership (Robert Haas) + - -Previously, login roles could add/remove members of its own role, even without ADMIN OPTION privilege. - - + + Previously, login roles could add/remove members of its own role, even + without ADMIN OPTION privilege. + + - - -Allow logical replication to run as the owner of the subscription (Mark Dilger) - + + + Allow logical replication + to run as the owner of the subscription (Mark Dilger) + - -Because row-level security policies are not checked, only superusers, roles with bypassrls, and table owners can replicate into tables with row-level security policies. - - + + Because row-level security policies are not checked, only superusers, + roles with bypassrls, and table owners can replicate + into tables with row-level security policies. + + - - -Prevent UPDATE and DELETE logical replication operations on tables where the subscription owner does not have SELECT permission on the table (Jeff Davis) - + + + Prevent UPDATE and DELETE logical replication operations on + tables where the subscription owner does not have SELECT + permission on the table (Jeff Davis) + - -UPDATE and DELETE perform SELECT, so require the subscription owner to have table SELECT permission. - - + + UPDATE and DELETE perform + SELECT, so require the subscription owner to have + table SELECT permission. + + - - -When EXPLAIN references the temporary object schema, refer to it as pg_temp (Amul Sul) - + + + When EXPLAIN + references the temporary object schema, refer to it as + pg_temp (Amul Sul) + - -Previously the actual schema name was used. - - + + Previously the actual schema name was used. + + - - -Modify SPI's SPI_commit() and SPI_commit_and_chain() to automatically start a new transaction at completion (Peter Eisentraut, Tom Lane) - + + + Modify SPI's + SPI_commit() and + SPI_commit_and_chain() to automatically start a new + transaction at completion (Peter Eisentraut, Tom Lane) + - -BACKPATCHED? - - + + BACKPATCHED? + + - - -Fix pg_statio_all_tables to sum values for the rare case of TOAST tables with multiple indexes (Andrei Zubkov) - + + + Fix pg_statio_all_tables + to sum values for the rare case of TOAST tables with + multiple indexes (Andrei Zubkov) + - -Previously such cases would have one row for each index. - - + + Previously such cases would have one row for each index. + + - - -Disallow setting of server variables matching the prefixes of installed extension (Florin Irion, Tom Lane) - + + + Disallow setting of server variables + matching the prefixes of installed extension (Florin Irion, Tom Lane) + - -This also deletes any matching server variables during extension load. - - + + This also deletes any matching server variables during extension load. + + - - -Remove unnecessary server variable stats_temp_directory (Andres Freund, Kyotaro Horiguchi) - - + + + Remove unnecessary server variable stats_temp_directory + (Andres Freund, Kyotaro Horiguchi) + + - - -Improve the algorithm used to compute random() (Fabien Coelho) - + + + Improve the algorithm used to compute random() + (Fabien Coelho) + - -This will cause random() to differ from what was emitted by prior versions for the same seed values. - - + + This will cause random() to differ from what was + emitted by prior versions for the same seed values. + + - - -Reduce casting of constants in postgres_fdw queries (Dian Fay) - + + + Reduce casting of constants in postgres_fdw queries (Dian Fay) + - -If column types were mismatched between local and remote databases, such casting could cause errors. - - + + If column types were mismatched between local and remote databases, + such casting could cause errors. + + - - -Remove contrib/xml2's function xml_is_well_formed() (Tom Lane) - + + + Remove xml2's function + xml_is_well_formed() (Tom Lane) + - -This function has been implemented in the core backend since Postgres 9.1. - - + + This function has been implemented in the core backend since Postgres 9.1. + + - - -Allow CustomScan providers to indicate if they support projections (Sven Klemm) - + + + Allow custom scan provders to indicate + if they support projections (Sven Klemm) + - -The default is now that custom scan providers can't support projections, so they need to be updated for this release. - - + + The default is now that custom scan providers can't support projections, + so they need to be updated for this release. + + @@ -462,11 +547,11 @@ The default is now that custom scan providers can't support projections, so they Changes - - Below you will find a detailed account of the changes between - PostgreSQL 15 and the previous major - release. - + + Below you will find a detailed account of the changes between + PostgreSQL 15 and the previous major + release. + Server @@ -478,44 +563,54 @@ Author: Peter Eisentraut 2022-02-14 [37851a8b8] Database-level collation version tracking --> - - -Record and check the collation of each database (Peter Eisentraut) - + + + Record and check the collation of each database (Peter Eisentraut) + - -This is designed to detect collation mismatches to avoid data corruption. Function pg_database_collation_actual_version() reports the underlying operating system collation version, and ALTER DATABASE ... -REFRESH sets the database to match the operating system collation version. DETAILS? - - + + This is designed to detect collation mismatches to avoid data corruption. + Function pg_database_collation_actual_version() + reports the underlying operating system collation version, and + ALTER DATABASE ... REFRESH sets the database to match + the operating system collation version. DETAILS? + + - - -Allow ICU collations to be set as the default for clusters and databases (Peter Eisentraut) - + + + Allow ICU collations to + be set as the default for clusters and databases (Peter Eisentraut) + - -Previously, ICU collations could only be specified in CREATE COLLATION and used with the COLLATE clause. - - + + Previously, ICU collations could only be + specified in CREATE + COLLATION and used with the COLLATE + clause. + + - - -Add system view pg_ident_file_mappings to report pg_ident.conf information (Julien Rouhaud) - - + + + Add system view pg_ident_file_mappings + to report pg_ident.conf information (Julien Rouhaud) + + - + <link linkend="ddl-partitioning">Partitioning</link> @@ -527,45 +622,55 @@ Author: David Rowley 2021-08-03 [475dbd0b7] Track a Bitmapset of non-pruned partitions in RelOptInfo --> - - -Improve planning time for queries referencing partitioned tables (David Rowley) - + + + Improve planning time for queries referencing partitioned tables (David + Rowley) + - -Specifically this helps if only a small number of the many partitions are relevant. - - + + Specifically this helps if only a small number of the many partitions + are relevant. + + - - -Allow ordered scans of partitions to avoid sorting in more cases (David Rowley) - + + + Allow ordered scans of partitions to avoid sorting in more cases (David + Rowley) + - -Previously, a partitioned table with a DEFAULT partition or a LIST partition containing multiple values could not be used for ordered partition scans. Now they can be used if these partitions are pruned. - - + + Previously, a partitioned table with a DEFAULT partition + or a LIST partition containing multiple values could + not be used for ordered partition scans. Now they can be used if these + partitions are pruned. + + - - -Improve foreign key behavior of updates on partitioned tables that move rows between partitions (Amit Langote) - + + + Improve foreign key behavior of updates on partitioned tables that move + rows between partitions (Amit Langote) + - -Previously, such updates ran delete actions on the source partition and insert actions on the target partition. PostgreSQL will now run update actions on the referenced partition root. - - + + Previously, such updates ran delete actions on the + source partition and insert actions on the target partition. + PostgreSQL will now run update actions on the + referenced partition root. + + - - -Allow CLUSTER on partitioned tables (Justin Pryzby) - - + + + Allow CLUSTER + on partitioned tables (Justin Pryzby) + + - - -Fix ALTER TRIGGER RENAME on partitioned tables to properly rename triggers an all partitions (Arne Roland, Álvaro Herrera) - + + + Fix ALTER TRIGGER + RENAME on partitioned tables to properly rename triggers + an all partitions (Arne Roland, Álvaro Herrera) + - -Also prohibit cloned triggers from being renamed. - - + + Also prohibit cloned triggers from being renamed. + + @@ -609,67 +717,79 @@ Author: Peter Geoghegan 2021-10-02 [2903f1404] Enable deduplication in system catalog indexes. --> - - -Enable system and TOAST btree indexes to efficiently store duplicates (Peter Geoghegan) - + + + Enable system and TOAST btree indexes to + efficiently store duplicates (Peter Geoghegan) + - -Previously de-duplication was disabled for these types of indexes. - - + + Previously de-duplication was disabled for these types of indexes. + + - - -Improve lookup performance of GiST indexes built using sorting (Aliaksandr Kalenik, Sergei Shoulbakov, Andrey Borodin) - - + + + Improve lookup performance of GiST indexes built using sorting + (Aliaksandr Kalenik, Sergei Shoulbakov, Andrey Borodin) + + - - -Prevent changes to columns only indexed by BRIN indexes from disabling HOT updates (Josef Simanek) - - + + + Prevent changes to columns only indexed by BRIN indexes from disabling + HOT updates (Josef Simanek) + + - - -Allow unique constraints and indexes to treat NULL values as not distinct (Peter Eisentraut) - + + + Allow unique constraints and indexes to treat NULL + values as not distinct (Peter Eisentraut) + - -Previously NULL values were always indexed as distinct values, but this can now be changed by creating constraints and indexes using UNIQUE NULLS NOT DISTINCT. - - + + Previously NULL values were always indexed as distinct + values, but this can now be changed by creating constraints and indexes + using UNIQUE NULLS NOT DISTINCT. + + - - -Allow ^@ and starts_with() to use btree indexes if using a C collation (Tom Lane) - + + + Allow ^@ + and starts_with() to use btree indexes if using a + C collation (Tom Lane) + - -Previously these could only use SP-GiST indexes. - - + + Previously these could only use SP-GiST indexes. + + @@ -685,45 +805,54 @@ Author: Tomas Vondra 2022-01-16 [269b532ae] Add stxdinherit flag to pg_statistic_ext_data --> - - -Allow extended statistics to record statistics for a parent with all its children (Tomas Vondra, Justin Pryzby) - + + + Allow extended statistics + to record statistics for a parent with all its children (Tomas Vondra, + Justin Pryzby) + - -Regular statistics already tracked parent and parent/all-children statistics separately. - - + + Regular statistics already tracked parent and parent/all-children + statistics separately. + + - - -Allow GROUP BY sorting to optimize column order (Dmitry Dolgov, Teodor Sigaev, Tomas Vondra) - + + + Allow GROUP BY + sorting to optimize column order (Dmitry Dolgov, Teodor Sigaev, Tomas + Vondra) + - -This optimization can be disabled using the server variable enable_group_by_reordering. - - + + This optimization can be disabled using the server variable enable_group_by_reordering. + + - - -Add server variable recursive_worktable_factor to allow the user to specify the expected recursive query worktable size (Simon Riggs) - + + + Add server variable recursive_worktable_factor + to allow the user to specify the expected recursive query worktable size + (Simon Riggs) + - -WHAT IS A WORKTABLE? NOT DEFINED. - - + + WHAT IS A WORKTABLE? NOT DEFINED. + + @@ -739,30 +868,35 @@ Author: David Rowley 2021-07-07 [29f45e299] Use a hash table to speed up NOT IN(values) --> - - -Allow hash lookup for NOT IN clauses with many constants (David Rowley, James Coleman) - + + + Allow hash lookup for NOT + IN clauses with many constants (David Rowley, James + Coleman) + - -Previously the code always sequentially scanned the list of values. - - + + Previously the code always sequentially scanned the list of values. + + - - -Improve validation of UTF-8 text (even if only ASCII) by processing 16 bytes at a time (John Naylor, Heikki Linnakangas) - + + + Improve validation of UTF-8 text (even if only + ASCII) by processing 16 bytes at a time (John Naylor, + Heikki Linnakangas) + - -This will improve text-heavy operations like COPY FROM. - - + + This will improve text-heavy operations like COPY FROM. + + - - -Improve performance for sorts that exceed work_mem (Heikki Linnakangas) - + + + Improve performance for sorts that exceed work_mem (Heikki + Linnakangas) + - -Specifically, switch to a batch sorting algorithm that uses more output streams internally. - - + + Specifically, switch to a batch sorting algorithm that uses more output + streams internally. + + - - -Improve performance and reduce memory consumption of in-memory sorts (Ronan Dunklau, David Rowley, Thomas Munro, John Naylor) - - + + + Improve performance and reduce memory consumption of in-memory sorts + (Ronan Dunklau, David Rowley, Thomas Munro, John Naylor) + + - - -Allow WAL full page writes to use LZ4 and Zstandard compression (Andrey Borodin, Justin Pryzby) - + + + Allow WAL full + page writes to use LZ4 and Zstandard compression (Andrey Borodin, + Justin Pryzby) + - -This is controlled by the wal_compression server setting. - - + + This is controlled by the wal_compression + server setting. + + - - -Add direct I/O support to macOS (Thomas Munro) - + + + Add direct I/O support to macOS + (Thomas Munro) + - -This only works if max_wal_senders=0 and wal_level=minimal, and only for WAL. - - + + This only works if max_wal_senders=0 and + wal_level=minimal, and only for WAL. + + - - -Allow vacuum to be more aggressive in setting the oldest frozenxid (Peter Geoghegan) - - + + + Allow vacuum to be more aggressive + in setting the oldest frozenxid (Peter Geoghegan) + + - - -Allow a query referencing multiple foreign tables to perform parallel foreign table scans in more cases (Andrey Lepikhov, Etsuro Fujita) - - + + + Allow a query referencing multiple foreign + tables to perform parallel foreign table scans in more cases + (Andrey Lepikhov, Etsuro Fujita) + + - - -Improve the performance of window functions that use row_number(), rank(), and count() (David Rowley) - - + + + Improve the performance of window + functions that use row_number(), + rank(), and count() (David + Rowley) + + - - -Improve the performance of spinlocks on high-core-count ARM64 systems (Geoffrey Blake) - - + + + Improve the performance of spinlocks on high-core-count ARM64 systems + (Geoffrey Blake) + + @@ -886,16 +1037,22 @@ Author: Robert Haas 2021-12-13 [64da07c41] Default to log_checkpoints=on, log_autovacuum_min_durati --> - - -Enable default logging of checkpoints and slow autovacuum operations (Bharath Rupireddy) - + + + Enable default logging of checkpoints and slow autovacuum operations + (Bharath Rupireddy) + - -Specifically, this changes the default of log_checkpoints to on and log_autovacuum_min_duration to 10 minutes. This will cause idle servers to generate log output, which might cause problems on -resource-constrained servers with insufficient log file removal. The defaults should be changed in such cases. - - + + Specifically, this changes the default of log_checkpoints + to on and log_autovacuum_min_duration + to 10 minutes. This will cause idle servers to generate log output, which + might cause problems on resource-constrained servers with insufficient + log file removal. The defaults should be changed in such cases. + + - - -Generate periodic log message during slow server starts (Nitin Jadhav, Robert Haas) - + + + Generate periodic log message during slow server starts (Nitin Jadhav, + Robert Haas) + - -Messages report the cause of the delay. The time interval for notification is controlled by the new server variable log_startup_progress_interval. - - + + Messages report the cause of the delay. The time interval for + notification is controlled by the new server variable log_startup_progress_interval. + + - - -Store server-level statistics in shared memory (Kyotaro Horiguchi, Andres Freund, Melanie Plageman) - + + + Store server-level statistics + in shared memory (Kyotaro Horiguchi, Andres Freund, Melanie Plageman) + - -Previously this was updated via UDP packets, stored in the file system, and read by sessions. There is no longer a statistics collector process. - - + + Previously this was updated via UDP packets, stored in + the file system, and read by sessions. There is no longer a statistics + collector process. + + - - -Add additional information to VACUUM VERBOSE and autovacuum logging messages (Peter Geoghegan) - - + + + Add additional information to VACUUM VERBOSE and + autovacuum logging messages (Peter Geoghegan) + + - - -Add EXPLAIN (BUFFERS) output for temporary file block I/O (Masahiko Sawada) - - + + + Add EXPLAIN (BUFFERS) + output for temporary file block I/O (Masahiko Sawada) + + - - -Allow log output in JSON format (Sehrope Sarkuni, Michael Paquier) - + + + Allow log output in + JSON format (Sehrope Sarkuni, Michael Paquier) + - -The new setting is log_destination=jsonlog. - - + + The new setting is log_destination=jsonlog. + + - - -Allow pg_stat_reset_single_table_counters() to reset the counters of relations shared across all databases (B Sadhu, Prasad Patro) - - + + + Allow pg_stat_reset_single_table_counters() + to reset the counters of relations shared across all databases (B Sadhu, + Prasad Patro) + + - - -Add wait events for local shell commands (Fujii Masao) - + + + Add wait events for local shell + commands (Fujii Masao) + - -Specifically the new wait events are related to commands archive_command, archive_cleanup_command, restore_command and recovery_end_command. - - + + Specifically the new wait events are related to + commands archive_command, + archive_cleanup_command, + restore_command and + recovery_end_command. + + @@ -1012,90 +1186,108 @@ Author: Dean Rasheed 2022-03-22 [7faa5fc84] Add support for security invoker views. --> - - -Allow view access to be controlled by privileges of the view user (Christoph Heiss) - + + + Allow view access to be controlled + by privileges of the view user (Christoph Heiss) + - -Previously, view access could only be based on the view owner. - - + + Previously, view access could only be based on the view owner. + + - - -Allow members of the pg_write_server_files predefined role to perform server-side base backups (Dagfinn Ilmari Mannsåker) - + + + Allow members of the pg_write_server_files + predefined role to perform server-side base backups (Dagfinn Ilmari + Mannsåker) + - -Previously only the superusers could perform such backups. - - + + Previously only the superusers could perform such backups. + + - - -Allow GRANT to assign permission to change server variables via SET and ALTER SYSTEM (Mark Dilger) - + + + Allow GRANT to + assign permission to change server variables via SET + and ALTER SYSTEM (Mark Dilger) + - -New function has_parameter_privilege() reports on this privilege. - - + + New function has_parameter_privilege() reports on + this privilege. + + - - -Add predefined role pg_checkpointer that allows members to run CHECKPOINT (Jeff Davis) - + + + Add predefined role pg_checkpointer + that allows members to run CHECKPOINT (Jeff Davis) + - -Previously checkpoints could only be run by superusers. - - + + Previously checkpoints could only be run by superusers. + + - - -Allow members of the pg_read_all_stats predefined role to access the views pg_backend_memory_contexts and pg_shmem_allocations (Bharath Rupireddy) - + + + Allow members of the pg_read_all_stats + predefined role to access the views pg_backend_memory_contexts + and pg_shmem_allocations + (Bharath Rupireddy) + - -Previously these views could only be accessed by superusers. - - + + Previously these views could only be accessed by superusers. + + - - -Allow GRANT to assign permissions on pg_log_backend_memory_contexts() (Jeff Davis) - + + + Allow GRANT + to assign permissions on pg_log_backend_memory_contexts() + (Jeff Davis) + - -Previously this function could only be run by superusers. - - + + Previously this function could only be run by superusers. + + @@ -1113,11 +1305,13 @@ Author: Michael Paquier 2021-09-09 [3b231596c] Make shared_memory_size a preset option --> - - -Add server variable shared_memory_size to report the size of allocated shared memory (Nathan Bossart) - - + + + Add server variable shared_memory_size + to report the size of allocated shared memory (Nathan Bossart) + + - - -Add server variable shared_memory_size_in_huge_pages to report the number of huge memory pages required (Nathan Bossart) - + + + Add server variable shared_memory_size_in_huge_pages + to report the number of huge memory pages required (Nathan Bossart) + - -This is only supported on Linux. - - + + This is only supported on Linux. + + - - -Allow postgres -C to properly report runtime-computed values (Nathan Bossart) - - - -Previously runtime-computed values data_checksums, wal_segment_size, and data_directory_mode would report values that would not be accurate on the running server. However, this does not work on a running server. - - + + + Allow postgres -C + to properly report runtime-computed values (Nathan Bossart) + + + + Previously runtime-computed values data_checksums, + wal_segment_size, + and data_directory_mode + would report values that would not be accurate on the running server. + However, this does not work on a running server. + + @@ -1171,63 +1375,71 @@ Author: Robert Haas 2022-03-30 [51c0d186d] Allow parallel zstd compression when taking a base backu --> - - -Add support for LZ4 and Zstandard compression of server-side base backups (Jeevan Ladhe, Robert Haas) - - + + + Add support for LZ4 and Zstandard compression of server-side base backups (Jeevan Ladhe, Robert + Haas) + + - - -Run checkpointer and bgwriter during crash recovery (Thomas Munro) - - + + + Run checkpointer and bgwriter during crash recovery (Thomas Munro) + + - - -Allow WAL processing to pre-fetch needed file contents (Thomas Munro) - + + + Allow WAL processing to pre-fetch needed file contents + (Thomas Munro) + - -This is controlled by the server variable recovery_prefetch. - - + + This is controlled by the server variable recovery_prefetch. + + - - -Add server variable archive_library to specify the library to be called for archiving (Nathan Bossart) - + + + Add server variable archive_library + to specify the library to be called for archiving (Nathan Bossart) + - -Previously only shell commands could be called to perform archiving. - - + + Previously only shell commands could be called to perform archiving. + + - - -No longer require IDENTIFY_SYSTEM to be run before START_REPLICATION (Jeff Davis) - - + + + No longer require IDENTIFY_SYSTEM + to be run before START_REPLICATION (Jeff Davis) + + @@ -1243,16 +1455,20 @@ Author: Amit Kapila 2021-12-08 [1a2aaeb0d] Fix changing the ownership of ALL TABLES IN SCHEMA publi --> - - -Allow publication of all tables in a schema (Vignesh C, Hou Zhijie, Amit Kapila) - + + + Allow publication of all tables in a schema (Vignesh C, Hou Zhijie, + Amit Kapila) + - -For example, this syntax is now supported: CREATE PUBLICATION pub1 FOR ALL TABLES IN SCHEMA s1,s2; ALTER PUBLICATION supports a similar syntax. Tables added to the listed schemas in the future will also -be replicated. - - + + For example, this syntax is now supported: CREATE PUBLICATION pub1 + FOR ALL TABLES IN SCHEMA s1,s2; ALTER + PUBLICATION supports a similar syntax. Tables added to the + listed schemas in the future will also be replicated. + + - - -Allow publication content to be filtered using a WHERE clause (Hou Zhijie, Euler Taveira, Peter Smith, Ajin Cherian, Tomas Vondra, Amit Kapila) - - + + + Allow publication content to be filtered using a WHERE + clause (Hou Zhijie, Euler Taveira, Peter Smith, Ajin Cherian, Tomas Vondra, + Amit Kapila) + + - - -Allow publications to be restricted to specific columns (Tomas Vondra, Álvaro Herrera, Rahila Syed) - - + + + Allow publications to be + restricted to specific columns (Tomas Vondra, Álvaro Herrera, Rahila Syed) + + - - -Allow skipping of transactions on a subscriber using ALTER SUBSCRIPTION ... SKIP (Masahiko Sawada) - - + + + Allow skipping of transactions on a subscriber using ALTER SUBSCRIPTION + ... SKIP (Masahiko Sawada) + + - - -Add support for prepared transactions to built-in logical replication (Peter Smith, Ajin Cherian, Amit Kapila, Nikhil Sontakke, Stas Kelvich) - - + + + Add support for prepared transactions to built-in logical replication + (Peter Smith, Ajin Cherian, Amit Kapila, Nikhil Sontakke, Stas Kelvich) + + - - -Add two-phase information to the logical replication stream (Ajin Cherian) - + + + Add two-phase information to the logical replication stream (Ajin Cherian) + - -The new CREATE_REPLICATION_SLOT option is called TWO_PHASE. pg_recvlogical now supports a new option during slot creation. - - + + The new CREATE_REPLICATION_SLOT + option is called TWO_PHASE. + pg_recvlogical now supports a new + option during slot creation. + + - - -Prevent logical replication of empty transactions (Ajin Cherian, Hou Zhijie, Euler Taveira) - + + + Prevent logical replication of empty transactions (Ajin Cherian, Hou + Zhijie, Euler Taveira) + - -Previously, write transactions would send empty transactions to subscribers if subscribed tables were not modified. - - + + Previously, write transactions would send empty transactions to subscribers + if subscribed tables were not modified. + + - - -Add SQL functions to monitor the directory contents of logical replication slots (Bharath Rupireddy) - + + + Add SQL functions to monitor the directory contents + of logical replication slots (Bharath Rupireddy) + - -Specifically, the functions are pg_ls_logicalsnapdir(), pg_ls_logicalmapdir(), and pg_ls_replslotdir(). They can be run by members of the predefined pg_monitor role. - - + + Specifically, the functions are pg_ls_logicalsnapdir(), + pg_ls_logicalmapdir(), and + pg_ls_replslotdir(). They can be run by members of + the predefined pg_monitor role. + + - - -Allow subscribers to stop logical replication application on error (Osumi Takamichi, Mark Dilger) - + + + Allow subscribers to stop logical replication application on error (Osumi + Takamichi, Mark Dilger) + - -This is enabled with the subscriber option disable_on_error and avoids possible infinite error loops during stream application. - - + + This is enabled with the subscriber option disable_on_error + and avoids possible infinite error loops during stream application. + + - - -Adjust subscriber server variables to match the publisher so datetime and float8 values are interpreted consistently (Japin Li) - + + + Adjust subscriber server variables to match the publisher so datetime + and float8 values are interpreted consistently (Japin Li) + - -Some publishers might be relying on inconsistent behavior. - - + + Some publishers might be relying on inconsistent behavior. + + - - -Add system view pg_stat_subscription_stats to report on subscriber activity (Masahiko Sawada) - + + + Add system view pg_stat_subscription_stats + to report on subscriber activity (Masahiko Sawada) + - -New function pg_stat_reset_subscription_stats() allows the resetting of subscriber statistics. - - + + New function pg_stat_reset_subscription_stats() + allows the resetting of subscriber statistics. + + - - -Remove incorrect duplicate partitions in system view pg_publication_tables (Hou Zhijie) - - + + + Remove incorrect duplicate partitions in system view pg_publication_tables + (Hou Zhijie) + + @@ -1423,11 +1666,11 @@ Author: David Rowley 2021-08-22 [22c4e88eb] Allow parallel DISTINCT --> - - -Allow SELECT DISTINCT to be parallelized (David Rowley) - - + + + Allow SELECT DISTINCT to be parallelized (David Rowley) + + @@ -1443,15 +1686,18 @@ Author: Alvaro Herrera 2022-03-28 [7103ebb7a] Add support for MERGE SQL command --> - - -Add SQL MERGE command to adjust one table to match another (Simon Riggs, Pavan Deolasee, Álvaro Herrera, Amit Langote) - + + + Add SQL MERGE command to adjust + one table to match another (Simon Riggs, Pavan Deolasee, Álvaro Herrera, + Amit Langote) + - -This is similar to INSERT ... ON CONFLICT but more batch-oriented. - - + + This is similar to INSERT ... ON CONFLICT but more + batch-oriented. + + - - -Add support for HEADER option in COPY text format (Rémi Lapeyre) - + + + Add support for HEADER option in COPY text format (Rémi + Lapeyre) + - -The new option causes the column names to be output, and optionally verified on input. - - + + The new option causes the column names to be output, and optionally + verified on input. + + - - -Add new default WAL-logged method for database creation (Dilip Kumar) - + + + Add new default WAL-logged method for database creation (Dilip Kumar) + - -This avoids the need for checkpoints during database creation; the old method is still available. - - + + This avoids the need for checkpoints during database creation; the old + method is still available. + + - - -Allow CREATE DATABASE to set the database OID (Shruthi KC, Antonin Houska) - - + + + Allow CREATE + DATABASE to set the database OID + (Shruthi KC, Antonin Houska) + + - - -Prevent DROP DATABASE, DROP TABLESPACE, and ALTER DATABASE SET TABLESPACE from occasionally failing during concurrent use on Windows (Thomas Munro) - - + + + Prevent DROP + DATABASE, DROP + TABLESPACE, and ALTER DATABASE SET + TABLESPACE from occasionally failing during concurrent + use on Windows (Thomas Munro) + + - - -Allow foreign key ON DELETE SET actions to affect only specified columns (Paul Martinez) - + + + Allow foreign key ON DELETE + SET actions to affect only specified columns (Paul + Martinez) + - -Previously, all of the columns in the foreign key were always affected. - - + + Previously, all of the columns in the foreign key were always affected. + + - - -Allow ALTER TABLE to modify a table's ACCESS METHOD (Justin Pryzby, Jeff Davis) - - + + + Allow ALTER TABLE + to modify a table's ACCESS METHOD (Justin Pryzby, + Jeff Davis) + + - - -Properly call object access hooks when ALTER TABLE causes table rewrites (Michael Paquier) - - + + + Properly call object access hooks when ALTER TABLE causes + table rewrites (Michael Paquier) + + @@ -1558,37 +1822,41 @@ Author: Dean Rasheed 2021-07-26 [085f931f5] Allow numeric scale to be negative or greater than preci --> - - -Allow numeric scale to be negative or greater than precision (Dean Rasheed, Tom Lane) - + + + Allow numeric scale + to be negative or greater than precision (Dean Rasheed, Tom Lane) + - -This allows rounding of values to the left of the decimal point, e.g., '1234'::numeric(4, -2) returns 1200. - - + + This allows rounding of values to the left of the decimal point, e.g., + '1234'::numeric(4, -2) returns 1200. + + - - -Improve overflow detection when casting values to interval (Joe Koshakow) - - + + + Improve overflow detection when casting values to interval (Joe Koshakow) + + - - -Allow the creation of unlogged sequences (Peter Eisentraut) - - + + + Allow the creation of unlogged sequences (Peter Eisentraut) + + - - -Update the display width information for modern Unicode characters, like emojis (Jacob Champion) - + + + Update the display width information of modern Unicode characters, like + emojis (Jacob Champion) + - -Also update from Unicode 5.0 to 14.0.0. There is now an automated way to keep Postgres updated with Unicode releases. - - + + Also update from Unicode 5.0 to 14.0.0. There is now an automated way + to keep Postgres updated with Unicode releases. + + @@ -1621,120 +1891,147 @@ Author: Peter Eisentraut 2022-03-30 [7ae1619bc] Add range_agg with multirange inputs --> - - -Add multirange input to range_agg() (Paul Jungwirth) - - + + + Add multirange input to range_agg() + (Paul Jungwirth) + + - - -Add min() and max() aggregates for the xid8 data type (Ken Kato) - - + + + Add MIN() + and MAX() aggregates for the xid8 data type (Ken Kato) + + - - -Add regular expression functions for compatibility with other relational systems (Gilles Darold, Tom Lane) - + + + Add regular expression functions for compatibility with other relational + systems (Gilles Darold, Tom Lane) + - -Specifically, the new functions are regexp_count(), regexp_instr(), regexp_like(), and regexp_substr(). Some new optional arguments were also added to regexp_replace(). - - + + Specifically, the new functions are regexp_count(), + regexp_instr(), regexp_like(), + and regexp_substr(). Some new optional arguments + were also added to regexp_replace(). + + - - -Add the ability to compute the distance between polygons (Tom Lane) - - + + + Add the ability to compute the distance between polygons (Tom Lane) + + - - -Add to_char() format codes "of", "tzh", and "tzm" format codes (Nitin Jadhav) - + + + Add to_char() + format codes of, tzh, and + tzm format codes (Nitin Jadhav) + - -The upper-case versions of these were already supported. - - + + The upper-case versions of these were already supported. + + - - -Improve the optimization of timetz_zone() by stabilizing its value at transaction start (Aleksander Alekseev, Tom Lane) - - + + + Improve the optimization of timetz_zone() by + stabilizing its value at transaction start (Aleksander Alekseev, Tom Lane) + + + + HOW IS THIS USED? + + - - -Allow tsvector_delete_arr() and tsvector_setweight_by_filter() to accept empty array elements (Jean-Christophe Arnu) - + + + Allow tsvector_delete_arr() and + tsvector_setweight_by_filter() to accept empty array + elements (Jean-Christophe Arnu) + - -These lexemes are not stored so the acceptance of empty array elements is not a problem. - - + + These lexemes are not stored so the acceptance of empty array elements + is not a problem. NOT DOCUMENTED, USER API? + + - - -Add support for petabyte units to pg_size_pretty() and pg_size_bytes() (David Christensen) - - + + + Add support for petabyte units to pg_size_pretty() + and pg_size_bytes() (David Christensen) + + - - -Change pg_event_trigger_ddl_commands() to output references to non-local temporary schemas using the actual schema name (Tom Lane) - + + + Change pg_event_trigger_ddl_commands() + to output references to non-local temporary schemas using the actual + schema name (Tom Lane) + - -Previously this function referred to temporary schemas as pg_temp. - - + + Previously this function referred to temporary schemas as + pg_temp. + + - + - <acronym>JSON</acronym> + <acronym>JSON</acronym> @@ -1751,41 +2048,56 @@ Author: Andrew Dunstan 2022-04-07 [a6baa4bad] Documentation for SQL/JSON features --> - - -Add SQL/JSON-standard JSON constructors (Nikita Glukhov) - + + + Add SQL/JSON-standard + JSON constructors (Nikita Glukhov) + - -The construction functions are JSON(), JSON_SCALAR(), and JSON_SERIALIZE(), JSON_ARRAY(), JSON_ARRAYAGG(), JSON_OBJECT(), and JSON_OBJECTAGG(). They have a few functional advantages over the existing JSON functions. - - + + The construction functions are json(), + json_scalar(), and + json_serialize(), json_array(), + json_arrayagg(), json_object(), + and json_objectagg(). They have a few functional + advantages over the existing JSON functions. + + - - -Add SQL/JSON query functions JSON_EXISTS(), JSON_QUERY(), and JSON_VALUE() (Nikita Glukhov) - - + + + Add SQL/JSON query functions json_exists(), + json_query(), and json_value() + (Nikita Glukhov) + + - - -Add JSON predicates to test JSON/JSONB values (Nikita Glukhov) - + + + Add JSON predicates to test + JSON/JSONB values (Nikita Glukhov) + - -The clauses are IS JSON [ VALUE | ARRAY | OBJECT | SCALAR | [WITH | WITHOUT ] UNIQUE KEYS ]. - - + + The clauses are IS + JSON [ VALUE | ARRAY + | OBJECT | SCALAR | + [WITH | WITHOUT ] UNIQUE + KEYS ]. + + - - -Add function JSON_TABLE() to cause JSON data to be treated as a table (Nikita Glukhov) - - + + + Add function JSON_TABLE() + to cause JSON data to be treated as a table (Nikita + Glukhov) + + @@ -1816,22 +2131,26 @@ Author: Tom Lane 2022-04-30 [ccd10a9bf] Tighten enforcement of variable CONSTANT markings in plp --> - - -Fix enforcement of PL/pgSQL variable CONSTANT markings (Tom Lane) - - - -Previously, a variable used as a CALL output parameter or refcursor OPEN variable would not enforce CONSTANT. - - + + + Fix enforcement of PL/pgSQL variable CONSTANT markings + (Tom Lane) + + + Previously, a variable used as a CALL + output parameter or refcursor OPEN variable would not + enforce CONSTANT. + + + - Client Interfaces + <link linkend="libpq">libpq</link> @@ -1840,37 +2159,43 @@ Author: Peter Eisentraut 2022-04-01 [c1932e542] libpq: Allow IP address SANs in server certificates --> - - -Allow IP address matching against a server certificate's Subject Alternative Name (Jacob Champion) - - + + + Allow IP address matching against a server certificate's + Subject Alternative Name (Jacob Champion) + + - - -Allow PQsslAttribute() to report the SSL library type without requiring a libpq connection (Jacob Champion) - - + + + Allow PQsslAttribute() to report the + SSL library type without requiring a libpq connection + (Jacob Champion) + + - - -Change query cancellations sent by the client to use the same TCP settings as normal client connections (Jelte Fennema) - + + + Change query cancellations sent by the client to use the same + TCP settings as normal client connections (Jelte + Fennema) + - -This allows configured TCP timeouts to apply to query cancel connections. - - + + This allows configured TCP timeouts to apply to query + cancel connections. + + - - -Prevent libpq event callback failures from forcing an error result (Tom Lane) - - + + + Prevent libpq event callback failures from forcing an error result + (Tom Lane) + + @@ -1899,51 +2225,59 @@ Author: Tom Lane 2022-01-09 [376ce3e40] Prefer $HOME when looking up the current user's home dir --> - - -On Unix platforms, have client applications like psql check HOME environment variable for the user's home directory before checking the operating system definition (Anders Kaseorg) - - + + + On Unix platforms, have client applications like psql check + HOME environment variable for the user's home directory + before checking the operating system definition (Anders Kaseorg) + + - - <xref linkend="app-psql"/> + + <xref linkend="app-psql"/> - + - - -Improve performance of psql's \copy command (Heikki Linnakangas) - - + + + Improve performance of psql's \copy command + (Heikki Linnakangas) + + - - -Add psql command \getenv to assign the value of an environment variable to a psql variable (Tom Lane) - - + + + Add psql command \getenv to assign the value + of an environment variable to a psql variable + (Tom Lane) + + - - -Add '+' option to psql's \lo_list/\dl to show object privileges (Pavel Luzanov) - - + + + Add '+' option to psql's + \lo_list/\dl to show object + privileges (Pavel Luzanov) + + - - -Add psql \dconfig to report server variables (Mark Dilger, Tom Lane) - + + + Add psql \dconfig to report server variables + (Mark Dilger, Tom Lane) + - -This is similar to the server-side SHOW command but can process patterns. - - + + This is similar to the server-side SHOW command but + can process patterns. + + - - -Add pager option for psql's \watch command (Pavel Stehule, Thomas Munro) - + + + Add pager option for psql's \watch command + (Pavel Stehule, Thomas Munro) + - -This is only supported on Unix, and is controlled by PSQL_WATCH_PAGER. - - + + This is only supported on Unix, and is controlled by + PSQL_WATCH_PAGER. + + - - -Have psql send intra-query double-hyphen comments to the server (Tom Lane, Greg Nancarrow) - + + + Have psql send intra-query double-hyphen + comments to the server (Tom Lane, Greg Nancarrow) + - -Previously such comments were removed from the query before being sent. Double-hyphen comments that are before query text are not sent, and are not recorded as separate psql history entries. - - + + Previously such comments were removed from the query before being sent. + Double-hyphen comments that are before query text are not sent, and are + not recorded as separate psql history entries. + + - - -Adjust psql's readline meta-# to insert a double-hyphen comment marker (Tom Lane) - + + + Adjust psql's readline meta-# to insert a + double-hyphen comment marker (Tom Lane) + - -Previously an unhelpful pound marker was inserted. - - + + Previously an unhelpful pound marker was inserted. + + - - -Have psql output all results if multiple queries are passed to the server at once (Fabien Coelho) - + + + Have psql output all results if multiple + queries are passed to the server at once (Fabien Coelho) + - -This can be disabled by setting SHOW_ALL_RESULTS. - - + + This can be disabled by setting SHOW_ALL_RESULTS. + + - - -Improve psql's tab completion (Shinya Kato, Dagfinn Ilmari Mannsåker, Peter Smith, Koyu Tanigawa, Ken Kato, David Fetter, Haiying Tang, Peter Eisentraut, Álvaro Herrera, Tom Lane, Masahiko Sawada) - - + + + Improve psql's tab completion (Shinya Kato, + Dagfinn Ilmari Mannsåker, Peter Smith, Koyu Tanigawa, Ken Kato, David + Fetter, Haiying Tang, Peter Eisentraut, Álvaro Herrera, Tom Lane, + Masahiko Sawada) + + - - -Limit support of psql to servers running PostgreSQL 9.2 and later (Tom Lane) - - + + + Limit support of psql to servers running + PostgreSQL 9.2 and later (Tom Lane) + + @@ -2102,15 +2449,20 @@ Author: Robert Haas 2022-01-20 [3500ccc39] Support base backup targets. --> - - -Add new pg_basebackup option to control the base backup location (Robert Haas) - + + + Add new pg_basebackup + option to control the base backup location + (Robert Haas) + - -New output options are 'server' to write the backup locally and 'blackhole' to discard the backup (for testing). - - + + New output options are server to write the backup + locally and blackhole to discard the backup (for + testing). + + - - -Allow pg_basebackup to decompress LZ4 and Zstandard compressed server-side base backups, and compress output files with LZ4 and Zstandard (Dipesh Pandit, Jeevan Ladhe) - - + + + Allow pg_basebackup to decompress LZ4 and + Zstandard compressed server-side base backups, and compress output files + with LZ4 and Zstandard (Dipesh Pandit, Jeevan Ladhe) + + - - -Allow pg_basebackup's option to control the compression method and options (Michael Paquier, Robert Haas) - + + + Allow pg_basebackup's + option to control the compression method and + options (Michael Paquier, Robert Haas) + - -New options include server-gzip (gzip on the server), client-gzip (same as gzip). - - + + New options include server-gzip (gzip on the server), + client-gzip (same as gzip). + + - - -Allow pg_basebackup to compress on the server side and decompress on the client side before storage (Dipesh Pandit) - + + + Allow pg_basebackup to compress on the server + side and decompress on the client side before storage (Dipesh Pandit) + - -This is accomplished by specifying compression on the server side and plain output format. - - + + This is accomplished by specifying compression on the server side and + plain output format. + + - - -Add the LZ4 compression method to pg_receivewal (Georgios Kokolatos) - + + + Add the LZ4 compression method to pg_receivewal + (Georgios Kokolatos) + - -This is enabled via --compress=lz4 and requires binaries to be built using . - - + + This is enabled via --compress=lz4 and requires binaries + to be built using . + + - - -Add additional capabilities to pg_receivewal's option (Georgios Kokolatos) - - + + + Add additional capabilities to pg_receivewal's + option (Georgios Kokolatos) + + - - -Improve pg_receivewal's ability to restart at the proper WAL location (Ronan Dunklau) - + + + Improve pg_receivewal's ability to restart at + the proper WAL location (Ronan Dunklau) + - -Previously, pg_receivewal would start based on the WAL file stored in the local archive directory, or at the sending server's current WAL flush location. With this change, if the sending server is running -Postgres 15 or later, the local archive directory is empty, and a replication slot is specified, the replication slot's restart point will be used. - - + + Previously, pg_receivewal would start based + on the WAL file stored in the local archive directory, + or at the sending server's current WAL flush location. + With this change, if the sending server is running Postgres 15 or later, + the local archive directory is empty, and a replication slot is specified, + the replication slot's restart point will be used. + + + + + + + + Add pg_rewind option + to simplify use when server configuration + files are stored outside the data directory (Gunnar Bluth) + + - - -Allow pgbench to retry after serialization and deadlock failures (Yugo Nagata, Marina Polyakova) - - + + + Allow pgbench + to retry after serialization and deadlock failures (Yugo Nagata, Marina + Polyakova) + + - - <application>pg_dump</application> + <link linkend="app-pgdump"><application>pg_dump</application></link> @@ -2229,15 +2611,16 @@ Author: Noah Misch 2021-06-28 [7ac10f692] Dump COMMENT ON SCHEMA public. --> - - -Have pg_dump dump "public" schema ownership changes and security labels (Noah Misch) - + + + Have pg_dump dump public + schema ownership changes and security labels (Noah Misch) + - -It also dumps "public" schema comments. - - + + It also dumps public schema comments. + + - - -Improve performance of dumping databases with many objects (Tom Lane) - + + + Improve performance of dumping databases with many objects (Tom Lane) + - -This will also improve the performance of pg_upgrade. - - + + This will also improve the performance of pg_upgrade. + + - - -Improve the parallel pg_dump performance of TOAST tables (Tom Lane) - - + + + Improve the parallel pg_dump performance of + TOAST tables (Tom Lane) + + - - -Add dump/restore option to force restore to only use the default table access method (Justin Pryzby) - - + + + Add dump/restore option to + force restore to only use the default table access method (Justin Pryzby) + + - - -Limit support of pg_dump and pg_dumpall to servers running PostgreSQL 9.2 and later (Tom Lane) - - + + + Limit support of pg_dump and pg_dumpall + to servers running PostgreSQL 9.2 and later + (Tom Lane) + + - - <application>pg_upgrade</application> + <link linkend="pgupgrade"><application>pg_upgrade</application></link> @@ -2306,30 +2694,35 @@ Author: Andres Freund 2022-02-21 [27b02e070] pg_upgrade: Don't print progress status when output is n --> - - -Disable default status reporting during pg_upgrade operation if the output is not a terminal (Andres Freund) - + + + Disable default status reporting during + pg_upgrade operation if the output is not a + terminal (Andres Freund) + - -The status reporting output can be enabled for non-tty usage by using . - - + + The status reporting output can be enabled for non-tty usage by using + . + + - - -Have pg_upgrade report all databases with invalid connection settings (Jeevan Ladhe) - + + + Have pg_upgrade report all databases with + invalid connection settings (Jeevan Ladhe) + - -Previously only the first database with an invalid connection setting was reported. - - + + Previously only the first database with an invalid connection setting + was reported. + + - - -Store pg_upgrade temporary files in a new cluster subdirectory called pg_upgrade_output.d (Justin Pryzby) - + + + Store pg_upgrade temporary files in a new + cluster subdirectory called pg_upgrade_output.d + (Justin Pryzby) + - -Previously temporary files were stored in the current directory. - - + + Previously temporary files were stored in the current directory. + + - - -Have pg_upgrade preserve relfilenodes, tablespace, and database OIDs between old and new clusters (Shruthi KC, Antonin Houska) - - + + + Have pg_upgrade preserve relfilenodes, + tablespace, and database OIDs between old and new clusters (Shruthi KC, + Antonin Houska) + + - - -Add a option to pg_upgrade (Michael Paquier) - + + + Add a option to + pg_upgrade (Michael Paquier) + - -This useful only for testing. - - + + This useful only for testing. + + - - -Limit support of pg_upgrade to old servers running PostgreSQL 9.2 and later (Tom Lane) - - + + + Limit support of pg_upgrade to old servers + running PostgreSQL 9.2 and later (Tom Lane) + + - - <application>pg_waldump</application> + <link linkend="pgwaldump"><application>pg_waldump</application></link> @@ -2404,63 +2802,61 @@ Author: Thomas Munro 2022-03-25 [52b556843] Improve command line options for pg_waldump. --> - - -Allow pg_waldump to be filtered by relation file node, block number, fork number, and full page images (David Christensen, Thomas Munro) - - + + + Allow pg_waldump to be filtered by relation file + node, block number, fork number, and full page images (David Christensen, + Thomas Munro) + + - - -Have pg_waldump report statistics before an interrupted exit (Bharath Rupireddy) - + + + Have pg_waldump report statistics before an + interrupted exit (Bharath Rupireddy) + - -For example, issuing a control-C in a terminal running pg_waldump --stats --follow will report the current statistics before exiting. This does not work on Windows. - - + + For example, issuing a control-C in a terminal running pg_waldump + --stats --follow will report the current statistics before + exiting. This does not work on Windows. + + - - -Improve descriptions of some transaction WAL records reported by pg_waldump (Masahiko Sawada, Michael Paquier) - - + + + Improve descriptions of some transaction WAL records + reported by pg_waldump (Masahiko Sawada, + Michael Paquier) + + - - -Allow pg_waldump to dump information about multiple resource managers (Heikki Linnakangas) - + + + Allow pg_waldump to dump information about + multiple resource managers (Heikki Linnakangas) + - -This is enabled by specifying the option multiple times. - - - - - - - -Add pg_rewind option to simplify use when server configuration files are stored outside the data directory (Gunnar "Nick" Bluth) - - + + This is enabled by specifying the option multiple + times. + + @@ -2478,29 +2874,33 @@ Author: Fujii Masao 2021-10-05 [f6b5d05ba] doc: Document pg_encoding_to_char() and pg_char_to_encod --> - - -Add documentation for pg_encoding_to_char() and pg_char_to_encoding() (Ian Lawrence Barwick) - - + + + Add documentation for pg_encoding_to_char() + and pg_char_to_encoding() (Ian Lawrence Barwick) + + - - -Document the ^@ starts-with operator (Tom Lane) - - + + + Document the ^@ starts-with + operator (Tom Lane) + + - Source Code + Source Code @@ -2509,67 +2909,78 @@ Author: Andres Freund 2021-12-30 [93d973494] ci: Add continuous integration for github repositories v --> - - -Add support for continuous integration testing using cirrus-ci (Andres Freund, Thomas Munro, Melanie Plageman) - - + + + Add support for continuous integration testing using cirrus-ci (Andres + Freund, Thomas Munro, Melanie Plageman) + + - - -Add configure option to enable Zstandard builds (Jeevan Ladhe, Robert Haas, Michael Paquier) - - + + + Add configure option + to enable Zstandard builds (Jeevan Ladhe, Robert Haas, Michael Paquier) + + - - -Add module field which can be customized for non-community PostgreSQL distributions (Peter Eisentraut) - + + + Add module field which can be customized for non-community + PostgreSQL distributions (Peter Eisentraut) + - -A module field mismatch would generate an error. - - + + A module field mismatch would generate an error. + + - - -Create a new pg_type.typcategory value for CHAR (Tom Lane) - + + + Create a new pg_type.typcategory + value for "char" (Tom Lane) + - -Some internal-use-only types have also been assigned this new pg_type.typcategory. - - + + Some internal-use-only types have also been assigned this column. + + - - -Add new protocol message TARGET to specify a new COPY method to be for base backups (Robert Haas) - + + + Add new protocol message TARGET + to specify a new COPY method to be for base backups + (Robert Haas) + - -Modify pg_basebackup to use this method. - - + + Modify pg_basebackup + to use this method. + + - - -Add new protocol message COMPRESSION and COMPRESSION_DETAIL to specify the compression method and options (Robert Haas) - - + + + Add new protocol message COMPRESSION + and COMPRESSION_DETAIL to specify the compression + method and options (Robert Haas) + + - - -Remove server support for old BASE_BACKUP command syntax and base backup protocol (Robert Haas) - - + + + Remove server support for old BASE_BACKUP command + syntax and base backup protocol (Robert Haas) + + - - -Add support for extensions to set custom backup targets (Robert Haas) - - + + + Add support for extensions to set custom backup targets (Robert Haas) + + - - -Allow extensions to define their own WAL resource managers (Jeff Davis) - - + + + Allow extensions to define their own WAL resource + managers (Jeff Davis) + + - - -Add function pg_settings_get_flags() to get the flags of server-side variables (Justin Pryzby) - - + + + Add function pg_settings_get_flags() + to get the flags of server-side variables (Justin Pryzby) + + - - -Add server variable allow_in_place_tablespaces for tablespace testing (Thomas Munro) - - + + + Add server variable allow_in_place_tablespaces + for tablespace testing (Thomas Munro) + + - - -Export all server variables on Windows using PGDLLIMPORT (Robert Haas) - + + + Export all server variables on Windows using PGDLLIMPORT + (Robert Haas) + - -Previously only specific variables where exported. - - + + Previously only specific variables where exported. + + - - -Require OpenSSL to build pgcrypto binaries (Peter Eisentraut) - - + + + Require OpenSSL to build pgcrypto binaries + (Peter Eisentraut) + + - - -Disallow building with Python 2 (Andres Freund) - - + + + Disallow building with Python 2 (Andres Freund) + + - - -Adjust configure to require Perl version 5.8.3 or later (Dagfinn Ilmari Mannsåker) - - + + + Adjust configure to require Perl version 5.8.3 + or later (Dagfinn Ilmari Mannsåker) + + @@ -2703,26 +3127,31 @@ Author: Jeff Davis 2022-04-08 [2258e76f9] Add contrib/pg_walinspect. --> - - -Add new module pg_walinspect (Bharath Rupireddy) - + + + Add new module pg_walinspect + (Bharath Rupireddy) + - -This gives SQL-level output similar to pg_waldump. - - + + This gives SQL-level output similar to pg_waldump. + + - - -Add contrib module basic_archive to perform archiving via a library (Nathan Bossart) - - + + + Add module basic_archive + to perform archiving via a library (Nathan Bossart) + + - - -Add contrib module basebackup_to_shell as a custom backup target (Robert Haas) -contrib module. - - + + + Add module basebackup_to_shell + as a custom backup target (Robert Haas) contrib module. + + - - -Add pg_stat_statements output for temporary file block I/O (Masahiko Sawada) - - + + + Add pg_stat_statements + output for temporary file block I/O (Masahiko Sawada) + + - - -Add JIT counters to pg_stat_statements (Magnus Hagander) - - + + + Add JIT counters to pg_stat_statements (Magnus Hagander) + + - - -Allow amcheck to check sequences (Mark Dilger) - - + + + Allow amcheck + to check sequences (Mark Dilger) + + - - -Improve amcheck sanity checks for TOAST tables (Mark Dilger) - - + + + Improve amcheck sanity checks for + TOAST tables (Mark Dilger) + + - - -Allow btree_gist indexes on boolean columns (Emre Hasegeli) - + + + Allow btree_gist indexes + on boolean columns (Emre Hasegeli) + - -These can be used for exclusion constraints. - - + + These can be used for exclusion constraints. + + - - -Indicate the permissive/enforcing state in sepgsql log messages (Dave Page) - - + + + Indicate the permissive/enforcing state in sepgsql log messages + (Dave Page) + + - - -Fix pageinspect's page_header() to handle 32 kilobyte page sizes (Quan Zongliang) - + + + Fix pageinspect's + page_header() to handle 32 kilobyte page sizes + (Quan Zongliang) + - -Previously improper negative values could be returned in certain cases. - - + + Previously improper negative values could be returned in certain cases. + + - + <link linkend="postgres-fdw"><application>postgres_fdw</application></link> @@ -2839,11 +3280,12 @@ Author: Tom Lane 2021-07-30 [5d44fff01] In postgres_fdw, allow CASE expressions to be pushed to --> - - -Allow postgres_fdw to push down CASE expressions (Alexander Pyhalov) - - + + + Allow postgres_fdw to push down CASE expressions + (Alexander Pyhalov) + + - - -Add server variable postgres_fdw.application_name to control the application name of postgres_fdw connections (Hayato Kuroda) - + + + Add server variable postgres_fdw.application_name + to control the application name of postgres_fdw connections (Hayato Kuroda) + - -Previously the remote application_name could only be set on the remote server or via postgres_fdw connection specification. postgres_fdw.application_name also supports escape sequences for customization. - - + + Previously the remote application_name + could only be set on the remote server or via + postgres_fdw connection specification. + postgres_fdw.application_name also supports escape + sequences for customization. + + - - -Allow parallel commit on postgres_fdw servers (Etsuro Fujita) - + + + Allow parallel commit on postgres_fdw servers + (Etsuro Fujita) + - -This is enabled with the CREATE SERVER option parallel_commit when using postgres_fdw. - - + + This is enabled with the CREATE SERVER option + parallel_commit when using postgres_fdw. + + From 4d3b4d7bfa39420c12dd8af9269a5b68f006011f Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sat, 11 Jun 2022 14:59:18 -0400 Subject: [PATCH 769/772] relnotes: update AS OF date --- doc/src/sgml/release-15.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/release-15.sgml b/doc/src/sgml/release-15.sgml index 8a26fcff11..a840f20cca 100644 --- a/doc/src/sgml/release-15.sgml +++ b/doc/src/sgml/release-15.sgml @@ -3,7 +3,7 @@ Release date: - AS OF 2022-05-09 + AS OF 2022-06-11 From 0d932a9d990fdb78d58abc42c03a1e84cfa2facd Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sat, 11 Jun 2022 15:28:20 -0400 Subject: [PATCH 770/772] relnotes: update word wrapping --- doc/src/sgml/release-15.sgml | 850 +++++++++++++++++++---------------- 1 file changed, 454 insertions(+), 396 deletions(-) diff --git a/doc/src/sgml/release-15.sgml b/doc/src/sgml/release-15.sgml index a840f20cca..849f2be468 100644 --- a/doc/src/sgml/release-15.sgml +++ b/doc/src/sgml/release-15.sgml @@ -58,15 +58,16 @@ Author: Noah Misch - This is a change in the default for newly-created databases in existing - clusters and for new clusters; USAGE permissions on - the public schema has not been changed. Databases - restored from previous Postgres releases will be restored with their - current permissions. Users wishing to have the old permissions on - new objects will need to grant CREATE permission - for PUBLIC on the public schema; - this change can be made on template1 to cause all new - databases to have these permissions. template1 + This is a change in the default for newly-created databases in + existing clusters and for new clusters; USAGE + permissions on the public schema has not + been changed. Databases restored from previous Postgres releases + will be restored with their current permissions. Users wishing + to have the old permissions on new objects will need to grant + CREATE permission for PUBLIC + on the public schema; this change can be made + on template1 to cause all new databases + to have these permissions. template1 permissions for pg_dumpall and pg_upgrade? @@ -84,9 +85,9 @@ Author: Noah Misch - Previously it was the literal user name of the database owner. Databases - restored from previous Postgres releases will be restored with their - current owner specification. + Previously it was the literal user name of the database owner. + Databases restored from previous Postgres releases will be restored + with their current owner specification. @@ -97,8 +98,9 @@ Author: Stephen Frost - Remove long-deprecated exclusive backup - mode (David Steele, Nathan Bossart) + Remove long-deprecated exclusive backup mode (David Steele, + Nathan Bossart) @@ -108,8 +110,8 @@ Author: Stephen Frost pg_start_backup()/pg_stop_backup() have been renamed to pg_backup_start()/pg_backup_stop(), - and the functions pg_backup_start_time() and - pg_is_in_backup() have been removed. + and the functions pg_backup_start_time() + and pg_is_in_backup() have been removed. @@ -126,9 +128,9 @@ Author: Peter Geoghegan - This allows query hash operations to use double the amount of work_mem memory as - other operations. + This allows query hash operations to use double the amount of + work_mem + memory as other operations. @@ -140,8 +142,8 @@ Author: Andres Freund Remove server-side language plpython2u and generic Python - language plpythonu (Andres Freund) + linkend="plpython">plpython2u and generic + Python language plpythonu (Andres Freund) @@ -152,15 +154,16 @@ Author: Tom Lane - Mark the interval - output function as stable, not immutable, since it depends on interval output + function as stable, not immutable, since it depends on IntervalStyle (Tom Lane) - This will cause the creation of indexes relying on the text output of - interval values to fail. + This will cause the creation of indexes relying on the text output + of interval values to fail. @@ -178,8 +181,9 @@ Author: Tom Lane This is prohibited because lexemes should never be empty. Users of - previous Postgres releases should verify that no empty lexemes are stored - because they can lead to dump/restore failures and inconsistent results. + previous Postgres releases should verify that no empty lexemes + are stored because they can lead to dump/restore failures and + inconsistent results. @@ -191,8 +195,8 @@ Author: Peter Eisentraut Generate an error when chr() is - supplied with a negative argument (Peter Eisentraut) + linkend="functions-string-other">chr() + is supplied with a negative argument (Peter Eisentraut) @@ -222,8 +226,8 @@ Author: Tom Lane Remove pg_dump's - option since all supported - server versions support synchronized snapshots (Tom Lane) + option since all + supported server versions support synchronized snapshots (Tom Lane) @@ -253,8 +257,8 @@ Author: Peter Eisentraut - Previously literals like 123abc would be interpreted - as 123 and abc. + Previously literals like 123abc would be + interpreted as 123 and abc. @@ -267,13 +271,14 @@ Author: Peter Eisentraut Adjust JSON numeric literal processing to match the - SQL/JSON-standard (Peter Eisentraut) + SQL/JSON-standard (Peter + Eisentraut) This accepts numeric formats like .1 and - 1., and disallows trailing junk after numeric literals, - like 1.type(). + 1., and disallows trailing junk after numeric + literals, like 1.type(). @@ -284,8 +289,9 @@ Author: Tom Lane - Improve consistency of interval - parsing with trailing periods (Tom Lane) + Improve consistency of interval parsing with trailing + periods (Tom Lane) @@ -300,8 +306,8 @@ Author: Bruce Momjian - When specifying fractional interval values in units greater than months, - round to the nearest month (Bruce Momjian) + When specifying fractional interval values in units greater than + months, round to the nearest month (Bruce Momjian) @@ -318,8 +324,8 @@ Author: Tom Lane Detect integer overflow in interval justification functions - (Joe Koshakow) + linkend="functions-datetime-table">interval justification + functions (Joe Koshakow) @@ -342,8 +348,8 @@ Author: Robert Haas - Previously, login roles could add/remove members of its own role, even - without ADMIN OPTION privilege. + Previously, login roles could add/remove members of its own role, + even without ADMIN OPTION privilege. @@ -360,8 +366,8 @@ Author: Jeff Davis Because row-level security policies are not checked, only superusers, - roles with bypassrls, and table owners can replicate - into tables with row-level security policies. + roles with bypassrls, and table owners can + replicate into tables with row-level security policies. @@ -372,16 +378,16 @@ Author: Jeff Davis - Prevent UPDATE and DELETE logical replication operations on - tables where the subscription owner does not have SELECT - permission on the table (Jeff Davis) + Prevent UPDATE and DELETE + logical replication + operations on tables where the subscription owner does not have + SELECT permission on the table (Jeff Davis) UPDATE and DELETE perform - SELECT, so require the subscription owner to have - table SELECT permission. + SELECT, so require the subscription owner to + have table SELECT permission. @@ -411,8 +417,8 @@ Author: Tom Lane Modify SPI's SPI_commit() and - SPI_commit_and_chain() to automatically start a new - transaction at completion (Peter Eisentraut, Tom Lane) + SPI_commit_and_chain() to automatically start + a new transaction at completion (Peter Eisentraut, Tom Lane) @@ -429,8 +435,8 @@ Author: Tom Lane Fix pg_statio_all_tables - to sum values for the rare case of TOAST tables with - multiple indexes (Andrei Zubkov) + to sum values for the rare case of TOAST tables + with multiple indexes (Andrei Zubkov) @@ -449,12 +455,14 @@ Author: Tom Lane - Disallow setting of server variables - matching the prefixes of installed extension (Florin Irion, Tom Lane) + Disallow setting of server + variables matching the prefixes of installed extension + (Florin Irion, Tom Lane) - This also deletes any matching server variables during extension load. + This also deletes any matching server variables during extension + load. @@ -465,8 +473,9 @@ Author: Andres Freund - Remove unnecessary server variable stats_temp_directory - (Andres Freund, Kyotaro Horiguchi) + Remove unnecessary server variable + stats_temp_directory (Andres Freund, Kyotaro + Horiguchi) @@ -485,8 +494,8 @@ Author: Tom Lane - This will cause random() to differ from what was - emitted by prior versions for the same seed values. + This will cause random() to differ from what + was emitted by prior versions for the same seed values. @@ -519,7 +528,8 @@ Author: Tom Lane - This function has been implemented in the core backend since Postgres 9.1. + This function has been implemented in the core backend since + Postgres 9.1. @@ -530,13 +540,13 @@ Author: Tom Lane - Allow custom scan provders to indicate - if they support projections (Sven Klemm) + Allow custom scan provders + to indicate if they support projections (Sven Klemm) - The default is now that custom scan providers can't support projections, - so they need to be updated for this release. + The default is now that custom scan providers can't support + projections, so they need to be updated for this release. @@ -570,11 +580,12 @@ Author: Peter Eisentraut - This is designed to detect collation mismatches to avoid data corruption. - Function pg_database_collation_actual_version() + This is designed to detect collation + mismatches to avoid data corruption. Function + pg_database_collation_actual_version() reports the underlying operating system collation version, and - ALTER DATABASE ... REFRESH sets the database to match - the operating system collation version. DETAILS? + ALTER DATABASE ... REFRESH sets the database + to match the operating system collation version. DETAILS? @@ -585,15 +596,16 @@ Author: Peter Eisentraut - Allow ICU collations to - be set as the default for clusters and databases (Peter Eisentraut) + Allow ICU + collations to be set as the default for clusters and databases + (Peter Eisentraut) Previously, ICU collations could only be specified in CREATE - COLLATION and used with the COLLATE - clause. + COLLATION and used with the + COLLATE clause. @@ -606,7 +618,8 @@ Author: Michael Paquier Add system view pg_ident_file_mappings - to report pg_ident.conf information (Julien Rouhaud) + to report pg_ident.conf information (Julien + Rouhaud) @@ -624,13 +637,13 @@ Author: David Rowley - Improve planning time for queries referencing partitioned tables (David - Rowley) + Improve planning time for queries referencing partitioned tables + (David Rowley) - Specifically this helps if only a small number of the many partitions - are relevant. + Specifically this helps if only a small number of the many + partitions are relevant. @@ -641,15 +654,15 @@ Author: David Rowley - Allow ordered scans of partitions to avoid sorting in more cases (David - Rowley) + Allow ordered scans of partitions to avoid sorting in more cases + (David Rowley) - Previously, a partitioned table with a DEFAULT partition - or a LIST partition containing multiple values could - not be used for ordered partition scans. Now they can be used if these - partitions are pruned. + Previously, a partitioned table with a DEFAULT + partition or a LIST partition containing + multiple values could not be used for ordered partition scans. + Now they can be used if these partitions are pruned. @@ -660,15 +673,15 @@ Author: Alvaro Herrera - Improve foreign key behavior of updates on partitioned tables that move - rows between partitions (Amit Langote) + Improve foreign key behavior of updates on partitioned tables + that move rows between partitions (Amit Langote) - Previously, such updates ran delete actions on the - source partition and insert actions on the target partition. - PostgreSQL will now run update actions on the - referenced partition root. + Previously, such updates ran delete actions on the source + partition and insert actions on the target partition. + PostgreSQL will now run update actions + on the referenced partition root. @@ -694,8 +707,8 @@ Author: Alvaro Herrera Fix ALTER TRIGGER - RENAME on partitioned tables to properly rename triggers - an all partitions (Arne Roland, Álvaro Herrera) + RENAME on partitioned tables to properly rename + triggers an all partitions (Arne Roland, Álvaro Herrera) @@ -720,8 +733,8 @@ Author: Peter Geoghegan Enable system and TOAST btree indexes to - efficiently store duplicates (Peter Geoghegan) + linkend="storage-toast">TOAST btree + indexes to efficiently store duplicates (Peter Geoghegan) @@ -737,8 +750,8 @@ Author: Alexander Korotkov Improve lookup performance of GiST indexes built using sorting - (Aliaksandr Kalenik, Sergei Shoulbakov, Andrey Borodin) + linkend="gist">GiST indexes built using + sorting (Aliaksandr Kalenik, Sergei Shoulbakov, Andrey Borodin) @@ -750,8 +763,8 @@ Author: Tomas Vondra Prevent changes to columns only indexed by BRIN indexes from disabling - HOT updates (Josef Simanek) + linkend="brin">BRIN indexes from + disabling HOT updates (Josef Simanek) @@ -762,14 +775,15 @@ Author: Peter Eisentraut - Allow unique constraints and indexes to treat NULL - values as not distinct (Peter Eisentraut) + Allow unique constraints and indexes to treat + NULL values as not distinct (Peter Eisentraut) - Previously NULL values were always indexed as distinct - values, but this can now be changed by creating constraints and indexes - using UNIQUE NULLS NOT DISTINCT. + Previously NULL values were always indexed + as distinct values, but this can now be changed by creating + constraints and indexes using UNIQUE NULLS NOT + DISTINCT. @@ -780,9 +794,10 @@ Author: Tom Lane - Allow ^@ - and starts_with() to use btree indexes if using a - C collation (Tom Lane) + Allow ^@ + and starts_with() to use btree indexes if + using a C collation (Tom Lane) @@ -807,9 +822,9 @@ Author: Tomas Vondra - Allow extended statistics - to record statistics for a parent with all its children (Tomas Vondra, - Justin Pryzby) + Allow extended + statistics to record statistics for a parent with all its + children (Tomas Vondra, Justin Pryzby) @@ -825,9 +840,9 @@ Author: Tomas Vondra - Allow GROUP BY - sorting to optimize column order (Dmitry Dolgov, Teodor Sigaev, Tomas - Vondra) + Allow GROUP + BY sorting to optimize column order (Dmitry + Dolgov, Teodor Sigaev, Tomas Vondra) @@ -845,8 +860,8 @@ Author: Tom Lane Add server variable recursive_worktable_factor - to allow the user to specify the expected recursive query worktable size - (Simon Riggs) + to allow the user to specify the expected recursive query worktable + size (Simon Riggs) @@ -870,9 +885,9 @@ Author: David Rowley - Allow hash lookup for NOT - IN clauses with many constants (David Rowley, James - Coleman) + Allow hash lookup for NOT IN + clauses with many constants (David Rowley, James Coleman) @@ -887,9 +902,9 @@ Author: John Naylor - Improve validation of UTF-8 text (even if only - ASCII) by processing 16 bytes at a time (John Naylor, - Heikki Linnakangas) + Improve validation of UTF-8 text (even if + only ASCII) by processing 16 bytes at a time + (John Naylor, Heikki Linnakangas) @@ -908,13 +923,13 @@ Author: Heikki Linnakangas Improve performance for sorts that exceed work_mem (Heikki - Linnakangas) + linkend="guc-work-mem">work_mem + (Heikki Linnakangas) - Specifically, switch to a batch sorting algorithm that uses more output - streams internally. + Specifically, switch to a batch sorting algorithm that uses more + output streams internally. @@ -929,8 +944,8 @@ Author: John Naylor - Improve performance and reduce memory consumption of in-memory sorts - (Ronan Dunklau, David Rowley, Thomas Munro, John Naylor) + Improve performance and reduce memory consumption of in-memory + sorts (Ronan Dunklau, David Rowley, Thomas Munro, John Naylor) @@ -943,9 +958,9 @@ Author: Michael Paquier - Allow WAL full - page writes to use LZ4 and Zstandard compression (Andrey Borodin, - Justin Pryzby) + Allow WAL full page writes to use + LZ4 and Zstandard compression (Andrey Borodin, Justin Pryzby) @@ -962,13 +977,14 @@ Author: Thomas Munro - Add direct I/O support to macOS - (Thomas Munro) + Add direct I/O support + to macOS (Thomas Munro) - This only works if max_wal_senders=0 and - wal_level=minimal, and only for WAL. + This only works if max_wal_senders=0 + and wal_level=minimal, and only for + WAL. @@ -979,8 +995,8 @@ Author: Peter Geoghegan - Allow vacuum to be more aggressive - in setting the oldest frozenxid (Peter Geoghegan) + Allow vacuum to be more + aggressive in setting the oldest frozenxid (Peter Geoghegan) @@ -991,9 +1007,10 @@ Author: Etsuro Fujita - Allow a query referencing multiple foreign - tables to perform parallel foreign table scans in more cases - (Andrey Lepikhov, Etsuro Fujita) + Allow a query referencing multiple foreign tables to perform + parallel foreign table scans in more cases (Andrey Lepikhov, + Etsuro Fujita) @@ -1006,8 +1023,8 @@ Author: David Rowley Improve the performance of window functions that use row_number(), - rank(), and count() (David - Rowley) + rank(), and count() + (David Rowley) @@ -1018,8 +1035,8 @@ Author: Tom Lane - Improve the performance of spinlocks on high-core-count ARM64 systems - (Geoffrey Blake) + Improve the performance of spinlocks on high-core-count ARM64 + systems (Geoffrey Blake) @@ -1039,8 +1056,8 @@ Author: Robert Haas - Enable default logging of checkpoints and slow autovacuum operations - (Bharath Rupireddy) + Enable default logging of checkpoints and slow autovacuum + operations (Bharath Rupireddy) @@ -1048,9 +1065,10 @@ Author: Robert Haas linkend="guc-log-checkpoints">log_checkpoints to on and log_autovacuum_min_duration - to 10 minutes. This will cause idle servers to generate log output, which - might cause problems on resource-constrained servers with insufficient - log file removal. The defaults should be changed in such cases. + to 10 minutes. This will cause idle servers to generate log + output, which might cause problems on resource-constrained + servers with insufficient log file removal. The defaults should + be changed in such cases. @@ -1063,8 +1081,8 @@ Author: Alvaro Herrera - Generate periodic log message during slow server starts (Nitin Jadhav, - Robert Haas) + Generate periodic log message during slow server starts (Nitin + Jadhav, Robert Haas) @@ -1083,14 +1101,15 @@ Author: Andres Freund - Store server-level statistics - in shared memory (Kyotaro Horiguchi, Andres Freund, Melanie Plageman) + Store server-level + statistics in shared memory (Kyotaro Horiguchi, Andres + Freund, Melanie Plageman) - Previously this was updated via UDP packets, stored in - the file system, and read by sessions. There is no longer a statistics - collector process. + Previously this was updated via UDP packets, + stored in the file system, and read by sessions. There is no + longer a statistics collector process. @@ -1105,8 +1124,8 @@ Author: Peter Geoghegan - Add additional information to VACUUM VERBOSE and - autovacuum logging messages (Peter Geoghegan) + Add additional information to VACUUM VERBOSE + and autovacuum logging messages (Peter Geoghegan) @@ -1117,8 +1136,9 @@ Author: Michael Paquier - Add EXPLAIN (BUFFERS) - output for temporary file block I/O (Masahiko Sawada) + Add EXPLAIN + (BUFFERS) output for temporary file block I/O + (Masahiko Sawada) @@ -1147,8 +1167,8 @@ Author: Fujii Masao Allow pg_stat_reset_single_table_counters() - to reset the counters of relations shared across all databases (B Sadhu, - Prasad Patro) + to reset the counters of relations shared across all databases + (B Sadhu, Prasad Patro) @@ -1159,8 +1179,8 @@ Author: Fujii Masao - Add wait events for local shell - commands (Fujii Masao) + Add wait events for local + shell commands (Fujii Masao) @@ -1188,8 +1208,8 @@ Author: Dean Rasheed - Allow view access to be controlled - by privileges of the view user (Christoph Heiss) + Allow view access to be + controlled by privileges of the view user (Christoph Heiss) @@ -1206,8 +1226,8 @@ Author: Robert Haas Allow members of the pg_write_server_files - predefined role to perform server-side base backups (Dagfinn Ilmari - Mannsåker) + predefined role to perform server-side base backups (Dagfinn + Ilmari Mannsåker) @@ -1222,14 +1242,15 @@ Author: Tom Lane - Allow GRANT to - assign permission to change server variables via SET - and ALTER SYSTEM (Mark Dilger) + Allow GRANT + to assign permission to change server variables via + SET and ALTER SYSTEM + (Mark Dilger) - New function has_parameter_privilege() reports on - this privilege. + New function has_parameter_privilege() + reports on this privilege. @@ -1242,7 +1263,8 @@ Author: Jeff Davis Add predefined role pg_checkpointer - that allows members to run CHECKPOINT (Jeff Davis) + that allows members to run CHECKPOINT + (Jeff Davis) @@ -1339,8 +1361,9 @@ Author: Michael Paquier - Allow postgres -C - to properly report runtime-computed values (Nathan Bossart) + Allow postgres + -C to properly report runtime-computed values + (Nathan Bossart) @@ -1350,8 +1373,8 @@ Author: Michael Paquier linkend="guc-wal-segment-size">wal_segment_size, and data_directory_mode - would report values that would not be accurate on the running server. - However, this does not work on a running server. + would report values that would not be accurate on the running + server. However, this does not work on a running server. @@ -1378,8 +1401,8 @@ Author: Robert Haas Add support for LZ4 and Zstandard compression of server-side base backups (Jeevan Ladhe, Robert - Haas) + linkend="backup-base-backup">base backups (Jeevan Ladhe, + Robert Haas) @@ -1401,8 +1424,8 @@ Author: Thomas Munro - Allow WAL processing to pre-fetch needed file contents - (Thomas Munro) + Allow WAL processing to pre-fetch needed file + contents (Thomas Munro) @@ -1465,8 +1488,8 @@ Author: Amit Kapila For example, this syntax is now supported: CREATE PUBLICATION pub1 FOR ALL TABLES IN SCHEMA s1,s2; ALTER - PUBLICATION supports a similar syntax. Tables added to the - listed schemas in the future will also be replicated. + PUBLICATION supports a similar syntax. Tables added + to the listed schemas in the future will also be replicated. @@ -1481,9 +1504,9 @@ Author: Amit Kapila - Allow publication content to be filtered using a WHERE - clause (Hou Zhijie, Euler Taveira, Peter Smith, Ajin Cherian, Tomas Vondra, - Amit Kapila) + Allow publication content to be filtered using a + WHERE clause (Hou Zhijie, Euler Taveira, + Peter Smith, Ajin Cherian, Tomas Vondra, Amit Kapila) @@ -1494,8 +1517,9 @@ Author: Tomas Vondra - Allow publications to be - restricted to specific columns (Tomas Vondra, Álvaro Herrera, Rahila Syed) + Allow publications to + be restricted to specific columns (Tomas Vondra, Álvaro Herrera, + Rahila Syed) @@ -1521,8 +1545,9 @@ Author: Amit Kapila - Add support for prepared transactions to built-in logical replication - (Peter Smith, Ajin Cherian, Amit Kapila, Nikhil Sontakke, Stas Kelvich) + Add support for prepared transactions to built-in logical + replication (Peter Smith, Ajin Cherian, Amit Kapila, Nikhil + Sontakke, Stas Kelvich) @@ -1533,7 +1558,8 @@ Author: Amit Kapila - Add two-phase information to the logical replication stream (Ajin Cherian) + Add two-phase information to the logical replication stream + (Ajin Cherian) @@ -1552,13 +1578,13 @@ Author: Amit Kapila - Prevent logical replication of empty transactions (Ajin Cherian, Hou - Zhijie, Euler Taveira) + Prevent logical replication of empty transactions (Ajin Cherian, + Hou Zhijie, Euler Taveira) - Previously, write transactions would send empty transactions to subscribers - if subscribed tables were not modified. + Previously, write transactions would send empty transactions to + subscribers if subscribed tables were not modified. @@ -1569,16 +1595,16 @@ Author: Michael Paquier - Add SQL functions to monitor the directory contents - of logical replication slots (Bharath Rupireddy) + Add SQL functions to monitor the directory + contents of logical replication slots (Bharath Rupireddy) Specifically, the functions are pg_ls_logicalsnapdir(), pg_ls_logicalmapdir(), and - pg_ls_replslotdir(). They can be run by members of - the predefined pg_monitor role. + pg_ls_replslotdir(). They can be run by + members of the predefined pg_monitor role. @@ -1589,8 +1615,8 @@ Author: Amit Kapila - Allow subscribers to stop logical replication application on error (Osumi - Takamichi, Mark Dilger) + Allow subscribers to stop logical replication application on error + (Osumi Takamichi, Mark Dilger) @@ -1607,8 +1633,8 @@ Author: Tom Lane - Adjust subscriber server variables to match the publisher so datetime - and float8 values are interpreted consistently (Japin Li) + Adjust subscriber server variables to match the publisher so + datetime and float8 values are interpreted consistently (Japin Li) @@ -1668,7 +1694,8 @@ Author: David Rowley - Allow SELECT DISTINCT to be parallelized (David Rowley) + Allow SELECT DISTINCT to be parallelized + (David Rowley) @@ -1688,14 +1715,14 @@ Author: Alvaro Herrera - Add SQL MERGE command to adjust - one table to match another (Simon Riggs, Pavan Deolasee, Álvaro Herrera, - Amit Langote) + Add SQL MERGE command to + adjust one table to match another (Simon Riggs, Pavan Deolasee, + Álvaro Herrera, Amit Langote) - This is similar to INSERT ... ON CONFLICT but more - batch-oriented. + This is similar to INSERT ... ON CONFLICT + but more batch-oriented. @@ -1709,8 +1736,8 @@ Author: Peter Eisentraut Add support for HEADER option in COPY text format (Rémi - Lapeyre) + linkend="sql-copy">COPY text format + (Rémi Lapeyre) @@ -1731,8 +1758,8 @@ Author: Robert Haas - This avoids the need for checkpoints during database creation; the old - method is still available. + This avoids the need for checkpoints during database creation; + the old method is still available. @@ -1757,11 +1784,12 @@ Author: Thomas Munro Prevent DROP - DATABASE, DROP + DATABASE, DROP TABLESPACE, and ALTER DATABASE SET - TABLESPACE from occasionally failing during concurrent - use on Windows (Thomas Munro) + TABLESPACE from occasionally failing during + concurrent use on Windows (Thomas Munro) @@ -1772,13 +1800,14 @@ Author: Peter Eisentraut - Allow foreign key ON DELETE - SET actions to affect only specified columns (Paul - Martinez) + Allow foreign key ON + DELETE SET actions to affect only specified columns + (Paul Martinez) - Previously, all of the columns in the foreign key were always affected. + Previously, all of the columns in the foreign key were always + affected. @@ -1789,9 +1818,9 @@ Author: Michael Paquier - Allow ALTER TABLE - to modify a table's ACCESS METHOD (Justin Pryzby, - Jeff Davis) + Allow ALTER + TABLE to modify a table's ACCESS + METHOD (Justin Pryzby, Jeff Davis) @@ -1803,8 +1832,8 @@ Author: Michael Paquier Properly call object access hooks when ALTER TABLE causes - table rewrites (Michael Paquier) + linkend="sql-altertable">ALTER TABLE + causes table rewrites (Michael Paquier) @@ -1824,13 +1853,14 @@ Author: Dean Rasheed - Allow numeric scale - to be negative or greater than precision (Dean Rasheed, Tom Lane) + Allow numeric + scale to be negative or greater than precision (Dean Rasheed, + Tom Lane) - This allows rounding of values to the left of the decimal point, e.g., - '1234'::numeric(4, -2) returns 1200. + This allows rounding of values to the left of the decimal point, + e.g., '1234'::numeric(4, -2) returns 1200. @@ -1867,13 +1897,13 @@ Author: Peter Eisentraut - Update the display width information of modern Unicode characters, like - emojis (Jacob Champion) + Update the display width information of modern Unicode characters, + like emojis (Jacob Champion) - Also update from Unicode 5.0 to 14.0.0. There is now an automated way - to keep Postgres updated with Unicode releases. + Also update from Unicode 5.0 to 14.0.0. There is now an automated + way to keep Postgres updated with Unicode releases. @@ -1919,15 +1949,16 @@ Author: Tom Lane - Add regular expression functions for compatibility with other relational - systems (Gilles Darold, Tom Lane) + Add regular expression functions for compatibility with other + relational systems (Gilles Darold, Tom Lane) Specifically, the new functions are regexp_count(), - regexp_instr(), regexp_like(), - and regexp_substr(). Some new optional arguments + regexp_instr(), + regexp_like(), and + regexp_substr(). Some new optional arguments were also added to regexp_replace(). @@ -1970,7 +2001,8 @@ Author: Tom Lane Improve the optimization of timetz_zone() by - stabilizing its value at transaction start (Aleksander Alekseev, Tom Lane) + stabilizing its value at transaction start (Aleksander Alekseev, + Tom Lane) @@ -1986,13 +2018,13 @@ Author: Tom Lane Allow tsvector_delete_arr() and - tsvector_setweight_by_filter() to accept empty array - elements (Jean-Christophe Arnu) + tsvector_setweight_by_filter() to accept + empty array elements (Jean-Christophe Arnu) - These lexemes are not stored so the acceptance of empty array elements - is not a problem. NOT DOCUMENTED, USER API? + These lexemes are not stored so the acceptance of empty array + elements is not a problem. NOT DOCUMENTED, USER API? @@ -2018,8 +2050,8 @@ Author: Tom Lane Change pg_event_trigger_ddl_commands() - to output references to non-local temporary schemas using the actual - schema name (Tom Lane) + to output references to non-local temporary schemas using the + actual schema name (Tom Lane) @@ -2058,9 +2090,11 @@ Author: Andrew Dunstan The construction functions are json(), json_scalar(), and - json_serialize(), json_array(), - json_arrayagg(), json_object(), - and json_objectagg(). They have a few functional + json_serialize(), + json_array(), + json_arrayagg(), + json_object(), and + json_objectagg(). They have a few functional advantages over the existing JSON functions. @@ -2072,10 +2106,11 @@ Author: Andrew Dunstan - Add SQL/JSON query functions SQL/JSON + query functions json_exists(), - json_query(), and json_value() - (Nikita Glukhov) + json_query(), and + json_value() (Nikita Glukhov) @@ -2092,10 +2127,11 @@ Author: Andrew Dunstan The clauses are IS - JSON [ VALUE | ARRAY + JSON [ VALUE | + ARRAY | OBJECT | SCALAR | - [WITH | WITHOUT ] UNIQUE - KEYS ]. + [WITH | WITHOUT ] + UNIQUE KEYS ]. @@ -2110,8 +2146,8 @@ Author: Andrew Dunstan Add function JSON_TABLE() - to cause JSON data to be treated as a table (Nikita - Glukhov) + to cause JSON data to be treated as a table + (Nikita Glukhov) @@ -2133,15 +2169,15 @@ Author: Tom Lane - Fix enforcement of PL/pgSQL variable CONSTANT markings - (Tom Lane) + Fix enforcement of PL/pgSQL variable CONSTANT + markings (Tom Lane) Previously, a variable used as a CALL - output parameter or refcursor OPEN variable would not - enforce CONSTANT. + output parameter or refcursor OPEN variable + would not enforce CONSTANT. @@ -2161,8 +2197,8 @@ Author: Peter Eisentraut - Allow IP address matching against a server certificate's - Subject Alternative Name (Jacob Champion) + Allow IP address matching against a server + certificate's Subject Alternative Name (Jacob Champion) @@ -2174,8 +2210,8 @@ Author: Daniel Gustafsson Allow PQsslAttribute() to report the - SSL library type without requiring a libpq connection - (Jacob Champion) + SSL library type without requiring a libpq + connection (Jacob Champion) @@ -2187,13 +2223,13 @@ Author: Tom Lane Change query cancellations sent by the client to use the same - TCP settings as normal client connections (Jelte - Fennema) + TCP settings as normal client connections + (Jelte Fennema) - This allows configured TCP timeouts to apply to query - cancel connections. + This allows configured TCP timeouts to apply + to query cancel connections. @@ -2228,9 +2264,10 @@ Author: Tom Lane On Unix platforms, have client applications like psql check - HOME environment variable for the user's home directory - before checking the operating system definition (Anders Kaseorg) + linkend="app-psql">psql + check HOME environment variable for the user's + home directory before checking the operating system definition + (Anders Kaseorg) @@ -2248,8 +2285,8 @@ Author: Heikki Linnakangas - Improve performance of psql's \copy command - (Heikki Linnakangas) + Improve performance of psql's \copy + command (Heikki Linnakangas) @@ -2260,9 +2297,9 @@ Author: Tom Lane - Add psql command \getenv to assign the value - of an environment variable to a psql variable - (Tom Lane) + Add psql command \getenv + to assign the value of an environment variable to a + psql variable (Tom Lane) @@ -2290,13 +2327,13 @@ Author: Tom Lane - Add psql \dconfig to report server variables - (Mark Dilger, Tom Lane) + Add psql \dconfig to report server + variables (Mark Dilger, Tom Lane) - This is similar to the server-side SHOW command but - can process patterns. + This is similar to the server-side SHOW + command but can process patterns. @@ -2307,8 +2344,8 @@ Author: Thomas Munro - Add pager option for psql's \watch command - (Pavel Stehule, Thomas Munro) + Add pager option for psql's \watch + command (Pavel Stehule, Thomas Munro) @@ -2331,9 +2368,10 @@ Author: Tom Lane - Previously such comments were removed from the query before being sent. - Double-hyphen comments that are before query text are not sent, and are - not recorded as separate psql history entries. + Previously such comments were removed from the query + before being sent. Double-hyphen comments that are before + query text are not sent, and are not recorded as separate + psql history entries. @@ -2344,8 +2382,8 @@ Author: Tom Lane - Adjust psql's readline meta-# to insert a - double-hyphen comment marker (Tom Lane) + Adjust psql's readline meta-# to insert + a double-hyphen comment marker (Tom Lane) @@ -2414,10 +2452,10 @@ Author: Tom Lane - Improve psql's tab completion (Shinya Kato, - Dagfinn Ilmari Mannsåker, Peter Smith, Koyu Tanigawa, Ken Kato, David - Fetter, Haiying Tang, Peter Eisentraut, Álvaro Herrera, Tom Lane, - Masahiko Sawada) + Improve psql's tab completion (Shinya + Kato, Dagfinn Ilmari Mannsåker, Peter Smith, Koyu Tanigawa, + Ken Kato, David Fetter, Haiying Tang, Peter Eisentraut, Álvaro + Herrera, Tom Lane, Masahiko Sawada) @@ -2458,9 +2496,9 @@ Author: Robert Haas - New output options are server to write the backup - locally and blackhole to discard the backup (for - testing). + New output options are server to write the + backup locally and blackhole to discard the + backup (for testing). @@ -2473,9 +2511,9 @@ Author: Robert Haas - Allow pg_basebackup to decompress LZ4 and - Zstandard compressed server-side base backups, and compress output files - with LZ4 and Zstandard (Dipesh Pandit, Jeevan Ladhe) + Allow pg_basebackup to decompress LZ4 + and Zstandard compressed server-side base backups, and compress + output files with LZ4 and Zstandard (Dipesh Pandit, Jeevan Ladhe) @@ -2491,13 +2529,14 @@ Author: Robert Haas Allow pg_basebackup's - option to control the compression method and - options (Michael Paquier, Robert Haas) + option to control the compression + method and options (Michael Paquier, Robert Haas) - New options include server-gzip (gzip on the server), - client-gzip (same as gzip). + New options include server-gzip (gzip + on the server), client-gzip (same as + gzip). @@ -2508,13 +2547,14 @@ Author: Robert Haas - Allow pg_basebackup to compress on the server - side and decompress on the client side before storage (Dipesh Pandit) + Allow pg_basebackup to compress on + the server side and decompress on the client side before storage + (Dipesh Pandit) - This is accomplished by specifying compression on the server side and - plain output format. + This is accomplished by specifying compression on the server side + and plain output format. @@ -2533,8 +2573,8 @@ Author: Michael Paquier - This is enabled via --compress=lz4 and requires binaries - to be built using . + This is enabled via --compress=lz4 and requires + binaries to be built using . @@ -2545,7 +2585,8 @@ Author: Michael Paquier - Add additional capabilities to pg_receivewal's + Add additional capabilities to + pg_receivewal's option (Georgios Kokolatos) @@ -2557,17 +2598,19 @@ Author: Michael Paquier - Improve pg_receivewal's ability to restart at - the proper WAL location (Ronan Dunklau) + Improve pg_receivewal's ability to + restart at the proper WAL location (Ronan + Dunklau) - Previously, pg_receivewal would start based - on the WAL file stored in the local archive directory, - or at the sending server's current WAL flush location. - With this change, if the sending server is running Postgres 15 or later, - the local archive directory is empty, and a replication slot is specified, - the replication slot's restart point will be used. + Previously, pg_receivewal would start + based on the WAL file stored in the local archive + directory, or at the sending server's current WAL + flush location. With this change, if the sending server is running + Postgres 15 or later, the local archive directory is empty, and + a replication slot is specified, the replication slot's restart + point will be used. @@ -2579,8 +2622,9 @@ Author: Michael Paquier Add pg_rewind option - to simplify use when server configuration - files are stored outside the data directory (Gunnar Bluth) + to simplify use when server + configuration files are stored outside the data directory (Gunnar + Bluth) @@ -2591,9 +2635,10 @@ Author: Tatsuo Ishii - Allow pgbench - to retry after serialization and deadlock failures (Yugo Nagata, Marina - Polyakova) + Allow pgbench to + retry after serialization and deadlock failures (Yugo Nagata, + Marina Polyakova) @@ -2613,8 +2658,9 @@ Author: Noah Misch - Have pg_dump dump public - schema ownership changes and security labels (Noah Misch) + Have pg_dump dump + public schema ownership changes and security + labels (Noah Misch) @@ -2633,7 +2679,8 @@ Author: Tom Lane - Improve performance of dumping databases with many objects (Tom Lane) + Improve performance of dumping databases with many objects + (Tom Lane) @@ -2649,8 +2696,8 @@ Author: Tom Lane - Improve the parallel pg_dump performance of - TOAST tables (Tom Lane) + Improve the parallel pg_dump performance + of TOAST tables (Tom Lane) @@ -2661,8 +2708,9 @@ Author: Michael Paquier - Add dump/restore option to - force restore to only use the default table access method (Justin Pryzby) + Add dump/restore option + to force restore to only use the default table access method + (Justin Pryzby) @@ -2675,8 +2723,8 @@ Author: Tom Lane Limit support of pg_dump and pg_dumpall - to servers running PostgreSQL 9.2 and later - (Tom Lane) + to servers running PostgreSQL 9.2 and + later (Tom Lane) @@ -2697,13 +2745,13 @@ Author: Andres Freund Disable default status reporting during - pg_upgrade operation if the output is not a - terminal (Andres Freund) + pg_upgrade operation if the output is + not a terminal (Andres Freund) - The status reporting output can be enabled for non-tty usage by using - . + The status reporting output can be enabled for non-tty usage by + using . @@ -2714,13 +2762,13 @@ Author: Daniel Gustafsson - Have pg_upgrade report all databases with - invalid connection settings (Jeevan Ladhe) + Have pg_upgrade report all databases + with invalid connection settings (Jeevan Ladhe) - Previously only the first database with an invalid connection setting - was reported. + Previously only the first database with an invalid connection + setting was reported. @@ -2733,9 +2781,9 @@ Author: Michael Paquier - Store pg_upgrade temporary files in a new - cluster subdirectory called pg_upgrade_output.d - (Justin Pryzby) + Store pg_upgrade + temporary files in a new cluster subdirectory called + pg_upgrade_output.d (Justin Pryzby) @@ -2753,8 +2801,8 @@ Author: Robert Haas Have pg_upgrade preserve relfilenodes, - tablespace, and database OIDs between old and new clusters (Shruthi KC, - Antonin Houska) + tablespace, and database OIDs between old and new clusters + (Shruthi KC, Antonin Houska) @@ -2781,8 +2829,9 @@ Author: Tom Lane - Limit support of pg_upgrade to old servers - running PostgreSQL 9.2 and later (Tom Lane) + Limit support of pg_upgrade to old + servers running PostgreSQL 9.2 and later + (Tom Lane) @@ -2804,9 +2853,9 @@ Author: Thomas Munro - Allow pg_waldump to be filtered by relation file - node, block number, fork number, and full page images (David Christensen, - Thomas Munro) + Allow pg_waldump to be filtered by + relation file node, block number, fork number, and full page images + (David Christensen, Thomas Munro) @@ -2817,14 +2866,14 @@ Author: Michael Paquier - Have pg_waldump report statistics before an - interrupted exit (Bharath Rupireddy) + Have pg_waldump report statistics + before an interrupted exit (Bharath Rupireddy) - For example, issuing a control-C in a terminal running pg_waldump - --stats --follow will report the current statistics before - exiting. This does not work on Windows. + For example, issuing a control-C in a terminal running + pg_waldump --stats --follow will report the + current statistics before exiting. This does not work on Windows. @@ -2835,9 +2884,9 @@ Author: Michael Paquier - Improve descriptions of some transaction WAL records - reported by pg_waldump (Masahiko Sawada, - Michael Paquier) + Improve descriptions of some transaction WAL + records reported by pg_waldump + (Masahiko Sawada, Michael Paquier) @@ -2848,13 +2897,13 @@ Author: Heikki Linnakangas - Allow pg_waldump to dump information about - multiple resource managers (Heikki Linnakangas) + Allow pg_waldump to dump information + about multiple resource managers (Heikki Linnakangas) - This is enabled by specifying the option multiple - times. + This is enabled by specifying the option + multiple times. @@ -2878,7 +2927,8 @@ Author: Fujii Masao Add documentation for pg_encoding_to_char() - and pg_char_to_encoding() (Ian Lawrence Barwick) + and pg_char_to_encoding() (Ian Lawrence + Barwick) @@ -2890,8 +2940,8 @@ Author: Tom Lane Document the ^@ starts-with - operator (Tom Lane) + linkend="functions-string-other">^@ + starts-with operator (Tom Lane) @@ -2911,8 +2961,8 @@ Author: Andres Freund - Add support for continuous integration testing using cirrus-ci (Andres - Freund, Thomas Munro, Melanie Plageman) + Add support for continuous integration testing using cirrus-ci + (Andres Freund, Thomas Munro, Melanie Plageman) @@ -2925,7 +2975,8 @@ Author: Robert Haas Add configure option - to enable Zstandard builds (Jeevan Ladhe, Robert Haas, Michael Paquier) + to enable Zstandard builds (Jeevan Ladhe, Robert Haas, Michael + Paquier) @@ -2937,7 +2988,8 @@ Author: Peter Eisentraut Add module field which can be customized for non-community - PostgreSQL distributions (Peter Eisentraut) + PostgreSQL distributions (Peter + Eisentraut) @@ -2971,8 +3023,8 @@ Author: Robert Haas Add new protocol message TARGET - to specify a new COPY method to be for base backups - (Robert Haas) + to specify a new COPY method to be for base + backups (Robert Haas) @@ -3007,8 +3059,8 @@ Author: Robert Haas - Remove server support for old BASE_BACKUP command - syntax and base backup protocol (Robert Haas) + Remove server support for old BASE_BACKUP + command syntax and base backup protocol (Robert Haas) @@ -3019,7 +3071,8 @@ Author: Robert Haas - Add support for extensions to set custom backup targets (Robert Haas) + Add support for extensions to set custom backup targets (Robert + Haas) @@ -3030,8 +3083,8 @@ Author: Jeff Davis - Allow extensions to define their own WAL resource - managers (Jeff Davis) + Allow extensions to define their own WAL + resource managers (Jeff Davis) @@ -3068,8 +3121,8 @@ Author: Robert Haas - Export all server variables on Windows using PGDLLIMPORT - (Robert Haas) + Export all server variables on Windows using + PGDLLIMPORT (Robert Haas) @@ -3085,8 +3138,8 @@ Author: Peter Eisentraut Require OpenSSL to build pgcrypto binaries - (Peter Eisentraut) + linkend="pgcrypto">pgcrypto + binaries (Peter Eisentraut) @@ -3097,7 +3150,8 @@ Author: Andres Freund - Disallow building with Python 2 (Andres Freund) + Disallow building with Python 2 + (Andres Freund) @@ -3108,8 +3162,8 @@ Author: Tom Lane - Adjust configure to require Perl version 5.8.3 - or later (Dagfinn Ilmari Mannsåker) + Adjust configure to require Perl + version 5.8.3 or later (Dagfinn Ilmari Mannsåker) @@ -3188,7 +3242,8 @@ Author: Magnus Hagander - Add JIT counters to pg_stat_statements (Magnus Hagander) + Add JIT counters to pg_stat_statements (Magnus + Hagander) @@ -3199,8 +3254,9 @@ Author: Peter Eisentraut - Allow amcheck - to check sequences (Mark Dilger) + Allow amcheck to + check sequences (Mark Dilger) @@ -3228,8 +3284,8 @@ Author: Tomas Vondra Allow btree_gist indexes - on boolean columns (Emre Hasegeli) + linkend="btree-gist">btree_gist + indexes on boolean columns (Emre Hasegeli) @@ -3245,8 +3301,8 @@ Author: Tom Lane Indicate the permissive/enforcing state in sepgsql log messages - (Dave Page) + linkend="sepgsql">sepgsql log + messages (Dave Page) @@ -3264,7 +3320,8 @@ Author: Michael Paquier - Previously improper negative values could be returned in certain cases. + Previously improper negative values could be returned in certain + cases. @@ -3298,8 +3355,9 @@ Author: Fujii Masao - Add server variable postgres_fdw.application_name - to control the application name of postgres_fdw connections (Hayato Kuroda) + Add server variable + postgres_fdw.application_name to control the + application name of postgres_fdw connections (Hayato Kuroda) @@ -3307,8 +3365,8 @@ Author: Fujii Masao linkend="guc-application-name">application_name could only be set on the remote server or via postgres_fdw connection specification. - postgres_fdw.application_name also supports escape - sequences for customization. + postgres_fdw.application_name also supports + escape sequences for customization. @@ -3319,8 +3377,8 @@ Author: Etsuro Fujita - Allow parallel commit on postgres_fdw servers - (Etsuro Fujita) + Allow parallel commit on postgres_fdw + servers (Etsuro Fujita) From 19408aae7fa2bf28866fb262b27f08405e71152e Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Sun, 12 Jun 2022 09:17:17 -0400 Subject: [PATCH 771/772] Make subscription tests pass with log_error_verbosity=verbose Recent additions to the subscription tests check for log entries, but fail to account for the possible presence of an SQL errror code, which happens if log_error_verbosity is set to 'verbose'. Add this into the regular expressions that are checked for. --- src/test/subscription/t/027_nosuperuser.pl | 10 +++++----- src/test/subscription/t/029_on_error.pl | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/subscription/t/027_nosuperuser.pl b/src/test/subscription/t/027_nosuperuser.pl index 350bc40efc..96ec23aab7 100644 --- a/src/test/subscription/t/027_nosuperuser.pl +++ b/src/test/subscription/t/027_nosuperuser.pl @@ -179,7 +179,7 @@ sub grant_bypassrls publish_update("alice.unpartitioned", 5 => 9); expect_failure( "alice.unpartitioned", 2, 5, 7, - qr/ERROR: permission denied for table unpartitioned/msi, + qr/ERROR: ( [A-Z0-9]+:)? permission denied for table unpartitioned/msi, "non-superuser admin fails to replicate update"); grant_superuser("regress_admin"); expect_replication("alice.unpartitioned", 2, 7, 9, @@ -214,7 +214,7 @@ sub grant_bypassrls 3, 7, 11, - qr/ERROR: permission denied for table unpartitioned/msi, + qr/ERROR: ( [A-Z0-9]+:)? permission denied for table unpartitioned/msi, "non-superuser admin without SELECT privileges fails to replicate update" ); @@ -262,7 +262,7 @@ sub grant_bypassrls 2, 11, 13, - qr/ERROR: "regress_admin" cannot replicate into relation with row-level security enabled: "unpartitioned\w*"/msi, + qr/ERROR: ( [A-Z0-9]+:)? "regress_admin" cannot replicate into relation with row-level security enabled: "unpartitioned\w*"/msi, "non-superuser admin fails to replicate insert into rls enabled table"); grant_superuser("regress_admin"); expect_replication("alice.unpartitioned", 3, 11, 15, @@ -276,7 +276,7 @@ sub grant_bypassrls 3, 11, 15, - qr/ERROR: "regress_admin" cannot replicate into relation with row-level security enabled: "unpartitioned\w*"/msi, + qr/ERROR: ( [A-Z0-9]+:)? "regress_admin" cannot replicate into relation with row-level security enabled: "unpartitioned\w*"/msi, "non-superuser admin fails to replicate update into rls enabled unpartitioned" ); @@ -291,7 +291,7 @@ sub grant_bypassrls 3, 13, 17, - qr/ERROR: "regress_admin" cannot replicate into relation with row-level security enabled: "unpartitioned\w*"/msi, + qr/ERROR: ( [A-Z0-9]+:)? "regress_admin" cannot replicate into relation with row-level security enabled: "unpartitioned\w*"/msi, "non-superuser admin without bypassrls fails to replicate delete into rls enabled unpartitioned" ); grant_bypassrls("regress_admin"); diff --git a/src/test/subscription/t/029_on_error.pl b/src/test/subscription/t/029_on_error.pl index e8b904b745..303e8ec3fc 100644 --- a/src/test/subscription/t/029_on_error.pl +++ b/src/test/subscription/t/029_on_error.pl @@ -48,7 +48,7 @@ sub test_skip_lsn # Check the log to ensure that the transaction is skipped, and advance the # offset of the log file for the next test. $offset = $node_subscriber->wait_for_log( - qr/LOG: done skipping logical replication transaction finished at $lsn/, + qr/LOG: ( [A-Z0-9]+:)? done skipping logical replication transaction finished at $lsn/, $offset); # Insert non-conflict data From bf2c40b456dfc41df54b57cf40e863a936958ac5 Mon Sep 17 00:00:00 2001 From: David Fetter Date: Thu, 5 May 2022 18:31:39 -0700 Subject: [PATCH 772/772] WIP: Enable timestamps at granularities down to microsecond --- doc/src/sgml/config.sgml | 15 +++++++---- src/backend/utils/error/csvlog.c | 2 +- src/backend/utils/error/elog.c | 44 ++++++++++++++++++++++++------- src/backend/utils/error/jsonlog.c | 2 +- 4 files changed, 47 insertions(+), 16 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 5b7ce6531d..05ff0a832d 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -7106,11 +7106,11 @@ local0.* /var/log/postgresql Unrecognized escapes are ignored. Other characters are copied straight to the log line. Some escapes are only recognized by session processes, and will be treated as empty by - background processes such as the main server process. Status - information may be aligned either left or right by specifying a - numeric literal after the % and before the option. A negative - value will cause the status information to be padded on the - right with spaces to give it a minimum width, whereas a positive + background processes such as the main server process. Apart from the + case of %T, status information may be aligned either + left or right by specifying a numeric literal after the % and before the + option. A negative value will cause the status information to be padded + on the right with spaces to give it a minimum width, whereas a positive value will pad on the left. Padding can be useful to aid human readability in log files. @@ -7182,6 +7182,11 @@ local0.* /var/log/postgresql Time stamp with milliseconds no + + %T + Time stamp with fractional seconds, 3 decimal places if not specified by a padding number + no + %n Time stamp with milliseconds (as a Unix epoch) diff --git a/src/backend/utils/error/csvlog.c b/src/backend/utils/error/csvlog.c index 5c49bc4209..d909e6ae0c 100644 --- a/src/backend/utils/error/csvlog.c +++ b/src/backend/utils/error/csvlog.c @@ -89,7 +89,7 @@ write_csvlog(ErrorData *edata) initStringInfo(&buf); /* timestamp with milliseconds */ - appendStringInfoString(&buf, get_formatted_log_time()); + appendStringInfoString(&buf, get_formatted_log_time(3)); appendStringInfoChar(&buf, ','); /* username */ diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 55ee5423af..240428d180 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -156,8 +156,9 @@ static struct timeval saved_timeval; static bool saved_timeval_set = false; #define FORMATTED_TS_LEN 128 +#define FORMATTED_TS_GRANULARITIES 6 static char formatted_start_time[FORMATTED_TS_LEN]; -static char formatted_log_time[FORMATTED_TS_LEN]; +static char formatted_log_time[FORMATTED_TS_GRANULARITIES][FORMATTED_TS_LEN]; /* Macro for checking errordata_stack_depth is reasonable */ @@ -2290,16 +2291,40 @@ write_console(const char *line, int len) * among all the log destinations that require it to be consistent. Note * that the computed timestamp is returned in a static buffer, not * palloc()'d. + * + * It is the caller's responsibility to ensure that digits is what's handled + * here, currently in the range from 1 to 6 inclusive. */ char * -get_formatted_log_time(void) +get_formatted_log_time(int digits) { pg_time_t stamp_time; - char msbuf[13]; + char msbuf[10 + digits]; + int pow10[FORMATTED_TS_GRANULARITIES] = { + 10, 100, 1000, + 10000, 100000, 1000000}; + const char *format_strftime[FORMATTED_TS_GRANULARITIES] = { + /* .123456 */ + "%Y-%m-%d %H:%M:%S %Z", + "%Y-%m-%d %H:%M:%S %Z", + "%Y-%m-%d %H:%M:%S %Z", + "%Y-%m-%d %H:%M:%S %Z", + "%Y-%m-%d %H:%M:%S %Z", + "%Y-%m-%d %H:%M:%S %Z" + /* .123456 */ + }; + const char *format_fractional_seconds[FORMATTED_TS_GRANULARITIES] = { + ".%01d", ".%02d", ".%03d", + ".%04d", ".%05d", ".%06d" + }; - /* leave if already computed */ + /* + * We used to be able to + * leave if already computed + * , but since we're taking an input now, it's no longer unique. if (formatted_log_time[0] != '\0') return formatted_log_time; + */ if (!saved_timeval_set) { @@ -2316,12 +2341,13 @@ get_formatted_log_time(void) */ pg_strftime(formatted_log_time, FORMATTED_TS_LEN, /* leave room for milliseconds... */ - "%Y-%m-%d %H:%M:%S %Z", + format_strftime[digits-1], pg_localtime(&stamp_time, log_timezone)); - /* 'paste' milliseconds into place... */ - sprintf(msbuf, ".%03d", (int) (saved_timeval.tv_usec / 1000)); - memcpy(formatted_log_time + 19, msbuf, 4); + /* 'paste' fractional seconds into place...indexes are off by one */ + sprintf(msbuf, format_fractional_seconds[digits-1], (int) (saved_timeval.tv_usec / pow10[digits-1])); + /* length, on the other hand, is off by one in the other direction */ + memcpy(formatted_log_time + 19, msbuf, digits+1); return formatted_log_time; } @@ -2621,7 +2647,7 @@ log_line_prefix(StringInfo buf, ErrorData *edata) case 'm': /* force a log timestamp reset */ formatted_log_time[0] = '\0'; - (void) get_formatted_log_time(); + (void) get_formatted_log_time(3); if (padding != 0) appendStringInfo(buf, "%*s", padding, formatted_log_time); diff --git a/src/backend/utils/error/jsonlog.c b/src/backend/utils/error/jsonlog.c index 27ad7686d8..8c94ed5343 100644 --- a/src/backend/utils/error/jsonlog.c +++ b/src/backend/utils/error/jsonlog.c @@ -139,7 +139,7 @@ write_jsonlog(ErrorData *edata) appendStringInfoChar(&buf, '{'); /* timestamp with milliseconds */ - log_time = get_formatted_log_time(); + log_time = get_formatted_log_time(3); /* * First property does not use appendJSONKeyValue as it does not have